diff --git a/notebooks/train-yolov5-object-detection-on-custom-data.ipynb b/notebooks/train-yolov5-object-detection-on-custom-data.ipynb index 7681142..9ba952d 100644 --- a/notebooks/train-yolov5-object-detection-on-custom-data.ipynb +++ b/notebooks/train-yolov5-object-detection-on-custom-data.ipynb @@ -6,8 +6,12 @@ "id": "GD9gUQpaBxNa" }, "source": [ + "[![Roboflow Notebooks](https://media.roboflow.com/notebooks/template/bannertest2-2.png?ik-sdk-version=javascript-1.4.3&updatedAt=1672932710194)](https://github.com/roboflow/notebooks)\n", + "\n", "# How to Train YOLOv5 on Custom Objects\n", "\n", + "**⚠️ This notebook was updated on October 24th, 2023. Since then, the way to load data into the notebook has changed. Thus, this notebook is not the same as the original version used in the accompanying YouTube video or blog post.**\n", + "\n", "This tutorial is based on the [YOLOv5 repository](https://github.com/ultralytics/yolov5) by [Ultralytics](https://www.ultralytics.com/). This notebook shows training on **your own custom objects**. Many thanks to Ultralytics for putting this repository together - we hope that in combination with clean data management tools at Roboflow, this technologoy will become easily accessible to any developer wishing to use computer vision in their projects.\n", "\n", "### Accompanying Blog Post\n", @@ -29,16 +33,7 @@ "* Run YOLOv5 inference on test images\n", "* Export saved YOLOv5 weights for future inference\n", "\n", - "\n", - "\n", - "### **About**\n", - "\n", - "[Roboflow](https://roboflow.com) enables teams to deploy custom computer vision models quickly and accurately. Convert data from to annotation format, assess dataset health, preprocess, augment, and more. It's free for your first 1000 source images.\n", - "\n", - "**Looking for a vision model available via API without hassle? Try Roboflow Train.**\n", - "\n", - "![Roboflow Wordmark](https://i.imgur.com/dcLNMhV.png)\n", - "\n" + "Let's get started!" ] }, { @@ -54,31 +49,31 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 1, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ie5uLDH4uzAp", - "outputId": "d2e38392-e09e-4caf-e309-72b5354a5c9b", + "outputId": "5aaf0b1c-4892-46ea-9273-9a22994dfb20", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "Cloning into 'yolov5'...\n", - "remote: Enumerating objects: 12811, done.\u001b[K\n", - "remote: Counting objects: 100% (92/92), done.\u001b[K\n", - "remote: Compressing objects: 100% (48/48), done.\u001b[K\n", - "remote: Total 12811 (delta 52), reused 75 (delta 44), pack-reused 12719\u001b[K\n", - "Receiving objects: 100% (12811/12811), 12.40 MiB | 21.02 MiB/s, done.\n", - "Resolving deltas: 100% (8807/8807), done.\n", + "remote: Enumerating objects: 16013, done.\u001b[K\n", + "remote: Counting objects: 100% (46/46), done.\u001b[K\n", + "remote: Compressing objects: 100% (33/33), done.\u001b[K\n", + "remote: Total 16013 (delta 25), reused 23 (delta 13), pack-reused 15967\u001b[K\n", + "Receiving objects: 100% (16013/16013), 14.68 MiB | 17.18 MiB/s, done.\n", + "Resolving deltas: 100% (10991/10991), done.\n", "/content/yolov5\n", - "HEAD is now at fbe67e4 Fix `OMP_NUM_THREADS=1` for macOS (#8624)\n" + "HEAD is now at 064365d Update parse_opt() in export.py to work as in train.py (#10789)\n" ] } ], @@ -91,24 +86,26 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "wbvMlHd_QwMG", - "outputId": "484dd5f5-a33e-4e56-ac20-10dc71b36009", + "outputId": "04bf61dc-0730-422e-cf30-481ece54b934", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "\u001b[?25l\r\u001b[K |▌ | 10 kB 20.4 MB/s eta 0:00:01\r\u001b[K |█ | 20 kB 9.2 MB/s eta 0:00:01\r\u001b[K |█▋ | 30 kB 7.9 MB/s eta 0:00:01\r\u001b[K |██▏ | 40 kB 7.4 MB/s eta 0:00:01\r\u001b[K |██▊ | 51 kB 4.5 MB/s eta 0:00:01\r\u001b[K |███▎ | 61 kB 5.4 MB/s eta 0:00:01\r\u001b[K |███▉ | 71 kB 4.5 MB/s eta 0:00:01\r\u001b[K |████▍ | 81 kB 5.1 MB/s eta 0:00:01\r\u001b[K |█████ | 92 kB 5.7 MB/s eta 0:00:01\r\u001b[K |█████▌ | 102 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████ | 112 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████▋ | 122 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████▏ | 133 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████▊ | 143 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████▎ | 153 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████▉ | 163 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████▍ | 174 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████ | 184 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████▍ | 194 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████ | 204 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████▌ | 215 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████ | 225 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████▋ | 235 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████▏ | 245 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████▊ | 256 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████▎ | 266 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████▉ | 276 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████▍ | 286 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████ | 296 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████▌ | 307 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████ | 317 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████▋ | 327 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████▏ | 337 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████▊ | 348 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████▎ | 358 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████▉ | 368 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████▍ | 378 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████▉ | 389 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████████▍ | 399 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████████ | 409 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████████▌ | 419 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████████ | 430 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████████▋ | 440 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████████▏ | 450 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████████▊ | 460 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████████████▎ | 471 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████████████▉ | 481 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████████████▍ | 491 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████████████ | 501 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████████████▌ | 512 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████████████ | 522 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████████████▋ | 532 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▏ | 542 kB 5.0 MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▊ | 552 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▎ | 563 kB 5.0 MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▊ | 573 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▎| 583 kB 5.0 MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▉| 593 kB 5.0 MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 596 kB 5.0 MB/s \n", - "\u001b[?25hSetup complete. Using torch 1.12.0+cu113 _CudaDeviceProperties(name='Tesla P100-PCIE-16GB', major=6, minor=0, total_memory=16280MB, multi_processor_count=56)\n" + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m190.6/190.6 kB\u001b[0m \u001b[31m5.0 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m62.7/62.7 kB\u001b[0m \u001b[31m7.4 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[2K \u001b[90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\u001b[0m \u001b[32m1.6/1.6 MB\u001b[0m \u001b[31m13.9 MB/s\u001b[0m eta \u001b[36m0:00:00\u001b[0m\n", + "\u001b[?25hSetup complete. Using torch 2.1.0+cu118 _CudaDeviceProperties(name='Tesla T4', major=7, minor=5, total_memory=15101MB, multi_processor_count=40)\n" ] } ], @@ -130,11 +127,73 @@ "id": "SDIhrBF0sPaM" }, "source": [ - "# Download Correctly Formatted Custom Dataset \n", + "## Roboflow Universe\n", + "\n", + "Need data for your project? Before spending time on annotating, check out Roboflow Universe, a repository of more than 200,000 open-source datasets that you can use in your projects. You'll find datasets containing everything from annotated cracks in concrete to plant images with disease annotations.\n", + "\n", + "\n", + "[![Roboflow Universe](https://media.roboflow.com/notebooks/template/uni-banner-frame.png?ik-sdk-version=javascript-1.4.3&updatedAt=1672878480290)](https://universe.roboflow.com/)\n", + "\n", + "## Preparing a custom dataset\n", + "\n", + "Building a custom dataset can be a painful process. It might take dozens or even hundreds of hours to collect images, label them, and export them in the proper format. Fortunately, Roboflow makes this process as straightforward and fast as possible. Let me show you how!\n", + "\n", + "### Step 1: Creating project\n", + "\n", + "Before you start, you need to create a Roboflow [account](https://app.roboflow.com/login). Once you do that, you can create a new project in the Roboflow [dashboard](https://app.roboflow.com/). Keep in mind to choose the right project type. In our case, Object Detection.\n", + "\n", + "
\n", + " \n", + "
\n", + "\n", + "### Step 2: Uploading images\n", + "\n", + "Next, add the data to your newly created project. You can do it via API or through our [web interface](https://docs.roboflow.com/adding-data/object-detection).\n", + "\n", + "If you drag and drop a directory with a dataset in a supported format, the Roboflow dashboard will automatically read the images and annotations together.\n", "\n", - "We'll download our dataset from Roboflow. Use the \"**YOLOv5 PyTorch**\" export format. Note that the Ultralytics implementation calls for a YAML file defining where your training and test data is. The Roboflow export also writes this format for us.\n", + "
\n", + " \n", + "
\n", "\n", - "To get your data into Roboflow, follow the [Getting Started Guide](https://blog.roboflow.ai/getting-started-with-roboflow/)." + "### Step 3: Labeling\n", + "\n", + "If you only have images, you can label them in [Roboflow Annotate](https://docs.roboflow.com/annotate).\n", + "\n", + "
\n", + " \n", + "
\n", + "\n", + "### Step 4: Generate new dataset version\n", + "\n", + "Now that we have our images and annotations added, we can Generate a Dataset Version. When Generating a Version, you may elect to add preprocessing and augmentations. This step is completely optional, however, it can allow you to significantly improve the robustness of your model.\n", + "\n", + "
\n", + " \n", + "
\n", + "\n", + "### Step 5: Exporting dataset\n", + "\n", + "Once the dataset version is generated, we have a hosted dataset we can load directly into our notebook for easy training. Click `Export` and select the `YOLO v5 PyTorch` dataset format.\n", + "\n", + "
\n", + " \n", + "
\n" ] }, { @@ -143,119 +202,131 @@ "id": "vDeebwqS9JbZ" }, "source": [ + "## Step 6: Download a Dataset\n", "\n", - "\n", - "![YOLOv5 PyTorch export](https://i.imgur.com/5vr9G2u.png)\n" + "Add your Roboflow API key below to download the default money counting dataset. Alternatively, use the code provided by the Roboflow dashboard in the above step to load a custom dataset." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Knxi2ncxWffW", - "outputId": "d4d0155d-63c9-4c2c-a63e-a553ecbef611", + "outputId": "067d051c-9ae6-4cf0-db2e-fac32b2df01a", "vscode": { "languageId": "python" } }, "outputs": [ { + "output_type": "stream", "name": "stdout", + "text": [ + "loading Roboflow workspace...\n", + "loading Roboflow project...\n" + ] + }, + { "output_type": "stream", + "name": "stderr", + "text": [ + "Downloading Dataset Version Zip in Cash-Counter-10 to yolov5pytorch:: 100%|██████████| 121603/121603 [00:02<00:00, 59447.22it/s]" + ] + }, + { + "output_type": "stream", + "name": "stdout", "text": [ - "\u001b[K |████████████████████████████████| 178 kB 7.6 MB/s \n", - "\u001b[K |████████████████████████████████| 21.6 MB 1.2 MB/s \n", - "\u001b[K |████████████████████████████████| 54 kB 2.8 MB/s \n", - "\u001b[K |████████████████████████████████| 67 kB 6.4 MB/s \n", - "\u001b[K |████████████████████████████████| 1.1 MB 68.0 MB/s \n", - "\u001b[K |████████████████████████████████| 145 kB 72.2 MB/s \n", - "\u001b[K |████████████████████████████████| 4.3 MB 55.6 MB/s \n", - "\u001b[K |████████████████████████████████| 138 kB 68.1 MB/s \n", - "\u001b[K |████████████████████████████████| 62 kB 1.7 MB/s \n", - "\u001b[?25h Building wheel for wget (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "google-colab 1.0.0 requires requests~=2.23.0, but you have requests 2.28.1 which is incompatible.\n", - "datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.\n", - "albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n", - "upload and label your dataset, and get an API KEY here: https://app.roboflow.com/?model=yolov5&ref=roboflow-yolov5\n" + "\n" + ] + }, + { + "output_type": "stream", + "name": "stderr", + "text": [ + "\n", + "Extracting Dataset Version Zip to Cash-Counter-10 in yolov5pytorch:: 100%|██████████| 6112/6112 [00:00<00:00, 7450.91it/s]\n" ] } ], "source": [ - "#follow the link below to get your download code from from Roboflow\n", "!pip install -q roboflow\n", + "\n", "from roboflow import Roboflow\n", - "rf = Roboflow(model_format=\"yolov5\", notebook=\"roboflow-yolov5\")" + "\n", + "rf = Roboflow(api_key=\"YOUR_API_KEY\")\n", + "project = rf.workspace(\"alex-hyams-cosqx\").project(\"cash-counter\")\n", + "dataset = project.version(10).download(\"yolov5\")" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "Ug_PhK1oqwQA", - "outputId": "b417162b-c116-416c-88e8-96b2563d1ee1", + "outputId": "3807a1b7-0e6b-4c1b-c1bc-f2d32d626811", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "/content/yolov5\n", - "loading Roboflow workspace...\n", - "loading Roboflow project...\n", - "Downloading Dataset Version Zip in American-Mushrooms-1 to yolov5pytorch: 100% [3866359 / 3866359] bytes\n" - ] - }, - { - "name": "stderr", "output_type": "stream", + "name": "stdout", "text": [ - "Extracting Dataset Version Zip to American-Mushrooms-1 in yolov5pytorch:: 100%|██████████| 278/278 [00:00<00:00, 1111.85it/s]\n" + "/content/yolov5\n" ] } ], "source": [ - "%cd /content/yolov5\n", - "#after following the link above, recieve python code with these fields filled in\n", - "#from roboflow import Roboflow\n", - "#rf = Roboflow(api_key=\"YOUR API KEY HERE\")\n", - "#project = rf.workspace().project(\"YOUR PROJECT\")\n", - "#dataset = project.version(\"YOUR VERSION\").download(\"yolov5\")" + "%cd /content/yolov5" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "ZZ3DmmGQztJj", - "outputId": "895f8313-8441-4c2d-9c87-01cc89f22acb", + "outputId": "b710c5de-9fd6-4ca7-8053-de3b5bdae0c6", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "names:\n", - "- CoW\n", - "- chanterelle\n", - "nc: 2\n", - "train: American-Mushrooms-1/train/images\n", - "val: American-Mushrooms-1/valid/images\n" + "- Dime\n", + "- Nickel\n", + "- Penny\n", + "- Quarter\n", + "- fifty\n", + "- five\n", + "- hundred\n", + "- one\n", + "- ten\n", + "- twenty\n", + "nc: 10\n", + "roboflow:\n", + " license: CC BY 4.0\n", + " project: cash-counter\n", + " url: https://universe.roboflow.com/alex-hyams-cosqx/cash-counter/dataset/10\n", + " version: 10\n", + " workspace: alex-hyams-cosqx\n", + "test: ../test/images\n", + "train: Cash-Counter-10/train/images\n", + "val: Cash-Counter-10/valid/images\n" ] } ], @@ -279,7 +350,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 8, "metadata": { "id": "dOPn9wjOAwwK", "vscode": { @@ -296,49 +367,49 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 9, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1Rvt5wilnDyX", - "outputId": "8b8386bc-0e05-49a8-c1e0-48a836a0b399", + "outputId": "717ac830-0313-4132-cd38-7bbebec1d695", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ - "# parameters\n", + "# YOLOv5 🚀 by Ultralytics, GPL-3.0 license\n", + "\n", + "# Parameters\n", "nc: 80 # number of classes\n", "depth_multiple: 0.33 # model depth multiple\n", "width_multiple: 0.50 # layer channel multiple\n", - "\n", - "# anchors\n", "anchors:\n", " - [10,13, 16,30, 33,23] # P3/8\n", " - [30,61, 62,45, 59,119] # P4/16\n", " - [116,90, 156,198, 373,326] # P5/32\n", "\n", - "# YOLOv5 backbone\n", + "# YOLOv5 v6.0 backbone\n", "backbone:\n", " # [from, number, module, args]\n", - " [[-1, 1, Focus, [64, 3]], # 0-P1/2\n", + " [[-1, 1, Conv, [64, 6, 2, 2]], # 0-P1/2\n", " [-1, 1, Conv, [128, 3, 2]], # 1-P2/4\n", " [-1, 3, C3, [128]],\n", " [-1, 1, Conv, [256, 3, 2]], # 3-P3/8\n", - " [-1, 9, C3, [256]],\n", + " [-1, 6, C3, [256]],\n", " [-1, 1, Conv, [512, 3, 2]], # 5-P4/16\n", " [-1, 9, C3, [512]],\n", " [-1, 1, Conv, [1024, 3, 2]], # 7-P5/32\n", - " [-1, 1, SPP, [1024, [5, 9, 13]]],\n", - " [-1, 3, C3, [1024, False]], # 9\n", + " [-1, 3, C3, [1024]],\n", + " [-1, 1, SPPF, [1024, 5]], # 9\n", " ]\n", "\n", - "# YOLOv5 head\n", + "# YOLOv5 v6.0 head\n", "head:\n", " [[-1, 1, Conv, [512, 1, 1]],\n", " [-1, 1, nn.Upsample, [None, 2, 'nearest']],\n", @@ -364,13 +435,13 @@ } ], "source": [ - "#this is the model configuration we will use for our tutorial \n", + "#this is the model configuration we will use for our tutorial\n", "%cat /content/yolov5/models/yolov5s.yaml" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 10, "metadata": { "id": "t14hhyqdmw6O", "vscode": { @@ -390,7 +461,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 11, "metadata": { "id": "uDxebz13RdRA", "vscode": { @@ -476,39 +547,48 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 12, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "1NcFxRcFdJ_O", - "outputId": "84614320-0d9c-40c2-dbef-a2c121ab667b", + "outputId": "5d81137a-2d31-42a7-e0a4-b0675337ef96", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "/content/yolov5\n", - "\u001b[34m\u001b[1mgithub: \u001b[0m⚠️ WARNING: code is out of date by 577 commits. Use 'git pull' to update or 'git clone https://github.com/ultralytics/yolov5' to download latest.\n", - "YOLOv5 v4.0-126-g886f1c0 torch 1.9.0+cu111 CUDA:0 (Tesla P100-PCIE-16GB, 16280.875MB)\n", + "2023-10-24 10:18:27.283913: E tensorflow/compiler/xla/stream_executor/cuda/cuda_dnn.cc:9342] Unable to register cuDNN factory: Attempting to register factory for plugin cuDNN when one has already been registered\n", + "2023-10-24 10:18:27.283968: E tensorflow/compiler/xla/stream_executor/cuda/cuda_fft.cc:609] Unable to register cuFFT factory: Attempting to register factory for plugin cuFFT when one has already been registered\n", + "2023-10-24 10:18:27.284008: E tensorflow/compiler/xla/stream_executor/cuda/cuda_blas.cc:1518] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered\n", + "2023-10-24 10:18:27.291751: I tensorflow/core/platform/cpu_feature_guard.cc:182] This TensorFlow binary is optimized to use available CPU instructions in performance-critical operations.\n", + "To enable the following instructions: AVX2 AVX512F FMA, in other operations, rebuild TensorFlow with the appropriate compiler flags.\n", + "2023-10-24 10:18:28.448223: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Could not find TensorRT\n", + "\u001b[34m\u001b[1mtrain: \u001b[0mweights=, cfg=./models/custom_yolov5s.yaml, data=/content/yolov5/Cash-Counter-10/data.yaml, hyp=data/hyps/hyp.scratch-low.yaml, epochs=100, batch_size=16, imgsz=416, rect=False, resume=False, nosave=False, noval=False, noautoanchor=False, noplots=False, evolve=None, bucket=, cache=ram, image_weights=False, device=, multi_scale=False, single_cls=False, optimizer=SGD, sync_bn=False, workers=8, project=runs/train, name=yolov5s_results, exist_ok=False, quad=False, cos_lr=False, label_smoothing=0.0, patience=100, freeze=[0], save_period=-1, seed=0, local_rank=-1, entity=None, upload_dataset=False, bbox_interval=-1, artifact_alias=latest\n", + "\u001b[34m\u001b[1mgithub: \u001b[0m⚠️ YOLOv5 is out of date by 156 commits. Use `git pull` or `git clone https://github.com/ultralytics/yolov5` to update.\n", + "YOLOv5 🚀 v7.0-72-g064365d Python-3.10.12 torch-2.1.0+cu118 CUDA:0 (Tesla T4, 15102MiB)\n", "\n", - "Namespace(adam=False, batch_size=16, bucket='', cache_images=True, cfg='./models/custom_yolov5s.yaml', data='/content/yolov5/American-Mushrooms-1/data.yaml', device='', entity=None, epochs=100, evolve=False, exist_ok=False, global_rank=-1, hyp='data/hyp.scratch.yaml', image_weights=False, img_size=[416, 416], linear_lr=False, local_rank=-1, log_artifacts=False, log_imgs=16, multi_scale=False, name='yolov5s_results', noautoanchor=False, nosave=False, notest=False, project='runs/train', quad=False, rect=False, resume=False, save_dir='runs/train/yolov5s_results', single_cls=False, sync_bn=False, total_batch_size=16, weights='', workers=8, world_size=1)\n", - "\u001b[34m\u001b[1mwandb: \u001b[0mInstall Weights & Biases for YOLOv5 logging with 'pip install wandb' (recommended)\n", - "Start Tensorboard with \"tensorboard --logdir runs/train\", view at http://localhost:6006/\n", - "\u001b[34m\u001b[1mhyperparameters: \u001b[0mlr0=0.01, lrf=0.2, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0\n", + "\u001b[34m\u001b[1mhyperparameters: \u001b[0mlr0=0.01, lrf=0.01, momentum=0.937, weight_decay=0.0005, warmup_epochs=3.0, warmup_momentum=0.8, warmup_bias_lr=0.1, box=0.05, cls=0.5, cls_pw=1.0, obj=1.0, obj_pw=1.0, iou_t=0.2, anchor_t=4.0, fl_gamma=0.0, hsv_h=0.015, hsv_s=0.7, hsv_v=0.4, degrees=0.0, translate=0.1, scale=0.5, shear=0.0, perspective=0.0, flipud=0.0, fliplr=0.5, mosaic=1.0, mixup=0.0, copy_paste=0.0\n", + "\u001b[34m\u001b[1mClearML: \u001b[0mrun 'pip install clearml' to automatically track, visualize and remotely train YOLOv5 🚀 in ClearML\n", + "\u001b[34m\u001b[1mComet: \u001b[0mrun 'pip install comet_ml' to automatically track and visualize YOLOv5 🚀 runs in Comet\n", + "\u001b[34m\u001b[1mTensorBoard: \u001b[0mStart with 'tensorboard --logdir runs/train', view at http://localhost:6006/\n", + "Downloading https://ultralytics.com/assets/Arial.ttf to /root/.config/Ultralytics/Arial.ttf...\n", + "100% 755k/755k [00:00<00:00, 19.6MB/s]\n", "\n", " from n params module arguments \n", " 0 -1 1 3520 models.common.Focus [3, 32, 3] \n", " 1 -1 1 18560 models.common.Conv [32, 64, 3, 2] \n", " 2 -1 1 19904 models.common.BottleneckCSP [64, 64, 1] \n", " 3 -1 1 73984 models.common.Conv [64, 128, 3, 2] \n", - " 4 -1 1 161152 models.common.BottleneckCSP [128, 128, 3] \n", + " 4 -1 3 161152 models.common.BottleneckCSP [128, 128, 3] \n", " 5 -1 1 295424 models.common.Conv [128, 256, 3, 2] \n", - " 6 -1 1 641792 models.common.BottleneckCSP [256, 256, 3] \n", + " 6 -1 3 641792 models.common.BottleneckCSP [256, 256, 3] \n", " 7 -1 1 1180672 models.common.Conv [256, 512, 3, 2] \n", " 8 -1 1 656896 models.common.SPP [512, 512, [5, 9, 13]] \n", " 9 -1 1 1248768 models.common.BottleneckCSP [512, 512, 1, False] \n", @@ -526,48 +606,548 @@ " 21 -1 1 590336 models.common.Conv [256, 256, 3, 2] \n", " 22 [-1, 10] 1 0 models.common.Concat [1] \n", " 23 -1 1 1248768 models.common.BottleneckCSP [512, 512, 1, False] \n", - " 24 [17, 20, 23] 1 18879 models.yolo.Detect [2, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]\n", - "/usr/local/lib/python3.7/dist-packages/torch/nn/functional.py:718: UserWarning: Named tensors and all their associated APIs are an experimental feature and subject to change. Please do not use them for anything important until they are released as stable. (Triggered internally at /pytorch/c10/core/TensorImpl.h:1156.)\n", - " return torch.max_pool2d(input, kernel_size, stride, padding, dilation, ceil_mode)\n", - "Model Summary: 283 layers, 7257791 parameters, 7257791 gradients, 16.8 GFLOPS\n", - "\n", - "Scaled weight_decay = 0.0005\n", - "Optimizer groups: 62 .bias, 70 conv.weight, 59 other\n", - "\u001b[34m\u001b[1mtrain: \u001b[0mScanning 'American-Mushrooms-1/train/labels' for images and labels... 123 found, 0 missing, 0 empty, 0 corrupted: 100% 123/123 [00:00<00:00, 2407.13it/s]\n", - "\u001b[34m\u001b[1mtrain: \u001b[0mNew cache created: American-Mushrooms-1/train/labels.cache\n", - "\u001b[34m\u001b[1mtrain: \u001b[0mCaching images (0.1GB): 100% 123/123 [00:00<00:00, 511.60it/s]\n", - "\u001b[34m\u001b[1mval: \u001b[0mScanning 'American-Mushrooms-1/valid/labels' for images and labels... 5 found, 0 missing, 0 empty, 0 corrupted: 100% 5/5 [00:00<00:00, 1242.98it/s]\n", - "\u001b[34m\u001b[1mval: \u001b[0mNew cache created: American-Mushrooms-1/valid/labels.cache\n", - "\u001b[34m\u001b[1mval: \u001b[0mCaching images (0.0GB): 100% 5/5 [00:00<00:00, 321.12it/s]\n", - "[W pthreadpool-cpp.cc:90] Warning: Leaking Caffe2 thread-pool after fork. (function pthreadpool)\n", - "[W pthreadpool-cpp.cc:90] Warning: Leaking Caffe2 thread-pool after fork. (function pthreadpool)\n", - "Plotting labels... \n", - "\n", - "\u001b[34m\u001b[1mautoanchor: \u001b[0mAnalyzing anchors... anchors/target = 3.48, Best Possible Recall (BPR) = 1.0000\n", - "Image sizes 416 train, 416 test\n", + " 24 [17, 20, 23] 1 40455 models.yolo.Detect [10, [[10, 13, 16, 30, 33, 23], [30, 61, 62, 45, 59, 119], [116, 90, 156, 198, 373, 326]], [128, 256, 512]]\n", + "custom_YOLOv5s summary: 233 layers, 7279367 parameters, 7279367 gradients\n", + "\n", + "\u001b[34m\u001b[1mAMP: \u001b[0mchecks passed ✅\n", + "\u001b[34m\u001b[1moptimizer:\u001b[0m SGD(lr=0.01) with parameter groups 59 weight(decay=0.0), 70 weight(decay=0.0005), 62 bias\n", + "\u001b[34m\u001b[1malbumentations: \u001b[0mBlur(p=0.01, blur_limit=(3, 7)), MedianBlur(p=0.01, blur_limit=(3, 7)), ToGray(p=0.01), CLAHE(p=0.01, clip_limit=(1, 4.0), tile_grid_size=(8, 8))\n", + "\u001b[34m\u001b[1mtrain: \u001b[0mScanning /content/yolov5/Cash-Counter-10/train/labels... 2670 images, 914 backgrounds, 0 corrupt: 100% 2670/2670 [00:01<00:00, 1924.04it/s]\n", + "\u001b[34m\u001b[1mtrain: \u001b[0mNew cache created: /content/yolov5/Cash-Counter-10/train/labels.cache\n", + "\u001b[34m\u001b[1mtrain: \u001b[0mCaching images (1.3GB ram): 100% 2670/2670 [00:14<00:00, 188.00it/s]\n", + "\u001b[34m\u001b[1mval: \u001b[0mScanning /content/yolov5/Cash-Counter-10/valid/labels... 249 images, 83 backgrounds, 0 corrupt: 100% 249/249 [00:00<00:00, 634.84it/s]\n", + "\u001b[34m\u001b[1mval: \u001b[0mNew cache created: /content/yolov5/Cash-Counter-10/valid/labels.cache\n", + "\u001b[34m\u001b[1mval: \u001b[0mCaching images (0.1GB ram): 100% 249/249 [00:02<00:00, 92.86it/s]\n", + "\n", + "\u001b[34m\u001b[1mAutoAnchor: \u001b[0m5.98 anchors/target, 1.000 Best Possible Recall (BPR). Current anchors are a good fit to dataset ✅\n", + "Plotting labels to runs/train/yolov5s_results/labels.jpg... \n", + "Image sizes 416 train, 416 val\n", "Using 2 dataloader workers\n", - "Logging results to runs/train/yolov5s_results\n", + "Logging results to \u001b[1mruns/train/yolov5s_results\u001b[0m\n", "Starting training for 100 epochs...\n", "\n", - " Epoch gpu_mem box obj cls total targets img_size\n", - " 0/99 1.41G 0.1144 0.02597 0.02773 0.1681 49 416: 100% 8/8 [00:03<00:00, 2.55it/s]\n", - " Class Images Targets P R mAP@.5 mAP@.5:.95: 100% 1/1 [00:00<00:00, 4.55it/s]\n", - " all 5 14 0.00492 0.478 0.00691 0.00154\n", - "\n", - " Epoch gpu_mem box obj cls total targets img_size\n", - " 0% 0/8 [00:00\n", - " train(hyp, opt, device, tb_writer, wandb)\n", - " File \"train.py\", line 304, in train\n", - " scaler.scale(loss).backward()\n", - " File \"/usr/local/lib/python3.7/dist-packages/torch/_tensor.py\", line 255, in backward\n", - " torch.autograd.backward(self, gradient, retain_graph, create_graph, inputs=inputs)\n", - " File \"/usr/local/lib/python3.7/dist-packages/torch/autograd/__init__.py\", line 149, in backward\n", - " allow_unreachable=True, accumulate_grad=True) # allow_unreachable flag\n", - "KeyboardInterrupt\n", - "CPU times: user 173 ms, sys: 37.6 ms, total: 211 ms\n", - "Wall time: 25.7 s\n" + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 0/99 1.68G 0.09775 0.04436 0.0621 42 416: 100% 167/167 [00:35<00:00, 4.72it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:03<00:00, 2.17it/s]\n", + " all 249 1379 0.000415 0.0169 0.000222 3.82e-05\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 1/99 1.84G 0.09002 0.04745 0.05694 77 416: 100% 167/167 [00:28<00:00, 5.89it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.94it/s]\n", + " all 249 1379 0.00403 0.0824 0.00376 0.000841\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 2/99 1.84G 0.08354 0.04398 0.05172 69 416: 100% 167/167 [00:27<00:00, 6.07it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 5.14it/s]\n", + " all 249 1379 0.419 0.0175 0.00635 0.00225\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 3/99 1.84G 0.07113 0.04331 0.04881 21 416: 100% 167/167 [00:27<00:00, 6.11it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:06<00:00, 1.29it/s]\n", + " all 249 1379 0.673 0.189 0.0875 0.0319\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 4/99 1.84G 0.05779 0.03983 0.04666 87 416: 100% 167/167 [00:27<00:00, 6.02it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.08it/s]\n", + " all 249 1379 0.706 0.311 0.146 0.0664\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 5/99 1.84G 0.05051 0.03817 0.04587 43 416: 100% 167/167 [00:27<00:00, 6.11it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.99it/s]\n", + " all 249 1379 0.721 0.324 0.195 0.0886\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 6/99 1.84G 0.0459 0.03622 0.04517 107 416: 100% 167/167 [00:27<00:00, 6.11it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.13it/s]\n", + " all 249 1379 0.725 0.342 0.231 0.14\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 7/99 1.84G 0.0433 0.03545 0.0443 45 416: 100% 167/167 [00:27<00:00, 6.14it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.36it/s]\n", + " all 249 1379 0.504 0.392 0.312 0.147\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 8/99 1.84G 0.04119 0.03564 0.04325 115 416: 100% 167/167 [00:28<00:00, 5.80it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.46it/s]\n", + " all 249 1379 0.281 0.435 0.287 0.151\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 9/99 1.84G 0.03922 0.03452 0.04243 68 416: 100% 167/167 [00:27<00:00, 6.04it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.16it/s]\n", + " all 249 1379 0.799 0.272 0.328 0.205\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 10/99 1.84G 0.03885 0.0336 0.04172 31 416: 100% 167/167 [00:27<00:00, 6.07it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.43it/s]\n", + " all 249 1379 0.386 0.393 0.343 0.22\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 11/99 1.84G 0.03671 0.03205 0.03982 98 416: 100% 167/167 [00:27<00:00, 6.13it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.52it/s]\n", + " all 249 1379 0.428 0.444 0.383 0.245\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 12/99 1.84G 0.03713 0.03193 0.03942 88 416: 100% 167/167 [00:27<00:00, 6.10it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.45it/s]\n", + " all 249 1379 0.343 0.508 0.389 0.251\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 13/99 1.84G 0.03644 0.03261 0.0386 72 416: 100% 167/167 [00:27<00:00, 6.12it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.59it/s]\n", + " all 249 1379 0.37 0.49 0.404 0.194\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 14/99 1.84G 0.03624 0.03257 0.03792 82 416: 100% 167/167 [00:27<00:00, 6.08it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.52it/s]\n", + " all 249 1379 0.301 0.643 0.42 0.272\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 15/99 1.84G 0.03456 0.03264 0.03665 144 416: 100% 167/167 [00:27<00:00, 6.13it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.07it/s]\n", + " all 249 1379 0.251 0.549 0.416 0.257\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 16/99 1.84G 0.03397 0.03066 0.03658 81 416: 100% 167/167 [00:27<00:00, 6.14it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.12it/s]\n", + " all 249 1379 0.251 0.633 0.422 0.245\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 17/99 1.84G 0.03464 0.03155 0.03478 71 416: 100% 167/167 [00:27<00:00, 6.07it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.59it/s]\n", + " all 249 1379 0.274 0.528 0.415 0.253\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 18/99 1.84G 0.03406 0.03187 0.03437 8 416: 100% 167/167 [00:27<00:00, 6.18it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.63it/s]\n", + " all 249 1379 0.3 0.555 0.427 0.239\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 19/99 1.84G 0.03348 0.03082 0.03527 102 416: 100% 167/167 [00:27<00:00, 6.17it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.42it/s]\n", + " all 249 1379 0.292 0.667 0.413 0.278\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 20/99 1.84G 0.03336 0.03093 0.03424 33 416: 100% 167/167 [00:27<00:00, 6.10it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.61it/s]\n", + " all 249 1379 0.362 0.583 0.437 0.282\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 21/99 1.84G 0.03338 0.03025 0.03368 80 416: 100% 167/167 [00:26<00:00, 6.33it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.44it/s]\n", + " all 249 1379 0.278 0.657 0.435 0.268\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 22/99 1.84G 0.03199 0.03174 0.03265 25 416: 100% 167/167 [00:27<00:00, 6.13it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.66it/s]\n", + " all 249 1379 0.276 0.577 0.46 0.306\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 23/99 1.84G 0.03277 0.02992 0.03366 36 416: 100% 167/167 [00:27<00:00, 6.16it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.73it/s]\n", + " all 249 1379 0.288 0.618 0.476 0.32\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 24/99 1.84G 0.03226 0.029 0.03289 57 416: 100% 167/167 [00:26<00:00, 6.23it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.64it/s]\n", + " all 249 1379 0.282 0.539 0.443 0.287\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 25/99 1.84G 0.03243 0.03037 0.03249 48 416: 100% 167/167 [00:28<00:00, 5.79it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.77it/s]\n", + " all 249 1379 0.333 0.543 0.47 0.303\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 26/99 1.84G 0.03206 0.0289 0.03225 27 416: 100% 167/167 [00:26<00:00, 6.22it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.91it/s]\n", + " all 249 1379 0.385 0.685 0.455 0.308\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 27/99 1.84G 0.03216 0.02981 0.03224 105 416: 100% 167/167 [00:26<00:00, 6.22it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.14it/s]\n", + " all 249 1379 0.327 0.635 0.458 0.285\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 28/99 1.84G 0.03141 0.03002 0.03074 80 416: 100% 167/167 [00:27<00:00, 6.15it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.37it/s]\n", + " all 249 1379 0.386 0.695 0.477 0.308\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 29/99 1.84G 0.03103 0.03057 0.03039 39 416: 100% 167/167 [00:26<00:00, 6.23it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.51it/s]\n", + " all 249 1379 0.331 0.68 0.483 0.33\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 30/99 1.84G 0.03102 0.02814 0.03114 53 416: 100% 167/167 [00:27<00:00, 6.17it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.77it/s]\n", + " all 249 1379 0.319 0.639 0.452 0.305\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 31/99 1.84G 0.0314 0.02844 0.03106 98 416: 100% 167/167 [00:27<00:00, 6.18it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.68it/s]\n", + " all 249 1379 0.342 0.728 0.489 0.293\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 32/99 1.84G 0.03055 0.02902 0.02847 59 416: 100% 167/167 [00:26<00:00, 6.20it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.84it/s]\n", + " all 249 1379 0.354 0.758 0.514 0.334\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 33/99 1.84G 0.03032 0.02914 0.0285 121 416: 100% 167/167 [00:28<00:00, 5.79it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.90it/s]\n", + " all 249 1379 0.338 0.795 0.518 0.354\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 34/99 1.84G 0.02985 0.02742 0.03082 102 416: 100% 167/167 [00:27<00:00, 6.17it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.51it/s]\n", + " all 249 1379 0.354 0.753 0.52 0.353\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 35/99 1.84G 0.03064 0.02948 0.02885 85 416: 100% 167/167 [00:27<00:00, 6.03it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.17it/s]\n", + " all 249 1379 0.362 0.688 0.517 0.336\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 36/99 1.84G 0.03074 0.02933 0.02895 108 416: 100% 167/167 [00:27<00:00, 6.02it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.83it/s]\n", + " all 249 1379 0.389 0.714 0.53 0.351\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 37/99 1.84G 0.02974 0.02851 0.0272 78 416: 100% 167/167 [00:26<00:00, 6.20it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.83it/s]\n", + " all 249 1379 0.351 0.709 0.495 0.336\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 38/99 1.84G 0.0293 0.02952 0.02935 235 416: 100% 167/167 [00:26<00:00, 6.23it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.91it/s]\n", + " all 249 1379 0.358 0.767 0.538 0.353\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 39/99 1.84G 0.02917 0.0272 0.02802 88 416: 100% 167/167 [00:26<00:00, 6.26it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.99it/s]\n", + " all 249 1379 0.359 0.797 0.525 0.349\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 40/99 1.84G 0.02958 0.02936 0.02784 60 416: 100% 167/167 [00:27<00:00, 6.16it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 5.01it/s]\n", + " all 249 1379 0.374 0.799 0.529 0.335\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 41/99 1.84G 0.02882 0.0281 0.02712 149 416: 100% 167/167 [00:26<00:00, 6.30it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.86it/s]\n", + " all 249 1379 0.412 0.678 0.562 0.373\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 42/99 1.84G 0.03004 0.02807 0.02852 76 416: 100% 167/167 [00:27<00:00, 5.97it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.99it/s]\n", + " all 249 1379 0.41 0.721 0.556 0.378\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 43/99 1.84G 0.0294 0.02797 0.02815 61 416: 100% 167/167 [00:26<00:00, 6.27it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.50it/s]\n", + " all 249 1379 0.425 0.751 0.553 0.382\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 44/99 1.84G 0.02861 0.0278 0.02785 22 416: 100% 167/167 [00:26<00:00, 6.24it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.37it/s]\n", + " all 249 1379 0.402 0.763 0.525 0.346\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 45/99 1.84G 0.02854 0.02819 0.02707 45 416: 100% 167/167 [00:26<00:00, 6.31it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.39it/s]\n", + " all 249 1379 0.381 0.728 0.573 0.397\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 46/99 1.84G 0.0286 0.02739 0.02689 124 416: 100% 167/167 [00:26<00:00, 6.27it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.80it/s]\n", + " all 249 1379 0.354 0.674 0.53 0.358\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 47/99 1.84G 0.02892 0.0284 0.02604 77 416: 100% 167/167 [00:26<00:00, 6.22it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.90it/s]\n", + " all 249 1379 0.405 0.676 0.552 0.373\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 48/99 1.84G 0.02906 0.02854 0.02638 60 416: 100% 167/167 [00:26<00:00, 6.28it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.55it/s]\n", + " all 249 1379 0.388 0.7 0.568 0.399\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 49/99 1.84G 0.02873 0.02854 0.02655 53 416: 100% 167/167 [00:26<00:00, 6.28it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.87it/s]\n", + " all 249 1379 0.41 0.682 0.582 0.4\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 50/99 1.84G 0.02836 0.02612 0.0271 65 416: 100% 167/167 [00:28<00:00, 5.88it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.77it/s]\n", + " all 249 1379 0.411 0.791 0.583 0.399\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 51/99 1.84G 0.02817 0.02724 0.0258 87 416: 100% 167/167 [00:26<00:00, 6.31it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.89it/s]\n", + " all 249 1379 0.384 0.677 0.576 0.394\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 52/99 1.84G 0.02736 0.02737 0.02469 46 416: 100% 167/167 [00:26<00:00, 6.28it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.49it/s]\n", + " all 249 1379 0.39 0.723 0.561 0.383\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 53/99 1.84G 0.02792 0.02821 0.02469 58 416: 100% 167/167 [00:26<00:00, 6.28it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.52it/s]\n", + " all 249 1379 0.41 0.793 0.575 0.398\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 54/99 1.84G 0.02776 0.02762 0.02611 85 416: 100% 167/167 [00:26<00:00, 6.34it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.18it/s]\n", + " all 249 1379 0.453 0.682 0.566 0.394\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 55/99 1.84G 0.02811 0.02673 0.02686 63 416: 100% 167/167 [00:26<00:00, 6.29it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.73it/s]\n", + " all 249 1379 0.407 0.744 0.567 0.384\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 56/99 1.84G 0.0278 0.02727 0.02552 51 416: 100% 167/167 [00:26<00:00, 6.25it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.63it/s]\n", + " all 249 1379 0.399 0.707 0.578 0.406\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 57/99 1.84G 0.02775 0.02714 0.02418 103 416: 100% 167/167 [00:27<00:00, 6.10it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.92it/s]\n", + " all 249 1379 0.407 0.848 0.593 0.399\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 58/99 1.84G 0.02815 0.02696 0.0247 82 416: 100% 167/167 [00:27<00:00, 6.14it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.41it/s]\n", + " all 249 1379 0.42 0.819 0.591 0.398\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 59/99 1.84G 0.02718 0.02709 0.02424 91 416: 100% 167/167 [00:26<00:00, 6.27it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.99it/s]\n", + " all 249 1379 0.441 0.761 0.601 0.422\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 60/99 1.84G 0.02701 0.02622 0.02344 38 416: 100% 167/167 [00:26<00:00, 6.28it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.16it/s]\n", + " all 249 1379 0.436 0.857 0.607 0.414\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 61/99 1.84G 0.02717 0.02683 0.02334 66 416: 100% 167/167 [00:26<00:00, 6.31it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.53it/s]\n", + " all 249 1379 0.423 0.756 0.586 0.399\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 62/99 1.84G 0.02721 0.02661 0.02401 57 416: 100% 167/167 [00:26<00:00, 6.31it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.15it/s]\n", + " all 249 1379 0.439 0.737 0.589 0.394\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 63/99 1.84G 0.02742 0.02583 0.02359 98 416: 100% 167/167 [00:27<00:00, 6.02it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.61it/s]\n", + " all 249 1379 0.404 0.732 0.578 0.39\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 64/99 1.84G 0.02714 0.02731 0.02258 45 416: 100% 167/167 [00:28<00:00, 5.82it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.65it/s]\n", + " all 249 1379 0.456 0.731 0.594 0.407\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 65/99 1.84G 0.0266 0.02584 0.02354 39 416: 100% 167/167 [00:27<00:00, 5.99it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.79it/s]\n", + " all 249 1379 0.45 0.853 0.591 0.41\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 66/99 1.84G 0.02738 0.02611 0.0235 53 416: 100% 167/167 [00:27<00:00, 6.00it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.36it/s]\n", + " all 249 1379 0.451 0.797 0.582 0.414\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 67/99 1.84G 0.02695 0.02622 0.02324 48 416: 100% 167/167 [00:30<00:00, 5.50it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.30it/s]\n", + " all 249 1379 0.452 0.837 0.589 0.417\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 68/99 1.84G 0.02664 0.02507 0.0239 150 416: 100% 167/167 [00:27<00:00, 6.08it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.76it/s]\n", + " all 249 1379 0.455 0.852 0.565 0.398\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 69/99 1.84G 0.02612 0.02559 0.02371 86 416: 100% 167/167 [00:28<00:00, 5.95it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.84it/s]\n", + " all 249 1379 0.464 0.841 0.589 0.408\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 70/99 1.84G 0.02637 0.02583 0.02237 52 416: 100% 167/167 [00:27<00:00, 6.15it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.80it/s]\n", + " all 249 1379 0.485 0.871 0.594 0.422\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 71/99 1.84G 0.02709 0.0262 0.02201 70 416: 100% 167/167 [00:27<00:00, 6.05it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.84it/s]\n", + " all 249 1379 0.445 0.807 0.6 0.403\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 72/99 1.84G 0.02666 0.02575 0.02218 74 416: 100% 167/167 [00:27<00:00, 6.00it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.78it/s]\n", + " all 249 1379 0.477 0.782 0.599 0.41\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 73/99 1.84G 0.02612 0.02553 0.02283 60 416: 100% 167/167 [00:27<00:00, 6.03it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.70it/s]\n", + " all 249 1379 0.479 0.85 0.604 0.432\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 74/99 1.84G 0.02639 0.02537 0.02128 80 416: 100% 167/167 [00:27<00:00, 6.00it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.81it/s]\n", + " all 249 1379 0.491 0.839 0.603 0.42\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 75/99 1.84G 0.0256 0.02432 0.02368 42 416: 100% 167/167 [00:29<00:00, 5.66it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.72it/s]\n", + " all 249 1379 0.472 0.813 0.603 0.415\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 76/99 1.84G 0.02628 0.02604 0.02191 38 416: 100% 167/167 [00:28<00:00, 5.85it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.59it/s]\n", + " all 249 1379 0.467 0.751 0.601 0.418\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 77/99 1.84G 0.0254 0.02536 0.021 38 416: 100% 167/167 [00:28<00:00, 5.79it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.63it/s]\n", + " all 249 1379 0.487 0.78 0.602 0.409\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 78/99 1.84G 0.02553 0.02492 0.02133 150 416: 100% 167/167 [00:28<00:00, 5.88it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.94it/s]\n", + " all 249 1379 0.47 0.848 0.598 0.409\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 79/99 1.84G 0.02563 0.02494 0.02103 80 416: 100% 167/167 [00:28<00:00, 5.93it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.52it/s]\n", + " all 249 1379 0.495 0.81 0.605 0.43\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 80/99 1.84G 0.0256 0.0248 0.02165 47 416: 100% 167/167 [00:28<00:00, 5.91it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.69it/s]\n", + " all 249 1379 0.485 0.86 0.612 0.422\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 81/99 1.84G 0.02557 0.0256 0.02054 35 416: 100% 167/167 [00:28<00:00, 5.78it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.58it/s]\n", + " all 249 1379 0.469 0.822 0.612 0.418\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 82/99 1.84G 0.02549 0.02499 0.01994 60 416: 100% 167/167 [00:29<00:00, 5.65it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.62it/s]\n", + " all 249 1379 0.467 0.857 0.602 0.421\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 83/99 1.84G 0.02638 0.02606 0.01999 40 416: 100% 167/167 [00:31<00:00, 5.38it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.10it/s]\n", + " all 249 1379 0.5 0.781 0.61 0.424\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 84/99 1.84G 0.02574 0.02447 0.02159 78 416: 100% 167/167 [00:28<00:00, 5.81it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.71it/s]\n", + " all 249 1379 0.458 0.853 0.61 0.419\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 85/99 1.84G 0.02529 0.02549 0.02106 41 416: 100% 167/167 [00:28<00:00, 5.85it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.70it/s]\n", + " all 249 1379 0.482 0.868 0.603 0.413\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 86/99 1.84G 0.02462 0.02453 0.02045 56 416: 100% 167/167 [00:28<00:00, 5.81it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.59it/s]\n", + " all 249 1379 0.491 0.859 0.608 0.417\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 87/99 1.84G 0.02509 0.02538 0.01955 123 416: 100% 167/167 [00:29<00:00, 5.70it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.71it/s]\n", + " all 249 1379 0.473 0.882 0.613 0.429\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 88/99 1.84G 0.02532 0.02468 0.02032 114 416: 100% 167/167 [00:29<00:00, 5.75it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.33it/s]\n", + " all 249 1379 0.474 0.769 0.613 0.426\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 89/99 1.84G 0.02434 0.02459 0.02016 36 416: 100% 167/167 [00:28<00:00, 5.82it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.69it/s]\n", + " all 249 1379 0.484 0.849 0.606 0.428\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 90/99 1.84G 0.02485 0.02456 0.01918 63 416: 100% 167/167 [00:30<00:00, 5.46it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.62it/s]\n", + " all 249 1379 0.512 0.809 0.631 0.445\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 91/99 1.84G 0.02523 0.02394 0.01908 80 416: 100% 167/167 [00:28<00:00, 5.80it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.62it/s]\n", + " all 249 1379 0.488 0.819 0.612 0.435\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 92/99 1.84G 0.02522 0.02471 0.01873 27 416: 100% 167/167 [00:29<00:00, 5.74it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.53it/s]\n", + " all 249 1379 0.473 0.811 0.615 0.436\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 93/99 1.84G 0.02505 0.02417 0.01981 65 416: 100% 167/167 [00:28<00:00, 5.83it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.16it/s]\n", + " all 249 1379 0.468 0.822 0.616 0.426\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 94/99 1.84G 0.02454 0.02377 0.01962 50 416: 100% 167/167 [00:29<00:00, 5.71it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.63it/s]\n", + " all 249 1379 0.488 0.815 0.617 0.433\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 95/99 1.84G 0.02484 0.02411 0.01905 89 416: 100% 167/167 [00:29<00:00, 5.74it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.59it/s]\n", + " all 249 1379 0.488 0.866 0.62 0.432\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 96/99 1.84G 0.02429 0.0254 0.01824 69 416: 100% 167/167 [00:28<00:00, 5.81it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.59it/s]\n", + " all 249 1379 0.495 0.859 0.62 0.441\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 97/99 1.84G 0.02508 0.02506 0.01825 64 416: 100% 167/167 [00:29<00:00, 5.68it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:02<00:00, 3.52it/s]\n", + " all 249 1379 0.505 0.876 0.622 0.442\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 98/99 1.84G 0.02512 0.0246 0.01919 59 416: 100% 167/167 [00:30<00:00, 5.47it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.70it/s]\n", + " all 249 1379 0.49 0.885 0.621 0.435\n", + "\n", + " Epoch GPU_mem box_loss obj_loss cls_loss Instances Size\n", + " 99/99 1.84G 0.02408 0.02346 0.01833 42 416: 100% 167/167 [00:29<00:00, 5.75it/s]\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:01<00:00, 4.55it/s]\n", + " all 249 1379 0.482 0.896 0.609 0.425\n", + "\n", + "100 epochs completed in 0.840 hours.\n", + "Optimizer stripped from runs/train/yolov5s_results/weights/last.pt, 14.8MB\n", + "Optimizer stripped from runs/train/yolov5s_results/weights/best.pt, 14.8MB\n", + "\n", + "Validating runs/train/yolov5s_results/weights/best.pt...\n", + "Fusing layers... \n", + "custom_YOLOv5s summary: 182 layers, 7270791 parameters, 0 gradients\n", + " Class Images Instances P R mAP50 mAP50-95: 100% 8/8 [00:10<00:00, 1.30s/it]\n", + " all 249 1379 0.512 0.809 0.631 0.445\n", + " Dime 249 202 0.617 0.965 0.949 0.596\n", + " Nickel 249 357 0.738 0.933 0.939 0.645\n", + " Penny 249 502 0.82 0.998 0.988 0.688\n", + " Quarter 249 214 0.79 0.977 0.963 0.697\n", + " fifty 249 15 0.168 0.733 0.231 0.168\n", + " five 249 15 0.299 0.4 0.274 0.229\n", + " hundred 249 20 0.932 0.65 0.743 0.507\n", + " one 249 20 0.322 0.808 0.526 0.404\n", + " ten 249 16 0.214 0.938 0.393 0.319\n", + " twenty 249 18 0.224 0.689 0.304 0.203\n", + "Results saved to \u001b[1mruns/train/yolov5s_results\u001b[0m\n", + "CPU times: user 36.6 s, sys: 3.78 s, total: 40.4 s\n", + "Wall time: 51min 21s\n" ] } ], @@ -594,299 +1174,45 @@ "id": "7KN5ghjE6ZWh" }, "source": [ - "Training losses and performance metrics are saved to Tensorboard and also to a logfile defined above with the **--name** flag when we train. In our case, we named this `yolov5s_results`. (If given no name, it defaults to `results.txt`.) The results file is plotted as a png after training completes.\n", + "You can view the training graphs associated with a training job in the `/content/yolov5/runs/train/yolov5s_results/results.png` folder.\n", + "\n", + "Training losses and performance metrics are also saved to Tensorboard and also to a logfile defined above with the **--name** flag when we train. In our case, we named this `yolov5s_results`.\n", "\n", "Note from Glenn: Partially completed `results.txt` files can be plotted with `from utils.utils import plot_results; plot_results()`." ] }, { "cell_type": "code", - "execution_count": null, - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 821, - "resources": { - "https://localhost:6006/?tensorboardColab=true": { - "data": "PCFkb2N0eXBlIGh0bWw+PG1ldGEgbmFtZT0idGItcmVsYXRpdmUtcm9vdCIgY29udGVudD0iLi8iPjwhZG9jdHlwZSBodG1sPjwhLS0KQGxpY2Vuc2UKQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCkxpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwp5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCllvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQpkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLApXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZApsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0+PGh0bWw+PGhlYWQ+PG1ldGEgY2hhcnNldD0idXRmLTgiPgo8dGl0bGU+VGVuc29yQm9hcmQ8L3RpdGxlPgo8bGluayByZWw9InNob3J0Y3V0IGljb24iIGhyZWY9ImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBTVFBQUFERUNBWUFBQURBcG81ckFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFCYWJnQUFXbTRCeFdzak9BQUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQmwwU1VSQlZIaWM3WjE1ZUZUVjNjYy92NXNGQ1ZSeHFWdHB0VlcyVmx4ZjYxcXRpcTBMOUdsOU5YVUJGRXBGUlRJaGhCQURDVGRBTUFFa0NZc0s3cUI5K2tENzJxZkJXaXZxVzdWYTY3NGlyZTlyYXhYMWJaVldaVEhML040LzVnNEdTR0R1ekwxejc1MDVuMzg0ek13NTU4dk0vWEsyM3prSERJR2ppemhQRjNGZTBEb01JRUVMeUdkMFBvT3dhQUF1Y1Y1YWgwVzVWUEI2a0xyeUdXT0lBRkNiL3ZTakVxZ0crdXp3S3dnZHdDMTBVQ2ZWL0RzWWhmbUxNVVFXVVJ1TEVrWUQ4eEVPMnY3R2pvWndQc3hIV014aElFdWxsSzVzNnN4bmpDR3loQzdnSkpSVzRDU2daeFAwbkg0Smk1aVU4N2pmR2czR0VMNmpUUXdFNWdHamtXN2ZkK3FHU0xLV0lzcGtNbS83SU5QZ1lBemhFMnBUUWgrcXNLZ0MrZ0x1VGJCcmVpdXdtSFlhWkRxZmVpcllBQmhEZUk0cVFpTVhBd3NRRHZQQUJEMmxOeUxVczRuYnhTYWV1V3BERW1NSUQ5RWJPUUZvUlRodCs0ditHQ0w1NTdOQXVjUjRLaTNCaGwwd2h2QUFiZUFRTEd4Z0FtRDVhb0x1NmNTZml2QUxsRXFKOFk1TDZZYWRNSWJJQUxVcHBvaHJFV1lqN0wzOWpld2FJcG5lakxLUXZXbVVjV3hMNlI5ZzJBVmppRFRSdVl6Q29nWDRCcEE5RTNSUDkveiszNEdaVXNiS1hxUWJkb014aEV1MGdhTVJtbEhPOXZBQi82T1RPdGtEUXlUU3lpTW81UkxqdFo3K0hZYWVzWUlXRUJYVVpqK2RTeXZ3UE1yWkhoVzdFV0VpbjNFYVV6a1ZvUlQ0bXljbEMrZGc4Ykl1WmFYZXdvR2VsSmtIbUJaaUQ2aE5JVVdNUjJrQUR2Q29WZGlLc0pqNHJ1c0p1cHdTUHFNS3FFS2M5WXZleWttOXprMUFFd2ZTTEtXMFkrZ1ZZNGpkb1BXY2cwVUx3bEhiWDh6Y0VHc1J5bVRhN2xlY3RZbUJGRGtyM095d3hwMk9JWkxwRFFoVDVUb2UyRjNkK1l3eFJBL29IQVpCdDdCc2IxcUZGeW1nWENyZHhTVHBJczRFV2hDTzNhWE05TFdzbzRDWVhNTWJiclRrQThZUTNWQ2IvZ2lWeUU1aDJaa1o0aU9FT1J5ZWZ0U3EybGdNWURUS2ZPQWdqM1Ixb054Q0lYVXkwWVNaSnpHR3dIbmdMT2VCNnlrc083MEhML0hBaVhmN0duUVovV252d2JEcGF3U2NNUFA5VEpnNUdFT2dzMU1JeTNiL3NLMGpUa3hxL09tU2FDdURVQnFRN1R2dHZPald2WWhRTHRma2Q1aDUzaHBDYlJkaDJhay9WQnRRS3FTRzMzZ3F0aGUwbFhPQUZ1QW9EOWRFMWxKQW1mdzBQOFBNODg0UWFsTUN6clJtcW1IWmUzNlFOaUUwOFRuTlltZDNXbE50Q3RtWDhZZ3pMZHk3UmpmcFJKaDVFUTN5ay93S004OGJReWdJZFZ5TXhRTFVaVmgyNys5M290eUpNRk5xK0lmWG10MmdpOWlQUW1ZQjF5RVVibjhqTTNPOGgxTERSRmFKb0o0S0RpbDVZUWl0NVFRa2c3RHNubDk3Rkl0eXFlWlZUOFZtaUM1aEtFb3o0aHhyNDAxWDZsbVVtRnpEMHg1S0RTVTViUWl0NFJDS3NORU13N0ozZk8wdGxCcVp5UnFQNVhxS0xtWVVRZ3ZpQkI5Q3B1WlE0RjQ2cUpKSmZPQ3AyQkNSazRaUW0ySTZQUXpMVHZ5WkNLL2VoeHVsak04OWx1d0xhbFBNL3M3M0FIdDcxRnBzUmxoSVlXNkdtZWVjSVhTRzUySFpjWVQ3RUtiSkRENzBWbTEyME9VY1FnYzI0clNVNE1YMzhoWkNqVXdJZDB2cGxwd3hoTjdBVUFwb0JzN3pjQXJ5R1pTWTFQR01oMUlEUTI5MnRyZ3FwM24ySFZrOFNwd3A4bE5lOFZCcVlFVGVFR3F6SHgzTVFyZ09uTm1Wekgvc2Q0RVoxT2JlN0lvcXdpM09JUWh3R09ERjk5V0pPTE50NDRPZGJjdVV5QnBDYlFycFlEeDRHcGE5QlZqQWwyaVNDclo2S0RkMDZISks2S1FLU1NITVBOVzB4U2JpTkxGM2RNUE1JMmtJclhGV2FMMEx5MWJnRnhRd1RXWjZ0RUVuSXVqaUZNTE0zYVlUWWVZVk1pNDdLL1plRWlsRDZFd0dFZmM4TFBzNUxNcWxqajk0cHpSNjZNMmM2VXhHN0JwbTdqYjl4V3ZyS0tSTXhyTGVPNlgrRWdsRHFPMUVlU3JWQ0gyMnY1R1pJVFlDOVdBTyswcWlOaFlITzRjeGR3OHpoMHpXYlJKUnZ4M1JDRE1QdFNIVXhtSXJvN0djSHdpOGFCWGFnVnNwWWFZNURySm5kQm45c2FqRWNzTE1JUk5ESkVtRW1mY05kNWg1YUEyaE4zUUx5L1p1R25VdFFreHMvdGREcVRtTDNzb2d4T21pWm02SVpQb0ZsSElaeHhOZWF2V0swQmxDcXhpSTFXMlFCMTYwQ2kraGxNc2NmdStwMkR4QlZ6RENpWTlLVEdKa1pvaGtlaTF4SnNzNC91cWwxa3dKalNIVXBvUXR6alFnOVBXb1ZVaHMzMXpQVWxrVDNtWTZDcWhOSVY5eFRoOFJKOHdjTWpFRUpLYTVsOUNYdVZMS1o5NHFUby9BRGFFZ1RPTml4RmtvY3YrbDlwUk9YRXZWVHAwMGhYOGdGeVgwZHZaRG1RVk1BZ295TkVReS9SNUNEYU9EWHdnTjFCQTZsUk93ZWduTFR0OFE2eERLWlk2NXVOQlA5RGFHQVl1UWJyZW5adjdiL1FtTG1JemVmcEpoMWduRUVGcnVoR1h2N3JSczkxL3FCdUpNbFhubXpLRnNvcmN6Q3B4Z1NtOWFkMFdjTVBOeDJROHp6Nm9obk83Uk5KUmFoUDQ5cW5EL3BYNE0xRlBFeldMVDZhMWlReXJvWGV4Rm5BcmdCcUMvUitPL1Q3Q1lReEdMc3hrR2t2VVdRaXM0emprTjc0d2VWYVJ1aUVSWWRoR1ZZdk4vZm1nMXVFT1hjd2lGUG9XWlg1R2RNUFBBeGhCYXlTaUVWdURycmcyaFBJb3dSZWJsUnNoeHJxRjNjd0pkenRqUXV6V2tSMUhLWmJTL1czYURIVlRiRkxPWmF4SG1BRi9hUVZIUFg4eGJXTlJJUTI1dFNzbEZWQkh1OWlITUhPNmtpSmxTNmsrWWVlRFRyZ0JheGFIQUxHQUMwbU5UbTlpMldFeWoyTG0zYlRHWDBlV1VVSnppYWVhcHB6ZWgxSE1veStRc2I4ZU5vVEJFRXEzaVA1eHUxS21Pc3NURzlpNnFaRUh1Ym16UEIvUTJCbExNUE5URE1ITjRFNHNLdVpRSHZkSVpLa09BTXhNMW5URUlGMk5oeXp4ZUNGcVR3VHYwTHI3cmhKa2ZzLzNGek0xeFAzRXE1WXJNWTlSQ1p3aEQ3cU0yRm9jN1llYVNRWmo1anVrT0xHNmhnMW9aelNmcGFqT0dNQVNHcnFZL1c3dWRaZzZadHhiQyt5ZzJGbmVrRTJadURHRUlITDJQUVhTbEVXYSt1elE4ajBXNWxQS2tHeTNHRUliUW9QZHdQc0lpaEtGQXBvYUF4S1gyRStUSDNKbXFCdGUza0dvNUU3U2NIN3JOWnpEc0NibVNCOW5LMGNCRTRKOWVGQWtjNmlhRCsydDVsU05SN3RjWTYvUjZ4OGtHZzBmSVJEcGtEQ3Zvd3hCZ01XUjNIMHM2aGloeVV1ZFF3Q3NhbzFXdjZ4YW9aekI0Z0pUeXNZd21ScHpod0crelZhOTdRMWpiRFFGUUJKUlJ4SHFOTWRZelZRYURnNHhsdll6bWZJUWZnUDk3NFROcElib3pFTGhIeTNqWWRLTU1maUNYMDBZUnc0QnlTSCtkWVUrNE53UTlHaUtCTUlJQ1h0WXBOS3JOWHVuTE1oaDJSVXBwbHl0b1JSZ0cvcHlsNWEwaEVoU2pUT2Rmdks0eFJxWWp5bURZSFhJWkc4R2Z2ZGQrR0NMSk54RGFkQXB0V3NuWDA2akhZTWc2WG8waGRzZEl1bmhkSzdCTk44b1FkaktkWlVxVnZpaXorSVRYdEpJTDA4aHZNR1NGYkxRUTNUbUNPR3UxZ2pZdDUvQU15akVZZk1IUE1jVHVHRWtCYjJpbDZVWVp3a1ZRaG9Ca04rcFRYdFZwWE9CUm1RWkRSZ1JwaUNSSG9qeWdVMm5UYXRPTk1nUkx0c2NRdlNPTXBKUFh0UXBiSjNlN0ZNVmd5Q0x1RFNFK0dTSkJDY29zK3ZDYVR1dDJacWpCa0NYQzBHWGFGZUZJNEVHdG9rMm5PbWY2R0F4WklKeUcrSUxFYkpUcFJobXlSTmdOQVZBQ3pLS0VWM1U2Mzg5eTNZWThJd3FHU0RJSStLMVcwNmJUK1ZwQUdndzVUcFFNa1VBWmliQmVxN0hWcGpoUUxZYWNJM3FHU0pEb1JtM2pWYTNtZTBHTE1lUU9VVFZFa3NFSUQra050T2tNdmhxMEdFUDBpYm9oa293a3pucXRNZDBvUTJia2lpRUErZ0d6YU9jVnJlSGNvTVVZb29rclEyamk0S2RDbjdSNHhSRGdkenJEZEtNTTduSFhRbHdkZWpOMFp5U3dYbWVhYmxSZUUzZDNHSUhiTGxOWXUwdTkwUTlsRmwyOHJETVpFYlFZUTFiWmpGTFBOaGE1eWVUT0VQdEd6aEFKbEtIQTczUW1LN1dHZzRLV1kvQVZCVmJSd1NDNURGdkd1YnVDelowaE9pTnFpQVFDaktHQURUcVRtTnFSNnY0WlVrSDVFeGFueWFXTWxURzhuMDRSN2d6UkZXbERKTmtIb1lVdW50TmFUZ3Rhak1FVDNrVzRra3M1V1VwNU9wT0MzQm5DcjgxQndYQU13aE5hWjdwUmtVWFpBdFJUd0dDNWxKVWltUjllNXM0UThad3lCQ1M3VVlXOHFYWEU5QklLZ2haa1NCRmhGVVVNbHN1d3BaU3QzaFhyQXIyZW9SU3czbFdwMFVxL2hEQkpiSjdDa0plNGF5R0tjcTZGMkpsamdTZlZacVhhSEJpMEdFUDJ5ZWN4Uk0rbzA0MkNEVnBQVEZlYmJsUStZUXpST3dOUVdsalBzenFiVTRJV1k4Z091YjVTN1FYSG9meEI2MW1wOC9oeTBHSU0vbUphaU5SSWRLTTYyYUJ6VERjcWwzRm5DTW43SUxsOVVWcll3SjkwTGljSExjYmdQYWJMbEE3SzhTaFA2UnpUamNvMVRKY3BmUkxkcUM3VGpjb2xUQXVST2ZzaXRQQVhudEhabkJTMEdFTm11RE5FZXJjSDVRZktDVmc4cFhOWnFUWUhCQzNIa0I2bWhmQVdDMkVNUld6UUJtSnFwN1ZuUFZSb013T0MxcEFKdXBxRDNYemU3USsyNXowRXJxS2pjcGI5Z0JhS2VWSWJPU1pvTWVtZ1N6aFVsN0tjWXVZRXJTVWRkQlZEOUdjOFFBZFQzZVJ6TzZoMk4rMXF6SEVLU2xuUUl0eWdOc1c2aEJnV2J5SmNUWG9uc3dTRzNzZStlaCtOV0x3QzdtK21jcmRyVENsSyt5SGZNZDltNERHZ2pTNmVvSWpIMEJ6ZGt4Q25QV2dKcWFMTEdJWFNDdEc3VjF4dExJNWdOTEFBMGcvTWRMdU5NcE14eE5zb0R3TnIyWWVIeFA3aVFkRktLb0Q3TWlnN3ZBZ2RRVXZZRTdxTVk0blRnbkptMEZyU1FlL2pMT0swSUJ5ZGFWbnVER0ZSNUdKUFVoZUovUVZyRWRya0pwN3Y3WU95a0o5cEpaZEREdDVoTGVGdElYUXArd04xeEprRTBWdEgwWlY4RFl1NUtHTzg2cDY3N3pMdG5zMkkweFVxNU5leWdBOWNLTG1lTHI1TDRnUyszRUhEMTBMb2NvcG81enJpMUNQc0U3UWV0K2hLK2lGTUE2YWo3T1hsV05XTEx0UGJDQThqdTNhRjNDQ04vRldyYUVDWmwzZ2huVkpDU01nTW9Zc1p3ZWUwQU44S1dvdGJWQkh1WlF4S0U3aWJUazJWZEF6eFJWY29UcHNzN3IwcjVKb1NGckNaVWhJNzEzSURLeHlHMEtVTXBvdEZLQmRHOFQ4YnZZc1RXVVVyK0xzM3haMGh1cmliSXVaTE14LzdJVVpzT3JXUzZ4Q2VwUHQwWDIvN29LTkJvR01JYldZQVFqVmRUSUhvUlN2clBYd0Z1QkVZVFJaK2ZWZUdrS1c4NlplUTdYVXM1R21keG5MZ1dyL3J5Z29CZFpuVXhtSkE1dE9RUWFHcjZjdFd5b0Fad0pleVZXODRGMTIyVVkzdzNoNC9GNFhXSW9CWkpyMkpzOWlIRjRCN2lLSVo3bUlVVzNnRHBaRXNtZ0ZDYWdoWndpZEFoYnRNL21qSm1DeTJFSG9UWDlWbVZtTHhLRVF2WkVUdjVIaTlpOGNSZmcwY0hvU0cwSjV2S2syczFtbU1SaGpsUHJNUGd0SWxDNGJRQmZURFlockNkR0F2dit2ekdyMkgvZW1pRGdsK1BTUzBoZ0RBNG5xVXM0RCthWmNSdkRsODZ6S3BJaXppWW9TRkVMMnJpblU1UlJSekhWM2hXUThKWlpjcGlUVHhEa0s5ZHdWNlZsTHErRFR0cWdzNWtVVThDYXdtaW1hNGt4RVU4UkpLQzRURERKQmxRNmhOb2JwOUxQdlNBcnpvdVpqc21HTVR5cXRlRnFoTkhLb0xXWTd3UitCVUw4dk9Cbm9IUS9SMkhuRGkycjRadEo2ZDhkMFFPcGsrT29VUldrRXJuL0F1VTdqS1RYNng2VVM1bXNTQ29ELzRZUTdsQXl6T2tocmU4S3pJaFZ4RUFYK0c2SVZsQStqdGpBZGVROXlIWldjTFg3NVVuVUpmbmNJb25jSktDdmtRZUJnb0F3NUNhTllxQnJvcFQrYnpISEN6SDFwM3JjeVRVdDZtZ085SU5TOTdVdG9YSEVPMFk3MkdFZkp4cTJmaXRKd0JLT2NpakVMNUVkQy9sNGRySDdxNEJWek9IaWt6RUg0RTdzeVVFZW1aNHpVSytiNU1aNlBIYWd4WklLTVdRaWV4djhZWXF6SGFVRDRrTWNBYnc1NW5oVVpxQlQ5MlU1Zk01MU1rOUx2UEhxZUEwNDBab290clEraGtCbW9aVjJ1TU5ncDVuOFJxNkVqY3hza0lTN1hTM1NxcU5ISS95cTljMWVNVmUyNHQxbExDZVZMTnY3T2d4dUFUN2k1dUwrY2lMTjVCV0U3Q0JKbnNvRHVBT00ydWN5bVRJT0NIYm1kektQZnlaUzZTQ3U5dXNqRUVnOXNydGZyaDVaeU1jTGxPNVlldXNzeG5JOG9zenpSa2lzVVN1cmhTSm9ZanpOdVFHY0ZQM1FrM2F6WDd1c3JUbHlYQUgvMFJsRElLMU1zTXlzUW1IckFXZzBjRWJ3ZzRoRTZhM0dRUW16Z1dFeUd3LzVXN1VLNlJXdXlBNmpmNFJCZ01BVEJCcC9FOU54bGtIcThBUzN6U3N6dmFFUzZUT2xZRVVMZkJaOEppQ0NIT2NyVmRCdkgxb1JaNDJ4OUpQYklaWVpUTVpFMFc2elJra2JBWUFvVEQyY3hjVjFsc3RqZ2h3OW5nWXl4R1NDMi95MUo5aGdBSWp5RVNUTmJwbk80bWc4empRZUFYUHVsSjhnN0NxVEl6OElHOHdXZkNaZ2lMT0xlcjdYS1RTeWVUZ1gvNUk0bjFGSEM2MUxMQnAvSU5JU0pzaGdBWXdtWnEzV1J3RGtTYjZZT1c1eWppVEpuSjM5TXRRQnM0eWt0QkJuOEpveUVBcXJTYUUxemxLT1lXNENrUE5UekdYcHd0TmZ3ajNRTDBScVlqVkhxb3llQXpZVFZFSVhIdTBLdFREdzBSbXpnRlhJTTNheE8vQWk2UTZYeWFiZ0hhd0d6bjFBaERoQWlySVFDT1lRQlZiakxJSEY1RjBvaVAycEc3Z1V2RVpsczZtVlVSYmFBRmNkZnRNNFNETUJzQ29GYW51enlEZEFzMjhEOXAxU1kwaWMwNHNlbE1KN3V1cG9CNTNBN0UwcXJmRURoaE4wUWY0QTY5SlBXalNhU1pyVTVFYk9vSWlsSXBOdFZ1QlNiUjFSVHdaKzRDeHFkYmhpRjR3bTRJVUU3aTYweDJrMFhtOFJEQ3oxUDhlQmN3UVdaemszdHhDZFNtbUQrekJtRk11bVVZd2tINERRRWdOR2cxUjdyS0U2Y2MyTFNIVDMxT1lyeHdaN3JTMUthRVF0cUFINlZiaGlFOFJNTVFVSUp5bTVzamJHUWVIOEp1dTBEL3dtS0V6T2IrZEVYcEF2bzVabkFWbUdnSUwxRXhCTUIzcWVhbnJuSTBjQnZ3WkEvdkpJNklzWHQ4THlYVVpnRGJXQWVjblc0Wmh2QVJKVU9Bc2tCbjhOVlVQeTZKVFR3VFNIU05raVNPaUxGNUtXMFpOZ2RTd0g4REo2ZGJoaUdjUk1zUXNEZGQzT29tZzh4bEE3RFErZXZyeFBtTzJMeVZyZ0MxT1pnQ0hpR0NwMnNiOWt6VURBRndnVlp6aGFzY2hjeEZ1WnNDVHBlR0ZPNmQ2QVdkeTJGWVBBRW1QaWxYQ2ZVcGFydWhWV3RZNXd5Yzk0aXo2and1a3dyVlpqQngxa0hxWFRaRDlJaGlDd0d3UDhyaWJGV21jeGlHeFdNWU0rUThVVFVFS0tWNkF4ZjVYbzNOOGNSNUhEalU3N29Nd1JOZFF5UllwamI3K1ZXNHp1WkVoSWVCQS95cXd4QXVvbTZJZzltV2ZzakY3dERabklueUNQaG5PRVA0aUxvaFFMaEtxem5QeXlLMW52T0o4eUJadmdIVEVEelJOd1NBc0Z5cnZIbDQxZVlIS1BjRGZiMG96eEF0Y3NNUThEVUt1VEhUUXJTT3k0QmZrZ2c3TitRaHVXSUlnR3QxQm1la20xbHRya2E0bCtpdXpSZzhJSmNNWWFIY3BsUGNkM1cwamtuQXJlVFc5MkZJZzF4N0FBWlQ0dTRBWXExak9zSlNOQVEzV2hzQ0o5Y01BY3BVcmVYRWxENDZpM293SjJQa01HK2cvTkpOQm5lRzZPSnhKUFJubXhZUTV3NjFlNy9pUzBGMEZxMG9kZGtVWnNnYW00QnFDamxPUnJzN2Z0VFZBRktXOFRmZyt6cUZFY1JwQVpjblltU1A0YlJ6QTFDLzh4dHFZOUhKQ3BTZkJLREw0Qzl4NEQ2S21DcWw2UjB3bDFhWFNacFp4MWFPUXlrbjZQdmVla09vMFZxR2QzOUpMNkdBVHU1RWpCbHlEdUZSTEk2VEt4aWJyaGtnZ3pHRXJLQkRGdE5LSjBjQWkwbWNYaEVtaW9semo5cUpWbEJ0aWhuS2FvUXJneFptOEpTM0VFcmxDczZSeTNrbDA4SXlIbFRMTWo2U1ZtSUl3NEdITWkzUFk0NmpnM0tkVEI4NldRUCtSOGNhc3NabW9KNU9oc3NWM2wxZzQ5a2lsTFN3SGpoUFkxeUNNQjg0M0t1eU0wS1l6VDVjQkp3U3RCU0RKeWh3TDUxVXlUZys4THB3ejZkZHBaVTFER0FJUWpud2lkZmxwMEZmakJseWhXZFJUcE94alBYRERPRFRPb1RZdEVzenJSUXhERmdCNXRwYVEwYThoM0lsWXpoSnJ1UnBQeXZ5ZFdGTzVyTlJtcGtJbkFUOHdjKzZERG5KVnFDSnZneVZxMWdwZ3ZwZFlWWUMyYVNaNXhTK1F3VVhBd3VBdzdKUnJ5SFNyRVdaTEZmeDEyeFdtclhRRFFHVlJhemhNNzZKVUUvQy9RYkR6cnlBY29aY3hTZ1psMTB6UUFDeFRMS0NMYklRbXdJR0E2dkEvMmJRRUFrK0FzcnB4N2RsSEU4RUpTS3c0RDZaejd0eUUyT0JVeEJ6M1cwZTB3RXNwcDBqWkJ5dFVocnNBbS9nMGE2eWtHZm94Mm5PQ25KS0I0OFpjb1oxd0xFeW5waE1ERWNJVU9DR2dNU0ZpYktBbFNoSE9PT0x6L2VZeVJCbE5tQnhvWXpuWEJuUEcwR0w2VTRvREpGRUZySlo1bU5Ud0ZHSWQ4dnhodER3TWNway9zNVJNbzdmQkMybUowSzVmMWdhZVFzbzFXck9kc0xNaCs4cGp5SDh5SVRNRDRMd20xQzFFRHNqalR4S0NjY2pUSVQwUTNvTmhsUUp0U0VBeEtaVEdsbUJNQVNsQ1dnUFdwTWhkd205SVpKSUk1dGtQdFhFT1JyQzJmODBSSi9JR0NLSnpHZUROSEloY0M2RWE0YkNFSDBpWjRnazBzZzZQdUpZSjh3OEZIUFlodWdUV1VPQXM0MTFIcTNBRWM0RkttSGJ4bXFJR0pFMlJCSzVrWS9rUm1MRU9SRjRQR2c5aHVpU0U0WklJbzI4S1BNNEUvZ0I4SGJRZWd6Ukk2Y01rVVFhYUdNTDMwS3BCajROV284aE91U2tJUUNrbWEweWp5WUtHWXFhYmF5RzFNaFpReVFSbTQzU3dFU1VreENlQ2xwUHhQZ3Y0dHN2dmM4TGN0NFFTYVNCNTVqTjZRaWx3RHRCNndrNWJ3TG55eVQrVXlibjExZ3Nid3dCempiVzJheWhnR0Vrem4zZEZyU21rUEV4U2puL1pMaE00cmRCaXdtQ3ZESkVFckhaSXJPeHNSZ0VyQ0lMcHptRW5FNWdCVVVNa2NtMGlrMW4wSUtDSWk4TmtVUnMzcFhaaktXTHM0Q1hndFlUQ01vanhEbE9Kak5SSnZMUG9PVUVUVjRiSW9uTTRmY0lKK1RaTnRhL0lKUktHU01reG10Qml3a0x4aEFPWWhNWG01WEFrWkRUMjFnL1E2a0hoc3Rrc3l0eFo0d2hka0pzUGhNYm13S0dRMDQ5TUhGZ0ZjcVJFc09Xc3B3MWZFYUVjZ3RwR0pCYS9nS1VhajNuQU0xRWV4dnJNeWd4S2VlWm9JV0VIZE5DN0FHWnhTTW94ME1rdDdHK0MxeEpqRk9NR1ZMREdDSUZ4S1pUNmxoQm5LRWtia3NLKzdUa0ZxQ2VPSU9sUER1SEJPY0t4aEF1RUp1UHBZNFlCUXhIZVRCb1BUMmd3QnE2K0taTXdaWUtjMzZ1Vzh3WUlnMmtoamVCQzNRT0kwaTBHTU1DbGdUQzgwQk1wcGhyQnpMQnRCQVpJTFdzNDhzY0UvQnRyTzhqVE9UZmZOdVlJWE9NSVRKRUp0SWh0YlJpY1FTUzFXMnM3Y0JpaWhncVUxZ2h0Z2x2OXdKakNJK1FHajZTR21MQXQ4SDM0OXpYWWpGTXBoS1RzbERjNDVjem1ER0V4OGdNWGdETzBMbU13cUxWNCtMZlJEaGJwdktZeCtVYURQNmpOaVhheUJsQjZ6Q2t6djhEUWQ3UXJNYkxSMUFBQUFBQVNVVk9SSzVDWUlJPSI+CjxsaW5rIHJlbD0iYXBwbGUtdG91Y2gtaWNvbiIgaHJlZj0iZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFNUUFBQURFQ0FZQUFBREFwbzVyQUFBQUJITkNTVlFJQ0FnSWZBaGtpQUFBQUFsd1NGbHpBQUJhYmdBQVdtNEJ4V3NqT0FBQUFCbDBSVmgwVTI5bWRIZGhjbVVBZDNkM0xtbHVhM05qWVhCbExtOXlaNXZ1UEJvQUFCbDBTVVJCVkhpYzdaMTVlRlRWM2NjL3Y1c0ZDVlJ4cVZ0cHRWVzJWbHhmNjFxdGlxMEw5R2w5TlhVQkZFcEZSVEloaEJBRENUZEFNQUVrQ1lzSzdxQjkra0Q3MnFmQldpdnFXN1ZhNjc0aXJlOXJheFgxYlpWV1pUSEwvTjQvNWc0R1NHRHV6TDF6NzUwNW4zODR6TXc1NTh2TS9YSzIzemtIRElHaml6aFBGM0ZlMERvTUlFRUx5R2QwUG9Pd2FBQXVjVjVhaDBXNVZQQjZrTHJ5R1dPSUFGQ2IvdlNqRXFnRyt1endLd2dkd0MxMFVDZlYvRHNZaGZtTE1VUVdVUnVMRWtZRDh4RU8ydjdHam9ad1BzeEhXTXhoSUV1bGxLNXM2c3huakNHeWhDN2dKSlJXNENTZ1p4UDBuSDRKaTVpVTg3amZHZzNHRUw2alRRd0U1Z0dqa1c3ZmQrcUdTTEtXSXNwa01tLzdJTlBnWUF6aEUycFRRaCtxc0tnQytnTHVUYkJyZWl1d21IWWFaRHFmZWlyWUFCaERlSTRxUWlNWEF3c1FEdlBBQkQybE55TFVzNG5ieFNhZXVXcERFbU1JRDlFYk9RRm9SVGh0KzR2K0dDTDU1N05BdWNSNEtpM0JobDB3aHZBQWJlQVFMR3hnQW1ENWFvTHU2Y1NmaXZBTGxFcUo4WTVMNllhZE1JYklBTFVwcG9ockVXWWo3TDM5amV3YUlwbmVqTEtRdldtVWNXeEw2UjlnMkFWamlEVFJ1WXpDb2dYNEJwQTlFM1JQOS96KzM0R1pVc2JLWHFRYmRvTXhoRXUwZ2FNUm1sSE85dkFCLzZPVE90a0RReVRTeWlNbzVSTGp0WjcrSFlhZXNZSVdFQlhVWmorZFN5dndQTXJaSGhXN0VXRWluM0VhVXprVm9SVDRteWNsQytkZzhiSXVaYVhld29HZWxKa0htQlppRDZoTklVV01SMmtBRHZDb1ZkaUtzSmo0cnVzSnVwd1NQcU1LcUVLYzlZdmV5a205emsxQUV3ZlNMS1cwWStnVlk0amRvUFdjZzBVTHdsSGJYOHpjRUdzUnltVGE3bGVjdFltQkZEa3IzT3l3eHAyT0laTHBEUWhUNVRvZTJGM2QrWXd4UkEvb0hBWkJ0N0JzYjFxRkZ5bWdYQ3JkeFNUcElzNEVXaENPM2FYTTlMV3NvNENZWE1NYmJyVGtBOFlRM1ZDYi9naVZ5RTVoMlprWjRpT0VPUnllZnRTcTJsZ01ZRFRLZk9BZ2ozUjFvTnhDSVhVeTBZU1pKekdHd0huZ0xPZUI2eWtzTzcwSEwvSEFpWGY3R25RWi9XbnZ3YkRwYXdTY01QUDlUSmc1R0VPZ3MxTUl5M2Ivc0swalRreHEvT21TYUN1RFVCcVE3VHZ0dk9qV3ZZaFFMdGZrZDVoNTNocENiUmRoMmFrL1ZCdFFLcVNHMzNncXRoZTBsWE9BRnVBb0Q5ZEUxbEpBbWZ3MFA4UE04ODRRYWxNQ3pyUm1xbUhaZTM2UU5pRTA4VG5OWW1kM1dsTnRDdG1YOFlnekxkeTdSamZwUkpoNUVRM3lrL3dLTTg4YlF5Z0lkVnlNeFFMVVpWaDI3Kzkzb3R5Sk1GTnErSWZYbXQyZ2k5aVBRbVlCMXlFVWJuOGpNM084aDFMRFJGYUpvSjRLRGlsNVlRaXQ1UVFrZzdEc25sOTdGSXR5cWVaVlQ4Vm1pQzVoS0VvejRoeHI0MDFYNmxtVW1GekQweDVLRFNVNWJRaXQ0UkNLc05FTXc3SjNmTzB0bEJxWnlScVA1WHFLTG1ZVVFndmlCQjlDcHVaUTRGNDZxSkpKZk9DcDJCQ1JrNFpRbTJJNlBRekxUdnlaQ0svZWh4dWxqTTg5bHV3TGFsUE0vczczQUh0NzFGcHNSbGhJWVc2R21lZWNJWFNHNTJIWmNZVDdFS2JKREQ3MFZtMTIwT1VjUWdjMjRyU1U0TVgzOGhaQ2pVd0lkMHZwbHB3eGhON0FVQXBvQnM3emNBcnlHWlNZMVBHTWgxSURRMjkydHJncXAzbjJIVms4U3B3cDhsTmU4VkJxWUVUZUVHcXpIeDNNUXJnT25ObVZ6SC9zZDRFWjFPYmU3SW9xd2kzT0lRaHdHT0RGOTlXSk9MTnQ0NE9kYmN1VXlCcENiUXJwWUR4NEdwYTlCVmpBbDJpU0NyWjZLRGQwNkhKSzZLUUtTU0hNUE5XMHhTYmlOTEYzZE1QTUkya0lyWEZXYUwwTHkxYmdGeFF3VFdaNnRFRW5JdWppRk1MTTNhWVRZZVlWTWk0N0svWmVFaWxENkV3R0VmYzhMUHM1TE1xbGpqOTRwelI2Nk0yYzZVeEc3QnBtN2piOXhXdnJLS1JNeHJMZU82WCtFZ2xEcU8xRWVTclZDSDIydjVHWklUWUM5V0FPKzBxaU5oWUhPNGN4ZHc4emgweldiUkpSdngzUkNETVB0U0hVeG1Jcm83R2NId2k4YUJYYWdWc3BZYVk1RHJKbmRCbjlzYWpFY3NMTUlSTkRKRW1FbWZjTmQ1aDVhQTJoTjNRTHkvWnVHblV0UWt4cy90ZERxVG1MM3NvZ3hPbWlabTZJWlBvRmxISVp4eE5lYXZXSzBCbENxeGlJMVcyUUIxNjBDaStobE1zY2Z1K3AyRHhCVnpEQ2lZOUtUR0prWm9oa2VpMXhKc3M0L3VxbDFrd0pqU0hVcG9RdHpqUWc5UFdvVlVoczMxelBVbGtUM21ZNkNxaE5JVjl4VGg4Uko4d2NNakVFSkthNWw5Q1h1VkxLWjk0cVRvL0FEYUVnVE9OaXhGa29jditsOXBST1hFdlZUcDAwaFg4Z0Z5WDBkdlpEbVFWTUFnb3lORVF5L1I1Q0RhT0RYd2dOMUJBNmxST3dlZ25MVHQ4UTZ4REtaWTY1dU5CUDlEYUdBWXVRYnJlblp2N2IvUW1MbUl6ZWZwSmgxZ25FRUZydWhHWHY3clJzOTEvcUJ1Sk1sWG5tektGc29yY3pDcHhnU205YWQwV2NNUE54MlE4eno2b2huTzdSTkpSYWhQNDlxbkQvcFg0TTFGUEV6V0xUNmExaVF5cm9YZXhGbkFyZ0JxQy9SK08vVDdDWVF4R0xzeGtHa3ZVV1FpczR6amtONzR3ZVZhUnVpRVJZZGhHVll2Ti9mbWcxdUVPWGN3aUZQb1daWDVHZE1QUEF4aEJheVNpRVZ1RHJyZzJoUElvd1JlYmxSc2h4cnFGM2N3SmR6dGpRdXpXa1IxSEtaYlMvVzNhREhWVGJGTE9aYXhIbUFGL2FRVkhQWDh4YldOUklRMjV0U3NsRlZCSHU5aUhNSE82a2lKbFM2aytZZWVEVHJnQmF4YUhBTEdBQzBtTlRtOWkyV0V5ajJMbTNiVEdYMGVXVVVKemlhZWFwcHplaDFITW95K1FzYjhlTm9UQkVFcTNpUDV4dTFLbU9zc1RHOWk2cVpFSHVibXpQQi9RMkJsTE1QTlRETUhONEU0c0t1WlFIdmRJWktrT0FNeE0xblRFSUYyTmh5enhlQ0ZxVHdUdjBMcjdyaEprZnMvM0Z6TTF4UDNFcTVZck1ZOVJDWndoRDdxTTJGb2M3WWVhU1FaajVqdWtPTEc2aGcxb1p6U2ZwYWpPR01BU0dycVkvVzd1ZFpnNlp0eGJDK3lnMkZuZWtFMlp1REdFSUhMMlBRWFNsRVdhK3V6UThqMFc1bFBLa0d5M0dFSWJRb1Bkd1BzSWloS0ZBcG9hQXhLWDJFK1RIM0ptcUJ0ZTNrR281RTdTY0g3ck5aekRzQ2JtU0I5bkswY0JFNEo5ZUZBa2M2aWFEKzJ0NWxTTlI3dGNZNi9SNng4a0dnMGZJUkRwa0RDdm93eEJnTVdSM0gwczZoaWh5VXVkUXdDc2FvMVd2Nnhhb1p6QjRnSlR5c1l3bVJwemh3Ryt6VmE5N1ExamJEUUZRQkpSUnhIcU5NZFl6VlFhRGc0eGx2WXptZklRZmdQOTc0VE5wSWJvekVMaEh5M2pZZEtNTWZpQ1gwMFlSdzRCeVNIK2RZVSs0TndROUdpS0JNSUlDWHRZcE5Lck5YdW5MTWhoMlJVcHBseXRvUlJnRy9weWw1YTBoRWhTalRPZGZ2SzR4UnFZanltRFlIWElaRzhHZnZkZCtHQ0xKTnhEYWRBcHRXc25YMDZqSFlNZzZYbzBoZHNkSXVuaGRLN0JOTjhvUWRqS2RaVXFWdmlpeitJVFh0SklMMDhodk1HU0ZiTFFRM1RtQ09HdTFnall0NS9BTXlqRVlmTUhQTWNUdUdFa0JiMmlsNlVZWndrVlFob0JrTitwVFh0VnBYT0JSbVFaRFJnUnBpQ1JIb2p5Z1UyblRhdE9OTWdSTHRzY1F2U09NcEpQWHRRcGJKM2U3Rk1WZ3lDTHVEU0UrR1NKQkNjb3MrdkNhVHV0MlpxakJrQ1hDMEdYYUZlRkk0RUd0b2sybk9tZjZHQXhaSUp5RytJTEViSlRwUmhteVJOZ05BVkFDektLRVYzVTYzODl5M1lZOEl3cUdTRElJK0sxVzA2YlQrVnBBR2d3NVRwUU1rVUFaaWJCZXE3SFZwamhRTFlhY0kzcUdTSkRvUm0zalZhM21lMEdMTWVRT1VUVkVrc0VJRCtrTnRPa012aHEwR0VQMGlib2hrb3drem5xdE1kMG9RMmJraWlFQStnR3phT2NWcmVIY29NVVlvb2tyUTJqaTRLZENuN1I0eFJEZ2R6ckRkS01NN25IWFFsd2Rlak4wWnlTd1htZWFibFJlRTNkM0dJSGJMbE5ZdTB1OTBROWxGbDI4ckRNWkViUVlRMWJaakZMUE5oYTV5ZVRPRVB0R3poQUpsS0hBNzNRbUs3V0dnNEtXWS9BVkJWYlJ3U0M1REZ2R3VidUN6WjBoT2lOcWlBUUNqS0dBRFRxVG1OcVI2djRaVWtINUV4YW55YVdNbFRHOG4wNFI3Z3pSRldsREpOa0hvWVV1bnROYVRndGFqTUVUM2tXNGtrczVXVXA1T3BPQzNCbkNyODFCd1hBTXdoTmFaN3BSa1VYWkF0UlR3R0M1bEpVaW1SOWU1czRROFp3eUJDUzdVWVc4cVhYRTlCSUtnaFprU0JGaEZVVU1sc3V3cFpTdDNoWHJBcjJlb1JTdzNsV3AwVXEvaERCSmJKN0NrSmU0YXlHS2NxNkYySmxqZ1NmVlpxWGFIQmkwR0VQMnllY3hSTStvMDQyQ0RWcFBURmViYmxRK1lRelJPd05RV2xqUHN6cWJVNElXWThnT3ViNVM3UVhIb2Z4QjYxbXA4L2h5MEdJTS9tSmFpTlJJZEtNNjJhQnpURGNxbDNGbkNNbjdJTGw5VVZyWXdKOTBMaWNITGNiZ1BhYkxsQTdLOFNoUDZSelRqY28xVEpjcGZSTGRxQzdUamNvbFRBdVJPZnNpdFBBWG50SFpuQlMwR0VObXVETkVlcmNINVFmS0NWZzhwWE5acVRZSEJDM0hrQjZtaGZBV0MyRU1SV3pRQm1KcXA3Vm5QVlJvTXdPQzFwQUp1cHFEM1h6ZTdRKzI1ejBFcnFLamNwYjlnQmFLZVZJYk9TWm9NZW1nU3poVWw3S2NZdVlFclNVZGRCVkQ5R2M4UUFkVDNlUnpPNmgyTisxcXpIRUtTbG5RSXR5Z05zVzZoQmdXYnlKY1RYb25zd1NHM3NlK2VoK05XTHdDN20rbWNyZHJUQ2xLK3lIZk1kOW00REdnalM2ZW9JakgwQnpka3hDblBXZ0pxYUxMR0lYU0N0RzdWMXh0TEk1Z05MQUEwZy9NZEx1Tk1wTXh4TnNvRHdOcjJZZUh4UDdpUWRGS0tvRDdNaWc3dkFnZFFVdllFN3FNWTRuVGduSm0wRnJTUWUvakxPSzBJQnlkYVZudURHRlI1R0pQVWhlSi9RVnJFZHJrSnA3djdZT3lrSjlwSlpkRER0NWhMZUZ0SVhRcCt3TjF4SmtFMFZ0SDBaVjhEWXU1S0dPODZwNjc3ekx0bnMySTB4VXE1TmV5Z0E5Y0tMbWVMcjVMNGdTKzNFSEQxMExvY29wbzV6cmkxQ1BzRTdRZXQraEsraUZNQTZhajdPWGxXTldMTHRQYkNBOGp1M2FGM0NDTi9GV3JhRUNabDNnaG5WSkNTTWdNb1lzWndlZTBBTjhLV290YlZCSHVaUXhLRTdpYlRrMlZkQXp4UlZjb1Rwc3M3cjByNUpvU0ZyQ1pVaEk3MTNJREt4eUcwS1VNcG90RktCZEc4VDhidllzVFdVVXIrTHMzeFowaHVyaWJJdVpMTXgvN0lVWnNPcldTNnhDZXBQdDBYMi83b0tOQm9HTUliV1lBUWpWZFRJSG9SU3ZyUFh3RnVCRVlUUlorZlZlR2tLVzg2WmVRN1hVczVHbWR4bkxnV3Ivcnlnb0JkWm5VeG1KQTV0T1FRYUdyNmN0V3lvQVp3SmV5Vlc4NEYxMjJVWTN3M2g0L0Y0WFdJb0JaSnIySnM5aUhGNEI3aUtJWjdtSVVXM2dEcFpFc21nRkNhZ2had2lkQWhidE0vbWpKbUN5MkVIb1RYOVZtVm1MeEtFUXZaRVR2NUhpOWk4Y1JmZzBjSG9TRzBKNXZLazJzMW1tTVJoamxQck1QZ3RJbEM0YlFCZlREWWhyQ2RHQXZ2K3Z6R3IySC9lbWlEZ2wrUFNTMGhnREE0bnFVczREK2FaY1J2RGw4NnpLcElpemlZb1NGRUwycmluVTVSUlJ6SFYzaFdROEpaWmNwaVRUeERrSzlkd1Y2VmxMcStEVHRxZ3M1a1VVOENhd21pbWE0a3hFVThSSktDNFREREpCbFE2aE5vYnA5TFB2U0Fyem91WmpzbUdNVHlxdGVGcWhOSEtvTFdZN3dSK0JVTDh2T0Jub0hRL1IySG5EaTJyNFp0SjZkOGQwUU9waytPb1VSV2tFcm4vQXVVN2pLVFg2eDZVUzVtc1NDb0QvNFlRN2xBeXpPa2hyZThLekloVnhFQVgrRzZJVmxBK2p0akFkZVE5eUhaV2NMWDc1VW5VSmZuY0lvbmNKS0N2a1FlQmdvQXc1Q2FOWXFCcm9wVCtiekhIQ3pIMXAzcmN5VFV0Nm1nTzlJTlM5N1V0b1hIRU8wWTcyR0VmSnhxMmZpdEp3QktPY2lqRUw1RWRDL2w0ZHJIN3E0QlZ6T0hpa3pFSDRFN3N5VUVlbVo0elVLK2I1TVo2UEhhZ3haSUtNV1FpZXh2OFlZcXpIYVVENGtNY0FidzU1bmhVWnFCVDkyVTVmTTUxTWs5THZQSHFlQTA0MFpvb3RyUStoa0Jtb1pWMnVNTmdwNW44UnE2RWpjeHNrSVM3WFMzU3FxTkhJL3lxOWMxZU1WZTI0dDFsTENlVkxOdjdPZ3h1QVQ3aTV1TCtjaUxONUJXRTdDQkpuc29EdUFPTTJ1Y3ltVElPQ0hibWR6S1BmeVpTNlNDdTl1c2pFRWc5c3J0ZnJoNVp5TWNMbE81WWV1c3N4bkk4b3N6elJraXNVU3VyaFNKb1lqek51UUdjRlAzUWszYXpYN3VzclRseVhBSC8wUmxESUsxTXNNeXNRbUhyQVdnMGNFYndnNGhFNmEzR1FRbXpnV0V5R3cvNVc3VUs2Uld1eUE2amY0UkJnTUFUQkJwL0U5Tnhsa0hxOEFTM3pTc3p2YUVTNlRPbFlFVUxmQlo4SmlDQ0hPY3JWZEJ2SDFvUlo0Mng5SlBiSVpZWlRNWkUwVzZ6UmtrYkFZQW9URDJjeGNWMWxzdGpnaHc5bmdZeXhHU0MyL3kxSjloZ0FJanlFU1ROYnBuTzRtZzh6alFlQVhQdWxKOGc3Q3FUSXo4SUc4d1dmQ1pnaUxPTGVyN1hLVFN5ZVRnWC81STRuMUZIQzYxTExCcC9JTklTSnNoZ0FZd21acTNXUndEa1NiNllPVzV5amlUSm5KMzlNdFFCczR5a3RCQm44Sm95RUFxclNhRTF6bEtPWVc0Q2tQTlR6R1hwd3ROZndqM1FMMFJxWWpWSHFveWVBellUVkVJWEh1MEt0VER3MFJtemdGWElNM2F4Ty9BaTZRNlh5YWJnSGF3R3puMUFoRGhBaXJJUUNPWVFCVmJqTElIRjVGMG9pUDJwRzdnVXZFWmxzNm1WVVJiYUFGY2RmdE00U0RNQnNDb0ZhbnV6eURkQXMyOEQ5cDFTWTBpYzA0c2VsTUo3dXVwb0I1M0E3RTBxcmZFRGhoTjBRZjRBNjlKUFdqU2FTWnJVNUViT29JaWxJcE50VnVCU2JSMVJUd1orNEN4cWRiaGlGNHdtNElVRTdpNjB4MmswWG04UkRDejFQOGVCY3dRV1p6azN0eENkU21tRCt6Qm1GTXVtVVl3a0g0RFFFZ05HZzFSN3JLRTZjYzJMU0hUMzFPWXJ4d1o3clMxS2FFUXRxQUg2VmJoaUU4Uk1NUVVJSnltNXNqYkdRZUg4SnV1MEQvd21LRXpPYitkRVhwQXZvNVpuQVZtR2dJTDFFeEJNQjNxZWFucm5JMGNCdndaQS92Skk2SXNYdDhMeVhVWmdEYldBZWNuVzRaaHZBUkpVT0Fza0JuOE5WVVB5NkpUVHdUU0hTTmtpU09pTEY1S1cwWk5nZFN3SDhESjZkYmhpR2NSTXNRc0RkZDNPb21nOHhsQTdEUStldnJ4UG1PMkx5VnJnQzFPWmdDSGlHQ3Ayc2I5a3pVREFGd2dWWnpoYXNjaGN4RnVac0NUcGVHRk82ZDZBV2R5MkZZUEFFbVBpbFhDZlVwYXJ1aFZXdFk1d3ljOTRpejZqd3Vrd3JWWmpCeDFrSHFYVFpEOUloaUN3R3dQOHJpYkZXbWN4aUd4V01ZTStROFVUVUVLS1Y2QXhmNVhvM044Y1I1SERqVTc3b013Uk5kUXlSWXBqYjcrVlc0enVaRWhJZUJBL3lxd3hBdW9tNklnOW1XZnNqRjd0RFpuSW55Q1Bobk9FUDRpTG9oUUxoS3F6blB5eUsxbnZPSjh5Qlp2Z0hURUR6Uk53U0FzRnlydkhsNDFlWUhLUGNEZmIwb3p4QXRjc01ROERVS3VUSFRRclNPeTRCZmtnZzdOK1FodVdJSWdHdDFCbWVrbTFsdHJrYTRsK2l1elJnOElKY01ZYUhjcGxQY2QzVzBqa25BcmVUVzkyRklnMXg3QUFaVDR1NEFZcTFqT3NKU05BUTNXaHNDSjljTUFjcFVyZVhFbEQ0Nmkzb3dKMlBrTUcrZy9OSk5CbmVHNk9KeEpQUm5teFlRNXc2MWU3L2lTMEYwRnEwb2Rka1Vac2dhbTRCcUNqbE9ScnM3ZnRUVkFGS1c4VGZnK3pxRkVjUnBBWmNuWW1TUDRiUnpBMUMvOHh0cVk5SEpDcFNmQktETDRDOXg0RDZLbUNxbDZSMHdsMWFYU1pwWngxYU9ReWtuNlB2ZWVrT28wVnFHZDM5Skw2R0FUdTVFakJseUR1RlJMSTZUS3hpYnJoa2dnekdFcktCREZ0TktKMGNBaTBtY1hoRW1pb2x6ajlxSlZsQnRpaG5LYW9Rcmd4Wm04SlMzRUVybENzNlJ5M2tsMDhJeUhsVExNajZTVm1JSXc0R0hNaTNQWTQ2amczS2RUQjg2V1FQK1I4Y2Fzc1ptb0o1T2hzc1YzbDFnNDlraWxMU3dIamhQWTF5Q01CODQzS3V5TTBLWXpUNWNCSndTdEJTREp5aHdMNTFVeVRnKzhMcHd6NmRkcFpVMURHQUlRam53aWRmbHAwRmZqQmx5aFdkUlRwT3hqUFhERE9EVE9vVFl0RXN6clJReERGZ0I1dHBhUTBhOGgzSWxZemhKcnVScFB5dnlkV0ZPNXJOUm1wa0luQVQ4d2MrNkREbkpWcUNKdmd5VnExZ3BndnBkWVZZQzJhU1o1eFMrUXdVWEF3dUF3N0pScnlIU3JFV1pMRmZ4MTJ4V21yWFFEUUdWUmF6aE03NkpVRS9DL1FiRHpyeUFjb1pjeFNnWmwxMHpRQUN4VExLQ0xiSVFtd0lHQTZ2QS8yYlFFQWsrQXNycHg3ZGxIRThFSlNLdzRENlp6N3R5RTJPQlV4QnozVzBlMHdFc3BwMGpaQnl0VWhyc0FtL2cwYTZ5a0dmb3gybk9DbkpLQjQ4WmNvWjF3TEV5bnBoTURFY0lVT0NHZ01TRmliS0FsU2hIT09PTHovZVl5UkJsTm1CeG9Zem5YQm5QRzBHTDZVNG9ESkZFRnJKWjVtTlR3RkdJZDh2eGh0RHdNY3BrL3M1Uk1vN2ZCQzJtSjBLNWYxZ2FlUXNvMVdyT2RzTE1oKzhwanlIOHlJVE1ENEx3bTFDMUVEc2pqVHhLQ2NjalRJVDBRM29OaGxRSnRTRUF4S1pUR2xtQk1BU2xDV2dQV3BNaGR3bTlJWkpJSTV0a1B0WEVPUnJDMmY4MFJKL0lHQ0tKekdlRE5ISWhjQzZFYTRiQ0VIMGlaNGdrMHNnNlB1SllKOHc4RkhQWWh1Z1RXVU9BczQxMUhxM0FFYzRGS21IYnhtcUlHSkUyUkJLNWtZL2tSbUxFT1JGNFBHZzlodWlTRTRaSUlvMjhLUE00RS9nQjhIYlFlZ3pSSTZjTWtVUWFhR01MMzBLcEJqNE5XbzhoT3VTa0lRQ2ttYTB5anlZS0dZcWFiYXlHMU1oWlF5UVJtNDNTd0VTVWt4Q2VDbHBQeFBndjR0c3Z2YzhMY3Q0UVNhU0I1NWpONlFpbHdEdEI2d2s1YndMbnl5VCtVeWJuMTFnc2J3d0J6amJXMmF5aGdHRWt6bjNkRnJTbWtQRXhTam4vWkxoTTRyZEJpd21DdkRKRUVySFpJck94c1JnRXJDSUxwem1FbkU1Z0JVVU1rY20waWsxbjBJS0NJaThOa1VSczNwWFpqS1dMczRDWGd0WVRDTW9qeERsT0pqTlJKdkxQb09VRVRWNGJJb25NNGZjSUorVFpOdGEvSUpSS0dTTWt4bXRCaXdrTHhoQU9ZaE1YbTVYQWtaRFQyMWcvUTZrSGhzdGtzeXR4WjR3aGRrSnNQaE1ibXdLR1EwNDlNSEZnRmNxUkVzT1dzcHcxZkVhRWNndHBHSkJhL2dLVWFqM25BTTFFZXh2ck15Z3hLZWVab0lXRUhkTkM3QUdaeFNNb3gwTWt0N0crQzF4SmpGT01HVkxER0NJRnhLWlQ2bGhCbktFa2Jrc0srN1RrRnFDZU9JT2xQRHVIQk9jS3hoQXVFSnVQcFk0WUJReEhlVEJvUFQyZ3dCcTYrS1pNd1pZS2MzNnVXOHdZSWcya2hqZUJDM1FPSTBpMEdNTUNsZ1RDODBCTXBwaHJCekxCdEJBWklMV3M0OHNjRS9CdHJPOGpUT1RmZk51WUlYT01JVEpFSnRJaHRiUmljUVNTMVcyczdjQmlpaGdxVTFnaHRnbHY5d0pqQ0krUUdqNlNHbUxBdDhIMzQ5elhZakZNcGhLVHNsRGM0NWN6bURHRXg4Z01YZ0RPMExtTXdxTFY0K0xmUkRoYnB2S1l4K1VhRFA2ak5pWGF5QmxCNnpDa3p2OERRZDdRck1iTFIxQUFBQUFBU1VWT1JLNUNZSUk9Ij4KCjxzdHlsZT4KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90bycpLCBsb2NhbCgnUm9ib3RvLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by91WUVDTUtvSGNPOXgxd2RtYnlISW0zLV9rZjZCeVlPNkNMWWRCNEhRRS1ZLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vc1RkYUE2ajBQc2I5MjBWanYtbXJ6SC1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL19WWUZ4LXM4MjRrWHFfVWwyQkhxWUgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL3RuajRTQjZETmJkYVFuc004Q0ZxQlgtX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL29NTWdmWk1RdGhPcnlRbzluMjJkY3V2dkRpbjFwSzhhS3RlTHBlWjVjMEEud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvJyksIGxvY2FsKCdSb2JvdG8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL0tzX2NWeGlDaXdVV1ZzRldGQTNCam4tX2tmNkJ5WU82Q0xZZEI0SFFFLVkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8nKSwgbG9jYWwoJ1JvYm90by1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vTko0dnhsZ1d3V2JFc3YxOGRBaHFubi1fa2Y2QnlZTzZDTFlkQjRIUUUtWS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9pc1otd2JDWE5LQWJuam82X1R3SFRvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by83N0ZYRmpSYkd6TjRhQ3JTRmhsaDNvWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9qU04yQ0dWRGJjVnlDbmZKZmpTZGZJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkJyksIGxvY2FsKCdSb2JvdG8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1VYNmk0SnhRRG0zZlZUYzFDUHV3cW9YMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vZC02SVlwbE9Gb2NDYWNLenh3WFNPSkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by85N3VhaHhpcVpSb25jQmFDRUkzYVc0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQnKSwgbG9jYWwoJ1JvYm90by1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vUHdaYy1ZYklMNDE0d0I5ckIxSUFQWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gQm9sZCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1Cb2xkSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdDZOZDRjZlBSaFpQNDRRNVFBamNDMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQ19acmFSMlRnOHcybHptN2tMTkwwLXcud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0N3dF9SbTY5MUxUZWJLZlkyWmtLU21JLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMzcwLTAzRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0MxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M0Z3A5UThnYllyaHFHbFJhdl9JWGZrLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBCb2xkIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUJvbGRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by90Nk5kNGNmUFJoWlA0NFE1UUFqY0M2RThrTTR4V1IxXzFiWVVSUm9qUkdjLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAwLTAyNEYsIFUrMUUwMC0xRUZGLCBVKzIwQTAtMjBBQiwgVSsyMEFELTIwQ0YsIFUrMkM2MC0yQzdGLCBVK0E3MjAtQTdGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEJvbGQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tQm9sZEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL3Q2TmQ0Y2ZQUmhaUDQ0UTVRQWpjQzlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09wWFVxVG8wVWdRUWhHal9TRmRMV0JrQXo0clluNDdaeTJydmlnV1FmNncud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9XeHJYSmEwQzNLZHRDN2xNYWZHNGRSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vY0RLaFJhWG5RVE9WYmFveHdkT3I5eGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vMWhaZjAyUE9BTmgzMmsyVmtnRW9VQmtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlBjeW5TTDBxSHFfNmRYN2xLVkJ5WFloamJTcHZjNDdlZTZ4Ul84MEhudy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vdlN6dWxmS1NLMExMampmZWF4Y1JFaGtBejRyWW40N1p5MnJ2aWdXUWY2dy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9LMjNjeFdWVHJJRkQ2REpzRVZpMDdSa0F6NHJZbjQ3WnkycnZpZ1dRZjZ3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vRmw0eTBRZE94eXlUSEVHTVhYOGtjWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8wZUM2ZmwwNmx1WEVZV3BCU0p2WENJWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL0kzUzF3c2dTZzlZQ3VyVjZQVWtUT1lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0JyksIGxvY2FsKCdSb2JvdG8tTGlnaHQnKSwgdXJsKC9mb250LXJvYm90by8tTDE0SmswNm02cFVIQi01bVhRUW5ZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCcpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0JyksIHVybCgvZm9udC1yb2JvdG8vSGdvMTNrLXRmU3BuMHFpMVNGZFVmWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL1BydTMzcWpTaHBaU21HM3o2Vll3bllYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQnKSwgbG9jYWwoJ1JvYm90by1MaWdodCcpLCB1cmwoL2ZvbnQtcm9ib3RvL05ZRFdCZEQ0Z0lxMjZHNVhZYkhzRklYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0MTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0X1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0d3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDMwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTGlnaHQgSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTGlnaHRJdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by83bThsN1RsRk8tUzNWa2hIdVIwYXQxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiAzMDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIExpZ2h0IEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLUxpZ2h0SXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vN204bDdUbEZPLVMzVmtoSHVSMGF0NkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogMzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBMaWdodCBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1MaWdodEl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvLzdtOGw3VGxGTy1TM1ZraEh1UjBhdDlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bScpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bScpLCB1cmwoL2ZvbnQtcm9ib3RvL29IaTMwa3dRV3ZwQ1dxQWh6SGNDU0lYMGhWZ3paUVVmUkR1WnJQdkgzRDgud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0MDAtMDQ1RiwgVSswNDkwLTA0OTEsIFUrMDRCMC0wNEIxLCBVKzIxMTY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9aTHFLZWVsWWJBVEc2MEVwWkJTRHk0WDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vbXg5VWNrNnVCNjNWSUtGWW5FTVhyWVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vckd2SGRKbnIybDc1cWIwWU5EOU55SVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMUYwMC0xRkZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vUnhaSmRuemVvM1I1elNleGdlOFVVWkJ3MXhVMXJLcHRKal8wamFuczkyMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtJyksIHVybCgvZm9udC1yb2JvdG8vb09lRndaTmxyVGVmekxZbWxWVjFVSVgwaFZnelpRVWZSRHVaclB2SDNEOC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0nKSwgbG9jYWwoJ1JvYm90by1NZWRpdW0nKSwgdXJsKC9mb250LXJvYm90by9tYm1ocHJNSDY5Wmk2ZUVQQllWRmhZWDBoVmd6WlFVZlJEdVpyUHZIM0Q4LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMTAyLTAxMDMsIFUrMUVBMC0xRUY5LCBVKzIwQUI7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwVjRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBmWnJhUjJUZzh3Mmx6bTdrTE5MMC13LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDYwLTA1MkYsIFUrMjBCNCwgVSsyREUwLTJERkYsIFUrQTY0MC1BNjlGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMFF0X1JtNjkxTFRlYktmWTJaa0tTbUkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAzNzAtMDNGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byc7CiAgZm9udC1zdHlsZTogaXRhbGljOwogIGZvbnQtd2VpZ2h0OiA1MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1lZGl1bSBJdGFsaWMnKSwgbG9jYWwoJ1JvYm90by1NZWRpdW1JdGFsaWMnKSwgdXJsKC9mb250LXJvYm90by9PTGZmR0JUYUYwWEZPVzFnbnVIRjBWQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8nOwogIGZvbnQtc3R5bGU6IGl0YWxpYzsKICBmb250LXdlaWdodDogNTAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNZWRpdW0gSXRhbGljJyksIGxvY2FsKCdSb2JvdG8tTWVkaXVtSXRhbGljJyksIHVybCgvZm9udC1yb2JvdG8vT0xmZkdCVGFGMFhGT1cxZ251SEYwWWdwOVE4Z2JZcmhxR2xSYXZfSVhmay53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDAwMC0wMEZGLCBVKzAxMzEsIFUrMDE1Mi0wMTUzLCBVKzAyQzYsIFUrMDJEQSwgVSswMkRDLCBVKzIwMDAtMjA2RiwgVSsyMDc0LCBVKzIwQUMsIFUrMjIxMiwgVSsyMjE1Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGFFOGtNNHhXUjFfMWJZVVJSb2pSR2Mud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDAtMDI0RiwgVSsxRTAwLTFFRkYsIFUrMjBBMC0yMEFCLCBVKzIwQUQtMjBDRiwgVSsyQzYwLTJDN0YsIFUrQTcyMC1BN0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvJzsKICBmb250LXN0eWxlOiBpdGFsaWM7CiAgZm9udC13ZWlnaHQ6IDUwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTWVkaXVtIEl0YWxpYycpLCBsb2NhbCgnUm9ib3RvLU1lZGl1bUl0YWxpYycpLCB1cmwoL2ZvbnQtcm9ib3RvL09MZmZHQlRhRjBYRk9XMWdudUhGMGREaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZMTRzWVlkSmc1ZFUycXpKRVZTdXRhMC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQwMC0wNDVGLCBVKzA0OTAtMDQ5MSwgVSswNEIwLTA0QjEsIFUrMjExNjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZX1pyYVIyVGc4dzJsem03a0xOTDAtdy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDQ2MC0wNTJGLCBVKzIwQjQsIFUrMkRFMC0yREZGLCBVK0E2NDAtQTY5RjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZd3RfUm02OTFMVGViS2ZZMlprS1NtSS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNDAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vJyksIGxvY2FsKCdSb2JvdG9Nb25vLVJlZ3VsYXInKSwgdXJsKC9mb250LXJvYm90by9oTXFQTkxzdV9keXdNYTRDX0RFcFkxQlcyNlF4cFNqLV9aS21feFQ0aFd3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSsxRjAwLTFGRkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTRncDlROGdiWXJocUdsUmF2X0lYZmsud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAwMDAtMDBGRiwgVSswMTMxLCBVKzAxNTItMDE1MywgVSswMkM2LCBVKzAyREEsIFUrMDJEQywgVSsyMDAwLTIwNkYsIFUrMjA3NCwgVSsyMEFDLCBVKzIyMTIsIFUrMjIxNTsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDQwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubycpLCBsb2NhbCgnUm9ib3RvTW9uby1SZWd1bGFyJyksIHVybCgvZm9udC1yb2JvdG8vaE1xUE5Mc3VfZHl3TWE0Q19ERXBZNkU4a000eFdSMV8xYllVUlJvalJHYy53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA0MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8nKSwgbG9jYWwoJ1JvYm90b01vbm8tUmVndWxhcicpLCB1cmwoL2ZvbnQtcm9ib3RvL2hNcVBOTHN1X2R5d01hNENfREVwWTlEaU5zUjVhLTlPZV9JdnB1OFhXbFkud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzAxMDItMDEwMywgVSsxRUEwLTFFRjksIFUrMjBBQjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnoxeC1NMUkxdzVPTWlxblZGOHhCTGhVLndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswNDAwLTA0NUYsIFUrMDQ5MC0wNDkxLCBVKzA0QjAtMDRCMSwgVSsyMTE2Owp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGendYYUFYdXA1bVpsZks2eFJMcmhzY28ud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzA0NjAtMDUyRiwgVSsyMEI0LCBVKzJERTAtMkRGRiwgVStBNjQwLUE2OUY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6d242V3F4by14d3hpbERYUFU4Y2hWVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDM3MC0wM0ZGOwp9CkBmb250LWZhY2UgewogIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKICBmb250LXdlaWdodDogNzAwOwogIHNyYzogbG9jYWwoJ1JvYm90byBNb25vIEJvbGQnKSwgbG9jYWwoJ1JvYm90b01vbm8tQm9sZCcpLCB1cmwoL2ZvbnQtcm9ib3RvL040ZHVWYzlDNTh1d1BpWThfNTlGejFUN2FKTEs2bktwbjM2SU13VGNNTWMud29mZjIpIGZvcm1hdCgnd29mZjInKTsKICB1bmljb2RlLXJhbmdlOiBVKzFGMDAtMUZGRjsKfQpAZm9udC1mYWNlIHsKICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJzsKICBmb250LXN0eWxlOiBub3JtYWw7CiAgZm9udC13ZWlnaHQ6IDcwMDsKICBzcmM6IGxvY2FsKCdSb2JvdG8gTW9ubyBCb2xkJyksIGxvY2FsKCdSb2JvdG9Nb25vLUJvbGQnKSwgdXJsKC9mb250LXJvYm90by9ONGR1VmM5QzU4dXdQaVk4XzU5RnpfNzlfWnVVeENpZ00yRGVzcFRuRmF3LndvZmYyKSBmb3JtYXQoJ3dvZmYyJyk7CiAgdW5pY29kZS1yYW5nZTogVSswMDAwLTAwRkYsIFUrMDEzMSwgVSswMTUyLTAxNTMsIFUrMDJDNiwgVSswMkRBLCBVKzAyREMsIFUrMjAwMC0yMDZGLCBVKzIwNzQsIFUrMjBBQywgVSsyMjEyLCBVKzIyMTU7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6NGdkOU9FUFVDTjNBZFlXMGU4dGF0NC53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMC0wMjRGLCBVKzFFMDAtMUVGRiwgVSsyMEEwLTIwQUIsIFUrMjBBRC0yMENGLCBVKzJDNjAtMkM3RiwgVStBNzIwLUE3RkY7Cn0KQGZvbnQtZmFjZSB7CiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubyc7CiAgZm9udC1zdHlsZTogbm9ybWFsOwogIGZvbnQtd2VpZ2h0OiA3MDA7CiAgc3JjOiBsb2NhbCgnUm9ib3RvIE1vbm8gQm9sZCcpLCBsb2NhbCgnUm9ib3RvTW9uby1Cb2xkJyksIHVybCgvZm9udC1yb2JvdG8vTjRkdVZjOUM1OHV3UGlZOF81OUZ6OGJJUVNZWm5XTGFXQzlRTkNwVEtfVS53b2ZmMikgZm9ybWF0KCd3b2ZmMicpOwogIHVuaWNvZGUtcmFuZ2U6IFUrMDEwMi0wMTAzLCBVKzFFQTAtMUVGOSwgVSsyMEFCOwp9Cjwvc3R5bGU+CgoKCjxzdHlsZT4ubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsIC5tYXQtYmFkZ2UtY29udGVudHtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDEsLm1hdC1oZWFkbGluZSwubWF0LXR5cG9ncmFwaHkgaDF7Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDIsLm1hdC10aXRsZSwubWF0LXR5cG9ncmFwaHkgaDJ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0LC5tYXQtc3ViaGVhZGluZy0xLC5tYXQtdHlwb2dyYXBoeSBoNHtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNSwubWF0LXR5cG9ncmFwaHkgaDV7Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nLC5tYXQtYm9keS0ye2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keSwubWF0LWJvZHktMSwubWF0LXR5cG9ncmFwaHl7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTQsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS00e2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktMywubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTN7Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTEsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0xe2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXQgLm1hdC1jaGVja2JveC1sYWJlbHtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcHtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uLC5tYXQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29ue2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGx7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbCwubWF0LWZvb3Rlci1jZWxse2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudHtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXh7cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sOi13ZWJraXQtYXV0b2ZpbGwrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXIsLm1hdC1ncmlkLXRpbGUtZm9vdGVye2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlciAubWF0LWxpbmUsLm1hdC1ncmlkLXRpbGUtZm9vdGVyIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZTpudGgtY2hpbGQobisyKSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50e21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcntoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLC5tYXQtc3RlcHBlci1ob3Jpem9udGFse2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWx7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3J7Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcntmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWR7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3Vwe2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyLC5tYXQtdG9vbGJhciBoMSwubWF0LXRvb2xiYXIgaDIsLm1hdC10b29sYmFyIGgzLC5tYXQtdG9vbGJhciBoNCwubWF0LXRvb2xiYXIgaDUsLm1hdC10b29sYmFyIGg2e2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcHtmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmV7d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1pdGVtIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9ue2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVse2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sICJIZWx2ZXRpY2EgTmV1ZSIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgIkhlbHZldGljYSBOZXVlIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWV7Zm9udC1mYW1pbHk6Um9ib3RvLCAiSGVsdmV0aWNhIE5ldWUiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGV7b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVke292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudHtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmlwcGxlLWVsZW1lbnR7ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVue2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyLC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJ7cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXI6ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcntkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5le3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcHtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5ne29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9we2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcCwuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3h7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja3twb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7LyohKi99QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7LyohKi99LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZDpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5ne3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3h7cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbntjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksLm1hdC1vcHRpb246Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmV7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnkgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2FybiAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkIC5tYXQtb3B0Z3JvdXAtbGFiZWx7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94e2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXByaW1hcnkgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1hY2NlbnQgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC13YXJuIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCwubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWR7YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoye2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejN7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nntib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejd7Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4e2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwe2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExe2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEye2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEze2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0e2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1e2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2e2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN3tib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTh7Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5e2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMHtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxe2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJ7Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM3tib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0e2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcntkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWx7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnR7Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJhZGdlLWNvbnRlbnR7b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50IC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm4gLm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2V7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW4gLm1hdC1iYWRnZS1jb250ZW50e2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudHtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnR7cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWQgLm1hdC1iYWRnZS1jb250ZW50LC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmV7dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbCAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi04cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvdyAubWF0LWJhZGdlLWNvbnRlbnR7Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTIycHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xMXB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlIC5tYXQtYmFkZ2UtY29udGVudHt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjhweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMTRweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24sLm1hdC1pY29uLWJ1dHRvbiwubWF0LXN0cm9rZWQtYnV0dG9ue2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnl7Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnR7Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1pY29uLWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbiwubWF0LXJhaXNlZC1idXR0b24sLm1hdC1mYWIsLm1hdC1taW5pLWZhYntjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWZhYi5tYXQtcHJpbWFyeSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4sLm1hdC1mYWIubWF0LXdhcm4sLm1hdC1taW5pLWZhYi5tYXQtd2Fybntjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LWZhYi5tYXQtcHJpbWFyeSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1mYWIubWF0LWFjY2VudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLC5tYXQtZmFiLm1hdC13YXJuLC5tYXQtbWluaS1mYWIubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF0sLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1taW5pLWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwubWF0LWZsYXQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b246bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWI6bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwubWF0LW1pbmktZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtYnV0dG9uLXRvZ2dsZSsubWF0LWJ1dHRvbi10b2dnbGV7Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWR7Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWR7YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJke2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0Om5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGV7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmt7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm4gLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZDpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAubWF0LWNoZWNrYm94LWZyYW1le2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3ggLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWQ6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAubWF0LWNoaXAtcmVtb3ZlOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZHtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnkgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm57YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1jaGlwLXJlbW92ZXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGV7YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGUgdGhlYWQsLm1hdC10YWJsZSB0Ym9keSwubWF0LXRhYmxlIHRmb290LG1hdC1oZWFkZXItcm93LG1hdC1yb3csbWF0LWZvb3Rlci1yb3csW21hdC1oZWFkZXItcm93XSxbbWF0LXJvd10sW21hdC1mb290ZXItcm93XSwubWF0LXRhYmxlLXN0aWNreXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvdyxtYXQtaGVhZGVyLXJvdyxtYXQtZm9vdGVyLXJvdyx0aC5tYXQtaGVhZGVyLWNlbGwsdGQubWF0LWNlbGwsdGQubWF0LWZvb3Rlci1jZWxse2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGx7Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3d7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZSwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uLC5tYXQtZGF0ZXBpY2tlci1jb250ZW50IC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9ue2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcjo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudHtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmU+Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50e2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnQgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQ+Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVke2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnR7Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybntjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcntib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVye2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbHtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLC5tYXQtZXhwYW5zaW9uLXBhbmVsIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksLm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWw6bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxle2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uLC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcjo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0gLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlLC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbntjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnR7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudHtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50LC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2Vye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3J7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtaGludHtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtZmxleHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5e2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnR7Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50OmRpc2FibGVkLC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnQ6OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuIC5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlIC5tYXQtbGlzdC1vcHRpb257Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZSAubWF0LXN1YmhlYWRlcntjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVke2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uOmhvdmVyLC5tYXQtbGlzdC1vcHRpb246Zm9jdXMsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpob3ZlciwubWF0LW5hdi1saXN0IC5tYXQtbGlzdC1pdGVtOmZvY3VzLC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsLm1hdC1hY3Rpb24tbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbiwubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbjpob3ZlciwubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbjpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWx7YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdLC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtIC5tYXQtaWNvbi1uby1jb2xvciwubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbTpob3Zlcjpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2Rpc2FibGVkXSksLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcntiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3IsLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIC5tYXQtc2VsZWN0LXRyaWdnZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50e2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnQsLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWZpcnN0LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWxhc3R7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmR7ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnQgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1idWZmZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGw6OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xlLC5tYXQtc3Bpbm5lciBjaXJjbGV7c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnQgY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm4gY2lyY2xlLC5tYXQtc3Bpbm5lci5tYXQtd2FybiBjaXJjbGV7c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yYWRpby1pbm5lci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeTphY3RpdmUgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQ6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm46YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQgLm1hdC1yYWRpby1pbm5lci1jaXJjbGV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWV7Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtdmFsdWV7Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVse2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnkgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2FybiAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcntiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2h7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRle2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmR7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXSAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWNoZWNrZWQpIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYiwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeSAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYiwubWF0LWFjY2VudCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtd2FybiAubWF0LXNsaWRlci10cmFjay1maWxsLC5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYiwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2FybiAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcjpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZDpob3ZlciAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZSAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrcyAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZCwubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1vcHRpb25hbHtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb257YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZCwubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmUsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3J7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWwsLm1hdC1zdGVwcGVyLXZlcnRpY2Fse2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmJlZm9yZSwubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXI6OmFmdGVyLC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmV7Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd3tjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXIsLm1hdC10YWItaGVhZGVye2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC10YWItbmF2LWJhciwubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC10YWItaGVhZGVye2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWwsLm1hdC10YWItbGlua3tjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dIC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1de2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtaW5rLWJhciwubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGlua3MsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9ue2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3MsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlciwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmt7Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcntiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnl7YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnR7YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJue2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lLC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtdG9vbGJhciAubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtdG9vbGJhciAubWF0LXNlbGVjdC12YWx1ZSwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtYXJyb3csLm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LXNlbGVjdC1hcnJvd3tjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhciAubWF0LWlucHV0LWVsZW1lbnR7Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcHtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGUsLm1hdC1uZXN0ZWQtdHJlZS1ub2Rle2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVye2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9ue2NvbG9yOiNmZjk4MDB9Cjwvc3R5bGU+Cgo8c3R5bGU+CiAgaHRtbCwKICBib2R5IHsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBmb250LWZhbWlseTogUm9ib3RvLCBzYW5zLXNlcmlmOwogICAgY29sb3I6IHZhcigtLXByaW1hcnktdGV4dC1jb2xvcik7CgogICAgLyogTGVnYWN5IG1lY2hhbmlzbSB0byBhdm9pZCBpc3N1ZXMgd2l0aCBzdWJwaXhlbCBhbnRpLWFsaWFzaW5nIG9uIG1hY09TLgogICAgICoKICAgICAqIEluIHRoZSBwYXN0IFsxXSwgbWFjT1Mgc3VicGl4ZWwgQUEgY2F1c2VkIGV4Y2Vzc2l2ZSBib2xkaW5nIGZvciBsaWdodC1vbi1kYXJrIHRleHQ7IHRoaXMgcnVsZQogICAgICogYXZvaWRzIHRoYXQgYnkgcmVxdWVzdGluZyBub24tc3VicGl4ZWwgQUEgYWx3YXlzLCByYXRoZXIgdGhhbiB0aGUgZGVmYXVsdCBiZWhhdmlvciwgd2hpY2ggaXMKICAgICAqIHRvIHVzZSBzdWJwaXhlbCBBQSB3aGVuIGF2YWlsYWJsZS4gVGhlIG9yaWdpbmFsIGlzc3VlIHdhcyAiZml4ZWQiIGJ5IHJlbW92aW5nIHN1YnBpeGVsIEFBIGluCiAgICAgKiBtYWNPUyAxNCAoTW9qYXZlKSwgYnV0IGZvciBsZWdhY3kgcmVhc29ucyB0aGV5IHByZXNlcnZlZCB0aGUgYm9sZGluZyBlZmZlY3QgYXMgYW4gb3B0aW9uLgogICAgICogQ2hyb21lIHRoZW4gaW4gdHVybiB1cGRhdGVkIGl0cyBmb250IHJlbmRlcmluZyB0byBhcHBseSB0aGF0IGJvbGRpbmcgZWZmZWN0IFsyXSwgd2hpY2ggbWVhbnMKICAgICAqIHRoYXQgZXZlbiB0aG91Z2ggdGhlIGAtd2Via2l0LWZvbnQtc21vb3RoaW5nYCBkb2NzIFszXSBzdWdnZXN0IHRoYXQgc2V0dGluZyBgYW50aWFsaWFzZWRgCiAgICAgKiB3b3VsZCBoYXZlIG5vIGVmZmVjdCBmb3IgcmVjZW50IHZlcnNpb25zIG9mIG1hY09TLCBpdCBzdGlsbCBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIGJvbGRpbmcuCiAgICAgKgogICAgICogWzFdOiBodHRwOi8vd3d3LmxpZ2h0ZXJyYS5jb20vYXJ0aWNsZXMvbWFjb3N4dGV4dGFhYnVnLwogICAgICogWzJdOiBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvY2hyb21pdW0vaXNzdWVzL2RldGFpbD9pZD04NTg4NjEKICAgICAqIFszXTogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQ1NTL2ZvbnQtc21vb3RoCiAgICAgKgogICAgICovCgogICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgfQo8L3N0eWxlPgoKPC9oZWFkPjxib2R5Pjx0Yi13ZWJhcHA+PC90Yi13ZWJhcHA+PHNjcmlwdCBzcmM9ImluZGV4LmpzIj48L3NjcmlwdD48L2JvZHk+PC9odG1sPg==", - "headers": [ - [ - "content-type", - "text/html; charset=utf-8" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/environment": { - "data": "eyJkYXRhX2xvY2F0aW9uIjogInJ1bnMiLCAid2luZG93X3RpdGxlIjogIiJ9", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=metrics%2FmAP_0.5": { - "data": "W1sxNjE0ODg1NTQwLjc3NzA2NzcsIDAsIDAuMDMxOTExMjY4ODMwMjk5MzhdXQ==", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=metrics%2FmAP_0.5%3A0.95": { - "data": "W1sxNjE0ODg1NTQwLjc3NzA4ODksIDAsIDAuMDA4ODMwMTQ0MDcwMDg4ODYzXV0=", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=metrics%2Fprecision": { - "data": "W1sxNjE0ODg1NTQwLjc3NzAxOTcsIDAsIDAuMF1d", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=metrics%2Frecall": { - "data": "W1sxNjE0ODg1NTQwLjc3NzA0NTIsIDAsIDAuMF1d", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=train%2Fbox_loss": { - "data": "W1sxNjE0ODg1NTQwLjc3NjQ3NTQsIDAsIDAuMDk0ODM1NzA2MDU1MTY0MzRdXQ==", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=train%2Fcls_loss": { - "data": "W1sxNjE0ODg1NTQwLjc3Njk3MjgsIDAsIDAuMDM0NTA3MjMzNjQ5NDkyMjY0XV0=", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/scalars?run=train%2Fyolov5s_results2&tag=train%2Fobj_loss": { - "data": "W1sxNjE0ODg1NTQwLjc3Njg3MTIsIDAsIDAuMzU2MTI2MTU5NDI5NTUwMTddXQ==", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugin/scalars/tags": { - "data": "eyJ0cmFpbi95b2xvdjVzX3Jlc3VsdHMyIjogeyJ0cmFpbi9ib3hfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW4vYm94X2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ0cmFpbi9vYmpfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW4vb2JqX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ0cmFpbi9jbHNfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidHJhaW4vY2xzX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJtZXRyaWNzL3ByZWNpc2lvbiI6IHsiZGlzcGxheU5hbWUiOiAibWV0cmljcy9wcmVjaXNpb24iLCAiZGVzY3JpcHRpb24iOiAiIn0sICJtZXRyaWNzL3JlY2FsbCI6IHsiZGlzcGxheU5hbWUiOiAibWV0cmljcy9yZWNhbGwiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJtZXRyaWNzL21BUF8wLjUiOiB7ImRpc3BsYXlOYW1lIjogIm1ldHJpY3MvbUFQXzAuNSIsICJkZXNjcmlwdGlvbiI6ICIifSwgIm1ldHJpY3MvbUFQXzAuNTowLjk1IjogeyJkaXNwbGF5TmFtZSI6ICJtZXRyaWNzL21BUF8wLjU6MC45NSIsICJkZXNjcmlwdGlvbiI6ICIifSwgInZhbC9ib3hfbG9zcyI6IHsiZGlzcGxheU5hbWUiOiAidmFsL2JveF9sb3NzIiwgImRlc2NyaXB0aW9uIjogIiJ9LCAidmFsL29ial9sb3NzIjogeyJkaXNwbGF5TmFtZSI6ICJ2YWwvb2JqX2xvc3MiLCAiZGVzY3JpcHRpb24iOiAiIn0sICJ2YWwvY2xzX2xvc3MiOiB7ImRpc3BsYXlOYW1lIjogInZhbC9jbHNfbG9zcyIsICJkZXNjcmlwdGlvbiI6ICIifSwgIngvbHIwIjogeyJkaXNwbGF5TmFtZSI6ICJ4L2xyMCIsICJkZXNjcmlwdGlvbiI6ICIifSwgIngvbHIxIjogeyJkaXNwbGF5TmFtZSI6ICJ4L2xyMSIsICJkZXNjcmlwdGlvbiI6ICIifSwgIngvbHIyIjogeyJkaXNwbGF5TmFtZSI6ICJ4L2xyMiIsICJkZXNjcmlwdGlvbiI6ICIifX19", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/plugins_listing": { - "data": "eyJzY2FsYXJzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJzY2FsYXJzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1zY2FsYXItZGFzaGJvYXJkIn19LCAiY3VzdG9tX3NjYWxhcnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJDdXN0b20gU2NhbGFycyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQifX0sICJpbWFnZXMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJpbWFnZXMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWltYWdlLWRhc2hib2FyZCJ9fSwgImF1ZGlvIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiYXVkaW8iLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWF1ZGlvLWRhc2hib2FyZCJ9fSwgImRlYnVnZ2VyLXYyIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiRGVidWdnZXIgVjIiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiTkdfQ09NUE9ORU5UIn19LCAiZ3JhcGhzIjogeyJkaXNhYmxlX3JlbG9hZCI6IHRydWUsICJlbmFibGVkIjogZmFsc2UsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJncmFwaHMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWdyYXBoLWRhc2hib2FyZCJ9fSwgImRpc3RyaWJ1dGlvbnMiOiB7ImRpc2FibGVfcmVsb2FkIjogZmFsc2UsICJlbmFibGVkIjogdHJ1ZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogImRpc3RyaWJ1dGlvbnMiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLWRpc3RyaWJ1dGlvbi1kYXNoYm9hcmQifX0sICJoaXN0b2dyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJoaXN0b2dyYW1zIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkIn19LCAidGV4dCI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInRleHQiLCAibG9hZGluZ19tZWNoYW5pc20iOiB7InR5cGUiOiAiQ1VTVE9NX0VMRU1FTlQiLCAiZWxlbWVudF9uYW1lIjogInRmLXRleHQtZGFzaGJvYXJkIn19LCAicHJfY3VydmVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUFIgQ3VydmVzIiwgImxvYWRpbmdfbWVjaGFuaXNtIjogeyJ0eXBlIjogIkNVU1RPTV9FTEVNRU5UIiwgImVsZW1lbnRfbmFtZSI6ICJ0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQifX0sICJwcm9maWxlX3JlZGlyZWN0IjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiUHJvZmlsZSIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQifX0sICJocGFyYW1zIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAiaHBhcmFtcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAidGYtaHBhcmFtcy1kYXNoYm9hcmQifX0sICJtZXNoIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IGZhbHNlLCAicmVtb3ZlX2RvbSI6IGZhbHNlLCAidGFiX25hbWUiOiAibWVzaCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJDVVNUT01fRUxFTUVOVCIsICJlbGVtZW50X25hbWUiOiAibWVzaC1kYXNoYm9hcmQifX0sICJ0aW1lc2VyaWVzIjogeyJkaXNhYmxlX3JlbG9hZCI6IGZhbHNlLCAiZW5hYmxlZCI6IHRydWUsICJyZW1vdmVfZG9tIjogZmFsc2UsICJ0YWJfbmFtZSI6ICJUaW1lIFNlcmllcyIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJOR19DT01QT05FTlQifX0sICJwcm9qZWN0b3IiOiB7ImRpc2FibGVfcmVsb2FkIjogdHJ1ZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogInByb2plY3RvciIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJJRlJBTUUiLCAibW9kdWxlX3BhdGgiOiAiL2RhdGEvcGx1Z2luL3Byb2plY3Rvci9pbmRleC5qcyJ9fSwgIndoYXRpZiI6IHsiZGlzYWJsZV9yZWxvYWQiOiBmYWxzZSwgImVuYWJsZWQiOiBmYWxzZSwgInJlbW92ZV9kb20iOiBmYWxzZSwgInRhYl9uYW1lIjogIldoYXQtSWYgVG9vbCIsICJsb2FkaW5nX21lY2hhbmlzbSI6IHsidHlwZSI6ICJJRlJBTUUiLCAibW9kdWxlX3BhdGgiOiAiL2RhdGEvcGx1Z2luL3doYXRpZi9pbmRleC5qcyJ9fX0=", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/data/runs": { - "data": "WyJ0cmFpbi95b2xvdjVzX3Jlc3VsdHMiLCAidHJhaW4veW9sb3Y1c19yZXN1bHRzMiJd", - "headers": [ - [ - "content-type", - "application/json" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/font-roboto/Hgo13k-tfSpn0qi1SFdUfZBw1xU1rKptJj_0jans920.woff2": { - "data": "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", - "headers": [ - [ - "content-type", - "font/woff2" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/font-roboto/RxZJdnzeo3R5zSexge8UUZBw1xU1rKptJj_0jans920.woff2": { - "data": "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", - "headers": [ - [ - "content-type", - "font/woff2" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/font-roboto/d-6IYplOFocCacKzxwXSOJBw1xU1rKptJj_0jans920.woff2": { - "data": "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", - "headers": [ - [ - "content-type", - "font/woff2" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/font-roboto/oMMgfZMQthOryQo9n22dcuvvDin1pK8aKteLpeZ5c0A.woff2": { - "data": "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", - "headers": [ - [ - "content-type", - "font/woff2" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "https://localhost:6006/icon_bundle.svg": { - "data": "PHN2Zz48ZGVmcz4KPHN2ZyBpZD0iYXJyb3dfZG93bndhcmRfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iIzAxMDEwMSIgZD0iTTIwIDEybC0xLjQxLTEuNDFMMTMgMTYuMTdWNGgtMnYxMi4xN2wtNS41OC01LjU5TDQgMTJsOCA4IDgtOHoiLz48L3N2Zz48c3ZnIGlkPSJhcnJvd191cHdhcmRfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTQgMTJsMS40MSAxLjQxTDExIDcuODNWMjBoMlY3LjgzbDUuNTggNS41OUwyMCAxMmwtOC04LTggOHoiLz48L3N2Zz48c3ZnIGlkPSJidWdfcmVwb3J0XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNMjAgOGgtMi44MWMtLjQ1LS43OC0xLjA3LTEuNDUtMS44Mi0xLjk2TDE3IDQuNDEgMTUuNTkgM2wtMi4xNyAyLjE3QzEyLjk2IDUuMDYgMTIuNDkgNSAxMiA1Yy0uNDkgMC0uOTYuMDYtMS40MS4xN0w4LjQxIDMgNyA0LjQxbDEuNjIgMS42M0M3Ljg4IDYuNTUgNy4yNiA3LjIyIDYuODEgOEg0djJoMi4wOWMtLjA1LjMzLS4wOS42Ni0uMDkgMXYxSDR2MmgydjFjMCAuMzQuMDQuNjcuMDkgMUg0djJoMi44MWMxLjA0IDEuNzkgMi45NyAzIDUuMTkgM3M0LjE1LTEuMjEgNS4xOS0zSDIwdi0yaC0yLjA5Yy4wNS0uMzMuMDktLjY2LjA5LTF2LTFoMnYtMmgtMnYtMWMwLS4zNC0uMDQtLjY3LS4wOS0xSDIwVjh6bS02IDhoLTR2LTJoNHYyem0wLTRoLTR2LTJoNHYyeiIvPjwvc3ZnPjxzdmcgaWQ9ImNhbmNlbF8yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptNSAxMy41OUwxNS41OSAxNyAxMiAxMy40MSA4LjQxIDE3IDcgMTUuNTkgMTAuNTkgMTIgNyA4LjQxIDguNDEgNyAxMiAxMC41OSAxNS41OSA3IDE3IDguNDEgMTMuNDEgMTIgMTcgMTUuNTl6Ii8+PC9zdmc+PHN2ZyBpZD0iY2hldnJvbl9sZWZ0XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiIvPjwvc3ZnPjxzdmcgaWQ9ImNoZXZyb25fcmlnaHRfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiIvPjwvc3ZnPjxzdmcgaWQ9ImNsZWFyXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyBpZD0iY2xvc2VfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOSA2LjQxTDE3LjU5IDUgMTIgMTAuNTkgNi40MSA1IDUgNi40MSAxMC41OSAxMiA1IDE3LjU5IDYuNDEgMTkgMTIgMTMuNDEgMTcuNTkgMTkgMTkgMTcuNTkgMTMuNDEgMTJ6Ii8+PC9zdmc+PHN2ZyBpZD0iY29udGVudF9jb3B5XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNiAxSDRjLTEuMSAwLTIgLjktMiAydjE0aDJWM2gxMlYxem0zIDRIOGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMWMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yem0wIDE2SDhWN2gxMXYxNHoiLz48L3N2Zz48c3ZnIGlkPSJlcnJvcl8yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtMmgydjJ6bTAtNGgtMlY3aDJ2NnoiLz48L3N2Zz48c3ZnIGlkPSJleHBhbmRfbGVzc18yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTIgOGwtNiA2IDEuNDEgMS40MUwxMiAxMC44M2w0LjU5IDQuNThMMTggMTR6Ii8+PC9zdmc+PHN2ZyBpZD0iZXhwYW5kX21vcmVfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE2LjU5IDguNTlMMTIgMTMuMTcgNy40MSA4LjU5IDYgMTBsNiA2IDYtNnoiLz48L3N2Zz48c3ZnIGlkPSJmaWx0ZXJfYWx0XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48Zz48cGF0aCBkPSJNMCwwaDI0IE0yNCwyNEgwIiBmaWxsPSJub25lIi8+PHBhdGggZD0iTTQuMjUsNS42MUM2LjI3LDguMiwxMCwxMywxMCwxM3Y2YzAsMC41NSwwLjQ1LDEsMSwxaDJjMC41NSwwLDEtMC40NSwxLTF2LTZjMCwwLDMuNzItNC44LDUuNzQtNy4zOSBDMjAuMjUsNC45NSwxOS43OCw0LDE4Ljk1LDRINS4wNEM0LjIxLDQsMy43NCw0Ljk1LDQuMjUsNS42MXoiLz48cGF0aCBkPSJNMCwwaDI0djI0SDBWMHoiIGZpbGw9Im5vbmUiLz48L2c+PC9zdmc+PHN2ZyBpZD0iZmxhZ18yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiLz48L3N2Zz48c3ZnIGlkPSJmdWxsc2NyZWVuXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0IiB3aWR0aD0iMjQiPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMHoiIGZpbGw9Im5vbmUiLz48cGF0aCBkPSJNNyAxNEg1djVoNXYtMkg3di0zem0tMi00aDJWN2gzVjVINXY1em0xMiA3aC0zdjJoNXYtNWgtMnYzek0xNCA1djJoM3YzaDJWNWgtNXoiLz48L3N2Zz48c3ZnIGlkPSJmdWxsc2NyZWVuX2V4aXRfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik01IDE2aDN2M2gydi01SDV2MnptMy04SDV2Mmg1VjVIOHYzem02IDExaDJ2LTNoM3YtMmgtNXY1em0yLTExVjVoLTJ2NWg1VjhoLTN6Ii8+PC9zdmc+PHN2ZyBpZD0iZ2V0X2FwcF8yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiIvPjwvc3ZnPjxzdmcgaWQ9ImhlbHBfb3V0bGluZV8yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIyNCIgaGVpZ2h0PSIyNCIgdmlld0JveD0iMCAwIDI0IDI0Ij48cGF0aCBkPSJNMTEgMThoMnYtMmgtMnYyem0xLTE2QzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHptMC0xNGMtMi4yMSAwLTQgMS43OS00IDRoMmMwLTEuMS45LTIgMi0yczIgLjkgMiAyYzAgMi0zIDEuNzUtMyA1aDJjMC0yLjI1IDMtMi41IDMtNSAwLTIuMjEtMS43OS00LTQtNHoiLz48L3N2Zz48c3ZnIGlkPSJpbWFnZV9zZWFyY2hfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0wIDBoMjR2MjRIMFYweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xOCAxM3Y3SDRWNmg1LjAyYy4wNS0uNzEuMjItMS4zOC40OC0ySDRjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTVsLTItMnptLTEuNSA1aC0xMWwyLjc1LTMuNTMgMS45NiAyLjM2IDIuNzUtMy41NHptMi44LTkuMTFjLjQ0LS43LjctMS41MS43LTIuMzlDMjAgNC4wMSAxNy45OSAyIDE1LjUgMlMxMSA0LjAxIDExIDYuNXMyLjAxIDQuNSA0LjQ5IDQuNWMuODggMCAxLjctLjI2IDIuMzktLjdMMjEgMTMuNDIgMjIuNDIgMTIgMTkuMyA4Ljg5ek0xNS41IDlDMTQuMTIgOSAxMyA3Ljg4IDEzIDYuNVMxNC4xMiA0IDE1LjUgNCAxOCA1LjEyIDE4IDYuNSAxNi44OCA5IDE1LjUgOXoiLz48L3N2Zz48c3ZnIGlkPSJpbmZvX291dGxpbmVfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTExIDE3aDJ2LTZoLTJ2NnptMS0xNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6TTExIDloMlY3aC0ydjJ6Ii8+PC9zdmc+PHN2ZyBpZD0ia2VlcF8yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxwYXRoIGQ9Ik0xNiw5VjRsMSwwYzAuNTUsMCwxLTAuNDUsMS0xdjBjMC0wLjU1LTAuNDUtMS0xLTFIN0M2LjQ1LDIsNiwyLjQ1LDYsM3YwIGMwLDAuNTUsMC40NSwxLDEsMWwxLDB2NWMwLDEuNjYtMS4zNCwzLTMsM2gwdjJoNS45N3Y3bDEsMWwxLTF2LTdIMTl2LTJoMEMxNy4zNCwxMiwxNiwxMC42NiwxNiw5eiIgZmlsbC1ydWxlPSJldmVub2RkIi8+PC9nPjwvc3ZnPjxzdmcgaWQ9ImtlZXBfb3V0bGluZV8yNHB4IiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGVuYWJsZS1iYWNrZ3JvdW5kPSJuZXcgMCAwIDI0IDI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PGc+PHJlY3QgZmlsbD0ibm9uZSIgaGVpZ2h0PSIyNCIgd2lkdGg9IjI0Ii8+PC9nPjxnPjxwYXRoIGQ9Ik0xNCw0djVjMCwxLjEyLDAuMzcsMi4xNiwxLDNIOWMwLjY1LTAuODYsMS0xLjksMS0zVjRIMTQgTTE3LDJIN0M2LjQ1LDIsNiwyLjQ1LDYsM2MwLDAuNTUsMC40NSwxLDEsMWMwLDAsMCwwLDAsMGwxLDB2NSBjMCwxLjY2LTEuMzQsMy0zLDN2Mmg1Ljk3djdsMSwxbDEtMXYtN0gxOXYtMmMwLDAsMCwwLDAsMGMtMS42NiwwLTMtMS4zNC0zLTNWNGwxLDBjMCwwLDAsMCwwLDBjMC41NSwwLDEtMC40NSwxLTEgQzE4LDIuNDUsMTcuNTUsMiwxNywyTDE3LDJ6Ii8+PC9nPjwvc3ZnPjxzdmcgaWQ9ImxpbmVfd2VpZ2h0XzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgZW5hYmxlLWJhY2tncm91bmQ9Im5ldyAwIDAgMjQgMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCIgd2lkdGg9IjI0Ij48Zz48cmVjdCBmaWxsPSJub25lIiBoZWlnaHQ9IjI0IiB3aWR0aD0iMjQiIHg9IjAiLz48L2c+PGc+PGc+PGc+PHBhdGggZD0iTTMsMTdoMTh2LTJIM1YxN3ogTTMsMjBoMTh2LTFIM1YyMHogTTMsMTNoMTh2LTNIM1YxM3ogTTMsNHY0aDE4VjRIM3oiLz48L2c+PC9nPjwvZz48L3N2Zz48c3ZnIGlkPSJtb3JlX3ZlcnRfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMiA4YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptMCAyYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptMCA2Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnoiLz48L3N2Zz48c3ZnIGlkPSJyZWZyZXNoXzI0cHgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjI0IiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiPjxwYXRoIGQ9Ik0xNy42NSA2LjM1QzE2LjIgNC45IDE0LjIxIDQgMTIgNGMtNC40MiAwLTcuOTkgMy41OC03Ljk5IDhzMy41NyA4IDcuOTkgOGMzLjczIDAgNi44NC0yLjU1IDcuNzMtNmgtMi4wOGMtLjgyIDIuMzMtMy4wNCA0LTUuNjUgNC0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02YzEuNjYgMCAzLjE0LjY5IDQuMjIgMS43OEwxMyAxMWg3VjRsLTIuMzUgMi4zNXoiLz48L3N2Zz48c3ZnIGlkPSJzZWFyY2hfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6Ii8+PC9zdmc+PHN2ZyBpZD0ic2V0dGluZ3NfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTE5LjQzIDEyLjk4Yy4wNC0uMzIuMDctLjY0LjA3LS45OHMtLjAzLS42Ni0uMDctLjk4bDIuMTEtMS42NWMuMTktLjE1LjI0LS40Mi4xMi0uNjRsLTItMy40NmMtLjEyLS4yMi0uMzktLjMtLjYxLS4yMmwtMi40OSAxYy0uNTItLjQtMS4wOC0uNzMtMS42OS0uOThsLS4zOC0yLjY1QzE0LjQ2IDIuMTggMTQuMjUgMiAxNCAyaC00Yy0uMjUgMC0uNDYuMTgtLjQ5LjQybC0uMzggMi42NWMtLjYxLjI1LTEuMTcuNTktMS42OS45OGwtMi40OS0xYy0uMjMtLjA5LS40OSAwLS42MS4yMmwtMiAzLjQ2Yy0uMTMuMjItLjA3LjQ5LjEyLjY0bDIuMTEgMS42NWMtLjA0LjMyLS4wNy42NS0uMDcuOThzLjAzLjY2LjA3Ljk4bC0yLjExIDEuNjVjLS4xOS4xNS0uMjQuNDItLjEyLjY0bDIgMy40NmMuMTIuMjIuMzkuMy42MS4yMmwyLjQ5LTFjLjUyLjQgMS4wOC43MyAxLjY5Ljk4bC4zOCAyLjY1Yy4wMy4yNC4yNC40Mi40OS40Mmg0Yy4yNSAwIC40Ni0uMTguNDktLjQybC4zOC0yLjY1Yy42MS0uMjUgMS4xNy0uNTkgMS42OS0uOThsMi40OSAxYy4yMy4wOS40OSAwIC42MS0uMjJsMi0zLjQ2Yy4xMi0uMjIuMDctLjQ5LS4xMi0uNjRsLTIuMTEtMS42NXpNMTIgMTUuNWMtMS45MyAwLTMuNS0xLjU3LTMuNS0zLjVzMS41Ny0zLjUgMy41LTMuNSAzLjUgMS41NyAzLjUgMy41LTEuNTcgMy41LTMuNSAzLjV6Ii8+PC9zdmc+PHN2ZyBpZD0ic2V0dGluZ3NfYmFja3VwX3Jlc3RvcmVfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xNCAxMmMwLTEuMS0uOS0yLTItMnMtMiAuOS0yIDIgLjkgMiAyIDIgMi0uOSAyLTJ6bS0yLTljLTQuOTcgMC05IDQuMDMtOSA5SDBsNCA0IDQtNEg1YzAtMy44NyAzLjEzLTcgNy03czcgMy4xMyA3IDctMy4xMyA3LTcgN2MtMS41MSAwLTIuOTEtLjQ5LTQuMDYtMS4zbC0xLjQyIDEuNDRDOC4wNCAyMC4zIDkuOTQgMjEgMTIgMjFjNC45NyAwIDktNC4wMyA5LTlzLTQuMDMtOS05LTl6Ii8+PC9zdmc+PHN2ZyBpZD0ic2V0dGluZ3Nfb3ZlcnNjYW5fMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xMi4wMSA1LjVMMTAgOGg0bC0xLjk5LTIuNXpNMTggMTB2NGwyLjUtMS45OUwxOCAxMHpNNiAxMGwtMi41IDIuMDFMNiAxNHYtNHptOCA2aC00bDIuMDEgMi41TDE0IDE2em03LTEzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNi4wMUgzVjQuOTloMTh2MTQuMDJ6Ii8+PC9zdmc+PHN2ZyBpZD0idmlzaWJpbGl0eV9vZmZfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB3aWR0aD0iMjQiIGhlaWdodD0iMjQiIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiIvPjwvc3ZnPjxzdmcgaWQ9Indhcm5pbmdfMjRweCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjI0IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSIyNCI+PHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ii8+PC9zdmc+PC9kZWZzPjwvc3ZnPgo=", - "headers": [ - [ - "content-type", - "image/svg+xml; charset=utf-8" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - }, - "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/VHJ1c3RlZFR5cGVQb2xpY3l9ICovCmdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfID0gZ29vZy5UUlVTVEVEX1RZUEVTX1BPTElDWV9OQU1FID8KICAgIGdvb2cuY3JlYXRlVHJ1c3RlZFR5cGVzUG9saWN5KGdvb2cuVFJVU1RFRF9UWVBFU19QT0xJQ1lfTkFNRSArICcjYmFzZScpIDoKICAgIG51bGw7CgovLyBDb3B5cmlnaHQgMjAxOSBUaGUgQ2xvc3VyZSBMaWJyYXJ5IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAovLwovLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUy1JUyIgQkFTSVMsCi8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgovLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgovLwovLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgR2VuSnNEZXBzLCBwbGVhc2UgZG8gbm90IGVkaXQuCgovLyBEaXNhYmxlIENsYW5nIGZvcm1hdHRlciBmb3IgdGhpcyBmaWxlLgovLyBTZWUgaHR0cDovL2dvby5nbC9TZGl3WkgKLy8gY2xhbmctZm9ybWF0IG9mZgoKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xsZWN0aW9ucy9zZXRzLmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHMnXSwgWydnb29nLmxhYnMuY29sbGVjdGlvbnMuaXRlcmFibGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY29sbGVjdGlvbnMvc2V0c190ZXN0LmpzJywgWydnb29nLmNvbGxlY3Rpb25zLnNldHNUZXN0J10sIFsnZ29vZy5jb2xsZWN0aW9ucy5zZXRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWQuanMnLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5BbHJlYWR5Q2FsbGVkRXJyb3InLCAnZ29vZy5hc3luYy5EZWZlcnJlZC5DYW5jZWxlZEVycm9yJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnLi4vLi4vdGhpcmRfcGFydHkvY2xvc3VyZS9nb29nL21vY2hpa2l0L2FzeW5jL2RlZmVycmVkX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuZGVmZXJyZWRBc3luY1Rlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCcuLi8uLi90aGlyZF9wYXJ0eS9jbG9zdXJlL2dvb2cvbW9jaGlraXQvYXN5bmMvZGVmZXJyZWRsaXN0LmpzJywgWydnb29nLmFzeW5jLkRlZmVycmVkTGlzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJy4uLy4uL3RoaXJkX3BhcnR5L2Nsb3N1cmUvZ29vZy9tb2NoaWtpdC9hc3luYy9kZWZlcnJlZGxpc3RfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5kZWZlcnJlZExpc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuYXN5bmMuRGVmZXJyZWRMaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90by9wcm90by5qcycsIFsnZ29vZy5wcm90byddLCBbJ2dvb2cucHJvdG8uU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8vc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90by5TZXJpYWxpemVyJ10sIFsnZ29vZy5qc29uLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvL3NlcmlhbGl6ZXJfdGVzdC5qcycsIFsnZ29vZy5wcm90b1Rlc3QnXSwgWydnb29nLnByb3RvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYW5ub3VuY2VyLmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2Fubm91bmNlcl90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYS5Bbm5vdW5jZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQW5ub3VuY2VyJywgJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uaWZyYW1lJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hcmlhLmpzJywgWydnb29nLmExMXkuYXJpYSddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hMTF5LmFyaWEuZGF0YXRhYmxlcycsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhMTF5L2FyaWEvYXJpYV90ZXN0LmpzJywgWydnb29nLmExMXkuYXJpYVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ExMXkvYXJpYS9hdHRyaWJ1dGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5BdXRvQ29tcGxldGVWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuQ2hlY2tlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Ecm9wRWZmZWN0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkV4cGFuZGVkVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLkdyYWJiZWRWYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuSW52YWxpZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5hMTF5LmFyaWEuT3JpZW50YXRpb25WYWx1ZXMnLCAnZ29vZy5hMTF5LmFyaWEuUHJlc3NlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5SZWxldmFudFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5TZWxlY3RlZFZhbHVlcycsICdnb29nLmExMXkuYXJpYS5Tb3J0VmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL2RhdGF0YWJsZXMuanMnLCBbJ2dvb2cuYTExeS5hcmlhLmRhdGF0YWJsZXMnXSwgWydnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYTExeS9hcmlhL3JvbGVzLmpzJywgWydnb29nLmExMXkuYXJpYS5Sb2xlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXJyYXkvYXJyYXkuanMnLCBbJ2dvb2cuYXJyYXknXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FycmF5L2FycmF5X3Rlc3QuanMnLCBbJ2dvb2cuYXJyYXlUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczcnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzLmpzJywgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJ10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRvbS5Ob2RlVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXNzZXJ0cy9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuYXNzZXJ0c1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9hbmltYXRpb25kZWxheS5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvYW5pbWF0aW9uZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5BbmltYXRpb25EZWxheVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9jb25kaXRpb25hbGRlbGF5LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3luYy5EZWxheSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvY29uZGl0aW9uYWxkZWxheV90ZXN0LmpzJywgWydnb29nLmFzeW5jLkNvbmRpdGlvbmFsRGVsYXlUZXN0J10sIFsnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlYm91bmNlci5qcycsIFsnZ29vZy5hc3luYy5EZWJvdW5jZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVib3VuY2VyX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRGVib3VuY2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWJvdW5jZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2RlbGF5LmpzJywgWydnb29nLkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5UaW1lciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvZGVsYXlfdGVzdC5qcycsIFsnZ29vZy5hc3luYy5EZWxheVRlc3QnXSwgWydnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0LmpzJywgWydnb29nLmFzeW5jLkZyZWVMaXN0J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL2ZyZWVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuRnJlZUxpc3RUZXN0J10sIFsnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvbmV4dHRpY2suanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL25leHR0aWNrX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMubmV4dFRpY2tUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuLmpzJywgWydnb29nLmFzeW5jLnJ1biddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cuYXN5bmMubmV4dFRpY2snLCAnZ29vZy5hc3luYy50aHJvd0V4Y2VwdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvcnVuX25leHRfdGlja190ZXN0LmpzJywgWydnb29nLmFzeW5jLnJ1bk5leHRUaWNrVGVzdCddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy9ydW5fdGVzdC5qcycsIFsnZ29vZy5hc3luYy5ydW5UZXN0J10sIFsnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy90aHJvdHRsZS5qcycsIFsnZ29vZy5UaHJvdHRsZScsICdnb29nLmFzeW5jLlRocm90dGxlJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2FzeW5jL3Rocm90dGxlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuVGhyb3R0bGVUZXN0J10sIFsnZ29vZy5hc3luYy5UaHJvdHRsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdhc3luYy93b3JrcXVldWUuanMnLCBbJ2dvb2cuYXN5bmMuV29ya0l0ZW0nLCAnZ29vZy5hc3luYy5Xb3JrUXVldWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYXN5bmMvd29ya3F1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlVGVzdCddLCBbJ2dvb2cuYXN5bmMuV29ya1F1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlLmpzJywgWydnb29nJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnYmFzZV9tb2R1bGVfdGVzdC5qcycsIFsnZ29vZy5iYXNlTW9kdWxlVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy50ZXN0X21vZHVsZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdiYXNlX3Rlc3QuanMnLCBbJ2dvb2cuYmFzZVRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdF9tb2R1bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9hbHBoYS5qcycsIFsnZ29vZy5jb2xvci5hbHBoYSddLCBbJ2dvb2cuY29sb3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NvbG9yL2FscGhhX3Rlc3QuanMnLCBbJ2dvb2cuY29sb3IuYWxwaGFUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNvbG9yLmFscGhhJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvci5qcycsIFsnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLkhzbCcsICdnb29nLmNvbG9yLkhzdicsICdnb29nLmNvbG9yLlJnYiddLCBbJ2dvb2cuY29sb3IubmFtZXMnLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9jb2xvcl90ZXN0LmpzJywgWydnb29nLmNvbG9yVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jb2xvcicsICdnb29nLmNvbG9yLm5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjb2xvci9uYW1lcy5qcycsIFsnZ29vZy5jb2xvci5uYW1lcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Flcy5qcycsIFsnZ29vZy5jcnlwdC5BZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5CbG9ja0NpcGhlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYWVzX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuQWVzVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5BZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2FyYzQuanMnLCBbJ2dvb2cuY3J5cHQuQXJjNCddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYXJjNF90ZXN0LmpzJywgWydnb29nLmNyeXB0LkFyYzRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2U2NC5qcycsIFsnZ29vZy5jcnlwdC5iYXNlNjQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmFzZTY0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZTY0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5iYXNlNjQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuLmpzJywgWydnb29nLmNyeXB0LmJhc2VOJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jhc2VuX3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuYmFzZU5UZXN0J10sIFsnZ29vZy5jcnlwdC5iYXNlTicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlci5qcycsIFsnZ29vZy5jcnlwdC5CbG9iSGFzaGVyJywgJ2dvb2cuY3J5cHQuQmxvYkhhc2hlci5FdmVudFR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcycsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYmxvYmhhc2hlcl90ZXN0LmpzJywgWydnb29nLmNyeXB0LkJsb2JIYXNoZXJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkJsb2JIYXNoZXInLCAnZ29vZy5jcnlwdC5NZDUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2Jsb2NrY2lwaGVyLmpzJywgWydnb29nLmNyeXB0LkJsb2NrQ2lwaGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvYnl0ZXN0cmluZ19wZXJmLmpzJywgWydnb29nLmNyeXB0LmJ5dGVBcnJheVRvU3RyaW5nUGVyZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiYy5qcycsIFsnZ29vZy5jcnlwdC5DYmMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQmxvY2tDaXBoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2NiY190ZXN0LmpzJywgWydnb29nLmNyeXB0LkNiY1Rlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuQWVzJywgJ2dvb2cuY3J5cHQuQ2JjJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdC5qcycsIFsnZ29vZy5jcnlwdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jcnlwdF90ZXN0LmpzJywgWydnb29nLmNyeXB0VGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2N0ci5qcycsIFsnZ29vZy5jcnlwdC5DdHInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9jdHJfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5DdHJUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFlcycsICdnb29nLmNyeXB0LkN0cicsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaC5qcycsIFsnZ29vZy5jcnlwdC5IYXNoJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvaGFzaDMyLmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMiddLCBbJ2dvb2cuY3J5cHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2gzMl90ZXN0LmpzJywgWydnb29nLmNyeXB0Lmhhc2gzMlRlc3QnXSwgWydnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2hhc2h0ZXN0ZXIuanMnLCBbJ2dvb2cuY3J5cHQuaGFzaFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5jcnlwdCcsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZScsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9obWFjLmpzJywgWydnb29nLmNyeXB0LkhtYWMnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L2htYWNfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5IbWFjVGVzdCddLCBbJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnLCAnZ29vZy5jcnlwdC5oYXNoVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDUuanMnLCBbJ2dvb2cuY3J5cHQuTWQ1J10sIFsnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9tZDVfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5NZDVUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0Lk1kNScsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMi5qcycsIFsnZ29vZy5jcnlwdC5wYmtkZjInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuSG1hYycsICdnb29nLmNyeXB0LlNoYTEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3Bia2RmMl90ZXN0LmpzJywgWydnb29nLmNyeXB0LnBia2RmMlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQucGJrZGYyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGExLmpzJywgWydnb29nLmNyeXB0LlNoYTEnXSwgWydnb29nLmNyeXB0Lkhhc2gnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTFfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGExVGVzdCddLCBbJ2dvb2cuY3J5cHQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMi5qcycsIFsnZ29vZy5jcnlwdC5TaGEyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjQuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMjI0J10sIFsnZ29vZy5jcnlwdC5TaGEyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyMjRfdGVzdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyMjRUZXN0J10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LlNoYTIyNCcsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Ni5qcycsIFsnZ29vZy5jcnlwdC5TaGEyNTYnXSwgWydnb29nLmNyeXB0LlNoYTInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTI1Nl90ZXN0LmpzJywgWydnb29nLmNyeXB0LlNoYTI1NlRlc3QnXSwgWydnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMjU2JywgJ2dvb2cuY3J5cHQuaGFzaFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3J5cHQvc2hhMl82NGJpdC5qcycsIFsnZ29vZy5jcnlwdC5TaGEyXzY0Yml0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5IYXNoJywgJ2dvb2cubWF0aC5Mb25nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdjcnlwdC9zaGEyXzY0Yml0X3Rlc3QuanMnLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdF90ZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmNyeXB0JywgJ2dvb2cuY3J5cHQuU2hhMzg0JywgJ2dvb2cuY3J5cHQuU2hhNTEyJywgJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NicsICdnb29nLmNyeXB0Lmhhc2hUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTM4NC5qcycsIFsnZ29vZy5jcnlwdC5TaGEzODQnXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMi5qcycsIFsnZ29vZy5jcnlwdC5TaGE1MTInXSwgWydnb29nLmNyeXB0LlNoYTJfNjRiaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2NyeXB0L3NoYTUxMl8yNTYuanMnLCBbJ2dvb2cuY3J5cHQuU2hhNTEyXzI1NiddLCBbJ2dvb2cuY3J5cHQuU2hhMl82NGJpdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb20uanMnLCBbJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vY3Nzb21fdGVzdC5qcycsIFsnZ29vZy5jc3NvbVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY3Nzb20nLCAnZ29vZy5jc3NvbS5Dc3NSdWxlVHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnY3Nzb20vaWZyYW1lL3N0eWxlLmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmNzc29tJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Nzc29tL2lmcmFtZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZVRlc3QnXSwgWydnb29nLmNzc29tJywgJ2dvb2cuY3Nzb20uaWZyYW1lLnN0eWxlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFtYW5hZ2VyLmpzJywgWydnb29nLmRzLkRhdGFNYW5hZ2VyJ10sIFsnZ29vZy5kcy5CYXNpY05vZGVMaXN0JywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2RhdGFzb3VyY2UuanMnLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuRGF0YU5vZGVMaXN0JywgJ2dvb2cuZHMuRW1wdHlOb2RlTGlzdCcsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuVXRpbCcsICdnb29nLmRzLmxvZ2dlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzRGF0YVNvdXJjZVRlc3QnXSwgWydnb29nLmRvbS54bWwnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkpzRGF0YVNvdXJjZScsICdnb29nLmRzLlNvcnRlZE5vZGVMaXN0JywgJ2dvb2cuZHMuWG1sRGF0YVNvdXJjZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS9leHByLmpzJywgWydnb29nLmRzLkV4cHInXSwgWydnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2V4cHJfdGVzdC5qcycsIFsnZ29vZy5kcy5FeHByVGVzdCddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuSnNEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZS5qcycsIFsnZ29vZy5kcy5BYnN0cmFjdEZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkZhc3RMaXN0Tm9kZScsICdnb29nLmRzLlByaW1pdGl2ZUZhc3REYXRhTm9kZSddLCBbJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5EYXRhTm9kZUxpc3QnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2Zhc3RkYXRhbm9kZV90ZXN0LmpzJywgWydnb29nLmRzLkZhc3REYXRhTm9kZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5FeHByJywgJ2dvb2cuZHMuRmFzdERhdGFOb2RlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Kc1Byb3BlcnR5RGF0YVNvdXJjZSddLCBbJ2dvb2cuZHMuQmFzZURhdGFOb2RlJywgJ2dvb2cuZHMuQmFzaWNOb2RlTGlzdCcsICdnb29nLmRzLkRhdGFNYW5hZ2VyJywgJ2dvb2cuZHMuRGF0YU5vZGUnLCAnZ29vZy5kcy5FbXB0eU5vZGVMaXN0JywgJ2dvb2cuZHMuTG9hZFN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRhc291cmNlL2pzb25kYXRhc291cmNlLmpzJywgWydnb29nLmRzLkpzb25EYXRhU291cmNlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZHMuRGF0YU1hbmFnZXInLCAnZ29vZy5kcy5Kc0RhdGFTb3VyY2UnLCAnZ29vZy5kcy5Mb2FkU3RhdGUnLCAnZ29vZy5kcy5sb2dnZXInLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZS5qcycsIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkZhc3REYXRhTm9kZScsICdnb29nLmRzLkxvYWRTdGF0ZScsICdnb29nLmRzLmxvZ2dlcicsICdnb29nLmV2ZW50cycsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGFzb3VyY2UvanN4bWxodHRwZGF0YXNvdXJjZV90ZXN0LmpzJywgWydnb29nLmRzLkpzWG1sSHR0cERhdGFTb3VyY2VUZXN0J10sIFsnZ29vZy5kcy5Kc1htbEh0dHBEYXRhU291cmNlJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0YXNvdXJjZS94bWxkYXRhc291cmNlLmpzJywgWydnb29nLmRzLlhtbERhdGFTb3VyY2UnLCAnZ29vZy5kcy5YbWxIdHRwRGF0YVNvdXJjZSddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmRzLkJhc2ljTm9kZUxpc3QnLCAnZ29vZy5kcy5EYXRhTWFuYWdlcicsICdnb29nLmRzLkRhdGFOb2RlJywgJ2dvb2cuZHMuTG9hZFN0YXRlJywgJ2dvb2cuZHMubG9nZ2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGUuanMnLCBbJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kYXRlX3Rlc3QuanMnLCBbJ2dvb2cuZGF0ZVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGF0ZScsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5tb250aCcsICdnb29nLmRhdGUud2Vla0RheScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZWxpa2UuanMnLCBbJ2dvb2cuZGF0ZS5EYXRlTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZGF0ZXJhbmdlLmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UuSXRlcmF0b3InLCAnZ29vZy5kYXRlLkRhdGVSYW5nZS5TdGFuZGFyZERhdGVSYW5nZUtleXMnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuSW50ZXJ2YWwnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL2RhdGVyYW5nZV90ZXN0LmpzJywgWydnb29nLmRhdGUuRGF0ZVJhbmdlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RhdGUvZHVyYXRpb24uanMnLCBbJ2dvb2cuZGF0ZS5kdXJhdGlvbiddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uTWVzc2FnZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9kdXJhdGlvbl90ZXN0LmpzJywgWydnb29nLmRhdGUuZHVyYXRpb25UZXN0J10sIFsnZ29vZy5kYXRlLmR1cmF0aW9uJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlLmpzJywgWydnb29nLmRhdGUucmVsYXRpdmUnLCAnZ29vZy5kYXRlLnJlbGF0aXZlLlRpbWVEZWx0YUZvcm1hdHRlcicsICdnb29nLmRhdGUucmVsYXRpdmUuVW5pdCddLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS9yZWxhdGl2ZV90ZXN0LmpzJywgWydnb29nLmRhdGUucmVsYXRpdmVUZXN0J10sIFsnZ29vZy5kYXRlLnJlbGF0aXZlQ29tbW9uVGVzdHMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3JlbGF0aXZlY29tbW9udGVzdHMuanMnLCBbJ2dvb2cuZGF0ZS5yZWxhdGl2ZUNvbW1vblRlc3RzJ10sIFsnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5yZWxhdGl2ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYXRlL3V0Y2RhdGV0aW1lLmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWUnXSwgWydnb29nLmRhdGUnLCAnZ29vZy5kYXRlLkRhdGUnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGF0ZS91dGNkYXRldGltZV90ZXN0LmpzJywgWydnb29nLmRhdGUuVXRjRGF0ZVRpbWVUZXN0J10sIFsnZ29vZy5kYXRlLkludGVydmFsJywgJ2dvb2cuZGF0ZS5VdGNEYXRlVGltZScsICdnb29nLmRhdGUubW9udGgnLCAnZ29vZy5kYXRlLndlZWtEYXknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RiL2N1cnNvci5qcycsIFsnZ29vZy5kYi5DdXJzb3InXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9kYi5qcycsIFsnZ29vZy5kYicsICdnb29nLmRiLkJsb2NrZWRDYWxsYmFjaycsICdnb29nLmRiLlVwZ3JhZGVOZWVkZWRDYWxsYmFjayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5UcmFuc2FjdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvZGJfdGVzdC5qcycsIFsnZ29vZy5kYlRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRiJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5JbmRleGVkRGInLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRiLlRyYW5zYWN0aW9uJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9lcnJvci5qcycsIFsnZ29vZy5kYi5Eb21FcnJvckxpa2UnLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkVycm9yLkVycm9yQ29kZScsICdnb29nLmRiLkVycm9yLkVycm9yTmFtZScsICdnb29nLmRiLkVycm9yLlZlcnNpb25DaGFuZ2VCbG9ja2VkRXJyb3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvaW5kZXguanMnLCBbJ2dvb2cuZGIuSW5kZXgnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuQ3Vyc29yJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5LZXlSYW5nZScsICdnb29nLmRlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9pbmRleGVkZGIuanMnLCBbJ2dvb2cuZGIuSW5kZXhlZERiJ10sIFsnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLk9iamVjdFN0b3JlJywgJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIva2V5cmFuZ2UuanMnLCBbJ2dvb2cuZGIuS2V5UmFuZ2UnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkYi9vYmplY3RzdG9yZS5qcycsIFsnZ29vZy5kYi5PYmplY3RTdG9yZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kYi5DdXJzb3InLCAnZ29vZy5kYi5FcnJvcicsICdnb29nLmRiLkluZGV4JywgJ2dvb2cuZGIuS2V5UmFuZ2UnLCAnZ29vZy5kZWJ1ZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGIvdHJhbnNhY3Rpb24uanMnLCBbJ2dvb2cuZGIuVHJhbnNhY3Rpb24nLCAnZ29vZy5kYi5UcmFuc2FjdGlvbi5UcmFuc2FjdGlvbk1vZGUnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGIuRXJyb3InLCAnZ29vZy5kYi5PYmplY3RTdG9yZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuQ29uc29sZSddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2NvbnNvbGVfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Db25zb2xlVGVzdCddLCBbJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RlYnVnLmpzJywgWydnb29nLmRlYnVnJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWdfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Z1Rlc3QnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuZXJyb3Jjb250ZXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZWJ1Z3dpbmRvdy5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvdyddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZGVidWd3aW5kb3dfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5EZWJ1Z1dpbmRvd1Rlc3QnXSwgWydnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzLmpzJywgWydnb29nLmRlYnVnLkRldkNzcycsICdnb29nLmRlYnVnLkRldkNzcy5Vc2VyQWdlbnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jc3NvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9kZXZjc3MvZGV2Y3NzX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRGV2Q3NzVGVzdCddLCBbJ2dvb2cuZGVidWcuRGV2Q3NzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RldmNzcy9kZXZjc3NydW5uZXIuanMnLCBbJ2dvb2cuZGVidWcuZGV2Q3NzUnVubmVyJ10sIFsnZ29vZy5kZWJ1Zy5EZXZDc3MnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2RpdmNvbnNvbGUuanMnLCBbJ2dvb2cuZGVidWcuRGl2Q29uc29sZSddLCBbJ2dvb2cuZGVidWcuSHRtbEZvcm1hdHRlcicsICdnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VuaGFuY2VlcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnRW5oYW5jZUVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2VudHJ5cG9pbnRyZWdpc3RyeS5qcycsIFsnZ29vZy5kZWJ1Zy5FbnRyeVBvaW50TW9uaXRvcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeSddLCBbJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZW50cnlwb2ludHJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5VGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvci5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yVGVzdCddLCBbJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3Jjb250ZXh0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Vycm9yY29udGV4dF90ZXN0LmpzJywgWydnb29nLmRlYnVnLmVycm9yY29udGV4dFRlc3QnXSwgWydnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlci5Qcm90ZWN0ZWRGdW5jdGlvbkVycm9yJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLlRyYWNlJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JoYW5kbGVyX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyQXN5bmNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcmhhbmRsZXJ3ZWFrZGVwLmpzJywgWydnb29nLmRlYnVnLmVycm9ySGFuZGxlcldlYWtEZXAnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9lcnJvcnJlcG9ydGVyLmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5FcnJvclJlcG9ydGVyLkV4Y2VwdGlvbkV2ZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmRlYnVnLmVycm9yY29udGV4dCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmxvZycsICdnb29nLm5ldC5YaHJJbycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVyaS51dGlscycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZXJyb3JyZXBvcnRlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvcicsICdnb29nLmRlYnVnLkVycm9yUmVwb3J0ZXInLCAnZ29vZy5kZWJ1Zy5lcnJvcmNvbnRleHQnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZmFuY3l3aW5kb3cuanMnLCBbJ2dvb2cuZGVidWcuRmFuY3lXaW5kb3cnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLkRlYnVnV2luZG93JywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2Zvcm1hdHRlci5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXInLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuVGV4dEZvcm1hdHRlciddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5SZWxhdGl2ZVRpbWVQcm92aWRlcicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9mb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Gb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheS5qcycsIFsnZ29vZy5kZWJ1Zy5GcHNEaXNwbGF5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvZnBzZGlzcGxheV90ZXN0LmpzJywgWydnb29nLmRlYnVnLkZwc0Rpc3BsYXlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRlYnVnLkZwc0Rpc3BsYXknLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXIuanMnLCBbJ2dvb2cuZGVidWcuTG9nQnVmZmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2didWZmZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dCdWZmZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL2xvZ2dlci5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2FibGUnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5kZWJ1Zy5Mb2dnZXIuTGV2ZWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nQnVmZmVyJywgJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dnZXJfdGVzdC5qcycsIFsnZ29vZy5kZWJ1Zy5Mb2dnZXJUZXN0J10sIFsnZ29vZy5kZWJ1Zy5Mb2dNYW5hZ2VyJywgJ2dvb2cuZGVidWcuTG9nZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmQuanMnLCBbJ2dvb2cuZGVidWcuTG9nUmVjb3JkJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvbG9ncmVjb3Jkc2VyaWFsaXplci5qcycsIFsnZ29vZy5kZWJ1Zy5sb2dSZWNvcmRTZXJpYWxpemVyJ10sIFsnZ29vZy5kZWJ1Zy5Mb2dSZWNvcmQnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWJ1Zy9sb2dyZWNvcmRzZXJpYWxpemVyX3Rlc3QuanMnLCBbJ2dvb2cuZGVidWcubG9nUmVjb3JkU2VyaWFsaXplclRlc3QnXSwgWydnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmRlYnVnLmxvZ1JlY29yZFNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3JlbGF0aXZldGltZXByb3ZpZGVyLmpzJywgWydnb29nLmRlYnVnLlJlbGF0aXZlVGltZVByb3ZpZGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVidWcvdHJhY2VyLmpzJywgWydnb29nLmRlYnVnLlN0b3BUcmFjZURldGFpbCcsICdnb29nLmRlYnVnLlRyYWNlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5pdGVyJywgJ2dvb2cubG9nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlYnVnL3RyYWNlcl90ZXN0LmpzJywgWydnb29nLmRlYnVnLlRyYWNlVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5UcmFjZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlZmluZWNsYXNzX3Rlc3QuanMnLCBbJ2dvb2cuZGVmaW5lQ2xhc3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RlbGVnYXRlL2RlbGVnYXRlcmVnaXN0cnkuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXJlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZGVsZWdhdGUuRGVsZWdhdGVSZWdpc3RyeScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZGVsZWdhdGUvZGVsZWdhdGVzLmpzJywgWydnb29nLmRlbGVnYXRlLmRlbGVnYXRlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkZWxlZ2F0ZS9kZWxlZ2F0ZXNfdGVzdC5qcycsIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXNUZXN0J10sIFsnZ29vZy5kZWxlZ2F0ZS5kZWxlZ2F0ZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGUuanMnLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kaXNwb3NlQWxsJ10sIFsnZ29vZy5kaXNwb3NhYmxlLklEaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkaXNwb3NhYmxlL2Rpc3Bvc2FibGVfdGVzdC5qcycsIFsnZ29vZy5EaXNwb3NhYmxlVGVzdCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Rpc3Bvc2FibGUvaWRpc3Bvc2FibGUuanMnLCBbJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdG11bHRpcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLkFic3RyYWN0TXVsdGlSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uUmFuZ2VUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYWJzdHJhY3RyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2FuaW1hdGlvbmZyYW1lL2FuaW1hdGlvbmZyYW1lLmpzJywgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLmRvbS5hbmltYXRpb25GcmFtZS5TcGVjJywgJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLlN0YXRlJ10sIFsnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUucG9seWZpbGwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbmltYXRpb25mcmFtZS9hbmltYXRpb25mcmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5BbmltYXRpb25GcmFtZVRlc3QnXSwgWydnb29nLmRvbS5hbmltYXRpb25GcmFtZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYW5pbWF0aW9uZnJhbWUvcG9seWZpbGwuanMnLCBbJ2dvb2cuZG9tLmFuaW1hdGlvbkZyYW1lLnBvbHlmaWxsJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZS5qcycsIFsnZ29vZy5kb20uYW5ub3RhdGUnLCAnZ29vZy5kb20uYW5ub3RhdGUuQW5ub3RhdGVGbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hbm5vdGF0ZV90ZXN0LmpzJywgWydnb29nLmRvbS5hbm5vdGF0ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmFubm90YXRlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Fzc2VydHMuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHMnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmFzc2VydHNUZXN0J10sIFsnZ29vZy5kb20uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2F0dHIuanMnLCBbJ2dvb2cuZG9tLkF0dHInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VyZmVhdHVyZV90ZXN0LmpzJywgWydnb29nLmRvbS5Ccm93c2VyRmVhdHVyZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9hYnN0cmFjdHJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnJvd3NlcnJhbmdlL2Jyb3dzZXJyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5FcnJvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5HZWNrb1JhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5JZVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5PcGVyYVJhbmdlJywgJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuV2ViS2l0UmFuZ2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvYnJvd3NlcnJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvZ2Vja29yYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkdlY2tvUmFuZ2UnXSwgWydnb29nLmRvbS5icm93c2VycmFuZ2UuVzNjUmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2UvaWVyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkllUmFuZ2UnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5icm93c2VycmFuZ2UuQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS9vcGVyYXJhbmdlLmpzJywgWydnb29nLmRvbS5icm93c2VycmFuZ2UuT3BlcmFSYW5nZSddLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XM2NSYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2Jyb3dzZXJyYW5nZS93M2NyYW5nZS5qcycsIFsnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9icm93c2VycmFuZ2Uvd2Via2l0cmFuZ2UuanMnLCBbJ2dvb2cuZG9tLmJyb3dzZXJyYW5nZS5XZWJLaXRSYW5nZSddLCBbJ2dvb2cuZG9tLlJhbmdlRW5kcG9pbnQnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlLlczY1JhbmdlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vYnVmZmVyZWR2aWV3cG9ydHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5CdWZmZXJlZFZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9idWZmZXJlZHZpZXdwb3J0c2l6ZW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uQnVmZmVyZWRWaWV3cG9ydFNpemVNb25pdG9yVGVzdCddLCBbJ2dvb2cuZG9tLkJ1ZmZlcmVkVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmRvbS5WaWV3cG9ydFNpemVNb25pdG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NsYXNzZXMuanMnLCBbJ2dvb2cuZG9tLmNsYXNzZXMnXSwgWydnb29nLmFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vY2xhc3Nlc190ZXN0LmpzJywgWydnb29nLmRvbS5jbGFzc2VzX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3QuanMnLCBbJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9jbGFzc2xpc3RfdGVzdC5qcycsIFsnZ29vZy5kb20uY2xhc3NsaXN0X3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZS5qcycsIFsnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLkNvbnRyb2xSYW5nZUl0ZXJhdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdE11bHRpUmFuZ2UnLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5SYW5nZUl0ZXJhdG9yJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2NvbnRyb2xyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5Db250cm9sUmFuZ2VUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQ29udHJvbFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRleHRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldC5qcycsIFsnZ29vZy5kb20uZGF0YXNldCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZGF0YXNldF90ZXN0LmpzJywgWydnb29nLmRvbS5kYXRhc2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmRhdGFzZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9kb20uanMnLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFwcGVuZGFibGUnLCAnZ29vZy5kb20uRG9tSGVscGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV9jb21waWxlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkRvbUNvbXBpbGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2RvbV90ZXN0LmpzJywgWydnb29nLmRvbS5kb21fdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yLmpzJywgWydnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uRm9udFNpemVNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9udHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLkZvbnRTaXplTW9uaXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Gb250U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXMuanMnLCBbJ2dvb2cuZG9tLmZvcm1zJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cud2luZG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vZm9ybXNfdGVzdC5qcycsIFsnZ29vZy5kb20uZm9ybXNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uZm9ybXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuLmpzJywgWydnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cuZG9tLmZ1bGxzY3JlZW4uRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9mdWxsc2NyZWVuX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLmZ1bGxzY3JlZW5fdGVzdCddLCBbJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5mdWxsc2NyZWVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaHRtbGVsZW1lbnQuanMnLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lmcmFtZS5qcycsIFsnZ29vZy5kb20uaWZyYW1lJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9pZnJhbWVfdGVzdC5qcycsIFsnZ29vZy5kb20uaWZyYW1lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZS5qcycsIFsnZ29vZy5kb20uSW5wdXRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2lucHV0dHlwZV90ZXN0LmpzJywgWydnb29nLmRvbS5JbnB1dFR5cGVUZXN0J10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vaXRlci5qcycsIFsnZ29vZy5kb20uaXRlci5BbmNlc3Rvckl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuQ2hpbGRJdGVyYXRvcicsICdnb29nLmRvbS5pdGVyLlNpYmxpbmdJdGVyYXRvciddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL2l0ZXJfdGVzdC5qcycsIFsnZ29vZy5kb20uaXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5pdGVyLkFuY2VzdG9ySXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5DaGlsZEl0ZXJhdG9yJywgJ2dvb2cuZG9tLml0ZXIuU2libGluZ0l0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9tdWx0aXJhbmdlLmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RNdWx0aVJhbmdlJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uU2F2ZWRSYW5nZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbXVsdGlyYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5NdWx0aVJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk11bHRpUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5pdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3InXSwgWydnb29nLmRvbS5UYWdJdGVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL25vZGVpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5Ob2RlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZUl0ZXJhdG9yJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0LmpzJywgWydnb29nLmRvbS5Ob2RlT2Zmc2V0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9ub2Rlb2Zmc2V0X3Rlc3QuanMnLCBbJ2dvb2cuZG9tLk5vZGVPZmZzZXRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vbm9kZXR5cGUuanMnLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vYWJzdHJhY3RwYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLkFic3RyYWN0UGF0dGVybiddLCBbJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9hbGxjaGlsZHJlbi5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5BbGxDaGlsZHJlbiddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9jYWxsYmFjay9jYWxsYmFjay5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svY291bnRlci5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5Db3VudGVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vY2FsbGJhY2svdGVzdC5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0J10sIFsnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2NoaWxkbWF0Y2hlcy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnXSwgWydnb29nLmRvbS5wYXR0ZXJuLkFsbENoaWxkcmVuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9lbmR0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRW5kVGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL2Z1bGx0YWcuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uRnVsbFRhZyddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uU3RhcnRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL21hdGNoZXIuanMnLCBbJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hlciddLCBbJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLm1hdGNoZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5wYXR0ZXJuLkVuZFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLkZ1bGxUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaGVyJywgJ2dvb2cuZG9tLnBhdHRlcm4uUmVwZWF0JywgJ2dvb2cuZG9tLnBhdHRlcm4uU2VxdWVuY2UnLCAnZ29vZy5kb20ucGF0dGVybi5TdGFydFRhZycsICdnb29nLmRvbS5wYXR0ZXJuLmNhbGxiYWNrLkNvdW50ZXInLCAnZ29vZy5kb20ucGF0dGVybi5jYWxsYmFjay5UZXN0JywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9ub2RldHlwZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5Ob2RlVHlwZSddLCBbJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9wYXR0ZXJuLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcGF0dGVybl90ZXN0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWxsQ2hpbGRyZW4nLCAnZ29vZy5kb20ucGF0dGVybi5DaGlsZE1hdGNoZXMnLCAnZ29vZy5kb20ucGF0dGVybi5FbmRUYWcnLCAnZ29vZy5kb20ucGF0dGVybi5GdWxsVGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uTm9kZVR5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5SZXBlYXQnLCAnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZScsICdnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJywgJ2dvb2cuZG9tLnBhdHRlcm4uVGV4dCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3BhdHRlcm4vcmVwZWF0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlJlcGVhdCddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi9zZXF1ZW5jZS5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5TZXF1ZW5jZSddLCBbJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLnBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5BYnN0cmFjdFBhdHRlcm4nLCAnZ29vZy5kb20ucGF0dGVybi5NYXRjaFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3N0YXJ0dGFnLmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlN0YXJ0VGFnJ10sIFsnZ29vZy5kb20uVGFnV2Fsa1R5cGUnLCAnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9wYXR0ZXJuL3RhZy5qcycsIFsnZ29vZy5kb20ucGF0dGVybi5UYWcnXSwgWydnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcGF0dGVybi90ZXh0LmpzJywgWydnb29nLmRvbS5wYXR0ZXJuLlRleHQnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5wYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uQWJzdHJhY3RQYXR0ZXJuJywgJ2dvb2cuZG9tLnBhdHRlcm4uTWF0Y2hUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vcmFuZ2UuanMnLCBbJ2dvb2cuZG9tLlJhbmdlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLmRvbS5Ccm93c2VyRmVhdHVyZScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uTXVsdGlSYW5nZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZV90ZXN0LmpzJywgWydnb29nLmRvbS5SYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2UnLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9yYW5nZWVuZHBvaW50LmpzJywgWydnb29nLmRvbS5SYW5nZUVuZHBvaW50J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhZmUuanMnLCBbJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbiddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2FmZV90ZXN0LmpzJywgWydnb29nLmRvbS5zYWZlVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5kb20uc2FmZS5JbnNlcnRBZGphY2VudEh0bWxQb3NpdGlvbicsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkY2FyZXRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS9zYXZlZGNhcmV0cmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRDYXJldFJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2F2ZWRyYW5nZS5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NhdmVkcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5kb20uU2F2ZWRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3NlbGVjdGlvbi5qcycsIFsnZ29vZy5kb20uc2VsZWN0aW9uJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vc2VsZWN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnNlbGVjdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvci5qcycsIFsnZ29vZy5kb20uVGFnSXRlcmF0b3InLCAnZ29vZy5kb20uVGFnV2Fsa1R5cGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdpdGVyYXRvcl90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdJdGVyYXRvclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZS5qcycsIFsnZ29vZy5kb20uVGFnTmFtZSddLCBbJ2dvb2cuZG9tLkh0bWxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGFnbmFtZV90ZXN0LmpzJywgWydnb29nLmRvbS5UYWdOYW1lVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzLmpzJywgWydnb29nLmRvbS50YWdzJ10sIFsnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS90YWdzX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnRhZ3NUZXN0J10sIFsnZ29vZy5kb20udGFncycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnQuanMnLCBbJ2dvb2cuZG9tLnRleHRBc3NlcnQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRhc3NlcnRfdGVzdC5qcycsIFsnZ29vZy5kb20udGV4dGFzc2VydF90ZXN0J10sIFsnZ29vZy5kb20udGV4dEFzc2VydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZS5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLlJhbmdlVHlwZScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3InLCAnZ29vZy5kb20uYnJvd3NlcnJhbmdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlRleHRSYW5nZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Db250cm9sUmFuZ2UnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGV4dFJhbmdlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3RleHRyYW5nZWl0ZXJhdG9yLmpzJywgWydnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2VJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdGV4dHJhbmdlaXRlcmF0b3JfdGVzdC5qcycsIFsnZ29vZy5kb20uVGV4dFJhbmdlSXRlcmF0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5UZXh0UmFuZ2VJdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdXJpLmpzJywgWydnb29nLmRvbS51cmknXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3VyaV90ZXN0LmpzJywgWydnb29nLmRvbS51cmlUZXN0J10sIFsnZ29vZy5kb20udXJpJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92ZW5kb3IuanMnLCBbJ2dvb2cuZG9tLnZlbmRvciddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdkb20vdmVuZG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLnZlbmRvclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3ZpZXdwb3J0c2l6ZW1vbml0b3IuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS92aWV3cG9ydHNpemVtb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20uVmlld3BvcnRTaXplTW9uaXRvcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZG9tL3htbC5qcycsIFsnZ29vZy5kb20ueG1sJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2RvbS94bWxfdGVzdC5qcycsIFsnZ29vZy5kb20ueG1sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20ueG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvYnJvd3NlcmZlYXR1cmUuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJ10sIFsnZ29vZy5lZGl0b3IuZGVmaW5lcycsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2Jyb3dzZXJmZWF0dXJlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXIuanMnLCBbJ2dvb2cuZWRpdG9yLkNsaWNrVG9FZGl0V3JhcHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jbGlja3RvZWRpdHdyYXBwZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ2xpY2tUb0VkaXRXcmFwcGVyJywgJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvY29tbWFuZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29tbWFuZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZC5qcycsIFsnZ29vZy5lZGl0b3IuQ29udGVudEVkaXRhYmxlRmllbGQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9jb250ZW50ZWRpdGFibGVmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db250ZW50RWRpdGFibGVGaWVsZCcsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9kZWZpbmVzLmpzJywgWydnb29nLmVkaXRvci5kZWZpbmVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ZpZWxkLmpzJywgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5GaWVsZC5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvZmllbGRfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuZmllbGRfdGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1cy5qcycsIFsnZ29vZy5lZGl0b3IuZm9jdXMnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9mb2N1c190ZXN0LmpzJywgWydnb29nLmVkaXRvci5mb2N1c1Rlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9pY29udGVudC5qcycsIFsnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2ljb250ZW50X3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLmljb250ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvbGluay5qcycsIFsnZ29vZy5lZGl0b3IuTGluayddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL2xpbmtfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuTGlua1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlLmpzJywgWydnb29nLmVkaXRvci5ub2RlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pdGVyLkNoaWxkSXRlcmF0b3InLCAnZ29vZy5kb20uaXRlci5TaWJsaW5nSXRlcmF0b3InLCAnZ29vZy5pdGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9ub2RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLm5vZGVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5QbHVnaW4nXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW5JbXBsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2luX2ltcGwuanMnLCBbJ2dvb2cuZWRpdG9yLlBsdWdpbkltcGwnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IuUGx1Z2luVGVzdCddLCBbJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW4uanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RidWJibGVwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdEJ1YmJsZVBsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdGRpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0RGlhbG9nUGx1Z2luLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmV2ZW50cycsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvYWJzdHJhY3RkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5TYXZlZFJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdERpYWxvZ1BsdWdpbicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9hYnN0cmFjdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5BYnN0cmFjdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9iYXNpY3RleHRmb3JtYXR0ZXIuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmFzaWNUZXh0Rm9ybWF0dGVyLkNPTU1BTkQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLmxvZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Jhc2ljdGV4dGZvcm1hdHRlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CYXNpY1RleHRGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkJsb2NrcXVvdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9ibG9ja3F1b3RlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQmxvY2txdW90ZScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2Vtb3RpY29ucy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnMnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbW90aWNvbnNfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbW90aWNvbnNUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW1vdGljb25zJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2VudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlT2Zmc2V0JywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5FbnRlckhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5CbG9ja3F1b3RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmcuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnXSwgWydnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5pMThuLmJpZGknLCAnZ29vZy5pMThuLnVDaGFyJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvZmlyc3RzdHJvbmdfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5GaXJzdFN0cm9uZ1Rlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRmlyc3RTdHJvbmcnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvaGVhZGVyZm9ybWF0dGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlciddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9oZWFkZXJmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5IZWFkZXJGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkhlYWRlckZvcm1hdHRlcicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGUuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUuQWN0aW9uJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0QnViYmxlUGx1Z2luJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtidWJibGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rQnViYmxlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5MaW5rJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlua0J1YmJsZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua2RpYWxvZ3BsdWdpbi5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nUGx1Z2luJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3REaWFsb2dQbHVnaW4nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpbmtkaWFsb2dwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IucGx1Z2lucy5MaW5rRGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtEaWFsb2dQbHVnaW4nLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcuZWRpdG9yLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlua3Nob3J0Y3V0cGx1Z2luLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtTaG9ydGN1dFBsdWdpbiddLCBbJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9saW5rc2hvcnRjdXRwbHVnaW5fdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW5UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5wbHVnaW5zLkJhc2ljVGV4dEZvcm1hdHRlcicsICdnb29nLmVkaXRvci5wbHVnaW5zLkxpbmtCdWJibGUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5MaW5rU2hvcnRjdXRQbHVnaW4nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL2xpc3R0YWJoYW5kbGVyLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLkxpc3RUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RUYWJIYW5kbGVyJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbGlzdHRhYmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5MaXN0VGFiSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTGlzdFRhYkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuRmllbGRNb2NrJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvbG9yZW1pcHN1bS5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZWRpdG9yLkNvbW1hbmQnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuUGx1Z2luJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy9sb3JlbWlwc3VtX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuTG9yZW1JcHN1bScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZy5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5SZW1vdmVGb3JtYXR0aW5nJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5QbHVnaW4nLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmVkaXRvci5yYW5nZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvcmVtb3ZlZm9ybWF0dGluZ190ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5wbHVnaW5zLlJlbW92ZUZvcm1hdHRpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5wbHVnaW5zLkFic3RyYWN0VGFiSGFuZGxlcicsICdnb29nLmVkaXRvci5yYW5nZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvc3BhY2VzdGFiaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlNwYWNlc1RhYkhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5TcGFjZXNUYWJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLkZpZWxkTW9jaycsICdnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3RhYmxlZWRpdG9yLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5UYWJsZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWJsZWVkaXRvcl90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlRhYmxlRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWJsZUVkaXRvcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy90YWdvbmVudGVyaGFuZGxlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQ29tbWFuZCcsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuRW50ZXJIYW5kbGVyJywgJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdGFnb25lbnRlcmhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5UYWdPbkVudGVySGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5wbHVnaW5zLlRhZ09uRW50ZXJIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZU9mZnNldCcsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuZWRpdG9yLkZpZWxkJywgJ2dvb2cuZWRpdG9yLlBsdWdpbicsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9NYW5hZ2VyJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9TdGF0ZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG9UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5icm93c2VycmFuZ2UnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5Mb3JlbUlwc3VtJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuVW5kb1JlZG8nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci9wbHVnaW5zL3VuZG9yZWRvbWFuYWdlci5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb21hbmFnZXJfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXJUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb01hbmFnZXInLCAnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcGx1Z2lucy91bmRvcmVkb3N0YXRlLmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3BsdWdpbnMvdW5kb3JlZG9zdGF0ZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5wbHVnaW5zLlVuZG9SZWRvU3RhdGVUZXN0J10sIFsnZ29vZy5lZGl0b3IucGx1Z2lucy5VbmRvUmVkb1N0YXRlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvcmFuZ2UuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlJywgJ2dvb2cuZWRpdG9yLnJhbmdlLlBvaW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5SYW5nZUVuZHBvaW50JywgJ2dvb2cuZG9tLlNhdmVkQ2FyZXRSYW5nZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuaXRlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3JhbmdlX3Rlc3QuanMnLCBbJ2dvb2cuZWRpdG9yLnJhbmdlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IucmFuZ2UnLCAnZ29vZy5lZGl0b3IucmFuZ2UuUG9pbnQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3NlYW1sZXNzZmllbGQuanMnLCBbJ2dvb2cuZWRpdG9yLlNlYW1sZXNzRmllbGQnXSwgWydnb29nLmNzc29tLmlmcmFtZS5zdHlsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuRmllbGQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQnLCAnZ29vZy5lZGl0b3IuaWNvbnRlbnQuRmllbGRGb3JtYXRJbmZvJywgJ2dvb2cuZWRpdG9yLmljb250ZW50LkZpZWxkU3R5bGVJbmZvJywgJ2dvb2cuZWRpdG9yLm5vZGUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnN0eWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc2VhbWxlc3NmaWVsZF90ZXN0LmpzJywgWydnb29nLmVkaXRvci5zZWFtbGVzc2ZpZWxkX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uUmFuZ2UnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmVkaXRvci5TZWFtbGVzc0ZpZWxkJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tSYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZWRpdG9yL3N0eWxlLmpzJywgWydnb29nLmVkaXRvci5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3Ivc3R5bGVfdGVzdC5qcycsIFsnZ29vZy5lZGl0b3Iuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5zdHlsZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdlZGl0b3IvdGFibGUuanMnLCBbJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cuZWRpdG9yLlRhYmxlQ2VsbCcsICdnb29nLmVkaXRvci5UYWJsZVJvdyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Vbmljb2RlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2VkaXRvci90YWJsZV90ZXN0LmpzJywgWydnb29nLmVkaXRvci5UYWJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZWRpdG9yLlRhYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRXcmFwcGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uZXZlbnR3cmFwcGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLmFjdGlvbkV2ZW50V3JhcHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5hY3Rpb25FdmVudFdyYXBwZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2FjdGlvbmhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkFjdGlvbkV2ZW50JywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy5ldmVudHMuQWN0aW9uSGFuZGxlci5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuQmVmb3JlQWN0aW9uRXZlbnQnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvYWN0aW9uaGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5BY3Rpb25IYW5kbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkFjdGlvbkhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJldmVudC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudC5Nb3VzZUJ1dHRvbicsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnJlZmxlY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9icm93c2VyZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2Jyb3dzZXJmZWF0dXJlLmpzJywgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZSddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnQuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50TGlrZSddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmV2ZW50cy5FdmVudElkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlclRlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnRpZC5qcycsIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHMuanMnLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkNhcHR1cmVTaW11bGF0aW9uTW9kZScsICdnb29nLmV2ZW50cy5LZXknLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVR5cGUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuTGlzdGVuZXJNYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHNUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cuZGVidWcuRW50cnlQb2ludE1vbml0b3InLCAnZ29vZy5kZWJ1Zy5FcnJvckhhbmRsZXInLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5DYXB0dXJlU2ltdWxhdGlvbk1vZGUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0X3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0VGVzdCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9ldmVudHRhcmdldF92aWFfZ29vZ2V2ZW50c190ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldEdvb2dFdmVudHNUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuZXZlbnRUYXJnZXRUZXN0ZXInLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0YXJnZXRfdmlhX3czY2ludGVyZmFjZV90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldFczQ1Rlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2V2ZW50dGFyZ2V0dGVzdGVyLmpzJywgWydnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLk1vdXNlRXZlbnRzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc01vdXNlRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJBc1RvdWNoRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyVG91Y2hGYWxsYmFja0V2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR0eXBlX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZVRlc3QnXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRmVhdHVyZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuUG9pbnRlckZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJUb3VjaEZhbGxiYWNrRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZXZlbnR3cmFwcGVyLmpzJywgWydnb29nLmV2ZW50cy5FdmVudFdyYXBwZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZmlsZWRyb3BoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5GaWxlRHJvcEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9maWxlZHJvcGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRmlsZURyb3BIYW5kbGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvZm9jdXNoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Gb2N1c0hhbmRsZXInLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2ltZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW1lSGFuZGxlci5FdmVudCcsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9pbWVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLkltZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5JbWVIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlci5FdmVudFR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2tleWNvZGVzLmpzJywgWydnb29nLmV2ZW50cy5LZXlDb2RlcyddLCBbJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5Y29kZXNfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuS2V5Q29kZXNUZXN0J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5aGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXloYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLktleUV2ZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9rZXluYW1lcy5qcycsIFsnZ29vZy5ldmVudHMuS2V5TmFtZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMva2V5cy5qcycsIFsnZ29vZy5ldmVudHMuS2V5cyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuYWJsZS5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlS2V5J10sIFsnZ29vZy5ldmVudHMuRXZlbnRJZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmFibGVfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZVRlc3QnXSwgWydnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbGlzdGVuZXIuanMnLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmVyJ10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZUtleSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL2xpc3RlbmVybWFwLmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuTGlzdGVuZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9saXN0ZW5lcm1hcF90ZXN0LmpzJywgWydnb29nLmV2ZW50cy5MaXN0ZW5lck1hcFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5MaXN0ZW5lck1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL21vdXNld2hlZWxoYW5kbGVyLmpzJywgWydnb29nLmV2ZW50cy5Nb3VzZVdoZWVsRXZlbnQnLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXInLCAnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubWF0aCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvbW91c2V3aGVlbGhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy5ldmVudHMuTW91c2VXaGVlbEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5Nb3VzZVdoZWVsSGFuZGxlcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy5ldmVudHMuT25saW5lSGFuZGxlcicsICdnb29nLmV2ZW50cy5PbmxpbmVIYW5kbGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZXZlbnRzL29ubGluZWxpc3RlbmVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy9wYXN0ZWhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLmV2ZW50cy5QYXN0ZUhhbmRsZXIuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlci5TdGF0ZSddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5Db25kaXRpb25hbERlbGF5JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubG9nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvcGFzdGVoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBhc3RlSGFuZGxlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxldmVudC5qcycsIFsnZ29vZy5ldmVudHMuV2hlZWxFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2V2ZW50cy93aGVlbGhhbmRsZXIuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLldoZWVsRXZlbnQnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdldmVudHMvd2hlZWxoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cuZXZlbnRzLldoZWVsSGFuZGxlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuV2hlZWxFdmVudCcsICdnb29nLmV2ZW50cy5XaGVlbEhhbmRsZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2VtYWlsYWRkcmVzcy5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9lbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0LmpzJywgWydnb29nLmZvcm1hdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mb3JtYXQnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlci5qcycsIFsnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXInLCAnZ29vZy5mb3JtYXQuSHRtbFByZXR0eVByaW50ZXIuQnVmZmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Zvcm1hdC9odG1scHJldHR5cHJpbnRlcl90ZXN0LmpzJywgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlclRlc3QnXSwgWydnb29nLmZvcm1hdC5IdG1sUHJldHR5UHJpbnRlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3MuanMnLCBbJ2dvb2cuZm9ybWF0LkludGVybmF0aW9uYWxpemVkRW1haWxBZGRyZXNzJ10sIFsnZ29vZy5mb3JtYXQuRW1haWxBZGRyZXNzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmb3JtYXQvaW50ZXJuYXRpb25hbGl6ZWRlbWFpbGFkZHJlc3NfdGVzdC5qcycsIFsnZ29vZy5mb3JtYXQuSW50ZXJuYXRpb25hbGl6ZWRFbWFpbEFkZHJlc3NUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmZvcm1hdC5JbnRlcm5hdGlvbmFsaXplZEVtYWlsQWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyLmpzJywgWydnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlcicsICdnb29nLmZvcm1hdC5Kc29uUHJldHR5UHJpbnRlci5TYWZlSHRtbERlbGltaXRlcnMnLCAnZ29vZy5mb3JtYXQuSnNvblByZXR0eVByaW50ZXIuVGV4dERlbGltaXRlcnMnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLmZvcm1hdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZm9ybWF0L2pzb25wcmV0dHlwcmludGVyX3Rlc3QuanMnLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyVGVzdCddLCBbJ2dvb2cuZm9ybWF0Lkpzb25QcmV0dHlQcmludGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeS5qcycsIFsnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5LkJlaGF2aW9yJywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5GaWxlRW50cnknXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9lbnRyeWltcGwuanMnLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZUVudHJ5SW1wbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVFbnRyeScsICdnb29nLmZzLkZpbGVXcml0ZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2Vycm9yLmpzJywgWydnb29nLmZzLkRPTUVycm9yTGlrZScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRXJyb3IuRXJyb3JDb2RlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL2ZpbGVyZWFkZXIuanMnLCBbJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVSZWFkZXIuRXZlbnRUeXBlJywgJ2dvb2cuZnMuRmlsZVJlYWRlci5SZWFkeVN0YXRlJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXNhdmVyLmpzJywgWydnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLmZzLkZpbGVTYXZlci5FdmVudFR5cGUnLCAnZ29vZy5mcy5GaWxlU2F2ZXIuUmVhZHlTdGF0ZSddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtLmpzJywgWydnb29nLmZzLkZpbGVTeXN0ZW0nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmcy9maWxlc3lzdGVtaW1wbC5qcycsIFsnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCddLCBbJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnlJbXBsJywgJ2dvb2cuZnMuRmlsZVN5c3RlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZmlsZXdyaXRlci5qcycsIFsnZ29vZy5mcy5GaWxlV3JpdGVyJ10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnMuanMnLCBbJ2dvb2cuZnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5mcy5GaWxlU3lzdGVtSW1wbCcsICdnb29nLmZzLnVybCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvZnNfdGVzdC5qcycsIFsnZ29vZy5mc1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVJlYWRlcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvcHJvZ3Jlc3NldmVudC5qcycsIFsnZ29vZy5mcy5Qcm9ncmVzc0V2ZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2ZzL3VybC5qcycsIFsnZ29vZy5mcy51cmwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZnMvdXJsX3Rlc3QuanMnLCBbJ2dvb2cudXJsVGVzdCddLCBbJ2dvb2cuZnMudXJsJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zLmpzJywgWydnb29nLmZ1bmN0aW9ucyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmdW5jdGlvbnMvZnVuY3Rpb25zX3Rlc3QuanMnLCBbJ2dvb2cuZnVuY3Rpb25zVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ0Ryb3BFdmVudCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Fic3RyYWN0ZHJhZ2Ryb3BfdGVzdC5qcycsIFsnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BYnN0cmFjdERyYWdEcm9wJywgJ2dvb2cuZnguRHJhZ0Ryb3BJdGVtJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW0vYW5pbS5qcycsIFsnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCBbJ2dvb2cuYXN5bmMuQW5pbWF0aW9uRGVsYXknLCAnZ29vZy5hc3luYy5EZWxheScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbS9hbmltX3Rlc3QuanMnLCBbJ2dvb2cuZnguYW5pbVRlc3QnXSwgWydnb29nLmFzeW5jLkFuaW1hdGlvbkRlbGF5JywgJ2dvb2cuYXN5bmMuRGVsYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5hbmltJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9hbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguQW5pbWF0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LkFuaW1hdGlvbi5TdGF0ZScsICdnb29nLmZ4LkFuaW1hdGlvbkV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5meC5hbmltJywgJ2dvb2cuZnguYW5pbS5BbmltYXRlZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvYW5pbWF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlLmpzJywgWydnb29nLmZ4LkFuaW1hdGlvblBhcmFsbGVsUXVldWUnLCAnZ29vZy5meC5BbmltYXRpb25RdWV1ZScsICdnb29nLmZ4LkFuaW1hdGlvblNlcmlhbFF1ZXVlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2FuaW1hdGlvbnF1ZXVlX3Rlc3QuanMnLCBbJ2dvb2cuZnguQW5pbWF0aW9uUXVldWVUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb25QYXJhbGxlbFF1ZXVlJywgJ2dvb2cuZnguQW5pbWF0aW9uU2VyaWFsUXVldWUnLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguYW5pbScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3MzL2Z4LmpzJywgWydnb29nLmZ4LmNzczMnXSwgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvY3NzMy90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2NzczMvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LmNzczMuVHJhbnNpdGlvblRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5jc3MzLlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZS50cmFuc2l0aW9uJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9jc3NzcHJpdGVhbmltYXRpb24uanMnLCBbJ2dvb2cuZnguQ3NzU3ByaXRlQW5pbWF0aW9uJ10sIFsnZ29vZy5meC5BbmltYXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Nzc3Nwcml0ZWFuaW1hdGlvbl90ZXN0LmpzJywgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvblRlc3QnXSwgWydnb29nLmZ4LkNzc1Nwcml0ZUFuaW1hdGlvbicsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RvbS5qcycsIFsnZ29vZy5meC5kb20nLCAnZ29vZy5meC5kb20uQmdDb2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5Db2xvclRyYW5zZm9ybScsICdnb29nLmZ4LmRvbS5GYWRlJywgJ2dvb2cuZnguZG9tLkZhZGVJbicsICdnb29nLmZ4LmRvbS5GYWRlSW5BbmRTaG93JywgJ2dvb2cuZnguZG9tLkZhZGVPdXQnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5meC5kb20uUHJlZGVmaW5lZEVmZmVjdCcsICdnb29nLmZ4LmRvbS5SZXNpemUnLCAnZ29vZy5meC5kb20uUmVzaXplSGVpZ2h0JywgJ2dvb2cuZnguZG9tLlJlc2l6ZVdpZHRoJywgJ2dvb2cuZnguZG9tLlNjcm9sbCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLmZ4LmRvbS5TbGlkZUZyb20nLCAnZ29vZy5meC5kb20uU3dpcGUnXSwgWydnb29nLmNvbG9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3AuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3AnXSwgWydnb29nLmZ4LkFic3RyYWN0RHJhZ0Ryb3AnLCAnZ29vZy5meC5EcmFnRHJvcEl0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdkcm9wZ3JvdXAuanMnLCBbJ2dvb2cuZnguRHJhZ0Ryb3BHcm91cCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZnguQWJzdHJhY3REcmFnRHJvcCcsICdnb29nLmZ4LkRyYWdEcm9wSXRlbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2Ryb3Bncm91cF90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdEcm9wR3JvdXBUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5EcmFnRHJvcEdyb3VwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnZ2VyLmpzJywgWydnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5EcmFnZ2VyLkV2ZW50VHlwZSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2dlcl90ZXN0LmpzJywgWydnb29nLmZ4LkRyYWdnZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ2xpc3Rncm91cC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdERpcmVjdGlvbicsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXAnLCAnZ29vZy5meC5EcmFnTGlzdEdyb3VwLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdMaXN0R3JvdXBFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRJZCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2RyYWdsaXN0Z3JvdXBfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnTGlzdEdyb3VwVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ4LkRyYWdFdmVudCcsICdnb29nLmZ4LkRyYWdMaXN0RGlyZWN0aW9uJywgJ2dvb2cuZnguRHJhZ0xpc3RHcm91cCcsICdnb29nLmZ4LkRyYWdMaXN0UGVybWlzc2lvbicsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC9kcmFnc2Nyb2xsc3VwcG9ydC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZHJhZ3Njcm9sbHN1cHBvcnRfdGVzdC5qcycsIFsnZ29vZy5meC5EcmFnU2Nyb2xsU3VwcG9ydFRlc3QnXSwgWydnb29nLmZ4LkRyYWdTY3JvbGxTdXBwb3J0JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZWFzaW5nLmpzJywgWydnb29nLmZ4LmVhc2luZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L2Vhc2luZ190ZXN0LmpzJywgWydnb29nLmZ4LmVhc2luZ1Rlc3QnXSwgWydnb29nLmZ4LmVhc2luZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnguanMnLCBbJ2dvb2cuZngnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5BbmltYXRpb24uRXZlbnRUeXBlJywgJ2dvb2cuZnguQW5pbWF0aW9uLlN0YXRlJywgJ2dvb2cuZnguQW5pbWF0aW9uRXZlbnQnLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZScsICdnb29nLmZ4LmVhc2luZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZngvZnhfdGVzdC5qcycsIFsnZ29vZy5meFRlc3QnXSwgWydnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdmeC90cmFuc2l0aW9uLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uLkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2Z4L3RyYW5zaXRpb25iYXNlLmpzJywgWydnb29nLmZ4LlRyYW5zaXRpb25CYXNlJywgJ2dvb2cuZnguVHJhbnNpdGlvbkJhc2UuU3RhdGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmZ4LlRyYW5zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dvb2cuanMnLCBbXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9hYnN0cmFjdGdyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLkVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkZpbGwnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdHJva2UnLCAnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2FmZmluZXRyYW5zZm9ybS5qcycsIFsnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQWZmaW5lVHJhbnNmb3JtVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5QYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLkNhbnZhc0dyYXBoaWNzJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ncmFwaGljcy5BYnN0cmFjdEdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5DYW52YXNQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkNhbnZhc1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzVGV4dEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2NhbnZhc2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuQ2FudmFzR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGVtZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5tYXRoJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9lbGxpcHNlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9jb29yZGluYXRlcy5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2Nvb3JkaW5hdGVzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LmNvb3JkaW5hdGVzVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5ncmFwaGljcy5leHQuY29vcmRpbmF0ZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9lbGVtZW50X3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnRUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dCcsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2VsbGlwc2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsbGlwc2UnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2V4dC5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5FbGxpcHNlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJywgJ2dvb2cuZ3JhcGhpY3MuZXh0LlJlY3RhbmdsZScsICdnb29nLmdyYXBoaWNzLmV4dC5TaGFwZScsICdnb29nLmdyYXBoaWNzLmV4dC5jb29yZGluYXRlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5HcmFwaGljcyddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvZ3JvdXAuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0Lkdyb3VwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLmV4dC5FbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9leHQvaW1hZ2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkltYWdlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3BhdGguanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGgnXSwgWydnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5tYXRoLlJlY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9wYXRoX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LlBhdGhUZXN0J10sIFsnZ29vZy5ncmFwaGljcycsICdnb29nLmdyYXBoaWNzLmV4dC5QYXRoJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3JlY3RhbmdsZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuUmVjdGFuZ2xlJ10sIFsnZ29vZy5ncmFwaGljcy5leHQuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2V4dC9zaGFwZS5qcycsIFsnZ29vZy5ncmFwaGljcy5leHQuU2hhcGUnXSwgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvZXh0L3N0cm9rZWFuZGZpbGxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLmV4dC5TdHJva2VBbmRGaWxsRWxlbWVudCddLCBbJ2dvb2cuZ3JhcGhpY3MuZXh0LkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZpbGwuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ZvbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuRm9udCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyYXBoaWNzLmpzJywgWydnb29nLmdyYXBoaWNzJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5DYW52YXNHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLlN2Z0dyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2dyb3VwZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5Hcm91cEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2ltYWdlZWxlbWVudC5qcycsIFsnZ29vZy5ncmFwaGljcy5JbWFnZUVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL2xpbmVhcmdyYWRpZW50LmpzJywgWydnb29nLmdyYXBoaWNzLkxpbmVhckdyYWRpZW50J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuUGF0aC5TZWdtZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmdyYXBoaWNzLkFmZmluZVRyYW5zZm9ybScsICdnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5QYXRoVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cudGVzdGluZy5ncmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9wYXRocy5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRocyddLCBbJ2dvb2cuZ3JhcGhpY3MuUGF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvcGF0aHNfdGVzdC5qcycsIFsnZ29vZy5ncmFwaGljcy5wYXRoc1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MucGF0aHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3JlY3RlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlJlY3RFbGVtZW50J10sIFsnZ29vZy5ncmFwaGljcy5TdHJva2VBbmRGaWxsRWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsLmpzJywgWydnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCddLCBbJ2dvb2cuZ3JhcGhpY3MuRmlsbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc29saWRmaWxsX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsVGVzdCddLCBbJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdHJva2UuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvc3Ryb2tlYW5kZmlsbGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlQW5kRmlsbEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLkVsZW1lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2VsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnXSwgWydnb29nLmRvbScsICdnb29nLmdyYXBoaWNzLkVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5SZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlRleHRFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy9zdmdncmFwaGljcy5qcycsIFsnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmdyYXBoaWNzLkFic3RyYWN0R3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5Gb250JywgJ2dvb2cuZ3JhcGhpY3MuTGluZWFyR3JhZGllbnQnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cuZ3JhcGhpY3MuU3ZnRWxsaXBzZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdHcm91cEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdJbWFnZUVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5TdmdQYXRoRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlN2Z1JlY3RFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuU3ZnVGV4dEVsZW1lbnQnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2dyYXBoaWNzL3N2Z2dyYXBoaWNzX3Rlc3QuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuU3ZnR3JhcGhpY3NUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5BZmZpbmVUcmFuc2Zvcm0nLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5TdmdHcmFwaGljcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3MvdGV4dGVsZW1lbnQuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVGV4dEVsZW1lbnQnXSwgWydnb29nLmdyYXBoaWNzLlN0cm9rZUFuZEZpbGxFbGVtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdncmFwaGljcy92bWxlbGVtZW50LmpzJywgWydnb29nLmdyYXBoaWNzLlZtbEVsbGlwc2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sR3JvdXBFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sSW1hZ2VFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUGF0aEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxSZWN0RWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFRleHRFbGVtZW50J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ncmFwaGljcy5FbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLkltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5UZXh0RWxlbWVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnZ3JhcGhpY3Mvdm1sZ3JhcGhpY3MuanMnLCBbJ2dvb2cuZ3JhcGhpY3MuVm1sR3JhcGhpY3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZ3JhcGhpY3MuQWJzdHJhY3RHcmFwaGljcycsICdnb29nLmdyYXBoaWNzLkZvbnQnLCAnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5ncmFwaGljcy5WbWxFbGxpcHNlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEdyb3VwRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbEltYWdlRWxlbWVudCcsICdnb29nLmdyYXBoaWNzLlZtbFBhdGhFbGVtZW50JywgJ2dvb2cuZ3JhcGhpY3MuVm1sUmVjdEVsZW1lbnQnLCAnZ29vZy5ncmFwaGljcy5WbWxUZXh0RWxlbWVudCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50LmpzJywgWydnb29nLmhpc3RvcnkuRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmhpc3RvcnkuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaGlzdG9yeS5qcycsIFsnZ29vZy5IaXN0b3J5JywgJ2dvb2cuSGlzdG9yeS5FdmVudCcsICdnb29nLkhpc3RvcnkuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5kZXZpY2UnLCAnZ29vZy5tZW1vaXplJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdoaXN0b3J5L2hpc3RvcnlfdGVzdC5qcycsIFsnZ29vZy5IaXN0b3J5VGVzdCddLCBbJ2dvb2cuSGlzdG9yeScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaGlzdG9yeS9odG1sNWhpc3RvcnkuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnknLCAnZ29vZy5oaXN0b3J5Lkh0bWw1SGlzdG9yeS5Ub2tlblRyYW5zZm9ybWVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuRXZlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2hpc3RvcnkvaHRtbDVoaXN0b3J5X3Rlc3QuanMnLCBbJ2dvb2cuaGlzdG9yeS5IdG1sNUhpc3RvcnlUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5oaXN0b3J5LkV2ZW50VHlwZScsICdnb29nLmhpc3RvcnkuSHRtbDVIaXN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9jc3NzcGVjaWZpY2l0eS5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5J10sIFsnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvY3Nzc3BlY2lmaWNpdHlfdGVzdC5qcycsIFsnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5VGVzdCddLCBbJ2dvb2cuaHRtbC5Dc3NTcGVjaWZpY2l0eScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoLmpzJywgWydnb29nLmh0bWwuZmxhc2gnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2ZsYXNoX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5mbGFzaFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuZmxhc2gnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvbGVnYWN5Y29udmVyc2lvbnMuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL2xlZ2FjeWNvbnZlcnNpb25zX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9uc1Rlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZycsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlaHRtbF90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZUh0bWxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVodG1sZm9ybWF0dGVyLmpzJywgWydnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20udGFncycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZWh0bWxmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVIdG1sRm9ybWF0dGVyVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXNjcmlwdC5qcycsIFsnZ29vZy5odG1sLlNhZmVTY3JpcHQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZlc2NyaXB0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYWZlU2NyaXB0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlLmpzJywgWydnb29nLmh0bWwuU2FmZVN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmVzdHlsZV90ZXN0LmpzJywgWydnb29nLmh0bWwuc2FmZVN0eWxlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXQuanMnLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FmZXN0eWxlc2hlZXRfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVTdHlsZVNoZWV0VGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmwuanMnLCBbJ2dvb2cuaHRtbC5TYWZlVXJsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnMudXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcmVjdGlvbmFsU3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NhZmV1cmxfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2FmZVVybFRlc3RWZWN0b3JzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYWZldXJsX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLnNhZmVVcmxUZXN0VmVjdG9ycyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2F0dHJpYnV0ZXdoaXRlbGlzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVTYW5pdGl6ZWRXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5BdHRyaWJ1dGVXaGl0ZWxpc3QnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3Nwcm9wZXJ0eXNhbml0aXplci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Byb3BlcnR5c2FuaXRpemVyX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXJUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NQcm9wZXJ0eVNhbml0aXplcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9jc3NzYW5pdGl6ZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLkNzc1NwZWNpZmljaXR5JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzUHJvcGVydHlTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL2Nzc3Nhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuQ3NzU2FuaXRpemVyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnNhbml0aXplci5Dc3NTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9lbGVtZW50d2Vha21hcC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcCddLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvZWxlbWVudHdlYWttYXBfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5FbGVtZW50V2Vha01hcFRlc3QnXSwgWydnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sX3Rlc3RfdmVjdG9ycy5qcycsIFsnZ29vZy5odG1sLmh0bWxUZXN0VmVjdG9ycyddLCBbXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyLmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyQXR0cmlidXRlUG9saWN5JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXJQb2xpY3lDb250ZXh0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclBvbGljeUhpbnRzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplclVybFBvbGljeSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlU2FuaXRpemVkV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQXR0cmlidXRlV2hpdGVsaXN0JywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuQ3NzU2FuaXRpemVyJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3InLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdCbGFja2xpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvaHRtbHNhbml0aXplcl90ZXN0LmpzJywgWydnb29nLmh0bWwuSHRtbFNhbml0aXplclRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9odG1sc2FuaXRpemVyX3VuaWZpZWRfdGVzdC5qcycsIFsnZ29vZy5odG1sLkh0bWxTYW5pdGl6ZXJVbmlmaWVkVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuaHRtbFRlc3RWZWN0b3JzJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuSHRtbFNhbml0aXplci5CdWlsZGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXIuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9ub2Nsb2JiZXJfdGVzdC5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXJUZXN0J10sIFsnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5odG1sLnNhbml0aXplci5ub2Nsb2JiZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci9zYWZlZG9tdHJlZXByb2Nlc3Nvci5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkVsZW1lbnRXZWFrTWFwJywgJ2dvb2cuaHRtbC5zYW5pdGl6ZXIubm9jbG9iYmVyJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxvZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3NhZmVkb210cmVlcHJvY2Vzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuU2FmZURvbVRyZWVQcm9jZXNzb3JUZXN0J10sIFsnZ29vZy5odG1sLnNhbml0aXplci5TYWZlRG9tVHJlZVByb2Nlc3NvcicsICdnb29nLmh0bWwuc2FuaXRpemVyLm5vY2xvYmJlcicsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3Nhbml0aXplci90YWdibGFja2xpc3QuanMnLCBbJ2dvb2cuaHRtbC5zYW5pdGl6ZXIuVGFnQmxhY2tsaXN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zYW5pdGl6ZXIvdGFnd2hpdGVsaXN0LmpzJywgWydnb29nLmh0bWwuc2FuaXRpemVyLlRhZ1doaXRlbGlzdCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZS5qcycsIFsnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnNhbml0aXplci5IdG1sU2FuaXRpemVyLkJ1aWxkZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvc2FuaXRpemVyL3Vuc2FmZV90ZXN0LmpzJywgWydnb29nLmh0bWwuVW5zYWZlVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkF0dHJpYnV0ZVdoaXRlbGlzdCcsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5odG1sLnNhbml0aXplci5UYWdXaGl0ZWxpc3QnLCAnZ29vZy5odG1sLnNhbml0aXplci51bnNhZmUnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC9zaWx2ZXJsaWdodC5qcycsIFsnZ29vZy5odG1sLnNpbHZlcmxpZ2h0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cuc3RyaW5nLkNvbnN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3NpbHZlcmxpZ2h0X3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5zaWx2ZXJsaWdodFRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwuc2lsdmVybGlnaHQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGVzdGluZy5qcycsIFsnZ29vZy5odG1sLnRlc3RpbmcnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTY3JpcHQnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLmh0bWwuU2FmZVN0eWxlU2hlZXQnLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkFyZ3VtZW50TWF0Y2hlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90ZXh0ZXh0cmFjdG9yLmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmh0bWwuc2FuaXRpemVyLkh0bWxTYW5pdGl6ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdGV4dGV4dHJhY3Rvcl90ZXN0LmpzJywgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvclRlc3QnXSwgWydnb29nLmh0bWwudGV4dEV4dHJhY3RvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkcmVzb3VyY2V1cmwuanMnLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLnRydXN0ZWR0eXBlcycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRGlyZWN0aW9uYWxTdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuVHlwZWRTdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdHJ1c3RlZHJlc291cmNldXJsX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkUmVzb3VyY2VVcmxUZXN0J10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmh0bWwudHJ1c3RlZHR5cGVzJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaHRtbC90cnVzdGVkdHlwZXMuanMnLCBbJ2dvb2cuaHRtbC50cnVzdGVkdHlwZXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3VuY2hlY2tlZGNvbnZlcnNpb25zLmpzJywgWydnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdW5jaGVja2VkY29udmVyc2lvbnNfdGVzdC5qcycsIFsnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zVGVzdCddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZVNjcmlwdCcsICdnb29nLmh0bWwuU2FmZVN0eWxlJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLmh0bWwuU2FmZVVybCcsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2h0bWwvdXRpbHMuanMnLCBbJ2dvb2cuaHRtbC51dGlscyddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdodG1sL3V0aWxzX3Rlc3QuanMnLCBbJ2dvb2cuaHRtbC5VdGlsc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnV0aWxzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGkuanMnLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5EaXJlY3Rpb25hbFN0cmluZycsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5iaWRpVGVzdCddLCBbJ2dvb2cuaTE4bi5iaWRpJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9iaWRpZm9ybWF0dGVyLmpzJywgWydnb29nLmkxOG4uQmlkaUZvcm1hdHRlciddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmkxOG4uYmlkaScsICdnb29nLmkxOG4uYmlkaS5EaXInLCAnZ29vZy5pMThuLmJpZGkuRm9ybWF0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2JpZGlmb3JtYXR0ZXJfdGVzdC5qcycsIFsnZ29vZy5pMThuLkJpZGlGb3JtYXR0ZXJUZXN0J10sIFsnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cuaTE4bi5CaWRpRm9ybWF0dGVyJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLmkxOG4uYmlkaS5Gb3JtYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcmxpc3RkZWNvbXByZXNzb3IuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5pMThuLnVDaGFyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2NoYXJsaXN0ZGVjb21wcmVzc29yX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5DaGFyTGlzdERlY29tcHJlc3NvclRlc3QnXSwgWydnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY2hhcnBpY2tlcmRhdGEuanMnLCBbJ2dvb2cuaTE4bi5DaGFyUGlja2VyRGF0YSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uLmpzJywgWydnb29nLmkxOG4uY29sbGF0aW9uJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29sbGF0aW9uX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5jb2xsYXRpb25UZXN0J10sIFsnZ29vZy5pMThuLmNvbGxhdGlvbicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jb21wYWN0bnVtYmVyZm9ybWF0c3ltYm9scy5qcycsIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYW0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jeScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19odScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pbicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ub19OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9QVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VyJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3poX1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY29tcGFjdG51bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc0V4dCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hZ3EnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FrX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9BRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9QUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hcl9YQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc19JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2FzdCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9DeXJsX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JlbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Jlel9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibV9NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWJ1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lZV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbF9HUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0JTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0RNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0ZKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0pNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0tOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01IJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01TJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX01XJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05GJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX05SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1BOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1RWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1ZHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1dTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19BUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19CWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19DUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19FQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19HVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19OSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19QSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19lc19TVicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ldF9FRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZXdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZmJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX01SJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZmlsX1BIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZvX0ZPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0JJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0dQJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0tNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01DJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX01VJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1BGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1JXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1NZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1ROJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX1lUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZnknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ2QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3VfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ndicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYV9HSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oYXdfVVMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHJfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2hzYl9ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pYScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19paScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaWlfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfaXRfSVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamFfSlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19qbWMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2p2X0lEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rYWJfRFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZGUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rZWFfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19raScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ra2onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsX0dMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa21fS0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29fS1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rcycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19taScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXNfTVknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbXVhJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19tem4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmVfTlAnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfQlEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbmxfU1InLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25tZ19DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ubmgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19udXNfU1MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX255bicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vbScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vcl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19vc19SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3BzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0FPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X0dRJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3B0X1RMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3F1X0VDJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JtX0NIJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ybicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3JvX01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb19STycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yb2ZfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfS1onLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcnVfVUEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfcndrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2FoX1JVJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2JwJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZF9QSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZV9OTycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2VoX01aJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9MYXRuJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NoaV9UZm5nX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NsX1NJJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc24nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fREonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc29fU08nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3FfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fQkEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fWEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3ZfU0UnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfc3dfVFonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGFfTEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVfSU4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fVUcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGhfVEgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdGlfRVQnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdG8nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHJfVFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHdxJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdHptX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3VrX1VBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmxfVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192YWlfVmFpaScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc192dW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193YWVfQ0gnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeGgnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3hvZ19VRycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lpJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195b19CSicsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnMnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfeXVlX0hhbnRfSEsnLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X0hLJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc196dV9aQSddLCBbJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9jdXJyZW5jeS5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5pMThuLmN1cnJlbmN5LkN1cnJlbmN5SW5mb1RpZXIyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3lfdGVzdC5qcycsIFsnZ29vZy5pMThuLmN1cnJlbmN5VGVzdCddLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLmN1cnJlbmN5JywgJ2dvb2cuaTE4bi5jdXJyZW5jeS5DdXJyZW5jeUluZm8nLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vY3VycmVuY3ljb2RlbWFwLmpzJywgWydnb29nLmkxOG4uY3VycmVuY3lDb2RlTWFwJywgJ2dvb2cuaTE4bi5jdXJyZW5jeUNvZGVNYXBUaWVyMiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsZm9ybWF0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlLkRhdGVMaWtlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzVHlwZScsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNScsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0VGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kYXRlLkRhdGVUaW1lJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmkxOG4uRGF0ZUludGVydmFsRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLmkxOG4uVGltZVpvbmUnLCAnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFBhdHRlcm5zJywgJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGVpbnRlcnZhbHBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsUGF0dGVybnMnXSwgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9scyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFscGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJuc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxQYXR0ZXJucyddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZWludGVydmFsc3ltYm9scy5qcycsIFsnZ29vZy5pMThuLmRhdGVJbnRlcnZhbFN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRlaW50ZXJ2YWxzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uZGF0ZUludGVydmFsU3ltYm9sc0V4dCddLCBbJ2dvb2cuaTE4bi5kYXRlSW50ZXJ2YWxTeW1ib2xzJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdC5Gb3JtYXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lRm9ybWF0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuX1hBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3N2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGVfSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvX1JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3YnLCAnZ29vZy5pMThuLlRpbWVab25lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGFyc2UuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGF0ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhcnNlX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhcnNlVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9kYXRldGltZXBhdHRlcm5zLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19heicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ibicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jaHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY3knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZXNfNDE5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX01YJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZpbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaGF3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2phJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ttJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25iJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25sJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3J1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2RhdGV0aW1lcGF0dGVybnNleHQuanMnLCBbJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FmX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hZ3FfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYW1fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXJfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0JIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0RKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0VSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0pPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX0xZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX09NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1FBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1REJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1ROJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FyX1lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzYScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hc2FfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2FzdF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYXpfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19hel9MYXRuX0FaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iYXNfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVfQlknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JlbV9aTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19iZXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JnX0JHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JvX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JyeCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19icnhfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ic19DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2JzX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9BRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jYV9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jY3AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NjcF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2ViX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19jZ2dfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2hyX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ja2JfSVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfY2tiX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2N5X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kYXZfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGVfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZGplJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZHlvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19keicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19kel9CVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VlX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VuXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19lbl8xNTAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQUknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRksnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fRk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fS1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTFMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTVknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fTlonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fU1onLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVE8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZW9fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0NVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0VDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0hOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX0lDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1BZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1VZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2VzX1ZFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V1X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2V3bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmFfSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0dNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19mZl9MYXRuX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZmZfTGF0bl9TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fREsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfSFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfVlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfV0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZnVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2Z1cl9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19meV9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nYV9JRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nZF9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nbF9FUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3N3X0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2dzd19MSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ndXonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfZ3V6X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2d2X0lNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oZV9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oaV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ocl9IUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19oc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h1X0hVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2h5X0FNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2lhXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZF9JRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pZ19ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pc19JUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9TTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19pdF9WQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qZ28nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfamdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19qbWNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FfR0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rYW0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2FtX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rZGVfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2VhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19raHEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2hxX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tpX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2trX0taJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ra2pfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa2xuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tsbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rbl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rb2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa29rX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NmJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2tzZl9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfa3NoX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t3X0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xhZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sYWdfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGJfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbGt0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xrdF9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sb19MQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19scmMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2xyY19JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdF9MVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdV9DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX2x1eScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19sdXlfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWFzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21hc19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWVyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21lcl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWZlX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21naCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tZ2hfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX21nb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ta19NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbF9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tcl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19CTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdF9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbXVhX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX215X01NJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19tem5fSVInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmFxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uYl9TSicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZF9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25kc19OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9BVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9DVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9OTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubF9TWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ubmhfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnVzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ueW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfbnluX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29tX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX0dFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0FyYWInLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcGxfUEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHNfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfQ1YnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfR1cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfU1QnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcXVfUEUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm0nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm5fQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9fUk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcm9mJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9CWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9NRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19ydycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd19SVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfcndrX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2FxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NhcV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2JwX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlX1NFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NlaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2VzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Nlc19NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zZ19DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX0xhdG5fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2lfTEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2tfU0snLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc21uJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Ntbl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbl9aVycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zbycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9BTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9NSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9DeXJsX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0N5cmxfWEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zcl9MYXRuX01FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3NyX0xhdG5fUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9BWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19DRCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc19zd19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190YV9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZW8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdGVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190Z19USicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190aycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190a19UTScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190b19UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190dF9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdHdxX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3R6bScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWcnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWdfQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc191el9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3ZpX1ZOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc192dW5fVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfd2FlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193bycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc193b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194aF9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc194b2cnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lhdicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195YXZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfeWlfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3lvX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3l1ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196Z2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemdoX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFuc19TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50JywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnNfemhfSGFudF9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXR0ZXJuc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVBhdHRlcm5zX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNUeXBlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19iZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19icycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jeScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfTVgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhdycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2h1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2luJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfamEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2trJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa20nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21vJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25lJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25vX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1BUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196dSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vZGF0ZXRpbWVzeW1ib2xzZXh0LmpzJywgWydnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWZfTkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hZl9aQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FncV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hbV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfQkgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfSk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX0tXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTEInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9PTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfUUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfU08nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfVEQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcl9UTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FyX1hCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXNhX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYXpfTGF0bl9BWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JhcycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JlX0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmV6X1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JtX01MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ibl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYm9fQ04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2JzX0N5cmxfQkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0FEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jYV9GUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NhX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0JEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2NwX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19jZV9SVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NnZ19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NrYl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2NzX0NaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfY3lfR0InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RhX0dMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZGVfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19kZV9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RqZV9ORScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R1YV9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R5b19TTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2R6JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lYnVfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZWVfVEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbF9DWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fMTUwJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0FJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9BVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9CVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9DWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0NZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ERycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9FUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9GSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0ZNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0dVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9JTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0pFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0tJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9LWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX0xDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9MUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01QJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX01VJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9OVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX05aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9QUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1BXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1NTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9TWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1RUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9VU19QT1NJWCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZDJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9WSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1ZVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbl9YQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1pNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VvXzAwMScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19CUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19DTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfQ1UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19ETycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfSE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19JQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUEEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfUFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19QWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXNfVVknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19lc19WRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZXVfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mYV9BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9CRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9HTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmZfTGF0bl9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZmlfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19maWxfUEgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZvX0RLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZm9fRk8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0JMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfREonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0ZSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR0EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0dOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfR1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX0hUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfS00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01BJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX01SJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX05FJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUEYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1JFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfU1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1RHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfVE4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ZyX1dGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZnJfWVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19mdXJfSVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19meScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2FfSUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ2xfRVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19nc3dfTEknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ndV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d1el9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2d2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhX0dIJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oYV9ORycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hhd19VUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaGlfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ocl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHNiX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19oeV9BTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lhJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWRfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19paV9DTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19pdF9JVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfaXRfVkEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19qYV9KUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2pnb19DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptYycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2p2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfanZfSUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thYl9EWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2thbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tlYV9DVicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tocV9NTCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ra19LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2traicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa2xfR0wnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbG5fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rbV9LSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa29fS1AnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rb19LUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tva19JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2tzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2InLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2JfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rc2hfREUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t1X1RSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfa3cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2t5X0tHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sYl9MVScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbGdfVUcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3QnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9BTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xuX0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sbl9DRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2xvX0xBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lRJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHJjX0lSJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19sdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2x1X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHVvX0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbHZfTFYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tYXNfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZmVfTVUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21nX01HJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWdvX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19taV9OWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21rX01LJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tbl9NTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXNfQk4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tc19NWScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbXRfTVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19teV9NTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX216bl9JUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25hcV9OQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25iX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25kX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX0RFJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmRzX05MJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19uZV9OUCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0FXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfQkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX0NXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbmxfTkwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25sX1NYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfbm4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ubl9OTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX25uaF9DTScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251cycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX255bl9VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb21fRVQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vbV9LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfb3MnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19vc19HRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BhX0FyYWJfUEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcGFfR3VydV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BsX1BMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wc19BRicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0NWJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9HVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X0xVJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19wdF9NWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3B0X1NUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3F1X0JPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19xdV9QRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JtJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ybicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JuX0JJJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yb19STycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X0JZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfS0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J1X01EJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcnVfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3J3JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfcndfUlcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2snLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19yd2tfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYXFfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zYnBfVFonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZV9GSScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NlX05PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWgnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZWhfTVonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZXNfTUwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NoaV9UZm5nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NrX1NLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc2xfU0knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbW5fRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zbicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc28nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19ESicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc29fS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zb19TTycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3FfTUsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcV9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX0JBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9DeXJsX1hLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zcl9MYXRuX1JTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3ZfRkknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zdl9TRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfc3dfS0UnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc19zd19UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfSU4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190YV9MSycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGFfU0cnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190ZV9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19LRScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Rlb19VRycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGdfVEonLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aF9USCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGlfRVInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190aV9FVCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdGtfVE0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHJfQ1knLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190cl9UUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdHRfUlUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3EnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em0nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc190em1fTUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191ZycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VnX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdWtfVUEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3VyX1BLJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0FyYWJfQUYnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9DeXJsJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3V6X0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc191el9MYXRuX1VaJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX0xhdG4nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192YWlfTGF0bl9MUicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfdmFpX1ZhaWlfTFInLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc192aV9WTicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3Z1bl9UWicsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3dvJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfd29fU04nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc194aCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3hoX1pBJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2JywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWF2X0NNJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeWknLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195aV8wMDEnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195bycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeW9fTkcnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3l1ZV9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfeXVlX0hhbnQnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3pnaF9NQScsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX0NOJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFuc19ISycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW5zX1NHJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudCcsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9sc196aF9IYW50X01PJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSGFudF9UVycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrLmpzJywgWydnb29nLmkxOG4uR3JhcGhlbWVCcmVhayddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9ncmFwaGVtZWJyZWFrX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrVGVzdCddLCBbJ2dvb2cuaTE4bi5HcmFwaGVtZUJyZWFrJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9sb2NhbGVmZWF0dXJlLmpzJywgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZSddLCBbXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL2xvY2FsZWZlYXR1cmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmVUZXN0J10sIFsnZ29vZy5pMThuLkxvY2FsZUZlYXR1cmUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbWVzc2FnZWZvcm1hdC5qcycsIFsnZ29vZy5pMThuLk1lc3NhZ2VGb3JtYXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9scycsICdnb29nLmkxOG4ub3JkaW5hbFJ1bGVzJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9tZXNzYWdlZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0VGVzdCddLCBbJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cuaTE4bi5wbHVyYWxSdWxlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lLmpzJywgWydnb29nLmkxOG4ubWltZScsICdnb29nLmkxOG4ubWltZS5lbmNvZGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaTE4bi51Q2hhciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9taW1lX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5taW1lLmVuY29kZVRlc3QnXSwgWydnb29nLmkxOG4ubWltZS5lbmNvZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0LmpzJywgWydnb29nLmkxOG4uTnVtYmVyRm9ybWF0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQuQ3VycmVuY3lTdHlsZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0LkZvcm1hdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5jdXJyZW5jeScsICdnb29nLm1hdGgnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vbnVtYmVyZm9ybWF0X3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRUZXN0J10sIFsnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5Db21wYWN0TnVtYmVyRm9ybWF0U3ltYm9sc19kZScsICdnb29nLmkxOG4uQ29tcGFjdE51bWJlckZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5pMThuLkNvbXBhY3ROdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfRUdfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3VfbnVfbGF0bicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHMuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FtJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VHX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19heicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2hyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2N5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0FUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0FVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzXzQxOScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19FUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19NWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lc19VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ldScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmlsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZyX0NBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oYXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaXcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfamEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa20nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa24nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa28nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX215X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm9fTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfb3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfUFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190bCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190cicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL251bWJlcmZvcm1hdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0FFX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9CSF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfREpfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0VSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9JTF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0pPX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9LTV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfS1dfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX0xCX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9MWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9NUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfT01fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1BTX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9RQV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU0FfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NEX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9TT191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfU1NfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FyX1NZX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9URF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfVE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWEInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXJfWUVfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXNhJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2FzYV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hc3QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXN0X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYXpfQ3lybF9BWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hel9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2F6X0xhdG5fQVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmFzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Jhc19DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZW0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmVtX1pNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JleicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19iZXpfVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYmdfQkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm1fTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYm5fQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JuX0lOX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ibycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ib19JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19icngnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnJ4X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfYnNfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ic19MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2JzX0xhdG5fQkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfQUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2FfSVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2NwJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9CRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfQkRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jY3BfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NjcF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2VfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2ViJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NlYl9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jZ2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2dnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Nocl9VUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ja2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUV91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2NrYl9JUl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfY2tiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jc19DWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19jeV9HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYV9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kYXYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZGF2X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0JFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0RFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RlX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RqZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kamVfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHNiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2RzYl9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19kdWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHVhX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R5bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19keW9fU04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZHpfQlRfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2R6X3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmFfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZhX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQkYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX0dXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTFInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX05FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mZl9MYXRuX1NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ZpbF9QSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19ESycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mb19GTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CSicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9CTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ESicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9EWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9GUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9HUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9IVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9LTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9MVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9OQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ORScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9QTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TQycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9TWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9URycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9UTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9WVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9XRicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mcl9ZVCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mdXInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZnVyX0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2Z5X05MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dhX0lFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dkX0dCJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dsX0VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2dzd19DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19nc3dfRlInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3N3X0xJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1X0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2d1eicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ndXpfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfZ3ZfSU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfR0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGFfTkcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaGF3X1VTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hlX0lMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hpX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hyX0hSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2hzYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19oc2JfREUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHVfSFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaHlfQU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfaWFfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lkX0lEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lnX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lpX0NOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2lzX0lTJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0NIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X0lUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2l0X1ZBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2phX0pQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2pnbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfam1jJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ptY19UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19qdl9JRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYV9HRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2FiX0RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2thbScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rYW1fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2RlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tkZV9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rZWEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2VhX0NWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tocScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19raHFfTUwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2knLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2lfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tfS1onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2tqJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tral9DTScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbF9HTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rbG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa2xuX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2ttX0tIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tuX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tQJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvX0tSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tvaycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rb2tfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3MnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2InLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NiX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzZicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rc2ZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfa3NoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2tzaF9ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdV9UUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rdycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19rd19HQicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19reV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sYWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbGFnX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xiX0xVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xnX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xrdCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sa3RfVVMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG5fQ0cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbG9fTEEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHJjJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVFfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19scmNfSVJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2xyY191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHRfTFQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVfQ0QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHVvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x1b19LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19sdXknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbHV5X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX2x2X0xWJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21hcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tYXNfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWFzX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21lcicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZXJfS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWZlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21mZV9NVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ19NRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWdoX01aJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21nbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tZ29fQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWlfTlonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWtfTUsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbWxfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbW5fTU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXJfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX0JOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX21zX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX210X01UJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX211YScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tdWFfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXlfTU1fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbXpuX0lSX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19tem5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25hcScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uYXFfTkEnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmJfU0onLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRfWlcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmRzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25kc19ERScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19uZHNfTkwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbmVfSU5fdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25lX05QX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9BcmFiX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHNfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3BzX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19wc191X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19ydycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NkX1BLX3VfbnVfbGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZF91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfRkknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfTk8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VfU0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VoJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NlaF9NWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zZXMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc2VzX01MJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NnX0NGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NoaScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfTGF0bl9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaGlfVGZuZ19NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zaV9MSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19za19TSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbF9TSScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zbW4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc21uX0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NuX1pXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NvX1NPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX0FMJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX01LJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NxX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9CQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9DeXJsX01FJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0N5cmxfUlMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfQ3lybF9YSycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX0JBJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3NyX0xhdG5fTUUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfc3JfTGF0bl9SUycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19zcl9MYXRuX1hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0FYJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X0ZJJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N2X1NFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0NEJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X0tFJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1RaJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3N3X1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX0xLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX01ZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RhX1NHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlX0lOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RlbycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190ZW9fS0UnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdGVvX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RnX1RKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RoX1RIJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RpX0VUJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RrX1RNJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RvX1RPJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX0NZJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3RyX1RSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R0X1JVJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R3cScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc190d3FfTkUnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdHptJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3R6bV9NQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191ZycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191Z19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191a19VQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191cl9JTl91X251X2xhdG4nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfQUZfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0FyYWJfdV9udV9sYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193bycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cuaTE4bi5OdW1iZXJGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHMnLCAnZ29vZy5pMThuLk51bWJlckZvcm1hdFN5bWJvbHNfdV9udV9sYXRuJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL29yZGluYWxydWxlcy5qcycsIFsnZ29vZy5pMThuLm9yZGluYWxSdWxlcyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3BsdXJhbHJ1bGVzLmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9wbHVyYWxydWxlc190ZXN0LmpzJywgWydnb29nLmkxOG4ucGx1cmFsUnVsZXNUZXN0J10sIFsnZ29vZy5pMThuLnBsdXJhbFJ1bGVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVmb3JtYXQuanMnLCBbJ2dvb2cuaTE4bi5SZWxhdGl2ZURhdGVUaW1lRm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaTE4bi5Mb2NhbGVGZWF0dXJlJywgJ2dvb2cuaTE4bi5NZXNzYWdlRm9ybWF0JywgJ2dvb2cuaTE4bi5yZWxhdGl2ZURhdGVUaW1lU3ltYm9scyddLCB7J2xhbmcnOiAnZXM1JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vcmVsYXRpdmVkYXRldGltZWZvcm1hdF90ZXN0LmpzJywgWydnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdFRlc3QnXSwgWydnb29nLmkxOG4uTG9jYWxlRmVhdHVyZScsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lbicsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19lcycsICdnb29nLmkxOG4uTnVtYmVyRm9ybWF0U3ltYm9sc19mYScsICdnb29nLmkxOG4uUmVsYXRpdmVEYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnLCAnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3JlbGF0aXZlZGF0ZXRpbWVzeW1ib2xzLmpzJywgWydnb29nLmkxOG4ucmVsYXRpdmVEYXRlVGltZVN5bWJvbHMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi9yZWxhdGl2ZWRhdGV0aW1lc3ltYm9sc2V4dC5qcycsIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzRXh0J10sIFsnZ29vZy5pMThuLnJlbGF0aXZlRGF0ZVRpbWVTeW1ib2xzJ10sIHsnbGFuZyc6ICdlczUnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi90aW1lem9uZS5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRhdGUuRGF0ZUxpa2UnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdGltZXpvbmVfdGVzdC5qcycsIFsnZ29vZy5pMThuLlRpbWVab25lVGVzdCddLCBbJ2dvb2cuaTE4bi5UaW1lWm9uZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci5qcycsIFsnZ29vZy5pMThuLnVDaGFyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlci5qcycsIFsnZ29vZy5pMThuLnVDaGFyLkxvY2FsTmFtZUZldGNoZXInXSwgWydnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5pMThuLnVDaGFyTmFtZXMnLCAnZ29vZy5sb2cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbG9jYWxuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXIuTG9jYWxOYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlciddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXIvcmVtb3RlbmFtZWZldGNoZXIuanMnLCBbJ2dvb2cuaTE4bi51Q2hhci5SZW1vdGVOYW1lRmV0Y2hlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlVyaScsICdnb29nLmV2ZW50cycsICdnb29nLmkxOG4udUNoYXInLCAnZ29vZy5pMThuLnVDaGFyLk5hbWVGZXRjaGVyJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaTE4bi91Y2hhci9yZW1vdGVuYW1lZmV0Y2hlcl90ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXIuUmVtb3RlTmFtZUZldGNoZXJUZXN0J10sIFsnZ29vZy5pMThuLnVDaGFyLlJlbW90ZU5hbWVGZXRjaGVyJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdpMThuL3VjaGFyX3Rlc3QuanMnLCBbJ2dvb2cuaTE4bi51Q2hhclRlc3QnXSwgWydnb29nLmkxOG4udUNoYXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lcy5qcycsIFsnZ29vZy5pMThuLnVDaGFyTmFtZXMnXSwgWydnb29nLmkxOG4udUNoYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2kxOG4vdWNoYXJuYW1lc190ZXN0LmpzJywgWydnb29nLmkxOG4udUNoYXJOYW1lc1Rlc3QnXSwgWydnb29nLmkxOG4udUNoYXJOYW1lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczYuanMnLCBbJ2dvb2cuaXRlci5lczYnXSwgWydnb29nLml0ZXIuSXRlcmFibGUnLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9lczZfdGVzdC5qcycsIFsnZ29vZy5pdGVyLmVzNlRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLmVzNicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyLmpzJywgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhYmxlJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubWF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnaXRlci9pdGVyX3Rlc3QuanMnLCBbJ2dvb2cuaXRlclRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2h5YnJpZC5qcycsIFsnZ29vZy5qc29uLmh5YnJpZCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vaHlicmlkX3Rlc3QuanMnLCBbJ2dvb2cuanNvbi5oeWJyaWRUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb24uanMnLCBbJ2dvb2cuanNvbicsICdnb29nLmpzb24uUmVwbGFjZXInLCAnZ29vZy5qc29uLlJldml2ZXInLCAnZ29vZy5qc29uLlNlcmlhbGl6ZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9qc29uX3BlcmYuanMnLCBbJ2dvb2cuanNvblBlcmYnXSwgWydnb29nLmRvbScsICdnb29nLmpzb24nLCAnZ29vZy5tYXRoJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRhYmxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2pzb24vanNvbl90ZXN0LmpzJywgWydnb29nLmpzb25UZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL2pzb25hYmxlLmpzJywgWydnb29nLmpzb24uSnNvbmFibGUnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9uYXRpdmVqc29ucHJvY2Vzc29yLmpzJywgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmpzb24uUHJvY2Vzc29yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdqc29uL3Byb2Nlc3Nvci5qcycsIFsnZ29vZy5qc29uLlByb2Nlc3NvciddLCBbJ2dvb2cuc3RyaW5nLlBhcnNlcicsICdnb29nLnN0cmluZy5TdHJpbmdpZmllciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnanNvbi9wcm9jZXNzb3JfdGVzdC5qcycsIFsnZ29vZy5qc29uLnByb2Nlc3NvclRlc3QnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXMuanMnLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnXSwgW10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9jb2xsZWN0aW9ucy9pdGVyYWJsZXNfdGVzdC5qcycsIFsnZ29vZy5sYWJzLml0ZXJhYmxlVGVzdCddLCBbJ2dvb2cubGFicy5jb2xsZWN0aW9ucy5pdGVyYWJsZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2RvbS9wYWdldmlzaWJpbGl0eW1vbml0b3IuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlFdmVudCcsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5TW9uaXRvcicsICdnb29nLmxhYnMuZG9tLlBhZ2VWaXNpYmlsaXR5U3RhdGUnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS52ZW5kb3InLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWVtb2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9kb20vcGFnZXZpc2liaWxpdHltb25pdG9yX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5kb20uUGFnZVZpc2liaWxpdHlNb25pdG9yJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL25vbmRpc3Bvc2FibGVldmVudHRhcmdldC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cuZXZlbnRzLkxpc3RlbmVyTWFwJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy9ub25kaXNwb3NhYmxlZXZlbnR0YXJnZXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLmV2ZW50cy5Ob25EaXNwb3NhYmxlRXZlbnRUYXJnZXRUZXN0J10sIFsnZ29vZy5ldmVudHMuTGlzdGVuYWJsZScsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9ldmVudHMvbm9uZGlzcG9zYWJsZWV2ZW50dGFyZ2V0X3ZpYV9nb29nZXZlbnRzX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5ldmVudHMuTm9uRGlzcG9zYWJsZUV2ZW50VGFyZ2V0R29vZ0V2ZW50c1Rlc3QnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5ldmVudFRhcmdldFRlc3RlcicsICdnb29nLmxhYnMuZXZlbnRzLk5vbkRpc3Bvc2FibGVFdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZXZlbnRzL3RvdWNoLmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoJywgJ2dvb2cubGFicy5ldmVudHMudG91Y2guVG91Y2hEYXRhJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2V2ZW50cy90b3VjaF90ZXN0LmpzJywgWydnb29nLmxhYnMuZXZlbnRzLnRvdWNoVGVzdCddLCBbJ2dvb2cubGFicy5ldmVudHMudG91Y2gnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdi5qcycsIFsnZ29vZy5sYWJzLmZvcm1hdC5jc3YnLCAnZ29vZy5sYWJzLmZvcm1hdC5jc3YuUGFyc2VFcnJvcicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5Ub2tlbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvZm9ybWF0L2Nzdl90ZXN0LmpzJywgWydnb29nLmxhYnMuZm9ybWF0LmNzdlRlc3QnXSwgWydnb29nLmxhYnMuZm9ybWF0LmNzdicsICdnb29nLmxhYnMuZm9ybWF0LmNzdi5QYXJzZUVycm9yJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdC5qcycsIFsnZ29vZy5sYWJzLmkxOG4uR2VuZGVySW5mbycsICdnb29nLmxhYnMuaTE4bi5HZW5kZXJJbmZvLkdlbmRlcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdGZvcm1hdF90ZXN0LmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0VGVzdCddLCBbJ2dvb2cubGFicy5pMThuLkdlbmRlckluZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196dScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9pMThuL2xpc3RzeW1ib2xzLmpzJywgWydnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9scycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hbScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hcl9FRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19heicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ibicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jaHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY3knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZXNfNDE5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX01YJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZpbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mcl9DQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaGF3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2luJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2l3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2phJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ttJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21rJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX210JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25iJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25lJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25sJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25vX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3B0X1BUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3J1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NoJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NrJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfVFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfenUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL2kxOG4vbGlzdHN5bWJvbHNleHQuanMnLCBbJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzRXh0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX05BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FmX1pBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FncScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hZ3FfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYWtfR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYW1fRVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXJfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0FFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0JIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0RKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0VSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0pPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0tXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX0xZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX01SJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX09NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1BTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1FBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1REJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1ROJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1hCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FyX1lFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzYScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hc2FfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXN0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2FzdF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2F6X0N5cmxfQVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYXpfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19hel9MYXRuX0FaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JhcycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iYXNfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVfQlknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmVtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JlbV9aTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19iZXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYmV6X1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JnX0JHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JtX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JuX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0NOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JvX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyX0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JyeCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19icnhfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfQ3lybCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ic19DeXJsX0JBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2JzX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfYnNfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9BRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9GUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jYV9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jY3AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2NwX0JEJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NjcF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2ViX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NnZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19jZ2dfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2hyX1VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NrYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ja2JfSVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfY2tiX0lSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2NzX0NaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2N5X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0RLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhX0dMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kYXZfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfSVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTEknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGVfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZGplJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2RqZV9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R1YScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kdWFfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZHlvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2R5b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19keicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19kel9CVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lYnUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZWJ1X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VlX1RHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0NZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VsX0dSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VuXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19lbl8xNTAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQUknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fQ1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRksnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fRk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fR1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fSk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fS1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTFMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTUgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTVknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fTlonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUFcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fU1onLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVE8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVU0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVVNfUE9TSVgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fV1MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWEEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWk0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW5fWlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZW9fMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0FSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0JaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NMJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0NVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0RPJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0VDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0dUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0hOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX0lDJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX05JJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BBJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1BZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1NWJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1VZJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2VzX1ZFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V0X0VFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V1X0VTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2V3bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ld29fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmFfSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0JGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0dNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9HVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9ORScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19mZl9MYXRuX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ZmX0xhdG5fU0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZmZfTGF0bl9TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maV9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19maWxfUEgnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fREsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZm9fRk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQkwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfREonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfRlInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1AnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfSFQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfS00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTUwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTVUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfTkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUEYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUE0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUkUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfUlcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU0MnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfU1knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVEcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVE4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfVlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfV0YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnJfWVQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZnVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2Z1cl9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19meV9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nYV9JRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nZF9HQicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nbF9FUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19nc3dfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3N3X0ZSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2dzd19MSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ndXonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfZ3V6X0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2d2X0lNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX0dIJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2hhd19VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oZV9JTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oaV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ocl9IUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19oc2InLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfaHNiX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h1X0hVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2h5X0FNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2lhXzAwMScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZF9JRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pZ19ORycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19paV9DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pc19JUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9JVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9TTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19pdF9WQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qYV9KUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qZ28nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfamdvX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2ptYycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19qbWNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfanZfSUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FfR0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FiJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2thYl9EWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rYW0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2FtX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tkZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rZGVfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2VhJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tlYV9DVicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19raHEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2hxX01MJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tpX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2trX0taJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2traicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ra2pfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xfR0wnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa2xuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tsbl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbV9LSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rbl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb19LUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rb2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa29rX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2JfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NmJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2tzZl9DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19rc2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfa3NoX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t1X1RSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t3X0dCJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2t5X0tHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xhZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sYWdfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGJfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGdfVUcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbGt0JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xrdF9VUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9BTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sbl9DRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sb19MQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19scmMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHJjX0lRJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2xyY19JUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdF9MVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdV9DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX2x1eScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19sdXlfS0UnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbHZfTFYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWFzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21hc19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tYXNfVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWVyJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21lcl9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZmUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWZlX01VJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nX01HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21naCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tZ2hfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbWdvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX21nb19DTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19taV9OWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ta19NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbF9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tbl9NTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tcl9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19CTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdF9NVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tdWEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbXVhX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX215X01NJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX216bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19tem5fSVInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmFxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25hcV9OQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9OTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uYl9TSicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZF9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbmRzX0RFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25kc19OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19uZV9OUCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9BVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9CUScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9DVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9OTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubF9TWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbm1nX0NNJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX25uaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ubmhfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnVzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX251c19TUycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ueW4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfbnluX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0VUJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29tX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29yX0lOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX0dFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX29zX1JVJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0FyYWInLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGFfQXJhYl9QSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19wYV9HdXJ1JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3BhX0d1cnVfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcGxfUEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfQUYnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHNfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfQ1YnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfR1cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTFUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfU1QnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcHRfVEwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfQk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfRUMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcXVfUEUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm0nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm1fQ0gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm5fQkknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fTUQnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9fUk8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcm9mJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3JvZl9UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9CWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9LWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9NRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydV9VQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19ydycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd19SVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19yd2snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfcndrX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYWhfUlUnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2FxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NhcV9LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zYnAnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2JwX1RaJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NkX1BLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX0ZJJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX05PJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlX1NFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NlaCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZWhfTVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2VzJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Nlc19NTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zZ19DRicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zaGknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX0xhdG5fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2hpX1RmbmdfTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2lfTEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2tfU0snLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc2xfU0knLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc21uJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Ntbl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbl9aVycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zbycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19ESicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zb19TTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9BTCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9NSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcV9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfQkEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfQ3lybF9NRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9DeXJsX1JTJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0N5cmxfWEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9CQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zcl9MYXRuX01FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3NyX0xhdG5fUlMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfc3JfTGF0bl9YSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9BWCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9GSScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zdl9TRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19DRCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19LRScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19UWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc19zd19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9MSycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9NWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190YV9TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZV9JTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZW8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdGVvX0tFJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Rlb19VRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190ZycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190Z19USicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aF9USCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aV9FVCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190aycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190a19UTScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190b19UTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9DWScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190cl9UUicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190dF9SVScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190d3EnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdHdxX05FJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3R6bScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc190em1fTUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWcnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWdfQ04nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdWtfVUEnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfSU4nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXJfUEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQXJhYicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9BcmFiX0FGJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0N5cmwnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdXpfQ3lybF9VWicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc191el9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3V6X0xhdG5fVVonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfdmFpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9MYXRuX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZhaV9WYWlpX0xSJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3ZpX1ZOJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3Z1bicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc192dW5fVFonLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfd2FlJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3dhZV9DSCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193bycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc193b19TTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194aF9aQScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc194b2cnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeG9nX1VHJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lhdicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195YXZfQ00nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWknLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfeWlfMDAxJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX0JKJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3lvX05HJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3l1ZScsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFucycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudCcsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc195dWVfSGFudF9ISycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196Z2gnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemdoX01BJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnMnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19DTicsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW5zX0hLJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnNfTU8nLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFuc19TRycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50JywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3poX0hhbnRfSEsnLCAnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHNfemhfSGFudF9NTycsICdnb29nLmxhYnMuaTE4bi5MaXN0Rm9ybWF0U3ltYm9sc196aF9IYW50X1RXJywgJ2dvb2cubGFicy5pMThuLkxpc3RGb3JtYXRTeW1ib2xzX3p1X1pBJ10sIFsnZ29vZy5sYWJzLmkxOG4uTGlzdEZvcm1hdFN5bWJvbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbW9jay9tb2NrLmpzJywgWydnb29nLmxhYnMubW9jaycsICdnb29nLmxhYnMubW9jay5UaW1lb3V0RXJyb3InLCAnZ29vZy5sYWJzLm1vY2suVmVyaWZpY2F0aW9uRXJyb3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dCcsICdnb29nLmxhYnMubW9jay50aW1lb3V0LlRpbWVvdXRNb2RlJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uQmFzZVZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uLlZlcmlmaWNhdGlvbk1vZGUnLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svbW9ja190ZXN0LmpzJywgWydnb29nLmxhYnMubW9ja1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy5tb2NrJywgJ2dvb2cubGFicy5tb2NrLlRpbWVvdXRFcnJvcicsICdnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25FcnJvcicsICdnb29nLmxhYnMubW9jay50aW1lb3V0JywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdGltZW91dG1vZGUuanMnLCBbJ2dvb2cubGFicy5tb2NrLnRpbWVvdXQnLCAnZ29vZy5sYWJzLm1vY2sudGltZW91dC5UaW1lb3V0TW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZS5qcycsIFsnZ29vZy5sYWJzLm1vY2sudmVyaWZpY2F0aW9uJywgJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbi5CYXNlVmVyaWZpY2F0aW9uTW9kZScsICdnb29nLmxhYnMubW9jay52ZXJpZmljYXRpb24uVmVyaWZpY2F0aW9uTW9kZSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL21vY2svdmVyaWZpY2F0aW9ubW9kZV90ZXN0LmpzJywgWydnb29nLmxhYnMubW9jay5WZXJpZmljYXRpb25Nb2RlVGVzdCddLCBbJ2dvb2cubGFicy5tb2NrLnZlcmlmaWNhdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2UuanMnLCBbJ2dvb2cubGFicy5uZXQuaW1hZ2UnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvaW1hZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC5pbWFnZVRlc3QnXSwgWydnb29nLmxhYnMubmV0LmltYWdlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LldlYkNoYW5uZWwnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5MaXN0ZW5hYmxlJywgJ2dvb2cubmV0LlhtbEh0dHBGYWN0b3J5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Jhc2V0ZXN0Y2hhbm5lbC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkJhc2VUZXN0Q2hhbm5lbCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuV2ViQ2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jaGFubmVsLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2NoYW5uZWxyZXF1ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXN5bmMuVGhyb3R0bGUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsRGVidWcnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmVudmlyb25tZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvY2hhbm5lbHJlcXVlc3RfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLmNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9jb25uZWN0aW9uc3RhdGUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2Vudmlyb25tZW50LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuZW52aXJvbm1lbnQnXSwgWydnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvZW52aXJvbm1lbnRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkVudmlyb25tZW50VGVzdCddLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5lbnZpcm9ubWVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC9mb3J3YXJkY2hhbm5lbHJlcXVlc3Rwb29sLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuRm9yd2FyZENoYW5uZWxSZXF1ZXN0UG9vbCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL2ZvcndhcmRjaGFubmVscmVxdWVzdHBvb2xfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2xUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Gb3J3YXJkQ2hhbm5lbFJlcXVlc3RQb29sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL25ldHV0aWxzLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwubmV0VXRpbHMnXSwgWydnb29nLlVyaScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3JlcXVlc3RzdGF0cy5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzLkV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLnJlcXVlc3RTdGF0cy5TdGF0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdEV2ZW50JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuVGltaW5nRXZlbnQnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZS5qcycsIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5ydW4nLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5CYXNlVGVzdENoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWwnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5Db25uZWN0aW9uU3RhdGUnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxEZWJ1ZycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQucnBjLkh0dHBDb3JzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZV90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkZvcndhcmRDaGFubmVsUmVxdWVzdFBvb2wnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5uZXRVdGlscycsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwucmVxdWVzdFN0YXRzJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5yZXF1ZXN0U3RhdHMuU3RhdCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGJhc2V0cmFuc3BvcnQuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZVRyYW5zcG9ydCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmpzb24nLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XZWJDaGFubmVsQmFzZScsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLmxvZycsICdnb29nLm5ldC5XZWJDaGFubmVsJywgJ2dvb2cubmV0LldlYkNoYW5uZWxUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcucGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbC93ZWJjaGFubmVsYmFzZXRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwud2ViQ2hhbm5lbEJhc2VUcmFuc3BvcnRUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5DaGFubmVsUmVxdWVzdCcsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbEJhc2UnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0JywgJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJywgJ2dvb2cubmV0LldlYkNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2ViY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2ViQ2hhbm5lbERlYnVnJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC93ZWJjaGFubmVsL3dpcmUuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4LmpzJywgWydnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZVY4J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLmxhYnMubmV0LndlYkNoYW5uZWwuV2lyZScsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWwvd2lyZXY4X3Rlc3QuanMnLCBbJ2dvb2cubGFicy5uZXQud2ViQ2hhbm5lbC5XaXJlVjhUZXN0J10sIFsnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldpcmVWOCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9uZXQvd2ViY2hhbm5lbHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQuV2ViQ2hhbm5lbFRyYW5zcG9ydCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvbmV0L3dlYmNoYW5uZWx0cmFuc3BvcnRmYWN0b3J5LmpzJywgWydnb29nLm5ldC5jcmVhdGVXZWJDaGFubmVsVHJhbnNwb3J0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLm5ldC53ZWJDaGFubmVsLldlYkNoYW5uZWxCYXNlVHJhbnNwb3J0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHIuanMnLCBbJ2dvb2cubGFicy5uZXQueGhyJywgJ2dvb2cubGFicy5uZXQueGhyLkVycm9yJywgJ2dvb2cubGFicy5uZXQueGhyLkh0dHBFcnJvcicsICdnb29nLmxhYnMubmV0Lnhoci5PcHRpb25zJywgJ2dvb2cubGFicy5uZXQueGhyLlBvc3REYXRhJywgJ2dvb2cubGFicy5uZXQueGhyLlJlc3BvbnNlVHlwZScsICdnb29nLmxhYnMubmV0Lnhoci5UaW1lb3V0RXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL25ldC94aHJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLm5ldC54aHJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxhYnMubmV0LnhocicsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3B1YnN1Yi9icm9hZGNhc3RwdWJzdWIuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cubWF0aCcsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9wdWJzdWIvYnJvYWRjYXN0cHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kZWJ1Zy5Mb2dnZXInLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy5wdWJzdWIuQnJvYWRjYXN0UHViU3ViJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0b3JhZ2UvYm91bmRlZGNvbGxlY3RhYmxlc3RvcmFnZS5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdG9yYWdlL2JvdW5kZWRjb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0b3JhZ2UuQm91bmRlZENvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLmxhYnMuc3RvcmFnZS5Cb3VuZGVkQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0cnVjdHMvbXVsdGltYXAuanMnLCBbJ2dvb2cubGFicy5zdHJ1Y3RzLk11bHRpbWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvc3RydWN0cy9tdWx0aW1hcF90ZXN0LmpzJywgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcFRlc3QnXSwgWydnb29nLmxhYnMuc3RydWN0cy5NdWx0aW1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy9zdHlsZS9waXhlbGRlbnNpdHltb25pdG9yLmpzJywgWydnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvcicsICdnb29nLmxhYnMuc3R5bGUuUGl4ZWxEZW5zaXR5TW9uaXRvci5EZW5zaXR5JywgJ2dvb2cubGFicy5zdHlsZS5QaXhlbERlbnNpdHlNb25pdG9yLkV2ZW50VHlwZSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3N0eWxlL3BpeGVsZGVuc2l0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sYWJzLnN0eWxlLlBpeGVsRGVuc2l0eU1vbml0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXQuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0J10sIFsnZ29vZy5kZWJ1Zy5FcnJvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Fzc2VydHRoYXRfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdFRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyRXJyb3InLCAnZ29vZy5sYWJzLnRlc3RpbmcuYXNzZXJ0VGhhdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kZWNvcmF0b3JtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Bbnl0aGluZ01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3RpbmcvZGVjb3JhdG9ybWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kZWNvcmF0b3JNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFueXRoaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cmllc01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzRW50cnlNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkhhc0tleU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSGFzVmFsdWVNYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9kaWN0aW9uYXJ5bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5kaWN0aW9uYXJ5TWF0Y2hlclRlc3QnXSwgWydnb29nLmxhYnMudGVzdGluZy5IYXNFbnRyeU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnXSwgWydnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuQ29uc29sZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9lbnZpcm9ubWVudF90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5lbnZpcm9ubWVudFRlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2Vudmlyb25tZW50X3VzYWdlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLmVudmlyb25tZW50VXNhZ2VUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9qc29uX2Z1enppbmcuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy90ZXN0aW5nL2pzb25fZnV6emluZ190ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5Kc29uRnV6emluZ1Rlc3QnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sYWJzLnRlc3RpbmcuSnNvbkZ1enppbmcnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXIuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5BbnlPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOb3RNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmxvZ2ljTWF0Y2hlcnMnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9sb2dpY21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcubG9naWNNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLkFsbE9mTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5HcmVhdGVyVGhhbk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTWF0Y2hlckVycm9yJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9tYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlOdW1iZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNsb3NlVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkVxdWFsVG9NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkdyZWF0ZXJUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuR3JlYXRlclRoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkxlc3NUaGFuRXF1YWxUb01hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9udW1iZXJtYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy50ZXN0aW5nLm51bWJlck1hdGNoZXJUZXN0J10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuTGVzc1RoYW5NYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5hc3NlcnRUaGF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlci5qcycsIFsnZ29vZy5sYWJzLnRlc3RpbmcuQW55T2JqZWN0TWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5IYXNQcm9wZXJ0eU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSW5zdGFuY2VPZk1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNOdWxsTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5Jc051bGxPclVuZGVmaW5lZE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuSXNVbmRlZmluZWRNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLk9iamVjdEVxdWFsc01hdGNoZXInXSwgWydnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvb2JqZWN0bWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5vYmplY3RNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5PYmplY3RFcXVhbHNNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdGVzdGluZy9zdHJpbmdtYXRjaGVyLmpzJywgWydnb29nLmxhYnMudGVzdGluZy5BbnlTdHJpbmdNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLkNvbnRhaW5zU3RyaW5nTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5FbmRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxUb0lnbm9yaW5nV2hpdGVzcGFjZU1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuRXF1YWxzTWF0Y2hlcicsICdnb29nLmxhYnMudGVzdGluZy5SZWdleE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RhcnRzV2l0aE1hdGNoZXInLCAnZ29vZy5sYWJzLnRlc3RpbmcuU3RyaW5nQ29udGFpbnNJbk9yZGVyTWF0Y2hlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmxhYnMudGVzdGluZy5NYXRjaGVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3Rlc3Rpbmcvc3RyaW5nbWF0Y2hlcl90ZXN0LmpzJywgWydnb29nLmxhYnMudGVzdGluZy5zdHJpbmdNYXRjaGVyVGVzdCddLCBbJ2dvb2cubGFicy50ZXN0aW5nLk1hdGNoZXJFcnJvcicsICdnb29nLmxhYnMudGVzdGluZy5TdHJpbmdDb250YWluc0luT3JkZXJNYXRjaGVyJywgJ2dvb2cubGFicy50ZXN0aW5nLmFzc2VydFRoYXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2Jyb3dzZXIuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlciddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLmludGVybmFsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9icm93c2VyX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmRldmljZSddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZGV2aWNlX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZGV2aWNlJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2VuZ2luZS5qcycsIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5lbmdpbmUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvZW5naW5lX3Rlc3QuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L2V4dHJhLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9leHRyYV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LmV4dHJhVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmV4dHJhJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xhYnMvdXNlcmFnZW50L3BsYXRmb3JtLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtVGVzdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdGVzdF9hZ2VudHMuanMnLCBbJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsYWJzL3VzZXJhZ2VudC91dGlsLmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWwnXSwgWydnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdXRpbF90ZXN0LmpzJywgWydnb29nLmxhYnMudXNlckFnZW50LnV0aWxUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXIuanMnLCBbJ2dvb2cubGFicy51c2VyYWdlbnQudmVyaWZpZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbGFicy91c2VyYWdlbnQvdmVyaWZpZXJfdGVzdC5qcycsIFsnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllclRlc3QnXSwgWydnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sYWJzLnVzZXJhZ2VudC52ZXJpZmllcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9hZGVyL2Fic3RyYWN0bW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlci5DYWxsYmFja1R5cGUnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvYWRlci9hY3RpdmVtb2R1bGVtYW5hZ2VyLmpzJywgWydnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9hZGVyLkFic3RyYWN0TW9kdWxlTWFuYWdlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJpZXMuanMnLCBbJ2dvb2cubG9jYWxlLmNvdW50cmllcyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9jb3VudHJ5bGFuZ3VhZ2VuYW1lc190ZXN0LmpzJywgWydnb29nLmxvY2FsZS5jb3VudHJ5TGFuZ3VhZ2VOYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2RlZmF1bHRsb2NhbGVuYW1lY29uc3RhbnRzLmpzJywgWydnb29nLmxvY2FsZS5kZWZhdWx0TG9jYWxlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9nZW5lcmljZm9udG5hbWVzLmpzJywgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2dlbmVyaWNmb250bmFtZXNfdGVzdC5qcycsIFsnZ29vZy5sb2NhbGUuZ2VuZXJpY0ZvbnROYW1lc1Rlc3QnXSwgWydnb29nLmxvY2FsZS5nZW5lcmljRm9udE5hbWVzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvZ2VuZXJpY2ZvbnRuYW1lc2RhdGEuanMnLCBbJ2dvb2cubG9jYWxlLmdlbmVyaWNGb250TmFtZXNEYXRhJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL2xvY2FsZS5qcycsIFsnZ29vZy5sb2NhbGUnXSwgWydnb29nLmxvY2FsZS5uYXRpdmVOYW1lQ29uc3RhbnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvbmF0aXZlbmFtZWNvbnN0YW50cy5qcycsIFsnZ29vZy5sb2NhbGUubmF0aXZlTmFtZUNvbnN0YW50cyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS9zY3JpcHRUb0xhbmd1YWdlcy5qcycsIFsnZ29vZy5sb2NhbGUuc2NyaXB0VG9MYW5ndWFnZXMnXSwgWydnb29nLmxvY2FsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZGV0ZWN0aW9uLmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbiddLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvY2FsZS90aW1lem9uZWRldGVjdGlvbl90ZXN0LmpzJywgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvblRlc3QnXSwgWydnb29nLmxvY2FsZS50aW1lWm9uZURldGVjdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9jYWxlL3RpbWV6b25lZmluZ2VycHJpbnQuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lRmluZ2VycHJpbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0LmpzJywgWydnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVBbGxMb25nTmFtZXMnLCAnZ29vZy5sb2NhbGUuZ2V0VGltZVpvbmVTZWxlY3RlZExvbmdOYW1lcycsICdnb29nLmxvY2FsZS5nZXRUaW1lWm9uZVNlbGVjdGVkU2hvcnROYW1lcyddLCBbJ2dvb2cubG9jYWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdsb2NhbGUvdGltZXpvbmVsaXN0X3Rlc3QuanMnLCBbJ2dvb2cubG9jYWxlLlRpbWVab25lTGlzdFRlc3QnXSwgWydnb29nLmxvY2FsZScsICdnb29nLmxvY2FsZS5UaW1lWm9uZUxpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ2xvZy9sb2cuanMnLCBbJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubG9nLkxvZ1JlY29yZCcsICdnb29nLmxvZy5Mb2dnZXInXSwgWydnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ1JlY29yZCcsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbG9nL2xvZ190ZXN0LmpzJywgWydnb29nLmxvZ1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ01hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtLmpzJywgWydnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYWZmaW5ldHJhbnNmb3JtX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5BZmZpbmVUcmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkFmZmluZVRyYW5zZm9ybScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9iZXppZXIuanMnLCBbJ2dvb2cubWF0aC5CZXppZXInXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYmV6aWVyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5CZXppZXJUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cubWF0aC5CZXppZXInLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvYm94LmpzJywgWydnb29nLm1hdGguQm94J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2JveF90ZXN0LmpzJywgWydnb29nLm1hdGguQm94VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZS5qcycsIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwgWydnb29nLm1hdGgnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZTMuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlMyddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2Nvb3JkaW5hdGUzX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvY29vcmRpbmF0ZV90ZXN0LmpzJywgWydnb29nLm1hdGguQ29vcmRpbmF0ZVRlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9leHBvbmVudGlhbGJhY2tvZmYuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmYnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvZXhwb25lbnRpYWxiYWNrb2ZmX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5FeHBvbmVudGlhbEJhY2tvZmZUZXN0J10sIFsnZ29vZy5tYXRoLkV4cG9uZW50aWFsQmFja29mZicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyLmpzJywgWydnb29nLm1hdGguSW50ZWdlciddLCBbJ2dvb2cucmVmbGVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pbnRlZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5JbnRlZ2VyVGVzdCddLCBbJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9pbnRlcnBvbGF0b3IxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxLmpzJywgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5JbnRlcnBvbGF0b3IxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9saW5lYXIxX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuTGluZWFyMVRlc3QnXSwgWydnb29nLm1hdGguaW50ZXJwb2xhdG9yLkxpbmVhcjEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3BjaGlwMS5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnXSwgWydnb29nLm1hdGgnLCAnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2ludGVycG9sYXRvci9wY2hpcDFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDFUZXN0J10sIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5QY2hpcDEnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTEuanMnLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguaW50ZXJwb2xhdG9yLkludGVycG9sYXRvcjEnLCAnZ29vZy5tYXRoLnRkbWEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvaW50ZXJwb2xhdG9yL3NwbGluZTFfdGVzdC5qcycsIFsnZ29vZy5tYXRoLmludGVycG9sYXRvci5TcGxpbmUxVGVzdCddLCBbJ2dvb2cubWF0aC5pbnRlcnBvbGF0b3IuU3BsaW5lMScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9pcmVjdC5qcycsIFsnZ29vZy5tYXRoLklSZWN0J10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lLmpzJywgWydnb29nLm1hdGguTGluZSddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9saW5lX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5MaW5lVGVzdCddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5MaW5lJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL2xvbmcuanMnLCBbJ2dvb2cubWF0aC5Mb25nJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucmVmbGVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbG9uZ190ZXN0LmpzJywgWydnb29nLm1hdGguTG9uZ1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoLkxvbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aC5qcycsIFsnZ29vZy5tYXRoJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvbWF0aF90ZXN0LmpzJywgWydnb29nLm1hdGhUZXN0J10sIFsnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL21hdHJpeC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9tYXRyaXhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLk1hdHJpeFRlc3QnXSwgWydnb29nLm1hdGguTWF0cml4JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGguanMnLCBbJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cubWF0aC5QYXRoLlNlZ21lbnQnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlBhdGhUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLm1hdGguQWZmaW5lVHJhbnNmb3JtJywgJ2dvb2cubWF0aC5QYXRoJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3BhdGhzLmpzJywgWydnb29nLm1hdGgucGF0aHMnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLm1hdGguUGF0aCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9wYXRoc190ZXN0LmpzJywgWydnb29nLm1hdGgucGF0aHNUZXN0J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLnBhdGhzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3JhbmdlLmpzJywgWydnb29nLm1hdGguUmFuZ2UnXSwgWydnb29nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvcmFuZ2VfdGVzdC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlVGVzdCddLCBbJ2dvb2cubWF0aC5SYW5nZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yYW5nZXNldC5qcycsIFsnZ29vZy5tYXRoLlJhbmdlU2V0J10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5tYXRoLlJhbmdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3Jhbmdlc2V0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SYW5nZVNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5tYXRoLlJhbmdlJywgJ2dvb2cubWF0aC5SYW5nZVNldCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0LmpzJywgWydnb29nLm1hdGguUmVjdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5JUmVjdCcsICdnb29nLm1hdGguU2l6ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9yZWN0X3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5SZWN0VGVzdCddLCBbJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvc2l6ZS5qcycsIFsnZ29vZy5tYXRoLlNpemUnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC9zaXplX3Rlc3QuanMnLCBbJ2dvb2cubWF0aC5TaXplVGVzdCddLCBbJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtYXRoL3RkbWEuanMnLCBbJ2dvb2cubWF0aC50ZG1hJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdGRtYV90ZXN0LmpzJywgWydnb29nLm1hdGgudGRtYVRlc3QnXSwgWydnb29nLm1hdGgudGRtYScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMyLmpzJywgWydnb29nLm1hdGguVmVjMiddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjMl90ZXN0LmpzJywgWydnb29nLm1hdGguVmVjMlRlc3QnXSwgWydnb29nLm1hdGguVmVjMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWF0aC92ZWMzLmpzJywgWydnb29nLm1hdGguVmVjMyddLCBbJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZTMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21hdGgvdmVjM190ZXN0LmpzJywgWydnb29nLm1hdGguVmVjM1Rlc3QnXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZTMnLCAnZ29vZy5tYXRoLlZlYzMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZS5qcycsIFsnZ29vZy5tZW1vaXplJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lbW9pemUvbWVtb2l6ZV90ZXN0LmpzJywgWydnb29nLm1lbW9pemVUZXN0J10sIFsnZ29vZy5tZW1vaXplJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYWJzdHJhY3RjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbFRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2J1ZmZlcmVkY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuQnVmZmVyZWRDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvYnVmZmVyZWRjaGFubmVsX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkJ1ZmZlcmVkQ2hhbm5lbFRlc3QnXSwgWydnb29nLmRlYnVnLkNvbnNvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5CdWZmZXJlZENoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmFzeW5jLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvZGVmZXJyZWRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5EZWZlcnJlZENoYW5uZWwnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tZXNzYWdpbmcuTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9kZWZlcnJlZGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJjbGllbnQuanMnLCBbJ2dvb2cubWVzc2FnaW5nLkxvZ2dlckNsaWVudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRlYnVnJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL2xvZ2dlcmNsaWVudF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnRUZXN0J10sIFsnZ29vZy5kZWJ1ZycsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJDbGllbnQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbG9nZ2Vyc2VydmVyLmpzJywgWydnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5sb2cnLCAnZ29vZy5sb2cuTGV2ZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9sb2dnZXJzZXJ2ZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTG9nZ2VyU2VydmVyVGVzdCddLCBbJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm1lc3NhZ2luZy5Mb2dnZXJTZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLk1lc3NhZ2VDaGFubmVsJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL21lc3NhZ2luZy5qcycsIFsnZ29vZy5tZXNzYWdpbmcnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvbWVzc2FnaW5nX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsVGVzdCddLCBbJ2dvb2cubWVzc2FnaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLk11bHRpQ2hhbm5lbC5WaXJ0dWFsQ2hhbm5lbCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NZXNzYWdlQ2hhbm5lbCcsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL211bHRpY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWxUZXN0J10sIFsnZ29vZy5tZXNzYWdpbmcuTXVsdGlDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNhbGxlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cubWVzc2FnaW5nLkRlZmVycmVkQ2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjYWxsZXJfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubWVzc2FnaW5nLk1vY2tNZXNzYWdlQ2hhbm5lbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRjaGFubmVsLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZGVidWcnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuanNvbicsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5BYnN0cmFjdENoYW5uZWwnLCAnZ29vZy5tZXNzYWdpbmcuRGVmZXJyZWRDaGFubmVsJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydGNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWxUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5qc29uJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3BvcnRuZXR3b3JrX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCcsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yLmpzJywgWydnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJywgJ2dvb2cubWVzc2FnaW5nLlBvcnROZXR3b3JrJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcG9ydG9wZXJhdG9yX3Rlc3QuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlBvcnRPcGVyYXRvclRlc3QnXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0TmV0d29yaycsICdnb29nLm1lc3NhZ2luZy5Qb3J0T3BlcmF0b3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtZXNzYWdpbmcvcmVzcG9uZGluZ2NoYW5uZWwuanMnLCBbJ2dvb2cubWVzc2FnaW5nLlJlc3BvbmRpbmdDaGFubmVsJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm1lc3NhZ2luZy5NdWx0aUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy9yZXNwb25kaW5nY2hhbm5lbF90ZXN0LmpzJywgWydnb29nLm1lc3NhZ2luZy5SZXNwb25kaW5nQ2hhbm5lbFRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5tZXNzYWdpbmcuUmVzcG9uZGluZ0NoYW5uZWwnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRjaGFubmVsX3dvcmtlci5qcycsIFsnZ29vZy5tZXNzYWdpbmcudGVzdGRhdGEucG9ydGNoYW5uZWxfd29ya2VyJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21lc3NhZ2luZy90ZXN0ZGF0YS9wb3J0bmV0d29ya193b3JrZXIxLmpzJywgWydnb29nLm1lc3NhZ2luZy50ZXN0ZGF0YS5wb3J0bmV0d29ya193b3JrZXIxJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydENhbGxlcicsICdnb29nLm1lc3NhZ2luZy5Qb3J0Q2hhbm5lbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbWVzc2FnaW5nL3Rlc3RkYXRhL3BvcnRuZXR3b3JrX3dvcmtlcjIuanMnLCBbJ2dvb2cubWVzc2FnaW5nLnRlc3RkYXRhLnBvcnRuZXR3b3JrX3dvcmtlcjInXSwgWydnb29nLm1lc3NhZ2luZy5Qb3J0Q2FsbGVyJywgJ2dvb2cubWVzc2FnaW5nLlBvcnRDaGFubmVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvYWJzdHJhY3Rtb2R1bGVsb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkFic3RyYWN0TW9kdWxlTG9hZGVyJ10sIFsnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL2Jhc2Vtb2R1bGUuanMnLCBbJ2dvb2cubW9kdWxlLkJhc2VNb2R1bGUnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5tb2R1bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9sb2FkZXIuanMnLCBbJ2dvb2cubW9kdWxlLkxvYWRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLm1vZHVsZScsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL21vZHVsZS5qcycsIFsnZ29vZy5tb2R1bGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlaW5mby5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVpbmZvX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUluZm9UZXN0J10sIFsnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVJbmZvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkY2FsbGJhY2suanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFjayddLCBbJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cubW9kdWxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGNhbGxiYWNrX3Rlc3QuanMnLCBbJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRDYWxsYmFja1Rlc3QnXSwgWydnb29nLmRlYnVnLkVycm9ySGFuZGxlcicsICdnb29nLmRlYnVnLmVudHJ5UG9pbnRSZWdpc3RyeScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbG9hZGVyLmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVMb2FkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SWQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxhYnMudXNlckFnZW50LmJyb3dzZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUuQWJzdHJhY3RNb2R1bGVMb2FkZXInLCAnZ29vZy5uZXQuQnVsa0xvYWRlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ21vZHVsZS9tb2R1bGVsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTG9hZGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLmxvYWRlci5hY3RpdmVNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubW9kdWxlLk1vZHVsZUxvYWRlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlci5qcycsIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlcicsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkNhbGxiYWNrVHlwZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyLkZhaWx1cmVUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLlRyYWNlJywgJ2dvb2cuZGlzcG9zYWJsZS5JRGlzcG9zYWJsZScsICdnb29nLmRpc3Bvc2VBbGwnLCAnZ29vZy5sb2FkZXIuQWJzdHJhY3RNb2R1bGVNYW5hZ2VyJywgJ2dvb2cubG9hZGVyLmFjdGl2ZU1vZHVsZU1hbmFnZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5tb2R1bGUnLCAnZ29vZy5tb2R1bGUuTW9kdWxlSW5mbycsICdnb29nLm1vZHVsZS5Nb2R1bGVMb2FkQ2FsbGJhY2snLCAnZ29vZy5vYmplY3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdtb2R1bGUvbW9kdWxlbWFuYWdlcl90ZXN0LmpzJywgWydnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tb2R1bGUuQmFzZU1vZHVsZScsICdnb29nLm1vZHVsZS5Nb2R1bGVNYW5hZ2VyJywgJ2dvb2cudGVzdGluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8xJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEFfMi5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQV8yJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbW9kdWxlL3Rlc3RkYXRhL21vZEJfMS5qcycsIFsnZ29vZy5tb2R1bGUudGVzdGRhdGEubW9kQl8xJ10sIFsnZ29vZy5tb2R1bGUuTW9kdWxlTWFuYWdlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Jyb3dzZXJjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FcnJvcicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5FdmVudCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5IYW5kbGVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLkxvZ1NhdmVyJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsLlF1ZXVlZE1hcCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TZXJ2ZXJSZWFjaGFiaWxpdHknLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU2VydmVyUmVhY2hhYmlsaXR5RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdCcsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbC5TdGF0RXZlbnQnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuU3RhdGUnLCAnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWwuVGltaW5nRXZlbnQnXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRlYnVnLlRleHRGb3JtYXR0ZXInLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5qc29uJywgJ2dvb2cuanNvbi5OYXRpdmVKc29uUHJvY2Vzc29yJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0LkJyb3dzZXJUZXN0Q2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcmNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQuQnJvd3NlckNoYW5uZWxUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuanNvbicsICdnb29nLm5ldC5Ccm93c2VyQ2hhbm5lbCcsICdnb29nLm5ldC5DaGFubmVsRGVidWcnLCAnZ29vZy5uZXQuQ2hhbm5lbFJlcXVlc3QnLCAnZ29vZy5uZXQudG1wbmV0d29yaycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvYnJvd3NlcnRlc3RjaGFubmVsLmpzJywgWydnb29nLm5ldC5Ccm93c2VyVGVzdENoYW5uZWwnXSwgWydnb29nLmpzb24uTmF0aXZlSnNvblByb2Nlc3NvcicsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdC5FcnJvcicsICdnb29nLm5ldC50bXBuZXR3b3JrJywgJ2dvb2cuc3RyaW5nLlBhcnNlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2J1bGtsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXInXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuQnVsa0xvYWRlckhlbHBlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkJ1bGtMb2FkZXJUZXN0J10sIFsnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cubmV0LkJ1bGtMb2FkZXInLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9idWxrbG9hZGVyaGVscGVyLmpzJywgWydnb29nLm5ldC5CdWxrTG9hZGVySGVscGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbGRlYnVnLmpzJywgWydnb29nLm5ldC5DaGFubmVsRGVidWcnXSwgWydnb29nLmpzb24nLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY2hhbm5lbHJlcXVlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0JywgJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0LkVycm9yJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5odG1sLlNhZmVVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NoYW5uZWxyZXF1ZXN0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNoYW5uZWxSZXF1ZXN0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkJyb3dzZXJDaGFubmVsJywgJ2dvb2cubmV0LkNoYW5uZWxEZWJ1ZycsICdnb29nLm5ldC5DaGFubmVsUmVxdWVzdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvY29va2llcy5qcycsIFsnZ29vZy5uZXQuQ29va2llcycsICdnb29nLm5ldC5jb29raWVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHsnbGFuZyc6ICdlczUnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nvb2tpZXNfdGVzdC5qcycsIFsnZ29vZy5uZXQuY29va2llc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubmV0LkNvb2tpZXMnLCAnZ29vZy5uZXQuY29va2llcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInXSwgWydnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2NvcnN4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5Db3JzWG1sSHR0cEZhY3RvcnlUZXN0J10sIFsnZ29vZy5uZXQuQ29yc1htbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LkllQ29yc1hockFkYXB0ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9jcm9zc2RvbWFpbnJwYy5qcycsIFsnZ29vZy5uZXQuQ3Jvc3NEb21haW5ScGMnXSwgWydnb29nLlVyaScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSHR0cFN0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Nyb3NzZG9tYWlucnBjX3Rlc3QuanMnLCBbJ2dvb2cubmV0LkNyb3NzRG9tYWluUnBjVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmxvZycsICdnb29nLm5ldC5Dcm9zc0RvbWFpblJwYycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2Vycm9yY29kZS5qcycsIFsnZ29vZy5uZXQuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2V2ZW50dHlwZS5qcycsIFsnZ29vZy5uZXQuRXZlbnRUeXBlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZldGNoeG1saHR0cGZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubG9nJywgJ2dvb2cubmV0Llhockxpa2UnLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmV0Y2h4bWxodHRwZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5VGVzdCddLCBbJ2dvb2cubmV0LkZldGNoWG1sSHR0cCcsICdnb29nLm5ldC5GZXRjaFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2ZpbGVkb3dubG9hZGVyLmpzJywgWydnb29nLm5ldC5GaWxlRG93bmxvYWRlcicsICdnb29nLm5ldC5GaWxlRG93bmxvYWRlci5FcnJvciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmNyeXB0Lmhhc2gzMicsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmZzJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvZmlsZWRvd25sb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuRmlsZURvd25sb2FkZXJUZXN0J10sIFsnZ29vZy5mcy5FcnJvcicsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRmlsZURvd25sb2FkZXInLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcubmV0LlhocklvUG9vbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2h0dHBzdGF0dXMuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXMnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaHR0cHN0YXR1c25hbWUuanMnLCBbJ2dvb2cubmV0Lkh0dHBTdGF0dXNOYW1lJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLm5ldC5JZnJhbWVJby5JbmNyZW1lbnRhbERhdGFFdmVudCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5IdG1sRm9ybWF0dGVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5sZWdhY3ljb252ZXJzaW9ucycsICdnb29nLmh0bWwudW5jaGVja2VkY29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5yZWZsZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3RydWN0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2lmcmFtZWlvX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklmcmFtZUlvVGVzdCddLCBbJ2dvb2cuZGVidWcnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZGVidWcuTG9nTWFuYWdlcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC5JZnJhbWVJbycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuSWZyYW1lTG9hZE1vbml0b3InXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9pZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5JZnJhbWVMb2FkTW9uaXRvclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXIuanMnLCBbJ2dvb2cubmV0LkltYWdlTG9hZGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaW1hZ2Vsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuSW1hZ2VMb2FkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5JbWFnZUxvYWRlcicsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzLmpzJywgWydnb29nLm5ldC5JcEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NEFkZHJlc3MnLCAnZ29vZy5uZXQuSXB2NkFkZHJlc3MnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvaXBhZGRyZXNzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LklwQWRkcmVzc1Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cubWF0aC5JbnRlZ2VyJywgJ2dvb2cubmV0LklwQWRkcmVzcycsICdnb29nLm5ldC5JcHY0QWRkcmVzcycsICdnb29nLm5ldC5JcHY2QWRkcmVzcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzbG9hZGVyLmpzJywgWydnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvcicsICdnb29nLm5ldC5qc2xvYWRlci5FcnJvckNvZGUnLCAnZ29vZy5uZXQuanNsb2FkZXIuT3B0aW9ucyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNsb2FkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuanNsb2FkZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuanNsb2FkZXInLCAnZ29vZy5uZXQuanNsb2FkZXIuRXJyb3JDb2RlJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvanNvbnAuanMnLCBbJ2dvb2cubmV0Lkpzb25wJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLm5ldC5qc2xvYWRlcicsICdnb29nLm9iamVjdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L2pzb25wX3Rlc3QuanMnLCBbJ2dvb2cubmV0Lkpzb25wVGVzdCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5uZXQuSnNvbnAnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLm5ldC5Nb2NrSUZyYW1lSW8nXSwgWydnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LklmcmFtZUlvJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvci5qcycsIFsnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LklmcmFtZUxvYWRNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbXVsdGlpZnJhbWVsb2FkbW9uaXRvcl90ZXN0LmpzJywgWydnb29nLm5ldC5NdWx0aUlmcmFtZUxvYWRNb25pdG9yVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5uZXQuTXVsdGlJZnJhbWVMb2FkTW9uaXRvcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L25ldHdvcmtzdGF0dXNtb25pdG9yLmpzJywgWydnb29nLm5ldC5OZXR3b3JrU3RhdHVzTW9uaXRvciddLCBbJ2dvb2cuZXZlbnRzLkxpc3RlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9uZXR3b3JrdGVzdGVyLmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLlVyaScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvbmV0d29ya3Rlc3Rlcl90ZXN0LmpzJywgWydnb29nLm5ldC5OZXR3b3JrVGVzdGVyVGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cubmV0Lk5ldHdvcmtUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3JwYy9odHRwY29ycy5qcycsIFsnZ29vZy5uZXQucnBjLkh0dHBDb3JzJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvcnBjL2h0dHBjb3JzX3Rlc3QuanMnLCBbJ2dvb2cubmV0LnJwYy5IdHRwQ29yc1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLm5ldC5ycGMuSHR0cENvcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHBic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvYmFzZTY0cGJzdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRQYlN0cmVhbVBhcnNlclRlc3QnXSwgWydnb29nLmNyeXB0LmJhc2U2NCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9iYXNlNjRzdHJlYW1kZWNvZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFN0cmVhbURlY29kZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5jcnlwdC5iYXNlNjQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2Jhc2U2NHN0cmVhbWRlY29kZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5CYXNlNjRTdHJlYW1EZWNvZGVyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuQmFzZTY0U3RyZWFtRGVjb2RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvanNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlci5PcHRpb25zJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL2pzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5qc29uJywgJ2dvb2cubGFicy50ZXN0aW5nLkpzb25GdXp6aW5nJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvbm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3BianNvbnN0cmVhbXBhcnNlci5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5uZXQuc3RyZWFtcy5Kc29uU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYmpzb25zdHJlYW1wYXJzZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXJUZXN0J10sIFsnZ29vZy5uZXQuc3RyZWFtcy5QYkpzb25TdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3Bic3RyZWFtcGFyc2VyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9wYnN0cmVhbXBhcnNlcl90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyVGVzdCddLCBbJ2dvb2cubmV0LnN0cmVhbXMuUGJTdHJlYW1QYXJzZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3N0cmVhbWZhY3RvcnkuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuY3JlYXRlWGhyTm9kZVJlYWRhYmxlU3RyZWFtJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyTm9kZVJlYWRhYmxlU3RyZWFtJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy9zdHJlYW1wYXJzZXIuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMuU3RyZWFtUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMvdXRpbHMuanMnLCBbJ2dvb2cubmV0LnN0cmVhbXMudXRpbHMnXSwgW10sIHsnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhybm9kZXJlYWRhYmxlc3RyZWFtLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuc3RyZWFtcy5Ob2RlUmVhZGFibGVTdHJlYW0nLCAnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC9zdHJlYW1zL3hocm5vZGVyZWFkYWJsZXN0cmVhbV90ZXN0LmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbVRlc3QnXSwgWydnb29nLm5ldC5zdHJlYW1zLk5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhock5vZGVSZWFkYWJsZVN0cmVhbScsICdnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3N0cmVhbXMveGhyc3RyZWFtcmVhZGVyLmpzJywgWydnb29nLm5ldC5zdHJlYW1zLlhoclN0cmVhbVJlYWRlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmxvZycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvc3RyZWFtcy94aHJzdHJlYW1yZWFkZXJfdGVzdC5qcycsIFsnZ29vZy5uZXQuc3RyZWFtcy5YaHJTdHJlYW1SZWFkZXJUZXN0J10sIFsnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm5ldC5zdHJlYW1zLkJhc2U2NFBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiSnNvblN0cmVhbVBhcnNlcicsICdnb29nLm5ldC5zdHJlYW1zLlBiU3RyZWFtUGFyc2VyJywgJ2dvb2cubmV0LnN0cmVhbXMuWGhyU3RyZWFtUmVhZGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0MS5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDEnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdGVzdGRhdGEvanNsb2FkZXJfdGVzdDIuanMnLCBbJ2dvb2cubmV0LnRlc3RkYXRhLmpzbG9hZGVyX3Rlc3QyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3Rlc3RkYXRhL2pzbG9hZGVyX3Rlc3QzLmpzJywgWydnb29nLm5ldC50ZXN0ZGF0YS5qc2xvYWRlcl90ZXN0MyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC90ZXN0ZGF0YS9qc2xvYWRlcl90ZXN0NC5qcycsIFsnZ29vZy5uZXQudGVzdGRhdGEuanNsb2FkZXJfdGVzdDQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvdG1wbmV0d29yay5qcycsIFsnZ29vZy5uZXQudG1wbmV0d29yayddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5uZXQuQ2hhbm5lbERlYnVnJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0LmpzJywgWydnb29nLm5ldC5XZWJTb2NrZXQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkVycm9yRXZlbnQnLCAnZ29vZy5uZXQuV2ViU29ja2V0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XZWJTb2NrZXQuTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5lbnRyeVBvaW50UmVnaXN0cnknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5sb2cnXSwgeydsYW5nJzogJ2VzNSd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQvd2Vic29ja2V0X3Rlc3QuanMnLCBbJ2dvb2cubmV0LldlYlNvY2tldFRlc3QnXSwgWydnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LldlYlNvY2tldCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3dyYXBwZXJ4bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuV3JhcHBlclhtbEh0dHBGYWN0b3J5J10sIFsnZ29vZy5uZXQuWGhyTGlrZScsICdnb29nLm5ldC5YbWxIdHRwRmFjdG9yeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hocmlvLmpzJywgWydnb29nLm5ldC5YaHJJbycsICdnb29nLm5ldC5YaHJJby5SZXNwb25zZVR5cGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuanNvbi5oeWJyaWQnLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQuRXJyb3JDb2RlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5IdHRwU3RhdHVzJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLm5ldC5YaHJJb1Rlc3QnXSwgWydnb29nLlVyaScsICdnb29nLmRlYnVnLkVudHJ5UG9pbnRNb25pdG9yJywgJ2dvb2cuZGVidWcuRXJyb3JIYW5kbGVyJywgJ2dvb2cuZGVidWcuZW50cnlQb2ludFJlZ2lzdHJ5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cubmV0LlhocklvUG9vbCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJpb3Bvb2xfdGVzdC5qcycsIFsnZ29vZy5uZXQuWGhySW9Qb29sVGVzdCddLCBbJ2dvb2cubmV0LlhocklvUG9vbCcsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveGhybGlrZS5qcycsIFsnZ29vZy5uZXQuWGhyTGlrZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyLmpzJywgWydnb29nLm5ldC5YaHJNYW5hZ2VyJywgJ2dvb2cubmV0Llhock1hbmFnZXIuRXZlbnQnLCAnZ29vZy5uZXQuWGhyTWFuYWdlci5SZXF1ZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94aHJtYW5hZ2VyX3Rlc3QuanMnLCBbJ2dvb2cubmV0Llhock1hbmFnZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhocklvJywgJ2dvb2cubmV0Llhock1hbmFnZXInLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJb1Bvb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveG1saHR0cC5qcycsIFsnZ29vZy5uZXQuRGVmYXVsdFhtbEh0dHBGYWN0b3J5JywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5uZXQuWG1sSHR0cC5PcHRpb25UeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAuUmVhZHlTdGF0ZScsICdnb29nLm5ldC5YbWxIdHRwRGVmaW5lcyddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLm5ldC5XcmFwcGVyWG1sSHR0cEZhY3RvcnknLCAnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94bWxodHRwZmFjdG9yeS5qcycsIFsnZ29vZy5uZXQuWG1sSHR0cEZhY3RvcnknXSwgWydnb29nLm5ldC5YaHJMaWtlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWwuanMnLCBbJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJ10sIFsnZ29vZy5VcmknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmFzeW5jLkRlbGF5JywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwubGVnYWN5Y29udmVyc2lvbnMnLCAnZ29vZy5qc29uJywgJ2dvb2cubG9nJywgJ2dvb2cubWVzc2FnaW5nLkFic3RyYWN0Q2hhbm5lbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ2hhbm5lbFN0YXRlcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcycsICdnb29nLm5ldC54cGMuVXJpQ2ZnRmllbGRzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXJpLnV0aWxzJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxUZXN0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuVXJpJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubG9nJywgJ2dvb2cubG9nLkxldmVsJywgJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzOCd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2Nyb3NzcGFnZWNoYW5uZWxyb2xlLmpzJywgWydnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydC5qcycsIFsnZ29vZy5uZXQueHBjLkRpcmVjdFRyYW5zcG9ydCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5DZmdGaWVsZHMnLCAnZ29vZy5uZXQueHBjLkNyb3NzUGFnZUNoYW5uZWxSb2xlJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnQnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cub2JqZWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCduZXQveHBjL2RpcmVjdHRyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuRGlyZWN0VHJhbnNwb3J0VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydFR5cGVzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9pZnJhbWVwb2xsaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5SZWNlaXZlcicsICdnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydC5TZW5kZXInXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmxvZycsICdnb29nLmxvZy5MZXZlbCcsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLlRyYW5zcG9ydCcsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvaWZyYW1lcG9sbGluZ3RyYW5zcG9ydF90ZXN0LmpzJywgWydnb29nLm5ldC54cGMuSWZyYW1lUG9sbGluZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLklmcmFtZVBvbGxpbmdUcmFuc3BvcnQnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvbmF0aXZlbWVzc2FnaW5ndHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuTmF0aXZlTWVzc2FnaW5nVHJhbnNwb3J0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5sb2cnLCAnZ29vZy5uZXQueHBjJywgJ2dvb2cubmV0LnhwYy5Dcm9zc1BhZ2VDaGFubmVsUm9sZScsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0JywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnRUeXBlcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9uYXRpdmVtZXNzYWdpbmd0cmFuc3BvcnRfdGVzdC5qcycsIFsnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC54cGMnLCAnZ29vZy5uZXQueHBjLkNmZ0ZpZWxkcycsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbCcsICdnb29nLm5ldC54cGMuQ3Jvc3NQYWdlQ2hhbm5lbFJvbGUnLCAnZ29vZy5uZXQueHBjLk5hdGl2ZU1lc3NhZ2luZ1RyYW5zcG9ydCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy9yZWxheS5qcycsIFsnZ29vZy5uZXQueHBjLnJlbGF5J10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ25ldC94cGMvdHJhbnNwb3J0LmpzJywgWydnb29nLm5ldC54cGMuVHJhbnNwb3J0J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuZG9tJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnbmV0L3hwYy94cGMuanMnLCBbJ2dvb2cubmV0LnhwYycsICdnb29nLm5ldC54cGMuQ2ZnRmllbGRzJywgJ2dvb2cubmV0LnhwYy5DaGFubmVsU3RhdGVzJywgJ2dvb2cubmV0LnhwYy5UcmFuc3BvcnROYW1lcycsICdnb29nLm5ldC54cGMuVHJhbnNwb3J0VHlwZXMnLCAnZ29vZy5uZXQueHBjLlVyaUNmZ0ZpZWxkcyddLCBbJ2dvb2cubG9nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0LmpzJywgWydnb29nLm9iamVjdCddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdvYmplY3Qvb2JqZWN0X3Rlc3QuanMnLCBbJ2dvb2cub2JqZWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9hYnNvbHV0ZXBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nXSwgWydnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzdHJhY3RQb3NpdGlvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYWJzdHJhY3Rwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvYW5jaG9yZWRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uJ10sIFsnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkcG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbi5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL2FuY2hvcmVkdmlld3BvcnRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQm94JywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvY2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5jbGllbnRQb3NpdGlvblRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvbWVudWFuY2hvcmVkcG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy9tZW51YW5jaG9yZWRwb3NpdGlvbl90ZXN0LmpzJywgWydnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5NZW51QW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncG9zaXRpb25pbmcvcG9zaXRpb25pbmcuanMnLCBbJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3Bvc2l0aW9uaW5nX3Rlc3QuanMnLCBbJ2dvb2cucG9zaXRpb25pbmdUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3dTdGF0dXMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwb3NpdGlvbmluZy92aWV3cG9ydGNsaWVudHBvc2l0aW9uLmpzJywgWydnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nXSwgWydnb29nLmRvbScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ2xpZW50UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0Y2xpZW50cG9zaXRpb25fdGVzdC5qcycsIFsnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5WaWV3cG9ydENsaWVudFBvc2l0aW9uJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Bvc2l0aW9uaW5nL3ZpZXdwb3J0cG9zaXRpb24uanMnLCBbJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbiddLCBbJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cucG9zaXRpb25pbmcnLCAnZ29vZy5wb3NpdGlvbmluZy5BYnN0cmFjdFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvbmF0aXZlcmVzb2x2ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlciddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL25hdGl2ZXJlc29sdmVyX3Rlc3QuanMnLCBbJ2dvb2cucHJvbWlzZS5uYXRpdmVSZXNvbHZlclRlc3QnXSwgWydnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb21pc2UvcHJvbWlzZS5qcycsIFsnZ29vZy5Qcm9taXNlJ10sIFsnZ29vZy5UaGVuYWJsZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5GcmVlTGlzdCcsICdnb29nLmFzeW5jLnJ1bicsICdnb29nLmFzeW5jLnRocm93RXhjZXB0aW9uJywgJ2dvb2cuZGVidWcuRXJyb3InLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Byb21pc2VfdGVzdC5qcycsIFsnZ29vZy5Qcm9taXNlVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Jlc29sdmVyLmpzJywgWydnb29nLnByb21pc2UuUmVzb2x2ZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3Rlc3RzdWl0ZWFkYXB0ZXIuanMnLCBbJ2dvb2cucHJvbWlzZS50ZXN0U3VpdGVBZGFwdGVyJ10sIFsnZ29vZy5Qcm9taXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm9taXNlL3RoZW5hYmxlLmpzJywgWydnb29nLlRoZW5hYmxlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkRlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTWV0YWRhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2Rlc2NyaXB0b3JfdGVzdC5qcycsIFsnZ29vZy5wcm90bzIuRGVzY3JpcHRvclRlc3QnXSwgWydnb29nLnByb3RvMi5EZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9maWVsZGRlc2NyaXB0b3IuanMnLCBbJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL2ZpZWxkZGVzY3JpcHRvcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3JUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9sYXp5ZGVzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5MYXp5RGVzZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL21lc3NhZ2UuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9tZXNzYWdlX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2VUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi9vYmplY3RzZXJpYWxpemVyLmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvb2JqZWN0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLk9iamVjdFNlcmlhbGl6ZXInLCAnZ29vZy5wcm90bzIuU2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGFja2FnZV90ZXN0LnBiLmpzJywgWydzb21lcHJvdG9wYWNrYWdlLlRlc3RQYWNrYWdlVHlwZXMnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplci5qcycsIFsnZ29vZy5wcm90bzIuUGJMaXRlU2VyaWFsaXplciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb3RvMi5GaWVsZERlc2NyaXB0b3InLCAnZ29vZy5wcm90bzIuTGF6eURlc2VyaWFsaXplcicsICdnb29nLnByb3RvMi5TZXJpYWxpemVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvcGJsaXRlc2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5QYkxpdGVTZXJpYWxpemVyVGVzdCddLCBbJ2dvb2cucHJvdG8yLlBiTGl0ZVNlcmlhbGl6ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdwcm90bzIuVGVzdEFsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3Byb3RvX3Rlc3QuanMnLCBbJ2dvb2cucHJvdG8yLm1lc3NhZ2VUZXN0J10sIFsnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcycsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnLCAnc29tZXByb3RvcGFja2FnZS5UZXN0UGFja2FnZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHJvdG8yL3NlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5wcm90bzIuRmllbGREZXNjcmlwdG9yJywgJ2dvb2cucHJvdG8yLk1lc3NhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXN0LnBiLmpzJywgWydwcm90bzIuVGVzdEFsbFR5cGVzJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsICdwcm90bzIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLCAncHJvdG8yLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCcsICdwcm90bzIuVGVzdERlZmF1bHRDaGlsZCcsICdwcm90bzIuVGVzdERlZmF1bHRQYXJlbnQnXSwgWydnb29nLnByb3RvMi5NZXNzYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwcm90bzIvdGV4dGZvcm1hdHNlcmlhbGl6ZXIuanMnLCBbJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5tYXRoJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucHJvdG8yLkZpZWxkRGVzY3JpcHRvcicsICdnb29nLnByb3RvMi5NZXNzYWdlJywgJ2dvb2cucHJvdG8yLlNlcmlhbGl6ZXInLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi90ZXh0Zm9ybWF0c2VyaWFsaXplcl90ZXN0LmpzJywgWydnb29nLnByb3RvMi5UZXh0Rm9ybWF0U2VyaWFsaXplclRlc3QnXSwgWydnb29nLnByb3RvMi5PYmplY3RTZXJpYWxpemVyJywgJ2dvb2cucHJvdG8yLlRleHRGb3JtYXRTZXJpYWxpemVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAncHJvdG8yLlRlc3RBbGxUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Byb3RvMi91dGlsLmpzJywgWydnb29nLnByb3RvMi5VdGlsJ10sIFsnZ29vZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvcHVic3ViLmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWInXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLnJ1biddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3B1YnN1Yl90ZXN0LmpzJywgWydnb29nLnB1YnN1Yi5QdWJTdWJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnB1YnN1Yi5QdWJTdWInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3RvcGljaWQuanMnLCBbJ2dvb2cucHVic3ViLlRvcGljSWQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdwdWJzdWIvdHlwZWRwdWJzdWIuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cucHVic3ViLlB1YlN1YiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncHVic3ViL3R5cGVkcHVic3ViX3Rlc3QuanMnLCBbJ2dvb2cucHVic3ViLlR5cGVkUHViU3ViVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5wdWJzdWIuVG9waWNJZCcsICdnb29nLnB1YnN1Yi5UeXBlZFB1YlN1YicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0LmpzJywgWydnb29nLnJlZmxlY3QnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVmbGVjdC9yZWZsZWN0X3Rlc3QuanMnLCBbJ2dvb2cucmVmbGVjdFRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnJlZmxlY3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9jaGFpbl90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jaGFpblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvY29tYmluZV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5jb21iaW5lVGVzdCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L2RlZmVycmVkYWRhcHRvci5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJ10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5SZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZWZlcnJlZGFkYXB0b3JfdGVzdC5qcycsIFsnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5yZXN1bHQnLCAnZ29vZy5yZXN1bHQuRGVmZXJyZWRBZGFwdG9yJywgJ2dvb2cucmVzdWx0LlNpbXBsZVJlc3VsdCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9kZXBlbmRlbnRyZXN1bHQuanMnLCBbJ2dvb2cucmVzdWx0LkRlcGVuZGVudFJlc3VsdCddLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3Jlc3VsdF9pbnRlcmZhY2UuanMnLCBbJ2dvb2cucmVzdWx0LlJlc3VsdCddLCBbJ2dvb2cuVGhlbmFibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsLmpzJywgWydnb29nLnJlc3VsdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5yZXN1bHQuRGVwZW5kZW50UmVzdWx0JywgJ2dvb2cucmVzdWx0LlJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC9yZXN1bHR1dGlsX3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0VGVzdCddLCBbJ2dvb2cucmVzdWx0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdyZXN1bHQvc2ltcGxlcmVzdWx0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy5yZXN1bHQuU2ltcGxlUmVzdWx0LlN0YXRlRXJyb3InXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaGVuYWJsZScsICdnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cucmVzdWx0LlJlc3VsdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3NpbXBsZXJlc3VsdF90ZXN0LmpzJywgWydnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHRUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGhlbmFibGUnLCAnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgncmVzdWx0L3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnJlc3VsdC50cmFuc2Zvcm1UZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Jlc3VsdC93YWl0X3Rlc3QuanMnLCBbJ2dvb2cucmVzdWx0LndhaXRUZXN0J10sIFsnZ29vZy5UaW1lcicsICdnb29nLnJlc3VsdCcsICdnb29nLnJlc3VsdC5TaW1wbGVSZXN1bHQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9kYXRhLmpzJywgWydnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENzcycsICdnb29nLnNveS5kYXRhLlNhbml0aXplZEh0bWwnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRIdG1sQXR0cmlidXRlJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkSnMnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRUcnVzdGVkUmVzb3VyY2VVcmknLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRVcmknXSwgWydnb29nLlVyaScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaHRtbC5TYWZlU2NyaXB0JywgJ2dvb2cuaHRtbC5TYWZlU3R5bGUnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLnVuY2hlY2tlZGNvbnZlcnNpb25zJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnN0cmluZy5Db25zdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L2RhdGFfdGVzdC5qcycsIFsnZ29vZy5zb3kuZGF0YVRlc3QnXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zb3kudGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyLmpzJywgWydnb29nLnNveS5JbmplY3RlZERhdGFTdXBwbGllcicsICdnb29nLnNveS5SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLnNveScsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnQnLCAnZ29vZy5zb3kuZGF0YS5TYW5pdGl6ZWRDb250ZW50S2luZCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cuc295LlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuaTE4bi5iaWRpLkRpcicsICdnb29nLnNveS5SZW5kZXJlcicsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzb3kvc295LmpzJywgWydnb29nLnNveSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc295L3NveV90ZXN0LmpzJywgWydnb29nLnNveVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc295JywgJ2dvb2cuc295LnRlc3RIZWxwZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3NveS9zb3lfdGVzdGhlbHBlci5qcycsIFsnZ29vZy5zb3kudGVzdEhlbHBlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLmJpZGkuRGlyJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ29udGVudCcsICdnb29nLnNveS5kYXRhLlNhbml0aXplZENvbnRlbnRLaW5kJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkQ3NzJywgJ2dvb2cuc295LmRhdGEuU2FuaXRpemVkVHJ1c3RlZFJlc291cmNlVXJpJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3BlbGwvc3BlbGxjaGVjay5qcycsIFsnZ29vZy5zcGVsbC5TcGVsbENoZWNrJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjay5Xb3JkQ2hhbmdlZEV2ZW50J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzcGVsbC9zcGVsbGNoZWNrX3Rlc3QuanMnLCBbJ2dvb2cuc3BlbGwuU3BlbGxDaGVja1Rlc3QnXSwgWydnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0YXRzL2Jhc2ljc3RhdC5qcycsIFsnZ29vZy5zdGF0cy5CYXNpY1N0YXQnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RhdHMvYmFzaWNzdGF0X3Rlc3QuanMnLCBbJ2dvb2cuc3RhdHMuQmFzaWNTdGF0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5zdGF0cy5CYXNpY1N0YXQnLCAnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy5Qc2V1ZG9SYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvY29sbGVjdGFibGVzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLml0ZXInLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuRXhwaXJpbmdTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9jb2xsZWN0YWJsZXN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkNvbGxlY3RhYmxlU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2NvbGxlY3RhYmxlc3RvcmFnZXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLmNvbGxlY3RhYmxlU3RvcmFnZVRlc3RlciddLCBbJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LkFyYzQnLCAnZ29vZy5jcnlwdC5TaGExJywgJ2dvb2cuY3J5cHQuYmFzZTY0JywgJ2dvb2cuanNvbicsICdnb29nLmpzb24uU2VyaWFsaXplcicsICdnb29nLnN0b3JhZ2UuQ29sbGVjdGFibGVTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL2VuY3J5cHRlZHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLkVuY3J5cHRlZFN0b3JhZ2VUZXN0J10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FbmNyeXB0ZWRTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5jb2xsZWN0YWJsZVN0b3JhZ2VUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLnN0b3JhZ2VUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXJyb3Jjb2RlLmpzJywgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9leHBpcmluZ3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvZXhwaXJpbmdzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5FeHBpcmluZ1N0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLkV4cGlyaW5nU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2Vycm9yY29kZS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9lcnJvcmhhbmRsaW5nbWVjaGFuaXNtLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vZXJyb3JoYW5kbGluZ21lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9ySGFuZGxpbmdNZWNoYW5pc21UZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckhhbmRsaW5nTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVsb2NhbHN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNUxvY2FsU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXNlc3Npb25zdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2UnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1V2ViU3RvcmFnZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaHRtbDVzZXNzaW9uc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1U2Vzc2lvblN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVNlc3Npb25TdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2VwYXJhdGlvblRlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVXZWJTdG9yYWdlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9odG1sNXdlYnN0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2VUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5IVE1MNVdlYlN0b3JhZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL2lldXNlcmRhdGEuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5FcnJvckNvZGUnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbScsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pZXVzZXJkYXRhX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSUVVc2VyRGF0YVRlc3QnXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TZXBhcmF0aW9uVGVzdGVyJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20ubWVjaGFuaXNtU2hhcmluZ1Rlc3RlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9pdGVyYWJsZW1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5JdGVyYWJsZU1lY2hhbmlzbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLk1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vaXRlcmFibGVtZWNoYW5pc210ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uaXRlcmFibGVNZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLml0ZXInLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5NZWNoYW5pc20nXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21mYWN0b3J5LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnknXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkhUTUw1TG9jYWxTdG9yYWdlJywgJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVTZXNzaW9uU3RvcmFnZScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLklFVXNlckRhdGEnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RvcmFnZS9tZWNoYW5pc20vbWVjaGFuaXNtZmFjdG9yeV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbWZhY3RvcnlUZXN0J10sIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21mYWN0b3J5JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zZXBhcmF0aW9udGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc21zaGFyaW5ndGVzdGVyLmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNoYXJpbmdUZXN0ZXInXSwgWydnb29nLml0ZXIuU3RvcEl0ZXJhdGlvbicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVRlc3REZWZpbml0aW9uJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9tZWNoYW5pc210ZXN0ZGVmaW5pdGlvbi5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0RGVmaW5pdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2UvbWVjaGFuaXNtL21lY2hhbmlzbXRlc3Rlci5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21UZXN0ZXInXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkVycm9yQ29kZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbS5qcycsIFsnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbSddLCBbJ2dvb2cuaXRlci5JdGVyYXRvcicsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL21lY2hhbmlzbS9wcmVmaXhlZG1lY2hhbmlzbV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLlByZWZpeGVkTWVjaGFuaXNtVGVzdCddLCBbJ2dvb2cuc3RvcmFnZS5tZWNoYW5pc20uSFRNTDVMb2NhbFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5QcmVmaXhlZE1lY2hhbmlzbScsICdnb29nLnN0b3JhZ2UubWVjaGFuaXNtLm1lY2hhbmlzbVNlcGFyYXRpb25UZXN0ZXInLCAnZ29vZy5zdG9yYWdlLm1lY2hhbmlzbS5tZWNoYW5pc21TaGFyaW5nVGVzdGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlLmpzJywgWydnb29nLnN0b3JhZ2UuUmljaFN0b3JhZ2UnLCAnZ29vZy5zdG9yYWdlLlJpY2hTdG9yYWdlLldyYXBwZXInXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3JpY2hzdG9yYWdlX3Rlc3QuanMnLCBbJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZVRlc3QnXSwgWydnb29nLnN0b3JhZ2UuRXJyb3JDb2RlJywgJ2dvb2cuc3RvcmFnZS5SaWNoU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2UuanMnLCBbJ2dvb2cuc3RvcmFnZS5TdG9yYWdlJ10sIFsnZ29vZy5qc29uJywgJ2dvb2cuc3RvcmFnZS5FcnJvckNvZGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0b3JhZ2Uvc3RvcmFnZV90ZXN0LmpzJywgWydnb29nLnN0b3JhZ2Uuc3RvcmFnZV90ZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdG9yYWdlLkVycm9yQ29kZScsICdnb29nLnN0b3JhZ2UuU3RvcmFnZScsICdnb29nLnN0b3JhZ2Uuc3RvcmFnZVRlc3RlcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RvcmFnZS5GYWtlTWVjaGFuaXNtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdG9yYWdlL3N0b3JhZ2V0ZXN0ZXIuanMnLCBbJ2dvb2cuc3RvcmFnZS5zdG9yYWdlVGVzdGVyJ10sIFsnZ29vZy5zdG9yYWdlLlN0b3JhZ2UnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9kZWZpbmVzLmpzJywgWydnb29nLnN0cmVhbXMuZGVmaW5lcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsJ10sIFsnZ29vZy5zdHJlYW1zLmRlZmluZXMnLCAnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCcsICdnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsSW1wbCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnByb21pc2UuTmF0aXZlUmVzb2x2ZXInLCAnZ29vZy5zdHJlYW1zLmZ1bGxUeXBlcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfaW1wbF90ZXN0LmpzJywgWydnb29nLnN0cmVhbXMuZnVsbEltcGxUZXN0J10sIFsnZ29vZy5zdHJlYW1zLmZ1bGxJbXBsJywgJ2dvb2cuc3RyZWFtcy5mdWxsVGVzdENhc2VzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2Z1bGxfbmF0aXZlX2ltcGwuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbCddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5mdWxsTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMuZnVsbE5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmZ1bGxUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvZnVsbF90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5mdWxsVHlwZXMnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJ10sIHsnbGFuZyc6ICdlczknLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9mdWxsX3R5cGVzLmpzJywgWydnb29nLnN0cmVhbXMuZnVsbFR5cGVzJ10sIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZS5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGUnXSwgWydnb29nLnN0cmVhbXMuZGVmaW5lcycsICdnb29nLnN0cmVhbXMubGl0ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVOYXRpdmVJbXBsJywgJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJlYW1zL2xpdGVfaW1wbC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cucHJvbWlzZS5OYXRpdmVSZXNvbHZlcicsICdnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX2ltcGxfdGVzdC5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVJbXBsVGVzdCddLCBbJ2dvb2cuc3RyZWFtcy5saXRlSW1wbCcsICdnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnXSwgWydnb29nLnN0cmVhbXMubGl0ZVR5cGVzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyZWFtcy9saXRlX25hdGl2ZV9pbXBsX3Rlc3QuanMnLCBbJ2dvb2cuc3RyZWFtcy5saXRlTmF0aXZlSW1wbFRlc3QnXSwgWydnb29nLnN0cmVhbXMubGl0ZU5hdGl2ZUltcGwnLCAnZ29vZy5zdHJlYW1zLmxpdGVUZXN0Q2FzZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90ZXN0X2Nhc2VzLmpzJywgWydnb29nLnN0cmVhbXMubGl0ZVRlc3RDYXNlcyddLCBbJ2dvb2cuc3RyZWFtcy5saXRlVHlwZXMnLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmVhbXMvbGl0ZV90eXBlcy5qcycsIFsnZ29vZy5zdHJlYW1zLmxpdGVUeXBlcyddLCBbXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3QuanMnLCBbJ2dvb2cuc3RyaW5nLkNvbnN0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nLlR5cGVkU3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvY29uc3RfdGVzdC5qcycsIFsnZ29vZy5zdHJpbmcuY29uc3RUZXN0J10sIFsnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9pbnRlcm5hbC5qcycsIFsnZ29vZy5zdHJpbmcuaW50ZXJuYWwnXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL2xpbmtpZnkuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnknXSwgWydnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9saW5raWZ5X3Rlc3QuanMnLCBbJ2dvb2cuc3RyaW5nLmxpbmtpZnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5saW5raWZ5JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lcy5qcycsIFsnZ29vZy5zdHJpbmcubmV3bGluZXMnLCAnZ29vZy5zdHJpbmcubmV3bGluZXMuTGluZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9uZXdsaW5lc190ZXN0LmpzJywgWydnb29nLnN0cmluZy5uZXdsaW5lc1Rlc3QnXSwgWydnb29nLnN0cmluZy5uZXdsaW5lcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhcnNlci5qcycsIFsnZ29vZy5zdHJpbmcuUGFyc2VyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3BhdGguanMnLCBbJ2dvb2cuc3RyaW5nLnBhdGgnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvcGF0aF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5wYXRoVGVzdCddLCBbJ2dvb2cuc3RyaW5nLnBhdGgnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cmluZy9zdHJpbmcuanMnLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnXSwgWydnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnN0cmluZy5pbnRlcm5hbCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ190ZXN0LmpzJywgWydnb29nLnN0cmluZ1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLlVuaWNvZGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nYnVmZmVyLmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2J1ZmZlcl90ZXN0LmpzJywgWydnb29nLnN0cmluZy5TdHJpbmdCdWZmZXJUZXN0J10sIFsnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5nZm9ybWF0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXQnXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3N0cmluZ2Zvcm1hdF90ZXN0LmpzJywgWydnb29nLnN0cmluZy5mb3JtYXRUZXN0J10sIFsnZ29vZy5zdHJpbmcuZm9ybWF0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJpbmcvc3RyaW5naWZpZXIuanMnLCBbJ2dvb2cuc3RyaW5nLlN0cmluZ2lmaWVyJ10sIFtdLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RyaW5nL3R5cGVkc3RyaW5nLmpzJywgWydnb29nLnN0cmluZy5UeXBlZFN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvYXZsdHJlZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2F2bHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkF2bFRyZWVUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jaXJjdWxhcmJ1ZmZlci5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY2lyY3VsYXJidWZmZXJfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkNpcmN1bGFyQnVmZmVyVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5DaXJjdWxhckJ1ZmZlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9jb2xsZWN0aW9uLmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvbiddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvY29sbGVjdGlvbl90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuQ29sbGVjdGlvblRlc3QnXSwgWydnb29nLnN0cnVjdHMuQXZsVHJlZScsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2hlYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIFsnZ29vZy5hcnJheScsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMuTm9kZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9oZWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5IZWFwVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuSGVhcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXAuanMnLCBbJ2dvb2cuc3RydWN0cy5JbnZlcnNpb25NYXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9pbnZlcnNpb25tYXBfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkludmVyc2lvbk1hcFRlc3QnXSwgWydnb29nLnN0cnVjdHMuSW52ZXJzaW9uTWFwJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL2xpbmtlZG1hcC5qcycsIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbGlua2VkbWFwX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5MaW5rZWRNYXBUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzLkxpbmtlZE1hcCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvbWFwLmpzJywgWydnb29nLnN0cnVjdHMuTWFwJ10sIFsnZ29vZy5pdGVyLkl0ZXJhdG9yJywgJ2dvb2cuaXRlci5TdG9wSXRlcmF0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL21hcF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuTWFwVGVzdCddLCBbJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9ub2RlLmpzJywgWydnb29nLnN0cnVjdHMuTm9kZSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5zdHJ1Y3RzLlF1ZXVlJywgJ2dvb2cuc3RydWN0cy5TZXQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUG9vbFRlc3QnXSwgWydnb29nLnN0cnVjdHMuUG9vbCcsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UG9vbCddLCBbJ2dvb2cuc3RydWN0cy5Qb29sJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cG9vbF90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlQb29sVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVBvb2wnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9wcmlvcml0eXF1ZXVlLmpzJywgWydnb29nLnN0cnVjdHMuUHJpb3JpdHlRdWV1ZSddLCBbJ2dvb2cuc3RydWN0cy5IZWFwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3ByaW9yaXR5cXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlByaW9yaXR5UXVldWVUZXN0J10sIFsnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5Qcmlvcml0eVF1ZXVlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3F1YWR0cmVlLmpzJywgWydnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLk5vZGUnLCAnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlLlBvaW50J10sIFsnZ29vZy5tYXRoLkNvb3JkaW5hdGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVhZHRyZWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1YWRUcmVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuUXVhZFRyZWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWUuanMnLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZSddLCBbJ2dvb2cuYXJyYXknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvcXVldWVfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlF1ZXVlVGVzdCddLCBbJ2dvb2cuc3RydWN0cy5RdWV1ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXQuanMnLCBbJ2dvb2cuc3RydWN0cy5TZXQnXSwgWydnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLkNvbGxlY3Rpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNldFRlc3QnXSwgWydnb29nLml0ZXInLCAnZ29vZy5zdHJ1Y3RzJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc2ltcGxlcG9vbC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlNpbXBsZVBvb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RyaW5nc2V0LmpzJywgWydnb29nLnN0cnVjdHMuU3RyaW5nU2V0J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuaXRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3RydWN0cy9zdHJpbmdzZXRfdGVzdC5qcycsIFsnZ29vZy5zdHJ1Y3RzLlN0cmluZ1NldFRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaXRlcicsICdnb29nLnN0cnVjdHMuU3RyaW5nU2V0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3N0cnVjdHMuanMnLCBbJ2dvb2cuc3RydWN0cyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvc3RydWN0c190ZXN0LmpzJywgWydnb29nLnN0cnVjdHNUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3RydWN0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJlZW5vZGUuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RydWN0cy5Ob2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHJ1Y3RzL3RyZWVub2RlX3Rlc3QuanMnLCBbJ2dvb2cuc3RydWN0cy5UcmVlTm9kZVRlc3QnXSwgWydnb29nLnN0cnVjdHMuVHJlZU5vZGUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZS5qcycsIFsnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0cnVjdHMvdHJpZV90ZXN0LmpzJywgWydnb29nLnN0cnVjdHMuVHJpZVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2JpZGkuanMnLCBbJ2dvb2cuc3R5bGUuYmlkaSddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvYmlkaV90ZXN0LmpzJywgWydnb29nLnN0eWxlLmJpZGlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL2N1cnNvci5qcycsIFsnZ29vZy5zdHlsZS5jdXJzb3InXSwgWydnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvY3Vyc29yX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuY3Vyc29yVGVzdCddLCBbJ2dvb2cuc3R5bGUuY3Vyc29yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZS5qcycsIFsnZ29vZy5zdHlsZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20udmVuZG9yJywgJ2dvb2cuaHRtbC5TYWZlU3R5bGVTaGVldCcsICdnb29nLm1hdGguQm94JywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QuanMnLCBbJ2dvb2cuc3R5bGUuc3R5bGVfZG9jdW1lbnRfc2Nyb2xsX3Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnN0eWxlX3Rlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbC5Vc2VyQWdlbnRzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvc3R5bGVfd2Via2l0X3Njcm9sbGJhcnNfdGVzdC5qcycsIFsnZ29vZy5zdHlsZS53ZWJraXRTY3JvbGxiYXJzVGVzdCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGVTY3JvbGxiYXJUZXN0ZXInLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3N0eWxlc2Nyb2xsYmFydGVzdGVyLmpzJywgWydnb29nLnN0eWxlU2Nyb2xsYmFyVGVzdGVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCdzdHlsZS90cmFuc2Zvcm0uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNmb3JtJ10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zZm9ybV90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zZm9ybVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy5zdHlsZS50cmFuc2Zvcm0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3N0eWxlL3RyYW5zaXRpb24uanMnLCBbJ2dvb2cuc3R5bGUudHJhbnNpdGlvbicsICdnb29nLnN0eWxlLnRyYW5zaXRpb24uQ3NzM1Byb3BlcnR5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZG9tLnZlbmRvcicsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgnc3R5bGUvdHJhbnNpdGlvbl90ZXN0LmpzJywgWydnb29nLnN0eWxlLnRyYW5zaXRpb25UZXN0J10sIFsnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLnRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RfbW9kdWxlLmpzJywgWydnb29nLnRlc3RfbW9kdWxlJ10sIFsnZ29vZy50ZXN0X21vZHVsZV9kZXAnXSwgeydtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0X21vZHVsZV9kZXAuanMnLCBbJ2dvb2cudGVzdF9tb2R1bGVfZGVwJ10sIFtdLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0aW9uZmFpbHVyZS5qcycsIFsnZ29vZy50ZXN0aW5nLnNhZmUuYXNzZXJ0aW9uRmFpbHVyZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Fzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmFzc2VydHNUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRvbScsICdnb29nLml0ZXIuSXRlcmF0b3InLCAnZ29vZy5pdGVyLlN0b3BJdGVyYXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sLmpzJywgWydnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLmRlYnVnJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLklnbm9yZUFyZ3VtZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jL21vY2tjb250cm9sX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5hc3luYy5Nb2NrQ29udHJvbFRlc3QnXSwgWydnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuYXN5bmMuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UuQ29udHJvbEJyZWFraW5nRXhjZXB0aW9uJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9hc3luY3Rlc3RjYXNlX2FzeW5jX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlQXN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5qc3VuaXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2FzeW5jdGVzdGNhc2Vfbm9hc3luY190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVN5bmNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvYXN5bmN0ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuQXN5bmNUZXN0Q2FzZVRlc3QnXSwgWydnb29nLmRlYnVnLkVycm9yJywgJ2dvb2cudGVzdGluZy5Bc3luY1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2JlbmNobWFyay5qcycsIFsnZ29vZy50ZXN0aW5nLmJlbmNobWFyayddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGFibGUnLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2NvbnRpbnVhdGlvbnRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuQ29udGludWF0aW9uVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLkNvbnRpbnVhdGlvblRlc3QnLCAnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlLlN0ZXAnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvY29udGludWF0aW9udGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkNvbnRpbnVhdGlvblRlc3RDYXNlVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Db250aW51YXRpb25UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kZWZlcnJlZHRlc3RjYXNlLmpzJywgWydnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZSddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy50ZXN0aW5nLkFzeW5jVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RlZmVycmVkdGVzdGNhc2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLkRlZmVycmVkVGVzdENhc2VUZXN0J10sIFsnZ29vZy5hc3luYy5EZWZlcnJlZCcsICdnb29nLnRlc3RpbmcuRGVmZXJyZWRUZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkFic3RyYWN0UmFuZ2UnLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLk5vZGVJdGVyYXRvcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdJdGVyYXRvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLml0ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmRvbVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2RvbS5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nXSwgWydnb29nLmRvbS5BYnN0cmFjdFJhbmdlJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ0l0ZXJhdG9yJywgJ2dvb2cuZG9tLlRhZ1dhbGtUeXBlJywgJ2dvb2cuaXRlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvZG9tX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuZG9tVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL2ZpZWxkbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLmVkaXRvci5GaWVsZE1vY2snXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZWRpdG9yL3Rlc3RoZWxwZXIuanMnLCBbJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbScsICdnb29nLmRvbS5SYW5nZScsICdnb29nLmVkaXRvci5Ccm93c2VyRmVhdHVyZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cuZWRpdG9yLnBsdWdpbnMuQWJzdHJhY3RCdWJibGVQbHVnaW4nLCAnZ29vZy50ZXN0aW5nLmRvbSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9lZGl0b3IvdGVzdGhlbHBlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZWRpdG9yLlRlc3RIZWxwZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmVkaXRvci5ub2RlJywgJ2dvb2cudGVzdGluZy5lZGl0b3IuVGVzdEhlbHBlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvZXZlbnRvYnNlcnZlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50cy5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL2V2ZW50c190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzVGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL21hdGNoZXJzLmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuQXJndW1lbnRNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2V2ZW50cy9tYXRjaGVyc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlclRlc3QnXSwgWydnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50TWF0Y2hlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9ldmVudHMvb25saW5laGFuZGxlci5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5uZXQuTmV0d29ya1N0YXR1c01vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXZlbnRzL29ubGluZWhhbmRsZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmV2ZW50cy5PbmxpbmVIYW5kbGVyVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0Lk5ldHdvcmtTdGF0dXNNb25pdG9yJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnRPYnNlcnZlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzLk9ubGluZUhhbmRsZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlcy5qcycsIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kZWJ1Zy5EaXZDb25zb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubG9nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZXhwZWN0ZWRmYWlsdXJlc190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlc1Rlc3QnXSwgWydnb29nLmRlYnVnLkxvZ2dlcicsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2Jsb2IuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iJ10sIFsnZ29vZy5jcnlwdCcsICdnb29nLmNyeXB0LmJhc2U2NCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9ibG9iX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5CbG9iVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2RpcmVjdG9yeWVudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeVRlc3QnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuZnMuRmlsZVN5c3RlbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9lbnRyeS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cudGVzdGluZy5mcy5FbnRyeScsICdnb29nLnRlc3RpbmcuZnMuRmlsZUVudHJ5J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMuRGlyZWN0b3J5RW50cnknLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeUltcGwnLCAnZ29vZy5mcy5FbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZUVudHJ5JywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2VudHJ5X3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5FbnRyeVRlc3QnXSwgWydnb29nLmZzLkRpcmVjdG9yeUVudHJ5JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGUnXSwgWydnb29nLnRlc3RpbmcuZnMuQmxvYiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxlZW50cnlfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVFbnRyeVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlRW50cnknLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZmlsZXJlYWRlci5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXInXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5CbG9iJywgJ2dvb2cudGVzdGluZy5mcy5Qcm9ncmVzc0V2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVyZWFkZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzLkZpbGVSZWFkZXJUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVSZWFkZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudE9ic2VydmVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlUmVhZGVyJywgJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2ZzL2ZpbGVzeXN0ZW0uanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlU3lzdGVtJ10sIFsnZ29vZy5mcy5GaWxlU3lzdGVtJywgJ2dvb2cudGVzdGluZy5mcy5EaXJlY3RvcnlFbnRyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyLmpzJywgWydnb29nLnRlc3RpbmcuZnMuRmlsZVdyaXRlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5mcy5FcnJvcicsICdnb29nLmZzLkZpbGVTYXZlcicsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcuZnMuRmlsZScsICdnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9maWxld3JpdGVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5mcy5GaWxlV3JpdGVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMuRXJyb3InLCAnZ29vZy5mcy5GaWxlU2F2ZXInLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnMuanMnLCBbJ2dvb2cudGVzdGluZy5mcyddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLkRlZmVycmVkJywgJ2dvb2cuZnMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmZzLkJsb2InLCAnZ29vZy50ZXN0aW5nLmZzLkZpbGVTeXN0ZW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnMvZnNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLmZzVGVzdCddLCBbJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcuZnMuQmxvYicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9pbnRlZ3JhdGlvbl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuZnMuaW50ZWdyYXRpb25UZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnMnLCAnZ29vZy5mcy5EaXJlY3RvcnlFbnRyeScsICdnb29nLmZzLkVycm9yJywgJ2dvb2cuZnMuRmlsZVNhdmVyJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5mcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9mcy9wcm9ncmVzc2V2ZW50LmpzJywgWydnb29nLnRlc3RpbmcuZnMuUHJvZ3Jlc3NFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2Z1bmN0aW9ubW9jay5qcycsIFsnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2snLCAnZ29vZy50ZXN0aW5nLkdsb2JhbEZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTWV0aG9kTW9jayddLCBbJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvZnVuY3Rpb25tb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5GdW5jdGlvbk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2dyYXBoaWNzLmpzJywgWydnb29nLnRlc3RpbmcuZ3JhcGhpY3MnXSwgWydnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzLmpzJywgWydnb29nLnRlc3RpbmcuaTE4bi5hc3NlcnRzJ10sIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvaTE4bi9hc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5pMThuLmFzc2VydHNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmkxOG4uYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkYXN5bmN3cmFwcGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZEFzeW5jV3JhcHBlciddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9qc3RkdGVzdGNhc2VhZGFwdGVyLmpzJywgWydnb29nLnRlc3RpbmcuSnNUZFRlc3RDYXNlQWRhcHRlciddLCBbJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5Kc1RkQXN5bmNXcmFwcGVyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdC5qcycsIFsnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2pzdW5pdGV4Y2VwdGlvbi5qcycsIFsnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbiddLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL2xvb3NlbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLkxvb3NlRXhwZWN0YXRpb25Db2xsZWN0aW9uJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3RydWN0cy5TZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbG9vc2Vtb2NrX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5Mb29zZU1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZWNoYW5uZWwuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VDaGFubmVsJ10sIFsnZ29vZy5tZXNzYWdpbmcuQWJzdHJhY3RDaGFubmVsJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tZXNzYWdpbmcvbW9ja21lc3NhZ2VldmVudC5qcycsIFsnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUV2ZW50J10sIFsnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrbWVzc2FnZXBvcnQuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja01lc3NhZ2VQb3J0J10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21lc3NhZ2luZy9tb2NrcG9ydG5ldHdvcmsuanMnLCBbJ2dvb2cudGVzdGluZy5tZXNzYWdpbmcuTW9ja1BvcnROZXR3b3JrJ10sIFsnZ29vZy5tZXNzYWdpbmcuUG9ydE5ldHdvcmsnLCAnZ29vZy50ZXN0aW5nLm1lc3NhZ2luZy5Nb2NrTWVzc2FnZUNoYW5uZWwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tFeHBlY3RhdGlvbiddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLm9iamVjdCcsICdnb29nLnByb21pc2UuUmVzb2x2ZXInLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZScsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Nb2NrRXhwZWN0YXRpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NsYXNzZmFjdG9yeS5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc1JlY29yZCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkxvb3NlTW9jaycsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xhc3NmYWN0b3J5X3Rlc3QuanMnLCBbJ2Zha2UuQmFzZUNsYXNzJywgJ2Zha2UuQ2hpbGRDbGFzcycsICdnb29nLnRlc3RpbmcuTW9ja0NsYXNzRmFjdG9yeVRlc3QnXSwgWydnb29nLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbGFzc0ZhY3RvcnknLCAnZ29vZy50ZXN0aW5nLmpzdW5pdCddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2Nsb2NrLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXN5bmMucnVuJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY2xvY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDbG9ja1Rlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrY29udHJvbC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy5Mb29zZU1vY2snLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NraW50ZXJmYWNlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja0ludGVyZmFjZSddLCBbJ2dvb2cuUHJvbWlzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrbWF0Y2hlcnMuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5JZ25vcmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLkluc3RhbmNlT2YnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5PYmplY3RFcXVhbHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5SZWdleHBNYXRjaCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlNhdmVBcmd1bWVudCcsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzLlR5cGVPZiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja21hdGNoZXJzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnNUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcuanN1bml0JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb20uanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJ10sIFsnZ29vZy5EaXNwb3NhYmxlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb21UZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tSYW5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3JhbmdlLmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlJ10sIFsnZ29vZy5kb20uQWJzdHJhY3RSYW5nZScsICdnb29nLnRlc3RpbmcuTG9vc2VNb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL21vY2tyYW5nZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1JhbmdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrUmFuZ2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2UuanMnLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZSddLCBbJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3N0b3JhZ2VfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk1vY2tTdG9yYWdlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5Nb2NrU3RvcmFnZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tb2NrdXNlcmFnZW50LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbW9ja3VzZXJhZ2VudF90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudFRlc3QnXSwgWydnb29nLmRpc3Bvc2UnLCAnZ29vZy50ZXN0aW5nLk1vY2tVc2VyQWdlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvbXVsdGl0ZXN0cnVubmVyLmpzJywgWydnb29nLnRlc3RpbmcuTXVsdGlUZXN0UnVubmVyJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXIuVGVzdEZyYW1lJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9tdWx0aXRlc3RydW5uZXJfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQvbW9ja2lmcmFtZWlvLmpzJywgWydnb29nLnRlc3RpbmcubmV0Lk1vY2tJRnJhbWVJbyddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cubmV0LkVycm9yQ29kZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSWZyYW1lSW8nLCAnZ29vZy50ZXN0aW5nLlRlc3RRdWV1ZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9uZXQveGhyaW8uanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwgWydnb29nLlVyaScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0Lkh0dHBTdGF0dXMnLCAnZ29vZy5uZXQuWGhySW8nLCAnZ29vZy5uZXQuWG1sSHR0cCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnRlc3RpbmcuVGVzdFF1ZXVlJywgJ2dvb2cudXJpLnV0aWxzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb190ZXN0LmpzJywgWydnb29nLnRlc3RpbmcubmV0LlhocklvVGVzdCddLCBbJ2dvb2cuZG9tLnhtbCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm5ldC5FcnJvckNvZGUnLCAnZ29vZy5uZXQuRXZlbnRUeXBlJywgJ2dvb2cubmV0LlhtbEh0dHAnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMuSW5zdGFuY2VPZicsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL25ldC94aHJpb3Bvb2wuanMnLCBbJ2dvb2cudGVzdGluZy5uZXQuWGhySW9Qb29sJ10sIFsnZ29vZy5uZXQuWGhySW9Qb29sJywgJ2dvb2cudGVzdGluZy5uZXQuWGhySW8nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvb2JqZWN0cHJvcGVydHlzdHJpbmcuanMnLCBbJ2dvb2cudGVzdGluZy5PYmplY3RQcm9wZXJ0eVN0cmluZyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlLmpzJywgWydnb29nLnRlc3RpbmcucGFyYWxsZWxDbG9zdXJlVGVzdFN1aXRlJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cycsICdnb29nLmpzb24nLCAnZ29vZy50ZXN0aW5nLk11bHRpVGVzdFJ1bm5lcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcGFyYWxsZWxfY2xvc3VyZV90ZXN0X3N1aXRlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wYXJhbGxlbENsb3N1cmVUZXN0U3VpdGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5NdWx0aVRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnBhcmFsbGVsQ2xvc3VyZVRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRhYmxlLmpzJywgWydnb29nLnRlc3RpbmcuUGVyZm9ybWFuY2VUYWJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BlcmZvcm1hbmNldGltZXIuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyJywgJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyLlRhc2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5tYXRoJ10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wZXJmb3JtYW5jZXRpbWVyX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5QZXJmb3JtYW5jZVRpbWVyVGVzdCddLCBbJ2dvb2cuYXN5bmMuRGVmZXJyZWQnLCAnZ29vZy5kb20nLCAnZ29vZy5tYXRoJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlBlcmZvcm1hbmNlVGltZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlci5qcycsIFsnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvcGVydHlyZXBsYWNlcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvcHJvdG8yL3Byb3RvMi5qcycsIFsnZ29vZy50ZXN0aW5nLnByb3RvMiddLCBbJ2dvb2cucHJvdG8yLk1lc3NhZ2UnLCAnZ29vZy5wcm90bzIuT2JqZWN0U2VyaWFsaXplcicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wcm90bzIvcHJvdG8yX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5wcm90bzJUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnByb3RvMicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ3Byb3RvMi5UZXN0QWxsVHlwZXMnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3BzZXVkb3JhbmRvbS5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbSddLCBbJ2dvb2cuRGlzcG9zYWJsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9wc2V1ZG9yYW5kb21fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlBzZXVkb1JhbmRvbVRlc3QnXSwgWydnb29nLnRlc3RpbmcuUHNldWRvUmFuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uLmpzJywgWydnb29nLnRlc3RpbmcuRnVuY3Rpb25DYWxsJywgJ2dvb2cudGVzdGluZy5yZWNvcmRDb25zdHJ1Y3RvcicsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5wcm9taXNlLlJlc29sdmVyJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3JlY29yZGZ1bmN0aW9uX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvblRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcucmVjb3JkQ29uc3RydWN0b3InLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzOCcsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3NoYXJkaW5ndGVzdGNhc2UuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaGFyZGluZ3Rlc3RjYXNlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5TaGFyZGluZ1Rlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuanN1bml0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b24uanMnLCBbJ2dvb2cudGVzdGluZy5zaW5nbGV0b24nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zaW5nbGV0b25fdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnNpbmdsZXRvblRlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc2luZ2xldG9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0YWNrdHJhY2UuanMnLCBbJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlJywgJ2dvb2cudGVzdGluZy5zdGFja3RyYWNlLkZyYW1lJ10sIFtdLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RhY2t0cmFjZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZVRlc3QnXSwgWydnb29nLmZ1bmN0aW9ucycsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuU3RyaWN0TW9jaycsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZScsICdnb29nLnRlc3Rpbmcuc3RhY2t0cmFjZS5GcmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdG9yYWdlL2Zha2VtZWNoYW5pc20uanMnLCBbJ2dvb2cudGVzdGluZy5zdG9yYWdlLkZha2VNZWNoYW5pc20nXSwgWydnb29nLnN0b3JhZ2UubWVjaGFuaXNtLkl0ZXJhYmxlTWVjaGFuaXNtJywgJ2dvb2cuc3RydWN0cy5NYXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3RyaWN0bW9jay5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudGVzdGluZy5Nb2NrJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3N0cmljdG1vY2tfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2tUZXN0J10sIFsnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM4JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3Rpbmcvc3R5bGUvbGF5b3V0YXNzZXJ0cy5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlLmxheW91dGFzc2VydHMnXSwgWydnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJywgJ2dvb2cudGVzdGluZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9sYXlvdXRhc3NlcnRzX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy5zdHlsZS5sYXlvdXRhc3NlcnRzVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3Rpbmcuc3R5bGUubGF5b3V0YXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnN0eWxlJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy9zdHlsZS9zdHlsZV90ZXN0LmpzJywgWydnb29nLnRlc3Rpbmcuc3R5bGVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZS5qcycsIFsnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZS5FcnJvcicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuT3JkZXInLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlLlJlc3VsdCcsICdnb29nLnRlc3RpbmcuVGVzdENhc2UuVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRoZW5hYmxlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLkpzVW5pdEV4Y2VwdGlvbicsICdnb29nLnRlc3RpbmcuYXNzZXJ0cyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0Y2FzZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdENhc2VUZXN0J10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLkZ1bmN0aW9uTW9jaycsICdnb29nLnRlc3RpbmcuSnNVbml0RXhjZXB0aW9uJywgJ2dvb2cudGVzdGluZy5NZXRob2RNb2NrJywgJ2dvb2cudGVzdGluZy5Nb2NrUmFuZG9tJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczgnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy90ZXN0cXVldWUuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RydW5uZXIuanMnLCBbJ2dvb2cudGVzdGluZy5UZXN0UnVubmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuanNvbicsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHJ1bm5lcl90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcuVGVzdFJ1bm5lclRlc3QnXSwgWydnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLlRlc3RSdW5uZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3Rlc3RpbmcvdGVzdHN1aXRlLmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIFsnZ29vZy5sYWJzLnRlc3RpbmcuRW52aXJvbm1lbnQnLCAnZ29vZy50ZXN0aW5nLlRlc3RDYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3Rlc3RzdWl0ZV90ZXN0LmpzJywgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlVGVzdCddLCBbJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHMuanMnLCBbJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9yZW5kZXJlcmFzc2VydHNfdGVzdC5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnJlbmRlcmVyYXNzZXJ0c1Rlc3QnXSwgWydnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3JlbmRlcmVyaGFybmVzcy5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcyddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLnRlc3RpbmcuYXNzZXJ0cycsICdnb29nLnRlc3RpbmcuZG9tJywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndGVzdGluZy91aS9zdHlsZS5qcycsIFsnZ29vZy50ZXN0aW5nLnVpLnN0eWxlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5hc3NlcnRzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0ZXN0aW5nL3VpL3N0eWxlX3Rlc3QuanMnLCBbJ2dvb2cudGVzdGluZy51aS5zdHlsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3RpbWVyL3RpbWVyLmpzJywgWydnb29nLlRpbWVyJ10sIFsnZ29vZy5Qcm9taXNlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd0aW1lci90aW1lcl90ZXN0LmpzJywgWydnb29nLlRpbWVyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXMuanMnLCBbJ2dvb2cudHdlYWsuQmFzZUVudHJ5JywgJ2dvb2cudHdlYWsuQmFzZVByaW1pdGl2ZVNldHRpbmcnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5vYmplY3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL2VudHJpZXNfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5CYXNlRW50cnlUZXN0J10sIFsnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2Vhay50ZXN0aGVscGVycyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5LmpzJywgWydnb29nLnR3ZWFrLlJlZ2lzdHJ5J10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5sb2cnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50d2Vhay5CYXNlUHJpbWl0aXZlU2V0dGluZycsICdnb29nLnR3ZWFrLkJhc2VTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnLCAnZ29vZy51cmkudXRpbHMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3JlZ2lzdHJ5X3Rlc3QuanMnLCBbJ2dvb2cudHdlYWsuUmVnaXN0cnlUZXN0J10sIFsnZ29vZy5hc3NlcnRzLkFzc2VydGlvbkVycm9yJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdGVzdGhlbHBlcnMuanMnLCBbJ2dvb2cudHdlYWsudGVzdGhlbHBlcnMnXSwgWydnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuQm9vbGVhbkdyb3VwJywgJ2dvb2cudHdlYWsuQm9vbGVhbkluR3JvdXBTZXR0aW5nJywgJ2dvb2cudHdlYWsuQm9vbGVhblNldHRpbmcnLCAnZ29vZy50d2Vhay5CdXR0b25BY3Rpb24nLCAnZ29vZy50d2Vhay5OdW1lcmljU2V0dGluZycsICdnb29nLnR3ZWFrLlJlZ2lzdHJ5JywgJ2dvb2cudHdlYWsuU3RyaW5nU2V0dGluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndHdlYWsvdHdlYWsuanMnLCBbJ2dvb2cudHdlYWsnLCAnZ29vZy50d2Vhay5Db25maWdQYXJhbXMnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy50d2Vhay5CYXNlU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5SZWdpc3RyeScsICdnb29nLnR3ZWFrLlN0cmluZ1NldHRpbmcnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWkuanMnLCBbJ2dvb2cudHdlYWsuRW50cmllc1BhbmVsJywgJ2dvb2cudHdlYWsuVHdlYWtVaSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50d2VhaycsICdnb29nLnR3ZWFrLkJhc2VFbnRyeScsICdnb29nLnR3ZWFrLkJvb2xlYW5Hcm91cCcsICdnb29nLnR3ZWFrLkJvb2xlYW5Jbkdyb3VwU2V0dGluZycsICdnb29nLnR3ZWFrLkJvb2xlYW5TZXR0aW5nJywgJ2dvb2cudHdlYWsuQnV0dG9uQWN0aW9uJywgJ2dvb2cudHdlYWsuTnVtZXJpY1NldHRpbmcnLCAnZ29vZy50d2Vhay5TdHJpbmdTZXR0aW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3R3ZWFrL3R3ZWFrdWlfdGVzdC5qcycsIFsnZ29vZy50d2Vhay5Ud2Vha1VpVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnR3ZWFrJywgJ2dvb2cudHdlYWsuVHdlYWtVaScsICdnb29nLnR3ZWFrLnRlc3RoZWxwZXJzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWJzdHJhY3RzcGVsbGNoZWNrZXIuanMnLCBbJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlci5Bc3luY1Jlc3VsdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FjLmpzJywgWydnb29nLnVpLmFjJ10sIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5JbnB1dEhhbmRsZXInLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYWNfdGVzdC5qcycsIFsnZ29vZy51aS5hY1Rlc3QnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNlbGVjdGlvbicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2FycmF5bWF0Y2hlci5qcycsIFsnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgWydnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9hdXRvY29tcGxldGUuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlJywgJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvYXV0b2NvbXBsZXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuQXV0b0NvbXBsZXRlVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbmRlck9wdGlvbnMnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2NhY2hpbmdtYXRjaGVyLmpzJywgWydnb29nLnVpLmFjLkNhY2hpbmdNYXRjaGVyJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmFzeW5jLlRocm90dGxlJywgJ2dvb2cudWkuYWMuQXJyYXlNYXRjaGVyJywgJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvY2FjaGluZ21hdGNoZXJfdGVzdC5qcycsIFsnZ29vZy51aS5hYy5DYWNoaW5nTWF0Y2hlclRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuQ2FjaGluZ01hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9pbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL2lucHV0aGFuZGxlcl90ZXN0LmpzJywgWydnb29nLnVpLmFjLklucHV0SGFuZGxlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2VsZWN0aW9uJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbW90ZS5qcycsIFsnZ29vZy51aS5hYy5SZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLklucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJlbW90ZUFycmF5TWF0Y2hlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIFsnZ29vZy5EaXNwb3NhYmxlJywgJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLm5ldC5YaHJJbyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWMvcmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyVGVzdCddLCBbJ2dvb2cubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy5Nb2NrQ29udHJvbCcsICdnb29nLnRlc3RpbmcubmV0LlhocklvJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5SZW1vdGVBcnJheU1hdGNoZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yZW5kZXJlci5qcycsIFsnZ29vZy51aS5hYy5SZW5kZXJlcicsICdnb29nLnVpLmFjLlJlbmRlcmVyLkN1c3RvbVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRpc3Bvc2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguZG9tLkZhZGVJbkFuZFNob3cnLCAnZ29vZy5meC5kb20uRmFkZU91dEFuZEhpZGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLmFjLkF1dG9Db21wbGV0ZSddLCB7J2xhbmcnOiAnZXM2J30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5kb20uRmFkZUluQW5kU2hvdycsICdnb29nLmZ4LmRvbS5GYWRlT3V0QW5kSGlkZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5hYy5BdXRvQ29tcGxldGUnLCAnZ29vZy51aS5hYy5SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JlbmRlcm9wdGlvbnMuanMnLCBbJ2dvb2cudWkuYWMuUmVuZGVyT3B0aW9ucyddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hpbnB1dGhhbmRsZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlciddLCBbJ2dvb2cudWkuYWMuSW5wdXRIYW5kbGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlLmpzJywgWydnb29nLnVpLmFjLlJpY2hSZW1vdGUnXSwgWydnb29nLnVpLmFjLkF1dG9Db21wbGV0ZScsICdnb29nLnVpLmFjLlJlbW90ZScsICdnb29nLnVpLmFjLlJlbmRlcmVyJywgJ2dvb2cudWkuYWMuUmljaElucHV0SGFuZGxlcicsICdnb29nLnVpLmFjLlJpY2hSZW1vdGVBcnJheU1hdGNoZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjL3JpY2hyZW1vdGVhcnJheW1hdGNoZXIuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudWkuYWMuUmVtb3RlQXJyYXlNYXRjaGVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hYy9yaWNocmVtb3RlYXJyYXltYXRjaGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlclRlc3QnXSwgWydnb29nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLm5ldC5YaHJJbycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuYWMuUmljaFJlbW90ZUFycmF5TWF0Y2hlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FjdGl2aXR5bW9uaXRvci5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5BY3Rpdml0eU1vbml0b3JUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2FkdmFuY2VkdG9vbHRpcC5qcycsIFsnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnXSwgWydnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYWR2YW5jZWR0b29sdGlwX3Rlc3QuanMnLCBbJ2dvb2cudWkuQWR2YW5jZWRUb29sdGlwVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFkdmFuY2VkVG9vbHRpcCcsICdnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5LmpzJywgWydnb29nLnVpLkFuaW1hdGVkWmlwcHknXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZWFzaW5nJywgJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9hbmltYXRlZHppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuQW5pbWF0ZWRaaXBweVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmZ4LkFuaW1hdGlvbicsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkFuaW1hdGVkWmlwcHknLCAnZ29vZy51aS5aaXBweSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2F0dGFjaGFibGVtZW51LmpzJywgWydnb29nLnVpLkF0dGFjaGFibGVNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JdGVtRXZlbnQnLCAnZ29vZy51aS5NZW51QmFzZScsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0LmpzJywgWydnb29nLnVpLkJpZGlJbnB1dCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYmlkaWlucHV0X3Rlc3QuanMnLCBbJ2dvb2cudWkuQmlkaUlucHV0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5CaWRpSW5wdXQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idWJibGUuanMnLCBbJ2dvb2cudWkuQnViYmxlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQWJzb2x1dGVQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXJCaXQnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b24uanMnLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uLlNpZGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25fdGVzdC5qcycsIFsnZ29vZy51aS5CdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuQnV0dG9uU2lkZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk5hdGl2ZUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvYnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2J1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkJ1dHRvblNpZGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9idXR0b25zaWRlLmpzJywgWydnb29nLnVpLkJ1dHRvblNpZGUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jaGFyY291bnRlci5qcycsIFsnZ29vZy51aS5DaGFyQ291bnRlcicsICdnb29nLnVpLkNoYXJDb3VudGVyLkRpc3BsYXknXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJjb3VudGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hhckNvdW50ZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLmFzc2VydHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNoYXJDb3VudGVyJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hhcnBpY2tlci5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uQ2hhckxpc3REZWNvbXByZXNzb3InLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhcicsICdnb29nLmkxOG4udUNoYXIuTmFtZUZldGNoZXInLCAnZ29vZy5zdHJ1Y3RzLlNldCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInLCAnZ29vZy51aS5GbGF0QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Ib3ZlckNhcmQnLCAnZ29vZy51aS5MYWJlbElucHV0JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRvb2x0aXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoYXJwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5DaGFyUGlja2VyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZGlzcG9zZScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5pMThuLkNoYXJQaWNrZXJEYXRhJywgJ2dvb2cuaTE4bi51Q2hhci5OYW1lRmV0Y2hlcicsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGFyUGlja2VyJywgJ2dvb2cudWkuRmxhdEJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3guanMnLCBbJ2dvb2cudWkuQ2hlY2tib3gnLCAnZ29vZy51aS5DaGVja2JveC5TdGF0ZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ2hlY2tib3hUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DaGVja2JveCcsICdnb29nLnVpLkNoZWNrYm94UmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51aS5kZWNvcmF0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NoZWNrYm94bWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuQ2hlY2tCb3hNZW51SXRlbSddLCBbJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY2hlY2tib3hyZW5kZXJlci5qcycsIFsnZ29vZy51aS5DaGVja2JveFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbiddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JNZW51QnV0dG9uVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuUmVuZGVyZXJIYXJuZXNzJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b24nLCAnZ29vZy51aS5Db2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbG9ycGFsZXR0ZS5qcycsIFsnZ29vZy51aS5Db2xvclBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuUGFsZXR0ZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29sb3JQYWxldHRlJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuQ29sb3JQaWNrZXInLCAnZ29vZy51aS5Db2xvclBpY2tlci5FdmVudFR5cGUnXSwgWydnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tYm9ib3guanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3gnLCAnZ29vZy51aS5Db21ib0JveEl0ZW0nXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubG9nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkl0ZW1FdmVudCcsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbWJvYm94X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tYm9Cb3hUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21ib0JveCcsICdnb29nLnVpLkNvbWJvQm94SXRlbScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLkxhYmVsSW5wdXQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnQuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50LkVycm9yJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5JZEdlbmVyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29tcG9uZW50X3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29tcG9uZW50VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb21wb25lbnR1dGlsLmpzJywgWydnb29nLnVpLkNvbXBvbmVudFV0aWwnXSwgWydnb29nLmV2ZW50cy5Nb3VzZUFzTW91c2VFdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuTW91c2VFdmVudHMnLCAnZ29vZy5ldmVudHMuUG9pbnRlckFzTW91c2VFdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbXBvbmVudHV0aWxfdGVzdC5qcycsIFsnZ29vZy51aS5Db21wb25lbnRVdGlsVGVzdCddLCBbJ2dvb2cuZXZlbnRzLk1vdXNlQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5Qb2ludGVyQXNNb3VzZUV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRhaW5lci5qcycsIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Db250YWluZXIuRXZlbnRUeXBlJywgJ2dvb2cudWkuQ29udGFpbmVyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db21wb25lbnRVdGlsJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51aS5Db250cm9sJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUV2ZW50JywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRyb2wnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udGFpbmVycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Db250YWluZXJSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlci5qcycsIFsnZ29vZy51aS5Db250YWluZXJTY3JvbGxlciddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250YWluZXJzY3JvbGxlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRhaW5lclNjcm9sbGVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyU2Nyb2xsZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9sLmpzJywgWydnb29nLnVpLkNvbnRyb2wnXSwgWydnb29nLkRpc3Bvc2FibGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2xDb250ZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS5Db250cm9sVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLlBvaW50ZXJGYWxsYmFja0V2ZW50VHlwZScsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5FeHBlY3RlZEZhaWx1cmVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29udHJvbGNvbnRlbnQuanMnLCBbJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb250cm9scmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm9iamVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbENvbnRlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NvbnRyb2xyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkNvbnRyb2xSZW5kZXJlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5Db250cm9sUmVuZGVyZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jb29raWVlZGl0b3IuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LmNvb2tpZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY29va2llZWRpdG9yX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ29va2llRWRpdG9yVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5jb29raWVzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvb2tpZUVkaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2NzczNidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3NzM21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Dc3MzTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Nzc25hbWVzLmpzJywgWydnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b24uanMnLCBbJ2dvb2cudWkuQ3VzdG9tQnV0dG9uJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9jdXN0b21jb2xvcnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlJ10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yUGFsZXR0ZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvY3VzdG9tY29sb3JwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuQ3VzdG9tQ29sb3JQYWxldHRlVGVzdCddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5DdXN0b21Db2xvclBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyLmpzJywgWydnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5EYXRlUGlja2VyLkV2ZW50cycsICdnb29nLnVpLkRhdGVQaWNrZXJFdmVudCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRhdGUuRGF0ZScsICdnb29nLmRhdGUuRGF0ZVJhbmdlJywgJ2dvb2cuZGF0ZS5JbnRlcnZhbCcsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlVHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLmkxOG4uRGF0ZVRpbWVGb3JtYXQnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGF0dGVybnMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuRGVmYXVsdERhdGVQaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLklkR2VuZXJhdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuRGF0ZVBpY2tlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZGF0ZS5EYXRlUmFuZ2UnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5pMThuLkRhdGVUaW1lU3ltYm9scycsICdnb29nLmkxOG4uRGF0ZVRpbWVTeW1ib2xzX2VuX1VTJywgJ2dvb2cuaTE4bi5EYXRlVGltZVN5bWJvbHNfemhfSEsnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGF0ZVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RhdGVwaWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EYXRlUGlja2VyUmVuZGVyZXInXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWNvcmF0ZS5qcycsIFsnZ29vZy51aS5kZWNvcmF0ZSddLCBbJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RlY29yYXRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZGVjb3JhdGVUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmRlY29yYXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kZWZhdWx0ZGF0ZXBpY2tlcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkRlZmF1bHREYXRlUGlja2VyUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuRGF0ZVBpY2tlclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2cuanMnLCBbJ2dvb2cudWkuRGlhbG9nJywgJ2dvb2cudWkuRGlhbG9nLkJ1dHRvblNldCcsICdnb29nLnVpLkRpYWxvZy5CdXR0b25TZXQuRGVmYXVsdEJ1dHRvbnMnLCAnZ29vZy51aS5EaWFsb2cuRGVmYXVsdEJ1dHRvbkNhcHRpb25zJywgJ2dvb2cudWkuRGlhbG9nLkRlZmF1bHRCdXR0b25LZXlzJywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50JywgJ2dvb2cudWkuRGlhbG9nLkV2ZW50VHlwZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLnNhZmUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5meC5EcmFnZ2VyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLm1hdGguUmVjdCcsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMuTWFwJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Nb2RhbFBvcHVwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaWFsb2dfdGVzdC5qcycsIFsnZ29vZy51aS5EaWFsb2dUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5jc3MzJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RpbWVuc2lvbnBpY2tlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXInXSwgWydnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuUG9pbnRlclR5cGUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29tcG9uZW50VXRpbCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5EaW1lbnNpb25QaWNrZXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLkFubm91bmNlcicsICdnb29nLmExMXkuYXJpYS5MaXZlUHJpb3JpdHknLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmkxOG4uYmlkaScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kaW1lbnNpb25waWNrZXJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLkRpbWVuc2lvblBpY2tlclJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLkxpdmVQcmlvcml0eScsICdnb29nLmFycmF5JywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyJywgJ2dvb2cudWkuRGltZW5zaW9uUGlja2VyUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9kcmFnZHJvcGRldGVjdG9yLmpzJywgWydnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3InLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkV2ZW50VHlwZScsICdnb29nLnVpLkRyYWdEcm9wRGV0ZWN0b3IuSW1hZ2VEcm9wRXZlbnQnLCAnZ29vZy51aS5EcmFnRHJvcERldGVjdG9yLkxpbmtEcm9wRXZlbnQnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2RyaWxsZG93bnJvdy5qcycsIFsnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZHJpbGxkb3ducm93X3Rlc3QuanMnLCBbJ2dvb2cudWkuRHJpbGxkb3duUm93VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLlNhZmVIdG1sJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EcmlsbGRvd25Sb3cnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYWJzdHJhY3RkaWFsb2cuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nLkJ1aWxkZXInLCAnZ29vZy51aS5lZGl0b3IuQWJzdHJhY3REaWFsb2cuRXZlbnRUeXBlJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cmluZycsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL2Fic3RyYWN0ZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLkRvbUhlbHBlcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9idWJibGUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLlZpZXdwb3J0U2l6ZU1vbml0b3InLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZWRpdG9yLnN0eWxlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5sb2cnLCAnZ29vZy5tYXRoLkJveCcsICdnb29nLm9iamVjdCcsICdnb29nLnBvc2l0aW9uaW5nJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvd1N0YXR1cycsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvYnViYmxlX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkJ1YmJsZVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLmVkaXRvci5CdWJibGUnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9kZWZhdWx0dG9vbGJhci5qcycsIFsnZ29vZy51aS5lZGl0b3IuQnV0dG9uRGVzY3JpcHRvcicsICdnb29nLnVpLmVkaXRvci5EZWZhdWx0VG9vbGJhciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmVkaXRvci5Db21tYW5kJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nLmpzJywgWydnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2cuQmVmb3JlVGVzdExpbmtFdmVudCcsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLkV2ZW50VHlwZScsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nLk9rRXZlbnQnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZWRpdG9yLkJyb3dzZXJGZWF0dXJlJywgJ2dvb2cuZWRpdG9yLkxpbmsnLCAnZ29vZy5lZGl0b3IuZm9jdXMnLCAnZ29vZy5lZGl0b3Iubm9kZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmh0bWwuU2FmZUh0bWxGb3JtYXR0ZXInLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTGlua0J1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuZWRpdG9yLkFic3RyYWN0RGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnLCAnZ29vZy51aS5lZGl0b3IubWVzc2FnZXMnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy53aW5kb3cnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci9saW5rZGlhbG9nX3Rlc3QuanMnLCBbJ2dvb2cudWkuZWRpdG9yLkxpbmtEaWFsb2dUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uRG9tSGVscGVyJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5lZGl0b3IuQnJvd3NlckZlYXR1cmUnLCAnZ29vZy5lZGl0b3IuTGluaycsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50JywgJ2dvb2cudGVzdGluZy5tb2NrbWF0Y2hlcnMnLCAnZ29vZy50ZXN0aW5nLm1vY2ttYXRjaGVycy5Bcmd1bWVudE1hdGNoZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVkaXRvci5BYnN0cmFjdERpYWxvZycsICdnb29nLnVpLmVkaXRvci5MaW5rRGlhbG9nJywgJ2dvb2cudWkuZWRpdG9yLm1lc3NhZ2VzJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL21lc3NhZ2VzLmpzJywgWydnb29nLnVpLmVkaXRvci5tZXNzYWdlcyddLCBbJ2dvb2cuaHRtbC5TYWZlSHRtbEZvcm1hdHRlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZWRpdG9yL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuZWRpdG9yLlRhYlBhbmUnXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyY29udHJvbGxlci5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckNvbnRyb2xsZXInXSwgWydnb29nLmVkaXRvci5GaWVsZCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2VkaXRvci90b29sYmFyZmFjdG9yeS5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknXSwgWydnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuVW5pY29kZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuT3B0aW9uJywgJ2dvb2cudWkuVG9vbGJhcicsICdnb29nLnVpLlRvb2xiYXJCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyQ29sb3JNZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b24nLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInLCAnZ29vZy51aS5Ub29sYmFyU2VsZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lZGl0b3IvdG9vbGJhcmZhY3RvcnlfdGVzdC5qcycsIFsnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnlUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmVkaXRvci5UZXN0SGVscGVyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lZGl0b3IuVG9vbGJhckZhY3RvcnknLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaSddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Vtb2ppcGFsZXR0ZS5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGUnXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5uZXQuSW1hZ2VMb2FkZXInLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuZW1vamkuRW1vamknLCAnZ29vZy51aS5lbW9qaS5FbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuRW1vamlQYWxldHRlUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLmVtb2ppLkVtb2ppJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9lbW9qaXBpY2tlci5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYlBhbmUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJywgJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5FbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL2Zhc3Rfbm9ucHJvZ3Jlc3NpdmVfZW1vamlwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5lbW9qaS5GYXN0Tm9uUHJvZ3Jlc3NpdmVFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLlByb21pc2UnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLm5ldC5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuVGVzdENhc2UnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLkVtb2ppJywgJ2dvb2cudWkuZW1vamkuRW1vamlQaWNrZXInLCAnZ29vZy51aS5lbW9qaS5TcHJpdGVJbmZvJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvZmFzdF9wcm9ncmVzc2l2ZV9lbW9qaXBpY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLkZhc3RQcm9ncmVzc2l2ZUVtb2ppUGlja2VyVGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cubmV0LkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5lbW9qaS5FbW9qaScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJywgJ2dvb2cudWkuZW1vamkuU3ByaXRlSW5mbyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3BvcHVwZW1vamlwaWNrZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLmVtb2ppLkVtb2ppUGlja2VyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9wb3B1cGVtb2ppcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuZW1vamkuUG9wdXBFbW9qaVBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Vtb2ppL3Byb2dyZXNzaXZlZW1vamlwYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuZW1vamkuUHJvZ3Jlc3NpdmVFbW9qaVBhbGV0dGVSZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLmVtb2ppLkVtb2ppUGFsZXR0ZVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9lbW9qaS9zcHJpdGVpbmZvLmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgW10sIHsnbGFuZyc6ICdlczYnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZW1vamkvc3ByaXRlaW5mb190ZXN0LmpzJywgWydnb29nLnVpLmVtb2ppLlNwcml0ZUluZm9UZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLmVtb2ppLlNwcml0ZUluZm8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnUuanMnLCBbJ2dvb2cudWkuRmlsdGVyZWRNZW51J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5JbnB1dEhhbmRsZXInLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkZpbHRlck9ic2VydmluZ01lbnVJdGVtJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJlZG1lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5GaWx0ZXJlZE1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuQXV0b0NvbXBsZXRlVmFsdWVzJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5SZWN0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuRmlsdGVyZWRNZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9maWx0ZXJvYnNlcnZpbmdtZW51aXRlbS5qcycsIFsnZ29vZy51aS5GaWx0ZXJPYnNlcnZpbmdNZW51SXRlbSddLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZpbHRlcm9ic2VydmluZ21lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmlsdGVyT2JzZXJ2aW5nTWVudUl0ZW1SZW5kZXJlciddLCBbJ2dvb2cudWkuTWVudUl0ZW1SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZmxhdGJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ZsYXRtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuRmxhdE1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9mb3JtcG9zdC5qcycsIFsnZ29vZy51aS5Gb3JtUG9zdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2Zvcm1wb3N0X3Rlc3QuanMnLCBbJ2dvb2cudWkuRm9ybVBvc3RUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Gb3JtUG9zdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2UuanMnLCBbJ2dvb2cudWkuR2F1Z2UnLCAnZ29vZy51aS5HYXVnZUNvbG9yZWRSYW5nZSddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnguQW5pbWF0aW9uJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmVhc2luZycsICdnb29nLmdyYXBoaWNzJywgJ2dvb2cuZ3JhcGhpY3MuRm9udCcsICdnb29nLmdyYXBoaWNzLlBhdGgnLCAnZ29vZy5ncmFwaGljcy5Tb2xpZEZpbGwnLCAnZ29vZy5tYXRoJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuR2F1Z2VUaGVtZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvZ2F1Z2V0aGVtZS5qcycsIFsnZ29vZy51aS5HYXVnZVRoZW1lJ10sIFsnZ29vZy5ncmFwaGljcy5MaW5lYXJHcmFkaWVudCcsICdnb29nLmdyYXBoaWNzLlNvbGlkRmlsbCcsICdnb29nLmdyYXBoaWNzLlN0cm9rZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaG92ZXJjYXJkLmpzJywgWydnb29nLnVpLkhvdmVyQ2FyZCcsICdnb29nLnVpLkhvdmVyQ2FyZC5FdmVudFR5cGUnLCAnZ29vZy51aS5Ib3ZlckNhcmQuVHJpZ2dlckV2ZW50J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BZHZhbmNlZFRvb2x0aXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51aS5Ub29sdGlwJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9ob3ZlcmNhcmRfdGVzdC5qcycsIFsnZ29vZy51aS5Ib3ZlckNhcmRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSG92ZXJDYXJkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2YXBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGUnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuY29sb3IuYWxwaGEnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkhzdlBhbGV0dGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdmFwYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuSHN2YVBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvci5hbHBoYScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Ic3ZhUGFsZXR0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2hzdnBhbGV0dGUuanMnLCBbJ2dvb2cudWkuSHN2UGFsZXR0ZSddLCBbJ2dvb2cuY29sb3InLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLklucHV0SGFuZGxlcicsICdnb29nLnN0eWxlJywgJ2dvb2cuc3R5bGUuYmlkaScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaHN2cGFsZXR0ZV90ZXN0LmpzJywgWydnb29nLnVpLkhzdlBhbGV0dGVUZXN0J10sIFsnZ29vZy5jb2xvcicsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Ic3ZQYWxldHRlJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWRnZW5lcmF0b3IuanMnLCBbJ2dvb2cudWkuSWRHZW5lcmF0b3InXSwgW10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXIuanMnLCBbJ2dvb2cudWkuSWRsZVRpbWVyJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pZGxldGltZXJfdGVzdC5qcycsIFsnZ29vZy51aS5JZGxlVGltZXJUZXN0J10sIFsnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSWRsZVRpbWVyJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lmcmFtZW1hc2suanMnLCBbJ2dvb2cudWkuSWZyYW1lTWFzayddLCBbJ2dvb2cuRGlzcG9zYWJsZScsICdnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaWZyYW1lbWFza190ZXN0LmpzJywgWydnb29nLnVpLklmcmFtZU1hc2tUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5pZnJhbWUnLCAnZ29vZy5zdHJ1Y3RzLlBvb2wnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5TdHJpY3RNb2NrJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5JZnJhbWVNYXNrJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9pbWFnZWxlc3NidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2ltYWdlbGVzc21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5JbWFnZWxlc3NNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2lucHV0ZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5JbnB1dERhdGVQaWNrZXInXSwgWydnb29nLmRhdGUuRGF0ZVRpbWUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5pMThuLkRhdGVUaW1lUGFyc2UnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVpLlBvcHVwRGF0ZVBpY2tlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaW5wdXRkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuaTE4bi5EYXRlVGltZUZvcm1hdCcsICdnb29nLmkxOG4uRGF0ZVRpbWVQYXJzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuSW5wdXREYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvaXRlbWV2ZW50LmpzJywgWydnb29nLnVpLkl0ZW1FdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZGV2ZW50ZGF0YS5qcycsIFsnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9rZXlib2FyZHNob3J0Y3V0aGFuZGxlci5qcycsIFsnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0RXZlbnQnLCAnZ29vZy51aS5LZXlib2FyZFNob3J0Y3V0SGFuZGxlcicsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLkV2ZW50VHlwZScsICdnb29nLnVpLktleWJvYXJkU2hvcnRjdXRIYW5kbGVyLk1vZGlmaWVycyddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleU5hbWVzJywgJ2dvb2cuZXZlbnRzLktleXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy51aS5LZXlib2FyZEV2ZW50RGF0YScsICdnb29nLnVpLlN5bnRoZXRpY0tleWJvYXJkRXZlbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2tleWJvYXJkc2hvcnRjdXRoYW5kbGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuQnJvd3NlckV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cudGVzdGluZy5Nb2NrQ2xvY2snLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLlN0cmljdE1vY2snLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuS2V5Ym9hcmRTaG9ydGN1dEhhbmRsZXInLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9sYWJlbGlucHV0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbGFiZWxpbnB1dF90ZXN0LmpzJywgWydnb29nLnVpLkxhYmVsSW5wdXRUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTGFiZWxJbnB1dCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL2xpbmtidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5MaW5rQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkZsYXRCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9mbGFzaG9iamVjdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0LlNjcmlwdEFjY2Vzc0xldmVsJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QuV21vZGVzJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5odG1sLmZsYXNoJywgJ2dvb2cubG9nJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RydWN0cy5NYXAnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxhc2hvYmplY3RfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdFRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5Eb21IZWxwZXInLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLk1vY2tDb250cm9sJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyLmpzJywgWydnb29nLnVpLm1lZGlhLkZsaWNrclNldCcsICdnb29nLnVpLm1lZGlhLkZsaWNrclNldE1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvZmxpY2tyX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0JywgJ2dvb2cudWkubWVkaWEuRmxpY2tyU2V0TW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvLmpzJywgWydnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvJywgJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9Nb2RlbCddLCBbJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL2dvb2dsZXZpZGVvX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuR29vZ2xlVmlkZW9UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5Hb29nbGVWaWRlbycsICdnb29nLnVpLm1lZGlhLkdvb2dsZVZpZGVvTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYV90ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9tZWRpYW1vZGVsLmpzJywgWydnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNhdGVnb3J5JywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLkNyZWRpdC5Sb2xlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5DcmVkaXQuU2NoZW1lJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5NZWRpdW0nLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLk1pbWVUeXBlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5QbGF5ZXInLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsLlN1YlRpdGxlJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbC5UaHVtYm5haWwnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21lZGlhbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvbXAzLmpzJywgWydnb29nLnVpLm1lZGlhLk1wMyddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL21wM190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLk1wM1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1wMyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3Bob3RvLmpzJywgWydnb29nLnVpLm1lZGlhLlBob3RvJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGhvdG9fdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5QaG90b1Rlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuUGhvdG8nXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS9waWNhc2EuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhQWxidW0nLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bU1vZGVsJ10sIFsnZ29vZy5odG1sLlRydXN0ZWRSZXNvdXJjZVVybCcsICdnb29nLnN0cmluZy5Db25zdCcsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5NZWRpYU1vZGVsJywgJ2dvb2cudWkubWVkaWEuTWVkaWFSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVkaWEvcGljYXNhX3Rlc3QuanMnLCBbJ2dvb2cudWkubWVkaWEuUGljYXNhVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5QaWNhc2FBbGJ1bScsICdnb29nLnVpLm1lZGlhLlBpY2FzYUFsYnVtTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lby5qcycsIFsnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgWydnb29nLmh0bWwuVHJ1c3RlZFJlc291cmNlVXJsJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudWkubWVkaWEuRmxhc2hPYmplY3QnLCAnZ29vZy51aS5tZWRpYS5NZWRpYScsICdnb29nLnVpLm1lZGlhLk1lZGlhTW9kZWwnLCAnZ29vZy51aS5tZWRpYS5NZWRpYVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS92aW1lb190ZXN0LmpzJywgWydnb29nLnVpLm1lZGlhLlZpbWVvVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuTWVkaWEnLCAnZ29vZy51aS5tZWRpYS5WaW1lbycsICdnb29nLnVpLm1lZGlhLlZpbWVvTW9kZWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZWRpYS95b3V0dWJlLmpzJywgWydnb29nLnVpLm1lZGlhLllvdXR1YmUnLCAnZ29vZy51aS5tZWRpYS5Zb3V0dWJlTW9kZWwnXSwgWydnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC5UcnVzdGVkUmVzb3VyY2VVcmwnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJpbmcuQ29uc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5tZWRpYS5GbGFzaE9iamVjdCcsICdnb29nLnVpLm1lZGlhLk1lZGlhJywgJ2dvb2cudWkubWVkaWEuTWVkaWFNb2RlbCcsICdnb29nLnVpLm1lZGlhLk1lZGlhUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lZGlhL3lvdXR1YmVfdGVzdC5qcycsIFsnZ29vZy51aS5tZWRpYS5Zb3V0dWJlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLm1lZGlhLkZsYXNoT2JqZWN0JywgJ2dvb2cudWkubWVkaWEuWW91dHViZScsICdnb29nLnVpLm1lZGlhLllvdXR1YmVNb2RlbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnUuanMnLCBbJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnUuRXZlbnRUeXBlJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudC5TdGF0ZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLk1lbnVIZWFkZXInLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YmFyLmpzJywgWydnb29nLnVpLm1lbnVCYXInXSwgWydnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLk1lbnVCYXJSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWJhcmRlY29yYXRvci5qcycsIFsnZ29vZy51aS5tZW51QmFyRGVjb3JhdG9yJ10sIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInLCAnZ29vZy51aS5tZW51QmFyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXJyZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29udGFpbmVyJywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnViYXNlLmpzJywgWydnb29nLnVpLk1lbnVCYXNlJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b24uanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvbiddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5tYXRoLlJlY3QnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLklkR2VuZXJhdG9yJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuU3ViTWVudScsICdnb29nLnVpLnJlZ2lzdHJ5JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9uX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUJ1dHRvblRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnBvc2l0aW9uaW5nLk1lbnVBbmNob3JlZFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuT3ZlcmZsb3cnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlN1Yk1lbnUnLCAnZ29vZy51c2VyQWdlbnQnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0LmlzVmVyc2lvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5DdXN0b21CdXR0b25SZW5kZXJlcicsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51YnV0dG9ucmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51QnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuTWVudUJ1dHRvbicsICdnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVoZWFkZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlciddLCBbJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLk1lbnVIZWFkZXJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aGVhZGVycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuTWVudUhlYWRlclJlbmRlcmVyJ10sIFsnZ29vZy51aS5Db250cm9sUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtLmpzJywgWydnb29nLnVpLk1lbnVJdGVtJ10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0cmluZycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21lbnVpdGVtX3Rlc3QuanMnLCBbJ2dvb2cudWkuTWVudUl0ZW1UZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cubWF0aC5Db29yZGluYXRlJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51aXRlbXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudWl0ZW1yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5NZW51SXRlbVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5Db250YWluZXJSZW5kZXJlcicsICdnb29nLnVpLlNlcGFyYXRvciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yJ10sIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbWVudXNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLk1lbnVTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tZW51c2VwYXJhdG9ycmVuZGVyZXJfdGVzdC5qcycsIFsnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1lbnVTZXBhcmF0b3InLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2NrYWN0aXZpdHltb25pdG9yLmpzJywgWydnb29nLnVpLk1vY2tBY3Rpdml0eU1vbml0b3InXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5BY3Rpdml0eU1vbml0b3InXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vY2thY3Rpdml0eW1vbml0b3JfdGVzdC5qcycsIFsnZ29vZy51aS5Nb2NrQWN0aXZpdHlNb25pdG9yVGVzdCddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQWN0aXZpdHlNb25pdG9yJywgJ2dvb2cudWkuTW9ja0FjdGl2aXR5TW9uaXRvciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFsYXJpYXZpc2liaWxpdHloZWxwZXIuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9tb2RhbGFyaWF2aXNpYmlsaXR5aGVscGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlclRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLnN0cmluZycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL21vZGFscG9wdXAuanMnLCBbJ2dvb2cudWkuTW9kYWxQb3B1cCddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uYW5pbWF0aW9uRnJhbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZG9tLmlmcmFtZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLnN0cmluZycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTW9kYWxBcmlhVmlzaWJpbGl0eUhlbHBlcicsICdnb29nLnVpLlBvcHVwQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvbW9kYWxwb3B1cF90ZXN0LmpzJywgWydnb29nLnVpLk1vZGFsUG9wdXBUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kaXNwb3NlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLk1vZGFsUG9wdXAnLCAnZ29vZy51aS5Qb3B1cEJhc2UnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9uYXRpdmVidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5JbnB1dFR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cudWkuQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL25hdGl2ZWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuTmF0aXZlQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLkV4cGVjdGVkRmFpbHVyZXMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5OYXRpdmVCdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL29wdGlvbi5qcycsIFsnZ29vZy51aS5PcHRpb24nXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVJdGVtJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BhbGV0dGUuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5TaXplJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbCcsICdnb29nLnVpLlBhbGV0dGVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5RXZlbnQnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cy5FdmVudCcsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlBhbGV0dGUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wYWxldHRlcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5Ob2RlSXRlcmF0b3InLCAnZ29vZy5kb20uTm9kZVR5cGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5kb20uZGF0YXNldCcsICdnb29nLml0ZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGFsZXR0ZXJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuaHRtbC50ZXN0aW5nJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5QYWxldHRlJywgJ2dvb2cudWkuUGFsZXR0ZVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcGxhaW50ZXh0c3BlbGxjaGVja2VyLmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQWJzdHJhY3RTcGVsbENoZWNrZXInLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BsYWludGV4dHNwZWxsY2hlY2tlcl90ZXN0LmpzJywgWydnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuc3BlbGwuU3BlbGxDaGVjaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLlBsYWluVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwLmpzJywgWydnb29nLnVpLlBvcHVwJ10sIFsnZ29vZy5tYXRoLkJveCcsICdnb29nLnBvc2l0aW9uaW5nLkFic3RyYWN0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cFRlc3QnXSwgWydnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXAnLCAnZ29vZy51c2VyQWdlbnQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wb3B1cGJhc2UuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBCYXNlLkV2ZW50VHlwZScsICdnb29nLnVpLlBvcHVwQmFzZS5UeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFycmF5JywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmZ4LlRyYW5zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBCYXNlVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnguVHJhbnNpdGlvbicsICdnb29nLmZ4LmNzczMnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXIuanMnLCBbJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRQb3NpdGlvbicsICdnb29nLnBvc2l0aW9uaW5nLkNvcm5lcicsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuUG9wdXAnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwY29sb3JwaWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Qb3B1cENvbG9yUGlja2VyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbG9yUGlja2VyJywgJ2dvb2cudWkuUG9wdXBDb2xvclBpY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3BvcHVwZGF0ZXBpY2tlci5qcycsIFsnZ29vZy51aS5Qb3B1cERhdGVQaWNrZXInXSwgWydnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5wb3NpdGlvbmluZy5BbmNob3JlZFZpZXdwb3J0UG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkRhdGVQaWNrZXInLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBkYXRlcGlja2VyX3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyVGVzdCddLCBbJ2dvb2cuZGF0ZS5EYXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLnJlY29yZEZ1bmN0aW9uJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5EYXRlUGlja2VyJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuUG9wdXBEYXRlUGlja2VyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51LmpzJywgWydnb29nLnVpLlBvcHVwTWVudSddLCBbJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5Ccm93c2VyRXZlbnQuTW91c2VCdXR0b24nLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cucG9zaXRpb25pbmcuTWVudUFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLlZpZXdwb3J0Q2xpZW50UG9zaXRpb24nLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcG9wdXBtZW51X3Rlc3QuanMnLCBbJ2dvb2cudWkuUG9wdXBNZW51VGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkJyb3dzZXJFdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5Qb3B1cE1lbnUnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9wcm9ncmVzc2Jhci5qcycsIFsnZ29vZy51aS5Qcm9ncmVzc0JhcicsICdnb29nLnVpLlByb2dyZXNzQmFyLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlJhbmdlTW9kZWwnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdC5qcycsIFsnZ29vZy51aS5Qcm9tcHQnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLklucHV0VHlwZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmZ1bmN0aW9ucycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5EaWFsb2cnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Byb21wdF90ZXN0LmpzJywgWydnb29nLnVpLlByb21wdFRlc3QnXSwgWydnb29nLmRvbS5zZWxlY3Rpb24nLCAnZ29vZy5ldmVudHMuSW5wdXRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkJpZGlJbnB1dCcsICdnb29nLnVpLkRpYWxvZycsICdnb29nLnVpLlByb21wdCcsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmFuZ2Vtb2RlbC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsJ10sIFsnZ29vZy5ldmVudHMuRXZlbnRUYXJnZXQnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JhbmdlbW9kZWxfdGVzdC5qcycsIFsnZ29vZy51aS5SYW5nZU1vZGVsVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmF0aW5ncy5qcycsIFsnZ29vZy51aS5SYXRpbmdzJywgJ2dvb2cudWkuUmF0aW5ncy5FdmVudFR5cGUnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JlZ2lzdHJ5LmpzJywgWydnb29nLnVpLnJlZ2lzdHJ5J10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmVnaXN0cnlfdGVzdC5qcycsIFsnZ29vZy51aS5yZWdpc3RyeVRlc3QnXSwgWydnb29nLm9iamVjdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkucmVnaXN0cnknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yaWNodGV4dHNwZWxsY2hlY2tlci5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCBbJ2dvb2cuVGltZXInLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLk5vZGVUeXBlJywgJ2dvb2cuZG9tLlJhbmdlJywgJ2dvb2cuZXZlbnRzLkV2ZW50SGFuZGxlcicsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5ldmVudHMuS2V5SGFuZGxlcicsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy5zdHJpbmcuU3RyaW5nQnVmZmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5BYnN0cmFjdFNwZWxsQ2hlY2tlcicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlBvcHVwTWVudSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcmljaHRleHRzcGVsbGNoZWNrZXJfdGVzdC5qcycsIFsnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlclRlc3QnXSwgWydnb29nLmRvbS5SYW5nZScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLm9iamVjdCcsICdnb29nLnNwZWxsLlNwZWxsQ2hlY2snLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5SaWNoVGV4dFNwZWxsQ2hlY2tlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3JvdW5kZWRwYW5lbC5qcycsIFsnZ29vZy51aS5CYXNlUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuQ3NzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuR3JhcGhpY3NSb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwnLCAnZ29vZy51aS5Sb3VuZGVkUGFuZWwuQ29ybmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZ3JhcGhpY3MnLCAnZ29vZy5ncmFwaGljcy5QYXRoJywgJ2dvb2cuZ3JhcGhpY3MuU29saWRGaWxsJywgJ2dvb2cuZ3JhcGhpY3MuU3Ryb2tlJywgJ2dvb2cubWF0aCcsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9yb3VuZGVkcGFuZWxfdGVzdC5qcycsIFsnZ29vZy51aS5Sb3VuZGVkUGFuZWxUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNzc1JvdW5kZWRQYW5lbCcsICdnb29nLnVpLkdyYXBoaWNzUm91bmRlZFBhbmVsJywgJ2dvb2cudWkuUm91bmRlZFBhbmVsJywgJ2dvb2cudXNlckFnZW50J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvcm91bmRlZHRhYnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlJvdW5kZWRUYWJSZW5kZXJlciddLCBbJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5UYWInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyLmpzJywgWydnb29nLnVpLlNjcm9sbEZsb2F0ZXInLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zY3JvbGxmbG9hdGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2Nyb2xsRmxvYXRlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLnN0eWxlJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TY3JvbGxGbG9hdGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0LmpzJywgWydnb29nLnVpLlNlbGVjdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5JZEdlbmVyYXRvcicsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLk1lbnVSZW5kZXJlcicsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdF90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdFRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TZWxlY3QnLCAnZ29vZy51aS5TZXBhcmF0b3InXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZWxlY3Rpb25tZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b24nLCAnZ29vZy51aS5TZWxlY3Rpb25NZW51QnV0dG9uLlNlbGVjdGlvblN0YXRlJ10sIFsnZ29vZy5kb20uSW5wdXRUeXBlJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VsZWN0aW9ubWVudWJ1dHRvbl90ZXN0LmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1lbnVCdXR0b25UZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2VsZWN0aW9uTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsLmpzJywgWydnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NlbGVjdGlvbm1vZGVsX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2VsZWN0aW9uTW9kZWxUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLnRlc3RpbmcucmVjb3JkRnVuY3Rpb24nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlNlbGVjdGlvbk1vZGVsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VwYXJhdG9yLmpzJywgWydnb29nLnVpLlNlcGFyYXRvciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc2VydmVyY2hhcnQuanMnLCBbJ2dvb2cudWkuU2VydmVyQ2hhcnQnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5BeGlzRGlzcGxheVR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5DaGFydFR5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FbmNvZGluZ1R5cGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydC5FdmVudCcsICdnb29nLnVpLlNlcnZlckNoYXJ0LkxlZ2VuZFBvc2l0aW9uJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTWF4aW11bVZhbHVlJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzQWxpZ25tZW50JywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuTXVsdGlBeGlzVHlwZScsICdnb29nLnVpLlNlcnZlckNoYXJ0LlVyaVBhcmFtJywgJ2dvb2cudWkuU2VydmVyQ2hhcnQuVXJpVG9vTG9uZ0V2ZW50J10sIFsnZ29vZy5VcmknLCAnZ29vZy5hcnJheScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudWkuQ29tcG9uZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zZXJ2ZXJjaGFydF90ZXN0LmpzJywgWydnb29nLnVpLlNlcnZlckNoYXJ0VGVzdCddLCBbJ2dvb2cuVXJpJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5TZXJ2ZXJDaGFydCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NsaWRlci5qcycsIFsnZ29vZy51aS5TbGlkZXInLCAnZ29vZy51aS5TbGlkZXIuT3JpZW50YXRpb24nXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy51aS5TbGlkZXJCYXNlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlLmpzJywgWydnb29nLnVpLlNsaWRlckJhc2UnLCAnZ29vZy51aS5TbGlkZXJCYXNlLkFuaW1hdGlvbkZhY3RvcnknLCAnZ29vZy51aS5TbGlkZXJCYXNlLk9yaWVudGF0aW9uJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLk1vdXNlV2hlZWxIYW5kbGVyJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuZnguQW5pbWF0aW9uUGFyYWxsZWxRdWV1ZScsICdnb29nLmZ4LkRyYWdnZXInLCAnZ29vZy5meC5UcmFuc2l0aW9uJywgJ2dvb2cuZnguZG9tLlJlc2l6ZUhlaWdodCcsICdnb29nLmZ4LmRvbS5SZXNpemVXaWR0aCcsICdnb29nLmZ4LmRvbS5TbGlkZScsICdnb29nLm1hdGgnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5SYW5nZU1vZGVsJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zbGlkZXJiYXNlX3Rlc3QuanMnLCBbJ2dvb2cudWkuU2xpZGVyQmFzZVRlc3QnXSwgWydnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5meC5BbmltYXRpb24nLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5zdHlsZScsICdnb29nLnN0eWxlLmJpZGknLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuTW9ja0NvbnRyb2wnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcubW9ja21hdGNoZXJzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3NwbGl0cGFuZS5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmUnLCAnZ29vZy51aS5TcGxpdFBhbmUuT3JpZW50YXRpb24nXSwgWydnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZnguRHJhZ2dlcicsICdnb29nLm1hdGguUmVjdCcsICdnb29nLm1hdGguU2l6ZScsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zcGxpdHBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5TcGxpdFBhbmVUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5tYXRoLlNpemUnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5yZWNvcmRGdW5jdGlvbicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuU3BsaXRQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL2J1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5JTkxJTkVfQkxPQ0tfQ0xBU1NOQU1FJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkJ1dHRvbicsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N0eWxlL2FwcC9tZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudVJlbmRlcmVyJywgJ2dvb2cudWkuc3R5bGUuYXBwLkJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS9zdHlsZS9hcHAvbWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuc3R5bGUuYXBwLk1lbnVCdXR0b25SZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLk1lbnVCdXR0b24nLCAnZ29vZy51aS5zdHlsZS5hcHAuTWVudUJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5yZWdpc3RyeScsICdnb29nLnVpLnN0eWxlLmFwcC5CdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3R5bGUvYXBwL3ByaW1hcnlhY3Rpb25idXR0b25yZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLnN0eWxlLmFwcC5QcmltYXJ5QWN0aW9uQnV0dG9uUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkuc3R5bGUnLCAnZ29vZy51aS5CdXR0b24nLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5zdHlsZS5hcHAuUHJpbWFyeUFjdGlvbkJ1dHRvblJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudS5qcycsIFsnZ29vZy51aS5TdWJNZW51J10sIFsnZ29vZy5UaW1lcicsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cucG9zaXRpb25pbmcuQW5jaG9yZWRWaWV3cG9ydFBvc2l0aW9uJywgJ2dvb2cucG9zaXRpb25pbmcuQ29ybmVyJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51UmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudV90ZXN0LmpzJywgWydnb29nLnVpLlN1Yk1lbnVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuU3RhdGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cuZXZlbnRzLktleUNvZGVzJywgJ2dvb2cuZXZlbnRzLktleUhhbmRsZXInLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy50ZXN0aW5nLk1vY2tDbG9jaycsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51JywgJ2dvb2cudWkuTWVudUl0ZW0nLCAnZ29vZy51aS5TdWJNZW51JywgJ2dvb2cudWkuU3ViTWVudVJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvc3VibWVudXJlbmRlcmVyLmpzJywgWydnb29nLnVpLlN1Yk1lbnVSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYTExeS5hcmlhLlN0YXRlJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnN0eWxlJywgJ2dvb2cudWkuTWVudScsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3N5bnRoZXRpY2tleWJvYXJkZXZlbnQuanMnLCBbJ2dvb2cudWkuU3ludGhldGljS2V5Ym9hcmRFdmVudCddLCBbJ2dvb2cuZXZlbnRzLkV2ZW50JywgJ2dvb2cudWkuS2V5Ym9hcmRFdmVudERhdGEnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYi5qcycsIFsnZ29vZy51aS5UYWInXSwgWydnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2wnLCAnZ29vZy51aS5UYWJSZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYlJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFyLmpzJywgWydnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhci5Mb2NhdGlvbiddLCBbJ2dvb2cudWkuQ29tcG9uZW50LkV2ZW50VHlwZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lci5PcmllbnRhdGlvbicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYkJhclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLlRhYicsICdnb29nLnVpLlRhYkJhcicsICdnb29nLnVpLlRhYkJhclJlbmRlcmVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFiYmFycmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudWkuQ29udGFpbmVyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmJhcnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFiQmFyUmVuZGVyZXJUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudGVzdGluZy51aS5yZW5kZXJlcmFzc2VydHMnLCAnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5UYWJCYXInLCAnZ29vZy51aS5UYWJCYXJSZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyLmpzJywgWydnb29nLnVpLlRhYmxlU29ydGVyJywgJ2dvb2cudWkuVGFibGVTb3J0ZXIuRXZlbnRUeXBlJ10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy51aS5Db21wb25lbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYmxlc29ydGVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVGFibGVTb3J0ZXJUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJsZVNvcnRlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmUuanMnLCBbJ2dvb2cudWkuVGFiUGFuZScsICdnb29nLnVpLlRhYlBhbmUuRXZlbnRzJywgJ2dvb2cudWkuVGFiUGFuZS5UYWJMb2NhdGlvbicsICdnb29nLnVpLlRhYlBhbmUuVGFiUGFnZScsICdnb29nLnVpLlRhYlBhbmVFdmVudCddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudFRhcmdldCcsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5odG1sLlNhZmVTdHlsZVNoZWV0JywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RhYnBhbmVfdGVzdC5qcycsIFsnZ29vZy51aS5UYWJQYW5lVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS5UYWJQYW5lJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGFicmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgWydnb29nLmExMXkuYXJpYS5Sb2xlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ29udHJvbFJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90YWJyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRhYlJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uY2xhc3NsaXN0JywgJ2dvb2cudGVzdGluZy5kb20nLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVGFiJywgJ2dvb2cudWkuVGFiUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90ZXh0YXJlYS5qcycsIFsnZ29vZy51aS5UZXh0YXJlYScsICdnb29nLnVpLlRleHRhcmVhLkV2ZW50VHlwZSddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Db250cm9sJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFfdGVzdC5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuRXhwZWN0ZWRGYWlsdXJlcycsICdnb29nLnRlc3RpbmcuZXZlbnRzLkV2ZW50T2JzZXJ2ZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRleHRhcmVhJywgJ2dvb2cudWkuVGV4dGFyZWFSZW5kZXJlcicsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdGV4dGFyZWFyZW5kZXJlci5qcycsIFsnZ29vZy51aS5UZXh0YXJlYVJlbmRlcmVyJ10sIFsnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLkNvbnRyb2xSZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuQ3VzdG9tQnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhci5qcycsIFsnZ29vZy51aS5Ub29sYmFyJ10sIFsnZ29vZy51aS5Db250YWluZXInLCAnZ29vZy51aS5Ub29sYmFyUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ub29sYmFyVGVzdCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuZG9tJywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLnRlc3RpbmcuZXZlbnRzJywgJ2dvb2cudGVzdGluZy5ldmVudHMuRXZlbnQnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLlRvb2xiYXInLCAnZ29vZy51aS5Ub29sYmFyTWVudUJ1dHRvbiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b24uanMnLCBbJ2dvb2cudWkuVG9vbGJhckJ1dHRvbiddLCBbJ2dvb2cudWkuQnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhckJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkucmVnaXN0cnknXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJidXR0b25yZW5kZXJlci5qcycsIFsnZ29vZy51aS5Ub29sYmFyQnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLkN1c3RvbUJ1dHRvblJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b24nXSwgWydnb29nLnVpLkNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyY29sb3JtZW51YnV0dG9ucmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLkNvbG9yTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuTWVudUJ1dHRvblJlbmRlcmVyJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcmNvbG9ybWVudWJ1dHRvbnJlbmRlcmVyX3Rlc3QuanMnLCBbJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvblJlbmRlcmVyVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy50ZXN0aW5nLnVpLlJlbmRlcmVySGFybmVzcycsICdnb29nLnRlc3RpbmcudWkucmVuZGVyZXJhc3NlcnRzJywgJ2dvb2cudWkuVG9vbGJhckNvbG9yTWVudUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJDb2xvck1lbnVCdXR0b25SZW5kZXJlciddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJtZW51YnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uJ10sIFsnZ29vZy51aS5NZW51QnV0dG9uJywgJ2dvb2cudWkuVG9vbGJhck1lbnVCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFybWVudWJ1dHRvbnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInXSwgWydnb29nLnVpLk1lbnVCdXR0b25SZW5kZXJlciddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJSZW5kZXJlciddLCBbJ2dvb2cuYTExeS5hcmlhLlJvbGUnLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLnVpLkNvbnRhaW5lcicsICdnb29nLnVpLkNvbnRhaW5lclJlbmRlcmVyJywgJ2dvb2cudWkuU2VwYXJhdG9yJywgJ2dvb2cudWkuVG9vbGJhclNlcGFyYXRvclJlbmRlcmVyJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFyc2VsZWN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZWxlY3QnXSwgWydnb29nLnVpLlNlbGVjdCcsICdnb29nLnVpLlRvb2xiYXJNZW51QnV0dG9uUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvci5qcycsIFsnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yJ10sIFsnZ29vZy51aS5TZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInLCAnZ29vZy51aS5yZWdpc3RyeSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbGJhcnNlcGFyYXRvcnJlbmRlcmVyLmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlciddLCBbJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLklOTElORV9CTE9DS19DTEFTU05BTUUnLCAnZ29vZy51aS5NZW51U2VwYXJhdG9yUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3Rvb2xiYXJzZXBhcmF0b3JyZW5kZXJlcl90ZXN0LmpzJywgWydnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3JSZW5kZXJlclRlc3QnXSwgWydnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuQ29tcG9uZW50JywgJ2dvb2cudWkuSU5MSU5FX0JMT0NLX0NMQVNTTkFNRScsICdnb29nLnVpLlRvb2xiYXJTZXBhcmF0b3InLCAnZ29vZy51aS5Ub29sYmFyU2VwYXJhdG9yUmVuZGVyZXInXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sYmFydG9nZ2xlYnV0dG9uLmpzJywgWydnb29nLnVpLlRvb2xiYXJUb2dnbGVCdXR0b24nXSwgWydnb29nLnVpLlRvZ2dsZUJ1dHRvbicsICdnb29nLnVpLlRvb2xiYXJCdXR0b25SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90b29sdGlwLmpzJywgWydnb29nLnVpLlRvb2x0aXAnLCAnZ29vZy51aS5Ub29sdGlwLkN1cnNvclRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuRWxlbWVudFRvb2x0aXBQb3NpdGlvbicsICdnb29nLnVpLlRvb2x0aXAuU3RhdGUnXSwgWydnb29nLlRpbWVyJywgJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tJywgJ2dvb2cuZG9tLlRhZ05hbWUnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cycsICdnb29nLmV2ZW50cy5FdmVudFR5cGUnLCAnZ29vZy5ldmVudHMuRm9jdXNIYW5kbGVyJywgJ2dvb2cubWF0aC5Cb3gnLCAnZ29vZy5tYXRoLkNvb3JkaW5hdGUnLCAnZ29vZy5wb3NpdGlvbmluZycsICdnb29nLnBvc2l0aW9uaW5nLkFuY2hvcmVkUG9zaXRpb24nLCAnZ29vZy5wb3NpdGlvbmluZy5Db3JuZXInLCAnZ29vZy5wb3NpdGlvbmluZy5PdmVyZmxvdycsICdnb29nLnBvc2l0aW9uaW5nLk92ZXJmbG93U3RhdHVzJywgJ2dvb2cucG9zaXRpb25pbmcuVmlld3BvcnRQb3NpdGlvbicsICdnb29nLnN0cnVjdHMuU2V0JywgJ2dvb2cuc3R5bGUnLCAnZ29vZy51aS5Qb3B1cCcsICdnb29nLnVpLlBvcHVwQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdG9vbHRpcF90ZXN0LmpzJywgWydnb29nLnVpLlRvb2x0aXBUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5FdmVudEhhbmRsZXInLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmh0bWwudGVzdGluZycsICdnb29nLm1hdGguQ29vcmRpbmF0ZScsICdnb29nLnBvc2l0aW9uaW5nLkFic29sdXRlUG9zaXRpb24nLCAnZ29vZy5zdHlsZScsICdnb29nLnRlc3RpbmcuTW9ja0Nsb2NrJywgJ2dvb2cudGVzdGluZy5UZXN0UXVldWUnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuUG9wdXBCYXNlJywgJ2dvb2cudWkuVG9vbHRpcCcsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvYmFzZW5vZGUuanMnLCBbJ2dvb2cudWkudHJlZS5CYXNlTm9kZScsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUuRXZlbnRUeXBlJ10sIFsnZ29vZy5UaW1lcicsICdnb29nLmExMXkuYXJpYScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmFzc2VydHMnLCAnZ29vZy5kb20uc2FmZScsICdnb29nLmV2ZW50cy5FdmVudCcsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmh0bWwuU2FmZUh0bWwnLCAnZ29vZy5odG1sLlNhZmVTdHlsZScsICdnb29nLnN0cmluZycsICdnb29nLnN0cmluZy5TdHJpbmdCdWZmZXInLCAnZ29vZy5zdHlsZScsICdnb29nLnVpLkNvbXBvbmVudCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS9iYXNlbm9kZV90ZXN0LmpzJywgWydnb29nLnVpLnRyZWUuQmFzZU5vZGVUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5odG1sLnRlc3RpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLkNvbXBvbmVudCcsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJywgJ2dvb2cudWkudHJlZS5UcmVlTm9kZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2wuanMnLCBbJ2dvb2cudWkudHJlZS5UcmVlQ29udHJvbCddLCBbJ2dvb2cuYTExeS5hcmlhJywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnRUeXBlJywgJ2dvb2cuZXZlbnRzLkZvY3VzSGFuZGxlcicsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuaHRtbC5TYWZlSHRtbCcsICdnb29nLmxvZycsICdnb29nLnVpLnRyZWUuQmFzZU5vZGUnLCAnZ29vZy51aS50cmVlLlRyZWVOb2RlJywgJ2dvb2cudWkudHJlZS5UeXBlQWhlYWQnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHJlZWNvbnRyb2xfdGVzdC5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVDb250cm9sVGVzdCddLCBbJ2dvb2cuZG9tJywgJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51aS50cmVlLlRyZWVDb250cm9sJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHJlZS90cmVlbm9kZS5qcycsIFsnZ29vZy51aS50cmVlLlRyZWVOb2RlJ10sIFsnZ29vZy51aS50cmVlLkJhc2VOb2RlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmVlL3R5cGVhaGVhZC5qcycsIFsnZ29vZy51aS50cmVlLlR5cGVBaGVhZCcsICdnb29nLnVpLnRyZWUuVHlwZUFoZWFkLk9mZnNldCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy5zdHJ1Y3RzLlRyaWUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyZWUvdHlwZWFoZWFkX3Rlc3QuanMnLCBbJ2dvb2cudWkudHJlZS5UeXBlQWhlYWRUZXN0J10sIFsnZ29vZy5kb20nLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVpLnRyZWUuVHJlZUNvbnRyb2wnLCAnZ29vZy51aS50cmVlLlR5cGVBaGVhZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3RyaXN0YXRlbWVudWl0ZW0uanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW0uU3RhdGUnXSwgWydnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy51aS5Db21wb25lbnQnLCAnZ29vZy51aS5NZW51SXRlbScsICdnb29nLnVpLlRyaVN0YXRlTWVudUl0ZW1SZW5kZXJlcicsICdnb29nLnVpLnJlZ2lzdHJ5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1aS90cmlzdGF0ZW1lbnVpdGVtcmVuZGVyZXIuanMnLCBbJ2dvb2cudWkuVHJpU3RhdGVNZW51SXRlbVJlbmRlcmVyJ10sIFsnZ29vZy5hc3NlcnRzJywgJ2dvb2cuZG9tLmNsYXNzbGlzdCcsICdnb29nLnVpLk1lbnVJdGVtUmVuZGVyZXInXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3R3b3RodW1ic2xpZGVyLmpzJywgWydnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cudWkuU2xpZGVyQmFzZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvdHdvdGh1bWJzbGlkZXJfdGVzdC5qcycsIFsnZ29vZy51aS5Ud29UaHVtYlNsaWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuU2xpZGVyQmFzZScsICdnb29nLnVpLlR3b1RodW1iU2xpZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndWkvemlwcHkuanMnLCBbJ2dvb2cudWkuWmlwcHknLCAnZ29vZy51aS5aaXBweS5FdmVudHMnLCAnZ29vZy51aS5aaXBweUV2ZW50J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5hMTF5LmFyaWEuUm9sZScsICdnb29nLmExMXkuYXJpYS5TdGF0ZScsICdnb29nLmRvbScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMuRXZlbnQnLCAnZ29vZy5ldmVudHMuRXZlbnRIYW5kbGVyJywgJ2dvb2cuZXZlbnRzLkV2ZW50VGFyZ2V0JywgJ2dvb2cuZXZlbnRzLkV2ZW50VHlwZScsICdnb29nLmV2ZW50cy5LZXlDb2RlcycsICdnb29nLmV2ZW50cy5LZXlIYW5kbGVyJywgJ2dvb2cuc3R5bGUnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VpL3ppcHB5X3Rlc3QuanMnLCBbJ2dvb2cudWkuWmlwcHlUZXN0J10sIFsnZ29vZy5hMTF5LmFyaWEnLCAnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5jbGFzc2xpc3QnLCAnZ29vZy5ldmVudHMnLCAnZ29vZy5ldmVudHMuS2V5Q29kZXMnLCAnZ29vZy5vYmplY3QnLCAnZ29vZy50ZXN0aW5nLmV2ZW50cycsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudWkuWmlwcHknXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXJpLmpzJywgWydnb29nLlVyaScsICdnb29nLlVyaS5RdWVyeURhdGEnXSwgWydnb29nLmFycmF5JywgJ2dvb2cuYXNzZXJ0cycsICdnb29nLnN0cmluZycsICdnb29nLnN0cnVjdHMnLCAnZ29vZy5zdHJ1Y3RzLk1hcCcsICdnb29nLnVyaS51dGlscycsICdnb29nLnVyaS51dGlscy5Db21wb25lbnRJbmRleCcsICdnb29nLnVyaS51dGlscy5TdGFuZGFyZFF1ZXJ5UGFyYW0nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91cmlfdGVzdC5qcycsIFsnZ29vZy5VcmlUZXN0J10sIFsnZ29vZy5VcmknLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VyaS91dGlscy5qcycsIFsnZ29vZy51cmkudXRpbHMnLCAnZ29vZy51cmkudXRpbHMuQ29tcG9uZW50SW5kZXgnLCAnZ29vZy51cmkudXRpbHMuUXVlcnlBcnJheScsICdnb29nLnVyaS51dGlscy5RdWVyeVZhbHVlJywgJ2dvb2cudXJpLnV0aWxzLlN0YW5kYXJkUXVlcnlQYXJhbSddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5hc3NlcnRzJywgJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1cmkvdXRpbHNfdGVzdC5qcycsIFsnZ29vZy51cmkudXRpbHNUZXN0J10sIFsnZ29vZy5mdW5jdGlvbnMnLCAnZ29vZy5zdHJpbmcnLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVyaS51dGlscyddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlci5qcycsIFsnZ29vZy51c2VyQWdlbnQuYWRvYmVSZWFkZXInXSwgWydnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCddLCB7J21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9hZG9iZXJlYWRlcl90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5hZG9iZVJlYWRlclRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmFkb2JlUmVhZGVyJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L2ZsYXNoLmpzJywgWydnb29nLnVzZXJBZ2VudC5mbGFzaCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvZmxhc2hfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuZmxhc2hUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudC5mbGFzaCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9pcGhvdG8uanMnLCBbJ2dvb2cudXNlckFnZW50LmlwaG90byddLCBbJ2dvb2cuc3RyaW5nJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdC5qcycsIFsnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCBbJ2dvb2cuc3RyaW5nJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvanNjcmlwdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5qc2NyaXB0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy51c2VyQWdlbnQuanNjcmlwdCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9rZXlib2FyZC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmQnXSwgWydnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQva2V5Ym9hcmRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnQua2V5Ym9hcmRUZXN0J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcGxhdGZvcm0uanMnLCBbJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJ10sIFsnZ29vZy5zdHJpbmcnLCAnZ29vZy51c2VyQWdlbnQnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC9wbGF0Zm9ybV90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wbGF0Zm9ybVRlc3QnXSwgWydnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdC5qcycsIFsnZ29vZy51c2VyQWdlbnQucHJvZHVjdCddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF9pc3ZlcnNpb24uanMnLCBbJ2dvb2cudXNlckFnZW50LnByb2R1Y3QuaXNWZXJzaW9uJ10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5wbGF0Zm9ybScsICdnb29nLnN0cmluZycsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudC5wcm9kdWN0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd1c2VyYWdlbnQvcHJvZHVjdF90ZXN0LmpzJywgWydnb29nLnVzZXJBZ2VudC5wcm9kdWN0VGVzdCddLCBbJ2dvb2cuYXJyYXknLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC50ZXN0QWdlbnRzJywgJ2dvb2cubGFicy51c2VyQWdlbnQudXRpbCcsICdnb29nLnRlc3RpbmcuTW9ja1VzZXJBZ2VudCcsICdnb29nLnRlc3RpbmcuUHJvcGVydHlSZXBsYWNlcicsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nLCAnZ29vZy51c2VyQWdlbnRUZXN0VXRpbCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnQuanMnLCBbJ2dvb2cudXNlckFnZW50J10sIFsnZ29vZy5sYWJzLnVzZXJBZ2VudC5icm93c2VyJywgJ2dvb2cubGFicy51c2VyQWdlbnQuZW5naW5lJywgJ2dvb2cubGFicy51c2VyQWdlbnQucGxhdGZvcm0nLCAnZ29vZy5sYWJzLnVzZXJBZ2VudC51dGlsJywgJ2dvb2cucmVmbGVjdCcsICdnb29nLnN0cmluZyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudF9xdWlya3NfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRRdWlya3NUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3VzZXJhZ2VudC91c2VyYWdlbnRfdGVzdC5qcycsIFsnZ29vZy51c2VyQWdlbnRUZXN0J10sIFsnZ29vZy5hcnJheScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cubGFicy51c2VyQWdlbnQudGVzdEFnZW50cycsICdnb29nLmxhYnMudXNlckFnZW50LnV0aWwnLCAnZ29vZy50ZXN0aW5nLlByb3BlcnR5UmVwbGFjZXInLCAnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnVzZXJBZ2VudCcsICdnb29nLnVzZXJBZ2VudFRlc3RVdGlsJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndXNlcmFnZW50L3VzZXJhZ2VudHRlc3R1dGlsLmpzJywgWydnb29nLnVzZXJBZ2VudFRlc3RVdGlsJywgJ2dvb2cudXNlckFnZW50VGVzdFV0aWwuVXNlckFnZW50cyddLCBbJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cub2JqZWN0JywgJ2dvb2cudXNlckFnZW50JywgJ2dvb2cudXNlckFnZW50LmtleWJvYXJkJywgJ2dvb2cudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cudXNlckFnZW50LnByb2R1Y3QnLCAnZ29vZy51c2VyQWdlbnQucHJvZHVjdC5pc1ZlcnNpb24nXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDMyYXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQzMmFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0MzJBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0MzJBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9mbG9hdDY0YXJyYXkuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCBbXSwgeydsYW5nJzogJ2VzNid9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvZmxvYXQ2NGFycmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLkZsb2F0NjRBcnJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLkZsb2F0NjRBcnJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzLmpzJywgWydnb29nLnZlYy5NYXQzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLk1hdDNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5NYXQzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkLmpzJywgWydnb29nLnZlYy5tYXQzZCcsICdnb29nLnZlYy5tYXQzZC5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMudmVjM2QuVHlwZSddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDNkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDNkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMubWF0M2QnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2YuanMnLCBbJ2dvb2cudmVjLm1hdDNmJywgJ2dvb2cudmVjLm1hdDNmLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0M2ZfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0M2ZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5tYXQzZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9tYXQ0LmpzJywgWydnb29nLnZlYy5NYXQ0J10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuVmVjMycsICdnb29nLnZlYy5WZWM0J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NF90ZXN0LmpzJywgWydnb29nLnZlYy5NYXQ0VGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5WZWMzJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGQuanMnLCBbJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLm1hdDRkLlR5cGUnXSwgWydnb29nLnZlYycsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvbWF0NGRfdGVzdC5qcycsIFsnZ29vZy52ZWMubWF0NGRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLm1hdDRkJywgJ2dvb2cudmVjLnZlYzNkJywgJ2dvb2cudmVjLnZlYzRkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmLmpzJywgWydnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy5tYXQ0Zi5UeXBlJ10sIFsnZ29vZy52ZWMnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL21hdDRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLm1hdDRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuUXVhdGVybmlvbicsICdnb29nLnZlYy5tYXQ0ZicsICdnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWM0ZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy9xdWF0ZXJuaW9uLmpzJywgWydnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlF1YXRlcm5pb24uQW55VHlwZSddLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMuVmVjNCddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3F1YXRlcm5pb25fdGVzdC5qcycsIFsnZ29vZy52ZWMuUXVhdGVybmlvblRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLk1hdDMnLCAnZ29vZy52ZWMuTWF0NCcsICdnb29nLnZlYy5RdWF0ZXJuaW9uJywgJ2dvb2cudmVjLlZlYzMnLCAnZ29vZy52ZWMudmVjM2YnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5LmpzJywgWydnb29nLnZlYy5SYXknXSwgWydnb29nLnZlYy5WZWMzJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvcmF5X3Rlc3QuanMnLCBbJ2dvb2cudmVjLlJheVRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlJheSddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMuanMnLCBbJ2dvb2cudmVjJywgJ2dvb2cudmVjLkFueVR5cGUnLCAnZ29vZy52ZWMuQXJyYXlUeXBlJywgJ2dvb2cudmVjLkZsb2F0MzInLCAnZ29vZy52ZWMuRmxvYXQ2NCcsICdnb29nLnZlYy5OdW1iZXInXSwgWydnb29nLnZlYy5GbG9hdDMyQXJyYXknLCAnZ29vZy52ZWMuRmxvYXQ2NEFycmF5J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMi5qcycsIFsnZ29vZy52ZWMuVmVjMiddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMl90ZXN0LmpzJywgWydnb29nLnZlYy5WZWMyVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMuVmVjMiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZC5qcycsIFsnZ29vZy52ZWMudmVjMmQnLCAnZ29vZy52ZWMudmVjMmQuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmRfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmRUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZCddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMyZi5qcycsIFsnZ29vZy52ZWMudmVjMmYnLCAnZ29vZy52ZWMudmVjMmYuVHlwZSddLCBbJ2dvb2cudmVjJ10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjMmZfdGVzdC5qcycsIFsnZ29vZy52ZWMudmVjMmZUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy52ZWMyZiddLCB7J2xhbmcnOiAnZXM2JywgJ21vZHVsZSc6ICdnb29nJ30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzLmpzJywgWydnb29nLnZlYy5WZWMzJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzX3Rlc3QuanMnLCBbJ2dvb2cudmVjLlZlYzNUZXN0J10sIFsnZ29vZy50ZXN0aW5nLnRlc3RTdWl0ZScsICdnb29nLnZlYy5WZWMzJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNkLmpzJywgWydnb29nLnZlYy52ZWMzZCcsICdnb29nLnZlYy52ZWMzZC5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZF90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNkJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzNmLmpzJywgWydnb29nLnZlYy52ZWMzZicsICdnb29nLnZlYy52ZWMzZi5UeXBlJ10sIFsnZ29vZy52ZWMnXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3ZlYy92ZWMzZl90ZXN0LmpzJywgWydnb29nLnZlYy52ZWMzZlRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLnZlYzNmJ10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzQuanMnLCBbJ2dvb2cudmVjLlZlYzQnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRfdGVzdC5qcycsIFsnZ29vZy52ZWMuVmVjNFRlc3QnXSwgWydnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cudmVjLlZlYzQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGQuanMnLCBbJ2dvb2cudmVjLnZlYzRkJywgJ2dvb2cudmVjLnZlYzRkLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRkX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRkVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGQnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd2ZWMvdmVjNGYuanMnLCBbJ2dvb2cudmVjLnZlYzRmJywgJ2dvb2cudmVjLnZlYzRmLlR5cGUnXSwgWydnb29nLnZlYyddLCB7fSk7Cmdvb2cuYWRkRGVwZW5kZW5jeSgndmVjL3ZlYzRmX3Rlc3QuanMnLCBbJ2dvb2cudmVjLnZlYzRmVGVzdCddLCBbJ2dvb2cudGVzdGluZy50ZXN0U3VpdGUnLCAnZ29vZy52ZWMudmVjNGYnXSwgeydsYW5nJzogJ2VzNicsICdtb2R1bGUnOiAnZ29vZyd9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3ZWJnbC93ZWJnbC5qcycsIFsnZ29vZy53ZWJnbCddLCBbXSwge30pOwpnb29nLmFkZERlcGVuZGVuY3koJ3dpbmRvdy93aW5kb3cuanMnLCBbJ2dvb2cud2luZG93J10sIFsnZ29vZy5kb20nLCAnZ29vZy5kb20uVGFnTmFtZScsICdnb29nLmRvbS5zYWZlJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cuaHRtbC51bmNoZWNrZWRjb252ZXJzaW9ucycsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cuc3RyaW5nLkNvbnN0JywgJ2dvb2cudXNlckFnZW50J10sIHt9KTsKZ29vZy5hZGREZXBlbmRlbmN5KCd3aW5kb3cvd2luZG93X3Rlc3QuanMnLCBbJ2dvb2cud2luZG93VGVzdCddLCBbJ2dvb2cuUHJvbWlzZScsICdnb29nLmRvbScsICdnb29nLmRvbS5UYWdOYW1lJywgJ2dvb2cuZXZlbnRzJywgJ2dvb2cuZnVuY3Rpb25zJywgJ2dvb2cuaHRtbC5TYWZlVXJsJywgJ2dvb2cubGFicy51c2VyQWdlbnQuYnJvd3NlcicsICdnb29nLmxhYnMudXNlckFnZW50LmVuZ2luZScsICdnb29nLmxhYnMudXNlckFnZW50LnBsYXRmb3JtJywgJ2dvb2cuc3RyaW5nJywgJ2dvb2cudGVzdGluZy5Qcm9wZXJ0eVJlcGxhY2VyJywgJ2dvb2cudGVzdGluZy5UZXN0Q2FzZScsICdnb29nLnRlc3RpbmcudGVzdFN1aXRlJywgJ2dvb2cud2luZG93J10sIHsnbGFuZyc6ICdlczYnLCAnbW9kdWxlJzogJ2dvb2cnfSk7Cgp3aW5kb3cucG9seW1lclNraXBMb2FkaW5nRm9udFJvYm90byA9IHRydWU7Ci8qKiB2aW06IGV0OnRzPTQ6c3c9NDpzdHM9NAogKiBAbGljZW5zZSBSZXF1aXJlSlMgMi4zLjYgQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMuCiAqIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlLCBodHRwczovL2dpdGh1Yi5jb20vcmVxdWlyZWpzL3JlcXVpcmVqcy9ibG9iL21hc3Rlci9MSUNFTlNFCiAqLwovL05vdCB1c2luZyBzdHJpY3Q6IHVuZXZlbiBzdHJpY3Qgc3VwcG9ydCBpbiBicm93c2VycywgIzM5MiwgYW5kIGNhdXNlcwovL3Byb2JsZW1zIHdpdGggcmVxdWlyZWpzLmV4ZWMoKS90cmFuc3BpbGVyIHBsdWdpbnMgdGhhdCBtYXkgbm90IGJlIHN0cmljdC4KLypqc2xpbnQgcmVnZXhwOiB0cnVlLCBub21lbjogdHJ1ZSwgc2xvcHB5OiB0cnVlICovCi8qZ2xvYmFsIHdpbmRvdywgbmF2aWdhdG9yLCBkb2N1bWVudCwgaW1wb3J0U2NyaXB0cywgc2V0VGltZW91dCwgb3BlcmEgKi8KCnZhciByZXF1aXJlanMsIHJlcXVpcmUsIGRlZmluZTsKKGZ1bmN0aW9uIChnbG9iYWwsIHNldFRpbWVvdXQpIHsKICAgIHZhciByZXEsIHMsIGhlYWQsIGJhc2VFbGVtZW50LCBkYXRhTWFpbiwgc3JjLAogICAgICAgIGludGVyYWN0aXZlU2NyaXB0LCBjdXJyZW50bHlBZGRpbmdTY3JpcHQsIG1haW5TY3JpcHQsIHN1YlBhdGgsCiAgICAgICAgdmVyc2lvbiA9ICcyLjMuNicsCiAgICAgICAgY29tbWVudFJlZ0V4cCA9IC9cL1wqW1xzXFNdKj9cKlwvfChbXjoiJz1dfF4pXC9cLy4qJC9tZywKICAgICAgICBjanNSZXF1aXJlUmVnRXhwID0gL1teLl1ccypyZXF1aXJlXHMqXChccypbIiddKFteJyJcc10rKVsiJ11ccypcKS9nLAogICAgICAgIGpzU3VmZml4UmVnRXhwID0gL1wuanMkLywKICAgICAgICBjdXJyRGlyUmVnRXhwID0gL15cLlwvLywKICAgICAgICBvcCA9IE9iamVjdC5wcm90b3R5cGUsCiAgICAgICAgb3N0cmluZyA9IG9wLnRvU3RyaW5nLAogICAgICAgIGhhc093biA9IG9wLmhhc093blByb3BlcnR5LAogICAgICAgIGlzQnJvd3NlciA9ICEhKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdy5kb2N1bWVudCksCiAgICAgICAgaXNXZWJXb3JrZXIgPSAhaXNCcm93c2VyICYmIHR5cGVvZiBpbXBvcnRTY3JpcHRzICE9PSAndW5kZWZpbmVkJywKICAgICAgICAvL1BTMyBpbmRpY2F0ZXMgbG9hZGVkIGFuZCBjb21wbGV0ZSwgYnV0IG5lZWQgdG8gd2FpdCBmb3IgY29tcGxldGUKICAgICAgICAvL3NwZWNpZmljYWxseS4gU2VxdWVuY2UgaXMgJ2xvYWRpbmcnLCAnbG9hZGVkJywgZXhlY3V0aW9uLAogICAgICAgIC8vIHRoZW4gJ2NvbXBsZXRlJy4gVGhlIFVBIGNoZWNrIGlzIHVuZm9ydHVuYXRlLCBidXQgbm90IHN1cmUgaG93CiAgICAgICAgLy90byBmZWF0dXJlIHRlc3Qgdy9vIGNhdXNpbmcgcGVyZiBpc3N1ZXMuCiAgICAgICAgcmVhZHlSZWdFeHAgPSBpc0Jyb3dzZXIgJiYgbmF2aWdhdG9yLnBsYXRmb3JtID09PSAnUExBWVNUQVRJT04gMycgPwogICAgICAgICAgICAgICAgICAgICAgL15jb21wbGV0ZSQvIDogL14oY29tcGxldGV8bG9hZGVkKSQvLAogICAgICAgIGRlZkNvbnRleHROYW1lID0gJ18nLAogICAgICAgIC8vT2ggdGhlIHRyYWdlZHksIGRldGVjdGluZyBvcGVyYS4gU2VlIHRoZSB1c2FnZSBvZiBpc09wZXJhIGZvciByZWFzb24uCiAgICAgICAgaXNPcGVyYSA9IHR5cGVvZiBvcGVyYSAhPT0gJ3VuZGVmaW5lZCcgJiYgb3BlcmEudG9TdHJpbmcoKSA9PT0gJ1tvYmplY3QgT3BlcmFdJywKICAgICAgICBjb250ZXh0cyA9IHt9LAogICAgICAgIGNmZyA9IHt9LAogICAgICAgIGdsb2JhbERlZlF1ZXVlID0gW10sCiAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSBmYWxzZTsKCiAgICAvL0NvdWxkIG1hdGNoIHNvbWV0aGluZyBsaWtlICcpLy9jb21tZW50JywgZG8gbm90IGxvc2UgdGhlIHByZWZpeCB0byBjb21tZW50LgogICAgZnVuY3Rpb24gY29tbWVudFJlcGxhY2UobWF0Y2gsIHNpbmdsZVByZWZpeCkgewogICAgICAgIHJldHVybiBzaW5nbGVQcmVmaXggfHwgJyc7CiAgICB9CgogICAgZnVuY3Rpb24gaXNGdW5jdGlvbihpdCkgewogICAgICAgIHJldHVybiBvc3RyaW5nLmNhbGwoaXQpID09PSAnW29iamVjdCBGdW5jdGlvbl0nOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzQXJyYXkoaXQpIHsKICAgICAgICByZXR1cm4gb3N0cmluZy5jYWxsKGl0KSA9PT0gJ1tvYmplY3QgQXJyYXldJzsKICAgIH0KCiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiBmb3IgaXRlcmF0aW5nIG92ZXIgYW4gYXJyYXkuIElmIHRoZSBmdW5jIHJldHVybnMKICAgICAqIGEgdHJ1ZSB2YWx1ZSwgaXQgd2lsbCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2goYXJ5LCBmdW5jKSB7CiAgICAgICAgaWYgKGFyeSkgewogICAgICAgICAgICB2YXIgaTsKICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFyeS5sZW5ndGg7IGkgKz0gMSkgewogICAgICAgICAgICAgICAgaWYgKGFyeVtpXSAmJiBmdW5jKGFyeVtpXSwgaSwgYXJ5KSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBhbiBhcnJheSBiYWNrd2FyZHMuIElmIHRoZSBmdW5jCiAgICAgKiByZXR1cm5zIGEgdHJ1ZSB2YWx1ZSwgaXQgd2lsbCBicmVhayBvdXQgb2YgdGhlIGxvb3AuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVhY2hSZXZlcnNlKGFyeSwgZnVuYykgewogICAgICAgIGlmIChhcnkpIHsKICAgICAgICAgICAgdmFyIGk7CiAgICAgICAgICAgIGZvciAoaSA9IGFyeS5sZW5ndGggLSAxOyBpID4gLTE7IGkgLT0gMSkgewogICAgICAgICAgICAgICAgaWYgKGFyeVtpXSAmJiBmdW5jKGFyeVtpXSwgaSwgYXJ5KSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGhhc1Byb3Aob2JqLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGhhc093bi5jYWxsKG9iaiwgcHJvcCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0T3duKG9iaiwgcHJvcCkgewogICAgICAgIHJldHVybiBoYXNQcm9wKG9iaiwgcHJvcCkgJiYgb2JqW3Byb3BdOwogICAgfQoKICAgIC8qKgogICAgICogQ3ljbGVzIG92ZXIgcHJvcGVydGllcyBpbiBhbiBvYmplY3QgYW5kIGNhbGxzIGEgZnVuY3Rpb24gZm9yIGVhY2gKICAgICAqIHByb3BlcnR5IHZhbHVlLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBhIHRydXRoeSB2YWx1ZSwgdGhlbiB0aGUKICAgICAqIGl0ZXJhdGlvbiBpcyBzdG9wcGVkLgogICAgICovCiAgICBmdW5jdGlvbiBlYWNoUHJvcChvYmosIGZ1bmMpIHsKICAgICAgICB2YXIgcHJvcDsKICAgICAgICBmb3IgKHByb3AgaW4gb2JqKSB7CiAgICAgICAgICAgIGlmIChoYXNQcm9wKG9iaiwgcHJvcCkpIHsKICAgICAgICAgICAgICAgIGlmIChmdW5jKG9ialtwcm9wXSwgcHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNpbXBsZSBmdW5jdGlvbiB0byBtaXggaW4gcHJvcGVydGllcyBmcm9tIHNvdXJjZSBpbnRvIHRhcmdldCwKICAgICAqIGJ1dCBvbmx5IGlmIHRhcmdldCBkb2VzIG5vdCBhbHJlYWR5IGhhdmUgYSBwcm9wZXJ0eSBvZiB0aGUgc2FtZSBuYW1lLgogICAgICovCiAgICBmdW5jdGlvbiBtaXhpbih0YXJnZXQsIHNvdXJjZSwgZm9yY2UsIGRlZXBTdHJpbmdNaXhpbikgewogICAgICAgIGlmIChzb3VyY2UpIHsKICAgICAgICAgICAgZWFjaFByb3Aoc291cmNlLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgIGlmIChmb3JjZSB8fCAhaGFzUHJvcCh0YXJnZXQsIHByb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZXBTdHJpbmdNaXhpbiAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICFpc0FycmF5KHZhbHVlKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgISh2YWx1ZSBpbnN0YW5jZW9mIFJlZ0V4cCkpIHsKCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0W3Byb3BdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBtaXhpbih0YXJnZXRbcHJvcF0sIHZhbHVlLCBmb3JjZSwgZGVlcFN0cmluZ01peGluKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbcHJvcF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIC8vU2ltaWxhciB0byBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCwgYnV0IHRoZSAndGhpcycgb2JqZWN0IGlzIHNwZWNpZmllZAogICAgLy9maXJzdCwgc2luY2UgaXQgaXMgZWFzaWVyIHRvIHJlYWQvZmlndXJlIG91dCB3aGF0ICd0aGlzJyB3aWxsIGJlLgogICAgZnVuY3Rpb24gYmluZChvYmosIGZuKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIGZuLmFwcGx5KG9iaiwgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNjcmlwdHMoKSB7CiAgICAgICAgcmV0dXJuIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzY3JpcHQnKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0T25FcnJvcihlcnIpIHsKICAgICAgICB0aHJvdyBlcnI7CiAgICB9CgogICAgLy9BbGxvdyBnZXR0aW5nIGEgZ2xvYmFsIHRoYXQgaXMgZXhwcmVzc2VkIGluCiAgICAvL2RvdCBub3RhdGlvbiwgbGlrZSAnYS5iLmMnLgogICAgZnVuY3Rpb24gZ2V0R2xvYmFsKHZhbHVlKSB7CiAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHZhciBnID0gZ2xvYmFsOwogICAgICAgIGVhY2godmFsdWUuc3BsaXQoJy4nKSwgZnVuY3Rpb24gKHBhcnQpIHsKICAgICAgICAgICAgZyA9IGdbcGFydF07CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGc7CiAgICB9CgogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIGVycm9yIHdpdGggYSBwb2ludGVyIHRvIGFuIFVSTCB3aXRoIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKiBAcGFyYW0ge1N0cmluZ30gaWQgdGhlIGVycm9yIElEIHRoYXQgbWFwcyB0byBhbiBJRCBvbiBhIHdlYiBwYWdlLgogICAgICogQHBhcmFtIHtTdHJpbmd9IG1lc3NhZ2UgaHVtYW4gcmVhZGFibGUgZXJyb3IuCiAgICAgKiBAcGFyYW0ge0Vycm9yfSBbZXJyXSB0aGUgb3JpZ2luYWwgZXJyb3IsIGlmIHRoZXJlIGlzIG9uZS4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7RXJyb3J9CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VFcnJvcihpZCwgbXNnLCBlcnIsIHJlcXVpcmVNb2R1bGVzKSB7CiAgICAgICAgdmFyIGUgPSBuZXcgRXJyb3IobXNnICsgJ1xuaHR0cHM6Ly9yZXF1aXJlanMub3JnL2RvY3MvZXJyb3JzLmh0bWwjJyArIGlkKTsKICAgICAgICBlLnJlcXVpcmVUeXBlID0gaWQ7CiAgICAgICAgZS5yZXF1aXJlTW9kdWxlcyA9IHJlcXVpcmVNb2R1bGVzOwogICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgZS5vcmlnaW5hbEVycm9yID0gZXJyOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZTsKICAgIH0KCiAgICBpZiAodHlwZW9mIGRlZmluZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvL0lmIGEgZGVmaW5lIGlzIGFscmVhZHkgaW4gcGxheSB2aWEgYW5vdGhlciBBTUQgbG9hZGVyLAogICAgICAgIC8vZG8gbm90IG92ZXJ3cml0ZS4KICAgICAgICByZXR1cm47CiAgICB9CgogICAgaWYgKHR5cGVvZiByZXF1aXJlanMgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgaWYgKGlzRnVuY3Rpb24ocmVxdWlyZWpzKSkgewogICAgICAgICAgICAvL0RvIG5vdCBvdmVyd3JpdGUgYW4gZXhpc3RpbmcgcmVxdWlyZWpzIGluc3RhbmNlLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNmZyA9IHJlcXVpcmVqczsKICAgICAgICByZXF1aXJlanMgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgLy9BbGxvdyBmb3IgYSByZXF1aXJlIGNvbmZpZyBvYmplY3QKICAgIGlmICh0eXBlb2YgcmVxdWlyZSAhPT0gJ3VuZGVmaW5lZCcgJiYgIWlzRnVuY3Rpb24ocmVxdWlyZSkpIHsKICAgICAgICAvL2Fzc3VtZSBpdCBpcyBhIGNvbmZpZyBvYmplY3QuCiAgICAgICAgY2ZnID0gcmVxdWlyZTsKICAgICAgICByZXF1aXJlID0gdW5kZWZpbmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ld0NvbnRleHQoY29udGV4dE5hbWUpIHsKICAgICAgICB2YXIgaW5DaGVja0xvYWRlZCwgTW9kdWxlLCBjb250ZXh0LCBoYW5kbGVycywKICAgICAgICAgICAgY2hlY2tMb2FkZWRUaW1lb3V0SWQsCiAgICAgICAgICAgIGNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIC8vRGVmYXVsdHMuIERvIG5vdCBzZXQgYSBkZWZhdWx0IGZvciBtYXAKICAgICAgICAgICAgICAgIC8vY29uZmlnIHRvIHNwZWVkIHVwIG5vcm1hbGl6ZSgpLCB3aGljaAogICAgICAgICAgICAgICAgLy93aWxsIHJ1biBmYXN0ZXIgaWYgdGhlcmUgaXMgbm8gZGVmYXVsdC4KICAgICAgICAgICAgICAgIHdhaXRTZWNvbmRzOiA3LAogICAgICAgICAgICAgICAgYmFzZVVybDogJy4vJywKICAgICAgICAgICAgICAgIHBhdGhzOiB7fSwKICAgICAgICAgICAgICAgIGJ1bmRsZXM6IHt9LAogICAgICAgICAgICAgICAgcGtnczoge30sCiAgICAgICAgICAgICAgICBzaGltOiB7fSwKICAgICAgICAgICAgICAgIGNvbmZpZzoge30KICAgICAgICAgICAgfSwKICAgICAgICAgICAgcmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgLy9yZWdpc3RyeSBvZiBqdXN0IGVuYWJsZWQgbW9kdWxlcywgdG8gc3BlZWQKICAgICAgICAgICAgLy9jeWNsZSBicmVha2luZyBjb2RlIHdoZW4gbG90cyBvZiBtb2R1bGVzCiAgICAgICAgICAgIC8vYXJlIHJlZ2lzdGVyZWQsIGJ1dCBub3QgYWN0aXZhdGVkLgogICAgICAgICAgICBlbmFibGVkUmVnaXN0cnkgPSB7fSwKICAgICAgICAgICAgdW5kZWZFdmVudHMgPSB7fSwKICAgICAgICAgICAgZGVmUXVldWUgPSBbXSwKICAgICAgICAgICAgZGVmaW5lZCA9IHt9LAogICAgICAgICAgICB1cmxGZXRjaGVkID0ge30sCiAgICAgICAgICAgIGJ1bmRsZXNNYXAgPSB7fSwKICAgICAgICAgICAgcmVxdWlyZUNvdW50ZXIgPSAxLAogICAgICAgICAgICB1bm5vcm1hbGl6ZWRDb3VudGVyID0gMTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJpbXMgdGhlIC4gYW5kIC4uIGZyb20gYW4gYXJyYXkgb2YgcGF0aCBzZWdtZW50cy4KICAgICAgICAgKiBJdCB3aWxsIGtlZXAgYSBsZWFkaW5nIHBhdGggc2VnbWVudCBpZiBhIC4uIHdpbGwgYmVjb21lCiAgICAgICAgICogdGhlIGZpcnN0IHBhdGggc2VnbWVudCwgdG8gaGVscCB3aXRoIG1vZHVsZSBuYW1lIGxvb2t1cHMsCiAgICAgICAgICogd2hpY2ggYWN0IGxpa2UgcGF0aHMsIGJ1dCBjYW4gYmUgcmVtYXBwZWQuIEJ1dCB0aGUgZW5kIHJlc3VsdCwKICAgICAgICAgKiBhbGwgcGF0aHMgdGhhdCB1c2UgdGhpcyBmdW5jdGlvbiBzaG91bGQgbG9vayBub3JtYWxpemVkLgogICAgICAgICAqIE5PVEU6IHRoaXMgbWV0aG9kIE1PRElGSUVTIHRoZSBpbnB1dCBhcnJheS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnkgdGhlIGFycmF5IG9mIHBhdGggc2VnbWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdHJpbURvdHMoYXJ5KSB7CiAgICAgICAgICAgIHZhciBpLCBwYXJ0OwogICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgYXJ5Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBwYXJ0ID0gYXJ5W2ldOwogICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgaSAtPSAxOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmIChwYXJ0ID09PSAnLi4nKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYXQgdGhlIHN0YXJ0LCBvciBwcmV2aW91cyB2YWx1ZSBpcyBzdGlsbCAuLiwKICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZW0gc28gdGhhdCB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGggaXQgbWF5CiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgd29yayB3aGVuIGNvbnZlcnRlZCB0byBhIHBhdGgsIGV2ZW4gdGhvdWdoCiAgICAgICAgICAgICAgICAgICAgLy8gYXMgYW4gSUQgaXQgaXMgbGVzcyB0aGFuIGlkZWFsLiBJbiBsYXJnZXIgcG9pbnQKICAgICAgICAgICAgICAgICAgICAvLyByZWxlYXNlcywgbWF5IGJlIGJldHRlciB0byBqdXN0IGtpY2sgb3V0IGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgIGlmIChpID09PSAwIHx8IChpID09PSAxICYmIGFyeVsyXSA9PT0gJy4uJykgfHwgYXJ5W2kgLSAxXSA9PT0gJy4uJykgewogICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGkgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFyeS5zcGxpY2UoaSAtIDEsIDIpOwogICAgICAgICAgICAgICAgICAgICAgICBpIC09IDI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhIHJlbGF0aXZlIG1vZHVsZSBuYW1lLCBsaWtlIC4vc29tZXRoaW5nLCBub3JtYWxpemUgaXQgdG8KICAgICAgICAgKiBhIHJlYWwgbmFtZSB0aGF0IGNhbiBiZSBtYXBwZWQgdG8gYSBwYXRoLgogICAgICAgICAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSByZWxhdGl2ZSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IGJhc2VOYW1lIGEgcmVhbCBuYW1lIHRoYXQgdGhlIG5hbWUgYXJnIGlzIHJlbGF0aXZlCiAgICAgICAgICogdG8uCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBhcHBseU1hcCBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgdmFsdWUuIFNob3VsZAogICAgICAgICAqIG9ubHkgYmUgZG9uZSBpZiB0aGlzIG5vcm1hbGl6YXRpb24gaXMgZm9yIGEgZGVwZW5kZW5jeSBJRC4KICAgICAgICAgKiBAcmV0dXJucyB7U3RyaW5nfSBub3JtYWxpemVkIG5hbWUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBub3JtYWxpemUobmFtZSwgYmFzZU5hbWUsIGFwcGx5TWFwKSB7CiAgICAgICAgICAgIHZhciBwa2dNYWluLCBtYXBWYWx1ZSwgbmFtZVBhcnRzLCBpLCBqLCBuYW1lU2VnbWVudCwgbGFzdEluZGV4LAogICAgICAgICAgICAgICAgZm91bmRNYXAsIGZvdW5kSSwgZm91bmRTdGFyTWFwLCBzdGFySSwgbm9ybWFsaXplZEJhc2VQYXJ0cywKICAgICAgICAgICAgICAgIGJhc2VQYXJ0cyA9IChiYXNlTmFtZSAmJiBiYXNlTmFtZS5zcGxpdCgnLycpKSwKICAgICAgICAgICAgICAgIG1hcCA9IGNvbmZpZy5tYXAsCiAgICAgICAgICAgICAgICBzdGFyTWFwID0gbWFwICYmIG1hcFsnKiddOwoKICAgICAgICAgICAgLy9BZGp1c3QgYW55IHJlbGF0aXZlIHBhdGhzLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGxhc3RJbmRleCA9IG5hbWUubGVuZ3RoIC0gMTsKCiAgICAgICAgICAgICAgICAvLyBJZiB3YW50aW5nIG5vZGUgSUQgY29tcGF0aWJpbGl0eSwgc3RyaXAgLmpzIGZyb20gZW5kCiAgICAgICAgICAgICAgICAvLyBvZiBJRHMuIEhhdmUgdG8gZG8gdGhpcyBoZXJlLCBhbmQgbm90IGluIG5hbWVUb1VybAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBub2RlIGFsbG93cyBlaXRoZXIgLmpzIG9yIG5vbiAuanMgdG8gbWFwCiAgICAgICAgICAgICAgICAvLyB0byBzYW1lIGZpbGUuCiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLm5vZGVJZENvbXBhdCAmJiBqc1N1ZmZpeFJlZ0V4cC50ZXN0KG5hbWVbbGFzdEluZGV4XSkpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lW2xhc3RJbmRleF0gPSBuYW1lW2xhc3RJbmRleF0ucmVwbGFjZShqc1N1ZmZpeFJlZ0V4cCwgJycpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIFN0YXJ0cyB3aXRoIGEgJy4nIHNvIG5lZWQgdGhlIGJhc2VOYW1lCiAgICAgICAgICAgICAgICBpZiAobmFtZVswXS5jaGFyQXQoMCkgPT09ICcuJyAmJiBiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAvL0NvbnZlcnQgYmFzZU5hbWUgdG8gYXJyYXksIGFuZCBsb3Agb2ZmIHRoZSBsYXN0IHBhcnQsCiAgICAgICAgICAgICAgICAgICAgLy9zbyB0aGF0IC4gbWF0Y2hlcyB0aGF0ICdkaXJlY3RvcnknIGFuZCBub3QgbmFtZSBvZiB0aGUgYmFzZU5hbWUncwogICAgICAgICAgICAgICAgICAgIC8vbW9kdWxlLiBGb3IgaW5zdGFuY2UsIGJhc2VOYW1lIG9mICdvbmUvdHdvL3RocmVlJywgbWFwcyB0bwogICAgICAgICAgICAgICAgICAgIC8vJ29uZS90d28vdGhyZWUuanMnLCBidXQgd2Ugd2FudCB0aGUgZGlyZWN0b3J5LCAnb25lL3R3bycgZm9yCiAgICAgICAgICAgICAgICAgICAgLy90aGlzIG5vcm1hbGl6YXRpb24uCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZEJhc2VQYXJ0cyA9IGJhc2VQYXJ0cy5zbGljZSgwLCBiYXNlUGFydHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vcm1hbGl6ZWRCYXNlUGFydHMuY29uY2F0KG5hbWUpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRyaW1Eb3RzKG5hbWUpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuam9pbignLycpOwogICAgICAgICAgICB9CgogICAgICAgICAgICAvL0FwcGx5IG1hcCBjb25maWcgaWYgYXZhaWxhYmxlLgogICAgICAgICAgICBpZiAoYXBwbHlNYXAgJiYgbWFwICYmIChiYXNlUGFydHMgfHwgc3Rhck1hcCkpIHsKICAgICAgICAgICAgICAgIG5hbWVQYXJ0cyA9IG5hbWUuc3BsaXQoJy8nKTsKCiAgICAgICAgICAgICAgICBvdXRlckxvb3A6IGZvciAoaSA9IG5hbWVQYXJ0cy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lU2VnbWVudCA9IG5hbWVQYXJ0cy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgIGlmIChiYXNlUGFydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9GaW5kIHRoZSBsb25nZXN0IGJhc2VOYW1lIHNlZ21lbnQgbWF0Y2ggaW4gdGhlIGNvbmZpZy4KICAgICAgICAgICAgICAgICAgICAgICAgLy9TbywgZG8gam9pbnMgb24gdGhlIGJpZ2dlc3QgdG8gc21hbGxlc3QgbGVuZ3RocyBvZiBiYXNlUGFydHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IGJhc2VQYXJ0cy5sZW5ndGg7IGogPiAwOyBqIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcFZhbHVlID0gZ2V0T3duKG1hcCwgYmFzZVBhcnRzLnNsaWNlKDAsIGopLmpvaW4oJy8nKSk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9iYXNlTmFtZSBzZWdtZW50IGhhcyBjb25maWcsIGZpbmQgaWYgaXQgaGFzIG9uZSBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwVmFsdWUgPSBnZXRPd24obWFwVmFsdWUsIG5hbWVTZWdtZW50KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXRjaCwgdXBkYXRlIG5hbWUgdG8gdGhlIG5ldyB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRNYXAgPSBtYXBWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRJID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsgb3V0ZXJMb29wOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9DaGVjayBmb3IgYSBzdGFyIG1hcCBtYXRjaCwgYnV0IGp1c3QgaG9sZCBvbiB0byBpdCwKICAgICAgICAgICAgICAgICAgICAvL2lmIHRoZXJlIGlzIGEgc2hvcnRlciBzZWdtZW50IG1hdGNoIGxhdGVyIGluIGEgbWF0Y2hpbmcKICAgICAgICAgICAgICAgICAgICAvL2NvbmZpZywgdGhlbiBmYXZvciBvdmVyIHRoaXMgc3RhciBtYXAuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZFN0YXJNYXAgJiYgc3Rhck1hcCAmJiBnZXRPd24oc3Rhck1hcCwgbmFtZVNlZ21lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvdW5kU3Rhck1hcCA9IGdldE93bihzdGFyTWFwLCBuYW1lU2VnbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJJID0gaTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgaWYgKCFmb3VuZE1hcCAmJiBmb3VuZFN0YXJNYXApIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZE1hcCA9IGZvdW5kU3Rhck1hcDsKICAgICAgICAgICAgICAgICAgICBmb3VuZEkgPSBzdGFySTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBpZiAoZm91bmRNYXApIHsKICAgICAgICAgICAgICAgICAgICBuYW1lUGFydHMuc3BsaWNlKDAsIGZvdW5kSSwgZm91bmRNYXApOwogICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHMuam9pbignLycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICAvLyBJZiB0aGUgbmFtZSBwb2ludHMgdG8gYSBwYWNrYWdlJ3MgbmFtZSwgdXNlCiAgICAgICAgICAgIC8vIHRoZSBwYWNrYWdlIG1haW4gaW5zdGVhZC4KICAgICAgICAgICAgcGtnTWFpbiA9IGdldE93bihjb25maWcucGtncywgbmFtZSk7CgogICAgICAgICAgICByZXR1cm4gcGtnTWFpbiA/IHBrZ01haW4gOiBuYW1lOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmVtb3ZlU2NyaXB0KG5hbWUpIHsKICAgICAgICAgICAgaWYgKGlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgZWFjaChzY3JpcHRzKCksIGZ1bmN0aW9uIChzY3JpcHROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNjcmlwdE5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKSA9PT0gbmFtZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0Tm9kZS5nZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWNvbnRleHQnKSA9PT0gY29udGV4dC5jb250ZXh0TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHROb2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc2NyaXB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBoYXNQYXRoRmFsbGJhY2soaWQpIHsKICAgICAgICAgICAgdmFyIHBhdGhDb25maWcgPSBnZXRPd24oY29uZmlnLnBhdGhzLCBpZCk7CiAgICAgICAgICAgIGlmIChwYXRoQ29uZmlnICYmIGlzQXJyYXkocGF0aENvbmZpZykgJiYgcGF0aENvbmZpZy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgICAvL1BvcCBvZmYgdGhlIGZpcnN0IGFycmF5IHZhbHVlLCBzaW5jZSBpdCBmYWlsZWQsIGFuZAogICAgICAgICAgICAgICAgLy9yZXRyeQogICAgICAgICAgICAgICAgcGF0aENvbmZpZy5zaGlmdCgpOwogICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlLnVuZGVmKGlkKTsKCiAgICAgICAgICAgICAgICAvL0N1c3RvbSByZXF1aXJlIHRoYXQgZG9lcyBub3QgZG8gbWFwIHRyYW5zbGF0aW9uLCBzaW5jZQogICAgICAgICAgICAgICAgLy9JRCBpcyAiYWJzb2x1dGUiLCBhbHJlYWR5IG1hcHBlZC9yZXNvbHZlZC4KICAgICAgICAgICAgICAgIGNvbnRleHQubWFrZVJlcXVpcmUobnVsbCwgewogICAgICAgICAgICAgICAgICAgIHNraXBNYXA6IHRydWUKICAgICAgICAgICAgICAgIH0pKFtpZF0pOwoKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvL1R1cm5zIGEgcGx1Z2luIXJlc291cmNlIHRvIFtwbHVnaW4sIHJlc291cmNlXQogICAgICAgIC8vd2l0aCB0aGUgcGx1Z2luIGJlaW5nIHVuZGVmaW5lZCBpZiB0aGUgbmFtZQogICAgICAgIC8vZGlkIG5vdCBoYXZlIGEgcGx1Z2luIHByZWZpeC4KICAgICAgICBmdW5jdGlvbiBzcGxpdFByZWZpeChuYW1lKSB7CiAgICAgICAgICAgIHZhciBwcmVmaXgsCiAgICAgICAgICAgICAgICBpbmRleCA9IG5hbWUgPyBuYW1lLmluZGV4T2YoJyEnKSA6IC0xOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgcHJlZml4ID0gbmFtZS5zdWJzdHJpbmcoMCwgaW5kZXgpOwogICAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyaW5nKGluZGV4ICsgMSwgbmFtZS5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbcHJlZml4LCBuYW1lXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBtb2R1bGUgbWFwcGluZyB0aGF0IGluY2x1ZGVzIHBsdWdpbiBwcmVmaXgsIG1vZHVsZQogICAgICAgICAqIG5hbWUsIGFuZCBwYXRoLiBJZiBwYXJlbnRNb2R1bGVNYXAgaXMgcHJvdmlkZWQgaXQgd2lsbAogICAgICAgICAqIGFsc28gbm9ybWFsaXplIHRoZSBuYW1lIHZpYSByZXF1aXJlLm5vcm1hbGl6ZSgpCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gbmFtZSB0aGUgbW9kdWxlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge1N0cmluZ30gW3BhcmVudE1vZHVsZU1hcF0gcGFyZW50IG1vZHVsZSBtYXAKICAgICAgICAgKiBmb3IgdGhlIG1vZHVsZSBuYW1lLCB1c2VkIHRvIHJlc29sdmUgcmVsYXRpdmUgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHtCb29sZWFufSBpc05vcm1hbGl6ZWQ6IGlzIHRoZSBJRCBhbHJlYWR5IG5vcm1hbGl6ZWQuCiAgICAgICAgICogVGhpcyBpcyB0cnVlIGlmIHRoaXMgY2FsbCBpcyBkb25lIGZvciBhIGRlZmluZSgpIG1vZHVsZSBJRC4KICAgICAgICAgKiBAcGFyYW0ge0Jvb2xlYW59IGFwcGx5TWFwOiBhcHBseSB0aGUgbWFwIGNvbmZpZyB0byB0aGUgSUQuCiAgICAgICAgICogU2hvdWxkIG9ubHkgYmUgdHJ1ZSBpZiB0aGlzIG1hcCBpcyBmb3IgYSBkZXBlbmRlbmN5LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYWtlTW9kdWxlTWFwKG5hbWUsIHBhcmVudE1vZHVsZU1hcCwgaXNOb3JtYWxpemVkLCBhcHBseU1hcCkgewogICAgICAgICAgICB2YXIgdXJsLCBwbHVnaW5Nb2R1bGUsIHN1ZmZpeCwgbmFtZVBhcnRzLAogICAgICAgICAgICAgICAgcHJlZml4ID0gbnVsbCwKICAgICAgICAgICAgICAgIHBhcmVudE5hbWUgPSBwYXJlbnRNb2R1bGVNYXAgPyBwYXJlbnRNb2R1bGVNYXAubmFtZSA6IG51bGwsCiAgICAgICAgICAgICAgICBvcmlnaW5hbE5hbWUgPSBuYW1lLAogICAgICAgICAgICAgICAgaXNEZWZpbmUgPSB0cnVlLAogICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSAnJzsKCiAgICAgICAgICAgIC8vSWYgbm8gbmFtZSwgdGhlbiBpdCBtZWFucyBpdCBpcyBhIHJlcXVpcmUgY2FsbCwgZ2VuZXJhdGUgYW4KICAgICAgICAgICAgLy9pbnRlcm5hbCBuYW1lLgogICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgIGlzRGVmaW5lID0gZmFsc2U7CiAgICAgICAgICAgICAgICBuYW1lID0gJ19AcicgKyAocmVxdWlyZUNvdW50ZXIgKz0gMSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIG5hbWVQYXJ0cyA9IHNwbGl0UHJlZml4KG5hbWUpOwogICAgICAgICAgICBwcmVmaXggPSBuYW1lUGFydHNbMF07CiAgICAgICAgICAgIG5hbWUgPSBuYW1lUGFydHNbMV07CgogICAgICAgICAgICBpZiAocHJlZml4KSB7CiAgICAgICAgICAgICAgICBwcmVmaXggPSBub3JtYWxpemUocHJlZml4LCBwYXJlbnROYW1lLCBhcHBseU1hcCk7CiAgICAgICAgICAgICAgICBwbHVnaW5Nb2R1bGUgPSBnZXRPd24oZGVmaW5lZCwgcHJlZml4KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9BY2NvdW50IGZvciByZWxhdGl2ZSBwYXRocyBpZiB0aGVyZSBpcyBhIGJhc2UgbmFtZS4KICAgICAgICAgICAgaWYgKG5hbWUpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNOb3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lID0gbmFtZTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBsdWdpbk1vZHVsZSAmJiBwbHVnaW5Nb2R1bGUubm9ybWFsaXplKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vUGx1Z2luIGlzIGxvYWRlZCwgdXNlIGl0cyBub3JtYWxpemUgbWV0aG9kLgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IHBsdWdpbk1vZHVsZS5ub3JtYWxpemUobmFtZSwgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBub3JtYWxpemUobmFtZSwgcGFyZW50TmFtZSwgYXBwbHlNYXApOwogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBuZXN0ZWQgcGx1Z2luIHJlZmVyZW5jZXMsIHRoZW4gZG8gbm90IHRyeSB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyBub3JtYWxpemUsIGFzIGl0IHdpbGwgbm90IG5vcm1hbGl6ZSBjb3JyZWN0bHkuIFRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGxhY2VzIGEgcmVzdHJpY3Rpb24gb24gcmVzb3VyY2VJZHMsIGFuZCB0aGUgbG9uZ2VyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRlcm0gc29sdXRpb24gaXMgbm90IHRvIG5vcm1hbGl6ZSB1bnRpbCBwbHVnaW5zIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2FkZWQgYW5kIGFsbCBub3JtYWxpemF0aW9ucyB0byBhbGxvdyBmb3IgYXN5bmMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZGluZyBvZiBhIGxvYWRlciBwbHVnaW4uIEJ1dCBmb3Igbm93LCBmaXhlcyB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29tbW9uIHVzZXMuIERldGFpbHMgaW4gIzExMzEKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBuYW1lLmluZGV4T2YoJyEnKSA9PT0gLTEgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCBhcHBseU1hcCkgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL0EgcmVndWxhciBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE5hbWUgPSBub3JtYWxpemUobmFtZSwgcGFyZW50TmFtZSwgYXBwbHlNYXApOwoKICAgICAgICAgICAgICAgICAgICAvL05vcm1hbGl6ZWQgbmFtZSBtYXkgYmUgYSBwbHVnaW4gSUQgZHVlIHRvIG1hcCBjb25maWcKICAgICAgICAgICAgICAgICAgICAvL2FwcGxpY2F0aW9uIGluIG5vcm1hbGl6ZS4gVGhlIG1hcCBjb25maWcgdmFsdWVzIG11c3QKICAgICAgICAgICAgICAgICAgICAvL2FscmVhZHkgYmUgbm9ybWFsaXplZCwgc28gZG8gbm90IG5lZWQgdG8gcmVkbyB0aGF0IHBhcnQuCiAgICAgICAgICAgICAgICAgICAgbmFtZVBhcnRzID0gc3BsaXRQcmVmaXgobm9ybWFsaXplZE5hbWUpOwogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IG5hbWVQYXJ0c1swXTsKICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTmFtZSA9IG5hbWVQYXJ0c1sxXTsKICAgICAgICAgICAgICAgICAgICBpc05vcm1hbGl6ZWQgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICB1cmwgPSBjb250ZXh0Lm5hbWVUb1VybChub3JtYWxpemVkTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vSWYgdGhlIGlkIGlzIGEgcGx1Z2luIGlkIHRoYXQgY2Fubm90IGJlIGRldGVybWluZWQgaWYgaXQgbmVlZHMKICAgICAgICAgICAgLy9ub3JtYWxpemF0aW9uLCBzdGFtcCBpdCB3aXRoIGEgdW5pcXVlIElEIHNvIHR3byBtYXRjaGluZyByZWxhdGl2ZQogICAgICAgICAgICAvL2lkcyB0aGF0IG1heSBjb25mbGljdCBjYW4gYmUgc2VwYXJhdGUuCiAgICAgICAgICAgIHN1ZmZpeCA9IHByZWZpeCAmJiAhcGx1Z2luTW9kdWxlICYmICFpc05vcm1hbGl6ZWQgPwogICAgICAgICAgICAgICAgICAgICAnX3Vubm9ybWFsaXplZCcgKyAodW5ub3JtYWxpemVkQ291bnRlciArPSAxKSA6CiAgICAgICAgICAgICAgICAgICAgICcnOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHByZWZpeDogcHJlZml4LAogICAgICAgICAgICAgICAgbmFtZTogbm9ybWFsaXplZE5hbWUsCiAgICAgICAgICAgICAgICBwYXJlbnRNYXA6IHBhcmVudE1vZHVsZU1hcCwKICAgICAgICAgICAgICAgIHVubm9ybWFsaXplZDogISFzdWZmaXgsCiAgICAgICAgICAgICAgICB1cmw6IHVybCwKICAgICAgICAgICAgICAgIG9yaWdpbmFsTmFtZTogb3JpZ2luYWxOYW1lLAogICAgICAgICAgICAgICAgaXNEZWZpbmU6IGlzRGVmaW5lLAogICAgICAgICAgICAgICAgaWQ6IChwcmVmaXggPwogICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXggKyAnIScgKyBub3JtYWxpemVkTmFtZSA6CiAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWROYW1lKSArIHN1ZmZpeAogICAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gZ2V0TW9kdWxlKGRlcE1hcCkgewogICAgICAgICAgICB2YXIgaWQgPSBkZXBNYXAuaWQsCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKCiAgICAgICAgICAgIGlmICghbW9kKSB7CiAgICAgICAgICAgICAgICBtb2QgPSByZWdpc3RyeVtpZF0gPSBuZXcgY29udGV4dC5Nb2R1bGUoZGVwTWFwKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcmV0dXJuIG1vZDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG9uKGRlcE1hcCwgbmFtZSwgZm4pIHsKICAgICAgICAgICAgdmFyIGlkID0gZGVwTWFwLmlkLAogICAgICAgICAgICAgICAgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBpZCk7CgogICAgICAgICAgICBpZiAoaGFzUHJvcChkZWZpbmVkLCBpZCkgJiYKICAgICAgICAgICAgICAgICAgICAoIW1vZCB8fCBtb2QuZGVmaW5lRW1pdENvbXBsZXRlKSkgewogICAgICAgICAgICAgICAgaWYgKG5hbWUgPT09ICdkZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgIGZuKGRlZmluZWRbaWRdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG1vZCA9IGdldE1vZHVsZShkZXBNYXApOwogICAgICAgICAgICAgICAgaWYgKG1vZC5lcnJvciAmJiBuYW1lID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgICAgICAgICAgZm4obW9kLmVycm9yKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbW9kLm9uKG5hbWUsIGZuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gb25FcnJvcihlcnIsIGVycmJhY2spIHsKICAgICAgICAgICAgdmFyIGlkcyA9IGVyci5yZXF1aXJlTW9kdWxlcywKICAgICAgICAgICAgICAgIG5vdGlmaWVkID0gZmFsc2U7CgogICAgICAgICAgICBpZiAoZXJyYmFjaykgewogICAgICAgICAgICAgICAgZXJyYmFjayhlcnIpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZWFjaChpZHMsIGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBnZXRPd24ocmVnaXN0cnksIGlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vU2V0IGVycm9yIG9uIG1vZHVsZSwgc28gaXQgc2tpcHMgdGltZW91dCBjaGVja3MuCiAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5lcnJvciA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICBpZiAoIW5vdGlmaWVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxLm9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJuYWwgbWV0aG9kIHRvIHRyYW5zZmVyIGdsb2JhbFF1ZXVlIGl0ZW1zIHRvIHRoaXMgY29udGV4dCdzCiAgICAgICAgICogZGVmUXVldWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdGFrZUdsb2JhbFF1ZXVlKCkgewogICAgICAgICAgICAvL1B1c2ggYWxsIHRoZSBnbG9iYWxEZWZRdWV1ZSBpdGVtcyBpbnRvIHRoZSBjb250ZXh0J3MgZGVmUXVldWUKICAgICAgICAgICAgaWYgKGdsb2JhbERlZlF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZWFjaChnbG9iYWxEZWZRdWV1ZSwgZnVuY3Rpb24ocXVldWVJdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkID0gcXVldWVJdGVtWzBdOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXBbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVmUXVldWUucHVzaChxdWV1ZUl0ZW0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBnbG9iYWxEZWZRdWV1ZSA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBoYW5kbGVycyA9IHsKICAgICAgICAgICAgJ3JlcXVpcmUnOiBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kLnJlcXVpcmUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kLnJlcXVpcmU7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAobW9kLnJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKG1vZC5tYXApKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ2V4cG9ydHMnOiBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICBtb2QudXNpbmdFeHBvcnRzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChtb2QubWFwLmlzRGVmaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5leHBvcnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoZGVmaW5lZFttb2QubWFwLmlkXSA9IG1vZC5leHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1vZC5leHBvcnRzID0gZGVmaW5lZFttb2QubWFwLmlkXSA9IHt9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdtb2R1bGUnOiBmdW5jdGlvbiAobW9kKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kLm1vZHVsZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2QubW9kdWxlOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKG1vZC5tb2R1bGUgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtb2QubWFwLmlkLAogICAgICAgICAgICAgICAgICAgICAgICB1cmk6IG1vZC5tYXAudXJsLAogICAgICAgICAgICAgICAgICAgICAgICBjb25maWc6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRPd24oY29uZmlnLmNvbmZpZywgbW9kLm1hcC5pZCkgfHwge307CiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IG1vZC5leHBvcnRzIHx8IChtb2QuZXhwb3J0cyA9IHt9KQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gY2xlYW5SZWdpc3RyeShpZCkgewogICAgICAgICAgICAvL0NsZWFuIHVwIG1hY2hpbmVyeSB1c2VkIGZvciB3YWl0aW5nIG1vZHVsZXMuCiAgICAgICAgICAgIGRlbGV0ZSByZWdpc3RyeVtpZF07CiAgICAgICAgICAgIGRlbGV0ZSBlbmFibGVkUmVnaXN0cnlbaWRdOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYnJlYWtDeWNsZShtb2QsIHRyYWNlZCwgcHJvY2Vzc2VkKSB7CiAgICAgICAgICAgIHZhciBpZCA9IG1vZC5tYXAuaWQ7CgogICAgICAgICAgICBpZiAobW9kLmVycm9yKSB7CiAgICAgICAgICAgICAgICBtb2QuZW1pdCgnZXJyb3InLCBtb2QuZXJyb3IpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdHJhY2VkW2lkXSA9IHRydWU7CiAgICAgICAgICAgICAgICBlYWNoKG1vZC5kZXBNYXBzLCBmdW5jdGlvbiAoZGVwTWFwLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlcElkID0gZGVwTWFwLmlkLAogICAgICAgICAgICAgICAgICAgICAgICBkZXAgPSBnZXRPd24ocmVnaXN0cnksIGRlcElkKTsKCiAgICAgICAgICAgICAgICAgICAgLy9Pbmx5IGZvcmNlIHRoaW5ncyB0aGF0IGhhdmUgbm90IGNvbXBsZXRlZAogICAgICAgICAgICAgICAgICAgIC8vYmVpbmcgZGVmaW5lZCwgc28gc3RpbGwgaW4gdGhlIHJlZ2lzdHJ5LAogICAgICAgICAgICAgICAgICAgIC8vYW5kIG9ubHkgaWYgaXQgaGFzIG5vdCBiZWVuIG1hdGNoZWQgdXAKICAgICAgICAgICAgICAgICAgICAvL2luIHRoZSBtb2R1bGUgYWxyZWFkeS4KICAgICAgICAgICAgICAgICAgICBpZiAoZGVwICYmICFtb2QuZGVwTWF0Y2hlZFtpXSAmJiAhcHJvY2Vzc2VkW2RlcElkXSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0T3duKHRyYWNlZCwgZGVwSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2QuZGVmaW5lRGVwKGksIGRlZmluZWRbZGVwSWRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZC5jaGVjaygpOyAvL3Bhc3MgZmFsc2U/CiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha0N5Y2xlKGRlcCwgdHJhY2VkLCBwcm9jZXNzZWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBwcm9jZXNzZWRbaWRdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gY2hlY2tMb2FkZWQoKSB7CiAgICAgICAgICAgIHZhciBlcnIsIHVzaW5nUGF0aEZhbGxiYWNrLAogICAgICAgICAgICAgICAgd2FpdEludGVydmFsID0gY29uZmlnLndhaXRTZWNvbmRzICogMTAwMCwKICAgICAgICAgICAgICAgIC8vSXQgaXMgcG9zc2libGUgdG8gZGlzYWJsZSB0aGUgd2FpdCBpbnRlcnZhbCBieSB1c2luZyB3YWl0U2Vjb25kcyBvZiAwLgogICAgICAgICAgICAgICAgZXhwaXJlZCA9IHdhaXRJbnRlcnZhbCAmJiAoY29udGV4dC5zdGFydFRpbWUgKyB3YWl0SW50ZXJ2YWwpIDwgbmV3IERhdGUoKS5nZXRUaW1lKCksCiAgICAgICAgICAgICAgICBub0xvYWRzID0gW10sCiAgICAgICAgICAgICAgICByZXFDYWxscyA9IFtdLAogICAgICAgICAgICAgICAgc3RpbGxMb2FkaW5nID0gZmFsc2UsCiAgICAgICAgICAgICAgICBuZWVkQ3ljbGVDaGVjayA9IHRydWU7CgogICAgICAgICAgICAvL0RvIG5vdCBib3RoZXIgaWYgdGhpcyBjYWxsIHdhcyBhIHJlc3VsdCBvZiBhIGN5Y2xlIGJyZWFrLgogICAgICAgICAgICBpZiAoaW5DaGVja0xvYWRlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpbkNoZWNrTG9hZGVkID0gdHJ1ZTsKCiAgICAgICAgICAgIC8vRmlndXJlIG91dCB0aGUgc3RhdGUgb2YgYWxsIHRoZSBtb2R1bGVzLgogICAgICAgICAgICBlYWNoUHJvcChlbmFibGVkUmVnaXN0cnksIGZ1bmN0aW9uIChtb2QpIHsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSBtb2QubWFwLAogICAgICAgICAgICAgICAgICAgIG1vZElkID0gbWFwLmlkOwoKICAgICAgICAgICAgICAgIC8vU2tpcCB0aGluZ3MgdGhhdCBhcmUgbm90IGVuYWJsZWQgb3IgaW4gZXJyb3Igc3RhdGUuCiAgICAgICAgICAgICAgICBpZiAoIW1vZC5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghbWFwLmlzRGVmaW5lKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxQ2FsbHMucHVzaChtb2QpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIGlmICghbW9kLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGUgbW9kdWxlIHNob3VsZCBiZSBleGVjdXRlZCwgYW5kIGl0IGhhcyBub3QKICAgICAgICAgICAgICAgICAgICAvL2JlZW4gaW5pdGVkIGFuZCB0aW1lIGlzIHVwLCByZW1lbWJlciBpdC4KICAgICAgICAgICAgICAgICAgICBpZiAoIW1vZC5pbml0ZWQgJiYgZXhwaXJlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUGF0aEZhbGxiYWNrKG1vZElkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdQYXRoRmFsbGJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGxMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vTG9hZHMucHVzaChtb2RJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVTY3JpcHQobW9kSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghbW9kLmluaXRlZCAmJiBtb2QuZmV0Y2hlZCAmJiBtYXAuaXNEZWZpbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RpbGxMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtYXAucHJlZml4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL05vIHJlYXNvbiB0byBrZWVwIGxvb2tpbmcgZm9yIHVuZmluaXNoZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vbG9hZGluZy4gSWYgdGhlIG9ubHkgc3RpbGxMb2FkaW5nIGlzIGEKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vcGx1Z2luIHJlc291cmNlIHRob3VnaCwga2VlcCBnb2luZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vYmVjYXVzZSBpdCBtYXkgYmUgdGhhdCBhIHBsdWdpbiByZXNvdXJjZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pcyB3YWl0aW5nIG9uIGEgbm9uLXBsdWdpbiBjeWNsZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAobmVlZEN5Y2xlQ2hlY2sgPSBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgaWYgKGV4cGlyZWQgJiYgbm9Mb2Fkcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8vSWYgd2FpdCB0aW1lIGV4cGlyZWQsIHRocm93IGVycm9yIG9mIHVubG9hZGVkIG1vZHVsZXMuCiAgICAgICAgICAgICAgICBlcnIgPSBtYWtlRXJyb3IoJ3RpbWVvdXQnLCAnTG9hZCB0aW1lb3V0IGZvciBtb2R1bGVzOiAnICsgbm9Mb2FkcywgbnVsbCwgbm9Mb2Fkcyk7CiAgICAgICAgICAgICAgICBlcnIuY29udGV4dE5hbWUgPSBjb250ZXh0LmNvbnRleHROYW1lOwogICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Ob3QgZXhwaXJlZCwgY2hlY2sgZm9yIGEgY3ljbGUuCiAgICAgICAgICAgIGlmIChuZWVkQ3ljbGVDaGVjaykgewogICAgICAgICAgICAgICAgZWFjaChyZXFDYWxscywgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrQ3ljbGUobW9kLCB7fSwge30pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vSWYgc3RpbGwgd2FpdGluZyBvbiBsb2FkcywgYW5kIHRoZSB3YWl0aW5nIGxvYWQgaXMgc29tZXRoaW5nCiAgICAgICAgICAgIC8vb3RoZXIgdGhhbiBhIHBsdWdpbiByZXNvdXJjZSwgb3IgdGhlcmUgYXJlIHN0aWxsIG91dHN0YW5kaW5nCiAgICAgICAgICAgIC8vc2NyaXB0cywgdGhlbiBqdXN0IHRyeSBiYWNrIGxhdGVyLgogICAgICAgICAgICBpZiAoKCFleHBpcmVkIHx8IHVzaW5nUGF0aEZhbGxiYWNrKSAmJiBzdGlsbExvYWRpbmcpIHsKICAgICAgICAgICAgICAgIC8vU29tZXRoaW5nIGlzIHN0aWxsIHdhaXRpbmcgdG8gbG9hZC4gV2FpdCBmb3IgaXQsIGJ1dCBvbmx5CiAgICAgICAgICAgICAgICAvL2lmIGEgdGltZW91dCBpcyBub3QgYWxyZWFkeSBpbiBlZmZlY3QuCiAgICAgICAgICAgICAgICBpZiAoKGlzQnJvd3NlciB8fCBpc1dlYldvcmtlcikgJiYgIWNoZWNrTG9hZGVkVGltZW91dElkKSB7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2FkZWRUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2FkZWRUaW1lb3V0SWQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICAgICAgICAgIH0sIDUwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgaW5DaGVja0xvYWRlZCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgTW9kdWxlID0gZnVuY3Rpb24gKG1hcCkgewogICAgICAgICAgICB0aGlzLmV2ZW50cyA9IGdldE93bih1bmRlZkV2ZW50cywgbWFwLmlkKSB8fCB7fTsKICAgICAgICAgICAgdGhpcy5tYXAgPSBtYXA7CiAgICAgICAgICAgIHRoaXMuc2hpbSA9IGdldE93bihjb25maWcuc2hpbSwgbWFwLmlkKTsKICAgICAgICAgICAgdGhpcy5kZXBFeHBvcnRzID0gW107CiAgICAgICAgICAgIHRoaXMuZGVwTWFwcyA9IFtdOwogICAgICAgICAgICB0aGlzLmRlcE1hdGNoZWQgPSBbXTsKICAgICAgICAgICAgdGhpcy5wbHVnaW5NYXBzID0ge307CiAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgPSAwOwoKICAgICAgICAgICAgLyogdGhpcy5leHBvcnRzIHRoaXMuZmFjdG9yeQogICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMgPSBbXSwKICAgICAgICAgICAgICAgdGhpcy5lbmFibGVkLCB0aGlzLmZldGNoZWQKICAgICAgICAgICAgKi8KICAgICAgICB9OwoKICAgICAgICBNb2R1bGUucHJvdG90eXBlID0gewogICAgICAgICAgICBpbml0OiBmdW5jdGlvbiAoZGVwTWFwcywgZmFjdG9yeSwgZXJyYmFjaywgb3B0aW9ucykgewogICAgICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgICAgICAgICAgICAgLy9EbyBub3QgZG8gbW9yZSBpbml0cyBpZiBhbHJlYWR5IGRvbmUuIENhbiBoYXBwZW4gaWYgdGhlcmUKICAgICAgICAgICAgICAgIC8vYXJlIG11bHRpcGxlIGRlZmluZSBjYWxscyBmb3IgdGhlIHNhbWUgbW9kdWxlLiBUaGF0IGlzIG5vdAogICAgICAgICAgICAgICAgLy9hIG5vcm1hbCwgY29tbW9uIGNhc2UsIGJ1dCBpdCBpcyBhbHNvIG5vdCB1bmV4cGVjdGVkLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuaW5pdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7CgogICAgICAgICAgICAgICAgaWYgKGVycmJhY2spIHsKICAgICAgICAgICAgICAgICAgICAvL1JlZ2lzdGVyIGZvciBlcnJvcnMgb24gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbignZXJyb3InLCBlcnJiYWNrKTsKICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIG5vIGVycmJhY2sgYWxyZWFkeSwgYnV0IHRoZXJlIGFyZSBlcnJvciBsaXN0ZW5lcnMKICAgICAgICAgICAgICAgICAgICAvL29uIHRoaXMgbW9kdWxlLCBzZXQgdXAgYW4gZXJyYmFjayB0byBwYXNzIHRvIHRoZSBkZXBzLgogICAgICAgICAgICAgICAgICAgIGVycmJhY2sgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9EbyBhIGNvcHkgb2YgdGhlIGRlcGVuZGVuY3kgYXJyYXksIHNvIHRoYXQKICAgICAgICAgICAgICAgIC8vc291cmNlIGlucHV0cyBhcmUgbm90IG1vZGlmaWVkLiBGb3IgZXhhbXBsZQogICAgICAgICAgICAgICAgLy8ic2hpbSIgZGVwcyBhcmUgcGFzc2VkIGluIGhlcmUgZGlyZWN0bHksIGFuZAogICAgICAgICAgICAgICAgLy9kb2luZyBhIGRpcmVjdCBtb2RpZmljYXRpb24gb2YgdGhlIGRlcE1hcHMgYXJyYXkKICAgICAgICAgICAgICAgIC8vd291bGQgYWZmZWN0IHRoYXQgY29uZmlnLgogICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzID0gZGVwTWFwcyAmJiBkZXBNYXBzLnNsaWNlKDApOwoKICAgICAgICAgICAgICAgIHRoaXMuZXJyYmFjayA9IGVycmJhY2s7CgogICAgICAgICAgICAgICAgLy9JbmRpY2F0ZSB0aGlzIG1vZHVsZSBoYXMgYmUgaW5pdGlhbGl6ZWQKICAgICAgICAgICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZSA9IG9wdGlvbnMuaWdub3JlOwoKICAgICAgICAgICAgICAgIC8vQ291bGQgaGF2ZSBvcHRpb24gdG8gaW5pdCB0aGlzIG1vZHVsZSBpbiBlbmFibGVkIG1vZGUsCiAgICAgICAgICAgICAgICAvL29yIGNvdWxkIGhhdmUgYmVlbiBwcmV2aW91c2x5IG1hcmtlZCBhcyBlbmFibGVkLiBIb3dldmVyLAogICAgICAgICAgICAgICAgLy90aGUgZGVwZW5kZW5jaWVzIGFyZSBub3Qga25vd24gdW50aWwgaW5pdCBpcyBjYWxsZWQuIFNvCiAgICAgICAgICAgICAgICAvL2lmIGVuYWJsZWQgcHJldmlvdXNseSwgbm93IHRyaWdnZXIgZGVwZW5kZW5jaWVzIGFzIGVuYWJsZWQuCiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5lbmFibGVkIHx8IHRoaXMuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIC8vRW5hYmxlIHRoaXMgbW9kdWxlIGFuZCBkZXBlbmRlbmNpZXMuCiAgICAgICAgICAgICAgICAgICAgLy9XaWxsIGNhbGwgdGhpcy5jaGVjaygpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGUoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZGVmaW5lRGVwOiBmdW5jdGlvbiAoaSwgZGVwRXhwb3J0cykgewogICAgICAgICAgICAgICAgLy9CZWNhdXNlIG9mIGN5Y2xlcywgZGVmaW5lZCBjYWxsYmFjayBmb3IgYSBnaXZlbgogICAgICAgICAgICAgICAgLy9leHBvcnQgY2FuIGJlIGNhbGxlZCBtb3JlIHRoYW4gb25jZS4KICAgICAgICAgICAgICAgIGlmICghdGhpcy5kZXBNYXRjaGVkW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXRjaGVkW2ldID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcENvdW50IC09IDE7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBFeHBvcnRzW2ldID0gZGVwRXhwb3J0czsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGZldGNoOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5mZXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5mZXRjaGVkID0gdHJ1ZTsKCiAgICAgICAgICAgICAgICBjb250ZXh0LnN0YXJ0VGltZSA9IChuZXcgRGF0ZSgpKS5nZXRUaW1lKCk7CgogICAgICAgICAgICAgICAgdmFyIG1hcCA9IHRoaXMubWFwOwoKICAgICAgICAgICAgICAgIC8vSWYgdGhlIG1hbmFnZXIgaXMgZm9yIGEgcGx1Z2luIG1hbmFnZWQgcmVzb3VyY2UsCiAgICAgICAgICAgICAgICAvL2FzayB0aGUgcGx1Z2luIHRvIGxvYWQgaXQgbm93LgogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2hpbSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRleHQubWFrZVJlcXVpcmUodGhpcy5tYXAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgZW5hYmxlQnVpbGRDYWxsYmFjazogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pKHRoaXMuc2hpbS5kZXBzIHx8IFtdLCBiaW5kKHRoaXMsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5wcmVmaXggPyB0aGlzLmNhbGxQbHVnaW4oKSA6IHRoaXMubG9hZCgpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9SZWd1bGFyIGRlcGVuZGVuY3kuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5wcmVmaXggPyB0aGlzLmNhbGxQbHVnaW4oKSA6IHRoaXMubG9hZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHVybCA9IHRoaXMubWFwLnVybDsKCiAgICAgICAgICAgICAgICAvL1JlZ3VsYXIgZGVwZW5kZW5jeS4KICAgICAgICAgICAgICAgIGlmICghdXJsRmV0Y2hlZFt1cmxdKSB7CiAgICAgICAgICAgICAgICAgICAgdXJsRmV0Y2hlZFt1cmxdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxvYWQodGhpcy5tYXAuaWQsIHVybCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBtb2R1bGUgaXMgcmVhZHkgdG8gZGVmaW5lIGl0c2VsZiwgYW5kIGlmIHNvLAogICAgICAgICAgICAgKiBkZWZpbmUgaXQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjaGVjazogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmVuYWJsZWQgfHwgdGhpcy5lbmFibGluZykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICB2YXIgZXJyLCBjanNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgaWQgPSB0aGlzLm1hcC5pZCwKICAgICAgICAgICAgICAgICAgICBkZXBFeHBvcnRzID0gdGhpcy5kZXBFeHBvcnRzLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSB0aGlzLmV4cG9ydHMsCiAgICAgICAgICAgICAgICAgICAgZmFjdG9yeSA9IHRoaXMuZmFjdG9yeTsKCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaW5pdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBmZXRjaCBpZiBub3QgYWxyZWFkeSBpbiB0aGUgZGVmUXVldWUuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGNvbnRleHQuZGVmUXVldWVNYXAsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIHRoaXMuZXJyb3IpOwogICAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5kZWZpbmluZykgewogICAgICAgICAgICAgICAgICAgIC8vVGhlIGZhY3RvcnkgY291bGQgdHJpZ2dlciBhbm90aGVyIHJlcXVpcmUgY2FsbAogICAgICAgICAgICAgICAgICAgIC8vdGhhdCB3b3VsZCByZXN1bHQgaW4gY2hlY2tpbmcgdGhpcyBtb2R1bGUgdG8KICAgICAgICAgICAgICAgICAgICAvL2RlZmluZSBpdHNlbGYgYWdhaW4uIElmIGFscmVhZHkgaW4gdGhlIHByb2Nlc3MKICAgICAgICAgICAgICAgICAgICAvL29mIGRvaW5nIHRoYXQsIHNraXAgdGhpcyB3b3JrLgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5pbmcgPSB0cnVlOwoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXBDb3VudCA8IDEgJiYgIXRoaXMuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihmYWN0b3J5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aGVyZSBpcyBhbiBlcnJvciBsaXN0ZW5lciwgZmF2b3IgcGFzc2luZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy90byB0aGF0IGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXJyb3IuIEhvd2V2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL29ubHkgZG8gaXQgZm9yIGRlZmluZSgpJ2QgIG1vZHVsZXMuIHJlcXVpcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vZXJyYmFja3Mgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIGZhaWx1cmVzIGluCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3RoZWlyIGNhbGxiYWNrcyAoIzY5OSkuIEhvd2V2ZXIgaWYgYSBnbG9iYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vb25FcnJvciBpcyBzZXQsIHVzZSB0aGF0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCh0aGlzLmV2ZW50cy5lcnJvciAmJiB0aGlzLm1hcC5pc0RlZmluZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXEub25FcnJvciAhPT0gZGVmYXVsdE9uRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzID0gY29udGV4dC5leGVjQ2IoaWQsIGZhY3RvcnksIGRlcEV4cG9ydHMsIGV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBjb250ZXh0LmV4ZWNDYihpZCwgZmFjdG9yeSwgZGVwRXhwb3J0cywgZXhwb3J0cyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmF2b3IgcmV0dXJuIHZhbHVlIG92ZXIgZXhwb3J0cy4gSWYgbm9kZS9janMgaW4gcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gd2lsbCBub3QgaGF2ZSBhIHJldHVybiB2YWx1ZSBhbnl3YXkuIEZhdm9yCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtb2R1bGUuZXhwb3J0cyBhc3NpZ25tZW50IG92ZXIgZXhwb3J0cyBvYmplY3QuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAuaXNEZWZpbmUgJiYgZXhwb3J0cyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2pzTW9kdWxlID0gdGhpcy5tb2R1bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNqc01vZHVsZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzID0gY2pzTW9kdWxlLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnVzaW5nRXhwb3J0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL2V4cG9ydHMgYWxyZWFkeSBzZXQgdGhlIGRlZmluZWQgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSB0aGlzLmV4cG9ydHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIucmVxdWlyZU1hcCA9IHRoaXMubWFwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyci5yZXF1aXJlTW9kdWxlcyA9IHRoaXMubWFwLmlzRGVmaW5lID8gW3RoaXMubWFwLmlkXSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVUeXBlID0gdGhpcy5tYXAuaXNEZWZpbmUgPyAnZGVmaW5lJyA6ICdyZXF1aXJlJzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcigodGhpcy5lcnJvciA9IGVycikpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIGxpdGVyYWwgdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cG9ydHMgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmV4cG9ydHMgPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubWFwLmlzRGVmaW5lICYmICF0aGlzLmlnbm9yZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZFtpZF0gPSBleHBvcnRzOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEub25SZXNvdXJjZUxvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVzTG9hZE1hcHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNMb2FkTWFwcy5wdXNoKGRlcE1hcC5ub3JtYWxpemVkTWFwIHx8IGRlcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxLm9uUmVzb3VyY2VMb2FkKGNvbnRleHQsIHRoaXMubWFwLCByZXNMb2FkTWFwcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2xlYW4gdXAKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgLy9GaW5pc2hlZCB0aGUgZGVmaW5lIHN0YWdlLiBBbGxvdyBjYWxsaW5nIGNoZWNrIGFnYWluCiAgICAgICAgICAgICAgICAgICAgLy90byBhbGxvdyBkZWZpbmUgbm90aWZpY2F0aW9ucyBiZWxvdyBpbiB0aGUgY2FzZSBvZiBhCiAgICAgICAgICAgICAgICAgICAgLy9jeWNsZS4KICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluaW5nID0gZmFsc2U7CgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmRlZmluZWQgJiYgIXRoaXMuZGVmaW5lRW1pdHRlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXR0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2RlZmluZWQnLCB0aGlzLmV4cG9ydHMpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZUVtaXRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGNhbGxQbHVnaW46IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLm1hcCwKICAgICAgICAgICAgICAgICAgICBpZCA9IG1hcC5pZCwKICAgICAgICAgICAgICAgICAgICAvL01hcCBhbHJlYWR5IG5vcm1hbGl6ZWQgdGhlIHByZWZpeC4KICAgICAgICAgICAgICAgICAgICBwbHVnaW5NYXAgPSBtYWtlTW9kdWxlTWFwKG1hcC5wcmVmaXgpOwoKICAgICAgICAgICAgICAgIC8vTWFyayB0aGlzIGFzIGEgZGVwZW5kZW5jeSBmb3IgdGhpcyBwbHVnaW4sIHNvIGl0CiAgICAgICAgICAgICAgICAvL2NhbiBiZSB0cmFjZWQgZm9yIGN5Y2xlcy4KICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwcy5wdXNoKHBsdWdpbk1hcCk7CgogICAgICAgICAgICAgICAgb24ocGx1Z2luTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbikgewogICAgICAgICAgICAgICAgICAgIHZhciBsb2FkLCBub3JtYWxpemVkTWFwLCBub3JtYWxpemVkTW9kLAogICAgICAgICAgICAgICAgICAgICAgICBidW5kbGVJZCA9IGdldE93bihidW5kbGVzTWFwLCB0aGlzLm1hcC5pZCksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSB0aGlzLm1hcC5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROYW1lID0gdGhpcy5tYXAucGFyZW50TWFwID8gdGhpcy5tYXAucGFyZW50TWFwLm5hbWUgOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUgPSBjb250ZXh0Lm1ha2VSZXF1aXJlKG1hcC5wYXJlbnRNYXAsIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZUJ1aWxkQ2FsbGJhY2s6IHRydWUKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgICAgIC8vSWYgY3VycmVudCBtYXAgaXMgbm90IG5vcm1hbGl6ZWQsIHdhaXQgZm9yIHRoYXQKICAgICAgICAgICAgICAgICAgICAvL25vcm1hbGl6ZWQgbmFtZSB0byBsb2FkIGluc3RlYWQgb2YgY29udGludWluZy4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5tYXAudW5ub3JtYWxpemVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIHRoZSBJRCBpZiB0aGUgcGx1Z2luIGFsbG93cyBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBsdWdpbi5ub3JtYWxpemUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBwbHVnaW4ubm9ybWFsaXplKG5hbWUsIGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vcm1hbGl6ZShuYW1lLCBwYXJlbnROYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pIHx8ICcnOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL3ByZWZpeCBhbmQgbmFtZSBzaG91bGQgYWxyZWFkeSBiZSBub3JtYWxpemVkLCBubyBuZWVkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vZm9yIGFwcGx5aW5nIG1hcCBjb25maWcgYWdhaW4gZWl0aGVyLgogICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTWFwID0gbWFrZU1vZHVsZU1hcChtYXAucHJlZml4ICsgJyEnICsgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXAucGFyZW50TWFwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgb24obm9ybWFsaXplZE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkZWZpbmVkJywgYmluZCh0aGlzLCBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcC5ub3JtYWxpemVkTWFwID0gbm9ybWFsaXplZE1hcDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlnbm9yZTogdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZE1vZCA9IGdldE93bihyZWdpc3RyeSwgbm9ybWFsaXplZE1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkTW9kKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL01hcmsgdGhpcyBhcyBhIGRlcGVuZGVuY3kgZm9yIHRoaXMgcGx1Z2luLCBzbyBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9jYW4gYmUgdHJhY2VkIGZvciBjeWNsZXMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlcE1hcHMucHVzaChub3JtYWxpemVkTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5ldmVudHMuZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLm9uKCdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXQoJ2Vycm9yJywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkTW9kLmVuYWJsZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0lmIGEgcGF0aHMgY29uZmlnLCB0aGVuIGp1c3QgbG9hZCB0aGF0IGZpbGUgaW5zdGVhZCB0bwogICAgICAgICAgICAgICAgICAgIC8vcmVzb2x2ZSB0aGUgcGx1Z2luLCBhcyBpdCBpcyBidWlsdCBpbnRvIHRoYXQgcGF0aHMgbGF5ZXIuCiAgICAgICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWFwLnVybCA9IGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGxvYWQgPSBiaW5kKHRoaXMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluaXQoW10sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHZhbHVlOyB9LCBudWxsLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICBsb2FkLmVycm9yID0gYmluZCh0aGlzLCBmdW5jdGlvbiAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaW5pdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyLnJlcXVpcmVNb2R1bGVzID0gW2lkXTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vUmVtb3ZlIHRlbXAgdW5ub3JtYWxpemVkIG1vZHVsZXMgZm9yIHRoaXMgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NpbmNlIHRoZXkgd2lsbCBuZXZlciBiZSByZXNvbHZlZCBvdGhlcndpc2Ugbm93LgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5tYXAuaWQuaW5kZXhPZihpZCArICdfdW5ub3JtYWxpemVkJykgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhblJlZ2lzdHJ5KG1vZC5tYXAuaWQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgICAgIG9uRXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9BbGxvdyBwbHVnaW5zIHRvIGxvYWQgb3RoZXIgY29kZSB3aXRob3V0IGhhdmluZyB0byBrbm93IHRoZQogICAgICAgICAgICAgICAgICAgIC8vY29udGV4dCBvciBob3cgdG8gJ2NvbXBsZXRlJyB0aGUgbG9hZC4KICAgICAgICAgICAgICAgICAgICBsb2FkLmZyb21UZXh0ID0gYmluZCh0aGlzLCBmdW5jdGlvbiAodGV4dCwgdGV4dEFsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtb2R1bGVOYW1lID0gbWFwLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVNYXAgPSBtYWtlTW9kdWxlTWFwKG1vZHVsZU5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzSW50ZXJhY3RpdmUgPSB1c2VJbnRlcmFjdGl2ZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vQXMgb2YgMi4xLjAsIHN1cHBvcnQganVzdCBwYXNzaW5nIHRoZSB0ZXh0LCB0byByZWluZm9yY2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9mcm9tVGV4dCBvbmx5IGJlaW5nIGNhbGxlZCBvbmNlIHBlciByZXNvdXJjZS4gU3RpbGwKICAgICAgICAgICAgICAgICAgICAgICAgLy9zdXBwb3J0IG9sZCBzdHlsZSBvZiBwYXNzaW5nIG1vZHVsZU5hbWUgYnV0IGRpc2NhcmQKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGF0IG1vZHVsZU5hbWUgaW4gZmF2b3Igb2YgdGhlIGludGVybmFsIHJlZi4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRBbHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0QWx0OwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1R1cm4gb2ZmIGludGVyYWN0aXZlIHNjcmlwdCBtYXRjaGluZyBmb3IgSUUgZm9yIGFueSBkZWZpbmUKICAgICAgICAgICAgICAgICAgICAgICAgLy9jYWxscyBpbiB0aGUgdGV4dCwgdGhlbiB0dXJuIGl0IGJhY2sgb24gYXQgdGhlIGVuZC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0ludGVyYWN0aXZlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VJbnRlcmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAvL1ByaW1lIHRoZSBzeXN0ZW0gYnkgY3JlYXRpbmcgYSBtb2R1bGUgaW5zdGFuY2UgZm9yCiAgICAgICAgICAgICAgICAgICAgICAgIC8vaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGdldE1vZHVsZShtb2R1bGVNYXApOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9UcmFuc2ZlciBhbnkgY29uZmlnIHRvIHRoaXMgb3RoZXIgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzUHJvcChjb25maWcuY29uZmlnLCBpZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jb25maWdbbW9kdWxlTmFtZV0gPSBjb25maWcuY29uZmlnW2lkXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcS5leGVjKHRleHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ2Zyb210ZXh0ZXZhbCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tVGV4dCBldmFsIGZvciAnICsgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZmFpbGVkOiAnICsgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2lkXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUludGVyYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9NYXJrIHRoaXMgYXMgYSBkZXBlbmRlbmN5IGZvciB0aGUgcGx1Z2luCiAgICAgICAgICAgICAgICAgICAgICAgIC8vcmVzb3VyY2UKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBNYXBzLnB1c2gobW9kdWxlTWFwKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3VwcG9ydCBhbm9ueW1vdXMgbW9kdWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQobW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgdGhlIHZhbHVlIG9mIHRoYXQgbW9kdWxlIHRvIHRoZSB2YWx1ZSBmb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICAvL3Jlc291cmNlIElELgogICAgICAgICAgICAgICAgICAgICAgICBsb2NhbFJlcXVpcmUoW21vZHVsZU5hbWVdLCBsb2FkKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgLy9Vc2UgcGFyZW50TmFtZSBoZXJlIHNpbmNlIHRoZSBwbHVnaW4ncyBuYW1lIGlzIG5vdCByZWxpYWJsZSwKICAgICAgICAgICAgICAgICAgICAvL2NvdWxkIGJlIHNvbWUgd2VpcmQgc3RyaW5nIHdpdGggbm8gcGF0aCB0aGF0IGFjdHVhbGx5IHdhbnRzIHRvCiAgICAgICAgICAgICAgICAgICAgLy9yZWZlcmVuY2UgdGhlIHBhcmVudE5hbWUncyBwYXRoLgogICAgICAgICAgICAgICAgICAgIHBsdWdpbi5sb2FkKG1hcC5uYW1lLCBsb2NhbFJlcXVpcmUsIGxvYWQsIGNvbmZpZyk7CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luTWFwc1twbHVnaW5NYXAuaWRdID0gcGx1Z2luTWFwOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgZW5hYmxlOiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBlbmFibGVkUmVnaXN0cnlbdGhpcy5tYXAuaWRdID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMuZW5hYmxlZCA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9TZXQgZmxhZyBtZW50aW9uaW5nIHRoYXQgdGhlIG1vZHVsZSBpcyBlbmFibGluZywKICAgICAgICAgICAgICAgIC8vc28gdGhhdCBpbW1lZGlhdGUgY2FsbHMgdG8gdGhlIGRlZmluZWQgY2FsbGJhY2tzCiAgICAgICAgICAgICAgICAvL2ZvciBkZXBlbmRlbmNpZXMgZG8gbm90IHRyaWdnZXIgaW5hZHZlcnRlbnQgbG9hZAogICAgICAgICAgICAgICAgLy93aXRoIHRoZSBkZXBDb3VudCBzdGlsbCBiZWluZyB6ZXJvLgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IHRydWU7CgogICAgICAgICAgICAgICAgLy9FbmFibGUgZWFjaCBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoKHRoaXMuZGVwTWFwcywgYmluZCh0aGlzLCBmdW5jdGlvbiAoZGVwTWFwLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlkLCBtb2QsIGhhbmRsZXI7CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwTWFwID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAvL0RlcGVuZGVuY3kgbmVlZHMgdG8gYmUgY29udmVydGVkIHRvIGEgZGVwTWFwCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYW5kIHdpcmVkIHVwIHRvIHRoaXMgbW9kdWxlLgogICAgICAgICAgICAgICAgICAgICAgICBkZXBNYXAgPSBtYWtlTW9kdWxlTWFwKGRlcE1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5tYXAuaXNEZWZpbmUgPyB0aGlzLm1hcCA6IHRoaXMubWFwLnBhcmVudE1hcCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2tpcE1hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVwTWFwc1tpXSA9IGRlcE1hcDsKCiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRPd24oaGFuZGxlcnMsIGRlcE1hcC5pZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBFeHBvcnRzW2ldID0gaGFuZGxlcih0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXBDb3VudCArPSAxOwoKICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZGVmaW5lZCcsIGJpbmQodGhpcywgZnVuY3Rpb24gKGRlcEV4cG9ydHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnVuZGVmZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlZmluZURlcChpLCBkZXBFeHBvcnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZXJyYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb24oZGVwTWFwLCAnZXJyb3InLCBiaW5kKHRoaXMsIHRoaXMuZXJyYmFjaykpOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZXZlbnRzLmVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBkaXJlY3QgZXJyYmFjayBvbiB0aGlzIG1vZHVsZSwgYnV0IHNvbWV0aGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWxzZSBpcyBsaXN0ZW5pbmcgZm9yIGVycm9ycywgc28gYmUgc3VyZSB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvcGFnYXRlIHRoZSBlcnJvciBjb3JyZWN0bHkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbihkZXBNYXAsICdlcnJvcicsIGJpbmQodGhpcywgZnVuY3Rpb24oZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0KCdlcnJvcicsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlkID0gZGVwTWFwLmlkOwogICAgICAgICAgICAgICAgICAgIG1vZCA9IHJlZ2lzdHJ5W2lkXTsKCiAgICAgICAgICAgICAgICAgICAgLy9Ta2lwIHNwZWNpYWwgbW9kdWxlcyBsaWtlICdyZXF1aXJlJywgJ2V4cG9ydHMnLCAnbW9kdWxlJwogICAgICAgICAgICAgICAgICAgIC8vQWxzbywgZG9uJ3QgY2FsbCBlbmFibGUgaWYgaXQgaXMgYWxyZWFkeSBlbmFibGVkLAogICAgICAgICAgICAgICAgICAgIC8vaW1wb3J0YW50IGluIGNpcmN1bGFyIGRlcGVuZGVuY3kgY2FzZXMuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGhhbmRsZXJzLCBpZCkgJiYgbW9kICYmICFtb2QuZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVuYWJsZShkZXBNYXAsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKCiAgICAgICAgICAgICAgICAvL0VuYWJsZSBlYWNoIHBsdWdpbiB0aGF0IGlzIHVzZWQgaW4KICAgICAgICAgICAgICAgIC8vYSBkZXBlbmRlbmN5CiAgICAgICAgICAgICAgICBlYWNoUHJvcCh0aGlzLnBsdWdpbk1hcHMsIGJpbmQodGhpcywgZnVuY3Rpb24gKHBsdWdpbk1hcCkgewogICAgICAgICAgICAgICAgICAgIHZhciBtb2QgPSBnZXRPd24ocmVnaXN0cnksIHBsdWdpbk1hcC5pZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCAmJiAhbW9kLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lbmFibGUocGx1Z2luTWFwLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CgogICAgICAgICAgICAgICAgdGhpcy5lbmFibGluZyA9IGZhbHNlOwoKICAgICAgICAgICAgICAgIHRoaXMuY2hlY2soKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG9uOiBmdW5jdGlvbiAobmFtZSwgY2IpIHsKICAgICAgICAgICAgICAgIHZhciBjYnMgPSB0aGlzLmV2ZW50c1tuYW1lXTsKICAgICAgICAgICAgICAgIGlmICghY2JzKSB7CiAgICAgICAgICAgICAgICAgICAgY2JzID0gdGhpcy5ldmVudHNbbmFtZV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNicy5wdXNoKGNiKTsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIGVtaXQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHsKICAgICAgICAgICAgICAgIGVhY2godGhpcy5ldmVudHNbbmFtZV0sIGZ1bmN0aW9uIChjYikgewogICAgICAgICAgICAgICAgICAgIGNiKGV2dCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChuYW1lID09PSAnZXJyb3InKSB7CiAgICAgICAgICAgICAgICAgICAgLy9Ob3cgdGhhdCB0aGUgZXJyb3IgaGFuZGxlciB3YXMgdHJpZ2dlcmVkLCByZW1vdmUKICAgICAgICAgICAgICAgICAgICAvL3RoZSBsaXN0ZW5lcnMsIHNpbmNlIHRoaXMgYnJva2VuIE1vZHVsZSBpbnN0YW5jZQogICAgICAgICAgICAgICAgICAgIC8vY2FuIHN0YXkgYXJvdW5kIGZvciBhIHdoaWxlIGluIHRoZSByZWdpc3RyeS4KICAgICAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5ldmVudHNbbmFtZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBjYWxsR2V0TW9kdWxlKGFyZ3MpIHsKICAgICAgICAgICAgLy9Ta2lwIG1vZHVsZXMgYWxyZWFkeSBkZWZpbmVkLgogICAgICAgICAgICBpZiAoIWhhc1Byb3AoZGVmaW5lZCwgYXJnc1swXSkpIHsKICAgICAgICAgICAgICAgIGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKGFyZ3NbMF0sIG51bGwsIHRydWUpKS5pbml0KGFyZ3NbMV0sIGFyZ3NbMl0pOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByZW1vdmVMaXN0ZW5lcihub2RlLCBmdW5jLCBuYW1lLCBpZU5hbWUpIHsKICAgICAgICAgICAgLy9GYXZvciBkZXRhY2hFdmVudCBiZWNhdXNlIG9mIElFOQogICAgICAgICAgICAvL2lzc3VlLCBzZWUgYXR0YWNoRXZlbnQvYWRkRXZlbnRMaXN0ZW5lciBjb21tZW50IGVsc2V3aGVyZQogICAgICAgICAgICAvL2luIHRoaXMgZmlsZS4KICAgICAgICAgICAgaWYgKG5vZGUuZGV0YWNoRXZlbnQgJiYgIWlzT3BlcmEpIHsKICAgICAgICAgICAgICAgIC8vUHJvYmFibHkgSUUuIElmIG5vdCBpdCB3aWxsIHRocm93IGFuIGVycm9yLCB3aGljaCB3aWxsIGJlCiAgICAgICAgICAgICAgICAvL3VzZWZ1bCB0byBrbm93LgogICAgICAgICAgICAgICAgaWYgKGllTmFtZSkgewogICAgICAgICAgICAgICAgICAgIG5vZGUuZGV0YWNoRXZlbnQoaWVOYW1lLCBmdW5jKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihuYW1lLCBmdW5jLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGFuIGV2ZW50IGZyb20gYSBzY3JpcHQgbm9kZSwgZ2V0IHRoZSByZXF1aXJlanMgaW5mbyBmcm9tIGl0LAogICAgICAgICAqIGFuZCB0aGVuIHJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVycyBvbiB0aGUgbm9kZS4KICAgICAgICAgKiBAcGFyYW0ge0V2ZW50fSBldnQKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldFNjcmlwdERhdGEoZXZ0KSB7CiAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgLy9hbGwgb2xkIGJyb3dzZXJzIHdpbGwgYmUgc3VwcG9ydGVkLCBidXQgdGhpcyBvbmUgd2FzIGVhc3kgZW5vdWdoCiAgICAgICAgICAgIC8vdG8gc3VwcG9ydCBhbmQgc3RpbGwgbWFrZXMgc2Vuc2UuCiAgICAgICAgICAgIHZhciBub2RlID0gZXZ0LmN1cnJlbnRUYXJnZXQgfHwgZXZ0LnNyY0VsZW1lbnQ7CgogICAgICAgICAgICAvL1JlbW92ZSB0aGUgbGlzdGVuZXJzIG9uY2UgaGVyZS4KICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXIobm9kZSwgY29udGV4dC5vblNjcmlwdExvYWQsICdsb2FkJywgJ29ucmVhZHlzdGF0ZWNoYW5nZScpOwogICAgICAgICAgICByZW1vdmVMaXN0ZW5lcihub2RlLCBjb250ZXh0Lm9uU2NyaXB0RXJyb3IsICdlcnJvcicpOwoKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5vZGU6IG5vZGUsCiAgICAgICAgICAgICAgICBpZDogbm9kZSAmJiBub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlbW9kdWxlJykKICAgICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGludGFrZURlZmluZXMoKSB7CiAgICAgICAgICAgIHZhciBhcmdzOwoKICAgICAgICAgICAgLy9BbnkgZGVmaW5lZCBtb2R1bGVzIGluIHRoZSBnbG9iYWwgcXVldWUsIGludGFrZSB0aGVtIG5vdy4KICAgICAgICAgICAgdGFrZUdsb2JhbFF1ZXVlKCk7CgogICAgICAgICAgICAvL01ha2Ugc3VyZSBhbnkgcmVtYWluaW5nIGRlZlF1ZXVlIGl0ZW1zIGdldCBwcm9wZXJseSBwcm9jZXNzZWQuCiAgICAgICAgICAgIHdoaWxlIChkZWZRdWV1ZS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGFyZ3MgPSBkZWZRdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb25FcnJvcihtYWtlRXJyb3IoJ21pc21hdGNoJywgJ01pc21hdGNoZWQgYW5vbnltb3VzIGRlZmluZSgpIG1vZHVsZTogJyArCiAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3NbYXJncy5sZW5ndGggLSAxXSkpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvL2FyZ3MgYXJlIGlkLCBkZXBzLCBmYWN0b3J5LiBTaG91bGQgYmUgbm9ybWFsaXplZCBieSB0aGUKICAgICAgICAgICAgICAgICAgICAvL2RlZmluZSgpIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZU1hcCA9IHt9OwogICAgICAgIH0KCiAgICAgICAgY29udGV4dCA9IHsKICAgICAgICAgICAgY29uZmlnOiBjb25maWcsCiAgICAgICAgICAgIGNvbnRleHROYW1lOiBjb250ZXh0TmFtZSwKICAgICAgICAgICAgcmVnaXN0cnk6IHJlZ2lzdHJ5LAogICAgICAgICAgICBkZWZpbmVkOiBkZWZpbmVkLAogICAgICAgICAgICB1cmxGZXRjaGVkOiB1cmxGZXRjaGVkLAogICAgICAgICAgICBkZWZRdWV1ZTogZGVmUXVldWUsCiAgICAgICAgICAgIGRlZlF1ZXVlTWFwOiB7fSwKICAgICAgICAgICAgTW9kdWxlOiBNb2R1bGUsCiAgICAgICAgICAgIG1ha2VNb2R1bGVNYXA6IG1ha2VNb2R1bGVNYXAsCiAgICAgICAgICAgIG5leHRUaWNrOiByZXEubmV4dFRpY2ssCiAgICAgICAgICAgIG9uRXJyb3I6IG9uRXJyb3IsCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2V0IGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjZmcgY29uZmlnIG9iamVjdCB0byBpbnRlZ3JhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25maWd1cmU6IGZ1bmN0aW9uIChjZmcpIHsKICAgICAgICAgICAgICAgIC8vTWFrZSBzdXJlIHRoZSBiYXNlVXJsIGVuZHMgaW4gYSBzbGFzaC4KICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjZmcuYmFzZVVybC5jaGFyQXQoY2ZnLmJhc2VVcmwubGVuZ3RoIC0gMSkgIT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICBjZmcuYmFzZVVybCArPSAnLyc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgb2xkIHN0eWxlIHVybEFyZ3Mgc3RyaW5nIHRvIGEgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGNmZy51cmxBcmdzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIHZhciB1cmxBcmdzID0gY2ZnLnVybEFyZ3M7CiAgICAgICAgICAgICAgICAgICAgY2ZnLnVybEFyZ3MgPSBmdW5jdGlvbihpZCwgdXJsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodXJsLmluZGV4T2YoJz8nKSA9PT0gLTEgPyAnPycgOiAnJicpICsgdXJsQXJnczsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vU2F2ZSBvZmYgdGhlIHBhdGhzIHNpbmNlIHRoZXkgcmVxdWlyZSBzcGVjaWFsIHByb2Nlc3NpbmcsCiAgICAgICAgICAgICAgICAvL3RoZXkgYXJlIGFkZGl0aXZlLgogICAgICAgICAgICAgICAgdmFyIHNoaW0gPSBjb25maWcuc2hpbSwKICAgICAgICAgICAgICAgICAgICBvYmpzID0gewogICAgICAgICAgICAgICAgICAgICAgICBwYXRoczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlczogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBtYXA6IHRydWUKICAgICAgICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZywgZnVuY3Rpb24gKHZhbHVlLCBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9ianNbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjb25maWdbcHJvcF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHt9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG1peGluKGNvbmZpZ1twcm9wXSwgdmFsdWUsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ1twcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgIC8vUmV2ZXJzZSBtYXAgdGhlIGJ1bmRsZXMKICAgICAgICAgICAgICAgIGlmIChjZmcuYnVuZGxlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2hQcm9wKGNmZy5idW5kbGVzLCBmdW5jdGlvbiAodmFsdWUsIHByb3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWFjaCh2YWx1ZSwgZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2ICE9PSBwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlc01hcFt2XSA9IHByb3A7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vTWVyZ2Ugc2hpbQogICAgICAgICAgICAgICAgaWYgKGNmZy5zaGltKSB7CiAgICAgICAgICAgICAgICAgICAgZWFjaFByb3AoY2ZnLnNoaW0sIGZ1bmN0aW9uICh2YWx1ZSwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9Ob3JtYWxpemUgdGhlIHN0cnVjdHVyZQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodmFsdWUuZXhwb3J0cyB8fCB2YWx1ZS5pbml0KSAmJiAhdmFsdWUuZXhwb3J0c0ZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS5leHBvcnRzRm4gPSBjb250ZXh0Lm1ha2VTaGltRXhwb3J0cyh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2hpbVtpZF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBjb25maWcuc2hpbSA9IHNoaW07CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgLy9BZGp1c3QgcGFja2FnZXMgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgICAgICAgaWYgKGNmZy5wYWNrYWdlcykgewogICAgICAgICAgICAgICAgICAgIGVhY2goY2ZnLnBhY2thZ2VzLCBmdW5jdGlvbiAocGtnT2JqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2NhdGlvbiwgbmFtZTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHBrZ09iaiA9IHR5cGVvZiBwa2dPYmogPT09ICdzdHJpbmcnID8ge25hbWU6IHBrZ09ian0gOiBwa2dPYmo7CgogICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gcGtnT2JqLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uID0gcGtnT2JqLmxvY2F0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5wYXRoc1tuYW1lXSA9IHBrZ09iai5sb2NhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TYXZlIHBvaW50ZXIgdG8gbWFpbiBtb2R1bGUgSUQgZm9yIHBrZyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAvL1JlbW92ZSBsZWFkaW5nIGRvdCBpbiBtYWluLCBzbyBtYWluIHBhdGhzIGFyZSBub3JtYWxpemVkLAogICAgICAgICAgICAgICAgICAgICAgICAvL2FuZCByZW1vdmUgYW55IHRyYWlsaW5nIC5qcywgc2luY2UgZGlmZmVyZW50IHBhY2thZ2UKICAgICAgICAgICAgICAgICAgICAgICAgLy9lbnZzIGhhdmUgZGlmZmVyZW50IGNvbnZlbnRpb25zOiBzb21lIHVzZSBhIG1vZHVsZSBuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAvL3NvbWUgdXNlIGEgZmlsZSBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICBjb25maWcucGtnc1tuYW1lXSA9IHBrZ09iai5uYW1lICsgJy8nICsgKHBrZ09iai5tYWluIHx8ICdtYWluJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKGN1cnJEaXJSZWdFeHAsICcnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL0lmIHRoZXJlIGFyZSBhbnkgIndhaXRpbmcgdG8gZXhlY3V0ZSIgbW9kdWxlcyBpbiB0aGUgcmVnaXN0cnksCiAgICAgICAgICAgICAgICAvL3VwZGF0ZSB0aGUgbWFwcyBmb3IgdGhlbSwgc2luY2UgdGhlaXIgaW5mbywgbGlrZSBVUkxzIHRvIGxvYWQsCiAgICAgICAgICAgICAgICAvL21heSBoYXZlIGNoYW5nZWQuCiAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24gKG1vZCwgaWQpIHsKICAgICAgICAgICAgICAgICAgICAvL0lmIG1vZHVsZSBhbHJlYWR5IGhhcyBpbml0IGNhbGxlZCwgc2luY2UgaXQgaXMgdG9vCiAgICAgICAgICAgICAgICAgICAgLy9sYXRlIHRvIG1vZGlmeSB0aGVtLCBhbmQgaWdub3JlIHVubm9ybWFsaXplZCBvbmVzCiAgICAgICAgICAgICAgICAgICAgLy9zaW5jZSB0aGV5IGFyZSB0cmFuc2llbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFtb2QuaW5pdGVkICYmICFtb2QubWFwLnVubm9ybWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgICAgICBtb2QubWFwID0gbWFrZU1vZHVsZU1hcChpZCwgbnVsbCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9JZiBhIGRlcHMgYXJyYXkgb3IgYSBjb25maWcgY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB0aGVuIGNhbGwKICAgICAgICAgICAgICAgIC8vcmVxdWlyZSB3aXRoIHRob3NlIGFyZ3MuIFRoaXMgaXMgdXNlZnVsIHdoZW4gcmVxdWlyZSBpcyBkZWZpbmVkIGFzIGEKICAgICAgICAgICAgICAgIC8vY29uZmlnIG9iamVjdCBiZWZvcmUgcmVxdWlyZS5qcyBpcyBsb2FkZWQuCiAgICAgICAgICAgICAgICBpZiAoY2ZnLmRlcHMgfHwgY2ZnLmNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5yZXF1aXJlKGNmZy5kZXBzIHx8IFtdLCBjZmcuY2FsbGJhY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAoKICAgICAgICAgICAgbWFrZVNoaW1FeHBvcnRzOiBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZuKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmluaXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gdmFsdWUuaW5pdC5hcHBseShnbG9iYWwsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQgfHwgKHZhbHVlLmV4cG9ydHMgJiYgZ2V0R2xvYmFsKHZhbHVlLmV4cG9ydHMpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmbjsKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIG1ha2VSZXF1aXJlOiBmdW5jdGlvbiAocmVsTWFwLCBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTsKCiAgICAgICAgICAgICAgICBmdW5jdGlvbiBsb2NhbFJlcXVpcmUoZGVwcywgY2FsbGJhY2ssIGVycmJhY2spIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaWQsIG1hcCwgcmVxdWlyZU1vZDsKCiAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuZW5hYmxlQnVpbGRDYWxsYmFjayAmJiBjYWxsYmFjayAmJiBpc0Z1bmN0aW9uKGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5fX3JlcXVpcmVKc0J1aWxkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVwcyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24oY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0ludmFsaWQgY2FsbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdyZXF1aXJlYXJncycsICdJbnZhbGlkIHJlcXVpcmUgY2FsbCcpLCBlcnJiYWNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiByZXF1aXJlfGV4cG9ydHN8bW9kdWxlIGFyZSByZXF1ZXN0ZWQsIGdldCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy92YWx1ZSBmb3IgdGhlbSBmcm9tIHRoZSBzcGVjaWFsIGhhbmRsZXJzLiBDYXZlYXQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vdGhpcyBvbmx5IHdvcmtzIHdoaWxlIG1vZHVsZSBpcyBiZWluZyBkZWZpbmVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVsTWFwICYmIGhhc1Byb3AoaGFuZGxlcnMsIGRlcHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlcnNbZGVwc10ocmVnaXN0cnlbcmVsTWFwLmlkXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vU3luY2hyb25vdXMgYWNjZXNzIHRvIG9uZSBtb2R1bGUuIElmIHJlcXVpcmUuZ2V0IGlzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vYXZhaWxhYmxlIChhcyBpbiB0aGUgTm9kZSBhZGFwdGVyKSwgcHJlZmVyIHRoYXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXEuZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVxLmdldChjb250ZXh0LCBkZXBzLCByZWxNYXAsIGxvY2FsUmVxdWlyZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIC8vTm9ybWFsaXplIG1vZHVsZSBuYW1lLCBpZiBpdCBjb250YWlucyAuIG9yIC4uCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcCA9IG1ha2VNb2R1bGVNYXAoZGVwcywgcmVsTWFwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFwLmlkOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNQcm9wKGRlZmluZWQsIGlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub3Rsb2FkZWQnLCAnTW9kdWxlIG5hbWUgIicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyIgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQgZm9yIGNvbnRleHQ6ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dE5hbWUgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbE1hcCA/ICcnIDogJy4gVXNlIHJlcXVpcmUoW10pJykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAvL0dyYWIgZGVmaW5lcyB3YWl0aW5nIGluIHRoZSBnbG9iYWwgcXVldWUuCiAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAvL01hcmsgYWxsIHRoZSBkZXBlbmRlbmNpZXMgYXMgbmVlZGluZyB0byBiZSBsb2FkZWQuCiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5uZXh0VGljayhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vU29tZSBkZWZpbmVzIGNvdWxkIGhhdmUgYmVlbiBhZGRlZCBzaW5jZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9yZXF1aXJlIGNhbGwsIGNvbGxlY3QgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICAgaW50YWtlRGVmaW5lcygpOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZCA9IGdldE1vZHVsZShtYWtlTW9kdWxlTWFwKG51bGwsIHJlbE1hcCkpOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9TdG9yZSBpZiBtYXAgY29uZmlnIHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgcmVxdWlyZQogICAgICAgICAgICAgICAgICAgICAgICAvL2NhbGwgZm9yIGRlcGVuZGVuY2llcy4KICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5za2lwTWFwID0gb3B0aW9ucy5za2lwTWFwOwoKICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZU1vZC5pbml0KGRlcHMsIGNhbGxiYWNrLCBlcnJiYWNrLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwoKICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tMb2FkZWQoKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsUmVxdWlyZTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBtaXhpbihsb2NhbFJlcXVpcmUsIHsKICAgICAgICAgICAgICAgICAgICBpc0Jyb3dzZXI6IGlzQnJvd3NlciwKCiAgICAgICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgICAgICogQ29udmVydHMgYSBtb2R1bGUgbmFtZSArIC5leHRlbnNpb24gaW50byBhbiBVUkwgcGF0aC4KICAgICAgICAgICAgICAgICAgICAgKiAqUmVxdWlyZXMqIHRoZSB1c2Ugb2YgYSBtb2R1bGUgbmFtZS4gSXQgZG9lcyBub3Qgc3VwcG9ydCB1c2luZwogICAgICAgICAgICAgICAgICAgICAqIHBsYWluIFVSTHMgbGlrZSBuYW1lVG9VcmwuCiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdG9Vcmw6IGZ1bmN0aW9uIChtb2R1bGVOYW1lUGx1c0V4dCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtb2R1bGVOYW1lUGx1c0V4dC5sYXN0SW5kZXhPZignLicpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VnbWVudCA9IG1vZHVsZU5hbWVQbHVzRXh0LnNwbGl0KCcvJylbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlbGF0aXZlID0gc2VnbWVudCA9PT0gJy4nIHx8IHNlZ21lbnQgPT09ICcuLic7CgogICAgICAgICAgICAgICAgICAgICAgICAvL0hhdmUgYSBmaWxlIGV4dGVuc2lvbiBhbGlhcywgYW5kIGl0IGlzIG5vdCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy9kb3RzIGZyb20gYSByZWxhdGl2ZSBwYXRoLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xICYmICghaXNSZWxhdGl2ZSB8fCBpbmRleCA+IDEpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHQgPSBtb2R1bGVOYW1lUGx1c0V4dC5zdWJzdHJpbmcoaW5kZXgsIG1vZHVsZU5hbWVQbHVzRXh0Lmxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVOYW1lUGx1c0V4dCA9IG1vZHVsZU5hbWVQbHVzRXh0LnN1YnN0cmluZygwLCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0Lm5hbWVUb1VybChub3JtYWxpemUobW9kdWxlTmFtZVBsdXNFeHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbE1hcCAmJiByZWxNYXAuaWQsIHRydWUpLCBleHQsICB0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9LAoKICAgICAgICAgICAgICAgICAgICBkZWZpbmVkOiBmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhhc1Byb3AoZGVmaW5lZCwgbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQpOwogICAgICAgICAgICAgICAgICAgIH0sCgogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZDogZnVuY3Rpb24gKGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlkID0gbWFrZU1vZHVsZU1hcChpZCwgcmVsTWFwLCBmYWxzZSwgdHJ1ZSkuaWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNQcm9wKGRlZmluZWQsIGlkKSB8fCBoYXNQcm9wKHJlZ2lzdHJ5LCBpZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICAgICAgLy9Pbmx5IGFsbG93IHVuZGVmIG9uIHRvcCBsZXZlbCByZXF1aXJlIGNhbGxzCiAgICAgICAgICAgICAgICBpZiAoIXJlbE1hcCkgewogICAgICAgICAgICAgICAgICAgIGxvY2FsUmVxdWlyZS51bmRlZiA9IGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0JpbmQgYW55IHdhaXRpbmcgZGVmaW5lKCkgY2FsbHMgdG8gdGhpcyBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAvL2ZpeCBmb3IgIzQwOAogICAgICAgICAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSBtYWtlTW9kdWxlTWFwKGlkLCByZWxNYXAsIHRydWUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kID0gZ2V0T3duKHJlZ2lzdHJ5LCBpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBtb2QudW5kZWZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVNjcmlwdChpZCk7CgogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGVmaW5lZFtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB1cmxGZXRjaGVkW21hcC51cmxdOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgdW5kZWZFdmVudHNbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgLy9DbGVhbiBxdWV1ZWQgZGVmaW5lcyB0b28uIEdvIGJhY2t3YXJkcwogICAgICAgICAgICAgICAgICAgICAgICAvL2luIGFycmF5IHNvIHRoYXQgdGhlIHNwbGljZXMgZG8gbm90CiAgICAgICAgICAgICAgICAgICAgICAgIC8vbWVzcyB1cCB0aGUgaXRlcmF0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBlYWNoUmV2ZXJzZShkZWZRdWV1ZSwgZnVuY3Rpb24oYXJncywgaSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IGlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmUXVldWUuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGNvbnRleHQuZGVmUXVldWVNYXBbaWRdOwoKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9Ib2xkIG9uIHRvIGxpc3RlbmVycyBpbiBjYXNlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9tb2R1bGUgd2lsbCBiZSBhdHRlbXB0ZWQgdG8gYmUgcmVsb2FkZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vdXNpbmcgYSBkaWZmZXJlbnQgY29uZmlnLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1vZC5ldmVudHMuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmRXZlbnRzW2lkXSA9IG1vZC5ldmVudHM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYW5SZWdpc3RyeShpZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIHJldHVybiBsb2NhbFJlcXVpcmU7CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIHRvIGVuYWJsZSBhIG1vZHVsZSBpZiBpdCBpcyBzdGlsbCBpbiB0aGUgcmVnaXN0cnkKICAgICAgICAgICAgICogYXdhaXRpbmcgZW5hYmxlbWVudC4gQSBzZWNvbmQgYXJnLCBwYXJlbnQsIHRoZSBwYXJlbnQgbW9kdWxlLAogICAgICAgICAgICAgKiBpcyBwYXNzZWQgaW4gZm9yIGNvbnRleHQsIHdoZW4gdGhpcyBtZXRob2QgaXMgb3ZlcnJpZGRlbiBieQogICAgICAgICAgICAgKiB0aGUgb3B0aW1pemVyLiBOb3Qgc2hvd24gaGVyZSB0byBrZWVwIGNvZGUgY29tcGFjdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVuYWJsZTogZnVuY3Rpb24gKGRlcE1hcCkgewogICAgICAgICAgICAgICAgdmFyIG1vZCA9IGdldE93bihyZWdpc3RyeSwgZGVwTWFwLmlkKTsKICAgICAgICAgICAgICAgIGlmIChtb2QpIHsKICAgICAgICAgICAgICAgICAgICBnZXRNb2R1bGUoZGVwTWFwKS5lbmFibGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbnRlcm5hbCBtZXRob2QgdXNlZCBieSBlbnZpcm9ubWVudCBhZGFwdGVycyB0byBjb21wbGV0ZSBhIGxvYWQgZXZlbnQuCiAgICAgICAgICAgICAqIEEgbG9hZCBldmVudCBjb3VsZCBiZSBhIHNjcmlwdCBsb2FkIG9yIGp1c3QgYSBsb2FkIHBhc3MgZnJvbSBhIHN5bmNocm9ub3VzCiAgICAgICAgICAgICAqIGxvYWQgY2FsbC4KICAgICAgICAgICAgICogQHBhcmFtIHtTdHJpbmd9IG1vZHVsZU5hbWUgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSB0byBwb3RlbnRpYWxseSBjb21wbGV0ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbXBsZXRlTG9hZDogZnVuY3Rpb24gKG1vZHVsZU5hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBmb3VuZCwgYXJncywgbW9kLAogICAgICAgICAgICAgICAgICAgIHNoaW0gPSBnZXRPd24oY29uZmlnLnNoaW0sIG1vZHVsZU5hbWUpIHx8IHt9LAogICAgICAgICAgICAgICAgICAgIHNoRXhwb3J0cyA9IHNoaW0uZXhwb3J0czsKCiAgICAgICAgICAgICAgICB0YWtlR2xvYmFsUXVldWUoKTsKCiAgICAgICAgICAgICAgICB3aGlsZSAoZGVmUXVldWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgYXJncyA9IGRlZlF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFyZ3NbMF0gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXJnc1swXSA9IG1vZHVsZU5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vSWYgYWxyZWFkeSBmb3VuZCBhbiBhbm9ueW1vdXMgbW9kdWxlIGFuZCBib3VuZCBpdAogICAgICAgICAgICAgICAgICAgICAgICAvL3RvIHRoaXMgbmFtZSwgdGhlbiB0aGlzIGlzIHNvbWUgb3RoZXIgYW5vbiBtb2R1bGUKICAgICAgICAgICAgICAgICAgICAgICAgLy93YWl0aW5nIGZvciBpdHMgY29tcGxldGVMb2FkIHRvIGZpcmUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnc1swXSA9PT0gbW9kdWxlTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvL0ZvdW5kIG1hdGNoaW5nIGRlZmluZSBjYWxsIGZvciB0aGlzIHNjcmlwdCEKICAgICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FsbEdldE1vZHVsZShhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQuZGVmUXVldWVNYXAgPSB7fTsKCiAgICAgICAgICAgICAgICAvL0RvIHRoaXMgYWZ0ZXIgdGhlIGN5Y2xlIG9mIGNhbGxHZXRNb2R1bGUgaW4gY2FzZSB0aGUgcmVzdWx0CiAgICAgICAgICAgICAgICAvL29mIHRob3NlIGNhbGxzL2luaXQgY2FsbHMgY2hhbmdlcyB0aGUgcmVnaXN0cnkuCiAgICAgICAgICAgICAgICBtb2QgPSBnZXRPd24ocmVnaXN0cnksIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmICghZm91bmQgJiYgIWhhc1Byb3AoZGVmaW5lZCwgbW9kdWxlTmFtZSkgJiYgbW9kICYmICFtb2QuaW5pdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5lbmZvcmNlRGVmaW5lICYmICghc2hFeHBvcnRzIHx8ICFnZXRHbG9iYWwoc2hFeHBvcnRzKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1BhdGhGYWxsYmFjayhtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdub2RlZmluZScsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdObyBkZWZpbmUgY2FsbCBmb3IgJyArIG1vZHVsZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2R1bGVOYW1lXSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy9BIHNjcmlwdCB0aGF0IGRvZXMgbm90IGNhbGwgZGVmaW5lKCksIHNvIGp1c3Qgc2ltdWxhdGUKICAgICAgICAgICAgICAgICAgICAgICAgLy90aGUgY2FsbCBmb3IgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxHZXRNb2R1bGUoW21vZHVsZU5hbWUsIChzaGltLmRlcHMgfHwgW10pLCBzaGltLmV4cG9ydHNGbl0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBjaGVja0xvYWRlZCgpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbnZlcnRzIGEgbW9kdWxlIG5hbWUgdG8gYSBmaWxlIHBhdGguIFN1cHBvcnRzIGNhc2VzIHdoZXJlCiAgICAgICAgICAgICAqIG1vZHVsZU5hbWUgbWF5IGFjdHVhbGx5IGJlIGp1c3QgYW4gVVJMLgogICAgICAgICAgICAgKiBOb3RlIHRoYXQgaXQgKipkb2VzIG5vdCoqIGNhbGwgbm9ybWFsaXplIG9uIHRoZSBtb2R1bGVOYW1lLAogICAgICAgICAgICAgKiBpdCBpcyBhc3N1bWVkIHRvIGhhdmUgYWxyZWFkeSBiZWVuIG5vcm1hbGl6ZWQuIFRoaXMgaXMgYW4KICAgICAgICAgICAgICogaW50ZXJuYWwgQVBJLCBub3QgYSBwdWJsaWMgb25lLiBVc2UgdG9VcmwgZm9yIHRoZSBwdWJsaWMgQVBJLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbmFtZVRvVXJsOiBmdW5jdGlvbiAobW9kdWxlTmFtZSwgZXh0LCBza2lwRXh0KSB7CiAgICAgICAgICAgICAgICB2YXIgcGF0aHMsIHN5bXMsIGksIHBhcmVudE1vZHVsZSwgdXJsLAogICAgICAgICAgICAgICAgICAgIHBhcmVudFBhdGgsIGJ1bmRsZUlkLAogICAgICAgICAgICAgICAgICAgIHBrZ01haW4gPSBnZXRPd24oY29uZmlnLnBrZ3MsIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgICAgIGlmIChwa2dNYWluKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kdWxlTmFtZSA9IHBrZ01haW47CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgYnVuZGxlSWQgPSBnZXRPd24oYnVuZGxlc01hcCwgbW9kdWxlTmFtZSk7CgogICAgICAgICAgICAgICAgaWYgKGJ1bmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQubmFtZVRvVXJsKGJ1bmRsZUlkLCBleHQsIHNraXBFeHQpOwogICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgIC8vSWYgYSBjb2xvbiBpcyBpbiB0aGUgVVJMLCBpdCBpbmRpY2F0ZXMgYSBwcm90b2NvbCBpcyB1c2VkIGFuZCBpdCBpcyBqdXN0CiAgICAgICAgICAgICAgICAvL2FuIFVSTCB0byBhIGZpbGUsIG9yIGlmIGl0IHN0YXJ0cyB3aXRoIGEgc2xhc2gsIGNvbnRhaW5zIGEgcXVlcnkgYXJnIChpLmUuID8pCiAgICAgICAgICAgICAgICAvL29yIGVuZHMgd2l0aCAuanMsIHRoZW4gYXNzdW1lIHRoZSB1c2VyIG1lYW50IHRvIHVzZSBhbiB1cmwgYW5kIG5vdCBhIG1vZHVsZSBpZC4KICAgICAgICAgICAgICAgIC8vVGhlIHNsYXNoIGlzIGltcG9ydGFudCBmb3IgcHJvdG9jb2wtbGVzcyBVUkxzIGFzIHdlbGwgYXMgZnVsbCBwYXRocy4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtb2R1bGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIC8vSnVzdCBhIHBsYWluIHBhdGgsIG5vdCBtb2R1bGUgbmFtZSBsb29rdXAsIHNvIGp1c3QgcmV0dXJuIGl0LgogICAgICAgICAgICAgICAgICAgIC8vQWRkIGV4dGVuc2lvbiBpZiBpdCBpcyBpbmNsdWRlZC4gVGhpcyBpcyBhIGJpdCB3b25reSwgb25seSBub24tLmpzIHRoaW5ncyBwYXNzCiAgICAgICAgICAgICAgICAgICAgLy9hbiBleHRlbnNpb24sIHRoaXMgbWV0aG9kIHByb2JhYmx5IG5lZWRzIHRvIGJlIHJld29ya2VkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IG1vZHVsZU5hbWUgKyAoZXh0IHx8ICcnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy9BIG1vZHVsZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZCB0byBhIHBhdGguCiAgICAgICAgICAgICAgICAgICAgcGF0aHMgPSBjb25maWcucGF0aHM7CgogICAgICAgICAgICAgICAgICAgIHN5bXMgPSBtb2R1bGVOYW1lLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgLy9Gb3IgZWFjaCBtb2R1bGUgbmFtZSBzZWdtZW50LCBzZWUgaWYgdGhlcmUgaXMgYSBwYXRoCiAgICAgICAgICAgICAgICAgICAgLy9yZWdpc3RlcmVkIGZvciBpdC4gU3RhcnQgd2l0aCBtb3N0IHNwZWNpZmljIG5hbWUKICAgICAgICAgICAgICAgICAgICAvL2FuZCB3b3JrIHVwIGZyb20gaXQuCiAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gc3ltcy5sZW5ndGg7IGkgPiAwOyBpIC09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50TW9kdWxlID0gc3ltcy5zbGljZSgwLCBpKS5qb2luKCcvJyk7CgogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gZ2V0T3duKHBhdGhzLCBwYXJlbnRNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGF0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiBhbiBhcnJheSwgaXQgbWVhbnMgdGhlcmUgYXJlIGEgZmV3IGNob2ljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0Nob29zZSB0aGUgb25lIHRoYXQgaXMgZGVzaXJlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzQXJyYXkocGFyZW50UGF0aCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRQYXRoID0gcGFyZW50UGF0aFswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bXMuc3BsaWNlKDAsIGksIHBhcmVudFBhdGgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgIC8vSm9pbiB0aGUgcGF0aCBwYXJ0cyB0b2dldGhlciwgdGhlbiBmaWd1cmUgb3V0IGlmIGJhc2VVcmwgaXMgbmVlZGVkLgogICAgICAgICAgICAgICAgICAgIHVybCA9IHN5bXMuam9pbignLycpOwogICAgICAgICAgICAgICAgICAgIHVybCArPSAoZXh0IHx8ICgvXmRhdGFcOnxeYmxvYlw6fFw/Ly50ZXN0KHVybCkgfHwgc2tpcEV4dCA/ICcnIDogJy5qcycpKTsKICAgICAgICAgICAgICAgICAgICB1cmwgPSAodXJsLmNoYXJBdCgwKSA9PT0gJy8nIHx8IHVybC5tYXRjaCgvXltcd1wrXC5cLV0rOi8pID8gJycgOiBjb25maWcuYmFzZVVybCkgKyB1cmw7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy51cmxBcmdzICYmICEvXmJsb2JcOi8udGVzdCh1cmwpID8KICAgICAgICAgICAgICAgICAgICAgICB1cmwgKyBjb25maWcudXJsQXJncyhtb2R1bGVOYW1lLCB1cmwpIDogdXJsOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLy9EZWxlZ2F0ZXMgdG8gcmVxLmxvYWQuIEJyb2tlbiBvdXQgYXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0bwogICAgICAgICAgICAvL2FsbG93IG92ZXJyaWRpbmcgaW4gdGhlIG9wdGltaXplci4KICAgICAgICAgICAgbG9hZDogZnVuY3Rpb24gKGlkLCB1cmwpIHsKICAgICAgICAgICAgICAgIHJlcS5sb2FkKGNvbnRleHQsIGlkLCB1cmwpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV4ZWN1dGVzIGEgbW9kdWxlIGNhbGxiYWNrIGZ1bmN0aW9uLiBCcm9rZW4gb3V0IGFzIGEgc2VwYXJhdGUgZnVuY3Rpb24KICAgICAgICAgICAgICogc29sZWx5IHRvIGFsbG93IHRoZSBidWlsZCBzeXN0ZW0gdG8gc2VxdWVuY2UgdGhlIGZpbGVzIGluIHRoZSBidWlsdAogICAgICAgICAgICAgKiBsYXllciBpbiB0aGUgcmlnaHQgc2VxdWVuY2UuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBleGVjQ2I6IGZ1bmN0aW9uIChuYW1lLCBjYWxsYmFjaywgYXJncywgZXhwb3J0cykgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrLmFwcGx5KGV4cG9ydHMsIGFyZ3MpOwogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGNhbGxiYWNrIGZvciBzY3JpcHQgbG9hZHMsIHVzZWQgdG8gY2hlY2sgc3RhdHVzIG9mIGxvYWRpbmcuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2dCB0aGUgZXZlbnQgZnJvbSB0aGUgYnJvd3NlciBmb3IgdGhlIHNjcmlwdAogICAgICAgICAgICAgKiB0aGF0IHdhcyBsb2FkZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdExvYWQ6IGZ1bmN0aW9uIChldnQpIHsKICAgICAgICAgICAgICAgIC8vVXNpbmcgY3VycmVudFRhcmdldCBpbnN0ZWFkIG9mIHRhcmdldCBmb3IgRmlyZWZveCAyLjAncyBzYWtlLiBOb3QKICAgICAgICAgICAgICAgIC8vYWxsIG9sZCBicm93c2VycyB3aWxsIGJlIHN1cHBvcnRlZCwgYnV0IHRoaXMgb25lIHdhcyBlYXN5IGVub3VnaAogICAgICAgICAgICAgICAgLy90byBzdXBwb3J0IGFuZCBzdGlsbCBtYWtlcyBzZW5zZS4KICAgICAgICAgICAgICAgIGlmIChldnQudHlwZSA9PT0gJ2xvYWQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIChyZWFkeVJlZ0V4cC50ZXN0KChldnQuY3VycmVudFRhcmdldCB8fCBldnQuc3JjRWxlbWVudCkucmVhZHlTdGF0ZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgLy9SZXNldCBpbnRlcmFjdGl2ZSBzY3JpcHQgc28gYSBzY3JpcHQgbm9kZSBpcyBub3QgaGVsZCBvbnRvIGZvcgogICAgICAgICAgICAgICAgICAgIC8vdG8gbG9uZy4KICAgICAgICAgICAgICAgICAgICBpbnRlcmFjdGl2ZVNjcmlwdCA9IG51bGw7CgogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvdXQgdGhlIG5hbWUgb2YgdGhlIG1vZHVsZSBhbmQgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBnZXRTY3JpcHREYXRhKGV2dCk7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQoZGF0YS5pZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGJhY2sgZm9yIHNjcmlwdCBlcnJvcnMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBvblNjcmlwdEVycm9yOiBmdW5jdGlvbiAoZXZ0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGdldFNjcmlwdERhdGEoZXZ0KTsKICAgICAgICAgICAgICAgIGlmICghaGFzUGF0aEZhbGxiYWNrKGRhdGEuaWQpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudHMgPSBbXTsKICAgICAgICAgICAgICAgICAgICBlYWNoUHJvcChyZWdpc3RyeSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmluZGV4T2YoJ19AcicpICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlYWNoKHZhbHVlLmRlcE1hcHMsIGZ1bmN0aW9uKGRlcE1hcCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXBNYXAuaWQgPT09IGRhdGEuaWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50cy5wdXNoKGtleSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9uRXJyb3IobWFrZUVycm9yKCdzY3JpcHRlcnJvcicsICdTY3JpcHQgZXJyb3IgZm9yICInICsgZGF0YS5pZCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJlbnRzLmxlbmd0aCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICciLCBuZWVkZWQgYnk6ICcgKyBwYXJlbnRzLmpvaW4oJywgJykgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIicpLCBldnQsIFtkYXRhLmlkXSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgY29udGV4dC5yZXF1aXJlID0gY29udGV4dC5tYWtlUmVxdWlyZSgpOwogICAgICAgIHJldHVybiBjb250ZXh0OwogICAgfQoKICAgIC8qKgogICAgICogTWFpbiBlbnRyeSBwb2ludC4KICAgICAqCiAgICAgKiBJZiB0aGUgb25seSBhcmd1bWVudCB0byByZXF1aXJlIGlzIGEgc3RyaW5nLCB0aGVuIHRoZSBtb2R1bGUgdGhhdAogICAgICogaXMgcmVwcmVzZW50ZWQgYnkgdGhhdCBzdHJpbmcgaXMgZmV0Y2hlZCBmb3IgdGhlIGFwcHJvcHJpYXRlIGNvbnRleHQuCiAgICAgKgogICAgICogSWYgdGhlIGZpcnN0IGFyZ3VtZW50IGlzIGFuIGFycmF5LCB0aGVuIGl0IHdpbGwgYmUgdHJlYXRlZCBhcyBhbiBhcnJheQogICAgICogb2YgZGVwZW5kZW5jeSBzdHJpbmcgbmFtZXMgdG8gZmV0Y2guIEFuIG9wdGlvbmFsIGZ1bmN0aW9uIGNhbGxiYWNrIGNhbgogICAgICogYmUgc3BlY2lmaWVkIHRvIGV4ZWN1dGUgd2hlbiBhbGwgb2YgdGhvc2UgZGVwZW5kZW5jaWVzIGFyZSBhdmFpbGFibGUuCiAgICAgKgogICAgICogTWFrZSBhIGxvY2FsIHJlcSB2YXJpYWJsZSB0byBoZWxwIENhamEgY29tcGxpYW5jZSAoaXQgYXNzdW1lcyB0aGluZ3MKICAgICAqIG9uIGEgcmVxdWlyZSB0aGF0IGFyZSBub3Qgc3RhbmRhcmRpemVkKSwgYW5kIHRvIGdpdmUgYSBzaG9ydAogICAgICogbmFtZSBmb3IgbWluaWZpY2F0aW9uL2xvY2FsIHNjb3BlIHVzZS4KICAgICAqLwogICAgcmVxID0gcmVxdWlyZWpzID0gZnVuY3Rpb24gKGRlcHMsIGNhbGxiYWNrLCBlcnJiYWNrLCBvcHRpb25hbCkgewoKICAgICAgICAvL0ZpbmQgdGhlIHJpZ2h0IGNvbnRleHQsIHVzZSBkZWZhdWx0CiAgICAgICAgdmFyIGNvbnRleHQsIGNvbmZpZywKICAgICAgICAgICAgY29udGV4dE5hbWUgPSBkZWZDb250ZXh0TmFtZTsKCiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIGhhdmUgY29uZmlnIG9iamVjdCBpbiB0aGUgY2FsbC4KICAgICAgICBpZiAoIWlzQXJyYXkoZGVwcykgJiYgdHlwZW9mIGRlcHMgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vIGRlcHMgaXMgYSBjb25maWcgb2JqZWN0CiAgICAgICAgICAgIGNvbmZpZyA9IGRlcHM7CiAgICAgICAgICAgIGlmIChpc0FycmF5KGNhbGxiYWNrKSkgewogICAgICAgICAgICAgICAgLy8gQWRqdXN0IGFyZ3MgaWYgdGhlcmUgYXJlIGRlcGVuZGVuY2llcwogICAgICAgICAgICAgICAgZGVwcyA9IGNhbGxiYWNrOwogICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBlcnJiYWNrOwogICAgICAgICAgICAgICAgZXJyYmFjayA9IG9wdGlvbmFsOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgZGVwcyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5jb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnRleHROYW1lID0gY29uZmlnLmNvbnRleHQ7CiAgICAgICAgfQoKICAgICAgICBjb250ZXh0ID0gZ2V0T3duKGNvbnRleHRzLCBjb250ZXh0TmFtZSk7CiAgICAgICAgaWYgKCFjb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0c1tjb250ZXh0TmFtZV0gPSByZXEucy5uZXdDb250ZXh0KGNvbnRleHROYW1lKTsKICAgICAgICB9CgogICAgICAgIGlmIChjb25maWcpIHsKICAgICAgICAgICAgY29udGV4dC5jb25maWd1cmUoY29uZmlnKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjb250ZXh0LnJlcXVpcmUoZGVwcywgY2FsbGJhY2ssIGVycmJhY2spOwogICAgfTsKCiAgICAvKioKICAgICAqIFN1cHBvcnQgcmVxdWlyZS5jb25maWcoKSB0byBtYWtlIGl0IGVhc2llciB0byBjb29wZXJhdGUgd2l0aCBvdGhlcgogICAgICogQU1EIGxvYWRlcnMgb24gZ2xvYmFsbHkgYWdyZWVkIG5hbWVzLgogICAgICovCiAgICByZXEuY29uZmlnID0gZnVuY3Rpb24gKGNvbmZpZykgewogICAgICAgIHJldHVybiByZXEoY29uZmlnKTsKICAgIH07CgogICAgLyoqCiAgICAgKiBFeGVjdXRlIHNvbWV0aGluZyBhZnRlciB0aGUgY3VycmVudCB0aWNrCiAgICAgKiBvZiB0aGUgZXZlbnQgbG9vcC4gT3ZlcnJpZGUgZm9yIG90aGVyIGVudnMKICAgICAqIHRoYXQgaGF2ZSBhIGJldHRlciBzb2x1dGlvbiB0aGFuIHNldFRpbWVvdXQuCiAgICAgKiBAcGFyYW0gIHtGdW5jdGlvbn0gZm4gZnVuY3Rpb24gdG8gZXhlY3V0ZSBsYXRlci4KICAgICAqLwogICAgcmVxLm5leHRUaWNrID0gdHlwZW9mIHNldFRpbWVvdXQgIT09ICd1bmRlZmluZWQnID8gZnVuY3Rpb24gKGZuKSB7CiAgICAgICAgc2V0VGltZW91dChmbiwgNCk7CiAgICB9IDogZnVuY3Rpb24gKGZuKSB7IGZuKCk7IH07CgogICAgLyoqCiAgICAgKiBFeHBvcnQgcmVxdWlyZSBhcyBhIGdsb2JhbCwgYnV0IG9ubHkgaWYgaXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4KICAgICAqLwogICAgaWYgKCFyZXF1aXJlKSB7CiAgICAgICAgcmVxdWlyZSA9IHJlcTsKICAgIH0KCiAgICByZXEudmVyc2lvbiA9IHZlcnNpb247CgogICAgLy9Vc2VkIHRvIGZpbHRlciBvdXQgZGVwZW5kZW5jaWVzIHRoYXQgYXJlIGFscmVhZHkgcGF0aHMuCiAgICByZXEuanNFeHRSZWdFeHAgPSAvXlwvfDp8XD98XC5qcyQvOwogICAgcmVxLmlzQnJvd3NlciA9IGlzQnJvd3NlcjsKICAgIHMgPSByZXEucyA9IHsKICAgICAgICBjb250ZXh0czogY29udGV4dHMsCiAgICAgICAgbmV3Q29udGV4dDogbmV3Q29udGV4dAogICAgfTsKCiAgICAvL0NyZWF0ZSBkZWZhdWx0IGNvbnRleHQuCiAgICByZXEoe30pOwoKICAgIC8vRXhwb3J0cyBzb21lIGNvbnRleHQtc2Vuc2l0aXZlIG1ldGhvZHMgb24gZ2xvYmFsIHJlcXVpcmUuCiAgICBlYWNoKFsKICAgICAgICAndG9VcmwnLAogICAgICAgICd1bmRlZicsCiAgICAgICAgJ2RlZmluZWQnLAogICAgICAgICdzcGVjaWZpZWQnCiAgICBdLCBmdW5jdGlvbiAocHJvcCkgewogICAgICAgIC8vUmVmZXJlbmNlIGZyb20gY29udGV4dHMgaW5zdGVhZCBvZiBlYXJseSBiaW5kaW5nIHRvIGRlZmF1bHQgY29udGV4dCwKICAgICAgICAvL3NvIHRoYXQgZHVyaW5nIGJ1aWxkcywgdGhlIGxhdGVzdCBpbnN0YW5jZSBvZiB0aGUgZGVmYXVsdCBjb250ZXh0CiAgICAgICAgLy93aXRoIGl0cyBjb25maWcgZ2V0cyB1c2VkLgogICAgICAgIHJlcVtwcm9wXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGN0eCA9IGNvbnRleHRzW2RlZkNvbnRleHROYW1lXTsKICAgICAgICAgICAgcmV0dXJuIGN0eC5yZXF1aXJlW3Byb3BdLmFwcGx5KGN0eCwgYXJndW1lbnRzKTsKICAgICAgICB9OwogICAgfSk7CgogICAgaWYgKGlzQnJvd3NlcikgewogICAgICAgIGhlYWQgPSBzLmhlYWQgPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdOwogICAgICAgIC8vSWYgQkFTRSB0YWcgaXMgaW4gcGxheSwgdXNpbmcgYXBwZW5kQ2hpbGQgaXMgYSBwcm9ibGVtIGZvciBJRTYuCiAgICAgICAgLy9XaGVuIHRoYXQgYnJvd3NlciBkaWVzLCB0aGlzIGNhbiBiZSByZW1vdmVkLiBEZXRhaWxzIGluIHRoaXMgalF1ZXJ5IGJ1ZzoKICAgICAgICAvL2h0dHA6Ly9kZXYuanF1ZXJ5LmNvbS90aWNrZXQvMjcwOQogICAgICAgIGJhc2VFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2Jhc2UnKVswXTsKICAgICAgICBpZiAoYmFzZUVsZW1lbnQpIHsKICAgICAgICAgICAgaGVhZCA9IHMuaGVhZCA9IGJhc2VFbGVtZW50LnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQW55IGVycm9ycyB0aGF0IHJlcXVpcmUgZXhwbGljaXRseSBnZW5lcmF0ZXMgd2lsbCBiZSBwYXNzZWQgdG8gdGhpcwogICAgICogZnVuY3Rpb24uIEludGVyY2VwdC9vdmVycmlkZSBpdCBpZiB5b3Ugd2FudCBjdXN0b20gZXJyb3IgaGFuZGxpbmcuCiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlcnIgdGhlIGVycm9yIG9iamVjdC4KICAgICAqLwogICAgcmVxLm9uRXJyb3IgPSBkZWZhdWx0T25FcnJvcjsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgdGhlIG5vZGUgZm9yIHRoZSBsb2FkIGNvbW1hbmQuIE9ubHkgdXNlZCBpbiBicm93c2VyIGVudnMuCiAgICAgKi8KICAgIHJlcS5jcmVhdGVOb2RlID0gZnVuY3Rpb24gKGNvbmZpZywgbW9kdWxlTmFtZSwgdXJsKSB7CiAgICAgICAgdmFyIG5vZGUgPSBjb25maWcueGh0bWwgPwogICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sJywgJ2h0bWw6c2NyaXB0JykgOgogICAgICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgbm9kZS50eXBlID0gY29uZmlnLnNjcmlwdFR5cGUgfHwgJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgbm9kZS5jaGFyc2V0ID0gJ3V0Zi04JzsKICAgICAgICBub2RlLmFzeW5jID0gdHJ1ZTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEb2VzIHRoZSByZXF1ZXN0IHRvIGxvYWQgYSBtb2R1bGUgZm9yIHRoZSBicm93c2VyIGNhc2UuCiAgICAgKiBNYWtlIHRoaXMgYSBzZXBhcmF0ZSBmdW5jdGlvbiB0byBhbGxvdyBvdGhlciBlbnZpcm9ubWVudHMKICAgICAqIHRvIG92ZXJyaWRlIGl0LgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb250ZXh0IHRoZSByZXF1aXJlIGNvbnRleHQgdG8gZmluZCBzdGF0ZS4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSBtb2R1bGVOYW1lIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gdXJsIHRoZSBVUkwgdG8gdGhlIG1vZHVsZS4KICAgICAqLwogICAgcmVxLmxvYWQgPSBmdW5jdGlvbiAoY29udGV4dCwgbW9kdWxlTmFtZSwgdXJsKSB7CiAgICAgICAgdmFyIGNvbmZpZyA9IChjb250ZXh0ICYmIGNvbnRleHQuY29uZmlnKSB8fCB7fSwKICAgICAgICAgICAgbm9kZTsKICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgIC8vSW4gdGhlIGJyb3dzZXIgc28gdXNlIGEgc2NyaXB0IHRhZwogICAgICAgICAgICBub2RlID0gcmVxLmNyZWF0ZU5vZGUoY29uZmlnLCBtb2R1bGVOYW1lLCB1cmwpOwoKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZWNvbnRleHQnLCBjb250ZXh0LmNvbnRleHROYW1lKTsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ2RhdGEtcmVxdWlyZW1vZHVsZScsIG1vZHVsZU5hbWUpOwoKICAgICAgICAgICAgLy9TZXQgdXAgbG9hZCBsaXN0ZW5lci4gVGVzdCBhdHRhY2hFdmVudCBmaXJzdCBiZWNhdXNlIElFOSBoYXMKICAgICAgICAgICAgLy9hIHN1YnRsZSBpc3N1ZSBpbiBpdHMgYWRkRXZlbnRMaXN0ZW5lciBhbmQgc2NyaXB0IG9ubG9hZCBmaXJpbmdzCiAgICAgICAgICAgIC8vdGhhdCBkbyBub3QgbWF0Y2ggdGhlIGJlaGF2aW9yIG9mIGFsbCBvdGhlciBicm93c2VycyB3aXRoCiAgICAgICAgICAgIC8vYWRkRXZlbnRMaXN0ZW5lciBzdXBwb3J0LCB3aGljaCBmaXJlIHRoZSBvbmxvYWQgZXZlbnQgZm9yIGEKICAgICAgICAgICAgLy9zY3JpcHQgcmlnaHQgYWZ0ZXIgdGhlIHNjcmlwdCBleGVjdXRpb24uIFNlZToKICAgICAgICAgICAgLy9odHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzY0ODA1Ny9zY3JpcHQtb25sb2FkLWV2ZW50LWlzLW5vdC1maXJlZC1pbW1lZGlhdGVseS1hZnRlci1zY3JpcHQtZXhlY3V0aW9uCiAgICAgICAgICAgIC8vVU5GT1JUVU5BVEVMWSBPcGVyYSBpbXBsZW1lbnRzIGF0dGFjaEV2ZW50IGJ1dCBkb2VzIG5vdCBmb2xsb3cgdGhlIHNjcmlwdAogICAgICAgICAgICAvL3NjcmlwdCBleGVjdXRpb24gbW9kZS4KICAgICAgICAgICAgaWYgKG5vZGUuYXR0YWNoRXZlbnQgJiYKICAgICAgICAgICAgICAgICAgICAvL0NoZWNrIGlmIG5vZGUuYXR0YWNoRXZlbnQgaXMgYXJ0aWZpY2lhbGx5IGFkZGVkIGJ5IGN1c3RvbSBzY3JpcHQgb3IKICAgICAgICAgICAgICAgICAgICAvL25hdGl2ZWx5IHN1cHBvcnRlZCBieSBicm93c2VyCiAgICAgICAgICAgICAgICAgICAgLy9yZWFkIGh0dHBzOi8vZ2l0aHViLmNvbS9yZXF1aXJlanMvcmVxdWlyZWpzL2lzc3Vlcy8xODcKICAgICAgICAgICAgICAgICAgICAvL2lmIHdlIGNhbiBOT1QgZmluZCBbbmF0aXZlIGNvZGVdIHRoZW4gaXQgbXVzdCBOT1QgbmF0aXZlbHkgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgICAgIC8vaW4gSUU4LCBub2RlLmF0dGFjaEV2ZW50IGRvZXMgbm90IGhhdmUgdG9TdHJpbmcoKQogICAgICAgICAgICAgICAgICAgIC8vTm90ZSB0aGUgdGVzdCBmb3IgIltuYXRpdmUgY29kZSIgd2l0aCBubyBjbG9zaW5nIGJyYWNlLCBzZWU6CiAgICAgICAgICAgICAgICAgICAgLy9odHRwczovL2dpdGh1Yi5jb20vcmVxdWlyZWpzL3JlcXVpcmVqcy9pc3N1ZXMvMjczCiAgICAgICAgICAgICAgICAgICAgIShub2RlLmF0dGFjaEV2ZW50LnRvU3RyaW5nICYmIG5vZGUuYXR0YWNoRXZlbnQudG9TdHJpbmcoKS5pbmRleE9mKCdbbmF0aXZlIGNvZGUnKSA8IDApICYmCiAgICAgICAgICAgICAgICAgICAgIWlzT3BlcmEpIHsKICAgICAgICAgICAgICAgIC8vUHJvYmFibHkgSUUuIElFIChhdCBsZWFzdCA2LTgpIGRvIG5vdCBmaXJlCiAgICAgICAgICAgICAgICAvL3NjcmlwdCBvbmxvYWQgcmlnaHQgYWZ0ZXIgZXhlY3V0aW5nIHRoZSBzY3JpcHQsIHNvCiAgICAgICAgICAgICAgICAvL3dlIGNhbm5vdCB0aWUgdGhlIGFub255bW91cyBkZWZpbmUgY2FsbCB0byBhIG5hbWUuCiAgICAgICAgICAgICAgICAvL0hvd2V2ZXIsIElFIHJlcG9ydHMgdGhlIHNjcmlwdCBhcyBiZWluZyBpbiAnaW50ZXJhY3RpdmUnCiAgICAgICAgICAgICAgICAvL3JlYWR5U3RhdGUgYXQgdGhlIHRpbWUgb2YgdGhlIGRlZmluZSBjYWxsLgogICAgICAgICAgICAgICAgdXNlSW50ZXJhY3RpdmUgPSB0cnVlOwoKICAgICAgICAgICAgICAgIG5vZGUuYXR0YWNoRXZlbnQoJ29ucmVhZHlzdGF0ZWNoYW5nZScsIGNvbnRleHQub25TY3JpcHRMb2FkKTsKICAgICAgICAgICAgICAgIC8vSXQgd291bGQgYmUgZ3JlYXQgdG8gYWRkIGFuIGVycm9yIGhhbmRsZXIgaGVyZSB0byBjYXRjaAogICAgICAgICAgICAgICAgLy80MDRzIGluIElFOSsuIEhvd2V2ZXIsIG9ucmVhZHlzdGF0ZWNoYW5nZSB3aWxsIGZpcmUgYmVmb3JlCiAgICAgICAgICAgICAgICAvL3RoZSBlcnJvciBoYW5kbGVyLCBzbyB0aGF0IGRvZXMgbm90IGhlbHAuIElmIGFkZEV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgICAgIC8vaXMgdXNlZCwgdGhlbiBJRSB3aWxsIGZpcmUgZXJyb3IgYmVmb3JlIGxvYWQsIGJ1dCB3ZSBjYW5ub3QKICAgICAgICAgICAgICAgIC8vdXNlIHRoYXQgcGF0aHdheSBnaXZlbiB0aGUgY29ubmVjdC5taWNyb3NvZnQuY29tIGlzc3VlCiAgICAgICAgICAgICAgICAvL21lbnRpb25lZCBhYm92ZSBhYm91dCBub3QgZG9pbmcgdGhlICdzY3JpcHQgZXhlY3V0ZSwKICAgICAgICAgICAgICAgIC8vdGhlbiBmaXJlIHRoZSBzY3JpcHQgbG9hZCBldmVudCBsaXN0ZW5lciBiZWZvcmUgZXhlY3V0ZQogICAgICAgICAgICAgICAgLy9uZXh0IHNjcmlwdCcgdGhhdCBvdGhlciBicm93c2VycyBkby4KICAgICAgICAgICAgICAgIC8vQmVzdCBob3BlOiBJRTEwIGZpeGVzIHRoZSBpc3N1ZXMsCiAgICAgICAgICAgICAgICAvL2FuZCB0aGVuIGRlc3Ryb3lzIGFsbCBpbnN0YWxscyBvZiBJRSA2LTkuCiAgICAgICAgICAgICAgICAvL25vZGUuYXR0YWNoRXZlbnQoJ29uZXJyb3InLCBjb250ZXh0Lm9uU2NyaXB0RXJyb3IpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgY29udGV4dC5vblNjcmlwdExvYWQsIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBjb250ZXh0Lm9uU2NyaXB0RXJyb3IsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBub2RlLnNyYyA9IHVybDsKCiAgICAgICAgICAgIC8vQ2FsbGluZyBvbk5vZGVDcmVhdGVkIGFmdGVyIGFsbCBwcm9wZXJ0aWVzIG9uIHRoZSBub2RlIGhhdmUgYmVlbgogICAgICAgICAgICAvL3NldCwgYnV0IGJlZm9yZSBpdCBpcyBwbGFjZWQgaW4gdGhlIERPTS4KICAgICAgICAgICAgaWYgKGNvbmZpZy5vbk5vZGVDcmVhdGVkKSB7CiAgICAgICAgICAgICAgICBjb25maWcub25Ob2RlQ3JlYXRlZChub2RlLCBjb25maWcsIG1vZHVsZU5hbWUsIHVybCk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIC8vRm9yIHNvbWUgY2FjaGUgY2FzZXMgaW4gSUUgNi04LCB0aGUgc2NyaXB0IGV4ZWN1dGVzIGJlZm9yZSB0aGUgZW5kCiAgICAgICAgICAgIC8vb2YgdGhlIGFwcGVuZENoaWxkIGV4ZWN1dGlvbiwgc28gdG8gdGllIGFuIGFub255bW91cyBkZWZpbmUKICAgICAgICAgICAgLy9jYWxsIHRvIHRoZSBtb2R1bGUgbmFtZSAod2hpY2ggaXMgc3RvcmVkIG9uIHRoZSBub2RlKSwgaG9sZCBvbgogICAgICAgICAgICAvL3RvIGEgcmVmZXJlbmNlIHRvIHRoaXMgbm9kZSwgYnV0IGNsZWFyIGFmdGVyIHRoZSBET00gaW5zZXJ0aW9uLgogICAgICAgICAgICBjdXJyZW50bHlBZGRpbmdTY3JpcHQgPSBub2RlOwogICAgICAgICAgICBpZiAoYmFzZUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGhlYWQuaW5zZXJ0QmVmb3JlKG5vZGUsIGJhc2VFbGVtZW50KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhlYWQuYXBwZW5kQ2hpbGQobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VycmVudGx5QWRkaW5nU2NyaXB0ID0gbnVsbDsKCiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIH0gZWxzZSBpZiAoaXNXZWJXb3JrZXIpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vSW4gYSB3ZWIgd29ya2VyLCB1c2UgaW1wb3J0U2NyaXB0cy4gVGhpcyBpcyBub3QgYSB2ZXJ5CiAgICAgICAgICAgICAgICAvL2VmZmljaWVudCB1c2Ugb2YgaW1wb3J0U2NyaXB0cywgaW1wb3J0U2NyaXB0cyB3aWxsIGJsb2NrIHVudGlsCiAgICAgICAgICAgICAgICAvL2l0cyBzY3JpcHQgaXMgZG93bmxvYWRlZCBhbmQgZXZhbHVhdGVkLiBIb3dldmVyLCBpZiB3ZWIgd29ya2VycwogICAgICAgICAgICAgICAgLy9hcmUgaW4gcGxheSwgdGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQgYSBidWlsZCBoYXMgYmVlbiBkb25lIHNvCiAgICAgICAgICAgICAgICAvL3RoYXQgb25seSBvbmUgc2NyaXB0IG5lZWRzIHRvIGJlIGxvYWRlZCBhbnl3YXkuIFRoaXMgbWF5IG5lZWQKICAgICAgICAgICAgICAgIC8vdG8gYmUgcmVldmFsdWF0ZWQgaWYgb3RoZXIgdXNlIGNhc2VzIGJlY29tZSBjb21tb24uCgogICAgICAgICAgICAgICAgLy8gUG9zdCBhIHRhc2sgdG8gdGhlIGV2ZW50IGxvb3AgdG8gd29yayBhcm91bmQgYSBidWcgaW4gV2ViS2l0CiAgICAgICAgICAgICAgICAvLyB3aGVyZSB0aGUgd29ya2VyIGdldHMgZ2FyYmFnZS1jb2xsZWN0ZWQgYWZ0ZXIgY2FsbGluZwogICAgICAgICAgICAgICAgLy8gaW1wb3J0U2NyaXB0cygpOiBodHRwczovL3dlYmtpdC5vcmcvYi8xNTMzMTcKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7fSwgMCk7CiAgICAgICAgICAgICAgICBpbXBvcnRTY3JpcHRzKHVybCk7CgogICAgICAgICAgICAgICAgLy9BY2NvdW50IGZvciBhbm9ueW1vdXMgbW9kdWxlcwogICAgICAgICAgICAgICAgY29udGV4dC5jb21wbGV0ZUxvYWQobW9kdWxlTmFtZSk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQub25FcnJvcihtYWtlRXJyb3IoJ2ltcG9ydHNjcmlwdHMnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpbXBvcnRTY3JpcHRzIGZhaWxlZCBmb3IgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZU5hbWUgKyAnIGF0ICcgKyB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9kdWxlTmFtZV0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZ2V0SW50ZXJhY3RpdmVTY3JpcHQoKSB7CiAgICAgICAgaWYgKGludGVyYWN0aXZlU2NyaXB0ICYmIGludGVyYWN0aXZlU2NyaXB0LnJlYWR5U3RhdGUgPT09ICdpbnRlcmFjdGl2ZScpIHsKICAgICAgICAgICAgcmV0dXJuIGludGVyYWN0aXZlU2NyaXB0OwogICAgICAgIH0KCiAgICAgICAgZWFjaFJldmVyc2Uoc2NyaXB0cygpLCBmdW5jdGlvbiAoc2NyaXB0KSB7CiAgICAgICAgICAgIGlmIChzY3JpcHQucmVhZHlTdGF0ZSA9PT0gJ2ludGVyYWN0aXZlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIChpbnRlcmFjdGl2ZVNjcmlwdCA9IHNjcmlwdCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gaW50ZXJhY3RpdmVTY3JpcHQ7CiAgICB9CgogICAgLy9Mb29rIGZvciBhIGRhdGEtbWFpbiBzY3JpcHQgYXR0cmlidXRlLCB3aGljaCBjb3VsZCBhbHNvIGFkanVzdCB0aGUgYmFzZVVybC4KICAgIGlmIChpc0Jyb3dzZXIgJiYgIWNmZy5za2lwRGF0YU1haW4pIHsKICAgICAgICAvL0ZpZ3VyZSBvdXQgYmFzZVVybC4gR2V0IGl0IGZyb20gdGhlIHNjcmlwdCB0YWcgd2l0aCByZXF1aXJlLmpzIGluIGl0LgogICAgICAgIGVhY2hSZXZlcnNlKHNjcmlwdHMoKSwgZnVuY3Rpb24gKHNjcmlwdCkgewogICAgICAgICAgICAvL1NldCB0aGUgJ2hlYWQnIHdoZXJlIHdlIGNhbiBhcHBlbmQgY2hpbGRyZW4gYnkKICAgICAgICAgICAgLy91c2luZyB0aGUgc2NyaXB0J3MgcGFyZW50LgogICAgICAgICAgICBpZiAoIWhlYWQpIHsKICAgICAgICAgICAgICAgIGhlYWQgPSBzY3JpcHQucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgLy9Mb29rIGZvciBhIGRhdGEtbWFpbiBhdHRyaWJ1dGUgdG8gc2V0IG1haW4gc2NyaXB0IGZvciB0aGUgcGFnZQogICAgICAgICAgICAvL3RvIGxvYWQuIElmIGl0IGlzIHRoZXJlLCB0aGUgcGF0aCB0byBkYXRhIG1haW4gYmVjb21lcyB0aGUKICAgICAgICAgICAgLy9iYXNlVXJsLCBpZiBpdCBpcyBub3QgYWxyZWFkeSBzZXQuCiAgICAgICAgICAgIGRhdGFNYWluID0gc2NyaXB0LmdldEF0dHJpYnV0ZSgnZGF0YS1tYWluJyk7CiAgICAgICAgICAgIGlmIChkYXRhTWFpbikgewogICAgICAgICAgICAgICAgLy9QcmVzZXJ2ZSBkYXRhTWFpbiBpbiBjYXNlIGl0IGlzIGEgcGF0aCAoaS5lLiBjb250YWlucyAnPycpCiAgICAgICAgICAgICAgICBtYWluU2NyaXB0ID0gZGF0YU1haW47CgogICAgICAgICAgICAgICAgLy9TZXQgZmluYWwgYmFzZVVybCBpZiB0aGVyZSBpcyBub3QgYWxyZWFkeSBhbiBleHBsaWNpdCBvbmUsCiAgICAgICAgICAgICAgICAvL2J1dCBvbmx5IGRvIHNvIGlmIHRoZSBkYXRhLW1haW4gdmFsdWUgaXMgbm90IGEgbG9hZGVyIHBsdWdpbgogICAgICAgICAgICAgICAgLy9tb2R1bGUgSUQuCiAgICAgICAgICAgICAgICBpZiAoIWNmZy5iYXNlVXJsICYmIG1haW5TY3JpcHQuaW5kZXhPZignIScpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vUHVsbCBvZmYgdGhlIGRpcmVjdG9yeSBvZiBkYXRhLW1haW4gZm9yIHVzZSBhcyB0aGUKICAgICAgICAgICAgICAgICAgICAvL2Jhc2VVcmwuCiAgICAgICAgICAgICAgICAgICAgc3JjID0gbWFpblNjcmlwdC5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBzcmMucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgc3ViUGF0aCA9IHNyYy5sZW5ndGggPyBzcmMuam9pbignLycpICArICcvJyA6ICcuLyc7CgogICAgICAgICAgICAgICAgICAgIGNmZy5iYXNlVXJsID0gc3ViUGF0aDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1N0cmlwIG9mZiBhbnkgdHJhaWxpbmcgLmpzIHNpbmNlIG1haW5TY3JpcHQgaXMgbm93CiAgICAgICAgICAgICAgICAvL2xpa2UgYSBtb2R1bGUgbmFtZS4KICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBtYWluU2NyaXB0LnJlcGxhY2UoanNTdWZmaXhSZWdFeHAsICcnKTsKCiAgICAgICAgICAgICAgICAvL0lmIG1haW5TY3JpcHQgaXMgc3RpbGwgYSBwYXRoLCBmYWxsIGJhY2sgdG8gZGF0YU1haW4KICAgICAgICAgICAgICAgIGlmIChyZXEuanNFeHRSZWdFeHAudGVzdChtYWluU2NyaXB0KSkgewogICAgICAgICAgICAgICAgICAgIG1haW5TY3JpcHQgPSBkYXRhTWFpbjsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAvL1B1dCB0aGUgZGF0YS1tYWluIHNjcmlwdCBpbiB0aGUgZmlsZXMgdG8gbG9hZC4KICAgICAgICAgICAgICAgIGNmZy5kZXBzID0gY2ZnLmRlcHMgPyBjZmcuZGVwcy5jb25jYXQobWFpblNjcmlwdCkgOiBbbWFpblNjcmlwdF07CgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBmdW5jdGlvbiB0aGF0IGhhbmRsZXMgZGVmaW5pdGlvbnMgb2YgbW9kdWxlcy4gRGlmZmVycyBmcm9tCiAgICAgKiByZXF1aXJlKCkgaW4gdGhhdCBhIHN0cmluZyBmb3IgdGhlIG1vZHVsZSBzaG91bGQgYmUgdGhlIGZpcnN0IGFyZ3VtZW50LAogICAgICogYW5kIHRoZSBmdW5jdGlvbiB0byBleGVjdXRlIGFmdGVyIGRlcGVuZGVuY2llcyBhcmUgbG9hZGVkIHNob3VsZAogICAgICogcmV0dXJuIGEgdmFsdWUgdG8gZGVmaW5lIHRoZSBtb2R1bGUgY29ycmVzcG9uZGluZyB0byB0aGUgZmlyc3QgYXJndW1lbnQncwogICAgICogbmFtZS4KICAgICAqLwogICAgZGVmaW5lID0gZnVuY3Rpb24gKG5hbWUsIGRlcHMsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIG5vZGUsIGNvbnRleHQ7CgogICAgICAgIC8vQWxsb3cgZm9yIGFub255bW91cyBtb2R1bGVzCiAgICAgICAgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAvL0FkanVzdCBhcmdzIGFwcHJvcHJpYXRlbHkKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbmFtZTsKICAgICAgICAgICAgbmFtZSA9IG51bGw7CiAgICAgICAgfQoKICAgICAgICAvL1RoaXMgbW9kdWxlIG1heSBub3QgaGF2ZSBkZXBlbmRlbmNpZXMKICAgICAgICBpZiAoIWlzQXJyYXkoZGVwcykpIHsKICAgICAgICAgICAgY2FsbGJhY2sgPSBkZXBzOwogICAgICAgICAgICBkZXBzID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vSWYgbm8gbmFtZSwgYW5kIGNhbGxiYWNrIGlzIGEgZnVuY3Rpb24sIHRoZW4gZmlndXJlIG91dCBpZiBpdCBhCiAgICAgICAgLy9Db21tb25KUyB0aGluZyB3aXRoIGRlcGVuZGVuY2llcy4KICAgICAgICBpZiAoIWRlcHMgJiYgaXNGdW5jdGlvbihjYWxsYmFjaykpIHsKICAgICAgICAgICAgZGVwcyA9IFtdOwogICAgICAgICAgICAvL1JlbW92ZSBjb21tZW50cyBmcm9tIHRoZSBjYWxsYmFjayBzdHJpbmcsCiAgICAgICAgICAgIC8vbG9vayBmb3IgcmVxdWlyZSBjYWxscywgYW5kIHB1bGwgdGhlbSBpbnRvIHRoZSBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgIC8vYnV0IG9ubHkgaWYgdGhlcmUgYXJlIGZ1bmN0aW9uIGFyZ3MuCiAgICAgICAgICAgIGlmIChjYWxsYmFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNhbGxiYWNrCiAgICAgICAgICAgICAgICAgICAgLnRvU3RyaW5nKCkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjb21tZW50UmVnRXhwLCBjb21tZW50UmVwbGFjZSkKICAgICAgICAgICAgICAgICAgICAucmVwbGFjZShjanNSZXF1aXJlUmVnRXhwLCBmdW5jdGlvbiAobWF0Y2gsIGRlcCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZXBzLnB1c2goZGVwKTsKICAgICAgICAgICAgICAgICAgICB9KTsKCiAgICAgICAgICAgICAgICAvL01heSBiZSBhIENvbW1vbkpTIHRoaW5nIGV2ZW4gd2l0aG91dCByZXF1aXJlIGNhbGxzLCBidXQgc3RpbGwKICAgICAgICAgICAgICAgIC8vY291bGQgdXNlIGV4cG9ydHMsIGFuZCBtb2R1bGUuIEF2b2lkIGRvaW5nIGV4cG9ydHMgYW5kIG1vZHVsZQogICAgICAgICAgICAgICAgLy93b3JrIHRob3VnaCBpZiBpdCBqdXN0IG5lZWRzIHJlcXVpcmUuCiAgICAgICAgICAgICAgICAvL1JFUVVJUkVTIHRoZSBmdW5jdGlvbiB0byBleHBlY3QgdGhlIENvbW1vbkpTIHZhcmlhYmxlcyBpbiB0aGUKICAgICAgICAgICAgICAgIC8vb3JkZXIgbGlzdGVkIGJlbG93LgogICAgICAgICAgICAgICAgZGVwcyA9IChjYWxsYmFjay5sZW5ndGggPT09IDEgPyBbJ3JlcXVpcmUnXSA6IFsncmVxdWlyZScsICdleHBvcnRzJywgJ21vZHVsZSddKS5jb25jYXQoZGVwcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vSWYgaW4gSUUgNi04IGFuZCBoaXQgYW4gYW5vbnltb3VzIGRlZmluZSgpIGNhbGwsIGRvIHRoZSBpbnRlcmFjdGl2ZQogICAgICAgIC8vd29yay4KICAgICAgICBpZiAodXNlSW50ZXJhY3RpdmUpIHsKICAgICAgICAgICAgbm9kZSA9IGN1cnJlbnRseUFkZGluZ1NjcmlwdCB8fCBnZXRJbnRlcmFjdGl2ZVNjcmlwdCgpOwogICAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgICAgaWYgKCFuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG5vZGUuZ2V0QXR0cmlidXRlKCdkYXRhLXJlcXVpcmVtb2R1bGUnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRleHQgPSBjb250ZXh0c1tub2RlLmdldEF0dHJpYnV0ZSgnZGF0YS1yZXF1aXJlY29udGV4dCcpXTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy9BbHdheXMgc2F2ZSBvZmYgZXZhbHVhdGluZyB0aGUgZGVmIGNhbGwgdW50aWwgdGhlIHNjcmlwdCBvbmxvYWQgaGFuZGxlci4KICAgICAgICAvL1RoaXMgYWxsb3dzIG11bHRpcGxlIG1vZHVsZXMgdG8gYmUgaW4gYSBmaWxlIHdpdGhvdXQgcHJlbWF0dXJlbHkKICAgICAgICAvL3RyYWNpbmcgZGVwZW5kZW5jaWVzLCBhbmQgYWxsb3dzIGZvciBhbm9ueW1vdXMgbW9kdWxlIHN1cHBvcnQsCiAgICAgICAgLy93aGVyZSB0aGUgbW9kdWxlIG5hbWUgaXMgbm90IGtub3duIHVudGlsIHRoZSBzY3JpcHQgb25sb2FkIGV2ZW50CiAgICAgICAgLy9vY2N1cnMuIElmIG5vIGNvbnRleHQsIHVzZSB0aGUgZ2xvYmFsIHF1ZXVlLCBhbmQgZ2V0IGl0IHByb2Nlc3NlZAogICAgICAgIC8vaW4gdGhlIG9uc2NyaXB0IGxvYWQgY2FsbGJhY2suCiAgICAgICAgaWYgKGNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dC5kZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgICAgICBjb250ZXh0LmRlZlF1ZXVlTWFwW25hbWVdID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBnbG9iYWxEZWZRdWV1ZS5wdXNoKFtuYW1lLCBkZXBzLCBjYWxsYmFja10pOwogICAgICAgIH0KICAgIH07CgogICAgZGVmaW5lLmFtZCA9IHsKICAgICAgICBqUXVlcnk6IHRydWUKICAgIH07CgogICAgLyoqCiAgICAgKiBFeGVjdXRlcyB0aGUgdGV4dC4gTm9ybWFsbHkganVzdCB1c2VzIGV2YWwsIGJ1dCBjYW4gYmUgbW9kaWZpZWQKICAgICAqIHRvIHVzZSBhIGJldHRlciwgZW52aXJvbm1lbnQtc3BlY2lmaWMgY2FsbC4gT25seSB1c2VkIGZvciB0cmFuc3BpbGluZwogICAgICogbG9hZGVyIHBsdWdpbnMsIG5vdCBmb3IgcGxhaW4gSlMgbW9kdWxlcy4KICAgICAqIEBwYXJhbSB7U3RyaW5nfSB0ZXh0IHRoZSB0ZXh0IHRvIGV4ZWN1dGUvZXZhbHVhdGUuCiAgICAgKi8KICAgIHJlcS5leGVjID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAvKmpzbGludCBldmlsOiB0cnVlICovCiAgICAgICAgcmV0dXJuIGV2YWwodGV4dCk7CiAgICB9OwoKICAgIC8vU2V0IHVwIHdpdGggY29uZmlnIGluZm8uCiAgICByZXEoY2ZnKTsKfSh0aGlzLCAodHlwZW9mIHNldFRpbWVvdXQgPT09ICd1bmRlZmluZWQnID8gdW5kZWZpbmVkIDogc2V0VGltZW91dCkpKTsKCi8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi8vCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi8vICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoKIWZ1bmN0aW9uKCl7dmFyIGE9e30sYj17fSxjPXt9OyFmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBhO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109YVtjXTtyZXR1cm4gYn1mdW5jdGlvbiBkKCl7dGhpcy5fZGVsYXk9MCx0aGlzLl9lbmREZWxheT0wLHRoaXMuX2ZpbGw9Im5vbmUiLHRoaXMuX2l0ZXJhdGlvblN0YXJ0PTAsdGhpcy5faXRlcmF0aW9ucz0xLHRoaXMuX2R1cmF0aW9uPTAsdGhpcy5fcGxheWJhY2tSYXRlPTEsdGhpcy5fZGlyZWN0aW9uPSJub3JtYWwiLHRoaXMuX2Vhc2luZz0ibGluZWFyIix0aGlzLl9lYXNpbmdGdW5jdGlvbj14fWZ1bmN0aW9uIGUoKXtyZXR1cm4gYS5pc0RlcHJlY2F0ZWQoIkludmFsaWQgdGltaW5nIGlucHV0cyIsIjIwMTYtMDMtMDIiLCJUeXBlRXJyb3IgZXhjZXB0aW9ucyB3aWxsIGJlIHRocm93biBpbnN0ZWFkLiIsITApfWZ1bmN0aW9uIGYoYixjLGUpe3ZhciBmPW5ldyBkO3JldHVybiBjJiYoZi5maWxsPSJib3RoIixmLmR1cmF0aW9uPSJhdXRvIiksIm51bWJlciIhPXR5cGVvZiBifHxpc05hTihiKT92b2lkIDAhPT1iJiZPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhiKS5mb3JFYWNoKGZ1bmN0aW9uKGMpe2lmKCJhdXRvIiE9YltjXSl7aWYoKCJudW1iZXIiPT10eXBlb2YgZltjXXx8ImR1cmF0aW9uIj09YykmJigibnVtYmVyIiE9dHlwZW9mIGJbY118fGlzTmFOKGJbY10pKSlyZXR1cm47aWYoImZpbGwiPT1jJiYtMT09di5pbmRleE9mKGJbY10pKXJldHVybjtpZigiZGlyZWN0aW9uIj09YyYmLTE9PXcuaW5kZXhPZihiW2NdKSlyZXR1cm47aWYoInBsYXliYWNrUmF0ZSI9PWMmJjEhPT1iW2NdJiZhLmlzRGVwcmVjYXRlZCgiQW5pbWF0aW9uRWZmZWN0VGltaW5nLnBsYXliYWNrUmF0ZSIsIjIwMTQtMTEtMjgiLCJVc2UgQW5pbWF0aW9uLnBsYXliYWNrUmF0ZSBpbnN0ZWFkLiIpKXJldHVybjtmW2NdPWJbY119fSk6Zi5kdXJhdGlvbj1iLGZ9ZnVuY3Rpb24gZyhhKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGEmJihhPWlzTmFOKGEpP3tkdXJhdGlvbjowfTp7ZHVyYXRpb246YX0pLGF9ZnVuY3Rpb24gaChiLGMpe3JldHVybiBiPWEubnVtZXJpY1RpbWluZ1RvT2JqZWN0KGIpLGYoYixjKX1mdW5jdGlvbiBpKGEsYixjLGQpe3JldHVybiBhPDB8fGE+MXx8YzwwfHxjPjE/eDpmdW5jdGlvbihlKXtmdW5jdGlvbiBmKGEsYixjKXtyZXR1cm4gMyphKigxLWMpKigxLWMpKmMrMypiKigxLWMpKmMqYytjKmMqY31pZihlPD0wKXt2YXIgZz0wO3JldHVybiBhPjA/Zz1iL2E6IWImJmM+MCYmKGc9ZC9jKSxnKmV9aWYoZT49MSl7dmFyIGg9MDtyZXR1cm4gYzwxP2g9KGQtMSkvKGMtMSk6MT09YyYmYTwxJiYoaD0oYi0xKS8oYS0xKSksMStoKihlLTEpfWZvcih2YXIgaT0wLGo9MTtpPGo7KXt2YXIgaz0oaStqKS8yLGw9ZihhLGMsayk7aWYoTWF0aC5hYnMoZS1sKTwxZS01KXJldHVybiBmKGIsZCxrKTtsPGU/aT1rOmo9a31yZXR1cm4gZihiLGQsayl9fWZ1bmN0aW9uIGooYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7aWYoYz49MSlyZXR1cm4gMTt2YXIgZD0xL2E7cmV0dXJuKGMrPWIqZCktYyVkfX1mdW5jdGlvbiBrKGEpe0N8fChDPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlKSxDLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uPSIiLEMuYW5pbWF0aW9uVGltaW5nRnVuY3Rpb249YTt2YXIgYj1DLmFuaW1hdGlvblRpbWluZ0Z1bmN0aW9uO2lmKCIiPT1iJiZlKCkpdGhyb3cgbmV3IFR5cGVFcnJvcihhKyIgaXMgbm90IGEgdmFsaWQgdmFsdWUgZm9yIGVhc2luZyIpO3JldHVybiBifWZ1bmN0aW9uIGwoYSl7aWYoImxpbmVhciI9PWEpcmV0dXJuIHg7dmFyIGI9RS5leGVjKGEpO2lmKGIpcmV0dXJuIGkuYXBwbHkodGhpcyxiLnNsaWNlKDEpLm1hcChOdW1iZXIpKTt2YXIgYz1GLmV4ZWMoYSk7aWYoYylyZXR1cm4gaihOdW1iZXIoY1sxXSksQSk7dmFyIGQ9Ry5leGVjKGEpO3JldHVybiBkP2ooTnVtYmVyKGRbMV0pLHtzdGFydDp5LG1pZGRsZTp6LGVuZDpBfVtkWzJdXSk6QlthXXx8eH1mdW5jdGlvbiBtKGEpe3JldHVybiBNYXRoLmFicyhuKGEpL2EucGxheWJhY2tSYXRlKX1mdW5jdGlvbiBuKGEpe3JldHVybiAwPT09YS5kdXJhdGlvbnx8MD09PWEuaXRlcmF0aW9ucz8wOmEuZHVyYXRpb24qYS5pdGVyYXRpb25zfWZ1bmN0aW9uIG8oYSxiLGMpe2lmKG51bGw9PWIpcmV0dXJuIEg7dmFyIGQ9Yy5kZWxheSthK2MuZW5kRGVsYXk7cmV0dXJuIGI8TWF0aC5taW4oYy5kZWxheSxkKT9JOmI+PU1hdGgubWluKGMuZGVsYXkrYSxkKT9KOkt9ZnVuY3Rpb24gcChhLGIsYyxkLGUpe3N3aXRjaChkKXtjYXNlIEk6cmV0dXJuImJhY2t3YXJkcyI9PWJ8fCJib3RoIj09Yj8wOm51bGw7Y2FzZSBLOnJldHVybiBjLWU7Y2FzZSBKOnJldHVybiJmb3J3YXJkcyI9PWJ8fCJib3RoIj09Yj9hOm51bGw7Y2FzZSBIOnJldHVybiBudWxsfX1mdW5jdGlvbiBxKGEsYixjLGQsZSl7dmFyIGY9ZTtyZXR1cm4gMD09PWE/YiE9PUkmJihmKz1jKTpmKz1kL2EsZn1mdW5jdGlvbiByKGEsYixjLGQsZSxmKXt2YXIgZz1hPT09MS8wP2IlMTphJTE7cmV0dXJuIDAhPT1nfHxjIT09Snx8MD09PWR8fDA9PT1lJiYwIT09Znx8KGc9MSksZ31mdW5jdGlvbiBzKGEsYixjLGQpe3JldHVybiBhPT09SiYmYj09PTEvMD8xLzA6MT09PWM/TWF0aC5mbG9vcihkKS0xOk1hdGguZmxvb3IoZCl9ZnVuY3Rpb24gdChhLGIsYyl7dmFyIGQ9YTtpZigibm9ybWFsIiE9PWEmJiJyZXZlcnNlIiE9PWEpe3ZhciBlPWI7ImFsdGVybmF0ZS1yZXZlcnNlIj09PWEmJihlKz0xKSxkPSJub3JtYWwiLGUhPT0xLzAmJmUlMiE9MCYmKGQ9InJldmVyc2UiKX1yZXR1cm4ibm9ybWFsIj09PWQ/YzoxLWN9ZnVuY3Rpb24gdShhLGIsYyl7dmFyIGQ9byhhLGIsYyksZT1wKGEsYy5maWxsLGIsZCxjLmRlbGF5KTtpZihudWxsPT09ZSlyZXR1cm4gbnVsbDt2YXIgZj1xKGMuZHVyYXRpb24sZCxjLml0ZXJhdGlvbnMsZSxjLml0ZXJhdGlvblN0YXJ0KSxnPXIoZixjLml0ZXJhdGlvblN0YXJ0LGQsYy5pdGVyYXRpb25zLGUsYy5kdXJhdGlvbiksaD1zKGQsYy5pdGVyYXRpb25zLGcsZiksaT10KGMuZGlyZWN0aW9uLGgsZyk7cmV0dXJuIGMuX2Vhc2luZ0Z1bmN0aW9uKGkpfXZhciB2PSJiYWNrd2FyZHN8Zm9yd2FyZHN8Ym90aHxub25lIi5zcGxpdCgifCIpLHc9InJldmVyc2V8YWx0ZXJuYXRlfGFsdGVybmF0ZS1yZXZlcnNlIi5zcGxpdCgifCIpLHg9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9O2QucHJvdG90eXBlPXtfc2V0TWVtYmVyOmZ1bmN0aW9uKGIsYyl7dGhpc1siXyIrYl09Yyx0aGlzLl9lZmZlY3QmJih0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0W2JdPWMsdGhpcy5fZWZmZWN0Ll90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dCh0aGlzLl9lZmZlY3QuX3RpbWluZ0lucHV0KSx0aGlzLl9lZmZlY3QuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl9lZmZlY3QuX3RpbWluZyksdGhpcy5fZWZmZWN0Ll9hbmltYXRpb24mJnRoaXMuX2VmZmVjdC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBkZWxheShhKXt0aGlzLl9zZXRNZW1iZXIoImRlbGF5IixhKX0sZ2V0IGRlbGF5KCl7cmV0dXJuIHRoaXMuX2RlbGF5fSxzZXQgZW5kRGVsYXkoYSl7dGhpcy5fc2V0TWVtYmVyKCJlbmREZWxheSIsYSl9LGdldCBlbmREZWxheSgpe3JldHVybiB0aGlzLl9lbmREZWxheX0sc2V0IGZpbGwoYSl7dGhpcy5fc2V0TWVtYmVyKCJmaWxsIixhKX0sZ2V0IGZpbGwoKXtyZXR1cm4gdGhpcy5fZmlsbH0sc2V0IGl0ZXJhdGlvblN0YXJ0KGEpe2lmKChpc05hTihhKXx8YTwwKSYmZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIml0ZXJhdGlvblN0YXJ0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgbnVtYmVyLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoIml0ZXJhdGlvblN0YXJ0IixhKX0sZ2V0IGl0ZXJhdGlvblN0YXJ0KCl7cmV0dXJuIHRoaXMuX2l0ZXJhdGlvblN0YXJ0fSxzZXQgZHVyYXRpb24oYSl7aWYoImF1dG8iIT1hJiYoaXNOYU4oYSl8fGE8MCkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJkdXJhdGlvbiBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBvciBhdXRvLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoImR1cmF0aW9uIixhKX0sZ2V0IGR1cmF0aW9uKCl7cmV0dXJuIHRoaXMuX2R1cmF0aW9ufSxzZXQgZGlyZWN0aW9uKGEpe3RoaXMuX3NldE1lbWJlcigiZGlyZWN0aW9uIixhKX0sZ2V0IGRpcmVjdGlvbigpe3JldHVybiB0aGlzLl9kaXJlY3Rpb259LHNldCBlYXNpbmcoYSl7dGhpcy5fZWFzaW5nRnVuY3Rpb249bChrKGEpKSx0aGlzLl9zZXRNZW1iZXIoImVhc2luZyIsYSl9LGdldCBlYXNpbmcoKXtyZXR1cm4gdGhpcy5fZWFzaW5nfSxzZXQgaXRlcmF0aW9ucyhhKXtpZigoaXNOYU4oYSl8fGE8MCkmJmUoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJpdGVyYXRpb25zIG11c3QgYmUgbm9uLW5lZ2F0aXZlLCByZWNlaXZlZDogIithKTt0aGlzLl9zZXRNZW1iZXIoIml0ZXJhdGlvbnMiLGEpfSxnZXQgaXRlcmF0aW9ucygpe3JldHVybiB0aGlzLl9pdGVyYXRpb25zfX07dmFyIHk9MSx6PS41LEE9MCxCPXtlYXNlOmkoLjI1LC4xLC4yNSwxKSwiZWFzZS1pbiI6aSguNDIsMCwxLDEpLCJlYXNlLW91dCI6aSgwLDAsLjU4LDEpLCJlYXNlLWluLW91dCI6aSguNDIsMCwuNTgsMSksInN0ZXAtc3RhcnQiOmooMSx5KSwic3RlcC1taWRkbGUiOmooMSx6KSwic3RlcC1lbmQiOmooMSxBKX0sQz1udWxsLEQ9IlxccyooLT9cXGQrXFwuP1xcZCp8LT9cXC5cXGQrKVxccyoiLEU9bmV3IFJlZ0V4cCgiY3ViaWMtYmV6aWVyXFwoIitEKyIsIitEKyIsIitEKyIsIitEKyJcXCkiKSxGPS9zdGVwc1woXHMqKFxkKylccypcKS8sRz0vc3RlcHNcKFxzKihcZCspXHMqLFxzKihzdGFydHxtaWRkbGV8ZW5kKVxzKlwpLyxIPTAsST0xLEo9MixLPTM7YS5jbG9uZVRpbWluZ0lucHV0PWMsYS5tYWtlVGltaW5nPWYsYS5udW1lcmljVGltaW5nVG9PYmplY3Q9ZyxhLm5vcm1hbGl6ZVRpbWluZ0lucHV0PWgsYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbj1tLGEuY2FsY3VsYXRlSXRlcmF0aW9uUHJvZ3Jlc3M9dSxhLmNhbGN1bGF0ZVBoYXNlPW8sYS5ub3JtYWxpemVFYXNpbmc9ayxhLnBhcnNlRWFzaW5nRnVuY3Rpb249bH0oYSksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7cmV0dXJuIGEgaW4gaz9rW2FdW2JdfHxiOmJ9ZnVuY3Rpb24gZChhKXtyZXR1cm4iZGlzcGxheSI9PT1hfHwwPT09YS5sYXN0SW5kZXhPZigiYW5pbWF0aW9uIiwwKXx8MD09PWEubGFzdEluZGV4T2YoInRyYW5zaXRpb24iLDApfWZ1bmN0aW9uIGUoYSxiLGUpe2lmKCFkKGEpKXt2YXIgZj1oW2FdO2lmKGYpe2kuc3R5bGVbYV09Yjtmb3IodmFyIGcgaW4gZil7dmFyIGo9ZltnXSxrPWkuc3R5bGVbal07ZVtqXT1jKGosayl9fWVsc2UgZVthXT1jKGEsYil9fWZ1bmN0aW9uIGYoYSl7dmFyIGI9W107Zm9yKHZhciBjIGluIGEpaWYoIShjIGluWyJlYXNpbmciLCJvZmZzZXQiLCJjb21wb3NpdGUiXSkpe3ZhciBkPWFbY107QXJyYXkuaXNBcnJheShkKXx8KGQ9W2RdKTtmb3IodmFyIGUsZj1kLmxlbmd0aCxnPTA7ZzxmO2crKyllPXt9LGUub2Zmc2V0PSJvZmZzZXQiaW4gYT9hLm9mZnNldDoxPT1mPzE6Zy8oZi0xKSwiZWFzaW5nImluIGEmJihlLmVhc2luZz1hLmVhc2luZyksImNvbXBvc2l0ZSJpbiBhJiYoZS5jb21wb3NpdGU9YS5jb21wb3NpdGUpLGVbY109ZFtnXSxiLnB1c2goZSl9cmV0dXJuIGIuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLm9mZnNldC1iLm9mZnNldH0pLGJ9ZnVuY3Rpb24gZyhiKXtmdW5jdGlvbiBjKCl7dmFyIGE9ZC5sZW5ndGg7bnVsbD09ZFthLTFdLm9mZnNldCYmKGRbYS0xXS5vZmZzZXQ9MSksYT4xJiZudWxsPT1kWzBdLm9mZnNldCYmKGRbMF0ub2Zmc2V0PTApO2Zvcih2YXIgYj0wLGM9ZFswXS5vZmZzZXQsZT0xO2U8YTtlKyspe3ZhciBmPWRbZV0ub2Zmc2V0O2lmKG51bGwhPWYpe2Zvcih2YXIgZz0xO2c8ZS1iO2crKylkW2IrZ10ub2Zmc2V0PWMrKGYtYykqZy8oZS1iKTtiPWUsYz1mfX19aWYobnVsbD09YilyZXR1cm5bXTt3aW5kb3cuU3ltYm9sJiZTeW1ib2wuaXRlcmF0b3ImJkFycmF5LnByb3RvdHlwZS5mcm9tJiZiW1N5bWJvbC5pdGVyYXRvcl0mJihiPUFycmF5LmZyb20oYikpLEFycmF5LmlzQXJyYXkoYil8fChiPWYoYikpO2Zvcih2YXIgZD1iLm1hcChmdW5jdGlvbihiKXt2YXIgYz17fTtmb3IodmFyIGQgaW4gYil7dmFyIGY9YltkXTtpZigib2Zmc2V0Ij09ZCl7aWYobnVsbCE9Zil7aWYoZj1OdW1iZXIoZiksIWlzRmluaXRlKGYpKXRocm93IG5ldyBUeXBlRXJyb3IoIktleWZyYW1lIG9mZnNldHMgbXVzdCBiZSBudW1iZXJzLiIpO2lmKGY8MHx8Zj4xKXRocm93IG5ldyBUeXBlRXJyb3IoIktleWZyYW1lIG9mZnNldHMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEuIil9fWVsc2UgaWYoImNvbXBvc2l0ZSI9PWQpe2lmKCJhZGQiPT1mfHwiYWNjdW11bGF0ZSI9PWYpdGhyb3d7dHlwZTpET01FeGNlcHRpb24uTk9UX1NVUFBPUlRFRF9FUlIsbmFtZToiTm90U3VwcG9ydGVkRXJyb3IiLG1lc3NhZ2U6ImFkZCBjb21wb3NpdGluZyBpcyBub3Qgc3VwcG9ydGVkIn07aWYoInJlcGxhY2UiIT1mKXRocm93IG5ldyBUeXBlRXJyb3IoIkludmFsaWQgY29tcG9zaXRlIG1vZGUgIitmKyIuIil9ZWxzZSBmPSJlYXNpbmciPT1kP2Eubm9ybWFsaXplRWFzaW5nKGYpOiIiK2Y7ZShkLGYsYyl9cmV0dXJuIHZvaWQgMD09Yy5vZmZzZXQmJihjLm9mZnNldD1udWxsKSx2b2lkIDA9PWMuZWFzaW5nJiYoYy5lYXNpbmc9ImxpbmVhciIpLGN9KSxnPSEwLGg9LTEvMCxpPTA7aTxkLmxlbmd0aDtpKyspe3ZhciBqPWRbaV0ub2Zmc2V0O2lmKG51bGwhPWope2lmKGo8aCl0aHJvdyBuZXcgVHlwZUVycm9yKCJLZXlmcmFtZXMgYXJlIG5vdCBsb29zZWx5IHNvcnRlZCBieSBvZmZzZXQuIFNvcnQgb3Igc3BlY2lmeSBvZmZzZXRzLiIpO2g9an1lbHNlIGc9ITF9cmV0dXJuIGQ9ZC5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEub2Zmc2V0Pj0wJiZhLm9mZnNldDw9MX0pLGd8fGMoKSxkfXZhciBoPXtiYWNrZ3JvdW5kOlsiYmFja2dyb3VuZEltYWdlIiwiYmFja2dyb3VuZFBvc2l0aW9uIiwiYmFja2dyb3VuZFNpemUiLCJiYWNrZ3JvdW5kUmVwZWF0IiwiYmFja2dyb3VuZEF0dGFjaG1lbnQiLCJiYWNrZ3JvdW5kT3JpZ2luIiwiYmFja2dyb3VuZENsaXAiLCJiYWNrZ3JvdW5kQ29sb3IiXSxib3JkZXI6WyJib3JkZXJUb3BDb2xvciIsImJvcmRlclRvcFN0eWxlIiwiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJSaWdodENvbG9yIiwiYm9yZGVyUmlnaHRTdHlsZSIsImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJCb3R0b21Db2xvciIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tV2lkdGgiLCJib3JkZXJMZWZ0Q29sb3IiLCJib3JkZXJMZWZ0U3R5bGUiLCJib3JkZXJMZWZ0V2lkdGgiXSxib3JkZXJCb3R0b206WyJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckJvdHRvbVN0eWxlIiwiYm9yZGVyQm90dG9tQ29sb3IiXSxib3JkZXJDb2xvcjpbImJvcmRlclRvcENvbG9yIiwiYm9yZGVyUmlnaHRDb2xvciIsImJvcmRlckJvdHRvbUNvbG9yIiwiYm9yZGVyTGVmdENvbG9yIl0sYm9yZGVyTGVmdDpbImJvcmRlckxlZnRXaWR0aCIsImJvcmRlckxlZnRTdHlsZSIsImJvcmRlckxlZnRDb2xvciJdLGJvcmRlclJhZGl1czpbImJvcmRlclRvcExlZnRSYWRpdXMiLCJib3JkZXJUb3BSaWdodFJhZGl1cyIsImJvcmRlckJvdHRvbVJpZ2h0UmFkaXVzIiwiYm9yZGVyQm90dG9tTGVmdFJhZGl1cyJdLGJvcmRlclJpZ2h0OlsiYm9yZGVyUmlnaHRXaWR0aCIsImJvcmRlclJpZ2h0U3R5bGUiLCJib3JkZXJSaWdodENvbG9yIl0sYm9yZGVyVG9wOlsiYm9yZGVyVG9wV2lkdGgiLCJib3JkZXJUb3BTdHlsZSIsImJvcmRlclRvcENvbG9yIl0sYm9yZGVyV2lkdGg6WyJib3JkZXJUb3BXaWR0aCIsImJvcmRlclJpZ2h0V2lkdGgiLCJib3JkZXJCb3R0b21XaWR0aCIsImJvcmRlckxlZnRXaWR0aCJdLGZsZXg6WyJmbGV4R3JvdyIsImZsZXhTaHJpbmsiLCJmbGV4QmFzaXMiXSxmb250OlsiZm9udEZhbWlseSIsImZvbnRTaXplIiwiZm9udFN0eWxlIiwiZm9udFZhcmlhbnQiLCJmb250V2VpZ2h0IiwibGluZUhlaWdodCJdLG1hcmdpbjpbIm1hcmdpblRvcCIsIm1hcmdpblJpZ2h0IiwibWFyZ2luQm90dG9tIiwibWFyZ2luTGVmdCJdLG91dGxpbmU6WyJvdXRsaW5lQ29sb3IiLCJvdXRsaW5lU3R5bGUiLCJvdXRsaW5lV2lkdGgiXSxwYWRkaW5nOlsicGFkZGluZ1RvcCIsInBhZGRpbmdSaWdodCIsInBhZGRpbmdCb3R0b20iLCJwYWRkaW5nTGVmdCJdfSxpPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImRpdiIpLGo9e3RoaW46IjFweCIsbWVkaXVtOiIzcHgiLHRoaWNrOiI1cHgifSxrPXtib3JkZXJCb3R0b21XaWR0aDpqLGJvcmRlckxlZnRXaWR0aDpqLGJvcmRlclJpZ2h0V2lkdGg6aixib3JkZXJUb3BXaWR0aDpqLGZvbnRTaXplOnsieHgtc21hbGwiOiI2MCUiLCJ4LXNtYWxsIjoiNzUlIixzbWFsbDoiODklIixtZWRpdW06IjEwMCUiLGxhcmdlOiIxMjAlIiwieC1sYXJnZSI6IjE1MCUiLCJ4eC1sYXJnZSI6IjIwMCUifSxmb250V2VpZ2h0Ontub3JtYWw6IjQwMCIsYm9sZDoiNzAwIn0sb3V0bGluZVdpZHRoOmosdGV4dFNoYWRvdzp7bm9uZToiMHB4IDBweCAwcHggdHJhbnNwYXJlbnQifSxib3hTaGFkb3c6e25vbmU6IjBweCAwcHggMHB4IDBweCB0cmFuc3BhcmVudCJ9fTthLmNvbnZlcnRUb0FycmF5Rm9ybT1mLGEubm9ybWFsaXplS2V5ZnJhbWVzPWd9KGEpLGZ1bmN0aW9uKGEpe3ZhciBiPXt9O2EuaXNEZXByZWNhdGVkPWZ1bmN0aW9uKGEsYyxkLGUpe3ZhciBmPWU/ImFyZSI6ImlzIixnPW5ldyBEYXRlLGg9bmV3IERhdGUoYyk7cmV0dXJuIGguc2V0TW9udGgoaC5nZXRNb250aCgpKzMpLCEoZzxoJiYoYSBpbiBifHxjb25zb2xlLndhcm4oIldlYiBBbmltYXRpb25zOiAiK2ErIiAiK2YrIiBkZXByZWNhdGVkIGFuZCB3aWxsIHN0b3Agd29ya2luZyBvbiAiK2gudG9EYXRlU3RyaW5nKCkrIi4gIitkKSxiW2FdPSEwLDEpKX0sYS5kZXByZWNhdGVkPWZ1bmN0aW9uKGIsYyxkLGUpe3ZhciBmPWU/ImFyZSI6ImlzIjtpZihhLmlzRGVwcmVjYXRlZChiLGMsZCxlKSl0aHJvdyBuZXcgRXJyb3IoYisiICIrZisiIG5vIGxvbmdlciBzdXBwb3J0ZWQuICIrZCl9fShhKSxmdW5jdGlvbigpe2lmKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5hbmltYXRlKXt2YXIgYz1kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuYW5pbWF0ZShbXSwwKSxkPSEwO2lmKGMmJihkPSExLCJwbGF5fGN1cnJlbnRUaW1lfHBhdXNlfHJldmVyc2V8cGxheWJhY2tSYXRlfGNhbmNlbHxmaW5pc2h8c3RhcnRUaW1lfHBsYXlTdGF0ZSIuc3BsaXQoInwiKS5mb3JFYWNoKGZ1bmN0aW9uKGEpe3ZvaWQgMD09PWNbYV0mJihkPSEwKX0pKSwhZClyZXR1cm59IWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe2Zvcih2YXIgYj17fSxjPTA7YzxhLmxlbmd0aDtjKyspZm9yKHZhciBkIGluIGFbY10paWYoIm9mZnNldCIhPWQmJiJlYXNpbmciIT1kJiYiY29tcG9zaXRlIiE9ZCl7dmFyIGU9e29mZnNldDphW2NdLm9mZnNldCxlYXNpbmc6YVtjXS5lYXNpbmcsdmFsdWU6YVtjXVtkXX07YltkXT1iW2RdfHxbXSxiW2RdLnB1c2goZSl9Zm9yKHZhciBmIGluIGIpe3ZhciBnPWJbZl07aWYoMCE9Z1swXS5vZmZzZXR8fDEhPWdbZy5sZW5ndGgtMV0ub2Zmc2V0KXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLk5PVF9TVVBQT1JURURfRVJSLG5hbWU6Ik5vdFN1cHBvcnRlZEVycm9yIixtZXNzYWdlOiJQYXJ0aWFsIGtleWZyYW1lcyBhcmUgbm90IHN1cHBvcnRlZCJ9fXJldHVybiBifWZ1bmN0aW9uIGUoYyl7dmFyIGQ9W107Zm9yKHZhciBlIGluIGMpZm9yKHZhciBmPWNbZV0sZz0wO2c8Zi5sZW5ndGgtMTtnKyspe3ZhciBoPWcsaT1nKzEsaj1mW2hdLm9mZnNldCxrPWZbaV0ub2Zmc2V0LGw9aixtPWs7MD09ZyYmKGw9LTEvMCwwPT1rJiYoaT1oKSksZz09Zi5sZW5ndGgtMiYmKG09MS8wLDE9PWomJihoPWkpKSxkLnB1c2goe2FwcGx5RnJvbTpsLGFwcGx5VG86bSxzdGFydE9mZnNldDpmW2hdLm9mZnNldCxlbmRPZmZzZXQ6ZltpXS5vZmZzZXQsZWFzaW5nRnVuY3Rpb246YS5wYXJzZUVhc2luZ0Z1bmN0aW9uKGZbaF0uZWFzaW5nKSxwcm9wZXJ0eTplLGludGVycG9sYXRpb246Yi5wcm9wZXJ0eUludGVycG9sYXRpb24oZSxmW2hdLnZhbHVlLGZbaV0udmFsdWUpfSl9cmV0dXJuIGQuc29ydChmdW5jdGlvbihhLGIpe3JldHVybiBhLnN0YXJ0T2Zmc2V0LWIuc3RhcnRPZmZzZXR9KSxkfWIuY29udmVydEVmZmVjdElucHV0PWZ1bmN0aW9uKGMpe3ZhciBmPWEubm9ybWFsaXplS2V5ZnJhbWVzKGMpLGc9ZChmKSxoPWUoZyk7cmV0dXJuIGZ1bmN0aW9uKGEsYyl7aWYobnVsbCE9YyloLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gYz49YS5hcHBseUZyb20mJmM8YS5hcHBseVRvfSkuZm9yRWFjaChmdW5jdGlvbihkKXt2YXIgZT1jLWQuc3RhcnRPZmZzZXQsZj1kLmVuZE9mZnNldC1kLnN0YXJ0T2Zmc2V0LGc9MD09Zj8wOmQuZWFzaW5nRnVuY3Rpb24oZS9mKTtiLmFwcGx5KGEsZC5wcm9wZXJ0eSxkLmludGVycG9sYXRpb24oZykpfSk7ZWxzZSBmb3IodmFyIGQgaW4gZykib2Zmc2V0IiE9ZCYmImVhc2luZyIhPWQmJiJjb21wb3NpdGUiIT1kJiZiLmNsZWFyKGEsZCl9fX0oYSxiKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXtyZXR1cm4gYS5yZXBsYWNlKC8tKC4pL2csZnVuY3Rpb24oYSxiKXtyZXR1cm4gYi50b1VwcGVyQ2FzZSgpfSl9ZnVuY3Rpb24gZShhLGIsYyl7aFtjXT1oW2NdfHxbXSxoW2NdLnB1c2goW2EsYl0pfWZ1bmN0aW9uIGYoYSxiLGMpe2Zvcih2YXIgZj0wO2Y8Yy5sZW5ndGg7ZisrKXtlKGEsYixkKGNbZl0pKX19ZnVuY3Rpb24gZyhjLGUsZil7dmFyIGc9YzsvLS8udGVzdChjKSYmIWEuaXNEZXByZWNhdGVkKCJIeXBoZW5hdGVkIHByb3BlcnR5IG5hbWVzIiwiMjAxNi0wMy0yMiIsIlVzZSBjYW1lbENhc2UgaW5zdGVhZC4iLCEwKSYmKGc9ZChjKSksImluaXRpYWwiIT1lJiYiaW5pdGlhbCIhPWZ8fCgiaW5pdGlhbCI9PWUmJihlPWlbZ10pLCJpbml0aWFsIj09ZiYmKGY9aVtnXSkpO2Zvcih2YXIgaj1lPT1mP1tdOmhbZ10saz0wO2omJms8ai5sZW5ndGg7aysrKXt2YXIgbD1qW2tdWzBdKGUpLG09altrXVswXShmKTtpZih2b2lkIDAhPT1sJiZ2b2lkIDAhPT1tKXt2YXIgbj1qW2tdWzFdKGwsbSk7aWYobil7dmFyIG89Yi5JbnRlcnBvbGF0aW9uLmFwcGx5KG51bGwsbik7cmV0dXJuIGZ1bmN0aW9uKGEpe3JldHVybiAwPT1hP2U6MT09YT9mOm8oYSl9fX19cmV0dXJuIGIuSW50ZXJwb2xhdGlvbighMSwhMCxmdW5jdGlvbihhKXtyZXR1cm4gYT9mOmV9KX12YXIgaD17fTtiLmFkZFByb3BlcnRpZXNIYW5kbGVyPWY7dmFyIGk9e2JhY2tncm91bmRDb2xvcjoidHJhbnNwYXJlbnQiLGJhY2tncm91bmRQb3NpdGlvbjoiMCUgMCUiLGJvcmRlckJvdHRvbUNvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlckJvdHRvbUxlZnRSYWRpdXM6IjBweCIsYm9yZGVyQm90dG9tUmlnaHRSYWRpdXM6IjBweCIsYm9yZGVyQm90dG9tV2lkdGg6IjNweCIsYm9yZGVyTGVmdENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlckxlZnRXaWR0aDoiM3B4Iixib3JkZXJSaWdodENvbG9yOiJjdXJyZW50Q29sb3IiLGJvcmRlclJpZ2h0V2lkdGg6IjNweCIsYm9yZGVyU3BhY2luZzoiMnB4Iixib3JkZXJUb3BDb2xvcjoiY3VycmVudENvbG9yIixib3JkZXJUb3BMZWZ0UmFkaXVzOiIwcHgiLGJvcmRlclRvcFJpZ2h0UmFkaXVzOiIwcHgiLGJvcmRlclRvcFdpZHRoOiIzcHgiLGJvdHRvbToiYXV0byIsY2xpcDoicmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpIixjb2xvcjoiYmxhY2siLGZvbnRTaXplOiIxMDAlIixmb250V2VpZ2h0OiI0MDAiLGhlaWdodDoiYXV0byIsbGVmdDoiYXV0byIsbGV0dGVyU3BhY2luZzoibm9ybWFsIixsaW5lSGVpZ2h0OiIxMjAlIixtYXJnaW5Cb3R0b206IjBweCIsbWFyZ2luTGVmdDoiMHB4IixtYXJnaW5SaWdodDoiMHB4IixtYXJnaW5Ub3A6IjBweCIsbWF4SGVpZ2h0OiJub25lIixtYXhXaWR0aDoibm9uZSIsbWluSGVpZ2h0OiIwcHgiLG1pbldpZHRoOiIwcHgiLG9wYWNpdHk6IjEuMCIsb3V0bGluZUNvbG9yOiJpbnZlcnQiLG91dGxpbmVPZmZzZXQ6IjBweCIsb3V0bGluZVdpZHRoOiIzcHgiLHBhZGRpbmdCb3R0b206IjBweCIscGFkZGluZ0xlZnQ6IjBweCIscGFkZGluZ1JpZ2h0OiIwcHgiLHBhZGRpbmdUb3A6IjBweCIscmlnaHQ6ImF1dG8iLHN0cm9rZURhc2hhcnJheToibm9uZSIsc3Ryb2tlRGFzaG9mZnNldDoiMHB4Iix0ZXh0SW5kZW50OiIwcHgiLHRleHRTaGFkb3c6IjBweCAwcHggMHB4IHRyYW5zcGFyZW50Iix0b3A6ImF1dG8iLHRyYW5zZm9ybToiIix2ZXJ0aWNhbEFsaWduOiIwcHgiLHZpc2liaWxpdHk6InZpc2libGUiLHdpZHRoOiJhdXRvIix3b3JkU3BhY2luZzoibm9ybWFsIix6SW5kZXg6ImF1dG8ifTtiLnByb3BlcnR5SW50ZXJwb2xhdGlvbj1nfShhLGIpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGIpe3ZhciBjPWEuY2FsY3VsYXRlQWN0aXZlRHVyYXRpb24oYiksZD1mdW5jdGlvbihkKXtyZXR1cm4gYS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcyhjLGQsYil9O3JldHVybiBkLl90b3RhbER1cmF0aW9uPWIuZGVsYXkrYytiLmVuZERlbGF5LGR9Yi5LZXlmcmFtZUVmZmVjdD1mdW5jdGlvbihjLGUsZixnKXt2YXIgaCxpPWQoYS5ub3JtYWxpemVUaW1pbmdJbnB1dChmKSksaj1iLmNvbnZlcnRFZmZlY3RJbnB1dChlKSxrPWZ1bmN0aW9uKCl7aihjLGgpfTtyZXR1cm4gay5fdXBkYXRlPWZ1bmN0aW9uKGEpe3JldHVybiBudWxsIT09KGg9aShhKSl9LGsuX2NsZWFyPWZ1bmN0aW9uKCl7aihjLG51bGwpfSxrLl9oYXNTYW1lVGFyZ2V0PWZ1bmN0aW9uKGEpe3JldHVybiBjPT09YX0say5fdGFyZ2V0PWMsay5fdG90YWxEdXJhdGlvbj1pLl90b3RhbER1cmF0aW9uLGsuX2lkPWcsa319KGEsYiksZnVuY3Rpb24oYSxiKXthLmFwcGx5PWZ1bmN0aW9uKGIsYyxkKXtiLnN0eWxlW2EucHJvcGVydHlOYW1lKGMpXT1kfSxhLmNsZWFyPWZ1bmN0aW9uKGIsYyl7Yi5zdHlsZVthLnByb3BlcnR5TmFtZShjKV09IiJ9fShiKSxmdW5jdGlvbihhKXt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihiLGMpe3ZhciBkPSIiO3JldHVybiBjJiZjLmlkJiYoZD1jLmlkKSxhLnRpbWVsaW5lLl9wbGF5KGEuS2V5ZnJhbWVFZmZlY3QodGhpcyxiLGMsZCkpfX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYixkKXtpZigibnVtYmVyIj09dHlwZW9mIGEmJiJudW1iZXIiPT10eXBlb2YgYilyZXR1cm4gYSooMS1kKStiKmQ7aWYoImJvb2xlYW4iPT10eXBlb2YgYSYmImJvb2xlYW4iPT10eXBlb2YgYilyZXR1cm4gZDwuNT9hOmI7aWYoYS5sZW5ndGg9PWIubGVuZ3RoKXtmb3IodmFyIGU9W10sZj0wO2Y8YS5sZW5ndGg7ZisrKWUucHVzaChjKGFbZl0sYltmXSxkKSk7cmV0dXJuIGV9dGhyb3ciTWlzbWF0Y2hlZCBpbnRlcnBvbGF0aW9uIGFyZ3VtZW50cyAiK2ErIjoiK2J9YS5JbnRlcnBvbGF0aW9uPWZ1bmN0aW9uKGEsYixkKXtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGQoYyhhLGIsZSkpfX19KGIpLGZ1bmN0aW9uKGEsYixjKXthLnNlcXVlbmNlTnVtYmVyPTA7dmFyIGQ9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJmaW5pc2giLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX07Yi5BbmltYXRpb249ZnVuY3Rpb24oYil7dGhpcy5pZD0iIixiJiZiLl9pZCYmKHRoaXMuaWQ9Yi5faWQpLHRoaXMuX3NlcXVlbmNlTnVtYmVyPWEuc2VxdWVuY2VOdW1iZXIrKyx0aGlzLl9jdXJyZW50VGltZT0wLHRoaXMuX3N0YXJ0VGltZT1udWxsLHRoaXMuX3BhdXNlZD0hMSx0aGlzLl9wbGF5YmFja1JhdGU9MSx0aGlzLl9pblRpbWVsaW5lPSEwLHRoaXMuX2ZpbmlzaGVkRmxhZz0hMCx0aGlzLm9uZmluaXNoPW51bGwsdGhpcy5fZmluaXNoSGFuZGxlcnM9W10sdGhpcy5fZWZmZWN0PWIsdGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoMCksdGhpcy5faWRsZT0hMCx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITF9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X2Vuc3VyZUFsaXZlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGU8MCYmMD09PXRoaXMuY3VycmVudFRpbWU/dGhpcy5faW5FZmZlY3Q9dGhpcy5fZWZmZWN0Ll91cGRhdGUoLTEpOnRoaXMuX2luRWZmZWN0PXRoaXMuX2VmZmVjdC5fdXBkYXRlKHRoaXMuY3VycmVudFRpbWUpLHRoaXMuX2luVGltZWxpbmV8fCF0aGlzLl9pbkVmZmVjdCYmdGhpcy5fZmluaXNoZWRGbGFnfHwodGhpcy5faW5UaW1lbGluZT0hMCxiLnRpbWVsaW5lLl9hbmltYXRpb25zLnB1c2godGhpcykpfSxfdGlja0N1cnJlbnRUaW1lOmZ1bmN0aW9uKGEsYil7YSE9dGhpcy5fY3VycmVudFRpbWUmJih0aGlzLl9jdXJyZW50VGltZT1hLHRoaXMuX2lzRmluaXNoZWQmJiFiJiYodGhpcy5fY3VycmVudFRpbWU9dGhpcy5fcGxheWJhY2tSYXRlPjA/dGhpcy5fdG90YWxEdXJhdGlvbjowKSx0aGlzLl9lbnN1cmVBbGl2ZSgpKX0sZ2V0IGN1cnJlbnRUaW1lKCl7cmV0dXJuIHRoaXMuX2lkbGV8fHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz9udWxsOnRoaXMuX2N1cnJlbnRUaW1lfSxzZXQgY3VycmVudFRpbWUoYSl7YT0rYSxpc05hTihhKXx8KGIucmVzdGFydCgpLHRoaXMuX3BhdXNlZHx8bnVsbD09dGhpcy5fc3RhcnRUaW1lfHwodGhpcy5fc3RhcnRUaW1lPXRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLWEvdGhpcy5fcGxheWJhY2tSYXRlKSx0aGlzLl9jdXJyZW50VGltZVBlbmRpbmc9ITEsdGhpcy5fY3VycmVudFRpbWUhPWEmJih0aGlzLl9pZGxlJiYodGhpcy5faWRsZT0hMSx0aGlzLl9wYXVzZWQ9ITApLHRoaXMuX3RpY2tDdXJyZW50VGltZShhLCEwKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSkpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX3N0YXJ0VGltZX0sc2V0IHN0YXJ0VGltZShhKXthPSthLGlzTmFOKGEpfHx0aGlzLl9wYXVzZWR8fHRoaXMuX2lkbGV8fCh0aGlzLl9zdGFydFRpbWU9YSx0aGlzLl90aWNrQ3VycmVudFRpbWUoKHRoaXMuX3RpbWVsaW5lLmN1cnJlbnRUaW1lLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKHRoaXMpKX0sZ2V0IHBsYXliYWNrUmF0ZSgpe3JldHVybiB0aGlzLl9wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7aWYoYSE9dGhpcy5fcGxheWJhY2tSYXRlKXt2YXIgYz10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX3BsYXliYWNrUmF0ZT1hLHRoaXMuX3N0YXJ0VGltZT1udWxsLCJwYXVzZWQiIT10aGlzLnBsYXlTdGF0ZSYmImlkbGUiIT10aGlzLnBsYXlTdGF0ZSYmKHRoaXMuX2ZpbmlzaGVkRmxhZz0hMSx0aGlzLl9pZGxlPSExLHRoaXMuX2Vuc3VyZUFsaXZlKCksYi5hcHBseURpcnRpZWRBbmltYXRpb24odGhpcykpLG51bGwhPWMmJih0aGlzLmN1cnJlbnRUaW1lPWMpfX0sZ2V0IF9pc0ZpbmlzaGVkKCl7cmV0dXJuIXRoaXMuX2lkbGUmJih0aGlzLl9wbGF5YmFja1JhdGU+MCYmdGhpcy5fY3VycmVudFRpbWU+PXRoaXMuX3RvdGFsRHVyYXRpb258fHRoaXMuX3BsYXliYWNrUmF0ZTwwJiZ0aGlzLl9jdXJyZW50VGltZTw9MCl9LGdldCBfdG90YWxEdXJhdGlvbigpe3JldHVybiB0aGlzLl9lZmZlY3QuX3RvdGFsRHVyYXRpb259LGdldCBwbGF5U3RhdGUoKXtyZXR1cm4gdGhpcy5faWRsZT8iaWRsZSI6bnVsbD09dGhpcy5fc3RhcnRUaW1lJiYhdGhpcy5fcGF1c2VkJiYwIT10aGlzLnBsYXliYWNrUmF0ZXx8dGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPyJwZW5kaW5nIjp0aGlzLl9wYXVzZWQ/InBhdXNlZCI6dGhpcy5faXNGaW5pc2hlZD8iZmluaXNoZWQiOiJydW5uaW5nIn0sX3Jld2luZDpmdW5jdGlvbigpe2lmKHRoaXMuX3BsYXliYWNrUmF0ZT49MCl0aGlzLl9jdXJyZW50VGltZT0wO2Vsc2V7aWYoISh0aGlzLl90b3RhbER1cmF0aW9uPDEvMCkpdGhyb3cgbmV3IERPTUV4Y2VwdGlvbigiVW5hYmxlIHRvIHJld2luZCBuZWdhdGl2ZSBwbGF5YmFjayByYXRlIGFuaW1hdGlvbiB3aXRoIGluZmluaXRlIGR1cmF0aW9uIiwiSW52YWxpZFN0YXRlRXJyb3IiKTt0aGlzLl9jdXJyZW50VGltZT10aGlzLl90b3RhbER1cmF0aW9ufX0scGxheTpmdW5jdGlvbigpe3RoaXMuX3BhdXNlZD0hMSwodGhpcy5faXNGaW5pc2hlZHx8dGhpcy5faWRsZSkmJih0aGlzLl9yZXdpbmQoKSx0aGlzLl9zdGFydFRpbWU9bnVsbCksdGhpcy5fZmluaXNoZWRGbGFnPSExLHRoaXMuX2lkbGU9ITEsdGhpcy5fZW5zdXJlQWxpdmUoKSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLl9pc0ZpbmlzaGVkfHx0aGlzLl9wYXVzZWR8fHRoaXMuX2lkbGU/dGhpcy5faWRsZSYmKHRoaXMuX3Jld2luZCgpLHRoaXMuX2lkbGU9ITEpOnRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMCx0aGlzLl9zdGFydFRpbWU9bnVsbCx0aGlzLl9wYXVzZWQ9ITB9LGZpbmlzaDpmdW5jdGlvbigpe3RoaXMuX2lkbGV8fCh0aGlzLmN1cnJlbnRUaW1lPXRoaXMuX3BsYXliYWNrUmF0ZT4wP3RoaXMuX3RvdGFsRHVyYXRpb246MCx0aGlzLl9zdGFydFRpbWU9dGhpcy5fdG90YWxEdXJhdGlvbi10aGlzLmN1cnJlbnRUaW1lLHRoaXMuX2N1cnJlbnRUaW1lUGVuZGluZz0hMSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbih0aGlzKSl9LGNhbmNlbDpmdW5jdGlvbigpe3RoaXMuX2luRWZmZWN0JiYodGhpcy5faW5FZmZlY3Q9ITEsdGhpcy5faWRsZT0hMCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fZmluaXNoZWRGbGFnPSEwLHRoaXMuX2N1cnJlbnRUaW1lPTAsdGhpcy5fc3RhcnRUaW1lPW51bGwsdGhpcy5fZWZmZWN0Ll91cGRhdGUobnVsbCksYi5hcHBseURpcnRpZWRBbmltYXRpb24odGhpcykpfSxyZXZlcnNlOmZ1bmN0aW9uKCl7dGhpcy5wbGF5YmFja1JhdGUqPS0xLHRoaXMucGxheSgpfSxhZGRFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7ImZ1bmN0aW9uIj09dHlwZW9mIGImJiJmaW5pc2giPT1hJiZ0aGlzLl9maW5pc2hIYW5kbGVycy5wdXNoKGIpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7aWYoImZpbmlzaCI9PWEpe3ZhciBjPXRoaXMuX2ZpbmlzaEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fZmluaXNoSGFuZGxlcnMuc3BsaWNlKGMsMSl9fSxfZmlyZUV2ZW50czpmdW5jdGlvbihhKXtpZih0aGlzLl9pc0ZpbmlzaGVkKXtpZighdGhpcy5fZmluaXNoZWRGbGFnKXt2YXIgYj1uZXcgZCh0aGlzLHRoaXMuX2N1cnJlbnRUaW1lLGEpLGM9dGhpcy5fZmluaXNoSGFuZGxlcnMuY29uY2F0KHRoaXMub25maW5pc2g/W3RoaXMub25maW5pc2hdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yy5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChiLnRhcmdldCxiKX0pfSwwKSx0aGlzLl9maW5pc2hlZEZsYWc9ITB9fWVsc2UgdGhpcy5fZmluaXNoZWRGbGFnPSExfSxfdGljazpmdW5jdGlvbihhLGIpe3RoaXMuX2lkbGV8fHRoaXMuX3BhdXNlZHx8KG51bGw9PXRoaXMuX3N0YXJ0VGltZT9iJiYodGhpcy5zdGFydFRpbWU9YS10aGlzLl9jdXJyZW50VGltZS90aGlzLnBsYXliYWNrUmF0ZSk6dGhpcy5faXNGaW5pc2hlZHx8dGhpcy5fdGlja0N1cnJlbnRUaW1lKChhLXRoaXMuX3N0YXJ0VGltZSkqdGhpcy5wbGF5YmFja1JhdGUpKSxiJiYodGhpcy5fY3VycmVudFRpbWVQZW5kaW5nPSExLHRoaXMuX2ZpcmVFdmVudHMoYSkpfSxnZXQgX25lZWRzVGljaygpe3JldHVybiB0aGlzLnBsYXlTdGF0ZSBpbntwZW5kaW5nOjEscnVubmluZzoxfXx8IXRoaXMuX2ZpbmlzaGVkRmxhZ30sX3RhcmdldEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl9lZmZlY3QuX3RhcmdldDtyZXR1cm4gYS5fYWN0aXZlQW5pbWF0aW9uc3x8KGEuX2FjdGl2ZUFuaW1hdGlvbnM9W10pLGEuX2FjdGl2ZUFuaW1hdGlvbnN9LF9tYXJrVGFyZ2V0OmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fdGFyZ2V0QW5pbWF0aW9ucygpOy0xPT09YS5pbmRleE9mKHRoaXMpJiZhLnB1c2godGhpcyl9LF91bm1hcmtUYXJnZXQ6ZnVuY3Rpb24oKXt2YXIgYT10aGlzLl90YXJnZXRBbmltYXRpb25zKCksYj1hLmluZGV4T2YodGhpcyk7LTEhPT1iJiZhLnNwbGljZShiLDEpfX19KGEsYiksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSl7dmFyIGI9ajtqPVtdLGE8cS5jdXJyZW50VGltZSYmKGE9cS5jdXJyZW50VGltZSkscS5fYW5pbWF0aW9ucy5zb3J0KGUpLHEuX2FuaW1hdGlvbnM9aChhLCEwLHEuX2FuaW1hdGlvbnMpWzBdLGIuZm9yRWFjaChmdW5jdGlvbihiKXtiWzFdKGEpfSksZygpLGw9dm9pZCAwfWZ1bmN0aW9uIGUoYSxiKXtyZXR1cm4gYS5fc2VxdWVuY2VOdW1iZXItYi5fc2VxdWVuY2VOdW1iZXJ9ZnVuY3Rpb24gZigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT13aW5kb3cucGVyZm9ybWFuY2UmJnBlcmZvcm1hbmNlLm5vdz9wZXJmb3JtYW5jZS5ub3coKTowfWZ1bmN0aW9uIGcoKXtvLmZvckVhY2goZnVuY3Rpb24oYSl7YSgpfSksby5sZW5ndGg9MH1mdW5jdGlvbiBoKGEsYyxkKXtwPSEwLG49ITEsYi50aW1lbGluZS5jdXJyZW50VGltZT1hLG09ITE7dmFyIGU9W10sZj1bXSxnPVtdLGg9W107cmV0dXJuIGQuZm9yRWFjaChmdW5jdGlvbihiKXtiLl90aWNrKGEsYyksYi5faW5FZmZlY3Q/KGYucHVzaChiLl9lZmZlY3QpLGIuX21hcmtUYXJnZXQoKSk6KGUucHVzaChiLl9lZmZlY3QpLGIuX3VubWFya1RhcmdldCgpKSxiLl9uZWVkc1RpY2smJihtPSEwKTt2YXIgZD1iLl9pbkVmZmVjdHx8Yi5fbmVlZHNUaWNrO2IuX2luVGltZWxpbmU9ZCxkP2cucHVzaChiKTpoLnB1c2goYil9KSxvLnB1c2guYXBwbHkobyxlKSxvLnB1c2guYXBwbHkobyxmKSxtJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KSxwPSExLFtnLGhdfXZhciBpPXdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUsaj1bXSxrPTA7d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT1mdW5jdGlvbihhKXt2YXIgYj1rKys7cmV0dXJuIDA9PWoubGVuZ3RoJiZpKGQpLGoucHVzaChbYixhXSksYn0sd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe2ouZm9yRWFjaChmdW5jdGlvbihiKXtiWzBdPT1hJiYoYlsxXT1mdW5jdGlvbigpe30pfSl9LGYucHJvdG90eXBlPXtfcGxheTpmdW5jdGlvbihjKXtjLl90aW1pbmc9YS5ub3JtYWxpemVUaW1pbmdJbnB1dChjLnRpbWluZyk7dmFyIGQ9bmV3IGIuQW5pbWF0aW9uKGMpO3JldHVybiBkLl9pZGxlPSExLGQuX3RpbWVsaW5lPXRoaXMsdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGQpLGIucmVzdGFydCgpLGIuYXBwbHlEaXJ0aWVkQW5pbWF0aW9uKGQpLGR9fTt2YXIgbD12b2lkIDAsbT0hMSxuPSExO2IucmVzdGFydD1mdW5jdGlvbigpe3JldHVybiBtfHwobT0hMCxyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXt9KSxuPSEwKSxufSxiLmFwcGx5RGlydGllZEFuaW1hdGlvbj1mdW5jdGlvbihhKXtpZighcCl7YS5fbWFya1RhcmdldCgpO3ZhciBjPWEuX3RhcmdldEFuaW1hdGlvbnMoKTtjLnNvcnQoZSksaChiLnRpbWVsaW5lLmN1cnJlbnRUaW1lLCExLGMuc2xpY2UoKSlbMV0uZm9yRWFjaChmdW5jdGlvbihhKXt2YXIgYj1xLl9hbmltYXRpb25zLmluZGV4T2YoYSk7LTEhPT1iJiZxLl9hbmltYXRpb25zLnNwbGljZShiLDEpfSksZygpfX07dmFyIG89W10scD0hMSxxPW5ldyBmO2IudGltZWxpbmU9cX0oYSxiKSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYil7dmFyIGM9YS5leGVjKGIpO2lmKGMpcmV0dXJuIGM9YS5pZ25vcmVDYXNlP2NbMF0udG9Mb3dlckNhc2UoKTpjWzBdLFtjLGIuc3Vic3RyKGMubGVuZ3RoKV19ZnVuY3Rpb24gYyhhLGIpe2I9Yi5yZXBsYWNlKC9eXHMqLywiIik7dmFyIGM9YShiKTtpZihjKXJldHVybltjWzBdLGNbMV0ucmVwbGFjZSgvXlxzKi8sIiIpXX1mdW5jdGlvbiBkKGEsZCxlKXthPWMuYmluZChudWxsLGEpO2Zvcih2YXIgZj1bXTs7KXt2YXIgZz1hKGUpO2lmKCFnKXJldHVybltmLGVdO2lmKGYucHVzaChnWzBdKSxlPWdbMV0sIShnPWIoZCxlKSl8fCIiPT1nWzFdKXJldHVybltmLGVdO2U9Z1sxXX19ZnVuY3Rpb24gZShhLGIpe2Zvcih2YXIgYz0wLGQ9MDtkPGIubGVuZ3RoJiYoIS9cc3wsLy50ZXN0KGJbZF0pfHwwIT1jKTtkKyspaWYoIigiPT1iW2RdKWMrKztlbHNlIGlmKCIpIj09YltkXSYmKGMtLSwwPT1jJiZkKyssYzw9MCkpYnJlYWs7dmFyIGU9YShiLnN1YnN0cigwLGQpKTtyZXR1cm4gdm9pZCAwPT1lP3ZvaWQgMDpbZSxiLnN1YnN0cihkKV19ZnVuY3Rpb24gZihhLGIpe2Zvcih2YXIgYz1hLGQ9YjtjJiZkOyljPmQ/YyU9ZDpkJT1jO3JldHVybiBjPWEqYi8oYytkKX1mdW5jdGlvbiBnKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz1hKGIpO3JldHVybiBjJiYoY1swXT12b2lkIDApLGN9fWZ1bmN0aW9uIGgoYSxiKXtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIGEoYyl8fFtiLGNdfX1mdW5jdGlvbiBpKGIsYyl7Zm9yKHZhciBkPVtdLGU9MDtlPGIubGVuZ3RoO2UrKyl7dmFyIGY9YS5jb25zdW1lVHJpbW1lZChiW2VdLGMpO2lmKCFmfHwiIj09ZlswXSlyZXR1cm47dm9pZCAwIT09ZlswXSYmZC5wdXNoKGZbMF0pLGM9ZlsxXX1pZigiIj09YylyZXR1cm4gZH1mdW5jdGlvbiBqKGEsYixjLGQsZSl7Zm9yKHZhciBnPVtdLGg9W10saT1bXSxqPWYoZC5sZW5ndGgsZS5sZW5ndGgpLGs9MDtrPGo7aysrKXt2YXIgbD1iKGRbayVkLmxlbmd0aF0sZVtrJWUubGVuZ3RoXSk7aWYoIWwpcmV0dXJuO2cucHVzaChsWzBdKSxoLnB1c2gobFsxXSksaS5wdXNoKGxbMl0pfXJldHVybltnLGgsZnVuY3Rpb24oYil7dmFyIGQ9Yi5tYXAoZnVuY3Rpb24oYSxiKXtyZXR1cm4gaVtiXShhKX0pLmpvaW4oYyk7cmV0dXJuIGE/YShkKTpkfV19ZnVuY3Rpb24gayhhLGIsYyl7Zm9yKHZhciBkPVtdLGU9W10sZj1bXSxnPTAsaD0wO2g8Yy5sZW5ndGg7aCsrKWlmKCJmdW5jdGlvbiI9PXR5cGVvZiBjW2hdKXt2YXIgaT1jW2hdKGFbZ10sYltnKytdKTtkLnB1c2goaVswXSksZS5wdXNoKGlbMV0pLGYucHVzaChpWzJdKX1lbHNlIWZ1bmN0aW9uKGEpe2QucHVzaCghMSksZS5wdXNoKCExKSxmLnB1c2goZnVuY3Rpb24oKXtyZXR1cm4gY1thXX0pfShoKTtyZXR1cm5bZCxlLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYj0iIixjPTA7YzxhLmxlbmd0aDtjKyspYis9ZltjXShhW2NdKTtyZXR1cm4gYn1dfWEuY29uc3VtZVRva2VuPWIsYS5jb25zdW1lVHJpbW1lZD1jLGEuY29uc3VtZVJlcGVhdGVkPWQsYS5jb25zdW1lUGFyZW50aGVzaXNlZD1lLGEuaWdub3JlPWcsYS5vcHRpb25hbD1oLGEuY29uc3VtZUxpc3Q9aSxhLm1lcmdlTmVzdGVkUmVwZWF0ZWQ9ai5iaW5kKG51bGwsbnVsbCksYS5tZXJnZVdyYXBwZWROZXN0ZWRSZXBlYXRlZD1qLGEubWVyZ2VMaXN0PWt9KGIpLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYil7ZnVuY3Rpb24gYyhiKXt2YXIgYz1hLmNvbnN1bWVUb2tlbigvXmluc2V0L2ksYik7cmV0dXJuIGM/KGQuaW5zZXQ9ITAsYyk6KGM9YS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpKT8oZC5sZW5ndGhzLnB1c2goY1swXSksYyk6KGM9YS5jb25zdW1lQ29sb3IoYiksYz8oZC5jb2xvcj1jWzBdLGMpOnZvaWQgMCl9dmFyIGQ9e2luc2V0OiExLGxlbmd0aHM6W10sY29sb3I6bnVsbH0sZT1hLmNvbnN1bWVSZXBlYXRlZChjLC9eLyxiKTtpZihlJiZlWzBdLmxlbmd0aClyZXR1cm5bZCxlWzFdXX1mdW5jdGlvbiBjKGMpe3ZhciBkPWEuY29uc3VtZVJlcGVhdGVkKGIsL14sLyxjKTtpZihkJiYiIj09ZFsxXSlyZXR1cm4gZFswXX1mdW5jdGlvbiBkKGIsYyl7Zm9yKDtiLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWIubGVuZ3Rocy5wdXNoKHtweDowfSk7Zm9yKDtjLmxlbmd0aHMubGVuZ3RoPE1hdGgubWF4KGIubGVuZ3Rocy5sZW5ndGgsYy5sZW5ndGhzLmxlbmd0aCk7KWMubGVuZ3Rocy5wdXNoKHtweDowfSk7aWYoYi5pbnNldD09Yy5pbnNldCYmISFiLmNvbG9yPT0hIWMuY29sb3Ipe2Zvcih2YXIgZCxlPVtdLGY9W1tdLDBdLGc9W1tdLDBdLGg9MDtoPGIubGVuZ3Rocy5sZW5ndGg7aCsrKXt2YXIgaT1hLm1lcmdlRGltZW5zaW9ucyhiLmxlbmd0aHNbaF0sYy5sZW5ndGhzW2hdLDI9PWgpO2ZbMF0ucHVzaChpWzBdKSxnWzBdLnB1c2goaVsxXSksZS5wdXNoKGlbMl0pfWlmKGIuY29sb3ImJmMuY29sb3Ipe3ZhciBqPWEubWVyZ2VDb2xvcnMoYi5jb2xvcixjLmNvbG9yKTtmWzFdPWpbMF0sZ1sxXT1qWzFdLGQ9alsyXX1yZXR1cm5bZixnLGZ1bmN0aW9uKGEpe2Zvcih2YXIgYz1iLmluc2V0PyJpbnNldCAiOiIgIixmPTA7ZjxlLmxlbmd0aDtmKyspYys9ZVtmXShhWzBdW2ZdKSsiICI7cmV0dXJuIGQmJihjKz1kKGFbMV0pKSxjfV19fWZ1bmN0aW9uIGUoYixjLGQsZSl7ZnVuY3Rpb24gZihhKXtyZXR1cm57aW5zZXQ6YSxjb2xvcjpbMCwwLDAsMF0sbGVuZ3Roczpbe3B4OjB9LHtweDowfSx7cHg6MH0se3B4OjB9XX19Zm9yKHZhciBnPVtdLGg9W10saT0wO2k8ZC5sZW5ndGh8fGk8ZS5sZW5ndGg7aSsrKXt2YXIgaj1kW2ldfHxmKGVbaV0uaW5zZXQpLGs9ZVtpXXx8ZihkW2ldLmluc2V0KTtnLnB1c2goaiksaC5wdXNoKGspfXJldHVybiBhLm1lcmdlTmVzdGVkUmVwZWF0ZWQoYixjLGcsaCl9dmFyIGY9ZS5iaW5kKG51bGwsZCwiLCAiKTthLmFkZFByb3BlcnRpZXNIYW5kbGVyKGMsZixbImJveC1zaGFkb3ciLCJ0ZXh0LXNoYWRvdyJdKX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBhLnRvRml4ZWQoMykucmVwbGFjZSgvMCskLywiIikucmVwbGFjZSgvXC4kLywiIil9ZnVuY3Rpb24gZChhLGIsYyl7cmV0dXJuIE1hdGgubWluKGIsTWF0aC5tYXgoYSxjKSl9ZnVuY3Rpb24gZShhKXtpZigvXlxzKlstK10/KFxkKlwuKT9cZCtccyokLy50ZXN0KGEpKXJldHVybiBOdW1iZXIoYSl9ZnVuY3Rpb24gZihhLGIpe3JldHVyblthLGIsY119ZnVuY3Rpb24gZyhhLGIpe2lmKDAhPWEpcmV0dXJuIGkoMCwxLzApKGEsYil9ZnVuY3Rpb24gaChhLGIpe3JldHVyblthLGIsZnVuY3Rpb24oYSl7cmV0dXJuIE1hdGgucm91bmQoZCgxLDEvMCxhKSl9XX1mdW5jdGlvbiBpKGEsYil7cmV0dXJuIGZ1bmN0aW9uKGUsZil7cmV0dXJuW2UsZixmdW5jdGlvbihlKXtyZXR1cm4gYyhkKGEsYixlKSl9XX19ZnVuY3Rpb24gaihhKXt2YXIgYj1hLnRyaW0oKS5zcGxpdCgvXHMqW1xzLF1ccyovKTtpZigwIT09Yi5sZW5ndGgpe2Zvcih2YXIgYz1bXSxkPTA7ZDxiLmxlbmd0aDtkKyspe3ZhciBmPWUoYltkXSk7aWYodm9pZCAwPT09ZilyZXR1cm47Yy5wdXNoKGYpfXJldHVybiBjfX1mdW5jdGlvbiBrKGEsYil7aWYoYS5sZW5ndGg9PWIubGVuZ3RoKXJldHVyblthLGIsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGMpLmpvaW4oIiAiKX1dfWZ1bmN0aW9uIGwoYSxiKXtyZXR1cm5bYSxiLE1hdGgucm91bmRdfWEuY2xhbXA9ZCxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGosayxbInN0cm9rZS1kYXNoYXJyYXkiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxLzApLFsiYm9yZGVyLWltYWdlLXdpZHRoIiwibGluZS1oZWlnaHQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGkoMCwxKSxbIm9wYWNpdHkiLCJzaGFwZS1pbWFnZS10aHJlc2hvbGQiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGcsWyJmbGV4LWdyb3ciLCJmbGV4LXNocmluayJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGUsaCxbIm9ycGhhbnMiLCJ3aWRvd3MiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGwsWyJ6LWluZGV4Il0pLGEucGFyc2VOdW1iZXI9ZSxhLnBhcnNlTnVtYmVyTGlzdD1qLGEubWVyZ2VOdW1iZXJzPWYsYS5udW1iZXJUb1N0cmluZz1jfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSxiKXtpZigidmlzaWJsZSI9PWF8fCJ2aXNpYmxlIj09YilyZXR1cm5bMCwxLGZ1bmN0aW9uKGMpe3JldHVybiBjPD0wP2E6Yz49MT9iOiJ2aXNpYmxlIn1dfWEuYWRkUHJvcGVydGllc0hhbmRsZXIoU3RyaW5nLGMsWyJ2aXNpYmlsaXR5Il0pfShiKSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7YT1hLnRyaW0oKSxmLmZpbGxTdHlsZT0iIzAwMCIsZi5maWxsU3R5bGU9YTt2YXIgYj1mLmZpbGxTdHlsZTtpZihmLmZpbGxTdHlsZT0iI2ZmZiIsZi5maWxsU3R5bGU9YSxiPT1mLmZpbGxTdHlsZSl7Zi5maWxsUmVjdCgwLDAsMSwxKTt2YXIgYz1mLmdldEltYWdlRGF0YSgwLDAsMSwxKS5kYXRhO2YuY2xlYXJSZWN0KDAsMCwxLDEpO3ZhciBkPWNbM10vMjU1O3JldHVybltjWzBdKmQsY1sxXSpkLGNbMl0qZCxkXX19ZnVuY3Rpb24gZChiLGMpe3JldHVybltiLGMsZnVuY3Rpb24oYil7ZnVuY3Rpb24gYyhhKXtyZXR1cm4gTWF0aC5tYXgoMCxNYXRoLm1pbigyNTUsYSkpfWlmKGJbM10pZm9yKHZhciBkPTA7ZDwzO2QrKyliW2RdPU1hdGgucm91bmQoYyhiW2RdL2JbM10pKTtyZXR1cm4gYlszXT1hLm51bWJlclRvU3RyaW5nKGEuY2xhbXAoMCwxLGJbM10pKSwicmdiYSgiK2Iuam9pbigiLCIpKyIpIn1dfXZhciBlPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCIsImNhbnZhcyIpO2Uud2lkdGg9ZS5oZWlnaHQ9MTt2YXIgZj1lLmdldENvbnRleHQoIjJkIik7YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihjLGQsWyJiYWNrZ3JvdW5kLWNvbG9yIiwiYm9yZGVyLWJvdHRvbS1jb2xvciIsImJvcmRlci1sZWZ0LWNvbG9yIiwiYm9yZGVyLXJpZ2h0LWNvbG9yIiwiYm9yZGVyLXRvcC1jb2xvciIsImNvbG9yIiwiZmlsbCIsImZsb29kLWNvbG9yIiwibGlnaHRpbmctY29sb3IiLCJvdXRsaW5lLWNvbG9yIiwic3RvcC1jb2xvciIsInN0cm9rZSIsInRleHQtZGVjb3JhdGlvbi1jb2xvciJdKSxhLmNvbnN1bWVDb2xvcj1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxjKSxhLm1lcmdlQ29sb3JzPWR9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhKXtmdW5jdGlvbiBiKCl7dmFyIGI9aC5leGVjKGEpO2c9Yj9iWzBdOnZvaWQgMH1mdW5jdGlvbiBjKCl7dmFyIGE9TnVtYmVyKGcpO3JldHVybiBiKCksYX1mdW5jdGlvbiBkKCl7aWYoIigiIT09ZylyZXR1cm4gYygpO2IoKTt2YXIgYT1mKCk7cmV0dXJuIikiIT09Zz9OYU46KGIoKSxhKX1mdW5jdGlvbiBlKCl7Zm9yKHZhciBhPWQoKTsiKiI9PT1nfHwiLyI9PT1nOyl7dmFyIGM9ZztiKCk7dmFyIGU9ZCgpOyIqIj09PWM/YSo9ZTphLz1lfXJldHVybiBhfWZ1bmN0aW9uIGYoKXtmb3IodmFyIGE9ZSgpOyIrIj09PWd8fCItIj09PWc7KXt2YXIgYz1nO2IoKTt2YXIgZD1lKCk7IisiPT09Yz9hKz1kOmEtPWR9cmV0dXJuIGF9dmFyIGcsaD0vKFtcK1wtXHdcLl0rfFtcKFwpXCpcL10pL2c7cmV0dXJuIGIoKSxmKCl9ZnVuY3Rpb24gZChhLGIpe2lmKCIwIj09KGI9Yi50cmltKCkudG9Mb3dlckNhc2UoKSkmJiJweCIuc2VhcmNoKGEpPj0wKXJldHVybntweDowfTtpZigvXlteKF0qJHxeY2FsYy8udGVzdChiKSl7Yj1iLnJlcGxhY2UoL2NhbGNcKC9nLCIoIik7dmFyIGQ9e307Yj1iLnJlcGxhY2UoYSxmdW5jdGlvbihhKXtyZXR1cm4gZFthXT1udWxsLCJVIithfSk7Zm9yKHZhciBlPSJVKCIrYS5zb3VyY2UrIikiLGY9Yi5yZXBsYWNlKC9bLStdPyhcZCpcLik/XGQrKFtFZV1bLStdP1xkKyk/L2csIk4iKS5yZXBsYWNlKG5ldyBSZWdFeHAoIk4iK2UsImciKSwiRCIpLnJlcGxhY2UoL1xzWystXVxzL2csIk8iKS5yZXBsYWNlKC9ccy9nLCIiKSxnPVsvTlwqKEQpL2csLyhOfEQpWypcL11OL2csLyhOfEQpT1wxL2csL1woKE58RClcKS9nXSxoPTA7aDxnLmxlbmd0aDspZ1toXS50ZXN0KGYpPyhmPWYucmVwbGFjZShnW2hdLCIkMSIpLGg9MCk6aCsrO2lmKCJEIj09Zil7Zm9yKHZhciBpIGluIGQpe3ZhciBqPWMoYi5yZXBsYWNlKG5ldyBSZWdFeHAoIlUiK2ksImciKSwiIikucmVwbGFjZShuZXcgUmVnRXhwKGUsImciKSwiKjAiKSk7aWYoIWlzRmluaXRlKGopKXJldHVybjtkW2ldPWp9cmV0dXJuIGR9fX1mdW5jdGlvbiBlKGEsYil7cmV0dXJuIGYoYSxiLCEwKX1mdW5jdGlvbiBmKGIsYyxkKXt2YXIgZSxmPVtdO2ZvcihlIGluIGIpZi5wdXNoKGUpO2ZvcihlIGluIGMpZi5pbmRleE9mKGUpPDAmJmYucHVzaChlKTtyZXR1cm4gYj1mLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYlthXXx8MH0pLGM9Zi5tYXAoZnVuY3Rpb24oYSl7cmV0dXJuIGNbYV18fDB9KSxbYixjLGZ1bmN0aW9uKGIpe3ZhciBjPWIubWFwKGZ1bmN0aW9uKGMsZSl7cmV0dXJuIDE9PWIubGVuZ3RoJiZkJiYoYz1NYXRoLm1heChjLDApKSxhLm51bWJlclRvU3RyaW5nKGMpK2ZbZV19KS5qb2luKCIgKyAiKTtyZXR1cm4gYi5sZW5ndGg+MT8iY2FsYygiK2MrIikiOmN9XX12YXIgZz0icHh8ZW18ZXh8Y2h8cmVtfHZ3fHZofHZtaW58dm1heHxjbXxtbXxpbnxwdHxwYyIsaD1kLmJpbmQobnVsbCxuZXcgUmVnRXhwKGcsImciKSksaT1kLmJpbmQobnVsbCxuZXcgUmVnRXhwKGcrInwlIiwiZyIpKSxqPWQuYmluZChudWxsLC9kZWd8cmFkfGdyYWR8dHVybi9nKTthLnBhcnNlTGVuZ3RoPWgsYS5wYXJzZUxlbmd0aE9yUGVyY2VudD1pLGEuY29uc3VtZUxlbmd0aE9yUGVyY2VudD1hLmNvbnN1bWVQYXJlbnRoZXNpc2VkLmJpbmQobnVsbCxpKSxhLnBhcnNlQW5nbGU9aixhLm1lcmdlRGltZW5zaW9ucz1mO3ZhciBrPWEuY29uc3VtZVBhcmVudGhlc2lzZWQuYmluZChudWxsLGgpLGw9YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsaywvXi8pLG09YS5jb25zdW1lUmVwZWF0ZWQuYmluZCh2b2lkIDAsbCwvXiwvKTthLmNvbnN1bWVTaXplUGFpckxpc3Q9bTt2YXIgbj1mdW5jdGlvbihhKXt2YXIgYj1tKGEpO2lmKGImJiIiPT1iWzFdKXJldHVybiBiWzBdfSxvPWEubWVyZ2VOZXN0ZWRSZXBlYXRlZC5iaW5kKHZvaWQgMCxlLCIgIikscD1hLm1lcmdlTmVzdGVkUmVwZWF0ZWQuYmluZCh2b2lkIDAsbywiLCIpO2EubWVyZ2VOb25OZWdhdGl2ZVNpemVQYWlyPW8sYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihuLHAsWyJiYWNrZ3JvdW5kLXNpemUiXSksYS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihpLGUsWyJib3JkZXItYm90dG9tLXdpZHRoIiwiYm9yZGVyLWltYWdlLXdpZHRoIiwiYm9yZGVyLWxlZnQtd2lkdGgiLCJib3JkZXItcmlnaHQtd2lkdGgiLCJib3JkZXItdG9wLXdpZHRoIiwiZmxleC1iYXNpcyIsImZvbnQtc2l6ZSIsImhlaWdodCIsImxpbmUtaGVpZ2h0IiwibWF4LWhlaWdodCIsIm1heC13aWR0aCIsIm91dGxpbmUtd2lkdGgiLCJ3aWR0aCJdKSxhLmFkZFByb3BlcnRpZXNIYW5kbGVyKGksZixbImJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXMiLCJib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1cyIsImJvcmRlci10b3AtbGVmdC1yYWRpdXMiLCJib3JkZXItdG9wLXJpZ2h0LXJhZGl1cyIsImJvdHRvbSIsImxlZnQiLCJsZXR0ZXItc3BhY2luZyIsIm1hcmdpbi1ib3R0b20iLCJtYXJnaW4tbGVmdCIsIm1hcmdpbi1yaWdodCIsIm1hcmdpbi10b3AiLCJtaW4taGVpZ2h0IiwibWluLXdpZHRoIiwib3V0bGluZS1vZmZzZXQiLCJwYWRkaW5nLWJvdHRvbSIsInBhZGRpbmctbGVmdCIsInBhZGRpbmctcmlnaHQiLCJwYWRkaW5nLXRvcCIsInBlcnNwZWN0aXZlIiwicmlnaHQiLCJzaGFwZS1tYXJnaW4iLCJzdHJva2UtZGFzaG9mZnNldCIsInRleHQtaW5kZW50IiwidG9wIiwidmVydGljYWwtYWxpZ24iLCJ3b3JkLXNwYWNpbmciXSl9KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhiKXtyZXR1cm4gYS5jb25zdW1lTGVuZ3RoT3JQZXJjZW50KGIpfHxhLmNvbnN1bWVUb2tlbigvXmF1dG8vLGIpfWZ1bmN0aW9uIGQoYil7dmFyIGQ9YS5jb25zdW1lTGlzdChbYS5pZ25vcmUoYS5jb25zdW1lVG9rZW4uYmluZChudWxsLC9ecmVjdC8pKSxhLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15cKC8pKSxhLmNvbnN1bWVSZXBlYXRlZC5iaW5kKG51bGwsYywvXiwvKSxhLmlnbm9yZShhLmNvbnN1bWVUb2tlbi5iaW5kKG51bGwsL15cKS8pKV0sYik7aWYoZCYmND09ZFswXS5sZW5ndGgpcmV0dXJuIGRbMF19ZnVuY3Rpb24gZShiLGMpe3JldHVybiJhdXRvIj09Ynx8ImF1dG8iPT1jP1shMCwhMSxmdW5jdGlvbihkKXt2YXIgZT1kP2I6YztpZigiYXV0byI9PWUpcmV0dXJuImF1dG8iO3ZhciBmPWEubWVyZ2VEaW1lbnNpb25zKGUsZSk7cmV0dXJuIGZbMl0oZlswXSl9XTphLm1lcmdlRGltZW5zaW9ucyhiLGMpfWZ1bmN0aW9uIGYoYSl7cmV0dXJuInJlY3QoIithKyIpIn12YXIgZz1hLm1lcmdlV3JhcHBlZE5lc3RlZFJlcGVhdGVkLmJpbmQobnVsbCxmLGUsIiwgIik7YS5wYXJzZUJveD1kLGEubWVyZ2VCb3hlcz1nLGEuYWRkUHJvcGVydGllc0hhbmRsZXIoZCxnLFsiY2xpcCJdKX0oYiksZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEpe3JldHVybiBmdW5jdGlvbihiKXt2YXIgYz0wO3JldHVybiBhLm1hcChmdW5jdGlvbihhKXtyZXR1cm4gYT09PWs/YltjKytdOmF9KX19ZnVuY3Rpb24gZChhKXtyZXR1cm4gYX1mdW5jdGlvbiBlKGIpe2lmKCJub25lIj09KGI9Yi50b0xvd2VyQ2FzZSgpLnRyaW0oKSkpcmV0dXJuW107Zm9yKHZhciBjLGQ9L1xzKihcdyspXCgoW14pXSopXCkvZyxlPVtdLGY9MDtjPWQuZXhlYyhiKTspe2lmKGMuaW5kZXghPWYpcmV0dXJuO2Y9Yy5pbmRleCtjWzBdLmxlbmd0aDt2YXIgZz1jWzFdLGg9bltnXTtpZighaClyZXR1cm47dmFyIGk9Y1syXS5zcGxpdCgiLCIpLGo9aFswXTtpZihqLmxlbmd0aDxpLmxlbmd0aClyZXR1cm47Zm9yKHZhciBrPVtdLG89MDtvPGoubGVuZ3RoO28rKyl7dmFyIHAscT1pW29dLHI9altvXTtpZih2b2lkIDA9PT0ocD1xP3tBOmZ1bmN0aW9uKGIpe3JldHVybiIwIj09Yi50cmltKCk/bTphLnBhcnNlQW5nbGUoYil9LE46YS5wYXJzZU51bWJlcixUOmEucGFyc2VMZW5ndGhPclBlcmNlbnQsTDphLnBhcnNlTGVuZ3RofVtyLnRvVXBwZXJDYXNlKCldKHEpOnthOm0sbjprWzBdLHQ6bH1bcl0pKXJldHVybjtrLnB1c2gocCl9aWYoZS5wdXNoKHt0OmcsZDprfSksZC5sYXN0SW5kZXg9PWIubGVuZ3RoKXJldHVybiBlfX1mdW5jdGlvbiBmKGEpe3JldHVybiBhLnRvRml4ZWQoNikucmVwbGFjZSgiLjAwMDAwMCIsIiIpfWZ1bmN0aW9uIGcoYixjKXtpZihiLmRlY29tcG9zaXRpb25QYWlyIT09Yyl7Yi5kZWNvbXBvc2l0aW9uUGFpcj1jO3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24oYil9aWYoYy5kZWNvbXBvc2l0aW9uUGFpciE9PWIpe2MuZGVjb21wb3NpdGlvblBhaXI9Yjt2YXIgZT1hLm1ha2VNYXRyaXhEZWNvbXBvc2l0aW9uKGMpfXJldHVybiBudWxsPT1kWzBdfHxudWxsPT1lWzBdP1tbITFdLFshMF0sZnVuY3Rpb24oYSl7cmV0dXJuIGE/Y1swXS5kOmJbMF0uZH1dOihkWzBdLnB1c2goMCksZVswXS5wdXNoKDEpLFtkLGUsZnVuY3Rpb24oYil7dmFyIGM9YS5xdWF0KGRbMF1bM10sZVswXVszXSxiWzVdKTtyZXR1cm4gYS5jb21wb3NlTWF0cml4KGJbMF0sYlsxXSxiWzJdLGMsYls0XSkubWFwKGYpLmpvaW4oIiwiKX1dKX1mdW5jdGlvbiBoKGEpe3JldHVybiBhLnJlcGxhY2UoL1t4eV0vLCIiKX1mdW5jdGlvbiBpKGEpe3JldHVybiBhLnJlcGxhY2UoLyh4fHl8enwzZCk/JC8sIjNkIil9ZnVuY3Rpb24gaihiLGMpe3ZhciBkPWEubWFrZU1hdHJpeERlY29tcG9zaXRpb24mJiEwLGU9ITE7aWYoIWIubGVuZ3RofHwhYy5sZW5ndGgpe2IubGVuZ3RofHwoZT0hMCxiPWMsYz1bXSk7Zm9yKHZhciBmPTA7ZjxiLmxlbmd0aDtmKyspe3ZhciBqPWJbZl0udCxrPWJbZl0uZCxsPSJzY2FsZSI9PWouc3Vic3RyKDAsNSk/MTowO2MucHVzaCh7dDpqLGQ6ay5tYXAoZnVuY3Rpb24oYSl7aWYoIm51bWJlciI9PXR5cGVvZiBhKXJldHVybiBsO3ZhciBiPXt9O2Zvcih2YXIgYyBpbiBhKWJbY109bDtyZXR1cm4gYn0pfSl9fXZhciBtPWZ1bmN0aW9uKGEsYil7cmV0dXJuInBlcnNwZWN0aXZlIj09YSYmInBlcnNwZWN0aXZlIj09Ynx8KCJtYXRyaXgiPT1hfHwibWF0cml4M2QiPT1hKSYmKCJtYXRyaXgiPT1ifHwibWF0cml4M2QiPT1iKX0sbz1bXSxwPVtdLHE9W107aWYoYi5sZW5ndGghPWMubGVuZ3RoKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXX1lbHNlIGZvcih2YXIgZj0wO2Y8Yi5sZW5ndGg7ZisrKXt2YXIgaixzPWJbZl0udCx0PWNbZl0udCx1PWJbZl0uZCx2PWNbZl0uZCx3PW5bc10seD1uW3RdO2lmKG0ocyx0KSl7aWYoIWQpcmV0dXJuO3ZhciByPWcoW2JbZl1dLFtjW2ZdXSk7by5wdXNoKHJbMF0pLHAucHVzaChyWzFdKSxxLnB1c2goWyJtYXRyaXgiLFtyWzJdXV0pfWVsc2V7aWYocz09dClqPXM7ZWxzZSBpZih3WzJdJiZ4WzJdJiZoKHMpPT1oKHQpKWo9aChzKSx1PXdbMl0odSksdj14WzJdKHYpO2Vsc2V7aWYoIXdbMV18fCF4WzFdfHxpKHMpIT1pKHQpKXtpZighZClyZXR1cm47dmFyIHI9ZyhiLGMpO289W3JbMF1dLHA9W3JbMV1dLHE9W1sibWF0cml4IixbclsyXV1dXTticmVha31qPWkocyksdT13WzFdKHUpLHY9eFsxXSh2KX1mb3IodmFyIHk9W10sej1bXSxBPVtdLEI9MDtCPHUubGVuZ3RoO0IrKyl7dmFyIEM9Im51bWJlciI9PXR5cGVvZiB1W0JdP2EubWVyZ2VOdW1iZXJzOmEubWVyZ2VEaW1lbnNpb25zLHI9Qyh1W0JdLHZbQl0pO3lbQl09clswXSx6W0JdPXJbMV0sQS5wdXNoKHJbMl0pfW8ucHVzaCh5KSxwLnB1c2goeikscS5wdXNoKFtqLEFdKX19aWYoZSl7dmFyIEQ9bztvPXAscD1EfXJldHVybltvLHAsZnVuY3Rpb24oYSl7cmV0dXJuIGEubWFwKGZ1bmN0aW9uKGEsYil7dmFyIGM9YS5tYXAoZnVuY3Rpb24oYSxjKXtyZXR1cm4gcVtiXVsxXVtjXShhKX0pLmpvaW4oIiwiKTtyZXR1cm4ibWF0cml4Ij09cVtiXVswXSYmMTY9PWMuc3BsaXQoIiwiKS5sZW5ndGgmJihxW2JdWzBdPSJtYXRyaXgzZCIpLHFbYl1bMF0rIigiK2MrIikifSkuam9pbigiICIpfV19dmFyIGs9bnVsbCxsPXtweDowfSxtPXtkZWc6MH0sbj17bWF0cml4OlsiTk5OTk5OIixbayxrLDAsMCxrLGssMCwwLDAsMCwxLDAsayxrLDAsMV0sZF0sbWF0cml4M2Q6WyJOTk5OTk5OTk5OTk5OTk5OIixkXSxyb3RhdGU6WyJBIl0scm90YXRleDpbIkEiXSxyb3RhdGV5OlsiQSJdLHJvdGF0ZXo6WyJBIl0scm90YXRlM2Q6WyJOTk5BIl0scGVyc3BlY3RpdmU6WyJMIl0sc2NhbGU6WyJObiIsYyhbayxrLDFdKSxkXSxzY2FsZXg6WyJOIixjKFtrLDEsMV0pLGMoW2ssMV0pXSxzY2FsZXk6WyJOIixjKFsxLGssMV0pLGMoWzEsa10pXSxzY2FsZXo6WyJOIixjKFsxLDEsa10pXSxzY2FsZTNkOlsiTk5OIixkXSxza2V3OlsiQWEiLG51bGwsZF0sc2tld3g6WyJBIixudWxsLGMoW2ssbV0pXSxza2V3eTpbIkEiLG51bGwsYyhbbSxrXSldLHRyYW5zbGF0ZTpbIlR0IixjKFtrLGssbF0pLGRdLHRyYW5zbGF0ZXg6WyJUIixjKFtrLGwsbF0pLGMoW2ssbF0pXSx0cmFuc2xhdGV5OlsiVCIsYyhbbCxrLGxdKSxjKFtsLGtdKV0sdHJhbnNsYXRlejpbIkwiLGMoW2wsbCxrXSldLHRyYW5zbGF0ZTNkOlsiVFRMIixkXX07YS5hZGRQcm9wZXJ0aWVzSGFuZGxlcihlLGosWyJ0cmFuc2Zvcm0iXSksYS50cmFuc2Zvcm1Ub1N2Z01hdHJpeD1mdW5jdGlvbihiKXt2YXIgYz1hLnRyYW5zZm9ybUxpc3RUb01hdHJpeChlKGIpKTtyZXR1cm4ibWF0cml4KCIrZihjWzBdKSsiICIrZihjWzFdKSsiICIrZihjWzRdKSsiICIrZihjWzVdKSsiICIrZihjWzEyXSkrIiAiK2YoY1sxM10pKyIpIn19KGIpLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYyhhLGIpe2IuY29uY2F0KFthXSkuZm9yRWFjaChmdW5jdGlvbihiKXtiIGluIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zdHlsZSYmKGRbYV09YiksZVtiXT1hfSl9dmFyIGQ9e30sZT17fTtjKCJ0cmFuc2Zvcm0iLFsid2Via2l0VHJhbnNmb3JtIiwibXNUcmFuc2Zvcm0iXSksYygidHJhbnNmb3JtT3JpZ2luIixbIndlYmtpdFRyYW5zZm9ybU9yaWdpbiJdKSxjKCJwZXJzcGVjdGl2ZSIsWyJ3ZWJraXRQZXJzcGVjdGl2ZSJdKSxjKCJwZXJzcGVjdGl2ZU9yaWdpbiIsWyJ3ZWJraXRQZXJzcGVjdGl2ZU9yaWdpbiJdKSxhLnByb3BlcnR5TmFtZT1mdW5jdGlvbihhKXtyZXR1cm4gZFthXXx8YX0sYS51bnByZWZpeGVkUHJvcGVydHlOYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBlW2FdfHxhfX0oYil9KCksZnVuY3Rpb24oKXtpZih2b2lkIDA9PT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKS5hbmltYXRlKFtdKS5vbmNhbmNlbCl7dmFyIGE7aWYod2luZG93LnBlcmZvcm1hbmNlJiZwZXJmb3JtYW5jZS5ub3cpdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gcGVyZm9ybWFuY2Uubm93KCl9O2Vsc2UgdmFyIGE9ZnVuY3Rpb24oKXtyZXR1cm4gRGF0ZS5ub3coKX07dmFyIGI9ZnVuY3Rpb24oYSxiLGMpe3RoaXMudGFyZ2V0PWEsdGhpcy5jdXJyZW50VGltZT1iLHRoaXMudGltZWxpbmVUaW1lPWMsdGhpcy50eXBlPSJjYW5jZWwiLHRoaXMuYnViYmxlcz0hMSx0aGlzLmNhbmNlbGFibGU9ITEsdGhpcy5jdXJyZW50VGFyZ2V0PWEsdGhpcy5kZWZhdWx0UHJldmVudGVkPSExLHRoaXMuZXZlbnRQaGFzZT1FdmVudC5BVF9UQVJHRVQsdGhpcy50aW1lU3RhbXA9RGF0ZS5ub3coKX0sYz13aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZTt3aW5kb3cuRWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihkLGUpe3ZhciBmPWMuY2FsbCh0aGlzLGQsZSk7Zi5fY2FuY2VsSGFuZGxlcnM9W10sZi5vbmNhbmNlbD1udWxsO3ZhciBnPWYuY2FuY2VsO2YuY2FuY2VsPWZ1bmN0aW9uKCl7Zy5jYWxsKHRoaXMpO3ZhciBjPW5ldyBiKHRoaXMsbnVsbCxhKCkpLGQ9dGhpcy5fY2FuY2VsSGFuZGxlcnMuY29uY2F0KHRoaXMub25jYW5jZWw/W3RoaXMub25jYW5jZWxdOltdKTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZC5mb3JFYWNoKGZ1bmN0aW9uKGEpe2EuY2FsbChjLnRhcmdldCxjKX0pfSwwKX07dmFyIGg9Zi5hZGRFdmVudExpc3RlbmVyO2YuYWRkRXZlbnRMaXN0ZW5lcj1mdW5jdGlvbihhLGIpeyJmdW5jdGlvbiI9PXR5cGVvZiBiJiYiY2FuY2VsIj09YT90aGlzLl9jYW5jZWxIYW5kbGVycy5wdXNoKGIpOmguY2FsbCh0aGlzLGEsYil9O3ZhciBpPWYucmVtb3ZlRXZlbnRMaXN0ZW5lcjtyZXR1cm4gZi5yZW1vdmVFdmVudExpc3RlbmVyPWZ1bmN0aW9uKGEsYil7aWYoImNhbmNlbCI9PWEpe3ZhciBjPXRoaXMuX2NhbmNlbEhhbmRsZXJzLmluZGV4T2YoYik7Yz49MCYmdGhpcy5fY2FuY2VsSGFuZGxlcnMuc3BsaWNlKGMsMSl9ZWxzZSBpLmNhbGwodGhpcyxhLGIpfSxmfX19KCksZnVuY3Rpb24oYSl7dmFyIGI9ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LGM9bnVsbCxkPSExO3RyeXt2YXIgZT1nZXRDb21wdXRlZFN0eWxlKGIpLmdldFByb3BlcnR5VmFsdWUoIm9wYWNpdHkiKSxmPSIwIj09ZT8iMSI6IjAiO2M9Yi5hbmltYXRlKHtvcGFjaXR5OltmLGZdfSx7ZHVyYXRpb246MX0pLGMuY3VycmVudFRpbWU9MCxkPWdldENvbXB1dGVkU3R5bGUoYikuZ2V0UHJvcGVydHlWYWx1ZSgib3BhY2l0eSIpPT1mfWNhdGNoKGEpe31maW5hbGx5e2MmJmMuY2FuY2VsKCl9aWYoIWQpe3ZhciBnPXdpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlO3dpbmRvdy5FbGVtZW50LnByb3RvdHlwZS5hbmltYXRlPWZ1bmN0aW9uKGIsYyl7cmV0dXJuIHdpbmRvdy5TeW1ib2wmJlN5bWJvbC5pdGVyYXRvciYmQXJyYXkucHJvdG90eXBlLmZyb20mJmJbU3ltYm9sLml0ZXJhdG9yXSYmKGI9QXJyYXkuZnJvbShiKSksQXJyYXkuaXNBcnJheShiKXx8bnVsbD09PWJ8fChiPWEuY29udmVydFRvQXJyYXlGb3JtKGIpKSxnLmNhbGwodGhpcyxiLGMpfX19KGEpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3ZhciBjPWIudGltZWxpbmU7Yy5jdXJyZW50VGltZT1hLGMuX2Rpc2NhcmRBbmltYXRpb25zKCksMD09Yy5fYW5pbWF0aW9ucy5sZW5ndGg/Zj0hMTpyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZCl9dmFyIGU9d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZTt3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lPWZ1bmN0aW9uKGEpe3JldHVybiBlKGZ1bmN0aW9uKGMpe2IudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGEoYyksYi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCl9KX0sYi5BbmltYXRpb25UaW1lbGluZT1mdW5jdGlvbigpe3RoaXMuX2FuaW1hdGlvbnM9W10sdGhpcy5jdXJyZW50VGltZT12b2lkIDB9LGIuQW5pbWF0aW9uVGltZWxpbmUucHJvdG90eXBlPXtnZXRBbmltYXRpb25zOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuX2Rpc2NhcmRBbmltYXRpb25zKCksdGhpcy5fYW5pbWF0aW9ucy5zbGljZSgpfSxfdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzOmZ1bmN0aW9uKCl7Yi5hbmltYXRpb25zV2l0aFByb21pc2VzPWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5maWx0ZXIoZnVuY3Rpb24oYSl7cmV0dXJuIGEuX3VwZGF0ZVByb21pc2VzKCl9KX0sX2Rpc2NhcmRBbmltYXRpb25zOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCksdGhpcy5fYW5pbWF0aW9ucz10aGlzLl9hbmltYXRpb25zLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4iZmluaXNoZWQiIT1hLnBsYXlTdGF0ZSYmImlkbGUiIT1hLnBsYXlTdGF0ZX0pfSxfcGxheTpmdW5jdGlvbihhKXt2YXIgYz1uZXcgYi5BbmltYXRpb24oYSx0aGlzKTtyZXR1cm4gdGhpcy5fYW5pbWF0aW9ucy5wdXNoKGMpLGIucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaygpLGMuX3VwZGF0ZVByb21pc2VzKCksYy5fYW5pbWF0aW9uLnBsYXkoKSxjLl91cGRhdGVQcm9taXNlcygpLGN9LHBsYXk6ZnVuY3Rpb24oYSl7cmV0dXJuIGEmJmEucmVtb3ZlKCksdGhpcy5fcGxheShhKX19O3ZhciBmPSExO2IucmVzdGFydFdlYkFuaW1hdGlvbnNOZXh0VGljaz1mdW5jdGlvbigpe2Z8fChmPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShkKSl9O3ZhciBnPW5ldyBiLkFuaW1hdGlvblRpbWVsaW5lO2IudGltZWxpbmU9Zzt0cnl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5kb2N1bWVudCwidGltZWxpbmUiLHtjb25maWd1cmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGd9fSl9Y2F0Y2goYSl7fXRyeXt3aW5kb3cuZG9jdW1lbnQudGltZWxpbmU9Z31jYXRjaChhKXt9fSgwLGMpLGZ1bmN0aW9uKGEsYixjKXtiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXM9W10sYi5BbmltYXRpb249ZnVuY3Rpb24oYixjKXtpZih0aGlzLmlkPSIiLGImJmIuX2lkJiYodGhpcy5pZD1iLl9pZCksdGhpcy5lZmZlY3Q9YixiJiYoYi5fYW5pbWF0aW9uPXRoaXMpLCFjKXRocm93IG5ldyBFcnJvcigiQW5pbWF0aW9uIHdpdGggbnVsbCB0aW1lbGluZSBpcyBub3Qgc3VwcG9ydGVkIik7dGhpcy5fdGltZWxpbmU9Yyx0aGlzLl9zZXF1ZW5jZU51bWJlcj1hLnNlcXVlbmNlTnVtYmVyKyssdGhpcy5faG9sZFRpbWU9MCx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5faXNHcm91cD0hMSx0aGlzLl9hbmltYXRpb249bnVsbCx0aGlzLl9jaGlsZEFuaW1hdGlvbnM9W10sdGhpcy5fY2FsbGJhY2s9bnVsbCx0aGlzLl9vbGRQbGF5U3RhdGU9ImlkbGUiLHRoaXMuX3JlYnVpbGRVbmRlcmx5aW5nQW5pbWF0aW9uKCksdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LGIuQW5pbWF0aW9uLnByb3RvdHlwZT17X3VwZGF0ZVByb21pc2VzOmZ1bmN0aW9uKCl7dmFyIGE9dGhpcy5fb2xkUGxheVN0YXRlLGI9dGhpcy5wbGF5U3RhdGU7cmV0dXJuIHRoaXMuX3JlYWR5UHJvbWlzZSYmYiE9PWEmJigiaWRsZSI9PWI/KHRoaXMuX3JlamVjdFJlYWR5UHJvbWlzZSgpLHRoaXMuX3JlYWR5UHJvbWlzZT12b2lkIDApOiJwZW5kaW5nIj09YT90aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlKCk6InBlbmRpbmciPT1iJiYodGhpcy5fcmVhZHlQcm9taXNlPXZvaWQgMCkpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZSYmYiE9PWEmJigiaWRsZSI9PWI/KHRoaXMuX3JlamVjdEZpbmlzaGVkUHJvbWlzZSgpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT12b2lkIDApOiJmaW5pc2hlZCI9PWI/dGhpcy5fcmVzb2x2ZUZpbmlzaGVkUHJvbWlzZSgpOiJmaW5pc2hlZCI9PWEmJih0aGlzLl9maW5pc2hlZFByb21pc2U9dm9pZCAwKSksdGhpcy5fb2xkUGxheVN0YXRlPXRoaXMucGxheVN0YXRlLHRoaXMuX3JlYWR5UHJvbWlzZXx8dGhpcy5fZmluaXNoZWRQcm9taXNlfSxfcmVidWlsZFVuZGVybHlpbmdBbmltYXRpb246ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhLGMsZCxlLGY9ISF0aGlzLl9hbmltYXRpb247ZiYmKGE9dGhpcy5wbGF5YmFja1JhdGUsYz10aGlzLl9wYXVzZWQsZD10aGlzLnN0YXJ0VGltZSxlPXRoaXMuY3VycmVudFRpbWUsdGhpcy5fYW5pbWF0aW9uLmNhbmNlbCgpLHRoaXMuX2FuaW1hdGlvbi5fd3JhcHBlcj1udWxsLHRoaXMuX2FuaW1hdGlvbj1udWxsKSwoIXRoaXMuZWZmZWN0fHx0aGlzLmVmZmVjdCBpbnN0YW5jZW9mIHdpbmRvdy5LZXlmcmFtZUVmZmVjdCkmJih0aGlzLl9hbmltYXRpb249Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3QodGhpcy5lZmZlY3QpLGIuYmluZEFuaW1hdGlvbkZvcktleWZyYW1lRWZmZWN0KHRoaXMpKSwodGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3R8fHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93Lkdyb3VwRWZmZWN0KSYmKHRoaXMuX2FuaW1hdGlvbj1iLm5ld1VuZGVybHlpbmdBbmltYXRpb25Gb3JHcm91cCh0aGlzLmVmZmVjdCksYi5iaW5kQW5pbWF0aW9uRm9yR3JvdXAodGhpcykpLHRoaXMuZWZmZWN0JiZ0aGlzLmVmZmVjdC5fb25zYW1wbGUmJmIuYmluZEFuaW1hdGlvbkZvckN1c3RvbUVmZmVjdCh0aGlzKSxmJiYoMSE9YSYmKHRoaXMucGxheWJhY2tSYXRlPWEpLG51bGwhPT1kP3RoaXMuc3RhcnRUaW1lPWQ6bnVsbCE9PWU/dGhpcy5jdXJyZW50VGltZT1lOm51bGwhPT10aGlzLl9ob2xkVGltZSYmKHRoaXMuY3VycmVudFRpbWU9dGhpcy5faG9sZFRpbWUpLGMmJnRoaXMucGF1c2UoKSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sX3VwZGF0ZUNoaWxkcmVuOmZ1bmN0aW9uKCl7aWYodGhpcy5lZmZlY3QmJiJpZGxlIiE9dGhpcy5wbGF5U3RhdGUpe3ZhciBhPXRoaXMuZWZmZWN0Ll90aW1pbmcuZGVsYXk7dGhpcy5fY2hpbGRBbmltYXRpb25zLmZvckVhY2goZnVuY3Rpb24oYyl7dGhpcy5fYXJyYW5nZUNoaWxkcmVuKGMsYSksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihhKz1iLmdyb3VwQ2hpbGREdXJhdGlvbihjLmVmZmVjdCkpfS5iaW5kKHRoaXMpKX19LF9zZXRFeHRlcm5hbEFuaW1hdGlvbjpmdW5jdGlvbihhKXtpZih0aGlzLmVmZmVjdCYmdGhpcy5faXNHcm91cClmb3IodmFyIGI9MDtiPHRoaXMuZWZmZWN0LmNoaWxkcmVuLmxlbmd0aDtiKyspdGhpcy5lZmZlY3QuY2hpbGRyZW5bYl0uX2FuaW1hdGlvbj1hLHRoaXMuX2NoaWxkQW5pbWF0aW9uc1tiXS5fc2V0RXh0ZXJuYWxBbmltYXRpb24oYSl9LF9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnM6ZnVuY3Rpb24oKXtpZih0aGlzLmVmZmVjdCYmdGhpcy5faXNHcm91cCl7dmFyIGE9dGhpcy5lZmZlY3QuX3RpbWluZy5kZWxheTt0aGlzLl9yZW1vdmVDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLmVmZmVjdC5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGMpe3ZhciBkPWIudGltZWxpbmUuX3BsYXkoYyk7dGhpcy5fY2hpbGRBbmltYXRpb25zLnB1c2goZCksZC5wbGF5YmFja1JhdGU9dGhpcy5wbGF5YmFja1JhdGUsdGhpcy5fcGF1c2VkJiZkLnBhdXNlKCksYy5fYW5pbWF0aW9uPXRoaXMuZWZmZWN0Ll9hbmltYXRpb24sdGhpcy5fYXJyYW5nZUNoaWxkcmVuKGQsYSksdGhpcy5lZmZlY3QgaW5zdGFuY2VvZiB3aW5kb3cuU2VxdWVuY2VFZmZlY3QmJihhKz1iLmdyb3VwQ2hpbGREdXJhdGlvbihjKSl9LmJpbmQodGhpcykpfX0sX2FycmFuZ2VDaGlsZHJlbjpmdW5jdGlvbihhLGIpe251bGw9PT10aGlzLnN0YXJ0VGltZT9hLmN1cnJlbnRUaW1lPXRoaXMuY3VycmVudFRpbWUtYi90aGlzLnBsYXliYWNrUmF0ZTphLnN0YXJ0VGltZSE9PXRoaXMuc3RhcnRUaW1lK2IvdGhpcy5wbGF5YmFja1JhdGUmJihhLnN0YXJ0VGltZT10aGlzLnN0YXJ0VGltZStiL3RoaXMucGxheWJhY2tSYXRlKX0sZ2V0IHRpbWVsaW5lKCl7cmV0dXJuIHRoaXMuX3RpbWVsaW5lfSxnZXQgcGxheVN0YXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbj90aGlzLl9hbmltYXRpb24ucGxheVN0YXRlOiJpZGxlIn0sZ2V0IGZpbmlzaGVkKCl7cmV0dXJuIHdpbmRvdy5Qcm9taXNlPyh0aGlzLl9maW5pc2hlZFByb21pc2V8fCgtMT09Yi5hbmltYXRpb25zV2l0aFByb21pc2VzLmluZGV4T2YodGhpcykmJmIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5wdXNoKHRoaXMpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZT1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe3RoaXMuX3Jlc29sdmVGaW5pc2hlZFByb21pc2U9ZnVuY3Rpb24oKXthKHRoaXMpfSx0aGlzLl9yZWplY3RGaW5pc2hlZFByb21pc2U9ZnVuY3Rpb24oKXtiKHt0eXBlOkRPTUV4Y2VwdGlvbi5BQk9SVF9FUlIsbmFtZToiQWJvcnRFcnJvciJ9KX19LmJpbmQodGhpcykpLCJmaW5pc2hlZCI9PXRoaXMucGxheVN0YXRlJiZ0aGlzLl9yZXNvbHZlRmluaXNoZWRQcm9taXNlKCkpLHRoaXMuX2ZpbmlzaGVkUHJvbWlzZSk6KGNvbnNvbGUud2FybigiQW5pbWF0aW9uIFByb21pc2VzIHJlcXVpcmUgSmF2YVNjcmlwdCBQcm9taXNlIGNvbnN0cnVjdG9yIiksbnVsbCl9LGdldCByZWFkeSgpe3JldHVybiB3aW5kb3cuUHJvbWlzZT8odGhpcy5fcmVhZHlQcm9taXNlfHwoLTE9PWIuYW5pbWF0aW9uc1dpdGhQcm9taXNlcy5pbmRleE9mKHRoaXMpJiZiLmFuaW1hdGlvbnNXaXRoUHJvbWlzZXMucHVzaCh0aGlzKSx0aGlzLl9yZWFkeVByb21pc2U9bmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXt0aGlzLl9yZXNvbHZlUmVhZHlQcm9taXNlPWZ1bmN0aW9uKCl7YSh0aGlzKX0sdGhpcy5fcmVqZWN0UmVhZHlQcm9taXNlPWZ1bmN0aW9uKCl7Yih7dHlwZTpET01FeGNlcHRpb24uQUJPUlRfRVJSLG5hbWU6IkFib3J0RXJyb3IifSl9fS5iaW5kKHRoaXMpKSwicGVuZGluZyIhPT10aGlzLnBsYXlTdGF0ZSYmdGhpcy5fcmVzb2x2ZVJlYWR5UHJvbWlzZSgpKSx0aGlzLl9yZWFkeVByb21pc2UpOihjb25zb2xlLndhcm4oIkFuaW1hdGlvbiBQcm9taXNlcyByZXF1aXJlIEphdmFTY3JpcHQgUHJvbWlzZSBjb25zdHJ1Y3RvciIpLG51bGwpfSxnZXQgb25maW5pc2goKXtyZXR1cm4gdGhpcy5fYW5pbWF0aW9uLm9uZmluaXNofSxzZXQgb25maW5pc2goYSl7dGhpcy5fYW5pbWF0aW9uLm9uZmluaXNoPSJmdW5jdGlvbiI9PXR5cGVvZiBhP2Z1bmN0aW9uKGIpe2IudGFyZ2V0PXRoaXMsYS5jYWxsKHRoaXMsYil9LmJpbmQodGhpcyk6YX0sZ2V0IG9uY2FuY2VsKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbH0sc2V0IG9uY2FuY2VsKGEpe3RoaXMuX2FuaW1hdGlvbi5vbmNhbmNlbD0iZnVuY3Rpb24iPT10eXBlb2YgYT9mdW5jdGlvbihiKXtiLnRhcmdldD10aGlzLGEuY2FsbCh0aGlzLGIpfS5iaW5kKHRoaXMpOmF9LGdldCBjdXJyZW50VGltZSgpe3RoaXMuX3VwZGF0ZVByb21pc2VzKCk7dmFyIGE9dGhpcy5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lO3JldHVybiB0aGlzLl91cGRhdGVQcm9taXNlcygpLGF9LHNldCBjdXJyZW50VGltZShhKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jdXJyZW50VGltZT1pc0Zpbml0ZShhKT9hOk1hdGguc2lnbihhKSpOdW1iZXIuTUFYX1ZBTFVFLHRoaXMuX3JlZ2lzdGVyKCksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGIsYyl7Yi5jdXJyZW50VGltZT1hLWN9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgc3RhcnRUaW1lKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5zdGFydFRpbWV9LHNldCBzdGFydFRpbWUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uc3RhcnRUaW1lPWlzRmluaXRlKGEpP2E6TWF0aC5zaWduKGEpKk51bWJlci5NQVhfVkFMVUUsdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYixjKXtiLnN0YXJ0VGltZT1hK2N9KSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxnZXQgcGxheWJhY2tSYXRlKCl7cmV0dXJuIHRoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGV9LHNldCBwbGF5YmFja1JhdGUoYSl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKTt2YXIgYj10aGlzLmN1cnJlbnRUaW1lO3RoaXMuX2FuaW1hdGlvbi5wbGF5YmFja1JhdGU9YSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYil7Yi5wbGF5YmFja1JhdGU9YX0pLG51bGwhPT1iJiYodGhpcy5jdXJyZW50VGltZT1iKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxwbGF5OmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9wYXVzZWQ9ITEsdGhpcy5fYW5pbWF0aW9uLnBsYXkoKSwtMT09dGhpcy5fdGltZWxpbmUuX2FuaW1hdGlvbnMuaW5kZXhPZih0aGlzKSYmdGhpcy5fdGltZWxpbmUuX2FuaW1hdGlvbnMucHVzaCh0aGlzKSx0aGlzLl9yZWdpc3RlcigpLGIuYXdhaXRTdGFydFRpbWUodGhpcyksdGhpcy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe3ZhciBiPWEuY3VycmVudFRpbWU7YS5wbGF5KCksYS5jdXJyZW50VGltZT1ifSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0scGF1c2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuY3VycmVudFRpbWUmJih0aGlzLl9ob2xkVGltZT10aGlzLmN1cnJlbnRUaW1lKSx0aGlzLl9hbmltYXRpb24ucGF1c2UoKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX2ZvckVhY2hDaGlsZChmdW5jdGlvbihhKXthLnBhdXNlKCl9KSx0aGlzLl9wYXVzZWQ9ITAsdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sZmluaXNoOmZ1bmN0aW9uKCl7dGhpcy5fdXBkYXRlUHJvbWlzZXMoKSx0aGlzLl9hbmltYXRpb24uZmluaXNoKCksdGhpcy5fcmVnaXN0ZXIoKSx0aGlzLl91cGRhdGVQcm9taXNlcygpfSxjYW5jZWw6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpLHRoaXMuX2FuaW1hdGlvbi5jYW5jZWwoKSx0aGlzLl9yZWdpc3RlcigpLHRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpLHRoaXMuX3VwZGF0ZVByb21pc2VzKCl9LHJldmVyc2U6ZnVuY3Rpb24oKXt0aGlzLl91cGRhdGVQcm9taXNlcygpO3ZhciBhPXRoaXMuY3VycmVudFRpbWU7dGhpcy5fYW5pbWF0aW9uLnJldmVyc2UoKSx0aGlzLl9mb3JFYWNoQ2hpbGQoZnVuY3Rpb24oYSl7YS5yZXZlcnNlKCl9KSxudWxsIT09YSYmKHRoaXMuY3VycmVudFRpbWU9YSksdGhpcy5fdXBkYXRlUHJvbWlzZXMoKX0sYWRkRXZlbnRMaXN0ZW5lcjpmdW5jdGlvbihhLGIpe3ZhciBjPWI7ImZ1bmN0aW9uIj09dHlwZW9mIGImJihjPWZ1bmN0aW9uKGEpe2EudGFyZ2V0PXRoaXMsYi5jYWxsKHRoaXMsYSl9LmJpbmQodGhpcyksYi5fd3JhcHBlcj1jKSx0aGlzLl9hbmltYXRpb24uYWRkRXZlbnRMaXN0ZW5lcihhLGMpfSxyZW1vdmVFdmVudExpc3RlbmVyOmZ1bmN0aW9uKGEsYil7dGhpcy5fYW5pbWF0aW9uLnJlbW92ZUV2ZW50TGlzdGVuZXIoYSxiJiZiLl93cmFwcGVyfHxiKX0sX3JlbW92ZUNoaWxkQW5pbWF0aW9uczpmdW5jdGlvbigpe2Zvcig7dGhpcy5fY2hpbGRBbmltYXRpb25zLmxlbmd0aDspdGhpcy5fY2hpbGRBbmltYXRpb25zLnBvcCgpLmNhbmNlbCgpfSxfZm9yRWFjaENoaWxkOmZ1bmN0aW9uKGIpe3ZhciBjPTA7aWYodGhpcy5lZmZlY3QuY2hpbGRyZW4mJnRoaXMuX2NoaWxkQW5pbWF0aW9ucy5sZW5ndGg8dGhpcy5lZmZlY3QuY2hpbGRyZW4ubGVuZ3RoJiZ0aGlzLl9jb25zdHJ1Y3RDaGlsZEFuaW1hdGlvbnMoKSx0aGlzLl9jaGlsZEFuaW1hdGlvbnMuZm9yRWFjaChmdW5jdGlvbihhKXtiLmNhbGwodGhpcyxhLGMpLHRoaXMuZWZmZWN0IGluc3RhbmNlb2Ygd2luZG93LlNlcXVlbmNlRWZmZWN0JiYoYys9YS5lZmZlY3QuYWN0aXZlRHVyYXRpb24pfS5iaW5kKHRoaXMpKSwicGVuZGluZyIhPXRoaXMucGxheVN0YXRlKXt2YXIgZD10aGlzLmVmZmVjdC5fdGltaW5nLGU9dGhpcy5jdXJyZW50VGltZTtudWxsIT09ZSYmKGU9YS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcyhhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGQpLGUsZCkpLChudWxsPT1lfHxpc05hTihlKSkmJnRoaXMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpfX19LHdpbmRvdy5BbmltYXRpb249Yi5BbmltYXRpb259KGEsYyksZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYil7dGhpcy5fZnJhbWVzPWEubm9ybWFsaXplS2V5ZnJhbWVzKGIpfWZ1bmN0aW9uIGUoKXtmb3IodmFyIGE9ITE7aS5sZW5ndGg7KWkuc2hpZnQoKS5fdXBkYXRlQ2hpbGRyZW4oKSxhPSEwO3JldHVybiBhfXZhciBmPWZ1bmN0aW9uKGEpe2lmKGEuX2FuaW1hdGlvbj12b2lkIDAsYSBpbnN0YW5jZW9mIHdpbmRvdy5TZXF1ZW5jZUVmZmVjdHx8YSBpbnN0YW5jZW9mIHdpbmRvdy5Hcm91cEVmZmVjdClmb3IodmFyIGI9MDtiPGEuY2hpbGRyZW4ubGVuZ3RoO2IrKylmKGEuY2hpbGRyZW5bYl0pfTtiLnJlbW92ZU11bHRpPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1bXSxjPTA7YzxhLmxlbmd0aDtjKyspe3ZhciBkPWFbY107ZC5fcGFyZW50PygtMT09Yi5pbmRleE9mKGQuX3BhcmVudCkmJmIucHVzaChkLl9wYXJlbnQpLGQuX3BhcmVudC5jaGlsZHJlbi5zcGxpY2UoZC5fcGFyZW50LmNoaWxkcmVuLmluZGV4T2YoZCksMSksZC5fcGFyZW50PW51bGwsZihkKSk6ZC5fYW5pbWF0aW9uJiZkLl9hbmltYXRpb24uZWZmZWN0PT1kJiYoZC5fYW5pbWF0aW9uLmNhbmNlbCgpLGQuX2FuaW1hdGlvbi5lZmZlY3Q9bmV3IEtleWZyYW1lRWZmZWN0KG51bGwsW10pLGQuX2FuaW1hdGlvbi5fY2FsbGJhY2smJihkLl9hbmltYXRpb24uX2NhbGxiYWNrLl9hbmltYXRpb249bnVsbCksZC5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpLGYoZCkpfWZvcihjPTA7YzxiLmxlbmd0aDtjKyspYltjXS5fcmVidWlsZCgpfSxiLktleWZyYW1lRWZmZWN0PWZ1bmN0aW9uKGIsYyxlLGYpe3JldHVybiB0aGlzLnRhcmdldD1iLHRoaXMuX3BhcmVudD1udWxsLGU9YS5udW1lcmljVGltaW5nVG9PYmplY3QoZSksdGhpcy5fdGltaW5nSW5wdXQ9YS5jbG9uZVRpbWluZ0lucHV0KGUpLHRoaXMuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGUpLHRoaXMudGltaW5nPWEubWFrZVRpbWluZyhlLCExLHRoaXMpLHRoaXMudGltaW5nLl9lZmZlY3Q9dGhpcywiZnVuY3Rpb24iPT10eXBlb2YgYz8oYS5kZXByZWNhdGVkKCJDdXN0b20gS2V5ZnJhbWVFZmZlY3QiLCIyMDE1LTA2LTIyIiwiVXNlIEtleWZyYW1lRWZmZWN0Lm9uc2FtcGxlIGluc3RlYWQuIiksdGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcz1jKTp0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzPW5ldyBkKGMpLHRoaXMuX2tleWZyYW1lcz1jLHRoaXMuYWN0aXZlRHVyYXRpb249YS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbih0aGlzLl90aW1pbmcpLHRoaXMuX2lkPWYsdGhpc30sYi5LZXlmcmFtZUVmZmVjdC5wcm90b3R5cGU9e2dldEZyYW1lczpmdW5jdGlvbigpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiB0aGlzLl9ub3JtYWxpemVkS2V5ZnJhbWVzP3RoaXMuX25vcm1hbGl6ZWRLZXlmcmFtZXM6dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcy5fZnJhbWVzfSxzZXQgb25zYW1wbGUoYSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIHRoaXMuZ2V0RnJhbWVzKCkpdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nIG9uc2FtcGxlIG9uIGN1c3RvbSBlZmZlY3QgS2V5ZnJhbWVFZmZlY3QgaXMgbm90IHN1cHBvcnRlZC4iKTt0aGlzLl9vbnNhbXBsZT1hLHRoaXMuX2FuaW1hdGlvbiYmdGhpcy5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpfSxnZXQgcGFyZW50KCl7cmV0dXJuIHRoaXMuX3BhcmVudH0sY2xvbmU6ZnVuY3Rpb24oKXtpZigiZnVuY3Rpb24iPT10eXBlb2YgdGhpcy5nZXRGcmFtZXMoKSl0aHJvdyBuZXcgRXJyb3IoIkNsb25pbmcgY3VzdG9tIGVmZmVjdHMgaXMgbm90IHN1cHBvcnRlZC4iKTt2YXIgYj1uZXcgS2V5ZnJhbWVFZmZlY3QodGhpcy50YXJnZXQsW10sYS5jbG9uZVRpbWluZ0lucHV0KHRoaXMuX3RpbWluZ0lucHV0KSx0aGlzLl9pZCk7cmV0dXJuIGIuX25vcm1hbGl6ZWRLZXlmcmFtZXM9dGhpcy5fbm9ybWFsaXplZEtleWZyYW1lcyxiLl9rZXlmcmFtZXM9dGhpcy5fa2V5ZnJhbWVzLGJ9LHJlbW92ZTpmdW5jdGlvbigpe2IucmVtb3ZlTXVsdGkoW3RoaXNdKX19O3ZhciBnPUVsZW1lbnQucHJvdG90eXBlLmFuaW1hdGU7RWxlbWVudC5wcm90b3R5cGUuYW5pbWF0ZT1mdW5jdGlvbihhLGMpe3ZhciBkPSIiO3JldHVybiBjJiZjLmlkJiYoZD1jLmlkKSxiLnRpbWVsaW5lLl9wbGF5KG5ldyBiLktleWZyYW1lRWZmZWN0KHRoaXMsYSxjLGQpKX07dmFyIGg9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2Iik7Yi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYSl7aWYoYSl7dmFyIGI9YS50YXJnZXR8fGgsYz1hLl9rZXlmcmFtZXM7ImZ1bmN0aW9uIj09dHlwZW9mIGMmJihjPVtdKTt2YXIgZD1hLl90aW1pbmdJbnB1dDtkLmlkPWEuX2lkfWVsc2UgdmFyIGI9aCxjPVtdLGQ9MDtyZXR1cm4gZy5hcHBseShiLFtjLGRdKX0sYi5iaW5kQW5pbWF0aW9uRm9yS2V5ZnJhbWVFZmZlY3Q9ZnVuY3Rpb24oYSl7YS5lZmZlY3QmJiJmdW5jdGlvbiI9PXR5cGVvZiBhLmVmZmVjdC5fbm9ybWFsaXplZEtleWZyYW1lcyYmYi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0KGEpfTt2YXIgaT1bXTtiLmF3YWl0U3RhcnRUaW1lPWZ1bmN0aW9uKGEpe251bGw9PT1hLnN0YXJ0VGltZSYmYS5faXNHcm91cCYmKDA9PWkubGVuZ3RoJiZyZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZSksaS5wdXNoKGEpKX07dmFyIGo9d2luZG93LmdldENvbXB1dGVkU3R5bGU7T2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdywiZ2V0Q29tcHV0ZWRTdHlsZSIse2NvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiEwLHZhbHVlOmZ1bmN0aW9uKCl7Yi50aW1lbGluZS5fdXBkYXRlQW5pbWF0aW9uc1Byb21pc2VzKCk7dmFyIGE9ai5hcHBseSh0aGlzLGFyZ3VtZW50cyk7cmV0dXJuIGUoKSYmKGE9ai5hcHBseSh0aGlzLGFyZ3VtZW50cykpLGIudGltZWxpbmUuX3VwZGF0ZUFuaW1hdGlvbnNQcm9taXNlcygpLGF9fSksd2luZG93LktleWZyYW1lRWZmZWN0PWIuS2V5ZnJhbWVFZmZlY3Qsd2luZG93LkVsZW1lbnQucHJvdG90eXBlLmdldEFuaW1hdGlvbnM9ZnVuY3Rpb24oKXtyZXR1cm4gZG9jdW1lbnQudGltZWxpbmUuZ2V0QW5pbWF0aW9ucygpLmZpbHRlcihmdW5jdGlvbihhKXtyZXR1cm4gbnVsbCE9PWEuZWZmZWN0JiZhLmVmZmVjdC50YXJnZXQ9PXRoaXN9LmJpbmQodGhpcykpfX0oYSxjKSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhKXthLl9yZWdpc3RlcmVkfHwoYS5fcmVnaXN0ZXJlZD0hMCxnLnB1c2goYSksaHx8KGg9ITAscmVxdWVzdEFuaW1hdGlvbkZyYW1lKGUpKSl9ZnVuY3Rpb24gZShhKXt2YXIgYj1nO2c9W10sYi5zb3J0KGZ1bmN0aW9uKGEsYil7cmV0dXJuIGEuX3NlcXVlbmNlTnVtYmVyLWIuX3NlcXVlbmNlTnVtYmVyfSksYj1iLmZpbHRlcihmdW5jdGlvbihhKXthKCk7dmFyIGI9YS5fYW5pbWF0aW9uP2EuX2FuaW1hdGlvbi5wbGF5U3RhdGU6ImlkbGUiO3JldHVybiJydW5uaW5nIiE9YiYmInBlbmRpbmciIT1iJiYoYS5fcmVnaXN0ZXJlZD0hMSksYS5fcmVnaXN0ZXJlZH0pLGcucHVzaC5hcHBseShnLGIpLGcubGVuZ3RoPyhoPSEwLHJlcXVlc3RBbmltYXRpb25GcmFtZShlKSk6aD0hMX12YXIgZj0oZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiwiZGl2IiksMCk7Yi5iaW5kQW5pbWF0aW9uRm9yQ3VzdG9tRWZmZWN0PWZ1bmN0aW9uKGIpe3ZhciBjLGU9Yi5lZmZlY3QudGFyZ2V0LGc9ImZ1bmN0aW9uIj09dHlwZW9mIGIuZWZmZWN0LmdldEZyYW1lcygpO2M9Zz9iLmVmZmVjdC5nZXRGcmFtZXMoKTpiLmVmZmVjdC5fb25zYW1wbGU7dmFyIGg9Yi5lZmZlY3QudGltaW5nLGk9bnVsbDtoPWEubm9ybWFsaXplVGltaW5nSW5wdXQoaCk7dmFyIGo9ZnVuY3Rpb24oKXt2YXIgZD1qLl9hbmltYXRpb24/ai5fYW5pbWF0aW9uLmN1cnJlbnRUaW1lOm51bGw7bnVsbCE9PWQmJihkPWEuY2FsY3VsYXRlSXRlcmF0aW9uUHJvZ3Jlc3MoYS5jYWxjdWxhdGVBY3RpdmVEdXJhdGlvbihoKSxkLGgpLGlzTmFOKGQpJiYoZD1udWxsKSksZCE9PWkmJihnP2MoZCxlLGIuZWZmZWN0KTpjKGQsYi5lZmZlY3QsYi5lZmZlY3QuX2FuaW1hdGlvbikpLGk9ZH07ai5fYW5pbWF0aW9uPWIsai5fcmVnaXN0ZXJlZD0hMSxqLl9zZXF1ZW5jZU51bWJlcj1mKyssYi5fY2FsbGJhY2s9aixkKGopfTt2YXIgZz1bXSxoPSExO2IuQW5pbWF0aW9uLnByb3RvdHlwZS5fcmVnaXN0ZXI9ZnVuY3Rpb24oKXt0aGlzLl9jYWxsYmFjayYmZCh0aGlzLl9jYWxsYmFjayl9fShhLGMpLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEpe3JldHVybiBhLl90aW1pbmcuZGVsYXkrYS5hY3RpdmVEdXJhdGlvbithLl90aW1pbmcuZW5kRGVsYXl9ZnVuY3Rpb24gZShiLGMsZCl7dGhpcy5faWQ9ZCx0aGlzLl9wYXJlbnQ9bnVsbCx0aGlzLmNoaWxkcmVuPWJ8fFtdLHRoaXMuX3JlcGFyZW50KHRoaXMuY2hpbGRyZW4pLGM9YS5udW1lcmljVGltaW5nVG9PYmplY3QoYyksdGhpcy5fdGltaW5nSW5wdXQ9YS5jbG9uZVRpbWluZ0lucHV0KGMpLHRoaXMuX3RpbWluZz1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMsITApLHRoaXMudGltaW5nPWEubWFrZVRpbWluZyhjLCEwLHRoaXMpLHRoaXMudGltaW5nLl9lZmZlY3Q9dGhpcywiYXV0byI9PT10aGlzLl90aW1pbmcuZHVyYXRpb24mJih0aGlzLl90aW1pbmcuZHVyYXRpb249dGhpcy5hY3RpdmVEdXJhdGlvbil9d2luZG93LlNlcXVlbmNlRWZmZWN0PWZ1bmN0aW9uKCl7ZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LHdpbmRvdy5Hcm91cEVmZmVjdD1mdW5jdGlvbigpe2UuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxlLnByb3RvdHlwZT17X2lzQW5jZXN0b3I6ZnVuY3Rpb24oYSl7Zm9yKHZhciBiPXRoaXM7bnVsbCE9PWI7KXtpZihiPT1hKXJldHVybiEwO2I9Yi5fcGFyZW50fXJldHVybiExfSxfcmVidWlsZDpmdW5jdGlvbigpe2Zvcih2YXIgYT10aGlzO2E7KSJhdXRvIj09PWEudGltaW5nLmR1cmF0aW9uJiYoYS5fdGltaW5nLmR1cmF0aW9uPWEuYWN0aXZlRHVyYXRpb24pLGE9YS5fcGFyZW50O3RoaXMuX2FuaW1hdGlvbiYmdGhpcy5fYW5pbWF0aW9uLl9yZWJ1aWxkVW5kZXJseWluZ0FuaW1hdGlvbigpfSxfcmVwYXJlbnQ6ZnVuY3Rpb24oYSl7Yi5yZW1vdmVNdWx0aShhKTtmb3IodmFyIGM9MDtjPGEubGVuZ3RoO2MrKylhW2NdLl9wYXJlbnQ9dGhpc30sX3B1dENoaWxkOmZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWI/IkNhbm5vdCBhcHBlbmQgYW4gYW5jZXN0b3Igb3Igc2VsZiI6IkNhbm5vdCBwcmVwZW5kIGFuIGFuY2VzdG9yIG9yIHNlbGYiLGQ9MDtkPGEubGVuZ3RoO2QrKylpZih0aGlzLl9pc0FuY2VzdG9yKGFbZF0pKXRocm93e3R5cGU6RE9NRXhjZXB0aW9uLkhJRVJBUkNIWV9SRVFVRVNUX0VSUixuYW1lOiJIaWVyYXJjaHlSZXF1ZXN0RXJyb3IiLG1lc3NhZ2U6Y307Zm9yKHZhciBkPTA7ZDxhLmxlbmd0aDtkKyspYj90aGlzLmNoaWxkcmVuLnB1c2goYVtkXSk6dGhpcy5jaGlsZHJlbi51bnNoaWZ0KGFbZF0pO3RoaXMuX3JlcGFyZW50KGEpLHRoaXMuX3JlYnVpbGQoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7dGhpcy5fcHV0Q2hpbGQoYXJndW1lbnRzLCEwKX0scHJlcGVuZDpmdW5jdGlvbigpe3RoaXMuX3B1dENoaWxkKGFyZ3VtZW50cywhMSl9LGdldCBwYXJlbnQoKXtyZXR1cm4gdGhpcy5fcGFyZW50fSxnZXQgZmlyc3RDaGlsZCgpe3JldHVybiB0aGlzLmNoaWxkcmVuLmxlbmd0aD90aGlzLmNoaWxkcmVuWzBdOm51bGx9LGdldCBsYXN0Q2hpbGQoKXtyZXR1cm4gdGhpcy5jaGlsZHJlbi5sZW5ndGg/dGhpcy5jaGlsZHJlblt0aGlzLmNoaWxkcmVuLmxlbmd0aC0xXTpudWxsfSxjbG9uZTpmdW5jdGlvbigpe2Zvcih2YXIgYj1hLmNsb25lVGltaW5nSW5wdXQodGhpcy5fdGltaW5nSW5wdXQpLGM9W10sZD0wO2Q8dGhpcy5jaGlsZHJlbi5sZW5ndGg7ZCsrKWMucHVzaCh0aGlzLmNoaWxkcmVuW2RdLmNsb25lKCkpO3JldHVybiB0aGlzIGluc3RhbmNlb2YgR3JvdXBFZmZlY3Q/bmV3IEdyb3VwRWZmZWN0KGMsYik6bmV3IFNlcXVlbmNlRWZmZWN0KGMsYil9LHJlbW92ZTpmdW5jdGlvbigpe2IucmVtb3ZlTXVsdGkoW3RoaXNdKX19LHdpbmRvdy5TZXF1ZW5jZUVmZmVjdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5TZXF1ZW5jZUVmZmVjdC5wcm90b3R5cGUsImFjdGl2ZUR1cmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2ErPWQoYil9KSxNYXRoLm1heChhLDApfX0pLHdpbmRvdy5Hcm91cEVmZmVjdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlLnByb3RvdHlwZSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHdpbmRvdy5Hcm91cEVmZmVjdC5wcm90b3R5cGUsImFjdGl2ZUR1cmF0aW9uIix7Z2V0OmZ1bmN0aW9uKCl7dmFyIGE9MDtyZXR1cm4gdGhpcy5jaGlsZHJlbi5mb3JFYWNoKGZ1bmN0aW9uKGIpe2E9TWF0aC5tYXgoYSxkKGIpKX0pLGF9fSksYi5uZXdVbmRlcmx5aW5nQW5pbWF0aW9uRm9yR3JvdXA9ZnVuY3Rpb24oYyl7dmFyIGQsZT1udWxsLGY9ZnVuY3Rpb24oYil7dmFyIGM9ZC5fd3JhcHBlcjtpZihjJiYicGVuZGluZyIhPWMucGxheVN0YXRlJiZjLmVmZmVjdClyZXR1cm4gbnVsbD09Yj92b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpOjA9PWImJmMucGxheWJhY2tSYXRlPDAmJihlfHwoZT1hLm5vcm1hbGl6ZVRpbWluZ0lucHV0KGMuZWZmZWN0LnRpbWluZykpLGI9YS5jYWxjdWxhdGVJdGVyYXRpb25Qcm9ncmVzcyhhLmNhbGN1bGF0ZUFjdGl2ZUR1cmF0aW9uKGUpLC0xLGUpLGlzTmFOKGIpfHxudWxsPT1iKT8oYy5fZm9yRWFjaENoaWxkKGZ1bmN0aW9uKGEpe2EuY3VycmVudFRpbWU9LTF9KSx2b2lkIGMuX3JlbW92ZUNoaWxkQW5pbWF0aW9ucygpKTp2b2lkIDB9LGc9bmV3IEtleWZyYW1lRWZmZWN0KG51bGwsW10sYy5fdGltaW5nLGMuX2lkKTtyZXR1cm4gZy5vbnNhbXBsZT1mLGQ9Yi50aW1lbGluZS5fcGxheShnKX0sYi5iaW5kQW5pbWF0aW9uRm9yR3JvdXA9ZnVuY3Rpb24oYSl7YS5fYW5pbWF0aW9uLl93cmFwcGVyPWEsYS5faXNHcm91cD0hMCxiLmF3YWl0U3RhcnRUaW1lKGEpLGEuX2NvbnN0cnVjdENoaWxkQW5pbWF0aW9ucygpLGEuX3NldEV4dGVybmFsQW5pbWF0aW9uKGEpfSxiLmdyb3VwQ2hpbGREdXJhdGlvbj1kfShhLGMpfSgpOwoKKGZ1bmN0aW9uICgpIHsKCiAgICAvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4NCg0KICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4NCg0KICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIDQogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZDQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULA0KICAgIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQ0KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SDQogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUg0KICAgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICAgIGZ1bmN0aW9uIF9fZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpIHsNCiAgICAgICAgdmFyIGMgPSBhcmd1bWVudHMubGVuZ3RoLCByID0gYyA8IDMgPyB0YXJnZXQgOiBkZXNjID09PSBudWxsID8gZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBrZXkpIDogZGVzYywgZDsNCiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5kZWNvcmF0ZSA9PT0gImZ1bmN0aW9uIikgciA9IFJlZmxlY3QuZGVjb3JhdGUoZGVjb3JhdG9ycywgdGFyZ2V0LCBrZXksIGRlc2MpOw0KICAgICAgICBlbHNlIGZvciAodmFyIGkgPSBkZWNvcmF0b3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSBpZiAoZCA9IGRlY29yYXRvcnNbaV0pIHIgPSAoYyA8IDMgPyBkKHIpIDogYyA+IDMgPyBkKHRhcmdldCwga2V5LCByKSA6IGQodGFyZ2V0LCBrZXkpKSB8fCByOw0KICAgICAgICByZXR1cm4gYyA+IDMgJiYgciAmJiBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBrZXksIHIpLCByOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIF9fbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIF9fYXdhaXRlcih0aGlzQXJnLCBfYXJndW1lbnRzLCBQLCBnZW5lcmF0b3IpIHsNCiAgICAgICAgZnVuY3Rpb24gYWRvcHQodmFsdWUpIHsgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgUCA/IHZhbHVlIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZSh2YWx1ZSk7IH0pOyB9DQogICAgICAgIHJldHVybiBuZXcgKFAgfHwgKFAgPSBQcm9taXNlKSkoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgew0KICAgICAgICAgICAgZnVuY3Rpb24gZnVsZmlsbGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yLm5leHQodmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICAgICAgZnVuY3Rpb24gcmVqZWN0ZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3JbInRocm93Il0odmFsdWUpKTsgfSBjYXRjaCAoZSkgeyByZWplY3QoZSk7IH0gfQ0KICAgICAgICAgICAgZnVuY3Rpb24gc3RlcChyZXN1bHQpIHsgcmVzdWx0LmRvbmUgPyByZXNvbHZlKHJlc3VsdC52YWx1ZSkgOiBhZG9wdChyZXN1bHQudmFsdWUpLnRoZW4oZnVsZmlsbGVkLCByZWplY3RlZCk7IH0NCiAgICAgICAgICAgIHN0ZXAoKGdlbmVyYXRvciA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSkubmV4dCgpKTsNCiAgICAgICAgfSk7DQogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kCiAgICAgKiBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5CiAgICAgKiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5CiAgICAgKiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQCiAgICAgKiByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KICAgIC8qKgogICAgICogQSBUeXBlU2NyaXB0IGNsYXNzIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgcmVnaXN0ZXJzIHRoZSBjbGFzcyBhcyBhIGN1c3RvbQogICAgICogZWxlbWVudC4KICAgICAqCiAgICAgKiBJZiBgdGFnbmFtZWAgaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCBhcyB0aGUgY3VzdG9tIGVsZW1lbnQgbmFtZSwgYW5kCiAgICAgKiB3aWxsIGJlIGFzc2lnbmVkIHRvIHRoZSBjbGFzcyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4gSWYgYHRhZ25hbWVgIGlzIG9taXR0ZWQsCiAgICAgKiB0aGUgc3RhdGljIGBpc2AgcHJvcGVydHkgb2YgdGhlIGNsYXNzIHdpbGwgYmUgdXNlZCBpbnN0ZWFkLiBJZiBuZWl0aGVyIGV4aXN0LAogICAgICogb3IgaWYgYm90aCBleGlzdCBidXQgaGF2ZSBkaWZmZXJlbnQgdmFsdWVzIChleGNlcHQgaW4gdGhlIGNhc2UgdGhhdCB0aGUgYGlzYAogICAgICogcHJvcGVydHkgaXMgbm90IGFuIG93bi1wcm9wZXJ0eSBvZiB0aGUgY2xhc3MpLCBhbiBleGNlcHRpb24gaXMgdGhyb3duLgogICAgICovCiAgICBmdW5jdGlvbiBjdXN0b21FbGVtZW50KHRhZ25hbWUpIHsKICAgICAgICByZXR1cm4gKGNsYXNzXykgPT4gewogICAgICAgICAgICBpZiAodGFnbmFtZSkgewogICAgICAgICAgICAgICAgLy8gT25seSBjaGVjayB0aGF0IHRhZyBuYW1lcyBtYXRjaCB3aGVuIGBpc2AgaXMgb3VyIG93biBwcm9wZXJ0eS4gSXQgbWlnaHQKICAgICAgICAgICAgICAgIC8vIGJlIGluaGVyaXRlZCBmcm9tIGEgc3VwZXJjbGFzcywgaW4gd2hpY2ggY2FzZSBpdCdzIG9rIGlmIHRoZXkncmUKICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCwgYW5kIHdlJ2xsIG92ZXJyaWRlIGl0IHdpdGggb3VyIG93biBwcm9wZXJ0eSBiZWxvdy4KICAgICAgICAgICAgICAgIGlmIChjbGFzc18uaGFzT3duUHJvcGVydHkoJ2lzJykpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFnbmFtZSAhPT0gY2xhc3NfLmlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY3VzdG9tIGVsZW1lbnQgdGFnIG5hbWVzIGRvIG5vdCBtYXRjaDogYCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgKCR7dGFnbmFtZX0gIT09ICR7Y2xhc3NfLmlzfSlgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xhc3NfLCAnaXMnLCB7IHZhbHVlOiB0YWduYW1lIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRocm93cyBpZiB0YWcgbmFtZSBpcyBtaXNzaW5nIG9yIGludmFsaWQuCiAgICAgICAgICAgIHdpbmRvdy5jdXN0b21FbGVtZW50cy5kZWZpbmUoY2xhc3NfLmlzLCBjbGFzc18pOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVQcm9wZXJ0eShwcm90bywgbmFtZSwgb3B0aW9ucykgewogICAgICAgIGlmICghcHJvdG8uY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoJ3Byb3BlcnRpZXMnKSkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8uY29uc3RydWN0b3IsICdwcm9wZXJ0aWVzJywgeyB2YWx1ZToge30gfSk7CiAgICAgICAgfQogICAgICAgIHByb3RvLmNvbnN0cnVjdG9yLnByb3BlcnRpZXNbbmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBwcm90by5jb25zdHJ1Y3Rvci5wcm9wZXJ0aWVzW25hbWVdLCBvcHRpb25zKTsKICAgIH0KICAgIC8qKgogICAgICogQSBUeXBlU2NyaXB0IHByb3BlcnR5IGRlY29yYXRvciBmYWN0b3J5IHRoYXQgZGVmaW5lcyB0aGlzIGFzIGEgUG9seW1lcgogICAgICogcHJvcGVydHkuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGludm9rZWQgdG8gcmV0dXJuIGEgZGVjb3JhdG9yLgogICAgICoKICAgICAqIEBFeHBvcnREZWNvcmF0ZWRJdGVtcwogICAgICovCiAgICBmdW5jdGlvbiBwcm9wZXJ0eShvcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIChwcm90bywgcHJvcE5hbWUpID0+IHsKICAgICAgICAgICAgY3JlYXRlUHJvcGVydHkocHJvdG8sIHByb3BOYW1lLCBvcHRpb25zKTsKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBBIFR5cGVTY3JpcHQgcHJvcGVydHkgZGVjb3JhdG9yIGZhY3RvcnkgdGhhdCBjYXVzZXMgdGhlIGRlY29yYXRlZCBtZXRob2QgdG8KICAgICAqIGJlIGNhbGxlZCB3aGVuIGEgcHJvcGVydHkgY2hhbmdlcy4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgaW52b2tlZCB0byByZXR1cm4gYSBkZWNvcmF0b3IuCiAgICAgKgogICAgICogQEV4cG9ydERlY29yYXRlZEl0ZW1zCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9ic2VydmUoLi4udGFyZ2V0cykgewogICAgICAgIHJldHVybiAocHJvdG8sIHByb3BOYW1lKSA9PiB7CiAgICAgICAgICAgIGlmICghcHJvdG8uY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoJ29ic2VydmVycycpKSB7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG8uY29uc3RydWN0b3IsICdvYnNlcnZlcnMnLCB7IHZhbHVlOiBbXSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcm90by5jb25zdHJ1Y3Rvci5vYnNlcnZlcnMucHVzaChgJHtwcm9wTmFtZX0oJHt0YXJnZXRzLmpvaW4oJywnKX0pYCk7CiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQSBUeXBlU2NyaXB0IGFjY2Vzc29yIGRlY29yYXRvciBmYWN0b3J5IHRoYXQgY2F1c2VzIHRoZSBkZWNvcmF0ZWQgZ2V0dGVyIHRvCiAgICAgKiBiZSBjYWxsZWQgd2hlbiBhIHNldCBvZiBkZXBlbmRlbmNpZXMgY2hhbmdlLiBUaGUgYXJndW1lbnRzIG9mIHRoaXMgZGVjb3JhdG9yCiAgICAgKiBzaG91bGQgYmUgcGF0aHMgb2YgdGhlIGRhdGEgZGVwZW5kZW5jaWVzIGFzIGRlc2NyaWJlZAogICAgICogW2hlcmVdKGh0dHBzOi8vd3d3LnBvbHltZXItcHJvamVjdC5vcmcvMi4wL2RvY3MvZGV2Z3VpZGUvb2JzZXJ2ZXJzI2RlZmluZS1hLWNvbXB1dGVkLXByb3BlcnR5KQogICAgICogVGhlIGRlY29yYXRlZCBnZXR0ZXIgc2hvdWxkIG5vdCBoYXZlIGFuIGFzc29jaWF0ZWQgc2V0dGVyLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbnZva2VkIHRvIHJldHVybiBhIGRlY29yYXRvci4KICAgICAqCiAgICAgKiBARXhwb3J0RGVjb3JhdGVkSXRlbXMKICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZWQoZmlyc3RUYXJnZXQsIC4uLm1vcmVUYXJnZXRzKSB7CiAgICAgICAgcmV0dXJuIChwcm90bywgcHJvcE5hbWUsIGRlc2NyaXB0b3IpID0+IHsKICAgICAgICAgICAgY29uc3QgZm5OYW1lID0gYF9fY29tcHV0ZSR7cHJvcE5hbWV9YDsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBmbk5hbWUsIHsgdmFsdWU6IGRlc2NyaXB0b3IuZ2V0IH0pOwogICAgICAgICAgICBkZXNjcmlwdG9yLmdldCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgY29uc3QgdGFyZ2V0cyA9IFtmaXJzdFRhcmdldCwgLi4ubW9yZVRhcmdldHNdLmpvaW4oJywnKTsKICAgICAgICAgICAgY3JlYXRlUHJvcGVydHkocHJvdG8sIHByb3BOYW1lLCB7IGNvbXB1dGVkOiBgJHtmbk5hbWV9KCR7dGFyZ2V0c30pYCB9KTsKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgIC8qKgogICAgICogV2hlbiB1c2luZyBDbG9zdXJlIENvbXBpbGVyLCBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KHByb3BlcnR5LCBvYmplY3QpIGlzIHJlcGxhY2VkIGJ5IHRoZSBtdW5nZWQgbmFtZSBmb3Igb2JqZWN0W3Byb3BlcnR5XQogICAgICogV2UgY2Fubm90IGFsaWFzIHRoaXMgZnVuY3Rpb24sIHNvIHdlIGhhdmUgdG8gdXNlIGEgc21hbGwgc2hpbSB0aGF0IGhhcyB0aGUgc2FtZSBiZWhhdmlvciB3aGVuIG5vdCBjb21waWxpbmcuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAqIEBwYXJhbSB7Kn0gb2JqIFJlZmVyZW5jZSBvYmplY3QKICAgICAqIEByZXR1cm4ge3N0cmluZ30gUG90ZW50aWFsbHkgcmVuYW1lZCBwcm9wZXJ0eSBuYW1lCiAgICAgKi8KICAgIHdpbmRvdy5KU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgb2JqKSB7CiAgICAgIHJldHVybiBwcm9wOwogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGxldCBDU1NfVVJMX1JYID0gLyh1cmxcKCkoW14pXSopKFwpKS9nOwogICAgbGV0IEFCU19VUkwgPSAvKF5cL1teXC9dKXwoXiMpfCheW1x3LVxkXSo6KS87CiAgICBsZXQgd29ya2luZ1VSTDsKICAgIGxldCByZXNvbHZlRG9jOwogICAgLyoqCiAgICAgKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gVVJMIGFnYWluc3QgdGhlIHByb3ZpZGVkIGBiYXNlVXJpJy4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBwZXJmb3JtcyBubyByZXNvbHV0aW9uIGZvciBVUkxzIHRoYXQgc3RhcnQKICAgICAqIHdpdGggYC9gIChhYnNvbHV0ZSBVUkxzKSBvciBgI2AgKGhhc2ggaWRlbnRpZmllcnMpLiAgRm9yIGdlbmVyYWwgcHVycG9zZQogICAgICogVVJMIHJlc29sdXRpb24sIHVzZSBgd2luZG93LlVSTGAuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHVybCBJbnB1dCBVUkwgdG8gcmVzb2x2ZQogICAgICogQHBhcmFtIHs/c3RyaW5nPX0gYmFzZVVSSSBCYXNlIFVSSSB0byByZXNvbHZlIHRoZSBVUkwgYWdhaW5zdAogICAgICogQHJldHVybiB7c3RyaW5nfSByZXNvbHZlZCBVUkwKICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZVVybCh1cmwsIGJhc2VVUkkpIHsKICAgICAgaWYgKHVybCAmJiBBQlNfVVJMLnRlc3QodXJsKSkgewogICAgICAgIHJldHVybiB1cmw7CiAgICAgIH0KICAgICAgaWYgKHVybCA9PT0gJy8vJykgewogICAgICAgIHJldHVybiB1cmw7CiAgICAgIH0KICAgICAgLy8gTGF6eSBmZWF0dXJlIGRldGVjdGlvbi4KICAgICAgaWYgKHdvcmtpbmdVUkwgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHdvcmtpbmdVUkwgPSBmYWxzZTsKICAgICAgICB0cnkgewogICAgICAgICAgY29uc3QgdSA9IG5ldyBVUkwoJ2InLCAnaHR0cDovL2EnKTsKICAgICAgICAgIHUucGF0aG5hbWUgPSAnYyUyMGQnOwogICAgICAgICAgd29ya2luZ1VSTCA9ICh1LmhyZWYgPT09ICdodHRwOi8vYS9jJTIwZCcpOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIC8vIHNpbGVudGx5IGZhaWwKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFiYXNlVVJJKSB7CiAgICAgICAgYmFzZVVSSSA9IGRvY3VtZW50LmJhc2VVUkkgfHwgd2luZG93LmxvY2F0aW9uLmhyZWY7CiAgICAgIH0KICAgICAgaWYgKHdvcmtpbmdVUkwpIHsKICAgICAgICB0cnkgewogICAgICAgICAgcmV0dXJuIChuZXcgVVJMKHVybCwgYmFzZVVSSSkpLmhyZWY7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgLy8gQmFkIHVybCBvciBiYXNlVVJJIHN0cnVjdHVyZS4gRG8gbm90IGF0dGVtcHQgdG8gcmVzb2x2ZS4KICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEZhbGxiYWNrIHRvIGNyZWF0aW5nIGFuIGFuY2hvciBpbnRvIGEgZGlzY29ubmVjdGVkIGRvY3VtZW50LgogICAgICBpZiAoIXJlc29sdmVEb2MpIHsKICAgICAgICByZXNvbHZlRG9jID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KCd0ZW1wJyk7CiAgICAgICAgcmVzb2x2ZURvYy5iYXNlID0gcmVzb2x2ZURvYy5jcmVhdGVFbGVtZW50KCdiYXNlJyk7CiAgICAgICAgcmVzb2x2ZURvYy5oZWFkLmFwcGVuZENoaWxkKHJlc29sdmVEb2MuYmFzZSk7CiAgICAgICAgcmVzb2x2ZURvYy5hbmNob3IgPSByZXNvbHZlRG9jLmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICByZXNvbHZlRG9jLmJvZHkuYXBwZW5kQ2hpbGQocmVzb2x2ZURvYy5hbmNob3IpOwogICAgICB9CiAgICAgIHJlc29sdmVEb2MuYmFzZS5ocmVmID0gYmFzZVVSSTsKICAgICAgcmVzb2x2ZURvYy5hbmNob3IuaHJlZiA9IHVybDsKICAgICAgcmV0dXJuIHJlc29sdmVEb2MuYW5jaG9yLmhyZWYgfHwgdXJsOwoKICAgIH0KCiAgICAvKioKICAgICAqIFJlc29sdmVzIGFueSByZWxhdGl2ZSBVUkwncyBpbiB0aGUgZ2l2ZW4gQ1NTIHRleHQgYWdhaW5zdCB0aGUgcHJvdmlkZWQKICAgICAqIGBvd25lckRvY3VtZW50YCdzIGBiYXNlVVJJYC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dCBDU1MgdGV4dCB0byBwcm9jZXNzCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZXNvbHZlIHRoZSBVUkwgYWdhaW5zdAogICAgICogQHJldHVybiB7c3RyaW5nfSBQcm9jZXNzZWQgQ1NTIHRleHQgd2l0aCByZXNvbHZlZCBVUkwncwogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlQ3NzKGNzc1RleHQsIGJhc2VVUkkpIHsKICAgICAgcmV0dXJuIGNzc1RleHQucmVwbGFjZShDU1NfVVJMX1JYLCBmdW5jdGlvbihtLCBwcmUsIHVybCwgcG9zdCkgewogICAgICAgIHJldHVybiBwcmUgKyAnXCcnICsKICAgICAgICAgIHJlc29sdmVVcmwodXJsLnJlcGxhY2UoL1siJ10vZywgJycpLCBiYXNlVVJJKSArCiAgICAgICAgICAnXCcnICsgcG9zdDsKICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgcGF0aCBmcm9tIGEgZ2l2ZW4gYHVybGAuIFRoZSBwYXRoIGluY2x1ZGVzIHRoZSB0cmFpbGluZwogICAgICogYC9gIGZyb20gdGhlIHVybC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIElucHV0IFVSTCB0byB0cmFuc2Zvcm0KICAgICAqIEByZXR1cm4ge3N0cmluZ30gcmVzb2x2ZWQgcGF0aAogICAgICovCiAgICBmdW5jdGlvbiBwYXRoRnJvbVVybCh1cmwpIHsKICAgICAgcmV0dXJuIHVybC5zdWJzdHJpbmcoMCwgdXJsLmxhc3RJbmRleE9mKCcvJykgKyAxKTsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgY29uc3QgdXNlU2hhZG93ID0gISh3aW5kb3cuU2hhZHlET00pIHx8ICEod2luZG93LlNoYWR5RE9NLmluVXNlKTsKICAgIGNvbnN0IHVzZU5hdGl2ZUNTU1Byb3BlcnRpZXMgPSBCb29sZWFuKCF3aW5kb3cuU2hhZHlDU1MgfHwgd2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcyk7CiAgICBjb25zdCBzdXBwb3J0c0Fkb3B0aW5nU3R5bGVTaGVldHMgPSB1c2VTaGFkb3cgJiYKICAgICAgICAoJ2Fkb3B0ZWRTdHlsZVNoZWV0cycgaW4gRG9jdW1lbnQucHJvdG90eXBlKSAmJgogICAgICAgICgncmVwbGFjZVN5bmMnIGluIENTU1N0eWxlU2hlZXQucHJvdG90eXBlKSAmJgogICAgICAgIC8vIFNpbmNlIHNwZWMgbWF5IGNoYW5nZSwgZmVhdHVyZSBkZXRlY3QgZXhhY3QgQVBJIHdlIG5lZWQKICAgICAgICAoKCkgPT4gewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY29uc3Qgc2hlZXQgPSBuZXcgQ1NTU3R5bGVTaGVldCgpOwogICAgICAgICAgICBzaGVldC5yZXBsYWNlU3luYygnJyk7CiAgICAgICAgICAgIGNvbnN0IGhvc3QgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgaG9zdC5hdHRhY2hTaGFkb3coe21vZGU6ICdvcGVuJ30pOwogICAgICAgICAgICBob3N0LnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gW3NoZWV0XTsKICAgICAgICAgICAgcmV0dXJuIChob3N0LnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzWzBdID09PSBzaGVldCk7CiAgICAgICAgICB9IGNhdGNoKGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0pKCk7CgogICAgLyoqCiAgICAgKiBHbG9iYWxseSBzZXR0YWJsZSBwcm9wZXJ0eSB0aGF0IGlzIGF1dG9tYXRpY2FsbHkgYXNzaWduZWQgdG8KICAgICAqIGBFbGVtZW50TWl4aW5gIGluc3RhbmNlcywgdXNlZnVsIGZvciBiaW5kaW5nIGluIHRlbXBsYXRlcyB0bwogICAgICogbWFrZSBVUkwncyByZWxhdGl2ZSB0byBhbiBhcHBsaWNhdGlvbidzIHJvb3QuICBEZWZhdWx0cyB0byB0aGUgbWFpbgogICAgICogZG9jdW1lbnQgVVJMLCBidXQgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdXNlcnMuICBJdCBtYXkgYmUgdXNlZnVsIHRvIHNldAogICAgICogYHJvb3RQYXRoYCB0byBwcm92aWRlIGEgc3RhYmxlIGFwcGxpY2F0aW9uIG1vdW50IHBhdGggd2hlbgogICAgICogdXNpbmcgY2xpZW50IHNpZGUgcm91dGluZy4KICAgICAqLwogICAgbGV0IHJvb3RQYXRoID0gd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIucm9vdFBhdGggfHwKICAgICAgcGF0aEZyb21VcmwoZG9jdW1lbnQuYmFzZVVSSSB8fCB3aW5kb3cubG9jYXRpb24uaHJlZik7CgogICAgLyoqCiAgICAgKiBBIGdsb2JhbCBjYWxsYmFjayB1c2VkIHRvIHNhbml0aXplIGFueSB2YWx1ZSBiZWZvcmUgaW5zZXJ0aW5nIGl0IGludG8gdGhlIERPTS4KICAgICAqIFRoZSBjYWxsYmFjayBzaWduYXR1cmUgaXM6CiAgICAgKgogICAgICogIGZ1bmN0aW9uIHNhbml0aXplRE9NVmFsdWUodmFsdWUsIG5hbWUsIHR5cGUsIG5vZGUpIHsgLi4uIH0KICAgICAqCiAgICAgKiBXaGVyZToKICAgICAqCiAgICAgKiBgdmFsdWVgIGlzIHRoZSB2YWx1ZSB0byBzYW5pdGl6ZS4KICAgICAqIGBuYW1lYCBpcyB0aGUgbmFtZSBvZiBhbiBhdHRyaWJ1dGUgb3IgcHJvcGVydHkgKGZvciBleGFtcGxlLCBocmVmKS4KICAgICAqIGB0eXBlYCBpbmRpY2F0ZXMgd2hlcmUgdGhlIHZhbHVlIGlzIGJlaW5nIGluc2VydGVkOiBvbmUgb2YgcHJvcGVydHksIGF0dHJpYnV0ZSwgb3IgdGV4dC4KICAgICAqIGBub2RlYCBpcyB0aGUgbm9kZSB3aGVyZSB0aGUgdmFsdWUgaXMgYmVpbmcgaW5zZXJ0ZWQuCiAgICAgKgogICAgICogQHR5cGUgeyhmdW5jdGlvbigqLHN0cmluZyxzdHJpbmcsP05vZGUpOiopfHVuZGVmaW5lZH0KICAgICAqLwogICAgbGV0IHNhbml0aXplRE9NVmFsdWUgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci5zYW5pdGl6ZURPTVZhbHVlIHx8IHVuZGVmaW5lZDsKCiAgICAvKioKICAgICAqIEdsb2JhbGx5IHNldHRhYmxlIHByb3BlcnR5IHRvIG1ha2UgUG9seW1lciBHZXN0dXJlcyB1c2UgcGFzc2l2ZSBUb3VjaEV2ZW50IGxpc3RlbmVycyB3aGVuIHJlY29nbml6aW5nIGdlc3R1cmVzLgogICAgICogV2hlbiBzZXQgdG8gYHRydWVgLCBnZXN0dXJlcyBtYWRlIGZyb20gdG91Y2ggd2lsbCBub3QgYmUgYWJsZSB0byBwcmV2ZW50IHNjcm9sbGluZywgYWxsb3dpbmcgZm9yIHNtb290aGVyCiAgICAgKiBzY3JvbGxpbmcgcGVyZm9ybWFuY2UuCiAgICAgKiBEZWZhdWx0cyB0byBgZmFsc2VgIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgICAqLwogICAgbGV0IHBhc3NpdmVUb3VjaEdlc3R1cmVzID0KICAgICAgd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIuc2V0UGFzc2l2ZVRvdWNoR2VzdHVyZXMgfHwgZmFsc2U7CgogICAgLyoqCiAgICAgKiBTZXR0aW5nIHRvIGVuc3VyZSBQb2x5bWVyIHRlbXBsYXRlIGV2YWx1YXRpb24gb25seSBvY2N1cnMgYmFzZWQgb24gdGVtcGF0ZXMKICAgICAqIGRlZmluZWQgaW4gdHJ1c3RlZCBzY3JpcHQuICBXaGVuIHRydWUsIGA8ZG9tLW1vZHVsZT5gIHJlLXJlZ2lzdHJhdGlvbiBpcwogICAgICogZGlzYWxsb3dlZCwgYDxkb20tYmluZD5gIGlzIGRpc2FibGVkLCBhbmQgYDxkb20taWY+YC9gPGRvbS1yZXBlYXQ+YAogICAgICogdGVtcGxhdGVzIHdpbGwgb25seSBldmFsdWF0ZSBpbiB0aGUgY29udGV4dCBvZiBhIHRydXN0ZWQgZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAqLwogICAgbGV0IHN0cmljdFRlbXBsYXRlUG9saWN5ID0KICAgICAgd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIuc3RyaWN0VGVtcGxhdGVQb2xpY3kgfHwgZmFsc2U7CgogICAgLyoqCiAgICAgKiBTZXR0aW5nIHRvIGVuYWJsZSBkb20tbW9kdWxlIGxvb2t1cCBmcm9tIFBvbHltZXIuRWxlbWVudC4gIEJ5IGRlZmF1bHQsCiAgICAgKiB0ZW1wbGF0ZXMgbXVzdCBiZSBkZWZpbmVkIGluIHNjcmlwdCB1c2luZyB0aGUgYHN0YXRpYyBnZXQgdGVtcGxhdGUoKWAKICAgICAqIGdldHRlciBhbmQgdGhlIGBodG1sYCB0YWcgZnVuY3Rpb24uICBUbyBlbmFibGUgbGVnYWN5IGxvYWRpbmcgb2YgdGVtcGxhdGVzCiAgICAgKiB2aWEgZG9tLW1vZHVsZSwgc2V0IHRoaXMgZmxhZyB0byB0cnVlLgogICAgICovCiAgICBsZXQgYWxsb3dUZW1wbGF0ZUZyb21Eb21Nb2R1bGUgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci5hbGxvd1RlbXBsYXRlRnJvbURvbU1vZHVsZSB8fCBmYWxzZTsKCiAgICAvKioKICAgICAqIFNldHRpbmcgdG8gc2tpcCBwcm9jZXNzaW5nIHN0eWxlIGluY2x1ZGVzIGFuZCByZS13cml0aW5nIHVybHMgaW4gY3NzIHN0eWxlcy4KICAgICAqIE5vcm1hbGx5ICJpbmNsdWRlZCIgc3R5bGVzIGFyZSBwdWxsZWQgaW50byB0aGUgZWxlbWVudCBhbmQgYWxsIHVybHMgaW4gc3R5bGVzCiAgICAgKiBhcmUgcmUtd3JpdHRlbiB0byBiZSByZWxhdGl2ZSB0byB0aGUgY29udGFpbmluZyBzY3JpcHQgdXJsLgogICAgICogSWYgbm8gaW5jbHVkZXMgb3IgcmVsYXRpdmUgdXJscyBhcmUgdXNlZCBpbiBzdHlsZXMsIHRoZXNlIHN0ZXBzIGNhbiBiZQogICAgICogc2tpcHBlZCBhcyBhbiBvcHRpbWl6YXRpb24uCiAgICAgKi8KICAgIGxldCBsZWdhY3lPcHRpbWl6YXRpb25zID0KICAgICAgd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIubGVnYWN5T3B0aW1pemF0aW9ucyB8fCBmYWxzZTsKCiAgICAvKioKICAgICAqIFNldHRpbmcgdG8gYWRkIHdhcm5pbmdzIHVzZWZ1bCB3aGVuIG1pZ3JhdGluZyBmcm9tIFBvbHltZXIgMS54IHRvIDIueC4KICAgICAqLwogICAgbGV0IGxlZ2FjeVdhcm5pbmdzID0KICAgICAgd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIubGVnYWN5V2FybmluZ3MgfHwgZmFsc2U7CgogICAgLyoqCiAgICAgKiBTZXR0aW5nIHRvIHBlcmZvcm0gaW5pdGlhbCByZW5kZXJpbmcgc3luY2hyb25vdXNseSB3aGVuIHJ1bm5pbmcgdW5kZXIgU2hhZHlET00uCiAgICAgKiBUaGlzIG1hdGNoZXMgdGhlIGJlaGF2aW9yIG9mIFBvbHltZXIgMS4KICAgICAqLwogICAgbGV0IHN5bmNJbml0aWFsUmVuZGVyID0KICAgICAgd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIuc3luY0luaXRpYWxSZW5kZXIgfHwgZmFsc2U7CgogICAgLyoqCiAgICAgKiBTZXR0aW5nIHRvIHJldGFpbiB0aGUgbGVnYWN5IFBvbHltZXIgMSBiZWhhdmlvciBmb3IgbXVsdGktcHJvcGVydHkKICAgICAqIG9ic2VydmVycyBhcm91bmQgdW5kZWZpbmVkIHZhbHVlcy4gT2JzZXJ2ZXJzIGFuZCBjb21wdXRlZCBwcm9wZXJ0eSBtZXRob2RzCiAgICAgKiBhcmUgbm90IGNhbGxlZCB1bnRpbCBubyBhcmd1bWVudCBpcyB1bmRlZmluZWQuCiAgICAgKi8KICAgIGxldCBsZWdhY3lVbmRlZmluZWQgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci5sZWdhY3lVbmRlZmluZWQgfHwgZmFsc2U7CgogICAgLyoqCiAgICAgKiBTZXR0aW5nIHRvIGVuc3VyZSBjb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSBjb21wdXRlZCBpbiBvcmRlciB0byBlbnN1cmUKICAgICAqIHJlLWNvbXB1dGF0aW9uIG5ldmVyIG9jY3VycyBpbiBhIGdpdmVuIHR1cm4uCiAgICAgKi8KICAgIGxldCBvcmRlcmVkQ29tcHV0ZWQgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci5vcmRlcmVkQ29tcHV0ZWQgfHwgZmFsc2U7CgogICAgLyoqCiAgICAgKiBTZXR0aW5nIHRvIHJlbW92ZSBuZXN0ZWQgdGVtcGxhdGVzIGluc2lkZSBgZG9tLWlmYCBhbmQgYGRvbS1yZXBlYXRgIGFzCiAgICAgKiBwYXJ0IG9mIGVsZW1lbnQgdGVtcGxhdGUgcGFyc2luZy4gIFRoaXMgaXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdGhhdAogICAgICogZWxpbWluYXRlcyBtb3N0IG9mIHRoZSB0YXggb2YgbmVlZGluZyB0d28gZWxlbWVudHMgZHVlIHRvIHRoZSBsb3NzIG9mCiAgICAgKiB0eXBlLWV4dGVuZGVkIHRlbXBsYXRlcyBhcyBhIHJlc3VsdCBvZiB0aGUgVjEgc3BlY2lmaWNhdGlvbiBjaGFuZ2VzLgogICAgICovCiAgICBsZXQgcmVtb3ZlTmVzdGVkVGVtcGxhdGVzID0KICAgICAgd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIucmVtb3ZlTmVzdGVkVGVtcGxhdGVzIHx8IGZhbHNlOwoKICAgIC8qKgogICAgICogU2V0dGluZyB0byBwbGFjZSBgZG9tLWlmYCBlbGVtZW50cyBpbiBhIHBlcmZvcm1hbmNlLW9wdGltaXplZCBtb2RlIHRoYXQgdGFrZXMKICAgICAqIGFkdmFudGFnZSBvZiBsaWdodGVyLXdlaWdodCBob3N0IHJ1bnRpbWUgdGVtcGxhdGUgc3RhbXBpbmcgdG8gZWxpbWluYXRlIHRoZQogICAgICogbmVlZCBmb3IgYW4gaW50ZXJtZWRpYXRlIFRlbXBsYXRpemVyIGBUZW1wbGF0ZUluc3RhbmNlYCB0byBtYW5nZSB0aGUgbm9kZXMKICAgICAqIHN0YW1wZWQgYnkgYGRvbS1pZmAuICBVbmRlciB0aGlzIHNldHRpbmcsIGFueSBUZW1wbGF0aXplci1wcm92aWRlZCBBUEkncwogICAgICogc3VjaCBhcyBgbW9kZWxGb3JFbGVtZW50YCB3aWxsIG5vdCBiZSBhdmFpbGFibGUgZm9yIG5vZGVzIHN0YW1wZWQgYnkKICAgICAqIGBkb20taWZgLgogICAgICovCiAgICBsZXQgZmFzdERvbUlmID0gd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIuZmFzdERvbUlmIHx8IGZhbHNlOwoKICAgIC8qKgogICAgICogU2V0dGluZyB0byBkaXNhYmxlIGBkb20tY2hhbmdlYCBhbmQgYHJlbmRlcmVkLWl0ZW0tY291bnRgIGV2ZW50cyBmcm9tCiAgICAgKiBgZG9tLWlmYCBhbmQgYGRvbS1yZXBlYXRgLiBVc2VycyBjYW4gb3B0IGJhY2sgaW50byBgZG9tLWNoYW5nZWAgZXZlbnRzIGJ5CiAgICAgKiBzZXR0aW5nIHRoZSBgbm90aWZ5LWRvbS1jaGFuZ2VgIGF0dHJpYnV0ZSAoYG5vdGlmeURvbUNoYW5nZTogdHJ1ZWAgcHJvcGVydHkpCiAgICAgKiB0byBgZG9tLWlmYC9gZG9uLXJlcGVhdGAgaW5zdGFuY2VzLgogICAgICovCiAgICBsZXQgc3VwcHJlc3NUZW1wbGF0ZU5vdGlmaWNhdGlvbnMgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci5zdXBwcmVzc1RlbXBsYXRlTm90aWZpY2F0aW9ucyB8fCBmYWxzZTsKCiAgICAvKioKICAgICAqIFNldHRpbmcgdG8gZGlzYWJsZSB1c2Ugb2YgZHluYW1pYyBhdHRyaWJ1dGVzLiBUaGlzIGlzIGFuIG9wdGltaXphdGlvbgogICAgICogdG8gYXZvaWQgc2V0dGluZyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYC4gSW5zdGVhZCBhdHRyaWJ1dGVzIGFyZSByZWFkCiAgICAgKiBvbmNlIGF0IGNyZWF0ZSB0aW1lIGFuZCBzZXQvcmVtb3ZlQXR0cmlidXRlIGFyZSBwYXRjaGVkLgogICAgICovCiAgICBsZXQgbGVnYWN5Tm9PYnNlcnZlZEF0dHJpYnV0ZXMgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci5sZWdhY3lOb09ic2VydmVkQXR0cmlidXRlcyB8fCBmYWxzZTsKCiAgICAvKioKICAgICAqIFNldHRpbmcgdG8gZW5hYmxlIHVzZSBvZiBgYWRvcHRlZFN0eWxlU2hlZXRzYCBmb3Igc2hhcmluZyBzdHlsZSBzaGVldHMKICAgICAqIGJldHdlZW4gY29tcG9uZW50IGluc3RhbmNlcycgc2hhZG93IHJvb3RzLCBpZiB0aGUgYXBwIHVzZXMgYnVpbHQgU2hhZHkgQ1NTCiAgICAgKiBzdHlsZXMuCiAgICAgKi8KICAgIGxldCB1c2VBZG9wdGVkU3R5bGVTaGVldHNXaXRoQnVpbHRDU1MgPQogICAgICB3aW5kb3cuUG9seW1lciAmJiB3aW5kb3cuUG9seW1lci51c2VBZG9wdGVkU3R5bGVTaGVldHNXaXRoQnVpbHRDU1MgfHwgZmFsc2U7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvLyB1bmlxdWUgZ2xvYmFsIGlkIGZvciBkZWR1cGluZyBtaXhpbnMuCiAgICBsZXQgZGVkdXBlSWQgPSAwOwoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAvKioKICAgICAqIFdyYXBzIGFuIEVTNiBjbGFzcyBleHByZXNzaW9uIG1peGluIHN1Y2ggdGhhdCB0aGUgbWl4aW4gaXMgb25seSBhcHBsaWVkCiAgICAgKiBpZiBpdCBoYXMgbm90IGFscmVhZHkgYmVlbiBhcHBsaWVkIGl0cyBiYXNlIGFyZ3VtZW50LiBBbHNvIG1lbW9pemVzIG1peGluCiAgICAgKiBhcHBsaWNhdGlvbnMuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7VH0gbWl4aW4gRVM2IGNsYXNzIGV4cHJlc3Npb24gbWl4aW4gdG8gd3JhcAogICAgICogQHJldHVybiB7VH0KICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICovCiAgICBjb25zdCBkZWR1cGluZ01peGluID0gZnVuY3Rpb24obWl4aW4pIHsKICAgICAgbGV0IG1peGluQXBwbGljYXRpb25zID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8obWl4aW4pLl9fbWl4aW5BcHBsaWNhdGlvbnM7CiAgICAgIGlmICghbWl4aW5BcHBsaWNhdGlvbnMpIHsKICAgICAgICBtaXhpbkFwcGxpY2F0aW9ucyA9IG5ldyBXZWFrTWFwKCk7CiAgICAgICAgLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8obWl4aW4pLl9fbWl4aW5BcHBsaWNhdGlvbnMgPSBtaXhpbkFwcGxpY2F0aW9uczsKICAgICAgfQogICAgICAvLyBtYWludGFpbiBhIHVuaXF1ZSBpZCBmb3IgZWFjaCBtaXhpbgogICAgICBsZXQgbWl4aW5EZWR1cGVJZCA9IGRlZHVwZUlkKys7CiAgICAgIGZ1bmN0aW9uIGRlZHVwaW5nTWl4aW4oYmFzZSkgewogICAgICAgIGxldCBiYXNlU2V0ID0gLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oYmFzZSkuX19taXhpblNldDsKICAgICAgICBpZiAoYmFzZVNldCAmJiBiYXNlU2V0W21peGluRGVkdXBlSWRdKSB7CiAgICAgICAgICByZXR1cm4gYmFzZTsKICAgICAgICB9CiAgICAgICAgbGV0IG1hcCA9IG1peGluQXBwbGljYXRpb25zOwogICAgICAgIGxldCBleHRlbmRlZCA9IG1hcC5nZXQoYmFzZSk7CiAgICAgICAgaWYgKCFleHRlbmRlZCkgewogICAgICAgICAgZXh0ZW5kZWQgPSAvKiogQHR5cGUgeyFGdW5jdGlvbn0gKi8obWl4aW4pKGJhc2UpOwogICAgICAgICAgbWFwLnNldChiYXNlLCBleHRlbmRlZCk7CiAgICAgICAgICAvLyBjb3B5IGluaGVyaXRlZCBtaXhpbiBzZXQgZnJvbSB0aGUgZXh0ZW5kZWQgY2xhc3MsIG9yIHRoZSBiYXNlIGNsYXNzCiAgICAgICAgICAvLyBOT1RFOiB3ZSBhdm9pZCB1c2Ugb2YgU2V0IGhlcmUgYmVjYXVzZSBzb21lIGJyb3dzZXIgKElFMTEpCiAgICAgICAgICAvLyBjYW5ub3QgZXh0ZW5kIGEgYmFzZSBTZXQgdmlhIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgIGxldCBtaXhpblNldCA9IE9iamVjdC5jcmVhdGUoLyoqIEB0eXBlIHshTWl4aW5GdW5jdGlvbn0gKi8oZXh0ZW5kZWQpLl9fbWl4aW5TZXQgfHwgYmFzZVNldCB8fCBudWxsKTsKICAgICAgICAgIG1peGluU2V0W21peGluRGVkdXBlSWRdID0gdHJ1ZTsKICAgICAgICAgIC8qKiBAdHlwZSB7IU1peGluRnVuY3Rpb259ICovKGV4dGVuZGVkKS5fX21peGluU2V0ID0gbWl4aW5TZXQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBleHRlbmRlZDsKICAgICAgfQoKICAgICAgcmV0dXJuIGRlZHVwaW5nTWl4aW47CiAgICB9OwogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgbGV0IG1vZHVsZXMgPSB7fTsKICAgIGxldCBsY01vZHVsZXMgPSB7fTsKICAgIC8qKgogICAgICogU2V0cyBhIGRvbS1tb2R1bGUgaW50byB0aGUgZ2xvYmFsIHJlZ2lzdHJ5IGJ5IGlkLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpZCBkb20tbW9kdWxlIGlkCiAgICAgKiBAcGFyYW0ge0RvbU1vZHVsZX0gbW9kdWxlIGRvbS1tb2R1bGUgaW5zdGFuY2UKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldE1vZHVsZShpZCwgbW9kdWxlKSB7CiAgICAgIC8vIHN0b3JlIGlkIHNlcGFyYXRlIGZyb20gbG93ZXJjYXNlZCBpZCBzbyB0aGF0CiAgICAgIC8vIGluIGFsbCBjYXNlcyBtaXhlZENhc2UgaWQgd2lsbCBzdG9yZWQgZGlzdGluY3RseQogICAgICAvLyBhbmQgbG93ZXJjYXNlIHZlcnNpb24gaXMgYSBmYWxsYmFjawogICAgICBtb2R1bGVzW2lkXSA9IGxjTW9kdWxlc1tpZC50b0xvd2VyQ2FzZSgpXSA9IG1vZHVsZTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGEgZG9tLW1vZHVsZSBmcm9tIHRoZSBnbG9iYWwgcmVnaXN0cnkgYnkgaWQuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIGRvbS1tb2R1bGUgaWQKICAgICAqIEByZXR1cm4ge0RvbU1vZHVsZSF9IGRvbS1tb2R1bGUgaW5zdGFuY2UKICAgICAqLwogICAgZnVuY3Rpb24gZmluZE1vZHVsZShpZCkgewogICAgICByZXR1cm4gbW9kdWxlc1tpZF0gfHwgbGNNb2R1bGVzW2lkLnRvTG93ZXJDYXNlKCldOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlT3V0c2lkZVRlbXBsYXRlQ2hlY2soaW5zdCkgewogICAgICBpZiAoaW5zdC5xdWVyeVNlbGVjdG9yKCdzdHlsZScpKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdkb20tbW9kdWxlICVzIGhhcyBzdHlsZSBvdXRzaWRlIHRlbXBsYXRlJywgaW5zdC5pZCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBgZG9tLW1vZHVsZWAgZWxlbWVudCByZWdpc3RlcnMgdGhlIGRvbSBpdCBjb250YWlucyB0byB0aGUgbmFtZSBnaXZlbgogICAgICogYnkgdGhlIG1vZHVsZSdzIGlkIGF0dHJpYnV0ZS4gSXQgcHJvdmlkZXMgYSB1bmlmaWVkIGRhdGFiYXNlIG9mIGRvbQogICAgICogYWNjZXNzaWJsZSB2aWEgaXRzIHN0YXRpYyBgaW1wb3J0YCBBUEkuCiAgICAgKgogICAgICogQSBrZXkgdXNlIGNhc2Ugb2YgYGRvbS1tb2R1bGVgIGlzIGZvciBwcm92aWRpbmcgY3VzdG9tIGVsZW1lbnQgYDx0ZW1wbGF0ZT5gcwogICAgICogdmlhIEhUTUwgaW1wb3J0cyB0aGF0IGFyZSBwYXJzZWQgYnkgdGhlIG5hdGl2ZSBIVE1MIHBhcnNlciwgdGhhdCBjYW4gYmUKICAgICAqIHJlbG9jYXRlZCBkdXJpbmcgYSBidW5kbGluZyBwYXNzIGFuZCBzdGlsbCBsb29rZWQgdXAgYnkgYGlkYC4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqICAgICA8ZG9tLW1vZHVsZSBpZD0iZm9vIj4KICAgICAqICAgICAgIDxpbWcgc3JjPSJzdHVmZi5wbmciPgogICAgICogICAgIDwvZG9tLW1vZHVsZT4KICAgICAqCiAgICAgKiBUaGVuIGluIGNvZGUgaW4gc29tZSBvdGhlciBsb2NhdGlvbiB0aGF0IGNhbm5vdCBhY2Nlc3MgdGhlIGRvbS1tb2R1bGUgYWJvdmUKICAgICAqCiAgICAgKiAgICAgbGV0IGltZyA9IGN1c3RvbUVsZW1lbnRzLmdldCgnZG9tLW1vZHVsZScpLmltcG9ydCgnZm9vJywgJ2ltZycpOwogICAgICoKICAgICAqIEBjdXN0b21FbGVtZW50CiAgICAgKiBAZXh0ZW5kcyBIVE1MRWxlbWVudAogICAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBwcm92aWRlcyBhIHJlZ2lzdHJ5IG9mIHJlbG9jYXRhYmxlIERPTSBjb250ZW50CiAgICAgKiAgIGJ5IGBpZGAgdGhhdCBpcyBhZ25vc3RpYyB0byBidW5kbGluZy4KICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAqLwogICAgY2xhc3MgRG9tTW9kdWxlIGV4dGVuZHMgSFRNTEVsZW1lbnQgewoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsgcmV0dXJuIFsnaWQnXTsgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHJpZXZlcyB0aGUgZWxlbWVudCBzcGVjaWZpZWQgYnkgdGhlIGNzcyBgc2VsZWN0b3JgIGluIHRoZSBtb2R1bGUKICAgICAgICogcmVnaXN0ZXJlZCBieSBgaWRgLiBGb3IgZXhhbXBsZSwgdGhpcy5pbXBvcnQoJ2ZvbycsICdpbWcnKTsKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBvZiB0aGUgZG9tLW1vZHVsZSBpbiB3aGljaCB0byBzZWFyY2guCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3IgVGhlIGNzcyBzZWxlY3RvciBieSB3aGljaCB0byBmaW5kIHRoZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIHRoZSBlbGVtZW50IHdoaWNoIG1hdGNoZXMgYHNlbGVjdG9yYCBpbiB0aGUKICAgICAgICogbW9kdWxlIHJlZ2lzdGVyZWQgYXQgdGhlIHNwZWNpZmllZCBgaWRgLgogICAgICAgKgogICAgICAgKiBAZXhwb3J0CiAgICAgICAqIEBub2NvbGxhcHNlIFJlZmVycmVkIHRvIGluZGlyZWN0bHkgaW4gc3R5bGUtZ2F0aGVyLmpzCiAgICAgICAqLwogICAgICBzdGF0aWMgaW1wb3J0KGlkLCBzZWxlY3RvcikgewogICAgICAgIGlmIChpZCkgewogICAgICAgICAgbGV0IG0gPSBmaW5kTW9kdWxlKGlkKTsKICAgICAgICAgIGlmIChtICYmIHNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBtLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG07CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAvKioKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgQ3VycmVudCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gbmFtZXNwYWNlIEF0dHJpYnV0ZSBuYW1lc3BhY2UuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgIGlmIChvbGQgIT09IHZhbHVlKSB7CiAgICAgICAgICB0aGlzLnJlZ2lzdGVyKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tdW51c2VkLWFyZ3MgKi8KCiAgICAgIC8qKgogICAgICAgKiBUaGUgYWJzb2x1dGUgVVJMIG9mIHRoZSBvcmlnaW5hbCBsb2NhdGlvbiBvZiB0aGlzIGBkb20tbW9kdWxlYC4KICAgICAgICoKICAgICAgICogVGhpcyB2YWx1ZSB3aWxsIGRpZmZlciBmcm9tIHRoaXMgZWxlbWVudCdzIGBvd25lckRvY3VtZW50YCBpbiB0aGUKICAgICAgICogZm9sbG93aW5nIHdheXM6CiAgICAgICAqIC0gVGFrZXMgaW50byBhY2NvdW50IGFueSBgYXNzZXRwYXRoYCBhdHRyaWJ1dGUgYWRkZWQgZHVyaW5nIGJ1bmRsaW5nCiAgICAgICAqICAgdG8gaW5kaWNhdGUgdGhlIG9yaWdpbmFsIGxvY2F0aW9uIHJlbGF0aXZlIHRvIHRoZSBidW5kbGVkIGxvY2F0aW9uCiAgICAgICAqIC0gVXNlcyB0aGUgSFRNTEltcG9ydHMgcG9seWZpbGwncyBgaW1wb3J0Rm9yRWxlbWVudGAgQVBJIHRvIGVuc3VyZQogICAgICAgKiAgIHRoZSBwYXRoIGlzIHJlbGF0aXZlIHRvIHRoZSBpbXBvcnQgZG9jdW1lbnQncyBsb2NhdGlvbiBzaW5jZQogICAgICAgKiAgIGBvd25lckRvY3VtZW50YCBpcyBub3QgY3VycmVudGx5IHBvbHlmaWxsZWQKICAgICAgICovCiAgICAgIGdldCBhc3NldHBhdGgoKSB7CiAgICAgICAgLy8gRG9uJ3Qgb3ZlcnJpZGUgZXhpc3RpbmcgYXNzZXRwYXRoLgogICAgICAgIGlmICghdGhpcy5fX2Fzc2V0cGF0aCkgewogICAgICAgICAgLy8gbm90ZTogYXNzZXRwYXRoIHNldCB2aWEgYW4gYXR0cmlidXRlIG11c3QgYmUgcmVsYXRpdmUgdG8gdGhpcwogICAgICAgICAgLy8gZWxlbWVudCdzIGxvY2F0aW9uOyBhY2NvbW9kYXRlIHBvbHlmaWxsZWQgSFRNTEltcG9ydHMKICAgICAgICAgIGNvbnN0IG93bmVyID0gd2luZG93LkhUTUxJbXBvcnRzICYmIEhUTUxJbXBvcnRzLmltcG9ydEZvckVsZW1lbnQgPwogICAgICAgICAgICBIVE1MSW1wb3J0cy5pbXBvcnRGb3JFbGVtZW50KHRoaXMpIHx8IGRvY3VtZW50IDogdGhpcy5vd25lckRvY3VtZW50OwogICAgICAgICAgY29uc3QgdXJsID0gcmVzb2x2ZVVybCgKICAgICAgICAgICAgdGhpcy5nZXRBdHRyaWJ1dGUoJ2Fzc2V0cGF0aCcpIHx8ICcnLCBvd25lci5iYXNlVVJJKTsKICAgICAgICAgIHRoaXMuX19hc3NldHBhdGggPSBwYXRoRnJvbVVybCh1cmwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fX2Fzc2V0cGF0aDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJlZ2lzdGVycyB0aGUgZG9tLW1vZHVsZSBhdCBhIGdpdmVuIGlkLiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQKICAgICAgICogd2hlbiBhIGRvbS1tb2R1bGUgaXMgaW1wZXJhdGl2ZWx5IGNyZWF0ZWQuIEZvcgogICAgICAgKiBleGFtcGxlLCBgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZG9tLW1vZHVsZScpLnJlZ2lzdGVyKCdmb28nKWAuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gaWQgVGhlIGlkIGF0IHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBkb20tbW9kdWxlLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVnaXN0ZXIoaWQpIHsKICAgICAgICBpZCA9IGlkIHx8IHRoaXMuaWQ7CiAgICAgICAgaWYgKGlkKSB7CiAgICAgICAgICAvLyBVbmRlciBzdHJpY3RUZW1wbGF0ZVBvbGljeSwgcmVqZWN0IGFuZCBudWxsIG91dCBhbnkgcmUtcmVnaXN0ZXJlZAogICAgICAgICAgLy8gZG9tLW1vZHVsZSBzaW5jZSBpdCBpcyBhbWJpZ3VvdXMgd2hldGhlciBmaXJzdC1pbiBvciBsYXN0LWluIGlzIHRydXN0ZWQKICAgICAgICAgIGlmIChzdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiBmaW5kTW9kdWxlKGlkKSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHNldE1vZHVsZShpZCwgbnVsbCk7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGRvbS1tb2R1bGUgJHtpZH0gcmUtcmVnaXN0ZXJlZGApOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgc2V0TW9kdWxlKGlkLCB0aGlzKTsKICAgICAgICAgIHN0eWxlT3V0c2lkZVRlbXBsYXRlQ2hlY2sodGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgRG9tTW9kdWxlLnByb3RvdHlwZVsnbW9kdWxlcyddID0gbW9kdWxlczsKCiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoJ2RvbS1tb2R1bGUnLCBEb21Nb2R1bGUpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgTU9EVUxFX1NUWUxFX0xJTktfU0VMRUNUT1IgPSAnbGlua1tyZWw9aW1wb3J0XVt0eXBlfj1jc3NdJzsKICAgIGNvbnN0IElOQ0xVREVfQVRUUiA9ICdpbmNsdWRlJzsKICAgIGNvbnN0IFNIQURZX1VOU0NPUEVEX0FUVFIgPSAnc2hhZHktdW5zY29wZWQnOwoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkIC4KICAgICAqIEByZXR1cm4gez9Eb21Nb2R1bGV9IC4KICAgICAqLwogICAgZnVuY3Rpb24gaW1wb3J0TW9kdWxlKG1vZHVsZUlkKSB7CiAgICAgIHJldHVybiAvKiogQHR5cGUgez9Eb21Nb2R1bGV9ICovKERvbU1vZHVsZS5pbXBvcnQobW9kdWxlSWQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpIHsKICAgICAgLy8gTk9URTogcG9seWZpbGwgYWZmb3JkYW5jZS4KICAgICAgLy8gdW5kZXIgdGhlIEhUTUxJbXBvcnRzIHBvbHlmaWxsLCB0aGVyZSB3aWxsIGJlIG5vICdib2R5JywKICAgICAgLy8gYnV0IHRoZSBpbXBvcnQgcHNldWRvLWRvYyBjYW4gYmUgdXNlZCBkaXJlY3RseS4KICAgICAgbGV0IGNvbnRhaW5lciA9IGltcG9ydERvYy5ib2R5ID8gaW1wb3J0RG9jLmJvZHkgOiBpbXBvcnREb2M7CiAgICAgIGNvbnN0IGltcG9ydENzcyA9IHJlc29sdmVDc3MoY29udGFpbmVyLnRleHRDb250ZW50LAogICAgICAgIGltcG9ydERvYy5iYXNlVVJJKTsKICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICBzdHlsZS50ZXh0Q29udGVudCA9IGltcG9ydENzczsKICAgICAgcmV0dXJuIHN0eWxlOwogICAgfQoKCiAgICAvKioKICAgICAqIFJldHVybnMgYSBsaXN0IG9mIDxzdHlsZT4gZWxlbWVudHMgaW4gYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBgZG9tLW1vZHVsZWBzLgogICAgICoKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZUlkcyBMaXN0IG9mIGRvbS1tb2R1bGUgaWQncyB3aXRoaW4gd2hpY2ggdG8KICAgICAqIHNlYXJjaCBmb3IgY3NzLgogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIDxzdHlsZT4gZWxlbWVudHMKICAgICAqLwogICAgZnVuY3Rpb24gc3R5bGVzRnJvbU1vZHVsZXMobW9kdWxlSWRzKSB7CiAgICAgY29uc3QgbW9kdWxlcyA9IG1vZHVsZUlkcy50cmltKCkuc3BsaXQoL1xzKy8pOwogICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgIGZvciAobGV0IGk9MDsgaSA8IG1vZHVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgIHN0eWxlcy5wdXNoKC4uLnN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlc1tpXSkpOwogICAgIH0KICAgICByZXR1cm4gc3R5bGVzOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyBpbiBhIGdpdmVuIGBkb20tbW9kdWxlYC4KICAgICAqIFN0eWxlcyBpbiBhIGBkb20tbW9kdWxlYCBjYW4gY29tZSBlaXRoZXIgZnJvbSBgPHN0eWxlPmBzIHdpdGhpbiB0aGUKICAgICAqIGZpcnN0IGA8dGVtcGxhdGU+YCwgb3IgZWxzZSBmcm9tIG9uZSBvciBtb3JlCiAgICAgKiBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBsaW5rcyBvdXRzaWRlIHRoZSB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgZG9tLW1vZHVsZSBpZCB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0eWxlc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgY29uc3QgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CgogICAgICBpZiAoIW0pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkIG5vdCBmaW5kIHN0eWxlIGRhdGEgaW4gbW9kdWxlIG5hbWVkJywgbW9kdWxlSWQpOwogICAgICAgIHJldHVybiBbXTsKICAgICAgfQoKICAgICAgaWYgKG0uX3N0eWxlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgY29uc3Qgc3R5bGVzID0gW107CiAgICAgICAgLy8gbW9kdWxlIGltcG9ydHM6IDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPgogICAgICAgIHN0eWxlcy5wdXNoKC4uLl9zdHlsZXNGcm9tTW9kdWxlSW1wb3J0cyhtKSk7CiAgICAgICAgLy8gaW5jbHVkZSBjc3MgZnJvbSB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIG1vZHVsZQogICAgICAgIGNvbnN0IHRlbXBsYXRlID0gLyoqIEB0eXBlIHs/SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8oCiAgICAgICAgICAgIG0ucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgICBzdHlsZXMucHVzaCguLi5zdHlsZXNGcm9tVGVtcGxhdGUodGVtcGxhdGUsCiAgICAgICAgICAgIC8qKiBAdHlwZSB7dGVtcGxhdGVXaXRoQXNzZXRQYXRofSAqLyhtKS5hc3NldHBhdGgpKTsKICAgICAgICB9CgogICAgICAgIG0uX3N0eWxlcyA9IHN0eWxlczsKICAgICAgfQoKICAgICAgcmV0dXJuIG0uX3N0eWxlczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGA8c3R5bGU+YCBlbGVtZW50cyB3aXRoaW4gYSBnaXZlbiB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBnYXRoZXIgc3R5bGVzIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYmFzZVVSSSBiYXNlVVJJIGZvciBzdHlsZSBjb250ZW50CiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxTdHlsZUVsZW1lbnQ+fSBBcnJheSBvZiBzdHlsZXMKICAgICAqLwogICAgZnVuY3Rpb24gc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGlmICghdGVtcGxhdGUuX3N0eWxlcykgewogICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgIC8vIGlmIGVsZW1lbnQgaXMgYSB0ZW1wbGF0ZSwgZ2V0IGNvbnRlbnQgZnJvbSBpdHMgLmNvbnRlbnQKICAgICAgICBjb25zdCBlJCA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGUgPSBlJFtpXTsKICAgICAgICAgIC8vIHN1cHBvcnQgc3R5bGUgc2hhcmluZyBieSBhbGxvd2luZyBzdHlsZXMgdG8gImluY2x1ZGUiCiAgICAgICAgICAvLyBvdGhlciBkb20tbW9kdWxlcyB0aGF0IGNvbnRhaW4gc3R5bGluZwogICAgICAgICAgbGV0IGluY2x1ZGUgPSBlLmdldEF0dHJpYnV0ZShJTkNMVURFX0FUVFIpOwogICAgICAgICAgaWYgKGluY2x1ZGUpIHsKICAgICAgICAgICAgc3R5bGVzLnB1c2goLi4uc3R5bGVzRnJvbU1vZHVsZXMoaW5jbHVkZSkuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0sIGluZGV4LCBzZWxmKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuaW5kZXhPZihpdGVtKSA9PT0gaW5kZXg7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChiYXNlVVJJKSB7CiAgICAgICAgICAgIGUudGV4dENvbnRlbnQgPQogICAgICAgICAgICAgICAgcmVzb2x2ZUNzcyhlLnRleHRDb250ZW50LCAvKiogQHR5cGUge3N0cmluZ30gKi8gKGJhc2VVUkkpKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0eWxlcy5wdXNoKGUpOwogICAgICAgIH0KICAgICAgICB0ZW1wbGF0ZS5fc3R5bGVzID0gc3R5bGVzOwogICAgICB9CiAgICAgIHJldHVybiB0ZW1wbGF0ZS5fc3R5bGVzOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgPHN0eWxlPiBlbGVtZW50cyAgZnJvbSBzdHlsZXNoZWV0cyBsb2FkZWQgdmlhIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIGxpbmtzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGBkb20tbW9kdWxlYC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWQgSWQgb2YgYGRvbS1tb2R1bGVgIHRvIGdhdGhlciBDU1MgZnJvbQogICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU3R5bGVFbGVtZW50Pn0gQXJyYXkgb2YgY29udGFpbmVkIHN0eWxlcy4KICAgICAqLwogICAgZnVuY3Rpb24gc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlSWQpIHsKICAgICBsZXQgbSA9IGltcG9ydE1vZHVsZShtb2R1bGVJZCk7CiAgICAgcmV0dXJuIG0gPyBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobSkgOiBbXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBtb2R1bGUgZG9tLW1vZHVsZSBlbGVtZW50IHRoYXQgY291bGQgY29udGFpbiBgPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+YCBzdHlsZXMKICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTFN0eWxlRWxlbWVudD59IEFycmF5IG9mIGNvbnRhaW5lZCBzdHlsZXMKICAgICAqLwogICAgZnVuY3Rpb24gX3N0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKG1vZHVsZSkgewogICAgICBjb25zdCBzdHlsZXMgPSBbXTsKICAgICAgY29uc3QgcCQgPSBtb2R1bGUucXVlcnlTZWxlY3RvckFsbChNT0RVTEVfU1RZTEVfTElOS19TRUxFQ1RPUik7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IHAkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbGV0IHAgPSBwJFtpXTsKICAgICAgICBpZiAocC5pbXBvcnQpIHsKICAgICAgICAgIGNvbnN0IGltcG9ydERvYyA9IHAuaW1wb3J0OwogICAgICAgICAgY29uc3QgdW5zY29wZWQgPSBwLmhhc0F0dHJpYnV0ZShTSEFEWV9VTlNDT1BFRF9BVFRSKTsKICAgICAgICAgIGlmICh1bnNjb3BlZCAmJiAhaW1wb3J0RG9jLl91bnNjb3BlZFN0eWxlKSB7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVGb3JJbXBvcnQoaW1wb3J0RG9jKTsKICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKFNIQURZX1VOU0NPUEVEX0FUVFIsICcnKTsKICAgICAgICAgICAgaW1wb3J0RG9jLl91bnNjb3BlZFN0eWxlID0gc3R5bGU7CiAgICAgICAgICB9IGVsc2UgaWYgKCFpbXBvcnREb2MuX3N0eWxlKSB7CiAgICAgICAgICAgIGltcG9ydERvYy5fc3R5bGUgPSBzdHlsZUZvckltcG9ydChpbXBvcnREb2MpOwogICAgICAgICAgfQogICAgICAgICAgc3R5bGVzLnB1c2godW5zY29wZWQgPyBpbXBvcnREb2MuX3Vuc2NvcGVkU3R5bGUgOiBpbXBvcnREb2MuX3N0eWxlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHN0eWxlczsKICAgIH0KCiAgICAvKioKICAgICAqCiAgICAgKiBSZXR1cm5zIENTUyB0ZXh0IG9mIHN0eWxlcyBpbiBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGBkb20tbW9kdWxlYHMuCiAgICAgKiBOb3RlOiBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkLCB1c2UgYHN0eWxlc0Zyb21Nb2R1bGVzYCBpbnN0ZWFkLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbW9kdWxlSWRzIExpc3Qgb2YgZG9tLW1vZHVsZSBpZCdzIHdpdGhpbiB3aGljaCB0bwogICAgICogc2VhcmNoIGZvciBjc3MuCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENvbmNhdGVuYXRlZCBDU1MgY29udGVudCBmcm9tIHNwZWNpZmllZCBgZG9tLW1vZHVsZWBzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0Zyb21Nb2R1bGVzKG1vZHVsZUlkcykgewogICAgIGxldCBtb2R1bGVzID0gbW9kdWxlSWRzLnRyaW0oKS5zcGxpdCgvXHMrLyk7CiAgICAgbGV0IGNzc1RleHQgPSAnJzsKICAgICBmb3IgKGxldCBpPTA7IGkgPCBtb2R1bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICBjc3NUZXh0ICs9IGNzc0Zyb21Nb2R1bGUobW9kdWxlc1tpXSk7CiAgICAgfQogICAgIHJldHVybiBjc3NUZXh0OwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBDU1MgdGV4dCBvZiBzdHlsZXMgaW4gYSBnaXZlbiBgZG9tLW1vZHVsZWAuICBDU1MgaW4gYSBgZG9tLW1vZHVsZWAKICAgICAqIGNhbiBjb21lIGVpdGhlciBmcm9tIGA8c3R5bGU+YHMgd2l0aGluIHRoZSBmaXJzdCBgPHRlbXBsYXRlPmAsIG9yIGVsc2UKICAgICAqIGZyb20gb25lIG9yIG1vcmUgYDxsaW5rIHJlbD0iaW1wb3J0IiB0eXBlPSJjc3MiPmAgbGlua3Mgb3V0c2lkZSB0aGUKICAgICAqIHRlbXBsYXRlLgogICAgICoKICAgICAqIEFueSBgPHN0eWxlcz5gIHByb2Nlc3NlZCBhcmUgcmVtb3ZlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uLgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZUZyb21Nb2R1bGVgIGluc3RlYWQuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtb2R1bGVJZCBkb20tbW9kdWxlIGlkIHRvIGdhdGhlciBzdHlsZXMgZnJvbQogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgYGRvbS1tb2R1bGVgCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNzc0Zyb21Nb2R1bGUobW9kdWxlSWQpIHsKICAgICAgbGV0IG0gPSBpbXBvcnRNb2R1bGUobW9kdWxlSWQpOwogICAgICBpZiAobSAmJiBtLl9jc3NUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAvLyBtb2R1bGUgaW1wb3J0czogPGxpbmsgcmVsPSJpbXBvcnQiIHR5cGU9ImNzcyI+CiAgICAgICAgbGV0IGNzc1RleHQgPSBfY3NzRnJvbU1vZHVsZUltcG9ydHMobSk7CiAgICAgICAgLy8gaW5jbHVkZSBjc3MgZnJvbSB0aGUgZmlyc3QgdGVtcGxhdGUgaW4gdGhlIG1vZHVsZQogICAgICAgIGxldCB0ID0gLyoqIEB0eXBlIHs/SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8obS5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICBpZiAodCkgewogICAgICAgICAgY3NzVGV4dCArPSBjc3NGcm9tVGVtcGxhdGUodCwKICAgICAgICAgICAgLyoqIEB0eXBlIHt0ZW1wbGF0ZVdpdGhBc3NldFBhdGh9ICovKG0pLmFzc2V0cGF0aCk7CiAgICAgICAgfQogICAgICAgIG0uX2Nzc1RleHQgPSBjc3NUZXh0IHx8IG51bGw7CiAgICAgIH0KICAgICAgaWYgKCFtKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdDb3VsZCBub3QgZmluZCBzdHlsZSBkYXRhIGluIG1vZHVsZSBuYW1lZCcsIG1vZHVsZUlkKTsKICAgICAgfQogICAgICByZXR1cm4gbSAmJiBtLl9jc3NUZXh0IHx8ICcnOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBDU1MgdGV4dCBvZiBgPHN0eWxlcz5gIHdpdGhpbiBhIGdpdmVuIHRlbXBsYXRlLgogICAgICoKICAgICAqIEFueSBgPHN0eWxlcz5gIHByb2Nlc3NlZCBhcmUgcmVtb3ZlZCBmcm9tIHRoZWlyIG9yaWdpbmFsIGxvY2F0aW9uLgogICAgICogTm90ZTogVGhpcyBtZXRob2QgaXMgZGVwcmVjYXRlZCwgdXNlIGBzdHlsZUZyb21UZW1wbGF0ZWAgaW5zdGVhZC4KICAgICAqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gZ2F0aGVyIHN0eWxlcyBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZXNvbHZlIHRoZSBVUkwgYWdhaW5zdAogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBzcGVjaWZpZWQgdGVtcGxhdGUKICAgICAqLwogICAgZnVuY3Rpb24gY3NzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKSB7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGNvbnN0IGUkID0gc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBiYXNlVVJJKTsKICAgICAgLy8gaWYgZWxlbWVudCBpcyBhIHRlbXBsYXRlLCBnZXQgY29udGVudCBmcm9tIGl0cyAuY29udGVudAogICAgICBmb3IgKGxldCBpPTA7IGkgPCBlJC5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBlID0gZSRbaV07CiAgICAgICAgaWYgKGUucGFyZW50Tm9kZSkgewogICAgICAgICAgZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGUpOwogICAgICAgIH0KICAgICAgICBjc3NUZXh0ICs9IGUudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZAogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IG1vZHVsZSBkb20tbW9kdWxlIGVsZW1lbnQgdGhhdCBjb3VsZCBjb250YWluIGA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj5gIHN0eWxlcwogICAgICogQHJldHVybiB7c3RyaW5nfSBDb25jYXRlbmF0ZWQgQ1NTIGNvbnRlbnQgZnJvbSBsaW5rcyBpbiB0aGUgZG9tLW1vZHVsZQogICAgICovCiAgICBmdW5jdGlvbiBfY3NzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKSB7CiAgICAgIGxldCBjc3NUZXh0ID0gJyc7CiAgICAgIGxldCBzdHlsZXMgPSBfc3R5bGVzRnJvbU1vZHVsZUltcG9ydHMobW9kdWxlKTsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgc3R5bGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgY3NzVGV4dCArPSBzdHlsZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIGNzc1RleHQ7CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgLyoqCiAgICAgKiBOb2RlIHdyYXBwZXIgdG8gZW5zdXJlIFNoYWRvd0RPTSBzYWZlIG9wZXJhdGlvbiByZWdhcmRsZXNzIG9mIHBvbHlmaWxsCiAgICAgKiBwcmVzZW5jZSBvciBtb2RlLiBOb3RlIHRoYXQgd2l0aCB0aGUgaW50cm9kdWN0aW9uIG9mIGBTaGFkeURPTS5ub1BhdGNoYCwKICAgICAqIGEgbm9kZSB3cmFwcGVyIG11c3QgYmUgdXNlZCB0byBhY2Nlc3MgU2hhZG93RE9NIEFQSS4KICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB1c2luZyBgUG9seW1lci5kb21gIGJ1dCByZWxpZXMgZXhjbHVzaXZlbHkKICAgICAqIG9uIHRoZSBwcmVzZW5jZSBvZiB0aGUgU2hhZHlET00gcG9seWZpbGwgcmF0aGVyIHRoYW4gcmVxdWlyaW5nIHRoZSBsb2FkaW5nCiAgICAgKiBvZiBsZWdhY3kgKFBvbHltZXIuZG9tKSBBUEkuCiAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oTm9kZSk6Tm9kZX0KICAgICAqLwogICAgY29uc3Qgd3JhcCA9ICh3aW5kb3dbJ1NoYWR5RE9NJ10gJiYgd2luZG93WydTaGFkeURPTSddWydub1BhdGNoJ10gJiYgd2luZG93WydTaGFkeURPTSddWyd3cmFwJ10pID8KICAgICAgd2luZG93WydTaGFkeURPTSddWyd3cmFwJ10gOgogICAgICAod2luZG93WydTaGFkeURPTSddID8gKG4pID0+IFNoYWR5RE9NWydwYXRjaCddKG4pIDogKG4pID0+IG4pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBNb2R1bGUgd2l0aCB1dGlsaXRpZXMgZm9yIG1hbmlwdWxhdGluZyBzdHJ1Y3R1cmVkIGRhdGEgcGF0aCBzdHJpbmdzLgogICAgICoKICAgICAqIEBzdW1tYXJ5IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgbWFuaXB1bGF0aW5nIHN0cnVjdHVyZWQgZGF0YSBwYXRoIHN0cmluZ3MuCiAgICAgKi8KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gc3RyaW5nIGlzIGEgc3RydWN0dXJlZCBkYXRhIHBhdGggKGhhcyBkb3RzKS4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogaXNQYXRoKCdmb28uYmFyLmJheicpIC8vIHRydWUKICAgICAqIGlzUGF0aCgnZm9vJykgICAgICAgICAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHN0cmluZyBjb250YWluZWQgb25lIG9yIG1vcmUgZG90cwogICAgICovCiAgICBmdW5jdGlvbiBpc1BhdGgocGF0aCkgewogICAgICByZXR1cm4gcGF0aC5pbmRleE9mKCcuJykgPj0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHJvb3QgcHJvcGVydHkgbmFtZSBmb3IgdGhlIGdpdmVuIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIHJvb3QoJ2Zvby5iYXIuYmF6JykgLy8gJ2ZvbycKICAgICAqIHJvb3QoJ2ZvbycpICAgICAgICAgLy8gJ2ZvbycKICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggc3RyaW5nCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFJvb3QgcHJvcGVydHkgbmFtZQogICAgICovCiAgICBmdW5jdGlvbiByb290KHBhdGgpIHsKICAgICAgbGV0IGRvdEluZGV4ID0gcGF0aC5pbmRleE9mKCcuJyk7CiAgICAgIGlmIChkb3RJbmRleCA9PT0gLTEpIHsKICAgICAgICByZXR1cm4gcGF0aDsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC5zbGljZSgwLCBkb3RJbmRleCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vYCBpcyBhbiBhbmNlc3RvciwgYGZvby5iYXJgIGlzIG5vdAogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwYXRoIGlzIGFuIGFuY2VzdG9yIG9mIHRoZSBiYXNlIHBhdGguCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIGlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vJykgICAgICAgICAvLyB0cnVlCiAgICAgKiBpc0FuY2VzdG9yKCdmb28uYmFyJywgJ2Zvby5iYXInKSAgICAgLy8gZmFsc2UKICAgICAqIGlzQW5jZXN0b3IoJ2Zvby5iYXInLCAnZm9vLmJhci5iYXonKSAvLyBmYWxzZQogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUGF0aCBzdHJpbmcgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgYHBhdGhgIGlzIGFuIGFuY2VzdG9yIG9mIGBiYXNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gaXNBbmNlc3RvcihiYXNlLCBwYXRoKSB7CiAgICAgIC8vICAgICBiYXNlLnN0YXJ0c1dpdGgocGF0aCArICcuJyk7CiAgICAgIHJldHVybiBiYXNlLmluZGV4T2YocGF0aCArICcuJykgPT09IDA7CiAgICB9CgogICAgLyoqCiAgICAgKiBHaXZlbiBgYmFzZWAgaXMgYGZvby5iYXJgLCBgZm9vLmJhci5iYXpgIGlzIGFuIGRlc2NlbmRhbnQKICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYAogICAgICogaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXIuYmF6JykgLy8gdHJ1ZQogICAgICogaXNEZXNjZW5kYW50KCdmb28uYmFyJywgJ2Zvby5iYXInKSAgICAgLy8gZmFsc2UKICAgICAqIGlzRGVzY2VuZGFudCgnZm9vLmJhcicsICdmb28nKSAgICAgICAgIC8vIGZhbHNlCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZSBQYXRoIHN0cmluZyB0byB0ZXN0IGFnYWluc3QuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZyB0byB0ZXN0LgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgcGF0aGAgaXMgYSBkZXNjZW5kYW50IG9mIGBiYXNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gaXNEZXNjZW5kYW50KGJhc2UsIHBhdGgpIHsKICAgICAgLy8gICAgIHBhdGguc3RhcnRzV2l0aChiYXNlICsgJy4nKTsKICAgICAgcmV0dXJuIHBhdGguaW5kZXhPZihiYXNlICsgJy4nKSA9PT0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIFJlcGxhY2VzIGEgcHJldmlvdXMgYmFzZSBwYXRoIHdpdGggYSBuZXcgYmFzZSBwYXRoLCBwcmVzZXJ2aW5nIHRoZQogICAgICogcmVtYWluZGVyIG9mIHRoZSBwYXRoLgogICAgICoKICAgICAqIFVzZXIgbXVzdCBlbnN1cmUgYHBhdGhgIGhhcyBhIHByZWZpeCBvZiBgYmFzZWAuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIHRyYW5zbGF0ZSgnZm9vLmJhcicsICd6b3QnLCAnZm9vLmJhci5iYXonKSAvLyAnem90LmJheicKICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlIEN1cnJlbnQgYmFzZSBzdHJpbmcgdG8gcmVtb3ZlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmV3QmFzZSBOZXcgYmFzZSBzdHJpbmcgdG8gcmVwbGFjZSB3aXRoCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHRvIHRyYW5zbGF0ZQogICAgICogQHJldHVybiB7c3RyaW5nfSBUcmFuc2xhdGVkIHN0cmluZwogICAgICovCiAgICBmdW5jdGlvbiB0cmFuc2xhdGUoYmFzZSwgbmV3QmFzZSwgcGF0aCkgewogICAgICByZXR1cm4gbmV3QmFzZSArIHBhdGguc2xpY2UoYmFzZS5sZW5ndGgpOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2UgUGF0aCBzdHJpbmcgdG8gdGVzdCBhZ2FpbnN0CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHN0cmluZyB0byB0ZXN0CiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGBwYXRoYCBpcyBlcXVhbCB0byBgYmFzZWAKICAgICAqLwogICAgZnVuY3Rpb24gbWF0Y2hlcyhiYXNlLCBwYXRoKSB7CiAgICAgIHJldHVybiAoYmFzZSA9PT0gcGF0aCkgfHwKICAgICAgICAgICAgIGlzQW5jZXN0b3IoYmFzZSwgcGF0aCkgfHwKICAgICAgICAgICAgIGlzRGVzY2VuZGFudChiYXNlLCBwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzIGFycmF5LWJhc2VkIHBhdGhzIHRvIGZsYXR0ZW5lZCBwYXRoLiAgU3RyaW5nLWJhc2VkIHBhdGhzCiAgICAgKiBhcmUgcmV0dXJuZWQgYXMtaXMuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIG5vcm1hbGl6ZShbJ2Zvby5iYXInLCAwLCAnYmF6J10pICAvLyAnZm9vLmJhci4wLmJheicKICAgICAqIG5vcm1hbGl6ZSgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyAnZm9vLmJhci4wLmJheicKICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIElucHV0IHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZ30gRmxhdHRlbmVkIHBhdGgKICAgICAqLwogICAgZnVuY3Rpb24gbm9ybWFsaXplKHBhdGgpIHsKICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGFyZ3MgPSBwYXRoW2ldLnRvU3RyaW5nKCkuc3BsaXQoJy4nKTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxhcmdzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgIHBhcnRzLnB1c2goYXJnc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFNwbGl0cyBhIHBhdGggaW50byBhbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy4gQWNjZXB0cyBlaXRoZXIgYXJyYXlzCiAgICAgKiBvZiBwYXRoIHBhcnRzIG9yIHN0cmluZ3MuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIHNwbGl0KFsnZm9vLmJhcicsIDAsICdiYXonXSkgIC8vIFsnZm9vJywgJ2JhcicsICcwJywgJ2JheiddCiAgICAgKiBzcGxpdCgnZm9vLmJhci4wLmJheicpICAgICAgICAvLyBbJ2ZvbycsICdiYXInLCAnMCcsICdiYXonXQogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggSW5wdXQgcGF0aAogICAgICogQHJldHVybiB7IUFycmF5PHN0cmluZz59IEFycmF5IG9mIHBhdGggcGFydHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlc30KICAgICAqLwogICAgZnVuY3Rpb24gc3BsaXQocGF0aCkgewogICAgICBpZiAoQXJyYXkuaXNBcnJheShwYXRoKSkgewogICAgICAgIHJldHVybiBub3JtYWxpemUocGF0aCkuc3BsaXQoJy4nKTsKICAgICAgfQogICAgICByZXR1cm4gcGF0aC50b1N0cmluZygpLnNwbGl0KCcuJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZWFkcyBhIHZhbHVlIGZyb20gYSBwYXRoLiAgSWYgYW55IHN1Yi1wcm9wZXJ0eSBpbiB0aGUgcGF0aCBpcyBgdW5kZWZpbmVkYCwKICAgICAqIHRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAgKHdpbGwgbmV2ZXIgdGhyb3cuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IHJvb3QgT2JqZWN0IGZyb20gd2hpY2ggdG8gZGVyZWZlcmVuY2UgcGF0aCBmcm9tCiAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gaW5mbyBJZiBhbiBvYmplY3QgaXMgcHJvdmlkZWQgdG8gYGluZm9gLCB0aGUgbm9ybWFsaXplZAogICAgICogIChmbGF0dGVuZWQpIHBhdGggd2lsbCBiZSBzZXQgdG8gYGluZm8ucGF0aGAuCiAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSBhdCBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiB0aGUgcGF0aCBjb3VsZCBub3QgYmUKICAgICAqICBmdWxseSBkZXJlZmVyZW5jZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldChyb290LCBwYXRoLCBpbmZvKSB7CiAgICAgIGxldCBwcm9wID0gcm9vdDsKICAgICAgbGV0IHBhcnRzID0gc3BsaXQocGF0aCk7CiAgICAgIC8vIExvb3Agb3ZlciBwYXRoIHBhcnRzWzAuLm4tMV0gYW5kIGRlcmVmZXJlbmNlCiAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGlmICghcHJvcCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgcGFydCA9IHBhcnRzW2ldOwogICAgICAgIHByb3AgPSBwcm9wW3BhcnRdOwogICAgICB9CiAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgaW5mby5wYXRoID0gcGFydHMuam9pbignLicpOwogICAgICB9CiAgICAgIHJldHVybiBwcm9wOwogICAgfQoKICAgIC8qKgogICAgICogU2V0cyBhIHZhbHVlIHRvIGEgcGF0aC4gIElmIGFueSBzdWItcHJvcGVydHkgaW4gdGhlIHBhdGggaXMgYHVuZGVmaW5lZGAsCiAgICAgKiB0aGlzIG1ldGhvZCB3aWxsIG5vLW9wLgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByb290IE9iamVjdCBmcm9tIHdoaWNoIHRvIGRlcmVmZXJlbmNlIHBhdGggZnJvbQogICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBzZXQKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0IHRvIHBhdGgKICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gVGhlIG5vcm1hbGl6ZWQgdmVyc2lvbiBvZiB0aGUgaW5wdXQgcGF0aAogICAgICovCiAgICBmdW5jdGlvbiBzZXQocm9vdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IHByb3AgPSByb290OwogICAgICBsZXQgcGFydHMgPSBzcGxpdChwYXRoKTsKICAgICAgbGV0IGxhc3QgPSBwYXJ0c1twYXJ0cy5sZW5ndGgtMV07CiAgICAgIGlmIChwYXJ0cy5sZW5ndGggPiAxKSB7CiAgICAgICAgLy8gTG9vcCBvdmVyIHBhdGggcGFydHNbMC4ubi0yXSBhbmQgZGVyZWZlcmVuY2UKICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGFydHMubGVuZ3RoLTE7IGkrKykgewogICAgICAgICAgbGV0IHBhcnQgPSBwYXJ0c1tpXTsKICAgICAgICAgIHByb3AgPSBwcm9wW3BhcnRdOwogICAgICAgICAgaWYgKCFwcm9wKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gU2V0IHZhbHVlIHRvIG9iamVjdCBhdCBlbmQgb2YgcGF0aAogICAgICAgIHByb3BbbGFzdF0gPSB2YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBTaW1wbGUgcHJvcGVydHkgc2V0CiAgICAgICAgcHJvcFtwYXRoXSA9IHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiBwYXJ0cy5qb2luKCcuJyk7CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCBjYXNlTWFwID0ge307CiAgICBjb25zdCBEQVNIX1RPX0NBTUVMID0gLy1bYS16XS9nOwogICAgY29uc3QgQ0FNRUxfVE9fREFTSCA9IC8oW0EtWl0pL2c7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IE1vZHVsZSB3aXRoIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuICJkYXNoLWNhc2UiIGFuZAogICAgICogImNhbWVsQ2FzZSIgaWRlbnRpZmllcnMuCiAgICAgKi8KCiAgICAvKioKICAgICAqIENvbnZlcnRzICJkYXNoLWNhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvby1iYXItYmF6YCkgdG8gImNhbWVsQ2FzZSIKICAgICAqIChlLmcuIGBmb29CYXJCYXpgKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGFzaCBEYXNoLWNhc2UgaWRlbnRpZmllcgogICAgICogQHJldHVybiB7c3RyaW5nfSBDYW1lbC1jYXNlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpZGVudGlmaWVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRhc2hUb0NhbWVsQ2FzZShkYXNoKSB7CiAgICAgIHJldHVybiBjYXNlTWFwW2Rhc2hdIHx8ICgKICAgICAgICBjYXNlTWFwW2Rhc2hdID0gZGFzaC5pbmRleE9mKCctJykgPCAwID8gZGFzaCA6IGRhc2gucmVwbGFjZShEQVNIX1RPX0NBTUVMLAogICAgICAgICAgKG0pID0+IG1bMV0udG9VcHBlckNhc2UoKQogICAgICAgICkKICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgICAqIENvbnZlcnRzICJjYW1lbENhc2UiIGlkZW50aWZpZXIgKGUuZy4gYGZvb0JhckJhemApIHRvICJkYXNoLWNhc2UiCiAgICAgKiAoZS5nLiBgZm9vLWJhci1iYXpgKS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FtZWwgQ2FtZWwtY2FzZSBpZGVudGlmaWVyCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IERhc2gtY2FzZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgaWRlbnRpZmllcgogICAgICovCiAgICBmdW5jdGlvbiBjYW1lbFRvRGFzaENhc2UoY2FtZWwpIHsKICAgICAgcmV0dXJuIGNhc2VNYXBbY2FtZWxdIHx8ICgKICAgICAgICBjYXNlTWFwW2NhbWVsXSA9IGNhbWVsLnJlcGxhY2UoQ0FNRUxfVE9fREFTSCwgJy0kMScpLnRvTG93ZXJDYXNlKCkKICAgICAgKTsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8vIE1pY3JvdGFzayBpbXBsZW1lbnRlZCB1c2luZyBNdXRhdGlvbiBPYnNlcnZlcgogICAgbGV0IG1pY3JvdGFza0N1cnJIYW5kbGUgPSAwOwogICAgbGV0IG1pY3JvdGFza0xhc3RIYW5kbGUgPSAwOwogICAgbGV0IG1pY3JvdGFza0NhbGxiYWNrcyA9IFtdOwogICAgbGV0IG1pY3JvdGFza05vZGVDb250ZW50ID0gMDsKICAgIGxldCBtaWNyb3Rhc2tTY2hlZHVsZWQgPSBmYWxzZTsKICAgIGxldCBtaWNyb3Rhc2tOb2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoJycpOwogICAgbmV3IHdpbmRvdy5NdXRhdGlvbk9ic2VydmVyKG1pY3JvdGFza0ZsdXNoKS5vYnNlcnZlKG1pY3JvdGFza05vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7CgogICAgZnVuY3Rpb24gbWljcm90YXNrRmx1c2goKSB7CiAgICAgIG1pY3JvdGFza1NjaGVkdWxlZCA9IGZhbHNlOwogICAgICBjb25zdCBsZW4gPSBtaWNyb3Rhc2tDYWxsYmFja3MubGVuZ3RoOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgbGV0IGNiID0gbWljcm90YXNrQ2FsbGJhY2tzW2ldOwogICAgICAgIGlmIChjYikgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgY2IoKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRocm93IGU7IH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICBtaWNyb3Rhc2tDYWxsYmFja3Muc3BsaWNlKDAsIGxlbik7CiAgICAgIG1pY3JvdGFza0xhc3RIYW5kbGUgKz0gbGVuOwogICAgfQoKICAgIC8qKgogICAgICogQXN5bmMgaW50ZXJmYWNlIHdyYXBwZXIgYXJvdW5kIGBzZXRUaW1lb3V0YC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2Ugd3JhcHBlciBhcm91bmQgYHNldFRpbWVvdXRgLgogICAgICovCiAgICBjb25zdCB0aW1lT3V0ID0gewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHN1Yi1tb2R1bGUgd2l0aCB0aGUgYXN5bmMgaW50ZXJmYWNlIHByb3ZpZGluZyB0aGUgcHJvdmlkZWQKICAgICAgICogZGVsYXkuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiB0aW1lT3V0CiAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gZGVsYXkgVGltZSB0byB3YWl0IGJlZm9yZSBjYWxsaW5nIGNhbGxiYWNrcyBpbiBtcwogICAgICAgKiBAcmV0dXJuIHshQXN5bmNJbnRlcmZhY2V9IEFuIGFzeW5jIHRpbWVvdXQgaW50ZXJmYWNlCiAgICAgICAqLwogICAgICBhZnRlcihkZWxheSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBydW4oZm4pIHsgcmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KGZuLCBkZWxheSk7IH0sCiAgICAgICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9LAogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgaW4gdGhlIG5leHQgdGFzay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIHRpbWVPdXQKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGF5IERlbGF5IGluIG1pbGxpc2Vjb25kcwogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuLCBkZWxheSkgewogICAgICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmbiwgZGVsYXkpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYHRpbWVPdXRgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgdGltZU91dAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2Ugd3JhcHBlciBhcm91bmQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuCiAgICAgKi8KICAgIGNvbnN0IGFuaW1hdGlvbkZyYW1lID0gewogICAgICAvKioKICAgICAgICogRW5xdWV1ZXMgYSBmdW5jdGlvbiBjYWxsZWQgYXQgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgYW5pbWF0aW9uRnJhbWUKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbihudW1iZXIpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGFuaW1hdGlvbkZyYW1lYCBjYWxsYmFjay4KICAgICAgICoKICAgICAgICogQG1lbWJlcm9mIGFuaW1hdGlvbkZyYW1lCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKGhhbmRsZSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBBc3luYyBpbnRlcmZhY2Ugd3JhcHBlciBhcm91bmQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgLiAgRmFsbHMgYmFjayB0bwogICAgICogYHNldFRpbWVvdXRgIG9uIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgYHJlcXVlc3RJZGxlQ2FsbGJhY2tgLgogICAgICoKICAgICAqIEBuYW1lc3BhY2UKICAgICAqIEBzdW1tYXJ5IEFzeW5jIGludGVyZmFjZSB3cmFwcGVyIGFyb3VuZCBgcmVxdWVzdElkbGVDYWxsYmFja2AuCiAgICAgKi8KICAgIGNvbnN0IGlkbGVQZXJpb2QgPSB7CiAgICAgIC8qKgogICAgICAgKiBFbnF1ZXVlcyBhIGZ1bmN0aW9uIGNhbGxlZCBhdCBgcmVxdWVzdElkbGVDYWxsYmFja2AgdGltaW5nLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFJZGxlRGVhZGxpbmUpOnZvaWR9IGZuIENhbGxiYWNrIHRvIHJ1bgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IEhhbmRsZSB1c2VkIGZvciBjYW5jZWxpbmcgdGFzawogICAgICAgKi8KICAgICAgcnVuKGZuKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrID8KICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0SWRsZUNhbGxiYWNrKGZuKSA6CiAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmbiwgMTYpOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgZW5xdWV1ZWQgYGlkbGVQZXJpb2RgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgaWRsZVBlcmlvZAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIGBydW5gIG9mIGNhbGxiYWNrIHRvIGNhbmNlbAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKGhhbmRsZSkgewogICAgICAgIHdpbmRvdy5jYW5jZWxJZGxlQ2FsbGJhY2sgPwogICAgICAgICAgd2luZG93LmNhbmNlbElkbGVDYWxsYmFjayhoYW5kbGUpIDoKICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQoaGFuZGxlKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEFzeW5jIGludGVyZmFjZSBmb3IgZW5xdWV1aW5nIGNhbGxiYWNrcyB0aGF0IHJ1biBhdCBtaWNyb3Rhc2sgdGltaW5nLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBtaWNyb3Rhc2sgdGltaW5nIGlzIGFjaGlldmVkIHZpYSBhIHNpbmdsZSBgTXV0YXRpb25PYnNlcnZlcmAsCiAgICAgKiBhbmQgdGh1cyBjYWxsYmFja3MgZW5xdWV1ZWQgd2l0aCB0aGlzIEFQSSB3aWxsIGFsbCBydW4gaW4gYSBzaW5nbGUKICAgICAqIGJhdGNoLCBhbmQgbm90IGludGVybGVhdmVkIHdpdGggb3RoZXIgbWljcm90YXNrcyBzdWNoIGFzIHByb21pc2VzLgogICAgICogUHJvbWlzZXMgYXJlIGF2b2lkZWQgYXMgYW4gaW1wbGVtZW50YXRpb24gY2hvaWNlIGZvciB0aGUgdGltZSBiZWluZwogICAgICogZHVlIHRvIFNhZmFyaSBidWdzIHRoYXQgY2F1c2UgUHJvbWlzZXMgdG8gbGFjayBtaWNyb3Rhc2sgZ3VhcmFudGVlcy4KICAgICAqCiAgICAgKiBAbmFtZXNwYWNlCiAgICAgKiBAc3VtbWFyeSBBc3luYyBpbnRlcmZhY2UgZm9yIGVucXVldWluZyBjYWxsYmFja3MgdGhhdCBydW4gYXQgbWljcm90YXNrCiAgICAgKiAgIHRpbWluZy4KICAgICAqLwogICAgY29uc3QgbWljcm9UYXNrID0gewoKICAgICAgLyoqCiAgICAgICAqIEVucXVldWVzIGEgZnVuY3Rpb24gY2FsbGVkIGF0IG1pY3JvdGFzayB0aW1pbmcuCiAgICAgICAqCiAgICAgICAqIEBtZW1iZXJvZiBtaWNyb1Rhc2sKICAgICAgICogQHBhcmFtIHshRnVuY3Rpb249fSBjYWxsYmFjayBDYWxsYmFjayB0byBydW4KICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdXNlZCBmb3IgY2FuY2VsaW5nIHRhc2sKICAgICAgICovCiAgICAgIHJ1bihjYWxsYmFjaykgewogICAgICAgIGlmICghbWljcm90YXNrU2NoZWR1bGVkKSB7CiAgICAgICAgICBtaWNyb3Rhc2tTY2hlZHVsZWQgPSB0cnVlOwogICAgICAgICAgbWljcm90YXNrTm9kZS50ZXh0Q29udGVudCA9IG1pY3JvdGFza05vZGVDb250ZW50Kys7CiAgICAgICAgfQogICAgICAgIG1pY3JvdGFza0NhbGxiYWNrcy5wdXNoKGNhbGxiYWNrKTsKICAgICAgICByZXR1cm4gbWljcm90YXNrQ3VyckhhbmRsZSsrOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgYSBwcmV2aW91c2x5IGVucXVldWVkIGBtaWNyb1Rhc2tgIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAbWVtYmVyb2YgbWljcm9UYXNrCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBoYW5kbGUgSGFuZGxlIHJldHVybmVkIGZyb20gYHJ1bmAgb2YgY2FsbGJhY2sgdG8gY2FuY2VsCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjYW5jZWwoaGFuZGxlKSB7CiAgICAgICAgY29uc3QgaWR4ID0gaGFuZGxlIC0gbWljcm90YXNrTGFzdEhhbmRsZTsKICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgIGlmICghbWljcm90YXNrQ2FsbGJhY2tzW2lkeF0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdpbnZhbGlkIGFzeW5jIGhhbmRsZTogJyArIGhhbmRsZSk7CiAgICAgICAgICB9CiAgICAgICAgICBtaWNyb3Rhc2tDYWxsYmFja3NbaWR4XSA9IG51bGw7CiAgICAgICAgfQogICAgICB9CgogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKiBAY29uc3QgeyFBc3luY0ludGVyZmFjZX0gKi8KICAgIGNvbnN0IG1pY3JvdGFzayA9IG1pY3JvVGFzazsKCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBiYXNpYyBtZXRhLXByb2dyYW1taW5nIGZvciBjcmVhdGluZyBvbmUKICAgICAqIG9yIG1vcmUgcHJvcGVydHkgYWNjZXNzb3JzIChnZXR0ZXIvc2V0dGVyIHBhaXIpIHRoYXQgZW5xdWV1ZSBhbiBhc3luYwogICAgICogKGJhdGNoZWQpIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICoKICAgICAqIEZvciBiYXNpYyB1c2FnZSBvZiB0aGlzIG1peGluLCBjYWxsIGBNeUNsYXNzLmNyZWF0ZVByb3BlcnRpZXMocHJvcHMpYAogICAgICogb25jZSBhdCBjbGFzcyBkZWZpbml0aW9uIHRpbWUgdG8gY3JlYXRlIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgcHJvcGVydGllcwogICAgICogbmFtZWQgaW4gcHJvcHMsIGltcGxlbWVudCBgX3Byb3BlcnRpZXNDaGFuZ2VkYCB0byByZWFjdCBhcyBkZXNpcmVkIHRvCiAgICAgKiBwcm9wZXJ0eSBjaGFuZ2VzLCBhbmQgaW1wbGVtZW50IGBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpYCBhbmQKICAgICAqIGluY2x1ZGUgbG93ZXJjYXNlIHZlcnNpb25zIG9mIGFueSBwcm9wZXJ0eSBuYW1lcyB0aGF0IHNob3VsZCBiZSBzZXQgZnJvbQogICAgICogYXR0cmlidXRlcy4gTGFzdCwgY2FsbCBgdGhpcy5fZW5hYmxlUHJvcGVydGllcygpYCBpbiB0aGUgZWxlbWVudCdzCiAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvIGVuYWJsZSB0aGUgYWNjZXNzb3JzLgogICAgICoKICAgICAqIEBtaXhpbkZ1bmN0aW9uCiAgICAgKiBAcG9seW1lcgogICAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICAgKiAgIGdlbmVyYXRlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3MgQ2xhc3MgdG8gYXBwbHkgbWl4aW4gdG8uCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3Mgd2l0aCBtaXhpbiBhcHBsaWVkLgogICAgICovCiAgICBjb25zdCBQcm9wZXJ0aWVzQ2hhbmdlZCA9IGRlZHVwaW5nTWl4aW4oCiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpUKX0gc3VwZXJDbGFzcyBDbGFzcyB0byBhcHBseSBtaXhpbiB0by4KICAgICAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3Mgd2l0aCBtaXhpbiBhcHBsaWVkLgogICAgICAgICAqLwogICAgICAgIChzdXBlckNsYXNzKSA9PiB7CgogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICovCiAgICAgIGNsYXNzIFByb3BlcnRpZXNDaGFuZ2VkIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgcHJvcGVydHkgYWNjZXNzb3JzIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyBPYmplY3Qgd2hvc2Uga2V5cyBhcmUgbmFtZXMgb2YgYWNjZXNzb3JzLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNyZWF0ZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIGNvbnN0IHByb3RvID0gdGhpcy5wcm90b3R5cGU7CiAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BzKSB7CiAgICAgICAgICAgIC8vIGRvbid0IHN0b21wIGFuIGV4aXN0aW5nIGFjY2Vzc29yCiAgICAgICAgICAgIGlmICghKHByb3AgaW4gcHJvdG8pKSB7CiAgICAgICAgICAgICAgcHJvdG8uX2NyZWF0ZVByb3BlcnR5QWNjZXNzb3IocHJvcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gYXR0cmlidXRlIG5hbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSBuYW1lIGlzIHRoZSBsb3dlcmNhc2VkIHByb3BlcnR5IG5hbWUuIE92ZXJyaWRlIHRvCiAgICAgICAgICogY3VzdG9taXplIHRoaXMgbWFwcGluZy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gQXR0cmlidXRlIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gcHJvcGVydHkudG9Mb3dlckNhc2UoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlIHBvaW50IHRvIHByb3ZpZGUgYSB0eXBlIHRvIHdoaWNoIHRvIGRlc2VyaWFsaXplIGEgdmFsdWUgdG8KICAgICAgICAgKiBhIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgcHJvcGVydHkKICAgICAgICAgKgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB0eXBlRm9yUHJvcGVydHkobmFtZSkgeyB9IC8vZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2V0dGVyL2dldHRlciBwYWlyIGZvciB0aGUgbmFtZWQgcHJvcGVydHkgd2l0aCBpdHMgb3duCiAgICAgICAgICogbG9jYWwgc3RvcmFnZS4gIFRoZSBnZXR0ZXIgcmV0dXJucyB0aGUgdmFsdWUgaW4gdGhlIGxvY2FsIHN0b3JhZ2UsCiAgICAgICAgICogYW5kIHRoZSBzZXR0ZXIgY2FsbHMgYF9zZXRQcm9wZXJ0eWAsIHdoaWNoIHVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UKICAgICAgICAgKiBmb3IgdGhlIHByb3BlcnR5IGFuZCBlbnF1ZXVlcyBhIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBvbiBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4gIENhbGxpbmcKICAgICAgICAgKiB0aGlzIG1ldGhvZCBtYXkgb3ZlcndyaXRlIGEgcHJvcGVydHkgdmFsdWUgdGhhdCBhbHJlYWR5IGV4aXN0cyBvbgogICAgICAgICAqIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgYnkgY3JlYXRpbmcgdGhlIGFjY2Vzc29yLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZDsgdGhlCiAgICAgICAgICogICBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgZnVuY3Rpb24gbXVzdCBiZSB1c2VkIHRvIHNldCB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5VG9BdHRyaWJ1dGVNYXAocHJvcGVydHkpOwogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZGF0YUhhc0FjY2Vzc29yJywgdGhpcykpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9fZGF0YUhhc0FjY2Vzc29yKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0pIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV0gPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBnaXZlbiBgcHJvcGVydHlgIHRvIGEgbWFwIG1hdGNoaW5nIGF0dHJpYnV0ZSBuYW1lcwogICAgICAgICAqIHRvIHByb3BlcnR5IG5hbWVzLCB1c2luZyBgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5YC4gVGhpcyBtYXAgaXMKICAgICAgICAgKiB1c2VkIHdoZW4gZGVzZXJpYWxpemluZyBhdHRyaWJ1dGUgdmFsdWVzIHRvIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwcm9wZXJ0eSkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZGF0YUF0dHJpYnV0ZXMnLCB0aGlzKSkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgdGVjaG5pY2FsbHkgbm90IGNvcnJlY3Q7IGl0J3MgYW4gb3B0aW1pemF0aW9uIHRoYXQKICAgICAgICAgIC8vIGFzc3VtZXMgdGhhdCBpZiBhIF9wcm9wZXJ0eV8gbmFtZSBpcyBhbHJlYWR5IGluIHRoZSBtYXAgKG5vdGUgdGhpcyBpcwogICAgICAgICAgLy8gYW4gYXR0ci0+cHJvcGVydHkgbWFwKSwgdGhlIHByb3BlcnR5IG1hcHBlZCBkaXJlY3RseSB0byB0aGUgYXR0cmlidXRlCiAgICAgICAgICAvLyBhbmQgaXQgaGFzIGFscmVhZHkgYmVlbiBtYXBwZWQuICBUaGlzIHdvdWxkIGZhaWwgaWYKICAgICAgICAgIC8vIGBhdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHlgIHdlcmUgb3ZlcnJpZGRlbiBzdWNoIHRoYXQgdGhpcyB3YXMgbm90IHRoZQogICAgICAgICAgLy8gY2FzZS4KICAgICAgICAgIGxldCBhdHRyID0gdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW3Byb3BlcnR5XTsKICAgICAgICAgIGlmICghYXR0cikgewogICAgICAgICAgICBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgICB0aGlzLl9fZGF0YUF0dHJpYnV0ZXNbYXR0cl0gPSBwcm9wZXJ0eTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBhdHRyOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmaW5lcyBhIHByb3BlcnR5IGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcmVhZE9ubHkgV2hlbiB0cnVlLCBubyBzZXR0ZXIgaXMgY3JlYXRlZAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSkgewogICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsIHByb3BlcnR5LCB7CiAgICAgICAgICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAgICAgICAgIC8qKiBAdGhpcyB7UHJvcGVydGllc0NoYW5nZWR9ICovCiAgICAgICAgICAgIGdldCgpIHsKICAgICAgICAgICAgICAvLyBJbmxpbmUgZm9yIHBlcmYgaW5zdGVhZCBvZiB1c2luZyBgX2dldFByb3BlcnR5YAogICAgICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8qKiBAdGhpcyB7UHJvcGVydGllc0NoYW5nZWR9ICovCiAgICAgICAgICAgIHNldDogcmVhZE9ubHkgPyBmdW5jdGlvbiAoKSB7fSA6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgIC8vIElubGluZSBmb3IgcGVyZiBpbnN0ZWFkIG9mIHVzaW5nIGBfc2V0UHJvcGVydHlgCiAgICAgICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAgIHRoaXMuX19kYXRhRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcyA9IG51bGw7CiAgICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICAgIC8vIE5PVEU6IHVzZWQgdG8gdHJhY2sgcmUtZW50cmFudCBjYWxscyB0byBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICAgIHRoaXMuX19kYXRhQ291bnRlciA9IDA7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMaWZlY3ljbGUgY2FsbGJhY2sgY2FsbGVkIHdoZW4gcHJvcGVydGllcyBhcmUgZW5hYmxlZCB2aWEKICAgICAgICAgKiBgX2VuYWJsZVByb3BlcnRpZXNgLgogICAgICAgICAqCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50IGJlaGF2aW9yIHRoYXQgaXMKICAgICAgICAgKiBkZXBlbmRlbnQgb24gdGhlIGVsZW1lbnQgaGF2aW5nIGl0cyBwcm9wZXJ0eSBkYXRhIGluaXRpYWxpemVkLCBlLmcuCiAgICAgICAgICogZnJvbSBkZWZhdWx0cyAoaW5pdGlhbGl6ZWQgZnJvbSBgY29uc3RydWN0b3JgLCBgX2luaXRpYWxpemVQcm9wZXJ0aWVzYCksCiAgICAgICAgICogYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AsIG9yIHZhbHVlcyBwcm9wYWdhdGVkIGZyb20gaG9zdCBlLmcuIHZpYQogICAgICAgICAqIGJpbmRpbmdzLiAgYHN1cGVyLnJlYWR5KClgIG11c3QgYmUgY2FsbGVkIHRvIGVuc3VyZSB0aGUgZGF0YSBzeXN0ZW0KICAgICAgICAgKiBiZWNvbWVzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgcHJvcGVydHkgYWNjZXNzb3JzLgogICAgICAgICAqCiAgICAgICAgICogUHJvdmlkZWQgYXMgYW4gb3ZlcnJpZGUgcG9pbnQgZm9yIHBlcmZvcm1pbmcgYW55IHNldHVwIHdvcmsgcHJpb3IKICAgICAgICAgKiB0byBpbml0aWFsaXppbmcgdGhlIHByb3BlcnR5IGFjY2Vzc29yIHN5c3RlbS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIENhcHR1cmUgaW5zdGFuY2UgcHJvcGVydGllczsgdGhlc2Ugd2lsbCBiZSBzZXQgaW50byBhY2Nlc3NvcnMKICAgICAgICAgIC8vIGR1cmluZyBmaXJzdCBmbHVzaC4gRG9uJ3Qgc2V0IHRoZW0gaGVyZSwgc2luY2Ugd2Ugd2FudAogICAgICAgICAgLy8gdGhlc2UgdG8gb3ZlcndyaXRlIGRlZmF1bHRzL2NvbnN0cnVjdG9yIGFzc2lnbm1lbnRzCiAgICAgICAgICBmb3IgKGxldCBwIGluIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzT3duUHJvcGVydHkocCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzW3BdID0gdGhpc1twXTsKICAgICAgICAgICAgICBkZWxldGUgdGhpc1twXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGF0IHJlYWR5IHRpbWUgd2l0aCBiYWcgb2YgaW5zdGFuY2UgcHJvcGVydGllcyB0aGF0IG92ZXJ3cm90ZQogICAgICAgICAqIGFjY2Vzc29ycyB3aGVuIHRoZSBlbGVtZW50IHVwZ3JhZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgcmVhZHkgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgcHJvcHMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgbG9jYWwgc3RvcmFnZSBmb3IgYSBwcm9wZXJ0eSAodmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YCkKICAgICAgICAgKiBhbmQgZW5xdWV1ZXMgYSBgX3Byb2VwcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7Kn0gVmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfZ2V0UHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby11bnVzZWQtdmFycyAqLwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGxvY2FsIHN0b3JhZ2UgZm9yIGEgcHJvcGVydHksIHJlY29yZHMgdGhlIHByZXZpb3VzIHZhbHVlLAogICAgICAgICAqIGFuZCBhZGRzIGl0IHRvIHRoZSBzZXQgb2YgInBlbmRpbmcgY2hhbmdlcyIgdGhhdCB3aWxsIGJlIHBhc3NlZCB0byB0aGUKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4gIFRoaXMgbWV0aG9kIGRvZXMgbm90IGVucXVldWUgdGhlCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGV4dCBOb3QgdXNlZCBoZXJlOyBhZmZvcmRhbmNlIGZvciBjbG9zdXJlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHkocHJvcGVydHksIHZhbHVlLCBleHQpIHsKICAgICAgICAgIGxldCBvbGQgPSB0aGlzLl9fZGF0YVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgY2hhbmdlZCA9IHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgb2xkKTsKICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFQZW5kaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0ge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgb2xkIGlzIGNhcHR1cmVkIGZyb20gdGhlIGxhc3QgdHVybgogICAgICAgICAgICBpZiAodGhpcy5fX2RhdGFPbGQgJiYgIShwcm9wZXJ0eSBpbiB0aGlzLl9fZGF0YU9sZCkpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZFtwcm9wZXJ0eV0gPSBvbGQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ1twcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjaGFuZ2VkOwogICAgICAgIH0KICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgaXMgcGVuZGluZy4KICAgICAgICAgKi8KICAgICAgICBfaXNQcm9wZXJ0eVBlbmRpbmcocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiAhISh0aGlzLl9fZGF0YVBlbmRpbmcgJiYgdGhpcy5fX2RhdGFQZW5kaW5nLmhhc093blByb3BlcnR5KHByb3BlcnR5KSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyB0aGUgcHJvcGVydGllcyBhcyBpbnZhbGlkLCBhbmQgZW5xdWV1ZXMgYW4gYXN5bmMKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9pbnZhbGlkYXRlUHJvcGVydGllcygpIHsKICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFJbnZhbGlkICYmIHRoaXMuX19kYXRhUmVhZHkpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gdHJ1ZTsKICAgICAgICAgICAgbWljcm90YXNrLnJ1bigoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhSW52YWxpZCkgewogICAgICAgICAgICAgICAgdGhpcy5fX2RhdGFJbnZhbGlkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbCB0byBlbmFibGUgcHJvcGVydHkgYWNjZXNzb3IgcHJvY2Vzc2luZy4gQmVmb3JlIHRoaXMgbWV0aG9kIGlzCiAgICAgICAgICogY2FsbGVkIGFjY2Vzc29yIHZhbHVlcyB3aWxsIGJlIHNldCBidXQgc2lkZSBlZmZlY3RzIGFyZQogICAgICAgICAqIHF1ZXVlZC4gV2hlbiBjYWxsZWQsIGFueSBwZW5kaW5nIHNpZGUgZWZmZWN0cyBvY2N1ciBpbW1lZGlhdGVseS4KICAgICAgICAgKiBGb3IgZWxlbWVudHMsIGdlbmVyYWxseSBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGEgbm9ybWFsIHNwb3QgdG8gZG8gc28uCiAgICAgICAgICogSXQgaXMgc2FmZSB0byBjYWxsIHRoaXMgbWV0aG9kIG11bHRpcGxlIHRpbWVzIGFzIGl0IG9ubHkgdHVybnMgb24KICAgICAgICAgKiBwcm9wZXJ0eSBhY2Nlc3NvcnMgb25jZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9lbmFibGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YUVuYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuX19kYXRhSW5zdGFuY2VQcm9wcykgewogICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXModGhpcy5fX2RhdGFJbnN0YW5jZVByb3BzKTsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YUluc3RhbmNlUHJvcHMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVhZHkoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxzIHRoZSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjayB3aXRoIHRoZSBjdXJyZW50IHNldCBvZgogICAgICAgICAqIHBlbmRpbmcgY2hhbmdlcyAoYW5kIG9sZCB2YWx1ZXMgcmVjb3JkZWQgd2hlbiBwZW5kaW5nIGNoYW5nZXMgd2VyZQogICAgICAgICAqIHNldCksIGFuZCByZXNldHMgdGhlIHBlbmRpbmcgc2V0IG9mIGNoYW5nZXMuIEdlbmVyYWxseSwgdGhpcyBtZXRob2QKICAgICAgICAgKiBzaG91bGQgbm90IGJlIGNhbGxlZCBpbiB1c2VyIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfZmx1c2hQcm9wZXJ0aWVzKCkgewogICAgICAgICAgdGhpcy5fX2RhdGFDb3VudGVyKys7CiAgICAgICAgICBjb25zdCBwcm9wcyA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgY2hhbmdlZFByb3BzID0gdGhpcy5fX2RhdGFQZW5kaW5nOwogICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fX2RhdGFPbGQ7CiAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUHJvcGVydGllc0NoYW5nZShwcm9wcywgY2hhbmdlZFByb3BzLCBvbGQpKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllc0NoYW5nZWQocHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19kYXRhQ291bnRlci0tOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIGluIGBfZmx1c2hQcm9wZXJ0aWVzYCB0byBkZXRlcm1pbmUgaWYgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBzaG91bGQgYmUgY2FsbGVkLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgaWYKICAgICAgICAgKiBwcm9wZXJ0aWVzIGFyZSBwZW5kaW5nLiBPdmVycmlkZSB0byBjdXN0b21pemUgd2hlbgogICAgICAgICAqIGBfcHJvcGVydGllc0NoYW5nZWRgIGlzIGNhbGxlZC4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGN1cnJlbnRQcm9wcyBCYWcgb2YgYWxsIGN1cnJlbnQgYWNjZXNzb3IgdmFsdWVzCiAgICAgICAgICogQHBhcmFtIHs/T2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdAogICAgICAgICAqICAgY2FsbCB0byBgX3Byb3BlcnRpZXNDaGFuZ2VkYAogICAgICAgICAqIEBwYXJhbSB7P09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgZWFjaCBwcm9wZXJ0eQogICAgICAgICAqICAgaW4gYGNoYW5nZWRQcm9wc2AKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGNoYW5nZWRQcm9wcyBpcyB0cnV0aHkKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydGllc0NoYW5nZShjdXJyZW50UHJvcHMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwogICAgICAgICAgcmV0dXJuIEJvb2xlYW4oY2hhbmdlZFByb3BzKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGNhbGxlZCB3aGVuIGFueSBwcm9wZXJ0aWVzIHdpdGggYWNjZXNzb3JzIGNyZWF0ZWQgdmlhCiAgICAgICAgICogYF9jcmVhdGVQcm9wZXJ0eUFjY2Vzc29yYCBoYXZlIGJlZW4gc2V0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50UHJvcHMgQmFnIG9mIGFsbCBjdXJyZW50IGFjY2Vzc29yIHZhbHVlcwogICAgICAgICAqIEBwYXJhbSB7P09iamVjdH0gY2hhbmdlZFByb3BzIEJhZyBvZiBwcm9wZXJ0aWVzIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QKICAgICAgICAgKiAgIGNhbGwgdG8gYF9wcm9wZXJ0aWVzQ2hhbmdlZGAKICAgICAgICAgKiBAcGFyYW0gez9PYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIGluIGBjaGFuZ2VkUHJvcHNgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX3Byb3BlcnRpZXNDaGFuZ2VkKGN1cnJlbnRQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBNZXRob2QgY2FsbGVkIHRvIGRldGVybWluZSB3aGV0aGVyIGEgcHJvcGVydHkgdmFsdWUgc2hvdWxkIGJlCiAgICAgICAgICogY29uc2lkZXJlZCBhcyBhIGNoYW5nZSBhbmQgY2F1c2UgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrCiAgICAgICAgICogdG8gYmUgZW5xdWV1ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGB0cnVlYCBpZiBhIHN0cmljdCBlcXVhbGl0eQogICAgICAgICAqIGNoZWNrIGZhaWxzLiBUaGUgbWV0aG9kIGFsd2F5cyByZXR1cm5zIGZhbHNlIGZvciBgTmFOYC4KICAgICAgICAgKgogICAgICAgICAqIE92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGUuZy4gcHJvdmlkZSBzdHJpY3RlciBjaGVja2luZyBmb3IKICAgICAgICAgKiBPYmplY3RzL0FycmF5cyB3aGVuIHVzaW5nIGltbXV0YWJsZSBwYXR0ZXJucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAgICogICBhbmQgZW5xdWV1ZSBhIGBfcHJvZXBydGllc0NoYW5nZWRgIGNhbGxiYWNrCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgLy8gU3RyaWN0IGVxdWFsaXR5IGNoZWNrCiAgICAgICAgICAgIChvbGQgIT09IHZhbHVlICYmCiAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIChvbGQ9PU5hTiwgdmFsdWU9PU5hTikgYWx3YXlzIHJldHVybnMgZmFsc2UKICAgICAgICAgICAgICAob2xkID09PSBvbGQgfHwgdmFsdWUgPT09IHZhbHVlKSkKICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRzIG5hdGl2ZSBDdXN0b20gRWxlbWVudHMgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AgdG8KICAgICAgICAgKiBzZXQgYW4gYXR0cmlidXRlIHZhbHVlIHRvIGEgcHJvcGVydHkgdmlhIGBfYXR0cmlidXRlVG9Qcm9wZXJ0eWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGF0dHJpYnV0ZSB0aGF0IGNoYW5nZWQKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG9sZCBPbGQgYXR0cmlidXRlIHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBOZXcgYXR0cmlidXRlIHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lc3BhY2UgQXR0cmlidXRlIG5hbWVzcGFjZS4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IFN1cGVyIG1heSBvciBtYXkgbm90IGltcGxlbWVudCB0aGUgY2FsbGJhY2sKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgICBpZiAob2xkICE9PSB2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9hdHRyaWJ1dGVUb1Byb3BlcnR5KG5hbWUsIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdXBlci5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2spIHsKICAgICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBEZXNlcmlhbGl6ZXMgYW4gYXR0cmlidXRlIHRvIGl0cyBhc3NvY2lhdGVkIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2FsbHMgdGhlIGBfZGVzZXJpYWxpemVWYWx1ZWAgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHN0cmluZyB0bwogICAgICAgICAqIGEgdHlwZWQgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIE5hbWUgb2YgYXR0cmlidXRlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcGFyYW0geyo9fSB0eXBlIHR5cGUgdG8gZGVzZXJpYWxpemUgdG8sIGRlZmF1bHRzIHRvIHRoZSB2YWx1ZQogICAgICAgICAqIHJldHVybmVkIGZyb20gYHR5cGVGb3JQcm9wZXJ0eWAKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9hdHRyaWJ1dGVUb1Byb3BlcnR5KGF0dHJpYnV0ZSwgdmFsdWUsIHR5cGUpIHsKICAgICAgICAgIGlmICghdGhpcy5fX3NlcmlhbGl6aW5nKSB7CiAgICAgICAgICAgIGNvbnN0IG1hcCA9IHRoaXMuX19kYXRhQXR0cmlidXRlczsKICAgICAgICAgICAgY29uc3QgcHJvcGVydHkgPSBtYXAgJiYgbWFwW2F0dHJpYnV0ZV0gfHwgYXR0cmlidXRlOwogICAgICAgICAgICB0aGlzW3Byb3BlcnR5XSA9IHRoaXMuX2Rlc2VyaWFsaXplVmFsdWUodmFsdWUsIHR5cGUgfHwKICAgICAgICAgICAgICB0aGlzLmNvbnN0cnVjdG9yLnR5cGVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2VyaWFsaXplcyBhIHByb3BlcnR5IHRvIGl0cyBhc3NvY2lhdGVkIGF0dHJpYnV0ZS4KICAgICAgICAgKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGFuIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZSB0byByZWZsZWN0LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYXR0cmlidXRlIEF0dHJpYnV0ZSBuYW1lIHRvIHJlZmxlY3QgdG8uCiAgICAgICAgICogQHBhcmFtIHsqPX0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gcmVmZWN0LgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX3Byb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICAgIHRoaXMuX19zZXJpYWxpemluZyA9IHRydWU7CiAgICAgICAgICB2YWx1ZSA9IChhcmd1bWVudHMubGVuZ3RoIDwgMykgPyB0aGlzW3Byb3BlcnR5XSA6IHZhbHVlOwogICAgICAgICAgdGhpcy5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLCB2YWx1ZSwKICAgICAgICAgICAgYXR0cmlidXRlIHx8IHRoaXMuY29uc3RydWN0b3IuYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSk7CiAgICAgICAgICB0aGlzLl9fc2VyaWFsaXppbmcgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYSB0eXBlZCB2YWx1ZSB0byBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBhIG5vZGUuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBjYWxscyB0aGUgYF9zZXJpYWxpemVWYWx1ZWAgbWV0aG9kIHRvIGNvbnZlcnQgdGhlIHR5cGVkCiAgICAgICAgICogdmFsdWUgdG8gYSBzdHJpbmcuICBJZiB0aGUgYF9zZXJpYWxpemVWYWx1ZWAgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAsCiAgICAgICAgICogdGhlIGF0dHJpYnV0ZSB3aWxsIGJlIHJlbW92ZWQgKHRoaXMgaXMgdGhlIGRlZmF1bHQgZm9yIGJvb2xlYW4KICAgICAgICAgKiB0eXBlIGBmYWxzZWApLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIEVsZW1lbnQgdG8gc2V0IGF0dHJpYnV0ZSB0by4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIEF0dHJpYnV0ZSBuYW1lIHRvIHNlcmlhbGl6ZSB0by4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF92YWx1ZVRvTm9kZUF0dHJpYnV0ZShub2RlLCB2YWx1ZSwgYXR0cmlidXRlKSB7CiAgICAgICAgICBjb25zdCBzdHIgPSB0aGlzLl9zZXJpYWxpemVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICBpZiAoYXR0cmlidXRlID09PSAnY2xhc3MnIHx8IGF0dHJpYnV0ZSA9PT0gJ25hbWUnIHx8IGF0dHJpYnV0ZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgIG5vZGUgPSAvKiogQHR5cGUgez9FbGVtZW50fSAqLyh3cmFwKG5vZGUpKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdHIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShhdHRyaWJ1dGUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoYXR0cmlidXRlLCBzdHIpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlIHRvIGEgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIHdoZW4gc2V0dGluZyBKUyBwcm9wZXJ0eSB2YWx1ZXMgdG8KICAgICAgICAgKiBIVE1MIGF0dHJpYnV0ZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQogICAgICAgICAqIHNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSB0eXBlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgUHJvcGVydHkgdmFsdWUgdG8gc2VyaWFsaXplLgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZyB8IHVuZGVmaW5lZH0gU3RyaW5nIHNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQKICAgICAgICAgKiBwcm9wZXJ0eSAgdmFsdWUuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB2YWx1ZSkgewogICAgICAgICAgICBjYXNlICdib29sZWFuJzoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPyAnJyA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlLnRvU3RyaW5nKCkgOiB1bmRlZmluZWQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhIHN0cmluZyB0byBhIHR5cGVkIEphdmFTY3JpcHQgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiByZWFkaW5nIEhUTUwgYXR0cmlidXRlIHZhbHVlcyB0bwogICAgICAgICAqIEpTIHByb3BlcnRpZXMuICBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZQogICAgICAgICAqIGRlc2VyaWFsaXphdGlvbiBmb3IgY3VzdG9tIGB0eXBlYHMuIFR5cGVzIGZvciBgQm9vbGVhbmAsIGBTdHJpbmdgLAogICAgICAgICAqIGFuZCBgTnVtYmVyYCBjb252ZXJ0IGF0dHJpYnV0ZXMgdG8gdGhlIGV4cGVjdGVkIHR5cGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBWYWx1ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0geyo9fSB0eXBlIFR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHN0cmluZyB0by4KICAgICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBCb29sZWFuOgogICAgICAgICAgICAgIHJldHVybiAodmFsdWUgIT09IG51bGwpOwogICAgICAgICAgICBjYXNlIE51bWJlcjoKICAgICAgICAgICAgICByZXR1cm4gTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuIFByb3BlcnRpZXNDaGFuZ2VkOwogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvLyBTYXZlIG1hcCBvZiBuYXRpdmUgcHJvcGVydGllczsgdGhpcyBmb3JtcyBhIGJsYWNrbGlzdCBvciBwcm9wZXJ0aWVzCiAgICAvLyB0aGF0IHdvbid0IGhhdmUgdGhlaXIgdmFsdWVzICJzYXZlZCIgYnkgYHNhdmVBY2Nlc3NvclZhbHVlYCwgc2luY2UKICAgIC8vIHJlYWRpbmcgZnJvbSBhbiBIVE1MRWxlbWVudCBhY2Nlc3NvciBmcm9tIHRoZSBjb250ZXh0IG9mIGEgcHJvdG90eXBlIHRocm93cwogICAgY29uc3QgbmF0aXZlUHJvcGVydGllcyA9IHt9OwogICAgbGV0IHByb3RvID0gSFRNTEVsZW1lbnQucHJvdG90eXBlOwogICAgd2hpbGUgKHByb3RvKSB7CiAgICAgIGxldCBwcm9wcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHByb3RvKTsKICAgICAgZm9yIChsZXQgaT0wOyBpPHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgbmF0aXZlUHJvcGVydGllc1twcm9wc1tpXV0gPSB0cnVlOwogICAgICB9CiAgICAgIHByb3RvID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHByb3RvKTsKICAgIH0KCiAgICAvKioKICAgICAqIFVzZWQgdG8gc2F2ZSB0aGUgdmFsdWUgb2YgYSBwcm9wZXJ0eSB0aGF0IHdpbGwgYmUgb3ZlcnJpZGRlbiB3aXRoCiAgICAgKiBhbiBhY2Nlc3Nvci4gSWYgdGhlIGBtb2RlbGAgaXMgYSBwcm90b3R5cGUsIHRoZSB2YWx1ZXMgd2lsbCBiZSBzYXZlZAogICAgICogaW4gYF9fZGF0YVByb3RvYCwgYW5kIGl0J3MgdXAgdG8gdGhlIHVzZXIgKG9yIGRvd25zdHJlYW0gbWl4aW4pIHRvCiAgICAgKiBkZWNpZGUgaG93L3doZW4gdG8gc2V0IHRoZXNlIHZhbHVlcyBiYWNrIGludG8gdGhlIGFjY2Vzc29ycy4KICAgICAqIElmIGBtb2RlbGAgaXMgYWxyZWFkeSBhbiBpbnN0YW5jZSAoaXQgaGFzIGEgYF9fZGF0YWAgcHJvcGVydHkpLCB0aGVuCiAgICAgKiB0aGUgdmFsdWUgd2lsbCBiZSBzZXQgYXMgYSBwZW5kaW5nIHByb3BlcnR5LCBtZWFuaW5nIHRoZSB1c2VyIHNob3VsZAogICAgICogY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AgdG8gdGFrZSBlZmZlY3QKICAgICAqCiAgICAgKiBAcGFyYW0ge09iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNhdmVBY2Nlc3NvclZhbHVlKG1vZGVsLCBwcm9wZXJ0eSkgewogICAgICAvLyBEb24ndCByZWFkL3N0b3JlIHZhbHVlIGZvciBhbnkgbmF0aXZlIHByb3BlcnRpZXMgc2luY2UgdGhleSBjb3VsZCB0aHJvdwogICAgICBpZiAoIW5hdGl2ZVByb3BlcnRpZXNbcHJvcGVydHldKSB7CiAgICAgICAgbGV0IHZhbHVlID0gbW9kZWxbcHJvcGVydHldOwogICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpZiAobW9kZWwuX19kYXRhKSB7CiAgICAgICAgICAgIC8vIEFkZGluZyBhY2Nlc3NvciB0byBpbnN0YW5jZTsgdXBkYXRlIHRoZSBwcm9wZXJ0eQogICAgICAgICAgICAvLyBJdCBpcyB0aGUgdXNlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhbGwgX2ZsdXNoUHJvcGVydGllcwogICAgICAgICAgICBtb2RlbC5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBBZGRpbmcgYWNjZXNzb3IgdG8gcHJvdG87IHNhdmUgcHJvdG8ncyB2YWx1ZSBmb3IgaW5zdGFuY2UtdGltZSB1c2UKICAgICAgICAgICAgaWYgKCFtb2RlbC5fX2RhdGFQcm90bykgewogICAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0ge307CiAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1vZGVsLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19fZGF0YVByb3RvJywgbW9kZWwpKSkgewogICAgICAgICAgICAgIG1vZGVsLl9fZGF0YVByb3RvID0gT2JqZWN0LmNyZWF0ZShtb2RlbC5fX2RhdGFQcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbW9kZWwuX19kYXRhUHJvdG9bcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgbWV0YS1wcm9ncmFtbWluZyBmb3IgY3JlYXRpbmcgb25lCiAgICAgKiBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycyAoZ2V0dGVyL3NldHRlciBwYWlyKSB0aGF0IGVucXVldWUgYW4gYXN5bmMKICAgICAqIChiYXRjaGVkKSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBjYWxsYmFjay4KICAgICAqCiAgICAgKiBGb3IgYmFzaWMgdXNhZ2Ugb2YgdGhpcyBtaXhpbjoKICAgICAqCiAgICAgKiAtICAgRGVjbGFyZSBhdHRyaWJ1dGVzIHRvIG9ic2VydmUgdmlhIHRoZSBzdGFuZGFyZCBgc3RhdGljIGdldAogICAgICogICAgIG9ic2VydmVkQXR0cmlidXRlcygpYC4gVXNlIGBkYXNoLWNhc2VgIGF0dHJpYnV0ZSBuYW1lcyB0byByZXByZXNlbnQKICAgICAqICAgICBgY2FtZWxDYXNlYCBwcm9wZXJ0eSBuYW1lcy4KICAgICAqIC0gICBJbXBsZW1lbnQgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIGNhbGxiYWNrIG9uIHRoZSBjbGFzcy4KICAgICAqIC0gICBDYWxsIGBNeUNsYXNzLmNyZWF0ZVByb3BlcnRpZXNGb3JBdHRyaWJ1dGVzKClgICoqb25jZSoqIG9uIHRoZSBjbGFzcyB0bwogICAgICogICAgIGdlbmVyYXRlIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgZWFjaCBvYnNlcnZlZCBhdHRyaWJ1dGUuIFRoaXMgbXVzdCBiZQogICAgICogICAgIGNhbGxlZCBiZWZvcmUgdGhlIGZpcnN0IGluc3RhbmNlIGlzIGNyZWF0ZWQsIGZvciBleGFtcGxlLCBieSBjYWxsaW5nIGl0CiAgICAgKiAgICAgYmVmb3JlIGNhbGxpbmcgYGN1c3RvbUVsZW1lbnRzLmRlZmluZWAuIEl0IGNhbiBhbHNvIGJlIGNhbGxlZCBsYXppbHkgZnJvbQogICAgICogICAgIHRoZSBlbGVtZW50J3MgYGNvbnN0cnVjdG9yYCwgYXMgbG9uZyBhcyBpdCdzIGd1YXJkZWQgc28gdGhhdCB0aGUgY2FsbCBpcwogICAgICogICAgIG9ubHkgbWFkZSBvbmNlLCB3aGVuIHRoZSBmaXJzdCBpbnN0YW5jZSBpcyBjcmVhdGVkLgogICAgICogLSAgIENhbGwgYHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKWAgaW4gdGhlIGVsZW1lbnQncyBgY29ubmVjdGVkQ2FsbGJhY2tgIHRvCiAgICAgKiAgICAgZW5hYmxlIHRoZSBhY2Nlc3NvcnMuCiAgICAgKgogICAgICogQW55IGBvYnNlcnZlZEF0dHJpYnV0ZXNgIHdpbGwgYXV0b21hdGljYWxseSBiZQogICAgICogZGVzZXJpYWxpemVkIHZpYSBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCBhbmQgc2V0IHRvIHRoZSBhc3NvY2lhdGVkCiAgICAgKiBwcm9wZXJ0eSB1c2luZyBgZGFzaC1jYXNlYC10by1gY2FtZWxDYXNlYCBjb252ZW50aW9uLgogICAgICoKICAgICAqIEBtaXhpbkZ1bmN0aW9uCiAgICAgKiBAcG9seW1lcgogICAgICogQGFwcGxpZXNNaXhpbiBQcm9wZXJ0aWVzQ2hhbmdlZAogICAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiBmb3IgcmVhY3RpbmcgdG8gcHJvcGVydHkgY2hhbmdlcyBmcm9tCiAgICAgKiAgIGdlbmVyYXRlZCBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3MgQ2xhc3MgdG8gYXBwbHkgbWl4aW4gdG8uCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3Mgd2l0aCBtaXhpbiBhcHBsaWVkLgogICAgICovCiAgICBjb25zdCBQcm9wZXJ0eUFjY2Vzc29ycyA9IGRlZHVwaW5nTWl4aW4oc3VwZXJDbGFzcyA9PiB7CgogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNDaGFuZ2VkfQogICAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICAgY29uc3QgYmFzZSA9IFByb3BlcnRpZXNDaGFuZ2VkKHN1cGVyQ2xhc3MpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAZXh0ZW5kcyB7YmFzZX0KICAgICAgICogQHVucmVzdHJpY3RlZAogICAgICAgKi8KICAgICAgY2xhc3MgUHJvcGVydHlBY2Nlc3NvcnMgZXh0ZW5kcyBiYXNlIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIHByb3BlcnR5IGFjY2Vzc29ycyBmb3IgYWxsIGF0dHJpYnV0ZXMgaW4gdGhlIHN0YW5kYXJkCiAgICAgICAgICogc3RhdGljIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQXR0cmlidXRlIG5hbWVzIGFyZSBtYXBwZWQgdG8gcHJvcGVydHkgbmFtZXMgdXNpbmcgdGhlIGBkYXNoLWNhc2VgIHRvCiAgICAgICAgICogYGNhbWVsQ2FzZWAgY29udmVudGlvbgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVQcm9wZXJ0aWVzRm9yQXR0cmlidXRlcygpIHsKICAgICAgICAgIGxldCBhJCA9ICAvKiogQHR5cGUgez99ICovICh0aGlzKS5vYnNlcnZlZEF0dHJpYnV0ZXM7CiAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBhJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUHJvcGVydHlBY2Nlc3NvcihkYXNoVG9DYW1lbENhc2UoYSRbaV0pKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gYXR0cmlidXRlIG5hbWUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICogQnkgZGVmYXVsdCwgY29udmVydHMgY2FtZWwgdG8gZGFzaCBjYXNlLCBlLmcuIGBmb29CYXJgIHRvIGBmb28tYmFyYC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgdG8gY29udmVydAogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gQXR0cmlidXRlIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXR0cmlidXRlTmFtZUZvclByb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gY2FtZWxUb0Rhc2hDYXNlKHByb3BlcnR5KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyBQcm9wZXJ0aWVzQ2hhbmdlZCBpbXBsZW1lbnRhdGlvbiB0byBpbml0aWFsaXplIHZhbHVlcyBmb3IKICAgICAgICAgKiBhY2Nlc3NvcnMgY3JlYXRlZCBmb3IgdmFsdWVzIHRoYXQgYWxyZWFkeSBleGlzdGVkIG9uIHRoZSBlbGVtZW50CiAgICAgICAgICogcHJvdG90eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKHRoaXMuX19kYXRhUHJvdG8pIHsKICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVByb3RvUHJvcGVydGllcyh0aGlzLl9fZGF0YVByb3RvKTsKICAgICAgICAgICAgdGhpcy5fX2RhdGFQcm90byA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhdCBpbnN0YW5jZSB0aW1lIHdpdGggYmFnIG9mIHByb3BlcnRpZXMgdGhhdCB3ZXJlIG92ZXJ3cml0dGVuCiAgICAgICAgICogYnkgYWNjZXNzb3JzIG9uIHRoZSBwcm90b3R5cGUgd2hlbiBhY2Nlc3NvcnMgd2VyZSBjcmVhdGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gc2V0cyB0aGVzZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUKICAgICAgICAgKiBzZXR0ZXIgYXQgaW5zdGFuY2UgdGltZS4gIFRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGFuIG92ZXJyaWRlCiAgICAgICAgICogcG9pbnQgZm9yIGN1c3RvbWl6aW5nIG9yIHByb3ZpZGluZyBtb3JlIGVmZmljaWVudCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgcHJvcGVydHkgdmFsdWVzIHRoYXQgd2VyZSBvdmVyd3JpdHRlbgogICAgICAgICAqICAgd2hlbiBjcmVhdGluZyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVQcm90b1Byb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIGZvciAobGV0IHAgaW4gcHJvcHMpIHsKICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocCwgcHJvcHNbcF0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRW5zdXJlcyB0aGUgZWxlbWVudCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4gSWYgaXQgZG9lcyBub3QsCiAgICAgICAgICogYXNzaWducyB0aGUgZ2l2ZW4gdmFsdWUgdG8gdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgKgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBDbG9zdXJlIGNhbid0IGZpZ3VyZSBvdXQgYHRoaXNgIGlzIGluZmFjdCBhbgogICAgICAgICAqICAgICBlbGVtZW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIE5hbWUgb2YgYXR0cmlidXRlIHRvIGVuc3VyZSBpcyBzZXQuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfZW5zdXJlQXR0cmlidXRlKGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICAgIGNvbnN0IGVsID0gLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpOwogICAgICAgICAgaWYgKCFlbC5oYXNBdHRyaWJ1dGUoYXR0cmlidXRlKSkgewogICAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZShlbCwgdmFsdWUsIGF0dHJpYnV0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50aW9uIHRvIHNlcmlhbGl6ZSBvYmplY3RzIGFzIEpTT04uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFByb3BlcnR5IHZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmcgfCB1bmRlZmluZWR9IFN0cmluZyBzZXJpYWxpemVkIGZyb20gdGhlIHByb3ZpZGVkIHByb3BlcnR5CiAgICAgICAgICogICAgIHZhbHVlLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9zZXJpYWxpemVWYWx1ZSh2YWx1ZSkgewogICAgICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tZmFsbHRocm91Z2ggKi8KICAgICAgICAgIHN3aXRjaCAodHlwZW9mIHZhbHVlKSB7CiAgICAgICAgICAgIGNhc2UgJ29iamVjdCc6CiAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0gY2F0Y2goeCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuX3NlcmlhbGl6ZVZhbHVlKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIHRvIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSBQb2x5bWVyIHdoZW4gcmVhZGluZyBIVE1MIGF0dHJpYnV0ZSB2YWx1ZXMgdG8KICAgICAgICAgKiBKUyBwcm9wZXJ0aWVzLiAgVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIG9uIFBvbHltZXIgZWxlbWVudAogICAgICAgICAqIHByb3RvdHlwZXMgdG8gcHJvdmlkZSBkZXNlcmlhbGl6YXRpb24gZm9yIGN1c3RvbSBgdHlwZWBzLiAgTm90ZSwKICAgICAgICAgKiB0aGUgYHR5cGVgIGFyZ3VtZW50IGlzIHRoZSB2YWx1ZSBvZiB0aGUgYHR5cGVgIGZpZWxkIHByb3ZpZGVkIGluIHRoZQogICAgICAgICAqIGBwcm9wZXJ0aWVzYCBjb25maWd1cmF0aW9uIG9iamVjdCBmb3IgYSBnaXZlbiBwcm9wZXJ0eSwgYW5kIGlzCiAgICAgICAgICogYnkgY29udmVudGlvbiB0aGUgY29uc3RydWN0b3IgZm9yIHRoZSB0eXBlIHRvIGRlc2VyaWFsaXplLgogICAgICAgICAqCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZSB0byBkZXNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0geyo9fSB0eXBlIFR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHN0cmluZyB0by4KICAgICAgICAgKiBAcmV0dXJuIHsqfSBUeXBlZCB2YWx1ZSBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUgcHJvdmlkZWQgc3RyaW5nLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0eXBlIHsqfQogICAgICAgICAgICovCiAgICAgICAgICBsZXQgb3V0VmFsdWU7CiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSBPYmplY3Q6CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgICB9IGNhdGNoKHgpIHsKICAgICAgICAgICAgICAgIC8vIGFsbG93IG5vbi1KU09OIGxpdGVyYWxzIGxpa2UgU3RyaW5ncyBhbmQgTnVtYmVycwogICAgICAgICAgICAgICAgb3V0VmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgQXJyYXk6CiAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIG91dFZhbHVlID0gSlNPTi5wYXJzZSgvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKICAgICAgICAgICAgICB9IGNhdGNoKHgpIHsKICAgICAgICAgICAgICAgIG91dFZhbHVlID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUG9seW1lcjo6QXR0cmlidXRlczogY291bGRuJ3QgZGVjb2RlIEFycmF5IGFzIEpTT046ICR7dmFsdWV9YCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIERhdGU6CiAgICAgICAgICAgICAgb3V0VmFsdWUgPSBpc05hTih2YWx1ZSkgPyBTdHJpbmcodmFsdWUpIDogTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IG5ldyBEYXRlKG91dFZhbHVlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICBvdXRWYWx1ZSA9IHN1cGVyLl9kZXNlcmlhbGl6ZVZhbHVlKHZhbHVlLCB0eXBlKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvdXRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgLyogZXNsaW50LWVuYWJsZSBuby1mYWxsdGhyb3VnaCAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgUHJvcGVydGllc0NoYW5nZWQgaW1wbGVtZW50YXRpb24gdG8gc2F2ZSBleGlzdGluZyBwcm90b3R5cGUKICAgICAgICAgKiBwcm9wZXJ0eSB2YWx1ZSBzbyB0aGF0IGl0IGNhbiBiZSByZXNldC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSByZWFkT25seSBXaGVuIHRydWUsIG5vIHNldHRlciBpcyBjcmVhdGVkCiAgICAgICAgICoKICAgICAgICAgKiBXaGVuIGNhbGxpbmcgb24gYSBwcm90b3R5cGUsIGFueSBvdmVyd3JpdHRlbiB2YWx1ZXMgYXJlIHNhdmVkIGluCiAgICAgICAgICogYF9fZGF0YVByb3RvYCwgYW5kIGl0IGlzIHVwIHRvIHRoZSBzdWJjbGFzc2VyIHRvIGRlY2lkZSBob3cvd2hlbgogICAgICAgICAqIHRvIHNldCB0aG9zZSBwcm9wZXJ0aWVzIGJhY2sgaW50byB0aGUgYWNjZXNzb3IuICBXaGVuIGNhbGxpbmcgb24gYW4KICAgICAgICAgKiBpbnN0YW5jZSwgdGhlIG92ZXJ3cml0dGVuIHZhbHVlIGlzIHNldCB2aWEgYF9zZXRQZW5kaW5nUHJvcGVydHlgLAogICAgICAgICAqIGFuZCB0aGUgdXNlciBzaG91bGQgY2FsbCBgX2ludmFsaWRhdGVQcm9wZXJ0aWVzYCBvciBgX2ZsdXNoUHJvcGVydGllc2AKICAgICAgICAgKiBmb3IgdGhlIHZhbHVlcyB0byB0YWtlIGVmZmVjdC4KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfZGVmaW5lUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgcmVhZE9ubHkpIHsKICAgICAgICAgIHNhdmVBY2Nlc3NvclZhbHVlKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICAgIHN1cGVyLl9kZWZpbmVQcm9wZXJ0eUFjY2Vzc29yKHByb3BlcnR5LCByZWFkT25seSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBsaWJyYXJ5IGNyZWF0ZWQgYW4gYWNjZXNzb3IgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBhY2Nlc3NvciB3YXMgY3JlYXRlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9oYXNBY2Nlc3Nvcihwcm9wZXJ0eSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX19kYXRhSGFzQWNjZXNzb3IgJiYgdGhpcy5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wZXJ0eV07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eSBoYXMgYSBwZW5kaW5nIGNoYW5nZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHByb3BlcnR5IGhhcyBhIHBlbmRpbmcgY2hhbmdlCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9pc1Byb3BlcnR5UGVuZGluZyhwcm9wKSB7CiAgICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLl9fZGF0YVBlbmRpbmcgJiYgKHByb3AgaW4gdGhpcy5fX2RhdGFQZW5kaW5nKSk7CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuIFByb3BlcnR5QWNjZXNzb3JzOwoKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLy8gMS54IGJhY2t3YXJkcy1jb21wYXRpYmxlIGF1dG8td3JhcHBlciBmb3IgdGVtcGxhdGUgdHlwZSBleHRlbnNpb25zCiAgICAvLyBUaGlzIGlzIGEgY2xlYXIgbGF5ZXJpbmcgdmlvbGF0aW9uIGFuZCBnaXZlcyBmYXZvcmVkLW5hdGlvbiBzdGF0dXMgdG8KICAgIC8vIGRvbS1pZiBhbmQgZG9tLXJlcGVhdCB0ZW1wbGF0ZXMuICBUaGlzIGlzIGEgY29uY2VpdCB3ZSdyZSBjaG9vc2luZyB0byBrZWVwCiAgICAvLyBhLikgdG8gZWFzZSAxLnggYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgZHVlIHRvIGxvc3Mgb2YgYGlzYCwgYW5kCiAgICAvLyBiLikgdG8gbWFpbnRhaW4gaWYvcmVwZWF0IGNhcGFiaWxpdHkgaW4gcGFyc2VyLWNvbnN0cmFpbmVkIGVsZW1lbnRzCiAgICAvLyAgICAgKGUuZy4gdGFibGUsIHNlbGVjdCkgaW4gbGlldSBvZiBuYXRpdmUgQ0UgdHlwZSBleHRlbnNpb25zIHdpdGhvdXQKICAgIC8vICAgICBtYXNzaXZlIG5ldyBpbnZlbnRpb24gaW4gdGhpcyBzcGFjZSAoZS5nLiBkaXJlY3RpdmUgc3lzdGVtKQogICAgY29uc3QgdGVtcGxhdGVFeHRlbnNpb25zID0gewogICAgICAnZG9tLWlmJzogdHJ1ZSwKICAgICAgJ2RvbS1yZXBlYXQnOiB0cnVlCiAgICB9OwoKICAgIGxldCBwbGFjZWhvbGRlckJ1Z0RldGVjdCA9IGZhbHNlOwogICAgbGV0IHBsYWNlaG9sZGVyQnVnID0gZmFsc2U7CgogICAgZnVuY3Rpb24gaGFzUGxhY2Vob2xkZXJCdWcoKSB7CiAgICAgIGlmICghcGxhY2Vob2xkZXJCdWdEZXRlY3QpIHsKICAgICAgICBwbGFjZWhvbGRlckJ1Z0RldGVjdCA9IHRydWU7CiAgICAgICAgY29uc3QgdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgICAgdC5wbGFjZWhvbGRlciA9ICdhJzsKICAgICAgICBwbGFjZWhvbGRlckJ1ZyA9IHQucGxhY2Vob2xkZXIgPT09IHQudGV4dENvbnRlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyQnVnOwogICAgfQoKICAgIC8qKgogICAgICogU29tZSBicm93c2VycyBoYXZlIGEgYnVnIHdpdGggdGV4dGFyZWEsIHdoZXJlIHBsYWNlaG9sZGVyIHRleHQgaXMgY29waWVkIGFzCiAgICAgKiBhIHRleHRub2RlIGNoaWxkIG9mIHRoZSB0ZXh0YXJlYS4KICAgICAqCiAgICAgKiBJZiB0aGUgcGxhY2Vob2xkZXIgaXMgYSBiaW5kaW5nLCB0aGlzIGNhbiBicmVhayB0ZW1wbGF0ZSBzdGFtcGluZyBpbiB0d28KICAgICAqIHdheXMuCiAgICAgKgogICAgICogT25lIGlzc3VlIGlzIHRoYXQgd2hlbiB0aGUgYHBsYWNlaG9sZGVyYCBhdHRyaWJ1dGUgaXMgcmVtb3ZlZCB3aGVuIHRoZQogICAgICogYmluZGluZyBpcyBwcm9jZXNzZWQsIHRoZSB0ZXh0bm9kZSBjaGlsZCBvZiB0aGUgdGV4dGFyZWEgaXMgZGVsZXRlZCwgYW5kIHRoZQogICAgICogdGVtcGxhdGUgaW5mbyB0cmllcyB0byBiaW5kIGludG8gdGhhdCBub2RlLgogICAgICoKICAgICAqIFdpdGggYGxlZ2FjeU9wdGltaXphdGlvbnNgIGluIHVzZSwgd2hlbiB0aGUgdGVtcGxhdGUgaXMgc3RhbXBlZCBhbmQgdGhlCiAgICAgKiBgdGV4dGFyZWEudGV4dENvbnRlbnRgIGJpbmRpbmcgaXMgcHJvY2Vzc2VkLCBubyBjb3JyZXNwb25kaW5nIG5vZGUgaXMgZm91bmQKICAgICAqIGJlY2F1c2UgaXQgd2FzIHJlbW92ZWQgZHVyaW5nIHBhcnNpbmcuIEFuIGV4Y2VwdGlvbiBpcyBnZW5lcmF0ZWQgd2hlbiB0aGlzCiAgICAgKiBiaW5kaW5nIGlzIHVwZGF0ZWQuCiAgICAgKgogICAgICogV2l0aCBgbGVnYWN5T3B0aW1pemF0aW9uc2Agbm90IGluIHVzZSwgdGhlIHRlbXBsYXRlIGlzIGNsb25lZCBiZWZvcmUKICAgICAqIHByb2Nlc3NpbmcgYW5kIHRoaXMgY2hhbmdlcyB0aGUgYWJvdmUgYmVoYXZpb3IuIFRoZSBjbG9uZWQgdGVtcGxhdGUgYWxzbyBoYXMKICAgICAqIGEgdmFsdWUgcHJvcGVydHkgc2V0IHRvIHRoZSBwbGFjZWhvbGRlciBhbmQgdGV4dENvbnRlbnQuIFRoaXMgcHJldmVudHMgdGhlCiAgICAgKiByZW1vdmFsIG9mIHRoZSB0ZXh0Q29udGVudCB3aGVuIHRoZSBwbGFjZWhvbGRlciBhdHRyaWJ1dGUgaXMgcmVtb3ZlZC4KICAgICAqIFRoZXJlZm9yZSB0aGUgZXhjZXB0aW9uIGRvZXMgbm90IG9jY3VyLiBIb3dldmVyLCB0aGVyZSBpcyBhbiBleHRyYQogICAgICogdW5uZWNlc3NhcnkgYmluZGluZy4KICAgICAqCiAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIENoZWNrIG5vZGUgZm9yIHBsYWNlaG9sZGVyIGJ1ZwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZnVuY3Rpb24gZml4UGxhY2Vob2xkZXIobm9kZSkgewogICAgICBpZiAoaGFzUGxhY2Vob2xkZXJCdWcoKSAmJiBub2RlLmxvY2FsTmFtZSA9PT0gJ3RleHRhcmVhJyAmJiBub2RlLnBsYWNlaG9sZGVyCiAgICAgICAgICAgICYmIG5vZGUucGxhY2Vob2xkZXIgPT09IG5vZGUudGV4dENvbnRlbnQpIHsKICAgICAgICBub2RlLnRleHRDb250ZW50ID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHdyYXBUZW1wbGF0ZUV4dGVuc2lvbihub2RlKSB7CiAgICAgIGxldCBpcyA9IG5vZGUuZ2V0QXR0cmlidXRlKCdpcycpOwogICAgICBpZiAoaXMgJiYgdGVtcGxhdGVFeHRlbnNpb25zW2lzXSkgewogICAgICAgIGxldCB0ID0gbm9kZTsKICAgICAgICB0LnJlbW92ZUF0dHJpYnV0ZSgnaXMnKTsKICAgICAgICBub2RlID0gdC5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoaXMpOwogICAgICAgIHQucGFyZW50Tm9kZS5yZXBsYWNlQ2hpbGQobm9kZSwgdCk7CiAgICAgICAgbm9kZS5hcHBlbmRDaGlsZCh0KTsKICAgICAgICB3aGlsZSh0LmF0dHJpYnV0ZXMubGVuZ3RoKSB7CiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZSh0LmF0dHJpYnV0ZXNbMF0ubmFtZSwgdC5hdHRyaWJ1dGVzWzBdLnZhbHVlKTsKICAgICAgICAgIHQucmVtb3ZlQXR0cmlidXRlKHQuYXR0cmlidXRlc1swXS5uYW1lKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZFRlbXBsYXRlTm9kZShyb290LCBub2RlSW5mbykgewogICAgICAvLyByZWN1cnNpdmVseSBhc2NlbmQgdHJlZSB1bnRpbCB3ZSBoaXQgcm9vdAogICAgICBsZXQgcGFyZW50ID0gbm9kZUluZm8ucGFyZW50SW5mbyAmJiBmaW5kVGVtcGxhdGVOb2RlKHJvb3QsIG5vZGVJbmZvLnBhcmVudEluZm8pOwogICAgICAvLyB1bndpbmQgdGhlIHN0YWNrLCByZXR1cm5pbmcgdGhlIGluZGV4ZWQgbm9kZSBhdCBlYWNoIGxldmVsCiAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAvLyBub3RlOiBtYXJnaW5hbGx5IGZhc3RlciB0aGFuIGluZGV4aW5nIHZpYSBjaGlsZE5vZGVzCiAgICAgICAgLy8gKGh0dHA6Ly9qc3BlcmYuY29tL2NoaWxkbm9kZXMtbG9va3VwKQogICAgICAgIGZvciAobGV0IG49cGFyZW50LmZpcnN0Q2hpbGQsIGk9MDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBpZiAobm9kZUluZm8ucGFyZW50SW5kZXggPT09IGkrKykgewogICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH0KICAgIH0KCiAgICAvLyBjb25zdHJ1Y3QgYCRgIG1hcCAoZnJvbSBpZCBhbm5vdGF0aW9ucykKICAgIGZ1bmN0aW9uIGFwcGx5SWRUb01hcChpbnN0LCBtYXAsIG5vZGUsIG5vZGVJbmZvKSB7CiAgICAgIGlmIChub2RlSW5mby5pZCkgewogICAgICAgIG1hcFtub2RlSW5mby5pZF0gPSBub2RlOwogICAgICB9CiAgICB9CgogICAgLy8gaW5zdGFsbCBldmVudCBsaXN0ZW5lcnMgKGZyb20gZXZlbnQgYW5ub3RhdGlvbnMpCiAgICBmdW5jdGlvbiBhcHBseUV2ZW50TGlzdGVuZXIoaW5zdCwgbm9kZSwgbm9kZUluZm8pIHsKICAgICAgaWYgKG5vZGVJbmZvLmV2ZW50cyAmJiBub2RlSW5mby5ldmVudHMubGVuZ3RoKSB7CiAgICAgICAgZm9yIChsZXQgaj0wLCBlJD1ub2RlSW5mby5ldmVudHMsIGU7IChqPGUkLmxlbmd0aCkgJiYgKGU9ZSRbal0pOyBqKyspIHsKICAgICAgICAgIGluc3QuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZS5uYW1lLCBlLnZhbHVlLCBpbnN0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBwdXNoIGNvbmZpZ3VyYXRpb24gcmVmZXJlbmNlcyBhdCBjb25maWd1cmUgdGltZQogICAgZnVuY3Rpb24gYXBwbHlUZW1wbGF0ZUluZm8oaW5zdCwgbm9kZSwgbm9kZUluZm8sIHBhcmVudFRlbXBsYXRlSW5mbykgewogICAgICBpZiAobm9kZUluZm8udGVtcGxhdGVJbmZvKSB7CiAgICAgICAgLy8gR2l2ZSB0aGUgbm9kZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHRlbXBsYXRlSW5mbyBhbmQgc2V0IGl0cyBwYXJlbnQKICAgICAgICBub2RlLl90ZW1wbGF0ZUluZm8gPSBub2RlSW5mby50ZW1wbGF0ZUluZm87CiAgICAgICAgbm9kZS5fcGFyZW50VGVtcGxhdGVJbmZvID0gcGFyZW50VGVtcGxhdGVJbmZvOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm9kZUV2ZW50SGFuZGxlcihjb250ZXh0LCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgICAgLy8gdG8gZmluZCBtZXRob2RzLiBDdXJyZW50bHkgdXNlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgIGNvbnRleHQgPSBjb250ZXh0Ll9tZXRob2RIb3N0IHx8IGNvbnRleHQ7CiAgICAgIGxldCBoYW5kbGVyID0gZnVuY3Rpb24oZSkgewogICAgICAgIGlmIChjb250ZXh0W21ldGhvZE5hbWVdKSB7CiAgICAgICAgICBjb250ZXh0W21ldGhvZE5hbWVdKGUsIGUuZGV0YWlsKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc29sZS53YXJuKCdsaXN0ZW5lciBtZXRob2QgYCcgKyBtZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgICAgICB9CiAgICAgIH07CiAgICAgIHJldHVybiBoYW5kbGVyOwogICAgfQoKICAgIC8qKgogICAgICogRWxlbWVudCBtaXhpbiB0aGF0IHByb3ZpZGVzIGJhc2ljIHRlbXBsYXRlIHBhcnNpbmcgYW5kIHN0YW1waW5nLCBpbmNsdWRpbmcKICAgICAqIHRoZSBmb2xsb3dpbmcgdGVtcGxhdGUtcmVsYXRlZCBmZWF0dXJlcyBmb3Igc3RhbXBlZCB0ZW1wbGF0ZXM6CiAgICAgKgogICAgICogLSBEZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi1ldmVudG5hbWU9Imxpc3RlbmVyImApCiAgICAgKiAtIE1hcCBvZiBub2RlIGlkJ3MgdG8gc3RhbXBlZCBub2RlIGluc3RhbmNlcyAoYHRoaXMuJC5pZGApCiAgICAgKiAtIE5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50IGNhY2hpbmcvcmVtb3ZhbCBhbmQgcmUtaW5zdGFsbGF0aW9uIChwZXJmb3JtYW5jZQogICAgICogICBvcHRpbWl6YXRpb24pCiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgYmFzaWMgdGVtcGxhdGUgcGFyc2luZyBhbmQgc3RhbXBpbmcKICAgICAqLwogICAgY29uc3QgVGVtcGxhdGVTdGFtcCA9IGRlZHVwaW5nTWl4aW4oCiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpUKX0gc3VwZXJDbGFzcyBDbGFzcyB0byBhcHBseSBtaXhpbiB0by4KICAgICAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3Mgd2l0aCBtaXhpbiBhcHBsaWVkLgogICAgICAgICAqLwogICAgICAgIChzdXBlckNsYXNzKSA9PiB7CgogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfVGVtcGxhdGVTdGFtcH0KICAgICAgICovCiAgICAgIGNsYXNzIFRlbXBsYXRlU3RhbXAgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogU2NhbnMgYSB0ZW1wbGF0ZSB0byBwcm9kdWNlIHRlbXBsYXRlIG1ldGFkYXRhLgogICAgICAgICAqCiAgICAgICAgICogVGVtcGxhdGUtc3BlY2lmaWMgbWV0YWRhdGEgYXJlIHN0b3JlZCBpbiB0aGUgb2JqZWN0IHJldHVybmVkLCBhbmQgbm9kZS0KICAgICAgICAgKiBzcGVjaWZpYyBtZXRhZGF0YSBhcmUgc3RvcmVkIGluIG9iamVjdHMgaW4gaXRzIGZsYXR0ZW5lZCBgbm9kZUluZm9MaXN0YAogICAgICAgICAqIGFycmF5LiAgT25seSBub2RlcyBpbiB0aGUgdGVtcGxhdGUgdGhhdCB3ZXJlIHBhcnNlZCBhcyBub2RlcyBvZgogICAgICAgICAqIGludGVyZXN0IGNvbnRhaW4gYW4gb2JqZWN0IGluIGBub2RlSW5mb0xpc3RgLiAgRWFjaCBgbm9kZUluZm9gIG9iamVjdAogICAgICAgICAqIGNvbnRhaW5zIGFuIGBpbmRleGAgKGBjaGlsZE5vZGVzYCBpbmRleCBpbiBwYXJlbnQpIGFuZCBvcHRpb25hbGx5CiAgICAgICAgICogYHBhcmVudGAsIHdoaWNoIHBvaW50cyB0byBub2RlIGluZm8gb2YgaXRzIHBhcmVudCAoaW5jbHVkaW5nIGl0cyBpbmRleCkuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgdGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0IHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QgaGFzIHRoZSBmb2xsb3dpbmcKICAgICAgICAgKiBzdHJ1Y3R1cmUgKG1hbnkgZmllbGRzIG9wdGlvbmFsKToKICAgICAgICAgKgogICAgICAgICAqIGBgYGpzCiAgICAgICAgICogICB7CiAgICAgICAgICogICAgIC8vIEZsYXR0ZW5lZCBsaXN0IG9mIG5vZGUgbWV0YWRhdGEgKGZvciBub2RlcyB0aGF0IGdlbmVyYXRlZCBtZXRhZGF0YSkKICAgICAgICAgKiAgICAgbm9kZUluZm9MaXN0OiBbCiAgICAgICAgICogICAgICAgewogICAgICAgICAqICAgICAgICAgLy8gYGlkYCBhdHRyaWJ1dGUgZm9yIGFueSBub2RlcyB3aXRoIGlkJ3MgZm9yIGdlbmVyYXRpbmcgYCRgIG1hcAogICAgICAgICAqICAgICAgICAgaWQ6IHtzdHJpbmd9LAogICAgICAgICAqICAgICAgICAgLy8gYG9uLWV2ZW50PSJoYW5kbGVyImAgbWV0YWRhdGEKICAgICAgICAgKiAgICAgICAgIGV2ZW50czogWwogICAgICAgICAqICAgICAgICAgICB7CiAgICAgICAgICogICAgICAgICAgICAgbmFtZToge3N0cmluZ30sICAgLy8gZXZlbnQgbmFtZQogICAgICAgICAqICAgICAgICAgICAgIHZhbHVlOiB7c3RyaW5nfSwgIC8vIGhhbmRsZXIgbWV0aG9kIG5hbWUKICAgICAgICAgKiAgICAgICAgICAgfSwgLi4uCiAgICAgICAgICogICAgICAgICBdLAogICAgICAgICAqICAgICAgICAgLy8gTm90ZXMgd2hlbiB0aGUgdGVtcGxhdGUgY29udGFpbmVkIGEgYDxzbG90PmAgZm9yIHNoYWR5IERPTQogICAgICAgICAqICAgICAgICAgLy8gb3B0aW1pemF0aW9uIHB1cnBvc2VzCiAgICAgICAgICogICAgICAgICBoYXNJbnNlcnRpb25Qb2ludDoge2Jvb2xlYW59LAogICAgICAgICAqICAgICAgICAgLy8gRm9yIG5lc3RlZCBgPHRlbXBsYXRlPmBgIG5vZGVzLCBuZXN0ZWQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgKiAgICAgICAgIHRlbXBsYXRlSW5mbzoge29iamVjdH0sIC8vIG5lc3RlZCB0ZW1wbGF0ZSBtZXRhZGF0YQogICAgICAgICAqICAgICAgICAgLy8gTWV0YWRhdGEgdG8gYWxsb3cgZWZmaWNpZW50IHJldHJpZXZhbCBvZiBpbnN0YW5jZWQgbm9kZQogICAgICAgICAqICAgICAgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGlzIG1ldGFkYXRhCiAgICAgICAgICogICAgICAgICBwYXJlbnRJbmZvOiB7bnVtYmVyfSwgICAvLyByZWZlcmVuY2UgdG8gcGFyZW50IG5vZGVJbmZvPgogICAgICAgICAqICAgICAgICAgcGFyZW50SW5kZXg6IHtudW1iZXJ9LCAgLy8gaW5kZXggaW4gcGFyZW50J3MgYGNoaWxkTm9kZXNgIGNvbGxlY3Rpb24KICAgICAgICAgKiAgICAgICAgIGluZm9JbmRleDoge251bWJlcn0sICAgIC8vIGluZGV4IG9mIHRoaXMgYG5vZGVJbmZvYCBpbiBgdGVtcGxhdGVJbmZvLm5vZGVJbmZvTGlzdGAKICAgICAgICAgKiAgICAgICB9LAogICAgICAgICAqICAgICAgIC4uLgogICAgICAgICAqICAgICBdLAogICAgICAgICAqICAgICAvLyBXaGVuIHRydWUsIHRoZSB0ZW1wbGF0ZSBoYWQgdGhlIGBzdHJpcC13aGl0ZXNwYWNlYCBhdHRyaWJ1dGUKICAgICAgICAgKiAgICAgLy8gb3Igd2FzIG5lc3RlZCBpbiBhIHRlbXBsYXRlIHdpdGggdGhhdCBzZXR0aW5nCiAgICAgICAgICogICAgIHN0cmlwV2hpdGVzcGFjZToge2Jvb2xlYW59LAogICAgICAgICAqICAgICAvLyBGb3IgbmVzdGVkIHRlbXBsYXRlcywgbmVzdGVkIHRlbXBsYXRlIGNvbnRlbnQgaXMgbW92ZWQgaW50bwogICAgICAgICAqICAgICAvLyBhIGRvY3VtZW50IGZyYWdtZW50IHN0b3JlZCBoZXJlOyB0aGlzIGlzIGFuIG9wdGltaXphdGlvbiB0bwogICAgICAgICAqICAgICAvLyBhdm9pZCB0aGUgY29zdCBvZiBuZXN0ZWQgdGVtcGxhdGUgY2xvbmluZwogICAgICAgICAqICAgICBjb250ZW50OiB7RG9jdW1lbnRGcmFnbWVudH0KICAgICAgICAgKiAgIH0KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGtpY2tzIG9mZiBhIHJlY3Vyc2l2ZSB0cmVld2FsayBhcyBmb2xsb3dzOgogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICogICAgX3BhcnNlVGVtcGxhdGUgPC0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgKiAgICAgIF9wYXJzZVRlbXBsYXRlQ29udGVudCAgICAgICAgICAgICAgfAogICAgICAgICAqICAgICAgICBfcGFyc2VUZW1wbGF0ZU5vZGUgIDwtLS0tLS0tLS0tLS18LS0rCiAgICAgICAgICogICAgICAgICAgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZSAtLSsgIHwKICAgICAgICAgKiAgICAgICAgICBfcGFyc2VUZW1wbGF0ZUNoaWxkTm9kZXMgLS0tLS0tLS0tKwogICAgICAgICAqICAgICAgICAgIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZXMKICAgICAgICAgKiAgICAgICAgICAgIF9wYXJzZVRlbXBsYXRlTm9kZUF0dHJpYnV0ZQogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBUaGVzZSBtZXRob2RzIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbWV0YWRhdGEgYWJvdXQgdGVtcGxhdGVzCiAgICAgICAgICogdG8gZWl0aGVyIGB0ZW1wbGF0ZUluZm9gIG9yIGBub2RlSW5mb2AuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2QgbWF5IGJlIGRlc3RydWN0aXZlIHRvIHRoZSB0ZW1wbGF0ZSwgaW4gdGhhdAogICAgICAgICAqIGUuZy4gZXZlbnQgYW5ub3RhdGlvbnMgbWF5IGJlIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gdGhlCiAgICAgICAgICogdGVtcGxhdGUgbWV0YWRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwYXJzZQogICAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvPX0gb3V0ZXJUZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZnJvbSB0aGUgb3V0ZXIKICAgICAgICAgKiAgIHRlbXBsYXRlLCBmb3IgcGFyc2luZyBuZXN0ZWQgdGVtcGxhdGVzCiAgICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gUGFyc2VkIHRlbXBsYXRlIG1ldGFkYXRhCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUsIG91dGVyVGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICAvLyBzaW5jZSBhIHRlbXBsYXRlIG1heSBiZSByZS11c2VkLCBtZW1vLWl6ZSBtZXRhZGF0YQogICAgICAgICAgaWYgKCF0ZW1wbGF0ZS5fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICAgIC8vIFRPRE8ocmljdGljKTogZml4IHR5cGluZwogICAgICAgICAgICBsZXQgLyoqID8gKi8gdGVtcGxhdGVJbmZvID0gdGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA9IHt9OwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ubm9kZUluZm9MaXN0ID0gW107CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXN0ZWRUZW1wbGF0ZSA9IEJvb2xlYW4ob3V0ZXJUZW1wbGF0ZUluZm8pOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlID0KICAgICAgICAgICAgICAob3V0ZXJUZW1wbGF0ZUluZm8gJiYgb3V0ZXJUZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlKSB8fAogICAgICAgICAgICAgIHRlbXBsYXRlLmhhc0F0dHJpYnV0ZSgnc3RyaXAtd2hpdGVzcGFjZScpOwogICAgICAgICAgICAgLy8gVE9ETyhyaWN0aWMpOiBmaXggdHlwaW5nCiAgICAgICAgICAgICB0aGlzLl9wYXJzZVRlbXBsYXRlQ29udGVudCgKICAgICAgICAgICAgICAgICB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCAvKiogQHR5cGUgez99ICovICh7cGFyZW50OiBudWxsfSkpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRlbXBsYXRlLl90ZW1wbGF0ZUluZm87CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZWUgZG9jcyBmb3IgX3BhcnNlVGVtcGxhdGVOb2RlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgLgogICAgICAgICAqIEBwYXJhbSB7IVRlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIC4KICAgICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gLgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC4KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJzZVRlbXBsYXRlTm9kZSh0ZW1wbGF0ZS5jb250ZW50LCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBub2RlIGFuZCBhZGRzIHRlbXBsYXRlIGFuZCBub2RlIG1ldGFkYXRhIGJhc2VkIG9uCiAgICAgICAgICogdGhlIGN1cnJlbnQgbm9kZSwgYW5kIGl0cyBgY2hpbGROb2Rlc2AgYW5kIGBhdHRyaWJ1dGVzYC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGFkZCBjdXN0b20gbm9kZSBvciB0ZW1wbGF0ZSBzcGVjaWZpYwogICAgICAgICAqIG1ldGFkYXRhIGJhc2VkIG9uIHRoaXMgbm9kZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAgICogQHBhcmFtIHshVGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQgdGVtcGxhdGUKICAgICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICAgIGxldCBub3RlZCA9IGZhbHNlOwogICAgICAgICAgbGV0IGVsZW1lbnQgPSAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyAobm9kZSk7CiAgICAgICAgICBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT0gJ3RlbXBsYXRlJyAmJiAhZWxlbWVudC5oYXNBdHRyaWJ1dGUoJ3ByZXNlcnZlLWNvbnRlbnQnKSkgewogICAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShlbGVtZW50LCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB8fCBub3RlZDsKICAgICAgICAgIH0gZWxzZSBpZiAoZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgICAvLyBGb3IgU2hhZHlEb20gb3B0aW1pemF0aW9uLCBpbmRpY2F0aW5nIHRoZXJlIGlzIGFuIGluc2VydGlvbiBwb2ludAogICAgICAgICAgICB0ZW1wbGF0ZUluZm8uaGFzSW5zZXJ0aW9uUG9pbnQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgZml4UGxhY2Vob2xkZXIoZWxlbWVudCk7CiAgICAgICAgICBpZiAoZWxlbWVudC5maXJzdENoaWxkKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcnNlVGVtcGxhdGVDaGlsZE5vZGVzKGVsZW1lbnQsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlcyAmJiBlbGVtZW50Lmhhc0F0dHJpYnV0ZXMoKSkgewogICAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhlbGVtZW50LCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB8fCBub3RlZDsKICAgICAgICAgIH0KICAgICAgICAgIC8vIENoZWNraW5nIGBub2RlSW5mby5ub3RlZGAgYWxsb3dzIGEgY2hpbGQgbm9kZSBvZiB0aGlzIG5vZGUgKHdobyBnZXRzCiAgICAgICAgICAvLyBhY2Nlc3MgdG8gYHBhcmVudEluZm9gKSB0byBjYXVzZSB0aGUgcGFyZW50IHRvIGJlIG5vdGVkLCB3aGljaAogICAgICAgICAgLy8gb3RoZXJ3aXNlIGhhcyBubyByZXR1cm4gcGF0aCB2aWEgYF9wYXJzZVRlbXBsYXRlQ2hpbGROb2Rlc2AgKHVzZWQgYnkKICAgICAgICAgIC8vIHNvbWUgb3B0aW1pemF0aW9ucykKICAgICAgICAgIHJldHVybiBub3RlZCB8fCBub2RlSW5mby5ub3RlZDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjaGlsZCBub2RlcyBmb3IgdGhlIGdpdmVuIHJvb3Qgbm9kZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGFsc28gd3JhcHMgd2hpdGVsaXN0ZWQgbGVnYWN5IHRlbXBsYXRlIGV4dGVuc2lvbnMKICAgICAgICAgKiAoYGlzPSJkb20taWYiYCBhbmQgYGlzPSJkb20tcmVwZWF0ImApIHdpdGggdGhlaXIgZXF1aXZhbGVudCBlbGVtZW50CiAgICAgICAgICogd3JhcHBlcnMsIGNvbGxhcHNlcyB0ZXh0IG5vZGVzLCBhbmQgc3RyaXBzIHdoaXRlc3BhY2UgZnJvbSB0aGUgdGVtcGxhdGUKICAgICAgICAgKiBpZiB0aGUgYHRlbXBsYXRlSW5mby5zdHJpcFdoaXRlc3BhY2VgIHNldHRpbmcgd2FzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOb2RlfSByb290IFJvb3Qgbm9kZSB3aG9zZSBgY2hpbGROb2Rlc2Agd2lsbCBiZSBwYXJzZWQKICAgICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7IU5vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9wYXJzZVRlbXBsYXRlQ2hpbGROb2Rlcyhyb290LCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgICBpZiAocm9vdC5sb2NhbE5hbWUgPT09ICdzY3JpcHQnIHx8IHJvb3QubG9jYWxOYW1lID09PSAnc3R5bGUnKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIGZvciAobGV0IG5vZGU9cm9vdC5maXJzdENoaWxkLCBwYXJlbnRJbmRleD0wLCBuZXh0OyBub2RlOyBub2RlPW5leHQpIHsKICAgICAgICAgICAgLy8gV3JhcCB0ZW1wbGF0ZXMKICAgICAgICAgICAgaWYgKG5vZGUubG9jYWxOYW1lID09ICd0ZW1wbGF0ZScpIHsKICAgICAgICAgICAgICBub2RlID0gd3JhcFRlbXBsYXRlRXh0ZW5zaW9uKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGNvbGxhcHNlIGFkamFjZW50IHRleHROb2RlczogZml4ZXMgYW4gSUUgaXNzdWUgdGhhdCBjYW4gY2F1c2UKICAgICAgICAgICAgLy8gdGV4dCBub2RlcyB0byBiZSBpbmV4cGxpY2FibHkgc3BsaXQgPSgKICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHJvb3Qubm9ybWFsaXplKCkgc2hvdWxkIHdvcmsgYnV0IGRvZXMgbm90IHNvIHdlIGRvIHRoaXMKICAgICAgICAgICAgLy8gbWFudWFsbHkuCiAgICAgICAgICAgIG5leHQgPSBub2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgICAgICBsZXQgLyoqIE5vZGUgKi8gbiA9IG5leHQ7CiAgICAgICAgICAgICAgd2hpbGUgKG4gJiYgKG4ubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSkgewogICAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCArPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgICAgbmV4dCA9IG4ubmV4dFNpYmxpbmc7CiAgICAgICAgICAgICAgICByb290LnJlbW92ZUNoaWxkKG4pOwogICAgICAgICAgICAgICAgbiA9IG5leHQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIG9wdGlvbmFsbHkgc3RyaXAgd2hpdGVzcGFjZQogICAgICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8uc3RyaXBXaGl0ZVNwYWNlICYmICFub2RlLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgICAgcm9vdC5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgY2hpbGRJbmZvID0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7IU5vZGVJbmZvfSAqLyAoe3BhcmVudEluZGV4LCBwYXJlbnRJbmZvOiBub2RlSW5mb30pOwogICAgICAgICAgICBpZiAodGhpcy5fcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBjaGlsZEluZm8pKSB7CiAgICAgICAgICAgICAgY2hpbGRJbmZvLmluZm9JbmRleCA9IHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3QucHVzaChjaGlsZEluZm8pIC0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbmNyZW1lbnQgaWYgbm90IHJlbW92ZWQKICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgIHBhcmVudEluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBhcnNlcyB0ZW1wbGF0ZSBjb250ZW50IGZvciB0aGUgZ2l2ZW4gbmVzdGVkIGA8dGVtcGxhdGU+YC4KICAgICAgICAgKgogICAgICAgICAqIE5lc3RlZCB0ZW1wbGF0ZSBpbmZvIGlzIHN0b3JlZCBhcyBgdGVtcGxhdGVJbmZvYCBpbiB0aGUgY3VycmVudCBub2RlJ3MKICAgICAgICAgKiBgbm9kZUluZm9gLiBgdGVtcGxhdGUuY29udGVudGAgaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIGB0ZW1wbGF0ZUluZm9gLgogICAgICAgICAqIEl0IHdpbGwgdGhlbiBiZSB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGhvc3QgdG8gc2V0IGl0IGJhY2sgdG8gdGhlCiAgICAgICAgICogdGVtcGxhdGUgYW5kIGZvciB1c2VycyBzdGFtcGluZyBuZXN0ZWQgdGVtcGxhdGVzIHRvIHVzZSB0aGUKICAgICAgICAgKiBgX2NvbnRlbnRGb3JUZW1wbGF0ZWAgbWV0aG9kIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IGZvciB0aGlzIHRlbXBsYXRlCiAgICAgICAgICogKGFuIG9wdGltaXphdGlvbiB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIG5lc3RlZCB0ZW1wbGF0ZSBjb250ZW50KS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlIChhIDx0ZW1wbGF0ZT4pCiAgICAgICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IG91dGVyVGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAgICogICB0aGF0IGluY2x1ZGVzIHRoZSB0ZW1wbGF0ZSBgbm9kZWAKICAgICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOZXN0ZWRUZW1wbGF0ZShub2RlLCBvdXRlclRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICAgIC8vIFRPRE8ocmljdGljKTogdGhlIHR5cGUgb2Ygbm9kZSBzaG91bGQgYmUgbm9uLW51bGwKICAgICAgICAgIGxldCBlbGVtZW50ID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8gKG5vZGUpOwogICAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHRoaXMuX3BhcnNlVGVtcGxhdGUoZWxlbWVudCwgb3V0ZXJUZW1wbGF0ZUluZm8pOwogICAgICAgICAgbGV0IGNvbnRlbnQgPSB0ZW1wbGF0ZUluZm8uY29udGVudCA9CiAgICAgICAgICAgICAgZWxlbWVudC5jb250ZW50Lm93bmVyRG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICAgICAgY29udGVudC5hcHBlbmRDaGlsZChlbGVtZW50LmNvbnRlbnQpOwogICAgICAgICAgbm9kZUluZm8udGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBQYXJzZXMgdGVtcGxhdGUgbm9kZSBhdHRyaWJ1dGVzIGFuZCBhZGRzIG5vZGUgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgICAqIGZvciBub2RlcyBvZiBpbnRlcmVzdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gbm9kZSBOb2RlIHRvIHBhcnNlCiAgICAgICAgICogQHBhcmFtIHshVGVtcGxhdGVJbmZvfSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgZm9yIGN1cnJlbnQKICAgICAgICAgKiAgICAgdGVtcGxhdGUKICAgICAgICAgKiBAcGFyYW0geyFOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZS4KICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBgdHJ1ZWAgaWYgdGhlIHZpc2l0ZWQgbm9kZSBhZGRlZCBub2RlLXNwZWNpZmljCiAgICAgICAgICogICBtZXRhZGF0YSB0byBgbm9kZUluZm9gCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlcyhub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKSB7CiAgICAgICAgICAvLyBNYWtlIGNvcHkgb2Ygb3JpZ2luYWwgYXR0cmlidXRlIGxpc3QsIHNpbmNlIHRoZSBvcmRlciBtYXkgY2hhbmdlCiAgICAgICAgICAvLyBhcyBhdHRyaWJ1dGVzIGFyZSBhZGRlZCBhbmQgcmVtb3ZlZAogICAgICAgICAgbGV0IG5vdGVkID0gZmFsc2U7CiAgICAgICAgICBsZXQgYXR0cnMgPSBBcnJheS5mcm9tKG5vZGUuYXR0cmlidXRlcyk7CiAgICAgICAgICBmb3IgKGxldCBpPWF0dHJzLmxlbmd0aC0xLCBhOyAoYT1hdHRyc1tpXSk7IGktLSkgewogICAgICAgICAgICBub3RlZCA9IHRoaXMuX3BhcnNlVGVtcGxhdGVOb2RlQXR0cmlidXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGEubmFtZSwgYS52YWx1ZSkgfHwgbm90ZWQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbm90ZWQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBQYXJzZXMgYSBzaW5nbGUgdGVtcGxhdGUgbm9kZSBhdHRyaWJ1dGUgYW5kIGFkZHMgbm9kZSBtZXRhZGF0YSB0bwogICAgICAgICAqIGBub2RlSW5mb2AgZm9yIGF0dHJpYnV0ZXMgb2YgaW50ZXJlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGFkZHMgbWV0YWRhdGEgZm9yIGBvbi1ldmVudD0iaGFuZGxlciJgIGF0dHJpYnV0ZXMKICAgICAgICAgKiBhbmQgYGlkYCBhdHRyaWJ1dGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7IU5vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIEF0dHJpYnV0ZSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIEF0dHJpYnV0ZSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IGB0cnVlYCBpZiB0aGUgdmlzaXRlZCBub2RlIGFkZGVkIG5vZGUtc3BlY2lmaWMKICAgICAgICAgKiAgIG1ldGFkYXRhIHRvIGBub2RlSW5mb2AKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICAgIC8vIGV2ZW50cyAob24tKikKICAgICAgICAgIGlmIChuYW1lLnNsaWNlKDAsIDMpID09PSAnb24tJykgewogICAgICAgICAgICBub2RlLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgICAgbm9kZUluZm8uZXZlbnRzID0gbm9kZUluZm8uZXZlbnRzIHx8IFtdOwogICAgICAgICAgICBub2RlSW5mby5ldmVudHMucHVzaCh7CiAgICAgICAgICAgICAgbmFtZTogbmFtZS5zbGljZSgzKSwKICAgICAgICAgICAgICB2YWx1ZQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBzdGF0aWMgaWQKICAgICAgICAgIGVsc2UgaWYgKG5hbWUgPT09ICdpZCcpIHsKICAgICAgICAgICAgbm9kZUluZm8uaWQgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBgY29udGVudGAgZG9jdW1lbnQgZnJhZ21lbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgbmVzdGVkIHRlbXBsYXRlcywgUG9seW1lciBwZXJmb3JtcyBhbiBvcHRpbWl6YXRpb24gdG8gY2FjaGUgbmVzdGVkCiAgICAgICAgICogdGVtcGxhdGUgY29udGVudCB0byBhdm9pZCB0aGUgY29zdCBvZiBjbG9uaW5nIGRlZXBseSBuZXN0ZWQgdGVtcGxhdGVzLgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgY2FjaGVkIGNvbnRlbnQgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHJldHJpZXZlIGBjb250ZW50YCBmb3IKICAgICAgICAgKiBAcmV0dXJuIHtEb2N1bWVudEZyYWdtZW50fSBDb250ZW50IGZyYWdtZW50CiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX2NvbnRlbnRGb3JUZW1wbGF0ZSh0ZW1wbGF0ZSkgewogICAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudFdpdGhJbmZvfSAqLyAodGVtcGxhdGUpLl90ZW1wbGF0ZUluZm87CiAgICAgICAgICByZXR1cm4gKHRlbXBsYXRlSW5mbyAmJiB0ZW1wbGF0ZUluZm8uY29udGVudCkgfHwgdGVtcGxhdGUuY29udGVudDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENsb25lcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgY29udGVudCBhbmQgcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAgICogY29udGFpbmluZyB0aGUgY2xvbmVkIGRvbS4KICAgICAgICAgKgogICAgICAgICAqIFRoZSB0ZW1wbGF0ZSBpcyBwYXJzZWQgKG9uY2UgYW5kIG1lbW9pemVkKSB1c2luZyB0aGlzIGxpYnJhcnkncwogICAgICAgICAqIHRlbXBsYXRlIHBhcnNpbmcgZmVhdHVyZXMsIGFuZCBwcm92aWRlcyB0aGUgZm9sbG93aW5nIHZhbHVlLWFkZGVkCiAgICAgICAgICogZmVhdHVyZXM6CiAgICAgICAgICogKiBBZGRzIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycyBmb3IgYG9uLWV2ZW50PSJoYW5kbGVyImAgYXR0cmlidXRlcwogICAgICAgICAqICogR2VuZXJhdGVzIGFuICJpZCBtYXAiIGZvciBhbGwgbm9kZXMgd2l0aCBpZCdzIHVuZGVyIGAkYCBvbiByZXR1cm5lZAogICAgICAgICAqICAgZG9jdW1lbnQgZnJhZ21lbnQKICAgICAgICAgKiAqIFBhc3NlcyB0ZW1wbGF0ZSBpbmZvIGluY2x1ZGluZyBgY29udGVudGAgYmFjayB0byB0ZW1wbGF0ZXMgYXMKICAgICAgICAgKiAgIGBfdGVtcGxhdGVJbmZvYCAoYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gdG8gYXZvaWQgZGVlcCB0ZW1wbGF0ZQogICAgICAgICAqICAgY2xvbmluZykKICAgICAgICAgKgogICAgICAgICAqIE5vdGUgdGhhdCB0aGUgbWVtb2l6ZWQgdGVtcGxhdGUgcGFyc2luZyBwcm9jZXNzIGlzIGRlc3RydWN0aXZlIHRvIHRoZQogICAgICAgICAqIHRlbXBsYXRlOiBhdHRyaWJ1dGVzIGZvciBiaW5kaW5ncyBhbmQgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzIGFyZQogICAgICAgICAqIHJlbW92ZWQgYWZ0ZXIgYmVpbmcgbm90ZWQgaW4gbm90ZXMsIGFuZCBhbnkgbmVzdGVkIGA8dGVtcGxhdGU+LmNvbnRlbnRgCiAgICAgICAgICogaXMgcmVtb3ZlZCBhbmQgc3RvcmVkIGluIG5vdGVzIGFzIHdlbGwuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBzdGFtcAogICAgICAgICAqIEBwYXJhbSB7VGVtcGxhdGVJbmZvPX0gdGVtcGxhdGVJbmZvIE9wdGlvbmFsIHRlbXBsYXRlIGluZm8gYXNzb2NpYXRlZAogICAgICAgICAqICAgd2l0aCB0aGUgdGVtcGxhdGUgdG8gYmUgc3RhbXBlZDsgaWYgb21pdHRlZCB0aGUgdGVtcGxhdGUgd2lsbCBiZQogICAgICAgICAqICAgYXV0b21hdGljYWxseSBwYXJzZWQuCiAgICAgICAgICogQHJldHVybiB7IVN0YW1wZWRUZW1wbGF0ZX0gQ2xvbmVkIHRlbXBsYXRlIGNvbnRlbnQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfc3RhbXBUZW1wbGF0ZSh0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICAvLyBQb2x5ZmlsbCBzdXBwb3J0OiBib290c3RyYXAgdGhlIHRlbXBsYXRlIGlmIGl0IGhhcyBub3QgYWxyZWFkeSBiZWVuCiAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgIXRlbXBsYXRlLmNvbnRlbnQgJiYKICAgICAgICAgICAgICB3aW5kb3cuSFRNTFRlbXBsYXRlRWxlbWVudCAmJiBIVE1MVGVtcGxhdGVFbGVtZW50LmRlY29yYXRlKSB7CiAgICAgICAgICAgIEhUTUxUZW1wbGF0ZUVsZW1lbnQuZGVjb3JhdGUodGVtcGxhdGUpOwogICAgICAgICAgfQogICAgICAgICAgLy8gQWNjZXB0aW5nIHRoZSBgdGVtcGxhdGVJbmZvYCB2aWEgYW4gYXJndW1lbnQgYWxsb3dzIGZvciBjcmVhdGluZwogICAgICAgICAgLy8gaW5zdGFuY2VzIG9mIHRoZSBgdGVtcGxhdGVJbmZvYCBieSB0aGUgY2FsbGVyLCB1c2VmdWwgZm9yIGFkZGluZwogICAgICAgICAgLy8gaW5zdGFuY2UtdGltZSBpbmZvcm1hdGlvbiB0byB0aGUgcHJvdG90eXBpY2FsIGRhdGEKICAgICAgICAgIHRlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbyB8fCB0aGlzLmNvbnN0cnVjdG9yLl9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICAgIGxldCBub2RlSW5mbyA9IHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3Q7CiAgICAgICAgICBsZXQgY29udGVudCA9IHRlbXBsYXRlSW5mby5jb250ZW50IHx8IHRlbXBsYXRlLmNvbnRlbnQ7CiAgICAgICAgICBsZXQgZG9tID0gLyoqIEB0eXBlIHtEb2N1bWVudEZyYWdtZW50fSAqLyAoZG9jdW1lbnQuaW1wb3J0Tm9kZShjb250ZW50LCB0cnVlKSk7CiAgICAgICAgICAvLyBOT1RFOiBTaGFkeURvbSBvcHRpbWl6YXRpb24gaW5kaWNhdGluZyB0aGVyZSBpcyBhbiBpbnNlcnRpb24gcG9pbnQKICAgICAgICAgIGRvbS5fX25vSW5zZXJ0aW9uUG9pbnQgPSAhdGVtcGxhdGVJbmZvLmhhc0luc2VydGlvblBvaW50OwogICAgICAgICAgbGV0IG5vZGVzID0gZG9tLm5vZGVMaXN0ID0gbmV3IEFycmF5KG5vZGVJbmZvLmxlbmd0aCk7CiAgICAgICAgICBkb20uJCA9IHt9OwogICAgICAgICAgZm9yIChsZXQgaT0wLCBsPW5vZGVJbmZvLmxlbmd0aCwgaW5mbzsgKGk8bCkgJiYgKGluZm89bm9kZUluZm9baV0pOyBpKyspIHsKICAgICAgICAgICAgbGV0IG5vZGUgPSBub2Rlc1tpXSA9IGZpbmRUZW1wbGF0ZU5vZGUoZG9tLCBpbmZvKTsKICAgICAgICAgICAgYXBwbHlJZFRvTWFwKHRoaXMsIGRvbS4kLCBub2RlLCBpbmZvKTsKICAgICAgICAgICAgYXBwbHlUZW1wbGF0ZUluZm8odGhpcywgbm9kZSwgaW5mbywgdGVtcGxhdGVJbmZvKTsKICAgICAgICAgICAgYXBwbHlFdmVudExpc3RlbmVyKHRoaXMsIG5vZGUsIGluZm8pOwogICAgICAgICAgfQogICAgICAgICAgZG9tID0gLyoqIEB0eXBlIHshU3RhbXBlZFRlbXBsYXRlfSAqLyhkb20pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgICAgICByZXR1cm4gZG9tOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciBieSBtZXRob2QgbmFtZSBmb3IgdGhlIGV2ZW50IHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGEgaGFuZGxlciBmdW5jdGlvbiB0aGF0IGxvb2tzIHVwIHRoZSBtZXRob2QKICAgICAgICAgKiBuYW1lIGF0IGhhbmRsaW5nIHRpbWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gbm9kZSBOb2RlIHRvIGFkZCBsaXN0ZW5lciBvbgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE5hbWUgb2YgbWV0aG9kCiAgICAgICAgICogQHBhcmFtIHsqPX0gY29udGV4dCBDb250ZXh0IHRoZSBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24gKGRlZmF1bHRzCiAgICAgICAgICogICB0byBgbm9kZWApCiAgICAgICAgICogQHJldHVybiB7RnVuY3Rpb259IEdlbmVyYXRlZCBoYW5kbGVyIGZ1bmN0aW9uCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBtZXRob2ROYW1lLCBjb250ZXh0KSB7CiAgICAgICAgICBjb250ZXh0ID0gY29udGV4dCB8fCBub2RlOwogICAgICAgICAgbGV0IGhhbmRsZXIgPSBjcmVhdGVOb2RlRXZlbnRIYW5kbGVyKGNvbnRleHQsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSk7CiAgICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICByZXR1cm4gaGFuZGxlcjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlIHBvaW50IGZvciBhZGRpbmcgY3VzdG9tIG9yIHNpbXVsYXRlZCBldmVudCBoYW5kbGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IUV2ZW50VGFyZ2V0fSBub2RlIE5vZGUgdG8gYWRkIGV2ZW50IGxpc3RlbmVyIHRvCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IG5vZGUgTm9kZSB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXIgZnJvbQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgTmFtZSBvZiBldmVudAogICAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oIUV2ZW50KTp2b2lkfSBoYW5kbGVyIExpc3RlbmVyIGZ1bmN0aW9uIHRvIHJlbW92ZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX3JlbW92ZUV2ZW50TGlzdGVuZXJGcm9tTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiBUZW1wbGF0ZVN0YW1wOwoKICAgIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldwogICAgICogQHN1cHByZXNzIHtjaGVja1Byb3RvdHlwYWxUeXBlc30KICAgICAqIEBsaWNlbnNlIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgICAqIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kCiAgICAgKiBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5CiAgICAgKiBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5CiAgICAgKiBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQCiAgICAgKiByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAgKi8KCiAgICAvLyBNb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgdW5pcXVlIElEIHVzZWQgZm9yIGRlLWR1cGluZyBlZmZlY3RzIHRyaWdnZXJlZAogICAgLy8gZnJvbSBtdWx0aXBsZSBwcm9wZXJ0aWVzIGluIHRoZSBzYW1lIHR1cm4KICAgIGxldCBkZWR1cGVJZCQxID0gMDsKCiAgICBjb25zdCBOT09QID0gW107CgogICAgLyoqCiAgICAgKiBQcm9wZXJ0eSBlZmZlY3QgdHlwZXM7IGVmZmVjdHMgYXJlIHN0b3JlZCBvbiB0aGUgcHJvdG90eXBlIHVzaW5nIHRoZXNlIGtleXMKICAgICAqIEBlbnVtIHtzdHJpbmd9CiAgICAgKi8KICAgIGNvbnN0IFRZUEVTID0gewogICAgICBDT01QVVRFOiAnX19jb21wdXRlRWZmZWN0cycsCiAgICAgIFJFRkxFQ1Q6ICdfX3JlZmxlY3RFZmZlY3RzJywKICAgICAgTk9USUZZOiAnX19ub3RpZnlFZmZlY3RzJywKICAgICAgUFJPUEFHQVRFOiAnX19wcm9wYWdhdGVFZmZlY3RzJywKICAgICAgT0JTRVJWRTogJ19fb2JzZXJ2ZUVmZmVjdHMnLAogICAgICBSRUFEX09OTFk6ICdfX3JlYWRPbmx5JwogICAgfTsKCiAgICBjb25zdCBDT01QVVRFX0lORk8gPSAnX19jb21wdXRlSW5mbyc7CgogICAgLyoqIEBjb25zdCB7IVJlZ0V4cH0gKi8KICAgIGNvbnN0IGNhcGl0YWxBdHRyaWJ1dGVSZWdleCA9IC9bQS1aXS87CgogICAgLyoqCiAgICAgKiBFbnN1cmVzIHRoYXQgdGhlIG1vZGVsIGhhcyBhbiBvd24tcHJvcGVydHkgbWFwIG9mIGVmZmVjdHMgZm9yIHRoZSBnaXZlbiB0eXBlLgogICAgICogVGhlIG1vZGVsIG1heSBiZSBhIHByb3RvdHlwZSBvciBhbiBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBQcm9wZXJ0eSBlZmZlY3RzIGFyZSBzdG9yZWQgYXMgYXJyYXlzIG9mIGVmZmVjdHMgYnkgcHJvcGVydHkgaW4gYSBtYXAsCiAgICAgKiBieSBuYW1lZCB0eXBlIG9uIHRoZSBtb2RlbC4gZS5nLgogICAgICoKICAgICAqICAgX19jb21wdXRlRWZmZWN0czogewogICAgICogICAgIGZvbzogWyAuLi4gXSwKICAgICAqICAgICBiYXI6IFsgLi4uIF0KICAgICAqICAgfQogICAgICoKICAgICAqIElmIHRoZSBtb2RlbCBkb2VzIG5vdCB5ZXQgaGF2ZSBhbiBlZmZlY3QgbWFwIGZvciB0aGUgdHlwZSwgb25lIGlzIGNyZWF0ZWQKICAgICAqIGFuZCByZXR1cm5lZC4gIElmIGl0IGRvZXMsIGJ1dCBpdCBpcyBub3QgYW4gb3duIHByb3BlcnR5IChpLmUuIHRoZQogICAgICogcHJvdG90eXBlIGhhZCBlZmZlY3RzKSwgdGhlIHRoZSBtYXAgaXMgZGVlcGx5IGNsb25lZCBhbmQgdGhlIGNvcHkgaXMKICAgICAqIHNldCBvbiB0aGUgbW9kZWwgYW5kIHJldHVybmVkLCByZWFkeSBmb3IgbmV3IGVmZmVjdHMgdG8gYmUgYWRkZWQuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IG1vZGVsIFByb3RvdHlwZSBvciBpbnN0YW5jZQogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgUHJvcGVydHkgZWZmZWN0IHR5cGUKICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGNsb25lQXJyYXlzIENsb25lIGFueSBhcnJheXMgYXNzaWduZWQgdG8gdGhlIG1hcCB3aGVuCiAgICAgKiAgIGV4dGVuZGluZyBhIHN1cGVyY2xhc3MgbWFwIG9udG8gdGhpcyBzdWJjbGFzcwogICAgICogQHJldHVybiB7T2JqZWN0fSBUaGUgb3duLXByb3BlcnR5IG1hcCBvZiBlZmZlY3RzIGZvciB0aGUgZ2l2ZW4gdHlwZQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gZW5zdXJlT3duRWZmZWN0TWFwKG1vZGVsLCB0eXBlLCBjbG9uZUFycmF5cykgewogICAgICBsZXQgZWZmZWN0cyA9IG1vZGVsW3R5cGVdOwogICAgICBpZiAoIWVmZmVjdHMpIHsKICAgICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSB7fTsKICAgICAgfSBlbHNlIGlmICghbW9kZWwuaGFzT3duUHJvcGVydHkodHlwZSkpIHsKICAgICAgICBlZmZlY3RzID0gbW9kZWxbdHlwZV0gPSBPYmplY3QuY3JlYXRlKG1vZGVsW3R5cGVdKTsKICAgICAgICBpZiAoY2xvbmVBcnJheXMpIHsKICAgICAgICAgIGZvciAobGV0IHAgaW4gZWZmZWN0cykgewogICAgICAgICAgICBsZXQgcHJvdG9GeCA9IGVmZmVjdHNbcF07CiAgICAgICAgICAgIC8vIFBlcmYgb3B0aW1pemF0aW9uIG92ZXIgQXJyYXkuc2xpY2UKICAgICAgICAgICAgbGV0IGluc3RGeCA9IGVmZmVjdHNbcF0gPSBBcnJheShwcm90b0Z4Lmxlbmd0aCk7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxwcm90b0Z4Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgaW5zdEZ4W2ldID0gcHJvdG9GeFtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZWZmZWN0czsKICAgIH0KCiAgICAvLyAtLSBlZmZlY3RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIFJ1bnMgYWxsIGVmZmVjdHMgb2YgYSBnaXZlbiB0eXBlIGZvciB0aGUgZ2l2ZW4gc2V0IG9mIHByb3BlcnR5IGNoYW5nZXMKICAgICAqIG9uIGFuIGluc3RhbmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICAgKiBAcGFyYW0gez9PYmplY3R9IGVmZmVjdHMgT2JqZWN0IG1hcCBvZiBwcm9wZXJ0eS10by1BcnJheSBvZiBlZmZlY3RzCiAgICAgKiBAcGFyYW0gez9PYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgICAqIEBwYXJhbSB7P09iamVjdD19IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICogQHBhcmFtIHtib29sZWFuPX0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgICAqIEBwYXJhbSB7Kj19IGV4dHJhQXJncyBBZGRpdGlvbmFsIG1ldGFkYXRhIHRvIHBhc3MgdG8gZWZmZWN0IGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIGFuIGVmZmVjdCByYW4gZm9yIHRoaXMgcHJvcGVydHkKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1bkVmZmVjdHMoaW5zdCwgZWZmZWN0cywgcHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocywgZXh0cmFBcmdzKSB7CiAgICAgIGlmIChlZmZlY3RzKSB7CiAgICAgICAgbGV0IHJhbiA9IGZhbHNlOwogICAgICAgIGNvbnN0IGlkID0gZGVkdXBlSWQkMSsrOwogICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIC8vIElubGluZSBgcnVuRWZmZWN0c0ZvclByb3BlcnR5YCBmb3IgcGVyZi4KICAgICAgICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IHJvb3QocHJvcCkgOiBwcm9wOwogICAgICAgICAgbGV0IGZ4cyA9IGVmZmVjdHNbcm9vdFByb3BlcnR5XTsKICAgICAgICAgIGlmIChmeHMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wLCBsPWZ4cy5sZW5ndGgsIGZ4OyAoaTxsKSAmJiAoZng9ZnhzW2ldKTsgaSsrKSB7CiAgICAgICAgICAgICAgaWYgKCghZnguaW5mbyB8fCBmeC5pbmZvLmxhc3RSdW4gIT09IGlkKSAmJgogICAgICAgICAgICAgICAgICAoIWhhc1BhdGhzIHx8IHBhdGhNYXRjaGVzVHJpZ2dlcihwcm9wLCBmeC50cmlnZ2VyKSkpIHsKICAgICAgICAgICAgICAgIGlmIChmeC5pbmZvKSB7CiAgICAgICAgICAgICAgICAgIGZ4LmluZm8ubGFzdFJ1biA9IGlkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZnguZm4oaW5zdCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBmeC5pbmZvLCBoYXNQYXRocywgZXh0cmFBcmdzKTsKICAgICAgICAgICAgICAgIHJhbiA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW47CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogUnVucyBhIGxpc3Qgb2YgZWZmZWN0cyBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBUaGUgaW5zdGFuY2Ugd2l0aCBlZmZlY3RzIHRvIHJ1bgogICAgICogQHBhcmFtIHshT2JqZWN0fSBlZmZlY3RzIE9iamVjdCBtYXAgb2YgcHJvcGVydHktdG8tQXJyYXkgb2YgZWZmZWN0cwogICAgICogQHBhcmFtIHtudW1iZXJ9IGRlZHVwZUlkIENvdW50ZXIgdXNlZCBmb3IgZGUtZHVwaW5nIGVmZmVjdHMKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIE5hbWUgb2YgY2hhbmdlZCBwcm9wZXJ0eQogICAgICogQHBhcmFtIHsqfSBwcm9wcyBDaGFuZ2VkIHByb3BlcnRpZXMKICAgICAqIEBwYXJhbSB7Kn0gb2xkUHJvcHMgT2xkIHByb3BlcnRpZXMKICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgKiBAcGFyYW0geyo9fSBleHRyYUFyZ3MgQWRkaXRpb25hbCBtZXRhZGF0YSB0byBwYXNzIHRvIGVmZmVjdCBmdW5jdGlvbgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhbiBlZmZlY3QgcmFuIGZvciB0aGlzIHByb3BlcnR5CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBydW5FZmZlY3RzRm9yUHJvcGVydHkoaW5zdCwgZWZmZWN0cywgZGVkdXBlSWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMsIGV4dHJhQXJncykgewogICAgICBsZXQgcmFuID0gZmFsc2U7CiAgICAgIGxldCByb290UHJvcGVydHkgPSBoYXNQYXRocyA/IHJvb3QocHJvcCkgOiBwcm9wOwogICAgICBsZXQgZnhzID0gZWZmZWN0c1tyb290UHJvcGVydHldOwogICAgICBpZiAoZnhzKSB7CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWZ4cy5sZW5ndGgsIGZ4OyAoaTxsKSAmJiAoZng9ZnhzW2ldKTsgaSsrKSB7CiAgICAgICAgICBpZiAoKCFmeC5pbmZvIHx8IGZ4LmluZm8ubGFzdFJ1biAhPT0gZGVkdXBlSWQpICYmCiAgICAgICAgICAgICAgKCFoYXNQYXRocyB8fCBwYXRoTWF0Y2hlc1RyaWdnZXIocHJvcCwgZngudHJpZ2dlcikpKSB7CiAgICAgICAgICAgIGlmIChmeC5pbmZvKSB7CiAgICAgICAgICAgICAgZnguaW5mby5sYXN0UnVuID0gZGVkdXBlSWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnguZm4oaW5zdCwgcHJvcCwgcHJvcHMsIG9sZFByb3BzLCBmeC5pbmZvLCBoYXNQYXRocywgZXh0cmFBcmdzKTsKICAgICAgICAgICAgcmFuID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJhbjsKICAgIH0KCiAgICAvKioKICAgICAqIERldGVybWluZXMgd2hldGhlciBhIHByb3BlcnR5L3BhdGggdGhhdCBoYXMgY2hhbmdlZCBtYXRjaGVzIHRoZSB0cmlnZ2VyCiAgICAgKiBjcml0ZXJpYSBmb3IgYW4gZWZmZWN0LiAgQSB0cmlnZ2VyIGlzIGEgZGVzY3JpcHRvciB3aXRoIHRoZSBmb2xsb3dpbmcKICAgICAqIHN0cnVjdHVyZSwgd2hpY2ggbWF0Y2hlcyB0aGUgZGVzY3JpcHRvcnMgcmV0dXJuZWQgZnJvbSBgcGFyc2VBcmdgLgogICAgICogZS5nLiBmb3IgYGZvby5iYXIuKmA6CiAgICAgKiBgYGAKICAgICAqIHRyaWdnZXI6IHsKICAgICAqICAgbmFtZTogJ2EuYicsCiAgICAgKiAgIHN0cnVjdHVyZWQ6IHRydWUsCiAgICAgKiAgIHdpbGRjYXJkOiB0cnVlCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqIElmIG5vIHRyaWdnZXIgaXMgZ2l2ZW4sIHRoZSBwYXRoIGlzIGRlZW1lZCB0byBtYXRjaC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIG9yIHByb3BlcnR5IHRoYXQgY2hhbmdlZAogICAgICogQHBhcmFtIHs/RGF0YVRyaWdnZXJ9IHRyaWdnZXIgRGVzY3JpcHRvcgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcGF0aCBtYXRjaGVkIHRoZSB0cmlnZ2VyCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhdGhNYXRjaGVzVHJpZ2dlcihwYXRoLCB0cmlnZ2VyKSB7CiAgICAgIGlmICh0cmlnZ2VyKSB7CiAgICAgICAgbGV0IHRyaWdnZXJQYXRoID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovICh0cmlnZ2VyLm5hbWUpOwogICAgICAgIHJldHVybiAodHJpZ2dlclBhdGggPT0gcGF0aCkgfHwKICAgICAgICAgICAgISEodHJpZ2dlci5zdHJ1Y3R1cmVkICYmIGlzQW5jZXN0b3IodHJpZ2dlclBhdGgsIHBhdGgpKSB8fAogICAgICAgICAgICAhISh0cmlnZ2VyLndpbGRjYXJkICYmIGlzRGVzY2VuZGFudCh0cmlnZ2VyUGF0aCwgcGF0aCkpOwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIHRoZSAib2JzZXJ2ZXIiIGVmZmVjdC4KICAgICAqCiAgICAgKiBDYWxscyB0aGUgbWV0aG9kIHdpdGggYGluZm8ubWV0aG9kTmFtZWAgb24gdGhlIGluc3RhbmNlLCBwYXNzaW5nIHRoZQogICAgICogbmV3IGFuZCBvbGQgdmFsdWVzLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBydW5PYnNlcnZlckVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICAgIGxldCBmbiA9IHR5cGVvZiBpbmZvLm1ldGhvZCA9PT0gInN0cmluZyIgPyBpbnN0W2luZm8ubWV0aG9kXSA6IGluZm8ubWV0aG9kOwogICAgICBsZXQgY2hhbmdlZFByb3AgPSBpbmZvLnByb3BlcnR5OwogICAgICBpZiAoZm4pIHsKICAgICAgICBmbi5jYWxsKGluc3QsIGluc3QuX19kYXRhW2NoYW5nZWRQcm9wXSwgb2xkUHJvcHNbY2hhbmdlZFByb3BdKTsKICAgICAgfSBlbHNlIGlmICghaW5mby5keW5hbWljRm4pIHsKICAgICAgICBjb25zb2xlLndhcm4oJ29ic2VydmVyIG1ldGhvZCBgJyArIGluZm8ubWV0aG9kICsgJ2Agbm90IGRlZmluZWQnKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUnVucyAibm90aWZ5IiBlZmZlY3RzIGZvciBhIHNldCBvZiBjaGFuZ2VkIHByb3BlcnRpZXMuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIHRoZSBnZW5lcmljIGBydW5FZmZlY3RzYCBtZXRob2QgaW4gdGhhdCBpdAogICAgICogd2lsbCBkaXNwYXRjaCBwYXRoIG5vdGlmaWNhdGlvbiBldmVudHMgaW4gdGhlIGNhc2UgdGhhdCB0aGUgcHJvcGVydHkKICAgICAqIGNoYW5nZWQgd2FzIGEgcGF0aCBhbmQgdGhlIHJvb3QgcHJvcGVydHkgZm9yIHRoYXQgcGF0aCBkaWRuJ3QgaGF2ZSBhCiAgICAgKiAibm90aWZ5IiBlZmZlY3QuICBUaGlzIGlzIHRvIG1haW50YWluIDEuMCBiZWhhdmlvciB0aGF0IGRpZCBub3QgcmVxdWlyZQogICAgICogYG5vdGlmeTogdHJ1ZWAgdG8gZW5zdXJlIG9iamVjdCBzdWItcHJvcGVydHkgbm90aWZpY2F0aW9ucyB3ZXJlCiAgICAgKiBzZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB3aXRoIGVmZmVjdHMgdG8gcnVuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gbm90aWZ5UHJvcHMgQmFnIG9mIHByb3BlcnRpZXMgdG8gbm90aWZ5CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdHMoaW5zdCwgbm90aWZ5UHJvcHMsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgLy8gTm90aWZ5CiAgICAgIGxldCBmeHMgPSBpbnN0W1RZUEVTLk5PVElGWV07CiAgICAgIGxldCBub3RpZmllZDsKICAgICAgbGV0IGlkID0gZGVkdXBlSWQkMSsrOwogICAgICAvLyBUcnkgbm9ybWFsIG5vdGlmeSBlZmZlY3RzOyBpZiBub25lLCBmYWxsIGJhY2sgdG8gdHJ5IHBhdGggbm90aWZpY2F0aW9uCiAgICAgIGZvciAobGV0IHByb3AgaW4gbm90aWZ5UHJvcHMpIHsKICAgICAgICBpZiAobm90aWZ5UHJvcHNbcHJvcF0pIHsKICAgICAgICAgIGlmIChmeHMgJiYgcnVuRWZmZWN0c0ZvclByb3BlcnR5KGluc3QsIGZ4cywgaWQsIHByb3AsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpKSB7CiAgICAgICAgICAgIG5vdGlmaWVkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSBpZiAoaGFzUGF0aHMgJiYgbm90aWZ5UGF0aChpbnN0LCBwcm9wLCBwcm9wcykpIHsKICAgICAgICAgICAgbm90aWZpZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBGbHVzaCBob3N0IGlmIHdlIGFjdHVhbGx5IG5vdGlmaWVkIGFuZCBob3N0IHdhcyBiYXRjaGluZwogICAgICAvLyBBbmQgdGhlIGhvc3QgaGFzIGFscmVhZHkgaW5pdGlhbGl6ZWQgY2xpZW50czsgdGhpcyBwcmV2ZW50cwogICAgICAvLyBhbiBpc3N1ZSB3aXRoIGEgaG9zdCBvYnNlcnZpbmcgZGF0YSBjaGFuZ2VzIGJlZm9yZSBjbGllbnRzIGFyZSByZWFkeS4KICAgICAgbGV0IGhvc3Q7CiAgICAgIGlmIChub3RpZmllZCAmJiAoaG9zdCA9IGluc3QuX19kYXRhSG9zdCkgJiYgaG9zdC5faW52YWxpZGF0ZVByb3BlcnRpZXMpIHsKICAgICAgICBob3N0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIHtwcm9wZXJ0eX0tY2hhbmdlZCBldmVudHMgd2l0aCBwYXRoIGluZm9ybWF0aW9uIGluIHRoZSBkZXRhaWwKICAgICAqIG9iamVjdCB0byBpbmRpY2F0ZSBhIHN1Yi1wYXRoIG9mIHRoZSBwcm9wZXJ0eSB3YXMgY2hhbmdlZC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlCiAgICAgKiAgICAgZXZlbnQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRoYXQgd2FzIGNoYW5nZWQKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHRydWUgaWYgdGhlIHBhdGggd2FzIG5vdGlmaWVkCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBub3RpZnlQYXRoKGluc3QsIHBhdGgsIHByb3BzKSB7CiAgICAgIGxldCByb290UHJvcGVydHkgPSByb290KHBhdGgpOwogICAgICBpZiAocm9vdFByb3BlcnR5ICE9PSBwYXRoKSB7CiAgICAgICAgbGV0IGV2ZW50TmFtZSA9IGNhbWVsVG9EYXNoQ2FzZShyb290UHJvcGVydHkpICsgJy1jaGFuZ2VkJzsKICAgICAgICBkaXNwYXRjaE5vdGlmeUV2ZW50KGluc3QsIGV2ZW50TmFtZSwgcHJvcHNbcGF0aF0sIHBhdGgpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIERpc3BhdGNoZXMge3Byb3BlcnR5fS1jaGFuZ2VkIGV2ZW50cyB0byBpbmRpY2F0ZSBhIHByb3BlcnR5IChvciBwYXRoKQogICAgICogY2hhbmdlZC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBUaGUgZWxlbWVudCBmcm9tIHdoaWNoIHRvIGZpcmUgdGhlCiAgICAgKiAgICAgZXZlbnQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHNlbmQKICAgICAqICAgICAoJ3twcm9wZXJ0eX0tY2hhbmdlZCcpCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSBvZiB0aGUgY2hhbmdlZCBwcm9wZXJ0eQogICAgICogQHBhcmFtIHtzdHJpbmcgfCBudWxsIHwgdW5kZWZpbmVkfSBwYXRoIElmIGEgc3ViLXBhdGggb2YgdGhpcyBwcm9wZXJ0eQogICAgICogICAgIGNoYW5nZWQsIHRoZSBwYXRoIHRoYXQgY2hhbmdlZCAob3B0aW9uYWwpLgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAqLwogICAgZnVuY3Rpb24gZGlzcGF0Y2hOb3RpZnlFdmVudChpbnN0LCBldmVudE5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICAgIGxldCBkZXRhaWwgPSB7CiAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgIHF1ZXVlUHJvcGVydHk6IHRydWUKICAgICAgfTsKICAgICAgaWYgKHBhdGgpIHsKICAgICAgICBkZXRhaWwucGF0aCA9IHBhdGg7CiAgICAgIH0KICAgICAgLy8gQXMgYSBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24sIHdlIGNvdWxkIGVsaWRlIHRoZSB3cmFwIGhlcmUgc2luY2Ugbm90aWZ5aW5nCiAgICAgIC8vIGV2ZW50cyBhcmUgbm9uLWJ1YmJsaW5nIGFuZCBzaG91bGRuJ3QgbmVlZCByZXRhcmdldGluZy4gSG93ZXZlciwgYSB2ZXJ5CiAgICAgIC8vIHNtYWxsIG51bWJlciBvZiBpbnRlcm5hbCB0ZXN0cyBmYWlsZWQgaW4gb2JzY3VyZSB3YXlzLCB3aGljaCBtYXkgaW5kaWNhdGUKICAgICAgLy8gdXNlciBjb2RlIHJlbGllZCBvbiB0aW1pbmcgZGlmZmVyZW5jZXMgcmVzdWx0aW5nIGZyb20gU2hhZHlET00gZmx1c2hpbmcKICAgICAgLy8gYXMgYSByZXN1bHQgb2YgdGhlIHdyYXBwZWQgYGRpc3BhdGNoRXZlbnRgLgogICAgICB3cmFwKC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhpbnN0KSkuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoZXZlbnROYW1lLCB7IGRldGFpbCB9KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIHRoZSAibm90aWZ5IiBlZmZlY3QuCiAgICAgKgogICAgICogRGlzcGF0Y2hlcyBhIG5vbi1idWJibGluZyBldmVudCBuYW1lZCBgaW5mby5ldmVudE5hbWVgIG9uIHRoZSBpbnN0YW5jZQogICAgICogd2l0aCBhIGRldGFpbCBvYmplY3QgY29udGFpbmluZyB0aGUgbmV3IGB2YWx1ZWAuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHByb3BlcnR5CiAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICogQHBhcmFtIHs/fSBpbmZvIEVmZmVjdCBtZXRhZGF0YQogICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1bk5vdGlmeUVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykgewogICAgICBsZXQgcm9vdFByb3BlcnR5ID0gaGFzUGF0aHMgPyByb290KHByb3BlcnR5KSA6IHByb3BlcnR5OwogICAgICBsZXQgcGF0aCA9IHJvb3RQcm9wZXJ0eSAhPSBwcm9wZXJ0eSA/IHByb3BlcnR5IDogbnVsbDsKICAgICAgbGV0IHZhbHVlID0gcGF0aCA/IGdldChpbnN0LCBwYXRoKSA6IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgICAgaWYgKHBhdGggJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgIHZhbHVlID0gcHJvcHNbcHJvcGVydHldOyAgLy8gc3BlY2lmaWNhbGx5IGZvciAuc3BsaWNlcwogICAgICB9CiAgICAgIGRpc3BhdGNoTm90aWZ5RXZlbnQoaW5zdCwgaW5mby5ldmVudE5hbWUsIHZhbHVlLCBwYXRoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEhhbmRsZXIgZnVuY3Rpb24gZm9yIDItd2F5IG5vdGlmaWNhdGlvbiBldmVudHMuIFJlY2VpdmVzIGNvbnRleHQKICAgICAqIGluZm9ybWF0aW9uIGNhcHR1cmVkIGluIHRoZSBgYWRkTm90aWZ5TGlzdGVuZXJgIGNsb3N1cmUgZnJvbSB0aGUKICAgICAqIGBfX25vdGlmeUxpc3RlbmVyc2AgbWV0YWRhdGEuCiAgICAgKgogICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIG5vdGlmaWVkIHByb3BlcnR5IHRvIHRoZSBob3N0IHByb3BlcnR5IG9yIHBhdGguICBJZgogICAgICogdGhlIGV2ZW50IGNvbnRhaW5lZCBwYXRoIGluZm9ybWF0aW9uLCB0cmFuc2xhdGUgdGhhdCBwYXRoIHRvIHRoZSBob3N0CiAgICAgKiBzY29wZSdzIG5hbWUgZm9yIHRoYXQgcGF0aCBmaXJzdC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBOb3RpZmljYXRpb24gZXZlbnQgKGUuZy4gJzxwcm9wZXJ0eT4tY2hhbmdlZCcpCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBIb3N0IGVsZW1lbnQgaW5zdGFuY2UgaGFuZGxpbmcgdGhlCiAgICAgKiAgICAgbm90aWZpY2F0aW9uIGV2ZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZnJvbVByb3AgQ2hpbGQgZWxlbWVudCBwcm9wZXJ0eSB0aGF0IHdhcyBib3VuZAogICAgICogQHBhcmFtIHtzdHJpbmd9IHRvUGF0aCBIb3N0IHByb3BlcnR5L3BhdGggdGhhdCB3YXMgYm91bmQKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gbmVnYXRlIFdoZXRoZXIgdGhlIGJpbmRpbmcgd2FzIG5lZ2F0ZWQKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBoYW5kbGVOb3RpZmljYXRpb24oZXZlbnQsIGluc3QsIGZyb21Qcm9wLCB0b1BhdGgsIG5lZ2F0ZSkgewogICAgICBsZXQgdmFsdWU7CiAgICAgIGxldCBkZXRhaWwgPSAvKiogQHR5cGUge09iamVjdH0gKi8oZXZlbnQuZGV0YWlsKTsKICAgICAgbGV0IGZyb21QYXRoID0gZGV0YWlsICYmIGRldGFpbC5wYXRoOwogICAgICBpZiAoZnJvbVBhdGgpIHsKICAgICAgICB0b1BhdGggPSB0cmFuc2xhdGUoZnJvbVByb3AsIHRvUGF0aCwgZnJvbVBhdGgpOwogICAgICAgIHZhbHVlID0gZGV0YWlsICYmIGRldGFpbC52YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB2YWx1ZSA9IGV2ZW50LmN1cnJlbnRUYXJnZXRbZnJvbVByb3BdOwogICAgICB9CiAgICAgIHZhbHVlID0gbmVnYXRlID8gIXZhbHVlIDogdmFsdWU7CiAgICAgIGlmICghaW5zdFtUWVBFUy5SRUFEX09OTFldIHx8ICFpbnN0W1RZUEVTLlJFQURfT05MWV1bdG9QYXRoXSkgewogICAgICAgIGlmIChpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgodG9QYXRoLCB2YWx1ZSwgdHJ1ZSwgQm9vbGVhbihmcm9tUGF0aCkpCiAgICAgICAgICAmJiAoIWRldGFpbCB8fCAhZGV0YWlsLnF1ZXVlUHJvcGVydHkpKSB7CiAgICAgICAgICBpbnN0Ll9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogSW1wbGVtZW50cyB0aGUgInJlZmxlY3QiIGVmZmVjdC4KICAgICAqCiAgICAgKiBTZXRzIHRoZSBhdHRyaWJ1dGUgbmFtZWQgYGluZm8uYXR0ck5hbWVgIHRvIHRoZSBnaXZlbiBwcm9wZXJ0eSB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBUaGUgaW5zdGFuY2UgdGhlIGVmZmVjdCB3aWxsIGJlIHJ1biBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgcHJvcGVydHkKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcnVuUmVmbGVjdEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgcHJvcHMsIG9sZFByb3BzLCBpbmZvKSB7CiAgICAgIGxldCB2YWx1ZSA9IGluc3QuX19kYXRhW3Byb3BlcnR5XTsKICAgICAgaWYgKHNhbml0aXplRE9NVmFsdWUpIHsKICAgICAgICB2YWx1ZSA9IHNhbml0aXplRE9NVmFsdWUodmFsdWUsIGluZm8uYXR0ck5hbWUsICdhdHRyaWJ1dGUnLCAvKiogQHR5cGUge05vZGV9ICovKGluc3QpKTsKICAgICAgfQogICAgICBpbnN0Ll9wcm9wZXJ0eVRvQXR0cmlidXRlKHByb3BlcnR5LCBpbmZvLmF0dHJOYW1lLCB2YWx1ZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSdW5zICJjb21wdXRlZCIgZWZmZWN0cyBmb3IgYSBzZXQgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGRpZmZlcnMgZnJvbSB0aGUgZ2VuZXJpYyBgcnVuRWZmZWN0c2AgbWV0aG9kIGluIHRoYXQgaXQKICAgICAqIGNvbnRpbnVlcyB0byBydW4gY29tcHV0ZWQgZWZmZWN0cyBiYXNlZCBvbiB0aGUgb3V0cHV0IG9mIGVhY2ggcGFzcyB1bnRpbAogICAgICogdGhlcmUgYXJlIG5vIG1vcmUgbmV3bHkgY29tcHV0ZWQgcHJvcGVydGllcy4gIFRoaXMgZW5zdXJlcyB0aGF0IGFsbAogICAgICogcHJvcGVydGllcyB0aGF0IHdpbGwgYmUgY29tcHV0ZWQgYnkgdGhlIGluaXRpYWwgc2V0IG9mIGNoYW5nZXMgYXJlCiAgICAgKiBjb21wdXRlZCBiZWZvcmUgb3RoZXIgZWZmZWN0cyAoYmluZGluZyBwcm9wYWdhdGlvbiwgb2JzZXJ2ZXJzLCBhbmQgbm90aWZ5KQogICAgICogcnVuLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICAgKiBAcGFyYW0gez9PYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgKiBAcGFyYW0gez9PYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICogQHBhcmFtIHtib29sZWFufSBoYXNQYXRocyBUcnVlIHdpdGggYHByb3BzYCBjb250YWlucyBvbmUgb3IgbW9yZSBwYXRocwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1bkNvbXB1dGVkRWZmZWN0cyhpbnN0LCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocykgewogICAgICBsZXQgY29tcHV0ZUVmZmVjdHMgPSBpbnN0W1RZUEVTLkNPTVBVVEVdOwogICAgICBpZiAoY29tcHV0ZUVmZmVjdHMpIHsKICAgICAgICBpZiAob3JkZXJlZENvbXB1dGVkKSB7CiAgICAgICAgICAvLyBSdW5zIGNvbXB1dGVkIGVmZmVjdHMgaW4gZWZmaWNpZW50IG9yZGVyIGJ5IGtlZXBpbmcgYSB0b3BvbG9naWNhbGx5LQogICAgICAgICAgLy8gc29ydGVkIHF1ZXVlIG9mIGNvbXB1dGUgZWZmZWN0cyB0byBydW4sIGFuZCBpbnNlcnRpbmcgc3Vic2VxdWVudGx5CiAgICAgICAgICAvLyBpbnZhbGlkYXRlZCBlZmZlY3RzIGFzIHRoZXkgYXJlIHJ1bgogICAgICAgICAgZGVkdXBlSWQkMSsrOwogICAgICAgICAgY29uc3Qgb3JkZXIgPSBnZXRDb21wdXRlZE9yZGVyKGluc3QpOwogICAgICAgICAgY29uc3QgcXVldWUgPSBbXTsKICAgICAgICAgIGZvciAobGV0IHAgaW4gY2hhbmdlZFByb3BzKSB7CiAgICAgICAgICAgIGVucXVldWVFZmZlY3RzRm9yKHAsIGNvbXB1dGVFZmZlY3RzLCBxdWV1ZSwgb3JkZXIsIGhhc1BhdGhzKTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBpbmZvOwogICAgICAgICAgd2hpbGUgKChpbmZvID0gcXVldWUuc2hpZnQoKSkpIHsKICAgICAgICAgICAgaWYgKHJ1bkNvbXB1dGVkRWZmZWN0KGluc3QsICcnLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBpbmZvKSkgewogICAgICAgICAgICAgIGVucXVldWVFZmZlY3RzRm9yKGluZm8ubWV0aG9kSW5mbywgY29tcHV0ZUVmZmVjdHMsIHF1ZXVlLCBvcmRlciwgaGFzUGF0aHMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBPYmplY3QuYXNzaWduKC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKG9sZFByb3BzKSwgaW5zdC5fX2RhdGFPbGQpOwogICAgICAgICAgT2JqZWN0LmFzc2lnbigvKiogQHR5cGUgeyFPYmplY3R9ICovIChjaGFuZ2VkUHJvcHMpLCBpbnN0Ll9fZGF0YVBlbmRpbmcpOwogICAgICAgICAgaW5zdC5fX2RhdGFQZW5kaW5nID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3JpZ2luYWwgUG9seW1lciAyLnggY29tcHV0ZWQgZWZmZWN0cyBvcmRlciwgd2hpY2ggY29udGludWVzIHJ1bm5pbmcKICAgICAgICAgIC8vIGVmZmVjdHMgdW50aWwgbm8gZnVydGhlciBjb21wdXRlZCBwcm9wZXJ0aWVzIGhhdmUgYmVlbiBpbnZhbGlkYXRlZAogICAgICAgICAgbGV0IGlucHV0UHJvcHMgPSBjaGFuZ2VkUHJvcHM7CiAgICAgICAgICB3aGlsZSAocnVuRWZmZWN0cyhpbnN0LCBjb21wdXRlRWZmZWN0cywgaW5wdXRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSkgewogICAgICAgICAgICBPYmplY3QuYXNzaWduKC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKG9sZFByb3BzKSwgaW5zdC5fX2RhdGFPbGQpOwogICAgICAgICAgICBPYmplY3QuYXNzaWduKC8qKiBAdHlwZSB7IU9iamVjdH0gKi8gKGNoYW5nZWRQcm9wcyksIGluc3QuX19kYXRhUGVuZGluZyk7CiAgICAgICAgICAgIGlucHV0UHJvcHMgPSBpbnN0Ll9fZGF0YVBlbmRpbmc7CiAgICAgICAgICAgIGluc3QuX19kYXRhUGVuZGluZyA9IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBJbnNlcnRzIGEgY29tcHV0ZWQgZWZmZWN0IGludG8gYSBxdWV1ZSwgZ2l2ZW4gdGhlIHNwZWNpZmllZCBvcmRlci4gUGVyZm9ybXMKICAgICAqIHRoZSBpbnNlcnQgdXNpbmcgYSBiaW5hcnkgc2VhcmNoLgogICAgICoKICAgICAqIFVzZWQgYnkgYG9yZGVyZWRDb21wdXRlZDogdHJ1ZWAgY29tcHV0ZWQgcHJvcGVydHkgYWxnb3JpdGhtLgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIFByb3BlcnR5IGVmZmVjdHMgbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7QXJyYXk8T2JqZWN0Pn0gcXVldWUgT3JkZXJlZCBxdWV1ZSBvZiBlZmZlY3RzCiAgICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsbnVtYmVyPn0gb3JkZXIgTWFwIG9mIGNvbXB1dGVkIHByb3BlcnR5IG5hbWUtPnRvcG9sb2dpY2FsCiAgICAgKiAgIHNvcnQgb3JkZXIKICAgICAqLwogICAgY29uc3QgaW5zZXJ0RWZmZWN0ID0gKGluZm8sIHF1ZXVlLCBvcmRlcikgPT4gewogICAgICBsZXQgc3RhcnQgPSAwOwogICAgICBsZXQgZW5kID0gcXVldWUubGVuZ3RoIC0gMTsKICAgICAgbGV0IGlkeCA9IC0xOwogICAgICB3aGlsZSAoc3RhcnQgPD0gZW5kKSB7CiAgICAgICAgY29uc3QgbWlkID0gKHN0YXJ0ICsgZW5kKSA+PiAxOwogICAgICAgIC8vIE5vdGUgYG1ldGhvZEluZm9gIGlzIHdoZXJlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBuYW1lIGlzIHN0b3JlZCBpbgogICAgICAgIC8vIHRoZSBlZmZlY3QgbWV0YWRhdGEKICAgICAgICBjb25zdCBjbXAgPSBvcmRlci5nZXQocXVldWVbbWlkXS5tZXRob2RJbmZvKSAtIG9yZGVyLmdldChpbmZvLm1ldGhvZEluZm8pOwogICAgICAgIGlmIChjbXAgPCAwKSB7CiAgICAgICAgICBzdGFydCA9IG1pZCArIDE7CiAgICAgICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7CiAgICAgICAgICBlbmQgPSBtaWQgLSAxOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZHggPSBtaWQ7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGlkeCA8IDApIHsKICAgICAgICBpZHggPSBlbmQgKyAxOwogICAgICB9CiAgICAgIHF1ZXVlLnNwbGljZShpZHgsIDAsIGluZm8pOwogICAgfTsKCiAgICAvKioKICAgICAqIEluc2VydHMgYWxsIGRvd25zdHJlYW0gY29tcHV0ZWQgZWZmZWN0cyBpbnZhbGlkYXRlZCBieSB0aGUgc3BlY2lmaWVkIHByb3BlcnR5CiAgICAgKiBpbnRvIHRoZSB0b3BvbG9naWNhbGx5LXNvcnRlZCBxdWV1ZSBvZiBlZmZlY3RzIHRvIGJlIHJ1bi4KICAgICAqCiAgICAgKiBVc2VkIGJ5IGBvcmRlcmVkQ29tcHV0ZWQ6IHRydWVgIGNvbXB1dGVkIHByb3BlcnR5IGFsZ29yaXRobS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBuYW1lCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHV0ZUVmZmVjdHMgQ29tcHV0ZWQgZWZmZWN0cyBmb3IgdGhpcyBlbGVtZW50CiAgICAgKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IHF1ZXVlIFRvcG9sb2dpY2FsbHktc29ydGVkIHF1ZXVlIG9mIGNvbXB1dGVkIGVmZmVjdHMKICAgICAqICAgdG8gYmUgcnVuCiAgICAgKiBAcGFyYW0ge01hcDxzdHJpbmcsbnVtYmVyPn0gb3JkZXIgTWFwIG9mIGNvbXB1dGVkIHByb3BlcnR5IG5hbWUtPnRvcG9sb2dpY2FsCiAgICAgKiAgIHNvcnQgb3JkZXIKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBjaGFuZ2VkUHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgKi8KICAgIGNvbnN0IGVucXVldWVFZmZlY3RzRm9yID0gKHByb3AsIGNvbXB1dGVFZmZlY3RzLCBxdWV1ZSwgb3JkZXIsIGhhc1BhdGhzKSA9PiB7CiAgICAgIGNvbnN0IHJvb3RQcm9wZXJ0eSA9IGhhc1BhdGhzID8gcm9vdChwcm9wKSA6IHByb3A7CiAgICAgIGNvbnN0IGZ4cyA9IGNvbXB1dGVFZmZlY3RzW3Jvb3RQcm9wZXJ0eV07CiAgICAgIGlmIChmeHMpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8ZnhzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBjb25zdCBmeCA9IGZ4c1tpXTsKICAgICAgICAgIGlmICgoZnguaW5mby5sYXN0UnVuICE9PSBkZWR1cGVJZCQxKSAmJgogICAgICAgICAgICAgICghaGFzUGF0aHMgfHwgcGF0aE1hdGNoZXNUcmlnZ2VyKHByb3AsIGZ4LnRyaWdnZXIpKSkgewogICAgICAgICAgICBmeC5pbmZvLmxhc3RSdW4gPSBkZWR1cGVJZCQxOwogICAgICAgICAgICBpbnNlcnRFZmZlY3QoZnguaW5mbywgcXVldWUsIG9yZGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYW5kIHJldHJpZXZlcyBhIG1lbW9pemVkIG1hcCBvZiBjb21wdXRlZCBwcm9wZXJ0eSBuYW1lIHRvIGl0cwogICAgICogdG9wb2xvZ2ljYWxseS1zb3J0ZWQgb3JkZXIuCiAgICAgKgogICAgICogVGhlIG1hcCBpcyBnZW5lcmF0ZWQgYnkgZmlyc3QgYXNzaWduaW5nIGEgImRlcGVuZGVuY3kgY291bnQiIHRvIGVhY2ggcHJvcGVydHkKICAgICAqIChkZWZpbmVkIGFzIG51bWJlciBwcm9wZXJ0aWVzIGl0IGRlcGVuZHMgb24sIGluY2x1ZGluZyBpdHMgbWV0aG9kIGZvcgogICAgICogImR5bmFtaWMgZnVuY3Rpb25zIikuIEFueSBwcm9wZXJ0aWVzIHRoYXQgaGF2ZSBubyBkZXBlbmRlbmNpZXMgYXJlIGFkZGVkIHRvCiAgICAgKiB0aGUgYHJlYWR5YCBxdWV1ZSwgd2hpY2ggYXJlIHByb3BlcnRpZXMgd2hvc2Ugb3JkZXIgY2FuIGJlIGFkZGVkIHRvIHRoZSBmaW5hbAogICAgICogb3JkZXIgbWFwLiBQcm9wZXJ0aWVzIGFyZSBwb3BwZWQgb2ZmIHRoZSBgcmVhZHlgIHF1ZXVlIG9uZSBieSBvbmUgYW5kIGEuKSBhZGRlZCBhcwogICAgICogdGhlIG5leHQgcHJvcGVydHkgaW4gdGhlIG9yZGVyIG1hcCwgYW5kIGIuKSBlYWNoIHByb3BlcnR5IHRoYXQgaXQgaXMgYQogICAgICogZGVwZW5kZW5jeSBmb3IgaGFzIGl0cyBkZXAgY291bnQgZGVjcmVtZW50ZWQgKGFuZCBpZiB0aGF0IHByb3BlcnR5J3MgZGVwCiAgICAgKiBjb3VudCBnb2VzIHRvIHplcm8sIGl0IGlzIGFkZGVkIHRvIHRoZSBgcmVhZHlgIHF1ZXVlKSwgdW50aWwgYWxsIHByb3BlcnRpZXMKICAgICAqIGhhdmUgYmVlbiB2aXNpdGVkIGFuZCBvcmRlcmVkLgogICAgICoKICAgICAqIFVzZWQgYnkgYG9yZGVyZWRDb21wdXRlZDogdHJ1ZWAgY29tcHV0ZWQgcHJvcGVydHkgYWxnb3JpdGhtLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB0byByZXRyaWV2ZSB0aGUgY29tcHV0ZWQKICAgICAqICAgZWZmZWN0IG9yZGVyIGZvci4KICAgICAqIEByZXR1cm4ge01hcDxzdHJpbmcsbnVtYmVyPn0gTWFwIG9mIGNvbXB1dGVkIHByb3BlcnR5IG5hbWUtPnRvcG9sb2dpY2FsIHNvcnQKICAgICAqICAgb3JkZXIKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRPcmRlcihpbnN0KSB7CiAgICAgIGxldCBvcmRlcmVkID0gaW5zdC5jb25zdHJ1Y3Rvci5fX29yZGVyZWRDb21wdXRlZERlcHM7CiAgICAgIGlmICghb3JkZXJlZCkgewogICAgICAgIG9yZGVyZWQgPSBuZXcgTWFwKCk7CiAgICAgICAgY29uc3QgZWZmZWN0cyA9IGluc3RbVFlQRVMuQ09NUFVURV07CiAgICAgICAgbGV0IHtjb3VudHMsIHJlYWR5LCB0b3RhbH0gPSBkZXBlbmRlbmN5Q291bnRzKGluc3QpOwogICAgICAgIGxldCBjdXJyOwogICAgICAgIHdoaWxlICgoY3VyciA9IHJlYWR5LnNoaWZ0KCkpKSB7CiAgICAgICAgICBvcmRlcmVkLnNldChjdXJyLCBvcmRlcmVkLnNpemUpOwogICAgICAgICAgY29uc3QgY29tcHV0ZWRCeUN1cnIgPSBlZmZlY3RzW2N1cnJdOwogICAgICAgICAgaWYgKGNvbXB1dGVkQnlDdXJyKSB7CiAgICAgICAgICAgIGNvbXB1dGVkQnlDdXJyLmZvckVhY2goZnggPT4gewogICAgICAgICAgICAgIC8vIE5vdGUgYG1ldGhvZEluZm9gIGlzIHdoZXJlIHRoZSBjb21wdXRlZCBwcm9wZXJ0eSBuYW1lIGlzIHN0b3JlZAogICAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkUHJvcCA9IGZ4LmluZm8ubWV0aG9kSW5mbzsKICAgICAgICAgICAgICAtLXRvdGFsOwogICAgICAgICAgICAgIGlmICgtLWNvdW50c1tjb21wdXRlZFByb3BdID09PSAwKSB7CiAgICAgICAgICAgICAgICByZWFkeS5wdXNoKGNvbXB1dGVkUHJvcCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHRvdGFsICE9PSAwKSB7CiAgICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovIChpbnN0KTsKICAgICAgICAgIGNvbnNvbGUud2FybihgQ29tcHV0ZWQgZ3JhcGggZm9yICR7ZWwubG9jYWxOYW1lfSBpbmNvbXBsZXRlOyBjaXJjdWxhcj9gKTsKICAgICAgICB9CiAgICAgICAgaW5zdC5jb25zdHJ1Y3Rvci5fX29yZGVyZWRDb21wdXRlZERlcHMgPSBvcmRlcmVkOwogICAgICB9CiAgICAgIHJldHVybiBvcmRlcmVkOwogICAgfQoKICAgIC8qKgogICAgICogR2VuZXJhdGVzIGEgbWFwIG9mIHByb3BlcnR5LXRvLWRlcGVuZGVuY3kgY291bnQgKGBjb3VudHNgLCB3aGVyZSAiZGVwZW5kZW5jeQogICAgICogY291bnQiIGlzIHRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzIGEgZ2l2ZW4gcHJvcGVydHkgaGFzIGFzc3VtaW5nIGl0IGlzIGEKICAgICAqIGNvbXB1dGVkIHByb3BlcnR5LCBvdGhlcndpc2UgMCkuICBJdCBhbHNvIHJldHVybnMgYSBwcmUtcG9wdWxhdGVkIGxpc3Qgb2YKICAgICAqIGByZWFkeWAgcHJvcGVydGllcyB0aGF0IGhhdmUgbm8gZGVwZW5kZW5jaWVzIGFuZCBhIGB0b3RhbGAgY291bnQsIHdoaWNoIGlzCiAgICAgKiB1c2VkIGZvciBlcnJvci1jaGVja2luZyB0aGUgZ3JhcGguCiAgICAgKgogICAgICogVXNlZCBieSBgb3JkZXJlZENvbXB1dGVkOiB0cnVlYCBjb21wdXRlZCBwcm9wZXJ0eSBhbGdvcml0aG0uCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IGluc3QgVGhlIGluc3RhbmNlIHRvIGdlbmVyYXRlIGRlcGVuZGVuY3kKICAgICAqICAgY291bnRzIGZvci4KICAgICAqIEByZXR1cm4geyFPYmplY3R9IE9iamVjdCBjb250YWluaW5nIGBjb3VudHNgIG1hcCAocHJvcGVydHktdG8tZGVwZW5kZW5jeQogICAgICogICBjb3VudCkgYW5kIHByZS1wb3B1bGF0ZWQgYHJlYWR5YCBhcnJheSBvZiBwcm9wZXJ0aWVzIHRoYXQgaGFkIHplcm8KICAgICAqICAgZGVwZW5kZW5jaWVzLgogICAgICovCiAgICBmdW5jdGlvbiBkZXBlbmRlbmN5Q291bnRzKGluc3QpIHsKICAgICAgY29uc3QgaW5mb0ZvckNvbXB1dGVkID0gaW5zdFtDT01QVVRFX0lORk9dOwogICAgICBjb25zdCBjb3VudHMgPSB7fTsKICAgICAgY29uc3QgY29tcHV0ZWREZXBzID0gaW5zdFtUWVBFUy5DT01QVVRFXTsKICAgICAgY29uc3QgcmVhZHkgPSBbXTsKICAgICAgbGV0IHRvdGFsID0gMDsKICAgICAgLy8gQ291bnQgZGVwZW5kZW5jaWVzIGZvciBlYWNoIGNvbXB1dGVkIHByb3BlcnR5CiAgICAgIGZvciAobGV0IHAgaW4gaW5mb0ZvckNvbXB1dGVkKSB7CiAgICAgICAgY29uc3QgaW5mbyA9IGluZm9Gb3JDb21wdXRlZFtwXTsKICAgICAgICAvLyBCZSBzdXJlIHRvIGFkZCB0aGUgbWV0aG9kIG5hbWUgaXRzZWxmIGluIGNhc2Ugb2YgImR5bmFtaWMgZnVuY3Rpb25zIgogICAgICAgIHRvdGFsICs9IGNvdW50c1twXSA9CiAgICAgICAgICBpbmZvLmFyZ3MuZmlsdGVyKGEgPT4gIWEubGl0ZXJhbCkubGVuZ3RoICsgKGluZm8uZHluYW1pY0ZuID8gMSA6IDApOwogICAgICB9CiAgICAgIC8vIEJ1aWxkIGxpc3Qgb2YgcmVhZHkgcHJvcGVydGllcyAodGhhdCBhcmVuJ3QgdGhlbXNlbHZlcyBjb21wdXRlZCkKICAgICAgZm9yIChsZXQgcCBpbiBjb21wdXRlZERlcHMpIHsKICAgICAgICBpZiAoIWluZm9Gb3JDb21wdXRlZFtwXSkgewogICAgICAgICAgcmVhZHkucHVzaChwKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHtjb3VudHMsIHJlYWR5LCB0b3RhbH07CiAgICB9CgogICAgLyoqCiAgICAgKiBJbXBsZW1lbnRzIHRoZSAiY29tcHV0ZWQgcHJvcGVydHkiIGVmZmVjdCBieSBydW5uaW5nIHRoZSBtZXRob2Qgd2l0aCB0aGUKICAgICAqIHZhbHVlcyBvZiB0aGUgYXJndW1lbnRzIHNwZWNpZmllZCBpbiB0aGUgYGluZm9gIG9iamVjdCBhbmQgc2V0dGluZyB0aGUKICAgICAqIHJldHVybiB2YWx1ZSB0byB0aGUgY29tcHV0ZWQgcHJvcGVydHkgc3BlY2lmaWVkLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAgICogQHBhcmFtIHs/T2JqZWN0fSBjaGFuZ2VkUHJvcHMgQmFnIG9mIGN1cnJlbnQgcHJvcGVydHkgY2hhbmdlcwogICAgICogQHBhcmFtIHs/T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiB0aGUgcHJvcGVydHkgYmVpbmcgY29tcHV0ZWQgY2hhbmdlZAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcnVuQ29tcHV0ZWRFZmZlY3QoaW5zdCwgcHJvcGVydHksIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgICAgLy8gRGlydHkgY2hlY2sgZGVwZW5kZW5jaWVzIGFuZCBydW4gaWYgYW55IGludmFsaWQKICAgICAgbGV0IHJlc3VsdCA9IHJ1bk1ldGhvZEVmZmVjdChpbnN0LCBwcm9wZXJ0eSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaW5mbyk7CiAgICAgIC8vIEFib3J0IGlmIG1ldGhvZCByZXR1cm5zIGEgbm8tb3AgcmVzdWx0CiAgICAgIGlmIChyZXN1bHQgPT09IE5PT1ApIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgbGV0IGNvbXB1dGVkUHJvcCA9IGluZm8ubWV0aG9kSW5mbzsKICAgICAgaWYgKGluc3QuX19kYXRhSGFzQWNjZXNzb3IgJiYgaW5zdC5fX2RhdGFIYXNBY2Nlc3Nvcltjb21wdXRlZFByb3BdKSB7CiAgICAgICAgcmV0dXJuIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eShjb21wdXRlZFByb3AsIHJlc3VsdCwgdHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaW5zdFtjb21wdXRlZFByb3BdID0gcmVzdWx0OwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ29tcHV0ZXMgcGF0aCBjaGFuZ2VzIGJhc2VkIG9uIHBhdGggbGlua3Mgc2V0IHVwIHVzaW5nIHRoZSBgbGlua1BhdGhzYAogICAgICogQVBJLgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB3aG9zZSBwcm9wcyBhcmUgY2hhbmdpbmcKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdGhhdCBoYXMgY2hhbmdlZAogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvZiBjaGFuZ2VkIHBhdGgKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBjb21wdXRlTGlua2VkUGF0aHMoaW5zdCwgcGF0aCwgdmFsdWUpIHsKICAgICAgbGV0IGxpbmtzID0gaW5zdC5fX2RhdGFMaW5rZWRQYXRoczsKICAgICAgaWYgKGxpbmtzKSB7CiAgICAgICAgbGV0IGxpbms7CiAgICAgICAgZm9yIChsZXQgYSBpbiBsaW5rcykgewogICAgICAgICAgbGV0IGIgPSBsaW5rc1thXTsKICAgICAgICAgIGlmIChpc0Rlc2NlbmRhbnQoYSwgcGF0aCkpIHsKICAgICAgICAgICAgbGluayA9IHRyYW5zbGF0ZShhLCBiLCBwYXRoKTsKICAgICAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKGxpbmssIHZhbHVlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgIH0gZWxzZSBpZiAoaXNEZXNjZW5kYW50KGIsIHBhdGgpKSB7CiAgICAgICAgICAgIGxpbmsgPSB0cmFuc2xhdGUoYiwgYSwgcGF0aCk7CiAgICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChsaW5rLCB2YWx1ZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLy8gLS0gYmluZGluZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgIC8qKgogICAgICogQWRkcyBiaW5kaW5nIG1ldGFkYXRhIHRvIHRoZSBjdXJyZW50IGBub2RlSW5mb2AsIGFuZCBiaW5kaW5nIGVmZmVjdHMKICAgICAqIGZvciBhbGwgcGFydCBkZXBlbmRlbmNpZXMgdG8gYHRlbXBsYXRlSW5mb2AuCiAgICAgKgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAgICogICBydW5uaW5nIG9uCiAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgKiBAcGFyYW0ge05vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlIG5vZGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBraW5kIEJpbmRpbmcga2luZCwgZWl0aGVyICdwcm9wZXJ0eScsICdhdHRyaWJ1dGUnLCBvciAndGV4dCcKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YXJnZXQgVGFyZ2V0IHByb3BlcnR5IG5hbWUKICAgICAqIEBwYXJhbSB7IUFycmF5PCFCaW5kaW5nUGFydD59IHBhcnRzIEFycmF5IG9mIGJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICogQHBhcmFtIHtzdHJpbmc9fSBsaXRlcmFsIExpdGVyYWwgdGV4dCBzdXJyb3VuZGluZyBiaW5kaW5nIHBhcnRzIChzcGVjaWZpZWQKICAgICAqICAgb25seSBmb3IgJ3Byb3BlcnR5JyBiaW5kaW5ncywgc2luY2UgdGhlc2UgbXVzdCBiZSBpbml0aWFsaXplZCBhcyBwYXJ0CiAgICAgKiAgIG9mIGJvb3QtdXApCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gYWRkQmluZGluZyhjb25zdHJ1Y3RvciwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywga2luZCwgdGFyZ2V0LCBwYXJ0cywgbGl0ZXJhbCkgewogICAgICAvLyBDcmVhdGUgYmluZGluZyBtZXRhZGF0YSBhbmQgYWRkIHRvIG5vZGVJbmZvCiAgICAgIG5vZGVJbmZvLmJpbmRpbmdzID0gbm9kZUluZm8uYmluZGluZ3MgfHwgW107CiAgICAgIGxldCAvKiogQmluZGluZyAqLyBiaW5kaW5nID0geyBraW5kLCB0YXJnZXQsIHBhcnRzLCBsaXRlcmFsLCBpc0NvbXBvdW5kOiAocGFydHMubGVuZ3RoICE9PSAxKSB9OwogICAgICBub2RlSW5mby5iaW5kaW5ncy5wdXNoKGJpbmRpbmcpOwogICAgICAvLyBBZGQgbGlzdGVuZXIgaW5mbyB0byBiaW5kaW5nIG1ldGFkYXRhCiAgICAgIGlmIChzaG91bGRBZGRMaXN0ZW5lcihiaW5kaW5nKSkgewogICAgICAgIGxldCB7ZXZlbnQsIG5lZ2F0ZX0gPSBiaW5kaW5nLnBhcnRzWzBdOwogICAgICAgIGJpbmRpbmcubGlzdGVuZXJFdmVudCA9IGV2ZW50IHx8IChjYW1lbFRvRGFzaENhc2UodGFyZ2V0KSArICctY2hhbmdlZCcpOwogICAgICAgIGJpbmRpbmcubGlzdGVuZXJOZWdhdGUgPSBuZWdhdGU7CiAgICAgIH0KICAgICAgLy8gQWRkICJwcm9wYWdhdGUiIHByb3BlcnR5IGVmZmVjdHMgdG8gdGVtcGxhdGVJbmZvCiAgICAgIGxldCBpbmRleCA9IHRlbXBsYXRlSW5mby5ub2RlSW5mb0xpc3QubGVuZ3RoOwogICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZy5wYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBwYXJ0ID0gYmluZGluZy5wYXJ0c1tpXTsKICAgICAgICBwYXJ0LmNvbXBvdW5kSW5kZXggPSBpOwogICAgICAgIGFkZEVmZmVjdEZvckJpbmRpbmdQYXJ0KGNvbnN0cnVjdG9yLCB0ZW1wbGF0ZUluZm8sIGJpbmRpbmcsIHBhcnQsIGluZGV4KTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQWRkcyBwcm9wZXJ0eSBlZmZlY3RzIHRvIHRoZSBnaXZlbiBgdGVtcGxhdGVJbmZvYCBmb3IgdGhlIGdpdmVuIGJpbmRpbmcKICAgICAqIHBhcnQuCiAgICAgKgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29uc3RydWN0b3IgQ2xhc3MgdGhhdCBgX3BhcnNlVGVtcGxhdGVgIGlzIGN1cnJlbnRseQogICAgICogICBydW5uaW5nIG9uCiAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IEluZGV4IGludG8gYG5vZGVJbmZvTGlzdGAgZm9yIHRoaXMgbm9kZQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZnVuY3Rpb24gYWRkRWZmZWN0Rm9yQmluZGluZ1BhcnQoY29uc3RydWN0b3IsIHRlbXBsYXRlSW5mbywgYmluZGluZywgcGFydCwgaW5kZXgpIHsKICAgICAgaWYgKCFwYXJ0LmxpdGVyYWwpIHsKICAgICAgICBpZiAoYmluZGluZy5raW5kID09PSAnYXR0cmlidXRlJyAmJiBiaW5kaW5nLnRhcmdldFswXSA9PT0gJy0nKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oJ0Nhbm5vdCBzZXQgYXR0cmlidXRlICcgKyBiaW5kaW5nLnRhcmdldCArCiAgICAgICAgICAgICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgYXR0cmlidXRlIHN0YXJ0aW5nIGNoYXJhY3RlcicpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsZXQgZGVwZW5kZW5jaWVzID0gcGFydC5kZXBlbmRlbmNpZXM7CiAgICAgICAgICBsZXQgaW5mbyA9IHsgaW5kZXgsIGJpbmRpbmcsIHBhcnQsIGV2YWx1YXRvcjogY29uc3RydWN0b3IgfTsKICAgICAgICAgIGZvciAobGV0IGo9MDsgajxkZXBlbmRlbmNpZXMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgbGV0IHRyaWdnZXIgPSBkZXBlbmRlbmNpZXNbal07CiAgICAgICAgICAgIGlmICh0eXBlb2YgdHJpZ2dlciA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgIHRyaWdnZXIgPSBwYXJzZUFyZyh0cmlnZ2VyKTsKICAgICAgICAgICAgICB0cmlnZ2VyLndpbGRjYXJkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdHJ1Y3Rvci5fYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0ZW1wbGF0ZUluZm8sIHRyaWdnZXIucm9vdFByb3BlcnR5LCB7CiAgICAgICAgICAgICAgZm46IHJ1bkJpbmRpbmdFZmZlY3QsCiAgICAgICAgICAgICAgaW5mbywgdHJpZ2dlcgogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEltcGxlbWVudHMgdGhlICJiaW5kaW5nIiAocHJvcGVydHkvcGF0aCBiaW5kaW5nKSBlZmZlY3QuCiAgICAgKgogICAgICogTm90ZSB0aGF0IGJpbmRpbmcgc3ludGF4IGlzIG92ZXJyaWRhYmxlIHZpYSBgX3BhcnNlQmluZGluZ3NgIGFuZAogICAgICogYF9ldmFsdWF0ZUJpbmRpbmdgLiAgVGhpcyBtZXRob2Qgd2lsbCBjYWxsIGBfZXZhbHVhdGVCaW5kaW5nYCBmb3IgYW55CiAgICAgKiBub24tbGl0ZXJhbCBwYXJ0cyByZXR1cm5lZCBmcm9tIGBfcGFyc2VCaW5kaW5nc2AuICBIb3dldmVyLAogICAgICogdGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgX3BhdGhfIGJpbmRpbmdzIHZpYSBjdXN0b20gYmluZGluZyBwYXJ0cywKICAgICAqIGFzIHRoaXMgaXMgc3BlY2lmaWMgdG8gUG9seW1lcidzIHBhdGggYmluZGluZyBzeW50YXguCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IGluc3QgVGhlIGluc3RhbmNlIHRoZSBlZmZlY3Qgd2lsbCBiZSBydW4gb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIE5hbWUgb2YgcHJvcGVydHkKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2xkUHJvcHMgQmFnIG9mIHByZXZpb3VzIHZhbHVlcyBmb3IgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgKiBAcGFyYW0gez99IGluZm8gRWZmZWN0IG1ldGFkYXRhCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGhhc1BhdGhzIFRydWUgd2l0aCBgcHJvcHNgIGNvbnRhaW5zIG9uZSBvciBtb3JlIHBhdGhzCiAgICAgKiBAcGFyYW0ge0FycmF5fSBub2RlTGlzdCBMaXN0IG9mIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBgbm9kZUluZm9MaXN0YCB0ZW1wbGF0ZQogICAgICogICBtZXRhZGF0YQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1bkJpbmRpbmdFZmZlY3QoaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocywgbm9kZUxpc3QpIHsKICAgICAgbGV0IG5vZGUgPSBub2RlTGlzdFtpbmZvLmluZGV4XTsKICAgICAgbGV0IGJpbmRpbmcgPSBpbmZvLmJpbmRpbmc7CiAgICAgIGxldCBwYXJ0ID0gaW5mby5wYXJ0OwogICAgICAvLyBTdWJwYXRoIG5vdGlmaWNhdGlvbjogdHJhbnNmb3JtIHBhdGggYW5kIHNldCB0byBjbGllbnQKICAgICAgLy8gZS5nLjogZm9vPSJ7e29iai5zdWJ9fSIsIHBhdGg6ICdvYmouc3ViLnByb3AnLCBzZXQgJ2Zvby5wcm9wJz1vYmouc3ViLnByb3AKICAgICAgaWYgKGhhc1BhdGhzICYmIHBhcnQuc291cmNlICYmIChwYXRoLmxlbmd0aCA+IHBhcnQuc291cmNlLmxlbmd0aCkgJiYKICAgICAgICAgIChiaW5kaW5nLmtpbmQgPT0gJ3Byb3BlcnR5JykgJiYgIWJpbmRpbmcuaXNDb21wb3VuZCAmJgogICAgICAgICAgbm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgICBub2RlLl9fZGF0YUhhc0FjY2Vzc29yICYmIG5vZGUuX19kYXRhSGFzQWNjZXNzb3JbYmluZGluZy50YXJnZXRdKSB7CiAgICAgICAgbGV0IHZhbHVlID0gcHJvcHNbcGF0aF07CiAgICAgICAgcGF0aCA9IHRyYW5zbGF0ZShwYXJ0LnNvdXJjZSwgYmluZGluZy50YXJnZXQsIHBhdGgpOwogICAgICAgIGlmIChub2RlLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocGF0aCwgdmFsdWUsIGZhbHNlLCB0cnVlKSkgewogICAgICAgICAgaW5zdC5fZW5xdWV1ZUNsaWVudChub2RlKTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGV0IHZhbHVlID0gaW5mby5ldmFsdWF0b3IuX2V2YWx1YXRlQmluZGluZyhpbnN0LCBwYXJ0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAvLyBQcm9wYWdhdGUgdmFsdWUgdG8gY2hpbGQKICAgICAgICAvLyBBYm9ydCBpZiB2YWx1ZSBpcyBhIG5vLW9wIHJlc3VsdAogICAgICAgIGlmICh2YWx1ZSAhPT0gTk9PUCkgewogICAgICAgICAgYXBwbHlCaW5kaW5nVmFsdWUoaW5zdCwgbm9kZSwgYmluZGluZywgcGFydCwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogU2V0cyB0aGUgdmFsdWUgZm9yIGFuICJiaW5kaW5nIiAoYmluZGluZykgZWZmZWN0IHRvIGEgbm9kZSwKICAgICAqIGVpdGhlciBhcyBhIHByb3BlcnR5IG9yIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBUaGUgaW5zdGFuY2Ugb3duaW5nIHRoZSBiaW5kaW5nIGVmZmVjdAogICAgICogQHBhcmFtIHtOb2RlfSBub2RlIFRhcmdldCBub2RlIGZvciBiaW5kaW5nCiAgICAgKiBAcGFyYW0geyFCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7IUJpbmRpbmdQYXJ0fSBwYXJ0IEJpbmRpbmcgcGFydCBtZXRhZGF0YQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUJpbmRpbmdWYWx1ZShpbnN0LCBub2RlLCBiaW5kaW5nLCBwYXJ0LCB2YWx1ZSkgewogICAgICB2YWx1ZSA9IGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpOwogICAgICBpZiAoc2FuaXRpemVET01WYWx1ZSkgewogICAgICAgIHZhbHVlID0gc2FuaXRpemVET01WYWx1ZSh2YWx1ZSwgYmluZGluZy50YXJnZXQsIGJpbmRpbmcua2luZCwgbm9kZSk7CiAgICAgIH0KICAgICAgaWYgKGJpbmRpbmcua2luZCA9PSAnYXR0cmlidXRlJykgewogICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5nCiAgICAgICAgaW5zdC5fdmFsdWVUb05vZGVBdHRyaWJ1dGUoLyoqIEB0eXBlIHtFbGVtZW50fSAqLyhub2RlKSwgdmFsdWUsIGJpbmRpbmcudGFyZ2V0KTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBQcm9wZXJ0eSBiaW5kaW5nCiAgICAgICAgbGV0IHByb3AgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgICBpZiAobm9kZS5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ICYmCiAgICAgICAgICAgIG5vZGUuX19kYXRhSGFzQWNjZXNzb3IgJiYgbm9kZS5fX2RhdGFIYXNBY2Nlc3Nvcltwcm9wXSkgewogICAgICAgICAgaWYgKCFub2RlW1RZUEVTLlJFQURfT05MWV0gfHwgIW5vZGVbVFlQRVMuUkVBRF9PTkxZXVtwcm9wXSkgewogICAgICAgICAgICBpZiAobm9kZS5fc2V0UGVuZGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlKSkgewogICAgICAgICAgICAgIGluc3QuX2VucXVldWVDbGllbnQobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSW4gbGVnYWN5IG5vLWJhdGNoaW5nIG1vZGUsIGJpbmRpbmdzIGFwcGxpZWQgYmVmb3JlIGRhdGFSZWFkeSBhcmUKICAgICAgICAgIC8vIGVxdWl2YWxlbnQgdG8gdGhlICJhcHBseSBjb25maWciIHBoYXNlLCB3aGljaCBvbmx5IHNldCBtYW5hZ2VkIHByb3BzCiAgICAgICAgICBpbnN0Ll9zZXRVbm1hbmFnZWRQcm9wZXJ0eVRvTm9kZShub2RlLCBwcm9wLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIGFuICJiaW5kaW5nIiBlZmZlY3QgdmFsdWUgYmFzZWQgb24gY29tcG91bmQgJiBuZWdhdGlvbgogICAgICogZWZmZWN0IG1ldGFkYXRhLCBhcyB3ZWxsIGFzIGhhbmRsaW5nIGZvciBzcGVjaWFsLWNhc2UgcHJvcGVydGllcwogICAgICoKICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRoZSB2YWx1ZSB3aWxsIGJlIHNldCB0bwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAgICogQHBhcmFtIHshQmluZGluZ1BhcnR9IHBhcnQgQmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgKiBAcmV0dXJuIHsqfSBUcmFuc2Zvcm1lZCB2YWx1ZSB0byBzZXQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXB1dGVCaW5kaW5nVmFsdWUobm9kZSwgdmFsdWUsIGJpbmRpbmcsIHBhcnQpIHsKICAgICAgaWYgKGJpbmRpbmcuaXNDb21wb3VuZCkgewogICAgICAgIGxldCBzdG9yYWdlID0gbm9kZS5fX2RhdGFDb21wb3VuZFN0b3JhZ2VbYmluZGluZy50YXJnZXRdOwogICAgICAgIHN0b3JhZ2VbcGFydC5jb21wb3VuZEluZGV4XSA9IHZhbHVlOwogICAgICAgIHZhbHVlID0gc3RvcmFnZS5qb2luKCcnKTsKICAgICAgfQogICAgICBpZiAoYmluZGluZy5raW5kICE9PSAnYXR0cmlidXRlJykgewogICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgc2VyaWFsaXplIGB1bmRlZmluZWRgIHRvIGAidW5kZWZpbmVkImAKICAgICAgICBpZiAoYmluZGluZy50YXJnZXQgPT09ICd0ZXh0Q29udGVudCcgfHwKICAgICAgICAgICAgKGJpbmRpbmcudGFyZ2V0ID09PSAndmFsdWUnICYmCiAgICAgICAgICAgICAgKG5vZGUubG9jYWxOYW1lID09PSAnaW5wdXQnIHx8IG5vZGUubG9jYWxOYW1lID09PSAndGV4dGFyZWEnKSkpIHsKICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT0gdW5kZWZpbmVkID8gJycgOiB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIGEgYmluZGluZydzIG1ldGFkYXRhIG1lZXRzIGFsbCB0aGUgcmVxdWlyZW1lbnRzIHRvIGFsbG93CiAgICAgKiAyLXdheSBiaW5kaW5nLCBhbmQgdGhlcmVmb3JlIGEgYDxwcm9wZXJ0eT4tY2hhbmdlZGAgZXZlbnQgbGlzdGVuZXIgc2hvdWxkIGJlCiAgICAgKiBhZGRlZDoKICAgICAqIC0gdXNlZCBjdXJseSBicmFjZXMKICAgICAqIC0gaXMgYSBwcm9wZXJ0eSAobm90IGF0dHJpYnV0ZSkgYmluZGluZwogICAgICogLSBpcyBub3QgYSB0ZXh0Q29udGVudCBiaW5kaW5nCiAgICAgKiAtIGlzIG5vdCBjb21wb3VuZAogICAgICoKICAgICAqIEBwYXJhbSB7IUJpbmRpbmd9IGJpbmRpbmcgQmluZGluZyBtZXRhZGF0YQogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiAyLXdheSBsaXN0ZW5lciBzaG91bGQgYmUgYWRkZWQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNob3VsZEFkZExpc3RlbmVyKGJpbmRpbmcpIHsKICAgICAgcmV0dXJuIEJvb2xlYW4oYmluZGluZy50YXJnZXQpICYmCiAgICAgICAgICAgICBiaW5kaW5nLmtpbmQgIT0gJ2F0dHJpYnV0ZScgJiYKICAgICAgICAgICAgIGJpbmRpbmcua2luZCAhPSAndGV4dCcgJiYKICAgICAgICAgICAgICFiaW5kaW5nLmlzQ29tcG91bmQgJiYKICAgICAgICAgICAgIGJpbmRpbmcucGFydHNbMF0ubW9kZSA9PT0gJ3snOwogICAgfQoKICAgIC8qKgogICAgICogU2V0dXAgY29tcG91bmQgYmluZGluZyBzdG9yYWdlIHN0cnVjdHVyZXMsIG5vdGlmeSBsaXN0ZW5lcnMsIGFuZCBkYXRhSG9zdAogICAgICogcmVmZXJlbmNlcyBvbnRvIHRoZSBib3VuZCBub2RlTGlzdC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gaW5zdCBJbnN0YW5jZSB0aGF0IGJhcyBiZWVuIHByZXZpb3VzbHkKICAgICAqICAgICBib3VuZAogICAgICogQHBhcmFtIHtUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YQogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldHVwQmluZGluZ3MoaW5zdCwgdGVtcGxhdGVJbmZvKSB7CiAgICAgIC8vIFNldHVwIGNvbXBvdW5kIHN0b3JhZ2UsIGRhdGFIb3N0LCBhbmQgbm90aWZ5IGxpc3RlbmVycwogICAgICBsZXQge25vZGVMaXN0LCBub2RlSW5mb0xpc3R9ID0gdGVtcGxhdGVJbmZvOwogICAgICBpZiAobm9kZUluZm9MaXN0Lmxlbmd0aCkgewogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vZGVJbmZvTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IGluZm8gPSBub2RlSW5mb0xpc3RbaV07CiAgICAgICAgICBsZXQgbm9kZSA9IG5vZGVMaXN0W2ldOwogICAgICAgICAgbGV0IGJpbmRpbmdzID0gaW5mby5iaW5kaW5nczsKICAgICAgICAgIGlmIChiaW5kaW5ncykgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8YmluZGluZ3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsZXQgYmluZGluZyA9IGJpbmRpbmdzW2ldOwogICAgICAgICAgICAgIHNldHVwQ29tcG91bmRTdG9yYWdlKG5vZGUsIGJpbmRpbmcpOwogICAgICAgICAgICAgIGFkZE5vdGlmeUxpc3RlbmVyKG5vZGUsIGluc3QsIGJpbmRpbmcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGJvdW5kIGVsZW1lbnRzIGhhdmUgYSBob3N0IHNldCwgcmVnYXJkbGVzcwogICAgICAgICAgLy8gb2Ygd2hldGhlciB0aGV5IHVwZ3JhZGUgc3luY2hyb25vdXMgdG8gY3JlYXRpb24KICAgICAgICAgIG5vZGUuX19kYXRhSG9zdCA9IGluc3Q7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBgX19kYXRhQ29tcG91bmRTdG9yYWdlYCBsb2NhbCBzdG9yYWdlIG9uIGEgYm91bmQgbm9kZSB3aXRoCiAgICAgKiBpbml0aWFsIGxpdGVyYWwgZGF0YSBmb3IgY29tcG91bmQgYmluZGluZ3MsIGFuZCBzZXRzIHRoZSBqb2luZWQKICAgICAqIGxpdGVyYWwgcGFydHMgdG8gdGhlIGJvdW5kIHByb3BlcnR5LgogICAgICoKICAgICAqIFdoZW4gY2hhbmdlcyB0byBjb21wb3VuZCBwYXJ0cyBvY2N1ciwgdGhleSBhcmUgZmlyc3Qgc2V0IGludG8gdGhlIGNvbXBvdW5kCiAgICAgKiBzdG9yYWdlIGFycmF5IGZvciB0aGF0IHByb3BlcnR5LCBhbmQgdGhlbiB0aGUgYXJyYXkgaXMgam9pbmVkIHRvIHJlc3VsdCBpbgogICAgICogdGhlIGZpbmFsIHZhbHVlIHNldCB0byB0aGUgcHJvcGVydHkvYXR0cmlidXRlLgogICAgICoKICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBCb3VuZCBub2RlIHRvIGluaXRpYWxpemUKICAgICAqIEBwYXJhbSB7QmluZGluZ30gYmluZGluZyBCaW5kaW5nIG1ldGFkYXRhCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gc2V0dXBDb21wb3VuZFN0b3JhZ2Uobm9kZSwgYmluZGluZykgewogICAgICBpZiAoYmluZGluZy5pc0NvbXBvdW5kKSB7CiAgICAgICAgLy8gQ3JlYXRlIGNvbXBvdW5kIHN0b3JhZ2UgbWFwCiAgICAgICAgbGV0IHN0b3JhZ2UgPSBub2RlLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSB8fAogICAgICAgICAgKG5vZGUuX19kYXRhQ29tcG91bmRTdG9yYWdlID0ge30pOwogICAgICAgIGxldCBwYXJ0cyA9IGJpbmRpbmcucGFydHM7CiAgICAgICAgLy8gQ29weSBsaXRlcmFscyBmcm9tIHBhcnRzIGludG8gc3RvcmFnZSBmb3IgdGhpcyBiaW5kaW5nCiAgICAgICAgbGV0IGxpdGVyYWxzID0gbmV3IEFycmF5KHBhcnRzLmxlbmd0aCk7CiAgICAgICAgZm9yIChsZXQgaj0wOyBqPHBhcnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICBsaXRlcmFsc1tqXSA9IHBhcnRzW2pdLmxpdGVyYWw7CiAgICAgICAgfQogICAgICAgIGxldCB0YXJnZXQgPSBiaW5kaW5nLnRhcmdldDsKICAgICAgICBzdG9yYWdlW3RhcmdldF0gPSBsaXRlcmFsczsKICAgICAgICAvLyBDb25maWd1cmUgcHJvcGVydGllcyB3aXRoIHRoZWlyIGxpdGVyYWwgcGFydHMKICAgICAgICBpZiAoYmluZGluZy5saXRlcmFsICYmIGJpbmRpbmcua2luZCA9PSAncHJvcGVydHknKSB7CiAgICAgICAgICAvLyBOb3RlLCBjbGFzc05hbWUgbmVlZHMgc3R5bGUgc2NvcGluZyBzbyB0aGlzIG5lZWRzIHdyYXBwaW5nLgogICAgICAgICAgLy8gV2UgbWF5IGFsc28gd2FudCB0byBjb25zaWRlciBkb2luZyB0aGlzIGZvciBgdGV4dENvbnRlbnRgIGFuZAogICAgICAgICAgLy8gYGlubmVySFRNTGAuCiAgICAgICAgICBpZiAodGFyZ2V0ID09PSAnY2xhc3NOYW1lJykgewogICAgICAgICAgICBub2RlID0gd3JhcChub2RlKTsKICAgICAgICAgIH0KICAgICAgICAgIG5vZGVbdGFyZ2V0XSA9IGJpbmRpbmcubGl0ZXJhbDsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFkZHMgYSAyLXdheSBiaW5kaW5nIG5vdGlmaWNhdGlvbiBldmVudCBsaXN0ZW5lciB0byB0aGUgbm9kZSBzcGVjaWZpZWQKICAgICAqCiAgICAgKiBAcGFyYW0ge09iamVjdH0gbm9kZSBDaGlsZCBlbGVtZW50IHRvIGFkZCBsaXN0ZW5lciB0bwogICAgICogQHBhcmFtIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IGluc3QgSG9zdCBlbGVtZW50IGluc3RhbmNlIHRvIGhhbmRsZQogICAgICogICAgIG5vdGlmaWNhdGlvbiBldmVudAogICAgICogQHBhcmFtIHtCaW5kaW5nfSBiaW5kaW5nIEJpbmRpbmcgbWV0YWRhdGEKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBhZGROb3RpZnlMaXN0ZW5lcihub2RlLCBpbnN0LCBiaW5kaW5nKSB7CiAgICAgIGlmIChiaW5kaW5nLmxpc3RlbmVyRXZlbnQpIHsKICAgICAgICBsZXQgcGFydCA9IGJpbmRpbmcucGFydHNbMF07CiAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGJpbmRpbmcubGlzdGVuZXJFdmVudCwgZnVuY3Rpb24oZSkgewogICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uKGUsIGluc3QsIGJpbmRpbmcudGFyZ2V0LCBwYXJ0LnNvdXJjZSwgcGFydC5uZWdhdGUpOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CgogICAgLy8gLS0gZm9yIG1ldGhvZC1iYXNlZCBlZmZlY3RzIChjb21wbGV4T2JzZXJ2ZXIgJiBjb21wdXRlZCkgLS0tLS0tLS0tLS0tLS0KCiAgICAvKioKICAgICAqIEFkZHMgcHJvcGVydHkgZWZmZWN0cyBmb3IgZWFjaCBhcmd1bWVudCBpbiB0aGUgbWV0aG9kIHNpZ25hdHVyZSAoYW5kCiAgICAgKiBvcHRpb25hbGx5LCBmb3IgdGhlIG1ldGhvZCBuYW1lIGlmIGBkeW5hbWljYCBpcyB0cnVlKSB0aGF0IGNhbGxzIHRoZQogICAgICogcHJvdmlkZWQgZWZmZWN0IGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7RWxlbWVudCB8IE9iamVjdH0gbW9kZWwgUHJvdG90eXBlIG9yIGluc3RhbmNlCiAgICAgKiBAcGFyYW0geyFNZXRob2RTaWduYXR1cmV9IHNpZyBNZXRob2Qgc2lnbmF0dXJlIG1ldGFkYXRhCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBUeXBlIG9mIHByb3BlcnR5IGVmZmVjdCB0byBhZGQKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVmZmVjdEZuIEZ1bmN0aW9uIHRvIHJ1biB3aGVuIGFyZ3VtZW50cyBjaGFuZ2UKICAgICAqIEBwYXJhbSB7Kj19IG1ldGhvZEluZm8gRWZmZWN0LXNwZWNpZmljIGluZm9ybWF0aW9uIHRvIGJlIGluY2x1ZGVkIGluCiAgICAgKiAgIG1ldGhvZCBlZmZlY3QgbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcgd2hldGhlcgogICAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LiBOb3RlLAogICAgICogICBkZWZhdWx0cyB0byB0cnVlIGlmIHRoZSBzaWduYXR1cmUgaXMgc3RhdGljIChzaWcuc3RhdGljIGlzIHRydWUpLgogICAgICogQHJldHVybiB7IU9iamVjdH0gRWZmZWN0IG1ldGFkYXRhIGZvciB0aGlzIG1ldGhvZCBlZmZlY3QKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZU1ldGhvZEVmZmVjdChtb2RlbCwgc2lnLCB0eXBlLCBlZmZlY3RGbiwgbWV0aG9kSW5mbywgZHluYW1pY0ZuKSB7CiAgICAgIGR5bmFtaWNGbiA9IHNpZy5zdGF0aWMgfHwgKGR5bmFtaWNGbiAmJgogICAgICAgICh0eXBlb2YgZHluYW1pY0ZuICE9PSAnb2JqZWN0JyB8fCBkeW5hbWljRm5bc2lnLm1ldGhvZE5hbWVdKSk7CiAgICAgIGxldCBpbmZvID0gewogICAgICAgIG1ldGhvZE5hbWU6IHNpZy5tZXRob2ROYW1lLAogICAgICAgIGFyZ3M6IHNpZy5hcmdzLAogICAgICAgIG1ldGhvZEluZm8sCiAgICAgICAgZHluYW1pY0ZuCiAgICAgIH07CiAgICAgIGZvciAobGV0IGk9MCwgYXJnOyAoaTxzaWcuYXJncy5sZW5ndGgpICYmIChhcmc9c2lnLmFyZ3NbaV0pOyBpKyspIHsKICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICBtb2RlbC5fYWRkUHJvcGVydHlFZmZlY3QoYXJnLnJvb3RQcm9wZXJ0eSwgdHlwZSwgewogICAgICAgICAgICBmbjogZWZmZWN0Rm4sIGluZm86IGluZm8sIHRyaWdnZXI6IGFyZwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChkeW5hbWljRm4pIHsKICAgICAgICBtb2RlbC5fYWRkUHJvcGVydHlFZmZlY3Qoc2lnLm1ldGhvZE5hbWUsIHR5cGUsIHsKICAgICAgICAgIGZuOiBlZmZlY3RGbiwgaW5mbzogaW5mbwogICAgICAgIH0pOwogICAgICB9CiAgICAgIHJldHVybiBpbmZvOwogICAgfQoKICAgIC8qKgogICAgICogQ2FsbHMgYSBtZXRob2Qgd2l0aCBhcmd1bWVudHMgbWFyc2hhbGVkIGZyb20gcHJvcGVydGllcyBvbiB0aGUgaW5zdGFuY2UKICAgICAqIGJhc2VkIG9uIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGNvbnRhaW5lZCBpbiB0aGUgZWZmZWN0IG1ldGFkYXRhLgogICAgICoKICAgICAqIE11bHRpLXByb3BlcnR5IG9ic2VydmVycywgY29tcHV0ZWQgcHJvcGVydGllcywgYW5kIGlubGluZSBjb21wdXRpbmcKICAgICAqIGZ1bmN0aW9ucyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gaW52b2tlIHRoZSBtZXRob2QsIHRoZW4gdXNlIHRoZSByZXR1cm4KICAgICAqIHZhbHVlIGFjY29yZGluZ2x5LgogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IFRoZSBpbnN0YW5jZSB0aGUgZWZmZWN0IHdpbGwgYmUgcnVuIG9uCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiBwcm9wZXJ0eQogICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIEJhZyBvZiBjdXJyZW50IHByb3BlcnR5IGNoYW5nZXMKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBjaGFuZ2VkIHByb3BlcnRpZXMKICAgICAqIEBwYXJhbSB7P30gaW5mbyBFZmZlY3QgbWV0YWRhdGEKICAgICAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHRoZSBtZXRob2QgaW52b2NhdGlvbgogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcnVuTWV0aG9kRWZmZWN0KGluc3QsIHByb3BlcnR5LCBwcm9wcywgb2xkUHJvcHMsIGluZm8pIHsKICAgICAgLy8gSW5zdGFuY2VzIGNhbiBvcHRpb25hbGx5IGhhdmUgYSBfbWV0aG9kSG9zdCB3aGljaCBhbGxvd3MgcmVkaXJlY3Rpbmcgd2hlcmUKICAgICAgLy8gdG8gZmluZCBtZXRob2RzLiBDdXJyZW50bHkgdXNlZCBieSBgdGVtcGxhdGl6ZWAuCiAgICAgIGxldCBjb250ZXh0ID0gaW5zdC5fbWV0aG9kSG9zdCB8fCBpbnN0OwogICAgICBsZXQgZm4gPSBjb250ZXh0W2luZm8ubWV0aG9kTmFtZV07CiAgICAgIGlmIChmbikgewogICAgICAgIGxldCBhcmdzID0gaW5zdC5fbWFyc2hhbEFyZ3MoaW5mby5hcmdzLCBwcm9wZXJ0eSwgcHJvcHMpOwogICAgICAgIHJldHVybiBhcmdzID09PSBOT09QID8gTk9PUCA6IGZuLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgICB9IGVsc2UgaWYgKCFpbmZvLmR5bmFtaWNGbikgewogICAgICAgIGNvbnNvbGUud2FybignbWV0aG9kIGAnICsgaW5mby5tZXRob2ROYW1lICsgJ2Agbm90IGRlZmluZWQnKTsKICAgICAgfQogICAgfQoKICAgIGNvbnN0IGVtcHR5QXJyYXkgPSBbXTsKCiAgICAvLyBSZWd1bGFyIGV4cHJlc3Npb25zIHVzZWQgZm9yIGJpbmRpbmcKICAgIGNvbnN0IElERU5UICA9ICcoPzonICsgJ1thLXpBLVpfJF1bXFx3LjokXFwtKl0qJyArICcpJzsKICAgIGNvbnN0IE5VTUJFUiA9ICcoPzonICsgJ1stK10/WzAtOV0qXFwuP1swLTldKyg/OltlRV1bLStdP1swLTldKyk/JyArICcpJzsKICAgIGNvbnN0IFNRVU9URV9TVFJJTkcgPSAnKD86JyArICdcJyg/OlteXCdcXFxcXXxcXFxcLikqXCcnICsgJyknOwogICAgY29uc3QgRFFVT1RFX1NUUklORyA9ICcoPzonICsgJyIoPzpbXiJcXFxcXXxcXFxcLikqIicgKyAnKSc7CiAgICBjb25zdCBTVFJJTkcgPSAnKD86JyArIFNRVU9URV9TVFJJTkcgKyAnfCcgKyBEUVVPVEVfU1RSSU5HICsgJyknOwogICAgY29uc3QgQVJHVU1FTlQgPSAnKD86KCcgKyBJREVOVCArICd8JyArIE5VTUJFUiArICd8JyArICBTVFJJTkcgKyAnKVxccyonICsgJyknOwogICAgY29uc3QgQVJHVU1FTlRTID0gJyg/OicgKyBBUkdVTUVOVCArICcoPzosXFxzKicgKyBBUkdVTUVOVCArICcpKicgKyAnKSc7CiAgICBjb25zdCBBUkdVTUVOVF9MSVNUID0gJyg/OicgKyAnXFwoXFxzKicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyg/OicgKyBBUkdVTUVOVFMgKyAnPycgKyAnKScgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcXClcXHMqJyArICcpJzsKICAgIGNvbnN0IEJJTkRJTkcgPSAnKCcgKyBJREVOVCArICdcXHMqJyArIEFSR1VNRU5UX0xJU1QgKyAnPycgKyAnKSc7IC8vIEdyb3VwIDMKICAgIGNvbnN0IE9QRU5fQlJBQ0tFVCA9ICcoXFxbXFxbfHt7KScgKyAnXFxzKic7CiAgICBjb25zdCBDTE9TRV9CUkFDS0VUID0gJyg/Ol1dfH19KSc7CiAgICBjb25zdCBORUdBVEUgPSAnKD86KCEpXFxzKik/JzsgLy8gR3JvdXAgMgogICAgY29uc3QgRVhQUkVTU0lPTiA9IE9QRU5fQlJBQ0tFVCArIE5FR0FURSArIEJJTkRJTkcgKyBDTE9TRV9CUkFDS0VUOwogICAgY29uc3QgYmluZGluZ1JlZ2V4ID0gbmV3IFJlZ0V4cChFWFBSRVNTSU9OLCAiZyIpOwoKICAgIC8qKgogICAgICogQ3JlYXRlIGEgc3RyaW5nIGZyb20gYmluZGluZyBwYXJ0cyBvZiBhbGwgdGhlIGxpdGVyYWwgcGFydHMKICAgICAqCiAgICAgKiBAcGFyYW0geyFBcnJheTxCaW5kaW5nUGFydD59IHBhcnRzIEFsbCBwYXJ0cyB0byBzdHJpbmdpZnkKICAgICAqIEByZXR1cm4ge3N0cmluZ30gU3RyaW5nIG1hZGUgZnJvbSB0aGUgbGl0ZXJhbCBwYXJ0cwogICAgICovCiAgICBmdW5jdGlvbiBsaXRlcmFsRnJvbVBhcnRzKHBhcnRzKSB7CiAgICAgIGxldCBzID0gJyc7CiAgICAgIGZvciAobGV0IGk9MDsgaTxwYXJ0cy5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBsaXRlcmFsID0gcGFydHNbaV0ubGl0ZXJhbDsKICAgICAgICBzICs9IGxpdGVyYWwgfHwgJyc7CiAgICAgIH0KICAgICAgcmV0dXJuIHM7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYW4gZXhwcmVzc2lvbiBzdHJpbmcgZm9yIGEgbWV0aG9kIHNpZ25hdHVyZSwgYW5kIHJldHVybnMgYSBtZXRhZGF0YQogICAgICogZGVzY3JpYmluZyB0aGUgbWV0aG9kIGluIHRlcm1zIG9mIGBtZXRob2ROYW1lYCwgYHN0YXRpY2AgKHdoZXRoZXIgYWxsIHRoZQogICAgICogYXJndW1lbnRzIGFyZSBsaXRlcmFscyksIGFuZCBhbiBhcnJheSBvZiBgYXJnc2AKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBUaGUgZXhwcmVzc2lvbiB0byBwYXJzZQogICAgICogQHJldHVybiB7P01ldGhvZFNpZ25hdHVyZX0gVGhlIG1ldGhvZCBtZXRhZGF0YSBvYmplY3QgaWYgYSBtZXRob2QgZXhwcmVzc2lvbiB3YXMKICAgICAqICAgZm91bmQsIG90aGVyd2lzZSBgdW5kZWZpbmVkYAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VNZXRob2QoZXhwcmVzc2lvbikgewogICAgICAvLyB0cmllcyB0byBtYXRjaCB2YWxpZCBqYXZhc2NyaXB0IHByb3BlcnR5IG5hbWVzCiAgICAgIGxldCBtID0gZXhwcmVzc2lvbi5tYXRjaCgvKFteXHNdKz8pXCgoW1xzXFNdKilcKS8pOwogICAgICBpZiAobSkgewogICAgICAgIGxldCBtZXRob2ROYW1lID0gbVsxXTsKICAgICAgICBsZXQgc2lnID0geyBtZXRob2ROYW1lLCBzdGF0aWM6IHRydWUsIGFyZ3M6IGVtcHR5QXJyYXkgfTsKICAgICAgICBpZiAobVsyXS50cmltKCkpIHsKICAgICAgICAgIC8vIHJlcGxhY2UgZXNjYXBlZCBjb21tYXMgd2l0aCBjb21tYSBlbnRpdHksIHNwbGl0IG9uIHVuLWVzY2FwZWQgY29tbWFzCiAgICAgICAgICBsZXQgYXJncyA9IG1bMl0ucmVwbGFjZSgvXFwsL2csICcmY29tbWE7Jykuc3BsaXQoJywnKTsKICAgICAgICAgIHJldHVybiBwYXJzZUFyZ3MoYXJncywgc2lnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIHNpZzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBQYXJzZXMgYW4gYXJyYXkgb2YgYXJndW1lbnRzIGFuZCBzZXRzIHRoZSBgYXJnc2AgcHJvcGVydHkgb2YgdGhlIHN1cHBsaWVkCiAgICAgKiBzaWduYXR1cmUgbWV0YWRhdGEgb2JqZWN0LiBTZXRzIHRoZSBgc3RhdGljYCBwcm9wZXJ0eSB0byBmYWxzZSBpZiBhbnkKICAgICAqIGFyZ3VtZW50IGlzIGEgbm9uLWxpdGVyYWwuCiAgICAgKgogICAgICogQHBhcmFtIHshQXJyYXk8c3RyaW5nPn0gYXJnTGlzdCBBcnJheSBvZiBhcmd1bWVudCBuYW1lcwogICAgICogQHBhcmFtIHshTWV0aG9kU2lnbmF0dXJlfSBzaWcgTWV0aG9kIHNpZ25hdHVyZSBtZXRhZGF0YSBvYmplY3QKICAgICAqIEByZXR1cm4geyFNZXRob2RTaWduYXR1cmV9IFRoZSB1cGRhdGVkIHNpZ25hdHVyZSBtZXRhZGF0YSBvYmplY3QKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlQXJncyhhcmdMaXN0LCBzaWcpIHsKICAgICAgc2lnLmFyZ3MgPSBhcmdMaXN0Lm1hcChmdW5jdGlvbihyYXdBcmcpIHsKICAgICAgICBsZXQgYXJnID0gcGFyc2VBcmcocmF3QXJnKTsKICAgICAgICBpZiAoIWFyZy5saXRlcmFsKSB7CiAgICAgICAgICBzaWcuc3RhdGljID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcmc7CiAgICAgIH0sIHRoaXMpOwogICAgICByZXR1cm4gc2lnOwogICAgfQoKICAgIC8qKgogICAgICogUGFyc2VzIGFuIGluZGl2aWR1YWwgYXJndW1lbnQsIGFuZCByZXR1cm5zIGFuIGFyZ3VtZW50IG1ldGFkYXRhIG9iamVjdAogICAgICogd2l0aCB0aGUgZm9sbG93aW5nIGZpZWxkczoKICAgICAqCiAgICAgKiAgIHsKICAgICAqICAgICB2YWx1ZTogJ3Byb3AnLCAgICAgICAgLy8gcHJvcGVydHkvcGF0aCBvciBsaXRlcmFsIHZhbHVlCiAgICAgKiAgICAgbGl0ZXJhbDogZmFsc2UsICAgICAgIC8vIHdoZXRoZXIgYXJndW1lbnQgaXMgYSBsaXRlcmFsCiAgICAgKiAgICAgc3RydWN0dXJlZDogZmFsc2UsICAgIC8vIHdoZXRoZXIgdGhlIHByb3BlcnR5IGlzIGEgcGF0aAogICAgICogICAgIHJvb3RQcm9wZXJ0eTogJ3Byb3AnLCAvLyB0aGUgcm9vdCBwcm9wZXJ0eSBvZiB0aGUgcGF0aAogICAgICogICAgIHdpbGRjYXJkOiBmYWxzZSAgICAgICAvLyB3aGV0aGVyIHRoZSBhcmd1bWVudCB3YXMgYSB3aWxkY2FyZCAnLionIHBhdGgKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSByYXdBcmcgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgYXJndW1lbnQKICAgICAqIEByZXR1cm4geyFNZXRob2RBcmd9IEFyZ3VtZW50IG1ldGFkYXRhIG9iamVjdAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VBcmcocmF3QXJnKSB7CiAgICAgIC8vIGNsZWFuIHVwIHdoaXRlc3BhY2UKICAgICAgbGV0IGFyZyA9IHJhd0FyZy50cmltKCkKICAgICAgICAvLyByZXBsYWNlIGNvbW1hIGVudGl0eSB3aXRoIGNvbW1hCiAgICAgICAgLnJlcGxhY2UoLyZjb21tYTsvZywgJywnKQogICAgICAgIC8vIHJlcGFpciBleHRyYSBlc2NhcGUgc2VxdWVuY2VzOyBub3RlIG9ubHkgY29tbWFzIHN0cmljdGx5IG5lZWQKICAgICAgICAvLyBlc2NhcGluZywgYnV0IHdlIGFsbG93IGFueSBvdGhlciBjaGFyIHRvIGJlIGVzY2FwZWQgc2luY2UgaXRzCiAgICAgICAgLy8gbGlrZWx5IHVzZXJzIHdpbGwgZG8gdGhpcwogICAgICAgIC5yZXBsYWNlKC9cXCguKS9nLCAnXCQxJykKICAgICAgICA7CiAgICAgIC8vIGJhc2ljIGFyZ3VtZW50IGRlc2NyaXB0b3IKICAgICAgbGV0IGEgPSB7CiAgICAgICAgbmFtZTogYXJnLAogICAgICAgIHZhbHVlOiAnJywKICAgICAgICBsaXRlcmFsOiBmYWxzZQogICAgICB9OwogICAgICAvLyBkZXRlY3QgbGl0ZXJhbCB2YWx1ZSAobXVzdCBiZSBTdHJpbmcgb3IgTnVtYmVyKQogICAgICBsZXQgZmMgPSBhcmdbMF07CiAgICAgIGlmIChmYyA9PT0gJy0nKSB7CiAgICAgICAgZmMgPSBhcmdbMV07CiAgICAgIH0KICAgICAgaWYgKGZjID49ICcwJyAmJiBmYyA8PSAnOScpIHsKICAgICAgICBmYyA9ICcjJzsKICAgICAgfQogICAgICBzd2l0Y2goZmMpIHsKICAgICAgICBjYXNlICInIjoKICAgICAgICBjYXNlICciJzoKICAgICAgICAgIGEudmFsdWUgPSBhcmcuc2xpY2UoMSwgLTEpOwogICAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgJyMnOgogICAgICAgICAgYS52YWx1ZSA9IE51bWJlcihhcmcpOwogICAgICAgICAgYS5saXRlcmFsID0gdHJ1ZTsKICAgICAgICAgIGJyZWFrOwogICAgICB9CiAgICAgIC8vIGlmIG5vdCBsaXRlcmFsLCBsb29rIGZvciBzdHJ1Y3R1cmVkIHBhdGgKICAgICAgaWYgKCFhLmxpdGVyYWwpIHsKICAgICAgICBhLnJvb3RQcm9wZXJ0eSA9IHJvb3QoYXJnKTsKICAgICAgICAvLyBkZXRlY3Qgc3RydWN0dXJlZCBwYXRoIChoYXMgZG90cykKICAgICAgICBhLnN0cnVjdHVyZWQgPSBpc1BhdGgoYXJnKTsKICAgICAgICBpZiAoYS5zdHJ1Y3R1cmVkKSB7CiAgICAgICAgICBhLndpbGRjYXJkID0gKGFyZy5zbGljZSgtMikgPT0gJy4qJyk7CiAgICAgICAgICBpZiAoYS53aWxkY2FyZCkgewogICAgICAgICAgICBhLm5hbWUgPSBhcmcuc2xpY2UoMCwgLTIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRBcmdWYWx1ZShkYXRhLCBwcm9wcywgcGF0aCkgewogICAgICBsZXQgdmFsdWUgPSBnZXQoZGF0YSwgcGF0aCk7CiAgICAgIC8vIHdoZW4gZGF0YSBpcyBub3Qgc3RvcmVkIGUuZy4gYHNwbGljZXNgLCBnZXQgdGhlIHZhbHVlIGZyb20gY2hhbmdlZFByb3BzCiAgICAgIC8vIFRPRE8oa3NjaGFhZik6IE5vdGUsIHRoaXMgY2FuIGNhdXNlIGEgcmFyZSBpc3N1ZSB3aGVyZSB0aGUgd2lsZGNhcmQKICAgICAgLy8gaW5mby52YWx1ZSBjb3VsZCBwdWxsIGEgc3RhbGUgdmFsdWUgb3V0IG9mIGNoYW5nZWRQcm9wcyBkdXJpbmcgYSByZWVudHJhbnQKICAgICAgLy8gY2hhbmdlIHRoYXQgc2V0cyB0aGUgdmFsdWUgYmFjayB0byB1bmRlZmluZWQuCiAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyL3BvbHltZXIvaXNzdWVzLzU0NzkKICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICB2YWx1ZSA9IHByb3BzW3BhdGhdOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICAvLyBkYXRhIGFwaQoKICAgIC8qKgogICAgICogU2VuZHMgYXJyYXkgc3BsaWNlIG5vdGlmaWNhdGlvbnMgKGAuc3BsaWNlc2AgYW5kIGAubGVuZ3RoYCkKICAgICAqCiAgICAgKiBOb3RlOiB0aGlzIGltcGxlbWVudGF0aW9uIG9ubHkgYWNjZXB0cyBub3JtYWxpemVkIHBhdGhzCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IGluc3QgSW5zdGFuY2UgdG8gc2VuZCBub3RpZmljYXRpb25zIHRvCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdGhlIG11dGF0aW9ucyBvY2N1cnJlZCBvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gdGhlIGFycmF5IHRoYXQgd2FzIG11dGF0ZWQKICAgICAqIEBwYXJhbSB7QXJyYXl9IHNwbGljZXMgQXJyYXkgb2Ygc3BsaWNlIHJlY29yZHMKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBub3RpZnlTcGxpY2VzKGluc3QsIGFycmF5LCBwYXRoLCBzcGxpY2VzKSB7CiAgICAgIGNvbnN0IHNwbGljZXNEYXRhID0geyBpbmRleFNwbGljZXM6IHNwbGljZXMgfTsKICAgICAgLy8gTGVnYWN5IGJlaGF2aW9yIHN0b3JlZCBzcGxpY2VzIGluIGBfX2RhdGFfX2Agc28gaXQgd2FzICpub3QqIGVwaGVtZXJhbC4KICAgICAgLy8gVG8gbWF0Y2ggdGhpcyBiZWhhdmlvciwgd2Ugc3RvcmUgc3BsaWNlcyBkaXJlY3RseSBvbiB0aGUgYXJyYXkuCiAgICAgIGlmIChsZWdhY3lVbmRlZmluZWQgJiYgIWluc3QuX292ZXJyaWRlTGVnYWN5VW5kZWZpbmVkKSB7CiAgICAgICAgYXJyYXkuc3BsaWNlcyA9IHNwbGljZXNEYXRhOwogICAgICB9CiAgICAgIGluc3Qubm90aWZ5UGF0aChwYXRoICsgJy5zcGxpY2VzJywgc3BsaWNlc0RhdGEpOwogICAgICBpbnN0Lm5vdGlmeVBhdGgocGF0aCArICcubGVuZ3RoJywgYXJyYXkubGVuZ3RoKTsKICAgICAgLy8gQ2xlYXIgc3BsaWNlIGRhdGEgb25seSB3aGVuIGl0J3Mgc3RvcmVkIG9uIHRoZSBhcnJheS4KICAgICAgaWYgKGxlZ2FjeVVuZGVmaW5lZCAmJiAhaW5zdC5fb3ZlcnJpZGVMZWdhY3lVbmRlZmluZWQpIHsKICAgICAgICBzcGxpY2VzRGF0YS5pbmRleFNwbGljZXMgPSBbXTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHNwbGljZSByZWNvcmQgYW5kIHNlbmRzIGFuIGFycmF5IHNwbGljZSBub3RpZmljYXRpb24gZm9yCiAgICAgKiB0aGUgZGVzY3JpYmVkIG11dGF0aW9uCiAgICAgKgogICAgICogTm90ZTogdGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IGFjY2VwdHMgbm9ybWFsaXplZCBwYXRocwogICAgICoKICAgICAqIEBwYXJhbSB7IVBvbHltZXJfUHJvcGVydHlFZmZlY3RzfSBpbnN0IEluc3RhbmNlIHRvIHNlbmQgbm90aWZpY2F0aW9ucyB0bwogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRoZSBtdXRhdGlvbnMgb2NjdXJyZWQgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIHRoZSBhcnJheSB0aGF0IHdhcyBtdXRhdGVkCiAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggSW5kZXggYXQgd2hpY2ggdGhlIGFycmF5IG11dGF0aW9uIG9jY3VycmVkCiAgICAgKiBAcGFyYW0ge251bWJlcn0gYWRkZWRDb3VudCBOdW1iZXIgb2YgYWRkZWQgaXRlbXMKICAgICAqIEBwYXJhbSB7QXJyYXl9IHJlbW92ZWQgQXJyYXkgb2YgcmVtb3ZlZCBpdGVtcwogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vdGlmeVNwbGljZShpbnN0LCBhcnJheSwgcGF0aCwgaW5kZXgsIGFkZGVkQ291bnQsIHJlbW92ZWQpIHsKICAgICAgbm90aWZ5U3BsaWNlcyhpbnN0LCBhcnJheSwgcGF0aCwgW3sKICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgYWRkZWRDb3VudDogYWRkZWRDb3VudCwKICAgICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICAgIG9iamVjdDogYXJyYXksCiAgICAgICAgdHlwZTogJ3NwbGljZScKICAgICAgfV0pOwogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyBhbiB1cHBlci1jYXNlZCB2ZXJzaW9uIG9mIHRoZSBzdHJpbmcuCiAgICAgKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgU3RyaW5nIHRvIHVwcGVyY2FzZQogICAgICogQHJldHVybiB7c3RyaW5nfSBVcHBlcmNhc2VkIHN0cmluZwogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gdXBwZXIobmFtZSkgewogICAgICByZXR1cm4gbmFtZVswXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zdWJzdHJpbmcoMSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgbWV0YS1wcm9ncmFtbWluZyBmb3IgUG9seW1lcidzIHRlbXBsYXRlCiAgICAgKiBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIChjb2xsZWN0aXZlbHksICJwcm9wZXJ0eSBlZmZlY3RzIikgc3lzdGVtLgogICAgICoKICAgICAqIFRoaXMgbWl4aW4gdXNlcyBwcm92aWRlcyB0aGUgZm9sbG93aW5nIGtleSBzdGF0aWMgbWV0aG9kcyBmb3IgYWRkaW5nCiAgICAgKiBwcm9wZXJ0eSBlZmZlY3RzIHRvIGFuIGVsZW1lbnQgY2xhc3M6CiAgICAgKiAtIGBhZGRQcm9wZXJ0eUVmZmVjdGAKICAgICAqIC0gYGNyZWF0ZVByb3BlcnR5T2JzZXJ2ZXJgCiAgICAgKiAtIGBjcmVhdGVNZXRob2RPYnNlcnZlcmAKICAgICAqIC0gYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YAogICAgICogLSBgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eWAKICAgICAqIC0gYGNyZWF0ZVJlZmxlY3RlZFByb3BlcnR5YAogICAgICogLSBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAKICAgICAqIC0gYGJpbmRUZW1wbGF0ZWAKICAgICAqCiAgICAgKiBFYWNoIG1ldGhvZCBjcmVhdGVzIG9uZSBvciBtb3JlIHByb3BlcnR5IGFjY2Vzc29ycywgYWxvbmcgd2l0aCBtZXRhZGF0YQogICAgICogdXNlZCBieSB0aGlzIG1peGluJ3MgaW1wbGVtZW50YXRpb24gb2YgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgdG8gcGVyZm9ybQogICAgICogdGhlIHByb3BlcnR5IGVmZmVjdHMuCiAgICAgKgogICAgICogVW5kZXJzY29yZWQgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIG1ldGhvZHMgYWxzbyBleGlzdCBvbiB0aGUgZWxlbWVudAogICAgICogcHJvdG90eXBlIGZvciBhZGRpbmcgcHJvcGVydHkgZWZmZWN0cyBvbiBpbnN0YW5jZXMgYXQgcnVudGltZS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBtaXhpbiBvdmVycmlkZXMgc2V2ZXJhbCBgUHJvcGVydHlBY2Nlc3NvcnNgIG1ldGhvZHMsIGluCiAgICAgKiBtYW55IGNhc2VzIHRvIG1haW50YWluIGd1YXJhbnRlZXMgcHJvdmlkZWQgYnkgdGhlIFBvbHltZXIgMS54IGZlYXR1cmVzOwogICAgICogbm90YWJseSBpdCBjaGFuZ2VzIHByb3BlcnR5IGFjY2Vzc29ycyB0byBiZSBzeW5jaHJvbm91cyBieSBkZWZhdWx0CiAgICAgKiB3aGVyZWFzIHRoZSBkZWZhdWx0IHdoZW4gdXNpbmcgYFByb3BlcnR5QWNjZXNzb3JzYCBzdGFuZGFsb25lIGlzIHRvIGJlCiAgICAgKiBhc3luYyBieSBkZWZhdWx0LgogICAgICoKICAgICAqIEBtaXhpbkZ1bmN0aW9uCiAgICAgKiBAcG9seW1lcgogICAgICogQGFwcGxpZXNNaXhpbiBUZW1wbGF0ZVN0YW1wCiAgICAgKiBAYXBwbGllc01peGluIFByb3BlcnR5QWNjZXNzb3JzCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgbWV0YS1wcm9ncmFtbWluZyBmb3IgUG9seW1lcidzCiAgICAgKiB0ZW1wbGF0ZSBiaW5kaW5nIGFuZCBkYXRhIG9ic2VydmF0aW9uIHN5c3RlbS4KICAgICAqLwogICAgY29uc3QgUHJvcGVydHlFZmZlY3RzID0gZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlBY2Nlc3NvcnN9CiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1RlbXBsYXRlU3RhbXB9CiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGNvbnN0IHByb3BlcnR5RWZmZWN0c0Jhc2UgPSBUZW1wbGF0ZVN0YW1wKFByb3BlcnR5QWNjZXNzb3JzKHN1cGVyQ2xhc3MpKTsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgICAqIEBleHRlbmRzIHtwcm9wZXJ0eUVmZmVjdHNCYXNlfQogICAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgICAqLwogICAgICBjbGFzcyBQcm9wZXJ0eUVmZmVjdHMgZXh0ZW5kcyBwcm9wZXJ0eUVmZmVjdHNCYXNlIHsKCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgICAgICAgLy8gVXNlZCB0byBpZGVudGlmeSB1c2VycyBvZiB0aGlzIG1peGluLCBhbGEgaW5zdGFuY2VvZgogICAgICAgICAgdGhpcy5fX2lzUHJvcGVydHlFZmZlY3RzQ2xpZW50ID0gdHJ1ZTsKICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbn0gKi8KICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5OwogICAgICAgICAgLyoqIEB0eXBlIHtBcnJheX0gKi8KICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHM7CiAgICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnk7CiAgICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHM7CiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgICB0aGlzLl9fZGF0YUhhc1BhdGhzOwogICAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgICB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZTsKICAgICAgICAgIC8qKiBAdHlwZSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9ICovCiAgICAgICAgICB0aGlzLl9fZGF0YUhvc3Q7CiAgICAgICAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICAgICAgICB0aGlzLl9fZGF0YVRlbXA7CiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNJbml0aWFsaXplZDsKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdH0gKi8KICAgICAgICAgIHRoaXMuX19kYXRhOwogICAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fG51bGx9ICovCiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmc7CiAgICAgICAgICAvKiogQHR5cGUgeyFPYmplY3R9ICovCiAgICAgICAgICB0aGlzLl9fZGF0YU9sZDsKICAgICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgICAgdGhpcy5fX2NvbXB1dGVFZmZlY3RzOwogICAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgICB0aGlzLl9fY29tcHV0ZUluZm87CiAgICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICAgIHRoaXMuX19yZWZsZWN0RWZmZWN0czsKICAgICAgICAgIC8qKiBAdHlwZSB7T2JqZWN0fSAqLwogICAgICAgICAgdGhpcy5fX25vdGlmeUVmZmVjdHM7CiAgICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICAgIHRoaXMuX19wcm9wYWdhdGVFZmZlY3RzOwogICAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICovCiAgICAgICAgICB0aGlzLl9fb2JzZXJ2ZUVmZmVjdHM7CiAgICAgICAgICAvKiogQHR5cGUge09iamVjdH0gKi8KICAgICAgICAgIHRoaXMuX19yZWFkT25seTsKICAgICAgICAgIC8qKiBAdHlwZSB7IVRlbXBsYXRlSW5mb30gKi8KICAgICAgICAgIHRoaXMuX190ZW1wbGF0ZUluZm87CiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgICB0aGlzLl9vdmVycmlkZUxlZ2FjeVVuZGVmaW5lZDsKICAgICAgICB9CgogICAgICAgIGdldCBQUk9QRVJUWV9FRkZFQ1RfVFlQRVMoKSB7CiAgICAgICAgICByZXR1cm4gVFlQRVM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgICAgdGhpcy5fcmVnaXN0ZXJIb3N0KCk7CiAgICAgICAgICB0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyA9IG51bGw7CiAgICAgICAgICB0aGlzLl9fZGF0YVRvTm90aWZ5ID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSBudWxsOwogICAgICAgICAgdGhpcy5fX2RhdGFIYXNQYXRocyA9IGZhbHNlOwogICAgICAgICAgLy8gTWF5IGJlIHNldCBvbiBpbnN0YW5jZSBwcmlvciB0byB1cGdyYWRlCiAgICAgICAgICB0aGlzLl9fZGF0YUNvbXBvdW5kU3RvcmFnZSA9IHRoaXMuX19kYXRhQ29tcG91bmRTdG9yYWdlIHx8IG51bGw7CiAgICAgICAgICB0aGlzLl9fZGF0YUhvc3QgPSB0aGlzLl9fZGF0YUhvc3QgfHwgbnVsbDsKICAgICAgICAgIHRoaXMuX19kYXRhVGVtcCA9IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFDbGllbnRzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIF9yZWdpc3Rlckhvc3QoKSB7CiAgICAgICAgICBpZiAoaG9zdFN0YWNrLmxlbmd0aCkgewogICAgICAgICAgICBsZXQgaG9zdCA9IGhvc3RTdGFja1tob3N0U3RhY2subGVuZ3RoLTFdOwogICAgICAgICAgICBob3N0Ll9lbnF1ZXVlQ2xpZW50KHRoaXMpOwogICAgICAgICAgICAvLyBUaGlzIGVuc3VyZXMgZXZlbiBub24tYm91bmQgZWxlbWVudHMgaGF2ZSBhIGhvc3Qgc2V0LCBhcwogICAgICAgICAgICAvLyBsb25nIGFzIHRoZXkgdXBncmFkZSBzeW5jaHJvbm91c2x5CiAgICAgICAgICAgIHRoaXMuX19kYXRhSG9zdCA9IGhvc3Q7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5QWNjZXNzb3JzYCBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIGEKICAgICAgICAgKiBtb3JlIGVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBpbml0aWFsaXppbmcgcHJvcGVydGllcyBmcm9tCiAgICAgICAgICogdGhlIHByb3RvdHlwZSBvbiB0aGUgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgUHJvcGVydGllcyB0byBpbml0aWFsaXplIG9uIHRoZSBwcm90b3R5cGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvdG9Qcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YSA9IE9iamVjdC5jcmVhdGUocHJvcHMpOwogICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nID0gT2JqZWN0LmNyZWF0ZShwcm9wcyk7CiAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IHt9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUFjY2Vzc29yc2AgaW1wbGVtZW50YXRpb24gdG8gYXZvaWQgc2V0dGluZwogICAgICAgICAqIGBfc2V0UHJvcGVydHlgJ3MgYHNob3VsZE5vdGlmeTogdHJ1ZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvcHMgUHJvcGVydGllcyB0byBpbml0aWFsaXplIG9uIHRoZSBpbnN0YW5jZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX2luaXRpYWxpemVJbnN0YW5jZVByb3BlcnRpZXMocHJvcHMpIHsKICAgICAgICAgIGxldCByZWFkT25seSA9IHRoaXNbVFlQRVMuUkVBRF9PTkxZXTsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgICAgaWYgKCFyZWFkT25seSB8fCAhcmVhZE9ubHlbcHJvcF0pIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB0aGlzLl9fZGF0YVBlbmRpbmcgfHwge307CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFPbGQgPSB0aGlzLl9fZGF0YU9sZCB8fCB7fTsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YVtwcm9wXSA9IHRoaXMuX19kYXRhUGVuZGluZ1twcm9wXSA9IHByb3BzW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQcm90b3R5cGUgc2V0dXAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAvKioKICAgICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgYWRkUHJvcGVydHlFZmZlY3RgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCkgewogICAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wZXJ0eSwgdHlwZSA9PSBUWVBFUy5SRUFEX09OTFkpOwogICAgICAgICAgLy8gZWZmZWN0cyBhcmUgYWNjdW11bGF0ZWQgaW50byBhcnJheXMgcGVyIHByb3BlcnR5IGJhc2VkIG9uIHR5cGUKICAgICAgICAgIGxldCBlZmZlY3RzID0gZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIHR5cGUsIHRydWUpW3Byb3BlcnR5XTsKICAgICAgICAgIGlmICghZWZmZWN0cykgewogICAgICAgICAgICBlZmZlY3RzID0gdGhpc1t0eXBlXVtwcm9wZXJ0eV0gPSBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGVmZmVjdHMucHVzaChlZmZlY3QpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgZ2l2ZW4gcHJvcGVydHkgZWZmZWN0LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IHRoZSBlZmZlY3Qgd2FzIGFzc29jaWF0ZWQgd2l0aAogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0eXBlIEVmZmVjdCB0eXBlLCBmcm9tIHRoaXMuUFJPUEVSVFlfRUZGRUNUX1RZUEVTCiAgICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdCB0byByZW1vdmUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9yZW1vdmVQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgICBsZXQgZWZmZWN0cyA9IGVuc3VyZU93bkVmZmVjdE1hcCh0aGlzLCB0eXBlLCB0cnVlKVtwcm9wZXJ0eV07CiAgICAgICAgICBsZXQgaWR4ID0gZWZmZWN0cy5pbmRleE9mKGVmZmVjdCk7CiAgICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgZWZmZWN0cy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgcHJvcGVydHkgZWZmZWN0CiAgICAgICAgICogb2YgYSBjZXJ0YWluIHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMKICAgICAgICAgKiAgICAgdHlwZQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfaGFzUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUpIHsKICAgICAgICAgIGxldCBlZmZlY3RzID0gdGhpc1t0eXBlXTsKICAgICAgICAgIHJldHVybiBCb29sZWFuKGVmZmVjdHMgJiYgZWZmZWN0c1twcm9wZXJ0eV0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYSAicmVhZCBvbmx5IgogICAgICAgICAqIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIHByb3RvdHlwZS9pbnN0YW5jZSBoYXMgYW4gZWZmZWN0IG9mIHRoaXMKICAgICAgICAgKiAgICAgdHlwZQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfaGFzUmVhZE9ubHlFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVBRF9PTkxZKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgIm5vdGlmeSIKICAgICAgICAgKiBwcm9wZXJ0eSBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcwogICAgICAgICAqICAgICB0eXBlCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9oYXNOb3RpZnlFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuTk9USUZZKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY3VycmVudCBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGEgInJlZmxlY3QgdG8KICAgICAgICAgKiBhdHRyaWJ1dGUiIHByb3BlcnR5IGVmZmVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBwcm90b3R5cGUvaW5zdGFuY2UgaGFzIGFuIGVmZmVjdCBvZiB0aGlzCiAgICAgICAgICogICAgIHR5cGUKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2hhc1JlZmxlY3RFZmZlY3QocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgVFlQRVMuUkVGTEVDVCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGN1cnJlbnQgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhICJjb21wdXRlZCIKICAgICAgICAgKiBwcm9wZXJ0eSBlZmZlY3QgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgcHJvdG90eXBlL2luc3RhbmNlIGhhcyBhbiBlZmZlY3Qgb2YgdGhpcwogICAgICAgICAqICAgICB0eXBlCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9oYXNDb21wdXRlZEVmZmVjdChwcm9wZXJ0eSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX2hhc1Byb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5DT01QVVRFKTsKICAgICAgICB9CgogICAgICAgIC8vIFJ1bnRpbWUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgcGVuZGluZyBwcm9wZXJ0eSBvciBwYXRoLiAgSWYgdGhlIHJvb3QgcHJvcGVydHkgb2YgdGhlIHBhdGggaW4KICAgICAgICAgKiBxdWVzdGlvbiBoYWQgbm8gYWNjZXNzb3IsIHRoZSBwYXRoIGlzIHNldCwgb3RoZXJ3aXNlIGl0IGlzIGVucXVldWVkCiAgICAgICAgICogdmlhIGBfc2V0UGVuZGluZ1Byb3BlcnR5YC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXNvbGF0ZXMgcmVsYXRpdmVseSBleHBlbnNpdmUgZnVuY3Rpb25hbGl0eSBuZWNlc3NhcnkKICAgICAgICAgKiBmb3IgdGhlIHB1YmxpYyBBUEkgKGBzZXRgLCBgc2V0UHJvcGVydGllc2AsIGBub3RpZnlQYXRoYCwgYW5kIHByb3BlcnR5CiAgICAgICAgICogY2hhbmdlIGxpc3RlbmVycyB2aWEge3suLi59fSBiaW5kaW5ncyksIHN1Y2ggdGhhdCBpdCBpcyBvbmx5IGRvbmUKICAgICAgICAgKiB3aGVuIHBhdGhzIGVudGVyIHRoZSBzeXN0ZW0sIGFuZCBub3QgYXQgZXZlcnkgcHJvcGFnYXRpb24gc3RlcC4gIEl0CiAgICAgICAgICogYWxzbyBzZXRzIGEgYF9fZGF0YUhhc1BhdGhzYCBmbGFnIG9uIHRoZSBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIHRvCiAgICAgICAgICogZmFzdC1wYXRoIHNsb3dlciBwYXRoLW1hdGNoaW5nIGNvZGUgaW4gdGhlIHByb3BlcnR5IGVmZmVjdHMgaG9zdCBwYXRocy4KICAgICAgICAgKgogICAgICAgICAqIGBwYXRoYCBjYW4gYmUgYSBwYXRoIHN0cmluZyBvciBhcnJheSBvZiBwYXRoIHBhcnRzIGFzIGFjY2VwdGVkIGJ5IHRoZQogICAgICAgICAqIHB1YmxpYyBBUEkuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gcGF0aCBQYXRoIHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVmFsdWUgdG8gc2V0CiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2hvdWxkTm90aWZ5IFNldCB0byB0cnVlIGlmIHRoaXMgY2hhbmdlIHNob3VsZAogICAgICAgICAqICBjYXVzZSBhIHByb3BlcnR5IG5vdGlmaWNhdGlvbiBldmVudCBkaXNwYXRjaAogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGlzUGF0aE5vdGlmaWNhdGlvbiBJZiB0aGUgcGF0aCBiZWluZyBzZXQgaXMgYSBwYXRoCiAgICAgICAgICogICBub3RpZmljYXRpb24gb2YgYW4gYWxyZWFkeSBjaGFuZ2VkIHZhbHVlLCBhcyBvcHBvc2VkIHRvIGEgcmVxdWVzdAogICAgICAgICAqICAgdG8gc2V0IGFuZCBub3RpZnkgdGhlIGNoYW5nZS4gIEluIHRoZSBsYXR0ZXIgYGZhbHNlYCBjYXNlLCBhIGRpcnR5CiAgICAgICAgICogICBjaGVjayBpcyBwZXJmb3JtZWQgYW5kIHRoZW4gdGhlIHZhbHVlIGlzIHNldCB0byB0aGUgcGF0aCBiZWZvcmUKICAgICAgICAgKiAgIGVucXVldWluZyB0aGUgcGVuZGluZyBwcm9wZXJ0eSBjaGFuZ2UuCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eS9wYXRoIHdhcyBlbnF1ZXVlZCBpbgogICAgICAgICAqICAgdGhlIHBlbmRpbmcgY2hhbmdlcyBiYWcuCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocGF0aCwgdmFsdWUsIHNob3VsZE5vdGlmeSwgaXNQYXRoTm90aWZpY2F0aW9uKSB7CiAgICAgICAgICBpZiAoaXNQYXRoTm90aWZpY2F0aW9uIHx8CiAgICAgICAgICAgICAgcm9vdChBcnJheS5pc0FycmF5KHBhdGgpID8gcGF0aFswXSA6IHBhdGgpICE9PSBwYXRoKSB7CiAgICAgICAgICAgIC8vIERpcnR5IGNoZWNrIGNoYW5nZXMgYmVpbmcgc2V0IHRvIGEgcGF0aCBhZ2FpbnN0IHRoZSBhY3R1YWwgb2JqZWN0LAogICAgICAgICAgICAvLyBzaW5jZSB0aGlzIGlzIHRoZSBlbnRyeSBwb2ludCBmb3IgcGF0aHMgaW50byB0aGUgc3lzdGVtOyBmcm9tIGhlcmUKICAgICAgICAgICAgLy8gdGhlIG9ubHkgZGlydHkgY2hlY2tzIGFyZSBhZ2FpbnN0IHRoZSBgX19kYXRhVGVtcGAgY2FjaGUgdG8gcHJldmVudAogICAgICAgICAgICAvLyBkdXBsaWNhdGUgd29yayBpbiB0aGUgc2FtZSB0dXJuIG9ubHkuIE5vdGUsIGlmIHRoaXMgd2FzIGEgbm90aWZpY2F0aW9uCiAgICAgICAgICAgIC8vIG9mIGEgY2hhbmdlIGFscmVhZHkgc2V0IHRvIGEgcGF0aCAoaXNQYXRoTm90aWZpY2F0aW9uOiB0cnVlKSwKICAgICAgICAgICAgLy8gd2UgYWx3YXlzIGxldCB0aGUgY2hhbmdlIHRocm91Z2ggYW5kIHNraXAgdGhlIGBzZXRgIHNpbmNlIGl0IHdhcwogICAgICAgICAgICAvLyBhbHJlYWR5IGRpcnR5IGNoZWNrZWQgYXQgdGhlIHBvaW50IG9mIGVudHJ5IGFuZCB0aGUgdW5kZXJseWluZwogICAgICAgICAgICAvLyBvYmplY3QgaGFzIGFscmVhZHkgYmVlbiB1cGRhdGVkCiAgICAgICAgICAgIGlmICghaXNQYXRoTm90aWZpY2F0aW9uKSB7CiAgICAgICAgICAgICAgbGV0IG9sZCA9IGdldCh0aGlzLCBwYXRoKTsKICAgICAgICAgICAgICBwYXRoID0gLyoqIEB0eXBlIHtzdHJpbmd9ICovIChzZXQodGhpcywgcGF0aCwgdmFsdWUpKTsKICAgICAgICAgICAgICAvLyBVc2UgcHJvcGVydHktYWNjZXNzb3IncyBzaW1wbGVyIGRpcnR5IGNoZWNrCiAgICAgICAgICAgICAgaWYgKCFwYXRoIHx8ICFzdXBlci5fc2hvdWxkUHJvcGVydHlDaGFuZ2UocGF0aCwgdmFsdWUsIG9sZCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX2RhdGFIYXNQYXRocyA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHkoLyoqQHR5cGV7c3RyaW5nfSovKHBhdGgpLCB2YWx1ZSwgc2hvdWxkTm90aWZ5KSkgewogICAgICAgICAgICAgIGNvbXB1dGVMaW5rZWRQYXRocyh0aGlzLCAvKipAdHlwZXtzdHJpbmd9Ki8gKHBhdGgpLCB2YWx1ZSk7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9fZGF0YUhhc0FjY2Vzc29yICYmIHRoaXMuX19kYXRhSGFzQWNjZXNzb3JbcGF0aF0pIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KC8qKkB0eXBle3N0cmluZ30qLyhwYXRoKSwgdmFsdWUsIHNob3VsZE5vdGlmeSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpc1twYXRoXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWVzIGEgdmFsdWUgdG8gYSBub24tUG9seW1lciBlbGVtZW50L25vZGUncyBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBhIGJlc3QtZWZmb3J0IGF0IGJpbmRpbmcgaW50ZXJvcDoKICAgICAgICAgKiBTb21lIG5hdGl2ZSBlbGVtZW50IHByb3BlcnRpZXMgaGF2ZSBzaWRlLWVmZmVjdHMgd2hlbgogICAgICAgICAqIHJlLXNldHRpbmcgdGhlIHNhbWUgdmFsdWUgKGUuZy4gc2V0dGluZyBgPGlucHV0Pi52YWx1ZWAgcmVzZXRzIHRoZQogICAgICAgICAqIGN1cnNvciBwb3NpdGlvbiksIHNvIHdlIGRvIGEgZGlydHktY2hlY2sgYmVmb3JlIHNldHRpbmcgdGhlIHZhbHVlLgogICAgICAgICAqIEhvd2V2ZXIsIGZvciBiZXR0ZXIgaW50ZXJvcCB3aXRoIG5vbi1Qb2x5bWVyIGN1c3RvbSBlbGVtZW50cyB0aGF0CiAgICAgICAgICogYWNjZXB0IG9iamVjdHMsIHdlIGV4cGxpY2l0bHkgcmUtc2V0IG9iamVjdCBjaGFuZ2VzIGNvbWluZyBmcm9tIHRoZQogICAgICAgICAqIFBvbHltZXIgd29ybGQgKHdoaWNoIG1heSBpbmNsdWRlIGRlZXAgb2JqZWN0IGNoYW5nZXMgd2l0aG91dCB0aGUKICAgICAgICAgKiB0b3AgcmVmZXJlbmNlIGNoYW5naW5nKSwgZXJyaW5nIG9uIHRoZSBzaWRlIG9mIHByb3ZpZGluZyBtb3JlCiAgICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBVc2VycyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcHJvdmlkZSBhbHRlcm5hdGUgYXBwcm9hY2hlcy4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgVGhlIG5vZGUgdG8gc2V0IGEgcHJvcGVydHkgb24KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBUaGUgcHJvcGVydHkgdG8gc2V0CiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3NldFVubWFuYWdlZFByb3BlcnR5VG9Ob2RlKG5vZGUsIHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAvLyBJdCBpcyBhIGp1ZGdtZW50IGNhbGwgdGhhdCByZXNldHRpbmcgcHJpbWl0aXZlcyBpcwogICAgICAgICAgLy8gImJhZCIgYW5kIHJlc2V0dGluZ3Mgb2JqZWN0cyBpcyBhbHNvICJnb29kIjsgYWx0ZXJuYXRpdmVseSB3ZSBjb3VsZAogICAgICAgICAgLy8gaW1wbGVtZW50IGEgd2hpdGVsaXN0IG9mIHRhZyAmIHByb3BlcnR5IHZhbHVlcyB0aGF0IHNob3VsZCBuZXZlcgogICAgICAgICAgLy8gYmUgcmVzZXQgKGUuZy4gPGlucHV0Pi52YWx1ZSAmJiA8c2VsZWN0Pi52YWx1ZSkKICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbm9kZVtwcm9wXSB8fCB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgLy8gTm90ZSwgY2xhc3NOYW1lIG5lZWRzIHN0eWxlIHNjb3Bpbmcgc28gdGhpcyBuZWVkcyB3cmFwcGluZy4KICAgICAgICAgICAgaWYgKHByb3AgPT09ICdjbGFzc05hbWUnKSB7CiAgICAgICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IU5vZGV9ICovKHdyYXAobm9kZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG5vZGVbcHJvcF0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyB0aGUgYFByb3BlcnRpZXNDaGFuZ2VkYCBpbXBsZW1lbnRhdGlvbiB0byBpbnRyb2R1Y2Ugc3BlY2lhbAogICAgICAgICAqIGRpcnR5IGNoZWNrIGxvZ2ljIGRlcGVuZGluZyBvbiB0aGUgcHJvcGVydHkgJiB2YWx1ZSBiZWluZyBzZXQ6CiAgICAgICAgICoKICAgICAgICAgKiAxLiBBbnkgdmFsdWUgc2V0IHRvIGEgcGF0aCAoZS5nLiAnb2JqLnByb3AnOiA0MiBvciAnb2JqLnByb3AnOiB7Li4ufSkKICAgICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YVRlbXBgLCBkaXJ0eSBjaGVja2VkIGFnYWluc3QgYF9fZGF0YVRlbXBgCiAgICAgICAgICogMi4gT2JqZWN0IHNldCB0byBzaW1wbGUgcHJvcGVydHkgKGUuZy4gJ3Byb3AnOiB7Li4ufSkKICAgICAgICAgKiAgICBTdG9yZWQgaW4gYF9fZGF0YVRlbXBgIGFuZCBgX19kYXRhYCwgZGlydHkgY2hlY2tlZCBhZ2FpbnN0CiAgICAgICAgICogICAgYF9fZGF0YVRlbXBgIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgYF9zaG91bGRQcm9wZXJ0eUNoYW5nZWAKICAgICAgICAgKiAzLiBQcmltaXRpdmUgdmFsdWUgc2V0IHRvIHNpbXBsZSBwcm9wZXJ0eSAoZS5nLiAncHJvcCc6IDQyKQogICAgICAgICAqICAgIFN0b3JlZCBpbiBgX19kYXRhYCwgZGlydHkgY2hlY2tlZCBhZ2FpbnN0IGBfX2RhdGFgCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZGlydHktY2hlY2sgaXMgaW1wb3J0YW50IHRvIHByZXZlbnQgY3ljbGVzIGR1ZSB0byB0d28td2F5CiAgICAgICAgICogbm90aWZpY2F0aW9uLCBidXQgcGF0aHMgYW5kIG9iamVjdHMgYXJlIG9ubHkgZGlydHkgY2hlY2tlZCBhZ2FpbnN0IGFueQogICAgICAgICAqIHByZXZpb3VzIHZhbHVlIHNldCBkdXJpbmcgdGhpcyB0dXJuIHZpYSBhICJ0ZW1wb3JhcnkgY2FjaGUiIHRoYXQgaXMKICAgICAgICAgKiBjbGVhcmVkIHdoZW4gdGhlIGxhc3QgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgZXhpdHMuIFRoaXMgaXMgc286CiAgICAgICAgICogYS4gYW55IGNhY2hlZCBhcnJheSBwYXRocyAoZS5nLiAnYXJyYXkuMy5wcm9wJykgbWF5IGJlIGludmFsaWRhdGVkCiAgICAgICAgICogICAgZHVlIHRvIGFycmF5IG11dGF0aW9ucyBsaWtlIHNoaWZ0L3Vuc2hpZnQvc3BsaWNlOyB0aGlzIGlzIGZpbmUKICAgICAgICAgKiAgICBzaW5jZSBwYXRoIGNoYW5nZXMgYXJlIGRpcnR5LWNoZWNrZWQgYXQgdXNlciBlbnRyeSBwb2ludHMgbGlrZSBgc2V0YAogICAgICAgICAqIGIuIGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIG9ubHkgbGFzdHMgb25lIHR1cm4gdG8gYWxsb3cgdGhlIHVzZXIKICAgICAgICAgKiAgICB0byBtdXRhdGUgdGhlIG9iamVjdCBpbi1wbGFjZSBhbmQgcmUtc2V0IGl0IHdpdGggdGhlIHNhbWUgaWRlbnRpdHkKICAgICAgICAgKiAgICBhbmQgaGF2ZSBhbGwgc3ViLXByb3BlcnRpZXMgcmUtcHJvcGFnYXRlZCBpbiBhIHN1YnNlcXVlbnQgdHVybi4KICAgICAgICAgKgogICAgICAgICAqIFRoZSB0ZW1wIGNhY2hlIGlzIG5vdCBuZWNlc3NhcmlseSBzdWZmaWNpZW50IHRvIHByZXZlbnQgaW52YWxpZCBhcnJheQogICAgICAgICAqIHBhdGhzLCBzaW5jZSBhIHNwbGljZSBjYW4gaGFwcGVuIGR1cmluZyB0aGUgc2FtZSB0dXJuICh3aXRoIHBhdGhvbG9naWNhbAogICAgICAgICAqIHVzZXIgY29kZSk7IHdlIGNvdWxkIGludHJvZHVjZSBhICJmaXh1cCIgZm9yIHRlbXBvcmFyaWx5IGNhY2hlZCBhcnJheQogICAgICAgICAqIHBhdGhzIGlmIG5lZWRlZDogaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci9pc3N1ZXMvNDIyNwogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgdGhlIHByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBzaG91bGROb3RpZnkgVHJ1ZSBpZiBwcm9wZXJ0eSBzaG91bGQgZmlyZSBub3RpZmljYXRpb24KICAgICAgICAgKiAgIGV2ZW50IChhcHBsaWVzIG9ubHkgZm9yIGBub3RpZnk6IHRydWVgIHByb3BlcnRpZXMpCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBwcm9wZXJ0eSBjaGFuZ2VkCiAgICAgICAgICovCiAgICAgICAgX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHNob3VsZE5vdGlmeSkgewogICAgICAgICAgbGV0IHByb3BJc1BhdGggPSB0aGlzLl9fZGF0YUhhc1BhdGhzICYmIGlzUGF0aChwcm9wZXJ0eSk7CiAgICAgICAgICBsZXQgcHJldlByb3BzID0gcHJvcElzUGF0aCA/IHRoaXMuX19kYXRhVGVtcCA6IHRoaXMuX19kYXRhOwogICAgICAgICAgaWYgKHRoaXMuX3Nob3VsZFByb3BlcnR5Q2hhbmdlKHByb3BlcnR5LCB2YWx1ZSwgcHJldlByb3BzW3Byb3BlcnR5XSkpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmcgPSB7fTsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YU9sZCA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEVuc3VyZSBvbGQgaXMgY2FwdHVyZWQgZnJvbSB0aGUgbGFzdCB0dXJuCiAgICAgICAgICAgIGlmICghKHByb3BlcnR5IGluIHRoaXMuX19kYXRhT2xkKSkgewogICAgICAgICAgICAgIHRoaXMuX19kYXRhT2xkW3Byb3BlcnR5XSA9IHRoaXMuX19kYXRhW3Byb3BlcnR5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQYXRocyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YgdHVybiksCiAgICAgICAgICAgIC8vIHdoaWNoIGlzIHVzZWQgZm9yIGRpcnR5LWNoZWNraW5nLCBhbGwgb3RoZXJzIHN0b3JlZCBpbiBfX2RhdGEKICAgICAgICAgICAgaWYgKHByb3BJc1BhdGgpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5fX2RhdGFbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQWxsIGNoYW5nZXMgZ28gaW50byBwZW5kaW5nIHByb3BlcnR5IGJhZywgcGFzc2VkIHRvIF9wcm9wZXJ0aWVzQ2hhbmdlZAogICAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdbcHJvcGVydHldID0gdmFsdWU7CiAgICAgICAgICAgIC8vIFRyYWNrIHByb3BlcnRpZXMgdGhhdCBzaG91bGQgbm90aWZ5IHNlcGFyYXRlbHkKICAgICAgICAgICAgaWYgKHByb3BJc1BhdGggfHwgKHRoaXNbVFlQRVMuTk9USUZZXSAmJiB0aGlzW1RZUEVTLk5PVElGWV1bcHJvcGVydHldKSkgewogICAgICAgICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnkgPSB0aGlzLl9fZGF0YVRvTm90aWZ5IHx8IHt9OwogICAgICAgICAgICAgIHRoaXMuX19kYXRhVG9Ob3RpZnlbcHJvcGVydHldID0gc2hvdWxkTm90aWZ5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVzIGJhc2UgaW1wbGVtZW50YXRpb24gdG8gZW5zdXJlIGFsbCBhY2Nlc3NvcnMgc2V0IGBzaG91bGROb3RpZnlgCiAgICAgICAgICogdG8gdHJ1ZSwgZm9yIHBlci1wcm9wZXJ0eSBub3RpZmljYXRpb24gdHJhY2tpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wZXJ0eSwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5QWNjZXNzb3JgJ3MgZGVmYXVsdCBhc3luYyBxdWV1aW5nIG9mCiAgICAgICAgICogYF9wcm9wZXJ0aWVzQ2hhbmdlZGA6IGlmIGBfX2RhdGFSZWFkeWAgaXMgZmFsc2UgKGhhcyBub3QgeWV0IGJlZW4KICAgICAgICAgKiBtYW51YWxseSBmbHVzaGVkKSwgdGhlIGZ1bmN0aW9uIG5vLW9wczsgb3RoZXJ3aXNlIGZsdXNoZXMKICAgICAgICAgKiBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBzeW5jaHJvbm91c2x5LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfaW52YWxpZGF0ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAodGhpcy5fX2RhdGFSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEVucXVldWVzIHRoZSBnaXZlbiBjbGllbnQgb24gYSBsaXN0IG9mIHBlbmRpbmcgY2xpZW50cywgd2hvc2UKICAgICAgICAgKiBwZW5kaW5nIHByb3BlcnR5IGNoYW5nZXMgY2FuIGxhdGVyIGJlIGZsdXNoZWQgdmlhIGEgY2FsbCB0bwogICAgICAgICAqIGBfZmx1c2hDbGllbnRzYC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjbGllbnQgUHJvcGVydHlFZmZlY3RzIGNsaWVudCB0byBlbnF1ZXVlCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2VucXVldWVDbGllbnQoY2xpZW50KSB7CiAgICAgICAgICB0aGlzLl9fZGF0YVBlbmRpbmdDbGllbnRzID0gdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cyB8fCBbXTsKICAgICAgICAgIGlmIChjbGllbnQgIT09IHRoaXMpIHsKICAgICAgICAgICAgdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50cy5wdXNoKGNsaWVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBGbHVzaGVzIGFueSBjbGllbnRzIHByZXZpb3VzbHkgZW5xdWV1ZWQgdmlhIGBfZW5xdWV1ZUNsaWVudGAsIGNhdXNpbmcKICAgICAgICAgKiB0aGVpciBgX2ZsdXNoUHJvcGVydGllc2AgbWV0aG9kIHRvIHJ1bi4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9mbHVzaENsaWVudHMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19kYXRhQ2xpZW50c1JlYWR5KSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhQ2xpZW50c1JlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fcmVhZHlDbGllbnRzKCk7CiAgICAgICAgICAgIC8vIE92ZXJyaWRlIHBvaW50IHdoZXJlIGFjY2Vzc29ycyBhcmUgdHVybmVkIG9uOyBpbXBvcnRhbnRseSwKICAgICAgICAgICAgLy8gdGhpcyBpcyBhZnRlciBjbGllbnRzIGhhdmUgZnVsbHkgcmVhZGllZCwgcHJvdmlkaW5nIGEgZ3VhcmFudGVlCiAgICAgICAgICAgIC8vIHRoYXQgYW55IHByb3BlcnR5IGVmZmVjdHMgb2NjdXIgb25seSBhZnRlciBhbGwgY2xpZW50cyBhcmUgcmVhZHkuCiAgICAgICAgICAgIHRoaXMuX19kYXRhUmVhZHkgPSB0cnVlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fX2VuYWJsZU9yRmx1c2hDbGllbnRzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBOT1RFOiBXZSBlbnN1cmUgY2xpZW50cyBlaXRoZXIgZW5hYmxlIG9yIGZsdXNoIGFzIGFwcHJvcHJpYXRlLiBUaGlzCiAgICAgICAgLy8gaGFuZGxlcyB0d28gY29ybmVyIGNhc2VzOgogICAgICAgIC8vICgxKSBjbGllbnRzIGZsdXNoIHByb3Blcmx5IHdoZW4gY29ubmVjdGVkL2VuYWJsZWQgYmVmb3JlIHRoZSBob3N0CiAgICAgICAgLy8gZW5hYmxlczsgZS5nLgogICAgICAgIC8vICAgKGEpIFRlbXBsYXRpemUgc3RhbXBzIHdpdGggbm8gcHJvcGVydGllcyBhbmQgZG9lcyBub3QgZmx1c2ggYW5kCiAgICAgICAgLy8gICAoYikgdGhlIGluc3RhbmNlIGlzIGluc2VydGVkIGludG8gZG9tIGFuZAogICAgICAgIC8vICAgKGMpIHRoZW4gdGhlIGluc3RhbmNlIGZsdXNoZXMuCiAgICAgICAgLy8gKDIpIGNsaWVudHMgZW5hYmxlIHByb3Blcmx5IHdoZW4gbm90IGNvbm5lY3RlZC9lbmFibGVkIHdoZW4gdGhlIGhvc3QKICAgICAgICAvLyBmbHVzaGVzOyBlLmcuCiAgICAgICAgLy8gICAoYSkgYSB0ZW1wbGF0ZSBpcyBydW50aW1lIHN0YW1wZWQgYW5kIG5vdCB5ZXQgY29ubmVjdGVkL2VuYWJsZWQKICAgICAgICAvLyAgIChiKSBhIGhvc3Qgc2V0cyBhIHByb3BlcnR5LCBjYXVzaW5nIHN0YW1wZWQgZG9tIHRvIGZsdXNoCiAgICAgICAgLy8gICAoYykgdGhlIHN0YW1wZWQgZG9tIGVuYWJsZXMuCiAgICAgICAgX19lbmFibGVPckZsdXNoQ2xpZW50cygpIHsKICAgICAgICAgIGxldCBjbGllbnRzID0gdGhpcy5fX2RhdGFQZW5kaW5nQ2xpZW50czsKICAgICAgICAgIGlmIChjbGllbnRzKSB7CiAgICAgICAgICAgIHRoaXMuX19kYXRhUGVuZGluZ0NsaWVudHMgPSBudWxsOwogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBjbGllbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGV0IGNsaWVudCA9IGNsaWVudHNbaV07CiAgICAgICAgICAgICAgaWYgKCFjbGllbnQuX19kYXRhRW5hYmxlZCkgewogICAgICAgICAgICAgICAgY2xpZW50Ll9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICAgfSBlbHNlIGlmIChjbGllbnQuX19kYXRhUGVuZGluZykgewogICAgICAgICAgICAgICAgY2xpZW50Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBlcmZvcm0gYW55IGluaXRpYWwgc2V0dXAgb24gY2xpZW50IGRvbS4gQ2FsbGVkIGJlZm9yZSB0aGUgZmlyc3QKICAgICAgICAgKiBgX2ZsdXNoUHJvcGVydGllc2AgY2FsbCBvbiBjbGllbnQgZG9tIGFuZCBiZWZvcmUgYW55IGVsZW1lbnQKICAgICAgICAgKiBvYnNlcnZlcnMgYXJlIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9yZWFkeUNsaWVudHMoKSB7CiAgICAgICAgICB0aGlzLl9fZW5hYmxlT3JGbHVzaENsaWVudHMoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYSBiYWcgb2YgcHJvcGVydHkgY2hhbmdlcyB0byB0aGlzIGluc3RhbmNlLCBhbmQKICAgICAgICAgKiBzeW5jaHJvbm91c2x5IHByb2Nlc3NlcyBhbGwgZWZmZWN0cyBvZiB0aGUgcHJvcGVydGllcyBhcyBhIGJhdGNoLgogICAgICAgICAqCiAgICAgICAgICogUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBzaW1wbGUgcHJvcGVydGllcywgbm90IHBhdGhzLiAgQmF0Y2hlZAogICAgICAgICAqIHBhdGggcHJvcGFnYXRpb24gaXMgbm90IHN1cHBvcnRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2Ygb25lIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzIHdob3NlIGtleSBpcwogICAgICAgICAqICAgYSBwcm9wZXJ0eSBhbmQgdmFsdWUgaXMgdGhlIG5ldyB2YWx1ZSB0byBzZXQgZm9yIHRoYXQgcHJvcGVydHkuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gc2V0UmVhZE9ubHkgV2hlbiB0cnVlLCBhbnkgcHJpdmF0ZSB2YWx1ZXMgc2V0IGluCiAgICAgICAgICogICBgcHJvcHNgIHdpbGwgYmUgc2V0LiBCeSBkZWZhdWx0LCBgc2V0UHJvcGVydGllc2Agd2lsbCBub3Qgc2V0CiAgICAgICAgICogICBgcmVhZE9ubHk6IHRydWVgIHJvb3QgcHJvcGVydGllcy4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBzZXRQcm9wZXJ0aWVzKHByb3BzLCBzZXRSZWFkT25seSkgewogICAgICAgICAgZm9yIChsZXQgcGF0aCBpbiBwcm9wcykgewogICAgICAgICAgICBpZiAoc2V0UmVhZE9ubHkgfHwgIXRoaXNbVFlQRVMuUkVBRF9PTkxZXSB8fCAhdGhpc1tUWVBFUy5SRUFEX09OTFldW3BhdGhdKSB7CiAgICAgICAgICAgICAgLy9UT0RPKGtzY2hhYWYpOiBleHBsaWNpdGx5IGRpc2FsbG93IHBhdGhzIGluIHNldFByb3BlcnR5PwogICAgICAgICAgICAgIC8vIHdpbGRjYXJkIG9ic2VydmVycyBjdXJyZW50bHkgb25seSBwYXNzIHRoZSBmaXJzdCBjaGFuZ2VkIHBhdGgKICAgICAgICAgICAgICAvLyBpbiB0aGUgYGluZm9gIG9iamVjdCwgYW5kIHlvdSBjb3VsZCBkbyBzb21lIG9kZCB0aGluZ3MgYmF0Y2hpbmcKICAgICAgICAgICAgICAvLyBwYXRocywgZS5nLiB7J2Zvby5iYXInOiB7Li4ufSwgJ2Zvbyc6IG51bGx9CiAgICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKHBhdGgsIHByb3BzW3BhdGhdLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgdGhpcy5faW52YWxpZGF0ZVByb3BlcnRpZXMoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydHlBY2Nlc3NvcnNgIHNvIHRoYXQgcHJvcGVydHkgYWNjZXNzb3IKICAgICAgICAgKiBzaWRlIGVmZmVjdHMgYXJlIG5vdCBlbmFibGVkIHVudGlsIGFmdGVyIGNsaWVudCBkb20gaXMgZnVsbHkgcmVhZHkuCiAgICAgICAgICogQWxzbyBjYWxscyBgX2ZsdXNoQ2xpZW50c2AgY2FsbGJhY2sgdG8gZW5zdXJlIGNsaWVudCBkb20gaXMgZW5hYmxlZAogICAgICAgICAqIHRoYXQgd2FzIG5vdCBlbmFibGVkIGFzIGEgcmVzdWx0IG9mIGZsdXNoaW5nIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgLy8gSXQgaXMgaW1wb3J0YW50IHRoYXQgYHN1cGVyLnJlYWR5KClgIGlzIG5vdCBjYWxsZWQgaGVyZSBhcyBpdAogICAgICAgICAgLy8gaW1tZWRpYXRlbHkgdHVybnMgb24gYWNjZXNzb3JzLiBJbnN0ZWFkLCB3ZSB3YWl0IHVudGlsIGByZWFkeUNsaWVudHNgCiAgICAgICAgICAvLyB0byBlbmFibGUgYWNjZXNzb3JzIHRvIHByb3ZpZGUgYSBndWFyYW50ZWUgdGhhdCBjbGllbnRzIGFyZSByZWFkeQogICAgICAgICAgLy8gYmVmb3JlIHByb2Nlc3NpbmcgYW55IGFjY2Vzc29ycyBzaWRlIGVmZmVjdHMuCiAgICAgICAgICB0aGlzLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgIC8vIElmIG5vIGRhdGEgd2FzIHBlbmRpbmcsIGBfZmx1c2hQcm9wZXJ0aWVzYCB3aWxsIG5vdCBgZmx1c2hDbGllbnRzYAogICAgICAgICAgLy8gc28gZW5zdXJlIHRoaXMgaXMgZG9uZS4KICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFDbGllbnRzUmVhZHkpIHsKICAgICAgICAgICAgdGhpcy5fZmx1c2hDbGllbnRzKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBCZWZvcmUgcmVhZHksIGNsaWVudCBub3RpZmljYXRpb25zIGRvIG5vdCB0cmlnZ2VyIF9mbHVzaFByb3BlcnRpZXMuCiAgICAgICAgICAvLyBUaGVyZWZvcmUgYSBmbHVzaCBpcyBuZWNlc3NhcnkgaGVyZSBpZiBkYXRhIGhhcyBiZWVuIHNldC4KICAgICAgICAgIGlmICh0aGlzLl9fZGF0YVBlbmRpbmcpIHsKICAgICAgICAgICAgdGhpcy5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRzIGBQcm9wZXJ0eUFjY2Vzc29yc2AncyBwcm9wZXJ0aWVzIGNoYW5nZWQgY2FsbGJhY2suCiAgICAgICAgICoKICAgICAgICAgKiBSdW5zIGVhY2ggY2xhc3Mgb2YgZWZmZWN0cyBmb3IgdGhlIGJhdGNoIG9mIGNoYW5nZWQgcHJvcGVydGllcyBpbgogICAgICAgICAqIGEgc3BlY2lmaWMgb3JkZXIgKGNvbXB1dGUsIHByb3BhZ2F0ZSwgcmVmbGVjdCwgb2JzZXJ2ZSwgbm90aWZ5KS4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFByb3BzIEJhZyBvZiBhbGwgY3VycmVudCBhY2Nlc3NvciB2YWx1ZXMKICAgICAgICAgKiBAcGFyYW0gez9PYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgcHJvcGVydGllcyBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0CiAgICAgICAgICogICBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgCiAgICAgICAgICogQHBhcmFtIHs/T2JqZWN0fSBvbGRQcm9wcyBCYWcgb2YgcHJldmlvdXMgdmFsdWVzIGZvciBlYWNoIHByb3BlcnR5CiAgICAgICAgICogICBpbiBgY2hhbmdlZFByb3BzYAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgX3Byb3BlcnRpZXNDaGFuZ2VkKGN1cnJlbnRQcm9wcywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcykgewogICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgLy8gbGV0IGMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhjaGFuZ2VkUHJvcHMgfHwge30pOwogICAgICAgICAgLy8gd2luZG93LmRlYnVnICYmIGNvbnNvbGUuZ3JvdXAodGhpcy5sb2NhbE5hbWUgKyAnIycgKyB0aGlzLmlkICsgJzogJyArIGMpOwogICAgICAgICAgLy8gaWYgKHdpbmRvdy5kZWJ1ZykgeyBkZWJ1Z2dlcjsgfQogICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgbGV0IGhhc1BhdGhzID0gdGhpcy5fX2RhdGFIYXNQYXRoczsKICAgICAgICAgIHRoaXMuX19kYXRhSGFzUGF0aHMgPSBmYWxzZTsKICAgICAgICAgIGxldCBub3RpZnlQcm9wczsKICAgICAgICAgIC8vIENvbXB1dGUgcHJvcGVydGllcwogICAgICAgICAgcnVuQ29tcHV0ZWRFZmZlY3RzKHRoaXMsIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAgIC8vIENsZWFyIG5vdGlmeSBwcm9wZXJ0aWVzIHByaW9yIHRvIHBvc3NpYmxlIHJlZW50cnkgKHByb3BhZ2F0ZSwgb2JzZXJ2ZSksCiAgICAgICAgICAvLyBidXQgYWZ0ZXIgY29tcHV0aW5nIGVmZmVjdHMgaGF2ZSBhIGNoYW5jZSB0byBhZGQgdG8gdGhlbQogICAgICAgICAgbm90aWZ5UHJvcHMgPSB0aGlzLl9fZGF0YVRvTm90aWZ5OwogICAgICAgICAgdGhpcy5fX2RhdGFUb05vdGlmeSA9IG51bGw7CiAgICAgICAgICAvLyBQcm9wYWdhdGUgcHJvcGVydGllcyB0byBjbGllbnRzCiAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVQcm9wZXJ0eUNoYW5nZXMoY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgICAgLy8gRmx1c2ggY2xpZW50cwogICAgICAgICAgdGhpcy5fZmx1c2hDbGllbnRzKCk7CiAgICAgICAgICAvLyBSZWZsZWN0IHByb3BlcnRpZXMKICAgICAgICAgIHJ1bkVmZmVjdHModGhpcywgdGhpc1tUWVBFUy5SRUZMRUNUXSwgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgICAgLy8gT2JzZXJ2ZSBwcm9wZXJ0aWVzCiAgICAgICAgICBydW5FZmZlY3RzKHRoaXMsIHRoaXNbVFlQRVMuT0JTRVJWRV0sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAgIC8vIE5vdGlmeSBwcm9wZXJ0aWVzIHRvIGhvc3QKICAgICAgICAgIGlmIChub3RpZnlQcm9wcykgewogICAgICAgICAgICBydW5Ob3RpZnlFZmZlY3RzKHRoaXMsIG5vdGlmeVByb3BzLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhciB0ZW1wb3JhcnkgY2FjaGUgYXQgZW5kIG9mIHR1cm4KICAgICAgICAgIGlmICh0aGlzLl9fZGF0YUNvdW50ZXIgPT0gMSkgewogICAgICAgICAgICB0aGlzLl9fZGF0YVRlbXAgPSB7fTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgIC8vIHdpbmRvdy5kZWJ1ZyAmJiBjb25zb2xlLmdyb3VwRW5kKHRoaXMubG9jYWxOYW1lICsgJyMnICsgdGhpcy5pZCArICc6ICcgKyBjKTsKICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCB0byBwcm9wYWdhdGUgYW55IHByb3BlcnR5IGNoYW5nZXMgdG8gc3RhbXBlZCB0ZW1wbGF0ZSBub2RlcwogICAgICAgICAqIG1hbmFnZWQgYnkgdGhpcyBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNoYW5nZWRQcm9wcyBCYWcgb2YgY2hhbmdlZCBwcm9wZXJ0aWVzCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfcHJvcGFnYXRlUHJvcGVydHlDaGFuZ2VzKGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgICBpZiAodGhpc1tUWVBFUy5QUk9QQUdBVEVdKSB7CiAgICAgICAgICAgIHJ1bkVmZmVjdHModGhpcywgdGhpc1tUWVBFUy5QUk9QQUdBVEVdLCBjaGFuZ2VkUHJvcHMsIG9sZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5fX3RlbXBsYXRlSW5mbykgewogICAgICAgICAgICB0aGlzLl9ydW5FZmZlY3RzRm9yVGVtcGxhdGUodGhpcy5fX3RlbXBsYXRlSW5mbywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgX3J1bkVmZmVjdHNGb3JUZW1wbGF0ZSh0ZW1wbGF0ZUluZm8sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKSB7CiAgICAgICAgICBjb25zdCBiYXNlUnVuRWZmZWN0cyA9IChjaGFuZ2VkUHJvcHMsIGhhc1BhdGhzKSA9PiB7CiAgICAgICAgICAgIHJ1bkVmZmVjdHModGhpcywgdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cywgY2hhbmdlZFByb3BzLCBvbGRQcm9wcywKICAgICAgICAgICAgICBoYXNQYXRocywgdGVtcGxhdGVJbmZvLm5vZGVMaXN0KTsKICAgICAgICAgICAgZm9yIChsZXQgaW5mbz10ZW1wbGF0ZUluZm8uZmlyc3RDaGlsZDsgaW5mbzsgaW5mbz1pbmZvLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgICAgdGhpcy5fcnVuRWZmZWN0c0ZvclRlbXBsYXRlKGluZm8sIGNoYW5nZWRQcm9wcywgb2xkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfTsKICAgICAgICAgIGlmICh0ZW1wbGF0ZUluZm8ucnVuRWZmZWN0cykgewogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucnVuRWZmZWN0cyhiYXNlUnVuRWZmZWN0cywgY2hhbmdlZFByb3BzLCBoYXNQYXRocyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBiYXNlUnVuRWZmZWN0cyhjaGFuZ2VkUHJvcHMsIGhhc1BhdGhzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEFsaWFzZXMgb25lIGRhdGEgcGF0aCBhcyBhbm90aGVyLCBzdWNoIHRoYXQgcGF0aCBub3RpZmljYXRpb25zIGZyb20gb25lCiAgICAgICAgICogYXJlIHJvdXRlZCB0byB0aGUgb3RoZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gdG8gVGFyZ2V0IHBhdGggdG8gbGluay4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gZnJvbSBTb3VyY2UgcGF0aCB0byBsaW5rLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIGxpbmtQYXRocyh0bywgZnJvbSkgewogICAgICAgICAgdG8gPSBub3JtYWxpemUodG8pOwogICAgICAgICAgZnJvbSA9IG5vcm1hbGl6ZShmcm9tKTsKICAgICAgICAgIHRoaXMuX19kYXRhTGlua2VkUGF0aHMgPSB0aGlzLl9fZGF0YUxpbmtlZFBhdGhzIHx8IHt9OwogICAgICAgICAgdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1t0b10gPSBmcm9tOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGRhdGEgcGF0aCBhbGlhcyBwcmV2aW91c2x5IGVzdGFibGlzaGVkIHdpdGggYF9saW5rUGF0aHNgLgogICAgICAgICAqCiAgICAgICAgICogTm90ZSwgdGhlIHBhdGggdG8gdW5saW5rIHNob3VsZCBiZSB0aGUgdGFyZ2V0IChgdG9gKSB1c2VkIHdoZW4KICAgICAgICAgKiBsaW5raW5nIHRoZSBwYXRocy4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFRhcmdldCBwYXRoIHRvIHVubGluay4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICB1bmxpbmtQYXRocyhwYXRoKSB7CiAgICAgICAgICBwYXRoID0gbm9ybWFsaXplKHBhdGgpOwogICAgICAgICAgaWYgKHRoaXMuX19kYXRhTGlua2VkUGF0aHMpIHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX19kYXRhTGlua2VkUGF0aHNbcGF0aF07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBOb3RpZnkgdGhhdCBhbiBhcnJheSBoYXMgY2hhbmdlZC4KICAgICAgICAgKgogICAgICAgICAqIEV4YW1wbGU6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgdGhpcy5pdGVtcyA9IFsge25hbWU6ICdKaW0nfSwge25hbWU6ICdUb2RkJ30sIHtuYW1lOiAnQmlsbCd9IF07CiAgICAgICAgICogICAgIC4uLgogICAgICAgICAqICAgICB0aGlzLml0ZW1zLnNwbGljZSgxLCAxLCB7bmFtZTogJ1NhbSd9KTsKICAgICAgICAgKiAgICAgdGhpcy5pdGVtcy5wdXNoKHtuYW1lOiAnQm9iJ30pOwogICAgICAgICAqICAgICB0aGlzLm5vdGlmeVNwbGljZXMoJ2l0ZW1zJywgWwogICAgICAgICAqICAgICAgIHsgaW5kZXg6IDEsIHJlbW92ZWQ6IFt7bmFtZTogJ1RvZGQnfV0sIGFkZGVkQ291bnQ6IDEsCiAgICAgICAgICogICAgICAgICBvYmplY3Q6IHRoaXMuaXRlbXMsIHR5cGU6ICdzcGxpY2UnIH0sCiAgICAgICAgICogICAgICAgeyBpbmRleDogMywgcmVtb3ZlZDogW10sIGFkZGVkQ291bnQ6IDEsCiAgICAgICAgICogICAgICAgICBvYmplY3Q6IHRoaXMuaXRlbXMsIHR5cGU6ICdzcGxpY2UnfQogICAgICAgICAqICAgICBdKTsKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFBhdGggdGhhdCBzaG91bGQgYmUgbm90aWZpZWQuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gc3BsaWNlcyBBcnJheSBvZiBzcGxpY2UgcmVjb3JkcyBpbmRpY2F0aW5nIG9yZGVyZWQKICAgICAgICAgKiAgIGNoYW5nZXMgdGhhdCBvY2N1cnJlZCB0byB0aGUgYXJyYXkuIEVhY2ggcmVjb3JkIHNob3VsZCBoYXZlIHRoZQogICAgICAgICAqICAgZm9sbG93aW5nIGZpZWxkczoKICAgICAgICAgKiAgICAqIGluZGV4OiBpbmRleCBhdCB3aGljaCB0aGUgY2hhbmdlIG9jY3VycmVkCiAgICAgICAgICogICAgKiByZW1vdmVkOiBhcnJheSBvZiBpdGVtcyB0aGF0IHdlcmUgcmVtb3ZlZCBmcm9tIHRoaXMgaW5kZXgKICAgICAgICAgKiAgICAqIGFkZGVkQ291bnQ6IG51bWJlciBvZiBuZXcgaXRlbXMgYWRkZWQgYXQgdGhpcyBpbmRleAogICAgICAgICAqICAgICogb2JqZWN0OiBhIHJlZmVyZW5jZSB0byB0aGUgYXJyYXkgaW4gcXVlc3Rpb24KICAgICAgICAgKiAgICAqIHR5cGU6IHRoZSBzdHJpbmcgbGl0ZXJhbCAnc3BsaWNlJwogICAgICAgICAqCiAgICAgICAgICogICBOb3RlIHRoYXQgc3BsaWNlIHJlY29yZHMgX211c3RfIGJlIG5vcm1hbGl6ZWQgc3VjaCB0aGF0IHRoZXkgYXJlCiAgICAgICAgICogICByZXBvcnRlZCBpbiBpbmRleCBvcmRlciAocmF3IHJlc3VsdHMgZnJvbSBgT2JqZWN0Lm9ic2VydmVgIGFyZSBub3QKICAgICAgICAgKiAgIG9yZGVyZWQgYW5kIG11c3QgYmUgbm9ybWFsaXplZC9tZXJnZWQgYmVmb3JlIG5vdGlmeWluZykuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBub3RpZnlTcGxpY2VzKHBhdGgsIHNwbGljZXMpIHsKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKGdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgICBub3RpZnlTcGxpY2VzKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIHNwbGljZXMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciByZWFkaW5nIGEgdmFsdWUgZnJvbSBhIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlLCBpZiBhbnkgcGFydCBpbiB0aGUgcGF0aCBpcyB1bmRlZmluZWQsIHRoaXMgbWV0aG9kIHJldHVybnMKICAgICAgICAgKiBgdW5kZWZpbmVkYCAodGhpcyBtZXRob2QgZG9lcyBub3QgdGhyb3cgd2hlbiBkZXJlZmVyZW5jaW5nIHVuZGVmaW5lZAogICAgICAgICAqIHBhdGhzKS4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3whQXJyYXk8KHN0cmluZ3xudW1iZXIpPil9IHBhdGggUGF0aCB0byB0aGUgdmFsdWUKICAgICAgICAgKiAgIHRvIHJlYWQuICBUaGUgcGF0aCBtYXkgYmUgc3BlY2lmaWVkIGFzIGEgc3RyaW5nIChlLmcuIGBmb28uYmFyLmJhemApCiAgICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgICAqICAgYnJhY2tldGVkIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkOyBzdHJpbmctYmFzZWQgcGF0aCBwYXJ0cwogICAgICAgICAqICAgKm11c3QqIGJlIHNlcGFyYXRlZCBieSBkb3RzLiAgTm90ZSB0aGF0IHdoZW4gZGVyZWZlcmVuY2luZyBhcnJheQogICAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICAgKiAgIChlLmcuIGB1c2Vycy4xMi5uYW1lYCBvciBgWyd1c2VycycsIDEyLCAnbmFtZSddYCkuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgICAqIEByZXR1cm4geyp9IFZhbHVlIGF0IHRoZSBwYXRoLCBvciBgdW5kZWZpbmVkYCBpZiBhbnkgcGFydCBvZiB0aGUgcGF0aAogICAgICAgICAqICAgaXMgdW5kZWZpbmVkLgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBnZXQocGF0aCwgcm9vdCkgewogICAgICAgICAgcmV0dXJuIGdldChyb290IHx8IHRoaXMsIHBhdGgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBzZXR0aW5nIGEgdmFsdWUgdG8gYSBwYXRoIGFuZCBub3RpZnlpbmcgYW55CiAgICAgICAgICogZWxlbWVudHMgYm91bmQgdG8gdGhlIHNhbWUgcGF0aC4KICAgICAgICAgKgogICAgICAgICAqIE5vdGUsIGlmIGFueSBwYXJ0IGluIHRoZSBwYXRoIGV4Y2VwdCBmb3IgdGhlIGxhc3QgaXMgdW5kZWZpbmVkLAogICAgICAgICAqIHRoaXMgbWV0aG9kIGRvZXMgbm90aGluZyAodGhpcyBtZXRob2QgZG9lcyBub3QgdGhyb3cgd2hlbgogICAgICAgICAqIGRlcmVmZXJlbmNpbmcgdW5kZWZpbmVkIHBhdGhzKS4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7KHN0cmluZ3whQXJyYXk8KHN0cmluZ3xudW1iZXIpPil9IHBhdGggUGF0aCB0byB0aGUgdmFsdWUKICAgICAgICAgKiAgIHRvIHdyaXRlLiAgVGhlIHBhdGggbWF5IGJlIHNwZWNpZmllZCBhcyBhIHN0cmluZyAoZS5nLiBgJ2Zvby5iYXIuYmF6J2ApCiAgICAgICAgICogICBvciBhbiBhcnJheSBvZiBwYXRoIHBhcnRzIChlLmcuIGBbJ2Zvby5iYXInLCAnYmF6J11gKS4gIE5vdGUgdGhhdAogICAgICAgICAqICAgYnJhY2tldGVkIGV4cHJlc3Npb25zIGFyZSBub3Qgc3VwcG9ydGVkOyBzdHJpbmctYmFzZWQgcGF0aCBwYXJ0cwogICAgICAgICAqICAgKm11c3QqIGJlIHNlcGFyYXRlZCBieSBkb3RzLiAgTm90ZSB0aGF0IHdoZW4gZGVyZWZlcmVuY2luZyBhcnJheQogICAgICAgICAqICAgaW5kaWNlcywgdGhlIGluZGV4IG1heSBiZSB1c2VkIGFzIGEgZG90dGVkIHBhcnQgZGlyZWN0bHkKICAgICAgICAgKiAgIChlLmcuIGAndXNlcnMuMTIubmFtZSdgIG9yIGBbJ3VzZXJzJywgMTIsICduYW1lJ11gKS4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNldCBhdCB0aGUgc3BlY2lmaWVkIHBhdGguCiAgICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSByb290IFJvb3Qgb2JqZWN0IGZyb20gd2hpY2ggdGhlIHBhdGggaXMgZXZhbHVhdGVkLgogICAgICAgICAqICAgV2hlbiBzcGVjaWZpZWQsIG5vIG5vdGlmaWNhdGlvbiB3aWxsIG9jY3VyLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIHNldChwYXRoLCB2YWx1ZSwgcm9vdCkgewogICAgICAgICAgaWYgKHJvb3QpIHsKICAgICAgICAgICAgc2V0KHJvb3QsIHBhdGgsIHZhbHVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICghdGhpc1tUWVBFUy5SRUFEX09OTFldIHx8ICF0aGlzW1RZUEVTLlJFQURfT05MWV1bLyoqIEB0eXBlIHtzdHJpbmd9ICovKHBhdGgpXSkgewogICAgICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocGF0aCwgdmFsdWUsIHRydWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBlbmQgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIHB1c2ggb250byBhcnJheQogICAgICAgICAqIEByZXR1cm4ge251bWJlcn0gTmV3IGxlbmd0aCBvZiB0aGUgYXJyYXkuCiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIHB1c2gocGF0aCwgLi4uaXRlbXMpIHsKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9Ki8oZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICAgIGxldCBsZW4gPSBhcnJheS5sZW5ndGg7CiAgICAgICAgICBsZXQgcmV0ID0gYXJyYXkucHVzaCguLi5pdGVtcyk7CiAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBsZW4sIGl0ZW1zLmxlbmd0aCwgW10pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYW4gaXRlbSBmcm9tIHRoZSBlbmQgb2YgYXJyYXkgYXQgdGhlIHBhdGggc3BlY2lmaWVkLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGFyZ3VtZW50cyBhZnRlciBgcGF0aGAgYW5kIHJldHVybiB2YWx1ZSBtYXRjaCB0aGF0IG9mCiAgICAgICAgICogYEFycmF5LnByb3RvdHlwZS5wb3BgLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2Qgbm90aWZpZXMgb3RoZXIgcGF0aHMgdG8gdGhlIHNhbWUgYXJyYXkgdGhhdCBhCiAgICAgICAgICogc3BsaWNlIG9jY3VycmVkIHRvIHRoZSBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nIHwgIUFycmF5PHN0cmluZ3xudW1iZXI+fSBwYXRoIFBhdGggdG8gYXJyYXkuCiAgICAgICAgICogQHJldHVybiB7Kn0gSXRlbSB0aGF0IHdhcyByZW1vdmVkLgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBwb3AocGF0aCkgewogICAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICAgIGxldCBoYWRMZW5ndGggPSBCb29sZWFuKGFycmF5Lmxlbmd0aCk7CiAgICAgICAgICBsZXQgcmV0ID0gYXJyYXkucG9wKCk7CiAgICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCBhcnJheS5sZW5ndGgsIDAsIFtyZXRdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTdGFydGluZyBmcm9tIHRoZSBzdGFydCBpbmRleCBzcGVjaWZpZWQsIHJlbW92ZXMgMCBvciBtb3JlIGl0ZW1zCiAgICAgICAgICogZnJvbSB0aGUgYXJyYXkgYW5kIGluc2VydHMgMCBvciBtb3JlIG5ldyBpdGVtcyBpbiB0aGVpciBwbGFjZS4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgICAqIGBBcnJheS5wcm90b3R5cGUuc3BsaWNlYC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIG5vdGlmaWVzIG90aGVyIHBhdGhzIHRvIHRoZSBzYW1lIGFycmF5IHRoYXQgYQogICAgICAgICAqIHNwbGljZSBvY2N1cnJlZCB0byB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxzdHJpbmd8bnVtYmVyPn0gcGF0aCBQYXRoIHRvIGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBJbmRleCBmcm9tIHdoaWNoIHRvIHN0YXJ0IHJlbW92aW5nL2luc2VydGluZy4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IGRlbGV0ZUNvdW50IE51bWJlciBvZiBpdGVtcyB0byByZW1vdmUuCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBpdGVtcyBJdGVtcyB0byBpbnNlcnQgaW50byBhcnJheS4KICAgICAgICAgKiBAcmV0dXJuIHshQXJyYXl9IEFycmF5IG9mIHJlbW92ZWQgaXRlbXMuCiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIHNwbGljZShwYXRoLCBzdGFydCwgZGVsZXRlQ291bnQsIC4uLml0ZW1zKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHtwYXRoIDogJyd9OwogICAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICAgIC8vIE5vcm1hbGl6ZSBmYW5jeSBuYXRpdmUgc3BsaWNlIGhhbmRsaW5nIG9mIGNyYXp5IHN0YXJ0IHZhbHVlcwogICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICBzdGFydCA9IGFycmF5Lmxlbmd0aCAtIE1hdGguZmxvb3IoLXN0YXJ0KTsKICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKICAgICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIGFycmF5LnNwbGljZSBkb2VzIGRpZmZlcmVudCB0aGluZ3MgYmFzZWQgb24gdGhlIG51bWJlciBvZiBhcmd1bWVudHMKICAgICAgICAgIC8vIHlvdSBwYXNzIGluLiBUaGVyZWZvcmUsIGFycmF5LnNwbGljZSgwKSBhbmQgYXJyYXkuc3BsaWNlKDAsIHVuZGVmaW5lZCkKICAgICAgICAgIC8vIGRvIGRpZmZlcmVudCB0aGluZ3MuIEluIHRoZSBmb3JtZXIsIHRoZSB3aG9sZSBhcnJheSBpcyBjbGVhcmVkLiBJbiB0aGUKICAgICAgICAgIC8vIGxhdHRlciwgbm8gaXRlbXMgYXJlIHJlbW92ZWQuCiAgICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgd2UgbmVlZCB0byBkZXRlY3Qgd2hldGhlciAxLiBvbmUgb2YgdGhlIGFyZ3VtZW50cwogICAgICAgICAgLy8gaXMgYWN0dWFsbHkgcGFzc2VkIGluIGFuZCB0aGVuIDIuIGRldGVybWluZSBob3cgbWFueSBhcmd1bWVudHMKICAgICAgICAgIC8vIHdlIHNob3VsZCBwYXNzIG9uIHRvIHRoZSBuYXRpdmUgYXJyYXkuc3BsaWNlCiAgICAgICAgICAvLwogICAgICAgICAgbGV0IHJldDsKICAgICAgICAgIC8vIE9taXQgYW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGlmIHRoZXkgd2VyZSBub3QgcGFzc2VkIGluCiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMikgewogICAgICAgICAgICByZXQgPSBhcnJheS5zcGxpY2Uoc3RhcnQpOwogICAgICAgICAgLy8gRWl0aGVyIHN0YXJ0IHdhcyB1bmRlZmluZWQgYW5kIHRoZSBvdGhlcnMgd2VyZSBkZWZpbmVkLCBidXQgaW4gdGhpcwogICAgICAgICAgLy8gY2FzZSB3ZSBjYW4gc2FmZWx5IHBhc3Mgb24gYWxsIGFyZ3VtZW50cwogICAgICAgICAgLy8KICAgICAgICAgIC8vIE5vdGU6IHRoaXMgaW5jbHVkZXMgdGhlIGNhc2Ugd2hlcmUgbm9uZSBvZiB0aGUgYXJndW1lbnRzIHdlcmUgcGFzc2VkIGluLAogICAgICAgICAgLy8gZS5nLiB0aGlzLnNwbGljZSgnYXJyYXknKS4gSG93ZXZlciwgaWYgYm90aCBzdGFydCBhbmQgZGVsZXRlQ291bnQKICAgICAgICAgIC8vIGFyZSB1bmRlZmluZWQsIGFycmF5LnNwbGljZSB3aWxsIG5vdCBtb2RpZnkgdGhlIGFycmF5IChhcyBleHBlY3RlZCkKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJldCA9IGFycmF5LnNwbGljZShzdGFydCwgZGVsZXRlQ291bnQsIC4uLml0ZW1zKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEF0IHRoZSBlbmQsIGNoZWNrIHdoZXRoZXIgYW55IGl0ZW1zIHdlcmUgcGFzc2VkIGluIChlLmcuIGluc2VydGlvbnMpCiAgICAgICAgICAvLyBvciBpZiB0aGUgcmV0dXJuIGFycmF5IGNvbnRhaW5zIGl0ZW1zIChlLmcuIGRlbGV0aW9ucykuCiAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBpZiBpdGVtcyB3ZXJlIGFkZGVkIG9yIGRlbGV0ZWQuCiAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoIHx8IHJldC5sZW5ndGgpIHsKICAgICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIHN0YXJ0LCBpdGVtcy5sZW5ndGgsIHJldCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIGJlZ2lubmluZyBvZiBhcnJheSBhdCB0aGUgcGF0aCBzcGVjaWZpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgYXJndW1lbnRzIGFmdGVyIGBwYXRoYCBhbmQgcmV0dXJuIHZhbHVlIG1hdGNoIHRoYXQgb2YKICAgICAgICAgKiBgQXJyYXkucHJvdG90eXBlLnBvcGAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICAgKiBAcmV0dXJuIHsqfSBJdGVtIHRoYXQgd2FzIHJlbW92ZWQuCiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIHNoaWZ0KHBhdGgpIHsKICAgICAgICAgIGxldCBpbmZvID0ge3BhdGg6ICcnfTsKICAgICAgICAgIGxldCBhcnJheSA9IC8qKiBAdHlwZSB7QXJyYXl9ICovKGdldCh0aGlzLCBwYXRoLCBpbmZvKSk7CiAgICAgICAgICBsZXQgaGFkTGVuZ3RoID0gQm9vbGVhbihhcnJheS5sZW5ndGgpOwogICAgICAgICAgbGV0IHJldCA9IGFycmF5LnNoaWZ0KCk7CiAgICAgICAgICBpZiAoaGFkTGVuZ3RoKSB7CiAgICAgICAgICAgIG5vdGlmeVNwbGljZSh0aGlzLCBhcnJheSwgaW5mby5wYXRoLCAwLCAwLCBbcmV0XSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBpdGVtcyBvbnRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGFycmF5IGF0IHRoZSBwYXRoIHNwZWNpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBhcmd1bWVudHMgYWZ0ZXIgYHBhdGhgIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhhdCBvZgogICAgICAgICAqIGBBcnJheS5wcm90b3R5cGUucHVzaGAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyBvdGhlciBwYXRocyB0byB0aGUgc2FtZSBhcnJheSB0aGF0IGEKICAgICAgICAgKiBzcGxpY2Ugb2NjdXJyZWQgdG8gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmcgfCAhQXJyYXk8c3RyaW5nfG51bWJlcj59IHBhdGggUGF0aCB0byBhcnJheS4KICAgICAgICAgKiBAcGFyYW0gey4uLip9IGl0ZW1zIEl0ZW1zIHRvIGluc2VydCBpbmZvIGFycmF5CiAgICAgICAgICogQHJldHVybiB7bnVtYmVyfSBOZXcgbGVuZ3RoIG9mIHRoZSBhcnJheS4KICAgICAgICAgKiBAcHVibGljCiAgICAgICAgICovCiAgICAgICAgdW5zaGlmdChwYXRoLCAuLi5pdGVtcykgewogICAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgICAgbGV0IGFycmF5ID0gLyoqIEB0eXBlIHtBcnJheX0gKi8oZ2V0KHRoaXMsIHBhdGgsIGluZm8pKTsKICAgICAgICAgIGxldCByZXQgPSBhcnJheS51bnNoaWZ0KC4uLml0ZW1zKTsKICAgICAgICAgIGlmIChpdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgbm90aWZ5U3BsaWNlKHRoaXMsIGFycmF5LCBpbmZvLnBhdGgsIDAsIGl0ZW1zLmxlbmd0aCwgW10pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE5vdGlmeSB0aGF0IGEgcGF0aCBoYXMgY2hhbmdlZC4KICAgICAgICAgKgogICAgICAgICAqIEV4YW1wbGU6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgdGhpcy5pdGVtLnVzZXIubmFtZSA9ICdCb2InOwogICAgICAgICAqICAgICB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW0udXNlci5uYW1lJyk7CiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBQYXRoIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkLgogICAgICAgICAqIEBwYXJhbSB7Kj19IHZhbHVlIFZhbHVlIGF0IHRoZSBwYXRoIChvcHRpb25hbCkuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHVibGljCiAgICAgICAgICovCiAgICAgICAgbm90aWZ5UGF0aChwYXRoLCB2YWx1ZSkgewogICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgICBsZXQgcHJvcFBhdGg7CiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgIC8vIEdldCB2YWx1ZSBpZiBub3Qgc3VwcGxpZWQKICAgICAgICAgICAgbGV0IGluZm8gPSB7cGF0aDogJyd9OwogICAgICAgICAgICB2YWx1ZSA9IGdldCh0aGlzLCBwYXRoLCBpbmZvKTsKICAgICAgICAgICAgcHJvcFBhdGggPSBpbmZvLnBhdGg7CiAgICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocGF0aCkpIHsKICAgICAgICAgICAgLy8gTm9ybWFsaXplIHBhdGggaWYgbmVlZGVkCiAgICAgICAgICAgIHByb3BQYXRoID0gbm9ybWFsaXplKHBhdGgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJvcFBhdGggPSAvKiogQHR5cGV7c3RyaW5nfSAqLyhwYXRoKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocHJvcFBhdGgsIHZhbHVlLCB0cnVlLCB0cnVlKSkgewogICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlUHJvcGVydGllcygpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZVJlYWRPbmx5UHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgICAqICAgd2hlbiBgdHJ1ZWAuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVJlYWRPbmx5UHJvcGVydHkocHJvcGVydHksIHByb3RlY3RlZFNldHRlcikgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFQURfT05MWSk7CiAgICAgICAgICBpZiAocHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgICAgIHRoaXNbJ19zZXQnICsgdXBwZXIocHJvcGVydHkpXSA9IC8qKiBAdGhpcyB7UHJvcGVydHlFZmZlY3RzfSAqL2Z1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVQcm9wZXJ0eU9ic2VydmVyYCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uKCosKil9IG1ldGhvZCBGdW5jdGlvbiBvciBuYW1lIG9mIG9ic2VydmVyIG1ldGhvZAogICAgICAgICAqICAgICB0byBjYWxsCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIocHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuKSB7CiAgICAgICAgICBsZXQgaW5mbyA9IHsgcHJvcGVydHksIG1ldGhvZCwgZHluYW1pY0ZuOiBCb29sZWFuKGR5bmFtaWNGbikgfTsKICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KHByb3BlcnR5LCBUWVBFUy5PQlNFUlZFLCB7CiAgICAgICAgICAgIGZuOiBydW5PYnNlcnZlckVmZmVjdCwgaW5mbywgdHJpZ2dlcjoge25hbWU6IHByb3BlcnR5fQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoZHluYW1pY0ZuKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZFByb3BlcnR5RWZmZWN0KC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhtZXRob2QpLCBUWVBFUy5PQlNFUlZFLCB7CiAgICAgICAgICAgICAgZm46IHJ1bk9ic2VydmVyRWZmZWN0LCBpbmZvLCB0cmlnZ2VyOiB7bmFtZTogbWV0aG9kfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBjcmVhdGVNZXRob2RPYnNlcnZlcmAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAgICogICB3aGV0aGVyIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZU1ldGhvZE9ic2VydmVyKGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgICAgbGV0IHNpZyA9IHBhcnNlTWV0aG9kKGV4cHJlc3Npb24pOwogICAgICAgICAgaWYgKCFzaWcpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgb2JzZXJ2ZXIgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgICAgfQogICAgICAgICAgY3JlYXRlTWV0aG9kRWZmZWN0KHRoaXMsIHNpZywgVFlQRVMuT0JTRVJWRSwgcnVuTWV0aG9kRWZmZWN0LCBudWxsLCBkeW5hbWljRm4pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRXF1aXZhbGVudCB0byBzdGF0aWMgYGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5YCBBUEkgYnV0IGNhbiBiZSBjYWxsZWQgb24KICAgICAgICAgKiBhbiBpbnN0YW5jZSB0byBhZGQgZWZmZWN0cyBhdCBydW50aW1lLiAgU2VlIHRoYXQgbWV0aG9kIGZvcgogICAgICAgICAqIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVOb3RpZnlpbmdQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLk5PVElGWSwgewogICAgICAgICAgICBmbjogcnVuTm90aWZ5RWZmZWN0LAogICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgZXZlbnROYW1lOiBjYW1lbFRvRGFzaENhc2UocHJvcGVydHkpICsgJy1jaGFuZ2VkJywKICAgICAgICAgICAgICBwcm9wZXJ0eTogcHJvcGVydHkKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHlgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbgogICAgICAgICAqIGFuIGluc3RhbmNlIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yCiAgICAgICAgICogZnVsbCBBUEkgZG9jcy4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gZ28vbWlzc2luZ2ZucHJvcHMKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIGxldCBhdHRyID0gdGhpcy5jb25zdHJ1Y3Rvci5hdHRyaWJ1dGVOYW1lRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgaWYgKGF0dHJbMF0gPT09ICctJykgewogICAgICAgICAgICBjb25zb2xlLndhcm4oJ1Byb3BlcnR5ICcgKyBwcm9wZXJ0eSArICcgY2Fubm90IGJlIHJlZmxlY3RlZCB0byBhdHRyaWJ1dGUgJyArCiAgICAgICAgICAgICAgYXR0ciArICcgYmVjYXVzZSAiLSIgaXMgbm90IGEgdmFsaWQgc3RhcnRpbmcgYXR0cmlidXRlIG5hbWUuIFVzZSBhIGxvd2VyY2FzZSBmaXJzdCBsZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSBpbnN0ZWFkLicpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIFRZUEVTLlJFRkxFQ1QsIHsKICAgICAgICAgICAgICBmbjogcnVuUmVmbGVjdEVmZmVjdCwKICAgICAgICAgICAgICBpbmZvOiB7CiAgICAgICAgICAgICAgICBhdHRyTmFtZTogYXR0cgogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBFcXVpdmFsZW50IHRvIHN0YXRpYyBgY3JlYXRlQ29tcHV0ZWRQcm9wZXJ0eWAgQVBJIGJ1dCBjYW4gYmUgY2FsbGVkIG9uCiAgICAgICAgICogYW4gaW5zdGFuY2UgdG8gYWRkIGVmZmVjdHMgYXQgcnVudGltZS4gIFNlZSB0aGF0IG1ldGhvZCBmb3IKICAgICAgICAgKiBmdWxsIEFQSSBkb2NzLgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IE5hbWUgb2YgY29tcHV0ZWQgcHJvcGVydHkgdG8gc2V0CiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cHJlc3Npb24gTWV0aG9kIGV4cHJlc3Npb24KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW58T2JqZWN0PX0gZHluYW1pY0ZuIEJvb2xlYW4gb3Igb2JqZWN0IG1hcCBpbmRpY2F0aW5nCiAgICAgICAgICogICB3aGV0aGVyIG1ldGhvZCBuYW1lcyBzaG91bGQgYmUgaW5jbHVkZWQgYXMgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgICAgbGV0IHNpZyA9IHBhcnNlTWV0aG9kKGV4cHJlc3Npb24pOwogICAgICAgICAgaWYgKCFzaWcpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJNYWxmb3JtZWQgY29tcHV0ZWQgZXhwcmVzc2lvbiAnIiArIGV4cHJlc3Npb24gKyAiJyIpOwogICAgICAgICAgfQogICAgICAgICAgY29uc3QgaW5mbyA9IGNyZWF0ZU1ldGhvZEVmZmVjdCh0aGlzLCBzaWcsIFRZUEVTLkNPTVBVVEUsIHJ1bkNvbXB1dGVkRWZmZWN0LCBwcm9wZXJ0eSwgZHluYW1pY0ZuKTsKICAgICAgICAgIC8vIEVmZmVjdHMgYXJlIG5vcm1hbGx5IHN0b3JlZCBhcyBtYXAgb2YgZGVwZW5kZW5jeS0+ZWZmZWN0LCBidXQgZm9yCiAgICAgICAgICAvLyBvcmRlcmVkIGNvbXB1dGF0aW9uLCB3ZSBhbHNvIG5lZWQgdHJlZSBvZiBjb21wdXRlZFByb3AtPmRlcGVuZGVuY2llcwogICAgICAgICAgZW5zdXJlT3duRWZmZWN0TWFwKHRoaXMsIENPTVBVVEVfSU5GTylbcHJvcGVydHldID0gaW5mbzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdhdGhlciB0aGUgYXJndW1lbnQgdmFsdWVzIGZvciBhIG1ldGhvZCBzcGVjaWZpZWQgaW4gdGhlIHByb3ZpZGVkIGFycmF5CiAgICAgICAgICogb2YgYXJndW1lbnQgbWV0YWRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgYHBhdGhgIGFuZCBgdmFsdWVgIGFyZ3VtZW50cyBhcmUgdXNlZCB0byBmaWxsIGluIHdpbGRjYXJkIGRlc2NyaXB0b3IKICAgICAgICAgKiB3aGVuIHRoZSBtZXRob2QgaXMgYmVpbmcgY2FsbGVkIGFzIGEgcmVzdWx0IG9mIGEgcGF0aCBub3RpZmljYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFBcnJheTwhTWV0aG9kQXJnPn0gYXJncyBBcnJheSBvZiBhcmd1bWVudCBtZXRhZGF0YQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFByb3BlcnR5L3BhdGggbmFtZSB0aGF0IHRyaWdnZXJlZCB0aGUgbWV0aG9kIGVmZmVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7IUFycmF5PCo+fSBBcnJheSBvZiBhcmd1bWVudCB2YWx1ZXMKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9tYXJzaGFsQXJncyhhcmdzLCBwYXRoLCBwcm9wcykgewogICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuX19kYXRhOwogICAgICAgICAgY29uc3QgdmFsdWVzID0gW107CiAgICAgICAgICBmb3IgKGxldCBpPTAsIGw9YXJncy5sZW5ndGg7IGk8bDsgaSsrKSB7CiAgICAgICAgICAgIGxldCB7bmFtZSwgc3RydWN0dXJlZCwgd2lsZGNhcmQsIHZhbHVlLCBsaXRlcmFsfSA9IGFyZ3NbaV07CiAgICAgICAgICAgIGlmICghbGl0ZXJhbCkgewogICAgICAgICAgICAgIGlmICh3aWxkY2FyZCkgewogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IGlzRGVzY2VuZGFudChuYW1lLCBwYXRoKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhWYWx1ZSA9IGdldEFyZ1ZhbHVlKGRhdGEsIHByb3BzLCBtYXRjaGVzID8gcGF0aCA6IG5hbWUpOwogICAgICAgICAgICAgICAgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgIHBhdGg6IG1hdGNoZXMgPyBwYXRoIDogbmFtZSwKICAgICAgICAgICAgICAgICAgdmFsdWU6IHBhdGhWYWx1ZSwKICAgICAgICAgICAgICAgICAgYmFzZTogbWF0Y2hlcyA/IGdldChkYXRhLCBuYW1lKSA6IHBhdGhWYWx1ZQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsdWUgPSBzdHJ1Y3R1cmVkID8gZ2V0QXJnVmFsdWUoZGF0YSwgcHJvcHMsIG5hbWUpIDogZGF0YVtuYW1lXTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2hlbiB0aGUgYGxlZ2FjeVVuZGVmaW5lZGAgZmxhZyBpcyBlbmFibGVkLCBwYXNzIGEgbm8tb3AgdmFsdWUKICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgb2JzZXJ2ZXIsIGNvbXB1dGVkIHByb3BlcnR5LCBvciBjb21wb3VuZCBiaW5kaW5nIGlzIGFib3J0ZWQuCiAgICAgICAgICAgIGlmIChsZWdhY3lVbmRlZmluZWQgJiYgIXRoaXMuX292ZXJyaWRlTGVnYWN5VW5kZWZpbmVkICYmIHZhbHVlID09PSB1bmRlZmluZWQgJiYgYXJncy5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgcmV0dXJuIE5PT1A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFsdWVzW2ldID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0gc3RhdGljIGNsYXNzIG1ldGhvZHMgLS0tLS0tLS0tLS0tCgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgYW4gYWNjZXNzb3IgZXhpc3RzIGZvciB0aGUgc3BlY2lmaWVkIHByb3BlcnR5LCBhbmQgYWRkcwogICAgICAgICAqIHRvIGEgbGlzdCBvZiAicHJvcGVydHkgZWZmZWN0cyIgdGhhdCB3aWxsIHJ1biB3aGVuIHRoZSBhY2Nlc3NvciBmb3IKICAgICAgICAgKiB0aGUgc3BlY2lmaWVkIHByb3BlcnR5IGlzIHNldC4gIEVmZmVjdHMgYXJlIGdyb3VwZWQgYnkgInR5cGUiLCB3aGljaAogICAgICAgICAqIHJvdWdobHkgY29ycmVzcG9uZHMgdG8gYSBwaGFzZSBpbiBlZmZlY3QgcHJvY2Vzc2luZy4gIFRoZSBlZmZlY3QKICAgICAgICAgKiBtZXRhZGF0YSBzaG91bGQgYmUgaW4gdGhlIGZvbGxvd2luZyBmb3JtOgogICAgICAgICAqCiAgICAgICAgICogICAgIHsKICAgICAgICAgKiAgICAgICBmbjogZWZmZWN0RnVuY3Rpb24sIC8vIFJlZmVyZW5jZSB0byBmdW5jdGlvbiB0byBjYWxsIHRvIHBlcmZvcm0gZWZmZWN0CiAgICAgICAgICogICAgICAgaW5mbzogeyAuLi4gfSAgICAgICAvLyBFZmZlY3QgbWV0YWRhdGEgcGFzc2VkIHRvIGZ1bmN0aW9uCiAgICAgICAgICogICAgICAgdHJpZ2dlcjogeyAgICAgICAgICAvLyBPcHRpb25hbCB0cmlnZ2VyaW5nIG1ldGFkYXRhOyBpZiBub3QgcHJvdmlkZWQKICAgICAgICAgKiAgICAgICAgIG5hbWU6IHN0cmluZyAgICAgIC8vIHRoZSBwcm9wZXJ0eSBpcyB0cmVhdGVkIGFzIGEgd2lsZGNhcmQKICAgICAgICAgKiAgICAgICAgIHN0cnVjdHVyZWQ6IGJvb2xlYW4KICAgICAgICAgKiAgICAgICAgIHdpbGRjYXJkOiBib29sZWFuCiAgICAgICAgICogICAgICAgfQogICAgICAgICAqICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBFZmZlY3RzIGFyZSBjYWxsZWQgZnJvbSBgX3Byb3BlcnRpZXNDaGFuZ2VkYCBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGJ5CiAgICAgICAgICogdHlwZToKICAgICAgICAgKgogICAgICAgICAqIDEuIENPTVBVVEUKICAgICAgICAgKiAyLiBQUk9QQUdBVEUKICAgICAgICAgKiAzLiBSRUZMRUNUCiAgICAgICAgICogNC4gT0JTRVJWRQogICAgICAgICAqIDUuIE5PVElGWQogICAgICAgICAqCiAgICAgICAgICogRWZmZWN0IGZ1bmN0aW9ucyBhcmUgY2FsbGVkIHdpdGggdGhlIGZvbGxvd2luZyBzaWduYXR1cmU6CiAgICAgICAgICoKICAgICAgICAgKiAgICAgZWZmZWN0RnVuY3Rpb24oaW5zdCwgcGF0aCwgcHJvcHMsIG9sZFByb3BzLCBpbmZvLCBoYXNQYXRocykKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSB0aGF0IHNob3VsZCB0cmlnZ2VyIHRoZSBlZmZlY3QKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFZmZlY3QgdHlwZSwgZnJvbSB0aGlzLlBST1BFUlRZX0VGRkVDVF9UWVBFUwogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhZGRQcm9wZXJ0eUVmZmVjdChwcm9wZXJ0eSwgdHlwZSwgZWZmZWN0KSB7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QocHJvcGVydHksIHR5cGUsIGVmZmVjdCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2luZ2xlLXByb3BlcnR5IG9ic2VydmVyIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfGZ1bmN0aW9uKCosKil9IG1ldGhvZCBGdW5jdGlvbiBvciBuYW1lIG9mIG9ic2VydmVyIG1ldGhvZCB0byBjYWxsCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZHluYW1pY0ZuIFdoZXRoZXIgdGhlIG1ldGhvZCBuYW1lIHNob3VsZCBiZSBpbmNsdWRlZCBhcwogICAgICAgICAqICAgYSBkZXBlbmRlbmN5IHRvIHRoZSBlZmZlY3QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydHlPYnNlcnZlcihwcm9wZXJ0eSwgbWV0aG9kLCBkeW5hbWljRm4pIHsKICAgICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVQcm9wZXJ0eU9ic2VydmVyKHByb3BlcnR5LCBtZXRob2QsIGR5bmFtaWNGbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbXVsdGktcHJvcGVydHkgIm1ldGhvZCBvYnNlcnZlciIgYmFzZWQgb24gdGhlIHByb3ZpZGVkCiAgICAgICAgICogZXhwcmVzc2lvbiwgd2hpY2ggc2hvdWxkIGJlIGEgc3RyaW5nIGluIHRoZSBmb3JtIG9mIGEgbm9ybWFsIEphdmFTY3JpcHQKICAgICAgICAgKiBmdW5jdGlvbiBzaWduYXR1cmU6IGAnbWV0aG9kTmFtZShhcmcxLCBbLi4uLCBhcmduXSknYC4gIEVhY2ggYXJndW1lbnQKICAgICAgICAgKiBzaG91bGQgY29ycmVzcG9uZCB0byBhIHByb3BlcnR5IG9yIHBhdGggaW4gdGhlIGNvbnRleHQgb2YgdGhpcwogICAgICAgICAqIHByb3RvdHlwZSAob3IgaW5zdGFuY2UpLCBvciBtYXkgYmUgYSBsaXRlcmFsIHN0cmluZyBvciBudW1iZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXhwcmVzc2lvbiBNZXRob2QgZXhwcmVzc2lvbgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbnxPYmplY3Q9fSBkeW5hbWljRm4gQm9vbGVhbiBvciBvYmplY3QgbWFwIGluZGljYXRpbmcKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqICAgd2hldGhlciBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVNZXRob2RPYnNlcnZlcihleHByZXNzaW9uLCBkeW5hbWljRm4pIHsKICAgICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVNZXRob2RPYnNlcnZlcihleHByZXNzaW9uLCBkeW5hbWljRm4pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2F1c2VzIHRoZSBzZXR0ZXIgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eSB0byBkaXNwYXRjaCBgPHByb3BlcnR5Pi1jaGFuZ2VkYAogICAgICAgICAqIGV2ZW50cyB0byBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNyZWF0ZU5vdGlmeWluZ1Byb3BlcnR5KHByb3BlcnR5KSB7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHJlYWQtb25seSBhY2Nlc3NvciBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogVG8gc2V0IHRoZSBwcm9wZXJ0eSwgdXNlIHRoZSBwcm90ZWN0ZWQgYF9zZXRQcm9wZXJ0eWAgQVBJLgogICAgICAgICAqIFRvIGNyZWF0ZSBhIGN1c3RvbSBwcm90ZWN0ZWQgc2V0dGVyIChlLmcuIGBfc2V0TXlQcm9wKClgIGZvcgogICAgICAgICAqIHByb3BlcnR5IGBteVByb3BgKSwgcGFzcyBgdHJ1ZWAgZm9yIGBwcm90ZWN0ZWRTZXR0ZXJgLgogICAgICAgICAqCiAgICAgICAgICogTm90ZSwgaWYgdGhlIHByb3BlcnR5IHdpbGwgaGF2ZSBvdGhlciBwcm9wZXJ0eSBlZmZlY3RzLCB0aGlzIG1ldGhvZAogICAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgZmlyc3QsIGJlZm9yZSBhZGRpbmcgb3RoZXIgZWZmZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gcHJvdGVjdGVkU2V0dGVyIENyZWF0ZXMgYSBjdXN0b20gcHJvdGVjdGVkIHNldHRlcgogICAgICAgICAqICAgd2hlbiBgdHJ1ZWAuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKSB7CiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShwcm9wZXJ0eSwgcHJvdGVjdGVkU2V0dGVyKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhdXNlcyB0aGUgc2V0dGVyIGZvciB0aGUgZ2l2ZW4gcHJvcGVydHkgdG8gcmVmbGVjdCB0aGUgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiB0byBhIChkYXNoLWNhc2VkKSBhdHRyaWJ1dGUgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlUmVmbGVjdGVkUHJvcGVydHkocHJvcGVydHkpIHsKICAgICAgICAgIHRoaXMucHJvdG90eXBlLl9jcmVhdGVSZWZsZWN0ZWRQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgY29tcHV0ZWQgcHJvcGVydHkgd2hvc2UgdmFsdWUgaXMgc2V0IHRvIHRoZSByZXN1bHQgb2YgdGhlCiAgICAgICAgICogbWV0aG9kIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gYGV4cHJlc3Npb25gIGVhY2ggdGltZSBvbmUgb3IgbW9yZQogICAgICAgICAqIGFyZ3VtZW50cyB0byB0aGUgbWV0aG9kIGNoYW5nZXMuICBUaGUgZXhwcmVzc2lvbiBzaG91bGQgYmUgYSBzdHJpbmcKICAgICAgICAgKiBpbiB0aGUgZm9ybSBvZiBhIG5vcm1hbCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHNpZ25hdHVyZToKICAgICAgICAgKiBgJ21ldGhvZE5hbWUoYXJnMSwgWy4uLiwgYXJnbl0pJ2AKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIGNvbXB1dGVkIHByb3BlcnR5IHRvIHNldAogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHByZXNzaW9uIE1ldGhvZCBleHByZXNzaW9uCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufE9iamVjdD19IGR5bmFtaWNGbiBCb29sZWFuIG9yIG9iamVjdCBtYXAgaW5kaWNhdGluZyB3aGV0aGVyCiAgICAgICAgICogICBtZXRob2QgbmFtZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGFzIGEgZGVwZW5kZW5jeSB0byB0aGUgZWZmZWN0LgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbikgewogICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkocHJvcGVydHksIGV4cHJlc3Npb24sIGR5bmFtaWNGbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBQYXJzZXMgdGhlIHByb3ZpZGVkIHRlbXBsYXRlIHRvIGVuc3VyZSBiaW5kaW5nIGVmZmVjdHMgYXJlIGNyZWF0ZWQKICAgICAgICAgKiBmb3IgdGhlbSwgYW5kIHRoZW4gZW5zdXJlcyBwcm9wZXJ0eSBhY2Nlc3NvcnMgYXJlIGNyZWF0ZWQgZm9yIGFueQogICAgICAgICAqIGRlcGVuZGVudCBwcm9wZXJ0aWVzIGluIHRoZSB0ZW1wbGF0ZS4gIEJpbmRpbmcgZWZmZWN0cyBmb3IgYm91bmQKICAgICAgICAgKiB0ZW1wbGF0ZXMgYXJlIHN0b3JlZCBpbiBhIGxpbmtlZCBsaXN0IG9uIHRoZSBpbnN0YW5jZSBzbyB0aGF0CiAgICAgICAgICogdGVtcGxhdGVzIGNhbiBiZSBlZmZpY2llbnRseSBzdGFtcGVkIGFuZCB1bnN0YW1wZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSBjb250YWluaW5nIGJpbmRpbmcKICAgICAgICAgKiAgIGJpbmRpbmdzCiAgICAgICAgICogQHJldHVybiB7IVRlbXBsYXRlSW5mb30gVGVtcGxhdGUgbWV0YWRhdGEgb2JqZWN0CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGJpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMucHJvdG90eXBlLl9iaW5kVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAgIH0KCiAgICAgICAgLy8gLS0gYmluZGluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAgIC8qCiAgICAgICAgICogT3ZlcnZpZXcgb2YgYmluZGluZyBmbG93OgogICAgICAgICAqCiAgICAgICAgICogRHVyaW5nIGZpbmFsaXphdGlvbiAoYGluc3RhbmNlQmluZGluZz09ZmFsc2VgLCBgd2FzUHJlQm91bmQ9PWZhbHNlYCk6CiAgICAgICAgICogIGBfYmluZFRlbXBsYXRlKHQsIGZhbHNlKWAgY2FsbGVkIGRpcmVjdGx5IGR1cmluZyBmaW5hbGl6YXRpb24gLSBwYXJzZXMKICAgICAgICAgKiAgdGhlIHRlbXBsYXRlIChmb3IgdGhlIGZpcnN0IHRpbWUpLCBhbmQgdGhlbiBhc3NpZ25zIHRoYXQgX3Byb3RvdHlwaWNhbF8KICAgICAgICAgKiAgdGVtcGxhdGUgaW5mbyB0byBgX19wcmVib3VuZFRlbXBsYXRlSW5mb2AgX29uIHRoZSBwcm90b3R5cGVfOyBub3RlIGluCiAgICAgICAgICogIHRoaXMgY2FzZSBgd2FzUHJlQm91bmRgIGlzIGZhbHNlOyB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3JlIGJpbmRpbmcKICAgICAgICAgKiAgaXQsIHRodXMgd2UgY3JlYXRlIGFjY2Vzc29ycy4KICAgICAgICAgKgogICAgICAgICAqIER1cmluZyBmaXJzdCBzdGFtcGluZyAoYGluc3RhbmNlQmluZGluZz09dHJ1ZWAsIGB3YXNQcmVCb3VuZD09dHJ1ZWApOgogICAgICAgICAqICAgYF9zdGFtcFRlbXBsYXRlYCBjYWxscyBgX2JpbmRUZW1wbGF0ZSh0LCB0cnVlKWA6IHRoZSBgdGVtcGxhdGVJbmZvYAogICAgICAgICAqICAgcmV0dXJuZWQgbWF0Y2hlcyB0aGUgcHJlYm91bmQgb25lLCBhbmQgc28gdGhpcyBpcyBgd2FzUHJlQm91bmQgPT0gdHJ1ZWAKICAgICAgICAgKiAgIHN0YXRlOyB0aHVzIHdlIF9za2lwXyBjcmVhdGluZyBhY2Nlc3NvcnMsIGJ1dCBfZG9fIGNyZWF0ZSBhbiBpbnN0YW5jZQogICAgICAgICAqICAgb2YgdGhlIHRlbXBsYXRlIGluZm8gdG8gc2VydmUgYXMgdGhlIHN0YXJ0IG9mIG91ciBsaW5rZWQgbGlzdCAobmVlZHMgdG8KICAgICAgICAgKiAgIGJlIGFuIGluc3RhbmNlLCBub3QgdGhlIHByb3RvdHlwaWNhbCBvbmUsIHNvIHRoYXQgd2UgY2FuIGFkZCBgbm9kZUxpc3RgCiAgICAgICAgICogICB0byBpdCB0byBjb250YWluIHRoZSBgbm9kZUluZm9gLW9yZGVyZWQgbGlzdCBvZiBpbnN0YW5jZSBub2RlcyBmb3IKICAgICAgICAgKiAgIGJpbmRpbmdzLCBhbmQgc28gd2UgY2FuIGNoYWluIHJ1bnRpbWUtc3RhbXBlZCB0ZW1wbGF0ZSBpbmZvcyBvZmYgb2YKICAgICAgICAgKiAgIGl0KS4gQXQgdGhpcyBwb2ludCwgdGhlIGNhbGwgdG8gYF9zdGFtcFRlbXBsYXRlYCBjYWxscwogICAgICAgICAqICAgYGFwcGx5VGVtcGxhdGVJbmZvYCBmb3IgZWFjaCBuZXN0ZWQgYDx0ZW1wbGF0ZT5gIGZvdW5kIGR1cmluZyBwYXJzaW5nCiAgICAgICAgICogICB0byBoYW5kIHByb3RvdHlwaWNhbCBgX3RlbXBsYXRlSW5mb2AgdG8gdGhlbTsgd2UgYWxzbyBwYXNzIHRoZSBfcGFyZW50XwogICAgICAgICAqICAgYHRlbXBsYXRlSW5mb2AgdG8gdGhlIGA8dGVtcGxhdGU+YCBzbyB0aGF0IHdlIGhhdmUgdGhlIGluc3RhbmNlLXRpbWUKICAgICAgICAgKiAgIHBhcmVudCB0byBsaW5rIHRoZSBgdGVtcGxhdGVJbmZvYCB1bmRlciBpbiB0aGUgY2FzZSBpdCB3YXMKICAgICAgICAgKiAgIHJ1bnRpbWUtc3RhbXBlZC4KICAgICAgICAgKgogICAgICAgICAqIER1cmluZyBzdWJzZXF1ZW50IHJ1bnRpbWUgc3RhbXBpbmcgKGBpbnN0YW5jZUJpbmRpbmc9PXRydWVgLAogICAgICAgICAqICAgYHdhc1ByZUJvdW5kPT1mYWxzZWApOiBgX3N0YW1wVGVtcGxhdGVgIGNhbGxzIGBfYmluZFRlbXBsYXRlKHQsIHRydWUpYAogICAgICAgICAqICAgLSBoZXJlIGB0ZW1wbGF0ZUluZm9gIGlzIGd1YXJhbnRlZWQgdG8gX25vdF8gbWF0Y2ggdGhlIHByZWJvdW5kIG9uZSwKICAgICAgICAgKiAgIGJlY2F1c2UgaXQgd2FzIGVpdGhlciBhIGRpZmZlcmVudCB0ZW1wbGF0ZSBhbHRvZ2V0aGVyLCBvciBldmVuIGlmIGl0CiAgICAgICAgICogICB3YXMgdGhlIHNhbWUgdGVtcGxhdGUsIHRoZSBzdGVwIGFib3ZlIGNyZWF0ZWQgYSBpbnN0YW5jZSBvZiB0aGUgaW5mbzsKICAgICAgICAgKiAgIGluIHRoaXMgY2FzZSBgd2FzUHJlQm91bmQgPT0gZmFsc2VgLCBzbyB3ZSBfZG9fIGNyZWF0ZSBhY2Nlc3NvcnMsIF9hbmRfCiAgICAgICAgICogICBsaW5rIGEgaW5zdGFuY2UgaW50byB0aGUgbGlua2VkIGxpc3QuCiAgICAgICAgICovCgogICAgICAgIC8qKgogICAgICAgICAqIEVxdWl2YWxlbnQgdG8gc3RhdGljIGBiaW5kVGVtcGxhdGVgIEFQSSBidXQgY2FuIGJlIGNhbGxlZCBvbiBhbiBpbnN0YW5jZQogICAgICAgICAqIHRvIGFkZCBlZmZlY3RzIGF0IHJ1bnRpbWUuICBTZWUgdGhhdCBtZXRob2QgZm9yIGZ1bGwgQVBJIGRvY3MuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgKGZvciBwcm90b3R5cGljYWwgdGVtcGxhdGUKICAgICAgICAgKiBiaW5kaW5nLCB0byBhdm9pZCBjcmVhdGluZyBhY2Nlc3NvcnMgZXZlcnkgaW5zdGFuY2UpIG9uY2UgcGVyIHByb3RvdHlwZSwKICAgICAgICAgKiBhbmQgd2lsbCBiZSBjYWxsZWQgd2l0aCBgcnVudGltZUJpbmRpbmc6IHRydWVgIGJ5IGBfc3RhbXBUZW1wbGF0ZWAgdG8KICAgICAgICAgKiBjcmVhdGUgYW5kIGxpbmsgYW4gaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBhCiAgICAgICAgICogcGFydGljdWxhciBzdGFtcGluZy4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIGNvbnRhaW5pbmcgYmluZGluZwogICAgICAgICAqIGJpbmRpbmdzCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gaW5zdGFuY2VCaW5kaW5nIFdoZW4gZmFsc2UgKGRlZmF1bHQpLCBwZXJmb3JtcwogICAgICAgICAqICJwcm90b3R5cGljYWwiIGJpbmRpbmcgb2YgdGhlIHRlbXBsYXRlIGFuZCBvdmVyd3JpdGVzIGFueSBwcmV2aW91c2x5CiAgICAgICAgICogYm91bmQgdGVtcGxhdGUgZm9yIHRoZSBjbGFzcy4gV2hlbiB0cnVlIChhcyBwYXNzZWQgZnJvbQogICAgICAgICAqIGBfc3RhbXBUZW1wbGF0ZWApLCB0aGUgdGVtcGxhdGUgaW5mbyBpcyBpbnN0YW5jZWQgYW5kIGxpbmtlZCBpbnRvIHRoZQogICAgICAgICAqIGxpc3Qgb2YgYm91bmQgdGVtcGxhdGVzLgogICAgICAgICAqIEByZXR1cm4geyFUZW1wbGF0ZUluZm99IFRlbXBsYXRlIG1ldGFkYXRhIG9iamVjdDsgZm9yIGBydW50aW1lQmluZGluZ2AsCiAgICAgICAgICogdGhpcyBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgcHJvdG90eXBpY2FsIHRlbXBsYXRlIGluZm8KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gZ28vbWlzc2luZ2ZucHJvcHMKICAgICAgICAgKi8KICAgICAgICBfYmluZFRlbXBsYXRlKHRlbXBsYXRlLCBpbnN0YW5jZUJpbmRpbmcpIHsKICAgICAgICAgIGxldCB0ZW1wbGF0ZUluZm8gPSB0aGlzLmNvbnN0cnVjdG9yLl9wYXJzZVRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICAgIGxldCB3YXNQcmVCb3VuZCA9IHRoaXMuX19wcmVCb3VuZFRlbXBsYXRlSW5mbyA9PSB0ZW1wbGF0ZUluZm87CiAgICAgICAgICAvLyBPcHRpbWl6YXRpb246IHNpbmNlIHRoaXMgaXMgY2FsbGVkIHR3aWNlIGZvciBwcm90by1ib3VuZCB0ZW1wbGF0ZXMsCiAgICAgICAgICAvLyBkb24ndCBhdHRlbXB0IHRvIHJlY3JlYXRlIGFjY2Vzc29ycyBpZiB0aGlzIHRlbXBsYXRlIHdhcyBwcmUtYm91bmQKICAgICAgICAgIGlmICghd2FzUHJlQm91bmQpIHsKICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiB0ZW1wbGF0ZUluZm8ucHJvcGVydHlFZmZlY3RzKSB7CiAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlUHJvcGVydHlBY2Nlc3Nvcihwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGluc3RhbmNlQmluZGluZykgewogICAgICAgICAgICAvLyBGb3IgaW5zdGFuY2UtdGltZSBiaW5kaW5nLCBjcmVhdGUgaW5zdGFuY2Ugb2YgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgICAgLy8gYW5kIGxpbmsgaW50byB0cmVlIG9mIHRlbXBsYXRlcyBpZiBuZWNlc3NhcnkKICAgICAgICAgICAgdGVtcGxhdGVJbmZvID0gLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfSAqLyhPYmplY3QuY3JlYXRlKHRlbXBsYXRlSW5mbykpOwogICAgICAgICAgICB0ZW1wbGF0ZUluZm8ud2FzUHJlQm91bmQgPSB3YXNQcmVCb3VuZDsKICAgICAgICAgICAgaWYgKCF0aGlzLl9fdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICAgICAgLy8gU2V0IHRoZSBpbmZvIHRvIHRoZSByb290IG9mIHRoZSB0cmVlCiAgICAgICAgICAgICAgdGhpcy5fX3RlbXBsYXRlSW5mbyA9IHRlbXBsYXRlSW5mbzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAvLyBBcHBlbmQgdGhpcyB0ZW1wbGF0ZSBpbmZvIG9udG8gdGhlIGVuZCBvZiBpdHMgcGFyZW50IHRlbXBsYXRlJ3MKICAgICAgICAgICAgICAvLyBsaXN0LCB3aGljaCB3aWxsIGRldGVybWluZSB0aGUgdHJlZSBzdHJ1Y3R1cmUgdmlhIHdoaWNoIHByb3BlcnR5CiAgICAgICAgICAgICAgLy8gZWZmZWN0cyBhcmUgcnVuOyBpZiB0aGlzIHRlbXBsYXRlIHdhcyBub3QgbmVzdGVkIGluIGFub3RoZXIKICAgICAgICAgICAgICAvLyB0ZW1wbGF0ZSwgdXNlIHRoZSByb290IHRlbXBsYXRlICh0aGUgZmlyc3Qgc3RhbXBlZCBvbmUpIGFzIHRoZQogICAgICAgICAgICAgIC8vIHBhcmVudC4gTm90ZSwgYHBhcmVudGAgaXMgdGhlIGB0ZW1wbGF0ZUluZm9gIGluc3RhbmNlIGZvciB0aGlzCiAgICAgICAgICAgICAgLy8gdGVtcGxhdGUncyBwYXJlbnQgKGNvbnRhaW5pbmcpIHRlbXBsYXRlLCB3aGljaCB3YXMgc2V0IHVwIGluCiAgICAgICAgICAgICAgLy8gYGFwcGx5VGVtcGxhdGVJbmZvYC4gIFdoaWxlIGEgZ2l2ZW4gdGVtcGxhdGUncyBgcGFyZW50YCBpcyBzZXQKICAgICAgICAgICAgICAvLyBhcHJpb3JpLCBpdCBpcyBvbmx5IGFkZGVkIHRvIHRoZSBwYXJlbnQncyBjaGlsZCBsaXN0IGF0IHRoZSBwb2ludAogICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgYmVpbmcgYm91bmQsIHNpbmNlIGEgdGVtcGxhdGUgbWF5IG9yIG1heSBub3QgZXZlciBiZQogICAgICAgICAgICAgIC8vIHN0YW1wZWQsIGFuZCBtYXkgYmUgc3RhbXBlZCBtb3JlIHRoYW4gb25jZSAoaW4gd2hpY2ggY2FzZSBpbnN0YW5jZXMKICAgICAgICAgICAgICAvLyBvZiB0aGUgdGVtcGxhdGUgaW5mbyB3aWxsIGJlIGluIHRoZSB0cmVlIHVuZGVyIGl0cyBwYXJlbnQgbW9yZSB0aGFuCiAgICAgICAgICAgICAgLy8gb25jZSkuCiAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGVtcGxhdGUuX3BhcmVudFRlbXBsYXRlSW5mbyB8fCB0aGlzLl9fdGVtcGxhdGVJbmZvOwogICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzID0gcGFyZW50Lmxhc3RDaGlsZDsKICAgICAgICAgICAgICB0ZW1wbGF0ZUluZm8ucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgIHBhcmVudC5sYXN0Q2hpbGQgPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgICAgICAgdGVtcGxhdGVJbmZvLnByZXZpb3VzU2libGluZyA9IHByZXZpb3VzOwogICAgICAgICAgICAgIGlmIChwcmV2aW91cykgewogICAgICAgICAgICAgICAgcHJldmlvdXMubmV4dFNpYmxpbmcgPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcmVudC5maXJzdENoaWxkID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fX3ByZUJvdW5kVGVtcGxhdGVJbmZvID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRlbXBsYXRlSW5mbzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBwcm9wZXJ0eSBlZmZlY3QgdG8gdGhlIGdpdmVuIHRlbXBsYXRlIG1ldGFkYXRhLCB3aGljaCBpcyBydW4KICAgICAgICAgKiBhdCB0aGUgInByb3BhZ2F0ZSIgc3RhZ2Ugb2YgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAgd2hlbiB0aGUgdGVtcGxhdGUKICAgICAgICAgKiBoYXMgYmVlbiBib3VuZCB0byB0aGUgZWxlbWVudCB2aWEgYF9iaW5kVGVtcGxhdGVgLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGBlZmZlY3RgIG9iamVjdCBzaG91bGQgbWF0Y2ggdGhlIGZvcm1hdCBpbiBgX2FkZFByb3BlcnR5RWZmZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0ZW1wbGF0ZUluZm8gVGVtcGxhdGUgbWV0YWRhdGEgdG8gYWRkIGVmZmVjdCB0bwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wIFByb3BlcnR5IHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gZWZmZWN0IEVmZmVjdCBtZXRhZGF0YSBvYmplY3QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfYWRkVGVtcGxhdGVQcm9wZXJ0eUVmZmVjdCh0ZW1wbGF0ZUluZm8sIHByb3AsIGVmZmVjdCkgewogICAgICAgICAgbGV0IGhvc3RQcm9wcyA9IHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICAgICAgaG9zdFByb3BzW3Byb3BdID0gdHJ1ZTsKICAgICAgICAgIGxldCBlZmZlY3RzID0gdGVtcGxhdGVJbmZvLnByb3BlcnR5RWZmZWN0cyA9IHRlbXBsYXRlSW5mby5wcm9wZXJ0eUVmZmVjdHMgfHwge307CiAgICAgICAgICBsZXQgcHJvcEVmZmVjdHMgPSBlZmZlY3RzW3Byb3BdID0gZWZmZWN0c1twcm9wXSB8fCBbXTsKICAgICAgICAgIHByb3BFZmZlY3RzLnB1c2goZWZmZWN0KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFN0YW1wcyB0aGUgcHJvdmlkZWQgdGVtcGxhdGUgYW5kIHBlcmZvcm1zIGluc3RhbmNlLXRpbWUgc2V0dXAgZm9yCiAgICAgICAgICogUG9seW1lciB0ZW1wbGF0ZSBmZWF0dXJlcywgaW5jbHVkaW5nIGRhdGEgYmluZGluZ3MsIGRlY2xhcmF0aXZlIGV2ZW50CiAgICAgICAgICogbGlzdGVuZXJzLCBhbmQgdGhlIGB0aGlzLiRgIG1hcCBvZiBgaWRgJ3MgdG8gbm9kZXMuICBBIGRvY3VtZW50IGZyYWdtZW50CiAgICAgICAgICogaXMgcmV0dXJuZWQgY29udGFpbmluZyB0aGUgc3RhbXBlZCBET00sIHJlYWR5IGZvciBpbnNlcnRpb24gaW50byB0aGUKICAgICAgICAgKiBET00uCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlOyBob3dldmVyIG5vdGUgdGhhdCBkdWUgdG8KICAgICAgICAgKiBgc2hhZHljc3NgIHBvbHlmaWxsIGxpbWl0YXRpb25zLCBvbmx5IHN0eWxlcyBmcm9tIHRlbXBsYXRlcyBwcmVwYXJlZAogICAgICAgICAqIHVzaW5nIGBTaGFkeUNTUy5wcmVwYXJlVGVtcGxhdGVgIHdpbGwgYmUgY29ycmVjdGx5IHBvbHlmaWxsZWQgKHNjb3BlZAogICAgICAgICAqIHRvIHRoZSBzaGFkb3cgcm9vdCBhbmQgc3VwcG9ydCBDU1MgY3VzdG9tIHByb3BlcnRpZXMpLCBhbmQgbm90ZSB0aGF0CiAgICAgICAgICogYFNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZWAgbWF5IG9ubHkgYmUgY2FsbGVkIG9uY2UgcGVyIGVsZW1lbnQuIEFzIHN1Y2gsCiAgICAgICAgICogYW55IHN0eWxlcyByZXF1aXJlZCBieSBpbiBydW50aW1lLXN0YW1wZWQgdGVtcGxhdGVzIG11c3QgYmUgaW5jbHVkZWQKICAgICAgICAgKiBpbiB0aGUgbWFpbiBlbGVtZW50IHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gc3RhbXAKICAgICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mbz19IHRlbXBsYXRlSW5mbyBPcHRpb25hbCBib3VuZCB0ZW1wbGF0ZSBpbmZvIGFzc29jaWF0ZWQKICAgICAgICAgKiAgIHdpdGggdGhlIHRlbXBsYXRlIHRvIGJlIHN0YW1wZWQ7IGlmIG9taXR0ZWQgdGhlIHRlbXBsYXRlIHdpbGwgYmUKICAgICAgICAgKiAgIGF1dG9tYXRpY2FsbHkgYm91bmQuCiAgICAgICAgICogQHJldHVybiB7IVN0YW1wZWRUZW1wbGF0ZX0gQ2xvbmVkIHRlbXBsYXRlIGNvbnRlbnQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICovCiAgICAgICAgX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUsIHRlbXBsYXRlSW5mbykgewogICAgICAgICAgdGVtcGxhdGVJbmZvID0gIHRlbXBsYXRlSW5mbyB8fCAvKiogQHR5cGUgeyFUZW1wbGF0ZUluZm99ICovKHRoaXMuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSwgdHJ1ZSkpOwogICAgICAgICAgLy8gRW5zdXJlcyB0aGF0IGNyZWF0ZWQgZG9tIGlzIGBfZW5xdWV1ZUNsaWVudGAnZCB0byB0aGlzIGVsZW1lbnQgc28KICAgICAgICAgIC8vIHRoYXQgaXQgY2FuIGJlIGZsdXNoZWQgb24gbmV4dCBjYWxsIHRvIGBfZmx1c2hQcm9wZXJ0aWVzYAogICAgICAgICAgaG9zdFN0YWNrLnB1c2godGhpcyk7CiAgICAgICAgICBsZXQgZG9tID0gc3VwZXIuX3N0YW1wVGVtcGxhdGUodGVtcGxhdGUsIHRlbXBsYXRlSW5mbyk7CiAgICAgICAgICBob3N0U3RhY2sucG9wKCk7CiAgICAgICAgICAvLyBBZGQgdGVtcGxhdGUtaW5zdGFuY2Utc3BlY2lmaWMgZGF0YSB0byBpbnN0YW5jZWQgdGVtcGxhdGVJbmZvCiAgICAgICAgICB0ZW1wbGF0ZUluZm8ubm9kZUxpc3QgPSBkb20ubm9kZUxpc3Q7CiAgICAgICAgICAvLyBDYXB0dXJlIGNoaWxkIG5vZGVzIHRvIGFsbG93IHVuc3RhbXBpbmcgb2Ygbm9uLXByb3RvdHlwaWNhbCB0ZW1wbGF0ZXMKICAgICAgICAgIGlmICghdGVtcGxhdGVJbmZvLndhc1ByZUJvdW5kKSB7CiAgICAgICAgICAgIGxldCBub2RlcyA9IHRlbXBsYXRlSW5mby5jaGlsZE5vZGVzID0gW107CiAgICAgICAgICAgIGZvciAobGV0IG49ZG9tLmZpcnN0Q2hpbGQ7IG47IG49bi5uZXh0U2libGluZykgewogICAgICAgICAgICAgIG5vZGVzLnB1c2gobik7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGRvbS50ZW1wbGF0ZUluZm8gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgICAvLyBTZXR1cCBjb21wb3VuZCBzdG9yYWdlLCAyLXdheSBsaXN0ZW5lcnMsIGFuZCBkYXRhSG9zdCBmb3IgYmluZGluZ3MKICAgICAgICAgIHNldHVwQmluZGluZ3ModGhpcywgdGVtcGxhdGVJbmZvKTsKICAgICAgICAgIC8vIEZsdXNoIHByb3BlcnRpZXMgaW50byB0ZW1wbGF0ZSBub2RlczsgdGhlIGNoZWNrIG9uIGBfX2RhdGFDbGllbnRzUmVhZHlgCiAgICAgICAgICAvLyBlbnN1cmVzIHdlIGRvbid0IG5lZWRsZXNzbHkgcnVuIGVmZmVjdHMgZm9yIGFuIGVsZW1lbnQncyBpbml0aWFsCiAgICAgICAgICAvLyBwcm90b3R5cGljYWwgdGVtcGxhdGUgc3RhbXBpbmcgc2luY2UgdGhleSB3aWxsIGhhcHBlbiBhcyBhIHBhcnQgb2YgdGhlCiAgICAgICAgICAvLyBmaXJzdCBjYWxsIHRvIGBfcHJvcGVydGllc0NoYW5nZWRgLiBUaGlzIGZsYWcgaXMgc2V0IHRvIHRydWUKICAgICAgICAgIC8vIGFmdGVyIHJ1bm5pbmcgdGhlIGluaXRpYWwgcHJvcGFnYXRlIGVmZmVjdHMsIGFuZCBpbW1lZGlhdGVseSBiZWZvcmUKICAgICAgICAgIC8vIGZsdXNoaW5nIGNsaWVudHMuIFNpbmNlIGRvd25zdHJlYW0gY2xpZW50cyBjb3VsZCBjYXVzZSBzdGFtcGluZyBvbgogICAgICAgICAgLy8gdGhpcyBob3N0IChlLmcuIGEgZmFzdERvbUlmIGBkb20taWZgIGJlaW5nIGZvcmNlZCB0byByZW5kZXIKICAgICAgICAgIC8vIHN5bmNocm9ub3VzbHkpLCB0aGlzIGZsYWcgZW5zdXJlcyBlZmZlY3RzIGZvciBydW50aW1lLXN0YW1wZWQgdGVtcGxhdGVzCiAgICAgICAgICAvLyBhcmUgcnVuIGF0IHRoaXMgcG9pbnQgZHVyaW5nIHRoZSBpbml0aWFsIGVsZW1lbnQgYm9vdC11cC4KICAgICAgICAgIGlmICh0aGlzLl9fZGF0YUNsaWVudHNSZWFkeSkgewogICAgICAgICAgICB0aGlzLl9ydW5FZmZlY3RzRm9yVGVtcGxhdGUodGVtcGxhdGVJbmZvLCB0aGlzLl9fZGF0YSwgbnVsbCwgZmFsc2UpOwogICAgICAgICAgICB0aGlzLl9mbHVzaENsaWVudHMoKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkb207CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuZCB1bmJpbmRzIHRoZSBub2RlcyBwcmV2aW91c2x5IGNvbnRhaW5lZCBpbiB0aGUgcHJvdmlkZWQKICAgICAgICAgKiBEb2N1bWVudEZyYWdtZW50IHJldHVybmVkIGZyb20gYF9zdGFtcFRlbXBsYXRlYC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7IVN0YW1wZWRUZW1wbGF0ZX0gZG9tIERvY3VtZW50RnJhZ21lbnQgcHJldmlvdXNseSByZXR1cm5lZAogICAgICAgICAqICAgZnJvbSBgX3N0YW1wVGVtcGxhdGVgIGFzc29jaWF0ZWQgd2l0aCB0aGUgbm9kZXMgdG8gYmUgcmVtb3ZlZAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9yZW1vdmVCb3VuZERvbShkb20pIHsKICAgICAgICAgIC8vIFVubGluayB0ZW1wbGF0ZSBpbmZvOyBOb3RlIHRoYXQgd2hpbGUgdGhlIGNoaWxkIGlzIHVubGlua2VkIGZyb20gaXRzCiAgICAgICAgICAvLyBwYXJlbnQgbGlzdCwgYSB0ZW1wbGF0ZSdzIGBwYXJlbnRgIHJlZmVyZW5jZSBpcyBuZXZlciByZW1vdmVkLCBzaW5jZQogICAgICAgICAgLy8gdGhpcyBpcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB0cmVlIHN0cnVjdHVyZSBhbmQgYXBwbGllZCBhdAogICAgICAgICAgLy8gYGFwcGx5VGVtcGxhdGVJbmZvYCB0aW1lLgogICAgICAgICAgY29uc3QgdGVtcGxhdGVJbmZvID0gZG9tLnRlbXBsYXRlSW5mbzsKICAgICAgICAgIGNvbnN0IHtwcmV2aW91c1NpYmxpbmcsIG5leHRTaWJsaW5nLCBwYXJlbnR9ID0gdGVtcGxhdGVJbmZvOwogICAgICAgICAgaWYgKHByZXZpb3VzU2libGluZykgewogICAgICAgICAgICBwcmV2aW91c1NpYmxpbmcubmV4dFNpYmxpbmcgPSBuZXh0U2libGluZzsKICAgICAgICAgIH0gZWxzZSBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIHBhcmVudC5maXJzdENoaWxkID0gbmV4dFNpYmxpbmc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobmV4dFNpYmxpbmcpIHsKICAgICAgICAgICAgbmV4dFNpYmxpbmcucHJldmlvdXNTaWJsaW5nID0gcHJldmlvdXNTaWJsaW5nOwogICAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgcGFyZW50Lmxhc3RDaGlsZCA9IHByZXZpb3VzU2libGluZzsKICAgICAgICAgIH0KICAgICAgICAgIHRlbXBsYXRlSW5mby5uZXh0U2libGluZyA9IHRlbXBsYXRlSW5mby5wcmV2aW91c1NpYmxpbmcgPSBudWxsOwogICAgICAgICAgLy8gUmVtb3ZlIHN0YW1wZWQgbm9kZXMKICAgICAgICAgIGxldCBub2RlcyA9IHRlbXBsYXRlSW5mby5jaGlsZE5vZGVzOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPG5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gbm9kZXNbaV07CiAgICAgICAgICAgIHdyYXAod3JhcChub2RlKS5wYXJlbnROb2RlKS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyBkZWZhdWx0IGBUZW1wbGF0ZVN0YW1wYCBpbXBsZW1lbnRhdGlvbiB0byBhZGQgc3VwcG9ydCBmb3IKICAgICAgICAgKiBwYXJzaW5nIGJpbmRpbmdzIGZyb20gYFRleHROb2RlYCdzJyBgdGV4dENvbnRlbnRgLiAgQSBgYmluZGluZ3NgCiAgICAgICAgICogYXJyYXkgaXMgYWRkZWQgdG8gYG5vZGVJbmZvYCBhbmQgcG9wdWxhdGVkIHdpdGggYmluZGluZyBtZXRhZGF0YQogICAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICAgKiBiaW5kaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbykgewogICAgICAgICAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzMyNDApOgogICAgICAgICAgLy8gICAgIENoYW5nZSBiYWNrIHRvIGp1c3Qgc3VwZXIubWV0aG9kQ2FsbCgpCiAgICAgICAgICBsZXQgbm90ZWQgPSBwcm9wZXJ0eUVmZmVjdHNCYXNlLl9wYXJzZVRlbXBsYXRlTm9kZS5jYWxsKAogICAgICAgICAgICB0aGlzLCBub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvKTsKICAgICAgICAgIGlmIChub2RlLm5vZGVUeXBlID09PSBOb2RlLlRFWFRfTk9ERSkgewogICAgICAgICAgICBsZXQgcGFydHMgPSB0aGlzLl9wYXJzZUJpbmRpbmdzKG5vZGUudGV4dENvbnRlbnQsIHRlbXBsYXRlSW5mbyk7CiAgICAgICAgICAgIGlmIChwYXJ0cykgewogICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHRleHRDb250ZW50IHdpdGggYW55IGxpdGVyYWwgcGFydHMKICAgICAgICAgICAgICAvLyBOT1RFOiBkZWZhdWx0IHRvIGEgc3BhY2UgaGVyZSBzbyB0aGUgdGV4dE5vZGUgcmVtYWluczsgc29tZSBicm93c2VycwogICAgICAgICAgICAgIC8vIChJRSkgb21pdCBhbiBlbXB0eSB0ZXh0Tm9kZSBmb2xsb3dpbmcgY2xvbmVOb2RlL2ltcG9ydE5vZGUuCiAgICAgICAgICAgICAgbm9kZS50ZXh0Q29udGVudCA9IGxpdGVyYWxGcm9tUGFydHMocGFydHMpIHx8ICcgJzsKICAgICAgICAgICAgICBhZGRCaW5kaW5nKHRoaXMsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sICd0ZXh0JywgJ3RleHRDb250ZW50JywgcGFydHMpOwogICAgICAgICAgICAgIG5vdGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgYFRlbXBsYXRlU3RhbXBgIGltcGxlbWVudGF0aW9uIHRvIGFkZCBzdXBwb3J0IGZvcgogICAgICAgICAqIHBhcnNpbmcgYmluZGluZ3MgZnJvbSBhdHRyaWJ1dGVzLiAgQSBgYmluZGluZ3NgCiAgICAgICAgICogYXJyYXkgaXMgYWRkZWQgdG8gYG5vZGVJbmZvYCBhbmQgcG9wdWxhdGVkIHdpdGggYmluZGluZyBtZXRhZGF0YQogICAgICAgICAqIHdpdGggaW5mb3JtYXRpb24gY2FwdHVyaW5nIHRoZSBiaW5kaW5nIHRhcmdldCwgYW5kIGEgYHBhcnRzYCBhcnJheQogICAgICAgICAqIHdpdGggb25lIG9yIG1vcmUgbWV0YWRhdGEgb2JqZWN0cyBjYXB0dXJpbmcgdGhlIHNvdXJjZShzKSBvZiB0aGUKICAgICAgICAgKiBiaW5kaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgQXR0cmlidXRlIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUobm9kZSwgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgbmFtZSwgdmFsdWUpIHsKICAgICAgICAgIGxldCBwYXJ0cyA9IHRoaXMuX3BhcnNlQmluZGluZ3ModmFsdWUsIHRlbXBsYXRlSW5mbyk7CiAgICAgICAgICBpZiAocGFydHMpIHsKICAgICAgICAgICAgLy8gQXR0cmlidXRlIG9yIHByb3BlcnR5CiAgICAgICAgICAgIGxldCBvcmlnTmFtZSA9IG5hbWU7CiAgICAgICAgICAgIGxldCBraW5kID0gJ3Byb3BlcnR5JzsKICAgICAgICAgICAgLy8gVGhlIG9ubHkgd2F5IHdlIHNlZSBhIGNhcGl0YWwgbGV0dGVyIGhlcmUgaXMgaWYgdGhlIGF0dHIgaGFzCiAgICAgICAgICAgIC8vIGEgY2FwaXRhbCBsZXR0ZXIgaW4gaXQgcGVyIHNwZWMuIEluIHRoaXMgY2FzZSwgdG8gbWFrZSBzdXJlCiAgICAgICAgICAgIC8vIHRoaXMgYmluZGluZyB3b3Jrcywgd2UgZ28gYWhlYWQgYW5kIG1ha2UgdGhlIGJpbmRpbmcgdG8gdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgICAgaWYgKGNhcGl0YWxBdHRyaWJ1dGVSZWdleC50ZXN0KG5hbWUpKSB7CiAgICAgICAgICAgICAga2luZCA9ICdhdHRyaWJ1dGUnOwogICAgICAgICAgICB9IGVsc2UgaWYgKG5hbWVbbmFtZS5sZW5ndGgtMV0gPT0gJyQnKSB7CiAgICAgICAgICAgICAgbmFtZSA9IG5hbWUuc2xpY2UoMCwgLTEpOwogICAgICAgICAgICAgIGtpbmQgPSAnYXR0cmlidXRlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbml0aWFsaXplIGF0dHJpYnV0ZSBiaW5kaW5ncyB3aXRoIGFueSBsaXRlcmFsIHBhcnRzCiAgICAgICAgICAgIGxldCBsaXRlcmFsID0gbGl0ZXJhbEZyb21QYXJ0cyhwYXJ0cyk7CiAgICAgICAgICAgIGlmIChsaXRlcmFsICYmIGtpbmQgPT0gJ2F0dHJpYnV0ZScpIHsKICAgICAgICAgICAgICAvLyBFbnN1cmUgYSBTaGFkeUNTUyB0ZW1wbGF0ZSBzY29wZWQgc3R5bGUgaXMgbm90IHJlbW92ZWQKICAgICAgICAgICAgICAvLyB3aGVuIGEgY2xhc3MkIGJpbmRpbmcncyBpbml0aWFsIGxpdGVyYWwgdmFsdWUgaXMgc2V0LgogICAgICAgICAgICAgIGlmIChuYW1lID09ICdjbGFzcycgJiYgbm9kZS5oYXNBdHRyaWJ1dGUoJ2NsYXNzJykpIHsKICAgICAgICAgICAgICAgIGxpdGVyYWwgKz0gJyAnICsgbm9kZS5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsIGxpdGVyYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHN1cHBvcnQgZGlzYWJsZS11cGdyYWRlCiAgICAgICAgICAgIGlmIChraW5kID09ICdhdHRyaWJ1dGUnICYmIG9yaWdOYW1lID09ICdkaXNhYmxlLXVwZ3JhZGUkJykgewogICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDbGVhciBhdHRyaWJ1dGUgYmVmb3JlIHJlbW92aW5nLCBzaW5jZSBJRSB3b24ndCBhbGxvdyByZW1vdmluZwogICAgICAgICAgICAvLyBgdmFsdWVgIGF0dHJpYnV0ZSBpZiBpdCBwcmV2aW91c2x5IGhhZCBhIHZhbHVlIChjYW4ndAogICAgICAgICAgICAvLyB1bmNvbmRpdGlvbmFsbHkgc2V0ICcnIGJlZm9yZSByZW1vdmluZyBzaW5jZSBhdHRyaWJ1dGVzIHdpdGggYCRgCiAgICAgICAgICAgIC8vIGNhbid0IGJlIHNldCB1c2luZyBzZXRBdHRyaWJ1dGUpCiAgICAgICAgICAgIGlmIChub2RlLmxvY2FsTmFtZSA9PT0gJ2lucHV0JyAmJiBvcmlnTmFtZSA9PT0gJ3ZhbHVlJykgewogICAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG9yaWdOYW1lLCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVtb3ZlIGFubm90YXRpb24KICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUob3JpZ05hbWUpOwogICAgICAgICAgICAvLyBDYXNlIGhhY2tlcnk6IGF0dHJpYnV0ZXMgYXJlIGxvd2VyLWNhc2UsIGJ1dCBiaW5kIHRhcmdldHMKICAgICAgICAgICAgLy8gKHByb3BlcnRpZXMpIGFyZSBjYXNlIHNlbnNpdGl2ZS4gR2FtYml0IGlzIHRvIG1hcCBkYXNoLWNhc2UgdG8KICAgICAgICAgICAgLy8gY2FtZWwtY2FzZTogYGZvby1iYXJgIGJlY29tZXMgYGZvb0JhcmAuCiAgICAgICAgICAgIC8vIEF0dHJpYnV0ZSBiaW5kaW5ncyBhcmUgZXhjZXB0ZWQuCiAgICAgICAgICAgIGlmIChraW5kID09PSAncHJvcGVydHknKSB7CiAgICAgICAgICAgICAgbmFtZSA9IGRhc2hUb0NhbWVsQ2FzZShuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZGRCaW5kaW5nKHRoaXMsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8sIGtpbmQsIG5hbWUsIHBhcnRzLCBsaXRlcmFsKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMzI0MCk6CiAgICAgICAgICAgIC8vICAgICBDaGFuZ2UgYmFjayB0byBqdXN0IHN1cGVyLm1ldGhvZENhbGwoKQogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlFZmZlY3RzQmFzZS5fcGFyc2VUZW1wbGF0ZU5vZGVBdHRyaWJ1dGUuY2FsbCgKICAgICAgICAgICAgICB0aGlzLCBub2RlLCB0ZW1wbGF0ZUluZm8sIG5vZGVJbmZvLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgZGVmYXVsdCBgVGVtcGxhdGVTdGFtcGAgaW1wbGVtZW50YXRpb24gdG8gYWRkIHN1cHBvcnQgZm9yCiAgICAgICAgICogYmluZGluZyB0aGUgcHJvcGVydGllcyB0aGF0IGEgbmVzdGVkIHRlbXBsYXRlIGRlcGVuZHMgb24gdG8gdGhlIHRlbXBsYXRlCiAgICAgICAgICogYXMgYF9ob3N0Xzxwcm9wZXJ0eT5gLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtOb2RlfSBub2RlIE5vZGUgdG8gcGFyc2UKICAgICAgICAgKiBAcGFyYW0ge1RlbXBsYXRlSW5mb30gdGVtcGxhdGVJbmZvIFRlbXBsYXRlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtOb2RlSW5mb30gbm9kZUluZm8gTm9kZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZSBub2RlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gYHRydWVgIGlmIHRoZSB2aXNpdGVkIG5vZGUgYWRkZWQgbm9kZS1zcGVjaWZpYwogICAgICAgICAqICAgbWV0YWRhdGEgdG8gYG5vZGVJbmZvYAogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlKG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMjQwKToKICAgICAgICAgIC8vICAgICBDaGFuZ2UgYmFjayB0byBqdXN0IHN1cGVyLm1ldGhvZENhbGwoKQogICAgICAgICAgbGV0IG5vdGVkID0gcHJvcGVydHlFZmZlY3RzQmFzZS5fcGFyc2VUZW1wbGF0ZU5lc3RlZFRlbXBsYXRlLmNhbGwoCiAgICAgICAgICAgIHRoaXMsIG5vZGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgICAgY29uc3QgcGFyZW50ID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgY29uc3QgbmVzdGVkVGVtcGxhdGVJbmZvID0gbm9kZUluZm8udGVtcGxhdGVJbmZvOwogICAgICAgICAgY29uc3QgaXNEb21JZiA9IHBhcmVudC5sb2NhbE5hbWUgPT09ICdkb20taWYnOwogICAgICAgICAgY29uc3QgaXNEb21SZXBlYXQgPSBwYXJlbnQubG9jYWxOYW1lID09PSAnZG9tLXJlcGVhdCc7CiAgICAgICAgICAvLyBSZW1vdmUgbmVzdGVkIHRlbXBsYXRlIGFuZCByZWRpcmVjdCBpdHMgaG9zdCBiaW5kaW5ncyAmIHRlbXBsYXRlSW5mbwogICAgICAgICAgLy8gb250byB0aGUgcGFyZW50IChkb20taWYvcmVwZWF0IGVsZW1lbnQpJ3Mgbm9kZUluZm8KICAgICAgICAgIGlmIChyZW1vdmVOZXN0ZWRUZW1wbGF0ZXMgJiYgKGlzRG9tSWYgfHwgaXNEb21SZXBlYXQpKSB7CiAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICAgICAgLy8gVXNlIHRoZSBwYXJlbnQncyBub2RlSW5mbyAoZm9yIHRoZSBkb20taWYvcmVwZWF0KSB0byByZWNvcmQgdGhlCiAgICAgICAgICAgIC8vIHRlbXBsYXRlSW5mbywgYW5kIHVzZSB0aGF0IGZvciBhbnkgaG9zdCBwcm9wZXJ0eSBiaW5kaW5ncyBiZWxvdwogICAgICAgICAgICBub2RlSW5mbyA9IG5vZGVJbmZvLnBhcmVudEluZm87CiAgICAgICAgICAgIG5vZGVJbmZvLnRlbXBsYXRlSW5mbyA9IG5lc3RlZFRlbXBsYXRlSW5mbzsKICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSBwYXJlbnQgZG9tLWlmL3JlcGVhdCBpcyBub3RlZCBzaW5jZSBpdCBub3cgbWF5IGhhdmUgaG9zdAogICAgICAgICAgICAvLyBiaW5kaW5nczsgaXQgbWF5IG5vdCBoYXZlIGJlZW4gaWYgaXQgZGlkIG5vdCBoYXZlIGl0cyBvd24gYmluZGluZ3MKICAgICAgICAgICAgbm9kZUluZm8ubm90ZWQgPSB0cnVlOwogICAgICAgICAgICBub3RlZCA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgLy8gTWVyZ2UgaG9zdCBwcm9wcyBpbnRvIG91dGVyIHRlbXBsYXRlIGFuZCBhZGQgYmluZGluZ3MKICAgICAgICAgIGxldCBob3N0UHJvcHMgPSBuZXN0ZWRUZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgaWYgKGZhc3REb21JZiAmJiBpc0RvbUlmKSB7CiAgICAgICAgICAgIC8vIGBmYXN0RG9tSWZgIG1vZGUgdXNlcyBydW50aW1lLXRlbXBsYXRlIHN0YW1waW5nIHRvIGFkZCBhY2Nlc3NvcnMvCiAgICAgICAgICAgIC8vIGVmZmVjdHMgdG8gcHJvcGVydGllcyB1c2VkIGluIGl0cyB0ZW1wbGF0ZTsgYXMgc3VjaCB3ZSBkb24ndCBuZWVkIHRvCiAgICAgICAgICAgIC8vIHRheCB0aGUgaG9zdCBlbGVtZW50IHdpdGggYF9ob3N0X2AgYmluZGluZ3MgZm9yIHRoZSBgZG9tLWlmYC4KICAgICAgICAgICAgLy8gSG93ZXZlciwgaW4gdGhlIGV2ZW50IGl0IGlzIG5lc3RlZCBpbiBhIGBkb20tcmVwZWF0YCwgaXQgaXMgc3RpbGwKICAgICAgICAgICAgLy8gaW1wb3J0YW50IHRoYXQgaXRzIGhvc3QgcHJvcGVydGllcyBhcmUgYWRkZWQgdG8gdGhlCiAgICAgICAgICAgIC8vIFRlbXBsYXRlSW5zdGFuY2UncyBgaG9zdFByb3BzYCBzbyB0aGF0IHRoZXkgYXJlIGZvcndhcmRlZCB0byB0aGUKICAgICAgICAgICAgLy8gVGVtcGxhdGVJbnN0YW5jZS4KICAgICAgICAgICAgaWYgKGhvc3RQcm9wcykgewogICAgICAgICAgICAgIHRlbXBsYXRlSW5mby5ob3N0UHJvcHMgPQogICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9LCBob3N0UHJvcHMpOwogICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgZG9tLWlmIGlzIG5vdGVkIHNvIHRoYXQgaXQgaGFzIGEgX19kYXRhSG9zdCwgc2luY2UKICAgICAgICAgICAgICAvLyBgZmFzdERvbUlmYCB1c2VzIHRoZSBob3N0IGZvciBydW50aW1lIHRlbXBsYXRlIHN0YW1waW5nOyBub3RlIHRoaXMKICAgICAgICAgICAgICAvLyB3YXMgYWxyZWFkeSBlbnN1cmVkIGFib3ZlIGluIHRoZSBgcmVtb3ZlTmVzdGVkVGVtcGxhdGVzYCBjYXNlCiAgICAgICAgICAgICAgaWYgKCFyZW1vdmVOZXN0ZWRUZW1wbGF0ZXMpIHsKICAgICAgICAgICAgICAgIG5vZGVJbmZvLnBhcmVudEluZm8ubm90ZWQgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbGV0IG1vZGUgPSAneyc7CiAgICAgICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAgICBsZXQgcGFydHMgPSBbeyBtb2RlLCBzb3VyY2UsIGRlcGVuZGVuY2llczogW3NvdXJjZV0sIGhvc3RQcm9wOiB0cnVlIH1dOwogICAgICAgICAgICAgIGFkZEJpbmRpbmcodGhpcywgdGVtcGxhdGVJbmZvLCBub2RlSW5mbywgJ3Byb3BlcnR5JywgJ19ob3N0XycgKyBzb3VyY2UsIHBhcnRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5vdGVkOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGVkIHRvIHBhcnNlIHRleHQgaW4gYSB0ZW1wbGF0ZSAoZWl0aGVyIGF0dHJpYnV0ZSB2YWx1ZXMgb3IKICAgICAgICAgKiB0ZXh0Q29udGVudCkgaW50byBiaW5kaW5nIG1ldGFkYXRhLgogICAgICAgICAqCiAgICAgICAgICogQW55IG92ZXJyaWRlcyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIGFuIGFycmF5IG9mIGJpbmRpbmcgcGFydAogICAgICAgICAqIG1ldGFkYXRhICByZXByZXNlbnRpbmcgb25lIG9yIG1vcmUgYmluZGluZ3MgZm91bmQgaW4gdGhlIHByb3ZpZGVkIHRleHQKICAgICAgICAgKiBhbmQgYW55ICJsaXRlcmFsIiB0ZXh0IGluIGJldHdlZW4uICBBbnkgbm9uLWxpdGVyYWwgcGFydHMgd2lsbCBiZSBwYXNzZWQKICAgICAgICAgKiB0byBgX2V2YWx1YXRlQmluZGluZ2Agd2hlbiBhbnkgZGVwZW5kZW5jaWVzIGNoYW5nZS4gIFRoZSBvbmx5IHJlcXVpcmVkCiAgICAgICAgICogZmllbGRzIG9mIGVhY2ggInBhcnQiIGluIHRoZSByZXR1cm5lZCBhcnJheSBhcmUgYXMgZm9sbG93czoKICAgICAgICAgKgogICAgICAgICAqIC0gYGRlcGVuZGVuY2llc2AgLSBBcnJheSBjb250YWluaW5nIHRyaWdnZXIgbWV0YWRhdGEgZm9yIGVhY2ggcHJvcGVydHkKICAgICAgICAgKiAgIHRoYXQgc2hvdWxkIHRyaWdnZXIgdGhlIGJpbmRpbmcgdG8gdXBkYXRlCiAgICAgICAgICogLSBgbGl0ZXJhbGAgLSBTdHJpbmcgY29udGFpbmluZyB0ZXh0IGlmIHRoZSBwYXJ0IHJlcHJlc2VudHMgYSBsaXRlcmFsOwogICAgICAgICAqICAgaW4gdGhpcyBjYXNlIG5vIGBkZXBlbmRlbmNpZXNgIGFyZSBuZWVkZWQKICAgICAgICAgKgogICAgICAgICAqIEFkZGl0aW9uYWwgbWV0YWRhdGEgZm9yIHVzZSBieSBgX2V2YWx1YXRlQmluZGluZ2AgbWF5IGJlIHByb3ZpZGVkIGluCiAgICAgICAgICogZWFjaCBwYXJ0IG9iamVjdCBhcyBuZWVkZWQuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBoYW5kbGVzIHRoZSBmb2xsb3dpbmcgdHlwZXMgb2YgYmluZGluZ3MKICAgICAgICAgKiAob25lIG9yIG1vcmUgbWF5IGJlIGludGVybWl4ZWQgd2l0aCBsaXRlcmFsIHN0cmluZ3MpOgogICAgICAgICAqIC0gUHJvcGVydHkgYmluZGluZzogYFtbcHJvcF1dYAogICAgICAgICAqIC0gUGF0aCBiaW5kaW5nOiBgW1tvYmplY3QucHJvcF1dYAogICAgICAgICAqIC0gTmVnYXRlZCBwcm9wZXJ0eSBvciBwYXRoIGJpbmRpbmdzOiBgW1shcHJvcF1dYCBvciBgW1shb2JqZWN0LnByb3BdXWAKICAgICAgICAgKiAtIFR3by13YXkgcHJvcGVydHkgb3IgcGF0aCBiaW5kaW5ncyAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgICAqICAgYHt7cHJvcH19YCwgYHt7b2JqZWN0LnByb3B9fWAsIGB7eyFwcm9wfX1gIG9yIGB7eyFvYmplY3QucHJvcH19YAogICAgICAgICAqIC0gSW5saW5lIGNvbXB1dGVkIG1ldGhvZCAoc3VwcG9ydHMgbmVnYXRpb24pOgogICAgICAgICAqICAgYFtbY29tcHV0ZShhLCAnbGl0ZXJhbCcsIGIpXV1gLCBgW1shY29tcHV0ZShhLCAnbGl0ZXJhbCcsIGIpXV1gCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB1c2VzIGEgcmVndWxhciBleHByZXNzaW9uIGZvciBiZXN0CiAgICAgICAgICogcGVyZm9ybWFuY2UuIEhvd2V2ZXIsIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdXNlcyBhIHdoaXRlLWxpc3Qgb2YKICAgICAgICAgKiBhbGxvd2VkIGNoYXJhY3RlcnMgaW4gYSBkYXRhLWJpbmRpbmcsIHdoaWNoIGNhdXNlcyBwcm9ibGVtcyBmb3IKICAgICAgICAgKiBkYXRhLWJpbmRpbmdzIHRoYXQgZG8gdXNlIGNoYXJhY3RlcnMgbm90IGluIHRoaXMgd2hpdGUtbGlzdC4KICAgICAgICAgKgogICAgICAgICAqIEluc3RlYWQgb2YgdXBkYXRpbmcgdGhlIHdoaXRlLWxpc3Qgd2l0aCBhbGwgYWxsb3dlZCBjaGFyYWN0ZXJzLAogICAgICAgICAqIHRoZXJlIGlzIGEgU3RyaWN0QmluZGluZ1BhcnNlciAoc2VlIGxpYi9taXhpbnMvc3RyaWN0LWJpbmRpbmctcGFyc2VyKQogICAgICAgICAqIHRoYXQgdXNlcyBhIHN0YXRlIG1hY2hpbmUgaW5zdGVhZC4gVGhpcyBzdGF0ZSBtYWNoaW5lIGlzIGFibGUgdG8gaGFuZGxlCiAgICAgICAgICogYWxsIGNoYXJhY3RlcnMuIEhvd2V2ZXIsIGl0IGlzIHNsaWdodGx5IGxlc3MgcGVyZm9ybWFudCwgdGhlcmVmb3JlIHdlCiAgICAgICAgICogZXh0cmFjdGVkIGl0IGludG8gYSBzZXBhcmF0ZSBvcHRpb25hbCBtaXhpbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0IFRleHQgdG8gcGFyc2UgZnJvbSBhdHRyaWJ1dGUgb3IgdGV4dENvbnRlbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gdGVtcGxhdGVJbmZvIEN1cnJlbnQgdGVtcGxhdGUgbWV0YWRhdGEKICAgICAgICAgKiBAcmV0dXJuIHtBcnJheTwhQmluZGluZ1BhcnQ+fSBBcnJheSBvZiBiaW5kaW5nIHBhcnQgbWV0YWRhdGEKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3BhcnNlQmluZGluZ3ModGV4dCwgdGVtcGxhdGVJbmZvKSB7CiAgICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICAgIGxldCBsYXN0SW5kZXggPSAwOwogICAgICAgICAgbGV0IG07CiAgICAgICAgICAvLyBFeGFtcGxlOiAibGl0ZXJhbDF7e3Byb3B9fWxpdGVyYWwyW1shY29tcHV0ZShmb28sYmFyKV1dZmluYWwiCiAgICAgICAgICAvLyBSZWdleCBtYXRjaGVzOgogICAgICAgICAgLy8gICAgICAgIEl0ZXJhdGlvbiAxOiAgSXRlcmF0aW9uIDI6CiAgICAgICAgICAvLyBtWzFdOiAne3snICAgICAgICAgICdbWycKICAgICAgICAgIC8vIG1bMl06ICcnICAgICAgICAgICAgJyEnCiAgICAgICAgICAvLyBtWzNdOiAncHJvcCcgICAgICAgICdjb21wdXRlKGZvbyxiYXIpJwogICAgICAgICAgd2hpbGUgKChtID0gYmluZGluZ1JlZ2V4LmV4ZWModGV4dCkpICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIEFkZCBsaXRlcmFsIHBhcnQKICAgICAgICAgICAgaWYgKG0uaW5kZXggPiBsYXN0SW5kZXgpIHsKICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHtsaXRlcmFsOiB0ZXh0LnNsaWNlKGxhc3RJbmRleCwgbS5pbmRleCl9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBZGQgYmluZGluZyBwYXJ0CiAgICAgICAgICAgIGxldCBtb2RlID0gbVsxXVswXTsKICAgICAgICAgICAgbGV0IG5lZ2F0ZSA9IEJvb2xlYW4obVsyXSk7CiAgICAgICAgICAgIGxldCBzb3VyY2UgPSBtWzNdLnRyaW0oKTsKICAgICAgICAgICAgbGV0IGN1c3RvbUV2ZW50ID0gZmFsc2UsIG5vdGlmeUV2ZW50ID0gJycsIGNvbG9uID0gLTE7CiAgICAgICAgICAgIGlmIChtb2RlID09ICd7JyAmJiAoY29sb24gPSBzb3VyY2UuaW5kZXhPZignOjonKSkgPiAwKSB7CiAgICAgICAgICAgICAgbm90aWZ5RXZlbnQgPSBzb3VyY2Uuc3Vic3RyaW5nKGNvbG9uICsgMik7CiAgICAgICAgICAgICAgc291cmNlID0gc291cmNlLnN1YnN0cmluZygwLCBjb2xvbik7CiAgICAgICAgICAgICAgY3VzdG9tRXZlbnQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzaWduYXR1cmUgPSBwYXJzZU1ldGhvZChzb3VyY2UpOwogICAgICAgICAgICBsZXQgZGVwZW5kZW5jaWVzID0gW107CiAgICAgICAgICAgIGlmIChzaWduYXR1cmUpIHsKICAgICAgICAgICAgICAvLyBJbmxpbmUgY29tcHV0ZWQgZnVuY3Rpb24KICAgICAgICAgICAgICBsZXQge2FyZ3MsIG1ldGhvZE5hbWV9ID0gc2lnbmF0dXJlOwogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgYXJnID0gYXJnc1tpXTsKICAgICAgICAgICAgICAgIGlmICghYXJnLmxpdGVyYWwpIHsKICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLnB1c2goYXJnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbGV0IGR5bmFtaWNGbnMgPSB0ZW1wbGF0ZUluZm8uZHluYW1pY0ZuczsKICAgICAgICAgICAgICBpZiAoZHluYW1pY0ZucyAmJiBkeW5hbWljRm5zW21ldGhvZE5hbWVdIHx8IHNpZ25hdHVyZS5zdGF0aWMpIHsKICAgICAgICAgICAgICAgIGRlcGVuZGVuY2llcy5wdXNoKG1ldGhvZE5hbWUpOwogICAgICAgICAgICAgICAgc2lnbmF0dXJlLmR5bmFtaWNGbiA9IHRydWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIFByb3BlcnR5IG9yIHBhdGgKICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMucHVzaChzb3VyY2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBhcnRzLnB1c2goewogICAgICAgICAgICAgIHNvdXJjZSwgbW9kZSwgbmVnYXRlLCBjdXN0b21FdmVudCwgc2lnbmF0dXJlLCBkZXBlbmRlbmNpZXMsCiAgICAgICAgICAgICAgZXZlbnQ6IG5vdGlmeUV2ZW50CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBsYXN0SW5kZXggPSBiaW5kaW5nUmVnZXgubGFzdEluZGV4OwogICAgICAgICAgfQogICAgICAgICAgLy8gQWRkIGEgZmluYWwgbGl0ZXJhbCBwYXJ0CiAgICAgICAgICBpZiAobGFzdEluZGV4ICYmIGxhc3RJbmRleCA8IHRleHQubGVuZ3RoKSB7CiAgICAgICAgICAgIGxldCBsaXRlcmFsID0gdGV4dC5zdWJzdHJpbmcobGFzdEluZGV4KTsKICAgICAgICAgICAgaWYgKGxpdGVyYWwpIHsKICAgICAgICAgICAgICBwYXJ0cy5wdXNoKHsKICAgICAgICAgICAgICAgIGxpdGVyYWw6IGxpdGVyYWwKICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gcGFydHM7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCB0byBldmFsdWF0ZSBhIHByZXZpb3VzbHkgcGFyc2VkIGJpbmRpbmcgcGFydCBiYXNlZCBvbiBhIHNldCBvZgogICAgICAgICAqIG9uZSBvciBtb3JlIGNoYW5nZWQgZGVwZW5kZW5jaWVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshUG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9IGluc3QgRWxlbWVudCB0aGF0IHNob3VsZCBiZSB1c2VkIGFzCiAgICAgICAgICogICAgIHNjb3BlIGZvciBiaW5kaW5nIGRlcGVuZGVuY2llcwogICAgICAgICAqIEBwYXJhbSB7QmluZGluZ1BhcnR9IHBhcnQgQmluZGluZyBwYXJ0IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggUHJvcGVydHkvcGF0aCB0aGF0IHRyaWdnZXJlZCB0aGlzIGVmZmVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm9wcyBCYWcgb2YgY3VycmVudCBwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9sZFByb3BzIEJhZyBvZiBwcmV2aW91cyB2YWx1ZXMgZm9yIGNoYW5nZWQgcHJvcGVydGllcwogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFzUGF0aHMgVHJ1ZSB3aXRoIGBwcm9wc2AgY29udGFpbnMgb25lIG9yIG1vcmUgcGF0aHMKICAgICAgICAgKiBAcmV0dXJuIHsqfSBWYWx1ZSB0aGUgYmluZGluZyBwYXJ0IGV2YWx1YXRlZCB0bwogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfZXZhbHVhdGVCaW5kaW5nKGluc3QsIHBhcnQsIHBhdGgsIHByb3BzLCBvbGRQcm9wcywgaGFzUGF0aHMpIHsKICAgICAgICAgIGxldCB2YWx1ZTsKICAgICAgICAgIGlmIChwYXJ0LnNpZ25hdHVyZSkgewogICAgICAgICAgICB2YWx1ZSA9IHJ1bk1ldGhvZEVmZmVjdChpbnN0LCBwYXRoLCBwcm9wcywgb2xkUHJvcHMsIHBhcnQuc2lnbmF0dXJlKTsKICAgICAgICAgIH0gZWxzZSBpZiAocGF0aCAhPSBwYXJ0LnNvdXJjZSkgewogICAgICAgICAgICB2YWx1ZSA9IGdldChpbnN0LCBwYXJ0LnNvdXJjZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaGFzUGF0aHMgJiYgaXNQYXRoKHBhdGgpKSB7CiAgICAgICAgICAgICAgdmFsdWUgPSBnZXQoaW5zdCwgcGF0aCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFsdWUgPSBpbnN0Ll9fZGF0YVtwYXRoXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKHBhcnQubmVnYXRlKSB7CiAgICAgICAgICAgIHZhbHVlID0gIXZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KCiAgICAgIH0KCiAgICAgIHJldHVybiBQcm9wZXJ0eUVmZmVjdHM7CiAgICB9KTsKCiAgICAvKioKICAgICAqIFN0YWNrIGZvciBlbnF1ZXVpbmcgY2xpZW50IGRvbSBjcmVhdGVkIGJ5IGEgaG9zdCBlbGVtZW50LgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQgZWxlbWVudHMgYXJlIGZsdXNoZWQgdmlhIGBfZmx1c2hQcm9wZXJ0aWVzYCB3aGVuCiAgICAgKiBgY29ubmVjdGVkQ2FsbGJhY2tgIGlzIGNhbGxlZC4gRWxlbWVudHMgYXR0YWNoIHRoZWlyIGNsaWVudCBkb20gdG8KICAgICAqIHRoZW1zZWx2ZXMgYXQgYHJlYWR5YCB0aW1lIHdoaWNoIHJlc3VsdHMgZnJvbSB0aGlzIGZpcnN0IGZsdXNoLgogICAgICogVGhpcyBwcm92aWRlcyBhbiBvcmRlcmluZyBndWFyYW50ZWUgdGhhdCB0aGUgY2xpZW50IGRvbSBhbiBlbGVtZW50CiAgICAgKiBjcmVhdGVzIGlzIGZsdXNoZWQgYmVmb3JlIHRoZSBlbGVtZW50IGl0c2VsZiAoaS5lLiBjbGllbnQgYHJlYWR5YAogICAgICogZmlyZXMgYmVmb3JlIGhvc3QgYHJlYWR5YCkuCiAgICAgKgogICAgICogSG93ZXZlciwgaWYgYF9mbHVzaFByb3BlcnRpZXNgIGlzIGNhbGxlZCAqYmVmb3JlKiBhbiBlbGVtZW50IGlzIGNvbm5lY3RlZCwKICAgICAqIGFzIGZvciBleGFtcGxlIGBUZW1wbGF0aXplYCBkb2VzLCB0aGlzIG9yZGVyaW5nIGd1YXJhbnRlZSBjYW5ub3QgYmUKICAgICAqIHNhdGlzZmllZCBiZWNhdXNlIG5vIGVsZW1lbnRzIGFyZSBjb25uZWN0ZWQuIChOb3RlOiBCb3VuZCBlbGVtZW50cyB0aGF0CiAgICAgKiByZWNlaXZlIGRhdGEgZG8gYmVjb21lIGVucXVldWVkIGNsaWVudHMgYW5kIGFyZSBwcm9wZXJseSBvcmRlcmVkIGJ1dAogICAgICogdW5ib3VuZCBlbGVtZW50cyBhcmUgbm90LikKICAgICAqCiAgICAgKiBUbyBtYWludGFpbiB0aGUgZGVzaXJlZCAiY2xpZW50IGJlZm9yZSBob3N0IiBvcmRlcmluZyBndWFyYW50ZWUgZm9yIHRoaXMKICAgICAqIGNhc2Ugd2UgcmVseSBvbiB0aGUgImhvc3Qgc3RhY2suIENsaWVudCBub2RlcyByZWdpc3RlcnMgdGhlbXNlbHZlcyB3aXRoCiAgICAgKiB0aGUgY3JlYXRpbmcgaG9zdCBlbGVtZW50IHdoZW4gY3JlYXRlZC4gVGhpcyBlbnN1cmVzIHRoYXQgYWxsIGNsaWVudCBkb20KICAgICAqIGlzIHJlYWRpZWQgaW4gdGhlIHByb3BlciBvcmRlciwgbWFpbnRhaW5pbmcgdGhlIGRlc2lyZWQgZ3VhcmFudGVlLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGhvc3RTdGFjayA9IFtdOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7IVBvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IHByb3RvdHlwZSBFbGVtZW50IHByb3RvdHlwZSB0byByZWdpc3RlcgogICAgICogQHByb3RlY3RlZAogICAgICovCiAgICBmdW5jdGlvbiByZWdpc3Rlcihwcm90b3R5cGUpIHsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGNvcHkgb2YgYHByb3BzYCB3aXRoIGVhY2ggcHJvcGVydHkgbm9ybWFsaXplZCBzdWNoIHRoYXQKICAgICAqIHVwZ3JhZGVkIGl0IGlzIGFuIG9iamVjdCB3aXRoIGF0IGxlYXN0IGEgdHlwZSBwcm9wZXJ0eSB7IHR5cGU6IFR5cGV9LgogICAgICoKICAgICAqIEBwYXJhbSB7IU9iamVjdH0gcHJvcHMgUHJvcGVydGllcyB0byBub3JtYWxpemUKICAgICAqIEByZXR1cm4geyFPYmplY3R9IENvcHkgb2YgaW5wdXQgYHByb3BzYCB3aXRoIG5vcm1hbGl6ZWQgcHJvcGVydGllcyB0aGF0CiAgICAgKiBhcmUgaW4gdGhlIGZvcm0ge3R5cGU6IFR5cGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgIGNvbnN0IG91dHB1dCA9IHt9OwogICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgY29uc3QgbyA9IHByb3BzW3BdOwogICAgICAgIG91dHB1dFtwXSA9ICh0eXBlb2YgbyA9PT0gJ2Z1bmN0aW9uJykgPyB7dHlwZTogb30gOiBvOwogICAgICB9CiAgICAgIHJldHVybiBvdXRwdXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCB0byB1c2luZyB0aGUgUHJvcGVydGllc0NoYW5nZWQKICAgICAqIG1peGluIGJ5IHByb3ZpZGluZyBhIG1lY2hhbmlzbSB0byBkZWNsYXJlIHByb3BlcnRpZXMgaW4gYSBzdGF0aWMKICAgICAqIGdldHRlciAoZS5nLiBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7IHJldHVybiB7IGZvbzogU3RyaW5nIH0gfSkuIENoYW5nZXMKICAgICAqIGFyZSByZXBvcnRlZCB2aWEgdGhlIGBfcHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZC4KICAgICAqCiAgICAgKiBUaGlzIG1peGluIHByb3ZpZGVzIG5vIHNwZWNpZmljIHN1cHBvcnQgZm9yIHJlbmRlcmluZy4gVXNlcnMgYXJlIGV4cGVjdGVkCiAgICAgKiB0byBjcmVhdGUgYSBTaGFkb3dSb290IGFuZCBwdXQgY29udGVudCBpbnRvIGl0IGFuZCB1cGRhdGUgaXQgaW4gd2hhdGV2ZXIKICAgICAqIHdheSBtYWtlcyBzZW5zZS4gVGhpcyBjYW4gYmUgZG9uZSBpbiByZWFjdGlvbiB0byBwcm9wZXJ0aWVzIGNoYW5naW5nIGJ5CiAgICAgKiBpbXBsZW1lbnRpbmcgYF9wcm9wZXJ0aWVzQ2hhbmdlZGAuCiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAYXBwbGllc01peGluIFByb3BlcnRpZXNDaGFuZ2VkCiAgICAgKiBAc3VtbWFyeSBNaXhpbiB0aGF0IHByb3ZpZGVzIGEgbWluaW1hbCBzdGFydGluZyBwb2ludCBmb3IgdXNpbmcKICAgICAqIHRoZSBQcm9wZXJ0aWVzQ2hhbmdlZCBtaXhpbiBieSBwcm92aWRpbmcgYSBkZWNsYXJhdGl2ZSBgcHJvcGVydGllc2Agb2JqZWN0LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIENsYXNzIHRvIGFwcGx5IG1peGluIHRvLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIHdpdGggbWl4aW4gYXBwbGllZC4KICAgICAqLwogICAgY29uc3QgUHJvcGVydGllc01peGluID0gZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgLyoqCiAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydGllc0NoYW5nZWR9CiAgICAgICogQHByaXZhdGUKICAgICAgKi8KICAgICBjb25zdCBiYXNlID0gUHJvcGVydGllc0NoYW5nZWQoc3VwZXJDbGFzcyk7CgogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yIGZvciB0aGUgZ2l2ZW4gY2xhc3MsIGlmIGl0IGlzIGFuCiAgICAgICogaW5zdGFuY2Ugb2YgdGhlIFByb3BlcnRpZXNNaXhpbi4KICAgICAgKgogICAgICAqIEBwYXJhbSB7IVByb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvciBQcm9wZXJ0aWVzTWl4aW4gY29uc3RydWN0b3IKICAgICAgKiBAcmV0dXJuIHs/UHJvcGVydGllc01peGluQ29uc3RydWN0b3J9IFN1cGVyIGNsYXNzIGNvbnN0cnVjdG9yCiAgICAgICovCiAgICAgZnVuY3Rpb24gc3VwZXJQcm9wZXJ0aWVzQ2xhc3MoY29uc3RydWN0b3IpIHsKICAgICAgIGNvbnN0IHN1cGVyQ3RvciA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihjb25zdHJ1Y3Rvcik7CgogICAgICAgLy8gTm90ZSwgdGhlIGBQcm9wZXJ0aWVzTWl4aW5gIGNsYXNzIGJlbG93IG9ubHkgcmVmZXJzIHRvIHRoZSBjbGFzcwogICAgICAgLy8gZ2VuZXJhdGVkIGJ5IHRoaXMgY2FsbCB0byB0aGUgbWl4aW47IHRoZSBpbnN0YW5jZW9mIHRlc3Qgb25seSB3b3JrcwogICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW4gaXMgZGVkdXBlZCBhbmQgZ3VhcmFudGVlZCBvbmx5IHRvIGFwcGx5IG9uY2UsIGhlbmNlCiAgICAgICAvLyBhbGwgY29uc3RydWN0b3JzIGluIGEgcHJvdG8gY2hhaW4gd2lsbCBzZWUgdGhlIHNhbWUgYFByb3BlcnRpZXNNaXhpbmAKICAgICAgIHJldHVybiAoc3VwZXJDdG9yLnByb3RvdHlwZSBpbnN0YW5jZW9mIFByb3BlcnRpZXNNaXhpbikgPwogICAgICAgICAvKiogQHR5cGUgeyFQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8gKHN1cGVyQ3RvcikgOiBudWxsOwogICAgIH0KCiAgICAgLyoqCiAgICAgICogUmV0dXJucyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGBwcm9wZXJ0aWVzYCBvYmplY3QgZm9yIHRoZQogICAgICAqIGdpdmVuIGNsYXNzLiBQcm9wZXJ0aWVzIG5vdCBpbiBvYmplY3QgZm9ybWF0IGFyZSBjb252ZXJ0ZWQgdG8gYXQKICAgICAgKiBsZWFzdCB7dHlwZX0uCiAgICAgICoKICAgICAgKiBAcGFyYW0ge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSBjb25zdHJ1Y3RvciBQcm9wZXJ0aWVzTWl4aW4gY29uc3RydWN0b3IKICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IE1lbW9pemVkIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgICovCiAgICAgZnVuY3Rpb24gb3duUHJvcGVydGllcyhjb25zdHJ1Y3RvcikgewogICAgICAgaWYgKCFjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293blByb3BlcnRpZXMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgIGxldCBwcm9wcyA9IG51bGw7CgogICAgICAgICBpZiAoY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgncHJvcGVydGllcycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgICBjb25zdCBwcm9wZXJ0aWVzID0gY29uc3RydWN0b3IucHJvcGVydGllczsKCiAgICAgICAgICAgaWYgKHByb3BlcnRpZXMpIHsKICAgICAgICAgICAgcHJvcHMgPSBub3JtYWxpemVQcm9wZXJ0aWVzKHByb3BlcnRpZXMpOwogICAgICAgICAgIH0KICAgICAgICAgfQoKICAgICAgICAgY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzID0gcHJvcHM7CiAgICAgICB9CiAgICAgICByZXR1cm4gY29uc3RydWN0b3IuX19vd25Qcm9wZXJ0aWVzOwogICAgIH0KCiAgICAgLyoqCiAgICAgICogQHBvbHltZXIKICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAqIEBleHRlbmRzIHtiYXNlfQogICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnRpZXNNaXhpbn0KICAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgICovCiAgICAgY2xhc3MgUHJvcGVydGllc01peGluIGV4dGVuZHMgYmFzZSB7CgogICAgICAgLyoqCiAgICAgICAgKiBJbXBsZW1lbnRzIHN0YW5kYXJkIGN1c3RvbSBlbGVtZW50cyBnZXR0ZXIgdG8gb2JzZXJ2ZXMgdGhlIGF0dHJpYnV0ZXMKICAgICAgICAqIGxpc3RlZCBpbiBgcHJvcGVydGllc2AuCiAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgKi8KICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnLCB0aGlzKSkpIHsKICAgICAgICAgICByZWdpc3Rlcih0aGlzLnByb3RvdHlwZSk7CiAgICAgICAgICAgY29uc3QgcHJvcHMgPSB0aGlzLl9wcm9wZXJ0aWVzOwogICAgICAgICAgIHRoaXMuX19vYnNlcnZlZEF0dHJpYnV0ZXMgPSBwcm9wcyA/IE9iamVjdC5rZXlzKHByb3BzKS5tYXAocCA9PiB0aGlzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChwKSkgOiBbXTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gdGhpcy5fX29ic2VydmVkQXR0cmlidXRlczsKICAgICAgIH0KCiAgICAgICAvKioKICAgICAgICAqIEZpbmFsaXplcyBhbiBlbGVtZW50IGRlZmluaXRpb24sIGluY2x1ZGluZyBlbnN1cmluZyBhbnkgc3VwZXIgY2xhc3NlcwogICAgICAgICogYXJlIGFsc28gZmluYWxpemVkLiBUaGlzIGluY2x1ZGVzIGVuc3VyaW5nIHByb3BlcnR5CiAgICAgICAgKiBhY2Nlc3NvcnMgZXhpc3Qgb24gdGhlIGVsZW1lbnQgcHJvdG90eXBlLiBUaGlzIG1ldGhvZCBjYWxscwogICAgICAgICogYF9maW5hbGl6ZUNsYXNzYCB0byBmaW5hbGl6ZSBlYWNoIGNvbnN0cnVjdG9yIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uCiAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAqLwogICAgICAgc3RhdGljIGZpbmFsaXplKCkgewogICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19maW5hbGl6ZWQnLCB0aGlzKSkpIHsKICAgICAgICAgICBjb25zdCBzdXBlckN0b3IgPSBzdXBlclByb3BlcnRpZXNDbGFzcygvKiogQHR5cGUgeyFQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpOwogICAgICAgICAgIGlmIChzdXBlckN0b3IpIHsKICAgICAgICAgICAgIHN1cGVyQ3Rvci5maW5hbGl6ZSgpOwogICAgICAgICAgIH0KICAgICAgICAgICB0aGlzLl9fZmluYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICB0aGlzLl9maW5hbGl6ZUNsYXNzKCk7CiAgICAgICAgIH0KICAgICAgIH0KCiAgICAgICAvKioKICAgICAgICAqIEZpbmFsaXplIGFuIGVsZW1lbnQgY2xhc3MuIFRoaXMgaW5jbHVkZXMgZW5zdXJpbmcgcHJvcGVydHkKICAgICAgICAqIGFjY2Vzc29ycyBleGlzdCBvbiB0aGUgZWxlbWVudCBwcm90b3R5cGUuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieQogICAgICAgICogYGZpbmFsaXplYCBhbmQgZmluYWxpemVzIHRoZSBjbGFzcyBjb25zdHJ1Y3Rvci4KICAgICAgICAqCiAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICovCiAgICAgICBzdGF0aWMgX2ZpbmFsaXplQ2xhc3MoKSB7CiAgICAgICAgIGNvbnN0IHByb3BzID0gb3duUHJvcGVydGllcygvKiogQHR5cGUgeyFQcm9wZXJ0aWVzTWl4aW5Db25zdHJ1Y3Rvcn0gKi8odGhpcykpOwogICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgICAvKiogQHR5cGUgez99ICovICh0aGlzKS5jcmVhdGVQcm9wZXJ0aWVzKHByb3BzKTsKICAgICAgICAgfQogICAgICAgfQoKICAgICAgIC8qKgogICAgICAgICogUmV0dXJucyBhIG1lbW9pemVkIHZlcnNpb24gb2YgYWxsIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aG9zZSBpbmhlcml0ZWQKICAgICAgICAqIGZyb20gc3VwZXIgY2xhc3Nlcy4gUHJvcGVydGllcyBub3QgaW4gb2JqZWN0IGZvcm1hdCBhcmUgY29udmVydGVkIHRvCiAgICAgICAgKiBhdCBsZWFzdCB7dHlwZX0uCiAgICAgICAgKgogICAgICAgICogQHJldHVybiB7T2JqZWN0fSBPYmplY3QgY29udGFpbmluZyBwcm9wZXJ0aWVzIGZvciB0aGlzIGNsYXNzCiAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICovCiAgICAgICBzdGF0aWMgZ2V0IF9wcm9wZXJ0aWVzKCkgewogICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoCiAgICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19wcm9wZXJ0aWVzJywgdGhpcykpKSB7CiAgICAgICAgICAgY29uc3Qgc3VwZXJDdG9yID0gc3VwZXJQcm9wZXJ0aWVzQ2xhc3MoLyoqIEB0eXBlIHshUHJvcGVydGllc01peGluQ29uc3RydWN0b3J9ICovKHRoaXMpKTsKICAgICAgICAgICB0aGlzLl9fcHJvcGVydGllcyA9IE9iamVjdC5hc3NpZ24oe30sCiAgICAgICAgICAgICBzdXBlckN0b3IgJiYgc3VwZXJDdG9yLl9wcm9wZXJ0aWVzLAogICAgICAgICAgICAgb3duUHJvcGVydGllcygvKiogQHR5cGUge1Byb3BlcnRpZXNNaXhpbkNvbnN0cnVjdG9yfSAqLyh0aGlzKSkpOwogICAgICAgICB9CiAgICAgICAgIHJldHVybiB0aGlzLl9fcHJvcGVydGllczsKICAgICAgIH0KCiAgICAgICAvKioKICAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZCB0byByZXR1cm4gdHlwZSBzcGVjaWZpZWQgaW4gdGhlCiAgICAgICAgKiBzdGF0aWMgYHByb3BlcnRpZXNgIG9iamVjdCBmb3IgdGhlIGdpdmVuIHByb3BlcnR5LgogICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBwcm9wZXJ0eQogICAgICAgICogQHJldHVybiB7Kn0gVHlwZSB0byB3aGljaCB0byBkZXNlcmlhbGl6ZSBhdHRyaWJ1dGUKICAgICAgICAqCiAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICovCiAgICAgICBzdGF0aWMgdHlwZUZvclByb3BlcnR5KG5hbWUpIHsKICAgICAgICAgY29uc3QgaW5mbyA9IHRoaXMuX3Byb3BlcnRpZXNbbmFtZV07CiAgICAgICAgIHJldHVybiBpbmZvICYmIGluZm8udHlwZTsKICAgICAgIH0KCiAgICAgICAvKioKICAgICAgICAqIE92ZXJyaWRlcyBgUHJvcGVydGllc0NoYW5nZWRgIG1ldGhvZCBhbmQgYWRkcyBhIGNhbGwgdG8KICAgICAgICAqIGBmaW5hbGl6ZWAgd2hpY2ggbGF6aWx5IGNvbmZpZ3VyZXMgdGhlIGVsZW1lbnQncyBwcm9wZXJ0eSBhY2Nlc3NvcnMuCiAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgKi8KICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgdGhpcy5jb25zdHJ1Y3Rvci5maW5hbGl6ZSgpOwogICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgIH0KCiAgICAgICAvKioKICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGFkZGVkIHRvIGEgZG9jdW1lbnQuCiAgICAgICAgKiBDYWxscyBgX2VuYWJsZVByb3BlcnRpZXNgIHRvIHR1cm4gb24gcHJvcGVydHkgc3lzdGVtIGZyb20KICAgICAgICAqIGBQcm9wZXJ0aWVzQ2hhbmdlZGAuCiAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgKi8KICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICBpZiAoc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICB9CiAgICAgICAgIHRoaXMuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgIH0KCiAgICAgICAvKioKICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBlbGVtZW50IGlzIHJlbW92ZWQgZnJvbSBhIGRvY3VtZW50CiAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBTdXBlciBtYXkgb3IgbWF5IG5vdCBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgKi8KICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICBpZiAoc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICB9CiAgICAgICB9CgogICAgIH0KCiAgICAgcmV0dXJuIFByb3BlcnRpZXNNaXhpbjsKCiAgICB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tQcm90b3R5cGFsVHlwZXN9CiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZAogICAgICogYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heQogICAgICogYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieQogICAgICogR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUAogICAgICogcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCgogICAgLyoqCiAgICAgKiBDdXJyZW50IFBvbHltZXIgdmVyc2lvbiBpbiBTZW12ZXIgbm90YXRpb24uCiAgICAgKiBAdHlwZSB7c3RyaW5nfSBTZW12ZXIgbm90YXRpb24gb2YgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBQb2x5bWVyLgogICAgICovCiAgICBjb25zdCB2ZXJzaW9uID0gJzMuNC4xJzsKCiAgICBjb25zdCBidWlsdENTUyA9IHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1NbJ2Nzc0J1aWxkJ107CgogICAgLyoqCiAgICAgKiBFbGVtZW50IGNsYXNzIG1peGluIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MgbWV0YS1wcm9ncmFtbWluZwogICAgICogZmVhdHVyZXMgaW5jbHVkaW5nIHRlbXBsYXRlIHN0YW1waW5nLCBkYXRhLWJpbmRpbmcsIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sCiAgICAgKiBhbmQgcHJvcGVydHkgY2hhbmdlIG9ic2VydmF0aW9uLgogICAgICoKICAgICAqIFN1YmNsYXNzZXJzIG1heSBwcm92aWRlIHRoZSBmb2xsb3dpbmcgc3RhdGljIGdldHRlcnMgdG8gcmV0dXJuIG1ldGFkYXRhCiAgICAgKiB1c2VkIHRvIGNvbmZpZ3VyZSBQb2x5bWVyJ3MgZmVhdHVyZXMgZm9yIHRoZSBjbGFzczoKICAgICAqCiAgICAgKiAtIGBzdGF0aWMgZ2V0IGlzKClgOiBXaGVuIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCB2aWEgYSBgZG9tLW1vZHVsZWAsCiAgICAgKiAgIHVzZXJzIHNob3VsZCByZXR1cm4gdGhlIGBkb20tbW9kdWxlYCBpZCBmcm9tIGEgc3RhdGljIGBpc2AgZ2V0dGVyLiAgSWYKICAgICAqICAgbm8gdGVtcGxhdGUgaXMgbmVlZGVkIG9yIHRoZSB0ZW1wbGF0ZSBpcyBwcm92aWRlZCBkaXJlY3RseSB2aWEgdGhlCiAgICAgKiAgIGB0ZW1wbGF0ZWAgZ2V0dGVyLCB0aGVyZSBpcyBubyBuZWVkIHRvIGRlZmluZSBgaXNgIGZvciB0aGUgZWxlbWVudC4KICAgICAqCiAgICAgKiAtIGBzdGF0aWMgZ2V0IHRlbXBsYXRlKClgOiBVc2VycyBtYXkgcHJvdmlkZSB0aGUgdGVtcGxhdGUgZGlyZWN0bHkgKGFzCiAgICAgKiAgIG9wcG9zZWQgdG8gdmlhIGBkb20tbW9kdWxlYCkgYnkgaW1wbGVtZW50aW5nIGEgc3RhdGljIGB0ZW1wbGF0ZWAgZ2V0dGVyLgogICAgICogICBUaGUgZ2V0dGVyIG11c3QgcmV0dXJuIGFuIGBIVE1MVGVtcGxhdGVFbGVtZW50YC4KICAgICAqCiAgICAgKiAtIGBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKWA6IFNob3VsZCByZXR1cm4gYW4gb2JqZWN0IGRlc2NyaWJpbmcKICAgICAqICAgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIgZmVhdHVyZXMgKGtleTogcHJvcGVydHkgbmFtZQogICAgICogICB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLiBWYWxpZCBrZXlzIGluIHBlci1wcm9wZXJ0eQogICAgICogICBtZXRhZGF0YSBpbmNsdWRlOgogICAgICogICAtIGB0eXBlYCAoU3RyaW5nfE51bWJlcnxPYmplY3R8QXJyYXl8Li4uKTogVXNlZCBieQogICAgICogICAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgICBhcmUgZGVzZXJpYWxpemVkIHRvIEphdmFTY3JpcHQgcHJvcGVydHkgdmFsdWVzLgogICAgICogICAtIGBub3RpZnlgIChib29sZWFuKTogQ2F1c2VzIGEgY2hhbmdlIGluIHRoZSBwcm9wZXJ0eSB0byBmaXJlIGEKICAgICAqICAgICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgICBlbmFibGVkIHR3by13YXkgYmluZGluZyB0byB0aGUgcHJvcGVydHkgdXNlIHRoaXMgZXZlbnQgdG8gb2JzZXJ2ZSBjaGFuZ2VzLgogICAgICogICAtIGByZWFkT25seWAgKGJvb2xlYW4pOiBDcmVhdGVzIGEgZ2V0dGVyIGZvciB0aGUgcHJvcGVydHksIGJ1dCBubyBzZXR0ZXIuCiAgICAgKiAgICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICAgIGBfc2V0UHJvcGVydHkocHJvcGVydHksIHZhbHVlKWAuCiAgICAgKiAgIC0gYG9ic2VydmVyYCAoc3RyaW5nKTogT2JzZXJ2ZXIgbWV0aG9kIG5hbWUgdGhhdCB3aWxsIGJlIGNhbGxlZCB3aGVuCiAgICAgKiAgICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgICBgKHZhbHVlLCBwcmV2aW91c1ZhbHVlKWAuCiAgICAgKiAgIC0gYGNvbXB1dGVkYCAoc3RyaW5nKTogU3RyaW5nIGRlc2NyaWJpbmcgbWV0aG9kIGFuZCBkZXBlbmRlbnQgcHJvcGVydGllcwogICAgICogICAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgICBDb21wdXRlZCBwcm9wZXJ0aWVzIGFyZSByZWFkLW9ubHkgYnkgZGVmYXVsdCBhbmQgY2FuIG9ubHkgYmUgY2hhbmdlZAogICAgICogICAgIHZpYSB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBjb21wdXRpbmcgbWV0aG9kLgogICAgICoKICAgICAqIC0gYHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKClgOiBBcnJheSBvZiBzdHJpbmdzIGRlc2NyaWJpbmcgbXVsdGktcHJvcGVydHkKICAgICAqICAgb2JzZXJ2ZXIgbWV0aG9kcyBhbmQgdGhlaXIgZGVwZW5kZW50IHByb3BlcnRpZXMgKGUuZy4KICAgICAqICAgYCdvYnNlcnZlQUJDKGEsIGIsIGMpJ2ApLgogICAgICoKICAgICAqIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciB0aGUgZm9sbG93aW5nIHN0YW5kYXJkCiAgICAgKiBjdXN0b20gZWxlbWVudCBsaWZlY3ljbGUgY2FsbGJhY2tzOyB1c2VycyBtYXkgb3ZlcnJpZGUgdGhlc2UsIGJ1dCBzaG91bGQKICAgICAqIGNhbGwgdGhlIHN1cGVyIG1ldGhvZCB0byBlbnN1cmUKICAgICAqIC0gYGNvbnN0cnVjdG9yYDogUnVuIHdoZW4gdGhlIGVsZW1lbnQgaXMgY3JlYXRlZCBvciB1cGdyYWRlZAogICAgICogLSBgY29ubmVjdGVkQ2FsbGJhY2tgOiBSdW4gZWFjaCB0aW1lIHRoZSBlbGVtZW50IGlzIGNvbm5lY3RlZCB0byB0aGUKICAgICAqICAgZG9jdW1lbnQKICAgICAqIC0gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYDogUnVuIGVhY2ggdGltZSB0aGUgZWxlbWVudCBpcyBkaXNjb25uZWN0ZWQgZnJvbQogICAgICogICB0aGUgZG9jdW1lbnQKICAgICAqIC0gYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2A6IFJ1biBlYWNoIHRpbWUgYW4gYXR0cmlidXRlIGluCiAgICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGlzIHNldCBvciByZW1vdmVkIChub3RlOiB0aGlzIGVsZW1lbnQncyBkZWZhdWx0CiAgICAgKiAgIGBvYnNlcnZlZEF0dHJpYnV0ZXNgIGltcGxlbWVudGF0aW9uIHdpbGwgYXV0b21hdGljYWxseSByZXR1cm4gYW4gYXJyYXkKICAgICAqICAgb2YgZGFzaC1jYXNlZCBhdHRyaWJ1dGVzIGJhc2VkIG9uIGBwcm9wZXJ0aWVzYCkKICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBhcHBsaWVzTWl4aW4gUHJvcGVydHlFZmZlY3RzCiAgICAgKiBAYXBwbGllc01peGluIFByb3BlcnRpZXNNaXhpbgogICAgICogQHByb3BlcnR5IHJvb3RQYXRoIHtzdHJpbmd9IFNldCB0byB0aGUgdmFsdWUgb2YgYHJvb3RQYXRoYCwKICAgICAqICAgd2hpY2ggZGVmYXVsdHMgdG8gdGhlIG1haW4gZG9jdW1lbnQgcGF0aAogICAgICogQHByb3BlcnR5IGltcG9ydFBhdGgge3N0cmluZ30gU2V0IHRvIHRoZSB2YWx1ZSBvZiB0aGUgY2xhc3MncyBzdGF0aWMKICAgICAqICAgYGltcG9ydFBhdGhgIHByb3BlcnR5LCB3aGljaCBkZWZhdWx0cyB0byB0aGUgcGF0aCBvZiB0aGlzIGVsZW1lbnQncwogICAgICogICBgZG9tLW1vZHVsZWAgKHdoZW4gYGlzYCBpcyB1c2VkKSwgYnV0IGNhbiBiZSBvdmVycmlkZGVuIGZvciBvdGhlcgogICAgICogICBpbXBvcnQgc3RyYXRlZ2llcy4KICAgICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyB0aGUgY29yZSBBUEkgZm9yIFBvbHltZXIncwogICAgICogbWV0YS1wcm9ncmFtbWluZyBmZWF0dXJlcy4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpUKX0gc3VwZXJDbGFzcyBDbGFzcyB0byBhcHBseSBtaXhpbiB0by4KICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzpUKX0gc3VwZXJDbGFzcyB3aXRoIG1peGluIGFwcGxpZWQuCiAgICAgKi8KICAgIGNvbnN0IEVsZW1lbnRNaXhpbiA9IGRlZHVwaW5nTWl4aW4oYmFzZSA9PiB7CiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzfQogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0aWVzTWl4aW59CiAgICAgICAqIEBleHRlbmRzIHtIVE1MRWxlbWVudH0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGNvbnN0IHBvbHltZXJFbGVtZW50QmFzZSA9IFByb3BlcnRpZXNNaXhpbihQcm9wZXJ0eUVmZmVjdHMoYmFzZSkpOwoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIHByb3BlcnRpZXMgd2l0aCBkZWZhdWx0IHZhbHVlcy4KICAgICAgICogVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYXMgYW4gb3B0aW1pemF0aW9uIHNpbmNlIGl0IGlzIGEgc3Vic2V0IG9mCiAgICAgICAqIHRoZSBsaXN0IHJldHVybmVkIGZyb20gYF9wcm9wZXJ0aWVzYC4KICAgICAgICogVGhpcyBsaXN0IGlzIHVzZWQgaW4gYF9pbml0aWFsaXplUHJvcGVydGllc2AgdG8gc2V0IHByb3BlcnR5IGRlZmF1bHRzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAgICogQHJldHVybiB7UG9seW1lckVsZW1lbnRQcm9wZXJ0aWVzfSBGbGF0dGVuZWQgcHJvcGVydGllcyBmb3IgdGhpcyBjbGFzcwogICAgICAgKiAgIHRoYXQgaGF2ZSBkZWZhdWx0IHZhbHVlcwogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gcHJvcGVydHlEZWZhdWx0cyhjb25zdHJ1Y3RvcikgewogICAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoCiAgICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX3Byb3BlcnR5RGVmYXVsdHMnLCBjb25zdHJ1Y3RvcikpKSB7CiAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBudWxsOwogICAgICAgICAgbGV0IHByb3BzID0gY29uc3RydWN0b3IuX3Byb3BlcnRpZXM7CiAgICAgICAgICBmb3IgKGxldCBwIGluIHByb3BzKSB7CiAgICAgICAgICAgIGxldCBpbmZvID0gcHJvcHNbcF07CiAgICAgICAgICAgIGlmICgndmFsdWUnIGluIGluZm8pIHsKICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgPSBjb25zdHJ1Y3Rvci5fX3Byb3BlcnR5RGVmYXVsdHMgfHwge307CiAgICAgICAgICAgICAgY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzW3BdID0gaW5mbzsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gY29uc3RydWN0b3IuX19wcm9wZXJ0eURlZmF1bHRzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIG1lbW9pemVkIHZlcnNpb24gb2YgdGhlIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgKiBAcGFyYW0ge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9IGNvbnN0cnVjdG9yIEVsZW1lbnQgY2xhc3MKICAgICAgICogQHJldHVybiB7QXJyYXl9IEFycmF5IGNvbnRhaW5pbmcgb3duIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGNsYXNzCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIG93bk9ic2VydmVycyhjb25zdHJ1Y3RvcikgewogICAgICAgIGlmICghY29uc3RydWN0b3IuaGFzT3duUHJvcGVydHkoCiAgICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX293bk9ic2VydmVycycsIGNvbnN0cnVjdG9yKSkpIHsKICAgICAgICAgIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzID0KICAgICAgICAgICAgICBjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICAgICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnb2JzZXJ2ZXJzJywgY29uc3RydWN0b3IpKSA/CiAgICAgICAgICAgICAgLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSAqLyAoY29uc3RydWN0b3IpLm9ic2VydmVycyA6CiAgICAgICAgICAgICAgbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnN0cnVjdG9yLl9fb3duT2JzZXJ2ZXJzOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBlZmZlY3RzIGZvciBhIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBOb3RlLCBvbmNlIGEgcHJvcGVydHkgaGFzIGJlZW4gc2V0IHRvCiAgICAgICAqIGByZWFkT25seWAsIGBjb21wdXRlZGAsIGByZWZsZWN0VG9BdHRyaWJ1dGVgLCBvciBgbm90aWZ5YAogICAgICAgKiB0aGVzZSB2YWx1ZXMgbWF5IG5vdCBiZSBjaGFuZ2VkLiBGb3IgZXhhbXBsZSwgYSBzdWJjbGFzcyBjYW5ub3QKICAgICAgICogYWx0ZXIgdGhlc2Ugc2V0dGluZ3MuIEhvd2V2ZXIsIGFkZGl0aW9uYWwgYG9ic2VydmVyc2AgbWF5IGJlIGFkZGVkCiAgICAgICAqIGJ5IHN1YmNsYXNzZXMuCiAgICAgICAqCiAgICAgICAqIFRoZSBpbmZvIG9iamVjdCBzaG91bGQgY29udGFpbiBwcm9wZXJ0eSBtZXRhZGF0YSBhcyBmb2xsb3dzOgogICAgICAgKgogICAgICAgKiAqIGB0eXBlYDoge2Z1bmN0aW9ufSB0eXBlIHRvIHdoaWNoIGFuIGF0dHJpYnV0ZSBtYXRjaGluZyB0aGUgcHJvcGVydHkKICAgICAgICogaXMgZGVzZXJpYWxpemVkLiBOb3RlIHRoZSBwcm9wZXJ0eSBpcyBjYW1lbC1jYXNlZCBmcm9tIGEgZGFzaC1jYXNlZAogICAgICAgKiBhdHRyaWJ1dGUuIEZvciBleGFtcGxlLCAnZm9vLWJhcicgYXR0cmlidXRlIGlzIGRlc2VyaWFsaXplZCB0byBhCiAgICAgICAqIHByb3BlcnR5IG5hbWVkICdmb29CYXInLgogICAgICAgKgogICAgICAgKiAqIGByZWFkT25seWA6IHtib29sZWFufSBjcmVhdGVzIGEgcmVhZE9ubHkgcHJvcGVydHkgYW5kCiAgICAgICAqIG1ha2VzIGEgcHJpdmF0ZSBzZXR0ZXIgZm9yIHRoZSBwcml2YXRlIG9mIHRoZSBmb3JtICdfc2V0Rm9vJyBmb3IgYQogICAgICAgKiBwcm9wZXJ0eSAnZm9vJywKICAgICAgICoKICAgICAgICogKiBgY29tcHV0ZWRgOiB7c3RyaW5nfSBjcmVhdGVzIGEgY29tcHV0ZWQgcHJvcGVydHkuIEEgY29tcHV0ZWQgcHJvcGVydHkKICAgICAgICogaXMgYWxzbyBhdXRvbWF0aWNhbGx5IHNldCB0byBgcmVhZE9ubHk6IHRydWVgLiBUaGUgdmFsdWUgaXMgY2FsY3VsYXRlZAogICAgICAgKiBieSBydW5uaW5nIGEgbWV0aG9kIGFuZCBhcmd1bWVudHMgcGFyc2VkIGZyb20gdGhlIGdpdmVuIHN0cmluZy4gRm9yCiAgICAgICAqIGV4YW1wbGUgJ2NvbXB1dGUoZm9vKScgd2lsbCBjb21wdXRlIGEgZ2l2ZW4gcHJvcGVydHkgd2hlbiB0aGUKICAgICAgICogJ2ZvbycgcHJvcGVydHkgY2hhbmdlcyBieSBleGVjdXRpbmcgdGhlICdjb21wdXRlJyBtZXRob2QuIFRoaXMgbWV0aG9kCiAgICAgICAqIG11c3QgcmV0dXJuIHRoZSBjb21wdXRlZCB2YWx1ZS4KICAgICAgICoKICAgICAgICogKiBgcmVmbGVjdFRvQXR0cmlidXRlYDoge2Jvb2xlYW59IElmIHRydWUsIHRoZSBwcm9wZXJ0eSB2YWx1ZSBpcyByZWZsZWN0ZWQKICAgICAgICogdG8gYW4gYXR0cmlidXRlIG9mIHRoZSBzYW1lIG5hbWUuIE5vdGUsIHRoZSBhdHRyaWJ1dGUgaXMgZGFzaC1jYXNlZAogICAgICAgKiBzbyBhIHByb3BlcnR5IG5hbWVkICdmb29CYXInIGlzIHJlZmxlY3RlZCBhcyAnZm9vLWJhcicuCiAgICAgICAqCiAgICAgICAqICogYG5vdGlmeWA6IHtib29sZWFufSBzZW5kcyBhIG5vbi1idWJibGluZyBub3RpZmljYXRpb24gZXZlbnQgd2hlbgogICAgICAgKiB0aGUgcHJvcGVydHkgY2hhbmdlcy4gRm9yIGV4YW1wbGUsIGEgcHJvcGVydHkgbmFtZWQgJ2Zvbycgc2VuZHMgYW4KICAgICAgICogZXZlbnQgbmFtZWQgJ2Zvby1jaGFuZ2VkJyB3aXRoIGBldmVudC5kZXRhaWxgIHNldCB0byB0aGUgdmFsdWUgb2YKICAgICAgICogdGhlIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiAqIG9ic2VydmVyOiB7c3RyaW5nfSBuYW1lIG9mIGEgbWV0aG9kIHRoYXQgcnVucyB3aGVuIHRoZSBwcm9wZXJ0eQogICAgICAgKiBjaGFuZ2VzLiBUaGUgYXJndW1lbnRzIG9mIHRoZSBtZXRob2QgYXJlICh2YWx1ZSwgcHJldmlvdXNWYWx1ZSkuCiAgICAgICAqCiAgICAgICAqIE5vdGU6IFVzZXJzIG1heSB3YW50IGNvbnRyb2wgb3ZlciBtb2RpZnlpbmcgcHJvcGVydHkKICAgICAgICogZWZmZWN0cyB2aWEgc3ViY2xhc3NpbmcuIEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgd2FudCB0byBtYWtlIGEKICAgICAgICogcmVmbGVjdFRvQXR0cmlidXRlIHByb3BlcnR5IG5vdCBkbyBzbyBpbiBhIHN1YmNsYXNzLiBXZSd2ZSBjaG9zZW4gdG8KICAgICAgICogZGlzYWJsZSB0aGlzIGJlY2F1c2UgaXQgbGVhZHMgdG8gYWRkaXRpb25hbCBjb21wbGljYXRpb24uCiAgICAgICAqIEZvciBleGFtcGxlLCBhIHJlYWRPbmx5IGVmZmVjdCBnZW5lcmF0ZXMgYSBzcGVjaWFsIHNldHRlci4gSWYgYSBzdWJjbGFzcwogICAgICAgKiBkaXNhYmxlcyB0aGUgZWZmZWN0LCB0aGUgc2V0dGVyIHdvdWxkIGZhaWwgdW5leHBlY3RlZGx5LgogICAgICAgKiBCYXNlZCBvbiBmZWVkYmFjaywgd2UgbWF5IHdhbnQgdG8gdHJ5IHRvIG1ha2UgZWZmZWN0cyBtb3JlIG1hbGxlYWJsZQogICAgICAgKiBhbmQvb3IgcHJvdmlkZSBhbiBhZHZhbmNlZCBhcGkgZm9yIG1hbmlwdWxhdGluZyB0aGVtLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFQb2x5bWVyRWxlbWVudH0gcHJvdG8gRWxlbWVudCBjbGFzcyBwcm90b3R5cGUgdG8gYWRkIGFjY2Vzc29ycwogICAgICAgKiAgIGFuZCBlZmZlY3RzIHRvCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gaW5mbyBJbmZvIG9iamVjdCBmcm9tIHdoaWNoIHRvIGNyZWF0ZSBwcm9wZXJ0eSBlZmZlY3RzLgogICAgICAgKiBTdXBwb3J0ZWQga2V5czoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGFsbFByb3BzIEZsYXR0ZW5lZCBtYXAgb2YgYWxsIHByb3BlcnRpZXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgICAqICAgZWxlbWVudCAoaW5jbHVkaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzKQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgZnVuY3Rpb24gY3JlYXRlUHJvcGVydHlGcm9tQ29uZmlnKHByb3RvLCBuYW1lLCBpbmZvLCBhbGxQcm9wcykgewogICAgICAgIC8vIGNvbXB1dGVkIGZvcmNlcyByZWFkT25seS4uLgogICAgICAgIGlmIChpbmZvLmNvbXB1dGVkKSB7CiAgICAgICAgICBpbmZvLnJlYWRPbmx5ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gTm90ZSwgc2luY2UgYWxsIGNvbXB1dGVkIHByb3BlcnRpZXMgYXJlIHJlYWRPbmx5LCB0aGlzIHByZXZlbnRzCiAgICAgICAgLy8gYWRkaW5nIGFkZGl0aW9uYWwgY29tcHV0ZWQgcHJvcGVydHkgZWZmZWN0cyAod2hpY2ggbGVhZHMgdG8gYSBjb25mdXNpbmcKICAgICAgICAvLyBzZXR1cCB3aGVyZSBtdWx0aXBsZSB0cmlnZ2VycyBmb3Igc2V0dGluZyBhIHByb3BlcnR5KQogICAgICAgIC8vIFdoaWxlIHdlIGRvIGhhdmUgYGhhc0NvbXB1dGVkRWZmZWN0YCB0aGlzIGlzIHNldCBvbiB0aGUgcHJvcGVydHkncwogICAgICAgIC8vIGRlcGVuZGVuY2llcyByYXRoZXIgdGhhbiBpdHNlbGYuCiAgICAgICAgaWYgKGluZm8uY29tcHV0ZWQpIHsKICAgICAgICAgIGlmIChwcm90by5faGFzUmVhZE9ubHlFZmZlY3QobmFtZSkpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKGBDYW5ub3QgcmVkZWZpbmUgY29tcHV0ZWQgcHJvcGVydHkgJyR7bmFtZX0nLmApOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcHJvdG8uX2NyZWF0ZUNvbXB1dGVkUHJvcGVydHkobmFtZSwgaW5mby5jb21wdXRlZCwgYWxsUHJvcHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaW5mby5yZWFkT25seSAmJiAhcHJvdG8uX2hhc1JlYWRPbmx5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgICBwcm90by5fY3JlYXRlUmVhZE9ubHlQcm9wZXJ0eShuYW1lLCAhaW5mby5jb21wdXRlZCk7CiAgICAgICAgfSBlbHNlIGlmIChpbmZvLnJlYWRPbmx5ID09PSBmYWxzZSAmJiBwcm90by5faGFzUmVhZE9ubHlFZmZlY3QobmFtZSkpIHsKICAgICAgICAgIGNvbnNvbGUud2FybihgQ2Fubm90IG1ha2UgcmVhZE9ubHkgcHJvcGVydHkgJyR7bmFtZX0nIG5vbi1yZWFkT25seS5gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZm8ucmVmbGVjdFRvQXR0cmlidXRlICYmICFwcm90by5faGFzUmVmbGVjdEVmZmVjdChuYW1lKSkgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZVJlZmxlY3RlZFByb3BlcnR5KG5hbWUpOwogICAgICAgIH0gZWxzZSBpZiAoaW5mby5yZWZsZWN0VG9BdHRyaWJ1dGUgPT09IGZhbHNlICYmIHByb3RvLl9oYXNSZWZsZWN0RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oYENhbm5vdCBtYWtlIHJlZmxlY3RlZCBwcm9wZXJ0eSAnJHtuYW1lfScgbm9uLXJlZmxlY3RlZC5gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZm8ubm90aWZ5ICYmICFwcm90by5faGFzTm90aWZ5RWZmZWN0KG5hbWUpKSB7CiAgICAgICAgICBwcm90by5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkobmFtZSk7CiAgICAgICAgfSBlbHNlIGlmIChpbmZvLm5vdGlmeSA9PT0gZmFsc2UgJiYgcHJvdG8uX2hhc05vdGlmeUVmZmVjdChuYW1lKSkgewogICAgICAgICAgY29uc29sZS53YXJuKGBDYW5ub3QgbWFrZSBub3RpZnkgcHJvcGVydHkgJyR7bmFtZX0nIG5vbi1ub3RpZnkuYCk7CiAgICAgICAgfQogICAgICAgIC8vIGFsd2F5cyBhZGQgb2JzZXJ2ZXIKICAgICAgICBpZiAoaW5mby5vYnNlcnZlcikgewogICAgICAgICAgcHJvdG8uX2NyZWF0ZVByb3BlcnR5T2JzZXJ2ZXIobmFtZSwgaW5mby5vYnNlcnZlciwgYWxsUHJvcHNbaW5mby5vYnNlcnZlcl0pOwogICAgICAgIH0KICAgICAgICAvLyBhbHdheXMgY3JlYXRlIHRoZSBtYXBwaW5nIGZyb20gYXR0cmlidXRlIGJhY2sgdG8gcHJvcGVydHkgZm9yIGRlc2VyaWFsaXphdGlvbi4KICAgICAgICBwcm90by5fYWRkUHJvcGVydHlUb0F0dHJpYnV0ZU1hcChuYW1lKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFByb2Nlc3MgYWxsIHN0eWxlIGVsZW1lbnRzIGluIHRoZSBlbGVtZW50IHRlbXBsYXRlLiBTdHlsZXMgd2l0aCB0aGUKICAgICAgICogYGluY2x1ZGVgIGF0dHJpYnV0ZSBhcmUgcHJvY2Vzc2VkIHN1Y2ggdGhhdCBhbnkgc3R5bGVzIGluCiAgICAgICAqIHRoZSBhc3NvY2lhdGVkICJzdHlsZSBtb2R1bGVzIiBhcmUgaW5jbHVkZWQgaW4gdGhlIGVsZW1lbnQgdGVtcGxhdGUuCiAgICAgICAqIEBwYXJhbSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0ga2xhc3MgRWxlbWVudCBjbGFzcwogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBwcm9jZXNzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpcyBOYW1lIG9mIGVsZW1lbnQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGJhc2VVUkkgQmFzZSBVUkkgZm9yIGVsZW1lbnQKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHByb2Nlc3NFbGVtZW50U3R5bGVzKGtsYXNzLCB0ZW1wbGF0ZSwgaXMsIGJhc2VVUkkpIHsKICAgICAgICBpZiAoIWJ1aWx0Q1NTKSB7CiAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVN0eWxlcyA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICAgIGNvbnN0IHN0eWxlc1dpdGhJbXBvcnRzID0gc3R5bGVzRnJvbVRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICAgIC8vIGluc2VydCBzdHlsZXMgZnJvbSA8bGluayByZWw9ImltcG9ydCIgdHlwZT0iY3NzIj4gYXQgdGhlIHRvcCBvZiB0aGUgdGVtcGxhdGUKICAgICAgICAgIGNvbnN0IGxpbmtlZFN0eWxlcyA9IHN0eWxlc0Zyb21Nb2R1bGVJbXBvcnRzKGlzKTsKICAgICAgICAgIGNvbnN0IGZpcnN0VGVtcGxhdGVDaGlsZCA9IHRlbXBsYXRlLmNvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQ7CiAgICAgICAgICBmb3IgKGxldCBpZHggPSAwOyBpZHggPCBsaW5rZWRTdHlsZXMubGVuZ3RoOyBpZHgrKykgewogICAgICAgICAgICBsZXQgcyA9IGxpbmtlZFN0eWxlc1tpZHhdOwogICAgICAgICAgICBzLnRleHRDb250ZW50ID0ga2xhc3MuX3Byb2Nlc3NTdHlsZVRleHQocy50ZXh0Q29udGVudCwgYmFzZVVSSSk7CiAgICAgICAgICAgIHRlbXBsYXRlLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKHMsIGZpcnN0VGVtcGxhdGVDaGlsZCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0ICJjb25jcmV0ZSIgc3R5bGUgaW4gdGhlIHRlbXBsYXRlIHdlIGhhdmUgZW5jb3VudGVyZWQKICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxlSW5kZXggPSAwOwogICAgICAgICAgLy8gZW5zdXJlIGFsbCBnYXRoZXJlZCBzdHlsZXMgYXJlIGFjdHVhbGx5IGluIHRoaXMgdGVtcGxhdGUuCiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlc1dpdGhJbXBvcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBzID0gc3R5bGVzV2l0aEltcG9ydHNbaV07CiAgICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxlID0gdGVtcGxhdGVTdHlsZXNbdGVtcGxhdGVTdHlsZUluZGV4XTsKICAgICAgICAgICAgLy8gaWYgdGhlIHN0eWxlIGlzIG5vdCBpbiB0aGlzIHRlbXBsYXRlLCBpdCdzIGJlZW4gImluY2x1ZGVkIiBhbmQKICAgICAgICAgICAgLy8gd2UgcHV0IGEgY2xvbmUgb2YgaXQgaW4gdGhlIHRlbXBsYXRlIGJlZm9yZSB0aGUgc3R5bGUgdGhhdCBpbmNsdWRlZCBpdAogICAgICAgICAgICBpZiAodGVtcGxhdGVTdHlsZSAhPT0gcykgewogICAgICAgICAgICAgIHMgPSBzLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgICAgICB0ZW1wbGF0ZVN0eWxlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHMsIHRlbXBsYXRlU3R5bGUpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRlbXBsYXRlU3R5bGVJbmRleCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHMudGV4dENvbnRlbnQgPSBrbGFzcy5fcHJvY2Vzc1N0eWxlVGV4dChzLnRleHRDb250ZW50LCBiYXNlVVJJKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUykgewogICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgaXMpOwogICAgICAgIH0KICAgICAgICAvLyBTdXBwb3J0IGZvciBgYWRvcHRlZFN0eWxlc2hlZXRzYCByZWxpZXMgb24gdXNpbmcgbmF0aXZlIFNoYWRvdyBET00KICAgICAgICAvLyBhbmQgYnVpbHQgQ1NTLiBCdWlsdCBDU1MgaXMgcmVxdWlyZWQgYmVjYXVzZSBydW50aW1lIHRyYW5zZm9ybWF0aW9uIG9mCiAgICAgICAgLy8gYEBhcHBseWAgaXMgbm90IHN1cHBvcnRlZC4gVGhpcyBpcyBiZWNhdXNlIFNoYWR5Q1NTIHJlbGllcyBvbiBiZWluZyBhYmxlCiAgICAgICAgLy8gdG8gdXBkYXRlIGEgYHN0eWxlYCBlbGVtZW50IGluIHRoZSBlbGVtZW50IHRlbXBsYXRlIGFuZCB0aGlzIGlzCiAgICAgICAgLy8gcmVtb3ZlZCB3aGVuIHVzaW5nIGBhZG9wdGVkU3R5bGVTaGVldHNgLgogICAgICAgIC8vIE5vdGUsIGl0IHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IHRvIGFsbG93IHN0eWxlIGluY2x1ZGVzIHRvIGJlY29tZQogICAgICAgIC8vIHNlcGFyYXRlIHN0eWxlc2hlZXRzOyBob3dldmVyLCBiZWNhdXNlIG9mIGBAYXBwbHlgIHRoZXNlIGFyZQogICAgICAgIC8vIHBvdGVudGlhbGx5IG5vdCBzaGFyZWFibGUgYW5kIHNoYXJpbmcgdGhlIG9uZXMgdGhhdCBjb3VsZCBiZSBzaGFyZWQKICAgICAgICAvLyB3b3VsZCByZXF1aXJlIHNvbWUgY29vcmRpbmF0aW9uLiBUbyBrZWVwIGl0IHNpbXBsZSwgYWxsIHRoZSBpbmNsdWRlcwogICAgICAgIC8vIGFuZCBzdHlsZXMgYXJlIGNvbGxhcHNlZCBpbnRvIGEgc2luZ2xlIHNoYXJlYWJsZSBzdHlsZXNoZWV0LgogICAgICAgIGlmICh1c2VBZG9wdGVkU3R5bGVTaGVldHNXaXRoQnVpbHRDU1MgJiYgYnVpbHRDU1MgJiYKICAgICAgICAgICAgc3VwcG9ydHNBZG9wdGluZ1N0eWxlU2hlZXRzKSB7CiAgICAgICAgICAvLyBSZW1vdmUgc3R5bGVzIGluIHRlbXBsYXRlIGFuZCBtYWtlIGEgc2hhcmVhYmxlIHN0eWxlc2hlZXQKICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3RvckFsbCgnc3R5bGUnKTsKICAgICAgICAgIGlmIChzdHlsZXMpIHsKICAgICAgICAgICAgbGV0IGNzcyA9ICcnOwogICAgICAgICAgICBBcnJheS5mcm9tKHN0eWxlcykuZm9yRWFjaChzID0+IHsKICAgICAgICAgICAgICBjc3MgKz0gcy50ZXh0Q29udGVudDsKICAgICAgICAgICAgICBzLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBrbGFzcy5fc3R5bGVTaGVldCA9IG5ldyBDU1NTdHlsZVNoZWV0KCk7CiAgICAgICAgICAgIGtsYXNzLl9zdHlsZVNoZWV0LnJlcGxhY2VTeW5jKGNzcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogTG9vayB1cCB0ZW1wbGF0ZSBmcm9tIGRvbS1tb2R1bGUgZm9yIGVsZW1lbnQKICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGlzIEVsZW1lbnQgbmFtZSB0byBsb29rIHVwCiAgICAgICAqIEByZXR1cm4gez9IVE1MVGVtcGxhdGVFbGVtZW50fHVuZGVmaW5lZH0gVGVtcGxhdGUgZm91bmQgaW4gZG9tIG1vZHVsZSwgb3IKICAgICAgICogICB1bmRlZmluZWQgaWYgbm90IGZvdW5kCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlRnJvbURvbU1vZHVsZShpcykgewogICAgICAgIGxldCB0ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgLy8gVW5kZXIgc3RyaWN0VGVtcGxhdGVQb2xpY3kgaW4gMy54KywgZG9tLW1vZHVsZSBsb29rdXAgaXMgb25seSBhbGxvd2VkCiAgICAgICAgLy8gd2hlbiBvcHRlZC1pbiB2aWEgYWxsb3dUZW1wbGF0ZUZyb21Eb21Nb2R1bGUKICAgICAgICBpZiAoaXMgJiYgKCFzdHJpY3RUZW1wbGF0ZVBvbGljeSB8fCBhbGxvd1RlbXBsYXRlRnJvbURvbU1vZHVsZSkpIHsKICAgICAgICAgIHRlbXBsYXRlID0gLyoqIEB0eXBlIHs/SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8gKAogICAgICAgICAgICAgIERvbU1vZHVsZS5pbXBvcnQoaXMsICd0ZW1wbGF0ZScpKTsKICAgICAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCByZXF1aXJlIGFueSBlbGVtZW50IHdpdGggYW4gYGlzYAogICAgICAgICAgLy8gc3BlY2lmaWVkIHRvIGhhdmUgYSBkb20tbW9kdWxlCiAgICAgICAgICBpZiAoc3RyaWN0VGVtcGxhdGVQb2xpY3kgJiYgIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgc3RyaWN0VGVtcGxhdGVQb2xpY3k6IGV4cGVjdGluZyBkb20tbW9kdWxlIG9yIG51bGwgdGVtcGxhdGUgZm9yICR7aXN9YCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0ZW1wbGF0ZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEB1bnJlc3RyaWN0ZWQKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICAgKiBAZXh0ZW5kcyB7cG9seW1lckVsZW1lbnRCYXNlfQogICAgICAgKi8KICAgICAgY2xhc3MgUG9seW1lckVsZW1lbnQgZXh0ZW5kcyBwb2x5bWVyRWxlbWVudEJhc2UgewoKICAgICAgICAvKioKICAgICAgICAgKiBDdXJyZW50IFBvbHltZXIgdmVyc2lvbiBpbiBTZW12ZXIgbm90YXRpb24uCiAgICAgICAgICogQHR5cGUge3N0cmluZ30gU2VtdmVyIG5vdGF0aW9uIG9mIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgUG9seW1lci4KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBnZXQgcG9seW1lckVsZW1lbnRWZXJzaW9uKCkgewogICAgICAgICAgcmV0dXJuIHZlcnNpb247CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZSBvZiBQcm9wZXJ0aWVzTWl4aW4gX2ZpbmFsaXplQ2xhc3MgdG8gY3JlYXRlIG9ic2VydmVycyBhbmQKICAgICAgICAgKiBmaW5kIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMjQwKToKICAgICAgICAgIC8vICAgICBDaGFuZ2UgYmFjayB0byBqdXN0IHN1cGVyLm1ldGhvZENhbGwoKQogICAgICAgICAgcG9seW1lckVsZW1lbnRCYXNlLl9maW5hbGl6ZUNsYXNzLmNhbGwodGhpcyk7CiAgICAgICAgICBjb25zdCBvYnNlcnZlcnMgPSBvd25PYnNlcnZlcnModGhpcyk7CiAgICAgICAgICBpZiAob2JzZXJ2ZXJzKSB7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlT2JzZXJ2ZXJzKG9ic2VydmVycywgdGhpcy5fcHJvcGVydGllcyk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKTsKICAgICAgICB9CgogICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgICAgIHN0YXRpYyBfcHJlcGFyZVRlbXBsYXRlKCkgewogICAgICAgICAgLy8gbm90ZTogY3JlYXRlICJ3b3JraW5nIiB0ZW1wbGF0ZSB0aGF0IGlzIGZpbmFsaXplZCBhdCBpbnN0YW5jZSB0aW1lCiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSAvKiogQHR5cGUge1BvbHltZXJFbGVtZW50Q29uc3RydWN0b3J9ICovICh0aGlzKS50ZW1wbGF0ZTsKICAgICAgICAgIGlmICh0ZW1wbGF0ZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIHRlbXBsYXRlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ3RlbXBsYXRlIGdldHRlciBtdXN0IHJldHVybiBIVE1MVGVtcGxhdGVFbGVtZW50Jyk7CiAgICAgICAgICAgICAgdGVtcGxhdGUgPSBudWxsOwogICAgICAgICAgICB9IGVsc2UgaWYgKCFsZWdhY3lPcHRpbWl6YXRpb25zKSB7CiAgICAgICAgICAgICAgdGVtcGxhdGUgPSB0ZW1wbGF0ZS5jbG9uZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGUgPSB0ZW1wbGF0ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlIG9mIFByb3BlcnRpZXNDaGFuZ2VkIGNyZWF0ZVByb3BlcnRpZXMgdG8gY3JlYXRlIGFjY2Vzc29ycwogICAgICAgICAqIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIGZvciBhbGwgb2YgdGhlIHByb3BlcnRpZXMuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBwcm9wcyAuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlUHJvcGVydGllcyhwcm9wcykgewogICAgICAgICAgZm9yIChsZXQgcCBpbiBwcm9wcykgewogICAgICAgICAgICBjcmVhdGVQcm9wZXJ0eUZyb21Db25maWcoCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovICh0aGlzLnByb3RvdHlwZSksIHAsIHByb3BzW3BdLCBwcm9wcyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIG9ic2VydmVycyBmb3IgdGhlIGdpdmVuIGBvYnNlcnZlcnNgIGFycmF5LgogICAgICAgICAqIExldmVyYWdlcyBgUHJvcGVydHlFZmZlY3RzYCB0byBjcmVhdGUgb2JzZXJ2ZXJzLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYnNlcnZlcnMgQXJyYXkgb2Ygb2JzZXJ2ZXIgZGVzY3JpcHRvcnMgZm9yCiAgICAgICAgICogICB0aGlzIGNsYXNzCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGR5bmFtaWNGbnMgT2JqZWN0IGNvbnRhaW5pbmcga2V5cyBmb3IgYW55IHByb3BlcnRpZXMKICAgICAgICAgKiAgIHRoYXQgYXJlIGZ1bmN0aW9ucyBhbmQgc2hvdWxkIHRyaWdnZXIgdGhlIGVmZmVjdCB3aGVuIHRoZSBmdW5jdGlvbgogICAgICAgICAqICAgcmVmZXJlbmNlIGlzIGNoYW5nZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGVPYnNlcnZlcnMob2JzZXJ2ZXJzLCBkeW5hbWljRm5zKSB7CiAgICAgICAgICBjb25zdCBwcm90byA9IHRoaXMucHJvdG90eXBlOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgb2JzZXJ2ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHByb3RvLl9jcmVhdGVNZXRob2RPYnNlcnZlcihvYnNlcnZlcnNbaV0sIGR5bmFtaWNGbnMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgdGhhdCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGlzIGVsZW1lbnQncyBzaGFkb3cgcm9vdC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgYHN0YXRpYyBnZXQgaXMoKWAgZ2V0dGVyIGlzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHdpbGwKICAgICAgICAgKiByZXR1cm4gdGhlIGZpcnN0IGA8dGVtcGxhdGU+YCBpbiBhIGBkb20tbW9kdWxlYCB3aG9zZSBgaWRgIG1hdGNoZXMgdGhpcwogICAgICAgICAqIGVsZW1lbnQncyBgaXNgIChub3RlIHRoYXQgYSBgX3RlbXBsYXRlYCBwcm9wZXJ0eSBvbiB0aGUgY2xhc3MgcHJvdG90eXBlCiAgICAgICAgICogdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZSBgZG9tLW1vZHVsZWAgdGVtcGxhdGUsIHRvIG1haW50YWluIGxlZ2FjeQogICAgICAgICAqIGVsZW1lbnQgc2VtYW50aWNzOyBhIHN1YmNsYXNzIHdpbGwgc3Vic2VxdWVudGx5IGZhbGwgYmFjayB0byBpdHMgc3VwZXIKICAgICAgICAgKiBjbGFzcyB0ZW1wbGF0ZSBpZiBuZWl0aGVyIGEgYHByb3RvdHlwZS5fdGVtcGxhdGVgIG9yIGEgYGRvbS1tb2R1bGVgIGZvcgogICAgICAgICAqIHRoZSBjbGFzcydzIGBpc2Agd2FzIGZvdW5kKS4KICAgICAgICAgKgogICAgICAgICAqIFVzZXJzIG1heSBvdmVycmlkZSB0aGlzIGdldHRlciB0byByZXR1cm4gYW4gYXJiaXRyYXJ5IHRlbXBsYXRlCiAgICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIGBpc2AgZ2V0dGVyIGlzIHVubmVjZXNzYXJ5KS4gVGhlIHRlbXBsYXRlIHJldHVybmVkCiAgICAgICAgICogbXVzdCBiZSBhbiBgSFRNTFRlbXBsYXRlRWxlbWVudGAuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlIHRoYXQgd2hlbiBzdWJjbGFzc2luZywgaWYgdGhlIHN1cGVyIGNsYXNzIG92ZXJyb2RlIHRoZSBkZWZhdWx0CiAgICAgICAgICogaW1wbGVtZW50YXRpb24gYW5kIHRoZSBzdWJjbGFzcyB3b3VsZCBsaWtlIHRvIHByb3ZpZGUgYW4gYWx0ZXJuYXRlCiAgICAgICAgICogdGVtcGxhdGUgdmlhIGEgYGRvbS1tb2R1bGVgLCBpdCBzaG91bGQgb3ZlcnJpZGUgdGhpcyBnZXR0ZXIgYW5kCiAgICAgICAgICogcmV0dXJuIGBEb21Nb2R1bGUuaW1wb3J0KHRoaXMuaXMsICd0ZW1wbGF0ZScpYC4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgc3ViY2xhc3Mgd291bGQgbGlrZSB0byBtb2RpZnkgdGhlIHN1cGVyIGNsYXNzIHRlbXBsYXRlLCBpdCBzaG91bGQKICAgICAgICAgKiBjbG9uZSBpdCByYXRoZXIgdGhhbiBtb2RpZnkgaXQgaW4gcGxhY2UuICBJZiB0aGUgZ2V0dGVyIGRvZXMgZXhwZW5zaXZlCiAgICAgICAgICogd29yayBzdWNoIGFzIGNsb25pbmcvbW9kaWZ5aW5nIGEgdGVtcGxhdGUsIGl0IHNob3VsZCBtZW1vaXplIHRoZQogICAgICAgICAqIHRlbXBsYXRlIGZvciBtYXhpbXVtIHBlcmZvcm1hbmNlOgogICAgICAgICAqCiAgICAgICAgICogICBsZXQgbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICAgKiAgIGNsYXNzIE15U3ViQ2xhc3MgZXh0ZW5kcyBNeVN1cGVyQ2xhc3MgewogICAgICAgICAqICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgICAqICAgICAgIGlmICghbWVtb2l6ZWRUZW1wbGF0ZSkgewogICAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZSA9IHN1cGVyLnRlbXBsYXRlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgKiAgICAgICAgIGxldCBzdWJDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICogICAgICAgICBzdWJDb250ZW50LnRleHRDb250ZW50ID0gJ1RoaXMgY2FtZSBmcm9tIE15U3ViQ2xhc3MnOwogICAgICAgICAqICAgICAgICAgbWVtb2l6ZWRUZW1wbGF0ZS5jb250ZW50LmFwcGVuZENoaWxkKHN1YkNvbnRlbnQpOwogICAgICAgICAqICAgICAgIH0KICAgICAgICAgKiAgICAgICByZXR1cm4gbWVtb2l6ZWRUZW1wbGF0ZTsKICAgICAgICAgKiAgICAgfQogICAgICAgICAqICAgfQogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR8c3RyaW5nfSBUZW1wbGF0ZSB0byBiZSBzdGFtcGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgICAgLy8gRXhwbGFuYXRpb24gb2YgdGVtcGxhdGUtcmVsYXRlZCBwcm9wZXJ0aWVzOgogICAgICAgICAgLy8gLSBjb25zdHJ1Y3Rvci50ZW1wbGF0ZSAodGhpcyBnZXR0ZXIpOiB0aGUgdGVtcGxhdGUgZm9yIHRoZSBjbGFzcy4KICAgICAgICAgIC8vICAgICBUaGlzIGNhbiBjb21lIGZyb20gdGhlIHByb3RvdHlwZSAoZm9yIGxlZ2FjeSBlbGVtZW50cyksIGZyb20gYQogICAgICAgICAgLy8gICAgIGRvbS1tb2R1bGUsIG9yIGZyb20gdGhlIHN1cGVyIGNsYXNzJ3MgdGVtcGxhdGUgKG9yIGNhbiBiZSBvdmVycmlkZGVuCiAgICAgICAgICAvLyAgICAgYWx0b2dldGhlciBieSB0aGUgdXNlcikKICAgICAgICAgIC8vIC0gY29uc3RydWN0b3IuX3RlbXBsYXRlOiBtZW1vaXplZCB2ZXJzaW9uIG9mIGNvbnN0cnVjdG9yLnRlbXBsYXRlCiAgICAgICAgICAvLyAtIHByb3RvdHlwZS5fdGVtcGxhdGU6IHdvcmtpbmcgdGVtcGxhdGUgZm9yIHRoZSBlbGVtZW50LCB3aGljaCB3aWxsIGJlCiAgICAgICAgICAvLyAgICAgcGFyc2VkIGFuZCBtb2RpZmllZCBpbiBwbGFjZS4gSXQgaXMgYSBjbG9uZWQgdmVyc2lvbiBvZgogICAgICAgICAgLy8gICAgIGNvbnN0cnVjdG9yLnRlbXBsYXRlLCBzYXZlZCBpbiBfZmluYWxpemVDbGFzcygpLiBOb3RlIHRoYXQgYmVmb3JlCiAgICAgICAgICAvLyAgICAgdGhpcyBnZXR0ZXIgaXMgY2FsbGVkLCBmb3IgbGVnYWN5IGVsZW1lbnRzIHRoaXMgY291bGQgYmUgZnJvbSBhCiAgICAgICAgICAvLyAgICAgX3RlbXBsYXRlIGZpZWxkIG9uIHRoZSBpbmZvIG9iamVjdCBwYXNzZWQgdG8gUG9seW1lcigpLCBhIGJlaGF2aW9yLAogICAgICAgICAgLy8gICAgIG9yIHNldCBpbiByZWdpc3RlcmVkKCk7IG9uY2UgdGhlIHN0YXRpYyBnZXR0ZXIgcnVucywgYSBjbG9uZSBvZiBpdAogICAgICAgICAgLy8gICAgIHdpbGwgb3ZlcndyaXRlIGl0IG9uIHRoZSBwcm90b3R5cGUgYXMgdGhlIHdvcmtpbmcgdGVtcGxhdGUuCiAgICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX3RlbXBsYXRlJywgdGhpcykpKSB7CiAgICAgICAgICAgIGNvbnN0IHByb3RvVGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSgKICAgICAgICAgICAgICBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfdGVtcGxhdGUnLCB0aGlzLnByb3RvdHlwZSkpID8KICAgICAgICAgICAgICB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGUgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0KICAgICAgICAgICAgICAvLyBJZiB1c2VyIGhhcyBwdXQgdGVtcGxhdGUgb24gcHJvdG90eXBlIChlLmcuIGluIGxlZ2FjeSB2aWEgcmVnaXN0ZXJlZAogICAgICAgICAgICAgIC8vIGNhbGxiYWNrIG9yIGluZm8gb2JqZWN0KSwgcHJlZmVyIHRoYXQgZmlyc3QuIE5vdGUgdGhhdCBgbnVsbGAgaXMKICAgICAgICAgICAgICAvLyB1c2VkIGFzIGEgc2VudGluZWwgdG8gaW5kaWNhdGUgIm5vIHRlbXBsYXRlIiBhbmQgY2FuIGJlIHVzZWQgdG8KICAgICAgICAgICAgICAvLyBvdmVycmlkZSBhIHN1cGVyIHRlbXBsYXRlLCB3aGVyZWFzIGB1bmRlZmluZWRgIGlzIHVzZWQgYXMgYQogICAgICAgICAgICAgIC8vIHNlbnRpbmVsIHRvIG1lYW4gImZhbGwtYmFjayB0byBkZWZhdWx0IHRlbXBsYXRlIGxvb2t1cCIgdmlhCiAgICAgICAgICAgICAgLy8gZG9tLW1vZHVsZSBhbmQvb3Igc3VwZXIudGVtcGxhdGUuCiAgICAgICAgICAgICAgcHJvdG9UZW1wbGF0ZSAhPT0gdW5kZWZpbmVkID8gcHJvdG9UZW1wbGF0ZSA6CiAgICAgICAgICAgICAgLy8gTG9vayBpbiBkb20tbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVsZW1lbnQncyBpcwogICAgICAgICAgICAgICgodGhpcy5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdpcycsIHRoaXMpKSAmJgogICAgICAgICAgICAgIChnZXRUZW1wbGF0ZUZyb21Eb21Nb2R1bGUoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSovICh0aGlzKS5pcykpKSB8fAogICAgICAgICAgICAgIC8vIE5leHQgbG9vayBmb3Igc3VwZXJjbGFzcyB0ZW1wbGF0ZSAoY2FsbCB0aGUgc3VwZXIgaW1wbCB0aGlzCiAgICAgICAgICAgICAgLy8gd2F5IHNvIHRoYXQgYHRoaXNgIHBvaW50cyB0byB0aGUgc3VwZXJjbGFzcykKICAgICAgICAgICAgICBPYmplY3QuZ2V0UHJvdG90eXBlT2YoLyoqIEB0eXBlIHtQb2x5bWVyRWxlbWVudENvbnN0cnVjdG9yfSovICh0aGlzKS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yLnRlbXBsYXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0aGUgdGVtcGxhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fHN0cmluZ30gdmFsdWUgVGVtcGxhdGUgdG8gc2V0LgogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHNldCB0ZW1wbGF0ZSh2YWx1ZSkgewogICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB2YWx1ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBhdGggbWF0Y2hpbmcgdGhlIHVybCBmcm9tIHdoaWNoIHRoZSBlbGVtZW50IHdhcyBpbXBvcnRlZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcGF0aCBpcyB1c2VkIHRvIHJlc29sdmUgdXJsJ3MgaW4gdGVtcGxhdGUgc3R5bGUgY3NzVGV4dC4KICAgICAgICAgKiBUaGUgYGltcG9ydFBhdGhgIHByb3BlcnR5IGlzIGFsc28gc2V0IG9uIGVsZW1lbnQgaW5zdGFuY2VzIGFuZCBjYW4gYmUKICAgICAgICAgKiB1c2VkIHRvIGNyZWF0ZSBiaW5kaW5ncyByZWxhdGl2ZSB0byB0aGUgaW1wb3J0IHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgZWxlbWVudHMgZGVmaW5lZCBpbiBFUyBtb2R1bGVzLCB1c2VycyBzaG91bGQgaW1wbGVtZW50CiAgICAgICAgICogYHN0YXRpYyBnZXQgaW1wb3J0TWV0YSgpIHsgcmV0dXJuIGltcG9ydC5tZXRhOyB9YCwgYW5kIHRoZSBkZWZhdWx0CiAgICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYGltcG9ydFBhdGhgIHdpbGwgIHJldHVybiBgaW1wb3J0Lm1ldGEudXJsYCdzIHBhdGguCiAgICAgICAgICogRm9yIGVsZW1lbnRzIGRlZmluZWQgaW4gSFRNTCBpbXBvcnRzLCB0aGlzIGdldHRlciB3aWxsIHJldHVybiB0aGUgcGF0aAogICAgICAgICAqIHRvIHRoZSBkb2N1bWVudCBjb250YWluaW5nIGEgYGRvbS1tb2R1bGVgIGVsZW1lbnQgbWF0Y2hpbmcgdGhpcwogICAgICAgICAqIGVsZW1lbnQncyBzdGF0aWMgYGlzYCBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIE5vdGUsIHRoaXMgcGF0aCBzaG91bGQgY29udGFpbiBhIHRyYWlsaW5nIGAvYC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGltcG9ydCBwYXRoIGZvciB0aGlzIGVsZW1lbnQgY2xhc3MKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfQogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGdldCBpbXBvcnRQYXRoKCkgewogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ19pbXBvcnRQYXRoJywgdGhpcykpKSB7CiAgICAgICAgICAgIGNvbnN0IG1ldGEgPSB0aGlzLmltcG9ydE1ldGE7CiAgICAgICAgICAgIGlmIChtZXRhKSB7CiAgICAgICAgICAgICAgdGhpcy5faW1wb3J0UGF0aCA9IHBhdGhGcm9tVXJsKG1ldGEudXJsKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb25zdCBtb2R1bGUgPSBEb21Nb2R1bGUuaW1wb3J0KC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0gKi8gKHRoaXMpLmlzKTsKICAgICAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoID0gKG1vZHVsZSAmJiBtb2R1bGUuYXNzZXRwYXRoKSB8fAogICAgICAgICAgICAgICAgT2JqZWN0LmdldFByb3RvdHlwZU9mKC8qKiBAdHlwZSB7UG9seW1lckVsZW1lbnRDb25zdHJ1Y3Rvcn0qLyAodGhpcykucHJvdG90eXBlKS5jb25zdHJ1Y3Rvci5pbXBvcnRQYXRoOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpcy5faW1wb3J0UGF0aDsKICAgICAgICB9CgogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgIC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8KICAgICAgICAgIHRoaXMuX3RlbXBsYXRlOwogICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgICB0aGlzLl9pbXBvcnRQYXRoOwogICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgICB0aGlzLnJvb3RQYXRoOwogICAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgICB0aGlzLmltcG9ydFBhdGg7CiAgICAgICAgICAvKiogQHR5cGUge1N0YW1wZWRUZW1wbGF0ZSB8IEhUTUxFbGVtZW50IHwgU2hhZG93Um9vdH0gKi8KICAgICAgICAgIHRoaXMucm9vdDsKICAgICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFFbGVtZW50Pn0gKi8KICAgICAgICAgIHRoaXMuJDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgUHJvcGVydHlBY2Nlc3NvcnNgIHRvIGVuc3VyZSBjbGFzcwogICAgICAgICAqIG1ldGFwcm9ncmFtbWluZyByZWxhdGVkIHRvIHByb3BlcnR5IGFjY2Vzc29ycyBhbmQgZWZmZWN0cyBoYXMKICAgICAgICAgKiBjb21wbGV0ZWQgKGNhbGxzIGBmaW5hbGl6ZWApLgogICAgICAgICAqCiAgICAgICAgICogSXQgYWxzbyBpbml0aWFsaXplcyBhbnkgcHJvcGVydHkgZGVmYXVsdHMgcHJvdmlkZWQgdmlhIGB2YWx1ZWAgaW4KICAgICAgICAgKiBgcHJvcGVydGllc2AgbWV0YWRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzLG1pc3NpbmdQcm9wZXJ0aWVzfSBnby9taXNzaW5nZm5wcm9wcwogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuZmluYWxpemUoKTsKICAgICAgICAgIC8vIG5vdGU6IGZpbmFsaXplIHRlbXBsYXRlIHdoZW4gd2UgaGF2ZSBhY2Nlc3MgdG8gYGxvY2FsTmFtZWAgdG8KICAgICAgICAgIC8vIGF2b2lkIGRlcGVuZGVuY2Ugb24gYGlzYCBmb3IgcG9seWZpbGxpbmcgc3R5bGluZy4KICAgICAgICAgIHRoaXMuY29uc3RydWN0b3IuX2ZpbmFsaXplVGVtcGxhdGUoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovKHRoaXMpLmxvY2FsTmFtZSk7CiAgICAgICAgICBzdXBlci5faW5pdGlhbGl6ZVByb3BlcnRpZXMoKTsKICAgICAgICAgIC8vIHNldCBwYXRoIGRlZmF1bHRzCiAgICAgICAgICB0aGlzLnJvb3RQYXRoID0gcm9vdFBhdGg7CiAgICAgICAgICB0aGlzLmltcG9ydFBhdGggPSB0aGlzLmNvbnN0cnVjdG9yLmltcG9ydFBhdGg7CiAgICAgICAgICAvLyBhcHBseSBwcm9wZXJ0eSBkZWZhdWx0cy4uLgogICAgICAgICAgbGV0IHAkID0gcHJvcGVydHlEZWZhdWx0cyh0aGlzLmNvbnN0cnVjdG9yKTsKICAgICAgICAgIGlmICghcCQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgZm9yIChsZXQgcCBpbiBwJCkgewogICAgICAgICAgICBsZXQgaW5mbyA9IHAkW3BdOwogICAgICAgICAgICBpZiAodGhpcy5fY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQocCkpIHsKICAgICAgICAgICAgICBsZXQgdmFsdWUgPSB0eXBlb2YgaW5mby52YWx1ZSA9PSAnZnVuY3Rpb24nID8KICAgICAgICAgICAgICAgIGluZm8udmFsdWUuY2FsbCh0aGlzKSA6CiAgICAgICAgICAgICAgICBpbmZvLnZhbHVlOwogICAgICAgICAgICAgIC8vIFNldCB2aWEgYF9zZXRQcm9wZXJ0eWAgaWYgdGhlcmUgaXMgYW4gYWNjZXNzb3IsIHRvIGVuYWJsZQogICAgICAgICAgICAgIC8vIGluaXRpYWxpemluZyByZWFkT25seSBwcm9wZXJ0eSBkZWZhdWx0cwogICAgICAgICAgICAgIGlmICh0aGlzLl9oYXNBY2Nlc3NvcihwKSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2V0UGVuZGluZ1Byb3BlcnR5KHAsIHZhbHVlLCB0cnVlKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpc1twXSA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyBpZiBhIHByb3BlcnR5IGRmZWF1bHQgY2FuIGJlIGFwcGxpZWQuIEZvciBleGFtcGxlLCB0aGlzCiAgICAgICAgICogcHJldmVudHMgYSBkZWZhdWx0IGZyb20gYmVpbmcgYXBwbGllZCB3aGVuIGEgcHJvcGVydHkgdGhhdCBoYXMgbm8KICAgICAgICAgKiBhY2Nlc3NvciBpcyBvdmVycmlkZGVuIGJ5IGl0cyBob3N0IGJlZm9yZSB1cGdyYWRlIChlLmcuIHZpYSBhIGJpbmRpbmcpLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvcGVydHkgZGVmYXVsdCBjYW4gYmUgYXBwbGllZC4KICAgICAgICAgKi8KICAgICAgICBfY2FuQXBwbHlQcm9wZXJ0eURlZmF1bHQocHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiAhdGhpcy5oYXNPd25Qcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHYXRoZXIgc3R5bGUgdGV4dCBmb3IgYSBzdHlsZSBlbGVtZW50IGluIHRoZSB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0IFRleHQgY29udGFpbmluZyBzdHlsaW5nIHRvIHByb2Nlc3MKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYmFzZVVSSSBCYXNlIFVSSSB0byByZWJhc2UgQ1NTIHBhdGhzIGFnYWluc3QKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBwcm9jZXNzZWQgQ1NTIHRleHQKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3Byb2Nlc3NTdHlsZVRleHQoY3NzVGV4dCwgYmFzZVVSSSkgewogICAgICAgICAgcmV0dXJuIHJlc29sdmVDc3MoY3NzVGV4dCwgYmFzZVVSSSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAqIENvbmZpZ3VyZXMgYW4gZWxlbWVudCBgcHJvdG9gIHRvIGZ1bmN0aW9uIHdpdGggYSBnaXZlbiBgdGVtcGxhdGVgLgogICAgICAgICogVGhlIGVsZW1lbnQgbmFtZSBgaXNgIGFuZCBleHRlbmRzIGBleHRgIG11c3QgYmUgc3BlY2lmaWVkIGZvciBTaGFkeUNTUwogICAgICAgICogc3R5bGUgc2NvcGluZy4KICAgICAgICAqCiAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gaXMgVGFnIG5hbWUgKG9yIHR5cGUgZXh0ZW5zaW9uIG5hbWUpIGZvciB0aGlzIGVsZW1lbnQKICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICovCiAgICAgICAgc3RhdGljIF9maW5hbGl6ZVRlbXBsYXRlKGlzKSB7CiAgICAgICAgICAvKiogQGNvbnN0IHtIVE1MVGVtcGxhdGVFbGVtZW50fSAqLwogICAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CiAgICAgICAgICBpZiAodGVtcGxhdGUgJiYgIXRlbXBsYXRlLl9fcG9seW1lckZpbmFsaXplZCkgewogICAgICAgICAgICB0ZW1wbGF0ZS5fX3BvbHltZXJGaW5hbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICBjb25zdCBpbXBvcnRQYXRoID0gdGhpcy5pbXBvcnRQYXRoOwogICAgICAgICAgICBjb25zdCBiYXNlVVJJID0gaW1wb3J0UGF0aCA/IHJlc29sdmVVcmwoaW1wb3J0UGF0aCkgOiAnJzsKICAgICAgICAgICAgLy8gZS5nLiBzdXBwb3J0IGBpbmNsdWRlPSJtb2R1bGUtbmFtZSJgLCBhbmQgU2hhZHlDU1MKICAgICAgICAgICAgcHJvY2Vzc0VsZW1lbnRTdHlsZXModGhpcywgdGVtcGxhdGUsIGlzLCBiYXNlVVJJKTsKICAgICAgICAgICAgdGhpcy5wcm90b3R5cGUuX2JpbmRUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBQcm92aWRlcyBhIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHN0YW5kYXJkIEN1c3RvbSBFbGVtZW50cwogICAgICAgICAqIGBjb25uZWN0ZWRDYWxsYmFja2AuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBlbmFibGVzIHRoZSBwcm9wZXJ0eSBlZmZlY3RzIHN5c3RlbSBhbmQKICAgICAgICAgKiBmbHVzaGVzIGFueSBwZW5kaW5nIHByb3BlcnRpZXMsIGFuZCB1cGRhdGVzIHNoaW1tZWQgQ1NTIHByb3BlcnRpZXMKICAgICAgICAgKiB3aGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nL2N1c3RvbSBwcm9wZXJ0aWVzIHBvbHlmaWxsLgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllcywgaW52YWxpZENhc3RzfSBTdXBlciBtYXkgb3IgbWF5IG5vdAogICAgICAgICAqICAgICBpbXBsZW1lbnQgdGhlIGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MgJiYgdGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlRWxlbWVudCgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcykpOwogICAgICAgICAgfQogICAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFN0YW1wcyB0aGUgZWxlbWVudCB0ZW1wbGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGUpIHsKICAgICAgICAgICAgdGhpcy5yb290ID0gdGhpcy5fc3RhbXBUZW1wbGF0ZSh0aGlzLl90ZW1wbGF0ZSk7CiAgICAgICAgICAgIHRoaXMuJCA9IHRoaXMucm9vdC4kOwogICAgICAgICAgfQogICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudHMgYFByb3BlcnR5RWZmZWN0c2AncyBgX3JlYWR5Q2xpZW50c2AgY2FsbC4gQXR0YWNoZXMKICAgICAgICAgKiBlbGVtZW50IGRvbSBieSBjYWxsaW5nIGBfYXR0YWNoRG9tYCB3aXRoIHRoZSBkb20gc3RhbXBlZCBmcm9tIHRoZQogICAgICAgICAqIGVsZW1lbnQncyB0ZW1wbGF0ZSB2aWEgYF9zdGFtcFRlbXBsYXRlYC4gTm90ZSB0aGF0IHRoaXMgYWxsb3dzCiAgICAgICAgICogY2xpZW50IGRvbSB0byBiZSBhdHRhY2hlZCB0byB0aGUgZWxlbWVudCBwcmlvciB0byBhbnkgb2JzZXJ2ZXJzCiAgICAgICAgICogcnVubmluZy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX3JlYWR5Q2xpZW50cygpIHsKICAgICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZSkgewogICAgICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLl9hdHRhY2hEb20oLyoqIEB0eXBlIHtTdGFtcGVkVGVtcGxhdGV9ICovKHRoaXMucm9vdCkpOwogICAgICAgICAgfQogICAgICAgICAgLy8gVGhlIHN1cGVyLl9yZWFkeUNsaWVudHMgaGVyZSBzZXRzIHRoZSBjbGllbnRzIGluaXRpYWxpemVkIGZsYWcuCiAgICAgICAgICAvLyBXZSBtdXN0IHdhaXQgdG8gZG8gdGhpcyB1bnRpbCBhZnRlciBjbGllbnQgZG9tIGlzIGNyZWF0ZWQvYXR0YWNoZWQKICAgICAgICAgIC8vIHNvIHRoYXQgdGhpcyBmbGFnIGNhbiBiZSBjaGVja2VkIHRvIHByZXZlbnQgbm90aWZpY2F0aW9ucyBmaXJlZAogICAgICAgICAgLy8gZHVyaW5nIHRoaXMgcHJvY2VzcyBmcm9tIGJlaW5nIGhhbmRsZWQgYmVmb3JlIGNsaWVudHMgYXJlIHJlYWR5LgogICAgICAgICAgc3VwZXIuX3JlYWR5Q2xpZW50cygpOwogICAgICAgIH0KCgogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIGFuIGVsZW1lbnQncyBzdGFtcGVkIGRvbSB0byBpdHNlbGYuIEJ5IGRlZmF1bHQsCiAgICAgICAgICogdGhpcyBtZXRob2QgY3JlYXRlcyBhIGBzaGFkb3dSb290YCBhbmQgYWRkcyB0aGUgZG9tIHRvIGl0LgogICAgICAgICAqIEhvd2V2ZXIsIHRoaXMgbWV0aG9kIG1heSBiZSBvdmVycmlkZGVuIHRvIGFsbG93IGFuIGVsZW1lbnQKICAgICAgICAgKiB0byBwdXQgaXRzIGRvbSBpbiBhbm90aGVyIGxvY2F0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHRocm93cyB7RXJyb3J9CiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUmV0dXJufQogICAgICAgICAqIEBwYXJhbSB7U3RhbXBlZFRlbXBsYXRlfSBkb20gdG8gYXR0YWNoIHRvIHRoZSBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm4ge1NoYWRvd1Jvb3R9IG5vZGUgdG8gd2hpY2ggdGhlIGRvbSBoYXMgYmVlbiBhdHRhY2hlZC4KICAgICAgICAgKi8KICAgICAgICBfYXR0YWNoRG9tKGRvbSkgewogICAgICAgICAgY29uc3QgbiA9IHdyYXAodGhpcyk7CiAgICAgICAgICBpZiAobi5hdHRhY2hTaGFkb3cpIHsKICAgICAgICAgICAgaWYgKGRvbSkgewogICAgICAgICAgICAgIGlmICghbi5zaGFkb3dSb290KSB7CiAgICAgICAgICAgICAgICBuLmF0dGFjaFNoYWRvdyh7bW9kZTogJ29wZW4nLCBzaGFkeVVwZ3JhZGVGcmFnbWVudDogZG9tfSk7CiAgICAgICAgICAgICAgICBuLnNoYWRvd1Jvb3QuYXBwZW5kQ2hpbGQoZG9tKTsKICAgICAgICAgICAgICAgIC8vIFdoZW4gYGFkb3B0ZWRTdHlsZVNoZWV0c2AgaXMgc3VwcG9ydGVkIGEgc3R5bGVzaGVldCBpcyBtYWRlCiAgICAgICAgICAgICAgICAvLyBhdmFpbGFibGUgb24gdGhlIGVsZW1lbnQgY29uc3RydWN0b3IuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5jb25zdHJ1Y3Rvci5fc3R5bGVTaGVldCkgewogICAgICAgICAgICAgICAgICBuLnNoYWRvd1Jvb3QuYWRvcHRlZFN0eWxlU2hlZXRzID0gW3RoaXMuY29uc3RydWN0b3IuX3N0eWxlU2hlZXRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAoc3luY0luaXRpYWxSZW5kZXIgJiYgd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuU2hhZHlET00uZmx1c2hJbml0aWFsKG4uc2hhZG93Um9vdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBuLnNoYWRvd1Jvb3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NoYWRvd0RPTSBub3QgYXZhaWxhYmxlLiAnICsKICAgICAgICAgICAgICAvLyBUT0RPKHNvcnZlbGwpOiBtb3ZlIHRvIGNvbXBpbGUtdGltZSBjb25kaXRpb25hbCB3aGVuIHN1cHBvcnRlZAogICAgICAgICAgICAnUG9seW1lckVsZW1lbnQgY2FuIGNyZWF0ZSBkb20gYXMgY2hpbGRyZW4gaW5zdGVhZCBvZiBpbiAnICsKICAgICAgICAgICAgJ1NoYWRvd0RPTSBieSBzZXR0aW5nIGB0aGlzLnJvb3QgPSB0aGlzO1xgIGJlZm9yZSBcYHJlYWR5XGAuJyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHVzaW5nIHRoZSBTaGFkeUNTUyBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydHkgc2hpbSwgY2F1c2VzIGFsbAogICAgICAgICAqIHNoaW1tZWQgc3R5bGVzIGluIHRoaXMgZWxlbWVudCAoYW5kIGl0cyBzdWJ0cmVlKSB0byBiZSB1cGRhdGVkCiAgICAgICAgICogYmFzZWQgb24gY3VycmVudCBjdXN0b20gcHJvcGVydHkgdmFsdWVzLgogICAgICAgICAqCiAgICAgICAgICogVGhlIG9wdGlvbmFsIHBhcmFtZXRlciBvdmVycmlkZXMgaW5saW5lIGN1c3RvbSBwcm9wZXJ0eSBzdHlsZXMgd2l0aCBhbgogICAgICAgICAqIG9iamVjdCBvZiBwcm9wZXJ0aWVzIHdoZXJlIHRoZSBrZXlzIGFyZSBDU1MgcHJvcGVydGllcywgYW5kIHRoZSB2YWx1ZXMKICAgICAgICAgKiBhcmUgc3RyaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEV4YW1wbGU6IGB0aGlzLnVwZGF0ZVN0eWxlcyh7Jy0tY29sb3InOiAnYmx1ZSd9KWAKICAgICAgICAgKgogICAgICAgICAqIFRoZXNlIHByb3BlcnRpZXMgYXJlIHJldGFpbmVkIHVubGVzcyBhIHZhbHVlIG9mIGBudWxsYCBpcyBzZXQuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgdXBkYXRpbmcgQ1NTIG1peGlucy4KICAgICAgICAgKiBZb3UgY2FuIG5vdCBkeW5hbWljYWxseSBjaGFuZ2UgdGhlIHZhbHVlIG9mIGFuIGBAYXBwbHlgLgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzIEJhZyBvZiBjdXN0b20gcHJvcGVydHkga2V5L3ZhbHVlcyB0bwogICAgICAgICAqICAgYXBwbHkgdG8gdGhpcyBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU3R5bGVzKHByb3BlcnRpZXMpIHsKICAgICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MpIHsKICAgICAgICAgICAgd2luZG93LlNoYWR5Q1NTLnN0eWxlU3VidHJlZSgvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcyksIHByb3BlcnRpZXMpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV3cml0ZXMgYSBnaXZlbiBVUkwgcmVsYXRpdmUgdG8gYSBiYXNlIFVSTC4gVGhlIGJhc2UgVVJMIGRlZmF1bHRzIHRvCiAgICAgICAgICogdGhlIG9yaWdpbmFsIGxvY2F0aW9uIG9mIHRoZSBkb2N1bWVudCBjb250YWluaW5nIHRoZSBgZG9tLW1vZHVsZWAgZm9yCiAgICAgICAgICogdGhpcyBlbGVtZW50LiBUaGlzIG1ldGhvZCB3aWxsIHJldHVybiB0aGUgc2FtZSBVUkwgYmVmb3JlIGFuZCBhZnRlcgogICAgICAgICAqIGJ1bmRsaW5nLgogICAgICAgICAqCiAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgbm8gcmVzb2x1dGlvbiBmb3IgVVJMcyB0aGF0IHN0YXJ0CiAgICAgICAgICogd2l0aCBgL2AgKGFic29sdXRlIFVSTHMpIG9yIGAjYCAoaGFzaCBpZGVudGlmaWVycykuICBGb3IgZ2VuZXJhbCBwdXJwb3NlCiAgICAgICAgICogVVJMIHJlc29sdXRpb24sIHVzZSBgd2luZG93LlVSTGAuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsIFVSTCB0byByZXNvbHZlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gYmFzZSBPcHRpb25hbCBiYXNlIFVSTCB0byByZXNvbHZlIGFnYWluc3QsIGRlZmF1bHRzCiAgICAgICAgICogdG8gdGhlIGVsZW1lbnQncyBgaW1wb3J0UGF0aGAKICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFJld3JpdHRlbiBVUkwgcmVsYXRpdmUgdG8gYmFzZQogICAgICAgICAqLwogICAgICAgIHJlc29sdmVVcmwodXJsLCBiYXNlKSB7CiAgICAgICAgICBpZiAoIWJhc2UgJiYgdGhpcy5pbXBvcnRQYXRoKSB7CiAgICAgICAgICAgIGJhc2UgPSByZXNvbHZlVXJsKHRoaXMuaW1wb3J0UGF0aCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzb2x2ZVVybCh1cmwsIGJhc2UpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUVmZmVjdHNgIHRvIGFkZCBtYXAgb2YgZHluYW1pYyBmdW5jdGlvbnMgb24KICAgICAgICAgKiB0ZW1wbGF0ZSBpbmZvLCBmb3IgY29uc3VtcHRpb24gYnkgYFByb3BlcnR5RWZmZWN0c2AgdGVtcGxhdGUgYmluZGluZwogICAgICAgICAqIGNvZGUuIFRoaXMgbWFwIGRldGVybWluZXMgd2hpY2ggbWV0aG9kIHRlbXBsYXRlcyBzaG91bGQgaGF2ZSBhY2Nlc3NvcnMKICAgICAgICAgKiBjcmVhdGVkIGZvciB0aGVtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUKICAgICAgICAgKiBAcGFyYW0geyFUZW1wbGF0ZUluZm99IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSBmb3IgY3VycmVudCB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7IU5vZGVJbmZvfSBub2RlSW5mbyBOb2RlIG1ldGFkYXRhIGZvciBjdXJyZW50IHRlbXBsYXRlLgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IC4KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcGFyc2VUZW1wbGF0ZUNvbnRlbnQodGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pIHsKICAgICAgICAgIHRlbXBsYXRlSW5mby5keW5hbWljRm5zID0gdGVtcGxhdGVJbmZvLmR5bmFtaWNGbnMgfHwgdGhpcy5fcHJvcGVydGllczsKICAgICAgICAgIC8vIFRPRE8oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8zMjQwKToKICAgICAgICAgIC8vICAgICBDaGFuZ2UgYmFjayB0byBqdXN0IHN1cGVyLm1ldGhvZENhbGwoKQogICAgICAgICAgcmV0dXJuIHBvbHltZXJFbGVtZW50QmFzZS5fcGFyc2VUZW1wbGF0ZUNvbnRlbnQuY2FsbCgKICAgICAgICAgICAgdGhpcywgdGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgbm9kZUluZm8pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVzIGBQcm9wZXJ0eUVmZmVjdHNgIHRvIHdhcm4gb24gdXNlIG9mIHVuZGVjbGFyZWQgcHJvcGVydGllcyBpbgogICAgICAgICAqIHRlbXBsYXRlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHRlbXBsYXRlSW5mbyBUZW1wbGF0ZSBtZXRhZGF0YSB0byBhZGQgZWZmZWN0IHRvCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgUHJvcGVydHkgdGhhdCBzaG91bGQgdHJpZ2dlciB0aGUgZWZmZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBlZmZlY3QgRWZmZWN0IG1ldGFkYXRhIG9iamVjdAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IEludGVyZmFjZXMgaW4gY2xvc3VyZSBkbyBub3QgaW5oZXJpdCBzdGF0aWNzLCBidXQgY2xhc3NlcyBkbwogICAgICAgICAqIEBub2NvbGxhcHNlCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0KHRlbXBsYXRlSW5mbywgcHJvcCwgZWZmZWN0KSB7CiAgICAgICAgICAvLyBXYXJuIGlmIHByb3BlcnRpZXMgYXJlIHVzZWQgaW4gdGVtcGxhdGUgd2l0aG91dCBiZWluZyBkZWNsYXJlZC4KICAgICAgICAgIC8vIFByb3BlcnRpZXMgbXVzdCBiZSBsaXN0ZWQgaW4gYHByb3BlcnRpZXNgIHRvIGJlIGluY2x1ZGVkIGluCiAgICAgICAgICAvLyBgb2JzZXJ2ZWRBdHRyaWJ1dGVzYCBzaW5jZSBDRSBWMSByZWFkcyB0aGF0IGF0IHJlZ2lzdHJhdGlvbiB0aW1lLCBhbmQKICAgICAgICAgIC8vIHNpbmNlIHdlIHdhbnQgdG8ga2VlcCB0ZW1wbGF0ZSBwYXJzaW5nIGxhenksIHdlIGNhbid0IGF1dG9tYXRpY2FsbHkKICAgICAgICAgIC8vIGFkZCB1bmRlY2xhcmVkIHByb3BlcnRpZXMgdXNlZCBpbiB0ZW1wbGF0ZXMgdG8gYG9ic2VydmVkQXR0cmlidXRlc2AuCiAgICAgICAgICAvLyBUaGUgd2FybmluZyBpcyBvbmx5IGVuYWJsZWQgaW4gYGxlZ2FjeU9wdGltaXphdGlvbnNgIG1vZGUsIHNpbmNlCiAgICAgICAgICAvLyB3ZSBkb24ndCB3YW50IHRvIHNwYW0gZXhpc3RpbmcgdXNlcnMgd2hvIG1pZ2h0IGhhdmUgYWRvcHRlZCB0aGUKICAgICAgICAgIC8vIHNob3J0aGFuZCB3aGVuIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24gaXMgbm90IGltcG9ydGFudC4KICAgICAgICAgIGlmIChsZWdhY3lXYXJuaW5ncyAmJiAhKHByb3AgaW4gdGhpcy5fcHJvcGVydGllcykgJiYKICAgICAgICAgICAgICAvLyBNZXRob2RzIHVzZWQgaW4gdGVtcGxhdGVzIHdpdGggbm8gZGVwZW5kZW5jaWVzIChvciBvbmx5IGxpdGVyYWwKICAgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMpIGJlY29tZSBhY2Nlc3NvcnMgd2l0aCB0ZW1wbGF0ZSBlZmZlY3RzOyBpZ25vcmUgdGhlc2UKICAgICAgICAgICAgICAhKGVmZmVjdC5pbmZvLnBhcnQuc2lnbmF0dXJlICYmIGVmZmVjdC5pbmZvLnBhcnQuc2lnbmF0dXJlLnN0YXRpYykgJiYKICAgICAgICAgICAgICAvLyBXYXJuaW5ncyBmb3IgYmluZGluZ3MgYWRkZWQgdG8gbmVzdGVkIHRlbXBsYXRlcyBhcmUgaGFuZGxlZCBieQogICAgICAgICAgICAgIC8vIHRlbXBsYXRpemVyIHNvIGlnbm9yZSBib3RoIHRoZSBob3N0LXRvLXRlbXBsYXRlIGJpbmRpbmdzCiAgICAgICAgICAgICAgLy8gKGBob3N0UHJvcGApIGFuZCBUZW1wbGF0ZUluc3RhbmNlLXRvLWNoaWxkIGJpbmRpbmdzCiAgICAgICAgICAgICAgLy8gKGBuZXN0ZWRUZW1wbGF0ZWApCiAgICAgICAgICAgICAgIWVmZmVjdC5pbmZvLnBhcnQuaG9zdFByb3AgJiYgIXRlbXBsYXRlSW5mby5uZXN0ZWRUZW1wbGF0ZSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oYFByb3BlcnR5ICcke3Byb3B9JyB1c2VkIGluIHRlbXBsYXRlIGJ1dCBub3QgZGVjbGFyZWQgaW4gJ3Byb3BlcnRpZXMnOyBgICsKICAgICAgICAgICAgICBgYXR0cmlidXRlIHdpbGwgbm90IGJlIG9ic2VydmVkLmApOwogICAgICAgICAgfQogICAgICAgICAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzMyNDApOgogICAgICAgICAgLy8gICAgIENoYW5nZSBiYWNrIHRvIGp1c3Qgc3VwZXIubWV0aG9kQ2FsbCgpCiAgICAgICAgICByZXR1cm4gcG9seW1lckVsZW1lbnRCYXNlLl9hZGRUZW1wbGF0ZVByb3BlcnR5RWZmZWN0LmNhbGwoCiAgICAgICAgICAgIHRoaXMsIHRlbXBsYXRlSW5mbywgcHJvcCwgZWZmZWN0KTsKICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gUG9seW1lckVsZW1lbnQ7CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQ2xhc3MgcmVwcmVzZW50aW5nIGEgc3RhdGljIHN0cmluZyB2YWx1ZSB3aGljaCBjYW4gYmUgdXNlZCB0byBmaWx0ZXIKICAgICAqIHN0cmluZ3MgYnkgYXNzZXRpbmcgdGhhdCB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIHZpYSB0aGlzIGNsYXNzLiBUaGUKICAgICAqIGB2YWx1ZWAgcHJvcGVydHkgcmV0dXJucyB0aGUgc3RyaW5nIHBhc3NlZCB0byB0aGUgY29uc3RydWN0b3IuCiAgICAgKi8KICAgIGNsYXNzIExpdGVyYWxTdHJpbmcgewogICAgICBjb25zdHJ1Y3RvcihzdHJpbmcpIHsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzLnZhbHVlID0gc3RyaW5nLnRvU3RyaW5nKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTGl0ZXJhbFN0cmluZyBzdHJpbmcgdmFsdWUKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICB0b1N0cmluZygpIHsKICAgICAgICByZXR1cm4gdGhpcy52YWx1ZTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBPYmplY3QgdG8gc3RyaW5naWZ5IGludG8gSFRNTAogICAgICogQHJldHVybiB7c3RyaW5nfSBIVE1MIHN0cmluZ2lmaWVkIGZvcm0gb2YgYG9iamAKICAgICAqLwogICAgZnVuY3Rpb24gbGl0ZXJhbFZhbHVlKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExpdGVyYWxTdHJpbmcpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshTGl0ZXJhbFN0cmluZ30gKi8odmFsdWUpLnZhbHVlOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgYG5vbi1saXRlcmFsIHZhbHVlIHBhc3NlZCB0byBQb2x5bWVyJ3MgaHRtbExpdGVyYWwgZnVuY3Rpb246ICR7dmFsdWV9YAogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgT2JqZWN0IHRvIHN0cmluZ2lmeSBpbnRvIEhUTUwKICAgICAqIEByZXR1cm4ge3N0cmluZ30gSFRNTCBzdHJpbmdpZmllZCBmb3JtIG9mIGBvYmpgCiAgICAgKi8KICAgIGZ1bmN0aW9uIGh0bWxWYWx1ZSh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBIVE1MVGVtcGxhdGVFbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnQgfSAqLyh2YWx1ZSkuaW5uZXJIVE1MOwogICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGl0ZXJhbFN0cmluZykgewogICAgICAgIHJldHVybiBsaXRlcmFsVmFsdWUodmFsdWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHRocm93IG5ldyBFcnJvcigKICAgICAgICAgICAgYG5vbi10ZW1wbGF0ZSB2YWx1ZSBwYXNzZWQgdG8gUG9seW1lcidzIGh0bWwgZnVuY3Rpb246ICR7dmFsdWV9YCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEEgdGVtcGxhdGUgbGl0ZXJhbCB0YWcgdGhhdCBjcmVhdGVzIGFuIEhUTUwgPHRlbXBsYXRlPiBlbGVtZW50IGZyb20gdGhlCiAgICAgKiBjb250ZW50cyBvZiB0aGUgc3RyaW5nLgogICAgICoKICAgICAqIFRoaXMgYWxsb3dzIHlvdSB0byB3cml0ZSBhIFBvbHltZXIgVGVtcGxhdGUgaW4gSmF2YVNjcmlwdC4KICAgICAqCiAgICAgKiBUZW1wbGF0ZXMgY2FuIGJlIGNvbXBvc2VkIGJ5IGludGVycG9sYXRpbmcgYEhUTUxUZW1wbGF0ZUVsZW1lbnRgcyBpbgogICAgICogZXhwcmVzc2lvbnMgaW4gdGhlIEphdmFTY3JpcHQgdGVtcGxhdGUgbGl0ZXJhbC4gVGhlIG5lc3RlZCB0ZW1wbGF0ZSdzCiAgICAgKiBgaW5uZXJIVE1MYCBpcyBpbmNsdWRlZCBpbiB0aGUgY29udGFpbmluZyB0ZW1wbGF0ZS4gIFRoZSBvbmx5IG90aGVyCiAgICAgKiB2YWx1ZXMgYWxsb3dlZCBpbiBleHByZXNzaW9ucyBhcmUgdGhvc2UgcmV0dXJuZWQgZnJvbSBgaHRtbExpdGVyYWxgCiAgICAgKiB3aGljaCBlbnN1cmVzIG9ubHkgbGl0ZXJhbCB2YWx1ZXMgZnJvbSBKUyBzb3VyY2UgZXZlciByZWFjaCB0aGUgSFRNTCwgdG8KICAgICAqIGd1YXJkIGFnYWluc3QgWFNTIHJpc2tzLgogICAgICoKICAgICAqIEFsbCBvdGhlciB2YWx1ZXMgYXJlIGRpc2FsbG93ZWQgaW4gZXhwcmVzc2lvbnMgdG8gaGVscCBwcmV2ZW50IFhTUwogICAgICogYXR0YWNrczsgaG93ZXZlciwgYGh0bWxMaXRlcmFsYCBjYW4gYmUgdXNlZCB0byBjb21wb3NlIHN0YXRpYwogICAgICogc3RyaW5nIHZhbHVlcyBpbnRvIHRlbXBsYXRlcy4gVGhpcyBpcyB1c2VmdWwgdG8gY29tcG9zZSBzdHJpbmdzIGludG8KICAgICAqIHBsYWNlcyB0aGF0IGRvIG5vdCBhY2NlcHQgaHRtbCwgbGlrZSB0aGUgY3NzIHRleHQgb2YgYSBgc3R5bGVgCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgICByZXR1cm4gaHRtbGAKICAgICAqICAgICAgICAgPHN0eWxlPjpob3N0eyBjb250ZW50OiIuLi4iIH08L3N0eWxlPgogICAgICogICAgICAgICA8ZGl2IGNsYXNzPSJzaGFkb3dlZCI+JHt0aGlzLnBhcnRpYWxUZW1wbGF0ZX08L2Rpdj4KICAgICAqICAgICAgICAgJHtzdXBlci50ZW1wbGF0ZX0KICAgICAqICAgICAgIGA7CiAgICAgKiAgICAgfQogICAgICogICAgIHN0YXRpYyBnZXQgcGFydGlhbFRlbXBsYXRlKCkgeyByZXR1cm4gaHRtbGA8c3Bhbj5QYXJ0aWFsITwvc3Bhbj5gOyB9CiAgICAgKgogICAgICogQHBhcmFtIHshSVRlbXBsYXRlQXJyYXl9IHN0cmluZ3MgQ29uc3RhbnQgcGFydHMgb2YgdGFnZ2VkIHRlbXBsYXRlIGxpdGVyYWwKICAgICAqIEBwYXJhbSB7Li4uKn0gdmFsdWVzIFZhcmlhYmxlIHBhcnRzIG9mIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFsCiAgICAgKiBAcmV0dXJuIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gQ29uc3RydWN0ZWQgSFRNTFRlbXBsYXRlRWxlbWVudAogICAgICovCiAgICBjb25zdCBodG1sID0gZnVuY3Rpb24gaHRtbChzdHJpbmdzLCAuLi52YWx1ZXMpIHsKICAgICAgY29uc3QgdGVtcGxhdGUgPSAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyhkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpKTsKICAgICAgdGVtcGxhdGUuaW5uZXJIVE1MID0gdmFsdWVzLnJlZHVjZSgoYWNjLCB2LCBpZHgpID0+CiAgICAgICAgICBhY2MgKyBodG1sVmFsdWUodikgKyBzdHJpbmdzW2lkeCArIDFdLCBzdHJpbmdzWzBdKTsKICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQmFzZSBjbGFzcyB0aGF0IHByb3ZpZGVzIHRoZSBjb3JlIEFQSSBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcKICAgICAqIGZlYXR1cmVzIGluY2x1ZGluZyB0ZW1wbGF0ZSBzdGFtcGluZywgZGF0YS1iaW5kaW5nLCBhdHRyaWJ1dGUgZGVzZXJpYWxpemF0aW9uLAogICAgICogYW5kIHByb3BlcnR5IGNoYW5nZSBvYnNlcnZhdGlvbi4KICAgICAqCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQHBvbHltZXIKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICogQGV4dGVuZHMgSFRNTEVsZW1lbnQKICAgICAqIEBhcHBsaWVzTWl4aW4gRWxlbWVudE1peGluCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBiYXNlIGNsYXNzIHRoYXQgcHJvdmlkZXMgdGhlIGNvcmUgQVBJIGZvciBQb2x5bWVyJ3MKICAgICAqICAga2V5IG1ldGEtcHJvZ3JhbW1pbmcgZmVhdHVyZXMgaW5jbHVkaW5nIHRlbXBsYXRlIHN0YW1waW5nLCBkYXRhLWJpbmRpbmcsCiAgICAgKiAgIGF0dHJpYnV0ZSBkZXNlcmlhbGl6YXRpb24sIGFuZCBwcm9wZXJ0eSBjaGFuZ2Ugb2JzZXJ2YXRpb24KICAgICAqLwogICAgY29uc3QgUG9seW1lckVsZW1lbnQgPSBFbGVtZW50TWl4aW4oSFRNTEVsZW1lbnQpOwoKICAgIHZhciBjb21tb25qc0dsb2JhbCA9IHR5cGVvZiBnbG9iYWxUaGlzICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbFRoaXMgOiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHR5cGVvZiBnbG9iYWwgIT09ICd1bmRlZmluZWQnID8gZ2xvYmFsIDogdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnID8gc2VsZiA6IHt9OwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZuLCBiYXNlZGlyLCBtb2R1bGUpIHsKICAgIAlyZXR1cm4gbW9kdWxlID0gewogICAgCSAgcGF0aDogYmFzZWRpciwKICAgIAkgIGV4cG9ydHM6IHt9LAogICAgCSAgcmVxdWlyZTogZnVuY3Rpb24gKHBhdGgsIGJhc2UpIHsKICAgICAgICAgIHJldHVybiBjb21tb25qc1JlcXVpcmUocGF0aCwgKGJhc2UgPT09IHVuZGVmaW5lZCB8fCBiYXNlID09PSBudWxsKSA/IG1vZHVsZS5wYXRoIDogYmFzZSk7CiAgICAgICAgfQogICAgCX0sIGZuKG1vZHVsZSwgbW9kdWxlLmV4cG9ydHMpLCBtb2R1bGUuZXhwb3J0czsKICAgIH0KCiAgICBmdW5jdGlvbiBjb21tb25qc1JlcXVpcmUgKCkgewogICAgCXRocm93IG5ldyBFcnJvcignRHluYW1pYyByZXF1aXJlcyBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgYnkgQHJvbGx1cC9wbHVnaW4tY29tbW9uanMnKTsKICAgIH0KCiAgICB2YXIgbG9kYXNoID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgKGZ1bmN0aW9uKCkgewoKICAgICAgLyoqIFVzZWQgYXMgYSBzYWZlIHJlZmVyZW5jZSBmb3IgYHVuZGVmaW5lZGAgaW4gcHJlLUVTNSBlbnZpcm9ubWVudHMuICovCiAgICAgIHZhciB1bmRlZmluZWQkMTsKCiAgICAgIC8qKiBVc2VkIGFzIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci4gKi8KICAgICAgdmFyIFZFUlNJT04gPSAnNC4xNy4xOSc7CgogICAgICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi8KICAgICAgdmFyIExBUkdFX0FSUkFZX1NJWkUgPSAyMDA7CgogICAgICAvKiogRXJyb3IgbWVzc2FnZSBjb25zdGFudHMuICovCiAgICAgIHZhciBDT1JFX0VSUk9SX1RFWFQgPSAnVW5zdXBwb3J0ZWQgY29yZS1qcyB1c2UuIFRyeSBodHRwczovL25wbXMuaW8vc2VhcmNoP3E9cG9ueWZpbGwuJywKICAgICAgICAgIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJzsKCiAgICAgIC8qKiBVc2VkIHRvIHN0YW5kLWluIGZvciBgdW5kZWZpbmVkYCBoYXNoIHZhbHVlcy4gKi8KICAgICAgdmFyIEhBU0hfVU5ERUZJTkVEID0gJ19fbG9kYXNoX2hhc2hfdW5kZWZpbmVkX18nOwoKICAgICAgLyoqIFVzZWQgYXMgdGhlIG1heGltdW0gbWVtb2l6ZSBjYWNoZSBzaXplLiAqLwogICAgICB2YXIgTUFYX01FTU9JWkVfU0laRSA9IDUwMDsKCiAgICAgIC8qKiBVc2VkIGFzIHRoZSBpbnRlcm5hbCBhcmd1bWVudCBwbGFjZWhvbGRlci4gKi8KICAgICAgdmFyIFBMQUNFSE9MREVSID0gJ19fbG9kYXNoX3BsYWNlaG9sZGVyX18nOwoKICAgICAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi8KICAgICAgdmFyIENMT05FX0RFRVBfRkxBRyA9IDEsCiAgICAgICAgICBDTE9ORV9GTEFUX0ZMQUcgPSAyLAogICAgICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDsKCiAgICAgIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqLwogICAgICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgPSAxLAogICAgICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7CgogICAgICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBmdW5jdGlvbiBtZXRhZGF0YS4gKi8KICAgICAgdmFyIFdSQVBfQklORF9GTEFHID0gMSwKICAgICAgICAgIFdSQVBfQklORF9LRVlfRkxBRyA9IDIsCiAgICAgICAgICBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcgPSA0LAogICAgICAgICAgV1JBUF9DVVJSWV9GTEFHID0gOCwKICAgICAgICAgIFdSQVBfQ1VSUllfUklHSFRfRkxBRyA9IDE2LAogICAgICAgICAgV1JBUF9QQVJUSUFMX0ZMQUcgPSAzMiwKICAgICAgICAgIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHID0gNjQsCiAgICAgICAgICBXUkFQX0FSWV9GTEFHID0gMTI4LAogICAgICAgICAgV1JBUF9SRUFSR19GTEFHID0gMjU2LAogICAgICAgICAgV1JBUF9GTElQX0ZMQUcgPSA1MTI7CgogICAgICAvKiogVXNlZCBhcyBkZWZhdWx0IG9wdGlvbnMgZm9yIGBfLnRydW5jYXRlYC4gKi8KICAgICAgdmFyIERFRkFVTFRfVFJVTkNfTEVOR1RIID0gMzAsCiAgICAgICAgICBERUZBVUxUX1RSVU5DX09NSVNTSU9OID0gJy4uLic7CgogICAgICAvKiogVXNlZCB0byBkZXRlY3QgaG90IGZ1bmN0aW9ucyBieSBudW1iZXIgb2YgY2FsbHMgd2l0aGluIGEgc3BhbiBvZiBtaWxsaXNlY29uZHMuICovCiAgICAgIHZhciBIT1RfQ09VTlQgPSA4MDAsCiAgICAgICAgICBIT1RfU1BBTiA9IDE2OwoKICAgICAgLyoqIFVzZWQgdG8gaW5kaWNhdGUgdGhlIHR5cGUgb2YgbGF6eSBpdGVyYXRlZXMuICovCiAgICAgIHZhciBMQVpZX0ZJTFRFUl9GTEFHID0gMSwKICAgICAgICAgIExBWllfTUFQX0ZMQUcgPSAyLAogICAgICAgICAgTEFaWV9XSElMRV9GTEFHID0gMzsKCiAgICAgIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqLwogICAgICB2YXIgSU5GSU5JVFkgPSAxIC8gMCwKICAgICAgICAgIE1BWF9TQUZFX0lOVEVHRVIgPSA5MDA3MTk5MjU0NzQwOTkxLAogICAgICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOCwKICAgICAgICAgIE5BTiA9IDAgLyAwOwoKICAgICAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdGhlIG1heGltdW0gbGVuZ3RoIGFuZCBpbmRleCBvZiBhbiBhcnJheS4gKi8KICAgICAgdmFyIE1BWF9BUlJBWV9MRU5HVEggPSA0Mjk0OTY3Mjk1LAogICAgICAgICAgTUFYX0FSUkFZX0lOREVYID0gTUFYX0FSUkFZX0xFTkdUSCAtIDEsCiAgICAgICAgICBIQUxGX01BWF9BUlJBWV9MRU5HVEggPSBNQVhfQVJSQVlfTEVOR1RIID4+PiAxOwoKICAgICAgLyoqIFVzZWQgdG8gYXNzb2NpYXRlIHdyYXAgbWV0aG9kcyB3aXRoIHRoZWlyIGJpdCBmbGFncy4gKi8KICAgICAgdmFyIHdyYXBGbGFncyA9IFsKICAgICAgICBbJ2FyeScsIFdSQVBfQVJZX0ZMQUddLAogICAgICAgIFsnYmluZCcsIFdSQVBfQklORF9GTEFHXSwKICAgICAgICBbJ2JpbmRLZXknLCBXUkFQX0JJTkRfS0VZX0ZMQUddLAogICAgICAgIFsnY3VycnknLCBXUkFQX0NVUlJZX0ZMQUddLAogICAgICAgIFsnY3VycnlSaWdodCcsIFdSQVBfQ1VSUllfUklHSFRfRkxBR10sCiAgICAgICAgWydmbGlwJywgV1JBUF9GTElQX0ZMQUddLAogICAgICAgIFsncGFydGlhbCcsIFdSQVBfUEFSVElBTF9GTEFHXSwKICAgICAgICBbJ3BhcnRpYWxSaWdodCcsIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHXSwKICAgICAgICBbJ3JlYXJnJywgV1JBUF9SRUFSR19GTEFHXQogICAgICBdOwoKICAgICAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqLwogICAgICB2YXIgYXJnc1RhZyA9ICdbb2JqZWN0IEFyZ3VtZW50c10nLAogICAgICAgICAgYXJyYXlUYWcgPSAnW29iamVjdCBBcnJheV0nLAogICAgICAgICAgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsCiAgICAgICAgICBib29sVGFnID0gJ1tvYmplY3QgQm9vbGVhbl0nLAogICAgICAgICAgZGF0ZVRhZyA9ICdbb2JqZWN0IERhdGVdJywKICAgICAgICAgIGRvbUV4Y1RhZyA9ICdbb2JqZWN0IERPTUV4Y2VwdGlvbl0nLAogICAgICAgICAgZXJyb3JUYWcgPSAnW29iamVjdCBFcnJvcl0nLAogICAgICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsCiAgICAgICAgICBnZW5UYWcgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLAogICAgICAgICAgbWFwVGFnID0gJ1tvYmplY3QgTWFwXScsCiAgICAgICAgICBudW1iZXJUYWcgPSAnW29iamVjdCBOdW1iZXJdJywKICAgICAgICAgIG51bGxUYWcgPSAnW29iamVjdCBOdWxsXScsCiAgICAgICAgICBvYmplY3RUYWcgPSAnW29iamVjdCBPYmplY3RdJywKICAgICAgICAgIHByb21pc2VUYWcgPSAnW29iamVjdCBQcm9taXNlXScsCiAgICAgICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XScsCiAgICAgICAgICByZWdleHBUYWcgPSAnW29iamVjdCBSZWdFeHBdJywKICAgICAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLAogICAgICAgICAgc3RyaW5nVGFnID0gJ1tvYmplY3QgU3RyaW5nXScsCiAgICAgICAgICBzeW1ib2xUYWcgPSAnW29iamVjdCBTeW1ib2xdJywKICAgICAgICAgIHVuZGVmaW5lZFRhZyA9ICdbb2JqZWN0IFVuZGVmaW5lZF0nLAogICAgICAgICAgd2Vha01hcFRhZyA9ICdbb2JqZWN0IFdlYWtNYXBdJywKICAgICAgICAgIHdlYWtTZXRUYWcgPSAnW29iamVjdCBXZWFrU2V0XSc7CgogICAgICB2YXIgYXJyYXlCdWZmZXJUYWcgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLAogICAgICAgICAgZGF0YVZpZXdUYWcgPSAnW29iamVjdCBEYXRhVmlld10nLAogICAgICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLAogICAgICAgICAgZmxvYXQ2NFRhZyA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLAogICAgICAgICAgaW50OFRhZyA9ICdbb2JqZWN0IEludDhBcnJheV0nLAogICAgICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsCiAgICAgICAgICBpbnQzMlRhZyA9ICdbb2JqZWN0IEludDMyQXJyYXldJywKICAgICAgICAgIHVpbnQ4VGFnID0gJ1tvYmplY3QgVWludDhBcnJheV0nLAogICAgICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKICAgICAgICAgIHVpbnQxNlRhZyA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsCiAgICAgICAgICB1aW50MzJUYWcgPSAnW29iamVjdCBVaW50MzJBcnJheV0nOwoKICAgICAgLyoqIFVzZWQgdG8gbWF0Y2ggZW1wdHkgc3RyaW5nIGxpdGVyYWxzIGluIGNvbXBpbGVkIHRlbXBsYXRlIHNvdXJjZS4gKi8KICAgICAgdmFyIHJlRW1wdHlTdHJpbmdMZWFkaW5nID0gL1xiX19wIFwrPSAnJzsvZywKICAgICAgICAgIHJlRW1wdHlTdHJpbmdNaWRkbGUgPSAvXGIoX19wIFwrPSkgJycgXCsvZywKICAgICAgICAgIHJlRW1wdHlTdHJpbmdUcmFpbGluZyA9IC8oX19lXCguKj9cKXxcYl9fdFwpKSBcK1xuJyc7L2c7CgogICAgICAvKiogVXNlZCB0byBtYXRjaCBIVE1MIGVudGl0aWVzIGFuZCBIVE1MIGNoYXJhY3RlcnMuICovCiAgICAgIHZhciByZUVzY2FwZWRIdG1sID0gLyYoPzphbXB8bHR8Z3R8cXVvdHwjMzkpOy9nLAogICAgICAgICAgcmVVbmVzY2FwZWRIdG1sID0gL1smPD4iJ10vZywKICAgICAgICAgIHJlSGFzRXNjYXBlZEh0bWwgPSBSZWdFeHAocmVFc2NhcGVkSHRtbC5zb3VyY2UpLAogICAgICAgICAgcmVIYXNVbmVzY2FwZWRIdG1sID0gUmVnRXhwKHJlVW5lc2NhcGVkSHRtbC5zb3VyY2UpOwoKICAgICAgLyoqIFVzZWQgdG8gbWF0Y2ggdGVtcGxhdGUgZGVsaW1pdGVycy4gKi8KICAgICAgdmFyIHJlRXNjYXBlID0gLzwlLShbXHNcU10rPyklPi9nLAogICAgICAgICAgcmVFdmFsdWF0ZSA9IC88JShbXHNcU10rPyklPi9nLAogICAgICAgICAgcmVJbnRlcnBvbGF0ZSA9IC88JT0oW1xzXFNdKz8pJT4vZzsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi8KICAgICAgdmFyIHJlSXNEZWVwUHJvcCA9IC9cLnxcWyg/OlteW1xdXSp8KFsiJ10pKD86KD8hXDEpW15cXF18XFwuKSo/XDEpXF0vLAogICAgICAgICAgcmVJc1BsYWluUHJvcCA9IC9eXHcqJC8sCiAgICAgICAgICByZVByb3BOYW1lID0gL1teLltcXV0rfFxbKD86KC0/XGQrKD86XC5cZCspPyl8KFsiJ10pKCg/Oig/IVwyKVteXFxdfFxcLikqPylcMilcXXwoPz0oPzpcLnxcW1xdKSg/OlwufFxbXF18JCkpL2c7CgogICAgICAvKioKICAgICAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYAogICAgICAgKiBbc3ludGF4IGNoYXJhY3RlcnNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXBhdHRlcm5zKS4KICAgICAgICovCiAgICAgIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXiQuKis/KClbXF17fXxdL2csCiAgICAgICAgICByZUhhc1JlZ0V4cENoYXIgPSBSZWdFeHAocmVSZWdFeHBDaGFyLnNvdXJjZSk7CgogICAgICAvKiogVXNlZCB0byBtYXRjaCBsZWFkaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLiAqLwogICAgICB2YXIgcmVUcmltID0gL15ccyt8XHMrJC9nLAogICAgICAgICAgcmVUcmltU3RhcnQgPSAvXlxzKy8sCiAgICAgICAgICByZVRyaW1FbmQgPSAvXHMrJC87CgogICAgICAvKiogVXNlZCB0byBtYXRjaCB3cmFwIGRldGFpbCBjb21tZW50cy4gKi8KICAgICAgdmFyIHJlV3JhcENvbW1lbnQgPSAvXHsoPzpcblwvXCogXFt3cmFwcGVkIHdpdGggLitcXSBcKlwvKT9cbj8vLAogICAgICAgICAgcmVXcmFwRGV0YWlscyA9IC9ce1xuXC9cKiBcW3dyYXBwZWQgd2l0aCAoLispXF0gXCovLAogICAgICAgICAgcmVTcGxpdERldGFpbHMgPSAvLD8gJiAvOwoKICAgICAgLyoqIFVzZWQgdG8gbWF0Y2ggd29yZHMgY29tcG9zZWQgb2YgYWxwaGFudW1lcmljIGNoYXJhY3RlcnMuICovCiAgICAgIHZhciByZUFzY2lpV29yZCA9IC9bXlx4MDAtXHgyZlx4M2EtXHg0MFx4NWItXHg2MFx4N2ItXHg3Zl0rL2c7CgogICAgICAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi8KICAgICAgdmFyIHJlRXNjYXBlQ2hhciA9IC9cXChcXCk/L2c7CgogICAgICAvKioKICAgICAgICogVXNlZCB0byBtYXRjaAogICAgICAgKiBbRVMgdGVtcGxhdGUgZGVsaW1pdGVyc10oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdGVtcGxhdGUtbGl0ZXJhbC1sZXhpY2FsLWNvbXBvbmVudHMpLgogICAgICAgKi8KICAgICAgdmFyIHJlRXNUZW1wbGF0ZSA9IC9cJFx7KFteXFx9XSooPzpcXC5bXlxcfV0qKSopXH0vZzsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqLwogICAgICB2YXIgcmVGbGFncyA9IC9cdyokLzsKCiAgICAgIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovCiAgICAgIHZhciByZUlzQmFkSGV4ID0gL15bLStdMHhbMC05YS1mXSskL2k7CgogICAgICAvKiogVXNlZCB0byBkZXRlY3QgYmluYXJ5IHN0cmluZyB2YWx1ZXMuICovCiAgICAgIHZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pOwoKICAgICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqLwogICAgICB2YXIgcmVJc0hvc3RDdG9yID0gL15cW29iamVjdCAuKz9Db25zdHJ1Y3RvclxdJC87CgogICAgICAvKiogVXNlZCB0byBkZXRlY3Qgb2N0YWwgc3RyaW5nIHZhbHVlcy4gKi8KICAgICAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7CgogICAgICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovCiAgICAgIHZhciByZUlzVWludCA9IC9eKD86MHxbMS05XVxkKikkLzsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIExhdGluIFVuaWNvZGUgbGV0dGVycyAoZXhjbHVkaW5nIG1hdGhlbWF0aWNhbCBvcGVyYXRvcnMpLiAqLwogICAgICB2YXIgcmVMYXRpbiA9IC9bXHhjMC1ceGQ2XHhkOC1ceGY2XHhmOC1ceGZmXHUwMTAwLVx1MDE3Zl0vZzsKCiAgICAgIC8qKiBVc2VkIHRvIGVuc3VyZSBjYXB0dXJpbmcgb3JkZXIgb2YgdGVtcGxhdGUgZGVsaW1pdGVycy4gKi8KICAgICAgdmFyIHJlTm9NYXRjaCA9IC8oJF4pLzsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIHVuZXNjYXBlZCBjaGFyYWN0ZXJzIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi8KICAgICAgdmFyIHJlVW5lc2NhcGVkU3RyaW5nID0gL1snXG5cclx1MjAyOFx1MjAyOVxcXS9nOwoKICAgICAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqLwogICAgICB2YXIgcnNBc3RyYWxSYW5nZSA9ICdcXHVkODAwLVxcdWRmZmYnLAogICAgICAgICAgcnNDb21ib01hcmtzUmFuZ2UgPSAnXFx1MDMwMC1cXHUwMzZmJywKICAgICAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXHVmZTIwLVxcdWZlMmYnLAogICAgICAgICAgcnNDb21ib1N5bWJvbHNSYW5nZSA9ICdcXHUyMGQwLVxcdTIwZmYnLAogICAgICAgICAgcnNDb21ib1JhbmdlID0gcnNDb21ib01hcmtzUmFuZ2UgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UgKyByc0NvbWJvU3ltYm9sc1JhbmdlLAogICAgICAgICAgcnNEaW5nYmF0UmFuZ2UgPSAnXFx1MjcwMC1cXHUyN2JmJywKICAgICAgICAgIHJzTG93ZXJSYW5nZSA9ICdhLXpcXHhkZi1cXHhmNlxceGY4LVxceGZmJywKICAgICAgICAgIHJzTWF0aE9wUmFuZ2UgPSAnXFx4YWNcXHhiMVxceGQ3XFx4ZjcnLAogICAgICAgICAgcnNOb25DaGFyUmFuZ2UgPSAnXFx4MDAtXFx4MmZcXHgzYS1cXHg0MFxceDViLVxceDYwXFx4N2ItXFx4YmYnLAogICAgICAgICAgcnNQdW5jdHVhdGlvblJhbmdlID0gJ1xcdTIwMDAtXFx1MjA2ZicsCiAgICAgICAgICByc1NwYWNlUmFuZ2UgPSAnIFxcdFxceDBiXFxmXFx4YTBcXHVmZWZmXFxuXFxyXFx1MjAyOFxcdTIwMjlcXHUxNjgwXFx1MTgwZVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBhXFx1MjAyZlxcdTIwNWZcXHUzMDAwJywKICAgICAgICAgIHJzVXBwZXJSYW5nZSA9ICdBLVpcXHhjMC1cXHhkNlxceGQ4LVxceGRlJywKICAgICAgICAgIHJzVmFyUmFuZ2UgPSAnXFx1ZmUwZVxcdWZlMGYnLAogICAgICAgICAgcnNCcmVha1JhbmdlID0gcnNNYXRoT3BSYW5nZSArIHJzTm9uQ2hhclJhbmdlICsgcnNQdW5jdHVhdGlvblJhbmdlICsgcnNTcGFjZVJhbmdlOwoKICAgICAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqLwogICAgICB2YXIgcnNBcG9zID0gIlsnXHUyMDE5XSIsCiAgICAgICAgICByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UgKyAnXScsCiAgICAgICAgICByc0JyZWFrID0gJ1snICsgcnNCcmVha1JhbmdlICsgJ10nLAogICAgICAgICAgcnNDb21ibyA9ICdbJyArIHJzQ29tYm9SYW5nZSArICddJywKICAgICAgICAgIHJzRGlnaXRzID0gJ1xcZCsnLAogICAgICAgICAgcnNEaW5nYmF0ID0gJ1snICsgcnNEaW5nYmF0UmFuZ2UgKyAnXScsCiAgICAgICAgICByc0xvd2VyID0gJ1snICsgcnNMb3dlclJhbmdlICsgJ10nLAogICAgICAgICAgcnNNaXNjID0gJ1teJyArIHJzQXN0cmFsUmFuZ2UgKyByc0JyZWFrUmFuZ2UgKyByc0RpZ2l0cyArIHJzRGluZ2JhdFJhbmdlICsgcnNMb3dlclJhbmdlICsgcnNVcHBlclJhbmdlICsgJ10nLAogICAgICAgICAgcnNGaXR6ID0gJ1xcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXScsCiAgICAgICAgICByc01vZGlmaWVyID0gJyg/OicgKyByc0NvbWJvICsgJ3wnICsgcnNGaXR6ICsgJyknLAogICAgICAgICAgcnNOb25Bc3RyYWwgPSAnW14nICsgcnNBc3RyYWxSYW5nZSArICddJywKICAgICAgICAgIHJzUmVnaW9uYWwgPSAnKD86XFx1ZDgzY1tcXHVkZGU2LVxcdWRkZmZdKXsyfScsCiAgICAgICAgICByc1N1cnJQYWlyID0gJ1tcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0nLAogICAgICAgICAgcnNVcHBlciA9ICdbJyArIHJzVXBwZXJSYW5nZSArICddJywKICAgICAgICAgIHJzWldKID0gJ1xcdTIwMGQnOwoKICAgICAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovCiAgICAgIHZhciByc01pc2NMb3dlciA9ICcoPzonICsgcnNMb3dlciArICd8JyArIHJzTWlzYyArICcpJywKICAgICAgICAgIHJzTWlzY1VwcGVyID0gJyg/OicgKyByc1VwcGVyICsgJ3wnICsgcnNNaXNjICsgJyknLAogICAgICAgICAgcnNPcHRDb250ckxvd2VyID0gJyg/OicgKyByc0Fwb3MgKyAnKD86ZHxsbHxtfHJlfHN8dHx2ZSkpPycsCiAgICAgICAgICByc09wdENvbnRyVXBwZXIgPSAnKD86JyArIHJzQXBvcyArICcoPzpEfExMfE18UkV8U3xUfFZFKSk/JywKICAgICAgICAgIHJlT3B0TW9kID0gcnNNb2RpZmllciArICc/JywKICAgICAgICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSArICddPycsCiAgICAgICAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKICsgJyg/OicgKyBbcnNOb25Bc3RyYWwsIHJzUmVnaW9uYWwsIHJzU3VyclBhaXJdLmpvaW4oJ3wnKSArICcpJyArIHJzT3B0VmFyICsgcmVPcHRNb2QgKyAnKSonLAogICAgICAgICAgcnNPcmRMb3dlciA9ICdcXGQqKD86MXN0fDJuZHwzcmR8KD8hWzEyM10pXFxkdGgpKD89XFxifFtBLVpfXSknLAogICAgICAgICAgcnNPcmRVcHBlciA9ICdcXGQqKD86MVNUfDJORHwzUkR8KD8hWzEyM10pXFxkVEgpKD89XFxifFthLXpfXSknLAogICAgICAgICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLAogICAgICAgICAgcnNFbW9qaSA9ICcoPzonICsgW3JzRGluZ2JhdCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNTZXEsCiAgICAgICAgICByc1N5bWJvbCA9ICcoPzonICsgW3JzTm9uQXN0cmFsICsgcnNDb21ibyArICc/JywgcnNDb21ibywgcnNSZWdpb25hbCwgcnNTdXJyUGFpciwgcnNBc3RyYWxdLmpvaW4oJ3wnKSArICcpJzsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIGFwb3N0cm9waGVzLiAqLwogICAgICB2YXIgcmVBcG9zID0gUmVnRXhwKHJzQXBvcywgJ2cnKTsKCiAgICAgIC8qKgogICAgICAgKiBVc2VkIHRvIG1hdGNoIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3NdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrcykgYW5kCiAgICAgICAqIFtjb21iaW5pbmcgZGlhY3JpdGljYWwgbWFya3MgZm9yIHN5bWJvbHNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvbWJpbmluZ19EaWFjcml0aWNhbF9NYXJrc19mb3JfU3ltYm9scykuCiAgICAgICAqLwogICAgICB2YXIgcmVDb21ib01hcmsgPSBSZWdFeHAocnNDb21ibywgJ2cnKTsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovCiAgICAgIHZhciByZVVuaWNvZGUgPSBSZWdFeHAocnNGaXR6ICsgJyg/PScgKyByc0ZpdHogKyAnKXwnICsgcnNTeW1ib2wgKyByc1NlcSwgJ2cnKTsKCiAgICAgIC8qKiBVc2VkIHRvIG1hdGNoIGNvbXBsZXggb3IgY29tcG91bmQgd29yZHMuICovCiAgICAgIHZhciByZVVuaWNvZGVXb3JkID0gUmVnRXhwKFsKICAgICAgICByc1VwcGVyICsgJz8nICsgcnNMb3dlciArICcrJyArIHJzT3B0Q29udHJMb3dlciArICcoPz0nICsgW3JzQnJlYWssIHJzVXBwZXIsICckJ10uam9pbignfCcpICsgJyknLAogICAgICAgIHJzTWlzY1VwcGVyICsgJysnICsgcnNPcHRDb250clVwcGVyICsgJyg/PScgKyBbcnNCcmVhaywgcnNVcHBlciArIHJzTWlzY0xvd2VyLCAnJCddLmpvaW4oJ3wnKSArICcpJywKICAgICAgICByc1VwcGVyICsgJz8nICsgcnNNaXNjTG93ZXIgKyAnKycgKyByc09wdENvbnRyTG93ZXIsCiAgICAgICAgcnNVcHBlciArICcrJyArIHJzT3B0Q29udHJVcHBlciwKICAgICAgICByc09yZFVwcGVyLAogICAgICAgIHJzT3JkTG93ZXIsCiAgICAgICAgcnNEaWdpdHMsCiAgICAgICAgcnNFbW9qaQogICAgICBdLmpvaW4oJ3wnKSwgJ2cnKTsKCiAgICAgIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqLwogICAgICB2YXIgcmVIYXNVbmljb2RlID0gUmVnRXhwKCdbJyArIHJzWldKICsgcnNBc3RyYWxSYW5nZSAgKyByc0NvbWJvUmFuZ2UgKyByc1ZhclJhbmdlICsgJ10nKTsKCiAgICAgIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHRoYXQgbmVlZCBhIG1vcmUgcm9idXN0IHJlZ2V4cCB0byBtYXRjaCB3b3Jkcy4gKi8KICAgICAgdmFyIHJlSGFzVW5pY29kZVdvcmQgPSAvW2Etel1bQS1aXXxbQS1aXXsyfVthLXpdfFswLTldW2EtekEtWl18W2EtekEtWl1bMC05XXxbXmEtekEtWjAtOSBdLzsKCiAgICAgIC8qKiBVc2VkIHRvIGFzc2lnbiBkZWZhdWx0IGBjb250ZXh0YCBvYmplY3QgcHJvcGVydGllcy4gKi8KICAgICAgdmFyIGNvbnRleHRQcm9wcyA9IFsKICAgICAgICAnQXJyYXknLCAnQnVmZmVyJywgJ0RhdGFWaWV3JywgJ0RhdGUnLCAnRXJyb3InLCAnRmxvYXQzMkFycmF5JywgJ0Zsb2F0NjRBcnJheScsCiAgICAgICAgJ0Z1bmN0aW9uJywgJ0ludDhBcnJheScsICdJbnQxNkFycmF5JywgJ0ludDMyQXJyYXknLCAnTWFwJywgJ01hdGgnLCAnT2JqZWN0JywKICAgICAgICAnUHJvbWlzZScsICdSZWdFeHAnLCAnU2V0JywgJ1N0cmluZycsICdTeW1ib2wnLCAnVHlwZUVycm9yJywgJ1VpbnQ4QXJyYXknLAogICAgICAgICdVaW50OENsYW1wZWRBcnJheScsICdVaW50MTZBcnJheScsICdVaW50MzJBcnJheScsICdXZWFrTWFwJywKICAgICAgICAnXycsICdjbGVhclRpbWVvdXQnLCAnaXNGaW5pdGUnLCAncGFyc2VJbnQnLCAnc2V0VGltZW91dCcKICAgICAgXTsKCiAgICAgIC8qKiBVc2VkIHRvIG1ha2UgdGVtcGxhdGUgc291cmNlVVJMcyBlYXNpZXIgdG8gaWRlbnRpZnkuICovCiAgICAgIHZhciB0ZW1wbGF0ZUNvdW50ZXIgPSAtMTsKCiAgICAgIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIG9mIHR5cGVkIGFycmF5cy4gKi8KICAgICAgdmFyIHR5cGVkQXJyYXlUYWdzID0ge307CiAgICAgIHR5cGVkQXJyYXlUYWdzW2Zsb2F0MzJUYWddID0gdHlwZWRBcnJheVRhZ3NbZmxvYXQ2NFRhZ10gPQogICAgICB0eXBlZEFycmF5VGFnc1tpbnQ4VGFnXSA9IHR5cGVkQXJyYXlUYWdzW2ludDE2VGFnXSA9CiAgICAgIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9CiAgICAgIHR5cGVkQXJyYXlUYWdzW3VpbnQ4Q2xhbXBlZFRhZ10gPSB0eXBlZEFycmF5VGFnc1t1aW50MTZUYWddID0KICAgICAgdHlwZWRBcnJheVRhZ3NbdWludDMyVGFnXSA9IHRydWU7CiAgICAgIHR5cGVkQXJyYXlUYWdzW2FyZ3NUYWddID0gdHlwZWRBcnJheVRhZ3NbYXJyYXlUYWddID0KICAgICAgdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPQogICAgICB0eXBlZEFycmF5VGFnc1tkYXRhVmlld1RhZ10gPSB0eXBlZEFycmF5VGFnc1tkYXRlVGFnXSA9CiAgICAgIHR5cGVkQXJyYXlUYWdzW2Vycm9yVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Z1bmNUYWddID0KICAgICAgdHlwZWRBcnJheVRhZ3NbbWFwVGFnXSA9IHR5cGVkQXJyYXlUYWdzW251bWJlclRhZ10gPQogICAgICB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9CiAgICAgIHR5cGVkQXJyYXlUYWdzW3NldFRhZ10gPSB0eXBlZEFycmF5VGFnc1tzdHJpbmdUYWddID0KICAgICAgdHlwZWRBcnJheVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTsKCiAgICAgIC8qKiBVc2VkIHRvIGlkZW50aWZ5IGB0b1N0cmluZ1RhZ2AgdmFsdWVzIHN1cHBvcnRlZCBieSBgXy5jbG9uZWAuICovCiAgICAgIHZhciBjbG9uZWFibGVUYWdzID0ge307CiAgICAgIGNsb25lYWJsZVRhZ3NbYXJnc1RhZ10gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnXSA9CiAgICAgIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRhVmlld1RhZ10gPQogICAgICBjbG9uZWFibGVUYWdzW2Jvb2xUYWddID0gY2xvbmVhYmxlVGFnc1tkYXRlVGFnXSA9CiAgICAgIGNsb25lYWJsZVRhZ3NbZmxvYXQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWddID0KICAgICAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbaW50MTZUYWddID0KICAgICAgY2xvbmVhYmxlVGFnc1tpbnQzMlRhZ10gPSBjbG9uZWFibGVUYWdzW21hcFRhZ10gPQogICAgICBjbG9uZWFibGVUYWdzW251bWJlclRhZ10gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZ10gPQogICAgICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZ10gPSBjbG9uZWFibGVUYWdzW3NldFRhZ10gPQogICAgICBjbG9uZWFibGVUYWdzW3N0cmluZ1RhZ10gPSBjbG9uZWFibGVUYWdzW3N5bWJvbFRhZ10gPQogICAgICBjbG9uZWFibGVUYWdzW3VpbnQ4VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnXSA9CiAgICAgIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnXSA9IGNsb25lYWJsZVRhZ3NbdWludDMyVGFnXSA9IHRydWU7CiAgICAgIGNsb25lYWJsZVRhZ3NbZXJyb3JUYWddID0gY2xvbmVhYmxlVGFnc1tmdW5jVGFnXSA9CiAgICAgIGNsb25lYWJsZVRhZ3Nbd2Vha01hcFRhZ10gPSBmYWxzZTsKCiAgICAgIC8qKiBVc2VkIHRvIG1hcCBMYXRpbiBVbmljb2RlIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4gKi8KICAgICAgdmFyIGRlYnVycmVkTGV0dGVycyA9IHsKICAgICAgICAvLyBMYXRpbi0xIFN1cHBsZW1lbnQgYmxvY2suCiAgICAgICAgJ1x4YzAnOiAnQScsICAnXHhjMSc6ICdBJywgJ1x4YzInOiAnQScsICdceGMzJzogJ0EnLCAnXHhjNCc6ICdBJywgJ1x4YzUnOiAnQScsCiAgICAgICAgJ1x4ZTAnOiAnYScsICAnXHhlMSc6ICdhJywgJ1x4ZTInOiAnYScsICdceGUzJzogJ2EnLCAnXHhlNCc6ICdhJywgJ1x4ZTUnOiAnYScsCiAgICAgICAgJ1x4YzcnOiAnQycsICAnXHhlNyc6ICdjJywKICAgICAgICAnXHhkMCc6ICdEJywgICdceGYwJzogJ2QnLAogICAgICAgICdceGM4JzogJ0UnLCAgJ1x4YzknOiAnRScsICdceGNhJzogJ0UnLCAnXHhjYic6ICdFJywKICAgICAgICAnXHhlOCc6ICdlJywgICdceGU5JzogJ2UnLCAnXHhlYSc6ICdlJywgJ1x4ZWInOiAnZScsCiAgICAgICAgJ1x4Y2MnOiAnSScsICAnXHhjZCc6ICdJJywgJ1x4Y2UnOiAnSScsICdceGNmJzogJ0knLAogICAgICAgICdceGVjJzogJ2knLCAgJ1x4ZWQnOiAnaScsICdceGVlJzogJ2knLCAnXHhlZic6ICdpJywKICAgICAgICAnXHhkMSc6ICdOJywgICdceGYxJzogJ24nLAogICAgICAgICdceGQyJzogJ08nLCAgJ1x4ZDMnOiAnTycsICdceGQ0JzogJ08nLCAnXHhkNSc6ICdPJywgJ1x4ZDYnOiAnTycsICdceGQ4JzogJ08nLAogICAgICAgICdceGYyJzogJ28nLCAgJ1x4ZjMnOiAnbycsICdceGY0JzogJ28nLCAnXHhmNSc6ICdvJywgJ1x4ZjYnOiAnbycsICdceGY4JzogJ28nLAogICAgICAgICdceGQ5JzogJ1UnLCAgJ1x4ZGEnOiAnVScsICdceGRiJzogJ1UnLCAnXHhkYyc6ICdVJywKICAgICAgICAnXHhmOSc6ICd1JywgICdceGZhJzogJ3UnLCAnXHhmYic6ICd1JywgJ1x4ZmMnOiAndScsCiAgICAgICAgJ1x4ZGQnOiAnWScsICAnXHhmZCc6ICd5JywgJ1x4ZmYnOiAneScsCiAgICAgICAgJ1x4YzYnOiAnQWUnLCAnXHhlNic6ICdhZScsCiAgICAgICAgJ1x4ZGUnOiAnVGgnLCAnXHhmZSc6ICd0aCcsCiAgICAgICAgJ1x4ZGYnOiAnc3MnLAogICAgICAgIC8vIExhdGluIEV4dGVuZGVkLUEgYmxvY2suCiAgICAgICAgJ1x1MDEwMCc6ICdBJywgICdcdTAxMDInOiAnQScsICdcdTAxMDQnOiAnQScsCiAgICAgICAgJ1x1MDEwMSc6ICdhJywgICdcdTAxMDMnOiAnYScsICdcdTAxMDUnOiAnYScsCiAgICAgICAgJ1x1MDEwNic6ICdDJywgICdcdTAxMDgnOiAnQycsICdcdTAxMGEnOiAnQycsICdcdTAxMGMnOiAnQycsCiAgICAgICAgJ1x1MDEwNyc6ICdjJywgICdcdTAxMDknOiAnYycsICdcdTAxMGInOiAnYycsICdcdTAxMGQnOiAnYycsCiAgICAgICAgJ1x1MDEwZSc6ICdEJywgICdcdTAxMTAnOiAnRCcsICdcdTAxMGYnOiAnZCcsICdcdTAxMTEnOiAnZCcsCiAgICAgICAgJ1x1MDExMic6ICdFJywgICdcdTAxMTQnOiAnRScsICdcdTAxMTYnOiAnRScsICdcdTAxMTgnOiAnRScsICdcdTAxMWEnOiAnRScsCiAgICAgICAgJ1x1MDExMyc6ICdlJywgICdcdTAxMTUnOiAnZScsICdcdTAxMTcnOiAnZScsICdcdTAxMTknOiAnZScsICdcdTAxMWInOiAnZScsCiAgICAgICAgJ1x1MDExYyc6ICdHJywgICdcdTAxMWUnOiAnRycsICdcdTAxMjAnOiAnRycsICdcdTAxMjInOiAnRycsCiAgICAgICAgJ1x1MDExZCc6ICdnJywgICdcdTAxMWYnOiAnZycsICdcdTAxMjEnOiAnZycsICdcdTAxMjMnOiAnZycsCiAgICAgICAgJ1x1MDEyNCc6ICdIJywgICdcdTAxMjYnOiAnSCcsICdcdTAxMjUnOiAnaCcsICdcdTAxMjcnOiAnaCcsCiAgICAgICAgJ1x1MDEyOCc6ICdJJywgICdcdTAxMmEnOiAnSScsICdcdTAxMmMnOiAnSScsICdcdTAxMmUnOiAnSScsICdcdTAxMzAnOiAnSScsCiAgICAgICAgJ1x1MDEyOSc6ICdpJywgICdcdTAxMmInOiAnaScsICdcdTAxMmQnOiAnaScsICdcdTAxMmYnOiAnaScsICdcdTAxMzEnOiAnaScsCiAgICAgICAgJ1x1MDEzNCc6ICdKJywgICdcdTAxMzUnOiAnaicsCiAgICAgICAgJ1x1MDEzNic6ICdLJywgICdcdTAxMzcnOiAnaycsICdcdTAxMzgnOiAnaycsCiAgICAgICAgJ1x1MDEzOSc6ICdMJywgICdcdTAxM2InOiAnTCcsICdcdTAxM2QnOiAnTCcsICdcdTAxM2YnOiAnTCcsICdcdTAxNDEnOiAnTCcsCiAgICAgICAgJ1x1MDEzYSc6ICdsJywgICdcdTAxM2MnOiAnbCcsICdcdTAxM2UnOiAnbCcsICdcdTAxNDAnOiAnbCcsICdcdTAxNDInOiAnbCcsCiAgICAgICAgJ1x1MDE0Myc6ICdOJywgICdcdTAxNDUnOiAnTicsICdcdTAxNDcnOiAnTicsICdcdTAxNGEnOiAnTicsCiAgICAgICAgJ1x1MDE0NCc6ICduJywgICdcdTAxNDYnOiAnbicsICdcdTAxNDgnOiAnbicsICdcdTAxNGInOiAnbicsCiAgICAgICAgJ1x1MDE0Yyc6ICdPJywgICdcdTAxNGUnOiAnTycsICdcdTAxNTAnOiAnTycsCiAgICAgICAgJ1x1MDE0ZCc6ICdvJywgICdcdTAxNGYnOiAnbycsICdcdTAxNTEnOiAnbycsCiAgICAgICAgJ1x1MDE1NCc6ICdSJywgICdcdTAxNTYnOiAnUicsICdcdTAxNTgnOiAnUicsCiAgICAgICAgJ1x1MDE1NSc6ICdyJywgICdcdTAxNTcnOiAncicsICdcdTAxNTknOiAncicsCiAgICAgICAgJ1x1MDE1YSc6ICdTJywgICdcdTAxNWMnOiAnUycsICdcdTAxNWUnOiAnUycsICdcdTAxNjAnOiAnUycsCiAgICAgICAgJ1x1MDE1Yic6ICdzJywgICdcdTAxNWQnOiAncycsICdcdTAxNWYnOiAncycsICdcdTAxNjEnOiAncycsCiAgICAgICAgJ1x1MDE2Mic6ICdUJywgICdcdTAxNjQnOiAnVCcsICdcdTAxNjYnOiAnVCcsCiAgICAgICAgJ1x1MDE2Myc6ICd0JywgICdcdTAxNjUnOiAndCcsICdcdTAxNjcnOiAndCcsCiAgICAgICAgJ1x1MDE2OCc6ICdVJywgICdcdTAxNmEnOiAnVScsICdcdTAxNmMnOiAnVScsICdcdTAxNmUnOiAnVScsICdcdTAxNzAnOiAnVScsICdcdTAxNzInOiAnVScsCiAgICAgICAgJ1x1MDE2OSc6ICd1JywgICdcdTAxNmInOiAndScsICdcdTAxNmQnOiAndScsICdcdTAxNmYnOiAndScsICdcdTAxNzEnOiAndScsICdcdTAxNzMnOiAndScsCiAgICAgICAgJ1x1MDE3NCc6ICdXJywgICdcdTAxNzUnOiAndycsCiAgICAgICAgJ1x1MDE3Nic6ICdZJywgICdcdTAxNzcnOiAneScsICdcdTAxNzgnOiAnWScsCiAgICAgICAgJ1x1MDE3OSc6ICdaJywgICdcdTAxN2InOiAnWicsICdcdTAxN2QnOiAnWicsCiAgICAgICAgJ1x1MDE3YSc6ICd6JywgICdcdTAxN2MnOiAneicsICdcdTAxN2UnOiAneicsCiAgICAgICAgJ1x1MDEzMic6ICdJSicsICdcdTAxMzMnOiAnaWonLAogICAgICAgICdcdTAxNTInOiAnT2UnLCAnXHUwMTUzJzogJ29lJywKICAgICAgICAnXHUwMTQ5JzogIiduIiwgJ1x1MDE3Zic6ICdzJwogICAgICB9OwoKICAgICAgLyoqIFVzZWQgdG8gbWFwIGNoYXJhY3RlcnMgdG8gSFRNTCBlbnRpdGllcy4gKi8KICAgICAgdmFyIGh0bWxFc2NhcGVzID0gewogICAgICAgICcmJzogJyZhbXA7JywKICAgICAgICAnPCc6ICcmbHQ7JywKICAgICAgICAnPic6ICcmZ3Q7JywKICAgICAgICAnIic6ICcmcXVvdDsnLAogICAgICAgICInIjogJyYjMzk7JwogICAgICB9OwoKICAgICAgLyoqIFVzZWQgdG8gbWFwIEhUTUwgZW50aXRpZXMgdG8gY2hhcmFjdGVycy4gKi8KICAgICAgdmFyIGh0bWxVbmVzY2FwZXMgPSB7CiAgICAgICAgJyZhbXA7JzogJyYnLAogICAgICAgICcmbHQ7JzogJzwnLAogICAgICAgICcmZ3Q7JzogJz4nLAogICAgICAgICcmcXVvdDsnOiAnIicsCiAgICAgICAgJyYjMzk7JzogIiciCiAgICAgIH07CgogICAgICAvKiogVXNlZCB0byBlc2NhcGUgY2hhcmFjdGVycyBmb3IgaW5jbHVzaW9uIGluIGNvbXBpbGVkIHN0cmluZyBsaXRlcmFscy4gKi8KICAgICAgdmFyIHN0cmluZ0VzY2FwZXMgPSB7CiAgICAgICAgJ1xcJzogJ1xcJywKICAgICAgICAiJyI6ICInIiwKICAgICAgICAnXG4nOiAnbicsCiAgICAgICAgJ1xyJzogJ3InLAogICAgICAgICdcdTIwMjgnOiAndTIwMjgnLAogICAgICAgICdcdTIwMjknOiAndTIwMjknCiAgICAgIH07CgogICAgICAvKiogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgd2l0aG91dCBhIGRlcGVuZGVuY3kgb24gYHJvb3RgLiAqLwogICAgICB2YXIgZnJlZVBhcnNlRmxvYXQgPSBwYXJzZUZsb2F0LAogICAgICAgICAgZnJlZVBhcnNlSW50ID0gcGFyc2VJbnQ7CgogICAgICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAgZnJvbSBOb2RlLmpzLiAqLwogICAgICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBjb21tb25qc0dsb2JhbCA9PSAnb2JqZWN0JyAmJiBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBjb21tb25qc0dsb2JhbDsKCiAgICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovCiAgICAgIHZhciBmcmVlU2VsZiA9IHR5cGVvZiBzZWxmID09ICdvYmplY3QnICYmIHNlbGYgJiYgc2VsZi5PYmplY3QgPT09IE9iamVjdCAmJiBzZWxmOwoKICAgICAgLyoqIFVzZWQgYXMgYSByZWZlcmVuY2UgdG8gdGhlIGdsb2JhbCBvYmplY3QuICovCiAgICAgIHZhciByb290ID0gZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwoKICAgICAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi8KICAgICAgdmFyIGZyZWVFeHBvcnRzID0gIGV4cG9ydHMgJiYgIWV4cG9ydHMubm9kZVR5cGUgJiYgZXhwb3J0czsKCiAgICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi8KICAgICAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiAnb2JqZWN0JyA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7CgogICAgICAvKiogRGV0ZWN0IHRoZSBwb3B1bGFyIENvbW1vbkpTIGV4dGVuc2lvbiBgbW9kdWxlLmV4cG9ydHNgLiAqLwogICAgICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0czsKCiAgICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgcHJvY2Vzc2AgZnJvbSBOb2RlLmpzLiAqLwogICAgICB2YXIgZnJlZVByb2Nlc3MgPSBtb2R1bGVFeHBvcnRzICYmIGZyZWVHbG9iYWwucHJvY2VzczsKCiAgICAgIC8qKiBVc2VkIHRvIGFjY2VzcyBmYXN0ZXIgTm9kZS5qcyBoZWxwZXJzLiAqLwogICAgICB2YXIgbm9kZVV0aWwgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIC8vIFVzZSBgdXRpbC50eXBlc2AgZm9yIE5vZGUuanMgMTArLgogICAgICAgICAgdmFyIHR5cGVzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUgJiYgZnJlZU1vZHVsZS5yZXF1aXJlKCd1dGlsJykudHlwZXM7CgogICAgICAgICAgaWYgKHR5cGVzKSB7CiAgICAgICAgICAgIHJldHVybiB0eXBlczsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLgogICAgICAgICAgcmV0dXJuIGZyZWVQcm9jZXNzICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcgJiYgZnJlZVByb2Nlc3MuYmluZGluZygndXRpbCcpOwogICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgIH0oKSk7CgogICAgICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqLwogICAgICB2YXIgbm9kZUlzQXJyYXlCdWZmZXIgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc0FycmF5QnVmZmVyLAogICAgICAgICAgbm9kZUlzRGF0ZSA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzRGF0ZSwKICAgICAgICAgIG5vZGVJc01hcCA9IG5vZGVVdGlsICYmIG5vZGVVdGlsLmlzTWFwLAogICAgICAgICAgbm9kZUlzUmVnRXhwID0gbm9kZVV0aWwgJiYgbm9kZVV0aWwuaXNSZWdFeHAsCiAgICAgICAgICBub2RlSXNTZXQgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1NldCwKICAgICAgICAgIG5vZGVJc1R5cGVkQXJyYXkgPSBub2RlVXRpbCAmJiBub2RlVXRpbC5pc1R5cGVkQXJyYXk7CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgIC8qKgogICAgICAgKiBBIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBgRnVuY3Rpb24jYXBwbHlgLCB0aGlzIGZ1bmN0aW9uIGludm9rZXMgYGZ1bmNgCiAgICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4KICAgICAgICogQHBhcmFtIHsqfSB0aGlzQXJnIFRoZSBgdGhpc2AgYmluZGluZyBvZiBgZnVuY2AuCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguCiAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYXBwbHkoZnVuYywgdGhpc0FyZywgYXJncykgewogICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHsKICAgICAgICAgIGNhc2UgMDogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnKTsKICAgICAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdKTsKICAgICAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTsKICAgICAgICAgIGNhc2UgMzogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VBZ2dyZWdhdG9yYCBmb3IgYXJyYXlzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBhZ2dyZWdhdGVkIG9iamVjdC4KICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhcnJheUFnZ3JlZ2F0b3IoYXJyYXksIHNldHRlciwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOwogICAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBhcnJheSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5mb3JFYWNoYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IKICAgICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoaXRlcmF0ZWUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpID09PSBmYWxzZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmZvckVhY2hSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yCiAgICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhcnJheUVhY2hSaWdodChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CgogICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpID09PSBmYWxzZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmV2ZXJ5YCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IKICAgICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFsbCBlbGVtZW50cyBwYXNzIHRoZSBwcmVkaWNhdGUgY2hlY2ssCiAgICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhcnJheUV2ZXJ5KGFycmF5LCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoIXByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5maWx0ZXJgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvcgogICAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHsKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgIHJlc0luZGV4ID0gMCwKICAgICAgICAgICAgcmVzdWx0ID0gW107CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7CiAgICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IKICAgICAgICogc3BlY2lmeWluZyBhbiBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlcyhhcnJheSwgdmFsdWUpIHsKICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgMCkgPiAtMTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYXJyYXlJbmNsdWRlc2AgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBhIGNvbXBhcmF0b3IuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgaWYgKGNvbXBhcmF0b3IodmFsdWUsIGFycmF5W2luZGV4XSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5tYXBgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZQogICAgICAgKiBzaG9ydGhhbmRzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGFycmF5TWFwKGFycmF5LCBpdGVyYXRlZSkgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCwKICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKCiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBcHBlbmRzIHRoZSBlbGVtZW50cyBvZiBgdmFsdWVzYCB0byBgYXJyYXlgLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LgogICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhcHBlbmQuCiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYXJyYXlQdXNoKGFycmF5LCB2YWx1ZXMpIHsKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgbGVuZ3RoID0gdmFsdWVzLmxlbmd0aCwKICAgICAgICAgICAgb2Zmc2V0ID0gYXJyYXkubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgYXJyYXlbb2Zmc2V0ICsgaW5kZXhdID0gdmFsdWVzW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnJlZHVjZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yCiAgICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YCBhcwogICAgICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuCiAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKCiAgICAgICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHsKICAgICAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbKytpbmRleF07CiAgICAgICAgfQogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBhY2N1bXVsYXRvciA9IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCBhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VSaWdodGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yCiAgICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpbml0QWNjdW1dIFNwZWNpZnkgdXNpbmcgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzCiAgICAgICAqICB0aGUgaW5pdGlhbCB2YWx1ZS4KICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYXJyYXlSZWR1Y2VSaWdodChhcnJheSwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0pIHsKICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHsKICAgICAgICAgIGFjY3VtdWxhdG9yID0gYXJyYXlbLS1sZW5ndGhdOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgIGFjY3VtdWxhdG9yID0gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIGFycmF5W2xlbmd0aF0sIGxlbmd0aCwgYXJyYXkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlCiAgICAgICAqIHNob3J0aGFuZHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjaywKICAgICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEdldHMgdGhlIHNpemUgb2YgYW4gQVNDSUkgYHN0cmluZ2AuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyBpbnNwZWN0LgogICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS4KICAgICAgICovCiAgICAgIHZhciBhc2NpaVNpemUgPSBiYXNlUHJvcGVydHkoJ2xlbmd0aCcpOwoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGFuIEFTQ0lJIGBzdHJpbmdgIHRvIGFuIGFycmF5LgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgYXJyYXkuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhc2NpaVRvQXJyYXkoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5zcGxpdCgnJyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTcGxpdHMgYW4gQVNDSUkgYHN0cmluZ2AgaW50byBhbiBhcnJheSBvZiBpdHMgd29yZHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuCiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgd29yZHMgb2YgYHN0cmluZ2AuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBhc2NpaVdvcmRzKHN0cmluZykgewogICAgICAgIHJldHVybiBzdHJpbmcubWF0Y2gocmVBc2NpaVdvcmQpIHx8IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmZpbmRLZXlgIGFuZCBgXy5maW5kTGFzdEtleWAsCiAgICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcywgd2hpY2ggaXRlcmF0ZXMgb3ZlciBgY29sbGVjdGlvbmAKICAgICAgICogdXNpbmcgYGVhY2hGdW5jYC4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYGNvbGxlY3Rpb25gLgogICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZm91bmQgZWxlbWVudCBvciBpdHMga2V5LCBlbHNlIGB1bmRlZmluZWRgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYmFzZUZpbmRLZXkoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBlYWNoRnVuYykgewogICAgICAgIHZhciByZXN1bHQ7CiAgICAgICAgZWFjaEZ1bmMoY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgewogICAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSkgewogICAgICAgICAgICByZXN1bHQgPSBrZXk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmluZEluZGV4YCBhbmQgYF8uZmluZExhc3RJbmRleGAgd2l0aG91dAogICAgICAgKiBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGJhc2VGaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4LCBmcm9tUmlnaHQpIHsKICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgICBpbmRleCA9IGZyb21JbmRleCArIChmcm9tUmlnaHQgPyAxIDogLTEpOwoKICAgICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSkgewogICAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pbmRleE9mYCB3aXRob3V0IGBmcm9tSW5kZXhgIGJvdW5kcyBjaGVja3MuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZQogICAgICAgICAgPyBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KQogICAgICAgICAgOiBiYXNlRmluZEluZGV4KGFycmF5LCBiYXNlSXNOYU4sIGZyb21JbmRleCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGJhc2VJbmRleE9mYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGEgY29tcGFyYXRvci4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBiYXNlSW5kZXhPZldpdGgoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgsIGNvbXBhcmF0b3IpIHsKICAgICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggLSAxLAogICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICBpZiAoY29tcGFyYXRvcihhcnJheVtpbmRleF0sIHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTmFOYCB3aXRob3V0IHN1cHBvcnQgZm9yIG51bWJlciBvYmplY3RzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGJhc2VJc05hTih2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdmFsdWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZWFuYCBhbmQgYF8ubWVhbkJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yCiAgICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBiYXNlTWVhbihhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgcmV0dXJuIGxlbmd0aCA/IChiYXNlU3VtKGFycmF5LCBpdGVyYXRlZSkgLyBsZW5ndGgpIDogTkFOOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCQxIDogb2JqZWN0W2tleV07CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnByb3BlcnR5T2ZgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGJhc2VQcm9wZXJ0eU9mKG9iamVjdCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCQxIDogb2JqZWN0W2tleV07CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlZHVjZWAgYW5kIGBfLnJlZHVjZVJpZ2h0YCwgd2l0aG91dCBzdXBwb3J0CiAgICAgICAqIGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLCB3aGljaCBpdGVyYXRlcyBvdmVyIGBjb2xsZWN0aW9uYCB1c2luZyBgZWFjaEZ1bmNgLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAqIEBwYXJhbSB7Kn0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgdmFsdWUuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5pdEFjY3VtIFNwZWNpZnkgdXNpbmcgdGhlIGZpcnN0IG9yIGxhc3QgZWxlbWVudCBvZgogICAgICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGBjb2xsZWN0aW9uYC4KICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYmFzZVJlZHVjZShjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgZWFjaEZ1bmMpIHsKICAgICAgICBlYWNoRnVuYyhjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtCiAgICAgICAgICAgID8gKGluaXRBY2N1bSA9IGZhbHNlLCB2YWx1ZSkKICAgICAgICAgICAgOiBpdGVyYXRlZShhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlCiAgICAgICAqIHNvcnQgb3JkZXIgb2YgYGFycmF5YCBhbmQgcmVwbGFjZXMgY3JpdGVyaWEgb2JqZWN0cyB3aXRoIHRoZWlyIGNvcnJlc3BvbmRpbmcKICAgICAgICogdmFsdWVzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc29ydC4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLgogICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKCiAgICAgICAgYXJyYXkuc29ydChjb21wYXJlcik7CiAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgICBhcnJheVtsZW5ndGhdID0gYXJyYXlbbGVuZ3RoXS52YWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc3VtYCBhbmQgYF8uc3VtQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IKICAgICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYmFzZVN1bShhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICB2YXIgcmVzdWx0LAogICAgICAgICAgICBpbmRleCA9IC0xLAogICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICB2YXIgY3VycmVudCA9IGl0ZXJhdGVlKGFycmF5W2luZGV4XSk7CiAgICAgICAgICBpZiAoY3VycmVudCAhPT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ID09PSB1bmRlZmluZWQkMSA/IGN1cnJlbnQgOiAocmVzdWx0ICsgY3VycmVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzCiAgICAgICAqIG9yIG1heCBhcnJheSBsZW5ndGggY2hlY2tzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIGludm9rZSBgaXRlcmF0ZWVgLgogICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBiYXNlVGltZXMobiwgaXRlcmF0ZWUpIHsKICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobik7CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbikgewogICAgICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvUGFpcnNgIGFuZCBgXy50b1BhaXJzSW5gIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkKICAgICAgICogb2Yga2V5LXZhbHVlIHBhaXJzIGZvciBgb2JqZWN0YCBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcyBvZiBgcHJvcHNgLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci4KICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYmFzZVRvUGFpcnMob2JqZWN0LCBwcm9wcykgewogICAgICAgIHJldHVybiBhcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICByZXR1cm4gW2tleSwgb2JqZWN0W2tleV1dOwogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5hcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3Igc3RvcmluZyBtZXRhZGF0YS4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2FwIGFyZ3VtZW50cyBmb3IuCiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGJhc2VVbmFyeShmdW5jKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnZhbHVlc2AgYW5kIGBfLnZhbHVlc0luYCB3aGljaCBjcmVhdGVzIGFuCiAgICAgICAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcwogICAgICAgKiBvZiBgcHJvcHNgLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBnZXQgdmFsdWVzIGZvci4KICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gYmFzZVZhbHVlcyhvYmplY3QsIHByb3BzKSB7CiAgICAgICAgcmV0dXJuIGFycmF5TWFwKHByb3BzLCBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgIHJldHVybiBvYmplY3Rba2V5XTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENoZWNrcyBpZiBhIGBjYWNoZWAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGNhY2hlIFRoZSBjYWNoZSB0byBxdWVyeS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay4KICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHsKICAgICAgICByZXR1cm4gY2FjaGUuaGFzKGtleSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBVc2VkIGJ5IGBfLnRyaW1gIGFuZCBgXy50cmltU3RhcnRgIHRvIGdldCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHN0cmluZyBzeW1ib2wKICAgICAgICogdGhhdCBpcyBub3QgZm91bmQgaW4gdGhlIGNoYXJhY3RlciBzeW1ib2xzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBzdHJTeW1ib2xzIFRoZSBzdHJpbmcgc3ltYm9scyB0byBpbnNwZWN0LgogICAgICAgKiBAcGFyYW0ge0FycmF5fSBjaHJTeW1ib2xzIFRoZSBjaGFyYWN0ZXIgc3ltYm9scyB0byBmaW5kLgogICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scykgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICBsZW5ndGggPSBzdHJTeW1ib2xzLmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGggJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICB9CgogICAgICAvKioKICAgICAgICogVXNlZCBieSBgXy50cmltYCBhbmQgYF8udHJpbUVuZGAgdG8gZ2V0IHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzdHJpbmcgc3ltYm9sCiAgICAgICAqIHRoYXQgaXMgbm90IGZvdW5kIGluIHRoZSBjaGFyYWN0ZXIgc3ltYm9scy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gc3RyU3ltYm9scyBUaGUgc3RyaW5nIHN5bWJvbHMgdG8gaW5zcGVjdC4KICAgICAgICogQHBhcmFtIHtBcnJheX0gY2hyU3ltYm9scyBUaGUgY2hhcmFjdGVyIHN5bWJvbHMgdG8gZmluZC4KICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGxhc3QgdW5tYXRjaGVkIHN0cmluZyBzeW1ib2wuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBjaGFyc0VuZEluZGV4KHN0clN5bWJvbHMsIGNoclN5bWJvbHMpIHsKICAgICAgICB2YXIgaW5kZXggPSBzdHJTeW1ib2xzLmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKGluZGV4LS0gJiYgYmFzZUluZGV4T2YoY2hyU3ltYm9scywgc3RyU3ltYm9sc1tpbmRleF0sIDApID4gLTEpIHt9CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICB9CgogICAgICAvKioKICAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGBwbGFjZWhvbGRlcmAgb2NjdXJyZW5jZXMgaW4gYGFycmF5YC4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAqIEBwYXJhbSB7Kn0gcGxhY2Vob2xkZXIgVGhlIHBsYWNlaG9sZGVyIHRvIHNlYXJjaCBmb3IuCiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHBsYWNlaG9sZGVyIGNvdW50LgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gY291bnRIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikgewogICAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgIHJlc3VsdCA9IDA7CgogICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgaWYgKGFycmF5W2xlbmd0aF0gPT09IHBsYWNlaG9sZGVyKSB7CiAgICAgICAgICAgICsrcmVzdWx0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogVXNlZCBieSBgXy5kZWJ1cnJgIHRvIGNvbnZlcnQgTGF0aW4tMSBTdXBwbGVtZW50IGFuZCBMYXRpbiBFeHRlbmRlZC1BCiAgICAgICAqIGxldHRlcnMgdG8gYmFzaWMgTGF0aW4gbGV0dGVycy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxldHRlciBUaGUgbWF0Y2hlZCBsZXR0ZXIgdG8gZGVidXJyLgogICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBkZWJ1cnJlZCBsZXR0ZXIuCiAgICAgICAqLwogICAgICB2YXIgZGVidXJyTGV0dGVyID0gYmFzZVByb3BlcnR5T2YoZGVidXJyZWRMZXR0ZXJzKTsKCiAgICAgIC8qKgogICAgICAgKiBVc2VkIGJ5IGBfLmVzY2FwZWAgdG8gY29udmVydCBjaGFyYWN0ZXJzIHRvIEhUTUwgZW50aXRpZXMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS4KICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuCiAgICAgICAqLwogICAgICB2YXIgZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sRXNjYXBlcyk7CgogICAgICAvKioKICAgICAgICogVXNlZCBieSBgXy50ZW1wbGF0ZWAgdG8gZXNjYXBlIGNoYXJhY3RlcnMgZm9yIGluY2x1c2lvbiBpbiBjb21waWxlZCBzdHJpbmcgbGl0ZXJhbHMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIGVzY2FwZS4KICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBjaGFyYWN0ZXIuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBlc2NhcGVTdHJpbmdDaGFyKGNocikgewogICAgICAgIHJldHVybiAnXFwnICsgc3RyaW5nRXNjYXBlc1tjaHJdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAgb2YgYG9iamVjdGAuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHsKICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQkMSA6IG9iamVjdFtrZXldOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2tzIGlmIGBzdHJpbmdgIGNvbnRhaW5zIFVuaWNvZGUgc3ltYm9scy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGluc3BlY3QuCiAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gaGFzVW5pY29kZShzdHJpbmcpIHsKICAgICAgICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENoZWNrcyBpZiBgc3RyaW5nYCBjb250YWlucyBhIHdvcmQgY29tcG9zZWQgb2YgVW5pY29kZSBzeW1ib2xzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC4KICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGEgd29yZCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHJlSGFzVW5pY29kZVdvcmQudGVzdChzdHJpbmcpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVydHMgYGl0ZXJhdG9yYCB0byBhbiBhcnJheS4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZXJhdG9yIFRoZSBpdGVyYXRvciB0byBjb252ZXJ0LgogICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikgewogICAgICAgIHZhciBkYXRhLAogICAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgICAgd2hpbGUgKCEoZGF0YSA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkgewogICAgICAgICAgcmVzdWx0LnB1c2goZGF0YS52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICByZXN1bHQgPSBBcnJheShtYXAuc2l6ZSk7CgogICAgICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFtrZXksIHZhbHVlXTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHVuYXJ5IGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBpdHMgYXJndW1lbnQgdHJhbnNmb3JtZWQuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLgogICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKGFyZykgewogICAgICAgICAgcmV0dXJuIGZ1bmModHJhbnNmb3JtKGFyZykpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXBsYWNlcyBhbGwgYHBsYWNlaG9sZGVyYCBlbGVtZW50cyBpbiBgYXJyYXlgIHdpdGggYW4gaW50ZXJuYWwgcGxhY2Vob2xkZXIKICAgICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlaXIgaW5kZXhlcy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KICAgICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdG8gcmVwbGFjZS4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcGxhY2Vob2xkZXIgaW5kZXhlcy4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHJlcGxhY2VIb2xkZXJzKGFycmF5LCBwbGFjZWhvbGRlcikgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgIHJlc0luZGV4ID0gMCwKICAgICAgICAgICAgcmVzdWx0ID0gW107CgogICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgICBpZiAodmFsdWUgPT09IHBsYWNlaG9sZGVyIHx8IHZhbHVlID09PSBQTEFDRUhPTERFUikgewogICAgICAgICAgICBhcnJheVtpbmRleF0gPSBQTEFDRUhPTERFUjsKICAgICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gaW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZXMuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldCkgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICByZXN1bHQgPSBBcnJheShzZXQuc2l6ZSk7CgogICAgICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXN1bHRbKytpbmRleF0gPSB2YWx1ZTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVydHMgYHNldGAgdG8gaXRzIHZhbHVlLXZhbHVlIHBhaXJzLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB2YWx1ZS12YWx1ZSBwYWlycy4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHNldFRvUGFpcnMoc2V0KSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTsKCiAgICAgICAgc2V0LmZvckVhY2goZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IFt2YWx1ZSwgdmFsdWVdOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uaW5kZXhPZmAgd2hpY2ggcGVyZm9ybXMgc3RyaWN0IGVxdWFsaXR5CiAgICAgICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBmcm9tSW5kZXggVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gc3RyaWN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgewogICAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsCiAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIC0xOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmxhc3RJbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHkKICAgICAgICogY29tcGFyaXNvbnMgb2YgdmFsdWVzLCBpLmUuIGA9PT1gLgogICAgICAgKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCiAgICAgICAqLwogICAgICBmdW5jdGlvbiBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgewogICAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCArIDE7CiAgICAgICAgd2hpbGUgKGluZGV4LS0pIHsKICAgICAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICB9CgogICAgICAvKioKICAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHN5bWJvbHMgaW4gYHN0cmluZ2AuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBpbnNwZWN0LgogICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHN0cmluZ1NpemUoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKQogICAgICAgICAgPyB1bmljb2RlU2l6ZShzdHJpbmcpCiAgICAgICAgICA6IGFzY2lpU2l6ZShzdHJpbmcpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYW4gYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJpbmcgVGhlIHN0cmluZyB0byBjb252ZXJ0LgogICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBhcnJheS4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHN0cmluZ1RvQXJyYXkoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIGhhc1VuaWNvZGUoc3RyaW5nKQogICAgICAgICAgPyB1bmljb2RlVG9BcnJheShzdHJpbmcpCiAgICAgICAgICA6IGFzY2lpVG9BcnJheShzdHJpbmcpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVXNlZCBieSBgXy51bmVzY2FwZWAgdG8gY29udmVydCBIVE1MIGVudGl0aWVzIHRvIGNoYXJhY3RlcnMuCiAgICAgICAqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjaHIgVGhlIG1hdGNoZWQgY2hhcmFjdGVyIHRvIHVuZXNjYXBlLgogICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1bmVzY2FwZWQgY2hhcmFjdGVyLgogICAgICAgKi8KICAgICAgdmFyIHVuZXNjYXBlSHRtbENoYXIgPSBiYXNlUHJvcGVydHlPZihodG1sVW5lc2NhcGVzKTsKCiAgICAgIC8qKgogICAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuCiAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IHJlVW5pY29kZS5sYXN0SW5kZXggPSAwOwogICAgICAgIHdoaWxlIChyZVVuaWNvZGUudGVzdChzdHJpbmcpKSB7CiAgICAgICAgICArK3Jlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgVW5pY29kZSBgc3RyaW5nYCB0byBhbiBhcnJheS4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCiAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LgogICAgICAgKi8KICAgICAgZnVuY3Rpb24gdW5pY29kZVRvQXJyYXkoc3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChyZVVuaWNvZGUpIHx8IFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3BsaXRzIGEgVW5pY29kZSBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy4KICAgICAgICoKICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFRoZSBzdHJpbmcgdG8gaW5zcGVjdC4KICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC4KICAgICAgICovCiAgICAgIGZ1bmN0aW9uIHVuaWNvZGVXb3JkcyhzdHJpbmcpIHsKICAgICAgICByZXR1cm4gc3RyaW5nLm1hdGNoKHJlVW5pY29kZVdvcmQpIHx8IFtdOwogICAgICB9CgogICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGUgYSBuZXcgcHJpc3RpbmUgYGxvZGFzaGAgZnVuY3Rpb24gdXNpbmcgdGhlIGBjb250ZXh0YCBvYmplY3QuCiAgICAgICAqCiAgICAgICAqIEBzdGF0aWMKICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICogQHNpbmNlIDEuMS4wCiAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbY29udGV4dD1yb290XSBUaGUgY29udGV4dCBvYmplY3QuCiAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBhIG5ldyBgbG9kYXNoYCBmdW5jdGlvbi4KICAgICAgICogQGV4YW1wbGUKICAgICAgICoKICAgICAgICogXy5taXhpbih7ICdmb28nOiBfLmNvbnN0YW50KCdmb28nKSB9KTsKICAgICAgICoKICAgICAgICogdmFyIGxvZGFzaCA9IF8ucnVuSW5Db250ZXh0KCk7CiAgICAgICAqIGxvZGFzaC5taXhpbih7ICdiYXInOiBsb2Rhc2guY29uc3RhbnQoJ2JhcicpIH0pOwogICAgICAgKgogICAgICAgKiBfLmlzRnVuY3Rpb24oXy5mb28pOwogICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAqIF8uaXNGdW5jdGlvbihfLmJhcik7CiAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAqCiAgICAgICAqIGxvZGFzaC5pc0Z1bmN0aW9uKGxvZGFzaC5mb28pOwogICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgKiBsb2Rhc2guaXNGdW5jdGlvbihsb2Rhc2guYmFyKTsKICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgKgogICAgICAgKiAvLyBDcmVhdGUgYSBzdXBlZC11cCBgZGVmZXJgIGluIE5vZGUuanMuCiAgICAgICAqIHZhciBkZWZlciA9IF8ucnVuSW5Db250ZXh0KHsgJ3NldFRpbWVvdXQnOiBzZXRJbW1lZGlhdGUgfSkuZGVmZXI7CiAgICAgICAqLwogICAgICB2YXIgcnVuSW5Db250ZXh0ID0gKGZ1bmN0aW9uIHJ1bkluQ29udGV4dChjb250ZXh0KSB7CiAgICAgICAgY29udGV4dCA9IGNvbnRleHQgPT0gbnVsbCA/IHJvb3QgOiBfLmRlZmF1bHRzKHJvb3QuT2JqZWN0KCksIGNvbnRleHQsIF8ucGljayhyb290LCBjb250ZXh0UHJvcHMpKTsKCiAgICAgICAgLyoqIEJ1aWx0LWluIGNvbnN0cnVjdG9yIHJlZmVyZW5jZXMuICovCiAgICAgICAgdmFyIEFycmF5ID0gY29udGV4dC5BcnJheSwKICAgICAgICAgICAgRGF0ZSA9IGNvbnRleHQuRGF0ZSwKICAgICAgICAgICAgRXJyb3IgPSBjb250ZXh0LkVycm9yLAogICAgICAgICAgICBGdW5jdGlvbiA9IGNvbnRleHQuRnVuY3Rpb24sCiAgICAgICAgICAgIE1hdGggPSBjb250ZXh0Lk1hdGgsCiAgICAgICAgICAgIE9iamVjdCA9IGNvbnRleHQuT2JqZWN0LAogICAgICAgICAgICBSZWdFeHAgPSBjb250ZXh0LlJlZ0V4cCwKICAgICAgICAgICAgU3RyaW5nID0gY29udGV4dC5TdHJpbmcsCiAgICAgICAgICAgIFR5cGVFcnJvciA9IGNvbnRleHQuVHlwZUVycm9yOwoKICAgICAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovCiAgICAgICAgdmFyIGFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsCiAgICAgICAgICAgIGZ1bmNQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZSwKICAgICAgICAgICAgb2JqZWN0UHJvdG8gPSBPYmplY3QucHJvdG90eXBlOwoKICAgICAgICAvKiogVXNlZCB0byBkZXRlY3Qgb3ZlcnJlYWNoaW5nIGNvcmUtanMgc2hpbXMuICovCiAgICAgICAgdmFyIGNvcmVKc0RhdGEgPSBjb250ZXh0WydfX2NvcmUtanNfc2hhcmVkX18nXTsKCiAgICAgICAgLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqLwogICAgICAgIHZhciBmdW5jVG9TdHJpbmcgPSBmdW5jUHJvdG8udG9TdHJpbmc7CgogICAgICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgICAgIHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdFByb3RvLmhhc093blByb3BlcnR5OwoKICAgICAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqLwogICAgICAgIHZhciBpZENvdW50ZXIgPSAwOwoKICAgICAgICAvKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqLwogICAgICAgIHZhciBtYXNrU3JjS2V5ID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHVpZCA9IC9bXi5dKyQvLmV4ZWMoY29yZUpzRGF0YSAmJiBjb3JlSnNEYXRhLmtleXMgJiYgY29yZUpzRGF0YS5rZXlzLklFX1BST1RPIHx8ICcnKTsKICAgICAgICAgIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJzsKICAgICAgICB9KCkpOwoKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIHRvIHJlc29sdmUgdGhlCiAgICAgICAgICogW2B0b1N0cmluZ1RhZ2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5wcm90b3R5cGUudG9zdHJpbmcpCiAgICAgICAgICogb2YgdmFsdWVzLgogICAgICAgICAqLwogICAgICAgIHZhciBuYXRpdmVPYmplY3RUb1N0cmluZyA9IG9iamVjdFByb3RvLnRvU3RyaW5nOwoKICAgICAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovCiAgICAgICAgdmFyIG9iamVjdEN0b3JTdHJpbmcgPSBmdW5jVG9TdHJpbmcuY2FsbChPYmplY3QpOwoKICAgICAgICAvKiogVXNlZCB0byByZXN0b3JlIHRoZSBvcmlnaW5hbCBgX2AgcmVmZXJlbmNlIGluIGBfLm5vQ29uZmxpY3RgLiAqLwogICAgICAgIHZhciBvbGREYXNoID0gcm9vdC5fOwoKICAgICAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqLwogICAgICAgIHZhciByZUlzTmF0aXZlID0gUmVnRXhwKCdeJyArCiAgICAgICAgICBmdW5jVG9TdHJpbmcuY2FsbChoYXNPd25Qcm9wZXJ0eSkucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXCQmJykKICAgICAgICAgIC5yZXBsYWNlKC9oYXNPd25Qcm9wZXJ0eXwoZnVuY3Rpb24pLio/KD89XFxcKCl8IGZvciAuKz8oPz1cXFxdKS9nLCAnJDEuKj8nKSArICckJwogICAgICAgICk7CgogICAgICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqLwogICAgICAgIHZhciBCdWZmZXIgPSBtb2R1bGVFeHBvcnRzID8gY29udGV4dC5CdWZmZXIgOiB1bmRlZmluZWQkMSwKICAgICAgICAgICAgU3ltYm9sID0gY29udGV4dC5TeW1ib2wsCiAgICAgICAgICAgIFVpbnQ4QXJyYXkgPSBjb250ZXh0LlVpbnQ4QXJyYXksCiAgICAgICAgICAgIGFsbG9jVW5zYWZlID0gQnVmZmVyID8gQnVmZmVyLmFsbG9jVW5zYWZlIDogdW5kZWZpbmVkJDEsCiAgICAgICAgICAgIGdldFByb3RvdHlwZSA9IG92ZXJBcmcoT2JqZWN0LmdldFByb3RvdHlwZU9mLCBPYmplY3QpLAogICAgICAgICAgICBvYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlLAogICAgICAgICAgICBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvLnByb3BlcnR5SXNFbnVtZXJhYmxlLAogICAgICAgICAgICBzcGxpY2UgPSBhcnJheVByb3RvLnNwbGljZSwKICAgICAgICAgICAgc3ByZWFkYWJsZVN5bWJvbCA9IFN5bWJvbCA/IFN5bWJvbC5pc0NvbmNhdFNwcmVhZGFibGUgOiB1bmRlZmluZWQkMSwKICAgICAgICAgICAgc3ltSXRlcmF0b3IgPSBTeW1ib2wgPyBTeW1ib2wuaXRlcmF0b3IgOiB1bmRlZmluZWQkMSwKICAgICAgICAgICAgc3ltVG9TdHJpbmdUYWcgPSBTeW1ib2wgPyBTeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQkMTsKCiAgICAgICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkgewogICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgdmFyIGZ1bmMgPSBnZXROYXRpdmUoT2JqZWN0LCAnZGVmaW5lUHJvcGVydHknKTsKICAgICAgICAgICAgZnVuYyh7fSwgJycsIHt9KTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIH0oKSk7CgogICAgICAgIC8qKiBNb2NrZWQgYnVpbHQtaW5zLiAqLwogICAgICAgIHZhciBjdHhDbGVhclRpbWVvdXQgPSBjb250ZXh0LmNsZWFyVGltZW91dCAhPT0gcm9vdC5jbGVhclRpbWVvdXQgJiYgY29udGV4dC5jbGVhclRpbWVvdXQsCiAgICAgICAgICAgIGN0eE5vdyA9IERhdGUgJiYgRGF0ZS5ub3cgIT09IHJvb3QuRGF0ZS5ub3cgJiYgRGF0ZS5ub3csCiAgICAgICAgICAgIGN0eFNldFRpbWVvdXQgPSBjb250ZXh0LnNldFRpbWVvdXQgIT09IHJvb3Quc2V0VGltZW91dCAmJiBjb250ZXh0LnNldFRpbWVvdXQ7CgogICAgICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KICAgICAgICB2YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbCwKICAgICAgICAgICAgbmF0aXZlRmxvb3IgPSBNYXRoLmZsb29yLAogICAgICAgICAgICBuYXRpdmVHZXRTeW1ib2xzID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scywKICAgICAgICAgICAgbmF0aXZlSXNCdWZmZXIgPSBCdWZmZXIgPyBCdWZmZXIuaXNCdWZmZXIgOiB1bmRlZmluZWQkMSwKICAgICAgICAgICAgbmF0aXZlSXNGaW5pdGUgPSBjb250ZXh0LmlzRmluaXRlLAogICAgICAgICAgICBuYXRpdmVKb2luID0gYXJyYXlQcm90by5qb2luLAogICAgICAgICAgICBuYXRpdmVLZXlzID0gb3ZlckFyZyhPYmplY3Qua2V5cywgT2JqZWN0KSwKICAgICAgICAgICAgbmF0aXZlTWF4ID0gTWF0aC5tYXgsCiAgICAgICAgICAgIG5hdGl2ZU1pbiA9IE1hdGgubWluLAogICAgICAgICAgICBuYXRpdmVOb3cgPSBEYXRlLm5vdywKICAgICAgICAgICAgbmF0aXZlUGFyc2VJbnQgPSBjb250ZXh0LnBhcnNlSW50LAogICAgICAgICAgICBuYXRpdmVSYW5kb20gPSBNYXRoLnJhbmRvbSwKICAgICAgICAgICAgbmF0aXZlUmV2ZXJzZSA9IGFycmF5UHJvdG8ucmV2ZXJzZTsKCiAgICAgICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqLwogICAgICAgIHZhciBEYXRhVmlldyA9IGdldE5hdGl2ZShjb250ZXh0LCAnRGF0YVZpZXcnKSwKICAgICAgICAgICAgTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdNYXAnKSwKICAgICAgICAgICAgUHJvbWlzZSA9IGdldE5hdGl2ZShjb250ZXh0LCAnUHJvbWlzZScpLAogICAgICAgICAgICBTZXQgPSBnZXROYXRpdmUoY29udGV4dCwgJ1NldCcpLAogICAgICAgICAgICBXZWFrTWFwID0gZ2V0TmF0aXZlKGNvbnRleHQsICdXZWFrTWFwJyksCiAgICAgICAgICAgIG5hdGl2ZUNyZWF0ZSA9IGdldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTsKCiAgICAgICAgLyoqIFVzZWQgdG8gc3RvcmUgZnVuY3Rpb24gbWV0YWRhdGEuICovCiAgICAgICAgdmFyIG1ldGFNYXAgPSBXZWFrTWFwICYmIG5ldyBXZWFrTWFwOwoKICAgICAgICAvKiogVXNlZCB0byBsb29rdXAgdW5taW5pZmllZCBmdW5jdGlvbiBuYW1lcy4gKi8KICAgICAgICB2YXIgcmVhbE5hbWVzID0ge307CgogICAgICAgIC8qKiBVc2VkIHRvIGRldGVjdCBtYXBzLCBzZXRzLCBhbmQgd2Vha21hcHMuICovCiAgICAgICAgdmFyIGRhdGFWaWV3Q3RvclN0cmluZyA9IHRvU291cmNlKERhdGFWaWV3KSwKICAgICAgICAgICAgbWFwQ3RvclN0cmluZyA9IHRvU291cmNlKE1hcCksCiAgICAgICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gdG9Tb3VyY2UoUHJvbWlzZSksCiAgICAgICAgICAgIHNldEN0b3JTdHJpbmcgPSB0b1NvdXJjZShTZXQpLAogICAgICAgICAgICB3ZWFrTWFwQ3RvclN0cmluZyA9IHRvU291cmNlKFdlYWtNYXApOwoKICAgICAgICAvKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi8KICAgICAgICB2YXIgc3ltYm9sUHJvdG8gPSBTeW1ib2wgPyBTeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkJDEsCiAgICAgICAgICAgIHN5bWJvbFZhbHVlT2YgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnZhbHVlT2YgOiB1bmRlZmluZWQkMSwKICAgICAgICAgICAgc3ltYm9sVG9TdHJpbmcgPSBzeW1ib2xQcm90byA/IHN5bWJvbFByb3RvLnRvU3RyaW5nIDogdW5kZWZpbmVkJDE7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBpbXBsaWNpdCBtZXRob2QKICAgICAgICAgKiBjaGFpbiBzZXF1ZW5jZXMuIE1ldGhvZHMgdGhhdCBvcGVyYXRlIG9uIGFuZCByZXR1cm4gYXJyYXlzLCBjb2xsZWN0aW9ucywKICAgICAgICAgKiBhbmQgZnVuY3Rpb25zIGNhbiBiZSBjaGFpbmVkIHRvZ2V0aGVyLiBNZXRob2RzIHRoYXQgcmV0cmlldmUgYSBzaW5nbGUgdmFsdWUKICAgICAgICAgKiBvciBtYXkgcmV0dXJuIGEgcHJpbWl0aXZlIHZhbHVlIHdpbGwgYXV0b21hdGljYWxseSBlbmQgdGhlIGNoYWluIHNlcXVlbmNlCiAgICAgICAgICogYW5kIHJldHVybiB0aGUgdW53cmFwcGVkIHZhbHVlLiBPdGhlcndpc2UsIHRoZSB2YWx1ZSBtdXN0IGJlIHVud3JhcHBlZAogICAgICAgICAqIHdpdGggYF8jdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogRXhwbGljaXQgY2hhaW4gc2VxdWVuY2VzLCB3aGljaCBtdXN0IGJlIHVud3JhcHBlZCB3aXRoIGBfI3ZhbHVlYCwgbWF5IGJlCiAgICAgICAgICogZW5hYmxlZCB1c2luZyBgXy5jaGFpbmAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZXhlY3V0aW9uIG9mIGNoYWluZWQgbWV0aG9kcyBpcyBsYXp5LCB0aGF0IGlzLCBpdCdzIGRlZmVycmVkIHVudGlsCiAgICAgICAgICogYF8jdmFsdWVgIGlzIGltcGxpY2l0bHkgb3IgZXhwbGljaXRseSBjYWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBMYXp5IGV2YWx1YXRpb24gYWxsb3dzIHNldmVyYWwgbWV0aG9kcyB0byBzdXBwb3J0IHNob3J0Y3V0IGZ1c2lvbi4KICAgICAgICAgKiBTaG9ydGN1dCBmdXNpb24gaXMgYW4gb3B0aW1pemF0aW9uIHRvIG1lcmdlIGl0ZXJhdGVlIGNhbGxzOyB0aGlzIGF2b2lkcwogICAgICAgICAqIHRoZSBjcmVhdGlvbiBvZiBpbnRlcm1lZGlhdGUgYXJyYXlzIGFuZCBjYW4gZ3JlYXRseSByZWR1Y2UgdGhlIG51bWJlciBvZgogICAgICAgICAqIGl0ZXJhdGVlIGV4ZWN1dGlvbnMuIFNlY3Rpb25zIG9mIGEgY2hhaW4gc2VxdWVuY2UgcXVhbGlmeSBmb3Igc2hvcnRjdXQKICAgICAgICAgKiBmdXNpb24gaWYgdGhlIHNlY3Rpb24gaXMgYXBwbGllZCB0byBhbiBhcnJheSBhbmQgaXRlcmF0ZWVzIGFjY2VwdCBvbmx5CiAgICAgICAgICogb25lIGFyZ3VtZW50LiBUaGUgaGV1cmlzdGljIGZvciB3aGV0aGVyIGEgc2VjdGlvbiBxdWFsaWZpZXMgZm9yIHNob3J0Y3V0CiAgICAgICAgICogZnVzaW9uIGlzIHN1YmplY3QgdG8gY2hhbmdlLgogICAgICAgICAqCiAgICAgICAgICogQ2hhaW5pbmcgaXMgc3VwcG9ydGVkIGluIGN1c3RvbSBidWlsZHMgYXMgbG9uZyBhcyB0aGUgYF8jdmFsdWVgIG1ldGhvZCBpcwogICAgICAgICAqIGRpcmVjdGx5IG9yIGluZGlyZWN0bHkgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkLgogICAgICAgICAqCiAgICAgICAgICogSW4gYWRkaXRpb24gdG8gbG9kYXNoIG1ldGhvZHMsIHdyYXBwZXJzIGhhdmUgYEFycmF5YCBhbmQgYFN0cmluZ2AgbWV0aG9kcy4KICAgICAgICAgKgogICAgICAgICAqIFRoZSB3cmFwcGVyIGBBcnJheWAgbWV0aG9kcyBhcmU6CiAgICAgICAgICogYGNvbmNhdGAsIGBqb2luYCwgYHBvcGAsIGBwdXNoYCwgYHNoaWZ0YCwgYHNvcnRgLCBgc3BsaWNlYCwgYW5kIGB1bnNoaWZ0YAogICAgICAgICAqCiAgICAgICAgICogVGhlIHdyYXBwZXIgYFN0cmluZ2AgbWV0aG9kcyBhcmU6CiAgICAgICAgICogYHJlcGxhY2VgIGFuZCBgc3BsaXRgCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgd3JhcHBlciBtZXRob2RzIHRoYXQgc3VwcG9ydCBzaG9ydGN1dCBmdXNpb24gYXJlOgogICAgICAgICAqIGBhdGAsIGBjb21wYWN0YCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwgYGRyb3BXaGlsZWAsIGBmaWx0ZXJgLCBgZmluZGAsCiAgICAgICAgICogYGZpbmRMYXN0YCwgYGhlYWRgLCBgaW5pdGlhbGAsIGBsYXN0YCwgYG1hcGAsIGByZWplY3RgLCBgcmV2ZXJzZWAsIGBzbGljZWAsCiAgICAgICAgICogYHRhaWxgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLCBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYW5kIGB0b0FycmF5YAogICAgICAgICAqCiAgICAgICAgICogVGhlIGNoYWluYWJsZSB3cmFwcGVyIG1ldGhvZHMgYXJlOgogICAgICAgICAqIGBhZnRlcmAsIGBhcnlgLCBgYXNzaWduYCwgYGFzc2lnbkluYCwgYGFzc2lnbkluV2l0aGAsIGBhc3NpZ25XaXRoYCwgYGF0YCwKICAgICAgICAgKiBgYmVmb3JlYCwgYGJpbmRgLCBgYmluZEFsbGAsIGBiaW5kS2V5YCwgYGNhc3RBcnJheWAsIGBjaGFpbmAsIGBjaHVua2AsCiAgICAgICAgICogYGNvbW1pdGAsIGBjb21wYWN0YCwgYGNvbmNhdGAsIGBjb25mb3Jtc2AsIGBjb25zdGFudGAsIGBjb3VudEJ5YCwgYGNyZWF0ZWAsCiAgICAgICAgICogYGN1cnJ5YCwgYGRlYm91bmNlYCwgYGRlZmF1bHRzYCwgYGRlZmF1bHRzRGVlcGAsIGBkZWZlcmAsIGBkZWxheWAsCiAgICAgICAgICogYGRpZmZlcmVuY2VgLCBgZGlmZmVyZW5jZUJ5YCwgYGRpZmZlcmVuY2VXaXRoYCwgYGRyb3BgLCBgZHJvcFJpZ2h0YCwKICAgICAgICAgKiBgZHJvcFJpZ2h0V2hpbGVgLCBgZHJvcFdoaWxlYCwgYGV4dGVuZGAsIGBleHRlbmRXaXRoYCwgYGZpbGxgLCBgZmlsdGVyYCwKICAgICAgICAgKiBgZmxhdE1hcGAsIGBmbGF0TWFwRGVlcGAsIGBmbGF0TWFwRGVwdGhgLCBgZmxhdHRlbmAsIGBmbGF0dGVuRGVlcGAsCiAgICAgICAgICogYGZsYXR0ZW5EZXB0aGAsIGBmbGlwYCwgYGZsb3dgLCBgZmxvd1JpZ2h0YCwgYGZyb21QYWlyc2AsIGBmdW5jdGlvbnNgLAogICAgICAgICAqIGBmdW5jdGlvbnNJbmAsIGBncm91cEJ5YCwgYGluaXRpYWxgLCBgaW50ZXJzZWN0aW9uYCwgYGludGVyc2VjdGlvbkJ5YCwKICAgICAgICAgKiBgaW50ZXJzZWN0aW9uV2l0aGAsIGBpbnZlcnRgLCBgaW52ZXJ0QnlgLCBgaW52b2tlTWFwYCwgYGl0ZXJhdGVlYCwgYGtleUJ5YCwKICAgICAgICAgKiBga2V5c2AsIGBrZXlzSW5gLCBgbWFwYCwgYG1hcEtleXNgLCBgbWFwVmFsdWVzYCwgYG1hdGNoZXNgLCBgbWF0Y2hlc1Byb3BlcnR5YCwKICAgICAgICAgKiBgbWVtb2l6ZWAsIGBtZXJnZWAsIGBtZXJnZVdpdGhgLCBgbWV0aG9kYCwgYG1ldGhvZE9mYCwgYG1peGluYCwgYG5lZ2F0ZWAsCiAgICAgICAgICogYG50aEFyZ2AsIGBvbWl0YCwgYG9taXRCeWAsIGBvbmNlYCwgYG9yZGVyQnlgLCBgb3ZlcmAsIGBvdmVyQXJnc2AsCiAgICAgICAgICogYG92ZXJFdmVyeWAsIGBvdmVyU29tZWAsIGBwYXJ0aWFsYCwgYHBhcnRpYWxSaWdodGAsIGBwYXJ0aXRpb25gLCBgcGlja2AsCiAgICAgICAgICogYHBpY2tCeWAsIGBwbGFudGAsIGBwcm9wZXJ0eWAsIGBwcm9wZXJ0eU9mYCwgYHB1bGxgLCBgcHVsbEFsbGAsIGBwdWxsQWxsQnlgLAogICAgICAgICAqIGBwdWxsQWxsV2l0aGAsIGBwdWxsQXRgLCBgcHVzaGAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlYXJnYCwgYHJlamVjdGAsCiAgICAgICAgICogYHJlbW92ZWAsIGByZXN0YCwgYHJldmVyc2VgLCBgc2FtcGxlU2l6ZWAsIGBzZXRgLCBgc2V0V2l0aGAsIGBzaHVmZmxlYCwKICAgICAgICAgKiBgc2xpY2VgLCBgc29ydGAsIGBzb3J0QnlgLCBgc3BsaWNlYCwgYHNwcmVhZGAsIGB0YWlsYCwgYHRha2VgLCBgdGFrZVJpZ2h0YCwKICAgICAgICAgKiBgdGFrZVJpZ2h0V2hpbGVgLCBgdGFrZVdoaWxlYCwgYHRhcGAsIGB0aHJvdHRsZWAsIGB0aHJ1YCwgYHRvQXJyYXlgLAogICAgICAgICAqIGB0b1BhaXJzYCwgYHRvUGFpcnNJbmAsIGB0b1BhdGhgLCBgdG9QbGFpbk9iamVjdGAsIGB0cmFuc2Zvcm1gLCBgdW5hcnlgLAogICAgICAgICAqIGB1bmlvbmAsIGB1bmlvbkJ5YCwgYHVuaW9uV2l0aGAsIGB1bmlxYCwgYHVuaXFCeWAsIGB1bmlxV2l0aGAsIGB1bnNldGAsCiAgICAgICAgICogYHVuc2hpZnRgLCBgdW56aXBgLCBgdW56aXBXaXRoYCwgYHVwZGF0ZWAsIGB1cGRhdGVXaXRoYCwgYHZhbHVlc2AsCiAgICAgICAgICogYHZhbHVlc0luYCwgYHdpdGhvdXRgLCBgd3JhcGAsIGB4b3JgLCBgeG9yQnlgLCBgeG9yV2l0aGAsIGB6aXBgLAogICAgICAgICAqIGB6aXBPYmplY3RgLCBgemlwT2JqZWN0RGVlcGAsIGFuZCBgemlwV2l0aGAKICAgICAgICAgKgogICAgICAgICAqIFRoZSB3cmFwcGVyIG1ldGhvZHMgdGhhdCBhcmUgKipub3QqKiBjaGFpbmFibGUgYnkgZGVmYXVsdCBhcmU6CiAgICAgICAgICogYGFkZGAsIGBhdHRlbXB0YCwgYGNhbWVsQ2FzZWAsIGBjYXBpdGFsaXplYCwgYGNlaWxgLCBgY2xhbXBgLCBgY2xvbmVgLAogICAgICAgICAqIGBjbG9uZURlZXBgLCBgY2xvbmVEZWVwV2l0aGAsIGBjbG9uZVdpdGhgLCBgY29uZm9ybXNUb2AsIGBkZWJ1cnJgLAogICAgICAgICAqIGBkZWZhdWx0VG9gLCBgZGl2aWRlYCwgYGVhY2hgLCBgZWFjaFJpZ2h0YCwgYGVuZHNXaXRoYCwgYGVxYCwgYGVzY2FwZWAsCiAgICAgICAgICogYGVzY2FwZVJlZ0V4cGAsIGBldmVyeWAsIGBmaW5kYCwgYGZpbmRJbmRleGAsIGBmaW5kS2V5YCwgYGZpbmRMYXN0YCwKICAgICAgICAgKiBgZmluZExhc3RJbmRleGAsIGBmaW5kTGFzdEtleWAsIGBmaXJzdGAsIGBmbG9vcmAsIGBmb3JFYWNoYCwgYGZvckVhY2hSaWdodGAsCiAgICAgICAgICogYGZvckluYCwgYGZvckluUmlnaHRgLCBgZm9yT3duYCwgYGZvck93blJpZ2h0YCwgYGdldGAsIGBndGAsIGBndGVgLCBgaGFzYCwKICAgICAgICAgKiBgaGFzSW5gLCBgaGVhZGAsIGBpZGVudGl0eWAsIGBpbmNsdWRlc2AsIGBpbmRleE9mYCwgYGluUmFuZ2VgLCBgaW52b2tlYCwKICAgICAgICAgKiBgaXNBcmd1bWVudHNgLCBgaXNBcnJheWAsIGBpc0FycmF5QnVmZmVyYCwgYGlzQXJyYXlMaWtlYCwgYGlzQXJyYXlMaWtlT2JqZWN0YCwKICAgICAgICAgKiBgaXNCb29sZWFuYCwgYGlzQnVmZmVyYCwgYGlzRGF0ZWAsIGBpc0VsZW1lbnRgLCBgaXNFbXB0eWAsIGBpc0VxdWFsYCwKICAgICAgICAgKiBgaXNFcXVhbFdpdGhgLCBgaXNFcnJvcmAsIGBpc0Zpbml0ZWAsIGBpc0Z1bmN0aW9uYCwgYGlzSW50ZWdlcmAsIGBpc0xlbmd0aGAsCiAgICAgICAgICogYGlzTWFwYCwgYGlzTWF0Y2hgLCBgaXNNYXRjaFdpdGhgLCBgaXNOYU5gLCBgaXNOYXRpdmVgLCBgaXNOaWxgLCBgaXNOdWxsYCwKICAgICAgICAgKiBgaXNOdW1iZXJgLCBgaXNPYmplY3RgLCBgaXNPYmplY3RMaWtlYCwgYGlzUGxhaW5PYmplY3RgLCBgaXNSZWdFeHBgLAogICAgICAgICAqIGBpc1NhZmVJbnRlZ2VyYCwgYGlzU2V0YCwgYGlzU3RyaW5nYCwgYGlzVW5kZWZpbmVkYCwgYGlzVHlwZWRBcnJheWAsCiAgICAgICAgICogYGlzV2Vha01hcGAsIGBpc1dlYWtTZXRgLCBgam9pbmAsIGBrZWJhYkNhc2VgLCBgbGFzdGAsIGBsYXN0SW5kZXhPZmAsCiAgICAgICAgICogYGxvd2VyQ2FzZWAsIGBsb3dlckZpcnN0YCwgYGx0YCwgYGx0ZWAsIGBtYXhgLCBgbWF4QnlgLCBgbWVhbmAsIGBtZWFuQnlgLAogICAgICAgICAqIGBtaW5gLCBgbWluQnlgLCBgbXVsdGlwbHlgLCBgbm9Db25mbGljdGAsIGBub29wYCwgYG5vd2AsIGBudGhgLCBgcGFkYCwKICAgICAgICAgKiBgcGFkRW5kYCwgYHBhZFN0YXJ0YCwgYHBhcnNlSW50YCwgYHBvcGAsIGByYW5kb21gLCBgcmVkdWNlYCwgYHJlZHVjZVJpZ2h0YCwKICAgICAgICAgKiBgcmVwZWF0YCwgYHJlc3VsdGAsIGByb3VuZGAsIGBydW5JbkNvbnRleHRgLCBgc2FtcGxlYCwgYHNoaWZ0YCwgYHNpemVgLAogICAgICAgICAqIGBzbmFrZUNhc2VgLCBgc29tZWAsIGBzb3J0ZWRJbmRleGAsIGBzb3J0ZWRJbmRleEJ5YCwgYHNvcnRlZExhc3RJbmRleGAsCiAgICAgICAgICogYHNvcnRlZExhc3RJbmRleEJ5YCwgYHN0YXJ0Q2FzZWAsIGBzdGFydHNXaXRoYCwgYHN0dWJBcnJheWAsIGBzdHViRmFsc2VgLAogICAgICAgICAqIGBzdHViT2JqZWN0YCwgYHN0dWJTdHJpbmdgLCBgc3R1YlRydWVgLCBgc3VidHJhY3RgLCBgc3VtYCwgYHN1bUJ5YCwKICAgICAgICAgKiBgdGVtcGxhdGVgLCBgdGltZXNgLCBgdG9GaW5pdGVgLCBgdG9JbnRlZ2VyYCwgYHRvSlNPTmAsIGB0b0xlbmd0aGAsCiAgICAgICAgICogYHRvTG93ZXJgLCBgdG9OdW1iZXJgLCBgdG9TYWZlSW50ZWdlcmAsIGB0b1N0cmluZ2AsIGB0b1VwcGVyYCwgYHRyaW1gLAogICAgICAgICAqIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGB0cnVuY2F0ZWAsIGB1bmVzY2FwZWAsIGB1bmlxdWVJZGAsIGB1cHBlckNhc2VgLAogICAgICAgICAqIGB1cHBlckZpcnN0YCwgYHZhbHVlYCwgYW5kIGB3b3Jkc2AKICAgICAgICAgKgogICAgICAgICAqIEBuYW1lIF8KICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAY2F0ZWdvcnkgU2VxCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JhcCBpbiBhIGBsb2Rhc2hgIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikgewogICAgICAgICAqICAgcmV0dXJuIG4gKiBuOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMiwgM10pOwogICAgICAgICAqCiAgICAgICAgICogLy8gUmV0dXJucyBhbiB1bndyYXBwZWQgdmFsdWUuCiAgICAgICAgICogd3JhcHBlZC5yZWR1Y2UoXy5hZGQpOwogICAgICAgICAqIC8vID0+IDYKICAgICAgICAgKgogICAgICAgICAqIC8vIFJldHVybnMgYSB3cmFwcGVkIHZhbHVlLgogICAgICAgICAqIHZhciBzcXVhcmVzID0gd3JhcHBlZC5tYXAoc3F1YXJlKTsKICAgICAgICAgKgogICAgICAgICAqIF8uaXNBcnJheShzcXVhcmVzKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FycmF5KHNxdWFyZXMudmFsdWUoKSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGxvZGFzaCh2YWx1ZSkgewogICAgICAgICAgaWYgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgIWlzQXJyYXkodmFsdWUpICYmICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikpIHsKICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTG9kYXNoV3JhcHBlcikgewogICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgJ19fd3JhcHBlZF9fJykpIHsKICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlckNsb25lKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNyZWF0ZWAgd2l0aG91dCBzdXBwb3J0IGZvciBhc3NpZ25pbmcKICAgICAgICAgKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgdmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7CiAgICAgICAgICBmdW5jdGlvbiBvYmplY3QoKSB7fQogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHByb3RvKSB7CiAgICAgICAgICAgIGlmICghaXNPYmplY3QocHJvdG8pKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmplY3RDcmVhdGUpIHsKICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0Q3JlYXRlKHByb3RvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmplY3QucHJvdG90eXBlID0gcHJvdG87CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBuZXcgb2JqZWN0OwogICAgICAgICAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgIH0oKSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBmdW5jdGlvbiB3aG9zZSBwcm90b3R5cGUgY2hhaW4gc2VxdWVuY2Ugd3JhcHBlcnMgaW5oZXJpdCBmcm9tLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlTG9kYXNoKCkgewogICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC4KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGNvbnN0cnVjdG9yIGZvciBjcmVhdGluZyBgbG9kYXNoYCB3cmFwcGVyIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbY2hhaW5BbGxdIEVuYWJsZSBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIExvZGFzaFdyYXBwZXIodmFsdWUsIGNoYWluQWxsKSB7CiAgICAgICAgICB0aGlzLl9fd3JhcHBlZF9fID0gdmFsdWU7CiAgICAgICAgICB0aGlzLl9fYWN0aW9uc19fID0gW107CiAgICAgICAgICB0aGlzLl9fY2hhaW5fXyA9ICEhY2hhaW5BbGw7CiAgICAgICAgICB0aGlzLl9faW5kZXhfXyA9IDA7CiAgICAgICAgICB0aGlzLl9fdmFsdWVzX18gPSB1bmRlZmluZWQkMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEJ5IGRlZmF1bHQsIHRoZSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzIHVzZWQgYnkgbG9kYXNoIGFyZSBsaWtlIHRob3NlIGluCiAgICAgICAgICogZW1iZWRkZWQgUnVieSAoRVJCKSBhcyB3ZWxsIGFzIEVTMjAxNSB0ZW1wbGF0ZSBzdHJpbmdzLiBDaGFuZ2UgdGhlCiAgICAgICAgICogZm9sbG93aW5nIHRlbXBsYXRlIHNldHRpbmdzIHRvIHVzZSBhbHRlcm5hdGl2ZSBkZWxpbWl0ZXJzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHR5cGUge09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBsb2Rhc2gudGVtcGxhdGVTZXR0aW5ncyA9IHsKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGBkYXRhYCBwcm9wZXJ0eSB2YWx1ZXMgdG8gYmUgSFRNTC1lc2NhcGVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKICAgICAgICAgICAqIEB0eXBlIHtSZWdFeHB9CiAgICAgICAgICAgKi8KICAgICAgICAgICdlc2NhcGUnOiByZUVzY2FwZSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFVzZWQgdG8gZGV0ZWN0IGNvZGUgdG8gYmUgZXZhbHVhdGVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKICAgICAgICAgICAqIEB0eXBlIHtSZWdFeHB9CiAgICAgICAgICAgKi8KICAgICAgICAgICdldmFsdWF0ZSc6IHJlRXZhbHVhdGUsCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBVc2VkIHRvIGRldGVjdCBgZGF0YWAgcHJvcGVydHkgdmFsdWVzIHRvIGluamVjdC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAbWVtYmVyT2YgXy50ZW1wbGF0ZVNldHRpbmdzCiAgICAgICAgICAgKiBAdHlwZSB7UmVnRXhwfQogICAgICAgICAgICovCiAgICAgICAgICAnaW50ZXJwb2xhdGUnOiByZUludGVycG9sYXRlLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogVXNlZCB0byByZWZlcmVuY2UgdGhlIGRhdGEgb2JqZWN0IGluIHRoZSB0ZW1wbGF0ZSB0ZXh0LgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKICAgICAgICAgICAqIEB0eXBlIHtzdHJpbmd9CiAgICAgICAgICAgKi8KICAgICAgICAgICd2YXJpYWJsZSc6ICcnLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogVXNlZCB0byBpbXBvcnQgdmFyaWFibGVzIGludG8gdGhlIGNvbXBpbGVkIHRlbXBsYXRlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBtZW1iZXJPZiBfLnRlbXBsYXRlU2V0dGluZ3MKICAgICAgICAgICAqIEB0eXBlIHtPYmplY3R9CiAgICAgICAgICAgKi8KICAgICAgICAgICdpbXBvcnRzJzogewoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBgbG9kYXNoYCBmdW5jdGlvbi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQG1lbWJlck9mIF8udGVtcGxhdGVTZXR0aW5ncy5pbXBvcnRzCiAgICAgICAgICAgICAqIEB0eXBlIHtGdW5jdGlvbn0KICAgICAgICAgICAgICovCiAgICAgICAgICAgICdfJzogbG9kYXNoCiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgICAgLy8gRW5zdXJlIHdyYXBwZXJzIGFyZSBpbnN0YW5jZXMgb2YgYGJhc2VMb2Rhc2hgLgogICAgICAgIGxvZGFzaC5wcm90b3R5cGUgPSBiYXNlTG9kYXNoLnByb3RvdHlwZTsKICAgICAgICBsb2Rhc2gucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gbG9kYXNoOwoKICAgICAgICBMb2Rhc2hXcmFwcGVyLnByb3RvdHlwZSA9IGJhc2VDcmVhdGUoYmFzZUxvZGFzaC5wcm90b3R5cGUpOwogICAgICAgIExvZGFzaFdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTG9kYXNoV3JhcHBlcjsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbGF6eSB3cmFwcGVyIG9iamVjdCB3aGljaCB3cmFwcyBgdmFsdWVgIHRvIGVuYWJsZSBsYXp5IGV2YWx1YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gTGF6eVdyYXBwZXIodmFsdWUpIHsKICAgICAgICAgIHRoaXMuX193cmFwcGVkX18gPSB2YWx1ZTsKICAgICAgICAgIHRoaXMuX19hY3Rpb25zX18gPSBbXTsKICAgICAgICAgIHRoaXMuX19kaXJfXyA9IDE7CiAgICAgICAgICB0aGlzLl9fZmlsdGVyZWRfXyA9IGZhbHNlOwogICAgICAgICAgdGhpcy5fX2l0ZXJhdGVlc19fID0gW107CiAgICAgICAgICB0aGlzLl9fdGFrZUNvdW50X18gPSBNQVhfQVJSQVlfTEVOR1RIOwogICAgICAgICAgdGhpcy5fX3ZpZXdzX18gPSBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiB0aGUgbGF6eSB3cmFwcGVyIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgY2xvbmUKICAgICAgICAgKiBAbWVtYmVyT2YgTGF6eVdyYXBwZXIKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgYExhenlXcmFwcGVyYCBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbGF6eUNsb25lKCkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMYXp5V3JhcHBlcih0aGlzLl9fd3JhcHBlZF9fKTsKICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTsKICAgICAgICAgIHJlc3VsdC5fX2Rpcl9fID0gdGhpcy5fX2Rpcl9fOwogICAgICAgICAgcmVzdWx0Ll9fZmlsdGVyZWRfXyA9IHRoaXMuX19maWx0ZXJlZF9fOwogICAgICAgICAgcmVzdWx0Ll9faXRlcmF0ZWVzX18gPSBjb3B5QXJyYXkodGhpcy5fX2l0ZXJhdGVlc19fKTsKICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gdGhpcy5fX3Rha2VDb3VudF9fOwogICAgICAgICAgcmVzdWx0Ll9fdmlld3NfXyA9IGNvcHlBcnJheSh0aGlzLl9fdmlld3NfXyk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV2ZXJzZXMgdGhlIGRpcmVjdGlvbiBvZiBsYXp5IGl0ZXJhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgcmV2ZXJzZQogICAgICAgICAqIEBtZW1iZXJPZiBMYXp5V3JhcHBlcgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyByZXZlcnNlZCBgTGF6eVdyYXBwZXJgIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBsYXp5UmV2ZXJzZSgpIHsKICAgICAgICAgIGlmICh0aGlzLl9fZmlsdGVyZWRfXykgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IExhenlXcmFwcGVyKHRoaXMpOwogICAgICAgICAgICByZXN1bHQuX19kaXJfXyA9IC0xOwogICAgICAgICAgICByZXN1bHQuX19maWx0ZXJlZF9fID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuY2xvbmUoKTsKICAgICAgICAgICAgcmVzdWx0Ll9fZGlyX18gKj0gLTE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0cmFjdHMgdGhlIHVud3JhcHBlZCB2YWx1ZSBmcm9tIGl0cyBsYXp5IHdyYXBwZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIHZhbHVlCiAgICAgICAgICogQG1lbWJlck9mIExhenlXcmFwcGVyCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHVud3JhcHBlZCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBsYXp5VmFsdWUoKSB7CiAgICAgICAgICB2YXIgYXJyYXkgPSB0aGlzLl9fd3JhcHBlZF9fLnZhbHVlKCksCiAgICAgICAgICAgICAgZGlyID0gdGhpcy5fX2Rpcl9fLAogICAgICAgICAgICAgIGlzQXJyID0gaXNBcnJheShhcnJheSksCiAgICAgICAgICAgICAgaXNSaWdodCA9IGRpciA8IDAsCiAgICAgICAgICAgICAgYXJyTGVuZ3RoID0gaXNBcnIgPyBhcnJheS5sZW5ndGggOiAwLAogICAgICAgICAgICAgIHZpZXcgPSBnZXRWaWV3KDAsIGFyckxlbmd0aCwgdGhpcy5fX3ZpZXdzX18pLAogICAgICAgICAgICAgIHN0YXJ0ID0gdmlldy5zdGFydCwKICAgICAgICAgICAgICBlbmQgPSB2aWV3LmVuZCwKICAgICAgICAgICAgICBsZW5ndGggPSBlbmQgLSBzdGFydCwKICAgICAgICAgICAgICBpbmRleCA9IGlzUmlnaHQgPyBlbmQgOiAoc3RhcnQgLSAxKSwKICAgICAgICAgICAgICBpdGVyYXRlZXMgPSB0aGlzLl9faXRlcmF0ZWVzX18sCiAgICAgICAgICAgICAgaXRlckxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGgsCiAgICAgICAgICAgICAgcmVzSW5kZXggPSAwLAogICAgICAgICAgICAgIHRha2VDb3VudCA9IG5hdGl2ZU1pbihsZW5ndGgsIHRoaXMuX190YWtlQ291bnRfXyk7CgogICAgICAgICAgaWYgKCFpc0FyciB8fCAoIWlzUmlnaHQgJiYgYXJyTGVuZ3RoID09IGxlbmd0aCAmJiB0YWtlQ291bnQgPT0gbGVuZ3RoKSkgewogICAgICAgICAgICByZXR1cm4gYmFzZVdyYXBwZXJWYWx1ZShhcnJheSwgdGhpcy5fX2FjdGlvbnNfXyk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVzdWx0ID0gW107CgogICAgICAgICAgb3V0ZXI6CiAgICAgICAgICB3aGlsZSAobGVuZ3RoLS0gJiYgcmVzSW5kZXggPCB0YWtlQ291bnQpIHsKICAgICAgICAgICAgaW5kZXggKz0gZGlyOwoKICAgICAgICAgICAgdmFyIGl0ZXJJbmRleCA9IC0xLAogICAgICAgICAgICAgICAgdmFsdWUgPSBhcnJheVtpbmRleF07CgogICAgICAgICAgICB3aGlsZSAoKytpdGVySW5kZXggPCBpdGVyTGVuZ3RoKSB7CiAgICAgICAgICAgICAgdmFyIGRhdGEgPSBpdGVyYXRlZXNbaXRlckluZGV4XSwKICAgICAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBkYXRhLml0ZXJhdGVlLAogICAgICAgICAgICAgICAgICB0eXBlID0gZGF0YS50eXBlLAogICAgICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHZhbHVlKTsKCiAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9NQVBfRkxBRykgewogICAgICAgICAgICAgICAgdmFsdWUgPSBjb21wdXRlZDsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFjb21wdXRlZCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGUgPT0gTEFaWV9GSUxURVJfRkxBRykgewogICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGJyZWFrIG91dGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvLyBFbnN1cmUgYExhenlXcmFwcGVyYCBpcyBhbiBpbnN0YW5jZSBvZiBgYmFzZUxvZGFzaGAuCiAgICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlID0gYmFzZUNyZWF0ZShiYXNlTG9kYXNoLnByb3RvdHlwZSk7CiAgICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF6eVdyYXBwZXI7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGhhc2ggb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBIYXNoKGVudHJpZXMpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDsKCiAgICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKICAgICAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGNsZWFyCiAgICAgICAgICogQG1lbWJlck9mIEhhc2gKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YV9fID0gbmF0aXZlQ3JlYXRlID8gbmF0aXZlQ3JlYXRlKG51bGwpIDoge307CiAgICAgICAgICB0aGlzLnNpemUgPSAwOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGRlbGV0ZQogICAgICAgICAqIEBtZW1iZXJPZiBIYXNoCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGhhc2ggVGhlIGhhc2ggdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuaGFzKGtleSkgJiYgZGVsZXRlIHRoaXMuX19kYXRhX19ba2V5XTsKICAgICAgICAgIHRoaXMuc2l6ZSAtPSByZXN1bHQgPyAxIDogMDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBoYXNoIHZhbHVlIGZvciBga2V5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgZ2V0CiAgICAgICAgICogQG1lbWJlck9mIEhhc2gKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZW50cnkgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaGFzaEdldChrZXkpIHsKICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgICAgIGlmIChuYXRpdmVDcmVhdGUpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gSEFTSF9VTkRFRklORUQgPyB1bmRlZmluZWQkMSA6IHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQkMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBhIGhhc2ggdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgaGFzCiAgICAgICAgICogQG1lbWJlck9mIEhhc2gKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaGFzaEhhcyhrZXkpIHsKICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgICAgIHJldHVybiBuYXRpdmVDcmVhdGUgPyAoZGF0YVtrZXldICE9PSB1bmRlZmluZWQkMSkgOiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGRhdGEsIGtleSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIHNldAogICAgICAgICAqIEBtZW1iZXJPZiBIYXNoCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGhhc2ggaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgICAgICB0aGlzLnNpemUgKz0gdGhpcy5oYXMoa2V5KSA/IDAgOiAxOwogICAgICAgICAgZGF0YVtrZXldID0gKG5hdGl2ZUNyZWF0ZSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkJDEpID8gSEFTSF9VTkRFRklORUQgOiB2YWx1ZTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLgogICAgICAgIEhhc2gucHJvdG90eXBlLmNsZWFyID0gaGFzaENsZWFyOwogICAgICAgIEhhc2gucHJvdG90eXBlWydkZWxldGUnXSA9IGhhc2hEZWxldGU7CiAgICAgICAgSGFzaC5wcm90b3R5cGUuZ2V0ID0gaGFzaEdldDsKICAgICAgICBIYXNoLnByb3RvdHlwZS5oYXMgPSBoYXNoSGFzOwogICAgICAgIEhhc2gucHJvdG90eXBlLnNldCA9IGhhc2hTZXQ7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDsKCiAgICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKICAgICAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGNsZWFyCiAgICAgICAgICogQG1lbWJlck9mIExpc3RDYWNoZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkgewogICAgICAgICAgdGhpcy5fX2RhdGFfXyA9IFtdOwogICAgICAgICAgdGhpcy5zaXplID0gMDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBsaXN0IGNhY2hlLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBkZWxldGUKICAgICAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHsKICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXywKICAgICAgICAgICAgICBpbmRleCA9IGFzc29jSW5kZXhPZihkYXRhLCBrZXkpOwoKICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGRhdGEubGVuZ3RoIC0gMTsKICAgICAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHsKICAgICAgICAgICAgZGF0YS5wb3AoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTsKICAgICAgICAgIH0KICAgICAgICAgIC0tdGhpcy5zaXplOwogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgZ2V0CiAgICAgICAgICogQG1lbWJlck9mIExpc3RDYWNoZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBsaXN0Q2FjaGVHZXQoa2V5KSB7CiAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sCiAgICAgICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTsKCiAgICAgICAgICByZXR1cm4gaW5kZXggPCAwID8gdW5kZWZpbmVkJDEgOiBkYXRhW2luZGV4XVsxXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgaGFzCiAgICAgICAgICogQG1lbWJlck9mIExpc3RDYWNoZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBsaXN0Q2FjaGVIYXMoa2V5KSB7CiAgICAgICAgICByZXR1cm4gYXNzb2NJbmRleE9mKHRoaXMuX19kYXRhX18sIGtleSkgPiAtMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGxpc3QgY2FjaGUgYGtleWAgdG8gYHZhbHVlYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgc2V0CiAgICAgICAgICogQG1lbWJlck9mIExpc3RDYWNoZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldC4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGxpc3RDYWNoZVNldChrZXksIHZhbHVlKSB7CiAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sCiAgICAgICAgICAgICAgaW5kZXggPSBhc3NvY0luZGV4T2YoZGF0YSwga2V5KTsKCiAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgICAgICsrdGhpcy5zaXplOwogICAgICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRhdGFbaW5kZXhdWzFdID0gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CgogICAgICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLgogICAgICAgIExpc3RDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBsaXN0Q2FjaGVDbGVhcjsKICAgICAgICBMaXN0Q2FjaGUucHJvdG90eXBlWydkZWxldGUnXSA9IGxpc3RDYWNoZURlbGV0ZTsKICAgICAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmdldCA9IGxpc3RDYWNoZUdldDsKICAgICAgICBMaXN0Q2FjaGUucHJvdG90eXBlLmhhcyA9IGxpc3RDYWNoZUhhczsKICAgICAgICBMaXN0Q2FjaGUucHJvdG90eXBlLnNldCA9IGxpc3RDYWNoZVNldDsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbWFwIGNhY2hlIG9iamVjdCB0byBzdG9yZSBrZXktdmFsdWUgcGFpcnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIE1hcENhY2hlKGVudHJpZXMpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDsKCiAgICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKICAgICAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgY2xlYXIKICAgICAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkgewogICAgICAgICAgdGhpcy5zaXplID0gMDsKICAgICAgICAgIHRoaXMuX19kYXRhX18gPSB7CiAgICAgICAgICAgICdoYXNoJzogbmV3IEhhc2gsCiAgICAgICAgICAgICdtYXAnOiBuZXcgKE1hcCB8fCBMaXN0Q2FjaGUpLAogICAgICAgICAgICAnc3RyaW5nJzogbmV3IEhhc2gKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgbWFwLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBkZWxldGUKICAgICAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpOwogICAgICAgICAgdGhpcy5zaXplIC09IHJlc3VsdCA/IDEgOiAwOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG1hcCB2YWx1ZSBmb3IgYGtleWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGdldAogICAgICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHsKICAgICAgICAgIHJldHVybiBnZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYSBtYXAgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgaGFzCiAgICAgICAgICogQG1lbWJlck9mIE1hcENhY2hlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1hcENhY2hlSGFzKGtleSkgewogICAgICAgICAgcmV0dXJuIGdldE1hcERhdGEodGhpcywga2V5KS5oYXMoa2V5KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBzZXQKICAgICAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbWFwIGNhY2hlIGluc3RhbmNlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHsKICAgICAgICAgIHZhciBkYXRhID0gZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLAogICAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7CgogICAgICAgICAgZGF0YS5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIG1ldGhvZHMgdG8gYE1hcENhY2hlYC4KICAgICAgICBNYXBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBtYXBDYWNoZUNsZWFyOwogICAgICAgIE1hcENhY2hlLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBtYXBDYWNoZURlbGV0ZTsKICAgICAgICBNYXBDYWNoZS5wcm90b3R5cGUuZ2V0ID0gbWFwQ2FjaGVHZXQ7CiAgICAgICAgTWFwQ2FjaGUucHJvdG90eXBlLmhhcyA9IG1hcENhY2hlSGFzOwogICAgICAgIE1hcENhY2hlLnByb3RvdHlwZS5zZXQgPSBtYXBDYWNoZVNldDsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIHVuaXF1ZSB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gY2FjaGUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gU2V0Q2FjaGUodmFsdWVzKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoOwoKICAgICAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgTWFwQ2FjaGU7CiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB0aGlzLmFkZCh2YWx1ZXNbaW5kZXhdKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYHZhbHVlYCB0byB0aGUgYXJyYXkgY2FjaGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGFkZAogICAgICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZQogICAgICAgICAqIEBhbGlhcyBwdXNoCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2FjaGUuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc2V0Q2FjaGVBZGQodmFsdWUpIHsKICAgICAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCk7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGluIHRoZSBhcnJheSBjYWNoZS4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgaGFzCiAgICAgICAgICogQG1lbWJlck9mIFNldENhY2hlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmhhcyh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLgogICAgICAgIFNldENhY2hlLnByb3RvdHlwZS5hZGQgPSBTZXRDYWNoZS5wcm90b3R5cGUucHVzaCA9IHNldENhY2hlQWRkOwogICAgICAgIFNldENhY2hlLnByb3RvdHlwZS5oYXMgPSBzZXRDYWNoZUhhczsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc3RhY2sgY2FjaGUgb2JqZWN0IHRvIHN0b3JlIGtleS12YWx1ZSBwYWlycy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gU3RhY2soZW50cmllcykgewogICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZShlbnRyaWVzKTsKICAgICAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBjbGVhcgogICAgICAgICAqIEBtZW1iZXJPZiBTdGFjawogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YV9fID0gbmV3IExpc3RDYWNoZTsKICAgICAgICAgIHRoaXMuc2l6ZSA9IDA7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGBrZXlgIGFuZCBpdHMgdmFsdWUgZnJvbSB0aGUgc3RhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGRlbGV0ZQogICAgICAgICAqIEBtZW1iZXJPZiBTdGFjawogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzdGFja0RlbGV0ZShrZXkpIHsKICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXywKICAgICAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpOwoKICAgICAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBzdGFjayB2YWx1ZSBmb3IgYGtleWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBuYW1lIGdldAogICAgICAgICAqIEBtZW1iZXJPZiBTdGFjawogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzdGFja0dldChrZXkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fZGF0YV9fLmdldChrZXkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQG5hbWUgaGFzCiAgICAgICAgICogQG1lbWJlck9mIFN0YWNrCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0YWNrSGFzKGtleSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBzdGFjayBga2V5YCB0byBgdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAbmFtZSBzZXQKICAgICAgICAgKiBAbWVtYmVyT2YgU3RhY2sKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHNldC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc3RhY2tTZXQoa2V5LCB2YWx1ZSkgewogICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fOwogICAgICAgICAgaWYgKGRhdGEgaW5zdGFuY2VvZiBMaXN0Q2FjaGUpIHsKICAgICAgICAgICAgdmFyIHBhaXJzID0gZGF0YS5fX2RhdGFfXzsKICAgICAgICAgICAgaWYgKCFNYXAgfHwgKHBhaXJzLmxlbmd0aCA8IExBUkdFX0FSUkFZX1NJWkUgLSAxKSkgewogICAgICAgICAgICAgIHBhaXJzLnB1c2goW2tleSwgdmFsdWVdKTsKICAgICAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTsKICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBNYXBDYWNoZShwYWlycyk7CiAgICAgICAgICB9CiAgICAgICAgICBkYXRhLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgIHRoaXMuc2l6ZSA9IGRhdGEuc2l6ZTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KCiAgICAgICAgLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC4KICAgICAgICBTdGFjay5wcm90b3R5cGUuY2xlYXIgPSBzdGFja0NsZWFyOwogICAgICAgIFN0YWNrLnByb3RvdHlwZVsnZGVsZXRlJ10gPSBzdGFja0RlbGV0ZTsKICAgICAgICBTdGFjay5wcm90b3R5cGUuZ2V0ID0gc3RhY2tHZXQ7CiAgICAgICAgU3RhY2sucHJvdG90eXBlLmhhcyA9IHN0YWNrSGFzOwogICAgICAgIFN0YWNrLnByb3RvdHlwZS5zZXQgPSBzdGFja1NldDsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaW5oZXJpdGVkIFNwZWNpZnkgcmV0dXJuaW5nIGluaGVyaXRlZCBwcm9wZXJ0eSBuYW1lcy4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGFycmF5TGlrZUtleXModmFsdWUsIGluaGVyaXRlZCkgewogICAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheSh2YWx1ZSksCiAgICAgICAgICAgICAgaXNBcmcgPSAhaXNBcnIgJiYgaXNBcmd1bWVudHModmFsdWUpLAogICAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXIodmFsdWUpLAogICAgICAgICAgICAgIGlzVHlwZSA9ICFpc0FyciAmJiAhaXNBcmcgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXkodmFsdWUpLAogICAgICAgICAgICAgIHNraXBJbmRleGVzID0gaXNBcnIgfHwgaXNBcmcgfHwgaXNCdWZmIHx8IGlzVHlwZSwKICAgICAgICAgICAgICByZXN1bHQgPSBza2lwSW5kZXhlcyA/IGJhc2VUaW1lcyh2YWx1ZS5sZW5ndGgsIFN0cmluZykgOiBbXSwKICAgICAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOwoKICAgICAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgICAgICAgICBpZiAoKGluaGVyaXRlZCB8fCBoYXNPd25Qcm9wZXJ0eS5jYWxsKHZhbHVlLCBrZXkpKSAmJgogICAgICAgICAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoCiAgICAgICAgICAgICAgICAgICAvLyBTYWZhcmkgOSBoYXMgZW51bWVyYWJsZSBgYXJndW1lbnRzLmxlbmd0aGAgaW4gc3RyaWN0IG1vZGUuCiAgICAgICAgICAgICAgICAgICBrZXkgPT0gJ2xlbmd0aCcgfHwKICAgICAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLgogICAgICAgICAgICAgICAgICAgKGlzQnVmZiAmJiAoa2V5ID09ICdvZmZzZXQnIHx8IGtleSA9PSAncGFyZW50JykpIHx8CiAgICAgICAgICAgICAgICAgICAvLyBQaGFudG9tSlMgMiBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiB0eXBlZCBhcnJheXMuCiAgICAgICAgICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHwKICAgICAgICAgICAgICAgICAgIC8vIFNraXAgaW5kZXggcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgIGlzSW5kZXgoa2V5LCBsZW5ndGgpCiAgICAgICAgICAgICAgICApKSkgewogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc2FtcGxlYCBmb3IgYXJyYXlzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2FtcGxlLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBhcnJheVNhbXBsZShhcnJheSkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtiYXNlUmFuZG9tKDAsIGxlbmd0aCAtIDEpXSA6IHVuZGVmaW5lZCQxOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNhbXBsZVNpemVgIGZvciBhcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzYW1wbGUuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYXJyYXlTYW1wbGVTaXplKGFycmF5LCBuKSB7CiAgICAgICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoY29weUFycmF5KGFycmF5KSwgYmFzZUNsYW1wKG4sIDAsIGFycmF5Lmxlbmd0aCkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIGZvciBhcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzaHVmZmxlLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGFycmF5U2h1ZmZsZShhcnJheSkgewogICAgICAgICAgcmV0dXJuIHNodWZmbGVTZWxmKGNvcHlBcnJheShhcnJheSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlIGBhc3NpZ25WYWx1ZWAgZXhjZXB0IHRoYXQgaXQgZG9lc24ndCBhc3NpZ24KICAgICAgICAgKiBgdW5kZWZpbmVkYCB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7CiAgICAgICAgICBpZiAoKHZhbHVlICE9PSB1bmRlZmluZWQkMSAmJiAhZXEob2JqZWN0W2tleV0sIHZhbHVlKSkgfHwKICAgICAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCQxICYmICEoa2V5IGluIG9iamVjdCkpKSB7CiAgICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudAogICAgICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHsKICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldOwogICAgICAgICAgaWYgKCEoaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkgJiYgZXEob2JqVmFsdWUsIHZhbHVlKSkgfHwKICAgICAgICAgICAgICAodmFsdWUgPT09IHVuZGVmaW5lZCQxICYmICEoa2V5IGluIG9iamVjdCkpKSB7CiAgICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgaW5kZXggYXQgd2hpY2ggdGhlIGBrZXlgIGlzIGZvdW5kIGluIGBhcnJheWAgb2Yga2V5LXZhbHVlIHBhaXJzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IGtleSBUaGUga2V5IHRvIHNlYXJjaCBmb3IuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBhc3NvY0luZGV4T2YoYXJyYXksIGtleSkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICBpZiAoZXEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkgewogICAgICAgICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEFnZ3JlZ2F0ZXMgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gIG9uIGBhY2N1bXVsYXRvcmAgd2l0aCBrZXlzIHRyYW5zZm9ybWVkCiAgICAgICAgICogYnkgYGl0ZXJhdGVlYCBhbmQgdmFsdWVzIHNldCBieSBgc2V0dGVyYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0ga2V5cy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gYWNjdW11bGF0b3IgVGhlIGluaXRpYWwgYWdncmVnYXRlZCBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUFnZ3JlZ2F0b3IoY29sbGVjdGlvbiwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHsKICAgICAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKICAgICAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaXRlcmF0ZWUodmFsdWUpLCBjb2xsZWN0aW9uKTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMKICAgICAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgJiYgY29weU9iamVjdChzb3VyY2UsIGtleXMoc291cmNlKSwgb2JqZWN0KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmFzc2lnbkluYCB3aXRob3V0IHN1cHBvcnQgZm9yIG11bHRpcGxlIHNvdXJjZXMKICAgICAgICAgKiBvciBgY3VzdG9taXplcmAgZnVuY3Rpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCAmJiBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgYXNzaWduVmFsdWVgIGFuZCBgYXNzaWduTWVyZ2VWYWx1ZWAgd2l0aG91dAogICAgICAgICAqIHZhbHVlIGNoZWNrcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkgewogICAgICAgICAgaWYgKGtleSA9PSAnX19wcm90b19fJyAmJiBkZWZpbmVQcm9wZXJ0eSkgewogICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwgewogICAgICAgICAgICAgICdjb25maWd1cmFibGUnOiB0cnVlLAogICAgICAgICAgICAgICdlbnVtZXJhYmxlJzogdHJ1ZSwKICAgICAgICAgICAgICAndmFsdWUnOiB2YWx1ZSwKICAgICAgICAgICAgICAnd3JpdGFibGUnOiB0cnVlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmF0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWwgcGF0aHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgZWxlbWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUF0KG9iamVjdCwgcGF0aHMpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCwKICAgICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpLAogICAgICAgICAgICAgIHNraXAgPSBvYmplY3QgPT0gbnVsbDsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gc2tpcCA/IHVuZGVmaW5lZCQxIDogZ2V0KG9iamVjdCwgcGF0aHNbaW5kZXhdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jbGFtcGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUNsYW1wKG51bWJlciwgbG93ZXIsIHVwcGVyKSB7CiAgICAgICAgICBpZiAobnVtYmVyID09PSBudW1iZXIpIHsKICAgICAgICAgICAgaWYgKHVwcGVyICE9PSB1bmRlZmluZWQkMSkgewogICAgICAgICAgICAgIG51bWJlciA9IG51bWJlciA8PSB1cHBlciA/IG51bWJlciA6IHVwcGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsb3dlciAhPT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICBudW1iZXIgPSBudW1iZXIgPj0gbG93ZXIgPyBudW1iZXIgOiBsb3dlcjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG51bWJlcjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3MKICAgICAgICAgKiB0cmF2ZXJzZWQgb2JqZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLgogICAgICAgICAqICAxIC0gRGVlcCBjbG9uZQogICAgICAgICAqICAyIC0gRmxhdHRlbiBpbmhlcml0ZWQgcHJvcGVydGllcwogICAgICAgICAqICA0IC0gQ2xvbmUgc3ltYm9scwogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtrZXldIFRoZSBrZXkgb2YgYHZhbHVlYC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIHBhcmVudCBvYmplY3Qgb2YgYHZhbHVlYC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7CiAgICAgICAgICB2YXIgcmVzdWx0LAogICAgICAgICAgICAgIGlzRGVlcCA9IGJpdG1hc2sgJiBDTE9ORV9ERUVQX0ZMQUcsCiAgICAgICAgICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRywKICAgICAgICAgICAgICBpc0Z1bGwgPSBiaXRtYXNrICYgQ0xPTkVfU1lNQk9MU19GTEFHOwoKICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQgIT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWlzT2JqZWN0KHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHZhbHVlKTsKICAgICAgICAgIGlmIChpc0FycikgewogICAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVBcnJheSh2YWx1ZSk7CiAgICAgICAgICAgIGlmICghaXNEZWVwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNvcHlBcnJheSh2YWx1ZSwgcmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHRhZyA9IGdldFRhZyh2YWx1ZSksCiAgICAgICAgICAgICAgICBpc0Z1bmMgPSB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnOwoKICAgICAgICAgICAgaWYgKGlzQnVmZmVyKHZhbHVlKSkgewogICAgICAgICAgICAgIHJldHVybiBjbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFnID09IG9iamVjdFRhZyB8fCB0YWcgPT0gYXJnc1RhZyB8fCAoaXNGdW5jICYmICFvYmplY3QpKSB7CiAgICAgICAgICAgICAgcmVzdWx0ID0gKGlzRmxhdCB8fCBpc0Z1bmMpID8ge30gOiBpbml0Q2xvbmVPYmplY3QodmFsdWUpOwogICAgICAgICAgICAgIGlmICghaXNEZWVwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXNGbGF0CiAgICAgICAgICAgICAgICAgID8gY29weVN5bWJvbHNJbih2YWx1ZSwgYmFzZUFzc2lnbkluKHJlc3VsdCwgdmFsdWUpKQogICAgICAgICAgICAgICAgICA6IGNvcHlTeW1ib2xzKHZhbHVlLCBiYXNlQXNzaWduKHJlc3VsdCwgdmFsdWUpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKCFjbG9uZWFibGVUYWdzW3RhZ10pIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYmplY3QgPyB2YWx1ZSA6IHt9OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXN1bHQgPSBpbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLgogICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTsKICAgICAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KHZhbHVlKTsKICAgICAgICAgIGlmIChzdGFja2VkKSB7CiAgICAgICAgICAgIHJldHVybiBzdGFja2VkOwogICAgICAgICAgfQogICAgICAgICAgc3RhY2suc2V0KHZhbHVlLCByZXN1bHQpOwoKICAgICAgICAgIGlmIChpc1NldCh2YWx1ZSkpIHsKICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSkgewogICAgICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIGlmIChpc01hcCh2YWx1ZSkpIHsKICAgICAgICAgICAgdmFsdWUuZm9yRWFjaChmdW5jdGlvbihzdWJWYWx1ZSwga2V5KSB7CiAgICAgICAgICAgICAgcmVzdWx0LnNldChrZXksIGJhc2VDbG9uZShzdWJWYWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCB2YWx1ZSwgc3RhY2spKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGtleXNGdW5jID0gaXNGdWxsCiAgICAgICAgICAgID8gKGlzRmxhdCA/IGdldEFsbEtleXNJbiA6IGdldEFsbEtleXMpCiAgICAgICAgICAgIDogKGlzRmxhdCA/IGtleXNJbiA6IGtleXMpOwoKICAgICAgICAgIHZhciBwcm9wcyA9IGlzQXJyID8gdW5kZWZpbmVkJDEgOiBrZXlzRnVuYyh2YWx1ZSk7CiAgICAgICAgICBhcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICAgICAga2V5ID0gc3ViVmFsdWU7CiAgICAgICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IHBvcHVsYXRlIGNsb25lIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCiAgICAgICAgICAgIGFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jb25mb3Jtc2Agd2hpY2ggZG9lc24ndCBjbG9uZSBgc291cmNlYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHByZWRpY2F0ZXMgdG8gY29uZm9ybSB0by4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtcyhzb3VyY2UpIHsKICAgICAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICAgICAgcmV0dXJuIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcyk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uY29uZm9ybXNUb2Agd2hpY2ggYWNjZXB0cyBgcHJvcHNgIHRvIGNoZWNrLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgcHJlZGljYXRlcyB0byBjb25mb3JtIHRvLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBjb25mb3JtcywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBwcm9wcykgewogICAgICAgICAgdmFyIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gIWxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpOwogICAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tsZW5ndGhdLAogICAgICAgICAgICAgICAgcHJlZGljYXRlID0gc291cmNlW2tleV0sCiAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldOwoKICAgICAgICAgICAgaWYgKCh2YWx1ZSA9PT0gdW5kZWZpbmVkJDEgJiYgIShrZXkgaW4gb2JqZWN0KSkgfHwgIXByZWRpY2F0ZSh2YWx1ZSkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZGVsYXlgIGFuZCBgXy5kZWZlcmAgd2hpY2ggYWNjZXB0cyBgYXJnc2AKICAgICAgICAgKiB0byBwcm92aWRlIHRvIGBmdW5jYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gZGVsYXkuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHdhaXQgVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gZGVsYXkgaW52b2NhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcmdzIFRoZSBhcmd1bWVudHMgdG8gcHJvdmlkZSB0byBgZnVuY2AuCiAgICAgICAgICogQHJldHVybnMge251bWJlcnxPYmplY3R9IFJldHVybnMgdGhlIHRpbWVyIGlkIG9yIHRpbWVvdXQgb2JqZWN0LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VEZWxheShmdW5jLCB3YWl0LCBhcmdzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbigpIHsgZnVuYy5hcHBseSh1bmRlZmluZWQkMSwgYXJncyk7IH0sIHdhaXQpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLmRpZmZlcmVuY2VgIHdpdGhvdXQgc3VwcG9ydAogICAgICAgICAqIGZvciBleGNsdWRpbmcgbXVsdGlwbGUgYXJyYXlzIG9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZURpZmZlcmVuY2UoYXJyYXksIHZhbHVlcywgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlcywKICAgICAgICAgICAgICBpc0NvbW1vbiA9IHRydWUsCiAgICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgICAgIHJlc3VsdCA9IFtdLAogICAgICAgICAgICAgIHZhbHVlc0xlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CgogICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpdGVyYXRlZSkgewogICAgICAgICAgICB2YWx1ZXMgPSBhcnJheU1hcCh2YWx1ZXMsIGJhc2VVbmFyeShpdGVyYXRlZSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNvbXBhcmF0b3IpIHsKICAgICAgICAgICAgaW5jbHVkZXMgPSBhcnJheUluY2x1ZGVzV2l0aDsKICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKHZhbHVlcy5sZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkgewogICAgICAgICAgICBpbmNsdWRlcyA9IGNhY2hlSGFzOwogICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlOwogICAgICAgICAgICB2YWx1ZXMgPSBuZXcgU2V0Q2FjaGUodmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICAgIG91dGVyOgogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLAogICAgICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA9PSBudWxsID8gdmFsdWUgOiBpdGVyYXRlZSh2YWx1ZSk7CgogICAgICAgICAgICB2YWx1ZSA9IChjb21wYXJhdG9yIHx8IHZhbHVlICE9PSAwKSA/IHZhbHVlIDogMDsKICAgICAgICAgICAgaWYgKGlzQ29tbW9uICYmIGNvbXB1dGVkID09PSBjb21wdXRlZCkgewogICAgICAgICAgICAgIHZhciB2YWx1ZXNJbmRleCA9IHZhbHVlc0xlbmd0aDsKICAgICAgICAgICAgICB3aGlsZSAodmFsdWVzSW5kZXgtLSkgewogICAgICAgICAgICAgICAgaWYgKHZhbHVlc1t2YWx1ZXNJbmRleF0gPT09IGNvbXB1dGVkKSB7CiAgICAgICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHZhbHVlcywgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl8T2JqZWN0fSBSZXR1cm5zIGBjb2xsZWN0aW9uYC4KICAgICAgICAgKi8KICAgICAgICB2YXIgYmFzZUVhY2ggPSBjcmVhdGVCYXNlRWFjaChiYXNlRm9yT3duKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaFJpZ2h0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLgogICAgICAgICAqLwogICAgICAgIHZhciBiYXNlRWFjaFJpZ2h0ID0gY3JlYXRlQmFzZUVhY2goYmFzZUZvck93blJpZ2h0LCB0cnVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZXZlcnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbGwgZWxlbWVudHMgcGFzcyB0aGUgcHJlZGljYXRlIGNoZWNrLAogICAgICAgICAqICBlbHNlIGBmYWxzZWAKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlRXZlcnkoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgewogICAgICAgICAgICByZXN1bHQgPSAhIXByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgbWV0aG9kcyBsaWtlIGBfLm1heGAgYW5kIGBfLm1pbmAgd2hpY2ggYWNjZXB0cyBhCiAgICAgICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIHVzZWQgdG8gY29tcGFyZSB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VFeHRyZW11bShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sCiAgICAgICAgICAgICAgICBjdXJyZW50ID0gaXRlcmF0ZWUodmFsdWUpOwoKICAgICAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAoY29tcHV0ZWQgPT09IHVuZGVmaW5lZCQxCiAgICAgICAgICAgICAgICAgID8gKGN1cnJlbnQgPT09IGN1cnJlbnQgJiYgIWlzU3ltYm9sKGN1cnJlbnQpKQogICAgICAgICAgICAgICAgICA6IGNvbXBhcmF0b3IoY3VycmVudCwgY29tcHV0ZWQpCiAgICAgICAgICAgICAgICApKSB7CiAgICAgICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCwKICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5maWxsYCB3aXRob3V0IGFuIGl0ZXJhdGVlIGNhbGwgZ3VhcmQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmaWxsLgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGZpbGwgYGFycmF5YCB3aXRoLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlRmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICAgICAgc3RhcnQgPSB0b0ludGVnZXIoc3RhcnQpOwogICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpOwogICAgICAgICAgfQogICAgICAgICAgZW5kID0gKGVuZCA9PT0gdW5kZWZpbmVkJDEgfHwgZW5kID4gbGVuZ3RoKSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpOwogICAgICAgICAgaWYgKGVuZCA8IDApIHsKICAgICAgICAgICAgZW5kICs9IGxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIGVuZCA9IHN0YXJ0ID4gZW5kID8gMCA6IHRvTGVuZ3RoKGVuZCk7CiAgICAgICAgICB3aGlsZSAoc3RhcnQgPCBlbmQpIHsKICAgICAgICAgICAgYXJyYXlbc3RhcnQrK10gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgewogICAgICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZsYXR0ZW5gIHdpdGggc3VwcG9ydCBmb3IgcmVzdHJpY3RpbmcgZmxhdHRlbmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGRlcHRoIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc1N0cmljdF0gUmVzdHJpY3QgdG8gdmFsdWVzIHRoYXQgcGFzcyBgcHJlZGljYXRlYCBjaGVja3MuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3Jlc3VsdD1bXV0gVGhlIGluaXRpYWwgcmVzdWx0IHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlRmxhdHRlbihhcnJheSwgZGVwdGgsIHByZWRpY2F0ZSwgaXNTdHJpY3QsIHJlc3VsdCkgewogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwoKICAgICAgICAgIHByZWRpY2F0ZSB8fCAocHJlZGljYXRlID0gaXNGbGF0dGVuYWJsZSk7CiAgICAgICAgICByZXN1bHQgfHwgKHJlc3VsdCA9IFtdKTsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgICAgIGlmIChkZXB0aCA+IDAgJiYgcHJlZGljYXRlKHZhbHVlKSkgewogICAgICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGZsYXR0ZW4gYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCiAgICAgICAgICAgICAgICBiYXNlRmxhdHRlbih2YWx1ZSwgZGVwdGggLSAxLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBhcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGVsc2UgaWYgKCFpc1N0cmljdCkgewogICAgICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYGJhc2VGb3JPd25gIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYG9iamVjdGAKICAgICAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4KICAgICAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICovCiAgICAgICAgdmFyIGJhc2VGb3IgPSBjcmVhdGVCYXNlRm9yKCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBgYmFzZUZvcmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBwcm9wZXJ0aWVzCiAgICAgICAgICogaW4gdGhlIG9wcG9zaXRlIG9yZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0ga2V5c0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUga2V5cyBvZiBgb2JqZWN0YC4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqLwogICAgICAgIHZhciBiYXNlRm9yUmlnaHQgPSBjcmVhdGVCYXNlRm9yKHRydWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3Iob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25SaWdodGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yUmlnaHQob2JqZWN0LCBpdGVyYXRlZSwga2V5cyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mdW5jdGlvbnNgIHdoaWNoIGNyZWF0ZXMgYW4gYXJyYXkgb2YKICAgICAgICAgKiBgb2JqZWN0YCBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmaWx0ZXJlZCBmcm9tIGBwcm9wc2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBuYW1lcyB0byBmaWx0ZXIuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlRnVuY3Rpb25zKG9iamVjdCwgcHJvcHMpIHsKICAgICAgICAgIHJldHVybiBhcnJheUZpbHRlcihwcm9wcywgZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgICAgIHJldHVybiBpc0Z1bmN0aW9uKG9iamVjdFtrZXldKTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZ2V0YCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZmF1bHQgdmFsdWVzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHsKICAgICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpOwoKICAgICAgICAgIHZhciBpbmRleCA9IDAsCiAgICAgICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGg7CgogICAgICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIG9iamVjdCA9IG9iamVjdFt0b0tleShwYXRoW2luZGV4KytdKV07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gKGluZGV4ICYmIGluZGV4ID09IGxlbmd0aCkgPyBvYmplY3QgOiB1bmRlZmluZWQkMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlcwogICAgICAgICAqIGBrZXlzRnVuY2AgYW5kIGBzeW1ib2xzRnVuY2AgdG8gZ2V0IHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIGFuZAogICAgICAgICAqIHN5bWJvbHMgb2YgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN5bWJvbHNGdW5jIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbHMgb2YgYG9iamVjdGAuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNGdW5jLCBzeW1ib2xzRnVuYykgewogICAgICAgICAgdmFyIHJlc3VsdCA9IGtleXNGdW5jKG9iamVjdCk7CiAgICAgICAgICByZXR1cm4gaXNBcnJheShvYmplY3QpID8gcmVzdWx0IDogYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkJDEgPyB1bmRlZmluZWRUYWcgOiBudWxsVGFnOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyAmJiBzeW1Ub1N0cmluZ1RhZyBpbiBPYmplY3QodmFsdWUpKQogICAgICAgICAgICA/IGdldFJhd1RhZyh2YWx1ZSkKICAgICAgICAgICAgOiBvYmplY3RUb1N0cmluZyh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5ndGAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsCiAgICAgICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUgPiBvdGhlcjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc2Agd2l0aG91dCBzdXBwb3J0IGZvciBkZWVwIHBhdGhzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VIYXMob2JqZWN0LCBrZXkpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmhhc0luYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBrZXkgVGhlIGtleSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUhhc0luKG9iamVjdCwga2V5KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5SYW5nZWAgd2hpY2ggZG9lc24ndCBjb2VyY2UgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2hlY2suCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUluUmFuZ2UobnVtYmVyLCBzdGFydCwgZW5kKSB7CiAgICAgICAgICByZXR1cm4gbnVtYmVyID49IG5hdGl2ZU1pbihzdGFydCwgZW5kKSAmJiBudW1iZXIgPCBuYXRpdmVNYXgoc3RhcnQsIGVuZCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCwgd2l0aG91dCBzdXBwb3J0CiAgICAgICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHRoYXQgYWNjZXB0cyBhbiBhcnJheSBvZiBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlzIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHNoYXJlZCB2YWx1ZXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUludGVyc2VjdGlvbihhcnJheXMsIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7CiAgICAgICAgICB2YXIgaW5jbHVkZXMgPSBjb21wYXJhdG9yID8gYXJyYXlJbmNsdWRlc1dpdGggOiBhcnJheUluY2x1ZGVzLAogICAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5c1swXS5sZW5ndGgsCiAgICAgICAgICAgICAgb3RoTGVuZ3RoID0gYXJyYXlzLmxlbmd0aCwKICAgICAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aCwKICAgICAgICAgICAgICBjYWNoZXMgPSBBcnJheShvdGhMZW5ndGgpLAogICAgICAgICAgICAgIG1heExlbmd0aCA9IEluZmluaXR5LAogICAgICAgICAgICAgIHJlc3VsdCA9IFtdOwoKICAgICAgICAgIHdoaWxlIChvdGhJbmRleC0tKSB7CiAgICAgICAgICAgIHZhciBhcnJheSA9IGFycmF5c1tvdGhJbmRleF07CiAgICAgICAgICAgIGlmIChvdGhJbmRleCAmJiBpdGVyYXRlZSkgewogICAgICAgICAgICAgIGFycmF5ID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1heExlbmd0aCA9IG5hdGl2ZU1pbihhcnJheS5sZW5ndGgsIG1heExlbmd0aCk7CiAgICAgICAgICAgIGNhY2hlc1tvdGhJbmRleF0gPSAhY29tcGFyYXRvciAmJiAoaXRlcmF0ZWUgfHwgKGxlbmd0aCA+PSAxMjAgJiYgYXJyYXkubGVuZ3RoID49IDEyMCkpCiAgICAgICAgICAgICAgPyBuZXcgU2V0Q2FjaGUob3RoSW5kZXggJiYgYXJyYXkpCiAgICAgICAgICAgICAgOiB1bmRlZmluZWQkMTsKICAgICAgICAgIH0KICAgICAgICAgIGFycmF5ID0gYXJyYXlzWzBdOwoKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIHNlZW4gPSBjYWNoZXNbMF07CgogICAgICAgICAgb3V0ZXI6CiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCAmJiByZXN1bHQubGVuZ3RoIDwgbWF4TGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XSwKICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUgPyBpdGVyYXRlZSh2YWx1ZSkgOiB2YWx1ZTsKCiAgICAgICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwOwogICAgICAgICAgICBpZiAoIShzZWVuCiAgICAgICAgICAgICAgICAgID8gY2FjaGVIYXMoc2VlbiwgY29tcHV0ZWQpCiAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMocmVzdWx0LCBjb21wdXRlZCwgY29tcGFyYXRvcikKICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICBvdGhJbmRleCA9IG90aExlbmd0aDsKICAgICAgICAgICAgICB3aGlsZSAoLS1vdGhJbmRleCkgewogICAgICAgICAgICAgICAgdmFyIGNhY2hlID0gY2FjaGVzW290aEluZGV4XTsKICAgICAgICAgICAgICAgIGlmICghKGNhY2hlCiAgICAgICAgICAgICAgICAgICAgICA/IGNhY2hlSGFzKGNhY2hlLCBjb21wdXRlZCkKICAgICAgICAgICAgICAgICAgICAgIDogaW5jbHVkZXMoYXJyYXlzW290aEluZGV4XSwgY29tcHV0ZWQsIGNvbXBhcmF0b3IpKQogICAgICAgICAgICAgICAgICAgICkgewogICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmludmVydGAgYW5kIGBfLmludmVydEJ5YCB3aGljaCBpbnZlcnRzCiAgICAgICAgICogYG9iamVjdGAgd2l0aCB2YWx1ZXMgdHJhbnNmb3JtZWQgYnkgYGl0ZXJhdGVlYCBhbmQgc2V0IGJ5IGBzZXR0ZXJgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGBhY2N1bXVsYXRvcmAgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBpdGVyYXRlZSB0byB0cmFuc2Zvcm0gdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhY2N1bXVsYXRvciBUaGUgaW5pdGlhbCBpbnZlcnRlZCBvYmplY3QuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIGBhY2N1bXVsYXRvcmAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUludmVydGVyKG9iamVjdCwgc2V0dGVyLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHsKICAgICAgICAgIGJhc2VGb3JPd24ob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwga2V5LCBvYmplY3QpIHsKICAgICAgICAgICAgc2V0dGVyKGFjY3VtdWxhdG9yLCBpdGVyYXRlZSh2YWx1ZSksIGtleSwgb2JqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW52b2tlYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWwKICAgICAgICAgKiBtZXRob2QgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIG1ldGhvZCB0byBpbnZva2UuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUludm9rZShvYmplY3QsIHBhdGgsIGFyZ3MpIHsKICAgICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpOwogICAgICAgICAgb2JqZWN0ID0gcGFyZW50KG9iamVjdCwgcGF0aCk7CiAgICAgICAgICB2YXIgZnVuYyA9IG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogb2JqZWN0W3RvS2V5KGxhc3QocGF0aCkpXTsKICAgICAgICAgIHJldHVybiBmdW5jID09IG51bGwgPyB1bmRlZmluZWQkMSA6IGFwcGx5KGZ1bmMsIG9iamVjdCwgYXJncyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FyZ3VtZW50c2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCwKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlSXNBcmd1bWVudHModmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFyZ3NUYWc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0FycmF5QnVmZmVyYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXkgYnVmZmVyLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUlzQXJyYXlCdWZmZXIodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGFycmF5QnVmZmVyVGFnOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNEYXRlYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBkYXRlIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VJc0RhdGUodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IGRhdGVUYWc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc0VxdWFsYCB3aGljaCBzdXBwb3J0cyBwYXJ0aWFsIGNvbXBhcmlzb25zCiAgICAgICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4KICAgICAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uCiAgICAgICAgICogIDIgLSBQYXJ0aWFsIGNvbXBhcmlzb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHsKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gb3RoZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCBvdGhlciA9PSBudWxsIHx8ICghaXNPYmplY3RMaWtlKHZhbHVlKSAmJiAhaXNPYmplY3RMaWtlKG90aGVyKSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXI7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZUlzRXF1YWxEZWVwKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgYmFzZUlzRXF1YWwsIHN0YWNrKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXMKICAgICAgICAgKiBkZWVwIGNvbXBhcmlzb25zIGFuZCB0cmFja3MgdHJhdmVyc2VkIG9iamVjdHMgZW5hYmxpbmcgb2JqZWN0cyB3aXRoIGNpcmN1bGFyCiAgICAgICAgICogcmVmZXJlbmNlcyB0byBiZSBjb21wYXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlSXNFcXVhbERlZXAob2JqZWN0LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykgewogICAgICAgICAgdmFyIG9iaklzQXJyID0gaXNBcnJheShvYmplY3QpLAogICAgICAgICAgICAgIG90aElzQXJyID0gaXNBcnJheShvdGhlciksCiAgICAgICAgICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyA6IGdldFRhZyhvYmplY3QpLAogICAgICAgICAgICAgIG90aFRhZyA9IG90aElzQXJyID8gYXJyYXlUYWcgOiBnZXRUYWcob3RoZXIpOwoKICAgICAgICAgIG9ialRhZyA9IG9ialRhZyA9PSBhcmdzVGFnID8gb2JqZWN0VGFnIDogb2JqVGFnOwogICAgICAgICAgb3RoVGFnID0gb3RoVGFnID09IGFyZ3NUYWcgPyBvYmplY3RUYWcgOiBvdGhUYWc7CgogICAgICAgICAgdmFyIG9iaklzT2JqID0gb2JqVGFnID09IG9iamVjdFRhZywKICAgICAgICAgICAgICBvdGhJc09iaiA9IG90aFRhZyA9PSBvYmplY3RUYWcsCiAgICAgICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZzsKCiAgICAgICAgICBpZiAoaXNTYW1lVGFnICYmIGlzQnVmZmVyKG9iamVjdCkpIHsKICAgICAgICAgICAgaWYgKCFpc0J1ZmZlcihvdGhlcikpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqSXNBcnIgPSB0cnVlOwogICAgICAgICAgICBvYmpJc09iaiA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzU2FtZVRhZyAmJiAhb2JqSXNPYmopIHsKICAgICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTsKICAgICAgICAgICAgcmV0dXJuIChvYmpJc0FyciB8fCBpc1R5cGVkQXJyYXkob2JqZWN0KSkKICAgICAgICAgICAgICA/IGVxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spCiAgICAgICAgICAgICAgOiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIShiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcpKSB7CiAgICAgICAgICAgIHZhciBvYmpJc1dyYXBwZWQgPSBvYmpJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwgJ19fd3JhcHBlZF9fJyksCiAgICAgICAgICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKG90aGVyLCAnX193cmFwcGVkX18nKTsKCiAgICAgICAgICAgIGlmIChvYmpJc1dyYXBwZWQgfHwgb3RoSXNXcmFwcGVkKSB7CiAgICAgICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LAogICAgICAgICAgICAgICAgICBvdGhVbndyYXBwZWQgPSBvdGhJc1dyYXBwZWQgPyBvdGhlci52YWx1ZSgpIDogb3RoZXI7CgogICAgICAgICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBTdGFjayk7CiAgICAgICAgICAgICAgcmV0dXJuIGVxdWFsRnVuYyhvYmpVbndyYXBwZWQsIG90aFVud3JhcHBlZCwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIWlzU2FtZVRhZykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgU3RhY2spOwogICAgICAgICAgcmV0dXJuIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzTWFwYCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlSXNNYXAodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gbWFwVGFnOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXRjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGlzIGEgbWF0Y2gsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgbWF0Y2hEYXRhLCBjdXN0b21pemVyKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSBtYXRjaERhdGEubGVuZ3RoLAogICAgICAgICAgICAgIGxlbmd0aCA9IGluZGV4LAogICAgICAgICAgICAgIG5vQ3VzdG9taXplciA9ICFjdXN0b21pemVyOwoKICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gIWxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIG9iamVjdCA9IE9iamVjdChvYmplY3QpOwogICAgICAgICAgd2hpbGUgKGluZGV4LS0pIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdOwogICAgICAgICAgICBpZiAoKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKQogICAgICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXQogICAgICAgICAgICAgICAgICA6ICEoZGF0YVswXSBpbiBvYmplY3QpCiAgICAgICAgICAgICAgICApIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGRhdGEgPSBtYXRjaERhdGFbaW5kZXhdOwogICAgICAgICAgICB2YXIga2V5ID0gZGF0YVswXSwKICAgICAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sCiAgICAgICAgICAgICAgICBzcmNWYWx1ZSA9IGRhdGFbMV07CgogICAgICAgICAgICBpZiAobm9DdXN0b21pemVyICYmIGRhdGFbMl0pIHsKICAgICAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCQxICYmICEoa2V5IGluIG9iamVjdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdmFyIHN0YWNrID0gbmV3IFN0YWNrOwogICAgICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWQkMQogICAgICAgICAgICAgICAgICAgID8gYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcsIGN1c3RvbWl6ZXIsIHN0YWNrKQogICAgICAgICAgICAgICAgICAgIDogcmVzdWx0CiAgICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNOYXRpdmVgIHdpdGhvdXQgYmFkIHNoaW0gY2hlY2tzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIG5hdGl2ZSBmdW5jdGlvbiwKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VJc05hdGl2ZSh2YWx1ZSkgewogICAgICAgICAgaWYgKCFpc09iamVjdCh2YWx1ZSkgfHwgaXNNYXNrZWQodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbih2YWx1ZSkgPyByZUlzTmF0aXZlIDogcmVJc0hvc3RDdG9yOwogICAgICAgICAgcmV0dXJuIHBhdHRlcm4udGVzdCh0b1NvdXJjZSh2YWx1ZSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNSZWdFeHBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VJc1JlZ0V4cCh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gcmVnZXhwVGFnOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNTZXRgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VJc1NldCh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc1R5cGVkQXJyYXlgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZUlzVHlwZWRBcnJheSh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYKICAgICAgICAgICAgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW2Jhc2VHZXRUYWcodmFsdWUpXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBpdGVyYXRlZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHsKICAgICAgICAgIC8vIERvbid0IHN0b3JlIHRoZSBgdHlwZW9mYCByZXN1bHQgaW4gYSB2YXJpYWJsZSB0byBhdm9pZCBhIEpJVCBidWcgaW4gU2FmYXJpIDkuCiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NjAzNCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBpZGVudGl0eTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgcmV0dXJuIGlzQXJyYXkodmFsdWUpCiAgICAgICAgICAgICAgPyBiYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSkKICAgICAgICAgICAgICA6IGJhc2VNYXRjaGVzKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5rZXlzYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VLZXlzKG9iamVjdCkgewogICAgICAgICAgaWYgKCFpc1Byb3RvdHlwZShvYmplY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBuYXRpdmVLZXlzKG9iamVjdCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHsKICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpICYmIGtleSAhPSAnY29uc3RydWN0b3InKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmtleXNJbmAgd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlS2V5c0luKG9iamVjdCkgewogICAgICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBuYXRpdmVLZXlzSW4ob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBpc1Byb3RvID0gaXNQcm90b3R5cGUob2JqZWN0KSwKICAgICAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7CiAgICAgICAgICAgIGlmICghKGtleSA9PSAnY29uc3RydWN0b3InICYmIChpc1Byb3RvIHx8ICFoYXNPd25Qcm9wZXJ0eS5jYWxsKG9iamVjdCwga2V5KSkpKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gYG90aGVyYCwKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VMdCh2YWx1ZSwgb3RoZXIpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlTWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdOwoKICAgICAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKICAgICAgICAgICAgcmVzdWx0WysraW5kZXhdID0gaXRlcmF0ZWUodmFsdWUsIGtleSwgY29sbGVjdGlvbik7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHNwZWMgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7CiAgICAgICAgICB2YXIgbWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7CiAgICAgICAgICBpZiAobWF0Y2hEYXRhLmxlbmd0aCA9PSAxICYmIG1hdGNoRGF0YVswXVsyXSkgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUobWF0Y2hEYXRhWzBdWzBdLCBtYXRjaERhdGFbMF1bMV0pOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWF0Y2hlc1Byb3BlcnR5YCB3aGljaCBkb2Vzbid0IGNsb25lIGBzcmNWYWx1ZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7CiAgICAgICAgICBpZiAoaXNLZXkocGF0aCkgJiYgaXNTdHJpY3RDb21wYXJhYmxlKHNyY1ZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUodG9LZXkocGF0aCksIHNyY1ZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICAgICAgdmFyIG9ialZhbHVlID0gZ2V0KG9iamVjdCwgcGF0aCk7CiAgICAgICAgICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCQxICYmIG9ialZhbHVlID09PSBzcmNWYWx1ZSkKICAgICAgICAgICAgICA/IGhhc0luKG9iamVjdCwgcGF0aCkKICAgICAgICAgICAgICA6IGJhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUcgfCBDT01QQVJFX1VOT1JERVJFRF9GTEFHKTsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWQKICAgICAgICAgKiAgY291bnRlcnBhcnRzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VNZXJnZShvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7CiAgICAgICAgICBpZiAob2JqZWN0ID09PSBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgYmFzZUZvcihzb3VyY2UsIGZ1bmN0aW9uKHNyY1ZhbHVlLCBrZXkpIHsKICAgICAgICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IFN0YWNrKTsKICAgICAgICAgICAgaWYgKGlzT2JqZWN0KHNyY1ZhbHVlKSkgewogICAgICAgICAgICAgIGJhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIKICAgICAgICAgICAgICAgID8gY3VzdG9taXplcihzYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaykKICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwga2V5c0luKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZU1lcmdlYCBmb3IgYXJyYXlzIGFuZCBvYmplY3RzIHdoaWNoIHBlcmZvcm1zCiAgICAgICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXIKICAgICAgICAgKiByZWZlcmVuY2VzIHRvIGJlIG1lcmdlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIHNvdXJjZSBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3JjSW5kZXggVGhlIGluZGV4IG9mIGBzb3VyY2VgLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG1lcmdlRnVuYyBUaGUgZnVuY3Rpb24gdG8gbWVyZ2UgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZAogICAgICAgICAqICBjb3VudGVycGFydHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZU1lcmdlRGVlcChvYmplY3QsIHNvdXJjZSwga2V5LCBzcmNJbmRleCwgbWVyZ2VGdW5jLCBjdXN0b21pemVyLCBzdGFjaykgewogICAgICAgICAgdmFyIG9ialZhbHVlID0gc2FmZUdldChvYmplY3QsIGtleSksCiAgICAgICAgICAgICAgc3JjVmFsdWUgPSBzYWZlR2V0KHNvdXJjZSwga2V5KSwKICAgICAgICAgICAgICBzdGFja2VkID0gc3RhY2suZ2V0KHNyY1ZhbHVlKTsKCiAgICAgICAgICBpZiAoc3RhY2tlZCkgewogICAgICAgICAgICBhc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplcgogICAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIHNyY1ZhbHVlLCAoa2V5ICsgJycpLCBvYmplY3QsIHNvdXJjZSwgc3RhY2spCiAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgdmFyIGlzQ29tbW9uID0gbmV3VmFsdWUgPT09IHVuZGVmaW5lZCQxOwoKICAgICAgICAgIGlmIChpc0NvbW1vbikgewogICAgICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5KHNyY1ZhbHVlKSwKICAgICAgICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiBpc0J1ZmZlcihzcmNWYWx1ZSksCiAgICAgICAgICAgICAgICBpc1R5cGVkID0gIWlzQXJyICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5KHNyY1ZhbHVlKTsKCiAgICAgICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7CiAgICAgICAgICAgIGlmIChpc0FyciB8fCBpc0J1ZmYgfHwgaXNUeXBlZCkgewogICAgICAgICAgICAgIGlmIChpc0FycmF5KG9ialZhbHVlKSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3Qob2JqVmFsdWUpKSB7CiAgICAgICAgICAgICAgICBuZXdWYWx1ZSA9IGNvcHlBcnJheShvYmpWYWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikgewogICAgICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gY2xvbmVCdWZmZXIoc3JjVmFsdWUsIHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7CiAgICAgICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBjbG9uZVR5cGVkQXJyYXkoc3JjVmFsdWUsIHRydWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gW107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzUGxhaW5PYmplY3Qoc3JjVmFsdWUpIHx8IGlzQXJndW1lbnRzKHNyY1ZhbHVlKSkgewogICAgICAgICAgICAgIG5ld1ZhbHVlID0gb2JqVmFsdWU7CiAgICAgICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9ialZhbHVlKSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB0b1BsYWluT2JqZWN0KG9ialZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgZWxzZSBpZiAoIWlzT2JqZWN0KG9ialZhbHVlKSB8fCBpc0Z1bmN0aW9uKG9ialZhbHVlKSkgewogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSBpbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNDb21tb24pIHsKICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgbWVyZ2Ugb2JqZWN0cyBhbmQgYXJyYXlzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCiAgICAgICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpOwogICAgICAgICAgICBtZXJnZUZ1bmMobmV3VmFsdWUsIHNyY1ZhbHVlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spOwogICAgICAgICAgICBzdGFja1snZGVsZXRlJ10oc3JjVmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubnRoYCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VOdGgoYXJyYXksIG4pIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CiAgICAgICAgICBpZiAoIWxlbmd0aCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBuICs9IG4gPCAwID8gbGVuZ3RoIDogMDsKICAgICAgICAgIHJldHVybiBpc0luZGV4KG4sIGxlbmd0aCkgPyBhcnJheVtuXSA6IHVuZGVmaW5lZCQxOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ub3JkZXJCeWAgd2l0aG91dCBwYXJhbSBndWFyZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uW118T2JqZWN0W118c3RyaW5nW119IGl0ZXJhdGVlcyBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBzb3J0ZWQgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHsKICAgICAgICAgIGlmIChpdGVyYXRlZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHsKICAgICAgICAgICAgICBpZiAoaXNBcnJheShpdGVyYXRlZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgICAgICByZXR1cm4gYmFzZUdldCh2YWx1ZSwgaXRlcmF0ZWUubGVuZ3RoID09PSAxID8gaXRlcmF0ZWVbMF0gOiBpdGVyYXRlZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJldHVybiBpdGVyYXRlZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpdGVyYXRlZXMgPSBbaWRlbnRpdHldOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBpbmRleCA9IC0xOwogICAgICAgICAgaXRlcmF0ZWVzID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpOwoKICAgICAgICAgIHZhciByZXN1bHQgPSBiYXNlTWFwKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pIHsKICAgICAgICAgICAgdmFyIGNyaXRlcmlhID0gYXJyYXlNYXAoaXRlcmF0ZWVzLCBmdW5jdGlvbihpdGVyYXRlZSkgewogICAgICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4geyAnY3JpdGVyaWEnOiBjcml0ZXJpYSwgJ2luZGV4JzogKytpbmRleCwgJ3ZhbHVlJzogdmFsdWUgfTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIHJldHVybiBiYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24ob2JqZWN0LCBvdGhlcikgewogICAgICAgICAgICByZXR1cm4gY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnBpY2tgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbAogICAgICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IHBhdGhzIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVBpY2sob2JqZWN0LCBwYXRocykgewogICAgICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwYXRocywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuIGhhc0luKG9iamVjdCwgcGF0aCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mICBgXy5waWNrQnlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBwcmVkaWNhdGUpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCwKICAgICAgICAgICAgICByZXN1bHQgPSB7fTsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSwKICAgICAgICAgICAgICAgIHZhbHVlID0gYmFzZUdldChvYmplY3QsIHBhdGgpOwoKICAgICAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgcGF0aCkpIHsKICAgICAgICAgICAgICBiYXNlU2V0KHJlc3VsdCwgY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUHJvcGVydHlgIHdoaWNoIHN1cHBvcnRzIGRlZXAgcGF0aHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWNjZXNzb3IgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5RGVlcChwYXRoKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHVsbEFsbEJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlCiAgICAgICAgICogc2hvcnRoYW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byByZW1vdmUuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikgewogICAgICAgICAgdmFyIGluZGV4T2YgPSBjb21wYXJhdG9yID8gYmFzZUluZGV4T2ZXaXRoIDogYmFzZUluZGV4T2YsCiAgICAgICAgICAgICAgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgICAgIHNlZW4gPSBhcnJheTsKCiAgICAgICAgICBpZiAoYXJyYXkgPT09IHZhbHVlcykgewogICAgICAgICAgICB2YWx1ZXMgPSBjb3B5QXJyYXkodmFsdWVzKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpdGVyYXRlZSkgewogICAgICAgICAgICBzZWVuID0gYXJyYXlNYXAoYXJyYXksIGJhc2VVbmFyeShpdGVyYXRlZSkpOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGZyb21JbmRleCA9IDAsCiAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlc1tpbmRleF0sCiAgICAgICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7CgogICAgICAgICAgICB3aGlsZSAoKGZyb21JbmRleCA9IGluZGV4T2Yoc2VlbiwgY29tcHV0ZWQsIGZyb21JbmRleCwgY29tcGFyYXRvcikpID4gLTEpIHsKICAgICAgICAgICAgICBpZiAoc2VlbiAhPT0gYXJyYXkpIHsKICAgICAgICAgICAgICAgIHNwbGljZS5jYWxsKHNlZW4sIGZyb21JbmRleCwgMSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNwbGljZS5jYWxsKGFycmF5LCBmcm9tSW5kZXgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5wdWxsQXRgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaW5kaXZpZHVhbAogICAgICAgICAqIGluZGV4ZXMgb3IgY2FwdHVyaW5nIHRoZSByZW1vdmVkIGVsZW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGluZGV4ZXMgVGhlIGluZGV4ZXMgb2YgZWxlbWVudHMgdG8gcmVtb3ZlLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA/IGluZGV4ZXMubGVuZ3RoIDogMCwKICAgICAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxOwoKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICB2YXIgaW5kZXggPSBpbmRleGVzW2xlbmd0aF07CiAgICAgICAgICAgIGlmIChsZW5ndGggPT0gbGFzdEluZGV4IHx8IGluZGV4ICE9PSBwcmV2aW91cykgewogICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IGluZGV4OwogICAgICAgICAgICAgIGlmIChpc0luZGV4KGluZGV4KSkgewogICAgICAgICAgICAgICAgc3BsaWNlLmNhbGwoYXJyYXksIGluZGV4LCAxKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgYmFzZVVuc2V0KGFycmF5LCBpbmRleCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5kb21gIHdpdGhvdXQgc3VwcG9ydCBmb3IgcmV0dXJuaW5nCiAgICAgICAgICogZmxvYXRpbmctcG9pbnQgbnVtYmVycy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyIFRoZSBsb3dlciBib3VuZC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gdXBwZXIgVGhlIHVwcGVyIGJvdW5kLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVJhbmRvbShsb3dlciwgdXBwZXIpIHsKICAgICAgICAgIHJldHVybiBsb3dlciArIG5hdGl2ZUZsb29yKG5hdGl2ZVJhbmRvbSgpICogKHVwcGVyIC0gbG93ZXIgKyAxKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yYW5nZWAgYW5kIGBfLnJhbmdlUmlnaHRgIHdoaWNoIGRvZXNuJ3QKICAgICAgICAgKiBjb2VyY2UgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGVwIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSBuYXRpdmVNYXgobmF0aXZlQ2VpbCgoZW5kIC0gc3RhcnQpIC8gKHN0ZXAgfHwgMSkpLCAwKSwKICAgICAgICAgICAgICByZXN1bHQgPSBBcnJheShsZW5ndGgpOwoKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDsKICAgICAgICAgICAgc3RhcnQgKz0gc3RlcDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXBlYXRgIHdoaWNoIGRvZXNuJ3QgY29lcmNlIGFyZ3VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIHJlcGVhdC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIHRpbWVzIHRvIHJlcGVhdCB0aGUgc3RyaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlUmVwZWF0KHN0cmluZywgbikgewogICAgICAgICAgdmFyIHJlc3VsdCA9ICcnOwogICAgICAgICAgaWYgKCFzdHJpbmcgfHwgbiA8IDEgfHwgbiA+IE1BWF9TQUZFX0lOVEVHRVIpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIC8vIExldmVyYWdlIHRoZSBleHBvbmVudGlhdGlvbiBieSBzcXVhcmluZyBhbGdvcml0aG0gZm9yIGEgZmFzdGVyIHJlcGVhdC4KICAgICAgICAgIC8vIFNlZSBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9FeHBvbmVudGlhdGlvbl9ieV9zcXVhcmluZyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgZG8gewogICAgICAgICAgICBpZiAobiAlIDIpIHsKICAgICAgICAgICAgICByZXN1bHQgKz0gc3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG4gPSBuYXRpdmVGbG9vcihuIC8gMik7CiAgICAgICAgICAgIGlmIChuKSB7CiAgICAgICAgICAgICAgc3RyaW5nICs9IHN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgfSB3aGlsZSAobik7CgogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnJlc3RgIHdoaWNoIGRvZXNuJ3QgdmFsaWRhdGUgb3IgY29lcmNlIGFyZ3VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHsKICAgICAgICAgIHJldHVybiBzZXRUb1N0cmluZyhvdmVyUmVzdChmdW5jLCBzdGFydCwgaWRlbnRpdHkpLCBmdW5jICsgJycpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gc2FtcGxlLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByYW5kb20gZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlU2FtcGxlKGNvbGxlY3Rpb24pIHsKICAgICAgICAgIHJldHVybiBhcnJheVNhbXBsZSh2YWx1ZXMoY29sbGVjdGlvbikpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2FtcGxlU2l6ZWAgd2l0aG91dCBwYXJhbSBndWFyZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHNhbXBsZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlU2FtcGxlU2l6ZShjb2xsZWN0aW9uLCBuKSB7CiAgICAgICAgICB2YXIgYXJyYXkgPSB2YWx1ZXMoY29sbGVjdGlvbik7CiAgICAgICAgICByZXR1cm4gc2h1ZmZsZVNlbGYoYXJyYXksIGJhc2VDbGFtcChuLCAwLCBhcnJheS5sZW5ndGgpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikgewogICAgICAgICAgaWYgKCFpc09iamVjdChvYmplY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgICB9CiAgICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTsKCiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCwKICAgICAgICAgICAgICBsYXN0SW5kZXggPSBsZW5ndGggLSAxLAogICAgICAgICAgICAgIG5lc3RlZCA9IG9iamVjdDsKCiAgICAgICAgICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pLAogICAgICAgICAgICAgICAgbmV3VmFsdWUgPSB2YWx1ZTsKCiAgICAgICAgICAgIGlmIChrZXkgPT09ICdfX3Byb3RvX18nIHx8IGtleSA9PT0gJ2NvbnN0cnVjdG9yJyB8fCBrZXkgPT09ICdwcm90b3R5cGUnKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKGluZGV4ICE9IGxhc3RJbmRleCkgewogICAgICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG5lc3RlZFtrZXldOwogICAgICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3Qob2JqVmFsdWUpCiAgICAgICAgICAgICAgICAgID8gb2JqVmFsdWUKICAgICAgICAgICAgICAgICAgOiAoaXNJbmRleChwYXRoW2luZGV4ICsgMV0pID8gW10gOiB7fSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGFzc2lnblZhbHVlKG5lc3RlZCwga2V5LCBuZXdWYWx1ZSk7CiAgICAgICAgICAgIG5lc3RlZCA9IG5lc3RlZFtrZXldOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBzZXREYXRhYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhc3NvY2lhdGUgbWV0YWRhdGEgd2l0aC4KICAgICAgICAgKiBAcGFyYW0geyp9IGRhdGEgVGhlIG1ldGFkYXRhLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuCiAgICAgICAgICovCiAgICAgICAgdmFyIGJhc2VTZXREYXRhID0gIW1ldGFNYXAgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIGRhdGEpIHsKICAgICAgICAgIG1ldGFNYXAuc2V0KGZ1bmMsIGRhdGEpOwogICAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgICAgfTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYHNldFRvU3RyaW5nYCB3aXRob3V0IHN1cHBvcnQgZm9yIGhvdCBsb29wIHNob3J0aW5nLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLgogICAgICAgICAqLwogICAgICAgIHZhciBiYXNlU2V0VG9TdHJpbmcgPSAhZGVmaW5lUHJvcGVydHkgPyBpZGVudGl0eSA6IGZ1bmN0aW9uKGZ1bmMsIHN0cmluZykgewogICAgICAgICAgcmV0dXJuIGRlZmluZVByb3BlcnR5KGZ1bmMsICd0b1N0cmluZycsIHsKICAgICAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsCiAgICAgICAgICAgICdlbnVtZXJhYmxlJzogZmFsc2UsCiAgICAgICAgICAgICd2YWx1ZSc6IGNvbnN0YW50KHN0cmluZyksCiAgICAgICAgICAgICd3cml0YWJsZSc6IHRydWUKICAgICAgICAgIH0pOwogICAgICAgIH07CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNodWZmbGVgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VTaHVmZmxlKGNvbGxlY3Rpb24pIHsKICAgICAgICAgIHJldHVybiBzaHVmZmxlU2VsZih2YWx1ZXMoY29sbGVjdGlvbikpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc2xpY2VgIHdpdGhvdXQgYW4gaXRlcmF0ZWUgY2FsbCBndWFyZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNsaWNlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZW5kPWFycmF5Lmxlbmd0aF0gVGhlIGVuZCBwb3NpdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICAgICAgaWYgKHN0YXJ0IDwgMCkgewogICAgICAgICAgICBzdGFydCA9IC1zdGFydCA+IGxlbmd0aCA/IDAgOiAobGVuZ3RoICsgc3RhcnQpOwogICAgICAgICAgfQogICAgICAgICAgZW5kID0gZW5kID4gbGVuZ3RoID8gbGVuZ3RoIDogZW5kOwogICAgICAgICAgaWYgKGVuZCA8IDApIHsKICAgICAgICAgICAgZW5kICs9IGxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIGxlbmd0aCA9IHN0YXJ0ID4gZW5kID8gMCA6ICgoZW5kIC0gc3RhcnQpID4+PiAwKTsKICAgICAgICAgIHN0YXJ0ID4+Pj0gMDsKCiAgICAgICAgICB2YXIgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIHJlc3VsdFtpbmRleF0gPSBhcnJheVtpbmRleCArIHN0YXJ0XTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb21lYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW55IGVsZW1lbnQgcGFzc2VzIHRoZSBwcmVkaWNhdGUgY2hlY2ssCiAgICAgICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlU29tZShjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHsKICAgICAgICAgIHZhciByZXN1bHQ7CgogICAgICAgICAgYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOwogICAgICAgICAgICByZXR1cm4gIXJlc3VsdDsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuICEhcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhgIGFuZCBgXy5zb3J0ZWRMYXN0SW5kZXhgIHdoaWNoCiAgICAgICAgICogcGVyZm9ybXMgYSBiaW5hcnkgc2VhcmNoIG9mIGBhcnJheWAgdG8gZGV0ZXJtaW5lIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgCiAgICAgICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIHNvcnRlZCBhcnJheSB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGV2YWx1YXRlLgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW3JldEhpZ2hlc3RdIFNwZWNpZnkgcmV0dXJuaW5nIHRoZSBoaWdoZXN0IHF1YWxpZmllZCBpbmRleC4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZAogICAgICAgICAqICBpbnRvIGBhcnJheWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgcmV0SGlnaGVzdCkgewogICAgICAgICAgdmFyIGxvdyA9IDAsCiAgICAgICAgICAgICAgaGlnaCA9IGFycmF5ID09IG51bGwgPyBsb3cgOiBhcnJheS5sZW5ndGg7CgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJyAmJiB2YWx1ZSA9PT0gdmFsdWUgJiYgaGlnaCA8PSBIQUxGX01BWF9BUlJBWV9MRU5HVEgpIHsKICAgICAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHsKICAgICAgICAgICAgICB2YXIgbWlkID0gKGxvdyArIGhpZ2gpID4+PiAxLAogICAgICAgICAgICAgICAgICBjb21wdXRlZCA9IGFycmF5W21pZF07CgogICAgICAgICAgICAgIGlmIChjb21wdXRlZCAhPT0gbnVsbCAmJiAhaXNTeW1ib2woY29tcHV0ZWQpICYmCiAgICAgICAgICAgICAgICAgIChyZXRIaWdoZXN0ID8gKGNvbXB1dGVkIDw9IHZhbHVlKSA6IChjb21wdXRlZCA8IHZhbHVlKSkpIHsKICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoaWdoOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaWRlbnRpdHksIHJldEhpZ2hlc3QpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uc29ydGVkSW5kZXhCeWAgYW5kIGBfLnNvcnRlZExhc3RJbmRleEJ5YAogICAgICAgICAqIHdoaWNoIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZQogICAgICAgICAqIHRoZWlyIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtyZXRIaWdoZXN0XSBTcGVjaWZ5IHJldHVybmluZyB0aGUgaGlnaGVzdCBxdWFsaWZpZWQgaW5kZXguCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiAgaW50byBgYXJyYXlgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VTb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUsIHJldEhpZ2hlc3QpIHsKICAgICAgICAgIHZhciBsb3cgPSAwLAogICAgICAgICAgICAgIGhpZ2ggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmIChoaWdoID09PSAwKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgfQoKICAgICAgICAgIHZhbHVlID0gaXRlcmF0ZWUodmFsdWUpOwogICAgICAgICAgdmFyIHZhbElzTmFOID0gdmFsdWUgIT09IHZhbHVlLAogICAgICAgICAgICAgIHZhbElzTnVsbCA9IHZhbHVlID09PSBudWxsLAogICAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2wodmFsdWUpLAogICAgICAgICAgICAgIHZhbElzVW5kZWZpbmVkID0gdmFsdWUgPT09IHVuZGVmaW5lZCQxOwoKICAgICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7CiAgICAgICAgICAgIHZhciBtaWQgPSBuYXRpdmVGbG9vcigobG93ICsgaGlnaCkgLyAyKSwKICAgICAgICAgICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUoYXJyYXlbbWlkXSksCiAgICAgICAgICAgICAgICBvdGhJc0RlZmluZWQgPSBjb21wdXRlZCAhPT0gdW5kZWZpbmVkJDEsCiAgICAgICAgICAgICAgICBvdGhJc051bGwgPSBjb21wdXRlZCA9PT0gbnVsbCwKICAgICAgICAgICAgICAgIG90aElzUmVmbGV4aXZlID0gY29tcHV0ZWQgPT09IGNvbXB1dGVkLAogICAgICAgICAgICAgICAgb3RoSXNTeW1ib2wgPSBpc1N5bWJvbChjb21wdXRlZCk7CgogICAgICAgICAgICBpZiAodmFsSXNOYU4pIHsKICAgICAgICAgICAgICB2YXIgc2V0TG93ID0gcmV0SGlnaGVzdCB8fCBvdGhJc1JlZmxleGl2ZTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWxJc1VuZGVmaW5lZCkgewogICAgICAgICAgICAgIHNldExvdyA9IG90aElzUmVmbGV4aXZlICYmIChyZXRIaWdoZXN0IHx8IG90aElzRGVmaW5lZCk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsSXNOdWxsKSB7CiAgICAgICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgb3RoSXNEZWZpbmVkICYmIChyZXRIaWdoZXN0IHx8ICFvdGhJc051bGwpOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZhbElzU3ltYm9sKSB7CiAgICAgICAgICAgICAgc2V0TG93ID0gb3RoSXNSZWZsZXhpdmUgJiYgb3RoSXNEZWZpbmVkICYmICFvdGhJc051bGwgJiYgKHJldEhpZ2hlc3QgfHwgIW90aElzU3ltYm9sKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChvdGhJc051bGwgfHwgb3RoSXNTeW1ib2wpIHsKICAgICAgICAgICAgICBzZXRMb3cgPSBmYWxzZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBzZXRMb3cgPSByZXRIaWdoZXN0ID8gKGNvbXB1dGVkIDw9IHZhbHVlKSA6IChjb21wdXRlZCA8IHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2V0TG93KSB7CiAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBoaWdoID0gbWlkOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbmF0aXZlTWluKGhpZ2gsIE1BWF9BUlJBWV9JTkRFWCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0ZWRVbmlxYCBhbmQgYF8uc29ydGVkVW5pcUJ5YCB3aXRob3V0CiAgICAgICAgICogc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlXSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlU29ydGVkVW5pcShhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aCwKICAgICAgICAgICAgICByZXNJbmRleCA9IDAsCiAgICAgICAgICAgICAgcmVzdWx0ID0gW107CgogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLAogICAgICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlOwoKICAgICAgICAgICAgaWYgKCFpbmRleCB8fCAhZXEoY29tcHV0ZWQsIHNlZW4pKSB7CiAgICAgICAgICAgICAgdmFyIHNlZW4gPSBjb21wdXRlZDsKICAgICAgICAgICAgICByZXN1bHRbcmVzSW5kZXgrK10gPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnRvTnVtYmVyYCB3aGljaCBkb2Vzbid0IGVuc3VyZSBjb3JyZWN0CiAgICAgICAgICogY29udmVyc2lvbnMgb2YgYmluYXJ5LCBoZXhhZGVjaW1hbCwgb3Igb2N0YWwgc3RyaW5nIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVRvTnVtYmVyKHZhbHVlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIE5BTjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiArdmFsdWU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2gKICAgICAgICAgKiB2YWx1ZXMgdG8gZW1wdHkgc3RyaW5ncy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvY2Vzcy4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzdHJpbmcuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVRvU3RyaW5nKHZhbHVlKSB7CiAgICAgICAgICAvLyBFeGl0IGVhcmx5IGZvciBzdHJpbmdzIHRvIGF2b2lkIGEgcGVyZm9ybWFuY2UgaGl0IGluIHNvbWUgZW52aXJvbm1lbnRzLgogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29udmVydCB2YWx1ZXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS4KICAgICAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCBiYXNlVG9TdHJpbmcpICsgJyc7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNTeW1ib2wodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVzdWx0ID0gKHZhbHVlICsgJycpOwogICAgICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udW5pcUJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZHVwbGljYXRlIGZyZWUgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVVuaXEoYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBpbmNsdWRlcyA9IGFycmF5SW5jbHVkZXMsCiAgICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgICAgIGlzQ29tbW9uID0gdHJ1ZSwKICAgICAgICAgICAgICByZXN1bHQgPSBbXSwKICAgICAgICAgICAgICBzZWVuID0gcmVzdWx0OwoKICAgICAgICAgIGlmIChjb21wYXJhdG9yKSB7CiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7CiAgICAgICAgICAgIGluY2x1ZGVzID0gYXJyYXlJbmNsdWRlc1dpdGg7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChsZW5ndGggPj0gTEFSR0VfQVJSQVlfU0laRSkgewogICAgICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogY3JlYXRlU2V0KGFycmF5KTsKICAgICAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgICAgIHJldHVybiBzZXRUb0FycmF5KHNldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaXNDb21tb24gPSBmYWxzZTsKICAgICAgICAgICAgaW5jbHVkZXMgPSBjYWNoZUhhczsKICAgICAgICAgICAgc2VlbiA9IG5ldyBTZXRDYWNoZTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBzZWVuID0gaXRlcmF0ZWUgPyBbXSA6IHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIG91dGVyOgogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLAogICAgICAgICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlKSA6IHZhbHVlOwoKICAgICAgICAgICAgdmFsdWUgPSAoY29tcGFyYXRvciB8fCB2YWx1ZSAhPT0gMCkgPyB2YWx1ZSA6IDA7CiAgICAgICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHsKICAgICAgICAgICAgICB2YXIgc2VlbkluZGV4ID0gc2Vlbi5sZW5ndGg7CiAgICAgICAgICAgICAgd2hpbGUgKHNlZW5JbmRleC0tKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkgewogICAgICAgICAgICAgICAgICBjb250aW51ZSBvdXRlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGl0ZXJhdGVlKSB7CiAgICAgICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXN1bHQucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkgewogICAgICAgICAgICAgIGlmIChzZWVuICE9PSByZXN1bHQpIHsKICAgICAgICAgICAgICAgIHNlZW4ucHVzaChjb21wdXRlZCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuc2V0YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcHJvcGVydHkgcGF0aCB0byB1bnNldC4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHByb3BlcnR5IGlzIGRlbGV0ZWQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlVW5zZXQob2JqZWN0LCBwYXRoKSB7CiAgICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTsKICAgICAgICAgIG9iamVjdCA9IHBhcmVudChvYmplY3QsIHBhdGgpOwogICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsIHx8IGRlbGV0ZSBvYmplY3RbdG9LZXkobGFzdChwYXRoKSldOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udXBkYXRlYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZXIgVGhlIGZ1bmN0aW9uIHRvIHByb2R1Y2UgdGhlIHVwZGF0ZWQgdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7CiAgICAgICAgICByZXR1cm4gYmFzZVNldChvYmplY3QsIHBhdGgsIHVwZGF0ZXIoYmFzZUdldChvYmplY3QsIHBhdGgpKSwgY3VzdG9taXplcik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBtZXRob2RzIGxpa2UgYF8uZHJvcFdoaWxlYCBhbmQgYF8udGFrZVdoaWxlYAogICAgICAgICAqIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRHJvcF0gU3BlY2lmeSBkcm9wcGluZyBlbGVtZW50cyBpbnN0ZWFkIG9mIHRha2luZyB0aGVtLgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlV2hpbGUoYXJyYXksIHByZWRpY2F0ZSwgaXNEcm9wLCBmcm9tUmlnaHQpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMTsKCiAgICAgICAgICB3aGlsZSAoKGZyb21SaWdodCA/IGluZGV4LS0gOiArK2luZGV4IDwgbGVuZ3RoKSAmJgogICAgICAgICAgICBwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7fQoKICAgICAgICAgIHJldHVybiBpc0Ryb3AKICAgICAgICAgICAgPyBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyAwIDogaW5kZXgpLCAoZnJvbVJpZ2h0ID8gaW5kZXggKyAxIDogbGVuZ3RoKSkKICAgICAgICAgICAgOiBiYXNlU2xpY2UoYXJyYXksIChmcm9tUmlnaHQgPyBpbmRleCArIDEgOiAwKSwgKGZyb21SaWdodCA/IGxlbmd0aCA6IGluZGV4KSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgd3JhcHBlclZhbHVlYCB3aGljaCByZXR1cm5zIHRoZSByZXN1bHQgb2YKICAgICAgICAgKiBwZXJmb3JtaW5nIGEgc2VxdWVuY2Ugb2YgYWN0aW9ucyBvbiB0aGUgdW53cmFwcGVkIGB2YWx1ZWAsIHdoZXJlIGVhY2gKICAgICAgICAgKiBzdWNjZXNzaXZlIGFjdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdW53cmFwcGVkIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFjdGlvbnMgQWN0aW9ucyB0byBwZXJmb3JtIHRvIHJlc29sdmUgdGhlIHVud3JhcHBlZCB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYmFzZVdyYXBwZXJWYWx1ZSh2YWx1ZSwgYWN0aW9ucykgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHZhbHVlOwogICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIExhenlXcmFwcGVyKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZSgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGFycmF5UmVkdWNlKGFjdGlvbnMsIGZ1bmN0aW9uKHJlc3VsdCwgYWN0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBhY3Rpb24uZnVuYy5hcHBseShhY3Rpb24udGhpc0FyZywgYXJyYXlQdXNoKFtyZXN1bHRdLCBhY3Rpb24uYXJncykpOwogICAgICAgICAgfSwgcmVzdWx0KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy54b3JgLCB3aXRob3V0IHN1cHBvcnQgZm9yCiAgICAgICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcywgdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyB0byBpbnNwZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheXMgVGhlIGFycmF5cyB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgdmFsdWVzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJhc2VYb3IoYXJyYXlzLCBpdGVyYXRlZSwgY29tcGFyYXRvcikgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGg7CiAgICAgICAgICBpZiAobGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZVVuaXEoYXJyYXlzWzBdKSA6IFtdOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVuZ3RoKTsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBhcnJheXNbaW5kZXhdLAogICAgICAgICAgICAgICAgb3RoSW5kZXggPSAtMTsKCiAgICAgICAgICAgIHdoaWxlICgrK290aEluZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgaWYgKG90aEluZGV4ICE9IGluZGV4KSB7CiAgICAgICAgICAgICAgICByZXN1bHRbaW5kZXhdID0gYmFzZURpZmZlcmVuY2UocmVzdWx0W2luZGV4XSB8fCBhcnJheSwgYXJyYXlzW290aEluZGV4XSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKHJlc3VsdCwgMSksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy56aXBPYmplY3RgIHdoaWNoIGFzc2lnbnMgdmFsdWVzIHVzaW5nIGBhc3NpZ25GdW5jYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgcHJvcGVydHkgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbkZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFzc2lnbiB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBiYXNlWmlwT2JqZWN0KHByb3BzLCB2YWx1ZXMsIGFzc2lnbkZ1bmMpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKICAgICAgICAgICAgICB2YWxzTGVuZ3RoID0gdmFsdWVzLmxlbmd0aCwKICAgICAgICAgICAgICByZXN1bHQgPSB7fTsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBpbmRleCA8IHZhbHNMZW5ndGggPyB2YWx1ZXNbaW5kZXhdIDogdW5kZWZpbmVkJDE7CiAgICAgICAgICAgIGFzc2lnbkZ1bmMocmVzdWx0LCBwcm9wc1tpbmRleF0sIHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGFuIGVtcHR5IGFycmF5IGlmIGl0J3Mgbm90IGFuIGFycmF5IGxpa2Ugb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgdGhlIGNhc3QgYXJyYXktbGlrZSBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2FzdEFycmF5TGlrZU9iamVjdCh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KHZhbHVlKSA/IHZhbHVlIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgY2FzdCBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlIDogaWRlbnRpdHk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGEgcGF0aCBhcnJheSBpZiBpdCdzIG5vdCBvbmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkga2V5cyBvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjYXN0UGF0aCh2YWx1ZSwgb2JqZWN0KSB7CiAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGlzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IHN0cmluZ1RvUGF0aCh0b1N0cmluZyh2YWx1ZSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBgYmFzZVJlc3RgIGFsaWFzIHdoaWNoIGNhbiBiZSByZXBsYWNlZCB3aXRoIGBpZGVudGl0eWAgYnkgbW9kdWxlCiAgICAgICAgICogcmVwbGFjZW1lbnQgcGx1Z2lucy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHR5cGUge0Z1bmN0aW9ufQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgdmFyIGNhc3RSZXN0ID0gYmFzZVJlc3Q7CgogICAgICAgIC8qKgogICAgICAgICAqIENhc3RzIGBhcnJheWAgdG8gYSBzbGljZSBpZiBpdCdzIG5lZWRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydCBwb3NpdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2VuZD1hcnJheS5sZW5ndGhdIFRoZSBlbmQgcG9zaXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBjYXN0IHNsaWNlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNhc3RTbGljZShhcnJheSwgc3RhcnQsIGVuZCkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkJDEgPyBsZW5ndGggOiBlbmQ7CiAgICAgICAgICByZXR1cm4gKCFzdGFydCAmJiBlbmQgPj0gbGVuZ3RoKSA/IGFycmF5IDogYmFzZVNsaWNlKGFycmF5LCBzdGFydCwgZW5kKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgc2ltcGxlIHdyYXBwZXIgYXJvdW5kIHRoZSBnbG9iYWwgW2BjbGVhclRpbWVvdXRgXShodHRwczovL21kbi5pby9jbGVhclRpbWVvdXQpLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge251bWJlcnxPYmplY3R9IGlkIFRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdCBvZiB0aGUgdGltZXIgdG8gY2xlYXIuCiAgICAgICAgICovCiAgICAgICAgdmFyIGNsZWFyVGltZW91dCA9IGN0eENsZWFyVGltZW91dCB8fCBmdW5jdGlvbihpZCkgewogICAgICAgICAgcmV0dXJuIHJvb3QuY2xlYXJUaW1lb3V0KGlkKTsKICAgICAgICB9OwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS4KICAgICAgICAgKiBAcmV0dXJucyB7QnVmZmVyfSBSZXR1cm5zIHRoZSBjbG9uZWQgYnVmZmVyLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNsb25lQnVmZmVyKGJ1ZmZlciwgaXNEZWVwKSB7CiAgICAgICAgICBpZiAoaXNEZWVwKSB7CiAgICAgICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBsZW5ndGggPSBidWZmZXIubGVuZ3RoLAogICAgICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTsKCiAgICAgICAgICBidWZmZXIuY29weShyZXN1bHQpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgYXJyYXlCdWZmZXJgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5QnVmZmVyfSBhcnJheUJ1ZmZlciBUaGUgYXJyYXkgYnVmZmVyIHRvIGNsb25lLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjbG9uZUFycmF5QnVmZmVyKGFycmF5QnVmZmVyKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICAgICAgbmV3IFVpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IFVpbnQ4QXJyYXkoYXJyYXlCdWZmZXIpKTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGRhdGFWaWV3YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRhdGFWaWV3IFRoZSBkYXRhIHZpZXcgdG8gY2xvbmUuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbaXNEZWVwXSBTcGVjaWZ5IGEgZGVlcCBjbG9uZS4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNsb25lRGF0YVZpZXcoZGF0YVZpZXcsIGlzRGVlcCkgewogICAgICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IGNsb25lQXJyYXlCdWZmZXIoZGF0YVZpZXcuYnVmZmVyKSA6IGRhdGFWaWV3LmJ1ZmZlcjsKICAgICAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgcmVnZXhwYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHJlZ2V4cCBUaGUgcmVnZXhwIHRvIGNsb25lLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2xvbmVSZWdFeHAocmVnZXhwKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7CiAgICAgICAgICByZXN1bHQubGFzdEluZGV4ID0gcmVnZXhwLmxhc3RJbmRleDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGBzeW1ib2xgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHN5bWJvbCBUaGUgc3ltYm9sIG9iamVjdCB0byBjbG9uZS4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjbG9uZVN5bWJvbChzeW1ib2wpIHsKICAgICAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIGB0eXBlZEFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHR5cGVkQXJyYXkgVGhlIHR5cGVkIGFycmF5IHRvIGNsb25lLgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2xvbmVkIHR5cGVkIGFycmF5LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHsKICAgICAgICAgIHZhciBidWZmZXIgPSBpc0RlZXAgPyBjbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyOwogICAgICAgICAgcmV0dXJuIG5ldyB0eXBlZEFycmF5LmNvbnN0cnVjdG9yKGJ1ZmZlciwgdHlwZWRBcnJheS5ieXRlT2Zmc2V0LCB0eXBlZEFycmF5Lmxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgdmFsdWVgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNvbXBhcmVBc2NlbmRpbmcodmFsdWUsIG90aGVyKSB7CiAgICAgICAgICBpZiAodmFsdWUgIT09IG90aGVyKSB7CiAgICAgICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkJDEsCiAgICAgICAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCwKICAgICAgICAgICAgICAgIHZhbElzUmVmbGV4aXZlID0gdmFsdWUgPT09IHZhbHVlLAogICAgICAgICAgICAgICAgdmFsSXNTeW1ib2wgPSBpc1N5bWJvbCh2YWx1ZSk7CgogICAgICAgICAgICB2YXIgb3RoSXNEZWZpbmVkID0gb3RoZXIgIT09IHVuZGVmaW5lZCQxLAogICAgICAgICAgICAgICAgb3RoSXNOdWxsID0gb3RoZXIgPT09IG51bGwsCiAgICAgICAgICAgICAgICBvdGhJc1JlZmxleGl2ZSA9IG90aGVyID09PSBvdGhlciwKICAgICAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2wob3RoZXIpOwoKICAgICAgICAgICAgaWYgKCghb3RoSXNOdWxsICYmICFvdGhJc1N5bWJvbCAmJiAhdmFsSXNTeW1ib2wgJiYgdmFsdWUgPiBvdGhlcikgfHwKICAgICAgICAgICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8CiAgICAgICAgICAgICAgICAodmFsSXNOdWxsICYmIG90aElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHwKICAgICAgICAgICAgICAgICghdmFsSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fAogICAgICAgICAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHwKICAgICAgICAgICAgICAgIChvdGhJc1N5bWJvbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUgJiYgIXZhbElzTnVsbCAmJiAhdmFsSXNTeW1ib2wpIHx8CiAgICAgICAgICAgICAgICAob3RoSXNOdWxsICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSkgfHwKICAgICAgICAgICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fAogICAgICAgICAgICAgICAgIW90aElzUmVmbGV4aXZlKSB7CiAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlcgogICAgICAgICAqIGFuZCBzdGFibGUgc29ydCB0aGVtLgogICAgICAgICAqCiAgICAgICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSwKICAgICAgICAgKiBzcGVjaWZ5IGFuIG9yZGVyIG9mICJkZXNjIiBmb3IgZGVzY2VuZGluZyBvciAiYXNjIiBmb3IgYXNjZW5kaW5nIHNvcnQgb3JkZXIKICAgICAgICAgKiBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW5bXXxzdHJpbmdbXX0gb3JkZXJzIFRoZSBvcmRlciB0byBzb3J0IGJ5IGZvciBlYWNoIHByb3BlcnR5LgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHNvcnQgb3JkZXIgaW5kaWNhdG9yIGZvciBgb2JqZWN0YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb21wYXJlTXVsdGlwbGUob2JqZWN0LCBvdGhlciwgb3JkZXJzKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSwKICAgICAgICAgICAgICBvdGhDcml0ZXJpYSA9IG90aGVyLmNyaXRlcmlhLAogICAgICAgICAgICAgIGxlbmd0aCA9IG9iakNyaXRlcmlhLmxlbmd0aCwKICAgICAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoOwoKICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjb21wYXJlQXNjZW5kaW5nKG9iakNyaXRlcmlhW2luZGV4XSwgb3RoQ3JpdGVyaWFbaW5kZXhdKTsKICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07CiAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCAqIChvcmRlciA9PSAnZGVzYycgPyAtMSA6IDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvLyBGaXhlcyBhbiBgQXJyYXkjc29ydGAgYnVnIGluIHRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgYXBwbGljYXRpb25zCiAgICAgICAgICAvLyB0aGF0IGNhdXNlcyBpdCwgdW5kZXIgY2VydGFpbiBjaXJjdW1zdGFuY2VzLCB0byBwcm92aWRlIHRoZSBzYW1lIHZhbHVlIGZvcgogICAgICAgICAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3CiAgICAgICAgICAvLyBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgLy8KICAgICAgICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuCiAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9OTAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgIHJldHVybiBvYmplY3QuaW5kZXggLSBvdGhlci5pbmRleDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgdGhhdCBpcyB0aGUgY29tcG9zaXRpb24gb2YgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLAogICAgICAgICAqIHBsYWNlaG9sZGVycywgYW5kIHByb3ZpZGVkIGFyZ3VtZW50cyBpbnRvIGEgc2luZ2xlIGFycmF5IG9mIGFyZ3VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgcHJvdmlkZWQgYXJndW1lbnRzLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHBhcnRpYWxzIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuCiAgICAgICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29tcG9zZUFyZ3MoYXJncywgcGFydGlhbHMsIGhvbGRlcnMsIGlzQ3VycmllZCkgewogICAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLAogICAgICAgICAgICAgIGFyZ3NMZW5ndGggPSBhcmdzLmxlbmd0aCwKICAgICAgICAgICAgICBob2xkZXJzTGVuZ3RoID0gaG9sZGVycy5sZW5ndGgsCiAgICAgICAgICAgICAgbGVmdEluZGV4ID0gLTEsCiAgICAgICAgICAgICAgbGVmdExlbmd0aCA9IHBhcnRpYWxzLmxlbmd0aCwKICAgICAgICAgICAgICByYW5nZUxlbmd0aCA9IG5hdGl2ZU1heChhcmdzTGVuZ3RoIC0gaG9sZGVyc0xlbmd0aCwgMCksCiAgICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobGVmdExlbmd0aCArIHJhbmdlTGVuZ3RoKSwKICAgICAgICAgICAgICBpc1VuY3VycmllZCA9ICFpc0N1cnJpZWQ7CgogICAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkgewogICAgICAgICAgICByZXN1bHRbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoKythcmdzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7CiAgICAgICAgICAgICAgcmVzdWx0W2hvbGRlcnNbYXJnc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHdoaWxlIChyYW5nZUxlbmd0aC0tKSB7CiAgICAgICAgICAgIHJlc3VsdFtsZWZ0SW5kZXgrK10gPSBhcmdzW2FyZ3NJbmRleCsrXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGNvbXBvc2VBcmdzYCBleGNlcHQgdGhhdCB0aGUgYXJndW1lbnRzIGNvbXBvc2l0aW9uCiAgICAgICAgICogaXMgdGFpbG9yZWQgZm9yIGBfLnBhcnRpYWxSaWdodGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgVGhlIHByb3ZpZGVkIGFyZ3VtZW50cy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIGFwcGVuZCB0byB0aG9zZSBwcm92aWRlZC4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBob2xkZXJzIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuCiAgICAgICAgICogQHBhcmFtcyB7Ym9vbGVhbn0gW2lzQ3VycmllZF0gU3BlY2lmeSBjb21wb3NpbmcgZm9yIGEgY3VycmllZCBmdW5jdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21wb3NlZCBhcmd1bWVudHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29tcG9zZUFyZ3NSaWdodChhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKSB7CiAgICAgICAgICB2YXIgYXJnc0luZGV4ID0gLTEsCiAgICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3MubGVuZ3RoLAogICAgICAgICAgICAgIGhvbGRlcnNJbmRleCA9IC0xLAogICAgICAgICAgICAgIGhvbGRlcnNMZW5ndGggPSBob2xkZXJzLmxlbmd0aCwKICAgICAgICAgICAgICByaWdodEluZGV4ID0gLTEsCiAgICAgICAgICAgICAgcmlnaHRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsCiAgICAgICAgICAgICAgcmFuZ2VMZW5ndGggPSBuYXRpdmVNYXgoYXJnc0xlbmd0aCAtIGhvbGRlcnNMZW5ndGgsIDApLAogICAgICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHJhbmdlTGVuZ3RoICsgcmlnaHRMZW5ndGgpLAogICAgICAgICAgICAgIGlzVW5jdXJyaWVkID0gIWlzQ3VycmllZDsKCiAgICAgICAgICB3aGlsZSAoKythcmdzSW5kZXggPCByYW5nZUxlbmd0aCkgewogICAgICAgICAgICByZXN1bHRbYXJnc0luZGV4XSA9IGFyZ3NbYXJnc0luZGV4XTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBvZmZzZXQgPSBhcmdzSW5kZXg7CiAgICAgICAgICB3aGlsZSAoKytyaWdodEluZGV4IDwgcmlnaHRMZW5ndGgpIHsKICAgICAgICAgICAgcmVzdWx0W29mZnNldCArIHJpZ2h0SW5kZXhdID0gcGFydGlhbHNbcmlnaHRJbmRleF07CiAgICAgICAgICB9CiAgICAgICAgICB3aGlsZSAoKytob2xkZXJzSW5kZXggPCBob2xkZXJzTGVuZ3RoKSB7CiAgICAgICAgICAgIGlmIChpc1VuY3VycmllZCB8fCBhcmdzSW5kZXggPCBhcmdzTGVuZ3RoKSB7CiAgICAgICAgICAgICAgcmVzdWx0W29mZnNldCArIGhvbGRlcnNbaG9sZGVyc0luZGV4XV0gPSBhcmdzW2FyZ3NJbmRleCsrXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvcGllcyB0aGUgdmFsdWVzIG9mIGBzb3VyY2VgIHRvIGBhcnJheWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHNvdXJjZSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgZnJvbS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXk9W11dIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyB0by4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb3B5QXJyYXkoc291cmNlLCBhcnJheSkgewogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgbGVuZ3RoID0gc291cmNlLmxlbmd0aDsKCiAgICAgICAgICBhcnJheSB8fCAoYXJyYXkgPSBBcnJheShsZW5ndGgpKTsKICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIGFycmF5W2luZGV4XSA9IHNvdXJjZVtpbmRleF07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycyB0byBjb3B5LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyB0by4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHsKICAgICAgICAgIHZhciBpc05ldyA9ICFvYmplY3Q7CiAgICAgICAgICBvYmplY3QgfHwgKG9iamVjdCA9IHt9KTsKCiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSBwcm9wcy5sZW5ndGg7CgogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTsKCiAgICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIKICAgICAgICAgICAgICA/IGN1c3RvbWl6ZXIob2JqZWN0W2tleV0sIHNvdXJjZVtrZXldLCBrZXksIG9iamVjdCwgc291cmNlKQogICAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNOZXcpIHsKICAgICAgICAgICAgICBiYXNlQXNzaWduVmFsdWUob2JqZWN0LCBrZXksIG5ld1ZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29waWVzIG93biBzeW1ib2xzIG9mIGBzb3VyY2VgIHRvIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIGZyb20uCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29weVN5bWJvbHMoc291cmNlLCBvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBjb3B5T2JqZWN0KHNvdXJjZSwgZ2V0U3ltYm9scyhzb3VyY2UpLCBvYmplY3QpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29waWVzIG93biBhbmQgaW5oZXJpdGVkIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgdG8uCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb3B5U3ltYm9sc0luKHNvdXJjZSwgb2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gY29weU9iamVjdChzb3VyY2UsIGdldFN5bWJvbHNJbihzb3VyY2UpLCBvYmplY3QpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uZ3JvdXBCeWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaW5pdGlhbGl6ZXJdIFRoZSBhY2N1bXVsYXRvciBvYmplY3QgaW5pdGlhbGl6ZXIuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYWdncmVnYXRvciBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVBZ2dyZWdhdG9yKHNldHRlciwgaW5pdGlhbGl6ZXIpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkgewogICAgICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUFnZ3JlZ2F0b3IgOiBiYXNlQWdncmVnYXRvciwKICAgICAgICAgICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdGlhbGl6ZXIgPyBpbml0aWFsaXplcigpIDoge307CgogICAgICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBzZXR0ZXIsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSwgYWNjdW11bGF0b3IpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLmFzc2lnbmAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFzc2lnbmVyIFRoZSBmdW5jdGlvbiB0byBhc3NpZ24gdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUFzc2lnbmVyKGFzc2lnbmVyKSB7CiAgICAgICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2VzKSB7CiAgICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgICAgbGVuZ3RoID0gc291cmNlcy5sZW5ndGgsCiAgICAgICAgICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoID4gMSA/IHNvdXJjZXNbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQkMSwKICAgICAgICAgICAgICAgIGd1YXJkID0gbGVuZ3RoID4gMiA/IHNvdXJjZXNbMl0gOiB1bmRlZmluZWQkMTsKCiAgICAgICAgICAgIGN1c3RvbWl6ZXIgPSAoYXNzaWduZXIubGVuZ3RoID4gMyAmJiB0eXBlb2YgY3VzdG9taXplciA9PSAnZnVuY3Rpb24nKQogICAgICAgICAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKQogICAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7CiAgICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA8IDMgPyB1bmRlZmluZWQkMSA6IGN1c3RvbWl6ZXI7CiAgICAgICAgICAgICAgbGVuZ3RoID0gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTsKICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07CiAgICAgICAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICAgICAgYXNzaWduZXIob2JqZWN0LCBzb3VyY2UsIGluZGV4LCBjdXN0b21pemVyKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGBiYXNlRWFjaGAgb3IgYGJhc2VFYWNoUmlnaHRgIGZ1bmN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlYWNoRnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VFYWNoKGVhY2hGdW5jLCBmcm9tUmlnaHQpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkgewogICAgICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc0FycmF5TGlrZShjb2xsZWN0aW9uKSkgewogICAgICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGNvbGxlY3Rpb24ubGVuZ3RoLAogICAgICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSwKICAgICAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pOwoKICAgICAgICAgICAgd2hpbGUgKChmcm9tUmlnaHQgPyBpbmRleC0tIDogKytpbmRleCA8IGxlbmd0aCkpIHsKICAgICAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBiYXNlIGZ1bmN0aW9uIGZvciBtZXRob2RzIGxpa2UgYF8uZm9ySW5gIGFuZCBgXy5mb3JPd25gLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUJhc2VGb3IoZnJvbVJpZ2h0KSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0LCBpdGVyYXRlZSwga2V5c0Z1bmMpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgICBpdGVyYWJsZSA9IE9iamVjdChvYmplY3QpLAogICAgICAgICAgICAgICAgcHJvcHMgPSBrZXlzRnVuYyhvYmplY3QpLAogICAgICAgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwoKICAgICAgICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgICAgICAgdmFyIGtleSA9IHByb3BzW2Zyb21SaWdodCA/IGxlbmd0aCA6ICsraW5kZXhdOwogICAgICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgb3B0aW9uYWwgYHRoaXNgCiAgICAgICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlQmluZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnKSB7CiAgICAgICAgICB2YXIgaXNCaW5kID0gYml0bWFzayAmIFdSQVBfQklORF9GTEFHLAogICAgICAgICAgICAgIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpOwoKICAgICAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7CiAgICAgICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShpc0JpbmQgPyB0aGlzQXJnIDogdGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB3cmFwcGVyOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ubG93ZXJGaXJzdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIFRoZSBuYW1lIG9mIHRoZSBgU3RyaW5nYCBjYXNlIG1ldGhvZCB0byB1c2UuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FzZSBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVDYXNlRmlyc3QobWV0aG9kTmFtZSkgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwoKICAgICAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBoYXNVbmljb2RlKHN0cmluZykKICAgICAgICAgICAgICA/IHN0cmluZ1RvQXJyYXkoc3RyaW5nKQogICAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgICB2YXIgY2hyID0gc3RyU3ltYm9scwogICAgICAgICAgICAgID8gc3RyU3ltYm9sc1swXQogICAgICAgICAgICAgIDogc3RyaW5nLmNoYXJBdCgwKTsKCiAgICAgICAgICAgIHZhciB0cmFpbGluZyA9IHN0clN5bWJvbHMKICAgICAgICAgICAgICA/IGNhc3RTbGljZShzdHJTeW1ib2xzLCAxKS5qb2luKCcnKQogICAgICAgICAgICAgIDogc3RyaW5nLnNsaWNlKDEpOwoKICAgICAgICAgICAgcmV0dXJuIGNoclttZXRob2ROYW1lXSgpICsgdHJhaWxpbmc7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8uY2FtZWxDYXNlYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY2FsbGJhY2sgVGhlIGZ1bmN0aW9uIHRvIGNvbWJpbmUgZWFjaCB3b3JkLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvdW5kZXIgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlQ29tcG91bmRlcihjYWxsYmFjaykgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgICAgICByZXR1cm4gYXJyYXlSZWR1Y2Uod29yZHMoZGVidXJyKHN0cmluZykucmVwbGFjZShyZUFwb3MsICcnKSksIGNhbGxiYWNrLCAnJyk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcHJvZHVjZXMgYW4gaW5zdGFuY2Ugb2YgYEN0b3JgIHJlZ2FyZGxlc3Mgb2YKICAgICAgICAgKiB3aGV0aGVyIGl0IHdhcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBgbmV3YCBleHByZXNzaW9uIG9yIGJ5IGBjYWxsYCBvciBgYXBwbHlgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBDdG9yIFRoZSBjb25zdHJ1Y3RvciB0byB3cmFwLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHdyYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlQ3RvcihDdG9yKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIC8vIFVzZSBhIGBzd2l0Y2hgIHN0YXRlbWVudCB0byB3b3JrIHdpdGggY2xhc3MgY29uc3RydWN0b3JzLiBTZWUKICAgICAgICAgICAgLy8gaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1mdW5jdGlvbi1vYmplY3RzLWNhbGwtdGhpc2FyZ3VtZW50LWFyZ3VtZW50c2xpc3QKICAgICAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHsKICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBuZXcgQ3RvcjsKICAgICAgICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdKTsKICAgICAgICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdKTsKICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTsKICAgICAgICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdKTsKICAgICAgICAgICAgICBjYXNlIDU6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdKTsKICAgICAgICAgICAgICBjYXNlIDY6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdKTsKICAgICAgICAgICAgICBjYXNlIDc6IHJldHVybiBuZXcgQ3RvcihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCBhcmdzWzNdLCBhcmdzWzRdLCBhcmdzWzVdLCBhcmdzWzZdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGhpc0JpbmRpbmcgPSBiYXNlQ3JlYXRlKEN0b3IucHJvdG90eXBlKSwKICAgICAgICAgICAgICAgIHJlc3VsdCA9IEN0b3IuYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpOwoKICAgICAgICAgICAgLy8gTWltaWMgdGhlIGNvbnN0cnVjdG9yJ3MgYHJldHVybmAgYmVoYXZpb3IuCiAgICAgICAgICAgIC8vIFNlZSBodHRwczovL2VzNS5naXRodWIuaW8vI3gxMy4yLjIgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgcmV0dXJuIGlzT2JqZWN0KHJlc3VsdCkgPyByZXN1bHQgOiB0aGlzQmluZGluZzsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gZW5hYmxlIGN1cnJ5aW5nLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGFyaXR5IFRoZSBhcml0eSBvZiBgZnVuY2AuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSkgewogICAgICAgICAgdmFyIEN0b3IgPSBjcmVhdGVDdG9yKGZ1bmMpOwoKICAgICAgICAgIGZ1bmN0aW9uIHdyYXBwZXIoKSB7CiAgICAgICAgICAgIHZhciBsZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoLAogICAgICAgICAgICAgICAgYXJncyA9IEFycmF5KGxlbmd0aCksCiAgICAgICAgICAgICAgICBpbmRleCA9IGxlbmd0aCwKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpOwoKICAgICAgICAgICAgd2hpbGUgKGluZGV4LS0pIHsKICAgICAgICAgICAgICBhcmdzW2luZGV4XSA9IGFyZ3VtZW50c1tpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGhvbGRlcnMgPSAobGVuZ3RoIDwgMyAmJiBhcmdzWzBdICE9PSBwbGFjZWhvbGRlciAmJiBhcmdzW2xlbmd0aCAtIDFdICE9PSBwbGFjZWhvbGRlcikKICAgICAgICAgICAgICA/IFtdCiAgICAgICAgICAgICAgOiByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7CgogICAgICAgICAgICBsZW5ndGggLT0gaG9sZGVycy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChsZW5ndGggPCBhcml0eSkgewogICAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZWN1cnJ5KAogICAgICAgICAgICAgICAgZnVuYywgYml0bWFzaywgY3JlYXRlSHlicmlkLCB3cmFwcGVyLnBsYWNlaG9sZGVyLCB1bmRlZmluZWQkMSwKICAgICAgICAgICAgICAgIGFyZ3MsIGhvbGRlcnMsIHVuZGVmaW5lZCQxLCB1bmRlZmluZWQkMSwgYXJpdHkgLSBsZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmbiA9ICh0aGlzICYmIHRoaXMgIT09IHJvb3QgJiYgdGhpcyBpbnN0YW5jZW9mIHdyYXBwZXIpID8gQ3RvciA6IGZ1bmM7CiAgICAgICAgICAgIHJldHVybiBhcHBseShmbiwgdGhpcywgYXJncyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gd3JhcHBlcjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmluZCBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCkgewogICAgICAgICAgICB2YXIgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7CiAgICAgICAgICAgIGlmICghaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpOwogICAgICAgICAgICAgIGNvbGxlY3Rpb24gPSBrZXlzKGNvbGxlY3Rpb24pOwogICAgICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGluZGV4ID0gZmluZEluZGV4RnVuYyhjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGZyb21JbmRleCk7CiAgICAgICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBgXy5mbG93YCBvciBgXy5mbG93UmlnaHRgIGZ1bmN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmbG93IGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUZsb3coZnJvbVJpZ2h0KSB7CiAgICAgICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oZnVuY3MpIHsKICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGZ1bmNzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGluZGV4ID0gbGVuZ3RoLAogICAgICAgICAgICAgICAgcHJlcmVxID0gTG9kYXNoV3JhcHBlci5wcm90b3R5cGUudGhydTsKCiAgICAgICAgICAgIGlmIChmcm9tUmlnaHQpIHsKICAgICAgICAgICAgICBmdW5jcy5yZXZlcnNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGluZGV4LS0pIHsKICAgICAgICAgICAgICB2YXIgZnVuYyA9IGZ1bmNzW2luZGV4XTsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBpZiAocHJlcmVxICYmICF3cmFwcGVyICYmIGdldEZ1bmNOYW1lKGZ1bmMpID09ICd3cmFwcGVyJykgewogICAgICAgICAgICAgICAgdmFyIHdyYXBwZXIgPSBuZXcgTG9kYXNoV3JhcHBlcihbXSwgdHJ1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZGV4ID0gd3JhcHBlciA/IGluZGV4IDogbGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICAgIGZ1bmMgPSBmdW5jc1tpbmRleF07CgogICAgICAgICAgICAgIHZhciBmdW5jTmFtZSA9IGdldEZ1bmNOYW1lKGZ1bmMpLAogICAgICAgICAgICAgICAgICBkYXRhID0gZnVuY05hbWUgPT0gJ3dyYXBwZXInID8gZ2V0RGF0YShmdW5jKSA6IHVuZGVmaW5lZCQxOwoKICAgICAgICAgICAgICBpZiAoZGF0YSAmJiBpc0xhemlhYmxlKGRhdGFbMF0pICYmCiAgICAgICAgICAgICAgICAgICAgZGF0YVsxXSA9PSAoV1JBUF9BUllfRkxBRyB8IFdSQVBfQ1VSUllfRkxBRyB8IFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSAmJgogICAgICAgICAgICAgICAgICAgICFkYXRhWzRdLmxlbmd0aCAmJiBkYXRhWzldID09IDEKICAgICAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgICB3cmFwcGVyID0gd3JhcHBlcltnZXRGdW5jTmFtZShkYXRhWzBdKV0uYXBwbHkod3JhcHBlciwgZGF0YVszXSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHdyYXBwZXIgPSAoZnVuYy5sZW5ndGggPT0gMSAmJiBpc0xhemlhYmxlKGZ1bmMpKQogICAgICAgICAgICAgICAgICA/IHdyYXBwZXJbZnVuY05hbWVdKCkKICAgICAgICAgICAgICAgICAgOiB3cmFwcGVyLnRocnUoZnVuYyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhcmdzWzBdOwoKICAgICAgICAgICAgICBpZiAod3JhcHBlciAmJiBhcmdzLmxlbmd0aCA9PSAxICYmIGlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlci5wbGFudCh2YWx1ZSkudmFsdWUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgdmFyIGluZGV4ID0gMCwKICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbGVuZ3RoID8gZnVuY3NbaW5kZXhdLmFwcGx5KHRoaXMsIGFyZ3MpIDogdmFsdWU7CgogICAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jc1tpbmRleF0uY2FsbCh0aGlzLCByZXN1bHQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9OwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCB3cmFwcyBgZnVuY2AgdG8gaW52b2tlIGl0IHdpdGggb3B0aW9uYWwgYHRoaXNgCiAgICAgICAgICogYmluZGluZyBvZiBgdGhpc0FyZ2AsIHBhcnRpYWwgYXBwbGljYXRpb24sIGFuZCBjdXJyeWluZy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbnxzdHJpbmd9IGZ1bmMgVGhlIGZ1bmN0aW9uIG9yIG1ldGhvZCBuYW1lIHRvIHdyYXAuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBwcmVwZW5kIHRvIHRob3NlIHByb3ZpZGVkIHRvCiAgICAgICAgICogIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNdIFRoZSBgcGFydGlhbHNgIHBsYWNlaG9sZGVyIGluZGV4ZXMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3BhcnRpYWxzUmlnaHRdIFRoZSBhcmd1bWVudHMgdG8gYXBwZW5kIHRvIHRob3NlIHByb3ZpZGVkCiAgICAgICAgICogIHRvIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW2hvbGRlcnNSaWdodF0gVGhlIGBwYXJ0aWFsc1JpZ2h0YCBwbGFjZWhvbGRlciBpbmRleGVzLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUh5YnJpZChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgcGFydGlhbHNSaWdodCwgaG9sZGVyc1JpZ2h0LCBhcmdQb3MsIGFyeSwgYXJpdHkpIHsKICAgICAgICAgIHZhciBpc0FyeSA9IGJpdG1hc2sgJiBXUkFQX0FSWV9GTEFHLAogICAgICAgICAgICAgIGlzQmluZCA9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRywKICAgICAgICAgICAgICBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHLAogICAgICAgICAgICAgIGlzQ3VycmllZCA9IGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSwKICAgICAgICAgICAgICBpc0ZsaXAgPSBiaXRtYXNrICYgV1JBUF9GTElQX0ZMQUcsCiAgICAgICAgICAgICAgQ3RvciA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCQxIDogY3JlYXRlQ3RvcihmdW5jKTsKCiAgICAgICAgICBmdW5jdGlvbiB3cmFwcGVyKCkgewogICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCwKICAgICAgICAgICAgICAgIGFyZ3MgPSBBcnJheShsZW5ndGgpLAogICAgICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7CgogICAgICAgICAgICB3aGlsZSAoaW5kZXgtLSkgewogICAgICAgICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNDdXJyaWVkKSB7CiAgICAgICAgICAgICAgdmFyIHBsYWNlaG9sZGVyID0gZ2V0SG9sZGVyKHdyYXBwZXIpLAogICAgICAgICAgICAgICAgICBob2xkZXJzQ291bnQgPSBjb3VudEhvbGRlcnMoYXJncywgcGxhY2Vob2xkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJ0aWFscykgewogICAgICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJncyhhcmdzLCBwYXJ0aWFscywgaG9sZGVycywgaXNDdXJyaWVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocGFydGlhbHNSaWdodCkgewogICAgICAgICAgICAgIGFyZ3MgPSBjb21wb3NlQXJnc1JpZ2h0KGFyZ3MsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwgaXNDdXJyaWVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZW5ndGggLT0gaG9sZGVyc0NvdW50OwogICAgICAgICAgICBpZiAoaXNDdXJyaWVkICYmIGxlbmd0aCA8IGFyaXR5KSB7CiAgICAgICAgICAgICAgdmFyIG5ld0hvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhhcmdzLCBwbGFjZWhvbGRlcik7CiAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVJlY3VycnkoCiAgICAgICAgICAgICAgICBmdW5jLCBiaXRtYXNrLCBjcmVhdGVIeWJyaWQsIHdyYXBwZXIucGxhY2Vob2xkZXIsIHRoaXNBcmcsCiAgICAgICAgICAgICAgICBhcmdzLCBuZXdIb2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkgLSBsZW5ndGgKICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aGlzQmluZGluZyA9IGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLAogICAgICAgICAgICAgICAgZm4gPSBpc0JpbmRLZXkgPyB0aGlzQmluZGluZ1tmdW5jXSA6IGZ1bmM7CgogICAgICAgICAgICBsZW5ndGggPSBhcmdzLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGFyZ1BvcykgewogICAgICAgICAgICAgIGFyZ3MgPSByZW9yZGVyKGFyZ3MsIGFyZ1Bvcyk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNGbGlwICYmIGxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICBhcmdzLnJldmVyc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNBcnkgJiYgYXJ5IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgYXJncy5sZW5ndGggPSBhcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMgJiYgdGhpcyAhPT0gcm9vdCAmJiB0aGlzIGluc3RhbmNlb2Ygd3JhcHBlcikgewogICAgICAgICAgICAgIGZuID0gQ3RvciB8fCBjcmVhdGVDdG9yKGZuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkodGhpc0JpbmRpbmcsIGFyZ3MpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHdyYXBwZXI7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5pbnZlcnRCeWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHNldHRlciBUaGUgZnVuY3Rpb24gdG8gc2V0IGFjY3VtdWxhdG9yIHZhbHVlcy4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0b0l0ZXJhdGVlIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIGl0ZXJhdGVlcy4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBpbnZlcnRlciBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVJbnZlcnRlcihzZXR0ZXIsIHRvSXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QsIGl0ZXJhdGVlKSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlSW52ZXJ0ZXIob2JqZWN0LCBzZXR0ZXIsIHRvSXRlcmF0ZWUoaXRlcmF0ZWUpLCB7fSk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBtYXRoZW1hdGljYWwgb3BlcmF0aW9uIG9uIHR3byB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9wZXJhdG9yIFRoZSBmdW5jdGlvbiB0byBwZXJmb3JtIHRoZSBvcGVyYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSB1c2VkIGZvciBgdW5kZWZpbmVkYCBhcmd1bWVudHMuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbiBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVNYXRoT3BlcmF0aW9uKG9wZXJhdG9yLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQkMSAmJiBvdGhlciA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXIgIT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvdGhlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gYmFzZVRvU3RyaW5nKHZhbHVlKTsKICAgICAgICAgICAgICAgIG90aGVyID0gYmFzZVRvU3RyaW5nKG90aGVyKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdmFsdWUgPSBiYXNlVG9OdW1iZXIodmFsdWUpOwogICAgICAgICAgICAgICAgb3RoZXIgPSBiYXNlVG9OdW1iZXIob3RoZXIpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXN1bHQgPSBvcGVyYXRvcih2YWx1ZSwgb3RoZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIGxpa2UgYF8ub3ZlcmAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGFycmF5RnVuYyBUaGUgZnVuY3Rpb24gdG8gaXRlcmF0ZSBvdmVyIGl0ZXJhdGVlcy4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBvdmVyIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZU92ZXIoYXJyYXlGdW5jKSB7CiAgICAgICAgICByZXR1cm4gZmxhdFJlc3QoZnVuY3Rpb24oaXRlcmF0ZWVzKSB7CiAgICAgICAgICAgIGl0ZXJhdGVlcyA9IGFycmF5TWFwKGl0ZXJhdGVlcywgYmFzZVVuYXJ5KGdldEl0ZXJhdGVlKCkpKTsKICAgICAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICAgICAgICB2YXIgdGhpc0FyZyA9IHRoaXM7CiAgICAgICAgICAgICAgcmV0dXJuIGFycmF5RnVuYyhpdGVyYXRlZXMsIGZ1bmN0aW9uKGl0ZXJhdGVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHRoaXNBcmcsIGFyZ3MpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyB0aGUgcGFkZGluZyBmb3IgYHN0cmluZ2AgYmFzZWQgb24gYGxlbmd0aGAuIFRoZSBgY2hhcnNgIHN0cmluZwogICAgICAgICAqIGlzIHRydW5jYXRlZCBpZiB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgZXhjZWVkcyBgbGVuZ3RoYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBUaGUgcGFkZGluZyBsZW5ndGguCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRpbmcgZm9yIGBzdHJpbmdgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVBhZGRpbmcobGVuZ3RoLCBjaGFycykgewogICAgICAgICAgY2hhcnMgPSBjaGFycyA9PT0gdW5kZWZpbmVkJDEgPyAnICcgOiBiYXNlVG9TdHJpbmcoY2hhcnMpOwoKICAgICAgICAgIHZhciBjaGFyc0xlbmd0aCA9IGNoYXJzLmxlbmd0aDsKICAgICAgICAgIGlmIChjaGFyc0xlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIGNoYXJzTGVuZ3RoID8gYmFzZVJlcGVhdChjaGFycywgbGVuZ3RoKSA6IGNoYXJzOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VSZXBlYXQoY2hhcnMsIG5hdGl2ZUNlaWwobGVuZ3RoIC8gc3RyaW5nU2l6ZShjaGFycykpKTsKICAgICAgICAgIHJldHVybiBoYXNVbmljb2RlKGNoYXJzKQogICAgICAgICAgICA/IGNhc3RTbGljZShzdHJpbmdUb0FycmF5KHJlc3VsdCksIDAsIGxlbmd0aCkuam9pbignJykKICAgICAgICAgICAgOiByZXN1bHQuc2xpY2UoMCwgbGVuZ3RoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmdW5jYCB0byBpbnZva2UgaXQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcKICAgICAgICAgKiBvZiBgdGhpc0FyZ2AgYW5kIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgKiBAcGFyYW0geyp9IHRoaXNBcmcgVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBwYXJ0aWFscyBUaGUgYXJndW1lbnRzIHRvIHByZXBlbmQgdG8gdGhvc2UgcHJvdmlkZWQgdG8KICAgICAgICAgKiAgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVBhcnRpYWwoZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMpIHsKICAgICAgICAgIHZhciBpc0JpbmQgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0ZMQUcsCiAgICAgICAgICAgICAgQ3RvciA9IGNyZWF0ZUN0b3IoZnVuYyk7CgogICAgICAgICAgZnVuY3Rpb24gd3JhcHBlcigpIHsKICAgICAgICAgICAgdmFyIGFyZ3NJbmRleCA9IC0xLAogICAgICAgICAgICAgICAgYXJnc0xlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGgsCiAgICAgICAgICAgICAgICBsZWZ0SW5kZXggPSAtMSwKICAgICAgICAgICAgICAgIGxlZnRMZW5ndGggPSBwYXJ0aWFscy5sZW5ndGgsCiAgICAgICAgICAgICAgICBhcmdzID0gQXJyYXkobGVmdExlbmd0aCArIGFyZ3NMZW5ndGgpLAogICAgICAgICAgICAgICAgZm4gPSAodGhpcyAmJiB0aGlzICE9PSByb290ICYmIHRoaXMgaW5zdGFuY2VvZiB3cmFwcGVyKSA/IEN0b3IgOiBmdW5jOwoKICAgICAgICAgICAgd2hpbGUgKCsrbGVmdEluZGV4IDwgbGVmdExlbmd0aCkgewogICAgICAgICAgICAgIGFyZ3NbbGVmdEluZGV4XSA9IHBhcnRpYWxzW2xlZnRJbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGFyZ3NMZW5ndGgtLSkgewogICAgICAgICAgICAgIGFyZ3NbbGVmdEluZGV4KytdID0gYXJndW1lbnRzWysrYXJnc0luZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXBwbHkoZm4sIGlzQmluZCA/IHRoaXNBcmcgOiB0aGlzLCBhcmdzKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB3cmFwcGVyOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGBfLnJhbmdlYCBvciBgXy5yYW5nZVJpZ2h0YCBmdW5jdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmFuZ2UgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlUmFuZ2UoZnJvbVJpZ2h0KSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RhcnQsIGVuZCwgc3RlcCkgewogICAgICAgICAgICBpZiAoc3RlcCAmJiB0eXBlb2Ygc3RlcCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdGFydCwgZW5kLCBzdGVwKSkgewogICAgICAgICAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQkMTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgdGhlIHNpZ24gb2YgYC0wYCBpcyBwcmVzZXJ2ZWQuCiAgICAgICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpOwogICAgICAgICAgICBpZiAoZW5kID09PSB1bmRlZmluZWQkMSkgewogICAgICAgICAgICAgIGVuZCA9IHN0YXJ0OwogICAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBlbmQgPSB0b0Zpbml0ZShlbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZXAgPSBzdGVwID09PSB1bmRlZmluZWQkMSA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZShzdGVwKTsKICAgICAgICAgICAgcmV0dXJuIGJhc2VSYW5nZShzdGFydCwgZW5kLCBzdGVwLCBmcm9tUmlnaHQpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcmVsYXRpb25hbCBvcGVyYXRpb24gb24gdHdvIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gb3BlcmF0b3IgVGhlIGZ1bmN0aW9uIHRvIHBlcmZvcm0gdGhlIG9wZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZWxhdGlvbmFsIG9wZXJhdGlvbiBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKG9wZXJhdG9yKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIG90aGVyKSB7CiAgICAgICAgICAgIGlmICghKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyAmJiB0eXBlb2Ygb3RoZXIgPT0gJ3N0cmluZycpKSB7CiAgICAgICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgb3RoZXIgPSB0b051bWJlcihvdGhlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9wZXJhdG9yKHZhbHVlLCBvdGhlcik7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgd3JhcHMgYGZ1bmNgIHRvIGNvbnRpbnVlIGN1cnJ5aW5nLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byB3cmFwLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGNyZWF0ZVdyYXBgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gd3JhcEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSB0aGUgYGZ1bmNgIHdyYXBwZXIuCiAgICAgICAgICogQHBhcmFtIHsqfSBwbGFjZWhvbGRlciBUaGUgcGxhY2Vob2xkZXIgdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHsqfSBbdGhpc0FyZ10gVGhlIGB0aGlzYCBiaW5kaW5nIG9mIGBmdW5jYC4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gcHJlcGVuZCB0byB0aG9zZSBwcm92aWRlZCB0bwogICAgICAgICAqICB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtob2xkZXJzXSBUaGUgYHBhcnRpYWxzYCBwbGFjZWhvbGRlciBpbmRleGVzLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcmdQb3NdIFRoZSBhcmd1bWVudCBwb3NpdGlvbnMgb2YgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyeV0gVGhlIGFyaXR5IGNhcCBvZiBgZnVuY2AuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eV0gVGhlIGFyaXR5IG9mIGBmdW5jYC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyB3cmFwcGVkIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVJlY3VycnkoZnVuYywgYml0bWFzaywgd3JhcEZ1bmMsIHBsYWNlaG9sZGVyLCB0aGlzQXJnLCBwYXJ0aWFscywgaG9sZGVycywgYXJnUG9zLCBhcnksIGFyaXR5KSB7CiAgICAgICAgICB2YXIgaXNDdXJyeSA9IGJpdG1hc2sgJiBXUkFQX0NVUlJZX0ZMQUcsCiAgICAgICAgICAgICAgbmV3SG9sZGVycyA9IGlzQ3VycnkgPyBob2xkZXJzIDogdW5kZWZpbmVkJDEsCiAgICAgICAgICAgICAgbmV3SG9sZGVyc1JpZ2h0ID0gaXNDdXJyeSA/IHVuZGVmaW5lZCQxIDogaG9sZGVycywKICAgICAgICAgICAgICBuZXdQYXJ0aWFscyA9IGlzQ3VycnkgPyBwYXJ0aWFscyA6IHVuZGVmaW5lZCQxLAogICAgICAgICAgICAgIG5ld1BhcnRpYWxzUmlnaHQgPSBpc0N1cnJ5ID8gdW5kZWZpbmVkJDEgOiBwYXJ0aWFsczsKCiAgICAgICAgICBiaXRtYXNrIHw9IChpc0N1cnJ5ID8gV1JBUF9QQVJUSUFMX0ZMQUcgOiBXUkFQX1BBUlRJQUxfUklHSFRfRkxBRyk7CiAgICAgICAgICBiaXRtYXNrICY9IH4oaXNDdXJyeSA/IFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHIDogV1JBUF9QQVJUSUFMX0ZMQUcpOwoKICAgICAgICAgIGlmICghKGJpdG1hc2sgJiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUcpKSB7CiAgICAgICAgICAgIGJpdG1hc2sgJj0gfihXUkFQX0JJTkRfRkxBRyB8IFdSQVBfQklORF9LRVlfRkxBRyk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbmV3RGF0YSA9IFsKICAgICAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgbmV3UGFydGlhbHMsIG5ld0hvbGRlcnMsIG5ld1BhcnRpYWxzUmlnaHQsCiAgICAgICAgICAgIG5ld0hvbGRlcnNSaWdodCwgYXJnUG9zLCBhcnksIGFyaXR5CiAgICAgICAgICBdOwoKICAgICAgICAgIHZhciByZXN1bHQgPSB3cmFwRnVuYy5hcHBseSh1bmRlZmluZWQkMSwgbmV3RGF0YSk7CiAgICAgICAgICBpZiAoaXNMYXppYWJsZShmdW5jKSkgewogICAgICAgICAgICBzZXREYXRhKHJlc3VsdCwgbmV3RGF0YSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQucGxhY2Vob2xkZXIgPSBwbGFjZWhvbGRlcjsKICAgICAgICAgIHJldHVybiBzZXRXcmFwVG9TdHJpbmcocmVzdWx0LCBmdW5jLCBiaXRtYXNrKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiBsaWtlIGBfLnJvdW5kYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgVGhlIG5hbWUgb2YgdGhlIGBNYXRoYCBtZXRob2QgdG8gdXNlIHdoZW4gcm91bmRpbmcuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcm91bmQgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlUm91bmQobWV0aG9kTmFtZSkgewogICAgICAgICAgdmFyIGZ1bmMgPSBNYXRoW21ldGhvZE5hbWVdOwogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG51bWJlciwgcHJlY2lzaW9uKSB7CiAgICAgICAgICAgIG51bWJlciA9IHRvTnVtYmVyKG51bWJlcik7CiAgICAgICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PSBudWxsID8gMCA6IG5hdGl2ZU1pbih0b0ludGVnZXIocHJlY2lzaW9uKSwgMjkyKTsKICAgICAgICAgICAgaWYgKHByZWNpc2lvbiAmJiBuYXRpdmVJc0Zpbml0ZShudW1iZXIpKSB7CiAgICAgICAgICAgICAgLy8gU2hpZnQgd2l0aCBleHBvbmVudGlhbCBub3RhdGlvbiB0byBhdm9pZCBmbG9hdGluZy1wb2ludCBpc3N1ZXMuCiAgICAgICAgICAgICAgLy8gU2VlIFtNRE5dKGh0dHBzOi8vbWRuLmlvL3JvdW5kI0V4YW1wbGVzKSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAgICAgIHZhciBwYWlyID0gKHRvU3RyaW5nKG51bWJlcikgKyAnZScpLnNwbGl0KCdlJyksCiAgICAgICAgICAgICAgICAgIHZhbHVlID0gZnVuYyhwYWlyWzBdICsgJ2UnICsgKCtwYWlyWzFdICsgcHJlY2lzaW9uKSk7CgogICAgICAgICAgICAgIHBhaXIgPSAodG9TdHJpbmcodmFsdWUpICsgJ2UnKS5zcGxpdCgnZScpOwogICAgICAgICAgICAgIHJldHVybiArKHBhaXJbMF0gKyAnZScgKyAoK3BhaXJbMV0gLSBwcmVjaXNpb24pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZnVuYyhudW1iZXIpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBzZXQgb2JqZWN0IG9mIGB2YWx1ZXNgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB2YWx1ZXMgVGhlIHZhbHVlcyB0byBhZGQgdG8gdGhlIHNldC4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LgogICAgICAgICAqLwogICAgICAgIHZhciBjcmVhdGVTZXQgPSAhKFNldCAmJiAoMSAvIHNldFRvQXJyYXkobmV3IFNldChbLC0wXSkpWzFdKSA9PSBJTkZJTklUWSkgPyBub29wIDogZnVuY3Rpb24odmFsdWVzKSB7CiAgICAgICAgICByZXR1cm4gbmV3IFNldCh2YWx1ZXMpOwogICAgICAgIH07CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBgXy50b1BhaXJzYCBvciBgXy50b1BhaXJzSW5gIGZ1bmN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGEgZ2l2ZW4gb2JqZWN0LgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhaXJzIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNyZWF0ZVRvUGFpcnMoa2V5c0Z1bmMpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhvYmplY3QpOwogICAgICAgICAgICBpZiAodGFnID09IG1hcFRhZykgewogICAgICAgICAgICAgIHJldHVybiBtYXBUb0FycmF5KG9iamVjdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRhZyA9PSBzZXRUYWcpIHsKICAgICAgICAgICAgICByZXR1cm4gc2V0VG9QYWlycyhvYmplY3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiYXNlVG9QYWlycyhvYmplY3QsIGtleXNGdW5jKG9iamVjdCkpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGVpdGhlciBjdXJyaWVzIG9yIGludm9rZXMgYGZ1bmNgIHdpdGggb3B0aW9uYWwKICAgICAgICAgKiBgdGhpc2AgYmluZGluZyBhbmQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufHN0cmluZ30gZnVuYyBUaGUgZnVuY3Rpb24gb3IgbWV0aG9kIG5hbWUgdG8gd3JhcC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4KICAgICAgICAgKiAgICAxIC0gYF8uYmluZGAKICAgICAgICAgKiAgICAyIC0gYF8uYmluZEtleWAKICAgICAgICAgKiAgICA0IC0gYF8uY3VycnlgIG9yIGBfLmN1cnJ5UmlnaHRgIG9mIGEgYm91bmQgZnVuY3Rpb24KICAgICAgICAgKiAgICA4IC0gYF8uY3VycnlgCiAgICAgICAgICogICAxNiAtIGBfLmN1cnJ5UmlnaHRgCiAgICAgICAgICogICAzMiAtIGBfLnBhcnRpYWxgCiAgICAgICAgICogICA2NCAtIGBfLnBhcnRpYWxSaWdodGAKICAgICAgICAgKiAgMTI4IC0gYF8ucmVhcmdgCiAgICAgICAgICogIDI1NiAtIGBfLmFyeWAKICAgICAgICAgKiAgNTEyIC0gYF8uZmxpcGAKICAgICAgICAgKiBAcGFyYW0geyp9IFt0aGlzQXJnXSBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbaG9sZGVyc10gVGhlIGBwYXJ0aWFsc2AgcGxhY2Vob2xkZXIgaW5kZXhlcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJnUG9zXSBUaGUgYXJndW1lbnQgcG9zaXRpb25zIG9mIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFthcnldIFRoZSBhcml0eSBjYXAgb2YgYGZ1bmNgLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXJpdHldIFRoZSBhcml0eSBvZiBgZnVuY2AuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgd3JhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzLCBhcmdQb3MsIGFyeSwgYXJpdHkpIHsKICAgICAgICAgIHZhciBpc0JpbmRLZXkgPSBiaXRtYXNrICYgV1JBUF9CSU5EX0tFWV9GTEFHOwogICAgICAgICAgaWYgKCFpc0JpbmRLZXkgJiYgdHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbGVuZ3RoID0gcGFydGlhbHMgPyBwYXJ0aWFscy5sZW5ndGggOiAwOwogICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgYml0bWFzayAmPSB+KFdSQVBfUEFSVElBTF9GTEFHIHwgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcpOwogICAgICAgICAgICBwYXJ0aWFscyA9IGhvbGRlcnMgPSB1bmRlZmluZWQkMTsKICAgICAgICAgIH0KICAgICAgICAgIGFyeSA9IGFyeSA9PT0gdW5kZWZpbmVkJDEgPyBhcnkgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKGFyeSksIDApOwogICAgICAgICAgYXJpdHkgPSBhcml0eSA9PT0gdW5kZWZpbmVkJDEgPyBhcml0eSA6IHRvSW50ZWdlcihhcml0eSk7CiAgICAgICAgICBsZW5ndGggLT0gaG9sZGVycyA/IGhvbGRlcnMubGVuZ3RoIDogMDsKCiAgICAgICAgICBpZiAoYml0bWFzayAmIFdSQVBfUEFSVElBTF9SSUdIVF9GTEFHKSB7CiAgICAgICAgICAgIHZhciBwYXJ0aWFsc1JpZ2h0ID0gcGFydGlhbHMsCiAgICAgICAgICAgICAgICBob2xkZXJzUmlnaHQgPSBob2xkZXJzOwoKICAgICAgICAgICAgcGFydGlhbHMgPSBob2xkZXJzID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgZGF0YSA9IGlzQmluZEtleSA/IHVuZGVmaW5lZCQxIDogZ2V0RGF0YShmdW5jKTsKCiAgICAgICAgICB2YXIgbmV3RGF0YSA9IFsKICAgICAgICAgICAgZnVuYywgYml0bWFzaywgdGhpc0FyZywgcGFydGlhbHMsIGhvbGRlcnMsIHBhcnRpYWxzUmlnaHQsIGhvbGRlcnNSaWdodCwKICAgICAgICAgICAgYXJnUG9zLCBhcnksIGFyaXR5CiAgICAgICAgICBdOwoKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIG1lcmdlRGF0YShuZXdEYXRhLCBkYXRhKTsKICAgICAgICAgIH0KICAgICAgICAgIGZ1bmMgPSBuZXdEYXRhWzBdOwogICAgICAgICAgYml0bWFzayA9IG5ld0RhdGFbMV07CiAgICAgICAgICB0aGlzQXJnID0gbmV3RGF0YVsyXTsKICAgICAgICAgIHBhcnRpYWxzID0gbmV3RGF0YVszXTsKICAgICAgICAgIGhvbGRlcnMgPSBuZXdEYXRhWzRdOwogICAgICAgICAgYXJpdHkgPSBuZXdEYXRhWzldID0gbmV3RGF0YVs5XSA9PT0gdW5kZWZpbmVkJDEKICAgICAgICAgICAgPyAoaXNCaW5kS2V5ID8gMCA6IGZ1bmMubGVuZ3RoKQogICAgICAgICAgICA6IG5hdGl2ZU1heChuZXdEYXRhWzldIC0gbGVuZ3RoLCAwKTsKCiAgICAgICAgICBpZiAoIWFyaXR5ICYmIGJpdG1hc2sgJiAoV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKSkgewogICAgICAgICAgICBiaXRtYXNrICY9IH4oV1JBUF9DVVJSWV9GTEFHIHwgV1JBUF9DVVJSWV9SSUdIVF9GTEFHKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghYml0bWFzayB8fCBiaXRtYXNrID09IFdSQVBfQklORF9GTEFHKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjcmVhdGVCaW5kKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcpOwogICAgICAgICAgfSBlbHNlIGlmIChiaXRtYXNrID09IFdSQVBfQ1VSUllfRkxBRyB8fCBiaXRtYXNrID09IFdSQVBfQ1VSUllfUklHSFRfRkxBRykgewogICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVDdXJyeShmdW5jLCBiaXRtYXNrLCBhcml0eSk7CiAgICAgICAgICB9IGVsc2UgaWYgKChiaXRtYXNrID09IFdSQVBfUEFSVElBTF9GTEFHIHx8IGJpdG1hc2sgPT0gKFdSQVBfQklORF9GTEFHIHwgV1JBUF9QQVJUSUFMX0ZMQUcpKSAmJiAhaG9sZGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlUGFydGlhbChmdW5jLCBiaXRtYXNrLCB0aGlzQXJnLCBwYXJ0aWFscyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHQgPSBjcmVhdGVIeWJyaWQuYXBwbHkodW5kZWZpbmVkJDEsIG5ld0RhdGEpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHNldHRlciA9IGRhdGEgPyBiYXNlU2V0RGF0YSA6IHNldERhdGE7CiAgICAgICAgICByZXR1cm4gc2V0V3JhcFRvU3RyaW5nKHNldHRlcihyZXN1bHQsIG5ld0RhdGEpLCBmdW5jLCBiaXRtYXNrKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uYXNzaWduSW5gIHVzZSB0byBhc3NpZ24gcHJvcGVydGllcwogICAgICAgICAqIG9mIHNvdXJjZSBvYmplY3RzIHRvIHRoZSBkZXN0aW5hdGlvbiBvYmplY3QgZm9yIGFsbCBkZXN0aW5hdGlvbiBwcm9wZXJ0aWVzCiAgICAgICAgICogdGhhdCByZXNvbHZlIHRvIGB1bmRlZmluZWRgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IG9ialZhbHVlIFRoZSBkZXN0aW5hdGlvbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0geyp9IHNyY1ZhbHVlIFRoZSBzb3VyY2UgdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgcGFyZW50IG9iamVjdCBvZiBgb2JqVmFsdWVgLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNBc3NpZ25JbihvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0KSB7CiAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCQxIHx8CiAgICAgICAgICAgICAgKGVxKG9ialZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7CiAgICAgICAgICAgIHJldHVybiBzcmNWYWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvYmpWYWx1ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFVzZWQgYnkgYF8uZGVmYXVsdHNEZWVwYCB0byBjdXN0b21pemUgaXRzIGBfLm1lcmdlYCB1c2UgdG8gbWVyZ2Ugc291cmNlCiAgICAgICAgICogb2JqZWN0cyBpbnRvIGRlc3RpbmF0aW9uIG9iamVjdHMgdGhhdCBhcmUgcGFzc2VkIHRocnUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gb2JqVmFsdWUgVGhlIGRlc3RpbmF0aW9uIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHNvdXJjZSB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIG1lcmdlLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHBhcmVudCBvYmplY3Qgb2YgYG9ialZhbHVlYC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGBzcmNWYWx1ZWAuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBzb3VyY2UgdmFsdWVzIGFuZCB0aGVpciBtZXJnZWQKICAgICAgICAgKiAgY291bnRlcnBhcnRzLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB2YWx1ZSB0byBhc3NpZ24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3VzdG9tRGVmYXVsdHNNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIGtleSwgb2JqZWN0LCBzb3VyY2UsIHN0YWNrKSB7CiAgICAgICAgICBpZiAoaXNPYmplY3Qob2JqVmFsdWUpICYmIGlzT2JqZWN0KHNyY1ZhbHVlKSkgewogICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSBvYmplY3RzIGFuZCBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS4KICAgICAgICAgICAgc3RhY2suc2V0KHNyY1ZhbHVlLCBvYmpWYWx1ZSk7CiAgICAgICAgICAgIGJhc2VNZXJnZShvYmpWYWx1ZSwgc3JjVmFsdWUsIHVuZGVmaW5lZCQxLCBjdXN0b21EZWZhdWx0c01lcmdlLCBzdGFjayk7CiAgICAgICAgICAgIHN0YWNrWydkZWxldGUnXShzcmNWYWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb2JqVmFsdWU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGJ5IGBfLm9taXRgIHRvIGN1c3RvbWl6ZSBpdHMgYF8uY2xvbmVEZWVwYCB1c2UgdG8gb25seSBjbG9uZSBwbGFpbgogICAgICAgICAqIG9iamVjdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBpbnNwZWN0LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSB1bmNsb25lZCB2YWx1ZSBvciBgdW5kZWZpbmVkYCB0byBkZWZlciBjbG9uaW5nIHRvIGBfLmNsb25lRGVlcGAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3VzdG9tT21pdENsb25lKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gaXNQbGFpbk9iamVjdCh2YWx1ZSkgPyB1bmRlZmluZWQkMSA6IHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBhcnJheXMgd2l0aCBzdXBwb3J0IGZvcgogICAgICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgYXJyYXlgIGFuZCBgb3RoZXJgIG9iamVjdHMuCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBhcnJheXMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBlcXVhbEFycmF5cyhhcnJheSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spIHsKICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUcsCiAgICAgICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgICAgIG90aExlbmd0aCA9IG90aGVyLmxlbmd0aDsKCiAgICAgICAgICBpZiAoYXJyTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhKGlzUGFydGlhbCAmJiBvdGhMZW5ndGggPiBhcnJMZW5ndGgpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIENoZWNrIHRoYXQgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuCiAgICAgICAgICB2YXIgYXJyU3RhY2tlZCA9IHN0YWNrLmdldChhcnJheSk7CiAgICAgICAgICB2YXIgb3RoU3RhY2tlZCA9IHN0YWNrLmdldChvdGhlcik7CiAgICAgICAgICBpZiAoYXJyU3RhY2tlZCAmJiBvdGhTdGFja2VkKSB7CiAgICAgICAgICAgIHJldHVybiBhcnJTdGFja2VkID09IG90aGVyICYmIG90aFN0YWNrZWQgPT0gYXJyYXk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICByZXN1bHQgPSB0cnVlLAogICAgICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IFNldENhY2hlIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgc3RhY2suc2V0KGFycmF5LCBvdGhlcik7CiAgICAgICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTsKCiAgICAgICAgICAvLyBJZ25vcmUgbm9uLWluZGV4IHByb3BlcnRpZXMuCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGFyckxlbmd0aCkgewogICAgICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sCiAgICAgICAgICAgICAgICBvdGhWYWx1ZSA9IG90aGVyW2luZGV4XTsKCiAgICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7CiAgICAgICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsCiAgICAgICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIGFyclZhbHVlLCBpbmRleCwgb3RoZXIsIGFycmF5LCBzdGFjaykKICAgICAgICAgICAgICAgIDogY3VzdG9taXplcihhcnJWYWx1ZSwgb3RoVmFsdWUsIGluZGV4LCBhcnJheSwgb3RoZXIsIHN0YWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29tcGFyZWQgIT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgICAgaWYgKGNvbXBhcmVkKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS4KICAgICAgICAgICAgaWYgKHNlZW4pIHsKICAgICAgICAgICAgICBpZiAoIWFycmF5U29tZShvdGhlciwgZnVuY3Rpb24ob3RoVmFsdWUsIG90aEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWNoZUhhcyhzZWVuLCBvdGhJbmRleCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7CiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2Vlbi5wdXNoKG90aEluZGV4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIGlmICghKAogICAgICAgICAgICAgICAgICBhcnJWYWx1ZSA9PT0gb3RoVmFsdWUgfHwKICAgICAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykKICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTsKICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZgogICAgICAgICAqIHRoZSBzYW1lIGB0b1N0cmluZ1RhZ2AuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mCiAgICAgICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgb3IgYFN0cmluZ2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHN0YWNrIFRyYWNrcyB0cmF2ZXJzZWQgYG9iamVjdGAgYW5kIGBvdGhlcmAgb2JqZWN0cy4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIG9iamVjdHMgYXJlIGVxdWl2YWxlbnQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBlcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIHRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykgewogICAgICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICAgICAgY2FzZSBkYXRhVmlld1RhZzoKICAgICAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8CiAgICAgICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyOwogICAgICAgICAgICAgIG90aGVyID0gb3RoZXIuYnVmZmVyOwoKICAgICAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzoKICAgICAgICAgICAgICBpZiAoKG9iamVjdC5ieXRlTGVuZ3RoICE9IG90aGVyLmJ5dGVMZW5ndGgpIHx8CiAgICAgICAgICAgICAgICAgICFlcXVhbEZ1bmMobmV3IFVpbnQ4QXJyYXkob2JqZWN0KSwgbmV3IFVpbnQ4QXJyYXkob3RoZXIpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgICAgICAgIGNhc2UgYm9vbFRhZzoKICAgICAgICAgICAgY2FzZSBkYXRlVGFnOgogICAgICAgICAgICBjYXNlIG51bWJlclRhZzoKICAgICAgICAgICAgICAvLyBDb2VyY2UgYm9vbGVhbnMgdG8gYDFgIG9yIGAwYCBhbmQgZGF0ZXMgdG8gbWlsbGlzZWNvbmRzLgogICAgICAgICAgICAgIC8vIEludmFsaWQgZGF0ZXMgYXJlIGNvZXJjZWQgdG8gYE5hTmAuCiAgICAgICAgICAgICAgcmV0dXJuIGVxKCtvYmplY3QsICtvdGhlcik7CgogICAgICAgICAgICBjYXNlIGVycm9yVGFnOgogICAgICAgICAgICAgIHJldHVybiBvYmplY3QubmFtZSA9PSBvdGhlci5uYW1lICYmIG9iamVjdC5tZXNzYWdlID09IG90aGVyLm1lc3NhZ2U7CgogICAgICAgICAgICBjYXNlIHJlZ2V4cFRhZzoKICAgICAgICAgICAgY2FzZSBzdHJpbmdUYWc6CiAgICAgICAgICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cywKICAgICAgICAgICAgICAvLyBhcyBlcXVhbC4gU2VlIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1yZWdleHAucHJvdG90eXBlLnRvc3RyaW5nCiAgICAgICAgICAgICAgLy8gZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTsKCiAgICAgICAgICAgIGNhc2UgbWFwVGFnOgogICAgICAgICAgICAgIHZhciBjb252ZXJ0ID0gbWFwVG9BcnJheTsKCiAgICAgICAgICAgIGNhc2Ugc2V0VGFnOgogICAgICAgICAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUc7CiAgICAgICAgICAgICAgY29udmVydCB8fCAoY29udmVydCA9IHNldFRvQXJyYXkpOwoKICAgICAgICAgICAgICBpZiAob2JqZWN0LnNpemUgIT0gb3RoZXIuc2l6ZSAmJiAhaXNQYXJ0aWFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC4KICAgICAgICAgICAgICB2YXIgc3RhY2tlZCA9IHN0YWNrLmdldChvYmplY3QpOwogICAgICAgICAgICAgIGlmIChzdGFja2VkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RhY2tlZCA9PSBvdGhlcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHOwoKICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS4KICAgICAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGVxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spOwogICAgICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpOwogICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CgogICAgICAgICAgICBjYXNlIHN5bWJvbFRhZzoKICAgICAgICAgICAgICBpZiAoc3ltYm9sVmFsdWVPZikgewogICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFZhbHVlT2YuY2FsbChvYmplY3QpID09IHN5bWJvbFZhbHVlT2YuY2FsbChvdGhlcik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3IKICAgICAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvdGhlciBUaGUgb3RoZXIgb2JqZWN0IHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgb2JqZWN0cyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7CiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLAogICAgICAgICAgICAgIG9ialByb3BzID0gZ2V0QWxsS2V5cyhvYmplY3QpLAogICAgICAgICAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCwKICAgICAgICAgICAgICBvdGhQcm9wcyA9IGdldEFsbEtleXMob3RoZXIpLAogICAgICAgICAgICAgIG90aExlbmd0aCA9IG90aFByb3BzLmxlbmd0aDsKCiAgICAgICAgICBpZiAob2JqTGVuZ3RoICE9IG90aExlbmd0aCAmJiAhaXNQYXJ0aWFsKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBpbmRleCA9IG9iakxlbmd0aDsKICAgICAgICAgIHdoaWxlIChpbmRleC0tKSB7CiAgICAgICAgICAgIHZhciBrZXkgPSBvYmpQcm9wc1tpbmRleF07CiAgICAgICAgICAgIGlmICghKGlzUGFydGlhbCA/IGtleSBpbiBvdGhlciA6IGhhc093blByb3BlcnR5LmNhbGwob3RoZXIsIGtleSkpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDaGVjayB0aGF0IGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLgogICAgICAgICAgdmFyIG9ialN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTsKICAgICAgICAgIHZhciBvdGhTdGFja2VkID0gc3RhY2suZ2V0KG90aGVyKTsKICAgICAgICAgIGlmIChvYmpTdGFja2VkICYmIG90aFN0YWNrZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG9ialN0YWNrZWQgPT0gb3RoZXIgJiYgb3RoU3RhY2tlZCA9PSBvYmplY3Q7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICAgIHN0YWNrLnNldChvYmplY3QsIG90aGVyKTsKICAgICAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTsKCiAgICAgICAgICB2YXIgc2tpcEN0b3IgPSBpc1BhcnRpYWw7CiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IG9iakxlbmd0aCkgewogICAgICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07CiAgICAgICAgICAgIHZhciBvYmpWYWx1ZSA9IG9iamVjdFtrZXldLAogICAgICAgICAgICAgICAgb3RoVmFsdWUgPSBvdGhlcltrZXldOwoKICAgICAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHsKICAgICAgICAgICAgICB2YXIgY29tcGFyZWQgPSBpc1BhcnRpYWwKICAgICAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgb2JqVmFsdWUsIGtleSwgb3RoZXIsIG9iamVjdCwgc3RhY2spCiAgICAgICAgICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIG9iamVjdHMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS4KICAgICAgICAgICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZCQxCiAgICAgICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpCiAgICAgICAgICAgICAgICAgIDogY29tcGFyZWQKICAgICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocmVzdWx0ICYmICFza2lwQ3RvcikgewogICAgICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgIG90aEN0b3IgPSBvdGhlci5jb25zdHJ1Y3RvcjsKCiAgICAgICAgICAgIC8vIE5vbiBgT2JqZWN0YCBvYmplY3QgaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGNvbnN0cnVjdG9ycyBhcmUgbm90IGVxdWFsLgogICAgICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmCiAgICAgICAgICAgICAgICAoJ2NvbnN0cnVjdG9yJyBpbiBvYmplY3QgJiYgJ2NvbnN0cnVjdG9yJyBpbiBvdGhlcikgJiYKICAgICAgICAgICAgICAgICEodHlwZW9mIG9iakN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBvYmpDdG9yIGluc3RhbmNlb2Ygb2JqQ3RvciAmJgogICAgICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkgewogICAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzdGFja1snZGVsZXRlJ10ob2JqZWN0KTsKICAgICAgICAgIHN0YWNrWydkZWxldGUnXShvdGhlcik7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggZmxhdHRlbnMgdGhlIHJlc3QgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZmxhdFJlc3QoZnVuYykgewogICAgICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKG92ZXJSZXN0KGZ1bmMsIHVuZGVmaW5lZCQxLCBmbGF0dGVuKSwgZnVuYyArICcnKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMgb2YgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldEFsbEtleXMob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzLCBnZXRTeW1ib2xzKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQKICAgICAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW4sIGdldFN5bWJvbHNJbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHF1ZXJ5LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtZXRhZGF0YSBmb3IgYGZ1bmNgLgogICAgICAgICAqLwogICAgICAgIHZhciBnZXREYXRhID0gIW1ldGFNYXAgPyBub29wIDogZnVuY3Rpb24oZnVuYykgewogICAgICAgICAgcmV0dXJuIG1ldGFNYXAuZ2V0KGZ1bmMpOwogICAgICAgIH07CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG5hbWUgb2YgYGZ1bmNgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldEZ1bmNOYW1lKGZ1bmMpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSAoZnVuYy5uYW1lICsgJycpLAogICAgICAgICAgICAgIGFycmF5ID0gcmVhbE5hbWVzW3Jlc3VsdF0sCiAgICAgICAgICAgICAgbGVuZ3RoID0gaGFzT3duUHJvcGVydHkuY2FsbChyZWFsTmFtZXMsIHJlc3VsdCkgPyBhcnJheS5sZW5ndGggOiAwOwoKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICB2YXIgZGF0YSA9IGFycmF5W2xlbmd0aF0sCiAgICAgICAgICAgICAgICBvdGhlckZ1bmMgPSBkYXRhLmZ1bmM7CiAgICAgICAgICAgIGlmIChvdGhlckZ1bmMgPT0gbnVsbCB8fCBvdGhlckZ1bmMgPT0gZnVuYykgewogICAgICAgICAgICAgIHJldHVybiBkYXRhLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBhcmd1bWVudCBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgYGZ1bmNgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBpbnNwZWN0LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwbGFjZWhvbGRlciB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRIb2xkZXIoZnVuYykgewogICAgICAgICAgdmFyIG9iamVjdCA9IGhhc093blByb3BlcnR5LmNhbGwobG9kYXNoLCAncGxhY2Vob2xkZXInKSA/IGxvZGFzaCA6IGZ1bmM7CiAgICAgICAgICByZXR1cm4gb2JqZWN0LnBsYWNlaG9sZGVyOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgYXBwcm9wcmlhdGUgIml0ZXJhdGVlIiBmdW5jdGlvbi4gSWYgYF8uaXRlcmF0ZWVgIGlzIGN1c3RvbWl6ZWQsCiAgICAgICAgICogdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBjdXN0b20gbWV0aG9kLCBvdGhlcndpc2UgaXQgcmV0dXJucyBgYmFzZUl0ZXJhdGVlYC4KICAgICAgICAgKiBJZiBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgY2hvc2VuIGZ1bmN0aW9uIGlzIGludm9rZWQgd2l0aCB0aGVtIGFuZAogICAgICAgICAqIGl0cyByZXN1bHQgaXMgcmV0dXJuZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gW3ZhbHVlXSBUaGUgdmFsdWUgdG8gY29udmVydCB0byBhbiBpdGVyYXRlZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5XSBUaGUgYXJpdHkgb2YgdGhlIGNyZWF0ZWQgaXRlcmF0ZWUuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBjaG9zZW4gZnVuY3Rpb24gb3IgaXRzIHJlc3VsdC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRJdGVyYXRlZSgpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2guaXRlcmF0ZWUgfHwgaXRlcmF0ZWU7CiAgICAgICAgICByZXN1bHQgPSByZXN1bHQgPT09IGl0ZXJhdGVlID8gYmFzZUl0ZXJhdGVlIDogcmVzdWx0OwogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyByZXN1bHQoYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0pIDogcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSByZWZlcmVuY2Uga2V5LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXAgZGF0YS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXRNYXBEYXRhKG1hcCwga2V5KSB7CiAgICAgICAgICB2YXIgZGF0YSA9IG1hcC5fX2RhdGFfXzsKICAgICAgICAgIHJldHVybiBpc0tleWFibGUoa2V5KQogICAgICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXQogICAgICAgICAgICA6IGRhdGEubWFwOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3Mgb2YgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG1hdGNoIGRhdGEgb2YgYG9iamVjdGAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0TWF0Y2hEYXRhKG9iamVjdCkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IGtleXMob2JqZWN0KSwKICAgICAgICAgICAgICBsZW5ndGggPSByZXN1bHQubGVuZ3RoOwoKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sCiAgICAgICAgICAgICAgICB2YWx1ZSA9IG9iamVjdFtrZXldOwoKICAgICAgICAgICAgcmVzdWx0W2xlbmd0aF0gPSBba2V5LCB2YWx1ZSwgaXNTdHJpY3RDb21wYXJhYmxlKHZhbHVlKV07CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBtZXRob2QgdG8gZ2V0LgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBpZiBpdCdzIG5hdGl2ZSwgZWxzZSBgdW5kZWZpbmVkYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBnZXROYXRpdmUob2JqZWN0LCBrZXkpIHsKICAgICAgICAgIHZhciB2YWx1ZSA9IGdldFZhbHVlKG9iamVjdCwga2V5KTsKICAgICAgICAgIHJldHVybiBiYXNlSXNOYXRpdmUodmFsdWUpID8gdmFsdWUgOiB1bmRlZmluZWQkMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUdldFRhZ2Agd2hpY2ggaWdub3JlcyBgU3ltYm9sLnRvU3RyaW5nVGFnYCB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJhdyBgdG9TdHJpbmdUYWdgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldFJhd1RhZyh2YWx1ZSkgewogICAgICAgICAgdmFyIGlzT3duID0gaGFzT3duUHJvcGVydHkuY2FsbCh2YWx1ZSwgc3ltVG9TdHJpbmdUYWcpLAogICAgICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTsKCiAgICAgICAgICB0cnkgewogICAgICAgICAgICB2YWx1ZVtzeW1Ub1N0cmluZ1RhZ10gPSB1bmRlZmluZWQkMTsKICAgICAgICAgICAgdmFyIHVubWFza2VkID0gdHJ1ZTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgICAgICAgdmFyIHJlc3VsdCA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpOwogICAgICAgICAgaWYgKHVubWFza2VkKSB7CiAgICAgICAgICAgIGlmIChpc093bikgewogICAgICAgICAgICAgIHZhbHVlW3N5bVRvU3RyaW5nVGFnXSA9IHRhZzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2Ygc3ltYm9scy4KICAgICAgICAgKi8KICAgICAgICB2YXIgZ2V0U3ltYm9scyA9ICFuYXRpdmVHZXRTeW1ib2xzID8gc3R1YkFycmF5IDogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7CiAgICAgICAgICByZXR1cm4gYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHsKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwob2JqZWN0LCBzeW1ib2wpOwogICAgICAgICAgfSk7CiAgICAgICAgfTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLgogICAgICAgICAqLwogICAgICAgIHZhciBnZXRTeW1ib2xzSW4gPSAhbmF0aXZlR2V0U3ltYm9scyA/IHN0dWJBcnJheSA6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgICAgICBhcnJheVB1c2gocmVzdWx0LCBnZXRTeW1ib2xzKG9iamVjdCkpOwogICAgICAgICAgICBvYmplY3QgPSBnZXRQcm90b3R5cGUob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgYHRvU3RyaW5nVGFnYCBvZiBgdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLgogICAgICAgICAqLwogICAgICAgIHZhciBnZXRUYWcgPSBiYXNlR2V0VGFnOwoKICAgICAgICAvLyBGYWxsYmFjayBmb3IgZGF0YSB2aWV3cywgbWFwcywgc2V0cywgYW5kIHdlYWsgbWFwcyBpbiBJRSAxMSBhbmQgcHJvbWlzZXMgaW4gTm9kZS5qcyA8IDYuCiAgICAgICAgaWYgKChEYXRhVmlldyAmJiBnZXRUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcigxKSkpICE9IGRhdGFWaWV3VGFnKSB8fAogICAgICAgICAgICAoTWFwICYmIGdldFRhZyhuZXcgTWFwKSAhPSBtYXBUYWcpIHx8CiAgICAgICAgICAgIChQcm9taXNlICYmIGdldFRhZyhQcm9taXNlLnJlc29sdmUoKSkgIT0gcHJvbWlzZVRhZykgfHwKICAgICAgICAgICAgKFNldCAmJiBnZXRUYWcobmV3IFNldCkgIT0gc2V0VGFnKSB8fAogICAgICAgICAgICAoV2Vha01hcCAmJiBnZXRUYWcobmV3IFdlYWtNYXApICE9IHdlYWtNYXBUYWcpKSB7CiAgICAgICAgICBnZXRUYWcgPSBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICB2YXIgcmVzdWx0ID0gYmFzZUdldFRhZyh2YWx1ZSksCiAgICAgICAgICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyA/IHZhbHVlLmNvbnN0cnVjdG9yIDogdW5kZWZpbmVkJDEsCiAgICAgICAgICAgICAgICBjdG9yU3RyaW5nID0gQ3RvciA/IHRvU291cmNlKEN0b3IpIDogJyc7CgogICAgICAgICAgICBpZiAoY3RvclN0cmluZykgewogICAgICAgICAgICAgIHN3aXRjaCAoY3RvclN0cmluZykgewogICAgICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZzsKICAgICAgICAgICAgICAgIGNhc2UgbWFwQ3RvclN0cmluZzogcmV0dXJuIG1hcFRhZzsKICAgICAgICAgICAgICAgIGNhc2UgcHJvbWlzZUN0b3JTdHJpbmc6IHJldHVybiBwcm9taXNlVGFnOwogICAgICAgICAgICAgICAgY2FzZSBzZXRDdG9yU3RyaW5nOiByZXR1cm4gc2V0VGFnOwogICAgICAgICAgICAgICAgY2FzZSB3ZWFrTWFwQ3RvclN0cmluZzogcmV0dXJuIHdlYWtNYXBUYWc7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgdmlldywgYXBwbHlpbmcgYW55IGB0cmFuc2Zvcm1zYCB0byB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAgcG9zaXRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSB2aWV3LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgdmlldy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSB0cmFuc2Zvcm1zIFRoZSB0cmFuc2Zvcm1hdGlvbnMgdG8gYXBwbHkgdG8gdGhlIHZpZXcuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBhbiBvYmplY3QgY29udGFpbmluZyB0aGUgYHN0YXJ0YCBhbmQgYGVuZGAKICAgICAgICAgKiAgcG9zaXRpb25zIG9mIHRoZSB2aWV3LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldFZpZXcoc3RhcnQsIGVuZCwgdHJhbnNmb3JtcykgewogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgbGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7CgogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0cmFuc2Zvcm1zW2luZGV4XSwKICAgICAgICAgICAgICAgIHNpemUgPSBkYXRhLnNpemU7CgogICAgICAgICAgICBzd2l0Y2ggKGRhdGEudHlwZSkgewogICAgICAgICAgICAgIGNhc2UgJ2Ryb3AnOiAgICAgIHN0YXJ0ICs9IHNpemU7IGJyZWFrOwogICAgICAgICAgICAgIGNhc2UgJ2Ryb3BSaWdodCc6IGVuZCAtPSBzaXplOyBicmVhazsKICAgICAgICAgICAgICBjYXNlICd0YWtlJzogICAgICBlbmQgPSBuYXRpdmVNaW4oZW5kLCBzdGFydCArIHNpemUpOyBicmVhazsKICAgICAgICAgICAgICBjYXNlICd0YWtlUmlnaHQnOiBzdGFydCA9IG5hdGl2ZU1heChzdGFydCwgZW5kIC0gc2l6ZSk7IGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4geyAnc3RhcnQnOiBzdGFydCwgJ2VuZCc6IGVuZCB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRXh0cmFjdHMgd3JhcHBlciBkZXRhaWxzIGZyb20gdGhlIGBzb3VyY2VgIGJvZHkgY29tbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNvdXJjZSBUaGUgc291cmNlIHRvIGluc3BlY3QuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3cmFwcGVyIGRldGFpbHMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0V3JhcERldGFpbHMoc291cmNlKSB7CiAgICAgICAgICB2YXIgbWF0Y2ggPSBzb3VyY2UubWF0Y2gocmVXcmFwRGV0YWlscyk7CiAgICAgICAgICByZXR1cm4gbWF0Y2ggPyBtYXRjaFsxXS5zcGxpdChyZVNwbGl0RGV0YWlscykgOiBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgcGF0aGAgZXhpc3RzIG9uIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7CiAgICAgICAgICBwYXRoID0gY2FzdFBhdGgocGF0aCwgb2JqZWN0KTsKCiAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCwKICAgICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIga2V5ID0gdG9LZXkocGF0aFtpbmRleF0pOwogICAgICAgICAgICBpZiAoIShyZXN1bHQgPSBvYmplY3QgIT0gbnVsbCAmJiBoYXNGdW5jKG9iamVjdCwga2V5KSkpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBvYmplY3QgPSBvYmplY3Rba2V5XTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyZXN1bHQgfHwgKytpbmRleCAhPSBsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIGxlbmd0aCA9IG9iamVjdCA9PSBudWxsID8gMCA6IG9iamVjdC5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gISFsZW5ndGggJiYgaXNMZW5ndGgobGVuZ3RoKSAmJiBpc0luZGV4KGtleSwgbGVuZ3RoKSAmJgogICAgICAgICAgICAoaXNBcnJheShvYmplY3QpIHx8IGlzQXJndW1lbnRzKG9iamVjdCkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gYXJyYXkgY2xvbmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjbG9uZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGluaXRDbG9uZUFycmF5KGFycmF5KSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBhcnJheS5jb25zdHJ1Y3RvcihsZW5ndGgpOwoKICAgICAgICAgIC8vIEFkZCBwcm9wZXJ0aWVzIGFzc2lnbmVkIGJ5IGBSZWdFeHAjZXhlY2AuCiAgICAgICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eS5jYWxsKGFycmF5LCAnaW5kZXgnKSkgewogICAgICAgICAgICByZXN1bHQuaW5kZXggPSBhcnJheS5pbmRleDsKICAgICAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaW5pdENsb25lT2JqZWN0KG9iamVjdCkgewogICAgICAgICAgcmV0dXJuICh0eXBlb2Ygb2JqZWN0LmNvbnN0cnVjdG9yID09ICdmdW5jdGlvbicgJiYgIWlzUHJvdG90eXBlKG9iamVjdCkpCiAgICAgICAgICAgID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkKICAgICAgICAgICAgOiB7fTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemVzIGFuIG9iamVjdCBjbG9uZSBiYXNlZCBvbiBpdHMgYHRvU3RyaW5nVGFnYC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mCiAgICAgICAgICogYEJvb2xlYW5gLCBgRGF0ZWAsIGBFcnJvcmAsIGBNYXBgLCBgTnVtYmVyYCwgYFJlZ0V4cGAsIGBTZXRgLCBvciBgU3RyaW5nYC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNsb25lLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgVGhlIGB0b1N0cmluZ1RhZ2Agb2YgdGhlIG9iamVjdCB0byBjbG9uZS4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHsKICAgICAgICAgIHZhciBDdG9yID0gb2JqZWN0LmNvbnN0cnVjdG9yOwogICAgICAgICAgc3dpdGNoICh0YWcpIHsKICAgICAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZzoKICAgICAgICAgICAgICByZXR1cm4gY2xvbmVBcnJheUJ1ZmZlcihvYmplY3QpOwoKICAgICAgICAgICAgY2FzZSBib29sVGFnOgogICAgICAgICAgICBjYXNlIGRhdGVUYWc6CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpOwoKICAgICAgICAgICAgY2FzZSBkYXRhVmlld1RhZzoKICAgICAgICAgICAgICByZXR1cm4gY2xvbmVEYXRhVmlldyhvYmplY3QsIGlzRGVlcCk7CgogICAgICAgICAgICBjYXNlIGZsb2F0MzJUYWc6IGNhc2UgZmxvYXQ2NFRhZzoKICAgICAgICAgICAgY2FzZSBpbnQ4VGFnOiBjYXNlIGludDE2VGFnOiBjYXNlIGludDMyVGFnOgogICAgICAgICAgICBjYXNlIHVpbnQ4VGFnOiBjYXNlIHVpbnQ4Q2xhbXBlZFRhZzogY2FzZSB1aW50MTZUYWc6IGNhc2UgdWludDMyVGFnOgogICAgICAgICAgICAgIHJldHVybiBjbG9uZVR5cGVkQXJyYXkob2JqZWN0LCBpc0RlZXApOwoKICAgICAgICAgICAgY2FzZSBtYXBUYWc6CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBDdG9yOwoKICAgICAgICAgICAgY2FzZSBudW1iZXJUYWc6CiAgICAgICAgICAgIGNhc2Ugc3RyaW5nVGFnOgogICAgICAgICAgICAgIHJldHVybiBuZXcgQ3RvcihvYmplY3QpOwoKICAgICAgICAgICAgY2FzZSByZWdleHBUYWc6CiAgICAgICAgICAgICAgcmV0dXJuIGNsb25lUmVnRXhwKG9iamVjdCk7CgogICAgICAgICAgICBjYXNlIHNldFRhZzoKICAgICAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7CgogICAgICAgICAgICBjYXNlIHN5bWJvbFRhZzoKICAgICAgICAgICAgICByZXR1cm4gY2xvbmVTeW1ib2wob2JqZWN0KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEluc2VydHMgd3JhcHBlciBgZGV0YWlsc2AgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGBzb3VyY2VgIGJvZHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2UgVGhlIHNvdXJjZSB0byBtb2RpZnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIGluc2VydC4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBtb2RpZmllZCBzb3VyY2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaW5zZXJ0V3JhcERldGFpbHMoc291cmNlLCBkZXRhaWxzKSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gZGV0YWlscy5sZW5ndGg7CiAgICAgICAgICBpZiAoIWxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gc291cmNlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7CiAgICAgICAgICBkZXRhaWxzW2xhc3RJbmRleF0gPSAobGVuZ3RoID4gMSA/ICcmICcgOiAnJykgKyBkZXRhaWxzW2xhc3RJbmRleF07CiAgICAgICAgICBkZXRhaWxzID0gZGV0YWlscy5qb2luKGxlbmd0aCA+IDIgPyAnLCAnIDogJyAnKTsKICAgICAgICAgIHJldHVybiBzb3VyY2UucmVwbGFjZShyZVdyYXBDb21tZW50LCAne1xuLyogW3dyYXBwZWQgd2l0aCAnICsgZGV0YWlscyArICddICovXG4nKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBmbGF0dGVuYWJsZSwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSB8fCBpc0FyZ3VtZW50cyh2YWx1ZSkgfHwKICAgICAgICAgICAgISEoc3ByZWFkYWJsZVN5bWJvbCAmJiB2YWx1ZSAmJiB2YWx1ZVtzcHJlYWRhYmxlU3ltYm9sXSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbGVuZ3RoPU1BWF9TQUZFX0lOVEVHRVJdIFRoZSB1cHBlciBib3VuZHMgb2YgYSB2YWxpZCBpbmRleC4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGluZGV4LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNJbmRleCh2YWx1ZSwgbGVuZ3RoKSB7CiAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKICAgICAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDsKCiAgICAgICAgICByZXR1cm4gISFsZW5ndGggJiYKICAgICAgICAgICAgKHR5cGUgPT0gJ251bWJlcicgfHwKICAgICAgICAgICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmCiAgICAgICAgICAgICAgICAodmFsdWUgPiAtMSAmJiB2YWx1ZSAlIDEgPT0gMCAmJiB2YWx1ZSA8IGxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuCiAgICAgICAgICogQHBhcmFtIHsqfSBpbmRleCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIGluZGV4IG9yIGtleSBhcmd1bWVudC4KICAgICAgICAgKiBAcGFyYW0geyp9IG9iamVjdCBUaGUgcG90ZW50aWFsIGl0ZXJhdGVlIG9iamVjdCBhcmd1bWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLAogICAgICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHsKICAgICAgICAgIGlmICghaXNPYmplY3Qob2JqZWN0KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbmRleDsKICAgICAgICAgIGlmICh0eXBlID09ICdudW1iZXInCiAgICAgICAgICAgICAgICA/IChpc0FycmF5TGlrZShvYmplY3QpICYmIGlzSW5kZXgoaW5kZXgsIG9iamVjdC5sZW5ndGgpKQogICAgICAgICAgICAgICAgOiAodHlwZSA9PSAnc3RyaW5nJyAmJiBpbmRleCBpbiBvYmplY3QpCiAgICAgICAgICAgICAgKSB7CiAgICAgICAgICAgIHJldHVybiBlcShvYmplY3RbaW5kZXhdLCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHByb3BlcnR5IG5hbWUgYW5kIG5vdCBhIHByb3BlcnR5IHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNLZXkodmFsdWUsIG9iamVjdCkgewogICAgICAgICAgaWYgKGlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlOwogICAgICAgICAgaWYgKHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJyB8fAogICAgICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2wodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlSXNQbGFpblByb3AudGVzdCh2YWx1ZSkgfHwgIXJlSXNEZWVwUHJvcC50ZXN0KHZhbHVlKSB8fAogICAgICAgICAgICAob2JqZWN0ICE9IG51bGwgJiYgdmFsdWUgaW4gT2JqZWN0KG9iamVjdCkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHVzZSBhcyB1bmlxdWUgb2JqZWN0IGtleS4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc0tleWFibGUodmFsdWUpIHsKICAgICAgICAgIHZhciB0eXBlID0gdHlwZW9mIHZhbHVlOwogICAgICAgICAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJykKICAgICAgICAgICAgPyAodmFsdWUgIT09ICdfX3Byb3RvX18nKQogICAgICAgICAgICA6ICh2YWx1ZSA9PT0gbnVsbCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBhIGxhenkgY291bnRlcnBhcnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgZnVuY2AgaGFzIGEgbGF6eSBjb3VudGVycGFydCwKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzTGF6aWFibGUoZnVuYykgewogICAgICAgICAgdmFyIGZ1bmNOYW1lID0gZ2V0RnVuY05hbWUoZnVuYyksCiAgICAgICAgICAgICAgb3RoZXIgPSBsb2Rhc2hbZnVuY05hbWVdOwoKICAgICAgICAgIGlmICh0eXBlb2Ygb3RoZXIgIT0gJ2Z1bmN0aW9uJyB8fCAhKGZ1bmNOYW1lIGluIExhenlXcmFwcGVyLnByb3RvdHlwZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGZ1bmMgPT09IG90aGVyKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGRhdGEgPSBnZXREYXRhKG90aGVyKTsKICAgICAgICAgIHJldHVybiAhIWRhdGEgJiYgZnVuYyA9PT0gZGF0YVswXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgZnVuY2AgaGFzIGl0cyBzb3VyY2UgbWFza2VkLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzTWFza2VkKGZ1bmMpIHsKICAgICAgICAgIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGlzIGNhcGFibGUgb2YgYmVpbmcgbWFza2VkLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2thYmxlLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICovCiAgICAgICAgdmFyIGlzTWFza2FibGUgPSBjb3JlSnNEYXRhID8gaXNGdW5jdGlvbiA6IHN0dWJGYWxzZTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGEgcHJvdG90eXBlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm90b3R5cGUsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc1Byb3RvdHlwZSh2YWx1ZSkgewogICAgICAgICAgdmFyIEN0b3IgPSB2YWx1ZSAmJiB2YWx1ZS5jb25zdHJ1Y3RvciwKICAgICAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90bzsKCiAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IHByb3RvOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgc3VpdGFibGUgZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaWYgc3VpdGFibGUgZm9yIHN0cmljdAogICAgICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzU3RyaWN0Q29tcGFyYWJsZSh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3QodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlCiAgICAgICAgICogZm9yIHN0cmljdCBlcXVhbGl0eSBjb21wYXJpc29ucywgaS5lLiBgPT09YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShrZXksIHNyY1ZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqZWN0W2tleV0gPT09IHNyY1ZhbHVlICYmCiAgICAgICAgICAgICAgKHNyY1ZhbHVlICE9PSB1bmRlZmluZWQkMSB8fCAoa2V5IGluIE9iamVjdChvYmplY3QpKSk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24ncwogICAgICAgICAqIGNhY2hlIHdoZW4gaXQgZXhjZWVkcyBgTUFYX01FTU9JWkVfU0laRWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGhhdmUgaXRzIG91dHB1dCBtZW1vaXplZC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtZW1vaXplQ2FwcGVkKGZ1bmMpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBtZW1vaXplKGZ1bmMsIGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICBpZiAoY2FjaGUuc2l6ZSA9PT0gTUFYX01FTU9JWkVfU0laRSkgewogICAgICAgICAgICAgIGNhY2hlLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGtleTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIHZhciBjYWNoZSA9IHJlc3VsdC5jYWNoZTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBNZXJnZXMgdGhlIGZ1bmN0aW9uIG1ldGFkYXRhIG9mIGBzb3VyY2VgIGludG8gYGRhdGFgLgogICAgICAgICAqCiAgICAgICAgICogTWVyZ2luZyBtZXRhZGF0YSByZWR1Y2VzIHRoZSBudW1iZXIgb2Ygd3JhcHBlcnMgdXNlZCB0byBpbnZva2UgYSBmdW5jdGlvbi4KICAgICAgICAgKiBUaGlzIGlzIHBvc3NpYmxlIGJlY2F1c2UgbWV0aG9kcyBsaWtlIGBfLmJpbmRgLCBgXy5jdXJyeWAsIGFuZCBgXy5wYXJ0aWFsYAogICAgICAgICAqIG1heSBiZSBhcHBsaWVkIHJlZ2FyZGxlc3Mgb2YgZXhlY3V0aW9uIG9yZGVyLiBNZXRob2RzIGxpa2UgYF8uYXJ5YCBhbmQKICAgICAgICAgKiBgXy5yZWFyZ2AgbW9kaWZ5IGZ1bmN0aW9uIGFyZ3VtZW50cywgbWFraW5nIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFyZQogICAgICAgICAqIGV4ZWN1dGVkIGltcG9ydGFudCwgcHJldmVudGluZyB0aGUgbWVyZ2luZyBvZiBtZXRhZGF0YS4gSG93ZXZlciwgd2UgbWFrZQogICAgICAgICAqIGFuIGV4Y2VwdGlvbiBmb3IgYSBzYWZlIGNvbWJpbmVkIGNhc2Ugd2hlcmUgY3VycmllZCBmdW5jdGlvbnMgaGF2ZSBgXy5hcnlgCiAgICAgICAgICogYW5kIG9yIGBfLnJlYXJnYCBhcHBsaWVkLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBkYXRhIFRoZSBkZXN0aW5hdGlvbiBtZXRhZGF0YS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBzb3VyY2UgVGhlIHNvdXJjZSBtZXRhZGF0YS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGRhdGFgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1lcmdlRGF0YShkYXRhLCBzb3VyY2UpIHsKICAgICAgICAgIHZhciBiaXRtYXNrID0gZGF0YVsxXSwKICAgICAgICAgICAgICBzcmNCaXRtYXNrID0gc291cmNlWzFdLAogICAgICAgICAgICAgIG5ld0JpdG1hc2sgPSBiaXRtYXNrIHwgc3JjQml0bWFzaywKICAgICAgICAgICAgICBpc0NvbW1vbiA9IG5ld0JpdG1hc2sgPCAoV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUcgfCBXUkFQX0FSWV9GTEFHKTsKCiAgICAgICAgICB2YXIgaXNDb21ibyA9CiAgICAgICAgICAgICgoc3JjQml0bWFzayA9PSBXUkFQX0FSWV9GTEFHKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKSB8fAogICAgICAgICAgICAoKHNyY0JpdG1hc2sgPT0gV1JBUF9BUllfRkxBRykgJiYgKGJpdG1hc2sgPT0gV1JBUF9SRUFSR19GTEFHKSAmJiAoZGF0YVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSkgfHwKICAgICAgICAgICAgKChzcmNCaXRtYXNrID09IChXUkFQX0FSWV9GTEFHIHwgV1JBUF9SRUFSR19GTEFHKSkgJiYgKHNvdXJjZVs3XS5sZW5ndGggPD0gc291cmNlWzhdKSAmJiAoYml0bWFzayA9PSBXUkFQX0NVUlJZX0ZMQUcpKTsKCiAgICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIG1ldGFkYXRhIGNhbid0IGJlIG1lcmdlZC4KICAgICAgICAgIGlmICghKGlzQ29tbW9uIHx8IGlzQ29tYm8pKSB7CiAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgfQogICAgICAgICAgLy8gVXNlIHNvdXJjZSBgdGhpc0FyZ2AgaWYgYXZhaWxhYmxlLgogICAgICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRykgewogICAgICAgICAgICBkYXRhWzJdID0gc291cmNlWzJdOwogICAgICAgICAgICAvLyBTZXQgd2hlbiBjdXJyeWluZyBhIGJvdW5kIGZ1bmN0aW9uLgogICAgICAgICAgICBuZXdCaXRtYXNrIHw9IGJpdG1hc2sgJiBXUkFQX0JJTkRfRkxBRyA/IDAgOiBXUkFQX0NVUlJZX0JPVU5EX0ZMQUc7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDb21wb3NlIHBhcnRpYWwgYXJndW1lbnRzLgogICAgICAgICAgdmFyIHZhbHVlID0gc291cmNlWzNdOwogICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBwYXJ0aWFscyA9IGRhdGFbM107CiAgICAgICAgICAgIGRhdGFbM10gPSBwYXJ0aWFscyA/IGNvbXBvc2VBcmdzKHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzRdKSA6IHZhbHVlOwogICAgICAgICAgICBkYXRhWzRdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzNdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNF07CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDb21wb3NlIHBhcnRpYWwgcmlnaHQgYXJndW1lbnRzLgogICAgICAgICAgdmFsdWUgPSBzb3VyY2VbNV07CiAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgcGFydGlhbHMgPSBkYXRhWzVdOwogICAgICAgICAgICBkYXRhWzVdID0gcGFydGlhbHMgPyBjb21wb3NlQXJnc1JpZ2h0KHBhcnRpYWxzLCB2YWx1ZSwgc291cmNlWzZdKSA6IHZhbHVlOwogICAgICAgICAgICBkYXRhWzZdID0gcGFydGlhbHMgPyByZXBsYWNlSG9sZGVycyhkYXRhWzVdLCBQTEFDRUhPTERFUikgOiBzb3VyY2VbNl07CiAgICAgICAgICB9CiAgICAgICAgICAvLyBVc2Ugc291cmNlIGBhcmdQb3NgIGlmIGF2YWlsYWJsZS4KICAgICAgICAgIHZhbHVlID0gc291cmNlWzddOwogICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgIGRhdGFbN10gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFVzZSBzb3VyY2UgYGFyeWAgaWYgaXQncyBzbWFsbGVyLgogICAgICAgICAgaWYgKHNyY0JpdG1hc2sgJiBXUkFQX0FSWV9GTEFHKSB7CiAgICAgICAgICAgIGRhdGFbOF0gPSBkYXRhWzhdID09IG51bGwgPyBzb3VyY2VbOF0gOiBuYXRpdmVNaW4oZGF0YVs4XSwgc291cmNlWzhdKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFVzZSBzb3VyY2UgYGFyaXR5YCBpZiBvbmUgaXMgbm90IHByb3ZpZGVkLgogICAgICAgICAgaWYgKGRhdGFbOV0gPT0gbnVsbCkgewogICAgICAgICAgICBkYXRhWzldID0gc291cmNlWzldOwogICAgICAgICAgfQogICAgICAgICAgLy8gVXNlIHNvdXJjZSBgZnVuY2AgYW5kIG1lcmdlIGJpdG1hc2tzLgogICAgICAgICAgZGF0YVswXSA9IHNvdXJjZVswXTsKICAgICAgICAgIGRhdGFbMV0gPSBuZXdCaXRtYXNrOwoKICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBsaWtlCiAgICAgICAgICogW2BPYmplY3Qua2V5c2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKQogICAgICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAgIGlmIChvYmplY3QgIT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHsKICAgICAgICAgICAgICByZXN1bHQucHVzaChrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZyB1c2luZyBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBvYmplY3RUb1N0cmluZyh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlUmVzdGAgd2hpY2ggdHJhbnNmb3JtcyB0aGUgcmVzdCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXBwbHkgYSByZXN0IHBhcmFtZXRlciB0by4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdHJhbnNmb3JtIFRoZSByZXN0IGFycmF5IHRyYW5zZm9ybS4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBvdmVyUmVzdChmdW5jLCBzdGFydCwgdHJhbnNmb3JtKSB7CiAgICAgICAgICBzdGFydCA9IG5hdGl2ZU1heChzdGFydCA9PT0gdW5kZWZpbmVkJDEgPyAoZnVuYy5sZW5ndGggLSAxKSA6IHN0YXJ0LCAwKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICBpbmRleCA9IC0xLAogICAgICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4KGFyZ3MubGVuZ3RoIC0gc3RhcnQsIDApLAogICAgICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpOwoKICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgICBhcnJheVtpbmRleF0gPSBhcmdzW3N0YXJ0ICsgaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZGV4ID0gLTE7CiAgICAgICAgICAgIHZhciBvdGhlckFyZ3MgPSBBcnJheShzdGFydCArIDEpOwogICAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7CiAgICAgICAgICAgICAgb3RoZXJBcmdzW2luZGV4XSA9IGFyZ3NbaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpOwogICAgICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBwYXJlbnQgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gcGF0aCBUaGUgcGF0aCB0byBnZXQgdGhlIHBhcmVudCB2YWx1ZSBvZi4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcGFyZW50IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHBhcmVudChvYmplY3QsIHBhdGgpIHsKICAgICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA8IDIgPyBvYmplY3QgOiBiYXNlR2V0KG9iamVjdCwgYmFzZVNsaWNlKHBhdGgsIDAsIC0xKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZW9yZGVyIGBhcnJheWAgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgaW5kZXhlcyB3aGVyZSB0aGUgZWxlbWVudCBhdAogICAgICAgICAqIHRoZSBmaXJzdCBpbmRleCBpcyBhc3NpZ25lZCBhcyB0aGUgZmlyc3QgZWxlbWVudCwgdGhlIGVsZW1lbnQgYXQKICAgICAgICAgKiB0aGUgc2Vjb25kIGluZGV4IGlzIGFzc2lnbmVkIGFzIHRoZSBzZWNvbmQgZWxlbWVudCwgYW5kIHNvIG9uLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcmVvcmRlci4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBpbmRleGVzIFRoZSBhcnJhbmdlZCBhcnJheSBpbmRleGVzLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlb3JkZXIoYXJyYXksIGluZGV4ZXMpIHsKICAgICAgICAgIHZhciBhcnJMZW5ndGggPSBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWluKGluZGV4ZXMubGVuZ3RoLCBhcnJMZW5ndGgpLAogICAgICAgICAgICAgIG9sZEFycmF5ID0gY29weUFycmF5KGFycmF5KTsKCiAgICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gaW5kZXhlc1tsZW5ndGhdOwogICAgICAgICAgICBhcnJheVtsZW5ndGhdID0gaXNJbmRleChpbmRleCwgYXJyTGVuZ3RoKSA/IG9sZEFycmF5W2luZGV4XSA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGFycmF5OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYGtleWAsIHVubGVzcyBga2V5YCBpcyAiX19wcm90b19fIiBvciAiY29uc3RydWN0b3IiLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNhZmVHZXQob2JqZWN0LCBrZXkpIHsKICAgICAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gb2JqZWN0W2tleV07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIG1ldGFkYXRhIGZvciBgZnVuY2AuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogSWYgdGhpcyBmdW5jdGlvbiBiZWNvbWVzIGhvdCwgaS5lLiBpcyBpbnZva2VkIGEgbG90IGluIGEgc2hvcnQKICAgICAgICAgKiBwZXJpb2Qgb2YgdGltZSwgaXQgd2lsbCB0cmlwIGl0cyBicmVha2VyIGFuZCB0cmFuc2l0aW9uIHRvIGFuIGlkZW50aXR5CiAgICAgICAgICogZnVuY3Rpb24gdG8gYXZvaWQgZ2FyYmFnZSBjb2xsZWN0aW9uIHBhdXNlcyBpbiBWOC4gU2VlCiAgICAgICAgICogW1Y4IGlzc3VlIDIwNzBdKGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTIwNzApCiAgICAgICAgICogZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzb2NpYXRlIG1ldGFkYXRhIHdpdGguCiAgICAgICAgICogQHBhcmFtIHsqfSBkYXRhIFRoZSBtZXRhZGF0YS4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLgogICAgICAgICAqLwogICAgICAgIHZhciBzZXREYXRhID0gc2hvcnRPdXQoYmFzZVNldERhdGEpOwoKICAgICAgICAvKioKICAgICAgICAgKiBBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCB0aGUgZ2xvYmFsIFtgc2V0VGltZW91dGBdKGh0dHBzOi8vbWRuLmlvL3NldFRpbWVvdXQpLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBkZWxheS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gd2FpdCBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBpbnZvY2F0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ8T2JqZWN0fSBSZXR1cm5zIHRoZSB0aW1lciBpZCBvciB0aW1lb3V0IG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICB2YXIgc2V0VGltZW91dCA9IGN0eFNldFRpbWVvdXQgfHwgZnVuY3Rpb24oZnVuYywgd2FpdCkgewogICAgICAgICAgcmV0dXJuIHJvb3Quc2V0VGltZW91dChmdW5jLCB3YWl0KTsKICAgICAgICB9OwoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBgdG9TdHJpbmdgIG1ldGhvZCBvZiBgZnVuY2AgdG8gcmV0dXJuIGBzdHJpbmdgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLgogICAgICAgICAqLwogICAgICAgIHZhciBzZXRUb1N0cmluZyA9IHNob3J0T3V0KGJhc2VTZXRUb1N0cmluZyk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGB0b1N0cmluZ2AgbWV0aG9kIG9mIGB3cmFwcGVyYCB0byBtaW1pYyB0aGUgc291cmNlIG9mIGByZWZlcmVuY2VgCiAgICAgICAgICogd2l0aCB3cmFwcGVyIGRldGFpbHMgaW4gYSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIHNvdXJjZSBib2R5LgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB3cmFwcGVyIFRoZSBmdW5jdGlvbiB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVmZXJlbmNlIFRoZSByZWZlcmVuY2UgZnVuY3Rpb24uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgY3JlYXRlV3JhcGAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYHdyYXBwZXJgLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFdyYXBUb1N0cmluZyh3cmFwcGVyLCByZWZlcmVuY2UsIGJpdG1hc2spIHsKICAgICAgICAgIHZhciBzb3VyY2UgPSAocmVmZXJlbmNlICsgJycpOwogICAgICAgICAgcmV0dXJuIHNldFRvU3RyaW5nKHdyYXBwZXIsIGluc2VydFdyYXBEZXRhaWxzKHNvdXJjZSwgdXBkYXRlV3JhcERldGFpbHMoZ2V0V3JhcERldGFpbHMoc291cmNlKSwgYml0bWFzaykpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZAogICAgICAgICAqIG9mIGBmdW5jYCB3aGVuIGl0J3MgY2FsbGVkIGBIT1RfQ09VTlRgIG9yIG1vcmUgdGltZXMgaW4gYEhPVF9TUEFOYAogICAgICAgICAqIG1pbGxpc2Vjb25kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNob3J0T3V0KGZ1bmMpIHsKICAgICAgICAgIHZhciBjb3VudCA9IDAsCiAgICAgICAgICAgICAgbGFzdENhbGxlZCA9IDA7CgogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSwKICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IEhPVF9TUEFOIC0gKHN0YW1wIC0gbGFzdENhbGxlZCk7CgogICAgICAgICAgICBsYXN0Q2FsbGVkID0gc3RhbXA7CiAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7CiAgICAgICAgICAgICAgaWYgKCsrY291bnQgPj0gSE9UX0NPVU5UKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBjb3VudCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodW5kZWZpbmVkJDEsIGFyZ3VtZW50cyk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLnNodWZmbGVgIHdoaWNoIG11dGF0ZXMgYW5kIHNldHMgdGhlIHNpemUgb2YgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHNodWZmbGUuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzaXplPWFycmF5Lmxlbmd0aF0gVGhlIHNpemUgb2YgYGFycmF5YC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzaHVmZmxlU2VsZihhcnJheSwgc2l6ZSkgewogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDE7CgogICAgICAgICAgc2l6ZSA9IHNpemUgPT09IHVuZGVmaW5lZCQxID8gbGVuZ3RoIDogc2l6ZTsKICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgc2l6ZSkgewogICAgICAgICAgICB2YXIgcmFuZCA9IGJhc2VSYW5kb20oaW5kZXgsIGxhc3RJbmRleCksCiAgICAgICAgICAgICAgICB2YWx1ZSA9IGFycmF5W3JhbmRdOwoKICAgICAgICAgICAgYXJyYXlbcmFuZF0gPSBhcnJheVtpbmRleF07CiAgICAgICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgYXJyYXkubGVuZ3RoID0gc2l6ZTsKICAgICAgICAgIHJldHVybiBhcnJheTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBwYXRoIGFycmF5LgogICAgICAgICAqLwogICAgICAgIHZhciBzdHJpbmdUb1BhdGggPSBtZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgaWYgKHN0cmluZy5jaGFyQ29kZUF0KDApID09PSA0NiAvKiAuICovKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKCcnKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0cmluZy5yZXBsYWNlKHJlUHJvcE5hbWUsIGZ1bmN0aW9uKG1hdGNoLCBudW1iZXIsIHF1b3RlLCBzdWJTdHJpbmcpIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ3xzeW1ib2x9IFJldHVybnMgdGhlIGtleS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0b0tleSh2YWx1ZSkgewogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCBpc1N5bWJvbCh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTsKICAgICAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkpID8gJy0wJyA6IHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc291cmNlIGNvZGUuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykgewogICAgICAgICAgaWYgKGZ1bmMgIT0gbnVsbCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTsKICAgICAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7CiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHdyYXBwZXIgYGRldGFpbHNgIGJhc2VkIG9uIGBiaXRtYXNrYCBmbGFncy4KICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBkZXRhaWxzIFRoZSBkZXRhaWxzIHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBjcmVhdGVXcmFwYCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgZGV0YWlsc2AuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdXBkYXRlV3JhcERldGFpbHMoZGV0YWlscywgYml0bWFzaykgewogICAgICAgICAgYXJyYXlFYWNoKHdyYXBGbGFncywgZnVuY3Rpb24ocGFpcikgewogICAgICAgICAgICB2YXIgdmFsdWUgPSAnXy4nICsgcGFpclswXTsKICAgICAgICAgICAgaWYgKChiaXRtYXNrICYgcGFpclsxXSkgJiYgIWFycmF5SW5jbHVkZXMoZGV0YWlscywgdmFsdWUpKSB7CiAgICAgICAgICAgICAgZGV0YWlscy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gZGV0YWlscy5zb3J0KCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHdyYXBwZXJgLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gd3JhcHBlciBUaGUgd3JhcHBlciB0byBjbG9uZS4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgd3JhcHBlci4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB3cmFwcGVyQ2xvbmUod3JhcHBlcikgewogICAgICAgICAgaWYgKHdyYXBwZXIgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikgewogICAgICAgICAgICByZXR1cm4gd3JhcHBlci5jbG9uZSgpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJlc3VsdCA9IG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZXIuX193cmFwcGVkX18sIHdyYXBwZXIuX19jaGFpbl9fKTsKICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh3cmFwcGVyLl9fYWN0aW9uc19fKTsKICAgICAgICAgIHJlc3VsdC5fX2luZGV4X18gID0gd3JhcHBlci5fX2luZGV4X187CiAgICAgICAgICByZXN1bHQuX192YWx1ZXNfXyA9IHdyYXBwZXIuX192YWx1ZXNfXzsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgc3BsaXQgaW50byBncm91cHMgdGhlIGxlbmd0aCBvZiBgc2l6ZWAuCiAgICAgICAgICogSWYgYGFycmF5YCBjYW4ndCBiZSBzcGxpdCBldmVubHksIHRoZSBmaW5hbCBjaHVuayB3aWxsIGJlIHRoZSByZW1haW5pbmcKICAgICAgICAgKiBlbGVtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBwcm9jZXNzLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc2l6ZT0xXSBUaGUgbGVuZ3RoIG9mIGVhY2ggY2h1bmsKICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNodW5rcy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5jaHVuayhbJ2EnLCAnYicsICdjJywgJ2QnXSwgMik7CiAgICAgICAgICogLy8gPT4gW1snYScsICdiJ10sIFsnYycsICdkJ11dCiAgICAgICAgICoKICAgICAgICAgKiBfLmNodW5rKFsnYScsICdiJywgJ2MnLCAnZCddLCAzKTsKICAgICAgICAgKiAvLyA9PiBbWydhJywgJ2InLCAnYyddLCBbJ2QnXV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjaHVuayhhcnJheSwgc2l6ZSwgZ3VhcmQpIHsKICAgICAgICAgIGlmICgoZ3VhcmQgPyBpc0l0ZXJhdGVlQ2FsbChhcnJheSwgc2l6ZSwgZ3VhcmQpIDogc2l6ZSA9PT0gdW5kZWZpbmVkJDEpKSB7CiAgICAgICAgICAgIHNpemUgPSAxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2l6ZSA9IG5hdGl2ZU1heCh0b0ludGVnZXIoc2l6ZSksIDApOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgaWYgKCFsZW5ndGggfHwgc2l6ZSA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGluZGV4ID0gMCwKICAgICAgICAgICAgICByZXNJbmRleCA9IDAsCiAgICAgICAgICAgICAgcmVzdWx0ID0gQXJyYXkobmF0aXZlQ2VpbChsZW5ndGggLyBzaXplKSk7CgogICAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IGJhc2VTbGljZShhcnJheSwgaW5kZXgsIChpbmRleCArPSBzaXplKSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSB3aXRoIGFsbCBmYWxzZXkgdmFsdWVzIHJlbW92ZWQuIFRoZSB2YWx1ZXMgYGZhbHNlYCwgYG51bGxgLAogICAgICAgICAqIGAwYCwgYCIiYCwgYHVuZGVmaW5lZGAsIGFuZCBgTmFOYCBhcmUgZmFsc2V5LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbXBhY3QuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmNvbXBhY3QoWzAsIDEsIGZhbHNlLCAyLCAnJywgM10pOwogICAgICAgICAqIC8vID0+IFsxLCAyLCAzXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoLAogICAgICAgICAgICAgIHJlc0luZGV4ID0gMCwKICAgICAgICAgICAgICByZXN1bHQgPSBbXTsKCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgIHJlc3VsdFtyZXNJbmRleCsrXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBhcnJheSBjb25jYXRlbmF0aW5nIGBhcnJheWAgd2l0aCBhbnkgYWRkaXRpb25hbCBhcnJheXMKICAgICAgICAgKiBhbmQvb3IgdmFsdWVzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGNvbmNhdGVuYXRlLgogICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBjb25jYXRlbmF0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBjb25jYXRlbmF0ZWQgYXJyYXkuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheSA9IFsxXTsKICAgICAgICAgKiB2YXIgb3RoZXIgPSBfLmNvbmNhdChhcnJheSwgMiwgWzNdLCBbWzRdXSk7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhvdGhlcik7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDMsIFs0XV0KICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTsKICAgICAgICAgKiAvLyA9PiBbMV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb25jYXQoKSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDsKICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBhcmdzID0gQXJyYXkobGVuZ3RoIC0gMSksCiAgICAgICAgICAgICAgYXJyYXkgPSBhcmd1bWVudHNbMF0sCiAgICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7CgogICAgICAgICAgd2hpbGUgKGluZGV4LS0pIHsKICAgICAgICAgICAgYXJnc1tpbmRleCAtIDFdID0gYXJndW1lbnRzW2luZGV4XTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBhcnJheVB1c2goaXNBcnJheShhcnJheSkgPyBjb3B5QXJyYXkoYXJyYXkpIDogW2FycmF5XSwgYmFzZUZsYXR0ZW4oYXJncywgMSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBgYXJyYXlgIHZhbHVlcyBub3QgaW5jbHVkZWQgaW4gdGhlIG90aGVyIGdpdmVuIGFycmF5cwogICAgICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmUKICAgICAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbEFsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgogICAgICAgICAqIEBzZWUgXy53aXRob3V0LCBfLnhvcgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmRpZmZlcmVuY2UoWzIsIDFdLCBbMiwgM10pOwogICAgICAgICAqIC8vID0+IFsxXQogICAgICAgICAqLwogICAgICAgIHZhciBkaWZmZXJlbmNlID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykgewogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KQogICAgICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSkKICAgICAgICAgICAgOiBbXTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5kaWZmZXJlbmNlYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2gKICAgICAgICAgKiBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbgogICAgICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBvcmRlciBhbmQgcmVmZXJlbmNlcyBvZiByZXN1bHQgdmFsdWVzIGFyZQogICAgICAgICAqIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDoKICAgICAgICAgKiAodmFsdWUpLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsQnlgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW3ZhbHVlc10gVGhlIHZhbHVlcyB0byBleGNsdWRlLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZGlmZmVyZW5jZUJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpOwogICAgICAgICAqIC8vID0+IFsxLjJdCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmRpZmZlcmVuY2VCeShbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sIFt7ICd4JzogMSB9XSwgJ3gnKTsKICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDIgfV0KICAgICAgICAgKi8KICAgICAgICB2YXIgZGlmZmVyZW5jZUJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykgewogICAgICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdCh2YWx1ZXMpOwogICAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkgewogICAgICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KQogICAgICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKQogICAgICAgICAgICA6IFtdOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmRpZmZlcmVuY2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgCiAgICAgICAgICogd2hpY2ggaXMgaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheWAgdG8gYHZhbHVlc2AuIFRoZSBvcmRlciBhbmQKICAgICAgICAgKiByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlIGRldGVybWluZWQgYnkgdGhlIGZpcnN0IGFycmF5LiBUaGUgY29tcGFyYXRvcgogICAgICAgICAqIGlzIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5wdWxsQWxsV2l0aGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGV4Y2x1ZGUuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogMSwgJ3knOiAyIH0sIHsgJ3gnOiAyLCAneSc6IDEgfV07CiAgICAgICAgICoKICAgICAgICAgKiBfLmRpZmZlcmVuY2VXaXRoKG9iamVjdHMsIFt7ICd4JzogMSwgJ3knOiAyIH1dLCBfLmlzRXF1YWwpOwogICAgICAgICAqIC8vID0+IFt7ICd4JzogMiwgJ3knOiAxIH1dCiAgICAgICAgICovCiAgICAgICAgdmFyIGRpZmZlcmVuY2VXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykgewogICAgICAgICAgdmFyIGNvbXBhcmF0b3IgPSBsYXN0KHZhbHVlcyk7CiAgICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoY29tcGFyYXRvcikpIHsKICAgICAgICAgICAgY29tcGFyYXRvciA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KQogICAgICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCBiYXNlRmxhdHRlbih2YWx1ZXMsIDEsIGlzQXJyYXlMaWtlT2JqZWN0LCB0cnVlKSwgdW5kZWZpbmVkJDEsIGNvbXBhcmF0b3IpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuNS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGRyb3AuCiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZHJvcChbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IFsyLCAzXQogICAgICAgICAqCiAgICAgICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMik7CiAgICAgICAgICogLy8gPT4gWzNdCiAgICAgICAgICoKICAgICAgICAgKiBfLmRyb3AoWzEsIDIsIDNdLCA1KTsKICAgICAgICAgKiAvLyA9PiBbXQogICAgICAgICAqCiAgICAgICAgICogXy5kcm9wKFsxLCAyLCAzXSwgMCk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZHJvcChhcnJheSwgbiwgZ3VhcmQpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkJDEpID8gMSA6IHRvSW50ZWdlcihuKTsKICAgICAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGBuYCBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBkcm9wLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmRyb3BSaWdodChbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IFsxLCAyXQogICAgICAgICAqCiAgICAgICAgICogXy5kcm9wUmlnaHQoWzEsIDIsIDNdLCAyKTsKICAgICAgICAgKiAvLyA9PiBbMV0KICAgICAgICAgKgogICAgICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgNSk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKgogICAgICAgICAqIF8uZHJvcFJpZ2h0KFsxLCAyLCAzXSwgMCk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZHJvcFJpZ2h0KGFycmF5LCBuLCBndWFyZCkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgbiA9IChndWFyZCB8fCBuID09PSB1bmRlZmluZWQkMSkgPyAxIDogdG9JbnRlZ2VyKG4pOwogICAgICAgICAgbiA9IGxlbmd0aCAtIG47CiAgICAgICAgICByZXR1cm4gYmFzZVNsaWNlKGFycmF5LCAwLCBuIDwgMCA/IDAgOiBuKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIGV4Y2x1ZGluZyBlbGVtZW50cyBkcm9wcGVkIGZyb20gdGhlIGVuZC4KICAgICAgICAgKiBFbGVtZW50cyBhcmUgZHJvcHBlZCB1bnRpbCBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcwogICAgICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXgsIGFycmF5KS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICAnYWN0aXZlJzogdHJ1ZSB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogZmFsc2UgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J10KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5kcm9wUmlnaHRXaGlsZSh1c2VycywgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZHJvcFJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmRyb3BSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCcsICdwZWJibGVzJ10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBkcm9wUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIHRydWUsIHRydWUpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBleGNsdWRpbmcgZWxlbWVudHMgZHJvcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCiAgICAgICAgICogRWxlbWVudHMgYXJlIGRyb3BwZWQgdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMKICAgICAgICAgKiBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHVzZXJzID0gWwogICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiB0cnVlIH0KICAgICAgICAgKiBdOwogICAgICAgICAqCiAgICAgICAgICogXy5kcm9wV2hpbGUodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuICFvLmFjdGl2ZTsgfSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydwZWJibGVzJ10KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5kcm9wV2hpbGUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCcsICdwZWJibGVzJ10KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsncGViYmxlcyddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmRyb3BXaGlsZSh1c2VycywgJ2FjdGl2ZScpOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnLCAncGViYmxlcyddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZHJvcFdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgdHJ1ZSkKICAgICAgICAgICAgOiBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEZpbGxzIGVsZW1lbnRzIG9mIGBhcnJheWAgd2l0aCBgdmFsdWVgIGZyb20gYHN0YXJ0YCB1cCB0bywgYnV0IG5vdAogICAgICAgICAqIGluY2x1ZGluZywgYGVuZGAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMi4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZpbGwuCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCBgYXJyYXlgIHdpdGguCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMiwgM107CiAgICAgICAgICoKICAgICAgICAgKiBfLmZpbGwoYXJyYXksICdhJyk7CiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOwogICAgICAgICAqIC8vID0+IFsnYScsICdhJywgJ2EnXQogICAgICAgICAqCiAgICAgICAgICogXy5maWxsKEFycmF5KDMpLCAyKTsKICAgICAgICAgKiAvLyA9PiBbMiwgMiwgMl0KICAgICAgICAgKgogICAgICAgICAqIF8uZmlsbChbNCwgNiwgOCwgMTBdLCAnKicsIDEsIDMpOwogICAgICAgICAqIC8vID0+IFs0LCAnKicsICcqJywgMTBdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZmlsbChhcnJheSwgdmFsdWUsIHN0YXJ0LCBlbmQpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGFydCAmJiB0eXBlb2Ygc3RhcnQgIT0gJ251bWJlcicgJiYgaXNJdGVyYXRlZUNhbGwoYXJyYXksIHZhbHVlLCBzdGFydCkpIHsKICAgICAgICAgICAgc3RhcnQgPSAwOwogICAgICAgICAgICBlbmQgPSBsZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZUZpbGwoYXJyYXksIHZhbHVlLCBzdGFydCwgZW5kKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0CiAgICAgICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMS4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtmcm9tSW5kZXg9MF0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pOwogICAgICAgICAqIC8vID0+IDAKICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5maW5kSW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnZnJlZCcsICdhY3RpdmUnOiBmYWxzZSB9KTsKICAgICAgICAgKiAvLyA9PiAxCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5maW5kSW5kZXgodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiAwCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpOwogICAgICAgICAqIC8vID0+IDIKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgICBpZiAoIWxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaW5kZXggPSBmcm9tSW5kZXggPT0gbnVsbCA/IDAgOiB0b0ludGVnZXIoZnJvbUluZGV4KTsKICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICAgICAgaW5kZXggPSBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VGaW5kSW5kZXgoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGluZGV4KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEluZGV4YCBleGNlcHQgdGhhdCBpdCBpdGVyYXRlcyBvdmVyIGVsZW1lbnRzCiAgICAgICAgICogb2YgYGNvbGxlY3Rpb25gIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAyLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiB0cnVlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWN0aXZlJzogZmFsc2UgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyID09ICdwZWJibGVzJzsgfSk7CiAgICAgICAgICogLy8gPT4gMgogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmZpbmRMYXN0SW5kZXgodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSk7CiAgICAgICAgICogLy8gPT4gMAogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICAgICAqIC8vID0+IDIKICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZExhc3RJbmRleCh1c2VycywgJ2FjdGl2ZScpOwogICAgICAgICAqIC8vID0+IDAKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmaW5kTGFzdEluZGV4KGFycmF5LCBwcmVkaWNhdGUsIGZyb21JbmRleCkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoIC0gMTsKICAgICAgICAgIGlmIChmcm9tSW5kZXggIT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgIGluZGV4ID0gdG9JbnRlZ2VyKGZyb21JbmRleCk7CiAgICAgICAgICAgIGluZGV4ID0gZnJvbUluZGV4IDwgMAogICAgICAgICAgICAgID8gbmF0aXZlTWF4KGxlbmd0aCArIGluZGV4LCAwKQogICAgICAgICAgICAgIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBiYXNlRmluZEluZGV4KGFycmF5LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBpbmRleCwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZmxhdHRlbihbMSwgWzIsIFszLCBbNF1dLCA1XV0pOwogICAgICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmbGF0dGVuKGFycmF5KSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gbGVuZ3RoID8gYmFzZUZsYXR0ZW4oYXJyYXksIDEpIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVucyBgYXJyYXlgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGZsYXR0ZW4uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmZsYXR0ZW5EZWVwKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDMsIDQsIDVdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZmxhdHRlbkRlZXAoYXJyYXkpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlRmxhdHRlbihhcnJheSwgSU5GSU5JVFkpIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZWN1cnNpdmVseSBmbGF0dGVuIGBhcnJheWAgdXAgdG8gYGRlcHRoYCB0aW1lcy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjQuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBmbGF0dGVuLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVwdGg9MV0gVGhlIG1heGltdW0gcmVjdXJzaW9uIGRlcHRoLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFycmF5ID0gWzEsIFsyLCBbMywgWzRdXSwgNV1dOwogICAgICAgICAqCiAgICAgICAgICogXy5mbGF0dGVuRGVwdGgoYXJyYXksIDEpOwogICAgICAgICAqIC8vID0+IFsxLCAyLCBbMywgWzRdXSwgNV0KICAgICAgICAgKgogICAgICAgICAqIF8uZmxhdHRlbkRlcHRoKGFycmF5LCAyKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMiwgMywgWzRdLCA1XQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGZsYXR0ZW5EZXB0aChhcnJheSwgZGVwdGgpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCQxID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7CiAgICAgICAgICByZXR1cm4gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBpbnZlcnNlIG9mIGBfLnRvUGFpcnNgOyB0aGlzIG1ldGhvZCByZXR1cm5zIGFuIG9iamVjdCBjb21wb3NlZAogICAgICAgICAqIGZyb20ga2V5LXZhbHVlIGBwYWlyc2AuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUga2V5LXZhbHVlIHBhaXJzLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZnJvbVBhaXJzKFtbJ2EnLCAxXSwgWydiJywgMl1dKTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmcm9tUGFpcnMocGFpcnMpIHsKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IHBhaXJzID09IG51bGwgPyAwIDogcGFpcnMubGVuZ3RoLAogICAgICAgICAgICAgIHJlc3VsdCA9IHt9OwoKICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBwYWlyID0gcGFpcnNbaW5kZXhdOwogICAgICAgICAgICByZXN1bHRbcGFpclswXV0gPSBwYWlyWzFdOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBhbGlhcyBmaXJzdAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmhlYWQoWzEsIDIsIDNdKTsKICAgICAgICAgKiAvLyA9PiAxCiAgICAgICAgICoKICAgICAgICAgKiBfLmhlYWQoW10pOwogICAgICAgICAqIC8vID0+IHVuZGVmaW5lZAogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGhlYWQoYXJyYXkpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGFycmF5WzBdIDogdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBgdmFsdWVgIGlzIGZvdW5kIGluIGBhcnJheWAKICAgICAgICAgKiB1c2luZyBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKQogICAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4gSWYgYGZyb21JbmRleGAgaXMgbmVnYXRpdmUsIGl0J3MgdXNlZCBhcyB0aGUKICAgICAgICAgKiBvZmZzZXQgZnJvbSB0aGUgZW5kIG9mIGBhcnJheWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTsKICAgICAgICAgKiAvLyA9PiAxCiAgICAgICAgICoKICAgICAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuCiAgICAgICAgICogXy5pbmRleE9mKFsxLCAyLCAxLCAyXSwgMiwgMik7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGluZGV4T2YoYXJyYXksIHZhbHVlLCBmcm9tSW5kZXgpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCA9PSBudWxsID8gMCA6IHRvSW50ZWdlcihmcm9tSW5kZXgpOwogICAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICBpbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBpbmRleCwgMCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCBpbmRleCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pbml0aWFsKFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gWzEsIDJdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaW5pdGlhbChhcnJheSkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgcmV0dXJuIGxlbmd0aCA/IGJhc2VTbGljZShhcnJheSwgMCwgLTEpIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gYWxsIGdpdmVuIGFycmF5cwogICAgICAgICAqIHVzaW5nIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBUaGUgb3JkZXIgYW5kIHJlZmVyZW5jZXMgb2YgcmVzdWx0IHZhbHVlcyBhcmUKICAgICAgICAgKiBkZXRlcm1pbmVkIGJ5IHRoZSBmaXJzdCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBpbnRlcnNlY3RpbmcgdmFsdWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmludGVyc2VjdGlvbihbMiwgMV0sIFsyLCAzXSk7CiAgICAgICAgICogLy8gPT4gWzJdCiAgICAgICAgICovCiAgICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykgewogICAgICAgICAgdmFyIG1hcHBlZCA9IGFycmF5TWFwKGFycmF5cywgY2FzdEFycmF5TGlrZU9iamVjdCk7CiAgICAgICAgICByZXR1cm4gKG1hcHBlZC5sZW5ndGggJiYgbWFwcGVkWzBdID09PSBhcnJheXNbMF0pCiAgICAgICAgICAgID8gYmFzZUludGVyc2VjdGlvbihtYXBwZWQpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAKICAgICAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uCiAgICAgICAgICogYnkgd2hpY2ggdGhleSdyZSBjb21wYXJlZC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzIG9mIHJlc3VsdCB2YWx1ZXMgYXJlCiAgICAgICAgICogZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OgogICAgICAgICAqICh2YWx1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGludGVyc2VjdGluZyB2YWx1ZXMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoWzIuMSwgMS4yXSwgWzIuMywgMy40XSwgTWF0aC5mbG9vcik7CiAgICAgICAgICogLy8gPT4gWzIuMV0KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uaW50ZXJzZWN0aW9uQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7CiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxIH1dCiAgICAgICAgICovCiAgICAgICAgdmFyIGludGVyc2VjdGlvbkJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7CiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyksCiAgICAgICAgICAgICAgbWFwcGVkID0gYXJyYXlNYXAoYXJyYXlzLCBjYXN0QXJyYXlMaWtlT2JqZWN0KTsKCiAgICAgICAgICBpZiAoaXRlcmF0ZWUgPT09IGxhc3QobWFwcGVkKSkgewogICAgICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbWFwcGVkLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKQogICAgICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW50ZXJzZWN0aW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYAogICAgICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gVGhlIG9yZGVyIGFuZCByZWZlcmVuY2VzCiAgICAgICAgICogb2YgcmVzdWx0IHZhbHVlcyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgZmlyc3QgYXJyYXkuIFRoZSBjb21wYXJhdG9yIGlzCiAgICAgICAgICogaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2NvbXBhcmF0b3JdIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgaW50ZXJzZWN0aW5nIHZhbHVlcy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH1dOwogICAgICAgICAqIHZhciBvdGhlcnMgPSBbeyAneCc6IDEsICd5JzogMSB9LCB7ICd4JzogMSwgJ3knOiAyIH1dOwogICAgICAgICAqCiAgICAgICAgICogXy5pbnRlcnNlY3Rpb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTsKICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9XQogICAgICAgICAqLwogICAgICAgIHZhciBpbnRlcnNlY3Rpb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7CiAgICAgICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKSwKICAgICAgICAgICAgICBtYXBwZWQgPSBhcnJheU1hcChhcnJheXMsIGNhc3RBcnJheUxpa2VPYmplY3QpOwoKICAgICAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgaWYgKGNvbXBhcmF0b3IpIHsKICAgICAgICAgICAgbWFwcGVkLnBvcCgpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIChtYXBwZWQubGVuZ3RoICYmIG1hcHBlZFswXSA9PT0gYXJyYXlzWzBdKQogICAgICAgICAgICA/IGJhc2VJbnRlcnNlY3Rpb24obWFwcGVkLCB1bmRlZmluZWQkMSwgY29tcGFyYXRvcikKICAgICAgICAgICAgOiBbXTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYWxsIGVsZW1lbnRzIGluIGBhcnJheWAgaW50byBhIHN0cmluZyBzZXBhcmF0ZWQgYnkgYHNlcGFyYXRvcmAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY29udmVydC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NlcGFyYXRvcj0nLCddIFRoZSBlbGVtZW50IHNlcGFyYXRvci4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBqb2luZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmpvaW4oWydhJywgJ2InLCAnYyddLCAnficpOwogICAgICAgICAqIC8vID0+ICdhfmJ+YycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBqb2luKGFycmF5LCBzZXBhcmF0b3IpIHsKICAgICAgICAgIHJldHVybiBhcnJheSA9PSBudWxsID8gJycgOiBuYXRpdmVKb2luLmNhbGwoYXJyYXksIHNlcGFyYXRvcik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbGFzdCBlbGVtZW50IG9mIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ubGFzdChbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IDMKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBsYXN0KGFycmF5KSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gbGVuZ3RoID8gYXJyYXlbbGVuZ3RoIC0gMV0gOiB1bmRlZmluZWQkMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZgogICAgICAgICAqIGBhcnJheWAgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD1hcnJheS5sZW5ndGgtMV0gVGhlIGluZGV4IHRvIHNlYXJjaCBmcm9tLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ubGFzdEluZGV4T2YoWzEsIDIsIDEsIDJdLCAyKTsKICAgICAgICAgKiAvLyA9PiAzCiAgICAgICAgICoKICAgICAgICAgKiAvLyBTZWFyY2ggZnJvbSB0aGUgYGZyb21JbmRleGAuCiAgICAgICAgICogXy5sYXN0SW5kZXhPZihbMSwgMiwgMSwgMl0sIDIsIDIpOwogICAgICAgICAqIC8vID0+IDEKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBsYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGZyb21JbmRleCkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGluZGV4ID0gbGVuZ3RoOwogICAgICAgICAgaWYgKGZyb21JbmRleCAhPT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgaW5kZXggPSB0b0ludGVnZXIoZnJvbUluZGV4KTsKICAgICAgICAgICAgaW5kZXggPSBpbmRleCA8IDAgPyBuYXRpdmVNYXgobGVuZ3RoICsgaW5kZXgsIDApIDogbmF0aXZlTWluKGluZGV4LCBsZW5ndGggLSAxKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUKICAgICAgICAgICAgPyBzdHJpY3RMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUsIGluZGV4KQogICAgICAgICAgICA6IGJhc2VGaW5kSW5kZXgoYXJyYXksIGJhc2VJc05hTiwgaW5kZXgsIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZWxlbWVudCBhdCBpbmRleCBgbmAgb2YgYGFycmF5YC4gSWYgYG5gIGlzIG5lZ2F0aXZlLCB0aGUgbnRoCiAgICAgICAgICogZWxlbWVudCBmcm9tIHRoZSBlbmQgaXMgcmV0dXJuZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4xMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0wXSBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBudGggZWxlbWVudCBvZiBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTsKICAgICAgICAgKgogICAgICAgICAqIF8ubnRoKGFycmF5LCAxKTsKICAgICAgICAgKiAvLyA9PiAnYicKICAgICAgICAgKgogICAgICAgICAqIF8ubnRoKGFycmF5LCAtMik7CiAgICAgICAgICogLy8gPT4gJ2MnOwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG50aChhcnJheSwgbikgewogICAgICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZU50aChhcnJheSwgdG9JbnRlZ2VyKG4pKSA6IHVuZGVmaW5lZCQxOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbGwgZ2l2ZW4gdmFsdWVzIGZyb20gYGFycmF5YCB1c2luZwogICAgICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy53aXRob3V0YCwgdGhpcyBtZXRob2QgbXV0YXRlcyBgYXJyYXlgLiBVc2UgYF8ucmVtb3ZlYAogICAgICAgICAqIHRvIHJlbW92ZSBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHByZWRpY2F0ZS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAyLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIHJlbW92ZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFycmF5ID0gWydhJywgJ2InLCAnYycsICdhJywgJ2InLCAnYyddOwogICAgICAgICAqCiAgICAgICAgICogXy5wdWxsKGFycmF5LCAnYScsICdjJyk7CiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOwogICAgICAgICAqIC8vID0+IFsnYicsICdiJ10KICAgICAgICAgKi8KICAgICAgICB2YXIgcHVsbCA9IGJhc2VSZXN0KHB1bGxBbGwpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnB1bGxgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYW4gYXJyYXkgb2YgdmFsdWVzIHRvIHJlbW92ZS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8uZGlmZmVyZW5jZWAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2EnLCAnYicsICdjJ107CiAgICAgICAgICoKICAgICAgICAgKiBfLnB1bGxBbGwoYXJyYXksIFsnYScsICdjJ10pOwogICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTsKICAgICAgICAgKiAvLyA9PiBbJ2InLCAnYiddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcHVsbEFsbChhcnJheSwgdmFsdWVzKSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCAmJiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCkKICAgICAgICAgICAgPyBiYXNlUHVsbEFsbChhcnJheSwgdmFsdWVzKQogICAgICAgICAgICA6IGFycmF5OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXMKICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCBhbmQgYHZhbHVlc2AgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbgogICAgICAgICAqIGJ5IHdoaWNoIHRoZXkncmUgY29tcGFyZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlQnlgLCB0aGlzIG1ldGhvZCBtdXRhdGVzIGBhcnJheWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIHJlbW92ZS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheSA9IFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMyB9LCB7ICd4JzogMSB9XTsKICAgICAgICAgKgogICAgICAgICAqIF8ucHVsbEFsbEJ5KGFycmF5LCBbeyAneCc6IDEgfSwgeyAneCc6IDMgfV0sICd4Jyk7CiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOwogICAgICAgICAqIC8vID0+IFt7ICd4JzogMiB9XQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHB1bGxBbGxCeShhcnJheSwgdmFsdWVzLCBpdGVyYXRlZSkgewogICAgICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGggJiYgdmFsdWVzICYmIHZhbHVlcy5sZW5ndGgpCiAgICAgICAgICAgID8gYmFzZVB1bGxBbGwoYXJyYXksIHZhbHVlcywgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKQogICAgICAgICAgICA6IGFycmF5OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5wdWxsQWxsYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaAogICAgICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgIHRvIGB2YWx1ZXNgLiBUaGUgY29tcGFyYXRvciBpcwogICAgICAgICAqIGludm9rZWQgd2l0aCB0d28gYXJndW1lbnRzOiAoYXJyVmFsLCBvdGhWYWwpLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5kaWZmZXJlbmNlV2l0aGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjYuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gcmVtb3ZlLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjb21wYXJhdG9yXSBUaGUgY29tcGFyYXRvciBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMywgJ3knOiA0IH0sIHsgJ3gnOiA1LCAneSc6IDYgfV07CiAgICAgICAgICoKICAgICAgICAgKiBfLnB1bGxBbGxXaXRoKGFycmF5LCBbeyAneCc6IDMsICd5JzogNCB9XSwgXy5pc0VxdWFsKTsKICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7CiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDUsICd5JzogNiB9XQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHB1bGxBbGxXaXRoKGFycmF5LCB2YWx1ZXMsIGNvbXBhcmF0b3IpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoICYmIHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VQdWxsQWxsKGFycmF5LCB2YWx1ZXMsIHVuZGVmaW5lZCQxLCBjb21wYXJhdG9yKQogICAgICAgICAgICA6IGFycmF5OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBlbGVtZW50cyBmcm9tIGBhcnJheWAgY29ycmVzcG9uZGluZyB0byBgaW5kZXhlc2AgYW5kIHJldHVybnMgYW4KICAgICAgICAgKiBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBgXy5hdGAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gW2luZGV4ZXNdIFRoZSBpbmRleGVzIG9mIGVsZW1lbnRzIHRvIHJlbW92ZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiByZW1vdmVkIGVsZW1lbnRzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbJ2EnLCAnYicsICdjJywgJ2QnXTsKICAgICAgICAgKiB2YXIgcHVsbGVkID0gXy5wdWxsQXQoYXJyYXksIFsxLCAzXSk7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2MnXQogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2cocHVsbGVkKTsKICAgICAgICAgKiAvLyA9PiBbJ2InLCAnZCddCiAgICAgICAgICovCiAgICAgICAgdmFyIHB1bGxBdCA9IGZsYXRSZXN0KGZ1bmN0aW9uKGFycmF5LCBpbmRleGVzKSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgICAgcmVzdWx0ID0gYmFzZUF0KGFycmF5LCBpbmRleGVzKTsKCiAgICAgICAgICBiYXNlUHVsbEF0KGFycmF5LCBhcnJheU1hcChpbmRleGVzLCBmdW5jdGlvbihpbmRleCkgewogICAgICAgICAgICByZXR1cm4gaXNJbmRleChpbmRleCwgbGVuZ3RoKSA/ICtpbmRleCA6IGluZGV4OwogICAgICAgICAgfSkuc29ydChjb21wYXJlQXNjZW5kaW5nKSk7CgogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSBgYXJyYXlgIHRoYXQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yCiAgICAgICAgICogYW5kIHJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZAogICAgICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVW5saWtlIGBfLmZpbHRlcmAsIHRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YC4gVXNlIGBfLnB1bGxgCiAgICAgICAgICogdG8gcHVsbCBlbGVtZW50cyBmcm9tIGFuIGFycmF5IGJ5IHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVtb3ZlZCBlbGVtZW50cy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDMsIDRdOwogICAgICAgICAqIHZhciBldmVucyA9IF8ucmVtb3ZlKGFycmF5LCBmdW5jdGlvbihuKSB7CiAgICAgICAgICogICByZXR1cm4gbiAlIDIgPT0gMDsKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTsKICAgICAgICAgKiAvLyA9PiBbMSwgM10KICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGV2ZW5zKTsKICAgICAgICAgKiAvLyA9PiBbMiwgNF0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZW1vdmUoYXJyYXksIHByZWRpY2F0ZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgICAgaWYgKCEoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSkgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgaW5kZXhlcyA9IFtdLAogICAgICAgICAgICAgIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKCiAgICAgICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpOwogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdOwogICAgICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgYXJyYXkpKSB7CiAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOwogICAgICAgICAgICAgIGluZGV4ZXMucHVzaChpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGJhc2VQdWxsQXQoYXJyYXksIGluZGV4ZXMpOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldmVyc2VzIGBhcnJheWAgc28gdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBiZWNvbWVzIHRoZSBsYXN0LCB0aGUgc2Vjb25kCiAgICAgICAgICogZWxlbWVudCBiZWNvbWVzIHRoZSBzZWNvbmQgdG8gbGFzdCwgYW5kIHNvIG9uLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYGFycmF5YCBhbmQgaXMgYmFzZWQgb24KICAgICAgICAgKiBbYEFycmF5I3JldmVyc2VgXShodHRwczovL21kbi5pby9BcnJheS9yZXZlcnNlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBtb2RpZnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTsKICAgICAgICAgKgogICAgICAgICAqIF8ucmV2ZXJzZShhcnJheSk7CiAgICAgICAgICogLy8gPT4gWzMsIDIsIDFdCiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnJheSk7CiAgICAgICAgICogLy8gPT4gWzMsIDIsIDFdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcmV2ZXJzZShhcnJheSkgewogICAgICAgICAgcmV0dXJuIGFycmF5ID09IG51bGwgPyBhcnJheSA6IG5hdGl2ZVJldmVyc2UuY2FsbChhcnJheSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCBmcm9tIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGluc3RlYWQgb2YKICAgICAgICAgKiBbYEFycmF5I3NsaWNlYF0oaHR0cHM6Ly9tZG4uaW8vQXJyYXkvc2xpY2UpIHRvIGVuc3VyZSBkZW5zZSBhcnJheXMgYXJlCiAgICAgICAgICogcmV0dXJuZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gc2xpY2UuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgcG9zaXRpb24uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtlbmQ9YXJyYXkubGVuZ3RoXSBUaGUgZW5kIHBvc2l0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzbGljZShhcnJheSwgc3RhcnQsIGVuZCkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGVuZCAmJiB0eXBlb2YgZW5kICE9ICdudW1iZXInICYmIGlzSXRlcmF0ZWVDYWxsKGFycmF5LCBzdGFydCwgZW5kKSkgewogICAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgICAgIGVuZCA9IGxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgewogICAgICAgICAgICBzdGFydCA9IHN0YXJ0ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyKHN0YXJ0KTsKICAgICAgICAgICAgZW5kID0gZW5kID09PSB1bmRlZmluZWQkMSA/IGxlbmd0aCA6IHRvSW50ZWdlcihlbmQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VTbGljZShhcnJheSwgc3RhcnQsIGVuZCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBVc2VzIGEgYmluYXJ5IHNlYXJjaCB0byBkZXRlcm1pbmUgdGhlIGxvd2VzdCBpbmRleCBhdCB3aGljaCBgdmFsdWVgCiAgICAgICAgICogc2hvdWxkIGJlIGluc2VydGVkIGludG8gYGFycmF5YCBpbiBvcmRlciB0byBtYWludGFpbiBpdHMgc29ydCBvcmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBhdCB3aGljaCBgdmFsdWVgIHNob3VsZCBiZSBpbnNlcnRlZAogICAgICAgICAqICBpbnRvIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uc29ydGVkSW5kZXgoWzMwLCA1MF0sIDQwKTsKICAgICAgICAgKiAvLyA9PiAxCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAKICAgICAgICAgKiB3aGljaCBpcyBpbnZva2VkIGZvciBgdmFsdWVgIGFuZCBlYWNoIGVsZW1lbnQgb2YgYGFycmF5YCB0byBjb21wdXRlIHRoZWlyCiAgICAgICAgICogc29ydCByYW5raW5nLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBzb3J0ZWQgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBldmFsdWF0ZS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiAgaW50byBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICd4JzogNCB9LCB7ICd4JzogNSB9XTsKICAgICAgICAgKgogICAgICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCBmdW5jdGlvbihvKSB7IHJldHVybiBvLng7IH0pOwogICAgICAgICAqIC8vID0+IDAKICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uc29ydGVkSW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpOwogICAgICAgICAqIC8vID0+IDAKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleEJ5KGFycmF5LCB2YWx1ZSwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiBiYXNlU29ydGVkSW5kZXhCeShhcnJheSwgdmFsdWUsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmluZGV4T2ZgIGV4Y2VwdCB0aGF0IGl0IHBlcmZvcm1zIGEgYmluYXJ5CiAgICAgICAgICogc2VhcmNoIG9uIGEgc29ydGVkIGBhcnJheWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uc29ydGVkSW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpOwogICAgICAgICAqIC8vID0+IDEKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzb3J0ZWRJbmRleE9mKGFycmF5LCB2YWx1ZSkgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICAgICAgaWYgKGxlbmd0aCkgewogICAgICAgICAgICB2YXIgaW5kZXggPSBiYXNlU29ydGVkSW5kZXgoYXJyYXksIHZhbHVlKTsKICAgICAgICAgICAgaWYgKGluZGV4IDwgbGVuZ3RoICYmIGVxKGFycmF5W2luZGV4XSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZEluZGV4YCBleGNlcHQgdGhhdCBpdCByZXR1cm5zIHRoZSBoaWdoZXN0CiAgICAgICAgICogaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQgaW50byBgYXJyYXlgIGluIG9yZGVyIHRvCiAgICAgICAgICogbWFpbnRhaW4gaXRzIHNvcnQgb3JkZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggYXQgd2hpY2ggYHZhbHVlYCBzaG91bGQgYmUgaW5zZXJ0ZWQKICAgICAgICAgKiAgaW50byBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnNvcnRlZExhc3RJbmRleChbNCwgNSwgNSwgNSwgNl0sIDUpOwogICAgICAgICAqIC8vID0+IDQKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXgoYXJyYXksIHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnNvcnRlZExhc3RJbmRleGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgCiAgICAgICAgICogd2hpY2ggaXMgaW52b2tlZCBmb3IgYHZhbHVlYCBhbmQgZWFjaCBlbGVtZW50IG9mIGBhcnJheWAgdG8gY29tcHV0ZSB0aGVpcgogICAgICAgICAqIHNvcnQgcmFua2luZy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgc29ydGVkIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZXZhbHVhdGUuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IGF0IHdoaWNoIGB2YWx1ZWAgc2hvdWxkIGJlIGluc2VydGVkCiAgICAgICAgICogIGludG8gYGFycmF5YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDQgfSwgeyAneCc6IDUgfV07CiAgICAgICAgICoKICAgICAgICAgKiBfLnNvcnRlZExhc3RJbmRleEJ5KG9iamVjdHMsIHsgJ3gnOiA0IH0sIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ueDsgfSk7CiAgICAgICAgICogLy8gPT4gMQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5zb3J0ZWRMYXN0SW5kZXhCeShvYmplY3RzLCB7ICd4JzogNCB9LCAneCcpOwogICAgICAgICAqIC8vID0+IDEKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhCeShhcnJheSwgdmFsdWUsIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZVNvcnRlZEluZGV4QnkoYXJyYXksIHZhbHVlLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMiksIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5sYXN0SW5kZXhPZmAgZXhjZXB0IHRoYXQgaXQgcGVyZm9ybXMgYSBiaW5hcnkKICAgICAgICAgKiBzZWFyY2ggb24gYSBzb3J0ZWQgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5zb3J0ZWRMYXN0SW5kZXhPZihbNCwgNSwgNSwgNSwgNl0sIDUpOwogICAgICAgICAqIC8vID0+IDMKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzb3J0ZWRMYXN0SW5kZXhPZihhcnJheSwgdmFsdWUpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIGlmIChsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gYmFzZVNvcnRlZEluZGV4KGFycmF5LCB2YWx1ZSwgdHJ1ZSkgLSAxOwogICAgICAgICAgICBpZiAoZXEoYXJyYXlbaW5kZXhdLCB2YWx1ZSkpIHsKICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW5pcWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkCiAgICAgICAgICogZm9yIHNvcnRlZCBhcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5zb3J0ZWRVbmlxKFsxLCAxLCAyXSk7CiAgICAgICAgICogLy8gPT4gWzEsIDJdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc29ydGVkVW5pcShhcnJheSkgewogICAgICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpCiAgICAgICAgICAgID8gYmFzZVNvcnRlZFVuaXEoYXJyYXkpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFCeWAgZXhjZXB0IHRoYXQgaXQncyBkZXNpZ25lZCBhbmQgb3B0aW1pemVkCiAgICAgICAgICogZm9yIHNvcnRlZCBhcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWVdIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnNvcnRlZFVuaXFCeShbMS4xLCAxLjIsIDIuMywgMi40XSwgTWF0aC5mbG9vcik7CiAgICAgICAgICogLy8gPT4gWzEuMSwgMi4zXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNvcnRlZFVuaXFCeShhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VTb3J0ZWRVbmlxKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFsbCBidXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udGFpbChbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IFsyLCAzXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRhaWwoYXJyYXkpIHsKICAgICAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgICAgIHJldHVybiBsZW5ndGggPyBiYXNlU2xpY2UoYXJyYXksIDEsIGxlbmd0aCkgOiBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBzbGljZSBvZiBgYXJyYXlgIHdpdGggYG5gIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGJlZ2lubmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byB0YWtlLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBzbGljZSBvZiBgYXJyYXlgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRha2UoWzEsIDIsIDNdKTsKICAgICAgICAgKiAvLyA9PiBbMV0KICAgICAgICAgKgogICAgICAgICAqIF8udGFrZShbMSwgMiwgM10sIDIpOwogICAgICAgICAqIC8vID0+IFsxLCAyXQogICAgICAgICAqCiAgICAgICAgICogXy50YWtlKFsxLCAyLCAzXSwgNSk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICoKICAgICAgICAgKiBfLnRha2UoWzEsIDIsIDNdLCAwKTsKICAgICAgICAgKiAvLyA9PiBbXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRha2UoYXJyYXksIG4sIGd1YXJkKSB7CiAgICAgICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIG4gPSAoZ3VhcmQgfHwgbiA9PT0gdW5kZWZpbmVkJDEpID8gMSA6IHRvSW50ZWdlcihuKTsKICAgICAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIDAsIG4gPCAwID8gMCA6IG4pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBgbmAgZWxlbWVudHMgdGFrZW4gZnJvbSB0aGUgZW5kLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj0xXSBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRha2UuCiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gWzNdCiAgICAgICAgICoKICAgICAgICAgKiBfLnRha2VSaWdodChbMSwgMiwgM10sIDIpOwogICAgICAgICAqIC8vID0+IFsyLCAzXQogICAgICAgICAqCiAgICAgICAgICogXy50YWtlUmlnaHQoWzEsIDIsIDNdLCA1KTsKICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAgICAgKgogICAgICAgICAqIF8udGFrZVJpZ2h0KFsxLCAyLCAzXSwgMCk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlUmlnaHQoYXJyYXksIG4sIGd1YXJkKSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgICAgICBpZiAoIWxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICB9CiAgICAgICAgICBuID0gKGd1YXJkIHx8IG4gPT09IHVuZGVmaW5lZCQxKSA/IDEgOiB0b0ludGVnZXIobik7CiAgICAgICAgICBuID0gbGVuZ3RoIC0gbjsKICAgICAgICAgIHJldHVybiBiYXNlU2xpY2UoYXJyYXksIG4gPCAwID8gMCA6IG4sIGxlbmd0aCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgc2xpY2Ugb2YgYGFycmF5YCB3aXRoIGVsZW1lbnRzIHRha2VuIGZyb20gdGhlIGVuZC4gRWxlbWVudHMgYXJlCiAgICAgICAgICogdGFrZW4gdW50aWwgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoCiAgICAgICAgICogdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4LCBhcnJheSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc2xpY2Ugb2YgYGFycmF5YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHVzZXJzID0gWwogICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IHRydWUgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FjdGl2ZSc6IGZhbHNlIH0KICAgICAgICAgKiBdOwogICAgICAgICAqCiAgICAgICAgICogXy50YWtlUmlnaHRXaGlsZSh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIHsgJ3VzZXInOiAncGViYmxlcycsICdhY3RpdmUnOiBmYWxzZSB9KTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ3BlYmJsZXMnXQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8udGFrZVJpZ2h0V2hpbGUodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnLCAncGViYmxlcyddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnRha2VSaWdodFdoaWxlKHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0YWtlUmlnaHRXaGlsZShhcnJheSwgcHJlZGljYXRlKSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICAgICAgPyBiYXNlV2hpbGUoYXJyYXksIGdldEl0ZXJhdGVlKHByZWRpY2F0ZSwgMyksIGZhbHNlLCB0cnVlKQogICAgICAgICAgICA6IFtdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHNsaWNlIG9mIGBhcnJheWAgd2l0aCBlbGVtZW50cyB0YWtlbiBmcm9tIHRoZSBiZWdpbm5pbmcuIEVsZW1lbnRzCiAgICAgICAgICogYXJlIHRha2VuIHVudGlsIGBwcmVkaWNhdGVgIHJldHVybnMgZmFsc2V5LiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aAogICAgICAgICAqIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleCwgYXJyYXkpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHNsaWNlIG9mIGBhcnJheWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhY3RpdmUnOiBmYWxzZSB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5JywgJ2ZyZWQnXQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgeyAndXNlcic6ICdiYXJuZXknLCAnYWN0aXZlJzogZmFsc2UgfSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8udGFrZVdoaWxlKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknLCAnZnJlZCddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnRha2VXaGlsZSh1c2VycywgJ2FjdGl2ZScpOwogICAgICAgICAqIC8vID0+IFtdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdGFrZVdoaWxlKGFycmF5LCBwcmVkaWNhdGUpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VXaGlsZShhcnJheSwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSkKICAgICAgICAgICAgOiBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcywgaW4gb3JkZXIsIGZyb20gYWxsIGdpdmVuIGFycmF5cyB1c2luZwogICAgICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBpbnNwZWN0LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGNvbWJpbmVkIHZhbHVlcy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy51bmlvbihbMl0sIFsxLCAyXSk7CiAgICAgICAgICogLy8gPT4gWzIsIDFdCiAgICAgICAgICovCiAgICAgICAgdmFyIHVuaW9uID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7CiAgICAgICAgICByZXR1cm4gYmFzZVVuaXEoYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdCwgdHJ1ZSkpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXMKICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgb2YgZWFjaCBgYXJyYXlzYCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5CiAgICAgICAgICogd2hpY2ggdW5pcXVlbmVzcyBpcyBjb21wdXRlZC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb20gdGhlIGZpcnN0CiAgICAgICAgICogYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6CiAgICAgICAgICogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgY29tYmluZWQgdmFsdWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnVuaW9uQnkoWzIuMV0sIFsxLjIsIDIuM10sIE1hdGguZmxvb3IpOwogICAgICAgICAqIC8vID0+IFsyLjEsIDEuMl0KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8udW5pb25CeShbeyAneCc6IDEgfV0sIFt7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTsKICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV0KICAgICAgICAgKi8KICAgICAgICB2YXIgdW5pb25CeSA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykgewogICAgICAgICAgdmFyIGl0ZXJhdGVlID0gbGFzdChhcnJheXMpOwogICAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGl0ZXJhdGVlKSkgewogICAgICAgICAgICBpdGVyYXRlZSA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaW9uYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaAogICAgICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlzYC4gUmVzdWx0IHZhbHVlcyBhcmUgY2hvc2VuIGZyb20KICAgICAgICAgKiB0aGUgZmlyc3QgYXJyYXkgaW4gd2hpY2ggdGhlIHZhbHVlIG9jY3Vycy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZAogICAgICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTsKICAgICAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTsKICAgICAgICAgKgogICAgICAgICAqIF8udW5pb25XaXRoKG9iamVjdHMsIG90aGVycywgXy5pc0VxdWFsKTsKICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDEgfV0KICAgICAgICAgKi8KICAgICAgICB2YXIgdW5pb25XaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7CiAgICAgICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTsKICAgICAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgcmV0dXJuIGJhc2VVbmlxKGJhc2VGbGF0dGVuKGFycmF5cywgMSwgaXNBcnJheUxpa2VPYmplY3QsIHRydWUpLCB1bmRlZmluZWQkMSwgY29tcGFyYXRvcik7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIGFuIGFycmF5LCB1c2luZwogICAgICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpbiB3aGljaCBvbmx5IHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVhY2ggZWxlbWVudAogICAgICAgICAqIGlzIGtlcHQuIFRoZSBvcmRlciBvZiByZXN1bHQgdmFsdWVzIGlzIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIKICAgICAgICAgKiBpbiB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy51bmlxKFsyLCAxLCAyXSk7CiAgICAgICAgICogLy8gPT4gWzIsIDFdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdW5pcShhcnJheSkgewogICAgICAgICAgcmV0dXJuIChhcnJheSAmJiBhcnJheS5sZW5ndGgpID8gYmFzZVVuaXEoYXJyYXkpIDogW107CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnVuaXFgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpcwogICAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBpbiBgYXJyYXlgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkgd2hpY2gKICAgICAgICAgKiB1bmlxdWVuZXNzIGlzIGNvbXB1dGVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkIGJ5IHRoZQogICAgICAgICAqIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDoKICAgICAgICAgKiAodmFsdWUpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnVuaXFCeShbMi4xLCAxLjIsIDIuM10sIE1hdGguZmxvb3IpOwogICAgICAgICAqIC8vID0+IFsyLjEsIDEuMl0KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8udW5pcUJ5KFt7ICd4JzogMSB9LCB7ICd4JzogMiB9LCB7ICd4JzogMSB9XSwgJ3gnKTsKICAgICAgICAgKiAvLyA9PiBbeyAneCc6IDEgfSwgeyAneCc6IDIgfV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB1bmlxQnkoYXJyYXksIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkgPyBiYXNlVW5pcShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKSA6IFtdOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51bmlxYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjb21wYXJhdG9yYCB3aGljaAogICAgICAgICAqIGlzIGludm9rZWQgdG8gY29tcGFyZSBlbGVtZW50cyBvZiBgYXJyYXlgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcwogICAgICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5LlRoZSBjb21wYXJhdG9yIGlzIGludm9rZWQKICAgICAgICAgKiB3aXRoIHR3byBhcmd1bWVudHM6IChhcnJWYWwsIG90aFZhbCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBkdXBsaWNhdGUgZnJlZSBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAneCc6IDEsICd5JzogMiB9LCB7ICd4JzogMiwgJ3knOiAxIH0sIHsgJ3gnOiAxLCAneSc6IDIgfV07CiAgICAgICAgICoKICAgICAgICAgKiBfLnVuaXFXaXRoKG9iamVjdHMsIF8uaXNFcXVhbCk7CiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHVuaXFXaXRoKGFycmF5LCBjb21wYXJhdG9yKSB7CiAgICAgICAgICBjb21wYXJhdG9yID0gdHlwZW9mIGNvbXBhcmF0b3IgPT0gJ2Z1bmN0aW9uJyA/IGNvbXBhcmF0b3IgOiB1bmRlZmluZWQkMTsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKSA/IGJhc2VVbmlxKGFycmF5LCB1bmRlZmluZWQkMSwgY29tcGFyYXRvcikgOiBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uemlwYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGFuIGFycmF5IG9mIGdyb3VwZWQKICAgICAgICAgKiBlbGVtZW50cyBhbmQgY3JlYXRlcyBhbiBhcnJheSByZWdyb3VwaW5nIHRoZSBlbGVtZW50cyB0byB0aGVpciBwcmUtemlwCiAgICAgICAgICogY29uZmlndXJhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAxLjIuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzIHRvIHByb2Nlc3MuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgcmVncm91cGVkIGVsZW1lbnRzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgemlwcGVkID0gXy56aXAoWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiBbWydhJywgMSwgdHJ1ZV0sIFsnYicsIDIsIGZhbHNlXV0KICAgICAgICAgKgogICAgICAgICAqIF8udW56aXAoemlwcGVkKTsKICAgICAgICAgKiAvLyA9PiBbWydhJywgJ2InXSwgWzEsIDJdLCBbdHJ1ZSwgZmFsc2VdXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHVuemlwKGFycmF5KSB7CiAgICAgICAgICBpZiAoIShhcnJheSAmJiBhcnJheS5sZW5ndGgpKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBsZW5ndGggPSAwOwogICAgICAgICAgYXJyYXkgPSBhcnJheUZpbHRlcihhcnJheSwgZnVuY3Rpb24oZ3JvdXApIHsKICAgICAgICAgICAgaWYgKGlzQXJyYXlMaWtlT2JqZWN0KGdyb3VwKSkgewogICAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChncm91cC5sZW5ndGgsIGxlbmd0aCk7CiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGJhc2VUaW1lcyhsZW5ndGgsIGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiBhcnJheU1hcChhcnJheSwgYmFzZVByb3BlcnR5KGluZGV4KSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8udW56aXBgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB0byBzcGVjaWZ5CiAgICAgICAgICogaG93IHJlZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZQogICAgICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy44LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgb2YgZ3JvdXBlZCBlbGVtZW50cyB0byBwcm9jZXNzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gdG8gY29tYmluZQogICAgICAgICAqICByZWdyb3VwZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIHJlZ3JvdXBlZCBlbGVtZW50cy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHppcHBlZCA9IF8uemlwKFsxLCAyXSwgWzEwLCAyMF0sIFsxMDAsIDIwMF0pOwogICAgICAgICAqIC8vID0+IFtbMSwgMTAsIDEwMF0sIFsyLCAyMCwgMjAwXV0KICAgICAgICAgKgogICAgICAgICAqIF8udW56aXBXaXRoKHppcHBlZCwgXy5hZGQpOwogICAgICAgICAqIC8vID0+IFszLCAzMCwgMzAwXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHVuemlwV2l0aChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICAgIGlmICghKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJlc3VsdCA9IHVuemlwKGFycmF5KTsKICAgICAgICAgIGlmIChpdGVyYXRlZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYXJyYXlNYXAocmVzdWx0LCBmdW5jdGlvbihncm91cCkgewogICAgICAgICAgICByZXR1cm4gYXBwbHkoaXRlcmF0ZWUsIHVuZGVmaW5lZCQxLCBncm91cCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgZXhjbHVkaW5nIGFsbCBnaXZlbiB2YWx1ZXMgdXNpbmcKICAgICAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKQogICAgICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucHVsbGAsIHRoaXMgbWV0aG9kIHJldHVybnMgYSBuZXcgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0gey4uLip9IFt2YWx1ZXNdIFRoZSB2YWx1ZXMgdG8gZXhjbHVkZS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCiAgICAgICAgICogQHNlZSBfLmRpZmZlcmVuY2UsIF8ueG9yCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ud2l0aG91dChbMiwgMSwgMiwgM10sIDEsIDIpOwogICAgICAgICAqIC8vID0+IFszXQogICAgICAgICAqLwogICAgICAgIHZhciB3aXRob3V0ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXksIHZhbHVlcykgewogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlT2JqZWN0KGFycmF5KQogICAgICAgICAgICA/IGJhc2VEaWZmZXJlbmNlKGFycmF5LCB2YWx1ZXMpCiAgICAgICAgICAgIDogW107CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdW5pcXVlIHZhbHVlcyB0aGF0IGlzIHRoZQogICAgICAgICAqIFtzeW1tZXRyaWMgZGlmZmVyZW5jZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU3ltbWV0cmljX2RpZmZlcmVuY2UpCiAgICAgICAgICogb2YgdGhlIGdpdmVuIGFycmF5cy4gVGhlIG9yZGVyIG9mIHJlc3VsdCB2YWx1ZXMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIKICAgICAgICAgKiB0aGV5IG9jY3VyIGluIHRoZSBhcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMi40LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgogICAgICAgICAqIEBzZWUgXy5kaWZmZXJlbmNlLCBfLndpdGhvdXQKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy54b3IoWzIsIDFdLCBbMiwgM10pOwogICAgICAgICAqIC8vID0+IFsxLCAzXQogICAgICAgICAqLwogICAgICAgIHZhciB4b3IgPSBiYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHsKICAgICAgICAgIHJldHVybiBiYXNlWG9yKGFycmF5RmlsdGVyKGFycmF5cywgaXNBcnJheUxpa2VPYmplY3QpKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGl0ZXJhdGVlYCB3aGljaCBpcwogICAgICAgICAqIGludm9rZWQgZm9yIGVhY2ggZWxlbWVudCBvZiBlYWNoIGBhcnJheXNgIHRvIGdlbmVyYXRlIHRoZSBjcml0ZXJpb24gYnkKICAgICAgICAgKiB3aGljaCBieSB3aGljaCB0aGV5J3JlIGNvbXBhcmVkLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcyBkZXRlcm1pbmVkCiAgICAgICAgICogYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUKICAgICAgICAgKiBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgYXJyYXkgb2YgZmlsdGVyZWQgdmFsdWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnhvckJ5KFsyLjEsIDEuMl0sIFsyLjMsIDMuNF0sIE1hdGguZmxvb3IpOwogICAgICAgICAqIC8vID0+IFsxLjIsIDMuNF0KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8ueG9yQnkoW3sgJ3gnOiAxIH1dLCBbeyAneCc6IDIgfSwgeyAneCc6IDEgfV0sICd4Jyk7CiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAyIH1dCiAgICAgICAgICovCiAgICAgICAgdmFyIHhvckJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7CiAgICAgICAgICB2YXIgaXRlcmF0ZWUgPSBsYXN0KGFycmF5cyk7CiAgICAgICAgICBpZiAoaXNBcnJheUxpa2VPYmplY3QoaXRlcmF0ZWUpKSB7CiAgICAgICAgICAgIGl0ZXJhdGVlID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZVhvcihhcnJheUZpbHRlcihhcnJheXMsIGlzQXJyYXlMaWtlT2JqZWN0KSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy54b3JgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGNvbXBhcmF0b3JgIHdoaWNoIGlzCiAgICAgICAgICogaW52b2tlZCB0byBjb21wYXJlIGVsZW1lbnRzIG9mIGBhcnJheXNgLiBUaGUgb3JkZXIgb2YgcmVzdWx0IHZhbHVlcyBpcwogICAgICAgICAqIGRldGVybWluZWQgYnkgdGhlIG9yZGVyIHRoZXkgb2NjdXIgaW4gdGhlIGFycmF5cy4gVGhlIGNvbXBhcmF0b3IgaXMgaW52b2tlZAogICAgICAgICAqIHdpdGggdHdvIGFyZ3VtZW50czogKGFyclZhbCwgb3RoVmFsKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7Li4uQXJyYXl9IFthcnJheXNdIFRoZSBhcnJheXMgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBmaWx0ZXJlZCB2YWx1ZXMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ3gnOiAxLCAneSc6IDIgfSwgeyAneCc6IDIsICd5JzogMSB9XTsKICAgICAgICAgKiB2YXIgb3RoZXJzID0gW3sgJ3gnOiAxLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMiB9XTsKICAgICAgICAgKgogICAgICAgICAqIF8ueG9yV2l0aChvYmplY3RzLCBvdGhlcnMsIF8uaXNFcXVhbCk7CiAgICAgICAgICogLy8gPT4gW3sgJ3gnOiAyLCAneSc6IDEgfSwgeyAneCc6IDEsICd5JzogMSB9XQogICAgICAgICAqLwogICAgICAgIHZhciB4b3JXaXRoID0gYmFzZVJlc3QoZnVuY3Rpb24oYXJyYXlzKSB7CiAgICAgICAgICB2YXIgY29tcGFyYXRvciA9IGxhc3QoYXJyYXlzKTsKICAgICAgICAgIGNvbXBhcmF0b3IgPSB0eXBlb2YgY29tcGFyYXRvciA9PSAnZnVuY3Rpb24nID8gY29tcGFyYXRvciA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgcmV0dXJuIGJhc2VYb3IoYXJyYXlGaWx0ZXIoYXJyYXlzLCBpc0FycmF5TGlrZU9iamVjdCksIHVuZGVmaW5lZCQxLCBjb21wYXJhdG9yKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBncm91cGVkIGVsZW1lbnRzLCB0aGUgZmlyc3Qgb2Ygd2hpY2ggY29udGFpbnMgdGhlCiAgICAgICAgICogZmlyc3QgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgdGhlIHNlY29uZCBvZiB3aGljaCBjb250YWlucyB0aGUKICAgICAgICAgKiBzZWNvbmQgZWxlbWVudHMgb2YgdGhlIGdpdmVuIGFycmF5cywgYW5kIHNvIG9uLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHsuLi5BcnJheX0gW2FycmF5c10gVGhlIGFycmF5cyB0byBwcm9jZXNzLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uemlwKFsnYScsICdiJ10sIFsxLCAyXSwgW3RydWUsIGZhbHNlXSk7CiAgICAgICAgICogLy8gPT4gW1snYScsIDEsIHRydWVdLCBbJ2InLCAyLCBmYWxzZV1dCiAgICAgICAgICovCiAgICAgICAgdmFyIHppcCA9IGJhc2VSZXN0KHVuemlwKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mcm9tUGFpcnNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgdHdvIGFycmF5cywKICAgICAgICAgKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjQuMAogICAgICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IFt2YWx1ZXM9W11dIFRoZSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy56aXBPYmplY3QoWydhJywgJ2InXSwgWzEsIDJdKTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB6aXBPYmplY3QocHJvcHMsIHZhbHVlcykgewogICAgICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYXNzaWduVmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy56aXBPYmplY3RgIGV4Y2VwdCB0aGF0IGl0IHN1cHBvcnRzIHByb3BlcnR5IHBhdGhzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3Byb3BzPVtdXSBUaGUgcHJvcGVydHkgaWRlbnRpZmllcnMuCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnppcE9iamVjdERlZXAoWydhLmJbMF0uYycsICdhLmJbMV0uZCddLCBbMSwgMl0pOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiB7ICdiJzogW3sgJ2MnOiAxIH0sIHsgJ2QnOiAyIH1dIH0gfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHppcE9iamVjdERlZXAocHJvcHMsIHZhbHVlcykgewogICAgICAgICAgcmV0dXJuIGJhc2VaaXBPYmplY3QocHJvcHMgfHwgW10sIHZhbHVlcyB8fCBbXSwgYmFzZVNldCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnppcGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHRvIHNwZWNpZnkKICAgICAgICAgKiBob3cgZ3JvdXBlZCB2YWx1ZXMgc2hvdWxkIGJlIGNvbWJpbmVkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRoZQogICAgICAgICAqIGVsZW1lbnRzIG9mIGVhY2ggZ3JvdXA6ICguLi5ncm91cCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy44LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIHByb2Nlc3MuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiB0byBjb21iaW5lCiAgICAgICAgICogIGdyb3VwZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uemlwV2l0aChbMSwgMl0sIFsxMCwgMjBdLCBbMTAwLCAyMDBdLCBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgICAgICogICByZXR1cm4gYSArIGIgKyBjOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IFsxMTEsIDIyMl0KICAgICAgICAgKi8KICAgICAgICB2YXIgemlwV2l0aCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFycmF5cykgewogICAgICAgICAgdmFyIGxlbmd0aCA9IGFycmF5cy5sZW5ndGgsCiAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBsZW5ndGggPiAxID8gYXJyYXlzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkJDE7CgogICAgICAgICAgaXRlcmF0ZWUgPSB0eXBlb2YgaXRlcmF0ZWUgPT0gJ2Z1bmN0aW9uJyA/IChhcnJheXMucG9wKCksIGl0ZXJhdGVlKSA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgcmV0dXJuIHVuemlwV2l0aChhcnJheXMsIGl0ZXJhdGVlKTsKICAgICAgICB9KTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZSB0aGF0IHdyYXBzIGB2YWx1ZWAgd2l0aCBleHBsaWNpdCBtZXRob2QKICAgICAgICAgKiBjaGFpbiBzZXF1ZW5jZXMgZW5hYmxlZC4gVGhlIHJlc3VsdCBvZiBzdWNoIHNlcXVlbmNlcyBtdXN0IGJlIHVud3JhcHBlZAogICAgICAgICAqIHdpdGggYF8jdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDEuMy4wCiAgICAgICAgICogQGNhdGVnb3J5IFNlcQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2UuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIHZhciB5b3VuZ2VzdCA9IF8KICAgICAgICAgKiAgIC5jaGFpbih1c2VycykKICAgICAgICAgKiAgIC5zb3J0QnkoJ2FnZScpCiAgICAgICAgICogICAubWFwKGZ1bmN0aW9uKG8pIHsKICAgICAgICAgKiAgICAgcmV0dXJuIG8udXNlciArICcgaXMgJyArIG8uYWdlOwogICAgICAgICAqICAgfSkKICAgICAgICAgKiAgIC5oZWFkKCkKICAgICAgICAgKiAgIC52YWx1ZSgpOwogICAgICAgICAqIC8vID0+ICdwZWJibGVzIGlzIDEnCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2hhaW4odmFsdWUpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBsb2Rhc2godmFsdWUpOwogICAgICAgICAgcmVzdWx0Ll9fY2hhaW5fXyA9IHRydWU7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaW52b2tlcyBgaW50ZXJjZXB0b3JgIGFuZCByZXR1cm5zIGB2YWx1ZWAuIFRoZSBpbnRlcmNlcHRvcgogICAgICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7ICh2YWx1ZSkuIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvCiAgICAgICAgICogInRhcCBpbnRvIiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZSBpbiBvcmRlciB0byBtb2RpZnkgaW50ZXJtZWRpYXRlIHJlc3VsdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU2VxCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcHJvdmlkZSB0byBgaW50ZXJjZXB0b3JgLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGludGVyY2VwdG9yIFRoZSBmdW5jdGlvbiB0byBpbnZva2UuCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXyhbMSwgMiwgM10pCiAgICAgICAgICogIC50YXAoZnVuY3Rpb24oYXJyYXkpIHsKICAgICAgICAgKiAgICAvLyBNdXRhdGUgaW5wdXQgYXJyYXkuCiAgICAgICAgICogICAgYXJyYXkucG9wKCk7CiAgICAgICAgICogIH0pCiAgICAgICAgICogIC5yZXZlcnNlKCkKICAgICAgICAgKiAgLnZhbHVlKCk7CiAgICAgICAgICogLy8gPT4gWzIsIDFdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdGFwKHZhbHVlLCBpbnRlcmNlcHRvcikgewogICAgICAgICAgaW50ZXJjZXB0b3IodmFsdWUpOwogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy50YXBgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIHJlc3VsdCBvZiBgaW50ZXJjZXB0b3JgLgogICAgICAgICAqIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvICJwYXNzIHRocnUiIHZhbHVlcyByZXBsYWNpbmcgaW50ZXJtZWRpYXRlCiAgICAgICAgICogcmVzdWx0cyBpbiBhIG1ldGhvZCBjaGFpbiBzZXF1ZW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTZXEKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm92aWRlIHRvIGBpbnRlcmNlcHRvcmAuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaW50ZXJjZXB0b3IgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzdWx0IG9mIGBpbnRlcmNlcHRvcmAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8oJyAgYWJjICAnKQogICAgICAgICAqICAuY2hhaW4oKQogICAgICAgICAqICAudHJpbSgpCiAgICAgICAgICogIC50aHJ1KGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICogICAgcmV0dXJuIFt2YWx1ZV07CiAgICAgICAgICogIH0pCiAgICAgICAgICogIC52YWx1ZSgpOwogICAgICAgICAqIC8vID0+IFsnYWJjJ10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0aHJ1KHZhbHVlLCBpbnRlcmNlcHRvcikgewogICAgICAgICAgcmV0dXJuIGludGVyY2VwdG9yKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8uYXRgLgogICAgICAgICAqCiAgICAgICAgICogQG5hbWUgYXQKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAxLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTZXEKICAgICAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBwaWNrLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9OwogICAgICAgICAqCiAgICAgICAgICogXyhvYmplY3QpLmF0KFsnYVswXS5iLmMnLCAnYVsxXSddKS52YWx1ZSgpOwogICAgICAgICAqIC8vID0+IFszLCA0XQogICAgICAgICAqLwogICAgICAgIHZhciB3cmFwcGVyQXQgPSBmbGF0UmVzdChmdW5jdGlvbihwYXRocykgewogICAgICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCwKICAgICAgICAgICAgICBzdGFydCA9IGxlbmd0aCA/IHBhdGhzWzBdIDogMCwKICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX18sCiAgICAgICAgICAgICAgaW50ZXJjZXB0b3IgPSBmdW5jdGlvbihvYmplY3QpIHsgcmV0dXJuIGJhc2VBdChvYmplY3QsIHBhdGhzKTsgfTsKCiAgICAgICAgICBpZiAobGVuZ3RoID4gMSB8fCB0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCB8fAogICAgICAgICAgICAgICEodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikgfHwgIWlzSW5kZXgoc3RhcnQpKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnRocnUoaW50ZXJjZXB0b3IpOwogICAgICAgICAgfQogICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZShzdGFydCwgK3N0YXJ0ICsgKGxlbmd0aCA/IDEgOiAwKSk7CiAgICAgICAgICB2YWx1ZS5fX2FjdGlvbnNfXy5wdXNoKHsKICAgICAgICAgICAgJ2Z1bmMnOiB0aHJ1LAogICAgICAgICAgICAnYXJncyc6IFtpbnRlcmNlcHRvcl0sCiAgICAgICAgICAgICd0aGlzQXJnJzogdW5kZWZpbmVkJDEKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHZhbHVlLCB0aGlzLl9fY2hhaW5fXykudGhydShmdW5jdGlvbihhcnJheSkgewogICAgICAgICAgICBpZiAobGVuZ3RoICYmICFhcnJheS5sZW5ndGgpIHsKICAgICAgICAgICAgICBhcnJheS5wdXNoKHVuZGVmaW5lZCQxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXJyYXk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGBsb2Rhc2hgIHdyYXBwZXIgaW5zdGFuY2Ugd2l0aCBleHBsaWNpdCBtZXRob2QgY2hhaW4gc2VxdWVuY2VzIGVuYWJsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAbmFtZSBjaGFpbgogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IFNlcQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiAvLyBBIHNlcXVlbmNlIHdpdGhvdXQgZXhwbGljaXQgY2hhaW5pbmcuCiAgICAgICAgICogXyh1c2VycykuaGVhZCgpOwogICAgICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0KICAgICAgICAgKgogICAgICAgICAqIC8vIEEgc2VxdWVuY2Ugd2l0aCBleHBsaWNpdCBjaGFpbmluZy4KICAgICAgICAgKiBfKHVzZXJzKQogICAgICAgICAqICAgLmNoYWluKCkKICAgICAgICAgKiAgIC5oZWFkKCkKICAgICAgICAgKiAgIC5waWNrKCd1c2VyJykKICAgICAgICAgKiAgIC52YWx1ZSgpOwogICAgICAgICAqIC8vID0+IHsgJ3VzZXInOiAnYmFybmV5JyB9CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gd3JhcHBlckNoYWluKCkgewogICAgICAgICAgcmV0dXJuIGNoYWluKHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgdGhlIGNoYWluIHNlcXVlbmNlIGFuZCByZXR1cm5zIHRoZSB3cmFwcGVkIHJlc3VsdC4KICAgICAgICAgKgogICAgICAgICAqIEBuYW1lIGNvbW1pdAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMi4wCiAgICAgICAgICogQGNhdGVnb3J5IFNlcQogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbMSwgMl07CiAgICAgICAgICogdmFyIHdyYXBwZWQgPSBfKGFycmF5KS5wdXNoKDMpOwogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOwogICAgICAgICAqIC8vID0+IFsxLCAyXQogICAgICAgICAqCiAgICAgICAgICogd3JhcHBlZCA9IHdyYXBwZWQuY29tbWl0KCk7CiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOwogICAgICAgICAqIC8vID0+IFsxLCAyLCAzXQogICAgICAgICAqCiAgICAgICAgICogd3JhcHBlZC5sYXN0KCk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2coYXJyYXkpOwogICAgICAgICAqIC8vID0+IFsxLCAyLCAzXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHdyYXBwZXJDb21taXQoKSB7CiAgICAgICAgICByZXR1cm4gbmV3IExvZGFzaFdyYXBwZXIodGhpcy52YWx1ZSgpLCB0aGlzLl9fY2hhaW5fXyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBuZXh0IHZhbHVlIG9uIGEgd3JhcHBlZCBvYmplY3QgZm9sbG93aW5nIHRoZQogICAgICAgICAqIFtpdGVyYXRvciBwcm90b2NvbF0oaHR0cHM6Ly9tZG4uaW8vaXRlcmF0aW9uX3Byb3RvY29scyNpdGVyYXRvcikuCiAgICAgICAgICoKICAgICAgICAgKiBAbmFtZSBuZXh0CiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU2VxCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV4dCBpdGVyYXRvciB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7CiAgICAgICAgICoKICAgICAgICAgKiB3cmFwcGVkLm5leHQoKTsKICAgICAgICAgKiAvLyA9PiB7ICdkb25lJzogZmFsc2UsICd2YWx1ZSc6IDEgfQogICAgICAgICAqCiAgICAgICAgICogd3JhcHBlZC5uZXh0KCk7CiAgICAgICAgICogLy8gPT4geyAnZG9uZSc6IGZhbHNlLCAndmFsdWUnOiAyIH0KICAgICAgICAgKgogICAgICAgICAqIHdyYXBwZWQubmV4dCgpOwogICAgICAgICAqIC8vID0+IHsgJ2RvbmUnOiB0cnVlLCAndmFsdWUnOiB1bmRlZmluZWQgfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHdyYXBwZXJOZXh0KCkgewogICAgICAgICAgaWYgKHRoaXMuX192YWx1ZXNfXyA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgdGhpcy5fX3ZhbHVlc19fID0gdG9BcnJheSh0aGlzLnZhbHVlKCkpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGRvbmUgPSB0aGlzLl9faW5kZXhfXyA+PSB0aGlzLl9fdmFsdWVzX18ubGVuZ3RoLAogICAgICAgICAgICAgIHZhbHVlID0gZG9uZSA/IHVuZGVmaW5lZCQxIDogdGhpcy5fX3ZhbHVlc19fW3RoaXMuX19pbmRleF9fKytdOwoKICAgICAgICAgIHJldHVybiB7ICdkb25lJzogZG9uZSwgJ3ZhbHVlJzogdmFsdWUgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhlIHdyYXBwZXIgdG8gYmUgaXRlcmFibGUuCiAgICAgICAgICoKICAgICAgICAgKiBAbmFtZSBTeW1ib2wuaXRlcmF0b3IKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTZXEKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSB3cmFwcGVyIG9iamVjdC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHdyYXBwZWQgPSBfKFsxLCAyXSk7CiAgICAgICAgICoKICAgICAgICAgKiB3cmFwcGVkW1N5bWJvbC5pdGVyYXRvcl0oKSA9PT0gd3JhcHBlZDsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBBcnJheS5mcm9tKHdyYXBwZWQpOwogICAgICAgICAqIC8vID0+IFsxLCAyXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHdyYXBwZXJUb0l0ZXJhdG9yKCkgewogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgdGhlIGNoYWluIHNlcXVlbmNlIHBsYW50aW5nIGB2YWx1ZWAgYXMgdGhlIHdyYXBwZWQgdmFsdWUuCiAgICAgICAgICoKICAgICAgICAgKiBAbmFtZSBwbGFudAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMi4wCiAgICAgICAgICogQGNhdGVnb3J5IFNlcQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHBsYW50LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBgbG9kYXNoYCB3cmFwcGVyIGluc3RhbmNlLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikgewogICAgICAgICAqICAgcmV0dXJuIG4gKiBuOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciB3cmFwcGVkID0gXyhbMSwgMl0pLm1hcChzcXVhcmUpOwogICAgICAgICAqIHZhciBvdGhlciA9IHdyYXBwZWQucGxhbnQoWzMsIDRdKTsKICAgICAgICAgKgogICAgICAgICAqIG90aGVyLnZhbHVlKCk7CiAgICAgICAgICogLy8gPT4gWzksIDE2XQogICAgICAgICAqCiAgICAgICAgICogd3JhcHBlZC52YWx1ZSgpOwogICAgICAgICAqIC8vID0+IFsxLCA0XQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHdyYXBwZXJQbGFudCh2YWx1ZSkgewogICAgICAgICAgdmFyIHJlc3VsdCwKICAgICAgICAgICAgICBwYXJlbnQgPSB0aGlzOwoKICAgICAgICAgIHdoaWxlIChwYXJlbnQgaW5zdGFuY2VvZiBiYXNlTG9kYXNoKSB7CiAgICAgICAgICAgIHZhciBjbG9uZSA9IHdyYXBwZXJDbG9uZShwYXJlbnQpOwogICAgICAgICAgICBjbG9uZS5fX2luZGV4X18gPSAwOwogICAgICAgICAgICBjbG9uZS5fX3ZhbHVlc19fID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IGNsb25lOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHJlc3VsdCA9IGNsb25lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IGNsb25lOwogICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuX193cmFwcGVkX187CiAgICAgICAgICB9CiAgICAgICAgICBwcmV2aW91cy5fX3dyYXBwZWRfXyA9IHZhbHVlOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIHRoZSB3cmFwcGVyIHZlcnNpb24gb2YgYF8ucmV2ZXJzZWAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyB0aGUgd3JhcHBlZCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBuYW1lIHJldmVyc2UKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBTZXEKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgYGxvZGFzaGAgd3JhcHBlciBpbnN0YW5jZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFycmF5ID0gWzEsIDIsIDNdOwogICAgICAgICAqCiAgICAgICAgICogXyhhcnJheSkucmV2ZXJzZSgpLnZhbHVlKCkKICAgICAgICAgKiAvLyA9PiBbMywgMiwgMV0KICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5KTsKICAgICAgICAgKiAvLyA9PiBbMywgMiwgMV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB3cmFwcGVyUmV2ZXJzZSgpIHsKICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX193cmFwcGVkX187CiAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5V3JhcHBlcikgewogICAgICAgICAgICB2YXIgd3JhcHBlZCA9IHZhbHVlOwogICAgICAgICAgICBpZiAodGhpcy5fX2FjdGlvbnNfXy5sZW5ndGgpIHsKICAgICAgICAgICAgICB3cmFwcGVkID0gbmV3IExhenlXcmFwcGVyKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHdyYXBwZWQgPSB3cmFwcGVkLnJldmVyc2UoKTsKICAgICAgICAgICAgd3JhcHBlZC5fX2FjdGlvbnNfXy5wdXNoKHsKICAgICAgICAgICAgICAnZnVuYyc6IHRocnUsCiAgICAgICAgICAgICAgJ2FyZ3MnOiBbcmV2ZXJzZV0sCiAgICAgICAgICAgICAgJ3RoaXNBcmcnOiB1bmRlZmluZWQkMQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHdyYXBwZWQsIHRoaXMuX19jaGFpbl9fKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLnRocnUocmV2ZXJzZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlcyB0aGUgY2hhaW4gc2VxdWVuY2UgdG8gcmVzb2x2ZSB0aGUgdW53cmFwcGVkIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQG5hbWUgdmFsdWUKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBhbGlhcyB0b0pTT04sIHZhbHVlT2YKICAgICAgICAgKiBAY2F0ZWdvcnkgU2VxCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc29sdmVkIHVud3JhcHBlZCB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXyhbMSwgMiwgM10pLnZhbHVlKCk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gd3JhcHBlclZhbHVlKCkgewogICAgICAgICAgcmV0dXJuIGJhc2VXcmFwcGVyVmFsdWUodGhpcy5fX3dyYXBwZWRfXywgdGhpcy5fX2FjdGlvbnNfXyk7CiAgICAgICAgfQoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIGtleXMgZ2VuZXJhdGVkIGZyb20gdGhlIHJlc3VsdHMgb2YgcnVubmluZwogICAgICAgICAqIGVhY2ggZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLiBUaGUgY29ycmVzcG9uZGluZyB2YWx1ZSBvZgogICAgICAgICAqIGVhY2gga2V5IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGtleSB3YXMgcmV0dXJuZWQgYnkgYGl0ZXJhdGVlYC4gVGhlCiAgICAgICAgICogaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjUuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5jb3VudEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7CiAgICAgICAgICogLy8gPT4geyAnNCc6IDEsICc2JzogMiB9CiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmNvdW50QnkoWydvbmUnLCAndHdvJywgJ3RocmVlJ10sICdsZW5ndGgnKTsKICAgICAgICAgKiAvLyA9PiB7ICczJzogMiwgJzUnOiAxIH0KICAgICAgICAgKi8KICAgICAgICB2YXIgY291bnRCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7CiAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkuY2FsbChyZXN1bHQsIGtleSkpIHsKICAgICAgICAgICAgKytyZXN1bHRba2V5XTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGJhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgKiphbGwqKiBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAuCiAgICAgICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIGZhbHNleS4gVGhlIHByZWRpY2F0ZSBpcwogICAgICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB0cnVlYCBmb3IKICAgICAgICAgKiBbZW1wdHkgY29sbGVjdGlvbnNdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0VtcHR5X3NldCkgYmVjYXVzZQogICAgICAgICAqIFtldmVyeXRoaW5nIGlzIHRydWVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1ZhY3VvdXNfdHJ1dGgpIG9mCiAgICAgICAgICogZWxlbWVudHMgb2YgZW1wdHkgY29sbGVjdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYWxsIGVsZW1lbnRzIHBhc3MgdGhlIHByZWRpY2F0ZSBjaGVjaywKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmV2ZXJ5KFt0cnVlLCAxLCBudWxsLCAneWVzJ10sIEJvb2xlYW4pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IGZhbHNlIH0KICAgICAgICAgKiBdOwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmV2ZXJ5KHVzZXJzLCB7ICd1c2VyJzogJ2Jhcm5leScsICdhY3RpdmUnOiBmYWxzZSB9KTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZXZlcnkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmV2ZXJ5KHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBldmVyeShjb2xsZWN0aW9uLCBwcmVkaWNhdGUsIGd1YXJkKSB7CiAgICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUV2ZXJ5IDogYmFzZUV2ZXJ5OwogICAgICAgICAgaWYgKGd1YXJkICYmIGlzSXRlcmF0ZWVDYWxsKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZ3VhcmQpKSB7CiAgICAgICAgICAgIHByZWRpY2F0ZSA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50cwogICAgICAgICAqIGBwcmVkaWNhdGVgIHJldHVybnMgdHJ1dGh5IGZvci4gVGhlIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhyZWUKICAgICAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBVbmxpa2UgYF8ucmVtb3ZlYCwgdGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS4KICAgICAgICAgKiBAc2VlIF8ucmVqZWN0CiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ10KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydiYXJuZXknXQogICAgICAgICAqCiAgICAgICAgICogLy8gQ29tYmluaW5nIHNldmVyYWwgcHJlZGljYXRlcyB1c2luZyBgXy5vdmVyRXZlcnlgIG9yIGBfLm92ZXJTb21lYC4KICAgICAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbeyAnYWdlJzogMzYgfSwgWydhZ2UnLCA0MF1dKSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJywgJ2Jhcm5leSddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkgewogICAgICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlGaWx0ZXIgOiBiYXNlRmlsdGVyOwogICAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIHRoZSBmaXJzdCBlbGVtZW50CiAgICAgICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZQogICAgICAgICAqIGFyZ3VtZW50czogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIG1hdGNoZWQgZWxlbWVudCwgZWxzZSBgdW5kZWZpbmVkYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHVzZXJzID0gWwogICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiBfLmZpbmQodXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlIDwgNDA7IH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2Jhcm5leScKICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5maW5kKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogdHJ1ZSB9KTsKICAgICAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICAgICAqIC8vID0+IG9iamVjdCBmb3IgJ2ZyZWQnCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmZpbmQodXNlcnMsICdhY3RpdmUnKTsKICAgICAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknCiAgICAgICAgICovCiAgICAgICAgdmFyIGZpbmQgPSBjcmVhdGVGaW5kKGZpbmRJbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZgogICAgICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMi4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PWNvbGxlY3Rpb24ubGVuZ3RoLTFdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmZpbmRMYXN0KFsxLCAyLCAzLCA0XSwgZnVuY3Rpb24obikgewogICAgICAgICAqICAgcmV0dXJuIG4gJSAyID09IDE7CiAgICAgICAgICogfSk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqLwogICAgICAgIHZhciBmaW5kTGFzdCA9IGNyZWF0ZUZpbmQoZmluZExhc3RJbmRleCk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmbGF0dGVuZWQgYXJyYXkgb2YgdmFsdWVzIGJ5IHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYAogICAgICAgICAqIHRocnUgYGl0ZXJhdGVlYCBhbmQgZmxhdHRlbmluZyB0aGUgbWFwcGVkIHJlc3VsdHMuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkCiAgICAgICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gZHVwbGljYXRlKG4pIHsKICAgICAgICAgKiAgIHJldHVybiBbbiwgbl07CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXy5mbGF0TWFwKFsxLCAyXSwgZHVwbGljYXRlKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMSwgMiwgMl0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmbGF0TWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgMSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZQogICAgICAgICAqIG1hcHBlZCByZXN1bHRzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuNy4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmxhdHRlbmVkIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBkdXBsaWNhdGUobikgewogICAgICAgICAqICAgcmV0dXJuIFtbW24sIG5dXV07CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXy5mbGF0TWFwRGVlcChbMSwgMl0sIGR1cGxpY2F0ZSk7CiAgICAgICAgICogLy8gPT4gWzEsIDEsIDIsIDJdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZmxhdE1hcERlZXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiBiYXNlRmxhdHRlbihtYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpLCBJTkZJTklUWSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsYXRNYXBgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGZsYXR0ZW5zIHRoZQogICAgICAgICAqIG1hcHBlZCByZXN1bHRzIHVwIHRvIGBkZXB0aGAgdGltZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC43LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2RlcHRoPTFdIFRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmbGF0dGVuZWQgYXJyYXkuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIGR1cGxpY2F0ZShuKSB7CiAgICAgICAgICogICByZXR1cm4gW1tbbiwgbl1dXTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBfLmZsYXRNYXBEZXB0aChbMSwgMl0sIGR1cGxpY2F0ZSwgMik7CiAgICAgICAgICogLy8gPT4gW1sxLCAxXSwgWzIsIDJdXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGZsYXRNYXBEZXB0aChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgZGVwdGgpIHsKICAgICAgICAgIGRlcHRoID0gZGVwdGggPT09IHVuZGVmaW5lZCQxID8gMSA6IHRvSW50ZWdlcihkZXB0aCk7CiAgICAgICAgICByZXR1cm4gYmFzZUZsYXR0ZW4obWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSwgZGVwdGgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LgogICAgICAgICAqIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgICAgICogSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0IGl0ZXJhdGlvbiBlYXJseSBieSBleHBsaWNpdGx5IHJldHVybmluZyBgZmFsc2VgLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIEFzIHdpdGggb3RoZXIgIkNvbGxlY3Rpb25zIiBtZXRob2RzLCBvYmplY3RzIHdpdGggYSAibGVuZ3RoIgogICAgICAgICAqIHByb3BlcnR5IGFyZSBpdGVyYXRlZCBsaWtlIGFycmF5cy4gVG8gYXZvaWQgdGhpcyBiZWhhdmlvciB1c2UgYF8uZm9ySW5gCiAgICAgICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBhbGlhcyBlYWNoCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuCiAgICAgICAgICogQHNlZSBfLmZvckVhY2hSaWdodAogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmZvckVhY2goWzEsIDJdLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAqICAgY29uc29sZS5sb2codmFsdWUpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IExvZ3MgYDFgIHRoZW4gYDJgLgogICAgICAgICAqCiAgICAgICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAqICAgY29uc29sZS5sb2coa2V5KTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmb3JFYWNoKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7CiAgICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUVhY2ggOiBiYXNlRWFjaDsKICAgICAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZvckVhY2hgIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgZWxlbWVudHMgb2YKICAgICAgICAgKiBgY29sbGVjdGlvbmAgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuMC4wCiAgICAgICAgICogQGFsaWFzIGVhY2hSaWdodAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheXxPYmplY3R9IFJldHVybnMgYGNvbGxlY3Rpb25gLgogICAgICAgICAqIEBzZWUgXy5mb3JFYWNoCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZm9yRWFjaFJpZ2h0KFsxLCAyXSwgZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiAvLyA9PiBMb2dzIGAyYCB0aGVuIGAxYC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmb3JFYWNoUmlnaHQoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5RWFjaFJpZ2h0IDogYmFzZUVhY2hSaWdodDsKICAgICAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcKICAgICAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIG9yZGVyIG9mIGdyb3VwZWQgdmFsdWVzCiAgICAgICAgICogaXMgZGV0ZXJtaW5lZCBieSB0aGUgb3JkZXIgdGhleSBvY2N1ciBpbiBgY29sbGVjdGlvbmAuIFRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgICogdmFsdWUgb2YgZWFjaCBrZXkgaXMgYW4gYXJyYXkgb2YgZWxlbWVudHMgcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgdGhlCiAgICAgICAgICoga2V5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgdG8gdHJhbnNmb3JtIGtleXMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29tcG9zZWQgYWdncmVnYXRlIG9iamVjdC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5ncm91cEJ5KFs2LjEsIDQuMiwgNi4zXSwgTWF0aC5mbG9vcik7CiAgICAgICAgICogLy8gPT4geyAnNCc6IFs0LjJdLCAnNic6IFs2LjEsIDYuM10gfQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5ncm91cEJ5KFsnb25lJywgJ3R3bycsICd0aHJlZSddLCAnbGVuZ3RoJyk7CiAgICAgICAgICogLy8gPT4geyAnMyc6IFsnb25lJywgJ3R3byddLCAnNSc6IFsndGhyZWUnXSB9CiAgICAgICAgICovCiAgICAgICAgdmFyIGdyb3VwQnkgPSBjcmVhdGVBZ2dyZWdhdG9yKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgewogICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCBrZXkpKSB7CiAgICAgICAgICAgIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgYmFzZUFzc2lnblZhbHVlKHJlc3VsdCwga2V5LCBbdmFsdWVdKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gYGNvbGxlY3Rpb25gLiBJZiBgY29sbGVjdGlvbmAgaXMgYSBzdHJpbmcsIGl0J3MKICAgICAgICAgKiBjaGVja2VkIGZvciBhIHN1YnN0cmluZyBvZiBgdmFsdWVgLCBvdGhlcndpc2UKICAgICAgICAgKiBbYFNhbWVWYWx1ZVplcm9gXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1zYW1ldmFsdWV6ZXJvKQogICAgICAgICAqIGlzIHVzZWQgZm9yIGVxdWFsaXR5IGNvbXBhcmlzb25zLiBJZiBgZnJvbUluZGV4YCBpcyBuZWdhdGl2ZSwgaXQncyB1c2VkIGFzCiAgICAgICAgICogdGhlIG9mZnNldCBmcm9tIHRoZSBlbmQgb2YgYGNvbGxlY3Rpb25gLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZvdW5kLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaW5jbHVkZXMoWzEsIDIsIDNdLCAxKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmluY2x1ZGVzKFsxLCAyLCAzXSwgMSwgMik7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaW5jbHVkZXMoeyAnYSc6IDEsICdiJzogMiB9LCAxKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmluY2x1ZGVzKCdhYmNkJywgJ2JjJyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGluY2x1ZGVzKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgsIGd1YXJkKSB7CiAgICAgICAgICBjb2xsZWN0aW9uID0gaXNBcnJheUxpa2UoY29sbGVjdGlvbikgPyBjb2xsZWN0aW9uIDogdmFsdWVzKGNvbGxlY3Rpb24pOwogICAgICAgICAgZnJvbUluZGV4ID0gKGZyb21JbmRleCAmJiAhZ3VhcmQpID8gdG9JbnRlZ2VyKGZyb21JbmRleCkgOiAwOwoKICAgICAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKICAgICAgICAgIGlmIChmcm9tSW5kZXggPCAwKSB7CiAgICAgICAgICAgIGZyb21JbmRleCA9IG5hdGl2ZU1heChsZW5ndGggKyBmcm9tSW5kZXgsIDApOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pCiAgICAgICAgICAgID8gKGZyb21JbmRleCA8PSBsZW5ndGggJiYgY29sbGVjdGlvbi5pbmRleE9mKHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpCiAgICAgICAgICAgIDogKCEhbGVuZ3RoICYmIGJhc2VJbmRleE9mKGNvbGxlY3Rpb24sIHZhbHVlLCBmcm9tSW5kZXgpID4gLTEpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogSW52b2tlcyB0aGUgbWV0aG9kIGF0IGBwYXRoYCBvZiBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gLCByZXR1cm5pbmcKICAgICAgICAgKiBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZiBlYWNoIGludm9rZWQgbWV0aG9kLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMKICAgICAgICAgKiBhcmUgcHJvdmlkZWQgdG8gZWFjaCBpbnZva2VkIG1ldGhvZC4gSWYgYHBhdGhgIGlzIGEgZnVuY3Rpb24sIGl0J3MgaW52b2tlZAogICAgICAgICAqIGZvciwgYW5kIGB0aGlzYCBib3VuZCB0bywgZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8RnVuY3Rpb258c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBtZXRob2QgdG8gaW52b2tlIG9yCiAgICAgICAgICogIHRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgZWFjaCBtZXRob2Qgd2l0aC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaW52b2tlTWFwKFtbNSwgMSwgN10sIFszLCAyLCAxXV0sICdzb3J0Jyk7CiAgICAgICAgICogLy8gPT4gW1sxLCA1LCA3XSwgWzEsIDIsIDNdXQogICAgICAgICAqCiAgICAgICAgICogXy5pbnZva2VNYXAoWzEyMywgNDU2XSwgU3RyaW5nLnByb3RvdHlwZS5zcGxpdCwgJycpOwogICAgICAgICAqIC8vID0+IFtbJzEnLCAnMicsICczJ10sIFsnNCcsICc1JywgJzYnXV0KICAgICAgICAgKi8KICAgICAgICB2YXIgaW52b2tlTWFwID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgcGF0aCwgYXJncykgewogICAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgICAgaXNGdW5jID0gdHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJywKICAgICAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZShjb2xsZWN0aW9uKSA/IEFycmF5KGNvbGxlY3Rpb24ubGVuZ3RoKSA6IFtdOwoKICAgICAgICAgIGJhc2VFYWNoKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGlzRnVuYyA/IGFwcGx5KHBhdGgsIHZhbHVlLCBhcmdzKSA6IGJhc2VJbnZva2UodmFsdWUsIHBhdGgsIGFyZ3MpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZiBrZXlzIGdlbmVyYXRlZCBmcm9tIHRoZSByZXN1bHRzIG9mIHJ1bm5pbmcKICAgICAgICAgKiBlYWNoIGVsZW1lbnQgb2YgYGNvbGxlY3Rpb25gIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUgb2YKICAgICAgICAgKiBlYWNoIGtleSBpcyB0aGUgbGFzdCBlbGVtZW50IHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBrZXkuIFRoZQogICAgICAgICAqIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIHRvIHRyYW5zZm9ybSBrZXlzLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbXBvc2VkIGFnZ3JlZ2F0ZSBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheSA9IFsKICAgICAgICAgKiAgIHsgJ2Rpcic6ICdsZWZ0JywgJ2NvZGUnOiA5NyB9LAogICAgICAgICAqICAgeyAnZGlyJzogJ3JpZ2h0JywgJ2NvZGUnOiAxMDAgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiBfLmtleUJ5KGFycmF5LCBmdW5jdGlvbihvKSB7CiAgICAgICAgICogICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShvLmNvZGUpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiB7ICdkaXInOiAnbGVmdCcsICdjb2RlJzogOTcgfSwgJ2QnOiB7ICdkaXInOiAncmlnaHQnLCAnY29kZSc6IDEwMCB9IH0KICAgICAgICAgKgogICAgICAgICAqIF8ua2V5QnkoYXJyYXksICdkaXInKTsKICAgICAgICAgKiAvLyA9PiB7ICdsZWZ0JzogeyAnZGlyJzogJ2xlZnQnLCAnY29kZSc6IDk3IH0sICdyaWdodCc6IHsgJ2Rpcic6ICdyaWdodCcsICdjb2RlJzogMTAwIH0gfQogICAgICAgICAqLwogICAgICAgIHZhciBrZXlCeSA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7CiAgICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIHZhbHVlKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUKICAgICAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKICAgICAgICAgKiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgICAgICoKICAgICAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2UKICAgICAgICAgKiBgXy5ldmVyeWAsIGBfLmZpbHRlcmAsIGBfLm1hcGAsIGBfLm1hcFZhbHVlc2AsIGBfLnJlamVjdGAsIGFuZCBgXy5zb21lYC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBndWFyZGVkIG1ldGhvZHMgYXJlOgogICAgICAgICAqIGBhcnlgLCBgY2h1bmtgLCBgY3VycnlgLCBgY3VycnlSaWdodGAsIGBkcm9wYCwgYGRyb3BSaWdodGAsIGBldmVyeWAsCiAgICAgICAgICogYGZpbGxgLCBgaW52ZXJ0YCwgYHBhcnNlSW50YCwgYHJhbmRvbWAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlcGVhdGAsCiAgICAgICAgICogYHNhbXBsZVNpemVgLCBgc2xpY2VgLCBgc29tZWAsIGBzb3J0QnlgLCBgc3BsaXRgLCBgdGFrZWAsIGB0YWtlUmlnaHRgLAogICAgICAgICAqIGB0ZW1wbGF0ZWAsIGB0cmltYCwgYHRyaW1FbmRgLCBgdHJpbVN0YXJ0YCwgYW5kIGB3b3Jkc2AKICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IG1hcHBlZCBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gc3F1YXJlKG4pIHsKICAgICAgICAgKiAgIHJldHVybiBuICogbjsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBfLm1hcChbNCwgOF0sIHNxdWFyZSk7CiAgICAgICAgICogLy8gPT4gWzE2LCA2NF0KICAgICAgICAgKgogICAgICAgICAqIF8ubWFwKHsgJ2EnOiA0LCAnYic6IDggfSwgc3F1YXJlKTsKICAgICAgICAgKiAvLyA9PiBbMTYsIDY0XSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICAgICAqCiAgICAgICAgICogdmFyIHVzZXJzID0gWwogICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnIH0KICAgICAgICAgKiBdOwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5tYXAodXNlcnMsICd1c2VyJyk7CiAgICAgICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbWFwKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7CiAgICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheU1hcCA6IGJhc2VNYXA7CiAgICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zb3J0QnlgIGV4Y2VwdCB0aGF0IGl0IGFsbG93cyBzcGVjaWZ5aW5nIHRoZSBzb3J0CiAgICAgICAgICogb3JkZXJzIG9mIHRoZSBpdGVyYXRlZXMgdG8gc29ydCBieS4gSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMKICAgICAgICAgKiBhcmUgc29ydGVkIGluIGFzY2VuZGluZyBvcmRlci4gT3RoZXJ3aXNlLCBzcGVjaWZ5IGFuIG9yZGVyIG9mICJkZXNjIiBmb3IKICAgICAgICAgKiBkZXNjZW5kaW5nIG9yICJhc2MiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlciBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7QXJyYXlbXXxGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV0KICAgICAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nW119IFtvcmRlcnNdIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC4KICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5yZWR1Y2VgLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHVzZXJzID0gWwogICAgICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDggfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiAvLyBTb3J0IGJ5IGB1c2VyYCBpbiBhc2NlbmRpbmcgb3JkZXIgYW5kIGJ5IGBhZ2VgIGluIGRlc2NlbmRpbmcgb3JkZXIuCiAgICAgICAgICogXy5vcmRlckJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10sIFsnYXNjJywgJ2Rlc2MnXSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCA0MF1dCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gb3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycywgZ3VhcmQpIHsKICAgICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFpc0FycmF5KGl0ZXJhdGVlcykpIHsKICAgICAgICAgICAgaXRlcmF0ZWVzID0gaXRlcmF0ZWVzID09IG51bGwgPyBbXSA6IFtpdGVyYXRlZXNdOwogICAgICAgICAgfQogICAgICAgICAgb3JkZXJzID0gZ3VhcmQgPyB1bmRlZmluZWQkMSA6IG9yZGVyczsKICAgICAgICAgIGlmICghaXNBcnJheShvcmRlcnMpKSB7CiAgICAgICAgICAgIG9yZGVycyA9IG9yZGVycyA9PSBudWxsID8gW10gOiBbb3JkZXJzXTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBiYXNlT3JkZXJCeShjb2xsZWN0aW9uLCBpdGVyYXRlZXMsIG9yZGVycyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGVsZW1lbnRzIHNwbGl0IGludG8gdHdvIGdyb3VwcywgdGhlIGZpcnN0IG9mIHdoaWNoCiAgICAgICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLCB0aGUgc2Vjb25kIG9mIHdoaWNoCiAgICAgICAgICogY29udGFpbnMgZWxlbWVudHMgYHByZWRpY2F0ZWAgcmV0dXJucyBmYWxzZXkgZm9yLiBUaGUgcHJlZGljYXRlIGlzCiAgICAgICAgICogaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIGdyb3VwZWQgZWxlbWVudHMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWdlJzogMSwgICdhY3RpdmUnOiBmYWxzZSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFjdGl2ZTsgfSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCB7ICdhZ2UnOiAxLCAnYWN0aXZlJzogZmFsc2UgfSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1sncGViYmxlcyddLCBbJ2Jhcm5leScsICdmcmVkJ11dCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5wYXJ0aXRpb24odXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAncGViYmxlcyddLCBbJ2ZyZWQnXV0KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8ucGFydGl0aW9uKHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snZnJlZCddLCBbJ2Jhcm5leScsICdwZWJibGVzJ11dCiAgICAgICAgICovCiAgICAgICAgdmFyIHBhcnRpdGlvbiA9IGNyZWF0ZUFnZ3JlZ2F0b3IoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7CiAgICAgICAgICByZXN1bHRba2V5ID8gMCA6IDFdLnB1c2godmFsdWUpOwogICAgICAgIH0sIGZ1bmN0aW9uKCkgeyByZXR1cm4gW1tdLCBbXV07IH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZwogICAgICAgICAqIGVhY2ggZWxlbWVudCBpbiBgY29sbGVjdGlvbmAgdGhydSBgaXRlcmF0ZWVgLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmUKICAgICAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLiBJZiBgYWNjdW11bGF0b3JgCiAgICAgICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbAogICAgICAgICAqIHZhbHVlLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIGZvdXIgYXJndW1lbnRzOgogICAgICAgICAqIChhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgICAgICoKICAgICAgICAgKiBNYW55IGxvZGFzaCBtZXRob2RzIGFyZSBndWFyZGVkIHRvIHdvcmsgYXMgaXRlcmF0ZWVzIGZvciBtZXRob2RzIGxpa2UKICAgICAgICAgKiBgXy5yZWR1Y2VgLCBgXy5yZWR1Y2VSaWdodGAsIGFuZCBgXy50cmFuc2Zvcm1gLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6CiAgICAgICAgICogYGFzc2lnbmAsIGBkZWZhdWx0c2AsIGBkZWZhdWx0c0RlZXBgLCBgaW5jbHVkZXNgLCBgbWVyZ2VgLCBgb3JkZXJCeWAsCiAgICAgICAgICogYW5kIGBzb3J0QnlgCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgogICAgICAgICAqIEBzZWUgXy5yZWR1Y2VSaWdodAogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnJlZHVjZShbMSwgMl0sIGZ1bmN0aW9uKHN1bSwgbikgewogICAgICAgICAqICAgcmV0dXJuIHN1bSArIG47CiAgICAgICAgICogfSwgMCk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqCiAgICAgICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgewogICAgICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTsKICAgICAgICAgKiAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICogfSwge30pOwogICAgICAgICAqIC8vID0+IHsgJzEnOiBbJ2EnLCAnYyddLCAnMic6IFsnYiddIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7CiAgICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheVJlZHVjZSA6IGJhc2VSZWR1Y2UsCiAgICAgICAgICAgICAgaW5pdEFjY3VtID0gYXJndW1lbnRzLmxlbmd0aCA8IDM7CgogICAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDQpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBiYXNlRWFjaCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJlZHVjZWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZgogICAgICAgICAqIGBjb2xsZWN0aW9uYCBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGluaXRpYWwgdmFsdWUuCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgogICAgICAgICAqIEBzZWUgXy5yZWR1Y2UKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFycmF5ID0gW1swLCAxXSwgWzIsIDNdLCBbNCwgNV1dOwogICAgICAgICAqCiAgICAgICAgICogXy5yZWR1Y2VSaWdodChhcnJheSwgZnVuY3Rpb24oZmxhdHRlbmVkLCBvdGhlcikgewogICAgICAgICAqICAgcmV0dXJuIGZsYXR0ZW5lZC5jb25jYXQob3RoZXIpOwogICAgICAgICAqIH0sIFtdKTsKICAgICAgICAgKiAvLyA9PiBbNCwgNSwgMiwgMywgMCwgMV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZWR1Y2VSaWdodChjb2xsZWN0aW9uLCBpdGVyYXRlZSwgYWNjdW11bGF0b3IpIHsKICAgICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5UmVkdWNlUmlnaHQgOiBiYXNlUmVkdWNlLAogICAgICAgICAgICAgIGluaXRBY2N1bSA9IGFyZ3VtZW50cy5sZW5ndGggPCAzOwoKICAgICAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCA0KSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSwgYmFzZUVhY2hSaWdodCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uZmlsdGVyYDsgdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZWxlbWVudHMgb2YgYGNvbGxlY3Rpb25gCiAgICAgICAgICogdGhhdCBgcHJlZGljYXRlYCBkb2VzICoqbm90KiogcmV0dXJuIHRydXRoeSBmb3IuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuCiAgICAgICAgICogQHNlZSBfLmZpbHRlcgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0MCwgJ2FjdGl2ZSc6IHRydWUgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiBfLnJlamVjdCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gIW8uYWN0aXZlOyB9KTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2ZyZWQnXQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnJlamVjdCh1c2VycywgeyAnYWdlJzogNDAsICdhY3RpdmUnOiB0cnVlIH0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J10KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnJlamVjdCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnZnJlZCddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnJlamVjdCh1c2VycywgJ2FjdGl2ZScpOwogICAgICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZWplY3QoY29sbGVjdGlvbiwgcHJlZGljYXRlKSB7CiAgICAgICAgICB2YXIgZnVuYyA9IGlzQXJyYXkoY29sbGVjdGlvbikgPyBhcnJheUZpbHRlciA6IGJhc2VGaWx0ZXI7CiAgICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhIHJhbmRvbSBlbGVtZW50IGZyb20gYGNvbGxlY3Rpb25gLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzYW1wbGUuCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnNhbXBsZShbMSwgMiwgMywgNF0pOwogICAgICAgICAqIC8vID0+IDIKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzYW1wbGUoY29sbGVjdGlvbikgewogICAgICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTYW1wbGUgOiBiYXNlU2FtcGxlOwogICAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGBuYCByYW5kb20gZWxlbWVudHMgYXQgdW5pcXVlIGtleXMgZnJvbSBgY29sbGVjdGlvbmAgdXAgdG8gdGhlCiAgICAgICAgICogc2l6ZSBvZiBgY29sbGVjdGlvbmAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgQ29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIHNhbXBsZS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiBlbGVtZW50cyB0byBzYW1wbGUuCiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIHJhbmRvbSBlbGVtZW50cy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5zYW1wbGVTaXplKFsxLCAyLCAzXSwgMik7CiAgICAgICAgICogLy8gPT4gWzMsIDFdCiAgICAgICAgICoKICAgICAgICAgKiBfLnNhbXBsZVNpemUoWzEsIDIsIDNdLCA0KTsKICAgICAgICAgKiAvLyA9PiBbMiwgMywgMV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzYW1wbGVTaXplKGNvbGxlY3Rpb24sIG4sIGd1YXJkKSB7CiAgICAgICAgICBpZiAoKGd1YXJkID8gaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkJDEpKSB7CiAgICAgICAgICAgIG4gPSAxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2FtcGxlU2l6ZSA6IGJhc2VTYW1wbGVTaXplOwogICAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHNodWZmbGVkIHZhbHVlcywgdXNpbmcgYSB2ZXJzaW9uIG9mIHRoZQogICAgICAgICAqIFtGaXNoZXItWWF0ZXMgc2h1ZmZsZV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvRmlzaGVyLVlhdGVzX3NodWZmbGUpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBzaHVmZmxlLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNodWZmbGVkIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnNodWZmbGUoWzEsIDIsIDMsIDRdKTsKICAgICAgICAgKiAvLyA9PiBbNCwgMSwgMywgMl0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzaHVmZmxlKGNvbGxlY3Rpb24pIHsKICAgICAgICAgIHZhciBmdW5jID0gaXNBcnJheShjb2xsZWN0aW9uKSA/IGFycmF5U2h1ZmZsZSA6IGJhc2VTaHVmZmxlOwogICAgICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZQogICAgICAgICAqIHZhbHVlcyBvciB0aGUgbnVtYmVyIG9mIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIGZvciBvYmplY3RzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdHxzdHJpbmd9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIHNpemUuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uc2l6ZShbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IDMKICAgICAgICAgKgogICAgICAgICAqIF8uc2l6ZSh7ICdhJzogMSwgJ2InOiAyIH0pOwogICAgICAgICAqIC8vID0+IDIKICAgICAgICAgKgogICAgICAgICAqIF8uc2l6ZSgncGViYmxlcycpOwogICAgICAgICAqIC8vID0+IDcKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzaXplKGNvbGxlY3Rpb24pIHsKICAgICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNBcnJheUxpa2UoY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgcmV0dXJuIGlzU3RyaW5nKGNvbGxlY3Rpb24pID8gc3RyaW5nU2l6ZShjb2xsZWN0aW9uKSA6IGNvbGxlY3Rpb24ubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHRhZyA9IGdldFRhZyhjb2xsZWN0aW9uKTsKICAgICAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24uc2l6ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBiYXNlS2V5cyhjb2xsZWN0aW9uKS5sZW5ndGg7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yICoqYW55KiogZWxlbWVudCBvZiBgY29sbGVjdGlvbmAuCiAgICAgICAgICogSXRlcmF0aW9uIGlzIHN0b3BwZWQgb25jZSBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeS4gVGhlIHByZWRpY2F0ZSBpcwogICAgICAgICAqIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjaywKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnNvbWUoW251bGwsIDAsICd5ZXMnLCBmYWxzZV0sIEJvb2xlYW4pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IFsKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FjdGl2ZSc6IGZhbHNlIH0KICAgICAgICAgKiBdOwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLnNvbWUodXNlcnMsIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IGZhbHNlIH0pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5zb21lKHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5zb21lKHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNvbWUoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkgewogICAgICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5KGNvbGxlY3Rpb24pID8gYXJyYXlTb21lIDogYmFzZVNvbWU7CiAgICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBndWFyZCkpIHsKICAgICAgICAgICAgcHJlZGljYXRlID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gZnVuYyhjb2xsZWN0aW9uLCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2YKICAgICAgICAgKiBydW5uaW5nIGVhY2ggZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24gdGhydSBlYWNoIGl0ZXJhdGVlLiBUaGlzIG1ldGhvZAogICAgICAgICAqIHBlcmZvcm1zIGEgc3RhYmxlIHNvcnQsIHRoYXQgaXMsIGl0IHByZXNlcnZlcyB0aGUgb3JpZ2luYWwgc29ydCBvcmRlciBvZgogICAgICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtpdGVyYXRlZXM9W18uaWRlbnRpdHldXQogICAgICAgICAqICBUaGUgaXRlcmF0ZWVzIHRvIHNvcnQgYnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgICAgICogICB7ICd1c2VyJzogJ2ZyZWQnLCAgICdhZ2UnOiA0OCB9LAogICAgICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAnYWdlJzogMzYgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDMwIH0sCiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNCB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbZnVuY3Rpb24obykgeyByZXR1cm4gby51c2VyOyB9XSk7CiAgICAgICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzZdLCBbJ2Jhcm5leScsIDM0XSwgWydmcmVkJywgNDhdLCBbJ2ZyZWQnLCAzMF1dCiAgICAgICAgICoKICAgICAgICAgKiBfLnNvcnRCeSh1c2VycywgWyd1c2VyJywgJ2FnZSddKTsKICAgICAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbWydiYXJuZXknLCAzNF0sIFsnYmFybmV5JywgMzZdLCBbJ2ZyZWQnLCAzMF0sIFsnZnJlZCcsIDQ4XV0KICAgICAgICAgKi8KICAgICAgICB2YXIgc29ydEJ5ID0gYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7CiAgICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBsZW5ndGggPSBpdGVyYXRlZXMubGVuZ3RoOwogICAgICAgICAgaWYgKGxlbmd0aCA+IDEgJiYgaXNJdGVyYXRlZUNhbGwoY29sbGVjdGlvbiwgaXRlcmF0ZWVzWzBdLCBpdGVyYXRlZXNbMV0pKSB7CiAgICAgICAgICAgIGl0ZXJhdGVlcyA9IFtdOwogICAgICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIGlzSXRlcmF0ZWVDYWxsKGl0ZXJhdGVlc1swXSwgaXRlcmF0ZWVzWzFdLCBpdGVyYXRlZXNbMl0pKSB7CiAgICAgICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VPcmRlckJ5KGNvbGxlY3Rpb24sIGJhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTsKICAgICAgICB9KTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UKICAgICAgICAgKiB0aGUgVW5peCBlcG9jaCAoMSBKYW51YXJ5IDE5NzAgMDA6MDA6MDAgVVRDKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAyLjQuMAogICAgICAgICAqIEBjYXRlZ29yeSBEYXRlCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXN0YW1wLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHN0YW1wKSB7CiAgICAgICAgICogICBjb25zb2xlLmxvZyhfLm5vdygpIC0gc3RhbXApOwogICAgICAgICAqIH0sIF8ubm93KCkpOwogICAgICAgICAqIC8vID0+IExvZ3MgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgaXQgdG9vayBmb3IgdGhlIGRlZmVycmVkIGludm9jYXRpb24uCiAgICAgICAgICovCiAgICAgICAgdmFyIG5vdyA9IGN0eE5vdyB8fCBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiByb290LkRhdGUubm93KCk7CiAgICAgICAgfTsKCiAgICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8uYmVmb3JlYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcwogICAgICAgICAqIGBmdW5jYCBvbmNlIGl0J3MgY2FsbGVkIGBuYCBvciBtb3JlIHRpbWVzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiBjYWxscyBiZWZvcmUgYGZ1bmNgIGlzIGludm9rZWQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVzdHJpY3QuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcmVzdHJpY3RlZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHNhdmVzID0gWydwcm9maWxlJywgJ3NldHRpbmdzJ107CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZG9uZSA9IF8uYWZ0ZXIoc2F2ZXMubGVuZ3RoLCBmdW5jdGlvbigpIHsKICAgICAgICAgKiAgIGNvbnNvbGUubG9nKCdkb25lIHNhdmluZyEnKTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIF8uZm9yRWFjaChzYXZlcywgZnVuY3Rpb24odHlwZSkgewogICAgICAgICAqICAgYXN5bmNTYXZlKHsgJ3R5cGUnOiB0eXBlLCAnY29tcGxldGUnOiBkb25lIH0pOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IExvZ3MgJ2RvbmUgc2F2aW5nIScgYWZ0ZXIgdGhlIHR3byBhc3luYyBzYXZlcyBoYXZlIGNvbXBsZXRlZC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBhZnRlcihuLCBmdW5jKSB7CiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgICAgICAgICB9CiAgICAgICAgICBuID0gdG9JbnRlZ2VyKG4pOwogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAoLS1uIDwgMSkgewogICAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCwgd2l0aCB1cCB0byBgbmAgYXJndW1lbnRzLAogICAgICAgICAqIGlnbm9yaW5nIGFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbj1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IGNhcC4KICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNhcHBlZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5tYXAoWyc2JywgJzgnLCAnMTAnXSwgXy5hcnkocGFyc2VJbnQsIDEpKTsKICAgICAgICAgKiAvLyA9PiBbNiwgOCwgMTBdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gYXJ5KGZ1bmMsIG4sIGd1YXJkKSB7CiAgICAgICAgICBuID0gZ3VhcmQgPyB1bmRlZmluZWQkMSA6IG47CiAgICAgICAgICBuID0gKGZ1bmMgJiYgbiA9PSBudWxsKSA/IGZ1bmMubGVuZ3RoIDogbjsKICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfQVJZX0ZMQUcsIHVuZGVmaW5lZCQxLCB1bmRlZmluZWQkMSwgdW5kZWZpbmVkJDEsIHVuZGVmaW5lZCQxLCBuKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgLCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBhbmQgYXJndW1lbnRzCiAgICAgICAgICogb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24sIHdoaWxlIGl0J3MgY2FsbGVkIGxlc3MgdGhhbiBgbmAgdGltZXMuIFN1YnNlcXVlbnQKICAgICAgICAgKiBjYWxscyB0byB0aGUgY3JlYXRlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AgaW52b2NhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgY2FsbHMgYXQgd2hpY2ggYGZ1bmNgIGlzIG5vIGxvbmdlciBpbnZva2VkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJlc3RyaWN0ZWQgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGpRdWVyeShlbGVtZW50KS5vbignY2xpY2snLCBfLmJlZm9yZSg1LCBhZGRDb250YWN0VG9MaXN0KSk7CiAgICAgICAgICogLy8gPT4gQWxsb3dzIGFkZGluZyB1cCB0byA0IGNvbnRhY3RzIHRvIHRoZSBsaXN0LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGJlZm9yZShuLCBmdW5jKSB7CiAgICAgICAgICB2YXIgcmVzdWx0OwogICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpOwogICAgICAgICAgfQogICAgICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKC0tbiA+IDApIHsKICAgICAgICAgICAgICByZXN1bHQgPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG4gPD0gMSkgewogICAgICAgICAgICAgIGZ1bmMgPSB1bmRlZmluZWQkMTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYAogICAgICAgICAqIGFuZCBgcGFydGlhbHNgIHByZXBlbmRlZCB0byB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGBfLmJpbmQucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYyBidWlsZHMsCiAgICAgICAgICogbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVubGlrZSBuYXRpdmUgYEZ1bmN0aW9uI2JpbmRgLCB0aGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgImxlbmd0aCIKICAgICAgICAgKiBwcm9wZXJ0eSBvZiBib3VuZCBmdW5jdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBiaW5kLgogICAgICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgogICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGJvdW5kIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgcHVuY3R1YXRpb24pIHsKICAgICAgICAgKiAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICd1c2VyJzogJ2ZyZWQnIH07CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgJ2hpJyk7CiAgICAgICAgICogYm91bmQoJyEnKTsKICAgICAgICAgKiAvLyA9PiAnaGkgZnJlZCEnCiAgICAgICAgICoKICAgICAgICAgKiAvLyBCb3VuZCB3aXRoIHBsYWNlaG9sZGVycy4KICAgICAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmQoZ3JlZXQsIG9iamVjdCwgXywgJyEnKTsKICAgICAgICAgKiBib3VuZCgnaGknKTsKICAgICAgICAgKiAvLyA9PiAnaGkgZnJlZCEnCiAgICAgICAgICovCiAgICAgICAgdmFyIGJpbmQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCB0aGlzQXJnLCBwYXJ0aWFscykgewogICAgICAgICAgdmFyIGJpdG1hc2sgPSBXUkFQX0JJTkRfRkxBRzsKICAgICAgICAgIGlmIChwYXJ0aWFscy5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKGJpbmQpKTsKICAgICAgICAgICAgYml0bWFzayB8PSBXUkFQX1BBUlRJQUxfRkxBRzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIGJpdG1hc2ssIHRoaXNBcmcsIHBhcnRpYWxzLCBob2xkZXJzKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyB0aGUgbWV0aG9kIGF0IGBvYmplY3Rba2V5XWAgd2l0aCBgcGFydGlhbHNgCiAgICAgICAgICogcHJlcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBkaWZmZXJzIGZyb20gYF8uYmluZGAgYnkgYWxsb3dpbmcgYm91bmQgZnVuY3Rpb25zIHRvIHJlZmVyZW5jZQogICAgICAgICAqIG1ldGhvZHMgdGhhdCBtYXkgYmUgcmVkZWZpbmVkIG9yIGRvbid0IHlldCBleGlzdC4gU2VlCiAgICAgICAgICogW1BldGVyIE1pY2hhdXgncyBhcnRpY2xlXShodHRwOi8vcGV0ZXIubWljaGF1eC5jYS9hcnRpY2xlcy9sYXp5LWZ1bmN0aW9uLWRlZmluaXRpb24tcGF0dGVybikKICAgICAgICAgKiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGBfLmJpbmRLZXkucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYwogICAgICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMTAuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZva2UgdGhlIG1ldGhvZCBvbi4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZC4KICAgICAgICAgKiBAcGFyYW0gey4uLip9IFtwYXJ0aWFsc10gVGhlIGFyZ3VtZW50cyB0byBiZSBwYXJ0aWFsbHkgYXBwbGllZC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBib3VuZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsKICAgICAgICAgKiAgICd1c2VyJzogJ2ZyZWQnLAogICAgICAgICAqICAgJ2dyZWV0JzogZnVuY3Rpb24oZ3JlZXRpbmcsIHB1bmN0dWF0aW9uKSB7CiAgICAgICAgICogICAgIHJldHVybiBncmVldGluZyArICcgJyArIHRoaXMudXNlciArIHB1bmN0dWF0aW9uOwogICAgICAgICAqICAgfQogICAgICAgICAqIH07CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYm91bmQgPSBfLmJpbmRLZXkob2JqZWN0LCAnZ3JlZXQnLCAnaGknKTsKICAgICAgICAgKiBib3VuZCgnIScpOwogICAgICAgICAqIC8vID0+ICdoaSBmcmVkIScKICAgICAgICAgKgogICAgICAgICAqIG9iamVjdC5ncmVldCA9IGZ1bmN0aW9uKGdyZWV0aW5nLCBwdW5jdHVhdGlvbikgewogICAgICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJ3lhICcgKyB0aGlzLnVzZXIgKyBwdW5jdHVhdGlvbjsKICAgICAgICAgKiB9OwogICAgICAgICAqCiAgICAgICAgICogYm91bmQoJyEnKTsKICAgICAgICAgKiAvLyA9PiAnaGl5YSBmcmVkIScKICAgICAgICAgKgogICAgICAgICAqIC8vIEJvdW5kIHdpdGggcGxhY2Vob2xkZXJzLgogICAgICAgICAqIHZhciBib3VuZCA9IF8uYmluZEtleShvYmplY3QsICdncmVldCcsIF8sICchJyk7CiAgICAgICAgICogYm91bmQoJ2hpJyk7CiAgICAgICAgICogLy8gPT4gJ2hpeWEgZnJlZCEnCiAgICAgICAgICovCiAgICAgICAgdmFyIGJpbmRLZXkgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGtleSwgcGFydGlhbHMpIHsKICAgICAgICAgIHZhciBiaXRtYXNrID0gV1JBUF9CSU5EX0ZMQUcgfCBXUkFQX0JJTkRfS0VZX0ZMQUc7CiAgICAgICAgICBpZiAocGFydGlhbHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBob2xkZXJzID0gcmVwbGFjZUhvbGRlcnMocGFydGlhbHMsIGdldEhvbGRlcihiaW5kS2V5KSk7CiAgICAgICAgICAgIGJpdG1hc2sgfD0gV1JBUF9QQVJUSUFMX0ZMQUc7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcChrZXksIGJpdG1hc2ssIG9iamVjdCwgcGFydGlhbHMsIGhvbGRlcnMpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIGFyZ3VtZW50cyBvZiBgZnVuY2AgYW5kIGVpdGhlciBpbnZva2VzCiAgICAgICAgICogYGZ1bmNgIHJldHVybmluZyBpdHMgcmVzdWx0LCBpZiBhdCBsZWFzdCBgYXJpdHlgIG51bWJlciBvZiBhcmd1bWVudHMgaGF2ZQogICAgICAgICAqIGJlZW4gcHJvdmlkZWQsIG9yIHJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGFjY2VwdHMgdGhlIHJlbWFpbmluZyBgZnVuY2AKICAgICAgICAgKiBhcmd1bWVudHMsIGFuZCBzbyBvbi4gVGhlIGFyaXR5IG9mIGBmdW5jYCBtYXkgYmUgc3BlY2lmaWVkIGlmIGBmdW5jLmxlbmd0aGAKICAgICAgICAgKiBpcyBub3Qgc3VmZmljaWVudC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBgXy5jdXJyeS5wbGFjZWhvbGRlcmAgdmFsdWUsIHdoaWNoIGRlZmF1bHRzIHRvIGBfYCBpbiBtb25vbGl0aGljIGJ1aWxkcywKICAgICAgICAgKiBtYXkgYmUgdXNlZCBhcyBhIHBsYWNlaG9sZGVyIGZvciBwcm92aWRlZCBhcmd1bWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlICJsZW5ndGgiIHByb3BlcnR5IG9mIGN1cnJpZWQgZnVuY3Rpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY3VycnkuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFthcml0eT1mdW5jLmxlbmd0aF0gVGhlIGFyaXR5IG9mIGBmdW5jYC4KICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGN1cnJpZWQgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhYmMgPSBmdW5jdGlvbihhLCBiLCBjKSB7CiAgICAgICAgICogICByZXR1cm4gW2EsIGIsIGNdOwogICAgICAgICAqIH07CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgY3VycmllZCA9IF8uY3VycnkoYWJjKTsKICAgICAgICAgKgogICAgICAgICAqIGN1cnJpZWQoMSkoMikoMyk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICoKICAgICAgICAgKiBjdXJyaWVkKDEsIDIpKDMpOwogICAgICAgICAqIC8vID0+IFsxLCAyLCAzXQogICAgICAgICAqCiAgICAgICAgICogY3VycmllZCgxLCAyLCAzKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAgICAgKgogICAgICAgICAqIC8vIEN1cnJpZWQgd2l0aCBwbGFjZWhvbGRlcnMuCiAgICAgICAgICogY3VycmllZCgxKShfLCAzKSgyKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjdXJyeShmdW5jLCBhcml0eSwgZ3VhcmQpIHsKICAgICAgICAgIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQkMSA6IGFyaXR5OwogICAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9GTEFHLCB1bmRlZmluZWQkMSwgdW5kZWZpbmVkJDEsIHVuZGVmaW5lZCQxLCB1bmRlZmluZWQkMSwgdW5kZWZpbmVkJDEsIGFyaXR5KTsKICAgICAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5LnBsYWNlaG9sZGVyOwogICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uY3VycnlgIGV4Y2VwdCB0aGF0IGFyZ3VtZW50cyBhcmUgYXBwbGllZCB0byBgZnVuY2AKICAgICAgICAgKiBpbiB0aGUgbWFubmVyIG9mIGBfLnBhcnRpYWxSaWdodGAgaW5zdGVhZCBvZiBgXy5wYXJ0aWFsYC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBgXy5jdXJyeVJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMKICAgICAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHByb3ZpZGVkIGFyZ3VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgImxlbmd0aCIgcHJvcGVydHkgb2YgY3VycmllZCBmdW5jdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjdXJyeS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FyaXR5PWZ1bmMubGVuZ3RoXSBUaGUgYXJpdHkgb2YgYGZ1bmNgLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY3VycmllZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFiYyA9IGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgICAgICAgKiAgIHJldHVybiBbYSwgYiwgY107CiAgICAgICAgICogfTsKICAgICAgICAgKgogICAgICAgICAqIHZhciBjdXJyaWVkID0gXy5jdXJyeVJpZ2h0KGFiYyk7CiAgICAgICAgICoKICAgICAgICAgKiBjdXJyaWVkKDMpKDIpKDEpOwogICAgICAgICAqIC8vID0+IFsxLCAyLCAzXQogICAgICAgICAqCiAgICAgICAgICogY3VycmllZCgyLCAzKSgxKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMiwgM10KICAgICAgICAgKgogICAgICAgICAqIGN1cnJpZWQoMSwgMiwgMyk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICoKICAgICAgICAgKiAvLyBDdXJyaWVkIHdpdGggcGxhY2Vob2xkZXJzLgogICAgICAgICAqIGN1cnJpZWQoMykoMSwgXykoMik7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3VycnlSaWdodChmdW5jLCBhcml0eSwgZ3VhcmQpIHsKICAgICAgICAgIGFyaXR5ID0gZ3VhcmQgPyB1bmRlZmluZWQkMSA6IGFyaXR5OwogICAgICAgICAgdmFyIHJlc3VsdCA9IGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9DVVJSWV9SSUdIVF9GTEFHLCB1bmRlZmluZWQkMSwgdW5kZWZpbmVkJDEsIHVuZGVmaW5lZCQxLCB1bmRlZmluZWQkMSwgdW5kZWZpbmVkJDEsIGFyaXR5KTsKICAgICAgICAgIHJlc3VsdC5wbGFjZWhvbGRlciA9IGN1cnJ5UmlnaHQucGxhY2Vob2xkZXI7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGRlYm91bmNlZCBmdW5jdGlvbiB0aGF0IGRlbGF5cyBpbnZva2luZyBgZnVuY2AgdW50aWwgYWZ0ZXIgYHdhaXRgCiAgICAgICAgICogbWlsbGlzZWNvbmRzIGhhdmUgZWxhcHNlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBkZWJvdW5jZWQgZnVuY3Rpb24gd2FzCiAgICAgICAgICogaW52b2tlZC4gVGhlIGRlYm91bmNlZCBmdW5jdGlvbiBjb21lcyB3aXRoIGEgYGNhbmNlbGAgbWV0aG9kIHRvIGNhbmNlbAogICAgICAgICAqIGRlbGF5ZWQgYGZ1bmNgIGludm9jYXRpb25zIGFuZCBhIGBmbHVzaGAgbWV0aG9kIHRvIGltbWVkaWF0ZWx5IGludm9rZSB0aGVtLgogICAgICAgICAqIFByb3ZpZGUgYG9wdGlvbnNgIHRvIGluZGljYXRlIHdoZXRoZXIgYGZ1bmNgIHNob3VsZCBiZSBpbnZva2VkIG9uIHRoZQogICAgICAgICAqIGxlYWRpbmcgYW5kL29yIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIGB3YWl0YCB0aW1lb3V0LiBUaGUgYGZ1bmNgIGlzIGludm9rZWQKICAgICAgICAgKiB3aXRoIHRoZSBsYXN0IGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uLiBTdWJzZXF1ZW50CiAgICAgICAgICogY2FsbHMgdG8gdGhlIGRlYm91bmNlZCBmdW5jdGlvbiByZXR1cm4gdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBgZnVuY2AKICAgICAgICAgKiBpbnZvY2F0aW9uLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIElmIGBsZWFkaW5nYCBhbmQgYHRyYWlsaW5nYCBvcHRpb25zIGFyZSBgdHJ1ZWAsIGBmdW5jYCBpcwogICAgICAgICAqIGludm9rZWQgb24gdGhlIHRyYWlsaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQgb25seSBpZiB0aGUgZGVib3VuY2VkIGZ1bmN0aW9uCiAgICAgICAgICogaXMgaW52b2tlZCBtb3JlIHRoYW4gb25jZSBkdXJpbmcgdGhlIGB3YWl0YCB0aW1lb3V0LgogICAgICAgICAqCiAgICAgICAgICogSWYgYHdhaXRgIGlzIGAwYCBhbmQgYGxlYWRpbmdgIGlzIGBmYWxzZWAsIGBmdW5jYCBpbnZvY2F0aW9uIGlzIGRlZmVycmVkCiAgICAgICAgICogdW50aWwgdG8gdGhlIG5leHQgdGljaywgc2ltaWxhciB0byBgc2V0VGltZW91dGAgd2l0aCBhIHRpbWVvdXQgb2YgYDBgLgogICAgICAgICAqCiAgICAgICAgICogU2VlIFtEYXZpZCBDb3JiYWNobydzIGFydGljbGVdKGh0dHBzOi8vY3NzLXRyaWNrcy5jb20vZGVib3VuY2luZy10aHJvdHRsaW5nLWV4cGxhaW5lZC1leGFtcGxlcy8pCiAgICAgICAgICogZm9yIGRldGFpbHMgb3ZlciB0aGUgZGlmZmVyZW5jZXMgYmV0d2VlbiBgXy5kZWJvdW5jZWAgYW5kIGBfLnRocm90dGxlYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlYm91bmNlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbd2FpdD0wXSBUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtvcHRpb25zLmxlYWRpbmc9ZmFsc2VdCiAgICAgICAgICogIFNwZWNpZnkgaW52b2tpbmcgb24gdGhlIGxlYWRpbmcgZWRnZSBvZiB0aGUgdGltZW91dC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubWF4V2FpdF0KICAgICAgICAgKiAgVGhlIG1heGltdW0gdGltZSBgZnVuY2AgaXMgYWxsb3dlZCB0byBiZSBkZWxheWVkIGJlZm9yZSBpdCdzIGludm9rZWQuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXQogICAgICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGRlYm91bmNlZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogLy8gQXZvaWQgY29zdGx5IGNhbGN1bGF0aW9ucyB3aGlsZSB0aGUgd2luZG93IHNpemUgaXMgaW4gZmx1eC4KICAgICAgICAgKiBqUXVlcnkod2luZG93KS5vbigncmVzaXplJywgXy5kZWJvdW5jZShjYWxjdWxhdGVMYXlvdXQsIDE1MCkpOwogICAgICAgICAqCiAgICAgICAgICogLy8gSW52b2tlIGBzZW5kTWFpbGAgd2hlbiBjbGlja2VkLCBkZWJvdW5jaW5nIHN1YnNlcXVlbnQgY2FsbHMuCiAgICAgICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIF8uZGVib3VuY2Uoc2VuZE1haWwsIDMwMCwgewogICAgICAgICAqICAgJ2xlYWRpbmcnOiB0cnVlLAogICAgICAgICAqICAgJ3RyYWlsaW5nJzogZmFsc2UKICAgICAgICAgKiB9KSk7CiAgICAgICAgICoKICAgICAgICAgKiAvLyBFbnN1cmUgYGJhdGNoTG9nYCBpcyBpbnZva2VkIG9uY2UgYWZ0ZXIgMSBzZWNvbmQgb2YgZGVib3VuY2VkIGNhbGxzLgogICAgICAgICAqIHZhciBkZWJvdW5jZWQgPSBfLmRlYm91bmNlKGJhdGNoTG9nLCAyNTAsIHsgJ21heFdhaXQnOiAxMDAwIH0pOwogICAgICAgICAqIHZhciBzb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UoJy9zdHJlYW0nKTsKICAgICAgICAgKiBqUXVlcnkoc291cmNlKS5vbignbWVzc2FnZScsIGRlYm91bmNlZCk7CiAgICAgICAgICoKICAgICAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIGRlYm91bmNlZCBpbnZvY2F0aW9uLgogICAgICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIGRlYm91bmNlZC5jYW5jZWwpOwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGRlYm91bmNlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBsYXN0QXJncywKICAgICAgICAgICAgICBsYXN0VGhpcywKICAgICAgICAgICAgICBtYXhXYWl0LAogICAgICAgICAgICAgIHJlc3VsdCwKICAgICAgICAgICAgICB0aW1lcklkLAogICAgICAgICAgICAgIGxhc3RDYWxsVGltZSwKICAgICAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IDAsCiAgICAgICAgICAgICAgbGVhZGluZyA9IGZhbHNlLAogICAgICAgICAgICAgIG1heGluZyA9IGZhbHNlLAogICAgICAgICAgICAgIHRyYWlsaW5nID0gdHJ1ZTsKCiAgICAgICAgICBpZiAodHlwZW9mIGZ1bmMgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgICAgICAgICB9CiAgICAgICAgICB3YWl0ID0gdG9OdW1iZXIod2FpdCkgfHwgMDsKICAgICAgICAgIGlmIChpc09iamVjdChvcHRpb25zKSkgewogICAgICAgICAgICBsZWFkaW5nID0gISFvcHRpb25zLmxlYWRpbmc7CiAgICAgICAgICAgIG1heGluZyA9ICdtYXhXYWl0JyBpbiBvcHRpb25zOwogICAgICAgICAgICBtYXhXYWl0ID0gbWF4aW5nID8gbmF0aXZlTWF4KHRvTnVtYmVyKG9wdGlvbnMubWF4V2FpdCkgfHwgMCwgd2FpdCkgOiBtYXhXYWl0OwogICAgICAgICAgICB0cmFpbGluZyA9ICd0cmFpbGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy50cmFpbGluZyA6IHRyYWlsaW5nOwogICAgICAgICAgfQoKICAgICAgICAgIGZ1bmN0aW9uIGludm9rZUZ1bmModGltZSkgewogICAgICAgICAgICB2YXIgYXJncyA9IGxhc3RBcmdzLAogICAgICAgICAgICAgICAgdGhpc0FyZyA9IGxhc3RUaGlzOwoKICAgICAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7CiAgICAgICAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gbGVhZGluZ0VkZ2UodGltZSkgewogICAgICAgICAgICAvLyBSZXNldCBhbnkgYG1heFdhaXRgIHRpbWVyLgogICAgICAgICAgICBsYXN0SW52b2tlVGltZSA9IHRpbWU7CiAgICAgICAgICAgIC8vIFN0YXJ0IHRoZSB0aW1lciBmb3IgdGhlIHRyYWlsaW5nIGVkZ2UuCiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7CiAgICAgICAgICAgIC8vIEludm9rZSB0aGUgbGVhZGluZyBlZGdlLgogICAgICAgICAgICByZXR1cm4gbGVhZGluZyA/IGludm9rZUZ1bmModGltZSkgOiByZXN1bHQ7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gcmVtYWluaW5nV2FpdCh0aW1lKSB7CiAgICAgICAgICAgIHZhciB0aW1lU2luY2VMYXN0Q2FsbCA9IHRpbWUgLSBsYXN0Q2FsbFRpbWUsCiAgICAgICAgICAgICAgICB0aW1lU2luY2VMYXN0SW52b2tlID0gdGltZSAtIGxhc3RJbnZva2VUaW1lLAogICAgICAgICAgICAgICAgdGltZVdhaXRpbmcgPSB3YWl0IC0gdGltZVNpbmNlTGFzdENhbGw7CgogICAgICAgICAgICByZXR1cm4gbWF4aW5nCiAgICAgICAgICAgICAgPyBuYXRpdmVNaW4odGltZVdhaXRpbmcsIG1heFdhaXQgLSB0aW1lU2luY2VMYXN0SW52b2tlKQogICAgICAgICAgICAgIDogdGltZVdhaXRpbmc7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gc2hvdWxkSW52b2tlKHRpbWUpIHsKICAgICAgICAgICAgdmFyIHRpbWVTaW5jZUxhc3RDYWxsID0gdGltZSAtIGxhc3RDYWxsVGltZSwKICAgICAgICAgICAgICAgIHRpbWVTaW5jZUxhc3RJbnZva2UgPSB0aW1lIC0gbGFzdEludm9rZVRpbWU7CgogICAgICAgICAgICAvLyBFaXRoZXIgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCwgYWN0aXZpdHkgaGFzIHN0b3BwZWQgYW5kIHdlJ3JlIGF0IHRoZQogICAgICAgICAgICAvLyB0cmFpbGluZyBlZGdlLCB0aGUgc3lzdGVtIHRpbWUgaGFzIGdvbmUgYmFja3dhcmRzIGFuZCB3ZSdyZSB0cmVhdGluZwogICAgICAgICAgICAvLyBpdCBhcyB0aGUgdHJhaWxpbmcgZWRnZSwgb3Igd2UndmUgaGl0IHRoZSBgbWF4V2FpdGAgbGltaXQuCiAgICAgICAgICAgIHJldHVybiAobGFzdENhbGxUaW1lID09PSB1bmRlZmluZWQkMSB8fCAodGltZVNpbmNlTGFzdENhbGwgPj0gd2FpdCkgfHwKICAgICAgICAgICAgICAodGltZVNpbmNlTGFzdENhbGwgPCAwKSB8fCAobWF4aW5nICYmIHRpbWVTaW5jZUxhc3RJbnZva2UgPj0gbWF4V2FpdCkpOwogICAgICAgICAgfQoKICAgICAgICAgIGZ1bmN0aW9uIHRpbWVyRXhwaXJlZCgpIHsKICAgICAgICAgICAgdmFyIHRpbWUgPSBub3coKTsKICAgICAgICAgICAgaWYgKHNob3VsZEludm9rZSh0aW1lKSkgewogICAgICAgICAgICAgIHJldHVybiB0cmFpbGluZ0VkZ2UodGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzdGFydCB0aGUgdGltZXIuCiAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgcmVtYWluaW5nV2FpdCh0aW1lKSk7CiAgICAgICAgICB9CgogICAgICAgICAgZnVuY3Rpb24gdHJhaWxpbmdFZGdlKHRpbWUpIHsKICAgICAgICAgICAgdGltZXJJZCA9IHVuZGVmaW5lZCQxOwoKICAgICAgICAgICAgLy8gT25seSBpbnZva2UgaWYgd2UgaGF2ZSBgbGFzdEFyZ3NgIHdoaWNoIG1lYW5zIGBmdW5jYCBoYXMgYmVlbgogICAgICAgICAgICAvLyBkZWJvdW5jZWQgYXQgbGVhc3Qgb25jZS4KICAgICAgICAgICAgaWYgKHRyYWlsaW5nICYmIGxhc3RBcmdzKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGludm9rZUZ1bmModGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGFzdEFyZ3MgPSBsYXN0VGhpcyA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfQoKICAgICAgICAgIGZ1bmN0aW9uIGNhbmNlbCgpIHsKICAgICAgICAgICAgaWYgKHRpbWVySWQgIT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVySWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxhc3RJbnZva2VUaW1lID0gMDsKICAgICAgICAgICAgbGFzdEFyZ3MgPSBsYXN0Q2FsbFRpbWUgPSBsYXN0VGhpcyA9IHRpbWVySWQgPSB1bmRlZmluZWQkMTsKICAgICAgICAgIH0KCiAgICAgICAgICBmdW5jdGlvbiBmbHVzaCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRpbWVySWQgPT09IHVuZGVmaW5lZCQxID8gcmVzdWx0IDogdHJhaWxpbmdFZGdlKG5vdygpKTsKICAgICAgICAgIH0KCiAgICAgICAgICBmdW5jdGlvbiBkZWJvdW5jZWQoKSB7CiAgICAgICAgICAgIHZhciB0aW1lID0gbm93KCksCiAgICAgICAgICAgICAgICBpc0ludm9raW5nID0gc2hvdWxkSW52b2tlKHRpbWUpOwoKICAgICAgICAgICAgbGFzdEFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgIGxhc3RUaGlzID0gdGhpczsKICAgICAgICAgICAgbGFzdENhbGxUaW1lID0gdGltZTsKCiAgICAgICAgICAgIGlmIChpc0ludm9raW5nKSB7CiAgICAgICAgICAgICAgaWYgKHRpbWVySWQgPT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGVhZGluZ0VkZ2UobGFzdENhbGxUaW1lKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKG1heGluZykgewogICAgICAgICAgICAgICAgLy8gSGFuZGxlIGludm9jYXRpb25zIGluIGEgdGlnaHQgbG9vcC4KICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aW1lcklkKTsKICAgICAgICAgICAgICAgIHRpbWVySWQgPSBzZXRUaW1lb3V0KHRpbWVyRXhwaXJlZCwgd2FpdCk7CiAgICAgICAgICAgICAgICByZXR1cm4gaW52b2tlRnVuYyhsYXN0Q2FsbFRpbWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGltZXJJZCA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICB0aW1lcklkID0gc2V0VGltZW91dCh0aW1lckV4cGlyZWQsIHdhaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICBkZWJvdW5jZWQuY2FuY2VsID0gY2FuY2VsOwogICAgICAgICAgZGVib3VuY2VkLmZsdXNoID0gZmx1c2g7CiAgICAgICAgICByZXR1cm4gZGVib3VuY2VkOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVmZXJzIGludm9raW5nIHRoZSBgZnVuY2AgdW50aWwgdGhlIGN1cnJlbnQgY2FsbCBzdGFjayBoYXMgY2xlYXJlZC4gQW55CiAgICAgICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlZmVyLgogICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHRpbWVyIGlkLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmRlZmVyKGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICAgKiAgIGNvbnNvbGUubG9nKHRleHQpOwogICAgICAgICAqIH0sICdkZWZlcnJlZCcpOwogICAgICAgICAqIC8vID0+IExvZ3MgJ2RlZmVycmVkJyBhZnRlciBvbmUgbWlsbGlzZWNvbmQuCiAgICAgICAgICovCiAgICAgICAgdmFyIGRlZmVyID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgYXJncykgewogICAgICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCAxLCBhcmdzKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogSW52b2tlcyBgZnVuY2AgYWZ0ZXIgYHdhaXRgIG1pbGxpc2Vjb25kcy4gQW55IGFkZGl0aW9uYWwgYXJndW1lbnRzIGFyZQogICAgICAgICAqIHByb3ZpZGVkIHRvIGBmdW5jYCB3aGVuIGl0J3MgaW52b2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRlbGF5LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB3YWl0IFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIGRlbGF5IGludm9jYXRpb24uCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgYGZ1bmNgIHdpdGguCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdGltZXIgaWQuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZGVsYXkoZnVuY3Rpb24odGV4dCkgewogICAgICAgICAqICAgY29uc29sZS5sb2codGV4dCk7CiAgICAgICAgICogfSwgMTAwMCwgJ2xhdGVyJyk7CiAgICAgICAgICogLy8gPT4gTG9ncyAnbGF0ZXInIGFmdGVyIG9uZSBzZWNvbmQuCiAgICAgICAgICovCiAgICAgICAgdmFyIGRlbGF5ID0gYmFzZVJlc3QoZnVuY3Rpb24oZnVuYywgd2FpdCwgYXJncykgewogICAgICAgICAgcmV0dXJuIGJhc2VEZWxheShmdW5jLCB0b051bWJlcih3YWl0KSB8fCAwLCBhcmdzKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCBhcmd1bWVudHMgcmV2ZXJzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBmbGlwIGFyZ3VtZW50cyBmb3IuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZmxpcHBlZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGZsaXBwZWQgPSBfLmZsaXAoZnVuY3Rpb24oKSB7CiAgICAgICAgICogICByZXR1cm4gXy50b0FycmF5KGFyZ3VtZW50cyk7CiAgICAgICAgICogfSk7CiAgICAgICAgICoKICAgICAgICAgKiBmbGlwcGVkKCdhJywgJ2InLCAnYycsICdkJyk7CiAgICAgICAgICogLy8gPT4gWydkJywgJ2MnLCAnYicsICdhJ10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmbGlwKGZ1bmMpIHsKICAgICAgICAgIHJldHVybiBjcmVhdGVXcmFwKGZ1bmMsIFdSQVBfRkxJUF9GTEFHKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzCiAgICAgICAgICogcHJvdmlkZWQsIGl0IGRldGVybWluZXMgdGhlIGNhY2hlIGtleSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IGJhc2VkIG9uIHRoZQogICAgICAgICAqIGFyZ3VtZW50cyBwcm92aWRlZCB0byB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uIEJ5IGRlZmF1bHQsIHRoZSBmaXJzdCBhcmd1bWVudAogICAgICAgICAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgCiAgICAgICAgICogaXMgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24uCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkCiAgICAgICAgICogZnVuY3Rpb24uIEl0cyBjcmVhdGlvbiBtYXkgYmUgY3VzdG9taXplZCBieSByZXBsYWNpbmcgdGhlIGBfLm1lbW9pemUuQ2FjaGVgCiAgICAgICAgICogY29uc3RydWN0b3Igd2l0aCBvbmUgd2hvc2UgaW5zdGFuY2VzIGltcGxlbWVudCB0aGUKICAgICAgICAgKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KQogICAgICAgICAqIG1ldGhvZCBpbnRlcmZhY2Ugb2YgYGNsZWFyYCwgYGRlbGV0ZWAsIGBnZXRgLCBgaGFzYCwgYW5kIGBzZXRgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtyZXNvbHZlcl0gVGhlIGZ1bmN0aW9uIHRvIHJlc29sdmUgdGhlIGNhY2hlIGtleS4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTsKICAgICAgICAgKiB2YXIgb3RoZXIgPSB7ICdjJzogMywgJ2QnOiA0IH07CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTsKICAgICAgICAgKiB2YWx1ZXMob2JqZWN0KTsKICAgICAgICAgKiAvLyA9PiBbMSwgMl0KICAgICAgICAgKgogICAgICAgICAqIHZhbHVlcyhvdGhlcik7CiAgICAgICAgICogLy8gPT4gWzMsIDRdCiAgICAgICAgICoKICAgICAgICAgKiBvYmplY3QuYSA9IDI7CiAgICAgICAgICogdmFsdWVzKG9iamVjdCk7CiAgICAgICAgICogLy8gPT4gWzEsIDJdCiAgICAgICAgICoKICAgICAgICAgKiAvLyBNb2RpZnkgdGhlIHJlc3VsdCBjYWNoZS4KICAgICAgICAgKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7CiAgICAgICAgICogdmFsdWVzKG9iamVjdCk7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2InXQogICAgICAgICAqCiAgICAgICAgICogLy8gUmVwbGFjZSBgXy5tZW1vaXplLkNhY2hlYC4KICAgICAgICAgKiBfLm1lbW9pemUuQ2FjaGUgPSBXZWFrTWFwOwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1lbW9pemUoZnVuYywgcmVzb2x2ZXIpIHsKICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKEZVTkNfRVJST1JfVEVYVCk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICBrZXkgPSByZXNvbHZlciA/IHJlc29sdmVyLmFwcGx5KHRoaXMsIGFyZ3MpIDogYXJnc1swXSwKICAgICAgICAgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7CgogICAgICAgICAgICBpZiAoY2FjaGUuaGFzKGtleSkpIHsKICAgICAgICAgICAgICByZXR1cm4gY2FjaGUuZ2V0KGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgIG1lbW9pemVkLmNhY2hlID0gY2FjaGUuc2V0KGtleSwgcmVzdWx0KSB8fCBjYWNoZTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH07CiAgICAgICAgICBtZW1vaXplZC5jYWNoZSA9IG5ldyAobWVtb2l6ZS5DYWNoZSB8fCBNYXBDYWNoZSk7CiAgICAgICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBFeHBvc2UgYE1hcENhY2hlYC4KICAgICAgICBtZW1vaXplLkNhY2hlID0gTWFwQ2FjaGU7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG5lZ2F0ZXMgdGhlIHJlc3VsdCBvZiB0aGUgcHJlZGljYXRlIGBmdW5jYC4gVGhlCiAgICAgICAgICogYGZ1bmNgIHByZWRpY2F0ZSBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlCiAgICAgICAgICogY3JlYXRlZCBmdW5jdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgcHJlZGljYXRlIHRvIG5lZ2F0ZS4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBuZWdhdGVkIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBpc0V2ZW4obikgewogICAgICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXy5maWx0ZXIoWzEsIDIsIDMsIDQsIDUsIDZdLCBfLm5lZ2F0ZShpc0V2ZW4pKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMywgNV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBuZWdhdGUocHJlZGljYXRlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHByZWRpY2F0ZSAhPSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHsKICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gIXByZWRpY2F0ZS5jYWxsKHRoaXMsIGFyZ3NbMF0pOwogICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuICFwcmVkaWNhdGUuY2FsbCh0aGlzLCBhcmdzWzBdLCBhcmdzWzFdKTsKICAgICAgICAgICAgICBjYXNlIDM6IHJldHVybiAhcHJlZGljYXRlLmNhbGwodGhpcywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICFwcmVkaWNhdGUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXMgcmVzdHJpY3RlZCB0byBpbnZva2luZyBgZnVuY2Agb25jZS4gUmVwZWF0IGNhbGxzCiAgICAgICAgICogdG8gdGhlIGZ1bmN0aW9uIHJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IGludm9jYXRpb24uIFRoZSBgZnVuY2AgaXMKICAgICAgICAgKiBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIGFuZCBhcmd1bWVudHMgb2YgdGhlIGNyZWF0ZWQgZnVuY3Rpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byByZXN0cmljdC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyByZXN0cmljdGVkIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgaW5pdGlhbGl6ZSA9IF8ub25jZShjcmVhdGVBcHBsaWNhdGlvbik7CiAgICAgICAgICogaW5pdGlhbGl6ZSgpOwogICAgICAgICAqIGluaXRpYWxpemUoKTsKICAgICAgICAgKiAvLyA9PiBgY3JlYXRlQXBwbGljYXRpb25gIGlzIGludm9rZWQgb25jZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG9uY2UoZnVuYykgewogICAgICAgICAgcmV0dXJuIGJlZm9yZSgyLCBmdW5jKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggaXRzIGFyZ3VtZW50cyB0cmFuc2Zvcm1lZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHdyYXAuCiAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFt0cmFuc2Zvcm1zPVtfLmlkZW50aXR5XV0KICAgICAgICAgKiAgVGhlIGFyZ3VtZW50IHRyYW5zZm9ybXMuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIGRvdWJsZWQobikgewogICAgICAgICAqICAgcmV0dXJuIG4gKiAyOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7CiAgICAgICAgICogICByZXR1cm4gbiAqIG47CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogdmFyIGZ1bmMgPSBfLm92ZXJBcmdzKGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICAgKiAgIHJldHVybiBbeCwgeV07CiAgICAgICAgICogfSwgW3NxdWFyZSwgZG91YmxlZF0pOwogICAgICAgICAqCiAgICAgICAgICogZnVuYyg5LCAzKTsKICAgICAgICAgKiAvLyA9PiBbODEsIDZdCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jKDEwLCA1KTsKICAgICAgICAgKiAvLyA9PiBbMTAwLCAxMF0KICAgICAgICAgKi8KICAgICAgICB2YXIgb3ZlckFyZ3MgPSBjYXN0UmVzdChmdW5jdGlvbihmdW5jLCB0cmFuc2Zvcm1zKSB7CiAgICAgICAgICB0cmFuc2Zvcm1zID0gKHRyYW5zZm9ybXMubGVuZ3RoID09IDEgJiYgaXNBcnJheSh0cmFuc2Zvcm1zWzBdKSkKICAgICAgICAgICAgPyBhcnJheU1hcCh0cmFuc2Zvcm1zWzBdLCBiYXNlVW5hcnkoZ2V0SXRlcmF0ZWUoKSkpCiAgICAgICAgICAgIDogYXJyYXlNYXAoYmFzZUZsYXR0ZW4odHJhbnNmb3JtcywgMSksIGJhc2VVbmFyeShnZXRJdGVyYXRlZSgpKSk7CgogICAgICAgICAgdmFyIGZ1bmNzTGVuZ3RoID0gdHJhbnNmb3Jtcy5sZW5ndGg7CiAgICAgICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykgewogICAgICAgICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihhcmdzLmxlbmd0aCwgZnVuY3NMZW5ndGgpOwoKICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgICBhcmdzW2luZGV4XSA9IHRyYW5zZm9ybXNbaW5kZXhdLmNhbGwodGhpcywgYXJnc1tpbmRleF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcHBseShmdW5jLCB0aGlzLCBhcmdzKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGBwYXJ0aWFsc2AgcHJlcGVuZGVkIHRvIHRoZQogICAgICAgICAqIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4gVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5iaW5kYCBleGNlcHQgaXQgZG9lcyAqKm5vdCoqCiAgICAgICAgICogYWx0ZXIgdGhlIGB0aGlzYCBiaW5kaW5nLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGBfLnBhcnRpYWwucGxhY2Vob2xkZXJgIHZhbHVlLCB3aGljaCBkZWZhdWx0cyB0byBgX2AgaW4gbW9ub2xpdGhpYwogICAgICAgICAqIGJ1aWxkcywgbWF5IGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlciBmb3IgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGRvZXNuJ3Qgc2V0IHRoZSAibGVuZ3RoIiBwcm9wZXJ0eSBvZiBwYXJ0aWFsbHkKICAgICAgICAgKiBhcHBsaWVkIGZ1bmN0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjIuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHBhcnRpYWxseSBhcHBseSBhcmd1bWVudHMgdG8uCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbcGFydGlhbHNdIFRoZSBhcmd1bWVudHMgdG8gYmUgcGFydGlhbGx5IGFwcGxpZWQuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFydGlhbGx5IGFwcGxpZWQgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIGdyZWV0KGdyZWV0aW5nLCBuYW1lKSB7CiAgICAgICAgICogICByZXR1cm4gZ3JlZXRpbmcgKyAnICcgKyBuYW1lOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciBzYXlIZWxsb1RvID0gXy5wYXJ0aWFsKGdyZWV0LCAnaGVsbG8nKTsKICAgICAgICAgKiBzYXlIZWxsb1RvKCdmcmVkJyk7CiAgICAgICAgICogLy8gPT4gJ2hlbGxvIGZyZWQnCiAgICAgICAgICoKICAgICAgICAgKiAvLyBQYXJ0aWFsbHkgYXBwbGllZCB3aXRoIHBsYWNlaG9sZGVycy4KICAgICAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsKGdyZWV0LCBfLCAnZnJlZCcpOwogICAgICAgICAqIGdyZWV0RnJlZCgnaGknKTsKICAgICAgICAgKiAvLyA9PiAnaGkgZnJlZCcKICAgICAgICAgKi8KICAgICAgICB2YXIgcGFydGlhbCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGZ1bmMsIHBhcnRpYWxzKSB7CiAgICAgICAgICB2YXIgaG9sZGVycyA9IHJlcGxhY2VIb2xkZXJzKHBhcnRpYWxzLCBnZXRIb2xkZXIocGFydGlhbCkpOwogICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX0ZMQUcsIHVuZGVmaW5lZCQxLCBwYXJ0aWFscywgaG9sZGVycyk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ucGFydGlhbGAgZXhjZXB0IHRoYXQgcGFydGlhbGx5IGFwcGxpZWQgYXJndW1lbnRzCiAgICAgICAgICogYXJlIGFwcGVuZGVkIHRvIHRoZSBhcmd1bWVudHMgaXQgcmVjZWl2ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgYF8ucGFydGlhbFJpZ2h0LnBsYWNlaG9sZGVyYCB2YWx1ZSwgd2hpY2ggZGVmYXVsdHMgdG8gYF9gIGluIG1vbm9saXRoaWMKICAgICAgICAgKiBidWlsZHMsIG1heSBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgZm9yIHBhcnRpYWxseSBhcHBsaWVkIGFyZ3VtZW50cy4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBkb2Vzbid0IHNldCB0aGUgImxlbmd0aCIgcHJvcGVydHkgb2YgcGFydGlhbGx5CiAgICAgICAgICogYXBwbGllZCBmdW5jdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMS4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBwYXJ0aWFsbHkgYXBwbHkgYXJndW1lbnRzIHRvLgogICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW3BhcnRpYWxzXSBUaGUgYXJndW1lbnRzIHRvIGJlIHBhcnRpYWxseSBhcHBsaWVkLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHBhcnRpYWxseSBhcHBsaWVkIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBncmVldChncmVldGluZywgbmFtZSkgewogICAgICAgICAqICAgcmV0dXJuIGdyZWV0aW5nICsgJyAnICsgbmFtZTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZ3JlZXRGcmVkID0gXy5wYXJ0aWFsUmlnaHQoZ3JlZXQsICdmcmVkJyk7CiAgICAgICAgICogZ3JlZXRGcmVkKCdoaScpOwogICAgICAgICAqIC8vID0+ICdoaSBmcmVkJwogICAgICAgICAqCiAgICAgICAgICogLy8gUGFydGlhbGx5IGFwcGxpZWQgd2l0aCBwbGFjZWhvbGRlcnMuCiAgICAgICAgICogdmFyIHNheUhlbGxvVG8gPSBfLnBhcnRpYWxSaWdodChncmVldCwgJ2hlbGxvJywgXyk7CiAgICAgICAgICogc2F5SGVsbG9UbygnZnJlZCcpOwogICAgICAgICAqIC8vID0+ICdoZWxsbyBmcmVkJwogICAgICAgICAqLwogICAgICAgIHZhciBwYXJ0aWFsUmlnaHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBwYXJ0aWFscykgewogICAgICAgICAgdmFyIGhvbGRlcnMgPSByZXBsYWNlSG9sZGVycyhwYXJ0aWFscywgZ2V0SG9sZGVyKHBhcnRpYWxSaWdodCkpOwogICAgICAgICAgcmV0dXJuIGNyZWF0ZVdyYXAoZnVuYywgV1JBUF9QQVJUSUFMX1JJR0hUX0ZMQUcsIHVuZGVmaW5lZCQxLCBwYXJ0aWFscywgaG9sZGVycyk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggYXJndW1lbnRzIGFycmFuZ2VkIGFjY29yZGluZwogICAgICAgICAqIHRvIHRoZSBzcGVjaWZpZWQgYGluZGV4ZXNgIHdoZXJlIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgZmlyc3QgaW5kZXggaXMKICAgICAgICAgKiBwcm92aWRlZCBhcyB0aGUgZmlyc3QgYXJndW1lbnQsIHRoZSBhcmd1bWVudCB2YWx1ZSBhdCB0aGUgc2Vjb25kIGluZGV4IGlzCiAgICAgICAgICogcHJvdmlkZWQgYXMgdGhlIHNlY29uZCBhcmd1bWVudCwgYW5kIHNvIG9uLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gcmVhcnJhbmdlIGFyZ3VtZW50cyBmb3IuCiAgICAgICAgICogQHBhcmFtIHsuLi4obnVtYmVyfG51bWJlcltdKX0gaW5kZXhlcyBUaGUgYXJyYW5nZWQgYXJndW1lbnQgaW5kZXhlcy4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHJlYXJnZWQgPSBfLnJlYXJnKGZ1bmN0aW9uKGEsIGIsIGMpIHsKICAgICAgICAgKiAgIHJldHVybiBbYSwgYiwgY107CiAgICAgICAgICogfSwgWzIsIDAsIDFdKTsKICAgICAgICAgKgogICAgICAgICAqIHJlYXJnZWQoJ2InLCAnYycsICdhJykKICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10KICAgICAgICAgKi8KICAgICAgICB2YXIgcmVhcmcgPSBmbGF0UmVzdChmdW5jdGlvbihmdW5jLCBpbmRleGVzKSB7CiAgICAgICAgICByZXR1cm4gY3JlYXRlV3JhcChmdW5jLCBXUkFQX1JFQVJHX0ZMQUcsIHVuZGVmaW5lZCQxLCB1bmRlZmluZWQkMSwgdW5kZWZpbmVkJDEsIGluZGV4ZXMpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiB0aGUKICAgICAgICAgKiBjcmVhdGVkIGZ1bmN0aW9uIGFuZCBhcmd1bWVudHMgZnJvbSBgc3RhcnRgIGFuZCBiZXlvbmQgcHJvdmlkZWQgYXMKICAgICAgICAgKiBhbiBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUKICAgICAgICAgKiBbcmVzdCBwYXJhbWV0ZXJdKGh0dHBzOi8vbWRuLmlvL3Jlc3RfcGFyYW1ldGVycykuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9ZnVuYy5sZW5ndGgtMV0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSByZXN0IHBhcmFtZXRlci4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHNheSA9IF8ucmVzdChmdW5jdGlvbih3aGF0LCBuYW1lcykgewogICAgICAgICAqICAgcmV0dXJuIHdoYXQgKyAnICcgKyBfLmluaXRpYWwobmFtZXMpLmpvaW4oJywgJykgKwogICAgICAgICAqICAgICAoXy5zaXplKG5hbWVzKSA+IDEgPyAnLCAmICcgOiAnJykgKyBfLmxhc3QobmFtZXMpOwogICAgICAgICAqIH0pOwogICAgICAgICAqCiAgICAgICAgICogc2F5KCdoZWxsbycsICdmcmVkJywgJ2Jhcm5leScsICdwZWJibGVzJyk7CiAgICAgICAgICogLy8gPT4gJ2hlbGxvIGZyZWQsIGJhcm5leSwgJiBwZWJibGVzJwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlc3QoZnVuYywgc3RhcnQpIHsKICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgPT09IHVuZGVmaW5lZCQxID8gc3RhcnQgOiB0b0ludGVnZXIoc3RhcnQpOwogICAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmMsIHN0YXJ0KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYGZ1bmNgIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZQogICAgICAgICAqIGNyZWF0ZSBmdW5jdGlvbiBhbmQgYW4gYXJyYXkgb2YgYXJndW1lbnRzIG11Y2ggbGlrZQogICAgICAgICAqIFtgRnVuY3Rpb24jYXBwbHlgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5KS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbiB0aGUKICAgICAgICAgKiBbc3ByZWFkIG9wZXJhdG9yXShodHRwczovL21kbi5pby9zcHJlYWRfb3BlcmF0b3IpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMi4wCiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gc3ByZWFkIGFyZ3VtZW50cyBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbc3RhcnQ9MF0gVGhlIHN0YXJ0IHBvc2l0aW9uIG9mIHRoZSBzcHJlYWQuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBzYXkgPSBfLnNwcmVhZChmdW5jdGlvbih3aG8sIHdoYXQpIHsKICAgICAgICAgKiAgIHJldHVybiB3aG8gKyAnIHNheXMgJyArIHdoYXQ7CiAgICAgICAgICogfSk7CiAgICAgICAgICoKICAgICAgICAgKiBzYXkoWydmcmVkJywgJ2hlbGxvJ10pOwogICAgICAgICAqIC8vID0+ICdmcmVkIHNheXMgaGVsbG8nCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgbnVtYmVycyA9IFByb21pc2UuYWxsKFsKICAgICAgICAgKiAgIFByb21pc2UucmVzb2x2ZSg0MCksCiAgICAgICAgICogICBQcm9taXNlLnJlc29sdmUoMzYpCiAgICAgICAgICogXSk7CiAgICAgICAgICoKICAgICAgICAgKiBudW1iZXJzLnRoZW4oXy5zcHJlYWQoZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAqICAgcmV0dXJuIHggKyB5OwogICAgICAgICAqIH0pKTsKICAgICAgICAgKiAvLyA9PiBhIFByb21pc2Ugb2YgNzYKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzcHJlYWQoZnVuYywgc3RhcnQpIHsKICAgICAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKICAgICAgICAgIH0KICAgICAgICAgIHN0YXJ0ID0gc3RhcnQgPT0gbnVsbCA/IDAgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKHN0YXJ0KSwgMCk7CiAgICAgICAgICByZXR1cm4gYmFzZVJlc3QoZnVuY3Rpb24oYXJncykgewogICAgICAgICAgICB2YXIgYXJyYXkgPSBhcmdzW3N0YXJ0XSwKICAgICAgICAgICAgICAgIG90aGVyQXJncyA9IGNhc3RTbGljZShhcmdzLCAwLCBzdGFydCk7CgogICAgICAgICAgICBpZiAoYXJyYXkpIHsKICAgICAgICAgICAgICBhcnJheVB1c2gob3RoZXJBcmdzLCBhcnJheSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGZ1bmMsIHRoaXMsIG90aGVyQXJncyk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB0aHJvdHRsZWQgZnVuY3Rpb24gdGhhdCBvbmx5IGludm9rZXMgYGZ1bmNgIGF0IG1vc3Qgb25jZSBwZXIKICAgICAgICAgKiBldmVyeSBgd2FpdGAgbWlsbGlzZWNvbmRzLiBUaGUgdGhyb3R0bGVkIGZ1bmN0aW9uIGNvbWVzIHdpdGggYSBgY2FuY2VsYAogICAgICAgICAqIG1ldGhvZCB0byBjYW5jZWwgZGVsYXllZCBgZnVuY2AgaW52b2NhdGlvbnMgYW5kIGEgYGZsdXNoYCBtZXRob2QgdG8KICAgICAgICAgKiBpbW1lZGlhdGVseSBpbnZva2UgdGhlbS4gUHJvdmlkZSBgb3B0aW9uc2AgdG8gaW5kaWNhdGUgd2hldGhlciBgZnVuY2AKICAgICAgICAgKiBzaG91bGQgYmUgaW52b2tlZCBvbiB0aGUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgZWRnZSBvZiB0aGUgYHdhaXRgCiAgICAgICAgICogdGltZW91dC4gVGhlIGBmdW5jYCBpcyBpbnZva2VkIHdpdGggdGhlIGxhc3QgYXJndW1lbnRzIHByb3ZpZGVkIHRvIHRoZQogICAgICAgICAqIHRocm90dGxlZCBmdW5jdGlvbi4gU3Vic2VxdWVudCBjYWxscyB0byB0aGUgdGhyb3R0bGVkIGZ1bmN0aW9uIHJldHVybiB0aGUKICAgICAgICAgKiByZXN1bHQgb2YgdGhlIGxhc3QgYGZ1bmNgIGludm9jYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogSWYgYGxlYWRpbmdgIGFuZCBgdHJhaWxpbmdgIG9wdGlvbnMgYXJlIGB0cnVlYCwgYGZ1bmNgIGlzCiAgICAgICAgICogaW52b2tlZCBvbiB0aGUgdHJhaWxpbmcgZWRnZSBvZiB0aGUgdGltZW91dCBvbmx5IGlmIHRoZSB0aHJvdHRsZWQgZnVuY3Rpb24KICAgICAgICAgKiBpcyBpbnZva2VkIG1vcmUgdGhhbiBvbmNlIGR1cmluZyB0aGUgYHdhaXRgIHRpbWVvdXQuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBgd2FpdGAgaXMgYDBgIGFuZCBgbGVhZGluZ2AgaXMgYGZhbHNlYCwgYGZ1bmNgIGludm9jYXRpb24gaXMgZGVmZXJyZWQKICAgICAgICAgKiB1bnRpbCB0byB0aGUgbmV4dCB0aWNrLCBzaW1pbGFyIHRvIGBzZXRUaW1lb3V0YCB3aXRoIGEgdGltZW91dCBvZiBgMGAuCiAgICAgICAgICoKICAgICAgICAgKiBTZWUgW0RhdmlkIENvcmJhY2hvJ3MgYXJ0aWNsZV0oaHR0cHM6Ly9jc3MtdHJpY2tzLmNvbS9kZWJvdW5jaW5nLXRocm90dGxpbmctZXhwbGFpbmVkLWV4YW1wbGVzLykKICAgICAgICAgKiBmb3IgZGV0YWlscyBvdmVyIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGBfLnRocm90dGxlYCBhbmQgYF8uZGVib3VuY2VgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gdGhyb3R0bGUuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt3YWl0PTBdIFRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHRocm90dGxlIGludm9jYXRpb25zIHRvLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW29wdGlvbnMubGVhZGluZz10cnVlXQogICAgICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSBsZWFkaW5nIGVkZ2Ugb2YgdGhlIHRpbWVvdXQuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy50cmFpbGluZz10cnVlXQogICAgICAgICAqICBTcGVjaWZ5IGludm9raW5nIG9uIHRoZSB0cmFpbGluZyBlZGdlIG9mIHRoZSB0aW1lb3V0LgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHRocm90dGxlZCBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogLy8gQXZvaWQgZXhjZXNzaXZlbHkgdXBkYXRpbmcgdGhlIHBvc2l0aW9uIHdoaWxlIHNjcm9sbGluZy4KICAgICAgICAgKiBqUXVlcnkod2luZG93KS5vbignc2Nyb2xsJywgXy50aHJvdHRsZSh1cGRhdGVQb3NpdGlvbiwgMTAwKSk7CiAgICAgICAgICoKICAgICAgICAgKiAvLyBJbnZva2UgYHJlbmV3VG9rZW5gIHdoZW4gdGhlIGNsaWNrIGV2ZW50IGlzIGZpcmVkLCBidXQgbm90IG1vcmUgdGhhbiBvbmNlIGV2ZXJ5IDUgbWludXRlcy4KICAgICAgICAgKiB2YXIgdGhyb3R0bGVkID0gXy50aHJvdHRsZShyZW5ld1Rva2VuLCAzMDAwMDAsIHsgJ3RyYWlsaW5nJzogZmFsc2UgfSk7CiAgICAgICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHRocm90dGxlZCk7CiAgICAgICAgICoKICAgICAgICAgKiAvLyBDYW5jZWwgdGhlIHRyYWlsaW5nIHRocm90dGxlZCBpbnZvY2F0aW9uLgogICAgICAgICAqIGpRdWVyeSh3aW5kb3cpLm9uKCdwb3BzdGF0ZScsIHRocm90dGxlZC5jYW5jZWwpOwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRocm90dGxlKGZ1bmMsIHdhaXQsIG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBsZWFkaW5nID0gdHJ1ZSwKICAgICAgICAgICAgICB0cmFpbGluZyA9IHRydWU7CgogICAgICAgICAgaWYgKHR5cGVvZiBmdW5jICE9ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihGVU5DX0VSUk9SX1RFWFQpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzT2JqZWN0KG9wdGlvbnMpKSB7CiAgICAgICAgICAgIGxlYWRpbmcgPSAnbGVhZGluZycgaW4gb3B0aW9ucyA/ICEhb3B0aW9ucy5sZWFkaW5nIDogbGVhZGluZzsKICAgICAgICAgICAgdHJhaWxpbmcgPSAndHJhaWxpbmcnIGluIG9wdGlvbnMgPyAhIW9wdGlvbnMudHJhaWxpbmcgOiB0cmFpbGluZzsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBkZWJvdW5jZShmdW5jLCB3YWl0LCB7CiAgICAgICAgICAgICdsZWFkaW5nJzogbGVhZGluZywKICAgICAgICAgICAgJ21heFdhaXQnOiB3YWl0LAogICAgICAgICAgICAndHJhaWxpbmcnOiB0cmFpbGluZwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBhY2NlcHRzIHVwIHRvIG9uZSBhcmd1bWVudCwgaWdub3JpbmcgYW55CiAgICAgICAgICogYWRkaXRpb25hbCBhcmd1bWVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgRnVuY3Rpb24KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBjYXAgYXJndW1lbnRzIGZvci4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjYXBwZWQgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ubWFwKFsnNicsICc4JywgJzEwJ10sIF8udW5hcnkocGFyc2VJbnQpKTsKICAgICAgICAgKiAvLyA9PiBbNiwgOCwgMTBdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdW5hcnkoZnVuYykgewogICAgICAgICAgcmV0dXJuIGFyeShmdW5jLCAxKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHByb3ZpZGVzIGB2YWx1ZWAgdG8gYHdyYXBwZXJgIGFzIGl0cyBmaXJzdAogICAgICAgICAqIGFyZ3VtZW50LiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIGZ1bmN0aW9uIGFyZSBhcHBlbmRlZAogICAgICAgICAqIHRvIHRob3NlIHByb3ZpZGVkIHRvIHRoZSBgd3JhcHBlcmAuIFRoZSB3cmFwcGVyIGlzIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgCiAgICAgICAgICogYmluZGluZyBvZiB0aGUgY3JlYXRlZCBmdW5jdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBGdW5jdGlvbgogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyYXAuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3dyYXBwZXI9aWRlbnRpdHldIFRoZSB3cmFwcGVyIGZ1bmN0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgcCA9IF8ud3JhcChfLmVzY2FwZSwgZnVuY3Rpb24oZnVuYywgdGV4dCkgewogICAgICAgICAqICAgcmV0dXJuICc8cD4nICsgZnVuYyh0ZXh0KSArICc8L3A+JzsKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIHAoJ2ZyZWQsIGJhcm5leSwgJiBwZWJibGVzJyk7CiAgICAgICAgICogLy8gPT4gJzxwPmZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlczwvcD4nCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gd3JhcCh2YWx1ZSwgd3JhcHBlcikgewogICAgICAgICAgcmV0dXJuIHBhcnRpYWwoY2FzdEZ1bmN0aW9uKHdyYXBwZXIpLCB2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIC8qKgogICAgICAgICAqIENhc3RzIGB2YWx1ZWAgYXMgYW4gYXJyYXkgaWYgaXQncyBub3Qgb25lLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuNC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBpbnNwZWN0LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY2FzdCBhcnJheS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5jYXN0QXJyYXkoMSk7CiAgICAgICAgICogLy8gPT4gWzFdCiAgICAgICAgICoKICAgICAgICAgKiBfLmNhc3RBcnJheSh7ICdhJzogMSB9KTsKICAgICAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfV0KICAgICAgICAgKgogICAgICAgICAqIF8uY2FzdEFycmF5KCdhYmMnKTsKICAgICAgICAgKiAvLyA9PiBbJ2FiYyddCiAgICAgICAgICoKICAgICAgICAgKiBfLmNhc3RBcnJheShudWxsKTsKICAgICAgICAgKiAvLyA9PiBbbnVsbF0KICAgICAgICAgKgogICAgICAgICAqIF8uY2FzdEFycmF5KHVuZGVmaW5lZCk7CiAgICAgICAgICogLy8gPT4gW3VuZGVmaW5lZF0KICAgICAgICAgKgogICAgICAgICAqIF8uY2FzdEFycmF5KCk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheSA9IFsxLCAyLCAzXTsKICAgICAgICAgKiBjb25zb2xlLmxvZyhfLmNhc3RBcnJheShhcnJheSkgPT09IGFycmF5KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2FzdEFycmF5KCkgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB2YWx1ZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgIHJldHVybiBpc0FycmF5KHZhbHVlKSA/IHZhbHVlIDogW3ZhbHVlXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbiB0aGUKICAgICAgICAgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKQogICAgICAgICAqIGFuZCBzdXBwb3J0cyBjbG9uaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsIGRhdGUgb2JqZWN0cywgbWFwcywKICAgICAgICAgKiBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLCBzZXRzLCBzdHJpbmdzLCBzeW1ib2xzLCBhbmQgdHlwZWQKICAgICAgICAgKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZAogICAgICAgICAqIGFzIHBsYWluIG9iamVjdHMuIEFuIGVtcHR5IG9iamVjdCBpcyByZXR1cm5lZCBmb3IgdW5jbG9uZWFibGUgdmFsdWVzIHN1Y2gKICAgICAgICAgKiBhcyBlcnJvciBvYmplY3RzLCBmdW5jdGlvbnMsIERPTSBub2RlcywgYW5kIFdlYWtNYXBzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLgogICAgICAgICAqIEBzZWUgXy5jbG9uZURlZXAKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7CiAgICAgICAgICogY29uc29sZS5sb2coc2hhbGxvd1swXSA9PT0gb2JqZWN0c1swXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNsb25lKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2gKICAgICAgICAgKiBpcyBpbnZva2VkIHRvIHByb2R1Y2UgdGhlIGNsb25lZCB2YWx1ZS4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsCiAgICAgICAgICogY2xvbmluZyBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGgKICAgICAgICAgKiB1cCB0byBmb3VyIGFyZ3VtZW50czsgKHZhbHVlIFssIGluZGV4fGtleSwgb2JqZWN0LCBzdGFja10pLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuCiAgICAgICAgICogQHNlZSBfLmNsb25lRGVlcFdpdGgKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gY3VzdG9taXplcih2YWx1ZSkgewogICAgICAgICAqICAgaWYgKF8uaXNFbGVtZW50KHZhbHVlKSkgewogICAgICAgICAqICAgICByZXR1cm4gdmFsdWUuY2xvbmVOb2RlKGZhbHNlKTsKICAgICAgICAgKiAgIH0KICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZWwgPSBfLmNsb25lV2l0aChkb2N1bWVudC5ib2R5LCBjdXN0b21pemVyKTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGVsID09PSBkb2N1bWVudC5ib2R5KTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqIGNvbnNvbGUubG9nKGVsLm5vZGVOYW1lKTsKICAgICAgICAgKiAvLyA9PiAnQk9EWScKICAgICAgICAgKiBjb25zb2xlLmxvZyhlbC5jaGlsZE5vZGVzLmxlbmd0aCk7CiAgICAgICAgICogLy8gPT4gMAogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGNsb25lV2l0aCh2YWx1ZSwgY3VzdG9taXplcikgewogICAgICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkJDE7CiAgICAgICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZWAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgY2xvbmVzIGB2YWx1ZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMS4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHJlY3Vyc2l2ZWx5IGNsb25lLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS4KICAgICAgICAgKiBAc2VlIF8uY2xvbmUKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZGVlcCA9IF8uY2xvbmVEZWVwKG9iamVjdHMpOwogICAgICAgICAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5jbG9uZVdpdGhgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGNsb25lcyBgdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZWN1cnNpdmVseSBjbG9uZS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjbG9uaW5nLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBkZWVwIGNsb25lZCB2YWx1ZS4KICAgICAgICAgKiBAc2VlIF8uY2xvbmVXaXRoCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIodmFsdWUpIHsKICAgICAgICAgKiAgIGlmIChfLmlzRWxlbWVudCh2YWx1ZSkpIHsKICAgICAgICAgKiAgICAgcmV0dXJuIHZhbHVlLmNsb25lTm9kZSh0cnVlKTsKICAgICAgICAgKiAgIH0KICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZWwgPSBfLmNsb25lRGVlcFdpdGgoZG9jdW1lbnQuYm9keSwgY3VzdG9taXplcik7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhlbCA9PT0gZG9jdW1lbnQuYm9keSk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKiBjb25zb2xlLmxvZyhlbC5ub2RlTmFtZSk7CiAgICAgICAgICogLy8gPT4gJ0JPRFknCiAgICAgICAgICogY29uc29sZS5sb2coZWwuY2hpbGROb2Rlcy5sZW5ndGgpOwogICAgICAgICAqIC8vID0+IDIwCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2xvbmVEZWVwV2l0aCh2YWx1ZSwgY3VzdG9taXplcikgewogICAgICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkJDE7CiAgICAgICAgICByZXR1cm4gYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUcgfCBDTE9ORV9TWU1CT0xTX0ZMQUcsIGN1c3RvbWl6ZXIpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGBvYmplY3RgIGNvbmZvcm1zIHRvIGBzb3VyY2VgIGJ5IGludm9raW5nIHRoZSBwcmVkaWNhdGUKICAgICAgICAgKiBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgcHJvcGVydHkgdmFsdWVzIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYF8uY29uZm9ybXNgIHdoZW4gYHNvdXJjZWAgaXMKICAgICAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjE0LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBvYmplY3RgIGNvbmZvcm1zLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAyIH07CiAgICAgICAgICoKICAgICAgICAgKiBfLmNvbmZvcm1zVG8ob2JqZWN0LCB7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5jb25mb3Jtc1RvKG9iamVjdCwgeyAnYic6IGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPiAyOyB9IH0pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29uZm9ybXNUbyhvYmplY3QsIHNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIHNvdXJjZSA9PSBudWxsIHx8IGJhc2VDb25mb3Jtc1RvKG9iamVjdCwgc291cmNlLCBrZXlzKHNvdXJjZSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYQogICAgICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgICAgICogY29tcGFyaXNvbiBiZXR3ZWVuIHR3byB2YWx1ZXMgdG8gZGV0ZXJtaW5lIGlmIHRoZXkgYXJlIGVxdWl2YWxlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEgfTsKICAgICAgICAgKiB2YXIgb3RoZXIgPSB7ICdhJzogMSB9OwogICAgICAgICAqCiAgICAgICAgICogXy5lcShvYmplY3QsIG9iamVjdCk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5lcShvYmplY3QsIG90aGVyKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5lcSgnYScsICdhJyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5lcSgnYScsIE9iamVjdCgnYScpKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5lcShOYU4sIE5hTik7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGVxKHZhbHVlLCBvdGhlcikgewogICAgICAgICAgcmV0dXJuIHZhbHVlID09PSBvdGhlciB8fCAodmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gYG90aGVyYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjkuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGdyZWF0ZXIgdGhhbiBgb3RoZXJgLAogICAgICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQHNlZSBfLmx0CiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZ3QoMywgMSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5ndCgzLCAzKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5ndCgxLCAzKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBndCA9IGNyZWF0ZVJlbGF0aW9uYWxPcGVyYXRpb24oYmFzZUd0KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIGBvdGhlcmAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy45LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8KICAgICAgICAgKiAgYG90aGVyYCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBzZWUgXy5sdGUKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5ndGUoMywgMSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5ndGUoMywgMyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5ndGUoMSwgMyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICB2YXIgZ3RlID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihmdW5jdGlvbih2YWx1ZSwgb3RoZXIpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZSA+PSBvdGhlcjsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgbGlrZWx5IGFuIGBhcmd1bWVudHNgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LAogICAgICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgdmFyIGlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzKGZ1bmN0aW9uKCkgeyByZXR1cm4gYXJndW1lbnRzOyB9KCkpID8gYmFzZUlzQXJndW1lbnRzIDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsICdjYWxsZWUnKSAmJgogICAgICAgICAgICAhcHJvcGVydHlJc0VudW1lcmFibGUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpOwogICAgICAgIH07CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNBcnJheShbMSwgMiwgM10pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNBcnJheShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FycmF5KCdhYmMnKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FycmF5KF8ubm9vcCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICB2YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXk7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5QnVmZmVyYCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4zLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGFycmF5IGJ1ZmZlciwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5QnVmZmVyKDIpKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlCdWZmZXIobmV3IEFycmF5KDIpKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBpc0FycmF5QnVmZmVyID0gbm9kZUlzQXJyYXlCdWZmZXIgPyBiYXNlVW5hcnkobm9kZUlzQXJyYXlCdWZmZXIpIDogYmFzZUlzQXJyYXlCdWZmZXI7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFycmF5LWxpa2UuIEEgdmFsdWUgaXMgY29uc2lkZXJlZCBhcnJheS1saWtlIGlmIGl0J3MKICAgICAgICAgKiBub3QgYSBmdW5jdGlvbiBhbmQgaGFzIGEgYHZhbHVlLmxlbmd0aGAgdGhhdCdzIGFuIGludGVnZXIgZ3JlYXRlciB0aGFuIG9yCiAgICAgICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZSwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlMaWtlKFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FycmF5TGlrZShkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlMaWtlKCdhYmMnKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlMaWtlKF8ubm9vcCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc0FycmF5TGlrZSh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgJiYgaXNMZW5ndGgodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbih2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmlzQXJyYXlMaWtlYCBleGNlcHQgdGhhdCBpdCBhbHNvIGNoZWNrcyBpZiBgdmFsdWVgCiAgICAgICAgICogaXMgYW4gb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCwKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FycmF5TGlrZU9iamVjdChkb2N1bWVudC5ib2R5LmNoaWxkcmVuKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KCdhYmMnKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0FycmF5TGlrZU9iamVjdChfLm5vb3ApOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNBcnJheUxpa2VPYmplY3QodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGlzQXJyYXlMaWtlKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBib29sZWFuIHByaW1pdGl2ZSBvciBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgYm9vbGVhbiwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQm9vbGVhbihmYWxzZSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0Jvb2xlYW4obnVsbCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc0Jvb2xlYW4odmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2UgfHwKICAgICAgICAgICAgKGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gYm9vbFRhZyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIGJ1ZmZlci4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjMuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBEYXRlYCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZGF0ZSBvYmplY3QsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0RhdGUobmV3IERhdGUpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNEYXRlKCdNb24gQXByaWwgMjMgMjAxMicpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgdmFyIGlzRGF0ZSA9IG5vZGVJc0RhdGUgPyBiYXNlVW5hcnkobm9kZUlzRGF0ZSkgOiBiYXNlSXNEYXRlOwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBET00gZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBET00gZWxlbWVudCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRWxlbWVudChkb2N1bWVudC5ib2R5KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRWxlbWVudCgnPGJvZHk+Jyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc0VsZW1lbnQodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIHZhbHVlLm5vZGVUeXBlID09PSAxICYmICFpc1BsYWluT2JqZWN0KHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGFuIGVtcHR5IG9iamVjdCwgY29sbGVjdGlvbiwgbWFwLCBvciBzZXQuCiAgICAgICAgICoKICAgICAgICAgKiBPYmplY3RzIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBubyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQKICAgICAgICAgKiBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQXJyYXktbGlrZSB2YWx1ZXMgc3VjaCBhcyBgYXJndW1lbnRzYCBvYmplY3RzLCBhcnJheXMsIGJ1ZmZlcnMsIHN0cmluZ3MsIG9yCiAgICAgICAgICogalF1ZXJ5LWxpa2UgY29sbGVjdGlvbnMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIGEgYGxlbmd0aGAgb2YgYDBgLgogICAgICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBlbXB0eSwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRW1wdHkobnVsbCk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0VtcHR5KHRydWUpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNFbXB0eSgxKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRW1wdHkoWzEsIDIsIDNdKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0VtcHR5KHsgJ2EnOiAxIH0pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNFbXB0eSh2YWx1ZSkgewogICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNBcnJheUxpa2UodmFsdWUpICYmCiAgICAgICAgICAgICAgKGlzQXJyYXkodmFsdWUpIHx8IHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJyB8fCB0eXBlb2YgdmFsdWUuc3BsaWNlID09ICdmdW5jdGlvbicgfHwKICAgICAgICAgICAgICAgIGlzQnVmZmVyKHZhbHVlKSB8fCBpc1R5cGVkQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzKHZhbHVlKSkpIHsKICAgICAgICAgICAgcmV0dXJuICF2YWx1ZS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgdGFnID0gZ2V0VGFnKHZhbHVlKTsKICAgICAgICAgIGlmICh0YWcgPT0gbWFwVGFnIHx8IHRhZyA9PSBzZXRUYWcpIHsKICAgICAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzUHJvdG90eXBlKHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gIWJhc2VLZXlzKHZhbHVlKS5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHsKICAgICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIGtleSkpIHsKICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZQogICAgICAgICAqIGVxdWl2YWxlbnQuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2Qgc3VwcG9ydHMgY29tcGFyaW5nIGFycmF5cywgYXJyYXkgYnVmZmVycywgYm9vbGVhbnMsCiAgICAgICAgICogZGF0ZSBvYmplY3RzLCBlcnJvciBvYmplY3RzLCBtYXBzLCBudW1iZXJzLCBgT2JqZWN0YCBvYmplY3RzLCByZWdleGVzLAogICAgICAgICAqIHNldHMsIHN0cmluZ3MsIHN5bWJvbHMsIGFuZCB0eXBlZCBhcnJheXMuIGBPYmplY3RgIG9iamVjdHMgYXJlIGNvbXBhcmVkCiAgICAgICAgICogYnkgdGhlaXIgb3duLCBub3QgaW5oZXJpdGVkLCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuIEZ1bmN0aW9ucyBhbmQgRE9NCiAgICAgICAgICogbm9kZXMgYXJlIGNvbXBhcmVkIGJ5IHN0cmljdCBlcXVhbGl0eSwgaS5lLiBgPT09YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9OwogICAgICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiAxIH07CiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRXF1YWwob2JqZWN0LCBvdGhlcik7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogb2JqZWN0ID09PSBvdGhlcjsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzRXF1YWwodmFsdWUsIG90aGVyKSB7CiAgICAgICAgICByZXR1cm4gYmFzZUlzRXF1YWwodmFsdWUsIG90aGVyKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNFcXVhbGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2gKICAgICAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnMKICAgICAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIHVwIHRvCiAgICAgICAgICogc2l4IGFyZ3VtZW50czogKG9ialZhbHVlLCBvdGhWYWx1ZSBbLCBpbmRleHxrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrXSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIHZhbHVlcyBhcmUgZXF1aXZhbGVudCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBpc0dyZWV0aW5nKHZhbHVlKSB7CiAgICAgICAgICogICByZXR1cm4gL15oKD86aXxlbGxvKSQvLnRlc3QodmFsdWUpOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlKSB7CiAgICAgICAgICogICBpZiAoaXNHcmVldGluZyhvYmpWYWx1ZSkgJiYgaXNHcmVldGluZyhvdGhWYWx1ZSkpIHsKICAgICAgICAgKiAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICogICB9CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFycmF5ID0gWydoZWxsbycsICdnb29kYnllJ107CiAgICAgICAgICogdmFyIG90aGVyID0gWydoaScsICdnb29kYnllJ107CiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRXF1YWxXaXRoKGFycmF5LCBvdGhlciwgY3VzdG9taXplcik7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzRXF1YWxXaXRoKHZhbHVlLCBvdGhlciwgY3VzdG9taXplcikgewogICAgICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkJDE7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIodmFsdWUsIG90aGVyKSA6IHVuZGVmaW5lZCQxOwogICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkJDEgPyBiYXNlSXNFcXVhbCh2YWx1ZSwgb3RoZXIsIHVuZGVmaW5lZCQxLCBjdXN0b21pemVyKSA6ICEhcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gYEVycm9yYCwgYEV2YWxFcnJvcmAsIGBSYW5nZUVycm9yYCwgYFJlZmVyZW5jZUVycm9yYCwKICAgICAgICAgKiBgU3ludGF4RXJyb3JgLCBgVHlwZUVycm9yYCwgb3IgYFVSSUVycm9yYCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGVycm9yIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRXJyb3IobmV3IEVycm9yKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRXJyb3IoRXJyb3IpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNFcnJvcih2YWx1ZSkgewogICAgICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB0YWcgPSBiYXNlR2V0VGFnKHZhbHVlKTsKICAgICAgICAgIHJldHVybiB0YWcgPT0gZXJyb3JUYWcgfHwgdGFnID09IGRvbUV4Y1RhZyB8fAogICAgICAgICAgICAodHlwZW9mIHZhbHVlLm1lc3NhZ2UgPT0gJ3N0cmluZycgJiYgdHlwZW9mIHZhbHVlLm5hbWUgPT0gJ3N0cmluZycgJiYgIWlzUGxhaW5PYmplY3QodmFsdWUpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIHByaW1pdGl2ZSBudW1iZXIuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24KICAgICAgICAgKiBbYE51bWJlci5pc0Zpbml0ZWBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0Zpbml0ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgZmluaXRlIG51bWJlciwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRmluaXRlKDMpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNGaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0Zpbml0ZShJbmZpbml0eSk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaXNGaW5pdGUoJzMnKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzRmluaXRlKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmIG5hdGl2ZUlzRmluaXRlKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgRnVuY3Rpb25gIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzRnVuY3Rpb24oXyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmICghaXNPYmplY3QodmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFRoZSB1c2Ugb2YgYE9iamVjdCN0b1N0cmluZ2AgYXZvaWRzIGlzc3VlcyB3aXRoIHRoZSBgdHlwZW9mYCBvcGVyYXRvcgogICAgICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuCiAgICAgICAgICB2YXIgdGFnID0gYmFzZUdldFRhZyh2YWx1ZSk7CiAgICAgICAgICByZXR1cm4gdGFnID09IGZ1bmNUYWcgfHwgdGFnID09IGdlblRhZyB8fCB0YWcgPT0gYXN5bmNUYWcgfHwgdGFnID09IHByb3h5VGFnOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYW4gaW50ZWdlci4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbgogICAgICAgICAqIFtgTnVtYmVyLmlzSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc0ludGVnZXIpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBpbnRlZ2VyLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNJbnRlZ2VyKDMpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNJbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzSW50ZWdlcihJbmZpbml0eSk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaXNJbnRlZ2VyKCczJyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc0ludGVnZXIodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYgdmFsdWUgPT0gdG9JbnRlZ2VyKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgYXJyYXktbGlrZSBsZW5ndGguCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbgogICAgICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNMZW5ndGgoMyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaXNMZW5ndGgoJzMnKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInICYmCiAgICAgICAgICAgIHZhbHVlID4gLTEgJiYgdmFsdWUgJSAxID09IDAgJiYgdmFsdWUgPD0gTUFYX1NBRkVfSU5URUdFUjsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIHRoZQogICAgICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcykKICAgICAgICAgKiBvZiBgT2JqZWN0YC4gKGUuZy4gYXJyYXlzLCBmdW5jdGlvbnMsIG9iamVjdHMsIHJlZ2V4ZXMsIGBuZXcgTnVtYmVyKDApYCwgYW5kIGBuZXcgU3RyaW5nKCcnKWApCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzT2JqZWN0KHt9KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzT2JqZWN0KFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc09iamVjdChfLm5vb3ApOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNPYmplY3QobnVsbCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc09iamVjdCh2YWx1ZSkgewogICAgICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiAodHlwZSA9PSAnb2JqZWN0JyB8fCB0eXBlID09ICdmdW5jdGlvbicpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgCiAgICAgICAgICogYW5kIGhhcyBhIGB0eXBlb2ZgIHJlc3VsdCBvZiAib2JqZWN0Ii4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc09iamVjdExpa2Uoe30pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNPYmplY3RMaWtlKFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc09iamVjdExpa2UoXy5ub29wKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc09iamVjdExpa2UobnVsbCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4zLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNNYXAobmV3IE1hcCk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc01hcChuZXcgV2Vha01hcCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICB2YXIgaXNNYXAgPSBub2RlSXNNYXAgPyBiYXNlVW5hcnkobm9kZUlzTWFwKSA6IGJhc2VJc01hcDsKCiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIGBvYmplY3RgIGFuZCBgc291cmNlYCB0bwogICAgICAgICAqIGRldGVybWluZSBpZiBgb2JqZWN0YCBjb250YWlucyBlcXVpdmFsZW50IHByb3BlcnR5IHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGBfLm1hdGNoZXNgIHdoZW4gYHNvdXJjZWAgaXMKICAgICAgICAgKiBwYXJ0aWFsbHkgYXBwbGllZC4KICAgICAgICAgKgogICAgICAgICAqIFBhcnRpYWwgY29tcGFyaXNvbnMgd2lsbCBtYXRjaCBlbXB0eSBhcnJheSBhbmQgZW1wdHkgb2JqZWN0IGBzb3VyY2VgCiAgICAgICAgICogdmFsdWVzIGFnYWluc3QgYW55IGFycmF5IG9yIG9iamVjdCB2YWx1ZSwgcmVzcGVjdGl2ZWx5LiBTZWUgYF8uaXNFcXVhbGAKICAgICAgICAgKiBmb3IgYSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZSBjb21wYXJpc29ucy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG9iamVjdGAgaXMgYSBtYXRjaCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiB9OwogICAgICAgICAqCiAgICAgICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDIgfSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc01hdGNoKG9iamVjdCwgeyAnYic6IDEgfSk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc01hdGNoKG9iamVjdCwgc291cmNlKSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09PSBzb3VyY2UgfHwgYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIGdldE1hdGNoRGF0YShzb3VyY2UpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNNYXRjaGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgY3VzdG9taXplcmAgd2hpY2gKICAgICAgICAgKiBpcyBpbnZva2VkIHRvIGNvbXBhcmUgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYCwgY29tcGFyaXNvbnMKICAgICAgICAgKiBhcmUgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZCB3aXRoIGZpdmUKICAgICAgICAgKiBhcmd1bWVudHM6IChvYmpWYWx1ZSwgc3JjVmFsdWUsIGluZGV4fGtleSwgb2JqZWN0LCBzb3VyY2UpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIGlzR3JlZXRpbmcodmFsdWUpIHsKICAgICAgICAgKiAgIHJldHVybiAvXmgoPzppfGVsbG8pJC8udGVzdCh2YWx1ZSk7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHsKICAgICAgICAgKiAgIGlmIChpc0dyZWV0aW5nKG9ialZhbHVlKSAmJiBpc0dyZWV0aW5nKHNyY1ZhbHVlKSkgewogICAgICAgICAqICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgKiAgIH0KICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnZ3JlZXRpbmcnOiAnaGVsbG8nIH07CiAgICAgICAgICogdmFyIHNvdXJjZSA9IHsgJ2dyZWV0aW5nJzogJ2hpJyB9OwogICAgICAgICAqCiAgICAgICAgICogXy5pc01hdGNoV2l0aChvYmplY3QsIHNvdXJjZSwgY3VzdG9taXplcik7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzTWF0Y2hXaXRoKG9iamVjdCwgc291cmNlLCBjdXN0b21pemVyKSB7CiAgICAgICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQkMTsKICAgICAgICAgIHJldHVybiBiYXNlSXNNYXRjaChvYmplY3QsIHNvdXJjZSwgZ2V0TWF0Y2hEYXRhKHNvdXJjZSksIGN1c3RvbWl6ZXIpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYE5hTmAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgYmFzZWQgb24KICAgICAgICAgKiBbYE51bWJlci5pc05hTmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc05hTikgYW5kIGlzIG5vdCB0aGUgc2FtZSBhcwogICAgICAgICAqIGdsb2JhbCBbYGlzTmFOYF0oaHR0cHM6Ly9tZG4uaW8vaXNOYU4pIHdoaWNoIHJldHVybnMgYHRydWVgIGZvcgogICAgICAgICAqIGB1bmRlZmluZWRgIGFuZCBvdGhlciBub24tbnVtYmVyIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc05hTihOYU4pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNOYU4obmV3IE51bWJlcihOYU4pKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBpc05hTih1bmRlZmluZWQpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNOYU4odW5kZWZpbmVkKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzTmFOKHZhbHVlKSB7CiAgICAgICAgICAvLyBBbiBgTmFOYCBwcmltaXRpdmUgaXMgdGhlIG9ubHkgdmFsdWUgdGhhdCBpcyBub3QgZXF1YWwgdG8gaXRzZWxmLgogICAgICAgICAgLy8gUGVyZm9ybSB0aGUgYHRvU3RyaW5nVGFnYCBjaGVjayBmaXJzdCB0byBhdm9pZCBlcnJvcnMgd2l0aCBzb21lCiAgICAgICAgICAvLyBBY3RpdmVYIG9iamVjdHMgaW4gSUUuCiAgICAgICAgICByZXR1cm4gaXNOdW1iZXIodmFsdWUpICYmIHZhbHVlICE9ICt2YWx1ZTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJpc3RpbmUgbmF0aXZlIGZ1bmN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGNhbid0IHJlbGlhYmx5IGRldGVjdCBuYXRpdmUgZnVuY3Rpb25zIGluIHRoZSBwcmVzZW5jZQogICAgICAgICAqIG9mIHRoZSBjb3JlLWpzIHBhY2thZ2UgYmVjYXVzZSBjb3JlLWpzIGNpcmN1bXZlbnRzIHRoaXMga2luZCBvZiBkZXRlY3Rpb24uCiAgICAgICAgICogRGVzcGl0ZSBtdWx0aXBsZSByZXF1ZXN0cywgdGhlIGNvcmUtanMgbWFpbnRhaW5lciBoYXMgbWFkZSBpdCBjbGVhcjogYW55CiAgICAgICAgICogYXR0ZW1wdCB0byBmaXggdGhlIGRldGVjdGlvbiB3aWxsIGJlIG9ic3RydWN0ZWQuIEFzIGEgcmVzdWx0LCB3ZSdyZSBsZWZ0CiAgICAgICAgICogd2l0aCBsaXR0bGUgY2hvaWNlIGJ1dCB0byB0aHJvdyBhbiBlcnJvci4gVW5mb3J0dW5hdGVseSwgdGhpcyBhbHNvIGFmZmVjdHMKICAgICAgICAgKiBwYWNrYWdlcywgbGlrZSBbYmFiZWwtcG9seWZpbGxdKGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL2JhYmVsLXBvbHlmaWxsKSwKICAgICAgICAgKiB3aGljaCByZWx5IG9uIGNvcmUtanMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbmF0aXZlIGZ1bmN0aW9uLAogICAgICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNOYXRpdmUoQXJyYXkucHJvdG90eXBlLnB1c2gpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNOYXRpdmUoXyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc05hdGl2ZSh2YWx1ZSkgewogICAgICAgICAgaWYgKGlzTWFza2FibGUodmFsdWUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihDT1JFX0VSUk9SX1RFWFQpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VJc05hdGl2ZSh2YWx1ZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGBudWxsYCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzTnVsbChudWxsKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzTnVsbCh2b2lkIDApOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNOdWxsKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IG51bGw7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBgbnVsbGAgb3IgYHVuZGVmaW5lZGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG51bGxpc2gsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc05pbChudWxsKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzTmlsKHZvaWQgMCk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc05pbChOYU4pOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNOaWwodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBOdW1iZXJgIHByaW1pdGl2ZSBvciBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVG8gZXhjbHVkZSBgSW5maW5pdHlgLCBgLUluZmluaXR5YCwgYW5kIGBOYU5gLCB3aGljaCBhcmUKICAgICAgICAgKiBjbGFzc2lmaWVkIGFzIG51bWJlcnMsIHVzZSB0aGUgYF8uaXNGaW5pdGVgIG1ldGhvZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBudW1iZXIsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc051bWJlcigzKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNOdW1iZXIoSW5maW5pdHkpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNOdW1iZXIoJzMnKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzTnVtYmVyKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdudW1iZXInIHx8CiAgICAgICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IG51bWJlclRhZyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgdGhhdCBpcywgYW4gb2JqZWN0IGNyZWF0ZWQgYnkgdGhlCiAgICAgICAgICogYE9iamVjdGAgY29uc3RydWN0b3Igb3Igb25lIHdpdGggYSBgW1tQcm90b3R5cGVdXWAgb2YgYG51bGxgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuOC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7CiAgICAgICAgICogICB0aGlzLmEgPSAxOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIF8uaXNQbGFpbk9iamVjdChuZXcgRm9vKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1BsYWluT2JqZWN0KFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaXNQbGFpbk9iamVjdCh7ICd4JzogMCwgJ3knOiAwIH0pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNQbGFpbk9iamVjdChPYmplY3QuY3JlYXRlKG51bGwpKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNQbGFpbk9iamVjdCh2YWx1ZSkgewogICAgICAgICAgaWYgKCFpc09iamVjdExpa2UodmFsdWUpIHx8IGJhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZykgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcHJvdG8gPSBnZXRQcm90b3R5cGUodmFsdWUpOwogICAgICAgICAgaWYgKHByb3RvID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgdmFyIEN0b3IgPSBoYXNPd25Qcm9wZXJ0eS5jYWxsKHByb3RvLCAnY29uc3RydWN0b3InKSAmJiBwcm90by5jb25zdHJ1Y3RvcjsKICAgICAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmCiAgICAgICAgICAgIGZ1bmNUb1N0cmluZy5jYWxsKEN0b3IpID09IG9iamVjdEN0b3JTdHJpbmc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFJlZ0V4cGAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHJlZ2V4cCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzUmVnRXhwKC9hYmMvKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzUmVnRXhwKCcvYWJjLycpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgdmFyIGlzUmVnRXhwID0gbm9kZUlzUmVnRXhwID8gYmFzZVVuYXJ5KG5vZGVJc1JlZ0V4cCkgOiBiYXNlSXNSZWdFeHA7CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgc2FmZSBpbnRlZ2VyLiBBbiBpbnRlZ2VyIGlzIHNhZmUgaWYgaXQncyBhbiBJRUVFLTc1NAogICAgICAgICAqIGRvdWJsZSBwcmVjaXNpb24gbnVtYmVyIHdoaWNoIGlzbid0IHRoZSByZXN1bHQgb2YgYSByb3VuZGVkIHVuc2FmZSBpbnRlZ2VyLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGJhc2VkIG9uCiAgICAgICAgICogW2BOdW1iZXIuaXNTYWZlSW50ZWdlcmBdKGh0dHBzOi8vbWRuLmlvL051bWJlci9pc1NhZmVJbnRlZ2VyKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzYWZlIGludGVnZXIsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1NhZmVJbnRlZ2VyKDMpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNTYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1NhZmVJbnRlZ2VyKEluZmluaXR5KTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1NhZmVJbnRlZ2VyKCczJyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc1NhZmVJbnRlZ2VyKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gaXNJbnRlZ2VyKHZhbHVlKSAmJiB2YWx1ZSA+PSAtTUFYX1NBRkVfSU5URUdFUiAmJiB2YWx1ZSA8PSBNQVhfU0FGRV9JTlRFR0VSOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTZXRgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjMuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzZXQsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1NldChuZXcgU2V0KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzU2V0KG5ldyBXZWFrU2V0KTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBpc1NldCA9IG5vZGVJc1NldCA/IGJhc2VVbmFyeShub2RlSXNTZXQpIDogYmFzZUlzU2V0OwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFN0cmluZ2AgcHJpbWl0aXZlIG9yIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzdHJpbmcsIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1N0cmluZygnYWJjJyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1N0cmluZygxKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzU3RyaW5nKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8CiAgICAgICAgICAgICghaXNBcnJheSh2YWx1ZSkgJiYgaXNPYmplY3RMaWtlKHZhbHVlKSAmJiBiYXNlR2V0VGFnKHZhbHVlKSA9PSBzdHJpbmdUYWcpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3ltYm9sLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNTeW1ib2woU3ltYm9sLml0ZXJhdG9yKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzU3ltYm9sKCdhYmMnKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzU3ltYm9sKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzeW1ib2wnIHx8CiAgICAgICAgICAgIChpc09iamVjdExpa2UodmFsdWUpICYmIGJhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgdHlwZWQgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gYmFzZVVuYXJ5KG5vZGVJc1R5cGVkQXJyYXkpIDogYmFzZUlzVHlwZWRBcnJheTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGB1bmRlZmluZWRgLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNVbmRlZmluZWQodm9pZCAwKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzVW5kZWZpbmVkKG51bGwpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXNVbmRlZmluZWQodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFdlYWtNYXBgIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjMuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB3ZWFrIG1hcCwgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzV2Vha01hcChuZXcgV2Vha01hcCk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pc1dlYWtNYXAobmV3IE1hcCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpc1dlYWtNYXAodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBpc09iamVjdExpa2UodmFsdWUpICYmIGdldFRhZyh2YWx1ZSkgPT0gd2Vha01hcFRhZzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgV2Vha1NldGAgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMy4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHdlYWsgc2V0LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uaXNXZWFrU2V0KG5ldyBXZWFrU2V0KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmlzV2Vha1NldChuZXcgU2V0KTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGlzV2Vha1NldCh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh2YWx1ZSkgJiYgYmFzZUdldFRhZyh2YWx1ZSkgPT0gd2Vha1NldFRhZzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBgb3RoZXJgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuOS4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsCiAgICAgICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAgICAgKiBAc2VlIF8uZ3QKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5sdCgxLCAzKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmx0KDMsIDMpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICoKICAgICAgICAgKiBfLmx0KDMsIDEpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgdmFyIGx0ID0gY3JlYXRlUmVsYXRpb25hbE9wZXJhdGlvbihiYXNlTHQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYG90aGVyYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjkuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0bwogICAgICAgICAqICBgb3RoZXJgLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQHNlZSBfLmd0ZQogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmx0ZSgxLCAzKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmx0ZSgzLCAzKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmx0ZSgzLCAxKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBsdGUgPSBjcmVhdGVSZWxhdGlvbmFsT3BlcmF0aW9uKGZ1bmN0aW9uKHZhbHVlLCBvdGhlcikgewogICAgICAgICAgcmV0dXJuIHZhbHVlIDw9IG90aGVyOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgY29udmVydGVkIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvQXJyYXkoeyAnYSc6IDEsICdiJzogMiB9KTsKICAgICAgICAgKiAvLyA9PiBbMSwgMl0KICAgICAgICAgKgogICAgICAgICAqIF8udG9BcnJheSgnYWJjJyk7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvQXJyYXkoMSk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKgogICAgICAgICAqIF8udG9BcnJheShudWxsKTsKICAgICAgICAgKiAvLyA9PiBbXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvQXJyYXkodmFsdWUpIHsKICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzQXJyYXlMaWtlKHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gaXNTdHJpbmcodmFsdWUpID8gc3RyaW5nVG9BcnJheSh2YWx1ZSkgOiBjb3B5QXJyYXkodmFsdWUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHN5bUl0ZXJhdG9yICYmIHZhbHVlW3N5bUl0ZXJhdG9yXSkgewogICAgICAgICAgICByZXR1cm4gaXRlcmF0b3JUb0FycmF5KHZhbHVlW3N5bUl0ZXJhdG9yXSgpKTsKICAgICAgICAgIH0KICAgICAgICAgIHZhciB0YWcgPSBnZXRUYWcodmFsdWUpLAogICAgICAgICAgICAgIGZ1bmMgPSB0YWcgPT0gbWFwVGFnID8gbWFwVG9BcnJheSA6ICh0YWcgPT0gc2V0VGFnID8gc2V0VG9BcnJheSA6IHZhbHVlcyk7CgogICAgICAgICAgcmV0dXJuIGZ1bmModmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIGZpbml0ZSBudW1iZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4xMi4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udG9GaW5pdGUoMy4yKTsKICAgICAgICAgKiAvLyA9PiAzLjIKICAgICAgICAgKgogICAgICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7CiAgICAgICAgICogLy8gPT4gNWUtMzI0CiAgICAgICAgICoKICAgICAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTsKICAgICAgICAgKiAvLyA9PiAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwOAogICAgICAgICAqCiAgICAgICAgICogXy50b0Zpbml0ZSgnMy4yJyk7CiAgICAgICAgICogLy8gPT4gMy4yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHsKICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09PSAwID8gdmFsdWUgOiAwOwogICAgICAgICAgfQogICAgICAgICAgdmFsdWUgPSB0b051bWJlcih2YWx1ZSk7CiAgICAgICAgICBpZiAodmFsdWUgPT09IElORklOSVRZIHx8IHZhbHVlID09PSAtSU5GSU5JVFkpIHsKICAgICAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTsKICAgICAgICAgICAgcmV0dXJuIHNpZ24gKiBNQVhfSU5URUdFUjsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGFuIGludGVnZXIuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbgogICAgICAgICAqIFtgVG9JbnRlZ2VyYF0oaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXRvaW50ZWdlcikuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udG9JbnRlZ2VyKDMuMik7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqCiAgICAgICAgICogXy50b0ludGVnZXIoTnVtYmVyLk1JTl9WQUxVRSk7CiAgICAgICAgICogLy8gPT4gMAogICAgICAgICAqCiAgICAgICAgICogXy50b0ludGVnZXIoSW5maW5pdHkpOwogICAgICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4CiAgICAgICAgICoKICAgICAgICAgKiBfLnRvSW50ZWdlcignMy4yJyk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvSW50ZWdlcih2YWx1ZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHRvRmluaXRlKHZhbHVlKSwKICAgICAgICAgICAgICByZW1haW5kZXIgPSByZXN1bHQgJSAxOwoKICAgICAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlciBzdWl0YWJsZSBmb3IgdXNlIGFzIHRoZSBsZW5ndGggb2YgYW4KICAgICAgICAgKiBhcnJheS1saWtlIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbgogICAgICAgICAqIFtgVG9MZW5ndGhgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy10b2xlbmd0aCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udG9MZW5ndGgoMy4yKTsKICAgICAgICAgKiAvLyA9PiAzCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvTGVuZ3RoKE51bWJlci5NSU5fVkFMVUUpOwogICAgICAgICAqIC8vID0+IDAKICAgICAgICAgKgogICAgICAgICAqIF8udG9MZW5ndGgoSW5maW5pdHkpOwogICAgICAgICAqIC8vID0+IDQyOTQ5NjcyOTUKICAgICAgICAgKgogICAgICAgICAqIF8udG9MZW5ndGgoJzMuMicpOwogICAgICAgICAqIC8vID0+IDMKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0b0xlbmd0aCh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlID8gYmFzZUNsYW1wKHRvSW50ZWdlcih2YWx1ZSksIDAsIE1BWF9BUlJBWV9MRU5HVEgpIDogMDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbnVtYmVyLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvTnVtYmVyKDMuMik7CiAgICAgICAgICogLy8gPT4gMy4yCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvTnVtYmVyKE51bWJlci5NSU5fVkFMVUUpOwogICAgICAgICAqIC8vID0+IDVlLTMyNAogICAgICAgICAqCiAgICAgICAgICogXy50b051bWJlcihJbmZpbml0eSk7CiAgICAgICAgICogLy8gPT4gSW5maW5pdHkKICAgICAgICAgKgogICAgICAgICAqIF8udG9OdW1iZXIoJzMuMicpOwogICAgICAgICAqIC8vID0+IDMuMgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvTnVtYmVyKHZhbHVlKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc1N5bWJvbCh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIE5BTjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChpc09iamVjdCh2YWx1ZSkpIHsKICAgICAgICAgICAgdmFyIG90aGVyID0gdHlwZW9mIHZhbHVlLnZhbHVlT2YgPT0gJ2Z1bmN0aW9uJyA/IHZhbHVlLnZhbHVlT2YoKSA6IHZhbHVlOwogICAgICAgICAgICB2YWx1ZSA9IGlzT2JqZWN0KG90aGVyKSA/IChvdGhlciArICcnKSA6IG90aGVyOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgewogICAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IDAgPyB2YWx1ZSA6ICt2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTsKICAgICAgICAgIHZhciBpc0JpbmFyeSA9IHJlSXNCaW5hcnkudGVzdCh2YWx1ZSk7CiAgICAgICAgICByZXR1cm4gKGlzQmluYXJ5IHx8IHJlSXNPY3RhbC50ZXN0KHZhbHVlKSkKICAgICAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpCiAgICAgICAgICAgIDogKHJlSXNCYWRIZXgudGVzdCh2YWx1ZSkgPyBOQU4gOiArdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHBsYWluIG9iamVjdCBmbGF0dGVuaW5nIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZwogICAgICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IExhbmcKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBwbGFpbiBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYiA9IDI7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMzsKICAgICAgICAgKgogICAgICAgICAqIF8uYXNzaWduKHsgJ2EnOiAxIH0sIG5ldyBGb28pOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfQogICAgICAgICAqCiAgICAgICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgXy50b1BsYWluT2JqZWN0KG5ldyBGb28pKTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvUGxhaW5PYmplY3QodmFsdWUpIHsKICAgICAgICAgIHJldHVybiBjb3B5T2JqZWN0KHZhbHVlLCBrZXlzSW4odmFsdWUpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBzYWZlIGludGVnZXIuIEEgc2FmZSBpbnRlZ2VyIGNhbiBiZSBjb21wYXJlZCBhbmQKICAgICAgICAgKiByZXByZXNlbnRlZCBjb3JyZWN0bHkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udG9TYWZlSW50ZWdlcigzLjIpOwogICAgICAgICAqIC8vID0+IDMKICAgICAgICAgKgogICAgICAgICAqIF8udG9TYWZlSW50ZWdlcihOdW1iZXIuTUlOX1ZBTFVFKTsKICAgICAgICAgKiAvLyA9PiAwCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvU2FmZUludGVnZXIoSW5maW5pdHkpOwogICAgICAgICAqIC8vID0+IDkwMDcxOTkyNTQ3NDA5OTEKICAgICAgICAgKgogICAgICAgICAqIF8udG9TYWZlSW50ZWdlcignMy4yJyk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvU2FmZUludGVnZXIodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB2YWx1ZQogICAgICAgICAgICA/IGJhc2VDbGFtcCh0b0ludGVnZXIodmFsdWUpLCAtTUFYX1NBRkVfSU5URUdFUiwgTUFYX1NBRkVfSU5URUdFUikKICAgICAgICAgICAgOiAodmFsdWUgPT09IDAgPyB2YWx1ZSA6IDApOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGAKICAgICAgICAgKiBhbmQgYHVuZGVmaW5lZGAgdmFsdWVzLiBUaGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjb252ZXJ0ZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvU3RyaW5nKG51bGwpOwogICAgICAgICAqIC8vID0+ICcnCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvU3RyaW5nKC0wKTsKICAgICAgICAgKiAvLyA9PiAnLTAnCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvU3RyaW5nKFsxLCAyLCAzXSk7CiAgICAgICAgICogLy8gPT4gJzEsMiwzJwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvU3RyaW5nKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogYmFzZVRvU3RyaW5nKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWducyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBzb3VyY2Ugb2JqZWN0cyB0byB0aGUKICAgICAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4KICAgICAgICAgKiBTdWJzZXF1ZW50IHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YCBhbmQgaXMgbG9vc2VseSBiYXNlZCBvbgogICAgICAgICAqIFtgT2JqZWN0LmFzc2lnbmBdKGh0dHBzOi8vbWRuLmlvL09iamVjdC9hc3NpZ24pLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuMTAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAc2VlIF8uYXNzaWduSW4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICAgICAqICAgdGhpcy5hID0gMTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBCYXIoKSB7CiAgICAgICAgICogICB0aGlzLmMgPSAzOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIEZvby5wcm90b3R5cGUuYiA9IDI7CiAgICAgICAgICogQmFyLnByb3RvdHlwZS5kID0gNDsKICAgICAgICAgKgogICAgICAgICAqIF8uYXNzaWduKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfQogICAgICAgICAqLwogICAgICAgIHZhciBhc3NpZ24gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkgewogICAgICAgICAgaWYgKGlzUHJvdG90eXBlKHNvdXJjZSkgfHwgaXNBcnJheUxpa2Uoc291cmNlKSkgewogICAgICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5cyhzb3VyY2UpLCBvYmplY3QpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gc291cmNlKSB7CiAgICAgICAgICAgIGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKHNvdXJjZSwga2V5KSkgewogICAgICAgICAgICAgIGFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBzb3VyY2Vba2V5XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgb3duIGFuZAogICAgICAgICAqIGluaGVyaXRlZCBzb3VyY2UgcHJvcGVydGllcy4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGFsaWFzIGV4dGVuZAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAc2VlIF8uYXNzaWduCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gQmFyKCkgewogICAgICAgICAqICAgdGhpcy5jID0gMzsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBGb28ucHJvdG90eXBlLmIgPSAyOwogICAgICAgICAqIEJhci5wcm90b3R5cGUuZCA9IDQ7CiAgICAgICAgICoKICAgICAgICAgKiBfLmFzc2lnbkluKHsgJ2EnOiAwIH0sIG5ldyBGb28sIG5ldyBCYXIpOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMywgJ2QnOiA0IH0KICAgICAgICAgKi8KICAgICAgICB2YXIgYXNzaWduSW4gPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSkgewogICAgICAgICAgY29weU9iamVjdChzb3VyY2UsIGtleXNJbihzb3VyY2UpLCBvYmplY3QpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbkluYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYAogICAgICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucwogICAgICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgCiAgICAgICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGFsaWFzIGV4dGVuZFdpdGgKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBzb3VyY2VzIFRoZSBzb3VyY2Ugb2JqZWN0cy4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAc2VlIF8uYXNzaWduV2l0aAogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkgewogICAgICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbkluV2l0aCwgY3VzdG9taXplcik7CiAgICAgICAgICoKICAgICAgICAgKiBkZWZhdWx0cyh7ICdhJzogMSB9LCB7ICdiJzogMiB9LCB7ICdhJzogMyB9KTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAgICAgKi8KICAgICAgICB2YXIgYXNzaWduSW5XaXRoID0gY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4LCBjdXN0b21pemVyKSB7CiAgICAgICAgICBjb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uYXNzaWduYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYAogICAgICAgICAqIHdoaWNoIGlzIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgYXNzaWduZWQgdmFsdWVzLiBJZiBgY3VzdG9taXplcmAgcmV0dXJucwogICAgICAgICAqIGB1bmRlZmluZWRgLCBhc3NpZ25tZW50IGlzIGhhbmRsZWQgYnkgdGhlIG1ldGhvZCBpbnN0ZWFkLiBUaGUgYGN1c3RvbWl6ZXJgCiAgICAgICAgICogaXMgaW52b2tlZCB3aXRoIGZpdmUgYXJndW1lbnRzOiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlKS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIGRlc3RpbmF0aW9uIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gc291cmNlcyBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgYXNzaWduZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQHNlZSBfLmFzc2lnbkluV2l0aAogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSkgewogICAgICAgICAqICAgcmV0dXJuIF8uaXNVbmRlZmluZWQob2JqVmFsdWUpID8gc3JjVmFsdWUgOiBvYmpWYWx1ZTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZGVmYXVsdHMgPSBfLnBhcnRpYWxSaWdodChfLmFzc2lnbldpdGgsIGN1c3RvbWl6ZXIpOwogICAgICAgICAqCiAgICAgICAgICogZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7CiAgICAgICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiB9CiAgICAgICAgICovCiAgICAgICAgdmFyIGFzc2lnbldpdGggPSBjcmVhdGVBc3NpZ25lcihmdW5jdGlvbihvYmplY3QsIHNvdXJjZSwgc3JjSW5kZXgsIGN1c3RvbWl6ZXIpIHsKICAgICAgICAgIGNvcHlPYmplY3Qoc291cmNlLCBrZXlzKHNvdXJjZSksIG9iamVjdCwgY3VzdG9taXplcik7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdmFsdWVzIGNvcnJlc3BvbmRpbmcgdG8gYHBhdGhzYCBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAxLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7Li4uKHN0cmluZ3xzdHJpbmdbXSl9IFtwYXRoc10gVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBwaWNrZWQgdmFsdWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9LCA0XSB9OwogICAgICAgICAqCiAgICAgICAgICogXy5hdChvYmplY3QsIFsnYVswXS5iLmMnLCAnYVsxXSddKTsKICAgICAgICAgKiAvLyA9PiBbMywgNF0KICAgICAgICAgKi8KICAgICAgICB2YXIgYXQgPSBmbGF0UmVzdChiYXNlQXQpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gdGhlIGBwcm90b3R5cGVgIG9iamVjdC4gSWYgYQogICAgICAgICAqIGBwcm9wZXJ0aWVzYCBvYmplY3QgaXMgZ2l2ZW4sIGl0cyBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcwogICAgICAgICAqIGFyZSBhc3NpZ25lZCB0byB0aGUgY3JlYXRlZCBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMi4zLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvdHlwZSBUaGUgb2JqZWN0IHRvIGluaGVyaXQgZnJvbS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW3Byb3BlcnRpZXNdIFRoZSBwcm9wZXJ0aWVzIHRvIGFzc2lnbiB0byB0aGUgb2JqZWN0LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIFNoYXBlKCkgewogICAgICAgICAqICAgdGhpcy54ID0gMDsKICAgICAgICAgKiAgIHRoaXMueSA9IDA7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gQ2lyY2xlKCkgewogICAgICAgICAqICAgU2hhcGUuY2FsbCh0aGlzKTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBDaXJjbGUucHJvdG90eXBlID0gXy5jcmVhdGUoU2hhcGUucHJvdG90eXBlLCB7CiAgICAgICAgICogICAnY29uc3RydWN0b3InOiBDaXJjbGUKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIHZhciBjaXJjbGUgPSBuZXcgQ2lyY2xlOwogICAgICAgICAqIGNpcmNsZSBpbnN0YW5jZW9mIENpcmNsZTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBjaXJjbGUgaW5zdGFuY2VvZiBTaGFwZTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcGVydGllcykgewogICAgICAgICAgdmFyIHJlc3VsdCA9IGJhc2VDcmVhdGUocHJvdG90eXBlKTsKICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzID09IG51bGwgPyByZXN1bHQgOiBiYXNlQXNzaWduKHJlc3VsdCwgcHJvcGVydGllcyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBBc3NpZ25zIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlCiAgICAgICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0CiAgICAgICAgICogcmVzb2x2ZSB0byBgdW5kZWZpbmVkYC4gU291cmNlIG9iamVjdHMgYXJlIGFwcGxpZWQgZnJvbSBsZWZ0IHRvIHJpZ2h0LgogICAgICAgICAqIE9uY2UgYSBwcm9wZXJ0eSBpcyBzZXQsIGFkZGl0aW9uYWwgdmFsdWVzIG9mIHRoZSBzYW1lIHByb3BlcnR5IGFyZSBpZ25vcmVkLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzRGVlcAogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmRlZmF1bHRzKHsgJ2EnOiAxIH0sIHsgJ2InOiAyIH0sIHsgJ2EnOiAzIH0pOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYic6IDIgfQogICAgICAgICAqLwogICAgICAgIHZhciBkZWZhdWx0cyA9IGJhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykgewogICAgICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7CgogICAgICAgICAgdmFyIGluZGV4ID0gLTE7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7CiAgICAgICAgICB2YXIgZ3VhcmQgPSBsZW5ndGggPiAyID8gc291cmNlc1syXSA6IHVuZGVmaW5lZCQxOwoKICAgICAgICAgIGlmIChndWFyZCAmJiBpc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHsKICAgICAgICAgICAgbGVuZ3RoID0gMTsKICAgICAgICAgIH0KCiAgICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgICB2YXIgc291cmNlID0gc291cmNlc1tpbmRleF07CiAgICAgICAgICAgIHZhciBwcm9wcyA9IGtleXNJbihzb3VyY2UpOwogICAgICAgICAgICB2YXIgcHJvcHNJbmRleCA9IC0xOwogICAgICAgICAgICB2YXIgcHJvcHNMZW5ndGggPSBwcm9wcy5sZW5ndGg7CgogICAgICAgICAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHsKICAgICAgICAgICAgICB2YXIga2V5ID0gcHJvcHNbcHJvcHNJbmRleF07CiAgICAgICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0W2tleV07CgogICAgICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkJDEgfHwKICAgICAgICAgICAgICAgICAgKGVxKHZhbHVlLCBvYmplY3RQcm90b1trZXldKSAmJiAhaGFzT3duUHJvcGVydHkuY2FsbChvYmplY3QsIGtleSkpKSB7CiAgICAgICAgICAgICAgICBvYmplY3Rba2V5XSA9IHNvdXJjZVtrZXldOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZGVmYXVsdHNgIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IGFzc2lnbnMKICAgICAgICAgKiBkZWZhdWx0IHByb3BlcnRpZXMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjEwLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7Li4uT2JqZWN0fSBbc291cmNlc10gVGhlIHNvdXJjZSBvYmplY3RzLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQHNlZSBfLmRlZmF1bHRzCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZGVmYXVsdHNEZWVwKHsgJ2EnOiB7ICdiJzogMiB9IH0sIHsgJ2EnOiB7ICdiJzogMSwgJ2MnOiAzIH0gfSk7CiAgICAgICAgICogLy8gPT4geyAnYSc6IHsgJ2InOiAyLCAnYyc6IDMgfSB9CiAgICAgICAgICovCiAgICAgICAgdmFyIGRlZmF1bHRzRGVlcCA9IGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICAgIGFyZ3MucHVzaCh1bmRlZmluZWQkMSwgY3VzdG9tRGVmYXVsdHNNZXJnZSk7CiAgICAgICAgICByZXR1cm4gYXBwbHkobWVyZ2VXaXRoLCB1bmRlZmluZWQkMSwgYXJncyk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZGAgZXhjZXB0IHRoYXQgaXQgcmV0dXJucyB0aGUga2V5IG9mIHRoZSBmaXJzdAogICAgICAgICAqIGVsZW1lbnQgYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgaXRzZWxmLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDEuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHVuZGVmaW5lZH0gUmV0dXJucyB0aGUga2V5IG9mIHRoZSBtYXRjaGVkIGVsZW1lbnQsCiAgICAgICAgICogIGVsc2UgYHVuZGVmaW5lZGAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IHsKICAgICAgICAgKiAgICdiYXJuZXknOiAgeyAnYWdlJzogMzYsICdhY3RpdmUnOiB0cnVlIH0sCiAgICAgICAgICogICAnZnJlZCc6ICAgIHsgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSwKICAgICAgICAgKiAgICdwZWJibGVzJzogeyAnYWdlJzogMSwgICdhY3RpdmUnOiB0cnVlIH0KICAgICAgICAgKiB9OwogICAgICAgICAqCiAgICAgICAgICogXy5maW5kS2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTsKICAgICAgICAgKiAvLyA9PiAnYmFybmV5JyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmZpbmRLZXkodXNlcnMsIHsgJ2FnZSc6IDEsICdhY3RpdmUnOiB0cnVlIH0pOwogICAgICAgICAqIC8vID0+ICdwZWJibGVzJwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZEtleSh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICAgICAqIC8vID0+ICdmcmVkJwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5maW5kS2V5KHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgICAgICogLy8gPT4gJ2Jhcm5leScKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmaW5kS2V5KG9iamVjdCwgcHJlZGljYXRlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZUZpbmRLZXkob2JqZWN0LCBnZXRJdGVyYXRlZShwcmVkaWNhdGUsIDMpLCBiYXNlRm9yT3duKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZmluZEtleWAgZXhjZXB0IHRoYXQgaXQgaXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZgogICAgICAgICAqIGEgY29sbGVjdGlvbiBpbiB0aGUgb3Bwb3NpdGUgb3JkZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMi4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW3ByZWRpY2F0ZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd8dW5kZWZpbmVkfSBSZXR1cm5zIHRoZSBrZXkgb2YgdGhlIG1hdGNoZWQgZWxlbWVudCwKICAgICAgICAgKiAgZWxzZSBgdW5kZWZpbmVkYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIHVzZXJzID0gewogICAgICAgICAqICAgJ2Jhcm5leSc6ICB7ICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSwKICAgICAgICAgKiAgICdmcmVkJzogICAgeyAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9LAogICAgICAgICAqICAgJ3BlYmJsZXMnOiB7ICdhZ2UnOiAxLCAgJ2FjdGl2ZSc6IHRydWUgfQogICAgICAgICAqIH07CiAgICAgICAgICoKICAgICAgICAgKiBfLmZpbmRMYXN0S2V5KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLmFnZSA8IDQwOyB9KTsKICAgICAgICAgKiAvLyA9PiByZXR1cm5zICdwZWJibGVzJyBhc3N1bWluZyBgXy5maW5kS2V5YCByZXR1cm5zICdiYXJuZXknCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTsKICAgICAgICAgKiAvLyA9PiAnYmFybmV5JwogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLm1hdGNoZXNQcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsIFsnYWN0aXZlJywgZmFsc2VdKTsKICAgICAgICAgKiAvLyA9PiAnZnJlZCcKICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5wcm9wZXJ0eWAgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmluZExhc3RLZXkodXNlcnMsICdhY3RpdmUnKTsKICAgICAgICAgKiAvLyA9PiAncGViYmxlcycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBmaW5kTGFzdEtleShvYmplY3QsIHByZWRpY2F0ZSkgewogICAgICAgICAgcmV0dXJuIGJhc2VGaW5kS2V5KG9iamVjdCwgZ2V0SXRlcmF0ZWUocHJlZGljYXRlLCAzKSwgYmFzZUZvck93blJpZ2h0KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEl0ZXJhdGVzIG92ZXIgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyBvZiBhbgogICAgICAgICAqIG9iamVjdCBhbmQgaW52b2tlcyBgaXRlcmF0ZWVgIGZvciBlYWNoIHByb3BlcnR5LiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZAogICAgICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0CiAgICAgICAgICogaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC4zLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqIEBzZWUgXy5mb3JJblJpZ2h0CiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgICAgICogICB0aGlzLmIgPSAyOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgICAgICoKICAgICAgICAgKiBfLmZvckluKG5ldyBGb28sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CiAgICAgICAgICogfSk7CiAgICAgICAgICogLy8gPT4gTG9ncyAnYScsICdiJywgdGhlbiAnYycgKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZm9ySW4ob2JqZWN0LCBpdGVyYXRlZSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsCiAgICAgICAgICAgID8gb2JqZWN0CiAgICAgICAgICAgIDogYmFzZUZvcihvYmplY3QsIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwga2V5c0luKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZm9ySW5gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZgogICAgICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAyLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQHNlZSBfLmZvckluCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgICAgICogICB0aGlzLmIgPSAyOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgICAgICoKICAgICAgICAgKiBfLmZvckluUmlnaHQobmV3IEZvbywgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICAgICAqICAgY29uc29sZS5sb2coa2V5KTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiAvLyA9PiBMb2dzICdjJywgJ2InLCB0aGVuICdhJyBhc3N1bWluZyBgXy5mb3JJbmAgbG9ncyAnYScsICdiJywgdGhlbiAnYycuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZm9ySW5SaWdodChvYmplY3QsIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwKICAgICAgICAgICAgPyBvYmplY3QKICAgICAgICAgICAgOiBiYXNlRm9yUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyksIGtleXNJbik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJdGVyYXRlcyBvdmVyIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuIG9iamVjdCBhbmQKICAgICAgICAgKiBpbnZva2VzIGBpdGVyYXRlZWAgZm9yIGVhY2ggcHJvcGVydHkuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUKICAgICAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5LCBvYmplY3QpLiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uCiAgICAgICAgICogZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjMuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQHNlZSBfLmZvck93blJpZ2h0CiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgICAgICogICB0aGlzLmIgPSAyOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgICAgICoKICAgICAgICAgKiBfLmZvck93bihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICogICBjb25zb2xlLmxvZyhrZXkpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IExvZ3MgJ2EnIHRoZW4gJ2InIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGZvck93bihvYmplY3QsIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ICYmIGJhc2VGb3JPd24ob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5mb3JPd25gIGV4Y2VwdCB0aGF0IGl0IGl0ZXJhdGVzIG92ZXIgcHJvcGVydGllcyBvZgogICAgICAgICAqIGBvYmplY3RgIGluIHRoZSBvcHBvc2l0ZSBvcmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAyLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQHNlZSBfLmZvck93bgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7CiAgICAgICAgICogICB0aGlzLmEgPSAxOwogICAgICAgICAqICAgdGhpcy5iID0gMjsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzOwogICAgICAgICAqCiAgICAgICAgICogXy5mb3JPd25SaWdodChuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgICAgICogICBjb25zb2xlLmxvZyhrZXkpOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IExvZ3MgJ2InIHRoZW4gJ2EnIGFzc3VtaW5nIGBfLmZvck93bmAgbG9ncyAnYScgdGhlbiAnYicuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZm9yT3duUmlnaHQob2JqZWN0LCBpdGVyYXRlZSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCAmJiBiYXNlRm9yT3duUmlnaHQob2JqZWN0LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMykpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBmdW5jdGlvbiBwcm9wZXJ0eSBuYW1lcyBmcm9tIG93biBlbnVtZXJhYmxlIHByb3BlcnRpZXMKICAgICAgICAgKiBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGZ1bmN0aW9uIG5hbWVzLgogICAgICAgICAqIEBzZWUgXy5mdW5jdGlvbnNJbgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7CiAgICAgICAgICogICB0aGlzLmEgPSBfLmNvbnN0YW50KCdhJyk7CiAgICAgICAgICogICB0aGlzLmIgPSBfLmNvbnN0YW50KCdiJyk7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gXy5jb25zdGFudCgnYycpOwogICAgICAgICAqCiAgICAgICAgICogXy5mdW5jdGlvbnMobmV3IEZvbyk7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2InXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZUZ1bmN0aW9ucyhvYmplY3QsIGtleXMob2JqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIGZ1bmN0aW9uIHByb3BlcnR5IG5hbWVzIGZyb20gb3duIGFuZCBpbmhlcml0ZWQKICAgICAgICAgKiBlbnVtZXJhYmxlIHByb3BlcnRpZXMgb2YgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGluc3BlY3QuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBmdW5jdGlvbiBuYW1lcy4KICAgICAgICAgKiBAc2VlIF8uZnVuY3Rpb25zCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IF8uY29uc3RhbnQoJ2EnKTsKICAgICAgICAgKiAgIHRoaXMuYiA9IF8uY29uc3RhbnQoJ2InKTsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSBfLmNvbnN0YW50KCdjJyk7CiAgICAgICAgICoKICAgICAgICAgKiBfLmZ1bmN0aW9uc0luKG5ldyBGb28pOwogICAgICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGZ1bmN0aW9uc0luKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gW10gOiBiYXNlRnVuY3Rpb25zKG9iamVjdCwga2V5c0luKG9iamVjdCkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGBvYmplY3RgLiBJZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMKICAgICAgICAgKiBgdW5kZWZpbmVkYCwgdGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGluIGl0cyBwbGFjZS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjcuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTsKICAgICAgICAgKgogICAgICAgICAqIF8uZ2V0KG9iamVjdCwgJ2FbMF0uYi5jJyk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqCiAgICAgICAgICogXy5nZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7CiAgICAgICAgICogLy8gPT4gMwogICAgICAgICAqCiAgICAgICAgICogXy5nZXQob2JqZWN0LCAnYS5iLmMnLCAnZGVmYXVsdCcpOwogICAgICAgICAqIC8vID0+ICdkZWZhdWx0JwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkJDEgOiBiYXNlR2V0KG9iamVjdCwgcGF0aCk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSB1bmRlZmluZWQkMSA/IGRlZmF1bHRWYWx1ZSA6IHJlc3VsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3QgcHJvcGVydHkgb2YgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogeyAnYic6IDIgfSB9OwogICAgICAgICAqIHZhciBvdGhlciA9IF8uY3JlYXRlKHsgJ2EnOiBfLmNyZWF0ZSh7ICdiJzogMiB9KSB9KTsKICAgICAgICAgKgogICAgICAgICAqIF8uaGFzKG9iamVjdCwgJ2EnKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmhhcyhvYmplY3QsICdhLmInKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmhhcyhvYmplY3QsIFsnYScsICdiJ10pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaGFzKG90aGVyLCAnYScpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaGFzKG9iamVjdCwgcGF0aCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCAhPSBudWxsICYmIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBiYXNlSGFzKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiBgcGF0aGAgaXMgYSBkaXJlY3Qgb3IgaW5oZXJpdGVkIHByb3BlcnR5IG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pOwogICAgICAgICAqCiAgICAgICAgICogXy5oYXNJbihvYmplY3QsICdhJyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5oYXNJbihvYmplY3QsICdhLmInKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmhhc0luKG9iamVjdCwgWydhJywgJ2InXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5oYXNJbihvYmplY3QsICdiJyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBoYXNJbihvYmplY3QsIHBhdGgpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNQYXRoKG9iamVjdCwgcGF0aCwgYmFzZUhhc0luKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBpbnZlcnRlZCBrZXlzIGFuZCB2YWx1ZXMgb2YgYG9iamVjdGAuCiAgICAgICAgICogSWYgYG9iamVjdGAgY29udGFpbnMgZHVwbGljYXRlIHZhbHVlcywgc3Vic2VxdWVudCB2YWx1ZXMgb3ZlcndyaXRlCiAgICAgICAgICogcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgdmFsdWVzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuNy4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IGludmVydGVkIG9iamVjdC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIsICdjJzogMSB9OwogICAgICAgICAqCiAgICAgICAgICogXy5pbnZlcnQob2JqZWN0KTsKICAgICAgICAgKiAvLyA9PiB7ICcxJzogJ2MnLCAnMic6ICdiJyB9CiAgICAgICAgICovCiAgICAgICAgdmFyIGludmVydCA9IGNyZWF0ZUludmVydGVyKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgewogICAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYKICAgICAgICAgICAgICB0eXBlb2YgdmFsdWUudG9TdHJpbmcgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICB2YWx1ZSA9IG5hdGl2ZU9iamVjdFRvU3RyaW5nLmNhbGwodmFsdWUpOwogICAgICAgICAgfQoKICAgICAgICAgIHJlc3VsdFt2YWx1ZV0gPSBrZXk7CiAgICAgICAgfSwgY29uc3RhbnQoaWRlbnRpdHkpKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5pbnZlcnRgIGV4Y2VwdCB0aGF0IHRoZSBpbnZlcnRlZCBvYmplY3QgaXMgZ2VuZXJhdGVkCiAgICAgICAgICogZnJvbSB0aGUgcmVzdWx0cyBvZiBydW5uaW5nIGVhY2ggZWxlbWVudCBvZiBgb2JqZWN0YCB0aHJ1IGBpdGVyYXRlZWAuIFRoZQogICAgICAgICAqIGNvcnJlc3BvbmRpbmcgaW52ZXJ0ZWQgdmFsdWUgb2YgZWFjaCBpbnZlcnRlZCBrZXkgaXMgYW4gYXJyYXkgb2Yga2V5cwogICAgICAgICAqIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZSBpbnZlcnRlZCB2YWx1ZS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQKICAgICAgICAgKiB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjEuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaW52ZXJ0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgaW52ZXJ0ZWQgb2JqZWN0LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH07CiAgICAgICAgICoKICAgICAgICAgKiBfLmludmVydEJ5KG9iamVjdCk7CiAgICAgICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfQogICAgICAgICAqCiAgICAgICAgICogXy5pbnZlcnRCeShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICogICByZXR1cm4gJ2dyb3VwJyArIHZhbHVlOwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+IHsgJ2dyb3VwMSc6IFsnYScsICdjJ10sICdncm91cDInOiBbJ2InXSB9CiAgICAgICAgICovCiAgICAgICAgdmFyIGludmVydEJ5ID0gY3JlYXRlSW52ZXJ0ZXIoZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7CiAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJgogICAgICAgICAgICAgIHR5cGVvZiB2YWx1ZS50b1N0cmluZyAhPSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHZhbHVlID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGhhc093blByb3BlcnR5LmNhbGwocmVzdWx0LCB2YWx1ZSkpIHsKICAgICAgICAgICAgcmVzdWx0W3ZhbHVlXS5wdXNoKGtleSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXN1bHRbdmFsdWVdID0gW2tleV07CiAgICAgICAgICB9CiAgICAgICAgfSwgZ2V0SXRlcmF0ZWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBJbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KICAgICAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguCiAgICAgICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHJlc3VsdCBvZiB0aGUgaW52b2tlZCBtZXRob2QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogWzEsIDIsIDMsIDRdIH0gfV0gfTsKICAgICAgICAgKgogICAgICAgICAqIF8uaW52b2tlKG9iamVjdCwgJ2FbMF0uYi5jLnNsaWNlJywgMSwgMyk7CiAgICAgICAgICogLy8gPT4gWzIsIDNdCiAgICAgICAgICovCiAgICAgICAgdmFyIGludm9rZSA9IGJhc2VSZXN0KGJhc2VJbnZva2UpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLiBTZWUgdGhlCiAgICAgICAgICogW0VTIHNwZWNdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLW9iamVjdC5rZXlzKQogICAgICAgICAqIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgICAgICogICB0aGlzLmIgPSAyOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgICAgICoKICAgICAgICAgKiBfLmtleXMobmV3IEZvbyk7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICAgICAqCiAgICAgICAgICogXy5rZXlzKCdoaScpOwogICAgICAgICAqIC8vID0+IFsnMCcsICcxJ10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBrZXlzKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCkgOiBiYXNlS2V5cyhvYmplY3QpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBGb28oKSB7CiAgICAgICAgICogICB0aGlzLmEgPSAxOwogICAgICAgICAqICAgdGhpcy5iID0gMjsKICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiBGb28ucHJvdG90eXBlLmMgPSAzOwogICAgICAgICAqCiAgICAgICAgICogXy5rZXlzSW4obmV3IEZvbyk7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2InLCAnYyddIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24ga2V5c0luKG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iamVjdCkgPyBhcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBiYXNlS2V5c0luKG9iamVjdCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWFwVmFsdWVzYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3Qgd2l0aCB0aGUKICAgICAgICAgKiBzYW1lIHZhbHVlcyBhcyBgb2JqZWN0YCBhbmQga2V5cyBnZW5lcmF0ZWQgYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlCiAgICAgICAgICogc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUgYGl0ZXJhdGVlYC4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQKICAgICAgICAgKiB3aXRoIHRocmVlIGFyZ3VtZW50czogKHZhbHVlLCBrZXksIG9iamVjdCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy44LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIG9iamVjdC4KICAgICAgICAgKiBAc2VlIF8ubWFwVmFsdWVzCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ubWFwS2V5cyh7ICdhJzogMSwgJ2InOiAyIH0sIGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICAgKiAgIHJldHVybiBrZXkgKyB2YWx1ZTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKiAvLyA9PiB7ICdhMSc6IDEsICdiMic6IDIgfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1hcEtleXMob2JqZWN0LCBpdGVyYXRlZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7CgogICAgICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgewogICAgICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmplY3QpLCB2YWx1ZSk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIG9iamVjdCB3aXRoIHRoZSBzYW1lIGtleXMgYXMgYG9iamVjdGAgYW5kIHZhbHVlcyBnZW5lcmF0ZWQKICAgICAgICAgKiBieSBydW5uaW5nIGVhY2ggb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IG9mIGBvYmplY3RgIHRocnUKICAgICAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKICAgICAgICAgKiAodmFsdWUsIGtleSwgb2JqZWN0KS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAyLjQuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LgogICAgICAgICAqIEBzZWUgXy5tYXBLZXlzCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB1c2VycyA9IHsKICAgICAgICAgKiAgICdmcmVkJzogICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwIH0sCiAgICAgICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH0KICAgICAgICAgKiB9OwogICAgICAgICAqCiAgICAgICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTsKICAgICAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpCiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLm1hcFZhbHVlcyh1c2VycywgJ2FnZScpOwogICAgICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXBWYWx1ZXMob2JqZWN0LCBpdGVyYXRlZSkgewogICAgICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMyk7CgogICAgICAgICAgYmFzZUZvck93bihvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBrZXksIG9iamVjdCkgewogICAgICAgICAgICBiYXNlQXNzaWduVmFsdWUocmVzdWx0LCBrZXksIGl0ZXJhdGVlKHZhbHVlLCBrZXksIG9iamVjdCkpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5hc3NpZ25gIGV4Y2VwdCB0aGF0IGl0IHJlY3Vyc2l2ZWx5IG1lcmdlcyBvd24gYW5kCiAgICAgICAgICogaW5oZXJpdGVkIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgb2Ygc291cmNlIG9iamVjdHMgaW50byB0aGUKICAgICAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmUKICAgICAgICAgKiBza2lwcGVkIGlmIGEgZGVzdGluYXRpb24gdmFsdWUgZXhpc3RzLiBBcnJheSBhbmQgcGxhaW4gb2JqZWN0IHByb3BlcnRpZXMKICAgICAgICAgKiBhcmUgbWVyZ2VkIHJlY3Vyc2l2ZWx5LiBPdGhlciBvYmplY3RzIGFuZCB2YWx1ZSB0eXBlcyBhcmUgb3ZlcnJpZGRlbiBieQogICAgICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudAogICAgICAgICAqIHNvdXJjZXMgb3ZlcndyaXRlIHByb3BlcnR5IGFzc2lnbm1lbnRzIG9mIHByZXZpb3VzIHNvdXJjZXMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAwLjUuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IFtzb3VyY2VzXSBUaGUgc291cmNlIG9iamVjdHMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsKICAgICAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dCiAgICAgICAgICogfTsKICAgICAgICAgKgogICAgICAgICAqIHZhciBvdGhlciA9IHsKICAgICAgICAgKiAgICdhJzogW3sgJ2MnOiAzIH0sIHsgJ2UnOiA1IH1dCiAgICAgICAgICogfTsKICAgICAgICAgKgogICAgICAgICAqIF8ubWVyZ2Uob2JqZWN0LCBvdGhlcik7CiAgICAgICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzogMiwgJ2MnOiAzIH0sIHsgJ2QnOiA0LCAnZSc6IDUgfV0gfQogICAgICAgICAqLwogICAgICAgIHZhciBtZXJnZSA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCkgewogICAgICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8ubWVyZ2VgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoCiAgICAgICAgICogaXMgaW52b2tlZCB0byBwcm9kdWNlIHRoZSBtZXJnZWQgdmFsdWVzIG9mIHRoZSBkZXN0aW5hdGlvbiBhbmQgc291cmNlCiAgICAgICAgICogcHJvcGVydGllcy4gSWYgYGN1c3RvbWl6ZXJgIHJldHVybnMgYHVuZGVmaW5lZGAsIG1lcmdpbmcgaXMgaGFuZGxlZCBieSB0aGUKICAgICAgICAgKiBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkIHdpdGggc2l4IGFyZ3VtZW50czoKICAgICAgICAgKiAob2JqVmFsdWUsIHNyY1ZhbHVlLCBrZXksIG9iamVjdCwgc291cmNlLCBzdGFjaykuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHsuLi5PYmplY3R9IHNvdXJjZXMgVGhlIHNvdXJjZSBvYmplY3RzLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBhc3NpZ25lZCB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUpIHsKICAgICAgICAgKiAgIGlmIChfLmlzQXJyYXkob2JqVmFsdWUpKSB7CiAgICAgICAgICogICAgIHJldHVybiBvYmpWYWx1ZS5jb25jYXQoc3JjVmFsdWUpOwogICAgICAgICAqICAgfQogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogWzFdLCAnYic6IFsyXSB9OwogICAgICAgICAqIHZhciBvdGhlciA9IHsgJ2EnOiBbM10sICdiJzogWzRdIH07CiAgICAgICAgICoKICAgICAgICAgKiBfLm1lcmdlV2l0aChvYmplY3QsIG90aGVyLCBjdXN0b21pemVyKTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogWzEsIDNdLCAnYic6IFsyLCA0XSB9CiAgICAgICAgICovCiAgICAgICAgdmFyIG1lcmdlV2l0aCA9IGNyZWF0ZUFzc2lnbmVyKGZ1bmN0aW9uKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcikgewogICAgICAgICAgYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplcik7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlCiAgICAgICAgICogb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBwYXRocyBvZiBgb2JqZWN0YCB0aGF0IGFyZSBub3Qgb21pdHRlZC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgc2xvd2VyIHRoYW4gYF8ucGlja2AuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgc291cmNlIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBbcGF0aHNdIFRoZSBwcm9wZXJ0eSBwYXRocyB0byBvbWl0LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9OwogICAgICAgICAqCiAgICAgICAgICogXy5vbWl0KG9iamVjdCwgWydhJywgJ2MnXSk7CiAgICAgICAgICogLy8gPT4geyAnYic6ICcyJyB9CiAgICAgICAgICovCiAgICAgICAgdmFyIG9taXQgPSBmbGF0UmVzdChmdW5jdGlvbihvYmplY3QsIHBhdGhzKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0ge307CiAgICAgICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBpc0RlZXAgPSBmYWxzZTsKICAgICAgICAgIHBhdGhzID0gYXJyYXlNYXAocGF0aHMsIGZ1bmN0aW9uKHBhdGgpIHsKICAgICAgICAgICAgcGF0aCA9IGNhc3RQYXRoKHBhdGgsIG9iamVjdCk7CiAgICAgICAgICAgIGlzRGVlcCB8fCAoaXNEZWVwID0gcGF0aC5sZW5ndGggPiAxKTsKICAgICAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgICAgICB9KTsKICAgICAgICAgIGNvcHlPYmplY3Qob2JqZWN0LCBnZXRBbGxLZXlzSW4ob2JqZWN0KSwgcmVzdWx0KTsKICAgICAgICAgIGlmIChpc0RlZXApIHsKICAgICAgICAgICAgcmVzdWx0ID0gYmFzZUNsb25lKHJlc3VsdCwgQ0xPTkVfREVFUF9GTEFHIHwgQ0xPTkVfRkxBVF9GTEFHIHwgQ0xPTkVfU1lNQk9MU19GTEFHLCBjdXN0b21PbWl0Q2xvbmUpOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGxlbmd0aCA9IHBhdGhzLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChsZW5ndGgtLSkgewogICAgICAgICAgICBiYXNlVW5zZXQocmVzdWx0LCBwYXRoc1tsZW5ndGhdKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBvcHBvc2l0ZSBvZiBgXy5waWNrQnlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGFuIG9iamVjdCBjb21wb3NlZCBvZgogICAgICAgICAqIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGBvYmplY3RgIHRoYXQKICAgICAgICAgKiBgcHJlZGljYXRlYCBkb2Vzbid0IHJldHVybiB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0d28KICAgICAgICAgKiBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9OwogICAgICAgICAqCiAgICAgICAgICogXy5vbWl0Qnkob2JqZWN0LCBfLmlzTnVtYmVyKTsKICAgICAgICAgKiAvLyA9PiB7ICdiJzogJzInIH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBvbWl0Qnkob2JqZWN0LCBwcmVkaWNhdGUpIHsKICAgICAgICAgIHJldHVybiBwaWNrQnkob2JqZWN0LCBuZWdhdGUoZ2V0SXRlcmF0ZWUocHJlZGljYXRlKSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIHBpY2tlZCBgb2JqZWN0YCBwcm9wZXJ0aWVzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IDEsICdiJzogJzInLCAnYyc6IDMgfTsKICAgICAgICAgKgogICAgICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pOwogICAgICAgICAqIC8vID0+IHsgJ2EnOiAxLCAnYyc6IDMgfQogICAgICAgICAqLwogICAgICAgIHZhciBwaWNrID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBwYXRocykgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBiYXNlUGljayhvYmplY3QsIHBhdGhzKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBvYmplY3QgY29tcG9zZWQgb2YgdGhlIGBvYmplY3RgIHByb3BlcnRpZXMgYHByZWRpY2F0ZWAgcmV0dXJucwogICAgICAgICAqIHRydXRoeSBmb3IuIFRoZSBwcmVkaWNhdGUgaXMgaW52b2tlZCB3aXRoIHR3byBhcmd1bWVudHM6ICh2YWx1ZSwga2V5KS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIHByb3BlcnR5LgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9OwogICAgICAgICAqCiAgICAgICAgICogXy5waWNrQnkob2JqZWN0LCBfLmlzTnVtYmVyKTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2MnOiAzIH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBwaWNrQnkob2JqZWN0LCBwcmVkaWNhdGUpIHsKICAgICAgICAgIGlmIChvYmplY3QgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgcHJvcHMgPSBhcnJheU1hcChnZXRBbGxLZXlzSW4ob2JqZWN0KSwgZnVuY3Rpb24ocHJvcCkgewogICAgICAgICAgICByZXR1cm4gW3Byb3BdOwogICAgICAgICAgfSk7CiAgICAgICAgICBwcmVkaWNhdGUgPSBnZXRJdGVyYXRlZShwcmVkaWNhdGUpOwogICAgICAgICAgcmV0dXJuIGJhc2VQaWNrQnkob2JqZWN0LCBwcm9wcywgZnVuY3Rpb24odmFsdWUsIHBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuIHByZWRpY2F0ZSh2YWx1ZSwgcGF0aFswXSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZ2V0YCBleGNlcHQgdGhhdCBpZiB0aGUgcmVzb2x2ZWQgdmFsdWUgaXMgYQogICAgICAgICAqIGZ1bmN0aW9uIGl0J3MgaW52b2tlZCB3aXRoIHRoZSBgdGhpc2AgYmluZGluZyBvZiBpdHMgcGFyZW50IG9iamVjdCBhbmQKICAgICAgICAgKiBpdHMgcmVzdWx0IGlzIHJldHVybmVkLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gcmVzb2x2ZS4KICAgICAgICAgKiBAcGFyYW0geyp9IFtkZWZhdWx0VmFsdWVdIFRoZSB2YWx1ZSByZXR1cm5lZCBmb3IgYHVuZGVmaW5lZGAgcmVzb2x2ZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MxJzogMywgJ2MyJzogXy5jb25zdGFudCg0KSB9IH1dIH07CiAgICAgICAgICoKICAgICAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzEnKTsKICAgICAgICAgKiAvLyA9PiAzCiAgICAgICAgICoKICAgICAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzInKTsKICAgICAgICAgKiAvLyA9PiA0CiAgICAgICAgICoKICAgICAgICAgKiBfLnJlc3VsdChvYmplY3QsICdhWzBdLmIuYzMnLCAnZGVmYXVsdCcpOwogICAgICAgICAqIC8vID0+ICdkZWZhdWx0JwogICAgICAgICAqCiAgICAgICAgICogXy5yZXN1bHQob2JqZWN0LCAnYVswXS5iLmMzJywgXy5jb25zdGFudCgnZGVmYXVsdCcpKTsKICAgICAgICAgKiAvLyA9PiAnZGVmYXVsdCcKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZXN1bHQob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgIHBhdGggPSBjYXN0UGF0aChwYXRoLCBvYmplY3QpOwoKICAgICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoOwoKICAgICAgICAgIC8vIEVuc3VyZSB0aGUgbG9vcCBpcyBlbnRlcmVkIHdoZW4gcGF0aCBpcyBlbXB0eS4KICAgICAgICAgIGlmICghbGVuZ3RoKSB7CiAgICAgICAgICAgIGxlbmd0aCA9IDE7CiAgICAgICAgICAgIG9iamVjdCA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gb2JqZWN0ID09IG51bGwgPyB1bmRlZmluZWQkMSA6IG9iamVjdFt0b0tleShwYXRoW2luZGV4XSldOwogICAgICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgICAgaW5kZXggPSBsZW5ndGg7CiAgICAgICAgICAgICAgdmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2JqZWN0ID0gaXNGdW5jdGlvbih2YWx1ZSkgPyB2YWx1ZS5jYWxsKG9iamVjdCkgOiB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIGEgcG9ydGlvbiBvZiBgcGF0aGAgZG9lc24ndCBleGlzdCwKICAgICAgICAgKiBpdCdzIGNyZWF0ZWQuIEFycmF5cyBhcmUgY3JlYXRlZCBmb3IgbWlzc2luZyBpbmRleCBwcm9wZXJ0aWVzIHdoaWxlIG9iamVjdHMKICAgICAgICAgKiBhcmUgY3JlYXRlZCBmb3IgYWxsIG90aGVyIG1pc3NpbmcgcHJvcGVydGllcy4gVXNlIGBfLnNldFdpdGhgIHRvIGN1c3RvbWl6ZQogICAgICAgICAqIGBwYXRoYCBjcmVhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuNy4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCiAgICAgICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiBbeyAnYic6IHsgJ2MnOiAzIH0gfV0gfTsKICAgICAgICAgKgogICAgICAgICAqIF8uc2V0KG9iamVjdCwgJ2FbMF0uYi5jJywgNCk7CiAgICAgICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTsKICAgICAgICAgKiAvLyA9PiA0CiAgICAgICAgICoKICAgICAgICAgKiBfLnNldChvYmplY3QsIFsneCcsICcwJywgJ3knLCAneiddLCA1KTsKICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3QueFswXS55LnopOwogICAgICAgICAqIC8vID0+IDUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gb2JqZWN0IDogYmFzZVNldChvYmplY3QsIHBhdGgsIHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uc2V0YCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBjdXN0b21pemVyYCB3aGljaCBpcwogICAgICAgICAqIGludm9rZWQgdG8gcHJvZHVjZSB0aGUgb2JqZWN0cyBvZiBgcGF0aGAuICBJZiBgY3VzdG9taXplcmAgcmV0dXJucyBgdW5kZWZpbmVkYAogICAgICAgICAqIHBhdGggY3JlYXRpb24gaXMgaGFuZGxlZCBieSB0aGUgbWV0aG9kIGluc3RlYWQuIFRoZSBgY3VzdG9taXplcmAgaXMgaW52b2tlZAogICAgICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAobnNWYWx1ZSwga2V5LCBuc09iamVjdCkuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0ge307CiAgICAgICAgICoKICAgICAgICAgKiBfLnNldFdpdGgob2JqZWN0LCAnWzBdWzFdJywgJ2EnLCBPYmplY3QpOwogICAgICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFdpdGgob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikgewogICAgICAgICAgY3VzdG9taXplciA9IHR5cGVvZiBjdXN0b21pemVyID09ICdmdW5jdGlvbicgPyBjdXN0b21pemVyIDogdW5kZWZpbmVkJDE7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBvYmplY3QgOiBiYXNlU2V0KG9iamVjdCwgcGF0aCwgdmFsdWUsIGN1c3RvbWl6ZXIpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMgZm9yIGBvYmplY3RgCiAgICAgICAgICogd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwIG9yIHNldCwgaXRzCiAgICAgICAgICogZW50cmllcyBhcmUgcmV0dXJuZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAYWxpYXMgZW50cmllcwogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBrZXktdmFsdWUgcGFpcnMuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIEZvbygpIHsKICAgICAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgICAgICogICB0aGlzLmIgPSAyOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgICAgICoKICAgICAgICAgKiBfLnRvUGFpcnMobmV3IEZvbyk7CiAgICAgICAgICogLy8gPT4gW1snYScsIDFdLCBbJ2InLCAyXV0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKICAgICAgICAgKi8KICAgICAgICB2YXIgdG9QYWlycyA9IGNyZWF0ZVRvUGFpcnMoa2V5cyk7CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2Ygb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQtdmFsdWUgcGFpcnMKICAgICAgICAgKiBmb3IgYG9iamVjdGAgd2hpY2ggY2FuIGJlIGNvbnN1bWVkIGJ5IGBfLmZyb21QYWlyc2AuIElmIGBvYmplY3RgIGlzIGEgbWFwCiAgICAgICAgICogb3Igc2V0LCBpdHMgZW50cmllcyBhcmUgcmV0dXJuZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAYWxpYXMgZW50cmllc0luCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGtleS12YWx1ZSBwYWlycy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICAgICAqICAgdGhpcy5hID0gMTsKICAgICAgICAgKiAgIHRoaXMuYiA9IDI7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMzsKICAgICAgICAgKgogICAgICAgICAqIF8udG9QYWlyc0luKG5ldyBGb28pOwogICAgICAgICAqIC8vID0+IFtbJ2EnLCAxXSwgWydiJywgMl0sIFsnYycsIDNdXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICAgICAqLwogICAgICAgIHZhciB0b1BhaXJzSW4gPSBjcmVhdGVUb1BhaXJzKGtleXNJbik7CgogICAgICAgIC8qKgogICAgICAgICAqIEFuIGFsdGVybmF0aXZlIHRvIGBfLnJlZHVjZWA7IHRoaXMgbWV0aG9kIHRyYW5zZm9ybXMgYG9iamVjdGAgdG8gYSBuZXcKICAgICAgICAgKiBgYWNjdW11bGF0b3JgIG9iamVjdCB3aGljaCBpcyB0aGUgcmVzdWx0IG9mIHJ1bm5pbmcgZWFjaCBvZiBpdHMgb3duCiAgICAgICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uCiAgICAgICAgICogcG90ZW50aWFsbHkgbXV0YXRpbmcgdGhlIGBhY2N1bXVsYXRvcmAgb2JqZWN0LiBJZiBgYWNjdW11bGF0b3JgIGlzIG5vdAogICAgICAgICAqIHByb3ZpZGVkLCBhIG5ldyBvYmplY3Qgd2l0aCB0aGUgc2FtZSBgW1tQcm90b3R5cGVdXWAgd2lsbCBiZSB1c2VkLiBUaGUKICAgICAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS4KICAgICAgICAgKiBJdGVyYXRlZSBmdW5jdGlvbnMgbWF5IGV4aXQgaXRlcmF0aW9uIGVhcmx5IGJ5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMS4zLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udHJhbnNmb3JtKFsyLCAzLCA0XSwgZnVuY3Rpb24ocmVzdWx0LCBuKSB7CiAgICAgICAgICogICByZXN1bHQucHVzaChuICo9IG4pOwogICAgICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7CiAgICAgICAgICogfSwgW10pOwogICAgICAgICAqIC8vID0+IFs0LCA5XQogICAgICAgICAqCiAgICAgICAgICogXy50cmFuc2Zvcm0oeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgewogICAgICAgICAqICAgKHJlc3VsdFt2YWx1ZV0gfHwgKHJlc3VsdFt2YWx1ZV0gPSBbXSkpLnB1c2goa2V5KTsKICAgICAgICAgKiB9LCB7fSk7CiAgICAgICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShvYmplY3QsIGl0ZXJhdGVlLCBhY2N1bXVsYXRvcikgewogICAgICAgICAgdmFyIGlzQXJyID0gaXNBcnJheShvYmplY3QpLAogICAgICAgICAgICAgIGlzQXJyTGlrZSA9IGlzQXJyIHx8IGlzQnVmZmVyKG9iamVjdCkgfHwgaXNUeXBlZEFycmF5KG9iamVjdCk7CgogICAgICAgICAgaXRlcmF0ZWUgPSBnZXRJdGVyYXRlZShpdGVyYXRlZSwgNCk7CiAgICAgICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkgewogICAgICAgICAgICB2YXIgQ3RvciA9IG9iamVjdCAmJiBvYmplY3QuY29uc3RydWN0b3I7CiAgICAgICAgICAgIGlmIChpc0Fyckxpa2UpIHsKICAgICAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc09iamVjdChvYmplY3QpKSB7CiAgICAgICAgICAgICAgYWNjdW11bGF0b3IgPSBpc0Z1bmN0aW9uKEN0b3IpID8gYmFzZUNyZWF0ZShnZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICAoaXNBcnJMaWtlID8gYXJyYXlFYWNoIDogYmFzZUZvck93bikob2JqZWN0LCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIG9iamVjdCkgewogICAgICAgICAgICByZXR1cm4gaXRlcmF0ZWUoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleCwgb2JqZWN0KTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgcHJvcGVydHkgYXQgYHBhdGhgIG9mIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIG11dGF0ZXMgYG9iamVjdGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gdW5zZXQuCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBwcm9wZXJ0eSBpcyBkZWxldGVkLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogNyB9IH1dIH07CiAgICAgICAgICogXy51bnNldChvYmplY3QsICdhWzBdLmIuYycpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdCk7CiAgICAgICAgICogLy8gPT4geyAnYSc6IFt7ICdiJzoge30gfV0gfTsKICAgICAgICAgKgogICAgICAgICAqIF8udW5zZXQob2JqZWN0LCBbJ2EnLCAnMCcsICdiJywgJ2MnXSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2cob2JqZWN0KTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogW3sgJ2InOiB7fSB9XSB9OwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHVuc2V0KG9iamVjdCwgcGF0aCkgewogICAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdHJ1ZSA6IGJhc2VVbnNldChvYmplY3QsIHBhdGgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5zZXRgIGV4Y2VwdCB0aGF0IGFjY2VwdHMgYHVwZGF0ZXJgIHRvIHByb2R1Y2UgdGhlCiAgICAgICAgICogdmFsdWUgdG8gc2V0LiBVc2UgYF8udXBkYXRlV2l0aGAgdG8gY3VzdG9taXplIGBwYXRoYCBjcmVhdGlvbi4gVGhlIGB1cGRhdGVyYAogICAgICAgICAqIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjYuMAogICAgICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBzZXQuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlciBUaGUgZnVuY3Rpb24gdG8gcHJvZHVjZSB0aGUgdXBkYXRlZCB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0geyAnYSc6IFt7ICdiJzogeyAnYyc6IDMgfSB9XSB9OwogICAgICAgICAqCiAgICAgICAgICogXy51cGRhdGUob2JqZWN0LCAnYVswXS5iLmMnLCBmdW5jdGlvbihuKSB7IHJldHVybiBuICogbjsgfSk7CiAgICAgICAgICogY29uc29sZS5sb2cob2JqZWN0LmFbMF0uYi5jKTsKICAgICAgICAgKiAvLyA9PiA5CiAgICAgICAgICoKICAgICAgICAgKiBfLnVwZGF0ZShvYmplY3QsICd4WzBdLnkueicsIGZ1bmN0aW9uKG4pIHsgcmV0dXJuIG4gPyBuICsgMSA6IDA7IH0pOwogICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdC54WzBdLnkueik7CiAgICAgICAgICogLy8gPT4gMAogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZShvYmplY3QsIHBhdGgsIHVwZGF0ZXIpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlcikpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy51cGRhdGVgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYGN1c3RvbWl6ZXJgIHdoaWNoIGlzCiAgICAgICAgICogaW52b2tlZCB0byBwcm9kdWNlIHRoZSBvYmplY3RzIG9mIGBwYXRoYC4gIElmIGBjdXN0b21pemVyYCByZXR1cm5zIGB1bmRlZmluZWRgCiAgICAgICAgICogcGF0aCBjcmVhdGlvbiBpcyBoYW5kbGVkIGJ5IHRoZSBtZXRob2QgaW5zdGVhZC4gVGhlIGBjdXN0b21pemVyYCBpcyBpbnZva2VkCiAgICAgICAgICogd2l0aCB0aHJlZSBhcmd1bWVudHM6IChuc1ZhbHVlLCBrZXksIG5zT2JqZWN0KS4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBtdXRhdGVzIGBvYmplY3RgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuNi4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgICAgICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIHNldC4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVyIFRoZSBmdW5jdGlvbiB0byBwcm9kdWNlIHRoZSB1cGRhdGVkIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy4KICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0ID0ge307CiAgICAgICAgICoKICAgICAgICAgKiBfLnVwZGF0ZVdpdGgob2JqZWN0LCAnWzBdWzFdJywgXy5jb25zdGFudCgnYScpLCBPYmplY3QpOwogICAgICAgICAqIC8vID0+IHsgJzAnOiB7ICcxJzogJ2EnIH0gfQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHVwZGF0ZVdpdGgob2JqZWN0LCBwYXRoLCB1cGRhdGVyLCBjdXN0b21pemVyKSB7CiAgICAgICAgICBjdXN0b21pemVyID0gdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJyA/IGN1c3RvbWl6ZXIgOiB1bmRlZmluZWQkMTsKICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IG9iamVjdCA6IGJhc2VVcGRhdGUob2JqZWN0LCBwYXRoLCBjYXN0RnVuY3Rpb24odXBkYXRlciksIGN1c3RvbWl6ZXIpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICAgICAqICAgdGhpcy5hID0gMTsKICAgICAgICAgKiAgIHRoaXMuYiA9IDI7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMzsKICAgICAgICAgKgogICAgICAgICAqIF8udmFsdWVzKG5ldyBGb28pOwogICAgICAgICAqIC8vID0+IFsxLCAyXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICAgICAqCiAgICAgICAgICogXy52YWx1ZXMoJ2hpJyk7CiAgICAgICAgICogLy8gPT4gWydoJywgJ2knXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHZhbHVlcyhvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogYmFzZVZhbHVlcyhvYmplY3QsIGtleXMob2JqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eQogICAgICAgICAqIHZhbHVlcyBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBOb24tb2JqZWN0IHZhbHVlcyBhcmUgY29lcmNlZCB0byBvYmplY3RzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICAgICAqICAgdGhpcy5hID0gMTsKICAgICAgICAgKiAgIHRoaXMuYiA9IDI7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogRm9vLnByb3RvdHlwZS5jID0gMzsKICAgICAgICAgKgogICAgICAgICAqIF8udmFsdWVzSW4obmV3IEZvbyk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDNdIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdmFsdWVzSW4ob2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IG51bGwgPyBbXSA6IGJhc2VWYWx1ZXMob2JqZWN0LCBrZXlzSW4ob2JqZWN0KSk7CiAgICAgICAgfQoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIC8qKgogICAgICAgICAqIENsYW1wcyBgbnVtYmVyYCB3aXRoaW4gdGhlIGluY2x1c2l2ZSBgbG93ZXJgIGFuZCBgdXBwZXJgIGJvdW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBOdW1iZXIKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gY2xhbXAuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcl0gVGhlIGxvd2VyIGJvdW5kLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlciBUaGUgdXBwZXIgYm91bmQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY2xhbXBlZCBudW1iZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uY2xhbXAoLTEwLCAtNSwgNSk7CiAgICAgICAgICogLy8gPT4gLTUKICAgICAgICAgKgogICAgICAgICAqIF8uY2xhbXAoMTAsIC01LCA1KTsKICAgICAgICAgKiAvLyA9PiA1CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY2xhbXAobnVtYmVyLCBsb3dlciwgdXBwZXIpIHsKICAgICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgdXBwZXIgPSBsb3dlcjsKICAgICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQkMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh1cHBlciAhPT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgdXBwZXIgPSB0b051bWJlcih1cHBlcik7CiAgICAgICAgICAgIHVwcGVyID0gdXBwZXIgPT09IHVwcGVyID8gdXBwZXIgOiAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGxvd2VyICE9PSB1bmRlZmluZWQkMSkgewogICAgICAgICAgICBsb3dlciA9IHRvTnVtYmVyKGxvd2VyKTsKICAgICAgICAgICAgbG93ZXIgPSBsb3dlciA9PT0gbG93ZXIgPyBsb3dlciA6IDA7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gYmFzZUNsYW1wKHRvTnVtYmVyKG51bWJlciksIGxvd2VyLCB1cHBlcik7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYG5gIGlzIGJldHdlZW4gYHN0YXJ0YCBhbmQgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gSWYKICAgICAgICAgKiBgZW5kYCBpcyBub3Qgc3BlY2lmaWVkLCBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuCiAgICAgICAgICogSWYgYHN0YXJ0YCBpcyBncmVhdGVyIHRoYW4gYGVuZGAgdGhlIHBhcmFtcyBhcmUgc3dhcHBlZCB0byBzdXBwb3J0CiAgICAgICAgICogbmVnYXRpdmUgcmFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMy4wCiAgICAgICAgICogQGNhdGVnb3J5IE51bWJlcgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBudW1iZXIgVGhlIG51bWJlciB0byBjaGVjay4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZS4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYG51bWJlcmAgaXMgaW4gdGhlIHJhbmdlLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICogQHNlZSBfLnJhbmdlLCBfLnJhbmdlUmlnaHQKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5pblJhbmdlKDMsIDIsIDQpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uaW5SYW5nZSg0LCA4KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBfLmluUmFuZ2UoNCwgMik7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaW5SYW5nZSgyLCAyKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogXy5pblJhbmdlKDEuMiwgMik7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5pblJhbmdlKDUuMiwgNCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uaW5SYW5nZSgtMywgLTIsIC02KTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaW5SYW5nZShudW1iZXIsIHN0YXJ0LCBlbmQpIHsKICAgICAgICAgIHN0YXJ0ID0gdG9GaW5pdGUoc3RhcnQpOwogICAgICAgICAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgZW5kID0gc3RhcnQ7CiAgICAgICAgICAgIHN0YXJ0ID0gMDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVuZCA9IHRvRmluaXRlKGVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBudW1iZXIgPSB0b051bWJlcihudW1iZXIpOwogICAgICAgICAgcmV0dXJuIGJhc2VJblJhbmdlKG51bWJlciwgc3RhcnQsIGVuZCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBQcm9kdWNlcyBhIHJhbmRvbSBudW1iZXIgYmV0d2VlbiB0aGUgaW5jbHVzaXZlIGBsb3dlcmAgYW5kIGB1cHBlcmAgYm91bmRzLgogICAgICAgICAqIElmIG9ubHkgb25lIGFyZ3VtZW50IGlzIHByb3ZpZGVkIGEgbnVtYmVyIGJldHdlZW4gYDBgIGFuZCB0aGUgZ2l2ZW4gbnVtYmVyCiAgICAgICAgICogaXMgcmV0dXJuZWQuIElmIGBmbG9hdGluZ2AgaXMgYHRydWVgLCBvciBlaXRoZXIgYGxvd2VyYCBvciBgdXBwZXJgIGFyZQogICAgICAgICAqIGZsb2F0cywgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaXMgcmV0dXJuZWQgaW5zdGVhZCBvZiBhbiBpbnRlZ2VyLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIEphdmFTY3JpcHQgZm9sbG93cyB0aGUgSUVFRS03NTQgc3RhbmRhcmQgZm9yIHJlc29sdmluZwogICAgICAgICAqIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB3aGljaCBjYW4gcHJvZHVjZSB1bmV4cGVjdGVkIHJlc3VsdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMC43LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTnVtYmVyCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsb3dlcj0wXSBUaGUgbG93ZXIgYm91bmQuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFt1cHBlcj0xXSBUaGUgdXBwZXIgYm91bmQuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbZmxvYXRpbmddIFNwZWNpZnkgcmV0dXJuaW5nIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHJhbmRvbSBudW1iZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ucmFuZG9tKDAsIDUpOwogICAgICAgICAqIC8vID0+IGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1CiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmRvbSg1KTsKICAgICAgICAgKiAvLyA9PiBhbHNvIGFuIGludGVnZXIgYmV0d2VlbiAwIGFuZCA1CiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmRvbSg1LCB0cnVlKTsKICAgICAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDAgYW5kIDUKICAgICAgICAgKgogICAgICAgICAqIF8ucmFuZG9tKDEuMiwgNS4yKTsKICAgICAgICAgKiAvLyA9PiBhIGZsb2F0aW5nLXBvaW50IG51bWJlciBiZXR3ZWVuIDEuMiBhbmQgNS4yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcmFuZG9tKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpIHsKICAgICAgICAgIGlmIChmbG9hdGluZyAmJiB0eXBlb2YgZmxvYXRpbmcgIT0gJ2Jvb2xlYW4nICYmIGlzSXRlcmF0ZWVDYWxsKGxvd2VyLCB1cHBlciwgZmxvYXRpbmcpKSB7CiAgICAgICAgICAgIHVwcGVyID0gZmxvYXRpbmcgPSB1bmRlZmluZWQkMTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmbG9hdGluZyA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB1cHBlciA9PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICBmbG9hdGluZyA9IHVwcGVyOwogICAgICAgICAgICAgIHVwcGVyID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIGxvd2VyID09ICdib29sZWFuJykgewogICAgICAgICAgICAgIGZsb2F0aW5nID0gbG93ZXI7CiAgICAgICAgICAgICAgbG93ZXIgPSB1bmRlZmluZWQkMTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGxvd2VyID09PSB1bmRlZmluZWQkMSAmJiB1cHBlciA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgbG93ZXIgPSAwOwogICAgICAgICAgICB1cHBlciA9IDE7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbG93ZXIgPSB0b0Zpbml0ZShsb3dlcik7CiAgICAgICAgICAgIGlmICh1cHBlciA9PT0gdW5kZWZpbmVkJDEpIHsKICAgICAgICAgICAgICB1cHBlciA9IGxvd2VyOwogICAgICAgICAgICAgIGxvd2VyID0gMDsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB1cHBlciA9IHRvRmluaXRlKHVwcGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGxvd2VyID4gdXBwZXIpIHsKICAgICAgICAgICAgdmFyIHRlbXAgPSBsb3dlcjsKICAgICAgICAgICAgbG93ZXIgPSB1cHBlcjsKICAgICAgICAgICAgdXBwZXIgPSB0ZW1wOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGZsb2F0aW5nIHx8IGxvd2VyICUgMSB8fCB1cHBlciAlIDEpIHsKICAgICAgICAgICAgdmFyIHJhbmQgPSBuYXRpdmVSYW5kb20oKTsKICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZU1pbihsb3dlciArIChyYW5kICogKHVwcGVyIC0gbG93ZXIgKyBmcmVlUGFyc2VGbG9hdCgnMWUtJyArICgocmFuZCArICcnKS5sZW5ndGggLSAxKSkpKSwgdXBwZXIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGJhc2VSYW5kb20obG93ZXIsIHVwcGVyKTsKICAgICAgICB9CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gW2NhbWVsIGNhc2VdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NhbWVsQ2FzZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBjYW1lbCBjYXNlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uY2FtZWxDYXNlKCdGb28gQmFyJyk7CiAgICAgICAgICogLy8gPT4gJ2Zvb0JhcicKICAgICAgICAgKgogICAgICAgICAqIF8uY2FtZWxDYXNlKCctLWZvby1iYXItLScpOwogICAgICAgICAqIC8vID0+ICdmb29CYXInCiAgICAgICAgICoKICAgICAgICAgKiBfLmNhbWVsQ2FzZSgnX19GT09fQkFSX18nKTsKICAgICAgICAgKiAvLyA9PiAnZm9vQmFyJwogICAgICAgICAqLwogICAgICAgIHZhciBjYW1lbENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHsKICAgICAgICAgIHdvcmQgPSB3b3JkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0ICsgKGluZGV4ID8gY2FwaXRhbGl6ZSh3b3JkKSA6IHdvcmQpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGBzdHJpbmdgIHRvIHVwcGVyIGNhc2UgYW5kIHRoZSByZW1haW5pbmcKICAgICAgICAgKiB0byBsb3dlciBjYXNlLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNhcGl0YWxpemUuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmNhcGl0YWxpemUoJ0ZSRUQnKTsKICAgICAgICAgKiAvLyA9PiAnRnJlZCcKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjYXBpdGFsaXplKHN0cmluZykgewogICAgICAgICAgcmV0dXJuIHVwcGVyRmlyc3QodG9TdHJpbmcoc3RyaW5nKS50b0xvd2VyQ2FzZSgpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIERlYnVycnMgYHN0cmluZ2AgYnkgY29udmVydGluZwogICAgICAgICAqIFtMYXRpbi0xIFN1cHBsZW1lbnRdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0xhdGluLTFfU3VwcGxlbWVudF8oVW5pY29kZV9ibG9jaykjQ2hhcmFjdGVyX3RhYmxlKQogICAgICAgICAqIGFuZCBbTGF0aW4gRXh0ZW5kZWQtQV0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGF0aW5fRXh0ZW5kZWQtQSkKICAgICAgICAgKiBsZXR0ZXJzIHRvIGJhc2ljIExhdGluIGxldHRlcnMgYW5kIHJlbW92aW5nCiAgICAgICAgICogW2NvbWJpbmluZyBkaWFjcml0aWNhbCBtYXJrc10oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29tYmluaW5nX0RpYWNyaXRpY2FsX01hcmtzKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBkZWJ1cnIuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZGVidXJyZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmRlYnVycignZMOpasOgIHZ1Jyk7CiAgICAgICAgICogLy8gPT4gJ2RlamEgdnUnCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZGVidXJyKHN0cmluZykgewogICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTsKICAgICAgICAgIHJldHVybiBzdHJpbmcgJiYgc3RyaW5nLnJlcGxhY2UocmVMYXRpbiwgZGVidXJyTGV0dGVyKS5yZXBsYWNlKHJlQ29tYm9NYXJrLCAnJyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgZW5kcyB3aXRoIHRoZSBnaXZlbiB0YXJnZXQgc3RyaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGluc3BlY3QuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFt0YXJnZXRdIFRoZSBzdHJpbmcgdG8gc2VhcmNoIGZvci4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3Bvc2l0aW9uPXN0cmluZy5sZW5ndGhdIFRoZSBwb3NpdGlvbiB0byBzZWFyY2ggdXAgdG8uCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBzdHJpbmdgIGVuZHMgd2l0aCBgdGFyZ2V0YCwKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmVuZHNXaXRoKCdhYmMnLCAnYycpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJyk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIF8uZW5kc1dpdGgoJ2FiYycsICdiJywgMik7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGVuZHNXaXRoKHN0cmluZywgdGFyZ2V0LCBwb3NpdGlvbikgewogICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTsKICAgICAgICAgIHRhcmdldCA9IGJhc2VUb1N0cmluZyh0YXJnZXQpOwoKICAgICAgICAgIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoOwogICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkJDEKICAgICAgICAgICAgPyBsZW5ndGgKICAgICAgICAgICAgOiBiYXNlQ2xhbXAodG9JbnRlZ2VyKHBvc2l0aW9uKSwgMCwgbGVuZ3RoKTsKCiAgICAgICAgICB2YXIgZW5kID0gcG9zaXRpb247CiAgICAgICAgICBwb3NpdGlvbiAtPSB0YXJnZXQubGVuZ3RoOwogICAgICAgICAgcmV0dXJuIHBvc2l0aW9uID49IDAgJiYgc3RyaW5nLnNsaWNlKHBvc2l0aW9uLCBlbmQpID09IHRhcmdldDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIHRoZSBjaGFyYWN0ZXJzICImIiwgIjwiLCAiPiIsICciJywgYW5kICInIiBpbiBgc3RyaW5nYCB0byB0aGVpcgogICAgICAgICAqIGNvcnJlc3BvbmRpbmcgSFRNTCBlbnRpdGllcy4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBObyBvdGhlciBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLiBUbyBlc2NhcGUgYWRkaXRpb25hbAogICAgICAgICAqIGNoYXJhY3RlcnMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLgogICAgICAgICAqCiAgICAgICAgICogVGhvdWdoIHRoZSAiPiIgY2hhcmFjdGVyIGlzIGVzY2FwZWQgZm9yIHN5bW1ldHJ5LCBjaGFyYWN0ZXJzIGxpa2UKICAgICAgICAgKiAiPiIgYW5kICIvIiBkb24ndCBuZWVkIGVzY2FwaW5nIGluIEhUTUwgYW5kIGhhdmUgbm8gc3BlY2lhbCBtZWFuaW5nCiAgICAgICAgICogdW5sZXNzIHRoZXkncmUgcGFydCBvZiBhIHRhZyBvciB1bnF1b3RlZCBhdHRyaWJ1dGUgdmFsdWUuIFNlZQogICAgICAgICAqIFtNYXRoaWFzIEJ5bmVucydzIGFydGljbGVdKGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kcykKICAgICAgICAgKiAodW5kZXIgInNlbWktcmVsYXRlZCBmdW4gZmFjdCIpIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICoKICAgICAgICAgKiBXaGVuIHdvcmtpbmcgd2l0aCBIVE1MIHlvdSBzaG91bGQgYWx3YXlzCiAgICAgICAgICogW3F1b3RlIGF0dHJpYnV0ZSB2YWx1ZXNdKGh0dHA6Ly93b25rby5jb20vcG9zdC9odG1sLWVzY2FwaW5nKSB0byByZWR1Y2UKICAgICAgICAgKiBYU1MgdmVjdG9ycy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBlc2NhcGUuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgZXNjYXBlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZXNjYXBlKCdmcmVkLCBiYXJuZXksICYgcGViYmxlcycpOwogICAgICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICZhbXA7IHBlYmJsZXMnCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZXNjYXBlKHN0cmluZykgewogICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTsKICAgICAgICAgIHJldHVybiAoc3RyaW5nICYmIHJlSGFzVW5lc2NhcGVkSHRtbC50ZXN0KHN0cmluZykpCiAgICAgICAgICAgID8gc3RyaW5nLnJlcGxhY2UocmVVbmVzY2FwZWRIdG1sLCBlc2NhcGVIdG1sQ2hhcikKICAgICAgICAgICAgOiBzdHJpbmc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBFc2NhcGVzIHRoZSBgUmVnRXhwYCBzcGVjaWFsIGNoYXJhY3RlcnMgIl4iLCAiJCIsICJcIiwgIi4iLCAiKiIsICIrIiwKICAgICAgICAgKiAiPyIsICIoIiwgIikiLCAiWyIsICJdIiwgInsiLCAifSIsIGFuZCAifCIgaW4gYHN0cmluZ2AuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gZXNjYXBlLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVzY2FwZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLmVzY2FwZVJlZ0V4cCgnW2xvZGFzaF0oaHR0cHM6Ly9sb2Rhc2guY29tLyknKTsKICAgICAgICAgKiAvLyA9PiAnXFtsb2Rhc2hcXVwoaHR0cHM6Ly9sb2Rhc2hcLmNvbS9cKScKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBlc2NhcGVSZWdFeHAoc3RyaW5nKSB7CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwogICAgICAgICAgcmV0dXJuIChzdHJpbmcgJiYgcmVIYXNSZWdFeHBDaGFyLnRlc3Qoc3RyaW5nKSkKICAgICAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZVJlZ0V4cENoYXIsICdcXCQmJykKICAgICAgICAgICAgOiBzdHJpbmc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0bwogICAgICAgICAqIFtrZWJhYiBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTcGVjaWFsX2Nhc2Vfc3R5bGVzKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGtlYmFiIGNhc2VkIHN0cmluZy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5rZWJhYkNhc2UoJ0ZvbyBCYXInKTsKICAgICAgICAgKiAvLyA9PiAnZm9vLWJhcicKICAgICAgICAgKgogICAgICAgICAqIF8ua2ViYWJDYXNlKCdmb29CYXInKTsKICAgICAgICAgKiAvLyA9PiAnZm9vLWJhcicKICAgICAgICAgKgogICAgICAgICAqIF8ua2ViYWJDYXNlKCdfX0ZPT19CQVJfXycpOwogICAgICAgICAqIC8vID0+ICdmb28tYmFyJwogICAgICAgICAqLwogICAgICAgIHZhciBrZWJhYkNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnLScgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIGxvd2VyIGNhc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBsb3dlciBjYXNlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ubG93ZXJDYXNlKCctLUZvby1CYXItLScpOwogICAgICAgICAqIC8vID0+ICdmb28gYmFyJwogICAgICAgICAqCiAgICAgICAgICogXy5sb3dlckNhc2UoJ2Zvb0JhcicpOwogICAgICAgICAqIC8vID0+ICdmb28gYmFyJwogICAgICAgICAqCiAgICAgICAgICogXy5sb3dlckNhc2UoJ19fRk9PX0JBUl9fJyk7CiAgICAgICAgICogLy8gPT4gJ2ZvbyBiYXInCiAgICAgICAgICovCiAgICAgICAgdmFyIGxvd2VyQ2FzZSA9IGNyZWF0ZUNvbXBvdW5kZXIoZnVuY3Rpb24ocmVzdWx0LCB3b3JkLCBpbmRleCkgewogICAgICAgICAgcmV0dXJuIHJlc3VsdCArIChpbmRleCA/ICcgJyA6ICcnKSArIHdvcmQudG9Mb3dlckNhc2UoKTsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBgc3RyaW5nYCB0byBsb3dlciBjYXNlLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5sb3dlckZpcnN0KCdGcmVkJyk7CiAgICAgICAgICogLy8gPT4gJ2ZyZWQnCiAgICAgICAgICoKICAgICAgICAgKiBfLmxvd2VyRmlyc3QoJ0ZSRUQnKTsKICAgICAgICAgKiAvLyA9PiAnZlJFRCcKICAgICAgICAgKi8KICAgICAgICB2YXIgbG93ZXJGaXJzdCA9IGNyZWF0ZUNhc2VGaXJzdCgndG9Mb3dlckNhc2UnKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZXMgaWYgaXQncyBzaG9ydGVyIHRoYW4gYGxlbmd0aGAuCiAgICAgICAgICogUGFkZGluZyBjaGFyYWN0ZXJzIGFyZSB0cnVuY2F0ZWQgaWYgdGhleSBjYW4ndCBiZSBldmVubHkgZGl2aWRlZCBieSBgbGVuZ3RoYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBwYWQuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9MF0gVGhlIHBhZGRpbmcgbGVuZ3RoLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbY2hhcnM9JyAnXSBUaGUgc3RyaW5nIHVzZWQgYXMgcGFkZGluZy4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBwYWRkZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnBhZCgnYWJjJywgOCk7CiAgICAgICAgICogLy8gPT4gJyAgYWJjICAgJwogICAgICAgICAqCiAgICAgICAgICogXy5wYWQoJ2FiYycsIDgsICdfLScpOwogICAgICAgICAqIC8vID0+ICdfLWFiY18tXycKICAgICAgICAgKgogICAgICAgICAqIF8ucGFkKCdhYmMnLCAzKTsKICAgICAgICAgKiAvLyA9PiAnYWJjJwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHBhZChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHsKICAgICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7CiAgICAgICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTsKCiAgICAgICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDsKICAgICAgICAgIGlmICghbGVuZ3RoIHx8IHN0ckxlbmd0aCA+PSBsZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBtaWQgPSAobGVuZ3RoIC0gc3RyTGVuZ3RoKSAvIDI7CiAgICAgICAgICByZXR1cm4gKAogICAgICAgICAgICBjcmVhdGVQYWRkaW5nKG5hdGl2ZUZsb29yKG1pZCksIGNoYXJzKSArCiAgICAgICAgICAgIHN0cmluZyArCiAgICAgICAgICAgIGNyZWF0ZVBhZGRpbmcobmF0aXZlQ2VpbChtaWQpLCBjaGFycykKICAgICAgICAgICk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBQYWRzIGBzdHJpbmdgIG9uIHRoZSByaWdodCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nCiAgICAgICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ucGFkRW5kKCdhYmMnLCA2KTsKICAgICAgICAgKiAvLyA9PiAnYWJjICAgJwogICAgICAgICAqCiAgICAgICAgICogXy5wYWRFbmQoJ2FiYycsIDYsICdfLScpOwogICAgICAgICAqIC8vID0+ICdhYmNfLV8nCiAgICAgICAgICoKICAgICAgICAgKiBfLnBhZEVuZCgnYWJjJywgMyk7CiAgICAgICAgICogLy8gPT4gJ2FiYycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBwYWRFbmQoc3RyaW5nLCBsZW5ndGgsIGNoYXJzKSB7CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwogICAgICAgICAgbGVuZ3RoID0gdG9JbnRlZ2VyKGxlbmd0aCk7CgogICAgICAgICAgdmFyIHN0ckxlbmd0aCA9IGxlbmd0aCA/IHN0cmluZ1NpemUoc3RyaW5nKSA6IDA7CiAgICAgICAgICByZXR1cm4gKGxlbmd0aCAmJiBzdHJMZW5ndGggPCBsZW5ndGgpCiAgICAgICAgICAgID8gKHN0cmluZyArIGNyZWF0ZVBhZGRpbmcobGVuZ3RoIC0gc3RyTGVuZ3RoLCBjaGFycykpCiAgICAgICAgICAgIDogc3RyaW5nOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUGFkcyBgc3RyaW5nYCBvbiB0aGUgbGVmdCBzaWRlIGlmIGl0J3Mgc2hvcnRlciB0aGFuIGBsZW5ndGhgLiBQYWRkaW5nCiAgICAgICAgICogY2hhcmFjdGVycyBhcmUgdHJ1bmNhdGVkIGlmIHRoZXkgZXhjZWVkIGBsZW5ndGhgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHBhZC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2xlbmd0aD0wXSBUaGUgcGFkZGluZyBsZW5ndGguCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz0nICddIFRoZSBzdHJpbmcgdXNlZCBhcyBwYWRkaW5nLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHBhZGRlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ucGFkU3RhcnQoJ2FiYycsIDYpOwogICAgICAgICAqIC8vID0+ICcgICBhYmMnCiAgICAgICAgICoKICAgICAgICAgKiBfLnBhZFN0YXJ0KCdhYmMnLCA2LCAnXy0nKTsKICAgICAgICAgKiAvLyA9PiAnXy1fYWJjJwogICAgICAgICAqCiAgICAgICAgICogXy5wYWRTdGFydCgnYWJjJywgMyk7CiAgICAgICAgICogLy8gPT4gJ2FiYycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBwYWRTdGFydChzdHJpbmcsIGxlbmd0aCwgY2hhcnMpIHsKICAgICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7CiAgICAgICAgICBsZW5ndGggPSB0b0ludGVnZXIobGVuZ3RoKTsKCiAgICAgICAgICB2YXIgc3RyTGVuZ3RoID0gbGVuZ3RoID8gc3RyaW5nU2l6ZShzdHJpbmcpIDogMDsKICAgICAgICAgIHJldHVybiAobGVuZ3RoICYmIHN0ckxlbmd0aCA8IGxlbmd0aCkKICAgICAgICAgICAgPyAoY3JlYXRlUGFkZGluZyhsZW5ndGggLSBzdHJMZW5ndGgsIGNoYXJzKSArIHN0cmluZykKICAgICAgICAgICAgOiBzdHJpbmc7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0byBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXguIElmIGByYWRpeGAgaXMKICAgICAgICAgKiBgdW5kZWZpbmVkYCBvciBgMGAsIGEgYHJhZGl4YCBvZiBgMTBgIGlzIHVzZWQgdW5sZXNzIGB2YWx1ZWAgaXMgYQogICAgICAgICAqIGhleGFkZWNpbWFsLCBpbiB3aGljaCBjYXNlIGEgYHJhZGl4YCBvZiBgMTZgIGlzIHVzZWQuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgYWxpZ25zIHdpdGggdGhlCiAgICAgICAgICogW0VTNSBpbXBsZW1lbnRhdGlvbl0oaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMS4yLjIpIG9mIGBwYXJzZUludGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMS4xLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtyYWRpeD0xMF0gVGhlIHJhZGl4IHRvIGludGVycHJldCBgdmFsdWVgIGJ5LgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29udmVydGVkIGludGVnZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ucGFyc2VJbnQoJzA4Jyk7CiAgICAgICAgICogLy8gPT4gOAogICAgICAgICAqCiAgICAgICAgICogXy5tYXAoWyc2JywgJzA4JywgJzEwJ10sIF8ucGFyc2VJbnQpOwogICAgICAgICAqIC8vID0+IFs2LCA4LCAxMF0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBwYXJzZUludChzdHJpbmcsIHJhZGl4LCBndWFyZCkgewogICAgICAgICAgaWYgKGd1YXJkIHx8IHJhZGl4ID09IG51bGwpIHsKICAgICAgICAgICAgcmFkaXggPSAwOwogICAgICAgICAgfSBlbHNlIGlmIChyYWRpeCkgewogICAgICAgICAgICByYWRpeCA9ICtyYWRpeDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBuYXRpdmVQYXJzZUludCh0b1N0cmluZyhzdHJpbmcpLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKSwgcmFkaXggfHwgMCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXBlYXRzIHRoZSBnaXZlbiBzdHJpbmcgYG5gIHRpbWVzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHJlcGVhdC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MV0gVGhlIG51bWJlciBvZiB0aW1lcyB0byByZXBlYXQgdGhlIHN0cmluZy4KICAgICAgICAgKiBAcGFyYW0tIHtPYmplY3R9IFtndWFyZF0gRW5hYmxlcyB1c2UgYXMgYW4gaXRlcmF0ZWUgZm9yIG1ldGhvZHMgbGlrZSBgXy5tYXBgLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHJlcGVhdGVkIHN0cmluZy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5yZXBlYXQoJyonLCAzKTsKICAgICAgICAgKiAvLyA9PiAnKioqJwogICAgICAgICAqCiAgICAgICAgICogXy5yZXBlYXQoJ2FiYycsIDIpOwogICAgICAgICAqIC8vID0+ICdhYmNhYmMnCiAgICAgICAgICoKICAgICAgICAgKiBfLnJlcGVhdCgnYWJjJywgMCk7CiAgICAgICAgICogLy8gPT4gJycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZXBlYXQoc3RyaW5nLCBuLCBndWFyZCkgewogICAgICAgICAgaWYgKChndWFyZCA/IGlzSXRlcmF0ZWVDYWxsKHN0cmluZywgbiwgZ3VhcmQpIDogbiA9PT0gdW5kZWZpbmVkJDEpKSB7CiAgICAgICAgICAgIG4gPSAxOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBiYXNlUmVwZWF0KHRvU3RyaW5nKHN0cmluZyksIG4pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgbWF0Y2hlcyBmb3IgYHBhdHRlcm5gIGluIGBzdHJpbmdgIHdpdGggYHJlcGxhY2VtZW50YC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbgogICAgICAgICAqIFtgU3RyaW5nI3JlcGxhY2VgXShodHRwczovL21kbi5pby9TdHJpbmcvcmVwbGFjZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gbW9kaWZ5LgogICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gcGF0dGVybiBUaGUgcGF0dGVybiB0byByZXBsYWNlLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb258c3RyaW5nfSByZXBsYWNlbWVudCBUaGUgbWF0Y2ggcmVwbGFjZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbW9kaWZpZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnJlcGxhY2UoJ0hpIEZyZWQnLCAnRnJlZCcsICdCYXJuZXknKTsKICAgICAgICAgKiAvLyA9PiAnSGkgQmFybmV5JwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHJlcGxhY2UoKSB7CiAgICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhhcmdzWzBdKTsKCiAgICAgICAgICByZXR1cm4gYXJncy5sZW5ndGggPCAzID8gc3RyaW5nIDogc3RyaW5nLnJlcGxhY2UoYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0bwogICAgICAgICAqIFtzbmFrZSBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbmFrZV9jYXNlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHNuYWtlIGNhc2VkIHN0cmluZy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5zbmFrZUNhc2UoJ0ZvbyBCYXInKTsKICAgICAgICAgKiAvLyA9PiAnZm9vX2JhcicKICAgICAgICAgKgogICAgICAgICAqIF8uc25ha2VDYXNlKCdmb29CYXInKTsKICAgICAgICAgKiAvLyA9PiAnZm9vX2JhcicKICAgICAgICAgKgogICAgICAgICAqIF8uc25ha2VDYXNlKCctLUZPTy1CQVItLScpOwogICAgICAgICAqIC8vID0+ICdmb29fYmFyJwogICAgICAgICAqLwogICAgICAgIHZhciBzbmFrZUNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnXycgOiAnJykgKyB3b3JkLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNwbGl0cyBgc3RyaW5nYCBieSBgc2VwYXJhdG9yYC4KICAgICAgICAgKgogICAgICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBiYXNlZCBvbgogICAgICAgICAqIFtgU3RyaW5nI3NwbGl0YF0oaHR0cHM6Ly9tZG4uaW8vU3RyaW5nL3NwbGl0KS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBzcGxpdC4KICAgICAgICAgKiBAcGFyYW0ge1JlZ0V4cHxzdHJpbmd9IHNlcGFyYXRvciBUaGUgc2VwYXJhdG9yIHBhdHRlcm4gdG8gc3BsaXQgYnkuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtsaW1pdF0gVGhlIGxlbmd0aCB0byB0cnVuY2F0ZSByZXN1bHRzIHRvLgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgc3RyaW5nIHNlZ21lbnRzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnNwbGl0KCdhLWItYycsICctJywgMik7CiAgICAgICAgICogLy8gPT4gWydhJywgJ2InXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNwbGl0KHN0cmluZywgc2VwYXJhdG9yLCBsaW1pdCkgewogICAgICAgICAgaWYgKGxpbWl0ICYmIHR5cGVvZiBsaW1pdCAhPSAnbnVtYmVyJyAmJiBpc0l0ZXJhdGVlQ2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpKSB7CiAgICAgICAgICAgIHNlcGFyYXRvciA9IGxpbWl0ID0gdW5kZWZpbmVkJDE7CiAgICAgICAgICB9CiAgICAgICAgICBsaW1pdCA9IGxpbWl0ID09PSB1bmRlZmluZWQkMSA/IE1BWF9BUlJBWV9MRU5HVEggOiBsaW1pdCA+Pj4gMDsKICAgICAgICAgIGlmICghbGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTsKICAgICAgICAgIGlmIChzdHJpbmcgJiYgKAogICAgICAgICAgICAgICAgdHlwZW9mIHNlcGFyYXRvciA9PSAnc3RyaW5nJyB8fAogICAgICAgICAgICAgICAgKHNlcGFyYXRvciAhPSBudWxsICYmICFpc1JlZ0V4cChzZXBhcmF0b3IpKQogICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgc2VwYXJhdG9yID0gYmFzZVRvU3RyaW5nKHNlcGFyYXRvcik7CiAgICAgICAgICAgIGlmICghc2VwYXJhdG9yICYmIGhhc1VuaWNvZGUoc3RyaW5nKSkgewogICAgICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyaW5nVG9BcnJheShzdHJpbmcpLCAwLCBsaW1pdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBzdHJpbmcuc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCB0bwogICAgICAgICAqIFtzdGFydCBjYXNlXShodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MZXR0ZXJfY2FzZSNTdHlsaXN0aWNfb3Jfc3BlY2lhbGlzZWRfdXNhZ2UpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMS4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RhcnQgY2FzZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnN0YXJ0Q2FzZSgnLS1mb28tYmFyLS0nKTsKICAgICAgICAgKiAvLyA9PiAnRm9vIEJhcicKICAgICAgICAgKgogICAgICAgICAqIF8uc3RhcnRDYXNlKCdmb29CYXInKTsKICAgICAgICAgKiAvLyA9PiAnRm9vIEJhcicKICAgICAgICAgKgogICAgICAgICAqIF8uc3RhcnRDYXNlKCdfX0ZPT19CQVJfXycpOwogICAgICAgICAqIC8vID0+ICdGT08gQkFSJwogICAgICAgICAqLwogICAgICAgIHZhciBzdGFydENhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB1cHBlckZpcnN0KHdvcmQpOwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2Agc3RhcnRzIHdpdGggdGhlIGdpdmVuIHRhcmdldCBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3RhcmdldF0gVGhlIHN0cmluZyB0byBzZWFyY2ggZm9yLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcG9zaXRpb249MF0gVGhlIHBvc2l0aW9uIHRvIHNlYXJjaCBmcm9tLgogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgc3RyaW5nYCBzdGFydHMgd2l0aCBgdGFyZ2V0YCwKICAgICAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdhJyk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqCiAgICAgICAgICogXy5zdGFydHNXaXRoKCdhYmMnLCAnYicpOwogICAgICAgICAqIC8vID0+IGZhbHNlCiAgICAgICAgICoKICAgICAgICAgKiBfLnN0YXJ0c1dpdGgoJ2FiYycsICdiJywgMSk7CiAgICAgICAgICogLy8gPT4gdHJ1ZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyaW5nLCB0YXJnZXQsIHBvc2l0aW9uKSB7CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwogICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiA9PSBudWxsCiAgICAgICAgICAgID8gMAogICAgICAgICAgICA6IGJhc2VDbGFtcCh0b0ludGVnZXIocG9zaXRpb24pLCAwLCBzdHJpbmcubGVuZ3RoKTsKCiAgICAgICAgICB0YXJnZXQgPSBiYXNlVG9TdHJpbmcodGFyZ2V0KTsKICAgICAgICAgIHJldHVybiBzdHJpbmcuc2xpY2UocG9zaXRpb24sIHBvc2l0aW9uICsgdGFyZ2V0Lmxlbmd0aCkgPT0gdGFyZ2V0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGludGVycG9sYXRlIGRhdGEgcHJvcGVydGllcwogICAgICAgICAqIGluICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVycywgSFRNTC1lc2NhcGUgaW50ZXJwb2xhdGVkIGRhdGEgcHJvcGVydGllcyBpbgogICAgICAgICAqICJlc2NhcGUiIGRlbGltaXRlcnMsIGFuZCBleGVjdXRlIEphdmFTY3JpcHQgaW4gImV2YWx1YXRlIiBkZWxpbWl0ZXJzLiBEYXRhCiAgICAgICAgICogcHJvcGVydGllcyBtYXkgYmUgYWNjZXNzZWQgYXMgZnJlZSB2YXJpYWJsZXMgaW4gdGhlIHRlbXBsYXRlLiBJZiBhIHNldHRpbmcKICAgICAgICAgKiBvYmplY3QgaXMgZ2l2ZW4sIGl0IHRha2VzIHByZWNlZGVuY2Ugb3ZlciBgXy50ZW1wbGF0ZVNldHRpbmdzYCB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogSW4gdGhlIGRldmVsb3BtZW50IGJ1aWxkIGBfLnRlbXBsYXRlYCB1dGlsaXplcwogICAgICAgICAqIFtzb3VyY2VVUkxzXShodHRwOi8vd3d3Lmh0bWw1cm9ja3MuY29tL2VuL3R1dG9yaWFscy9kZXZlbG9wZXJ0b29scy9zb3VyY2VtYXBzLyN0b2Mtc291cmNldXJsKQogICAgICAgICAqIGZvciBlYXNpZXIgZGVidWdnaW5nLgogICAgICAgICAqCiAgICAgICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gcHJlY29tcGlsaW5nIHRlbXBsYXRlcyBzZWUKICAgICAgICAgKiBbbG9kYXNoJ3MgY3VzdG9tIGJ1aWxkcyBkb2N1bWVudGF0aW9uXShodHRwczovL2xvZGFzaC5jb20vY3VzdG9tLWJ1aWxkcykuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBDaHJvbWUgZXh0ZW5zaW9uIHNhbmRib3hlcyBzZWUKICAgICAgICAgKiBbQ2hyb21lJ3MgZXh0ZW5zaW9ucyBkb2N1bWVudGF0aW9uXShodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvc2FuZGJveGluZ0V2YWwpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgdGVtcGxhdGUgc3RyaW5nLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9ucz17fV0gVGhlIG9wdGlvbnMgb2JqZWN0LgogICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5lc2NhcGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmVzY2FwZV0KICAgICAgICAgKiAgVGhlIEhUTUwgImVzY2FwZSIgZGVsaW1pdGVyLgogICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfSBbb3B0aW9ucy5ldmFsdWF0ZT1fLnRlbXBsYXRlU2V0dGluZ3MuZXZhbHVhdGVdCiAgICAgICAgICogIFRoZSAiZXZhbHVhdGUiIGRlbGltaXRlci4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnMuaW1wb3J0cz1fLnRlbXBsYXRlU2V0dGluZ3MuaW1wb3J0c10KICAgICAgICAgKiAgQW4gb2JqZWN0IHRvIGltcG9ydCBpbnRvIHRoZSB0ZW1wbGF0ZSBhcyBmcmVlIHZhcmlhYmxlcy4KICAgICAgICAgKiBAcGFyYW0ge1JlZ0V4cH0gW29wdGlvbnMuaW50ZXJwb2xhdGU9Xy50ZW1wbGF0ZVNldHRpbmdzLmludGVycG9sYXRlXQogICAgICAgICAqICBUaGUgImludGVycG9sYXRlIiBkZWxpbWl0ZXIuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcHRpb25zLnNvdXJjZVVSTD0nbG9kYXNoLnRlbXBsYXRlU291cmNlc1tuXSddCiAgICAgICAgICogIFRoZSBzb3VyY2VVUkwgb2YgdGhlIGNvbXBpbGVkIHRlbXBsYXRlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy52YXJpYWJsZT0nb2JqJ10KICAgICAgICAgKiAgVGhlIGRhdGEgb2JqZWN0IHZhcmlhYmxlIG5hbWUuCiAgICAgICAgICogQHBhcmFtLSB7T2JqZWN0fSBbZ3VhcmRdIEVuYWJsZXMgdXNlIGFzIGFuIGl0ZXJhdGVlIGZvciBtZXRob2RzIGxpa2UgYF8ubWFwYC4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNvbXBpbGVkIHRlbXBsYXRlIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiAvLyBVc2UgdGhlICJpbnRlcnBvbGF0ZSIgZGVsaW1pdGVyIHRvIGNyZWF0ZSBhIGNvbXBpbGVkIHRlbXBsYXRlLgogICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIDwlPSB1c2VyICU+IScpOwogICAgICAgICAqIGNvbXBpbGVkKHsgJ3VzZXInOiAnZnJlZCcgfSk7CiAgICAgICAgICogLy8gPT4gJ2hlbGxvIGZyZWQhJwogICAgICAgICAqCiAgICAgICAgICogLy8gVXNlIHRoZSBIVE1MICJlc2NhcGUiIGRlbGltaXRlciB0byBlc2NhcGUgZGF0YSBwcm9wZXJ0eSB2YWx1ZXMuCiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPGI+PCUtIHZhbHVlICU+PC9iPicpOwogICAgICAgICAqIGNvbXBpbGVkKHsgJ3ZhbHVlJzogJzxzY3JpcHQ+JyB9KTsKICAgICAgICAgKiAvLyA9PiAnPGI+Jmx0O3NjcmlwdCZndDs8L2I+JwogICAgICAgICAqCiAgICAgICAgICogLy8gVXNlIHRoZSAiZXZhbHVhdGUiIGRlbGltaXRlciB0byBleGVjdXRlIEphdmFTY3JpcHQgYW5kIGdlbmVyYXRlIEhUTUwuCiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgXy5mb3JFYWNoKHVzZXJzLCBmdW5jdGlvbih1c2VyKSB7ICU+PGxpPjwlLSB1c2VyICU+PC9saT48JSB9KTsgJT4nKTsKICAgICAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTsKICAgICAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPicKICAgICAgICAgKgogICAgICAgICAqIC8vIFVzZSB0aGUgaW50ZXJuYWwgYHByaW50YCBmdW5jdGlvbiBpbiAiZXZhbHVhdGUiIGRlbGltaXRlcnMuCiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnPCUgcHJpbnQoImhlbGxvICIgKyB1c2VyKTsgJT4hJyk7CiAgICAgICAgICogY29tcGlsZWQoeyAndXNlcic6ICdiYXJuZXknIH0pOwogICAgICAgICAqIC8vID0+ICdoZWxsbyBiYXJuZXkhJwogICAgICAgICAqCiAgICAgICAgICogLy8gVXNlIHRoZSBFUyB0ZW1wbGF0ZSBsaXRlcmFsIGRlbGltaXRlciBhcyBhbiAiaW50ZXJwb2xhdGUiIGRlbGltaXRlci4KICAgICAgICAgKiAvLyBEaXNhYmxlIHN1cHBvcnQgYnkgcmVwbGFjaW5nIHRoZSAiaW50ZXJwb2xhdGUiIGRlbGltaXRlci4KICAgICAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoZWxsbyAkeyB1c2VyIH0hJyk7CiAgICAgICAgICogY29tcGlsZWQoeyAndXNlcic6ICdwZWJibGVzJyB9KTsKICAgICAgICAgKiAvLyA9PiAnaGVsbG8gcGViYmxlcyEnCiAgICAgICAgICoKICAgICAgICAgKiAvLyBVc2UgYmFja3NsYXNoZXMgdG8gdHJlYXQgZGVsaW1pdGVycyBhcyBwbGFpbiB0ZXh0LgogICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJzwlPSAiXFw8JS0gdmFsdWUgJVxcPiIgJT4nKTsKICAgICAgICAgKiBjb21waWxlZCh7ICd2YWx1ZSc6ICdpZ25vcmVkJyB9KTsKICAgICAgICAgKiAvLyA9PiAnPCUtIHZhbHVlICU+JwogICAgICAgICAqCiAgICAgICAgICogLy8gVXNlIHRoZSBgaW1wb3J0c2Agb3B0aW9uIHRvIGltcG9ydCBgalF1ZXJ5YCBhcyBganFgLgogICAgICAgICAqIHZhciB0ZXh0ID0gJzwlIGpxLmVhY2godXNlcnMsIGZ1bmN0aW9uKHVzZXIpIHsgJT48bGk+PCUtIHVzZXIgJT48L2xpPjwlIH0pOyAlPic7CiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSh0ZXh0LCB7ICdpbXBvcnRzJzogeyAnanEnOiBqUXVlcnkgfSB9KTsKICAgICAgICAgKiBjb21waWxlZCh7ICd1c2Vycyc6IFsnZnJlZCcsICdiYXJuZXknXSB9KTsKICAgICAgICAgKiAvLyA9PiAnPGxpPmZyZWQ8L2xpPjxsaT5iYXJuZXk8L2xpPicKICAgICAgICAgKgogICAgICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZVVSTGAgb3B0aW9uIHRvIHNwZWNpZnkgYSBjdXN0b20gc291cmNlVVJMIGZvciB0aGUgdGVtcGxhdGUuCiAgICAgICAgICogdmFyIGNvbXBpbGVkID0gXy50ZW1wbGF0ZSgnaGVsbG8gPCU9IHVzZXIgJT4hJywgeyAnc291cmNlVVJMJzogJy9iYXNpYy9ncmVldGluZy5qc3QnIH0pOwogICAgICAgICAqIGNvbXBpbGVkKGRhdGEpOwogICAgICAgICAqIC8vID0+IEZpbmQgdGhlIHNvdXJjZSBvZiAiZ3JlZXRpbmcuanN0IiB1bmRlciB0aGUgU291cmNlcyB0YWIgb3IgUmVzb3VyY2VzIHBhbmVsIG9mIHRoZSB3ZWIgaW5zcGVjdG9yLgogICAgICAgICAqCiAgICAgICAgICogLy8gVXNlIHRoZSBgdmFyaWFibGVgIG9wdGlvbiB0byBlbnN1cmUgYSB3aXRoLXN0YXRlbWVudCBpc24ndCB1c2VkIGluIHRoZSBjb21waWxlZCB0ZW1wbGF0ZS4KICAgICAgICAgKiB2YXIgY29tcGlsZWQgPSBfLnRlbXBsYXRlKCdoaSA8JT0gZGF0YS51c2VyICU+IScsIHsgJ3ZhcmlhYmxlJzogJ2RhdGEnIH0pOwogICAgICAgICAqIGNvbXBpbGVkLnNvdXJjZTsKICAgICAgICAgKiAvLyA9PiBmdW5jdGlvbihkYXRhKSB7CiAgICAgICAgICogLy8gICB2YXIgX190LCBfX3AgPSAnJzsKICAgICAgICAgKiAvLyAgIF9fcCArPSAnaGkgJyArICgoX190ID0gKCBkYXRhLnVzZXIgKSkgPT0gbnVsbCA/ICcnIDogX190KSArICchJzsKICAgICAgICAgKiAvLyAgIHJldHVybiBfX3A7CiAgICAgICAgICogLy8gfQogICAgICAgICAqCiAgICAgICAgICogLy8gVXNlIGN1c3RvbSB0ZW1wbGF0ZSBkZWxpbWl0ZXJzLgogICAgICAgICAqIF8udGVtcGxhdGVTZXR0aW5ncy5pbnRlcnBvbGF0ZSA9IC97eyhbXHNcU10rPyl9fS9nOwogICAgICAgICAqIHZhciBjb21waWxlZCA9IF8udGVtcGxhdGUoJ2hlbGxvIHt7IHVzZXIgfX0hJyk7CiAgICAgICAgICogY29tcGlsZWQoeyAndXNlcic6ICdtdXN0YWNoZScgfSk7CiAgICAgICAgICogLy8gPT4gJ2hlbGxvIG11c3RhY2hlIScKICAgICAgICAgKgogICAgICAgICAqIC8vIFVzZSB0aGUgYHNvdXJjZWAgcHJvcGVydHkgdG8gaW5saW5lIGNvbXBpbGVkIHRlbXBsYXRlcyBmb3IgbWVhbmluZ2Z1bAogICAgICAgICAqIC8vIGxpbmUgbnVtYmVycyBpbiBlcnJvciBtZXNzYWdlcyBhbmQgc3RhY2sgdHJhY2VzLgogICAgICAgICAqIGZzLndyaXRlRmlsZVN5bmMocGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdqc3QuanMnKSwgJ1wKICAgICAgICAgKiAgIHZhciBKU1QgPSB7XAogICAgICAgICAqICAgICAibWFpbiI6ICcgKyBfLnRlbXBsYXRlKG1haW5UZXh0KS5zb3VyY2UgKyAnXAogICAgICAgICAqICAgfTtcCiAgICAgICAgICogJyk7CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdGVtcGxhdGUoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkgewogICAgICAgICAgLy8gQmFzZWQgb24gSm9obiBSZXNpZydzIGB0bXBsYCBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgLy8gKGh0dHA6Ly9lam9obi5vcmcvYmxvZy9qYXZhc2NyaXB0LW1pY3JvLXRlbXBsYXRpbmcvKQogICAgICAgICAgLy8gYW5kIExhdXJhIERva3Rvcm92YSdzIGRvVC5qcyAoaHR0cHM6Ly9naXRodWIuY29tL29sYWRvL2RvVCkuCiAgICAgICAgICB2YXIgc2V0dGluZ3MgPSBsb2Rhc2gudGVtcGxhdGVTZXR0aW5nczsKCiAgICAgICAgICBpZiAoZ3VhcmQgJiYgaXNJdGVyYXRlZUNhbGwoc3RyaW5nLCBvcHRpb25zLCBndWFyZCkpIHsKICAgICAgICAgICAgb3B0aW9ucyA9IHVuZGVmaW5lZCQxOwogICAgICAgICAgfQogICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTsKICAgICAgICAgIG9wdGlvbnMgPSBhc3NpZ25JbldpdGgoe30sIG9wdGlvbnMsIHNldHRpbmdzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKTsKCiAgICAgICAgICB2YXIgaW1wb3J0cyA9IGFzc2lnbkluV2l0aCh7fSwgb3B0aW9ucy5pbXBvcnRzLCBzZXR0aW5ncy5pbXBvcnRzLCBjdXN0b21EZWZhdWx0c0Fzc2lnbkluKSwKICAgICAgICAgICAgICBpbXBvcnRzS2V5cyA9IGtleXMoaW1wb3J0cyksCiAgICAgICAgICAgICAgaW1wb3J0c1ZhbHVlcyA9IGJhc2VWYWx1ZXMoaW1wb3J0cywgaW1wb3J0c0tleXMpOwoKICAgICAgICAgIHZhciBpc0VzY2FwaW5nLAogICAgICAgICAgICAgIGlzRXZhbHVhdGluZywKICAgICAgICAgICAgICBpbmRleCA9IDAsCiAgICAgICAgICAgICAgaW50ZXJwb2xhdGUgPSBvcHRpb25zLmludGVycG9sYXRlIHx8IHJlTm9NYXRjaCwKICAgICAgICAgICAgICBzb3VyY2UgPSAiX19wICs9ICciOwoKICAgICAgICAgIC8vIENvbXBpbGUgdGhlIHJlZ2V4cCB0byBtYXRjaCBlYWNoIGRlbGltaXRlci4KICAgICAgICAgIHZhciByZURlbGltaXRlcnMgPSBSZWdFeHAoCiAgICAgICAgICAgIChvcHRpb25zLmVzY2FwZSB8fCByZU5vTWF0Y2gpLnNvdXJjZSArICd8JyArCiAgICAgICAgICAgIGludGVycG9sYXRlLnNvdXJjZSArICd8JyArCiAgICAgICAgICAgIChpbnRlcnBvbGF0ZSA9PT0gcmVJbnRlcnBvbGF0ZSA/IHJlRXNUZW1wbGF0ZSA6IHJlTm9NYXRjaCkuc291cmNlICsgJ3wnICsKICAgICAgICAgICAgKG9wdGlvbnMuZXZhbHVhdGUgfHwgcmVOb01hdGNoKS5zb3VyY2UgKyAnfCQnCiAgICAgICAgICAsICdnJyk7CgogICAgICAgICAgLy8gVXNlIGEgc291cmNlVVJMIGZvciBlYXNpZXIgZGVidWdnaW5nLgogICAgICAgICAgLy8gVGhlIHNvdXJjZVVSTCBnZXRzIGluamVjdGVkIGludG8gdGhlIHNvdXJjZSB0aGF0J3MgZXZhbC1lZCwgc28gYmUgY2FyZWZ1bAogICAgICAgICAgLy8gdG8gbm9ybWFsaXplIGFsbCBraW5kcyBvZiB3aGl0ZXNwYWNlLCBzbyBlLmcuIG5ld2xpbmVzIChhbmQgdW5pY29kZSB2ZXJzaW9ucyBvZiBpdCkgY2FuJ3Qgc25lYWsgaW4KICAgICAgICAgIC8vIGFuZCBlc2NhcGUgdGhlIGNvbW1lbnQsIHRodXMgaW5qZWN0aW5nIGNvZGUgdGhhdCBnZXRzIGV2YWxlZC4KICAgICAgICAgIHZhciBzb3VyY2VVUkwgPSAnLy8jIHNvdXJjZVVSTD0nICsKICAgICAgICAgICAgKGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3NvdXJjZVVSTCcpCiAgICAgICAgICAgICAgPyAob3B0aW9ucy5zb3VyY2VVUkwgKyAnJykucmVwbGFjZSgvXHMvZywgJyAnKQogICAgICAgICAgICAgIDogKCdsb2Rhc2gudGVtcGxhdGVTb3VyY2VzWycgKyAoKyt0ZW1wbGF0ZUNvdW50ZXIpICsgJ10nKQogICAgICAgICAgICApICsgJ1xuJzsKCiAgICAgICAgICBzdHJpbmcucmVwbGFjZShyZURlbGltaXRlcnMsIGZ1bmN0aW9uKG1hdGNoLCBlc2NhcGVWYWx1ZSwgaW50ZXJwb2xhdGVWYWx1ZSwgZXNUZW1wbGF0ZVZhbHVlLCBldmFsdWF0ZVZhbHVlLCBvZmZzZXQpIHsKICAgICAgICAgICAgaW50ZXJwb2xhdGVWYWx1ZSB8fCAoaW50ZXJwb2xhdGVWYWx1ZSA9IGVzVGVtcGxhdGVWYWx1ZSk7CgogICAgICAgICAgICAvLyBFc2NhcGUgY2hhcmFjdGVycyB0aGF0IGNhbid0IGJlIGluY2x1ZGVkIGluIHN0cmluZyBsaXRlcmFscy4KICAgICAgICAgICAgc291cmNlICs9IHN0cmluZy5zbGljZShpbmRleCwgb2Zmc2V0KS5yZXBsYWNlKHJlVW5lc2NhcGVkU3RyaW5nLCBlc2NhcGVTdHJpbmdDaGFyKTsKCiAgICAgICAgICAgIC8vIFJlcGxhY2UgZGVsaW1pdGVycyB3aXRoIHNuaXBwZXRzLgogICAgICAgICAgICBpZiAoZXNjYXBlVmFsdWUpIHsKICAgICAgICAgICAgICBpc0VzY2FwaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICBzb3VyY2UgKz0gIicgK1xuX19lKCIgKyBlc2NhcGVWYWx1ZSArICIpICtcbiciOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChldmFsdWF0ZVZhbHVlKSB7CiAgICAgICAgICAgICAgaXNFdmFsdWF0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICBzb3VyY2UgKz0gIic7XG4iICsgZXZhbHVhdGVWYWx1ZSArICI7XG5fX3AgKz0gJyI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGludGVycG9sYXRlVmFsdWUpIHsKICAgICAgICAgICAgICBzb3VyY2UgKz0gIicgK1xuKChfX3QgPSAoIiArIGludGVycG9sYXRlVmFsdWUgKyAiKSkgPT0gbnVsbCA/ICcnIDogX190KSArXG4nIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmRleCA9IG9mZnNldCArIG1hdGNoLmxlbmd0aDsKCiAgICAgICAgICAgIC8vIFRoZSBKUyBlbmdpbmUgZW1iZWRkZWQgaW4gQWRvYmUgcHJvZHVjdHMgbmVlZHMgYG1hdGNoYCByZXR1cm5lZCBpbgogICAgICAgICAgICAvLyBvcmRlciB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IGBvZmZzZXRgIHZhbHVlLgogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBzb3VyY2UgKz0gIic7XG4iOwoKICAgICAgICAgIC8vIElmIGB2YXJpYWJsZWAgaXMgbm90IHNwZWNpZmllZCB3cmFwIGEgd2l0aC1zdGF0ZW1lbnQgYXJvdW5kIHRoZSBnZW5lcmF0ZWQKICAgICAgICAgIC8vIGNvZGUgdG8gYWRkIHRoZSBkYXRhIG9iamVjdCB0byB0aGUgdG9wIG9mIHRoZSBzY29wZSBjaGFpbi4KICAgICAgICAgIHZhciB2YXJpYWJsZSA9IGhhc093blByb3BlcnR5LmNhbGwob3B0aW9ucywgJ3ZhcmlhYmxlJykgJiYgb3B0aW9ucy52YXJpYWJsZTsKICAgICAgICAgIGlmICghdmFyaWFibGUpIHsKICAgICAgICAgICAgc291cmNlID0gJ3dpdGggKG9iaikge1xuJyArIHNvdXJjZSArICdcbn1cbic7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBDbGVhbnVwIGNvZGUgYnkgc3RyaXBwaW5nIGVtcHR5IHN0cmluZ3MuCiAgICAgICAgICBzb3VyY2UgPSAoaXNFdmFsdWF0aW5nID8gc291cmNlLnJlcGxhY2UocmVFbXB0eVN0cmluZ0xlYWRpbmcsICcnKSA6IHNvdXJjZSkKICAgICAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ01pZGRsZSwgJyQxJykKICAgICAgICAgICAgLnJlcGxhY2UocmVFbXB0eVN0cmluZ1RyYWlsaW5nLCAnJDE7Jyk7CgogICAgICAgICAgLy8gRnJhbWUgY29kZSBhcyB0aGUgZnVuY3Rpb24gYm9keS4KICAgICAgICAgIHNvdXJjZSA9ICdmdW5jdGlvbignICsgKHZhcmlhYmxlIHx8ICdvYmonKSArICcpIHtcbicgKwogICAgICAgICAgICAodmFyaWFibGUKICAgICAgICAgICAgICA/ICcnCiAgICAgICAgICAgICAgOiAnb2JqIHx8IChvYmogPSB7fSk7XG4nCiAgICAgICAgICAgICkgKwogICAgICAgICAgICAidmFyIF9fdCwgX19wID0gJyciICsKICAgICAgICAgICAgKGlzRXNjYXBpbmcKICAgICAgICAgICAgICAgPyAnLCBfX2UgPSBfLmVzY2FwZScKICAgICAgICAgICAgICAgOiAnJwogICAgICAgICAgICApICsKICAgICAgICAgICAgKGlzRXZhbHVhdGluZwogICAgICAgICAgICAgID8gJywgX19qID0gQXJyYXkucHJvdG90eXBlLmpvaW47XG4nICsKICAgICAgICAgICAgICAgICJmdW5jdGlvbiBwcmludCgpIHsgX19wICs9IF9fai5jYWxsKGFyZ3VtZW50cywgJycpIH1cbiIKICAgICAgICAgICAgICA6ICc7XG4nCiAgICAgICAgICAgICkgKwogICAgICAgICAgICBzb3VyY2UgKwogICAgICAgICAgICAncmV0dXJuIF9fcFxufSc7CgogICAgICAgICAgdmFyIHJlc3VsdCA9IGF0dGVtcHQoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihpbXBvcnRzS2V5cywgc291cmNlVVJMICsgJ3JldHVybiAnICsgc291cmNlKQogICAgICAgICAgICAgIC5hcHBseSh1bmRlZmluZWQkMSwgaW1wb3J0c1ZhbHVlcyk7CiAgICAgICAgICB9KTsKCiAgICAgICAgICAvLyBQcm92aWRlIHRoZSBjb21waWxlZCBmdW5jdGlvbidzIHNvdXJjZSBieSBpdHMgYHRvU3RyaW5nYCBtZXRob2Qgb3IKICAgICAgICAgIC8vIHRoZSBgc291cmNlYCBwcm9wZXJ0eSBhcyBhIGNvbnZlbmllbmNlIGZvciBpbmxpbmluZyBjb21waWxlZCB0ZW1wbGF0ZXMuCiAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlOwogICAgICAgICAgaWYgKGlzRXJyb3IocmVzdWx0KSkgewogICAgICAgICAgICB0aHJvdyByZXN1bHQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYHN0cmluZ2AsIGFzIGEgd2hvbGUsIHRvIGxvd2VyIGNhc2UganVzdCBsaWtlCiAgICAgICAgICogW1N0cmluZyN0b0xvd2VyQ2FzZV0oaHR0cHM6Ly9tZG4uaW8vdG9Mb3dlckNhc2UpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIGNvbnZlcnQuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgbG93ZXIgY2FzZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvTG93ZXIoJy0tRm9vLUJhci0tJyk7CiAgICAgICAgICogLy8gPT4gJy0tZm9vLWJhci0tJwogICAgICAgICAqCiAgICAgICAgICogXy50b0xvd2VyKCdmb29CYXInKTsKICAgICAgICAgKiAvLyA9PiAnZm9vYmFyJwogICAgICAgICAqCiAgICAgICAgICogXy50b0xvd2VyKCdfX0ZPT19CQVJfXycpOwogICAgICAgICAqIC8vID0+ICdfX2Zvb19iYXJfXycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0b0xvd2VyKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdG9TdHJpbmcodmFsdWUpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgc3RyaW5nYCwgYXMgYSB3aG9sZSwgdG8gdXBwZXIgY2FzZSBqdXN0IGxpa2UKICAgICAgICAgKiBbU3RyaW5nI3RvVXBwZXJDYXNlXShodHRwczovL21kbi5pby90b1VwcGVyQ2FzZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udG9VcHBlcignLS1mb28tYmFyLS0nKTsKICAgICAgICAgKiAvLyA9PiAnLS1GT08tQkFSLS0nCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvVXBwZXIoJ2Zvb0JhcicpOwogICAgICAgICAqIC8vID0+ICdGT09CQVInCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvVXBwZXIoJ19fZm9vX2Jhcl9fJyk7CiAgICAgICAgICogLy8gPT4gJ19fRk9PX0JBUl9fJwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRvVXBwZXIodmFsdWUpIHsKICAgICAgICAgIHJldHVybiB0b1N0cmluZyh2YWx1ZSkudG9VcHBlckNhc2UoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udHJpbSgnICBhYmMgICcpOwogICAgICAgICAqIC8vID0+ICdhYmMnCiAgICAgICAgICoKICAgICAgICAgKiBfLnRyaW0oJy1fLWFiYy1fLScsICdfLScpOwogICAgICAgICAqIC8vID0+ICdhYmMnCiAgICAgICAgICoKICAgICAgICAgKiBfLm1hcChbJyAgZm9vICAnLCAnICBiYXIgICddLCBfLnRyaW0pOwogICAgICAgICAqIC8vID0+IFsnZm9vJywgJ2JhciddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdHJpbShzdHJpbmcsIGNoYXJzLCBndWFyZCkgewogICAgICAgICAgc3RyaW5nID0gdG9TdHJpbmcoc3RyaW5nKTsKICAgICAgICAgIGlmIChzdHJpbmcgJiYgKGd1YXJkIHx8IGNoYXJzID09PSB1bmRlZmluZWQkMSkpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHJlVHJpbSwgJycpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFzdHJpbmcgfHwgIShjaGFycyA9IGJhc2VUb1N0cmluZyhjaGFycykpKSB7CiAgICAgICAgICAgIHJldHVybiBzdHJpbmc7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKSwKICAgICAgICAgICAgICBjaHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShjaGFycyksCiAgICAgICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgY2hyU3ltYm9scyksCiAgICAgICAgICAgICAgZW5kID0gY2hhcnNFbmRJbmRleChzdHJTeW1ib2xzLCBjaHJTeW1ib2xzKSArIDE7CgogICAgICAgICAgcmV0dXJuIGNhc3RTbGljZShzdHJTeW1ib2xzLCBzdGFydCwgZW5kKS5qb2luKCcnKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgdHJhaWxpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udHJpbUVuZCgnICBhYmMgICcpOwogICAgICAgICAqIC8vID0+ICcgIGFiYycKICAgICAgICAgKgogICAgICAgICAqIF8udHJpbUVuZCgnLV8tYWJjLV8tJywgJ18tJyk7CiAgICAgICAgICogLy8gPT4gJy1fLWFiYycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0cmltRW5kKHN0cmluZywgY2hhcnMsIGd1YXJkKSB7CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwogICAgICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCQxKSkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltRW5kLCAnJyk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoIXN0cmluZyB8fCAhKGNoYXJzID0gYmFzZVRvU3RyaW5nKGNoYXJzKSkpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmluZzsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBzdHJTeW1ib2xzID0gc3RyaW5nVG9BcnJheShzdHJpbmcpLAogICAgICAgICAgICAgIGVuZCA9IGNoYXJzRW5kSW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpICsgMTsKCiAgICAgICAgICByZXR1cm4gY2FzdFNsaWNlKHN0clN5bWJvbHMsIDAsIGVuZCkuam9pbignJyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGxlYWRpbmcgd2hpdGVzcGFjZSBvciBzcGVjaWZpZWQgY2hhcmFjdGVycyBmcm9tIGBzdHJpbmdgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHRyaW0uCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtjaGFycz13aGl0ZXNwYWNlXSBUaGUgY2hhcmFjdGVycyB0byB0cmltLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdHJpbW1lZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udHJpbVN0YXJ0KCcgIGFiYyAgJyk7CiAgICAgICAgICogLy8gPT4gJ2FiYyAgJwogICAgICAgICAqCiAgICAgICAgICogXy50cmltU3RhcnQoJy1fLWFiYy1fLScsICdfLScpOwogICAgICAgICAqIC8vID0+ICdhYmMtXy0nCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdHJpbVN0YXJ0KHN0cmluZywgY2hhcnMsIGd1YXJkKSB7CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwogICAgICAgICAgaWYgKHN0cmluZyAmJiAoZ3VhcmQgfHwgY2hhcnMgPT09IHVuZGVmaW5lZCQxKSkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVUcmltU3RhcnQsICcnKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICghc3RyaW5nIHx8ICEoY2hhcnMgPSBiYXNlVG9TdHJpbmcoY2hhcnMpKSkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHN0clN5bWJvbHMgPSBzdHJpbmdUb0FycmF5KHN0cmluZyksCiAgICAgICAgICAgICAgc3RhcnQgPSBjaGFyc1N0YXJ0SW5kZXgoc3RyU3ltYm9scywgc3RyaW5nVG9BcnJheShjaGFycykpOwoKICAgICAgICAgIHJldHVybiBjYXN0U2xpY2Uoc3RyU3ltYm9scywgc3RhcnQpLmpvaW4oJycpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1bmNhdGVzIGBzdHJpbmdgIGlmIGl0J3MgbG9uZ2VyIHRoYW4gdGhlIGdpdmVuIG1heGltdW0gc3RyaW5nIGxlbmd0aC4KICAgICAgICAgKiBUaGUgbGFzdCBjaGFyYWN0ZXJzIG9mIHRoZSB0cnVuY2F0ZWQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBvbWlzc2lvbgogICAgICAgICAqIHN0cmluZyB3aGljaCBkZWZhdWx0cyB0byAiLi4uIi4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byB0cnVuY2F0ZS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gW29wdGlvbnM9e31dIFRoZSBvcHRpb25zIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW29wdGlvbnMubGVuZ3RoPTMwXSBUaGUgbWF4aW11bSBzdHJpbmcgbGVuZ3RoLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbb3B0aW9ucy5vbWlzc2lvbj0nLi4uJ10gVGhlIHN0cmluZyB0byBpbmRpY2F0ZSB0ZXh0IGlzIG9taXR0ZWQuCiAgICAgICAgICogQHBhcmFtIHtSZWdFeHB8c3RyaW5nfSBbb3B0aW9ucy5zZXBhcmF0b3JdIFRoZSBzZXBhcmF0b3IgcGF0dGVybiB0byB0cnVuY2F0ZSB0by4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB0cnVuY2F0ZWQgc3RyaW5nLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJyk7CiAgICAgICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hiby4uLicKICAgICAgICAgKgogICAgICAgICAqIF8udHJ1bmNhdGUoJ2hpLWRpZGRseS1obyB0aGVyZSwgbmVpZ2hib3Jpbm8nLCB7CiAgICAgICAgICogICAnbGVuZ3RoJzogMjQsCiAgICAgICAgICogICAnc2VwYXJhdG9yJzogJyAnCiAgICAgICAgICogfSk7CiAgICAgICAgICogLy8gPT4gJ2hpLWRpZGRseS1obyB0aGVyZSwuLi4nCiAgICAgICAgICoKICAgICAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywgewogICAgICAgICAqICAgJ2xlbmd0aCc6IDI0LAogICAgICAgICAqICAgJ3NlcGFyYXRvcic6IC8sPyArLwogICAgICAgICAqIH0pOwogICAgICAgICAqIC8vID0+ICdoaS1kaWRkbHktaG8gdGhlcmUuLi4nCiAgICAgICAgICoKICAgICAgICAgKiBfLnRydW5jYXRlKCdoaS1kaWRkbHktaG8gdGhlcmUsIG5laWdoYm9yaW5vJywgewogICAgICAgICAqICAgJ29taXNzaW9uJzogJyBbLi4uXScKICAgICAgICAgKiB9KTsKICAgICAgICAgKiAvLyA9PiAnaGktZGlkZGx5LWhvIHRoZXJlLCBuZWlnIFsuLi5dJwogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHRydW5jYXRlKHN0cmluZywgb3B0aW9ucykgewogICAgICAgICAgdmFyIGxlbmd0aCA9IERFRkFVTFRfVFJVTkNfTEVOR1RILAogICAgICAgICAgICAgIG9taXNzaW9uID0gREVGQVVMVF9UUlVOQ19PTUlTU0lPTjsKCiAgICAgICAgICBpZiAoaXNPYmplY3Qob3B0aW9ucykpIHsKICAgICAgICAgICAgdmFyIHNlcGFyYXRvciA9ICdzZXBhcmF0b3InIGluIG9wdGlvbnMgPyBvcHRpb25zLnNlcGFyYXRvciA6IHNlcGFyYXRvcjsKICAgICAgICAgICAgbGVuZ3RoID0gJ2xlbmd0aCcgaW4gb3B0aW9ucyA/IHRvSW50ZWdlcihvcHRpb25zLmxlbmd0aCkgOiBsZW5ndGg7CiAgICAgICAgICAgIG9taXNzaW9uID0gJ29taXNzaW9uJyBpbiBvcHRpb25zID8gYmFzZVRvU3RyaW5nKG9wdGlvbnMub21pc3Npb24pIDogb21pc3Npb247CiAgICAgICAgICB9CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwoKICAgICAgICAgIHZhciBzdHJMZW5ndGggPSBzdHJpbmcubGVuZ3RoOwogICAgICAgICAgaWYgKGhhc1VuaWNvZGUoc3RyaW5nKSkgewogICAgICAgICAgICB2YXIgc3RyU3ltYm9scyA9IHN0cmluZ1RvQXJyYXkoc3RyaW5nKTsKICAgICAgICAgICAgc3RyTGVuZ3RoID0gc3RyU3ltYm9scy5sZW5ndGg7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobGVuZ3RoID49IHN0ckxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5nOwogICAgICAgICAgfQogICAgICAgICAgdmFyIGVuZCA9IGxlbmd0aCAtIHN0cmluZ1NpemUob21pc3Npb24pOwogICAgICAgICAgaWYgKGVuZCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIG9taXNzaW9uOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHJlc3VsdCA9IHN0clN5bWJvbHMKICAgICAgICAgICAgPyBjYXN0U2xpY2Uoc3RyU3ltYm9scywgMCwgZW5kKS5qb2luKCcnKQogICAgICAgICAgICA6IHN0cmluZy5zbGljZSgwLCBlbmQpOwoKICAgICAgICAgIGlmIChzZXBhcmF0b3IgPT09IHVuZGVmaW5lZCQxKSB7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQgKyBvbWlzc2lvbjsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdHJTeW1ib2xzKSB7CiAgICAgICAgICAgIGVuZCArPSAocmVzdWx0Lmxlbmd0aCAtIGVuZCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXNSZWdFeHAoc2VwYXJhdG9yKSkgewogICAgICAgICAgICBpZiAoc3RyaW5nLnNsaWNlKGVuZCkuc2VhcmNoKHNlcGFyYXRvcikpIHsKICAgICAgICAgICAgICB2YXIgbWF0Y2gsCiAgICAgICAgICAgICAgICAgIHN1YnN0cmluZyA9IHJlc3VsdDsKCiAgICAgICAgICAgICAgaWYgKCFzZXBhcmF0b3IuZ2xvYmFsKSB7CiAgICAgICAgICAgICAgICBzZXBhcmF0b3IgPSBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgdG9TdHJpbmcocmVGbGFncy5leGVjKHNlcGFyYXRvcikpICsgJ2cnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc2VwYXJhdG9yLmxhc3RJbmRleCA9IDA7CiAgICAgICAgICAgICAgd2hpbGUgKChtYXRjaCA9IHNlcGFyYXRvci5leGVjKHN1YnN0cmluZykpKSB7CiAgICAgICAgICAgICAgICB2YXIgbmV3RW5kID0gbWF0Y2guaW5kZXg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zbGljZSgwLCBuZXdFbmQgPT09IHVuZGVmaW5lZCQxID8gZW5kIDogbmV3RW5kKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChzdHJpbmcuaW5kZXhPZihiYXNlVG9TdHJpbmcoc2VwYXJhdG9yKSwgZW5kKSAhPSBlbmQpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gcmVzdWx0Lmxhc3RJbmRleE9mKHNlcGFyYXRvcik7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHJlc3VsdCArIG9taXNzaW9uOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGludmVyc2Ugb2YgYF8uZXNjYXBlYDsgdGhpcyBtZXRob2QgY29udmVydHMgdGhlIEhUTUwgZW50aXRpZXMKICAgICAgICAgKiBgJmFtcDtgLCBgJmx0O2AsIGAmZ3Q7YCwgYCZxdW90O2AsIGFuZCBgJiMzOTtgIGluIGBzdHJpbmdgIHRvCiAgICAgICAgICogdGhlaXIgY29ycmVzcG9uZGluZyBjaGFyYWN0ZXJzLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIE5vIG90aGVyIEhUTUwgZW50aXRpZXMgYXJlIHVuZXNjYXBlZC4gVG8gdW5lc2NhcGUgYWRkaXRpb25hbAogICAgICAgICAqIEhUTUwgZW50aXRpZXMgdXNlIGEgdGhpcmQtcGFydHkgbGlicmFyeSBsaWtlIFtfaGVfXShodHRwczovL210aHMuYmUvaGUpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDAuNi4wCiAgICAgICAgICogQGNhdGVnb3J5IFN0cmluZwogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3RyaW5nPScnXSBUaGUgc3RyaW5nIHRvIHVuZXNjYXBlLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuZXNjYXBlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udW5lc2NhcGUoJ2ZyZWQsIGJhcm5leSwgJmFtcDsgcGViYmxlcycpOwogICAgICAgICAqIC8vID0+ICdmcmVkLCBiYXJuZXksICYgcGViYmxlcycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB1bmVzY2FwZShzdHJpbmcpIHsKICAgICAgICAgIHN0cmluZyA9IHRvU3RyaW5nKHN0cmluZyk7CiAgICAgICAgICByZXR1cm4gKHN0cmluZyAmJiByZUhhc0VzY2FwZWRIdG1sLnRlc3Qoc3RyaW5nKSkKICAgICAgICAgICAgPyBzdHJpbmcucmVwbGFjZShyZUVzY2FwZWRIdG1sLCB1bmVzY2FwZUh0bWxDaGFyKQogICAgICAgICAgICA6IHN0cmluZzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGBzdHJpbmdgLCBhcyBzcGFjZSBzZXBhcmF0ZWQgd29yZHMsIHRvIHVwcGVyIGNhc2UuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgU3RyaW5nCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzdHJpbmc9JyddIFRoZSBzdHJpbmcgdG8gY29udmVydC4KICAgICAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSB1cHBlciBjYXNlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udXBwZXJDYXNlKCctLWZvby1iYXInKTsKICAgICAgICAgKiAvLyA9PiAnRk9PIEJBUicKICAgICAgICAgKgogICAgICAgICAqIF8udXBwZXJDYXNlKCdmb29CYXInKTsKICAgICAgICAgKiAvLyA9PiAnRk9PIEJBUicKICAgICAgICAgKgogICAgICAgICAqIF8udXBwZXJDYXNlKCdfX2Zvb19iYXJfXycpOwogICAgICAgICAqIC8vID0+ICdGT08gQkFSJwogICAgICAgICAqLwogICAgICAgIHZhciB1cHBlckNhc2UgPSBjcmVhdGVDb21wb3VuZGVyKGZ1bmN0aW9uKHJlc3VsdCwgd29yZCwgaW5kZXgpIHsKICAgICAgICAgIHJldHVybiByZXN1bHQgKyAoaW5kZXggPyAnICcgOiAnJykgKyB3b3JkLnRvVXBwZXJDYXNlKCk7CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYHN0cmluZ2AgdG8gdXBwZXIgY2FzZS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBjb252ZXJ0LgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udXBwZXJGaXJzdCgnZnJlZCcpOwogICAgICAgICAqIC8vID0+ICdGcmVkJwogICAgICAgICAqCiAgICAgICAgICogXy51cHBlckZpcnN0KCdGUkVEJyk7CiAgICAgICAgICogLy8gPT4gJ0ZSRUQnCiAgICAgICAgICovCiAgICAgICAgdmFyIHVwcGVyRmlyc3QgPSBjcmVhdGVDYXNlRmlyc3QoJ3RvVXBwZXJDYXNlJyk7CgogICAgICAgIC8qKgogICAgICAgICAqIFNwbGl0cyBgc3RyaW5nYCBpbnRvIGFuIGFycmF5IG9mIGl0cyB3b3Jkcy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBTdHJpbmcKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3N0cmluZz0nJ10gVGhlIHN0cmluZyB0byBpbnNwZWN0LgogICAgICAgICAqIEBwYXJhbSB7UmVnRXhwfHN0cmluZ30gW3BhdHRlcm5dIFRoZSBwYXR0ZXJuIHRvIG1hdGNoIHdvcmRzLgogICAgICAgICAqIEBwYXJhbS0ge09iamVjdH0gW2d1YXJkXSBFbmFibGVzIHVzZSBhcyBhbiBpdGVyYXRlZSBmb3IgbWV0aG9kcyBsaWtlIGBfLm1hcGAuCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSB3b3JkcyBvZiBgc3RyaW5nYC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnKTsKICAgICAgICAgKiAvLyA9PiBbJ2ZyZWQnLCAnYmFybmV5JywgJ3BlYmJsZXMnXQogICAgICAgICAqCiAgICAgICAgICogXy53b3JkcygnZnJlZCwgYmFybmV5LCAmIHBlYmJsZXMnLCAvW14sIF0rL2cpOwogICAgICAgICAqIC8vID0+IFsnZnJlZCcsICdiYXJuZXknLCAnJicsICdwZWJibGVzJ10KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB3b3JkcyhzdHJpbmcsIHBhdHRlcm4sIGd1YXJkKSB7CiAgICAgICAgICBzdHJpbmcgPSB0b1N0cmluZyhzdHJpbmcpOwogICAgICAgICAgcGF0dGVybiA9IGd1YXJkID8gdW5kZWZpbmVkJDEgOiBwYXR0ZXJuOwoKICAgICAgICAgIGlmIChwYXR0ZXJuID09PSB1bmRlZmluZWQkMSkgewogICAgICAgICAgICByZXR1cm4gaGFzVW5pY29kZVdvcmQoc3RyaW5nKSA/IHVuaWNvZGVXb3JkcyhzdHJpbmcpIDogYXNjaWlXb3JkcyhzdHJpbmcpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHN0cmluZy5tYXRjaChwYXR0ZXJuKSB8fCBbXTsKICAgICAgICB9CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQXR0ZW1wdHMgdG8gaW52b2tlIGBmdW5jYCwgcmV0dXJuaW5nIGVpdGhlciB0aGUgcmVzdWx0IG9yIHRoZSBjYXVnaHQgZXJyb3IKICAgICAgICAgKiBvYmplY3QuIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gYGZ1bmNgIHdoZW4gaXQncyBpbnZva2VkLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhdHRlbXB0LgogICAgICAgICAqIEBwYXJhbSB7Li4uKn0gW2FyZ3NdIFRoZSBhcmd1bWVudHMgdG8gaW52b2tlIGBmdW5jYCB3aXRoLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBgZnVuY2AgcmVzdWx0IG9yIGVycm9yIG9iamVjdC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogLy8gQXZvaWQgdGhyb3dpbmcgZXJyb3JzIGZvciBpbnZhbGlkIHNlbGVjdG9ycy4KICAgICAgICAgKiB2YXIgZWxlbWVudHMgPSBfLmF0dGVtcHQoZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgICAgKiAgIHJldHVybiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgICAgICAgKiB9LCAnPl8+Jyk7CiAgICAgICAgICoKICAgICAgICAgKiBpZiAoXy5pc0Vycm9yKGVsZW1lbnRzKSkgewogICAgICAgICAqICAgZWxlbWVudHMgPSBbXTsKICAgICAgICAgKiB9CiAgICAgICAgICovCiAgICAgICAgdmFyIGF0dGVtcHQgPSBiYXNlUmVzdChmdW5jdGlvbihmdW5jLCBhcmdzKSB7CiAgICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gYXBwbHkoZnVuYywgdW5kZWZpbmVkJDEsIGFyZ3MpOwogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gaXNFcnJvcihlKSA/IGUgOiBuZXcgRXJyb3IoZSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIG1ldGhvZHMgb2YgYW4gb2JqZWN0IHRvIHRoZSBvYmplY3QgaXRzZWxmLCBvdmVyd3JpdGluZyB0aGUgZXhpc3RpbmcKICAgICAgICAgKiBtZXRob2QuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgZG9lc24ndCBzZXQgdGhlICJsZW5ndGgiIHByb3BlcnR5IG9mIGJvdW5kIGZ1bmN0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGJpbmQgYW5kIGFzc2lnbiB0aGUgYm91bmQgbWV0aG9kcyB0by4KICAgICAgICAgKiBAcGFyYW0gey4uLihzdHJpbmd8c3RyaW5nW10pfSBtZXRob2ROYW1lcyBUaGUgb2JqZWN0IG1ldGhvZCBuYW1lcyB0byBiaW5kLgogICAgICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciB2aWV3ID0gewogICAgICAgICAqICAgJ2xhYmVsJzogJ2RvY3MnLAogICAgICAgICAqICAgJ2NsaWNrJzogZnVuY3Rpb24oKSB7CiAgICAgICAgICogICAgIGNvbnNvbGUubG9nKCdjbGlja2VkICcgKyB0aGlzLmxhYmVsKTsKICAgICAgICAgKiAgIH0KICAgICAgICAgKiB9OwogICAgICAgICAqCiAgICAgICAgICogXy5iaW5kQWxsKHZpZXcsIFsnY2xpY2snXSk7CiAgICAgICAgICogalF1ZXJ5KGVsZW1lbnQpLm9uKCdjbGljaycsIHZpZXcuY2xpY2spOwogICAgICAgICAqIC8vID0+IExvZ3MgJ2NsaWNrZWQgZG9jcycgd2hlbiBjbGlja2VkLgogICAgICAgICAqLwogICAgICAgIHZhciBiaW5kQWxsID0gZmxhdFJlc3QoZnVuY3Rpb24ob2JqZWN0LCBtZXRob2ROYW1lcykgewogICAgICAgICAgYXJyYXlFYWNoKG1ldGhvZE5hbWVzLCBmdW5jdGlvbihrZXkpIHsKICAgICAgICAgICAga2V5ID0gdG9LZXkoa2V5KTsKICAgICAgICAgICAgYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBiaW5kKG9iamVjdFtrZXldLCBvYmplY3QpKTsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICB9KTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaXRlcmF0ZXMgb3ZlciBgcGFpcnNgIGFuZCBpbnZva2VzIHRoZSBjb3JyZXNwb25kaW5nCiAgICAgICAgICogZnVuY3Rpb24gb2YgdGhlIGZpcnN0IHByZWRpY2F0ZSB0byByZXR1cm4gdHJ1dGh5LiBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uCiAgICAgICAgICogcGFpcnMgYXJlIGludm9rZWQgd2l0aCB0aGUgYHRoaXNgIGJpbmRpbmcgYW5kIGFyZ3VtZW50cyBvZiB0aGUgY3JlYXRlZAogICAgICAgICAqIGZ1bmN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBwYWlycyBUaGUgcHJlZGljYXRlLWZ1bmN0aW9uIHBhaXJzLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbXBvc2l0ZSBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIGZ1bmMgPSBfLmNvbmQoWwogICAgICAgICAqICAgW18ubWF0Y2hlcyh7ICdhJzogMSB9KSwgICAgICAgICAgIF8uY29uc3RhbnQoJ21hdGNoZXMgQScpXSwKICAgICAgICAgKiAgIFtfLmNvbmZvcm1zKHsgJ2InOiBfLmlzTnVtYmVyIH0pLCBfLmNvbnN0YW50KCdtYXRjaGVzIEInKV0sCiAgICAgICAgICogICBbXy5zdHViVHJ1ZSwgICAgICAgICAgICAgICAgICAgICAgXy5jb25zdGFudCgnbm8gbWF0Y2gnKV0KICAgICAgICAgKiBdKTsKICAgICAgICAgKgogICAgICAgICAqIGZ1bmMoeyAnYSc6IDEsICdiJzogMiB9KTsKICAgICAgICAgKiAvLyA9PiAnbWF0Y2hlcyBBJwogICAgICAgICAqCiAgICAgICAgICogZnVuYyh7ICdhJzogMCwgJ2InOiAxIH0pOwogICAgICAgICAqIC8vID0+ICdtYXRjaGVzIEInCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jKHsgJ2EnOiAnMScsICdiJzogJzInIH0pOwogICAgICAgICAqIC8vID0+ICdubyBtYXRjaCcKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb25kKHBhaXJzKSB7CiAgICAgICAgICB2YXIgbGVuZ3RoID0gcGFpcnMgPT0gbnVsbCA/IDAgOiBwYWlycy5sZW5ndGgsCiAgICAgICAgICAgICAgdG9JdGVyYXRlZSA9IGdldEl0ZXJhdGVlKCk7CgogICAgICAgICAgcGFpcnMgPSAhbGVuZ3RoID8gW10gOiBhcnJheU1hcChwYWlycywgZnVuY3Rpb24ocGFpcikgewogICAgICAgICAgICBpZiAodHlwZW9mIHBhaXJbMV0gIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gW3RvSXRlcmF0ZWUocGFpclswXSksIHBhaXJbMV1dOwogICAgICAgICAgfSk7CgogICAgICAgICAgcmV0dXJuIGJhc2VSZXN0KGZ1bmN0aW9uKGFyZ3MpIHsKICAgICAgICAgICAgdmFyIGluZGV4ID0gLTE7CiAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgICAgICAgdmFyIHBhaXIgPSBwYWlyc1tpbmRleF07CiAgICAgICAgICAgICAgaWYgKGFwcGx5KHBhaXJbMF0sIHRoaXMsIGFyZ3MpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkocGFpclsxXSwgdGhpcywgYXJncyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGludm9rZXMgdGhlIHByZWRpY2F0ZSBwcm9wZXJ0aWVzIG9mIGBzb3VyY2VgIHdpdGgKICAgICAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSB2YWx1ZXMgb2YgYSBnaXZlbiBvYmplY3QsIHJldHVybmluZyBgdHJ1ZWAgaWYKICAgICAgICAgKiBhbGwgcHJlZGljYXRlcyByZXR1cm4gdHJ1dGh5LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5jb25mb3Jtc1RvYCB3aXRoCiAgICAgICAgICogYHNvdXJjZWAgcGFydGlhbGx5IGFwcGxpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSBwcmVkaWNhdGVzIHRvIGNvbmZvcm0gdG8uCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbCiAgICAgICAgICogICB7ICdhJzogMiwgJ2InOiAxIH0sCiAgICAgICAgICogICB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAgICAgKiBdOwogICAgICAgICAqCiAgICAgICAgICogXy5maWx0ZXIob2JqZWN0cywgXy5jb25mb3Jtcyh7ICdiJzogZnVuY3Rpb24obikgeyByZXR1cm4gbiA+IDE7IH0gfSkpOwogICAgICAgICAqIC8vID0+IFt7ICdhJzogMSwgJ2InOiAyIH1dCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29uZm9ybXMoc291cmNlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZUNvbmZvcm1zKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuNC4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGNvbnN0YW50IGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5jb25zdGFudCh7ICdhJzogMSB9KSk7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTsKICAgICAgICAgKiAvLyA9PiBbeyAnYSc6IDEgfSwgeyAnYSc6IDEgfV0KICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb25zdGFudCh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGB2YWx1ZWAgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBkZWZhdWx0IHZhbHVlIHNob3VsZCBiZSByZXR1cm5lZCBpbgogICAgICAgICAqIGl0cyBwbGFjZS4gVGhlIGBkZWZhdWx0VmFsdWVgIGlzIHJldHVybmVkIGlmIGB2YWx1ZWAgaXMgYE5hTmAsIGBudWxsYCwKICAgICAgICAgKiBvciBgdW5kZWZpbmVkYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjE0LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICAgICAqIEBwYXJhbSB7Kn0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5kZWZhdWx0VG8oMSwgMTApOwogICAgICAgICAqIC8vID0+IDEKICAgICAgICAgKgogICAgICAgICAqIF8uZGVmYXVsdFRvKHVuZGVmaW5lZCwgMTApOwogICAgICAgICAqIC8vID0+IDEwCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZGVmYXVsdFRvKHZhbHVlLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgIHJldHVybiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSAhPT0gdmFsdWUpID8gZGVmYXVsdFZhbHVlIDogdmFsdWU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSByZXN1bHQgb2YgaW52b2tpbmcgdGhlIGdpdmVuIGZ1bmN0aW9ucwogICAgICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBjcmVhdGVkIGZ1bmN0aW9uLCB3aGVyZSBlYWNoIHN1Y2Nlc3NpdmUKICAgICAgICAgKiBpbnZvY2F0aW9uIGlzIHN1cHBsaWVkIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIHByZXZpb3VzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2Z1bmNzXSBUaGUgZnVuY3Rpb25zIHRvIGludm9rZS4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBjb21wb3NpdGUgZnVuY3Rpb24uCiAgICAgICAgICogQHNlZSBfLmZsb3dSaWdodAogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikgewogICAgICAgICAqICAgcmV0dXJuIG4gKiBuOwogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciBhZGRTcXVhcmUgPSBfLmZsb3coW18uYWRkLCBzcXVhcmVdKTsKICAgICAgICAgKiBhZGRTcXVhcmUoMSwgMik7CiAgICAgICAgICogLy8gPT4gOQogICAgICAgICAqLwogICAgICAgIHZhciBmbG93ID0gY3JlYXRlRmxvdygpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZsb3dgIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0CiAgICAgICAgICogaW52b2tlcyB0aGUgZ2l2ZW4gZnVuY3Rpb25zIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtmdW5jc10gVGhlIGZ1bmN0aW9ucyB0byBpbnZva2UuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29tcG9zaXRlIGZ1bmN0aW9uLgogICAgICAgICAqIEBzZWUgXy5mbG93CiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmN0aW9uIHNxdWFyZShuKSB7CiAgICAgICAgICogICByZXR1cm4gbiAqIG47CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogdmFyIGFkZFNxdWFyZSA9IF8uZmxvd1JpZ2h0KFtzcXVhcmUsIF8uYWRkXSk7CiAgICAgICAgICogYWRkU3F1YXJlKDEsIDIpOwogICAgICAgICAqIC8vID0+IDkKICAgICAgICAgKi8KICAgICAgICB2YXIgZmxvd1JpZ2h0ID0gY3JlYXRlRmxvdyh0cnVlKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLgogICAgICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIGB2YWx1ZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9OwogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcyBgZnVuY2Agd2l0aCB0aGUgYXJndW1lbnRzIG9mIHRoZSBjcmVhdGVkCiAgICAgICAgICogZnVuY3Rpb24uIElmIGBmdW5jYCBpcyBhIHByb3BlcnR5IG5hbWUsIHRoZSBjcmVhdGVkIGZ1bmN0aW9uIHJldHVybnMgdGhlCiAgICAgICAgICogcHJvcGVydHkgdmFsdWUgZm9yIGEgZ2l2ZW4gZWxlbWVudC4gSWYgYGZ1bmNgIGlzIGFuIGFycmF5IG9yIG9iamVjdCwgdGhlCiAgICAgICAgICogY3JlYXRlZCBmdW5jdGlvbiByZXR1cm5zIGB0cnVlYCBmb3IgZWxlbWVudHMgdGhhdCBjb250YWluIHRoZSBlcXVpdmFsZW50CiAgICAgICAgICogc291cmNlIHByb3BlcnRpZXMsIG90aGVyd2lzZSBpdCByZXR1cm5zIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7Kn0gW2Z1bmM9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYSBjYWxsYmFjay4KICAgICAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGNhbGxiYWNrLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSwKICAgICAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICAgICAqIF8uZmlsdGVyKHVzZXJzLCBfLml0ZXJhdGVlKHsgJ3VzZXInOiAnYmFybmV5JywgJ2FjdGl2ZSc6IHRydWUgfSkpOwogICAgICAgICAqIC8vID0+IFt7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfV0KICAgICAgICAgKgogICAgICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLmZpbHRlcih1c2VycywgXy5pdGVyYXRlZShbJ3VzZXInLCAnZnJlZCddKSk7CiAgICAgICAgICogLy8gPT4gW3sgJ3VzZXInOiAnZnJlZCcsICdhZ2UnOiA0MCB9XQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5tYXAodXNlcnMsIF8uaXRlcmF0ZWUoJ3VzZXInKSk7CiAgICAgICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddCiAgICAgICAgICoKICAgICAgICAgKiAvLyBDcmVhdGUgY3VzdG9tIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgICAgICogXy5pdGVyYXRlZSA9IF8ud3JhcChfLml0ZXJhdGVlLCBmdW5jdGlvbihpdGVyYXRlZSwgZnVuYykgewogICAgICAgICAqICAgcmV0dXJuICFfLmlzUmVnRXhwKGZ1bmMpID8gaXRlcmF0ZWUoZnVuYykgOiBmdW5jdGlvbihzdHJpbmcpIHsKICAgICAgICAgKiAgICAgcmV0dXJuIGZ1bmMudGVzdChzdHJpbmcpOwogICAgICAgICAqICAgfTsKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIF8uZmlsdGVyKFsnYWJjJywgJ2RlZiddLCAvZWYvKTsKICAgICAgICAgKiAvLyA9PiBbJ2RlZiddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gaXRlcmF0ZWUoZnVuYykgewogICAgICAgICAgcmV0dXJuIGJhc2VJdGVyYXRlZSh0eXBlb2YgZnVuYyA9PSAnZnVuY3Rpb24nID8gZnVuYyA6IGJhc2VDbG9uZShmdW5jLCBDTE9ORV9ERUVQX0ZMQUcpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IHBlcmZvcm1zIGEgcGFydGlhbCBkZWVwIGNvbXBhcmlzb24gYmV0d2VlbiBhIGdpdmVuCiAgICAgICAgICogb2JqZWN0IGFuZCBgc291cmNlYCwgcmV0dXJuaW5nIGB0cnVlYCBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGhhcyBlcXVpdmFsZW50CiAgICAgICAgICogcHJvcGVydHkgdmFsdWVzLCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogVGhlIGNyZWF0ZWQgZnVuY3Rpb24gaXMgZXF1aXZhbGVudCB0byBgXy5pc01hdGNoYCB3aXRoIGBzb3VyY2VgCiAgICAgICAgICogcGFydGlhbGx5IGFwcGxpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBQYXJ0aWFsIGNvbXBhcmlzb25zIHdpbGwgbWF0Y2ggZW1wdHkgYXJyYXkgYW5kIGVtcHR5IG9iamVjdCBgc291cmNlYAogICAgICAgICAqIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlIGBfLmlzRXF1YWxgCiAgICAgICAgICogZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjaGVja2VkIGJ5IGNvbWJpbmluZyBzZXZlcmFsIG1hdGNoZXJzCiAgICAgICAgICogdXNpbmcgYF8ub3ZlclNvbWVgCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCBvZiBwcm9wZXJ0eSB2YWx1ZXMgdG8gbWF0Y2guCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbCiAgICAgICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwKICAgICAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8uZmlsdGVyKG9iamVjdHMsIF8ubWF0Y2hlcyh7ICdhJzogNCwgJ2MnOiA2IH0pKTsKICAgICAgICAgKiAvLyA9PiBbeyAnYSc6IDQsICdiJzogNSwgJ2MnOiA2IH1dCiAgICAgICAgICoKICAgICAgICAgKiAvLyBDaGVja2luZyBmb3Igc2V2ZXJhbCBwb3NzaWJsZSB2YWx1ZXMKICAgICAgICAgKiBfLmZpbHRlcih1c2VycywgXy5vdmVyU29tZShbXy5tYXRjaGVzKHsgJ2EnOiAxIH0pLCBfLm1hdGNoZXMoeyAnYSc6IDQgfSldKSk7CiAgICAgICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXRjaGVzKHNvdXJjZSkgewogICAgICAgICAgcmV0dXJuIGJhc2VNYXRjaGVzKGJhc2VDbG9uZShzb3VyY2UsIENMT05FX0RFRVBfRkxBRykpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcGVyZm9ybXMgYSBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbiBiZXR3ZWVuIHRoZQogICAgICAgICAqIHZhbHVlIGF0IGBwYXRoYCBvZiBhIGdpdmVuIG9iamVjdCB0byBgc3JjVmFsdWVgLCByZXR1cm5pbmcgYHRydWVgIGlmIHRoZQogICAgICAgICAqIG9iamVjdCB2YWx1ZSBpcyBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogUGFydGlhbCBjb21wYXJpc29ucyB3aWxsIG1hdGNoIGVtcHR5IGFycmF5IGFuZCBlbXB0eSBvYmplY3QKICAgICAgICAgKiBgc3JjVmFsdWVgIHZhbHVlcyBhZ2FpbnN0IGFueSBhcnJheSBvciBvYmplY3QgdmFsdWUsIHJlc3BlY3RpdmVseS4gU2VlCiAgICAgICAgICogYF8uaXNFcXVhbGAgZm9yIGEgbGlzdCBvZiBzdXBwb3J0ZWQgdmFsdWUgY29tcGFyaXNvbnMuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogTXVsdGlwbGUgdmFsdWVzIGNhbiBiZSBjaGVja2VkIGJ5IGNvbWJpbmluZyBzZXZlcmFsIG1hdGNoZXJzCiAgICAgICAgICogdXNpbmcgYF8ub3ZlclNvbWVgCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4yLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbCiAgICAgICAgICogICB7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDMgfSwKICAgICAgICAgKiAgIHsgJ2EnOiA0LCAnYic6IDUsICdjJzogNiB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8uZmluZChvYmplY3RzLCBfLm1hdGNoZXNQcm9wZXJ0eSgnYScsIDQpKTsKICAgICAgICAgKiAvLyA9PiB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfQogICAgICAgICAqCiAgICAgICAgICogLy8gQ2hlY2tpbmcgZm9yIHNldmVyYWwgcG9zc2libGUgdmFsdWVzCiAgICAgICAgICogXy5maWx0ZXIodXNlcnMsIF8ub3ZlclNvbWUoW18ubWF0Y2hlc1Byb3BlcnR5KCdhJywgMSksIF8ubWF0Y2hlc1Byb3BlcnR5KCdhJywgNCldKSk7CiAgICAgICAgICogLy8gPT4gW3sgJ2EnOiAxLCAnYic6IDIsICdjJzogMyB9LCB7ICdhJzogNCwgJ2InOiA1LCAnYyc6IDYgfV0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXRjaGVzUHJvcGVydHkocGF0aCwgc3JjVmFsdWUpIHsKICAgICAgICAgIHJldHVybiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIGJhc2VDbG9uZShzcmNWYWx1ZSwgQ0xPTkVfREVFUF9GTEFHKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIHRoZSBtZXRob2QgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LgogICAgICAgICAqIEFueSBhZGRpdGlvbmFsIGFyZ3VtZW50cyBhcmUgcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuNy4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgbWV0aG9kIHRvIGludm9rZS4KICAgICAgICAgKiBAcGFyYW0gey4uLip9IFthcmdzXSBUaGUgYXJndW1lbnRzIHRvIGludm9rZSB0aGUgbWV0aG9kIHdpdGguCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgaW52b2tlciBmdW5jdGlvbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbCiAgICAgICAgICogICB7ICdhJzogeyAnYic6IF8uY29uc3RhbnQoMikgfSB9LAogICAgICAgICAqICAgeyAnYSc6IHsgJ2InOiBfLmNvbnN0YW50KDEpIH0gfQogICAgICAgICAqIF07CiAgICAgICAgICoKICAgICAgICAgKiBfLm1hcChvYmplY3RzLCBfLm1ldGhvZCgnYS5iJykpOwogICAgICAgICAqIC8vID0+IFsyLCAxXQogICAgICAgICAqCiAgICAgICAgICogXy5tYXAob2JqZWN0cywgXy5tZXRob2QoWydhJywgJ2InXSkpOwogICAgICAgICAqIC8vID0+IFsyLCAxXQogICAgICAgICAqLwogICAgICAgIHZhciBtZXRob2QgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7CiAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ubWV0aG9kYDsgdGhpcyBtZXRob2QgY3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgaW52b2tlcwogICAgICAgICAqIHRoZSBtZXRob2QgYXQgYSBnaXZlbiBwYXRoIG9mIGBvYmplY3RgLiBBbnkgYWRkaXRpb25hbCBhcmd1bWVudHMgYXJlCiAgICAgICAgICogcHJvdmlkZWQgdG8gdGhlIGludm9rZWQgbWV0aG9kLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuNy4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBbYXJnc10gVGhlIGFyZ3VtZW50cyB0byBpbnZva2UgdGhlIG1ldGhvZCB3aXRoLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGludm9rZXIgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheSA9IF8udGltZXMoMywgXy5jb25zdGFudCksCiAgICAgICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9OwogICAgICAgICAqCiAgICAgICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5tZXRob2RPZihvYmplY3QpKTsKICAgICAgICAgKiAvLyA9PiBbMiwgMF0KICAgICAgICAgKgogICAgICAgICAqIF8ubWFwKFtbJ2EnLCAnMiddLCBbJ2MnLCAnMCddXSwgXy5tZXRob2RPZihvYmplY3QpKTsKICAgICAgICAgKiAvLyA9PiBbMiwgMF0KICAgICAgICAgKi8KICAgICAgICB2YXIgbWV0aG9kT2YgPSBiYXNlUmVzdChmdW5jdGlvbihvYmplY3QsIGFyZ3MpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlSW52b2tlKG9iamVjdCwgcGF0aCwgYXJncyk7CiAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFsbCBvd24gZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgZnVuY3Rpb24gcHJvcGVydGllcyBvZiBhIHNvdXJjZQogICAgICAgICAqIG9iamVjdCB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0LiBJZiBgb2JqZWN0YCBpcyBhIGZ1bmN0aW9uLCB0aGVuIG1ldGhvZHMKICAgICAgICAgKiBhcmUgYWRkZWQgdG8gaXRzIHByb3RvdHlwZSBhcyB3ZWxsLgogICAgICAgICAqCiAgICAgICAgICogKipOb3RlOioqIFVzZSBgXy5ydW5JbkNvbnRleHRgIHRvIGNyZWF0ZSBhIHByaXN0aW5lIGBsb2Rhc2hgIGZ1bmN0aW9uIHRvCiAgICAgICAgICogYXZvaWQgY29uZmxpY3RzIGNhdXNlZCBieSBtb2RpZnlpbmcgdGhlIG9yaWdpbmFsLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBzaW5jZSAwLjEuMAogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufE9iamVjdH0gW29iamVjdD1sb2Rhc2hdIFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIGZ1bmN0aW9ucyB0byBhZGQuCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IFtvcHRpb25zPXt9XSBUaGUgb3B0aW9ucyBvYmplY3QuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbb3B0aW9ucy5jaGFpbj10cnVlXSBTcGVjaWZ5IHdoZXRoZXIgbWl4aW5zIGFyZSBjaGFpbmFibGUuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufE9iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogZnVuY3Rpb24gdm93ZWxzKHN0cmluZykgewogICAgICAgICAqICAgcmV0dXJuIF8uZmlsdGVyKHN0cmluZywgZnVuY3Rpb24odikgewogICAgICAgICAqICAgICByZXR1cm4gL1thZWlvdV0vaS50ZXN0KHYpOwogICAgICAgICAqICAgfSk7CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXy5taXhpbih7ICd2b3dlbHMnOiB2b3dlbHMgfSk7CiAgICAgICAgICogXy52b3dlbHMoJ2ZyZWQnKTsKICAgICAgICAgKiAvLyA9PiBbJ2UnXQogICAgICAgICAqCiAgICAgICAgICogXygnZnJlZCcpLnZvd2VscygpLnZhbHVlKCk7CiAgICAgICAgICogLy8gPT4gWydlJ10KICAgICAgICAgKgogICAgICAgICAqIF8ubWl4aW4oeyAndm93ZWxzJzogdm93ZWxzIH0sIHsgJ2NoYWluJzogZmFsc2UgfSk7CiAgICAgICAgICogXygnZnJlZCcpLnZvd2VscygpOwogICAgICAgICAqIC8vID0+IFsnZSddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbWl4aW4ob2JqZWN0LCBzb3VyY2UsIG9wdGlvbnMpIHsKICAgICAgICAgIHZhciBwcm9wcyA9IGtleXMoc291cmNlKSwKICAgICAgICAgICAgICBtZXRob2ROYW1lcyA9IGJhc2VGdW5jdGlvbnMoc291cmNlLCBwcm9wcyk7CgogICAgICAgICAgaWYgKG9wdGlvbnMgPT0gbnVsbCAmJgogICAgICAgICAgICAgICEoaXNPYmplY3Qoc291cmNlKSAmJiAobWV0aG9kTmFtZXMubGVuZ3RoIHx8ICFwcm9wcy5sZW5ndGgpKSkgewogICAgICAgICAgICBvcHRpb25zID0gc291cmNlOwogICAgICAgICAgICBzb3VyY2UgPSBvYmplY3Q7CiAgICAgICAgICAgIG9iamVjdCA9IHRoaXM7CiAgICAgICAgICAgIG1ldGhvZE5hbWVzID0gYmFzZUZ1bmN0aW9ucyhzb3VyY2UsIGtleXMoc291cmNlKSk7CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgY2hhaW4gPSAhKGlzT2JqZWN0KG9wdGlvbnMpICYmICdjaGFpbicgaW4gb3B0aW9ucykgfHwgISFvcHRpb25zLmNoYWluLAogICAgICAgICAgICAgIGlzRnVuYyA9IGlzRnVuY3Rpb24ob2JqZWN0KTsKCiAgICAgICAgICBhcnJheUVhY2gobWV0aG9kTmFtZXMsIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgICAgICAgICAgdmFyIGZ1bmMgPSBzb3VyY2VbbWV0aG9kTmFtZV07CiAgICAgICAgICAgIG9iamVjdFttZXRob2ROYW1lXSA9IGZ1bmM7CiAgICAgICAgICAgIGlmIChpc0Z1bmMpIHsKICAgICAgICAgICAgICBvYmplY3QucHJvdG90eXBlW21ldGhvZE5hbWVdID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXzsKICAgICAgICAgICAgICAgIGlmIChjaGFpbiB8fCBjaGFpbkFsbCkgewogICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gb2JqZWN0KHRoaXMuX193cmFwcGVkX18pLAogICAgICAgICAgICAgICAgICAgICAgYWN0aW9ucyA9IHJlc3VsdC5fX2FjdGlvbnNfXyA9IGNvcHlBcnJheSh0aGlzLl9fYWN0aW9uc19fKTsKCiAgICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaCh7ICdmdW5jJzogZnVuYywgJ2FyZ3MnOiBhcmd1bWVudHMsICd0aGlzQXJnJzogb2JqZWN0IH0pOwogICAgICAgICAgICAgICAgICByZXN1bHQuX19jaGFpbl9fID0gY2hhaW5BbGw7CiAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuYy5hcHBseShvYmplY3QsIGFycmF5UHVzaChbdGhpcy52YWx1ZSgpXSwgYXJndW1lbnRzKSk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldmVydHMgdGhlIGBfYCB2YXJpYWJsZSB0byBpdHMgcHJldmlvdXMgdmFsdWUgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8KICAgICAgICAgKiB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgYGxvZGFzaGAgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBsb2Rhc2ggPSBfLm5vQ29uZmxpY3QoKTsKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBub0NvbmZsaWN0KCkgewogICAgICAgICAgaWYgKHJvb3QuXyA9PT0gdGhpcykgewogICAgICAgICAgICByb290Ll8gPSBvbGREYXNoOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGB1bmRlZmluZWRgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuMy4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy50aW1lcygyLCBfLm5vb3ApOwogICAgICAgICAqIC8vID0+IFt1bmRlZmluZWQsIHVuZGVmaW5lZF0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBub29wKCkgewogICAgICAgICAgLy8gTm8gb3BlcmF0aW9uIHBlcmZvcm1lZC4KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IGdldHMgdGhlIGFyZ3VtZW50IGF0IGluZGV4IGBuYC4gSWYgYG5gIGlzIG5lZ2F0aXZlLAogICAgICAgICAqIHRoZSBudGggYXJndW1lbnQgZnJvbSB0aGUgZW5kIGlzIHJldHVybmVkLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW249MF0gVGhlIGluZGV4IG9mIHRoZSBhcmd1bWVudCB0byByZXR1cm4uCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgcGFzcy10aHJ1IGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZnVuYyA9IF8ubnRoQXJnKDEpOwogICAgICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTsKICAgICAgICAgKiAvLyA9PiAnYicKICAgICAgICAgKgogICAgICAgICAqIHZhciBmdW5jID0gXy5udGhBcmcoLTIpOwogICAgICAgICAqIGZ1bmMoJ2EnLCAnYicsICdjJywgJ2QnKTsKICAgICAgICAgKiAvLyA9PiAnYycKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBudGhBcmcobikgewogICAgICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgICAgICAgIHJldHVybiBiYXNlUmVzdChmdW5jdGlvbihhcmdzKSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlTnRoKGFyZ3MsIG4pOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBpdGVyYXRlZXNgIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcwogICAgICAgICAqIGFuZCByZXR1cm5zIHRoZWlyIHJlc3VsdHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbaXRlcmF0ZWVzPVtfLmlkZW50aXR5XV0KICAgICAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBpbnZva2UuCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBmdW5jID0gXy5vdmVyKFtNYXRoLm1heCwgTWF0aC5taW5dKTsKICAgICAgICAgKgogICAgICAgICAqIGZ1bmMoMSwgMiwgMywgNCk7CiAgICAgICAgICogLy8gPT4gWzQsIDFdCiAgICAgICAgICovCiAgICAgICAgdmFyIG92ZXIgPSBjcmVhdGVPdmVyKGFycmF5TWFwKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGlmICoqYWxsKiogb2YgdGhlIGBwcmVkaWNhdGVzYCByZXR1cm4KICAgICAgICAgKiB0cnV0aHkgd2hlbiBpbnZva2VkIHdpdGggdGhlIGFyZ3VtZW50cyBpdCByZWNlaXZlcy4KICAgICAgICAgKgogICAgICAgICAqIEZvbGxvd2luZyBzaG9ydGhhbmRzIGFyZSBwb3NzaWJsZSBmb3IgcHJvdmlkaW5nIHByZWRpY2F0ZXMuCiAgICAgICAgICogUGFzcyBhbiBgT2JqZWN0YCBhbmQgaXQgd2lsbCBiZSB1c2VkIGFzIGFuIHBhcmFtZXRlciBmb3IgYF8ubWF0Y2hlc2AgdG8gY3JlYXRlIHRoZSBwcmVkaWNhdGUuCiAgICAgICAgICogUGFzcyBhbiBgQXJyYXlgIG9mIHBhcmFtZXRlcnMgZm9yIGBfLm1hdGNoZXNQcm9wZXJ0eWAgYW5kIHRoZSBwcmVkaWNhdGUgd2lsbCBiZSBjcmVhdGVkIHVzaW5nIHRoZW0uCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7Li4uKEZ1bmN0aW9ufEZ1bmN0aW9uW10pfSBbcHJlZGljYXRlcz1bXy5pZGVudGl0eV1dCiAgICAgICAgICogIFRoZSBwcmVkaWNhdGVzIHRvIGNoZWNrLgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgZnVuYyA9IF8ub3ZlckV2ZXJ5KFtCb29sZWFuLCBpc0Zpbml0ZV0pOwogICAgICAgICAqCiAgICAgICAgICogZnVuYygnMScpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmMobnVsbCk7CiAgICAgICAgICogLy8gPT4gZmFsc2UKICAgICAgICAgKgogICAgICAgICAqIGZ1bmMoTmFOKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIHZhciBvdmVyRXZlcnkgPSBjcmVhdGVPdmVyKGFycmF5RXZlcnkpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgKiphbnkqKiBvZiB0aGUgYHByZWRpY2F0ZXNgIHJldHVybgogICAgICAgICAqIHRydXRoeSB3aGVuIGludm9rZWQgd2l0aCB0aGUgYXJndW1lbnRzIGl0IHJlY2VpdmVzLgogICAgICAgICAqCiAgICAgICAgICogRm9sbG93aW5nIHNob3J0aGFuZHMgYXJlIHBvc3NpYmxlIGZvciBwcm92aWRpbmcgcHJlZGljYXRlcy4KICAgICAgICAgKiBQYXNzIGFuIGBPYmplY3RgIGFuZCBpdCB3aWxsIGJlIHVzZWQgYXMgYW4gcGFyYW1ldGVyIGZvciBgXy5tYXRjaGVzYCB0byBjcmVhdGUgdGhlIHByZWRpY2F0ZS4KICAgICAgICAgKiBQYXNzIGFuIGBBcnJheWAgb2YgcGFyYW1ldGVycyBmb3IgYF8ubWF0Y2hlc1Byb3BlcnR5YCBhbmQgdGhlIHByZWRpY2F0ZSB3aWxsIGJlIGNyZWF0ZWQgdXNpbmcgdGhlbS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHsuLi4oRnVuY3Rpb258RnVuY3Rpb25bXSl9IFtwcmVkaWNhdGVzPVtfLmlkZW50aXR5XV0KICAgICAgICAgKiAgVGhlIHByZWRpY2F0ZXMgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBmdW5jID0gXy5vdmVyU29tZShbQm9vbGVhbiwgaXNGaW5pdGVdKTsKICAgICAgICAgKgogICAgICAgICAqIGZ1bmMoJzEnKTsKICAgICAgICAgKiAvLyA9PiB0cnVlCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jKG51bGwpOwogICAgICAgICAqIC8vID0+IHRydWUKICAgICAgICAgKgogICAgICAgICAqIGZ1bmMoTmFOKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG1hdGNoZXNGdW5jID0gXy5vdmVyU29tZShbeyAnYSc6IDEgfSwgeyAnYSc6IDIgfV0pCiAgICAgICAgICogdmFyIG1hdGNoZXNQcm9wZXJ0eUZ1bmMgPSBfLm92ZXJTb21lKFtbJ2EnLCAxXSwgWydhJywgMl1dKQogICAgICAgICAqLwogICAgICAgIHZhciBvdmVyU29tZSA9IGNyZWF0ZU92ZXIoYXJyYXlTb21lKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgYXQgYHBhdGhgIG9mIGEgZ2l2ZW4gb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDIuNC4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFsKICAgICAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sCiAgICAgICAgICogICB7ICdhJzogeyAnYic6IDEgfSB9CiAgICAgICAgICogXTsKICAgICAgICAgKgogICAgICAgICAqIF8ubWFwKG9iamVjdHMsIF8ucHJvcGVydHkoJ2EuYicpKTsKICAgICAgICAgKiAvLyA9PiBbMiwgMV0KICAgICAgICAgKgogICAgICAgICAqIF8ubWFwKF8uc29ydEJ5KG9iamVjdHMsIF8ucHJvcGVydHkoWydhJywgJ2InXSkpLCAnYS5iJyk7CiAgICAgICAgICogLy8gPT4gWzEsIDJdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcHJvcGVydHkocGF0aCkgewogICAgICAgICAgcmV0dXJuIGlzS2V5KHBhdGgpID8gYmFzZVByb3BlcnR5KHRvS2V5KHBhdGgpKSA6IGJhc2VQcm9wZXJ0eURlZXAocGF0aCk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3Bwb3NpdGUgb2YgYF8ucHJvcGVydHlgOyB0aGlzIG1ldGhvZCBjcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zCiAgICAgICAgICogdGhlIHZhbHVlIGF0IGEgZ2l2ZW4gcGF0aCBvZiBgb2JqZWN0YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgYXJyYXkgPSBbMCwgMSwgMl0sCiAgICAgICAgICogICAgIG9iamVjdCA9IHsgJ2EnOiBhcnJheSwgJ2InOiBhcnJheSwgJ2MnOiBhcnJheSB9OwogICAgICAgICAqCiAgICAgICAgICogXy5tYXAoWydhWzJdJywgJ2NbMF0nXSwgXy5wcm9wZXJ0eU9mKG9iamVjdCkpOwogICAgICAgICAqIC8vID0+IFsyLCAwXQogICAgICAgICAqCiAgICAgICAgICogXy5tYXAoW1snYScsICcyJ10sIFsnYycsICcwJ11dLCBfLnByb3BlcnR5T2Yob2JqZWN0KSk7CiAgICAgICAgICogLy8gPT4gWzIsIDBdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmplY3QpIHsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7CiAgICAgICAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IHVuZGVmaW5lZCQxIDogYmFzZUdldChvYmplY3QsIHBhdGgpOwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyAocG9zaXRpdmUgYW5kL29yIG5lZ2F0aXZlKSBwcm9ncmVzc2luZyBmcm9tCiAgICAgICAgICogYHN0YXJ0YCB1cCB0bywgYnV0IG5vdCBpbmNsdWRpbmcsIGBlbmRgLiBBIHN0ZXAgb2YgYC0xYCBpcyB1c2VkIGlmIGEgbmVnYXRpdmUKICAgICAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCwKICAgICAgICAgKiBpdCdzIHNldCB0byBgc3RhcnRgIHdpdGggYHN0YXJ0YCB0aGVuIHNldCB0byBgMGAuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nCiAgICAgICAgICogZmxvYXRpbmctcG9pbnQgdmFsdWVzIHdoaWNoIGNhbiBwcm9kdWNlIHVuZXhwZWN0ZWQgcmVzdWx0cy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy4KICAgICAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZVJpZ2h0CiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ucmFuZ2UoNCk7CiAgICAgICAgICogLy8gPT4gWzAsIDEsIDIsIDNdCiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmdlKC00KTsKICAgICAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM10KICAgICAgICAgKgogICAgICAgICAqIF8ucmFuZ2UoMSwgNSk7CiAgICAgICAgICogLy8gPT4gWzEsIDIsIDMsIDRdCiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmdlKDAsIDIwLCA1KTsKICAgICAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XQogICAgICAgICAqCiAgICAgICAgICogXy5yYW5nZSgwLCAtNCwgLTEpOwogICAgICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXQogICAgICAgICAqCiAgICAgICAgICogXy5yYW5nZSgxLCA0LCAwKTsKICAgICAgICAgKiAvLyA9PiBbMSwgMSwgMV0KICAgICAgICAgKgogICAgICAgICAqIF8ucmFuZ2UoMCk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKi8KICAgICAgICB2YXIgcmFuZ2UgPSBjcmVhdGVSYW5nZSgpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnJhbmdlYCBleGNlcHQgdGhhdCBpdCBwb3B1bGF0ZXMgdmFsdWVzIGluCiAgICAgICAgICogZGVzY2VuZGluZyBvcmRlci4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGFydD0wXSBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LgogICAgICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcmFuZ2Ugb2YgbnVtYmVycy4KICAgICAgICAgKiBAc2VlIF8uaW5SYW5nZSwgXy5yYW5nZQogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmdlUmlnaHQoNCk7CiAgICAgICAgICogLy8gPT4gWzMsIDIsIDEsIDBdCiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmdlUmlnaHQoLTQpOwogICAgICAgICAqIC8vID0+IFstMywgLTIsIC0xLCAwXQogICAgICAgICAqCiAgICAgICAgICogXy5yYW5nZVJpZ2h0KDEsIDUpOwogICAgICAgICAqIC8vID0+IFs0LCAzLCAyLCAxXQogICAgICAgICAqCiAgICAgICAgICogXy5yYW5nZVJpZ2h0KDAsIDIwLCA1KTsKICAgICAgICAgKiAvLyA9PiBbMTUsIDEwLCA1LCAwXQogICAgICAgICAqCiAgICAgICAgICogXy5yYW5nZVJpZ2h0KDAsIC00LCAtMSk7CiAgICAgICAgICogLy8gPT4gWy0zLCAtMiwgLTEsIDBdCiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmdlUmlnaHQoMSwgNCwgMCk7CiAgICAgICAgICogLy8gPT4gWzEsIDEsIDFdCiAgICAgICAgICoKICAgICAgICAgKiBfLnJhbmdlUmlnaHQoMCk7CiAgICAgICAgICogLy8gPT4gW10KICAgICAgICAgKi8KICAgICAgICB2YXIgcmFuZ2VSaWdodCA9IGNyZWF0ZVJhbmdlKHRydWUpOwoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGVtcHR5IGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMTMuMAogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgYXJyYXkuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBhcnJheXMgPSBfLnRpbWVzKDIsIF8uc3R1YkFycmF5KTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5cyk7CiAgICAgICAgICogLy8gPT4gW1tdLCBbXV0KICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGFycmF5c1swXSA9PT0gYXJyYXlzWzFdKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0dWJBcnJheSgpIHsKICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjEzLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpOwogICAgICAgICAqIC8vID0+IFtmYWxzZSwgZmFsc2VdCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4xMy4wCiAgICAgICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgZW1wdHkgb2JqZWN0LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IF8udGltZXMoMiwgXy5zdHViT2JqZWN0KTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHMpOwogICAgICAgICAqIC8vID0+IFt7fSwge31dCiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzWzBdID09PSBvYmplY3RzWzFdKTsKICAgICAgICAgKiAvLyA9PiBmYWxzZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0dWJPYmplY3QoKSB7CiAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIGVtcHR5IHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjEzLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGVtcHR5IHN0cmluZy4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy50aW1lcygyLCBfLnN0dWJTdHJpbmcpOwogICAgICAgICAqIC8vID0+IFsnJywgJyddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc3R1YlN0cmluZygpIHsKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHRydWVgLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMTMuMAogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRpbWVzKDIsIF8uc3R1YlRydWUpOwogICAgICAgICAqIC8vID0+IFt0cnVlLCB0cnVlXQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0dWJUcnVlKCkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBJbnZva2VzIHRoZSBpdGVyYXRlZSBgbmAgdGltZXMsIHJldHVybmluZyBhbiBhcnJheSBvZiB0aGUgcmVzdWx0cyBvZgogICAgICAgICAqIGVhY2ggaW52b2NhdGlvbi4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ7IChpbmRleCkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBuIFRoZSBudW1iZXIgb2YgdGltZXMgdG8gaW52b2tlIGBpdGVyYXRlZWAuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiByZXN1bHRzLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRpbWVzKDMsIFN0cmluZyk7CiAgICAgICAgICogLy8gPT4gWycwJywgJzEnLCAnMiddCiAgICAgICAgICoKICAgICAgICAgKiAgXy50aW1lcyg0LCBfLmNvbnN0YW50KDApKTsKICAgICAgICAgKiAvLyA9PiBbMCwgMCwgMCwgMF0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSkgewogICAgICAgICAgbiA9IHRvSW50ZWdlcihuKTsKICAgICAgICAgIGlmIChuIDwgMSB8fCBuID4gTUFYX1NBRkVfSU5URUdFUikgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICB9CiAgICAgICAgICB2YXIgaW5kZXggPSBNQVhfQVJSQVlfTEVOR1RILAogICAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1pbihuLCBNQVhfQVJSQVlfTEVOR1RIKTsKCiAgICAgICAgICBpdGVyYXRlZSA9IGdldEl0ZXJhdGVlKGl0ZXJhdGVlKTsKICAgICAgICAgIG4gLT0gTUFYX0FSUkFZX0xFTkdUSDsKCiAgICAgICAgICB2YXIgcmVzdWx0ID0gYmFzZVRpbWVzKGxlbmd0aCwgaXRlcmF0ZWUpOwogICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7CiAgICAgICAgICAgIGl0ZXJhdGVlKGluZGV4KTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgcHJvcGVydHkgcGF0aCBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KICAgICAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBwcm9wZXJ0eSBwYXRoIGFycmF5LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLnRvUGF0aCgnYS5iLmMnKTsKICAgICAgICAgKiAvLyA9PiBbJ2EnLCAnYicsICdjJ10KICAgICAgICAgKgogICAgICAgICAqIF8udG9QYXRoKCdhWzBdLmIuYycpOwogICAgICAgICAqIC8vID0+IFsnYScsICcwJywgJ2InLCAnYyddCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gdG9QYXRoKHZhbHVlKSB7CiAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIGFycmF5TWFwKHZhbHVlLCB0b0tleSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gaXNTeW1ib2wodmFsdWUpID8gW3ZhbHVlXSA6IGNvcHlBcnJheShzdHJpbmdUb1BhdGgodG9TdHJpbmcodmFsdWUpKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQHNpbmNlIDAuMS4wCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAY2F0ZWdvcnkgVXRpbAogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLgogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIHVuaXF1ZSBJRC4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy51bmlxdWVJZCgnY29udGFjdF8nKTsKICAgICAgICAgKiAvLyA9PiAnY29udGFjdF8xMDQnCiAgICAgICAgICoKICAgICAgICAgKiBfLnVuaXF1ZUlkKCk7CiAgICAgICAgICogLy8gPT4gJzEwNScKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHsKICAgICAgICAgIHZhciBpZCA9ICsraWRDb3VudGVyOwogICAgICAgICAgcmV0dXJuIHRvU3RyaW5nKHByZWZpeCkgKyBpZDsKICAgICAgICB9CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyB0d28gbnVtYmVycy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjQuMAogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGF1Z2VuZCBUaGUgZmlyc3QgbnVtYmVyIGluIGFuIGFkZGl0aW9uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhZGRlbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYW4gYWRkaXRpb24uCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgdG90YWwuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uYWRkKDYsIDQpOwogICAgICAgICAqIC8vID0+IDEwCiAgICAgICAgICovCiAgICAgICAgdmFyIGFkZCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24oYXVnZW5kLCBhZGRlbmQpIHsKICAgICAgICAgIHJldHVybiBhdWdlbmQgKyBhZGRlbmQ7CiAgICAgICAgfSwgMCk7CgogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIGBudW1iZXJgIHJvdW5kZWQgdXAgdG8gYHByZWNpc2lvbmAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4xMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgdXAuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb249MF0gVGhlIHByZWNpc2lvbiB0byByb3VuZCB1cCB0by4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSByb3VuZGVkIHVwIG51bWJlci4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5jZWlsKDQuMDA2KTsKICAgICAgICAgKiAvLyA9PiA1CiAgICAgICAgICoKICAgICAgICAgKiBfLmNlaWwoNi4wMDQsIDIpOwogICAgICAgICAqIC8vID0+IDYuMDEKICAgICAgICAgKgogICAgICAgICAqIF8uY2VpbCg2MDQwLCAtMik7CiAgICAgICAgICogLy8gPT4gNjEwMAogICAgICAgICAqLwogICAgICAgIHZhciBjZWlsID0gY3JlYXRlUm91bmQoJ2NlaWwnKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogRGl2aWRlIHR3byBudW1iZXJzLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuNy4wCiAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gZGl2aWRlbmQgVGhlIGZpcnN0IG51bWJlciBpbiBhIGRpdmlzaW9uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkaXZpc29yIFRoZSBzZWNvbmQgbnVtYmVyIGluIGEgZGl2aXNpb24uCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcXVvdGllbnQuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uZGl2aWRlKDYsIDQpOwogICAgICAgICAqIC8vID0+IDEuNQogICAgICAgICAqLwogICAgICAgIHZhciBkaXZpZGUgPSBjcmVhdGVNYXRoT3BlcmF0aW9uKGZ1bmN0aW9uKGRpdmlkZW5kLCBkaXZpc29yKSB7CiAgICAgICAgICByZXR1cm4gZGl2aWRlbmQgLyBkaXZpc29yOwogICAgICAgIH0sIDEpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIGRvd24gdG8gYHByZWNpc2lvbmAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgMy4xMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbnVtYmVyIFRoZSBudW1iZXIgdG8gcm91bmQgZG93bi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbj0wXSBUaGUgcHJlY2lzaW9uIHRvIHJvdW5kIGRvd24gdG8uCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBkb3duIG51bWJlci4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5mbG9vcig0LjAwNik7CiAgICAgICAgICogLy8gPT4gNAogICAgICAgICAqCiAgICAgICAgICogXy5mbG9vcigwLjA0NiwgMik7CiAgICAgICAgICogLy8gPT4gMC4wNAogICAgICAgICAqCiAgICAgICAgICogXy5mbG9vcig0MDYwLCAtMik7CiAgICAgICAgICogLy8gPT4gNDAwMAogICAgICAgICAqLwogICAgICAgIHZhciBmbG9vciA9IGNyZWF0ZVJvdW5kKCdmbG9vcicpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSwKICAgICAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5tYXgoWzQsIDIsIDgsIDZdKTsKICAgICAgICAgKiAvLyA9PiA4CiAgICAgICAgICoKICAgICAgICAgKiBfLm1heChbXSk7CiAgICAgICAgICogLy8gPT4gdW5kZWZpbmVkCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbWF4KGFycmF5KSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlR3QpCiAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1heGAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzCiAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaAogICAgICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF4aW11bSB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07CiAgICAgICAgICoKICAgICAgICAgKiBfLm1heEJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7CiAgICAgICAgICogLy8gPT4geyAnbic6IDIgfQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5tYXhCeShvYmplY3RzLCAnbicpOwogICAgICAgICAqIC8vID0+IHsgJ24nOiAyIH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtYXhCeShhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlR3QpCiAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgbWVhbiBvZiB0aGUgdmFsdWVzIGluIGBhcnJheWAuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aAogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgbWVhbi4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5tZWFuKFs0LCAyLCA4LCA2XSk7CiAgICAgICAgICogLy8gPT4gNQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1lYW4oYXJyYXkpIHsKICAgICAgICAgIHJldHVybiBiYXNlTWVhbihhcnJheSwgaWRlbnRpdHkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgaXMgbGlrZSBgXy5tZWFuYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIGBpdGVyYXRlZWAgd2hpY2ggaXMKICAgICAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgdmFsdWUgdG8gYmUgYXZlcmFnZWQuCiAgICAgICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCBvbmUgYXJndW1lbnQ6ICh2YWx1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC43LjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aAogICAgICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBpdGVyYXRlZSBpbnZva2VkIHBlciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIG1lYW4uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIHZhciBvYmplY3RzID0gW3sgJ24nOiA0IH0sIHsgJ24nOiAyIH0sIHsgJ24nOiA4IH0sIHsgJ24nOiA2IH1dOwogICAgICAgICAqCiAgICAgICAgICogXy5tZWFuQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTsKICAgICAgICAgKiAvLyA9PiA1CiAgICAgICAgICoKICAgICAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAgICAgKiBfLm1lYW5CeShvYmplY3RzLCAnbicpOwogICAgICAgICAqIC8vID0+IDUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtZWFuQnkoYXJyYXksIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gYmFzZU1lYW4oYXJyYXksIGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAyKSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBgYXJyYXlgLiBJZiBgYXJyYXlgIGlzIGVtcHR5IG9yIGZhbHNleSwKICAgICAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAc2luY2UgMC4xLjAKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogXy5taW4oWzQsIDIsIDgsIDZdKTsKICAgICAgICAgKiAvLyA9PiAyCiAgICAgICAgICoKICAgICAgICAgKiBfLm1pbihbXSk7CiAgICAgICAgICogLy8gPT4gdW5kZWZpbmVkCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gbWluKGFycmF5KSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICAgICAgPyBiYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5LCBiYXNlTHQpCiAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzCiAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIGNyaXRlcmlvbiBieSB3aGljaAogICAgICAgICAqIHRoZSB2YWx1ZSBpcyByYW5rZWQuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDQuMC4wCiAgICAgICAgICogQGNhdGVnb3J5IE1hdGgKICAgICAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgogICAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWluaW11bSB2YWx1ZS4KICAgICAgICAgKiBAZXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogdmFyIG9iamVjdHMgPSBbeyAnbic6IDEgfSwgeyAnbic6IDIgfV07CiAgICAgICAgICoKICAgICAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7CiAgICAgICAgICogLy8gPT4geyAnbic6IDEgfQogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5taW5CeShvYmplY3RzLCAnbicpOwogICAgICAgICAqIC8vID0+IHsgJ24nOiAxIH0KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBtaW5CeShhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VFeHRyZW11bShhcnJheSwgZ2V0SXRlcmF0ZWUoaXRlcmF0ZWUsIDIpLCBiYXNlTHQpCiAgICAgICAgICAgIDogdW5kZWZpbmVkJDE7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBNdWx0aXBseSB0d28gbnVtYmVycy4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjcuMAogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG11bHRpcGxpZXIgVGhlIGZpcnN0IG51bWJlciBpbiBhIG11bHRpcGxpY2F0aW9uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtdWx0aXBsaWNhbmQgVGhlIHNlY29uZCBudW1iZXIgaW4gYSBtdWx0aXBsaWNhdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBwcm9kdWN0LgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBfLm11bHRpcGx5KDYsIDQpOwogICAgICAgICAqIC8vID0+IDI0CiAgICAgICAgICovCiAgICAgICAgdmFyIG11bHRpcGx5ID0gY3JlYXRlTWF0aE9wZXJhdGlvbihmdW5jdGlvbihtdWx0aXBsaWVyLCBtdWx0aXBsaWNhbmQpIHsKICAgICAgICAgIHJldHVybiBtdWx0aXBsaWVyICogbXVsdGlwbGljYW5kOwogICAgICAgIH0sIDEpOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyBgbnVtYmVyYCByb3VuZGVkIHRvIGBwcmVjaXNpb25gLgogICAgICAgICAqCiAgICAgICAgICogQHN0YXRpYwogICAgICAgICAqIEBtZW1iZXJPZiBfCiAgICAgICAgICogQHNpbmNlIDMuMTAuMAogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IG51bWJlciBUaGUgbnVtYmVyIHRvIHJvdW5kLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbcHJlY2lzaW9uPTBdIFRoZSBwcmVjaXNpb24gdG8gcm91bmQgdG8uCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgcm91bmRlZCBudW1iZXIuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8ucm91bmQoNC4wMDYpOwogICAgICAgICAqIC8vID0+IDQKICAgICAgICAgKgogICAgICAgICAqIF8ucm91bmQoNC4wMDYsIDIpOwogICAgICAgICAqIC8vID0+IDQuMDEKICAgICAgICAgKgogICAgICAgICAqIF8ucm91bmQoNDA2MCwgLTIpOwogICAgICAgICAqIC8vID0+IDQxMDAKICAgICAgICAgKi8KICAgICAgICB2YXIgcm91bmQgPSBjcmVhdGVSb3VuZCgncm91bmQnKTsKCiAgICAgICAgLyoqCiAgICAgICAgICogU3VidHJhY3QgdHdvIG51bWJlcnMuCiAgICAgICAgICoKICAgICAgICAgKiBAc3RhdGljCiAgICAgICAgICogQG1lbWJlck9mIF8KICAgICAgICAgKiBAc2luY2UgNC4wLjAKICAgICAgICAgKiBAY2F0ZWdvcnkgTWF0aAogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW51ZW5kIFRoZSBmaXJzdCBudW1iZXIgaW4gYSBzdWJ0cmFjdGlvbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gc3VidHJhaGVuZCBUaGUgc2Vjb25kIG51bWJlciBpbiBhIHN1YnRyYWN0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGRpZmZlcmVuY2UuCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uc3VidHJhY3QoNiwgNCk7CiAgICAgICAgICogLy8gPT4gMgogICAgICAgICAqLwogICAgICAgIHZhciBzdWJ0cmFjdCA9IGNyZWF0ZU1hdGhPcGVyYXRpb24oZnVuY3Rpb24obWludWVuZCwgc3VidHJhaGVuZCkgewogICAgICAgICAgcmV0dXJuIG1pbnVlbmQgLSBzdWJ0cmFoZW5kOwogICAgICAgIH0sIDApOwoKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgc3VtIG9mIHRoZSB2YWx1ZXMgaW4gYGFycmF5YC4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSAzLjQuMAogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdW0uCiAgICAgICAgICogQGV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIF8uc3VtKFs0LCAyLCA4LCA2XSk7CiAgICAgICAgICogLy8gPT4gMjAKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzdW0oYXJyYXkpIHsKICAgICAgICAgIHJldHVybiAoYXJyYXkgJiYgYXJyYXkubGVuZ3RoKQogICAgICAgICAgICA/IGJhc2VTdW0oYXJyYXksIGlkZW50aXR5KQogICAgICAgICAgICA6IDA7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLnN1bWAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzCiAgICAgICAgICogaW52b2tlZCBmb3IgZWFjaCBlbGVtZW50IGluIGBhcnJheWAgdG8gZ2VuZXJhdGUgdGhlIHZhbHVlIHRvIGJlIHN1bW1lZC4KICAgICAgICAgKiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEBzaW5jZSA0LjAuMAogICAgICAgICAqIEBjYXRlZ29yeSBNYXRoCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgc3VtLgogICAgICAgICAqIEBleGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogNCB9LCB7ICduJzogMiB9LCB7ICduJzogOCB9LCB7ICduJzogNiB9XTsKICAgICAgICAgKgogICAgICAgICAqIF8uc3VtQnkob2JqZWN0cywgZnVuY3Rpb24obykgeyByZXR1cm4gby5uOyB9KTsKICAgICAgICAgKiAvLyA9PiAyMAogICAgICAgICAqCiAgICAgICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgICAgICogXy5zdW1CeShvYmplY3RzLCAnbicpOwogICAgICAgICAqIC8vID0+IDIwCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gc3VtQnkoYXJyYXksIGl0ZXJhdGVlKSB7CiAgICAgICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICAgICAgPyBiYXNlU3VtKGFycmF5LCBnZXRJdGVyYXRlZShpdGVyYXRlZSwgMikpCiAgICAgICAgICAgIDogMDsKICAgICAgICB9CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gd3JhcHBlZCB2YWx1ZXMgaW4gY2hhaW4gc2VxdWVuY2VzLgogICAgICAgIGxvZGFzaC5hZnRlciA9IGFmdGVyOwogICAgICAgIGxvZGFzaC5hcnkgPSBhcnk7CiAgICAgICAgbG9kYXNoLmFzc2lnbiA9IGFzc2lnbjsKICAgICAgICBsb2Rhc2guYXNzaWduSW4gPSBhc3NpZ25JbjsKICAgICAgICBsb2Rhc2guYXNzaWduSW5XaXRoID0gYXNzaWduSW5XaXRoOwogICAgICAgIGxvZGFzaC5hc3NpZ25XaXRoID0gYXNzaWduV2l0aDsKICAgICAgICBsb2Rhc2guYXQgPSBhdDsKICAgICAgICBsb2Rhc2guYmVmb3JlID0gYmVmb3JlOwogICAgICAgIGxvZGFzaC5iaW5kID0gYmluZDsKICAgICAgICBsb2Rhc2guYmluZEFsbCA9IGJpbmRBbGw7CiAgICAgICAgbG9kYXNoLmJpbmRLZXkgPSBiaW5kS2V5OwogICAgICAgIGxvZGFzaC5jYXN0QXJyYXkgPSBjYXN0QXJyYXk7CiAgICAgICAgbG9kYXNoLmNoYWluID0gY2hhaW47CiAgICAgICAgbG9kYXNoLmNodW5rID0gY2h1bms7CiAgICAgICAgbG9kYXNoLmNvbXBhY3QgPSBjb21wYWN0OwogICAgICAgIGxvZGFzaC5jb25jYXQgPSBjb25jYXQ7CiAgICAgICAgbG9kYXNoLmNvbmQgPSBjb25kOwogICAgICAgIGxvZGFzaC5jb25mb3JtcyA9IGNvbmZvcm1zOwogICAgICAgIGxvZGFzaC5jb25zdGFudCA9IGNvbnN0YW50OwogICAgICAgIGxvZGFzaC5jb3VudEJ5ID0gY291bnRCeTsKICAgICAgICBsb2Rhc2guY3JlYXRlID0gY3JlYXRlOwogICAgICAgIGxvZGFzaC5jdXJyeSA9IGN1cnJ5OwogICAgICAgIGxvZGFzaC5jdXJyeVJpZ2h0ID0gY3VycnlSaWdodDsKICAgICAgICBsb2Rhc2guZGVib3VuY2UgPSBkZWJvdW5jZTsKICAgICAgICBsb2Rhc2guZGVmYXVsdHMgPSBkZWZhdWx0czsKICAgICAgICBsb2Rhc2guZGVmYXVsdHNEZWVwID0gZGVmYXVsdHNEZWVwOwogICAgICAgIGxvZGFzaC5kZWZlciA9IGRlZmVyOwogICAgICAgIGxvZGFzaC5kZWxheSA9IGRlbGF5OwogICAgICAgIGxvZGFzaC5kaWZmZXJlbmNlID0gZGlmZmVyZW5jZTsKICAgICAgICBsb2Rhc2guZGlmZmVyZW5jZUJ5ID0gZGlmZmVyZW5jZUJ5OwogICAgICAgIGxvZGFzaC5kaWZmZXJlbmNlV2l0aCA9IGRpZmZlcmVuY2VXaXRoOwogICAgICAgIGxvZGFzaC5kcm9wID0gZHJvcDsKICAgICAgICBsb2Rhc2guZHJvcFJpZ2h0ID0gZHJvcFJpZ2h0OwogICAgICAgIGxvZGFzaC5kcm9wUmlnaHRXaGlsZSA9IGRyb3BSaWdodFdoaWxlOwogICAgICAgIGxvZGFzaC5kcm9wV2hpbGUgPSBkcm9wV2hpbGU7CiAgICAgICAgbG9kYXNoLmZpbGwgPSBmaWxsOwogICAgICAgIGxvZGFzaC5maWx0ZXIgPSBmaWx0ZXI7CiAgICAgICAgbG9kYXNoLmZsYXRNYXAgPSBmbGF0TWFwOwogICAgICAgIGxvZGFzaC5mbGF0TWFwRGVlcCA9IGZsYXRNYXBEZWVwOwogICAgICAgIGxvZGFzaC5mbGF0TWFwRGVwdGggPSBmbGF0TWFwRGVwdGg7CiAgICAgICAgbG9kYXNoLmZsYXR0ZW4gPSBmbGF0dGVuOwogICAgICAgIGxvZGFzaC5mbGF0dGVuRGVlcCA9IGZsYXR0ZW5EZWVwOwogICAgICAgIGxvZGFzaC5mbGF0dGVuRGVwdGggPSBmbGF0dGVuRGVwdGg7CiAgICAgICAgbG9kYXNoLmZsaXAgPSBmbGlwOwogICAgICAgIGxvZGFzaC5mbG93ID0gZmxvdzsKICAgICAgICBsb2Rhc2guZmxvd1JpZ2h0ID0gZmxvd1JpZ2h0OwogICAgICAgIGxvZGFzaC5mcm9tUGFpcnMgPSBmcm9tUGFpcnM7CiAgICAgICAgbG9kYXNoLmZ1bmN0aW9ucyA9IGZ1bmN0aW9uczsKICAgICAgICBsb2Rhc2guZnVuY3Rpb25zSW4gPSBmdW5jdGlvbnNJbjsKICAgICAgICBsb2Rhc2guZ3JvdXBCeSA9IGdyb3VwQnk7CiAgICAgICAgbG9kYXNoLmluaXRpYWwgPSBpbml0aWFsOwogICAgICAgIGxvZGFzaC5pbnRlcnNlY3Rpb24gPSBpbnRlcnNlY3Rpb247CiAgICAgICAgbG9kYXNoLmludGVyc2VjdGlvbkJ5ID0gaW50ZXJzZWN0aW9uQnk7CiAgICAgICAgbG9kYXNoLmludGVyc2VjdGlvbldpdGggPSBpbnRlcnNlY3Rpb25XaXRoOwogICAgICAgIGxvZGFzaC5pbnZlcnQgPSBpbnZlcnQ7CiAgICAgICAgbG9kYXNoLmludmVydEJ5ID0gaW52ZXJ0Qnk7CiAgICAgICAgbG9kYXNoLmludm9rZU1hcCA9IGludm9rZU1hcDsKICAgICAgICBsb2Rhc2guaXRlcmF0ZWUgPSBpdGVyYXRlZTsKICAgICAgICBsb2Rhc2gua2V5QnkgPSBrZXlCeTsKICAgICAgICBsb2Rhc2gua2V5cyA9IGtleXM7CiAgICAgICAgbG9kYXNoLmtleXNJbiA9IGtleXNJbjsKICAgICAgICBsb2Rhc2gubWFwID0gbWFwOwogICAgICAgIGxvZGFzaC5tYXBLZXlzID0gbWFwS2V5czsKICAgICAgICBsb2Rhc2gubWFwVmFsdWVzID0gbWFwVmFsdWVzOwogICAgICAgIGxvZGFzaC5tYXRjaGVzID0gbWF0Y2hlczsKICAgICAgICBsb2Rhc2gubWF0Y2hlc1Byb3BlcnR5ID0gbWF0Y2hlc1Byb3BlcnR5OwogICAgICAgIGxvZGFzaC5tZW1vaXplID0gbWVtb2l6ZTsKICAgICAgICBsb2Rhc2gubWVyZ2UgPSBtZXJnZTsKICAgICAgICBsb2Rhc2gubWVyZ2VXaXRoID0gbWVyZ2VXaXRoOwogICAgICAgIGxvZGFzaC5tZXRob2QgPSBtZXRob2Q7CiAgICAgICAgbG9kYXNoLm1ldGhvZE9mID0gbWV0aG9kT2Y7CiAgICAgICAgbG9kYXNoLm1peGluID0gbWl4aW47CiAgICAgICAgbG9kYXNoLm5lZ2F0ZSA9IG5lZ2F0ZTsKICAgICAgICBsb2Rhc2gubnRoQXJnID0gbnRoQXJnOwogICAgICAgIGxvZGFzaC5vbWl0ID0gb21pdDsKICAgICAgICBsb2Rhc2gub21pdEJ5ID0gb21pdEJ5OwogICAgICAgIGxvZGFzaC5vbmNlID0gb25jZTsKICAgICAgICBsb2Rhc2gub3JkZXJCeSA9IG9yZGVyQnk7CiAgICAgICAgbG9kYXNoLm92ZXIgPSBvdmVyOwogICAgICAgIGxvZGFzaC5vdmVyQXJncyA9IG92ZXJBcmdzOwogICAgICAgIGxvZGFzaC5vdmVyRXZlcnkgPSBvdmVyRXZlcnk7CiAgICAgICAgbG9kYXNoLm92ZXJTb21lID0gb3ZlclNvbWU7CiAgICAgICAgbG9kYXNoLnBhcnRpYWwgPSBwYXJ0aWFsOwogICAgICAgIGxvZGFzaC5wYXJ0aWFsUmlnaHQgPSBwYXJ0aWFsUmlnaHQ7CiAgICAgICAgbG9kYXNoLnBhcnRpdGlvbiA9IHBhcnRpdGlvbjsKICAgICAgICBsb2Rhc2gucGljayA9IHBpY2s7CiAgICAgICAgbG9kYXNoLnBpY2tCeSA9IHBpY2tCeTsKICAgICAgICBsb2Rhc2gucHJvcGVydHkgPSBwcm9wZXJ0eTsKICAgICAgICBsb2Rhc2gucHJvcGVydHlPZiA9IHByb3BlcnR5T2Y7CiAgICAgICAgbG9kYXNoLnB1bGwgPSBwdWxsOwogICAgICAgIGxvZGFzaC5wdWxsQWxsID0gcHVsbEFsbDsKICAgICAgICBsb2Rhc2gucHVsbEFsbEJ5ID0gcHVsbEFsbEJ5OwogICAgICAgIGxvZGFzaC5wdWxsQWxsV2l0aCA9IHB1bGxBbGxXaXRoOwogICAgICAgIGxvZGFzaC5wdWxsQXQgPSBwdWxsQXQ7CiAgICAgICAgbG9kYXNoLnJhbmdlID0gcmFuZ2U7CiAgICAgICAgbG9kYXNoLnJhbmdlUmlnaHQgPSByYW5nZVJpZ2h0OwogICAgICAgIGxvZGFzaC5yZWFyZyA9IHJlYXJnOwogICAgICAgIGxvZGFzaC5yZWplY3QgPSByZWplY3Q7CiAgICAgICAgbG9kYXNoLnJlbW92ZSA9IHJlbW92ZTsKICAgICAgICBsb2Rhc2gucmVzdCA9IHJlc3Q7CiAgICAgICAgbG9kYXNoLnJldmVyc2UgPSByZXZlcnNlOwogICAgICAgIGxvZGFzaC5zYW1wbGVTaXplID0gc2FtcGxlU2l6ZTsKICAgICAgICBsb2Rhc2guc2V0ID0gc2V0OwogICAgICAgIGxvZGFzaC5zZXRXaXRoID0gc2V0V2l0aDsKICAgICAgICBsb2Rhc2guc2h1ZmZsZSA9IHNodWZmbGU7CiAgICAgICAgbG9kYXNoLnNsaWNlID0gc2xpY2U7CiAgICAgICAgbG9kYXNoLnNvcnRCeSA9IHNvcnRCeTsKICAgICAgICBsb2Rhc2guc29ydGVkVW5pcSA9IHNvcnRlZFVuaXE7CiAgICAgICAgbG9kYXNoLnNvcnRlZFVuaXFCeSA9IHNvcnRlZFVuaXFCeTsKICAgICAgICBsb2Rhc2guc3BsaXQgPSBzcGxpdDsKICAgICAgICBsb2Rhc2guc3ByZWFkID0gc3ByZWFkOwogICAgICAgIGxvZGFzaC50YWlsID0gdGFpbDsKICAgICAgICBsb2Rhc2gudGFrZSA9IHRha2U7CiAgICAgICAgbG9kYXNoLnRha2VSaWdodCA9IHRha2VSaWdodDsKICAgICAgICBsb2Rhc2gudGFrZVJpZ2h0V2hpbGUgPSB0YWtlUmlnaHRXaGlsZTsKICAgICAgICBsb2Rhc2gudGFrZVdoaWxlID0gdGFrZVdoaWxlOwogICAgICAgIGxvZGFzaC50YXAgPSB0YXA7CiAgICAgICAgbG9kYXNoLnRocm90dGxlID0gdGhyb3R0bGU7CiAgICAgICAgbG9kYXNoLnRocnUgPSB0aHJ1OwogICAgICAgIGxvZGFzaC50b0FycmF5ID0gdG9BcnJheTsKICAgICAgICBsb2Rhc2gudG9QYWlycyA9IHRvUGFpcnM7CiAgICAgICAgbG9kYXNoLnRvUGFpcnNJbiA9IHRvUGFpcnNJbjsKICAgICAgICBsb2Rhc2gudG9QYXRoID0gdG9QYXRoOwogICAgICAgIGxvZGFzaC50b1BsYWluT2JqZWN0ID0gdG9QbGFpbk9iamVjdDsKICAgICAgICBsb2Rhc2gudHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgICAgIGxvZGFzaC51bmFyeSA9IHVuYXJ5OwogICAgICAgIGxvZGFzaC51bmlvbiA9IHVuaW9uOwogICAgICAgIGxvZGFzaC51bmlvbkJ5ID0gdW5pb25CeTsKICAgICAgICBsb2Rhc2gudW5pb25XaXRoID0gdW5pb25XaXRoOwogICAgICAgIGxvZGFzaC51bmlxID0gdW5pcTsKICAgICAgICBsb2Rhc2gudW5pcUJ5ID0gdW5pcUJ5OwogICAgICAgIGxvZGFzaC51bmlxV2l0aCA9IHVuaXFXaXRoOwogICAgICAgIGxvZGFzaC51bnNldCA9IHVuc2V0OwogICAgICAgIGxvZGFzaC51bnppcCA9IHVuemlwOwogICAgICAgIGxvZGFzaC51bnppcFdpdGggPSB1bnppcFdpdGg7CiAgICAgICAgbG9kYXNoLnVwZGF0ZSA9IHVwZGF0ZTsKICAgICAgICBsb2Rhc2gudXBkYXRlV2l0aCA9IHVwZGF0ZVdpdGg7CiAgICAgICAgbG9kYXNoLnZhbHVlcyA9IHZhbHVlczsKICAgICAgICBsb2Rhc2gudmFsdWVzSW4gPSB2YWx1ZXNJbjsKICAgICAgICBsb2Rhc2gud2l0aG91dCA9IHdpdGhvdXQ7CiAgICAgICAgbG9kYXNoLndvcmRzID0gd29yZHM7CiAgICAgICAgbG9kYXNoLndyYXAgPSB3cmFwOwogICAgICAgIGxvZGFzaC54b3IgPSB4b3I7CiAgICAgICAgbG9kYXNoLnhvckJ5ID0geG9yQnk7CiAgICAgICAgbG9kYXNoLnhvcldpdGggPSB4b3JXaXRoOwogICAgICAgIGxvZGFzaC56aXAgPSB6aXA7CiAgICAgICAgbG9kYXNoLnppcE9iamVjdCA9IHppcE9iamVjdDsKICAgICAgICBsb2Rhc2guemlwT2JqZWN0RGVlcCA9IHppcE9iamVjdERlZXA7CiAgICAgICAgbG9kYXNoLnppcFdpdGggPSB6aXBXaXRoOwoKICAgICAgICAvLyBBZGQgYWxpYXNlcy4KICAgICAgICBsb2Rhc2guZW50cmllcyA9IHRvUGFpcnM7CiAgICAgICAgbG9kYXNoLmVudHJpZXNJbiA9IHRvUGFpcnNJbjsKICAgICAgICBsb2Rhc2guZXh0ZW5kID0gYXNzaWduSW47CiAgICAgICAgbG9kYXNoLmV4dGVuZFdpdGggPSBhc3NpZ25JbldpdGg7CgogICAgICAgIC8vIEFkZCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC4KICAgICAgICBtaXhpbihsb2Rhc2gsIGxvZGFzaCk7CgogICAgICAgIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KCiAgICAgICAgLy8gQWRkIG1ldGhvZHMgdGhhdCByZXR1cm4gdW53cmFwcGVkIHZhbHVlcyBpbiBjaGFpbiBzZXF1ZW5jZXMuCiAgICAgICAgbG9kYXNoLmFkZCA9IGFkZDsKICAgICAgICBsb2Rhc2guYXR0ZW1wdCA9IGF0dGVtcHQ7CiAgICAgICAgbG9kYXNoLmNhbWVsQ2FzZSA9IGNhbWVsQ2FzZTsKICAgICAgICBsb2Rhc2guY2FwaXRhbGl6ZSA9IGNhcGl0YWxpemU7CiAgICAgICAgbG9kYXNoLmNlaWwgPSBjZWlsOwogICAgICAgIGxvZGFzaC5jbGFtcCA9IGNsYW1wOwogICAgICAgIGxvZGFzaC5jbG9uZSA9IGNsb25lOwogICAgICAgIGxvZGFzaC5jbG9uZURlZXAgPSBjbG9uZURlZXA7CiAgICAgICAgbG9kYXNoLmNsb25lRGVlcFdpdGggPSBjbG9uZURlZXBXaXRoOwogICAgICAgIGxvZGFzaC5jbG9uZVdpdGggPSBjbG9uZVdpdGg7CiAgICAgICAgbG9kYXNoLmNvbmZvcm1zVG8gPSBjb25mb3Jtc1RvOwogICAgICAgIGxvZGFzaC5kZWJ1cnIgPSBkZWJ1cnI7CiAgICAgICAgbG9kYXNoLmRlZmF1bHRUbyA9IGRlZmF1bHRUbzsKICAgICAgICBsb2Rhc2guZGl2aWRlID0gZGl2aWRlOwogICAgICAgIGxvZGFzaC5lbmRzV2l0aCA9IGVuZHNXaXRoOwogICAgICAgIGxvZGFzaC5lcSA9IGVxOwogICAgICAgIGxvZGFzaC5lc2NhcGUgPSBlc2NhcGU7CiAgICAgICAgbG9kYXNoLmVzY2FwZVJlZ0V4cCA9IGVzY2FwZVJlZ0V4cDsKICAgICAgICBsb2Rhc2guZXZlcnkgPSBldmVyeTsKICAgICAgICBsb2Rhc2guZmluZCA9IGZpbmQ7CiAgICAgICAgbG9kYXNoLmZpbmRJbmRleCA9IGZpbmRJbmRleDsKICAgICAgICBsb2Rhc2guZmluZEtleSA9IGZpbmRLZXk7CiAgICAgICAgbG9kYXNoLmZpbmRMYXN0ID0gZmluZExhc3Q7CiAgICAgICAgbG9kYXNoLmZpbmRMYXN0SW5kZXggPSBmaW5kTGFzdEluZGV4OwogICAgICAgIGxvZGFzaC5maW5kTGFzdEtleSA9IGZpbmRMYXN0S2V5OwogICAgICAgIGxvZGFzaC5mbG9vciA9IGZsb29yOwogICAgICAgIGxvZGFzaC5mb3JFYWNoID0gZm9yRWFjaDsKICAgICAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0ID0gZm9yRWFjaFJpZ2h0OwogICAgICAgIGxvZGFzaC5mb3JJbiA9IGZvckluOwogICAgICAgIGxvZGFzaC5mb3JJblJpZ2h0ID0gZm9ySW5SaWdodDsKICAgICAgICBsb2Rhc2guZm9yT3duID0gZm9yT3duOwogICAgICAgIGxvZGFzaC5mb3JPd25SaWdodCA9IGZvck93blJpZ2h0OwogICAgICAgIGxvZGFzaC5nZXQgPSBnZXQ7CiAgICAgICAgbG9kYXNoLmd0ID0gZ3Q7CiAgICAgICAgbG9kYXNoLmd0ZSA9IGd0ZTsKICAgICAgICBsb2Rhc2guaGFzID0gaGFzOwogICAgICAgIGxvZGFzaC5oYXNJbiA9IGhhc0luOwogICAgICAgIGxvZGFzaC5oZWFkID0gaGVhZDsKICAgICAgICBsb2Rhc2guaWRlbnRpdHkgPSBpZGVudGl0eTsKICAgICAgICBsb2Rhc2guaW5jbHVkZXMgPSBpbmNsdWRlczsKICAgICAgICBsb2Rhc2guaW5kZXhPZiA9IGluZGV4T2Y7CiAgICAgICAgbG9kYXNoLmluUmFuZ2UgPSBpblJhbmdlOwogICAgICAgIGxvZGFzaC5pbnZva2UgPSBpbnZva2U7CiAgICAgICAgbG9kYXNoLmlzQXJndW1lbnRzID0gaXNBcmd1bWVudHM7CiAgICAgICAgbG9kYXNoLmlzQXJyYXkgPSBpc0FycmF5OwogICAgICAgIGxvZGFzaC5pc0FycmF5QnVmZmVyID0gaXNBcnJheUJ1ZmZlcjsKICAgICAgICBsb2Rhc2guaXNBcnJheUxpa2UgPSBpc0FycmF5TGlrZTsKICAgICAgICBsb2Rhc2guaXNBcnJheUxpa2VPYmplY3QgPSBpc0FycmF5TGlrZU9iamVjdDsKICAgICAgICBsb2Rhc2guaXNCb29sZWFuID0gaXNCb29sZWFuOwogICAgICAgIGxvZGFzaC5pc0J1ZmZlciA9IGlzQnVmZmVyOwogICAgICAgIGxvZGFzaC5pc0RhdGUgPSBpc0RhdGU7CiAgICAgICAgbG9kYXNoLmlzRWxlbWVudCA9IGlzRWxlbWVudDsKICAgICAgICBsb2Rhc2guaXNFbXB0eSA9IGlzRW1wdHk7CiAgICAgICAgbG9kYXNoLmlzRXF1YWwgPSBpc0VxdWFsOwogICAgICAgIGxvZGFzaC5pc0VxdWFsV2l0aCA9IGlzRXF1YWxXaXRoOwogICAgICAgIGxvZGFzaC5pc0Vycm9yID0gaXNFcnJvcjsKICAgICAgICBsb2Rhc2guaXNGaW5pdGUgPSBpc0Zpbml0ZTsKICAgICAgICBsb2Rhc2guaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247CiAgICAgICAgbG9kYXNoLmlzSW50ZWdlciA9IGlzSW50ZWdlcjsKICAgICAgICBsb2Rhc2guaXNMZW5ndGggPSBpc0xlbmd0aDsKICAgICAgICBsb2Rhc2guaXNNYXAgPSBpc01hcDsKICAgICAgICBsb2Rhc2guaXNNYXRjaCA9IGlzTWF0Y2g7CiAgICAgICAgbG9kYXNoLmlzTWF0Y2hXaXRoID0gaXNNYXRjaFdpdGg7CiAgICAgICAgbG9kYXNoLmlzTmFOID0gaXNOYU47CiAgICAgICAgbG9kYXNoLmlzTmF0aXZlID0gaXNOYXRpdmU7CiAgICAgICAgbG9kYXNoLmlzTmlsID0gaXNOaWw7CiAgICAgICAgbG9kYXNoLmlzTnVsbCA9IGlzTnVsbDsKICAgICAgICBsb2Rhc2guaXNOdW1iZXIgPSBpc051bWJlcjsKICAgICAgICBsb2Rhc2guaXNPYmplY3QgPSBpc09iamVjdDsKICAgICAgICBsb2Rhc2guaXNPYmplY3RMaWtlID0gaXNPYmplY3RMaWtlOwogICAgICAgIGxvZGFzaC5pc1BsYWluT2JqZWN0ID0gaXNQbGFpbk9iamVjdDsKICAgICAgICBsb2Rhc2guaXNSZWdFeHAgPSBpc1JlZ0V4cDsKICAgICAgICBsb2Rhc2guaXNTYWZlSW50ZWdlciA9IGlzU2FmZUludGVnZXI7CiAgICAgICAgbG9kYXNoLmlzU2V0ID0gaXNTZXQ7CiAgICAgICAgbG9kYXNoLmlzU3RyaW5nID0gaXNTdHJpbmc7CiAgICAgICAgbG9kYXNoLmlzU3ltYm9sID0gaXNTeW1ib2w7CiAgICAgICAgbG9kYXNoLmlzVHlwZWRBcnJheSA9IGlzVHlwZWRBcnJheTsKICAgICAgICBsb2Rhc2guaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDsKICAgICAgICBsb2Rhc2guaXNXZWFrTWFwID0gaXNXZWFrTWFwOwogICAgICAgIGxvZGFzaC5pc1dlYWtTZXQgPSBpc1dlYWtTZXQ7CiAgICAgICAgbG9kYXNoLmpvaW4gPSBqb2luOwogICAgICAgIGxvZGFzaC5rZWJhYkNhc2UgPSBrZWJhYkNhc2U7CiAgICAgICAgbG9kYXNoLmxhc3QgPSBsYXN0OwogICAgICAgIGxvZGFzaC5sYXN0SW5kZXhPZiA9IGxhc3RJbmRleE9mOwogICAgICAgIGxvZGFzaC5sb3dlckNhc2UgPSBsb3dlckNhc2U7CiAgICAgICAgbG9kYXNoLmxvd2VyRmlyc3QgPSBsb3dlckZpcnN0OwogICAgICAgIGxvZGFzaC5sdCA9IGx0OwogICAgICAgIGxvZGFzaC5sdGUgPSBsdGU7CiAgICAgICAgbG9kYXNoLm1heCA9IG1heDsKICAgICAgICBsb2Rhc2gubWF4QnkgPSBtYXhCeTsKICAgICAgICBsb2Rhc2gubWVhbiA9IG1lYW47CiAgICAgICAgbG9kYXNoLm1lYW5CeSA9IG1lYW5CeTsKICAgICAgICBsb2Rhc2gubWluID0gbWluOwogICAgICAgIGxvZGFzaC5taW5CeSA9IG1pbkJ5OwogICAgICAgIGxvZGFzaC5zdHViQXJyYXkgPSBzdHViQXJyYXk7CiAgICAgICAgbG9kYXNoLnN0dWJGYWxzZSA9IHN0dWJGYWxzZTsKICAgICAgICBsb2Rhc2guc3R1Yk9iamVjdCA9IHN0dWJPYmplY3Q7CiAgICAgICAgbG9kYXNoLnN0dWJTdHJpbmcgPSBzdHViU3RyaW5nOwogICAgICAgIGxvZGFzaC5zdHViVHJ1ZSA9IHN0dWJUcnVlOwogICAgICAgIGxvZGFzaC5tdWx0aXBseSA9IG11bHRpcGx5OwogICAgICAgIGxvZGFzaC5udGggPSBudGg7CiAgICAgICAgbG9kYXNoLm5vQ29uZmxpY3QgPSBub0NvbmZsaWN0OwogICAgICAgIGxvZGFzaC5ub29wID0gbm9vcDsKICAgICAgICBsb2Rhc2gubm93ID0gbm93OwogICAgICAgIGxvZGFzaC5wYWQgPSBwYWQ7CiAgICAgICAgbG9kYXNoLnBhZEVuZCA9IHBhZEVuZDsKICAgICAgICBsb2Rhc2gucGFkU3RhcnQgPSBwYWRTdGFydDsKICAgICAgICBsb2Rhc2gucGFyc2VJbnQgPSBwYXJzZUludDsKICAgICAgICBsb2Rhc2gucmFuZG9tID0gcmFuZG9tOwogICAgICAgIGxvZGFzaC5yZWR1Y2UgPSByZWR1Y2U7CiAgICAgICAgbG9kYXNoLnJlZHVjZVJpZ2h0ID0gcmVkdWNlUmlnaHQ7CiAgICAgICAgbG9kYXNoLnJlcGVhdCA9IHJlcGVhdDsKICAgICAgICBsb2Rhc2gucmVwbGFjZSA9IHJlcGxhY2U7CiAgICAgICAgbG9kYXNoLnJlc3VsdCA9IHJlc3VsdDsKICAgICAgICBsb2Rhc2gucm91bmQgPSByb3VuZDsKICAgICAgICBsb2Rhc2gucnVuSW5Db250ZXh0ID0gcnVuSW5Db250ZXh0OwogICAgICAgIGxvZGFzaC5zYW1wbGUgPSBzYW1wbGU7CiAgICAgICAgbG9kYXNoLnNpemUgPSBzaXplOwogICAgICAgIGxvZGFzaC5zbmFrZUNhc2UgPSBzbmFrZUNhc2U7CiAgICAgICAgbG9kYXNoLnNvbWUgPSBzb21lOwogICAgICAgIGxvZGFzaC5zb3J0ZWRJbmRleCA9IHNvcnRlZEluZGV4OwogICAgICAgIGxvZGFzaC5zb3J0ZWRJbmRleEJ5ID0gc29ydGVkSW5kZXhCeTsKICAgICAgICBsb2Rhc2guc29ydGVkSW5kZXhPZiA9IHNvcnRlZEluZGV4T2Y7CiAgICAgICAgbG9kYXNoLnNvcnRlZExhc3RJbmRleCA9IHNvcnRlZExhc3RJbmRleDsKICAgICAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4QnkgPSBzb3J0ZWRMYXN0SW5kZXhCeTsKICAgICAgICBsb2Rhc2guc29ydGVkTGFzdEluZGV4T2YgPSBzb3J0ZWRMYXN0SW5kZXhPZjsKICAgICAgICBsb2Rhc2guc3RhcnRDYXNlID0gc3RhcnRDYXNlOwogICAgICAgIGxvZGFzaC5zdGFydHNXaXRoID0gc3RhcnRzV2l0aDsKICAgICAgICBsb2Rhc2guc3VidHJhY3QgPSBzdWJ0cmFjdDsKICAgICAgICBsb2Rhc2guc3VtID0gc3VtOwogICAgICAgIGxvZGFzaC5zdW1CeSA9IHN1bUJ5OwogICAgICAgIGxvZGFzaC50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgIGxvZGFzaC50aW1lcyA9IHRpbWVzOwogICAgICAgIGxvZGFzaC50b0Zpbml0ZSA9IHRvRmluaXRlOwogICAgICAgIGxvZGFzaC50b0ludGVnZXIgPSB0b0ludGVnZXI7CiAgICAgICAgbG9kYXNoLnRvTGVuZ3RoID0gdG9MZW5ndGg7CiAgICAgICAgbG9kYXNoLnRvTG93ZXIgPSB0b0xvd2VyOwogICAgICAgIGxvZGFzaC50b051bWJlciA9IHRvTnVtYmVyOwogICAgICAgIGxvZGFzaC50b1NhZmVJbnRlZ2VyID0gdG9TYWZlSW50ZWdlcjsKICAgICAgICBsb2Rhc2gudG9TdHJpbmcgPSB0b1N0cmluZzsKICAgICAgICBsb2Rhc2gudG9VcHBlciA9IHRvVXBwZXI7CiAgICAgICAgbG9kYXNoLnRyaW0gPSB0cmltOwogICAgICAgIGxvZGFzaC50cmltRW5kID0gdHJpbUVuZDsKICAgICAgICBsb2Rhc2gudHJpbVN0YXJ0ID0gdHJpbVN0YXJ0OwogICAgICAgIGxvZGFzaC50cnVuY2F0ZSA9IHRydW5jYXRlOwogICAgICAgIGxvZGFzaC51bmVzY2FwZSA9IHVuZXNjYXBlOwogICAgICAgIGxvZGFzaC51bmlxdWVJZCA9IHVuaXF1ZUlkOwogICAgICAgIGxvZGFzaC51cHBlckNhc2UgPSB1cHBlckNhc2U7CiAgICAgICAgbG9kYXNoLnVwcGVyRmlyc3QgPSB1cHBlckZpcnN0OwoKICAgICAgICAvLyBBZGQgYWxpYXNlcy4KICAgICAgICBsb2Rhc2guZWFjaCA9IGZvckVhY2g7CiAgICAgICAgbG9kYXNoLmVhY2hSaWdodCA9IGZvckVhY2hSaWdodDsKICAgICAgICBsb2Rhc2guZmlyc3QgPSBoZWFkOwoKICAgICAgICBtaXhpbihsb2Rhc2gsIChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBzb3VyY2UgPSB7fTsKICAgICAgICAgIGJhc2VGb3JPd24obG9kYXNoLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7CiAgICAgICAgICAgIGlmICghaGFzT3duUHJvcGVydHkuY2FsbChsb2Rhc2gucHJvdG90eXBlLCBtZXRob2ROYW1lKSkgewogICAgICAgICAgICAgIHNvdXJjZVttZXRob2ROYW1lXSA9IGZ1bmM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIHNvdXJjZTsKICAgICAgICB9KCkpLCB7ICdjaGFpbic6IGZhbHNlIH0pOwoKICAgICAgICAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlci4KICAgICAgICAgKgogICAgICAgICAqIEBzdGF0aWMKICAgICAgICAgKiBAbWVtYmVyT2YgXwogICAgICAgICAqIEB0eXBlIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgbG9kYXNoLlZFUlNJT04gPSBWRVJTSU9OOwoKICAgICAgICAvLyBBc3NpZ24gZGVmYXVsdCBwbGFjZWhvbGRlcnMuCiAgICAgICAgYXJyYXlFYWNoKFsnYmluZCcsICdiaW5kS2V5JywgJ2N1cnJ5JywgJ2N1cnJ5UmlnaHQnLCAncGFydGlhbCcsICdwYXJ0aWFsUmlnaHQnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSkgewogICAgICAgICAgbG9kYXNoW21ldGhvZE5hbWVdLnBsYWNlaG9sZGVyID0gbG9kYXNoOwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5kcm9wYCBhbmQgYF8udGFrZWAgdmFyaWFudHMuCiAgICAgICAgYXJyYXlFYWNoKFsnZHJvcCcsICd0YWtlJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7CiAgICAgICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgICAgIG4gPSBuID09PSB1bmRlZmluZWQkMSA/IDEgOiBuYXRpdmVNYXgodG9JbnRlZ2VyKG4pLCAwKTsKCiAgICAgICAgICAgIHZhciByZXN1bHQgPSAodGhpcy5fX2ZpbHRlcmVkX18gJiYgIWluZGV4KQogICAgICAgICAgICAgID8gbmV3IExhenlXcmFwcGVyKHRoaXMpCiAgICAgICAgICAgICAgOiB0aGlzLmNsb25lKCk7CgogICAgICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXykgewogICAgICAgICAgICAgIHJlc3VsdC5fX3Rha2VDb3VudF9fID0gbmF0aXZlTWluKG4sIHJlc3VsdC5fX3Rha2VDb3VudF9fKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICByZXN1bHQuX192aWV3c19fLnB1c2goewogICAgICAgICAgICAgICAgJ3NpemUnOiBuYXRpdmVNaW4obiwgTUFYX0FSUkFZX0xFTkdUSCksCiAgICAgICAgICAgICAgICAndHlwZSc6IG1ldGhvZE5hbWUgKyAocmVzdWx0Ll9fZGlyX18gPCAwID8gJ1JpZ2h0JyA6ICcnKQogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICB9OwoKICAgICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lICsgJ1JpZ2h0J10gPSBmdW5jdGlvbihuKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJldmVyc2UoKVttZXRob2ROYW1lXShuKS5yZXZlcnNlKCk7CiAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRoYXQgYWNjZXB0IGFuIGBpdGVyYXRlZWAgdmFsdWUuCiAgICAgICAgYXJyYXlFYWNoKFsnZmlsdGVyJywgJ21hcCcsICd0YWtlV2hpbGUnXSwgZnVuY3Rpb24obWV0aG9kTmFtZSwgaW5kZXgpIHsKICAgICAgICAgIHZhciB0eXBlID0gaW5kZXggKyAxLAogICAgICAgICAgICAgIGlzRmlsdGVyID0gdHlwZSA9PSBMQVpZX0ZJTFRFUl9GTEFHIHx8IHR5cGUgPT0gTEFaWV9XSElMRV9GTEFHOwoKICAgICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKGl0ZXJhdGVlKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSB0aGlzLmNsb25lKCk7CiAgICAgICAgICAgIHJlc3VsdC5fX2l0ZXJhdGVlc19fLnB1c2goewogICAgICAgICAgICAgICdpdGVyYXRlZSc6IGdldEl0ZXJhdGVlKGl0ZXJhdGVlLCAzKSwKICAgICAgICAgICAgICAndHlwZSc6IHR5cGUKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJlc3VsdC5fX2ZpbHRlcmVkX18gPSByZXN1bHQuX19maWx0ZXJlZF9fIHx8IGlzRmlsdGVyOwogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQWRkIGBMYXp5V3JhcHBlcmAgbWV0aG9kcyBmb3IgYF8uaGVhZGAgYW5kIGBfLmxhc3RgLgogICAgICAgIGFycmF5RWFjaChbJ2hlYWQnLCAnbGFzdCddLCBmdW5jdGlvbihtZXRob2ROYW1lLCBpbmRleCkgewogICAgICAgICAgdmFyIHRha2VOYW1lID0gJ3Rha2UnICsgKGluZGV4ID8gJ1JpZ2h0JyA6ICcnKTsKCiAgICAgICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXNbdGFrZU5hbWVdKDEpLnZhbHVlKClbMF07CiAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIGZvciBgXy5pbml0aWFsYCBhbmQgYF8udGFpbGAuCiAgICAgICAgYXJyYXlFYWNoKFsnaW5pdGlhbCcsICd0YWlsJ10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUsIGluZGV4KSB7CiAgICAgICAgICB2YXIgZHJvcE5hbWUgPSAnZHJvcCcgKyAoaW5kZXggPyAnJyA6ICdSaWdodCcpOwoKICAgICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fX2ZpbHRlcmVkX18gPyBuZXcgTGF6eVdyYXBwZXIodGhpcykgOiB0aGlzW2Ryb3BOYW1lXSgxKTsKICAgICAgICAgIH07CiAgICAgICAgfSk7CgogICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jb21wYWN0ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoaWRlbnRpdHkpOwogICAgICAgIH07CgogICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5maW5kID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIocHJlZGljYXRlKS5oZWFkKCk7CiAgICAgICAgfTsKCiAgICAgICAgTGF6eVdyYXBwZXIucHJvdG90eXBlLmZpbmRMYXN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5yZXZlcnNlKCkuZmluZChwcmVkaWNhdGUpOwogICAgICAgIH07CgogICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5pbnZva2VNYXAgPSBiYXNlUmVzdChmdW5jdGlvbihwYXRoLCBhcmdzKSB7CiAgICAgICAgICBpZiAodHlwZW9mIHBhdGggPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gbmV3IExhenlXcmFwcGVyKHRoaXMpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBiYXNlSW52b2tlKHZhbHVlLCBwYXRoLCBhcmdzKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmVqZWN0ID0gZnVuY3Rpb24ocHJlZGljYXRlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIobmVnYXRlKGdldEl0ZXJhdGVlKHByZWRpY2F0ZSkpKTsKICAgICAgICB9OwoKICAgICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgICBzdGFydCA9IHRvSW50ZWdlcihzdGFydCk7CgogICAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXM7CiAgICAgICAgICBpZiAocmVzdWx0Ll9fZmlsdGVyZWRfXyAmJiAoc3RhcnQgPiAwIHx8IGVuZCA8IDApKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTGF6eVdyYXBwZXIocmVzdWx0KTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChzdGFydCA8IDApIHsKICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnRha2VSaWdodCgtc3RhcnQpOwogICAgICAgICAgfSBlbHNlIGlmIChzdGFydCkgewogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQuZHJvcChzdGFydCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZW5kICE9PSB1bmRlZmluZWQkMSkgewogICAgICAgICAgICBlbmQgPSB0b0ludGVnZXIoZW5kKTsKICAgICAgICAgICAgcmVzdWx0ID0gZW5kIDwgMCA/IHJlc3VsdC5kcm9wUmlnaHQoLWVuZCkgOiByZXN1bHQudGFrZShlbmQgLSBzdGFydCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH07CgogICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS50YWtlUmlnaHRXaGlsZSA9IGZ1bmN0aW9uKHByZWRpY2F0ZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMucmV2ZXJzZSgpLnRha2VXaGlsZShwcmVkaWNhdGUpLnJldmVyc2UoKTsKICAgICAgICB9OwoKICAgICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUudG9BcnJheSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHRoaXMudGFrZShNQVhfQVJSQVlfTEVOR1RIKTsKICAgICAgICB9OwoKICAgICAgICAvLyBBZGQgYExhenlXcmFwcGVyYCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC4KICAgICAgICBiYXNlRm9yT3duKExhenlXcmFwcGVyLnByb3RvdHlwZSwgZnVuY3Rpb24oZnVuYywgbWV0aG9kTmFtZSkgewogICAgICAgICAgdmFyIGNoZWNrSXRlcmF0ZWUgPSAvXig/OmZpbHRlcnxmaW5kfG1hcHxyZWplY3QpfFdoaWxlJC8udGVzdChtZXRob2ROYW1lKSwKICAgICAgICAgICAgICBpc1Rha2VyID0gL14oPzpoZWFkfGxhc3QpJC8udGVzdChtZXRob2ROYW1lKSwKICAgICAgICAgICAgICBsb2Rhc2hGdW5jID0gbG9kYXNoW2lzVGFrZXIgPyAoJ3Rha2UnICsgKG1ldGhvZE5hbWUgPT0gJ2xhc3QnID8gJ1JpZ2h0JyA6ICcnKSkgOiBtZXRob2ROYW1lXSwKICAgICAgICAgICAgICByZXRVbndyYXBwZWQgPSBpc1Rha2VyIHx8IC9eZmluZC8udGVzdChtZXRob2ROYW1lKTsKCiAgICAgICAgICBpZiAoIWxvZGFzaEZ1bmMpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgbG9kYXNoLnByb3RvdHlwZVttZXRob2ROYW1lXSA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9fd3JhcHBlZF9fLAogICAgICAgICAgICAgICAgYXJncyA9IGlzVGFrZXIgPyBbMV0gOiBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICBpc0xhenkgPSB2YWx1ZSBpbnN0YW5jZW9mIExhenlXcmFwcGVyLAogICAgICAgICAgICAgICAgaXRlcmF0ZWUgPSBhcmdzWzBdLAogICAgICAgICAgICAgICAgdXNlTGF6eSA9IGlzTGF6eSB8fCBpc0FycmF5KHZhbHVlKTsKCiAgICAgICAgICAgIHZhciBpbnRlcmNlcHRvciA9IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGxvZGFzaEZ1bmMuYXBwbHkobG9kYXNoLCBhcnJheVB1c2goW3ZhbHVlXSwgYXJncykpOwogICAgICAgICAgICAgIHJldHVybiAoaXNUYWtlciAmJiBjaGFpbkFsbCkgPyByZXN1bHRbMF0gOiByZXN1bHQ7CiAgICAgICAgICAgIH07CgogICAgICAgICAgICBpZiAodXNlTGF6eSAmJiBjaGVja0l0ZXJhdGVlICYmIHR5cGVvZiBpdGVyYXRlZSA9PSAnZnVuY3Rpb24nICYmIGl0ZXJhdGVlLmxlbmd0aCAhPSAxKSB7CiAgICAgICAgICAgICAgLy8gQXZvaWQgbGF6eSB1c2UgaWYgdGhlIGl0ZXJhdGVlIGhhcyBhICJsZW5ndGgiIHZhbHVlIG90aGVyIHRoYW4gYDFgLgogICAgICAgICAgICAgIGlzTGF6eSA9IHVzZUxhenkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY2hhaW5BbGwgPSB0aGlzLl9fY2hhaW5fXywKICAgICAgICAgICAgICAgIGlzSHlicmlkID0gISF0aGlzLl9fYWN0aW9uc19fLmxlbmd0aCwKICAgICAgICAgICAgICAgIGlzVW53cmFwcGVkID0gcmV0VW53cmFwcGVkICYmICFjaGFpbkFsbCwKICAgICAgICAgICAgICAgIG9ubHlMYXp5ID0gaXNMYXp5ICYmICFpc0h5YnJpZDsKCiAgICAgICAgICAgIGlmICghcmV0VW53cmFwcGVkICYmIHVzZUxhenkpIHsKICAgICAgICAgICAgICB2YWx1ZSA9IG9ubHlMYXp5ID8gdmFsdWUgOiBuZXcgTGF6eVdyYXBwZXIodGhpcyk7CiAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IGZ1bmMuYXBwbHkodmFsdWUsIGFyZ3MpOwogICAgICAgICAgICAgIHJlc3VsdC5fX2FjdGlvbnNfXy5wdXNoKHsgJ2Z1bmMnOiB0aHJ1LCAnYXJncyc6IFtpbnRlcmNlcHRvcl0sICd0aGlzQXJnJzogdW5kZWZpbmVkJDEgfSk7CiAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMb2Rhc2hXcmFwcGVyKHJlc3VsdCwgY2hhaW5BbGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1Vud3JhcHBlZCAmJiBvbmx5TGF6eSkgewogICAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMudGhydShpbnRlcmNlcHRvcik7CiAgICAgICAgICAgIHJldHVybiBpc1Vud3JhcHBlZCA/IChpc1Rha2VyID8gcmVzdWx0LnZhbHVlKClbMF0gOiByZXN1bHQudmFsdWUoKSkgOiByZXN1bHQ7CiAgICAgICAgICB9OwogICAgICAgIH0pOwoKICAgICAgICAvLyBBZGQgYEFycmF5YCBtZXRob2RzIHRvIGBsb2Rhc2gucHJvdG90eXBlYC4KICAgICAgICBhcnJheUVhY2goWydwb3AnLCAncHVzaCcsICdzaGlmdCcsICdzb3J0JywgJ3NwbGljZScsICd1bnNoaWZ0J10sIGZ1bmN0aW9uKG1ldGhvZE5hbWUpIHsKICAgICAgICAgIHZhciBmdW5jID0gYXJyYXlQcm90b1ttZXRob2ROYW1lXSwKICAgICAgICAgICAgICBjaGFpbk5hbWUgPSAvXig/OnB1c2h8c29ydHx1bnNoaWZ0KSQvLnRlc3QobWV0aG9kTmFtZSkgPyAndGFwJyA6ICd0aHJ1JywKICAgICAgICAgICAgICByZXRVbndyYXBwZWQgPSAvXig/OnBvcHxzaGlmdCkkLy50ZXN0KG1ldGhvZE5hbWUpOwoKICAgICAgICAgIGxvZGFzaC5wcm90b3R5cGVbbWV0aG9kTmFtZV0gPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7CiAgICAgICAgICAgIGlmIChyZXRVbndyYXBwZWQgJiYgIXRoaXMuX19jaGFpbl9fKSB7CiAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdGhpcy52YWx1ZSgpOwogICAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXNbY2hhaW5OYW1lXShmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgICAgIHJldHVybiBmdW5jLmFwcGx5KGlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbXSwgYXJncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gTWFwIG1pbmlmaWVkIG1ldGhvZCBuYW1lcyB0byB0aGVpciByZWFsIG5hbWVzLgogICAgICAgIGJhc2VGb3JPd24oTGF6eVdyYXBwZXIucHJvdG90eXBlLCBmdW5jdGlvbihmdW5jLCBtZXRob2ROYW1lKSB7CiAgICAgICAgICB2YXIgbG9kYXNoRnVuYyA9IGxvZGFzaFttZXRob2ROYW1lXTsKICAgICAgICAgIGlmIChsb2Rhc2hGdW5jKSB7CiAgICAgICAgICAgIHZhciBrZXkgPSBsb2Rhc2hGdW5jLm5hbWUgKyAnJzsKICAgICAgICAgICAgaWYgKCFoYXNPd25Qcm9wZXJ0eS5jYWxsKHJlYWxOYW1lcywga2V5KSkgewogICAgICAgICAgICAgIHJlYWxOYW1lc1trZXldID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhbE5hbWVzW2tleV0ucHVzaCh7ICduYW1lJzogbWV0aG9kTmFtZSwgJ2Z1bmMnOiBsb2Rhc2hGdW5jIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZWFsTmFtZXNbY3JlYXRlSHlicmlkKHVuZGVmaW5lZCQxLCBXUkFQX0JJTkRfS0VZX0ZMQUcpLm5hbWVdID0gW3sKICAgICAgICAgICduYW1lJzogJ3dyYXBwZXInLAogICAgICAgICAgJ2Z1bmMnOiB1bmRlZmluZWQkMQogICAgICAgIH1dOwoKICAgICAgICAvLyBBZGQgbWV0aG9kcyB0byBgTGF6eVdyYXBwZXJgLgogICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS5jbG9uZSA9IGxhenlDbG9uZTsKICAgICAgICBMYXp5V3JhcHBlci5wcm90b3R5cGUucmV2ZXJzZSA9IGxhenlSZXZlcnNlOwogICAgICAgIExhenlXcmFwcGVyLnByb3RvdHlwZS52YWx1ZSA9IGxhenlWYWx1ZTsKCiAgICAgICAgLy8gQWRkIGNoYWluIHNlcXVlbmNlIG1ldGhvZHMgdG8gdGhlIGBsb2Rhc2hgIHdyYXBwZXIuCiAgICAgICAgbG9kYXNoLnByb3RvdHlwZS5hdCA9IHdyYXBwZXJBdDsKICAgICAgICBsb2Rhc2gucHJvdG90eXBlLmNoYWluID0gd3JhcHBlckNoYWluOwogICAgICAgIGxvZGFzaC5wcm90b3R5cGUuY29tbWl0ID0gd3JhcHBlckNvbW1pdDsKICAgICAgICBsb2Rhc2gucHJvdG90eXBlLm5leHQgPSB3cmFwcGVyTmV4dDsKICAgICAgICBsb2Rhc2gucHJvdG90eXBlLnBsYW50ID0gd3JhcHBlclBsYW50OwogICAgICAgIGxvZGFzaC5wcm90b3R5cGUucmV2ZXJzZSA9IHdyYXBwZXJSZXZlcnNlOwogICAgICAgIGxvZGFzaC5wcm90b3R5cGUudG9KU09OID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZU9mID0gbG9kYXNoLnByb3RvdHlwZS52YWx1ZSA9IHdyYXBwZXJWYWx1ZTsKCiAgICAgICAgLy8gQWRkIGxhenkgYWxpYXNlcy4KICAgICAgICBsb2Rhc2gucHJvdG90eXBlLmZpcnN0ID0gbG9kYXNoLnByb3RvdHlwZS5oZWFkOwoKICAgICAgICBpZiAoc3ltSXRlcmF0b3IpIHsKICAgICAgICAgIGxvZGFzaC5wcm90b3R5cGVbc3ltSXRlcmF0b3JdID0gd3JhcHBlclRvSXRlcmF0b3I7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsb2Rhc2g7CiAgICAgIH0pOwoKICAgICAgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCgogICAgICAvLyBFeHBvcnQgbG9kYXNoLgogICAgICB2YXIgXyA9IHJ1bkluQ29udGV4dCgpOwoKICAgICAgLy8gU29tZSBBTUQgYnVpbGQgb3B0aW1pemVycywgbGlrZSByLmpzLCBjaGVjayBmb3IgY29uZGl0aW9uIHBhdHRlcm5zIGxpa2U6CiAgICAgIGlmIChmcmVlTW9kdWxlKSB7CiAgICAgICAgLy8gRXhwb3J0IGZvciBOb2RlLmpzLgogICAgICAgIChmcmVlTW9kdWxlLmV4cG9ydHMgPSBfKS5fID0gXzsKICAgICAgICAvLyBFeHBvcnQgZm9yIENvbW1vbkpTIHN1cHBvcnQuCiAgICAgICAgZnJlZUV4cG9ydHMuXyA9IF87CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgLy8gRXhwb3J0IHRvIHRoZSBnbG9iYWwgb2JqZWN0LgogICAgICAgIHJvb3QuXyA9IF87CiAgICAgIH0KICAgIH0uY2FsbChjb21tb25qc0dsb2JhbCkpOwogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCBuYXRpdmVTaGFkb3cgPSAhKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwogICAgbGV0IG5hdGl2ZUNzc1ZhcmlhYmxlc187CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyhTaGFkeUNTU09wdGlvbnMgfCBTaGFkeUNTU0ludGVyZmFjZSk9fSBzZXR0aW5ncwogICAgICovCiAgICBmdW5jdGlvbiBjYWxjQ3NzVmFyaWFibGVzKHNldHRpbmdzKSB7CiAgICAgIGlmIChzZXR0aW5ncyAmJiBzZXR0aW5nc1snc2hpbWNzc3Byb3BlcnRpZXMnXSkgewogICAgICAgIG5hdGl2ZUNzc1ZhcmlhYmxlc18gPSBmYWxzZTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBjaHJvbWUgNDkgaGFzIHNlbWktd29ya2luZyBjc3MgdmFycywgY2hlY2sgaWYgYm94LXNoYWRvdyB3b3JrcwogICAgICAgIC8vIHNhZmFyaSA5LjEgaGFzIGEgcmVjYWxjIGJ1ZzogaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTE1NTc4MgogICAgICAgIC8vIEhvd2V2ZXIsIHNoaW0gY3NzIGN1c3RvbSBwcm9wZXJ0aWVzIGFyZSBvbmx5IHN1cHBvcnRlZCB3aXRoIFNoYWR5RE9NIGVuYWJsZWQsCiAgICAgICAgLy8gc28gZmFsbCBiYWNrIG9uIG5hdGl2ZSBpZiB3ZSBkbyBub3QgZGV0ZWN0IFNoYWR5RE9NCiAgICAgICAgLy8gRWRnZSAxNTogY3VzdG9tIHByb3BlcnRpZXMgdXNlZCBpbiA6OmJlZm9yZSBhbmQgOjphZnRlciB3aWxsIGFsc28gYmUgdXNlZCBpbiB0aGUgcGFyZW50IGVsZW1lbnQKICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy8xMjQxNDI1Ny8KICAgICAgICBuYXRpdmVDc3NWYXJpYWJsZXNfID0gbmF0aXZlU2hhZG93IHx8IEJvb2xlYW4oIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcGxlV2ViS2l0XC82MDF8RWRnZVwvMTUvKSAmJgogICAgICAgICAgd2luZG93LkNTUyAmJiBDU1Muc3VwcG9ydHMgJiYgQ1NTLnN1cHBvcnRzKCdib3gtc2hhZG93JywgJzAgMCAwIHZhcigtLWZvbyknKSk7CiAgICAgIH0KICAgIH0KCiAgICAvKiogQHR5cGUge3N0cmluZyB8IHVuZGVmaW5lZH0gKi8KICAgIGxldCBjc3NCdWlsZDsKICAgIGlmICh3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTLmNzc0J1aWxkICE9PSB1bmRlZmluZWQpIHsKICAgICAgY3NzQnVpbGQgPSB3aW5kb3cuU2hhZHlDU1MuY3NzQnVpbGQ7CiAgICB9CgogICAgLyoqIEB0eXBlIHtib29sZWFufSAqLwogICAgY29uc3QgZGlzYWJsZVJ1bnRpbWUgPSBCb29sZWFuKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuZGlzYWJsZVJ1bnRpbWUpOwoKICAgIGlmICh3aW5kb3cuU2hhZHlDU1MgJiYgd2luZG93LlNoYWR5Q1NTLm5hdGl2ZUNzcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgIG5hdGl2ZUNzc1ZhcmlhYmxlc18gPSB3aW5kb3cuU2hhZHlDU1MubmF0aXZlQ3NzOwogICAgfSBlbHNlIGlmICh3aW5kb3cuU2hhZHlDU1MpIHsKICAgICAgY2FsY0Nzc1ZhcmlhYmxlcyh3aW5kb3cuU2hhZHlDU1MpOwogICAgICAvLyByZXNldCB3aW5kb3cgdmFyaWFibGUgdG8gbGV0IFNoYWR5Q1NTIEFQSSB0YWtlIGl0cyBwbGFjZQogICAgICB3aW5kb3cuU2hhZHlDU1MgPSB1bmRlZmluZWQ7CiAgICB9IGVsc2UgewogICAgICBjYWxjQ3NzVmFyaWFibGVzKHdpbmRvd1snV2ViQ29tcG9uZW50cyddICYmIHdpbmRvd1snV2ViQ29tcG9uZW50cyddWydmbGFncyddKTsKICAgIH0KCiAgICAvLyBIYWNrIGZvciB0eXBlIGVycm9yIHVuZGVyIG5ldyB0eXBlIGluZmVyZW5jZSB3aGljaCBkb2Vzbid0IGxpa2UgdGhhdAogICAgLy8gbmF0aXZlQ3NzVmFyaWFibGVzIGlzIHVwZGF0ZWQgaW4gYSBmdW5jdGlvbiBhbmQgYXNzaWducyB0aGUgdHlwZQogICAgLy8gYGZ1bmN0aW9uKCk6ID9gIGluc3RlYWQgb2YgYGJvb2xlYW5gLgogICAgY29uc3QgbmF0aXZlQ3NzVmFyaWFibGVzID0gLyoqIEB0eXBlIHtib29sZWFufSAqLyhuYXRpdmVDc3NWYXJpYWJsZXNfKTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKiBAdW5yZXN0cmljdGVkICovCiAgICBjbGFzcyBTdHlsZU5vZGUgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICB0aGlzWydzdGFydCddID0gMDsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICB0aGlzWydlbmQnXSA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHtTdHlsZU5vZGV9ICovCiAgICAgICAgdGhpc1sncHJldmlvdXMnXSA9IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHtTdHlsZU5vZGV9ICovCiAgICAgICAgdGhpc1sncGFyZW50J10gPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7QXJyYXk8U3R5bGVOb2RlPn0gKi8KICAgICAgICB0aGlzWydydWxlcyddID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzWydwYXJzZWRDc3NUZXh0J10gPSAnJzsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzWydjc3NUZXh0J10gPSAnJzsKICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgdGhpc1snYXRSdWxlJ10gPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUge251bWJlcn0gKi8KICAgICAgICB0aGlzWyd0eXBlJ10gPSAwOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXNbJ2tleWZyYW1lc05hbWUnXSA9ICcnOwogICAgICAgIC8qKiBAdHlwZSB7c3RyaW5nfSAqLwogICAgICAgIHRoaXNbJ3NlbGVjdG9yJ10gPSAnJzsKICAgICAgICAvKiogQHR5cGUge3N0cmluZ30gKi8KICAgICAgICB0aGlzWydwYXJzZWRTZWxlY3RvciddID0gJyc7CiAgICAgIH0KICAgIH0KCiAgICAvLyBnaXZlbiBhIHN0cmluZyBvZiBjc3MsIHJldHVybiBhIHNpbXBsZSBydWxlIHRyZWUKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICAgICAqIEByZXR1cm4ge1N0eWxlTm9kZX0KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2UodGV4dCkgewogICAgICB0ZXh0ID0gY2xlYW4odGV4dCk7CiAgICAgIHJldHVybiBwYXJzZUNzcyhsZXgodGV4dCksIHRleHQpOwogICAgfQoKICAgIC8vIHJlbW92ZSBzdHVmZiB3ZSBkb24ndCBjYXJlIGFib3V0IHRoYXQgbWF5IGhpbmRlciBwYXJzaW5nCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuKGNzc1RleHQpIHsKICAgICAgcmV0dXJuIGNzc1RleHQucmVwbGFjZShSWC5jb21tZW50cywgJycpLnJlcGxhY2UoUlgucG9ydCwgJycpOwogICAgfQoKICAgIC8vIHN1cGVyIHNpbXBsZSB7Li4ufSBsZXhlciB0aGF0IHJldHVybnMgYSBub2RlIHRyZWUKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICAgICAqIEByZXR1cm4geyFTdHlsZU5vZGV9CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxleCh0ZXh0KSB7CiAgICAgIGxldCByb290ID0gbmV3IFN0eWxlTm9kZSgpOwogICAgICByb290WydzdGFydCddID0gMDsKICAgICAgcm9vdFsnZW5kJ10gPSB0ZXh0Lmxlbmd0aDsKICAgICAgbGV0IG4gPSByb290OwogICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHRleHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgaWYgKHRleHRbaV0gPT09IE9QRU5fQlJBQ0UpIHsKICAgICAgICAgIGlmICghblsncnVsZXMnXSkgewogICAgICAgICAgICBuWydydWxlcyddID0gW107CiAgICAgICAgICB9CiAgICAgICAgICBsZXQgcCA9IG47CiAgICAgICAgICBsZXQgcHJldmlvdXMgPSBwWydydWxlcyddW3BbJ3J1bGVzJ10ubGVuZ3RoIC0gMV0gfHwgbnVsbDsKICAgICAgICAgIG4gPSBuZXcgU3R5bGVOb2RlKCk7CiAgICAgICAgICBuWydzdGFydCddID0gaSArIDE7CiAgICAgICAgICBuWydwYXJlbnQnXSA9IHA7CiAgICAgICAgICBuWydwcmV2aW91cyddID0gcHJldmlvdXM7CiAgICAgICAgICBwWydydWxlcyddLnB1c2gobik7CiAgICAgICAgfSBlbHNlIGlmICh0ZXh0W2ldID09PSBDTE9TRV9CUkFDRSkgewogICAgICAgICAgblsnZW5kJ10gPSBpICsgMTsKICAgICAgICAgIG4gPSBuWydwYXJlbnQnXSB8fCByb290OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcm9vdDsKICAgIH0KCiAgICAvLyBhZGQgc2VsZWN0b3JzL2Nzc1RleHQgdG8gbm9kZSB0cmVlCiAgICAvKioKICAgICAqIEBwYXJhbSB7U3R5bGVOb2RlfSBub2RlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dAogICAgICogQHJldHVybiB7IVN0eWxlTm9kZX0KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VDc3Mobm9kZSwgdGV4dCkgewogICAgICBsZXQgdCA9IHRleHQuc3Vic3RyaW5nKG5vZGVbJ3N0YXJ0J10sIG5vZGVbJ2VuZCddIC0gMSk7CiAgICAgIG5vZGVbJ3BhcnNlZENzc1RleHQnXSA9IG5vZGVbJ2Nzc1RleHQnXSA9IHQudHJpbSgpOwogICAgICBpZiAobm9kZVsncGFyZW50J10pIHsKICAgICAgICBsZXQgc3MgPSBub2RlWydwcmV2aW91cyddID8gbm9kZVsncHJldmlvdXMnXVsnZW5kJ10gOiBub2RlWydwYXJlbnQnXVsnc3RhcnQnXTsKICAgICAgICB0ID0gdGV4dC5zdWJzdHJpbmcoc3MsIG5vZGVbJ3N0YXJ0J10gLSAxKTsKICAgICAgICB0ID0gX2V4cGFuZFVuaWNvZGVFc2NhcGVzKHQpOwogICAgICAgIHQgPSB0LnJlcGxhY2UoUlgubXVsdGlwbGVTcGFjZXMsICcgJyk7CiAgICAgICAgLy8gVE9ETyhzb3J2ZWxsKTogYWQgaG9jOyBtYWtlIHNlbGVjdG9yIGluY2x1ZGUgb25seSBhZnRlciBsYXN0IDsKICAgICAgICAvLyBoZWxwcyB3aXRoIG1peGluIHN5bnRheAogICAgICAgIHQgPSB0LnN1YnN0cmluZyh0Lmxhc3RJbmRleE9mKCc7JykgKyAxKTsKICAgICAgICBsZXQgcyA9IG5vZGVbJ3BhcnNlZFNlbGVjdG9yJ10gPSBub2RlWydzZWxlY3RvciddID0gdC50cmltKCk7CiAgICAgICAgbm9kZVsnYXRSdWxlJ10gPSAocy5pbmRleE9mKEFUX1NUQVJUKSA9PT0gMCk7CiAgICAgICAgLy8gbm90ZSwgc3VwcG9ydCBhIHN1YnNldCBvZiBydWxlIHR5cGVzLi4uCiAgICAgICAgaWYgKG5vZGVbJ2F0UnVsZSddKSB7CiAgICAgICAgICBpZiAocy5pbmRleE9mKE1FRElBX1NUQVJUKSA9PT0gMCkgewogICAgICAgICAgICBub2RlWyd0eXBlJ10gPSB0eXBlcy5NRURJQV9SVUxFOwogICAgICAgICAgfSBlbHNlIGlmIChzLm1hdGNoKFJYLmtleWZyYW1lc1J1bGUpKSB7CiAgICAgICAgICAgIG5vZGVbJ3R5cGUnXSA9IHR5cGVzLktFWUZSQU1FU19SVUxFOwogICAgICAgICAgICBub2RlWydrZXlmcmFtZXNOYW1lJ10gPQogICAgICAgICAgICAgIG5vZGVbJ3NlbGVjdG9yJ10uc3BsaXQoUlgubXVsdGlwbGVTcGFjZXMpLnBvcCgpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAocy5pbmRleE9mKFZBUl9TVEFSVCkgPT09IDApIHsKICAgICAgICAgICAgbm9kZVsndHlwZSddID0gdHlwZXMuTUlYSU5fUlVMRTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGVbJ3R5cGUnXSA9IHR5cGVzLlNUWUxFX1JVTEU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGxldCByJCA9IG5vZGVbJ3J1bGVzJ107CiAgICAgIGlmIChyJCkgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBsID0gciQubGVuZ3RoLCByOwogICAgICAgICAgKGkgPCBsKSAmJiAociA9IHIkW2ldKTsgaSsrKSB7CiAgICAgICAgICBwYXJzZUNzcyhyLCB0ZXh0KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBjb252ZXJzaW9uIG9mIHNvcnQgdW5pY29kZSBlc2NhcGVzIHdpdGggc3BhY2VzIGxpa2UgYFwzMyBgIChhbmQgbG9uZ2VyKSBpbnRvCiAgICAgKiBleHBhbmRlZCBmb3JtIHRoYXQgZG9lc24ndCByZXF1aXJlIHRyYWlsaW5nIHNwYWNlIGBcMDAwMDMzYAogICAgICogQHBhcmFtIHtzdHJpbmd9IHMKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZnVuY3Rpb24gX2V4cGFuZFVuaWNvZGVFc2NhcGVzKHMpIHsKICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXFwoWzAtOWEtZl17MSw2fSlccy9naSwgZnVuY3Rpb24oKSB7CiAgICAgICAgbGV0IGNvZGUgPSBhcmd1bWVudHNbMV0sCiAgICAgICAgICByZXBlYXQgPSA2IC0gY29kZS5sZW5ndGg7CiAgICAgICAgd2hpbGUgKHJlcGVhdC0tKSB7CiAgICAgICAgICBjb2RlID0gJzAnICsgY29kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICdcXCcgKyBjb2RlOwogICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIHN0cmluZ2lmeSBwYXJzZWQgY3NzLgogICAgICogQHBhcmFtIHtTdHlsZU5vZGV9IG5vZGUKICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHByZXNlcnZlUHJvcGVydGllcwogICAgICogQHBhcmFtIHtzdHJpbmc9fSB0ZXh0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0cmluZ2lmeShub2RlLCBwcmVzZXJ2ZVByb3BlcnRpZXMsIHRleHQgPSAnJykgewogICAgICAvLyBjYWxjIHJ1bGUgY3NzVGV4dAogICAgICBsZXQgY3NzVGV4dCA9ICcnOwogICAgICBpZiAobm9kZVsnY3NzVGV4dCddIHx8IG5vZGVbJ3J1bGVzJ10pIHsKICAgICAgICBsZXQgciQgPSBub2RlWydydWxlcyddOwogICAgICAgIGlmIChyJCAmJiAhX2hhc01peGluUnVsZXMociQpKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMCwgbCA9IHIkLmxlbmd0aCwgcjsKICAgICAgICAgICAgKGkgPCBsKSAmJiAociA9IHIkW2ldKTsgaSsrKSB7CiAgICAgICAgICAgIGNzc1RleHQgPSBzdHJpbmdpZnkociwgcHJlc2VydmVQcm9wZXJ0aWVzLCBjc3NUZXh0KTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY3NzVGV4dCA9IHByZXNlcnZlUHJvcGVydGllcyA/IG5vZGVbJ2Nzc1RleHQnXSA6CiAgICAgICAgICAgIHJlbW92ZUN1c3RvbVByb3BzKG5vZGVbJ2Nzc1RleHQnXSk7CiAgICAgICAgICBjc3NUZXh0ID0gY3NzVGV4dC50cmltKCk7CiAgICAgICAgICBpZiAoY3NzVGV4dCkgewogICAgICAgICAgICBjc3NUZXh0ID0gJyAgJyArIGNzc1RleHQgKyAnXG4nOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBlbWl0IHJ1bGUgaWYgdGhlcmUgaXMgY3NzVGV4dAogICAgICBpZiAoY3NzVGV4dCkgewogICAgICAgIGlmIChub2RlWydzZWxlY3RvciddKSB7CiAgICAgICAgICB0ZXh0ICs9IG5vZGVbJ3NlbGVjdG9yJ10gKyAnICcgKyBPUEVOX0JSQUNFICsgJ1xuJzsKICAgICAgICB9CiAgICAgICAgdGV4dCArPSBjc3NUZXh0OwogICAgICAgIGlmIChub2RlWydzZWxlY3RvciddKSB7CiAgICAgICAgICB0ZXh0ICs9IENMT1NFX0JSQUNFICsgJ1xuXG4nOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGV4dDsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7QXJyYXk8U3R5bGVOb2RlPn0gcnVsZXMKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9oYXNNaXhpblJ1bGVzKHJ1bGVzKSB7CiAgICAgIGxldCByID0gcnVsZXNbMF07CiAgICAgIHJldHVybiBCb29sZWFuKHIpICYmIEJvb2xlYW4oclsnc2VsZWN0b3InXSkgJiYgclsnc2VsZWN0b3InXS5pbmRleE9mKFZBUl9TVEFSVCkgPT09IDA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY3NzVGV4dAogICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVDdXN0b21Qcm9wcyhjc3NUZXh0KSB7CiAgICAgIGNzc1RleHQgPSByZW1vdmVDdXN0b21Qcm9wQXNzaWdubWVudChjc3NUZXh0KTsKICAgICAgcmV0dXJuIHJlbW92ZUN1c3RvbVByb3BBcHBseShjc3NUZXh0KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZUN1c3RvbVByb3BBc3NpZ25tZW50KGNzc1RleHQpIHsKICAgICAgcmV0dXJuIGNzc1RleHQKICAgICAgICAucmVwbGFjZShSWC5jdXN0b21Qcm9wLCAnJykKICAgICAgICAucmVwbGFjZShSWC5taXhpblByb3AsICcnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZUN1c3RvbVByb3BBcHBseShjc3NUZXh0KSB7CiAgICAgIHJldHVybiBjc3NUZXh0CiAgICAgICAgLnJlcGxhY2UoUlgubWl4aW5BcHBseSwgJycpCiAgICAgICAgLnJlcGxhY2UoUlgudmFyQXBwbHksICcnKTsKICAgIH0KCiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IHR5cGVzID0gewogICAgICBTVFlMRV9SVUxFOiAxLAogICAgICBLRVlGUkFNRVNfUlVMRTogNywKICAgICAgTUVESUFfUlVMRTogNCwKICAgICAgTUlYSU5fUlVMRTogMTAwMAogICAgfTsKCiAgICBjb25zdCBPUEVOX0JSQUNFID0gJ3snOwogICAgY29uc3QgQ0xPU0VfQlJBQ0UgPSAnfSc7CgogICAgLy8gaGVscGVyIHJlZ2V4cCdzCiAgICBjb25zdCBSWCA9IHsKICAgICAgY29tbWVudHM6IC9cL1wqW14qXSpcKisoW14vKl1bXipdKlwqKykqXC8vZ2ltLAogICAgICBwb3J0OiAvQGltcG9ydFteO10qOy9naW0sCiAgICAgIGN1c3RvbVByb3A6IC8oPzpeW147XC1cc31dKyk/LS1bXjt7fV0qPzpbXnt9O10qPyg/Ols7XG5dfCQpL2dpbSwKICAgICAgbWl4aW5Qcm9wOiAvKD86XlteO1wtXHN9XSspPy0tW147e31dKj86W157fTtdKj97W159XSo/fSg/Ols7XG5dfCQpPy9naW0sCiAgICAgIG1peGluQXBwbHk6IC9AYXBwbHlccypcKD9bXik7XSpcKT9ccyooPzpbO1xuXXwkKT8vZ2ltLAogICAgICB2YXJBcHBseTogL1teOzpdKj86W147XSo/dmFyXChbXjtdKlwpKD86Wztcbl18JCk/L2dpbSwKICAgICAga2V5ZnJhbWVzUnVsZTogL15AW15cc10qa2V5ZnJhbWVzLywKICAgICAgbXVsdGlwbGVTcGFjZXM6IC9ccysvZwogICAgfTsKCiAgICBjb25zdCBWQVJfU1RBUlQgPSAnLS0nOwogICAgY29uc3QgTUVESUFfU1RBUlQgPSAnQG1lZGlhJzsKICAgIGNvbnN0IEFUX1NUQVJUID0gJ0AnOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgVkFSX0FTU0lHTiA9IC8oPzpefFs7XHN7XVxzKikoLS1bXHctXSo/KVxzKjpccyooPzooKD86Jyg/OlxcJ3wuKSo/J3wiKD86XFwifC4pKj8ifFwoW14pXSo/XCl8W159O3tdKSspfFx7KFtefV0qKVx9KD86KD89Wztcc31dKXwkKSkvZ2k7CiAgICBjb25zdCBNSVhJTl9NQVRDSCA9IC8oPzpefFxXKylAYXBwbHlccypcKD8oW14pO1xuXSopXCk/L2dpOwogICAgY29uc3QgTUVESUFfTUFUQ0ggPSAvQG1lZGlhXHMoLiopLzsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKiBAdHlwZSB7IVNldDxzdHJpbmc+fSAqLwogICAgY29uc3Qgc3R5bGVUZXh0U2V0ID0gbmV3IFNldCgpOwoKICAgIGNvbnN0IHNjb3BpbmdBdHRyaWJ1dGUgPSAnc2hhZHktdW5zY29wZWQnOwoKICAgIC8qKgogICAgICogQWRkIGEgc3BlY2lmaWNhbGx5LW1hcmtlZCBzdHlsZSB0byB0aGUgZG9jdW1lbnQgZGlyZWN0bHksIGFuZCBvbmx5IG9uZSBjb3B5IG9mIHRoYXQgc3R5bGUuCiAgICAgKgogICAgICogQHBhcmFtIHshSFRNTFN0eWxlRWxlbWVudH0gc3R5bGUKICAgICAqIEByZXR1cm4ge3VuZGVmaW5lZH0KICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc1Vuc2NvcGVkU3R5bGUoc3R5bGUpIHsKICAgICAgY29uc3QgdGV4dCA9IHN0eWxlLnRleHRDb250ZW50OwogICAgICBpZiAoIXN0eWxlVGV4dFNldC5oYXModGV4dCkpIHsKICAgICAgICBzdHlsZVRleHRTZXQuYWRkKHRleHQpOwogICAgICAgIGNvbnN0IG5ld1N0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICBuZXdTdHlsZS5zZXRBdHRyaWJ1dGUoJ3NoYWR5LXVuc2NvcGVkJywgJycpOwogICAgICAgIG5ld1N0eWxlLnRleHRDb250ZW50ID0gdGV4dDsKICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKG5ld1N0eWxlKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgYSBzdHlsZSBpcyBzdXBwb3NlZCB0byBiZSB1bnNjb3BlZAogICAgICogQHBhcmFtIHshSFRNTFN0eWxlRWxlbWVudH0gc3R5bGUKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHN0eWxlIGhhcyB0aGUgdW5zY29waW5nIGF0dHJpYnV0ZQogICAgICovCiAgICBmdW5jdGlvbiBpc1Vuc2NvcGVkU3R5bGUoc3R5bGUpIHsKICAgICAgcmV0dXJuIHN0eWxlLmhhc0F0dHJpYnV0ZShzY29waW5nQXR0cmlidXRlKTsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd8U3R5bGVOb2RlfSBydWxlcwogICAgICogQHBhcmFtIHtmdW5jdGlvbihTdHlsZU5vZGUpPX0gY2FsbGJhY2sKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZnVuY3Rpb24gdG9Dc3NUZXh0IChydWxlcywgY2FsbGJhY2spIHsKICAgICAgaWYgKCFydWxlcykgewogICAgICAgIHJldHVybiAnJzsKICAgICAgfQogICAgICBpZiAodHlwZW9mIHJ1bGVzID09PSAnc3RyaW5nJykgewogICAgICAgIHJ1bGVzID0gcGFyc2UocnVsZXMpOwogICAgICB9CiAgICAgIGlmIChjYWxsYmFjaykgewogICAgICAgIGZvckVhY2hSdWxlKHJ1bGVzLCBjYWxsYmFjayk7CiAgICAgIH0KICAgICAgcmV0dXJuIHN0cmluZ2lmeShydWxlcywgbmF0aXZlQ3NzVmFyaWFibGVzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7SFRNTFN0eWxlRWxlbWVudH0gc3R5bGUKICAgICAqIEByZXR1cm4ge1N0eWxlTm9kZX0KICAgICAqLwogICAgZnVuY3Rpb24gcnVsZXNGb3JTdHlsZShzdHlsZSkgewogICAgICBpZiAoIXN0eWxlWydfX2Nzc1J1bGVzJ10gJiYgc3R5bGUudGV4dENvbnRlbnQpIHsKICAgICAgICBzdHlsZVsnX19jc3NSdWxlcyddID0gcGFyc2Uoc3R5bGUudGV4dENvbnRlbnQpOwogICAgICB9CiAgICAgIHJldHVybiBzdHlsZVsnX19jc3NSdWxlcyddIHx8IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge1N0eWxlTm9kZX0gbm9kZQogICAgICogQHBhcmFtIHtGdW5jdGlvbj19IHN0eWxlUnVsZUNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9uPX0ga2V5ZnJhbWVzUnVsZUNhbGxiYWNrCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBvbmx5QWN0aXZlUnVsZXMKICAgICAqLwogICAgZnVuY3Rpb24gZm9yRWFjaFJ1bGUobm9kZSwgc3R5bGVSdWxlQ2FsbGJhY2ssIGtleWZyYW1lc1J1bGVDYWxsYmFjaywgb25seUFjdGl2ZVJ1bGVzKSB7CiAgICAgIGlmICghbm9kZSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgc2tpcFJ1bGVzID0gZmFsc2U7CiAgICAgIGxldCB0eXBlID0gbm9kZVsndHlwZSddOwogICAgICBpZiAob25seUFjdGl2ZVJ1bGVzKSB7CiAgICAgICAgaWYgKHR5cGUgPT09IHR5cGVzLk1FRElBX1JVTEUpIHsKICAgICAgICAgIGxldCBtYXRjaE1lZGlhID0gbm9kZVsnc2VsZWN0b3InXS5tYXRjaChNRURJQV9NQVRDSCk7CiAgICAgICAgICBpZiAobWF0Y2hNZWRpYSkgewogICAgICAgICAgICAvLyBpZiBydWxlIGlzIGEgbm9uIG1hdGNoaW5nIEBtZWRpYSBydWxlLCBza2lwIHN1YnJ1bGVzCiAgICAgICAgICAgIGlmICghd2luZG93Lm1hdGNoTWVkaWEobWF0Y2hNZWRpYVsxXSkubWF0Y2hlcykgewogICAgICAgICAgICAgIHNraXBSdWxlcyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKHR5cGUgPT09IHR5cGVzLlNUWUxFX1JVTEUpIHsKICAgICAgICBzdHlsZVJ1bGVDYWxsYmFjayhub2RlKTsKICAgICAgfSBlbHNlIGlmIChrZXlmcmFtZXNSdWxlQ2FsbGJhY2sgJiYKICAgICAgICB0eXBlID09PSB0eXBlcy5LRVlGUkFNRVNfUlVMRSkgewogICAgICAgIGtleWZyYW1lc1J1bGVDYWxsYmFjayhub2RlKTsKICAgICAgfSBlbHNlIGlmICh0eXBlID09PSB0eXBlcy5NSVhJTl9SVUxFKSB7CiAgICAgICAgc2tpcFJ1bGVzID0gdHJ1ZTsKICAgICAgfQogICAgICBsZXQgciQgPSBub2RlWydydWxlcyddOwogICAgICBpZiAociQgJiYgIXNraXBSdWxlcykgewogICAgICAgIGZvciAobGV0IGk9MCwgbD1yJC5sZW5ndGgsIHI7IChpPGwpICYmIChyPXIkW2ldKTsgaSsrKSB7CiAgICAgICAgICBmb3JFYWNoUnVsZShyLCBzdHlsZVJ1bGVDYWxsYmFjaywga2V5ZnJhbWVzUnVsZUNhbGxiYWNrLCBvbmx5QWN0aXZlUnVsZXMpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogV2FsayBmcm9tIHRleHRbc3RhcnRdIG1hdGNoaW5nIHBhcmVucyBhbmQKICAgICAqIHJldHVybnMgcG9zaXRpb24gb2YgdGhlIG91dGVyIGVuZCBwYXJlbgogICAgICogQHBhcmFtIHtzdHJpbmd9IHRleHQKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydAogICAgICogQHJldHVybiB7bnVtYmVyfQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kTWF0Y2hpbmdQYXJlbih0ZXh0LCBzdGFydCkgewogICAgICBsZXQgbGV2ZWwgPSAwOwogICAgICBmb3IgKGxldCBpPXN0YXJ0LCBsPXRleHQubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgaWYgKHRleHRbaV0gPT09ICcoJykgewogICAgICAgICAgbGV2ZWwrKzsKICAgICAgICB9IGVsc2UgaWYgKHRleHRbaV0gPT09ICcpJykgewogICAgICAgICAgaWYgKC0tbGV2ZWwgPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oc3RyaW5nLCBzdHJpbmcsIHN0cmluZywgc3RyaW5nKX0gY2FsbGJhY2sKICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc1ZhcmlhYmxlQW5kRmFsbGJhY2soc3RyLCBjYWxsYmFjaykgewogICAgICAvLyBmaW5kICd2YXIoJwogICAgICBsZXQgc3RhcnQgPSBzdHIuaW5kZXhPZigndmFyKCcpOwogICAgICBpZiAoc3RhcnQgPT09IC0xKSB7CiAgICAgICAgLy8gbm8gdmFyPywgZXZlcnl0aGluZyBpcyBwcmVmaXgKICAgICAgICByZXR1cm4gY2FsbGJhY2soc3RyLCAnJywgJycsICcnKTsKICAgICAgfQogICAgICAvLyR7cHJlZml4fXZhcigke2lubmVyfSkke3N1ZmZpeH0KICAgICAgbGV0IGVuZCA9IGZpbmRNYXRjaGluZ1BhcmVuKHN0ciwgc3RhcnQgKyAzKTsKICAgICAgbGV0IGlubmVyID0gc3RyLnN1YnN0cmluZyhzdGFydCArIDQsIGVuZCk7CiAgICAgIGxldCBwcmVmaXggPSBzdHIuc3Vic3RyaW5nKDAsIHN0YXJ0KTsKICAgICAgLy8gc3VmZml4IG1heSBoYXZlIG90aGVyIHZhcmlhYmxlcwogICAgICBsZXQgc3VmZml4ID0gcHJvY2Vzc1ZhcmlhYmxlQW5kRmFsbGJhY2soc3RyLnN1YnN0cmluZyhlbmQgKyAxKSwgY2FsbGJhY2spOwogICAgICBsZXQgY29tbWEgPSBpbm5lci5pbmRleE9mKCcsJyk7CiAgICAgIC8vIHZhbHVlIGFuZCBmYWxsYmFjayBhcmdzIHNob3VsZCBiZSB0cmltbWVkIHRvIG1hdGNoIGluIHByb3BlcnR5IGxvb2t1cAogICAgICBpZiAoY29tbWEgPT09IC0xKSB7CiAgICAgICAgLy8gdmFyaWFibGUsIG5vIGZhbGxiYWNrCiAgICAgICAgcmV0dXJuIGNhbGxiYWNrKHByZWZpeCwgaW5uZXIudHJpbSgpLCAnJywgc3VmZml4KTsKICAgICAgfQogICAgICAvLyB2YXIoJHt2YWx1ZX0sJHtmYWxsYmFja30pCiAgICAgIGxldCB2YWx1ZSA9IGlubmVyLnN1YnN0cmluZygwLCBjb21tYSkudHJpbSgpOwogICAgICBsZXQgZmFsbGJhY2sgPSBpbm5lci5zdWJzdHJpbmcoY29tbWEgKyAxKS50cmltKCk7CiAgICAgIHJldHVybiBjYWxsYmFjayhwcmVmaXgsIHZhbHVlLCBmYWxsYmFjaywgc3VmZml4KTsKICAgIH0KCiAgICAvKioKICAgICAqIEB0eXBlIHtmdW5jdGlvbigqKToqfQogICAgICovCiAgICBjb25zdCB3cmFwJDEgPSB3aW5kb3dbJ1NoYWR5RE9NJ10gJiYgd2luZG93WydTaGFkeURPTSddWyd3cmFwJ10gfHwgKChub2RlKSA9PiBub2RlKTsKCiAgICAvKioKICAgICAqIEBwYXJhbSB7RWxlbWVudCB8IHtpczogc3RyaW5nLCBleHRlbmRzOiBzdHJpbmd9fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHt7aXM6IHN0cmluZywgdHlwZUV4dGVuc2lvbjogc3RyaW5nfX0KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SXNFeHRlbmRzKGVsZW1lbnQpIHsKICAgICAgbGV0IGxvY2FsTmFtZSA9IGVsZW1lbnRbJ2xvY2FsTmFtZSddOwogICAgICBsZXQgaXMgPSAnJywgdHlwZUV4dGVuc2lvbiA9ICcnOwogICAgICAvKgogICAgICBOT1RFOiB0ZWNobmljYWxseSwgdGhpcyBjYW4gYmUgd3JvbmcgZm9yIGNlcnRhaW4gc3ZnIGVsZW1lbnRzCiAgICAgIHdpdGggYC1gIGluIHRoZSBuYW1lIGxpa2UgYDxmb250LWZhY2U+YAogICAgICAqLwogICAgICBpZiAobG9jYWxOYW1lKSB7CiAgICAgICAgaWYgKGxvY2FsTmFtZS5pbmRleE9mKCctJykgPiAtMSkgewogICAgICAgICAgaXMgPSBsb2NhbE5hbWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHR5cGVFeHRlbnNpb24gPSBsb2NhbE5hbWU7CiAgICAgICAgICBpcyA9IChlbGVtZW50LmdldEF0dHJpYnV0ZSAmJiBlbGVtZW50LmdldEF0dHJpYnV0ZSgnaXMnKSkgfHwgJyc7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGlzID0gLyoqIEB0eXBlIHs/fSAqLyhlbGVtZW50KS5pczsKICAgICAgICB0eXBlRXh0ZW5zaW9uID0gLyoqIEB0eXBlIHs/fSAqLyhlbGVtZW50KS5leHRlbmRzOwogICAgICB9CiAgICAgIHJldHVybiB7aXMsIHR5cGVFeHRlbnNpb259OwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtFbGVtZW50fERvY3VtZW50RnJhZ21lbnR9IGVsZW1lbnQKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZnVuY3Rpb24gZ2F0aGVyU3R5bGVUZXh0KGVsZW1lbnQpIHsKICAgICAgLyoqIEB0eXBlIHshQXJyYXk8c3RyaW5nPn0gKi8KICAgICAgY29uc3Qgc3R5bGVUZXh0UGFydHMgPSBbXTsKICAgICAgY29uc3Qgc3R5bGVzID0gLyoqIEB0eXBlIHshTm9kZUxpc3Q8IUhUTUxTdHlsZUVsZW1lbnQ+fSAqLyhlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJykpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKykgewogICAgICAgIGNvbnN0IHN0eWxlID0gc3R5bGVzW2ldOwogICAgICAgIGlmIChpc1Vuc2NvcGVkU3R5bGUoc3R5bGUpKSB7CiAgICAgICAgICBpZiAoIW5hdGl2ZVNoYWRvdykgewogICAgICAgICAgICBwcm9jZXNzVW5zY29wZWRTdHlsZShzdHlsZSk7CiAgICAgICAgICAgIHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHlsZVRleHRQYXJ0cy5wdXNoKHN0eWxlLnRleHRDb250ZW50KTsKICAgICAgICAgIHN0eWxlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gc3R5bGVUZXh0UGFydHMuam9pbignJykudHJpbSgpOwogICAgfQoKICAgIGNvbnN0IENTU19CVUlMRF9BVFRSID0gJ2Nzcy1idWlsZCc7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdGhlIHBvbHltZXItY3NzLWJ1aWxkICJidWlsZCB0eXBlIiBhcHBsaWVkIHRvIHRoaXMgZWxlbWVudAogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IENhbiBiZSAiIiwgInNoYWR5Iiwgb3IgInNoYWRvdyIKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q3NzQnVpbGQoZWxlbWVudCkgewogICAgICBpZiAoY3NzQnVpbGQgIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiAvKiogQHR5cGUge3N0cmluZ30gKi8oY3NzQnVpbGQpOwogICAgICB9CiAgICAgIGlmIChlbGVtZW50Ll9fY3NzQnVpbGQgPT09IHVuZGVmaW5lZCkgewogICAgICAgIC8vIHRyeSBhdHRyaWJ1dGUgZmlyc3QsIGFzIGl0IGlzIHRoZSBjb21tb24gY2FzZQogICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IGVsZW1lbnQuZ2V0QXR0cmlidXRlKENTU19CVUlMRF9BVFRSKTsKICAgICAgICBpZiAoYXR0clZhbHVlKSB7CiAgICAgICAgICBlbGVtZW50Ll9fY3NzQnVpbGQgPSBhdHRyVmFsdWU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnN0IGJ1aWxkQ29tbWVudCA9IGdldEJ1aWxkQ29tbWVudChlbGVtZW50KTsKICAgICAgICAgIGlmIChidWlsZENvbW1lbnQgIT09ICcnKSB7CiAgICAgICAgICAgIC8vIHJlbW92ZSBidWlsZCBjb21tZW50IHNvIGl0IGlzIG5vdCBuZWVkbGVzc2x5IGNvcGllZCBpbnRvIGV2ZXJ5IGVsZW1lbnQgaW5zdGFuY2UKICAgICAgICAgICAgcmVtb3ZlQnVpbGRDb21tZW50KGVsZW1lbnQpOwogICAgICAgICAgfQogICAgICAgICAgZWxlbWVudC5fX2Nzc0J1aWxkID0gYnVpbGRDb21tZW50OwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZWxlbWVudC5fX2Nzc0J1aWxkIHx8ICcnOwogICAgfQoKICAgIC8qKgogICAgICogQ2hlY2sgaWYgdGhlIGdpdmVuIGVsZW1lbnQsIGVpdGhlciBhIDx0ZW1wbGF0ZT4gb3IgPHN0eWxlPiwgaGFzIGJlZW4gcHJvY2Vzc2VkCiAgICAgKiBieSBwb2x5bWVyLWNzcy1idWlsZC4KICAgICAqCiAgICAgKiBJZiBzbywgdGhlbiB3ZSBjYW4gbWFrZSBhIG51bWJlciBvZiBvcHRpbWl6YXRpb25zOgogICAgICogLSBwb2x5bWVyLWNzcy1idWlsZCB3aWxsIGRlY29tcG9zZSBtaXhpbnMgaW50byBpbmRpdmlkdWFsIENTUyBDdXN0b20gUHJvcGVydGllcywKICAgICAqIHNvIHRoZSBBcHBseVNoaW0gY2FuIGJlIHNraXBwZWQgZW50aXJlbHkuCiAgICAgKiAtIFVuZGVyIG5hdGl2ZSBTaGFkb3dET00sIHRoZSBzdHlsZSB0ZXh0IGNhbiBqdXN0IGJlIGNvcGllZCBpbnRvIGVhY2ggaW5zdGFuY2UKICAgICAqIHdpdGhvdXQgbW9kaWZpY2F0aW9uCiAgICAgKiAtIElmIHRoZSBidWlsZCBpcyAic2hhZHkiIGFuZCBTaGFkeURPTSBpcyBpbiB1c2UsIHRoZSBzdHlsaW5nIGRvZXMgbm90IG5lZWQKICAgICAqIHNjb3BpbmcgYmV5b25kIHRoZSBzaGltbWluZyBvZiBDU1MgQ3VzdG9tIFByb3BlcnRpZXMKICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWxlbWVudAogICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAqLwogICAgZnVuY3Rpb24gZWxlbWVudEhhc0J1aWx0Q3NzKGVsZW1lbnQpIHsKICAgICAgcmV0dXJuIGdldENzc0J1aWxkKGVsZW1lbnQpICE9PSAnJzsKICAgIH0KCiAgICAvKioKICAgICAqIEZvciB0ZW1wbGF0ZXMgbWFkZSB3aXRoIHRhZ2dlZCB0ZW1wbGF0ZSBsaXRlcmFscywgcG9seW1lci1jc3MtYnVpbGQgd2lsbAogICAgICogaW5zZXJ0IGEgY29tbWVudCBvZiB0aGUgZm9ybSBgPCEtLWNzcy1idWlsZDpzaGFkb3ctLT5gCiAgICAgKgogICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsZW1lbnQKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QnVpbGRDb21tZW50KGVsZW1lbnQpIHsKICAgICAgY29uc3QgYnVpbGRDb21tZW50ID0gZWxlbWVudC5sb2NhbE5hbWUgPT09ICd0ZW1wbGF0ZScgPwogICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8gKGVsZW1lbnQpLmNvbnRlbnQuZmlyc3RDaGlsZCA6CiAgICAgICAgICBlbGVtZW50LmZpcnN0Q2hpbGQ7CiAgICAgIGlmIChidWlsZENvbW1lbnQgaW5zdGFuY2VvZiBDb21tZW50KSB7CiAgICAgICAgY29uc3QgY29tbWVudFBhcnRzID0gYnVpbGRDb21tZW50LnRleHRDb250ZW50LnRyaW0oKS5zcGxpdCgnOicpOwogICAgICAgIGlmIChjb21tZW50UGFydHNbMF0gPT09IENTU19CVUlMRF9BVFRSKSB7CiAgICAgICAgICByZXR1cm4gY29tbWVudFBhcnRzWzFdOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWxlbWVudAogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVCdWlsZENvbW1lbnQoZWxlbWVudCkgewogICAgICBjb25zdCBidWlsZENvbW1lbnQgPSBlbGVtZW50LmxvY2FsTmFtZSA9PT0gJ3RlbXBsYXRlJyA/CiAgICAgICAgICAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyAoZWxlbWVudCkuY29udGVudC5maXJzdENoaWxkIDoKICAgICAgICAgIGVsZW1lbnQuZmlyc3RDaGlsZDsKICAgICAgYnVpbGRDb21tZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoYnVpbGRDb21tZW50KTsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMKICAgICAqLwogICAgZnVuY3Rpb24gdXBkYXRlTmF0aXZlUHJvcGVydGllcyhlbGVtZW50LCBwcm9wZXJ0aWVzKSB7CiAgICAgIC8vIHJlbW92ZSBwcmV2aW91cyBwcm9wZXJ0aWVzCiAgICAgIGZvciAobGV0IHAgaW4gcHJvcGVydGllcykgewogICAgICAgIC8vIE5PVEU6IGZvciBiYyB3aXRoIHNoaW0sIGRvbid0IGFwcGx5IG51bGwgdmFsdWVzLgogICAgICAgIGlmIChwID09PSBudWxsKSB7CiAgICAgICAgICBlbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHAsIHByb3BlcnRpZXNbcF0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkKICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKGVsZW1lbnQsIHByb3BlcnR5KSB7CiAgICAgIC8qKgogICAgICAgKiBAY29uc3Qge3N0cmluZ30KICAgICAgICovCiAgICAgIGNvbnN0IHZhbHVlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZShwcm9wZXJ0eSk7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICByZXR1cm4gJyc7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLnRyaW0oKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogcmV0dXJuIHRydWUgaWYgYGNzc1RleHRgIGNvbnRhaW5zIGEgbWl4aW4gZGVmaW5pdGlvbiBvciBjb25zdW1wdGlvbgogICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc1RleHQKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRldGVjdE1peGluKGNzc1RleHQpIHsKICAgICAgY29uc3QgaGFzID0gTUlYSU5fTUFUQ0gudGVzdChjc3NUZXh0KSB8fCBWQVJfQVNTSUdOLnRlc3QoY3NzVGV4dCk7CiAgICAgIC8vIHJlc2V0IHN0YXRlIG9mIHRoZSByZWdleGVzCiAgICAgIE1JWElOX01BVENILmxhc3RJbmRleCA9IDA7CiAgICAgIFZBUl9BU1NJR04ubGFzdEluZGV4ID0gMDsKICAgICAgcmV0dXJuIGhhczsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGNvbnN0IEFQUExZX05BTUVfQ0xFQU4gPSAvO1xzKi9tOwogICAgY29uc3QgSU5JVElBTF9JTkhFUklUID0gL15ccyooaW5pdGlhbCl8KGluaGVyaXQpXHMqJC87CiAgICBjb25zdCBJTVBPUlRBTlQgPSAvXHMqIWltcG9ydGFudC87CgogICAgLy8gc2VwYXJhdG9yIHVzZWQgYmV0d2VlbiBtaXhpbi1uYW1lIGFuZCBtaXhpbi1wcm9wZXJ0eS1uYW1lIHdoZW4gcHJvZHVjaW5nIHByb3BlcnRpZXMKICAgIC8vIE5PVEU6IHBsYWluICctJyBtYXkgY2F1c2UgY29sbGlzaW9ucyBpbiB1c2VyIHN0eWxlcwogICAgY29uc3QgTUlYSU5fVkFSX1NFUCA9ICdfLV8nOwoKICAgIC8vIG1hcCBvZiBtaXhpbiB0byBwcm9wZXJ0eSBuYW1lcwogICAgLy8gLS1mb286IHtib3JkZXI6IDJweH0gLT4ge3Byb3BlcnRpZXM6IHsoLS1mb28sIFsnYm9yZGVyJ10pfSwgZGVwZW5kYW50czogeydlbGVtZW50LW5hbWUnOiBwcm90b319CiAgICBjbGFzcyBNaXhpbk1hcCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIC8qKiBAdHlwZSB7IU9iamVjdDxzdHJpbmcsICFNaXhpbk1hcEVudHJ5Pn0gKi8KICAgICAgICB0aGlzLl9tYXAgPSB7fTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKICAgICAgICogQHBhcmFtIHshUHJvcGVydHlFbnRyeX0gcHJvcHMKICAgICAgICovCiAgICAgIHNldChuYW1lLCBwcm9wcykgewogICAgICAgIG5hbWUgPSBuYW1lLnRyaW0oKTsKICAgICAgICB0aGlzLl9tYXBbbmFtZV0gPSB7CiAgICAgICAgICBwcm9wZXJ0aWVzOiBwcm9wcywKICAgICAgICAgIGRlcGVuZGFudHM6IHt9CiAgICAgICAgfTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUKICAgICAgICogQHJldHVybiB7TWl4aW5NYXBFbnRyeX0KICAgICAgICovCiAgICAgIGdldChuYW1lKSB7CiAgICAgICAgbmFtZSA9IG5hbWUudHJpbSgpOwogICAgICAgIHJldHVybiB0aGlzLl9tYXBbbmFtZV0gfHwgbnVsbDsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQ2FsbGJhY2sgZm9yIHdoZW4gYW4gZWxlbWVudCBpcyBtYXJrZWQgaW52YWxpZAogICAgICogQHR5cGUgez9mdW5jdGlvbihzdHJpbmcpfQogICAgICovCiAgICBsZXQgaW52YWxpZENhbGxiYWNrID0gbnVsbDsKCiAgICAvKiogQHVucmVzdHJpY3RlZCAqLwogICAgY2xhc3MgQXBwbHlTaGltIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/c3RyaW5nfSAqLwogICAgICAgIHRoaXMuX2N1cnJlbnRFbGVtZW50ID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUge0hUTUxNZXRhRWxlbWVudH0gKi8KICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudCA9IG51bGw7CiAgICAgICAgdGhpcy5fbWFwID0gbmV3IE1peGluTWFwKCk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIHJldHVybiB0cnVlIGlmIGBjc3NUZXh0YCBjb250YWlucyBhIG1peGluIGRlZmluaXRpb24gb3IgY29uc3VtcHRpb24KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc1RleHQKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICovCiAgICAgIGRldGVjdE1peGluKGNzc1RleHQpIHsKICAgICAgICByZXR1cm4gZGV0ZWN0TWl4aW4oY3NzVGV4dCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBHYXRoZXIgc3R5bGVzIGludG8gb25lIHN0eWxlIGZvciBlYXNpZXIgcHJvY2Vzc2luZwogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZQogICAgICAgKiBAcmV0dXJuIHtIVE1MU3R5bGVFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2F0aGVyU3R5bGVzKHRlbXBsYXRlKSB7CiAgICAgICAgY29uc3Qgc3R5bGVUZXh0ID0gZ2F0aGVyU3R5bGVUZXh0KHRlbXBsYXRlLmNvbnRlbnQpOwogICAgICAgIGlmIChzdHlsZVRleHQpIHsKICAgICAgICAgIGNvbnN0IHN0eWxlID0gLyoqIEB0eXBlIHshSFRNTFN0eWxlRWxlbWVudH0gKi8oZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKSk7CiAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHN0eWxlVGV4dDsKICAgICAgICAgIHRlbXBsYXRlLmNvbnRlbnQuaW5zZXJ0QmVmb3JlKHN0eWxlLCB0ZW1wbGF0ZS5jb250ZW50LmZpcnN0Q2hpbGQpOwogICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAqIEByZXR1cm4ge1N0eWxlTm9kZX0KICAgICAgICovCiAgICAgIHRyYW5zZm9ybVRlbXBsYXRlKHRlbXBsYXRlLCBlbGVtZW50TmFtZSkgewogICAgICAgIGlmICh0ZW1wbGF0ZS5fZ2F0aGVyZWRTdHlsZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICB0ZW1wbGF0ZS5fZ2F0aGVyZWRTdHlsZSA9IHRoaXMuZ2F0aGVyU3R5bGVzKHRlbXBsYXRlKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLwogICAgICAgIGNvbnN0IHN0eWxlID0gdGVtcGxhdGUuX2dhdGhlcmVkU3R5bGU7CiAgICAgICAgcmV0dXJuIHN0eWxlID8gdGhpcy50cmFuc2Zvcm1TdHlsZShzdHlsZSwgZWxlbWVudE5hbWUpIDogbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHBhcmFtIHshSFRNTFN0eWxlRWxlbWVudH0gc3R5bGUKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAqIEByZXR1cm4ge1N0eWxlTm9kZX0KICAgICAgICovCiAgICAgIHRyYW5zZm9ybVN0eWxlKHN0eWxlLCBlbGVtZW50TmFtZSA9ICcnKSB7CiAgICAgICAgbGV0IGFzdCA9IHJ1bGVzRm9yU3R5bGUoc3R5bGUpOwogICAgICAgIHRoaXMudHJhbnNmb3JtUnVsZXMoYXN0LCBlbGVtZW50TmFtZSk7CiAgICAgICAgc3R5bGUudGV4dENvbnRlbnQgPSB0b0Nzc1RleHQoYXN0KTsKICAgICAgICByZXR1cm4gYXN0OwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0geyFIVE1MU3R5bGVFbGVtZW50fSBzdHlsZQogICAgICAgKiBAcmV0dXJuIHtTdHlsZU5vZGV9CiAgICAgICAqLwogICAgICB0cmFuc2Zvcm1DdXN0b21TdHlsZShzdHlsZSkgewogICAgICAgIGxldCBhc3QgPSBydWxlc0ZvclN0eWxlKHN0eWxlKTsKICAgICAgICBmb3JFYWNoUnVsZShhc3QsIChydWxlKSA9PiB7CiAgICAgICAgICBpZiAocnVsZVsnc2VsZWN0b3InXSA9PT0gJzpyb290JykgewogICAgICAgICAgICBydWxlWydzZWxlY3RvciddID0gJ2h0bWwnOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy50cmFuc2Zvcm1SdWxlKHJ1bGUpOwogICAgICAgIH0pOwogICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gdG9Dc3NUZXh0KGFzdCk7CiAgICAgICAgcmV0dXJuIGFzdDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHBhcmFtIHtTdHlsZU5vZGV9IHJ1bGVzCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbGVtZW50TmFtZQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtUnVsZXMocnVsZXMsIGVsZW1lbnROYW1lKSB7CiAgICAgICAgdGhpcy5fY3VycmVudEVsZW1lbnQgPSBlbGVtZW50TmFtZTsKICAgICAgICBmb3JFYWNoUnVsZShydWxlcywgKHIpID0+IHsKICAgICAgICAgIHRoaXMudHJhbnNmb3JtUnVsZShyKTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLl9jdXJyZW50RWxlbWVudCA9IG51bGw7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7IVN0eWxlTm9kZX0gcnVsZQogICAgICAgKi8KICAgICAgdHJhbnNmb3JtUnVsZShydWxlKSB7CiAgICAgICAgcnVsZVsnY3NzVGV4dCddID0gdGhpcy50cmFuc2Zvcm1Dc3NUZXh0KHJ1bGVbJ3BhcnNlZENzc1RleHQnXSwgcnVsZSk7CiAgICAgICAgLy8gOnJvb3Qgd2FzIG9ubHkgdXNlZCBmb3IgdmFyaWFibGUgYXNzaWdubWVudCBpbiBwcm9wZXJ0eSBzaGltLAogICAgICAgIC8vIGJ1dCBnZW5lcmF0ZXMgaW52YWxpZCBzZWxlY3RvcnMgd2l0aCByZWFsIHByb3BlcnRpZXMuCiAgICAgICAgLy8gcmVwbGFjZSB3aXRoIGA6aG9zdCA+ICpgLCB3aGljaCBzZXJ2ZXMgdGhlIHNhbWUgZWZmZWN0CiAgICAgICAgaWYgKHJ1bGVbJ3NlbGVjdG9yJ10gPT09ICc6cm9vdCcpIHsKICAgICAgICAgIHJ1bGVbJ3NlbGVjdG9yJ10gPSAnOmhvc3QgPiAqJzsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NUZXh0CiAgICAgICAqIEBwYXJhbSB7IVN0eWxlTm9kZX0gcnVsZQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgICAqLwogICAgICB0cmFuc2Zvcm1Dc3NUZXh0KGNzc1RleHQsIHJ1bGUpIHsKICAgICAgICAvLyBwcm9kdWNlIHZhcmlhYmxlcwogICAgICAgIGNzc1RleHQgPSBjc3NUZXh0LnJlcGxhY2UoVkFSX0FTU0lHTiwgKG1hdGNoVGV4dCwgcHJvcGVydHlOYW1lLCB2YWx1ZVByb3BlcnR5LCB2YWx1ZU1peGluKSA9PgogICAgICAgICAgdGhpcy5fcHJvZHVjZUNzc1Byb3BlcnRpZXMobWF0Y2hUZXh0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlUHJvcGVydHksIHZhbHVlTWl4aW4sIHJ1bGUpKTsKICAgICAgICAvLyBjb25zdW1lIG1peGlucwogICAgICAgIHJldHVybiB0aGlzLl9jb25zdW1lQ3NzUHJvcGVydGllcyhjc3NUZXh0LCBydWxlKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAgICovCiAgICAgIF9nZXRJbml0aWFsVmFsdWVGb3JQcm9wZXJ0eShwcm9wZXJ0eSkgewogICAgICAgIGlmICghdGhpcy5fbWVhc3VyZUVsZW1lbnQpIHsKICAgICAgICAgIHRoaXMuX21lYXN1cmVFbGVtZW50ID0gLyoqIEB0eXBlIHtIVE1MTWV0YUVsZW1lbnR9ICovKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ21ldGEnKSk7CiAgICAgICAgICB0aGlzLl9tZWFzdXJlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FwcGx5LXNoaW0tbWVhc3VyZScsICcnKTsKICAgICAgICAgIHRoaXMuX21lYXN1cmVFbGVtZW50LnN0eWxlLmFsbCA9ICdpbml0aWFsJzsKICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGhpcy5fbWVhc3VyZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5fbWVhc3VyZUVsZW1lbnQpLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBXYWxrIG92ZXIgYWxsIHJ1bGVzIGJlZm9yZSB0aGlzIHJ1bGUgdG8gZmluZCBmYWxsYmFja3MgZm9yIG1peGlucwogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFTdHlsZU5vZGV9IHN0YXJ0UnVsZQogICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fQogICAgICAgKi8KICAgICAgX2ZhbGxiYWNrc0Zyb21QcmV2aW91c1J1bGVzKHN0YXJ0UnVsZSkgewogICAgICAgIC8vIGZpbmQgdGhlICJ0b3AiIHJ1bGUKICAgICAgICBsZXQgdG9wUnVsZSA9IHN0YXJ0UnVsZTsKICAgICAgICB3aGlsZSAodG9wUnVsZVsncGFyZW50J10pIHsKICAgICAgICAgIHRvcFJ1bGUgPSB0b3BSdWxlWydwYXJlbnQnXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZmFsbGJhY2tzID0ge307CiAgICAgICAgbGV0IHNlZW5TdGFydFJ1bGUgPSBmYWxzZTsKICAgICAgICBmb3JFYWNoUnVsZSh0b3BSdWxlLCAocikgPT4gewogICAgICAgICAgLy8gc3RvcCB3aGVuIHdlIGhpdCB0aGUgaW5wdXQgcnVsZQogICAgICAgICAgc2VlblN0YXJ0UnVsZSA9IHNlZW5TdGFydFJ1bGUgfHwgciA9PT0gc3RhcnRSdWxlOwogICAgICAgICAgaWYgKHNlZW5TdGFydFJ1bGUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgLy8gTk9URTogT25seSBtYXRjaGluZyBzZWxlY3RvcnMgYXJlICJzYWZlIiBmb3IgdGhpcyBmYWxsYmFjayBwcm9jZXNzaW5nCiAgICAgICAgICAvLyBJdCB3b3VsZCBiZSBwcm9oaWJpdGl2ZSB0byBydW4gYG1hdGNoZXNTZWxlY3RvcigpYCBvbiBlYWNoIHNlbGVjdG9yLAogICAgICAgICAgLy8gc28gd2UgY2hlYXQgYW5kIG9ubHkgY2hlY2sgaWYgdGhlIHNhbWUgc2VsZWN0b3Igc3RyaW5nIGlzIHVzZWQsIHdoaWNoCiAgICAgICAgICAvLyBndWFyYW50ZWVzIHRoaW5ncyBsaWtlIHNwZWNpZmljaXR5IG1hdGNoaW5nCiAgICAgICAgICBpZiAoclsnc2VsZWN0b3InXSA9PT0gc3RhcnRSdWxlWydzZWxlY3RvciddKSB7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oZmFsbGJhY2tzLCB0aGlzLl9jc3NUZXh0VG9NYXAoclsncGFyc2VkQ3NzVGV4dCddKSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGZhbGxiYWNrczsKICAgICAgfQogICAgICAvKioKICAgICAgICogcmVwbGFjZSBtaXhpbiBjb25zdW1wdGlvbiB3aXRoIHZhcmlhYmxlIGNvbnN1bXB0aW9uCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0CiAgICAgICAqIEBwYXJhbSB7IVN0eWxlTm9kZT19IHJ1bGUKICAgICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICAgKi8KICAgICAgX2NvbnN1bWVDc3NQcm9wZXJ0aWVzKHRleHQsIHJ1bGUpIHsKICAgICAgICAvKiogQHR5cGUge0FycmF5fSAqLwogICAgICAgIGxldCBtID0gbnVsbDsKICAgICAgICAvLyBsb29wIG92ZXIgdGV4dCB1bnRpbCBhbGwgbWl4aW5zIHdpdGggZGVmaW50aW9ucyBoYXZlIGJlZW4gYXBwbGllZAogICAgICAgIHdoaWxlKChtID0gTUlYSU5fTUFUQ0guZXhlYyh0ZXh0KSkpIHsKICAgICAgICAgIGxldCBtYXRjaFRleHQgPSBtWzBdOwogICAgICAgICAgbGV0IG1peGluTmFtZSA9IG1bMV07CiAgICAgICAgICBsZXQgaWR4ID0gbS5pbmRleDsKICAgICAgICAgIC8vIGNvbGxlY3QgcHJvcGVydGllcyBiZWZvcmUgYXBwbHkgdG8gYmUgImRlZmF1bHRzIiBpZiBtaXhpbiBtaWdodCBvdmVycmlkZSB0aGVtCiAgICAgICAgICAvLyBtYXRjaCBpbmNsdWRlcyBhICJwcmVmaXgiLCBzbyBmaW5kIHRoZSBzdGFydCBhbmQgZW5kIHBvc2l0aW9ucyBvZiBAYXBwbHkKICAgICAgICAgIGxldCBhcHBseVBvcyA9IGlkeCArIG1hdGNoVGV4dC5pbmRleE9mKCdAYXBwbHknKTsKICAgICAgICAgIGxldCBhZnRlckFwcGx5UG9zID0gaWR4ICsgbWF0Y2hUZXh0Lmxlbmd0aDsKICAgICAgICAgIC8vIGZpbmQgcHJvcHMgZGVmaW5lZCBiZWZvcmUgdGhpcyBAYXBwbHkKICAgICAgICAgIGxldCB0ZXh0QmVmb3JlQXBwbHkgPSB0ZXh0LnNsaWNlKDAsIGFwcGx5UG9zKTsKICAgICAgICAgIGxldCB0ZXh0QWZ0ZXJBcHBseSA9IHRleHQuc2xpY2UoYWZ0ZXJBcHBseVBvcyk7CiAgICAgICAgICBsZXQgZGVmYXVsdHMgPSBydWxlID8gdGhpcy5fZmFsbGJhY2tzRnJvbVByZXZpb3VzUnVsZXMocnVsZSkgOiB7fTsKICAgICAgICAgIE9iamVjdC5hc3NpZ24oZGVmYXVsdHMsIHRoaXMuX2Nzc1RleHRUb01hcCh0ZXh0QmVmb3JlQXBwbHkpKTsKICAgICAgICAgIGxldCByZXBsYWNlbWVudCA9IHRoaXMuX2F0QXBwbHlUb0Nzc1Byb3BlcnRpZXMobWl4aW5OYW1lLCBkZWZhdWx0cyk7CiAgICAgICAgICAvLyB1c2UgcmVnZXggbWF0Y2ggcG9zaXRpb24gdG8gcmVwbGFjZSBtaXhpbiwga2VlcCBsaW5lYXIgcHJvY2Vzc2luZyB0aW1lCiAgICAgICAgICB0ZXh0ID0gYCR7dGV4dEJlZm9yZUFwcGx5fSR7cmVwbGFjZW1lbnR9JHt0ZXh0QWZ0ZXJBcHBseX1gOwogICAgICAgICAgLy8gbW92ZSByZWdleCBzZWFyY2ggdG8gX2FmdGVyXyByZXBsYWNlbWVudAogICAgICAgICAgTUlYSU5fTUFUQ0gubGFzdEluZGV4ID0gaWR4ICsgcmVwbGFjZW1lbnQubGVuZ3RoOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dDsKICAgICAgfQogICAgICAvKioKICAgICAgICogcHJvZHVjZSB2YXJpYWJsZSBjb25zdW1wdGlvbiBhdCB0aGUgc2l0ZSBvZiBtaXhpbiBjb25zdW1wdGlvbgogICAgICAgKiBgQGFwcGx5YCAtLWZvbzsgLT4gZm9yIGFsbCBwcm9wcyAoJHtwcm9wbmFtZX06IHZhcigtLWZvb18tXyR7cHJvcG5hbWV9LCAke2ZhbGxiYWNrW3Byb3BuYW1lXX19KSkKICAgICAgICogRXhhbXBsZToKICAgICAgICogIGJvcmRlcjogdmFyKC0tZm9vXy1fYm9yZGVyKTsgcGFkZGluZzogdmFyKC0tZm9vXy1fcGFkZGluZywgMnB4KQogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbWl4aW5OYW1lCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBmYWxsYmFja3MKICAgICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICAgKi8KICAgICAgX2F0QXBwbHlUb0Nzc1Byb3BlcnRpZXMobWl4aW5OYW1lLCBmYWxsYmFja3MpIHsKICAgICAgICBtaXhpbk5hbWUgPSBtaXhpbk5hbWUucmVwbGFjZShBUFBMWV9OQU1FX0NMRUFOLCAnJyk7CiAgICAgICAgbGV0IHZhcnMgPSBbXTsKICAgICAgICBsZXQgbWl4aW5FbnRyeSA9IHRoaXMuX21hcC5nZXQobWl4aW5OYW1lKTsKICAgICAgICAvLyBpZiB3ZSBkZXBlbmQgb24gYSBtaXhpbiBiZWZvcmUgaXQgaXMgY3JlYXRlZAogICAgICAgIC8vIG1ha2UgYSBzZW50aW5lbCBlbnRyeSBpbiB0aGUgbWFwIHRvIGFkZCB0aGlzIGVsZW1lbnQgYXMgYSBkZXBlbmRlbmN5IGZvciB3aGVuIGl0IGlzIGRlZmluZWQuCiAgICAgICAgaWYgKCFtaXhpbkVudHJ5KSB7CiAgICAgICAgICB0aGlzLl9tYXAuc2V0KG1peGluTmFtZSwge30pOwogICAgICAgICAgbWl4aW5FbnRyeSA9IHRoaXMuX21hcC5nZXQobWl4aW5OYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKG1peGluRW50cnkpIHsKICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50RWxlbWVudCkgewogICAgICAgICAgICBtaXhpbkVudHJ5LmRlcGVuZGFudHNbdGhpcy5fY3VycmVudEVsZW1lbnRdID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBwLCBwYXJ0cywgZjsKICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSBtaXhpbkVudHJ5LnByb3BlcnRpZXM7CiAgICAgICAgICBmb3IgKHAgaW4gcHJvcGVydGllcykgewogICAgICAgICAgICBmID0gZmFsbGJhY2tzICYmIGZhbGxiYWNrc1twXTsKICAgICAgICAgICAgcGFydHMgPSBbcCwgJzogdmFyKCcsIG1peGluTmFtZSwgTUlYSU5fVkFSX1NFUCwgcF07CiAgICAgICAgICAgIGlmIChmKSB7CiAgICAgICAgICAgICAgcGFydHMucHVzaCgnLCcsIGYucmVwbGFjZShJTVBPUlRBTlQsICcnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFydHMucHVzaCgnKScpOwogICAgICAgICAgICBpZiAoSU1QT1JUQU5ULnRlc3QocHJvcGVydGllc1twXSkpIHsKICAgICAgICAgICAgICBwYXJ0cy5wdXNoKCcgIWltcG9ydGFudCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhcnMucHVzaChwYXJ0cy5qb2luKCcnKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YXJzLmpvaW4oJzsgJyk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAgICovCiAgICAgIF9yZXBsYWNlSW5pdGlhbE9ySW5oZXJpdChwcm9wZXJ0eSwgdmFsdWUpIHsKICAgICAgICBsZXQgbWF0Y2ggPSBJTklUSUFMX0lOSEVSSVQuZXhlYyh2YWx1ZSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICBpZiAobWF0Y2hbMV0pIHsKICAgICAgICAgICAgLy8gaW5pdGlhbAogICAgICAgICAgICAvLyByZXBsYWNlIGBpbml0aWFsYCB3aXRoIHRoZSBjb25jcmV0ZSBpbml0aWFsIHZhbHVlIGZvciB0aGlzIHByb3BlcnR5CiAgICAgICAgICAgIHZhbHVlID0gdGhpcy5fZ2V0SW5pdGlhbFZhbHVlRm9yUHJvcGVydHkocHJvcGVydHkpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gaW5oZXJpdAogICAgICAgICAgICAvLyB3aXRoIHRoaXMgcHVycG9zZnVsbHkgaWxsZWdhbCB2YWx1ZSwgdGhlIHZhcmlhYmxlIHdpbGwgYmUgaW52YWxpZCBhdAogICAgICAgICAgICAvLyBjb21wdXRlIHRpbWUgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MtdmFyaWFibGVzLyNpbnZhbGlkLWF0LWNvbXB1dGVkLXZhbHVlLXRpbWUpCiAgICAgICAgICAgIC8vIGFuZCBmb3IgaW5oZXJpdGluZyB2YWx1ZXMsIHdpbGwgYmVoYXZlIHNpbWlsYXJseQogICAgICAgICAgICAvLyB3ZSBjYW5ub3Qgc3VwcG9ydCB0aGUgc2FtZSBiZWhhdmlvciBmb3Igbm9uIGluaGVyaXRpbmcgdmFsdWVzIGxpa2UgJ2JvcmRlcicKICAgICAgICAgICAgdmFsdWUgPSAnYXBwbHktc2hpbS1pbmhlcml0JzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogInBhcnNlIiBhIG1peGluIGRlZmluaXRpb24gaW50byBhIG1hcCBvZiBwcm9wZXJ0aWVzIGFuZCB2YWx1ZXMKICAgICAgICogY3NzVGV4dFRvTWFwKCdib3JkZXI6IDJweCBzb2xpZCBibGFjaycpIC0+ICgnYm9yZGVyJywgJzJweCBzb2xpZCBibGFjaycpCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0ZXh0CiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IHJlcGxhY2VJbml0aWFsT3JJbmhlcml0CiAgICAgICAqIEByZXR1cm4geyFPYmplY3Q8c3RyaW5nLCBzdHJpbmc+fQogICAgICAgKi8KICAgICAgX2Nzc1RleHRUb01hcCh0ZXh0LCByZXBsYWNlSW5pdGlhbE9ySW5oZXJpdCA9IGZhbHNlKSB7CiAgICAgICAgbGV0IHByb3BzID0gdGV4dC5zcGxpdCgnOycpOwogICAgICAgIGxldCBwcm9wZXJ0eSwgdmFsdWU7CiAgICAgICAgbGV0IG91dCA9IHt9OwogICAgICAgIGZvciAobGV0IGkgPSAwLCBwLCBzcDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBwID0gcHJvcHNbaV07CiAgICAgICAgICBpZiAocCkgewogICAgICAgICAgICBzcCA9IHAuc3BsaXQoJzonKTsKICAgICAgICAgICAgLy8gaWdub3JlIGxpbmVzIHRoYXQgYXJlbid0IGRlZmluaXRpb25zIGxpa2UgQG1lZGlhCiAgICAgICAgICAgIGlmIChzcC5sZW5ndGggPiAxKSB7CiAgICAgICAgICAgICAgcHJvcGVydHkgPSBzcFswXS50cmltKCk7CiAgICAgICAgICAgICAgLy8gc29tZSBwcm9wZXJ0aWVzIG1heSBoYXZlICc6JyBpbiB0aGUgdmFsdWUsIGxpa2UgZGF0YSB1cmxzCiAgICAgICAgICAgICAgdmFsdWUgPSBzcC5zbGljZSgxKS5qb2luKCc6Jyk7CiAgICAgICAgICAgICAgaWYgKHJlcGxhY2VJbml0aWFsT3JJbmhlcml0KSB7CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXMuX3JlcGxhY2VJbml0aWFsT3JJbmhlcml0KHByb3BlcnR5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG91dFtwcm9wZXJ0eV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb3V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHtNaXhpbk1hcEVudHJ5fSBtaXhpbkVudHJ5CiAgICAgICAqLwogICAgICBfaW52YWxpZGF0ZU1peGluRW50cnkobWl4aW5FbnRyeSkgewogICAgICAgIGlmICghaW52YWxpZENhbGxiYWNrKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGVsZW1lbnROYW1lIGluIG1peGluRW50cnkuZGVwZW5kYW50cykgewogICAgICAgICAgaWYgKGVsZW1lbnROYW1lICE9PSB0aGlzLl9jdXJyZW50RWxlbWVudCkgewogICAgICAgICAgICBpbnZhbGlkQ2FsbGJhY2soZWxlbWVudE5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFRleHQKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5TmFtZQogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlUHJvcGVydHkKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZU1peGluCiAgICAgICAqIEBwYXJhbSB7IVN0eWxlTm9kZX0gcnVsZQogICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgICAqLwogICAgICBfcHJvZHVjZUNzc1Byb3BlcnRpZXMobWF0Y2hUZXh0LCBwcm9wZXJ0eU5hbWUsIHZhbHVlUHJvcGVydHksIHZhbHVlTWl4aW4sIHJ1bGUpIHsKICAgICAgICAvLyBoYW5kbGUgY2FzZSB3aGVyZSBwcm9wZXJ0eSB2YWx1ZSBpcyBhIG1peGluCiAgICAgICAgaWYgKHZhbHVlUHJvcGVydHkpIHsKICAgICAgICAgIC8vIGZvcm06IC0tbWl4aW4yOiB2YXIoLS1taXhpbjEpLCB3aGVyZSAtLW1peGluMSBpcyBpbiB0aGUgbWFwCiAgICAgICAgICBwcm9jZXNzVmFyaWFibGVBbmRGYWxsYmFjayh2YWx1ZVByb3BlcnR5LCAocHJlZml4LCB2YWx1ZSkgPT4gewogICAgICAgICAgICBpZiAodmFsdWUgJiYgdGhpcy5fbWFwLmdldCh2YWx1ZSkpIHsKICAgICAgICAgICAgICB2YWx1ZU1peGluID0gYEBhcHBseSAke3ZhbHVlfTtgOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaWYgKCF2YWx1ZU1peGluKSB7CiAgICAgICAgICByZXR1cm4gbWF0Y2hUZXh0OwogICAgICAgIH0KICAgICAgICBsZXQgbWl4aW5Bc1Byb3BlcnRpZXMgPSB0aGlzLl9jb25zdW1lQ3NzUHJvcGVydGllcygnJyArIHZhbHVlTWl4aW4sIHJ1bGUpOwogICAgICAgIGxldCBwcmVmaXggPSBtYXRjaFRleHQuc2xpY2UoMCwgbWF0Y2hUZXh0LmluZGV4T2YoJy0tJykpOwogICAgICAgIC8vIGBpbml0aWFsYCBhbmQgYGluaGVyaXRgIGFzIHByb3BlcnRpZXMgaW4gYSBtYXAgc2hvdWxkIGJlIHJlcGxhY2VkIGJlY2F1c2UKICAgICAgICAvLyB0aGVzZSBrZXl3b3JkcyBhcmUgZWFnZXJseSBldmFsdWF0ZWQgd2hlbiB0aGUgbWl4aW4gYmVjb21lcyBDU1MgQ3VzdG9tIFByb3BlcnRpZXMsCiAgICAgICAgLy8gYW5kIHdvdWxkIHNldCB0aGUgdmFyaWFibGUgdmFsdWUsIHJhdGhlciB0aGFuIGNhcnJ5IHRoZSBrZXl3b3JkIHRvIHRoZSBgdmFyKClgIHVzYWdlLgogICAgICAgIGxldCBtaXhpblZhbHVlcyA9IHRoaXMuX2Nzc1RleHRUb01hcChtaXhpbkFzUHJvcGVydGllcywgdHJ1ZSk7CiAgICAgICAgbGV0IGNvbWJpbmVkUHJvcHMgPSBtaXhpblZhbHVlczsKICAgICAgICBsZXQgbWl4aW5FbnRyeSA9IHRoaXMuX21hcC5nZXQocHJvcGVydHlOYW1lKTsKICAgICAgICBsZXQgb2xkUHJvcHMgPSBtaXhpbkVudHJ5ICYmIG1peGluRW50cnkucHJvcGVydGllczsKICAgICAgICBpZiAob2xkUHJvcHMpIHsKICAgICAgICAgIC8vIE5PVEU6IHNpbmNlIHdlIHVzZSBtaXhpbiwgdGhlIG1hcCBvZiBwcm9wZXJ0aWVzIGlzIHVwZGF0ZWQgaGVyZQogICAgICAgICAgLy8gYW5kIHRoaXMgaXMgd2hhdCB3ZSB3YW50LgogICAgICAgICAgY29tYmluZWRQcm9wcyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmNyZWF0ZShvbGRQcm9wcyksIG1peGluVmFsdWVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fbWFwLnNldChwcm9wZXJ0eU5hbWUsIGNvbWJpbmVkUHJvcHMpOwogICAgICAgIH0KICAgICAgICBsZXQgb3V0ID0gW107CiAgICAgICAgbGV0IHAsIHY7CiAgICAgICAgLy8gc2V0IHZhcmlhYmxlcyBkZWZpbmVkIGJ5IGN1cnJlbnQgbWl4aW4KICAgICAgICBsZXQgbmVlZFRvSW52YWxpZGF0ZSA9IGZhbHNlOwogICAgICAgIGZvciAocCBpbiBjb21iaW5lZFByb3BzKSB7CiAgICAgICAgICB2ID0gbWl4aW5WYWx1ZXNbcF07CiAgICAgICAgICAvLyBpZiBwcm9wZXJ0eSBub3QgZGVmaW5lZCBieSBjdXJyZW50IG1peGluLCBzZXQgaW5pdGlhbAogICAgICAgICAgaWYgKHYgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB2ID0gJ2luaXRpYWwnOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9sZFByb3BzICYmICEocCBpbiBvbGRQcm9wcykpIHsKICAgICAgICAgICAgbmVlZFRvSW52YWxpZGF0ZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgICBvdXQucHVzaChgJHtwcm9wZXJ0eU5hbWV9JHtNSVhJTl9WQVJfU0VQfSR7cH06ICR7dn1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKG5lZWRUb0ludmFsaWRhdGUpIHsKICAgICAgICAgIHRoaXMuX2ludmFsaWRhdGVNaXhpbkVudHJ5KG1peGluRW50cnkpOwogICAgICAgIH0KICAgICAgICBpZiAobWl4aW5FbnRyeSkgewogICAgICAgICAgbWl4aW5FbnRyeS5wcm9wZXJ0aWVzID0gY29tYmluZWRQcm9wczsKICAgICAgICB9CiAgICAgICAgLy8gYmVjYXVzZSB0aGUgbWl4aW5NYXAgaXMgZ2xvYmFsLCB0aGUgbWl4aW4gbWlnaHQgY29uZmxpY3Qgd2l0aAogICAgICAgIC8vIGEgZGlmZmVyZW50IHNjb3BlJ3Mgc2ltcGxlIHZhcmlhYmxlIGRlZmluaXRpb246CiAgICAgICAgLy8gRXhhbXBsZToKICAgICAgICAvLyBzb21lIHN0eWxlIHNvbWV3aGVyZToKICAgICAgICAvLyAtLW1peGluMTp7IC4uLiB9CiAgICAgICAgLy8gLS1taXhpbjI6IHZhcigtLW1peGluMSk7CiAgICAgICAgLy8gc29tZSBvdGhlciBlbGVtZW50OgogICAgICAgIC8vIC0tbWl4aW4xOiAxMHB4IHNvbGlkIHJlZDsKICAgICAgICAvLyAtLWZvbzogdmFyKC0tbWl4aW4xKTsKICAgICAgICAvLyBJbiB0aGlzIGNhc2UsIHdlIGxlYXZlIHRoZSBvcmlnaW5hbCB2YXJpYWJsZSBkZWZpbml0aW9uIGluIHBsYWNlLgogICAgICAgIGlmICh2YWx1ZVByb3BlcnR5KSB7CiAgICAgICAgICBwcmVmaXggPSBgJHttYXRjaFRleHR9OyR7cHJlZml4fWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBgJHtwcmVmaXh9JHtvdXQuam9pbignOyAnKX07YDsKICAgICAgfQogICAgfQoKICAgIC8qIGV4cG9ydHMgKi8KICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduICovCiAgICBBcHBseVNoaW0ucHJvdG90eXBlWydkZXRlY3RNaXhpbiddID0gQXBwbHlTaGltLnByb3RvdHlwZS5kZXRlY3RNaXhpbjsKICAgIEFwcGx5U2hpbS5wcm90b3R5cGVbJ3RyYW5zZm9ybVN0eWxlJ10gPSBBcHBseVNoaW0ucHJvdG90eXBlLnRyYW5zZm9ybVN0eWxlOwogICAgQXBwbHlTaGltLnByb3RvdHlwZVsndHJhbnNmb3JtQ3VzdG9tU3R5bGUnXSA9IEFwcGx5U2hpbS5wcm90b3R5cGUudHJhbnNmb3JtQ3VzdG9tU3R5bGU7CiAgICBBcHBseVNoaW0ucHJvdG90eXBlWyd0cmFuc2Zvcm1SdWxlcyddID0gQXBwbHlTaGltLnByb3RvdHlwZS50cmFuc2Zvcm1SdWxlczsKICAgIEFwcGx5U2hpbS5wcm90b3R5cGVbJ3RyYW5zZm9ybVJ1bGUnXSA9IEFwcGx5U2hpbS5wcm90b3R5cGUudHJhbnNmb3JtUnVsZTsKICAgIEFwcGx5U2hpbS5wcm90b3R5cGVbJ3RyYW5zZm9ybVRlbXBsYXRlJ10gPSBBcHBseVNoaW0ucHJvdG90eXBlLnRyYW5zZm9ybVRlbXBsYXRlOwogICAgQXBwbHlTaGltLnByb3RvdHlwZVsnX3NlcGFyYXRvciddID0gTUlYSU5fVkFSX1NFUDsKICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1hc3NpZ24gKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShBcHBseVNoaW0ucHJvdG90eXBlLCAnaW52YWxpZENhbGxiYWNrJywgewogICAgICAvKiogQHJldHVybiB7P2Z1bmN0aW9uKHN0cmluZyl9ICovCiAgICAgIGdldCgpIHsKICAgICAgICByZXR1cm4gaW52YWxpZENhbGxiYWNrOwogICAgICB9LAogICAgICAvKiogQHBhcmFtIHs/ZnVuY3Rpb24oc3RyaW5nKX0gY2IgKi8KICAgICAgc2V0KGNiKSB7CiAgICAgICAgaW52YWxpZENhbGxiYWNrID0gY2I7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBAY29uc3QgeyFPYmplY3Q8c3RyaW5nLCAhSFRNTFRlbXBsYXRlRWxlbWVudD59CiAgICAgKi8KICAgIGNvbnN0IHRlbXBsYXRlTWFwID0ge307CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKgogICAgICogVXRpbGl0aWVzIGZvciBoYW5kbGluZyBpbnZhbGlkYXRpbmcgYXBwbHktc2hpbSBtaXhpbnMgZm9yIGEgZ2l2ZW4gdGVtcGxhdGUuCiAgICAgKgogICAgICogVGhlIGludmFsaWRhdGlvbiBzdHJhdGVneSBpbnZvbHZlcyBrZWVwaW5nIHRyYWNrIG9mIHRoZSAiY3VycmVudCIgdmVyc2lvbiBvZiBhIHRlbXBsYXRlJ3MgbWl4aW5zLCBhbmQgdXBkYXRpbmcgdGhhdCBjb3VudCB3aGVuIGEgbWl4aW4gaXMgaW52YWxpZGF0ZWQuCiAgICAgKiBUaGUgdGVtcGxhdGUKICAgICAqLwoKICAgIC8qKiBAY29uc3Qge3N0cmluZ30gKi8KICAgIGNvbnN0IENVUlJFTlRfVkVSU0lPTiA9ICdfYXBwbHlTaGltQ3VycmVudFZlcnNpb24nOwoKICAgIC8qKiBAY29uc3Qge3N0cmluZ30gKi8KICAgIGNvbnN0IE5FWFRfVkVSU0lPTiA9ICdfYXBwbHlTaGltTmV4dFZlcnNpb24nOwoKICAgIC8qKiBAY29uc3Qge3N0cmluZ30gKi8KICAgIGNvbnN0IFZBTElEQVRJTkdfVkVSU0lPTiA9ICdfYXBwbHlTaGltVmFsaWRhdGluZ1ZlcnNpb24nOwoKICAgIC8qKgogICAgICogQGNvbnN0IHtQcm9taXNlPHZvaWQ+fQogICAgICovCiAgICBjb25zdCBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKCk7CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZWxlbWVudE5hbWUKICAgICAqLwogICAgZnVuY3Rpb24gaW52YWxpZGF0ZShlbGVtZW50TmFtZSl7CiAgICAgIGxldCB0ZW1wbGF0ZSA9IHRlbXBsYXRlTWFwW2VsZW1lbnROYW1lXTsKICAgICAgaWYgKHRlbXBsYXRlKSB7CiAgICAgICAgaW52YWxpZGF0ZVRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzIHRvIG1hcmsgYSB0ZW1wbGF0ZSBpbnZhbGlkCiAgICAgKiBhbmQgc2lnbmFsIHRoYXQgdGhlIHN0eWxlIGluc2lkZSBtdXN0IGJlIHJlZ2VuZXJhdGVkLgogICAgICoKICAgICAqIFVzZSBgc3RhcnRWYWxpZGF0aW5nVGVtcGxhdGVgIHRvIGJlZ2luIGFuIGFzeW5jaHJvbm91cyB2YWxpZGF0aW9uIGN5Y2xlLgogICAgICogRHVyaW5nIHRoYXQgY3ljbGUsIGNhbGwgYHRlbXBsYXRlSXNWYWxpZGF0aW5nYCB0byBzZWUgaWYgdGhlIHRlbXBsYXRlIG11c3QKICAgICAqIGJlIHJldmFsaWRhdGVkCiAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGludmFsaWRhdGVUZW1wbGF0ZSh0ZW1wbGF0ZSkgewogICAgICAvLyBkZWZhdWx0IHRoZSBjdXJyZW50IHZlcnNpb24gdG8gMAogICAgICB0ZW1wbGF0ZVtDVVJSRU5UX1ZFUlNJT05dID0gdGVtcGxhdGVbQ1VSUkVOVF9WRVJTSU9OXSB8fCAwOwogICAgICAvLyBlbnN1cmUgdGhlICJ2YWxpZGF0aW5nIGZvciIgZmxhZyBleGlzdHMKICAgICAgdGVtcGxhdGVbVkFMSURBVElOR19WRVJTSU9OXSA9IHRlbXBsYXRlW1ZBTElEQVRJTkdfVkVSU0lPTl0gfHwgMDsKICAgICAgLy8gaW5jcmVtZW50IHRoZSBuZXh0IHZlcnNpb24KICAgICAgdGVtcGxhdGVbTkVYVF9WRVJTSU9OXSA9ICh0ZW1wbGF0ZVtORVhUX1ZFUlNJT05dIHx8IDApICsgMTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRlbXBsYXRlSXNWYWxpZCh0ZW1wbGF0ZSkgewogICAgICByZXR1cm4gdGVtcGxhdGVbQ1VSUkVOVF9WRVJTSU9OXSA9PT0gdGVtcGxhdGVbTkVYVF9WRVJTSU9OXTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGVtcGxhdGUgaXMgY3VycmVudGx5IGludmFsaWQgYW5kIGBzdGFydFZhbGlkYXRpbmdgIGhhcyBiZWVuIGNhbGxlZCBzaW5jZSB0aGUgbGFzdCBpbnZhbGlkYXRpb24uCiAgICAgKiBJZiBmYWxzZSwgdGhlIHRlbXBsYXRlIG11c3QgYmUgdmFsaWRhdGVkLgogICAgICogQHBhcmFtIHtIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZQogICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVJc1ZhbGlkYXRpbmcodGVtcGxhdGUpIHsKICAgICAgcmV0dXJuICF0ZW1wbGF0ZUlzVmFsaWQodGVtcGxhdGUpICYmIHRlbXBsYXRlW1ZBTElEQVRJTkdfVkVSU0lPTl0gPT09IHRlbXBsYXRlW05FWFRfVkVSU0lPTl07CiAgICB9CgogICAgLyoqCiAgICAgKiBCZWdpbiBhbiBhc3luY2hyb25vdXMgaW52YWxpZGF0aW9uIGN5Y2xlLgogICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIGFmdGVyIGV2ZXJ5IHZhbGlkYXRpb24gb2YgYSB0ZW1wbGF0ZQogICAgICoKICAgICAqIEFmdGVyIG9uZSBtaWNyb3Rhc2ssIHRoZSB0ZW1wbGF0ZSB3aWxsIGJlIG1hcmtlZCBhcyB2YWxpZCB1bnRpbCB0aGUgbmV4dCBjYWxsIHRvIGBpbnZhbGlkYXRlVGVtcGxhdGVgCiAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0YXJ0VmFsaWRhdGluZ1RlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgIC8vIHJlbWVtYmVyIHRoYXQgdGhlIGN1cnJlbnQgIm5leHQgdmVyc2lvbiIgaXMgdGhlIHJlYXNvbiBmb3IgdGhpcyB2YWxpZGF0aW9uIGN5Y2xlCiAgICAgIHRlbXBsYXRlW1ZBTElEQVRJTkdfVkVSU0lPTl0gPSB0ZW1wbGF0ZVtORVhUX1ZFUlNJT05dOwogICAgICAvLyBob3dldmVyLCB0aGVyZSBvbmx5IG5lZWRzIHRvIGJlIG9uZSBhc3luYyB0YXNrIHRvIGNsZWFyIHRoZSBjb3VudGVycwogICAgICBpZiAoIXRlbXBsYXRlLl92YWxpZGF0aW5nKSB7CiAgICAgICAgdGVtcGxhdGUuX3ZhbGlkYXRpbmcgPSB0cnVlOwogICAgICAgIHByb21pc2UudGhlbihmdW5jdGlvbigpIHsKICAgICAgICAgIC8vIHN5bmMgdGhlIGN1cnJlbnQgdmVyc2lvbiB0byBsZXQgZnV0dXJlIGludmFsaWRhdGlvbnMgY2F1c2UgYSByZWZyZXNoIGN5Y2xlCiAgICAgICAgICB0ZW1wbGF0ZVtDVVJSRU5UX1ZFUlNJT05dID0gdGVtcGxhdGVbTkVYVF9WRVJTSU9OXTsKICAgICAgICAgIHRlbXBsYXRlLl92YWxpZGF0aW5nID0gZmFsc2U7CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKiBAdHlwZSB7UHJvbWlzZTx2b2lkPn0gKi8KICAgIGxldCByZWFkeVByb21pc2UgPSBudWxsOwoKICAgIC8qKiBAdHlwZSB7P2Z1bmN0aW9uKD9mdW5jdGlvbigpKX0gKi8KICAgIGxldCB3aGVuUmVhZHkgPSB3aW5kb3dbJ0hUTUxJbXBvcnRzJ10gJiYgd2luZG93WydIVE1MSW1wb3J0cyddWyd3aGVuUmVhZHknXSB8fCBudWxsOwoKICAgIC8qKiBAdHlwZSB7ZnVuY3Rpb24oKX0gKi8KICAgIGxldCByZXNvbHZlRm47CgogICAgLyoqCiAgICAgKiBAcGFyYW0gez9mdW5jdGlvbigpfSBjYWxsYmFjawogICAgICovCiAgICBmdW5jdGlvbiBkb2N1bWVudFdhaXQoY2FsbGJhY2spIHsKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh3aGVuUmVhZHkpIHsKICAgICAgICAgIHdoZW5SZWFkeShjYWxsYmFjayk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICghcmVhZHlQcm9taXNlKSB7CiAgICAgICAgICAgIHJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7cmVzb2x2ZUZuID0gcmVzb2x2ZTt9KTsKICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgICAgICAgICAgICByZXNvbHZlRm4oKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdyZWFkeXN0YXRlY2hhbmdlJywgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgICAgICAgICAgICAgICAgcmVzb2x2ZUZuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJlYWR5UHJvbWlzZS50aGVuKGZ1bmN0aW9uKCl7IGNhbGxiYWNrICYmIGNhbGxiYWNrKCk7IH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCBTRUVOX01BUktFUiA9ICdfX3NlZW5CeVNoYWR5Q1NTJzsKICAgIGNvbnN0IENBQ0hFRF9TVFlMRSA9ICdfX3NoYWR5Q1NTQ2FjaGVkU3R5bGUnOwoKICAgIC8qKiBAdHlwZSB7P2Z1bmN0aW9uKCFIVE1MU3R5bGVFbGVtZW50KX0gKi8KICAgIGxldCB0cmFuc2Zvcm1GbiA9IG51bGw7CgogICAgLyoqIEB0eXBlIHs/ZnVuY3Rpb24oKX0gKi8KICAgIGxldCB2YWxpZGF0ZUZuID0gbnVsbDsKCiAgICAvKioKICAgIFRoaXMgaW50ZXJmYWNlIGlzIHByb3ZpZGVkIHRvIGFkZCBkb2N1bWVudC1sZXZlbCA8c3R5bGU+IGVsZW1lbnRzIHRvIFNoYWR5Q1NTIGZvciBwcm9jZXNzaW5nLgogICAgVGhlc2Ugc3R5bGVzIG11c3QgYmUgcHJvY2Vzc2VkIGJ5IFNoYWR5Q1NTIHRvIHNpbXVsYXRlIFNoYWRvd1Jvb3QgdXBwZXItYm91bmQgZW5jYXBzdWxhdGlvbiBmcm9tIG91dHNpZGUgc3R5bGVzCiAgICBJbiBhZGRpdGlvbiwgdGhlc2Ugc3R5bGVzIG1heSBhbHNvIG5lZWQgdG8gYmUgcHJvY2Vzc2VkIGZvciBAYXBwbHkgcnVsZXMgYW5kIENTUyBDdXN0b20gUHJvcGVydGllcwoKICAgIFRvIGFkZCBkb2N1bWVudC1sZXZlbCBzdHlsZXMgdG8gU2hhZHlDU1MsIG9uZSBjYW4gY2FsbCBgU2hhZHlDU1MuYWRkRG9jdW1lbnRTdHlsZShzdHlsZUVsZW1lbnQpYCBvciBgU2hhZHlDU1MuYWRkRG9jdW1lbnRTdHlsZSh7Z2V0U3R5bGU6ICgpID0+IHN0eWxlRWxlbWVudH0pYAoKICAgIEluIGFkZGl0aW9uLCBpZiB0aGUgcHJvY2VzcyB1c2VkIHRvIGRpc2NvdmVyIGRvY3VtZW50LWxldmVsIHN0eWxlcyBjYW4gYmUgc3luY2hyb25vdXNseSBmbHVzaGVkLCBvbmUgc2hvdWxkIHNldCBgU2hhZHlDU1MuZG9jdW1lbnRTdHlsZUZsdXNoYC4KICAgIFRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2hlbiBjYWxjdWxhdGluZyBzdHlsZXMuCgogICAgQW4gZXhhbXBsZSB1c2FnZSBvZiB0aGUgZG9jdW1lbnQtbGV2ZWwgc3R5bGluZyBhcGkgY2FuIGJlIGZvdW5kIGluIGBleGFtcGxlcy9kb2N1bWVudC1zdHlsZS1saWIuanNgCgogICAgQHVucmVzdHJpY3RlZAogICAgKi8KICAgIGNsYXNzIEN1c3RvbVN0eWxlSW50ZXJmYWNlIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqIEB0eXBlIHshQXJyYXk8IUN1c3RvbVN0eWxlUHJvdmlkZXI+fSAqLwogICAgICAgIHRoaXNbJ2N1c3RvbVN0eWxlcyddID0gW107CiAgICAgICAgdGhpc1snZW5xdWV1ZWQnXSA9IGZhbHNlOwogICAgICAgIC8vIE5PVEUoZGZyZWVkbSk6IHVzZSBxdW90ZXMgaGVyZSB0byBwcmV2ZW50IGNsb3N1cmUgaW5saW5pbmcgdG8gYGZ1bmN0aW9uKCl7fWA7CiAgICAgICAgZG9jdW1lbnRXYWl0KCgpID0+IHsKICAgICAgICAgIGlmICh3aW5kb3dbJ1NoYWR5Q1NTJ11bJ2ZsdXNoQ3VzdG9tU3R5bGVzJ10pIHsKICAgICAgICAgICAgd2luZG93WydTaGFkeUNTUyddWydmbHVzaEN1c3RvbVN0eWxlcyddKCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFF1ZXVlIGEgdmFsaWRhdGlvbiBmb3IgbmV3IGN1c3RvbSBzdHlsZXMgdG8gYmF0Y2ggc3R5bGUgcmVjYWxjdWxhdGlvbnMKICAgICAgICovCiAgICAgIGVucXVldWVEb2N1bWVudFZhbGlkYXRpb24oKSB7CiAgICAgICAgaWYgKHRoaXNbJ2VucXVldWVkJ10gfHwgIXZhbGlkYXRlRm4pIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpc1snZW5xdWV1ZWQnXSA9IHRydWU7CiAgICAgICAgZG9jdW1lbnRXYWl0KHZhbGlkYXRlRm4pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0geyFIVE1MU3R5bGVFbGVtZW50fSBzdHlsZQogICAgICAgKi8KICAgICAgYWRkQ3VzdG9tU3R5bGUoc3R5bGUpIHsKICAgICAgICBpZiAoIXN0eWxlW1NFRU5fTUFSS0VSXSkgewogICAgICAgICAgc3R5bGVbU0VFTl9NQVJLRVJdID0gdHJ1ZTsKICAgICAgICAgIHRoaXNbJ2N1c3RvbVN0eWxlcyddLnB1c2goc3R5bGUpOwogICAgICAgICAgdGhpcy5lbnF1ZXVlRG9jdW1lbnRWYWxpZGF0aW9uKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0geyFDdXN0b21TdHlsZVByb3ZpZGVyfSBjdXN0b21TdHlsZQogICAgICAgKiBAcmV0dXJuIHtIVE1MU3R5bGVFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0U3R5bGVGb3JDdXN0b21TdHlsZShjdXN0b21TdHlsZSkgewogICAgICAgIGlmIChjdXN0b21TdHlsZVtDQUNIRURfU1RZTEVdKSB7CiAgICAgICAgICByZXR1cm4gY3VzdG9tU3R5bGVbQ0FDSEVEX1NUWUxFXTsKICAgICAgICB9CiAgICAgICAgbGV0IHN0eWxlOwogICAgICAgIGlmIChjdXN0b21TdHlsZVsnZ2V0U3R5bGUnXSkgewogICAgICAgICAgc3R5bGUgPSBjdXN0b21TdHlsZVsnZ2V0U3R5bGUnXSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHlsZSA9IGN1c3RvbVN0eWxlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGU7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhQ3VzdG9tU3R5bGVQcm92aWRlcj59CiAgICAgICAqLwogICAgICBwcm9jZXNzU3R5bGVzKCkgewogICAgICAgIGNvbnN0IGNzID0gdGhpc1snY3VzdG9tU3R5bGVzJ107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY3VzdG9tU3R5bGUgPSBjc1tpXTsKICAgICAgICAgIGlmIChjdXN0b21TdHlsZVtDQUNIRURfU1RZTEVdKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLmdldFN0eWxlRm9yQ3VzdG9tU3R5bGUoY3VzdG9tU3R5bGUpOwogICAgICAgICAgaWYgKHN0eWxlKSB7CiAgICAgICAgICAgIC8vIEhUTUxJbXBvcnRzIHBvbHlmaWxsIG1heSBoYXZlIGNsb25lZCB0aGUgc3R5bGUgaW50byB0aGUgbWFpbiBkb2N1bWVudCwKICAgICAgICAgICAgLy8gd2hpY2ggaXMgcmVmZXJlbmNlZCB3aXRoIF9fYXBwbGllZEVsZW1lbnQuCiAgICAgICAgICAgIGNvbnN0IHN0eWxlVG9UcmFuc2Zvcm0gPSAvKiogQHR5cGUgeyFIVE1MU3R5bGVFbGVtZW50fSAqLyhzdHlsZVsnX19hcHBsaWVkRWxlbWVudCddIHx8IHN0eWxlKTsKICAgICAgICAgICAgaWYgKHRyYW5zZm9ybUZuKSB7CiAgICAgICAgICAgICAgdHJhbnNmb3JtRm4oc3R5bGVUb1RyYW5zZm9ybSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VzdG9tU3R5bGVbQ0FDSEVEX1NUWUxFXSA9IHN0eWxlVG9UcmFuc2Zvcm07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjczsKICAgICAgfQogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIG5vLXNlbGYtYXNzaWduICovCiAgICBDdXN0b21TdHlsZUludGVyZmFjZS5wcm90b3R5cGVbJ2FkZEN1c3RvbVN0eWxlJ10gPSBDdXN0b21TdHlsZUludGVyZmFjZS5wcm90b3R5cGUuYWRkQ3VzdG9tU3R5bGU7CiAgICBDdXN0b21TdHlsZUludGVyZmFjZS5wcm90b3R5cGVbJ2dldFN0eWxlRm9yQ3VzdG9tU3R5bGUnXSA9IEN1c3RvbVN0eWxlSW50ZXJmYWNlLnByb3RvdHlwZS5nZXRTdHlsZUZvckN1c3RvbVN0eWxlOwogICAgQ3VzdG9tU3R5bGVJbnRlcmZhY2UucHJvdG90eXBlWydwcm9jZXNzU3R5bGVzJ10gPSBDdXN0b21TdHlsZUludGVyZmFjZS5wcm90b3R5cGUucHJvY2Vzc1N0eWxlczsKICAgIC8qIGVzbGludC1lbmFibGUgbm8tc2VsZi1hc3NpZ24gKi8KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyhDdXN0b21TdHlsZUludGVyZmFjZS5wcm90b3R5cGUsIHsKICAgICAgJ3RyYW5zZm9ybUNhbGxiYWNrJzogewogICAgICAgIC8qKiBAcmV0dXJuIHs/ZnVuY3Rpb24oIUhUTUxTdHlsZUVsZW1lbnQpfSAqLwogICAgICAgIGdldCgpIHsKICAgICAgICAgIHJldHVybiB0cmFuc2Zvcm1GbjsKICAgICAgICB9LAogICAgICAgIC8qKiBAcGFyYW0gez9mdW5jdGlvbighSFRNTFN0eWxlRWxlbWVudCl9IGZuICovCiAgICAgICAgc2V0KGZuKSB7CiAgICAgICAgICB0cmFuc2Zvcm1GbiA9IGZuOwogICAgICAgIH0KICAgICAgfSwKICAgICAgJ3ZhbGlkYXRlQ2FsbGJhY2snOiB7CiAgICAgICAgLyoqIEByZXR1cm4gez9mdW5jdGlvbigpfSAqLwogICAgICAgIGdldCgpIHsKICAgICAgICAgIHJldHVybiB2YWxpZGF0ZUZuOwogICAgICAgIH0sCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/ZnVuY3Rpb24oKX0gZm4KICAgICAgICAgKiBAdGhpcyB7Q3VzdG9tU3R5bGVJbnRlcmZhY2V9CiAgICAgICAgICovCiAgICAgICAgc2V0KGZuKSB7CiAgICAgICAgICBsZXQgbmVlZHNFbnF1ZXVlID0gZmFsc2U7CiAgICAgICAgICBpZiAoIXZhbGlkYXRlRm4pIHsKICAgICAgICAgICAgbmVlZHNFbnF1ZXVlID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHZhbGlkYXRlRm4gPSBmbjsKICAgICAgICAgIGlmIChuZWVkc0VucXVldWUpIHsKICAgICAgICAgICAgdGhpcy5lbnF1ZXVlRG9jdW1lbnRWYWxpZGF0aW9uKCk7CiAgICAgICAgICB9CiAgICAgICAgfSwKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKiogQGNvbnN0IHtBcHBseVNoaW19ICovCiAgICBjb25zdCBhcHBseVNoaW0gPSBuZXcgQXBwbHlTaGltKCk7CgogICAgY2xhc3MgQXBwbHlTaGltSW50ZXJmYWNlIHsKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/Q3VzdG9tU3R5bGVJbnRlcmZhY2VJbnRlcmZhY2V9ICovCiAgICAgICAgdGhpcy5jdXN0b21TdHlsZUludGVyZmFjZSA9IG51bGw7CiAgICAgICAgYXBwbHlTaGltWydpbnZhbGlkQ2FsbGJhY2snXSA9IGludmFsaWRhdGU7CiAgICAgIH0KICAgICAgZW5zdXJlKCkgewogICAgICAgIGlmICh0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UpIHsKICAgICAgICAgIHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UgPQogICAgICAgICAgICAgIC8qKiBAdHlwZSB7IUN1c3RvbVN0eWxlSW50ZXJmYWNlSW50ZXJmYWNlfSAqLyAoCiAgICAgICAgICAgICAgICAgIHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZSk7CiAgICAgICAgICB0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlWyd0cmFuc2Zvcm1DYWxsYmFjayddID0gKHN0eWxlKSA9PiB7CiAgICAgICAgICAgIGFwcGx5U2hpbS50cmFuc2Zvcm1DdXN0b21TdHlsZShzdHlsZSk7CiAgICAgICAgICB9OwogICAgICAgICAgdGhpcy5jdXN0b21TdHlsZUludGVyZmFjZVsndmFsaWRhdGVDYWxsYmFjayddID0gKCkgPT4gewogICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgIGlmICh0aGlzLmN1c3RvbVN0eWxlSW50ZXJmYWNlWydlbnF1ZXVlZCddKSB7CiAgICAgICAgICAgICAgICB0aGlzLmZsdXNoQ3VzdG9tU3R5bGVzKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZWxlbWVudE5hbWUKICAgICAgICovCiAgICAgIHByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUpIHsKICAgICAgICB0aGlzLmVuc3VyZSgpOwogICAgICAgIGlmIChlbGVtZW50SGFzQnVpbHRDc3ModGVtcGxhdGUpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRlbXBsYXRlTWFwW2VsZW1lbnROYW1lXSA9IHRlbXBsYXRlOwogICAgICAgIGxldCBhc3QgPSBhcHBseVNoaW0udHJhbnNmb3JtVGVtcGxhdGUodGVtcGxhdGUsIGVsZW1lbnROYW1lKTsKICAgICAgICAvLyBzYXZlIG9yaWdpbmFsIHN0eWxlIGFzdCB0byB1c2UgZm9yIHJldmFsaWRhdGluZyBpbnN0YW5jZXMKICAgICAgICB0ZW1wbGF0ZVsnX3N0eWxlQXN0J10gPSBhc3Q7CiAgICAgIH0KICAgICAgZmx1c2hDdXN0b21TdHlsZXMoKSB7CiAgICAgICAgdGhpcy5lbnN1cmUoKTsKICAgICAgICBpZiAoIXRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2UpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IHN0eWxlcyA9IHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2VbJ3Byb2Nlc3NTdHlsZXMnXSgpOwogICAgICAgIGlmICghdGhpcy5jdXN0b21TdHlsZUludGVyZmFjZVsnZW5xdWV1ZWQnXSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0eWxlcy5sZW5ndGg7IGkrKyApIHsKICAgICAgICAgIGxldCBjcyA9IHN0eWxlc1tpXTsKICAgICAgICAgIGxldCBzdHlsZSA9IHRoaXMuY3VzdG9tU3R5bGVJbnRlcmZhY2VbJ2dldFN0eWxlRm9yQ3VzdG9tU3R5bGUnXShjcyk7CiAgICAgICAgICBpZiAoc3R5bGUpIHsKICAgICAgICAgICAgYXBwbHlTaGltLnRyYW5zZm9ybUN1c3RvbVN0eWxlKHN0eWxlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5jdXN0b21TdHlsZUludGVyZmFjZVsnZW5xdWV1ZWQnXSA9IGZhbHNlOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcGVydGllcwogICAgICAgKi8KICAgICAgc3R5bGVTdWJ0cmVlKGVsZW1lbnQsIHByb3BlcnRpZXMpIHsKICAgICAgICB0aGlzLmVuc3VyZSgpOwogICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICB1cGRhdGVOYXRpdmVQcm9wZXJ0aWVzKGVsZW1lbnQsIHByb3BlcnRpZXMpOwogICAgICAgIH0KICAgICAgICBpZiAoZWxlbWVudC5zaGFkb3dSb290KSB7CiAgICAgICAgICB0aGlzLnN0eWxlRWxlbWVudChlbGVtZW50KTsKICAgICAgICAgIGxldCBzaGFkb3dDaGlsZHJlbiA9CiAgICAgICAgICAgICAgLyoqIEB0eXBlIHshUGFyZW50Tm9kZX0gKi8gKGVsZW1lbnQuc2hhZG93Um9vdCkuY2hpbGRyZW4gfHwKICAgICAgICAgICAgICBlbGVtZW50LnNoYWRvd1Jvb3QuY2hpbGROb2RlczsKICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2hhZG93Q2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5zdHlsZVN1YnRyZWUoLyoqIEB0eXBlIHtIVE1MRWxlbWVudH0gKi8oc2hhZG93Q2hpbGRyZW5baV0pKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IGNoaWxkcmVuID0gZWxlbWVudC5jaGlsZHJlbiB8fCBlbGVtZW50LmNoaWxkTm9kZXM7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuc3R5bGVTdWJ0cmVlKC8qKiBAdHlwZSB7SFRNTEVsZW1lbnR9ICovKGNoaWxkcmVuW2ldKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbGVtZW50CiAgICAgICAqLwogICAgICBzdHlsZUVsZW1lbnQoZWxlbWVudCkgewogICAgICAgIHRoaXMuZW5zdXJlKCk7CiAgICAgICAgbGV0IHtpc30gPSBnZXRJc0V4dGVuZHMoZWxlbWVudCk7CiAgICAgICAgbGV0IHRlbXBsYXRlID0gdGVtcGxhdGVNYXBbaXNdOwogICAgICAgIGlmICh0ZW1wbGF0ZSAmJiBlbGVtZW50SGFzQnVpbHRDc3ModGVtcGxhdGUpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICh0ZW1wbGF0ZSAmJiAhdGVtcGxhdGVJc1ZhbGlkKHRlbXBsYXRlKSkgewogICAgICAgICAgLy8gb25seSByZXZhbGlkYXRlIHRlbXBsYXRlIG9uY2UKICAgICAgICAgIGlmICghdGVtcGxhdGVJc1ZhbGlkYXRpbmcodGVtcGxhdGUpKSB7CiAgICAgICAgICAgIHRoaXMucHJlcGFyZVRlbXBsYXRlKHRlbXBsYXRlLCBpcyk7CiAgICAgICAgICAgIHN0YXJ0VmFsaWRhdGluZ1RlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIHVwZGF0ZSB0aGlzIGVsZW1lbnQgaW5zdGFuY2UKICAgICAgICAgIGxldCByb290ID0gZWxlbWVudC5zaGFkb3dSb290OwogICAgICAgICAgaWYgKHJvb3QpIHsKICAgICAgICAgICAgbGV0IHN0eWxlID0gLyoqIEB0eXBlIHtIVE1MU3R5bGVFbGVtZW50fSAqLyhyb290LnF1ZXJ5U2VsZWN0b3IoJ3N0eWxlJykpOwogICAgICAgICAgICBpZiAoc3R5bGUpIHsKICAgICAgICAgICAgICAvLyByZXVzZSB0aGUgdGVtcGxhdGUncyBzdHlsZSBhc3QsIGl0IGhhcyBhbGwgdGhlIG9yaWdpbmFsIGNzcyB0ZXh0CiAgICAgICAgICAgICAgc3R5bGVbJ19fY3NzUnVsZXMnXSA9IHRlbXBsYXRlWydfc3R5bGVBc3QnXTsKICAgICAgICAgICAgICBzdHlsZS50ZXh0Q29udGVudCA9IHRvQ3NzVGV4dCh0ZW1wbGF0ZVsnX3N0eWxlQXN0J10pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMKICAgICAgICovCiAgICAgIHN0eWxlRG9jdW1lbnQocHJvcGVydGllcykgewogICAgICAgIHRoaXMuZW5zdXJlKCk7CiAgICAgICAgdGhpcy5zdHlsZVN1YnRyZWUoZG9jdW1lbnQuYm9keSwgcHJvcGVydGllcyk7CiAgICAgIH0KICAgIH0KCiAgICBpZiAoIXdpbmRvdy5TaGFkeUNTUyB8fCAhd2luZG93LlNoYWR5Q1NTLlNjb3BpbmdTaGltKSB7CiAgICAgIGNvbnN0IGFwcGx5U2hpbUludGVyZmFjZSA9IG5ldyBBcHBseVNoaW1JbnRlcmZhY2UoKTsKICAgICAgbGV0IEN1c3RvbVN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTICYmIHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTsKCiAgICAgIC8qKiBAc3VwcHJlc3Mge2R1cGxpY2F0ZX0gKi8KICAgICAgd2luZG93LlNoYWR5Q1NTID0gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBlbGVtZW50RXh0ZW5kcwogICAgICAgICAqLwogICAgICAgIHByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRFeHRlbmRzKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgIGFwcGx5U2hpbUludGVyZmFjZS5mbHVzaEN1c3RvbVN0eWxlcygpOwogICAgICAgICAgYXBwbHlTaGltSW50ZXJmYWNlLnByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBlbGVtZW50RXh0ZW5kcwogICAgICAgICAqLwogICAgICAgIHByZXBhcmVUZW1wbGF0ZVN0eWxlcyh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRFeHRlbmRzKSB7CiAgICAgICAgICB3aW5kb3cuU2hhZHlDU1MucHJlcGFyZVRlbXBsYXRlKHRlbXBsYXRlLCBlbGVtZW50TmFtZSwgZWxlbWVudEV4dGVuZHMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAgICovCiAgICAgICAgcHJlcGFyZVRlbXBsYXRlRG9tKHRlbXBsYXRlLCBlbGVtZW50TmFtZSkge30sIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMKICAgICAgICAgKi8KICAgICAgICBzdHlsZVN1YnRyZWUoZWxlbWVudCwgcHJvcGVydGllcykgewogICAgICAgICAgYXBwbHlTaGltSW50ZXJmYWNlLmZsdXNoQ3VzdG9tU3R5bGVzKCk7CiAgICAgICAgICBhcHBseVNoaW1JbnRlcmZhY2Uuc3R5bGVTdWJ0cmVlKGVsZW1lbnQsIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgc3R5bGVFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAgIGFwcGx5U2hpbUludGVyZmFjZS5mbHVzaEN1c3RvbVN0eWxlcygpOwogICAgICAgICAgYXBwbHlTaGltSW50ZXJmYWNlLnN0eWxlRWxlbWVudChlbGVtZW50KTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMKICAgICAgICAgKi8KICAgICAgICBzdHlsZURvY3VtZW50KHByb3BlcnRpZXMpIHsKICAgICAgICAgIGFwcGx5U2hpbUludGVyZmFjZS5mbHVzaEN1c3RvbVN0eWxlcygpOwogICAgICAgICAgYXBwbHlTaGltSW50ZXJmYWNlLnN0eWxlRG9jdW1lbnQocHJvcGVydGllcyk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5CiAgICAgICAgICogQHJldHVybiB7c3RyaW5nfQogICAgICAgICAqLwogICAgICAgIGdldENvbXB1dGVkU3R5bGVWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSkgewogICAgICAgICAgcmV0dXJuIGdldENvbXB1dGVkU3R5bGVWYWx1ZShlbGVtZW50LCBwcm9wZXJ0eSk7CiAgICAgICAgfSwKCiAgICAgICAgZmx1c2hDdXN0b21TdHlsZXMoKSB7CiAgICAgICAgICBhcHBseVNoaW1JbnRlcmZhY2UuZmx1c2hDdXN0b21TdHlsZXMoKTsKICAgICAgICB9LAoKICAgICAgICBuYXRpdmVDc3M6IG5hdGl2ZUNzc1ZhcmlhYmxlcywKICAgICAgICBuYXRpdmVTaGFkb3c6IG5hdGl2ZVNoYWRvdywKICAgICAgICBjc3NCdWlsZDogY3NzQnVpbGQsCiAgICAgICAgZGlzYWJsZVJ1bnRpbWU6IGRpc2FibGVSdW50aW1lLAogICAgICB9OwoKICAgICAgaWYgKEN1c3RvbVN0eWxlSW50ZXJmYWNlKSB7CiAgICAgICAgd2luZG93LlNoYWR5Q1NTLkN1c3RvbVN0eWxlSW50ZXJmYWNlID0gQ3VzdG9tU3R5bGVJbnRlcmZhY2U7CiAgICAgIH0KICAgIH0KCiAgICB3aW5kb3cuU2hhZHlDU1MuQXBwbHlTaGltID0gYXBwbHlTaGltOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBAc3VtbWFyeSBDb2xsYXBzZSBtdWx0aXBsZSBjYWxsYmFja3MgaW50byBvbmUgaW52b2NhdGlvbiBhZnRlciBhIHRpbWVyLgogICAgICovCiAgICBjbGFzcyBEZWJvdW5jZXIgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICB0aGlzLl9hc3luY01vZHVsZSA9IG51bGw7CiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBudWxsOwogICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgc2NoZWR1bGVyOyB0aGF0IGlzLCBhIG1vZHVsZSB3aXRoIHRoZSBBc3luYyBpbnRlcmZhY2UsCiAgICAgICAqIGEgY2FsbGJhY2sgYW5kIG9wdGlvbmFsIGFyZ3VtZW50cyB0byBiZSBwYXNzZWQgdG8gdGhlIHJ1biBmdW5jdGlvbgogICAgICAgKiBmcm9tIHRoZSBhc3luYyBtb2R1bGUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUFzeW5jSW50ZXJmYWNlfSBhc3luY01vZHVsZSBPYmplY3Qgd2l0aCBBc3luYyBpbnRlcmZhY2UuCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2V0Q29uZmlnKGFzeW5jTW9kdWxlLCBjYWxsYmFjaykgewogICAgICAgIHRoaXMuX2FzeW5jTW9kdWxlID0gYXN5bmNNb2R1bGU7CiAgICAgICAgdGhpcy5fY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICB0aGlzLl90aW1lciA9IHRoaXMuX2FzeW5jTW9kdWxlLnJ1bigoKSA9PiB7CiAgICAgICAgICB0aGlzLl90aW1lciA9IG51bGw7CiAgICAgICAgICBkZWJvdW5jZXJRdWV1ZS5kZWxldGUodGhpcyk7CiAgICAgICAgICB0aGlzLl9jYWxsYmFjaygpOwogICAgICAgIH0pOwogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIGFuIGFjdGl2ZSBkZWJvdW5jZXIgYW5kIHJldHVybnMgYSByZWZlcmVuY2UgdG8gaXRzZWxmLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgY2FuY2VsKCkgewogICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICAgIHRoaXMuX2NhbmNlbEFzeW5jKCk7CiAgICAgICAgICAvLyBDYW5jZWxpbmcgYSBkZWJvdW5jZXIgcmVtb3ZlcyBpdHMgc3BvdCBmcm9tIHRoZSBmbHVzaCBxdWV1ZSwKICAgICAgICAgIC8vIHNvIGlmIGEgZGVib3VuY2VyIGlzIG1hbnVhbGx5IGNhbmNlbGVkIGFuZCByZS1kZWJvdW5jZWQsIGl0CiAgICAgICAgICAvLyB3aWxsIHJlc2V0IGl0cyBmbHVzaCBvcmRlciAodGhpcyBpcyBhIHZlcnkgbWlub3IgZGlmZmVyZW5jZSBmcm9tIDEueCkKICAgICAgICAgIC8vIFJlLWRlYm91bmNpbmcgdmlhIHRoZSBgZGVib3VuY2VgIEFQSSByZXRhaW5zIHRoZSAxLnggRklGTyBmbHVzaCBvcmRlcgogICAgICAgICAgZGVib3VuY2VyUXVldWUuZGVsZXRlKHRoaXMpOwogICAgICAgIH0KICAgICAgfQogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIGRlYm91bmNlcidzIGFzeW5jIGNhbGxiYWNrLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX2NhbmNlbEFzeW5jKCkgewogICAgICAgIGlmICh0aGlzLmlzQWN0aXZlKCkpIHsKICAgICAgICAgIHRoaXMuX2FzeW5jTW9kdWxlLmNhbmNlbCgvKiogQHR5cGUge251bWJlcn0gKi8odGhpcy5fdGltZXIpKTsKICAgICAgICAgIHRoaXMuX3RpbWVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZsdXNoZXMgYW4gYWN0aXZlIGRlYm91bmNlciBhbmQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byBpdHNlbGYuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBmbHVzaCgpIHsKICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSB7CiAgICAgICAgICB0aGlzLmNhbmNlbCgpOwogICAgICAgICAgdGhpcy5fY2FsbGJhY2soKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBhY3RpdmUuCiAgICAgICAqLwogICAgICBpc0FjdGl2ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdGltZXIgIT0gbnVsbDsKICAgICAgfQogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIGRlYm91bmNlciBpZiBubyBkZWJvdW5jZXIgaXMgcGFzc2VkIGFzIGEgcGFyYW1ldGVyCiAgICAgICAqIG9yIGl0IGNhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlciBvdGhlcndpc2UuIFRoZSBmb2xsb3dpbmcKICAgICAgICogZXhhbXBsZSBzaG93cyBob3cgYSBkZWJvdW5jZXIgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gYQogICAgICAgKiBtaWNyb3Rhc2sgYW5kICJkZWJvdW5jZWQiIHN1Y2ggdGhhdCB0aGUgcHJvdmlkZWQgY2FsbGJhY2sgZnVuY3Rpb24gaXMKICAgICAgICogY2FsbGVkIG9uY2UuIEFkZCB0aGlzIG1ldGhvZCB0byBhIGN1c3RvbSBlbGVtZW50OgogICAgICAgKgogICAgICAgKiBgYGBqcwogICAgICAgKiBpbXBvcnQge21pY3JvVGFza30gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvYXN5bmMuanMnOwogICAgICAgKiBpbXBvcnQge0RlYm91bmNlcn0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvZGVib3VuY2UuanMnOwogICAgICAgKiAvLyAuLi4KICAgICAgICoKICAgICAgICogX2RlYm91bmNlV29yaygpIHsKICAgICAgICogICB0aGlzLl9kZWJvdW5jZUpvYiA9IERlYm91bmNlci5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZUpvYiwKICAgICAgICogICAgICAgbWljcm9UYXNrLCAoKSA9PiB0aGlzLl9kb1dvcmsoKSk7CiAgICAgICAqIH0KICAgICAgICogYGBgCiAgICAgICAqCiAgICAgICAqIElmIHRoZSBgX2RlYm91bmNlV29ya2AgbWV0aG9kIGlzIGNhbGxlZCBtdWx0aXBsZSB0aW1lcyB3aXRoaW4gdGhlIHNhbWUKICAgICAgICogbWljcm90YXNrLCB0aGUgYF9kb1dvcmtgIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIG9ubHkgb25jZSBhdCB0aGUgbmV4dAogICAgICAgKiBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAgICoKICAgICAgICogTm90ZTogSW4gdGVzdGluZyBpdCBpcyBvZnRlbiBjb252ZW5pZW50IHRvIGF2b2lkIGFzeW5jaHJvbnkuIFRvIGFjY29tcGxpc2gKICAgICAgICogdGhpcyB3aXRoIGEgZGVib3VuY2VyLCB5b3UgY2FuIHVzZSBgZW5xdWV1ZURlYm91bmNlcmAgYW5kCiAgICAgICAqIGBmbHVzaGAuIEZvciBleGFtcGxlLCBleHRlbmQgdGhlIGFib3ZlIGV4YW1wbGUgYnkgYWRkaW5nCiAgICAgICAqIGBlbnF1ZXVlRGVib3VuY2VyKHRoaXMuX2RlYm91bmNlSm9iKWAgYXQgdGhlIGVuZCBvZiB0aGUKICAgICAgICogYF9kZWJvdW5jZVdvcmtgIG1ldGhvZC4gVGhlbiBpbiBhIHRlc3QsIGNhbGwgYGZsdXNoYCB0byBlbnN1cmUKICAgICAgICogdGhlIGRlYm91bmNlciBoYXMgY29tcGxldGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0RlYm91bmNlcj99IGRlYm91bmNlciBEZWJvdW5jZXIgb2JqZWN0LgogICAgICAgKiBAcGFyYW0geyFBc3luY0ludGVyZmFjZX0gYXN5bmNNb2R1bGUgT2JqZWN0IHdpdGggQXN5bmMgaW50ZXJmYWNlCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oKX0gY2FsbGJhY2sgQ2FsbGJhY2sgdG8gcnVuLgogICAgICAgKiBAcmV0dXJuIHshRGVib3VuY2VyfSBSZXR1cm5zIGEgZGVib3VuY2VyIG9iamVjdC4KICAgICAgICovCiAgICAgIHN0YXRpYyBkZWJvdW5jZShkZWJvdW5jZXIsIGFzeW5jTW9kdWxlLCBjYWxsYmFjaykgewogICAgICAgIGlmIChkZWJvdW5jZXIgaW5zdGFuY2VvZiBEZWJvdW5jZXIpIHsKICAgICAgICAgIC8vIENhbmNlbCB0aGUgYXN5bmMgY2FsbGJhY2ssIGJ1dCBsZWF2ZSBpbiBkZWJvdW5jZXJRdWV1ZSBpZiBpdCB3YXMKICAgICAgICAgIC8vIGVucXVldWVkLCB0byBtYWludGFpbiAxLnggZmx1c2ggb3JkZXIKICAgICAgICAgIGRlYm91bmNlci5fY2FuY2VsQXN5bmMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZGVib3VuY2VyID0gbmV3IERlYm91bmNlcigpOwogICAgICAgIH0KICAgICAgICBkZWJvdW5jZXIuc2V0Q29uZmlnKGFzeW5jTW9kdWxlLCBjYWxsYmFjayk7CiAgICAgICAgcmV0dXJuIGRlYm91bmNlcjsKICAgICAgfQogICAgfQoKICAgIGxldCBkZWJvdW5jZXJRdWV1ZSA9IG5ldyBTZXQoKTsKCiAgICAvKioKICAgICAqIEFkZHMgYSBgRGVib3VuY2VyYCB0byBhIGxpc3Qgb2YgZ2xvYmFsbHkgZmx1c2hhYmxlIHRhc2tzLgogICAgICoKICAgICAqIEBwYXJhbSB7IURlYm91bmNlcn0gZGVib3VuY2VyIERlYm91bmNlciB0byBlbnF1ZXVlCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBjb25zdCBlbnF1ZXVlRGVib3VuY2VyID0gZnVuY3Rpb24oZGVib3VuY2VyKSB7CiAgICAgIGRlYm91bmNlclF1ZXVlLmFkZChkZWJvdW5jZXIpOwogICAgfTsKCiAgICAvKioKICAgICAqIEZsdXNoZXMgYW55IGVucXVldWVkIGRlYm91bmNlcnMKICAgICAqCiAgICAgKiBAcmV0dXJuIHtib29sZWFufSBSZXR1cm5zIHdoZXRoZXIgYW55IGRlYm91bmNlcnMgd2VyZSBmbHVzaGVkCiAgICAgKi8KICAgIGNvbnN0IGZsdXNoRGVib3VuY2VycyA9IGZ1bmN0aW9uKCkgewogICAgICBjb25zdCBkaWRGbHVzaCA9IEJvb2xlYW4oZGVib3VuY2VyUXVldWUuc2l6ZSk7CiAgICAgIC8vIElmIG5ldyBkZWJvdW5jZXJzIGFyZSBhZGRlZCB3aGlsZSBmbHVzaGluZywgU2V0LmZvckVhY2ggd2lsbCBlbnN1cmUKICAgICAgLy8gbmV3bHkgYWRkZWQgb25lcyBhcmUgYWxzbyBmbHVzaGVkCiAgICAgIGRlYm91bmNlclF1ZXVlLmZvckVhY2goZGVib3VuY2VyID0+IHsKICAgICAgICB0cnkgewogICAgICAgICAgZGVib3VuY2VyLmZsdXNoKCk7CiAgICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBkaWRGbHVzaDsKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvLyBkZXRlY3QgbmF0aXZlIHRvdWNoIGFjdGlvbiBzdXBwb3J0CiAgICBsZXQgSEFTX05BVElWRV9UQSA9IHR5cGVvZiBkb2N1bWVudC5oZWFkLnN0eWxlLnRvdWNoQWN0aW9uID09PSAnc3RyaW5nJzsKICAgIGxldCBHRVNUVVJFX0tFWSA9ICdfX3BvbHltZXJHZXN0dXJlcyc7CiAgICBsZXQgSEFORExFRF9PQkogPSAnX19wb2x5bWVyR2VzdHVyZXNIYW5kbGVkJzsKICAgIGxldCBUT1VDSF9BQ1RJT04gPSAnX19wb2x5bWVyR2VzdHVyZXNUb3VjaEFjdGlvbic7CiAgICAvLyByYWRpdXMgZm9yIHRhcCBhbmQgdHJhY2sKICAgIGxldCBUQVBfRElTVEFOQ0UgPSAyNTsKICAgIGxldCBUUkFDS19ESVNUQU5DRSA9IDU7CiAgICAvLyBudW1iZXIgb2YgbGFzdCBOIHRyYWNrIHBvc2l0aW9ucyB0byBrZWVwCiAgICBsZXQgVFJBQ0tfTEVOR1RIID0gMjsKCiAgICAvLyBEaXNhYmxpbmcgIm1vdXNlIiBoYW5kbGVycyBmb3IgMjUwMG1zIGlzIGVub3VnaAogICAgbGV0IE1PVVNFX1RJTUVPVVQgPSAyNTAwOwogICAgbGV0IE1PVVNFX0VWRU5UUyA9IFsnbW91c2Vkb3duJywgJ21vdXNlbW92ZScsICdtb3VzZXVwJywgJ2NsaWNrJ107CiAgICAvLyBhbiBhcnJheSBvZiBiaXRtYXNrIHZhbHVlcyBmb3IgbWFwcGluZyBNb3VzZUV2ZW50LndoaWNoIHRvIE1vdXNlRXZlbnQuYnV0dG9ucwogICAgbGV0IE1PVVNFX1dISUNIX1RPX0JVVFRPTlMgPSBbMCwgMSwgNCwgMl07CiAgICBsZXQgTU9VU0VfSEFTX0JVVFRPTlMgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIG5ldyBNb3VzZUV2ZW50KCd0ZXN0Jywge2J1dHRvbnM6IDF9KS5idXR0b25zID09PSAxOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICB9KSgpOwoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgUG9zc2libGUgbW91c2UgZXZlbnQgbmFtZQogICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiBtb3VzZSBldmVudCwgZmFsc2UgaWYgbm90CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTW91c2VFdmVudChuYW1lKSB7CiAgICAgIHJldHVybiBNT1VTRV9FVkVOVFMuaW5kZXhPZihuYW1lKSA+IC0xOwogICAgfQoKICAgIC8qIGVzbGludCBuby1lbXB0eTogWyJlcnJvciIsIHsgImFsbG93RW1wdHlDYXRjaCI6IHRydWUgfV0gKi8KICAgIC8vIGNoZWNrIGZvciBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogICAgbGV0IHN1cHBvcnRzUGFzc2l2ZSA9IGZhbHNlOwogICAgKGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIGxldCBvcHRzID0gT2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCAncGFzc2l2ZScsIHtnZXQoKSB7c3VwcG9ydHNQYXNzaXZlID0gdHJ1ZTt9fSk7CiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBudWxsLCBvcHRzKTsKICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigndGVzdCcsIG51bGwsIG9wdHMpOwogICAgICB9IGNhdGNoKGUpIHt9CiAgICB9KSgpOwoKICAgIC8qKgogICAgICogR2VuZXJhdGUgc2V0dGluZ3MgZm9yIGV2ZW50IGxpc3RlbmVycywgZGVwZW5kYW50IG9uIGBwYXNzaXZlVG91Y2hHZXN0dXJlc2AKICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIEV2ZW50IG5hbWUgdG8gZGV0ZXJtaW5lIGlmIGB7cGFzc2l2ZX1gIG9wdGlvbiBpcwogICAgICogICBuZWVkZWQKICAgICAqIEByZXR1cm4ge3twYXNzaXZlOiBib29sZWFufSB8IHVuZGVmaW5lZH0gT3B0aW9ucyB0byB1c2UgZm9yIGFkZEV2ZW50TGlzdGVuZXIKICAgICAqICAgYW5kIHJlbW92ZUV2ZW50TGlzdGVuZXIKICAgICAqLwogICAgZnVuY3Rpb24gUEFTU0lWRV9UT1VDSChldmVudE5hbWUpIHsKICAgICAgaWYgKGlzTW91c2VFdmVudChldmVudE5hbWUpIHx8IGV2ZW50TmFtZSA9PT0gJ3RvdWNoZW5kJykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBpZiAoSEFTX05BVElWRV9UQSAmJiBzdXBwb3J0c1Bhc3NpdmUgJiYgcGFzc2l2ZVRvdWNoR2VzdHVyZXMpIHsKICAgICAgICByZXR1cm4ge3Bhc3NpdmU6IHRydWV9OwogICAgICB9IGVsc2UgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgfQoKICAgIC8vIENoZWNrIGZvciB0b3VjaC1vbmx5IGRldmljZXMKICAgIGxldCBJU19UT1VDSF9PTkxZID0gbmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvaVAoPzpbb2FdZHxob25lKXxBbmRyb2lkLyk7CgogICAgLy8ga2VlcCB0cmFjayBvZiBhbnkgbGFiZWxzIGhpdCBieSB0aGUgbW91c2VDYW5jZWxsZXIKICAgIC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MTGFiZWxFbGVtZW50Pn0gKi8KICAgIGNvbnN0IGNsaWNrZWRMYWJlbHMgPSBbXTsKCiAgICAvKiogQHR5cGUgeyFPYmplY3Q8Ym9vbGVhbj59ICovCiAgICBjb25zdCBsYWJlbGxhYmxlID0gewogICAgICAnYnV0dG9uJzogdHJ1ZSwKICAgICAgJ2lucHV0JzogdHJ1ZSwKICAgICAgJ2tleWdlbic6IHRydWUsCiAgICAgICdtZXRlcic6IHRydWUsCiAgICAgICdvdXRwdXQnOiB0cnVlLAogICAgICAndGV4dGFyZWEnOiB0cnVlLAogICAgICAncHJvZ3Jlc3MnOiB0cnVlLAogICAgICAnc2VsZWN0JzogdHJ1ZQogICAgfTsKCiAgICAvLyBEZWZpbmVkIGF0IGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL2Zvcm0tY29udHJvbC1pbmZyYXN0cnVjdHVyZS5odG1sI2VuYWJsaW5nLWFuZC1kaXNhYmxpbmctZm9ybS1jb250cm9sczotdGhlLWRpc2FibGVkLWF0dHJpYnV0ZQogICAgLyoqIEB0eXBlIHshT2JqZWN0PGJvb2xlYW4+fSAqLwogICAgY29uc3QgY2FuQmVEaXNhYmxlZCA9IHsKICAgICAgJ2J1dHRvbic6IHRydWUsCiAgICAgICdjb21tYW5kJzogdHJ1ZSwKICAgICAgJ2ZpZWxkc2V0JzogdHJ1ZSwKICAgICAgJ2lucHV0JzogdHJ1ZSwKICAgICAgJ2tleWdlbic6IHRydWUsCiAgICAgICdvcHRncm91cCc6IHRydWUsCiAgICAgICdvcHRpb24nOiB0cnVlLAogICAgICAnc2VsZWN0JzogdHJ1ZSwKICAgICAgJ3RleHRhcmVhJzogdHJ1ZQogICAgfTsKCiAgICAvKioKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsIEVsZW1lbnQgdG8gY2hlY2sgbGFiZWxsaW5nIHN0YXR1cwogICAgICogQHJldHVybiB7Ym9vbGVhbn0gZWxlbWVudCBjYW4gaGF2ZSBsYWJlbHMKICAgICAqLwogICAgZnVuY3Rpb24gY2FuQmVMYWJlbGxlZChlbCkgewogICAgICByZXR1cm4gbGFiZWxsYWJsZVtlbC5sb2NhbE5hbWVdIHx8IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgRWxlbWVudCB0aGF0IG1heSBiZSBsYWJlbGxlZC4KICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTExhYmVsRWxlbWVudD59IFJlbGV2YW50IGxhYmVsIGZvciBgZWxgCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hdGNoaW5nTGFiZWxzKGVsKSB7CiAgICAgIGxldCBsYWJlbHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCgvKiogQHR5cGUge0hUTUxJbnB1dEVsZW1lbnR9ICovKGVsKS5sYWJlbHMgfHwgW10pOwogICAgICAvLyBJRSBkb2Vzbid0IGhhdmUgYGxhYmVsc2AgYW5kIFNhZmFyaSBkb2Vzbid0IHBvcHVsYXRlIGBsYWJlbHNgCiAgICAgIC8vIGlmIGVsZW1lbnQgaXMgaW4gYSBzaGFkb3dyb290LgogICAgICAvLyBJbiB0aGlzIGluc3RhbmNlLCBmaW5kaW5nIHRoZSBub24tYW5jZXN0b3IgbGFiZWxzIGlzIGVub3VnaCwKICAgICAgLy8gYXMgdGhlIG1vdXNlQ2FuY2VsbG9yIGNvZGUgd2lsbCBoYW5kbGUgYW5jc3RvciBsYWJlbHMKICAgICAgaWYgKCFsYWJlbHMubGVuZ3RoKSB7CiAgICAgICAgbGFiZWxzID0gW107CiAgICAgICAgbGV0IHJvb3QgPSBlbC5nZXRSb290Tm9kZSgpOwogICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGlkIG9uIGBlbGAsIGNoZWNrIGZvciBhbGwgbGFiZWxzIHdpdGggYSBtYXRjaGluZyBgZm9yYCBhdHRyaWJ1dGUKICAgICAgICBpZiAoZWwuaWQpIHsKICAgICAgICAgIGxldCBtYXRjaGluZyA9IHJvb3QucXVlcnlTZWxlY3RvckFsbChgbGFiZWxbZm9yID0gJHtlbC5pZH1dYCk7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hdGNoaW5nLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxhYmVscy5wdXNoKC8qKiBAdHlwZSB7IUhUTUxMYWJlbEVsZW1lbnR9ICovKG1hdGNoaW5nW2ldKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBsYWJlbHM7CiAgICB9CgogICAgLy8gdG91Y2ggd2lsbCBtYWtlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgIC8vIGBwcmV2ZW50RGVmYXVsdGAgb24gdG91Y2hlbmQgd2lsbCBjYW5jZWwgdGhlbSwKICAgIC8vIGJ1dCB0aGlzIGJyZWFrcyBgPGlucHV0PmAgZm9jdXMgYW5kIGxpbmsgY2xpY2tzCiAgICAvLyBkaXNhYmxlIG1vdXNlIGhhbmRsZXJzIGZvciBNT1VTRV9USU1FT1VUIG1zIGFmdGVyCiAgICAvLyBhIHRvdWNoZW5kIHRvIGlnbm9yZSBzeW50aGV0aWMgbW91c2UgZXZlbnRzCiAgICBsZXQgbW91c2VDYW5jZWxsZXIgPSBmdW5jdGlvbihtb3VzZUV2ZW50KSB7CiAgICAgIC8vIENoZWNrIGZvciBzb3VyY2VDYXBhYmlsaXRpZXMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggc3ludGhldGljIGV2ZW50cwogICAgICAvLyBpZiBtb3VzZUV2ZW50IGRpZCBub3QgY29tZSBmcm9tIGEgZGV2aWNlIHRoYXQgZmlyZXMgdG91Y2ggZXZlbnRzLAogICAgICAvLyBpdCB3YXMgbWFkZSBieSBhIHJlYWwgbW91c2UgYW5kIHNob3VsZCBiZSBjb3VudGVkCiAgICAgIC8vIGh0dHA6Ly93aWNnLmdpdGh1Yi5pby9JbnB1dERldmljZUNhcGFiaWxpdGllcy8jZG9tLWlucHV0ZGV2aWNlY2FwYWJpbGl0aWVzLWZpcmVzdG91Y2hldmVudHMKICAgICAgbGV0IHNjID0gbW91c2VFdmVudC5zb3VyY2VDYXBhYmlsaXRpZXM7CiAgICAgIGlmIChzYyAmJiAhc2MuZmlyZXNUb3VjaEV2ZW50cykgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBza2lwIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgICAgbW91c2VFdmVudFtIQU5ETEVEX09CSl0gPSB7c2tpcDogdHJ1ZX07CiAgICAgIC8vIGRpc2FibGUgImdob3N0IGNsaWNrcyIKICAgICAgaWYgKG1vdXNlRXZlbnQudHlwZSA9PT0gJ2NsaWNrJykgewogICAgICAgIGxldCBjbGlja0Zyb21MYWJlbCA9IGZhbHNlOwogICAgICAgIGxldCBwYXRoID0gZ2V0Q29tcG9zZWRQYXRoKG1vdXNlRXZlbnQpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGF0aC5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHBhdGhbaV0ubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgIGlmIChwYXRoW2ldLmxvY2FsTmFtZSA9PT0gJ2xhYmVsJykgewogICAgICAgICAgICAgIGNsaWNrZWRMYWJlbHMucHVzaCgvKiogQHR5cGUgeyFIVE1MTGFiZWxFbGVtZW50fSAqLyAocGF0aFtpXSkpOwogICAgICAgICAgICB9IGVsc2UgaWYgKGNhbkJlTGFiZWxsZWQoLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovIChwYXRoW2ldKSkpIHsKICAgICAgICAgICAgICBsZXQgb3duZXJMYWJlbHMgPQogICAgICAgICAgICAgICAgICBtYXRjaGluZ0xhYmVscygvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8gKHBhdGhbaV0pKTsKICAgICAgICAgICAgICAvLyBjaGVjayBpZiBvbmUgb2YgdGhlIGNsaWNrZWQgbGFiZWxzIGlzIGxhYmVsbGluZyB0aGlzIGVsZW1lbnQKICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG93bmVyTGFiZWxzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBjbGlja0Zyb21MYWJlbCA9IGNsaWNrRnJvbUxhYmVsIHx8IGNsaWNrZWRMYWJlbHMuaW5kZXhPZihvd25lckxhYmVsc1tqXSkgPiAtMTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChwYXRoW2ldID09PSBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0KSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gaWYgb25lIG9mIHRoZSBjbGlja2VkIGxhYmVscyB3YXMgbGFiZWxsaW5nIHRoZSB0YXJnZXQgZWxlbWVudCwKICAgICAgICAvLyB0aGlzIGlzIG5vdCBhIGdob3N0IGNsaWNrCiAgICAgICAgaWYgKGNsaWNrRnJvbUxhYmVsKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIG1vdXNlRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBtb3VzZUV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHBhcmFtIHtib29sZWFuPX0gc2V0dXAgVHJ1ZSB0byBhZGQsIGZhbHNlIHRvIHJlbW92ZS4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcihzZXR1cCkgewogICAgICBsZXQgZXZlbnRzID0gSVNfVE9VQ0hfT05MWSA/IFsnY2xpY2snXSA6IE1PVVNFX0VWRU5UUzsKICAgICAgZm9yIChsZXQgaSA9IDAsIGVuOyBpIDwgZXZlbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZW4gPSBldmVudHNbaV07CiAgICAgICAgaWYgKHNldHVwKSB7CiAgICAgICAgICAvLyByZXNldCBjbGlja0xhYmVscyBhcnJheQogICAgICAgICAgY2xpY2tlZExhYmVscy5sZW5ndGggPSAwOwogICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihlbiwgbW91c2VDYW5jZWxsZXIsIHRydWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKGVuLCBtb3VzZUNhbmNlbGxlciwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaWdub3JlTW91c2UoZSkgewogICAgICBpZiAoIVBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYikgewogICAgICAgIHNldHVwVGVhcmRvd25Nb3VzZUNhbmNlbGxlcih0cnVlKTsKICAgICAgfQogICAgICBsZXQgdW5zZXQgPSBmdW5jdGlvbigpIHsKICAgICAgICBzZXR1cFRlYXJkb3duTW91c2VDYW5jZWxsZXIoKTsKICAgICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gbnVsbDsKICAgICAgICBQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IgPSBudWxsOwogICAgICB9OwogICAgICBQT0lOVEVSU1RBVEUubW91c2UudGFyZ2V0ID0gZ2V0Q29tcG9zZWRQYXRoKGUpWzBdOwogICAgICBQT0lOVEVSU1RBVEUubW91c2UubW91c2VJZ25vcmVKb2IgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgIFBPSU5URVJTVEFURS5tb3VzZS5tb3VzZUlnbm9yZUpvYgogICAgICAgICAgLCB0aW1lT3V0LmFmdGVyKE1PVVNFX1RJTUVPVVQpCiAgICAgICAgICAsIHVuc2V0KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZXYgZXZlbnQgdG8gdGVzdCBmb3IgbGVmdCBtb3VzZSBidXR0b24gZG93bgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gaGFzIGxlZnQgbW91c2UgYnV0dG9uIGRvd24KICAgICAqLwogICAgZnVuY3Rpb24gaGFzTGVmdE1vdXNlQnV0dG9uKGV2KSB7CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgLy8gZXhpdCBlYXJseSBpZiB0aGUgZXZlbnQgaXMgbm90IGEgbW91c2UgZXZlbnQKICAgICAgaWYgKCFpc01vdXNlRXZlbnQodHlwZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgLy8gZXYuYnV0dG9uIGlzIG5vdCByZWxpYWJsZSBmb3IgbW91c2Vtb3ZlICgwIGlzIG92ZXJsb2FkZWQgYXMgYm90aCBsZWZ0IGJ1dHRvbiBhbmQgbm8gYnV0dG9ucykKICAgICAgLy8gaW5zdGVhZCB3ZSB1c2UgZXYuYnV0dG9ucyAoYml0bWFzayBvZiBidXR0b25zKSBvciBmYWxsIGJhY2sgdG8gZXYud2hpY2ggKGRlcHJlY2F0ZWQsIDAgZm9yIG5vIGJ1dHRvbnMsIDEgZm9yIGxlZnQgYnV0dG9uKQogICAgICBpZiAodHlwZSA9PT0gJ21vdXNlbW92ZScpIHsKICAgICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgICAgbGV0IGJ1dHRvbnMgPSBldi5idXR0b25zID09PSB1bmRlZmluZWQgPyAxIDogZXYuYnV0dG9uczsKICAgICAgICBpZiAoKGV2IGluc3RhbmNlb2Ygd2luZG93Lk1vdXNlRXZlbnQpICYmICFNT1VTRV9IQVNfQlVUVE9OUykgewogICAgICAgICAgYnV0dG9ucyA9IE1PVVNFX1dISUNIX1RPX0JVVFRPTlNbZXYud2hpY2hdIHx8IDA7CiAgICAgICAgfQogICAgICAgIC8vIGJ1dHRvbnMgaXMgYSBiaXRtYXNrLCBjaGVjayB0aGF0IHRoZSBsZWZ0IGJ1dHRvbiBiaXQgaXMgc2V0ICgxKQogICAgICAgIHJldHVybiBCb29sZWFuKGJ1dHRvbnMgJiAxKTsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBhbGxvdyB1bmRlZmluZWQgZm9yIHRlc3RpbmcgZXZlbnRzCiAgICAgICAgbGV0IGJ1dHRvbiA9IGV2LmJ1dHRvbiA9PT0gdW5kZWZpbmVkID8gMCA6IGV2LmJ1dHRvbjsKICAgICAgICAvLyBldi5idXR0b24gaXMgMCBpbiBtb3VzZWRvd24vbW91c2V1cC9jbGljayBmb3IgbGVmdCBidXR0b24gYWN0aXZhdGlvbgogICAgICAgIHJldHVybiBidXR0b24gPT09IDA7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpc1N5bnRoZXRpY0NsaWNrKGV2KSB7CiAgICAgIGlmIChldi50eXBlID09PSAnY2xpY2snKSB7CiAgICAgICAgLy8gZXYuZGV0YWlsIGlzIDAgZm9yIEhUTUxFbGVtZW50LmNsaWNrIGluIG1vc3QgYnJvd3NlcnMKICAgICAgICBpZiAoZXYuZGV0YWlsID09PSAwKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLy8gaW4gdGhlIHdvcnN0IGNhc2UsIGNoZWNrIHRoYXQgdGhlIHgveSBwb3NpdGlvbiBvZiB0aGUgY2xpY2sgaXMgd2l0aGluCiAgICAgICAgLy8gdGhlIGJvdW5kaW5nIGJveCBvZiB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudAogICAgICAgIC8vIFRoYW5rcyBJRSAxMCA+OigKICAgICAgICBsZXQgdCA9IF9maW5kT3JpZ2luYWxUYXJnZXQoZXYpOwogICAgICAgIC8vIG1ha2Ugc3VyZSB0aGUgdGFyZ2V0IG9mIHRoZSBldmVudCBpcyBhbiBlbGVtZW50IHNvIHdlIGNhbiB1c2UgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LAogICAgICAgIC8vIGlmIG5vdCwganVzdCBhc3N1bWUgaXQgaXMgYSBzeW50aGV0aWMgY2xpY2sKICAgICAgICBpZiAoIXQubm9kZVR5cGUgfHwgLyoqIEB0eXBlIHtFbGVtZW50fSAqLyh0KS5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBsZXQgYmNyID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyh0KS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAvLyB1c2UgcGFnZSB4L3kgdG8gYWNjb3VudCBmb3Igc2Nyb2xsaW5nCiAgICAgICAgbGV0IHggPSBldi5wYWdlWCwgeSA9IGV2LnBhZ2VZOwogICAgICAgIC8vIGV2IGlzIGEgc3ludGhldGljIGNsaWNrIGlmIHRoZSBwb3NpdGlvbiBpcyBvdXRzaWRlIHRoZSBib3VuZGluZyBib3ggb2YgdGhlIHRhcmdldAogICAgICAgIHJldHVybiAhKCh4ID49IGJjci5sZWZ0ICYmIHggPD0gYmNyLnJpZ2h0KSAmJiAoeSA+PSBiY3IudG9wICYmIHkgPD0gYmNyLmJvdHRvbSkpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICBsZXQgUE9JTlRFUlNUQVRFID0gewogICAgICBtb3VzZTogewogICAgICAgIHRhcmdldDogbnVsbCwKICAgICAgICBtb3VzZUlnbm9yZUpvYjogbnVsbAogICAgICB9LAogICAgICB0b3VjaDogewogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICBpZDogLTEsCiAgICAgICAgc2Nyb2xsRGVjaWRlZDogZmFsc2UKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBmaXJzdFRvdWNoQWN0aW9uKGV2KSB7CiAgICAgIGxldCB0YSA9ICdhdXRvJzsKICAgICAgbGV0IHBhdGggPSBnZXRDb21wb3NlZFBhdGgoZXYpOwogICAgICBmb3IgKGxldCBpID0gMCwgbjsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICBuID0gcGF0aFtpXTsKICAgICAgICBpZiAobltUT1VDSF9BQ1RJT05dKSB7CiAgICAgICAgICB0YSA9IG5bVE9VQ0hfQUNUSU9OXTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGE7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhY2tEb2N1bWVudChzdGF0ZU9iaiwgbW92ZWZuLCB1cGZuKSB7CiAgICAgIHN0YXRlT2JqLm1vdmVmbiA9IG1vdmVmbjsKICAgICAgc3RhdGVPYmoudXBmbiA9IHVwZm47CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlbW92ZScsIG1vdmVmbik7CiAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB1cGZuKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1bnRyYWNrRG9jdW1lbnQoc3RhdGVPYmopIHsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgc3RhdGVPYmoubW92ZWZuKTsKICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIHN0YXRlT2JqLnVwZm4pOwogICAgICBzdGF0ZU9iai5tb3ZlZm4gPSBudWxsOwogICAgICBzdGF0ZU9iai51cGZuID0gbnVsbDsKICAgIH0KCiAgICB7CiAgICAgIC8vIHVzZSBhIGRvY3VtZW50LXdpZGUgdG91Y2hlbmQgbGlzdGVuZXIgdG8gc3RhcnQgdGhlIGdob3N0LWNsaWNrIHByZXZlbnRpb24gbWVjaGFuaXNtCiAgICAgIC8vIFVzZSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycywgaWYgc3VwcG9ydGVkLCB0byBub3QgYWZmZWN0IHNjcm9sbGluZyBwZXJmb3JtYW5jZQogICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIGlnbm9yZU1vdXNlLCBzdXBwb3J0c1Bhc3NpdmUgPyB7cGFzc2l2ZTogdHJ1ZX0gOiBmYWxzZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBjb21wb3NlZFBhdGggZm9yIHRoZSBnaXZlbiBldmVudC4KICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IHRvIHByb2Nlc3MKICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBQYXRoIG9mIHRoZSBldmVudAogICAgICovCiAgICBjb25zdCBnZXRDb21wb3NlZFBhdGggPSB3aW5kb3cuU2hhZHlET00gJiYgd2luZG93LlNoYWR5RE9NLm5vUGF0Y2ggPwogICAgICB3aW5kb3cuU2hhZHlET00uY29tcG9zZWRQYXRoIDoKICAgICAgKGV2ZW50KSA9PiBldmVudC5jb21wb3NlZFBhdGggJiYgZXZlbnQuY29tcG9zZWRQYXRoKCkgfHwgW107CgogICAgLyoqIEB0eXBlIHshT2JqZWN0PHN0cmluZywgIUdlc3R1cmVSZWNvZ25pemVyPn0gKi8KICAgIGNvbnN0IGdlc3R1cmVzID0ge307CgogICAgLyoqIEB0eXBlIHshQXJyYXk8IUdlc3R1cmVSZWNvZ25pemVyPn0gKi8KICAgIGNvbnN0IHJlY29nbml6ZXJzID0gW107CgogICAgLyoqCiAgICAgKiBGaW5kcyB0aGUgZWxlbWVudCByZW5kZXJlZCBvbiB0aGUgc2NyZWVuIGF0IHRoZSBwcm92aWRlZCBjb29yZGluYXRlcy4KICAgICAqCiAgICAgKiBTaW1pbGFyIHRvIGBkb2N1bWVudC5lbGVtZW50RnJvbVBvaW50YCwgYnV0IHBpZXJjZXMgdGhyb3VnaAogICAgICogc2hhZG93IHJvb3RzLgogICAgICoKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IEhvcml6b250YWwgcGl4ZWwgY29vcmRpbmF0ZQogICAgICogQHBhcmFtIHtudW1iZXJ9IHkgVmVydGljYWwgcGl4ZWwgY29vcmRpbmF0ZQogICAgICogQHJldHVybiB7RWxlbWVudH0gUmV0dXJucyB0aGUgZGVlcGVzdCBzaGFkb3dSb290IGluY2x1c2l2ZSBlbGVtZW50CiAgICAgKiBmb3VuZCBhdCB0aGUgc2NyZWVuIHBvc2l0aW9uIGdpdmVuLgogICAgICovCiAgICBmdW5jdGlvbiBkZWVwVGFyZ2V0RmluZCh4LCB5KSB7CiAgICAgIGxldCBub2RlID0gZG9jdW1lbnQuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgbGV0IG5leHQgPSBub2RlOwogICAgICAvLyB0aGlzIGNvZGUgcGF0aCBpcyBvbmx5IHRha2VuIHdoZW4gbmF0aXZlIFNoYWRvd0RPTSBpcyB1c2VkCiAgICAgIC8vIGlmIHRoZXJlIGlzIGEgc2hhZG93cm9vdCwgaXQgbWF5IGhhdmUgYSBub2RlIGF0IHgveQogICAgICAvLyBpZiB0aGVyZSBpcyBub3QgYSBzaGFkb3dyb290LCBleGl0IHRoZSBsb29wCiAgICAgIHdoaWxlIChuZXh0ICYmIG5leHQuc2hhZG93Um9vdCAmJiAhd2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSBub2RlIGF0IHgveSBpbiB0aGUgc2hhZG93cm9vdCwgbG9vayBkZWVwZXIKICAgICAgICBsZXQgb2xkTmV4dCA9IG5leHQ7CiAgICAgICAgbmV4dCA9IG5leHQuc2hhZG93Um9vdC5lbGVtZW50RnJvbVBvaW50KHgsIHkpOwogICAgICAgIC8vIG9uIFNhZmFyaSwgZWxlbWVudEZyb21Qb2ludCBtYXkgcmV0dXJuIHRoZSBzaGFkb3dSb290IGhvc3QKICAgICAgICBpZiAob2xkTmV4dCA9PT0gbmV4dCkgewogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBhIGNoZWFwZXIgY2hlY2sgdGhhbiBldi5jb21wb3NlZFBhdGgoKVswXTsKICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtFdmVudHxUb3VjaH0gZXYgRXZlbnQuCiAgICAgKiBAcmV0dXJuIHtFdmVudFRhcmdldH0gUmV0dXJucyB0aGUgZXZlbnQgdGFyZ2V0LgogICAgICovCiAgICBmdW5jdGlvbiBfZmluZE9yaWdpbmFsVGFyZ2V0KGV2KSB7CiAgICAgIGNvbnN0IHBhdGggPSBnZXRDb21wb3NlZFBhdGgoLyoqIEB0eXBlIHs/RXZlbnR9ICovIChldikpOwogICAgICAvLyBJdCBzaG91bGRuJ3QgYmUsIGJ1dCBzb21ldGltZXMgcGF0aCBpcyBlbXB0eSAod2luZG93IG9uIFNhZmFyaSkuCiAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoWzBdIDogZXYudGFyZ2V0OwogICAgfQoKICAgIC8qKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZnVuY3Rpb24gX2hhbmRsZU5hdGl2ZShldikgewogICAgICBsZXQgaGFuZGxlZDsKICAgICAgbGV0IHR5cGUgPSBldi50eXBlOwogICAgICBsZXQgbm9kZSA9IGV2LmN1cnJlbnRUYXJnZXQ7CiAgICAgIGxldCBnb2JqID0gbm9kZVtHRVNUVVJFX0tFWV07CiAgICAgIGlmICghZ29iaikgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICBsZXQgZ3MgPSBnb2JqW3R5cGVdOwogICAgICBpZiAoIWdzKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGlmICghZXZbSEFORExFRF9PQkpdKSB7CiAgICAgICAgZXZbSEFORExFRF9PQkpdID0ge307CiAgICAgICAgaWYgKHR5cGUuc2xpY2UoMCwgNSkgPT09ICd0b3VjaCcpIHsKICAgICAgICAgIGV2ID0gLyoqIEB0eXBlIHtUb3VjaEV2ZW50fSAqLyhldik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1hc3NpZ24KICAgICAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgICAgICBpZiAodHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIG9ubHkgaGFuZGxlIHRoZSBmaXJzdCBmaW5nZXIKICAgICAgICAgICAgaWYgKGV2LnRvdWNoZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLmlkID0gdC5pZGVudGlmaWVyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLmlkICE9PSB0LmlkZW50aWZpZXIpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCFIQVNfTkFUSVZFX1RBKSB7CiAgICAgICAgICAgIGlmICh0eXBlID09PSAndG91Y2hzdGFydCcgfHwgdHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICAgICAgICBfaGFuZGxlVG91Y2hBY3Rpb24oZXYpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIGhhbmRsZWQgPSBldltIQU5ETEVEX09CSl07CiAgICAgIC8vIHVzZWQgdG8gaWdub3JlIHN5bnRoZXRpYyBtb3VzZSBldmVudHMKICAgICAgaWYgKGhhbmRsZWQuc2tpcCkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyByZXNldCByZWNvZ25pemVyIHN0YXRlCiAgICAgIGZvciAobGV0IGkgPSAwLCByOyBpIDwgcmVjb2duaXplcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICByID0gcmVjb2duaXplcnNbaV07CiAgICAgICAgaWYgKGdzW3IubmFtZV0gJiYgIWhhbmRsZWRbci5uYW1lXSkgewogICAgICAgICAgaWYgKHIuZmxvdyAmJiByLmZsb3cuc3RhcnQuaW5kZXhPZihldi50eXBlKSA+IC0xICYmIHIucmVzZXQpIHsKICAgICAgICAgICAgci5yZXNldCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICAvLyBlbmZvcmNlIGdlc3R1cmUgcmVjb2duaXplciBvcmRlcgogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHJlY29nbml6ZXJzW2ldOwogICAgICAgIGlmIChnc1tyLm5hbWVdICYmICFoYW5kbGVkW3IubmFtZV0pIHsKICAgICAgICAgIGhhbmRsZWRbci5uYW1lXSA9IHRydWU7CiAgICAgICAgICByW3R5cGVdKGV2KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGV2IEV2ZW50LgogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZnVuY3Rpb24gX2hhbmRsZVRvdWNoQWN0aW9uKGV2KSB7CiAgICAgIGxldCB0ID0gZXYuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIGxldCB0eXBlID0gZXYudHlwZTsKICAgICAgaWYgKHR5cGUgPT09ICd0b3VjaHN0YXJ0JykgewogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC54ID0gdC5jbGllbnRYOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC55ID0gdC5jbGllbnRZOwogICAgICAgIFBPSU5URVJTVEFURS50b3VjaC5zY3JvbGxEZWNpZGVkID0gZmFsc2U7CiAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ3RvdWNobW92ZScpIHsKICAgICAgICBpZiAoUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgUE9JTlRFUlNUQVRFLnRvdWNoLnNjcm9sbERlY2lkZWQgPSB0cnVlOwogICAgICAgIGxldCB0YSA9IGZpcnN0VG91Y2hBY3Rpb24oZXYpOwogICAgICAgIGxldCBzaG91bGRQcmV2ZW50ID0gZmFsc2U7CiAgICAgICAgbGV0IGR4ID0gTWF0aC5hYnMoUE9JTlRFUlNUQVRFLnRvdWNoLnggLSB0LmNsaWVudFgpOwogICAgICAgIGxldCBkeSA9IE1hdGguYWJzKFBPSU5URVJTVEFURS50b3VjaC55IC0gdC5jbGllbnRZKTsKICAgICAgICBpZiAoIWV2LmNhbmNlbGFibGUpIDsgZWxzZSBpZiAodGEgPT09ICdub25lJykgewogICAgICAgICAgc2hvdWxkUHJldmVudCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmICh0YSA9PT0gJ3Bhbi14JykgewogICAgICAgICAgc2hvdWxkUHJldmVudCA9IGR5ID4gZHg7CiAgICAgICAgfSBlbHNlIGlmICh0YSA9PT0gJ3Bhbi15JykgewogICAgICAgICAgc2hvdWxkUHJldmVudCA9IGR4ID4gZHk7CiAgICAgICAgfQogICAgICAgIGlmIChzaG91bGRQcmV2ZW50KSB7CiAgICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwcmV2ZW50KCd0cmFjaycpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byBhIG5vZGUgZm9yIHRoZSBnaXZlbiBnZXN0dXJlIHR5cGUuCiAgICAgKgogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IG5vZGUgTm9kZSB0byBhZGQgbGlzdGVuZXIgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgR2VzdHVyZSB0eXBlOiBgZG93bmAsIGB1cGAsIGB0cmFja2AsIG9yIGB0YXBgCiAgICAgKiBAcGFyYW0geyFmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgRXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gdG8gY2FsbAogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lciB3YXMgYWRkZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpc3RlbmVyKG5vZGUsIGV2VHlwZSwgaGFuZGxlcikgewogICAgICBpZiAoZ2VzdHVyZXNbZXZUeXBlXSkgewogICAgICAgIF9hZGQobm9kZSwgZXZUeXBlLCBoYW5kbGVyKTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZW1vdmVzIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBub2RlIGZvciB0aGUgZ2l2ZW4gZ2VzdHVyZSB0eXBlLgogICAgICoKICAgICAqIEBwYXJhbSB7IUV2ZW50VGFyZ2V0fSBub2RlIE5vZGUgdG8gcmVtb3ZlIGxpc3RlbmVyIGZyb20KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgR2VzdHVyZSB0eXBlOiBgZG93bmAsIGB1cGAsIGB0cmFja2AsIG9yIGB0YXBgCiAgICAgKiBAcGFyYW0geyFmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgRXZlbnQgbGlzdGVuZXIgZnVuY3Rpb24gcHJldmlvdXNseSBwYXNzZWQgdG8KICAgICAqICBgYWRkTGlzdGVuZXJgLgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGEgZ2VzdHVyZSBldmVudCBsaXN0ZW5lciB3YXMgcmVtb3ZlZC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXIobm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGlmIChnZXN0dXJlc1tldlR5cGVdKSB7CiAgICAgICAgX3JlbW92ZShub2RlLCBldlR5cGUsIGhhbmRsZXIpOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICAvKioKICAgICAqIGF1dG9tYXRlIHRoZSBldmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBuYXRpdmUgZXZlbnRzCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7IUV2ZW50VGFyZ2V0fSBub2RlIE5vZGUgb24gd2hpY2ggdG8gYWRkIHRoZSBldmVudC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgRXZlbnQgdHlwZSB0byBhZGQuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCl9IGhhbmRsZXIgRXZlbnQgaGFuZGxlciBmdW5jdGlvbi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9hZGQobm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gZ2VzdHVyZXNbZXZUeXBlXTsKICAgICAgbGV0IGRlcHMgPSByZWNvZ25pemVyLmRlcHM7CiAgICAgIGxldCBuYW1lID0gcmVjb2duaXplci5uYW1lOwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoIWdvYmopIHsKICAgICAgICBub2RlW0dFU1RVUkVfS0VZXSA9IGdvYmogPSB7fTsKICAgICAgfQogICAgICBmb3IgKGxldCBpID0gMCwgZGVwLCBnZDsgaSA8IGRlcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBkZXAgPSBkZXBzW2ldOwogICAgICAgIC8vIGRvbid0IGFkZCBtb3VzZSBoYW5kbGVycyBvbiBpT1MgYmVjYXVzZSB0aGV5IGNhdXNlIGdyYXkgc2VsZWN0aW9uIG92ZXJsYXlzCiAgICAgICAgaWYgKElTX1RPVUNIX09OTFkgJiYgaXNNb3VzZUV2ZW50KGRlcCkgJiYgZGVwICE9PSAnY2xpY2snKSB7CiAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgZ2QgPSBnb2JqW2RlcF07CiAgICAgICAgaWYgKCFnZCkgewogICAgICAgICAgZ29ialtkZXBdID0gZ2QgPSB7X2NvdW50OiAwfTsKICAgICAgICB9CiAgICAgICAgaWYgKGdkLl9jb3VudCA9PT0gMCkgewogICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKGRlcCwgX2hhbmRsZU5hdGl2ZSwgUEFTU0lWRV9UT1VDSChkZXApKTsKICAgICAgICB9CiAgICAgICAgZ2RbbmFtZV0gPSAoZ2RbbmFtZV0gfHwgMCkgKyAxOwogICAgICAgIGdkLl9jb3VudCA9IChnZC5fY291bnQgfHwgMCkgKyAxOwogICAgICB9CiAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgICBpZiAocmVjb2duaXplci50b3VjaEFjdGlvbikgewogICAgICAgIHNldFRvdWNoQWN0aW9uKG5vZGUsIHJlY29nbml6ZXIudG91Y2hBY3Rpb24pOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBhdXRvbWF0ZSBldmVudCBsaXN0ZW5lciByZW1vdmFsIGZvciBuYXRpdmUgZXZlbnRzCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7IUV2ZW50VGFyZ2V0fSBub2RlIE5vZGUgb24gd2hpY2ggdG8gcmVtb3ZlIHRoZSBldmVudC4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldlR5cGUgRXZlbnQgdHlwZSB0byByZW1vdmUuCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6IHZvaWR9IGhhbmRsZXIgRXZlbnQgaGFuZGxlciBmdW5jdGlvbi4KICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9yZW1vdmUobm9kZSwgZXZUeXBlLCBoYW5kbGVyKSB7CiAgICAgIGxldCByZWNvZ25pemVyID0gZ2VzdHVyZXNbZXZUeXBlXTsKICAgICAgbGV0IGRlcHMgPSByZWNvZ25pemVyLmRlcHM7CiAgICAgIGxldCBuYW1lID0gcmVjb2duaXplci5uYW1lOwogICAgICBsZXQgZ29iaiA9IG5vZGVbR0VTVFVSRV9LRVldOwogICAgICBpZiAoZ29iaikgewogICAgICAgIGZvciAobGV0IGkgPSAwLCBkZXAsIGdkOyBpIDwgZGVwcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgZGVwID0gZGVwc1tpXTsKICAgICAgICAgIGdkID0gZ29ialtkZXBdOwogICAgICAgICAgaWYgKGdkICYmIGdkW25hbWVdKSB7CiAgICAgICAgICAgIGdkW25hbWVdID0gKGdkW25hbWVdIHx8IDEpIC0gMTsKICAgICAgICAgICAgZ2QuX2NvdW50ID0gKGdkLl9jb3VudCB8fCAxKSAtIDE7CiAgICAgICAgICAgIGlmIChnZC5fY291bnQgPT09IDApIHsKICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZGVwLCBfaGFuZGxlTmF0aXZlLCBQQVNTSVZFX1RPVUNIKGRlcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcihldlR5cGUsIGhhbmRsZXIpOwogICAgfQoKICAgIC8qKgogICAgICogUmVnaXN0ZXJzIGEgbmV3IGdlc3R1cmUgZXZlbnQgcmVjb2duaXplciBmb3IgYWRkaW5nIG5ldyBjdXN0b20KICAgICAqIGdlc3R1cmUgZXZlbnQgdHlwZXMuCiAgICAgKgogICAgICogQHBhcmFtIHshR2VzdHVyZVJlY29nbml6ZXJ9IHJlY29nIEdlc3R1cmUgcmVjb2duaXplciBkZXNjcmlwdG9yCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmdW5jdGlvbiByZWdpc3RlciQxKHJlY29nKSB7CiAgICAgIHJlY29nbml6ZXJzLnB1c2gocmVjb2cpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlY29nLmVtaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgZ2VzdHVyZXNbcmVjb2cuZW1pdHNbaV1dID0gcmVjb2c7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdlc3R1cmUgZm9yIHRoZSBnaXZlbiBldmVudCBuYW1lLgogICAgICovCiAgICBmdW5jdGlvbiBfZmluZFJlY29nbml6ZXJCeUV2ZW50KGV2TmFtZSkgewogICAgICBmb3IgKGxldCBpID0gMCwgcjsgaSA8IHJlY29nbml6ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgciA9IHJlY29nbml6ZXJzW2ldOwogICAgICAgIGZvciAobGV0IGogPSAwLCBuOyBqIDwgci5lbWl0cy5sZW5ndGg7IGorKykgewogICAgICAgICAgbiA9IHIuZW1pdHNbal07CiAgICAgICAgICBpZiAobiA9PT0gZXZOYW1lKSB7CiAgICAgICAgICAgIHJldHVybiByOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIFNldHMgc2Nyb2xsaW5nIGRpcmVjdGlvbiBvbiBub2RlLgogICAgICoKICAgICAqIFRoaXMgdmFsdWUgaXMgY2hlY2tlZCBvbiBmaXJzdCBtb3ZlLCB0aHVzIGl0IHNob3VsZCBiZSBjYWxsZWQgcHJpb3IgdG8KICAgICAqIGFkZGluZyBldmVudCBsaXN0ZW5lcnMuCiAgICAgKgogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IG5vZGUgTm9kZSB0byBzZXQgdG91Y2ggYWN0aW9uIHNldHRpbmcgb24KICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUb3VjaCBhY3Rpb24gdmFsdWUKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFRvdWNoQWN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICAgIGlmIChIQVNfTkFUSVZFX1RBICYmIG5vZGUgaW5zdGFuY2VvZiBIVE1MRWxlbWVudCkgewogICAgICAgIC8vIE5PVEU6IGFkZCB0b3VjaEFjdGlvbiBhc3luYyBzbyB0aGF0IGV2ZW50cyBjYW4gYmUgYWRkZWQgaW4KICAgICAgICAvLyBjdXN0b20gZWxlbWVudCBjb25zdHJ1Y3RvcnMuIE90aGVyd2lzZSB3ZSBydW4gYWZvdWwgb2YgY3VzdG9tCiAgICAgICAgLy8gZWxlbWVudHMgcmVzdHJpY3Rpb24gYWdhaW5zdCBzZXR0aW5ncyBhdHRyaWJ1dGVzIChzdHlsZSkgaW4gdGhlCiAgICAgICAgLy8gY29uc3RydWN0b3IuCiAgICAgICAgbWljcm9UYXNrLnJ1bigoKSA9PiB7CiAgICAgICAgICBub2RlLnN0eWxlLnRvdWNoQWN0aW9uID0gdmFsdWU7CiAgICAgICAgfSk7CiAgICAgIH0KICAgICAgbm9kZVtUT1VDSF9BQ1RJT05dID0gdmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBEaXNwYXRjaGVzIGFuIGV2ZW50IG9uIHRoZSBgdGFyZ2V0YCBlbGVtZW50IG9mIGB0eXBlYCB3aXRoIHRoZSBnaXZlbgogICAgICogYGRldGFpbGAuCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IHRhcmdldCBUaGUgZWxlbWVudCBvbiB3aGljaCB0byBmaXJlIGFuIGV2ZW50LgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgVGhlIHR5cGUgb2YgZXZlbnQgdG8gZmlyZS4KICAgICAqIEBwYXJhbSB7IU9iamVjdD19IGRldGFpbCBUaGUgZGV0YWlsIG9iamVjdCB0byBwb3B1bGF0ZSBvbiB0aGUgZXZlbnQuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmdW5jdGlvbiBfZmlyZSh0YXJnZXQsIHR5cGUsIGRldGFpbCkgewogICAgICBsZXQgZXYgPSBuZXcgRXZlbnQodHlwZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSB9KTsKICAgICAgZXYuZGV0YWlsID0gZGV0YWlsOwogICAgICB3cmFwKC8qKiBAdHlwZSB7IU5vZGV9ICovKHRhcmdldCkpLmRpc3BhdGNoRXZlbnQoZXYpOwogICAgICAvLyBmb3J3YXJkIGBwcmV2ZW50RGVmYXVsdGAgaW4gYSBjbGVhbiB3YXkKICAgICAgaWYgKGV2LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICBsZXQgcHJldmVudGVyID0gZGV0YWlsLnByZXZlbnRlciB8fCBkZXRhaWwuc291cmNlRXZlbnQ7CiAgICAgICAgaWYgKHByZXZlbnRlciAmJiBwcmV2ZW50ZXIucHJldmVudERlZmF1bHQpIHsKICAgICAgICAgIHByZXZlbnRlci5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUHJldmVudHMgdGhlIGRpc3BhdGNoIGFuZCBkZWZhdWx0IGFjdGlvbiBvZiB0aGUgZ2l2ZW4gZXZlbnQgbmFtZS4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZOYW1lIEV2ZW50IG5hbWUuCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmdW5jdGlvbiBwcmV2ZW50KGV2TmFtZSkgewogICAgICBsZXQgcmVjb2duaXplciA9IF9maW5kUmVjb2duaXplckJ5RXZlbnQoZXZOYW1lKTsKICAgICAgaWYgKHJlY29nbml6ZXIuaW5mbykgewogICAgICAgIHJlY29nbml6ZXIuaW5mby5wcmV2ZW50ID0gdHJ1ZTsKICAgICAgfQogICAgfQoKICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCgogICAgcmVnaXN0ZXIkMSh7CiAgICAgIG5hbWU6ICdkb3dudXAnLAogICAgICBkZXBzOiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0JywgJ3RvdWNoZW5kJ10sCiAgICAgIGZsb3c6IHsKICAgICAgICBzdGFydDogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCddLAogICAgICAgIGVuZDogWydtb3VzZXVwJywgJ3RvdWNoZW5kJ10KICAgICAgfSwKICAgICAgZW1pdHM6IFsnZG93bicsICd1cCddLAoKICAgICAgaW5mbzogewogICAgICAgIG1vdmVmbjogbnVsbCwKICAgICAgICB1cGZuOiBudWxsCiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVzZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHVudHJhY2tEb2N1bWVudCh0aGlzLmluZm8pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoIWhhc0xlZnRNb3VzZUJ1dHRvbihlKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgdCA9IF9maW5kT3JpZ2luYWxUYXJnZXQoZSk7CiAgICAgICAgbGV0IHNlbGYgPSB0aGlzOwogICAgICAgIGxldCBtb3ZlZm4gPSBmdW5jdGlvbiBtb3ZlZm4oZSkgewogICAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgICAgZG93bnVwRmlyZSgndXAnLCB0LCBlKTsKICAgICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBsZXQgdXBmbiA9IGZ1bmN0aW9uIHVwZm4oZSkgewogICAgICAgICAgaWYgKGhhc0xlZnRNb3VzZUJ1dHRvbihlKSkgewogICAgICAgICAgICBkb3dudXBGaXJlKCd1cCcsIHQsIGUpOwogICAgICAgICAgfQogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfTsKICAgICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgICBkb3dudXBGaXJlKCdkb3duJywgdCwgZSk7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG91Y2hzdGFydDogZnVuY3Rpb24oZSkgewogICAgICAgIGRvd251cEZpcmUoJ2Rvd24nLCBfZmluZE9yaWdpbmFsVGFyZ2V0KGUpLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b3VjaGVuZDogZnVuY3Rpb24oZSkgewogICAgICAgIGRvd251cEZpcmUoJ3VwJywgX2ZpbmRPcmlnaW5hbFRhcmdldChlKSwgZS5jaGFuZ2VkVG91Y2hlc1swXSwgZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUKICAgICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IHRhcmdldAogICAgICogQHBhcmFtIHtFdmVudHxUb3VjaH0gZXZlbnQKICAgICAqIEBwYXJhbSB7RXZlbnQ9fSBwcmV2ZW50ZXIKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRvd251cEZpcmUodHlwZSwgdGFyZ2V0LCBldmVudCwgcHJldmVudGVyKSB7CiAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9maXJlKHRhcmdldCwgdHlwZSwgewogICAgICAgIHg6IGV2ZW50LmNsaWVudFgsCiAgICAgICAgeTogZXZlbnQuY2xpZW50WSwKICAgICAgICBzb3VyY2VFdmVudDogZXZlbnQsCiAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIsCiAgICAgICAgcHJldmVudDogZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIHByZXZlbnQoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICByZWdpc3RlciQxKHsKICAgICAgbmFtZTogJ3RyYWNrJywKICAgICAgdG91Y2hBY3Rpb246ICdub25lJywKICAgICAgZGVwczogWydtb3VzZWRvd24nLCAndG91Y2hzdGFydCcsICd0b3VjaG1vdmUnLCAndG91Y2hlbmQnXSwKICAgICAgZmxvdzogewogICAgICAgIHN0YXJ0OiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sCiAgICAgICAgZW5kOiBbJ21vdXNldXAnLCAndG91Y2hlbmQnXQogICAgICB9LAogICAgICBlbWl0czogWyd0cmFjayddLAoKICAgICAgaW5mbzogewogICAgICAgIHg6IDAsCiAgICAgICAgeTogMCwKICAgICAgICBzdGF0ZTogJ3N0YXJ0JywKICAgICAgICBzdGFydGVkOiBmYWxzZSwKICAgICAgICBtb3ZlczogW10sCiAgICAgICAgLyoqIEB0aGlzIHtHZXN0dXJlSW5mb30gKi8KICAgICAgICBhZGRNb3ZlOiBmdW5jdGlvbihtb3ZlKSB7CiAgICAgICAgICBpZiAodGhpcy5tb3Zlcy5sZW5ndGggPiBUUkFDS19MRU5HVEgpIHsKICAgICAgICAgICAgdGhpcy5tb3Zlcy5zaGlmdCgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5tb3Zlcy5wdXNoKG1vdmUpOwogICAgICAgIH0sCiAgICAgICAgbW92ZWZuOiBudWxsLAogICAgICAgIHVwZm46IG51bGwsCiAgICAgICAgcHJldmVudDogZmFsc2UKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pbmZvLnN0YXRlID0gJ3N0YXJ0JzsKICAgICAgICB0aGlzLmluZm8uc3RhcnRlZCA9IGZhbHNlOwogICAgICAgIHRoaXMuaW5mby5tb3ZlcyA9IFtdOwogICAgICAgIHRoaXMuaW5mby54ID0gMDsKICAgICAgICB0aGlzLmluZm8ueSA9IDA7CiAgICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgICAgICB1bnRyYWNrRG9jdW1lbnQodGhpcy5pbmZvKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgICAqIEBwYXJhbSB7TW91c2VFdmVudH0gZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgbW91c2Vkb3duOiBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKCFoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgbGV0IHQgPSBfZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICAgIGxldCBzZWxmID0gdGhpczsKICAgICAgICBsZXQgbW92ZWZuID0gZnVuY3Rpb24gbW92ZWZuKGUpIHsKICAgICAgICAgIGxldCB4ID0gZS5jbGllbnRYLCB5ID0gZS5jbGllbnRZOwogICAgICAgICAgaWYgKHRyYWNrSGFzTW92ZWRFbm91Z2goc2VsZi5pbmZvLCB4LCB5KSkgewogICAgICAgICAgICAvLyBmaXJzdCBtb3ZlIGlzICdzdGFydCcsIHN1YnNlcXVlbnQgbW92ZXMgYXJlICdtb3ZlJywgbW91c2V1cCBpcyAnZW5kJwogICAgICAgICAgICBzZWxmLmluZm8uc3RhdGUgPSBzZWxmLmluZm8uc3RhcnRlZCA/IChlLnR5cGUgPT09ICdtb3VzZXVwJyA/ICdlbmQnIDogJ3RyYWNrJykgOiAnc3RhcnQnOwogICAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgICAgLy8gaWYgYW5kIG9ubHkgaWYgdHJhY2tpbmcsIGFsd2F5cyBwcmV2ZW50IHRhcAogICAgICAgICAgICAgIHByZXZlbnQoJ3RhcCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYuaW5mby5hZGRNb3ZlKHt4OiB4LCB5OiB5fSk7CiAgICAgICAgICAgIGlmICghaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICAgICAgLy8gYWx3YXlzIGZpcmUgImVuZCIKICAgICAgICAgICAgICBzZWxmLmluZm8uc3RhdGUgPSAnZW5kJzsKICAgICAgICAgICAgICB1bnRyYWNrRG9jdW1lbnQoc2VsZi5pbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodCkgewogICAgICAgICAgICAgIHRyYWNrRmlyZShzZWxmLmluZm8sIHQsIGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYuaW5mby5zdGFydGVkID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIGxldCB1cGZuID0gZnVuY3Rpb24gdXBmbihlKSB7CiAgICAgICAgICBpZiAoc2VsZi5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICAgICAgbW92ZWZuKGUpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIHJlbW92ZSB0aGUgdGVtcG9yYXJ5IGxpc3RlbmVycwogICAgICAgICAgdW50cmFja0RvY3VtZW50KHNlbGYuaW5mbyk7CiAgICAgICAgfTsKICAgICAgICAvLyBhZGQgdGVtcG9yYXJ5IGRvY3VtZW50IGxpc3RlbmVycyBhcyBtb3VzZSByZXRhcmdldHMKICAgICAgICB0cmFja0RvY3VtZW50KHRoaXMuaW5mbywgbW92ZWZuLCB1cGZuKTsKICAgICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgICB0aGlzLmluZm8ueSA9IGUuY2xpZW50WTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgbGV0IGN0ID0gZS5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgICB0aGlzLmluZm8ueCA9IGN0LmNsaWVudFg7CiAgICAgICAgdGhpcy5pbmZvLnkgPSBjdC5jbGllbnRZOwogICAgICB9LAogICAgICAvKioKICAgICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRvdWNobW92ZTogZnVuY3Rpb24oZSkgewogICAgICAgIGxldCB0ID0gX2ZpbmRPcmlnaW5hbFRhcmdldChlKTsKICAgICAgICBsZXQgY3QgPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgIGxldCB4ID0gY3QuY2xpZW50WCwgeSA9IGN0LmNsaWVudFk7CiAgICAgICAgaWYgKHRyYWNrSGFzTW92ZWRFbm91Z2godGhpcy5pbmZvLCB4LCB5KSkgewogICAgICAgICAgaWYgKHRoaXMuaW5mby5zdGF0ZSA9PT0gJ3N0YXJ0JykgewogICAgICAgICAgICAvLyBpZiBhbmQgb25seSBpZiB0cmFja2luZywgYWx3YXlzIHByZXZlbnQgdGFwCiAgICAgICAgICAgIHByZXZlbnQoJ3RhcCcpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5pbmZvLmFkZE1vdmUoe3g6IHgsIHk6IHl9KTsKICAgICAgICAgIHRyYWNrRmlyZSh0aGlzLmluZm8sIHQsIGN0KTsKICAgICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICd0cmFjayc7CiAgICAgICAgICB0aGlzLmluZm8uc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICB9LAogICAgICAvKioKICAgICAgICogQHRoaXMge0dlc3R1cmVSZWNvZ25pemVyfQogICAgICAgKiBAcGFyYW0ge1RvdWNoRXZlbnR9IGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHRvdWNoZW5kOiBmdW5jdGlvbihlKSB7CiAgICAgICAgbGV0IHQgPSBfZmluZE9yaWdpbmFsVGFyZ2V0KGUpOwogICAgICAgIGxldCBjdCA9IGUuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgICAgLy8gb25seSB0cmFja2VuZCBpZiB0cmFjayB3YXMgc3RhcnRlZCBhbmQgbm90IGFib3J0ZWQKICAgICAgICBpZiAodGhpcy5pbmZvLnN0YXJ0ZWQpIHsKICAgICAgICAgIC8vIHJlc2V0IHN0YXJ0ZWQgc3RhdGUgb24gdXAKICAgICAgICAgIHRoaXMuaW5mby5zdGF0ZSA9ICdlbmQnOwogICAgICAgICAgdGhpcy5pbmZvLmFkZE1vdmUoe3g6IGN0LmNsaWVudFgsIHk6IGN0LmNsaWVudFl9KTsKICAgICAgICAgIHRyYWNrRmlyZSh0aGlzLmluZm8sIHQsIGN0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgICogQHBhcmFtIHshR2VzdHVyZUluZm99IGluZm8KICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4CiAgICAgKiBAcGFyYW0ge251bWJlcn0geQogICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAqLwogICAgZnVuY3Rpb24gdHJhY2tIYXNNb3ZlZEVub3VnaChpbmZvLCB4LCB5KSB7CiAgICAgIGlmIChpbmZvLnByZXZlbnQpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgaWYgKGluZm8uc3RhcnRlZCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGluZm8ueCAtIHgpOwogICAgICBsZXQgZHkgPSBNYXRoLmFicyhpbmZvLnkgLSB5KTsKICAgICAgcmV0dXJuIChkeCA+PSBUUkFDS19ESVNUQU5DRSB8fCBkeSA+PSBUUkFDS19ESVNUQU5DRSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlSW5mb30gaW5mbwogICAgICogQHBhcmFtIHs/RXZlbnRUYXJnZXR9IHRhcmdldAogICAgICogQHBhcmFtIHtUb3VjaH0gdG91Y2gKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRyYWNrRmlyZShpbmZvLCB0YXJnZXQsIHRvdWNoKSB7CiAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIGxldCBzZWNvbmRsYXN0ID0gaW5mby5tb3Zlc1tpbmZvLm1vdmVzLmxlbmd0aCAtIDJdOwogICAgICBsZXQgbGFzdG1vdmUgPSBpbmZvLm1vdmVzW2luZm8ubW92ZXMubGVuZ3RoIC0gMV07CiAgICAgIGxldCBkeCA9IGxhc3Rtb3ZlLnggLSBpbmZvLng7CiAgICAgIGxldCBkeSA9IGxhc3Rtb3ZlLnkgLSBpbmZvLnk7CiAgICAgIGxldCBkZHgsIGRkeSA9IDA7CiAgICAgIGlmIChzZWNvbmRsYXN0KSB7CiAgICAgICAgZGR4ID0gbGFzdG1vdmUueCAtIHNlY29uZGxhc3QueDsKICAgICAgICBkZHkgPSBsYXN0bW92ZS55IC0gc2Vjb25kbGFzdC55OwogICAgICB9CiAgICAgIF9maXJlKHRhcmdldCwgJ3RyYWNrJywgewogICAgICAgIHN0YXRlOiBpbmZvLnN0YXRlLAogICAgICAgIHg6IHRvdWNoLmNsaWVudFgsCiAgICAgICAgeTogdG91Y2guY2xpZW50WSwKICAgICAgICBkeDogZHgsCiAgICAgICAgZHk6IGR5LAogICAgICAgIGRkeDogZGR4LAogICAgICAgIGRkeTogZGR5LAogICAgICAgIHNvdXJjZUV2ZW50OiB0b3VjaCwKICAgICAgICBob3ZlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gZGVlcFRhcmdldEZpbmQodG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICByZWdpc3RlciQxKHsKICAgICAgbmFtZTogJ3RhcCcsCiAgICAgIGRlcHM6IFsnbW91c2Vkb3duJywgJ2NsaWNrJywgJ3RvdWNoc3RhcnQnLCAndG91Y2hlbmQnXSwKICAgICAgZmxvdzogewogICAgICAgIHN0YXJ0OiBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J10sCiAgICAgICAgZW5kOiBbJ2NsaWNrJywgJ3RvdWNoZW5kJ10KICAgICAgfSwKICAgICAgZW1pdHM6IFsndGFwJ10sCiAgICAgIGluZm86IHsKICAgICAgICB4OiBOYU4sCiAgICAgICAgeTogTmFOLAogICAgICAgIHByZXZlbnQ6IGZhbHNlCiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pbmZvLnggPSBOYU47CiAgICAgICAgdGhpcy5pbmZvLnkgPSBOYU47CiAgICAgICAgdGhpcy5pbmZvLnByZXZlbnQgPSBmYWxzZTsKICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBtb3VzZWRvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgICBpZiAoaGFzTGVmdE1vdXNlQnV0dG9uKGUpKSB7CiAgICAgICAgICB0aGlzLmluZm8ueCA9IGUuY2xpZW50WDsKICAgICAgICAgIHRoaXMuaW5mby55ID0gZS5jbGllbnRZOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAgICogQHBhcmFtIHtNb3VzZUV2ZW50fSBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjbGljazogZnVuY3Rpb24oZSkgewogICAgICAgIGlmIChoYXNMZWZ0TW91c2VCdXR0b24oZSkpIHsKICAgICAgICAgIHRyYWNrRm9yd2FyZCh0aGlzLmluZm8sIGUpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgLyoqCiAgICAgICAqIEB0aGlzIHtHZXN0dXJlUmVjb2duaXplcn0KICAgICAgICogQHBhcmFtIHtUb3VjaEV2ZW50fSBlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICB0b3VjaHN0YXJ0OiBmdW5jdGlvbihlKSB7CiAgICAgICAgY29uc3QgdG91Y2ggPSBlLmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICAgIHRoaXMuaW5mby54ID0gdG91Y2guY2xpZW50WDsKICAgICAgICB0aGlzLmluZm8ueSA9IHRvdWNoLmNsaWVudFk7CiAgICAgIH0sCiAgICAgIC8qKgogICAgICAgKiBAdGhpcyB7R2VzdHVyZVJlY29nbml6ZXJ9CiAgICAgICAqIEBwYXJhbSB7VG91Y2hFdmVudH0gZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdG91Y2hlbmQ6IGZ1bmN0aW9uKGUpIHsKICAgICAgICB0cmFja0ZvcndhcmQodGhpcy5pbmZvLCBlLmNoYW5nZWRUb3VjaGVzWzBdLCBlKTsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFHZXN0dXJlSW5mb30gaW5mbwogICAgICogQHBhcmFtIHtFdmVudCB8IFRvdWNofSBlCiAgICAgKiBAcGFyYW0ge0V2ZW50PX0gcHJldmVudGVyCiAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICovCiAgICBmdW5jdGlvbiB0cmFja0ZvcndhcmQoaW5mbywgZSwgcHJldmVudGVyKSB7CiAgICAgIGxldCBkeCA9IE1hdGguYWJzKGUuY2xpZW50WCAtIGluZm8ueCk7CiAgICAgIGxldCBkeSA9IE1hdGguYWJzKGUuY2xpZW50WSAtIGluZm8ueSk7CiAgICAgIC8vIGZpbmQgb3JpZ2luYWwgdGFyZ2V0IGZyb20gYHByZXZlbnRlcmAgZm9yIFRvdWNoRXZlbnRzLCBvciBgZWAgZm9yIE1vdXNlRXZlbnRzCiAgICAgIGxldCB0ID0gX2ZpbmRPcmlnaW5hbFRhcmdldCgocHJldmVudGVyIHx8IGUpKTsKICAgICAgaWYgKCF0IHx8IChjYW5CZURpc2FibGVkWy8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0KS5sb2NhbE5hbWVdICYmIHQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBkeCxkeSBjYW4gYmUgTmFOIGlmIGBjbGlja2AgaGFzIGJlZW4gc2ltdWxhdGVkIGFuZCB0aGVyZSB3YXMgbm8gYGRvd25gIGZvciBgc3RhcnRgCiAgICAgIGlmIChpc05hTihkeCkgfHwgaXNOYU4oZHkpIHx8IChkeCA8PSBUQVBfRElTVEFOQ0UgJiYgZHkgPD0gVEFQX0RJU1RBTkNFKSB8fCBpc1N5bnRoZXRpY0NsaWNrKGUpKSB7CiAgICAgICAgLy8gcHJldmVudCB0YXBzIGZyb20gYmVpbmcgZ2VuZXJhdGVkIGlmIGFuIGV2ZW50IGhhcyBjYW5jZWxlZCB0aGVtCiAgICAgICAgaWYgKCFpbmZvLnByZXZlbnQpIHsKICAgICAgICAgIF9maXJlKHQsICd0YXAnLCB7CiAgICAgICAgICAgIHg6IGUuY2xpZW50WCwKICAgICAgICAgICAgeTogZS5jbGllbnRZLAogICAgICAgICAgICBzb3VyY2VFdmVudDogZSwKICAgICAgICAgICAgcHJldmVudGVyOiBwcmV2ZW50ZXIKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qIGVzbGludC1lbmFibGUgdmFsaWQtanNkb2MgKi8KCiAgICAvKiogQGRlcHJlY2F0ZWQgKi8KICAgIGNvbnN0IGZpbmRPcmlnaW5hbFRhcmdldCA9IF9maW5kT3JpZ2luYWxUYXJnZXQ7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBwcm92aWRlcyBBUEkgZm9yIGFkZGluZyBQb2x5bWVyJ3MgY3Jvc3MtcGxhdGZvcm0KICAgICAqIGdlc3R1cmUgZXZlbnRzIHRvIG5vZGVzLgogICAgICoKICAgICAqIFRoZSBBUEkgaXMgZGVzaWduZWQgdG8gYmUgY29tcGF0aWJsZSB3aXRoIG92ZXJyaWRlIHBvaW50cyBpbXBsZW1lbnRlZAogICAgICogaW4gYFRlbXBsYXRlU3RhbXBgIHN1Y2ggdGhhdCBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgaW4KICAgICAqIHRlbXBsYXRlcyB3aWxsIHN1cHBvcnQgZ2VzdHVyZSBldmVudHMgd2hlbiB0aGlzIG1peGluIGlzIGFwcGxpZWQgYWxvbmcgd2l0aAogICAgICogYFRlbXBsYXRlU3RhbXBgLgogICAgICoKICAgICAqIEBtaXhpbkZ1bmN0aW9uCiAgICAgKiBAcG9seW1lcgogICAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIEFQSSBmb3IgYWRkaW5nIFBvbHltZXIncwogICAgICogICBjcm9zcy1wbGF0Zm9ybSBnZXN0dXJlIGV2ZW50cyB0byBub2RlcwogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIENsYXNzIHRvIGFwcGx5IG1peGluIHRvLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIHdpdGggbWl4aW4gYXBwbGllZC4KICAgICAqLwogICAgY29uc3QgR2VzdHVyZUV2ZW50TGlzdGVuZXJzID0gZGVkdXBpbmdNaXhpbigoc3VwZXJDbGFzcykgPT4gewogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICAgKi8KICAgICAgY2xhc3MgR2VzdHVyZUV2ZW50TGlzdGVuZXJzIGV4dGVuZHMgc3VwZXJDbGFzcyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIHRoZSBldmVudCBsaXN0ZW5lciB0byB0aGUgbm9kZSBpZiBpdCBpcyBhIGdlc3R1cmVzIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshRXZlbnRUYXJnZXR9IG5vZGUgTm9kZSB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCFFdmVudCk6dm9pZH0gaGFuZGxlciBMaXN0ZW5lciBmdW5jdGlvbiB0byBhZGQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgICAgaWYgKCFhZGRMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICAgIHN1cGVyLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmUgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIHRoZSBub2RlIGlmIGl0IGlzIGEgZ2VzdHVyZXMgZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyFFdmVudFRhcmdldH0gbm9kZSBOb2RlIHRvIHJlbW92ZSBldmVudCBsaXN0ZW5lciBmcm9tCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50CiAgICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gcmVtb3ZlCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgICAgaWYgKCFyZW1vdmVMaXN0ZW5lcihub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpKSB7CiAgICAgICAgICAgIHN1cGVyLl9yZW1vdmVFdmVudExpc3RlbmVyRnJvbU5vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnM7CiAgICB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tQcm90b3R5cGFsVHlwZXN9CiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZAogICAgICogYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heQogICAgICogYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieQogICAgICogR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUAogICAgICogcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCgogICAgY29uc3QgSE9TVF9ESVIgPSAvOmhvc3RcKDpkaXJcKChsdHJ8cnRsKVwpXCkvZzsKICAgIGNvbnN0IEhPU1RfRElSX1JFUExBQ01FTlQgPSAnOmhvc3QoW2Rpcj0iJDEiXSknOwoKICAgIGNvbnN0IEVMX0RJUiA9IC8oW1xzXHctI1wuXFtcXVwqXSopOmRpclwoKGx0cnxydGwpXCkvZzsKICAgIGNvbnN0IEVMX0RJUl9SRVBMQUNNRU5UID0gJzpob3N0KFtkaXI9IiQyIl0pICQxJzsKCiAgICBjb25zdCBESVJfQ0hFQ0sgPSAvOmRpclwoKD86bHRyfHJ0bClcKS87CgogICAgY29uc3QgU0hJTV9TSEFET1cgPSBCb29sZWFuKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10pOwoKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTwhUG9seW1lcl9EaXJNaXhpbj59CiAgICAgKi8KICAgIGNvbnN0IERJUl9JTlNUQU5DRVMgPSBbXTsKCiAgICAvKiogQHR5cGUgez9NdXRhdGlvbk9ic2VydmVyfSAqLwogICAgbGV0IG9ic2VydmVyID0gbnVsbDsKCiAgICBsZXQgZG9jdW1lbnREaXIgPSAnJzsKCiAgICBmdW5jdGlvbiBnZXRSVEwoKSB7CiAgICAgIGRvY3VtZW50RGlyID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGlyJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVyX0Rpck1peGlufSBpbnN0YW5jZSBJbnN0YW5jZSB0byBzZXQgUlRMIHN0YXR1cyBvbgogICAgICovCiAgICBmdW5jdGlvbiBzZXRSVEwoaW5zdGFuY2UpIHsKICAgICAgaWYgKCFpbnN0YW5jZS5fX2F1dG9EaXJPcHRPdXQpIHsKICAgICAgICBjb25zdCBlbCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyhpbnN0YW5jZSk7CiAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdkaXInLCBkb2N1bWVudERpcik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB1cGRhdGVEaXJlY3Rpb24oKSB7CiAgICAgIGdldFJUTCgpOwogICAgICBkb2N1bWVudERpciA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgICBmb3IgKGxldCBpID0gMDsgaSA8IERJUl9JTlNUQU5DRVMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzZXRSVEwoRElSX0lOU1RBTkNFU1tpXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YWtlUmVjb3JkcygpIHsKICAgICAgaWYgKG9ic2VydmVyICYmIG9ic2VydmVyLnRha2VSZWNvcmRzKCkubGVuZ3RoKSB7CiAgICAgICAgdXBkYXRlRGlyZWN0aW9uKCk7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdGhhdCBhbGxvd3MgZWxlbWVudHMgdG8gdXNlIHRoZSBgOmRpcmAgQ1NTIFNlbGVjdG9yIHRvCiAgICAgKiBoYXZlIHRleHQgZGlyZWN0aW9uIHNwZWNpZmljIHN0eWxpbmcuCiAgICAgKgogICAgICogV2l0aCB0aGlzIG1peGluLCBhbnkgc3R5bGVzaGVldCBwcm92aWRlZCBpbiB0aGUgdGVtcGxhdGUgd2lsbCB0cmFuc2Zvcm0KICAgICAqIGA6ZGlyYCBpbnRvIGA6aG9zdChbZGlyXSlgIGFuZCBzeW5jIGRpcmVjdGlvbiB3aXRoIHRoZSBwYWdlIHZpYSB0aGUKICAgICAqIGVsZW1lbnQncyBgZGlyYCBhdHRyaWJ1dGUuCiAgICAgKgogICAgICogRWxlbWVudHMgY2FuIG9wdCBvdXQgb2YgdGhlIGdsb2JhbCBwYWdlIHRleHQgZGlyZWN0aW9uIGJ5IHNldHRpbmcgdGhlIGBkaXJgCiAgICAgKiBhdHRyaWJ1dGUgZGlyZWN0bHkgaW4gYHJlYWR5KClgIG9yIGluIEhUTUwuCiAgICAgKgogICAgICogQ2F2ZWF0czoKICAgICAqIC0gQXBwbGljYXRpb25zIG11c3Qgc2V0IGA8aHRtbCBkaXI9Imx0ciI+YCBvciBgPGh0bWwgZGlyPSJydGwiPmAgdG8gc3luYwogICAgICogICBkaXJlY3Rpb24KICAgICAqIC0gQXV0b21hdGljIGxlZnQtdG8tcmlnaHQgb3IgcmlnaHQtdG8tbGVmdCBzdHlsaW5nIGlzIHN5bmMnZCB3aXRoIHRoZQogICAgICogICBgPGh0bWw+YCBlbGVtZW50IG9ubHkuCiAgICAgKiAtIENoYW5naW5nIGBkaXJgIGF0IHJ1bnRpbWUgaXMgc3VwcG9ydGVkLgogICAgICogLSBPcHRpbmcgb3V0IG9mIHRoZSBnbG9iYWwgZGlyZWN0aW9uIHN0eWxpbmcgaXMgcGVybWFuZW50CiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAYXBwbGllc01peGluIFByb3BlcnR5QWNjZXNzb3JzCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3MgQ2xhc3MgdG8gYXBwbHkgbWl4aW4gdG8uCiAgICAgKiBAcmV0dXJuIHtmdW5jdGlvbihuZXc6VCl9IHN1cGVyQ2xhc3Mgd2l0aCBtaXhpbiBhcHBsaWVkLgogICAgICovCiAgICBjb25zdCBEaXJNaXhpbiA9IGRlZHVwaW5nTWl4aW4oKGJhc2UpID0+IHsKCiAgICAgIGlmICghU0hJTV9TSEFET1cpIHsKICAgICAgICBpZiAoIW9ic2VydmVyKSB7CiAgICAgICAgICBnZXRSVEwoKTsKICAgICAgICAgIG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIodXBkYXRlRGlyZWN0aW9uKTsKICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7YXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2RpciddfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5QWNjZXNzb3JzfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgZWxlbWVudEJhc2UgPSBQcm9wZXJ0eUFjY2Vzc29ycyhiYXNlKTsKCiAgICAgIC8qKgogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9EaXJNaXhpbn0KICAgICAgICovCiAgICAgIGNsYXNzIERpciBleHRlbmRzIGVsZW1lbnRCYXNlIHsKCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc1RleHQgLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBiYXNlVVJJIC4KICAgICAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IC4KICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBJbnRlcmZhY2VzIGluIGNsb3N1cmUgZG8gbm90IGluaGVyaXQgc3RhdGljcywgYnV0IGNsYXNzZXMgZG8KICAgICAgICAgKiBAbm9jb2xsYXBzZQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBfcHJvY2Vzc1N0eWxlVGV4dChjc3NUZXh0LCBiYXNlVVJJKSB7CiAgICAgICAgICAvLyBUT0RPKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvY2xvc3VyZS1jb21waWxlci9pc3N1ZXMvMzI0MCk6CiAgICAgICAgICAvLyAgICAgQ2hhbmdlIGJhY2sgdG8ganVzdCBzdXBlci5tZXRob2RDYWxsKCkKICAgICAgICAgIGNzc1RleHQgPSBlbGVtZW50QmFzZS5fcHJvY2Vzc1N0eWxlVGV4dC5jYWxsKHRoaXMsIGNzc1RleHQsIGJhc2VVUkkpOwogICAgICAgICAgaWYgKCFTSElNX1NIQURPVyAmJiBESVJfQ0hFQ0sudGVzdChjc3NUZXh0KSkgewogICAgICAgICAgICBjc3NUZXh0ID0gdGhpcy5fcmVwbGFjZURpckluQ3NzVGV4dChjc3NUZXh0KTsKICAgICAgICAgICAgdGhpcy5fX2FjdGl2YXRlRGlyID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBjc3NUZXh0OwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBgOmRpcmAgaW4gdGhlIGdpdmVuIENTUyB0ZXh0CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBDU1MgdGV4dCB0byByZXBsYWNlIERJUgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gTW9kaWZpZWQgQ1NTCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgX3JlcGxhY2VEaXJJbkNzc1RleHQodGV4dCkgewogICAgICAgICAgbGV0IHJlcGxhY2VkVGV4dCA9IHRleHQ7CiAgICAgICAgICByZXBsYWNlZFRleHQgPSByZXBsYWNlZFRleHQucmVwbGFjZShIT1NUX0RJUiwgSE9TVF9ESVJfUkVQTEFDTUVOVCk7CiAgICAgICAgICByZXBsYWNlZFRleHQgPSByZXBsYWNlZFRleHQucmVwbGFjZShFTF9ESVIsIEVMX0RJUl9SRVBMQUNNRU5UKTsKICAgICAgICAgIHJldHVybiByZXBsYWNlZFRleHQ7CiAgICAgICAgfQoKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgICB0aGlzLl9fYXV0b0Rpck9wdE91dCA9IGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IENsb3N1cmUgZG9lc24ndCB1bmRlcnN0YW5kIHRoYXQgYHRoaXNgIGlzIGFuCiAgICAgICAgICogICAgIEhUTUxFbGVtZW50CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICB0aGlzLl9fYXV0b0Rpck9wdE91dCA9IC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyh0aGlzKS5oYXNBdHRyaWJ1dGUoJ2RpcicpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gSWYgaXQgZXhpc3RzIG9uIGVsZW1lbnRCYXNlLCBpdCBjYW4gYmUKICAgICAgICAgKiAgIHN1cGVyJ2QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKGVsZW1lbnRCYXNlLnByb3RvdHlwZS5jb25uZWN0ZWRDYWxsYmFjaykgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY29uc3RydWN0b3IuX19hY3RpdmF0ZURpcikgewogICAgICAgICAgICB0YWtlUmVjb3JkcygpOwogICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnB1c2godGhpcyk7CiAgICAgICAgICAgIHNldFJUTCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IElmIGl0IGV4aXN0cyBvbiBlbGVtZW50QmFzZSwgaXQgY2FuIGJlCiAgICAgICAgICogICBzdXBlcidkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGlmIChlbGVtZW50QmFzZS5wcm90b3R5cGUuZGlzY29ubmVjdGVkQ2FsbGJhY2spIHsKICAgICAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmNvbnN0cnVjdG9yLl9fYWN0aXZhdGVEaXIpIHsKICAgICAgICAgICAgY29uc3QgaWR4ID0gRElSX0lOU1RBTkNFUy5pbmRleE9mKHRoaXMpOwogICAgICAgICAgICBpZiAoaWR4ID4gLTEpIHsKICAgICAgICAgICAgICBESVJfSU5TVEFOQ0VTLnNwbGljZShpZHgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBEaXIuX19hY3RpdmF0ZURpciA9IGZhbHNlOwoKICAgICAgcmV0dXJuIERpcjsKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgbGV0IHNjaGVkdWxlZCA9IGZhbHNlOwogICAgbGV0IGJlZm9yZVJlbmRlclF1ZXVlID0gW107CiAgICBsZXQgYWZ0ZXJSZW5kZXJRdWV1ZSA9IFtdOwoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlKCkgewogICAgICBzY2hlZHVsZWQgPSB0cnVlOwogICAgICAvLyBiZWZvcmUgbmV4dCByZW5kZXIKICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKGZ1bmN0aW9uKCkgewogICAgICAgIHNjaGVkdWxlZCA9IGZhbHNlOwogICAgICAgIGZsdXNoUXVldWUoYmVmb3JlUmVuZGVyUXVldWUpOwogICAgICAgIC8vIGFmdGVyIHRoZSByZW5kZXIKICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgcnVuUXVldWUoYWZ0ZXJSZW5kZXJRdWV1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGZsdXNoUXVldWUocXVldWUpIHsKICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICAgIGNhbGxNZXRob2QocXVldWUuc2hpZnQoKSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBydW5RdWV1ZShxdWV1ZSkgewogICAgICBmb3IgKGxldCBpPTAsIGw9cXVldWUubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgY2FsbE1ldGhvZChxdWV1ZS5zaGlmdCgpKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNhbGxNZXRob2QoaW5mbykgewogICAgICBjb25zdCBjb250ZXh0ID0gaW5mb1swXTsKICAgICAgY29uc3QgY2FsbGJhY2sgPSBpbmZvWzFdOwogICAgICBjb25zdCBhcmdzID0gaW5mb1syXTsKICAgICAgdHJ5IHsKICAgICAgICBjYWxsYmFjay5hcHBseShjb250ZXh0LCBhcmdzKTsKICAgICAgfSBjYXRjaChlKSB7CiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0pOwogICAgICB9CiAgICB9CgoKICAgIC8qKgogICAgICogRW5xdWV1ZXMgYSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIHJ1biBiZWZvcmUgdGhlIG5leHQgcmVuZGVyLCBhdAogICAgICogYHJlcXVlc3RBbmltYXRpb25GcmFtZWAgdGltaW5nLgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgZW5xdWV1aW5nIHdvcmsgdGhhdCByZXF1aXJlcyBET00gbWVhc3VyZW1lbnQsCiAgICAgKiBzaW5jZSBtZWFzdXJlbWVudCBtYXkgbm90IGJlIHJlbGlhYmxlIGluIGN1c3RvbSBlbGVtZW50IGNhbGxiYWNrcyBiZWZvcmUKICAgICAqIHRoZSBmaXJzdCByZW5kZXIsIGFzIHdlbGwgYXMgZm9yIGJhdGNoaW5nIG1lYXN1cmVtZW50IHRhc2tzIGluIGdlbmVyYWwuCiAgICAgKgogICAgICogVGFza3MgaW4gdGhpcyBxdWV1ZSBtYXkgYmUgZmx1c2hlZCBieSBjYWxsaW5nIGBmbHVzaCgpYC4KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZnVuY3Rpb24gYmVmb3JlTmV4dFJlbmRlcihjb250ZXh0LCBjYWxsYmFjaywgYXJncykgewogICAgICBpZiAoIXNjaGVkdWxlZCkgewogICAgICAgIHNjaGVkdWxlKCk7CiAgICAgIH0KICAgICAgYmVmb3JlUmVuZGVyUXVldWUucHVzaChbY29udGV4dCwgY2FsbGJhY2ssIGFyZ3NdKTsKICAgIH0KCiAgICAvKioKICAgICAqIEVucXVldWVzIGEgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBydW4gYWZ0ZXIgdGhlIG5leHQgcmVuZGVyLCBlcXVpdmFsZW50CiAgICAgKiB0byBvbmUgdGFzayAoYHNldFRpbWVvdXRgKSBhZnRlciB0aGUgbmV4dCBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VmdWwgZm9yIHR1bmluZyB0aGUgZmlyc3QtcmVuZGVyIHBlcmZvcm1hbmNlIG9mIGFuCiAgICAgKiBlbGVtZW50IG9yIGFwcGxpY2F0aW9uIGJ5IGRlZmVycmluZyBub24tY3JpdGljYWwgd29yayB1bnRpbCBhZnRlciB0aGUKICAgICAqIGZpcnN0IHBhaW50LiAgVHlwaWNhbCBub24tcmVuZGVyLWNyaXRpY2FsIHdvcmsgbWF5IGluY2x1ZGUgYWRkaW5nIFVJCiAgICAgKiBldmVudCBsaXN0ZW5lcnMgYW5kIGFyaWEgYXR0cmlidXRlcy4KICAgICAqCiAgICAgKiBAcGFyYW0geyp9IGNvbnRleHQgQ29udGV4dCBvYmplY3QgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpbGwgYmUgYm91bmQgdG8KICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oLi4uKik6dm9pZH0gY2FsbGJhY2sgQ2FsbGJhY2sgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IUFycmF5PX0gYXJncyBBbiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gd2l0aAogICAgICogQHJldHVybiB7dm9pZH0KICAgICAqLwogICAgZnVuY3Rpb24gYWZ0ZXJOZXh0UmVuZGVyKGNvbnRleHQsIGNhbGxiYWNrLCBhcmdzKSB7CiAgICAgIGlmICghc2NoZWR1bGVkKSB7CiAgICAgICAgc2NoZWR1bGUoKTsKICAgICAgfQogICAgICBhZnRlclJlbmRlclF1ZXVlLnB1c2goW2NvbnRleHQsIGNhbGxiYWNrLCBhcmdzXSk7CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBmdW5jdGlvbiByZXNvbHZlKCkgewogICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUF0dHJpYnV0ZSgndW5yZXNvbHZlZCcpOwogICAgfQoKICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09PSAnaW50ZXJhY3RpdmUnIHx8IGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHsKICAgICAgcmVzb2x2ZSgpOwogICAgfSBlbHNlIHsKICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCByZXNvbHZlKTsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGZ1bmN0aW9uIG5ld1NwbGljZShpbmRleCwgcmVtb3ZlZCwgYWRkZWRDb3VudCkgewogICAgICByZXR1cm4gewogICAgICAgIGluZGV4OiBpbmRleCwKICAgICAgICByZW1vdmVkOiByZW1vdmVkLAogICAgICAgIGFkZGVkQ291bnQ6IGFkZGVkQ291bnQKICAgICAgfTsKICAgIH0KCiAgICBjb25zdCBFRElUX0xFQVZFID0gMDsKICAgIGNvbnN0IEVESVRfVVBEQVRFID0gMTsKICAgIGNvbnN0IEVESVRfQUREID0gMjsKICAgIGNvbnN0IEVESVRfREVMRVRFID0gMzsKCiAgICAvLyBOb3RlOiBUaGlzIGZ1bmN0aW9uIGlzICpiYXNlZCogb24gdGhlIGNvbXB1dGF0aW9uIG9mIHRoZSBMZXZlbnNodGVpbgogICAgLy8gImVkaXQiIGRpc3RhbmNlLiBUaGUgb25lIGNoYW5nZSBpcyB0aGF0ICJ1cGRhdGVzIiBhcmUgdHJlYXRlZCBhcyB0d28KICAgIC8vIGVkaXRzIC0gbm90IG9uZS4gV2l0aCBBcnJheSBzcGxpY2VzLCBhbiB1cGRhdGUgaXMgcmVhbGx5IGEgZGVsZXRlCiAgICAvLyBmb2xsb3dlZCBieSBhbiBhZGQuIEJ5IHJldGFpbmluZyB0aGlzLCB3ZSBvcHRpbWl6ZSBmb3IgImtlZXBpbmciIHRoZQogICAgLy8gbWF4aW11bSBhcnJheSBpdGVtcyBpbiB0aGUgb3JpZ2luYWwgYXJyYXkuIEZvciBleGFtcGxlOgogICAgLy8KICAgIC8vICAgJ3h4eHgxMjMnIC0+ICcxMjN5eXl5JwogICAgLy8KICAgIC8vIFdpdGggMS1lZGl0IHVwZGF0ZXMsIHRoZSBzaG9ydGVzdCBwYXRoIHdvdWxkIGJlIGp1c3QgdG8gdXBkYXRlIGFsbCBzZXZlbgogICAgLy8gY2hhcmFjdGVycy4gV2l0aCAyLWVkaXQgdXBkYXRlcywgd2UgZGVsZXRlIDQsIGxlYXZlIDMsIGFuZCBhZGQgNC4gVGhpcwogICAgLy8gbGVhdmVzIHRoZSBzdWJzdHJpbmcgJzEyMycgaW50YWN0LgogICAgZnVuY3Rpb24gY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZCwgb2xkU3RhcnQsIG9sZEVuZCkgewogICAgICAvLyAiRGVsZXRpb24iIGNvbHVtbnMKICAgICAgbGV0IHJvd0NvdW50ID0gb2xkRW5kIC0gb2xkU3RhcnQgKyAxOwogICAgICBsZXQgY29sdW1uQ291bnQgPSBjdXJyZW50RW5kIC0gY3VycmVudFN0YXJ0ICsgMTsKICAgICAgbGV0IGRpc3RhbmNlcyA9IG5ldyBBcnJheShyb3dDb3VudCk7CgogICAgICAvLyAiQWRkaXRpb24iIHJvd3MuIEluaXRpYWxpemUgbnVsbCBjb2x1bW4uCiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm93Q291bnQ7IGkrKykgewogICAgICAgIGRpc3RhbmNlc1tpXSA9IG5ldyBBcnJheShjb2x1bW5Db3VudCk7CiAgICAgICAgZGlzdGFuY2VzW2ldWzBdID0gaTsKICAgICAgfQoKICAgICAgLy8gSW5pdGlhbGl6ZSBudWxsIHJvdwogICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNvbHVtbkNvdW50OyBqKyspCiAgICAgICAgZGlzdGFuY2VzWzBdW2pdID0gajsKCiAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcm93Q291bnQ7IGkrKykgewogICAgICAgIGZvciAobGV0IGogPSAxOyBqIDwgY29sdW1uQ291bnQ7IGorKykgewogICAgICAgICAgaWYgKGVxdWFscyhjdXJyZW50W2N1cnJlbnRTdGFydCArIGogLSAxXSwgb2xkW29sZFN0YXJ0ICsgaSAtIDFdKSkKICAgICAgICAgICAgZGlzdGFuY2VzW2ldW2pdID0gZGlzdGFuY2VzW2kgLSAxXVtqIC0gMV07CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2kgLSAxXVtqXSArIDE7CiAgICAgICAgICAgIGxldCB3ZXN0ID0gZGlzdGFuY2VzW2ldW2ogLSAxXSArIDE7CiAgICAgICAgICAgIGRpc3RhbmNlc1tpXVtqXSA9IG5vcnRoIDwgd2VzdCA/IG5vcnRoIDogd2VzdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBkaXN0YW5jZXM7CiAgICB9CgogICAgLy8gVGhpcyBzdGFydHMgYXQgdGhlIGZpbmFsIHdlaWdodCwgYW5kIHdhbGtzICJiYWNrd2FyZCIgYnkgZmluZGluZwogICAgLy8gdGhlIG1pbmltdW0gcHJldmlvdXMgd2VpZ2h0IHJlY3Vyc2l2ZWx5IHVudGlsIHRoZSBvcmlnaW4gb2YgdGhlIHdlaWdodAogICAgLy8gbWF0cml4LgogICAgZnVuY3Rpb24gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKGRpc3RhbmNlcykgewogICAgICBsZXQgaSA9IGRpc3RhbmNlcy5sZW5ndGggLSAxOwogICAgICBsZXQgaiA9IGRpc3RhbmNlc1swXS5sZW5ndGggLSAxOwogICAgICBsZXQgY3VycmVudCA9IGRpc3RhbmNlc1tpXVtqXTsKICAgICAgbGV0IGVkaXRzID0gW107CiAgICAgIHdoaWxlIChpID4gMCB8fCBqID4gMCkgewogICAgICAgIGlmIChpID09IDApIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9BREQpOwogICAgICAgICAgai0tOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGlmIChqID09IDApIHsKICAgICAgICAgIGVkaXRzLnB1c2goRURJVF9ERUxFVEUpOwogICAgICAgICAgaS0tOwogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIGxldCBub3J0aFdlc3QgPSBkaXN0YW5jZXNbaSAtIDFdW2ogLSAxXTsKICAgICAgICBsZXQgd2VzdCA9IGRpc3RhbmNlc1tpIC0gMV1bal07CiAgICAgICAgbGV0IG5vcnRoID0gZGlzdGFuY2VzW2ldW2ogLSAxXTsKCiAgICAgICAgbGV0IG1pbjsKICAgICAgICBpZiAod2VzdCA8IG5vcnRoKQogICAgICAgICAgbWluID0gd2VzdCA8IG5vcnRoV2VzdCA/IHdlc3QgOiBub3J0aFdlc3Q7CiAgICAgICAgZWxzZQogICAgICAgICAgbWluID0gbm9ydGggPCBub3J0aFdlc3QgPyBub3J0aCA6IG5vcnRoV2VzdDsKCiAgICAgICAgaWYgKG1pbiA9PSBub3J0aFdlc3QpIHsKICAgICAgICAgIGlmIChub3J0aFdlc3QgPT0gY3VycmVudCkgewogICAgICAgICAgICBlZGl0cy5wdXNoKEVESVRfTEVBVkUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZWRpdHMucHVzaChFRElUX1VQREFURSk7CiAgICAgICAgICAgIGN1cnJlbnQgPSBub3J0aFdlc3Q7CiAgICAgICAgICB9CiAgICAgICAgICBpLS07CiAgICAgICAgICBqLS07CiAgICAgICAgfSBlbHNlIGlmIChtaW4gPT0gd2VzdCkgewogICAgICAgICAgZWRpdHMucHVzaChFRElUX0RFTEVURSk7CiAgICAgICAgICBpLS07CiAgICAgICAgICBjdXJyZW50ID0gd2VzdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZWRpdHMucHVzaChFRElUX0FERCk7CiAgICAgICAgICBqLS07CiAgICAgICAgICBjdXJyZW50ID0gbm9ydGg7CiAgICAgICAgfQogICAgICB9CgogICAgICBlZGl0cy5yZXZlcnNlKCk7CiAgICAgIHJldHVybiBlZGl0czsKICAgIH0KCiAgICAvKioKICAgICAqIFNwbGljZSBQcm9qZWN0aW9uIGZ1bmN0aW9uczoKICAgICAqCiAgICAgKiBBIHNwbGljZSBtYXAgaXMgYSByZXByZXNlbnRhdGlvbiBvZiBob3cgYSBwcmV2aW91cyBhcnJheSBvZiBpdGVtcwogICAgICogd2FzIHRyYW5zZm9ybWVkIGludG8gYSBuZXcgYXJyYXkgb2YgaXRlbXMuIENvbmNlcHR1YWxseSBpdCBpcyBhIGxpc3Qgb2YKICAgICAqIHR1cGxlcyBvZgogICAgICoKICAgICAqICAgPGluZGV4LCByZW1vdmVkLCBhZGRlZENvdW50PgogICAgICoKICAgICAqIHdoaWNoIGFyZSBrZXB0IGluIGFzY2VuZGluZyBpbmRleCBvcmRlciBvZi4gVGhlIHR1cGxlIHJlcHJlc2VudHMgdGhhdCBhdAogICAgICogdGhlIHxpbmRleHwsIHxyZW1vdmVkfCBzZXF1ZW5jZSBvZiBpdGVtcyB3ZXJlIHJlbW92ZWQsIGFuZCBjb3VudGluZyBmb3J3YXJkCiAgICAgKiBmcm9tIHxpbmRleHwsIHxhZGRlZENvdW50fCBpdGVtcyB3ZXJlIGFkZGVkLgogICAgICovCgogICAgLyoqCiAgICAgKiBMYWNraW5nIGluZGl2aWR1YWwgc3BsaWNlIG11dGF0aW9uIGluZm9ybWF0aW9uLCB0aGUgbWluaW1hbCBzZXQgb2YKICAgICAqIHNwbGljZXMgY2FuIGJlIHN5bnRoZXNpemVkIGdpdmVuIHRoZSBwcmV2aW91cyBzdGF0ZSBhbmQgZmluYWwgc3RhdGUgb2YgYW4KICAgICAqIGFycmF5LiBUaGUgYmFzaWMgYXBwcm9hY2ggaXMgdG8gY2FsY3VsYXRlIHRoZSBlZGl0IGRpc3RhbmNlIG1hdHJpeCBhbmQKICAgICAqIGNob29zZSB0aGUgc2hvcnRlc3QgcGF0aCB0aHJvdWdoIGl0LgogICAgICoKICAgICAqIENvbXBsZXhpdHk6IE8obCAqIHApCiAgICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgICAqICAgcDogVGhlIGxlbmd0aCBvZiB0aGUgb2xkIGFycmF5CiAgICAgKgogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlIGN1cnJlbnQgImNoYW5nZWQiIGFycmF5IGZvciB3aGljaCB0bwogICAgICogY2FsY3VsYXRlIHNwbGljZXMuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gY3VycmVudFN0YXJ0IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBgY3VycmVudGAgYXJyYXkgZm9yCiAgICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHtudW1iZXJ9IGN1cnJlbnRFbmQgRW5kaW5nIGluZGV4IGluIHRoZSBgY3VycmVudGAgYXJyYXkgZm9yCiAgICAgKiB3aGljaCBzcGxpY2VzIGFyZSBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IG9sZCBUaGUgb3JpZ2luYWwgInVuY2hhbmdlZCIgYXJyYXkgdG8gY29tcGFyZSBgY3VycmVudGAKICAgICAqIGFnYWluc3QgdG8gZGV0ZXJtaW5lIHNwbGljZXMuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gb2xkU3RhcnQgU3RhcnRpbmcgaW5kZXggaW4gdGhlIGBvbGRgIGFycmF5IGZvcgogICAgICogd2hpY2ggc3BsaWNlcyBhcmUgY2FsY3VsYXRlZC4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBvbGRFbmQgRW5kaW5nIGluZGV4IGluIHRoZSBgb2xkYCBhcnJheSBmb3IKICAgICAqIHdoaWNoIHNwbGljZXMgYXJlIGNhbGN1bGF0ZWQuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjYWxjU3BsaWNlcyhjdXJyZW50LCBjdXJyZW50U3RhcnQsIGN1cnJlbnRFbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkLCBvbGRTdGFydCwgb2xkRW5kKSB7CiAgICAgIGxldCBwcmVmaXhDb3VudCA9IDA7CiAgICAgIGxldCBzdWZmaXhDb3VudCA9IDA7CiAgICAgIGxldCBzcGxpY2U7CgogICAgICBsZXQgbWluTGVuZ3RoID0gTWF0aC5taW4oY3VycmVudEVuZCAtIGN1cnJlbnRTdGFydCwgb2xkRW5kIC0gb2xkU3RhcnQpOwogICAgICBpZiAoY3VycmVudFN0YXJ0ID09IDAgJiYgb2xkU3RhcnQgPT0gMCkKICAgICAgICBwcmVmaXhDb3VudCA9IHNoYXJlZFByZWZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCk7CgogICAgICBpZiAoY3VycmVudEVuZCA9PSBjdXJyZW50Lmxlbmd0aCAmJiBvbGRFbmQgPT0gb2xkLmxlbmd0aCkKICAgICAgICBzdWZmaXhDb3VudCA9IHNoYXJlZFN1ZmZpeChjdXJyZW50LCBvbGQsIG1pbkxlbmd0aCAtIHByZWZpeENvdW50KTsKCiAgICAgIGN1cnJlbnRTdGFydCArPSBwcmVmaXhDb3VudDsKICAgICAgb2xkU3RhcnQgKz0gcHJlZml4Q291bnQ7CiAgICAgIGN1cnJlbnRFbmQgLT0gc3VmZml4Q291bnQ7CiAgICAgIG9sZEVuZCAtPSBzdWZmaXhDb3VudDsKCiAgICAgIGlmIChjdXJyZW50RW5kIC0gY3VycmVudFN0YXJ0ID09IDAgJiYgb2xkRW5kIC0gb2xkU3RhcnQgPT0gMCkKICAgICAgICByZXR1cm4gW107CgogICAgICBpZiAoY3VycmVudFN0YXJ0ID09IGN1cnJlbnRFbmQpIHsKICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoY3VycmVudFN0YXJ0LCBbXSwgMCk7CiAgICAgICAgd2hpbGUgKG9sZFN0YXJ0IDwgb2xkRW5kKQogICAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkU3RhcnQrK10pOwoKICAgICAgICByZXR1cm4gWyBzcGxpY2UgXTsKICAgICAgfSBlbHNlIGlmIChvbGRTdGFydCA9PSBvbGRFbmQpCiAgICAgICAgcmV0dXJuIFsgbmV3U3BsaWNlKGN1cnJlbnRTdGFydCwgW10sIGN1cnJlbnRFbmQgLSBjdXJyZW50U3RhcnQpIF07CgogICAgICBsZXQgb3BzID0gc3BsaWNlT3BlcmF0aW9uc0Zyb21FZGl0RGlzdGFuY2VzKAogICAgICAgICAgY2FsY0VkaXREaXN0YW5jZXMoY3VycmVudCwgY3VycmVudFN0YXJ0LCBjdXJyZW50RW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGQsIG9sZFN0YXJ0LCBvbGRFbmQpKTsKCiAgICAgIHNwbGljZSA9IHVuZGVmaW5lZDsKICAgICAgbGV0IHNwbGljZXMgPSBbXTsKICAgICAgbGV0IGluZGV4ID0gY3VycmVudFN0YXJ0OwogICAgICBsZXQgb2xkSW5kZXggPSBvbGRTdGFydDsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHMubGVuZ3RoOyBpKyspIHsKICAgICAgICBzd2l0Y2gob3BzW2ldKSB7CiAgICAgICAgICBjYXNlIEVESVRfTEVBVkU6CiAgICAgICAgICAgIGlmIChzcGxpY2UpIHsKICAgICAgICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgICAgICAgICBzcGxpY2UgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgIG9sZEluZGV4Kys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBFRElUX1VQREFURToKICAgICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgICBzcGxpY2UuYWRkZWRDb3VudCsrOwogICAgICAgICAgICBpbmRleCsrOwoKICAgICAgICAgICAgc3BsaWNlLnJlbW92ZWQucHVzaChvbGRbb2xkSW5kZXhdKTsKICAgICAgICAgICAgb2xkSW5kZXgrKzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIEVESVRfQUREOgogICAgICAgICAgICBpZiAoIXNwbGljZSkKICAgICAgICAgICAgICBzcGxpY2UgPSBuZXdTcGxpY2UoaW5kZXgsIFtdLCAwKTsKCiAgICAgICAgICAgIHNwbGljZS5hZGRlZENvdW50Kys7CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSBFRElUX0RFTEVURToKICAgICAgICAgICAgaWYgKCFzcGxpY2UpCiAgICAgICAgICAgICAgc3BsaWNlID0gbmV3U3BsaWNlKGluZGV4LCBbXSwgMCk7CgogICAgICAgICAgICBzcGxpY2UucmVtb3ZlZC5wdXNoKG9sZFtvbGRJbmRleF0pOwogICAgICAgICAgICBvbGRJbmRleCsrOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChzcGxpY2UpIHsKICAgICAgICBzcGxpY2VzLnB1c2goc3BsaWNlKTsKICAgICAgfQogICAgICByZXR1cm4gc3BsaWNlczsKICAgIH0KCiAgICBmdW5jdGlvbiBzaGFyZWRQcmVmaXgoY3VycmVudCwgb2xkLCBzZWFyY2hMZW5ndGgpIHsKICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWFyY2hMZW5ndGg7IGkrKykKICAgICAgICBpZiAoIWVxdWFscyhjdXJyZW50W2ldLCBvbGRbaV0pKQogICAgICAgICAgcmV0dXJuIGk7CiAgICAgIHJldHVybiBzZWFyY2hMZW5ndGg7CiAgICB9CgogICAgZnVuY3Rpb24gc2hhcmVkU3VmZml4KGN1cnJlbnQsIG9sZCwgc2VhcmNoTGVuZ3RoKSB7CiAgICAgIGxldCBpbmRleDEgPSBjdXJyZW50Lmxlbmd0aDsKICAgICAgbGV0IGluZGV4MiA9IG9sZC5sZW5ndGg7CiAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgIHdoaWxlIChjb3VudCA8IHNlYXJjaExlbmd0aCAmJiBlcXVhbHMoY3VycmVudFstLWluZGV4MV0sIG9sZFstLWluZGV4Ml0pKQogICAgICAgIGNvdW50Kys7CgogICAgICByZXR1cm4gY291bnQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNwbGljZSByZWNvcmRzIGluZGljYXRpbmcgdGhlIG1pbmltdW0gZWRpdHMgcmVxdWlyZWQKICAgICAqIHRvIHRyYW5zZm9ybSB0aGUgYHByZXZpb3VzYCBhcnJheSBpbnRvIHRoZSBgY3VycmVudGAgYXJyYXkuCiAgICAgKgogICAgICogU3BsaWNlIHJlY29yZHMgYXJlIG9yZGVyZWQgYnkgaW5kZXggYW5kIGNvbnRhaW4gdGhlIGZvbGxvd2luZyBmaWVsZHM6CiAgICAgKiAtIGBpbmRleGA6IGluZGV4IHdoZXJlIGVkaXQgc3RhcnRlZAogICAgICogLSBgcmVtb3ZlZGA6IGFycmF5IG9mIHJlbW92ZWQgaXRlbXMgZnJvbSB0aGlzIGluZGV4CiAgICAgKiAtIGBhZGRlZENvdW50YDogbnVtYmVyIG9mIGl0ZW1zIGFkZGVkIGF0IHRoaXMgaW5kZXgKICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGJhc2VkIG9uIHRoZSBMZXZlbnNodGVpbiAibWluaW11bSBlZGl0IGRpc3RhbmNlIgogICAgICogYWxnb3JpdGhtLiBOb3RlIHRoYXQgdXBkYXRlcyBhcmUgdHJlYXRlZCBhcyByZW1vdmFsIGZvbGxvd2VkIGJ5IGFkZGl0aW9uLgogICAgICoKICAgICAqIFRoZSB3b3JzdC1jYXNlIHRpbWUgY29tcGxleGl0eSBvZiB0aGlzIGFsZ29yaXRobSBpcyBgTyhsICogcClgCiAgICAgKiAgIGw6IFRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgYXJyYXkKICAgICAqICAgcDogVGhlIGxlbmd0aCBvZiB0aGUgcHJldmlvdXMgYXJyYXkKICAgICAqCiAgICAgKiBIb3dldmVyLCB0aGUgd29yc3QtY2FzZSBjb21wbGV4aXR5IGlzIHJlZHVjZWQgYnkgYW4gYE8obilgIG9wdGltaXphdGlvbgogICAgICogdG8gZGV0ZWN0IGFueSBzaGFyZWQgcHJlZml4ICYgc3VmZml4IGJldHdlZW4gdGhlIHR3byBhcnJheXMgYW5kIG9ubHkKICAgICAqIHBlcmZvcm0gdGhlIG1vcmUgZXhwZW5zaXZlIG1pbmltdW0gZWRpdCBkaXN0YW5jZSBjYWxjdWxhdGlvbiBvdmVyIHRoZQogICAgICogbm9uLXNoYXJlZCBwb3J0aW9ucyBvZiB0aGUgYXJyYXlzLgogICAgICoKICAgICAqIEBmdW5jdGlvbgogICAgICogQHBhcmFtIHshQXJyYXl9IGN1cnJlbnQgVGhlICJjaGFuZ2VkIiBhcnJheSBmb3Igd2hpY2ggc3BsaWNlcyB3aWxsIGJlCiAgICAgKiBjYWxjdWxhdGVkLgogICAgICogQHBhcmFtIHshQXJyYXl9IHByZXZpb3VzIFRoZSAidW5jaGFuZ2VkIiBvcmlnaW5hbCBhcnJheSB0byBjb21wYXJlCiAgICAgKiBgY3VycmVudGAgYWdhaW5zdCB0byBkZXRlcm1pbmUgdGhlIHNwbGljZXMuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgYW4gYXJyYXkgb2Ygc3BsaWNlIHJlY29yZCBvYmplY3RzLiBFYWNoIG9mIHRoZXNlCiAgICAgKiBjb250YWluczogYGluZGV4YCB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIHNwbGljZSBvY2N1cnJlZDsgYHJlbW92ZWRgCiAgICAgKiB0aGUgYXJyYXkgb2YgcmVtb3ZlZCBpdGVtcyBmcm9tIHRoaXMgbG9jYXRpb247IGBhZGRlZENvdW50YCB0aGUgbnVtYmVyCiAgICAgKiBvZiBpdGVtcyBhZGRlZCBhdCB0aGlzIGxvY2F0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjYWxjdWxhdGVTcGxpY2VzKGN1cnJlbnQsIHByZXZpb3VzKSB7CiAgICAgIHJldHVybiBjYWxjU3BsaWNlcyhjdXJyZW50LCAwLCBjdXJyZW50Lmxlbmd0aCwgcHJldmlvdXMsIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzLmxlbmd0aCk7CiAgICB9CgogICAgZnVuY3Rpb24gZXF1YWxzKGN1cnJlbnRWYWx1ZSwgcHJldmlvdXNWYWx1ZSkgewogICAgICByZXR1cm4gY3VycmVudFZhbHVlID09PSBwcmV2aW91c1ZhbHVlOwogICAgfQoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYG5vZGVgIGlzIGEgc2xvdCBlbGVtZW50CiAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIE5vZGUgdG8gdGVzdC4KICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYG5vZGVgIGlzIGEgc2xvdAogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gaXNTbG90KG5vZGUpIHsKICAgICAgcmV0dXJuIChub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKTsKICAgIH0KCiAgICAvKioKICAgICAqIENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAgICogImZsYXR0ZW5lZCBub2RlcyIgb24gYSBnaXZlbiBgbm9kZWAuIFRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBjb25zaXN0cwogICAgICogb2YgYSBub2RlJ3MgY2hpbGRyZW4gYW5kLCBmb3IgYW55IGNoaWxkcmVuIHRoYXQgYXJlIGA8c2xvdD5gIGVsZW1lbnRzLAogICAgICogdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgb2JzZXJ2ZWQgbm9kZSBoYXMgY2hpbGRyZW4gYDxhPjwvYT48c2xvdD48L3Nsb3Q+PGI+PC9iPmAKICAgICAqIGFuZCB0aGUgYDxzbG90PmAgaGFzIG9uZSBgPGRpdj5gIGFzc2lnbmVkIHRvIGl0LCB0aGVuIHRoZSBmbGF0dGVuZWQKICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgKiBgPHNsb3Q+YCBlbGVtZW50cyBhc3NpZ25lZCB0byBpdCwgdGhlc2UgYXJlIGZsYXR0ZW5lZCBhcyB3ZWxsLgogICAgICoKICAgICAqIFRoZSBwcm92aWRlZCBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aGVuZXZlciBhbnkgY2hhbmdlIHRvIHRoaXMgbGlzdAogICAgICogb2YgZmxhdHRlbmVkIG5vZGVzIG9jY3Vycywgd2hlcmUgYW4gYWRkaXRpb24gb3IgcmVtb3ZhbCBvZiBhIG5vZGUgaXMKICAgICAqIGNvbnNpZGVyZWQgYSBjaGFuZ2UuIFRoZSBgY2FsbGJhY2tgIGlzIGNhbGxlZCB3aXRoIG9uZSBhcmd1bWVudCwgYW4gb2JqZWN0CiAgICAgKiBjb250YWluaW5nIGFuIGFycmF5IG9mIGFueSBgYWRkZWROb2Rlc2AgYW5kIGByZW1vdmVkTm9kZXNgLgogICAgICoKICAgICAqIE5vdGU6IHRoZSBjYWxsYmFjayBpcyBjYWxsZWQgYXN5bmNocm9ub3VzIHRvIGFueSBjaGFuZ2VzCiAgICAgKiBhdCBhIG1pY3JvdGFzayBjaGVja3BvaW50LiBUaGlzIGlzIGJlY2F1c2Ugb2JzZXJ2YXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nCiAgICAgKiBgTXV0YXRpb25PYnNlcnZlcmAgYW5kIHRoZSBgPHNsb3Q+YCBlbGVtZW50J3MgYHNsb3RjaGFuZ2VgIGV2ZW50IHdoaWNoCiAgICAgKiBhcmUgYXN5bmNocm9ub3VzLgogICAgICoKICAgICAqIEFuIGV4YW1wbGU6CiAgICAgKiBgYGBqcwogICAgICogY2xhc3MgVGVzdFNlbGZPYnNlcnZlIGV4dGVuZHMgUG9seW1lckVsZW1lbnQgewogICAgICogICBzdGF0aWMgZ2V0IGlzKCkgeyByZXR1cm4gJ3Rlc3Qtc2VsZi1vYnNlcnZlJzt9CiAgICAgKiAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICogICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgKiAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBuZXcgRmxhdHRlbmVkTm9kZXNPYnNlcnZlcih0aGlzLCAoaW5mbykgPT4gewogICAgICogICAgICAgdGhpcy5pbmZvID0gaW5mbzsKICAgICAqICAgICB9KTsKICAgICAqICAgfQogICAgICogICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAqICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICogICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAqICAgfQogICAgICogfQogICAgICogY3VzdG9tRWxlbWVudHMuZGVmaW5lKFRlc3RTZWxmT2JzZXJ2ZS5pcywgVGVzdFNlbGZPYnNlcnZlKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEBzdW1tYXJ5IENsYXNzIHRoYXQgbGlzdGVucyBmb3IgY2hhbmdlcyAoYWRkaXRpb25zIG9yIHJlbW92YWxzKSB0bwogICAgICogImZsYXR0ZW5lZCBub2RlcyIgb24gYSBnaXZlbiBgbm9kZWAuCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lckRvbUFwaS5PYnNlcnZlSGFuZGxlfQogICAgICovCiAgICBsZXQgRmxhdHRlbmVkTm9kZXNPYnNlcnZlciA9IGNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2RlcyBmb3IgdGhlIGdpdmVuIGBub2RlYC4KICAgICAgICogVGhpcyBsaXN0IGNvbnNpc3RzIG9mIGEgbm9kZSdzIGNoaWxkcmVuIGFuZCwgZm9yIGFueSBjaGlsZHJlbgogICAgICAgKiB0aGF0IGFyZSBgPHNsb3Q+YCBlbGVtZW50cywgdGhlIGV4cGFuZGVkIGZsYXR0ZW5lZCBsaXN0IG9mIGBhc3NpZ25lZE5vZGVzYC4KICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBvYnNlcnZlZCBub2RlIGhhcyBjaGlsZHJlbiBgPGE+PC9hPjxzbG90Pjwvc2xvdD48Yj48L2I+YAogICAgICAgKiBhbmQgdGhlIGA8c2xvdD5gIGhhcyBvbmUgYDxkaXY+YCBhc3NpZ25lZCB0byBpdCwgdGhlbiB0aGUgZmxhdHRlbmVkCiAgICAgICAqIG5vZGVzIGxpc3QgaXMgYDxhPjwvYT48ZGl2PjwvZGl2PjxiPjwvYj5gLiBJZiB0aGUgYDxzbG90PmAgaGFzIG90aGVyCiAgICAgICAqIGA8c2xvdD5gIGVsZW1lbnRzIGFzc2lnbmVkIHRvIGl0LCB0aGVzZSBhcmUgZmxhdHRlbmVkIGFzIHdlbGwuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fCFIVE1MU2xvdEVsZW1lbnR9IG5vZGUgVGhlIG5vZGUgZm9yIHdoaWNoIHRvCiAgICAgICAqICAgICAgcmV0dXJuIHRoZSBsaXN0IG9mIGZsYXR0ZW5lZCBub2Rlcy4KICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gVGhlIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzIGZvciB0aGUgZ2l2ZW4gYG5vZGVgLgogICAgICAgKiBAbm9jb2xsYXBzZSBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8yNzYzCiAgICAgICAqLwogICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUKICAgICAgc3RhdGljIGdldEZsYXR0ZW5lZE5vZGVzKG5vZGUpIHsKICAgICAgICBjb25zdCB3cmFwcGVkID0gd3JhcChub2RlKTsKICAgICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHshSFRNTFNsb3RFbGVtZW50fSAqLyhub2RlKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWFzc2lnbgogICAgICAgICAgcmV0dXJuIHdyYXBwZWQuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh3cmFwcGVkLmNoaWxkTm9kZXMpLm1hcCgobm9kZSkgPT4gewogICAgICAgICAgICBpZiAoaXNTbG90KG5vZGUpKSB7CiAgICAgICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUhUTUxTbG90RWxlbWVudH0gKi8obm9kZSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1hc3NpZ24KICAgICAgICAgICAgICByZXR1cm4gd3JhcChub2RlKS5hc3NpZ25lZE5vZGVzKHtmbGF0dGVuOiB0cnVlfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgcmV0dXJuIFtub2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSkucmVkdWNlKChhLCBiKSA9PiBhLmNvbmNhdChiKSwgW10pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSB0YXJnZXQgTm9kZSBvbiB3aGljaCB0byBsaXN0ZW4gZm9yIGNoYW5nZXMuCiAgICAgICAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6IEVsZW1lbnQsIHsgdGFyZ2V0OiAhSFRNTEVsZW1lbnQsIGFkZGVkTm9kZXM6ICFBcnJheTwhRWxlbWVudD4sIHJlbW92ZWROb2RlczogIUFycmF5PCFFbGVtZW50PiB9KTp2b2lkfSBjYWxsYmFjayBGdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGVyZSBhcmUgYWRkaXRpb25zCiAgICAgICAqIG9yIHJlbW92YWxzIGZyb20gdGhlIHRhcmdldCdzIGxpc3Qgb2YgZmxhdHRlbmVkIG5vZGVzLgogICAgICAgKi8KICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lCiAgICAgIGNvbnN0cnVjdG9yKHRhcmdldCwgY2FsbGJhY2spIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7TXV0YXRpb25PYnNlcnZlcn0KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgICAgLyoqCiAgICAgICAgICogQHR5cGUge011dGF0aW9uT2JzZXJ2ZXJ9CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyID0gbnVsbDsKICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7IUhUTUxFbGVtZW50fQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgdGhpcy5fdGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICB0aGlzLl9lZmZlY3RpdmVOb2RlcyA9IFtdOwogICAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7ZnVuY3Rpb24oKX0KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIHRoaXMuX2JvdW5kU2NoZWR1bGUgPSAoKSA9PiB7CiAgICAgICAgICB0aGlzLl9zY2hlZHVsZSgpOwogICAgICAgIH07CiAgICAgICAgdGhpcy5jb25uZWN0KCk7CiAgICAgICAgdGhpcy5fc2NoZWR1bGUoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFjdGl2YXRlcyBhbiBvYnNlcnZlci4gVGhpcyBtZXRob2QgaXMgYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbgogICAgICAgKiBhIGBGbGF0dGVuZWROb2Rlc09ic2VydmVyYCBpcyBjcmVhdGVkLiBJdCBzaG91bGQgb25seSBiZSBjYWxsZWQgdG8KICAgICAgICogcmUtYWN0aXZhdGUgYW4gb2JzZXJ2ZXIgdGhhdCBoYXMgYmVlbiBkZWFjdGl2YXRlZCB2aWEgdGhlIGBkaXNjb25uZWN0YCBtZXRob2QuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjb25uZWN0KCkgewogICAgICAgIGlmIChpc1Nsb3QodGhpcy5fdGFyZ2V0KSkgewogICAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICAgIH0gZWxzZSBpZiAod3JhcCh0aGlzLl90YXJnZXQpLmNoaWxkcmVuKSB7CiAgICAgICAgICB0aGlzLl9saXN0ZW5TbG90cygKICAgICAgICAgICAgICAvKiogQHR5cGUgeyFOb2RlTGlzdDwhTm9kZT59ICovICh3cmFwKHRoaXMuX3RhcmdldCkuY2hpbGRyZW4pKTsKICAgICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00pIHsKICAgICAgICAgICAgdGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyID0KICAgICAgICAgICAgICB3aW5kb3cuU2hhZHlET00ub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3RhcmdldCwgKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlciA9CiAgICAgICAgICAgICAgbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9ucykgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9uYXRpdmVDaGlsZHJlbk9ic2VydmVyLm9ic2VydmUodGhpcy5fdGFyZ2V0LCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX2Nvbm5lY3RlZCA9IHRydWU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZWFjdGl2YXRlcyB0aGUgZmxhdHRlbmVkIG5vZGVzIG9ic2VydmVyLiBBZnRlciBjYWxsaW5nIHRoaXMgbWV0aG9kCiAgICAgICAqIHRoZSBvYnNlcnZlciBjYWxsYmFjayB3aWxsIG5vdCBiZSBjYWxsZWQgd2hlbiBjaGFuZ2VzIHRvIGZsYXR0ZW5lZCBub2RlcwogICAgICAgKiBvY2N1ci4gVGhlIGBjb25uZWN0YCBtZXRob2QgbWF5IGJlIHN1YnNlcXVlbnRseSBjYWxsZWQgdG8gcmVhY3RpdmF0ZQogICAgICAgKiB0aGUgb2JzZXJ2ZXIuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdCgpIHsKICAgICAgICBpZiAoaXNTbG90KHRoaXMuX3RhcmdldCkpIHsKICAgICAgICAgIHRoaXMuX3VubGlzdGVuU2xvdHMoW3RoaXMuX3RhcmdldF0pOwogICAgICAgIH0gZWxzZSBpZiAod3JhcCh0aGlzLl90YXJnZXQpLmNoaWxkcmVuKSB7CiAgICAgICAgICB0aGlzLl91bmxpc3RlblNsb3RzKAogICAgICAgICAgICAgIC8qKiBAdHlwZSB7IU5vZGVMaXN0PCFOb2RlPn0gKi8gKHdyYXAodGhpcy5fdGFyZ2V0KS5jaGlsZHJlbikpOwogICAgICAgICAgaWYgKHdpbmRvdy5TaGFkeURPTSAmJiB0aGlzLl9zaGFkeUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgICAgd2luZG93LlNoYWR5RE9NLnVub2JzZXJ2ZUNoaWxkcmVuKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcik7CiAgICAgICAgICAgIHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlciA9IG51bGw7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIpIHsKICAgICAgICAgICAgdGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci5kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX25hdGl2ZUNoaWxkcmVuT2JzZXJ2ZXIgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfc2NoZWR1bGUoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9zY2hlZHVsZWQpIHsKICAgICAgICAgIHRoaXMuX3NjaGVkdWxlZCA9IHRydWU7CiAgICAgICAgICBtaWNyb1Rhc2sucnVuKCgpID0+IHRoaXMuZmx1c2goKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHtBcnJheTxNdXRhdGlvblJlY29yZD59IG11dGF0aW9ucyBNdXRhdGlvbnMgc2lnbmFsZWQgYnkgdGhlIG11dGF0aW9uIG9ic2VydmVyCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfcHJvY2Vzc011dGF0aW9ucyhtdXRhdGlvbnMpIHsKICAgICAgICB0aGlzLl9wcm9jZXNzU2xvdE11dGF0aW9ucyhtdXRhdGlvbnMpOwogICAgICAgIHRoaXMuZmx1c2goKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7QXJyYXk8TXV0YXRpb25SZWNvcmQ+fSBtdXRhdGlvbnMgTXV0YXRpb25zIHNpZ25hbGVkIGJ5IHRoZSBtdXRhdGlvbiBvYnNlcnZlcgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX3Byb2Nlc3NTbG90TXV0YXRpb25zKG11dGF0aW9ucykgewogICAgICAgIGlmIChtdXRhdGlvbnMpIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG11dGF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgbXV0YXRpb24gPSBtdXRhdGlvbnNbaV07CiAgICAgICAgICAgIGlmIChtdXRhdGlvbi5hZGRlZE5vZGVzKSB7CiAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuU2xvdHMobXV0YXRpb24uYWRkZWROb2Rlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG11dGF0aW9uLnJlbW92ZWROb2RlcykgewogICAgICAgICAgICAgIHRoaXMuX3VubGlzdGVuU2xvdHMobXV0YXRpb24ucmVtb3ZlZE5vZGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZsdXNoZXMgdGhlIG9ic2VydmVyIGNhdXNpbmcgYW55IHBlbmRpbmcgY2hhbmdlcyB0byBiZSBpbW1lZGlhdGVseQogICAgICAgKiBkZWxpdmVyZWQgdGhlIG9ic2VydmVyIGNhbGxiYWNrLiBCeSBkZWZhdWx0IHRoZXNlIGNoYW5nZXMgYXJlIGRlbGl2ZXJlZAogICAgICAgKiBhc3luY2hyb25vdXNseSBhdCB0aGUgbmV4dCBtaWNyb3Rhc2sgY2hlY2twb2ludC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIGFueSBwZW5kaW5nIGNoYW5nZXMgY2F1c2VkIHRoZSBvYnNlcnZlcgogICAgICAgKiBjYWxsYmFjayB0byBydW4uCiAgICAgICAqLwogICAgICBmbHVzaCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgICBTaGFkeURPTS5mbHVzaCgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fbmF0aXZlQ2hpbGRyZW5PYnNlcnZlci50YWtlUmVjb3JkcygpKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3NoYWR5Q2hpbGRyZW5PYnNlcnZlcikgewogICAgICAgICAgdGhpcy5fcHJvY2Vzc1Nsb3RNdXRhdGlvbnModGhpcy5fc2hhZHlDaGlsZHJlbk9ic2VydmVyLnRha2VSZWNvcmRzKCkpOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zY2hlZHVsZWQgPSBmYWxzZTsKICAgICAgICBsZXQgaW5mbyA9IHsKICAgICAgICAgIHRhcmdldDogdGhpcy5fdGFyZ2V0LAogICAgICAgICAgYWRkZWROb2RlczogW10sCiAgICAgICAgICByZW1vdmVkTm9kZXM6IFtdCiAgICAgICAgfTsKICAgICAgICBsZXQgbmV3Tm9kZXMgPSB0aGlzLmNvbnN0cnVjdG9yLmdldEZsYXR0ZW5lZE5vZGVzKHRoaXMuX3RhcmdldCk7CiAgICAgICAgbGV0IHNwbGljZXMgPSBjYWxjdWxhdGVTcGxpY2VzKG5ld05vZGVzLAogICAgICAgICAgdGhpcy5fZWZmZWN0aXZlTm9kZXMpOwogICAgICAgIC8vIHByb2Nlc3MgcmVtb3ZhbHMKICAgICAgICBmb3IgKGxldCBpPTAsIHM7IChpPHNwbGljZXMubGVuZ3RoKSAmJiAocz1zcGxpY2VzW2ldKTsgaSsrKSB7CiAgICAgICAgICBmb3IgKGxldCBqPTAsIG47IChqIDwgcy5yZW1vdmVkLmxlbmd0aCkgJiYgKG49cy5yZW1vdmVkW2pdKTsgaisrKSB7CiAgICAgICAgICAgIGluZm8ucmVtb3ZlZE5vZGVzLnB1c2gobik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHByb2Nlc3MgYWRkcwogICAgICAgIGZvciAobGV0IGk9MCwgczsgKGk8c3BsaWNlcy5sZW5ndGgpICYmIChzPXNwbGljZXNbaV0pOyBpKyspIHsKICAgICAgICAgIGZvciAobGV0IGo9cy5pbmRleDsgaiA8IHMuaW5kZXggKyBzLmFkZGVkQ291bnQ7IGorKykgewogICAgICAgICAgICBpbmZvLmFkZGVkTm9kZXMucHVzaChuZXdOb2Rlc1tqXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHVwZGF0ZSBjYWNoZQogICAgICAgIHRoaXMuX2VmZmVjdGl2ZU5vZGVzID0gbmV3Tm9kZXM7CiAgICAgICAgbGV0IGRpZEZsdXNoID0gZmFsc2U7CiAgICAgICAgaWYgKGluZm8uYWRkZWROb2Rlcy5sZW5ndGggfHwgaW5mby5yZW1vdmVkTm9kZXMubGVuZ3RoKSB7CiAgICAgICAgICBkaWRGbHVzaCA9IHRydWU7CiAgICAgICAgICB0aGlzLmNhbGxiYWNrLmNhbGwodGhpcy5fdGFyZ2V0LCBpbmZvKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpZEZsdXNoOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU5vZGU+fCFOb2RlTGlzdDwhTm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfbGlzdGVuU2xvdHMobm9kZUxpc3QpIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBub2RlTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgbGV0IG4gPSBub2RlTGlzdFtpXTsKICAgICAgICAgIGlmIChpc1Nsb3QobikpIHsKICAgICAgICAgICAgbi5hZGRFdmVudExpc3RlbmVyKCdzbG90Y2hhbmdlJywgdGhpcy5fYm91bmRTY2hlZHVsZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHshQXJyYXk8IU5vZGU+fCFOb2RlTGlzdDwhTm9kZT59IG5vZGVMaXN0IE5vZGVzIHRoYXQgY291bGQgY2hhbmdlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfdW5saXN0ZW5TbG90cyhub2RlTGlzdCkgewogICAgICAgIGZvciAobGV0IGk9MDsgaSA8IG5vZGVMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgbiA9IG5vZGVMaXN0W2ldOwogICAgICAgICAgaWYgKGlzU2xvdChuKSkgewogICAgICAgICAgICBuLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl9ib3VuZFNjaGVkdWxlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBGb3JjZXMgc2V2ZXJhbCBjbGFzc2VzIG9mIGFzeW5jaHJvbm91c2x5IHF1ZXVlZCB0YXNrcyB0byBmbHVzaDoKICAgICAqIC0gRGVib3VuY2VycyBhZGRlZCB2aWEgYGVucXVldWVEZWJvdW5jZXJgCiAgICAgKiAtIFNoYWR5RE9NIGRpc3RyaWJ1dGlvbgogICAgICoKICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgKi8KICAgIGNvbnN0IGZsdXNoID0gZnVuY3Rpb24oKSB7CiAgICAgIGxldCBzaGFkeURPTSwgZGVib3VuY2VyczsKICAgICAgZG8gewogICAgICAgIHNoYWR5RE9NID0gd2luZG93LlNoYWR5RE9NICYmIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgaWYgKHdpbmRvdy5TaGFkeUNTUyAmJiB3aW5kb3cuU2hhZHlDU1MuU2NvcGluZ1NoaW0pIHsKICAgICAgICAgIHdpbmRvdy5TaGFkeUNTUy5TY29waW5nU2hpbS5mbHVzaCgpOwogICAgICAgIH0KICAgICAgICBkZWJvdW5jZXJzID0gZmx1c2hEZWJvdW5jZXJzKCk7CiAgICAgIH0gd2hpbGUgKHNoYWR5RE9NIHx8IGRlYm91bmNlcnMpOwogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgLyogZXNsaW50LWVuYWJsZSBuby11bnVzZWQtdmFycyAqLwoKICAgIGNvbnN0IHAgPSBFbGVtZW50LnByb3RvdHlwZTsKICAgIC8qKgogICAgICogQGNvbnN0IHtmdW5jdGlvbih0aGlzOk5vZGUsIHN0cmluZyk6IGJvb2xlYW59CiAgICAgKi8KICAgIGNvbnN0IG5vcm1hbGl6ZWRNYXRjaGVzU2VsZWN0b3IgPSBwLm1hdGNoZXMgfHwgcC5tYXRjaGVzU2VsZWN0b3IgfHwKICAgICAgcC5tb3pNYXRjaGVzU2VsZWN0b3IgfHwgcC5tc01hdGNoZXNTZWxlY3RvciB8fAogICAgICBwLm9NYXRjaGVzU2VsZWN0b3IgfHwgcC53ZWJraXRNYXRjaGVzU2VsZWN0b3I7CgogICAgLyoqCiAgICAgKiBDcm9zcy1wbGF0Zm9ybSBgZWxlbWVudC5tYXRjaGVzYCBzaGltLgogICAgICoKICAgICAqIEBmdW5jdGlvbiBtYXRjaGVzU2VsZWN0b3IKICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgTm9kZSB0byBjaGVjayBzZWxlY3RvciBhZ2FpbnN0CiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gbWF0Y2gKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbm9kZSBtYXRjaGVkIHNlbGVjdG9yCiAgICAgKi8KICAgIGNvbnN0IG1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKG5vZGUsIHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBub3JtYWxpemVkTWF0Y2hlc1NlbGVjdG9yLmNhbGwobm9kZSwgc2VsZWN0b3IpOwogICAgfTsKCiAgICAvKioKICAgICAqIE5vZGUgQVBJIHdyYXBwZXIgY2xhc3MgcmV0dXJuZWQgZnJvbSBgUG9seW1lci5kb20uKHRhcmdldClgIHdoZW4KICAgICAqIGB0YXJnZXRgIGlzIGEgYE5vZGVgLgogICAgICogQGltcGxlbWVudHMge1BvbHltZXJEb21BcGl9CiAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgKi8KICAgIGNsYXNzIERvbUFwaU5hdGl2ZSB7CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIGZvciB3aGljaCB0byBjcmVhdGUgYSBQb2x5bWVyLmRvbSBoZWxwZXIgb2JqZWN0LgogICAgICAgKi8KICAgICAgY29uc3RydWN0b3Iobm9kZSkgewogICAgICAgIGlmICh3aW5kb3dbJ1NoYWR5RE9NJ10gJiYgd2luZG93WydTaGFkeURPTSddWydpblVzZSddKSB7CiAgICAgICAgICB3aW5kb3dbJ1NoYWR5RE9NJ11bJ3BhdGNoJ10obm9kZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMubm9kZSA9IG5vZGU7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIGluc3RhbmNlIG9mIGBGbGF0dGVuZWROb2Rlc09ic2VydmVyYCB0aGF0CiAgICAgICAqIGxpc3RlbnMgZm9yIG5vZGUgY2hhbmdlcyBvbiB0aGlzIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24odGhpczpIVE1MRWxlbWVudCwgeyB0YXJnZXQ6ICFIVE1MRWxlbWVudCwgYWRkZWROb2RlczogIUFycmF5PCFFbGVtZW50PiwgcmVtb3ZlZE5vZGVzOiAhQXJyYXk8IUVsZW1lbnQ+IH0pOnZvaWR9IGNhbGxiYWNrIENhbGxlZCB3aGVuIGRpcmVjdCBvciBkaXN0cmlidXRlZCBjaGlsZHJlbgogICAgICAgKiAgIG9mIHRoaXMgZWxlbWVudCBjaGFuZ2VzCiAgICAgICAqIEByZXR1cm4geyFQb2x5bWVyRG9tQXBpLk9ic2VydmVIYW5kbGV9IE9ic2VydmVyIGluc3RhbmNlCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgb2JzZXJ2ZU5vZGVzKGNhbGxiYWNrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBGbGF0dGVuZWROb2Rlc09ic2VydmVyKAogICAgICAgICAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8odGhpcy5ub2RlKSwgY2FsbGJhY2spOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRGlzY29ubmVjdHMgYW4gb2JzZXJ2ZXIgcHJldmlvdXNseSBjcmVhdGVkIHZpYSBgb2JzZXJ2ZU5vZGVzYAogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFQb2x5bWVyRG9tQXBpLk9ic2VydmVIYW5kbGV9IG9ic2VydmVySGFuZGxlIE9ic2VydmVyIGluc3RhbmNlCiAgICAgICAqICAgdG8gZGlzY29ubmVjdC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICB1bm9ic2VydmVOb2RlcyhvYnNlcnZlckhhbmRsZSkgewogICAgICAgIG9ic2VydmVySGFuZGxlLmRpc2Nvbm5lY3QoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFByb3ZpZGVkIGFzIGEgYmFja3dhcmRzLWNvbXBhdGlibGUgQVBJIG9ubHkuICBUaGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBub3RpZnlPYnNlcnZlcigpIHt9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBwcm92aWRlZCBub2RlIGlzIGNvbnRhaW5lZCB3aXRoIHRoaXMgZWxlbWVudCdzCiAgICAgICAqIGxpZ2h0LURPTSBjaGlsZHJlbiBvciBzaGFkb3cgcm9vdCwgaW5jbHVkaW5nIGFueSBuZXN0ZWQgc2hhZG93IHJvb3RzCiAgICAgICAqIG9mIGNoaWxkcmVuIHRoZXJlaW4uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Tm9kZX0gbm9kZSBOb2RlIHRvIHRlc3QKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBgbm9kZWAgaXMgY29udGFpbmVkIHdpdGhpbgogICAgICAgKiAgIHRoaXMgZWxlbWVudCdzIGxpZ2h0IG9yIHNoYWRvdyBET00uCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgZGVlcENvbnRhaW5zKG5vZGUpIHsKICAgICAgICBpZiAod3JhcCh0aGlzLm5vZGUpLmNvbnRhaW5zKG5vZGUpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgbGV0IG4gPSBub2RlOwogICAgICAgIGxldCBkb2MgPSBub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgICAgLy8gd2FsayBmcm9tIG5vZGUgdG8gYHRoaXNgIG9yIGBkb2N1bWVudGAKICAgICAgICB3aGlsZSAobiAmJiBuICE9PSBkb2MgJiYgbiAhPT0gdGhpcy5ub2RlKSB7CiAgICAgICAgICAvLyB1c2UgbG9naWNhbCBwYXJlbnRub2RlLCBvciBuYXRpdmUgU2hhZG93Um9vdCBob3N0CiAgICAgICAgICBuID0gd3JhcChuKS5wYXJlbnROb2RlIHx8IHdyYXAobikuaG9zdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG4gPT09IHRoaXMubm9kZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHJvb3Qgbm9kZSBvZiB0aGlzIG5vZGUuICBFcXVpdmFsZW50IHRvIGBnZXRSb290Tm9kZSgpYC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU5vZGV9IFRvcCBtb3N0IGVsZW1lbnQgaW4gdGhlIGRvbSB0cmVlIGluIHdoaWNoIHRoZSBub2RlCiAgICAgICAqIGV4aXN0cy4gSWYgdGhlIG5vZGUgaXMgY29ubmVjdGVkIHRvIGEgZG9jdW1lbnQgdGhpcyBpcyBlaXRoZXIgYQogICAgICAgKiBzaGFkb3dSb290IG9yIHRoZSBkb2N1bWVudDsgb3RoZXJ3aXNlLCBpdCBtYXkgYmUgdGhlIG5vZGUKICAgICAgICogaXRzZWxmIG9yIGEgbm9kZSBvciBkb2N1bWVudCBmcmFnbWVudCBjb250YWluaW5nIGl0LgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGdldE93bmVyUm9vdCgpIHsKICAgICAgICByZXR1cm4gd3JhcCh0aGlzLm5vZGUpLmdldFJvb3ROb2RlKCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3Igc2xvdCBlbGVtZW50cywgcmV0dXJucyB0aGUgbm9kZXMgYXNzaWduZWQgdG8gdGhlIHNsb3Q7IG90aGVyd2lzZQogICAgICAgKiBhbiBlbXB0eSBhcnJheS4gSXQgaXMgZXF1aXZhbGVudCB0byBgPHNsb3Q+LmFkZGlnbmVkTm9kZXMoe2ZsYXR0ZW46dHJ1ZX0pYC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gQXJyYXkgb2YgYXNzaWduZWQgbm9kZXMKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqLwogICAgICBnZXREaXN0cmlidXRlZE5vZGVzKCkgewogICAgICAgIHJldHVybiAodGhpcy5ub2RlLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSA/CiAgICAgICAgICB3cmFwKHRoaXMubm9kZSkuYXNzaWduZWROb2Rlcyh7ZmxhdHRlbjogdHJ1ZX0pIDoKICAgICAgICAgIFtdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBhbGwgc2xvdHMgdGhpcyBlbGVtZW50IHdhcyBkaXN0cmlidXRlZCB0by4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5PCFIVE1MU2xvdEVsZW1lbnQ+fSBEZXNjcmlwdGlvbgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGdldERlc3RpbmF0aW9uSW5zZXJ0aW9uUG9pbnRzKCkgewogICAgICAgIGxldCBpcCQgPSBbXTsKICAgICAgICBsZXQgbiA9IHdyYXAodGhpcy5ub2RlKS5hc3NpZ25lZFNsb3Q7CiAgICAgICAgd2hpbGUgKG4pIHsKICAgICAgICAgIGlwJC5wdXNoKG4pOwogICAgICAgICAgbiA9IHdyYXAobikuYXNzaWduZWRTbG90OwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXAkOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2FsbHMgYGltcG9ydE5vZGVgIG9uIHRoZSBgb3duZXJEb2N1bWVudGAgZm9yIHRoaXMgbm9kZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGltcG9ydAogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGRlZXAgVHJ1ZSBpZiB0aGUgbm9kZSBzaG91bGQgYmUgY2xvbmVkIGRlZXBseSBkdXJpbmcKICAgICAgICogICBpbXBvcnQKICAgICAgICogQHJldHVybiB7Tm9kZX0gQ2xvbmUgb2YgZ2l2ZW4gbm9kZSBpbXBvcnRlZCB0byB0aGlzIG93bmVyIGRvY3VtZW50CiAgICAgICAqLwogICAgICBpbXBvcnROb2RlKG5vZGUsIGRlZXApIHsKICAgICAgICBsZXQgZG9jID0gdGhpcy5ub2RlIGluc3RhbmNlb2YgRG9jdW1lbnQgPyB0aGlzLm5vZGUgOgogICAgICAgICAgdGhpcy5ub2RlLm93bmVyRG9jdW1lbnQ7CiAgICAgICAgcmV0dXJuIHdyYXAoZG9jKS5pbXBvcnROb2RlKG5vZGUsIGRlZXApOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gUmV0dXJucyBhIGZsYXR0ZW5lZCBsaXN0IG9mIGFsbCBjaGlsZCBub2RlcyBhbmQKICAgICAgICogbm9kZXMgYXNzaWduZWQgdG8gY2hpbGQgc2xvdHMuCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpIHsKICAgICAgICByZXR1cm4gRmxhdHRlbmVkTm9kZXNPYnNlcnZlci5nZXRGbGF0dGVuZWROb2RlcygKICAgICAgICAgICAgLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovICh0aGlzLm5vZGUpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSBmaWx0ZXJlZCBsaXN0IG9mIGZsYXR0ZW5lZCBjaGlsZCBlbGVtZW50cyBmb3IgdGhpcyBlbGVtZW50IGJhc2VkCiAgICAgICAqIG9uIHRoZSBnaXZlbiBzZWxlY3Rvci4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yIFNlbGVjdG9yIHRvIGZpbHRlciBub2RlcyBhZ2FpbnN0CiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhSFRNTEVsZW1lbnQ+fSBMaXN0IG9mIGZsYXR0ZW5lZCBjaGlsZCBlbGVtZW50cwogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIHF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3RvcikgewogICAgICAgIGxldCBjJCA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgIGxldCBsaXN0ID0gW107CiAgICAgICAgZm9yIChsZXQgaT0wLCBsPWMkLmxlbmd0aCwgYzsgKGk8bCkgJiYgKGM9YyRbaV0pOyBpKyspIHsKICAgICAgICAgIGlmICgoYy5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpICYmCiAgICAgICAgICAgICAgbWF0Y2hlc1NlbGVjdG9yKGMsIHNlbGVjdG9yKSkgewogICAgICAgICAgICBsaXN0LnB1c2goYyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yIHNoYWRvdyByb290cywgcmV0dXJucyB0aGUgY3VycmVudGx5IGZvY3VzZWQgZWxlbWVudCB3aXRoaW4gdGhpcwogICAgICAgKiBzaGFkb3cgcm9vdC4KICAgICAgICoKICAgICAgICogcmV0dXJuIHtOb2RlfHVuZGVmaW5lZH0gQ3VycmVudGx5IGZvY3VzZWQgZWxlbWVudAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIGdldCBhY3RpdmVFbGVtZW50KCkgewogICAgICAgIGxldCBub2RlID0gdGhpcy5ub2RlOwogICAgICAgIHJldHVybiBub2RlLl9hY3RpdmVFbGVtZW50ICE9PSB1bmRlZmluZWQgPyBub2RlLl9hY3RpdmVFbGVtZW50IDogbm9kZS5hY3RpdmVFbGVtZW50OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZm9yd2FyZE1ldGhvZHMocHJvdG8sIG1ldGhvZHMpIHsKICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBtZXRob2QgPSBtZXRob2RzW2ldOwogICAgICAgIC8qIGVzbGludC1kaXNhYmxlIHZhbGlkLWpzZG9jICovCiAgICAgICAgcHJvdG9bbWV0aG9kXSA9IC8qKiBAdGhpcyB7RG9tQXBpTmF0aXZlfSAqLyBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVbbWV0aG9kXS5hcHBseSh0aGlzLm5vZGUsIGFyZ3VtZW50cyk7CiAgICAgICAgfTsKICAgICAgICAvKiBlc2xpbnQtZW5hYmxlICovCiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmb3J3YXJkUmVhZE9ubHlQcm9wZXJ0aWVzKHByb3RvLCBwcm9wZXJ0aWVzKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbmFtZSA9IHByb3BlcnRpZXNbaV07CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBuYW1lLCB7CiAgICAgICAgICBnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBjb25zdCBkb21BcGkgPSAvKiogQHR5cGUge0RvbUFwaU5hdGl2ZX0gKi8odGhpcyk7CiAgICAgICAgICAgIHJldHVybiBkb21BcGkubm9kZVtuYW1lXTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICB9KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGZvcndhcmRQcm9wZXJ0aWVzKHByb3RvLCBwcm9wZXJ0aWVzKSB7CiAgICAgIGZvciAobGV0IGk9MDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbmFtZSA9IHByb3BlcnRpZXNbaV07CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb3RvLCBuYW1lLCB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIEB0aGlzIHtEb21BcGlOYXRpdmV9CiAgICAgICAgICAgKiBAcmV0dXJuIHsqfSAuCiAgICAgICAgICAgKi8KICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vZGVbbmFtZV07CiAgICAgICAgICB9LAogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBAdGhpcyB7RG9tQXBpTmF0aXZlfQogICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSAuCiAgICAgICAgICAgKi8KICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5ub2RlW25hbWVdID0gdmFsdWU7CiAgICAgICAgICB9LAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH0KICAgIH0KCgogICAgLyoqCiAgICAgKiBFdmVudCBBUEkgd3JhcHBlciBjbGFzcyByZXR1cm5lZCBmcm9tIGBkb20uKHRhcmdldClgIHdoZW4KICAgICAqIGB0YXJnZXRgIGlzIGFuIGBFdmVudGAuCiAgICAgKi8KICAgIGNsYXNzIEV2ZW50QXBpIHsKICAgICAgY29uc3RydWN0b3IoZXZlbnQpIHsKICAgICAgICB0aGlzLmV2ZW50ID0gZXZlbnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBub2RlIG9uIHRoZSBgY29tcG9zZWRQYXRoYCBvZiB0aGlzIGV2ZW50LgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHshRXZlbnRUYXJnZXR9IFRoZSBub2RlIHRoaXMgZXZlbnQgd2FzIGRpc3BhdGNoZWQgdG8KICAgICAgICovCiAgICAgIGdldCByb290VGFyZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLnBhdGhbMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbCAocmUtdGFyZ2V0ZWQpIHRhcmdldCBmb3IgdGhpcyBldmVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUV2ZW50VGFyZ2V0fSBUaGUgbG9jYWwgKHJlLXRhcmdldGVkKSB0YXJnZXQgZm9yIHRoaXMgZXZlbnQuCiAgICAgICAqLwogICAgICBnZXQgbG9jYWxUYXJnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZXZlbnQudGFyZ2V0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgYGNvbXBvc2VkUGF0aGAgZm9yIHRoaXMgZXZlbnQuCiAgICAgICAqIEByZXR1cm4geyFBcnJheTwhRXZlbnRUYXJnZXQ+fSBUaGUgbm9kZXMgdGhpcyBldmVudCBwcm9wYWdhdGVkIHRocm91Z2gKICAgICAgICovCiAgICAgIGdldCBwYXRoKCkgewogICAgICAgIHJldHVybiB0aGlzLmV2ZW50LmNvbXBvc2VkUGF0aCgpOwogICAgICB9CiAgICB9CgogICAgbGV0IERvbUFwaUltcGwgPSBEb21BcGlOYXRpdmU7CgogICAgaWYgKHdpbmRvd1snU2hhZHlET00nXSAmJiB3aW5kb3dbJ1NoYWR5RE9NJ11bJ2luVXNlJ10gJiYgd2luZG93WydTaGFkeURPTSddWydub1BhdGNoJ10gJiYgd2luZG93WydTaGFkeURPTSddWydXcmFwcGVyJ10pIHsKCiAgICAgIC8qKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKiBAZXh0ZW5kcyB7SFRNTEVsZW1lbnR9CiAgICAgICAqLwogICAgICBjbGFzcyBXcmFwcGVyIGV4dGVuZHMgd2luZG93WydTaGFkeURPTSddWydXcmFwcGVyJ10ge30KCiAgICAgIC8vIGNvcHkgYmVzcG9rZSBBUEkgb250byB3cmFwcGVyCiAgICAgIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKERvbUFwaU5hdGl2ZS5wcm90b3R5cGUpLmZvckVhY2goKHByb3ApID0+IHsKICAgICAgICBpZiAocHJvcCAhPSAnYWN0aXZlRWxlbWVudCcpIHsKICAgICAgICAgIFdyYXBwZXIucHJvdG90eXBlW3Byb3BdID0gRG9tQXBpTmF0aXZlLnByb3RvdHlwZVtwcm9wXTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgLy8gTm90ZSwgYGNsYXNzTGlzdGAgaXMgaGVyZSBvbmx5IGZvciBsZWdhY3kgY29tcGF0aWJpbGl0eSBzaW5jZSBpdCBkb2VzIG5vdAogICAgICAvLyB0cmlnZ2VyIGRpc3RyaWJ1dGlvbiBpbiB2MSBTaGFkb3cgRE9NLgogICAgICBmb3J3YXJkUmVhZE9ubHlQcm9wZXJ0aWVzKFdyYXBwZXIucHJvdG90eXBlLCBbCiAgICAgICAgJ2NsYXNzTGlzdCcKICAgICAgXSk7CgogICAgICBEb21BcGlJbXBsID0gV3JhcHBlcjsKCiAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKEV2ZW50QXBpLnByb3RvdHlwZSwgewoKICAgICAgICAvLyBSZXR1cm5zIHRoZSAibG93ZXN0IiBub2RlIGluIHRoZSBzYW1lIHJvb3QgYXMgdGhlIGV2ZW50J3MgY3VycmVudFRhcmdldC4KICAgICAgICAvLyBXaGVuIGluIGBub1BhdGNoYCBtb2RlLCB0aGlzIG11c3QgYmUgY2FsY3VsYXRlZCBieSB3YWxraW5nIHRoZSBldmVudCdzCiAgICAgICAgLy8gcGF0aC4KICAgICAgICBsb2NhbFRhcmdldDogewogICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gdGhpcy5ldmVudC5jdXJyZW50VGFyZ2V0OwogICAgICAgICAgICBjb25zdCBjdXJyZW50Um9vdCA9IGN1cnJlbnQgJiYgZG9tKGN1cnJlbnQpLmdldE93bmVyUm9vdCgpOwogICAgICAgICAgICBjb25zdCBwJCA9IHRoaXMucGF0aDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwJC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGUgPSBwJFtpXTsKICAgICAgICAgICAgICBpZiAoZG9tKGUpLmdldE93bmVyUm9vdCgpID09PSBjdXJyZW50Um9vdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9LAogICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgfSwKCiAgICAgICAgcGF0aDogewogICAgICAgICAgZ2V0KCkgewogICAgICAgICAgICByZXR1cm4gd2luZG93WydTaGFkeURPTSddWydjb21wb3NlZFBhdGgnXSh0aGlzLmV2ZW50KTsKICAgICAgICAgIH0sCiAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICB9CiAgICAgIH0pOwoKICAgIH0gZWxzZSB7CgogICAgICAvLyBNZXRob2RzIHRoYXQgY2FuIHByb3Zva2UgZGlzdHJpYnV0aW9uIG9yIG11c3QgcmV0dXJuIHRoZSBsb2dpY2FsLCBub3QKICAgICAgLy8gY29tcG9zZWQgdHJlZS4KICAgICAgZm9yd2FyZE1ldGhvZHMoRG9tQXBpTmF0aXZlLnByb3RvdHlwZSwgWwogICAgICAgICdjbG9uZU5vZGUnLCAnYXBwZW5kQ2hpbGQnLCAnaW5zZXJ0QmVmb3JlJywgJ3JlbW92ZUNoaWxkJywKICAgICAgICAncmVwbGFjZUNoaWxkJywgJ3NldEF0dHJpYnV0ZScsICdyZW1vdmVBdHRyaWJ1dGUnLAogICAgICAgICdxdWVyeVNlbGVjdG9yJywgJ3F1ZXJ5U2VsZWN0b3JBbGwnCiAgICAgIF0pOwoKICAgICAgLy8gUHJvcGVydGllcyB0aGF0IHNob3VsZCByZXR1cm4gdGhlIGxvZ2ljYWwsIG5vdCBjb21wb3NlZCB0cmVlLiBOb3RlLCBgY2xhc3NMaXN0YAogICAgICAvLyBpcyBoZXJlIG9ubHkgZm9yIGxlZ2FjeSBjb21wYXRpYmlsaXR5IHNpbmNlIGl0IGRvZXMgbm90IHRyaWdnZXIgZGlzdHJpYnV0aW9uCiAgICAgIC8vIGluIHYxIFNoYWRvdyBET00uCiAgICAgIGZvcndhcmRSZWFkT25seVByb3BlcnRpZXMoRG9tQXBpTmF0aXZlLnByb3RvdHlwZSwgWwogICAgICAgICdwYXJlbnROb2RlJywgJ2ZpcnN0Q2hpbGQnLCAnbGFzdENoaWxkJywKICAgICAgICAnbmV4dFNpYmxpbmcnLCAncHJldmlvdXNTaWJsaW5nJywgJ2ZpcnN0RWxlbWVudENoaWxkJywKICAgICAgICAnbGFzdEVsZW1lbnRDaGlsZCcsICduZXh0RWxlbWVudFNpYmxpbmcnLCAncHJldmlvdXNFbGVtZW50U2libGluZycsCiAgICAgICAgJ2NoaWxkTm9kZXMnLCAnY2hpbGRyZW4nLCAnY2xhc3NMaXN0JwogICAgICBdKTsKCiAgICAgIGZvcndhcmRQcm9wZXJ0aWVzKERvbUFwaU5hdGl2ZS5wcm90b3R5cGUsIFsKICAgICAgICAndGV4dENvbnRlbnQnLCAnaW5uZXJIVE1MJywgJ2NsYXNzTmFtZScKICAgICAgXSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBMZWdhY3kgRE9NIGFuZCBFdmVudCBtYW5pcHVsYXRpb24gQVBJIHdyYXBwZXIgZmFjdG9yeSB1c2VkIHRvIGFic3RyYWN0CiAgICAgKiBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NIiB3aGVuIHBvbHlmaWxsaW5nIG9uCiAgICAgKiBvbGRlciBicm93c2Vycy4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgaW4gUG9seW1lciAyLnggdXNlIG9mIGBQb2x5bWVyLmRvbWAgaXMgbm8gbG9uZ2VyIHJlcXVpcmVkIGFuZAogICAgICogaW4gdGhlIG1ham9yaXR5IG9mIGNhc2VzIHNpbXBseSBmYWNhZGVzIGRpcmVjdGx5IHRvIHRoZSBzdGFuZGFyZCBuYXRpdmUKICAgICAqIEFQSS4KICAgICAqCiAgICAgKiBAc3VtbWFyeSBMZWdhY3kgRE9NIGFuZCBFdmVudCBtYW5pcHVsYXRpb24gQVBJIHdyYXBwZXIgZmFjdG9yeSB1c2VkIHRvCiAgICAgKiBhYnN0cmFjdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIG5hdGl2ZSBTaGFkb3cgRE9NIGFuZCAiU2hhZHkgRE9NLiIKICAgICAqIEBwYXJhbSB7KE5vZGV8RXZlbnR8RG9tQXBpTmF0aXZlfEV2ZW50QXBpKT19IG9iaiBOb2RlIG9yIGV2ZW50IHRvIG9wZXJhdGUgb24KICAgICAqIEByZXR1cm4geyFEb21BcGlOYXRpdmV8IUV2ZW50QXBpfSBXcmFwcGVyIHByb3ZpZGluZyBlaXRoZXIgbm9kZSBBUEkgb3IgZXZlbnQgQVBJCiAgICAgKi8KICAgIGNvbnN0IGRvbSA9IGZ1bmN0aW9uKG9iaikgewogICAgICBvYmogPSBvYmogfHwgZG9jdW1lbnQ7CiAgICAgIGlmIChvYmogaW5zdGFuY2VvZiBEb21BcGlJbXBsKSB7CiAgICAgICAgcmV0dXJuIC8qKiBAdHlwZSB7IURvbUFwaX0gKi8ob2JqKTsKICAgICAgfQogICAgICBpZiAob2JqIGluc3RhbmNlb2YgRXZlbnRBcGkpIHsKICAgICAgICByZXR1cm4gLyoqIEB0eXBlIHshRXZlbnRBcGl9ICovKG9iaik7CiAgICAgIH0KICAgICAgbGV0IGhlbHBlciA9IG9ialsnX19kb21BcGknXTsKICAgICAgaWYgKCFoZWxwZXIpIHsKICAgICAgICBpZiAob2JqIGluc3RhbmNlb2YgRXZlbnQpIHsKICAgICAgICAgIGhlbHBlciA9IG5ldyBFdmVudEFwaShvYmopOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBoZWxwZXIgPSBuZXcgRG9tQXBpSW1wbCgvKiogQHR5cGUge05vZGV9ICovKG9iaikpOwogICAgICAgIH0KICAgICAgICBvYmpbJ19fZG9tQXBpJ10gPSBoZWxwZXI7CiAgICAgIH0KICAgICAgcmV0dXJuIGhlbHBlcjsKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE5IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCBTaGFkeURPTSQxID0gd2luZG93LlNoYWR5RE9NOwogICAgY29uc3QgU2hhZHlDU1MgPSB3aW5kb3cuU2hhZHlDU1M7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gdHJ1ZSBpZiBub2RlIHNjb3BlIGlzIGNvcnJlY3QuCiAgICAgKgogICAgICogQHBhcmFtIHshRWxlbWVudH0gbm9kZSBOb2RlIHRvIGNoZWNrIHNjb3BlCiAgICAgKiBAcGFyYW0geyFOb2RlfSBzY29wZSBTY29wZSByZWZlcmVuY2UKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgbm9kZSBpcyBpbiBzY29wZQogICAgICovCiAgICBmdW5jdGlvbiBzYW1lU2NvcGUobm9kZSwgc2NvcGUpIHsKICAgICAgcmV0dXJuIHdyYXAobm9kZSkuZ2V0Um9vdE5vZGUoKSA9PT0gc2NvcGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBFbnN1cmUgdGhhdCBlbGVtZW50cyBpbiBhIFNoYWRvd0RPTSBjb250YWluZXIgYXJlIHNjb3BlZCBjb3JyZWN0bHkuCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgbmVlZGVkIHdoZW4gU2hhZHlET00gaXMgdXNlZCBhbmQgdW5wYXRjaGVkIERPTSBBUElzIGFyZSB1c2VkIGluIHRoaXJkIHBhcnR5IGNvZGUuCiAgICAgKiBUaGlzIGNhbiBoYXBwZW4gaW4gbm9QYXRjaCBtb2RlIG9yIHdoZW4gc3BlY2lhbGl6ZWQgQVBJcyBsaWtlIHJhbmdlcyBvciB0YWJsZXMgYXJlIHVzZWQgdG8gbXV0YXRlIERPTS4KICAgICAqCiAgICAgKiBAcGFyYW0gIHshRWxlbWVudH0gY29udGFpbmVyIENvbnRhaW5lciBlbGVtZW50IHRvIHNjb3BlCiAgICAgKiBAcGFyYW0gIHtib29sZWFuPX0gc2hvdWxkT2JzZXJ2ZSBpZiB0cnVlLCBzdGFydCBhIG11dGF0aW9uIG9ic2VydmVyIGZvciBhZGRlZCBub2RlcyB0byB0aGUgY29udGFpbmVyCiAgICAgKiBAcmV0dXJuIHs/TXV0YXRpb25PYnNlcnZlcn0gUmV0dXJucyBhIG5ldyBNdXRhdGlvbk9ic2VydmVyIG9uIGBjb250YWluZXJgIGlmIGBzaG91bGRPYnNlcnZlYCBpcyB0cnVlLgogICAgICovCiAgICBmdW5jdGlvbiBzY29wZVN1YnRyZWUoY29udGFpbmVyLCBzaG91bGRPYnNlcnZlID0gZmFsc2UpIHsKICAgICAgLy8gSWYgdXNpbmcgbmF0aXZlIFNoYWRvd0RPTSwgYWJvcnQKICAgICAgaWYgKCFTaGFkeURPTSQxIHx8ICFTaGFkeUNTUykgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8vIFNoYWR5Q1NTIGhhbmRsZXMgRE9NIG11dGF0aW9ucyB3aGVuIFNoYWR5RE9NIGRvZXMgbm90IGhhbmRsZSBzY29waW5nIGl0c2VsZgogICAgICBpZiAoIVNoYWR5RE9NJDFbJ2hhbmRsZXNEeW5hbWljU2NvcGluZyddKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgICAgY29uc3QgU2NvcGluZ1NoaW0gPSBTaGFkeUNTU1snU2NvcGluZ1NoaW0nXTsKICAgICAgLy8gaWYgU2NvcGluZ1NoaW0gaXMgbm90IGF2YWlsYWJsZSwgYWJvcnQKICAgICAgaWYgKCFTY29waW5nU2hpbSkgewogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CiAgICAgIC8vIGNhcHR1cmUgY29ycmVjdCBzY29wZSBmb3IgY29udGFpbmVyCiAgICAgIGNvbnN0IGNvbnRhaW5lclNjb3BlID0gU2NvcGluZ1NoaW1bJ3Njb3BlRm9yTm9kZSddKGNvbnRhaW5lcik7CiAgICAgIGNvbnN0IHJvb3QgPSB3cmFwKGNvbnRhaW5lcikuZ2V0Um9vdE5vZGUoKTsKCiAgICAgIGNvbnN0IHNjb3BpZnkgPSAobm9kZSkgPT4gewogICAgICAgIGlmICghc2FtZVNjb3BlKG5vZGUsIHJvb3QpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIE5PVEU6IG5hdGl2ZSBxU0EgZG9lcyBub3QgaG9ub3Igc2NvcGVkIERPTSwgYnV0IGl0IGlzIGZhc3RlciwgYW5kIHRoZSBzYW1lIGJlaGF2aW9yIGFzIFBvbHltZXIgdjEKICAgICAgICBjb25zdCBlbGVtZW50cyA9IEFycmF5LmZyb20oU2hhZHlET00kMVsnbmF0aXZlTWV0aG9kcyddWydxdWVyeVNlbGVjdG9yQWxsJ10uY2FsbChub2RlLCAnKicpKTsKICAgICAgICBlbGVtZW50cy5wdXNoKG5vZGUpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGNvbnN0IGVsID0gZWxlbWVudHNbaV07CiAgICAgICAgICBpZiAoIXNhbWVTY29wZShlbCwgcm9vdCkpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBjdXJyZW50U2NvcGUgPSBTY29waW5nU2hpbVsnY3VycmVudFNjb3BlRm9yTm9kZSddKGVsKTsKICAgICAgICAgIGlmIChjdXJyZW50U2NvcGUgIT09IGNvbnRhaW5lclNjb3BlKSB7CiAgICAgICAgICAgIGlmIChjdXJyZW50U2NvcGUgIT09ICcnKSB7CiAgICAgICAgICAgICAgU2NvcGluZ1NoaW1bJ3Vuc2NvcGVOb2RlJ10oZWwsIGN1cnJlbnRTY29wZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgU2NvcGluZ1NoaW1bJ3Njb3BlTm9kZSddKGVsLCBjb250YWluZXJTY29wZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9OwoKICAgICAgLy8gc2NvcGUgZXZlcnl0aGluZyBpbiBjb250YWluZXIKICAgICAgc2NvcGlmeShjb250YWluZXIpOwoKICAgICAgaWYgKHNob3VsZE9ic2VydmUpIHsKICAgICAgICBjb25zdCBtbyA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKChteG5zKSA9PiB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG14bnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgY29uc3QgbXhuID0gbXhuc1tpXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBteG4uYWRkZWROb2Rlcy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgIGNvbnN0IGFkZGVkTm9kZSA9IG14bi5hZGRlZE5vZGVzW2pdOwogICAgICAgICAgICAgIGlmIChhZGRlZE5vZGUubm9kZVR5cGUgPT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICAgICAgICBzY29waWZ5KGFkZGVkTm9kZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgbW8ub2JzZXJ2ZShjb250YWluZXIsIHtjaGlsZExpc3Q6IHRydWUsIHN1YnRyZWU6IHRydWV9KTsKICAgICAgICByZXR1cm4gbW87CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tQcm90b3R5cGFsVHlwZXN9CiAgICAgKiBAbGljZW5zZSBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICAgKiBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZAogICAgICogYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heQogICAgICogYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieQogICAgICogR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUAogICAgICogcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgICovCgogICAgY29uc3QgRElTQUJMRURfQVRUUiA9ICdkaXNhYmxlLXVwZ3JhZGUnOwoKICAgIGNvbnN0IGZpbmRPYnNlcnZlZEF0dHJpYnV0ZXNHZXR0ZXIgPSAoY3RvcikgPT4gewogICAgICB3aGlsZSAoY3RvcikgewogICAgICAgIGNvbnN0IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGN0b3IsICdvYnNlcnZlZEF0dHJpYnV0ZXMnKTsKICAgICAgICBpZiAoZGVzYykgewogICAgICAgICAgcmV0dXJuIGRlc2MuZ2V0OwogICAgICAgIH0KICAgICAgICBjdG9yID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKGN0b3IucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjsKICAgICAgfQogICAgICByZXR1cm4gKCkgPT4gW107CiAgICB9OwoKICAgIC8qKgogICAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IGFsbG93cyB0aGUgZWxlbWVudCB0byBib290IHVwIGluIGEgbm9uLWVuYWJsZWQKICAgICAqIHN0YXRlIHdoZW4gdGhlIGBkaXNhYmxlLXVwZ3JhZGVgIGF0dHJpYnV0ZSBpcyBwcmVzZW50LiBUaGlzIG1peGluIGlzCiAgICAgKiBkZXNpZ25lZCB0byBiZSB1c2VkIHdpdGggZWxlbWVudCBjbGFzc2VzIGxpa2UgUG9seW1lckVsZW1lbnQgdGhhdCBwZXJmb3JtCiAgICAgKiBpbml0aWFsIHN0YXJ0dXAgd29yayB3aGVuIHRoZXkgYXJlIGZpcnN0IGNvbm5lY3RlZC4gV2hlbiB0aGUKICAgICAqIGBkaXNhYmxlLXVwZ3JhZGVgIGF0dHJpYnV0ZSBpcyByZW1vdmVkLCBpZiB0aGUgZWxlbWVudCBpcyBjb25uZWN0ZWQsIGl0CiAgICAgKiBib290cyB1cCBhbmQgImVuYWJsZXMiIGFzIGl0IG90aGVyd2lzZSB3b3VsZDsgaWYgaXQgaXMgbm90IGNvbm5lY3RlZCwgdGhlCiAgICAgKiBlbGVtZW50IGJvb3RzIHVwIHdoZW4gaXQgaXMgbmV4dCBjb25uZWN0ZWQuCiAgICAgKgogICAgICogVXNpbmcgYGRpc2FibGUtdXBncmFkZWAgd2l0aCBQb2x5bWVyRWxlbWVudCBwcmV2ZW50cyBhbnkgZGF0YSBwcm9wYWdhdGlvbgogICAgICogdG8gdGhlIGVsZW1lbnQsIGFueSBlbGVtZW50IERPTSBmcm9tIHN0YW1waW5nLCBvciBhbnkgd29yayBkb25lIGluCiAgICAgKiBjb25uZWN0ZWQvZGlzY29ubmN0ZWRDYWxsYmFjayBmcm9tIG9jY3VyaW5nLCBidXQgaXQgZG9lcyBub3QgcHJldmVudCB3b3JrCiAgICAgKiBkb25lIGluIHRoZSBlbGVtZW50IGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIE5vdGUsIHRoaXMgbWl4aW4gbXVzdCBiZSBhcHBsaWVkIG9uIHRvcCBvZiBhbnkgZWxlbWVudCBjbGFzcyB0aGF0CiAgICAgKiBpdHNlbGYgaW1wbGVtZW50cyBhIGBjb25uZWN0ZWRDYWxsYmFja2Agc28gdGhhdCBpdCBjYW4gY29udHJvbCB0aGUgd29yawogICAgICogZG9uZSBpbiBgY29ubmVjdGVkQ2FsbGJhY2tgLiBGb3IgZXhhbXBsZSwKICAgICAqCiAgICAgKiAgICAgTXlDbGFzcyA9IERpc2FibGVVcGdyYWRlTWl4aW4oY2xhc3MgZXh0ZW5kcyBCYXNlQ2xhc3Mgey4uLn0pOwogICAgICoKICAgICAqIEBtaXhpbkZ1bmN0aW9uCiAgICAgKiBAcG9seW1lcgogICAgICogQGFwcGxpZXNNaXhpbiBFbGVtZW50TWl4aW4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpUKX0gc3VwZXJDbGFzcyBDbGFzcyB0byBhcHBseSBtaXhpbiB0by4KICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzpUKX0gc3VwZXJDbGFzcyB3aXRoIG1peGluIGFwcGxpZWQuCiAgICAgKi8KICAgIGNvbnN0IERpc2FibGVVcGdyYWRlTWl4aW4gPSBkZWR1cGluZ01peGluKChiYXNlKSA9PiB7CiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICAgKiBAZXh0ZW5kcyB7SFRNTEVsZW1lbnR9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBjb25zdCBzdXBlckNsYXNzID0gRWxlbWVudE1peGluKGJhc2UpOwoKICAgICAgLy8gV29yayBhcm91bmQgZm9yIGNsb3N1cmUgYnVnICMxMjY5MzQ0NTguIFVzaW5nIGBzdXBlcmAgaW4gYSBwcm9wZXJ0eQogICAgICAvLyBnZXR0ZXIgZG9lcyBub3Qgd29yayBzbyBpbnN0ZWFkIHdlIHNlYXJjaCB0aGUgQmFzZSBwcm90b3R5cGUgZm9yIGFuCiAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIG9ic2VydmVkQXR0cmlidXRlcyBzbyB0aGF0IHdlIGNhbiBvdmVycmlkZSBhbmQgY2FsbAogICAgICAvLyB0aGUgYHN1cGVyYCBnZXR0ZXIuIE5vdGUsIHRoaXMgaXMgZG9uZSBvbmUgdGltZSBldmVyIGJlY2F1c2Ugd2UgYXNzdW1lCiAgICAgIC8vIHRoYXQgYEJhc2VgIGlzIGFsd2F5cyBjb21lcyBmcm9tIGBQb2x5bWVyLkxlZ2FjeUVsZW1lbnRNaXhuYC4KICAgICAgbGV0IG9ic2VydmVkQXR0cmlidXRlc0dldHRlciA9IGZpbmRPYnNlcnZlZEF0dHJpYnV0ZXNHZXR0ZXIoc3VwZXJDbGFzcyk7CgogICAgICAvKioKICAgICAgICogQHBvbHltZXIKICAgICAgICogQG1peGluQ2xhc3MKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRGlzYWJsZVVwZ3JhZGVNaXhpbn0KICAgICAgICovCiAgICAgIGNsYXNzIERpc2FibGVVcGdyYWRlQ2xhc3MgZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0gKi8KICAgICAgICAgIHRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZDsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZWRBdHRyaWJ1dGVzKCkgewogICAgICAgICAgcmV0dXJuIG9ic2VydmVkQXR0cmlidXRlc0dldHRlci5jYWxsKHRoaXMpLmNvbmNhdChESVNBQkxFRF9BVFRSKTsKICAgICAgICB9CgogICAgICAgIC8vIFByZXZlbnQgZWxlbWVudCBmcm9tIGluaXRpYWxpemluZyBwcm9wZXJ0aWVzIHdoZW4gaXQncyB1cGdyYWRlIGRpc2FibGVkLgogICAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgICBfaW5pdGlhbGl6ZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGUoRElTQUJMRURfQVRUUikpIHsKICAgICAgICAgICAgdGhpcy5fX2lzVXBncmFkZURpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUHJldmVudCBlbGVtZW50IGZyb20gZW5hYmxpbmcgcHJvcGVydGllcyB3aGVuIGl0J3MgdXBncmFkZSBkaXNhYmxlZC4KICAgICAgICAvLyBOb3JtYWxseSBvdmVycmlkaW5nIGNvbm5lY3RlZENhbGxiYWNrIHdvdWxkIGJlIGVub3VnaCwgYnV0IGRvbS0qIGVsZW1lbnRzCiAgICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICAgIF9lbmFibGVQcm9wZXJ0aWVzKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQpIHsKICAgICAgICAgICAgc3VwZXIuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIElmIHRoZSBlbGVtZW50IHN0YXJ0cyB1cGdyYWRlLWRpc2FibGVkIGFuZCBhIHByb3BlcnR5IGlzIHNldCBmb3IKICAgICAgICAvLyB3aGljaCBhbiBhY2Nlc3NvciBleGlzdHMsIHRoZSBkZWZhdWx0IHNob3VsZCBub3QgYmUgYXBwbGllZC4KICAgICAgICAvLyBUaGlzIGFkZGl0aW9uYWwgY2hlY2sgaXMgbmVlZGVkIGJlY2F1c2UgZGVmYXVsdHMgYXJlIGFwcGxpZWQgdmlhCiAgICAgICAgLy8gYF9pbml0aWFsaXplUHJvcGVydGllc2Agd2hpY2ggaXMgY2FsbGVkIGFmdGVyIGluaXRpYWwgcHJvcGVydGllcwogICAgICAgIC8vIGhhdmUgYmVlbiBzZXQgd2hlbiB0aGUgZWxlbWVudCBzdGFydHMgdXBncmFkZS1kaXNhYmxlZC4KICAgICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgICAgX2NhbkFwcGx5UHJvcGVydHlEZWZhdWx0KHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gc3VwZXIuX2NhbkFwcGx5UHJvcGVydHlEZWZhdWx0KHByb3BlcnR5KSAmJgogICAgICAgICAgICAhKHRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZCAmJiB0aGlzLl9pc1Byb3BlcnR5UGVuZGluZyhwcm9wZXJ0eSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQXR0cmlidXRlIG5hbWUuCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgVGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBUaGUgWE1MIG5hbWVzcGFjZSBmb3IgdGhlIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICAgIGlmIChuYW1lID09IERJU0FCTEVEX0FUVFIpIHsKICAgICAgICAgICAgLy8gV2hlbiBkaXNhYmxlLXVwZ3JhZGUgaXMgcmVtb3ZlZCwgaW50aWFsaXplIHByb3BlcnRpZXMgYW5kCiAgICAgICAgICAgIC8vIHByb3Zva2UgY29ubmVjdGVkQ2FsbGJhY2sgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBjb25uZWN0ZWQuCiAgICAgICAgICAgIGlmICh0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQgJiYgdmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgICAgICAgIHRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAgIGlmICh3cmFwKHRoaXMpLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKAogICAgICAgICAgICAgICAgbmFtZSwgb2xkLCB2YWx1ZSwgLyoqIEB0eXBlIHtudWxsfHN0cmluZ30gKi8gKG5hbWVzcGFjZSkpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gUHJldmVudCBlbGVtZW50IGZyb20gY29ubmVjdGluZyB3aGVuIGl0J3MgdXBncmFkZSBkaXNhYmxlZC4KICAgICAgICAvLyBUaGlzIHByZXZlbnRzIHVzZXIgY29kZSBpbiBgYXR0YWNoZWRgIGZyb20gYmVpbmcgY2FsbGVkLgogICAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIGlmICghdGhpcy5fX2lzVXBncmFkZURpc2FibGVkKSB7CiAgICAgICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBQcmV2ZW50IGVsZW1lbnQgZnJvbSBkaXNjb25uZWN0aW5nIHdoZW4gaXQncyB1cGdyYWRlIGRpc2FibGVkLgogICAgICAgIC8vIFRoaXMgYXZvaWRzIGFsbG93aW5nIHVzZXIgY29kZSBgZGV0YWNoZWRgIGZyb20gYmVpbmcgY2FsbGVkIHdpdGhvdXQgYQogICAgICAgIC8vIHBhaXJlZCBjYWxsIHRvIGBhdHRhY2hlZGAuCiAgICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgaWYgKCF0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQpIHsKICAgICAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICB9CgogICAgICByZXR1cm4gRGlzYWJsZVVwZ3JhZGVDbGFzczsKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgRElTQUJMRURfQVRUUiQxID0gJ2Rpc2FibGUtdXBncmFkZSc7CgogICAgbGV0IHN0eWxlSW50ZXJmYWNlID0gd2luZG93LlNoYWR5Q1NTOwoKICAgIC8qKgogICAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkgaW50ZW5kZWQgdG8gYmUKICAgICAqIGJhY2t3YXJkLWNvbXBhdGlibGUgdG8gdGhlIGdyZWF0ZXN0IGV4dGVudCBwb3NzaWJsZSB3aXRoIHRoZSBBUEkKICAgICAqIGZvdW5kIG9uIHRoZSBQb2x5bWVyIDEueCBgUG9seW1lci5CYXNlYCBwcm90b3R5cGUgYXBwbGllZCB0byBhbGwgZWxlbWVudHMKICAgICAqIGRlZmluZWQgdXNpbmcgdGhlIGBQb2x5bWVyKHsuLi59KWAgZnVuY3Rpb24uCiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAYXBwbGllc01peGluIEVsZW1lbnRNaXhpbgogICAgICogQGFwcGxpZXNNaXhpbiBHZXN0dXJlRXZlbnRMaXN0ZW5lcnMKICAgICAqIEBhcHBsaWVzTWl4aW4gRGlyTWl4aW4KICAgICAqIEBwcm9wZXJ0eSBpc0F0dGFjaGVkIHtib29sZWFufSBTZXQgdG8gYHRydWVgIGluIHRoaXMgZWxlbWVudCdzCiAgICAgKiAgIGBjb25uZWN0ZWRDYWxsYmFja2AgYW5kIGBmYWxzZWAgaW4gYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAgICogQHN1bW1hcnkgRWxlbWVudCBjbGFzcyBtaXhpbiB0aGF0IHByb3ZpZGVzIFBvbHltZXIncyAibGVnYWN5IiBBUEkKICAgICAqLwogICAgY29uc3QgTGVnYWN5RWxlbWVudE1peGluID0gZGVkdXBpbmdNaXhpbigoYmFzZSkgPT4gewoKICAgICAgLy8gVE9ETyhrc2NoYWFmKTogTm90ZSwgdGhlIGBAaW1wbGVtZW50cyB7UG9seW1lcl9EaXJNaXhpbn1gIGlzIHJlcXVpcmVkIGhlcmUKICAgICAgLy8gKHJhdGhlciB0aGFuIG9uIGxlZ2FjeUVsZW1lbnRCYXNlKSBmb3IgdW5rbm93biByZWFzb25zLgogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0VsZW1lbnRNaXhpbn0KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfR2VzdHVyZUV2ZW50TGlzdGVuZXJzfQogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9EaXJNaXhpbn0KICAgICAgICogQGV4dGVuZHMge0hUTUxFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgR2VzdHVyZXNFbGVtZW50ID0gR2VzdHVyZUV2ZW50TGlzdGVuZXJzKEVsZW1lbnRNaXhpbihiYXNlKSk7CgogICAgICAvLyBOb3RlLCB0aGUgRGlyTWl4aW4gZG9lcyBub3RoaW5nIGlmIGNzcyBpcyBidWlsdCBzbyBhdm9pZCBpbmNsdWRpbmcgaXQKICAgICAgLy8gaW4gdGhhdCBjYXNlLgoKICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7R2VzdHVyZXNFbGVtZW50fQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgY29uc3QgbGVnYWN5RWxlbWVudEJhc2UgPSBidWlsdENTUyA/IEdlc3R1cmVzRWxlbWVudCA6CiAgICAgICAgRGlyTWl4aW4oR2VzdHVyZXNFbGVtZW50KTsKCiAgICAgIGNvbnN0IG9ic2VydmVkQXR0cmlidXRlc0dldHRlciA9IGZpbmRPYnNlcnZlZEF0dHJpYnV0ZXNHZXR0ZXIobGVnYWN5RWxlbWVudEJhc2UpOwoKICAgICAgLyoqCiAgICAgICAqIE1hcCBvZiBzaW1wbGUgbmFtZXMgdG8gdG91Y2ggYWN0aW9uIG5hbWVzCiAgICAgICAqIEBkaWN0CiAgICAgICAqLwogICAgICBjb25zdCBESVJFQ1RJT05fTUFQID0gewogICAgICAgICd4JzogJ3Bhbi14JywKICAgICAgICAneSc6ICdwYW4teScsCiAgICAgICAgJ25vbmUnOiAnbm9uZScsCiAgICAgICAgJ2FsbCc6ICdhdXRvJwogICAgICB9OwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBleHRlbmRzIHtsZWdhY3lFbGVtZW50QmFzZX0KICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfTGVnYWN5RWxlbWVudE1peGlufQogICAgICAgKiBAdW5yZXN0cmljdGVkCiAgICAgICAqLwogICAgICBjbGFzcyBMZWdhY3lFbGVtZW50IGV4dGVuZHMgbGVnYWN5RWxlbWVudEJhc2UgewoKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW59ICovCiAgICAgICAgICB0aGlzLmlzQXR0YWNoZWQ7CiAgICAgICAgICAvKiogQHR5cGUgez9XZWFrTWFwPCFFbGVtZW50LCAhT2JqZWN0PHN0cmluZywgIUZ1bmN0aW9uPj59ICovCiAgICAgICAgICB0aGlzLl9fYm91bmRMaXN0ZW5lcnM7CiAgICAgICAgICAvKiogQHR5cGUgez9PYmplY3Q8c3RyaW5nLCA/RnVuY3Rpb24+fSAqLwogICAgICAgICAgdGhpcy5fZGVib3VuY2VyczsKICAgICAgICAgIC8vIE5PVEU6IElubGluZWQgZm9yIHBlcmYgZnJvbSB2ZXJzaW9uIG9mIERpc2FibGVVcGdyYWRlTWl4aW4uCiAgICAgICAgICAvKiogQHR5cGUge2Jvb2xlYW58dW5kZWZpbmVkfSAqLwogICAgICAgICAgdGhpcy5fX2lzVXBncmFkZURpc2FibGVkOwogICAgICAgICAgLyoqIEB0eXBlIHtib29sZWFufHVuZGVmaW5lZH0gKi8KICAgICAgICAgIHRoaXMuX19uZWVkc0F0dHJpYnV0ZXNBdENvbm5lY3RlZDsKICAgICAgICAgIC8qKiBAdHlwZSB7Ym9vbGVhbnx1bmRlZmluZWR9ICovCiAgICAgICAgICB0aGlzLl9sZWdhY3lGb3JjZU9ic2VydmVkQXR0cmlidXRlczsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEZvcndhcmRzIGBpbXBvcnRNZXRhYCBmcm9tIHRoZSBwcm90b3R5cGUgKGkuZS4gZnJvbSB0aGUgaW5mbyBvYmplY3QKICAgICAgICAgKiBwYXNzZWQgdG8gYFBvbHltZXIoey4uLn0pYCkgdG8gdGhlIHN0YXRpYyBBUEkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBUaGUgYGltcG9ydC5tZXRhYCBvYmplY3Qgc2V0IG9uIHRoZSBwcm90b3R5cGUKICAgICAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBgdGhpc2AgaXMgYWx3YXlzIGluIHRoZSBpbnN0YW5jZSBpbgogICAgICAgICAqICBjbG9zdXJlIGZvciBzb21lIHJlYXNvbiBldmVuIGluIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIGNsYXNzCiAgICAgICAgICogQG5vY29sbGFwc2UKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZ2V0IGltcG9ydE1ldGEoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5wcm90b3R5cGUuaW1wb3J0TWV0YTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIExlZ2FjeSBjYWxsYmFjayBjYWxsZWQgZHVyaW5nIHRoZSBgY29uc3RydWN0b3JgLCBmb3Igb3ZlcnJpZGluZwogICAgICAgICAqIGJ5IHRoZSB1c2VyLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlZCgpIHt9CgogICAgICAgIC8qKgogICAgICAgICAqIFByb2Nlc3NlcyBhbiBhdHRyaWJ1dGUgcmVhY3Rpb24gd2hlbiB0aGUgYGxlZ2FjeU5vT2JzZXJ2ZWRBdHRyaWJ1dGVzYAogICAgICAgICAqIHNldHRpbmcgaXMgaW4gdXNlLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlIHRoYXQgY2hhbmdlZAogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIF9fYXR0cmlidXRlUmVhY3Rpb24obmFtZSwgb2xkLCB2YWx1ZSkgewogICAgICAgICAgaWYgKCh0aGlzLl9fZGF0YUF0dHJpYnV0ZXMgJiYgdGhpcy5fX2RhdGFBdHRyaWJ1dGVzW25hbWVdKSB8fCBuYW1lID09PSBESVNBQkxFRF9BVFRSJDEpIHsKICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkLCB2YWx1ZSwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiBhbiBhdHRyaWJ1dGUuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBjaGFuZ2UuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd8bnVtYmVyfGJvb2xlYW58IVRydXN0ZWRIVE1MfCFUcnVzdGVkU2NyaXB0VVJMfCFUcnVzdGVkVVJMfSB2YWx1ZSBUaGUgbmV3IGF0dHJpYnV0ZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBzZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpIHsKICAgICAgICAgIGlmIChsZWdhY3lOb09ic2VydmVkQXR0cmlidXRlcyAmJiAhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgLy8gdmFsdWUgY29lcmNlZCB0byBTdHJpbmcgZm9yIGNsb3N1cmUncyBiZW5lZml0CiAgICAgICAgICAgIHRoaXMuX19hdHRyaWJ1dGVSZWFjdGlvbihuYW1lLCBvbGRWYWx1ZSwgU3RyaW5nKHZhbHVlKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdXBlci5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBhdHRyaWJ1dGUuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byByZW1vdmUuCiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlQXR0cmlidXRlKG5hbWUpIHsKICAgICAgICAgIGlmIChsZWdhY3lOb09ic2VydmVkQXR0cmlidXRlcyAmJiAhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgICAgc3VwZXIucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgICB0aGlzLl9fYXR0cmlidXRlUmVhY3Rpb24obmFtZSwgb2xkVmFsdWUsIG51bGwpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc3VwZXIucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gTk9URTogSW5saW5lZCBmb3IgcGVyZiBmcm9tIHZlcnNpb24gb2YgRGlzYWJsZVVwZ3JhZGVNaXhpbi4KICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsKICAgICAgICAgIGlmIChsZWdhY3lOb09ic2VydmVkQXR0cmlidXRlcyAmJiAhdGhpcy5wcm90b3R5cGUuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgIC8vIEVuc3VyZSB0aGlzIGVsZW1lbnQgaXMgcHJvcGVydHkgcmVnaXN0ZXJlZCB3aXRoIHRoZSB0ZWxlbWV0cnkgc3lzdGVtLgogICAgICAgICAgICBpZiAoIXRoaXMuaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19vYnNlcnZlZEF0dHJpYnV0ZXMnLCB0aGlzKSkpIHsKICAgICAgICAgICAgICB0aGlzLl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzID0gW107CiAgICAgICAgICAgICAgcmVnaXN0ZXIodGhpcy5wcm90b3R5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9fb2JzZXJ2ZWRBdHRyaWJ1dGVzOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVkQXR0cmlidXRlc0dldHRlci5jYWxsKHRoaXMpLmNvbmNhdChESVNBQkxFRF9BVFRSJDEpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gTk9URTogSW5saW5lZCBmb3IgcGVyZiBmcm9tIHZlcnNpb24gb2YgRGlzYWJsZVVwZ3JhZGVNaXhpbi4KICAgICAgICAvLyBQcmV2ZW50IGVsZW1lbnQgZnJvbSBlbmFibGluZyBwcm9wZXJ0aWVzIHdoZW4gaXQncyB1cGdyYWRlIGRpc2FibGVkLgogICAgICAgIC8vIE5vcm1hbGx5IG92ZXJyaWRpbmcgY29ubmVjdGVkQ2FsbGJhY2sgd291bGQgYmUgZW5vdWdoLCBidXQgZG9tLSogZWxlbWVudHMKICAgICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgICAgX2VuYWJsZVByb3BlcnRpZXMoKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZCkgewogICAgICAgICAgICBzdXBlci5fZW5hYmxlUHJvcGVydGllcygpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gTk9URTogSW5saW5lZCBmb3IgcGVyZiBmcm9tIHZlcnNpb24gb2YgRGlzYWJsZVVwZ3JhZGVNaXhpbi4KICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBzdGFydHMgdXBncmFkZS1kaXNhYmxlZCBhbmQgYSBwcm9wZXJ0eSBpcyBzZXQgZm9yCiAgICAgICAgLy8gd2hpY2ggYW4gYWNjZXNzb3IgZXhpc3RzLCB0aGUgZGVmYXVsdCBzaG91bGQgbm90IGJlIGFwcGxpZWQuCiAgICAgICAgLy8gVGhpcyBhZGRpdGlvbmFsIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIGRlZmF1bHRzIGFyZSBhcHBsaWVkIHZpYQogICAgICAgIC8vIGBfaW5pdGlhbGl6ZVByb3BlcnRpZXNgIHdoaWNoIGlzIGNhbGxlZCBhZnRlciBpbml0aWFsIHByb3BlcnRpZXMKICAgICAgICAvLyBoYXZlIGJlZW4gc2V0IHdoZW4gdGhlIGVsZW1lbnQgc3RhcnRzIHVwZ3JhZGUtZGlzYWJsZWQuCiAgICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICAgIF9jYW5BcHBseVByb3BlcnR5RGVmYXVsdChwcm9wZXJ0eSkgewogICAgICAgICAgcmV0dXJuIHN1cGVyLl9jYW5BcHBseVByb3BlcnR5RGVmYXVsdChwcm9wZXJ0eSkgJiYKICAgICAgICAgICAgISh0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQgJiYgdGhpcy5faXNQcm9wZXJ0eVBlbmRpbmcocHJvcGVydHkpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGBjb25uZWN0ZWRDYWxsYmFja2AKICAgICAgICAgKiB3aGljaCBhZGRzIFBvbHltZXIgbGVnYWN5IEFQSSdzIGBhdHRhY2hlZGAgbWV0aG9kLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICBpZiAodGhpcy5fX25lZWRzQXR0cmlidXRlc0F0Q29ubmVjdGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3Rha2VBdHRyaWJ1dGVzKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBOT1RFOiBJbmxpbmVkIGZvciBwZXJmIGZyb20gdmVyc2lvbiBvZiBEaXNhYmxlVXBncmFkZU1peGluLgogICAgICAgICAgaWYgKCF0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQpIHsKICAgICAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgICAgdGhpcy5pc0F0dGFjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5hdHRhY2hlZCgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGF0dGFjaGVkKCkge30KCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYGRpc2Nvbm5lY3RlZENhbGxiYWNrYAogICAgICAgICAqIHdoaWNoIGFkZHMgUG9seW1lciBsZWdhY3kgQVBJJ3MgYGRldGFjaGVkYCBtZXRob2QuCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBkaXNjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgIC8vIE5PVEU6IElubGluZWQgZm9yIHBlcmYgZnJvbSB2ZXJzaW9uIG9mIERpc2FibGVVcGdyYWRlTWl4aW4uCiAgICAgICAgICBpZiAoIXRoaXMuX19pc1VwZ3JhZGVEaXNhYmxlZCkgewogICAgICAgICAgICBzdXBlci5kaXNjb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgICB0aGlzLmlzQXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5kZXRhY2hlZCgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTGVnYWN5IGNhbGxiYWNrIGNhbGxlZCBkdXJpbmcgYGRpc2Nvbm5lY3RlZENhbGxiYWNrYCwgZm9yIG92ZXJyaWRpbmcKICAgICAgICAgKiBieSB0aGUgdXNlci4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRldGFjaGVkKCkge30KCiAgICAgICAgLyoqCiAgICAgICAgICogUHJvdmlkZXMgYW4gb3ZlcnJpZGUgaW1wbGVtZW50YXRpb24gb2YgYGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFja2AKICAgICAgICAgKiB3aGljaCBhZGRzIHRoZSBQb2x5bWVyIGxlZ2FjeSBBUEkncyBgYXR0cmlidXRlQ2hhbmdlZGAgbWV0aG9kLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlLgogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCB2YWx1ZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSB2YWx1ZSBDdXJyZW50IHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IG5hbWVzcGFjZSBBdHRyaWJ1dGUgbmFtZXNwYWNlLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgaWYgKG9sZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgLy8gTk9URTogSW5saW5lZCBmb3IgcGVyZiBmcm9tIHZlcnNpb24gb2YgRGlzYWJsZVVwZ3JhZGVNaXhpbi4KICAgICAgICAgICAgaWYgKG5hbWUgPT0gRElTQUJMRURfQVRUUiQxKSB7CiAgICAgICAgICAgICAgLy8gV2hlbiBkaXNhYmxlLXVwZ3JhZGUgaXMgcmVtb3ZlZCwgaW50aWFsaXplIHByb3BlcnRpZXMgYW5kCiAgICAgICAgICAgICAgLy8gcHJvdm9rZSBjb25uZWN0ZWRDYWxsYmFjayBpZiB0aGUgZWxlbWVudCBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KICAgICAgICAgICAgICBpZiAodGhpcy5fX2lzVXBncmFkZURpc2FibGVkICYmIHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVQcm9wZXJ0aWVzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9faXNVcGdyYWRlRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh3cmFwKHRoaXMpLmlzQ29ubmVjdGVkKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZCwgdmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVDaGFuZ2VkKG5hbWUsIG9sZCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBMZWdhY3kgY2FsbGJhY2sgY2FsbGVkIGR1cmluZyBgYXR0cmlidXRlQ2hhbmdlZENoYWxsYmFja2AsIGZvciBvdmVycmlkaW5nCiAgICAgICAgICogYnkgdGhlIHVzZXIuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIHZhbHVlIG9mIGF0dHJpYnV0ZS4KICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgYXR0cmlidXRlLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgYXR0cmlidXRlQ2hhbmdlZChuYW1lLCBvbGQsIHZhbHVlKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIGltcGxlbWVudGF0aW9uIHRvCiAgICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGNsYXNzIGluaXRpYWxpemF0aW9uIHZpYSB0aGUgYF9yZWdpc3RlcmVkYCBjYWxsYmFjay4KICAgICAgICAgKiBUaGlzIGlzIGNhbGxlZCBvbmx5IHdoZW4gdGhlIGZpcnN0IGluc3RhbmNlIG9mIHRoZSBlbGVtZW50IGlzIGNyZWF0ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfQogICAgICAgICAqLwogICAgICAgIF9pbml0aWFsaXplUHJvcGVydGllcygpIHsKICAgICAgICAgIC8vIE5PVEU6IElubGluZWQgZm9yIHBlcmYgZnJvbSB2ZXJzaW9uIG9mIERpc2FibGVVcGdyYWRlTWl4aW4uCiAgICAgICAgICAvLyBPbmx5IGF1dG8tdXNlIGRpc2FibGUtdXBncmFkZSBpZiBsZWdhY3lPcHRpbWl6YXRpb25zIGlzIHNldC4KICAgICAgICAgIGlmIChsZWdhY3lPcHRpbWl6YXRpb25zICYmIHRoaXMuaGFzQXR0cmlidXRlKERJU0FCTEVEX0FUVFIkMSkpIHsKICAgICAgICAgICAgdGhpcy5fX2lzVXBncmFkZURpc2FibGVkID0gdHJ1ZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKTsKICAgICAgICAgICAgaWYgKCFwcm90by5oYXNPd25Qcm9wZXJ0eShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdfX2hhc1JlZ2lzdGVyRmluaXNoZWQnLCBwcm90bykpKSB7CiAgICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAgIC8vIGJhY2tzdG9wIGluIGNhc2UgdGhlIGBfcmVnaXN0ZXJlZGAgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc2V0IHRoaXMKICAgICAgICAgICAgICBwcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1cGVyLl9pbml0aWFsaXplUHJvcGVydGllcygpOwogICAgICAgICAgICB0aGlzLnJvb3QgPSAvKiogQHR5cGUge0hUTUxFbGVtZW50fSAqLyh0aGlzKTsKICAgICAgICAgICAgdGhpcy5jcmVhdGVkKCk7CiAgICAgICAgICAgIC8vIFB1bGwgYWxsIGF0dHJpYnV0ZSB2YWx1ZXMgMXggaWYgYGxlZ2FjeU5vT2JzZXJ2ZWRBdHRyaWJ1dGVzYCBpcyBzZXQuCiAgICAgICAgICAgIGlmIChsZWdhY3lOb09ic2VydmVkQXR0cmlidXRlcyAmJiAhdGhpcy5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICBpZiAodGhpcy5oYXNBdHRyaWJ1dGVzKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Rha2VBdHRyaWJ1dGVzKCk7CiAgICAgICAgICAgICAgLy8gRWxlbWVudCBjcmVhdGVkIGZyb20gc2NyYXRjaCBvciBwYXJzZXIgZ2VuZXJhdGVkCiAgICAgICAgICAgICAgfSBlbHNlIGlmICghdGhpcy5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9fbmVlZHNBdHRyaWJ1dGVzQXRDb25uZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFbnN1cmUgbGlzdGVuZXJzIGFyZSBhcHBsaWVkIGltbWVkaWF0ZWx5IHNvIHRoYXQgdGhleSBhcmUKICAgICAgICAgICAgLy8gYWRkZWQgYmVmb3JlIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycy4gVGhpcyBhbGxvd3MgYW4gZWxlbWVudCB0bwogICAgICAgICAgICAvLyBkZWNvcmF0ZSBpdHNlbGYgdmlhIGFuIGV2ZW50IHByaW9yIHRvIGFueSBkZWNsYXJhdGl2ZSBsaXN0ZW5lcnMKICAgICAgICAgICAgLy8gc2VlaW5nIHRoZSBldmVudC4gTm90ZSwgdGhpcyBlbnN1cmVzIGNvbXBhdGliaWxpdHkgd2l0aCAxLnggb3JkZXJpbmcuCiAgICAgICAgICAgIHRoaXMuX2FwcGx5TGlzdGVuZXJzKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBfdGFrZUF0dHJpYnV0ZXMoKSB7CiAgICAgICAgICBjb25zdCBhID0gdGhpcy5hdHRyaWJ1dGVzOwogICAgICAgICAgZm9yIChsZXQgaT0wLCBsPWEubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBhW2ldOwogICAgICAgICAgICB0aGlzLl9fYXR0cmlidXRlUmVhY3Rpb24oYXR0ci5uYW1lLCBudWxsLCBhdHRyLnZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gYW4gZWxlbWVudCBpcyBpbml0aWFsaXppbmcuCiAgICAgICAgICogVXNlcnMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIHBlcmZvcm0gY2xhc3MgcmVnaXN0cmF0aW9uIHRpbWUKICAgICAgICAgKiB3b3JrLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGVuc3VyZSB0aGUgd29yayBpcyBwZXJmb3JtZWQKICAgICAgICAgKiBvbmx5IG9uY2UgZm9yIHRoZSBjbGFzcy4KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfcmVnaXN0ZXJlZCgpIHt9CgogICAgICAgIC8qKgogICAgICAgICAqIE92ZXJyaWRlcyB0aGUgZGVmYXVsdCBgUG9seW1lci5Qcm9wZXJ0eUVmZmVjdHNgIGltcGxlbWVudGF0aW9uIHRvCiAgICAgICAgICogYWRkIHN1cHBvcnQgZm9yIGluc3RhbGxpbmcgYGhvc3RBdHRyaWJ1dGVzYCBhbmQgYGxpc3RlbmVyc2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlcygpOwogICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZXMgYW4gZWxlbWVudCBoYXMgcmVxdWlyZWQgYXR0cmlidXRlcy4gQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQKICAgICAgICAgKiBpcyBiZWluZyByZWFkaWVkIHZpYSBgcmVhZHlgLiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdG8gc2V0IHRoZQogICAgICAgICAqIGVsZW1lbnQncyByZXF1aXJlZCBhdHRyaWJ1dGVzLiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGJlIHN1cmUKICAgICAgICAgKiB0byBjaGVjayBhbmQgbm90IG92ZXJyaWRlIGV4aXN0aW5nIGF0dHJpYnV0ZXMgYWRkZWQgYnkKICAgICAgICAgKiB0aGUgdXNlciBvZiB0aGUgZWxlbWVudC4gVHlwaWNhbGx5LCBzZXR0aW5nIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGxlZnQKICAgICAgICAgKiB0byB0aGUgZWxlbWVudCB1c2VyIGFuZCBub3QgZG9uZSBoZXJlOyByZWFzb25hYmxlIGV4Y2VwdGlvbnMgaW5jbHVkZQogICAgICAgICAqIHNldHRpbmcgYXJpYSByb2xlcyBhbmQgZm9jdXNhYmlsaXR5LgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9lbnN1cmVBdHRyaWJ1dGVzKCkge30KCiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBlbGVtZW50IGV2ZW50IGxpc3RlbmVycy4gQ2FsbGVkIHdoZW4gdGhlIGVsZW1lbnQKICAgICAgICAgKiBpcyBiZWluZyByZWFkaWVkIHZpYSBgcmVhZHlgLiBVc2VycyBzaG91bGQgb3ZlcnJpZGUgdG8KICAgICAgICAgKiBhZGQgYW55IHJlcXVpcmVkIGVsZW1lbnQgZXZlbnQgbGlzdGVuZXJzLgogICAgICAgICAqIEluIHBlcmZvcm1hbmNlIGNyaXRpY2FsIGVsZW1lbnRzLCB0aGUgd29yayBkb25lIGhlcmUgc2hvdWxkIGJlIGtlcHQKICAgICAgICAgKiB0byBhIG1pbmltdW0gc2luY2UgaXQgaXMgZG9uZSBiZWZvcmUgdGhlIGVsZW1lbnQgaXMgcmVuZGVyZWQuIEluCiAgICAgICAgICogdGhlc2UgZWxlbWVudHMsIGNvbnNpZGVyIGFkZGluZyBsaXN0ZW5lcnMgYXN5bmNocm9ub3VzbHkgc28gYXMgbm90IHRvCiAgICAgICAgICogYmxvY2sgcmVuZGVyLgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9hcHBseUxpc3RlbmVycygpIHt9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgdHlwZWQgSmF2YVNjcmlwdCB2YWx1ZSB0byBhIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuIFRvIGN1c3RvbWl6ZQogICAgICAgICAqIGhvdyBwcm9wZXJ0aWVzIGFyZSBzZXJpYWxpemVkIHRvIGF0dHJpYnV0ZXMgZm9yIGF0dHJpYnV0ZSBiaW5kaW5ncyBhbmQKICAgICAgICAgKiBgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlYCBwcm9wZXJ0aWVzIGFzIHdlbGwgYXMgdGhpcyBtZXRob2QsIG92ZXJyaWRlCiAgICAgICAgICogdGhlIGBfc2VyaWFsaXplVmFsdWVgIG1ldGhvZCBwcm92aWRlZCBieSBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIGRlc2VyaWFsaXplCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nIHwgdW5kZWZpbmVkfSBTZXJpYWxpemVkIHZhbHVlCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fc2VyaWFsaXplVmFsdWUodmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVydHMgYSBzdHJpbmcgdG8gYSB0eXBlZCBKYXZhU2NyaXB0IHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4gIFRvIGN1c3RvbWl6ZQogICAgICAgICAqIGhvdyBhdHRyaWJ1dGVzIGFyZSBkZXNlcmlhbGl6ZWQgdG8gcHJvcGVydGllcyBmb3IgaW4KICAgICAgICAgKiBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCwgb3ZlcnJpZGUgYF9kZXNlcmlhbGl6ZVZhbHVlYCBtZXRob2QKICAgICAgICAgKiBwcm92aWRlZCBieSBgUG9seW1lci5Qcm9wZXJ0eUFjY2Vzc29yc2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdmFsdWUgU3RyaW5nIHRvIGRlc2VyaWFsaXplCiAgICAgICAgICogQHBhcmFtIHsqfSB0eXBlIFR5cGUgdG8gZGVzZXJpYWxpemUgdGhlIHN0cmluZyB0bwogICAgICAgICAqIEByZXR1cm4geyp9IFJldHVybnMgdGhlIGRlc2VyaWFsaXplZCB2YWx1ZSBpbiB0aGUgYHR5cGVgIGdpdmVuLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGRlc2VyaWFsaXplKHZhbHVlLCB0eXBlKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fZGVzZXJpYWxpemVWYWx1ZSh2YWx1ZSwgdHlwZSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZXJpYWxpemVzIGEgcHJvcGVydHkgdG8gaXRzIGFzc29jaWF0ZWQgYXR0cmlidXRlLgogICAgICAgICAqCiAgICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBhcyBiYWNrd2FyZC1jb21wYXRpYmxlIGxlZ2FjeSBBUEkKICAgICAgICAgKiBvbmx5LiAgSXQgaXMgbm90IGRpcmVjdGx5IGNhbGxlZCBieSBhbnkgUG9seW1lciBmZWF0dXJlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lIHRvIHJlZmxlY3QuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBhdHRyaWJ1dGUgQXR0cmlidXRlIG5hbWUgdG8gcmVmbGVjdC4KICAgICAgICAgKiBAcGFyYW0geyo9fSB2YWx1ZSBQcm9wZXJ0eSB2YWx1ZSB0byByZWZsZWN0LgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgcmVmbGVjdFByb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpIHsKICAgICAgICAgIHRoaXMuX3Byb3BlcnR5VG9BdHRyaWJ1dGUocHJvcGVydHksIGF0dHJpYnV0ZSwgdmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIHR5cGVkIHZhbHVlIHRvIGFuIEhUTUwgYXR0cmlidXRlIG9uIGEgbm9kZS4KICAgICAgICAgKgogICAgICAgICAqIE5vdGUgdGhpcyBtZXRob2QgaXMgcHJvdmlkZWQgYXMgYmFja3dhcmQtY29tcGF0aWJsZSBsZWdhY3kgQVBJCiAgICAgICAgICogb25seS4gIEl0IGlzIG5vdCBkaXJlY3RseSBjYWxsZWQgYnkgYW55IFBvbHltZXIgZmVhdHVyZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIHRvIHNlcmlhbGl6ZS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlIEF0dHJpYnV0ZSBuYW1lIHRvIHNlcmlhbGl6ZSB0by4KICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IG5vZGUgRWxlbWVudCB0byBzZXQgYXR0cmlidXRlIHRvLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2VyaWFsaXplVmFsdWVUb0F0dHJpYnV0ZSh2YWx1ZSwgYXR0cmlidXRlLCBub2RlKSB7CiAgICAgICAgICB0aGlzLl92YWx1ZVRvTm9kZUF0dHJpYnV0ZSgvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpLCB2YWx1ZSwgYXR0cmlidXRlKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvcGllcyBvd24gcHJvcGVydGllcyAoaW5jbHVkaW5nIGFjY2Vzc29yIGRlc2NyaXB0b3JzKSBmcm9tIGEgc291cmNlCiAgICAgICAgICogb2JqZWN0IHRvIGEgdGFyZ2V0IG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBwcm90b3R5cGUgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAgICogQHBhcmFtIHtPYmplY3R9IGFwaSBTb3VyY2Ugb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogICAgICAgICAqIEByZXR1cm4ge09iamVjdH0gcHJvdG90eXBlIG9iamVjdCB0aGF0IHdhcyBwYXNzZWQgYXMgZmlyc3QgYXJndW1lbnQuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZXh0ZW5kKHByb3RvdHlwZSwgYXBpKSB7CiAgICAgICAgICBpZiAoIShwcm90b3R5cGUgJiYgYXBpKSkgewogICAgICAgICAgICByZXR1cm4gcHJvdG90eXBlIHx8IGFwaTsKICAgICAgICAgIH0KICAgICAgICAgIGxldCBuJCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGFwaSk7CiAgICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPG4kLmxlbmd0aCkgJiYgKG49biRbaV0pOyBpKyspIHsKICAgICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihhcGksIG4pOwogICAgICAgICAgICBpZiAocGQpIHsKICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkocHJvdG90eXBlLCBuLCBwZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb3BpZXMgcHJvcHMgZnJvbSBhIHNvdXJjZSBvYmplY3QgdG8gYSB0YXJnZXQgb2JqZWN0LgogICAgICAgICAqCiAgICAgICAgICogTm90ZSwgdGhpcyBtZXRob2QgdXNlcyBhIHNpbXBsZSBgZm9yLi4uaW5gIHN0cmF0ZWd5IGZvciBlbnVtZXJhdGluZwogICAgICAgICAqIHByb3BlcnRpZXMuICBUbyBlbnN1cmUgb25seSBgb3duUHJvcGVydGllc2AgYXJlIGNvcGllZCBmcm9tIHNvdXJjZQogICAgICAgICAqIHRvIHRhcmdldCBhbmQgdGhhdCBhY2Nlc3NvciBpbXBsZW1lbnRhdGlvbnMgYXJlIGNvcGllZCwgdXNlIGBleHRlbmRgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSB0YXJnZXQgVGFyZ2V0IG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBzb3VyY2UgU291cmNlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgZnJvbS4KICAgICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBUYXJnZXQgb2JqZWN0IHRoYXQgd2FzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudC4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBtaXhpbih0YXJnZXQsIHNvdXJjZSkgewogICAgICAgICAgZm9yIChsZXQgaSBpbiBzb3VyY2UpIHsKICAgICAgICAgICAgdGFyZ2V0W2ldID0gc291cmNlW2ldOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHByb3RvdHlwZSBvZiBhbiBvYmplY3QuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkIGFzIGJhY2t3YXJkLWNvbXBhdGlibGUgbGVnYWN5IEFQSQogICAgICAgICAqIG9ubHkuICBJdCBpcyBub3QgZGlyZWN0bHkgY2FsbGVkIGJ5IGFueSBQb2x5bWVyIGZlYXR1cmVzLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCBvbiB3aGljaCB0byBzZXQgdGhlIHByb3RvdHlwZS4KICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gcHJvdG90eXBlIFRoZSBwcm90b3R5cGUgdGhhdCB3aWxsIGJlIHNldCBvbiB0aGUgZ2l2ZW4KICAgICAgICAgKiBgb2JqZWN0YC4KICAgICAgICAgKiBAcmV0dXJuIHtPYmplY3R9IFJldHVybnMgdGhlIGdpdmVuIGBvYmplY3RgIHdpdGggaXRzIHByb3RvdHlwZSBzZXQKICAgICAgICAgKiB0byB0aGUgZ2l2ZW4gYHByb3RvdHlwZWAgb2JqZWN0LgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGNoYWluT2JqZWN0KG9iamVjdCwgcHJvdG90eXBlKSB7CiAgICAgICAgICBpZiAob2JqZWN0ICYmIHByb3RvdHlwZSAmJiBvYmplY3QgIT09IHByb3RvdHlwZSkgewogICAgICAgICAgICBvYmplY3QuX19wcm90b19fID0gcHJvdG90eXBlOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIG9iamVjdDsKICAgICAgICB9CgogICAgICAgIC8qICoqKiogQmVnaW4gVGVtcGxhdGUgKioqKiAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxscyBgaW1wb3J0Tm9kZWAgb24gdGhlIGBjb250ZW50YCBvZiB0aGUgYHRlbXBsYXRlYCBzcGVjaWZpZWQgYW5kCiAgICAgICAgICogcmV0dXJucyBhIGRvY3VtZW50IGZyYWdtZW50IGNvbnRhaW5pbmcgdGhlIGltcG9ydGVkIGNvbnRlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0hUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIEhUTUwgdGVtcGxhdGUgZWxlbWVudCB0byBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHshRG9jdW1lbnRGcmFnbWVudH0gRG9jdW1lbnQgZnJhZ21lbnQgY29udGFpbmluZyB0aGUgaW1wb3J0ZWQKICAgICAgICAgKiAgIHRlbXBsYXRlIGNvbnRlbnQuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30gZ28vbWlzc2luZ2ZucHJvcHMKICAgICAgICAgKi8KICAgICAgICBpbnN0YW5jZVRlbXBsYXRlKHRlbXBsYXRlKSB7CiAgICAgICAgICBsZXQgY29udGVudCA9IHRoaXMuY29uc3RydWN0b3IuX2NvbnRlbnRGb3JUZW1wbGF0ZSh0ZW1wbGF0ZSk7CiAgICAgICAgICBsZXQgZG9tID0gLyoqIEB0eXBlIHshRG9jdW1lbnRGcmFnbWVudH0gKi8KICAgICAgICAgICAgKGRvY3VtZW50LmltcG9ydE5vZGUoY29udGVudCwgdHJ1ZSkpOwogICAgICAgICAgcmV0dXJuIGRvbTsKICAgICAgICB9CgogICAgICAgIC8qICoqKiogQmVnaW4gRXZlbnRzICoqKiogKi8KCgoKICAgICAgICAvKioKICAgICAgICAgKiBEaXNwYXRjaGVzIGEgY3VzdG9tIGV2ZW50IHdpdGggYW4gb3B0aW9uYWwgZGV0YWlsIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGUgTmFtZSBvZiBldmVudCB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7Kj19IGRldGFpbCBEZXRhaWwgdmFsdWUgY29udGFpbmluZyBldmVudC1zcGVjaWZpYwogICAgICAgICAqICAgcGF5bG9hZC4KICAgICAgICAgKiBAcGFyYW0ge3sgYnViYmxlczogKGJvb2xlYW58dW5kZWZpbmVkKSwgY2FuY2VsYWJsZTogKGJvb2xlYW58dW5kZWZpbmVkKSwKICAgICAgICAgKiAgICAgY29tcG9zZWQ6IChib29sZWFufHVuZGVmaW5lZCkgfT19CiAgICAgICAgICogIG9wdGlvbnMgT2JqZWN0IHNwZWNpZnlpbmcgb3B0aW9ucy4gIFRoZXNlIG1heSBpbmNsdWRlOgogICAgICAgICAqICBgYnViYmxlc2AgKGJvb2xlYW4sIGRlZmF1bHRzIHRvIGB0cnVlYCksCiAgICAgICAgICogIGBjYW5jZWxhYmxlYCAoYm9vbGVhbiwgZGVmYXVsdHMgdG8gZmFsc2UpLCBhbmQKICAgICAgICAgKiAgYG5vZGVgIG9uIHdoaWNoIHRvIGZpcmUgdGhlIGV2ZW50IChIVE1MRWxlbWVudCwgZGVmYXVsdHMgdG8gYHRoaXNgKS4KICAgICAgICAgKiBAcmV0dXJuIHshRXZlbnR9IFRoZSBuZXcgZXZlbnQgdGhhdCB3YXMgZmlyZWQuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZmlyZSh0eXBlLCBkZXRhaWwsIG9wdGlvbnMpIHsKICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9OwogICAgICAgICAgZGV0YWlsID0gKGRldGFpbCA9PT0gbnVsbCB8fCBkZXRhaWwgPT09IHVuZGVmaW5lZCkgPyB7fSA6IGRldGFpbDsKICAgICAgICAgIGxldCBldmVudCA9IG5ldyBFdmVudCh0eXBlLCB7CiAgICAgICAgICAgIGJ1YmJsZXM6IG9wdGlvbnMuYnViYmxlcyA9PT0gdW5kZWZpbmVkID8gdHJ1ZSA6IG9wdGlvbnMuYnViYmxlcywKICAgICAgICAgICAgY2FuY2VsYWJsZTogQm9vbGVhbihvcHRpb25zLmNhbmNlbGFibGUpLAogICAgICAgICAgICBjb21wb3NlZDogb3B0aW9ucy5jb21wb3NlZCA9PT0gdW5kZWZpbmVkID8gdHJ1ZTogb3B0aW9ucy5jb21wb3NlZAogICAgICAgICAgfSk7CiAgICAgICAgICBldmVudC5kZXRhaWwgPSBkZXRhaWw7CiAgICAgICAgICBsZXQgbm9kZSA9IG9wdGlvbnMubm9kZSB8fCB0aGlzOwogICAgICAgICAgd3JhcChub2RlKS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICAgIHJldHVybiBldmVudDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgYW4gZXZlbnQgbGlzdGVuZXIgb24gYSBnaXZlbiBlbGVtZW50LAogICAgICAgICAqIGxhdGUgYm91bmQgdG8gYSBuYW1lZCBtZXRob2Qgb24gdGhpcyBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/RXZlbnRUYXJnZXR9IG5vZGUgRWxlbWVudCB0byBhZGQgZXZlbnQgbGlzdGVuZXIgdG8uCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZSBOYW1lIG9mIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gY2FsbC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGxpc3Rlbihub2RlLCBldmVudE5hbWUsIG1ldGhvZE5hbWUpIHsKICAgICAgICAgIG5vZGUgPSAvKiogQHR5cGUgeyFFdmVudFRhcmdldH0gKi8gKG5vZGUgfHwgdGhpcyk7CiAgICAgICAgICBsZXQgaGJsID0gdGhpcy5fX2JvdW5kTGlzdGVuZXJzIHx8CiAgICAgICAgICAgICh0aGlzLl9fYm91bmRMaXN0ZW5lcnMgPSBuZXcgV2Vha01hcCgpKTsKICAgICAgICAgIGxldCBibCA9IGhibC5nZXQobm9kZSk7CiAgICAgICAgICBpZiAoIWJsKSB7CiAgICAgICAgICAgIGJsID0ge307CiAgICAgICAgICAgIGhibC5zZXQobm9kZSwgYmwpOwogICAgICAgICAgfQogICAgICAgICAgbGV0IGtleSA9IGV2ZW50TmFtZSArIG1ldGhvZE5hbWU7CiAgICAgICAgICBpZiAoIWJsW2tleV0pIHsKICAgICAgICAgICAgYmxba2V5XSA9IHRoaXMuX2FkZE1ldGhvZEV2ZW50TGlzdGVuZXJUb05vZGUoCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgeyFOb2RlfSAqLyAobm9kZSksIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgdG8gcmVtb3ZlIGFuIGV2ZW50IGxpc3RlbmVyIGZyb20gYSBnaXZlbiBlbGVtZW50LAogICAgICAgICAqIGxhdGUgYm91bmQgdG8gYSBuYW1lZCBtZXRob2Qgb24gdGhpcyBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/RXZlbnRUYXJnZXR9IG5vZGUgRWxlbWVudCB0byByZW1vdmUgZXZlbnQgbGlzdGVuZXIgZnJvbS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQgdG8gc3RvcCBsaXN0ZW5pbmcgdG8uCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG1ldGhvZE5hbWUgTmFtZSBvZiBoYW5kbGVyIG1ldGhvZCBvbiBgdGhpc2AgdG8gbm90IGNhbGwKICAgICAgICAgYW55bW9yZS4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHVubGlzdGVuKG5vZGUsIGV2ZW50TmFtZSwgbWV0aG9kTmFtZSkgewogICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7IUV2ZW50VGFyZ2V0fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICAgIGxldCBibCA9IHRoaXMuX19ib3VuZExpc3RlbmVycyAmJgogICAgICAgICAgICAgIHRoaXMuX19ib3VuZExpc3RlbmVycy5nZXQoLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUpKTsKICAgICAgICAgIGxldCBrZXkgPSBldmVudE5hbWUgKyBtZXRob2ROYW1lOwogICAgICAgICAgbGV0IGhhbmRsZXIgPSBibCAmJiBibFtrZXldOwogICAgICAgICAgaWYgKGhhbmRsZXIpIHsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlRXZlbnRMaXN0ZW5lckZyb21Ob2RlKAogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHshTm9kZX0gKi8gKG5vZGUpLCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgICAgICBibFtrZXldID0gLyoqIEB0eXBlIHs/fSAqLyAobnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZSBzY3JvbGxpbmcgYmVoYXZpb3IgdG8gYWxsIGRpcmVjdGlvbiwgb25lIGRpcmVjdGlvbiwgb3Igbm9uZS4KICAgICAgICAgKgogICAgICAgICAqIFZhbGlkIHNjcm9sbCBkaXJlY3Rpb25zOgogICAgICAgICAqICAgLSAnYWxsJzogc2Nyb2xsIGluIGFueSBkaXJlY3Rpb24KICAgICAgICAgKiAgIC0gJ3gnOiBzY3JvbGwgb25seSBpbiB0aGUgJ3gnIGRpcmVjdGlvbgogICAgICAgICAqICAgLSAneSc6IHNjcm9sbCBvbmx5IGluIHRoZSAneScgZGlyZWN0aW9uCiAgICAgICAgICogICAtICdub25lJzogZGlzYWJsZSBzY3JvbGxpbmcgZm9yIHRoaXMgbm9kZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBkaXJlY3Rpb24gRGlyZWN0aW9uIHRvIGFsbG93IHNjcm9sbGluZwogICAgICAgICAqIERlZmF1bHRzIHRvIGBhbGxgLgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSBzY3JvbGwgZGlyZWN0aW9uIHNldHRpbmcuCiAgICAgICAgICogRGVmYXVsdHMgdG8gYHRoaXNgLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgc2V0U2Nyb2xsRGlyZWN0aW9uKGRpcmVjdGlvbiwgbm9kZSkgewogICAgICAgICAgc2V0VG91Y2hBY3Rpb24oCiAgICAgICAgICAgICAgLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGUgfHwgdGhpcyksCiAgICAgICAgICAgICAgRElSRUNUSU9OX01BUFtkaXJlY3Rpb25dIHx8ICdhdXRvJyk7CiAgICAgICAgfQogICAgICAgIC8qICoqKiogRW5kIEV2ZW50cyAqKioqICovCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCB0byBydW4gYHF1ZXJ5U2VsZWN0b3JgIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBjYWxscyBgUG9seW1lci5kb20odGhpcy5yb290KS5xdWVyeVNlbGVjdG9yKHNsY3RyKWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2xjdHIgU2VsZWN0b3IgdG8gcnVuIG9uIHRoaXMgbG9jYWwgRE9NIHNjb3BlCiAgICAgICAgICogQHJldHVybiB7RWxlbWVudH0gRWxlbWVudCBmb3VuZCBieSB0aGUgc2VsZWN0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgICQkKHNsY3RyKSB7CiAgICAgICAgICAvLyBOb3RlLCBubyBuZWVkIHRvIGB3cmFwYCB0aGlzIGJlY2F1c2Ugcm9vdCBpcyBhbHdheXMgcGF0Y2hlZAogICAgICAgICAgcmV0dXJuIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yKHNsY3RyKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiB0aGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudAogICAgICAgICAqIGlzIGNvbnRhaW5lZC4gVGhpcyBpcyBhIHNob3J0aGFuZCBmb3IKICAgICAgICAgKiBgdGhpcy5nZXRSb290Tm9kZSgpLmhvc3RgLgogICAgICAgICAqIEB0aGlzIHtFbGVtZW50fQogICAgICAgICAqIEByZXR1cm4gez9Ob2RlfSBUaGUgZWxlbWVudCB3aG9zZSBsb2NhbCBkb20gd2l0aGluIHdoaWNoIHRoaXMgZWxlbWVudCBpcwogICAgICAgICAqIGNvbnRhaW5lZC4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXQgZG9tSG9zdCgpIHsKICAgICAgICAgIGxldCByb290ID0gd3JhcCh0aGlzKS5nZXRSb290Tm9kZSgpOwogICAgICAgICAgcmV0dXJuIChyb290IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkgPyAvKiogQHR5cGUge1NoYWRvd1Jvb3R9ICovIChyb290KS5ob3N0IDogcm9vdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlIHRoaXMgZWxlbWVudCB0byBkaXN0cmlidXRlIGl0cyBjaGlsZHJlbiB0byBpdHMgbG9jYWwgZG9tLgogICAgICAgICAqIFRoaXMgc2hvdWxkIG5vdCBiZSBuZWNlc3NhcnkgYXMgb2YgUG9seW1lciAyLjAuMiBhbmQgaXMgcHJvdmlkZWQgb25seQogICAgICAgICAqIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGRpc3RyaWJ1dGVDb250ZW50KCkgewogICAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgICBjb25zdCBkb21BcGkgPSAvKiogQHR5cGUge1BvbHltZXJEb21BcGl9ICovKGRvbSh0aGlzRWwpKTsKICAgICAgICAgIGlmICh3aW5kb3cuU2hhZHlET00gJiYgZG9tQXBpLnNoYWRvd1Jvb3QpIHsKICAgICAgICAgICAgU2hhZHlET00uZmx1c2goKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIHRoYXQgYXJlIHRoZSBlZmZlY3RpdmUgY2hpbGROb2Rlcy4gVGhlIGVmZmVjdGl2ZQogICAgICAgICAqIGNoaWxkTm9kZXMgbGlzdCBpcyB0aGUgc2FtZSBhcyB0aGUgZWxlbWVudCdzIGNoaWxkTm9kZXMgZXhjZXB0IHRoYXQKICAgICAgICAgKiBhbnkgYDxjb250ZW50PmAgZWxlbWVudHMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIGxpc3Qgb2Ygbm9kZXMgZGlzdHJpYnV0ZWQKICAgICAgICAgKiB0byB0aGUgYDxjb250ZW50PmAsIHRoZSByZXN1bHQgb2YgaXRzIGBnZXREaXN0cmlidXRlZE5vZGVzYCBtZXRob2QuCiAgICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBlZmZlY3RpdmUgY2hpbGQgbm9kZXMuCiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4KICAgICAgICAgKiAgICAgSFRNTEVsZW1lbnQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRFZmZlY3RpdmVDaGlsZE5vZGVzKCkgewogICAgICAgICAgY29uc3QgdGhpc0VsID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAodGhpcyk7CiAgICAgICAgICBjb25zdCBkb21BcGkgPSAvKiogQHR5cGUge1BvbHltZXJEb21BcGl9ICovIChkb20odGhpc0VsKSk7CiAgICAgICAgICByZXR1cm4gZG9tQXBpLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkIHdpdGhpbiB0aGlzIGVsZW1lbnQgdGhhdCBtYXRjaAogICAgICAgICAqIGBzZWxlY3RvcmAuIFRoZXNlIGNhbiBiZSBkb20gY2hpbGRyZW4gb3IgZWxlbWVudHMgZGlzdHJpYnV0ZWQgdG8KICAgICAgICAgKiBjaGlsZHJlbiB0aGF0IGFyZSBpbnNlcnRpb24gcG9pbnRzLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byBydW4uCiAgICAgICAgICogQHJldHVybiB7IUFycmF5PCFOb2RlPn0gTGlzdCBvZiBkaXN0cmlidXRlZCBlbGVtZW50cyB0aGF0IG1hdGNoIHNlbGVjdG9yLgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuCiAgICAgICAgICogSFRNTEVsZW1lbnQKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBxdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpIHsKICAgICAgICAgIGNvbnN0IHRoaXNFbCA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8gKHRoaXMpOwogICAgICAgICAgY29uc3QgZG9tQXBpID0gLyoqIEB0eXBlIHtQb2x5bWVyRG9tQXBpfSAqLyAoZG9tKHRoaXNFbCkpOwogICAgICAgICAgcmV0dXJuIGRvbUFwaS5xdWVyeURpc3RyaWJ1dGVkRWxlbWVudHMoc2VsZWN0b3IpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZWxlbWVudHMgdGhhdCBhcmUgdGhlIGVmZmVjdGl2ZSBjaGlsZHJlbi4gVGhlIGVmZmVjdGl2ZQogICAgICAgICAqIGNoaWxkcmVuIGxpc3QgaXMgdGhlIHNhbWUgYXMgdGhlIGVsZW1lbnQncyBjaGlsZHJlbiBleGNlcHQgdGhhdAogICAgICAgICAqIGFueSBgPGNvbnRlbnQ+YCBlbGVtZW50cyBhcmUgcmVwbGFjZWQgd2l0aCB0aGUgbGlzdCBvZiBlbGVtZW50cwogICAgICAgICAqIGRpc3RyaWJ1dGVkIHRvIHRoZSBgPGNvbnRlbnQ+YC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkcmVuLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGdldEVmZmVjdGl2ZUNoaWxkcmVuKCkgewogICAgICAgICAgbGV0IGxpc3QgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkTm9kZXMoKTsKICAgICAgICAgIHJldHVybiBsaXN0LmZpbHRlcihmdW5jdGlvbigvKiogQHR5cGUgeyFOb2RlfSAqLyBuKSB7CiAgICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIG9mIHRleHQgY29udGVudCB0aGF0IGlzIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZQogICAgICAgICAqIHRleHQgY29udGVudCdzIG9mIHRoZSBlbGVtZW50J3MgZWZmZWN0aXZlIGNoaWxkTm9kZXMgKHRoZSBlbGVtZW50cwogICAgICAgICAqIHJldHVybmVkIGJ5IDxhIGhyZWY9IiNnZXRFZmZlY3RpdmVDaGlsZE5vZGVzPmdldEVmZmVjdGl2ZUNoaWxkTm9kZXM8L2E+LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7c3RyaW5nfSBMaXN0IG9mIGVmZmVjdGl2ZSBjaGlsZHJlbi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRFZmZlY3RpdmVUZXh0Q29udGVudCgpIHsKICAgICAgICAgIGxldCBjbiA9IHRoaXMuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgICAgbGV0IHRjID0gW107CiAgICAgICAgICBmb3IgKGxldCBpPTAsIGM7IChjID0gY25baV0pOyBpKyspIHsKICAgICAgICAgICAgaWYgKGMubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7CiAgICAgICAgICAgICAgdGMucHVzaChjLnRleHRDb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRjLmpvaW4oJycpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgZmlyc3QgZWZmZWN0aXZlIGNoaWxkTm9kZSB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICAgKiBtYXRjaCBgc2VsZWN0b3JgLiBUaGVzZSBjYW4gYmUgZG9tIGNoaWxkIG5vZGVzIG9yIGVsZW1lbnRzIGRpc3RyaWJ1dGVkCiAgICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgICAqIEByZXR1cm4ge05vZGV9IEZpcnN0IGVmZmVjdGl2ZSBjaGlsZCBub2RlIHRoYXQgbWF0Y2hlcyBzZWxlY3Rvci4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBxdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKHNlbGVjdG9yKSB7CiAgICAgICAgICBsZXQgZSQgPSB0aGlzLnF1ZXJ5RGlzdHJpYnV0ZWRFbGVtZW50cyhzZWxlY3Rvcik7CiAgICAgICAgICByZXR1cm4gZSQgJiYgZSRbMF07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBlZmZlY3RpdmUgY2hpbGROb2RlcyB3aXRoaW4gdGhpcyBlbGVtZW50IHRoYXQKICAgICAgICAgKiBtYXRjaCBgc2VsZWN0b3JgLiBUaGVzZSBjYW4gYmUgZG9tIGNoaWxkIG5vZGVzIG9yIGVsZW1lbnRzIGRpc3RyaWJ1dGVkCiAgICAgICAgICogdG8gY2hpbGRyZW4gdGhhdCBhcmUgaW5zZXJ0aW9uIHBvaW50cy4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gcnVuLgogICAgICAgICAqIEByZXR1cm4geyFBcnJheTwhTm9kZT59IExpc3Qgb2YgZWZmZWN0aXZlIGNoaWxkIG5vZGVzIHRoYXQgbWF0Y2gKICAgICAgICAgKiAgICAgc2VsZWN0b3IuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgcXVlcnlBbGxFZmZlY3RpdmVDaGlsZHJlbihzZWxlY3RvcikgewogICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHNlbGVjdG9yKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIG5vZGVzIGRpc3RyaWJ1dGVkIHRvIHRoaXMgZWxlbWVudCdzIGA8c2xvdD5gLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG1vcmUgdGhhbiBvbmUgYDxzbG90PmAgaW4gaXRzIGxvY2FsIERPTSwKICAgICAgICAgKiBhbiBvcHRpb25hbCBzZWxlY3RvciBtYXkgYmUgcGFzc2VkIHRvIGNob29zZSB0aGUgZGVzaXJlZCBjb250ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAgICogICBgPHNsb3Q+YC4gIERlZmF1bHRzIHRvIGBjb250ZW50YC4KICAgICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBMaXN0IG9mIGRpc3RyaWJ1dGVkIG5vZGVzIGZvciB0aGUgYDxzbG90PmAuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGVudENoaWxkTm9kZXMoc2xjdHIpIHsKICAgICAgICAgIC8vIE5vdGUsIG5vIG5lZWQgdG8gYHdyYXBgIHRoaXMgYmVjYXVzZSByb290IGlzIGFsd2F5cwogICAgICAgICAgbGV0IGNvbnRlbnQgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvcihzbGN0ciB8fCAnc2xvdCcpOwogICAgICAgICAgcmV0dXJuIGNvbnRlbnQgPwogICAgICAgICAgICAgIC8qKiBAdHlwZSB7UG9seW1lckRvbUFwaX0gKi8gKGRvbShjb250ZW50KSkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpIDoKICAgICAgICAgICAgICBbXTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGVsZW1lbnQgY2hpbGRyZW4gZGlzdHJpYnV0ZWQgdG8gdGhpcyBlbGVtZW50J3MKICAgICAgICAgKiBgPHNsb3Q+YC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoaXMgZWxlbWVudCBjb250YWlucyBtb3JlIHRoYW4gb25lIGA8c2xvdD5gIGluIGl0cwogICAgICAgICAqIGxvY2FsIERPTSwgYW4gb3B0aW9uYWwgc2VsZWN0b3IgbWF5IGJlIHBhc3NlZCB0byBjaG9vc2UgdGhlIGRlc2lyZWQKICAgICAgICAgKiBjb250ZW50LiAgVGhpcyBtZXRob2QgZGlmZmVycyBmcm9tIGBnZXRDb250ZW50Q2hpbGROb2Rlc2AgaW4gdGhhdCBvbmx5CiAgICAgICAgICogZWxlbWVudHMgYXJlIHJldHVybmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzbGN0ciBDU1Mgc2VsZWN0b3IgdG8gY2hvb3NlIHRoZSBkZXNpcmVkCiAgICAgICAgICogICBgPGNvbnRlbnQ+YC4gIERlZmF1bHRzIHRvIGBjb250ZW50YC4KICAgICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gTGlzdCBvZiBkaXN0cmlidXRlZCBub2RlcyBmb3IgdGhlCiAgICAgICAgICogICBgPHNsb3Q+YC4KICAgICAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0c30KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBnZXRDb250ZW50Q2hpbGRyZW4oc2xjdHIpIHsKICAgICAgICAgIGxldCBjaGlsZHJlbiA9IC8qKiBAdHlwZSB7IUFycmF5PCFIVE1MRWxlbWVudD59ICovKHRoaXMuZ2V0Q29udGVudENoaWxkTm9kZXMoc2xjdHIpLmZpbHRlcihmdW5jdGlvbihuKSB7CiAgICAgICAgICAgIHJldHVybiAobi5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpOwogICAgICAgICAgfSkpOwogICAgICAgICAgcmV0dXJuIGNoaWxkcmVuOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsaWdodCBET00gdHJlZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P05vZGV9IG5vZGUgVGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZC4KICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbGlnaHQgRE9NIHRyZWUuCiAgICAgICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9IExlZ2FjeUVsZW1lbnRNaXhpbiBtdXN0IGJlIGFwcGxpZWQgdG8gYW4KICAgICAgICAgKiBIVE1MRWxlbWVudAogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGlzTGlnaHREZXNjZW5kYW50KG5vZGUpIHsKICAgICAgICAgIGNvbnN0IHRoaXNOb2RlID0gLyoqIEB0eXBlIHtOb2RlfSAqLyAodGhpcyk7CiAgICAgICAgICByZXR1cm4gdGhpc05vZGUgIT09IG5vZGUgJiYgd3JhcCh0aGlzTm9kZSkuY29udGFpbnMobm9kZSkgJiYKICAgICAgICAgICAgd3JhcCh0aGlzTm9kZSkuZ2V0Um9vdE5vZGUoKSA9PT0gd3JhcChub2RlKS5nZXRSb290Tm9kZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBpbiB0aGlzIGVsZW1lbnQncyBsb2NhbCBET00gdHJlZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG5vZGUgVGhlIGVsZW1lbnQgdG8gYmUgY2hlY2tlZC4KICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIG5vZGUgaXMgaW4gdGhpcyBlbGVtZW50J3MgbG9jYWwgRE9NIHRyZWUuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgaXNMb2NhbERlc2NlbmRhbnQobm9kZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMucm9vdCA9PT0gd3JhcChub2RlKS5nZXRSb290Tm9kZSgpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogTm8tb3AgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHNob3VsZCBub3cgYmUgaGFuZGxlZCBieQogICAgICAgICAqIFNoYWR5Q3NzIGxpYnJhcnkuCiAgICAgICAgICogQHBhcmFtICB7IUVsZW1lbnR9IGNvbnRhaW5lciBDb250YWluZXIgZWxlbWVudCB0byBzY29wZQogICAgICAgICAqIEBwYXJhbSAge2Jvb2xlYW49fSBzaG91bGRPYnNlcnZlIGlmIHRydWUsIHN0YXJ0IGEgbXV0YXRpb24gb2JzZXJ2ZXIgZm9yIGFkZGVkIG5vZGVzIHRvIHRoZSBjb250YWluZXIKICAgICAgICAgKiBAcmV0dXJuIHs/TXV0YXRpb25PYnNlcnZlcn0gUmV0dXJucyBhIG5ldyBNdXRhdGlvbk9ic2VydmVyIG9uIGBjb250YWluZXJgIGlmIGBzaG91bGRPYnNlcnZlYCBpcyB0cnVlLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHNjb3BlU3VidHJlZShjb250YWluZXIsIHNob3VsZE9ic2VydmUgPSBmYWxzZSkgewogICAgICAgICAgcmV0dXJuIHNjb3BlU3VidHJlZShjb250YWluZXIsIHNob3VsZE9ic2VydmUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgY29tcHV0ZWQgc3R5bGUgdmFsdWUgZm9yIHRoZSBnaXZlbiBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgVGhlIGNzcyBwcm9wZXJ0eSBuYW1lLgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gUmV0dXJucyB0aGUgY29tcHV0ZWQgY3NzIHByb3BlcnR5IHZhbHVlIGZvciB0aGUgZ2l2ZW4KICAgICAgICAgKiBgcHJvcGVydHlgLgogICAgICAgICAqIEBzdXBwcmVzcyB7aW52YWxpZENhc3RzfSBMZWdhY3lFbGVtZW50TWl4aW4gbXVzdCBiZSBhcHBsaWVkIHRvIGFuCiAgICAgICAgICogICAgIEhUTUxFbGVtZW50CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKHByb3BlcnR5KSB7CiAgICAgICAgICByZXR1cm4gc3R5bGVJbnRlcmZhY2UuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKC8qKiBAdHlwZSB7IUVsZW1lbnR9ICovKHRoaXMpLCBwcm9wZXJ0eSk7CiAgICAgICAgfQoKICAgICAgICAvLyBkZWJvdW5jZQoKICAgICAgICAvKioKICAgICAgICAgKiBDYWxsIGBkZWJvdW5jZWAgdG8gY29sbGFwc2UgbXVsdGlwbGUgcmVxdWVzdHMgZm9yIGEgbmFtZWQgdGFzayBpbnRvCiAgICAgICAgICogb25lIGludm9jYXRpb24gd2hpY2ggaXMgbWFkZSBhZnRlciB0aGUgd2FpdCB0aW1lIGhhcyBlbGFwc2VkIHdpdGgKICAgICAgICAgKiBubyBuZXcgcmVxdWVzdC4gIElmIG5vIHdhaXQgdGltZSBpcyBnaXZlbiwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkCiAgICAgICAgICogYXQgbWljcm90YXNrIHRpbWluZyAoZ3VhcmFudGVlZCBiZWZvcmUgcGFpbnQpLgogICAgICAgICAqCiAgICAgICAgICogICAgIGRlYm91bmNlZENsaWNrQWN0aW9uKGUpIHsKICAgICAgICAgKiAgICAgICAvLyB3aWxsIG5vdCBjYWxsIGBwcm9jZXNzQ2xpY2tgIG1vcmUgdGhhbiBvbmNlIHBlciAxMDBtcwogICAgICAgICAqICAgICAgIHRoaXMuZGVib3VuY2UoJ2NsaWNrJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICogICAgICAgIHRoaXMucHJvY2Vzc0NsaWNrKCk7CiAgICAgICAgICogICAgICAgfSAxMDApOwogICAgICAgICAqICAgICB9CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBTdHJpbmcgdG8gaWRlbnRpZnkgdGhlIGRlYm91bmNlIGpvYi4KICAgICAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKCk6dm9pZH0gY2FsbGJhY2sgRnVuY3Rpb24gdGhhdCBpcyBjYWxsZWQgKHdpdGggYHRoaXNgCiAgICAgICAgICogICBjb250ZXh0KSB3aGVuIHRoZSB3YWl0IHRpbWUgZWxhcHNlcy4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IHdhaXQgT3B0aW9uYWwgd2FpdCB0aW1lIGluIG1pbGxpc2Vjb25kcyAobXMpIGFmdGVyIHRoZQogICAgICAgICAqICAgbGFzdCBzaWduYWwgdGhhdCBtdXN0IGVsYXBzZSBiZWZvcmUgaW52b2tpbmcgYGNhbGxiYWNrYAogICAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFJldHVybnMgYSBkZWJvdW5jZXIgb2JqZWN0IG9uIHdoaWNoIGV4aXN0cyB0aGUKICAgICAgICAgKiBmb2xsb3dpbmcgbWV0aG9kczogYGlzQWN0aXZlKClgIHJldHVybnMgdHJ1ZSBpZiB0aGUgZGVib3VuY2VyIGlzCiAgICAgICAgICogYWN0aXZlOyBgY2FuY2VsKClgIGNhbmNlbHMgdGhlIGRlYm91bmNlciBpZiBpdCBpcyBhY3RpdmU7CiAgICAgICAgICogYGZsdXNoKClgIGltbWVkaWF0ZWx5IGludm9rZXMgdGhlIGRlYm91bmNlZCBjYWxsYmFjayBpZiB0aGUgZGVib3VuY2VyCiAgICAgICAgICogaXMgYWN0aXZlLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGRlYm91bmNlKGpvYk5hbWUsIGNhbGxiYWNrLCB3YWl0KSB7CiAgICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICAgIHJldHVybiB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdID0gRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tqb2JOYW1lXQogICAgICAgICAgICAgICwgd2FpdCA+IDAgPyB0aW1lT3V0LmFmdGVyKHdhaXQpIDogbWljcm9UYXNrCiAgICAgICAgICAgICAgLCBjYWxsYmFjay5iaW5kKHRoaXMpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciBhIG5hbWVkIGRlYm91bmNlciBpcyBhY3RpdmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGVib3VuY2VyIHN0YXJ0ZWQgd2l0aCBgZGVib3VuY2VgCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgZGVib3VuY2VyIGlzIGFjdGl2ZSAoaGFzIG5vdCB5ZXQgZmlyZWQpLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGlzRGVib3VuY2VyQWN0aXZlKGpvYk5hbWUpIHsKICAgICAgICAgIHRoaXMuX2RlYm91bmNlcnMgPSB0aGlzLl9kZWJvdW5jZXJzIHx8IHt9OwogICAgICAgICAgbGV0IGRlYm91bmNlciA9IHRoaXMuX2RlYm91bmNlcnNbam9iTmFtZV07CiAgICAgICAgICByZXR1cm4gISEoZGVib3VuY2VyICYmIGRlYm91bmNlci5pc0FjdGl2ZSgpKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEltbWVkaWF0ZWx5IGNhbGxzIHRoZSBkZWJvdW5jZXIgYGNhbGxiYWNrYCBhbmQgaW5hY3RpdmF0ZXMgaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gam9iTmFtZSBUaGUgbmFtZSBvZiB0aGUgZGVib3VuY2VyIHN0YXJ0ZWQgd2l0aCBgZGVib3VuY2VgCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBmbHVzaERlYm91bmNlcihqb2JOYW1lKSB7CiAgICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgICAgaWYgKGRlYm91bmNlcikgewogICAgICAgICAgICBkZWJvdW5jZXIuZmx1c2goKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENhbmNlbHMgYW4gYWN0aXZlIGRlYm91bmNlci4gIFRoZSBgY2FsbGJhY2tgIHdpbGwgbm90IGJlIGNhbGxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBqb2JOYW1lIFRoZSBuYW1lIG9mIHRoZSBkZWJvdW5jZXIgc3RhcnRlZCB3aXRoIGBkZWJvdW5jZWAKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGNhbmNlbERlYm91bmNlcihqb2JOYW1lKSB7CiAgICAgICAgICB0aGlzLl9kZWJvdW5jZXJzID0gdGhpcy5fZGVib3VuY2VycyB8fCB7fTsKICAgICAgICAgIGxldCBkZWJvdW5jZXIgPSB0aGlzLl9kZWJvdW5jZXJzW2pvYk5hbWVdOwogICAgICAgICAgaWYgKGRlYm91bmNlcikgewogICAgICAgICAgICBkZWJvdW5jZXIuY2FuY2VsKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBSdW5zIGEgY2FsbGJhY2sgZnVuY3Rpb24gYXN5bmNocm9ub3VzbHkuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0IChpZiBubyB3YWl0VGltZSBpcyBzcGVjaWZpZWQpLCBhc3luYyBjYWxsYmFja3MgYXJlIHJ1biBhdAogICAgICAgICAqIG1pY3JvdGFzayB0aW1pbmcsIHdoaWNoIHdpbGwgb2NjdXIgYmVmb3JlIHBhaW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHshRnVuY3Rpb259IGNhbGxiYWNrIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB0byBydW4sIGJvdW5kIHRvCiAgICAgICAgICogICAgIGB0aGlzYC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcj19IHdhaXRUaW1lIFRpbWUgdG8gd2FpdCBiZWZvcmUgY2FsbGluZyB0aGUKICAgICAgICAgKiAgIGBjYWxsYmFja2AuICBJZiB1bnNwZWNpZmllZCBvciAwLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBydW4gYXQgbWljcm90YXNrCiAgICAgICAgICogICB0aW1pbmcgKGJlZm9yZSBwYWludCkuCiAgICAgICAgICogQHJldHVybiB7bnVtYmVyfSBIYW5kbGUgdGhhdCBtYXkgYmUgdXNlZCB0byBjYW5jZWwgdGhlIGFzeW5jIGpvYi4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBhc3luYyhjYWxsYmFjaywgd2FpdFRpbWUpIHsKICAgICAgICAgIHJldHVybiB3YWl0VGltZSA+IDAgPyB0aW1lT3V0LnJ1bihjYWxsYmFjay5iaW5kKHRoaXMpLCB3YWl0VGltZSkgOgogICAgICAgICAgICAgIH5taWNyb1Rhc2sucnVuKGNhbGxiYWNrLmJpbmQodGhpcykpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FuY2VscyBhbiBhc3luYyBvcGVyYXRpb24gc3RhcnRlZCB3aXRoIGBhc3luY2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gaGFuZGxlIEhhbmRsZSByZXR1cm5lZCBmcm9tIG9yaWdpbmFsIGBhc3luY2AgY2FsbCB0bwogICAgICAgICAqICAgY2FuY2VsLgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgY2FuY2VsQXN5bmMoaGFuZGxlKSB7CiAgICAgICAgICBoYW5kbGUgPCAwID8gbWljcm9UYXNrLmNhbmNlbCh+aGFuZGxlKSA6CiAgICAgICAgICAgICAgdGltZU91dC5jYW5jZWwoaGFuZGxlKTsKICAgICAgICB9CgogICAgICAgIC8vIG90aGVyCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgYW4gZWxlbWVudCBhbmQgY29uZmlndXJpbmcgaXQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIEhUTUwgZWxlbWVudCB0YWcgdG8gY3JlYXRlLgogICAgICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gcHJvcHMgT2JqZWN0IG9mIHByb3BlcnRpZXMgdG8gY29uZmlndXJlIG9uIHRoZQogICAgICAgICAqICAgIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fSBOZXdseSBjcmVhdGVkIGFuZCBjb25maWd1cmVkIGVsZW1lbnQuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlKHRhZywgcHJvcHMpIHsKICAgICAgICAgIGxldCBlbHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZyk7CiAgICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgICAgaWYgKGVsdC5zZXRQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgZWx0LnNldFByb3BlcnRpZXMocHJvcHMpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGZvciAobGV0IG4gaW4gcHJvcHMpIHsKICAgICAgICAgICAgICAgIGVsdFtuXSA9IHByb3BzW25dOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGVsdDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFBvbHlmaWxsIGZvciBFbGVtZW50LnByb3RvdHlwZS5tYXRjaGVzLCB3aGljaCBpcyBzb21ldGltZXMgc3RpbGwKICAgICAgICAgKiBwcmVmaXhlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzZWxlY3RvciBTZWxlY3RvciB0byB0ZXN0LgogICAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gdGVzdCB0aGUgc2VsZWN0b3IgYWdhaW5zdC4KICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBlbGVtZW50IG1hdGNoZXMgdGhlIHNlbGVjdG9yLgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIGVsZW1lbnRNYXRjaGVzKHNlbGVjdG9yLCBub2RlKSB7CiAgICAgICAgICByZXR1cm4gbWF0Y2hlc1NlbGVjdG9yKCAobm9kZSB8fCB0aGlzKSwgc2VsZWN0b3IpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogVG9nZ2xlcyBhbiBIVE1MIGF0dHJpYnV0ZSBvbiBvciBvZmYuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBIVE1MIGF0dHJpYnV0ZSBuYW1lCiAgICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYm9vbCBCb29sZWFuIHRvIGZvcmNlIHRoZSBhdHRyaWJ1dGUgb24gb3Igb2ZmLgogICAgICAgICAqICAgIFdoZW4gdW5zcGVjaWZpZWQsIHRoZSBzdGF0ZSBvZiB0aGUgYXR0cmlidXRlIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIG5vdyBleGlzdHMKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICB0b2dnbGVBdHRyaWJ1dGUobmFtZSwgYm9vbCkgewogICAgICAgICAgbGV0IG5vZGUgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovKHRoaXMpOwogICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDMpIHsKICAgICAgICAgICAgbm9kZSA9IC8qKiBAdHlwZSB7RWxlbWVudH0gKi8oYXJndW1lbnRzWzJdKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgYm9vbCA9ICFub2RlLmhhc0F0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChib29sKSB7CiAgICAgICAgICAgIHdyYXAobm9kZSkuc2V0QXR0cmlidXRlKG5hbWUsICcnKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB3cmFwKG5vZGUpLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KCgogICAgICAgIC8qKgogICAgICAgICAqIFRvZ2dsZXMgYSBDU1MgY2xhc3Mgb24gb3Igb2ZmLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgQ1NTIGNsYXNzIG5hbWUKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBib29sIEJvb2xlYW4gdG8gZm9yY2UgdGhlIGNsYXNzIG9uIG9yIG9mZi4KICAgICAgICAgKiAgICBXaGVuIHVuc3BlY2lmaWVkLCB0aGUgc3RhdGUgb2YgdGhlIGNsYXNzIHdpbGwgYmUgcmV2ZXJzZWQuCiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50PX0gbm9kZSBOb2RlIHRvIHRhcmdldC4gIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHRvZ2dsZUNsYXNzKG5hbWUsIGJvb2wsIG5vZGUpIHsKICAgICAgICAgIG5vZGUgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkgewogICAgICAgICAgICBib29sID0gIW5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKG5hbWUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QuYWRkKG5hbWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQ3Jvc3MtcGxhdGZvcm0gaGVscGVyIGZvciBzZXR0aW5nIGFuIGVsZW1lbnQncyBDU1MgYHRyYW5zZm9ybWAgcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHJhbnNmb3JtVGV4dCBUcmFuc2Zvcm0gc2V0dGluZy4KICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnQ9fSBub2RlIEVsZW1lbnQgdG8gYXBwbHkgdGhlIHRyYW5zZm9ybSB0by4KICAgICAgICAgKiBEZWZhdWx0cyB0byBgdGhpc2AKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm1UZXh0LCBub2RlKSB7CiAgICAgICAgICBub2RlID0gLyoqIEB0eXBlIHtFbGVtZW50fSAqLyAobm9kZSB8fCB0aGlzKTsKICAgICAgICAgIG5vZGUuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gdHJhbnNmb3JtVGV4dDsKICAgICAgICAgIG5vZGUuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtVGV4dDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIENyb3NzLXBsYXRmb3JtIGhlbHBlciBmb3Igc2V0dGluZyBhbiBlbGVtZW50J3MgQ1NTIGB0cmFuc2xhdGUzZGAKICAgICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30geCBYIG9mZnNldC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcnxzdHJpbmd9IHkgWSBvZmZzZXQuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB6IFogb2Zmc2V0LgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG5vZGUgRWxlbWVudCB0byBhcHBseSB0aGUgdHJhbnNmb3JtIHRvLgogICAgICAgICAqIERlZmF1bHRzIHRvIGB0aGlzYC4KICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIHRyYW5zbGF0ZTNkKHgsIHksIHosIG5vZGUpIHsKICAgICAgICAgIG5vZGUgPSAvKiogQHR5cGUge0VsZW1lbnR9ICovIChub2RlIHx8IHRoaXMpOwogICAgICAgICAgdGhpcy50cmFuc2Zvcm0oJ3RyYW5zbGF0ZTNkKCcgKyB4ICsgJywnICsgeSArICcsJyArIHogKyAnKScsIG5vZGUpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiBpdGVtIGZyb20gYW4gYXJyYXksIGlmIGl0IGV4aXN0cy4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoZSBhcnJheSBpcyBzcGVjaWZpZWQgYnkgcGF0aCwgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGlzCiAgICAgICAgICogZ2VuZXJhdGVkLCBzbyB0aGF0IG9ic2VydmVycywgZGF0YSBiaW5kaW5ncyBhbmQgY29tcHV0ZWQKICAgICAgICAgKiBwcm9wZXJ0aWVzIHdhdGNoaW5nIHRoYXQgcGF0aCBjYW4gdXBkYXRlLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIGFycmF5IGlzIHBhc3NlZCBkaXJlY3RseSwgKipubyBjaGFuZ2UKICAgICAgICAgKiBub3RpZmljYXRpb24gaXMgZ2VuZXJhdGVkKiouCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZyB8ICFBcnJheTxudW1iZXJ8c3RyaW5nPn0gYXJyYXlPclBhdGggUGF0aCB0byBhcnJheSBmcm9tCiAgICAgICAgICogICAgIHdoaWNoIHRvIHJlbW92ZSB0aGUgaXRlbQogICAgICAgICAqICAgKG9yIHRoZSBhcnJheSBpdHNlbGYpLgogICAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIHRvIHJlbW92ZS4KICAgICAgICAgKiBAcmV0dXJuIHtBcnJheX0gQXJyYXkgY29udGFpbmluZyBpdGVtIHJlbW92ZWQuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgYXJyYXlEZWxldGUoYXJyYXlPclBhdGgsIGl0ZW0pIHsKICAgICAgICAgIGxldCBpbmRleDsKICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFycmF5T3JQYXRoKSkgewogICAgICAgICAgICBpbmRleCA9IGFycmF5T3JQYXRoLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGFycmF5T3JQYXRoLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGxldCBhcnIgPSBnZXQodGhpcywgYXJyYXlPclBhdGgpOwogICAgICAgICAgICBpbmRleCA9IGFyci5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLnNwbGljZShhcnJheU9yUGF0aCwgaW5kZXgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8vIGxvZ2dpbmcKCiAgICAgICAgLyoqCiAgICAgICAgICogRmFjYWRlcyBgY29uc29sZS5sb2dgL2B3YXJuYC9gZXJyb3JgIGFzIG92ZXJyaWRlIHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGxldmVsIE9uZSBvZiAnbG9nJywgJ3dhcm4nLCAnZXJyb3InCiAgICAgICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfbG9nZ2VyKGxldmVsLCBhcmdzKSB7CiAgICAgICAgICAvLyBhY2NlcHQgWydmb28nLCAnYmFyJ10gYW5kIFtbJ2ZvbycsICdiYXInXV0KICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3MpICYmIGFyZ3MubGVuZ3RoID09PSAxICYmIEFycmF5LmlzQXJyYXkoYXJnc1swXSkpIHsKICAgICAgICAgICAgYXJncyA9IGFyZ3NbMF07CiAgICAgICAgICB9CiAgICAgICAgICBzd2l0Y2gobGV2ZWwpIHsKICAgICAgICAgICAgY2FzZSAnbG9nJzoKICAgICAgICAgICAgY2FzZSAnd2Fybic6CiAgICAgICAgICAgIGNhc2UgJ2Vycm9yJzoKICAgICAgICAgICAgICBjb25zb2xlW2xldmVsXSguLi5hcmdzKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEZhY2FkZXMgYGNvbnNvbGUubG9nYCBhcyBhbiBvdmVycmlkZSBwb2ludC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Li4uKn0gYXJncyBBcnJheSBvZiBzdHJpbmdzIG9yIG9iamVjdHMgdG8gbG9nCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKi8KICAgICAgICBfbG9nKC4uLmFyZ3MpIHsKICAgICAgICAgIHRoaXMuX2xvZ2dlcignbG9nJywgYXJncyk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBGYWNhZGVzIGBjb25zb2xlLndhcm5gIGFzIGFuIG92ZXJyaWRlIHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHsuLi4qfSBhcmdzIEFycmF5IG9mIHN0cmluZ3Mgb3Igb2JqZWN0cyB0byBsb2cKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF93YXJuKC4uLmFyZ3MpIHsKICAgICAgICAgIHRoaXMuX2xvZ2dlcignd2FybicsIGFyZ3MpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRmFjYWRlcyBgY29uc29sZS5lcnJvcmAgYXMgYW4gb3ZlcnJpZGUgcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2Vycm9yKC4uLmFyZ3MpIHsKICAgICAgICAgIHRoaXMuX2xvZ2dlcignZXJyb3InLCBhcmdzKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEZvcm1hdHMgYSBtZXNzYWdlIHVzaW5nIHRoZSBlbGVtZW50IHR5cGUgYW4gYSBtZXRob2QgbmFtZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBtZXRob2ROYW1lIE1ldGhvZCBuYW1lIHRvIGFzc29jaWF0ZSB3aXRoIG1lc3NhZ2UKICAgICAgICAgKiBAcGFyYW0gey4uLip9IGFyZ3MgQXJyYXkgb2Ygc3RyaW5ncyBvciBvYmplY3RzIHRvIGxvZwogICAgICAgICAqIEByZXR1cm4geyFBcnJheX0gQXJyYXkgd2l0aCBmb3JtYXR0aW5nIGluZm9ybWF0aW9uIGZvciBgY29uc29sZWAKICAgICAgICAgKiAgIGxvZ2dpbmcuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2xvZ2YobWV0aG9kTmFtZSwgLi4uYXJncykgewogICAgICAgICAgcmV0dXJuIFsnWyVzOjolc10nLCB0aGlzLmlzLCBtZXRob2ROYW1lLCAuLi5hcmdzXTsKICAgICAgICB9CgogICAgICB9CgogICAgICBMZWdhY3lFbGVtZW50LnByb3RvdHlwZS5pcyA9ICcnOwoKICAgICAgcmV0dXJuIExlZ2FjeUVsZW1lbnQ7CiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQ29tcGFyZXMgdGFnIG5hbWVzIGFzY2lpbnVtZXJpY2FsbHkgYnJva2VuIGludG8gY29tcG9uZW50cy4KICAgICAqCiAgICAgKiA8cD5UaGlzIGlzIHRoZSBjb21wYXJpc29uIGZ1bmN0aW9uIHVzZWQgZm9yIHNvcnRpbmcgbW9zdCBzdHJpbmcgdmFsdWVzIGluCiAgICAgKiBUZW5zb3JCb2FyZC4gVW5saWtlIHRoZSBzdGFuZGFyZCBhc2NpaWJldGljYWwgY29tcGFyYXRvciwgdGhpcyBmdW5jdGlvbgogICAgICoga25vd3MgdGhhdCAnYTEwYicgPiAnYTJiJy4gRml4ZWQgcG9pbnQgYW5kIGVuZ2luZWVyaW5nIG5vdGF0aW9uIGFyZQogICAgICogc3VwcG9ydGVkLiBUaGlzIGZ1bmN0aW9uIGFsc28gc3BsaXRzIHRoZSBpbnB1dCBieSBzbGFzaCBhbmQgdW5kZXJzY29yZSB0bwogICAgICogcGVyZm9ybSBhcnJheSBjb21wYXJpc29uLiBUaGVyZWZvcmUgaXQga25vd3MgdGhhdCAnYS9hJyA8ICdhKy9hJyBldmVuCiAgICAgKiB0aG91Z2ggJysnIDwgJy8nIGluIHRoZSBBU0NJSSB0YWJsZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGFyZVRhZ05hbWVzKGEsIGIpIHsKICAgICAgICBsZXQgYWkgPSAwOwogICAgICAgIGxldCBiaSA9IDA7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaWYgKGFpID09PSBhLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJpID09PSBiLmxlbmd0aCA/IDAgOiAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYmkgPT09IGIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNEaWdpdChhW2FpXSkgJiYgaXNEaWdpdChiW2JpXSkpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGFpcyA9IGFpOwogICAgICAgICAgICAgICAgY29uc3QgYmlzID0gYmk7CiAgICAgICAgICAgICAgICBhaSA9IGNvbnN1bWVOdW1iZXIoYSwgYWkgKyAxKTsKICAgICAgICAgICAgICAgIGJpID0gY29uc3VtZU51bWJlcihiLCBiaSArIDEpOwogICAgICAgICAgICAgICAgY29uc3QgYW4gPSBwYXJzZUZsb2F0KGEuc2xpY2UoYWlzLCBhaSkpOwogICAgICAgICAgICAgICAgY29uc3QgYm4gPSBwYXJzZUZsb2F0KGIuc2xpY2UoYmlzLCBiaSkpOwogICAgICAgICAgICAgICAgaWYgKGFuIDwgYm4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYW4gPiBibikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzQnJlYWsoYVthaV0pKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzQnJlYWsoYltiaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzQnJlYWsoYltiaV0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChhW2FpXSA8IGJbYmldKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYVthaV0gPiBiW2JpXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYWkrKzsKICAgICAgICAgICAgYmkrKzsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjb25zdW1lTnVtYmVyKHMsIGkpIHsKICAgICAgICBsZXQgU3RhdGU7CiAgICAgICAgKGZ1bmN0aW9uIChTdGF0ZSkgewogICAgICAgICAgICBTdGF0ZVtTdGF0ZVsiTkFUVVJBTCJdID0gMF0gPSAiTkFUVVJBTCI7CiAgICAgICAgICAgIFN0YXRlW1N0YXRlWyJSRUFMIl0gPSAxXSA9ICJSRUFMIjsKICAgICAgICAgICAgU3RhdGVbU3RhdGVbIkVYUE9ORU5UX1NJR04iXSA9IDJdID0gIkVYUE9ORU5UX1NJR04iOwogICAgICAgICAgICBTdGF0ZVtTdGF0ZVsiRVhQT05FTlQiXSA9IDNdID0gIkVYUE9ORU5UIjsKICAgICAgICB9KShTdGF0ZSB8fCAoU3RhdGUgPSB7fSkpOwogICAgICAgIGxldCBzdGF0ZSA9IFN0YXRlLk5BVFVSQUw7CiAgICAgICAgZm9yICg7IGkgPCBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gU3RhdGUuTkFUVVJBTCkgewogICAgICAgICAgICAgICAgaWYgKHNbaV0gPT09ICcuJykgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuUkVBTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNbaV0gPT09ICdlJyB8fCBzW2ldID09PSAnRScpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkVYUE9ORU5UX1NJR047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNEaWdpdChzW2ldKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlID09PSBTdGF0ZS5SRUFMKSB7CiAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PT0gJ2UnIHx8IHNbaV0gPT09ICdFJykgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuRVhQT05FTlRfU0lHTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc0RpZ2l0KHNbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IFN0YXRlLkVYUE9ORU5UX1NJR04pIHsKICAgICAgICAgICAgICAgIGlmIChpc0RpZ2l0KHNbaV0pIHx8IHNbaV0gPT09ICcrJyB8fCBzW2ldID09PSAnLScpIHsKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkVYUE9ORU5UOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IFN0YXRlLkVYUE9ORU5UKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlzRGlnaXQoc1tpXSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gaTsKICAgIH0KICAgIGZ1bmN0aW9uIGlzRGlnaXQoYykgewogICAgICAgIHJldHVybiAnMCcgPD0gYyAmJiBjIDw9ICc5JzsKICAgIH0KICAgIGZ1bmN0aW9uIGlzQnJlYWsoYykgewogICAgICAgIC8vIFRPRE8oQGphcnQpOiBSZW1vdmUgdW5kZXJzY29yZSB3aGVuIHBlb3BsZSBzdG9wIHVzaW5nIGl0IGxpa2UgYSBzbGFzaC4KICAgICAgICByZXR1cm4gYyA9PT0gJy8nIHx8IGMgPT09ICdfJyB8fCBpc0RpZ2l0KGMpOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE1IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3QgVFlQRVMkMSA9IFtdOwogICAgLyoqIEdpdmVuIGEgUnVuVG9UYWcsIHJldHVybiBzb3J0ZWQgYXJyYXkgb2YgYWxsIHJ1bnMgKi8KICAgIGZ1bmN0aW9uIGdldFJ1bnNOYW1lZChyKSB7CiAgICAgICAgcmV0dXJuIGxvZGFzaC5rZXlzKHIpLnNvcnQoY29tcGFyZVRhZ05hbWVzKTsKICAgIH0KICAgIC8qKiBHaXZlbiBhIFJ1blRvVGFnLCByZXR1cm4gYXJyYXkgb2YgYWxsIHRhZ3MgKHNvcnRlZCArIGRlZHVwJ2QpICovCiAgICBmdW5jdGlvbiBnZXRUYWdzKHIpIHsKICAgICAgICByZXR1cm4gbG9kYXNoLnVuaW9uLmFwcGx5KG51bGwsIGxvZGFzaC52YWx1ZXMocikpLnNvcnQoY29tcGFyZVRhZ05hbWVzKTsKICAgIH0KICAgIC8qKgogICAgICogR2l2ZW4gYSBSdW5Ub1RhZyBhbmQgYW4gYXJyYXkgb2YgcnVucywgcmV0dXJuIGV2ZXJ5IHRhZyB0aGF0IGFwcGVhcnMgZm9yCiAgICAgKiBhdCBsZWFzdCBvbmUgcnVuLgogICAgICogU29ydGVkLCBkZWR1cGxpY2F0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlclRhZ3MociwgcnVucykgewogICAgICAgIGxldCByZXN1bHQgPSBbXTsKICAgICAgICBydW5zLmZvckVhY2goKHgpID0+IChyZXN1bHQgPSByZXN1bHQuY29uY2F0KHJbeF0pKSk7CiAgICAgICAgcmV0dXJuIGxvZGFzaC51bmlxKHJlc3VsdCkuc29ydChjb21wYXJlVGFnTmFtZXMpOwogICAgfQoKICAgIC8qKgogICAgICogTWFuYWdlcyBtYW55IGZldGNoIHJlcXVlc3RzLiBMYXVuY2hlcyB1cCB0byBuU2ltdWx0YW5lb3VzUmVxdWVzdHMKICAgICAqIHNpbXVsdGFuZW91c2x5LCBhbmQgbWFpbnRhaW5zIGEgTElGTyBxdWV1ZSBvZiByZXF1ZXN0cyB0byBwcm9jZXNzIHdoZW4KICAgICAqIG1vcmUgdXJscyBhcmUgcmVxdWVzdGVkIHRoYW4gY2FuIGJlIGhhbmRsZWQgYXQgb25jZS4gVGhlIHF1ZXVlIGNhbiBiZQogICAgICogY2xlYXJlZC4KICAgICAqCiAgICAgKiBXaGVuIGEgcmVxdWVzdCBpcyBtYWRlLCBhIFByb21pc2UgaXMgcmV0dXJuZWQgd2hpY2ggcmVzb2x2ZXMgd2l0aCB0aGUKICAgICAqIHBhcnNlZCBKU09OIHJlc3VsdCBmcm9tIHRoZSByZXF1ZXN0LgogICAgICovCiAgICBjbGFzcyBSZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3InOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEludmFsaWRSZXF1ZXN0T3B0aW9uc0Vycm9yIGV4dGVuZHMgRXJyb3IgewogICAgICAgIGNvbnN0cnVjdG9yKG1zZykgewogICAgICAgICAgICBzdXBlcihtc2cpOwogICAgICAgICAgICB0aGlzLm5hbWUgPSAnSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3InOwogICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIG5lZWRlZCBkdWUgdG8gYSBsaW1pdGF0aW9uIG9mIFR5cGVTY3JpcHQgd2hlbgogICAgICAgICAgICAvLyBleHRlbmRpbmcgJ0Vycm9yJy4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvd2lraS9CcmVha2luZy1DaGFuZ2VzI2V4dGVuZGluZy1idWlsdC1pbnMtbGlrZS1lcnJvci1hcnJheS1hbmQtbWFwLW1heS1uby1sb25nZXItd29yawogICAgICAgICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGhpcywgSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IucHJvdG90eXBlKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBSZXF1ZXN0TmV0d29ya0Vycm9yIGV4dGVuZHMgRXJyb3IgewogICAgICAgIGNvbnN0cnVjdG9yKHJlcSwgdXJsKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGBSZXF1ZXN0TmV0d29ya0Vycm9yOiAke3JlcS5zdGF0dXN9IGF0ICR7dXJsfWA7CiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdSZXF1ZXN0TmV0d29ya0Vycm9yJzsKICAgICAgICAgICAgdGhpcy5yZXEgPSByZXE7CiAgICAgICAgICAgIHRoaXMudXJsID0gdXJsOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBUaGUgSFRUUCBtZXRob2QtdHlwZSB0byB1c2UuIEN1cnJlbnRseSBvbmx5ICdHRVQnIGFuZCAnUE9TVCcgYXJlCiAgICAgKiBzdXBwb3J0ZWQuCiAgICAgKi8KICAgIHZhciBIdHRwTWV0aG9kVHlwZTsKICAgIChmdW5jdGlvbiAoSHR0cE1ldGhvZFR5cGUpIHsKICAgICAgICBIdHRwTWV0aG9kVHlwZVsiR0VUIl0gPSAiR0VUIjsKICAgICAgICBIdHRwTWV0aG9kVHlwZVsiUE9TVCJdID0gIlBPU1QiOwogICAgfSkoSHR0cE1ldGhvZFR5cGUgfHwgKEh0dHBNZXRob2RUeXBlID0ge30pKTsKICAgIC8qKgogICAgICogSG9sZHMgb3B0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgSFRUUCByZXF1ZXN0LgogICAgICovCiAgICBjbGFzcyBSZXF1ZXN0T3B0aW9ucyB7CiAgICAgICAgLy8gVmFsaWRhdGVzIHRoaXMgb2JqZWN0LiBUaHJvd3MgSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3Igb24gZXJyb3IuCiAgICAgICAgdmFsaWRhdGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm1ldGhvZFR5cGUgPT09IEh0dHBNZXRob2RUeXBlLkdFVCkgewogICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYWxsb3cgYSBib2R5IGZvciBhIEdFVC4KICAgICAgICAgICAgICAgIGlmICh0aGlzLmJvZHkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IoJ2JvZHkgbXVzdCBiZSBtaXNzaW5nIGZvciBhIEdFVCByZXF1ZXN0LicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlIGFsbG93IGJvZHktbGVzcyBvciBjb250ZW50VHlwZS1sZXNzIFBPU1RzIGV2ZW4gaWYgdGhleSBkb24ndAogICAgICAgICAgICAvLyBtYWtlIG11Y2ggc2Vuc2UuCiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUmVxdWVzdE1hbmFnZXIgewogICAgICAgIGNvbnN0cnVjdG9yKG5TaW11bHRhbmVvdXNSZXF1ZXN0cyA9IDEwMDAsIG1heFJldHJpZXMgPSAzKSB7CiAgICAgICAgICAgIHRoaXMuX3F1ZXVlID0gW107CiAgICAgICAgICAgIHRoaXMuX25BY3RpdmVSZXF1ZXN0cyA9IDA7CiAgICAgICAgICAgIHRoaXMuX25TaW11bHRhbmVvdXNSZXF1ZXN0cyA9IG5TaW11bHRhbmVvdXNSZXF1ZXN0czsKICAgICAgICAgICAgdGhpcy5fbWF4UmV0cmllcyA9IG1heFJldHJpZXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVzIGEgcHJvbWlzZSB0aGF0IGxvYWRzIGFzc2V0cyBmcm9tIGdpdmVuIHVybCAocmVzcGVjdHMgcXVldWluZykuIElmCiAgICAgICAgICogcG9zdERhdGEgaXMgcHJvdmlkZWQsIHRoaXMgcmVxdWVzdCB3aWxsIHVzZSBQT1NULCBub3QgR0VULiBUaGlzIGlzIGFuCiAgICAgICAgICogb2JqZWN0IG1hcHBpbmcgUE9TVCBrZXlzIHRvIHN0cmluZyB2YWx1ZXMuCiAgICAgICAgICovCiAgICAgICAgcmVxdWVzdCh1cmwsIHBvc3REYXRhKSB7CiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gcmVxdWVzdE9wdGlvbnNGcm9tUG9zdERhdGEocG9zdERhdGEpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0V2l0aE9wdGlvbnModXJsLCByZXF1ZXN0T3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIHJlcXVlc3RXaXRoT3B0aW9ucyh1cmwsIHJlcXVlc3RPcHRpb25zKSB7CiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zLnZhbGlkYXRlKCk7CiAgICAgICAgICAgIGNvbnN0IHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IHsgcmVzb2x2ZTogcmVzb2x2ZSwgcmVqZWN0OiByZWplY3QgfTsKICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2gocmVzb2x2ZXIpOwogICAgICAgICAgICAgICAgdGhpcy5sYXVuY2hSZXF1ZXN0cygpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHVybCwgdGhpcy5fbWF4UmV0cmllcywgcmVxdWVzdE9wdGlvbnMpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBTdWNjZXNzIC0gTGV0J3MgZnJlZSBzcGFjZSBmb3IgYW5vdGhlciBhY3RpdmUKICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QsIGFuZCBsYXVuY2ggaXQKICAgICAgICAgICAgICAgIHRoaXMuX25BY3RpdmVSZXF1ZXN0cy0tOwogICAgICAgICAgICAgICAgdGhpcy5sYXVuY2hSZXF1ZXN0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlOwogICAgICAgICAgICB9LCAocmVqZWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocmVqZWN0aW9uLm5hbWUgPT09ICdSZXF1ZXN0TmV0d29ya0Vycm9yJykgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGZhaWxlZCBkdWUgdG8gbmV0d29yayBlcnJvciwgd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50CiAgICAgICAgICAgICAgICAgICAgLy8gX25BY3RpdmVSZXF1ZXN0cyBiZWNhdXNlIHRoaXMgcmVxdWVzdCB3YXMKICAgICAgICAgICAgICAgICAgICAvLyBhY3RpdmUKICAgICAgICAgICAgICAgICAgICB0aGlzLl9uQWN0aXZlUmVxdWVzdHMtLTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdW5jaFJlcXVlc3RzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QocmVqZWN0aW9uKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgIH0KICAgICAgICBmZXRjaCh1cmwsIGZldGNoT3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSB7IHJlc29sdmU6IHJlc29sdmUsIHJlamVjdDogcmVqZWN0IH07CiAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5wdXNoKHJlc29sdmVyKTsKICAgICAgICAgICAgICAgIHRoaXMubGF1bmNoUmVxdWVzdHMoKTsKICAgICAgICAgICAgfSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbnVtVHJpZXMgPSAxOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmV0cnlGZXRjaCA9ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2godXJsLCBmZXRjaE9wdGlvbnMpLnRoZW4oKHJlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3BvbnNlLm9rICYmIHRoaXMuX21heFJldHJpZXMgPiBudW1UcmllcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVRyaWVzKys7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0cnlGZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzcG9uc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbkFjdGl2ZVJlcXVlc3RzLS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxhdW5jaFJlcXVlc3RzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0cnlGZXRjaCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjbGVhclF1ZXVlKCkgewogICAgICAgICAgICB3aGlsZSAodGhpcy5fcXVldWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fcXVldWUKICAgICAgICAgICAgICAgICAgICAucG9wKCkKICAgICAgICAgICAgICAgICAgICAucmVqZWN0KG5ldyBSZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3IoJ1JlcXVlc3QgY2FuY2VsbGVkIGJ5IGNsZWFyUXVldWUnKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyogUmV0dXJuIG51bWJlciBvZiBjdXJyZW50bHkgcGVuZGluZyByZXF1ZXN0cyAqLwogICAgICAgIGFjdGl2ZVJlcXVlc3RzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzOwogICAgICAgIH0KICAgICAgICAvKiBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHJlcXVlc3RzIChpbmNsdWRlcyBxdWV1ZSkgKi8KICAgICAgICBvdXRzdGFuZGluZ1JlcXVlc3RzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbkFjdGl2ZVJlcXVlc3RzICsgdGhpcy5fcXVldWUubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBsYXVuY2hSZXF1ZXN0cygpIHsKICAgICAgICAgICAgd2hpbGUgKHRoaXMuX25BY3RpdmVSZXF1ZXN0cyA8IHRoaXMuX25TaW11bHRhbmVvdXNSZXF1ZXN0cyAmJgogICAgICAgICAgICAgICAgdGhpcy5fcXVldWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fbkFjdGl2ZVJlcXVlc3RzKys7CiAgICAgICAgICAgICAgICB0aGlzLl9xdWV1ZS5wb3AoKS5yZXNvbHZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVHJ5IHRvIHJlcXVlc3QgYSBnaXZlbiBVUkwgdXNpbmcgb3ZlcndyaXRhYmxlIF9wcm9taXNlRnJvbVVybCBtZXRob2QuCiAgICAgICAgICogSWYgdGhlIHJlcXVlc3QgZmFpbHMgZm9yIGFueSByZWFzb24sIHdlIHdpbGwgcmV0cnkgdXAgdG8gbWF4UmV0cmllcwogICAgICAgICAqIHRpbWVzLiBJbiBwcmFjdGljZSwgdGhpcyB3aWxsIGhlbHAgdXMgcGFwZXIgb3ZlciB0cmFuc2llbnQgbmV0d29yayBpc3N1ZXMKICAgICAgICAgKiBsaWtlICc1MDIgQmFkIEdhdGV3YXknLgogICAgICAgICAqIEJ5IGRlZmF1bHQsIENocm9tZSBkaXNwbGF5cyBuZXR3b3JrIGVycm9ycyBpbiBjb25zb2xlLCBzbwogICAgICAgICAqIHRoZSB1c2VyIHdpbGwgYmUgYWJsZSB0byB0ZWxsIHdoZW4gdGhlIHJlcXVlc3RzIGFyZSBmYWlsaW5nLiBJIHRoaW5rIHRoaXMKICAgICAgICAgKiBpcyBhIGZlYXR1cmUsIGlmIHRoZSByZXF1ZXN0IGZhaWx1cmVzIGFuZCByZXRyaWVzIGFyZSBjYXVzaW5nIGFueQogICAgICAgICAqIHBhaW4gdG8gdXNlcnMsIHRoZXkgY2FuIHNlZSBpdCBhbmQgZmlsZSBpc3N1ZXMuCiAgICAgICAgICovCiAgICAgICAgcHJvbWlzZVdpdGhSZXRyaWVzKHVybCwgbWF4UmV0cmllcywgcmVxdWVzdE9wdGlvbnMpIHsKICAgICAgICAgICAgdmFyIHN1Y2Nlc3MgPSAoeCkgPT4geDsKICAgICAgICAgICAgdmFyIGZhaWx1cmUgPSAoeCkgPT4gewogICAgICAgICAgICAgICAgaWYgKG1heFJldHJpZXMgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJvbWlzZVdpdGhSZXRyaWVzKHVybCwgbWF4UmV0cmllcyAtIDEsIHJlcXVlc3RPcHRpb25zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb21pc2VGcm9tVXJsKHVybCwgcmVxdWVzdE9wdGlvbnMpLnRoZW4oc3VjY2VzcywgZmFpbHVyZSk7CiAgICAgICAgfQogICAgICAgIC8qIEFjdHVhbGx5IGdldCBwcm9taXNlIGZyb20gdXJsIHVzaW5nIFhNTEh0dHBSZXF1ZXN0ICovCiAgICAgICAgX3Byb21pc2VGcm9tVXJsKHVybCwgcmVxdWVzdE9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJlcSA9IGJ1aWxkWE1MSHR0cFJlcXVlc3QocmVxdWVzdE9wdGlvbnMubWV0aG9kVHlwZSwgdXJsLCByZXF1ZXN0T3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsIHJlcXVlc3RPcHRpb25zLmNvbnRlbnRUeXBlKTsKICAgICAgICAgICAgICAgIHJlcS5vbmxvYWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5zdGF0dXMgPT09IDIwMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKEpTT04ucGFyc2UocmVxLnJlc3BvbnNlVGV4dCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBSZXF1ZXN0TmV0d29ya0Vycm9yKHJlcSwgdXJsKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJlcS5vbmVycm9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJlamVjdChuZXcgUmVxdWVzdE5ldHdvcmtFcnJvcihyZXEsIHVybCkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0T3B0aW9ucy5ib2R5KSB7CiAgICAgICAgICAgICAgICAgICAgcmVxLnNlbmQocmVxdWVzdE9wdGlvbnMuYm9keSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXEuc2VuZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZFhNTEh0dHBSZXF1ZXN0KG1ldGhvZFR5cGUsIHVybCwgd2l0aENyZWRlbnRpYWxzLCBjb250ZW50VHlwZSkgewogICAgICAgIGNvbnN0IHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICAgIHJlcS5vcGVuKG1ldGhvZFR5cGUsIHVybCk7CiAgICAgICAgaWYgKHdpdGhDcmVkZW50aWFscykgewogICAgICAgICAgICByZXEud2l0aENyZWRlbnRpYWxzID0gd2l0aENyZWRlbnRpYWxzOwogICAgICAgIH0KICAgICAgICBpZiAoY29udGVudFR5cGUpIHsKICAgICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsIGNvbnRlbnRUeXBlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlcTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlcXVlc3RPcHRpb25zRnJvbVBvc3REYXRhKHBvc3REYXRhKSB7CiAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7CiAgICAgICAgaWYgKCFwb3N0RGF0YSkgewogICAgICAgICAgICByZXN1bHQubWV0aG9kVHlwZSA9IEh0dHBNZXRob2RUeXBlLkdFVDsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmVzdWx0Lm1ldGhvZFR5cGUgPSBIdHRwTWV0aG9kVHlwZS5QT1NUOwogICAgICAgIHJlc3VsdC5ib2R5ID0gZm9ybURhdGFGcm9tRGljdGlvbmFyeShwb3N0RGF0YSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbURpY3Rpb25hcnkocG9zdERhdGEpIHsKICAgICAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpOwogICAgICAgIGZvciAoY29uc3QgW2tleSwgbWF5YmVWYWx1ZXNdIG9mIE9iamVjdC5lbnRyaWVzKHBvc3REYXRhKSkgewogICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBBcnJheS5pc0FycmF5KG1heWJlVmFsdWVzKSA/IG1heWJlVmFsdWVzIDogW21heWJlVmFsdWVzXTsKICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiB2YWx1ZXMpIHsKICAgICAgICAgICAgICAgIGZvcm1EYXRhLmFwcGVuZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZm9ybURhdGE7CiAgICB9CgogICAgY29uc3QgRVhQRVJJTUVOVEFMX1BMVUdJTlNfUVVFUllfUEFSQU0gPSAnZXhwZXJpbWVudGFsUGx1Z2luJzsKICAgIC8qKgogICAgICogU2F2ZSB0aGUgaW5pdGlhbCBVUkwgcXVlcnkgcGFyYW1zLCBiZWZvcmUgdGhlIEFwcFJvdXRpbmdFZmZlY3RzIGluaXRpYWxpemUsCiAgICAgKiBhbmQgYmVmb3JlIGNyZWF0aW5nIHRoZSByb3V0ZXIuCiAgICAgKi8KICAgIGNvbnN0IGluaXRpYWxVUkxTZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpOwogICAgbGV0IF9yb3V0ZXIgPSBjcmVhdGVSb3V0ZXIoKTsKICAgIC8qKgogICAgICogQ3JlYXRlIGEgcm91dGVyIGZvciBjb21tdW5pY2F0aW5nIHdpdGggdGhlIFRlbnNvckJvYXJkIGJhY2tlbmQuIFlvdQogICAgICogY2FuIHBhc3MgdGhpcyB0byBgc2V0Um91dGVyYCB0byBtYWtlIGl0IHRoZSBnbG9iYWwgcm91dGVyLgogICAgICoKICAgICAqIEBwYXJhbSBkYXRhRGlyIHtzdHJpbmc9fSBUaGUgYmFzZSBwcmVmaXggZm9yIGRhdGEgZW5kcG9pbnRzLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVSb3V0ZXIoZGF0YURpciA9ICdkYXRhJywgdXJsU2VhcmNoUGFyYW1zID0gaW5pdGlhbFVSTFNlYXJjaFBhcmFtcykgewogICAgICAgIGlmIChkYXRhRGlyW2RhdGFEaXIubGVuZ3RoIC0gMV0gPT09ICcvJykgewogICAgICAgICAgICBkYXRhRGlyID0gZGF0YURpci5zbGljZSgwLCBkYXRhRGlyLmxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBlbnZpcm9ubWVudDogKCkgPT4gY3JlYXRlRGF0YVBhdGgoZGF0YURpciwgJy9lbnZpcm9ubWVudCcpLAogICAgICAgICAgICBleHBlcmltZW50czogKCkgPT4gY3JlYXRlRGF0YVBhdGgoZGF0YURpciwgJy9leHBlcmltZW50cycpLAogICAgICAgICAgICBwbHVnaW5Sb3V0ZTogKHBsdWdpbk5hbWUsIHJvdXRlLCBwYXJhbXMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVEYXRhUGF0aChkYXRhRGlyICsgJy9wbHVnaW4nLCBgLyR7cGx1Z2luTmFtZX0ke3JvdXRlfWAsIHBhcmFtcyk7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHBsdWdpbnNMaXN0aW5nOiAoKSA9PiBjcmVhdGVEYXRhUGF0aChkYXRhRGlyLCAnL3BsdWdpbnNfbGlzdGluZycsIGNyZWF0ZVNlYXJjaFBhcmFtKHsKICAgICAgICAgICAgICAgIFtFWFBFUklNRU5UQUxfUExVR0lOU19RVUVSWV9QQVJBTV06IHVybFNlYXJjaFBhcmFtcy5nZXRBbGwoRVhQRVJJTUVOVEFMX1BMVUdJTlNfUVVFUllfUEFSQU0pLAogICAgICAgICAgICB9KSksCiAgICAgICAgICAgIHJ1bnM6ICgpID0+IGNyZWF0ZURhdGFQYXRoKGRhdGFEaXIsICcvcnVucycpLAogICAgICAgICAgICBydW5zRm9yRXhwZXJpbWVudDogKGlkKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRGF0YVBhdGgoZGF0YURpciwgJy9leHBlcmltZW50X3J1bnMnLCBjcmVhdGVTZWFyY2hQYXJhbSh7IGV4cGVyaW1lbnQ6IFN0cmluZyhpZCkgfSkpOwogICAgICAgICAgICB9LAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4ge1JvdXRlcn0gdGhlIGdsb2JhbCByb3V0ZXIKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Um91dGVyKCkgewogICAgICAgIHJldHVybiBfcm91dGVyOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgdGhlIGdsb2JhbCByb3V0ZXIsIHRvIGJlIHJldHVybmVkIGJ5IGZ1dHVyZSBjYWxscyB0byBgZ2V0Um91dGVyYC4KICAgICAqIFlvdSBtYXkgd2lzaCB0byBpbnZva2UgdGhpcyBpZiB5b3UgYXJlIHJ1bm5pbmcgYSBkZW1vIHNlcnZlciB3aXRoIGEKICAgICAqIGN1c3RvbSBwYXRoIHByZWZpeCwgb3IgaWYgeW91IGhhdmUgY3VzdG9taXplZCB0aGUgVGVuc29yQm9hcmQgYmFja2VuZAogICAgICogdG8gdXNlIGEgZGlmZmVyZW50IHBhdGguCiAgICAgKgogICAgICogQHBhcmFtIHtSb3V0ZXJ9IHJvdXRlciB0aGUgbmV3IGdsb2JhbCByb3V0ZXIKICAgICAqLwogICAgZnVuY3Rpb24gc2V0Um91dGVyKHJvdXRlcikgewogICAgICAgIGlmIChyb3V0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1JvdXRlciByZXF1aXJlZCwgYnV0IGdvdDogJyArIHJvdXRlcik7CiAgICAgICAgfQogICAgICAgIF9yb3V0ZXIgPSByb3V0ZXI7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVEYXRhUGF0aChkYXRhRGlyLCByb3V0ZSwgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpKSB7CiAgICAgICAgbGV0IHJlbGF0aXZlUGF0aCA9IGRhdGFEaXIgKyByb3V0ZTsKICAgICAgICBpZiAoU3RyaW5nKHBhcmFtcykpIHsKICAgICAgICAgICAgY29uc3QgZGVsaW1pdGVyID0gcm91dGUuaW5jbHVkZXMoJz8nKSA/ICcmJyA6ICc/JzsKICAgICAgICAgICAgcmVsYXRpdmVQYXRoICs9IGRlbGltaXRlciArIFN0cmluZyhwYXJhbXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoOwogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlU2VhcmNoUGFyYW0ocGFyYW1zID0ge30pIHsKICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMocGFyYW1zKQogICAgICAgICAgICAuc29ydCgpCiAgICAgICAgICAgIC5maWx0ZXIoKGspID0+IHBhcmFtc1trXSk7CiAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgIGtleXMuZm9yRWFjaCgoa2V5KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHBhcmFtc1trZXldOwogICAgICAgICAgICBjb25zdCBhcnJheSA9IEFycmF5LmlzQXJyYXkodmFsdWVzKSA/IHZhbHVlcyA6IFt2YWx1ZXNdOwogICAgICAgICAgICBhcnJheS5mb3JFYWNoKCh2YWwpID0+IHNlYXJjaFBhcmFtcy5hcHBlbmQoa2V5LCB2YWwpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc2VhcmNoUGFyYW1zOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE3IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgdmFyIENhdGVnb3J5VHlwZTsKICAgIChmdW5jdGlvbiAoQ2F0ZWdvcnlUeXBlKSB7CiAgICAgICAgQ2F0ZWdvcnlUeXBlW0NhdGVnb3J5VHlwZVsiU0VBUkNIX1JFU1VMVFMiXSA9IDBdID0gIlNFQVJDSF9SRVNVTFRTIjsKICAgICAgICBDYXRlZ29yeVR5cGVbQ2F0ZWdvcnlUeXBlWyJQUkVGSVhfR1JPVVAiXSA9IDFdID0gIlBSRUZJWF9HUk9VUCI7CiAgICB9KShDYXRlZ29yeVR5cGUgfHwgKENhdGVnb3J5VHlwZSA9IHt9KSk7CiAgICAvKioKICAgICAqIENvbXB1dGUgYSBjYXRlZ29yeSBjb250YWluaW5nIHRoZSBzZWFyY2ggcmVzdWx0cyBmb3IgdGhlIGdpdmVuIHF1ZXJ5LgogICAgICovCiAgICBmdW5jdGlvbiBjYXRlZ29yaXplQnlTZWFyY2hRdWVyeSh4cywgcXVlcnkpIHsKICAgICAgICBjb25zdCByZSA9ICgoKSA9PiB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChxdWVyeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfSkoKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBuYW1lOiBxdWVyeSwKICAgICAgICAgICAgbWV0YWRhdGE6IHsKICAgICAgICAgICAgICAgIHR5cGU6IENhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUywKICAgICAgICAgICAgICAgIHZhbGlkUmVnZXg6ICEhcmUsCiAgICAgICAgICAgICAgICB1bml2ZXJzYWxSZWdleDogcXVlcnkgPT09ICcuKicsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGl0ZW1zOiByZSA/IHhzLmZpbHRlcigoeCkgPT4geC5tYXRjaChyZSkpIDogW10sCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgcXVvdGllbnQgc2V0ICRYL3tcc2ltfSQsIHdoZXJlICRhIFxzaW0gYiQgaWYgJGEkIGFuZCAkYiQKICAgICAqIHNoYXJlIGEgY29tbW9uIGBzZXBhcmF0b3JgLXByZWZpeC4gT3JkZXIgaXMgcHJlc2VydmVkLgogICAgICovCiAgICBmdW5jdGlvbiBjYXRlZ29yaXplQnlQcmVmaXgoeHMsIHNlcGFyYXRvciA9ICcvJykgewogICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBbXTsKICAgICAgICBjb25zdCBjYXRlZ29yaWVzQnlOYW1lID0ge307CiAgICAgICAgeHMuZm9yRWFjaCgoeCkgPT4gewogICAgICAgICAgICBjb25zdCBpbmRleCA9IHguaW5kZXhPZihzZXBhcmF0b3IpOwogICAgICAgICAgICBjb25zdCBuYW1lID0gaW5kZXggPj0gMCA/IHguc2xpY2UoMCwgaW5kZXgpIDogeDsKICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzQnlOYW1lW25hbWVdKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjYXRlZ29yeSA9IHsKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiB7IHR5cGU6IENhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAgfSwKICAgICAgICAgICAgICAgICAgICBpdGVtczogW10sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgY2F0ZWdvcmllc0J5TmFtZVtuYW1lXSA9IGNhdGVnb3J5OwogICAgICAgICAgICAgICAgY2F0ZWdvcmllcy5wdXNoKGNhdGVnb3J5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRlZ29yaWVzQnlOYW1lW25hbWVdLml0ZW1zLnB1c2goeCk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGNhdGVnb3JpZXM7CiAgICB9CiAgICAvKgogICAgICogQ29tcHV0ZSB0aGUgc3RhbmRhcmQgY2F0ZWdvcml6YXRpb24gb2YgdGhlIGdpdmVuIGlucHV0LCBpbmNsdWRpbmcKICAgICAqIGJvdGggc2VhcmNoIGNhdGVnb3JpZXMgYW5kIHByZWZpeCBjYXRlZ29yaWVzLgogICAgICovCiAgICBmdW5jdGlvbiBjYXRlZ29yaXplKHhzLCBxdWVyeSA9ICcnKSB7CiAgICAgICAgY29uc3QgYnlGaWx0ZXIgPSBbY2F0ZWdvcml6ZUJ5U2VhcmNoUXVlcnkoeHMsIHF1ZXJ5KV07CiAgICAgICAgY29uc3QgYnlQcmVmaXggPSBjYXRlZ29yaXplQnlQcmVmaXgoeHMpOwogICAgICAgIHJldHVybiBbXS5jb25jYXQoYnlGaWx0ZXIsIGJ5UHJlZml4KTsKICAgIH0KICAgIGZ1bmN0aW9uIGNhdGVnb3JpemVUYWdzKHJ1blRvVGFnLCBzZWxlY3RlZFJ1bnMsIHF1ZXJ5KSB7CiAgICAgICAgY29uc3QgdGFncyA9IGdldFRhZ3MocnVuVG9UYWcpOwogICAgICAgIGNvbnN0IGNhdGVnb3JpZXMgPSBjYXRlZ29yaXplKHRhZ3MsIHF1ZXJ5KTsKICAgICAgICBjb25zdCB0YWdUb1J1bnMgPSBjcmVhdGVUYWdUb1J1bnMobG9kYXNoLnBpY2socnVuVG9UYWcsIHNlbGVjdGVkUnVucykpOwogICAgICAgIHJldHVybiBjYXRlZ29yaWVzLm1hcCgoeyBuYW1lLCBtZXRhZGF0YSwgaXRlbXMgfSkgPT4gKHsKICAgICAgICAgICAgbmFtZSwKICAgICAgICAgICAgbWV0YWRhdGEsCiAgICAgICAgICAgIGl0ZW1zOiBpdGVtcy5tYXAoKHRhZykgPT4gKHsKICAgICAgICAgICAgICAgIHRhZywKICAgICAgICAgICAgICAgIHJ1bnM6ICh0YWdUb1J1bnMuZ2V0KHRhZykgfHwgW10pLnNsaWNlKCksCiAgICAgICAgICAgIH0pKSwKICAgICAgICB9KSk7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVUYWdUb1J1bnMocnVuVG9UYWcpIHsKICAgICAgICBjb25zdCB0YWdUb1J1biA9IG5ldyBNYXAoKTsKICAgICAgICBPYmplY3Qua2V5cyhydW5Ub1RhZykuZm9yRWFjaCgocnVuKSA9PiB7CiAgICAgICAgICAgIHJ1blRvVGFnW3J1bl0uZm9yRWFjaCgodGFnKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBydW5zID0gdGFnVG9SdW4uZ2V0KHRhZykgfHwgW107CiAgICAgICAgICAgICAgICBydW5zLnB1c2gocnVuKTsKICAgICAgICAgICAgICAgIHRhZ1RvUnVuLnNldCh0YWcsIHJ1bnMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdGFnVG9SdW47CiAgICB9CiAgICBmdW5jdGlvbiBjb21wYXJlVGFnUnVuKGEsIGIpIHsKICAgICAgICBjb25zdCBjID0gY29tcGFyZVRhZ05hbWVzKGEudGFnLCBiLnRhZyk7CiAgICAgICAgaWYgKGMgIT0gMCkgewogICAgICAgICAgICByZXR1cm4gYzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbXBhcmVUYWdOYW1lcyhhLnJ1biwgYi5ydW4pOwogICAgfQogICAgZnVuY3Rpb24gY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhydW5Ub1RhZywgc2VsZWN0ZWRSdW5zLCBxdWVyeSkgewogICAgICAgIGNvbnN0IHRhZ0NhdGVnb3JpZXMgPSBjYXRlZ29yaXplVGFncyhydW5Ub1RhZywgc2VsZWN0ZWRSdW5zLCBxdWVyeSk7CiAgICAgICAgZnVuY3Rpb24gZXhwbG9kZUNhdGVnb3J5KHRhZ0NhdGVnb3J5KSB7CiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gbG9kYXNoLmZsYXR0ZW4odGFnQ2F0ZWdvcnkuaXRlbXMubWFwKCh7IHRhZywgcnVucyB9KSA9PiBydW5zLm1hcCgocnVuKSA9PiAoeyB0YWcsIHJ1biB9KSkpKTsKICAgICAgICAgICAgaXRlbXMuc29ydChjb21wYXJlVGFnUnVuKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5hbWU6IHRhZ0NhdGVnb3J5Lm5hbWUsCiAgICAgICAgICAgICAgICBtZXRhZGF0YTogdGFnQ2F0ZWdvcnkubWV0YWRhdGEsCiAgICAgICAgICAgICAgICBpdGVtcywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhZ0NhdGVnb3JpZXMubWFwKGV4cGxvZGVDYXRlZ29yeSk7CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCBsaWZlY3ljbGVQcm9wcyA9IHsKICAgICAgYXR0YWNoZWQ6IHRydWUsCiAgICAgIGRldGFjaGVkOiB0cnVlLAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgY3JlYXRlZDogdHJ1ZSwKICAgICAgYmVmb3JlUmVnaXN0ZXI6IHRydWUsCiAgICAgIHJlZ2lzdGVyZWQ6IHRydWUsCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWQ6IHRydWUsCiAgICAgIGxpc3RlbmVyczogdHJ1ZSwKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHRydWUKICAgIH07CgogICAgY29uc3QgZXhjbHVkZU9uSW5mbyA9IHsKICAgICAgYXR0YWNoZWQ6IHRydWUsCiAgICAgIGRldGFjaGVkOiB0cnVlLAogICAgICByZWFkeTogdHJ1ZSwKICAgICAgY3JlYXRlZDogdHJ1ZSwKICAgICAgYmVmb3JlUmVnaXN0ZXI6IHRydWUsCiAgICAgIHJlZ2lzdGVyZWQ6IHRydWUsCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWQ6IHRydWUsCiAgICAgIGJlaGF2aW9yczogdHJ1ZSwKICAgICAgX25vQWNjZXNzb3JzOiB0cnVlCiAgICB9OwoKICAgIGNvbnN0IGV4Y2x1ZGVPbkJlaGF2aW9ycyA9IE9iamVjdC5hc3NpZ24oewogICAgICBsaXN0ZW5lcnM6IHRydWUsCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB0cnVlLAogICAgICBwcm9wZXJ0aWVzOiB0cnVlLAogICAgICBvYnNlcnZlcnM6IHRydWUsCiAgICB9LCBleGNsdWRlT25JbmZvKTsKCiAgICBmdW5jdGlvbiBjb3B5UHJvcGVydGllcyhzb3VyY2UsIHRhcmdldCwgZXhjbHVkZVByb3BzKSB7CiAgICAgIGNvbnN0IG5vQWNjZXNzb3JzID0gc291cmNlLl9ub0FjY2Vzc29yczsKICAgICAgY29uc3QgcHJvcGVydHlOYW1lcyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHNvdXJjZSk7CiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvcGVydHlOYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgIGxldCBwID0gcHJvcGVydHlOYW1lc1tpXTsKICAgICAgICBpZiAocCBpbiBleGNsdWRlUHJvcHMpIHsKICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgIH0KICAgICAgICBpZiAobm9BY2Nlc3NvcnMpIHsKICAgICAgICAgIHRhcmdldFtwXSA9IHNvdXJjZVtwXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGV0IHBkID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihzb3VyY2UsIHApOwogICAgICAgICAgaWYgKHBkKSB7CiAgICAgICAgICAgIC8vIGVuc3VyZSBwcm9wZXJ0eSBpcyBjb25maWd1cmFibGUgc28gdGhhdCBhIGxhdGVyIGJlaGF2aW9yIGNhbgogICAgICAgICAgICAvLyByZS1jb25maWd1cmUgaXQuCiAgICAgICAgICAgIHBkLmNvbmZpZ3VyYWJsZSA9IHRydWU7CiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIHAsIHBkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEFwcGxpZXMgYSAibGVnYWN5IiBiZWhhdmlvciBvciBhcnJheSBvZiBiZWhhdmlvcnMgdG8gdGhlIHByb3ZpZGVkIGNsYXNzLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgbWV0aG9kIHdpbGwgYXV0b21hdGljYWxseSBhbHNvIGFwcGx5IHRoZSBgTGVnYWN5RWxlbWVudE1peGluYAogICAgICogdG8gZW5zdXJlIHRoYXQgYW55IGxlZ2FjeSBiZWhhdmlvcnMgY2FuIHJlbHkgb24gbGVnYWN5IFBvbHltZXIgQVBJIG9uCiAgICAgKiB0aGUgdW5kZXJseWluZyBlbGVtZW50LgogICAgICoKICAgICAqIEBmdW5jdGlvbgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7IU9iamVjdHwhQXJyYXk8IU9iamVjdD59IGJlaGF2aW9ycyBCZWhhdmlvciBvYmplY3Qgb3IgYXJyYXkgb2YgYmVoYXZpb3JzLgogICAgICogQHBhcmFtIHtmdW5jdGlvbihuZXc6VCl9IGtsYXNzIEVsZW1lbnQgY2xhc3MuCiAgICAgKiBAcmV0dXJuIHs/fSBSZXR1cm5zIGEgbmV3IEVsZW1lbnQgY2xhc3MgZXh0ZW5kZWQgYnkgdGhlCiAgICAgKiBwYXNzZWQgaW4gYGJlaGF2aW9yc2AgYW5kIGFsc28gYnkgYExlZ2FjeUVsZW1lbnRNaXhpbmAuCiAgICAgKiBAc3VwcHJlc3Mge2ludmFsaWRDYXN0cywgY2hlY2tUeXBlc30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5CZWhhdmlvcnMoYmVoYXZpb3JzLCBrbGFzcykgewogICAgICByZXR1cm4gR2VuZXJhdGVDbGFzc0Zyb21JbmZvKHt9LCBMZWdhY3lFbGVtZW50TWl4aW4oa2xhc3MpLCBiZWhhdmlvcnMpOwogICAgfQoKICAgIC8vIE5PVEU6CiAgICAvLyAxLngKICAgIC8vIEJlaGF2aW9ycyB3ZXJlIG1peGVkIGluICppbiByZXZlcnNlIG9yZGVyKiBhbmQgZGUtZHVwZWQgb24gdGhlIGZseS4KICAgIC8vIFRoZSBydWxlIHdhcyB0aGF0IGJlaGF2aW9yIHByb3BlcnRpZXMgd2VyZSBjb3BpZWQgb250byB0aGUgZWxlbWVudAogICAgLy8gcHJvdG90eXBlIGlmIGFuZCBvbmx5IGlmIHRoZSBwcm9wZXJ0eSBkaWQgbm90IGFscmVhZHkgZXhpc3QuCiAgICAvLyBHaXZlbjogUG9seW1lcnsgYmVoYXZpb3JzOiBbQSwgQiwgQywgQSwgQl19LCBwcm9wZXJ0eSBjb3B5IG9yZGVyIHdhczoKICAgIC8vICgxKSwgQiwgKDIpLCBBLCAoMykgQy4gVGhpcyBtZWFucyBwcm90b3R5cGUgcHJvcGVydGllcyB3aW4gb3ZlcgogICAgLy8gQiBwcm9wZXJ0aWVzIHdpbiBvdmVyIEEgd2luIG92ZXIgQy4gVGhpcyBtaXJyb3JzIHdoYXQgd291bGQgaGFwcGVuCiAgICAvLyB3aXRoIGluaGVyaXRhbmNlIGlmIGVsZW1lbnQgZXh0ZW5kZWQgQiBleHRlbmRlZCBBIGV4dGVuZGVkIEMuCiAgICAvLwogICAgLy8gQWdhaW4gZ2l2ZW4sIFBvbHltZXJ7IGJlaGF2aW9yczogW0EsIEIsIEMsIEEsIEJdfSwgdGhlIHJlc3VsdGluZwogICAgLy8gYGJlaGF2aW9yc2AgYXJyYXkgd2FzIFtDLCBBLCBCXS4KICAgIC8vIEJlaGF2aW9yIGxpZmVjeWNsZSBtZXRob2RzIHdlcmUgY2FsbGVkIGluIGJlaGF2aW9yIGFycmF5IG9yZGVyCiAgICAvLyBmb2xsb3dlZCBieSB0aGUgZWxlbWVudCwgZS5nLiAoMSkgQy5jcmVhdGVkLCAoMikgQS5jcmVhdGVkLAogICAgLy8gKDMpIEIuY3JlYXRlZCwgKDQpIGVsZW1lbnQuY3JlYXRlZC4gVGhlcmUgd2FzIG5vIHN1cHBvcnQgZm9yCiAgICAvLyBzdXBlciwgYW5kICJzdXBlci1iZWhhdmlvciIgbWV0aG9kcyB3ZXJlIGNhbGxhYmxlIG9ubHkgYnkgbmFtZSkuCiAgICAvLwogICAgLy8gMi54CiAgICAvLyBCZWhhdmlvcnMgYXJlIG1hZGUgaW50byBwcm9wZXIgbWl4aW5zIHdoaWNoIGxpdmUgaW4gdGhlCiAgICAvLyBlbGVtZW50J3MgcHJvdG90eXBlIGNoYWluLiBCZWhhdmlvcnMgYXJlIHBsYWNlZCBpbiB0aGUgZWxlbWVudCBwcm90b3R5cGUKICAgIC8vIGVsZGVzdCB0byB5b3VuZ2VzdCBhbmQgZGUtZHVwZWQgeW91bmdlc3QgdG8gb2xkZXN0OgogICAgLy8gU28sIGZpcnN0IFtBLCBCLCBDLCBBLCBCXSBiZWNvbWVzIFtDLCBBLCBCXSB0aGVuLAogICAgLy8gdGhlIGVsZW1lbnQgcHJvdG90eXBlIGJlY29tZXMgKG9sZGVzdCkgKDEpIFBvbHltZXJFbGVtZW50LCAoMikgY2xhc3MoQyksCiAgICAvLyAoMykgY2xhc3MoQSksICg0KSBjbGFzcyhCKSwgKDUpIGNsYXNzKFBvbHltZXIoey4uLn0pKS4KICAgIC8vIFJlc3VsdDoKICAgIC8vIFRoaXMgbWVhbnMgZWxlbWVudCBwcm9wZXJ0aWVzIHdpbiBvdmVyIEIgcHJvcGVydGllcyB3aW4gb3ZlciBBIHdpbgogICAgLy8gb3ZlciBDLiAoc2FtZSBhcyAxLngpCiAgICAvLyBJZiBsaWZlY3ljbGUgaXMgY2FsbGVkIChzdXBlciB0aGVuIG1lKSwgb3JkZXIgaXMKICAgIC8vICgxKSBDLmNyZWF0ZWQsICgyKSBBLmNyZWF0ZWQsICgzKSBCLmNyZWF0ZWQsICg0KSBlbGVtZW50LmNyZWF0ZWQKICAgIC8vIChhZ2FpbiBzYW1lIGFzIDEueCkKICAgIGZ1bmN0aW9uIGFwcGx5QmVoYXZpb3JzKHByb3RvLCBiZWhhdmlvcnMsIGxpZmVjeWNsZSkgewogICAgICBmb3IgKGxldCBpPTA7IGk8YmVoYXZpb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgYXBwbHlJbmZvKHByb3RvLCBiZWhhdmlvcnNbaV0sIGxpZmVjeWNsZSwgZXhjbHVkZU9uQmVoYXZpb3JzKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGFwcGx5SW5mbyhwcm90bywgaW5mbywgbGlmZWN5Y2xlLCBleGNsdWRlUHJvcHMpIHsKICAgICAgY29weVByb3BlcnRpZXMoaW5mbywgcHJvdG8sIGV4Y2x1ZGVQcm9wcyk7CiAgICAgIGZvciAobGV0IHAgaW4gbGlmZWN5Y2xlUHJvcHMpIHsKICAgICAgICBpZiAoaW5mb1twXSkgewogICAgICAgICAgbGlmZWN5Y2xlW3BdID0gbGlmZWN5Y2xlW3BdIHx8IFtdOwogICAgICAgICAgbGlmZWN5Y2xlW3BdLnB1c2goaW5mb1twXSk7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAcGFyYW0ge0FycmF5fSBiZWhhdmlvcnMgTGlzdCBvZiBiZWhhdmlvcnMgdG8gZmxhdHRlbi4KICAgICAqIEBwYXJhbSB7QXJyYXk9fSBsaXN0IFRhcmdldCBsaXN0IHRvIGZsYXR0ZW4gYmVoYXZpb3JzIGludG8uCiAgICAgKiBAcGFyYW0ge0FycmF5PX0gZXhjbHVkZSBMaXN0IG9mIGJlaGF2aW9ycyB0byBleGNsdWRlIGZyb20gdGhlIGxpc3QuCiAgICAgKiBAcmV0dXJuIHshQXJyYXl9IFJldHVybnMgdGhlIGxpc3Qgb2YgZmxhdHRlbmVkIGJlaGF2aW9ycy4KICAgICAqLwogICAgZnVuY3Rpb24gZmxhdHRlbkJlaGF2aW9ycyhiZWhhdmlvcnMsIGxpc3QsIGV4Y2x1ZGUpIHsKICAgICAgbGlzdCA9IGxpc3QgfHwgW107CiAgICAgIGZvciAobGV0IGk9YmVoYXZpb3JzLmxlbmd0aC0xOyBpID49IDA7IGktLSkgewogICAgICAgIGxldCBiID0gYmVoYXZpb3JzW2ldOwogICAgICAgIGlmIChiKSB7CiAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShiKSkgewogICAgICAgICAgICBmbGF0dGVuQmVoYXZpb3JzKGIsIGxpc3QpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gZGVkdXAKICAgICAgICAgICAgaWYgKGxpc3QuaW5kZXhPZihiKSA8IDAgJiYgKCFleGNsdWRlIHx8IGV4Y2x1ZGUuaW5kZXhPZihiKSA8IDApKSB7CiAgICAgICAgICAgICAgbGlzdC51bnNoaWZ0KGIpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGNvbnNvbGUud2FybignYmVoYXZpb3IgaXMgbnVsbCwgY2hlY2sgZm9yIG1pc3Npbmcgb3IgNDA0IGltcG9ydCcpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbGlzdDsKICAgIH0KCiAgICAvKioKICAgICAqIENvcGllcyBwcm9wZXJ0eSBkZXNjcmlwdG9ycyBmcm9tIHNvdXJjZSB0byB0YXJnZXQsIG92ZXJ3cml0aW5nIGFsbCBmaWVsZHMKICAgICAqIG9mIGFueSBwcmV2aW91cyBkZXNjcmlwdG9yIGZvciBhIHByb3BlcnR5ICpleGNlcHQqIGZvciBgdmFsdWVgLCB3aGljaCBpcwogICAgICogbWVyZ2VkIGluIGZyb20gdGhlIHRhcmdldCBpZiBpdCBkb2VzIG5vdCBleGlzdCBvbiB0aGUgc291cmNlLgogICAgICoKICAgICAqIEBwYXJhbSB7Kn0gdGFyZ2V0IFRhcmdldCBwcm9wZXJ0aWVzIG9iamVjdAogICAgICogQHBhcmFtIHsqfSBzb3VyY2UgU291cmNlIHByb3BlcnRpZXMgb2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lcmdlUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkgewogICAgICBmb3IgKGNvbnN0IHAgaW4gc291cmNlKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0SW5mbyA9IHRhcmdldFtwXTsKICAgICAgICBjb25zdCBzb3VyY2VJbmZvID0gc291cmNlW3BdOwogICAgICAgIGlmICghKCd2YWx1ZScgaW4gc291cmNlSW5mbykgJiYgdGFyZ2V0SW5mbyAmJiAoJ3ZhbHVlJyBpbiB0YXJnZXRJbmZvKSkgewogICAgICAgICAgdGFyZ2V0W3BdID0gT2JqZWN0LmFzc2lnbih7dmFsdWU6IHRhcmdldEluZm8udmFsdWV9LCBzb3VyY2VJbmZvKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0W3BdID0gc291cmNlSW5mbzsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBMZWdhY3lFbGVtZW50ID0gTGVnYWN5RWxlbWVudE1peGluKEhUTUxFbGVtZW50KTsKCiAgICAvKiBOb3RlIGFib3V0IGNvbnN0cnVjdGlvbiBhbmQgZXh0ZW5zaW9uIG9mIGxlZ2FjeSBjbGFzc2VzLgogICAgICBbQ2hhbmdlZCBpbiBRNCAyMDE4IHRvIG9wdGltaXplIHBlcmZvcm1hbmNlLl0KCiAgICAgIFdoZW4gY2FsbGluZyBgUG9seW1lcmAgb3IgYG1peGluQmVoYXZpb3JzYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyBiZWxvdyBpcwogICAgICBtYWRlLiBUaGUgbGlzdCBvZiBiZWhhdmlvcnMgd2FzIHByZXZpb3VzbHkgbWFkZSBpbnRvIG9uZSBnZW5lcmF0ZWQgY2xhc3MgcGVyCiAgICAgIGJlaGF2aW9yLCBidXQgdGhpcyBpcyBubyBsb25nZXIgdGhlIGNhc2UgYXMgYmVoYXZpb3JzIGFyZSBub3cgY2FsbGVkCiAgICAgIG1hbnVhbGx5LiBOb3RlLCB0aGVyZSBtYXkgKnN0aWxsKiBiZSBtdWx0aXBsZSBnZW5lcmF0ZWQgY2xhc3NlcyBpbiB0aGUKICAgICAgZWxlbWVudCdzIHByb3RvdHlwZSBjaGFpbiBpZiBleHRlbnNpb24gaXMgdXNlZCB3aXRoIGBtaXhpbkJlaGF2aW9yc2AuCgogICAgICBUaGUgZ2VuZXJhdGVkIGNsYXNzIGlzIGRpcmVjdGx5IHRpZWQgdG8gdGhlIGluZm8gb2JqZWN0IGFuZCBiZWhhdmlvcnMKICAgICAgdXNlZCB0byBjcmVhdGUgaXQuIFRoYXQgbGlzdCBvZiBiZWhhdmlvcnMgaXMgZmlsdGVyZWQgc28gaXQncyBvbmx5IHRoZQogICAgICBiZWhhdmlvcnMgbm90IGFjdGl2ZSBvbiB0aGUgc3VwZXJjbGFzcy4gSW4gb3JkZXIgdG8gY2FsbCB0aHJvdWdoIHRvIHRoZQogICAgICBlbnRpcmUgbGlzdCBvZiBsaWZlY3ljbGUgbWV0aG9kcywgaXQncyBpbXBvcnRhbnQgdG8gY2FsbCBgc3VwZXJgLgoKICAgICAgVGhlIGVsZW1lbnQncyBgcHJvcGVydGllc2AgYW5kIGBvYnNlcnZlcnNgIGFyZSBjb250cm9sbGVkIHZpYSB0aGUgZmluYWxpemF0aW9uCiAgICAgIG1lY2hhbmlzbSBwcm92aWRlZCBieSBgUHJvcGVydGllc01peGluYC4gYFByb3BlcnRpZXNgIGFuZCBgb2JzZXJ2ZXJzYCBhcmUKICAgICAgY29sbGVjdGVkIGJ5IG1hbnVhbGx5IHRyYXZlcnNpbmcgdGhlIHByb3RvdHlwZSBjaGFpbiBhbmQgbWVyZ2luZy4KCiAgICAgIFRvIGxpbWl0IGNoYW5nZXMsIHRoZSBgX3JlZ2lzdGVyZWRgIG1ldGhvZCBpcyBjYWxsZWQgdmlhIGBfaW5pdGlhbGl6ZVByb3BlcnRpZXNgCiAgICAgIGFuZCBub3QgYF9maW5hbGl6ZUNsYXNzYC4KCiAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0geyFQb2x5bWVySW5pdH0gaW5mbyBQb2x5bWVyIGluZm8gb2JqZWN0CiAgICAgKiBAcGFyYW0ge2Z1bmN0aW9uKG5ldzpIVE1MRWxlbWVudCl9IEJhc2UgYmFzZSBjbGFzcyB0byBleHRlbmQgd2l0aCBpbmZvIG9iamVjdAogICAgICogQHBhcmFtIHtPYmplY3Q9fSBiZWhhdmlvcnMgYmVoYXZpb3JzIHRvIGNvcHkgaW50byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywgQmFzZSwgYmVoYXZpb3JzKSB7CgogICAgICAvLyBtYW5hZ2VzIGJlaGF2aW9yIGFuZCBsaWZlY3ljbGUgcHJvY2Vzc2luZyAoZmlsbGVkIGluIGFmdGVyIGNsYXNzIGRlZmluaXRpb24pCiAgICAgIGxldCBiZWhhdmlvckxpc3Q7CiAgICAgIGNvbnN0IGxpZmVjeWNsZSA9IHt9OwoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGNsYXNzIFBvbHltZXJHZW5lcmF0ZWQgZXh0ZW5kcyBCYXNlIHsKCiAgICAgICAgLy8gZXhwbGljaXRseSBub3QgY2FsbGluZyBzdXBlci5fZmluYWxpemVDbGFzcwogICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgICAgIHN0YXRpYyBfZmluYWxpemVDbGFzcygpIHsKICAgICAgICAgIC8vIGlmIGNhbGxpbmcgdmlhIGEgc3ViY2xhc3MgdGhhdCBoYXNuJ3QgYmVlbiBnZW5lcmF0ZWQsIHBhc3MgdGhyb3VnaCB0byBzdXBlcgogICAgICAgICAgaWYgKCF0aGlzLmhhc093blByb3BlcnR5KEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2dlbmVyYXRlZEZyb20nLCB0aGlzKSkpIHsKICAgICAgICAgICAgLy8gVE9ETyhodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzMyNDApOgogICAgICAgICAgICAvLyAgICAgQ2hhbmdlIGJhY2sgdG8ganVzdCBzdXBlci5tZXRob2RDYWxsKCkKICAgICAgICAgICAgQmFzZS5fZmluYWxpemVDbGFzcy5jYWxsKHRoaXMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gaW50ZXJsZWF2ZSBwcm9wZXJ0aWVzIGFuZCBvYnNlcnZlcnMgcGVyIGJlaGF2aW9yIGFuZCBgaW5mb2AKICAgICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MCwgYjsgaSA8IGJlaGF2aW9yTGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgYiA9IGJlaGF2aW9yTGlzdFtpXTsKICAgICAgICAgICAgICAgIGlmIChiLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVQcm9wZXJ0aWVzKGIucHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYi5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVPYnNlcnZlcnMoYi5vYnNlcnZlcnMsIGIucHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpbmZvLnByb3BlcnRpZXMpIHsKICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVByb3BlcnRpZXMoaW5mby5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5mby5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgICB0aGlzLmNyZWF0ZU9ic2VydmVycyhpbmZvLm9ic2VydmVycywgaW5mby5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtYWtlIHN1cmUgdG8gcHJlcGFyZSB0aGUgZWxlbWVudCB0ZW1wbGF0ZQogICAgICAgICAgICB0aGlzLl9wcmVwYXJlVGVtcGxhdGUoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICAgIGNvbnN0IHByb3BlcnRpZXMgPSB7fTsKICAgICAgICAgIGlmIChiZWhhdmlvckxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgYmVoYXZpb3JMaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbWVyZ2VQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIGJlaGF2aW9yTGlzdFtpXS5wcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgbWVyZ2VQcm9wZXJ0aWVzKHByb3BlcnRpZXMsIGluZm8ucHJvcGVydGllcyk7CiAgICAgICAgICByZXR1cm4gcHJvcGVydGllczsKICAgICAgICB9CgogICAgICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgICAgbGV0IG9ic2VydmVycyA9IFtdOwogICAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTAsIGI7IGkgPCBiZWhhdmlvckxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBiID0gYmVoYXZpb3JMaXN0W2ldOwogICAgICAgICAgICAgIGlmIChiLm9ic2VydmVycykgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzLmNvbmNhdChiLm9ic2VydmVycyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW5mby5vYnNlcnZlcnMpIHsKICAgICAgICAgICAgb2JzZXJ2ZXJzID0gb2JzZXJ2ZXJzLmNvbmNhdChpbmZvLm9ic2VydmVycyk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXJzOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVkKCkgewogICAgICAgICAgc3VwZXIuY3JlYXRlZCgpOwogICAgICAgICAgY29uc3QgbGlzdCA9IGxpZmVjeWNsZS5jcmVhdGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfcmVnaXN0ZXJlZCgpIHsKICAgICAgICAgIC8qIE5PVEU6IGBiZWZvcmVSZWdpc3RlcmAgaXMgY2FsbGVkIGhlcmUgZm9yIGJjLCBidXQgdGhlIGJlaGF2aW9yCiAgICAgICAgICAgIGlzIGRpZmZlcmVudCB0aGFuIGluIDEueC4gSW4gMS4wLCB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgKmFmdGVyKgogICAgICAgICAgICBtaXhpbmcgcHJvdG90eXBlcyB0b2dldGhlciBidXQgKmJlZm9yZSogcHJvY2Vzc2luZyBvZiBtZXRhLW9iamVjdHMuCiAgICAgICAgICAgIEhvd2V2ZXIsIGR5bmFtaWMgZWZmZWN0cyBjYW4gc3RpbGwgYmUgc2V0IGhlcmUgYW5kIGNhbiBiZSBkb25lIGVpdGhlcgogICAgICAgICAgICBpbiBgYmVmb3JlUmVnaXN0ZXJgIG9yIGByZWdpc3RlcmVkYC4gSXQgaXMgbm8gbG9uZ2VyIHBvc3NpYmxlIHRvIHNldAogICAgICAgICAgICBgaXNgIGluIGBiZWZvcmVSZWdpc3RlcmAgYXMgeW91IGNvdWxkIGluIDEueC4KICAgICAgICAgICovCiAgICAgICAgICAvLyBvbmx5IHByb2NlZWQgaWYgdGhlIGdlbmVyYXRlZCBjbGFzcycgcHJvdG90eXBlIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkLgogICAgICAgICAgY29uc3QgZ2VuZXJhdGVkUHJvdG8gPSBQb2x5bWVyR2VuZXJhdGVkLnByb3RvdHlwZTsKICAgICAgICAgIGlmICghZ2VuZXJhdGVkUHJvdG8uaGFzT3duUHJvcGVydHkoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnX19oYXNSZWdpc3RlckZpbmlzaGVkJywgZ2VuZXJhdGVkUHJvdG8pKSkgewogICAgICAgICAgICBnZW5lcmF0ZWRQcm90by5fX2hhc1JlZ2lzdGVyRmluaXNoZWQgPSB0cnVlOwogICAgICAgICAgICAvLyBlbnN1cmUgc3VwZXJjbGFzcyBpcyByZWdpc3RlcmVkIGZpcnN0LgogICAgICAgICAgICBzdXBlci5fcmVnaXN0ZXJlZCgpOwogICAgICAgICAgICAvLyBjb3B5IHByb3BlcnRpZXMgb250byB0aGUgZ2VuZXJhdGVkIGNsYXNzIGxhemlseSBpZiB3ZSdyZSBvcHRpbWl6aW5nLAogICAgICAgICAgICBpZiAobGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgICAgICAgICAgIGNvcHlQcm9wZXJ0aWVzVG9Qcm90byhnZW5lcmF0ZWRQcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGxlZ2FjeSBsaWZlY3ljbGUgaXMgY2FsbGVkIG9uIHRoZSAqZWxlbWVudConcyBwcm90b3R5cGUKICAgICAgICAgICAgLy8gYW5kIG5vdCB0aGUgZ2VuZXJhdGVkIGNsYXNzIHByb3RvdHlwZTsgaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4KICAgICAgICAgICAgLy8gZXh0ZW5kZWQsIHRoZXNlIGFyZSAqbm90KiB0aGUgc2FtZS4KICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodGhpcyk7CiAgICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmJlZm9yZVJlZ2lzdGVyOwogICAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGxpc3RbaV0uY2FsbChwcm90byk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxpc3QgPSBsaWZlY3ljbGUucmVnaXN0ZXJlZDsKICAgICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwocHJvdG8pOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlMaXN0ZW5lcnMoKSB7CiAgICAgICAgICBzdXBlci5fYXBwbHlMaXN0ZW5lcnMoKTsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUubGlzdGVuZXJzOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVycyA9IGxpc3RbaV07CiAgICAgICAgICAgICAgaWYgKGxpc3RlbmVycykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgbCBpbiBsaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkTWV0aG9kRXZlbnRMaXN0ZW5lclRvTm9kZSh0aGlzLCBsLCBsaXN0ZW5lcnNbbF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gbm90ZTogZXhjZXB0aW9uIHRvICJzdXBlciB0aGVuIG1lIiBydWxlOwogICAgICAgIC8vIGRvIHdvcmsgYmVmb3JlIGNhbGxpbmcgc3VwZXIgc28gdGhhdCBzdXBlciBhdHRyaWJ1dGVzCiAgICAgICAgLy8gb25seSBhcHBseSBpZiBub3QgYWxyZWFkeSBzZXQuCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBfZW5zdXJlQXR0cmlidXRlcygpIHsKICAgICAgICAgIGNvbnN0IGxpc3QgPSBsaWZlY3ljbGUuaG9zdEF0dHJpYnV0ZXM7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPWxpc3QubGVuZ3RoLTE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgY29uc3QgaG9zdEF0dHJpYnV0ZXMgPSBsaXN0W2ldOwogICAgICAgICAgICAgIGZvciAobGV0IGEgaW4gaG9zdEF0dHJpYnV0ZXMpIHsKICAgICAgICAgICAgICAgICAgdGhpcy5fZW5zdXJlQXR0cmlidXRlKGEsIGhvc3RBdHRyaWJ1dGVzW2FdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgc3VwZXIuX2Vuc3VyZUF0dHJpYnV0ZXMoKTsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUucmVhZHk7CiAgICAgICAgICBpZiAobGlzdCkgewogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBsaXN0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgbGlzdFtpXS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGF0dGFjaGVkKCkgewogICAgICAgICAgc3VwZXIuYXR0YWNoZWQoKTsKICAgICAgICAgIGxldCBsaXN0ID0gbGlmZWN5Y2xlLmF0dGFjaGVkOwogICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgIGxpc3RbaV0uY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBkZXRhY2hlZCgpIHsKICAgICAgICAgIHN1cGVyLmRldGFjaGVkKCk7CiAgICAgICAgICBsZXQgbGlzdCA9IGxpZmVjeWNsZS5kZXRhY2hlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudHMgbmF0aXZlIEN1c3RvbSBFbGVtZW50cyBgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrYCB0bwogICAgICAgICAqIHNldCBhbiBhdHRyaWJ1dGUgdmFsdWUgdG8gYSBwcm9wZXJ0eSB2aWEgYF9hdHRyaWJ1dGVUb1Byb3BlcnR5YC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgYXR0cmlidXRlIHRoYXQgY2hhbmdlZAogICAgICAgICAqIEBwYXJhbSB7P3N0cmluZ30gb2xkIE9sZCBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGF0dHJpYnV0ZUNoYW5nZWQobmFtZSwgb2xkLCB2YWx1ZSkgewogICAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZCgpOwogICAgICAgICAgbGV0IGxpc3QgPSBsaWZlY3ljbGUuYXR0cmlidXRlQ2hhbmdlZDsKICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBsaXN0W2ldLmNhbGwodGhpcywgbmFtZSwgb2xkLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIGFwcGx5IGJlaGF2aW9ycywgbm90ZSBhY3R1YWwgY29weWluZyBpcyBkb25lIGxhemlseSBhdCBmaXJzdCBpbnN0YW5jZSBjcmVhdGlvbgogICAgICBpZiAoYmVoYXZpb3JzKSB7CiAgICAgICAgLy8gTk9URTogZW5zdXJlIHRoZSBiZWhhdmlvciBpcyBleHRlbmRpbmcgYSBjbGFzcyB3aXRoCiAgICAgICAgLy8gbGVnYWN5IGVsZW1lbnQgYXBpLiBUaGlzIGlzIG5lY2Vzc2FyeSBzaW5jZSBiZWhhdmlvcnMgZXhwZWN0IHRvIGJlIGFibGUKICAgICAgICAvLyB0byBhY2Nlc3MgMS54IGxlZ2FjeSBhcGkuCiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGJlaGF2aW9ycykpIHsKICAgICAgICAgIGJlaGF2aW9ycyA9IFtiZWhhdmlvcnNdOwogICAgICAgIH0KICAgICAgICBsZXQgc3VwZXJCZWhhdmlvcnMgPSBCYXNlLnByb3RvdHlwZS5iZWhhdmlvcnM7CiAgICAgICAgLy8gZ2V0IGZsYXR0ZW5lZCwgZGVkdXBlZCBsaXN0IG9mIGJlaGF2aW9ycyAqbm90KiBhbHJlYWR5IG9uIHN1cGVyIGNsYXNzCiAgICAgICAgYmVoYXZpb3JMaXN0ID0gZmxhdHRlbkJlaGF2aW9ycyhiZWhhdmlvcnMsIG51bGwsIHN1cGVyQmVoYXZpb3JzKTsKICAgICAgICBQb2x5bWVyR2VuZXJhdGVkLnByb3RvdHlwZS5iZWhhdmlvcnMgPSBzdXBlckJlaGF2aW9ycyA/CiAgICAgICAgICBzdXBlckJlaGF2aW9ycy5jb25jYXQoYmVoYXZpb3JzKSA6IGJlaGF2aW9yTGlzdDsKICAgICAgfQoKICAgICAgY29uc3QgY29weVByb3BlcnRpZXNUb1Byb3RvID0gKHByb3RvKSA9PiB7CiAgICAgICAgaWYgKGJlaGF2aW9yTGlzdCkgewogICAgICAgICAgYXBwbHlCZWhhdmlvcnMocHJvdG8sIGJlaGF2aW9yTGlzdCwgbGlmZWN5Y2xlKTsKICAgICAgICB9CiAgICAgICAgYXBwbHlJbmZvKHByb3RvLCBpbmZvLCBsaWZlY3ljbGUsIGV4Y2x1ZGVPbkluZm8pOwogICAgICB9OwoKICAgICAgLy8gY29weSBwcm9wZXJ0aWVzIGlmIHdlJ3JlIG5vdCBvcHRpbWl6aW5nCiAgICAgIGlmICghbGVnYWN5T3B0aW1pemF0aW9ucykgewogICAgICAgIGNvcHlQcm9wZXJ0aWVzVG9Qcm90byhQb2x5bWVyR2VuZXJhdGVkLnByb3RvdHlwZSk7CiAgICAgIH0KCiAgICAgIFBvbHltZXJHZW5lcmF0ZWQuZ2VuZXJhdGVkRnJvbSA9IGluZm87CgogICAgICByZXR1cm4gUG9seW1lckdlbmVyYXRlZDsKICAgIH0KCiAgICAvKioKICAgICAqIEdlbmVyYXRlcyBhIGNsYXNzIHRoYXQgZXh0ZW5kcyBgTGVnYWN5RWxlbWVudGAgYmFzZWQgb24gdGhlCiAgICAgKiBwcm92aWRlZCBpbmZvIG9iamVjdC4gIE1ldGFkYXRhIG9iamVjdHMgb24gdGhlIGBpbmZvYCBvYmplY3QKICAgICAqIChgcHJvcGVydGllc2AsIGBvYnNlcnZlcnNgLCBgbGlzdGVuZXJzYCwgYGJlaGF2aW9yc2AsIGBpc2ApIGFyZSB1c2VkCiAgICAgKiBmb3IgUG9seW1lcidzIG1ldGEtcHJvZ3JhbW1pbmcgc3lzdGVtcywgYW5kIGFueSBmdW5jdGlvbnMgYXJlIGNvcGllZAogICAgICogdG8gdGhlIGdlbmVyYXRlZCBjbGFzcy4KICAgICAqCiAgICAgKiBWYWxpZCAibWV0YWRhdGEiIHZhbHVlcyBhcmUgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgaXNgOiBTdHJpbmcgcHJvdmlkaW5nIHRoZSB0YWcgbmFtZSB0byByZWdpc3RlciB0aGUgZWxlbWVudCB1bmRlci4gSW4KICAgICAqIGFkZGl0aW9uLCBpZiBhIGBkb20tbW9kdWxlYCB3aXRoIHRoZSBzYW1lIGlkIGV4aXN0cywgdGhlIGZpcnN0IHRlbXBsYXRlCiAgICAgKiBpbiB0aGF0IGBkb20tbW9kdWxlYCB3aWxsIGJlIHN0YW1wZWQgaW50byB0aGUgc2hhZG93IHJvb3Qgb2YgdGhpcyBlbGVtZW50LAogICAgICogd2l0aCBzdXBwb3J0IGZvciBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMgKGBvbi0uLi5gKSwgUG9seW1lciBkYXRhCiAgICAgKiBiaW5kaW5ncyAoYFtbLi4uXV1gIGFuZCBge3suLi59fWApLCBhbmQgaWQtYmFzZWQgbm9kZSBmaW5kaW5nIGludG8KICAgICAqIGB0aGlzLiRgLgogICAgICoKICAgICAqIGBwcm9wZXJ0aWVzYDogT2JqZWN0IGRlc2NyaWJpbmcgcHJvcGVydHktcmVsYXRlZCBtZXRhZGF0YSB1c2VkIGJ5IFBvbHltZXIKICAgICAqIGZlYXR1cmVzIChrZXk6IHByb3BlcnR5IG5hbWVzLCB2YWx1ZTogb2JqZWN0IGNvbnRhaW5pbmcgcHJvcGVydHkgbWV0YWRhdGEpLgogICAgICogVmFsaWQga2V5cyBpbiBwZXItcHJvcGVydHkgbWV0YWRhdGEgaW5jbHVkZToKICAgICAqIC0gYHR5cGVgIChTdHJpbmd8TnVtYmVyfE9iamVjdHxBcnJheXwuLi4pOiBVc2VkIGJ5CiAgICAgKiAgIGBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2tgIHRvIGRldGVybWluZSBob3cgc3RyaW5nLWJhc2VkIGF0dHJpYnV0ZXMKICAgICAqICAgYXJlIGRlc2VyaWFsaXplZCB0byBKYXZhU2NyaXB0IHByb3BlcnR5IHZhbHVlcy4KICAgICAqIC0gYG5vdGlmeWAgKGJvb2xlYW4pOiBDYXVzZXMgYSBjaGFuZ2UgaW4gdGhlIHByb3BlcnR5IHRvIGZpcmUgYQogICAgICogICBub24tYnViYmxpbmcgZXZlbnQgY2FsbGVkIGA8cHJvcGVydHk+LWNoYW5nZWRgLiBFbGVtZW50cyB0aGF0IGhhdmUKICAgICAqICAgZW5hYmxlZCB0d28td2F5IGJpbmRpbmcgdG8gdGhlIHByb3BlcnR5IHVzZSB0aGlzIGV2ZW50IHRvIG9ic2VydmUgY2hhbmdlcy4KICAgICAqIC0gYHJlYWRPbmx5YCAoYm9vbGVhbik6IENyZWF0ZXMgYSBnZXR0ZXIgZm9yIHRoZSBwcm9wZXJ0eSwgYnV0IG5vIHNldHRlci4KICAgICAqICAgVG8gc2V0IGEgcmVhZC1vbmx5IHByb3BlcnR5LCB1c2UgdGhlIHByaXZhdGUgc2V0dGVyIG1ldGhvZAogICAgICogICBgX3NldFByb3BlcnR5KHByb3BlcnR5LCB2YWx1ZSlgLgogICAgICogLSBgb2JzZXJ2ZXJgIChzdHJpbmcpOiBPYnNlcnZlciBtZXRob2QgbmFtZSB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4KICAgICAqICAgdGhlIHByb3BlcnR5IGNoYW5nZXMuIFRoZSBhcmd1bWVudHMgb2YgdGhlIG1ldGhvZCBhcmUKICAgICAqICAgYCh2YWx1ZSwgcHJldmlvdXNWYWx1ZSlgLgogICAgICogLSBgY29tcHV0ZWRgIChzdHJpbmcpOiBTdHJpbmcgZGVzY3JpYmluZyBtZXRob2QgYW5kIGRlcGVuZGVudCBwcm9wZXJ0aWVzCiAgICAgKiAgIGZvciBjb21wdXRpbmcgdGhlIHZhbHVlIG9mIHRoaXMgcHJvcGVydHkgKGUuZy4gYCdjb21wdXRlRm9vKGJhciwgem90KSdgKS4KICAgICAqICAgQ29tcHV0ZWQgcHJvcGVydGllcyBhcmUgcmVhZC1vbmx5IGJ5IGRlZmF1bHQgYW5kIGNhbiBvbmx5IGJlIGNoYW5nZWQKICAgICAqICAgdmlhIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGNvbXB1dGluZyBtZXRob2QuCiAgICAgKgogICAgICogYG9ic2VydmVyc2A6IEFycmF5IG9mIHN0cmluZ3MgZGVzY3JpYmluZyBtdWx0aS1wcm9wZXJ0eSBvYnNlcnZlciBtZXRob2RzCiAgICAgKiAgYW5kIHRoZWlyIGRlcGVuZGVudCBwcm9wZXJ0aWVzIChlLmcuIGAnb2JzZXJ2ZUFCQyhhLCBiLCBjKSdgKS4KICAgICAqCiAgICAgKiBgbGlzdGVuZXJzYDogT2JqZWN0IGRlc2NyaWJpbmcgZXZlbnQgbGlzdGVuZXJzIHRvIGJlIGFkZGVkIHRvIGVhY2gKICAgICAqICBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQgKGtleTogZXZlbnQgbmFtZSwgdmFsdWU6IG1ldGhvZCBuYW1lKS4KICAgICAqCiAgICAgKiBgYmVoYXZpb3JzYDogQXJyYXkgb2YgYWRkaXRpb25hbCBgaW5mb2Agb2JqZWN0cyBjb250YWluaW5nIG1ldGFkYXRhCiAgICAgKiBhbmQgY2FsbGJhY2tzIGluIHRoZSBzYW1lIGZvcm1hdCBhcyB0aGUgYGluZm9gIG9iamVjdCBoZXJlIHdoaWNoIGFyZQogICAgICogbWVyZ2VkIGludG8gdGhpcyBlbGVtZW50LgogICAgICoKICAgICAqIGBob3N0QXR0cmlidXRlc2A6IE9iamVjdCBsaXN0aW5nIGF0dHJpYnV0ZXMgdG8gYmUgYXBwbGllZCB0byB0aGUgaG9zdAogICAgICogIG9uY2UgY3JlYXRlZCAoa2V5OiBhdHRyaWJ1dGUgbmFtZSwgdmFsdWU6IGF0dHJpYnV0ZSB2YWx1ZSkuICBWYWx1ZXMKICAgICAqICBhcmUgc2VyaWFsaXplZCBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgdmFsdWUuICBIb3N0IGF0dHJpYnV0ZXMgc2hvdWxkCiAgICAgKiAgZ2VuZXJhbGx5IGJlIGxpbWl0ZWQgdG8gYXR0cmlidXRlcyBzdWNoIGFzIGB0YWJJbmRleGAgYW5kIGBhcmlhLS4uLmAuCiAgICAgKiAgQXR0cmlidXRlcyBpbiBgaG9zdEF0dHJpYnV0ZXNgIGFyZSBvbmx5IGFwcGxpZWQgaWYgYSB1c2VyLXN1cHBsaWVkCiAgICAgKiAgYXR0cmlidXRlIGlzIG5vdCBhbHJlYWR5IHByZXNlbnQgKGF0dHJpYnV0ZXMgaW4gbWFya3VwIG92ZXJyaWRlCiAgICAgKiAgYGhvc3RBdHRyaWJ1dGVzYCkuCiAgICAgKgogICAgICogSW4gYWRkaXRpb24sIHRoZSBmb2xsb3dpbmcgUG9seW1lci1zcGVjaWZpYyBjYWxsYmFja3MgbWF5IGJlIHByb3ZpZGVkOgogICAgICogLSBgcmVnaXN0ZXJlZGA6IGNhbGxlZCBhZnRlciBmaXJzdCBpbnN0YW5jZSBvZiB0aGlzIGVsZW1lbnQsCiAgICAgKiAtIGBjcmVhdGVkYDogY2FsbGVkIGR1cmluZyBgY29uc3RydWN0b3JgCiAgICAgKiAtIGBhdHRhY2hlZGA6IGNhbGxlZCBkdXJpbmcgYGNvbm5lY3RlZENhbGxiYWNrYAogICAgICogLSBgZGV0YWNoZWRgOiBjYWxsZWQgZHVyaW5nIGBkaXNjb25uZWN0ZWRDYWxsYmFja2AKICAgICAqIC0gYHJlYWR5YDogY2FsbGVkIGJlZm9yZSBmaXJzdCBgYXR0YWNoZWRgLCBhZnRlciBhbGwgcHJvcGVydGllcyBvZgogICAgICogICB0aGlzIGVsZW1lbnQgaGF2ZSBiZWVuIHByb3BhZ2F0ZWQgdG8gaXRzIHRlbXBsYXRlIGFuZCBhbGwgb2JzZXJ2ZXJzCiAgICAgKiAgIGhhdmUgcnVuCiAgICAgKgogICAgICogQHBhcmFtIHshUG9seW1lckluaXR9IGluZm8gT2JqZWN0IGNvbnRhaW5pbmcgUG9seW1lciBtZXRhZGF0YSBhbmQgZnVuY3Rpb25zCiAgICAgKiAgIHRvIGJlY29tZSBjbGFzcyBtZXRob2RzLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24oVCk6VH0gbWl4aW4gT3B0aW9uYWwgbWl4aW4gdG8gYXBwbHkgdG8gbGVnYWN5IGJhc2UgY2xhc3MKICAgICAqICAgYmVmb3JlIGV4dGVuZGluZyB3aXRoIFBvbHltZXIgbWV0YXByb2dyYW1taW5nLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OkhUTUxFbGVtZW50KX0gR2VuZXJhdGVkIGNsYXNzCiAgICAgKi8KICAgIGNvbnN0IENsYXNzID0gZnVuY3Rpb24oaW5mbywgbWl4aW4pIHsKICAgICAgaWYgKCFpbmZvKSB7CiAgICAgICAgY29uc29sZS53YXJuKCdQb2x5bWVyLkNsYXNzIHJlcXVpcmVzIGBpbmZvYCBhcmd1bWVudCcpOwogICAgICB9CiAgICAgIGxldCBrbGFzcyA9IG1peGluID8gbWl4aW4oTGVnYWN5RWxlbWVudCkgOgogICAgICAgICAgTGVnYWN5RWxlbWVudDsKICAgICAga2xhc3MgPSBHZW5lcmF0ZUNsYXNzRnJvbUluZm8oaW5mbywga2xhc3MsIGluZm8uYmVoYXZpb3JzKTsKICAgICAgLy8gZGVjb3JhdGUga2xhc3Mgd2l0aCByZWdpc3RyYXRpb24gaW5mbwogICAgICBrbGFzcy5pcyA9IGtsYXNzLnByb3RvdHlwZS5pcyA9IGluZm8uaXM7CiAgICAgIHJldHVybiBrbGFzczsKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIExlZ2FjeSBjbGFzcyBmYWN0b3J5IGFuZCByZWdpc3RyYXRpb24gaGVscGVyIGZvciBkZWZpbmluZyBQb2x5bWVyCiAgICAgKiBlbGVtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBlcXVpdmFsZW50IHRvCiAgICAgKgogICAgICogICAgIGltcG9ydCB7Q2xhc3N9IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL2xlZ2FjeS9jbGFzcy5qcyc7CiAgICAgKiAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGluZm8uaXMsIENsYXNzKGluZm8pKTsKICAgICAqCiAgICAgKiBTZWUgYENsYXNzYCBmb3IgZGV0YWlscyBvbiB2YWxpZCBsZWdhY3kgbWV0YWRhdGEgZm9ybWF0IGZvciBgaW5mb2AuCiAgICAgKgogICAgICogQGdsb2JhbAogICAgICogQG92ZXJyaWRlCiAgICAgKiBAZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7IVBvbHltZXJJbml0fSBpbmZvIE9iamVjdCBjb250YWluaW5nIFBvbHltZXIgbWV0YWRhdGEgYW5kIGZ1bmN0aW9ucwogICAgICogICB0byBiZWNvbWUgY2xhc3MgbWV0aG9kcy4KICAgICAqIEByZXR1cm4ge2Z1bmN0aW9uKG5ldzogSFRNTEVsZW1lbnQpfSBHZW5lcmF0ZWQgY2xhc3MKICAgICAqIEBzdXBwcmVzcyB7ZHVwbGljYXRlLCBpbnZhbGlkQ2FzdHMsIGNoZWNrVHlwZXN9CiAgICAgKi8KICAgIGNvbnN0IFBvbHltZXIgPSBmdW5jdGlvbihpbmZvKSB7CiAgICAgIC8vIGlmIGlucHV0IGlzIGEgYGNsYXNzYCAoYWthIGEgZnVuY3Rpb24gd2l0aCBhIHByb3RvdHlwZSksIHVzZSB0aGUgcHJvdG90eXBlCiAgICAgIC8vIHJlbWVtYmVyIHRoYXQgdGhlIGBjb25zdHJ1Y3RvcmAgd2lsbCBuZXZlciBiZSBjYWxsZWQKICAgICAgbGV0IGtsYXNzOwogICAgICBpZiAodHlwZW9mIGluZm8gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICBrbGFzcyA9IGluZm87CiAgICAgIH0gZWxzZSB7CiAgICAgICAga2xhc3MgPSBQb2x5bWVyLkNsYXNzKGluZm8pOwogICAgICB9CiAgICAgIC8vIENvcHkgb3B0IG91dCBmb3IgYGxlZ2FjeU5vT2JzZXJ2ZWRBdHRyaWJ1dGVzYCBmcm9tIGluZm8gb2JqZWN0IHRvIGNsYXNzLgogICAgICBpZiAoaW5mby5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXMpIHsKICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2xlZ2FjeUZvcmNlT2JzZXJ2ZWRBdHRyaWJ1dGVzID0gaW5mby5fbGVnYWN5Rm9yY2VPYnNlcnZlZEF0dHJpYnV0ZXM7CiAgICAgIH0KICAgICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKGtsYXNzLmlzLCAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8oa2xhc3MpKTsKICAgICAgcmV0dXJuIGtsYXNzOwogICAgfTsKCiAgICBQb2x5bWVyLkNsYXNzID0gQ2xhc3M7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvLyBDb21tb24gaW1wbGVtZW50YXRpb24gZm9yIG1peGluICYgYmVoYXZpb3IKICAgIGZ1bmN0aW9uIG11dGFibGVQcm9wZXJ0eUNoYW5nZShpbnN0LCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgbXV0YWJsZURhdGEpIHsKICAgICAgbGV0IGlzT2JqZWN0OwogICAgICBpZiAobXV0YWJsZURhdGEpIHsKICAgICAgICBpc09iamVjdCA9ICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9PSBudWxsKTsKICAgICAgICAvLyBQdWxsIGBvbGRgIGZvciBPYmplY3RzIGZyb20gdGVtcCBjYWNoZSwgYnV0IHRyZWF0IGBudWxsYCBhcyBhIHByaW1pdGl2ZQogICAgICAgIGlmIChpc09iamVjdCkgewogICAgICAgICAgb2xkID0gaW5zdC5fX2RhdGFUZW1wW3Byb3BlcnR5XTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLy8gU3RyaWN0IGVxdWFsaXR5IGNoZWNrLCBidXQgcmV0dXJuIGZhbHNlIGZvciBOYU49PT1OYU4KICAgICAgbGV0IHNob3VsZENoYW5nZSA9IChvbGQgIT09IHZhbHVlICYmIChvbGQgPT09IG9sZCB8fCB2YWx1ZSA9PT0gdmFsdWUpKTsKICAgICAgLy8gT2JqZWN0cyBhcmUgc3RvcmVkIGluIHRlbXBvcmFyeSBjYWNoZSAoY2xlYXJlZCBhdCBlbmQgb2YKICAgICAgLy8gdHVybiksIHdoaWNoIGlzIHVzZWQgZm9yIGRpcnR5LWNoZWNraW5nCiAgICAgIGlmIChpc09iamVjdCAmJiBzaG91bGRDaGFuZ2UpIHsKICAgICAgICBpbnN0Ll9fZGF0YVRlbXBbcHJvcGVydHldID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHNob3VsZENoYW5nZTsKICAgIH0KCiAgICAvKioKICAgICAqIEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICogKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlICJkaXJ0eSIpLCBmb3IgdXNlIG9uIGVsZW1lbnRzIHV0aWxpemluZwogICAgICogYFByb3BlcnR5RWZmZWN0c2AKICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCBgUHJvcGVydHlFZmZlY3RzYCBwZXJmb3JtcyBzdHJpY3QgZGlydHkgY2hlY2tpbmcgb24KICAgICAqIG9iamVjdHMsIHdoaWNoIG1lYW5zIHRoYXQgYW55IGRlZXAgbW9kaWZpY2F0aW9ucyB0byBhbiBvYmplY3Qgb3IgYXJyYXkgd2lsbAogICAgICogbm90IGJlIHByb3BhZ2F0ZWQgdW5sZXNzICJpbW11dGFibGUiIGRhdGEgcGF0dGVybnMgYXJlIHVzZWQgKGkuZS4gYWxsIG9iamVjdAogICAgICogcmVmZXJlbmNlcyBmcm9tIHRoZSByb290IHRvIHRoZSBtdXRhdGlvbiB3ZXJlIGNoYW5nZWQpLgogICAgICoKICAgICAqIFBvbHltZXIgYWxzbyBwcm92aWRlcyBhIHByb3ByaWV0YXJ5IGRhdGEgbXV0YXRpb24gYW5kIHBhdGggbm90aWZpY2F0aW9uIEFQSQogICAgICogKGUuZy4gYG5vdGlmeVBhdGhgLCBgc2V0YCwgYW5kIGFycmF5IG11dGF0aW9uIEFQSSdzKSB0aGF0IGFsbG93IGVmZmljaWVudAogICAgICogbXV0YXRpb24gYW5kIG5vdGlmaWNhdGlvbiBvZiBkZWVwIGNoYW5nZXMgaW4gYW4gb2JqZWN0IGdyYXBoIHRvIGFsbCBlbGVtZW50cwogICAgICogYm91bmQgdG8gdGhlIHNhbWUgb2JqZWN0IGdyYXBoLgogICAgICoKICAgICAqIEluIGNhc2VzIHdoZXJlIG5laXRoZXIgaW1tdXRhYmxlIHBhdHRlcm5zIG5vciB0aGUgZGF0YSBtdXRhdGlvbiBBUEkgY2FuIGJlCiAgICAgKiB1c2VkLCBhcHBseWluZyB0aGlzIG1peGluIHdpbGwgY2F1c2UgUG9seW1lciB0byBza2lwIGRpcnR5IGNoZWNraW5nIGZvcgogICAgICogb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZSAiZGlydHkiKS4gIFRoaXMgYWxsb3dzIGEKICAgICAqIHVzZXIgdG8gbWFrZSBhIGRlZXAgbW9kaWZpY2F0aW9uIHRvIGEgYm91bmQgb2JqZWN0IGdyYXBoLCBhbmQgdGhlbiBlaXRoZXIKICAgICAqIHNpbXBseSByZS1zZXQgdGhlIG9iamVjdCAoZS5nLiBgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXNgKSBvciBjYWxsIGBub3RpZnlQYXRoYAogICAgICogKGUuZy4gYHRoaXMubm90aWZ5UGF0aCgnaXRlbXMnKWApIHRvIHVwZGF0ZSB0aGUgdHJlZS4gIE5vdGUgdGhhdCBhbGwKICAgICAqIGVsZW1lbnRzIHRoYXQgd2lzaCB0byBiZSB1cGRhdGVkIGJhc2VkIG9uIGRlZXAgbXV0YXRpb25zIG11c3QgYXBwbHkgdGhpcwogICAgICogbWl4aW4gb3Igb3RoZXJ3aXNlIHNraXAgc3RyaWN0IGRpcnR5IGNoZWNraW5nIGZvciBvYmplY3RzL2FycmF5cy4KICAgICAqIFNwZWNpZmljYWxseSwgYW55IGVsZW1lbnRzIGluIHRoZSBiaW5kaW5nIHRyZWUgYmV0d2VlbiB0aGUgc291cmNlIG9mIGEKICAgICAqIG11dGF0aW9uIGFuZCB0aGUgY29uc3VtcHRpb24gb2YgaXQgbXVzdCBhcHBseSB0aGlzIG1peGluIG9yIGVuYWJsZSB0aGUKICAgICAqIGBPcHRpb25hbE11dGFibGVEYXRhYCBtaXhpbi4KICAgICAqCiAgICAgKiBJbiBvcmRlciB0byBtYWtlIHRoZSBkaXJ0eSBjaGVjayBzdHJhdGVneSBjb25maWd1cmFibGUsIHNlZQogICAgICogYE9wdGlvbmFsTXV0YWJsZURhdGFgLgogICAgICoKICAgICAqIE5vdGUsIHRoZSBwZXJmb3JtYW5jZSBjaGFyYWN0ZXJpc3RpY3Mgb2YgcHJvcGFnYXRpbmcgbGFyZ2Ugb2JqZWN0IGdyYXBocwogICAgICogd2lsbCBiZSB3b3JzZSBhcyBvcHBvc2VkIHRvIHVzaW5nIHN0cmljdCBkaXJ0eSBjaGVja2luZyB3aXRoIGltbXV0YWJsZQogICAgICogcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uIEFQSS4KICAgICAqCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQHBvbHltZXIKICAgICAqIEBzdW1tYXJ5IEVsZW1lbnQgY2xhc3MgbWl4aW4gdG8gc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMKICAgICAqICAgYW5kIGFycmF5cwogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIENsYXNzIHRvIGFwcGx5IG1peGluIHRvLgogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlQpfSBzdXBlckNsYXNzIHdpdGggbWl4aW4gYXBwbGllZC4KICAgICAqLwogICAgY29uc3QgTXV0YWJsZURhdGEgPSBkZWR1cGluZ01peGluKHN1cGVyQ2xhc3MgPT4gewoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX011dGFibGVEYXRhfQogICAgICAgKi8KICAgICAgY2xhc3MgTXV0YWJsZURhdGEgZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAgICogc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIGZvciBPYmplY3RzIGFuZCBBcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBwdWxscyB0aGUgdmFsdWUgdG8gZGlydHkgY2hlY2sgYWdhaW5zdCBmcm9tIHRoZSBgX19kYXRhVGVtcGAKICAgICAgICAgKiBjYWNoZSAocmF0aGVyIHRoYW4gdGhlIG5vcm1hbCBgX19kYXRhYCBjYWNoZSkgZm9yIE9iamVjdHMuICBTaW5jZSB0aGUgdGVtcAogICAgICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgICAgICogc2lkZS1lZmZlY3RzIG9mIGRlZXAgb2JqZWN0IGNoYW5nZXMgdG8gYmUgcHJvY2Vzc2VkIGJ5IHJlLXNldHRpbmcgdGhlCiAgICAgICAgICogc2FtZSBvYmplY3QgKHVzaW5nIHRoZSB0ZW1wIGNhY2hlIGFzIGFuIGluLXR1cm4gYmFja3N0b3AgdG8gcHJldmVudAogICAgICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eSBQcm9wZXJ0eSBuYW1lCiAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcGFyYW0geyp9IG9sZCBQcmV2aW91cyBwcm9wZXJ0eSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIHByb3BlcnR5IHNob3VsZCBiZSBjb25zaWRlcmVkIGEgY2hhbmdlCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqLwogICAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgICAgcmV0dXJuIG11dGFibGVQcm9wZXJ0eUNoYW5nZSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdHJ1ZSk7CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuIE11dGFibGVEYXRhOwoKICAgIH0pOwoKICAgIC8qKgogICAgICogRWxlbWVudCBjbGFzcyBtaXhpbiB0byBhZGQgdGhlIG9wdGlvbmFsIGFiaWxpdHkgdG8gc2tpcCBzdHJpY3QKICAgICAqIGRpcnR5LWNoZWNraW5nIGZvciBvYmplY3RzIGFuZCBhcnJheXMgKGFsd2F5cyBjb25zaWRlciB0aGVtIHRvIGJlCiAgICAgKiAiZGlydHkiKSBieSBzZXR0aW5nIGEgYG11dGFibGUtZGF0YWAgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgaW5zdGFuY2UuCiAgICAgKgogICAgICogQnkgZGVmYXVsdCwgYFByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgICAqCiAgICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgICAqCiAgICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgZW5hYmxlIHRoaXMgbWl4aW4gb3IgYXBwbHkgdGhlCiAgICAgKiBgTXV0YWJsZURhdGFgIG1peGluLgogICAgICoKICAgICAqIFdoaWxlIHRoaXMgbWl4aW4gYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICAgKiBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUgcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uCiAgICAgKiBBUEkuCiAgICAgKgogICAgICogQG1peGluRnVuY3Rpb24KICAgICAqIEBwb2x5bWVyCiAgICAgKiBAc3VtbWFyeSBFbGVtZW50IGNsYXNzIG1peGluIHRvIG9wdGlvbmFsbHkgc2tpcCBzdHJpY3QgZGlydHktY2hlY2tpbmcKICAgICAqICAgZm9yIG9iamVjdHMgYW5kIGFycmF5cwogICAgICovCiAgICBjb25zdCBPcHRpb25hbE11dGFibGVEYXRhID0gZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAbWl4aW5DbGFzcwogICAgICAgKiBAcG9seW1lcgogICAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9PcHRpb25hbE11dGFibGVEYXRhfQogICAgICAgKi8KICAgICAgY2xhc3MgT3B0aW9uYWxNdXRhYmxlRGF0YSBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSW5zdGFuY2UtbGV2ZWwgZmxhZyBmb3IgY29uZmlndXJpbmcgdGhlIGRpcnR5LWNoZWNraW5nIHN0cmF0ZWd5CiAgICAgICAgICAgICAqIGZvciB0aGlzIGVsZW1lbnQuICBXaGVuIHRydWUsIE9iamVjdHMgYW5kIEFycmF5cyB3aWxsIHNraXAgZGlydHkKICAgICAgICAgICAgICogY2hlY2tpbmcsIG90aGVyd2lzZSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgd2lsbCBiZSB1c2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4KICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgYFByb3BlcnR5RWZmZWN0c2AgdG8gcHJvdmlkZSBvcHRpb24gZm9yIHNraXBwaW5nCiAgICAgICAgICogc3RyaWN0IGVxdWFsaXR5IGNoZWNraW5nIGZvciBPYmplY3RzIGFuZCBBcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBXaGVuIGB0aGlzLm11dGFibGVEYXRhYCBpcyB0cnVlIG9uIHRoaXMgaW5zdGFuY2UsIHRoaXMgbWV0aG9kCiAgICAgICAgICogcHVsbHMgdGhlIHZhbHVlIHRvIGRpcnR5IGNoZWNrIGFnYWluc3QgZnJvbSB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlCiAgICAgICAgICogKHJhdGhlciB0aGFuIHRoZSBub3JtYWwgYF9fZGF0YWAgY2FjaGUpIGZvciBPYmplY3RzLiAgU2luY2UgdGhlIHRlbXAKICAgICAgICAgKiBjYWNoZSBpcyBjbGVhcmVkIGF0IHRoZSBlbmQgb2YgYSB0dXJuLCB0aGlzIGltcGxlbWVudGF0aW9uIGFsbG93cwogICAgICAgICAqIHNpZGUtZWZmZWN0cyBvZiBkZWVwIG9iamVjdCBjaGFuZ2VzIHRvIGJlIHByb2Nlc3NlZCBieSByZS1zZXR0aW5nIHRoZQogICAgICAgICAqIHNhbWUgb2JqZWN0ICh1c2luZyB0aGUgdGVtcCBjYWNoZSBhcyBhbiBpbi10dXJuIGJhY2tzdG9wIHRvIHByZXZlbnQKICAgICAgICAgKiBjeWNsZXMgZHVlIHRvIDItd2F5IG5vdGlmaWNhdGlvbikuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcGVydHkgUHJvcGVydHkgbmFtZQogICAgICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgTmV3IHByb3BlcnR5IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBwcm9wZXJ0eSBzaG91bGQgYmUgY29uc2lkZXJlZCBhIGNoYW5nZQogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkUHJvcGVydHlDaGFuZ2UocHJvcGVydHksIHZhbHVlLCBvbGQpIHsKICAgICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UodGhpcywgcHJvcGVydHksIHZhbHVlLCBvbGQsIHRoaXMubXV0YWJsZURhdGEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIE9wdGlvbmFsTXV0YWJsZURhdGE7CgogICAgfSk7CgogICAgLy8gRXhwb3J0IGZvciB1c2UgYnkgbGVnYWN5IGJlaGF2aW9yCiAgICBNdXRhYmxlRGF0YS5fbXV0YWJsZVByb3BlcnR5Q2hhbmdlID0gbXV0YWJsZVByb3BlcnR5Q2hhbmdlOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLy8gQmFzZSBjbGFzcyBmb3IgSFRNTFRlbXBsYXRlRWxlbWVudCBleHRlbnNpb24gdGhhdCBoYXMgcHJvcGVydHkgZWZmZWN0cwogICAgLy8gbWFjaGluZXJ5IGZvciBwcm9wYWdhdGluZyBob3N0IHByb3BlcnRpZXMgdG8gY2hpbGRyZW4uIFRoaXMgaXMgYW4gRVM1CiAgICAvLyBjbGFzcyBvbmx5IGJlY2F1c2UgQmFiZWwgKGluY29ycmVjdGx5KSByZXF1aXJlcyBzdXBlcigpIGluIHRoZSBjbGFzcwogICAgLy8gY29uc3RydWN0b3IgZXZlbiB0aG91Z2ggbm8gYHRoaXNgIGlzIHVzZWQgYW5kIGl0IHJldHVybnMgYW4gaW5zdGFuY2UuCiAgICBsZXQgbmV3SW5zdGFuY2UgPSBudWxsOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7SFRNTFRlbXBsYXRlRWxlbWVudH0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24oKSB7IHJldHVybiBuZXdJbnN0YW5jZTsgfQogICAgSFRNTFRlbXBsYXRlRWxlbWVudEV4dGVuc2lvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEhUTUxUZW1wbGF0ZUVsZW1lbnQucHJvdG90eXBlLCB7CiAgICAgIGNvbnN0cnVjdG9yOiB7CiAgICAgICAgdmFsdWU6IEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24sCiAgICAgICAgd3JpdGFibGU6IHRydWUKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30KICAgICAqIEBleHRlbmRzIHtIVE1MVGVtcGxhdGVFbGVtZW50RXh0ZW5zaW9ufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgRGF0YVRlbXBsYXRlID0gUHJvcGVydHlFZmZlY3RzKEhUTUxUZW1wbGF0ZUVsZW1lbnRFeHRlbnNpb24pOwoKICAgIC8qKgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9NdXRhYmxlRGF0YX0KICAgICAqIEBleHRlbmRzIHtEYXRhVGVtcGxhdGV9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlRGF0YVRlbXBsYXRlID0gTXV0YWJsZURhdGEoRGF0YVRlbXBsYXRlKTsKCiAgICAvLyBBcHBsaWVzIGEgRGF0YVRlbXBsYXRlIHN1YmNsYXNzIHRvIGEgPHRlbXBsYXRlPiBpbnN0YW5jZQogICAgZnVuY3Rpb24gdXBncmFkZVRlbXBsYXRlKHRlbXBsYXRlLCBjb25zdHJ1Y3RvcikgewogICAgICBuZXdJbnN0YW5jZSA9IHRlbXBsYXRlOwogICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YodGVtcGxhdGUsIGNvbnN0cnVjdG9yLnByb3RvdHlwZSk7CiAgICAgIG5ldyBjb25zdHJ1Y3RvcigpOwogICAgICBuZXdJbnN0YW5jZSA9IG51bGw7CiAgICB9CgogICAgLyoqCiAgICAgKiBCYXNlIGNsYXNzIGZvciBUZW1wbGF0ZUluc3RhbmNlLgogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAZXh0ZW5kcyB7SFRNTEVsZW1lbnR9CiAgICAgKiBAaW1wbGVtZW50cyB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHN9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCB0ZW1wbGF0ZUluc3RhbmNlQmFzZSA9IFByb3BlcnR5RWZmZWN0cyhjbGFzcyB7fSk7CgogICAgZnVuY3Rpb24gc2hvd0hpZGVDaGlsZHJlbihoaWRlLCBjaGlsZHJlbikgewogICAgICBmb3IgKGxldCBpPTA7IGk8Y2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICBsZXQgbiA9IGNoaWxkcmVuW2ldOwogICAgICAgIC8vIElnbm9yZSBub24tY2hhbmdlcwogICAgICAgIGlmIChCb29sZWFuKGhpZGUpICE9IEJvb2xlYW4obi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18pKSB7CiAgICAgICAgICAvLyBjbGVhciBhbmQgcmVzdG9yZSB0ZXh0CiAgICAgICAgICBpZiAobi5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREUpIHsKICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICBuLl9fcG9seW1lclRleHRDb250ZW50X18gPSBuLnRleHRDb250ZW50OwogICAgICAgICAgICAgIG4udGV4dENvbnRlbnQgPSAnJzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBuLnRleHRDb250ZW50ID0gbi5fX3BvbHltZXJUZXh0Q29udGVudF9fOwogICAgICAgICAgICB9CiAgICAgICAgICAvLyByZW1vdmUgYW5kIHJlcGxhY2Ugc2xvdAogICAgICAgICAgfSBlbHNlIGlmIChuLmxvY2FsTmFtZSA9PT0gJ3Nsb3QnKSB7CiAgICAgICAgICAgIGlmIChoaWRlKSB7CiAgICAgICAgICAgICAgbi5fX3BvbHltZXJSZXBsYWNlZF9fID0gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnaGlkZGVuLXNsb3QnKTsKICAgICAgICAgICAgICB3cmFwKHdyYXAobikucGFyZW50Tm9kZSkucmVwbGFjZUNoaWxkKG4uX19wb2x5bWVyUmVwbGFjZWRfXywgbik7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc3QgcmVwbGFjZSA9IG4uX19wb2x5bWVyUmVwbGFjZWRfXzsKICAgICAgICAgICAgICBpZiAocmVwbGFjZSkgewogICAgICAgICAgICAgICAgd3JhcCh3cmFwKHJlcGxhY2UpLnBhcmVudE5vZGUpLnJlcGxhY2VDaGlsZChuLCByZXBsYWNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIC8vIGhpZGUgYW5kIHNob3cgbm9kZXMKICAgICAgICAgIGVsc2UgaWYgKG4uc3R5bGUpIHsKICAgICAgICAgICAgaWYgKGhpZGUpIHsKICAgICAgICAgICAgICBuLl9fcG9seW1lckRpc3BsYXlfXyA9IG4uc3R5bGUuZGlzcGxheTsKICAgICAgICAgICAgICBuLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgbi5zdHlsZS5kaXNwbGF5ID0gbi5fX3BvbHltZXJEaXNwbGF5X187CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbi5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gPSBoaWRlOwogICAgICAgIGlmIChuLl9zaG93SGlkZUNoaWxkcmVuKSB7CiAgICAgICAgICBuLl9zaG93SGlkZUNoaWxkcmVuKGhpZGUpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQHBvbHltZXIKICAgICAqIEBjdXN0b21FbGVtZW50CiAgICAgKiBAYXBwbGllc01peGluIFByb3BlcnR5RWZmZWN0cwogICAgICogQHVucmVzdHJpY3RlZAogICAgICovCiAgICBjbGFzcyBUZW1wbGF0ZUluc3RhbmNlQmFzZSBleHRlbmRzIHRlbXBsYXRlSW5zdGFuY2VCYXNlIHsKICAgICAgY29uc3RydWN0b3IocHJvcHMpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX2NvbmZpZ3VyZVByb3BlcnRpZXMocHJvcHMpOwogICAgICAgIC8qKiBAdHlwZSB7IVN0YW1wZWRUZW1wbGF0ZX0gKi8KICAgICAgICB0aGlzLnJvb3QgPSB0aGlzLl9zdGFtcFRlbXBsYXRlKHRoaXMuX19kYXRhSG9zdCk7CiAgICAgICAgLy8gU2F2ZSBsaXN0IG9mIHN0YW1wZWQgY2hpbGRyZW4KICAgICAgICBsZXQgY2hpbGRyZW4gPSBbXTsKICAgICAgICAvKiogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9ICovCiAgICAgICAgdGhpcy5jaGlsZHJlbiA9IC8qKiBAdHlwZSB7IU5vZGVMaXN0fSAqLyAoY2hpbGRyZW4pOwogICAgICAgIC8vIFBvbHltZXIgMS54IGRpZCBub3QgdXNlIGBQb2x5bWVyLmRvbWAgaGVyZSBzbyBub3QgYm90aGVyaW5nLgogICAgICAgIGZvciAobGV0IG4gPSB0aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICBjaGlsZHJlbi5wdXNoKG4pOwogICAgICAgICAgbi5fX3RlbXBsYXRpemVJbnN0YW5jZSA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9fdGVtcGxhdGl6ZU93bmVyICYmCiAgICAgICAgICB0aGlzLl9fdGVtcGxhdGl6ZU93bmVyLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXykgewogICAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbih0cnVlKTsKICAgICAgICB9CiAgICAgICAgLy8gRmx1c2ggcHJvcHMgb25seSB3aGVuIHByb3BzIGFyZSBwYXNzZWQgaWYgaW5zdGFuY2UgcHJvcHMgZXhpc3QKICAgICAgICAvLyBvciB3aGVuIHRoZXJlIGlzbid0IGluc3RhbmNlIHByb3BzLgogICAgICAgIGxldCBvcHRpb25zID0gdGhpcy5fX3RlbXBsYXRpemVPcHRpb25zOwogICAgICAgIGlmICgocHJvcHMgJiYgb3B0aW9ucy5pbnN0YW5jZVByb3BzKSB8fCAhb3B0aW9ucy5pbnN0YW5jZVByb3BzKSB7CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8qKgogICAgICAgKiBDb25maWd1cmUgdGhlIGdpdmVuIGBwcm9wc2AgYnkgY2FsbGluZyBgX3NldFBlbmRpbmdQcm9wZXJ0eWAuIEFsc28KICAgICAgICogc2V0cyBhbnkgcHJvcGVydGllcyBzdG9yZWQgaW4gYF9faG9zdFByb3BzYC4KICAgICAgICogQHByaXZhdGUKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHByb3BzIE9iamVjdCBvZiBwcm9wZXJ0eSBuYW1lLXZhbHVlIHBhaXJzIHRvIHNldC4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9jb25maWd1cmVQcm9wZXJ0aWVzKHByb3BzKSB7CiAgICAgICAgbGV0IG9wdGlvbnMgPSB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnM7CiAgICAgICAgaWYgKG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wKSB7CiAgICAgICAgICBmb3IgKGxldCBocHJvcCBpbiB0aGlzLl9faG9zdFByb3BzKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShocHJvcCwgdGhpcy5fX2RhdGFIb3N0WydfaG9zdF8nICsgaHByb3BdKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQW55IGluc3RhbmNlIHByb3BzIHBhc3NlZCBpbiB0aGUgY29uc3RydWN0b3Igd2lsbCBvdmVyd3JpdGUgaG9zdCBwcm9wczsKICAgICAgICAvLyBub3JtYWxseSB0aGlzIHdvdWxkIGJlIGEgdXNlciBlcnJvciBidXQgd2UgZG9uJ3Qgc3BlY2lmaWNhbGx5IGZpbHRlciB0aGVtCiAgICAgICAgZm9yIChsZXQgaXByb3AgaW4gcHJvcHMpIHsKICAgICAgICAgIHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eShpcHJvcCwgcHJvcHNbaXByb3BdKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZvcndhcmRzIGEgaG9zdCBwcm9wZXJ0eSB0byB0aGlzIGluc3RhbmNlLiAgVGhpcyBtZXRob2Qgc2hvdWxkIGJlCiAgICAgICAqIGNhbGxlZCBvbiBpbnN0YW5jZXMgZnJvbSB0aGUgYG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wYCBjYWxsYmFjawogICAgICAgKiB0byBwcm9wYWdhdGUgY2hhbmdlcyBvZiBob3N0IHByb3BlcnRpZXMgdG8gZWFjaCBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogTm90ZSB0aGlzIG1ldGhvZCBlbnF1ZXVlcyB0aGUgY2hhbmdlLCB3aGljaCBhcmUgZmx1c2hlZCBhcyBhIGJhdGNoLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSBvciBwYXRoIG5hbWUKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgdG8gZm9yd2FyZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKSB7CiAgICAgICAgaWYgKHRoaXMuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChwcm9wLCB2YWx1ZSwgZmFsc2UsIHRydWUpKSB7CiAgICAgICAgICB0aGlzLl9fZGF0YUhvc3QuX2VucXVldWVDbGllbnQodGhpcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgcG9pbnQgZm9yIGFkZGluZyBjdXN0b20gb3Igc2ltdWxhdGVkIGV2ZW50IGhhbmRsaW5nLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZSBOb2RlIHRvIGFkZCBldmVudCBsaXN0ZW5lciB0bwogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lIE5hbWUgb2YgZXZlbnQKICAgICAgICogQHBhcmFtIHtmdW5jdGlvbighRXZlbnQpOnZvaWR9IGhhbmRsZXIgTGlzdGVuZXIgZnVuY3Rpb24gdG8gYWRkCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfYWRkRXZlbnRMaXN0ZW5lclRvTm9kZShub2RlLCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICBpZiAodGhpcy5fbWV0aG9kSG9zdCAmJiB0aGlzLl9fdGVtcGxhdGl6ZU9wdGlvbnMucGFyZW50TW9kZWwpIHsKICAgICAgICAgIC8vIElmIHRoaXMgaW5zdGFuY2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBwYXJlbnQgbW9kZWwsIGRlY29yYXRlCiAgICAgICAgICAvLyBldmVudHMgdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZSBhcyBgbW9kZWxgCiAgICAgICAgICB0aGlzLl9tZXRob2RIb3N0Ll9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKG5vZGUsIGV2ZW50TmFtZSwgKGUpID0+IHsKICAgICAgICAgICAgZS5tb2RlbCA9IHRoaXM7CiAgICAgICAgICAgIGhhbmRsZXIoZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gT3RoZXJ3aXNlIGRlbGVnYXRlIHRvIHRoZSB0ZW1wbGF0ZSdzIGhvc3QgKHdoaWNoIGNvdWxkIGJlKQogICAgICAgICAgLy8gYW5vdGhlciB0ZW1wbGF0ZSBpbnN0YW5jZQogICAgICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRoaXMuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgaWYgKHRlbXBsYXRlSG9zdCkgewogICAgICAgICAgICB0ZW1wbGF0ZUhvc3QuX2FkZEV2ZW50TGlzdGVuZXJUb05vZGUobm9kZSwgZXZlbnROYW1lLCBoYW5kbGVyKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFNob3dzIG9yIGhpZGVzIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0b3AgbGV2ZWwgY2hpbGQgZWxlbWVudHMuIEZvcgogICAgICAgKiB0ZXh0IG5vZGVzLCBgdGV4dENvbnRlbnRgIGlzIHJlbW92ZWQgd2hpbGUgImhpZGRlbiIgYW5kIHJlcGxhY2VkIHdoZW4KICAgICAgICogInNob3duLiIKICAgICAgICogQHBhcmFtIHtib29sZWFufSBoaWRlIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRlKSB7CiAgICAgICAgc2hvd0hpZGVDaGlsZHJlbihoaWRlLCB0aGlzLmNoaWxkcmVuKTsKICAgICAgfQogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGRlZmF1bHQgcHJvcGVydHktZWZmZWN0cyBpbXBsZW1lbnRhdGlvbiB0byBpbnRlcmNlcHQKICAgICAgICogdGV4dENvbnRlbnQgYmluZGluZ3Mgd2hpbGUgY2hpbGRyZW4gYXJlICJoaWRkZW4iIGFuZCBjYWNoZSBpbgogICAgICAgKiBwcml2YXRlIHN0b3JhZ2UgZm9yIGxhdGVyIHJldHJpZXZhbC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEBwYXJhbSB7IU5vZGV9IG5vZGUgVGhlIG5vZGUgdG8gc2V0IGEgcHJvcGVydHkgb24KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3AgVGhlIHByb3BlcnR5IHRvIHNldAogICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3NldFVubWFuYWdlZFByb3BlcnR5VG9Ob2RlKG5vZGUsIHByb3AsIHZhbHVlKSB7CiAgICAgICAgaWYgKG5vZGUuX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fICYmCiAgICAgICAgICAgIG5vZGUubm9kZVR5cGUgPT0gTm9kZS5URVhUX05PREUgJiYgcHJvcCA9PSAndGV4dENvbnRlbnQnKSB7CiAgICAgICAgICBub2RlLl9fcG9seW1lclRleHRDb250ZW50X18gPSB2YWx1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3VwZXIuX3NldFVubWFuYWdlZFByb3BlcnR5VG9Ob2RlKG5vZGUsIHByb3AsIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpbmQgdGhlIHBhcmVudCBtb2RlbCBvZiB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLiAgVGhlIHBhcmVudCBtb2RlbAogICAgICAgKiBpcyBlaXRoZXIgYW5vdGhlciB0ZW1wbGF0aXplIGluc3RhbmNlIHRoYXQgaGFkIG9wdGlvbiBgcGFyZW50TW9kZWw6IHRydWVgLAogICAgICAgKiBvciBlbHNlIHRoZSBob3N0IGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4geyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gVGhlIHBhcmVudCBtb2RlbCBvZiB0aGlzIGluc3RhbmNlCiAgICAgICAqLwogICAgICBnZXQgcGFyZW50TW9kZWwoKSB7CiAgICAgICAgbGV0IG1vZGVsID0gdGhpcy5fX3BhcmVudE1vZGVsOwogICAgICAgIGlmICghbW9kZWwpIHsKICAgICAgICAgIGxldCBvcHRpb25zOwogICAgICAgICAgbW9kZWwgPSB0aGlzOwogICAgICAgICAgZG8gewogICAgICAgICAgICAvLyBBIHRlbXBsYXRlIGluc3RhbmNlJ3MgYF9fZGF0YUhvc3RgIGlzIGEgPHRlbXBsYXRlPgogICAgICAgICAgICAvLyBgbW9kZWwuX19kYXRhSG9zdC5fX2RhdGFIb3N0YCBpcyB0aGUgdGVtcGxhdGUncyBob3N0CiAgICAgICAgICAgIG1vZGVsID0gbW9kZWwuX19kYXRhSG9zdC5fX2RhdGFIb3N0OwogICAgICAgICAgfSB3aGlsZSAoKG9wdGlvbnMgPSBtb2RlbC5fX3RlbXBsYXRpemVPcHRpb25zKSAmJiAhb3B0aW9ucy5wYXJlbnRNb2RlbCk7CiAgICAgICAgICB0aGlzLl9fcGFyZW50TW9kZWwgPSBtb2RlbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU3R1YiBvZiBIVE1MRWxlbWVudCdzIGBkaXNwYXRjaEV2ZW50YCwgc28gdGhhdCBlZmZlY3RzIHRoYXQgbWF5CiAgICAgICAqIGRpc3BhdGNoIGV2ZW50cyBzYWZlbHkgbm8tb3AuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IEV2ZW50IHRvIGRpc3BhdGNoCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IEFsd2F5cyB0cnVlLgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgICBkaXNwYXRjaEV2ZW50KGV2ZW50KSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge1RlbXBsYXRlSW5zdGFuY2VCYXNlfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfTXV0YWJsZURhdGF9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBNdXRhYmxlVGVtcGxhdGVJbnN0YW5jZUJhc2UgPSBNdXRhYmxlRGF0YSgKICAgICAgICAvLyBUaGlzIGNhc3Qgc2hvdWxkbid0IGJlIG5lY2Nlc3NhcnksIGJ1dCBDbG9zdXJlIGRvZXNuJ3QgdW5kZXJzdGFuZCB0aGF0CiAgICAgICAgLy8gVGVtcGxhdGVJbnN0YW5jZUJhc2UgaXMgYSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KICAgICAgICAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovIChUZW1wbGF0ZUluc3RhbmNlQmFzZSkpOwoKICAgIGZ1bmN0aW9uIGZpbmRNZXRob2RIb3N0KHRlbXBsYXRlKSB7CiAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSBvd25lciBvZiB0aGUgb3V0ZXJtb3N0IHRlbXBsYXRlLgogICAgICAvLyBJbiBzaGFkb3cgZG9tLCB0aGlzIGlzIGFsd2F5cyBnZXRSb290Tm9kZSgpLmhvc3QsIGJ1dCB3ZSBjYW4KICAgICAgLy8gYXBwcm94aW1hdGUgdGhpcyB2aWEgY29vcGVyYXRpb24gd2l0aCBvdXIgZGF0YUhvc3QgYWx3YXlzIHNldHRpbmcKICAgICAgLy8gYF9tZXRob2RIb3N0YCBhcyBsb25nIGFzIHRoZXJlIHdlcmUgYmluZGluZ3MgKG9yIGlkJ3MpIG9uIHRoaXMKICAgICAgLy8gaW5zdGFuY2UgY2F1c2luZyBpdCB0byBnZXQgYSBkYXRhSG9zdC4KICAgICAgbGV0IHRlbXBsYXRlSG9zdCA9IHRlbXBsYXRlLl9fZGF0YUhvc3Q7CiAgICAgIHJldHVybiB0ZW1wbGF0ZUhvc3QgJiYgdGVtcGxhdGVIb3N0Ll9tZXRob2RIb3N0IHx8IHRlbXBsYXRlSG9zdDsKICAgIH0KCiAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgLyoqCiAgICAgKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfSBjbGFzcy5wcm90b3R5cGUgaXMgbm90IGRlZmluZWQgZm9yIHNvbWUgcmVhc29uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRpemVyQ2xhc3ModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucykgewogICAgICAvKioKICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAqIEBleHRlbmRzIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0KICAgICAgICovCiAgICAgIGxldCB0ZW1wbGF0aXplckJhc2UgPSBvcHRpb25zLm11dGFibGVEYXRhID8KICAgICAgICBNdXRhYmxlVGVtcGxhdGVJbnN0YW5jZUJhc2UgOiBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKCiAgICAgIC8vIEFmZm9yZGFuY2UgZm9yIGdsb2JhbCBtaXhpbnMgb250byBUZW1wbGF0aXplSW5zdGFuY2UKICAgICAgaWYgKHRlbXBsYXRpemUubWl4aW4pIHsKICAgICAgICB0ZW1wbGF0aXplckJhc2UgPSB0ZW1wbGF0aXplLm1peGluKHRlbXBsYXRpemVyQmFzZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBBbm9ueW1vdXMgY2xhc3MgY3JlYXRlZCBieSB0aGUgdGVtcGxhdGl6ZQogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIGV4dGVuZHMgdGVtcGxhdGl6ZXJCYXNlIHsgfTsKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBrbGFzcy5wcm90b3R5cGUuX190ZW1wbGF0aXplT3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgIGtsYXNzLnByb3RvdHlwZS5fYmluZFRlbXBsYXRlKHRlbXBsYXRlKTsKICAgICAgYWRkTm90aWZ5RWZmZWN0cyhrbGFzcywgdGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucyk7CiAgICAgIHJldHVybiBrbGFzczsKICAgIH0KCiAgICAvKioKICAgICAqIEFkZHMgcHJvcGFnYXRlIGVmZmVjdHMgZnJvbSB0aGUgdGVtcGxhdGUgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIGZvcgogICAgICogcHJvcGVydGllcyB0aGF0IHRoZSBob3N0IGJpbmRzIHRvIHRoZSB0ZW1wbGF0ZSB1c2luZyB0aGUgYF9ob3N0X2AgcHJlZml4LgogICAgICoKICAgICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9IGNsYXNzLnByb3RvdHlwZSBpcyBub3QgZGVmaW5lZCBmb3Igc29tZSByZWFzb24KICAgICAqLwogICAgZnVuY3Rpb24gYWRkUHJvcGFnYXRlRWZmZWN0cyh0YXJnZXQsIHRlbXBsYXRlSW5mbywgb3B0aW9ucywgbWV0aG9kSG9zdCkgewogICAgICBsZXQgdXNlckZvcndhcmRIb3N0UHJvcCA9IG9wdGlvbnMuZm9yd2FyZEhvc3RQcm9wOwogICAgICBpZiAodXNlckZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZUluZm8uaGFzSG9zdFByb3BzKSB7CiAgICAgICAgLy8gVW5kZXIgdGhlIGByZW1vdmVOZXN0ZWRUZW1wbGF0ZXNgIG9wdGltaXphdGlvbiwgYSBjdXN0b20gZWxlbWVudCBsaWtlCiAgICAgICAgLy8gYGRvbS1pZmAgb3IgYGRvbS1yZXBlYXRgIGNhbiBpdHNlbGYgYmUgdHJlYXRlZCBhcyB0aGUgInRlbXBsYXRlIjsgdGhpcwogICAgICAgIC8vIGZsYWcgaXMgdXNlZCB0byBzd2l0Y2ggYmV0d2VlbiB1cGdyYWRpbmcgYSBgPHRlbXBsYXRlPmAgdG8gYmUgYSBwcm9wZXJ0eQogICAgICAgIC8vIGVmZmVjdHMgY2xpZW50IHZzLiBhZGRpbmcgdGhlIGVmZmVjdHMgZGlyZWN0bHkgdG8gdGhlIGN1c3RvbSBlbGVtZW50CiAgICAgICAgY29uc3QgaXNUZW1wbGF0ZSA9IHRhcmdldC5sb2NhbE5hbWUgPT0gJ3RlbXBsYXRlJzsKICAgICAgICAvLyBQcm92aWRlIGRhdGEgQVBJIGFuZCBwcm9wZXJ0eSBlZmZlY3RzIG9uIG1lbW9pemVkIHRlbXBsYXRlIGNsYXNzCiAgICAgICAgbGV0IGtsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVUZW1wbGF0ZUNsYXNzOwogICAgICAgIGlmICgha2xhc3MpIHsKICAgICAgICAgIGlmIChpc1RlbXBsYXRlKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgICAgICogQGV4dGVuZHMge0RhdGFUZW1wbGF0ZX0KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGxldCB0ZW1wbGF0aXplZEJhc2UgPQogICAgICAgICAgICAgICAgb3B0aW9ucy5tdXRhYmxlRGF0YSA/IE11dGFibGVEYXRhVGVtcGxhdGUgOiBEYXRhVGVtcGxhdGU7CgogICAgICAgICAgICAvLyBOT1RFOiBkdWUgdG8gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9jbG9zdXJlLWNvbXBpbGVyL2lzc3Vlcy8yOTI4LAogICAgICAgICAgICAvLyBjb21iaW5pbmcgdGhlIG5leHQgdHdvIGxpbmVzIGludG8gb25lIGFzc2lnbm1lbnQgY2F1c2VzIGEgc3B1cmlvdXMKICAgICAgICAgICAgLy8gdHlwZSBlcnJvci4KICAgICAgICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgICAgICAgIGNsYXNzIFRlbXBsYXRpemVkVGVtcGxhdGUgZXh0ZW5kcyB0ZW1wbGF0aXplZEJhc2Uge30KICAgICAgICAgICAga2xhc3MgPSB0ZW1wbGF0ZUluZm8udGVtcGxhdGl6ZVRlbXBsYXRlQ2xhc3MgPSBUZW1wbGF0aXplZFRlbXBsYXRlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAgICAgKiBAZXh0ZW5kcyB7UG9seW1lckVsZW1lbnR9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdCB0ZW1wbGF0aXplZEJhc2UgPSB0YXJnZXQuY29uc3RydWN0b3I7CgogICAgICAgICAgICAvLyBDcmVhdGUgYSBjYWNoZWQgc3ViY2xhc3Mgb2YgdGhlIGJhc2UgY3VzdG9tIGVsZW1lbnQgY2xhc3Mgb250byB3aGljaAogICAgICAgICAgICAvLyB0byBwdXQgdGhlIHRlbXBsYXRlLXNwZWNpZmljIHByb3BhZ2F0ZSBlZmZlY3RzCiAgICAgICAgICAgIC8vIE5PVEU6IGR1ZSB0byBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL2Nsb3N1cmUtY29tcGlsZXIvaXNzdWVzLzI5MjgsCiAgICAgICAgICAgIC8vIGNvbWJpbmluZyB0aGUgbmV4dCB0d28gbGluZXMgaW50byBvbmUgYXNzaWdubWVudCBjYXVzZXMgYSBzcHVyaW91cwogICAgICAgICAgICAvLyB0eXBlIGVycm9yLgogICAgICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICAgICAgY2xhc3MgVGVtcGxhdGl6ZWRUZW1wbGF0ZUV4dGVuc2lvbiBleHRlbmRzIHRlbXBsYXRpemVkQmFzZSB7fQogICAgICAgICAgICBrbGFzcyA9IHRlbXBsYXRlSW5mby50ZW1wbGF0aXplVGVtcGxhdGVDbGFzcyA9CiAgICAgICAgICAgICAgICBUZW1wbGF0aXplZFRlbXBsYXRlRXh0ZW5zaW9uOwogICAgICAgICAgfQogICAgICAgICAgLy8gQWRkIHRlbXBsYXRlIC0gPmluc3RhbmNlcyBlZmZlY3RzCiAgICAgICAgICAvLyBhbmQgaG9zdCA8LSB0ZW1wbGF0ZSBlZmZlY3RzCiAgICAgICAgICBsZXQgaG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wczsKICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5fYWRkUHJvcGVydHlFZmZlY3QoJ19ob3N0XycgKyBwcm9wLAogICAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5QUk9QRVJUWV9FRkZFQ1RfVFlQRVMuUFJPUEFHQVRFLAogICAgICAgICAgICAgIHtmbjogY3JlYXRlRm9yd2FyZEhvc3RQcm9wRWZmZWN0KHByb3AsIHVzZXJGb3J3YXJkSG9zdFByb3ApfSk7CiAgICAgICAgICAgIGtsYXNzLnByb3RvdHlwZS5fY3JlYXRlTm90aWZ5aW5nUHJvcGVydHkoJ19ob3N0XycgKyBwcm9wKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChsZWdhY3lXYXJuaW5ncyAmJiBtZXRob2RIb3N0KSB7CiAgICAgICAgICAgIHdhcm5PblVuZGVjbGFyZWRQcm9wZXJ0aWVzKHRlbXBsYXRlSW5mbywgb3B0aW9ucywgbWV0aG9kSG9zdCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIE1peCBhbnkgcHJlLWJvdW5kIGRhdGEgaW50byBfX2RhdGE7IG5vIG5lZWQgdG8gZmx1c2ggdGhpcyB0bwogICAgICAgIC8vIGluc3RhbmNlcyBzaW5jZSB0aGV5IHB1bGwgZnJvbSB0aGUgdGVtcGxhdGUgYXQgaW5zdGFuY2UtdGltZQogICAgICAgIGlmICh0YXJnZXQuX19kYXRhUHJvdG8pIHsKICAgICAgICAgIC8vIE5vdGUsIGdlbmVyYWxseSBgX19kYXRhUHJvdG9gIGNvdWxkIGJlIGNoYWluZWQsIGJ1dCBpdCdzIGd1YXJhbnRlZWQKICAgICAgICAgIC8vIHRvIG5vdCBiZSBzaW5jZSB0aGlzIGlzIGEgdmFuaWxsYSB0ZW1wbGF0ZSB3ZSBqdXN0IGFkZGVkIGVmZmVjdHMgdG8KICAgICAgICAgIE9iamVjdC5hc3NpZ24odGFyZ2V0Ll9fZGF0YSwgdGFyZ2V0Ll9fZGF0YVByb3RvKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVGVtcGxhdGUpIHsKICAgICAgICAgIHVwZ3JhZGVUZW1wbGF0ZSh0YXJnZXQsIGtsYXNzKTsKICAgICAgICAgIC8vIENsZWFyIGFueSBwZW5kaW5nIGRhdGEgZm9yIHBlcmZvcm1hbmNlCiAgICAgICAgICB0YXJnZXQuX19kYXRhVGVtcCA9IHt9OwogICAgICAgICAgdGFyZ2V0Ll9fZGF0YVBlbmRpbmcgPSBudWxsOwogICAgICAgICAgdGFyZ2V0Ll9fZGF0YU9sZCA9IG51bGw7CiAgICAgICAgICB0YXJnZXQuX2VuYWJsZVByb3BlcnRpZXMoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gU3dpenpsZSB0aGUgY2FjaGVkIHN1YmNsYXNzIHByb3RvdHlwZSBvbnRvIHRoZSBjdXN0b20gZWxlbWVudAogICAgICAgICAgT2JqZWN0LnNldFByb3RvdHlwZU9mKHRhcmdldCwga2xhc3MucHJvdG90eXBlKTsKICAgICAgICAgIC8vIENoZWNrIGZvciBhbnkgcHJlLWJvdW5kIGluc3RhbmNlIGhvc3QgcHJvcGVydGllcywgYW5kIGRvIHRoZQogICAgICAgICAgLy8gaW5zdGFuY2UgcHJvcGVydHkgZGVsZXRlL2Fzc2lnbiBkYW5jZSBmb3IgdGhvc2UgKGRpcmVjdGx5IGludG8gZGF0YTsKICAgICAgICAgIC8vIG5vdCBuZWVkIHRvIGdvIHRocm91Z2ggYWNjZXNzb3Igc2luY2UgdGhleSBhcmUgcHVsbGVkIGF0IGluc3RhbmNlIHRpbWUpCiAgICAgICAgICBjb25zdCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBob3N0UHJvcHMpIHsKICAgICAgICAgICAgcHJvcCA9ICdfaG9zdF8nICsgcHJvcDsKICAgICAgICAgICAgaWYgKHByb3AgaW4gdGFyZ2V0KSB7CiAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGFyZ2V0W3Byb3BdOwogICAgICAgICAgICAgIGRlbGV0ZSB0YXJnZXRbcHJvcF07CiAgICAgICAgICAgICAgdGFyZ2V0Ll9fZGF0YVtwcm9wXSA9IHZhbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQogICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwoKICAgIGZ1bmN0aW9uIGNyZWF0ZUZvcndhcmRIb3N0UHJvcEVmZmVjdChob3N0UHJvcCwgdXNlckZvcndhcmRIb3N0UHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gZm9yd2FyZEhvc3RQcm9wKHRlbXBsYXRlLCBwcm9wLCBwcm9wcykgewogICAgICAgIHVzZXJGb3J3YXJkSG9zdFByb3AuY2FsbCh0ZW1wbGF0ZS5fX3RlbXBsYXRpemVPd25lciwKICAgICAgICAgIHByb3Auc3Vic3RyaW5nKCdfaG9zdF8nLmxlbmd0aCksIHByb3BzW3Byb3BdKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGROb3RpZnlFZmZlY3RzKGtsYXNzLCB0ZW1wbGF0ZSwgdGVtcGxhdGVJbmZvLCBvcHRpb25zKSB7CiAgICAgIGxldCBob3N0UHJvcHMgPSB0ZW1wbGF0ZUluZm8uaG9zdFByb3BzIHx8IHt9OwogICAgICBmb3IgKGxldCBpcHJvcCBpbiBvcHRpb25zLmluc3RhbmNlUHJvcHMpIHsKICAgICAgICBkZWxldGUgaG9zdFByb3BzW2lwcm9wXTsKICAgICAgICBsZXQgdXNlck5vdGlmeUluc3RhbmNlUHJvcCA9IG9wdGlvbnMubm90aWZ5SW5zdGFuY2VQcm9wOwogICAgICAgIGlmICh1c2VyTm90aWZ5SW5zdGFuY2VQcm9wKSB7CiAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuX2FkZFByb3BlcnR5RWZmZWN0KGlwcm9wLAogICAgICAgICAgICBrbGFzcy5wcm90b3R5cGUuUFJPUEVSVFlfRUZGRUNUX1RZUEVTLk5PVElGWSwKICAgICAgICAgICAge2ZuOiBjcmVhdGVOb3RpZnlJbnN0YW5jZVByb3BFZmZlY3QoaXByb3AsIHVzZXJOb3RpZnlJbnN0YW5jZVByb3ApfSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChvcHRpb25zLmZvcndhcmRIb3N0UHJvcCAmJiB0ZW1wbGF0ZS5fX2RhdGFIb3N0KSB7CiAgICAgICAgZm9yIChsZXQgaHByb3AgaW4gaG9zdFByb3BzKSB7CiAgICAgICAgICAvLyBBcyB3ZSdyZSBpdGVyYXRpbmcgaG9zdFByb3BzIGluIHRoaXMgZnVuY3Rpb24sIG5vdGUgd2hldGhlcgogICAgICAgICAgLy8gdGhlcmUgd2VyZSBhbnksIGZvciBhbiBvcHRpbWl6YXRpb24gaW4gYWRkUHJvcGFnYXRlRWZmZWN0cwogICAgICAgICAgaWYgKCF0ZW1wbGF0ZUluZm8uaGFzSG9zdFByb3BzKSB7CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5oYXNIb3N0UHJvcHMgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAga2xhc3MucHJvdG90eXBlLl9hZGRQcm9wZXJ0eUVmZmVjdChocHJvcCwKICAgICAgICAgICAga2xhc3MucHJvdG90eXBlLlBST1BFUlRZX0VGRkVDVF9UWVBFUy5OT1RJRlksCiAgICAgICAgICAgIHtmbjogY3JlYXRlTm90aWZ5SG9zdFByb3BFZmZlY3QoKX0pOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmeUluc3RhbmNlUHJvcEVmZmVjdChpbnN0UHJvcCwgdXNlck5vdGlmeUluc3RhbmNlUHJvcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gbm90aWZ5SW5zdGFuY2VQcm9wKGluc3QsIHByb3AsIHByb3BzKSB7CiAgICAgICAgdXNlck5vdGlmeUluc3RhbmNlUHJvcC5jYWxsKGluc3QuX190ZW1wbGF0aXplT3duZXIsCiAgICAgICAgICBpbnN0LCBwcm9wLCBwcm9wc1twcm9wXSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTm90aWZ5SG9zdFByb3BFZmZlY3QoKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBub3RpZnlIb3N0UHJvcChpbnN0LCBwcm9wLCBwcm9wcykgewogICAgICAgIGluc3QuX19kYXRhSG9zdC5fc2V0UGVuZGluZ1Byb3BlcnR5T3JQYXRoKCdfaG9zdF8nICsgcHJvcCwgcHJvcHNbcHJvcF0sIHRydWUsIHRydWUpOwogICAgICB9OwogICAgfQoKCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gYW5vbnltb3VzIGBQcm9wZXJ0eUVmZmVjdHNgIGNsYXNzIGJvdW5kIHRvIHRoZQogICAgICogYDx0ZW1wbGF0ZT5gIHByb3ZpZGVkLiAgSW5zdGFuY2luZyB0aGUgY2xhc3Mgd2lsbCByZXN1bHQgaW4gdGhlCiAgICAgKiB0ZW1wbGF0ZSBiZWluZyBzdGFtcGVkIGludG8gYSBkb2N1bWVudCBmcmFnbWVudCBzdG9yZWQgYXMgdGhlIGluc3RhbmNlJ3MKICAgICAqIGByb290YCBwcm9wZXJ0eSwgYWZ0ZXIgd2hpY2ggaXQgY2FuIGJlIGFwcGVuZGVkIHRvIHRoZSBET00uCiAgICAgKgogICAgICogVGVtcGxhdGVzIG1heSB1dGlsaXplIGFsbCBQb2x5bWVyIGRhdGEtYmluZGluZyBmZWF0dXJlcyBhcyB3ZWxsIGFzCiAgICAgKiBkZWNsYXJhdGl2ZSBldmVudCBsaXN0ZW5lcnMuICBFdmVudCBsaXN0ZW5lcnMgYW5kIGlubGluZSBjb21wdXRpbmcKICAgICAqIGZ1bmN0aW9ucyBpbiB0aGUgdGVtcGxhdGUgd2lsbCBiZSBjYWxsZWQgb24gdGhlIGhvc3Qgb2YgdGhlIHRlbXBsYXRlLgogICAgICoKICAgICAqIFRoZSBjb25zdHJ1Y3RvciByZXR1cm5lZCB0YWtlcyBhIHNpbmdsZSBhcmd1bWVudCBkaWN0aW9uYXJ5IG9mIGluaXRpYWwKICAgICAqIHByb3BlcnR5IHZhbHVlcyB0byBwcm9wYWdhdGUgaW50byB0ZW1wbGF0ZSBiaW5kaW5ncy4gIEFkZGl0aW9uYWxseQogICAgICogaG9zdCBwcm9wZXJ0aWVzIGNhbiBiZSBmb3J3YXJkZWQgaW4sIGFuZCBpbnN0YW5jZSBwcm9wZXJ0aWVzIGNhbiBiZQogICAgICogbm90aWZpZWQgb3V0IGJ5IHByb3ZpZGluZyBvcHRpb25hbCBjYWxsYmFja3MgaW4gdGhlIGBvcHRpb25zYCBkaWN0aW9uYXJ5LgogICAgICoKICAgICAqIFZhbGlkIGNvbmZpZ3VyYXRpb24gaW4gYG9wdGlvbnNgIGFyZSBhcyBmb2xsb3dzOgogICAgICoKICAgICAqIC0gYGZvcndhcmRIb3N0UHJvcChwcm9wZXJ0eSwgdmFsdWUpYDogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSByZWZlcmVuY2VkCiAgICAgKiAgIGluIHRoZSB0ZW1wbGF0ZSBjaGFuZ2VkIG9uIHRoZSB0ZW1wbGF0ZSdzIGhvc3QuIEFzIHRoaXMgbGlicmFyeSBkb2VzCiAgICAgKiAgIG5vdCByZXRhaW4gcmVmZXJlbmNlcyB0byB0ZW1wbGF0ZXMgaW5zdGFuY2VkIGJ5IHRoZSB1c2VyLCBpdCBpcyB0aGUKICAgICAqICAgdGVtcGxhdGl6ZSBvd25lcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZvcndhcmQgaG9zdCBwcm9wZXJ0eSBjaGFuZ2VzIGludG8KICAgICAqICAgdXNlci1zdGFtcGVkIGluc3RhbmNlcy4gIFRoZSBgaW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3BlcnR5LCB2YWx1ZSlgCiAgICAgKiAgICBtZXRob2Qgb24gdGhlIGdlbmVyYXRlZCBjbGFzcyBzaG91bGQgYmUgY2FsbGVkIHRvIGZvcndhcmQgaG9zdAogICAgICogICBwcm9wZXJ0aWVzIGludG8gdGhlIHRlbXBsYXRlIHRvIHByZXZlbnQgdW5uZWNlc3NhcnkgcHJvcGVydHktY2hhbmdlZAogICAgICogICBub3RpZmljYXRpb25zLiBBbnkgcHJvcGVydGllcyByZWZlcmVuY2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QKICAgICAqICAgZGVmaW5lZCBpbiBgaW5zdGFuY2VQcm9wc2Agd2lsbCBiZSBub3RpZmllZCB1cCB0byB0aGUgdGVtcGxhdGUncyBob3N0CiAgICAgKiAgIGF1dG9tYXRpY2FsbHkuCiAgICAgKiAtIGBpbnN0YW5jZVByb3BzYDogRGljdGlvbmFyeSBvZiBwcm9wZXJ0eSBuYW1lcyB0aGF0IHdpbGwgYmUgYWRkZWQKICAgICAqICAgdG8gdGhlIGluc3RhbmNlIGJ5IHRoZSB0ZW1wbGF0aXplIG93bmVyLiAgVGhlc2UgcHJvcGVydGllcyBzaGFkb3cgYW55CiAgICAgKiAgIGhvc3QgcHJvcGVydGllcywgYW5kIGNoYW5nZXMgd2l0aGluIHRoZSB0ZW1wbGF0ZSB0byB0aGVzZSBwcm9wZXJ0aWVzCiAgICAgKiAgIHdpbGwgcmVzdWx0IGluIGBub3RpZnlJbnN0YW5jZVByb3BgIGJlaW5nIGNhbGxlZC4KICAgICAqIC0gYG11dGFibGVEYXRhYDogV2hlbiBgdHJ1ZWAsIHRoZSBnZW5lcmF0ZWQgY2xhc3Mgd2lsbCBza2lwIHN0cmljdAogICAgICogICBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAgICogICAiZGlydHkiKS4KICAgICAqIC0gYG5vdGlmeUluc3RhbmNlUHJvcChpbnN0YW5jZSwgcHJvcGVydHksIHZhbHVlKWA6IENhbGxlZCB3aGVuCiAgICAgKiAgIGFuIGluc3RhbmNlIHByb3BlcnR5IGNoYW5nZXMuICBVc2VycyBtYXkgY2hvb3NlIHRvIGNhbGwgYG5vdGlmeVBhdGhgCiAgICAgKiAgIG9uIGUuZy4gdGhlIG93bmVyIHRvIG5vdGlmeSB0aGUgY2hhbmdlLgogICAgICogLSBgcGFyZW50TW9kZWxgOiBXaGVuIGB0cnVlYCwgZXZlbnRzIGhhbmRsZWQgYnkgZGVjbGFyYXRpdmUgZXZlbnQgbGlzdGVuZXJzCiAgICAgKiAgIChgb24tZXZlbnQ9ImhhbmRsZXIiYCkgd2lsbCBiZSBkZWNvcmF0ZWQgd2l0aCBhIGBtb2RlbGAgcHJvcGVydHkgcG9pbnRpbmcKICAgICAqICAgdG8gdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRoYXQgc3RhbXBlZCBpdC4gIEl0IHdpbGwgYWxzbyBiZSByZXR1cm5lZAogICAgICogICBmcm9tIGBpbnN0YW5jZS5wYXJlbnRNb2RlbGAgaW4gY2FzZXMgd2hlcmUgdGVtcGxhdGUgaW5zdGFuY2UgbmVzdGluZwogICAgICogICBjYXVzZXMgYW4gaW5uZXIgbW9kZWwgdG8gc2hhZG93IGFuIG91dGVyIG1vZGVsLgogICAgICoKICAgICAqIEFsbCBjYWxsYmFja3MgYXJlIGNhbGxlZCBib3VuZCB0byB0aGUgYG93bmVyYC4gQW55IGNvbnRleHQKICAgICAqIG5lZWRlZCBmb3IgdGhlIGNhbGxiYWNrcyAoc3VjaCBhcyByZWZlcmVuY2VzIHRvIGBpbnN0YW5jZXNgIHN0YW1wZWQpCiAgICAgKiBzaG91bGQgYmUgc3RvcmVkIG9uIHRoZSBgb3duZXJgIHN1Y2ggdGhhdCB0aGV5IGNhbiBiZSByZXRyaWV2ZWQgdmlhCiAgICAgKiBgdGhpc2AuCiAgICAgKgogICAgICogV2hlbiBgb3B0aW9ucy5mb3J3YXJkSG9zdFByb3BgIGlzIGRlY2xhcmVkIGFzIGFuIG9wdGlvbiwgYW55IHByb3BlcnRpZXMKICAgICAqIHJlZmVyZW5jZWQgaW4gdGhlIHRlbXBsYXRlIHdpbGwgYmUgYXV0b21hdGljYWxseSBmb3J3YXJkZWQgZnJvbSB0aGUgaG9zdCBvZgogICAgICogdGhlIGA8dGVtcGxhdGU+YCB0byBpbnN0YW5jZXMsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhbnkgcHJvcGVydGllcyBsaXN0ZWQgaW4KICAgICAqIHRoZSBgb3B0aW9ucy5pbnN0YW5jZVByb3BzYCBvYmplY3QuICBgaW5zdGFuY2VQcm9wc2AgYXJlIGFzc3VtZWQgdG8gYmUKICAgICAqIG1hbmFnZWQgYnkgdGhlIG93bmVyIG9mIHRoZSBpbnN0YW5jZXMsIGVpdGhlciBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IKICAgICAqIG9yIHNldCBhZnRlciB0aGUgZmFjdC4gIE5vdGUsIGFueSBwcm9wZXJ0aWVzIHBhc3NlZCBpbnRvIHRoZSBjb25zdHJ1Y3RvciB3aWxsCiAgICAgKiBhbHdheXMgYmUgc2V0IHRvIHRoZSBpbnN0YW5jZSAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgd291bGQgbm9ybWFsbHkKICAgICAqIGJlIGZvcndhcmRlZCBmcm9tIHRoZSBob3N0KS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgYHRlbXBsYXRpemUoKWAgY2FuIGJlIHJ1biBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gYDx0ZW1wbGF0ZT5gLgogICAgICogRnVydGhlciBjYWxscyB3aWxsIHJlc3VsdCBpbiBhbiBlcnJvci4gQWxzbywgdGhlcmUgaXMgYSBzcGVjaWFsCiAgICAgKiBiZWhhdmlvciBpZiB0aGUgdGVtcGxhdGUgd2FzIGR1cGxpY2F0ZWQgdGhyb3VnaCBhIG1lY2hhbmlzbSBzdWNoIGFzCiAgICAgKiBgPGRvbS1yZXBlYXQ+YCBvciBgPHRlc3QtZml4dHVyZT5gLiBJbiB0aGlzIGNhc2UsIGFsbCBjYWxscyB0bwogICAgICogYHRlbXBsYXRpemUoKWAgcmV0dXJuIHRoZSBzYW1lIGNsYXNzIGZvciBhbGwgZHVwbGljYXRlcyBvZiBhIHRlbXBsYXRlLgogICAgICogVGhlIGNsYXNzIHJldHVybmVkIGZyb20gYHRlbXBsYXRpemUoKWAgaXMgZ2VuZXJhdGVkIG9ubHkgb25jZSB1c2luZwogICAgICogdGhlIGBvcHRpb25zYCBmcm9tIHRoZSBmaXJzdCBjYWxsLiBUaGlzIG1lYW5zIHRoYXQgYW55IGBvcHRpb25zYAogICAgICogcHJvdmlkZWQgdG8gc3Vic2VxdWVudCBjYWxscyB3aWxsIGJlIGlnbm9yZWQuIFRoZXJlZm9yZSwgaXQgaXMgdmVyeQogICAgICogaW1wb3J0YW50IG5vdCB0byBjbG9zZSBvdmVyIGFueSB2YXJpYWJsZXMgaW5zaWRlIHRoZSBjYWxsYmFja3MuIEFsc28sCiAgICAgKiBhcnJvdyBmdW5jdGlvbnMgbXVzdCBiZSBhdm9pZGVkIGJlY2F1c2UgdGhleSBiaW5kIHRoZSBvdXRlciBgdGhpc2AuCiAgICAgKiBJbnNpZGUgdGhlIGNhbGxiYWNrcywgYW55IGNvbnRleHR1YWwgaW5mb3JtYXRpb24gY2FuIGJlIGFjY2Vzc2VkCiAgICAgKiB0aHJvdWdoIGB0aGlzYCwgd2hpY2ggcG9pbnRzIHRvIHRoZSBgb3duZXJgLgogICAgICoKICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlIFRlbXBsYXRlIHRvIHRlbXBsYXRpemUKICAgICAqIEBwYXJhbSB7UG9seW1lcl9Qcm9wZXJ0eUVmZmVjdHM9fSBvd25lciBPd25lciBvZiB0aGUgdGVtcGxhdGUgaW5zdGFuY2VzOwogICAgICogICBhbnkgb3B0aW9uYWwgY2FsbGJhY2tzIHdpbGwgYmUgYm91bmQgdG8gdGhpcyBvd25lci4KICAgICAqIEBwYXJhbSB7T2JqZWN0PX0gb3B0aW9ucyBPcHRpb25zIGRpY3Rpb25hcnkgKHNlZSBzdW1tYXJ5IGZvciBkZXRhaWxzKQogICAgICogQHJldHVybiB7ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlLCBPYmplY3Q9KX0gR2VuZXJhdGVkIGNsYXNzIGJvdW5kCiAgICAgKiAgIHRvIHRoZSB0ZW1wbGF0ZSBwcm92aWRlZAogICAgICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRlbXBsYXRpemUodGVtcGxhdGUsIG93bmVyLCBvcHRpb25zKSB7CiAgICAgIC8vIFVuZGVyIHN0cmljdFRlbXBsYXRlUG9saWN5LCB0aGUgdGVtcGxhdGl6ZWQgZWxlbWVudCBtdXN0IGJlIG93bmVkCiAgICAgIC8vIGJ5IGEgKHRydXN0ZWQpIFBvbHltZXIgZWxlbWVudCwgaW5kaWNhdGVkIGJ5IGV4aXN0ZW5jZSBvZiBfbWV0aG9kSG9zdDsKICAgICAgLy8gZS5nLiBmb3IgZG9tLWlmICYgZG9tLXJlcGVhdCBpbiBtYWluIGRvY3VtZW50LCBfbWV0aG9kSG9zdCBpcyBudWxsCiAgICAgIGlmIChzdHJpY3RUZW1wbGF0ZVBvbGljeSAmJiAhZmluZE1ldGhvZEhvc3QodGVtcGxhdGUpKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdzdHJpY3RUZW1wbGF0ZVBvbGljeTogdGVtcGxhdGUgb3duZXIgbm90IHRydXN0ZWQnKTsKICAgICAgfQogICAgICBvcHRpb25zID0gLyoqIEB0eXBlIHshVGVtcGxhdGl6ZU9wdGlvbnN9ICovKG9wdGlvbnMgfHwge30pOwogICAgICBpZiAodGVtcGxhdGUuX190ZW1wbGF0aXplT3duZXIpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0EgPHRlbXBsYXRlPiBjYW4gb25seSBiZSB0ZW1wbGF0aXplZCBvbmNlJyk7CiAgICAgIH0KICAgICAgdGVtcGxhdGUuX190ZW1wbGF0aXplT3duZXIgPSBvd25lcjsKICAgICAgY29uc3QgY3RvciA9IG93bmVyID8gb3duZXIuY29uc3RydWN0b3IgOiBUZW1wbGF0ZUluc3RhbmNlQmFzZTsKICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IGN0b3IuX3BhcnNlVGVtcGxhdGUodGVtcGxhdGUpOwogICAgICAvLyBHZXQgbWVtb2l6ZWQgYmFzZSBjbGFzcyBmb3IgdGhlIHByb3RvdHlwaWNhbCB0ZW1wbGF0ZSwgd2hpY2gKICAgICAgLy8gaW5jbHVkZXMgcHJvcGVydHkgZWZmZWN0cyBmb3IgYmluZGluZyB0ZW1wbGF0ZSAmIGZvcndhcmRpbmcKICAgICAgLyoqCiAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgKiBAZXh0ZW5kcyB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9CiAgICAgICAqLwogICAgICBsZXQgYmFzZUNsYXNzID0gdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzOwogICAgICBpZiAoIWJhc2VDbGFzcykgewogICAgICAgIGJhc2VDbGFzcyA9IGNyZWF0ZVRlbXBsYXRpemVyQ2xhc3ModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucyk7CiAgICAgICAgdGVtcGxhdGVJbmZvLnRlbXBsYXRpemVJbnN0YW5jZUNsYXNzID0gYmFzZUNsYXNzOwogICAgICB9CiAgICAgIGNvbnN0IG1ldGhvZEhvc3QgPSBmaW5kTWV0aG9kSG9zdCh0ZW1wbGF0ZSk7CiAgICAgIC8vIEhvc3QgcHJvcGVydHkgZm9yd2FyZGluZyBtdXN0IGJlIGluc3RhbGxlZCBvbnRvIHRlbXBsYXRlIGluc3RhbmNlCiAgICAgIGFkZFByb3BhZ2F0ZUVmZmVjdHModGVtcGxhdGUsIHRlbXBsYXRlSW5mbywgb3B0aW9ucywgbWV0aG9kSG9zdCk7CiAgICAgIC8vIFN1YmNsYXNzIGJhc2UgY2xhc3MgYW5kIGFkZCByZWZlcmVuY2UgZm9yIHRoaXMgc3BlY2lmaWMgdGVtcGxhdGUKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGxldCBrbGFzcyA9IGNsYXNzIFRlbXBsYXRlSW5zdGFuY2UgZXh0ZW5kcyBiYXNlQ2xhc3Mge307CiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAga2xhc3MucHJvdG90eXBlLl9tZXRob2RIb3N0ID0gbWV0aG9kSG9zdDsKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBrbGFzcy5wcm90b3R5cGUuX19kYXRhSG9zdCA9IC8qKiBAdHlwZSB7IURhdGFUZW1wbGF0ZX0gKi8gKHRlbXBsYXRlKTsKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBrbGFzcy5wcm90b3R5cGUuX190ZW1wbGF0aXplT3duZXIgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovIChvd25lcik7CiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAga2xhc3MucHJvdG90eXBlLl9faG9zdFByb3BzID0gdGVtcGxhdGVJbmZvLmhvc3RQcm9wczsKICAgICAga2xhc3MgPSAvKiogQHR5cGUge2Z1bmN0aW9uKG5ldzpUZW1wbGF0ZUluc3RhbmNlQmFzZSl9ICovKGtsYXNzKTsgLy9lc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNlbGYtYXNzaWduCiAgICAgIHJldHVybiBrbGFzczsKICAgIH0KCiAgICBmdW5jdGlvbiB3YXJuT25VbmRlY2xhcmVkUHJvcGVydGllcyh0ZW1wbGF0ZUluZm8sIG9wdGlvbnMsIG1ldGhvZEhvc3QpIHsKICAgICAgY29uc3QgZGVjbGFyZWRQcm9wcyA9IG1ldGhvZEhvc3QuY29uc3RydWN0b3IuX3Byb3BlcnRpZXM7CiAgICAgIGNvbnN0IHtwcm9wZXJ0eUVmZmVjdHN9ID0gdGVtcGxhdGVJbmZvOwogICAgICBjb25zdCB7aW5zdGFuY2VQcm9wc30gPSBvcHRpb25zOwogICAgICBmb3IgKGxldCBwcm9wIGluIHByb3BlcnR5RWZmZWN0cykgewogICAgICAgIC8vIEVuc3VyZSBwcm9wZXJ0aWVzIHdpdGggdGVtcGxhdGUgZWZmZWN0cyBhcmUgZGVjbGFyZWQgb24gdGhlIG91dGVybW9zdAogICAgICAgIC8vIGhvc3QgKGBtZXRob2RIb3N0YCksIHVubGVzcyB0aGV5IGFyZSBpbnN0YW5jZSBwcm9wcyBvciBzdGF0aWMgZnVuY3Rpb25zCiAgICAgICAgaWYgKCFkZWNsYXJlZFByb3BzW3Byb3BdICYmICEoaW5zdGFuY2VQcm9wcyAmJiBpbnN0YW5jZVByb3BzW3Byb3BdKSkgewogICAgICAgICAgY29uc3QgZWZmZWN0cyA9IHByb3BlcnR5RWZmZWN0c1twcm9wXTsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTxlZmZlY3RzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGNvbnN0IHtwYXJ0fSA9IGVmZmVjdHNbaV0uaW5mbzsKICAgICAgICAgICAgaWYgKCEocGFydC5zaWduYXR1cmUgJiYgcGFydC5zaWduYXR1cmUuc3RhdGljKSkgewogICAgICAgICAgICAgIGNvbnNvbGUud2FybihgUHJvcGVydHkgJyR7cHJvcH0nIHVzZWQgaW4gdGVtcGxhdGUgYnV0IG5vdCBgICsKICAgICAgICAgICAgICAgIGBkZWNsYXJlZCBpbiAncHJvcGVydGllcyc7IGF0dHJpYnV0ZSB3aWxsIG5vdCBiZSBvYnNlcnZlZC5gKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICogc2VydmVzIGFzIHRoZSBiaW5kaW5nIHNjb3BlIGZvciB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdGhlIGVsZW1lbnQgaXMKICAgICAqIGNvbnRhaW5lZCBpbi4gQSB0ZW1wbGF0ZSBtb2RlbCBpcyBhbiBpbnN0YW5jZSBvZgogICAgICogYFRlbXBsYXRlSW5zdGFuY2VCYXNlYCwgYW5kIHNob3VsZCBiZSB1c2VkIHRvIG1hbmlwdWxhdGUgZGF0YQogICAgICogYXNzb2NpYXRlZCB3aXRoIHRoaXMgdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgKiAgIGlmIChtb2RlbC5pbmRleCA8IDEwKSB7CiAgICAgKiAgICAgbW9kZWwuc2V0KCdpdGVtLmNoZWNrZWQnLCB0cnVlKTsKICAgICAqICAgfQogICAgICoKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IHRlbXBsYXRlIFRoZSBtb2RlbCB3aWxsIGJlIHJldHVybmVkIGZvcgogICAgICogICBlbGVtZW50cyBzdGFtcGVkIGZyb20gdGhpcyB0ZW1wbGF0ZSAoYWNjZXB0cyBlaXRoZXIgYW4gSFRNTFRlbXBsYXRlRWxlbWVudCkKICAgICAqICAgb3IgYSBgPGRvbS1pZj5gL2A8ZG9tLXJlcGVhdD5gIGVsZW1lbnQgd2hlbiB1c2luZyBgcmVtb3ZlTmVzdGVkVGVtcGxhdGVzYAogICAgICogICBvcHRpbWl6YXRpb24uCiAgICAgKiBAcGFyYW0ge05vZGU9fSBub2RlIE5vZGUgZm9yIHdoaWNoIHRvIHJldHVybiBhIHRlbXBsYXRlIG1vZGVsLgogICAgICogQHJldHVybiB7VGVtcGxhdGVJbnN0YW5jZUJhc2V9IFRlbXBsYXRlIGluc3RhbmNlIHJlcHJlc2VudGluZyB0aGUKICAgICAqICAgYmluZGluZyBzY29wZSBmb3IgdGhlIGVsZW1lbnQKICAgICAqLwogICAgZnVuY3Rpb24gbW9kZWxGb3JFbGVtZW50KHRlbXBsYXRlLCBub2RlKSB7CiAgICAgIGxldCBtb2RlbDsKICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAvLyBBbiBlbGVtZW50IHdpdGggYSBfX3RlbXBsYXRpemVJbnN0YW5jZSBtYXJrcyB0aGUgdG9wIGJvdW5kYXJ5CiAgICAgICAgLy8gb2YgYSBzY29wZTsgd2FsayB1cCB1bnRpbCB3ZSBmaW5kIG9uZSwgYW5kIHRoZW4gZW5zdXJlIHRoYXQKICAgICAgICAvLyBpdHMgX19kYXRhSG9zdCBtYXRjaGVzIGB0aGlzYCwgbWVhbmluZyB0aGlzIGRvbS1yZXBlYXQgc3RhbXBlZCBpdAogICAgICAgIGlmICgobW9kZWwgPSBub2RlLl9fZGF0YUhvc3QgPyBub2RlIDogbm9kZS5fX3RlbXBsYXRpemVJbnN0YW5jZSkpIHsKICAgICAgICAgIC8vIEZvdW5kIGFuIGVsZW1lbnQgc3RhbXBlZCBieSBhbm90aGVyIHRlbXBsYXRlOyBrZWVwIHdhbGtpbmcgdXAKICAgICAgICAgIC8vIGZyb20gaXRzIF9fZGF0YUhvc3QKICAgICAgICAgIGlmIChtb2RlbC5fX2RhdGFIb3N0ICE9IHRlbXBsYXRlKSB7CiAgICAgICAgICAgIG5vZGUgPSBtb2RlbC5fX2RhdGFIb3N0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG1vZGVsOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTdGlsbCBpbiBhIHRlbXBsYXRlIHNjb3BlLCBrZWVwIGdvaW5nIHVwIHVudGlsCiAgICAgICAgICAvLyBhIF9fdGVtcGxhdGl6ZUluc3RhbmNlIGlzIGZvdW5kCiAgICAgICAgICBub2RlID0gd3JhcChub2RlKS5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogVGhlIGBUZW1wbGF0aXplcmAgYmVoYXZpb3IgYWRkcyBtZXRob2RzIHRvIGdlbmVyYXRlIGluc3RhbmNlcyBvZgogICAgICogdGVtcGxhdGVzIHRoYXQgYXJlIGVhY2ggbWFuYWdlZCBieSBhbiBhbm9ueW1vdXMgYFByb3BlcnR5RWZmZWN0c2AKICAgICAqIGluc3RhbmNlIHdoZXJlIGRhdGEtYmluZGluZ3MgaW4gdGhlIHN0YW1wZWQgdGVtcGxhdGUgY29udGVudCBhcmUgYm91bmQgdG8KICAgICAqIGFjY2Vzc29ycyBvbiBpdHNlbGYuCiAgICAgKgogICAgICogVGhpcyBiZWhhdmlvciBpcyBwcm92aWRlZCBpbiBQb2x5bWVyIDIueC0zLnggYXMgYSBoeWJyaWQtZWxlbWVudCBjb252ZW5pZW5jZQogICAgICogb25seS4gIEZvciBub24taHlicmlkIHVzYWdlLCB0aGUgYFRlbXBsYXRpemVgIGxpYnJhcnkKICAgICAqIHNob3VsZCBiZSB1c2VkIGluc3RlYWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgaW1wb3J0IHtkb219IGZyb20gJ0Bwb2x5bWVyL3BvbHltZXIvbGliL2xlZ2FjeS9wb2x5bWVyLmRvbS5qcyc7CiAgICAgKiAgICAgLy8gR2V0IGEgdGVtcGxhdGUgZnJvbSBzb21ld2hlcmUsIGUuZy4gbGlnaHQgRE9NCiAgICAgKiAgICAgbGV0IHRlbXBsYXRlID0gdGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpOwogICAgICogICAgIC8vIFByZXBhcmUgdGhlIHRlbXBsYXRlCiAgICAgKiAgICAgdGhpcy50ZW1wbGF0aXplKHRlbXBsYXRlKTsKICAgICAqICAgICAvLyBJbnN0YW5jZSB0aGUgdGVtcGxhdGUgd2l0aCBhbiBpbml0aWFsIGRhdGEgbW9kZWwKICAgICAqICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLnN0YW1wKHtteVByb3A6ICdpbml0aWFsJ30pOwogICAgICogICAgIC8vIEluc2VydCB0aGUgaW5zdGFuY2UncyBET00gc29tZXdoZXJlLCBlLmcuIGxpZ2h0IERPTQogICAgICogICAgIGRvbSh0aGlzKS5hcHBlbmRDaGlsZChpbnN0YW5jZS5yb290KTsKICAgICAqICAgICAvLyBDaGFuZ2luZyBhIHByb3BlcnR5IG9uIHRoZSBpbnN0YW5jZSB3aWxsIHByb3BhZ2F0ZSB0byBiaW5kaW5ncwogICAgICogICAgIC8vIGluIHRoZSB0ZW1wbGF0ZQogICAgICogICAgIGluc3RhbmNlLm15UHJvcCA9ICduZXcgdmFsdWUnOwogICAgICoKICAgICAqIFVzZXJzIG9mIGBUZW1wbGF0aXplcmAgbWF5IG5lZWQgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgYWJzdHJhY3QKICAgICAqIEFQSSdzIHRvIGRldGVybWluZSBob3cgcHJvcGVydGllcyBhbmQgcGF0aHMgZnJvbSB0aGUgaG9zdCBzaG91bGQgYmUKICAgICAqIGZvcndhcmRlZCBpbnRvIHRvIGluc3RhbmNlczoKICAgICAqCiAgICAgKiAgICAgX2ZvcndhcmRIb3N0UHJvcFYyOiBmdW5jdGlvbihwcm9wLCB2YWx1ZSkKICAgICAqCiAgICAgKiBMaWtld2lzZSwgdXNlcnMgbWF5IGltcGxlbWVudCB0aGVzZSBhZGRpdGlvbmFsIGFic3RyYWN0IEFQSSdzIHRvIGRldGVybWluZQogICAgICogaG93IGluc3RhbmNlLXNwZWNpZmljIHByb3BlcnRpZXMgdGhhdCBjaGFuZ2Ugb24gdGhlIGluc3RhbmNlIHNob3VsZCBiZQogICAgICogZm9yd2FyZGVkIG91dCB0byB0aGUgaG9zdCwgaWYgbmVjZXNzYXJ5LgogICAgICoKICAgICAqICAgICBfbm90aWZ5SW5zdGFuY2VQcm9wVjI6IGZ1bmN0aW9uKGluc3QsIHByb3AsIHZhbHVlKQogICAgICoKICAgICAqIEluIG9yZGVyIHRvIGRldGVybWluZSB3aGljaCBwcm9wZXJ0aWVzIGFyZSBpbnN0YW5jZS1zcGVjaWZpYyBhbmQgcmVxdWlyZQogICAgICogY3VzdG9tIG5vdGlmaWNhdGlvbiB2aWEgYF9ub3RpZnlJbnN0YW5jZVByb3BgLCBkZWZpbmUgYW4gYF9pbnN0YW5jZVByb3BzYAogICAgICogb2JqZWN0IGNvbnRhaW5pbmcga2V5cyBmb3IgZWFjaCBpbnN0YW5jZSBwcm9wLCBmb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgX2luc3RhbmNlUHJvcHM6IHsKICAgICAqICAgICAgIGl0ZW06IHRydWUsCiAgICAgKiAgICAgICBpbmRleDogdHJ1ZQogICAgICogICAgIH0KICAgICAqCiAgICAgKiBBbnkgcHJvcGVydGllcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSB0aGF0IGFyZSBub3QgZGVmaW5lZCBpbiBfaW5zdGFuY2VQcm9wCiAgICAgKiB3aWxsIGJlIGZvcndhcmRlZCBvdXQgdG8gdGhlIFRlbXBsYXRpemUgYG93bmVyYCBhdXRvbWF0aWNhbGx5LgogICAgICoKICAgICAqIFVzZXJzIG1heSBhbHNvIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIGFic3RyYWN0IGZ1bmN0aW9uIHRvIHNob3cgb3IKICAgICAqIGhpZGUgYW55IERPTSBnZW5lcmF0ZWQgdXNpbmcgYHN0YW1wYDoKICAgICAqCiAgICAgKiAgICAgX3Nob3dIaWRlQ2hpbGRyZW46IGZ1bmN0aW9uKHNob3VsZEhpZGUpCiAgICAgKgogICAgICogTm90ZSB0aGF0IHNvbWUgY2FsbGJhY2tzIGFyZSBzdWZmaXhlZCB3aXRoIGBWMmAgaW4gdGhlIFBvbHltZXIgMi54IGJlaGF2aW9yCiAgICAgKiBhcyB0aGUgaW1wbGVtZW50YXRpb25zIHdpbGwgbmVlZCB0byBkaWZmZXIgZnJvbSB0aGUgY2FsbGJhY2tzIHJlcXVpcmVkCiAgICAgKiBieSB0aGUgMS54IFRlbXBsYXRpemVyIEFQSSBkdWUgdG8gY2hhbmdlcyBpbiB0aGUgYFRlbXBsYXRlSW5zdGFuY2VgIEFQSQogICAgICogYmV0d2VlbiB2ZXJzaW9ucyAxLnggYW5kIDIueC4KICAgICAqCiAgICAgKiBAcG9seW1lckJlaGF2aW9yCiAgICAgKi8KICAgIGNvbnN0IFRlbXBsYXRpemVyID0gewoKICAgICAgLyoqCiAgICAgICAqIEdlbmVyYXRlcyBhbiBhbm9ueW1vdXMgYFRlbXBsYXRlSW5zdGFuY2VgIGNsYXNzIChzdG9yZWQgYXMgYHRoaXMuY3RvcmApCiAgICAgICAqIGZvciB0aGUgcHJvdmlkZWQgdGVtcGxhdGUuICBUaGlzIG1ldGhvZCBzaG91bGQgYmUgY2FsbGVkIG9uY2UgcGVyCiAgICAgICAqIHRlbXBsYXRlIHRvIHByZXBhcmUgYW4gZWxlbWVudCBmb3Igc3RhbXBpbmcgdGhlIHRlbXBsYXRlLCBmb2xsb3dlZAogICAgICAgKiBieSBgc3RhbXBgIHRvIGNyZWF0ZSBuZXcgaW5zdGFuY2VzIG9mIHRoZSB0ZW1wbGF0ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgVGVtcGxhdGUgdG8gcHJlcGFyZQogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW49fSBtdXRhYmxlRGF0YSBXaGVuIGB0cnVlYCwgdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIHNraXAKICAgICAgICogICBzdHJpY3QgZGlydHktY2hlY2tpbmcgZm9yIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8KICAgICAgICogICBiZSAiZGlydHkiKS4gRGVmYXVsdHMgdG8gZmFsc2UuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICB0ZW1wbGF0aXplKHRlbXBsYXRlLCBtdXRhYmxlRGF0YSkgewogICAgICAgIHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUgPSB0ZW1wbGF0ZTsKICAgICAgICB0aGlzLmN0b3IgPQogICAgICAgICAgICB0ZW1wbGF0aXplKHRlbXBsYXRlLCAvKiogQHR5cGUgeyFQb2x5bWVyX1Byb3BlcnR5RWZmZWN0c30gKi8gKHRoaXMpLCB7CiAgICAgICAgICAgICAgbXV0YWJsZURhdGE6IEJvb2xlYW4obXV0YWJsZURhdGEpLAogICAgICAgICAgICAgIHBhcmVudE1vZGVsOiB0aGlzLl9wYXJlbnRNb2RlbCwKICAgICAgICAgICAgICBpbnN0YW5jZVByb3BzOiB0aGlzLl9pbnN0YW5jZVByb3BzLAogICAgICAgICAgICAgIGZvcndhcmRIb3N0UHJvcDogdGhpcy5fZm9yd2FyZEhvc3RQcm9wVjIsCiAgICAgICAgICAgICAgbm90aWZ5SW5zdGFuY2VQcm9wOiB0aGlzLl9ub3RpZnlJbnN0YW5jZVByb3BWMgogICAgICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBwcmVwYXJlZCBieSBgdGVtcGxhdGl6ZWAuICBUaGUgb2JqZWN0CiAgICAgICAqIHJldHVybmVkIGlzIGFuIGluc3RhbmNlIG9mIHRoZSBhbm9ueW1vdXMgY2xhc3MgZ2VuZXJhdGVkIGJ5IGB0ZW1wbGF0aXplYAogICAgICAgKiB3aG9zZSBgcm9vdGAgcHJvcGVydHkgaXMgYSBkb2N1bWVudCBmcmFnbWVudCBjb250YWluaW5nIG5ld2x5IGNsb25lZAogICAgICAgKiB0ZW1wbGF0ZSBjb250ZW50LCBhbmQgd2hpY2ggaGFzIHByb3BlcnR5IGFjY2Vzc29ycyBjb3JyZXNwb25kaW5nIHRvCiAgICAgICAqIHByb3BlcnRpZXMgcmVmZXJlbmNlZCBpbiB0ZW1wbGF0ZSBiaW5kaW5ncy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBtb2RlbCBPYmplY3QgY29udGFpbmluZyBpbml0aWFsIHByb3BlcnR5IHZhbHVlcyB0bwogICAgICAgKiAgIHBvcHVsYXRlIGludG8gdGhlIHRlbXBsYXRlIGJpbmRpbmdzLgogICAgICAgKiBAcmV0dXJuIHtUZW1wbGF0ZUluc3RhbmNlQmFzZX0gUmV0dXJucyB0aGUgY3JlYXRlZCBpbnN0YW5jZSBvZgogICAgICAgKiB0aGUgdGVtcGxhdGUgcHJlcGFyZWQgYnkgYHRlbXBsYXRpemVgLgogICAgICAgKiBAdGhpcyB7VGVtcGxhdGl6ZXJVc2VyfQogICAgICAgKi8KICAgICAgc3RhbXAobW9kZWwpIHsKICAgICAgICByZXR1cm4gbmV3IHRoaXMuY3Rvcihtb2RlbCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiAoYFRlbXBsYXRlSW5zdGFuY2VgKSBhc3NvY2lhdGVkIHdpdGgKICAgICAgICogYSBnaXZlbiBlbGVtZW50LCB3aGljaCBzZXJ2ZXMgYXMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSB0ZW1wbGF0ZQogICAgICAgKiBpbnN0YW5jZSB0aGUgZWxlbWVudCBpcyBjb250YWluZWQgaW4uICBBIHRlbXBsYXRlIG1vZGVsIHNob3VsZCBiZSB1c2VkCiAgICAgICAqIHRvIG1hbmlwdWxhdGUgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyB0ZW1wbGF0ZSBpbnN0YW5jZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgdGVtcGxhdGUgbW9kZWwuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgICAqICAgdGhlIGVsZW1lbnQuCiAgICAgICAqIEB0aGlzIHtUZW1wbGF0aXplclVzZXJ9CiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgICByZXR1cm4gbW9kZWxGb3JFbGVtZW50KHRoaXMuX3RlbXBsYXRpemVyVGVtcGxhdGUsIGVsKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGxldCBlbGVtZW50c0hpZGRlbiA9IGZhbHNlOwoKICAgIC8qKgogICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBlbGVtZW50cyB3aWxsIGJlIGhpZGRlbiBnbG9iYWxseQogICAgICovCiAgICBmdW5jdGlvbiBoaWRlRWxlbWVudHNHbG9iYWxseSgpIHsKICAgICAgaWYgKGxlZ2FjeU9wdGltaXphdGlvbnMgJiYgIXVzZVNoYWRvdykgewogICAgICAgIGlmICghZWxlbWVudHNIaWRkZW4pIHsKICAgICAgICAgIGVsZW1lbnRzSGlkZGVuID0gdHJ1ZTsKICAgICAgICAgIGNvbnN0IHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gJ2RvbS1iaW5kLGRvbS1pZixkb20tcmVwZWF0e2Rpc3BsYXk6bm9uZTt9JzsKICAgICAgICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge0hUTUxFbGVtZW50fQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfUHJvcGVydHlFZmZlY3RzfQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfT3B0aW9uYWxNdXRhYmxlRGF0YX0KICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0dlc3R1cmVFdmVudExpc3RlbmVyc30KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNvbnN0IGRvbUJpbmRCYXNlID0KICAgICAgR2VzdHVyZUV2ZW50TGlzdGVuZXJzKAogICAgICAgIE9wdGlvbmFsTXV0YWJsZURhdGEoCiAgICAgICAgICBQcm9wZXJ0eUVmZmVjdHMoSFRNTEVsZW1lbnQpKSk7CgogICAgLyoqCiAgICAgKiBDdXN0b20gZWxlbWVudCB0byBhbGxvdyB1c2luZyBQb2x5bWVyJ3MgdGVtcGxhdGUgZmVhdHVyZXMgKGRhdGEgYmluZGluZywKICAgICAqIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycywgZXRjLikgaW4gdGhlIG1haW4gZG9jdW1lbnQgd2l0aG91dCBkZWZpbmluZwogICAgICogYSBuZXcgY3VzdG9tIGVsZW1lbnQuCiAgICAgKgogICAgICogYDx0ZW1wbGF0ZT5gIHRhZ3MgdXRpbGl6aW5nIGJpbmRpbmdzIG1heSBiZSB3cmFwcGVkIHdpdGggdGhlIGA8ZG9tLWJpbmQ+YAogICAgICogZWxlbWVudCwgd2hpY2ggd2lsbCBpbW1lZGlhdGVseSBzdGFtcCB0aGUgd3JhcHBlZCB0ZW1wbGF0ZSBpbnRvIHRoZSBtYWluCiAgICAgKiBkb2N1bWVudCBhbmQgYmluZCBlbGVtZW50cyB0byB0aGUgYGRvbS1iaW5kYCBlbGVtZW50IGl0c2VsZiBhcyB0aGUKICAgICAqIGJpbmRpbmcgc2NvcGUuCiAgICAgKgogICAgICogQHBvbHltZXIKICAgICAqIEBjdXN0b21FbGVtZW50CiAgICAgKiBAYXBwbGllc01peGluIFByb3BlcnR5RWZmZWN0cwogICAgICogQGFwcGxpZXNNaXhpbiBPcHRpb25hbE11dGFibGVEYXRhCiAgICAgKiBAYXBwbGllc01peGluIEdlc3R1cmVFdmVudExpc3RlbmVycwogICAgICogQGV4dGVuZHMge2RvbUJpbmRCYXNlfQogICAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdG8gYWxsb3cgdXNpbmcgUG9seW1lcidzIHRlbXBsYXRlIGZlYXR1cmVzIChkYXRhCiAgICAgKiAgIGJpbmRpbmcsIGRlY2xhcmF0aXZlIGV2ZW50IGxpc3RlbmVycywgZXRjLikgaW4gdGhlIG1haW4gZG9jdW1lbnQuCiAgICAgKi8KICAgIGNsYXNzIERvbUJpbmQgZXh0ZW5kcyBkb21CaW5kQmFzZSB7CgogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVkQXR0cmlidXRlcygpIHsgcmV0dXJuIFsnbXV0YWJsZS1kYXRhJ107IH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgaWYgKHN0cmljdFRlbXBsYXRlUG9saWN5KSB7CiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYHN0cmljdFRlbXBsYXRlUG9saWN5OiBkb20tYmluZCBub3QgYWxsb3dlZGApOwogICAgICAgIH0KICAgICAgICB0aGlzLnJvb3QgPSBudWxsOwogICAgICAgIHRoaXMuJCA9IG51bGw7CiAgICAgICAgdGhpcy5fX2NoaWxkcmVuID0gbnVsbDsKICAgICAgfQoKICAgICAgLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi8KICAgICAgLyoqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIGF0dHJpYnV0ZSB0aGF0IGNoYW5nZWQKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBvbGQgT2xkIGF0dHJpYnV0ZSB2YWx1ZQogICAgICAgKiBAcGFyYW0gez9zdHJpbmd9IHZhbHVlIE5ldyBhdHRyaWJ1dGUgdmFsdWUKICAgICAgICogQHBhcmFtIHs/c3RyaW5nfSBuYW1lc3BhY2UgQXR0cmlidXRlIG5hbWVzcGFjZS4KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGQsIHZhbHVlLCBuYW1lc3BhY2UpIHsKICAgICAgICAvLyBhc3N1bWVzIG9ubHkgb25lIG9ic2VydmVkIGF0dHJpYnV0ZQogICAgICAgIHRoaXMubXV0YWJsZURhdGEgPSB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBpZiAoIWhpZGVFbGVtZW50c0dsb2JhbGx5KCkpIHsKICAgICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICB9CiAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgdGhpcy5fX3JlbW92ZUNoaWxkcmVuKCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0Q2hpbGRyZW4oKSB7CiAgICAgICAgd3JhcCh3cmFwKHRoaXMpLnBhcmVudE5vZGUpLmluc2VydEJlZm9yZSh0aGlzLnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX3JlbW92ZUNoaWxkcmVuKCkgewogICAgICAgIGlmICh0aGlzLl9fY2hpbGRyZW4pIHsKICAgICAgICAgIGZvciAobGV0IGk9MDsgaTx0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5yb290LmFwcGVuZENoaWxkKHRoaXMuX19jaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gVGhpcyBpcyB0eXBpY2FsbHkgb25seQogICAgICAgKiBuZWNlc3NhcnkgdG8gY2FsbCBpZiBIVE1MSW1wb3J0cyB3aXRoIHRoZSBhc3luYyBhdHRyaWJ1dGUgYXJlIHVzZWQuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgbGV0IHRlbXBsYXRlOwogICAgICAgIGlmICghdGhpcy5fX2NoaWxkcmVuKSB7CiAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7P0hUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRlbXBsYXRlIHx8IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSk7CiAgICAgICAgICBpZiAoIXRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8vIFdhaXQgdW50aWwgY2hpbGRMaXN0IGNoYW5nZXMgYW5kIHRlbXBsYXRlIHNob3VsZCBiZSB0aGVyZSBieSB0aGVuCiAgICAgICAgICAgIGxldCBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKCgpID0+IHsKICAgICAgICAgICAgICB0ZW1wbGF0ZSA9IC8qKiBAdHlwZSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gKi8odGhpcy5xdWVyeVNlbGVjdG9yKCd0ZW1wbGF0ZScpKTsKICAgICAgICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZG9tLWJpbmQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMucm9vdCA9IHRoaXMuX3N0YW1wVGVtcGxhdGUoCiAgICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9ICovKHRlbXBsYXRlKSk7CiAgICAgICAgICB0aGlzLiQgPSB0aGlzLnJvb3QuJDsKICAgICAgICAgIHRoaXMuX19jaGlsZHJlbiA9IFtdOwogICAgICAgICAgZm9yIChsZXQgbj10aGlzLnJvb3QuZmlyc3RDaGlsZDsgbjsgbj1uLm5leHRTaWJsaW5nKSB7CiAgICAgICAgICAgIHRoaXMuX19jaGlsZHJlblt0aGlzLl9fY2hpbGRyZW4ubGVuZ3RoXSA9IG47CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9lbmFibGVQcm9wZXJ0aWVzKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19pbnNlcnRDaGlsZHJlbigpOwogICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2RvbS1jaGFuZ2UnLCB7CiAgICAgICAgICBidWJibGVzOiB0cnVlLAogICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICB9KSk7CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKCdkb20tYmluZCcsIERvbUJpbmQpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX09wdGlvbmFsTXV0YWJsZURhdGF9CiAgICAgKiBAZXh0ZW5kcyB7UG9seW1lckVsZW1lbnR9CiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBjb25zdCBkb21SZXBlYXRCYXNlID0gT3B0aW9uYWxNdXRhYmxlRGF0YShQb2x5bWVyRWxlbWVudCk7CgogICAgLyoqCiAgICAgKiBUaGUgYDxkb20tcmVwZWF0PmAgZWxlbWVudCB3aWxsIGF1dG9tYXRpY2FsbHkgc3RhbXAgYW5kIGJpbmRzIG9uZSBpbnN0YW5jZQogICAgICogb2YgdGVtcGxhdGUgY29udGVudCB0byBlYWNoIG9iamVjdCBpbiBhIHVzZXItcHJvdmlkZWQgYXJyYXkuCiAgICAgKiBgZG9tLXJlcGVhdGAgYWNjZXB0cyBhbiBgaXRlbXNgIHByb3BlcnR5LCBhbmQgb25lIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZQogICAgICogaXMgc3RhbXBlZCBmb3IgZWFjaCBpdGVtIGludG8gdGhlIERPTSBhdCB0aGUgbG9jYXRpb24gb2YgdGhlIGBkb20tcmVwZWF0YAogICAgICogZWxlbWVudC4gIFRoZSBgaXRlbWAgcHJvcGVydHkgd2lsbCBiZSBzZXQgb24gZWFjaCBpbnN0YW5jZSdzIGJpbmRpbmcKICAgICAqIHNjb3BlLCB0aHVzIHRlbXBsYXRlcyBzaG91bGQgYmluZCB0byBzdWItcHJvcGVydGllcyBvZiBgaXRlbWAuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZG9tLW1vZHVsZSBpZD0iZW1wbG95ZWUtbGlzdCI+CiAgICAgKgogICAgICogICA8dGVtcGxhdGU+CiAgICAgKgogICAgICogICAgIDxkaXY+IEVtcGxveWVlIGxpc3Q6IDwvZGl2PgogICAgICogICAgIDxkb20tcmVwZWF0IGl0ZW1zPSJ7e2VtcGxveWVlc319Ij4KICAgICAqICAgICAgIDx0ZW1wbGF0ZT4KICAgICAqICAgICAgICAgPGRpdj5GaXJzdCBuYW1lOiA8c3Bhbj57e2l0ZW0uZmlyc3R9fTwvc3Bhbj48L2Rpdj4KICAgICAqICAgICAgICAgPGRpdj5MYXN0IG5hbWU6IDxzcGFuPnt7aXRlbS5sYXN0fX08L3NwYW4+PC9kaXY+CiAgICAgKiAgICAgICA8L3RlbXBsYXRlPgogICAgICogICAgIDwvZG9tLXJlcGVhdD4KICAgICAqCiAgICAgKiAgIDwvdGVtcGxhdGU+CiAgICAgKgogICAgICogPC9kb20tbW9kdWxlPgogICAgICogYGBgCiAgICAgKgogICAgICogV2l0aCB0aGUgZm9sbG93aW5nIGN1c3RvbSBlbGVtZW50IGRlZmluaXRpb246CiAgICAgKgogICAgICogYGBganMKICAgICAqIGNsYXNzIEVtcGxveWVlTGlzdCBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgICAqICAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdlbXBsb3llZS1saXN0JzsgfQogICAgICogICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgKiAgICAgcmV0dXJuIHsKICAgICAqICAgICAgIGVtcGxveWVlczogewogICAgICogICAgICAgICB2YWx1ZSgpIHsKICAgICAqICAgICAgICAgICByZXR1cm4gWwogICAgICogICAgICAgICAgICAge2ZpcnN0OiAnQm9iJywgbGFzdDogJ1NtaXRoJ30sCiAgICAgKiAgICAgICAgICAgICB7Zmlyc3Q6ICdTYWxseScsIGxhc3Q6ICdKb2huc29uJ30sCiAgICAgKiAgICAgICAgICAgICAuLi4KICAgICAqICAgICAgICAgICBdOwogICAgICogICAgICAgICB9CiAgICAgKiAgICAgICB9CiAgICAgKiAgICAgfTsKICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogTm90aWZpY2F0aW9ucyBmb3IgY2hhbmdlcyB0byBpdGVtcyBzdWItcHJvcGVydGllcyB3aWxsIGJlIGZvcndhcmRlZCB0byB0ZW1wbGF0ZQogICAgICogaW5zdGFuY2VzLCB3aGljaCB3aWxsIHVwZGF0ZSB2aWEgdGhlIG5vcm1hbCBzdHJ1Y3R1cmVkIGRhdGEgbm90aWZpY2F0aW9uIHN5c3RlbS4KICAgICAqCiAgICAgKiBNdXRhdGlvbnMgdG8gdGhlIGBpdGVtc2AgYXJyYXkgaXRzZWxmIHNob3VsZCBiZSBtYWRlIHVzaW5nIHRoZSBBcnJheQogICAgICogbXV0YXRpb24gQVBJJ3Mgb24gdGhlIFByb3BlcnR5RWZmZWN0cyBtaXhpbiAoYHB1c2hgLCBgcG9wYCwgYHNwbGljZWAsCiAgICAgKiBgc2hpZnRgLCBgdW5zaGlmdGApLCBhbmQgdGVtcGxhdGUgaW5zdGFuY2VzIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlCiAgICAgKiBkYXRhIGluIHRoZSBhcnJheS4KICAgICAqCiAgICAgKiBFdmVudHMgY2F1Z2h0IGJ5IGV2ZW50IGhhbmRsZXJzIHdpdGhpbiB0aGUgYGRvbS1yZXBlYXRgIHRlbXBsYXRlIHdpbGwgYmUKICAgICAqIGRlY29yYXRlZCB3aXRoIGEgYG1vZGVsYCBwcm9wZXJ0eSwgd2hpY2ggcmVwcmVzZW50cyB0aGUgYmluZGluZyBzY29wZSBmb3IKICAgICAqIGVhY2ggdGVtcGxhdGUgaW5zdGFuY2UuICBUaGUgbW9kZWwgc2hvdWxkIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBkYXRhIG9uIHRoZQogICAgICogaW5zdGFuY2UsIGZvciBleGFtcGxlIGBldmVudC5tb2RlbC5zZXQoJ2l0ZW0uY2hlY2tlZCcsIHRydWUpO2AuCiAgICAgKgogICAgICogQWx0ZXJuYXRpdmVseSwgdGhlIG1vZGVsIGZvciBhIHRlbXBsYXRlIGluc3RhbmNlIGZvciBhbiBlbGVtZW50IHN0YW1wZWQgYnkKICAgICAqIGEgYGRvbS1yZXBlYXRgIGNhbiBiZSBvYnRhaW5lZCB1c2luZyB0aGUgYG1vZGVsRm9yRWxlbWVudGAgQVBJIG9uIHRoZQogICAgICogYGRvbS1yZXBlYXRgIHRoYXQgc3RhbXBlZCBpdCwgZm9yIGV4YW1wbGUKICAgICAqIGB0aGlzLiQuZG9tUmVwZWF0Lm1vZGVsRm9yRWxlbWVudChldmVudC50YXJnZXQpLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7YC4KICAgICAqIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgbWFuaXB1bGF0aW5nIGluc3RhbmNlIGRhdGEgb2YgZXZlbnQgdGFyZ2V0cyBvYnRhaW5lZAogICAgICogYnkgZXZlbnQgaGFuZGxlcnMgb24gcGFyZW50cyBvZiB0aGUgYGRvbS1yZXBlYXRgIChldmVudCBkZWxlZ2F0aW9uKS4KICAgICAqCiAgICAgKiBBIHZpZXctc3BlY2lmaWMgZmlsdGVyL3NvcnQgbWF5IGJlIGFwcGxpZWQgdG8gZWFjaCBgZG9tLXJlcGVhdGAgYnkgc3VwcGx5aW5nIGEKICAgICAqIGBmaWx0ZXJgIGFuZC9vciBgc29ydGAgcHJvcGVydHkuICBUaGlzIG1heSBiZSBhIHN0cmluZyB0aGF0IG5hbWVzIGEgZnVuY3Rpb24gb24KICAgICAqIHRoZSBob3N0LCBvciBhIGZ1bmN0aW9uIG1heSBiZSBhc3NpZ25lZCB0byB0aGUgcHJvcGVydHkgZGlyZWN0bHkuICBUaGUgZnVuY3Rpb25zCiAgICAgKiBzaG91bGQgaW1wbGVtZW50ZWQgZm9sbG93aW5nIHRoZSBzdGFuZGFyZCBgQXJyYXlgIGZpbHRlci9zb3J0IEFQSS4KICAgICAqCiAgICAgKiBJbiBvcmRlciB0byByZS1ydW4gdGhlIGZpbHRlciBvciBzb3J0IGZ1bmN0aW9ucyBiYXNlZCBvbiBjaGFuZ2VzIHRvIHN1Yi1maWVsZHMKICAgICAqIG9mIGBpdGVtc2AsIHRoZSBgb2JzZXJ2ZWAgcHJvcGVydHkgbWF5IGJlIHNldCBhcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mCiAgICAgKiBgaXRlbWAgc3ViLWZpZWxkcyB0aGF0IHNob3VsZCBjYXVzZSBhIHJlLWZpbHRlci9zb3J0IHdoZW4gbW9kaWZpZWQuICBJZgogICAgICogdGhlIGZpbHRlciBvciBzb3J0IGZ1bmN0aW9uIGRlcGVuZHMgb24gcHJvcGVydGllcyBub3QgY29udGFpbmVkIGluIGBpdGVtc2AsCiAgICAgKiB0aGUgdXNlciBzaG91bGQgb2JzZXJ2ZSBjaGFuZ2VzIHRvIHRob3NlIHByb3BlcnRpZXMgYW5kIGNhbGwgYHJlbmRlcmAgdG8gdXBkYXRlCiAgICAgKiB0aGUgdmlldyBiYXNlZCBvbiB0aGUgZGVwZW5kZW5jeSBjaGFuZ2UuCiAgICAgKgogICAgICogRm9yIGV4YW1wbGUsIGZvciBhbiBgZG9tLXJlcGVhdGAgd2l0aCBhIGZpbHRlciBvZiB0aGUgZm9sbG93aW5nOgogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiBpc0VuZ2luZWVyKGl0ZW0pIHsKICAgICAqICAgcmV0dXJuIGl0ZW0udHlwZSA9PSAnZW5naW5lZXInIHx8IGl0ZW0ubWFuYWdlci50eXBlID09ICdlbmdpbmVlcic7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGVuIHRoZSBgb2JzZXJ2ZWAgcHJvcGVydHkgc2hvdWxkIGJlIGNvbmZpZ3VyZWQgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZG9tLXJlcGVhdCBpdGVtcz0ie3tlbXBsb3llZXN9fSIgZmlsdGVyPSJpc0VuZ2luZWVyIiBvYnNlcnZlPSJ0eXBlIG1hbmFnZXIudHlwZSI+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQHBvbHltZXIKICAgICAqIEBleHRlbmRzIHtkb21SZXBlYXRCYXNlfQogICAgICogQGFwcGxpZXNNaXhpbiBPcHRpb25hbE11dGFibGVEYXRhCiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3Igc3RhbXBpbmcgaW5zdGFuY2Ugb2YgYSB0ZW1wbGF0ZSBib3VuZCB0bwogICAgICogICBpdGVtcyBpbiBhbiBhcnJheS4KICAgICAqLwogICAgY2xhc3MgRG9tUmVwZWF0IGV4dGVuZHMgZG9tUmVwZWF0QmFzZSB7CgogICAgICAvLyBOb3QgbmVlZGVkIHRvIGZpbmQgdGVtcGxhdGU7IGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGFuYWx5emVyCiAgICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLXJlcGVhdCc7IH0KCiAgICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7IHJldHVybiBudWxsOyB9CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CgogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW5ldmVyIERPTSBpcyBhZGRlZCBvciByZW1vdmVkIGJ5IHRoaXMgdGVtcGxhdGUgKGJ5CiAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAqIGByZW5kZXJgLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgKi8KICAgICAgICByZXR1cm4gewoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyBpdGVtcyBkZXRlcm1pbmluZyBob3cgbWFueSBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlCiAgICAgICAgICAgKiB0byBzdGFtcCBhbmQgdGhhdCB0aGF0IGVhY2ggdGVtcGxhdGUgaW5zdGFuY2Ugc2hvdWxkIGJpbmQgdG8uCiAgICAgICAgICAgKi8KICAgICAgICAgIGl0ZW1zOiB7CiAgICAgICAgICAgIHR5cGU6IEFycmF5CiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogVGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvIGFkZCB0byB0aGUgYmluZGluZyBzY29wZSBmb3IgdGhlIGFycmF5CiAgICAgICAgICAgKiBlbGVtZW50IGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgICAgICovCiAgICAgICAgICBhczogewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIHZhbHVlOiAnaXRlbScKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICAgKiBvZiB0aGUgaW5zdGFuY2UgaW4gdGhlIHNvcnRlZCBhbmQgZmlsdGVyZWQgbGlzdCBvZiByZW5kZXJlZCBpdGVtcy4KICAgICAgICAgICAqIE5vdGUsIGZvciB0aGUgaW5kZXggaW4gdGhlIGB0aGlzLml0ZW1zYCBhcnJheSwgdXNlIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICAgICAqIGBpdGVtc0luZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAgICovCiAgICAgICAgICBpbmRleEFzOiB7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgdmFsdWU6ICdpbmRleCcKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICAgKiBvZiB0aGUgaW5zdGFuY2UgaW4gdGhlIGB0aGlzLml0ZW1zYCBhcnJheS4gTm90ZSwgZm9yIHRoZSBpbmRleCBvZgogICAgICAgICAgICogdGhpcyBpbnN0YW5jZSBpbiB0aGUgc29ydGVkIGFuZCBmaWx0ZXJlZCBsaXN0IG9mIHJlbmRlcmVkIGl0ZW1zLAogICAgICAgICAgICogdXNlIHRoZSB2YWx1ZSBvZiB0aGUgYGluZGV4QXNgIHByb3BlcnR5LgogICAgICAgICAgICovCiAgICAgICAgICBpdGVtc0luZGV4QXM6IHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICB2YWx1ZTogJ2l0ZW1zSW5kZXgnCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IHNob3VsZCBkZXRlcm1pbmUgdGhlIHNvcnQgb3JkZXIgb2YgdGhlIGl0ZW1zLiAgVGhpcwogICAgICAgICAgICogcHJvcGVydHkgc2hvdWxkIGVpdGhlciBiZSBwcm92aWRlZCBhcyBhIHN0cmluZywgaW5kaWNhdGluZyBhIG1ldGhvZAogICAgICAgICAgICogbmFtZSBvbiB0aGUgZWxlbWVudCdzIGhvc3QsIG9yIGVsc2UgYmUgYW4gYWN0dWFsIGZ1bmN0aW9uLiAgVGhlCiAgICAgICAgICAgKiBmdW5jdGlvbiBzaG91bGQgbWF0Y2ggdGhlIHNvcnQgZnVuY3Rpb24gcGFzc2VkIHRvIGBBcnJheS5zb3J0YC4KICAgICAgICAgICAqIFVzaW5nIGEgc29ydCBmdW5jdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHRoZSB1bmRlcmx5aW5nIGBpdGVtc2AgYXJyYXkuCiAgICAgICAgICAgKi8KICAgICAgICAgIHNvcnQ6IHsKICAgICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICAgIG9ic2VydmVyOiAnX19zb3J0Q2hhbmdlZCcKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gZmlsdGVyIGl0ZW1zIG91dCBvZiB0aGUgdmlldy4gIFRoaXMKICAgICAgICAgICAqIHByb3BlcnR5IHNob3VsZCBlaXRoZXIgYmUgcHJvdmlkZWQgYXMgYSBzdHJpbmcsIGluZGljYXRpbmcgYSBtZXRob2QKICAgICAgICAgICAqIG5hbWUgb24gdGhlIGVsZW1lbnQncyBob3N0LCBvciBlbHNlIGJlIGFuIGFjdHVhbCBmdW5jdGlvbi4gIFRoZQogICAgICAgICAgICogZnVuY3Rpb24gc2hvdWxkIG1hdGNoIHRoZSBzb3J0IGZ1bmN0aW9uIHBhc3NlZCB0byBgQXJyYXkuZmlsdGVyYC4KICAgICAgICAgICAqIFVzaW5nIGEgZmlsdGVyIGZ1bmN0aW9uIGhhcyBubyBlZmZlY3Qgb24gdGhlIHVuZGVybHlpbmcgYGl0ZW1zYCBhcnJheS4KICAgICAgICAgICAqLwogICAgICAgICAgZmlsdGVyOiB7CiAgICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgICBvYnNlcnZlcjogJ19fZmlsdGVyQ2hhbmdlZCcKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYG9ic2VydmVgIHByb3BlcnR5CiAgICAgICAgICAgKiBzaG91bGQgYmUgc2V0IHRvIGEgc3BhY2Utc2VwYXJhdGVkIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGl0ZW0KICAgICAgICAgICAqIHN1Yi1maWVsZHMgdGhhdCBzaG91bGQgdHJpZ2dlciBhIHJlLXNvcnQgb3IgcmUtZmlsdGVyIHdoZW4gY2hhbmdlZC4KICAgICAgICAgICAqIFRoZXNlIHNob3VsZCBnZW5lcmFsbHkgYmUgZmllbGRzIG9mIGBpdGVtYCB0aGF0IHRoZSBzb3J0IG9yIGZpbHRlcgogICAgICAgICAgICogZnVuY3Rpb24gZGVwZW5kcyBvbi4KICAgICAgICAgICAqLwogICAgICAgICAgb2JzZXJ2ZTogewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX19vYnNlcnZlQ2hhbmdlZCcKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIHVzaW5nIGEgYGZpbHRlcmAgb3IgYHNvcnRgIGZ1bmN0aW9uLCB0aGUgYGRlbGF5YCBwcm9wZXJ0eQogICAgICAgICAgICogZGV0ZXJtaW5lcyBhIGRlYm91bmNlIHRpbWUgaW4gbXMgYWZ0ZXIgYSBjaGFuZ2UgdG8gb2JzZXJ2ZWQgaXRlbQogICAgICAgICAgICogcHJvcGVydGllcyB0aGF0IG11c3QgcGFzcyBiZWZvcmUgdGhlIGZpbHRlciBvciBzb3J0IGlzIHJlLXJ1bi4KICAgICAgICAgICAqIFRoaXMgaXMgdXNlZnVsIGluIHJhdGUtbGltaXRpbmcgc2h1ZmZsaW5nIG9mIHRoZSB2aWV3IHdoZW4KICAgICAgICAgICAqIGl0ZW0gY2hhbmdlcyBtYXkgYmUgZnJlcXVlbnQuCiAgICAgICAgICAgKi8KICAgICAgICAgIGRlbGF5OiBOdW1iZXIsCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBDb3VudCBvZiBjdXJyZW50bHkgcmVuZGVyZWQgaXRlbXMgYWZ0ZXIgYGZpbHRlcmAgKGlmIGFueSkgaGFzIGJlZW4gYXBwbGllZC4KICAgICAgICAgICAqIElmICJjaHVua2luZyBtb2RlIiBpcyBlbmFibGVkLCBgcmVuZGVyZWRJdGVtQ291bnRgIGlzIHVwZGF0ZWQgZWFjaCB0aW1lIGEKICAgICAgICAgICAqIHNldCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMgaXMgcmVuZGVyZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICovCiAgICAgICAgICByZW5kZXJlZEl0ZW1Db3VudDogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG5vdGlmeTogIXN1cHByZXNzVGVtcGxhdGVOb3RpZmljYXRpb25zLAogICAgICAgICAgICByZWFkT25seTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gZ3JlYXRlciB0aGFuIHplcm8sIGRlZmluZXMgYW4gaW5pdGlhbCBjb3VudCBvZiB0ZW1wbGF0ZSBpbnN0YW5jZXMKICAgICAgICAgICAqIHRvIHJlbmRlciBhZnRlciBzZXR0aW5nIHRoZSBgaXRlbXNgIGFycmF5LCBiZWZvcmUgdGhlIG5leHQgcGFpbnQsIGFuZAogICAgICAgICAgICogcHV0cyB0aGUgYGRvbS1yZXBlYXRgIGludG8gImNodW5raW5nIG1vZGUiLiAgVGhlIHJlbWFpbmluZyBpdGVtcyAoYW5kCiAgICAgICAgICAgKiBhbnkgZnV0dXJlIGl0ZW1zIGFzIGEgcmVzdWx0IG9mIHB1c2hpbmcgb250byB0aGUgYXJyYXkpIHdpbGwgYmUgY3JlYXRlZAogICAgICAgICAgICogYW5kIHJlbmRlcmVkIGluY3JlbWVudGFsbHkgYXQgZWFjaCBhbmltYXRpb24gZnJhbWUgdGhlcmVvZiB1bnRpbCBhbGwKICAgICAgICAgICAqIGluc3RhbmNlcyBoYXZlIGJlZW4gcmVuZGVyZWQuCiAgICAgICAgICAgKi8KICAgICAgICAgIGluaXRpYWxDb3VudDogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGBpbml0aWFsQ291bnRgIGlzIHVzZWQsIHRoaXMgcHJvcGVydHkgZGVmaW5lcyBhIGZyYW1lIHJhdGUgKGluCiAgICAgICAgICAgKiBmcHMpIHRvIHRhcmdldCBieSB0aHJvdHRsaW5nIHRoZSBudW1iZXIgb2YgaW5zdGFuY2VzIHJlbmRlcmVkIGVhY2gKICAgICAgICAgICAqIGZyYW1lIHRvIG5vdCBleGNlZWQgdGhlIGJ1ZGdldCBmb3IgdGhlIHRhcmdldCBmcmFtZSByYXRlLiAgVGhlCiAgICAgICAgICAgKiBmcmFtZXJhdGUgaXMgZWZmZWN0aXZlbHkgdGhlIG51bWJlciBvZiBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYHMgdGhhdAogICAgICAgICAgICogaXQgdHJpZXMgdG8gYWxsb3cgdG8gYWN0dWFsbHkgZmlyZSBpbiBhIGdpdmVuIHNlY29uZC4gSXQgZG9lcyB0aGlzCiAgICAgICAgICAgKiBieSBtZWFzdXJpbmcgdGhlIHRpbWUgYmV0d2VlbiBgckFGYHMgYW5kIGNvbnRpbnVvdXNseSBhZGp1c3RpbmcgdGhlCiAgICAgICAgICAgKiBudW1iZXIgb2YgaXRlbXMgY3JlYXRlZCBlYWNoIGByQUZgIHRvIG1haW50YWluIHRoZSB0YXJnZXQgZnJhbWVyYXRlLgogICAgICAgICAgICogU2V0dGluZyB0aGlzIHRvIGEgaGlnaGVyIG51bWJlciBhbGxvd3MgbG93ZXIgbGF0ZW5jeSBhbmQgaGlnaGVyCiAgICAgICAgICAgKiB0aHJvdWdocHV0IGZvciBldmVudCBoYW5kbGVycyBhbmQgb3RoZXIgdGFza3MsIGJ1dCByZXN1bHRzIGluIGEKICAgICAgICAgICAqIGxvbmdlciB0aW1lIGZvciB0aGUgcmVtYWluaW5nIGl0ZW1zIHRvIGNvbXBsZXRlIHJlbmRlcmluZy4KICAgICAgICAgICAqLwogICAgICAgICAgdGFyZ2V0RnJhbWVyYXRlOiB7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgdmFsdWU6IDIwCiAgICAgICAgICB9LAoKICAgICAgICAgIF90YXJnZXRGcmFtZVRpbWU6IHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBjb21wdXRlZDogJ19fY29tcHV0ZUZyYW1lVGltZSh0YXJnZXRGcmFtZXJhdGUpJwogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gdGhlIGdsb2JhbCBgc3VwcHJlc3NUZW1wbGF0ZU5vdGlmaWNhdGlvbnNgIHNldHRpbmcgaXMgdXNlZCwgc2V0dGluZwogICAgICAgICAgICogYG5vdGlmeURvbUNoYW5nZTogdHJ1ZWAgd2lsbCBlbmFibGUgZmlyaW5nIGBkb20tY2hhbmdlYCBldmVudHMgb24gdGhpcwogICAgICAgICAgICogZWxlbWVudC4KICAgICAgICAgICAqLwogICAgICAgICAgbm90aWZ5RG9tQ2hhbmdlOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4KICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGNodW5raW5nIGlzIGVuYWJsZWQgdmlhIGBpbml0aWFsQ291bnRgIGFuZCB0aGUgYGl0ZW1zYCBhcnJheSBpcwogICAgICAgICAgICogc2V0IHRvIGEgbmV3IGFycmF5LCB0aGlzIGZsYWcgY29udHJvbHMgd2hldGhlciB0aGUgcHJldmlvdXNseSByZW5kZXJlZAogICAgICAgICAgICogaW5zdGFuY2VzIGFyZSByZXVzZWQgb3Igbm90LgogICAgICAgICAgICoKICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBhbnkgcHJldmlvdXNseSByZW5kZXJlZCB0ZW1wbGF0ZSBpbnN0YW5jZXMgYXJlIHVwZGF0ZWQgaW4KICAgICAgICAgICAqIHBsYWNlIHRvIHRoZWlyIG5ldyBpdGVtIHZhbHVlcyBzeW5jaHJvbm91c2x5IGluIG9uZSBzaG90LCBhbmQgdGhlbiBhbnkKICAgICAgICAgICAqIGZ1cnRoZXIgaXRlbXMgKGlmIGFueSkgYXJlIGNodW5rZWQgb3V0LiAgV2hlbiBgZmFsc2VgLCB0aGUgbGlzdCBpcwogICAgICAgICAgICogcmV0dXJuZWQgYmFjayB0byBpdHMgYGluaXRpYWxDb3VudGAgKGFueSBpbnN0YW5jZXMgb3ZlciB0aGUgaW5pdGlhbAogICAgICAgICAgICogY291bnQgYXJlIGRpc2NhcmRlZCkgYW5kIHRoZSByZW1haW5kZXIgb2YgdGhlIGxpc3QgaXMgY2h1bmtlZCBiYWNrIGluLgogICAgICAgICAgICogU2V0IHRoaXMgdG8gYHRydWVgIHRvIGF2b2lkIHJlLWNyZWF0aW5nIHRoZSBsaXN0IGFuZCBsb3Npbmcgc2Nyb2xsCiAgICAgICAgICAgKiBwb3NpdGlvbiwgYWx0aG91Z2ggbm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhlIGxpc3QgdG8gY29tcGxldGVseQogICAgICAgICAgICogZGlmZmVyZW50IGRhdGEgdGhlIHJlbmRlciB0aHJlYWQgd2lsbCBiZSBibG9ja2VkIHVudGlsIGFsbCBleGlzdGluZwogICAgICAgICAgICogaW5zdGFuY2VzIGFyZSB1cGRhdGVkIHRvIHRoZWlyIG5ldyBkYXRhLgogICAgICAgICAgICovCiAgICAgICAgICByZXVzZUNodW5rZWRJbnN0YW5jZXM6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICAgICAgfQoKICAgICAgICB9OwoKICAgICAgfQoKICAgICAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7CiAgICAgICAgcmV0dXJuIFsgJ19faXRlbXNDaGFuZ2VkKGl0ZW1zLiopJyBdOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19pbnN0YW5jZXMgPSBbXTsKICAgICAgICB0aGlzLl9fcmVuZGVyRGVib3VuY2VyID0gbnVsbDsKICAgICAgICB0aGlzLl9faXRlbXNJZHhUb0luc3RJZHggPSB7fTsKICAgICAgICB0aGlzLl9fY2h1bmtDb3VudCA9IG51bGw7CiAgICAgICAgdGhpcy5fX3JlbmRlclN0YXJ0VGltZSA9IG51bGw7CiAgICAgICAgdGhpcy5fX2l0ZW1zQXJyYXlDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX3Nob3VsZE1lYXN1cmVDaHVuayA9IGZhbHNlOwogICAgICAgIHRoaXMuX19zaG91bGRDb250aW51ZUNodW5raW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX2NodW5raW5nSWQgPSAwOwogICAgICAgIHRoaXMuX19zb3J0Rm4gPSBudWxsOwogICAgICAgIHRoaXMuX19maWx0ZXJGbiA9IG51bGw7CiAgICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/ZnVuY3Rpb24obmV3OlRlbXBsYXRlSW5zdGFuY2VCYXNlLCBPYmplY3Q9KX0gKi8KICAgICAgICB0aGlzLl9fY3RvciA9IG51bGw7CiAgICAgICAgdGhpcy5fX2lzRGV0YWNoZWQgPSB0cnVlOwogICAgICAgIHRoaXMudGVtcGxhdGUgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7VGVtcGxhdGVJbmZvfSAqLwogICAgICAgIHRoaXMuX3RlbXBsYXRlSW5mbzsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLl9faXNEZXRhY2hlZCA9IHRydWU7CiAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIHRoaXMuX19kZXRhY2hJbnN0YW5jZShpKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgaWYgKCFoaWRlRWxlbWVudHNHbG9iYWxseSgpKSB7CiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgICAgIC8vIG9ubHkgcGVyZm9ybSBhdHRhY2htZW50IGlmIHRoZSBlbGVtZW50IHdhcyBwcmV2aW91c2x5IGRldGFjaGVkLgogICAgICAgIGlmICh0aGlzLl9faXNEZXRhY2hlZCkgewogICAgICAgICAgdGhpcy5fX2lzRGV0YWNoZWQgPSBmYWxzZTsKICAgICAgICAgIGxldCB3cmFwcGVkUGFyZW50ID0gd3JhcCh3cmFwKHRoaXMpLnBhcmVudE5vZGUpOwogICAgICAgICAgZm9yIChsZXQgaT0wOyBpPHRoaXMuX19pbnN0YW5jZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5fX2F0dGFjaEluc3RhbmNlKGksIHdyYXBwZWRQYXJlbnQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19lbnN1cmVUZW1wbGF0aXplZCgpIHsKICAgICAgICAvLyBUZW1wbGF0aXppbmcgKGdlbmVyYXRpbmcgdGhlIGluc3RhbmNlIGNvbnN0cnVjdG9yKSBuZWVkcyB0byB3YWl0CiAgICAgICAgLy8gdW50aWwgcmVhZHksIHNpbmNlIHdvbid0IGhhdmUgaXRzIHRlbXBsYXRlIGNvbnRlbnQgaGFuZGVkIGJhY2sgdG8KICAgICAgICAvLyBpdCB1bnRpbCB0aGVuCiAgICAgICAgaWYgKCF0aGlzLl9fY3RvcikgewogICAgICAgICAgLy8gV2hlbiBgcmVtb3ZlTmVzdGVkVGVtcGxhdGVzYCBpcyB0cnVlLCB0aGUgInRlbXBsYXRlIiBpcyB0aGUgZWxlbWVudAogICAgICAgICAgLy8gaXRzZWxmLCB3aGljaCBoYXMgYmVlbiBnaXZlbiBhIGBfdGVtcGxhdGVJbmZvYCBwcm9wZXJ0eQogICAgICAgICAgY29uc3QgdGhpc0FzVGVtcGxhdGUgPSAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyAoCiAgICAgICAgICAgICAgLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovICh0aGlzKSk7CiAgICAgICAgICBsZXQgdGVtcGxhdGUgPSB0aGlzLnRlbXBsYXRlID0gdGhpc0FzVGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA/CiAgICAgICAgICAgICAgdGhpc0FzVGVtcGxhdGUgOgogICAgICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9ICovICh0aGlzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICAgICAgICAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlcigpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1yZXBlYXQgcmVxdWlyZXMgYSA8dGVtcGxhdGU+IGNoaWxkJyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZSh0aGlzLCB7Y2hpbGRMaXN0OiB0cnVlfSk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIFRlbXBsYXRlIGluc3RhbmNlIHByb3BzIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gZm9yd2FyZGluZwogICAgICAgICAgbGV0IGluc3RhbmNlUHJvcHMgPSB7fTsKICAgICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5hc10gPSB0cnVlOwogICAgICAgICAgaW5zdGFuY2VQcm9wc1t0aGlzLmluZGV4QXNdID0gdHJ1ZTsKICAgICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5pdGVtc0luZGV4QXNdID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX19jdG9yID0gdGVtcGxhdGl6ZSh0ZW1wbGF0ZSwgdGhpcywgewogICAgICAgICAgICBtdXRhYmxlRGF0YTogdGhpcy5tdXRhYmxlRGF0YSwKICAgICAgICAgICAgcGFyZW50TW9kZWw6IHRydWUsCiAgICAgICAgICAgIGluc3RhbmNlUHJvcHM6IGluc3RhbmNlUHJvcHMsCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7RG9tUmVwZWF0fQogICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0byBzZXQKICAgICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBzZXQgcHJvcGVydHkgdG8KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZvcndhcmRIb3N0UHJvcDogZnVuY3Rpb24ocHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgICBsZXQgaSQgPSB0aGlzLl9faW5zdGFuY2VzOwogICAgICAgICAgICAgIGZvciAobGV0IGk9MCwgaW5zdDsgKGk8aSQubGVuZ3RoKSAmJiAoaW5zdD1pJFtpXSk7IGkrKykgewogICAgICAgICAgICAgICAgaW5zdC5mb3J3YXJkSG9zdFByb3AocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHtEb21SZXBlYXR9CiAgICAgICAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpbnN0IEluc3RhbmNlIHRvIG5vdGlmeQogICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0byBub3RpZnkKICAgICAgICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBWYWx1ZSB0byBub3RpZnkKICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5vdGlmeUluc3RhbmNlUHJvcDogZnVuY3Rpb24oaW5zdCwgcHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgICBpZiAobWF0Y2hlcyh0aGlzLmFzLCBwcm9wKSkgewogICAgICAgICAgICAgICAgbGV0IGlkeCA9IGluc3RbdGhpcy5pdGVtc0luZGV4QXNdOwogICAgICAgICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICAgICAgICB0aGlzLml0ZW1zW2lkeF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBwYXRoID0gdHJhbnNsYXRlKHRoaXMuYXMsIGAke0pTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ2l0ZW1zJywgdGhpcyl9LiR7aWR4fWAsIHByb3ApOwogICAgICAgICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKHBhdGgsIHZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgX19nZXRNZXRob2RIb3N0KCkgewogICAgICAgIC8vIFRlY2huaWNhbGx5IHRoaXMgc2hvdWxkIGJlIHRoZSBvd25lciBvZiB0aGUgb3V0ZXJtb3N0IHRlbXBsYXRlLgogICAgICAgIC8vIEluIHNoYWRvdyBkb20sIHRoaXMgaXMgYWx3YXlzIGdldFJvb3ROb2RlKCkuaG9zdCwgYnV0IHdlIGNhbgogICAgICAgIC8vIGFwcHJveGltYXRlIHRoaXMgdmlhIGNvb3BlcmF0aW9uIHdpdGggb3VyIGRhdGFIb3N0IGFsd2F5cyBzZXR0aW5nCiAgICAgICAgLy8gYF9tZXRob2RIb3N0YCBhcyBsb25nIGFzIHRoZXJlIHdlcmUgYmluZGluZ3MgKG9yIGlkJ3MpIG9uIHRoaXMKICAgICAgICAvLyBpbnN0YW5jZSBjYXVzaW5nIGl0IHRvIGdldCBhIGRhdGFIb3N0LgogICAgICAgIHJldHVybiB0aGlzLl9fZGF0YUhvc3QuX21ldGhvZEhvc3QgfHwgdGhpcy5fX2RhdGFIb3N0OwogICAgICB9CgogICAgICBfX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZnVuY3Rpb25Pck1ldGhvZE5hbWUpIHsKICAgICAgICBpZiAodHlwZW9mIGZ1bmN0aW9uT3JNZXRob2ROYW1lID09PSAnc3RyaW5nJykgewogICAgICAgICAgbGV0IG1ldGhvZE5hbWUgPSBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgICAgICAgIGxldCBvYmogPSB0aGlzLl9fZ2V0TWV0aG9kSG9zdCgpOwogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgeyByZXR1cm4gb2JqW21ldGhvZE5hbWVdLmFwcGx5KG9iaiwgYXJndW1lbnRzKTsgfTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBmdW5jdGlvbk9yTWV0aG9kTmFtZTsKICAgICAgfQoKICAgICAgX19zb3J0Q2hhbmdlZChzb3J0KSB7CiAgICAgICAgdGhpcy5fX3NvcnRGbiA9IHRoaXMuX19mdW5jdGlvbkZyb21Qcm9wZXJ0eVZhbHVlKHNvcnQpOwogICAgICAgIGlmICh0aGlzLml0ZW1zKSB7IHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsgfQogICAgICB9CgogICAgICBfX2ZpbHRlckNoYW5nZWQoZmlsdGVyKSB7CiAgICAgICAgdGhpcy5fX2ZpbHRlckZuID0gdGhpcy5fX2Z1bmN0aW9uRnJvbVByb3BlcnR5VmFsdWUoZmlsdGVyKTsKICAgICAgICBpZiAodGhpcy5pdGVtcykgeyB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7IH0KICAgICAgfQoKICAgICAgX19jb21wdXRlRnJhbWVUaW1lKHJhdGUpIHsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKDEwMDAvcmF0ZSk7CiAgICAgIH0KCiAgICAgIF9fb2JzZXJ2ZUNoYW5nZWQoKSB7CiAgICAgICAgdGhpcy5fX29ic2VydmVQYXRocyA9IHRoaXMub2JzZXJ2ZSAmJgogICAgICAgICAgdGhpcy5vYnNlcnZlLnJlcGxhY2UoJy4qJywgJy4nKS5zcGxpdCgnICcpOwogICAgICB9CgogICAgICBfX2hhbmRsZU9ic2VydmVkUGF0aHMocGF0aCkgewogICAgICAgIC8vIEhhbmRsZSBjYXNlcyB3aGVyZSBwYXRoIGNoYW5nZXMgc2hvdWxkIGNhdXNlIGEgcmUtc29ydC9maWx0ZXIKICAgICAgICBpZiAodGhpcy5fX3NvcnRGbiB8fCB0aGlzLl9fZmlsdGVyRm4pIHsKICAgICAgICAgIGlmICghcGF0aCkgewogICAgICAgICAgICAvLyBBbHdheXMgcmUtcmVuZGVyIGlmIHRoZSBpdGVtIGl0c2VsZiBjaGFuZ2VkCiAgICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyLCB0aGlzLmRlbGF5KTsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5fX29ic2VydmVQYXRocykgewogICAgICAgICAgICAvLyBPdGhlcndpc2UsIHJlLXJlbmRlciBpZiB0aGUgcGF0aCBjaGFuZ2VkIG1hdGNoZXMgYW4gb2JzZXJ2ZWQgcGF0aAogICAgICAgICAgICBsZXQgcGF0aHMgPSB0aGlzLl9fb2JzZXJ2ZVBhdGhzOwogICAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8cGF0aHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICBpZiAocGF0aC5pbmRleE9mKHBhdGhzW2ldKSA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIsIHRoaXMuZGVsYXkpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX19pdGVtc0NoYW5nZWQoY2hhbmdlKSB7CiAgICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgIUFycmF5LmlzQXJyYXkodGhpcy5pdGVtcykpIHsKICAgICAgICAgIGNvbnNvbGUud2FybignZG9tLXJlcGVhdCBleHBlY3RlZCBhcnJheSBmb3IgYGl0ZW1zYCwgZm91bmQnLCB0aGlzLml0ZW1zKTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgcGF0aCB3YXMgdG8gYW4gaXRlbSAoZS5nLiAnaXRlbXMuMycgb3IgJ2l0ZW1zLjMuZm9vJyksIGZvcndhcmQgdGhlCiAgICAgICAgLy8gcGF0aCB0byB0aGF0IGluc3RhbmNlIHN5bmNocm9ub3VzbHkgKHJldHVybnMgZmFsc2UgZm9yIG5vbi1pdGVtIHBhdGhzKQogICAgICAgIGlmICghdGhpcy5fX2hhbmRsZUl0ZW1QYXRoKGNoYW5nZS5wYXRoLCBjaGFuZ2UudmFsdWUpKSB7CiAgICAgICAgICAvLyBPdGhlcndpc2UsIHRoZSBhcnJheSB3YXMgcmVzZXQgKCdpdGVtcycpIG9yIHNwbGljZWQgKCdpdGVtcy5zcGxpY2VzJyksCiAgICAgICAgICAvLyBzbyBxdWV1ZSBhIHJlbmRlci4gIFJlc3RhcnQgY2h1bmtpbmcgd2hlbiB0aGUgaXRlbXMgY2hhbmdlZCAoZm9yCiAgICAgICAgICAvLyBiYWNrd2FyZCBjb21wYXRpYmlsaXR5KSwgdW5sZXNzIGByZXVzZUNodW5rZWRJbnN0YW5jZXNgIG9wdGlvbiBpcyBzZXQKICAgICAgICAgIGlmIChjaGFuZ2UucGF0aCA9PT0gJ2l0ZW1zJykgewogICAgICAgICAgICB0aGlzLl9faXRlbXNBcnJheUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2RlYm91bmNlUmVuZGVyKHRoaXMuX19yZW5kZXIpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7ZnVuY3Rpb24odGhpczpEb21SZXBlYXQpfSBmbiBGdW5jdGlvbiB0byBkZWJvdW5jZS4KICAgICAgICogQHBhcmFtIHtudW1iZXI9fSBkZWxheSBEZWxheSBpbiBtcyB0byBkZWJvdW5jZSBieS4KICAgICAgICovCiAgICAgIF9fZGVib3VuY2VSZW5kZXIoZm4sIGRlbGF5ID0gMCkgewogICAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlcgogICAgICAgICAgICAsIGRlbGF5ID4gMCA/IHRpbWVPdXQuYWZ0ZXIoZGVsYXkpIDogbWljcm9UYXNrCiAgICAgICAgICAgICwgZm4uYmluZCh0aGlzKSk7CiAgICAgICAgZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZvcmNlcyB0aGUgZWxlbWVudCB0byByZW5kZXIgaXRzIGNvbnRlbnQuIE5vcm1hbGx5IHJlbmRlcmluZyBpcwogICAgICAgKiBhc3luY2hyb25vdXMgdG8gYSBwcm92b2tpbmcgY2hhbmdlLiBUaGlzIGlzIGRvbmUgZm9yIGVmZmljaWVuY3kgc28KICAgICAgICogdGhhdCBtdWx0aXBsZSBjaGFuZ2VzIHRyaWdnZXIgb25seSBhIHNpbmdsZSByZW5kZXIuIFRoZSByZW5kZXIgbWV0aG9kCiAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgaWYsIGZvciBleGFtcGxlLCB0ZW1wbGF0ZSByZW5kZXJpbmcgaXMgcmVxdWlyZWQgdG8KICAgICAgICogdmFsaWRhdGUgYXBwbGljYXRpb24gc3RhdGUuCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZW5kZXIoKSB7CiAgICAgICAgLy8gUXVldWUgdGhpcyByZXBlYXRlciwgdGhlbiBmbHVzaCBhbGwgaW4gb3JkZXIKICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIodGhpcy5fX3JlbmRlcik7CiAgICAgICAgZmx1c2goKTsKICAgICAgfQoKICAgICAgX19yZW5kZXIoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9fZW5zdXJlVGVtcGxhdGl6ZWQoKSkgewogICAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBpdGVtcyA9IHRoaXMuaXRlbXMgfHwgW107CiAgICAgICAgLy8gU29ydCBhbmQgZmlsdGVyIHRoZSBpdGVtcyBpbnRvIGEgbWFwcGluZyBhcnJheSBmcm9tIGluc3RhbmNlLT5pdGVtCiAgICAgICAgY29uc3QgaXNudElkeFRvSXRlbXNJZHggPSB0aGlzLl9fc29ydEFuZEZpbHRlckl0ZW1zKGl0ZW1zKTsKICAgICAgICAvLyBJZiB3ZSdyZSBjaHVua2luZywgaW5jcmVhc2UgdGhlIGxpbWl0IGlmIHRoZXJlIGFyZSBuZXcgaW5zdGFuY2VzIHRvCiAgICAgICAgLy8gY3JlYXRlIGFuZCBzY2hlZHVsZSB0aGUgbmV4dCBjaHVuawogICAgICAgIGNvbnN0IGxpbWl0ID0gdGhpcy5fX2NhbGN1bGF0ZUxpbWl0KGlzbnRJZHhUb0l0ZW1zSWR4Lmxlbmd0aCk7CiAgICAgICAgLy8gQ3JlYXRlLCB1cGRhdGUsIGFuZC9vciByZW1vdmUgaW5zdGFuY2VzCiAgICAgICAgdGhpcy5fX3VwZGF0ZUluc3RhbmNlcyhpdGVtcywgbGltaXQsIGlzbnRJZHhUb0l0ZW1zSWR4KTsKICAgICAgICAvLyBJZiB3ZSdyZSBjaHVua2luZywgc2NoZWR1bGUgYSByQUYgdGFzayB0byBtZWFzdXJlL2NvbnRpbnVlIGNodW5raW5nLiAgICAgCiAgICAgICAgLy8gRG8gdGhpcyBiZWZvcmUgYW55IG5vdGlmeWluZyBldmVudHMgKHJlbmRlcmVkSXRlbUNvdW50ICYgZG9tLWNoYW5nZSkKICAgICAgICAvLyBzaW5jZSB0aG9zZSBjb3VsZCBtb2RpZnkgaXRlbXMgYW5kIGVucXVldWUgYSBuZXcgZnVsbCByZW5kZXIgd2hpY2ggd2lsbAogICAgICAgIC8vIHByZS1lbXB0IHRoaXMgbWVhc3VyZW1lbnQuCiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50ICYmCiAgICAgICAgICAgKHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bmsgfHwgdGhpcy5fX3Nob3VsZENvbnRpbnVlQ2h1bmtpbmcpKSB7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9fY2h1bmtpbmdJZCk7CiAgICAgICAgICB0aGlzLl9fY2h1bmtpbmdJZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl9fY29udGludWVDaHVua2luZygpKTsKICAgICAgICB9CiAgICAgICAgLy8gU2V0IHJlbmRlcmVkIGl0ZW0gY291bnQKICAgICAgICB0aGlzLl9zZXRSZW5kZXJlZEl0ZW1Db3VudCh0aGlzLl9faW5zdGFuY2VzLmxlbmd0aCk7CiAgICAgICAgLy8gTm90aWZ5IHVzZXJzCiAgICAgICAgaWYgKCFzdXBwcmVzc1RlbXBsYXRlTm90aWZpY2F0aW9ucyB8fCB0aGlzLm5vdGlmeURvbUNoYW5nZSkgewogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9tLWNoYW5nZScsIHsKICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fc29ydEFuZEZpbHRlckl0ZW1zKGl0ZW1zKSB7CiAgICAgICAgLy8gR2VuZXJhdGUgYXJyYXkgbWFwaW5nIHRoZSBpbnN0YW5jZSBpbmRleCB0byB0aGUgaXRlbXMgYXJyYXkgaW5kZXgKICAgICAgICBsZXQgaXNudElkeFRvSXRlbXNJZHggPSBuZXcgQXJyYXkoaXRlbXMubGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8aXRlbXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlzbnRJZHhUb0l0ZW1zSWR4W2ldID0gaTsKICAgICAgICB9CiAgICAgICAgLy8gQXBwbHkgdXNlciBmaWx0ZXIKICAgICAgICBpZiAodGhpcy5fX2ZpbHRlckZuKSB7CiAgICAgICAgICBpc250SWR4VG9JdGVtc0lkeCA9IGlzbnRJZHhUb0l0ZW1zSWR4LmZpbHRlcigoaSwgaWR4LCBhcnJheSkgPT4KICAgICAgICAgICAgdGhpcy5fX2ZpbHRlckZuKGl0ZW1zW2ldLCBpZHgsIGFycmF5KSk7CiAgICAgICAgfQogICAgICAgIC8vIEFwcGx5IHVzZXIgc29ydAogICAgICAgIGlmICh0aGlzLl9fc29ydEZuKSB7CiAgICAgICAgICBpc250SWR4VG9JdGVtc0lkeC5zb3J0KChhLCBiKSA9PiB0aGlzLl9fc29ydEZuKGl0ZW1zW2FdLCBpdGVtc1tiXSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaXNudElkeFRvSXRlbXNJZHg7CiAgICAgIH0KCiAgICAgIF9fY2FsY3VsYXRlTGltaXQoZmlsdGVyZWRJdGVtQ291bnQpIHsKICAgICAgICBsZXQgbGltaXQgPSBmaWx0ZXJlZEl0ZW1Db3VudDsKICAgICAgICBjb25zdCBjdXJyZW50Q291bnQgPSB0aGlzLl9faW5zdGFuY2VzLmxlbmd0aDsKICAgICAgICAvLyBXaGVuIGNodW5raW5nLCB3ZSBpbmNyZWFzZSB0aGUgbGltaXQgZnJvbSB0aGUgY3VycmVudGx5IHJlbmRlcmVkIGNvdW50CiAgICAgICAgLy8gYnkgdGhlIGNodW5rIGNvdW50IHRoYXQgaXMgcmUtY2FsY3VsYXRlZCBhZnRlciBlYWNoIHJBRiAod2l0aCBzcGVjaWFsCiAgICAgICAgLy8gY2FzZXMgZm9yIHJlc2V0aW5nIHRoZSBsaW1pdCB0byBpbml0aWFsQ291bnQgYWZ0ZXIgY2hhbmdpbmcgaXRlbXMpCiAgICAgICAgaWYgKHRoaXMuaW5pdGlhbENvdW50KSB7CiAgICAgICAgICBsZXQgbmV3Q291bnQ7CiAgICAgICAgICBpZiAoIXRoaXMuX19jaHVua0NvdW50IHx8CiAgICAgICAgICAgICh0aGlzLl9faXRlbXNBcnJheUNoYW5nZWQgJiYgIXRoaXMucmV1c2VDaHVua2VkSW5zdGFuY2VzKSkgewogICAgICAgICAgICAvLyBMaW1pdCBuZXh0IHJlbmRlciB0byB0aGUgaW5pdGlhbCBjb3VudAogICAgICAgICAgICBsaW1pdCA9IE1hdGgubWluKGZpbHRlcmVkSXRlbUNvdW50LCB0aGlzLmluaXRpYWxDb3VudCk7CiAgICAgICAgICAgIC8vIFN1YnRyYWN0IG9mZiBhbnkgZXhpc3RpbmcgaW5zdGFuY2VzIHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mCiAgICAgICAgICAgIC8vIGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZAogICAgICAgICAgICBuZXdDb3VudCA9IE1hdGgubWF4KGxpbWl0IC0gY3VycmVudENvdW50LCAwKTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgY2h1bmsgc2l6ZSB3aXRoIGhvdyBtYW55IGl0ZW1zIHdlJ3JlIGNyZWF0aW5nCiAgICAgICAgICAgIHRoaXMuX19jaHVua0NvdW50ID0gbmV3Q291bnQgfHwgMTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFRoZSBudW1iZXIgb2YgbmV3IGluc3RhbmNlcyB0aGF0IHdpbGwgYmUgY3JlYXRlZCBpcyBiYXNlZCBvbiB0aGUKICAgICAgICAgICAgLy8gZXhpc3RpbmcgaW5zdGFuY2VzLCB0aGUgbmV3IGxpc3Qgc2l6ZSwgYW5kIHRoZSBjaHVuayBzaXplCiAgICAgICAgICAgIG5ld0NvdW50ID0gTWF0aC5taW4oCiAgICAgICAgICAgICAgTWF0aC5tYXgoZmlsdGVyZWRJdGVtQ291bnQgLSBjdXJyZW50Q291bnQsIDApLCAKICAgICAgICAgICAgICB0aGlzLl9fY2h1bmtDb3VudCk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbGltaXQgYmFzZWQgb24gaG93IG1hbnkgbmV3IGl0ZW1zIHdlJ3JlIG1ha2luZywgbGltaXRlZAogICAgICAgICAgICAvLyBidXkgdGhlIHRvdGFsIHNpemUgb2YgdGhlIGxpc3QKICAgICAgICAgICAgbGltaXQgPSBNYXRoLm1pbihjdXJyZW50Q291bnQgKyBuZXdDb3VudCwgZmlsdGVyZWRJdGVtQ291bnQpOwogICAgICAgICAgfQogICAgICAgICAgLy8gUmVjb3JkIHNvbWUgc3RhdGUgYWJvdXQgY2h1bmtpbmcgZm9yIHVzZSBpbiBgX19jb250aW51ZUNodW5raW5nYAogICAgICAgICAgdGhpcy5fX3Nob3VsZE1lYXN1cmVDaHVuayA9IG5ld0NvdW50ID09PSB0aGlzLl9fY2h1bmtDb3VudDsKICAgICAgICAgIHRoaXMuX19zaG91bGRDb250aW51ZUNodW5raW5nID0gbGltaXQgPCBmaWx0ZXJlZEl0ZW1Db3VudDsKICAgICAgICAgIHRoaXMuX19yZW5kZXJTdGFydFRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fX2l0ZW1zQXJyYXlDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgcmV0dXJuIGxpbWl0OwogICAgICB9CgogICAgICBfX2NvbnRpbnVlQ2h1bmtpbmcoKSB7CiAgICAgICAgLy8gU2ltcGxlIGF1dG8gY2h1bmtTaXplIHRocm90dGxpbmcgYWxnb3JpdGhtIGJhc2VkIG9uIGZlZWRiYWNrIGxvb3A6CiAgICAgICAgLy8gbWVhc3VyZSBhY3R1YWwgdGltZSBiZXR3ZWVuIGZyYW1lcyBhbmQgc2NhbGUgY2h1bmsgY291bnQgYnkgcmF0aW8gb2YKICAgICAgICAvLyB0YXJnZXQvYWN0dWFsIGZyYW1lIHRpbWUuICBPbmx5IG1vZGlmeSBjaHVuayBzaXplIGlmIG91ciBtZWFzdXJlbWVudAogICAgICAgIC8vIHJlZmxlY3RzIHRoZSBjb3N0IG9mIGEgY3JlYXRpbmcgYSBmdWxsIGNodW5rJ3Mgd29ydGggb2YgaW5zdGFuY2VzOyB0aGlzCiAgICAgICAgLy8gYXZvaWRzIHNjYWxpbmcgdXAgdGhlIGNodW5rIHNpemUgaWYgd2UgZS5nLiBxdWlja2x5IHJlLXJlbmRlcmVkIGluc3RhbmNlcwogICAgICAgIC8vIGluIHBsYWNlCiAgICAgICAgaWYgKHRoaXMuX19zaG91bGRNZWFzdXJlQ2h1bmspIHsKICAgICAgICAgIGNvbnN0IHJlbmRlclRpbWUgPSBwZXJmb3JtYW5jZS5ub3coKSAtIHRoaXMuX19yZW5kZXJTdGFydFRpbWU7CiAgICAgICAgICBjb25zdCByYXRpbyA9IHRoaXMuX3RhcmdldEZyYW1lVGltZSAvIHJlbmRlclRpbWU7CiAgICAgICAgICB0aGlzLl9fY2h1bmtDb3VudCA9IE1hdGgucm91bmQodGhpcy5fX2NodW5rQ291bnQgKiByYXRpbykgfHwgMTsKICAgICAgICB9CiAgICAgICAgLy8gRW5xdWV1ZSBhIG5ldyByZW5kZXIgaWYgd2UgaGF2ZW4ndCByZWFjaGVkIHRoZSBmdWxsIHNpemUgb2YgdGhlIGxpc3QKICAgICAgICBpZiAodGhpcy5fX3Nob3VsZENvbnRpbnVlQ2h1bmtpbmcpIHsKICAgICAgICAgIHRoaXMuX19kZWJvdW5jZVJlbmRlcih0aGlzLl9fcmVuZGVyKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgCiAgICAgIF9fdXBkYXRlSW5zdGFuY2VzKGl0ZW1zLCBsaW1pdCwgaXNudElkeFRvSXRlbXNJZHgpIHsKICAgICAgICAvLyBpdGVtcy0+aW5zdCBtYXAga2VwdCBmb3IgaXRlbSBwYXRoIGZvcndhcmRpbmcKICAgICAgICBjb25zdCBpdGVtc0lkeFRvSW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeCA9IHt9OwogICAgICAgIGxldCBpbnN0SWR4OwogICAgICAgIC8vIEdlbmVyYXRlIGluc3RhbmNlcyBhbmQgYXNzaWduIGl0ZW1zCiAgICAgICAgZm9yIChpbnN0SWR4PTA7IGluc3RJZHg8bGltaXQ7IGluc3RJZHgrKykgewogICAgICAgICAgbGV0IGluc3QgPSB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdOwogICAgICAgICAgbGV0IGl0ZW1JZHggPSBpc250SWR4VG9JdGVtc0lkeFtpbnN0SWR4XTsKICAgICAgICAgIGxldCBpdGVtID0gaXRlbXNbaXRlbUlkeF07CiAgICAgICAgICBpdGVtc0lkeFRvSW5zdElkeFtpdGVtSWR4XSA9IGluc3RJZHg7CiAgICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5hcywgaXRlbSk7CiAgICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eSh0aGlzLmluZGV4QXMsIGluc3RJZHgpOwogICAgICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHkodGhpcy5pdGVtc0luZGV4QXMsIGl0ZW1JZHgpOwogICAgICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX19pbnNlcnRJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gUmVtb3ZlIGFueSBleHRyYSBpbnN0YW5jZXMgZnJvbSBwcmV2aW91cyBzdGF0ZQogICAgICAgIGZvciAobGV0IGk9dGhpcy5fX2luc3RhbmNlcy5sZW5ndGgtMTsgaT49aW5zdElkeDsgaS0tKSB7CiAgICAgICAgICB0aGlzLl9fZGV0YWNoQW5kUmVtb3ZlSW5zdGFuY2UoaSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX2RldGFjaEluc3RhbmNlKGlkeCkgewogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpZHhdOwogICAgICAgIGNvbnN0IHdyYXBwZWRSb290ID0gd3JhcChpbnN0LnJvb3QpOwogICAgICAgIGZvciAobGV0IGk9MDsgaTxpbnN0LmNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBsZXQgZWwgPSBpbnN0LmNoaWxkcmVuW2ldOwogICAgICAgICAgd3JhcHBlZFJvb3QuYXBwZW5kQ2hpbGQoZWwpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5zdDsKICAgICAgfQoKICAgICAgX19hdHRhY2hJbnN0YW5jZShpZHgsIHBhcmVudCkgewogICAgICAgIGxldCBpbnN0ID0gdGhpcy5fX2luc3RhbmNlc1tpZHhdOwogICAgICAgIC8vIE5vdGUsIHRoaXMgaXMgcHJlLXdyYXBwZWQgYXMgYW4gb3B0aW1pemF0aW9uCiAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShpbnN0LnJvb3QsIHRoaXMpOwogICAgICB9CgogICAgICBfX2RldGFjaEFuZFJlbW92ZUluc3RhbmNlKGlkeCkgewogICAgICAgIHRoaXMuX19kZXRhY2hJbnN0YW5jZShpZHgpOwogICAgICAgIHRoaXMuX19pbnN0YW5jZXMuc3BsaWNlKGlkeCwgMSk7CiAgICAgIH0KCiAgICAgIF9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KSB7CiAgICAgICAgbGV0IG1vZGVsID0ge307CiAgICAgICAgbW9kZWxbdGhpcy5hc10gPSBpdGVtOwogICAgICAgIG1vZGVsW3RoaXMuaW5kZXhBc10gPSBpbnN0SWR4OwogICAgICAgIG1vZGVsW3RoaXMuaXRlbXNJbmRleEFzXSA9IGl0ZW1JZHg7CiAgICAgICAgcmV0dXJuIG5ldyB0aGlzLl9fY3Rvcihtb2RlbCk7CiAgICAgIH0KCiAgICAgIF9faW5zZXJ0SW5zdGFuY2UoaXRlbSwgaW5zdElkeCwgaXRlbUlkeCkgewogICAgICAgIGNvbnN0IGluc3QgPSB0aGlzLl9fc3RhbXBJbnN0YW5jZShpdGVtLCBpbnN0SWR4LCBpdGVtSWR4KTsKICAgICAgICBsZXQgYmVmb3JlUm93ID0gdGhpcy5fX2luc3RhbmNlc1tpbnN0SWR4ICsgMV07CiAgICAgICAgbGV0IGJlZm9yZU5vZGUgPSBiZWZvcmVSb3cgPyBiZWZvcmVSb3cuY2hpbGRyZW5bMF0gOiB0aGlzOwogICAgICAgIHdyYXAod3JhcCh0aGlzKS5wYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUoaW5zdC5yb290LCBiZWZvcmVOb2RlKTsKICAgICAgICB0aGlzLl9faW5zdGFuY2VzW2luc3RJZHhdID0gaW5zdDsKICAgICAgICByZXR1cm4gaW5zdDsKICAgICAgfQoKICAgICAgLy8gSW1wbGVtZW50cyBleHRlbnNpb24gcG9pbnQgZnJvbSBUZW1wbGF0aXplIG1peGluCiAgICAgIC8qKgogICAgICAgKiBTaG93cyBvciBoaWRlcyB0aGUgdGVtcGxhdGUgaW5zdGFuY2UgdG9wIGxldmVsIGNoaWxkIGVsZW1lbnRzLiBGb3IKICAgICAgICogdGV4dCBub2RlcywgYHRleHRDb250ZW50YCBpcyByZW1vdmVkIHdoaWxlICJoaWRkZW4iIGFuZCByZXBsYWNlZCB3aGVuCiAgICAgICAqICJzaG93bi4iCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaGlkZGVuIFNldCB0byB0cnVlIHRvIGhpZGUgdGhlIGNoaWxkcmVuOwogICAgICAgKiBzZXQgdG8gZmFsc2UgdG8gc2hvdyB0aGVtLgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pIHsKICAgICAgICBmb3IgKGxldCBpPTA7IGk8dGhpcy5fX2luc3RhbmNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdGhpcy5fX2luc3RhbmNlc1tpXS5fc2hvd0hpZGVDaGlsZHJlbihoaWRkZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQ2FsbGVkIGFzIGEgc2lkZSBlZmZlY3Qgb2YgYSBob3N0IGl0ZW1zLjxrZXk+LjxwYXRoPiBwYXRoIGNoYW5nZSwKICAgICAgLy8gcmVzcG9uc2libGUgZm9yIG5vdGlmeWluZyBpdGVtLjxwYXRoPiBjaGFuZ2VzIHRvIGluc3QgZm9yIGtleQogICAgICBfX2hhbmRsZUl0ZW1QYXRoKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgbGV0IGl0ZW1zUGF0aCA9IHBhdGguc2xpY2UoNik7IC8vICdpdGVtcy4nLmxlbmd0aCA9PSA2CiAgICAgICAgbGV0IGRvdCA9IGl0ZW1zUGF0aC5pbmRleE9mKCcuJyk7CiAgICAgICAgbGV0IGl0ZW1zSWR4ID0gZG90IDwgMCA/IGl0ZW1zUGF0aCA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoMCwgZG90KTsKICAgICAgICAvLyBJZiBwYXRoIHdhcyBpbmRleCBpbnRvIGFycmF5Li4uCiAgICAgICAgaWYgKGl0ZW1zSWR4ID09IHBhcnNlSW50KGl0ZW1zSWR4LCAxMCkpIHsKICAgICAgICAgIGxldCBpdGVtU3ViUGF0aCA9IGRvdCA8IDAgPyAnJyA6IGl0ZW1zUGF0aC5zdWJzdHJpbmcoZG90KzEpOwogICAgICAgICAgLy8gSWYgdGhlIHBhdGggaXMgb2JzZXJ2ZWQsIGl0IHdpbGwgdHJpZ2dlciBhIGZ1bGwgcmVmcmVzaAogICAgICAgICAgdGhpcy5fX2hhbmRsZU9ic2VydmVkUGF0aHMoaXRlbVN1YlBhdGgpOwogICAgICAgICAgLy8gTm90ZSwgZXZlbiBpZiBhIHJ1bGwgcmVmcmVzaCBpcyB0cmlnZ2VyZWQsIGFsd2F5cyBkbyB0aGUgcGF0aAogICAgICAgICAgLy8gbm90aWZpY2F0aW9uIGJlY2F1c2UgdW5sZXNzIG11dGFibGVEYXRhIGlzIHVzZWQgZm9yIGRvbS1yZXBlYXQKICAgICAgICAgIC8vIGFuZCBhbGwgZWxlbWVudHMgaW4gdGhlIGluc3RhbmNlIHN1YnRyZWUsIGEgZnVsbCByZWZyZXNoIG1heQogICAgICAgICAgLy8gbm90IHRyaWdnZXIgdGhlIHByb3BlciB1cGRhdGUuCiAgICAgICAgICBsZXQgaW5zdElkeCA9IHRoaXMuX19pdGVtc0lkeFRvSW5zdElkeFtpdGVtc0lkeF07CiAgICAgICAgICBsZXQgaW5zdCA9IHRoaXMuX19pbnN0YW5jZXNbaW5zdElkeF07CiAgICAgICAgICBpZiAoaW5zdCkgewogICAgICAgICAgICBsZXQgaXRlbVBhdGggPSB0aGlzLmFzICsgKGl0ZW1TdWJQYXRoID8gJy4nICsgaXRlbVN1YlBhdGggOiAnJyk7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgZWZmZWN0aXZlbHkgYG5vdGlmeVBhdGhgLCBidXQgYXZvaWRzIHNvbWUgb2YgdGhlIG92ZXJoZWFkCiAgICAgICAgICAgIC8vIG9mIHRoZSBwdWJsaWMgQVBJCiAgICAgICAgICAgIGluc3QuX3NldFBlbmRpbmdQcm9wZXJ0eU9yUGF0aChpdGVtUGF0aCwgdmFsdWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICAgICAgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBpdGVtIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIGVsZW1lbnQgc3RhbXBlZCBieQogICAgICAgKiB0aGlzIGBkb20tcmVwZWF0YC4KICAgICAgICoKICAgICAgICogTm90ZSwgdG8gbW9kaWZ5IHN1Yi1wcm9wZXJ0aWVzIG9mIHRoZSBpdGVtLAogICAgICAgKiBgbW9kZWxGb3JFbGVtZW50KGVsKS5zZXQoJ2l0ZW0uPHN1Yi1wcm9wPicsIHZhbHVlKWAKICAgICAgICogc2hvdWxkIGJlIHVzZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbCBFbGVtZW50IGZvciB3aGljaCB0byByZXR1cm4gdGhlIGl0ZW0uCiAgICAgICAqIEByZXR1cm4geyp9IEl0ZW0gYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50LgogICAgICAgKi8KICAgICAgaXRlbUZvckVsZW1lbnQoZWwpIHsKICAgICAgICBsZXQgaW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlW3RoaXMuYXNdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgaW5zdCBpbmRleCBmb3IgYSBnaXZlbiBlbGVtZW50IHN0YW1wZWQgYnkgdGhpcyBgZG9tLXJlcGVhdGAuCiAgICAgICAqIElmIGBzb3J0YCBpcyBwcm92aWRlZCwgdGhlIGluZGV4IHdpbGwgcmVmbGVjdCB0aGUgc29ydGVkIG9yZGVyIChyYXRoZXIKICAgICAgICogdGhhbiB0aGUgb3JpZ2luYWwgYXJyYXkgb3JkZXIpLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZSBpbmRleC4KICAgICAgICogQHJldHVybiB7P251bWJlcn0gUm93IGluZGV4IGFzc29jaWF0ZWQgd2l0aCB0aGUgZWxlbWVudCAobm90ZSB0aGlzIG1heQogICAgICAgKiAgIG5vdCBjb3JyZXNwb25kIHRvIHRoZSBhcnJheSBpbmRleCBpZiBhIHVzZXIgYHNvcnRgIGlzIGFwcGxpZWQpLgogICAgICAgKi8KICAgICAgaW5kZXhGb3JFbGVtZW50KGVsKSB7CiAgICAgICAgbGV0IGluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZWwpOwogICAgICAgIHJldHVybiBpbnN0YW5jZSAmJiBpbnN0YW5jZVt0aGlzLmluZGV4QXNdOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGVtcGxhdGUgIm1vZGVsIiBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBlbGVtZW50LCB3aGljaAogICAgICAgKiBzZXJ2ZXMgYXMgdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSB0aGUgZWxlbWVudCBpcwogICAgICAgKiBjb250YWluZWQgaW4uIEEgdGVtcGxhdGUgbW9kZWwKICAgICAgICogc2hvdWxkIGJlIHVzZWQgdG8gbWFuaXB1bGF0ZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBFeGFtcGxlOgogICAgICAgKgogICAgICAgKiAgIGxldCBtb2RlbCA9IG1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgICAqICAgaWYgKG1vZGVsLmluZGV4IDwgMTApIHsKICAgICAgICogICAgIG1vZGVsLnNldCgnaXRlbS5jaGVja2VkJywgdHJ1ZSk7CiAgICAgICAqICAgfQogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWwgRWxlbWVudCBmb3Igd2hpY2ggdG8gcmV0dXJuIGEgdGVtcGxhdGUgbW9kZWwuCiAgICAgICAqIEByZXR1cm4ge1RlbXBsYXRlSW5zdGFuY2VCYXNlfSBNb2RlbCByZXByZXNlbnRpbmcgdGhlIGJpbmRpbmcgc2NvcGUgZm9yCiAgICAgICAqICAgdGhlIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBtb2RlbEZvckVsZW1lbnQoZWwpIHsKICAgICAgICByZXR1cm4gbW9kZWxGb3JFbGVtZW50KHRoaXMudGVtcGxhdGUsIGVsKTsKICAgICAgfQoKICAgIH0KCiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoRG9tUmVwZWF0LmlzLCBEb21SZXBlYXQpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBAY3VzdG9tRWxlbWVudAogICAgICogQHBvbHltZXIKICAgICAqIEBleHRlbmRzIFBvbHltZXJFbGVtZW50CiAgICAgKiBAc3VtbWFyeSBCYXNlIGNsYXNzIGZvciBkb20taWYgZWxlbWVudDsgc3ViY2xhc3NlZCBpbnRvIGNvbmNyZXRlCiAgICAgKiAgIGltcGxlbWVudGF0aW9uLgogICAgICovCiAgICBjbGFzcyBEb21JZkJhc2UgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CgogICAgICAvLyBOb3QgbmVlZGVkIHRvIGZpbmQgdGVtcGxhdGU7IGNhbiBiZSByZW1vdmVkIG9uY2UgdGhlIGFuYWx5emVyCiAgICAgIC8vIGNhbiBmaW5kIHRoZSB0YWcgbmFtZSBmcm9tIGN1c3RvbUVsZW1lbnRzLmRlZmluZSBjYWxsCiAgICAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZG9tLWlmJzsgfQoKICAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsgcmV0dXJuIG51bGw7IH0KCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEZpcmVkIHdoZW5ldmVyIERPTSBpcyBhZGRlZCBvciByZW1vdmVkL2hpZGRlbiBieSB0aGlzIHRlbXBsYXRlIChieQogICAgICAgICAgICogZGVmYXVsdCwgcmVuZGVyaW5nIG9jY3VycyBsYXppbHkpLiAgVG8gZm9yY2UgaW1tZWRpYXRlIHJlbmRlcmluZywgY2FsbAogICAgICAgICAgICogYHJlbmRlcmAuCiAgICAgICAgICAgKgogICAgICAgICAgICogQGV2ZW50IGRvbS1jaGFuZ2UKICAgICAgICAgICAqLwoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQSBib29sZWFuIGluZGljYXRpbmcgd2hldGhlciB0aGlzIHRlbXBsYXRlIHNob3VsZCBzdGFtcC4KICAgICAgICAgICAqLwogICAgICAgICAgaWY6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfX2RlYm91bmNlUmVuZGVyJwogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gdHJ1ZSwgZWxlbWVudHMgd2lsbCBiZSByZW1vdmVkIGZyb20gRE9NIGFuZCBkaXNjYXJkZWQgd2hlbiBgaWZgCiAgICAgICAgICAgKiBiZWNvbWVzIGZhbHNlIGFuZCByZS1jcmVhdGVkIGFuZCBhZGRlZCBiYWNrIHRvIHRoZSBET00gd2hlbiBgaWZgCiAgICAgICAgICAgKiBiZWNvbWVzIHRydWUuICBCeSBkZWZhdWx0LCBzdGFtcGVkIGVsZW1lbnRzIHdpbGwgYmUgaGlkZGVuIGJ1dCBsZWZ0CiAgICAgICAgICAgKiBpbiB0aGUgRE9NIHdoZW4gYGlmYCBiZWNvbWVzIGZhbHNlLCB3aGljaCBpcyBnZW5lcmFsbHkgcmVzdWx0cwogICAgICAgICAgICogaW4gYmV0dGVyIHBlcmZvcm1hbmNlLgogICAgICAgICAgICovCiAgICAgICAgICByZXN0YW1wOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG9ic2VydmVyOiAnX19kZWJvdW5jZVJlbmRlcicKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIHRoZSBnbG9iYWwgYHN1cHByZXNzVGVtcGxhdGVOb3RpZmljYXRpb25zYCBzZXR0aW5nIGlzIHVzZWQsIHNldHRpbmcKICAgICAgICAgICAqIGBub3RpZnlEb21DaGFuZ2U6IHRydWVgIHdpbGwgZW5hYmxlIGZpcmluZyBgZG9tLWNoYW5nZWAgZXZlbnRzIG9uIHRoaXMKICAgICAgICAgICAqIGVsZW1lbnQuCiAgICAgICAgICAgKi8KICAgICAgICAgIG5vdGlmeURvbUNoYW5nZTogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgICAgICB9CiAgICAgICAgfTsKCiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlciA9IG51bGw7CiAgICAgICAgdGhpcy5fbGFzdElmID0gZmFsc2U7CiAgICAgICAgdGhpcy5fX2hpZGVUZW1wbGF0ZUNoaWxkcmVuX18gPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fHVuZGVmaW5lZH0gKi8KICAgICAgICB0aGlzLl9fdGVtcGxhdGU7CiAgICAgICAgLyoqIEB0eXBlIHshVGVtcGxhdGVJbmZvfHVuZGVmaW5lZH0gKi8KICAgICAgICB0aGlzLl90ZW1wbGF0ZUluZm87CiAgICAgIH0KCiAgICAgIF9fZGVib3VuY2VSZW5kZXIoKSB7CiAgICAgICAgLy8gUmVuZGVyIGlzIGFzeW5jIGZvciAyIHJlYXNvbnM6CiAgICAgICAgLy8gMS4gVG8gZWxpbWluYXRlIGRvbSBjcmVhdGlvbiB0cmFzaGluZyBpZiB1c2VyIGNvZGUgdGhyYXNoZXMgYGlmYCBpbiB0aGUKICAgICAgICAvLyAgICBzYW1lIHR1cm4uIFRoaXMgd2FzIG1vcmUgY29tbW9uIGluIDEueCB3aGVyZSBhIGNvbXBvdW5kIGNvbXB1dGVkCiAgICAgICAgLy8gICAgcHJvcGVydHkgY291bGQgcmVzdWx0IGluIHRoZSByZXN1bHQgY2hhbmdpbmcgbXVsdGlwbGUgdGltZXMsIGJ1dCBpcwogICAgICAgIC8vICAgIG1pdGlnYXRlZCB0byBhIGxhcmdlIGV4dGVudCBieSBiYXRjaGVkIHByb3BlcnR5IHByb2Nlc3NpbmcgaW4gMi54LgogICAgICAgIC8vIDIuIFRvIGF2b2lkIGRvdWJsZSBvYmplY3QgcHJvcGFnYXRpb24gd2hlbiBhIGJhZyBpbmNsdWRpbmcgdmFsdWVzIGJvdW5kCiAgICAgICAgLy8gICAgdG8gdGhlIGBpZmAgcHJvcGVydHkgYXMgd2VsbCBhcyBvbmUgb3IgbW9yZSBob3N0UHJvcHMgY291bGQgZW5xdWV1ZQogICAgICAgIC8vICAgIHRoZSA8ZG9tLWlmPiB0byBmbHVzaCBiZWZvcmUgdGhlIDx0ZW1wbGF0ZT4ncyBob3N0IHByb3BlcnR5CiAgICAgICAgLy8gICAgZm9yd2FyZGluZy4gSW4gdGhhdCBzY2VuYXJpbyBjcmVhdGluZyBhbiBpbnN0YW5jZSB3b3VsZCByZXN1bHQgaW4KICAgICAgICAvLyAgICB0aGUgaG9zdCBwcm9wcyBiZWluZyBzZXQgb25jZSwgYW5kIHRoZW4gdGhlIGVucXVldWVkIGNoYW5nZXMgb24gdGhlCiAgICAgICAgLy8gICAgdGVtcGxhdGUgd291bGQgc2V0IHByb3BlcnRpZXMgYSBzZWNvbmQgdGltZSwgcG90ZW50aWFsbHkgY2F1c2luZyBhbgogICAgICAgIC8vICAgIG9iamVjdCB0byBiZSBzZXQgdG8gYW4gaW5zdGFuY2UgbW9yZSB0aGFuIG9uY2UuICBDcmVhdGluZyB0aGUKICAgICAgICAvLyAgICBpbnN0YW5jZSBhc3luYyBmcm9tIGZsdXNoaW5nIGRhdGEgZW5zdXJlcyB0aGlzIGRvZXNuJ3QgaGFwcGVuLiBJZgogICAgICAgIC8vICAgIHdlIHdhbnRlZCBhIHN5bmMgb3B0aW9uIGluIHRoZSBmdXR1cmUsIHNpbXBseSBoYXZpbmcgPGRvbS1pZj4gZmx1c2gKICAgICAgICAvLyAgICAob3IgY2xlYXIpIGl0cyB0ZW1wbGF0ZSdzIHBlbmRpbmcgaG9zdCBwcm9wZXJ0aWVzIGJlZm9yZSBjcmVhdGluZwogICAgICAgIC8vICAgIHRoZSBpbnN0YW5jZSB3b3VsZCBhbHNvIGF2b2lkIHRoZSBwcm9ibGVtLgogICAgICAgIHRoaXMuX19yZW5kZXJEZWJvdW5jZXIgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlckRlYm91bmNlcgogICAgICAgICAgICAsIG1pY3JvVGFzawogICAgICAgICAgICAsICgpID0+IHRoaXMuX19yZW5kZXIoKSk7CiAgICAgICAgZW5xdWV1ZURlYm91bmNlcih0aGlzLl9fcmVuZGVyRGVib3VuY2VyKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICBjb25zdCBwYXJlbnQgPSB3cmFwKHRoaXMpLnBhcmVudE5vZGU7CiAgICAgICAgaWYgKCFwYXJlbnQgfHwgKHBhcmVudC5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgJiYKICAgICAgICAgICAgIXdyYXAocGFyZW50KS5ob3N0KSkgewogICAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgaWYgKCFoaWRlRWxlbWVudHNHbG9iYWxseSgpKSB7CiAgICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICB0aGlzLl9fZGVib3VuY2VSZW5kZXIoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGEgdGVtcGxhdGUgaGFzIGJlZW4gYXNzaWduZWQgdG8gYHRoaXMuX190ZW1wbGF0ZWAuICBJZiBpdCBoYXMgbm90CiAgICAgICAqIHlldCBiZWVuLCBpdCBxdWVyeVNlbGVjdG9ycyBmb3IgaXQgaW4gaXRzIGNoaWxkcmVuIGFuZCBpZiBpdCBkb2VzIG5vdCB5ZXQKICAgICAgICogZXhpc3QgKGUuZy4gaW4gcGFyc2VyLWdlbmVyYXRlZCBjYXNlKSwgb3BlbnMgYSBtdXRhdGlvbiBvYnNlcnZlciBhbmQKICAgICAgICogd2FpdHMgZm9yIGl0IHRvIGFwcGVhciAocmV0dXJucyBmYWxzZSBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGZvdW5kLAogICAgICAgKiBvdGhlcndpc2UgdHJ1ZSkuICBJbiB0aGUgYHJlbW92ZU5lc3RlZFRlbXBsYXRlc2AgY2FzZSwgdGhlICJ0ZW1wbGF0ZSIgd2lsbAogICAgICAgKiBiZSB0aGUgYGRvbS1pZmAgZWxlbWVudCBpdHNlbGYuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgd2hlbiBhIHRlbXBsYXRlIGhhcyBiZWVuIGZvdW5kLCBmYWxzZSBvdGhlcndpc2UKICAgICAgICovCiAgICAgIF9fZW5zdXJlVGVtcGxhdGUoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9fdGVtcGxhdGUpIHsKICAgICAgICAgIC8vIFdoZW4gYHJlbW92ZU5lc3RlZFRlbXBsYXRlc2AgaXMgdHJ1ZSwgdGhlICJ0ZW1wbGF0ZSIgaXMgdGhlIGVsZW1lbnQKICAgICAgICAgIC8vIGl0c2VsZiwgd2hpY2ggaGFzIGJlZW4gZ2l2ZW4gYSBgX3RlbXBsYXRlSW5mb2AgcHJvcGVydHkKICAgICAgICAgIGNvbnN0IHRoaXNBc1RlbXBsYXRlID0gLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8gKAogICAgICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxFbGVtZW50fSAqLyAodGhpcykpOwogICAgICAgICAgbGV0IHRlbXBsYXRlID0gdGhpc0FzVGVtcGxhdGUuX3RlbXBsYXRlSW5mbyA/CiAgICAgICAgICAgICAgdGhpc0FzVGVtcGxhdGUgOgogICAgICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9ICovCiAgICAgICAgICAgICAgKHdyYXAodGhpc0FzVGVtcGxhdGUpLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykpOwogICAgICAgICAgaWYgKCF0ZW1wbGF0ZSkgewogICAgICAgICAgICAvLyBXYWl0IHVudGlsIGNoaWxkTGlzdCBjaGFuZ2VzIGFuZCB0ZW1wbGF0ZSBzaG91bGQgYmUgdGhlcmUgYnkgdGhlbgogICAgICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcigoKSA9PiB7CiAgICAgICAgICAgICAgaWYgKHdyYXAodGhpcykucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKSkgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZGlzY29ubmVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fX3JlbmRlcigpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2RvbS1pZiByZXF1aXJlcyBhIDx0ZW1wbGF0ZT4gY2hpbGQnKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKHRoaXMsIHtjaGlsZExpc3Q6IHRydWV9KTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX3RlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyBhIGFuIGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0ZSBoYXMgYmVlbiBjcmVhdGVkIGFuZCBpbnNlcnRlZC4gVGhpcwogICAgICAgKiBtZXRob2QgbWF5IHJldHVybiBmYWxzZSBpZiB0aGUgdGVtcGxhdGUgaGFzIG5vdCB5ZXQgYmVlbiBmb3VuZCBvciBpZgogICAgICAgKiB0aGVyZSBpcyBubyBgcGFyZW50Tm9kZWAgdG8gaW5zZXJ0IHRoZSB0ZW1wbGF0ZSBpbnRvIChpbiBlaXRoZXIgY2FzZSwKICAgICAgICogY29ubmVjdGlvbiBvciB0aGUgdGVtcGxhdGUtZmluZGluZyBtdXRhdGlvbiBvYnNlcnZlciBmaXJpbmcgd2lsbCBxdWV1ZQogICAgICAgKiBhbm90aGVyIHJlbmRlciwgY2F1c2luZyB0aGlzIG1ldGhvZCB0byBiZSBjYWxsZWQgYWdhaW4gYXQgYSBtb3JlCiAgICAgICAqIGFwcHJvcHJpYXRlIHRpbWUpLgogICAgICAgKgogICAgICAgKiBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZyBtZXRob2RzIGNhbGxlZCBoZXJlOgogICAgICAgKiAtIGBfX2hhc0luc3RhbmNlYAogICAgICAgKiAtIGBfX2NyZWF0ZUFuZEluc2VydEluc3RhbmNlYAogICAgICAgKiAtIGBfX2dldEluc3RhbmNlTm9kZXNgCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFRydWUgaWYgdGhlIGluc3RhbmNlIHdhcyBjcmVhdGVkLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAqLwogICAgICBfX2Vuc3VyZUluc3RhbmNlKCkgewogICAgICAgIGxldCBwYXJlbnROb2RlID0gd3JhcCh0aGlzKS5wYXJlbnROb2RlOwogICAgICAgIGlmICghdGhpcy5fX2hhc0luc3RhbmNlKCkpIHsKICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgZWxlbWVudCBiZWluZyBkZXRhY2hlZCB3aGlsZSByZW5kZXIgd2FzIHF1ZXVlZAogICAgICAgICAgaWYgKCFwYXJlbnROb2RlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEZpbmQgdGhlIHRlbXBsYXRlICh3aGVuIGZhbHNlLCB0aGVyZSB3YXMgbm8gdGVtcGxhdGUgeWV0KQogICAgICAgICAgaWYgKCF0aGlzLl9fZW5zdXJlVGVtcGxhdGUoKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UocGFyZW50Tm9kZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIE1vdmUgaW5zdGFuY2UgY2hpbGRyZW4gaWYgbmVjZXNzYXJ5CiAgICAgICAgICBsZXQgY2hpbGRyZW4gPSB0aGlzLl9fZ2V0SW5zdGFuY2VOb2RlcygpOwogICAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgICAvLyBEZXRlY3QgY2FzZSB3aGVyZSBkb20taWYgd2FzIHJlLWF0dGFjaGVkIGluIG5ldyBwb3NpdGlvbgogICAgICAgICAgICBsZXQgbGFzdENoaWxkID0gd3JhcCh0aGlzKS5wcmV2aW91c1NpYmxpbmc7CiAgICAgICAgICAgIGlmIChsYXN0Q2hpbGQgIT09IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aC0xXSkgewogICAgICAgICAgICAgIGZvciAobGV0IGk9MCwgbjsgKGk8Y2hpbGRyZW4ubGVuZ3RoKSAmJiAobj1jaGlsZHJlbltpXSk7IGkrKykgewogICAgICAgICAgICAgICAgd3JhcChwYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUobiwgdGhpcyk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRm9yY2VzIHRoZSBlbGVtZW50IHRvIHJlbmRlciBpdHMgY29udGVudC4gTm9ybWFsbHkgcmVuZGVyaW5nIGlzCiAgICAgICAqIGFzeW5jaHJvbm91cyB0byBhIHByb3Zva2luZyBjaGFuZ2UuIFRoaXMgaXMgZG9uZSBmb3IgZWZmaWNpZW5jeSBzbwogICAgICAgKiB0aGF0IG11bHRpcGxlIGNoYW5nZXMgdHJpZ2dlciBvbmx5IGEgc2luZ2xlIHJlbmRlci4gVGhlIHJlbmRlciBtZXRob2QKICAgICAgICogc2hvdWxkIGJlIGNhbGxlZCBpZiwgZm9yIGV4YW1wbGUsIHRlbXBsYXRlIHJlbmRlcmluZyBpcyByZXF1aXJlZCB0bwogICAgICAgKiB2YWxpZGF0ZSBhcHBsaWNhdGlvbiBzdGF0ZS4KICAgICAgICoKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHJlbmRlcigpIHsKICAgICAgICBmbHVzaCgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUGVyZm9ybXMgdGhlIGtleSByZW5kZXJpbmcgc3RlcHM6CiAgICAgICAqIDEuIEVuc3VyZSBhIHRlbXBsYXRlIGluc3RhbmNlIGhhcyBiZWVuIHN0YW1wZWQgKHdoZW4gdHJ1ZSkKICAgICAgICogMi4gUmVtb3ZlIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZSAod2hlbiBmYWxzZSBhbmQgcmVzdGFtcDp0cnVlKQogICAgICAgKiAzLiBTeW5jIHRoZSBoaWRkZW4gc3RhdGUgb2YgdGhlIGluc3RhbmNlIG5vZGVzIHdpdGggdGhlIGlmL3Jlc3RhbXAgc3RhdGUKICAgICAgICogNC4gRmlyZXMgdGhlIGBkb20tY2hhbmdlYCBldmVudCB3aGVuIG5lY2Vzc2FyeQogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX19yZW5kZXIoKSB7CiAgICAgICAgaWYgKHRoaXMuaWYpIHsKICAgICAgICAgIGlmICghdGhpcy5fX2Vuc3VyZUluc3RhbmNlKCkpIHsKICAgICAgICAgICAgLy8gTm8gdGVtcGxhdGUgZm91bmQgeWV0CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMucmVzdGFtcCkgewogICAgICAgICAgdGhpcy5fX3RlYXJkb3duSW5zdGFuY2UoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2hvd0hpZGVDaGlsZHJlbigpOwogICAgICAgIGlmICgoIXN1cHByZXNzVGVtcGxhdGVOb3RpZmljYXRpb25zIHx8IHRoaXMubm90aWZ5RG9tQ2hhbmdlKQogICAgICAgICAgICAmJiB0aGlzLmlmICE9IHRoaXMuX2xhc3RJZikgewogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnZG9tLWNoYW5nZScsIHsKICAgICAgICAgICAgYnViYmxlczogdHJ1ZSwKICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUKICAgICAgICAgIH0pKTsKICAgICAgICAgIHRoaXMuX2xhc3RJZiA9IHRoaXMuaWY7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJZGVhbGx5IHRoZXNlIHdvdWxkIGJlIGFubm90YXRlZCBhcyBhYnN0cmFjdCBtZXRob2RzIGluIGFuIGFic3RyYWN0IGNsYXNzLAogICAgICAvLyBidXQgY2xvc3VyZSBjb21waWxlciBpcyBmaW5uaWNreQogICAgICAvKiBlc2xpbnQtZGlzYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgICAvKioKICAgICAgICogQWJzdHJhY3QgQVBJIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzOiBSZXR1cm5zIHRydWUgaWYgYSB0ZW1wbGF0ZQogICAgICAgKiBpbnN0YW5jZSBoYXMgYmVlbiBjcmVhdGVkIGFuZCBpbnNlcnRlZC4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gYW4gaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZC4KICAgICAgICovCiAgICAgIF9faGFzSW5zdGFuY2UoKSB7IH0KCiAgICAgIC8qKgogICAgICAgKiBBYnN0cmFjdCBBUEkgdG8gYmUgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3M6IFJldHVybnMgdGhlIGNoaWxkIG5vZGVzIHN0YW1wZWQKICAgICAgICogZnJvbSBhIHRlbXBsYXRlIGluc3RhbmNlLgogICAgICAgKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqIEByZXR1cm4ge0FycmF5PE5vZGU+fSBBcnJheSBvZiBjaGlsZCBub2RlcyBzdGFtcGVkIGZyb20gdGhlIHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlLgogICAgICAgKi8KICAgICAgX19nZXRJbnN0YW5jZU5vZGVzKCkgeyB9CgogICAgICAvKioKICAgICAgICogQWJzdHJhY3QgQVBJIHRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzOiBDcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZQogICAgICAgKiB0ZW1wbGF0ZSBhbmQgaW5zZXJ0cyBpdCBpbnRvIHRoZSBnaXZlbiBwYXJlbnQgbm9kZS4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcGFyYW0ge05vZGV9IHBhcmVudE5vZGUgVGhlIHBhcmVudCBub2RlIHRvIGluc2VydCB0aGUgaW5zdGFuY2UgaW50bwogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX19jcmVhdGVBbmRJbnNlcnRJbnN0YW5jZShwYXJlbnROb2RlKSB7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgLyoqCiAgICAgICAqIEFic3RyYWN0IEFQSSB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzczogUmVtb3ZlcyBub2RlcyBjcmVhdGVkIGJ5IGFuCiAgICAgICAqIGluc3RhbmNlIG9mIGEgdGVtcGxhdGUgYW5kIGFueSBhc3NvY2lhdGVkIGNsZWFudXAuCiAgICAgICAqCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9fdGVhcmRvd25JbnN0YW5jZSgpIHsgfQoKICAgICAgLyoqCiAgICAgICAqIEFic3RyYWN0IEFQSSB0byBiZSBpbXBsZW1lbnRlZCBieSBzdWJjbGFzczogU2hvd3Mgb3IgaGlkZXMgYW55IHRlbXBsYXRlCiAgICAgICAqIGluc3RhbmNlIGNoaWxkTm9kZXMgYmFzZWQgb24gdGhlIGBpZmAgc3RhdGUgb2YgdGhlIGVsZW1lbnQgYW5kIGl0cwogICAgICAgKiBgX19oaWRlVGVtcGxhdGVDaGlsZHJlbl9fYCBwcm9wZXJ0eS4KICAgICAgICoKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX3Nob3dIaWRlQ2hpbGRyZW4oKSB7IH0KICAgICAgLyogZXNsaW50LWVuYWJsZSB2YWxpZC1qc2RvYyAqLwogICAgfQoKICAgIC8qKgogICAgICogVGhlIHZlcnNpb24gb2YgRG9tSWYgdXNlZCB3aGVuIGBmYXN0RG9tSWZgIHNldHRpbmcgaXMgaW4gdXNlLCB3aGljaCBpcwogICAgICogb3B0aW1pemVkIGZvciBmaXJzdC1yZW5kZXIgKGJ1dCBhZGRzIGEgdGF4IHRvIGFsbCBzdWJzZXF1ZW50IHByb3BlcnR5IHVwZGF0ZXMKICAgICAqIG9uIHRoZSBob3N0LCB3aGV0aGVyIHRoZXkgd2VyZSB1c2VkIGluIGEgZ2l2ZW4gYGRvbS1pZmAgb3Igbm90KS4KICAgICAqCiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGF2b2lkcyB1c2Ugb2YgYFRlbXBsYXRpemVyYCwgd2hpY2ggaW50cm9kdWNlcyBhIG5ldyBzY29wZQogICAgICogKGEgbm9uLWVsZW1lbnQgUHJvcGVydHlFZmZlY3RzIGluc3RhbmNlKSwgd2hpY2ggaXMgbm90IHN0cmljdGx5IG5lY2Vzc2FyeQogICAgICogc2luY2UgYGRvbS1pZmAgbmV2ZXIgaW50cm9kdWNlcyBuZXcgcHJvcGVydGllcyB0byBpdHMgc2NvcGUgKHVubGlrZQogICAgICogYGRvbS1yZXBlYXRgKS4gVGFraW5nIGFkdmFudGFnZSBvZiB0aGlzIGZhY3QsIHRoZSBgZG9tLWlmYCByZWFjaGVzIHVwIHRvIGl0cwogICAgICogYF9fZGF0YUhvc3RgIGFuZCBzdGFtcHMgdGhlIHRlbXBsYXRlIGRpcmVjdGx5IGZyb20gdGhlIGhvc3QgdXNpbmcgdGhlIGhvc3QncwogICAgICogcnVudGltZSBgX3N0YW1wVGVtcGxhdGVgIEFQSSwgd2hpY2ggYmluZHMgdGhlIHByb3BlcnR5IGVmZmVjdHMgb2YgdGhlCiAgICAgKiB0ZW1wbGF0ZSBkaXJlY3RseSB0byB0aGUgaG9zdC4gVGhpcyBib3RoIGF2b2lkcyB0aGUgaW50ZXJtZWRpYXJ5CiAgICAgKiBgVGVtcGxhdGl6ZXJgIGluc3RhbmNlLCBidXQgYWxzbyBhdm9pZHMgdGhlIG5lZWQgdG8gYmluZCBob3N0IHByb3BlcnRpZXMgdG8KICAgICAqIHRoZSBgPHRlbXBsYXRlPmAgZWxlbWVudCBhbmQgZm9yd2FyZCB0aG9zZSBpbnRvIHRoZSB0ZW1wbGF0ZSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBJbiB0aGlzIHZlcnNpb24gb2YgYGRvbS1pZmAsIHRoZSBgdGhpcy5fX2luc3RhbmNlYCBtZXRob2QgaXMgdGhlCiAgICAgKiBgRG9jdW1lbnRGcmFnbWVudGAgcmV0dXJuZWQgZnJvbSBgX3N0YW1wVGVtcGxhdGVgLCB3aGljaCBhbHNvIHNlcnZlcyBhcyB0aGUKICAgICAqIGhhbmRsZSBmb3IgbGF0ZXIgcmVtb3ZpbmcgaXQgdXNpbmcgdGhlIGBfcmVtb3ZlQm91bmREb21gIG1ldGhvZC4KICAgICAqLwogICAgY2xhc3MgRG9tSWZGYXN0IGV4dGVuZHMgRG9tSWZCYXNlIHsKCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fX2luc3RhbmNlID0gbnVsbDsKICAgICAgICB0aGlzLl9fc3luY0luZm8gPSBudWxsOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWJzdHJhY3QgQVBJIG5lZWRlZCBieSBEb21JZkJhc2UuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gYW4gaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZC4KICAgICAgICovCiAgICAgIF9faGFzSW5zdGFuY2UoKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFic3RyYWN0IEFQSSBuZWVkZWQgYnkgRG9tSWZCYXNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7QXJyYXk8Tm9kZT59IEFycmF5IG9mIGNoaWxkIG5vZGVzIHN0YW1wZWQgZnJvbSB0aGUgdGVtcGxhdGUKICAgICAgICogaW5zdGFuY2UuCiAgICAgICAqLwogICAgICBfX2dldEluc3RhbmNlTm9kZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX19pbnN0YW5jZS50ZW1wbGF0ZUluZm8uY2hpbGROb2RlczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFic3RyYWN0IEFQSSBuZWVkZWQgYnkgRG9tSWZCYXNlLgogICAgICAgKgogICAgICAgKiBTdGFtcHMgdGhlIHRlbXBsYXRlIGJ5IGNhbGxpbmcgYF9zdGFtcFRlbXBsYXRlYCBvbiB0aGUgYF9fZGF0YUhvc3RgIG9mIHRoaXMKICAgICAgICogZWxlbWVudCBhbmQgdGhlbiBpbnNlcnRzIHRoZSByZXN1bHRpbmcgbm9kZXMgaW50byB0aGUgZ2l2ZW4gYHBhcmVudE5vZGVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBwYXJlbnQgbm9kZSB0byBpbnNlcnQgdGhlIGluc3RhbmNlIGludG8KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UocGFyZW50Tm9kZSkgewogICAgICAgIGNvbnN0IGhvc3QgPSB0aGlzLl9fZGF0YUhvc3QgfHwgdGhpczsKICAgICAgICBpZiAoc3RyaWN0VGVtcGxhdGVQb2xpY3kpIHsKICAgICAgICAgIGlmICghdGhpcy5fX2RhdGFIb3N0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignc3RyaWN0VGVtcGxhdGVQb2xpY3k6IHRlbXBsYXRlIG93bmVyIG5vdCB0cnVzdGVkJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFByZS1iaW5kIGFuZCBsaW5rIHRoZSB0ZW1wbGF0ZSBpbnRvIHRoZSBlZmZlY3RzIHN5c3RlbQogICAgICAgIGNvbnN0IHRlbXBsYXRlSW5mbyA9IGhvc3QuX2JpbmRUZW1wbGF0ZSgKICAgICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8gKHRoaXMuX190ZW1wbGF0ZSksIHRydWUpOwogICAgICAgIC8vIEluc3RhbGwgcnVuRWZmZWN0cyBob29rIHRoYXQgcHJldmVudHMgcnVubmluZyBwcm9wZXJ0eSBlZmZlY3RzCiAgICAgICAgLy8gKGFuZCBhbnkgbmVzdGVkIHRlbXBsYXRlIGVmZmVjdHMpIHdoZW4gdGhlIGBpZmAgaXMgZmFsc2UKICAgICAgICB0ZW1wbGF0ZUluZm8ucnVuRWZmZWN0cyA9IChydW5FZmZlY3RzLCBjaGFuZ2VkUHJvcHMsIGhhc1BhdGhzKSA9PiB7CiAgICAgICAgICBsZXQgc3luY0luZm8gPSB0aGlzLl9fc3luY0luZm87CiAgICAgICAgICBpZiAodGhpcy5pZikgewogICAgICAgICAgICAvLyBNaXggYW55IHByb3BzIHRoYXQgY2hhbmdlZCB3aGlsZSB0aGUgYGlmYCB3YXMgZmFsc2UgaW50byBgY2hhbmdlZFByb3BzYAogICAgICAgICAgICBpZiAoc3luY0luZm8pIHsKICAgICAgICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIHByb3BlcnRpZXMgcmVjZWl2ZWQgd2hpbGUgdGhlIGBpZmAgd2FzIGZhbHNlLCBpdCBpcwogICAgICAgICAgICAgIC8vIGltcG9ydGFudCB0byBzeW5jIHRoZSBoaWRkZW4gc3RhdGUgd2l0aCB0aGUgZWxlbWVudCBfZmlyc3RfLCBzbyB0aGF0CiAgICAgICAgICAgICAgLy8gbmV3IGJpbmRpbmdzIHRvIGUuZy4gYHRleHRDb250ZW50YCBkbyBub3QgZ2V0IHN0b21wZWQgb24gYnkKICAgICAgICAgICAgICAvLyBwcmUtaGlkZGVuIHZhbHVlcyBpZiBgX3Nob3dIaWRlQ2hpbGRyZW5gIHdlcmUgdG8gYmUgY2FsbGVkIGxhdGVyIGF0CiAgICAgICAgICAgICAgLy8gdGhlIG5leHQgcmVuZGVyLiBDbGVhcmluZyBgX19pbnZhbGlkUHJvcHNgIGhlcmUgZW5zdXJlcwogICAgICAgICAgICAgIC8vIGBfc2hvd0hpZGVDaGlsZHJlbmAncyBjYWxsIHRvIGBfX3N5bmNIb3N0UHJvcGVydGllc2Agbm8tb3BzLCBzbwogICAgICAgICAgICAgIC8vIHRoYXQgd2UgZG9uJ3QgY2FsbCBgcnVuRWZmZWN0c2AgbW9yZSBvZnRlbiB0aGFuIG5lY2Vzc2FyeS4KICAgICAgICAgICAgICB0aGlzLl9fc3luY0luZm8gPSBudWxsOwogICAgICAgICAgICAgIHRoaXMuX3Nob3dIaWRlQ2hpbGRyZW4oKTsKICAgICAgICAgICAgICBjaGFuZ2VkUHJvcHMgPSBPYmplY3QuYXNzaWduKHN5bmNJbmZvLmNoYW5nZWRQcm9wcywgY2hhbmdlZFByb3BzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBydW5FZmZlY3RzKGNoYW5nZWRQcm9wcywgaGFzUGF0aHMpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQWNjdW11bGF0ZSBhbnkgdmFsdWVzIGNoYW5nZWQgd2hpbGUgYGlmYCB3YXMgZmFsc2UsIGFsb25nIHdpdGggdGhlCiAgICAgICAgICAgIC8vIHJ1bkVmZmVjdHMgbWV0aG9kIHRvIHN5bmMgdGhlbSwgc28gdGhhdCB3ZSBjYW4gcmVwbGF5IHRoZW0gb25jZSBgaWZgCiAgICAgICAgICAgIC8vIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICBpZiAodGhpcy5fX2luc3RhbmNlKSB7CiAgICAgICAgICAgICAgaWYgKCFzeW5jSW5mbykgewogICAgICAgICAgICAgICAgc3luY0luZm8gPSB0aGlzLl9fc3luY0luZm8gPSB7IHJ1bkVmZmVjdHMsIGNoYW5nZWRQcm9wczoge30gfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgaWYgKGhhc1BhdGhzKSB7CiAgICAgICAgICAgICAgICAvLyBTdG9yZSByb290IG9iamVjdCBvZiBhbnkgcGF0aHM7IHRoaXMgd2lsbCBlbnN1cmUgZGlyZWN0IGJpbmRpbmdzCiAgICAgICAgICAgICAgICAvLyBsaWtlIFtbb2JqLmZvb11dIGJpbmRpbmdzIHJ1biBhZnRlciBhIGBzZXQoJ29iai5mb28nLCB2KWAsIGJ1dAogICAgICAgICAgICAgICAgLy8gbm90ZSB0aGF0IHBhdGggbm90aWZpY2F0aW9ucyBsaWtlIGBzZXQoJ29iai5mb28uYmFyJywgdilgIHdpbGwKICAgICAgICAgICAgICAgIC8vIG5vdCBwcm9wYWdhdGUuIFNpbmNlIGJhdGNoZWQgcGF0aCBub3RpZmljYXRpb25zIGFyZSBub3QKICAgICAgICAgICAgICAgIC8vIHN1cHBvcnRlZCwgd2UgY2Fubm90IHNpbXBseSBhY2N1bXVsYXRlIHBhdGggbm90aWZpY2F0aW9ucy4gVGhpcwogICAgICAgICAgICAgICAgLy8gaXMgZXF1aXZhbGVudCB0byB0aGUgbm9uLWZhc3REb21JZiBjYXNlLCB3aGljaCBzdG9yZXMgcm9vdChwKSBpbgogICAgICAgICAgICAgICAgLy8gX19pbnZhbGlkUHJvcHMuCiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHAgaW4gY2hhbmdlZFByb3BzKSB7CiAgICAgICAgICAgICAgICAgIGNvbnN0IHJvb3RQcm9wID0gcm9vdChwKTsKICAgICAgICAgICAgICAgICAgc3luY0luZm8uY2hhbmdlZFByb3BzW3Jvb3RQcm9wXSA9IHRoaXMuX19kYXRhSG9zdFtyb290UHJvcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oc3luY0luZm8uY2hhbmdlZFByb3BzLCBjaGFuZ2VkUHJvcHMpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLy8gU3RhbXAgdGhlIHRlbXBsYXRlLCBhbmQgc2V0IGl0cyBEb2N1bWVudEZyYWdtZW50IHRvIHRoZSAiaW5zdGFuY2UiCiAgICAgICAgdGhpcy5fX2luc3RhbmNlID0gaG9zdC5fc3RhbXBUZW1wbGF0ZSgKICAgICAgICAgICAgLyoqIEB0eXBlIHshSFRNTFRlbXBsYXRlRWxlbWVudH0gKi8gKHRoaXMuX190ZW1wbGF0ZSksIHRlbXBsYXRlSW5mbyk7CiAgICAgICAgd3JhcChwYXJlbnROb2RlKS5pbnNlcnRCZWZvcmUodGhpcy5fX2luc3RhbmNlLCB0aGlzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJ1biBlZmZlY3RzIGZvciBhbnkgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgd2hpbGUgdGhlIGBpZmAgd2FzIGZhbHNlLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgICAgY29uc3Qgc3luY0luZm8gPSB0aGlzLl9fc3luY0luZm87CiAgICAgICAgaWYgKHN5bmNJbmZvKSB7CiAgICAgICAgICB0aGlzLl9fc3luY0luZm8gPSBudWxsOwogICAgICAgICAgc3luY0luZm8ucnVuRWZmZWN0cyhzeW5jSW5mby5jaGFuZ2VkUHJvcHMsIGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhYnN0cmFjdCBBUEkgbmVlZGVkIGJ5IERvbUlmQmFzZS4KICAgICAgICoKICAgICAgICogUmVtb3ZlIHRoZSBpbnN0YW5jZSBhbmQgYW55IG5vZGVzIGl0IGNyZWF0ZWQuICBVc2VzIHRoZSBgX19kYXRhSG9zdGAncwogICAgICAgKiBydW50aW1lIGBfcmVtb3ZlQm91bmREb21gIG1ldGhvZC4KICAgICAgICoKICAgICAgICogQG92ZXJyaWRlCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBfX3RlYXJkb3duSW5zdGFuY2UoKSB7CiAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuX19kYXRhSG9zdCB8fCB0aGlzOwogICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIGhvc3QuX3JlbW92ZUJvdW5kRG9tKHRoaXMuX19pbnN0YW5jZSk7CiAgICAgICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICAgICAgdGhpcy5fX3N5bmNJbmZvID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhYnN0cmFjdCBBUEkgbmVlZGVkIGJ5IERvbUlmQmFzZS4KICAgICAgICoKICAgICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRvcCBsZXZlbCBjaGlsZCBub2Rlcy4gRm9yCiAgICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICAgKiAic2hvd24uIgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAc3VwcHJlc3Mge3Zpc2liaWxpdHl9CiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbigpIHsKICAgICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgICBpZiAodGhpcy5fX2luc3RhbmNlICYmIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlLl9faGlkZGVuKSAhPT0gaGlkZGVuKSB7CiAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuX19oaWRkZW4gPSBoaWRkZW47CiAgICAgICAgICBzaG93SGlkZUNoaWxkcmVuKGhpZGRlbiwgdGhpcy5fX2luc3RhbmNlLnRlbXBsYXRlSW5mby5jaGlsZE5vZGVzKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFoaWRkZW4pIHsKICAgICAgICAgIHRoaXMuX19zeW5jSG9zdFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFRoZSAibGVnYWN5IiBpbXBsZW1lbnRhdGlvbiBvZiBgZG9tLWlmYCwgaW1wbGVtZW50ZWQgdXNpbmcgYFRlbXBsYXRpemVyYC4KICAgICAqCiAgICAgKiBJbiB0aGlzIHZlcnNpb24sIGB0aGlzLl9faW5zdGFuY2VgIGlzIHRoZSBgVGVtcGxhdGVJbnN0YW5jZWAgcmV0dXJuZWQKICAgICAqIGZyb20gdGhlIHRlbXBsYXRpemVkIGNvbnN0cnVjdG9yLgogICAgICovCiAgICBjbGFzcyBEb21JZkxlZ2FjeSBleHRlbmRzIERvbUlmQmFzZSB7CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuX19jdG9yID0gbnVsbDsKICAgICAgICB0aGlzLl9faW5zdGFuY2UgPSBudWxsOwogICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSW1wbGVtZW50YXRpb24gb2YgYWJzdHJhY3QgQVBJIG5lZWRlZCBieSBEb21JZkJhc2UuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIHdoZW4gYW4gaW5zdGFuY2UgaGFzIGJlZW4gY3JlYXRlZC4KICAgICAgICovCiAgICAgIF9faGFzSW5zdGFuY2UoKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFic3RyYWN0IEFQSSBuZWVkZWQgYnkgRG9tSWZCYXNlLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHJldHVybiB7QXJyYXk8Tm9kZT59IEFycmF5IG9mIGNoaWxkIG5vZGVzIHN0YW1wZWQgZnJvbSB0aGUgdGVtcGxhdGUKICAgICAgICogaW5zdGFuY2UuCiAgICAgICAqLwogICAgICBfX2dldEluc3RhbmNlTm9kZXMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX19pbnN0YW5jZS5jaGlsZHJlbjsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFic3RyYWN0IEFQSSBuZWVkZWQgYnkgRG9tSWZCYXNlLgogICAgICAgKgogICAgICAgKiBTdGFtcHMgdGhlIHRlbXBsYXRlIGJ5IGNyZWF0aW5nIGEgbmV3IGluc3RhbmNlIG9mIHRoZSB0ZW1wbGF0aXplZAogICAgICAgKiBjb25zdHJ1Y3RvciAod2hpY2ggaXMgY3JlYXRlZCBsYXppbHkgaWYgaXQgZG9lcyBub3QgeWV0IGV4aXN0KSwgYW5kIHRoZW4KICAgICAgICogaW5zZXJ0cyBpdHMgcmVzdWx0aW5nIGByb290YCBkb2MgZnJhZ21lbnQgaW50byB0aGUgZ2l2ZW4gYHBhcmVudE5vZGVgLgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlIFRoZSBwYXJlbnQgbm9kZSB0byBpbnNlcnQgdGhlIGluc3RhbmNlIGludG8KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIF9fY3JlYXRlQW5kSW5zZXJ0SW5zdGFuY2UocGFyZW50Tm9kZSkgewogICAgICAgIC8vIEVuc3VyZSB3ZSBoYXZlIGFuIGluc3RhbmNlIGNvbnN0cnVjdG9yCiAgICAgICAgaWYgKCF0aGlzLl9fY3RvcikgewogICAgICAgICAgdGhpcy5fX2N0b3IgPSB0ZW1wbGF0aXplKAogICAgICAgICAgICAgIC8qKiBAdHlwZSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9ICovICh0aGlzLl9fdGVtcGxhdGUpLCB0aGlzLCB7CiAgICAgICAgICAgICAgICAvLyBkb20taWYgdGVtcGxhdGl6ZXIgaW5zdGFuY2VzIHJlcXVpcmUgYG11dGFibGU6IHRydWVgLCBhcwogICAgICAgICAgICAgICAgLy8gYF9fc3luY0hvc3RQcm9wZXJ0aWVzYCByZWxpZXMgb24gdGhhdCBiZWhhdmlvciB0byBzeW5jIG9iamVjdHMKICAgICAgICAgICAgICAgIG11dGFibGVEYXRhOiB0cnVlLAogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcHJvcCBQcm9wZXJ0eSB0byBmb3J3YXJkCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFZhbHVlIG9mIHByb3BlcnR5CiAgICAgICAgICAgICAgICAgKiBAdGhpcyB7RG9tSWZMZWdhY3l9CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZvcndhcmRIb3N0UHJvcDogZnVuY3Rpb24ocHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX19pbnN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlmKSB7CiAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgaGF2ZSBhbiBpbnN0YW5jZSBidXQgYXJlIHNxdWVsY2hpbmcgaG9zdCBwcm9wZXJ0eQogICAgICAgICAgICAgICAgICAgICAgLy8gZm9yd2FyZGluZyBkdWUgdG8gaWYgYmVpbmcgZmFsc2UsIG5vdGUgdGhlIGludmFsaWRhdGVkCiAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0aWVzIHNvIGBfX3N5bmNIb3N0UHJvcGVydGllc2AgY2FuIHN5bmMgdGhlbSB0aGUgbmV4dAogICAgICAgICAgICAgICAgICAgICAgLy8gdGltZSBgaWZgIGJlY29tZXMgdHJ1ZQogICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wcyB8fCBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgdGhpcy5fX2ludmFsaWRQcm9wc1tyb290KHByb3ApXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIENyZWF0ZSBhbmQgaW5zZXJ0IHRoZSBpbnN0YW5jZQogICAgICAgIHRoaXMuX19pbnN0YW5jZSA9IG5ldyB0aGlzLl9fY3RvcigpOwogICAgICAgIHdyYXAocGFyZW50Tm9kZSkuaW5zZXJ0QmVmb3JlKHRoaXMuX19pbnN0YW5jZS5yb290LCB0aGlzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFic3RyYWN0IEFQSSBuZWVkZWQgYnkgRG9tSWZCYXNlLgogICAgICAgKgogICAgICAgKiBSZW1vdmVzIHRoZSBpbnN0YW5jZSBhbmQgYW55IG5vZGVzIGl0IGNyZWF0ZWQuCiAgICAgICAqCiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX190ZWFyZG93bkluc3RhbmNlKCkgewogICAgICAgIGlmICh0aGlzLl9faW5zdGFuY2UpIHsKICAgICAgICAgIGxldCBjJCA9IHRoaXMuX19pbnN0YW5jZS5jaGlsZHJlbjsKICAgICAgICAgIGlmIChjJCAmJiBjJC5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gdXNlIGZpcnN0IGNoaWxkIHBhcmVudCwgZm9yIGNhc2Ugd2hlbiBkb20taWYgbWF5IGhhdmUgYmVlbiBkZXRhY2hlZAogICAgICAgICAgICBsZXQgcGFyZW50ID0gd3JhcChjJFswXSkucGFyZW50Tm9kZTsKICAgICAgICAgICAgLy8gSW5zdGFuY2UgY2hpbGRyZW4gbWF5IGJlIGRpc2Nvbm5lY3RlZCBmcm9tIHBhcmVudHMgd2hlbiBkb20taWYKICAgICAgICAgICAgLy8gZGV0YWNoZXMgaWYgYSB0cmVlIHdhcyBpbm5lckhUTUwnZWQKICAgICAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICAgIHBhcmVudCA9IHdyYXAocGFyZW50KTsKICAgICAgICAgICAgICBmb3IgKGxldCBpPTAsIG47IChpPGMkLmxlbmd0aCkgJiYgKG49YyRbaV0pOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChuKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgICAgdGhpcy5fX2luc3RhbmNlID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBGb3J3YXJkcyBhbnkgcHJvcGVydGllcyB0aGF0IGNoYW5nZWQgd2hpbGUgdGhlIGBpZmAgd2FzIGZhbHNlIGludG8gdGhlCiAgICAgICAqIHRlbXBsYXRlIGluc3RhbmNlIGFuZCBmbHVzaGVzIGl0LgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgX19zeW5jSG9zdFByb3BlcnRpZXMoKSB7CiAgICAgICAgbGV0IHByb3BzID0gdGhpcy5fX2ludmFsaWRQcm9wczsKICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgIHRoaXMuX19pbnZhbGlkUHJvcHMgPSBudWxsOwogICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBwcm9wcykgewogICAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuX3NldFBlbmRpbmdQcm9wZXJ0eShwcm9wLCB0aGlzLl9fZGF0YUhvc3RbcHJvcF0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fX2luc3RhbmNlLl9mbHVzaFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiBhYnN0cmFjdCBBUEkgbmVlZGVkIGJ5IERvbUlmQmFzZS4KICAgICAgICoKICAgICAgICogU2hvd3Mgb3IgaGlkZXMgdGhlIHRlbXBsYXRlIGluc3RhbmNlIHRvcCBsZXZlbCBjaGlsZCBlbGVtZW50cy4gRm9yCiAgICAgICAqIHRleHQgbm9kZXMsIGB0ZXh0Q29udGVudGAgaXMgcmVtb3ZlZCB3aGlsZSAiaGlkZGVuIiBhbmQgcmVwbGFjZWQgd2hlbgogICAgICAgKiAic2hvd24uIgogICAgICAgKgogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKiBAc3VwcHJlc3Mge3Zpc2liaWxpdHl9CiAgICAgICAqLwogICAgICBfc2hvd0hpZGVDaGlsZHJlbigpIHsKICAgICAgICBjb25zdCBoaWRkZW4gPSB0aGlzLl9faGlkZVRlbXBsYXRlQ2hpbGRyZW5fXyB8fCAhdGhpcy5pZjsKICAgICAgICBpZiAodGhpcy5fX2luc3RhbmNlICYmIEJvb2xlYW4odGhpcy5fX2luc3RhbmNlLl9faGlkZGVuKSAhPT0gaGlkZGVuKSB7CiAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuX19oaWRkZW4gPSBoaWRkZW47CiAgICAgICAgICB0aGlzLl9faW5zdGFuY2UuX3Nob3dIaWRlQ2hpbGRyZW4oaGlkZGVuKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFoaWRkZW4pIHsKICAgICAgICAgIHRoaXMuX19zeW5jSG9zdFByb3BlcnRpZXMoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFRoZSBgPGRvbS1pZj5gIGVsZW1lbnQgd2lsbCBzdGFtcCBhIGxpZ2h0LWRvbSBgPHRlbXBsYXRlPmAgY2hpbGQgd2hlbgogICAgICogdGhlIGBpZmAgcHJvcGVydHkgYmVjb21lcyB0cnV0aHksIGFuZCB0aGUgdGVtcGxhdGUgY2FuIHVzZSBQb2x5bWVyCiAgICAgKiBkYXRhLWJpbmRpbmcgYW5kIGRlY2xhcmF0aXZlIGV2ZW50IGZlYXR1cmVzIHdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZgogICAgICogYSBQb2x5bWVyIGVsZW1lbnQncyB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBXaGVuIGBpZmAgYmVjb21lcyBmYWxzeSwgdGhlIHN0YW1wZWQgY29udGVudCBpcyBoaWRkZW4gYnV0IG5vdAogICAgICogcmVtb3ZlZCBmcm9tIGRvbS4gV2hlbiBgaWZgIHN1YnNlcXVlbnRseSBiZWNvbWVzIHRydXRoeSBhZ2FpbiwgdGhlIGNvbnRlbnQKICAgICAqIGlzIHNpbXBseSByZS1zaG93bi4gVGhpcyBhcHByb2FjaCBpcyB1c2VkIGR1ZSB0byBpdHMgZmF2b3JhYmxlIHBlcmZvcm1hbmNlCiAgICAgKiBjaGFyYWN0ZXJpc3RpY3M6IHRoZSBleHBlbnNlIG9mIGNyZWF0aW5nIHRlbXBsYXRlIGNvbnRlbnQgaXMgcGFpZCBvbmx5CiAgICAgKiBvbmNlIGFuZCBsYXppbHkuCiAgICAgKgogICAgICogU2V0IHRoZSBgcmVzdGFtcGAgcHJvcGVydHkgdG8gdHJ1ZSB0byBmb3JjZSB0aGUgc3RhbXBlZCBjb250ZW50IHRvIGJlCiAgICAgKiBjcmVhdGVkIC8gZGVzdHJveWVkIHdoZW4gdGhlIGBpZmAgY29uZGl0aW9uIGNoYW5nZXMuCiAgICAgKgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAZXh0ZW5kcyBEb21JZkJhc2UKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBjb25kaXRpb25hbGx5IHN0YW1wcyBhbmQgaGlkZXMgb3IgcmVtb3ZlcwogICAgICogICB0ZW1wbGF0ZSBjb250ZW50IGJhc2VkIG9uIGEgYm9vbGVhbiBmbGFnLgogICAgICovCiAgICBjb25zdCBEb21JZiA9IGZhc3REb21JZiA/IERvbUlmRmFzdCA6IERvbUlmTGVnYWN5OwoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShEb21JZi5pcywgRG9tSWYpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBFbGVtZW50IG1peGluIGZvciByZWNvcmRpbmcgZHluYW1pYyBhc3NvY2lhdGlvbnMgYmV0d2VlbiBpdGVtIHBhdGhzIGluIGEKICAgICAqIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhIGBzZWxlY3RlZGAgYXJyYXkgc3VjaCB0aGF0IHBhdGggY2hhbmdlcyB0byB0aGUKICAgICAqIG1hc3RlciBhcnJheSAoYXQgdGhlIGhvc3QpIGVsZW1lbnQgb3IgZWxzZXdoZXJlIHZpYSBkYXRhLWJpbmRpbmcpIGFyZQogICAgICogY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMgaW4gdGhlIHNlbGVjdGVkIGFycmF5IGFuZCB2aWNlLXZlcnNhLgogICAgICoKICAgICAqIFRoZSBgaXRlbXNgIHByb3BlcnR5IGFjY2VwdHMgYW4gYXJyYXkgb2YgdXNlciBkYXRhLCBhbmQgdmlhIHRoZQogICAgICogYHNlbGVjdChpdGVtKWAgYW5kIGBkZXNlbGVjdChpdGVtKWAgQVBJLCB1cGRhdGVzIHRoZSBgc2VsZWN0ZWRgIHByb3BlcnR5CiAgICAgKiB3aGljaCBtYXkgYmUgYm91bmQgdG8gb3RoZXIgcGFydHMgb2YgdGhlIGFwcGxpY2F0aW9uLCBhbmQgYW55IGNoYW5nZXMgdG8KICAgICAqIHN1Yi1maWVsZHMgb2YgYHNlbGVjdGVkYCBpdGVtKHMpIHdpbGwgYmUga2VwdCBpbiBzeW5jIHdpdGggaXRlbXMgaW4gdGhlCiAgICAgKiBgaXRlbXNgIGFycmF5LiAgV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCBgc2VsZWN0ZWRgIGlzIGEgcHJvcGVydHkKICAgICAqIHJlcHJlc2VudGluZyB0aGUgbGFzdCBzZWxlY3RlZCBpdGVtLiAgV2hlbiBgbXVsdGlgIGlzIHRydWUsIGBzZWxlY3RlZGAKICAgICAqIGlzIGFuIGFycmF5IG9mIG11bHRpcGx5IHNlbGVjdGVkIGl0ZW1zLgogICAgICoKICAgICAqIEBwb2x5bWVyCiAgICAgKiBAbWl4aW5GdW5jdGlvbgogICAgICogQGFwcGxpZXNNaXhpbiBFbGVtZW50TWl4aW4KICAgICAqIEBzdW1tYXJ5IEVsZW1lbnQgbWl4aW4gZm9yIHJlY29yZGluZyBkeW5hbWljIGFzc29jaWF0aW9ucyBiZXR3ZWVuIGl0ZW0gcGF0aHMgaW4gYQogICAgICogbWFzdGVyIGBpdGVtc2AgYXJyYXkgYW5kIGEgYHNlbGVjdGVkYCBhcnJheQogICAgICovCiAgICBsZXQgQXJyYXlTZWxlY3Rvck1peGluID0gZGVkdXBpbmdNaXhpbihzdXBlckNsYXNzID0+IHsKCiAgICAgIC8qKgogICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICogQGltcGxlbWVudHMge1BvbHltZXJfRWxlbWVudE1peGlufQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgbGV0IGVsZW1lbnRCYXNlID0gRWxlbWVudE1peGluKHN1cGVyQ2xhc3MpOwoKICAgICAgLyoqCiAgICAgICAqIEBwb2x5bWVyCiAgICAgICAqIEBtaXhpbkNsYXNzCiAgICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyX0FycmF5U2VsZWN0b3JNaXhpbn0KICAgICAgICogQHVucmVzdHJpY3RlZAogICAgICAgKi8KICAgICAgY2xhc3MgQXJyYXlTZWxlY3Rvck1peGluIGV4dGVuZHMgZWxlbWVudEJhc2UgewoKICAgICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgICByZXR1cm4gewoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgaXRlbXMgZnJvbSB3aGljaCBzZWxlY3Rpb24gd2lsbCBiZSBtYWRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaXRlbXM6IHsKICAgICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgfSwKCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGVuIGB0cnVlYCwgbXVsdGlwbGUgaXRlbXMgbWF5IGJlIHNlbGVjdGVkIGF0IG9uY2UgKGluIHRoaXMgY2FzZSwKICAgICAgICAgICAgICogYHNlbGVjdGVkYCBpcyBhbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMpLiAgV2hlbiBgZmFsc2VgLAogICAgICAgICAgICAgKiBvbmx5IG9uZSBpdGVtIG1heSBiZSBzZWxlY3RlZCBhdCBhIHRpbWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtdWx0aTogewogICAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgICB9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gYG11bHRpYCBpcyB0cnVlLCB0aGlzIGlzIGFuIGFycmF5IHRoYXQgY29udGFpbnMgYW55IHNlbGVjdGVkLgogICAgICAgICAgICAgKiBXaGVuIGBtdWx0aWAgaXMgZmFsc2UsIHRoaXMgaXMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtLCBvciBgbnVsbGAKICAgICAgICAgICAgICogaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgICAgICogQHR5cGUgez9PYmplY3R8P0FycmF5PCFPYmplY3Q+fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2VsZWN0ZWQ6IHt0eXBlOiBPYmplY3QsIG5vdGlmeTogdHJ1ZX0sCgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hlbiBgbXVsdGlgIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IgYG51bGxgCiAgICAgICAgICAgICAqIGlmIG5vIGl0ZW0gaXMgc2VsZWN0ZWQuCiAgICAgICAgICAgICAqIEB0eXBlIHs/T2JqZWN0fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2VsZWN0ZWRJdGVtOiB7dHlwZTogT2JqZWN0LCBub3RpZnk6IHRydWV9LAoKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gYHRydWVgLCBjYWxsaW5nIGBzZWxlY3RgIG9uIGFuIGl0ZW0gdGhhdCBpcyBhbHJlYWR5IHNlbGVjdGVkCiAgICAgICAgICAgICAqIHdpbGwgZGVzZWxlY3QgdGhlIGl0ZW0uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0b2dnbGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9CgogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgICAgcmV0dXJuIFsnX191cGRhdGVTZWxlY3Rpb24obXVsdGksIGl0ZW1zLiopJ107CiAgICAgICAgfQoKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICB0aGlzLl9fbGFzdEl0ZW1zID0gbnVsbDsKICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBudWxsOwogICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIF9fdXBkYXRlU2VsZWN0aW9uKG11bHRpLCBpdGVtc0luZm8pIHsKICAgICAgICAgIGxldCBwYXRoID0gaXRlbXNJbmZvLnBhdGg7CiAgICAgICAgICBpZiAocGF0aCA9PSBKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdpdGVtcycsIHRoaXMpKSB7CiAgICAgICAgICAgIC8vIENhc2UgMSAtIGl0ZW1zIGFycmF5IGNoYW5nZWQsIHNvIGRpZmYgYWdhaW5zdCBwcmV2aW91cyBhcnJheSBhbmQKICAgICAgICAgICAgLy8gZGVzZWxlY3QgYW55IHJlbW92ZWQgaXRlbXMgYW5kIGFkanVzdCBzZWxlY3RlZCBpbmRpY2VzCiAgICAgICAgICAgIGxldCBuZXdJdGVtcyA9IGl0ZW1zSW5mby5iYXNlIHx8IFtdOwogICAgICAgICAgICBsZXQgbGFzdEl0ZW1zID0gdGhpcy5fX2xhc3RJdGVtczsKICAgICAgICAgICAgbGV0IGxhc3RNdWx0aSA9IHRoaXMuX19sYXN0TXVsdGk7CiAgICAgICAgICAgIGlmIChtdWx0aSAhPT0gbGFzdE11bHRpKSB7CiAgICAgICAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsYXN0SXRlbXMpIHsKICAgICAgICAgICAgICBsZXQgc3BsaWNlcyA9IGNhbGN1bGF0ZVNwbGljZXMobmV3SXRlbXMsIGxhc3RJdGVtcyk7CiAgICAgICAgICAgICAgdGhpcy5fX2FwcGx5U3BsaWNlcyhzcGxpY2VzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9fbGFzdEl0ZW1zID0gbmV3SXRlbXM7CiAgICAgICAgICAgIHRoaXMuX19sYXN0TXVsdGkgPSBtdWx0aTsKICAgICAgICAgIH0gZWxzZSBpZiAoaXRlbXNJbmZvLnBhdGggPT0gYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnaXRlbXMnLCB0aGlzKX0uc3BsaWNlc2ApIHsKICAgICAgICAgICAgLy8gQ2FzZSAyIC0gZ290IHNwZWNpZmljIHNwbGljZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBhcnJheSBtdXRhdGlvbjoKICAgICAgICAgICAgLy8gZGVzZWxlY3QgYW55IHJlbW92ZWQgaXRlbXMgYW5kIGFkanVzdCBzZWxlY3RlZCBpbmRpY2VzCiAgICAgICAgICAgIHRoaXMuX19hcHBseVNwbGljZXMoaXRlbXNJbmZvLnZhbHVlLmluZGV4U3BsaWNlcyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBDYXNlIDMgLSBhbiBhcnJheSBlbGVtZW50IHdhcyBjaGFuZ2VkLCBzbyBkZXNlbGVjdCB0aGUgcHJldmlvdXMKICAgICAgICAgICAgLy8gaXRlbSBmb3IgdGhhdCBpbmRleCBpZiBpdCB3YXMgcHJldmlvdXNseSBzZWxlY3RlZAogICAgICAgICAgICBsZXQgcGFydCA9IHBhdGguc2xpY2UoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnaXRlbXMnLCB0aGlzKX0uYC5sZW5ndGgpOwogICAgICAgICAgICBsZXQgaWR4ID0gcGFyc2VJbnQocGFydCwgMTApOwogICAgICAgICAgICBpZiAoKHBhcnQuaW5kZXhPZignLicpIDwgMCkgJiYgcGFydCA9PSBpZHgpIHsKICAgICAgICAgICAgICB0aGlzLl9fZGVzZWxlY3RDaGFuZ2VkSWR4KGlkeCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIF9fYXBwbHlTcGxpY2VzKHNwbGljZXMpIHsKICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX19zZWxlY3RlZE1hcDsKICAgICAgICAgIC8vIEFkanVzdCBzZWxlY3RlZCBpbmRpY2VzIGFuZCBtYXJrIHJlbW92YWxzCiAgICAgICAgICBmb3IgKGxldCBpPTA7IGk8c3BsaWNlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBsZXQgcyA9IHNwbGljZXNbaV07CiAgICAgICAgICAgIHNlbGVjdGVkLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICAgIGlmIChpZHggPCBzLmluZGV4KSA7IGVsc2UgaWYgKGlkeCA+PSBzLmluZGV4ICsgcy5yZW1vdmVkLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy8gYWRqdXN0IGluZGV4CiAgICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQoaXRlbSwgaWR4ICsgcy5hZGRlZENvdW50IC0gcy5yZW1vdmVkLmxlbmd0aCk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBpbmRleAogICAgICAgICAgICAgICAgc2VsZWN0ZWQuc2V0KGl0ZW0sIC0xKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBmb3IgKGxldCBqPTA7IGo8cy5hZGRlZENvdW50OyBqKyspIHsKICAgICAgICAgICAgICBsZXQgaWR4ID0gcy5pbmRleCArIGo7CiAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkLmhhcyh0aGlzLml0ZW1zW2lkeF0pKSB7CiAgICAgICAgICAgICAgICBzZWxlY3RlZC5zZXQodGhpcy5pdGVtc1tpZHhdLCBpZHgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy8gVXBkYXRlIGxpbmtlZCBwYXRocwogICAgICAgICAgdGhpcy5fX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgICAvLyBSZW1vdmUgc2VsZWN0ZWQgaXRlbXMgdGhhdCB3ZXJlIHJlbW92ZWQgZnJvbSB0aGUgaXRlbXMgYXJyYXkKICAgICAgICAgIGxldCBzaWR4ID0gMDsKICAgICAgICAgIHNlbGVjdGVkLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICBpZiAoaWR4IDwgMCkgewogICAgICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNwbGljZShKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdzZWxlY3RlZCcsIHRoaXMpLCBzaWR4LCAxKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgc2VsZWN0ZWQuZGVsZXRlKGl0ZW0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHNpZHgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBfX3VwZGF0ZUxpbmtzKCkgewogICAgICAgICAgdGhpcy5fX2RhdGFMaW5rZWRQYXRocyA9IHt9OwogICAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgICAgbGV0IHNpZHggPSAwOwogICAgICAgICAgICB0aGlzLl9fc2VsZWN0ZWRNYXAuZm9yRWFjaChpZHggPT4gewogICAgICAgICAgICAgIGlmIChpZHggPj0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoCiAgICAgICAgICAgICAgICAgICAgYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnaXRlbXMnLCB0aGlzKX0uJHtpZHh9YCwKICAgICAgICAgICAgICAgICAgICBgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdzZWxlY3RlZCcsIHRoaXMpfS4ke3NpZHgrK31gKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goaWR4ID0+IHsKICAgICAgICAgICAgICB0aGlzLmxpbmtQYXRocygKICAgICAgICAgICAgICAgICAgSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnc2VsZWN0ZWQnLCB0aGlzKSwKICAgICAgICAgICAgICAgICAgYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnaXRlbXMnLCB0aGlzKX0uJHtpZHh9YCk7CiAgICAgICAgICAgICAgdGhpcy5saW5rUGF0aHMoCiAgICAgICAgICAgICAgICAgIEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3NlbGVjdGVkSXRlbScsIHRoaXMpLAogICAgICAgICAgICAgICAgICBgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdpdGVtcycsIHRoaXMpfS4ke2lkeH1gKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGNsZWFyU2VsZWN0aW9uKCkgewogICAgICAgICAgLy8gVW5iaW5kIHByZXZpb3VzIHNlbGVjdGlvbgogICAgICAgICAgdGhpcy5fX2RhdGFMaW5rZWRQYXRocyA9IHt9OwogICAgICAgICAgLy8gVGhlIHNlbGVjdGVkIG1hcCBzdG9yZXMgMyBwaWVjZXMgb2YgaW5mb3JtYXRpb246CiAgICAgICAgICAvLyBrZXk6IGl0ZW1zIGFycmF5IG9iamVjdAogICAgICAgICAgLy8gdmFsdWU6IGl0ZW1zIGFycmF5IGluZGV4CiAgICAgICAgICAvLyBvcmRlcjogc2VsZWN0ZWQgYXJyYXkgaW5kZXgKICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgIC8vIEluaXRpYWxpemUgc2VsZWN0aW9uCiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5tdWx0aSA/IFtdIDogbnVsbDsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgaXRlbSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gdGVzdAogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgdGhlIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICAgKi8KICAgICAgICBpc1NlbGVjdGVkKGl0ZW0pIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9fc2VsZWN0ZWRNYXAuaGFzKGl0ZW0pOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBpdGVtIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHRlc3QKICAgICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAgICovCiAgICAgICAgaXNJbmRleFNlbGVjdGVkKGlkeCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2lkeF0pOwogICAgICAgIH0KCiAgICAgICAgX19kZXNlbGVjdENoYW5nZWRJZHgoaWR4KSB7CiAgICAgICAgICBsZXQgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICBpZiAoc2lkeCA+PSAwKSB7CiAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmZvckVhY2goKGlkeCwgaXRlbSkgPT4gewogICAgICAgICAgICAgIGlmIChzaWR4ID09IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5kZXNlbGVjdChpdGVtKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCkgewogICAgICAgICAgbGV0IHNlbGVjdGVkID0gdGhpcy5fX2RhdGFMaW5rZWRQYXRoc1tgJHtKU0NvbXBpbGVyX3JlbmFtZVByb3BlcnR5KCdpdGVtcycsIHRoaXMpfS4ke2lkeH1gXTsKICAgICAgICAgIGlmIChzZWxlY3RlZCkgewogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQoc2VsZWN0ZWQuc2xpY2UoYCR7SlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnc2VsZWN0ZWQnLCB0aGlzKX0uYC5sZW5ndGgpLCAxMCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0gaWYgaXQgaXMgYWxyZWFkeSBzZWxlY3RlZC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBJdGVtIGZyb20gYGl0ZW1zYCBhcnJheSB0byBkZXNlbGVjdAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgZGVzZWxlY3QoaXRlbSkgewogICAgICAgICAgbGV0IGlkeCA9IHRoaXMuX19zZWxlY3RlZE1hcC5nZXQoaXRlbSk7CiAgICAgICAgICBpZiAoaWR4ID49IDApIHsKICAgICAgICAgICAgdGhpcy5fX3NlbGVjdGVkTWFwLmRlbGV0ZShpdGVtKTsKICAgICAgICAgICAgbGV0IHNpZHg7CiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgICAgc2lkeCA9IHRoaXMuX19zZWxlY3RlZEluZGV4Rm9ySXRlbUluZGV4KGlkeCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgICAgdGhpcy5zcGxpY2UoSlNDb21waWxlcl9yZW5hbWVQcm9wZXJ0eSgnc2VsZWN0ZWQnLCB0aGlzKSwgc2lkeCwgMSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRJdGVtID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZWxlY3RzIHRoZSBnaXZlbiBpbmRleCBpZiBpdCBpcyBhbHJlYWR5IHNlbGVjdGVkLgogICAgICAgICAqCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBJbmRleCBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gZGVzZWxlY3QKICAgICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgICAqLwogICAgICAgIGRlc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgICB0aGlzLmRlc2VsZWN0KHRoaXMuaXRlbXNbaWR4XSk7CiAgICAgICAgfQoKICAgICAgICAvKioKICAgICAgICAgKiBTZWxlY3RzIHRoZSBnaXZlbiBpdGVtLiAgV2hlbiBgdG9nZ2xlYCBpcyB0cnVlLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseQogICAgICAgICAqIGRlc2VsZWN0IHRoZSBpdGVtIGlmIGFscmVhZHkgc2VsZWN0ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICAgKiBAcGFyYW0geyp9IGl0ZW0gSXRlbSBmcm9tIGBpdGVtc2AgYXJyYXkgdG8gc2VsZWN0CiAgICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICAgKi8KICAgICAgICBzZWxlY3QoaXRlbSkgewogICAgICAgICAgdGhpcy5zZWxlY3RJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICAgIH0KCiAgICAgICAgLyoqCiAgICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gaW5kZXguICBXaGVuIGB0b2dnbGVgIGlzIHRydWUsIHRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5CiAgICAgICAgICogZGVzZWxlY3QgdGhlIGl0ZW0gaWYgYWxyZWFkeSBzZWxlY3RlZC4KICAgICAgICAgKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggSW5kZXggZnJvbSBgaXRlbXNgIGFycmF5IHRvIHNlbGVjdAogICAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAgICovCiAgICAgICAgc2VsZWN0SW5kZXgoaWR4KSB7CiAgICAgICAgICBsZXQgaXRlbSA9IHRoaXMuaXRlbXNbaWR4XTsKICAgICAgICAgIGlmICghdGhpcy5pc1NlbGVjdGVkKGl0ZW0pKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aSkgewogICAgICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5jbGVhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX19zZWxlY3RlZE1hcC5zZXQoaXRlbSwgaWR4KTsKICAgICAgICAgICAgdGhpcy5fX3VwZGF0ZUxpbmtzKCk7CiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICAgICAgdGhpcy5wdXNoKEpTQ29tcGlsZXJfcmVuYW1lUHJvcGVydHkoJ3NlbGVjdGVkJywgdGhpcyksIGl0ZW0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLnNlbGVjdGVkSXRlbSA9IGl0ZW07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50b2dnbGUpIHsKICAgICAgICAgICAgdGhpcy5kZXNlbGVjdEluZGV4KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfQoKICAgICAgcmV0dXJuIEFycmF5U2VsZWN0b3JNaXhpbjsKCiAgICB9KTsKCiAgICAvKioKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQGV4dGVuZHMge1BvbHltZXJFbGVtZW50fQogICAgICogQGltcGxlbWVudHMge1BvbHltZXJfQXJyYXlTZWxlY3Rvck1peGlufQogICAgICogQHByaXZhdGUKICAgICAqLwogICAgbGV0IGJhc2VBcnJheVNlbGVjdG9yID0gQXJyYXlTZWxlY3Rvck1peGluKFBvbHltZXJFbGVtZW50KTsKCiAgICAvKioKICAgICAqIEVsZW1lbnQgaW1wbGVtZW50aW5nIHRoZSBgQXJyYXlTZWxlY3RvcmAgbWl4aW4sIHdoaWNoIHJlY29yZHMKICAgICAqIGR5bmFtaWMgYXNzb2NpYXRpb25zIGJldHdlZW4gaXRlbSBwYXRocyBpbiBhIG1hc3RlciBgaXRlbXNgIGFycmF5IGFuZCBhCiAgICAgKiBgc2VsZWN0ZWRgIGFycmF5IHN1Y2ggdGhhdCBwYXRoIGNoYW5nZXMgdG8gdGhlIG1hc3RlciBhcnJheSAoYXQgdGhlIGhvc3QpCiAgICAgKiBlbGVtZW50IG9yIGVsc2V3aGVyZSB2aWEgZGF0YS1iaW5kaW5nKSBhcmUgY29ycmVjdGx5IHByb3BhZ2F0ZWQgdG8gaXRlbXMKICAgICAqIGluIHRoZSBzZWxlY3RlZCBhcnJheSBhbmQgdmljZS12ZXJzYS4KICAgICAqCiAgICAgKiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSBhY2NlcHRzIGFuIGFycmF5IG9mIHVzZXIgZGF0YSwgYW5kIHZpYSB0aGUKICAgICAqIGBzZWxlY3QoaXRlbSlgIGFuZCBgZGVzZWxlY3QoaXRlbSlgIEFQSSwgdXBkYXRlcyB0aGUgYHNlbGVjdGVkYCBwcm9wZXJ0eQogICAgICogd2hpY2ggbWF5IGJlIGJvdW5kIHRvIG90aGVyIHBhcnRzIG9mIHRoZSBhcHBsaWNhdGlvbiwgYW5kIGFueSBjaGFuZ2VzIHRvCiAgICAgKiBzdWItZmllbGRzIG9mIGBzZWxlY3RlZGAgaXRlbShzKSB3aWxsIGJlIGtlcHQgaW4gc3luYyB3aXRoIGl0ZW1zIGluIHRoZQogICAgICogYGl0ZW1zYCBhcnJheS4gIFdoZW4gYG11bHRpYCBpcyBmYWxzZSwgYHNlbGVjdGVkYCBpcyBhIHByb3BlcnR5CiAgICAgKiByZXByZXNlbnRpbmcgdGhlIGxhc3Qgc2VsZWN0ZWQgaXRlbS4gIFdoZW4gYG11bHRpYCBpcyB0cnVlLCBgc2VsZWN0ZWRgCiAgICAgKiBpcyBhbiBhcnJheSBvZiBtdWx0aXBseSBzZWxlY3RlZCBpdGVtcy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiBpbXBvcnQge1BvbHltZXJFbGVtZW50fSBmcm9tICdAcG9seW1lci9wb2x5bWVyJzsKICAgICAqIGltcG9ydCAnQHBvbHltZXIvcG9seW1lci9saWIvZWxlbWVudHMvYXJyYXktc2VsZWN0b3IuanMnOwogICAgICoKICAgICAqIGNsYXNzIEVtcGxveWVlTGlzdCBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgICAqICAgc3RhdGljIGdldCBfdGVtcGxhdGUoKSB7CiAgICAgKiAgICAgcmV0dXJuIGh0bWxgCiAgICAgKiAgICAgICAgIDxkaXY+IEVtcGxveWVlIGxpc3Q6IDwvZGl2PgogICAgICogICAgICAgICA8ZG9tLXJlcGVhdCBpZD0iZW1wbG95ZWVMaXN0IiBpdGVtcz0ie3tlbXBsb3llZXN9fSI+CiAgICAgKiAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICogICAgICAgICAgICAgPGRpdj5GaXJzdCBuYW1lOiA8c3Bhbj57e2l0ZW0uZmlyc3R9fTwvc3Bhbj48L2Rpdj4KICAgICAqICAgICAgICAgICAgICAgPGRpdj5MYXN0IG5hbWU6IDxzcGFuPnt7aXRlbS5sYXN0fX08L3NwYW4+PC9kaXY+CiAgICAgKiAgICAgICAgICAgICAgIDxidXR0b24gb24tY2xpY2s9InRvZ2dsZVNlbGVjdGlvbiI+U2VsZWN0PC9idXR0b24+CiAgICAgKiAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAqICAgICAgICAgPC9kb20tcmVwZWF0PgogICAgICoKICAgICAqICAgICAgICAgPGFycmF5LXNlbGVjdG9yIGlkPSJzZWxlY3RvciIKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zPSJ7e2VtcGxveWVlc319IgogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWQ9Int7c2VsZWN0ZWR9fSIKICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpIHRvZ2dsZT48L2FycmF5LXNlbGVjdG9yPgogICAgICoKICAgICAqICAgICAgICAgPGRpdj4gU2VsZWN0ZWQgZW1wbG95ZWVzOiA8L2Rpdj4KICAgICAqICAgICAgICAgPGRvbS1yZXBlYXQgaXRlbXM9Int7c2VsZWN0ZWR9fSI+CiAgICAgKiAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICogICAgICAgICAgICAgPGRpdj5GaXJzdCBuYW1lOiA8c3Bhbj57e2l0ZW0uZmlyc3R9fTwvc3Bhbj48L2Rpdj4KICAgICAqICAgICAgICAgICAgIDxkaXY+TGFzdCBuYW1lOiA8c3Bhbj57e2l0ZW0ubGFzdH19PC9zcGFuPjwvZGl2PgogICAgICogICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgKiAgICAgICAgIDwvZG9tLXJlcGVhdD5gOwogICAgICogICB9CiAgICAgKiAgIHN0YXRpYyBnZXQgaXMoKSB7IHJldHVybiAnZW1wbG95ZWUtbGlzdCc7IH0KICAgICAqICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICogICAgIHJldHVybiB7CiAgICAgKiAgICAgICBlbXBsb3llZXM6IHsKICAgICAqICAgICAgICAgdmFsdWUoKSB7CiAgICAgKiAgICAgICAgICAgcmV0dXJuIFsKICAgICAqICAgICAgICAgICAgIHtmaXJzdDogJ0JvYicsIGxhc3Q6ICdTbWl0aCd9LAogICAgICogICAgICAgICAgICAge2ZpcnN0OiAnU2FsbHknLCBsYXN0OiAnSm9obnNvbid9LAogICAgICogICAgICAgICAgICAgLi4uCiAgICAgKiAgICAgICAgICAgXTsKICAgICAqICAgICAgICAgfQogICAgICogICAgICAgfQogICAgICogICAgIH07CiAgICAgKiAgIH0KICAgICAqICAgdG9nZ2xlU2VsZWN0aW9uKGUpIHsKICAgICAqICAgICBjb25zdCBpdGVtID0gdGhpcy4kLmVtcGxveWVlTGlzdC5pdGVtRm9yRWxlbWVudChlLnRhcmdldCk7CiAgICAgKiAgICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdChpdGVtKTsKICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogQHBvbHltZXIKICAgICAqIEBjdXN0b21FbGVtZW50CiAgICAgKiBAZXh0ZW5kcyB7YmFzZUFycmF5U2VsZWN0b3J9CiAgICAgKiBAYXBwbGllc01peGluIEFycmF5U2VsZWN0b3JNaXhpbgogICAgICogQHN1bW1hcnkgQ3VzdG9tIGVsZW1lbnQgdGhhdCBsaW5rcyBwYXRocyBiZXR3ZWVuIGFuIGlucHV0IGBpdGVtc2AgYXJyYXkgYW5kCiAgICAgKiAgIGFuIG91dHB1dCBgc2VsZWN0ZWRgIGl0ZW0gb3IgYXJyYXkgYmFzZWQgb24gY2FsbHMgdG8gaXRzIHNlbGVjdGlvbiBBUEkuCiAgICAgKi8KICAgIGNsYXNzIEFycmF5U2VsZWN0b3IgZXh0ZW5kcyBiYXNlQXJyYXlTZWxlY3RvciB7CiAgICAgIC8vIE5vdCBuZWVkZWQgdG8gZmluZCB0ZW1wbGF0ZTsgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgYW5hbHl6ZXIKICAgICAgLy8gY2FuIGZpbmQgdGhlIHRhZyBuYW1lIGZyb20gY3VzdG9tRWxlbWVudHMuZGVmaW5lIGNhbGwKICAgICAgc3RhdGljIGdldCBpcygpIHsgcmV0dXJuICdhcnJheS1zZWxlY3Rvcic7IH0KICAgICAgc3RhdGljIGdldCB0ZW1wbGF0ZSgpIHsgcmV0dXJuIG51bGw7IH0KICAgIH0KICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShBcnJheVNlbGVjdG9yLmlzLCBBcnJheVNlbGVjdG9yKTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGNvbnN0IGN1c3RvbVN0eWxlSW50ZXJmYWNlID0gbmV3IEN1c3RvbVN0eWxlSW50ZXJmYWNlKCk7CgogICAgaWYgKCF3aW5kb3cuU2hhZHlDU1MpIHsKICAgICAgd2luZG93LlNoYWR5Q1NTID0gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBlbGVtZW50RXh0ZW5kcwogICAgICAgICAqLwogICAgICAgIHByZXBhcmVUZW1wbGF0ZSh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRFeHRlbmRzKSB7fSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0geyFIVE1MVGVtcGxhdGVFbGVtZW50fSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBlbGVtZW50TmFtZQogICAgICAgICAqLwogICAgICAgIHByZXBhcmVUZW1wbGF0ZURvbSh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUpIHt9LCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7IUhUTUxUZW1wbGF0ZUVsZW1lbnR9IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGVsZW1lbnROYW1lCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBlbGVtZW50RXh0ZW5kcwogICAgICAgICAqLwogICAgICAgIHByZXBhcmVUZW1wbGF0ZVN0eWxlcyh0ZW1wbGF0ZSwgZWxlbWVudE5hbWUsIGVsZW1lbnRFeHRlbmRzKSB7fSwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFycwoKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0ge09iamVjdD19IHByb3BlcnRpZXMKICAgICAgICAgKi8KICAgICAgICBzdHlsZVN1YnRyZWUoZWxlbWVudCwgcHJvcGVydGllcykgewogICAgICAgICAgY3VzdG9tU3R5bGVJbnRlcmZhY2UucHJvY2Vzc1N0eWxlcygpOwogICAgICAgICAgdXBkYXRlTmF0aXZlUHJvcGVydGllcyhlbGVtZW50LCBwcm9wZXJ0aWVzKTsKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQKICAgICAgICAgKi8KICAgICAgICBzdHlsZUVsZW1lbnQoZWxlbWVudCkgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgICBjdXN0b21TdHlsZUludGVyZmFjZS5wcm9jZXNzU3R5bGVzKCk7CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHtPYmplY3Q9fSBwcm9wZXJ0aWVzCiAgICAgICAgICovCiAgICAgICAgc3R5bGVEb2N1bWVudChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICBjdXN0b21TdHlsZUludGVyZmFjZS5wcm9jZXNzU3R5bGVzKCk7CiAgICAgICAgICB1cGRhdGVOYXRpdmVQcm9wZXJ0aWVzKGRvY3VtZW50LmJvZHksIHByb3BlcnRpZXMpOwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wZXJ0eQogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBnZXRDb21wdXRlZFN0eWxlVmFsdWUoZWxlbWVudCwgcHJvcGVydHkpIHsKICAgICAgICAgIHJldHVybiBnZXRDb21wdXRlZFN0eWxlVmFsdWUoZWxlbWVudCwgcHJvcGVydHkpOwogICAgICAgIH0sCgogICAgICAgIGZsdXNoQ3VzdG9tU3R5bGVzKCkge30sCiAgICAgICAgbmF0aXZlQ3NzOiBuYXRpdmVDc3NWYXJpYWJsZXMsCiAgICAgICAgbmF0aXZlU2hhZG93OiBuYXRpdmVTaGFkb3csCiAgICAgICAgY3NzQnVpbGQ6IGNzc0J1aWxkLAogICAgICAgIGRpc2FibGVSdW50aW1lOiBkaXNhYmxlUnVudGltZSwKICAgICAgfTsKICAgIH0KCiAgICB3aW5kb3cuU2hhZHlDU1MuQ3VzdG9tU3R5bGVJbnRlcmZhY2UgPSBjdXN0b21TdHlsZUludGVyZmFjZTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGNvbnN0IGF0dHIgPSAnaW5jbHVkZSc7CgogICAgY29uc3QgQ3VzdG9tU3R5bGVJbnRlcmZhY2UkMSA9IHdpbmRvdy5TaGFkeUNTUy5DdXN0b21TdHlsZUludGVyZmFjZTsKCiAgICAvKioKICAgICAqIEN1c3RvbSBlbGVtZW50IGZvciBkZWZpbmluZyBzdHlsZXMgaW4gdGhlIG1haW4gZG9jdW1lbnQgdGhhdCBjYW4gdGFrZQogICAgICogYWR2YW50YWdlIG9mIFtzaGFkeSBET01dKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzKSBzaGltcwogICAgICogZm9yIHN0eWxlIGVuY2Fwc3VsYXRpb24sIGN1c3RvbSBwcm9wZXJ0aWVzLCBhbmQgY3VzdG9tIG1peGlucy4KICAgICAqCiAgICAgKiAtIERvY3VtZW50IHN0eWxlcyBkZWZpbmVkIGluIGEgYDxjdXN0b20tc3R5bGU+YCBhcmUgc2hpbW1lZCB0byBlbnN1cmUgdGhleQogICAgICogICBkbyBub3QgbGVhayBpbnRvIGxvY2FsIERPTSB3aGVuIHJ1bm5pbmcgb24gYnJvd3NlcnMgd2l0aG91dCBuYXRpdmUKICAgICAqICAgU2hhZG93IERPTS4KICAgICAqIC0gQ3VzdG9tIHByb3BlcnRpZXMgY2FuIGJlIGRlZmluZWQgaW4gYSBgPGN1c3RvbS1zdHlsZT5gLiBVc2UgdGhlIGBodG1sYCBzZWxlY3RvcgogICAgICogICB0byBkZWZpbmUgY3VzdG9tIHByb3BlcnRpZXMgdGhhdCBhcHBseSB0byBhbGwgY3VzdG9tIGVsZW1lbnRzLgogICAgICogLSBDdXN0b20gbWl4aW5zIGNhbiBiZSBkZWZpbmVkIGluIGEgYDxjdXN0b20tc3R5bGU+YCwgaWYgeW91IGltcG9ydCB0aGUgb3B0aW9uYWwKICAgICAqICAgW2FwcGx5IHNoaW1dKGh0dHBzOi8vZ2l0aHViLmNvbS93ZWJjb21wb25lbnRzL3NoYWR5Y3NzI2Fib3V0LWFwcGx5c2hpbSkKICAgICAqICAgKGBzaGFkeWNzcy9hcHBseS1zaGltLmh0bWxgKS4KICAgICAqCiAgICAgKiBUbyB1c2U6CiAgICAgKgogICAgICogLSBJbXBvcnQgYGN1c3RvbS1zdHlsZS5odG1sYC4KICAgICAqIC0gUGxhY2UgYSBgPGN1c3RvbS1zdHlsZT5gIGVsZW1lbnQgaW4gdGhlIG1haW4gZG9jdW1lbnQsIHdyYXBwaW5nIGFuIGlubGluZSBgPHN0eWxlPmAgdGFnIHRoYXQKICAgICAqICAgY29udGFpbnMgdGhlIENTUyBydWxlcyB5b3Ugd2FudCB0byBzaGltLgogICAgICoKICAgICAqIEZvciBleGFtcGxlOgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDwhLS0gaW1wb3J0IGFwcGx5IHNoaW0tLW9ubHkgcmVxdWlyZWQgaWYgdXNpbmcgbWl4aW5zIC0tPgogICAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvc2hhZHljc3MvYXBwbHktc2hpbS5odG1sIj4KICAgICAqIDwhLS0gaW1wb3J0IGN1c3RvbS1zdHlsZSBlbGVtZW50IC0tPgogICAgICogPGxpbmsgcmVsPSJpbXBvcnQiIGhyZWY9ImJvd2VyX2NvbXBvbmVudHMvcG9seW1lci9saWIvZWxlbWVudHMvY3VzdG9tLXN0eWxlLmh0bWwiPgogICAgICoKICAgICAqIDxjdXN0b20tc3R5bGU+CiAgICAgKiAgIDxzdHlsZT4KICAgICAqICAgICBodG1sIHsKICAgICAqICAgICAgIC0tY3VzdG9tLWNvbG9yOiBibHVlOwogICAgICogICAgICAgLS1jdXN0b20tbWl4aW46IHsKICAgICAqICAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgKiAgICAgICAgIGNvbG9yOiByZWQ7CiAgICAgKiAgICAgICB9OwogICAgICogICAgIH0KICAgICAqICAgPC9zdHlsZT4KICAgICAqIDwvY3VzdG9tLXN0eWxlPgogICAgICogYGBgCiAgICAgKgogICAgICogQGN1c3RvbUVsZW1lbnQKICAgICAqIEBleHRlbmRzIEhUTUxFbGVtZW50CiAgICAgKiBAc3VtbWFyeSBDdXN0b20gZWxlbWVudCBmb3IgZGVmaW5pbmcgc3R5bGVzIGluIHRoZSBtYWluIGRvY3VtZW50IHRoYXQgY2FuCiAgICAgKiAgIHRha2UgYWR2YW50YWdlIG9mIFBvbHltZXIncyBzdHlsZSBzY29waW5nIGFuZCBjdXN0b20gcHJvcGVydGllcyBzaGltcy4KICAgICAqLwogICAgY2xhc3MgQ3VzdG9tU3R5bGUgZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgdGhpcy5fc3R5bGUgPSBudWxsOwogICAgICAgIEN1c3RvbVN0eWxlSW50ZXJmYWNlJDEuYWRkQ3VzdG9tU3R5bGUodGhpcyk7CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGxpZ2h0LURPTSBgPHN0eWxlPmAgY2hpbGQgdGhpcyBlbGVtZW50IHdyYXBzLiAgVXBvbiBmaXJzdAogICAgICAgKiBjYWxsIGFueSBzdHlsZSBtb2R1bGVzIHJlZmVyZW5jZWQgdmlhIHRoZSBgaW5jbHVkZWAgYXR0cmlidXRlIHdpbGwgYmUKICAgICAgICogY29uY2F0ZW5hdGVkIHRvIHRoaXMgZWxlbWVudCdzIGA8c3R5bGU+YC4KICAgICAgICoKICAgICAgICogQGV4cG9ydAogICAgICAgKiBAcmV0dXJuIHtIVE1MU3R5bGVFbGVtZW50fSBUaGlzIGVsZW1lbnQncyBsaWdodC1ET00gYDxzdHlsZT5gCiAgICAgICAqLwogICAgICBnZXRTdHlsZSgpIHsKICAgICAgICBpZiAodGhpcy5fc3R5bGUpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9zdHlsZTsKICAgICAgICB9CiAgICAgICAgY29uc3Qgc3R5bGUgPSAvKiogQHR5cGUge0hUTUxTdHlsZUVsZW1lbnR9ICovKHRoaXMucXVlcnlTZWxlY3Rvcignc3R5bGUnKSk7CiAgICAgICAgaWYgKCFzdHlsZSkgewogICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3N0eWxlID0gc3R5bGU7CiAgICAgICAgY29uc3QgaW5jbHVkZSA9IHN0eWxlLmdldEF0dHJpYnV0ZShhdHRyKTsKICAgICAgICBpZiAoaW5jbHVkZSkgewogICAgICAgICAgc3R5bGUucmVtb3ZlQXR0cmlidXRlKGF0dHIpOwogICAgICAgICAgLyoqIEBzdXBwcmVzcyB7ZGVwcmVjYXRlZH0gKi8KICAgICAgICAgIHN0eWxlLnRleHRDb250ZW50ID0gY3NzRnJvbU1vZHVsZXMoaW5jbHVkZSkgKyBzdHlsZS50ZXh0Q29udGVudDsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICBIVE1MIEltcG9ydHMgc3R5bGluZyB0aGUgbWFpbiBkb2N1bWVudCBhcmUgZGVwcmVjYXRlZCBpbiBDaHJvbWUKICAgICAgICBodHRwczovL2NyYnVnLmNvbS81MjM5NTIKCiAgICAgICAgSWYgdGhpcyBlbGVtZW50IGlzIG5vdCBpbiB0aGUgbWFpbiBkb2N1bWVudCwgdGhlbiBpdCBtdXN0IGJlIGluIGFuIEhUTUwgSW1wb3J0IGRvY3VtZW50LgogICAgICAgIEluIHRoYXQgY2FzZSwgbW92ZSB0aGUgY3VzdG9tIHN0eWxlIHRvIHRoZSBtYWluIGRvY3VtZW50LgoKICAgICAgICBUaGUgb3JkZXJpbmcgb2YgYDxjdXN0b20tc3R5bGU+YCBzaG91bGQgc3RheSB0aGUgc2FtZSBhcyB3aGVuIGxvYWRlZCBieSBIVE1MIEltcG9ydHMsIGJ1dCB0aGVyZSBtYXkgYmUgb2RkCiAgICAgICAgY2FzZXMgb2Ygb3JkZXJpbmcgdy5yLnQgdGhlIG1haW4gZG9jdW1lbnQgc3R5bGVzLgogICAgICAgICovCiAgICAgICAgaWYgKHRoaXMub3duZXJEb2N1bWVudCAhPT0gd2luZG93LmRvY3VtZW50KSB7CiAgICAgICAgICB3aW5kb3cuZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlOwogICAgICB9CiAgICB9CgogICAgd2luZG93LmN1c3RvbUVsZW1lbnRzLmRlZmluZSgnY3VzdG9tLXN0eWxlJywgQ3VzdG9tU3R5bGUpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgbGV0IG11dGFibGVQcm9wZXJ0eUNoYW5nZSQxOwogICAgLyoqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9ICovCiAgICAoKCkgPT4gewogICAgICBtdXRhYmxlUHJvcGVydHlDaGFuZ2UkMSA9IE11dGFibGVEYXRhLl9tdXRhYmxlUHJvcGVydHlDaGFuZ2U7CiAgICB9KSgpOwoKICAgIC8qKgogICAgICogTGVnYWN5IGVsZW1lbnQgYmVoYXZpb3IgdG8gYWRkIHRoZSBvcHRpb25hbCBhYmlsaXR5IHRvIHNraXAgc3RyaWN0CiAgICAgKiBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIChhbHdheXMgY29uc2lkZXIgdGhlbSB0byBiZQogICAgICogImRpcnR5IikgYnkgc2V0dGluZyBhIGBtdXRhYmxlLWRhdGFgIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IGluc3RhbmNlLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgcGVyZm9ybXMgc3RyaWN0IGRpcnR5IGNoZWNraW5nIG9uCiAgICAgKiBvYmplY3RzLCB3aGljaCBtZWFucyB0aGF0IGFueSBkZWVwIG1vZGlmaWNhdGlvbnMgdG8gYW4gb2JqZWN0IG9yIGFycmF5IHdpbGwKICAgICAqIG5vdCBiZSBwcm9wYWdhdGVkIHVubGVzcyAiaW1tdXRhYmxlIiBkYXRhIHBhdHRlcm5zIGFyZSB1c2VkIChpLmUuIGFsbCBvYmplY3QKICAgICAqIHJlZmVyZW5jZXMgZnJvbSB0aGUgcm9vdCB0byB0aGUgbXV0YXRpb24gd2VyZSBjaGFuZ2VkKS4KICAgICAqCiAgICAgKiBQb2x5bWVyIGFsc28gcHJvdmlkZXMgYSBwcm9wcmlldGFyeSBkYXRhIG11dGF0aW9uIGFuZCBwYXRoIG5vdGlmaWNhdGlvbiBBUEkKICAgICAqIChlLmcuIGBub3RpZnlQYXRoYCwgYHNldGAsIGFuZCBhcnJheSBtdXRhdGlvbiBBUEkncykgdGhhdCBhbGxvdyBlZmZpY2llbnQKICAgICAqIG11dGF0aW9uIGFuZCBub3RpZmljYXRpb24gb2YgZGVlcCBjaGFuZ2VzIGluIGFuIG9iamVjdCBncmFwaCB0byBhbGwgZWxlbWVudHMKICAgICAqIGJvdW5kIHRvIHRoZSBzYW1lIG9iamVjdCBncmFwaC4KICAgICAqCiAgICAgKiBJbiBjYXNlcyB3aGVyZSBuZWl0aGVyIGltbXV0YWJsZSBwYXR0ZXJucyBub3IgdGhlIGRhdGEgbXV0YXRpb24gQVBJIGNhbiBiZQogICAgICogdXNlZCwgYXBwbHlpbmcgdGhpcyBtaXhpbiB3aWxsIGFsbG93IFBvbHltZXIgdG8gc2tpcCBkaXJ0eSBjaGVja2luZyBmb3IKICAgICAqIG9iamVjdHMgYW5kIGFycmF5cyAoYWx3YXlzIGNvbnNpZGVyIHRoZW0gdG8gYmUgImRpcnR5IikuICBUaGlzIGFsbG93cyBhCiAgICAgKiB1c2VyIHRvIG1ha2UgYSBkZWVwIG1vZGlmaWNhdGlvbiB0byBhIGJvdW5kIG9iamVjdCBncmFwaCwgYW5kIHRoZW4gZWl0aGVyCiAgICAgKiBzaW1wbHkgcmUtc2V0IHRoZSBvYmplY3QgKGUuZy4gYHRoaXMuaXRlbXMgPSB0aGlzLml0ZW1zYCkgb3IgY2FsbCBgbm90aWZ5UGF0aGAKICAgICAqIChlLmcuIGB0aGlzLm5vdGlmeVBhdGgoJ2l0ZW1zJylgKSB0byB1cGRhdGUgdGhlIHRyZWUuICBOb3RlIHRoYXQgYWxsCiAgICAgKiBlbGVtZW50cyB0aGF0IHdpc2ggdG8gYmUgdXBkYXRlZCBiYXNlZCBvbiBkZWVwIG11dGF0aW9ucyBtdXN0IGFwcGx5IHRoaXMKICAgICAqIG1peGluIG9yIG90aGVyd2lzZSBza2lwIHN0cmljdCBkaXJ0eSBjaGVja2luZyBmb3Igb2JqZWN0cy9hcnJheXMuCiAgICAgKiBTcGVjaWZpY2FsbHksIGFueSBlbGVtZW50cyBpbiB0aGUgYmluZGluZyB0cmVlIGJldHdlZW4gdGhlIHNvdXJjZSBvZiBhCiAgICAgKiBtdXRhdGlvbiBhbmQgdGhlIGNvbnN1bXB0aW9uIG9mIGl0IG11c3QgZW5hYmxlIHRoaXMgYmVoYXZpb3Igb3IgYXBwbHkgdGhlCiAgICAgKiBgUG9seW1lci5PcHRpb25hbE11dGFibGVEYXRhQmVoYXZpb3JgLgogICAgICoKICAgICAqIFdoaWxlIHRoaXMgYmVoYXZpb3IgYWRkcyB0aGUgYWJpbGl0eSB0byBmb3JnbyBPYmplY3QvQXJyYXkgZGlydHkgY2hlY2tpbmcsCiAgICAgKiB0aGUgYG11dGFibGVEYXRhYCBmbGFnIGRlZmF1bHRzIHRvIGZhbHNlIGFuZCBtdXN0IGJlIHNldCBvbiB0aGUgaW5zdGFuY2UuCiAgICAgKgogICAgICogTm90ZSwgdGhlIHBlcmZvcm1hbmNlIGNoYXJhY3RlcmlzdGljcyBvZiBwcm9wYWdhdGluZyBsYXJnZSBvYmplY3QgZ3JhcGhzCiAgICAgKiB3aWxsIGJlIHdvcnNlIGJ5IHJlbHlpbmcgb24gYG11dGFibGVEYXRhOiB0cnVlYCBhcyBvcHBvc2VkIHRvIHVzaW5nCiAgICAgKiBzdHJpY3QgZGlydHkgY2hlY2tpbmcgd2l0aCBpbW11dGFibGUgcGF0dGVybnMgb3IgUG9seW1lcidzIHBhdGggbm90aWZpY2F0aW9uCiAgICAgKiBBUEkuCiAgICAgKgogICAgICogQHBvbHltZXJCZWhhdmlvcgogICAgICogQHN1bW1hcnkgQmVoYXZpb3IgdG8gb3B0aW9uYWxseSBza2lwIHN0cmljdCBkaXJ0eS1jaGVja2luZyBmb3Igb2JqZWN0cyBhbmQKICAgICAqICAgYXJyYXlzCiAgICAgKi8KICAgIGNvbnN0IE9wdGlvbmFsTXV0YWJsZURhdGFCZWhhdmlvciA9IHsKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBJbnN0YW5jZS1sZXZlbCBmbGFnIGZvciBjb25maWd1cmluZyB0aGUgZGlydHktY2hlY2tpbmcgc3RyYXRlZ3kKICAgICAgICAgKiBmb3IgdGhpcyBlbGVtZW50LiAgV2hlbiB0cnVlLCBPYmplY3RzIGFuZCBBcnJheXMgd2lsbCBza2lwIGRpcnR5CiAgICAgICAgICogY2hlY2tpbmcsIG90aGVyd2lzZSBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcgd2lsbCBiZSB1c2VkLgogICAgICAgICAqLwogICAgICAgIG11dGFibGVEYXRhOiBCb29sZWFuCiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGVzIGBQb2x5bWVyLlByb3BlcnR5RWZmZWN0c2AgdG8gc2tpcCBzdHJpY3QgZXF1YWxpdHkgY2hlY2tpbmcKICAgICAgICogZm9yIE9iamVjdHMgYW5kIEFycmF5cy4KICAgICAgICoKICAgICAgICogUHVsbHMgdGhlIHZhbHVlIHRvIGRpcnR5IGNoZWNrIGFnYWluc3QgZnJvbSB0aGUgYF9fZGF0YVRlbXBgIGNhY2hlCiAgICAgICAqIChyYXRoZXIgdGhhbiB0aGUgbm9ybWFsIGBfX2RhdGFgIGNhY2hlKSBmb3IgT2JqZWN0cy4gIFNpbmNlIHRoZSB0ZW1wCiAgICAgICAqIGNhY2hlIGlzIGNsZWFyZWQgYXQgdGhlIGVuZCBvZiBhIHR1cm4sIHRoaXMgaW1wbGVtZW50YXRpb24gYWxsb3dzCiAgICAgICAqIHNpZGUtZWZmZWN0cyBvZiBkZWVwIG9iamVjdCBjaGFuZ2VzIHRvIGJlIHByb2Nlc3NlZCBieSByZS1zZXR0aW5nIHRoZQogICAgICAgKiBzYW1lIG9iamVjdCAodXNpbmcgdGhlIHRlbXAgY2FjaGUgYXMgYW4gaW4tdHVybiBiYWNrc3RvcCB0byBwcmV2ZW50CiAgICAgICAqIGN5Y2xlcyBkdWUgdG8gMi13YXkgbm90aWZpY2F0aW9uKS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHByb3BlcnR5IFByb3BlcnR5IG5hbWUKICAgICAgICogQHBhcmFtIHsqfSB2YWx1ZSBOZXcgcHJvcGVydHkgdmFsdWUKICAgICAgICogQHBhcmFtIHsqfSBvbGQgUHJldmlvdXMgcHJvcGVydHkgdmFsdWUKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB0aGUgcHJvcGVydHkgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBjaGFuZ2UKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKiBAb3ZlcnJpZGUKICAgICAgICovCiAgICAgIF9zaG91bGRQcm9wZXJ0eUNoYW5nZShwcm9wZXJ0eSwgdmFsdWUsIG9sZCkgewogICAgICAgIHJldHVybiBtdXRhYmxlUHJvcGVydHlDaGFuZ2UkMSh0aGlzLCBwcm9wZXJ0eSwgdmFsdWUsIG9sZCwgdGhpcy5tdXRhYmxlRGF0YSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvLyBiYwogICAgY29uc3QgQmFzZSA9IExlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCkucHJvdG90eXBlOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8vIENvbnRhaW5zIGFsbCBjb25uZWN0ZWQgcmVzaXphYmxlcyB0aGF0IGRvIG5vdCBoYXZlIGEgcGFyZW50LgogICAgdmFyIE9SUEhBTlMgPSBuZXcgU2V0KCk7CgogICAgLyoqCiAgICAgKiBgSXJvblJlc2l6YWJsZUJlaGF2aW9yYCBpcyBhIGJlaGF2aW9yIHRoYXQgY2FuIGJlIHVzZWQgaW4gUG9seW1lciBlbGVtZW50cyB0bwogICAgICogY29vcmRpbmF0ZSB0aGUgZmxvdyBvZiByZXNpemUgZXZlbnRzIGJldHdlZW4gInJlc2l6ZXJzIiAoZWxlbWVudHMgdGhhdAogICAgICpjb250cm9sIHRoZSBzaXplIG9yIGhpZGRlbiBzdGF0ZSBvZiB0aGVpciBjaGlsZHJlbikgYW5kICJyZXNpemFibGVzIiAoZWxlbWVudHMKICAgICAqdGhhdCBuZWVkIHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhleSBhcmUgcmVzaXplZCBvciB1bi1oaWRkZW4gYnkgdGhlaXIgcGFyZW50cwogICAgICppbiBvcmRlciB0byB0YWtlIGFjdGlvbiBvbiB0aGVpciBuZXcgbWVhc3VyZW1lbnRzKS4KICAgICAqCiAgICAgKiBFbGVtZW50cyB0aGF0IHBlcmZvcm0gbWVhc3VyZW1lbnQgc2hvdWxkIGFkZCB0aGUgYElyb25SZXNpemFibGVCZWhhdmlvcmAKICAgICAqYmVoYXZpb3IgdG8gdGhlaXIgZWxlbWVudCBkZWZpbml0aW9uIGFuZCBsaXN0ZW4gZm9yIHRoZSBgaXJvbi1yZXNpemVgIGV2ZW50IG9uCiAgICAgKnRoZW1zZWx2ZXMuIFRoaXMgZXZlbnQgd2lsbCBiZSBmaXJlZCB3aGVuIHRoZXkgYmVjb21lIHNob3dpbmcgYWZ0ZXIgaGF2aW5nCiAgICAgKmJlZW4gaGlkZGVuLCB3aGVuIHRoZXkgYXJlIHJlc2l6ZWQgZXhwbGljaXRseSBieSBhbm90aGVyIHJlc2l6YWJsZSwgb3Igd2hlbgogICAgICp0aGUgd2luZG93IGhhcyBiZWVuIHJlc2l6ZWQuCiAgICAgKgogICAgICogTm90ZSwgdGhlIGBpcm9uLXJlc2l6ZWAgZXZlbnQgaXMgbm9uLWJ1YmJsaW5nLgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgICoqLwogICAgY29uc3QgSXJvblJlc2l6YWJsZUJlaGF2aW9yID0gewogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNsb3Nlc3QgYW5jZXN0b3IgZWxlbWVudCB0aGF0IGltcGxlbWVudHMgYElyb25SZXNpemFibGVCZWhhdmlvcmAuCiAgICAgICAgICovCiAgICAgICAgX3BhcmVudFJlc2l6YWJsZTogewogICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgb2JzZXJ2ZXI6ICdfcGFyZW50UmVzaXphYmxlQ2hhbmdlZCcsCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGlzIGVsZW1lbnQgaXMgY3VycmVudGx5IG5vdGlmeWluZyBpdHMgZGVzY2VuZGFudCBlbGVtZW50cyBvZgogICAgICAgICAqIHJlc2l6ZS4KICAgICAgICAgKi8KICAgICAgICBfbm90aWZ5aW5nRGVzY2VuZGFudDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICB9CiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHsKICAgICAgICAnaXJvbi1yZXF1ZXN0LXJlc2l6ZS1ub3RpZmljYXRpb25zJzogJ19vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucycKICAgICAgfSwKCiAgICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFdlIGRvbid0IHJlYWxseSBuZWVkIHByb3BlcnR5IGVmZmVjdHMgb24gdGhlc2UsIGFuZCBhbHNvIHdlIHdhbnQgdGhlbQogICAgICAgIC8vIHRvIGJlIGNyZWF0ZWQgYmVmb3JlIHRoZSBgX3BhcmVudFJlc2l6YWJsZWAgb2JzZXJ2ZXIgZmlyZXM6CiAgICAgICAgdGhpcy5faW50ZXJlc3RlZFJlc2l6YWJsZXMgPSBbXTsKICAgICAgICB0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSA9IHRoaXMubm90aWZ5UmVzaXplLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5fYm91bmRPbkRlc2NlbmRhbnRJcm9uUmVzaXplID0gdGhpcy5fb25EZXNjZW5kYW50SXJvblJlc2l6ZS5iaW5kKHRoaXMpOwogICAgICB9LAoKICAgICAgYXR0YWNoZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zKCk7CiAgICAgIH0sCgogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFJlc2l6YWJsZSkgewogICAgICAgICAgdGhpcy5fcGFyZW50UmVzaXphYmxlLnN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yKHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBPUlBIQU5TLmRlbGV0ZSh0aGlzKTsKICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9wYXJlbnRSZXNpemFibGUgPSBudWxsOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbiBiZSBjYWxsZWQgdG8gbWFudWFsbHkgbm90aWZ5IGEgcmVzaXphYmxlIGFuZCBpdHMgZGVzY2VuZGFudAogICAgICAgKiByZXNpemFibGVzIG9mIGEgcmVzaXplIGNoYW5nZS4KICAgICAgICovCiAgICAgIG5vdGlmeVJlc2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2ludGVyZXN0ZWRSZXNpemFibGVzLmZvckVhY2goZnVuY3Rpb24ocmVzaXphYmxlKSB7CiAgICAgICAgICBpZiAodGhpcy5yZXNpemVyU2hvdWxkTm90aWZ5KHJlc2l6YWJsZSkpIHsKICAgICAgICAgICAgdGhpcy5fbm90aWZ5RGVzY2VuZGFudChyZXNpemFibGUpOwogICAgICAgICAgfQogICAgICAgIH0sIHRoaXMpOwoKICAgICAgICB0aGlzLl9maXJlUmVzaXplKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVXNlZCB0byBhc3NpZ24gdGhlIGNsb3Nlc3QgcmVzaXphYmxlIGFuY2VzdG9yIHRvIHRoaXMgcmVzaXphYmxlCiAgICAgICAqIGlmIHRoZSBhbmNlc3RvciBkZXRlY3RzIGEgcmVxdWVzdCBmb3Igbm90aWZpY2F0aW9ucy4KICAgICAgICovCiAgICAgIGFzc2lnblBhcmVudFJlc2l6YWJsZTogZnVuY3Rpb24ocGFyZW50UmVzaXphYmxlKSB7CiAgICAgICAgaWYgKHRoaXMuX3BhcmVudFJlc2l6YWJsZSkgewogICAgICAgICAgdGhpcy5fcGFyZW50UmVzaXphYmxlLnN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yKHRoaXMpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fcGFyZW50UmVzaXphYmxlID0gcGFyZW50UmVzaXphYmxlOwoKICAgICAgICBpZiAocGFyZW50UmVzaXphYmxlICYmCiAgICAgICAgICAgIHBhcmVudFJlc2l6YWJsZS5faW50ZXJlc3RlZFJlc2l6YWJsZXMuaW5kZXhPZih0aGlzKSA9PT0gLTEpIHsKICAgICAgICAgIHBhcmVudFJlc2l6YWJsZS5faW50ZXJlc3RlZFJlc2l6YWJsZXMucHVzaCh0aGlzKTsKICAgICAgICAgIHBhcmVudFJlc2l6YWJsZS5fc3Vic2NyaWJlSXJvblJlc2l6ZSh0aGlzKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVXNlZCB0byByZW1vdmUgYSByZXNpemFibGUgZGVzY2VuZGFudCBmcm9tIHRoZSBsaXN0IG9mIGRlc2NlbmRhbnRzCiAgICAgICAqIHRoYXQgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGEgcmVzaXplIGNoYW5nZS4KICAgICAgICovCiAgICAgIHN0b3BSZXNpemVOb3RpZmljYXRpb25zRm9yOiBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5pbmRleE9mKHRhcmdldCk7CgogICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICB0aGlzLl9pbnRlcmVzdGVkUmVzaXphYmxlcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVJcm9uUmVzaXplKHRhcmdldCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFN1YnNjcmliZSB0aGlzIGVsZW1lbnQgdG8gbGlzdGVuIHRvIGlyb24tcmVzaXplIGV2ZW50cyBvbiB0aGUgZ2l2ZW4gdGFyZ2V0LgogICAgICAgKgogICAgICAgKiBQcmVmZXJyZWQgb3ZlciB0YXJnZXQubGlzdGVuIGJlY2F1c2UgdGhlIHByb3BlcnR5IHJlbmFtZXIgZG9lcyBub3QKICAgICAgICogdW5kZXJzdGFuZCB0byByZW5hbWUgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBzcGVjaWZpY2FsbHkgInRoaXMiCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSB0YXJnZXQgRWxlbWVudCB0byBsaXN0ZW4gdG8gZm9yIGlyb24tcmVzaXplIGV2ZW50cy4KICAgICAgICovCiAgICAgIF9zdWJzY3JpYmVJcm9uUmVzaXplOiBmdW5jdGlvbih0YXJnZXQpIHsKICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcignaXJvbi1yZXNpemUnLCB0aGlzLl9ib3VuZE9uRGVzY2VuZGFudElyb25SZXNpemUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVuc3Vic2NyaWJlIHRoaXMgZWxlbWVudCBmcm9tIGxpc3RlbmluZyB0byB0byBpcm9uLXJlc2l6ZSBldmVudHMgb24gdGhlCiAgICAgICAqIGdpdmVuIHRhcmdldC4KICAgICAgICoKICAgICAgICogUHJlZmVycmVkIG92ZXIgdGFyZ2V0LnVubGlzdGVuIGJlY2F1c2UgdGhlIHByb3BlcnR5IHJlbmFtZXIgZG9lcyBub3QKICAgICAgICogdW5kZXJzdGFuZCB0byByZW5hbWUgd2hlbiB0aGUgdGFyZ2V0IGlzIG5vdCBzcGVjaWZpY2FsbHkgInRoaXMiCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSB0YXJnZXQgRWxlbWVudCB0byBsaXN0ZW4gdG8gZm9yIGlyb24tcmVzaXplIGV2ZW50cy4KICAgICAgICovCiAgICAgIF91bnN1YnNjcmliZUlyb25SZXNpemU6IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKAogICAgICAgICAgICAnaXJvbi1yZXNpemUnLCB0aGlzLl9ib3VuZE9uRGVzY2VuZGFudElyb25SZXNpemUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIHRvIGZpbHRlciBuZXN0ZWQgZWxlbWVudHMgdGhhdCBzaG91bGQgb3IKICAgICAgICogc2hvdWxkIG5vdCBiZSBub3RpZmllZCBieSB0aGUgY3VycmVudCBlbGVtZW50LiBSZXR1cm4gdHJ1ZSBpZiBhbiBlbGVtZW50CiAgICAgICAqIHNob3VsZCBiZSBub3RpZmllZCwgb3IgZmFsc2UgaWYgaXQgc2hvdWxkIG5vdCBiZSBub3RpZmllZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCBBIGNhbmRpZGF0ZSBkZXNjZW5kYW50IGVsZW1lbnQgdGhhdAogICAgICAgKiBpbXBsZW1lbnRzIGBJcm9uUmVzaXphYmxlQmVoYXZpb3JgLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSBgZWxlbWVudGAgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIHJlc2l6ZS4KICAgICAgICovCiAgICAgIHJlc2l6ZXJTaG91bGROb3RpZnk6IGZ1bmN0aW9uKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKCiAgICAgIF9vbkRlc2NlbmRhbnRJcm9uUmVzaXplOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICh0aGlzLl9ub3RpZnlpbmdEZXNjZW5kYW50KSB7CiAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIG5vIG5lZWQgdG8gdXNlIHRoaXMgZHVyaW5nIHNoYWRvdyBkb20gYmVjYXVzZSBvZiBldmVudCByZXRhcmdldGluZwogICAgICAgIGlmICghdXNlU2hhZG93KSB7CiAgICAgICAgICB0aGlzLl9maXJlUmVzaXplKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2ZpcmVSZXNpemU6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuZmlyZSgnaXJvbi1yZXNpemUnLCBudWxsLCB7bm9kZTogdGhpcywgYnViYmxlczogZmFsc2V9KTsKICAgICAgfSwKCiAgICAgIF9vbklyb25SZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9uczogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgdGFyZ2V0ID0gLyoqIEB0eXBlIHshRXZlbnRUYXJnZXR9ICovIChkb20oZXZlbnQpLnJvb3RUYXJnZXQpOwogICAgICAgIGlmICh0YXJnZXQgPT09IHRoaXMpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRhcmdldC5hc3NpZ25QYXJlbnRSZXNpemFibGUodGhpcyk7CiAgICAgICAgdGhpcy5fbm90aWZ5RGVzY2VuZGFudCh0YXJnZXQpOwoKICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgfSwKCiAgICAgIF9wYXJlbnRSZXNpemFibGVDaGFuZ2VkOiBmdW5jdGlvbihwYXJlbnRSZXNpemFibGUpIHsKICAgICAgICBpZiAocGFyZW50UmVzaXphYmxlKSB7CiAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcigncmVzaXplJywgdGhpcy5fYm91bmROb3RpZnlSZXNpemUpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9ub3RpZnlEZXNjZW5kYW50OiBmdW5jdGlvbihkZXNjZW5kYW50KSB7CiAgICAgICAgLy8gTk9URShjZGF0YSk6IEluIElFMTAsIGF0dGFjaGVkIGlzIGZpcmVkIG9uIGNoaWxkcmVuIGZpcnN0LCBzbyBpdCdzCiAgICAgICAgLy8gaW1wb3J0YW50IG5vdCB0byBub3RpZnkgdGhlbSBpZiB0aGUgcGFyZW50IGlzIG5vdCBhdHRhY2hlZCB5ZXQgKG9yCiAgICAgICAgLy8gZWxzZSB0aGV5IHdpbGwgZ2V0IHJlZHVuZGFudGx5IG5vdGlmaWVkIHdoZW4gdGhlIHBhcmVudCBhdHRhY2hlcykuCiAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRoaXMuX25vdGlmeWluZ0Rlc2NlbmRhbnQgPSB0cnVlOwogICAgICAgIGRlc2NlbmRhbnQubm90aWZ5UmVzaXplKCk7CiAgICAgICAgdGhpcy5fbm90aWZ5aW5nRGVzY2VuZGFudCA9IGZhbHNlOwogICAgICB9LAoKICAgICAgX3JlcXVlc3RSZXNpemVOb3RpZmljYXRpb25zOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGRvY3VtZW50LnJlYWR5U3RhdGUgPT09ICdsb2FkaW5nJykgewogICAgICAgICAgdmFyIF9yZXF1ZXN0UmVzaXplTm90aWZpY2F0aW9ucyA9CiAgICAgICAgICAgICAgdGhpcy5fcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMuYmluZCh0aGlzKTsKICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAgICAgJ3JlYWR5c3RhdGVjaGFuZ2UnLCBmdW5jdGlvbiByZWFkeXN0YXRlY2hhbmdlZCgpIHsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3JlYWR5c3RhdGVjaGFuZ2UnLCByZWFkeXN0YXRlY2hhbmdlZCk7CiAgICAgICAgICAgICAgICBfcmVxdWVzdFJlc2l6ZU5vdGlmaWNhdGlvbnMoKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fZmluZFBhcmVudCgpOwoKICAgICAgICAgIGlmICghdGhpcy5fcGFyZW50UmVzaXphYmxlKSB7CiAgICAgICAgICAgIC8vIElmIHRoaXMgcmVzaXphYmxlIGlzIGFuIG9ycGhhbiwgdGVsbCBvdGhlciBvcnBoYW5zIHRvIHRyeSB0byBmaW5kCiAgICAgICAgICAgIC8vIHRoZWlyIHBhcmVudCBhZ2FpbiwgaW4gY2FzZSBpdCdzIHRoaXMgcmVzaXphYmxlLgogICAgICAgICAgICBPUlBIQU5TLmZvckVhY2goZnVuY3Rpb24ob3JwaGFuKSB7CiAgICAgICAgICAgICAgaWYgKG9ycGhhbiAhPT0gdGhpcykgewogICAgICAgICAgICAgICAgb3JwaGFuLl9maW5kUGFyZW50KCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB0aGlzKTsKCiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLl9ib3VuZE5vdGlmeVJlc2l6ZSk7CiAgICAgICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBJZiB0aGlzIHJlc2l6YWJsZSBoYXMgYSBwYXJlbnQsIHRlbGwgb3RoZXIgY2hpbGQgcmVzaXphYmxlcyBvZgogICAgICAgICAgICAvLyB0aGF0IHBhcmVudCB0byB0cnkgZmluZGluZyB0aGVpciBwYXJlbnQgYWdhaW4sIGluIGNhc2UgaXQncyB0aGlzCiAgICAgICAgICAgIC8vIHJlc2l6YWJsZS4KICAgICAgICAgICAgdGhpcy5fcGFyZW50UmVzaXphYmxlLl9pbnRlcmVzdGVkUmVzaXphYmxlcwogICAgICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24ocmVzaXphYmxlKSB7CiAgICAgICAgICAgICAgICAgIGlmIChyZXNpemFibGUgIT09IHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICByZXNpemFibGUuX2ZpbmRQYXJlbnQoKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2ZpbmRQYXJlbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYXNzaWduUGFyZW50UmVzaXphYmxlKG51bGwpOwogICAgICAgIHRoaXMuZmlyZSgKICAgICAgICAgICAgJ2lyb24tcmVxdWVzdC1yZXNpemUtbm90aWZpY2F0aW9ucycsCiAgICAgICAgICAgIG51bGwsCiAgICAgICAgICAgIHtub2RlOiB0aGlzLCBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlfSk7CgogICAgICAgIGlmICghdGhpcy5fcGFyZW50UmVzaXphYmxlKSB7CiAgICAgICAgICBPUlBIQU5TLmFkZCh0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgT1JQSEFOUy5kZWxldGUodGhpcyk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIHZhciBJcm9uUmVzaXphYmxlQmVoYXZpb3IkMSA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgSXJvblJlc2l6YWJsZUJlaGF2aW9yOiBJcm9uUmVzaXphYmxlQmVoYXZpb3IKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgYGlyb24tY29sbGFwc2VgIGNyZWF0ZXMgYSBjb2xsYXBzaWJsZSBibG9jayBvZiBjb250ZW50LiAgQnkgZGVmYXVsdCwgdGhlIGNvbnRlbnQKICAgIHdpbGwgYmUgY29sbGFwc2VkLiAgVXNlIGBvcGVuZWRgIG9yIGB0b2dnbGUoKWAgdG8gc2hvdy9oaWRlIHRoZSBjb250ZW50LgoKICAgICAgICA8YnV0dG9uIG9uLWNsaWNrPSJ0b2dnbGUiPnRvZ2dsZSBjb2xsYXBzZTwvYnV0dG9uPgoKICAgICAgICA8aXJvbi1jb2xsYXBzZSBpZD0iY29sbGFwc2UiPgogICAgICAgICAgPGRpdj5Db250ZW50IGdvZXMgaGVyZS4uLjwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KCiAgICAgICAgLi4uCgogICAgICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLiQuY29sbGFwc2UudG9nZ2xlKCk7CiAgICAgICAgfQoKICAgIGBpcm9uLWNvbGxhcHNlYCBhZGp1c3RzIHRoZSBtYXgtaGVpZ2h0L21heC13aWR0aCBvZiB0aGUgY29sbGFwc2libGUgZWxlbWVudCB0bwogICAgc2hvdy9oaWRlIHRoZSBjb250ZW50LiAgU28gYXZvaWQgcHV0dGluZyBwYWRkaW5nL21hcmdpbi9ib3JkZXIgb24gdGhlCiAgICBjb2xsYXBzaWJsZSBkaXJlY3RseSwgYW5kIGluc3RlYWQgcHV0IGEgZGl2IGluc2lkZSBhbmQgc3R5bGUgdGhhdC4KCiAgICAgICAgPHN0eWxlPgogICAgICAgICAgLmNvbGxhcHNlLWNvbnRlbnQgewogICAgICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGVkZWRlOwogICAgICAgICAgfQogICAgICAgIDwvc3R5bGU+CgogICAgICAgIDxpcm9uLWNvbGxhcHNlPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sbGFwc2UtY29udGVudCI+CiAgICAgICAgICAgIDxkaXY+Q29udGVudCBnb2VzIGhlcmUuLi48L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KCiAgICAjIyMgU3R5bGluZwoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLWlyb24tY29sbGFwc2UtdHJhbnNpdGlvbi1kdXJhdGlvbmAgfCBBbmltYXRpb24gdHJhbnNpdGlvbiBkdXJhdGlvbiB8IGAzMDBtc2AKCiAgICBAZ3JvdXAgSXJvbiBFbGVtZW50cwogICAgQGhlcm8gaGVyby5zdmcKICAgIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgQGVsZW1lbnQgaXJvbi1jb2xsYXBzZQogICAgKi8KICAgIFBvbHltZXIoewogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1pcm9uLWNvbGxhcHNlLXRyYW5zaXRpb24tZHVyYXRpb24sIDMwMG1zKTsKICAgICAgICAvKiBTYWZhcmkgMTAgbmVlZHMgdGhpcyBwcm9wZXJ0eSBwcmVmaXhlZCB0byBjb3JyZWN0bHkgYXBwbHkgdGhlIGN1c3RvbSBwcm9wZXJ0eSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0taXJvbi1jb2xsYXBzZS10cmFuc2l0aW9uLWR1cmF0aW9uLCAzMDBtcyk7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLWNvbGxhcHNlLWNsb3NlZCkgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoLmlyb24tY29sbGFwc2Utb3BlbmVkKSkgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLAoKICAgICAgaXM6ICdpcm9uLWNvbGxhcHNlJywKICAgICAgYmVoYXZpb3JzOiBbSXJvblJlc2l6YWJsZUJlaGF2aW9yXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIG9yaWVudGF0aW9uIGlzIGhvcml6b250YWw7IG90aGVyd2lzZSBpcyB2ZXJ0aWNhbC4KICAgICAgICAgKgogICAgICAgICAqIEBhdHRyaWJ1dGUgaG9yaXpvbnRhbAogICAgICAgICAqLwogICAgICAgIGhvcml6b250YWw6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIG9ic2VydmVyOiAnX2hvcml6b250YWxDaGFuZ2VkJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCBvcGVuZWQgdG8gdHJ1ZSB0byBzaG93IHRoZSBjb2xsYXBzZSBlbGVtZW50IGFuZCB0byBmYWxzZSB0byBoaWRlIGl0LgogICAgICAgICAqCiAgICAgICAgICogQGF0dHJpYnV0ZSBvcGVuZWQKICAgICAgICAgKi8KICAgICAgICBvcGVuZWQ6CiAgICAgICAgICAgIHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIG5vdGlmeTogdHJ1ZSwgb2JzZXJ2ZXI6ICdfb3BlbmVkQ2hhbmdlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRydWUsIHRoZSBlbGVtZW50IGlzIHRyYW5zaXRpb25pbmcgaXRzIG9wZW5lZCBzdGF0ZS4gV2hlbiBmYWxzZSwKICAgICAgICAgKiB0aGUgZWxlbWVudCBoYXMgZmluaXNoZWQgb3BlbmluZy9jbG9zaW5nLgogICAgICAgICAqCiAgICAgICAgICogQGF0dHJpYnV0ZSB0cmFuc2l0aW9uaW5nCiAgICAgICAgICovCiAgICAgICAgdHJhbnNpdGlvbmluZzoge3R5cGU6IEJvb2xlYW4sIG5vdGlmeTogdHJ1ZSwgcmVhZE9ubHk6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgbm9BbmltYXRpb24gdG8gdHJ1ZSB0byBkaXNhYmxlIGFuaW1hdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAYXR0cmlidXRlIG5vQW5pbWF0aW9uCiAgICAgICAgICovCiAgICAgICAgbm9BbmltYXRpb246IHt0eXBlOiBCb29sZWFufSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU3RvcmVzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIGNvbGxhcHNlIGJvZHkuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBfZGVzaXJlZFNpemU6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnJ30KICAgICAgfSwKCiAgICAgIGdldCBkaW1lbnNpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaG9yaXpvbnRhbCA/ICd3aWR0aCcgOiAnaGVpZ2h0JzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBgbWF4V2lkdGhgIG9yIGBtYXhIZWlnaHRgLgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgZ2V0IF9kaW1lbnNpb25NYXgoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaG9yaXpvbnRhbCA/ICdtYXhXaWR0aCcgOiAnbWF4SGVpZ2h0JzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBgbWF4LXdpZHRoYCBvciBgbWF4LWhlaWdodGAuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBnZXQgX2RpbWVuc2lvbk1heENzcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5ob3Jpem9udGFsID8gJ21heC13aWR0aCcgOiAnbWF4LWhlaWdodCc7CiAgICAgIH0sCgogICAgICBob3N0QXR0cmlidXRlczogewogICAgICAgIHJvbGU6ICdncm91cCcsCiAgICAgICAgJ2FyaWEtaGlkZGVuJzogJ3RydWUnLAogICAgICB9LAoKICAgICAgbGlzdGVuZXJzOiB7dHJhbnNpdGlvbmVuZDogJ19vblRyYW5zaXRpb25FbmQnfSwKCiAgICAgIC8qKgogICAgICAgKiBUb2dnbGUgdGhlIG9wZW5lZCBzdGF0ZS4KICAgICAgICoKICAgICAgICogQG1ldGhvZCB0b2dnbGUKICAgICAgICovCiAgICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5vcGVuZWQgPSAhdGhpcy5vcGVuZWQ7CiAgICAgIH0sCgogICAgICBzaG93OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLm9wZW5lZCA9IHRydWU7CiAgICAgIH0sCgogICAgICBoaWRlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLm9wZW5lZCA9IGZhbHNlOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnQuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaXplIFRoZSBuZXcgdmFsdWUgZm9yIGBtYXhXaWR0aGAvYG1heEhlaWdodGAgYXMgY3NzIHByb3BlcnR5IHZhbHVlLCB1c3VhbGx5IGBhdXRvYCBvciBgMHB4YC4KICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gYW5pbWF0ZWQgaWYgYHRydWVgIHVwZGF0ZXMgdGhlIHNpemUgd2l0aCBhbiBhbmltYXRpb24sIG90aGVyd2lzZSB3aXRob3V0LgogICAgICAgKi8KICAgICAgdXBkYXRlU2l6ZTogZnVuY3Rpb24oc2l6ZSwgYW5pbWF0ZWQpIHsKICAgICAgICAvLyBDb25zaWRlciAnYXV0bycgYXMgJycsIHRvIHRha2UgZnVsbCBzaXplLgogICAgICAgIHNpemUgPSBzaXplID09PSAnYXV0bycgPyAnJyA6IHNpemU7CgogICAgICAgIHZhciB3aWxsQW5pbWF0ZSA9IGFuaW1hdGVkICYmICF0aGlzLm5vQW5pbWF0aW9uICYmIHRoaXMuaXNBdHRhY2hlZCAmJgogICAgICAgICAgICB0aGlzLl9kZXNpcmVkU2l6ZSAhPT0gc2l6ZTsKCiAgICAgICAgdGhpcy5fZGVzaXJlZFNpemUgPSBzaXplOwoKICAgICAgICB0aGlzLl91cGRhdGVUcmFuc2l0aW9uKGZhbHNlKTsKICAgICAgICAvLyBJZiB3ZSBjYW4gYW5pbWF0ZSwgbXVzdCBkbyBzb21lIHByZXAgd29yay4KICAgICAgICBpZiAod2lsbEFuaW1hdGUpIHsKICAgICAgICAgIC8vIEFuaW1hdGlvbiB3aWxsIHN0YXJ0IGF0IHRoZSBjdXJyZW50IHNpemUuCiAgICAgICAgICB2YXIgc3RhcnRTaXplID0gdGhpcy5fY2FsY1NpemUoKTsKICAgICAgICAgIC8vIEZvciBgYXV0b2Agd2UgbXVzdCBjYWxjdWxhdGUgd2hhdCBpcyB0aGUgZmluYWwgc2l6ZSBmb3IgdGhlIGFuaW1hdGlvbi4KICAgICAgICAgIC8vIEFmdGVyIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUsIF90cmFuc2l0aW9uRW5kIHdpbGwgc2V0IHRoZSBzaXplIGJhY2sgdG8KICAgICAgICAgIC8vIGBhdXRvYC4KICAgICAgICAgIGlmIChzaXplID09PSAnJykgewogICAgICAgICAgICB0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF0gPSAnJzsKICAgICAgICAgICAgc2l6ZSA9IHRoaXMuX2NhbGNTaXplKCk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBHbyB0byBzdGFydFNpemUgd2l0aG91dCBhbmltYXRpb24uCiAgICAgICAgICB0aGlzLnN0eWxlW3RoaXMuX2RpbWVuc2lvbk1heF0gPSBzdGFydFNpemU7CiAgICAgICAgICAvLyBGb3JjZSBsYXlvdXQgdG8gZW5zdXJlIHRyYW5zaXRpb24gd2lsbCBnby4gU2V0IHNjcm9sbFRvcCB0byBpdHNlbGYKICAgICAgICAgIC8vIHNvIHRoYXQgY29tcGlsZXJzIHdvbid0IHJlbW92ZSBpdC4KICAgICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgICAgICAvLyBFbmFibGUgYW5pbWF0aW9uLgogICAgICAgICAgdGhpcy5fdXBkYXRlVHJhbnNpdGlvbih0cnVlKTsKICAgICAgICAgIC8vIElmIGZpbmFsIHNpemUgaXMgdGhlIHNhbWUgYXMgc3RhcnRTaXplIGl0IHdpbGwgbm90IGFuaW1hdGUuCiAgICAgICAgICB3aWxsQW5pbWF0ZSA9IChzaXplICE9PSBzdGFydFNpemUpOwogICAgICAgIH0KICAgICAgICAvLyBTZXQgdGhlIGZpbmFsIHNpemUuCiAgICAgICAgdGhpcy5zdHlsZVt0aGlzLl9kaW1lbnNpb25NYXhdID0gc2l6ZTsKICAgICAgICAvLyBJZiBpdCB3b24ndCBhbmltYXRlLCBjYWxsIHRyYW5zaXRpb25FbmQgdG8gc2V0IGNvcnJlY3QgY2xhc3Nlcy4KICAgICAgICBpZiAoIXdpbGxBbmltYXRlKSB7CiAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5kKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIGVuYWJsZVRyYW5zaXRpb24oKSBpcyBkZXByZWNhdGVkLCBidXQgbGVmdCBvdmVyIHNvIGl0IGRvZXNuJ3QgYnJlYWsKICAgICAgICogZXhpc3RpbmcgY29kZS4gUGxlYXNlIHVzZSBgbm9BbmltYXRpb25gIHByb3BlcnR5IGluc3RlYWQuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZW5hYmxlVHJhbnNpdGlvbgogICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uIDEuMC40CiAgICAgICAqLwogICAgICBlbmFibGVUcmFuc2l0aW9uOiBmdW5jdGlvbihlbmFibGVkKSB7CiAgICAgICAgQmFzZS5fd2FybigKICAgICAgICAgICAgJ2BlbmFibGVUcmFuc2l0aW9uKClgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgbm9BbmltYXRpb25gIGluc3RlYWQuJyk7CiAgICAgICAgdGhpcy5ub0FuaW1hdGlvbiA9ICFlbmFibGVkOwogICAgICB9LAoKICAgICAgX3VwZGF0ZVRyYW5zaXRpb246IGZ1bmN0aW9uKGVuYWJsZWQpIHsKICAgICAgICB0aGlzLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IChlbmFibGVkICYmICF0aGlzLm5vQW5pbWF0aW9uKSA/ICcnIDogJzBzJzsKICAgICAgfSwKCiAgICAgIF9ob3Jpem9udGFsQ2hhbmdlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS50cmFuc2l0aW9uUHJvcGVydHkgPSB0aGlzLl9kaW1lbnNpb25NYXhDc3M7CiAgICAgICAgdmFyIG90aGVyRGltZW5zaW9uID0KICAgICAgICAgICAgdGhpcy5fZGltZW5zaW9uTWF4ID09PSAnbWF4V2lkdGgnID8gJ21heEhlaWdodCcgOiAnbWF4V2lkdGgnOwogICAgICAgIHRoaXMuc3R5bGVbb3RoZXJEaW1lbnNpb25dID0gJyc7CiAgICAgICAgdGhpcy51cGRhdGVTaXplKHRoaXMub3BlbmVkID8gJ2F1dG8nIDogJzBweCcsIGZhbHNlKTsKICAgICAgfSwKCiAgICAgIF9vcGVuZWRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAhdGhpcy5vcGVuZWQpOwoKICAgICAgICB0aGlzLl9zZXRUcmFuc2l0aW9uaW5nKHRydWUpOwogICAgICAgIHRoaXMudG9nZ2xlQ2xhc3MoJ2lyb24tY29sbGFwc2UtY2xvc2VkJywgZmFsc2UpOwogICAgICAgIHRoaXMudG9nZ2xlQ2xhc3MoJ2lyb24tY29sbGFwc2Utb3BlbmVkJywgZmFsc2UpOwogICAgICAgIHRoaXMudXBkYXRlU2l6ZSh0aGlzLm9wZW5lZCA/ICdhdXRvJyA6ICcwcHgnLCB0cnVlKTsKCiAgICAgICAgLy8gRm9jdXMgdGhlIGN1cnJlbnQgY29sbGFwc2UuCiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7CiAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3RyYW5zaXRpb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGVbdGhpcy5fZGltZW5zaW9uTWF4XSA9IHRoaXMuX2Rlc2lyZWRTaXplOwogICAgICAgIHRoaXMudG9nZ2xlQ2xhc3MoJ2lyb24tY29sbGFwc2UtY2xvc2VkJywgIXRoaXMub3BlbmVkKTsKICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdpcm9uLWNvbGxhcHNlLW9wZW5lZCcsIHRoaXMub3BlbmVkKTsKICAgICAgICB0aGlzLl91cGRhdGVUcmFuc2l0aW9uKGZhbHNlKTsKICAgICAgICB0aGlzLm5vdGlmeVJlc2l6ZSgpOwogICAgICAgIHRoaXMuX3NldFRyYW5zaXRpb25pbmcoZmFsc2UpOwogICAgICB9LAoKICAgICAgX29uVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoZG9tKGV2ZW50KS5yb290VGFyZ2V0ID09PSB0aGlzKSB7CiAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5kKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2NhbGNTaXplOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKVt0aGlzLmRpbWVuc2lvbl0gKyAncHgnOwogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKgogICAgQSBzZXQgb2YgbGF5b3V0IGNsYXNzZXMgdGhhdCBsZXQgeW91IHNwZWNpZnkgbGF5b3V0IHByb3BlcnRpZXMgZGlyZWN0bHkgaW4KICAgIG1hcmt1cC4gWW91IG11c3QgaW5jbHVkZSB0aGlzIGZpbGUgaW4gZXZlcnkgZWxlbWVudCB0aGF0IG5lZWRzIHRvIHVzZSB0aGVtLgoKICAgIFNhbXBsZSB1c2U6CgogICAgICAgIGltcG9ydCAnQHBvbHltZXIvaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0LWNsYXNzZXMuanMnOwoKICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGh0bWxgCiAgICAgICAgICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSIgaW5jbHVkZT0iaXJvbi1mbGV4IGlyb24tZmxleC1hbGlnbm1lbnQiPjwvc3R5bGU+CiAgICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgIC50ZXN0IHsgd2lkdGg6IDEwMHB4OyB9CiAgICAgICAgICA8L3N0eWxlPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0IGhvcml6b250YWwgY2VudGVyLWNlbnRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRlc3QiPmhvcml6b250YWwgbGF5b3V0IGNlbnRlciBhbGlnbm1lbnQ8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50KTsKCiAgICBUaGUgZm9sbG93aW5nIGltcG9ydHMgYXJlIGF2YWlsYWJsZToKICAgICAtIGlyb24tZmxleAogICAgIC0gaXJvbi1mbGV4LXJldmVyc2UKICAgICAtIGlyb24tZmxleC1hbGlnbm1lbnQKICAgICAtIGlyb24tZmxleC1mYWN0b3JzCiAgICAgLSBpcm9uLXBvc2l0aW9uaW5nCiAgICAqLwoKICAgIGNvbnN0IHRlbXBsYXRlID0gaHRtbGAKLyogTW9zdCBjb21tb24gdXNlZCBmbGV4IHN0eWxlcyovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLmxheW91dC5ob3Jpem9udGFsLAogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5pbmxpbmUgewogICAgICAgIGRpc3BsYXk6IC1tcy1pbmxpbmUtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWlubGluZS1mbGV4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICB9CgogICAgICAubGF5b3V0Lmhvcml6b250YWwgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsIHsKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfQoKICAgICAgLmxheW91dC53cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiB3cmFwOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwOwogICAgICAgIGZsZXgtd3JhcDogd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5uby13cmFwIHsKICAgICAgICAtbXMtZmxleC13cmFwOiBub3dyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXItanVzdGlmaWVkLAogICAgICAubGF5b3V0LmNlbnRlci1jZW50ZXIgewogICAgICAgIC1tcy1mbGV4LXBhY2s6IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAuZmxleCB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC1hdXRvIHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfQoKICAgICAgLmZsZXgtbm9uZSB7CiAgICAgICAgLW1zLWZsZXg6IG5vbmU7CiAgICAgICAgLXdlYmtpdC1mbGV4OiBub25lOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBCYXNpYyBmbGV4Ym94IHJldmVyc2Ugc3R5bGVzICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtcmV2ZXJzZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAubGF5b3V0Lmhvcml6b250YWwtcmV2ZXJzZSwKICAgICAgLmxheW91dC52ZXJ0aWNhbC1yZXZlcnNlIHsKICAgICAgICBkaXNwbGF5OiAtbXMtZmxleGJveDsKICAgICAgICBkaXNwbGF5OiAtd2Via2l0LWZsZXg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQoKICAgICAgLmxheW91dC5ob3Jpem9udGFsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogcm93LXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LnZlcnRpY2FsLXJldmVyc2UgewogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9CgogICAgICAubGF5b3V0LndyYXAtcmV2ZXJzZSB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBGbGV4Ym94IGFsaWdubWVudCAqLwo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1mbGV4LWFsaWdubWVudCI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAvKioKICAgICAgICogQWxpZ25tZW50IGluIGNyb3NzIGF4aXMuCiAgICAgICAqLwogICAgICAubGF5b3V0LnN0YXJ0IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5jZW50ZXIsCiAgICAgIC5sYXlvdXQuY2VudGVyLWNlbnRlciB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQgewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICB9CgogICAgICAubGF5b3V0LmJhc2VsaW5lIHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogYmFzZWxpbmU7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQWxpZ25tZW50IGluIG1haW4gYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBzdGFydDsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLWp1c3RpZmllZCwKICAgICAgLmxheW91dC5jZW50ZXItY2VudGVyIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQtanVzdGlmaWVkIHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9CgogICAgICAubGF5b3V0Lmp1c3RpZmllZCB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZWxmIGFsaWdubWVudC4KICAgICAgICovCiAgICAgIC5zZWxmLXN0YXJ0IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLnNlbGYtY2VudGVyIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogY2VudGVyOwogICAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnNlbGYtZW5kIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfQoKICAgICAgLnNlbGYtc3RyZXRjaCB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgIH0KCiAgICAgIC5zZWxmLWJhc2VsaW5lIHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogYmFzZWxpbmU7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICBhbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIG11bHRpLWxpbmUgYWxpZ25tZW50IGluIG1haW4gYXhpcy4KICAgICAgICovCiAgICAgIC5sYXlvdXQuc3RhcnQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfQoKICAgICAgLmxheW91dC5lbmQtYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH0KCiAgICAgIC5sYXlvdXQuY2VudGVyLWFsaWduZWQgewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9CgogICAgICAubGF5b3V0LmJldHdlZW4tYWxpZ25lZCB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAubGF5b3V0LmFyb3VuZC1hbGlnbmVkIHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgovKiBOb24tZmxleGJveCBwb3NpdGlvbmluZyBoZWxwZXIgc3R5bGVzICovCjxkb20tbW9kdWxlIGlkPSJpcm9uLWZsZXgtZmFjdG9ycyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuZmxleCwKICAgICAgLmZsZXgtMSB7CiAgICAgICAgLW1zLWZsZXg6IDEgMSAwLjAwMDAwMDAwMXB4OwogICAgICAgIC13ZWJraXQtZmxleDogMTsKICAgICAgICBmbGV4OiAxOwogICAgICAgIC13ZWJraXQtZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgICBmbGV4LWJhc2lzOiAwLjAwMDAwMDAwMXB4OwogICAgICB9CgogICAgICAuZmxleC0yIHsKICAgICAgICAtbXMtZmxleDogMjsKICAgICAgICAtd2Via2l0LWZsZXg6IDI7CiAgICAgICAgZmxleDogMjsKICAgICAgfQoKICAgICAgLmZsZXgtMyB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH0KCiAgICAgIC5mbGV4LTQgewogICAgICAgIC1tcy1mbGV4OiA0OwogICAgICAgIC13ZWJraXQtZmxleDogNDsKICAgICAgICBmbGV4OiA0OwogICAgICB9CgogICAgICAuZmxleC01IHsKICAgICAgICAtbXMtZmxleDogNTsKICAgICAgICAtd2Via2l0LWZsZXg6IDU7CiAgICAgICAgZmxleDogNTsKICAgICAgfQoKICAgICAgLmZsZXgtNiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH0KCiAgICAgIC5mbGV4LTcgewogICAgICAgIC1tcy1mbGV4OiA3OwogICAgICAgIC13ZWJraXQtZmxleDogNzsKICAgICAgICBmbGV4OiA3OwogICAgICB9CgogICAgICAuZmxleC04IHsKICAgICAgICAtbXMtZmxleDogODsKICAgICAgICAtd2Via2l0LWZsZXg6IDg7CiAgICAgICAgZmxleDogODsKICAgICAgfQoKICAgICAgLmZsZXgtOSB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH0KCiAgICAgIC5mbGV4LTEwIHsKICAgICAgICAtbXMtZmxleDogMTA7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxMDsKICAgICAgICBmbGV4OiAxMDsKICAgICAgfQoKICAgICAgLmZsZXgtMTEgewogICAgICAgIC1tcy1mbGV4OiAxMTsKICAgICAgICAtd2Via2l0LWZsZXg6IDExOwogICAgICAgIGZsZXg6IDExOwogICAgICB9CgogICAgICAuZmxleC0xMiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgo8ZG9tLW1vZHVsZSBpZD0iaXJvbi1wb3NpdGlvbmluZyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAuYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuaW52aXNpYmxlIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW4gIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLnJlbGF0aXZlIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH0KCiAgICAgIGJvZHkuZnVsbGJsZWVkIHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfQoKICAgICAgLnNjcm9sbCB7CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAvKiBmaXhlZCBwb3NpdGlvbiAqLwogICAgICAuZml4ZWQtYm90dG9tLAogICAgICAuZml4ZWQtbGVmdCwKICAgICAgLmZpeGVkLXJpZ2h0LAogICAgICAuZml4ZWQtdG9wIHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIH0KCiAgICAgIC5maXhlZC10b3AgewogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtcmlnaHQgewogICAgICAgIHRvcDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgIH0KCiAgICAgIC5maXhlZC1ib3R0b20gewogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICAuZml4ZWQtbGVmdCB7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT4KYDsKICAgIHRlbXBsYXRlLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUuY29udGVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBUaGUgYDxpcm9uLWZsZXgtbGF5b3V0PmAgY29tcG9uZW50IHByb3ZpZGVzIHNpbXBsZSB3YXlzIHRvIHVzZQogICAgW0NTUyBmbGV4aWJsZSBib3gKICAgIGxheW91dF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvR3VpZGUvQ1NTL0ZsZXhpYmxlX2JveGVzKSwKICAgIGFsc28ga25vd24gYXMgZmxleGJveC4gTm90ZSB0aGF0IHRoaXMgaXMgYW4gb2xkIGVsZW1lbnQsIHRoYXQgd2FzIHdyaXR0ZW4KICAgIGJlZm9yZSBhbGwgbW9kZXJuIGJyb3dzZXJzIGhhZCBub24tcHJlZml4ZWQgZmxleCBzdHlsZXMuIEFzIHN1Y2gsIG5vd2FkYXlzIHlvdQogICAgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gdXNlIHRoaXMgZWxlbWVudCBhbnltb3JlLCBhbmQgY2FuIHVzZSBDU1MgZmxleCBzdHlsZXMKICAgIGRpcmVjdGx5IGluIHlvdXIgY29kZS4KCiAgICBUaGlzIGNvbXBvbmVudCBwcm92aWRlcyB0d28gZGlmZmVyZW50IHdheXMgdG8gdXNlIGZsZXhib3g6CgogICAgMS4gW0xheW91dAogICAgY2xhc3Nlc10oaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9pcm9uLWZsZXgtbGF5b3V0L3RyZWUvbWFzdGVyL2lyb24tZmxleC1sYXlvdXQtY2xhc3Nlcy5odG1sKS4KICAgIFRoZSBsYXlvdXQgY2xhc3Mgc3R5bGVzaGVldCBwcm92aWRlcyBhIHNpbXBsZSBzZXQgb2YgY2xhc3MtYmFzZWQgZmxleGJveCBydWxlcywKICAgIHRoYXQgbGV0IHlvdSBzcGVjaWZ5IGxheW91dCBwcm9wZXJ0aWVzIGRpcmVjdGx5IGluIG1hcmt1cC4gWW91IG11c3QgaW5jbHVkZSB0aGlzCiAgICBmaWxlIGluIGV2ZXJ5IGVsZW1lbnQgdGhhdCBuZWVkcyB0byB1c2UgdGhlbS4KCiAgICAgICAgU2FtcGxlIHVzZToKCiAgICAgICAgYGBgCiAgICAgICAgPGN1c3RvbS1lbGVtZW50LWRlbW8+CiAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgIDxzY3JpcHQgc3JjPSIuLi93ZWJjb21wb25lbnRzanMvd2ViY29tcG9uZW50cy1saXRlLmpzIj48L0pBVkFfU0NSSUlJSVBULz4KICAgICAgICAgICAgPG5leHQtY29kZS1ibG9jaz48L25leHQtY29kZS1ibG9jaz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9jdXN0b20tZWxlbWVudC1kZW1vPgogICAgICAgIGBgYAoKICAgICAgICBgYGBqcwogICAgICAgIGltcG9ydCB7aHRtbH0gZnJvbSAnQHBvbHltZXIvcG9seW1lci9saWIvdXRpbHMvaHRtbC10YWcuanMnOwogICAgICAgIGltcG9ydCAnQHBvbHltZXIvaXJvbi1mbGV4LWxheW91dC9pcm9uLWZsZXgtbGF5b3V0LWNsYXNzZXMuanMnOwoKICAgICAgICBjb25zdCB0ZW1wbGF0ZSA9IGh0bWxgCiAgICAgICAgICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSIgaW5jbHVkZT0iaXJvbi1mbGV4IGlyb24tZmxleC1hbGlnbm1lbnQiPjwvc3R5bGU+CiAgICAgICAgICA8c3R5bGU+CiAgICAgICAgICAgIC50ZXN0IHsgd2lkdGg6IDEwMHB4OyB9CiAgICAgICAgICA8L3N0eWxlPgogICAgICAgICAgPGRpdiBjbGFzcz0ibGF5b3V0IGhvcml6b250YWwgY2VudGVyLWNlbnRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRlc3QiPmhvcml6b250YWwgbGF5b3V0IGNlbnRlciBhbGlnbm1lbnQ8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIGA7CiAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZW1wbGF0ZS5jb250ZW50KTsKICAgICAgICBgYGAKCiAgICAyLiBbQ3VzdG9tIENTUwogICAgbWl4aW5zXShodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL2lyb24tZmxleC1sYXlvdXQvYmxvYi9tYXN0ZXIvaXJvbi1mbGV4LWxheW91dC5odG1sKS4KICAgIFRoZSBtaXhpbiBzdHlsZXNoZWV0IGluY2x1ZGVzIGN1c3RvbSBDU1MgbWl4aW5zIHRoYXQgY2FuIGJlIGFwcGxpZWQgaW5zaWRlIGEgQ1NTCiAgICBydWxlIHVzaW5nIHRoZSBgQGFwcGx5YCBmdW5jdGlvbi4KCiAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBvbGQgWy9kZWVwLyBsYXlvdXQKICAgIGNsYXNzZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyRWxlbWVudHMvaXJvbi1mbGV4LWxheW91dC90cmVlL21hc3Rlci9jbGFzc2VzKQogICAgYXJlIGRlcHJlY2F0ZWQsIGFuZCBzaG91bGQgbm90IGJlIHVzZWQuIFRvIGNvbnRpbnVlIHVzaW5nIGxheW91dCBwcm9wZXJ0aWVzCiAgICBkaXJlY3RseSBpbiBtYXJrdXAsIHBsZWFzZSBzd2l0Y2ggdG8gdXNpbmcgdGhlIG5ldyBgZG9tLW1vZHVsZWAtYmFzZWQKICAgIFtsYXlvdXQKICAgIGNsYXNzZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyRWxlbWVudHMvaXJvbi1mbGV4LWxheW91dC90cmVlL21hc3Rlci9pcm9uLWZsZXgtbGF5b3V0LWNsYXNzZXMuaHRtbCkuCiAgICBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBuZXcgdmVyc2lvbiBkb2VzIG5vdCB1c2UgYC9kZWVwL2AsIGFuZCB0aGVyZWZvcmUgcmVxdWlyZXMKICAgIHlvdSB0byBpbXBvcnQgdGhlIGBkb20tbW9kdWxlc2AgaW4gZXZlcnkgZWxlbWVudCB0aGF0IG5lZWRzIHRvIHVzZSB0aGVtLgoKICAgIEBncm91cCBJcm9uIEVsZW1lbnRzCiAgICBAcHNldWRvRWxlbWVudCBpcm9uLWZsZXgtbGF5b3V0CiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBjb25zdCB0ZW1wbGF0ZSQxID0gaHRtbGAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBbaGlkZGVuXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT4KPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC0tbGF5b3V0OiB7CiAgICAgICAgZGlzcGxheTogLW1zLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1mbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH07CgogICAgICAtLWxheW91dC1pbmxpbmU6IHsKICAgICAgICBkaXNwbGF5OiAtbXMtaW5saW5lLWZsZXhib3g7CiAgICAgICAgZGlzcGxheTogLXdlYmtpdC1pbmxpbmUtZmxleDsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtZmxleDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWhvcml6b250YWw6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogcm93OwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC1kaXJlY3Rpb246IHJvdy1yZXZlcnNlOwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3ctcmV2ZXJzZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0OwoKICAgICAgICAtbXMtZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICAtd2Via2l0LWZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXZlcnRpY2FsLXJldmVyc2U6IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CgogICAgICAgIC1tcy1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgLXdlYmtpdC1mbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbi1yZXZlcnNlOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcDogewogICAgICAgIC1tcy1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgLXdlYmtpdC1mbGV4LXdyYXA6IHdyYXA7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtd3JhcC1yZXZlcnNlOiB7CiAgICAgICAgLW1zLWZsZXgtd3JhcDogd3JhcC1yZXZlcnNlOwogICAgICAgIC13ZWJraXQtZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgICAgZmxleC13cmFwOiB3cmFwLXJldmVyc2U7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LWF1dG86IHsKICAgICAgICAtbXMtZmxleDogMSAxIGF1dG87CiAgICAgICAgLXdlYmtpdC1mbGV4OiAxIDEgYXV0bzsKICAgICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtbm9uZTogewogICAgICAgIC1tcy1mbGV4OiBub25lOwogICAgICAgIC13ZWJraXQtZmxleDogbm9uZTsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleDogewogICAgICAgIC1tcy1mbGV4OiAxIDEgMC4wMDAwMDAwMDFweDsKICAgICAgICAtd2Via2l0LWZsZXg6IDE7CiAgICAgICAgZmxleDogMTsKICAgICAgICAtd2Via2l0LWZsZXgtYmFzaXM6IDAuMDAwMDAwMDAxcHg7CiAgICAgICAgZmxleC1iYXNpczogMC4wMDAwMDAwMDFweDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtMjogewogICAgICAgIC1tcy1mbGV4OiAyOwogICAgICAgIC13ZWJraXQtZmxleDogMjsKICAgICAgICBmbGV4OiAyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC0zOiB7CiAgICAgICAgLW1zLWZsZXg6IDM7CiAgICAgICAgLXdlYmtpdC1mbGV4OiAzOwogICAgICAgIGZsZXg6IDM7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTQ6IHsKICAgICAgICAtbXMtZmxleDogNDsKICAgICAgICAtd2Via2l0LWZsZXg6IDQ7CiAgICAgICAgZmxleDogNDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtNTogewogICAgICAgIC1tcy1mbGV4OiA1OwogICAgICAgIC13ZWJraXQtZmxleDogNTsKICAgICAgICBmbGV4OiA1OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC02OiB7CiAgICAgICAgLW1zLWZsZXg6IDY7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA2OwogICAgICAgIGZsZXg6IDY7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTc6IHsKICAgICAgICAtbXMtZmxleDogNzsKICAgICAgICAtd2Via2l0LWZsZXg6IDc7CiAgICAgICAgZmxleDogNzsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZsZXgtODogewogICAgICAgIC1tcy1mbGV4OiA4OwogICAgICAgIC13ZWJraXQtZmxleDogODsKICAgICAgICBmbGV4OiA4OwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZmxleC05OiB7CiAgICAgICAgLW1zLWZsZXg6IDk7CiAgICAgICAgLXdlYmtpdC1mbGV4OiA5OwogICAgICAgIGZsZXg6IDk7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEwOiB7CiAgICAgICAgLW1zLWZsZXg6IDEwOwogICAgICAgIC13ZWJraXQtZmxleDogMTA7CiAgICAgICAgZmxleDogMTA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTExOiB7CiAgICAgICAgLW1zLWZsZXg6IDExOwogICAgICAgIC13ZWJraXQtZmxleDogMTE7CiAgICAgICAgZmxleDogMTE7CiAgICAgIH07CgogICAgICAtLWxheW91dC1mbGV4LTEyOiB7CiAgICAgICAgLW1zLWZsZXg6IDEyOwogICAgICAgIC13ZWJraXQtZmxleDogMTI7CiAgICAgICAgZmxleDogMTI7CiAgICAgIH07CgogICAgICAvKiBhbGlnbm1lbnQgaW4gY3Jvc3MgYXhpcyAqLwoKICAgICAgLS1sYXlvdXQtc3RhcnQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlcjogewogICAgICAgIC1tcy1mbGV4LWFsaWduOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgIH07CgogICAgICAtLWxheW91dC1lbmQ6IHsKICAgICAgICAtbXMtZmxleC1hbGlnbjogZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGZsZXgtZW5kOwogICAgICAgIGFsaWduLWl0ZW1zOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWJhc2VsaW5lOiB7CiAgICAgICAgLW1zLWZsZXgtYWxpZ246IGJhc2VsaW5lOwogICAgICAgIC13ZWJraXQtYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLWl0ZW1zOiBiYXNlbGluZTsKICAgICAgfTsKCiAgICAgIC8qIGFsaWdubWVudCBpbiBtYWluIGF4aXMgKi8KCiAgICAgIC0tbGF5b3V0LXN0YXJ0LWp1c3RpZmllZDogewogICAgICAgIC1tcy1mbGV4LXBhY2s6IHN0YXJ0OwogICAgICAgIC13ZWJraXQtanVzdGlmeS1jb250ZW50OiBmbGV4LXN0YXJ0OwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1qdXN0aWZpZWQ6IHsKICAgICAgICAtbXMtZmxleC1wYWNrOiBlbmQ7CiAgICAgICAgLXdlYmtpdC1qdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1hcm91bmQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazogZGlzdHJpYnV0ZTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICAgIGp1c3RpZnktY29udGVudDogc3BhY2UtYXJvdW5kOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtanVzdGlmaWVkOiB7CiAgICAgICAgLW1zLWZsZXgtcGFjazoganVzdGlmeTsKICAgICAgICAtd2Via2l0LWp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItY2VudGVyOiB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfTsKCiAgICAgIC8qIHNlbGYgYWxpZ25tZW50ICovCgogICAgICAtLWxheW91dC1zZWxmLXN0YXJ0OiB7CiAgICAgICAgLW1zLWFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LXN0YXJ0OwogICAgICAgIGFsaWduLXNlbGY6IGZsZXgtc3RhcnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zZWxmLWNlbnRlcjogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgYWxpZ24tc2VsZjogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1lbmQ6IHsKICAgICAgICAtbXMtYWxpZ24tc2VsZjogZmxleC1lbmQ7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgICBhbGlnbi1zZWxmOiBmbGV4LWVuZDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LXNlbGYtc3RyZXRjaDogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICAgIC13ZWJraXQtYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgICBhbGlnbi1zZWxmOiBzdHJldGNoOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtc2VsZi1iYXNlbGluZTogewogICAgICAgIC1tcy1hbGlnbi1zZWxmOiBiYXNlbGluZTsKICAgICAgICAtd2Via2l0LWFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICAgIGFsaWduLXNlbGY6IGJhc2VsaW5lOwogICAgICB9OwoKICAgICAgLyogbXVsdGktbGluZSBhbGlnbm1lbnQgaW4gbWFpbiBheGlzICovCgogICAgICAtLWxheW91dC1zdGFydC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBzdGFydDsgIC8qIElFMTAgKi8KICAgICAgICAtbXMtYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IGZsZXgtc3RhcnQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1zdGFydDsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWVuZC1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBlbmQ7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IGZsZXgtZW5kOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24tY29udGVudDogZmxleC1lbmQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1jZW50ZXItYWxpZ25lZDogewogICAgICAgIC1tcy1mbGV4LWxpbmUtcGFjazogY2VudGVyOyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC1hbGlnbi1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgYWxpZ24tY29udGVudDogY2VudGVyOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYmV0d2Vlbi1hbGlnbmVkOiB7CiAgICAgICAgLW1zLWZsZXgtbGluZS1wYWNrOiBqdXN0aWZ5OyAgLyogSUUxMCAqLwogICAgICAgIC1tcy1hbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICAgIC13ZWJraXQtYWxpZ24tY29udGVudDogc3BhY2UtYmV0d2VlbjsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtYXJvdW5kLWFsaWduZWQ6IHsKICAgICAgICAtbXMtZmxleC1saW5lLXBhY2s6IGRpc3RyaWJ1dGU7ICAvKiBJRTEwICovCiAgICAgICAgLW1zLWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICAtd2Via2l0LWFsaWduLWNvbnRlbnQ6IHNwYWNlLWFyb3VuZDsKICAgICAgICBhbGlnbi1jb250ZW50OiBzcGFjZS1hcm91bmQ7CiAgICAgIH07CgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICAgICAgICAgICAgT3RoZXIgTGF5b3V0CiAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgICAtLWxheW91dC1ibG9jazogewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtaW52aXNpYmxlOiB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7CiAgICAgIH07CgogICAgICAtLWxheW91dC1yZWxhdGl2ZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfTsKCiAgICAgIC0tbGF5b3V0LWZpdDogewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1zY3JvbGw6IHsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgIH07CgogICAgICAtLWxheW91dC1mdWxsYmxlZWQ6IHsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgaGVpZ2h0OiAxMDB2aDsKICAgICAgfTsKCiAgICAgIC8qIGZpeGVkIHBvc2l0aW9uICovCgogICAgICAtLWxheW91dC1maXhlZC10b3A6IHsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgdG9wOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgIH07CgogICAgICAtLWxheW91dC1maXhlZC1yaWdodDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtYm90dG9tOiB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9OwoKICAgICAgLS1sYXlvdXQtZml4ZWQtbGVmdDogewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgIH07CgogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPmA7CgogICAgdGVtcGxhdGUkMS5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmU7Jyk7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlJDEuY29udGVudCk7CgogICAgdmFyIHN0eWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgIHN0eWxlLnRleHRDb250ZW50ID0gJ1toaWRkZW5dIHsgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OyB9JzsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGNsYXNzIElyb25NZXRhIHsKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7ewogICAgICAgKiAgIHR5cGU6IChzdHJpbmd8bnVsbHx1bmRlZmluZWQpLAogICAgICAgKiAgIGtleTogKHN0cmluZ3xudWxsfHVuZGVmaW5lZCksCiAgICAgICAqICAgdmFsdWU6ICosCiAgICAgICAqIH09fSBvcHRpb25zCiAgICAgICAqLwogICAgICBjb25zdHJ1Y3RvcihvcHRpb25zKSB7CiAgICAgICAgSXJvbk1ldGFbJyAnXShvcHRpb25zKTsKCiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd9ICovCiAgICAgICAgdGhpcy50eXBlID0gKG9wdGlvbnMgJiYgb3B0aW9ucy50eXBlKSB8fCAnZGVmYXVsdCc7CiAgICAgICAgLyoqIEB0eXBlIHtzdHJpbmd8bnVsbHx1bmRlZmluZWR9ICovCiAgICAgICAgdGhpcy5rZXkgPSBvcHRpb25zICYmIG9wdGlvbnMua2V5OwogICAgICAgIGlmIChvcHRpb25zICYmICd2YWx1ZScgaW4gb3B0aW9ucykgewogICAgICAgICAgLyoqIEB0eXBlIHsqfSAqLwogICAgICAgICAgdGhpcy52YWx1ZSA9IG9wdGlvbnMudmFsdWU7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiogQHJldHVybiB7Kn0gKi8KICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOwogICAgICAgIHZhciBrZXkgPSB0aGlzLmtleTsKCiAgICAgICAgaWYgKHR5cGUgJiYga2V5KSB7CiAgICAgICAgICByZXR1cm4gSXJvbk1ldGEudHlwZXNbdHlwZV0gJiYgSXJvbk1ldGEudHlwZXNbdHlwZV1ba2V5XTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKiBAcGFyYW0geyp9IHZhbHVlICovCiAgICAgIHNldCB2YWx1ZSh2YWx1ZSkgewogICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOwogICAgICAgIHZhciBrZXkgPSB0aGlzLmtleTsKCiAgICAgICAgaWYgKHR5cGUgJiYga2V5KSB7CiAgICAgICAgICB0eXBlID0gSXJvbk1ldGEudHlwZXNbdHlwZV0gPSBJcm9uTWV0YS50eXBlc1t0eXBlXSB8fCB7fTsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIGRlbGV0ZSB0eXBlW2tleV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0eXBlW2tleV0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKiBAcmV0dXJuIHshQXJyYXk8Kj59ICovCiAgICAgIGdldCBsaXN0KCkgewogICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOwoKICAgICAgICBpZiAodHlwZSkgewogICAgICAgICAgdmFyIGl0ZW1zID0gSXJvbk1ldGEudHlwZXNbdGhpcy50eXBlXTsKICAgICAgICAgIGlmICghaXRlbXMpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhpdGVtcykubWFwKGZ1bmN0aW9uKGtleSkgewogICAgICAgICAgICByZXR1cm4gbWV0YURhdGFzW3RoaXMudHlwZV1ba2V5XTsKICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkKICAgICAgICogQHJldHVybiB7Kn0KICAgICAgICovCiAgICAgIGJ5S2V5KGtleSkgewogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgIHJldHVybiB0aGlzLnZhbHVlOwogICAgICB9CiAgICB9CiAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY29udmluY2UgQ2xvc3VyZSBub3QgdG8gcmVtb3ZlIGNvbnN0cnVjdG9yIGNhbGxzCiAgICAvLyBmb3IgaW5zdGFuY2VzIHRoYXQgYXJlIG5vdCBoZWxkIGFueXdoZXJlLiBGb3IgZXhhbXBsZSwgd2hlbgogICAgLy8gYG5ldyBJcm9uTWV0YSh7Li4ufSlgIGlzIHVzZWQgb25seSBmb3IgdGhlIHNpZGUgZWZmZWN0IG9mIGFkZGluZyBhIHZhbHVlLgogICAgSXJvbk1ldGFbJyAnXSA9IGZ1bmN0aW9uKCkge307CgogICAgSXJvbk1ldGEudHlwZXMgPSB7fTsKCiAgICB2YXIgbWV0YURhdGFzID0gSXJvbk1ldGEudHlwZXM7CgogICAgLyoqCiAgICBgaXJvbi1tZXRhYCBpcyBhIGdlbmVyaWMgZWxlbWVudCB5b3UgY2FuIHVzZSBmb3Igc2hhcmluZyBpbmZvcm1hdGlvbiBhY3Jvc3MgdGhlCiAgICBET00gdHJlZS4gSXQgdXNlcyBbbW9ub3N0YXRlIHBhdHRlcm5dKGh0dHA6Ly9jMi5jb20vY2dpL3dpa2k/TW9ub3N0YXRlUGF0dGVybikKICAgIHN1Y2ggdGhhdCBhbnkgaW5zdGFuY2Ugb2YgaXJvbi1tZXRhIGhhcyBhY2Nlc3MgdG8gdGhlIHNoYXJlZCBpbmZvcm1hdGlvbi4gWW91CiAgICBjYW4gdXNlIGBpcm9uLW1ldGFgIHRvIHNoYXJlIHdoYXRldmVyIHlvdSB3YW50IChvciBjcmVhdGUgYW4gZXh0ZW5zaW9uIFtsaWtlCiAgICB4LW1ldGFdIGZvciBlbmhhbmNlbWVudHMpLgoKICAgIFRoZSBgaXJvbi1tZXRhYCBpbnN0YW5jZXMgY29udGFpbmluZyB5b3VyIGFjdHVhbCBkYXRhIGNhbiBiZSBsb2FkZWQgaW4gYW4KICAgIGltcG9ydCwgb3IgY29uc3RydWN0ZWQgaW4gYW55IHdheSB5b3Ugc2VlIGZpdC4gVGhlIG9ubHkgcmVxdWlyZW1lbnQgaXMgdGhhdCB5b3UKICAgIGNyZWF0ZSB0aGVtIGJlZm9yZSB5b3UgdHJ5IHRvIGFjY2VzcyB0aGVtLgoKICAgIEV4YW1wbGVzOgoKICAgIElmIEkgY3JlYXRlIGFuIGluc3RhbmNlIGxpa2UgdGhpczoKCiAgICAgICAgPGlyb24tbWV0YSBrZXk9ImluZm8iIHZhbHVlPSJmb28vYmFyIj48L2lyb24tbWV0YT4KCiAgICBOb3RlIHRoYXQgdmFsdWU9ImZvby9iYXIiIGlzIHRoZSBtZXRhZGF0YSBJJ3ZlIGRlZmluZWQuIEkgY291bGQgZGVmaW5lIG1vcmUKICAgIGF0dHJpYnV0ZXMgb3IgdXNlIGNoaWxkIG5vZGVzIHRvIGRlZmluZSBhZGRpdGlvbmFsIG1ldGFkYXRhLgoKICAgIE5vdyBJIGNhbiBhY2Nlc3MgdGhhdCBlbGVtZW50IChhbmQgaXQncyBtZXRhZGF0YSkgZnJvbSBhbnkgaXJvbi1tZXRhIGluc3RhbmNlCiAgICB2aWEgdGhlIGJ5S2V5IG1ldGhvZCwgZS5nLgoKICAgICAgICBtZXRhLmJ5S2V5KCdpbmZvJyk7CgogICAgUHVyZSBpbXBlcmF0aXZlIGZvcm0gd291bGQgYmUgbGlrZToKCiAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaXJvbi1tZXRhJykuYnlLZXkoJ2luZm8nKTsKCiAgICBPciwgaW4gYSBQb2x5bWVyIGVsZW1lbnQsIHlvdSBjYW4gaW5jbHVkZSBhIG1ldGEgaW4geW91ciB0ZW1wbGF0ZToKCiAgICAgICAgPGlyb24tbWV0YSBpZD0ibWV0YSI+PC9pcm9uLW1ldGE+CiAgICAgICAgLi4uCiAgICAgICAgdGhpcy4kLm1ldGEuYnlLZXkoJ2luZm8nKTsKCiAgICBAZ3JvdXAgSXJvbiBFbGVtZW50cwogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICBAZWxlbWVudCBpcm9uLW1ldGEKICAgICovCiAgICBQb2x5bWVyKHsKCiAgICAgIGlzOiAnaXJvbi1tZXRhJywKCiAgICAgIHByb3BlcnRpZXM6IHsKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHR5cGUgb2YgbWV0YS1kYXRhLiAgQWxsIG1ldGEtZGF0YSBvZiB0aGUgc2FtZSB0eXBlIGlzIHN0b3JlZAogICAgICAgICAqIHRvZ2V0aGVyLgogICAgICAgICAqIEB0eXBlIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgdHlwZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgdmFsdWU6ICdkZWZhdWx0JywKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUga2V5IHVzZWQgdG8gc3RvcmUgYHZhbHVlYCB1bmRlciB0aGUgYHR5cGVgIG5hbWVzcGFjZS4KICAgICAgICAgKiBAdHlwZSB7P3N0cmluZ30KICAgICAgICAgKi8KICAgICAgICBrZXk6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbWV0YS1kYXRhIHRvIHN0b3JlIG9yIHJldHJpZXZlLgogICAgICAgICAqIEB0eXBlIHsqfQogICAgICAgICAqLwogICAgICAgIHZhbHVlOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgYHZhbHVlYCBpcyBzZXQgdG8gdGhlIGlyb24tbWV0YSBpbnN0YW5jZSBpdHNlbGYuCiAgICAgICAgICovCiAgICAgICAgc2VsZjoge3R5cGU6IEJvb2xlYW4sIG9ic2VydmVyOiAnX3NlbGZDaGFuZ2VkJ30sCgogICAgICAgIF9fbWV0YToge3R5cGU6IEJvb2xlYW4sIGNvbXB1dGVkOiAnX19jb21wdXRlTWV0YSh0eXBlLCBrZXksIHZhbHVlKSd9CiAgICAgIH0sCgogICAgICBob3N0QXR0cmlidXRlczoge2hpZGRlbjogdHJ1ZX0sCgogICAgICBfX2NvbXB1dGVNZXRhOiBmdW5jdGlvbih0eXBlLCBrZXksIHZhbHVlKSB7CiAgICAgICAgdmFyIG1ldGEgPSBuZXcgSXJvbk1ldGEoe3R5cGU6IHR5cGUsIGtleToga2V5fSk7CgogICAgICAgIGlmICh2YWx1ZSAhPT0gdW5kZWZpbmVkICYmIHZhbHVlICE9PSBtZXRhLnZhbHVlKSB7CiAgICAgICAgICBtZXRhLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnZhbHVlICE9PSBtZXRhLnZhbHVlKSB7CiAgICAgICAgICB0aGlzLnZhbHVlID0gbWV0YS52YWx1ZTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBtZXRhOwogICAgICB9LAoKICAgICAgZ2V0IGxpc3QoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX19tZXRhICYmIHRoaXMuX19tZXRhLmxpc3Q7CiAgICAgIH0sCgogICAgICBfc2VsZkNoYW5nZWQ6IGZ1bmN0aW9uKHNlbGYpIHsKICAgICAgICBpZiAoc2VsZikgewogICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXM7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHJpZXZlcyBtZXRhIGRhdGEgdmFsdWUgYnkga2V5LgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGJ5S2V5CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgbWV0YS1kYXRhIHRvIGJlIHJldHVybmVkLgogICAgICAgKiBAcmV0dXJuIHsqfQogICAgICAgKi8KICAgICAgYnlLZXk6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHJldHVybiBuZXcgSXJvbk1ldGEoe3R5cGU6IHRoaXMudHlwZSwga2V5OiBrZXl9KS52YWx1ZTsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCgogICAgVGhlIGBpcm9uLWljb25gIGVsZW1lbnQgZGlzcGxheXMgYW4gaWNvbi4gQnkgZGVmYXVsdCBhbiBpY29uIHJlbmRlcnMgYXMgYSAyNHB4CiAgICBzcXVhcmUuCgogICAgRXhhbXBsZSB1c2luZyBzcmM6CgogICAgICAgIDxpcm9uLWljb24gc3JjPSJzdGFyLnBuZyI+PC9pcm9uLWljb24+CgogICAgRXhhbXBsZSBzZXR0aW5nIHNpemUgdG8gMzJweCB4IDMycHg6CgogICAgICAgIDxpcm9uLWljb24gY2xhc3M9ImJpZyIgc3JjPSJiaWdfc3Rhci5wbmciPjwvaXJvbi1pY29uPgoKICAgICAgICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICAgICAgICAuYmlnIHsKICAgICAgICAgICAgLS1pcm9uLWljb24taGVpZ2h0OiAzMnB4OwogICAgICAgICAgICAtLWlyb24taWNvbi13aWR0aDogMzJweDsKICAgICAgICAgIH0KICAgICAgICA8L3N0eWxlPgoKICAgIFRoZSBpcm9uIGVsZW1lbnRzIGluY2x1ZGUgc2V2ZXJhbCBzZXRzIG9mIGljb25zLiBUbyB1c2UgdGhlIGRlZmF1bHQgc2V0IG9mCiAgICBpY29ucywgaW1wb3J0IGBpcm9uLWljb25zLmpzYCBhbmQgdXNlIHRoZSBgaWNvbmAgYXR0cmlidXRlIHRvIHNwZWNpZnkgYW4gaWNvbjoKCiAgICAgICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiPgogICAgICAgICAgaW1wb3J0ICJAcG9seW1lci9pcm9uLWljb25zL2lyb24taWNvbnMuanMiOwogICAgICAgIDwvSkFWQV9TQ1JJSUlJUFQvPgoKICAgICAgICA8aXJvbi1pY29uIGljb249Im1lbnUiPjwvaXJvbi1pY29uPgoKICAgIFRvIHVzZSBhIGRpZmZlcmVudCBidWlsdC1pbiBzZXQgb2YgaWNvbnMsIGltcG9ydCB0aGUgc3BlY2lmaWMKICAgIGBpcm9uLWljb25zLzxpY29uc2V0Pi1pY29ucy5qc2AsIGFuZCBzcGVjaWZ5IHRoZSBpY29uIGFzIGA8aWNvbnNldD46PGljb24+YC4KICAgIEZvciBleGFtcGxlLCB0byB1c2UgYSBjb21tdW5pY2F0aW9uIGljb24sIHlvdSB3b3VsZCB1c2U6CgogICAgICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIj4KICAgICAgICAgIGltcG9ydCAiQHBvbHltZXIvaXJvbi1pY29ucy9jb21tdW5pY2F0aW9uLWljb25zLmpzIjsKICAgICAgICA8L0pBVkFfU0NSSUlJSVBULz4KCiAgICAgICAgPGlyb24taWNvbiBpY29uPSJjb21tdW5pY2F0aW9uOmVtYWlsIj48L2lyb24taWNvbj4KCiAgICBZb3UgY2FuIGFsc28gY3JlYXRlIGN1c3RvbSBpY29uIHNldHMgb2YgYml0bWFwIG9yIFNWRyBpY29ucy4KCiAgICBFeGFtcGxlIG9mIHVzaW5nIGFuIGljb24gbmFtZWQgYGNoZXJyeWAgZnJvbSBhIGN1c3RvbSBpY29uc2V0IHdpdGggdGhlIElECiAgICBgZnJ1aXRgOgoKICAgICAgICA8aXJvbi1pY29uIGljb249ImZydWl0OmNoZXJyeSI+PC9pcm9uLWljb24+CgogICAgU2VlIGA8aXJvbi1pY29uc2V0PmAgYW5kIGA8aXJvbi1pY29uc2V0LXN2Zz5gIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0bwogICAgY3JlYXRlIGEgY3VzdG9tIGljb25zZXQuCgogICAgU2VlIHRoZSBgaXJvbi1pY29uc2AgZGVtbyB0byBzZWUgdGhlIGljb25zIGF2YWlsYWJsZSBpbiB0aGUgdmFyaW91cyBpY29uc2V0cy4KCiAgICAjIyMgU3R5bGluZwoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1pcm9uLWljb25gIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgaWNvbiB8IHt9CiAgICBgLS1pcm9uLWljb24td2lkdGhgIHwgV2lkdGggb2YgdGhlIGljb24gfCBgMjRweGAKICAgIGAtLWlyb24taWNvbi1oZWlnaHRgIHwgSGVpZ2h0IG9mIHRoZSBpY29uIHwgYDI0cHhgCiAgICBgLS1pcm9uLWljb24tZmlsbC1jb2xvcmAgfCBGaWxsIGNvbG9yIG9mIHRoZSBzdmcgaWNvbiB8IGBjdXJyZW50Y29sb3JgCiAgICBgLS1pcm9uLWljb24tc3Ryb2tlLWNvbG9yYCB8IFN0cm9rZSBjb2xvciBvZiB0aGUgc3ZnIGljb24gfCBub25lCgogICAgQGdyb3VwIElyb24gRWxlbWVudHMKICAgIEBlbGVtZW50IGlyb24taWNvbgogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICBAaGVybyBoZXJvLnN2ZwogICAgQGhvbWVwYWdlIHBvbHltZXIuZ2l0aHViLmlvCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC1pbmxpbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwoKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBmaWxsOiB2YXIoLS1pcm9uLWljb24tZmlsbC1jb2xvciwgY3VycmVudGNvbG9yKTsKICAgICAgICBzdHJva2U6IHZhcigtLWlyb24taWNvbi1zdHJva2UtY29sb3IsIG5vbmUpOwoKICAgICAgICB3aWR0aDogdmFyKC0taXJvbi1pY29uLXdpZHRoLCAyNHB4KTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWlyb24taWNvbi1oZWlnaHQsIDI0cHgpOwogICAgICAgIEBhcHBseSAtLWlyb24taWNvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICA8L3N0eWxlPgpgLAoKICAgICAgaXM6ICdpcm9uLWljb24nLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaWNvbiB0byB1c2UuIFRoZSBuYW1lIHNob3VsZCBiZSBvZiB0aGUgZm9ybToKICAgICAgICAgKiBgaWNvbnNldF9uYW1lOmljb25fbmFtZWAuCiAgICAgICAgICovCiAgICAgICAgaWNvbjoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB0aGVtZSB0byB1c2VkLCBpZiBvbmUgaXMgc3BlY2lmaWVkIGJ5IHRoZQogICAgICAgICAqIGljb25zZXQuCiAgICAgICAgICovCiAgICAgICAgdGhlbWU6IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB1c2luZyBpcm9uLWljb24gd2l0aG91dCBhbiBpY29uc2V0LCB5b3UgY2FuIHNldCB0aGUgc3JjIHRvIGJlCiAgICAgICAgICogdGhlIFVSTCBvZiBhbiBpbmRpdmlkdWFsIGljb24gaW1hZ2UgZmlsZS4gTm90ZSB0aGF0IHRoaXMgd2lsbCB0YWtlCiAgICAgICAgICogcHJlY2VkZW5jZSBvdmVyIGEgZ2l2ZW4gaWNvbiBhdHRyaWJ1dGUuCiAgICAgICAgICovCiAgICAgICAgc3JjOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHR5cGUgeyFJcm9uTWV0YX0KICAgICAgICAgKi8KICAgICAgICBfbWV0YToge3ZhbHVlOiBCYXNlLmNyZWF0ZSgnaXJvbi1tZXRhJywge3R5cGU6ICdpY29uc2V0J30pfQoKICAgICAgfSwKCiAgICAgIG9ic2VydmVyczogWwogICAgICAgICdfdXBkYXRlSWNvbihfbWV0YSwgaXNBdHRhY2hlZCknLAogICAgICAgICdfdXBkYXRlSWNvbih0aGVtZSwgaXNBdHRhY2hlZCknLAogICAgICAgICdfc3JjQ2hhbmdlZChzcmMsIGlzQXR0YWNoZWQpJywKICAgICAgICAnX2ljb25DaGFuZ2VkKGljb24sIGlzQXR0YWNoZWQpJwogICAgICBdLAoKICAgICAgX0RFRkFVTFRfSUNPTlNFVDogJ2ljb25zJywKCiAgICAgIF9pY29uQ2hhbmdlZDogZnVuY3Rpb24oaWNvbikgewogICAgICAgIHZhciBwYXJ0cyA9IChpY29uIHx8ICcnKS5zcGxpdCgnOicpOwogICAgICAgIHRoaXMuX2ljb25OYW1lID0gcGFydHMucG9wKCk7CiAgICAgICAgdGhpcy5faWNvbnNldE5hbWUgPSBwYXJ0cy5wb3AoKSB8fCB0aGlzLl9ERUZBVUxUX0lDT05TRVQ7CiAgICAgICAgdGhpcy5fdXBkYXRlSWNvbigpOwogICAgICB9LAoKICAgICAgX3NyY0NoYW5nZWQ6IGZ1bmN0aW9uKHNyYykgewogICAgICAgIHRoaXMuX3VwZGF0ZUljb24oKTsKICAgICAgfSwKCiAgICAgIF91c2VzSWNvbnNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaWNvbiB8fCAhdGhpcy5zcmM7CiAgICAgIH0sCgogICAgICAvKiogQHN1cHByZXNzIHt2aXNpYmlsaXR5fSAqLwogICAgICBfdXBkYXRlSWNvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX3VzZXNJY29uc2V0KCkpIHsKICAgICAgICAgIGlmICh0aGlzLl9pbWcgJiYgdGhpcy5faW1nLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgZG9tKHRoaXMucm9vdCkucmVtb3ZlQ2hpbGQodGhpcy5faW1nKTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLl9pY29uTmFtZSA9PT0gJycpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2ljb25zZXQpIHsKICAgICAgICAgICAgICB0aGlzLl9pY29uc2V0LnJlbW92ZUljb24odGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5faWNvbnNldE5hbWUgJiYgdGhpcy5fbWV0YSkgewogICAgICAgICAgICB0aGlzLl9pY29uc2V0ID0gLyoqIEB0eXBlIHs/UG9seW1lci5JY29uc2V0fSAqLyAoCiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhLmJ5S2V5KHRoaXMuX2ljb25zZXROYW1lKSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9pY29uc2V0KSB7CiAgICAgICAgICAgICAgdGhpcy5faWNvbnNldC5hcHBseUljb24odGhpcywgdGhpcy5faWNvbk5hbWUsIHRoaXMudGhlbWUpOwogICAgICAgICAgICAgIHRoaXMudW5saXN0ZW4od2luZG93LCAnaXJvbi1pY29uc2V0LWFkZGVkJywgJ191cGRhdGVJY29uJyk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgdGhpcy5saXN0ZW4od2luZG93LCAnaXJvbi1pY29uc2V0LWFkZGVkJywgJ191cGRhdGVJY29uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHRoaXMuX2ljb25zZXQpIHsKICAgICAgICAgICAgdGhpcy5faWNvbnNldC5yZW1vdmVJY29uKHRoaXMpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCF0aGlzLl9pbWcpIHsKICAgICAgICAgICAgdGhpcy5faW1nID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaW1nJyk7CiAgICAgICAgICAgIHRoaXMuX2ltZy5zdHlsZS53aWR0aCA9ICcxMDAlJzsKICAgICAgICAgICAgdGhpcy5faW1nLnN0eWxlLmhlaWdodCA9ICcxMDAlJzsKICAgICAgICAgICAgdGhpcy5faW1nLmRyYWdnYWJsZSA9IGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5faW1nLnNyYyA9IHRoaXMuc3JjOwogICAgICAgICAgZG9tKHRoaXMucm9vdCkuYXBwZW5kQ2hpbGQodGhpcy5faW1nKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgLyoqCiAgICAgKiBUaGUgYGlyb24taWNvbnNldC1zdmdgIGVsZW1lbnQgYWxsb3dzIHVzZXJzIHRvIGRlZmluZSB0aGVpciBvd24gaWNvbiBzZXRzCiAgICAgKiB0aGF0IGNvbnRhaW4gc3ZnIGljb25zLiBUaGUgc3ZnIGljb24gZWxlbWVudHMgc2hvdWxkIGJlIGNoaWxkcmVuIG9mIHRoZQogICAgICogYGlyb24taWNvbnNldC1zdmdgIGVsZW1lbnQuIE11bHRpcGxlIGljb25zIHNob3VsZCBiZSBnaXZlbiBkaXN0aW5jdCBpZCdzLgogICAgICoKICAgICAqIFVzaW5nIHN2ZyBlbGVtZW50cyB0byBjcmVhdGUgaWNvbnMgaGFzIGEgZmV3IGFkdmFudGFnZXMgb3ZlciB0cmFkaXRpb25hbAogICAgICogYml0bWFwIGdyYXBoaWNzIGxpa2UganBnIG9yIHBuZy4gSWNvbnMgdGhhdCB1c2Ugc3ZnIGFyZSB2ZWN0b3IgYmFzZWQgc28KICAgICAqIHRoZXkgYXJlIHJlc29sdXRpb24gaW5kZXBlbmRlbnQgYW5kIHNob3VsZCBsb29rIGdvb2Qgb24gYW55IGRldmljZS4gVGhleQogICAgICogYXJlIHN0eWxhYmxlIHZpYSBjc3MuIEljb25zIGNhbiBiZSB0aGVtZWQsIGNvbG9yaXplZCwgYW5kIGV2ZW4gYW5pbWF0ZWQuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgPGlyb24taWNvbnNldC1zdmcgbmFtZT0ibXktc3ZnLWljb25zIiBzaXplPSIyNCI+CiAgICAgKiAgICAgICA8c3ZnPgogICAgICogICAgICAgICA8ZGVmcz4KICAgICAqICAgICAgICAgICA8ZyBpZD0ic2hhcGUiPgogICAgICogICAgICAgICAgICAgPHJlY3QgeD0iMTIiIHk9IjAiIHdpZHRoPSIxMiIgaGVpZ2h0PSIyNCIgLz4KICAgICAqICAgICAgICAgICAgIDxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjEyIiAvPgogICAgICogICAgICAgICAgIDwvZz4KICAgICAqICAgICAgICAgPC9kZWZzPgogICAgICogICAgICAgPC9zdmc+CiAgICAgKiAgICAgPC9pcm9uLWljb25zZXQtc3ZnPgogICAgICoKICAgICAqIFRoaXMgd2lsbCBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyIHRoZSBpY29uIHNldCAibXktc3ZnLWljb25zIiB0byB0aGUgaWNvbnNldAogICAgICogZGF0YWJhc2UuICBUbyB1c2UgdGhlc2UgaWNvbnMgZnJvbSB3aXRoaW4gYW5vdGhlciBlbGVtZW50LCBtYWtlIGEKICAgICAqIGBpcm9uLWljb25zZXRgIGVsZW1lbnQgYW5kIGNhbGwgdGhlIGBieUlkYCBtZXRob2QKICAgICAqIHRvIHJldHJpZXZlIGEgZ2l2ZW4gaWNvbnNldC4gVG8gYXBwbHkgYSBwYXJ0aWN1bGFyIGljb24gaW5zaWRlIGFuCiAgICAgKiBlbGVtZW50IHVzZSB0aGUgYGFwcGx5SWNvbmAgbWV0aG9kLiBGb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgaWNvbnNldC5hcHBseUljb24oaWNvbk5vZGUsICdjYXInKTsKICAgICAqCiAgICAgKiBAZWxlbWVudCBpcm9uLWljb25zZXQtc3ZnCiAgICAgKiBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAqIEBpbXBsZW1lbnRzIHtQb2x5bWVyLkljb25zZXR9CiAgICAgKi8KICAgIFBvbHltZXIoewogICAgICBpczogJ2lyb24taWNvbnNldC1zdmcnLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgaWNvbnNldC4KICAgICAgICAgKi8KICAgICAgICBuYW1lOiB7dHlwZTogU3RyaW5nLCBvYnNlcnZlcjogJ19uYW1lQ2hhbmdlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2l6ZSBvZiBhbiBpbmRpdmlkdWFsIGljb24uIE5vdGUgdGhhdCBpY29ucyBtdXN0IGJlIHNxdWFyZS4KICAgICAgICAgKi8KICAgICAgICBzaXplOiB7dHlwZTogTnVtYmVyLCB2YWx1ZTogMjR9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgbWlycm9yaW5nIG9mIGljb25zIHdoZXJlIHNwZWNpZmllZCB3aGVuIHRoZXkgYXJlCiAgICAgICAgICogc3RhbXBlZC4gSWNvbnMgdGhhdCBzaG91bGQgYmUgbWlycm9yZWQgc2hvdWxkIGJlIGRlY29yYXRlZCB3aXRoIGEKICAgICAgICAgKiBgbWlycm9yLWluLXJ0bGAgYXR0cmlidXRlLgogICAgICAgICAqCiAgICAgICAgICogTk9URTogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIGRpcmVjdGlvbiB3aWxsIGJlIHJlc29sdmVkIG9uY2UgcGVyCiAgICAgICAgICogZG9jdW1lbnQgcGVyIGljb25zZXQsIHNvIG1vdmluZyBpY29ucyBpbiBhbmQgb3V0IG9mIFJUTCBzdWJ0cmVlcyB3aWxsCiAgICAgICAgICogbm90IGNhdXNlIHRoZWlyIG1pcnJvcmVkIHN0YXRlIHRvIGNoYW5nZS4KICAgICAgICAgKi8KICAgICAgICBydGxNaXJyb3Jpbmc6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBtZWFzdXJlIFJUTCBiYXNlZCBvbiB0aGUgZGlyIGF0dHJpYnV0ZSBvbiB0aGUgYm9keSBvcgogICAgICAgICAqIGh0bWwgZWxlbWVudHMgKG1lYXN1cmVkIG9uIGRvY3VtZW50LmJvZHkgb3IgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50IGFzCiAgICAgICAgICogYXZhaWxhYmxlKS4KICAgICAgICAgKi8KICAgICAgICB1c2VHbG9iYWxSdGxBdHRyaWJ1dGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9CiAgICAgIH0sCgogICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9tZXRhID0gbmV3IElyb25NZXRhKHt0eXBlOiAnaWNvbnNldCcsIGtleTogbnVsbCwgdmFsdWU6IG51bGx9KTsKICAgICAgfSwKCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ29uc3RydWN0IGFuIGFycmF5IG9mIGFsbCBpY29uIG5hbWVzIGluIHRoaXMgaWNvbnNldC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUFycmF5fSBBcnJheSBvZiBpY29uIG5hbWVzLgogICAgICAgKi8KICAgICAgZ2V0SWNvbk5hbWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9pY29ucyA9IHRoaXMuX2NyZWF0ZUljb25NYXAoKTsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5faWNvbnMpLm1hcChmdW5jdGlvbihuKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lICsgJzonICsgbjsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBcHBsaWVzIGFuIGljb24gdG8gdGhlIGdpdmVuIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEFuIHN2ZyBpY29uIGlzIHByZXBlbmRlZCB0byB0aGUgZWxlbWVudCdzIHNoYWRvd1Jvb3QgaWYgaXQgZXhpc3RzLAogICAgICAgKiBvdGhlcndpc2UgdG8gdGhlIGVsZW1lbnQgaXRzZWxmLgogICAgICAgKgogICAgICAgKiBJZiBSVEwgbWlycm9yaW5nIGlzIGVuYWJsZWQsIGFuZCB0aGUgaWNvbiBpcyBtYXJrZWQgdG8gYmUgbWlycm9yZWQgaW4KICAgICAgICogUlRMLCB0aGUgZWxlbWVudCB3aWxsIGJlIHRlc3RlZCAob25jZSBhbmQgb25seSBvbmNlIGV2ZXIgZm9yIGVhY2gKICAgICAgICogaWNvbnNldCkgdG8gZGV0ZXJtaW5lIHRoZSBkaXJlY3Rpb24gb2YgdGhlIHN1YnRyZWUgdGhlIGVsZW1lbnQgaXMgaW4uCiAgICAgICAqIFRoaXMgZGlyZWN0aW9uIHdpbGwgYXBwbHkgdG8gYWxsIGZ1dHVyZSBpY29uIGFwcGxpY2F0aW9ucywgYWx0aG91Z2ggb25seQogICAgICAgKiBpY29ucyBtYXJrZWQgdG8gYmUgbWlycm9yZWQgd2lsbCBiZSBhZmZlY3RlZC4KICAgICAgICoKICAgICAgICogQG1ldGhvZCBhcHBseUljb24KICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IEVsZW1lbnQgdG8gd2hpY2ggdGhlIGljb24gaXMgYXBwbGllZC4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGljb25OYW1lIE5hbWUgb2YgdGhlIGljb24gdG8gYXBwbHkuCiAgICAgICAqIEByZXR1cm4gez9FbGVtZW50fSBUaGUgc3ZnIGVsZW1lbnQgd2hpY2ggcmVuZGVycyB0aGUgaWNvbi4KICAgICAgICovCiAgICAgIGFwcGx5SWNvbjogZnVuY3Rpb24oZWxlbWVudCwgaWNvbk5hbWUpIHsKICAgICAgICAvLyBSZW1vdmUgb2xkIHN2ZyBlbGVtZW50CiAgICAgICAgdGhpcy5yZW1vdmVJY29uKGVsZW1lbnQpOwogICAgICAgIC8vIGluc3RhbGwgbmV3IHN2ZyBlbGVtZW50CiAgICAgICAgdmFyIHN2ZyA9IHRoaXMuX2Nsb25lSWNvbigKICAgICAgICAgICAgaWNvbk5hbWUsIHRoaXMucnRsTWlycm9yaW5nICYmIHRoaXMuX3RhcmdldElzUlRMKGVsZW1lbnQpKTsKICAgICAgICBpZiAoc3ZnKSB7CiAgICAgICAgICAvLyBpbnNlcnQgc3ZnIGVsZW1lbnQgaW50byBzaGFkb3cgcm9vdCwgaWYgaXQgZXhpc3RzCiAgICAgICAgICB2YXIgcGRlID0gZG9tKGVsZW1lbnQucm9vdCB8fCBlbGVtZW50KTsKICAgICAgICAgIHBkZS5pbnNlcnRCZWZvcmUoc3ZnLCBwZGUuY2hpbGROb2Rlc1swXSk7CiAgICAgICAgICByZXR1cm4gZWxlbWVudC5fc3ZnSWNvbiA9IHN2ZzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVtb3ZlIGFuIGljb24gZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudCBieSB1bmRvaW5nIHRoZSBjaGFuZ2VzIGVmZmVjdGVkCiAgICAgICAqIGJ5IGBhcHBseUljb25gLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1lbnQgVGhlIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgaWNvbiBpcyByZW1vdmVkLgogICAgICAgKi8KICAgICAgcmVtb3ZlSWNvbjogZnVuY3Rpb24oZWxlbWVudCkgewogICAgICAgIC8vIFJlbW92ZSBvbGQgc3ZnIGVsZW1lbnQKICAgICAgICBpZiAoZWxlbWVudC5fc3ZnSWNvbikgewogICAgICAgICAgZG9tKGVsZW1lbnQucm9vdCB8fCBlbGVtZW50KS5yZW1vdmVDaGlsZChlbGVtZW50Ll9zdmdJY29uKTsKICAgICAgICAgIGVsZW1lbnQuX3N2Z0ljb24gPSBudWxsOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBNZWFzdXJlcyBhbmQgbWVtb2l6ZXMgdGhlIGRpcmVjdGlvbiBvZiB0aGUgZWxlbWVudC4gTm90ZSB0aGF0IHRoaXMKICAgICAgICogbWVhc3VyZW1lbnQgaXMgb25seSBkb25lIG9uY2UgYW5kIHRoZSByZXN1bHQgaXMgbWVtb2l6ZWQgZm9yIGZ1dHVyZQogICAgICAgKiBpbnZvY2F0aW9ucy4KICAgICAgICovCiAgICAgIF90YXJnZXRJc1JUTDogZnVuY3Rpb24odGFyZ2V0KSB7CiAgICAgICAgaWYgKHRoaXMuX190YXJnZXRJc1JUTCA9PSBudWxsKSB7CiAgICAgICAgICBpZiAodGhpcy51c2VHbG9iYWxSdGxBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgdmFyIGdsb2JhbEVsZW1lbnQgPQogICAgICAgICAgICAgICAgKGRvY3VtZW50LmJvZHkgJiYgZG9jdW1lbnQuYm9keS5oYXNBdHRyaWJ1dGUoJ2RpcicpKSA/CiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5IDoKICAgICAgICAgICAgICAgIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKCiAgICAgICAgICAgIHRoaXMuX190YXJnZXRJc1JUTCA9IGdsb2JhbEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkaXInKSA9PT0gJ3J0bCc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5ub2RlVHlwZSAhPT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXQuaG9zdDsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy5fX3RhcmdldElzUlRMID0KICAgICAgICAgICAgICAgIHRhcmdldCAmJiB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0YXJnZXQpWydkaXJlY3Rpb24nXSA9PT0gJ3J0bCc7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpcy5fX3RhcmdldElzUlRMOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqCiAgICAgICAqIFdoZW4gbmFtZSBpcyBjaGFuZ2VkLCByZWdpc3RlciBpY29uc2V0IG1ldGFkYXRhCiAgICAgICAqCiAgICAgICAqLwogICAgICBfbmFtZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX21ldGEudmFsdWUgPSBudWxsOwogICAgICAgIHRoaXMuX21ldGEua2V5ID0gdGhpcy5uYW1lOwogICAgICAgIHRoaXMuX21ldGEudmFsdWUgPSB0aGlzOwoKICAgICAgICB0aGlzLmFzeW5jKGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5maXJlKCdpcm9uLWljb25zZXQtYWRkZWQnLCB0aGlzLCB7bm9kZTogd2luZG93fSk7CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ3JlYXRlIGEgbWFwIG9mIGNoaWxkIFNWRyBlbGVtZW50cyBieSBpZC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IU9iamVjdH0gTWFwIG9mIGlkJ3MgdG8gU1ZHIGVsZW1lbnRzLgogICAgICAgKi8KICAgICAgX2NyZWF0ZUljb25NYXA6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIE9iamVjdHMgY2hhaW5lZCB0byBPYmplY3QucHJvdG90eXBlIChge31gKSBoYXZlIG1lbWJlcnMuIFNwZWNpZmljYWxseSwKICAgICAgICAvLyBvbiBGRiB0aGVyZSBpcyBhIGB3YXRjaGAgbWV0aG9kIHRoYXQgY29uZnVzZXMgdGhlIGljb24gbWFwLCBzbyB3ZQogICAgICAgIC8vIG5lZWQgdG8gdXNlIGEgbnVsbC1iYXNlZCBvYmplY3QgaGVyZS4KICAgICAgICB2YXIgaWNvbnMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIGRvbSh0aGlzKS5xdWVyeVNlbGVjdG9yQWxsKCdbaWRdJykuZm9yRWFjaChmdW5jdGlvbihpY29uKSB7CiAgICAgICAgICBpY29uc1tpY29uLmlkXSA9IGljb247CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGljb25zOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFByb2R1Y2UgaW5zdGFsbGFibGUgY2xvbmUgb2YgdGhlIFNWRyBlbGVtZW50IG1hdGNoaW5nIGBpZGAgaW4gdGhpcwogICAgICAgKiBpY29uc2V0LCBvciBgdW5kZWZpbmVkYCBpZiB0aGVyZSBpcyBubyBtYXRjaGluZyBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtFbGVtZW50fSBSZXR1cm5zIGFuIGluc3RhbGxhYmxlIGNsb25lIG9mIHRoZSBTVkcgZWxlbWVudAogICAgICAgKiBtYXRjaGluZyBgaWRgLgogICAgICAgKi8KICAgICAgX2Nsb25lSWNvbjogZnVuY3Rpb24oaWQsIG1pcnJvckFsbG93ZWQpIHsKICAgICAgICAvLyBjcmVhdGUgdGhlIGljb24gbWFwIG9uLWRlbWFuZCwgc2luY2UgdGhlIGljb25zZXQgaXRzZWxmIGhhcyBubyBkaXNjcmV0ZQogICAgICAgIC8vIHNpZ25hbCB0byBrbm93IHdoZW4gaXQncyBjaGlsZHJlbiBhcmUgZnVsbHkgcGFyc2VkCiAgICAgICAgdGhpcy5faWNvbnMgPSB0aGlzLl9pY29ucyB8fCB0aGlzLl9jcmVhdGVJY29uTWFwKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVTdmdDbG9uZSh0aGlzLl9pY29uc1tpZF0sIHRoaXMuc2l6ZSwgbWlycm9yQWxsb3dlZCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBzb3VyY2VTdmcKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUKICAgICAgICogQHBhcmFtIHtCb29sZWFufSBtaXJyb3JBbGxvd2VkCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnR9CiAgICAgICAqLwogICAgICBfcHJlcGFyZVN2Z0Nsb25lOiBmdW5jdGlvbihzb3VyY2VTdmcsIHNpemUsIG1pcnJvckFsbG93ZWQpIHsKICAgICAgICBpZiAoc291cmNlU3ZnKSB7CiAgICAgICAgICB2YXIgY29udGVudCA9IHNvdXJjZVN2Zy5jbG9uZU5vZGUodHJ1ZSksCiAgICAgICAgICAgICAgc3ZnID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycsICdzdmcnKSwKICAgICAgICAgICAgICB2aWV3Qm94ID0KICAgICAgICAgICAgICAgICAgY29udGVudC5nZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnKSB8fCAnMCAwICcgKyBzaXplICsgJyAnICsgc2l6ZSwKICAgICAgICAgICAgICBjc3NUZXh0ID0KICAgICAgICAgICAgICAgICAgJ3BvaW50ZXItZXZlbnRzOiBub25lOyBkaXNwbGF5OiBibG9jazsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsnOwoKICAgICAgICAgIGlmIChtaXJyb3JBbGxvd2VkICYmIGNvbnRlbnQuaGFzQXR0cmlidXRlKCdtaXJyb3ItaW4tcnRsJykpIHsKICAgICAgICAgICAgY3NzVGV4dCArPQogICAgICAgICAgICAgICAgJy13ZWJraXQtdHJhbnNmb3JtOnNjYWxlKC0xLDEpO3RyYW5zZm9ybTpzY2FsZSgtMSwxKTt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjsnOwogICAgICAgICAgfQoKICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCB2aWV3Qm94KTsKICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ByZXNlcnZlQXNwZWN0UmF0aW8nLCAneE1pZFlNaWQgbWVldCcpOwogICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgnZm9jdXNhYmxlJywgJ2ZhbHNlJyk7CiAgICAgICAgICAvLyBUT0RPKGRmcmVlZG0pOiBgcG9pbnRlci1ldmVudHM6IG5vbmVgIHdvcmtzIGFyb3VuZAogICAgICAgICAgLy8gaHR0cHM6Ly9jcmJ1Zy5jb20vMzcwMTM2CiAgICAgICAgICAvLyBUT0RPKHNqbWlsZXMpOiBpbmxpbmUgc3R5bGUgbWF5IG5vdCBiZSBpZGVhbCwgYnV0IGF2b2lkcyByZXF1aXJpbmcgYQogICAgICAgICAgLy8gc2hhZG93LXJvb3QKICAgICAgICAgIHN2Zy5zdHlsZS5jc3NUZXh0ID0gY3NzVGV4dDsKICAgICAgICAgIHN2Zy5hcHBlbmRDaGlsZChjb250ZW50KS5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7CiAgICAgICAgICByZXR1cm4gc3ZnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgfQoKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGNvbnN0IHRlbXBsYXRlJDIgPSBodG1sYDxpcm9uLWljb25zZXQtc3ZnIG5hbWU9ImltYWdlIiBzaXplPSIyNCI+Cjxzdmc+PGRlZnM+CjxnIGlkPSJhZGQtYS1waG90byI+PHBhdGggZD0iTTMgNFYxaDJ2M2gzdjJINXYzSDNWNkgwVjRoM3ptMyA2VjdoM1Y0aDdsMS44MyAySDIxYzEuMSAwIDIgLjkgMiAydjEyYzAgMS4xLS45IDItMiAySDVjLTEuMSAwLTItLjktMi0yVjEwaDN6bTcgOWMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNS01IDIuMjQtNSA1IDIuMjQgNSA1IDV6bS0zLjItNWMwIDEuNzcgMS40MyAzLjIgMy4yIDMuMnMzLjItMS40MyAzLjItMy4yLTEuNDMtMy4yLTMuMi0zLjItMy4yIDEuNDMtMy4yIDMuMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtdG8tcGhvdG9zIj48cGF0aCBkPSJNNCA2SDJ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZ6bTE2LTRIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tMSA5aC00djRoLTJ2LTRIOVY5aDRWNWgydjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkanVzdCI+PHBhdGggZD0iTTEyIDJDNi40OSAyIDIgNi40OSAyIDEyczQuNDkgMTAgMTAgMTAgMTAtNC40OSAxMC0xMFMxNy41MSAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0zLThjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lzdGFudCI+PHBhdGggZD0iTTE5IDJINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmg0bDMgMyAzLTNoNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNS4xMiAxMC44OEwxMiAxN2wtMS44OC00LjEyTDYgMTFsNC4xMi0xLjg4TDEyIDVsMS44OCA0LjEyTDE4IDExbC00LjEyIDEuODh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaXN0YW50LXBob3RvIj48cGF0aCBkPSJNMTQuNCA2TDE0IDRINXYxN2gydi03aDUuNmwuNCAyaDdWNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhdWRpb3RyYWNrIj48cGF0aCBkPSJNMTIgM3Y5LjI4Yy0uNDctLjE3LS45Ny0uMjgtMS41LS4yOEM4LjAxIDEyIDYgMTQuMDEgNiAxNi41UzguMDEgMjEgMTAuNSAyMWMyLjMxIDAgNC4yLTEuNzUgNC40NS00SDE1VjZoNFYzaC03eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJsdXItY2lyY3VsYXIiPjxwYXRoIGQ9Ik0xMCA5Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAgNGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xek03IDkuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bTMgN2MtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bS0zLTNjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0zLTZjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0xNCA5Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAtMS41Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXptMyA2Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMC00Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bTItMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptMC0zLjVjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLWxpbmVhciI+PHBhdGggZD0iTTUgMTcuNWMuODMgMCAxLjUtLjY3IDEuNS0xLjVzLS42Ny0xLjUtMS41LTEuNS0xLjUuNjctMS41IDEuNS42NyAxLjUgMS41IDEuNXpNOSAxM2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wLTRjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXpNMyAyMWgxOHYtMkgzdjJ6TTUgOS41Yy44MyAwIDEuNS0uNjcgMS41LTEuNVM1LjgzIDYuNSA1IDYuNSAzLjUgNy4xNyAzLjUgOCA0LjE3IDkuNSA1IDkuNXptMCA0Yy44MyAwIDEuNS0uNjcgMS41LTEuNXMtLjY3LTEuNS0xLjUtMS41LTEuNS42Ny0xLjUgMS41LjY3IDEuNSAxLjUgMS41ek05IDE3Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTgtLjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41ek0zIDN2MmgxOFYzSDN6bTE0IDUuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6bTAgNGMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTEzIDljLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMCA0Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAgNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJsdXItb2ZmIj48cGF0aCBkPSJNMTQgN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0tLjIgNC40OGwuMi4wMmMuODMgMCAxLjUtLjY3IDEuNS0xLjVzLS42Ny0xLjUtMS41LTEuNS0xLjUuNjctMS41IDEuNWwuMDIuMmMuMDkuNjcuNjEgMS4xOSAxLjI4IDEuMjh6TTE0IDMuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6bS00IDBjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0xMSA3Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMTAgN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem04IDhjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMC00Yy41NSAwIDEtLjQ1IDEtMXMtLjQ1LTEtMS0xLTEgLjQ1LTEgMSAuNDUgMSAxIDF6bTAtNGMuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0tNCAxMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNMi41IDUuMjdsMy43OCAzLjc4TDYgOWMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTFjMC0uMS0uMDMtLjE5LS4wNi0uMjhsMi44MSAyLjgxYy0uNzEuMTEtMS4yNS43My0xLjI1IDEuNDcgMCAuODMuNjcgMS41IDEuNSAxLjUuNzQgMCAxLjM2LS41NCAxLjQ3LTEuMjVsMi44MSAyLjgxYy0uMDktLjAzLS4xOC0uMDYtLjI4LS4wNi0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMWMwLS4xLS4wMy0uMTktLjA2LS4yOGwzLjc4IDMuNzhMMjAgMjAuMjMgMy43NyA0IDIuNSA1LjI3ek0xMCAxN2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0xMS0zLjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41ek02IDEzYy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6TTMgOS41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXptNyAxMWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6TTYgMTdjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptLTMtMy41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJibHVyLW9uIj48cGF0aCBkPSJNNiAxM2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wIDRjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMC04Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bS0zIC41Yy0uMjggMC0uNS4yMi0uNS41cy4yMi41LjUuNS41LS4yMi41LS41LS4yMi0uNS0uNS0uNXpNNiA1Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTE1IDUuNWMuMjggMCAuNS0uMjIuNS0uNXMtLjIyLS41LS41LS41LS41LjIyLS41LjUuMjIuNS41LjV6TTE0IDdjLjU1IDAgMS0uNDUgMS0xcy0uNDUtMS0xLTEtMSAuNDUtMSAxIC40NSAxIDEgMXptMC0zLjVjLjI4IDAgLjUtLjIyLjUtLjVzLS4yMi0uNS0uNS0uNS0uNS4yMi0uNS41LjIyLjUuNS41em0tMTEgMTBjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em03IDdjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41em0wLTE3Yy4yOCAwIC41LS4yMi41LS41cy0uMjItLjUtLjUtLjUtLjUuMjItLjUuNS4yMi41LjUuNXpNMTAgN2MuNTUgMCAxLS40NSAxLTFzLS40NS0xLTEtMS0xIC40NS0xIDEgLjQ1IDEgMSAxem0wIDUuNWMtLjgzIDAtMS41LjY3LTEuNSAxLjVzLjY3IDEuNSAxLjUgMS41IDEuNS0uNjcgMS41LTEuNS0uNjctMS41LTEuNS0xLjV6bTggLjVjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMCA0Yy0uNTUgMC0xIC40NS0xIDFzLjQ1IDEgMSAxIDEtLjQ1IDEtMS0uNDUtMS0xLTF6bTAtOGMtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wLTRjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptMyA4LjVjLS4yOCAwLS41LjIyLS41LjVzLjIyLjUuNS41LjUtLjIyLjUtLjUtLjIyLS41LS41LS41ek0xNCAxN2MtLjU1IDAtMSAuNDUtMSAxcy40NSAxIDEgMSAxLS40NSAxLTEtLjQ1LTEtMS0xem0wIDMuNWMtLjI4IDAtLjUuMjItLjUuNXMuMjIuNS41LjUuNS0uMjIuNS0uNS0uMjItLjUtLjUtLjV6bS00LTEyYy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXptMCA4LjVjLS41NSAwLTEgLjQ1LTEgMXMuNDUgMSAxIDEgMS0uNDUgMS0xLS40NS0xLTEtMXptNC00LjVjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0wLTRjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtMSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMTAiPjwvY2lyY2xlPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtMiI+PHBhdGggZD0iTTEwIDJjLTEuODIgMC0zLjUzLjUtNSAxLjM1QzcuOTkgNS4wOCAxMCA4LjMgMTAgMTJzLTIuMDEgNi45Mi01IDguNjVDNi40NyAyMS41IDguMTggMjIgMTAgMjJjNS41MiAwIDEwLTQuNDggMTAtMTBTMTUuNTIgMiAxMCAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtMyI+PHBhdGggZD0iTTkgMmMtMS4wNSAwLTIuMDUuMTYtMyAuNDYgNC4wNiAxLjI3IDcgNS4wNiA3IDkuNTQgMCA0LjQ4LTIuOTQgOC4yNy03IDkuNTQuOTUuMyAxLjk1LjQ2IDMgLjQ2IDUuNTIgMCAxMC00LjQ4IDEwLTEwUzE0LjUyIDIgOSAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtNCI+PHBhdGggZD0iTTIwIDguNjlWNGgtNC42OUwxMiAuNjkgOC42OSA0SDR2NC42OUwuNjkgMTIgNCAxNS4zMVYyMGg0LjY5TDEyIDIzLjMxIDE1LjMxIDIwSDIwdi00LjY5TDIzLjMxIDEyIDIwIDguNjl6TTEyIDE4Yy0uODkgMC0xLjc0LS4yLTIuNS0uNTVDMTEuNTYgMTYuNSAxMyAxNC40MiAxMyAxMnMtMS40NC00LjUtMy41LTUuNDVDMTAuMjYgNi4yIDExLjExIDYgMTIgNmMzLjMxIDAgNiAyLjY5IDYgNnMtMi42OSA2LTYgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJicmlnaHRuZXNzLTUiPjxwYXRoIGQ9Ik0yMCAxNS4zMUwyMy4zMSAxMiAyMCA4LjY5VjRoLTQuNjlMMTIgLjY5IDguNjkgNEg0djQuNjlMLjY5IDEyIDQgMTUuMzFWMjBoNC42OUwxMiAyMy4zMSAxNS4zMSAyMEgyMHYtNC42OXpNMTIgMThjLTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTYgNiAyLjY5IDYgNi0yLjY5IDYtNiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtNiI+PHBhdGggZD0iTTIwIDE1LjMxTDIzLjMxIDEyIDIwIDguNjlWNGgtNC42OUwxMiAuNjkgOC42OSA0SDR2NC42OUwuNjkgMTIgNCAxNS4zMVYyMGg0LjY5TDEyIDIzLjMxIDE1LjMxIDIwSDIwdi00LjY5ek0xMiAxOFY2YzMuMzEgMCA2IDIuNjkgNiA2cy0yLjY5IDYtNiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJyaWdodG5lc3MtNyI+PHBhdGggZD0iTTIwIDguNjlWNGgtNC42OUwxMiAuNjkgOC42OSA0SDR2NC42OUwuNjkgMTIgNCAxNS4zMVYyMGg0LjY5TDEyIDIzLjMxIDE1LjMxIDIwSDIwdi00LjY5TDIzLjMxIDEyIDIwIDguNjl6TTEyIDE4Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnptMC0xMGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnJva2VuLWltYWdlIj48cGF0aCBkPSJNMjEgNXY2LjU5bC0zLTMuMDEtNCA0LjAxLTQtNC00IDQtMy0zLjAxVjVjMC0xLjEuOS0yIDItMmgxNGMxLjEgMCAyIC45IDIgMnptLTMgNi40MmwzIDMuMDFWMTljMCAxLjEtLjkgMi0yIDJINWMtMS4xIDAtMi0uOS0yLTJ2LTYuNThsMyAyLjk5IDQtNCA0IDQgNC0zLjk5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJydXNoIj48cGF0aCBkPSJNNyAxNGMtMS42NiAwLTMgMS4zNC0zIDMgMCAxLjMxLTEuMTYgMi0yIDIgLjkyIDEuMjIgMi40OSAyIDQgMiAyLjIxIDAgNC0xLjc5IDQtNCAwLTEuNjYtMS4zNC0zLTMtM3ptMTMuNzEtOS4zN2wtMS4zNC0xLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMEw5IDEyLjI1IDExLjc1IDE1bDguOTYtOC45NmMuMzktLjM5LjM5LTEuMDIgMC0xLjQxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJ1cnN0LW1vZGUiPjxwYXRoIGQ9Ik0xIDVoMnYxNEgxem00IDBoMnYxNEg1em0xNyAwSDEwYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTJjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xek0xMSAxN2wyLjUtMy4xNUwxNS4yOSAxNmwyLjUtMy4yMkwyMSAxN0gxMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW1lcmEiPjxwYXRoIGQ9Ik05LjQgMTAuNWw0Ljc3LTguMjZDMTMuNDcgMi4wOSAxMi43NSAyIDEyIDJjLTIuNCAwLTQuNi44NS02LjMyIDIuMjVsMy42NiA2LjM1LjA2LS4xek0yMS41NCA5Yy0uOTItMi45Mi0zLjE1LTUuMjYtNi02LjM0TDExLjg4IDloOS42NnptLjI2IDFoLTcuNDlsLjI5LjUgNC43NiA4LjI1QzIxIDE2Ljk3IDIyIDE0LjYxIDIyIDEyYzAtLjY5LS4wNy0xLjM1LS4yLTJ6TTguNTQgMTJsLTMuOS02Ljc1QzMuMDEgNy4wMyAyIDkuMzkgMiAxMmMwIC42OS4wNyAxLjM1LjIgMmg3LjQ5bC0xLjE1LTJ6bS02LjA4IDNjLjkyIDIuOTIgMy4xNSA1LjI2IDYgNi4zNEwxMi4xMiAxNUgyLjQ2em0xMS4yNyAwbC0zLjkgNi43NmMuNy4xNSAxLjQyLjI0IDIuMTcuMjQgMi40IDAgNC42LS44NSA2LjMyLTIuMjVsLTMuNjYtNi4zNS0uOTMgMS42eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1hbHQiPjxjaXJjbGUgY3g9IjEyIiBjeT0iMTIiIHI9IjMuMiI+PC9jaXJjbGU+PHBhdGggZD0iTTkgMkw3LjE3IDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yaC0zLjE3TDE1IDJIOXptMyAxNWMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FtZXJhLWZyb250Ij48cGF0aCBkPSJNMTAgMjBINXYyaDV2MmwzLTMtMy0zdjJ6bTQgMHYyaDV2LTJoLTV6TTEyIDhjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTEuOTkuOS0xLjk5IDJTMTAuOSA4IDEyIDh6bTUtOEg3QzUuOSAwIDUgLjkgNSAydjE0YzAgMS4xLjkgMiAyIDJoMTBjMS4xIDAgMi0uOSAyLTJWMmMwLTEuMS0uOS0yLTItMnpNNyAyaDEwdjEwLjVjMC0xLjY3LTMuMzMtMi41LTUtMi41cy01IC44My01IDIuNVYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1yZWFyIj48cGF0aCBkPSJNMTAgMjBINXYyaDV2MmwzLTMtMy0zdjJ6bTQgMHYyaDV2LTJoLTV6bTMtMjBIN0M1LjkgMCA1IC45IDUgMnYxNGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjJjMC0xLjEtLjktMi0yLTJ6bS01IDZjLTEuMTEgMC0yLS45LTItMnMuODktMiAxLjk5LTIgMiAuOSAyIDJDMTQgNS4xIDEzLjEgNiAxMiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1yb2xsIj48cGF0aCBkPSJNMTQgNWMwLTEuMS0uOS0yLTItMmgtMVYyYzAtLjU1LS40NS0xLTEtMUg2Yy0uNTUgMC0xIC40NS0xIDF2MUg0Yy0xLjEgMC0yIC45LTIgMnYxNWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJoOFY1aC04em0tMiAxM2gtMnYtMmgydjJ6bTAtOWgtMlY3aDJ2MnptNCA5aC0ydi0yaDJ2MnptMC05aC0yVjdoMnYyem00IDloLTJ2LTJoMnYyem0wLTloLTJWN2gydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2VudGVyLWZvY3VzLXN0cm9uZyI+PHBhdGggZD0iTTEyIDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0tNyA3SDN2NGMwIDEuMS45IDIgMiAyaDR2LTJINXYtNHpNNSA1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnY0aDJWNXptMTQtMmgtNHYyaDR2NGgyVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2VudGVyLWZvY3VzLXdlYWsiPjxwYXRoIGQ9Ik01IDE1SDN2NGMwIDEuMS45IDIgMiAyaDR2LTJINXYtNHpNNSA1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnY0aDJWNXptMTQtMmgtNHYyaDR2NGgyVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6TTEyIDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0wIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbGxlY3Rpb25zIj48cGF0aCBkPSJNMjIgMTZWNGMwLTEuMS0uOS0yLTItMkg4Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yem0tMTEtNGwyLjAzIDIuNzFMMTYgMTFsNCA1SDhsMy00ek0yIDZ2MTRjMCAxLjEuOSAyIDIgMmgxNHYtMkg0VjZIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xsZWN0aW9ucy1ib29rbWFyayI+PHBhdGggZD0iTTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xNi00SDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptMCAxMGwtMi41LTEuNUwxNSAxMlY0aDV2OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb2xvci1sZW5zIj48cGF0aCBkPSJNMTIgM2MtNC45NyAwLTkgNC4wMy05IDlzNC4wMyA5IDkgOWMuODMgMCAxLjUtLjY3IDEuNS0xLjUgMC0uMzktLjE1LS43NC0uMzktMS4wMS0uMjMtLjI2LS4zOC0uNjEtLjM4LS45OSAwLS44My42Ny0xLjUgMS41LTEuNUgxNmMyLjc2IDAgNS0yLjI0IDUtNSAwLTQuNDItNC4wMy04LTktOHptLTUuNSA5Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTNS42NyA5IDYuNSA5IDggOS42NyA4IDEwLjUgNy4zMyAxMiA2LjUgMTJ6bTMtNEM4LjY3IDggOCA3LjMzIDggNi41UzguNjcgNSA5LjUgNXMxLjUuNjcgMS41IDEuNVMxMC4zMyA4IDkuNSA4em01IDBjLS44MyAwLTEuNS0uNjctMS41LTEuNVMxMy42NyA1IDE0LjUgNXMxLjUuNjcgMS41IDEuNVMxNS4zMyA4IDE0LjUgOHptMyA0Yy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTYuNjcgOSAxNy41IDlzMS41LjY3IDEuNSAxLjUtLjY3IDEuNS0xLjUgMS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbG9yaXplIj48cGF0aCBkPSJNMjAuNzEgNS42M2wtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMy4xMiAzLjEyLTEuOTMtMS45MS0xLjQxIDEuNDEgMS40MiAxLjQyTDMgMTYuMjVWMjFoNC43NWw4LjkyLTguOTIgMS40MiAxLjQyIDEuNDEtMS40MS0xLjkyLTEuOTIgMy4xMi0zLjEyYy40LS40LjQtMS4wMy4wMS0xLjQyek02LjkyIDE5TDUgMTcuMDhsOC4wNi04LjA2IDEuOTIgMS45Mkw2LjkyIDE5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbXBhcmUiPjxwYXRoIGQ9Ik0xMCAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoNXYyaDJWMWgtMnYyem0wIDE1SDVsNS02djZ6bTktMTVoLTV2Mmg1djEzbC01LTZ2OWg1YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29udHJvbC1wb2ludCI+PHBhdGggZD0iTTEzIDdoLTJ2NEg3djJoNHY0aDJ2LTRoNHYtMmgtNFY3em0tMS01QzYuNDkgMiAyIDYuNDkgMiAxMnM0LjQ5IDEwIDEwIDEwIDEwLTQuNDkgMTAtMTBTMTcuNTEgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjb250cm9sLXBvaW50LWR1cGxpY2F0ZSI+PHBhdGggZD0iTTE2IDhoLTJ2M2gtM3YyaDN2M2gydi0zaDN2LTJoLTN6TTIgMTJjMC0yLjc5IDEuNjQtNS4yIDQuMDEtNi4zMlYzLjUyQzIuNTIgNC43NiAwIDguMDkgMCAxMnMyLjUyIDcuMjQgNi4wMSA4LjQ4di0yLjE2QzMuNjQgMTcuMiAyIDE0Ljc5IDIgMTJ6bTEzLTljLTQuOTYgMC05IDQuMDQtOSA5czQuMDQgOSA5IDkgOS00LjA0IDktOS00LjA0LTktOS05em0wIDE2Yy0zLjg2IDAtNy0zLjE0LTctN3MzLjE0LTcgNy03IDcgMy4xNCA3IDctMy4xNCA3LTcgN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wIj48cGF0aCBkPSJNMTcgMTVoMlY3YzAtMS4xLS45LTItMi0ySDl2Mmg4djh6TTcgMTdWMUg1djRIMXYyaDR2MTBjMCAxLjEuOSAyIDIgMmgxMHY0aDJ2LTRoNHYtMkg3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtMTYtOSI+PHBhdGggZD0iTTE5IDZINWMtMS4xIDAtMiAuOS0yIDJ2OGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6bTAgMTBINVY4aDE0djh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC0zLTIiPjxwYXRoIGQ9Ik0xOSA0SDVjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg1VjZoMTR2MTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC01LTQiPjxwYXRoIGQ9Ik0xOSA1SDVjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptMCAxMkg1VjdoMTR2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC03LTUiPjxwYXRoIGQ9Ik0xOSA3SDVjLTEuMSAwLTIgLjktMiAydjZjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yem0wIDhINVY5aDE0djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1kaW4iPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjVoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1mcmVlIj48cGF0aCBkPSJNMyA1djRoMlY1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnptMiAxMEgzdjRjMCAxLjEuOSAyIDIgMmg0di0ySDV2LTR6bTE0IDRoLTR2Mmg0YzEuMSAwIDItLjkgMi0ydi00aC0ydjR6bTAtMTZoLTR2Mmg0djRoMlY1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3AtbGFuZHNjYXBlIj48cGF0aCBkPSJNMTkgNUg1Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTJINVY3aDE0djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyb3Atb3JpZ2luYWwiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjVoMTR2MTR6bS01LjA0LTYuNzFsLTIuNzUgMy41NC0xLjk2LTIuMzZMNi41IDE3aDExbC0zLjU0LTQuNzF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1wb3J0cmFpdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDdWNWgxMHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcm9wLXJvdGF0ZSI+PHBhdGggZD0iTTcuNDcgMjEuNDlDNC4yIDE5LjkzIDEuODYgMTYuNzYgMS41IDEzSDBjLjUxIDYuMTYgNS42NiAxMSAxMS45NSAxMSAuMjMgMCAuNDQtLjAyLjY2LS4wM0w4LjggMjAuMTVsLTEuMzMgMS4zNHpNMTIuMDUgMGMtLjIzIDAtLjQ0LjAyLS42Ni4wNGwzLjgxIDMuODEgMS4zMy0xLjMzQzE5LjggNC4wNyAyMi4xNCA3LjI0IDIyLjUgMTFIMjRjLS41MS02LjE2LTUuNjYtMTEtMTEuOTUtMTF6TTE2IDE0aDJWOGMwLTEuMTEtLjktMi0yLTJoLTZ2Mmg2djZ6bS04IDJWNEg2djJINHYyaDJ2OGMwIDEuMS44OSAyIDIgMmg4djJoMnYtMmgydi0ySDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY3JvcC1zcXVhcmUiPjxwYXRoIGQ9Ik0xOCA0SDZjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNEg2VjZoMTJ2MTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVoYXplIj48cGF0aCBkPSJNMiAxNS41djJoMjB2LTJIMnptMC01djJoMjB2LTJIMnptMC01djJoMjB2LTJIMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkZXRhaWxzIj48cGF0aCBkPSJNMyA0bDkgMTYgOS0xNkgzem0zLjM4IDJoMTEuMjVMMTIgMTYgNi4zOCA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImVkaXQiPjxwYXRoIGQ9Ik0zIDE3LjI1VjIxaDMuNzVMMTcuODEgOS45NGwtMy43NS0zLjc1TDMgMTcuMjV6TTIwLjcxIDcuMDRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMi4zNC0yLjM0Yy0uMzktLjM5LTEuMDItLjM5LTEuNDEgMGwtMS44MyAxLjgzIDMuNzUgMy43NSAxLjgzLTEuODN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUiPjxwYXRoIGQ9Ik0xNSAxN3YyaDJ2LTJoMnYtMmgtMnYtMmgtMnYyaC0ydjJoMnptNS0xNUg0Yy0xLjEgMC0yIC45LTIgMnYxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjRjMC0xLjEtLjktMi0yLTJ6TTUgNWg2djJINVY1em0xNSAxNUg0TDIwIDR2MTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtbmVnLTEiPjxwYXRoIGQ9Ik00IDExdjJoOHYtMkg0em0xNSA3aC0yVjcuMzhMMTQgOC40VjYuN0wxOC43IDVoLjN2MTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtbmVnLTIiPjxwYXRoIGQ9Ik0xNS4wNSAxNi4yOWwyLjg2LTMuMDdjLjM4LS4zOS43Mi0uNzkgMS4wNC0xLjE4LjMyLS4zOS41OS0uNzguODItMS4xNy4yMy0uMzkuNDEtLjc4LjU0LTEuMTdzLjE5LS43OS4xOS0xLjE4YzAtLjUzLS4wOS0xLjAyLS4yNy0xLjQ2LS4xOC0uNDQtLjQ0LS44MS0uNzgtMS4xMS0uMzQtLjMxLS43Ny0uNTQtMS4yNi0uNzEtLjUxLS4xNi0xLjA4LS4yNC0xLjcyLS4yNC0uNjkgMC0xLjMxLjExLTEuODUuMzItLjU0LjIxLTEgLjUxLTEuMzYuODgtLjM3LjM3LS42NS44LS44NCAxLjMtLjE4LjQ3LS4yNy45Ny0uMjggMS41aDIuMTRjLjAxLS4zMS4wNS0uNi4xMy0uODcuMDktLjI5LjIzLS41NC40LS43NS4xOC0uMjEuNDEtLjM3LjY4LS40OS4yNy0uMTIuNi0uMTguOTYtLjE4LjMxIDAgLjU4LjA1LjgxLjE1LjIzLjEuNDMuMjUuNTkuNDMuMTYuMTguMjguNC4zNy42NS4wOC4yNS4xMy41Mi4xMy44MSAwIC4yMi0uMDMuNDMtLjA4LjY1LS4wNi4yMi0uMTUuNDUtLjI5LjctLjE0LjI1LS4zMi41My0uNTYuODMtLjIzLjMtLjUyLjY1LS44OCAxLjAzbC00LjE3IDQuNTVWMThIMjF2LTEuNzFoLTUuOTV6TTIgMTF2Mmg4di0ySDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwb3N1cmUtcGx1cy0xIj48cGF0aCBkPSJNMTAgN0g4djRINHYyaDR2NGgydi00aDR2LTJoLTRWN3ptMTAgMTFoLTJWNy4zOEwxNSA4LjRWNi43TDE5LjcgNWguM3YxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJleHBvc3VyZS1wbHVzLTIiPjxwYXRoIGQ9Ik0xNi4wNSAxNi4yOWwyLjg2LTMuMDdjLjM4LS4zOS43Mi0uNzkgMS4wNC0xLjE4LjMyLS4zOS41OS0uNzguODItMS4xNy4yMy0uMzkuNDEtLjc4LjU0LTEuMTcuMTMtLjM5LjE5LS43OS4xOS0xLjE4IDAtLjUzLS4wOS0xLjAyLS4yNy0xLjQ2LS4xOC0uNDQtLjQ0LS44MS0uNzgtMS4xMS0uMzQtLjMxLS43Ny0uNTQtMS4yNi0uNzEtLjUxLS4xNi0xLjA4LS4yNC0xLjcyLS4yNC0uNjkgMC0xLjMxLjExLTEuODUuMzItLjU0LjIxLTEgLjUxLTEuMzYuODgtLjM3LjM3LS42NS44LS44NCAxLjMtLjE4LjQ3LS4yNy45Ny0uMjggMS41aDIuMTRjLjAxLS4zMS4wNS0uNi4xMy0uODcuMDktLjI5LjIzLS41NC40LS43NS4xOC0uMjEuNDEtLjM3LjY4LS40OS4yNy0uMTIuNi0uMTguOTYtLjE4LjMxIDAgLjU4LjA1LjgxLjE1LjIzLjEuNDMuMjUuNTkuNDMuMTYuMTguMjguNC4zNy42NS4wOC4yNS4xMy41Mi4xMy44MSAwIC4yMi0uMDMuNDMtLjA4LjY1LS4wNi4yMi0uMTUuNDUtLjI5LjctLjE0LjI1LS4zMi41My0uNTYuODMtLjIzLjMtLjUyLjY1LS44OCAxLjAzbC00LjE3IDQuNTVWMThIMjJ2LTEuNzFoLTUuOTV6TTggN0g2djRIMnYyaDR2NGgydi00aDR2LTJIOFY3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cG9zdXJlLXplcm8iPjxwYXRoIGQ9Ik0xNi4xNCAxMi41YzAgMS0uMSAxLjg1LS4zIDIuNTUtLjIuNy0uNDggMS4yNy0uODMgMS43LS4zNi40NC0uNzkuNzUtMS4zLjk1LS41MS4yLTEuMDcuMy0xLjcuMy0uNjIgMC0xLjE4LS4xLTEuNjktLjMtLjUxLS4yLS45NS0uNTEtMS4zMS0uOTUtLjM2LS40NC0uNjUtMS4wMS0uODUtMS43LS4yLS43LS4zLTEuNTUtLjMtMi41NXYtMi4wNGMwLTEgLjEtMS44NS4zLTIuNTUuMi0uNy40OC0xLjI2Ljg0LTEuNjkuMzYtLjQzLjgtLjc0IDEuMzEtLjkzQzEwLjgxIDUuMSAxMS4zOCA1IDEyIDVjLjYzIDAgMS4xOS4xIDEuNy4yOS41MS4xOS45NS41IDEuMzEuOTMuMzYuNDMuNjQuOTkuODQgMS42OS4yLjcuMyAxLjU0LjMgMi41NXYyLjA0em0tMi4xMS0yLjM2YzAtLjY0LS4wNS0xLjE4LS4xMy0xLjYyLS4wOS0uNDQtLjIyLS43OS0uNC0xLjA2LS4xNy0uMjctLjM5LS40Ni0uNjQtLjU4LS4yNS0uMTMtLjU0LS4xOS0uODYtLjE5LS4zMiAwLS42MS4wNi0uODYuMThzLS40Ny4zMS0uNjQuNThjLS4xNy4yNy0uMzEuNjItLjQgMS4wNnMtLjEzLjk4LS4xMyAxLjYydjIuNjdjMCAuNjQuMDUgMS4xOC4xNCAxLjYyLjA5LjQ1LjIzLjgxLjQgMS4wOXMuMzkuNDguNjQuNjEuNTQuMTkuODcuMTljLjMzIDAgLjYyLS4wNi44Ny0uMTlzLjQ2LS4zMy42My0uNjFjLjE3LS4yOC4zLS42NC4zOS0xLjA5LjA5LS40NS4xMy0uOTkuMTMtMS42MnYtMi42NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXIiPjxwYXRoIGQ9Ik0xNS45NiAxMC4yOWwtMi43NSAzLjU0LTEuOTYtMi4zNkw4LjUgMTVoMTFsLTMuNTQtNC43MXpNMyA1SDF2MTZjMCAxLjEuOSAyIDIgMmgxNnYtMkgzVjV6bTE4LTRIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItMSI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xMSAxMGgyVjVoLTR2Mmgydjh6bTctMTRIN2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlYzYzAtMS4xLS45LTItMi0yem0wIDE2SDdWM2gxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItMiI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS00LTRoLTR2LTJoMmMxLjEgMCAyLS44OSAyLTJWN2MwLTEuMTEtLjktMi0yLTJoLTR2Mmg0djJoLTJjLTEuMSAwLTIgLjg5LTIgMnY0aDZ2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTMiPjxwYXRoIGQ9Ik0yMSAxSDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6TTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xNCA4di0xLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41LjgzIDAgMS41LS42NyAxLjUtMS41VjdjMC0xLjExLS45LTItMi0yaC00djJoNHYyaC0ydjJoMnYyaC00djJoNGMxLjEgMCAyLS44OSAyLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTQiPjxwYXRoIGQ9Ik0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTIgMTBoMlY1aC0ydjRoLTJWNWgtMnY2aDR2NHptNi0xNEg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbHRlci01Ij48cGF0aCBkPSJNMjEgMUg3Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMi0yLTJ6bTAgMTZIN1YzaDE0djE0ek0zIDVIMXYxNmMwIDEuMS45IDIgMiAyaDE2di0ySDNWNXptMTQgOHYtMmMwLTEuMTEtLjktMi0yLTJoLTJWN2g0VjVoLTZ2Nmg0djJoLTR2Mmg0YzEuMSAwIDItLjg5IDItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItNiI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS04LTJoMmMxLjEgMCAyLS44OSAyLTJ2LTJjMC0xLjExLS45LTItMi0yaC0yVjdoNFY1aC00Yy0xLjEgMC0yIC44OS0yIDJ2NmMwIDEuMTEuOSAyIDIgMnptMC00aDJ2MmgtMnYtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItNyI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS04LTJsNC04VjVoLTZ2Mmg0bC00IDhoMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItOCI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6bS04LTJoMmMxLjEgMCAyLS44OSAyLTJ2LTEuNWMwLS44My0uNjctMS41LTEuNS0xLjUuODMgMCAxLjUtLjY3IDEuNS0xLjVWN2MwLTEuMTEtLjktMi0yLTJoLTJjLTEuMSAwLTIgLjg5LTIgMnYxLjVjMCAuODMuNjcgMS41IDEuNSAxLjUtLjgzIDAtMS41LjY3LTEuNSAxLjVWMTNjMCAxLjExLjkgMiAyIDJ6bTAtOGgydjJoLTJWN3ptMCA0aDJ2MmgtMnYtMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItOSI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6TTE1IDVoLTJjLTEuMSAwLTIgLjg5LTIgMnYyYzAgMS4xMS45IDIgMiAyaDJ2MmgtNHYyaDRjMS4xIDAgMi0uODkgMi0yVjdjMC0xLjExLS45LTItMi0yem0wIDRoLTJWN2gydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLTktcGx1cyI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xMSA3VjhjMC0xLjExLS45LTItMi0yaC0xYy0xLjEgMC0yIC44OS0yIDJ2MWMwIDEuMTEuOSAyIDIgMmgxdjFIOXYyaDNjMS4xIDAgMi0uODkgMi0yem0tMy0zVjhoMXYxaC0xem0xMC04SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCA4aC0yVjdoLTJ2MmgtMnYyaDJ2Mmgydi0yaDJ2Nkg3VjNoMTR2NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItYi1hbmQtdyI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2bC03LTh2OEg1bDctOFY1aDd2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWNlbnRlci1mb2N1cyI+PHBhdGggZD0iTTUgMTVIM3Y0YzAgMS4xLjkgMiAyIDJoNHYtMkg1di00ek01IDVoNFYzSDVjLTEuMSAwLTIgLjktMiAydjRoMlY1em0xNC0yaC00djJoNHY0aDJWNWMwLTEuMS0uOS0yLTItMnptMCAxNmgtNHYyaDRjMS4xIDAgMi0uOSAyLTJ2LTRoLTJ2NHpNMTIgOWMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgMyAzLTEuMzQgMy0zLTEuMzQtMy0zLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWRyYW1hIj48cGF0aCBkPSJNMTkuMzUgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNjEgNS42NCA1LjM2IDguMDQgMi4zNSA4LjM2IDAgMTAuOSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0xOSAxOEg2Yy0yLjIxIDAtNC0xLjc5LTQtNHMxLjc5LTQgNC00IDQgMS43OSA0IDRoMmMwLTIuNzYtMS44Ni01LjA4LTQuNC01Ljc4QzguNjEgNi44OCAxMC4yIDYgMTIgNmMzLjAzIDAgNS41IDIuNDcgNS41IDUuNXYuNUgxOWMxLjY1IDAgMyAxLjM1IDMgM3MtMS4zNSAzLTMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItZnJhbWVzIj48cGF0aCBkPSJNMjAgNGgtNGwtNC00LTQgNEg0Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTZINFY2aDQuNTJsMy41Mi0zLjVMMTUuNTIgNkgyMHYxNHpNMTggOEg2djEwaDEyIj48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWhkciI+PHBhdGggZD0iTTE0IDZsLTMuNzUgNSAyLjg1IDMuOC0xLjYgMS4yQzkuODEgMTMuNzUgNyAxMCA3IDEwbC02IDhoMjJMMTQgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWx0ZXItbm9uZSI+PHBhdGggZD0iTTMgNUgxdjE2YzAgMS4xLjkgMiAyIDJoMTZ2LTJIM1Y1em0xOC00SDdjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWM2MwLTEuMS0uOS0yLTItMnptMCAxNkg3VjNoMTR2MTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLXRpbHQtc2hpZnQiPjxwYXRoIGQ9Ik0xMSA0LjA3VjIuMDVjLTIuMDEuMi0zLjg0IDEtNS4zMiAyLjIxTDcuMSA1LjY5YzEuMTEtLjg2IDIuNDQtMS40NCAzLjktMS42MnptNy4zMi4xOUMxNi44NCAzLjA1IDE1LjAxIDIuMjUgMTMgMi4wNXYyLjAyYzEuNDYuMTggMi43OS43NiAzLjkgMS42MmwxLjQyLTEuNDN6TTE5LjkzIDExaDIuMDJjLS4yLTIuMDEtMS0zLjg0LTIuMjEtNS4zMkwxOC4zMSA3LjFjLjg2IDEuMTEgMS40NCAyLjQ0IDEuNjIgMy45ek01LjY5IDcuMUw0LjI2IDUuNjhDMy4wNSA3LjE2IDIuMjUgOC45OSAyLjA1IDExaDIuMDJjLjE4LTEuNDYuNzYtMi43OSAxLjYyLTMuOXpNNC4wNyAxM0gyLjA1Yy4yIDIuMDEgMSAzLjg0IDIuMjEgNS4zMmwxLjQzLTEuNDNjLS44Ni0xLjEtMS40NC0yLjQzLTEuNjItMy44OXpNMTUgMTJjMC0xLjY2LTEuMzQtMy0zLTNzLTMgMS4zNC0zIDMgMS4zNCAzIDMgMyAzLTEuMzQgMy0zem0zLjMxIDQuOWwxLjQzIDEuNDNjMS4yMS0xLjQ4IDIuMDEtMy4zMiAyLjIxLTUuMzJoLTIuMDJjLS4xOCAxLjQ1LS43NiAyLjc4LTEuNjIgMy44OXpNMTMgMTkuOTN2Mi4wMmMyLjAxLS4yIDMuODQtMSA1LjMyLTIuMjFsLTEuNDMtMS40M2MtMS4xLjg2LTIuNDMgMS40NC0zLjg5IDEuNjJ6bS03LjMyLS4xOUM3LjE2IDIwLjk1IDkgMjEuNzUgMTEgMjEuOTV2LTIuMDJjLTEuNDYtLjE4LTIuNzktLjc2LTMuOS0xLjYybC0xLjQyIDEuNDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLXZpbnRhZ2UiPjxwYXRoIGQ9Ik0xOC43IDEyLjRjLS4yOC0uMTYtLjU3LS4yOS0uODYtLjQuMjktLjExLjU4LS4yNC44Ni0uNCAxLjkyLTEuMTEgMi45OS0zLjEyIDMtNS4xOS0xLjc5LTEuMDMtNC4wNy0xLjExLTYgMC0uMjguMTYtLjU0LjM1LS43OC41NC4wNS0uMzEuMDgtLjYzLjA4LS45NSAwLTIuMjItMS4yMS00LjE1LTMtNS4xOUMxMC4yMSAxLjg1IDkgMy43OCA5IDZjMCAuMzIuMDMuNjQuMDguOTUtLjI0LS4yLS41LS4zOS0uNzgtLjU1LTEuOTItMS4xMS00LjItMS4wMy02IDAgMCAyLjA3IDEuMDcgNC4wOCAzIDUuMTkuMjguMTYuNTcuMjkuODYuNC0uMjkuMTEtLjU4LjI0LS44Ni40LTEuOTIgMS4xMS0yLjk5IDMuMTItMyA1LjE5IDEuNzkgMS4wMyA0LjA3IDEuMTEgNiAwIC4yOC0uMTYuNTQtLjM1Ljc4LS41NC0uMDUuMzItLjA4LjY0LS4wOC45NiAwIDIuMjIgMS4yMSA0LjE1IDMgNS4xOSAxLjc5LTEuMDQgMy0yLjk3IDMtNS4xOSAwLS4zMi0uMDMtLjY0LS4wOC0uOTUuMjQuMi41LjM4Ljc4LjU0IDEuOTIgMS4xMSA0LjIgMS4wMyA2IDAtLjAxLTIuMDctMS4wOC00LjA4LTMtNS4xOXpNMTIgMTZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTQgNCAxLjc5IDQgNC0xLjc5IDQtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYXJlIj48cGF0aCBkPSJNNyAxMUgxdjJoNnYtMnptMi4xNy0zLjI0TDcuMDUgNS42NCA1LjY0IDcuMDVsMi4xMiAyLjEyIDEuNDEtMS40MXpNMTMgMWgtMnY2aDJWMXptNS4zNiA2LjA1bC0xLjQxLTEuNDEtMi4xMiAyLjEyIDEuNDEgMS40MSAyLjEyLTIuMTJ6TTE3IDExdjJoNnYtMmgtNnptLTUtMmMtMS42NiAwLTMgMS4zNC0zIDNzMS4zNCAzIDMgMyAzLTEuMzQgMy0zLTEuMzQtMy0zLTN6bTIuODMgNy4yNGwyLjEyIDIuMTIgMS40MS0xLjQxLTIuMTItMi4xMi0xLjQxIDEuNDF6bS05LjE5LjcxbDEuNDEgMS40MSAyLjEyLTIuMTItMS40MS0xLjQxLTIuMTIgMi4xMnpNMTEgMjNoMnYtNmgtMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYXNoLWF1dG8iPjxwYXRoIGQ9Ik0zIDJ2MTJoM3Y5bDctMTJIOWw0LTlIM3ptMTYgMGgtMmwtMy4yIDloMS45bC43LTJoMy4ybC43IDJoMS45TDE5IDJ6bS0yLjE1IDUuNjVMMTggNGwxLjE1IDMuNjVoLTIuM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGFzaC1vZmYiPjxwYXRoIGQ9Ik0zLjI3IDNMMiA0LjI3bDUgNVYxM2gzdjlsMy41OC02LjE0TDE3LjczIDIwIDE5IDE4LjczIDMuMjcgM3pNMTcgMTBoLTRsNC04SDd2Mi4xOGw4LjQ2IDguNDZMMTcgMTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmxhc2gtb24iPjxwYXRoIGQ9Ik03IDJ2MTFoM3Y5bDctMTJoLTRsNC04eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaXAiPjxwYXRoIGQ9Ik0xNSAyMWgydi0yaC0ydjJ6bTQtMTJoMlY3aC0ydjJ6TTMgNXYxNGMwIDEuMS45IDIgMiAyaDR2LTJINVY1aDRWM0g1Yy0xLjEgMC0yIC45LTIgMnptMTYtMnYyaDJjMC0xLjEtLjktMi0yLTJ6bS04IDIwaDJWMWgtMnYyMnptOC02aDJ2LTJoLTJ2MnpNMTUgNWgyVjNoLTJ2MnptNCA4aDJ2LTJoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JhZGllbnQiPjxwYXRoIGQ9Ik0xMSA5aDJ2MmgtMnptLTIgMmgydjJIOXptNCAwaDJ2MmgtMnptMi0yaDJ2MmgtMnpNNyA5aDJ2Mkg3em0xMi02SDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxOEg3di0yaDJ2MnptNCAwaC0ydi0yaDJ2MnptNCAwaC0ydi0yaDJ2MnptMi03aC0ydjJoMnYyaC0ydi0yaC0ydjJoLTJ2LTJoLTJ2Mkg5di0ySDd2Mkg1di0yaDJ2LTJINVY1aDE0djZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JhaW4iPjxwYXRoIGQ9Ik0xMCAxMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6TTYgOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgOGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTEyLThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem0tNCA4Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNC00Yy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTQtNGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bS00LTRjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdyaWQtb2ZmIj48cGF0aCBkPSJNOCA0djEuNDVsMiAyVjRoNHY0aC0zLjQ1bDIgMkgxNHYxLjQ1bDIgMlYxMGg0djRoLTMuNDVsMiAySDIwdjEuNDVsMiAyVjRjMC0xLjEtLjktMi0yLTJINC41NWwyIDJIOHptOCAwaDR2NGgtNFY0ek0xLjI3IDEuMjdMMCAyLjU1bDIgMlYyMGMwIDEuMS45IDIgMiAyaDE1LjQ2bDIgMiAxLjI3LTEuMjdMMS4yNyAxLjI3ek0xMCAxMi41NUwxMS40NSAxNEgxMHYtMS40NXptLTYtNkw1LjQ1IDhINFY2LjU1ek04IDIwSDR2LTRoNHY0em0wLTZINHYtNGgzLjQ1bC41NS41NVYxNHptNiA2aC00di00aDMuNDVsLjU1LjU0VjIwem0yIDB2LTEuNDZMMTcuNDYgMjBIMTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ3JpZC1vbiI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek04IDIwSDR2LTRoNHY0em0wLTZINHYtNGg0djR6bTAtNkg0VjRoNHY0em02IDEyaC00di00aDR2NHptMC02aC00di00aDR2NHptMC02aC00VjRoNHY0em02IDEyaC00di00aDR2NHptMC02aC00di00aDR2NHptMC02aC00VjRoNHY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhkci1vZmYiPjxwYXRoIGQ9Ik0xNy41IDE1di0yaDEuMWwuOSAySDIxbC0uOS0yLjFjLjUtLjIuOS0uOC45LTEuNHYtMWMwLS44LS43LTEuNS0xLjUtMS41SDE2djQuOWwxLjEgMS4xaC40em0wLTQuNWgydjFoLTJ2LTF6bS00LjUgMHYuNGwxLjUgMS41di0xLjljMC0uOC0uNy0xLjUtMS41LTEuNWgtMS45bDEuNSAxLjVoLjR6bS0zLjUtMWwtNy03LTEuMSAxTDYuOSA5aC0uNHYyaC0yVjlIM3Y2aDEuNXYtMi41aDJWMTVIOHYtNC45bDEuNSAxLjVWMTVoMy40bDcuNiA3LjYgMS4xLTEuMS0xMi4xLTEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imhkci1vbiI+PHBhdGggZD0iTTIxIDExLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNUgxNnY2aDEuNXYtMmgxLjFsLjkgMkgyMWwtLjktMi4xYy41LS4zLjktLjguOS0xLjR6bS0xLjUgMGgtMnYtMWgydjF6bS0xMy0uNWgtMlY5SDN2NmgxLjV2LTIuNWgyVjE1SDhWOUg2LjV2MnpNMTMgOUg5LjV2NkgxM2MuOCAwIDEuNS0uNyAxLjUtMS41di0zYzAtLjgtLjctMS41LTEuNS0xLjV6bTAgNC41aC0ydi0zaDJ2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJoZHItc3Ryb25nIj48cGF0aCBkPSJNMTcgNmMtMy4zMSAwLTYgMi42OS02IDZzMi42OSA2IDYgNiA2LTIuNjkgNi02LTIuNjktNi02LTZ6TTUgOGMtMi4yMSAwLTQgMS43OS00IDRzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6bTAgNmMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGRyLXdlYWsiPjxwYXRoIGQ9Ik01IDhjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNC0xLjc5LTQtNC00em0xMi0yYy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2IDYtMi42OSA2LTYtMi42OS02LTYtNnptMCAxMGMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNCA0IDEuNzkgNCA0LTEuNzkgNC00IDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGVhbGluZyI+PHBhdGggZD0iTTE3LjczIDEyLjAybDMuOTgtMy45OGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC00LjM0LTQuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0zLjk4IDMuOThMOCAyLjI5QzcuOCAyLjEgNy41NSAyIDcuMjkgMmMtLjI1IDAtLjUxLjEtLjcuMjlMMi4yNSA2LjYzYy0uMzkuMzktLjM5IDEuMDIgMCAxLjQxbDMuOTggMy45OEwyLjI1IDE2Yy0uMzkuMzktLjM5IDEuMDIgMCAxLjQxbDQuMzQgNC4zNGMuMzkuMzkgMS4wMi4zOSAxLjQxIDBsMy45OC0zLjk4IDMuOTggMy45OGMuMi4yLjQ1LjI5LjcxLjI5LjI2IDAgLjUxLS4xLjcxLS4yOWw0LjM0LTQuMzRjLjM5LS4zOS4zOS0xLjAyIDAtMS40MWwtMy45OS0zLjk4ek0xMiA5Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bS00LjcxIDEuOTZMMy42NiA3LjM0bDMuNjMtMy42MyAzLjYyIDMuNjItMy42MiAzLjYzek0xMCAxM2MtLjU1IDAtMS0uNDUtMS0xcy40NS0xIDEtMSAxIC40NSAxIDEtLjQ1IDEtMSAxem0yIDJjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptMi00Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTIuNjYgOS4zNGwtMy42My0zLjYyIDMuNjMtMy42MyAzLjYyIDMuNjItMy42MiAzLjYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImltYWdlIj48cGF0aCBkPSJNMjEgMTlWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yek04LjUgMTMuNWwyLjUgMy4wMUwxNC41IDEybDQuNSA2SDVsMy41LTQuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbWFnZS1hc3BlY3QtcmF0aW8iPjxwYXRoIGQ9Ik0xNiAxMGgtMnYyaDJ2LTJ6bTAgNGgtMnYyaDJ2LTJ6bS04LTRINnYyaDJ2LTJ6bTQgMGgtMnYyaDJ2LTJ6bTgtNkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6bTAgMTRINFY2aDE2djEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImlzbyI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek01LjUgNy41aDJ2LTJIOXYyaDJWOUg5djJINy41VjloLTJWNy41ek0xOSAxOUg1TDE5IDV2MTR6bS0yLTJ2LTEuNWgtNVYxN2g1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxhbmRzY2FwZSI+PHBhdGggZD0iTTE0IDZsLTMuNzUgNSAyLjg1IDMuOC0xLjYgMS4yQzkuODEgMTMuNzUgNyAxMCA3IDEwbC02IDhoMjJMMTQgNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsZWFrLWFkZCI+PHBhdGggZD0iTTYgM0gzdjNjMS42NiAwIDMtMS4zNCAzLTN6bTggMGgtMmMwIDQuOTctNC4wMyA5LTkgOXYyYzYuMDggMCAxMS00LjkzIDExLTExem0tNCAwSDhjMCAyLjc2LTIuMjQgNS01IDV2MmMzLjg3IDAgNy0zLjEzIDctN3ptMCAxOGgyYzAtNC45NyA0LjAzLTkgOS05di0yYy02LjA3IDAtMTEgNC45My0xMSAxMXptOCAwaDN2LTNjLTEuNjYgMC0zIDEuMzQtMyAzem0tNCAwaDJjMC0yLjc2IDIuMjQtNSA1LTV2LTJjLTMuODcgMC03IDMuMTMtNyA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxlYWstcmVtb3ZlIj48cGF0aCBkPSJNMTAgM0g4YzAgLjM3LS4wNC43Mi0uMTIgMS4wNmwxLjU5IDEuNTlDOS44MSA0Ljg0IDEwIDMuOTQgMTAgM3pNMyA0LjI3bDIuODQgMi44NEM1LjAzIDcuNjcgNC4wNiA4IDMgOHYyYzEuNjEgMCAzLjA5LS41NSA0LjI3LTEuNDZMOC43IDkuOTdDNy4xNCAxMS4yNCA1LjE2IDEyIDMgMTJ2MmMyLjcxIDAgNS4xOS0uOTkgNy4xMS0yLjYybDIuNSAyLjVDMTAuOTkgMTUuODEgMTAgMTguMjkgMTAgMjFoMmMwLTIuMTYuNzYtNC4xNCAyLjAzLTUuNjlsMS40MyAxLjQzQzE0LjU1IDE3LjkxIDE0IDE5LjM5IDE0IDIxaDJjMC0xLjA2LjMzLTIuMDMuODktMi44NEwxOS43MyAyMSAyMSAxOS43MyA0LjI3IDMgMyA0LjI3ek0xNCAzaC0yYzAgMS41LS4zNyAyLjkxLTEuMDIgNC4xNmwxLjQ2IDEuNDZDMTMuNDIgNi45OCAxNCA1LjA2IDE0IDN6bTUuOTQgMTMuMTJjLjM0LS4wOC42OS0uMTIgMS4wNi0uMTJ2LTJjLS45NCAwLTEuODQuMTktMi42Ni41MmwxLjYgMS42em0tNC41Ni00LjU2bDEuNDYgMS40NkMxOC4wOSAxMi4zNyAxOS41IDEyIDIxIDEydi0yYy0yLjA2IDAtMy45OC41OC01LjYyIDEuNTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGVucyI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGlua2VkLWNhbWVyYSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxNCIgcj0iMy4yIj48L2NpcmNsZT48cGF0aCBkPSJNMTYgMy4zM2MyLjU4IDAgNC42NyAyLjA5IDQuNjcgNC42N0gyMmMwLTMuMzEtMi42OS02LTYtNnYxLjMzTTE2IDZjMS4xMSAwIDIgLjg5IDIgMmgxLjMzYzAtMS44NC0xLjQ5LTMuMzMtMy4zMy0zLjMzVjYiPjwvcGF0aD48cGF0aCBkPSJNMTcgOWMwLTEuMTEtLjg5LTItMi0yVjRIOUw3LjE3IDZINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5aC01em0tNSAxMGMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1LTIuMjQgNS01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3MiPjxwYXRoIGQ9Ik0xMiAxMGMtMy44NiAwLTcgMy4xNC03IDdoMmMwLTIuNzYgMi4yNC01IDUtNXM1IDIuMjQgNSA1aDJjMC0zLjg2LTMuMTQtNy03LTd6bTAtNEM1LjkzIDYgMSAxMC45MyAxIDE3aDJjMC00Ljk2IDQuMDQtOSA5LTlzOSA0LjA0IDkgOWgyYzAtNi4wNy00LjkzLTExLTExLTExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLTMiPjxwYXRoIGQ9Ik0xOS4wMSAzaC0xNGMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA3LjVjMCAuODMtLjY3IDEuNS0xLjUgMS41LjgzIDAgMS41LjY3IDEuNSAxLjVWMTVjMCAxLjExLS45IDItMiAyaC00di0yaDR2LTJoLTJ2LTJoMlY5aC00VjdoNGMxLjEgMCAyIC44OSAyIDJ2MS41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLTQiPjxwYXRoIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgMTRoLTJ2LTRIOVY3aDJ2NGgyVjdoMnYxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy01Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS00IDZoLTR2MmgyYzEuMSAwIDIgLjg5IDIgMnYyYzAgMS4xMS0uOSAyLTIgMkg5di0yaDR2LTJIOVY3aDZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb29rcy02Ij48cGF0aCBkPSJNMTEgMTVoMnYtMmgtMnYyem04LTEySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTQgNmgtNHYyaDJjMS4xIDAgMiAuODkgMiAydjJjMCAxLjExLS45IDItMiAyaC0yYy0xLjEgMC0yLS44OS0yLTJWOWMwLTEuMTEuOS0yIDItMmg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9va3Mtb25lIj48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS01IDE0aC0yVjloLTJWN2g0djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvb2tzLXR3byI+PHBhdGggZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tNCA4YzAgMS4xMS0uOSAyLTIgMmgtMnYyaDR2Mkg5di00YzAtMS4xMS45LTIgMi0yaDJWOUg5VjdoNGMxLjEgMCAyIC44OSAyIDJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJsb3VwZSI+PHBhdGggZD0iTTEzIDdoLTJ2NEg3djJoNHY0aDJ2LTRoNHYtMmgtNFY3em0tMS01QzYuNDkgMiAyIDYuNDkgMiAxMnM0LjQ5IDEwIDEwIDEwaDhjMS4xIDAgMi0uOSAyLTJ2LThjMC01LjUxLTQuNDktMTAtMTAtMTB6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vbm9jaHJvbWUtcGhvdG9zIj48cGF0aCBkPSJNMjAgNWgtMy4yTDE1IDNIOUw3LjIgNUg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTRoLTh2LTFjLTIuOCAwLTUtMi4yLTUtNXMyLjItNSA1LTVWN2g4djEyem0tMy02YzAtMi44LTIuMi01LTUtNXYxLjhjMS44IDAgMy4yIDEuNCAzLjIgMy4ycy0xLjQgMy4yLTMuMiAzLjJWMThjMi44IDAgNS0yLjIgNS01em0tOC4yIDBjMCAxLjggMS40IDMuMiAzLjIgMy4yVjkuOGMtMS44IDAtMy4yIDEuNC0zLjIgMy4yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vdmllLWNyZWF0aW9uIj48cGF0aCBkPSJNMTggNGwyIDRoLTNsLTItNGgtMmwyIDRoLTNsLTItNEg4bDIgNEg3TDUgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY0aC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vdmllLWZpbHRlciI+PHBhdGggZD0iTTE4IDRsMiAzaC0zbC0yLTNoLTJsMiAzaC0zbC0yLTNIOGwyIDNIN0w1IDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGgtNHptLTYuNzUgMTEuMjVMMTAgMThsLTEuMjUtMi43NUw2IDE0bDIuNzUtMS4yNUwxMCAxMGwxLjI1IDIuNzVMMTQgMTRsLTIuNzUgMS4yNXptNS42OS0zLjMxTDE2IDE0bC0uOTQtMi4wNkwxMyAxMWwyLjA2LS45NEwxNiA4bC45NCAyLjA2TDE5IDExbC0yLjA2Ljk0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im11c2ljLW5vdGUiPjxwYXRoIGQ9Ik0xMiAzdjEwLjU1Yy0uNTktLjM0LTEuMjctLjU1LTItLjU1LTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNFY3aDRWM2gtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJuYXR1cmUiPjxwYXRoIGQ9Ik0xMyAxNi4xMmMzLjQ3LS40MSA2LjE3LTMuMzYgNi4xNy02Ljk1IDAtMy44Ny0zLjEzLTctNy03cy03IDMuMTMtNyA3YzAgMy40NyAyLjUyIDYuMzQgNS44MyA2Ljg5VjIwSDV2MmgxNHYtMmgtNnYtMy44OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJuYXR1cmUtcGVvcGxlIj48cGF0aCBkPSJNMjIuMTcgOS4xN2MwLTMuODctMy4xMy03LTctN3MtNyAzLjEzLTcgN2MwIDMuNDcgMi41MiA2LjM0IDUuODMgNi44OVYyMEg2di0zaDF2LTRjMC0uNTUtLjQ1LTEtMS0xSDNjLS41NSAwLTEgLjQ1LTEgMXY0aDF2NWgxNnYtMmgtM3YtMy44OGMzLjQ3LS40MSA2LjE3LTMuMzYgNi4xNy02Ljk1ek00LjUgMTFjLjgzIDAgMS41LS42NyAxLjUtMS41UzUuMzMgOCA0LjUgOCAzIDguNjcgMyA5LjUgMy42NyAxMSA0LjUgMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibmF2aWdhdGUtYmVmb3JlIj48cGF0aCBkPSJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJuYXZpZ2F0ZS1uZXh0Ij48cGF0aCBkPSJNMTAgNkw4LjU5IDcuNDEgMTMuMTcgMTJsLTQuNTggNC41OUwxMCAxOGw2LTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFsZXR0ZSI+PHBhdGggZD0iTTEyIDNjLTQuOTcgMC05IDQuMDMtOSA5czQuMDMgOSA5IDljLjgzIDAgMS41LS42NyAxLjUtMS41IDAtLjM5LS4xNS0uNzQtLjM5LTEuMDEtLjIzLS4yNi0uMzgtLjYxLS4zOC0uOTkgMC0uODMuNjctMS41IDEuNS0xLjVIMTZjMi43NiAwIDUtMi4yNCA1LTUgMC00LjQyLTQuMDMtOC05LTh6bS01LjUgOWMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzUuNjcgOSA2LjUgOSA4IDkuNjcgOCAxMC41IDcuMzMgMTIgNi41IDEyem0zLTRDOC42NyA4IDggNy4zMyA4IDYuNVM4LjY3IDUgOS41IDVzMS41LjY3IDEuNSAxLjVTMTAuMzMgOCA5LjUgOHptNSAwYy0uODMgMC0xLjUtLjY3LTEuNS0xLjVTMTMuNjcgNSAxNC41IDVzMS41LjY3IDEuNSAxLjVTMTUuMzMgOCAxNC41IDh6bTMgNGMtLjgzIDAtMS41LS42Ny0xLjUtMS41UzE2LjY3IDkgMTcuNSA5czEuNS42NyAxLjUgMS41LS42NyAxLjUtMS41IDEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW5vcmFtYSI+PHBhdGggZD0iTTIzIDE4VjZjMC0xLjEtLjktMi0yLTJIM2MtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMnpNOC41IDEyLjVsMi41IDMuMDFMMTQuNSAxMWw0LjUgNkg1bDMuNS00LjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEtZmlzaC1leWUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOHMzLjU5LTggOC04IDggMy41OSA4IDgtMy41OSA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwYW5vcmFtYS1ob3Jpem9udGFsIj48cGF0aCBkPSJNMjAgNi41NHYxMC45MWMtMi42LS43Ny01LjI4LTEuMTYtOC0xLjE2LTIuNzIgMC01LjQuMzktOCAxLjE2VjYuNTRjMi42Ljc3IDUuMjggMS4xNiA4IDEuMTYgMi43Mi4wMSA1LjQtLjM4IDgtMS4xNk0yMS40MyA0Yy0uMSAwLS4yLjAyLS4zMS4wNkMxOC4xOCA1LjE2IDE1LjA5IDUuNyAxMiA1LjdjLTMuMDkgMC02LjE4LS41NS05LjEyLTEuNjQtLjExLS4wNC0uMjItLjA2LS4zMS0uMDYtLjM0IDAtLjU3LjIzLS41Ny42M3YxNC43NWMwIC4zOS4yMy42Mi41Ny42Mi4xIDAgLjItLjAyLjMxLS4wNiAyLjk0LTEuMSA2LjAzLTEuNjQgOS4xMi0xLjY0IDMuMDkgMCA2LjE4LjU1IDkuMTIgMS42NC4xMS4wNC4yMS4wNi4zMS4wNi4zMyAwIC41Ny0uMjMuNTctLjYzVjQuNjNjMC0uNC0uMjQtLjYzLS41Ny0uNjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFub3JhbWEtdmVydGljYWwiPjxwYXRoIGQ9Ik0xOS45NCAyMS4xMmMtMS4xLTIuOTQtMS42NC02LjAzLTEuNjQtOS4xMiAwLTMuMDkuNTUtNi4xOCAxLjY0LTkuMTIuMDQtLjExLjA2LS4yMi4wNi0uMzEgMC0uMzQtLjIzLS41Ny0uNjMtLjU3SDQuNjNjLS40IDAtLjYzLjIzLS42My41NyAwIC4xLjAyLjIuMDYuMzFDNS4xNiA1LjgyIDUuNzEgOC45MSA1LjcxIDEyYzAgMy4wOS0uNTUgNi4xOC0xLjY0IDkuMTItLjA1LjExLS4wNy4yMi0uMDcuMzEgMCAuMzMuMjMuNTcuNjMuNTdoMTQuNzVjLjM5IDAgLjYzLS4yNC42My0uNTctLjAxLS4xLS4wMy0uMi0uMDctLjMxek02LjU0IDIwYy43Ny0yLjYgMS4xNi01LjI4IDEuMTYtOCAwLTIuNzItLjM5LTUuNC0xLjE2LThoMTAuOTFjLS43NyAyLjYtMS4xNiA1LjI4LTEuMTYgOCAwIDIuNzIuMzkgNS40IDEuMTYgOEg2LjU0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbm9yYW1hLXdpZGUtYW5nbGUiPjxwYXRoIGQ9Ik0xMiA2YzIuNDUgMCA0LjcxLjIgNy4yOS42NC40NyAxLjc4LjcxIDMuNTguNzEgNS4zNiAwIDEuNzgtLjI0IDMuNTgtLjcxIDUuMzYtMi41OC40NC00Ljg0LjY0LTcuMjkuNjRzLTQuNzEtLjItNy4yOS0uNjRDNC4yNCAxNS41OCA0IDEzLjc4IDQgMTJjMC0xLjc4LjI0LTMuNTguNzEtNS4zNkM3LjI5IDYuMiA5LjU1IDYgMTIgNm0wLTJjLTIuNzMgMC01LjIyLjI0LTcuOTUuNzJsLS45My4xNi0uMjUuOUMyLjI5IDcuODUgMiA5LjkzIDIgMTJzLjI5IDQuMTUuODcgNi4yMmwuMjUuODkuOTMuMTZjMi43My40OSA1LjIyLjczIDcuOTUuNzNzNS4yMi0uMjQgNy45NS0uNzJsLjkzLS4xNi4yNS0uODljLjU4LTIuMDguODctNC4xNi44Ny02LjIzcy0uMjktNC4xNS0uODctNi4yMmwtLjI1LS44OS0uOTMtLjE2QzE3LjIyIDQuMjQgMTQuNzMgNCAxMiA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvIj48cGF0aCBkPSJNMjEgMTlWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yek04LjUgMTMuNWwyLjUgMy4wMUwxNC41IDEybDQuNSA2SDVsMy41LTQuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1hbGJ1bSI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHptMCAxNWwzLTMuODYgMi4xNCAyLjU4IDMtMy44NkwxOCAxOUg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLWNhbWVyYSI+PGNpcmNsZSBjeD0iMTIiIGN5PSIxMiIgcj0iMy4yIj48L2NpcmNsZT48cGF0aCBkPSJNOSAyTDcuMTcgNEg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJoLTMuMTdMMTUgMkg5em0zIDE1Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwaG90by1maWx0ZXIiPjxwYXRoIGQ9Ik0xOS4wMiAxMHY5SDVWNWg5VjNINS4wMmMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMnYtOWgtMnpNMTcgMTBsLjk0LTIuMDZMMjAgN2wtMi4wNi0uOTRMMTcgNGwtLjk0IDIuMDZMMTQgN2wyLjA2Ljk0em0tMy43NS43NUwxMiA4bC0xLjI1IDIuNzVMOCAxMmwyLjc1IDEuMjVMMTIgMTZsMS4yNS0yLjc1TDE2IDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLWxpYnJhcnkiPjxwYXRoIGQ9Ik0yMiAxNlY0YzAtMS4xLS45LTItMi0ySDhjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJ6bS0xMS00bDIuMDMgMi43MUwxNiAxMWw0IDVIOGwzLTR6TTIgNnYxNGMwIDEuMS45IDIgMiAyaDE0di0ySDRWNkgyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBob3RvLXNpemUtc2VsZWN0LWFjdHVhbCI+PHBhdGggZD0iTTIxIDNIM0MyIDMgMSA0IDEgNXYxNGMwIDEuMS45IDIgMiAyaDE4YzEgMCAyLTEgMi0yVjVjMC0xLTEtMi0yLTJ6TTUgMTdsMy41LTQuNSAyLjUgMy4wMUwxNC41IDExbDQuNSA2SDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tc2l6ZS1zZWxlY3QtbGFyZ2UiPjxwYXRoIGQ9Ik0yMSAxNWgydjJoLTJ2LTJ6bTAtNGgydjJoLTJ2LTJ6bTIgOGgtMnYyYzEgMCAyLTEgMi0yek0xMyAzaDJ2MmgtMlYzem04IDRoMnYyaC0yVjd6bTAtNHYyaDJjMC0xLTEtMi0yLTJ6TTEgN2gydjJIMVY3em0xNi00aDJ2MmgtMlYzem0wIDE2aDJ2MmgtMnYtMnpNMyAzQzIgMyAxIDQgMSA1aDJWM3ptNiAwaDJ2Mkg5VjN6TTUgM2gydjJINVYzem0tNCA4djhjMCAxLjEuOSAyIDIgMmgxMlYxMUgxem0yIDhsMi41LTMuMjEgMS43OSAyLjE1IDIuNS0zLjIyTDEzIDE5SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGhvdG8tc2l6ZS1zZWxlY3Qtc21hbGwiPjxwYXRoIGQ9Ik0yMyAxNWgtMnYyaDJ2LTJ6bTAtNGgtMnYyaDJ2LTJ6bTAgOGgtMnYyYzEgMCAyLTEgMi0yek0xNSAzaC0ydjJoMlYzem04IDRoLTJ2MmgyVjd6bS0yLTR2MmgyYzAtMS0xLTItMi0yek0zIDIxaDh2LTZIMXY0YzAgMS4xLjkgMiAyIDJ6TTMgN0gxdjJoMlY3em0xMiAxMmgtMnYyaDJ2LTJ6bTQtMTZoLTJ2MmgyVjN6bTAgMTZoLTJ2Mmgydi0yek0zIDNDMiAzIDEgNCAxIDVoMlYzem0wIDhIMXYyaDJ2LTJ6bTgtOEg5djJoMlYzek03IDNINXYyaDJWM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwaWN0dXJlLWFzLXBkZiI+PHBhdGggZD0iTTIwIDJIOGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tOC41IDcuNWMwIC44My0uNjcgMS41LTEuNSAxLjVIOXYySDcuNVY3SDEwYy44MyAwIDEuNS42NyAxLjUgMS41djF6bTUgMmMwIC44My0uNjcgMS41LTEuNSAxLjVoLTIuNVY3SDE1Yy44MyAwIDEuNS42NyAxLjUgMS41djN6bTQtM0gxOXYxaDEuNVYxMUgxOXYyaC0xLjVWN2gzdjEuNXpNOSA5LjVoMXYtMUg5djF6TTQgNkgydjE0YzAgMS4xLjkgMiAyIDJoMTR2LTJINFY2em0xMCA1LjVoMXYtM2gtMXYzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBvcnRyYWl0Ij48cGF0aCBkPSJNMTIgMTIuMjVjMS4yNCAwIDIuMjUtMS4wMSAyLjI1LTIuMjVTMTMuMjQgNy43NSAxMiA3Ljc1IDkuNzUgOC43NiA5Ljc1IDEwczEuMDEgMi4yNSAyLjI1IDIuMjV6bTQuNSA0YzAtMS41LTMtMi4yNS00LjUtMi4yNXMtNC41Ljc1LTQuNSAyLjI1VjE3aDl2LS43NXpNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bTAgMTZINVY1aDE0djE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZS1yZWQtZXllIj48cGF0aCBkPSJNMTIgNC41QzcgNC41IDIuNzMgNy42MSAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjVzOS4yNy0zLjExIDExLTcuNWMtMS43My00LjM5LTYtNy41LTExLTcuNXpNMTIgMTdjLTIuNzYgMC01LTIuMjQtNS01czIuMjQtNSA1LTUgNSAyLjI0IDUgNS0yLjI0IDUtNSA1em0wLThjLTEuNjYgMC0zIDEuMzQtMyAzczEuMzQgMyAzIDMgMy0xLjM0IDMtMy0xLjM0LTMtMy0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdGF0ZS05MC1kZWdyZWVzLWNjdyI+PHBhdGggZD0iTTcuMzQgNi40MUwuODYgMTIuOWw2LjQ5IDYuNDggNi40OS02LjQ4LTYuNS02LjQ5ek0zLjY5IDEyLjlsMy42Ni0zLjY2TDExIDEyLjlsLTMuNjYgMy42Ni0zLjY1LTMuNjZ6bTE1LjY3LTYuMjZDMTcuNjEgNC44OCAxNS4zIDQgMTMgNFYuNzZMOC43NiA1IDEzIDkuMjRWNmMxLjc5IDAgMy41OC42OCA0Ljk1IDIuMDUgMi43MyAyLjczIDIuNzMgNy4xNyAwIDkuOUMxNi41OCAxOS4zMiAxNC43OSAyMCAxMyAyMGMtLjk3IDAtMS45NC0uMjEtMi44NC0uNjFsLTEuNDkgMS40OUMxMC4wMiAyMS42MiAxMS41MSAyMiAxMyAyMmMyLjMgMCA0LjYxLS44OCA2LjM2LTIuNjQgMy41Mi0zLjUxIDMuNTItOS4yMSAwLTEyLjcyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJvdGF0ZS1sZWZ0Ij48cGF0aCBkPSJNNy4xMSA4LjUzTDUuNyA3LjExQzQuOCA4LjI3IDQuMjQgOS42MSA0LjA3IDExaDIuMDJjLjE0LS44Ny40OS0xLjcyIDEuMDItMi40N3pNNi4wOSAxM0g0LjA3Yy4xNyAxLjM5LjcyIDIuNzMgMS42MiAzLjg5bDEuNDEtMS40MmMtLjUyLS43NS0uODctMS41OS0xLjAxLTIuNDd6bTEuMDEgNS4zMmMxLjE2LjkgMi41MSAxLjQ0IDMuOSAxLjYxVjE3LjljLS44Ny0uMTUtMS43MS0uNDktMi40Ni0xLjAzTDcuMSAxOC4zMnpNMTMgNC4wN1YxTDguNDUgNS41NSAxMyAxMFY2LjA5YzIuODQuNDggNSAyLjk0IDUgNS45MXMtMi4xNiA1LjQzLTUgNS45MXYyLjAyYzMuOTUtLjQ5IDctMy44NSA3LTcuOTNzLTMuMDUtNy40NC03LTcuOTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icm90YXRlLXJpZ2h0Ij48cGF0aCBkPSJNMTUuNTUgNS41NUwxMSAxdjMuMDdDNy4wNiA0LjU2IDQgNy45MiA0IDEyczMuMDUgNy40NCA3IDcuOTN2LTIuMDJjLTIuODQtLjQ4LTUtMi45NC01LTUuOTFzMi4xNi01LjQzIDUtNS45MVYxMGw0LjU1LTQuNDV6TTE5LjkzIDExYy0uMTctMS4zOS0uNzItMi43My0xLjYyLTMuODlsLTEuNDIgMS40MmMuNTQuNzUuODggMS42IDEuMDIgMi40N2gyLjAyek0xMyAxNy45djIuMDJjMS4zOS0uMTcgMi43NC0uNzEgMy45LTEuNjFsLTEuNDQtMS40NGMtLjc1LjU0LTEuNTkuODktMi40NiAxLjAzem0zLjg5LTIuNDJsMS40MiAxLjQxYy45LTEuMTYgMS40NS0yLjUgMS42Mi0zLjg5aC0yLjAyYy0uMTQuODctLjQ4IDEuNzItMS4wMiAyLjQ4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNsaWRlc2hvdyI+PHBhdGggZD0iTTEwIDh2OGw1LTQtNS00em05LTVINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2SDVWNWgxNHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdHJhaWdodGVuIj48cGF0aCBkPSJNMjEgNkgzYy0xLjEgMC0yIC45LTIgMnY4YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnptMCAxMEgzVjhoMnY0aDJWOGgydjRoMlY4aDJ2NGgyVjhoMnY0aDJWOGgydjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3R5bGUiPjxwYXRoIGQ9Ik0yLjUzIDE5LjY1bDEuMzQuNTZ2LTkuMDNsLTIuNDMgNS44NmMtLjQxIDEuMDIuMDggMi4xOSAxLjA5IDIuNjF6bTE5LjUtMy43TDE3LjA3IDMuOThjLS4zMS0uNzUtMS4wNC0xLjIxLTEuODEtMS4yMy0uMjYgMC0uNTMuMDQtLjc5LjE1TDcuMSA1Ljk1Yy0uNzUuMzEtMS4yMSAxLjAzLTEuMjMgMS44LS4wMS4yNy4wNC41NC4xNS44bDQuOTYgMTEuOTdjLjMxLjc2IDEuMDUgMS4yMiAxLjgzIDEuMjMuMjYgMCAuNTItLjA1Ljc3LS4xNWw3LjM2LTMuMDVjMS4wMi0uNDIgMS41MS0xLjU5IDEuMDktMi42ek03Ljg4IDguNzVjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTIgMTFjMCAxLjEuOSAyIDIgMmgxLjQ1bC0zLjQ1LTguMzR2Ni4zNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzd2l0Y2gtY2FtZXJhIj48cGF0aCBkPSJNMjAgNGgtMy4xN0wxNSAySDlMNy4xNyA0SDRjLTEuMSAwLTIgLjktMiAydjEyYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptLTUgMTEuNVYxM0g5djIuNUw1LjUgMTIgOSA4LjVWMTFoNlY4LjVsMy41IDMuNS0zLjUgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN3aXRjaC12aWRlbyI+PHBhdGggZD0iTTE4IDkuNVY2YzAtLjU1LS40NS0xLTEtMUgzYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoMTRjLjU1IDAgMS0uNDUgMS0xdi0zLjVsNCA0di0xM2wtNCA0em0tNSA2VjEzSDd2Mi41TDMuNSAxMiA3IDguNVYxMWg2VjguNWwzLjUgMy41LTMuNSAzLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGFnLWZhY2VzIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0zLjUtOWMuODMgMCAxLjUtLjY3IDEuNS0xLjVTMTYuMzMgOCAxNS41IDggMTQgOC42NyAxNCA5LjVzLjY3IDEuNSAxLjUgMS41em0tNyAwYy44MyAwIDEuNS0uNjcgMS41LTEuNVM5LjMzIDggOC41IDggNyA4LjY3IDcgOS41IDcuNjcgMTEgOC41IDExem0zLjUgNi41YzIuMzMgMCA0LjMxLTEuNDYgNS4xMS0zLjVINi44OWMuOCAyLjA0IDIuNzggMy41IDUuMTEgMy41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRleHR1cmUiPjxwYXRoIGQ9Ik0xOS41MSAzLjA4TDMuMDggMTkuNTFjLjA5LjM0LjI3LjY1LjUxLjkuMjUuMjQuNTYuNDIuOS41MUwyMC45MyA0LjQ5Yy0uMTktLjY5LS43My0xLjIzLTEuNDItMS40MXpNMTEuODggM0wzIDExLjg4djIuODNMMTQuNzEgM2gtMi44M3pNNSAzYy0xLjEgMC0yIC45LTIgMnYybDQtNEg1em0xNCAxOGMuNTUgMCAxLjA1LS4yMiAxLjQxLS41OS4zNy0uMzYuNTktLjg2LjU5LTEuNDF2LTJsLTQgNGgyem0tOS43MSAwaDIuODNMMjEgMTIuMTJWOS4yOUw5LjI5IDIxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVsYXBzZSI+PHBhdGggZD0iTTE2LjI0IDcuNzZDMTUuMDcgNi41OSAxMy41NCA2IDEyIDZ2NmwtNC4yNCA0LjI0YzIuMzQgMi4zNCA2LjE0IDIuMzQgOC40OSAwIDIuMzQtMi4zNCAyLjM0LTYuMTQtLjAxLTguNDh6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRpbWVyIj48cGF0aCBkPSJNMTUgMUg5djJoNlYxem0tNCAxM2gyVjhoLTJ2NnptOC4wMy02LjYxbDEuNDItMS40MmMtLjQzLS41MS0uOS0uOTktMS40MS0xLjQxbC0xLjQyIDEuNDJDMTYuMDcgNC43NCAxNC4xMiA0IDEyIDRjLTQuOTcgMC05IDQuMDMtOSA5czQuMDIgOSA5IDkgOS00LjAzIDktOWMwLTIuMTItLjc0LTQuMDctMS45Ny01LjYxek0xMiAyMGMtMy44NyAwLTctMy4xMy03LTdzMy4xMy03IDctNyA3IDMuMTMgNyA3LTMuMTMgNy03IDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZXItMTAiPjxwYXRoIGQ9Ik0wIDcuNzJWOS40bDMtMVYxOGgyVjZoLS4yNUwwIDcuNzJ6bTIzLjc4IDYuNjVjLS4xNC0uMjgtLjM1LS41My0uNjMtLjc0LS4yOC0uMjEtLjYxLS4zOS0xLjAxLS41M3MtLjg1LS4yNy0xLjM1LS4zOGMtLjM1LS4wNy0uNjQtLjE1LS44Ny0uMjMtLjIzLS4wOC0uNDEtLjE2LS41NS0uMjUtLjE0LS4wOS0uMjMtLjE5LS4yOC0uMy0uMDUtLjExLS4wOC0uMjQtLjA4LS4zOSAwLS4xNC4wMy0uMjguMDktLjQxLjA2LS4xMy4xNS0uMjUuMjctLjM0LjEyLS4xLjI3LS4xOC40NS0uMjRzLjQtLjA5LjY0LS4wOWMuMjUgMCAuNDcuMDQuNjYuMTEuMTkuMDcuMzUuMTcuNDguMjkuMTMuMTIuMjIuMjYuMjkuNDIuMDYuMTYuMS4zMi4xLjQ5aDEuOTVjMC0uMzktLjA4LS43NS0uMjQtMS4wOS0uMTYtLjM0LS4zOS0uNjMtLjY5LS44OC0uMy0uMjUtLjY2LS40NC0xLjA5LS41OUMyMS40OSA5LjA3IDIxIDkgMjAuNDYgOWMtLjUxIDAtLjk4LjA3LTEuMzkuMjEtLjQxLjE0LS43Ny4zMy0xLjA2LjU3LS4yOS4yNC0uNTEuNTItLjY3Ljg0LS4xNi4zMi0uMjMuNjUtLjIzIDEuMDFzLjA4LjY5LjIzLjk2Yy4xNS4yOC4zNi41Mi42NC43My4yNy4yMS42LjM4Ljk4LjUzLjM4LjE0LjgxLjI2IDEuMjcuMzYuMzkuMDguNzEuMTcuOTUuMjZzLjQzLjE5LjU3LjI5Yy4xMy4xLjIyLjIyLjI3LjM0LjA1LjEyLjA3LjI1LjA3LjM5IDAgLjMyLS4xMy41Ny0uNC43Ny0uMjcuMi0uNjYuMjktMS4xNy4yOS0uMjIgMC0uNDMtLjAyLS42NC0uMDgtLjIxLS4wNS0uNC0uMTMtLjU2LS4yNC0uMTctLjExLS4zLS4yNi0uNDEtLjQ0LS4xMS0uMTgtLjE3LS40MS0uMTgtLjY3aC0xLjg5YzAgLjM2LjA4LjcxLjI0IDEuMDUuMTYuMzQuMzkuNjUuNy45My4zMS4yNy42OS40OSAxLjE1LjY2LjQ2LjE3Ljk4LjI1IDEuNTguMjUuNTMgMCAxLjAxLS4wNiAxLjQ0LS4xOS40My0uMTMuOC0uMzEgMS4xMS0uNTQuMzEtLjIzLjU0LS41MS43MS0uODMuMTctLjMyLjI1LS42Ny4yNS0xLjA2LS4wMi0uNC0uMDktLjc0LS4yNC0xLjAyem0tOS45Ni03LjMyYy0uMzQtLjQtLjc1LS43LTEuMjMtLjg4LS40Ny0uMTgtMS4wMS0uMjctMS41OS0uMjctLjU4IDAtMS4xMS4wOS0xLjU5LjI3LS40OC4xOC0uODkuNDctMS4yMy44OC0uMzQuNDEtLjYuOTMtLjc5IDEuNTktLjE4LjY1LS4yOCAxLjQ1LS4yOCAyLjM5djEuOTJjMCAuOTQuMDkgMS43NC4yOCAyLjM5LjE5LjY2LjQ1IDEuMTkuOCAxLjYuMzQuNDEuNzUuNzEgMS4yMy44OS40OC4xOCAxLjAxLjI4IDEuNTkuMjguNTkgMCAxLjEyLS4wOSAxLjU5LS4yOC40OC0uMTguODgtLjQ4IDEuMjItLjg5LjM0LS40MS42LS45NC43OC0xLjYuMTgtLjY1LjI4LTEuNDUuMjgtMi4zOXYtMS45MmMwLS45NC0uMDktMS43NC0uMjgtMi4zOS0uMTgtLjY2LS40NC0xLjE5LS43OC0xLjU5em0tLjkyIDYuMTdjMCAuNi0uMDQgMS4xMS0uMTIgMS41My0uMDguNDItLjIuNzYtLjM2IDEuMDItLjE2LjI2LS4zNi40NS0uNTkuNTctLjIzLjEyLS41MS4xOC0uODIuMTgtLjMgMC0uNTgtLjA2LS44Mi0uMThzLS40NC0uMzEtLjYtLjU3Yy0uMTYtLjI2LS4yOS0uNi0uMzgtMS4wMi0uMDktLjQyLS4xMy0uOTMtLjEzLTEuNTN2LTIuNWMwLS42LjA0LTEuMTEuMTMtMS41Mi4wOS0uNDEuMjEtLjc0LjM4LTEgLjE2LS4yNS4zNi0uNDMuNi0uNTUuMjQtLjExLjUxLS4xNy44MS0uMTcuMzEgMCAuNTguMDYuODEuMTcuMjQuMTEuNDQuMjkuNi41NS4xNi4yNS4yOS41OC4zNy45OS4wOC40MS4xMy45Mi4xMyAxLjUydjIuNTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGltZXItMyI+PHBhdGggZD0iTTExLjYxIDEyLjk3Yy0uMTYtLjI0LS4zNi0uNDYtLjYyLS42NS0uMjUtLjE5LS41Ni0uMzUtLjkzLS40OC4zLS4xNC41Ny0uMy44LS41LjIzLS4yLjQyLS40MS41Ny0uNjQuMTUtLjIzLjI3LS40Ni4zNC0uNzEuMDgtLjI0LjExLS40OS4xMS0uNzMgMC0uNTUtLjA5LTEuMDQtLjI4LTEuNDYtLjE4LS40Mi0uNDQtLjc3LS43OC0xLjA2LS4zMy0uMjgtLjczLS41LTEuMi0uNjQtLjQ1LS4xMy0uOTctLjItMS41My0uMi0uNTUgMC0xLjA2LjA4LTEuNTIuMjQtLjQ3LjE3LS44Ny40LTEuMi42OS0uMzMuMjktLjYuNjMtLjc4IDEuMDMtLjIuMzktLjI5LjgzLS4yOSAxLjI5aDEuOThjMC0uMjYuMDUtLjQ5LjE0LS42OS4wOS0uMi4yMi0uMzguMzgtLjUyLjE3LS4xNC4zNi0uMjUuNTgtLjMzLjIyLS4wOC40Ni0uMTIuNzMtLjEyLjYxIDAgMS4wNi4xNiAxLjM2LjQ3LjMuMzEuNDQuNzUuNDQgMS4zMiAwIC4yNy0uMDQuNTItLjEyLjc0LS4wOC4yMi0uMjEuNDEtLjM4LjU3LS4xNy4xNi0uMzguMjgtLjYzLjM3LS4yNS4wOS0uNTUuMTMtLjg5LjEzSDYuNzJ2MS41N0g3LjljLjM0IDAgLjY0LjA0LjkxLjExLjI3LjA4LjUuMTkuNjkuMzUuMTkuMTYuMzQuMzYuNDQuNjEuMS4yNC4xNi41NC4xNi44NyAwIC42Mi0uMTggMS4wOS0uNTMgMS40Mi0uMzUuMzMtLjg0LjQ5LTEuNDUuNDktLjI5IDAtLjU2LS4wNC0uOC0uMTMtLjI0LS4wOC0uNDQtLjItLjYxLS4zNi0uMTctLjE2LS4zLS4zNC0uMzktLjU2LS4wOS0uMjItLjE0LS40Ni0uMTQtLjcySDQuMTljMCAuNTUuMTEgMS4wMy4zMiAxLjQ1LjIxLjQyLjUuNzcuODYgMS4wNXMuNzcuNDkgMS4yNC42My45Ni4yMSAxLjQ4LjIxYy41NyAwIDEuMDktLjA4IDEuNTgtLjIzLjQ5LS4xNS45MS0uMzggMS4yNi0uNjguMzYtLjMuNjQtLjY2Ljg0LTEuMS4yLS40My4zLS45My4zLTEuNDggMC0uMjktLjA0LS41OC0uMTEtLjg2LS4wOC0uMjUtLjE5LS41MS0uMzUtLjc2em05LjI2IDEuNGMtLjE0LS4yOC0uMzUtLjUzLS42My0uNzQtLjI4LS4yMS0uNjEtLjM5LTEuMDEtLjUzcy0uODUtLjI3LTEuMzUtLjM4Yy0uMzUtLjA3LS42NC0uMTUtLjg3LS4yMy0uMjMtLjA4LS40MS0uMTYtLjU1LS4yNS0uMTQtLjA5LS4yMy0uMTktLjI4LS4zLS4wNS0uMTEtLjA4LS4yNC0uMDgtLjM5cy4wMy0uMjguMDktLjQxYy4wNi0uMTMuMTUtLjI1LjI3LS4zNC4xMi0uMS4yNy0uMTguNDUtLjI0cy40LS4wOS42NC0uMDljLjI1IDAgLjQ3LjA0LjY2LjExLjE5LjA3LjM1LjE3LjQ4LjI5LjEzLjEyLjIyLjI2LjI5LjQyLjA2LjE2LjEuMzIuMS40OWgxLjk1YzAtLjM5LS4wOC0uNzUtLjI0LTEuMDktLjE2LS4zNC0uMzktLjYzLS42OS0uODgtLjMtLjI1LS42Ni0uNDQtMS4wOS0uNTktLjQzLS4xNS0uOTItLjIyLTEuNDYtLjIyLS41MSAwLS45OC4wNy0xLjM5LjIxLS40MS4xNC0uNzcuMzMtMS4wNi41Ny0uMjkuMjQtLjUxLjUyLS42Ny44NC0uMTYuMzItLjIzLjY1LS4yMyAxLjAxcy4wOC42OC4yMy45NmMuMTUuMjguMzcuNTIuNjQuNzMuMjcuMjEuNi4zOC45OC41My4zOC4xNC44MS4yNiAxLjI3LjM2LjM5LjA4LjcxLjE3Ljk1LjI2cy40My4xOS41Ny4yOWMuMTMuMS4yMi4yMi4yNy4zNC4wNS4xMi4wNy4yNS4wNy4zOSAwIC4zMi0uMTMuNTctLjQuNzctLjI3LjItLjY2LjI5LTEuMTcuMjktLjIyIDAtLjQzLS4wMi0uNjQtLjA4LS4yMS0uMDUtLjQtLjEzLS41Ni0uMjQtLjE3LS4xMS0uMy0uMjYtLjQxLS40NC0uMTEtLjE4LS4xNy0uNDEtLjE4LS42N2gtMS44OWMwIC4zNi4wOC43MS4yNCAxLjA1LjE2LjM0LjM5LjY1LjcuOTMuMzEuMjcuNjkuNDkgMS4xNS42Ni40Ni4xNy45OC4yNSAxLjU4LjI1LjUzIDAgMS4wMS0uMDYgMS40NC0uMTkuNDMtLjEzLjgtLjMxIDEuMTEtLjU0LjMxLS4yMy41NC0uNTEuNzEtLjgzLjE3LS4zMi4yNS0uNjcuMjUtMS4wNi0uMDItLjQtLjA5LS43NC0uMjQtMS4wMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lci1vZmYiPjxwYXRoIGQ9Ik0xOS4wNCA0LjU1bC0xLjQyIDEuNDJDMTYuMDcgNC43NCAxNC4xMiA0IDEyIDRjLTEuODMgMC0zLjUzLjU1LTQuOTUgMS40OGwxLjQ2IDEuNDZDOS41MyA2LjM1IDEwLjczIDYgMTIgNmMzLjg3IDAgNyAzLjEzIDcgNyAwIDEuMjctLjM1IDIuNDctLjk0IDMuNDlsMS40NSAxLjQ1QzIwLjQ1IDE2LjUzIDIxIDE0LjgzIDIxIDEzYzAtMi4xMi0uNzQtNC4wNy0xLjk3LTUuNjFsMS40Mi0xLjQyLTEuNDEtMS40MnpNMTUgMUg5djJoNlYxem0tNCA4LjQ0bDIgMlY4aC0ydjEuNDR6TTMuMDIgNEwxLjc1IDUuMjcgNC41IDguMDNDMy41NSA5LjQ1IDMgMTEuMTYgMyAxM2MwIDQuOTcgNC4wMiA5IDkgOSAxLjg0IDAgMy41NS0uNTUgNC45OC0xLjVsMi41IDIuNSAxLjI3LTEuMjctNy43MS03LjcxTDMuMDIgNHpNMTIgMjBjLTMuODcgMC03LTMuMTMtNy03IDAtMS4yOC4zNS0yLjQ4Ljk1LTMuNTJsOS41NiA5LjU2Yy0xLjAzLjYxLTIuMjMuOTYtMy41MS45NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0b25hbGl0eSI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bS0xIDE3LjkzYy0zLjk0LS40OS03LTMuODUtNy03LjkzczMuMDUtNy40NCA3LTcuOTN2MTUuODZ6bTItMTUuODZjMS4wMy4xMyAyIC40NSAyLjg3LjkzSDEzdi0uOTN6TTEzIDdoNS4yNGMuMjUuMzEuNDguNjUuNjggMUgxM1Y3em0wIDNoNi43NGMuMDguMzMuMTUuNjYuMTkgMUgxM3YtMXptMCA5LjkzVjE5aDIuODdjLS44Ny40OC0xLjg0LjgtMi44Ny45M3pNMTguMjQgMTdIMTN2LTFoNS45MmMtLjIuMzUtLjQzLjY5LS42OCAxem0xLjUtM0gxM3YtMWg2LjkzYy0uMDQuMzQtLjExLjY3LS4xOSAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyYW5zZm9ybSI+PHBhdGggZD0iTTIyIDE4di0ySDhWNGgyTDcgMSA0IDRoMnYySDJ2Mmg0djhjMCAxLjEuOSAyIDIgMmg4djJoLTJsMyAzIDMtM2gtMnYtMmg0ek0xMCA4aDZ2NmgyVjhjMC0xLjEtLjktMi0yLTJoLTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0dW5lIj48cGF0aCBkPSJNMyAxN3YyaDZ2LTJIM3pNMyA1djJoMTBWNUgzem0xMCAxNnYtMmg4di0yaC04di0yaC0ydjZoMnpNNyA5djJIM3YyaDR2MmgyVjlIN3ptMTQgNHYtMkgxMXYyaDEwem0tNi00aDJWN2g0VjVoLTRWM2gtMnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctY29tZnkiPjxwYXRoIGQ9Ik0zIDloNFY1SDN2NHptMCA1aDR2LTRIM3Y0em01IDBoNHYtNEg4djR6bTUgMGg0di00aC00djR6TTggOWg0VjVIOHY0em01LTR2NGg0VjVoLTR6bTUgOWg0di00aC00djR6TTMgMTloNHYtNEgzdjR6bTUgMGg0di00SDh2NHptNSAwaDR2LTRoLTR2NHptNSAwaDR2LTRoLTR2NHptMC0xNHY0aDRWNWgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWNvbXBhY3QiPjxwYXRoIGQ9Ik0zIDE5aDZ2LTdIM3Y3em03IDBoMTJ2LTdIMTB2N3pNMyA1djZoMTlWNUgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZ25ldHRlIj48cGF0aCBkPSJNMjEgM0gzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS05IDE1Yy00LjQyIDAtOC0yLjY5LTgtNnMzLjU4LTYgOC02IDggMi42OSA4IDYtMy41OCA2LTggNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3Yi1hdXRvIj48cGF0aCBkPSJNNi44NSAxMi42NWgyLjNMOCA5bC0xLjE1IDMuNjV6TTIyIDdsLTEuMiA2LjI5TDE5LjMgN2gtMS42bC0xLjQ5IDYuMjlMMTUgN2gtLjc2QzEyLjc3IDUuMTcgMTAuNTMgNCA4IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDhjMy4xMyAwIDUuODQtMS44MSA3LjE1LTQuNDNsLjEuNDNIMTdsMS41LTYuMUwyMCAxNmgxLjc1bDIuMDUtOUgyMnptLTExLjcgOWwtLjctMkg2LjRsLS43IDJIMy44TDcgN2gybDMuMiA5aC0xLjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2ItY2xvdWR5Ij48cGF0aCBkPSJNMTkuMzYgMTAuMDRDMTguNjcgNi41OSAxNS42NCA0IDEyIDQgOS4xMSA0IDYuNiA1LjY0IDUuMzUgOC4wNCAyLjM0IDguMzYgMCAxMC45MSAwIDE0YzAgMy4zMSAyLjY5IDYgNiA2aDEzYzIuNzYgMCA1LTIuMjQgNS01IDAtMi42NC0yLjA1LTQuNzgtNC42NC00Ljk2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndiLWluY2FuZGVzY2VudCI+PHBhdGggZD0iTTMuNTUgMTguNTRsMS40MSAxLjQxIDEuNzktMS44LTEuNDEtMS40MS0xLjc5IDEuOHpNMTEgMjIuNDVoMlYxOS41aC0ydjIuOTV6TTQgMTAuNUgxdjJoM3YtMnptMTEtNC4xOVYxLjVIOXY0LjgxQzcuMjEgNy4zNSA2IDkuMjggNiAxMS41YzAgMy4zMSAyLjY5IDYgNiA2czYtMi42OSA2LTZjMC0yLjIyLTEuMjEtNC4xNS0zLTUuMTl6bTUgNC4xOXYyaDN2LTJoLTN6bS0yLjc2IDcuNjZsMS43OSAxLjggMS40MS0xLjQxLTEuOC0xLjc5LTEuNCAxLjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2ItaXJpZGVzY2VudCI+PHBhdGggZD0iTTUgMTQuNWgxNHYtNkg1djZ6TTExIC41NVYzLjVoMlYuNTVoLTJ6bTguMDQgMi41bC0xLjc5IDEuNzkgMS40MSAxLjQxIDEuOC0xLjc5LTEuNDItMS40MXpNMTMgMjIuNDVWMTkuNWgtMnYyLjk1aDJ6bTcuNDUtMy45MWwtMS44LTEuNzktMS40MSAxLjQxIDEuNzkgMS44IDEuNDItMS40MnpNMy41NSA0LjQ2bDEuNzkgMS43OSAxLjQxLTEuNDEtMS43OS0xLjc5LTEuNDEgMS40MXptMS40MSAxNS40OWwxLjc5LTEuOC0xLjQxLTEuNDEtMS43OSAxLjc5IDEuNDEgMS40MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ3Yi1zdW5ueSI+PHBhdGggZD0iTTYuNzYgNC44NGwtMS44LTEuNzktMS40MSAxLjQxIDEuNzkgMS43OSAxLjQyLTEuNDF6TTQgMTAuNUgxdjJoM3YtMnptOS05Ljk1aC0yVjMuNWgyVi41NXptNy40NSAzLjkxbC0xLjQxLTEuNDEtMS43OSAxLjc5IDEuNDEgMS40MSAxLjc5LTEuNzl6bS0zLjIxIDEzLjdsMS43OSAxLjggMS40MS0xLjQxLTEuOC0xLjc5LTEuNCAxLjR6TTIwIDEwLjV2Mmgzdi0yaC0zem0tOC01Yy0zLjMxIDAtNiAyLjY5LTYgNnMyLjY5IDYgNiA2IDYtMi42OSA2LTYtMi42OS02LTYtNnptLTEgMTYuOTVoMlYxOS41aC0ydjIuOTV6bS03LjQ1LTMuOTFsMS40MSAxLjQxIDEuNzktMS44LTEuNDEtMS40MS0xLjc5IDEuOHoiPjwvcGF0aD48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSQyLmNvbnRlbnQpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNCBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgoKICAgIGBpcm9uLWljb25zYCBpcyBhIHV0aWxpdHkgaW1wb3J0IHRoYXQgaW5jbHVkZXMgdGhlIGRlZmluaXRpb24gZm9yIHRoZQogICAgYGlyb24taWNvbmAgZWxlbWVudCwgYGlyb24taWNvbnNldC1zdmdgIGVsZW1lbnQsIGFzIHdlbGwgYXMgYW4gaW1wb3J0IGZvciB0aGUKICAgIGRlZmF1bHQgaWNvbiBzZXQuCgogICAgVGhlIGBpcm9uLWljb25zYCBkaXJlY3RvcnkgYWxzbyBpbmNsdWRlcyBpbXBvcnRzIGZvciBhZGRpdGlvbmFsIGljb24gc2V0cyB0aGF0CiAgICBjYW4gYmUgbG9hZGVkIGludG8geW91ciBwcm9qZWN0LgoKICAgIEV4YW1wbGUgbG9hZGluZyBpY29uIHNldDoKCiAgICAgICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiPgogICAgICAgICAgaW1wb3J0ICdAcG9seW1lci9pcm9uLWljb25zL21hcHMtaWNvbnMuanMnOwogICAgICAgIDwvSkFWQV9TQ1JJSUlJUFQvPgoKICAgIFRvIHVzZSBhbiBpY29uIGZyb20gb25lIG9mIHRoZXNlIHNldHMsIGZpcnN0IHByZWZpeCB5b3VyIGBpcm9uLWljb25gIHdpdGggdGhlCiAgICBpY29uIHNldCBuYW1lLCBmb2xsb3dlZCBieSBhIGNvbG9uLCAiOiIsIGFuZCB0aGVuIHRoZSBpY29uIGlkLgoKICAgIEV4YW1wbGUgdXNpbmcgdGhlIGRpcmVjdGlvbnMtYnVzIGljb24gZnJvbSB0aGUgbWFwcyBpY29uIHNldDoKCiAgICAgICAgPGlyb24taWNvbiBpY29uPSJtYXBzOmRpcmVjdGlvbnMtYnVzIj48L2lyb24taWNvbj4KCiAgICBTZWUgW2lyb24taWNvbl0oaHR0cHM6Ly93d3cud2ViY29tcG9uZW50cy5vcmcvZWxlbWVudC9AcG9seW1lci9pcm9uLWljb24pIGZvcgogICAgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB3b3JraW5nIHdpdGggaWNvbnMuCgogICAgU2VlIFtpcm9uLWljb25zZXRdKGh0dHBzOi8vd3d3LndlYmNvbXBvbmVudHMub3JnL2VsZW1lbnQvQHBvbHltZXIvaXJvbi1pY29uc2V0KQogICAgYW5kCiAgICBbaXJvbi1pY29uc2V0LXN2Z10oaHR0cHM6Ly93d3cud2ViY29tcG9uZW50cy5vcmcvZWxlbWVudC9AcG9seW1lci9pcm9uLWljb25zZXQtc3ZnKQogICAgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgaG93IHRvIGNyZWF0ZSBhIGN1c3RvbSBpY29uc2V0LgoKICAgIEBncm91cCBJcm9uIEVsZW1lbnRzCiAgICBAcHNldWRvRWxlbWVudCBpcm9uLWljb25zCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCgogICAgY29uc3QgdGVtcGxhdGUkMyA9IGh0bWxgPGlyb24taWNvbnNldC1zdmcgbmFtZT0iaWNvbnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9IjNkLXJvdGF0aW9uIj48cGF0aCBkPSJNNy41MiAyMS40OEM0LjI1IDE5Ljk0IDEuOTEgMTYuNzYgMS41NSAxM0guMDVDLjU2IDE5LjE2IDUuNzEgMjQgMTIgMjRsLjY2LS4wMy0zLjgxLTMuODEtMS4zMyAxLjMyem0uODktNi41MmMtLjE5IDAtLjM3LS4wMy0uNTItLjA4LS4xNi0uMDYtLjI5LS4xMy0uNC0uMjQtLjExLS4xLS4yLS4yMi0uMjYtLjM3LS4wNi0uMTQtLjA5LS4zLS4wOS0uNDdoLTEuM2MwIC4zNi4wNy42OC4yMS45NS4xNC4yNy4zMy41LjU2LjY5LjI0LjE4LjUxLjMyLjgyLjQxLjMuMS42Mi4xNS45Ni4xNS4zNyAwIC43Mi0uMDUgMS4wMy0uMTUuMzItLjEuNi0uMjUuODMtLjQ0cy40Mi0uNDMuNTUtLjcyYy4xMy0uMjkuMi0uNjEuMi0uOTcgMC0uMTktLjAyLS4zOC0uMDctLjU2LS4wNS0uMTgtLjEyLS4zNS0uMjMtLjUxLS4xLS4xNi0uMjQtLjMtLjQtLjQzLS4xNy0uMTMtLjM3LS4yMy0uNjEtLjMxLjItLjA5LjM3LS4yLjUyLS4zMy4xNS0uMTMuMjctLjI3LjM3LS40Mi4xLS4xNS4xNy0uMy4yMi0uNDYuMDUtLjE2LjA3LS4zMi4wNy0uNDggMC0uMzYtLjA2LS42OC0uMTgtLjk2LS4xMi0uMjgtLjI5LS41MS0uNTEtLjY5LS4yLS4xOS0uNDctLjMzLS43Ny0uNDNDOS4xIDguMDUgOC43NiA4IDguMzkgOGMtLjM2IDAtLjY5LjA1LTEgLjE2LS4zLjExLS41Ny4yNi0uNzkuNDUtLjIxLjE5LS4zOC40MS0uNTEuNjctLjEyLjI2LS4xOC41NC0uMTguODVoMS4zYzAtLjE3LjAzLS4zMi4wOS0uNDVzLjE0LS4yNS4yNS0uMzRjLjExLS4wOS4yMy0uMTcuMzgtLjIyLjE1LS4wNS4zLS4wOC40OC0uMDguNCAwIC43LjEuODkuMzEuMTkuMi4yOS40OS4yOS44NiAwIC4xOC0uMDMuMzQtLjA4LjQ5LS4wNS4xNS0uMTQuMjctLjI1LjM3LS4xMS4xLS4yNS4xOC0uNDEuMjQtLjE2LjA2LS4zNi4wOS0uNTguMDlINy41djEuMDNoLjc3Yy4yMiAwIC40Mi4wMi42LjA3cy4zMy4xMy40NS4yM2MuMTIuMTEuMjIuMjQuMjkuNC4wNy4xNi4xLjM1LjEuNTcgMCAuNDEtLjEyLjcyLS4zNS45My0uMjMuMjMtLjU1LjMzLS45NS4zM3ptOC41NS01LjkyYy0uMzItLjMzLS43LS41OS0xLjE0LS43Ny0uNDMtLjE4LS45Mi0uMjctMS40Ni0uMjdIMTJ2OGgyLjNjLjU1IDAgMS4wNi0uMDkgMS41MS0uMjcuNDUtLjE4Ljg0LS40MyAxLjE2LS43Ni4zMi0uMzMuNTctLjczLjc0LTEuMTkuMTctLjQ3LjI2LS45OS4yNi0xLjU3di0uNGMwLS41OC0uMDktMS4xLS4yNi0xLjU3LS4xOC0uNDctLjQzLS44Ny0uNzUtMS4yem0tLjM5IDMuMTZjMCAuNDItLjA1Ljc5LS4xNCAxLjEzLS4xLjMzLS4yNC42Mi0uNDMuODUtLjE5LjIzLS40My40MS0uNzEuNTMtLjI5LjEyLS42Mi4xOC0uOTkuMThoLS45MVY5LjEyaC45N2MuNzIgMCAxLjI3LjIzIDEuNjQuNjkuMzguNDYuNTcgMS4xMi41NyAxLjk5di40ek0xMiAwbC0uNjYuMDMgMy44MSAzLjgxIDEuMzMtMS4zM2MzLjI3IDEuNTUgNS42MSA0LjcyIDUuOTYgOC40OGgxLjVDMjMuNDQgNC44NCAxOC4yOSAwIDEyIDB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjZXNzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDJjMS4xIDAgMiAuOSAyIDJzLS45IDItMiAyLTItLjktMi0yIC45LTIgMi0yem05IDdoLTZ2MTNoLTJ2LTZoLTJ2Nkg5VjlIM1Y3aDE4djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjZXNzaWJsZSI+PGNpcmNsZSBjeD0iMTIiIGN5PSI0IiByPSIyIj48L2NpcmNsZT48cGF0aCBkPSJNMTkgMTN2LTJjLTEuNTQuMDItMy4wOS0uNzUtNC4wNy0xLjgzbC0xLjI5LTEuNDNjLS4xNy0uMTktLjM4LS4zNC0uNjEtLjQ1LS4wMSAwLS4wMS0uMDEtLjAyLS4wMUgxM2MtLjM1LS4yLS43NS0uMy0xLjE5LS4yNkMxMC43NiA3LjExIDEwIDguMDQgMTAgOS4wOVYxNWMwIDEuMS45IDIgMiAyaDV2NWgydi01LjVjMC0xLjEtLjktMi0yLTJoLTN2LTMuNDVjMS4yOSAxLjA3IDMuMjUgMS45NCA1IDEuOTV6bS02LjE3IDVjLS40MSAxLjE2LTEuNTIgMi0yLjgzIDItMS42NiAwLTMtMS4zNC0zLTMgMC0xLjMxLjg0LTIuNDEgMi0yLjgzVjEyLjFjLTIuMjguNDYtNCAyLjQ4LTQgNC45IDAgMi43NiAyLjI0IDUgNSA1IDIuNDIgMCA0LjQ0LTEuNzIgNC45LTRoLTIuMDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjb3VudC1iYWxhbmNlIj48cGF0aCBkPSJNNCAxMHY3aDN2LTdINHptNiAwdjdoM3YtN2gtM3pNMiAyMmgxOXYtM0gydjN6bTE0LTEydjdoM3YtN2gtM3ptLTQuNS05TDIgNnYyaDE5VjZsLTkuNS01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFjY291bnQtYmFsYW5jZS13YWxsZXQiPjxwYXRoIGQ9Ik0yMSAxOHYxYzAgMS4xLS45IDItMiAySDVjLTEuMTEgMC0yLS45LTItMlY1YzAtMS4xLjg5LTIgMi0yaDE0YzEuMSAwIDIgLjkgMiAydjFoLTljLTEuMTEgMC0yIC45LTIgMnY4YzAgMS4xLjg5IDIgMiAyaDl6bS05LTJoMTBWOEgxMnY4em00LTIuNWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjb3VudC1ib3giPjxwYXRoIGQ9Ik0zIDV2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMkg1Yy0xLjExIDAtMiAuOS0yIDJ6bTEyIDRjMCAxLjY2LTEuMzQgMy0zIDNzLTMtMS4zNC0zLTMgMS4zNC0zIDMtMyAzIDEuMzQgMyAzem0tOSA4YzAtMiA0LTMuMSA2LTMuMXM2IDEuMSA2IDMuMXYxSDZ2LTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWNjb3VudC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDNjMS42NiAwIDMgMS4zNCAzIDNzLTEuMzQgMy0zIDMtMy0xLjM0LTMtMyAxLjM0LTMgMy0zem0wIDE0LjJjLTIuNSAwLTQuNzEtMS4yOC02LTMuMjIuMDMtMS45OSA0LTMuMDggNi0zLjA4IDEuOTkgMCA1Ljk3IDEuMDkgNiAzLjA4LTEuMjkgMS45NC0zLjUgMy4yMi02IDMuMjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkIj48cGF0aCBkPSJNMTkgMTNoLTZ2NmgtMnYtNkg1di0yaDZWNWgydjZoNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1hbGVydCI+PHBhdGggZD0iTTEwLjAxIDIxLjAxYzAgMS4xLjg5IDEuOTkgMS45OSAxLjk5czEuOTktLjg5IDEuOTktMS45OWgtMy45OHptOC44Ny00LjE5VjExYzAtMy4yNS0yLjI1LTUuOTctNS4yOS02LjY5di0uNzJDMTMuNTkgMi43MSAxMi44OCAyIDEyIDJzLTEuNTkuNzEtMS41OSAxLjU5di43MkM3LjM3IDUuMDMgNS4xMiA3Ljc1IDUuMTIgMTF2NS44MkwzIDE4Ljk0VjIwaDE4di0xLjA2bC0yLjEyLTIuMTJ6TTE2IDEzLjAxaC0zdjNoLTJ2LTNIOFYxMWgzVjhoMnYzaDN2Mi4wMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTIgMTBoLTR2NGgtMnYtNEg3di0yaDRWN2gydjRoNHYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFkZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem01IDExaC00djRoLTJ2LTRIN3YtMmg0VjdoMnY0aDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhZGQtY2lyY2xlLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMyA3aC0ydjRIN3YyaDR2NGgydi00aDR2LTJoLTRWN3ptLTEtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWRkLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0xMSA5aDJWNmgzVjRoLTNWMWgtMnYzSDh2MmgzdjN6bS00IDljLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6bTEwIDBjLTEuMSAwLTEuOTkuOS0xLjk5IDJzLjg5IDIgMS45OSAyIDItLjkgMi0yLS45LTItMi0yem0tOS44My0zLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuODYtNy4wMUwxOS40MiA0aC0uMDFsLTEuMSAyLTIuNzYgNUg4LjUzbC0uMTMtLjI3TDYuMTYgNmwtLjk1LTItLjk0LTJIMXYyaDJsMy42IDcuNTktMS4zNSAyLjQ1Yy0uMTYuMjgtLjI1LjYxLS4yNS45NiAwIDEuMS45IDIgMiAyaDEydi0ySDcuNDJjLS4xMyAwLS4yNS0uMTEtLjI1LS4yNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGFybSI+PHBhdGggZD0iTTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTEyLjUgOEgxMXY2bDQuNzUgMi44NS43NS0xLjIzLTQtMi4zN1Y4ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJhbGFybS1hZGQiPjxwYXRoIGQ9Ik03Ljg4IDMuMzlMNi42IDEuODYgMiA1LjcxbDEuMjkgMS41MyA0LjU5LTMuODV6TTIyIDUuNzJsLTQuNi0zLjg2LTEuMjkgMS41MyA0LjYgMy44NkwyMiA1Ljcyek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptMS0xMWgtMnYzSDh2MmgzdjNoMnYtM2gzdi0yaC0zVjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWxhcm0tb2ZmIj48cGF0aCBkPSJNMTIgNmMzLjg3IDAgNyAzLjEzIDcgNyAwIC44NC0uMTYgMS42NS0uNDMgMi40bDEuNTIgMS41MmMuNTgtMS4xOS45MS0yLjUxLjkxLTMuOTIgMC00Ljk3LTQuMDMtOS05LTktMS40MSAwLTIuNzMuMzMtMy45Mi45MUw5LjYgNi40M0MxMC4zNSA2LjE2IDExLjE2IDYgMTIgNnptMTAtLjI4bC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNMi45MiAyLjI5TDEuNjUgMy41NyAyLjk4IDQuOWwtMS4xMS45MyAxLjQyIDEuNDIgMS4xMS0uOTQuOC44QzMuODMgOC42OSAzIDEwLjc1IDMgMTNjMCA0Ljk3IDQuMDIgOSA5IDkgMi4yNSAwIDQuMzEtLjgzIDUuODktMi4ybDIuMiAyLjIgMS4yNy0xLjI3TDMuODkgMy4yN2wtLjk3LS45OHptMTMuNTUgMTYuMUMxNS4yNiAxOS4zOSAxMy43IDIwIDEyIDIwYy0zLjg3IDAtNy0zLjEzLTctNyAwLTEuNy42MS0zLjI2IDEuNjEtNC40N2w5Ljg2IDkuODZ6TTguMDIgMy4yOEw2LjYgMS44NmwtLjg2LjcxIDEuNDIgMS40Mi44Ni0uNzF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWxhcm0tb24iPjxwYXRoIGQ9Ik0yMiA1LjcybC00LjYtMy44Ni0xLjI5IDEuNTMgNC42IDMuODZMMjIgNS43MnpNNy44OCAzLjM5TDYuNiAxLjg2IDIgNS43MWwxLjI5IDEuNTMgNC41OS0zLjg1ek0xMiA0Yy00Ljk3IDAtOSA0LjAzLTkgOXM0LjAyIDkgOSA5YzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0wIDE2Yy0zLjg3IDAtNy0zLjEzLTctN3MzLjEzLTcgNy03IDcgMy4xMyA3IDctMy4xMyA3LTcgN3ptLTEuNDYtNS40N0w4LjQxIDEyLjRsLTEuMDYgMS4wNiAzLjE4IDMuMTggNi02LTEuMDYtMS4wNi00LjkzIDQuOTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYWxsLW91dCI+PHBhdGggZD0iTTE2LjIxIDQuMTZsNCA0di00em00IDEybC00IDRoNHptLTEyIDRsLTQtNHY0em0tNC0xMmw0LTRoLTR6bTEyLjk1LS45NWMtMi43My0yLjczLTcuMTctMi43My05LjkgMHMtMi43MyA3LjE3IDAgOS45IDcuMTcgMi43MyA5LjkgMCAyLjczLTcuMTYgMC05Ljl6bS0xLjEgOC44Yy0yLjEzIDIuMTMtNS41NyAyLjEzLTcuNyAwcy0yLjEzLTUuNTcgMC03LjcgNS41Ny0yLjEzIDcuNyAwIDIuMTMgNS41NyAwIDcuN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJhbmRyb2lkIj48cGF0aCBkPSJNNiAxOGMwIC41NS40NSAxIDEgMWgxdjMuNWMwIC44My42NyAxLjUgMS41IDEuNXMxLjUtLjY3IDEuNS0xLjVWMTloMnYzLjVjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41VjE5aDFjLjU1IDAgMS0uNDUgMS0xVjhINnYxMHpNMy41IDhDMi42NyA4IDIgOC42NyAyIDkuNXY3YzAgLjgzLjY3IDEuNSAxLjUgMS41UzUgMTcuMzMgNSAxNi41di03QzUgOC42NyA0LjMzIDggMy41IDh6bTE3IDBjLS44MyAwLTEuNS42Ny0xLjUgMS41djdjMCAuODMuNjcgMS41IDEuNSAxLjVzMS41LS42NyAxLjUtMS41di03YzAtLjgzLS42Ny0xLjUtMS41LTEuNXptLTQuOTctNS44NGwxLjMtMS4zYy4yLS4yLjItLjUxIDAtLjcxLS4yLS4yLS41MS0uMi0uNzEgMGwtMS40OCAxLjQ4QzEzLjg1IDEuMjMgMTIuOTUgMSAxMiAxYy0uOTYgMC0xLjg2LjIzLTIuNjYuNjNMNy44NS4xNWMtLjItLjItLjUxLS4yLS43MSAwLS4yLjItLjIuNTEgMCAuNzFsMS4zMSAxLjMxQzYuOTcgMy4yNiA2IDUuMDEgNiA3aDEyYzAtMS45OS0uOTctMy43NS0yLjQ3LTQuODR6TTEwIDVIOVY0aDF2MXptNSAwaC0xVjRoMXYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFubm91bmNlbWVudCI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyA5aC0yVjVoMnY2em0wIDRoLTJ2LTJoMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFwcHMiPjxwYXRoIGQ9Ik00IDhoNFY0SDR2NHptNiAxMmg0di00aC00djR6bS02IDBoNHYtNEg0djR6bTAtNmg0di00SDR2NHptNiAwaDR2LTRoLTR2NHptNi0xMHY0aDRWNGgtNHptLTYgNGg0VjRoLTR2NHptNiA2aDR2LTRoLTR2NHptMCA2aDR2LTRoLTR2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhcmNoaXZlIj48cGF0aCBkPSJNMjAuNTQgNS4yM2wtMS4zOS0xLjY4QzE4Ljg4IDMuMjEgMTguNDcgMyAxOCAzSDZjLS40NyAwLS44OC4yMS0xLjE2LjU1TDMuNDYgNS4yM0MzLjE3IDUuNTcgMyA2LjAyIDMgNi41VjE5YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ4LS4xNy0uOTMtLjQ2LTEuMjd6TTEyIDE3LjVMNi41IDEySDEwdi0yaDR2MmgzLjVMMTIgMTcuNXpNNS4xMiA1bC44MS0xaDEybC45NCAxSDUuMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctYmFjayI+PHBhdGggZD0iTTIwIDExSDcuODNsNS41OS01LjU5TDEyIDRsLTggOCA4IDggMS40MS0xLjQxTDcuODMgMTNIMjB2LTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZG93bndhcmQiPjxwYXRoIGQ9Ik0yMCAxMmwtMS40MS0xLjQxTDEzIDE2LjE3VjRoLTJ2MTIuMTdsLTUuNTgtNS41OUw0IDEybDggOCA4LTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtZG93bi1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDEybC00LTRoOGwtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFycm93LWRyb3AtdXAiPjxwYXRoIGQ9Ik03IDE0bDUtNSA1IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctZm9yd2FyZCI+PHBhdGggZD0iTTEyIDRsLTEuNDEgMS40MUwxNi4xNyAxMUg0djJoMTIuMTdsLTUuNTggNS41OUwxMiAyMGw4LTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXJyb3ctdXB3YXJkIj48cGF0aCBkPSJNNCAxMmwxLjQxIDEuNDFMMTEgNy44M1YyMGgyVjcuODNsNS41OCA1LjU5TDIwIDEybC04LTgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzcGVjdC1yYXRpbyI+PHBhdGggZD0iTTE5IDEyaC0ydjNoLTN2Mmg1di01ek03IDloM1Y3SDV2NWgyVjl6bTE0LTZIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3Nlc3NtZW50Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6TTkgMTdIN3YtN2gydjd6bTQgMGgtMlY3aDJ2MTB6bTQgMGgtMnYtNGgydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0yIDE0SDd2LTJoN3Yyem0zLTRIN3YtMmgxMHYyem0wLTRIN1Y3aDEwdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1pbmQiPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMCA0YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzLTMtMS4zNC0zLTMgMS4zNC0zIDMtM3ptNiAxMkg2di0xLjRjMC0yIDQtMy4xIDYtMy4xczYgMS4xIDYgMy4xVjE5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImFzc2lnbm1lbnQtbGF0ZSI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTYgMTVoLTJ2LTJoMnYyem0wLTRoLTJWOGgydjZ6bS0xLTljLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhc3NpZ25tZW50LXJldHVybiI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem00IDEyaC00djNsLTUtNSA1LTV2M2g0djR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC1yZXR1cm5lZCI+PHBhdGggZD0iTTE5IDNoLTQuMThDMTQuNCAxLjg0IDEzLjMgMSAxMiAxYy0xLjMgMC0yLjQuODQtMi44MiAySDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgMGMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xem0wIDE1bC01LTVoM1Y5aDR2NGgzbC01IDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYXNzaWdubWVudC10dXJuZWQtaW4iPjxwYXRoIGQ9Ik0xOSAzaC00LjE4QzE0LjQgMS44NCAxMy4zIDEgMTIgMWMtMS4zIDAtMi40Ljg0LTIuODIgMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS03IDBjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptLTIgMTRsLTQtNCAxLjQxLTEuNDFMMTAgMTQuMTdsNi41OS02LjU5TDE4IDlsLTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJhdHRhY2htZW50Ij48cGF0aCBkPSJNMiAxMi41QzIgOS40NiA0LjQ2IDcgNy41IDdIMThjMi4yMSAwIDQgMS43OSA0IDRzLTEuNzkgNC00IDRIOS41QzguMTIgMTUgNyAxMy44OCA3IDEyLjVTOC4xMiAxMCA5LjUgMTBIMTd2Mkg5LjQxYy0uNTUgMC0uNTUgMSAwIDFIMThjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0ySDcuNUM1LjU3IDkgNCAxMC41NyA0IDEyLjVTNS41NyAxNiA3LjUgMTZIMTd2Mkg3LjVDNC40NiAxOCAyIDE1LjU0IDIgMTIuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJhdXRvcmVuZXciPjxwYXRoIGQ9Ik0xMiA2djNsNC00LTQtNHYzYy00LjQyIDAtOCAzLjU4LTggOCAwIDEuNTcuNDYgMy4wMyAxLjI0IDQuMjZMNi43IDE0LjhjLS40NS0uODMtLjctMS43OS0uNy0yLjggMC0zLjMxIDIuNjktNiA2LTZ6bTYuNzYgMS43NEwxNy4zIDkuMmMuNDQuODQuNyAxLjc5LjcgMi44IDAgMy4zMS0yLjY5IDYtNiA2di0zbC00IDQgNCA0di0zYzQuNDIgMCA4LTMuNTggOC04IDAtMS41Ny0uNDYtMy4wMy0xLjI0LTQuMjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYmFja3NwYWNlIj48cGF0aCBkPSJNMjIgM0g3Yy0uNjkgMC0xLjIzLjM1LTEuNTkuODhMMCAxMmw1LjQxIDguMTFjLjM2LjUzLjkuODkgMS41OS44OWgxNWMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0tMyAxMi41OUwxNy41OSAxNyAxNCAxMy40MSAxMC40MSAxNyA5IDE1LjU5IDEyLjU5IDEyIDkgOC40MSAxMC40MSA3IDE0IDEwLjU5IDE3LjU5IDcgMTkgOC40MSAxNS40MSAxMiAxOSAxNS41OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJiYWNrdXAiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTE0IDEzdjRoLTR2LTRIN2w1LTUgNSA1aC0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJsb2NrIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnpNNCAxMmMwLTQuNDIgMy41OC04IDgtOCAxLjg1IDAgMy41NS42MyA0LjkgMS42OUw1LjY5IDE2LjlDNC42MyAxNS41NSA0IDEzLjg1IDQgMTJ6bTggOGMtMS44NSAwLTMuNTUtLjYzLTQuOS0xLjY5TDE4LjMxIDcuMUMxOS4zNyA4LjQ1IDIwIDEwLjE1IDIwIDEyYzAgNC40Mi0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJvb2siPjxwYXRoIGQ9Ik0xOCAySDZjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNNiA0aDV2OGwtMi41LTEuNUw2IDEyVjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYm9va21hcmsiPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYm9va21hcmstYm9yZGVyIj48cGF0aCBkPSJNMTcgM0g3Yy0xLjEgMC0xLjk5LjktMS45OSAyTDUgMjFsNy0zIDcgM1Y1YzAtMS4xLS45LTItMi0yem0wIDE1bC01LTIuMThMNyAxOFY1aDEwdjEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImJ1Zy1yZXBvcnQiPjxwYXRoIGQ9Ik0yMCA4aC0yLjgxYy0uNDUtLjc4LTEuMDctMS40NS0xLjgyLTEuOTZMMTcgNC40MSAxNS41OSAzbC0yLjE3IDIuMTdDMTIuOTYgNS4wNiAxMi40OSA1IDEyIDVjLS40OSAwLS45Ni4wNi0xLjQxLjE3TDguNDEgMyA3IDQuNDFsMS42MiAxLjYzQzcuODggNi41NSA3LjI2IDcuMjIgNi44MSA4SDR2MmgyLjA5Yy0uMDUuMzMtLjA5LjY2LS4wOSAxdjFINHYyaDJ2MWMwIC4zNC4wNC42Ny4wOSAxSDR2MmgyLjgxYzEuMDQgMS43OSAyLjk3IDMgNS4xOSAzczQuMTUtMS4yMSA1LjE5LTNIMjB2LTJoLTIuMDljLjA1LS4zMy4wOS0uNjYuMDktMXYtMWgydi0yaC0ydi0xYzAtLjM0LS4wNC0uNjctLjA5LTFIMjBWOHptLTYgOGgtNHYtMmg0djJ6bTAtNGgtNHYtMmg0djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iYnVpbGQiPjxwYXRoIGQ9Ik0yMi43IDE5bC05LjEtOS4xYy45LTIuMy40LTUtMS41LTYuOS0yLTItNS0yLjQtNy40LTEuM0w5IDYgNiA5IDEuNiA0LjdDLjQgNy4xLjkgMTAuMSAyLjkgMTIuMWMxLjkgMS45IDQuNiAyLjQgNi45IDEuNWw5LjEgOS4xYy40LjQgMSAuNCAxLjQgMGwyLjMtMi4zYy41LS40LjUtMS4xLjEtMS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhY2hlZCI+PHBhdGggZD0iTTE5IDhsLTQgNGgzYzAgMy4zMS0yLjY5IDYtNiA2LTEuMDEgMC0xLjk3LS4yNS0yLjgtLjdsLTEuNDYgMS40NkM4Ljk3IDE5LjU0IDEwLjQzIDIwIDEyIDIwYzQuNDIgMCA4LTMuNTggOC04aDNsLTQtNHpNNiAxMmMwLTMuMzEgMi42OS02IDYtNiAxLjAxIDAgMS45Ny4yNSAyLjguN2wxLjQ2LTEuNDZDMTUuMDMgNC40NiAxMy41NyA0IDEyIDRjLTQuNDIgMC04IDMuNTgtOCA4SDFsNCA0IDQtNEg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhbWVyYS1lbmhhbmNlIj48cGF0aCBkPSJNOSAzTDcuMTcgNUg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJoLTMuMTdMMTUgM0g5em0zIDE1Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC0xbDEuMjUtMi43NUwxNiAxM2wtMi43NS0xLjI1TDEyIDlsLTEuMjUgMi43NUw4IDEzbDIuNzUgMS4yNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYW5jZWwiPjxwYXRoIGQ9Ik0xMiAyQzYuNDcgMiAyIDYuNDcgMiAxMnM0LjQ3IDEwIDEwIDEwIDEwLTQuNDcgMTAtMTBTMTcuNTMgMiAxMiAyem01IDEzLjU5TDE1LjU5IDE3IDEyIDEzLjQxIDguNDEgMTcgNyAxNS41OSAxMC41OSAxMiA3IDguNDEgOC40MSA3IDEyIDEwLjU5IDE1LjU5IDcgMTcgOC40MSAxMy40MSAxMiAxNyAxNS41OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjYXJkLWdpZnRjYXJkIj48cGF0aCBkPSJNMjAgNmgtMi4xOGMuMTEtLjMxLjE4LS42NS4xOC0xIDAtMS42Ni0xLjM0LTMtMy0zLTEuMDUgMC0xLjk2LjU0LTIuNSAxLjM1bC0uNS42Ny0uNS0uNjhDMTAuOTYgMi41NCAxMC4wNSAyIDkgMiA3LjM0IDIgNiAzLjM0IDYgNWMwIC4zNS4wNy42OS4xOCAxSDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTUtMmMuNTUgMCAxIC40NSAxIDFzLS40NSAxLTEgMS0xLS40NS0xLTEgLjQ1LTEgMS0xek05IDRjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDUuMDhMNyAxMC44MyA4LjYyIDEyIDExIDguNzZsMS0xLjM2IDEgMS4zNkwxNS4zOCAxMiAxNyAxMC44MyAxNC45MiA4SDIwdjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2FyZC1tZW1iZXJzaGlwIj48cGF0aCBkPSJNMjAgMkg0Yy0xLjExIDAtMiAuODktMiAydjExYzAgMS4xMS44OSAyIDIgMmg0djVsNC0yIDQgMnYtNWg0YzEuMTEgMCAyLS44OSAyLTJWNGMwLTEuMTEtLjg5LTItMi0yem0wIDEzSDR2LTJoMTZ2MnptMC01SDRWNGgxNnY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNhcmQtdHJhdmVsIj48cGF0aCBkPSJNMjAgNmgtM1Y0YzAtMS4xMS0uODktMi0yLTJIOWMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0yIC44OS0yIDJ2MTFjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWOGMwLTEuMTEtLjg5LTItMi0yek05IDRoNnYySDlWNHptMTEgMTVINHYtMmgxNnYyem0wLTVINFY4aDN2MmgyVjhoNnYyaDJWOGgzdjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hhbmdlLWhpc3RvcnkiPjxwYXRoIGQ9Ik0xMiA3Ljc3TDE4LjM5IDE4SDUuNjFMMTIgNy43N00xMiA0TDIgMjBoMjBMMTIgNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGVjayI+PHBhdGggZD0iTTkgMTYuMTdMNC44MyAxMmwtMS40MiAxLjQxTDkgMTkgMjEgN2wtMS40MS0xLjQxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZWNrLWJveCI+PHBhdGggZD0iTTE5IDNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS45IDItMlY1YzAtMS4xLS44OS0yLTItMnptLTkgMTRsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGVjay1ib3gtb3V0bGluZS1ibGFuayI+PHBhdGggZD0iTTE5IDV2MTRINVY1aDE0bTAtMkg1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hlY2stY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptLTIgMTVsLTUtNSAxLjQxLTEuNDFMMTAgMTQuMTdsNy41OS03LjU5TDE5IDhsLTkgOXoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaGV2cm9uLWxlZnQiPjxwYXRoIGQ9Ik0xNS40MSA3LjQxTDE0IDZsLTYgNiA2IDYgMS40MS0xLjQxTDEwLjgzIDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNoZXZyb24tcmlnaHQiPjxwYXRoIGQ9Ik0xMCA2TDguNTkgNy40MSAxMy4xNyAxMmwtNC41OCA0LjU5TDEwIDE4bDYtNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjaHJvbWUtcmVhZGVyLW1vZGUiPjxwYXRoIGQ9Ik0xMyAxMmg3djEuNWgtN3ptMC0yLjVoN1YxMWgtN3ptMCA1aDdWMTZoLTd6TTIxIDRIM2MtMS4xIDAtMiAuOS0yIDJ2MTNjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDE1aC05VjZoOXYxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjbGFzcyI+PHBhdGggZD0iTTE4IDJINmMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yek02IDRoNXY4bC0yLjUtMS41TDYgMTJWNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJjbGVhciI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG9zZSI+PHBhdGggZD0iTTE5IDYuNDFMMTcuNTkgNSAxMiAxMC41OSA2LjQxIDUgNSA2LjQxIDEwLjU5IDEyIDUgMTcuNTkgNi40MSAxOSAxMiAxMy40MSAxNy41OSAxOSAxOSAxNy41OSAxMy40MSAxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem00LjUgMTRIOGMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtM2wuMTQuMDFDOC41OCA4LjI4IDEwLjEzIDcgMTIgN2MyLjIxIDAgNCAxLjc5IDQgNGguNWMxLjM4IDAgMi41IDEuMTIgMi41IDIuNVMxNy44OCAxNiAxNi41IDE2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLWRvbmUiPjxwYXRoIGQ9Ik0xOS4zNSAxMC4wNEMxOC42NyA2LjU5IDE1LjY0IDQgMTIgNCA5LjExIDQgNi42IDUuNjQgNS4zNSA4LjA0IDIuMzQgOC4zNiAwIDEwLjkxIDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTNjMi43NiAwIDUtMi4yNCA1LTUgMC0yLjY0LTIuMDUtNC43OC00LjY1LTQuOTZ6TTEwIDE3bC0zLjUtMy41IDEuNDEtMS40MUwxMCAxNC4xNyAxNS4xOCA5bDEuNDEgMS40MUwxMCAxN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZC1kb3dubG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTcgMTNsLTUgNS01LTVoM1Y5aDR2NGgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLW9mZiI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0Yy0xLjQ4IDAtMi44NS40My00LjAxIDEuMTdsMS40NiAxLjQ2QzEwLjIxIDYuMjMgMTEuMDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzIDAgMS4xMy0uNjQgMi4xMS0xLjU2IDIuNjJsMS40NSAxLjQ1QzIzLjE2IDE4LjE2IDI0IDE2LjY4IDI0IDE1YzAtMi42NC0yLjA1LTQuNzgtNC42NS00Ljk2ek0zIDUuMjdsMi43NSAyLjc0QzIuNTYgOC4xNSAwIDEwLjc3IDAgMTRjMCAzLjMxIDIuNjkgNiA2IDZoMTEuNzNsMiAyTDIxIDIwLjczIDQuMjcgNCAzIDUuMjd6TTcuNzMgMTBsOCA4SDZjLTIuMjEgMC00LTEuNzktNC00czEuNzktNCA0LTRoMS43M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjbG91ZC1xdWV1ZSI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTkgMThINmMtMi4yMSAwLTQtMS43OS00LTRzMS43OS00IDQtNGguNzFDNy4zNyA3LjY5IDkuNDggNiAxMiA2YzMuMDQgMCA1LjUgMi40NiA1LjUgNS41di41SDE5YzEuNjYgMCAzIDEuMzQgMyAzcy0xLjM0IDMtMyAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNsb3VkLXVwbG9hZCI+PHBhdGggZD0iTTE5LjM1IDEwLjA0QzE4LjY3IDYuNTkgMTUuNjQgNCAxMiA0IDkuMTEgNCA2LjYgNS42NCA1LjM1IDguMDQgMi4zNCA4LjM2IDAgMTAuOTEgMCAxNGMwIDMuMzEgMi42OSA2IDYgNmgxM2MyLjc2IDAgNS0yLjI0IDUtNSAwLTIuNjQtMi4wNS00Ljc4LTQuNjUtNC45NnpNMTQgMTN2NGgtNHYtNEg3bDUtNSA1IDVoLTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29kZSI+PHBhdGggZD0iTTkuNCAxNi42TDQuOCAxMmw0LjYtNC42TDggNmwtNiA2IDYgNiAxLjQtMS40em01LjIgMGw0LjYtNC42LTQuNi00LjZMMTYgNmw2IDYtNiA2LTEuNC0xLjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29tcGFyZS1hcnJvd3MiPjxwYXRoIGQ9Ik05LjAxIDE0SDJ2Mmg3LjAxdjNMMTMgMTVsLTMuOTktNHYzem01Ljk4LTF2LTNIMjJWOGgtNy4wMVY1TDExIDlsMy45OSA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY29weSI+PHBhdGggZD0iTTE2IDFINGMtMS4xIDAtMiAuOS0yIDJ2MTRoMlYzaDEyVjF6bTMgNEg4Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDExYzEuMSAwIDItLjkgMi0yVjdjMC0xLjEtLjktMi0yLTJ6bTAgMTZIOFY3aDExdjE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbnRlbnQtY3V0Ij48cGF0aCBkPSJNOS42NCA3LjY0Yy4yMy0uNS4zNi0xLjA1LjM2LTEuNjQgMC0yLjIxLTEuNzktNC00LTRTMiAzLjc5IDIgNnMxLjc5IDQgNCA0Yy41OSAwIDEuMTQtLjEzIDEuNjQtLjM2TDEwIDEybC0yLjM2IDIuMzZDNy4xNCAxNC4xMyA2LjU5IDE0IDYgMTRjLTIuMjEgMC00IDEuNzktNCA0czEuNzkgNCA0IDQgNC0xLjc5IDQtNGMwLS41OS0uMTMtMS4xNC0uMzYtMS42NEwxMiAxNGw3IDdoM3YtMUw5LjY0IDcuNjR6TTYgOGMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptMCAxMmMtMS4xIDAtMi0uODktMi0ycy45LTIgMi0yIDIgLjg5IDIgMi0uOSAyLTIgMnptNi03LjVjLS4yOCAwLS41LS4yMi0uNS0uNXMuMjItLjUuNS0uNS41LjIyLjUuNS0uMjIuNS0uNS41ek0xOSAzbC02IDYgMiAyIDctN1YzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNvbnRlbnQtcGFzdGUiPjxwYXRoIGQ9Ik0xOSAyaC00LjE4QzE0LjQuODQgMTMuMyAwIDEyIDBjLTEuMyAwLTIuNC44NC0yLjgyIDJINWMtMS4xIDAtMiAuOS0yIDJ2MTZjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAwYy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTcgMThINVY0aDJ2M2gxMFY0aDJ2MTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY29weXJpZ2h0Ij48cGF0aCBkPSJNMTAuMDggMTAuODZjLjA1LS4zMy4xNi0uNjIuMy0uODdzLjM0LS40Ni41OS0uNjJjLjI0LS4xNS41NC0uMjIuOTEtLjIzLjIzLjAxLjQ0LjA1LjYzLjEzLjIuMDkuMzguMjEuNTIuMzZzLjI1LjMzLjM0LjUzLjEzLjQyLjE0LjY0aDEuNzljLS4wMi0uNDctLjExLS45LS4yOC0xLjI5cy0uNC0uNzMtLjctMS4wMS0uNjYtLjUtMS4wOC0uNjYtLjg4LS4yMy0xLjM5LS4yM2MtLjY1IDAtMS4yMi4xMS0xLjcuMzRzLS44OC41My0xLjIuOTItLjU2Ljg0LS43MSAxLjM2UzggMTEuMjkgOCAxMS44N3YuMjdjMCAuNTguMDggMS4xMi4yMyAxLjY0cy4zOS45Ny43MSAxLjM1LjcyLjY5IDEuMi45MSAxLjA1LjM0IDEuNy4zNGMuNDcgMCAuOTEtLjA4IDEuMzItLjIzcy43Ny0uMzYgMS4wOC0uNjMuNTYtLjU4Ljc0LS45NC4yOS0uNzQuMy0xLjE1aC0xLjc5Yy0uMDEuMjEtLjA2LjQtLjE1LjU4cy0uMjEuMzMtLjM2LjQ2LS4zMi4yMy0uNTIuM2MtLjE5LjA3LS4zOS4wOS0uNi4xLS4zNi0uMDEtLjY2LS4wOC0uODktLjIzLS4yNS0uMTYtLjQ1LS4zNy0uNTktLjYycy0uMjUtLjU1LS4zLS44OC0uMDgtLjY3LS4wOC0xdi0uMjdjMC0uMzUuMDMtLjY4LjA4LTEuMDF6TTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImNyZWF0ZSI+PHBhdGggZD0iTTMgMTcuMjVWMjFoMy43NUwxNy44MSA5Ljk0bC0zLjc1LTMuNzVMMyAxNy4yNXpNMjAuNzEgNy4wNGMuMzktLjM5LjM5LTEuMDIgMC0xLjQxbC0yLjM0LTIuMzRjLS4zOS0uMzktMS4wMi0uMzktMS40MSAwbC0xLjgzIDEuODMgMy43NSAzLjc1IDEuODMtMS44M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJjcmVhdGUtbmV3LWZvbGRlciI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOGMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS0xIDhoLTN2M2gtMnYtM2gtM3YtMmgzVjloMnYzaDN2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJjcmVkaXQtY2FyZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkYXNoYm9hcmQiPjxwYXRoIGQ9Ik0zIDEzaDhWM0gzdjEwem0wIDhoOHYtNkgzdjZ6bTEwIDBoOFYxMWgtOHYxMHptMC0xOHY2aDhWM2gtOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJkYXRlLXJhbmdlIj48cGF0aCBkPSJNOSAxMUg3djJoMnYtMnptNCAwaC0ydjJoMnYtMnptNCAwaC0ydjJoMnYtMnptMi03aC0xVjJoLTJ2Mkg4VjJINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMjBjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjloMTR2MTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZGVsZXRlIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyek0xOSA0aC0zLjVsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRlbGV0ZS1mb3JldmVyIj48cGF0aCBkPSJNNiAxOWMwIDEuMS45IDIgMiAyaDhjMS4xIDAgMi0uOSAyLTJWN0g2djEyem0yLjQ2LTcuMTJsMS40MS0xLjQxTDEyIDEyLjU5bDIuMTItMi4xMiAxLjQxIDEuNDFMMTMuNDEgMTRsMi4xMiAyLjEyLTEuNDEgMS40MUwxMiAxNS40MWwtMi4xMiAyLjEyLTEuNDEtMS40MUwxMC41OSAxNGwtMi4xMy0yLjEyek0xNS41IDRsLTEtMWgtNWwtMSAxSDV2MmgxNFY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRlbGV0ZS1zd2VlcCI+PHBhdGggZD0iTTE1IDE2aDR2MmgtNHptMC04aDd2MmgtN3ptMCA0aDZ2MmgtNnpNMyAxOGMwIDEuMS45IDIgMiAyaDZjMS4xIDAgMi0uOSAyLTJWOEgzdjEwek0xNCA1aC0zbC0xLTFINkw1IDVIMnYyaDEyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRlc2NyaXB0aW9uIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE2SDh2LTJoOHYyem0wLTRIOHYtMmg4djJ6bS0zLTVWMy41TDE4LjUgOUgxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJkbnMiPjxwYXRoIGQ9Ik0yMCAxM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTF2LTZjMC0uNTUtLjQ1LTEtMS0xek03IDE5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnpNMjAgM0g0Yy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxNmMuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6TTcgOWMtMS4xIDAtMi0uOS0yLTJzLjktMiAyLTIgMiAuOSAyIDItLjkgMi0yIDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZG9uZSI+PHBhdGggZD0iTTkgMTYuMkw0LjggMTJsLTEuNCAxLjRMOSAxOSAyMSA3bC0xLjQtMS40TDkgMTYuMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJkb25lLWFsbCI+PHBhdGggZD0iTTE4IDdsLTEuNDEtMS40MS02LjM0IDYuMzQgMS40MSAxLjQxTDE4IDd6bTQuMjQtMS40MUwxMS42NiAxNi4xNyA3LjQ4IDEybC0xLjQxIDEuNDFMMTEuNjYgMTlsMTItMTItMS40Mi0xLjQxek0uNDEgMTMuNDFMNiAxOWwxLjQxLTEuNDFMMS44MyAxMiAuNDEgMTMuNDF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZG9udXQtbGFyZ2UiPjxwYXRoIGQ9Ik0xMSA1LjA4VjJjLTUgLjUtOSA0LjgxLTkgMTBzNCA5LjUgOSAxMHYtMy4wOGMtMy0uNDgtNi0zLjQtNi02LjkyczMtNi40NCA2LTYuOTJ6TTE4Ljk3IDExSDIyYy0uNDctNS00LTguNTMtOS05djMuMDhDMTYgNS41MSAxOC41NCA4IDE4Ljk3IDExek0xMyAxOC45MlYyMmM1LS40NyA4LjUzLTQgOS05aC0zLjAzYy0uNDMgMy0yLjk3IDUuNDktNS45NyA1LjkyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRvbnV0LXNtYWxsIj48cGF0aCBkPSJNMTEgOS4xNlYyYy01IC41LTkgNC43OS05IDEwczQgOS41IDkgMTB2LTcuMTZjLTEtLjQxLTItMS41Mi0yLTIuODRzMS0yLjQzIDItMi44NHpNMTQuODYgMTFIMjJjLS40OC00Ljc1LTQtOC41My05LTl2Ny4xNmMxIC4zIDEuNTIuOTggMS44NiAxLjg0ek0xMyAxNC44NFYyMmM1LS40NyA4LjUyLTQuMjUgOS05aC03LjE0Yy0uMzQuODYtLjg2IDEuNTQtMS44NiAxLjg0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImRyYWZ0cyI+PHBhdGggZD0iTTIxLjk5IDhjMC0uNzItLjM3LTEuMzUtLjk0LTEuN0wxMiAxIDIuOTUgNi4zQzIuMzggNi42NSAyIDcuMjggMiA4djEwYzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJsLS4wMS0xMHpNMTIgMTNMMy43NCA3Ljg0IDEyIDNsOC4yNiA0Ljg0TDEyIDEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImVqZWN0Ij48cGF0aCBkPSJNNSAxN2gxNHYySDV6bTctMTJMNS4zMyAxNWgxMy4zNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJlcnJvciI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTEgMTVoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXJyb3Itb3V0bGluZSI+PHBhdGggZD0iTTExIDE1aDJ2MmgtMnptMC04aDJ2NmgtMnptLjk5LTVDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6TTEyIDIwYy00LjQyIDAtOC0zLjU4LTgtOHMzLjU4LTggOC04IDggMy41OCA4IDgtMy41OCA4LTggOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJldXJvLXN5bWJvbCI+PHBhdGggZD0iTTE1IDE4LjVjLTIuNTEgMC00LjY4LTEuNDItNS43Ni0zLjVIMTV2LTJIOC41OGMtLjA1LS4zMy0uMDgtLjY2LS4wOC0xcy4wMy0uNjcuMDgtMUgxNVY5SDkuMjRDMTAuMzIgNi45MiAxMi41IDUuNSAxNSA1LjVjMS42MSAwIDMuMDkuNTkgNC4yMyAxLjU3TDIxIDUuM0MxOS40MSAzLjg3IDE3LjMgMyAxNSAzYy0zLjkyIDAtNy4yNCAyLjUxLTguNDggNkgzdjJoMy4wNmMtLjA0LjMzLS4wNi42Ni0uMDYgMSAwIC4zNC4wMi42Ny4wNiAxSDN2MmgzLjUyYzEuMjQgMy40OSA0LjU2IDYgOC40OCA2IDIuMzEgMCA0LjQxLS44NyA2LTIuM2wtMS43OC0xLjc3Yy0xLjEzLjk4LTIuNiAxLjU3LTQuMjIgMS41N3oiPjwvcGF0aD48L2c+CjxnIGlkPSJldmVudCI+PHBhdGggZD0iTTE3IDEyaC01djVoNXYtNXpNMTYgMXYySDhWMUg2djJINWMtMS4xMSAwLTEuOTkuOS0xLjk5IDJMMyAxOWMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yaC0xVjFoLTJ6bTMgMThINVY4aDE0djExeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV2ZW50LXNlYXQiPjxwYXRoIGQ9Ik00IDE4djNoM3YtM2gxMHYzaDN2LTZINHptMTUtOGgzdjNoLTN6TTIgMTBoM3YzSDJ6bTE1IDNIN1Y1YzAtMS4xLjktMiAyLTJoNmMxLjEgMCAyIC45IDIgMnY4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4aXQtdG8tYXBwIj48cGF0aCBkPSJNMTAuMDkgMTUuNTlMMTEuNSAxN2w1LTUtNS01LTEuNDEgMS40MUwxMi42NyAxMUgzdjJoOS42N2wtMi41OCAyLjU5ek0xOSAzSDVjLTEuMTEgMC0yIC45LTIgMnY0aDJWNWgxNHYxNEg1di00SDN2NGMwIDEuMS44OSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImV4cGFuZC1sZXNzIj48cGF0aCBkPSJNMTIgOGwtNiA2IDEuNDEgMS40MUwxMiAxMC44M2w0LjU5IDQuNThMMTggMTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwYW5kLW1vcmUiPjxwYXRoIGQ9Ik0xNi41OSA4LjU5TDEyIDEzLjE3IDcuNDEgOC41OSA2IDEwbDYgNiA2LTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXhwbG9yZSI+PHBhdGggZD0iTTEyIDEwLjljLS42MSAwLTEuMS40OS0xLjEgMS4xcy40OSAxLjEgMS4xIDEuMWMuNjEgMCAxLjEtLjQ5IDEuMS0xLjFzLS40OS0xLjEtMS4xLTEuMXpNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMi4xOSAxMi4xOUw2IDE4bDMuODEtOC4xOUwxOCA2bC0zLjgxIDguMTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZXh0ZW5zaW9uIj48cGF0aCBkPSJNMjAuNSAxMUgxOVY3YzAtMS4xLS45LTItMi0yaC00VjMuNUMxMyAyLjEyIDExLjg4IDEgMTAuNSAxUzggMi4xMiA4IDMuNVY1SDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJ2My44SDMuNWMxLjQ5IDAgMi43IDEuMjEgMi43IDIuN3MtMS4yMSAyLjctMi43IDIuN0gyVjIwYzAgMS4xLjkgMiAyIDJoMy44di0xLjVjMC0xLjQ5IDEuMjEtMi43IDIuNy0yLjcgMS40OSAwIDIuNyAxLjIxIDIuNyAyLjdWMjJIMTdjMS4xIDAgMi0uOSAyLTJ2LTRoMS41YzEuMzggMCAyLjUtMS4xMiAyLjUtMi41UzIxLjg4IDExIDIwLjUgMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmFjZSI+PHBhdGggZD0iTTkgMTEuNzVjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1em02IDBjLS42OSAwLTEuMjUuNTYtMS4yNSAxLjI1cy41NiAxLjI1IDEuMjUgMS4yNSAxLjI1LS41NiAxLjI1LTEuMjUtLjU2LTEuMjUtMS4yNS0xLjI1ek0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0wIDE4Yy00LjQxIDAtOC0zLjU5LTgtOCAwLS4yOS4wMi0uNTguMDUtLjg2IDIuMzYtMS4wNSA0LjIzLTIuOTggNS4yMS01LjM3QzExLjA3IDguMzMgMTQuMDUgMTAgMTcuNDIgMTBjLjc4IDAgMS41My0uMDkgMi4yNS0uMjYuMjEuNzEuMzMgMS40Ny4zMyAyLjI2IDAgNC40MS0zLjU5IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZhdm9yaXRlIj48cGF0aCBkPSJNMTIgMjEuMzVsLTEuNDUtMS4zMkM1LjQgMTUuMzYgMiAxMi4yOCAyIDguNSAyIDUuNDIgNC40MiAzIDcuNSAzYzEuNzQgMCAzLjQxLjgxIDQuNSAyLjA5QzEzLjA5IDMuODEgMTQuNzYgMyAxNi41IDMgMTkuNTggMyAyMiA1LjQyIDIyIDguNWMwIDMuNzgtMy40IDYuODYtOC41NSAxMS41NEwxMiAyMS4zNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmYXZvcml0ZS1ib3JkZXIiPjxwYXRoIGQ9Ik0xNi41IDNjLTEuNzQgMC0zLjQxLjgxLTQuNSAyLjA5QzEwLjkxIDMuODEgOS4yNCAzIDcuNSAzIDQuNDIgMyAyIDUuNDIgMiA4LjVjMCAzLjc4IDMuNCA2Ljg2IDguNTUgMTEuNTRMMTIgMjEuMzVsMS40NS0xLjMyQzE4LjYgMTUuMzYgMjIgMTIuMjggMjIgOC41IDIyIDUuNDIgMTkuNTggMyAxNi41IDN6bS00LjQgMTUuNTVsLS4xLjEtLjEtLjFDNy4xNCAxNC4yNCA0IDExLjM5IDQgOC41IDQgNi41IDUuNSA1IDcuNSA1YzEuNTQgMCAzLjA0Ljk5IDMuNTcgMi4zNmgxLjg3QzEzLjQ2IDUuOTkgMTQuOTYgNSAxNi41IDVjMiAwIDMuNSAxLjUgMy41IDMuNSAwIDIuODktMy4xNCA1Ljc0LTcuOSAxMC4wNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJmZWVkYmFjayI+PHBhdGggZD0iTTIwIDJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDIybDQtNGgxNGMxLjEgMCAyLS45IDItMlY0YzAtMS4xLS45LTItMi0yem0tNyAxMmgtMnYtMmgydjJ6bTAtNGgtMlY2aDJ2NHoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaWxlLWRvd25sb2FkIj48cGF0aCBkPSJNMTkgOWgtNFYzSDl2Nkg1bDcgNyA3LTd6TTUgMTh2MmgxNHYtMkg1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZpbGUtdXBsb2FkIj48cGF0aCBkPSJNOSAxNmg2di02aDRsLTctNy03IDdoNHptLTQgMmgxNHYySDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlsdGVyLWxpc3QiPjxwYXRoIGQ9Ik0xMCAxOGg0di0yaC00djJ6TTMgNnYyaDE4VjZIM3ptMyA3aDEydi0ySDZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaW5kLWluLXBhZ2UiPjxwYXRoIGQ9Ik0yMCAxOS41OVY4bC02LTZINmMtMS4xIDAtMS45OS45LTEuOTkgMkw0IDIwYzAgMS4xLjg5IDIgMS45OSAySDE4Yy40NSAwIC44NS0uMTUgMS4xOS0uNGwtNC40My00LjQzYy0uOC41Mi0xLjc0LjgzLTIuNzYuODMtMi43NiAwLTUtMi4yNC01LTVzMi4yNC01IDUtNSA1IDIuMjQgNSA1YzAgMS4wMi0uMzEgMS45Ni0uODMgMi43NUwyMCAxOS41OXpNOSAxM2MwIDEuNjYgMS4zNCAzIDMgM3MzLTEuMzQgMy0zLTEuMzQtMy0zLTMtMyAxLjM0LTMgM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJmaW5kLXJlcGxhY2UiPjxwYXRoIGQ9Ik0xMSA2YzEuMzggMCAyLjYzLjU2IDMuNTQgMS40NkwxMiAxMGg2VjRsLTIuMDUgMi4wNUMxNC42OCA0Ljc4IDEyLjkzIDQgMTEgNGMtMy41MyAwLTYuNDMgMi42MS02LjkyIDZINi4xYy40Ni0yLjI4IDIuNDgtNCA0LjktNHptNS42NCA5LjE0Yy42Ni0uOSAxLjEyLTEuOTcgMS4yOC0zLjE0SDE1LjljLS40NiAyLjI4LTIuNDggNC00LjkgNC0xLjM4IDAtMi42My0uNTYtMy41NC0xLjQ2TDEwIDEySDR2NmwyLjA1LTIuMDVDNy4zMiAxNy4yMiA5LjA3IDE4IDExIDE4YzEuNTUgMCAyLjk4LS41MSA0LjE0LTEuMzZMMjAgMjEuNDkgMjEuNDkgMjBsLTQuODUtNC44NnoiPjwvcGF0aD48L2c+CjxnIGlkPSJmaW5nZXJwcmludCI+PHBhdGggZD0iTTE3LjgxIDQuNDdjLS4wOCAwLS4xNi0uMDItLjIzLS4wNkMxNS42NiAzLjQyIDE0IDMgMTIuMDEgM2MtMS45OCAwLTMuODYuNDctNS41NyAxLjQxLS4yNC4xMy0uNTQuMDQtLjY4LS4yLS4xMy0uMjQtLjA0LS41NS4yLS42OEM3LjgyIDIuNTIgOS44NiAyIDEyLjAxIDJjMi4xMyAwIDMuOTkuNDcgNi4wMyAxLjUyLjI1LjEzLjM0LjQzLjIxLjY3LS4wOS4xOC0uMjYuMjgtLjQ0LjI4ek0zLjUgOS43MmMtLjEgMC0uMi0uMDMtLjI5LS4wOS0uMjMtLjE2LS4yOC0uNDctLjEyLS43Ljk5LTEuNCAyLjI1LTIuNSAzLjc1LTMuMjdDOS45OCA0LjA0IDE0IDQuMDMgMTcuMTUgNS42NWMxLjUuNzcgMi43NiAxLjg2IDMuNzUgMy4yNS4xNi4yMi4xMS41NC0uMTIuNy0uMjMuMTYtLjU0LjExLS43LS4xMi0uOS0xLjI2LTIuMDQtMi4yNS0zLjM5LTIuOTQtMi44Ny0xLjQ3LTYuNTQtMS40Ny05LjQuMDEtMS4zNi43LTIuNSAxLjctMy40IDIuOTYtLjA4LjE0LS4yMy4yMS0uMzkuMjF6bTYuMjUgMTIuMDdjLS4xMyAwLS4yNi0uMDUtLjM1LS4xNS0uODctLjg3LTEuMzQtMS40My0yLjAxLTIuNjQtLjY5LTEuMjMtMS4wNS0yLjczLTEuMDUtNC4zNCAwLTIuOTcgMi41NC01LjM5IDUuNjYtNS4zOXM1LjY2IDIuNDIgNS42NiA1LjM5YzAgLjI4LS4yMi41LS41LjVzLS41LS4yMi0uNS0uNWMwLTIuNDItMi4wOS00LjM5LTQuNjYtNC4zOS0yLjU3IDAtNC42NiAxLjk3LTQuNjYgNC4zOSAwIDEuNDQuMzIgMi43Ny45MyAzLjg1LjY0IDEuMTUgMS4wOCAxLjY0IDEuODUgMi40Mi4xOS4yLjE5LjUxIDAgLjcxLS4xMS4xLS4yNC4xNS0uMzcuMTV6bTcuMTctMS44NWMtMS4xOSAwLTIuMjQtLjMtMy4xLS44OS0xLjQ5LTEuMDEtMi4zOC0yLjY1LTIuMzgtNC4zOSAwLS4yOC4yMi0uNS41LS41cy41LjIyLjUuNWMwIDEuNDEuNzIgMi43NCAxLjk0IDMuNTYuNzEuNDggMS41NC43MSAyLjU0LjcxLjI0IDAgLjY0LS4wMyAxLjA0LS4xLjI3LS4wNS41My4xMy41OC40MS4wNS4yNy0uMTMuNTMtLjQxLjU4LS41Ny4xMS0xLjA3LjEyLTEuMjEuMTJ6TTE0LjkxIDIyYy0uMDQgMC0uMDktLjAxLS4xMy0uMDItMS41OS0uNDQtMi42My0xLjAzLTMuNzItMi4xLTEuNC0xLjM5LTIuMTctMy4yNC0yLjE3LTUuMjIgMC0xLjYyIDEuMzgtMi45NCAzLjA4LTIuOTQgMS43IDAgMy4wOCAxLjMyIDMuMDggMi45NCAwIDEuMDcuOTMgMS45NCAyLjA4IDEuOTRzMi4wOC0uODcgMi4wOC0xLjk0YzAtMy43Ny0zLjI1LTYuODMtNy4yNS02LjgzLTIuODQgMC01LjQ0IDEuNTgtNi42MSA0LjAzLS4zOS44MS0uNTkgMS43Ni0uNTkgMi44IDAgLjc4LjA3IDIuMDEuNjcgMy42MS4xLjI2LS4wMy41NS0uMjkuNjQtLjI2LjEtLjU1LS4wNC0uNjQtLjI5LS40OS0xLjMxLS43My0yLjYxLS43My0zLjk2IDAtMS4yLjIzLTIuMjkuNjgtMy4yNCAxLjMzLTIuNzkgNC4yOC00LjYgNy41MS00LjYgNC41NSAwIDguMjUgMy41MSA4LjI1IDcuODMgMCAxLjYyLTEuMzggMi45NC0zLjA4IDIuOTRzLTMuMDgtMS4zMi0zLjA4LTIuOTRjMC0xLjA3LS45My0xLjk0LTIuMDgtMS45NHMtMi4wOC44Ny0yLjA4IDEuOTRjMCAxLjcxLjY2IDMuMzEgMS44NyA0LjUxLjk1Ljk0IDEuODYgMS40NiAzLjI3IDEuODUuMjcuMDcuNDIuMzUuMzUuNjEtLjA1LjIzLS4yNi4zOC0uNDcuMzh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZmlyc3QtcGFnZSI+PHBhdGggZD0iTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsYWciPjxwYXRoIGQ9Ik0xNC40IDZMMTQgNEg1djE3aDJ2LTdoNS42bC40IDJoN1Y2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaWdodC1sYW5kIj48cGF0aCBkPSJNMi41IDE5aDE5djJoLTE5em03LjE4LTUuNzNsNC4zNSAxLjE2IDUuMzEgMS40MmMuOC4yMSAxLjYyLS4yNiAxLjg0LTEuMDYuMjEtLjgtLjI2LTEuNjItMS4wNi0xLjg0bC01LjMxLTEuNDItMi43Ni05LjAyTDEwLjEyIDJ2OC4yOEw1LjE1IDguOTVsLS45My0yLjMyLTEuNDUtLjM5djUuMTdsMS42LjQzIDUuMzEgMS40M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJmbGlnaHQtdGFrZW9mZiI+PHBhdGggZD0iTTIuNSAxOWgxOXYyaC0xOXptMTkuNTctOS4zNmMtLjIxLS44LTEuMDQtMS4yOC0xLjg0LTEuMDZMMTQuOTIgMTBsLTYuOS02LjQzLTEuOTMuNTEgNC4xNCA3LjE3LTQuOTcgMS4zMy0xLjk3LTEuNTQtMS40NS4zOSAxLjgyIDMuMTYuNzcgMS4zMyAxLjYtLjQzIDUuMzEtMS40MiA0LjM1LTEuMTZMMjEgMTEuNDljLjgxLS4yMyAxLjI4LTEuMDUgMS4wNy0xLjg1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaXAtdG8tYmFjayI+PHBhdGggZD0iTTkgN0g3djJoMlY3em0wIDRIN3YyaDJ2LTJ6bTAtOGMtMS4xMSAwLTIgLjktMiAyaDJWM3ptNCAxMmgtMnYyaDJ2LTJ6bTYtMTJ2MmgyYzAtMS4xLS45LTItMi0yem0tNiAwaC0ydjJoMlYzek05IDE3di0ySDdjMCAxLjEuODkgMiAyIDJ6bTEwLTRoMnYtMmgtMnYyem0wLTRoMlY3aC0ydjJ6bTAgOGMxLjEgMCAyLS45IDItMmgtMnYyek01IDdIM3YxMmMwIDEuMS44OSAyIDIgMmgxMnYtMkg1Vjd6bTEwLTJoMlYzaC0ydjJ6bTAgMTJoMnYtMmgtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZsaXAtdG8tZnJvbnQiPjxwYXRoIGQ9Ik0zIDEzaDJ2LTJIM3Yyem0wIDRoMnYtMkgzdjJ6bTIgNHYtMkgzYzAgMS4xLjg5IDIgMiAyek0zIDloMlY3SDN2MnptMTIgMTJoMnYtMmgtMnYyem00LTE4SDljLTEuMTEgMC0yIC45LTIgMnYxMGMwIDEuMS44OSAyIDIgMmgxMGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDEySDlWNWgxMHYxMHptLTggNmgydi0yaC0ydjJ6bS00IDBoMnYtMkg3djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9sZGVyIj48cGF0aCBkPSJNMTAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yaC04bC0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9sZGVyLW9wZW4iPjxwYXRoIGQ9Ik0yMCA2aC04bC0yLTJINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWOGMwLTEuMS0uOS0yLTItMnptMCAxMkg0VjhoMTZ2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZm9sZGVyLXNoYXJlZCI+PHBhdGggZD0iTTIwIDZoLThsLTItMkg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY4YzAtMS4xLS45LTItMi0yem0tNSAzYzEuMSAwIDIgLjkgMiAycy0uOSAyLTIgMi0yLS45LTItMiAuOS0yIDItMnptNCA4aC04di0xYzAtMS4zMyAyLjY3LTIgNC0yczQgLjY3IDQgMnYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZvbnQtZG93bmxvYWQiPjxwYXRoIGQ9Ik05LjkzIDEzLjVoNC4xNEwxMiA3Ljk4ek0yMCAySDRjLTEuMSAwLTIgLjktMiAydjE2YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnptLTQuMDUgMTYuNWwtMS4xNC0zSDkuMTdsLTEuMTIgM0g1Ljk2bDUuMTEtMTNoMS44Nmw1LjExIDEzaC0yLjA5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImZvcndhcmQiPjxwYXRoIGQ9Ik0xMiA4VjRsOCA4LTggOHYtNEg0Vjh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbiI+PHBhdGggZD0iTTcgMTRINXY1aDV2LTJIN3YtM3ptLTItNGgyVjdoM1Y1SDV2NXptMTIgN2gtM3YyaDV2LTVoLTJ2M3pNMTQgNXYyaDN2M2gyVjVoLTV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZnVsbHNjcmVlbi1leGl0Ij48cGF0aCBkPSJNNSAxNmgzdjNoMnYtNUg1djJ6bTMtOEg1djJoNVY1SDh2M3ptNiAxMWgydi0zaDN2LTJoLTV2NXptMi0xMVY1aC0ydjVoNVY4aC0zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImctdHJhbnNsYXRlIj48cGF0aCBkPSJNMjAgNWgtOS4xMkwxMCAySDRjLTEuMSAwLTIgLjktMiAydjEzYzAgMS4xLjkgMiAyIDJoN2wxIDNoOGMxLjEgMCAyLS45IDItMlY3YzAtMS4xLS45LTItMi0yek03LjE3IDE0LjU5Yy0yLjI1IDAtNC4wOS0xLjgzLTQuMDktNC4wOXMxLjgzLTQuMDkgNC4wOS00LjA5YzEuMDQgMCAxLjk5LjM3IDIuNzQgMS4wN2wuMDcuMDYtMS4yMyAxLjE4LS4wNi0uMDVjLS4yOS0uMjctLjc4LS41OS0xLjUyLS41OS0xLjMxIDAtMi4zOCAxLjA5LTIuMzggMi40MnMxLjA3IDIuNDIgMi4zOCAyLjQyYzEuMzcgMCAxLjk2LS44NyAyLjEyLTEuNDZINy4wOFY5LjkxaDMuOTVsLjAxLjA3Yy4wNC4yMS4wNS40LjA1LjYxIDAgMi4zNS0xLjYxIDQtMy45MiA0em02LjAzLTEuNzFjLjMzLjYuNzQgMS4xOCAxLjE5IDEuN2wtLjU0LjUzLS42NS0yLjIzem0uNzctLjc2aC0uOTlsLS4zMS0xLjA0aDMuOTlzLS4zNCAxLjMxLTEuNTYgMi43NGMtLjUyLS42Mi0uODktMS4yMy0xLjEzLTEuN3pNMjEgMjBjMCAuNTUtLjQ1IDEtMSAxaC03bDItMi0uODEtMi43Ny45Mi0uOTJMMTcuNzkgMThsLjczLS43My0yLjcxLTIuNjhjLjktMS4wMyAxLjYtMi4yNSAxLjkyLTMuNTFIMTl2LTEuMDRoLTMuNjRWOWgtMS4wNHYxLjA0aC0xLjk2TDExLjE4IDZIMjBjLjU1IDAgMSAuNDUgMSAxdjEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdhdmVsIj48cGF0aCBkPSJNMSAyMWgxMnYySDF6TTUuMjQ1IDguMDdsMi44My0yLjgyNyAxNC4xNCAxNC4xNDItMi44MjggMi44Mjh6TTEyLjMxNyAxbDUuNjU3IDUuNjU2LTIuODMgMi44My01LjY1NC01LjY2ek0zLjgyNSA5LjQ4NWw1LjY1NyA1LjY1Ny0yLjgyOCAyLjgyOC01LjY1Ny01LjY1N3oiPjwvcGF0aD48L2c+CjxnIGlkPSJnZXN0dXJlIj48cGF0aCBkPSJNNC41OSA2Ljg5Yy43LS43MSAxLjQtMS4zNSAxLjcxLTEuMjIuNS4yIDAgMS4wMy0uMyAxLjUyLS4yNS40Mi0yLjg2IDMuODktMi44NiA2LjMxIDAgMS4yOC40OCAyLjM0IDEuMzQgMi45OC43NS41NiAxLjc0LjczIDIuNjQuNDYgMS4wNy0uMzEgMS45NS0xLjQgMy4wNi0yLjc3IDEuMjEtMS40OSAyLjgzLTMuNDQgNC4wOC0zLjQ0IDEuNjMgMCAxLjY1IDEuMDEgMS43NiAxLjc5LTMuNzguNjQtNS4zOCAzLjY3LTUuMzggNS4zNyAwIDEuNyAxLjQ0IDMuMDkgMy4yMSAzLjA5IDEuNjMgMCA0LjI5LTEuMzMgNC42OS02LjFIMjF2LTIuNWgtMi40N2MtLjE1LTEuNjUtMS4wOS00LjItNC4wMy00LjItMi4yNSAwLTQuMTggMS45MS00Ljk0IDIuODQtLjU4LjczLTIuMDYgMi40OC0yLjI5IDIuNzItLjI1LjMtLjY4Ljg0LTEuMTEuODQtLjQ1IDAtLjcyLS44My0uMzYtMS45Mi4zNS0xLjA5IDEuNC0yLjg2IDEuODUtMy41Mi43OC0xLjE0IDEuMy0xLjkyIDEuMy0zLjI4QzguOTUgMy42OSA3LjMxIDMgNi40NCAzIDUuMTIgMyAzLjk3IDQgMy43MiA0LjI1Yy0uMzYuMzYtLjY2LjY2LS44OC45M2wxLjc1IDEuNzF6bTkuMjkgMTEuNjZjLS4zMSAwLS43NC0uMjYtLjc0LS43MiAwLS42LjczLTIuMiAyLjg3LTIuNzYtLjMgMi42OS0xLjQzIDMuNDgtMi4xMyAzLjQ4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImdldC1hcHAiPjxwYXRoIGQ9Ik0xOSA5aC00VjNIOXY2SDVsNyA3IDctN3pNNSAxOHYyaDE0di0ySDV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iZ2lmIj48cGF0aCBkPSJNMTEuNSA5SDEzdjZoLTEuNXpNOSA5SDZjLS42IDAtMSAuNS0xIDF2NGMwIC41LjQgMSAxIDFoM2MuNiAwIDEtLjUgMS0xdi0ySDguNXYxLjVoLTJ2LTNIMTBWMTBjMC0uNS0uNC0xLTEtMXptMTAgMS41VjloLTQuNXY2SDE2di0yaDJ2LTEuNWgtMnYtMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJncmFkZSI+PHBhdGggZD0iTTEyIDE3LjI3TDE4LjE4IDIxbC0xLjY0LTcuMDNMMjIgOS4yNGwtNy4xOS0uNjFMMTIgMiA5LjE5IDguNjMgMiA5LjI0bDUuNDYgNC43M0w1LjgyIDIxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imdyb3VwLXdvcmsiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek04IDE3LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41ek05LjUgOGMwLTEuMzggMS4xMi0yLjUgMi41LTIuNXMyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjVTOS41IDkuMzggOS41IDh6bTYuNSA5LjVjLTEuMzggMC0yLjUtMS4xMi0yLjUtMi41czEuMTItMi41IDIuNS0yLjUgMi41IDEuMTIgMi41IDIuNS0xLjEyIDIuNS0yLjUgMi41eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhlbHAiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xIDE3aC0ydi0yaDJ2MnptMi4wNy03Ljc1bC0uOS45MkMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xLjQ1LTIuMSAxLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0xLjEtLjktMi0yLTJzLTIgLjktMiAySDhjMC0yLjIxIDEuNzktNCA0LTRzNCAxLjc5IDQgNGMwIC44OC0uMzYgMS42OC0uOTMgMi4yNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJoZWxwLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxOGgydi0yaC0ydjJ6bTEtMTZDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4em0wLTE0Yy0yLjIxIDAtNCAxLjc5LTQgNGgyYzAtMS4xLjktMiAyLTJzMiAuOSAyIDJjMCAyLTMgMS43NS0zIDVoMmMwLTIuMjUgMy0yLjUgMy01IDAtMi4yMS0xLjc5LTQtNC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhpZ2hsaWdodC1vZmYiPjxwYXRoIGQ9Ik0xNC41OSA4TDEyIDEwLjU5IDkuNDEgOCA4IDkuNDEgMTAuNTkgMTIgOCAxNC41OSA5LjQxIDE2IDEyIDEzLjQxIDE0LjU5IDE2IDE2IDE0LjU5IDEzLjQxIDEyIDE2IDkuNDEgMTQuNTkgOHpNMTIgMkM2LjQ3IDIgMiA2LjQ3IDIgMTJzNC40NyAxMCAxMCAxMCAxMC00LjQ3IDEwLTEwUzE3LjUzIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaGlzdG9yeSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJob21lIj48cGF0aCBkPSJNMTAgMjB2LTZoNHY2aDV2LThoM0wxMiAzIDIgMTJoM3Y4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1lbXB0eSI+PHBhdGggZD0iTTYgMnY2aC4wMUw2IDguMDEgMTAgMTJsLTQgNCAuMDEuMDFINlYyMmgxMnYtNS45OWgtLjAxTDE4IDE2bC00LTQgNC0zLjk5LS4wMS0uMDFIMThWMkg2em0xMCAxNC41VjIwSDh2LTMuNWw0LTQgNCA0em0tNC01bC00LTRWNGg4djMuNWwtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImhvdXJnbGFzcy1mdWxsIj48cGF0aCBkPSJNNiAydjZoLjAxTDYgOC4wMSAxMCAxMmwtNCA0IC4wMS4wMUg2VjIyaDEydi01Ljk5aC0uMDFMMTggMTZsLTQtNCA0LTMuOTktLjAxLS4wMUgxOFYySDZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaHR0cCI+PHBhdGggZD0iTTQuNSAxMWgtMlY5SDF2NmgxLjV2LTIuNWgyVjE1SDZWOUg0LjV2MnptMi41LS41aDEuNVYxNUgxMHYtNC41aDEuNVY5SDd2MS41em01LjUgMEgxNFYxNWgxLjV2LTQuNUgxN1Y5aC00LjV2MS41em05LTEuNUgxOHY2aDEuNXYtMmgyYy44IDAgMS41LS43IDEuNS0xLjV2LTFjMC0uOC0uNy0xLjUtMS41LTEuNXptMCAyLjVoLTJ2LTFoMnYxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imh0dHBzIj48cGF0aCBkPSJNMTggOGgtMVY2YzAtMi43Ni0yLjI0LTUtNS01UzcgMy4yNCA3IDZ2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0tNiA5Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnptMy4xLTlIOC45VjZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbXBvcnRhbnQtZGV2aWNlcyI+PHBhdGggZD0iTTIzIDExLjAxTDE4IDExYy0uNTUgMC0xIC40NS0xIDF2OWMwIC41NS40NSAxIDEgMWg1Yy41NSAwIDEtLjQ1IDEtMXYtOWMwLS41NS0uNDUtLjk5LTEtLjk5ek0yMyAyMGgtNXYtN2g1djd6TTIwIDJIMkMuODkgMiAwIDIuODkgMCA0djEyYzAgMS4xLjg5IDIgMiAyaDd2Mkg3djJoOHYtMmgtMnYtMmgydi0ySDJWNGgxOHY1aDJWNGMwLTEuMTEtLjktMi0yLTJ6bS04LjAzIDdMMTEgNmwtLjk3IDNIN2wyLjQ3IDEuNzYtLjk0IDIuOTEgMi40Ny0xLjggMi40NyAxLjgtLjk0LTIuOTFMMTUgOWgtMy4wM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJpbmJveCI+PHBhdGggZD0iTTE5IDNINC45OWMtMS4xMSAwLTEuOTguODktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMTEtLjktMi0yLTJ6bTAgMTJoLTRjMCAxLjY2LTEuMzUgMy0zIDNzLTMtMS4zNC0zLTNINC45OVY1SDE5djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImluZGV0ZXJtaW5hdGUtY2hlY2stYm94Ij48cGF0aCBkPSJNMTkgM0g1Yy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0yVjVjMC0xLjEtLjktMi0yLTJ6bS0yIDEwSDd2LTJoMTB2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbmZvIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMSAxNWgtMnYtNmgydjZ6bTAtOGgtMlY3aDJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJpbmZvLW91dGxpbmUiPjxwYXRoIGQ9Ik0xMSAxN2gydi02aC0ydjZ6bTEtMTVDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDEgMC04LTMuNTktOC04czMuNTktOCA4LTggOCAzLjU5IDggOC0zLjU5IDgtOCA4ek0xMSA5aDJWN2gtMnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImlucHV0Ij48cGF0aCBkPSJNMjEgMy4wMUgzYy0xLjEgMC0yIC45LTIgMlY5aDJWNC45OWgxOHYxNC4wM0gzVjE1SDF2NC4wMWMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OHYtMTRjMC0xLjExLS45LTItMi0yek0xMSAxNmw0LTQtNC00djNIMXYyaDEwdjN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iaW52ZXJ0LWNvbG9ycyI+PHBhdGggZD0iTTE3LjY2IDcuOTNMMTIgMi4yNyA2LjM0IDcuOTNjLTMuMTIgMy4xMi0zLjEyIDguMTkgMCAxMS4zMUM3LjkgMjAuOCA5Ljk1IDIxLjU4IDEyIDIxLjU4YzIuMDUgMCA0LjEtLjc4IDUuNjYtMi4zNCAzLjEyLTMuMTIgMy4xMi04LjE5IDAtMTEuMzF6TTEyIDE5LjU5Yy0xLjYgMC0zLjExLS42Mi00LjI0LTEuNzZDNi42MiAxNi42OSA2IDE1LjE5IDYgMTMuNTlzLjYyLTMuMTEgMS43Ni00LjI0TDEyIDUuMXYxNC40OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsYWJlbCI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGFiZWwtb3V0bGluZSI+PHBhdGggZD0iTTE3LjYzIDUuODRDMTcuMjcgNS4zMyAxNi42NyA1IDE2IDVMNSA1LjAxQzMuOSA1LjAxIDMgNS45IDMgN3YxMGMwIDEuMS45IDEuOTkgMiAxLjk5TDE2IDE5Yy42NyAwIDEuMjctLjMzIDEuNjMtLjg0TDIyIDEybC00LjM3LTYuMTZ6TTE2IDE3SDVWN2gxMWwzLjU1IDVMMTYgMTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGFuZ3VhZ2UiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyem02LjkzIDZoLTIuOTVjLS4zMi0xLjI1LS43OC0yLjQ1LTEuMzgtMy41NiAxLjg0LjYzIDMuMzcgMS45MSA0LjMzIDMuNTZ6TTEyIDQuMDRjLjgzIDEuMiAxLjQ4IDIuNTMgMS45MSAzLjk2aC0zLjgyYy40My0xLjQzIDEuMDgtMi43NiAxLjkxLTMuOTZ6TTQuMjYgMTRDNC4xIDEzLjM2IDQgMTIuNjkgNCAxMnMuMS0xLjM2LjI2LTJoMy4zOGMtLjA4LjY2LS4xNCAxLjMyLS4xNCAyIDAgLjY4LjA2IDEuMzQuMTQgMkg0LjI2em0uODIgMmgyLjk1Yy4zMiAxLjI1Ljc4IDIuNDUgMS4zOCAzLjU2LTEuODQtLjYzLTMuMzctMS45LTQuMzMtMy41NnptMi45NS04SDUuMDhjLjk2LTEuNjYgMi40OS0yLjkzIDQuMzMtMy41NkM4LjgxIDUuNTUgOC4zNSA2Ljc1IDguMDMgOHpNMTIgMTkuOTZjLS44My0xLjItMS40OC0yLjUzLTEuOTEtMy45NmgzLjgyYy0uNDMgMS40My0xLjA4IDIuNzYtMS45MSAzLjk2ek0xNC4zNCAxNEg5LjY2Yy0uMDktLjY2LS4xNi0xLjMyLS4xNi0yIDAtLjY4LjA3LTEuMzUuMTYtMmg0LjY4Yy4wOS42NS4xNiAxLjMyLjE2IDIgMCAuNjgtLjA3IDEuMzQtLjE2IDJ6bS4yNSA1LjU2Yy42LTEuMTEgMS4wNi0yLjMxIDEuMzgtMy41NmgyLjk1Yy0uOTYgMS42NS0yLjQ5IDIuOTMtNC4zMyAzLjU2ek0xNi4zNiAxNGMuMDgtLjY2LjE0LTEuMzIuMTQtMiAwLS42OC0uMDYtMS4zNC0uMTQtMmgzLjM4Yy4xNi42NC4yNiAxLjMxLjI2IDJzLS4xIDEuMzYtLjI2IDJoLTMuMzh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGFzdC1wYWdlIj48cGF0aCBkPSJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGF1bmNoIj48cGF0aCBkPSJNMTkgMTlINVY1aDdWM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJ2LTdoLTJ2N3pNMTQgM3YyaDMuNTlsLTkuODMgOS44MyAxLjQxIDEuNDFMMTkgNi40MVYxMGgyVjNoLTd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGlnaHRidWxiLW91dGxpbmUiPjxwYXRoIGQ9Ik05IDIxYzAgLjU1LjQ1IDEgMSAxaDRjLjU1IDAgMS0uNDUgMS0xdi0xSDl2MXptMy0xOUM4LjE0IDIgNSA1LjE0IDUgOWMwIDIuMzggMS4xOSA0LjQ3IDMgNS43NFYxN2MwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMXYtMi4yNmMxLjgxLTEuMjcgMy0zLjM2IDMtNS43NCAwLTMuODYtMy4xNC03LTctN3ptMi44NSAxMS4xbC0uODUuNlYxNmgtNHYtMi4zbC0uODUtLjZDNy44IDEyLjE2IDcgMTAuNjMgNyA5YzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVjMCAxLjYzLS44IDMuMTYtMi4xNSA0LjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGluZS1zdHlsZSI+PHBhdGggZD0iTTMgMTZoNXYtMkgzdjJ6bTYuNSAwaDV2LTJoLTV2MnptNi41IDBoNXYtMmgtNXYyek0zIDIwaDJ2LTJIM3Yyem00IDBoMnYtMkg3djJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6bTQgMGgydi0yaC0ydjJ6TTMgMTJoOHYtMkgzdjJ6bTEwIDBoOHYtMmgtOHYyek0zIDR2NGgxOFY0SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibGluZS13ZWlnaHQiPjxwYXRoIGQ9Ik0zIDE3aDE4di0ySDN2MnptMCAzaDE4di0xSDN2MXptMC03aDE4di0zSDN2M3ptMC05djRoMThWNEgzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxpbmsiPjxwYXRoIGQ9Ik0zLjkgMTJjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFoNFY3SDdjLTIuNzYgMC01IDIuMjQtNSA1czIuMjQgNSA1IDVoNHYtMS45SDdjLTEuNzEgMC0zLjEtMS4zOS0zLjEtMy4xek04IDEzaDh2LTJIOHYyem05LTZoLTR2MS45aDRjMS43MSAwIDMuMSAxLjM5IDMuMSAzLjFzLTEuMzkgMy4xLTMuMSAzLjFoLTRWMTdoNGMyLjc2IDAgNS0yLjI0IDUtNXMtMi4yNC01LTUtNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJsaXN0Ij48cGF0aCBkPSJNMyAxM2gydi0ySDN2MnptMCA0aDJ2LTJIM3Yyem0wLThoMlY3SDN2MnptNCA0aDE0di0ySDd2MnptMCA0aDE0di0ySDd2MnpNNyA3djJoMTRWN0g3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxvY2siPjxwYXRoIGQ9Ik0xOCA4aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNnYySDZjLTEuMSAwLTIgLjktMiAydjEwYzAgMS4xLjkgMiAyIDJoMTJjMS4xIDAgMi0uOSAyLTJWMTBjMC0xLjEtLjktMi0yLTJ6bS02IDljLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyem0zLjEtOUg4LjlWNmMwLTEuNzEgMS4zOS0zLjEgMy4xLTMuMSAxLjcxIDAgMy4xIDEuMzkgMy4xIDMuMXYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9ImxvY2stb3BlbiI+PHBhdGggZD0iTTEyIDE3YzEuMSAwIDItLjkgMi0ycy0uOS0yLTItMi0yIC45LTIgMiAuOSAyIDIgMnptNi05aC0xVjZjMC0yLjc2LTIuMjQtNS01LTVTNyAzLjI0IDcgNmgxLjljMC0xLjcxIDEuMzktMy4xIDMuMS0zLjEgMS43MSAwIDMuMSAxLjM5IDMuMSAzLjF2Mkg2Yy0xLjEgMC0yIC45LTIgMnYxMGMwIDEuMS45IDIgMiAyaDEyYzEuMSAwIDItLjkgMi0yVjEwYzAtMS4xLS45LTItMi0yem0wIDEySDZWMTBoMTJ2MTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG9jay1vdXRsaW5lIj48cGF0aCBkPSJNMTIgMTdjMS4xIDAgMi0uOSAyLTJzLS45LTItMi0yLTIgLjktMiAyIC45IDIgMiAyem02LTloLTFWNmMwLTIuNzYtMi4yNC01LTUtNVM3IDMuMjQgNyA2djJINmMtMS4xIDAtMiAuOS0yIDJ2MTBjMCAxLjEuOSAyIDIgMmgxMmMxLjEgMCAyLS45IDItMlYxMGMwLTEuMS0uOS0yLTItMnpNOC45IDZjMC0xLjcxIDEuMzktMy4xIDMuMS0zLjFzMy4xIDEuMzkgMy4xIDMuMXYySDguOVY2ek0xOCAyMEg2VjEwaDEydjEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9Imxvdy1wcmlvcml0eSI+PHBhdGggZD0iTTE0IDVoOHYyaC04em0wIDUuNWg4djJoLTh6bTAgNS41aDh2MmgtOHpNMiAxMS41QzIgMTUuMDggNC45MiAxOCA4LjUgMThIOXYybDMtMy0zLTN2MmgtLjVDNi4wMiAxNiA0IDEzLjk4IDQgMTEuNVM2LjAyIDcgOC41IDdIMTJWNUg4LjVDNC45MiA1IDIgNy45MiAyIDExLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibG95YWx0eSI+PHBhdGggZD0iTTIxLjQxIDExLjU4bC05LTlDMTIuMDUgMi4yMiAxMS41NSAyIDExIDJINGMtMS4xIDAtMiAuOS0yIDJ2N2MwIC41NS4yMiAxLjA1LjU5IDEuNDJsOSA5Yy4zNi4zNi44Ni41OCAxLjQxLjU4LjU1IDAgMS4wNS0uMjIgMS40MS0uNTlsNy03Yy4zNy0uMzYuNTktLjg2LjU5LTEuNDEgMC0uNTUtLjIzLTEuMDYtLjU5LTEuNDJ6TTUuNSA3QzQuNjcgNyA0IDYuMzMgNCA1LjVTNC42NyA0IDUuNSA0IDcgNC42NyA3IDUuNSA2LjMzIDcgNS41IDd6bTExLjc3IDguMjdMMTMgMTkuNTRsLTQuMjctNC4yN0M4LjI4IDE0LjgxIDggMTQuMTkgOCAxMy41YzAtMS4zOCAxLjEyLTIuNSAyLjUtMi41LjY5IDAgMS4zMi4yOCAxLjc3Ljc0bC43My43Mi43My0uNzNjLjQ1LS40NSAxLjA4LS43MyAxLjc3LS43MyAxLjM4IDAgMi41IDEuMTIgMi41IDIuNSAwIC42OS0uMjggMS4zMi0uNzMgMS43N3oiPjwvcGF0aD48L2c+CjxnIGlkPSJtYWlsIj48cGF0aCBkPSJNMjAgNEg0Yy0xLjEgMC0xLjk5LjktMS45OSAyTDIgMThjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0wIDRsLTggNS04LTVWNmw4IDUgOC01djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibWFya3VucmVhZCI+PHBhdGggZD0iTTIwIDRINGMtMS4xIDAtMS45OS45LTEuOTkgMkwyIDE4YzAgMS4xLjkgMiAyIDJoMTZjMS4xIDAgMi0uOSAyLTJWNmMwLTEuMS0uOS0yLTItMnptMCA0bC04IDUtOC01VjZsOCA1IDgtNXYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1hcmt1bnJlYWQtbWFpbGJveCI+PHBhdGggZD0iTTIwIDZIMTB2Nkg4VjRoNlYwSDZ2Nkg0Yy0xLjEgMC0yIC45LTIgMnYxMmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjhjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibWVudSI+PHBhdGggZD0iTTMgMThoMTh2LTJIM3Yyem0wLTVoMTh2LTJIM3Yyem0wLTd2MmgxOFY2SDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibW9yZS1ob3JpeiI+PHBhdGggZD0iTTYgMTBjLTEuMSAwLTIgLjktMiAycy45IDIgMiAyIDItLjkgMi0yLS45LTItMi0yem0xMiAwYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptLTYgMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibW9yZS12ZXJ0Ij48cGF0aCBkPSJNMTIgOGMxLjEgMCAyLS45IDItMnMtLjktMi0yLTItMiAuOS0yIDIgLjkgMiAyIDJ6bTAgMmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTAgNmMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ibW90b3JjeWNsZSI+PHBhdGggZD0iTTE5LjQ0IDkuMDNMMTUuNDEgNUgxMXYyaDMuNTlsMiAySDVjLTIuOCAwLTUgMi4yLTUgNXMyLjIgNSA1IDVjMi40NiAwIDQuNDUtMS42OSA0LjktNGgxLjY1bDIuNzctMi43N2MtLjIxLjU0LS4zMiAxLjE0LS4zMiAxLjc3IDAgMi44IDIuMiA1IDUgNXM1LTIuMiA1LTVjMC0yLjY1LTEuOTctNC43Ny00LjU2LTQuOTd6TTcuODIgMTVDNy40IDE2LjE1IDYuMjggMTcgNSAxN2MtMS42MyAwLTMtMS4zNy0zLTNzMS4zNy0zIDMtM2MxLjI4IDAgMi40Ljg1IDIuODIgMkg1djJoMi44MnpNMTkgMTdjLTEuNjYgMC0zLTEuMzQtMy0zczEuMzQtMyAzLTMgMyAxLjM0IDMgMy0xLjM0IDMtMyAzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im1vdmUtdG8taW5ib3giPjxwYXRoIGQ9Ik0xOSAzSDQuOTljLTEuMTEgMC0xLjk4LjktMS45OCAyTDMgMTljMCAxLjEuODggMiAxLjk5IDJIMTljMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxMmgtNGMwIDEuNjYtMS4zNSAzLTMgM3MtMy0xLjM0LTMtM0g0Ljk5VjVIMTl2MTB6bS0zLTVoLTJWN2gtNHYzSDhsNCA0IDQtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJuZXh0LXdlZWsiPjxwYXRoIGQ9Ik0yMCA3aC00VjVjMC0uNTUtLjIyLTEuMDUtLjU5LTEuNDFDMTUuMDUgMy4yMiAxNC41NSAzIDE0IDNoLTRjLTEuMSAwLTIgLjktMiAydjJINGMtMS4xIDAtMiAuOS0yIDJ2MTFjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY5YzAtMS4xLS45LTItMi0yek0xMCA1aDR2MmgtNFY1em0xIDEzLjVsLTEtMSAzLTMtMy0zIDEtMSA0IDQtNCA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im5vdGUtYWRkIj48cGF0aCBkPSJNMTQgMkg2Yy0xLjEgMC0xLjk5LjktMS45OSAyTDQgMjBjMCAxLjEuODkgMiAxLjk5IDJIMThjMS4xIDAgMi0uOSAyLTJWOGwtNi02em0yIDE0aC0zdjNoLTJ2LTNIOHYtMmgzdi0zaDJ2M2gzdjJ6bS0zLTdWMy41TDE4LjUgOUgxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJvZmZsaW5lLXBpbiI+PHBhdGggZD0iTTEyIDJDNi41IDIgMiA2LjUgMiAxMnM0LjUgMTAgMTAgMTAgMTAtNC41IDEwLTEwUzE3LjUgMiAxMiAyem01IDE2SDd2LTJoMTB2MnptLTYuNy00TDcgMTAuN2wxLjQtMS40IDEuOSAxLjkgNS4zLTUuM0wxNyA3LjMgMTAuMyAxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJvcGFjaXR5Ij48cGF0aCBkPSJNMTcuNjYgOEwxMiAyLjM1IDYuMzQgOEM0Ljc4IDkuNTYgNCAxMS42NCA0IDEzLjY0cy43OCA0LjExIDIuMzQgNS42NyAzLjYxIDIuMzUgNS42NiAyLjM1IDQuMS0uNzkgNS42Ni0yLjM1UzIwIDE1LjY0IDIwIDEzLjY0IDE5LjIyIDkuNTYgMTcuNjYgOHpNNiAxNGMuMDEtMiAuNjItMy4yNyAxLjc2LTQuNEwxMiA1LjI3bDQuMjQgNC4zOEMxNy4zOCAxMC43NyAxNy45OSAxMiAxOCAxNEg2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9wZW4taW4tYnJvd3NlciI+PHBhdGggZD0iTTE5IDRINWMtMS4xMSAwLTIgLjktMiAydjEyYzAgMS4xLjg5IDIgMiAyaDR2LTJINVY4aDE0djEwaC00djJoNGMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS44OS0yLTItMnptLTcgNmwtNCA0aDN2Nmgydi02aDNsLTQtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJvcGVuLWluLW5ldyI+PHBhdGggZD0iTTE5IDE5SDVWNWg3VjNINWMtMS4xMSAwLTIgLjktMiAydjE0YzAgMS4xLjg5IDIgMiAyaDE0YzEuMSAwIDItLjkgMi0ydi03aC0ydjd6TTE0IDN2MmgzLjU5bC05LjgzIDkuODMgMS40MSAxLjQxTDE5IDYuNDFWMTBoMlYzaC03eiI+PC9wYXRoPjwvZz4KPGcgaWQ9Im9wZW4td2l0aCI+PHBhdGggZD0iTTEwIDloNFY2aDNsLTUtNS01IDVoM3Yzem0tMSAxSDZWN2wtNSA1IDUgNXYtM2gzdi00em0xNCAybC01LTV2M2gtM3Y0aDN2M2w1LTV6bS05IDNoLTR2M0g3bDUgNSA1LTVoLTN2LTN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGFnZXZpZXciPjxwYXRoIGQ9Ik0xMS41IDlDMTAuMTIgOSA5IDEwLjEyIDkgMTEuNXMxLjEyIDIuNSAyLjUgMi41IDIuNS0xLjEyIDIuNS0yLjVTMTIuODggOSAxMS41IDl6TTIwIDRINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmgxNmMxLjEgMCAyLS45IDItMlY2YzAtMS4xLS45LTItMi0yem0tMy4yMSAxNC4yMWwtMi45MS0yLjkxYy0uNjkuNDQtMS41MS43LTIuMzkuN0M5LjAxIDE2IDcgMTMuOTkgNyAxMS41UzkuMDEgNyAxMS41IDcgMTYgOS4wMSAxNiAxMS41YzAgLjg4LS4yNiAxLjY5LS43IDIuMzlsMi45MSAyLjktMS40MiAxLjQyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBhbi10b29sIj48cGF0aCBkPSJNMjMgNS41VjIwYzAgMi4yLTEuOCA0LTQgNGgtNy4zYy0xLjA4IDAtMi4xLS40My0yLjg1LTEuMTlMMSAxNC44M3MxLjI2LTEuMjMgMS4zLTEuMjVjLjIyLS4xOS40OS0uMjkuNzktLjI5LjIyIDAgLjQyLjA2LjYuMTYuMDQuMDEgNC4zMSAyLjQ2IDQuMzEgMi40NlY0YzAtLjgzLjY3LTEuNSAxLjUtMS41UzExIDMuMTcgMTEgNHY3aDFWMS41YzAtLjgzLjY3LTEuNSAxLjUtMS41UzE1IC42NyAxNSAxLjVWMTFoMVYyLjVjMC0uODMuNjctMS41IDEuNS0xLjVzMS41LjY3IDEuNSAxLjVWMTFoMVY1LjVjMC0uODMuNjctMS41IDEuNS0xLjVzMS41LjY3IDEuNSAxLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGF5bWVudCI+PHBhdGggZD0iTTIwIDRINGMtMS4xMSAwLTEuOTkuODktMS45OSAyTDIgMThjMCAxLjExLjg5IDIgMiAyaDE2YzEuMTEgMCAyLS44OSAyLTJWNmMwLTEuMTEtLjg5LTItMi0yem0wIDE0SDR2LTZoMTZ2NnptMC0xMEg0VjZoMTZ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWNhbWVyYS1taWMiPjxwYXRoIGQ9Ik0yMCA1aC0zLjE3TDE1IDNIOUw3LjE3IDVINGMtMS4xIDAtMiAuOS0yIDJ2MTJjMCAxLjEuOSAyIDIgMmg3di0yLjA5Yy0yLjgzLS40OC01LTIuOTQtNS01LjkxaDJjMCAyLjIxIDEuNzkgNCA0IDRzNC0xLjc5IDQtNGgyYzAgMi45Ny0yLjE3IDUuNDMtNSA1LjkxVjIxaDdjMS4xIDAgMi0uOSAyLTJWN2MwLTEuMS0uOS0yLTItMnptLTYgOGMwIDEuMS0uOSAyLTIgMnMtMi0uOS0yLTJWOWMwLTEuMS45LTIgMi0yczIgLjkgMiAydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1jb250YWN0LWNhbGVuZGFyIj48cGF0aCBkPSJNMTkgM2gtMVYxaC0ydjJIOFYxSDZ2Mkg1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptLTcgM2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgMy0zLTEuMzQtMy0zIDEuMzQtMyAzLTN6bTYgMTJINnYtMWMwLTIgNC0zLjEgNi0zLjFzNiAxLjEgNiAzLjF2MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWRhdGEtc2V0dGluZyI+PHBhdGggZD0iTTE4Ljk5IDExLjVjLjM0IDAgLjY3LjAzIDEgLjA3TDIwIDAgMCAyMGgxMS41NmMtLjA0LS4zMy0uMDctLjY2LS4wNy0xIDAtNC4xNCAzLjM2LTcuNSA3LjUtNy41em0zLjcxIDcuOTljLjAyLS4xNi4wNC0uMzIuMDQtLjQ5IDAtLjE3LS4wMS0uMzMtLjA0LS40OWwxLjA2LS44M2MuMDktLjA4LjEyLS4yMS4wNi0uMzJsLTEtMS43M2MtLjA2LS4xMS0uMTktLjE1LS4zMS0uMTFsLTEuMjQuNWMtLjI2LS4yLS41NC0uMzctLjg1LS40OWwtLjE5LTEuMzJjLS4wMS0uMTItLjEyLS4yMS0uMjQtLjIxaC0yYy0uMTIgMC0uMjMuMDktLjI1LjIxbC0uMTkgMS4zMmMtLjMuMTMtLjU5LjI5LS44NS40OWwtMS4yNC0uNWMtLjExLS4wNC0uMjQgMC0uMzEuMTFsLTEgMS43M2MtLjA2LjExLS4wNC4yNC4wNi4zMmwxLjA2LjgzYy0uMDIuMTYtLjAzLjMyLS4wMy40OSAwIC4xNy4wMS4zMy4wMy40OWwtMS4wNi44M2MtLjA5LjA4LS4xMi4yMS0uMDYuMzJsMSAxLjczYy4wNi4xMS4xOS4xNS4zMS4xMWwxLjI0LS41Yy4yNi4yLjU0LjM3Ljg1LjQ5bC4xOSAxLjMyYy4wMi4xMi4xMi4yMS4yNS4yMWgyYy4xMiAwIC4yMy0uMDkuMjUtLjIxbC4xOS0xLjMyYy4zLS4xMy41OS0uMjkuODQtLjQ5bDEuMjUuNWMuMTEuMDQuMjQgMCAuMzEtLjExbDEtMS43M2MuMDYtLjExLjAzLS4yNC0uMDYtLjMybC0xLjA3LS44M3ptLTMuNzEgMS4wMWMtLjgzIDAtMS41LS42Ny0xLjUtMS41cy42Ny0xLjUgMS41LTEuNSAxLjUuNjcgMS41IDEuNS0uNjcgMS41LTEuNSAxLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1kZXZpY2UtaW5mb3JtYXRpb24iPjxwYXRoIGQ9Ik0xMyA3aC0ydjJoMlY3em0wIDRoLTJ2Nmgydi02em00LTkuOTlMNyAxYy0xLjEgMC0yIC45LTIgMnYxOGMwIDEuMS45IDIgMiAyaDEwYzEuMSAwIDItLjkgMi0yVjNjMC0xLjEtLjktMS45OS0yLTEuOTl6TTE3IDE5SDdWNWgxMHYxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLWlkZW50aXR5Ij48cGF0aCBkPSJNMTIgNS45YzEuMTYgMCAyLjEuOTQgMi4xIDIuMXMtLjk0IDIuMS0yLjEgMi4xUzkuOSA5LjE2IDkuOSA4cy45NC0yLjEgMi4xLTIuMW0wIDljMi45NyAwIDYuMSAxLjQ2IDYuMSAyLjF2MS4xSDUuOVYxN2MwLS42NCAzLjEzLTIuMSA2LjEtMi4xTTEyIDRDOS43OSA0IDggNS43OSA4IDhzMS43OSA0IDQgNCA0LTEuNzkgNC00LTEuNzktNC00LTR6bTAgOWMtMi42NyAwLTggMS4zNC04IDR2M2gxNnYtM2MwLTIuNjYtNS4zMy00LTgtNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLW1lZGlhIj48cGF0aCBkPSJNMiA2SDB2NWguMDFMMCAyMGMwIDEuMS45IDIgMiAyaDE4di0ySDJWNnptMjAtMmgtOGwtMi0ySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAxNmMwIDEuMS45IDIgMiAyaDE2YzEuMSAwIDItLjkgMi0yVjZjMC0xLjEtLjktMi0yLTJ6TTcgMTVsNC41LTYgMy41IDQuNTEgMi41LTMuMDFMMjEgMTVIN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwZXJtLXBob25lLW1zZyI+PHBhdGggZD0iTTIwIDE1LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xMiAzdjEwbDMtM2g2VjNoLTl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icGVybS1zY2FuLXdpZmkiPjxwYXRoIGQ9Ik0xMiAzQzYuOTUgMyAzLjE1IDQuODUgMCA3LjIzTDEyIDIyIDI0IDcuMjVDMjAuODUgNC44NyAxNy4wNSAzIDEyIDN6bTEgMTNoLTJ2LTZoMnY2em0tMi04VjZoMnYyaC0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBldHMiPjxjaXJjbGUgY3g9IjQuNSIgY3k9IjkuNSIgcj0iMi41Ij48L2NpcmNsZT48Y2lyY2xlIGN4PSI5IiBjeT0iNS41IiByPSIyLjUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE1IiBjeT0iNS41IiByPSIyLjUiPjwvY2lyY2xlPjxjaXJjbGUgY3g9IjE5LjUiIGN5PSI5LjUiIHI9IjIuNSI+PC9jaXJjbGU+PHBhdGggZD0iTTE3LjM0IDE0Ljg2Yy0uODctMS4wMi0xLjYtMS44OS0yLjQ4LTIuOTEtLjQ2LS41NC0xLjA1LTEuMDgtMS43NS0xLjMyLS4xMS0uMDQtLjIyLS4wNy0uMzMtLjA5LS4yNS0uMDQtLjUyLS4wNC0uNzgtLjA0cy0uNTMgMC0uNzkuMDVjLS4xMS4wMi0uMjIuMDUtLjMzLjA5LS43LjI0LTEuMjguNzgtMS43NSAxLjMyLS44NyAxLjAyLTEuNiAxLjg5LTIuNDggMi45MS0xLjMxIDEuMzEtMi45MiAyLjc2LTIuNjIgNC43OS4yOSAxLjAyIDEuMDIgMi4wMyAyLjMzIDIuMzIuNzMuMTUgMy4wNi0uNDQgNS41NC0uNDRoLjE4YzIuNDggMCA0LjgxLjU4IDUuNTQuNDQgMS4zMS0uMjkgMi4wNC0xLjMxIDIuMzMtMi4zMi4zMS0yLjA0LTEuMy0zLjQ5LTIuNjEtNC44eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBpY3R1cmUtaW4tcGljdHVyZSI+PHBhdGggZD0iTTE5IDdoLTh2Nmg4Vjd6bTItNEgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDEuOTggMiAxLjk4aDE4YzEuMSAwIDItLjg4IDItMS45OFY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OGgxOHYxNC4wM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJwaWN0dXJlLWluLXBpY3R1cmUtYWx0Ij48cGF0aCBkPSJNMTkgMTFoLTh2Nmg4di02em00IDhWNC45OEMyMyAzLjg4IDIyLjEgMyAyMSAzSDNjLTEuMSAwLTIgLjg4LTIgMS45OFYxOWMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0yem0tMiAuMDJIM1Y0Ljk3aDE4djE0LjA1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InBsYXktZm9yLXdvcmsiPjxwYXRoIGQ9Ik0xMSA1djUuNTlINy41bDQuNSA0LjUgNC41LTQuNUgxM1Y1aC0yem0tNSA5YzAgMy4zMSAyLjY5IDYgNiA2czYtMi42OSA2LTZoLTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRINnoiPjwvcGF0aD48L2c+CjxnIGlkPSJwb2x5bWVyIj48cGF0aCBkPSJNMTkgNGgtNEw3LjExIDE2LjYzIDQuNSAxMiA5IDRINUwuNSAxMiA1IDIwaDRsNy44OS0xMi42M0wxOS41IDEyIDE1IDIwaDRsNC41LTh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icG93ZXItc2V0dGluZ3MtbmV3Ij48cGF0aCBkPSJNMTMgM2gtMnYxMGgyVjN6bTQuODMgMi4xN2wtMS40MiAxLjQyQzE3Ljk5IDcuODYgMTkgOS44MSAxOSAxMmMwIDMuODctMy4xMyA3LTcgN3MtNy0zLjEzLTctN2MwLTIuMTkgMS4wMS00LjE0IDIuNTgtNS40Mkw2LjE3IDUuMTdDNC4yMyA2LjgyIDMgOS4yNiAzIDEyYzAgNC45NyA0LjAzIDkgOSA5czktNC4wMyA5LTljMC0yLjc0LTEuMjMtNS4xOC0zLjE3LTYuODN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icHJlZ25hbnQtd29tYW4iPjxwYXRoIGQ9Ik05IDRjMC0xLjExLjg5LTIgMi0yczIgLjg5IDIgMi0uODkgMi0yIDItMi0uODktMi0yem03IDljLS4wMS0xLjM0LS44My0yLjUxLTItMyAwLTEuNjYtMS4zNC0zLTMtM3MtMyAxLjM0LTMgM3Y3aDJ2NWgzdi01aDN2LTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icHJpbnQiPjxwYXRoIGQ9Ik0xOSA4SDVjLTEuNjYgMC0zIDEuMzQtMyAzdjZoNHY0aDEydi00aDR2LTZjMC0xLjY2LTEuMzQtMy0zLTN6bS0zIDExSDh2LTVoOHY1em0zLTdjLS41NSAwLTEtLjQ1LTEtMXMuNDUtMSAxLTEgMSAuNDUgMSAxLS40NSAxLTEgMXptLTEtOUg2djRoMTJWM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJxdWVyeS1idWlsZGVyIj48cGF0aCBkPSJNMTEuOTkgMkM2LjQ3IDIgMiA2LjQ4IDIgMTJzNC40NyAxMCA5Ljk5IDEwQzE3LjUyIDIyIDIyIDE3LjUyIDIyIDEyUzE3LjUyIDIgMTEuOTkgMnpNMTIgMjBjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4em0uNS0xM0gxMXY2bDUuMjUgMy4xNS43NS0xLjIzLTQuNS0yLjY3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InF1ZXN0aW9uLWFuc3dlciI+PHBhdGggZD0iTTIxIDZoLTJ2OUg2djJjMCAuNTUuNDUgMSAxIDFoMTFsNCA0VjdjMC0uNTUtLjQ1LTEtMS0xem0tNCA2VjNjMC0uNTUtLjQ1LTEtMS0xSDNjLS41NSAwLTEgLjQ1LTEgMXYxNGw0LTRoMTBjLjU1IDAgMS0uNDUgMS0xeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJhZGlvLWJ1dHRvbi1jaGVja2VkIj48cGF0aCBkPSJNMTIgN2MtMi43NiAwLTUgMi4yNC01IDVzMi4yNCA1IDUgNSA1LTIuMjQgNS01LTIuMjQtNS01LTV6bTAtNUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCI+PHBhdGggZD0iTTEyIDJDNi40OCAyIDIgNi40OCAyIDEyczQuNDggMTAgMTAgMTAgMTAtNC40OCAxMC0xMFMxNy41MiAyIDEyIDJ6bTAgMThjLTQuNDIgMC04LTMuNTgtOC04czMuNTgtOCA4LTggOCAzLjU4IDggOC0zLjU4IDgtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlY2VpcHQiPjxwYXRoIGQ9Ik0xOCAxN0g2di0yaDEydjJ6bTAtNEg2di0yaDEydjJ6bTAtNEg2VjdoMTJ2MnpNMyAyMmwxLjUtMS41TDYgMjJsMS41LTEuNUw5IDIybDEuNS0xLjVMMTIgMjJsMS41LTEuNUwxNSAyMmwxLjUtMS41TDE4IDIybDEuNS0xLjVMMjEgMjJWMmwtMS41IDEuNUwxOCAybC0xLjUgMS41TDE1IDJsLTEuNSAxLjVMMTIgMmwtMS41IDEuNUw5IDIgNy41IDMuNSA2IDIgNC41IDMuNSAzIDJ2MjB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVjb3JkLXZvaWNlLW92ZXIiPjxjaXJjbGUgY3g9IjkiIGN5PSI5IiByPSI0Ij48L2NpcmNsZT48cGF0aCBkPSJNOSAxNWMtMi42NyAwLTggMS4zNC04IDR2MmgxNnYtMmMwLTIuNjYtNS4zMy00LTgtNHptNy43Ni05LjY0bC0xLjY4IDEuNjljLjg0IDEuMTguODQgMi43MSAwIDMuODlsMS42OCAxLjY5YzIuMDItMi4wMiAyLjAyLTUuMDcgMC03LjI3ek0yMC4wNyAybC0xLjYzIDEuNjNjMi43NyAzLjAyIDIuNzcgNy41NiAwIDEwLjc0TDIwLjA3IDE2YzMuOS0zLjg5IDMuOTEtOS45NSAwLTE0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlZGVlbSI+PHBhdGggZD0iTTIwIDZoLTIuMThjLjExLS4zMS4xOC0uNjUuMTgtMSAwLTEuNjYtMS4zNC0zLTMtMy0xLjA1IDAtMS45Ni41NC0yLjUgMS4zNWwtLjUuNjctLjUtLjY4QzEwLjk2IDIuNTQgMTAuMDUgMiA5IDIgNy4zNCAyIDYgMy4zNCA2IDVjMCAuMzUuMDcuNjkuMTggMUg0Yy0xLjExIDAtMS45OS44OS0xLjk5IDJMMiAxOWMwIDEuMTEuODkgMiAyIDJoMTZjMS4xMSAwIDItLjg5IDItMlY4YzAtMS4xMS0uODktMi0yLTJ6bS01LTJjLjU1IDAgMSAuNDUgMSAxcy0uNDUgMS0xIDEtMS0uNDUtMS0xIC40NS0xIDEtMXpNOSA0Yy41NSAwIDEgLjQ1IDEgMXMtLjQ1IDEtMSAxLTEtLjQ1LTEtMSAuNDUtMSAxLTF6bTExIDE1SDR2LTJoMTZ2MnptMC01SDRWOGg1LjA4TDcgMTAuODMgOC42MiAxMiAxMSA4Ljc2bDEtMS4zNiAxIDEuMzZMMTUuMzggMTIgMTcgMTAuODMgMTQuOTIgOEgyMHY2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlZG8iPjxwYXRoIGQ9Ik0xOC40IDEwLjZDMTYuNTUgOC45OSAxNC4xNSA4IDExLjUgOGMtNC42NSAwLTguNTggMy4wMy05Ljk2IDcuMjJMMy45IDE2YzEuMDUtMy4xOSA0LjA1LTUuNSA3LjYtNS41IDEuOTUgMCAzLjczLjcyIDUuMTIgMS44OEwxMyAxNmg5VjdsLTMuNiAzLjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVmcmVzaCI+PHBhdGggZD0iTTE3LjY1IDYuMzVDMTYuMiA0LjkgMTQuMjEgNCAxMiA0Yy00LjQyIDAtNy45OSAzLjU4LTcuOTkgOHMzLjU3IDggNy45OSA4YzMuNzMgMCA2Ljg0LTIuNTUgNy43My02aC0yLjA4Yy0uODIgMi4zMy0zLjA0IDQtNS42NSA0LTMuMzEgMC02LTIuNjktNi02czIuNjktNiA2LTZjMS42NiAwIDMuMTQuNjkgNC4yMiAxLjc4TDEzIDExaDdWNGwtMi4zNSAyLjM1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InJlbW92ZSI+PHBhdGggZD0iTTE5IDEzSDV2LTJoMTR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZW1vdmUtY2lyY2xlIj48cGF0aCBkPSJNMTIgMkM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptNSAxMUg3di0yaDEwdjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVtb3ZlLWNpcmNsZS1vdXRsaW5lIj48cGF0aCBkPSJNNyAxMXYyaDEwdi0ySDd6bTUtOUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwUzE3LjUyIDIgMTIgMnptMCAxOGMtNC40MSAwLTgtMy41OS04LThzMy41OS04IDgtOCA4IDMuNTkgOCA4LTMuNTkgOC04IDh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVtb3ZlLXNob3BwaW5nLWNhcnQiPjxwYXRoIGQ9Ik0yMi43MyAyMi43M0wyLjc3IDIuNzcgMiAybC0uNzMtLjczTDAgMi41NGw0LjM5IDQuMzkgMi4yMSA0LjY2LTEuMzUgMi40NWMtLjE2LjI4LS4yNS42MS0uMjUuOTYgMCAxLjEuOSAyIDIgMmg3LjQ2bDEuMzggMS4zOGMtLjUuMzYtLjgzLjk1LS44MyAxLjYyIDAgMS4xLjg5IDIgMS45OSAyIC42NyAwIDEuMjYtLjMzIDEuNjItLjg0TDIxLjQ2IDI0bDEuMjctMS4yN3pNNy40MiAxNWMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDIuMzZsMiAySDcuNDJ6bTguMTMtMmMuNzUgMCAxLjQxLS40MSAxLjc1LTEuMDNsMy41OC02LjQ5Yy4wOC0uMTQuMTItLjMxLjEyLS40OCAwLS41NS0uNDUtMS0xLTFINi41NGw5LjAxIDl6TTcgMThjLTEuMSAwLTEuOTkuOS0xLjk5IDJTNS45IDIyIDcgMjJzMi0uOSAyLTItLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVvcmRlciI+PHBhdGggZD0iTTMgMTVoMTh2LTJIM3Yyem0wIDRoMTh2LTJIM3Yyem0wLThoMThWOUgzdjJ6bTAtNnYyaDE4VjVIM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXBseSI+PHBhdGggZD0iTTEwIDlWNWwtNyA3IDcgN3YtNC4xYzUgMCA4LjUgMS42IDExIDUuMS0xLTUtNC0xMC0xMS0xMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXBseS1hbGwiPjxwYXRoIGQ9Ik03IDhWNWwtNyA3IDcgN3YtM2wtNC00IDQtNHptNiAxVjVsLTcgNyA3IDd2LTQuMWM1IDAgOC41IDEuNiAxMSA1LjEtMS01LTQtMTAtMTEtMTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVwb3J0Ij48cGF0aCBkPSJNMTUuNzMgM0g4LjI3TDMgOC4yN3Y3LjQ2TDguMjcgMjFoNy40NkwyMSAxNS43M1Y4LjI3TDE1LjczIDN6TTEyIDE3LjNjLS43MiAwLTEuMy0uNTgtMS4zLTEuMyAwLS43Mi41OC0xLjMgMS4zLTEuMy43MiAwIDEuMy41OCAxLjMgMS4zIDAgLjcyLS41OCAxLjMtMS4zIDEuM3ptMS00LjNoLTJWN2gydjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVwb3J0LXByb2JsZW0iPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icmVzdG9yZSI+PHBhdGggZD0iTTEzIDNjLTQuOTcgMC05IDQuMDMtOSA5SDFsMy44OSAzLjg5LjA3LjE0TDkgMTJINmMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuOTMgMC0zLjY4LS43OS00Ljk0LTIuMDZsLTEuNDIgMS40MkM4LjI3IDE5Ljk5IDEwLjUxIDIxIDEzIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05em0tMSA1djVsNC4yOCAyLjU0LjcyLTEuMjEtMy41LTIuMDhWOEgxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJyZXN0b3JlLXBhZ2UiPjxwYXRoIGQ9Ik0xNCAySDZjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNCAyMGMwIDEuMS44OSAyIDEuOTkgMkgxOGMxLjEgMCAyLS45IDItMlY4bC02LTZ6bS0yIDE2Yy0yLjA1IDAtMy44MS0xLjI0LTQuNTgtM2gxLjcxYy42My45IDEuNjggMS41IDIuODcgMS41IDEuOTMgMCAzLjUtMS41NyAzLjUtMy41UzEzLjkzIDkuNSAxMiA5LjVjLTEuMzUgMC0yLjUyLjc4LTMuMSAxLjlsMS42IDEuNmgtNFY5bDEuMyAxLjNDOC42OSA4LjkyIDEwLjIzIDggMTIgOGMyLjc2IDAgNSAyLjI0IDUgNXMtMi4yNCA1LTUgNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJyb29tIj48cGF0aCBkPSJNMTIgMkM4LjEzIDIgNSA1LjEzIDUgOWMwIDUuMjUgNyAxMyA3IDEzczctNy43NSA3LTEzYzAtMy44Ny0zLjEzLTctNy03em0wIDkuNWMtMS4zOCAwLTIuNS0xLjEyLTIuNS0yLjVzMS4xMi0yLjUgMi41LTIuNSAyLjUgMS4xMiAyLjUgMi41LTEuMTIgMi41LTIuNSAyLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0icm91bmRlZC1jb3JuZXIiPjxwYXRoIGQ9Ik0xOSAxOWgydjJoLTJ2LTJ6bTAtMmgydi0yaC0ydjJ6TTMgMTNoMnYtMkgzdjJ6bTAgNGgydi0ySDN2MnptMC04aDJWN0gzdjJ6bTAtNGgyVjNIM3Yyem00IDBoMlYzSDd2MnptOCAxNmgydi0yaC0ydjJ6bS00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem0tOCAwaDJ2LTJIN3Yyem0tNCAwaDJ2LTJIM3Yyek0yMSA4YzAtMi43Ni0yLjI0LTUtNS01aC01djJoNWMxLjY1IDAgMyAxLjM1IDMgM3Y1aDJWOHoiPjwvcGF0aD48L2c+CjxnIGlkPSJyb3dpbmciPjxwYXRoIGQ9Ik04LjUgMTQuNUw0IDE5bDEuNSAxLjVMOSAxN2gybC0yLjUtMi41ek0xNSAxYy0xLjEgMC0yIC45LTIgMnMuOSAyIDIgMiAyLS45IDItMi0uOS0yLTItMnptNiAyMC4wMUwxOCAyNGwtMi45OS0zLjAxVjE5LjVsLTcuMS03LjA5Yy0uMzEuMDUtLjYxLjA3LS45MS4wN3YtMi4xNmMxLjY2LjAzIDMuNjEtLjg3IDQuNjctMi4wNGwxLjQtMS41NWMuMTktLjIxLjQzLS4zOC42OS0uNS4yOS0uMTQuNjItLjIzLjk2LS4yM2guMDNDMTUuOTkgNi4wMSAxNyA3LjAyIDE3IDguMjZ2NS43NWMwIC44NC0uMzUgMS42MS0uOTIgMi4xNmwtMy41OC0zLjU4di0yLjI3Yy0uNjMuNTItMS40MyAxLjAyLTIuMjkgMS4zOUwxNi41IDE4SDE4bDMgMy4wMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzYXZlIj48cGF0aCBkPSJNMTcgM0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWN2wtNC00em0tNSAxNmMtMS42NiAwLTMtMS4zNC0zLTNzMS4zNC0zIDMtMyAzIDEuMzQgMyAzLTEuMzQgMy0zIDN6bTMtMTBINVY1aDEwdjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2NoZWR1bGUiPjxwYXRoIGQ9Ik0xMS45OSAyQzYuNDcgMiAyIDYuNDggMiAxMnM0LjQ3IDEwIDkuOTkgMTBDMTcuNTIgMjIgMjIgMTcuNTIgMjIgMTJTMTcuNTIgMiAxMS45OSAyek0xMiAyMGMtNC40MiAwLTgtMy41OC04LThzMy41OC04IDgtOCA4IDMuNTggOCA4LTMuNTggOC04IDh6bS41LTEzSDExdjZsNS4yNSAzLjE1Ljc1LTEuMjMtNC41LTIuNjd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2VhcmNoIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZWxlY3QtYWxsIj48cGF0aCBkPSJNMyA1aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTAgOGgydi0ySDN2MnptNCA4aDJ2LTJIN3Yyek0zIDloMlY3SDN2MnptMTAtNmgtMnYyaDJWM3ptNiAwdjJoMmMwLTEuMS0uOS0yLTItMnpNNSAyMXYtMkgzYzAgMS4xLjkgMiAyIDJ6bS0yLTRoMnYtMkgzdjJ6TTkgM0g3djJoMlYzem0yIDE4aDJ2LTJoLTJ2MnptOC04aDJ2LTJoLTJ2MnptMCA4YzEuMSAwIDItLjkgMi0yaC0ydjJ6bTAtMTJoMlY3aC0ydjJ6bTAgOGgydi0yaC0ydjJ6bS00IDRoMnYtMmgtMnYyem0wLTE2aDJWM2gtMnYyek03IDE3aDEwVjdIN3YxMHptMi04aDZ2Nkg5Vjl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2VuZCI+PHBhdGggZD0iTTIuMDEgMjFMMjMgMTIgMi4wMSAzIDIgMTBsMTUgMi0xNSAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzIj48cGF0aCBkPSJNMTkuNDMgMTIuOThjLjA0LS4zMi4wNy0uNjQuMDctLjk4cy0uMDMtLjY2LS4wNy0uOThsMi4xMS0xLjY1Yy4xOS0uMTUuMjQtLjQyLjEyLS42NGwtMi0zLjQ2Yy0uMTItLjIyLS4zOS0uMy0uNjEtLjIybC0yLjQ5IDFjLS41Mi0uNC0xLjA4LS43My0xLjY5LS45OGwtLjM4LTIuNjVDMTQuNDYgMi4xOCAxNC4yNSAyIDE0IDJoLTRjLS4yNSAwLS40Ni4xOC0uNDkuNDJsLS4zOCAyLjY1Yy0uNjEuMjUtMS4xNy41OS0xLjY5Ljk4bC0yLjQ5LTFjLS4yMy0uMDktLjQ5IDAtLjYxLjIybC0yIDMuNDZjLS4xMy4yMi0uMDcuNDkuMTIuNjRsMi4xMSAxLjY1Yy0uMDQuMzItLjA3LjY1LS4wNy45OHMuMDMuNjYuMDcuOThsLTIuMTEgMS42NWMtLjE5LjE1LS4yNC40Mi0uMTIuNjRsMiAzLjQ2Yy4xMi4yMi4zOS4zLjYxLjIybDIuNDktMWMuNTIuNCAxLjA4LjczIDEuNjkuOThsLjM4IDIuNjVjLjAzLjI0LjI0LjQyLjQ5LjQyaDRjLjI1IDAgLjQ2LS4xOC40OS0uNDJsLjM4LTIuNjVjLjYxLS4yNSAxLjE3LS41OSAxLjY5LS45OGwyLjQ5IDFjLjIzLjA5LjQ5IDAgLjYxLS4yMmwyLTMuNDZjLjEyLS4yMi4wNy0uNDktLjEyLS42NGwtMi4xMS0xLjY1ek0xMiAxNS41Yy0xLjkzIDAtMy41LTEuNTctMy41LTMuNXMxLjU3LTMuNSAzLjUtMy41IDMuNSAxLjU3IDMuNSAzLjUtMS41NyAzLjUtMy41IDMuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1hcHBsaWNhdGlvbnMiPjxwYXRoIGQ9Ik0xMiAxMGMtMS4xIDAtMiAuOS0yIDJzLjkgMiAyIDIgMi0uOSAyLTItLjktMi0yLTJ6bTctN0g1Yy0xLjExIDAtMiAuOS0yIDJ2MTRjMCAxLjEuODkgMiAyIDJoMTRjMS4xMSAwIDItLjkgMi0yVjVjMC0xLjEtLjg5LTItMi0yem0tMS43NSA5YzAgLjIzLS4wMi40Ni0uMDUuNjhsMS40OCAxLjE2Yy4xMy4xMS4xNy4zLjA4LjQ1bC0xLjQgMi40MmMtLjA5LjE1LS4yNy4yMS0uNDMuMTVsLTEuNzQtLjdjLS4zNi4yOC0uNzYuNTEtMS4xOC42OWwtLjI2IDEuODVjLS4wMy4xNy0uMTguMy0uMzUuM2gtMi44Yy0uMTcgMC0uMzItLjEzLS4zNS0uMjlsLS4yNi0xLjg1Yy0uNDMtLjE4LS44Mi0uNDEtMS4xOC0uNjlsLTEuNzQuN2MtLjE2LjA2LS4zNCAwLS40My0uMTVsLTEuNC0yLjQyYy0uMDktLjE1LS4wNS0uMzQuMDgtLjQ1bDEuNDgtMS4xNmMtLjAzLS4yMy0uMDUtLjQ2LS4wNS0uNjkgMC0uMjMuMDItLjQ2LjA1LS42OGwtMS40OC0xLjE2Yy0uMTMtLjExLS4xNy0uMy0uMDgtLjQ1bDEuNC0yLjQyYy4wOS0uMTUuMjctLjIxLjQzLS4xNWwxLjc0LjdjLjM2LS4yOC43Ni0uNTEgMS4xOC0uNjlsLjI2LTEuODVjLjAzLS4xNy4xOC0uMy4zNS0uM2gyLjhjLjE3IDAgLjMyLjEzLjM1LjI5bC4yNiAxLjg1Yy40My4xOC44Mi40MSAxLjE4LjY5bDEuNzQtLjdjLjE2LS4wNi4zNCAwIC40My4xNWwxLjQgMi40MmMuMDkuMTUuMDUuMzQtLjA4LjQ1bC0xLjQ4IDEuMTZjLjAzLjIzLjA1LjQ2LjA1LjY5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJhY2t1cC1yZXN0b3JlIj48cGF0aCBkPSJNMTQgMTJjMC0xLjEtLjktMi0yLTJzLTIgLjktMiAyIC45IDIgMiAyIDItLjkgMi0yem0tMi05Yy00Ljk3IDAtOSA0LjAzLTkgOUgwbDQgNCA0LTRINWMwLTMuODcgMy4xMy03IDctN3M3IDMuMTMgNyA3LTMuMTMgNy03IDdjLTEuNTEgMC0yLjkxLS40OS00LjA2LTEuM2wtMS40MiAxLjQ0QzguMDQgMjAuMyA5Ljk0IDIxIDEyIDIxYzQuOTcgMCA5LTQuMDMgOS05cy00LjAzLTktOS05eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWJsdWV0b290aCI+PHBhdGggZD0iTTExIDI0aDJ2LTJoLTJ2MnptLTQgMGgydi0ySDd2MnptOCAwaDJ2LTJoLTJ2MnptMi43MS0xOC4yOUwxMiAwaC0xdjcuNTlMNi40MSAzIDUgNC40MSAxMC41OSAxMCA1IDE1LjU5IDYuNDEgMTcgMTEgMTIuNDFWMjBoMWw1LjcxLTUuNzEtNC4zLTQuMjkgNC4zLTQuMjl6TTEzIDMuODNsMS44OCAxLjg4TDEzIDcuNTlWMy44M3ptMS44OCAxMC40NkwxMyAxNi4xN3YtMy43NmwxLjg4IDEuODh6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtYnJpZ2h0bmVzcyI+PHBhdGggZD0iTTIxIDNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnpNOCAxNmgyLjVsMS41IDEuNSAxLjUtMS41SDE2di0yLjVsMS41LTEuNS0xLjUtMS41VjhoLTIuNUwxMiA2LjUgMTAuNSA4SDh2Mi41TDYuNSAxMiA4IDEzLjVWMTZ6bTQtN2MxLjY2IDAgMyAxLjM0IDMgM3MtMS4zNCAzLTMgM1Y5eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWNlbGwiPjxwYXRoIGQ9Ik03IDI0aDJ2LTJIN3Yyem00IDBoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyek0xNiAuMDFMOCAwQzYuOSAwIDYgLjkgNiAydjE2YzAgMS4xLjkgMiAyIDJoOGMxLjEgMCAyLS45IDItMlYyYzAtMS4xLS45LTEuOTktMi0xLjk5ek0xNiAxNkg4VjRoOHYxMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1ldGhlcm5ldCI+PHBhdGggZD0iTTcuNzcgNi43Nkw2LjIzIDUuNDguODIgMTJsNS40MSA2LjUyIDEuNTQtMS4yOEwzLjQyIDEybDQuMzUtNS4yNHpNNyAxM2gydi0ySDd2MnptMTAtMmgtMnYyaDJ2LTJ6bS02IDJoMnYtMmgtMnYyem02Ljc3LTcuNTJsLTEuNTQgMS4yOEwyMC41OCAxMmwtNC4zNSA1LjI0IDEuNTQgMS4yOEwyMy4xOCAxMmwtNS40MS02LjUyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWFudGVubmEiPjxwYXRoIGQ9Ik0xMiA1Yy0zLjg3IDAtNyAzLjEzLTcgN2gyYzAtMi43NiAyLjI0LTUgNS01czUgMi4yNCA1IDVoMmMwLTMuODctMy4xMy03LTctN3ptMSA5LjI5Yy44OC0uMzkgMS41LTEuMjYgMS41LTIuMjkgMC0xLjM4LTEuMTItMi41LTIuNS0yLjVTOS41IDEwLjYyIDkuNSAxMmMwIDEuMDIuNjIgMS45IDEuNSAyLjI5djMuM0w3LjU5IDIxIDkgMjIuNDFsMy0zIDMgM0wxNi40MSAyMSAxMyAxNy41OXYtMy4zek0xMiAxQzUuOTMgMSAxIDUuOTMgMSAxMmgyYzAtNC45NyA0LjAzLTkgOS05czkgNC4wMyA5IDloMmMwLTYuMDctNC45My0xMS0xMS0xMXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1jb21wb25lbnQiPjxwYXRoIGQ9Ik01IDJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NEgxdjZoNlY2SDVWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMkg5djJ6bS04IDBjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4QzYuMTYgMTguNCA3IDE3LjMgNyAxNnYtMkgxdjJ6TTIxIDZWMmMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0aC0ydjZoNlY2aC0yem0tOC00YzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIOXY2aDZWNmgtMlYyem00IDE0YzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOGMxLjE2LS40MSAyLTEuNTEgMi0yLjgydi0yaC02djJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic2V0dGluZ3MtaW5wdXQtY29tcG9zaXRlIj48cGF0aCBkPSJNNSAyYzAtLjU1LS40NS0xLTEtMXMtMSAuNDUtMSAxdjRIMXY2aDZWNkg1VjJ6bTQgMTRjMCAxLjMuODQgMi40IDIgMi44MlYyM2gydi00LjE4YzEuMTYtLjQxIDItMS41MSAyLTIuODJ2LTJIOXYyem0tOCAwYzAgMS4zLjg0IDIuNCAyIDIuODJWMjNoMnYtNC4xOEM2LjE2IDE4LjQgNyAxNy4zIDcgMTZ2LTJIMXYyek0yMSA2VjJjMC0uNTUtLjQ1LTEtMS0xcy0xIC40NS0xIDF2NGgtMnY2aDZWNmgtMnptLTgtNGMwLS41NS0uNDUtMS0xLTFzLTEgLjQ1LTEgMXY0SDl2Nmg2VjZoLTJWMnptNCAxNGMwIDEuMy44NCAyLjQgMiAyLjgyVjIzaDJ2LTQuMThjMS4xNi0uNDEgMi0xLjUxIDItMi44MnYtMmgtNnYyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLWlucHV0LWhkbWkiPjxwYXRoIGQ9Ik0xOCA3VjRjMC0xLjEtLjktMi0yLTJIOGMtMS4xIDAtMiAuOS0yIDJ2M0g1djZsMyA2djNoOHYtM2wzLTZWN2gtMXpNOCA0aDh2M2gtMlY1aC0xdjJoLTJWNWgtMXYySDhWNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1pbnB1dC1zdmlkZW8iPjxwYXRoIGQ9Ik04IDExLjVjMC0uODMtLjY3LTEuNS0xLjUtMS41UzUgMTAuNjcgNSAxMS41IDUuNjcgMTMgNi41IDEzIDggMTIuMzMgOCAxMS41em03LTVjMC0uODMtLjY3LTEuNS0xLjUtMS41aC0zQzkuNjcgNSA5IDUuNjcgOSA2LjVTOS42NyA4IDEwLjUgOGgzYy44MyAwIDEuNS0uNjcgMS41LTEuNXpNOC41IDE1Yy0uODMgMC0xLjUuNjctMS41IDEuNVM3LjY3IDE4IDguNSAxOHMxLjUtLjY3IDEuNS0xLjVTOS4zMyAxNSA4LjUgMTV6TTEyIDFDNS45MyAxIDEgNS45MyAxIDEyczQuOTMgMTEgMTEgMTEgMTEtNC45MyAxMS0xMVMxOC4wNyAxIDEyIDF6bTAgMjBjLTQuOTYgMC05LTQuMDQtOS05czQuMDQtOSA5LTkgOSA0LjA0IDkgOS00LjA0IDktOSA5em01LjUtMTFjLS44MyAwLTEuNS42Ny0xLjUgMS41cy42NyAxLjUgMS41IDEuNSAxLjUtLjY3IDEuNS0xLjUtLjY3LTEuNS0xLjUtMS41em0tMiA1Yy0uODMgMC0xLjUuNjctMS41IDEuNXMuNjcgMS41IDEuNSAxLjUgMS41LS42NyAxLjUtMS41LS42Ny0xLjUtMS41LTEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1vdmVyc2NhbiI+PHBhdGggZD0iTTEyLjAxIDUuNUwxMCA4aDRsLTEuOTktMi41ek0xOCAxMHY0bDIuNS0xLjk5TDE4IDEwek02IDEwbC0yLjUgMi4wMUw2IDE0di00em04IDZoLTRsMi4wMSAyLjVMMTQgMTZ6bTctMTNIM2MtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxOGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yem0wIDE2LjAxSDNWNC45OWgxOHYxNC4wMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1waG9uZSI+PHBhdGggZD0iTTEzIDloLTJ2MmgyVjl6bTQgMGgtMnYyaDJWOXptMyA2LjVjLTEuMjUgMC0yLjQ1LS4yLTMuNTctLjU3LS4zNS0uMTEtLjc0LS4wMy0xLjAyLjI0bC0yLjIgMi4yYy0yLjgzLTEuNDQtNS4xNS0zLjc1LTYuNTktNi41OGwyLjItMi4yMWMuMjgtLjI3LjM2LS42Ni4yNS0xLjAxQzguNyA2LjQ1IDguNSA1LjI1IDguNSA0YzAtLjU1LS40NS0xLTEtMUg0Yy0uNTUgMC0xIC40NS0xIDEgMCA5LjM5IDcuNjEgMTcgMTcgMTcgLjU1IDAgMS0uNDUgMS0xdi0zLjVjMC0uNTUtLjQ1LTEtMS0xek0xOSA5djJoMlY5aC0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLXBvd2VyIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNCAwaDJ2LTJoLTJ2MnptMi0yMmgtMnYxMGgyVjJ6bTMuNTYgMi40NGwtMS40NSAxLjQ1QzE2Ljg0IDYuOTQgMTggOC44MyAxOCAxMWMwIDMuMzEtMi42OSA2LTYgNnMtNi0yLjY5LTYtNmMwLTIuMTcgMS4xNi00LjA2IDIuODgtNS4xMkw3LjQ0IDQuNDRDNS4zNiA1Ljg4IDQgOC4yOCA0IDExYzAgNC40MiAzLjU4IDggOCA4czgtMy41OCA4LThjMC0yLjcyLTEuMzYtNS4xMi0zLjQ0LTYuNTZ6TTE1IDI0aDJ2LTJoLTJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzZXR0aW5ncy1yZW1vdGUiPjxwYXRoIGQ9Ik0xNSA5SDljLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWg2Yy41NSAwIDEtLjQ1IDEtMVYxMGMwLS41NS0uNDUtMS0xLTF6bS0zIDZjLTEuMSAwLTItLjktMi0ycy45LTIgMi0yIDIgLjkgMiAyLS45IDItMiAyek03LjA1IDYuMDVsMS40MSAxLjQxQzkuMzcgNi41NiAxMC42MiA2IDEyIDZzMi42My41NiAzLjU0IDEuNDZsMS40MS0xLjQxQzE1LjY4IDQuNzggMTMuOTMgNCAxMiA0cy0zLjY4Ljc4LTQuOTUgMi4wNXpNMTIgMEM4Ljk2IDAgNi4yMSAxLjIzIDQuMjIgMy4yMmwxLjQxIDEuNDFDNy4yNiAzLjAxIDkuNTEgMiAxMiAyczQuNzQgMS4wMSA2LjM2IDIuNjRsMS40MS0xLjQxQzE3Ljc5IDEuMjMgMTUuMDQgMCAxMiAweiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNldHRpbmdzLXZvaWNlIj48cGF0aCBkPSJNNyAyNGgydi0ySDd2MnptNS0xMWMxLjY2IDAgMi45OS0xLjM0IDIuOTktM0wxNSA0YzAtMS42Ni0xLjM0LTMtMy0zUzkgMi4zNCA5IDR2NmMwIDEuNjYgMS4zNCAzIDMgM3ptLTEgMTFoMnYtMmgtMnYyem00IDBoMnYtMmgtMnYyem00LTE0aC0xLjdjMCAzLTIuNTQgNS4xLTUuMyA1LjFTNi43IDEzIDYuNyAxMEg1YzAgMy40MSAyLjcyIDYuMjMgNiA2LjcyVjIwaDJ2LTMuMjhjMy4yOC0uNDkgNi0zLjMxIDYtNi43MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzaG9wIj48cGF0aCBkPSJNMTYgNlY0YzAtMS4xMS0uODktMi0yLTJoLTRjLTEuMTEgMC0yIC44OS0yIDJ2MkgydjEzYzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjZoLTZ6bS02LTJoNHYyaC00VjR6TTkgMThWOWw3LjUgNEw5IDE4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNob3AtdHdvIj48cGF0aCBkPSJNMyA5SDF2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJIM1Y5em0xNS00VjNjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDV2MTFjMCAxLjExLjg5IDIgMiAyaDE0YzEuMTEgMCAyLS44OSAyLTJWNWgtNXptLTYtMmg0djJoLTRWM3ptMCAxMlY4bDUuNSAzLTUuNSA0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNob3BwaW5nLWJhc2tldCI+PHBhdGggZD0iTTE3LjIxIDlsLTQuMzgtNi41NmMtLjE5LS4yOC0uNTEtLjQyLS44My0uNDItLjMyIDAtLjY0LjE0LS44My40M0w2Ljc5IDlIMmMtLjU1IDAtMSAuNDUtMSAxIDAgLjA5LjAxLjE4LjA0LjI3bDIuNTQgOS4yN2MuMjMuODQgMSAxLjQ2IDEuOTIgMS40NmgxM2MuOTIgMCAxLjY5LS42MiAxLjkzLTEuNDZsMi41NC05LjI3TDIzIDEwYzAtLjU1LS40NS0xLTEtMWgtNC43OXpNOSA5bDMtNC40TDE1IDlIOXptMyA4Yy0xLjEgMC0yLS45LTItMnMuOS0yIDItMiAyIC45IDIgMi0uOSAyLTIgMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzaG9wcGluZy1jYXJ0Ij48cGF0aCBkPSJNNyAxOGMtMS4xIDAtMS45OS45LTEuOTkgMlM1LjkgMjIgNyAyMnMyLS45IDItMi0uOS0yLTItMnpNMSAydjJoMmwzLjYgNy41OS0xLjM1IDIuNDVjLS4xNi4yOC0uMjUuNjEtLjI1Ljk2IDAgMS4xLjkgMiAyIDJoMTJ2LTJINy40MmMtLjE0IDAtLjI1LS4xMS0uMjUtLjI1bC4wMy0uMTIuOS0xLjYzaDcuNDVjLjc1IDAgMS40MS0uNDEgMS43NS0xLjAzbDMuNTgtNi40OWMuMDgtLjE0LjEyLS4zMS4xMi0uNDggMC0uNTUtLjQ1LTEtMS0xSDUuMjFsLS45NC0ySDF6bTE2IDE2Yy0xLjEgMC0xLjk5LjktMS45OSAycy44OSAyIDEuOTkgMiAyLS45IDItMi0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzb3J0Ij48cGF0aCBkPSJNMyAxOGg2di0ySDN2MnpNMyA2djJoMThWNkgzem0wIDdoMTJ2LTJIM3YyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InNwZWFrZXItbm90ZXMiPjxwYXRoIGQ9Ik0yMCAySDRjLTEuMSAwLTEuOTkuOS0xLjk5IDJMMiAyMmw0LTRoMTRjMS4xIDAgMi0uOSAyLTJWNGMwLTEuMS0uOS0yLTItMnpNOCAxNEg2di0yaDJ2MnptMC0zSDZWOWgydjJ6bTAtM0g2VjZoMnYyem03IDZoLTV2LTJoNXYyem0zLTNoLThWOWg4djJ6bTAtM2gtOFY2aDh2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJzcGVha2VyLW5vdGVzLW9mZiI+PHBhdGggZD0iTTEwLjU0IDExbC0uNTQtLjU0TDcuNTQgOCA2IDYuNDYgMi4zOCAyLjg0IDEuMjcgMS43MyAwIDNsMi4wMSAyLjAxTDIgMjJsNC00aDlsNS43MyA1LjczTDIyIDIyLjQ2IDE3LjU0IDE4bC03LTd6TTggMTRINnYtMmgydjJ6bS0yLTNWOWwyIDJINnptMTQtOUg0LjA4TDEwIDcuOTJWNmg4djJoLTcuOTJsMSAxSDE4djJoLTQuOTJsNi45OSA2Ljk5QzIxLjE0IDE3Ljk1IDIyIDE3LjA4IDIyIDE2VjRjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3BlbGxjaGVjayI+PHBhdGggZD0iTTEyLjQ1IDE2aDIuMDlMOS40MyAzSDcuNTdMMi40NiAxNmgyLjA5bDEuMTItM2g1LjY0bDEuMTQgM3ptLTYuMDItNUw4LjUgNS40OCAxMC41NyAxMUg2LjQzem0xNS4xNi41OWwtOC4wOSA4LjA5TDkuODMgMTZsLTEuNDEgMS40MSA1LjA5IDUuMDlMMjMgMTNsLTEuNDEtMS40MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdGFyIj48cGF0aCBkPSJNMTIgMTcuMjdMMTguMTggMjFsLTEuNjQtNy4wM0wyMiA5LjI0bC03LjE5LS42MUwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3Rhci1ib3JkZXIiPjxwYXRoIGQ9Ik0yMiA5LjI0bC03LjE5LS42MkwxMiAyIDkuMTkgOC42MyAyIDkuMjRsNS40NiA0LjczTDUuODIgMjEgMTIgMTcuMjcgMTguMTggMjFsLTEuNjMtNy4wM0wyMiA5LjI0ek0xMiAxNS40bC0zLjc2IDIuMjcgMS00LjI4LTMuMzItMi44OCA0LjM4LS4zOEwxMiA2LjFsMS43MSA0LjA0IDQuMzguMzgtMy4zMiAyLjg4IDEgNC4yOEwxMiAxNS40eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0YXItaGFsZiI+PHBhdGggZD0iTTIyIDkuMjRsLTcuMTktLjYyTDEyIDIgOS4xOSA4LjYzIDIgOS4yNGw1LjQ2IDQuNzNMNS44MiAyMSAxMiAxNy4yNyAxOC4xOCAyMWwtMS42My03LjAzTDIyIDkuMjR6TTEyIDE1LjRWNi4xbDEuNzEgNC4wNCA0LjM4LjM4LTMuMzIgMi44OCAxIDQuMjhMMTIgMTUuNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdGFycyI+PHBhdGggZD0iTTExLjk5IDJDNi40NyAyIDIgNi40OCAyIDEyczQuNDcgMTAgOS45OSAxMEMxNy41MiAyMiAyMiAxNy41MiAyMiAxMlMxNy41MiAyIDExLjk5IDJ6bTQuMjQgMTZMMTIgMTUuNDUgNy43NyAxOGwxLjEyLTQuODEtMy43My0zLjIzIDQuOTItLjQyTDEyIDVsMS45MiA0LjUzIDQuOTIuNDItMy43MyAzLjIzTDE2LjIzIDE4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN0b3JlIj48cGF0aCBkPSJNMjAgNEg0djJoMTZWNHptMSAxMHYtMmwtMS01SDRsLTEgNXYyaDF2NmgxMHYtNmg0djZoMnYtNmgxem0tOSA0SDZ2LTRoNnY0eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN1YmRpcmVjdG9yeS1hcnJvdy1sZWZ0Ij48cGF0aCBkPSJNMTEgOWwxLjQyIDEuNDJMOC44MyAxNEgxOFY0aDJ2MTJIOC44M2wzLjU5IDMuNThMMTEgMjFsLTYtNiA2LTZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3ViZGlyZWN0b3J5LWFycm93LXJpZ2h0Ij48cGF0aCBkPSJNMTkgMTVsLTYgNi0xLjQyLTEuNDJMMTUuMTcgMTZINFY0aDJ2MTBoOS4xN2wtMy41OS0zLjU4TDEzIDlsNiA2eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN1YmplY3QiPjxwYXRoIGQ9Ik0xNCAxN0g0djJoMTB2LTJ6bTYtOEg0djJoMTZWOXpNNCAxNWgxNnYtMkg0djJ6TTQgNXYyaDE2VjVINHoiPjwvcGF0aD48L2c+CjxnIGlkPSJzdXBlcnZpc29yLWFjY291bnQiPjxwYXRoIGQ9Ik0xNi41IDEyYzEuMzggMCAyLjQ5LTEuMTIgMi40OS0yLjVTMTcuODggNyAxNi41IDdDMTUuMTIgNyAxNCA4LjEyIDE0IDkuNXMxLjEyIDIuNSAyLjUgMi41ek05IDExYzEuNjYgMCAyLjk5LTEuMzQgMi45OS0zUzEwLjY2IDUgOSA1QzcuMzQgNSA2IDYuMzQgNiA4czEuMzQgMyAzIDN6bTcuNSAzYy0xLjgzIDAtNS41LjkyLTUuNSAyLjc1VjE5aDExdi0yLjI1YzAtMS44My0zLjY3LTIuNzUtNS41LTIuNzV6TTkgMTNjLTIuMzMgMC03IDEuMTctNyAzLjVWMTloN3YtMi4yNWMwLS44NS4zMy0yLjM0IDIuMzctMy40N0MxMC41IDEzLjEgOS42NiAxMyA5IDEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InN3YXAtaG9yaXoiPjxwYXRoIGQ9Ik02Ljk5IDExTDMgMTVsMy45OSA0di0zSDE0di0ySDYuOTl2LTN6TTIxIDlsLTMuOTktNHYzSDEwdjJoNy4wMXYzTDIxIDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0Ij48cGF0aCBkPSJNMTYgMTcuMDFWMTBoLTJ2Ny4wMWgtM0wxNSAyMWw0LTMuOTloLTN6TTkgM0w1IDYuOTloM1YxNGgyVjYuOTloM0w5IDN6Ij48L3BhdGg+PC9nPgo8ZyBpZD0ic3dhcC12ZXJ0aWNhbC1jaXJjbGUiPjxwYXRoIGQ9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyek02LjUgOUwxMCA1LjUgMTMuNSA5SDExdjRIOVY5SDYuNXptMTEgNkwxNCAxOC41IDEwLjUgMTVIMTN2LTRoMnY0aDIuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJzeXN0ZW0tdXBkYXRlLWFsdCI+PHBhdGggZD0iTTEyIDE2LjVsNC00aC0zdi05aC0ydjlIOGw0IDR6bTktMTNoLTZ2MS45OWg2djE0LjAzSDNWNS40OWg2VjMuNUgzYy0xLjEgMC0yIC45LTIgMnYxNGMwIDEuMS45IDIgMiAyaDE4YzEuMSAwIDItLjkgMi0ydi0xNGMwLTEuMS0uOS0yLTItMnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0YWIiPjxwYXRoIGQ9Ik0yMSAzSDNjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkgzVjVoMTB2NGg4djEweiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRhYi11bnNlbGVjdGVkIj48cGF0aCBkPSJNMSA5aDJWN0gxdjJ6bTAgNGgydi0ySDF2MnptMC04aDJWM2MtMS4xIDAtMiAuOS0yIDJ6bTggMTZoMnYtMkg5djJ6bS04LTRoMnYtMkgxdjJ6bTIgNHYtMkgxYzAgMS4xLjkgMiAyIDJ6TTIxIDNoLTh2NmgxMFY1YzAtMS4xLS45LTItMi0yem0wIDE0aDJ2LTJoLTJ2MnpNOSA1aDJWM0g5djJ6TTUgMjFoMnYtMkg1djJ6TTUgNWgyVjNINXYyem0xNiAxNmMxLjEgMCAyLS45IDItMmgtMnYyem0wLThoMnYtMmgtMnYyem0tOCA4aDJ2LTJoLTJ2MnptNCAwaDJ2LTJoLTJ2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0ZXh0LWZvcm1hdCI+PHBhdGggZD0iTTUgMTd2MmgxNHYtMkg1em00LjUtNC4yaDVsLjkgMi4yaDIuMUwxMi43NSA0aC0xLjVMNi41IDE1aDIuMWwuOS0yLjJ6TTEyIDUuOThMMTMuODcgMTFoLTMuNzRMMTIgNS45OHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aGVhdGVycyI+PHBhdGggZD0iTTE4IDN2MmgtMlYzSDh2Mkg2VjNINHYxOGgydi0yaDJ2Mmg4di0yaDJ2MmgyVjNoLTJ6TTggMTdINnYtMmgydjJ6bTAtNEg2di0yaDJ2MnptMC00SDZWN2gydjJ6bTEwIDhoLTJ2LTJoMnYyem0wLTRoLTJ2LTJoMnYyem0wLTRoLTJWN2gydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGh1bWItZG93biI+PHBhdGggZD0iTTE1IDNINmMtLjgzIDAtMS41NC41LTEuODQgMS4yMmwtMy4wMiA3LjA1Yy0uMDkuMjMtLjE0LjQ3LS4xNC43M3YxLjkxbC4wMS4wMUwxIDE0YzAgMS4xLjkgMiAyIDJoNi4zMWwtLjk1IDQuNTctLjAzLjMyYzAgLjQxLjE3Ljc5LjQ0IDEuMDZMOS44MyAyM2w2LjU5LTYuNTljLjM2LS4zNi41OC0uODYuNTgtMS40MVY1YzAtMS4xLS45LTItMi0yem00IDB2MTJoNFYzaC00eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRodW1iLXVwIj48cGF0aCBkPSJNMSAyMWg0VjlIMXYxMnptMjItMTFjMC0xLjEtLjktMi0yLTJoLTYuMzFsLjk1LTQuNTcuMDMtLjMyYzAtLjQxLS4xNy0uNzktLjQ0LTEuMDZMMTQuMTcgMSA3LjU5IDcuNTlDNy4yMiA3Ljk1IDcgOC40NSA3IDl2MTBjMCAxLjEuOSAyIDIgMmg5Yy44MyAwIDEuNTQtLjUgMS44NC0xLjIybDMuMDItNy4wNWMuMDktLjIzLjE0LS40Ny4xNC0uNzN2LTEuOTFsLS4wMS0uMDFMMjMgMTB6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idGh1bWJzLXVwLWRvd24iPjxwYXRoIGQ9Ik0xMiA2YzAtLjU1LS40NS0xLTEtMUg1LjgybC42Ni0zLjE4LjAyLS4yM2MwLS4zMS0uMTMtLjU5LS4zMy0uOEw1LjM4IDAgLjQ0IDQuOTRDLjE3IDUuMjEgMCA1LjU5IDAgNnY2LjVjMCAuODMuNjcgMS41IDEuNSAxLjVoNi43NWMuNjIgMCAxLjE1LS4zOCAxLjM4LS45MWwyLjI2LTUuMjljLjA3LS4xNy4xMS0uMzYuMTEtLjU1VjZ6bTEwLjUgNGgtNi43NWMtLjYyIDAtMS4xNS4zOC0xLjM4LjkxbC0yLjI2IDUuMjljLS4wNy4xNy0uMTEuMzYtLjExLjU1VjE4YzAgLjU1LjQ1IDEgMSAxaDUuMThsLS42NiAzLjE4LS4wMi4yNGMwIC4zMS4xMy41OS4zMy44bC43OS43OCA0Ljk0LTQuOTRjLjI3LS4yNy40NC0uNjUuNDQtMS4wNnYtNi41YzAtLjgzLS42Ny0xLjUtMS41LTEuNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0aW1lbGluZSI+PHBhdGggZD0iTTIzIDhjMCAxLjEtLjkgMi0yIDItLjE4IDAtLjM1LS4wMi0uNTEtLjA3bC0zLjU2IDMuNTVjLjA1LjE2LjA3LjM0LjA3LjUyIDAgMS4xLS45IDItMiAycy0yLS45LTItMmMwLS4xOC4wMi0uMzYuMDctLjUybC0yLjU1LTIuNTVjLS4xNi4wNS0uMzQuMDctLjUyLjA3cy0uMzYtLjAyLS41Mi0uMDdsLTQuNTUgNC41NmMuMDUuMTYuMDcuMzMuMDcuNTEgMCAxLjEtLjkgMi0yIDJzLTItLjktMi0yIC45LTIgMi0yYy4xOCAwIC4zNS4wMi41MS4wN2w0LjU2LTQuNTVDOC4wMiA5LjM2IDggOS4xOCA4IDljMC0xLjEuOS0yIDItMnMyIC45IDIgMmMwIC4xOC0uMDIuMzYtLjA3LjUybDIuNTUgMi41NWMuMTYtLjA1LjM0LS4wNy41Mi0uMDdzLjM2LjAyLjUyLjA3bDMuNTUtMy41NkMxOS4wMiA4LjM1IDE5IDguMTggMTkgOGMwLTEuMS45LTIgMi0yczIgLjkgMiAyeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRvYyI+PHBhdGggZD0iTTMgOWgxNFY3SDN2MnptMCA0aDE0di0ySDN2MnptMCA0aDE0di0ySDN2MnptMTYgMGgydi0yaC0ydjJ6bTAtMTB2MmgyVjdoLTJ6bTAgNmgydi0yaC0ydjJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG9kYXkiPjxwYXRoIGQ9Ik0xOSAzaC0xVjFoLTJ2Mkg4VjFINnYySDVjLTEuMTEgMC0xLjk5LjktMS45OSAyTDMgMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnptMCAxNkg1VjhoMTR2MTF6TTcgMTBoNXY1SDd6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idG9sbCI+PHBhdGggZD0iTTE1IDRjLTQuNDIgMC04IDMuNTgtOCA4czMuNTggOCA4IDggOC0zLjU4IDgtOC0zLjU4LTgtOC04em0wIDE0Yy0zLjMxIDAtNi0yLjY5LTYtNnMyLjY5LTYgNi02IDYgMi42OSA2IDYtMi42OSA2LTYgNnpNMyAxMmMwLTIuNjEgMS42Ny00LjgzIDQtNS42NVY0LjI2QzMuNTUgNS4xNSAxIDguMjcgMSAxMnMyLjU1IDYuODUgNiA3Ljc0di0yLjA5Yy0yLjMzLS44Mi00LTMuMDQtNC01LjY1eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRvdWNoLWFwcCI+PHBhdGggZD0iTTkgMTEuMjRWNy41QzkgNi4xMiAxMC4xMiA1IDExLjUgNVMxNCA2LjEyIDE0IDcuNXYzLjc0YzEuMjEtLjgxIDItMi4xOCAyLTMuNzRDMTYgNS4wMSAxMy45OSAzIDExLjUgM1M3IDUuMDEgNyA3LjVjMCAxLjU2Ljc5IDIuOTMgMiAzLjc0em05Ljg0IDQuNjNsLTQuNTQtMi4yNmMtLjE3LS4wNy0uMzUtLjExLS41NC0uMTFIMTN2LTZjMC0uODMtLjY3LTEuNS0xLjUtMS41UzEwIDYuNjcgMTAgNy41djEwLjc0bC0zLjQzLS43MmMtLjA4LS4wMS0uMTUtLjAzLS4yNC0uMDMtLjMxIDAtLjU5LjEzLS43OS4zM2wtLjc5LjggNC45NCA0Ljk0Yy4yNy4yNy42NS40NCAxLjA2LjQ0aDYuNzljLjc1IDAgMS4zMy0uNTUgMS40NC0xLjI4bC43NS01LjI3Yy4wMS0uMDcuMDItLjE0LjAyLS4yIDAtLjYyLS4zOC0xLjE2LS45MS0xLjM4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyYWNrLWNoYW5nZXMiPjxwYXRoIGQ9Ik0xOS4wNyA0LjkzbC0xLjQxIDEuNDFDMTkuMSA3Ljc5IDIwIDkuNzkgMjAgMTJjMCA0LjQyLTMuNTggOC04IDhzLTgtMy41OC04LThjMC00LjA4IDMuMDUtNy40NCA3LTcuOTN2Mi4wMkM4LjE2IDYuNTcgNiA5LjAzIDYgMTJjMCAzLjMxIDIuNjkgNiA2IDZzNi0yLjY5IDYtNmMwLTEuNjYtLjY3LTMuMTYtMS43Ni00LjI0bC0xLjQxIDEuNDFDMTUuNTUgOS45IDE2IDEwLjkgMTYgMTJjMCAyLjIxLTEuNzkgNC00IDRzLTQtMS43OS00LTRjMC0xLjg2IDEuMjgtMy40MSAzLTMuODZ2Mi4xNGMtLjYuMzUtMSAuOTgtMSAxLjcyIDAgMS4xLjkgMiAyIDJzMi0uOSAyLTJjMC0uNzQtLjQtMS4zOC0xLTEuNzJWMmgtMUM2LjQ4IDIgMiA2LjQ4IDIgMTJzNC40OCAxMCAxMCAxMCAxMC00LjQ4IDEwLTEwYzAtMi43Ni0xLjEyLTUuMjYtMi45My03LjA3eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InRyYW5zbGF0ZSI+PHBhdGggZD0iTTEyLjg3IDE1LjA3bC0yLjU0LTIuNTEuMDMtLjAzYzEuNzQtMS45NCAyLjk4LTQuMTcgMy43MS02LjUzSDE3VjRoLTdWMkg4djJIMXYxLjk5aDExLjE3QzExLjUgNy45MiAxMC40NCA5Ljc1IDkgMTEuMzUgOC4wNyAxMC4zMiA3LjMgOS4xOSA2LjY5IDhoLTJjLjczIDEuNjMgMS43MyAzLjE3IDIuOTggNC41NmwtNS4wOSA1LjAyTDQgMTlsNS01IDMuMTEgMy4xMS43Ni0yLjA0ek0xOC41IDEwaC0yTDEyIDIyaDJsMS4xMi0zaDQuNzVMMjEgMjJoMmwtNC41LTEyem0tMi42MiA3bDEuNjItNC4zM0wxOS4xMiAxN2gtMy4yNHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmVuZGluZy1kb3duIj48cGF0aCBkPSJNMTYgMThsMi4yOS0yLjI5LTQuODgtNC44OC00IDRMMiA3LjQxIDMuNDEgNmw2IDYgNC00IDYuMyA2LjI5TDIyIDEydjZ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHJlbmRpbmctZmxhdCI+PHBhdGggZD0iTTIyIDEybC00LTR2M0gzdjJoMTV2M3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ0cmVuZGluZy11cCI+PHBhdGggZD0iTTE2IDZsMi4yOSAyLjI5LTQuODggNC44OC00LTRMMiAxNi41OSAzLjQxIDE4bDYtNiA0IDQgNi4zLTYuMjlMMjIgMTJWNnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ0dXJuZWQtaW4iPjxwYXRoIGQ9Ik0xNyAzSDdjLTEuMSAwLTEuOTkuOS0xLjk5IDJMNSAyMWw3LTMgNyAzVjVjMC0xLjEtLjktMi0yLTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idHVybmVkLWluLW5vdCI+PHBhdGggZD0iTTE3IDNIN2MtMS4xIDAtMS45OS45LTEuOTkgMkw1IDIxbDctMyA3IDNWNWMwLTEuMS0uOS0yLTItMnptMCAxNWwtNS0yLjE4TDcgMThWNWgxMHYxM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ1bmFyY2hpdmUiPjxwYXRoIGQ9Ik0yMC41NSA1LjIybC0xLjM5LTEuNjhDMTguODggMy4yMSAxOC40NyAzIDE4IDNINmMtLjQ3IDAtLjg4LjIxLTEuMTUuNTVMMy40NiA1LjIyQzMuMTcgNS41NyAzIDYuMDEgMyA2LjVWMTljMCAxLjEuODkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNi41YzAtLjQ5LS4xNy0uOTMtLjQ1LTEuMjh6TTEyIDkuNWw1LjUgNS41SDE0djJoLTR2LTJINi41TDEyIDkuNXpNNS4xMiA1bC44Mi0xaDEybC45MyAxSDUuMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idW5kbyI+PHBhdGggZD0iTTEyLjUgOGMtMi42NSAwLTUuMDUuOTktNi45IDIuNkwyIDd2OWg5bC0zLjYyLTMuNjJjMS4zOS0xLjE2IDMuMTYtMS44OCA1LjEyLTEuODggMy41NCAwIDYuNTUgMi4zMSA3LjYgNS41bDIuMzctLjc4QzIxLjA4IDExLjAzIDE3LjE1IDggMTIuNSA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InVuZm9sZC1sZXNzIj48cGF0aCBkPSJNNy40MSAxOC41OUw4LjgzIDIwIDEyIDE2LjgzIDE1LjE3IDIwbDEuNDEtMS40MUwxMiAxNGwtNC41OSA0LjU5em05LjE4LTEzLjE4TDE1LjE3IDQgMTIgNy4xNyA4LjgzIDQgNy40MSA1LjQxIDEyIDEwbDQuNTktNC41OXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ1bmZvbGQtbW9yZSI+PHBhdGggZD0iTTEyIDUuODNMMTUuMTcgOWwxLjQxLTEuNDFMMTIgMyA3LjQxIDcuNTkgOC44MyA5IDEyIDUuODN6bTAgMTIuMzRMOC44MyAxNWwtMS40MSAxLjQxTDEyIDIxbDQuNTktNC41OUwxNS4xNyAxNSAxMiAxOC4xN3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ1cGRhdGUiPjxwYXRoIGQ9Ik0yMSAxMC4xMmgtNi43OGwyLjc0LTIuODJjLTIuNzMtMi43LTcuMTUtMi44LTkuODgtLjEtMi43MyAyLjcxLTIuNzMgNy4wOCAwIDkuNzkgMi43MyAyLjcxIDcuMTUgMi43MSA5Ljg4IDBDMTguMzIgMTUuNjUgMTkgMTQuMDggMTkgMTIuMWgyYzAgMS45OC0uODggNC41NS0yLjY0IDYuMjktMy41MSAzLjQ4LTkuMjEgMy40OC0xMi43MiAwLTMuNS0zLjQ3LTMuNTMtOS4xMS0uMDItMTIuNTggMy41MS0zLjQ3IDkuMTQtMy40NyAxMi42NSAwTDIxIDN2Ny4xMnpNMTIuNSA4djQuMjVsMy41IDIuMDgtLjcyIDEuMjFMMTEgMTNWOGgxLjV6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmVyaWZpZWQtdXNlciI+PHBhdGggZD0iTTEyIDFMMyA1djZjMCA1LjU1IDMuODQgMTAuNzQgOSAxMiA1LjE2LTEuMjYgOS02LjQ1IDktMTJWNWwtOS00em0tMiAxNmwtNC00IDEuNDEtMS40MUwxMCAxNC4xN2w2LjU5LTYuNTlMMTggOWwtOCA4eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctYWdlbmRhIj48cGF0aCBkPSJNMjAgMTNIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xdi02YzAtLjU1LS40NS0xLTEtMXptMC0xMEgzYy0uNTUgMC0xIC40NS0xIDF2NmMwIC41NS40NSAxIDEgMWgxN2MuNTUgMCAxLS40NSAxLTFWNGMwLS41NS0uNDUtMS0xLTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1hcnJheSI+PHBhdGggZD0iTTQgMThoM1Y1SDR2MTN6TTE4IDV2MTNoM1Y1aC0zek04IDE4aDlWNUg4djEzeiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctY2Fyb3VzZWwiPjxwYXRoIGQ9Ik03IDE5aDEwVjRIN3YxNXptLTUtMmg0VjZIMnYxMXpNMTggNnYxMWg0VjZoLTR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1jb2x1bW4iPjxwYXRoIGQ9Ik0xMCAxOGg1VjVoLTV2MTN6bS02IDBoNVY1SDR2MTN6TTE2IDV2MTNoNVY1aC01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctZGF5Ij48cGF0aCBkPSJNMiAyMWgxOXYtM0gydjN6TTIwIDhIM2MtLjU1IDAtMSAuNDUtMSAxdjZjMCAuNTUuNDUgMSAxIDFoMTdjLjU1IDAgMS0uNDUgMS0xVjljMC0uNTUtLjQ1LTEtMS0xek0yIDN2M2gxOVYzSDJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1oZWFkbGluZSI+PHBhdGggZD0iTTQgMTVoMTZ2LTJINHYyem0wIDRoMTZ2LTJINHYyem0wLThoMTZWOUg0djJ6bTAtNnYyaDE2VjVINHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LWxpc3QiPjxwYXRoIGQ9Ik00IDE0aDR2LTRINHY0em0wIDVoNHYtNEg0djR6TTQgOWg0VjVINHY0em01IDVoMTJ2LTRIOXY0em0wIDVoMTJ2LTRIOXY0ek05IDV2NGgxMlY1SDl6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy1tb2R1bGUiPjxwYXRoIGQ9Ik00IDExaDVWNUg0djZ6bTAgN2g1di02SDR2NnptNiAwaDV2LTZoLTV2NnptNiAwaDV2LTZoLTV2NnptLTYtN2g1VjVoLTV2NnptNi02djZoNVY1aC01eiI+PC9wYXRoPjwvZz4KPGcgaWQ9InZpZXctcXVpbHQiPjxwYXRoIGQ9Ik0xMCAxOGg1di02aC01djZ6bS02IDBoNVY1SDR2MTN6bTEyIDBoNXYtNmgtNXY2ek0xMCA1djZoMTFWNUgxMHoiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aWV3LXN0cmVhbSI+PHBhdGggZD0iTTQgMThoMTd2LTZINHY2ek00IDV2NmgxN1Y1SDR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlldy13ZWVrIj48cGF0aCBkPSJNNiA1SDNjLS41NSAwLTEgLjQ1LTEgMXYxMmMwIC41NS40NSAxIDEgMWgzYy41NSAwIDEtLjQ1IDEtMVY2YzAtLjU1LS40NS0xLTEtMXptMTQgMGgtM2MtLjU1IDAtMSAuNDUtMSAxdjEyYzAgLjU1LjQ1IDEgMSAxaDNjLjU1IDAgMS0uNDUgMS0xVjZjMC0uNTUtLjQ1LTEtMS0xem0tNyAwaC0zYy0uNTUgMC0xIC40NS0xIDF2MTJjMCAuNTUuNDUgMSAxIDFoM2MuNTUgMCAxLS40NSAxLTFWNmMwLS41NS0uNDUtMS0xLTF6Ij48L3BhdGg+PC9nPgo8ZyBpZD0idmlzaWJpbGl0eSI+PHBhdGggZD0iTTEyIDQuNUM3IDQuNSAyLjczIDcuNjEgMSAxMmMxLjczIDQuMzkgNiA3LjUgMTEgNy41czkuMjctMy4xMSAxMS03LjVjLTEuNzMtNC4zOS02LTcuNS0xMS03LjV6TTEyIDE3Yy0yLjc2IDAtNS0yLjI0LTUtNXMyLjI0LTUgNS01IDUgMi4yNCA1IDUtMi4yNCA1LTUgNXptMC04Yy0xLjY2IDAtMyAxLjM0LTMgM3MxLjM0IDMgMyAzIDMtMS4zNCAzLTMtMS4zNC0zLTMtM3oiPjwvcGF0aD48L2c+CjxnIGlkPSJ2aXNpYmlsaXR5LW9mZiI+PHBhdGggZD0iTTEyIDdjMi43NiAwIDUgMi4yNCA1IDUgMCAuNjUtLjEzIDEuMjYtLjM2IDEuODNsMi45MiAyLjkyYzEuNTEtMS4yNiAyLjctMi44OSAzLjQzLTQuNzUtMS43My00LjM5LTYtNy41LTExLTcuNS0xLjQgMC0yLjc0LjI1LTMuOTguN2wyLjE2IDIuMTZDMTAuNzQgNy4xMyAxMS4zNSA3IDEyIDd6TTIgNC4yN2wyLjI4IDIuMjguNDYuNDZDMy4wOCA4LjMgMS43OCAxMC4wMiAxIDEyYzEuNzMgNC4zOSA2IDcuNSAxMSA3LjUgMS41NSAwIDMuMDMtLjMgNC4zOC0uODRsLjQyLjQyTDE5LjczIDIyIDIxIDIwLjczIDMuMjcgMyAyIDQuMjd6TTcuNTMgOS44bDEuNTUgMS41NWMtLjA1LjIxLS4wOC40My0uMDguNjUgMCAxLjY2IDEuMzQgMyAzIDMgLjIyIDAgLjQ0LS4wMy42NS0uMDhsMS41NSAxLjU1Yy0uNjcuMzMtMS40MS41My0yLjIuNTMtMi43NiAwLTUtMi4yNC01LTUgMC0uNzkuMi0xLjUzLjUzLTIuMnptNC4zMS0uNzhsMy4xNSAzLjE1LjAyLS4xNmMwLTEuNjYtMS4zNC0zLTMtM2wtLjE3LjAxeiI+PC9wYXRoPjwvZz4KPGcgaWQ9Indhcm5pbmciPjxwYXRoIGQ9Ik0xIDIxaDIyTDEyIDIgMSAyMXptMTItM2gtMnYtMmgydjJ6bTAtNGgtMnYtNGgydjR6Ij48L3BhdGg+PC9nPgo8ZyBpZD0id2F0Y2gtbGF0ZXIiPjxwYXRoIGQ9Ik0xMiAyQzYuNSAyIDIgNi41IDIgMTJzNC41IDEwIDEwIDEwIDEwLTQuNSAxMC0xMFMxNy41IDIgMTIgMnptNC4yIDE0LjJMMTEgMTNWN2gxLjV2NS4ybDQuNSAyLjctLjggMS4zeiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndlZWtlbmQiPjxwYXRoIGQ9Ik0yMSAxMGMtMS4xIDAtMiAuOS0yIDJ2M0g1di0zYzAtMS4xLS45LTItMi0ycy0yIC45LTIgMnY1YzAgMS4xLjkgMiAyIDJoMThjMS4xIDAgMi0uOSAyLTJ2LTVjMC0xLjEtLjktMi0yLTJ6bS0zLTVINmMtMS4xIDAtMiAuOS0yIDJ2Mi4xNWMxLjE2LjQxIDIgMS41MSAyIDIuODJWMTRoMTJ2LTIuMDNjMC0xLjMuODQtMi40IDItMi44MlY3YzAtMS4xLS45LTItMi0yeiI+PC9wYXRoPjwvZz4KPGcgaWQ9IndvcmsiPjxwYXRoIGQ9Ik0yMCA2aC00VjRjMC0xLjExLS44OS0yLTItMmgtNGMtMS4xMSAwLTIgLjg5LTIgMnYySDRjLTEuMTEgMC0xLjk5Ljg5LTEuOTkgMkwyIDE5YzAgMS4xMS44OSAyIDIgMmgxNmMxLjExIDAgMi0uODkgMi0yVjhjMC0xLjExLS44OS0yLTItMnptLTYgMGgtNFY0aDR2MnoiPjwvcGF0aD48L2c+CjxnIGlkPSJ5b3V0dWJlLXNlYXJjaGVkLWZvciI+PHBhdGggZD0iTTE3LjAxIDE0aC0uOGwtLjI3LS4yN2MuOTgtMS4xNCAxLjU3LTIuNjEgMS41Ny00LjIzIDAtMy41OS0yLjkxLTYuNS02LjUtNi41cy02LjUgMy02LjUgNi41SDJsMy44NCA0IDQuMTYtNEg2LjUxQzYuNTEgNyA4LjUzIDUgMTEuMDEgNXM0LjUgMi4wMSA0LjUgNC41YzAgMi40OC0yLjAyIDQuNS00LjUgNC41LS42NSAwLTEuMjYtLjE0LTEuODItLjM4TDcuNzEgMTUuMWMuOTcuNTcgMi4wOS45IDMuMy45IDEuNjEgMCAzLjA4LS41OSA0LjIyLTEuNTdsLjI3LjI3di43OWw1LjAxIDQuOTlMMjIgMTlsLTQuOTktNXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ6b29tLWluIj48cGF0aCBkPSJNMTUuNSAxNGgtLjc5bC0uMjgtLjI3QzE1LjQxIDEyLjU5IDE2IDExLjExIDE2IDkuNSAxNiA1LjkxIDEzLjA5IDMgOS41IDNTMyA1LjkxIDMgOS41IDUuOTEgMTYgOS41IDE2YzEuNjEgMCAzLjA5LS41OSA0LjIzLTEuNTdsLjI3LjI4di43OWw1IDQuOTlMMjAuNDkgMTlsLTQuOTktNXptLTYgMEM3LjAxIDE0IDUgMTEuOTkgNSA5LjVTNy4wMSA1IDkuNSA1IDE0IDcuMDEgMTQgOS41IDExLjk5IDE0IDkuNSAxNHptMi41LTRoLTJ2Mkg5di0ySDdWOWgyVjdoMXYyaDJ2MXoiPjwvcGF0aD48L2c+CjxnIGlkPSJ6b29tLW91dCI+PHBhdGggZD0iTTE1LjUgMTRoLS43OWwtLjI4LS4yN0MxNS40MSAxMi41OSAxNiAxMS4xMSAxNiA5LjUgMTYgNS45MSAxMy4wOSAzIDkuNSAzUzMgNS45MSAzIDkuNSA1LjkxIDE2IDkuNSAxNmMxLjYxIDAgMy4wOS0uNTkgNC4yMy0xLjU3bC4yNy4yOHYuNzlsNSA0Ljk5TDIwLjQ5IDE5bC00Ljk5LTV6bS02IDBDNy4wMSAxNCA1IDExLjk5IDUgOS41UzcuMDEgNSA5LjUgNSAxNCA3LjAxIDE0IDkuNSAxMS45OSAxNCA5LjUgMTR6TTcgOWg1djFIN3oiPjwvcGF0aD48L2c+CjwvZGVmcz48L3N2Zz4KPC9pcm9uLWljb25zZXQtc3ZnPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCh0ZW1wbGF0ZSQzLmNvbnRlbnQpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQ2hyb21lIHVzZXMgYW4gb2xkZXIgdmVyc2lvbiBvZiBET00gTGV2ZWwgMyBLZXlib2FyZCBFdmVudHMKICAgICAqCiAgICAgKiBNb3N0IGtleXMgYXJlIGxhYmVsZWQgYXMgdGV4dCwgYnV0IHNvbWUgYXJlIFVuaWNvZGUgY29kZXBvaW50cy4KICAgICAqIFZhbHVlcyB0YWtlbiBmcm9tOgogICAgICogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwNy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwNzEyMjEva2V5c2V0Lmh0bWwjS2V5U2V0LVNldAogICAgICovCiAgICB2YXIgS0VZX0lERU5USUZJRVIgPSB7CiAgICAgICdVKzAwMDgnOiAnYmFja3NwYWNlJywKICAgICAgJ1UrMDAwOSc6ICd0YWInLAogICAgICAnVSswMDFCJzogJ2VzYycsCiAgICAgICdVKzAwMjAnOiAnc3BhY2UnLAogICAgICAnVSswMDdGJzogJ2RlbCcKICAgIH07CgogICAgLyoqCiAgICAgKiBTcGVjaWFsIHRhYmxlIGZvciBLZXlib2FyZEV2ZW50LmtleUNvZGUuCiAgICAgKiBLZXlib2FyZEV2ZW50LmtleUlkZW50aWZpZXIgaXMgYmV0dGVyLCBhbmQgS2V5Qm9hcmRFdmVudC5rZXkgaXMgZXZlbiBiZXR0ZXIKICAgICAqIHRoYW4gdGhhdC4KICAgICAqCiAgICAgKiBWYWx1ZXMgZnJvbToKICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50LmtleUNvZGUjVmFsdWVfb2Zfa2V5Q29kZQogICAgICovCiAgICB2YXIgS0VZX0NPREUgPSB7CiAgICAgIDg6ICdiYWNrc3BhY2UnLAogICAgICA5OiAndGFiJywKICAgICAgMTM6ICdlbnRlcicsCiAgICAgIDI3OiAnZXNjJywKICAgICAgMzM6ICdwYWdldXAnLAogICAgICAzNDogJ3BhZ2Vkb3duJywKICAgICAgMzU6ICdlbmQnLAogICAgICAzNjogJ2hvbWUnLAogICAgICAzMjogJ3NwYWNlJywKICAgICAgMzc6ICdsZWZ0JywKICAgICAgMzg6ICd1cCcsCiAgICAgIDM5OiAncmlnaHQnLAogICAgICA0MDogJ2Rvd24nLAogICAgICA0NjogJ2RlbCcsCiAgICAgIDEwNjogJyonCiAgICB9OwoKICAgIC8qKgogICAgICogTU9ESUZJRVJfS0VZUyBtYXBzIHRoZSBzaG9ydCBuYW1lIGZvciBtb2RpZmllciBrZXlzIHVzZWQgaW4gYSBrZXkKICAgICAqIGNvbWJvIHN0cmluZyB0byB0aGUgcHJvcGVydHkgbmFtZSB0aGF0IHJlZmVyZW5jZXMgdGhvc2Ugc2FtZSBrZXlzCiAgICAgKiBpbiBhIEtleWJvYXJkRXZlbnQgaW5zdGFuY2UuCiAgICAgKi8KICAgIHZhciBNT0RJRklFUl9LRVlTID0gewogICAgICAnc2hpZnQnOiAnc2hpZnRLZXknLAogICAgICAnY3RybCc6ICdjdHJsS2V5JywKICAgICAgJ2FsdCc6ICdhbHRLZXknLAogICAgICAnbWV0YSc6ICdtZXRhS2V5JwogICAgfTsKCiAgICAvKioKICAgICAqIEtleWJvYXJkRXZlbnQua2V5IGlzIG1vc3RseSByZXByZXNlbnRlZCBieSBwcmludGFibGUgY2hhcmFjdGVyIG1hZGUgYnkKICAgICAqIHRoZSBrZXlib2FyZCwgd2l0aCB1bnByaW50YWJsZSBrZXlzIGxhYmVsZWQgbmljZWx5LgogICAgICoKICAgICAqIEhvd2V2ZXIsIG9uIE9TIFgsIEFsdCtjaGFyIGNhbiBtYWtlIGEgVW5pY29kZSBjaGFyYWN0ZXIgdGhhdCBmb2xsb3dzIGFuCiAgICAgKiBBcHBsZS1zcGVjaWZpYyBtYXBwaW5nLiBJbiB0aGlzIGNhc2UsIHdlIGZhbGwgYmFjayB0byAua2V5Q29kZS4KICAgICAqLwogICAgdmFyIEtFWV9DSEFSID0gL1thLXowLTkqXS87CgogICAgLyoqCiAgICAgKiBNYXRjaGVzIGEga2V5SWRlbnRpZmllciBzdHJpbmcuCiAgICAgKi8KICAgIHZhciBJREVOVF9DSEFSID0gL1VcKy87CgogICAgLyoqCiAgICAgKiBNYXRjaGVzIGFycm93IGtleXMgaW4gR2Vja28gMjcuMCsKICAgICAqLwogICAgdmFyIEFSUk9XX0tFWSA9IC9eYXJyb3cvOwoKICAgIC8qKgogICAgICogTWF0Y2hlcyBzcGFjZSBrZXlzIGV2ZXJ5d2hlcmUgKG5vdGFibHkgaW5jbHVkaW5nIElFMTAncyBleGNlcHRpb25hbCBuYW1lCiAgICAgKiBgc3BhY2ViYXJgKS4KICAgICAqLwogICAgdmFyIFNQQUNFX0tFWSA9IC9ec3BhY2UoYmFyKT8vOwoKICAgIC8qKgogICAgICogTWF0Y2hlcyBFU0Mga2V5LgogICAgICoKICAgICAqIFZhbHVlIGZyb206IGh0dHA6Ly93M2MuZ2l0aHViLmlvL3VpZXZlbnRzLWtleS8ja2V5LUVzY2FwZQogICAgICovCiAgICB2YXIgRVNDX0tFWSA9IC9eZXNjYXBlJC87CgogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIHRoZSBrZXkuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBLZXlCb2FyZEV2ZW50LmtleQogICAgICogQHBhcmFtIHtCb29sZWFufSBbbm9TcGVjaWFsQ2hhcnNdIExpbWl0cyB0aGUgdHJhbnNmb3JtYXRpb24gdG8KICAgICAqIGFscGhhLW51bWVyaWMgY2hhcmFjdGVycy4KICAgICAqLwogICAgZnVuY3Rpb24gdHJhbnNmb3JtS2V5KGtleSwgbm9TcGVjaWFsQ2hhcnMpIHsKICAgICAgdmFyIHZhbGlkS2V5ID0gJyc7CiAgICAgIGlmIChrZXkpIHsKICAgICAgICB2YXIgbEtleSA9IGtleS50b0xvd2VyQ2FzZSgpOwogICAgICAgIGlmIChsS2V5ID09PSAnICcgfHwgU1BBQ0VfS0VZLnRlc3QobEtleSkpIHsKICAgICAgICAgIHZhbGlkS2V5ID0gJ3NwYWNlJzsKICAgICAgICB9IGVsc2UgaWYgKEVTQ19LRVkudGVzdChsS2V5KSkgewogICAgICAgICAgdmFsaWRLZXkgPSAnZXNjJzsKICAgICAgICB9IGVsc2UgaWYgKGxLZXkubGVuZ3RoID09IDEpIHsKICAgICAgICAgIGlmICghbm9TcGVjaWFsQ2hhcnMgfHwgS0VZX0NIQVIudGVzdChsS2V5KSkgewogICAgICAgICAgICB2YWxpZEtleSA9IGxLZXk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChBUlJPV19LRVkudGVzdChsS2V5KSkgewogICAgICAgICAgdmFsaWRLZXkgPSBsS2V5LnJlcGxhY2UoJ2Fycm93JywgJycpOwogICAgICAgIH0gZWxzZSBpZiAobEtleSA9PSAnbXVsdGlwbHknKSB7CiAgICAgICAgICAvLyBudW1wYWQgJyonIGNhbiBtYXAgdG8gTXVsdGlwbHkgb24gSUUvV2luZG93cwogICAgICAgICAgdmFsaWRLZXkgPSAnKic7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHZhbGlkS2V5ID0gbEtleTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbGlkS2V5OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUtleUlkZW50aWZpZXIoa2V5SWRlbnQpIHsKICAgICAgdmFyIHZhbGlkS2V5ID0gJyc7CiAgICAgIGlmIChrZXlJZGVudCkgewogICAgICAgIGlmIChrZXlJZGVudCBpbiBLRVlfSURFTlRJRklFUikgewogICAgICAgICAgdmFsaWRLZXkgPSBLRVlfSURFTlRJRklFUltrZXlJZGVudF07CiAgICAgICAgfSBlbHNlIGlmIChJREVOVF9DSEFSLnRlc3Qoa2V5SWRlbnQpKSB7CiAgICAgICAgICBrZXlJZGVudCA9IHBhcnNlSW50KGtleUlkZW50LnJlcGxhY2UoJ1UrJywgJzB4JyksIDE2KTsKICAgICAgICAgIHZhbGlkS2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShrZXlJZGVudCkudG9Mb3dlckNhc2UoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsaWRLZXkgPSBrZXlJZGVudC50b0xvd2VyQ2FzZSgpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdmFsaWRLZXk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtS2V5Q29kZShrZXlDb2RlKSB7CiAgICAgIHZhciB2YWxpZEtleSA9ICcnOwogICAgICBpZiAoTnVtYmVyKGtleUNvZGUpKSB7CiAgICAgICAgaWYgKGtleUNvZGUgPj0gNjUgJiYga2V5Q29kZSA8PSA5MCkgewogICAgICAgICAgLy8gYXNjaWkgYS16CiAgICAgICAgICAvLyBsb3dlcmNhc2UgaXMgMzIgb2Zmc2V0IGZyb20gdXBwZXJjYXNlCiAgICAgICAgICB2YWxpZEtleSA9IFN0cmluZy5mcm9tQ2hhckNvZGUoMzIgKyBrZXlDb2RlKTsKICAgICAgICB9IGVsc2UgaWYgKGtleUNvZGUgPj0gMTEyICYmIGtleUNvZGUgPD0gMTIzKSB7CiAgICAgICAgICAvLyBmdW5jdGlvbiBrZXlzIGYxLWYxMgogICAgICAgICAgdmFsaWRLZXkgPSAnZicgKyAoa2V5Q29kZSAtIDExMiArIDEpOwogICAgICAgIH0gZWxzZSBpZiAoa2V5Q29kZSA+PSA0OCAmJiBrZXlDb2RlIDw9IDU3KSB7CiAgICAgICAgICAvLyB0b3AgMC05IGtleXMKICAgICAgICAgIHZhbGlkS2V5ID0gU3RyaW5nKGtleUNvZGUgLSA0OCk7CiAgICAgICAgfSBlbHNlIGlmIChrZXlDb2RlID49IDk2ICYmIGtleUNvZGUgPD0gMTA1KSB7CiAgICAgICAgICAvLyBudW0gcGFkIDAtOQogICAgICAgICAgdmFsaWRLZXkgPSBTdHJpbmcoa2V5Q29kZSAtIDk2KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFsaWRLZXkgPSBLRVlfQ09ERVtrZXlDb2RlXTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHZhbGlkS2V5OwogICAgfQoKICAgIC8qKgogICAgICogQ2FsY3VsYXRlcyB0aGUgbm9ybWFsaXplZCBrZXkgZm9yIGEgS2V5Ym9hcmRFdmVudC4KICAgICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0ga2V5RXZlbnQKICAgICAqIEBwYXJhbSB7Qm9vbGVhbn0gW25vU3BlY2lhbENoYXJzXSBTZXQgdG8gdHJ1ZSB0byBsaW1pdCBrZXlFdmVudC5rZXkKICAgICAqIHRyYW5zZm9ybWF0aW9uIHRvIGFscGhhLW51bWVyaWMgY2hhcnMuIFRoaXMgaXMgdXNlZnVsIHdpdGgga2V5CiAgICAgKiBjb21iaW5hdGlvbnMgbGlrZSBzaGlmdCArIDIsIHdoaWNoIG9uIEZGIGZvciBNYWNPUyBwcm9kdWNlcwogICAgICoga2V5RXZlbnQua2V5ID0gQAogICAgICogVG8gZ2V0IDIgcmV0dXJuZWQsIHNldCBub1NwZWNpYWxDaGFycyA9IHRydWUKICAgICAqIFRvIGdldCBAIHJldHVybmVkLCBzZXQgbm9TcGVjaWFsQ2hhcnMgPSBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVkS2V5Rm9yRXZlbnQoa2V5RXZlbnQsIG5vU3BlY2lhbENoYXJzKSB7CiAgICAgIC8vIEZhbGwgYmFjayBmcm9tIC5rZXksIHRvIC5kZXRhaWwua2V5IGZvciBhcnRpZmljYWwga2V5Ym9hcmQgZXZlbnRzLAogICAgICAvLyBhbmQgdGhlbiB0byBkZXByZWNhdGVkIC5rZXlJZGVudGlmaWVyIGFuZCAua2V5Q29kZS4KICAgICAgaWYgKGtleUV2ZW50LmtleSkgewogICAgICAgIHJldHVybiB0cmFuc2Zvcm1LZXkoa2V5RXZlbnQua2V5LCBub1NwZWNpYWxDaGFycyk7CiAgICAgIH0KICAgICAgaWYgKGtleUV2ZW50LmRldGFpbCAmJiBrZXlFdmVudC5kZXRhaWwua2V5KSB7CiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybUtleShrZXlFdmVudC5kZXRhaWwua2V5LCBub1NwZWNpYWxDaGFycyk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRyYW5zZm9ybUtleUlkZW50aWZpZXIoa2V5RXZlbnQua2V5SWRlbnRpZmllcikgfHwKICAgICAgICAgIHRyYW5zZm9ybUtleUNvZGUoa2V5RXZlbnQua2V5Q29kZSkgfHwgJyc7CiAgICB9CgogICAgZnVuY3Rpb24ga2V5Q29tYm9NYXRjaGVzRXZlbnQoa2V5Q29tYm8sIGV2ZW50KSB7CiAgICAgIC8vIEZvciBjb21ib3Mgd2l0aCBtb2RpZmllcnMgd2Ugc3VwcG9ydCBvbmx5IGFscGhhLW51bWVyaWMga2V5cwogICAgICB2YXIga2V5RXZlbnQgPSBub3JtYWxpemVkS2V5Rm9yRXZlbnQoZXZlbnQsIGtleUNvbWJvLmhhc01vZGlmaWVycyk7CiAgICAgIHJldHVybiBrZXlFdmVudCA9PT0ga2V5Q29tYm8ua2V5ICYmCiAgICAgICAgICAoIWtleUNvbWJvLmhhc01vZGlmaWVycyB8fAogICAgICAgICAgICghIWV2ZW50LnNoaWZ0S2V5ID09PSAhIWtleUNvbWJvLnNoaWZ0S2V5ICYmCiAgICAgICAgICAgICEhZXZlbnQuY3RybEtleSA9PT0gISFrZXlDb21iby5jdHJsS2V5ICYmCiAgICAgICAgICAgICEhZXZlbnQuYWx0S2V5ID09PSAhIWtleUNvbWJvLmFsdEtleSAmJgogICAgICAgICAgICAhIWV2ZW50Lm1ldGFLZXkgPT09ICEha2V5Q29tYm8ubWV0YUtleSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlS2V5Q29tYm9TdHJpbmcoa2V5Q29tYm9TdHJpbmcpIHsKICAgICAgaWYgKGtleUNvbWJvU3RyaW5nLmxlbmd0aCA9PT0gMSkgewogICAgICAgIHJldHVybiB7Y29tYm86IGtleUNvbWJvU3RyaW5nLCBrZXk6IGtleUNvbWJvU3RyaW5nLCBldmVudDogJ2tleWRvd24nfTsKICAgICAgfQogICAgICByZXR1cm4ga2V5Q29tYm9TdHJpbmcuc3BsaXQoJysnKQogICAgICAgICAgLnJlZHVjZShmdW5jdGlvbihwYXJzZWRLZXlDb21ibywga2V5Q29tYm9QYXJ0KSB7CiAgICAgICAgICAgIHZhciBldmVudFBhcnRzID0ga2V5Q29tYm9QYXJ0LnNwbGl0KCc6Jyk7CiAgICAgICAgICAgIHZhciBrZXlOYW1lID0gZXZlbnRQYXJ0c1swXTsKICAgICAgICAgICAgdmFyIGV2ZW50ID0gZXZlbnRQYXJ0c1sxXTsKCiAgICAgICAgICAgIGlmIChrZXlOYW1lIGluIE1PRElGSUVSX0tFWVMpIHsKICAgICAgICAgICAgICBwYXJzZWRLZXlDb21ib1tNT0RJRklFUl9LRVlTW2tleU5hbWVdXSA9IHRydWU7CiAgICAgICAgICAgICAgcGFyc2VkS2V5Q29tYm8uaGFzTW9kaWZpZXJzID0gdHJ1ZTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBwYXJzZWRLZXlDb21iby5rZXkgPSBrZXlOYW1lOwogICAgICAgICAgICAgIHBhcnNlZEtleUNvbWJvLmV2ZW50ID0gZXZlbnQgfHwgJ2tleWRvd24nOwogICAgICAgICAgICB9CgogICAgICAgICAgICByZXR1cm4gcGFyc2VkS2V5Q29tYm87CiAgICAgICAgICB9LCB7Y29tYm86IGtleUNvbWJvU3RyaW5nLnNwbGl0KCc6Jykuc2hpZnQoKX0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRXZlbnRTdHJpbmcoZXZlbnRTdHJpbmcpIHsKICAgICAgcmV0dXJuIGV2ZW50U3RyaW5nLnRyaW0oKS5zcGxpdCgnICcpLm1hcChmdW5jdGlvbihrZXlDb21ib1N0cmluZykgewogICAgICAgIHJldHVybiBwYXJzZUtleUNvbWJvU3RyaW5nKGtleUNvbWJvU3RyaW5nKTsKICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBgUG9seW1lci5Jcm9uQTExeUtleXNCZWhhdmlvcmAgcHJvdmlkZXMgYSBub3JtYWxpemVkIGludGVyZmFjZSBmb3IgcHJvY2Vzc2luZwogICAgICoga2V5Ym9hcmQgY29tbWFuZHMgdGhhdCBwZXJ0YWluIHRvIFtXQUktQVJJQSBiZXN0CiAgICAgKiBwcmFjdGljZXNdKGh0dHA6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhLXByYWN0aWNlcy8ja2JkX2dlbmVyYWxfYmluZGluZykuIFRoZQogICAgICogZWxlbWVudCB0YWtlcyBjYXJlIG9mIGJyb3dzZXIgZGlmZmVyZW5jZXMgd2l0aCByZXNwZWN0IHRvIEtleWJvYXJkIGV2ZW50cyBhbmQKICAgICAqIHVzZXMgYW4gZXhwcmVzc2l2ZSBzeW50YXggdG8gZmlsdGVyIGtleSBwcmVzc2VzLgogICAgICoKICAgICAqIFVzZSB0aGUgYGtleUJpbmRpbmdzYCBwcm90b3R5cGUgcHJvcGVydHkgdG8gZXhwcmVzcyB3aGF0IGNvbWJpbmF0aW9uIG9mIGtleXMKICAgICAqIHdpbGwgdHJpZ2dlciB0aGUgY2FsbGJhY2suIEEga2V5IGJpbmRpbmcgaGFzIHRoZSBmb3JtYXQKICAgICAqIGAiS0VZK01PRElGSUVSOkVWRU5UIjogImNhbGxiYWNrImAgKGAiS0VZIjogImNhbGxiYWNrImAgb3IKICAgICAqIGAiS0VZOkVWRU5UIjogImNhbGxiYWNrImAgYXJlIHZhbGlkIGFzIHdlbGwpLiBTb21lIGV4YW1wbGVzOgogICAgICoKICAgICAqICAgICAga2V5QmluZGluZ3M6IHsKICAgICAqICAgICAgICAnc3BhY2UnOiAnX29uS2V5ZG93bicsIC8vIHNhbWUgYXMgJ3NwYWNlOmtleWRvd24nCiAgICAgKiAgICAgICAgJ3NoaWZ0K3RhYic6ICdfb25LZXlkb3duJywKICAgICAqICAgICAgICAnZW50ZXI6a2V5cHJlc3MnOiAnX29uS2V5cHJlc3MnLAogICAgICogICAgICAgICdlc2M6a2V5dXAnOiAnX29uS2V5dXAnCiAgICAgKiAgICAgIH0KICAgICAqCiAgICAgKiBUaGUgY2FsbGJhY2sgd2lsbCByZWNlaXZlIHdpdGggYW4gZXZlbnQgY29udGFpbmluZyB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uCiAgICAgKiBpbiBgZXZlbnQuZGV0YWlsYDoKICAgICAqCiAgICAgKiAgICAgIF9vbktleWRvd246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgKiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsLmNvbWJvKTsgLy8gS0VZK01PRElGSUVSLCBlLmcuICJzaGlmdCt0YWIiCiAgICAgKiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsLmtleSk7IC8vIEtFWSBvbmx5LCBlLmcuICJ0YWIiCiAgICAgKiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsLmV2ZW50KTsgLy8gRVZFTlQsIGUuZy4gImtleWRvd24iCiAgICAgKiAgICAgICAgY29uc29sZS5sb2coZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQpOyAvLyB0aGUgb3JpZ2luYWwgS2V5Ym9hcmRFdmVudAogICAgICogICAgICB9CiAgICAgKgogICAgICogVXNlIHRoZSBga2V5RXZlbnRUYXJnZXRgIGF0dHJpYnV0ZSB0byBzZXQgdXAgZXZlbnQgaGFuZGxlcnMgb24gYSBzcGVjaWZpYwogICAgICogbm9kZS4KICAgICAqCiAgICAgKiBTZWUgdGhlIFtkZW1vIHNvdXJjZQogICAgICogY29kZV0oaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9pcm9uLWExMXkta2V5cy1iZWhhdmlvci9ibG9iL21hc3Rlci9kZW1vL3gta2V5LWF3YXJlLmh0bWwpCiAgICAgKiBmb3IgYW4gZXhhbXBsZS4KICAgICAqCiAgICAgKiBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgY29uc3QgSXJvbkExMXlLZXlzQmVoYXZpb3IgPSB7CiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgRXZlbnRUYXJnZXQgdGhhdCB3aWxsIGJlIGZpcmluZyByZWxldmFudCBLZXlib2FyZEV2ZW50cy4gU2V0IGl0IHRvCiAgICAgICAgICogYG51bGxgIHRvIGRpc2FibGUgdGhlIGxpc3RlbmVycy4KICAgICAgICAgKiBAdHlwZSB7P0V2ZW50VGFyZ2V0fQogICAgICAgICAqLwogICAgICAgIGtleUV2ZW50VGFyZ2V0OiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHRoaXMgcHJvcGVydHkgd2lsbCBjYXVzZSB0aGUgaW1wbGVtZW50aW5nIGVsZW1lbnQgdG8KICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IHN0b3AgcHJvcGFnYXRpb24gb24gYW55IGhhbmRsZWQgS2V5Ym9hcmRFdmVudHMuCiAgICAgICAgICovCiAgICAgICAgc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbjoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIF9ib3VuZEtleUhhbmRsZXJzOiB7CiAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8vIFdlIHVzZSB0aGlzIGR1ZSB0byBhIGxpbWl0YXRpb24gaW4gSUUxMCB3aGVyZSBpbnN0YW5jZXMgd2lsbCBoYXZlCiAgICAgICAgLy8gb3duIHByb3BlcnRpZXMgb2YgZXZlcnl0aGluZyBvbiB0aGUgInByb3RvdHlwZSIuCiAgICAgICAgX2ltcGVyYXRpdmVLZXlCaW5kaW5nczogewogICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgb2JzZXJ2ZXJzOiBbJ19yZXNldEtleUV2ZW50TGlzdGVuZXJzKGtleUV2ZW50VGFyZ2V0LCBfYm91bmRLZXlIYW5kbGVycyknXSwKCgogICAgICAvKioKICAgICAgICogVG8gYmUgdXNlZCB0byBleHByZXNzIHdoYXQgY29tYmluYXRpb24gb2Yga2V5cyAgd2lsbCB0cmlnZ2VyIHRoZSByZWxhdGl2ZQogICAgICAgKiBjYWxsYmFjay4gZS5nLiBga2V5QmluZGluZ3M6IHsgJ2VzYyc6ICdfb25Fc2NQcmVzc2VkJ31gCiAgICAgICAqIEB0eXBlIHshT2JqZWN0fQogICAgICAgKi8KICAgICAga2V5QmluZGluZ3M6IHt9LAoKICAgICAgcmVnaXN0ZXJlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcHJlcEtleUJpbmRpbmdzKCk7CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnMoKTsKICAgICAgfSwKCiAgICAgIGRldGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FuIGJlIHVzZWQgdG8gaW1wZXJhdGl2ZWx5IGFkZCBhIGtleSBiaW5kaW5nIHRvIHRoZSBpbXBsZW1lbnRpbmcKICAgICAgICogZWxlbWVudC4gVGhpcyBpcyB0aGUgaW1wZXJhdGl2ZSBlcXVpdmFsZW50IG9mIGRlY2xhcmluZyBhIGtleWJpbmRpbmcKICAgICAgICogaW4gdGhlIGBrZXlCaW5kaW5nc2AgcHJvdG90eXBlIHByb3BlcnR5LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnRTdHJpbmcKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGhhbmRsZXJOYW1lCiAgICAgICAqLwogICAgICBhZGRPd25LZXlCaW5kaW5nOiBmdW5jdGlvbihldmVudFN0cmluZywgaGFuZGxlck5hbWUpIHsKICAgICAgICB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3NbZXZlbnRTdHJpbmddID0gaGFuZGxlck5hbWU7CiAgICAgICAgdGhpcy5fcHJlcEtleUJpbmRpbmdzKCk7CiAgICAgICAgdGhpcy5fcmVzZXRLZXlFdmVudExpc3RlbmVycygpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFdoZW4gY2FsbGVkLCB3aWxsIHJlbW92ZSBhbGwgaW1wZXJhdGl2ZWx5LWFkZGVkIGtleSBiaW5kaW5ncy4KICAgICAgICovCiAgICAgIHJlbW92ZU93bktleUJpbmRpbmdzOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9pbXBlcmF0aXZlS2V5QmluZGluZ3MgPSB7fTsKICAgICAgICB0aGlzLl9wcmVwS2V5QmluZGluZ3MoKTsKICAgICAgICB0aGlzLl9yZXNldEtleUV2ZW50TGlzdGVuZXJzKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIGEga2V5Ym9hcmQgZXZlbnQgbWF0Y2hlcyBgZXZlbnRTdHJpbmdgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudFN0cmluZwogICAgICAgKiBAcmV0dXJuIHtib29sZWFufQogICAgICAgKi8KICAgICAga2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzOiBmdW5jdGlvbihldmVudCwgZXZlbnRTdHJpbmcpIHsKICAgICAgICB2YXIga2V5Q29tYm9zID0gcGFyc2VFdmVudFN0cmluZyhldmVudFN0cmluZyk7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlDb21ib3MubGVuZ3RoOyArK2kpIHsKICAgICAgICAgIGlmIChrZXlDb21ib01hdGNoZXNFdmVudChrZXlDb21ib3NbaV0sIGV2ZW50KSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAoKICAgICAgX2NvbGxlY3RLZXlCaW5kaW5nczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGtleUJpbmRpbmdzID0gdGhpcy5iZWhhdmlvcnMubWFwKGZ1bmN0aW9uKGJlaGF2aW9yKSB7CiAgICAgICAgICByZXR1cm4gYmVoYXZpb3Iua2V5QmluZGluZ3M7CiAgICAgICAgfSk7CgogICAgICAgIGlmIChrZXlCaW5kaW5ncy5pbmRleE9mKHRoaXMua2V5QmluZGluZ3MpID09PSAtMSkgewogICAgICAgICAga2V5QmluZGluZ3MucHVzaCh0aGlzLmtleUJpbmRpbmdzKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBrZXlCaW5kaW5nczsKICAgICAgfSwKCiAgICAgIF9wcmVwS2V5QmluZGluZ3M6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2tleUJpbmRpbmdzID0ge307CgogICAgICAgIHRoaXMuX2NvbGxlY3RLZXlCaW5kaW5ncygpLmZvckVhY2goZnVuY3Rpb24oa2V5QmluZGluZ3MpIHsKICAgICAgICAgIGZvciAodmFyIGV2ZW50U3RyaW5nIGluIGtleUJpbmRpbmdzKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZEtleUJpbmRpbmcoZXZlbnRTdHJpbmcsIGtleUJpbmRpbmdzW2V2ZW50U3RyaW5nXSk7CiAgICAgICAgICB9CiAgICAgICAgfSwgdGhpcyk7CgogICAgICAgIGZvciAodmFyIGV2ZW50U3RyaW5nIGluIHRoaXMuX2ltcGVyYXRpdmVLZXlCaW5kaW5ncykgewogICAgICAgICAgdGhpcy5fYWRkS2V5QmluZGluZygKICAgICAgICAgICAgICBldmVudFN0cmluZywgdGhpcy5faW1wZXJhdGl2ZUtleUJpbmRpbmdzW2V2ZW50U3RyaW5nXSk7CiAgICAgICAgfQoKICAgICAgICAvLyBHaXZlIHByZWNlZGVuY2UgdG8gY29tYm9zIHdpdGggbW9kaWZpZXJzIHRvIGJlIGNoZWNrZWQgZmlyc3QuCiAgICAgICAgZm9yICh2YXIgZXZlbnROYW1lIGluIHRoaXMuX2tleUJpbmRpbmdzKSB7CiAgICAgICAgICB0aGlzLl9rZXlCaW5kaW5nc1tldmVudE5hbWVdLnNvcnQoZnVuY3Rpb24oa2IxLCBrYjIpIHsKICAgICAgICAgICAgdmFyIGIxID0ga2IxWzBdLmhhc01vZGlmaWVyczsKICAgICAgICAgICAgdmFyIGIyID0ga2IyWzBdLmhhc01vZGlmaWVyczsKICAgICAgICAgICAgcmV0dXJuIChiMSA9PT0gYjIpID8gMCA6IGIxID8gLTEgOiAxOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2FkZEtleUJpbmRpbmc6IGZ1bmN0aW9uKGV2ZW50U3RyaW5nLCBoYW5kbGVyTmFtZSkgewogICAgICAgIHBhcnNlRXZlbnRTdHJpbmcoZXZlbnRTdHJpbmcpLmZvckVhY2goZnVuY3Rpb24oa2V5Q29tYm8pIHsKICAgICAgICAgIHRoaXMuX2tleUJpbmRpbmdzW2tleUNvbWJvLmV2ZW50XSA9CiAgICAgICAgICAgICAgdGhpcy5fa2V5QmluZGluZ3Nba2V5Q29tYm8uZXZlbnRdIHx8IFtdOwoKICAgICAgICAgIHRoaXMuX2tleUJpbmRpbmdzW2tleUNvbWJvLmV2ZW50XS5wdXNoKFtrZXlDb21ibywgaGFuZGxlck5hbWVdKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIF9yZXNldEtleUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl91bmxpc3RlbktleUV2ZW50TGlzdGVuZXJzKCk7CgogICAgICAgIGlmICh0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRoaXMuX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2xpc3RlbktleUV2ZW50TGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMua2V5RXZlbnRUYXJnZXQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmtleXModGhpcy5fa2V5QmluZGluZ3MpLmZvckVhY2goZnVuY3Rpb24oZXZlbnROYW1lKSB7CiAgICAgICAgICB2YXIga2V5QmluZGluZ3MgPSB0aGlzLl9rZXlCaW5kaW5nc1tldmVudE5hbWVdOwogICAgICAgICAgdmFyIGJvdW5kS2V5SGFuZGxlciA9IHRoaXMuX29uS2V5QmluZGluZ0V2ZW50LmJpbmQodGhpcywga2V5QmluZGluZ3MpOwoKICAgICAgICAgIHRoaXMuX2JvdW5kS2V5SGFuZGxlcnMucHVzaCgKICAgICAgICAgICAgICBbdGhpcy5rZXlFdmVudFRhcmdldCwgZXZlbnROYW1lLCBib3VuZEtleUhhbmRsZXJdKTsKCiAgICAgICAgICB0aGlzLmtleUV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBib3VuZEtleUhhbmRsZXIpOwogICAgICAgIH0sIHRoaXMpOwogICAgICB9LAoKICAgICAgX3VubGlzdGVuS2V5RXZlbnRMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBrZXlIYW5kbGVyVHVwbGU7CiAgICAgICAgdmFyIGtleUV2ZW50VGFyZ2V0OwogICAgICAgIHZhciBldmVudE5hbWU7CiAgICAgICAgdmFyIGJvdW5kS2V5SGFuZGxlcjsKCiAgICAgICAgd2hpbGUgKHRoaXMuX2JvdW5kS2V5SGFuZGxlcnMubGVuZ3RoKSB7CiAgICAgICAgICAvLyBNeSBraW5nZG9tIGZvciBibG9jay1zY29wZSBiaW5kaW5nIGFuZCBkZXN0cnVjdHVyaW5nIGFzc2lnbm1lbnQuLgogICAgICAgICAga2V5SGFuZGxlclR1cGxlID0gdGhpcy5fYm91bmRLZXlIYW5kbGVycy5wb3AoKTsKICAgICAgICAgIGtleUV2ZW50VGFyZ2V0ID0ga2V5SGFuZGxlclR1cGxlWzBdOwogICAgICAgICAgZXZlbnROYW1lID0ga2V5SGFuZGxlclR1cGxlWzFdOwogICAgICAgICAgYm91bmRLZXlIYW5kbGVyID0ga2V5SGFuZGxlclR1cGxlWzJdOwoKICAgICAgICAgIGtleUV2ZW50VGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBib3VuZEtleUhhbmRsZXIpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9vbktleUJpbmRpbmdFdmVudDogZnVuY3Rpb24oa2V5QmluZGluZ3MsIGV2ZW50KSB7CiAgICAgICAgaWYgKHRoaXMuc3RvcEtleWJvYXJkRXZlbnRQcm9wYWdhdGlvbikgewogICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBpZiBldmVudCBoYXMgYmVlbiBhbHJlYWR5IHByZXZlbnRlZCwgZG9uJ3QgZG8gYW55dGhpbmcKICAgICAgICBpZiAoZXZlbnQuZGVmYXVsdFByZXZlbnRlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlCaW5kaW5ncy5sZW5ndGg7IGkrKykgewogICAgICAgICAgdmFyIGtleUNvbWJvID0ga2V5QmluZGluZ3NbaV1bMF07CiAgICAgICAgICB2YXIgaGFuZGxlck5hbWUgPSBrZXlCaW5kaW5nc1tpXVsxXTsKICAgICAgICAgIGlmIChrZXlDb21ib01hdGNoZXNFdmVudChrZXlDb21ibywgZXZlbnQpKSB7CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJLZXlIYW5kbGVyKGtleUNvbWJvLCBoYW5kbGVyTmFtZSwgZXZlbnQpOwogICAgICAgICAgICAvLyBleGl0IHRoZSBsb29wIGlmIGV2ZW50RGVmYXVsdCB3YXMgcHJldmVudGVkCiAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3RyaWdnZXJLZXlIYW5kbGVyOiBmdW5jdGlvbihrZXlDb21ibywgaGFuZGxlck5hbWUsIGtleWJvYXJkRXZlbnQpIHsKICAgICAgICB2YXIgZGV0YWlsID0gT2JqZWN0LmNyZWF0ZShrZXlDb21ibyk7CiAgICAgICAgZGV0YWlsLmtleWJvYXJkRXZlbnQgPSBrZXlib2FyZEV2ZW50OwogICAgICAgIHZhciBldmVudCA9CiAgICAgICAgICAgIG5ldyBDdXN0b21FdmVudChrZXlDb21iby5ldmVudCwge2RldGFpbDogZGV0YWlsLCBjYW5jZWxhYmxlOiB0cnVlfSk7CiAgICAgICAgdGhpc1toYW5kbGVyTmFtZV0uY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgaWYgKGV2ZW50LmRlZmF1bHRQcmV2ZW50ZWQpIHsKICAgICAgICAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBgUG9seW1lci5Jcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3JgIGFsbG93cyBhbiBlbGVtZW50IHRvIHJlc3BvbmQgdG8gc2Nyb2xsCiAgICAgKiBldmVudHMgZnJvbSBhIGRlc2lnbmF0ZWQgc2Nyb2xsIHRhcmdldC4KICAgICAqCiAgICAgKiBFbGVtZW50cyB0aGF0IGNvbnN1bWUgdGhpcyBiZWhhdmlvciBjYW4gb3ZlcnJpZGUgdGhlIGBfc2Nyb2xsSGFuZGxlcmAKICAgICAqIG1ldGhvZCB0byBhZGQgbG9naWMgb24gdGhlIHNjcm9sbCBldmVudC4KICAgICAqCiAgICAgKiBAZGVtbyBkZW1vL3Njcm9sbGluZy1yZWdpb24uaHRtbCBTY3JvbGxpbmcgUmVnaW9uCiAgICAgKiBAZGVtbyBkZW1vL2RvY3VtZW50Lmh0bWwgRG9jdW1lbnQgRWxlbWVudAogICAgICogQHBvbHltZXJCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBJcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIFNwZWNpZmllcyB0aGUgZWxlbWVudCB0aGF0IHdpbGwgaGFuZGxlIHRoZSBzY3JvbGwgZXZlbnQKICAgICAgICAgKiBvbiB0aGUgYmVoYWxmIG9mIHRoZSBjdXJyZW50IGVsZW1lbnQuIFRoaXMgaXMgdHlwaWNhbGx5IGEgcmVmZXJlbmNlIHRvIGFuCiAgICAgICAgICplbGVtZW50LCBidXQgdGhlcmUgYXJlIGEgZmV3IG1vcmUgcG9zaWJpbGl0aWVzOgogICAgICAgICAqCiAgICAgICAgICogIyMjIEVsZW1lbnRzIGlkCiAgICAgICAgICoKICAgICAgICAgKmBgYGh0bWwKICAgICAgICAgKiA8ZGl2IGlkPSJzY3JvbGxhYmxlLWVsZW1lbnQiIHN0eWxlPSJvdmVyZmxvdzogYXV0bzsiPgogICAgICAgICAqICA8eC1lbGVtZW50IHNjcm9sbC10YXJnZXQ9InNjcm9sbGFibGUtZWxlbWVudCI+CiAgICAgICAgICogICAgPCEtLSBDb250ZW50LS0+CiAgICAgICAgICogIDwveC1lbGVtZW50PgogICAgICAgICAqIDwvZGl2PgogICAgICAgICAqYGBgCiAgICAgICAgICogSW4gdGhpcyBjYXNlLCB0aGUgYHNjcm9sbFRhcmdldGAgd2lsbCBwb2ludCB0byB0aGUgb3V0ZXIgZGl2IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiAjIyMgRG9jdW1lbnQgc2Nyb2xsaW5nCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgZG9jdW1lbnQgc2Nyb2xsaW5nLCB5b3UgY2FuIHVzZSB0aGUgcmVzZXJ2ZWQgd29yZCBgZG9jdW1lbnRgOgogICAgICAgICAqCiAgICAgICAgICpgYGBodG1sCiAgICAgICAgICogPHgtZWxlbWVudCBzY3JvbGwtdGFyZ2V0PSJkb2N1bWVudCI+CiAgICAgICAgICogICA8IS0tIENvbnRlbnQgLS0+CiAgICAgICAgICogPC94LWVsZW1lbnQ+CiAgICAgICAgICpgYGAKICAgICAgICAgKgogICAgICAgICAqICMjIyBFbGVtZW50cyByZWZlcmVuY2UKICAgICAgICAgKgogICAgICAgICAqYGBganMKICAgICAgICAgKiBhcHBIZWFkZXIuc2Nyb2xsVGFyZ2V0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignI3Njcm9sbGFibGUtZWxlbWVudCcpOwogICAgICAgICAqYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7SFRNTEVsZW1lbnR9CiAgICAgICAgICogQGRlZmF1bHQgZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBzY3JvbGxUYXJnZXQ6IHsKICAgICAgICAgIHR5cGU6IEhUTUxFbGVtZW50LAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVmYXVsdFNjcm9sbFRhcmdldDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICBvYnNlcnZlcnM6IFsnX3Njcm9sbFRhcmdldENoYW5nZWQoc2Nyb2xsVGFyZ2V0LCBpc0F0dGFjaGVkKSddLAoKICAgICAgLyoqCiAgICAgICAqIFRydWUgaWYgdGhlIGV2ZW50IGxpc3RlbmVyIHNob3VsZCBiZSBpbnN0YWxsZWQuCiAgICAgICAqLwogICAgICBfc2hvdWxkSGF2ZUxpc3RlbmVyOiB0cnVlLAoKICAgICAgX3Njcm9sbFRhcmdldENoYW5nZWQ6IGZ1bmN0aW9uKHNjcm9sbFRhcmdldCwgaXNBdHRhY2hlZCkgewoKICAgICAgICBpZiAodGhpcy5fb2xkU2Nyb2xsVGFyZ2V0KSB7CiAgICAgICAgICB0aGlzLl90b2dnbGVTY3JvbGxMaXN0ZW5lcihmYWxzZSwgdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0KTsKICAgICAgICAgIHRoaXMuX29sZFNjcm9sbFRhcmdldCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICghaXNBdHRhY2hlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBTdXBwb3J0IGVsZW1lbnQgaWQgcmVmZXJlbmNlcwogICAgICAgIGlmIChzY3JvbGxUYXJnZXQgPT09ICdkb2N1bWVudCcpIHsKICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0ID0gdGhpcy5fZG9jOwoKICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzY3JvbGxUYXJnZXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICB2YXIgZG9tSG9zdCA9IHRoaXMuZG9tSG9zdDsKCiAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IGRvbUhvc3QgJiYgZG9tSG9zdC4kID8KICAgICAgICAgICAgICBkb21Ib3N0LiRbc2Nyb2xsVGFyZ2V0XSA6CiAgICAgICAgICAgICAgZG9tKHRoaXMub3duZXJEb2N1bWVudCkucXVlcnlTZWxlY3RvcignIycgKyBzY3JvbGxUYXJnZXQpOwoKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSkgewogICAgICAgICAgdGhpcy5fb2xkU2Nyb2xsVGFyZ2V0ID0gc2Nyb2xsVGFyZ2V0OwogICAgICAgICAgdGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIodGhpcy5fc2hvdWxkSGF2ZUxpc3RlbmVyLCBzY3JvbGxUYXJnZXQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSdW5zIG9uIGV2ZXJ5IHNjcm9sbCBldmVudC4gQ29uc3VtZXIgb2YgdGhpcyBiZWhhdmlvciBtYXkgb3ZlcnJpZGUgdGhpcwogICAgICAgKiBtZXRob2QuCiAgICAgICAqCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9zY3JvbGxIYW5kbGVyOiBmdW5jdGlvbiBzY3JvbGxIYW5kbGVyKCkge30sCgogICAgICAvKioKICAgICAgICogVGhlIGRlZmF1bHQgc2Nyb2xsIHRhcmdldC4gQ29uc3VtZXJzIG9mIHRoaXMgYmVoYXZpb3IgbWF5IHdhbnQgdG8gY3VzdG9taXplCiAgICAgICAqIHRoZSBkZWZhdWx0IHNjcm9sbCB0YXJnZXQuCiAgICAgICAqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9kb2M7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2hvcnRjdXQgZm9yIHRoZSBkb2N1bWVudCBlbGVtZW50CiAgICAgICAqCiAgICAgICAqIEB0eXBlIHtFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IF9kb2MoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogR2V0cyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQKICAgICAgICogdXB3YXJkLgogICAgICAgKgogICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IF9zY3JvbGxUb3AoKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuc2Nyb2xsVGFyZ2V0ID09PSB0aGlzLl9kb2MgPyB3aW5kb3cucGFnZVlPZmZzZXQgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBwaXhlbHMgdGhhdCB0aGUgY29udGVudCBvZiBhbiBlbGVtZW50IGlzIHNjcm9sbGVkIHRvIHRoZQogICAgICAgKiBsZWZ0LgogICAgICAgKgogICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IF9zY3JvbGxMZWZ0KCkgewogICAgICAgIGlmICh0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRhcmdldCA9PT0gdGhpcy5fZG9jID8gd2luZG93LnBhZ2VYT2Zmc2V0IDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQKICAgICAgICogdXB3YXJkLgogICAgICAgKgogICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgKi8KICAgICAgc2V0IF9zY3JvbGxUb3AodG9wKSB7CiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGFyZ2V0ID09PSB0aGlzLl9kb2MpIHsKICAgICAgICAgIHdpbmRvdy5zY3JvbGxUbyh3aW5kb3cucGFnZVhPZmZzZXQsIHRvcCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkpIHsKICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCA9IHRvcDsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgbnVtYmVyIG9mIHBpeGVscyB0aGF0IHRoZSBjb250ZW50IG9mIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQgdG8gdGhlCiAgICAgICAqIGxlZnQuCiAgICAgICAqCiAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAqLwogICAgICBzZXQgX3Njcm9sbExlZnQobGVmdCkgewogICAgICAgIGlmICh0aGlzLnNjcm9sbFRhcmdldCA9PT0gdGhpcy5fZG9jKSB7CiAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8obGVmdCwgd2luZG93LnBhZ2VZT2Zmc2V0KTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSkgewogICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdCA9IGxlZnQ7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNjcm9sbHMgdGhlIGNvbnRlbnQgdG8gYSBwYXJ0aWN1bGFyIHBsYWNlLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHNjcm9sbAogICAgICAgKiBAcGFyYW0ge251bWJlcnwhe2xlZnQ6IG51bWJlciwgdG9wOiBudW1iZXJ9fSBsZWZ0T3JPcHRpb25zIFRoZSBsZWZ0IHBvc2l0aW9uIG9yIHNjcm9sbCBvcHRpb25zCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gdG9wIFRoZSB0b3AgcG9zaXRpb24KICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIHNjcm9sbDogZnVuY3Rpb24obGVmdE9yT3B0aW9ucywgdG9wKSB7CiAgICAgICAgdmFyIGxlZnQ7CgogICAgICAgIGlmICh0eXBlb2YgbGVmdE9yT3B0aW9ucyA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgIGxlZnQgPSBsZWZ0T3JPcHRpb25zLmxlZnQ7CiAgICAgICAgICB0b3AgPSBsZWZ0T3JPcHRpb25zLnRvcDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbGVmdCA9IGxlZnRPck9wdGlvbnM7CiAgICAgICAgfQoKICAgICAgICBsZWZ0ID0gbGVmdCB8fCAwOwogICAgICAgIHRvcCA9IHRvcCB8fCAwOwogICAgICAgIGlmICh0aGlzLnNjcm9sbFRhcmdldCA9PT0gdGhpcy5fZG9jKSB7CiAgICAgICAgICB3aW5kb3cuc2Nyb2xsVG8obGVmdCwgdG9wKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2lzVmFsaWRTY3JvbGxUYXJnZXQoKSkgewogICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdCA9IGxlZnQ7CiAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPSB0b3A7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEdldHMgdGhlIHdpZHRoIG9mIHRoZSBzY3JvbGwgdGFyZ2V0LgogICAgICAgKgogICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IF9zY3JvbGxUYXJnZXRXaWR0aCgpIHsKICAgICAgICBpZiAodGhpcy5faXNWYWxpZFNjcm9sbFRhcmdldCgpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUYXJnZXQgPT09IHRoaXMuX2RvYyA/IHdpbmRvdy5pbm5lcldpZHRoIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0V2lkdGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEdldHMgdGhlIGhlaWdodCBvZiB0aGUgc2Nyb2xsIHRhcmdldC4KICAgICAgICoKICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICovCiAgICAgIGdldCBfc2Nyb2xsVGFyZ2V0SGVpZ2h0KCkgewogICAgICAgIGlmICh0aGlzLl9pc1ZhbGlkU2Nyb2xsVGFyZ2V0KCkpIHsKICAgICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRhcmdldCA9PT0gdGhpcy5fZG9jID8gd2luZG93LmlubmVySGVpZ2h0IDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQub2Zmc2V0SGVpZ2h0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gMDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNjcm9sbCB0YXJnZXQgaXMgYSB2YWxpZCBIVE1MRWxlbWVudC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICovCiAgICAgIF9pc1ZhbGlkU2Nyb2xsVGFyZ2V0OiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxUYXJnZXQgaW5zdGFuY2VvZiBIVE1MRWxlbWVudDsKICAgICAgfSwKCiAgICAgIF90b2dnbGVTY3JvbGxMaXN0ZW5lcjogZnVuY3Rpb24oeWVzLCBzY3JvbGxUYXJnZXQpIHsKICAgICAgICB2YXIgZXZlbnRUYXJnZXQgPSBzY3JvbGxUYXJnZXQgPT09IHRoaXMuX2RvYyA/IHdpbmRvdyA6IHNjcm9sbFRhcmdldDsKICAgICAgICBpZiAoeWVzKSB7CiAgICAgICAgICBpZiAoIXRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcikgewogICAgICAgICAgICB0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIgPSB0aGlzLl9zY3JvbGxIYW5kbGVyLmJpbmQodGhpcyk7CiAgICAgICAgICAgIGV2ZW50VGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX2JvdW5kU2Nyb2xsSGFuZGxlcik7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh0aGlzLl9ib3VuZFNjcm9sbEhhbmRsZXIpIHsKICAgICAgICAgICAgZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyKTsKICAgICAgICAgICAgdGhpcy5fYm91bmRTY3JvbGxIYW5kbGVyID0gbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHllcyBUcnVlIHRvIGFkZCB0aGUgZXZlbnQsIEZhbHNlIHRvIHJlbW92ZSBpdC4KICAgICAgICovCiAgICAgIHRvZ2dsZVNjcm9sbExpc3RlbmVyOiBmdW5jdGlvbih5ZXMpIHsKICAgICAgICB0aGlzLl9zaG91bGRIYXZlTGlzdGVuZXIgPSB5ZXM7CiAgICAgICAgdGhpcy5fdG9nZ2xlU2Nyb2xsTGlzdGVuZXIoeWVzLCB0aGlzLnNjcm9sbFRhcmdldCk7CiAgICAgIH0KCiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNiBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIHZhciBJT1MgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OmhvbmV8YWQ7KD86IFU7KT8gQ1BVKSBPUyAoXGQrKS8pOwogICAgdmFyIElPU19UT1VDSF9TQ1JPTExJTkcgPSBJT1MgJiYgSU9TWzFdID49IDg7CiAgICB2YXIgREVGQVVMVF9QSFlTSUNBTF9DT1VOVCA9IDM7CiAgICB2YXIgSElEREVOX1kgPSAnLTEwMDAwcHgnOwogICAgdmFyIFNFQ1JFVF9UQUJJTkRFWCA9IC0xMDA7CgogICAgLyoqCgogICAgYGlyb24tbGlzdGAgZGlzcGxheXMgYSB2aXJ0dWFsLCAnaW5maW5pdGUnIGxpc3QuIFRoZSB0ZW1wbGF0ZSBpbnNpZGUKICAgIHRoZSBpcm9uLWxpc3QgZWxlbWVudCByZXByZXNlbnRzIHRoZSBET00gdG8gY3JlYXRlIGZvciBlYWNoIGxpc3QgaXRlbS4KICAgIFRoZSBgaXRlbXNgIHByb3BlcnR5IHNwZWNpZmllcyBhbiBhcnJheSBvZiBsaXN0IGl0ZW0gZGF0YS4KCiAgICBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgbm90IGV2ZXJ5IGl0ZW0gaW4gdGhlIGxpc3QgaXMgcmVuZGVyZWQgYXQgb25jZTsKICAgIGluc3RlYWQgYSBzbWFsbCBzdWJzZXQgb2YgYWN0dWFsIHRlbXBsYXRlIGVsZW1lbnRzICooZW5vdWdoIHRvIGZpbGwgdGhlCiAgICB2aWV3cG9ydCkqIGFyZSByZW5kZXJlZCBhbmQgcmV1c2VkIGFzIHRoZSB1c2VyIHNjcm9sbHMuIEFzIHN1Y2gsIGl0IGlzIGltcG9ydGFudAogICAgdGhhdCBhbGwgc3RhdGUgb2YgdGhlIGxpc3QgdGVtcGxhdGUgaXMgYm91bmQgdG8gdGhlIG1vZGVsIGRyaXZpbmcgaXQsIHNpbmNlIHRoZQogICAgdmlldyBtYXkgYmUgcmV1c2VkIHdpdGggYSBuZXcgbW9kZWwgYXQgYW55IHRpbWUuIFBhcnRpY3VsYXJseSwgYW55IHN0YXRlIHRoYXQKICAgIG1heSBjaGFuZ2UgYXMgdGhlIHJlc3VsdCBvZiBhIHVzZXIgaW50ZXJhY3Rpb24gd2l0aCB0aGUgbGlzdCBpdGVtIG11c3QgYmUgYm91bmQKICAgIHRvIHRoZSBtb2RlbCB0byBhdm9pZCB2aWV3IHN0YXRlIGluY29uc2lzdGVuY3kuCgogICAgIyMjIFNpemluZyBpcm9uLWxpc3QKCiAgICBgaXJvbi1saXN0YCBtdXN0IGVpdGhlciBiZSBleHBsaWNpdGx5IHNpemVkLCBvciBkZWxlZ2F0ZSBzY3JvbGxpbmcgdG8gYW4KICAgIGV4cGxpY2l0bHkgc2l6ZWQgcGFyZW50LiBCeSAiZXhwbGljaXRseSBzaXplZCIsIHdlIG1lYW4gaXQgZWl0aGVyIGhhcyBhbgogICAgZXhwbGljaXQgQ1NTIGBoZWlnaHRgIHByb3BlcnR5IHNldCB2aWEgYSBjbGFzcyBvciBpbmxpbmUgc3R5bGUsIG9yIGVsc2UgaXMgc2l6ZWQKICAgIGJ5IG90aGVyIGxheW91dCBtZWFucyAoZS5nLiB0aGUgYGZsZXhgIG9yIGBmaXRgIGNsYXNzZXMpLgoKICAgICMjIyMgRmxleGJveCAtIFtqc2Jpbl0oaHR0cHM6Ly9qc2Jpbi5jb20vdmVqb25pL2VkaXQ/aHRtbCxvdXRwdXQpCgogICAgYGBgaHRtbAogICAgPHRlbXBsYXRlIGlzPSJ4LWxpc3QiPgogICAgICA8c3R5bGU+CiAgICAgICAgOmhvc3QgewogICAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgICBoZWlnaHQ6IDEwMHZoOwogICAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgfQoKICAgICAgICBpcm9uLWxpc3QgewogICAgICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8YXBwLXRvb2xiYXI+QXBwIG5hbWU8L2FwcC10b29sYmFyPgogICAgICA8aXJvbi1saXN0IGl0ZW1zPSJbW2l0ZW1zXV0iPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIC4uLgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9pcm9uLWxpc3Q+CiAgICA8L3RlbXBsYXRlPgogICAgYGBgCiAgICAjIyMjIEV4cGxpY2l0IHNpemUgLSBbanNiaW5dKGh0dHBzOi8vanNiaW4uY29tL3ZvcHVjdXMvZWRpdD9odG1sLG91dHB1dCkKICAgIGBgYGh0bWwKICAgIDx0ZW1wbGF0ZSBpcz0ieC1saXN0Ij4KICAgICAgPHN0eWxlPgogICAgICAgIDpob3N0IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIH0KCiAgICAgICAgaXJvbi1saXN0IHsKICAgICAgICAgIGhlaWdodDogMTAwdmg7IC8qIGRvbid0IHVzZSAlIHZhbHVlcyB1bmxlc3MgdGhlIHBhcmVudCBlbGVtZW50IGlzIHNpemVkLgogICAgKlwvCiAgICAgICAgfQogICAgICA8L3N0eWxlPgogICAgICA8aXJvbi1saXN0IGl0ZW1zPSJbW2l0ZW1zXV0iPgogICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgIC4uLgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9pcm9uLWxpc3Q+CiAgICA8L3RlbXBsYXRlPgogICAgYGBgCiAgICAjIyMjIE1haW4gZG9jdW1lbnQgc2Nyb2xsaW5nIC0KICAgIFtqc2Jpbl0oaHR0cHM6Ly9qc2Jpbi5jb20vd2V2aXJvdy9lZGl0P2h0bWwsb3V0cHV0KQogICAgYGBgaHRtbAogICAgPGhlYWQ+CiAgICAgIDxzdHlsZT4KICAgICAgICBib2R5IHsKICAgICAgICAgIGhlaWdodDogMTAwdmg7CiAgICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB9CgogICAgICAgIGFwcC10b29sYmFyIHsKICAgICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICAgIHRvcDogMDsKICAgICAgICAgIGxlZnQ6IDA7CiAgICAgICAgICByaWdodDogMDsKICAgICAgICB9CgogICAgICAgIGlyb24tbGlzdCB7CiAgICAgICAgICAvKiBhZGQgcGFkZGluZyBzaW5jZSB0aGUgYXBwLXRvb2xiYXIgaXMgZml4ZWQgYXQgdGhlIHRvcCAqXC8KICAgICAgICAgIHBhZGRpbmctdG9wOiA2NHB4OwogICAgICAgIH0KICAgICAgPC9zdHlsZT4KICAgIDwvaGVhZD4KICAgIDxib2R5PgogICAgICA8YXBwLXRvb2xiYXI+QXBwIG5hbWU8L2FwcC10b29sYmFyPgogICAgICA8aXJvbi1saXN0IHNjcm9sbC10YXJnZXQ9ImRvY3VtZW50Ij4KICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICAuLi4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaXJvbi1saXN0PgogICAgPC9ib2R5PgogICAgYGBgCgogICAgYGlyb24tbGlzdGAgbXVzdCBiZSBnaXZlbiBhIGA8dGVtcGxhdGU+YCB3aGljaCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50LiBJbgogICAgdGhlIGV4YW1wbGVzIGFib3ZlIHdlIHVzZWQgYSBgPGRpdj5gLCBidXQgeW91IGNhbiBwcm92aWRlIGFueSBlbGVtZW50IChpbmNsdWRpbmcKICAgIGN1c3RvbSBlbGVtZW50cykuCgogICAgIyMjIFRlbXBsYXRlIG1vZGVsCgogICAgTGlzdCBpdGVtIHRlbXBsYXRlcyBzaG91bGQgYmluZCB0byB0ZW1wbGF0ZSBtb2RlbHMgb2YgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CgogICAgYGBganMKICAgIHsKICAgICAgaW5kZXg6IDAsICAgICAgICAvLyBpbmRleCBpbiB0aGUgaXRlbSBhcnJheQogICAgICBzZWxlY3RlZDogZmFsc2UsIC8vIHRydWUgaWYgdGhlIGN1cnJlbnQgaXRlbSBpcyBzZWxlY3RlZAogICAgICB0YWJJbmRleDogLTEsICAgIC8vIGEgZHluYW1pY2FsbHkgZ2VuZXJhdGVkIHRhYkluZGV4IGZvciBmb2N1cyBtYW5hZ2VtZW50CiAgICAgIGl0ZW06IHt9ICAgICAgICAgLy8gdXNlciBkYXRhIGNvcnJlc3BvbmRpbmcgdG8gaXRlbXNbaW5kZXhdCiAgICB9CiAgICBgYGAKCiAgICBBbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIGNoYW5nZSB0aGUgcHJvcGVydHkgbmFtZSB1c2VkIGFzIGRhdGEgaW5kZXggYnkgY2hhbmdpbmcKICAgIHRoZSBgaW5kZXhBc2AgcHJvcGVydHkuIFRoZSBgYXNgIHByb3BlcnR5IGRlZmluZXMgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIHRvCiAgICBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheS4KCiAgICBGb3IgZXhhbXBsZSwgZ2l2ZW4gdGhlIGZvbGxvd2luZyBgZGF0YWAgYXJyYXk6CgogICAgIyMjIyMgZGF0YS5qc29uCgogICAgYGBganMKICAgIFsKICAgICAgeyJuYW1lIjogIkJvYiJ9LAogICAgICB7Im5hbWUiOiAiVGltIn0sCiAgICAgIHsibmFtZSI6ICJNaWtlIn0KICAgIF0KICAgIGBgYAoKICAgIFRoZSBmb2xsb3dpbmcgY29kZSB3b3VsZCByZW5kZXIgdGhlIGxpc3QgKG5vdGUgdGhlIG5hbWUgcHJvcGVydHkgaXMgYm91bmQgZnJvbQogICAgdGhlIG1vZGVsIG9iamVjdCBwcm92aWRlZCB0byB0aGUgdGVtcGxhdGUgc2NvcGUpOgoKICAgIGBgYGh0bWwKICAgIDxpcm9uLWFqYXggdXJsPSJkYXRhLmpzb24iIGxhc3QtcmVzcG9uc2U9Int7ZGF0YX19IiBhdXRvPjwvaXJvbi1hamF4PgogICAgPGlyb24tbGlzdCBpdGVtcz0iW1tkYXRhXV0iIGFzPSJpdGVtIj4KICAgICAgPHRlbXBsYXRlPgogICAgICAgIDxkaXY+CiAgICAgICAgICBOYW1lOiBbW2l0ZW0ubmFtZV1dCiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tbGlzdD4KICAgIGBgYAoKICAgICMjIyBHcmlkIGxheW91dAoKICAgIGBpcm9uLWxpc3RgIHN1cHBvcnRzIGEgZ3JpZCBsYXlvdXQgaW4gYWRkaXRpb24gdG8gbGluZWFyIGxheW91dCBieSBzZXR0aW5nCiAgICB0aGUgYGdyaWRgIGF0dHJpYnV0ZS4gIEluIHRoaXMgY2FzZSwgdGhlIGxpc3QgdGVtcGxhdGUgaXRlbSBtdXN0IGhhdmUgYm90aCBmaXhlZAogICAgd2lkdGggYW5kIGhlaWdodCAoZS5nLiB2aWEgQ1NTKS4gQmFzZWQgb24gdGhpcywgdGhlIG51bWJlciBvZiBpdGVtcwogICAgcGVyIHJvdyBhcmUgZGV0ZXJtaW5lZCBhdXRvbWF0aWNhbGx5IGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSBsaXN0IHZpZXdwb3J0LgoKICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgYGlyb24tbGlzdGAgYXV0b21hdGljYWxseSBtYW5hZ2VzIHRoZSBmb2N1cyBzdGF0ZSBmb3IgdGhlIGl0ZW1zLiBJdCBhbHNvCiAgICBwcm92aWRlcyBhIGB0YWJJbmRleGAgcHJvcGVydHkgd2l0aGluIHRoZSB0ZW1wbGF0ZSBzY29wZSB0aGF0IGNhbiBiZSB1c2VkIGZvcgogICAga2V5Ym9hcmQgbmF2aWdhdGlvbi4gRm9yIGV4YW1wbGUsIHVzZXJzIGNhbiBwcmVzcyB0aGUgdXAgYW5kIGRvd24ga2V5cyB0byBtb3ZlCiAgICB0byBwcmV2aW91cyBhbmQgbmV4dCBpdGVtcyBpbiB0aGUgbGlzdDoKCiAgICBgYGBodG1sCiAgICA8aXJvbi1saXN0IGl0ZW1zPSJbW2RhdGFdXSIgYXM9Iml0ZW0iPgogICAgICA8dGVtcGxhdGU+CiAgICAgICAgPGRpdiB0YWJpbmRleCQ9IltbdGFiSW5kZXhdXSI+CiAgICAgICAgICBOYW1lOiBbW2l0ZW0ubmFtZV1dCiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2lyb24tbGlzdD4KICAgIGBgYAoKICAgICMjIyBTdHlsaW5nCgogICAgWW91IGNhbiB1c2UgdGhlIGAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXJgIG1peGluIHRvIHN0eWxlIHRoZSBjb250YWluZXIgb2YKICAgIGl0ZW1zOgoKICAgIGBgYGNzcwogICAgaXJvbi1saXN0IHsKICAgICAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI6IHsKICAgICAgICBtYXJnaW46IGF1dG87CiAgICAgIH07CiAgICB9CiAgICBgYGAKCiAgICAjIyMgUmVzaXppbmcKCiAgICBgaXJvbi1saXN0YCBsYXlzIG91dCB0aGUgaXRlbXMgd2hlbiBpdCByZWNlaXZlcyBhIG5vdGlmaWNhdGlvbiB2aWEgdGhlCiAgICBgaXJvbi1yZXNpemVgIGV2ZW50LiBUaGlzIGV2ZW50IGlzIGZpcmVkIGJ5IGFueSBlbGVtZW50IHRoYXQgaW1wbGVtZW50cwogICAgYElyb25SZXNpemFibGVCZWhhdmlvcmAuCgogICAgQnkgZGVmYXVsdCwgZWxlbWVudHMgc3VjaCBhcyBgaXJvbi1wYWdlc2AsIGBwYXBlci10YWJzYCBvciBgcGFwZXItZGlhbG9nYCB3aWxsCiAgICB0cmlnZ2VyIHRoaXMgZXZlbnQgYXV0b21hdGljYWxseS4gSWYgeW91IGhpZGUgdGhlIGxpc3QgbWFudWFsbHkgKGUuZy4geW91IHVzZQogICAgYGRpc3BsYXk6IG5vbmVgKSB5b3UgbWlnaHQgd2FudCB0byBpbXBsZW1lbnQgYElyb25SZXNpemFibGVCZWhhdmlvcmAgb3IgZmlyZQogICAgdGhpcyBldmVudCBtYW51YWxseSByaWdodCBhZnRlciB0aGUgbGlzdCBiZWNhbWUgdmlzaWJsZSBhZ2Fpbi4gRm9yIGV4YW1wbGU6CgogICAgYGBganMKICAgIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2lyb24tbGlzdCcpLmZpcmUoJ2lyb24tcmVzaXplJyk7CiAgICBgYGAKCiAgICAjIyMgV2hlbiBzaG91bGQgYDxpcm9uLWxpc3Q+YCBiZSB1c2VkPwoKICAgIGBpcm9uLWxpc3RgIHNob3VsZCBiZSB1c2VkIHdoZW4gYSBwYWdlIGhhcyBzaWduaWZpY2FudGx5IG1vcmUgRE9NIG5vZGVzIHRoYW4gdGhlCiAgICBvbmVzIHZpc2libGUgb24gdGhlIHNjcmVlbi4gZS5nLiB0aGUgcGFnZSBoYXMgNTAwIG5vZGVzLCBidXQgb25seSAyMCBhcmUgdmlzaWJsZQogICAgYXQgYSB0aW1lLiBUaGlzIGlzIHdoeSB3ZSByZWZlciB0byBpdCBhcyBhIGB2aXJ0dWFsYCBsaXN0LiBJbiB0aGlzIGNhc2UsIGEKICAgIGBkb20tcmVwZWF0YCB3aWxsIHN0aWxsIGNyZWF0ZSA1MDAgbm9kZXMgd2hpY2ggY291bGQgc2xvdyBkb3duIHRoZSB3ZWIgYXBwLCBidXQKICAgIGBpcm9uLWxpc3RgIHdpbGwgb25seSBjcmVhdGUgMjAuCgogICAgSG93ZXZlciwgaGF2aW5nIGFuIGBpcm9uLWxpc3RgIGRvZXMgbm90IG1lYW4gdGhhdCB5b3UgY2FuIGxvYWQgYWxsIHRoZSBkYXRhIGF0CiAgICBvbmNlLiBTYXkgeW91IGhhdmUgYSBtaWxsaW9uIHJlY29yZHMgaW4gdGhlIGRhdGFiYXNlLCB5b3Ugd2FudCB0byBzcGxpdCB0aGUgZGF0YQogICAgaW50byBwYWdlcyBzbyB5b3UgY2FuIGJyaW5nIGluIGEgcGFnZSBhdCB0aGUgdGltZS4gVGhlIHBhZ2UgY291bGQgY29udGFpbiA1MDAKICAgIGl0ZW1zLCBhbmQgaXJvbi1saXN0IHdpbGwgb25seSByZW5kZXIgMjAuCgogICAgQGVsZW1lbnQgaXJvbi1saXN0CiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIEBtZWRpYSBvbmx5IHNjcmVlbiBhbmQgKC13ZWJraXQtbWF4LWRldmljZS1waXhlbC1yYXRpbzogMSkgewogICAgICAgIDpob3N0IHsKICAgICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgfQogICAgICB9CgogICAgICAjaXRlbXMgewogICAgICAgIEBhcHBseSAtLWlyb24tbGlzdC1pdGVtcy1jb250YWluZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtncmlkXSkpICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNpdGVtcyA+IDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxhcnJheS1zZWxlY3RvciBpZD0ic2VsZWN0b3IiIGl0ZW1zPSJ7e2l0ZW1zfX0iIHNlbGVjdGVkPSJ7e3NlbGVjdGVkSXRlbXN9fSIgc2VsZWN0ZWQtaXRlbT0ie3tzZWxlY3RlZEl0ZW19fSI+PC9hcnJheS1zZWxlY3Rvcj4KCiAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgIDxzbG90Pjwvc2xvdD4KICAgIDwvZGl2PgpgLAoKICAgICAgaXM6ICdpcm9uLWxpc3QnLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBBbiBhcnJheSBjb250YWluaW5nIGl0ZW1zIGRldGVybWluaW5nIGhvdyBtYW55IGluc3RhbmNlcyBvZiB0aGUgdGVtcGxhdGUKICAgICAgICAgKiB0byBzdGFtcCBhbmQgdGhhdCB0aGF0IGVhY2ggdGVtcGxhdGUgaW5zdGFuY2Ugc2hvdWxkIGJpbmQgdG8uCiAgICAgICAgICovCiAgICAgICAgaXRlbXM6IHt0eXBlOiBBcnJheX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBuYW1lIG9mIHRoZSB2YXJpYWJsZSB0byBhZGQgdG8gdGhlIGJpbmRpbmcgc2NvcGUgZm9yIHRoZSBhcnJheQogICAgICAgICAqIGVsZW1lbnQgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gdGVtcGxhdGUgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgYXM6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnaXRlbSd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHdpdGggdGhlIGluZGV4CiAgICAgICAgICogZm9yIHRoZSByb3cuCiAgICAgICAgICovCiAgICAgICAgaW5kZXhBczoge3R5cGU6IFN0cmluZywgdmFsdWU6ICdpbmRleCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGUgdmFyaWFibGUgdG8gYWRkIHRvIHRoZSBiaW5kaW5nIHNjb3BlIHRvIGluZGljYXRlCiAgICAgICAgICogaWYgdGhlIHJvdyBpcyBzZWxlY3RlZC4KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZEFzOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ3NlbGVjdGVkJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdHJ1ZSwgdGhlIGxpc3QgaXMgcmVuZGVyZWQgYXMgYSBncmlkLiBHcmlkIGl0ZW1zIG11c3QgaGF2ZQogICAgICAgICAqIGZpeGVkIHdpZHRoIGFuZCBoZWlnaHQgc2V0IHZpYSBDU1MuIGUuZy4KICAgICAgICAgKgogICAgICAgICAqIGBgYGh0bWwKICAgICAgICAgKiA8aXJvbi1saXN0IGdyaWQ+CiAgICAgICAgICogICA8dGVtcGxhdGU+CiAgICAgICAgICogICAgICA8ZGl2IHN0eWxlPSJ3aWR0aDogMTAwcHg7IGhlaWdodDogMTAwcHg7Ij4gMTAweDEwMCA8L2Rpdj4KICAgICAgICAgKiAgIDwvdGVtcGxhdGU+CiAgICAgICAgICogPC9pcm9uLWxpc3Q+CiAgICAgICAgICogYGBgCiAgICAgICAgICovCiAgICAgICAgZ3JpZDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgIG9ic2VydmVyOiAnX2dyaWRDaGFuZ2VkJwogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gdHJ1ZSwgdGFwcGluZyBhIHJvdyB3aWxsIHNlbGVjdCB0aGUgaXRlbSwgcGxhY2luZyBpdHMgZGF0YSBtb2RlbAogICAgICAgICAqIGluIHRoZSBzZXQgb2Ygc2VsZWN0ZWQgaXRlbXMgcmV0cmlldmFibGUgdmlhIHRoZSBzZWxlY3Rpb24gcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlIHRoYXQgdGFwcGluZyBmb2N1c2FibGUgZWxlbWVudHMgd2l0aGluIHRoZSBsaXN0IGl0ZW0gd2lsbCBub3QKICAgICAgICAgKiByZXN1bHQgaW4gc2VsZWN0aW9uLCBzaW5jZSB0aGV5IGFyZSBwcmVzdW1lZCB0byBoYXZlIHRoZWlyICogb3duIGFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBzZWxlY3Rpb25FbmFibGVkOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgbXVsdGlTZWxlY3Rpb25gIGlzIGZhbHNlLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbSwgb3IKICAgICAgICAgKiBgbnVsbGAgaWYgbm8gaXRlbSBpcyBzZWxlY3RlZC4KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZEl0ZW06IHt0eXBlOiBPYmplY3QsIG5vdGlmeTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gYG11bHRpU2VsZWN0aW9uYCBpcyB0cnVlLCB0aGlzIGlzIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlCiAgICAgICAgICogc2VsZWN0ZWQgaXRlbXMuCiAgICAgICAgICovCiAgICAgICAgc2VsZWN0ZWRJdGVtczoge3R5cGU6IE9iamVjdCwgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBgdHJ1ZWAsIG11bHRpcGxlIGl0ZW1zIG1heSBiZSBzZWxlY3RlZCBhdCBvbmNlIChpbiB0aGlzIGNhc2UsCiAgICAgICAgICogYHNlbGVjdGVkYCBpcyBhbiBhcnJheSBvZiBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbXMpLiAgV2hlbiBgZmFsc2VgLAogICAgICAgICAqIG9ubHkgb25lIGl0ZW0gbWF5IGJlIHNlbGVjdGVkIGF0IGEgdGltZS4KICAgICAgICAgKi8KICAgICAgICBtdWx0aVNlbGVjdGlvbjoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBvZmZzZXQgdG9wIGZyb20gdGhlIHNjcm9sbGluZyBlbGVtZW50IHRvIHRoZSBpcm9uLWxpc3QgZWxlbWVudC4KICAgICAgICAgKiBUaGlzIHZhbHVlIGNhbiBiZSBjb21wdXRlZCB1c2luZyB0aGUgcG9zaXRpb24gcmV0dXJuZWQgYnkKICAgICAgICAgKiBgZ2V0Qm91bmRpbmdDbGllbnRSZWN0KClgIGFsdGhvdWdoIGl0J3MgcHJlZmVycmVkIHRvIHVzZSBhIGNvbnN0YW50IHZhbHVlCiAgICAgICAgICogd2hlbiBwb3NzaWJsZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgdXNlZnVsIHdoZW4gYW4gZXh0ZXJuYWwgc2Nyb2xsaW5nIGVsZW1lbnQgaXMgdXNlZCBhbmQKICAgICAgICAgKiB0aGVyZSdzIHNvbWUgb2Zmc2V0IGJldHdlZW4gdGhlIHNjcm9sbGluZyBlbGVtZW50IGFuZCB0aGUgbGlzdC4gRm9yCiAgICAgICAgICogZXhhbXBsZTogYSBoZWFkZXIgaXMgcGxhY2VkIGFib3ZlIHRoZSBsaXN0LgogICAgICAgICAqLwogICAgICAgIHNjcm9sbE9mZnNldDoge3R5cGU6IE51bWJlciwgdmFsdWU6IDB9CiAgICAgIH0sCgogICAgICBvYnNlcnZlcnM6IFsKICAgICAgICAnX2l0ZW1zQ2hhbmdlZChpdGVtcy4qKScsCiAgICAgICAgJ19zZWxlY3Rpb25FbmFibGVkQ2hhbmdlZChzZWxlY3Rpb25FbmFibGVkKScsCiAgICAgICAgJ19tdWx0aVNlbGVjdGlvbkNoYW5nZWQobXVsdGlTZWxlY3Rpb24pJywKICAgICAgICAnX3NldE92ZXJmbG93KHNjcm9sbFRhcmdldCwgc2Nyb2xsT2Zmc2V0KScKICAgICAgXSwKCiAgICAgIGJlaGF2aW9yczogWwogICAgICAgIFRlbXBsYXRpemVyLAogICAgICAgIElyb25SZXNpemFibGVCZWhhdmlvciwKICAgICAgICBJcm9uU2Nyb2xsVGFyZ2V0QmVoYXZpb3IsCiAgICAgICAgT3B0aW9uYWxNdXRhYmxlRGF0YUJlaGF2aW9yCiAgICAgIF0sCgogICAgICAvKioKICAgICAgICogVGhlIHJhdGlvIG9mIGhpZGRlbiB0aWxlcyB0aGF0IHNob3VsZCByZW1haW4gaW4gdGhlIHNjcm9sbCBkaXJlY3Rpb24uCiAgICAgICAqIFJlY29tbWVuZGVkIHZhbHVlIH4wLjUsIHNvIGl0IHdpbGwgZGlzdHJpYnV0ZSB0aWxlcyBldmVubHkgaW4gYm90aAogICAgICAgKiBkaXJlY3Rpb25zLgogICAgICAgKi8KICAgICAgX3JhdGlvOiAwLjUsCgogICAgICAvKioKICAgICAgICogVGhlIHBhZGRpbmctdG9wIHZhbHVlIGZvciB0aGUgbGlzdC4KICAgICAgICovCiAgICAgIF9zY3JvbGxlclBhZGRpbmdUb3A6IDAsCgogICAgICAvKioKICAgICAgICogVGhpcyB2YWx1ZSBpcyBhIGNhY2hlZCB2YWx1ZSBvZiBgc2Nyb2xsVG9wYCBmcm9tIHRoZSBsYXN0IGBzY3JvbGxgIGV2ZW50LgogICAgICAgKi8KICAgICAgX3Njcm9sbFBvc2l0aW9uOiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBzdW0gb2YgdGhlIGhlaWdodHMgb2YgYWxsIHRoZSB0aWxlcyBpbiB0aGUgRE9NLgogICAgICAgKi8KICAgICAgX3BoeXNpY2FsU2l6ZTogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgYXZlcmFnZSBgb2Zmc2V0SGVpZ2h0YCBvZiB0aGUgdGlsZXMgb2JzZXJ2ZWQgdGlsbCBub3cuCiAgICAgICAqLwogICAgICBfcGh5c2ljYWxBdmVyYWdlOiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBudW1iZXIgb2YgdGlsZXMgd2hpY2ggYG9mZnNldEhlaWdodGAgPiAwIG9ic2VydmVkIHVudGlsIG5vdy4KICAgICAgICovCiAgICAgIF9waHlzaWNhbEF2ZXJhZ2VDb3VudDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgWSBwb3NpdGlvbiBvZiB0aGUgaXRlbSByZW5kZXJlZCBpbiB0aGUgYF9waHlzaWNhbFN0YXJ0YAogICAgICAgKiB0aWxlIHJlbGF0aXZlIHRvIHRoZSBzY3JvbGxpbmcgbGlzdC4KICAgICAgICovCiAgICAgIF9waHlzaWNhbFRvcDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBsaXN0LgogICAgICAgKi8KICAgICAgX3ZpcnR1YWxDb3VudDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgZXN0aW1hdGVkIHNjcm9sbCBoZWlnaHQgYmFzZWQgb24gYF9waHlzaWNhbEF2ZXJhZ2VgCiAgICAgICAqLwogICAgICBfZXN0U2Nyb2xsSGVpZ2h0OiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBzY3JvbGwgaGVpZ2h0IG9mIHRoZSBkb20gbm9kZQogICAgICAgKi8KICAgICAgX3Njcm9sbEhlaWdodDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSBsaXN0LiBUaGlzIGlzIHJlZmVycmVkIGFzIHRoZSB2aWV3cG9ydCBpbiB0aGUgY29udGV4dCBvZgogICAgICAgKiBsaXN0LgogICAgICAgKi8KICAgICAgX3ZpZXdwb3J0SGVpZ2h0OiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSB3aWR0aCBvZiB0aGUgbGlzdC4gVGhpcyBpcyByZWZlcnJlZCBhcyB0aGUgdmlld3BvcnQgaW4gdGhlIGNvbnRleHQgb2YKICAgICAgICogbGlzdC4KICAgICAgICovCiAgICAgIF92aWV3cG9ydFdpZHRoOiAwLAoKICAgICAgLyoqCiAgICAgICAqIEFuIGFycmF5IG9mIERPTSBub2RlcyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdGhlIHRyZWUKICAgICAgICogQHR5cGUgez9BcnJheTwhSFRNTEVsZW1lbnQ+fQogICAgICAgKi8KICAgICAgX3BoeXNpY2FsSXRlbXM6IG51bGwsCgogICAgICAvKioKICAgICAgICogQW4gYXJyYXkgb2YgaGVpZ2h0cyBmb3IgZWFjaCBpdGVtIGluIGBfcGh5c2ljYWxJdGVtc2AKICAgICAgICogQHR5cGUgez9BcnJheTxudW1iZXI+fQogICAgICAgKi8KICAgICAgX3BoeXNpY2FsU2l6ZXM6IG51bGwsCgogICAgICAvKioKICAgICAgICogQSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBmaXJzdCB2aXNpYmxlIGluZGV4LgogICAgICAgKiBTZWUgYGZpcnN0VmlzaWJsZUluZGV4YAogICAgICAgKiBAdHlwZSB7P251bWJlcn0KICAgICAgICovCiAgICAgIF9maXJzdFZpc2libGVJbmRleFZhbDogbnVsbCwKCiAgICAgIC8qKgogICAgICAgKiBBIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGxhc3QgdmlzaWJsZSBpbmRleC4KICAgICAgICogU2VlIGBsYXN0VmlzaWJsZUluZGV4YAogICAgICAgKiBAdHlwZSB7P251bWJlcn0KICAgICAgICovCiAgICAgIF9sYXN0VmlzaWJsZUluZGV4VmFsOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBtYXggbnVtYmVyIG9mIHBhZ2VzIHRvIHJlbmRlci4gT25lIHBhZ2UgaXMgZXF1aXZhbGVudCB0byB0aGUgaGVpZ2h0IG9mCiAgICAgICAqIHRoZSBsaXN0LgogICAgICAgKi8KICAgICAgX21heFBhZ2VzOiAyLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBjdXJyZW50bHkgZm9jdXNlZCBwaHlzaWNhbCBpdGVtLgogICAgICAgKi8KICAgICAgX2ZvY3VzZWRJdGVtOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSB2aXJ0dWFsIGluZGV4IG9mIHRoZSBmb2N1c2VkIGl0ZW0uCiAgICAgICAqLwogICAgICBfZm9jdXNlZFZpcnR1YWxJbmRleDogLTEsCgogICAgICAvKioKICAgICAgICogVGhlIHBoeXNpY2FsIGluZGV4IG9mIHRoZSBmb2N1c2VkIGl0ZW0uCiAgICAgICAqLwogICAgICBfZm9jdXNlZFBoeXNpY2FsSW5kZXg6IC0xLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSB0aGUgaXRlbSB0aGF0IGlzIGZvY3VzZWQgaWYgaXQgaXMgbW92ZWQgb2Zmc2NyZWVuLgogICAgICAgKiBAcHJpdmF0ZSB7P0hUTUxFbGVtZW50fQogICAgICAgKi8KICAgICAgX29mZnNjcmVlbkZvY3VzZWRJdGVtOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBpdGVtIHRoYXQgYmFja2ZpbGxzIHRoZSBgX29mZnNjcmVlbkZvY3VzZWRJdGVtYCBpbiB0aGUgcGh5c2ljYWwgaXRlbXMKICAgICAgICogbGlzdCB3aGVuIHRoYXQgaXRlbSBpcyBtb3ZlZCBvZmZzY3JlZW4uCiAgICAgICAqIEB0eXBlIHs/SFRNTEVsZW1lbnR9CiAgICAgICAqLwogICAgICBfZm9jdXNCYWNrZmlsbEl0ZW06IG51bGwsCgogICAgICAvKioKICAgICAgICogVGhlIG1heGltdW0gaXRlbXMgcGVyIHJvdwogICAgICAgKi8KICAgICAgX2l0ZW1zUGVyUm93OiAxLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSB3aWR0aCBvZiBlYWNoIGdyaWQgaXRlbQogICAgICAgKi8KICAgICAgX2l0ZW1XaWR0aDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByb3cgaW4gZ3JpZCBsYXlvdXQuCiAgICAgICAqLwogICAgICBfcm93SGVpZ2h0OiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBjb3N0IG9mIHN0YW1waW5nIGEgdGVtcGxhdGUgaW4gbXMuCiAgICAgICAqLwogICAgICBfdGVtcGxhdGVDb3N0OiAwLAoKICAgICAgLyoqCiAgICAgICAqIE5lZWRlZCB0byBwYXNzIGV2ZW50Lm1vZGVsIHByb3BlcnR5IHRvIGRlY2xhcmF0aXZlIGV2ZW50IGhhbmRsZXJzIC0KICAgICAgICogc2VlIHBvbHltZXIvcG9seW1lciM0MzM5LgogICAgICAgKi8KICAgICAgX3BhcmVudE1vZGVsOiB0cnVlLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBib3R0b20gb2YgdGhlIHBoeXNpY2FsIGNvbnRlbnQuCiAgICAgICAqLwogICAgICBnZXQgX3BoeXNpY2FsQm90dG9tKCkgewogICAgICAgIHJldHVybiB0aGlzLl9waHlzaWNhbFRvcCArIHRoaXMuX3BoeXNpY2FsU2l6ZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgYm90dG9tIG9mIHRoZSBzY3JvbGwuCiAgICAgICAqLwogICAgICBnZXQgX3Njcm9sbEJvdHRvbSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsUG9zaXRpb24gKyB0aGlzLl92aWV3cG9ydEhlaWdodDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgbi10aCBpdGVtIHJlbmRlcmVkIGluIHRoZSBsYXN0IHBoeXNpY2FsIGl0ZW0uCiAgICAgICAqLwogICAgICBnZXQgX3ZpcnR1YWxFbmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCArIHRoaXMuX3BoeXNpY2FsQ291bnQgLSAxOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHBoeXNpY2FsIGNvbnRlbnQgdGhhdCBpc24ndCBvbiB0aGUgc2NyZWVuLgogICAgICAgKi8KICAgICAgZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpIHsKICAgICAgICB2YXIgc2l6ZSA9CiAgICAgICAgICAgIHRoaXMuZ3JpZCA/IHRoaXMuX3BoeXNpY2FsUm93cyAqIHRoaXMuX3Jvd0hlaWdodCA6IHRoaXMuX3BoeXNpY2FsU2l6ZTsKICAgICAgICByZXR1cm4gc2l6ZSAtIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBwYXJlbnQgbm9kZSBmb3IgdGhlIF91c2VyVGVtcGxhdGUuCiAgICAgICAqLwogICAgICBnZXQgX2l0ZW1zUGFyZW50KCkgewogICAgICAgIHJldHVybiBkb20oZG9tKHRoaXMuX3VzZXJUZW1wbGF0ZSkucGFyZW50Tm9kZSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhlIG1heGltdW0gc2Nyb2xsIHRvcCB2YWx1ZS4KICAgICAgICovCiAgICAgIGdldCBfbWF4U2Nyb2xsVG9wKCkgewogICAgICAgIHJldHVybiB0aGlzLl9lc3RTY3JvbGxIZWlnaHQgLSB0aGlzLl92aWV3cG9ydEhlaWdodCArIHRoaXMuX3Njcm9sbE9mZnNldDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgbGFyZ2VzdCBuLXRoIHZhbHVlIGZvciBhbiBpdGVtIHN1Y2ggdGhhdCBpdCBjYW4gYmUgcmVuZGVyZWQgaW4KICAgICAgICogYF9waHlzaWNhbFN0YXJ0YC4KICAgICAgICovCiAgICAgIGdldCBfbWF4VmlydHVhbFN0YXJ0KCkgewogICAgICAgIHZhciB2aXJ0dWFsQ291bnQgPSB0aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KHRoaXMuX3ZpcnR1YWxDb3VudCk7CiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIHZpcnR1YWxDb3VudCAtIHRoaXMuX3BoeXNpY2FsQ291bnQpOwogICAgICB9LAoKICAgICAgc2V0IF92aXJ0dWFsU3RhcnQodmFsKSB7CiAgICAgICAgdmFsID0gdGhpcy5fY2xhbXAodmFsLCAwLCB0aGlzLl9tYXhWaXJ0dWFsU3RhcnQpOwogICAgICAgIGlmICh0aGlzLmdyaWQpIHsKICAgICAgICAgIHZhbCA9IHZhbCAtICh2YWwgJSB0aGlzLl9pdGVtc1BlclJvdyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ZpcnR1YWxTdGFydFZhbCA9IHZhbDsKICAgICAgfSwKCiAgICAgIGdldCBfdmlydHVhbFN0YXJ0KCkgewogICAgICAgIHJldHVybiB0aGlzLl92aXJ0dWFsU3RhcnRWYWwgfHwgMDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgay10aCB0aWxlIHRoYXQgaXMgYXQgdGhlIHRvcCBvZiB0aGUgc2Nyb2xsaW5nIGxpc3QuCiAgICAgICAqLwogICAgICBzZXQgX3BoeXNpY2FsU3RhcnQodmFsKSB7CiAgICAgICAgdmFsID0gdmFsICUgdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgICBpZiAodmFsIDwgMCkgewogICAgICAgICAgdmFsID0gdGhpcy5fcGh5c2ljYWxDb3VudCArIHZhbDsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuZ3JpZCkgewogICAgICAgICAgdmFsID0gdmFsIC0gKHZhbCAlIHRoaXMuX2l0ZW1zUGVyUm93KTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcGh5c2ljYWxTdGFydFZhbCA9IHZhbDsKICAgICAgfSwKCiAgICAgIGdldCBfcGh5c2ljYWxTdGFydCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGh5c2ljYWxTdGFydFZhbCB8fCAwOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBrLXRoIHRpbGUgdGhhdCBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBzY3JvbGxpbmcgbGlzdC4KICAgICAgICovCiAgICAgIGdldCBfcGh5c2ljYWxFbmQoKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLl9waHlzaWNhbFN0YXJ0ICsgdGhpcy5fcGh5c2ljYWxDb3VudCAtIDEpICUKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgfSwKCiAgICAgIHNldCBfcGh5c2ljYWxDb3VudCh2YWwpIHsKICAgICAgICB0aGlzLl9waHlzaWNhbENvdW50VmFsID0gdmFsOwogICAgICB9LAoKICAgICAgZ2V0IF9waHlzaWNhbENvdW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9waHlzaWNhbENvdW50VmFsIHx8IDA7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQW4gb3B0aW1hbCBwaHlzaWNhbCBzaXplIHN1Y2ggdGhhdCB3ZSB3aWxsIGhhdmUgZW5vdWdoIHBoeXNpY2FsIGl0ZW1zCiAgICAgICAqIHRvIGZpbGwgdXAgdGhlIHZpZXdwb3J0IGFuZCByZWN5Y2xlIHdoZW4gdGhlIHVzZXIgc2Nyb2xscy4KICAgICAgICoKICAgICAgICogVGhpcyBkZWZhdWx0IHZhbHVlIGFzc3VtZXMgdGhhdCB3ZSB3aWxsIGF0IGxlYXN0IGhhdmUgdGhlIGVxdWl2YWxlbnQKICAgICAgICogdG8gYSB2aWV3cG9ydCBvZiBwaHlzaWNhbCBpdGVtcyBhYm92ZSBhbmQgYmVsb3cgdGhlIHVzZXIncyB2aWV3cG9ydC4KICAgICAgICovCiAgICAgIGdldCBfb3B0UGh5c2ljYWxTaXplKCkgewogICAgICAgIHJldHVybiB0aGlzLl92aWV3cG9ydEhlaWdodCA9PT0gMCA/IEluZmluaXR5IDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydEhlaWdodCAqIHRoaXMuX21heFBhZ2VzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRydWUgaWYgdGhlIGN1cnJlbnQgbGlzdCBpcyB2aXNpYmxlLgogICAgICAgKi8KICAgICAgZ2V0IF9pc1Zpc2libGUoKSB7CiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5vZmZzZXRXaWR0aCB8fCB0aGlzLm9mZnNldEhlaWdodCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHZpc2libGUgaXRlbSBpbiB0aGUgdmlld3BvcnQuCiAgICAgICAqCiAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAqLwogICAgICBnZXQgZmlyc3RWaXNpYmxlSW5kZXgoKSB7CiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsOwogICAgICAgIGlmIChpZHggPT0gbnVsbCkgewogICAgICAgICAgdmFyIHBoeXNpY2FsT2Zmc2V0ID0gdGhpcy5fcGh5c2ljYWxUb3AgKyB0aGlzLl9zY3JvbGxPZmZzZXQ7CgogICAgICAgICAgaWR4ID0gdGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHBpZHgsIHZpZHgpIHsKICAgICAgICAgICAgcGh5c2ljYWxPZmZzZXQgKz0gdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KHBpZHgpOwoKICAgICAgICAgICAgaWYgKHBoeXNpY2FsT2Zmc2V0ID4gdGhpcy5fc2Nyb2xsUG9zaXRpb24pIHsKICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ncmlkID8gdmlkeCAtICh2aWR4ICUgdGhpcy5faXRlbXNQZXJSb3cpIDogdmlkeDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIYW5kbGUgYSBwYXJ0aWFsbHkgcmVuZGVyZWQgZmluYWwgcm93IGluIGdyaWQgbW9kZQogICAgICAgICAgICBpZiAodGhpcy5ncmlkICYmIHRoaXMuX3ZpcnR1YWxDb3VudCAtIDEgPT09IHZpZHgpIHsKICAgICAgICAgICAgICByZXR1cm4gdmlkeCAtICh2aWR4ICUgdGhpcy5faXRlbXNQZXJSb3cpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KSB8fAogICAgICAgICAgICAgIDA7CiAgICAgICAgICB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCA9IGlkeDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkeDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB2aXNpYmxlIGl0ZW0gaW4gdGhlIHZpZXdwb3J0LgogICAgICAgKgogICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKSB7CiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7CiAgICAgICAgaWYgKGlkeCA9PSBudWxsKSB7CiAgICAgICAgICBpZiAodGhpcy5ncmlkKSB7CiAgICAgICAgICAgIGlkeCA9IE1hdGgubWluKAogICAgICAgICAgICAgICAgdGhpcy5fdmlydHVhbENvdW50LAogICAgICAgICAgICAgICAgdGhpcy5maXJzdFZpc2libGVJbmRleCArIHRoaXMuX2VzdFJvd3NJblZpZXcgKiB0aGlzLl9pdGVtc1BlclJvdyAtCiAgICAgICAgICAgICAgICAgICAgMSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcGh5c2ljYWxPZmZzZXQgPSB0aGlzLl9waHlzaWNhbFRvcCArIHRoaXMuX3Njcm9sbE9mZnNldDsKICAgICAgICAgICAgdGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHBpZHgsIHZpZHgpIHsKICAgICAgICAgICAgICBpZiAocGh5c2ljYWxPZmZzZXQgPCB0aGlzLl9zY3JvbGxCb3R0b20pIHsKICAgICAgICAgICAgICAgIGlkeCA9IHZpZHg7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHBoeXNpY2FsT2Zmc2V0ICs9IHRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChwaWR4KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsID0gaWR4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gaWR4OwogICAgICB9LAoKICAgICAgZ2V0IF9kZWZhdWx0U2Nyb2xsVGFyZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAoKICAgICAgZ2V0IF92aXJ0dWFsUm93Q291bnQoKSB7CiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aXJ0dWFsQ291bnQgLyB0aGlzLl9pdGVtc1BlclJvdyk7CiAgICAgIH0sCgogICAgICBnZXQgX2VzdFJvd3NJblZpZXcoKSB7CiAgICAgICAgcmV0dXJuIE1hdGguY2VpbCh0aGlzLl92aWV3cG9ydEhlaWdodCAvIHRoaXMuX3Jvd0hlaWdodCk7CiAgICAgIH0sCgogICAgICBnZXQgX3BoeXNpY2FsUm93cygpIHsKICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQgLyB0aGlzLl9pdGVtc1BlclJvdyk7CiAgICAgIH0sCgogICAgICBnZXQgX3Njcm9sbE9mZnNldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wICsgdGhpcy5zY3JvbGxPZmZzZXQ7CiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIHJlYWR5OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fZGlkRm9jdXMuYmluZCh0aGlzKSwgdHJ1ZSk7CiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9kZWJvdW5jZSgnX3JlbmRlcicsIHRoaXMuX3JlbmRlciwgYW5pbWF0aW9uRnJhbWUpOwogICAgICAgIC8vIGBpcm9uLXJlc2l6ZWAgaXMgZmlyZWQgd2hlbiB0aGUgbGlzdCBpcyBhdHRhY2hlZCBpZiB0aGUgZXZlbnQgaXMgYWRkZWQKICAgICAgICAvLyBiZWZvcmUgYXR0YWNoZWQgY2F1c2luZyB1bm5lY2Vzc2FyeSB3b3JrLgogICAgICAgIHRoaXMubGlzdGVuKHRoaXMsICdpcm9uLXJlc2l6ZScsICdfcmVzaXplSGFuZGxlcicpOwogICAgICAgIHRoaXMubGlzdGVuKHRoaXMsICdrZXlkb3duJywgJ19rZXlkb3duSGFuZGxlcicpOwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy51bmxpc3Rlbih0aGlzLCAnaXJvbi1yZXNpemUnLCAnX3Jlc2l6ZUhhbmRsZXInKTsKICAgICAgICB0aGlzLnVubGlzdGVuKHRoaXMsICdrZXlkb3duJywgJ19rZXlkb3duSGFuZGxlcicpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNldCB0aGUgb3ZlcmZsb3cgcHJvcGVydHkgaWYgdGhpcyBlbGVtZW50IGhhcyBpdHMgb3duIHNjcm9sbGluZyByZWdpb24KICAgICAgICovCiAgICAgIF9zZXRPdmVyZmxvdzogZnVuY3Rpb24oc2Nyb2xsVGFyZ2V0KSB7CiAgICAgICAgdGhpcy5zdHlsZS53ZWJraXRPdmVyZmxvd1Njcm9sbGluZyA9IHNjcm9sbFRhcmdldCA9PT0gdGhpcyA/ICd0b3VjaCcgOiAnJzsKICAgICAgICB0aGlzLnN0eWxlLm92ZXJmbG93WSA9IHNjcm9sbFRhcmdldCA9PT0gdGhpcyA/ICdhdXRvJyA6ICcnOwogICAgICAgIC8vIENsZWFyIGNhY2hlLgogICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWwgPSBudWxsOwogICAgICAgIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICB0aGlzLl9kZWJvdW5jZSgnX3JlbmRlcicsIHRoaXMuX3JlbmRlciwgYW5pbWF0aW9uRnJhbWUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEludm9rZSB0aGlzIG1ldGhvZCBpZiB5b3UgZHluYW1pY2FsbHkgdXBkYXRlIHRoZSB2aWV3cG9ydCdzCiAgICAgICAqIHNpemUgb3IgQ1NTIHBhZGRpbmcuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgdXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzCiAgICAgICAqLwogICAgICB1cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHlsZXMgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTsKICAgICAgICB0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3AgPQogICAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9PT0gdGhpcyA/IDAgOiBwYXJzZUludChzdHlsZXNbJ3BhZGRpbmctdG9wJ10sIDEwKTsKICAgICAgICB0aGlzLl9pc1JUTCA9IEJvb2xlYW4oc3R5bGVzLmRpcmVjdGlvbiA9PT0gJ3J0bCcpOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0V2lkdGggPSB0aGlzLiQuaXRlbXMub2Zmc2V0V2lkdGg7CiAgICAgICAgdGhpcy5fdmlld3BvcnRIZWlnaHQgPSB0aGlzLl9zY3JvbGxUYXJnZXRIZWlnaHQ7CiAgICAgICAgdGhpcy5ncmlkICYmIHRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVjeWNsZXMgdGhlIHBoeXNpY2FsIGl0ZW1zIHdoZW4gbmVlZGVkLgogICAgICAgKi8KICAgICAgX3Njcm9sbEhhbmRsZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY3JvbGxUb3AgPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLl9tYXhTY3JvbGxUb3AsIHRoaXMuX3Njcm9sbFRvcCkpOwogICAgICAgIHZhciBkZWx0YSA9IHNjcm9sbFRvcCAtIHRoaXMuX3Njcm9sbFBvc2l0aW9uOwogICAgICAgIHZhciBpc1Njcm9sbGluZ0Rvd24gPSBkZWx0YSA+PSAwOwogICAgICAgIC8vIFRyYWNrIHRoZSBjdXJyZW50IHNjcm9sbCBwb3NpdGlvbi4KICAgICAgICB0aGlzLl9zY3JvbGxQb3NpdGlvbiA9IHNjcm9sbFRvcDsKICAgICAgICAvLyBDbGVhciBpbmRleGVzIGZvciBmaXJzdCBhbmQgbGFzdCB2aXNpYmxlIGluZGV4ZXMuCiAgICAgICAgdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWwgPSBudWxsOwogICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWwgPSBudWxsOwogICAgICAgIC8vIFJhbmRvbSBhY2Nlc3MuCiAgICAgICAgaWYgKE1hdGguYWJzKGRlbHRhKSA+IHRoaXMuX3BoeXNpY2FsU2l6ZSAmJiB0aGlzLl9waHlzaWNhbFNpemUgPiAwKSB7CiAgICAgICAgICBkZWx0YSA9IGRlbHRhIC0gdGhpcy5fc2Nyb2xsT2Zmc2V0OwogICAgICAgICAgdmFyIGlkeEFkanVzdG1lbnQgPQogICAgICAgICAgICAgIE1hdGgucm91bmQoZGVsdGEgLyB0aGlzLl9waHlzaWNhbEF2ZXJhZ2UpICogdGhpcy5faXRlbXNQZXJSb3c7CiAgICAgICAgICB0aGlzLl92aXJ0dWFsU3RhcnQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgKyBpZHhBZGp1c3RtZW50OwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxTdGFydCA9IHRoaXMuX3BoeXNpY2FsU3RhcnQgKyBpZHhBZGp1c3RtZW50OwogICAgICAgICAgLy8gRXN0aW1hdGUgbmV3IHBoeXNpY2FsIG9mZnNldCBiYXNlZCBvbiB0aGUgdmlydHVhbCBzdGFydCBpbmRleC4KICAgICAgICAgIC8vIGFkanVzdHMgdGhlIHBoeXNpY2FsIHN0YXJ0IHBvc2l0aW9uIHRvIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBjbGFtcGVkCiAgICAgICAgICAvLyB2aXJ0dWFsIHN0YXJ0IGluZGV4LiBJdCdzIGNyaXRpY2FsIG5vdCB0byBsZXQgdGhpcyB2YWx1ZSBiZQogICAgICAgICAgLy8gbW9yZSB0aGFuIHRoZSBzY3JvbGwgcG9zaXRpb24gaG93ZXZlciwgc2luY2UgdGhhdCB3b3VsZCByZXN1bHQgaW4KICAgICAgICAgIC8vIHRoZSBwaHlzaWNhbCBpdGVtcyBub3QgY292ZXJpbmcgdGhlIHZpZXdwb3J0LCBhbmQgbGVhZGluZyB0bwogICAgICAgICAgLy8gX2luY3JlYXNlUG9vbElmTmVlZGVkIHRvIHJ1biBhd2F5IGNyZWF0aW5nIGl0ZW1zIHRvIHRyeSB0byBmaWxsIGl0LgogICAgICAgICAgdGhpcy5fcGh5c2ljYWxUb3AgPSBNYXRoLm1pbigKICAgICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydCAvIHRoaXMuX2l0ZW1zUGVyUm93KSAqCiAgICAgICAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQXZlcmFnZSwKICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxQb3NpdGlvbik7CiAgICAgICAgICB0aGlzLl91cGRhdGUoKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3BoeXNpY2FsQ291bnQgPiAwKSB7CiAgICAgICAgICB2YXIgcmV1c2FibGVzID0gdGhpcy5fZ2V0UmV1c2FibGVzKGlzU2Nyb2xsaW5nRG93bik7CiAgICAgICAgICBpZiAoaXNTY3JvbGxpbmdEb3duKSB7CiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsVG9wID0gcmV1c2FibGVzLnBoeXNpY2FsVG9wOwogICAgICAgICAgICB0aGlzLl92aXJ0dWFsU3RhcnQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgKyByZXVzYWJsZXMuaW5kZXhlcy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU3RhcnQgPSB0aGlzLl9waHlzaWNhbFN0YXJ0ICsgcmV1c2FibGVzLmluZGV4ZXMubGVuZ3RoOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fdmlydHVhbFN0YXJ0ID0gdGhpcy5fdmlydHVhbFN0YXJ0IC0gcmV1c2FibGVzLmluZGV4ZXMubGVuZ3RoOwogICAgICAgICAgICB0aGlzLl9waHlzaWNhbFN0YXJ0ID0gdGhpcy5fcGh5c2ljYWxTdGFydCAtIHJldXNhYmxlcy5pbmRleGVzLmxlbmd0aDsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX3VwZGF0ZSgKICAgICAgICAgICAgICByZXVzYWJsZXMuaW5kZXhlcywgaXNTY3JvbGxpbmdEb3duID8gbnVsbCA6IHJldXNhYmxlcy5pbmRleGVzKTsKICAgICAgICAgIHRoaXMuX2RlYm91bmNlKAogICAgICAgICAgICAgICdfaW5jcmVhc2VQb29sSWZOZWVkZWQnLAogICAgICAgICAgICAgIHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywgMCksCiAgICAgICAgICAgICAgbWljcm9UYXNrKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyBhbiBvYmplY3QgdGhhdCBjb250YWlucyB0aGUgaW5kZXhlcyBvZiB0aGUgcGh5c2ljYWwgaXRlbXMKICAgICAgICogdGhhdCBtaWdodCBiZSByZXVzZWQgYW5kIHRoZSBwaHlzaWNhbFRvcC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtib29sZWFufSBmcm9tVG9wIElmIHRoZSBwb3RlbnRpYWwgcmV1c2FibGUgaXRlbXMgYXJlIGFib3ZlIHRoZSBzY3JvbGxpbmcgcmVnaW9uLgogICAgICAgKi8KICAgICAgX2dldFJldXNhYmxlczogZnVuY3Rpb24oZnJvbVRvcCkgewogICAgICAgIHZhciBpdGgsIGxhc3RJdGgsIG9mZnNldENvbnRlbnQsIHBoeXNpY2FsSXRlbUhlaWdodDsKICAgICAgICB2YXIgaWR4cyA9IFtdOwogICAgICAgIHZhciBwcm90ZWN0ZWRPZmZzZXRDb250ZW50ID0gdGhpcy5faGlkZGVuQ29udGVudFNpemUgKiB0aGlzLl9yYXRpbzsKICAgICAgICB2YXIgdmlydHVhbFN0YXJ0ID0gdGhpcy5fdmlydHVhbFN0YXJ0OwogICAgICAgIHZhciB2aXJ0dWFsRW5kID0gdGhpcy5fdmlydHVhbEVuZDsKICAgICAgICB2YXIgcGh5c2ljYWxDb3VudCA9IHRoaXMuX3BoeXNpY2FsQ291bnQ7CiAgICAgICAgdmFyIHRvcCA9IHRoaXMuX3BoeXNpY2FsVG9wICsgdGhpcy5fc2Nyb2xsT2Zmc2V0OwogICAgICAgIHZhciBib3R0b20gPSB0aGlzLl9waHlzaWNhbEJvdHRvbSArIHRoaXMuX3Njcm9sbE9mZnNldDsKICAgICAgICAvLyBUaGlzIG1heSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHNjcm9sbEhhbmRsZXIsIHNvIHVzZSBsYXN0IGNhY2hlZCBwb3NpdGlvbgogICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLl9zY3JvbGxQb3NpdGlvbjsKICAgICAgICB2YXIgc2Nyb2xsQm90dG9tID0gdGhpcy5fc2Nyb2xsQm90dG9tOwoKICAgICAgICBpZiAoZnJvbVRvcCkgewogICAgICAgICAgaXRoID0gdGhpcy5fcGh5c2ljYWxTdGFydDsKICAgICAgICAgIGxhc3RJdGggPSB0aGlzLl9waHlzaWNhbEVuZDsKICAgICAgICAgIG9mZnNldENvbnRlbnQgPSBzY3JvbGxUb3AgLSB0b3A7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGl0aCA9IHRoaXMuX3BoeXNpY2FsRW5kOwogICAgICAgICAgbGFzdEl0aCA9IHRoaXMuX3BoeXNpY2FsU3RhcnQ7CiAgICAgICAgICBvZmZzZXRDb250ZW50ID0gYm90dG9tIC0gc2Nyb2xsQm90dG9tOwogICAgICAgIH0KICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgcGh5c2ljYWxJdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGl0aCk7CiAgICAgICAgICBvZmZzZXRDb250ZW50ID0gb2Zmc2V0Q29udGVudCAtIHBoeXNpY2FsSXRlbUhlaWdodDsKICAgICAgICAgIGlmIChpZHhzLmxlbmd0aCA+PSBwaHlzaWNhbENvdW50IHx8CiAgICAgICAgICAgICAgb2Zmc2V0Q29udGVudCA8PSBwcm90ZWN0ZWRPZmZzZXRDb250ZW50KSB7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGZyb21Ub3ApIHsKICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBpbmRleCBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlLgogICAgICAgICAgICBpZiAodmlydHVhbEVuZCArIGlkeHMubGVuZ3RoICsgMSA+PSB0aGlzLl92aXJ0dWFsQ291bnQpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbmRleCBpcyBub3QgdmlzaWJsZS4KICAgICAgICAgICAgaWYgKHRvcCArIHBoeXNpY2FsSXRlbUhlaWdodCA+PSBzY3JvbGxUb3AgLSB0aGlzLl9zY3JvbGxPZmZzZXQpIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZHhzLnB1c2goaXRoKTsKICAgICAgICAgICAgdG9wID0gdG9wICsgcGh5c2ljYWxJdGVtSGVpZ2h0OwogICAgICAgICAgICBpdGggPSAoaXRoICsgMSkgJSBwaHlzaWNhbENvdW50OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCBpbmRleCBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlLgogICAgICAgICAgICBpZiAodmlydHVhbFN0YXJ0IC0gaWR4cy5sZW5ndGggPD0gMCkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGluZGV4IGlzIG5vdCB2aXNpYmxlLgogICAgICAgICAgICBpZiAodG9wICsgdGhpcy5fcGh5c2ljYWxTaXplIC0gcGh5c2ljYWxJdGVtSGVpZ2h0IDw9IHNjcm9sbEJvdHRvbSkgewogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlkeHMucHVzaChpdGgpOwogICAgICAgICAgICB0b3AgPSB0b3AgLSBwaHlzaWNhbEl0ZW1IZWlnaHQ7CiAgICAgICAgICAgIGl0aCA9IChpdGggPT09IDApID8gcGh5c2ljYWxDb3VudCAtIDEgOiBpdGggLSAxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4ge2luZGV4ZXM6IGlkeHMsIHBoeXNpY2FsVG9wOiB0b3AgLSB0aGlzLl9zY3JvbGxPZmZzZXR9OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBpdGVtcywgc3RhcnRpbmcgZnJvbSB0aGUgYF92aXJ0dWFsU3RhcnRgIGl0ZW0uCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PG51bWJlcj49fSBpdGVtU2V0CiAgICAgICAqIEBwYXJhbSB7IUFycmF5PG51bWJlcj49fSBtb3ZpbmdVcAogICAgICAgKi8KICAgICAgX3VwZGF0ZTogZnVuY3Rpb24oaXRlbVNldCwgbW92aW5nVXApIHsKICAgICAgICBpZiAoKGl0ZW1TZXQgJiYgaXRlbVNldC5sZW5ndGggPT09IDApIHx8IHRoaXMuX3BoeXNpY2FsQ291bnQgPT09IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbWFuYWdlRm9jdXMoKTsKICAgICAgICB0aGlzLl9hc3NpZ25Nb2RlbHMoaXRlbVNldCk7CiAgICAgICAgdGhpcy5fdXBkYXRlTWV0cmljcyhpdGVtU2V0KTsKICAgICAgICAvLyBBZGp1c3Qgb2Zmc2V0IGFmdGVyIG1lYXN1cmluZy4KICAgICAgICBpZiAobW92aW5nVXApIHsKICAgICAgICAgIHdoaWxlIChtb3ZpbmdVcC5sZW5ndGgpIHsKICAgICAgICAgICAgdmFyIGlkeCA9IG1vdmluZ1VwLnBvcCgpOwogICAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCAtPSB0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoaWR4KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5fcG9zaXRpb25JdGVtcygpOwogICAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbGVyU2l6ZSgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENyZWF0ZXMgYSBwb29sIG9mIERPTSBlbGVtZW50cyBhbmQgYXR0YWNoZXMgdGhlbSB0byB0aGUgbG9jYWwgZG9tLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSBTaXplIG9mIHRoZSBwb29sCiAgICAgICAqLwogICAgICBfY3JlYXRlUG9vbDogZnVuY3Rpb24oc2l6ZSkgewogICAgICAgIHRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCk7CiAgICAgICAgdmFyIGksIGluc3Q7CiAgICAgICAgdmFyIHBoeXNpY2FsSXRlbXMgPSBuZXcgQXJyYXkoc2l6ZSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykgewogICAgICAgICAgaW5zdCA9IHRoaXMuc3RhbXAobnVsbCk7CiAgICAgICAgICAvLyBUT0RPKGJsYXN0ZW4pOgogICAgICAgICAgLy8gRmlyc3QgZWxlbWVudCBjaGlsZCBpcyBpdGVtOyBTYWZhcmkgZG9lc24ndCBzdXBwb3J0IGNoaWxkcmVuWzBdCiAgICAgICAgICAvLyBvbiBhIGRvYyBmcmFnbWVudC4gVGVzdCB0aGlzIHRvIHNlZSBpZiBpdCBzdGlsbCBtYXR0ZXJzLgogICAgICAgICAgcGh5c2ljYWxJdGVtc1tpXSA9IGluc3Qucm9vdC5xdWVyeVNlbGVjdG9yKCcqJyk7CiAgICAgICAgICB0aGlzLl9pdGVtc1BhcmVudC5hcHBlbmRDaGlsZChpbnN0LnJvb3QpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGh5c2ljYWxJdGVtczsKICAgICAgfSwKCiAgICAgIF9pc0NsaWVudEZ1bGw6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxCb3R0b20gIT0gMCAmJgogICAgICAgICAgICB0aGlzLl9waHlzaWNhbEJvdHRvbSAtIDEgPj0gdGhpcy5fc2Nyb2xsQm90dG9tICYmCiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsVG9wIDw9IHRoaXMuX3Njcm9sbFBvc2l0aW9uOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEluY3JlYXNlcyB0aGUgcG9vbCBzaXplLgogICAgICAgKi8KICAgICAgX2luY3JlYXNlUG9vbElmTmVlZGVkOiBmdW5jdGlvbihjb3VudCkgewogICAgICAgIHZhciBuZXh0UGh5c2ljYWxDb3VudCA9IHRoaXMuX2NsYW1wKAogICAgICAgICAgICB0aGlzLl9waHlzaWNhbENvdW50ICsgY291bnQsCiAgICAgICAgICAgIERFRkFVTFRfUEhZU0lDQUxfQ09VTlQsCiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxDb3VudCAtIHRoaXMuX3ZpcnR1YWxTdGFydCk7CiAgICAgICAgbmV4dFBoeXNpY2FsQ291bnQgPSB0aGlzLl9jb252ZXJ0SW5kZXhUb0NvbXBsZXRlUm93KG5leHRQaHlzaWNhbENvdW50KTsKICAgICAgICBpZiAodGhpcy5ncmlkKSB7CiAgICAgICAgICB2YXIgY29ycmVjdGlvbiA9IG5leHRQaHlzaWNhbENvdW50ICUgdGhpcy5faXRlbXNQZXJSb3c7CiAgICAgICAgICBpZiAoY29ycmVjdGlvbiAmJiBuZXh0UGh5c2ljYWxDb3VudCAtIGNvcnJlY3Rpb24gPD0gdGhpcy5fcGh5c2ljYWxDb3VudCkgewogICAgICAgICAgICBuZXh0UGh5c2ljYWxDb3VudCArPSB0aGlzLl9pdGVtc1BlclJvdzsKICAgICAgICAgIH0KICAgICAgICAgIG5leHRQaHlzaWNhbENvdW50IC09IGNvcnJlY3Rpb247CiAgICAgICAgfQogICAgICAgIHZhciBkZWx0YSA9IG5leHRQaHlzaWNhbENvdW50IC0gdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgICB2YXIgbmV4dEluY3JlYXNlID0gTWF0aC5yb3VuZCh0aGlzLl9waHlzaWNhbENvdW50ICogMC41KTsKCiAgICAgICAgaWYgKGRlbHRhIDwgMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CiAgICAgICAgICB2YXIgdHMgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAvLyBDb25jYXQgYXJyYXlzIGluIHBsYWNlLgogICAgICAgICAgW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLCB0aGlzLl9jcmVhdGVQb29sKGRlbHRhKSk7CiAgICAgICAgICAvLyBQdXNoIDBzIGludG8gcGh5c2ljYWxTaXplcy4gQ2FuJ3QgdXNlIEFycmF5LmZpbGwgYmVjYXVzZSBJRTExIGRvZXNuJ3QKICAgICAgICAgIC8vIHN1cHBvcnQgaXQuCiAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxTaXplcy5wdXNoKDApOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fcGh5c2ljYWxDb3VudCA9IHRoaXMuX3BoeXNpY2FsQ291bnQgKyBkZWx0YTsKICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcGh5c2ljYWwgc3RhcnQgaWYgaXQgbmVlZHMgdG8gcHJlc2VydmUgdGhlIG1vZGVsIG9mIHRoZQogICAgICAgICAgLy8gZm9jdXNlZCBpdGVtLiBJbiB0aGlzIHNpdHVhdGlvbiwgdGhlIGZvY3VzZWQgaXRlbSBpcyBjdXJyZW50bHkgcmVuZGVyZWQKICAgICAgICAgIC8vIGFuZCBpdHMgbW9kZWwgd291bGQgaGF2ZSBjaGFuZ2VkIGFmdGVyIGluY3JlYXNpbmcgdGhlIHBvb2wgaWYgdGhlCiAgICAgICAgICAvLyBwaHlzaWNhbCBzdGFydCByZW1haW5lZCB1bmNoYW5nZWQuCiAgICAgICAgICBpZiAodGhpcy5fcGh5c2ljYWxTdGFydCA+IHRoaXMuX3BoeXNpY2FsRW5kICYmCiAgICAgICAgICAgICAgdGhpcy5faXNJbmRleFJlbmRlcmVkKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpICYmCiAgICAgICAgICAgICAgdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSA8CiAgICAgICAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsRW5kKSB7CiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU3RhcnQgPSB0aGlzLl9waHlzaWNhbFN0YXJ0ICsgZGVsdGE7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl91cGRhdGUoKTsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlQ29zdCA9ICh3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgLSB0cykgLyBkZWx0YTsKICAgICAgICAgIG5leHRJbmNyZWFzZSA9IE1hdGgucm91bmQodGhpcy5fcGh5c2ljYWxDb3VudCAqIDAuNSk7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSB1cHBlciBib3VuZHMgaXMgbm90IGZpeGVkIHdoZW4gZGVhbGluZyB3aXRoIGEgZ3JpZCB0aGF0IGRvZXNuJ3QKICAgICAgICAvLyBmaWxsIGl0J3MgbGFzdCByb3cgd2l0aCB0aGUgZXhhY3QgbnVtYmVyIG9mIGl0ZW1zIHBlciByb3cuCiAgICAgICAgaWYgKHRoaXMuX3ZpcnR1YWxFbmQgPj0gdGhpcy5fdmlydHVhbENvdW50IC0gMSB8fCBuZXh0SW5jcmVhc2UgPT09IDApIDsgZWxzZSBpZiAoIXRoaXMuX2lzQ2xpZW50RnVsbCgpKSB7CiAgICAgICAgICB0aGlzLl9kZWJvdW5jZSgKICAgICAgICAgICAgICAnX2luY3JlYXNlUG9vbElmTmVlZGVkJywKICAgICAgICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKHRoaXMsIG5leHRJbmNyZWFzZSksCiAgICAgICAgICAgICAgbWljcm9UYXNrKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3BoeXNpY2FsU2l6ZSA8IHRoaXMuX29wdFBoeXNpY2FsU2l6ZSkgewogICAgICAgICAgLy8gWWllbGQgYW5kIGluY3JlYXNlIHRoZSBwb29sIGR1cmluZyBpZGxlIHRpbWUgdW50aWwgdGhlIHBoeXNpY2FsIHNpemUgaXMKICAgICAgICAgIC8vIG9wdGltYWwuCiAgICAgICAgICB0aGlzLl9kZWJvdW5jZSgKICAgICAgICAgICAgICAnX2luY3JlYXNlUG9vbElmTmVlZGVkJywKICAgICAgICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKAogICAgICAgICAgICAgICAgICB0aGlzLAogICAgICAgICAgICAgICAgICB0aGlzLl9jbGFtcCgKICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQoNTAgLyB0aGlzLl90ZW1wbGF0ZUNvc3QpLCAxLCBuZXh0SW5jcmVhc2UpKSwKICAgICAgICAgICAgICBpZGxlUGVyaW9kKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVuZGVycyB0aGUgYSBuZXcgbGlzdC4KICAgICAgICovCiAgICAgIF9yZW5kZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5pc0F0dGFjaGVkIHx8ICF0aGlzLl9pc1Zpc2libGUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3BoeXNpY2FsQ291bnQgIT09IDApIHsKICAgICAgICAgIHZhciByZXVzYWJsZXMgPSB0aGlzLl9nZXRSZXVzYWJsZXModHJ1ZSk7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IHJldXNhYmxlcy5waHlzaWNhbFRvcDsKICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTdGFydCA9IHRoaXMuX3ZpcnR1YWxTdGFydCArIHJldXNhYmxlcy5pbmRleGVzLmxlbmd0aDsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU3RhcnQgPSB0aGlzLl9waHlzaWNhbFN0YXJ0ICsgcmV1c2FibGVzLmluZGV4ZXMubGVuZ3RoOwogICAgICAgICAgdGhpcy5fdXBkYXRlKHJldXNhYmxlcy5pbmRleGVzKTsKICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpOwogICAgICAgICAgdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl92aXJ0dWFsQ291bnQgPiAwKSB7CiAgICAgICAgICAvLyBJbml0aWFsIHJlbmRlcgogICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTsKICAgICAgICAgIHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKERFRkFVTFRfUEhZU0lDQUxfQ09VTlQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUZW1wbGV0aXplcyB0aGUgdXNlciB0ZW1wbGF0ZS4KICAgICAgICovCiAgICAgIF9lbnN1cmVUZW1wbGF0aXplZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuY3RvcikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl91c2VyVGVtcGxhdGUgPSAvKiogQHR5cGUgeyFIVE1MVGVtcGxhdGVFbGVtZW50fSAqLyAoCiAgICAgICAgICAgIHRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbigndGVtcGxhdGUnKSk7CiAgICAgICAgaWYgKCF0aGlzLl91c2VyVGVtcGxhdGUpIHsKICAgICAgICAgIGNvbnNvbGUud2FybignaXJvbi1saXN0IHJlcXVpcmVzIGEgdGVtcGxhdGUgdG8gYmUgcHJvdmlkZWQgaW4gbGlnaHQtZG9tJyk7CiAgICAgICAgfQogICAgICAgIHZhciBpbnN0YW5jZVByb3BzID0ge307CiAgICAgICAgaW5zdGFuY2VQcm9wcy5fX2tleV9fID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuYXNdID0gdHJ1ZTsKICAgICAgICBpbnN0YW5jZVByb3BzW3RoaXMuaW5kZXhBc10gPSB0cnVlOwogICAgICAgIGluc3RhbmNlUHJvcHNbdGhpcy5zZWxlY3RlZEFzXSA9IHRydWU7CiAgICAgICAgaW5zdGFuY2VQcm9wcy50YWJJbmRleCA9IHRydWU7CiAgICAgICAgdGhpcy5faW5zdGFuY2VQcm9wcyA9IGluc3RhbmNlUHJvcHM7CiAgICAgICAgdGhpcy50ZW1wbGF0aXplKHRoaXMuX3VzZXJUZW1wbGF0ZSwgdGhpcy5tdXRhYmxlRGF0YSk7CiAgICAgIH0sCgogICAgICBfZ3JpZENoYW5nZWQ6IGZ1bmN0aW9uKG5ld0dyaWQsIG9sZEdyaWQpIHsKICAgICAgICBpZiAodHlwZW9mIG9sZEdyaWQgPT09ICd1bmRlZmluZWQnKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgZmx1c2goKTsKICAgICAgICBuZXdHcmlkICYmIHRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIGl0ZW1zIGhhdmUgY2hhbmdlZC4gVGhhdCBpcywgcmVhc3NpZ25tZW50cwogICAgICAgKiB0byBgaXRlbXNgLCBzcGxpY2VzIG9yIHVwZGF0ZXMgdG8gYSBzaW5nbGUgaXRlbS4KICAgICAgICovCiAgICAgIF9pdGVtc0NoYW5nZWQ6IGZ1bmN0aW9uKGNoYW5nZSkgewogICAgICAgIGlmIChjaGFuZ2UucGF0aCA9PT0gJ2l0ZW1zJykgewogICAgICAgICAgdGhpcy5fdmlydHVhbFN0YXJ0ID0gMDsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsVG9wID0gMDsKICAgICAgICAgIHRoaXMuX3ZpcnR1YWxDb3VudCA9IHRoaXMuaXRlbXMgPyB0aGlzLml0ZW1zLmxlbmd0aCA6IDA7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5ID0ge307CiAgICAgICAgICB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCA9IG51bGw7CiAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQ291bnQgPSB0aGlzLl9waHlzaWNhbENvdW50IHx8IDA7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbEl0ZW1zID0gdGhpcy5fcGh5c2ljYWxJdGVtcyB8fCBbXTsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU2l6ZXMgPSB0aGlzLl9waHlzaWNhbFNpemVzIHx8IFtdOwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxTdGFydCA9IDA7CiAgICAgICAgICBpZiAodGhpcy5fc2Nyb2xsVG9wID4gdGhpcy5fc2Nyb2xsT2Zmc2V0KSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpOwogICAgICAgICAgdGhpcy5fZGVib3VuY2UoJ19yZW5kZXInLCB0aGlzLl9yZW5kZXIsIGFuaW1hdGlvbkZyYW1lKTsKICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5wYXRoID09PSAnaXRlbXMuc3BsaWNlcycpIHsKICAgICAgICAgIHRoaXMuX2FkanVzdFZpcnR1YWxJbmRleChjaGFuZ2UudmFsdWUuaW5kZXhTcGxpY2VzKTsKICAgICAgICAgIHRoaXMuX3ZpcnR1YWxDb3VudCA9IHRoaXMuaXRlbXMgPyB0aGlzLml0ZW1zLmxlbmd0aCA6IDA7CiAgICAgICAgICAvLyBPbmx5IGJsdXIgaWYgYXQgbGVhc3Qgb25lIGl0ZW0gaXMgYWRkZWQgb3IgcmVtb3ZlZC4KICAgICAgICAgIHZhciBpdGVtQWRkZWRPclJlbW92ZWQgPSBjaGFuZ2UudmFsdWUuaW5kZXhTcGxpY2VzLnNvbWUoZnVuY3Rpb24oc3BsaWNlKSB7CiAgICAgICAgICAgIHJldHVybiBzcGxpY2UuYWRkZWRDb3VudCA+IDAgfHwgc3BsaWNlLnJlbW92ZWQubGVuZ3RoID4gMDsKICAgICAgICAgIH0pOwogICAgICAgICAgaWYgKGl0ZW1BZGRlZE9yUmVtb3ZlZCkgewogICAgICAgICAgICAvLyBPbmx5IGJsdXIgYWN0aXZlRWxlbWVudCBpZiBpdCBpcyBhIGRlc2NlbmRhbnQgb2YgdGhlIGxpc3QgKCM1MDUsCiAgICAgICAgICAgIC8vICM1MDcpLgogICAgICAgICAgICB2YXIgYWN0aXZlRWxlbWVudCA9IHRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuY29udGFpbnMoYWN0aXZlRWxlbWVudCkpIHsKICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50LmJsdXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgLy8gUmVuZGVyIG9ubHkgaWYgdGhlIGFmZmVjdGVkIGluZGV4IGlzIHJlbmRlcmVkLgogICAgICAgICAgdmFyIGFmZmVjdGVkSW5kZXhSZW5kZXJlZCA9CiAgICAgICAgICAgICAgY2hhbmdlLnZhbHVlLmluZGV4U3BsaWNlcy5zb21lKGZ1bmN0aW9uKHNwbGljZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNwbGljZS5pbmRleCArIHNwbGljZS5hZGRlZENvdW50ID49IHRoaXMuX3ZpcnR1YWxTdGFydCAmJgogICAgICAgICAgICAgICAgICAgIHNwbGljZS5pbmRleCA8PSB0aGlzLl92aXJ0dWFsRW5kOwogICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgaWYgKCF0aGlzLl9pc0NsaWVudEZ1bGwoKSB8fCBhZmZlY3RlZEluZGV4UmVuZGVyZWQpIHsKICAgICAgICAgICAgdGhpcy5fZGVib3VuY2UoJ19yZW5kZXInLCB0aGlzLl9yZW5kZXIsIGFuaW1hdGlvbkZyYW1lKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGNoYW5nZS5wYXRoICE9PSAnaXRlbXMubGVuZ3RoJykgewogICAgICAgICAgdGhpcy5fZm9yd2FyZEl0ZW1QYXRoKGNoYW5nZS5wYXRoLCBjaGFuZ2UudmFsdWUpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9mb3J3YXJkSXRlbVBhdGg6IGZ1bmN0aW9uKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoNik7ICAvLyAnaXRlbXMuJy5sZW5ndGggPT0gNgogICAgICAgIHZhciBkb3QgPSBwYXRoLmluZGV4T2YoJy4nKTsKICAgICAgICBpZiAoZG90ID09PSAtMSkgewogICAgICAgICAgZG90ID0gcGF0aC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIHZhciBpc0luZGV4UmVuZGVyZWQ7CiAgICAgICAgdmFyIHBpZHg7CiAgICAgICAgdmFyIGluc3Q7CiAgICAgICAgdmFyIG9mZnNjcmVlbkluc3RhbmNlID0gdGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pOwogICAgICAgIHZhciB2aWR4ID0gcGFyc2VJbnQocGF0aC5zdWJzdHJpbmcoMCwgZG90KSwgMTApOwogICAgICAgIGlzSW5kZXhSZW5kZXJlZCA9IHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh2aWR4KTsKICAgICAgICBpZiAoaXNJbmRleFJlbmRlcmVkKSB7CiAgICAgICAgICBwaWR4ID0gdGhpcy5fZ2V0UGh5c2ljYWxJbmRleCh2aWR4KTsKICAgICAgICAgIGluc3QgPSB0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9waHlzaWNhbEl0ZW1zW3BpZHhdKTsKICAgICAgICB9IGVsc2UgaWYgKG9mZnNjcmVlbkluc3RhbmNlKSB7CiAgICAgICAgICBpbnN0ID0gb2Zmc2NyZWVuSW5zdGFuY2U7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWluc3QgfHwgaW5zdFt0aGlzLmluZGV4QXNdICE9PSB2aWR4KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cmluZyhkb3QgKyAxKTsKICAgICAgICBwYXRoID0gdGhpcy5hcyArIChwYXRoID8gJy4nICsgcGF0aCA6ICcnKTsKICAgICAgICBpbnN0Ll9zZXRQZW5kaW5nUHJvcGVydHlPclBhdGgocGF0aCwgdmFsdWUsIGZhbHNlLCB0cnVlKTsKICAgICAgICBpbnN0Ll9mbHVzaFByb3BlcnRpZXMgJiYgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzKCk7CiAgICAgICAgLy8gVE9ETyhibGFzdGVuKTogVjEgZG9lc24ndCBkbyB0aGlzIGFuZCBpdCdzIGEgYnVnCiAgICAgICAgaWYgKGlzSW5kZXhSZW5kZXJlZCkgewogICAgICAgICAgdGhpcy5fdXBkYXRlTWV0cmljcyhbcGlkeF0pOwogICAgICAgICAgdGhpcy5fcG9zaXRpb25JdGVtcygpOwogICAgICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PCFPYmplY3Q+fSBzcGxpY2VzCiAgICAgICAqLwogICAgICBfYWRqdXN0VmlydHVhbEluZGV4OiBmdW5jdGlvbihzcGxpY2VzKSB7CiAgICAgICAgc3BsaWNlcy5mb3JFYWNoKGZ1bmN0aW9uKHNwbGljZSkgewogICAgICAgICAgLy8gZGVzZWxlY3QgcmVtb3ZlZCBpdGVtcwogICAgICAgICAgc3BsaWNlLnJlbW92ZWQuZm9yRWFjaCh0aGlzLl9yZW1vdmVJdGVtLCB0aGlzKTsKICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBjYXJlIGFib3V0IGNoYW5nZXMgaGFwcGVuaW5nIGFib3ZlIHRoZSBjdXJyZW50IHBvc2l0aW9uCiAgICAgICAgICBpZiAoc3BsaWNlLmluZGV4IDwgdGhpcy5fdmlydHVhbFN0YXJ0KSB7CiAgICAgICAgICAgIHZhciBkZWx0YSA9IE1hdGgubWF4KAogICAgICAgICAgICAgICAgc3BsaWNlLmFkZGVkQ291bnQgLSBzcGxpY2UucmVtb3ZlZC5sZW5ndGgsCiAgICAgICAgICAgICAgICBzcGxpY2UuaW5kZXggLSB0aGlzLl92aXJ0dWFsU3RhcnQpOwogICAgICAgICAgICB0aGlzLl92aXJ0dWFsU3RhcnQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgKyBkZWx0YTsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXggPj0gMCkgewogICAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXggPSB0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4ICsgZGVsdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIF9yZW1vdmVJdGVtOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0KGl0ZW0pOwogICAgICAgIC8vIHJlbW92ZSB0aGUgY3VycmVudCBmb2N1c2VkIGl0ZW0KICAgICAgICBpZiAodGhpcy5fZm9jdXNlZEl0ZW0gJiYKICAgICAgICAgICAgdGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fZm9jdXNlZEl0ZW0pW3RoaXMuYXNdID09PSBpdGVtKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBFeGVjdXRlcyBhIHByb3ZpZGVkIGZ1bmN0aW9uIHBlciBldmVyeSBwaHlzaWNhbCBpbmRleCBpbiBgaXRlbVNldGAKICAgICAgICogYGl0ZW1TZXRgIGRlZmF1bHQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byB0aGUgZW50aXJlIHNldCBvZiBwaHlzaWNhbAogICAgICAgKiBpbmRleGVzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFmdW5jdGlvbihudW1iZXIsIG51bWJlcil9IGZuCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PG51bWJlcj49fSBpdGVtU2V0CiAgICAgICAqLwogICAgICBfaXRlcmF0ZUl0ZW1zOiBmdW5jdGlvbihmbiwgaXRlbVNldCkgewogICAgICAgIHZhciBwaWR4LCB2aWR4LCBydG4sIGk7CgogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAyICYmIGl0ZW1TZXQpIHsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtU2V0Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHBpZHggPSBpdGVtU2V0W2ldOwogICAgICAgICAgICB2aWR4ID0gdGhpcy5fY29tcHV0ZVZpZHgocGlkeCk7CiAgICAgICAgICAgIGlmICgocnRuID0gZm4uY2FsbCh0aGlzLCBwaWR4LCB2aWR4KSkgIT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiBydG47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcGlkeCA9IHRoaXMuX3BoeXNpY2FsU3RhcnQ7CiAgICAgICAgICB2aWR4ID0gdGhpcy5fdmlydHVhbFN0YXJ0OwogICAgICAgICAgZm9yICg7IHBpZHggPCB0aGlzLl9waHlzaWNhbENvdW50OyBwaWR4KyssIHZpZHgrKykgewogICAgICAgICAgICBpZiAoKHJ0biA9IGZuLmNhbGwodGhpcywgcGlkeCwgdmlkeCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICByZXR1cm4gcnRuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBmb3IgKHBpZHggPSAwOyBwaWR4IDwgdGhpcy5fcGh5c2ljYWxTdGFydDsgcGlkeCsrLCB2aWR4KyspIHsKICAgICAgICAgICAgaWYgKChydG4gPSBmbi5jYWxsKHRoaXMsIHBpZHgsIHZpZHgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJ0bjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB2aXJ0dWFsIGluZGV4IGZvciBhIGdpdmVuIHBoeXNpY2FsIGluZGV4CiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBwaWR4IFBoeXNpY2FsIGluZGV4CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0KICAgICAgICovCiAgICAgIF9jb21wdXRlVmlkeDogZnVuY3Rpb24ocGlkeCkgewogICAgICAgIGlmIChwaWR4ID49IHRoaXMuX3BoeXNpY2FsU3RhcnQpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl92aXJ0dWFsU3RhcnQgKyAocGlkeCAtIHRoaXMuX3BoeXNpY2FsU3RhcnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0ICsgKHRoaXMuX3BoeXNpY2FsQ291bnQgLSB0aGlzLl9waHlzaWNhbFN0YXJ0KSArCiAgICAgICAgICAgIHBpZHg7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQXNzaWducyB0aGUgZGF0YSBtb2RlbHMgdG8gYSBnaXZlbiBzZXQgb2YgaXRlbXMuCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PG51bWJlcj49fSBpdGVtU2V0CiAgICAgICAqLwogICAgICBfYXNzaWduTW9kZWxzOiBmdW5jdGlvbihpdGVtU2V0KSB7CiAgICAgICAgdGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHBpZHgsIHZpZHgpIHsKICAgICAgICAgIHZhciBlbCA9IHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF07CiAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtc1t2aWR4XTsKICAgICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKICAgICAgICAgICAgdmFyIGluc3QgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChlbCk7CiAgICAgICAgICAgIGluc3QuX19rZXlfXyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShpbnN0LCB0aGlzLmFzLCBpdGVtKTsKICAgICAgICAgICAgdGhpcy5fZm9yd2FyZFByb3BlcnR5KAogICAgICAgICAgICAgICAgaW5zdCwgdGhpcy5zZWxlY3RlZEFzLCB0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZChpdGVtKSk7CiAgICAgICAgICAgIHRoaXMuX2ZvcndhcmRQcm9wZXJ0eShpbnN0LCB0aGlzLmluZGV4QXMsIHZpZHgpOwogICAgICAgICAgICB0aGlzLl9mb3J3YXJkUHJvcGVydHkoCiAgICAgICAgICAgICAgICBpbnN0LCAndGFiSW5kZXgnLCB0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4ID09PSB2aWR4ID8gMCA6IC0xKTsKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxJbmRleEZvcktleVtpbnN0Ll9fa2V5X19dID0gcGlkeDsKICAgICAgICAgICAgaW5zdC5fZmx1c2hQcm9wZXJ0aWVzICYmIGluc3QuX2ZsdXNoUHJvcGVydGllcyh0cnVlKTsKICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKCdoaWRkZW4nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZSgnaGlkZGVuJywgJycpOwogICAgICAgICAgfQogICAgICAgIH0sIGl0ZW1TZXQpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZXMgdGhlIGhlaWdodCBmb3IgYSBnaXZlbiBzZXQgb2YgaXRlbXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PG51bWJlcj49fSBpdGVtU2V0CiAgICAgICAqLwogICAgICBfdXBkYXRlTWV0cmljczogZnVuY3Rpb24oaXRlbVNldCkgewogICAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBkaXN0cmlidXRlZCBhbGwgdGhlIHBoeXNpY2FsIGl0ZW1zCiAgICAgICAgLy8gc28gd2UgY2FuIG1lYXN1cmUgdGhlbS4KICAgICAgICBmbHVzaCgpOwoKICAgICAgICB2YXIgbmV3UGh5c2ljYWxTaXplID0gMDsKICAgICAgICB2YXIgb2xkUGh5c2ljYWxTaXplID0gMDsKICAgICAgICB2YXIgcHJldkF2Z0NvdW50ID0gdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQ7CiAgICAgICAgdmFyIHByZXZQaHlzaWNhbEF2ZyA9IHRoaXMuX3BoeXNpY2FsQXZlcmFnZTsKCiAgICAgICAgdGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHBpZHgsIHZpZHgpIHsKICAgICAgICAgIG9sZFBoeXNpY2FsU2l6ZSArPSB0aGlzLl9waHlzaWNhbFNpemVzW3BpZHhdOwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxTaXplc1twaWR4XSA9IHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF0ub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgbmV3UGh5c2ljYWxTaXplICs9IHRoaXMuX3BoeXNpY2FsU2l6ZXNbcGlkeF07CiAgICAgICAgICB0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCArPSB0aGlzLl9waHlzaWNhbFNpemVzW3BpZHhdID8gMSA6IDA7CiAgICAgICAgfSwgaXRlbVNldCk7CgogICAgICAgIGlmICh0aGlzLmdyaWQpIHsKICAgICAgICAgIHRoaXMuX3VwZGF0ZUdyaWRNZXRyaWNzKCk7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFNpemUgPQogICAgICAgICAgICAgIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50IC8gdGhpcy5faXRlbXNQZXJSb3cpICogdGhpcy5fcm93SGVpZ2h0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBvbGRQaHlzaWNhbFNpemUgPSAodGhpcy5faXRlbXNQZXJSb3cgPT09IDEpID8KICAgICAgICAgICAgICBvbGRQaHlzaWNhbFNpemUgOgogICAgICAgICAgICAgIE1hdGguY2VpbCh0aGlzLl9waHlzaWNhbENvdW50IC8gdGhpcy5faXRlbXNQZXJSb3cpICogdGhpcy5fcm93SGVpZ2h0OwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxTaXplID0KICAgICAgICAgICAgICB0aGlzLl9waHlzaWNhbFNpemUgKyBuZXdQaHlzaWNhbFNpemUgLSBvbGRQaHlzaWNhbFNpemU7CiAgICAgICAgICB0aGlzLl9pdGVtc1BlclJvdyA9IDE7CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSB0aGUgYXZlcmFnZSBpZiBpdCBtZWFzdXJlZCBzb21ldGhpbmcuCiAgICAgICAgaWYgKHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50ICE9PSBwcmV2QXZnQ291bnQpIHsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQXZlcmFnZSA9IE1hdGgucm91bmQoCiAgICAgICAgICAgICAgKChwcmV2UGh5c2ljYWxBdmcgKiBwcmV2QXZnQ291bnQpICsgbmV3UGh5c2ljYWxTaXplKSAvCiAgICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF91cGRhdGVHcmlkTWV0cmljczogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5faXRlbVdpZHRoID0gdGhpcy5fcGh5c2ljYWxDb3VudCA+IDAgPwogICAgICAgICAgICB0aGlzLl9waHlzaWNhbEl0ZW1zWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoIDoKICAgICAgICAgICAgMjAwOwogICAgICAgIHRoaXMuX3Jvd0hlaWdodCA9CiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQ291bnQgPiAwID8gdGhpcy5fcGh5c2ljYWxJdGVtc1swXS5vZmZzZXRIZWlnaHQgOiAyMDA7CiAgICAgICAgdGhpcy5faXRlbXNQZXJSb3cgPSB0aGlzLl9pdGVtV2lkdGggPwogICAgICAgICAgICBNYXRoLmZsb29yKHRoaXMuX3ZpZXdwb3J0V2lkdGggLyB0aGlzLl9pdGVtV2lkdGgpIDoKICAgICAgICAgICAgdGhpcy5faXRlbXNQZXJSb3c7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBoeXNpY2FsIGl0ZW1zLgogICAgICAgKi8KICAgICAgX3Bvc2l0aW9uSXRlbXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7CgogICAgICAgIHZhciB5ID0gdGhpcy5fcGh5c2ljYWxUb3A7CgogICAgICAgIGlmICh0aGlzLmdyaWQpIHsKICAgICAgICAgIHZhciB0b3RhbEl0ZW1XaWR0aCA9IHRoaXMuX2l0ZW1zUGVyUm93ICogdGhpcy5faXRlbVdpZHRoOwogICAgICAgICAgdmFyIHJvd09mZnNldCA9ICh0aGlzLl92aWV3cG9ydFdpZHRoIC0gdG90YWxJdGVtV2lkdGgpIC8gMjsKCiAgICAgICAgICB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocGlkeCwgdmlkeCkgewogICAgICAgICAgICB2YXIgbW9kdWx1cyA9IHZpZHggJSB0aGlzLl9pdGVtc1BlclJvdzsKICAgICAgICAgICAgdmFyIHggPSBNYXRoLmZsb29yKChtb2R1bHVzICogdGhpcy5faXRlbVdpZHRoKSArIHJvd09mZnNldCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc1JUTCkgewogICAgICAgICAgICAgIHggPSB4ICogLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUzZCh4ICsgJ3B4JywgeSArICdweCcsIDAsIHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF0pOwogICAgICAgICAgICBpZiAodGhpcy5fc2hvdWxkUmVuZGVyTmV4dFJvdyh2aWR4KSkgewogICAgICAgICAgICAgIHkgKz0gdGhpcy5fcm93SGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3Qgb3JkZXIgPSBbXTsKICAgICAgICAgIHRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwaWR4LCB2aWR4KSB7CiAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9waHlzaWNhbEl0ZW1zW3BpZHhdOwogICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZTNkKDAsIHkgKyAncHgnLCAwLCBpdGVtKTsKICAgICAgICAgICAgeSArPSB0aGlzLl9waHlzaWNhbFNpemVzW3BpZHhdOwogICAgICAgICAgICBjb25zdCBpdGVtSWQgPSBpdGVtLmlkOwogICAgICAgICAgICBpZiAoaXRlbUlkKSB7CiAgICAgICAgICAgICAgb3JkZXIucHVzaChpdGVtSWQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGlmIChvcmRlci5sZW5ndGgpIHsKICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtb3ducycsIG9yZGVyLmpvaW4oJyAnKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudDogZnVuY3Rpb24ocGlkeCkgewogICAgICAgIGlmICghdGhpcy5ncmlkKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5fcGh5c2ljYWxTaXplc1twaWR4XTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2NvbXB1dGVWaWR4KHBpZHgpICUgdGhpcy5faXRlbXNQZXJSb3cgIT09IHRoaXMuX2l0ZW1zUGVyUm93IC0gMSkgewogICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9yb3dIZWlnaHQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucywgYmFzZWQgb24gdGhlIGN1cnJlbnQgaW5kZXgsCiAgICAgICAqIHdoZXRoZXIgb3Igbm90IHRoZSBuZXh0IGluZGV4IHdpbGwgbmVlZAogICAgICAgKiB0byBiZSByZW5kZXJlZCBvbiBhIG5ldyByb3cuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2aWR4IFZpcnR1YWwgaW5kZXgKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICovCiAgICAgIF9zaG91bGRSZW5kZXJOZXh0Um93OiBmdW5jdGlvbih2aWR4KSB7CiAgICAgICAgcmV0dXJuIHZpZHggJSB0aGlzLl9pdGVtc1BlclJvdyA9PT0gdGhpcy5faXRlbXNQZXJSb3cgLSAxOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEFkanVzdHMgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aGVuIGl0IHdhcyBvdmVyZXN0aW1hdGVkLgogICAgICAgKi8KICAgICAgX2FkanVzdFNjcm9sbFBvc2l0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZGVsdGFIZWlnaHQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgPT09IDAgPwogICAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA6CiAgICAgICAgICAgIE1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uICsgdGhpcy5fcGh5c2ljYWxUb3AsIDApOwogICAgICAgIC8vIE5vdGU6IHRoZSBkZWx0YSBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCiAgICAgICAgaWYgKGRlbHRhSGVpZ2h0ICE9PSAwKSB7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IHRoaXMuX3BoeXNpY2FsVG9wIC0gZGVsdGFIZWlnaHQ7CiAgICAgICAgICAvLyBUaGlzIG1heSBiZSBjYWxsZWQgb3V0c2lkZSBvZiBhIHNjcm9sbEhhbmRsZXIsIHNvIHVzZSBsYXN0IGNhY2hlZCBwb3NpdGlvbgogICAgICAgICAgdmFyIHNjcm9sbFRvcCA9IHRoaXMuX3Njcm9sbFBvc2l0aW9uOwogICAgICAgICAgLy8ganVraW5nIHNjcm9sbCBwb3NpdGlvbiBkdXJpbmcgaW50ZXJpYWwgc2Nyb2xsaW5nIG9uIGlPUyBpcyBubyBidWVubwogICAgICAgICAgaWYgKCFJT1NfVE9VQ0hfU0NST0xMSU5HICYmIHNjcm9sbFRvcCA+IDApIHsKICAgICAgICAgICAgdGhpcy5fcmVzZXRTY3JvbGxQb3NpdGlvbihzY3JvbGxUb3AgLSBkZWx0YUhlaWdodCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBzY3JvbGwuCiAgICAgICAqLwogICAgICBfcmVzZXRTY3JvbGxQb3NpdGlvbjogZnVuY3Rpb24ocG9zKSB7CiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsVGFyZ2V0ICYmIHBvcyA+PSAwKSB7CiAgICAgICAgICB0aGlzLl9zY3JvbGxUb3AgPSBwb3M7CiAgICAgICAgICB0aGlzLl9zY3JvbGxQb3NpdGlvbiA9IHRoaXMuX3Njcm9sbFRvcDsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgc2Nyb2xsIGhlaWdodCwgdGhhdCdzIHRoZSBoZWlnaHQgb2YgdGhlIGNvbnRlbnQsCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbj19IGZvcmNlVXBkYXRlIElmIHRydWUsIHVwZGF0ZXMgdGhlIGhlaWdodCBubyBtYXR0ZXIgd2hhdC4KICAgICAgICovCiAgICAgIF91cGRhdGVTY3JvbGxlclNpemU6IGZ1bmN0aW9uKGZvcmNlVXBkYXRlKSB7CiAgICAgICAgaWYgKHRoaXMuZ3JpZCkgewogICAgICAgICAgdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0ID0gdGhpcy5fdmlydHVhbFJvd0NvdW50ICogdGhpcy5fcm93SGVpZ2h0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9lc3RTY3JvbGxIZWlnaHQgPQogICAgICAgICAgICAgICh0aGlzLl9waHlzaWNhbEJvdHRvbSArCiAgICAgICAgICAgICAgIE1hdGgubWF4KAogICAgICAgICAgICAgICAgICAgdGhpcy5fdmlydHVhbENvdW50IC0gdGhpcy5fcGh5c2ljYWxDb3VudCAtIHRoaXMuX3ZpcnR1YWxTdGFydCwKICAgICAgICAgICAgICAgICAgIDApICoKICAgICAgICAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQXZlcmFnZSk7CiAgICAgICAgfQogICAgICAgIGZvcmNlVXBkYXRlID0gZm9yY2VVcGRhdGUgfHwgdGhpcy5fc2Nyb2xsSGVpZ2h0ID09PSAwOwogICAgICAgIGZvcmNlVXBkYXRlID0gZm9yY2VVcGRhdGUgfHwKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsUG9zaXRpb24gPj0gdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0IC0gdGhpcy5fcGh5c2ljYWxTaXplOwogICAgICAgIGZvcmNlVXBkYXRlID0gZm9yY2VVcGRhdGUgfHwKICAgICAgICAgICAgdGhpcy5ncmlkICYmIHRoaXMuJC5pdGVtcy5zdHlsZS5oZWlnaHQgPCB0aGlzLl9lc3RTY3JvbGxIZWlnaHQ7CiAgICAgICAgLy8gQW1vcnRpemUgaGVpZ2h0IGFkanVzdG1lbnQsIHNvIGl0IHdvbid0IHRyaWdnZXIgbGFyZ2UgcmVwYWludHMgdG9vIG9mdGVuLgogICAgICAgIGlmIChmb3JjZVVwZGF0ZSB8fAogICAgICAgICAgICBNYXRoLmFicyh0aGlzLl9lc3RTY3JvbGxIZWlnaHQgLSB0aGlzLl9zY3JvbGxIZWlnaHQpID49CiAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydEhlaWdodCkgewogICAgICAgICAgdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodCA9IHRoaXMuX2VzdFNjcm9sbEhlaWdodCArICdweCc7CiAgICAgICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSB0aGlzLl9lc3RTY3JvbGxIZWlnaHQ7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNjcm9sbCB0byBhIHNwZWNpZmljIGl0ZW0gaW4gdGhlIHZpcnR1YWwgbGlzdCByZWdhcmRsZXNzCiAgICAgICAqIG9mIHRoZSBwaHlzaWNhbCBpdGVtcyBpbiB0aGUgRE9NIHRyZWUuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2Qgc2Nyb2xsVG9JdGVtCiAgICAgICAqIEBwYXJhbSB7KE9iamVjdCl9IGl0ZW0gVGhlIGl0ZW0gdG8gYmUgc2Nyb2xsZWQgdG8KICAgICAgICovCiAgICAgIHNjcm9sbFRvSXRlbTogZnVuY3Rpb24oaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLnNjcm9sbFRvSW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTY3JvbGwgdG8gYSBzcGVjaWZpYyBpbmRleCBpbiB0aGUgdmlydHVhbCBsaXN0IHJlZ2FyZGxlc3MKICAgICAgICogb2YgdGhlIHBoeXNpY2FsIGl0ZW1zIGluIHRoZSBET00gdHJlZS4KICAgICAgICoKICAgICAgICogQG1ldGhvZCBzY3JvbGxUb0luZGV4CiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpZHggVGhlIGluZGV4IG9mIHRoZSBpdGVtCiAgICAgICAqLwogICAgICBzY3JvbGxUb0luZGV4OiBmdW5jdGlvbihpZHgpIHsKICAgICAgICBpZiAodHlwZW9mIGlkeCAhPT0gJ251bWJlcicgfHwgaWR4IDwgMCB8fCBpZHggPiB0aGlzLml0ZW1zLmxlbmd0aCAtIDEpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgZmx1c2goKTsKICAgICAgICAvLyBJdGVtcyBzaG91bGQgaGF2ZSBiZWVuIHJlbmRlcmVkIHByaW9yIHNjcm9sbGluZyB0byBhbiBpbmRleC4KICAgICAgICBpZiAodGhpcy5fcGh5c2ljYWxDb3VudCA9PT0gMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZHggPSB0aGlzLl9jbGFtcChpZHgsIDAsIHRoaXMuX3ZpcnR1YWxDb3VudCAtIDEpOwogICAgICAgIC8vIFVwZGF0ZSB0aGUgdmlydHVhbCBzdGFydCBvbmx5IHdoZW4gbmVlZGVkLgogICAgICAgIGlmICghdGhpcy5faXNJbmRleFJlbmRlcmVkKGlkeCkgfHwgaWR4ID49IHRoaXMuX21heFZpcnR1YWxTdGFydCkgewogICAgICAgICAgdGhpcy5fdmlydHVhbFN0YXJ0ID0KICAgICAgICAgICAgICB0aGlzLmdyaWQgPyAoaWR4IC0gdGhpcy5faXRlbXNQZXJSb3cgKiAyKSA6IChpZHggLSAxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbWFuYWdlRm9jdXMoKTsKICAgICAgICB0aGlzLl9hc3NpZ25Nb2RlbHMoKTsKICAgICAgICB0aGlzLl91cGRhdGVNZXRyaWNzKCk7CiAgICAgICAgLy8gRXN0aW1hdGUgbmV3IHBoeXNpY2FsIG9mZnNldC4KICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IE1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0IC8gdGhpcy5faXRlbXNQZXJSb3cpICoKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxBdmVyYWdlOwoKICAgICAgICB2YXIgY3VycmVudFRvcEl0ZW0gPSB0aGlzLl9waHlzaWNhbFN0YXJ0OwogICAgICAgIHZhciBjdXJyZW50VmlydHVhbEl0ZW0gPSB0aGlzLl92aXJ0dWFsU3RhcnQ7CiAgICAgICAgdmFyIHRhcmdldE9mZnNldFRvcCA9IDA7CiAgICAgICAgdmFyIGhpZGRlbkNvbnRlbnRTaXplID0gdGhpcy5faGlkZGVuQ29udGVudFNpemU7CiAgICAgICAgLy8gc2Nyb2xsIHRvIHRoZSBpdGVtIGFzIG11Y2ggYXMgd2UgY2FuLgogICAgICAgIHdoaWxlIChjdXJyZW50VmlydHVhbEl0ZW0gPCBpZHggJiYgdGFyZ2V0T2Zmc2V0VG9wIDw9IGhpZGRlbkNvbnRlbnRTaXplKSB7CiAgICAgICAgICB0YXJnZXRPZmZzZXRUb3AgPQogICAgICAgICAgICAgIHRhcmdldE9mZnNldFRvcCArIHRoaXMuX2dldFBoeXNpY2FsU2l6ZUluY3JlbWVudChjdXJyZW50VG9wSXRlbSk7CiAgICAgICAgICBjdXJyZW50VG9wSXRlbSA9IChjdXJyZW50VG9wSXRlbSArIDEpICUgdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgICAgIGN1cnJlbnRWaXJ0dWFsSXRlbSsrOwogICAgICAgIH0KICAgICAgICB0aGlzLl91cGRhdGVTY3JvbGxlclNpemUodHJ1ZSk7CiAgICAgICAgdGhpcy5fcG9zaXRpb25JdGVtcygpOwogICAgICAgIHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oCiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsVG9wICsgdGhpcy5fc2Nyb2xsT2Zmc2V0ICsgdGFyZ2V0T2Zmc2V0VG9wKTsKICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKTsKICAgICAgICAvLyBjbGVhciBjYWNoZWQgdmlzaWJsZSBpbmRleC4KICAgICAgICB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCA9IG51bGw7CiAgICAgICAgdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbCA9IG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVzZXQgdGhlIHBoeXNpY2FsIGF2ZXJhZ2UgYW5kIHRoZSBhdmVyYWdlIGNvdW50LgogICAgICAgKi8KICAgICAgX3Jlc2V0QXZlcmFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcGh5c2ljYWxBdmVyYWdlID0gMDsKICAgICAgICB0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCA9IDA7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQSBoYW5kbGVyIGZvciB0aGUgYGlyb24tcmVzaXplYCBldmVudCB0cmlnZ2VyZWQgYnkgYElyb25SZXNpemFibGVCZWhhdmlvcmAKICAgICAgICogd2hlbiB0aGUgZWxlbWVudCBpcyByZXNpemVkLgogICAgICAgKi8KICAgICAgX3Jlc2l6ZUhhbmRsZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlKCdfcmVuZGVyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBjbGVhciBjYWNoZWQgdmlzaWJsZSBpbmRleC4KICAgICAgICAgIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWwgPSBudWxsOwogICAgICAgICAgaWYgKHRoaXMuX2lzVmlzaWJsZSkgewogICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpOwogICAgICAgICAgICAvLyBSZWluc3RhbGwgdGhlIHNjcm9sbCBldmVudCBsaXN0ZW5lci4KICAgICAgICAgICAgdGhpcy50b2dnbGVTY3JvbGxMaXN0ZW5lcih0cnVlKTsKICAgICAgICAgICAgdGhpcy5fcmVzZXRBdmVyYWdlKCk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcigpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVW5pbnN0YWxsIHRoZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIoZmFsc2UpOwogICAgICAgICAgfQogICAgICAgIH0sIGFuaW1hdGlvbkZyYW1lKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3RzIHRoZSBnaXZlbiBpdGVtLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHNlbGVjdEl0ZW0KICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gaW5zdGFuY2UuCiAgICAgICAqLwogICAgICBzZWxlY3RJdGVtOiBmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0SW5kZXgodGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUgaXRlbXMgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2Qgc2VsZWN0SW5kZXgKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgaXRlbXMgYXJyYXkuCiAgICAgICAqLwogICAgICBzZWxlY3RJbmRleDogZnVuY3Rpb24oaW5kZXgpIHsKICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuX3ZpcnR1YWxDb3VudCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMubXVsdGlTZWxlY3Rpb24gJiYgdGhpcy5zZWxlY3RlZEl0ZW0pIHsKICAgICAgICAgIHRoaXMuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzSW5kZXhSZW5kZXJlZChpbmRleCkpIHsKICAgICAgICAgIHZhciBtb2RlbCA9IHRoaXMubW9kZWxGb3JFbGVtZW50KAogICAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChpbmRleCldKTsKICAgICAgICAgIGlmIChtb2RlbCkgewogICAgICAgICAgICBtb2RlbFt0aGlzLnNlbGVjdGVkQXNdID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KGluZGV4KTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kLnNlbGVjdG9yLnNlbGVjdEluZGV4KGluZGV4KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBEZXNlbGVjdHMgdGhlIGdpdmVuIGl0ZW0uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZGVzZWxlY3QKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gaW5zdGFuY2UuCiAgICAgICAqLwogICAgICBkZXNlbGVjdEl0ZW06IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5kZXNlbGVjdEluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRGVzZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleCBpbiB0aGUgaXRlbXMgYXJyYXkuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgZGVzZWxlY3RJbmRleAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBpdGVtIGluIHRoZSBpdGVtcyBhcnJheS4KICAgICAgICovCiAgICAgIGRlc2VsZWN0SW5kZXg6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSB0aGlzLl92aXJ0dWFsQ291bnQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2lzSW5kZXhSZW5kZXJlZChpbmRleCkpIHsKICAgICAgICAgIHZhciBtb2RlbCA9IHRoaXMubW9kZWxGb3JFbGVtZW50KAogICAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsSXRlbXNbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChpbmRleCldKTsKICAgICAgICAgIG1vZGVsW3RoaXMuc2VsZWN0ZWRBc10gPSBmYWxzZTsKICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZUZvckluZGV4KGluZGV4KTsKICAgICAgICB9CiAgICAgICAgdGhpcy4kLnNlbGVjdG9yLmRlc2VsZWN0SW5kZXgoaW5kZXgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgb3IgZGVzZWxlY3RzIGEgZ2l2ZW4gaXRlbSBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgaXRlbQogICAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHRvZ2dsZVNlbGVjdGlvbkZvckl0ZW0KICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gb2JqZWN0LgogICAgICAgKi8KICAgICAgdG9nZ2xlU2VsZWN0aW9uRm9ySXRlbTogZnVuY3Rpb24oaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLnRvZ2dsZVNlbGVjdGlvbkZvckluZGV4KHRoaXMuaXRlbXMuaW5kZXhPZihpdGVtKSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2VsZWN0cyBvciBkZXNlbGVjdHMgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBpdGVtcyBhcnJheQogICAgICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgaXRlbSBoYXMgYWxyZWFkeSBiZWVuIHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHRvZ2dsZVNlbGVjdGlvbkZvckluZGV4CiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0gaW4gdGhlIGl0ZW1zIGFycmF5LgogICAgICAgKi8KICAgICAgdG9nZ2xlU2VsZWN0aW9uRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgdmFyIGlzU2VsZWN0ZWQgPSB0aGlzLiQuc2VsZWN0b3IuaXNJbmRleFNlbGVjdGVkID8KICAgICAgICAgICAgdGhpcy4kLnNlbGVjdG9yLmlzSW5kZXhTZWxlY3RlZChpbmRleCkgOgogICAgICAgICAgICB0aGlzLiQuc2VsZWN0b3IuaXNTZWxlY3RlZCh0aGlzLml0ZW1zW2luZGV4XSk7CiAgICAgICAgaXNTZWxlY3RlZCA/IHRoaXMuZGVzZWxlY3RJbmRleChpbmRleCkgOiB0aGlzLnNlbGVjdEluZGV4KGluZGV4KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIGluIHRoZSBsaXN0LgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGNsZWFyU2VsZWN0aW9uCiAgICAgICAqLwogICAgICBjbGVhclNlbGVjdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5faXRlcmF0ZUl0ZW1zKGZ1bmN0aW9uKHBpZHgsIHZpZHgpIHsKICAgICAgICAgIHRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF0pW3RoaXMuc2VsZWN0ZWRBc10gPSBmYWxzZTsKICAgICAgICB9KTsKICAgICAgICB0aGlzLiQuc2VsZWN0b3IuY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBZGQgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYHRhcGAgaWYgYHNlbGVjdGlvbkVuYWJsZWRgIGlzIHRydWUsCiAgICAgICAqIGl0IHdpbGwgcmVtb3ZlIHRoZSBsaXN0ZW5lciBvdGhlcndpc2UuCiAgICAgICAqLwogICAgICBfc2VsZWN0aW9uRW5hYmxlZENoYW5nZWQ6IGZ1bmN0aW9uKHNlbGVjdGlvbkVuYWJsZWQpIHsKICAgICAgICB2YXIgaGFuZGxlciA9IHNlbGVjdGlvbkVuYWJsZWQgPyB0aGlzLmxpc3RlbiA6IHRoaXMudW5saXN0ZW47CiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHRoaXMsICd0YXAnLCAnX3NlbGVjdGlvbkhhbmRsZXInKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3QgYW4gaXRlbSBmcm9tIGFuIGV2ZW50IG9iamVjdC4KICAgICAgICovCiAgICAgIF9zZWxlY3Rpb25IYW5kbGVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIG1vZGVsID0gdGhpcy5tb2RlbEZvckVsZW1lbnQoZS50YXJnZXQpOwogICAgICAgIGlmICghbW9kZWwpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG1vZGVsVGFiSW5kZXgsIGFjdGl2ZUVsVGFiSW5kZXg7CiAgICAgICAgdmFyIHRhcmdldCA9IGRvbShlKS5wYXRoWzBdOwogICAgICAgIHZhciBhY3RpdmVFbCA9IHRoaXMuX2dldEFjdGl2ZUVsZW1lbnQoKTsKICAgICAgICB2YXIgcGh5c2ljYWxJdGVtID0KICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KG1vZGVsW3RoaXMuaW5kZXhBc10pXTsKICAgICAgICAvLyBTYWZhcmkgZG9lcyBub3QgZm9jdXMgY2VydGFpbiBmb3JtIGNvbnRyb2xzIHZpYSBtb3VzZQogICAgICAgIC8vIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMTgwNDMKICAgICAgICBpZiAodGFyZ2V0LmxvY2FsTmFtZSA9PT0gJ2lucHV0JyB8fCB0YXJnZXQubG9jYWxOYW1lID09PSAnYnV0dG9uJyB8fAogICAgICAgICAgICB0YXJnZXQubG9jYWxOYW1lID09PSAnc2VsZWN0JykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBTZXQgYSB0ZW1wb3JhcnkgdGFiaW5kZXgKICAgICAgICBtb2RlbFRhYkluZGV4ID0gbW9kZWwudGFiSW5kZXg7CiAgICAgICAgbW9kZWwudGFiSW5kZXggPSBTRUNSRVRfVEFCSU5ERVg7CiAgICAgICAgYWN0aXZlRWxUYWJJbmRleCA9IGFjdGl2ZUVsID8gYWN0aXZlRWwudGFiSW5kZXggOiAtMTsKICAgICAgICBtb2RlbC50YWJJbmRleCA9IG1vZGVsVGFiSW5kZXg7CiAgICAgICAgLy8gT25seSBzZWxlY3QgdGhlIGl0ZW0gaWYgdGhlIHRhcCB3YXNuJ3Qgb24gYSBmb2N1c2FibGUgY2hpbGQKICAgICAgICAvLyBvciB0aGUgZWxlbWVudCBib3VuZCB0byBgdGFiSW5kZXhgCiAgICAgICAgaWYgKGFjdGl2ZUVsICYmIHBoeXNpY2FsSXRlbSAhPT0gYWN0aXZlRWwgJiYKICAgICAgICAgICAgcGh5c2ljYWxJdGVtLmNvbnRhaW5zKGFjdGl2ZUVsKSAmJgogICAgICAgICAgICBhY3RpdmVFbFRhYkluZGV4ICE9PSBTRUNSRVRfVEFCSU5ERVgpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy50b2dnbGVTZWxlY3Rpb25Gb3JJdGVtKG1vZGVsW3RoaXMuYXNdKTsKICAgICAgfSwKCiAgICAgIF9tdWx0aVNlbGVjdGlvbkNoYW5nZWQ6IGZ1bmN0aW9uKG11bHRpU2VsZWN0aW9uKSB7CiAgICAgICAgdGhpcy5jbGVhclNlbGVjdGlvbigpOwogICAgICAgIHRoaXMuJC5zZWxlY3Rvci5tdWx0aSA9IG11bHRpU2VsZWN0aW9uOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgYSBnaXZlbiBsaXN0IGl0ZW0uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgdXBkYXRlU2l6ZUZvckl0ZW0KICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gaW5zdGFuY2UuCiAgICAgICAqLwogICAgICB1cGRhdGVTaXplRm9ySXRlbTogZnVuY3Rpb24oaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZVNpemVGb3JJbmRleCh0aGlzLml0ZW1zLmluZGV4T2YoaXRlbSkpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZXMgdGhlIHNpemUgb2YgdGhlIGl0ZW0gYXQgdGhlIGdpdmVuIGluZGV4IGluIHRoZSBpdGVtcyBhcnJheS4KICAgICAgICoKICAgICAgICogQG1ldGhvZCB1cGRhdGVTaXplRm9ySW5kZXgKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgaXRlbXMgYXJyYXkuCiAgICAgICAqLwogICAgICB1cGRhdGVTaXplRm9ySW5kZXg6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgaWYgKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoaW5kZXgpKSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdXBkYXRlTWV0cmljcyhbdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChpbmRleCldKTsKICAgICAgICB0aGlzLl9wb3NpdGlvbkl0ZW1zKCk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ3JlYXRlcyBhIHRlbXBvcmFyeSBiYWNrZmlsbCBpdGVtIGluIHRoZSByZW5kZXJlZCBwb29sIG9mIHBoeXNpY2FsIGl0ZW1zCiAgICAgICAqIHRvIHJlcGxhY2UgdGhlIG1haW4gZm9jdXNlZCBpdGVtLiBUaGUgZm9jdXNlZCBpdGVtIGhhcyB0YWJJbmRleCA9IDAKICAgICAgICogYW5kIG1pZ2h0IGJlIGN1cnJlbnRseSBmb2N1c2VkIGJ5IHRoZSB1c2VyLgogICAgICAgKgogICAgICAgKiBUaGlzIGR5bmFtaWMgcmVwbGFjZW1lbnQgaGVscHMgdG8gcHJlc2VydmUgdGhlIGZvY3VzIHN0YXRlLgogICAgICAgKi8KICAgICAgX21hbmFnZUZvY3VzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZmlkeCA9IHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXg7CgogICAgICAgIGlmIChmaWR4ID49IDAgJiYgZmlkeCA8IHRoaXMuX3ZpcnR1YWxDb3VudCkgewogICAgICAgICAgLy8gaWYgaXQncyBhIHZhbGlkIGluZGV4LCBjaGVjayBpZiB0aGF0IGluZGV4IGlzIHJlbmRlcmVkCiAgICAgICAgICAvLyBpbiBhIHBoeXNpY2FsIGl0ZW0uCiAgICAgICAgICBpZiAodGhpcy5faXNJbmRleFJlbmRlcmVkKGZpZHgpKSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fY3JlYXRlRm9jdXNCYWNrZmlsbEl0ZW0oKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3ZpcnR1YWxDb3VudCA+IDAgJiYgdGhpcy5fcGh5c2ljYWxDb3VudCA+IDApIHsKICAgICAgICAgIC8vIG90aGVyd2lzZSwgYXNzaWduIHRoZSBpbml0aWFsIGZvY3VzZWQgaW5kZXguCiAgICAgICAgICB0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleCA9IHRoaXMuX3BoeXNpY2FsU3RhcnQ7CiAgICAgICAgICB0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4ID0gdGhpcy5fdmlydHVhbFN0YXJ0OwogICAgICAgICAgdGhpcy5fZm9jdXNlZEl0ZW0gPSB0aGlzLl9waHlzaWNhbEl0ZW1zW3RoaXMuX3BoeXNpY2FsU3RhcnRdOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDb252ZXJ0cyBhIHJhbmRvbSBpbmRleCB0byB0aGUgaW5kZXggb2YgdGhlIGl0ZW0gdGhhdCBjb21wbGV0ZXMgaXQncyByb3cuCiAgICAgICAqIEFsbG93cyBmb3IgYmV0dGVyIG9yZGVyIGFuZCBmaWxsIGNvbXB1dGF0aW9uIHdoZW4gZ3JpZCA9PSB0cnVlLgogICAgICAgKi8KICAgICAgX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3c6IGZ1bmN0aW9uKGlkeCkgewogICAgICAgIC8vIHdoZW4gZ3JpZCA9PSBmYWxzZSBfaXRlbVBlclJvdyBjYW4gYmUgdW5zZXQuCiAgICAgICAgdGhpcy5faXRlbXNQZXJSb3cgPSB0aGlzLl9pdGVtc1BlclJvdyB8fCAxOwogICAgICAgIHJldHVybiB0aGlzLmdyaWQgPyBNYXRoLmNlaWwoaWR4IC8gdGhpcy5faXRlbXNQZXJSb3cpICogdGhpcy5faXRlbXNQZXJSb3cgOgogICAgICAgICAgICAgICAgICAgICAgICAgICBpZHg7CiAgICAgIH0sCgogICAgICBfaXNJbmRleFJlbmRlcmVkOiBmdW5jdGlvbihpZHgpIHsKICAgICAgICByZXR1cm4gaWR4ID49IHRoaXMuX3ZpcnR1YWxTdGFydCAmJiBpZHggPD0gdGhpcy5fdmlydHVhbEVuZDsKICAgICAgfSwKCiAgICAgIF9pc0luZGV4VmlzaWJsZTogZnVuY3Rpb24oaWR4KSB7CiAgICAgICAgcmV0dXJuIGlkeCA+PSB0aGlzLmZpcnN0VmlzaWJsZUluZGV4ICYmIGlkeCA8PSB0aGlzLmxhc3RWaXNpYmxlSW5kZXg7CiAgICAgIH0sCgogICAgICBfZ2V0UGh5c2ljYWxJbmRleDogZnVuY3Rpb24odmlkeCkgewogICAgICAgIHJldHVybiAodGhpcy5fcGh5c2ljYWxTdGFydCArICh2aWR4IC0gdGhpcy5fdmlydHVhbFN0YXJ0KSkgJQogICAgICAgICAgICB0aGlzLl9waHlzaWNhbENvdW50OwogICAgICB9LAoKICAgICAgZm9jdXNJdGVtOiBmdW5jdGlvbihpZHgpIHsKICAgICAgICB0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbShpZHgpOwogICAgICB9LAoKICAgICAgX2ZvY3VzUGh5c2ljYWxJdGVtOiBmdW5jdGlvbihpZHgpIHsKICAgICAgICBpZiAoaWR4IDwgMCB8fCBpZHggPj0gdGhpcy5fdmlydHVhbENvdW50KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOwogICAgICAgIC8vIHNjcm9sbCB0byBpbmRleCB0byBtYWtlIHN1cmUgaXQncyByZW5kZXJlZAogICAgICAgIGlmICghdGhpcy5faXNJbmRleFJlbmRlcmVkKGlkeCkpIHsKICAgICAgICAgIHRoaXMuc2Nyb2xsVG9JbmRleChpZHgpOwogICAgICAgIH0KICAgICAgICB2YXIgcGh5c2ljYWxJdGVtID0gdGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9nZXRQaHlzaWNhbEluZGV4KGlkeCldOwogICAgICAgIHZhciBtb2RlbCA9IHRoaXMubW9kZWxGb3JFbGVtZW50KHBoeXNpY2FsSXRlbSk7CiAgICAgICAgdmFyIGZvY3VzYWJsZTsKICAgICAgICAvLyBzZXQgYSBzZWNyZXQgdGFiIGluZGV4CiAgICAgICAgbW9kZWwudGFiSW5kZXggPSBTRUNSRVRfVEFCSU5ERVg7CiAgICAgICAgLy8gY2hlY2sgaWYgZm9jdXNhYmxlIGVsZW1lbnQgaXMgdGhlIHBoeXNpY2FsIGl0ZW0KICAgICAgICBpZiAocGh5c2ljYWxJdGVtLnRhYkluZGV4ID09PSBTRUNSRVRfVEFCSU5ERVgpIHsKICAgICAgICAgIGZvY3VzYWJsZSA9IHBoeXNpY2FsSXRlbTsKICAgICAgICB9CiAgICAgICAgLy8gc2VhcmNoIGZvciB0aGUgZWxlbWVudCB3aGljaCB0YWJpbmRleCBpcyBib3VuZCB0byB0aGUgc2VjcmV0IHRhYiBpbmRleAogICAgICAgIGlmICghZm9jdXNhYmxlKSB7CiAgICAgICAgICBmb2N1c2FibGUgPSBkb20ocGh5c2ljYWxJdGVtKQogICAgICAgICAgICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCdbdGFiaW5kZXg9IicgKyBTRUNSRVRfVEFCSU5ERVggKyAnIl0nKTsKICAgICAgICB9CiAgICAgICAgLy8gcmVzdG9yZSB0aGUgdGFiIGluZGV4CiAgICAgICAgbW9kZWwudGFiSW5kZXggPSAwOwogICAgICAgIC8vIGZvY3VzIHRoZSBmb2N1c2FibGUgZWxlbWVudAogICAgICAgIHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXggPSBpZHg7CiAgICAgICAgZm9jdXNhYmxlICYmIGZvY3VzYWJsZS5mb2N1cygpOwogICAgICB9LAoKICAgICAgX3JlbW92ZUZvY3VzZWRJdGVtOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0pIHsKICAgICAgICAgIHRoaXMuX2l0ZW1zUGFyZW50LnJlbW92ZUNoaWxkKHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0gPSBudWxsOwogICAgICAgIHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtID0gbnVsbDsKICAgICAgICB0aGlzLl9mb2N1c2VkSXRlbSA9IG51bGw7CiAgICAgICAgdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCA9IC0xOwogICAgICAgIHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4ID0gLTE7CiAgICAgIH0sCgogICAgICBfY3JlYXRlRm9jdXNCYWNrZmlsbEl0ZW06IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBmcGlkeCA9IHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4OwoKICAgICAgICBpZiAodGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0gfHwgdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCA8IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKCF0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSkgewogICAgICAgICAgLy8gQ3JlYXRlIGEgcGh5c2ljYWwgaXRlbS4KICAgICAgICAgIHZhciBpbnN0ID0gdGhpcy5zdGFtcChudWxsKTsKICAgICAgICAgIHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtID0KICAgICAgICAgICAgICAvKiogQHR5cGUgeyFIVE1MRWxlbWVudH0gKi8gKGluc3Qucm9vdC5xdWVyeVNlbGVjdG9yKCcqJykpOwogICAgICAgICAgdGhpcy5faXRlbXNQYXJlbnQuYXBwZW5kQ2hpbGQoaW5zdC5yb290KTsKICAgICAgICB9CiAgICAgICAgLy8gU2V0IHRoZSBvZmZjcmVlbiBmb2N1c2VkIHBoeXNpY2FsIGl0ZW0uCiAgICAgICAgdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0gPSB0aGlzLl9waHlzaWNhbEl0ZW1zW2ZwaWR4XTsKICAgICAgICB0aGlzLm1vZGVsRm9yRWxlbWVudCh0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbSkudGFiSW5kZXggPSAwOwogICAgICAgIHRoaXMuX3BoeXNpY2FsSXRlbXNbZnBpZHhdID0gdGhpcy5fZm9jdXNCYWNrZmlsbEl0ZW07CiAgICAgICAgdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXggPSBmcGlkeDsKICAgICAgICAvLyBIaWRlIHRoZSBmb2N1c2VkIHBoeXNpY2FsLgogICAgICAgIHRoaXMudHJhbnNsYXRlM2QoMCwgSElEREVOX1ksIDAsIHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTsKICAgICAgfSwKCiAgICAgIF9yZXN0b3JlRm9jdXNlZEl0ZW06IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0gfHwgdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCA8IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gQXNzaWduIG1vZGVscyB0byB0aGUgZm9jdXNlZCBpbmRleC4KICAgICAgICB0aGlzLl9hc3NpZ25Nb2RlbHMoKTsKICAgICAgICAvLyBHZXQgdGhlIG5ldyBwaHlzaWNhbCBpbmRleCBmb3IgdGhlIGZvY3VzZWQgaW5kZXguCiAgICAgICAgdmFyIGZwaWR4ID0gdGhpcy5fZm9jdXNlZFBoeXNpY2FsSW5kZXggPQogICAgICAgICAgICB0aGlzLl9nZXRQaHlzaWNhbEluZGV4KHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpOwoKICAgICAgICB2YXIgb25TY3JlZW5JdGVtID0gdGhpcy5fcGh5c2ljYWxJdGVtc1tmcGlkeF07CiAgICAgICAgaWYgKCFvblNjcmVlbkl0ZW0pIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIG9uU2NyZWVuSW5zdGFuY2UgPSB0aGlzLm1vZGVsRm9yRWxlbWVudChvblNjcmVlbkl0ZW0pOwogICAgICAgIHZhciBvZmZTY3JlZW5JbnN0YW5jZSA9IHRoaXMubW9kZWxGb3JFbGVtZW50KHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKTsKICAgICAgICAvLyBSZXN0b3JlcyB0aGUgcGh5c2ljYWwgaXRlbSBvbmx5IHdoZW4gaXQgaGFzIHRoZSBzYW1lIG1vZGVsCiAgICAgICAgLy8gYXMgdGhlIG9mZnNjcmVlbiBvbmUuIFVzZSBrZXkgZm9yIGNvbXBhcmlzb24gc2luY2UgdXNlcnMgY2FuIHNldAogICAgICAgIC8vIGEgbmV3IGl0ZW0gdmlhIHNldCgnaXRlbXMuaWR4JykuCiAgICAgICAgaWYgKG9uU2NyZWVuSW5zdGFuY2VbdGhpcy5hc10gPT09IG9mZlNjcmVlbkluc3RhbmNlW3RoaXMuYXNdKSB7CiAgICAgICAgICAvLyBGbGlwIHRoZSBmb2N1cyBiYWNrZmlsbC4KICAgICAgICAgIHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtID0gb25TY3JlZW5JdGVtOwogICAgICAgICAgb25TY3JlZW5JbnN0YW5jZS50YWJJbmRleCA9IC0xOwogICAgICAgICAgLy8gUmVzdG9yZSB0aGUgZm9jdXNlZCBwaHlzaWNhbCBpdGVtLgogICAgICAgICAgdGhpcy5fcGh5c2ljYWxJdGVtc1tmcGlkeF0gPSB0aGlzLl9vZmZzY3JlZW5Gb2N1c2VkSXRlbTsKICAgICAgICAgIC8vIEhpZGUgdGhlIHBoeXNpY2FsIGl0ZW0gdGhhdCBiYWNrZmlsbHMuCiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZTNkKDAsIEhJRERFTl9ZLCAwLCB0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3JlbW92ZUZvY3VzZWRJdGVtKCk7CiAgICAgICAgICB0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtID0gbnVsbDsKICAgICAgfSwKCiAgICAgIF9kaWRGb2N1czogZnVuY3Rpb24oZSkgewogICAgICAgIHZhciB0YXJnZXRNb2RlbCA9IHRoaXMubW9kZWxGb3JFbGVtZW50KGUudGFyZ2V0KTsKICAgICAgICB2YXIgZm9jdXNlZE1vZGVsID0gdGhpcy5tb2RlbEZvckVsZW1lbnQodGhpcy5fZm9jdXNlZEl0ZW0pOwogICAgICAgIHZhciBoYXNPZmZzY3JlZW5Gb2N1c2VkSXRlbSA9IHRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtICE9PSBudWxsOwogICAgICAgIHZhciBmaWR4ID0gdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleDsKICAgICAgICBpZiAoIXRhcmdldE1vZGVsKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChmb2N1c2VkTW9kZWwgPT09IHRhcmdldE1vZGVsKSB7CiAgICAgICAgICAvLyBJZiB0aGUgdXNlciBmb2N1c2VkIHRoZSBzYW1lIGl0ZW0sIHRoZW4gYnJpbmcgaXQgaW50byB2aWV3IGlmIGl0J3Mgbm90CiAgICAgICAgICAvLyB2aXNpYmxlLgogICAgICAgICAgaWYgKCF0aGlzLl9pc0luZGV4VmlzaWJsZShmaWR4KSkgewogICAgICAgICAgICB0aGlzLnNjcm9sbFRvSW5kZXgoZmlkeCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3Jlc3RvcmVGb2N1c2VkSXRlbSgpOwogICAgICAgICAgLy8gUmVzdG9yZSB0YWJJbmRleCBmb3IgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGl0ZW0uCiAgICAgICAgICBpZiAoZm9jdXNlZE1vZGVsKSB7CiAgICAgICAgICAgIGZvY3VzZWRNb2RlbC50YWJJbmRleCA9IC0xOwogICAgICAgICAgfQogICAgICAgICAgLy8gU2V0IHRoZSB0YWJJbmRleCBmb3IgdGhlIG5leHQgZm9jdXNlZCBpdGVtLgogICAgICAgICAgdGFyZ2V0TW9kZWwudGFiSW5kZXggPSAwOwogICAgICAgICAgZmlkeCA9IHRhcmdldE1vZGVsW3RoaXMuaW5kZXhBc107CiAgICAgICAgICB0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4ID0gZmlkeDsKICAgICAgICAgIHRoaXMuX2ZvY3VzZWRQaHlzaWNhbEluZGV4ID0gdGhpcy5fZ2V0UGh5c2ljYWxJbmRleChmaWR4KTsKICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJdGVtID0gdGhpcy5fcGh5c2ljYWxJdGVtc1t0aGlzLl9mb2N1c2VkUGh5c2ljYWxJbmRleF07CiAgICAgICAgICBpZiAoaGFzT2Zmc2NyZWVuRm9jdXNlZEl0ZW0gJiYgIXRoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9rZXlkb3duSGFuZGxlcjogZnVuY3Rpb24oZSkgewogICAgICAgIHN3aXRjaCAoZS5rZXlDb2RlKSB7CiAgICAgICAgICBjYXNlIC8qIEFSUk9XX0RPV04gKi8gNDA6CiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4IDwgdGhpcy5fdmlydHVhbENvdW50IC0gMSkKICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKAogICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCArICh0aGlzLmdyaWQgPyB0aGlzLl9pdGVtc1BlclJvdyA6IDEpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlIC8qIEFSUk9XX1JJR0hUICovIDM5OgogICAgICAgICAgICBpZiAodGhpcy5ncmlkKQogICAgICAgICAgICAgIHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKAogICAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4ICsgKHRoaXMuX2lzUlRMID8gLTEgOiAxKSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAvKiBBUlJPV19VUCAqLyAzODoKICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXggPiAwKQogICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdGhpcy5fZm9jdXNQaHlzaWNhbEl0ZW0oCiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4IC0gKHRoaXMuZ3JpZCA/IHRoaXMuX2l0ZW1zUGVyUm93IDogMSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgLyogQVJST1dfTEVGVCAqLyAzNzoKICAgICAgICAgICAgaWYgKHRoaXMuZ3JpZCkKICAgICAgICAgICAgICB0aGlzLl9mb2N1c1BoeXNpY2FsSXRlbSgKICAgICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCArICh0aGlzLl9pc1JUTCA/IDEgOiAtMSkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgLyogRU5URVIgKi8gMTM6CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzUGh5c2ljYWxJdGVtKHRoaXMuX2ZvY3VzZWRWaXJ0dWFsSW5kZXgpOwogICAgICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25FbmFibGVkKQogICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbkhhbmRsZXIoZSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9jbGFtcDogZnVuY3Rpb24odiwgbWluLCBtYXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHYpKTsKICAgICAgfSwKCiAgICAgIF9kZWJvdW5jZTogZnVuY3Rpb24obmFtZSwgY2IsIGFzeW5jTW9kdWxlKSB7CiAgICAgICAgdGhpcy5fZGVib3VuY2VycyA9IHRoaXMuX2RlYm91bmNlcnMgfHwge307CiAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tuYW1lXSA9CiAgICAgICAgICAgIERlYm91bmNlci5kZWJvdW5jZSh0aGlzLl9kZWJvdW5jZXJzW25hbWVdLCBhc3luY01vZHVsZSwgY2IuYmluZCh0aGlzKSk7CiAgICAgICAgZW5xdWV1ZURlYm91bmNlcih0aGlzLl9kZWJvdW5jZXJzW25hbWVdKTsKICAgICAgfSwKCiAgICAgIF9mb3J3YXJkUHJvcGVydHk6IGZ1bmN0aW9uKGluc3QsIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgaW5zdC5fc2V0UGVuZGluZ1Byb3BlcnR5KG5hbWUsIHZhbHVlKTsKICAgICAgfSwKCiAgICAgIC8qIFRlbXBsYXRpemVyIGJpbmRpbmdzIGZvciB2MiAqLwogICAgICBfZm9yd2FyZEhvc3RQcm9wVjI6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgKHRoaXMuX3BoeXNpY2FsSXRlbXMgfHwgW10pCiAgICAgICAgICAgIC5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLCB0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pCiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgICAgICAgdGhpcy5tb2RlbEZvckVsZW1lbnQoaXRlbSkuZm9yd2FyZEhvc3RQcm9wKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICB9LAoKICAgICAgX25vdGlmeUluc3RhbmNlUHJvcFYyOiBmdW5jdGlvbihpbnN0LCBwcm9wLCB2YWx1ZSkgewogICAgICAgIGlmIChtYXRjaGVzKHRoaXMuYXMsIHByb3ApKSB7CiAgICAgICAgICB2YXIgaWR4ID0gaW5zdFt0aGlzLmluZGV4QXNdOwogICAgICAgICAgaWYgKHByb3AgPT0gdGhpcy5hcykgewogICAgICAgICAgICB0aGlzLml0ZW1zW2lkeF0gPSB2YWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMubm90aWZ5UGF0aCh0cmFuc2xhdGUodGhpcy5hcywgJ2l0ZW1zLicgKyBpZHgsIHByb3ApLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyogVGVtcGxhdGl6ZXIgYmluZGluZ3MgZm9yIHYxICovCiAgICAgIF9nZXRTdGFtcGVkQ2hpbGRyZW46IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9waHlzaWNhbEl0ZW1zOwogICAgICB9LAoKICAgICAgX2ZvcndhcmRJbnN0YW5jZVBhdGg6IGZ1bmN0aW9uKGluc3QsIHBhdGgsIHZhbHVlKSB7CiAgICAgICAgaWYgKHBhdGguaW5kZXhPZih0aGlzLmFzICsgJy4nKSA9PT0gMCkgewogICAgICAgICAgdGhpcy5ub3RpZnlQYXRoKAogICAgICAgICAgICAgICdpdGVtcy4nICsgaW5zdC5fX2tleV9fICsgJy4nICsgcGF0aC5zbGljZSh0aGlzLmFzLmxlbmd0aCArIDEpLAogICAgICAgICAgICAgIHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfZm9yd2FyZFBhcmVudFBhdGg6IGZ1bmN0aW9uKHBhdGgsIHZhbHVlKSB7CiAgICAgICAgKHRoaXMuX3BoeXNpY2FsSXRlbXMgfHwgW10pCiAgICAgICAgICAgIC5jb25jYXQoW3RoaXMuX29mZnNjcmVlbkZvY3VzZWRJdGVtLCB0aGlzLl9mb2N1c0JhY2tmaWxsSXRlbV0pCiAgICAgICAgICAgIC5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgICAgICAgdGhpcy5tb2RlbEZvckVsZW1lbnQoaXRlbSkubm90aWZ5UGF0aChwYXRoLCB2YWx1ZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIF9mb3J3YXJkUGFyZW50UHJvcDogZnVuY3Rpb24ocHJvcCwgdmFsdWUpIHsKICAgICAgICAodGhpcy5fcGh5c2ljYWxJdGVtcyB8fCBbXSkKICAgICAgICAgICAgLmNvbmNhdChbdGhpcy5fb2Zmc2NyZWVuRm9jdXNlZEl0ZW0sIHRoaXMuX2ZvY3VzQmFja2ZpbGxJdGVtXSkKICAgICAgICAgICAgLmZvckVhY2goZnVuY3Rpb24oaXRlbSkgewogICAgICAgICAgICAgIGlmIChpdGVtKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsRm9yRWxlbWVudChpdGVtKVtwcm9wXSA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgIH0sCgogICAgICAvKiBHZXRzIHRoZSBhY3RpdmVFbGVtZW50IG9mIHRoZSBzaGFkb3cgcm9vdC9ob3N0IHRoYXQgY29udGFpbnMgdGhlIGxpc3QuICovCiAgICAgIF9nZXRBY3RpdmVFbGVtZW50OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaXRlbXNIb3N0ID0gdGhpcy5faXRlbXNQYXJlbnQubm9kZS5kb21Ib3N0OwogICAgICAgIHJldHVybiBkb20oaXRlbXNIb3N0ID8gaXRlbXNIb3N0LnJvb3QgOiBkb2N1bWVudCkuYWN0aXZlRWxlbWVudDsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY2xhc3MgSXJvblNlbGVjdGlvbiB7CiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0geyFGdW5jdGlvbn0gc2VsZWN0Q2FsbGJhY2sKICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvdmlkZX0KICAgICAgICovCiAgICAgIGNvbnN0cnVjdG9yKHNlbGVjdENhbGxiYWNrKSB7CiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSBbXTsKICAgICAgICB0aGlzLnNlbGVjdENhbGxiYWNrID0gc2VsZWN0Q2FsbGJhY2s7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXRyaWV2ZXMgdGhlIHNlbGVjdGVkIGl0ZW0ocykuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm5zIFJldHVybnMgdGhlIHNlbGVjdGVkIGl0ZW0ocykuIElmIHRoZSBtdWx0aSBwcm9wZXJ0eSBpcyB0cnVlLAogICAgICAgKiBgZ2V0YCB3aWxsIHJldHVybiBhbiBhcnJheSwgb3RoZXJ3aXNlIGl0IHdpbGwgcmV0dXJuCiAgICAgICAqIHRoZSBzZWxlY3RlZCBpdGVtIG9yIHVuZGVmaW5lZCBpZiB0aGVyZSBpcyBubyBzZWxlY3Rpb24uCiAgICAgICAqLwogICAgICBnZXQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubXVsdGkgPyB0aGlzLnNlbGVjdGlvbi5zbGljZSgpIDogdGhpcy5zZWxlY3Rpb25bMF07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDbGVhcnMgYWxsIHRoZSBzZWxlY3Rpb24gZXhjZXB0IHRoZSBvbmVzIGluZGljYXRlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtBcnJheX0gZXhjbHVkZXMgaXRlbXMgdG8gYmUgZXhjbHVkZWQuCiAgICAgICAqLwogICAgICBjbGVhcihleGNsdWRlcykgewogICAgICAgIHRoaXMuc2VsZWN0aW9uLnNsaWNlKCkuZm9yRWFjaChmdW5jdGlvbihpdGVtKSB7CiAgICAgICAgICBpZiAoIWV4Y2x1ZGVzIHx8IGV4Y2x1ZGVzLmluZGV4T2YoaXRlbSkgPCAwKSB7CiAgICAgICAgICAgIHRoaXMuc2V0SXRlbVNlbGVjdGVkKGl0ZW0sIGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9LCB0aGlzKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEluZGljYXRlcyBpZiBhIGdpdmVuIGl0ZW0gaXMgc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBUaGUgaXRlbSB3aG9zZSBzZWxlY3Rpb24gc3RhdGUgc2hvdWxkIGJlIGNoZWNrZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFJldHVybnMgdHJ1ZSBpZiBgaXRlbWAgaXMgc2VsZWN0ZWQuCiAgICAgICAqLwogICAgICBpc1NlbGVjdGVkKGl0ZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uaW5kZXhPZihpdGVtKSA+PSAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgc2VsZWN0aW9uIHN0YXRlIGZvciBhIGdpdmVuIGl0ZW0gdG8gZWl0aGVyIHNlbGVjdGVkIG9yIGRlc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBUaGUgaXRlbSB0byBzZWxlY3QuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gaXNTZWxlY3RlZCBUcnVlIGZvciBzZWxlY3RlZCwgZmFsc2UgZm9yIGRlc2VsZWN0ZWQuCiAgICAgICAqLwogICAgICBzZXRJdGVtU2VsZWN0ZWQoaXRlbSwgaXNTZWxlY3RlZCkgewogICAgICAgIGlmIChpdGVtICE9IG51bGwpIHsKICAgICAgICAgIGlmIChpc1NlbGVjdGVkICE9PSB0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgICAgLy8gcHJvY2VlZCB0byB1cGRhdGUgc2VsZWN0aW9uIG9ubHkgaWYgcmVxdWVzdGVkIHN0YXRlIGRpZmZlcnMgZnJvbQogICAgICAgICAgICAvLyBjdXJyZW50CiAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKSB7CiAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24ucHVzaChpdGVtKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgaSA9IHRoaXMuc2VsZWN0aW9uLmluZGV4T2YoaXRlbSk7CiAgICAgICAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zZWxlY3RDYWxsYmFjaykgewogICAgICAgICAgICAgIHRoaXMuc2VsZWN0Q2FsbGJhY2soaXRlbSwgaXNTZWxlY3RlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSBzZWxlY3Rpb24gc3RhdGUgZm9yIGEgZ2l2ZW4gaXRlbS4gSWYgdGhlIGBtdWx0aWAgcHJvcGVydHkKICAgICAgICogaXMgdHJ1ZSwgdGhlbiB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgYGl0ZW1gIHdpbGwgYmUgdG9nZ2xlZDsgb3RoZXJ3aXNlCiAgICAgICAqIHRoZSBgaXRlbWAgd2lsbCBiZSBzZWxlY3RlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHsqfSBpdGVtIFRoZSBpdGVtIHRvIHNlbGVjdC4KICAgICAgICovCiAgICAgIHNlbGVjdChpdGVtKSB7CiAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgIHRoaXMudG9nZ2xlKGl0ZW0pOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5nZXQoKSAhPT0gaXRlbSkgewogICAgICAgICAgdGhpcy5zZXRJdGVtU2VsZWN0ZWQodGhpcy5nZXQoKSwgZmFsc2UpOwogICAgICAgICAgdGhpcy5zZXRJdGVtU2VsZWN0ZWQoaXRlbSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyB0aGUgc2VsZWN0aW9uIHN0YXRlIGZvciBgaXRlbWAuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Kn0gaXRlbSBUaGUgaXRlbSB0byB0b2dnbGUuCiAgICAgICAqLwogICAgICB0b2dnbGUoaXRlbSkgewogICAgICAgIHRoaXMuc2V0SXRlbVNlbGVjdGVkKGl0ZW0sICF0aGlzLmlzU2VsZWN0ZWQoaXRlbSkpOwogICAgICB9CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBAcG9seW1lckJlaGF2aW9yCiAgICAgKi8KICAgIGNvbnN0IElyb25TZWxlY3RhYmxlQmVoYXZpb3IgPSB7CgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbiBpcm9uLXNlbGVjdG9yIGlzIGFjdGl2YXRlZCAoc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZCkuCiAgICAgICAqIEl0IGlzIGZpcmVkIGJlZm9yZSB0aGUgc2VsZWN0ZWQgaXRlbXMgYXJlIGNoYW5nZWQuCiAgICAgICAqIENhbmNlbCB0aGUgZXZlbnQgdG8gYWJvcnQgc2VsZWN0aW9uLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgaXJvbi1hY3RpdmF0ZQogICAgICAgKi8KCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuIGFuIGl0ZW0gaXMgc2VsZWN0ZWQKICAgICAgICoKICAgICAgICogQGV2ZW50IGlyb24tc2VsZWN0CiAgICAgICAqLwoKICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gYW4gaXRlbSBpcyBkZXNlbGVjdGVkCiAgICAgICAqCiAgICAgICAqIEBldmVudCBpcm9uLWRlc2VsZWN0CiAgICAgICAqLwoKICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gdGhlIGxpc3Qgb2Ygc2VsZWN0YWJsZSBpdGVtcyBjaGFuZ2VzIChlLmcuLCBpdGVtcyBhcmUKICAgICAgICogYWRkZWQgb3IgcmVtb3ZlZCkuIFRoZSBkZXRhaWwgb2YgdGhlIGV2ZW50IGlzIGEgbXV0YXRpb24gcmVjb3JkIHRoYXQKICAgICAgICogZGVzY3JpYmVzIHdoYXQgY2hhbmdlZC4KICAgICAgICoKICAgICAgICogQGV2ZW50IGlyb24taXRlbXMtY2hhbmdlZAogICAgICAgKi8KCiAgICAgIHByb3BlcnRpZXM6IHsKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgeW91IHdhbnQgdG8gdXNlIGFuIGF0dHJpYnV0ZSB2YWx1ZSBvciBwcm9wZXJ0eSBvZiBhbiBlbGVtZW50IGZvcgogICAgICAgICAqIGBzZWxlY3RlZGAgaW5zdGVhZCBvZiB0aGUgaW5kZXgsIHNldCB0aGlzIHRvIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKICAgICAgICAgKiBvciBwcm9wZXJ0eS4gSHlwaGVuYXRlZCB2YWx1ZXMgYXJlIGNvbnZlcnRlZCB0byBjYW1lbCBjYXNlIHdoZW4gdXNlZCB0bwogICAgICAgICAqIGxvb2sgdXAgdGhlIHByb3BlcnR5IG9mIGEgc2VsZWN0YWJsZSBlbGVtZW50LiBDYW1lbCBjYXNlZCB2YWx1ZXMgYXJlCiAgICAgICAgICogKm5vdCogY29udmVydGVkIHRvIGh5cGhlbmF0ZWQgdmFsdWVzIGZvciBhdHRyaWJ1dGUgbG9va3VwLiBJdCdzCiAgICAgICAgICogcmVjb21tZW5kZWQgdGhhdCB5b3UgcHJvdmlkZSB0aGUgaHlwaGVuYXRlZCBmb3JtIG9mIHRoZSBuYW1lIHNvIHRoYXQKICAgICAgICAgKiBzZWxlY3Rpb24gd29ya3MgaW4gYm90aCBjYXNlcy4gKFVzZSBgYXR0ci1vci1wcm9wZXJ0eS1uYW1lYCBpbnN0ZWFkIG9mCiAgICAgICAgICogYGF0dHJPclByb3BlcnR5TmFtZWAuKQogICAgICAgICAqLwogICAgICAgIGF0dHJGb3JTZWxlY3RlZDoge3R5cGU6IFN0cmluZywgdmFsdWU6IG51bGx9LAoKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIG9yIHNldHMgdGhlIHNlbGVjdGVkIGVsZW1lbnQuIFRoZSBkZWZhdWx0IGlzIHRvIHVzZSB0aGUgaW5kZXggb2YgdGhlCiAgICAgICAgICogaXRlbS4KICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfG51bWJlcn0KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZDoge3R5cGU6IFN0cmluZywgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGl0ZW0uCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7P09iamVjdH0KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZEl0ZW06IHt0eXBlOiBPYmplY3QsIHJlYWRPbmx5OiB0cnVlLCBub3RpZnk6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZXZlbnQgdGhhdCBmaXJlcyBmcm9tIGl0ZW1zIHdoZW4gdGhleSBhcmUgc2VsZWN0ZWQuIFNlbGVjdGFibGUKICAgICAgICAgKiB3aWxsIGxpc3RlbiBmb3IgdGhpcyBldmVudCBmcm9tIGl0ZW1zIGFuZCB1cGRhdGUgdGhlIHNlbGVjdGlvbiBzdGF0ZS4KICAgICAgICAgKiBTZXQgdG8gZW1wdHkgc3RyaW5nIHRvIGxpc3RlbiB0byBubyBldmVudHMuCiAgICAgICAgICovCiAgICAgICAgYWN0aXZhdGVFdmVudDoKICAgICAgICAgICAge3R5cGU6IFN0cmluZywgdmFsdWU6ICd0YXAnLCBvYnNlcnZlcjogJ19hY3RpdmF0ZUV2ZW50Q2hhbmdlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGlzIGEgQ1NTIHNlbGVjdG9yIHN0cmluZy4gIElmIHRoaXMgaXMgc2V0LCBvbmx5IGl0ZW1zIHRoYXQgbWF0Y2ggdGhlCiAgICAgICAgICogQ1NTIHNlbGVjdG9yIGFyZSBzZWxlY3RhYmxlLgogICAgICAgICAqLwogICAgICAgIHNlbGVjdGFibGU6IFN0cmluZywKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNsYXNzIHRvIHNldCBvbiBlbGVtZW50cyB3aGVuIHNlbGVjdGVkLgogICAgICAgICAqLwogICAgICAgIHNlbGVjdGVkQ2xhc3M6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnaXJvbi1zZWxlY3RlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXR0cmlidXRlIHRvIHNldCBvbiBlbGVtZW50cyB3aGVuIHNlbGVjdGVkLgogICAgICAgICAqLwogICAgICAgIHNlbGVjdGVkQXR0cmlidXRlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogbnVsbH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERlZmF1bHQgZmFsbGJhY2sgaWYgdGhlIHNlbGVjdGlvbiBiYXNlZCBvbiBzZWxlY3RlZCB3aXRoCiAgICAgICAgICogYGF0dHJGb3JTZWxlY3RlZGAgaXMgbm90IGZvdW5kLgogICAgICAgICAqLwogICAgICAgIGZhbGxiYWNrU2VsZWN0aW9uOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogbnVsbH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsaXN0IG9mIGl0ZW1zIGZyb20gd2hpY2ggYSBzZWxlY3Rpb24gY2FuIGJlIG1hZGUuCiAgICAgICAgICovCiAgICAgICAgaXRlbXM6IHsKICAgICAgICAgIHR5cGU6IEFycmF5LAogICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2V0IG9mIGV4Y2x1ZGVkIGVsZW1lbnRzIHdoZXJlIHRoZSBrZXkgaXMgdGhlIGBsb2NhbE5hbWVgCiAgICAgICAgICogb2YgdGhlIGVsZW1lbnQgdGhhdCB3aWxsIGJlIGlnbm9yZWQgZnJvbSB0aGUgaXRlbSBsaXN0LgogICAgICAgICAqCiAgICAgICAgICogQGRlZmF1bHQge3RlbXBsYXRlOiAxfQogICAgICAgICAqLwogICAgICAgIF9leGNsdWRlZExvY2FsTmFtZXM6IHsKICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAndGVtcGxhdGUnOiAxLAogICAgICAgICAgICAgICdkb20tYmluZCc6IDEsCiAgICAgICAgICAgICAgJ2RvbS1pZic6IDEsCiAgICAgICAgICAgICAgJ2RvbS1yZXBlYXQnOiAxLAogICAgICAgICAgICB9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIG9ic2VydmVyczogWwogICAgICAgICdfdXBkYXRlQXR0ckZvclNlbGVjdGVkKGF0dHJGb3JTZWxlY3RlZCknLAogICAgICAgICdfdXBkYXRlU2VsZWN0ZWQoc2VsZWN0ZWQpJywKICAgICAgICAnX2NoZWNrRmFsbGJhY2soZmFsbGJhY2tTZWxlY3Rpb24pJwogICAgICBdLAoKICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fYmluZEZpbHRlckl0ZW0gPSB0aGlzLl9maWx0ZXJJdGVtLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gbmV3IElyb25TZWxlY3Rpb24odGhpcy5fYXBwbHlTZWxlY3Rpb24uYmluZCh0aGlzKSk7CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSB0aGlzLl9vYnNlcnZlSXRlbXModGhpcyk7CiAgICAgICAgdGhpcy5fYWRkTGlzdGVuZXIodGhpcy5hY3RpdmF0ZUV2ZW50KTsKICAgICAgfSwKCiAgICAgIGRldGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHsKICAgICAgICAgIGRvbSh0aGlzKS51bm9ic2VydmVOb2Rlcyh0aGlzLl9vYnNlcnZlcik7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3JlbW92ZUxpc3RlbmVyKHRoaXMuYWN0aXZhdGVFdmVudCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGdpdmVuIGl0ZW0uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgaW5kZXhPZgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gaXRlbQogICAgICAgKiBAcmV0dXJucyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgaXRlbQogICAgICAgKi8KICAgICAgaW5kZXhPZjogZnVuY3Rpb24oaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy5pbmRleE9mKGl0ZW0pIDogLTE7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gdmFsdWUuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2Qgc2VsZWN0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgdGhlIHZhbHVlIHRvIHNlbGVjdC4KICAgICAgICovCiAgICAgIHNlbGVjdDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgcHJldmlvdXMgaXRlbS4KICAgICAgICoKICAgICAgICogQG1ldGhvZCBzZWxlY3RQcmV2aW91cwogICAgICAgKi8KICAgICAgc2VsZWN0UHJldmlvdXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLml0ZW1zLmxlbmd0aDsKICAgICAgICB2YXIgaW5kZXggPSBsZW5ndGggLSAxOwogICAgICAgIGlmICh0aGlzLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGluZGV4ID0gKE51bWJlcih0aGlzLl92YWx1ZVRvSW5kZXgodGhpcy5zZWxlY3RlZCkpIC0gMSArIGxlbmd0aCkgJSBsZW5ndGg7CiAgICAgICAgfQogICAgICAgIHRoaXMuc2VsZWN0ZWQgPSB0aGlzLl9pbmRleFRvVmFsdWUoaW5kZXgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNlbGVjdHMgdGhlIG5leHQgaXRlbS4KICAgICAgICoKICAgICAgICogQG1ldGhvZCBzZWxlY3ROZXh0CiAgICAgICAqLwogICAgICBzZWxlY3ROZXh0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW5kZXggPSAwOwogICAgICAgIGlmICh0aGlzLnNlbGVjdGVkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGluZGV4ID0KICAgICAgICAgICAgICAoTnVtYmVyKHRoaXMuX3ZhbHVlVG9JbmRleCh0aGlzLnNlbGVjdGVkKSkgKyAxKSAlIHRoaXMuaXRlbXMubGVuZ3RoOwogICAgICAgIH0KICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5faW5kZXhUb1ZhbHVlKGluZGV4KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3RzIHRoZSBpdGVtIGF0IHRoZSBnaXZlbiBpbmRleC4KICAgICAgICoKICAgICAgICogQG1ldGhvZCBzZWxlY3RJbmRleAogICAgICAgKi8KICAgICAgc2VsZWN0SW5kZXg6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5faW5kZXhUb1ZhbHVlKGluZGV4KSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRm9yY2UgYSBzeW5jaHJvbm91cyB1cGRhdGUgb2YgdGhlIGBpdGVtc2AgcHJvcGVydHkuCiAgICAgICAqCiAgICAgICAqIE5PVEU6IENvbnNpZGVyIGxpc3RlbmluZyBmb3IgdGhlIGBpcm9uLWl0ZW1zLWNoYW5nZWRgIGV2ZW50IHRvIHJlc3BvbmQgdG8KICAgICAgICogdXBkYXRlcyB0byB0aGUgc2V0IG9mIHNlbGVjdGFibGUgaXRlbXMgYWZ0ZXIgdXBkYXRlcyB0byB0aGUgRE9NIGxpc3QgYW5kCiAgICAgICAqIHNlbGVjdGlvbiBzdGF0ZSBoYXZlIGJlZW4gbWFkZS4KICAgICAgICoKICAgICAgICogV0FSTklORzogSWYgeW91IGFyZSB1c2luZyB0aGlzIG1ldGhvZCwgeW91IHNob3VsZCBwcm9iYWJseSBjb25zaWRlciBhbgogICAgICAgKiBhbHRlcm5hdGUgYXBwcm9hY2guIFN5bmNocm9ub3VzbHkgcXVlcnlpbmcgZm9yIGl0ZW1zIGlzIHBvdGVudGlhbGx5CiAgICAgICAqIHNsb3cgZm9yIG1hbnkgdXNlIGNhc2VzLiBUaGUgYGl0ZW1zYCBwcm9wZXJ0eSB3aWxsIHVwZGF0ZSBhc3luY2hyb25vdXNseQogICAgICAgKiBvbiBpdHMgb3duIHRvIHJlZmxlY3Qgc2VsZWN0YWJsZSBpdGVtcyBpbiB0aGUgRE9NLgogICAgICAgKi8KICAgICAgZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9vYnNlcnZlciAmJiB0eXBlb2YgdGhpcy5fb2JzZXJ2ZXIuZmx1c2ggPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgIC8vIE5PVEUoYmlja25lbGxyKTogYGRvbS5mbHVzaGAgYWJvdmUgaXMgbm8gbG9uZ2VyIHN1ZmZpY2llbnQgdG8gdHJpZ2dlcgogICAgICAgICAgLy8gYG9ic2VydmVOb2Rlc2AgY2FsbGJhY2tzLiBQb2x5bWVyIDIueCByZXR1cm5zIGFuIG9iamVjdCBmcm9tCiAgICAgICAgICAvLyBgb2JzZXJ2ZU5vZGVzYCB3aXRoIGEgYGZsdXNoYCB0aGF0IHN5bmNocm9ub3VzbHkgZ2l2ZXMgdGhlIGNhbGxiYWNrIGFueQogICAgICAgICAgLy8gcGVuZGluZyBNdXRhdGlvblJlY29yZHMgKHJldHJpZXZlZCB3aXRoIGB0YWtlUmVjb3Jkc2ApLiBBbnkgY2FzZSB3aGVyZQogICAgICAgICAgLy8gU2hhZHlET00gZmx1c2hlcyB3ZXJlIGV4cGVjdGVkIHRvIHN5bmNocm9ub3VzbHkgdHJpZ2dlciBpdGVtIHVwZGF0ZXMKICAgICAgICAgIC8vIHdpbGwgbm93IHJlcXVpcmUgY2FsbGluZyBgZm9yY2VTeW5jaHJvbm91c0l0ZW1VcGRhdGVgLgogICAgICAgICAgdGhpcy5fb2JzZXJ2ZXIuZmx1c2goKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fdXBkYXRlSXRlbXMoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvLyBVTlVTRUQsIEZPUiBBUEkgQ09NUEFUSUJJTElUWQogICAgICBnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCAhPSBudWxsOwogICAgICB9LAoKICAgICAgX2NoZWNrRmFsbGJhY2s6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7CiAgICAgIH0sCgogICAgICBfYWRkTGlzdGVuZXI6IGZ1bmN0aW9uKGV2ZW50TmFtZSkgewogICAgICAgIHRoaXMubGlzdGVuKHRoaXMsIGV2ZW50TmFtZSwgJ19hY3RpdmF0ZUhhbmRsZXInKTsKICAgICAgfSwKCiAgICAgIF9yZW1vdmVMaXN0ZW5lcjogZnVuY3Rpb24oZXZlbnROYW1lKSB7CiAgICAgICAgdGhpcy51bmxpc3Rlbih0aGlzLCBldmVudE5hbWUsICdfYWN0aXZhdGVIYW5kbGVyJyk7CiAgICAgIH0sCgogICAgICBfYWN0aXZhdGVFdmVudENoYW5nZWQ6IGZ1bmN0aW9uKGV2ZW50TmFtZSwgb2xkKSB7CiAgICAgICAgdGhpcy5fcmVtb3ZlTGlzdGVuZXIob2xkKTsKICAgICAgICB0aGlzLl9hZGRMaXN0ZW5lcihldmVudE5hbWUpOwogICAgICB9LAoKICAgICAgX3VwZGF0ZUl0ZW1zOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgbm9kZXMgPSBkb20odGhpcykucXVlcnlEaXN0cmlidXRlZEVsZW1lbnRzKHRoaXMuc2VsZWN0YWJsZSB8fCAnKicpOwogICAgICAgIG5vZGVzID0gQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKG5vZGVzLCB0aGlzLl9iaW5kRmlsdGVySXRlbSk7CiAgICAgICAgdGhpcy5fc2V0SXRlbXMobm9kZXMpOwogICAgICB9LAoKICAgICAgX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRJdGVtKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuc2VsZWN0ZWRJdGVtKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfdXBkYXRlU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3NlbGVjdFNlbGVjdGVkKHRoaXMuc2VsZWN0ZWQpOwogICAgICB9LAoKICAgICAgX3NlbGVjdFNlbGVjdGVkOiBmdW5jdGlvbihzZWxlY3RlZCkgewogICAgICAgIGlmICghdGhpcy5pdGVtcykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl92YWx1ZVRvSXRlbSh0aGlzLnNlbGVjdGVkKTsKICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgdGhpcy5fc2VsZWN0aW9uLnNlbGVjdChpdGVtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fc2VsZWN0aW9uLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrIGZvciBpdGVtcywgc2luY2UgdGhpcyBhcnJheSBpcyBwb3B1bGF0ZWQgb25seSB3aGVuIGF0dGFjaGVkCiAgICAgICAgLy8gU2luY2UgTnVtYmVyKDApIGlzIGZhbHN5LCBleHBsaWNpdGx5IGNoZWNrIGZvciB1bmRlZmluZWQKICAgICAgICBpZiAodGhpcy5mYWxsYmFja1NlbGVjdGlvbiAmJiB0aGlzLml0ZW1zLmxlbmd0aCAmJgogICAgICAgICAgICAodGhpcy5fc2VsZWN0aW9uLmdldCgpID09PSB1bmRlZmluZWQpKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdGhpcy5mYWxsYmFja1NlbGVjdGlvbjsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfZmlsdGVySXRlbTogZnVuY3Rpb24obm9kZSkgewogICAgICAgIHJldHVybiAhdGhpcy5fZXhjbHVkZWRMb2NhbE5hbWVzW25vZGUubG9jYWxOYW1lXTsKICAgICAgfSwKCiAgICAgIF92YWx1ZVRvSXRlbTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gKHZhbHVlID09IG51bGwpID8gbnVsbCA6IHRoaXMuaXRlbXNbdGhpcy5fdmFsdWVUb0luZGV4KHZhbHVlKV07CiAgICAgIH0sCgogICAgICBfdmFsdWVUb0luZGV4OiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmICh0aGlzLmF0dHJGb3JTZWxlY3RlZCkgewogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGl0ZW07IGl0ZW0gPSB0aGlzLml0ZW1zW2ldOyBpKyspIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3ZhbHVlRm9ySXRlbShpdGVtKSA9PSB2YWx1ZSkgewogICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBOdW1iZXIodmFsdWUpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9pbmRleFRvVmFsdWU6IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgICAgaWYgKHRoaXMuYXR0ckZvclNlbGVjdGVkKSB7CiAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbaW5kZXhdOwogICAgICAgICAgaWYgKGl0ZW0pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlRm9ySXRlbShpdGVtKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF92YWx1ZUZvckl0ZW06IGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICBpZiAoIWl0ZW0pIHsKICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuYXR0ckZvclNlbGVjdGVkKSB7CiAgICAgICAgICB2YXIgaSA9IHRoaXMuaW5kZXhPZihpdGVtKTsKICAgICAgICAgIHJldHVybiBpID09PSAtMSA/IG51bGwgOiBpOwogICAgICAgIH0KICAgICAgICB2YXIgcHJvcFZhbHVlID0gaXRlbVtkYXNoVG9DYW1lbENhc2UodGhpcy5hdHRyRm9yU2VsZWN0ZWQpXTsKICAgICAgICByZXR1cm4gcHJvcFZhbHVlICE9IHVuZGVmaW5lZCA/IHByb3BWYWx1ZSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLmdldEF0dHJpYnV0ZSh0aGlzLmF0dHJGb3JTZWxlY3RlZCk7CiAgICAgIH0sCgogICAgICBfYXBwbHlTZWxlY3Rpb246IGZ1bmN0aW9uKGl0ZW0sIGlzU2VsZWN0ZWQpIHsKICAgICAgICBpZiAodGhpcy5zZWxlY3RlZENsYXNzKSB7CiAgICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKHRoaXMuc2VsZWN0ZWRDbGFzcywgaXNTZWxlY3RlZCwgaXRlbSk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLnNlbGVjdGVkQXR0cmlidXRlKSB7CiAgICAgICAgICB0aGlzLnRvZ2dsZUF0dHJpYnV0ZSh0aGlzLnNlbGVjdGVkQXR0cmlidXRlLCBpc1NlbGVjdGVkLCBpdGVtKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2VsZWN0aW9uQ2hhbmdlKCk7CiAgICAgICAgdGhpcy5maXJlKCdpcm9uLScgKyAoaXNTZWxlY3RlZCA/ICdzZWxlY3QnIDogJ2Rlc2VsZWN0JyksIHtpdGVtOiBpdGVtfSk7CiAgICAgIH0sCgogICAgICBfc2VsZWN0aW9uQ2hhbmdlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW0odGhpcy5fc2VsZWN0aW9uLmdldCgpKTsKICAgICAgfSwKCiAgICAgIC8vIG9ic2VydmUgaXRlbXMgY2hhbmdlIHVuZGVyIHRoZSBnaXZlbiBub2RlLgogICAgICBfb2JzZXJ2ZUl0ZW1zOiBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgcmV0dXJuIGRvbShub2RlKS5vYnNlcnZlTm9kZXMoZnVuY3Rpb24obXV0YXRpb24pIHsKICAgICAgICAgIHRoaXMuX3VwZGF0ZUl0ZW1zKCk7CiAgICAgICAgICB0aGlzLl91cGRhdGVTZWxlY3RlZCgpOwoKICAgICAgICAgIC8vIExldCBvdGhlciBpbnRlcmVzdGVkIHBhcnRpZXMga25vdyBhYm91dCB0aGUgY2hhbmdlIHNvIHRoYXQKICAgICAgICAgIC8vIHdlIGRvbid0IGhhdmUgdG8gcmVjcmVhdGUgbXV0YXRpb24gb2JzZXJ2ZXJzIGV2ZXJ5d2hlcmUuCiAgICAgICAgICB0aGlzLmZpcmUoCiAgICAgICAgICAgICAgJ2lyb24taXRlbXMtY2hhbmdlZCcsIG11dGF0aW9uLCB7YnViYmxlczogZmFsc2UsIGNhbmNlbGFibGU6IGZhbHNlfSk7CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICBfYWN0aXZhdGVIYW5kbGVyOiBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIHQgPSBlLnRhcmdldDsKICAgICAgICB2YXIgaXRlbXMgPSB0aGlzLml0ZW1zOwogICAgICAgIHdoaWxlICh0ICYmIHQgIT0gdGhpcykgewogICAgICAgICAgdmFyIGkgPSBpdGVtcy5pbmRleE9mKHQpOwogICAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgICB2YXIgdmFsdWUgPSB0aGlzLl9pbmRleFRvVmFsdWUoaSk7CiAgICAgICAgICAgIHRoaXMuX2l0ZW1BY3RpdmF0ZSh2YWx1ZSwgdCk7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHQgPSB0LnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2l0ZW1BY3RpdmF0ZTogZnVuY3Rpb24odmFsdWUsIGl0ZW0pIHsKICAgICAgICBpZiAoIXRoaXMuZmlyZSgnaXJvbi1hY3RpdmF0ZScsIHtzZWxlY3RlZDogdmFsdWUsIGl0ZW06IGl0ZW19LCB7CiAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgICAuZGVmYXVsdFByZXZlbnRlZCkgewogICAgICAgICAgdGhpcy5zZWxlY3QodmFsdWUpOwogICAgICAgIH0KICAgICAgfQoKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBgaXJvbi1wYWdlc2AgaXMgdXNlZCB0byBzZWxlY3Qgb25lIG9mIGl0cyBjaGlsZHJlbiB0byBzaG93LiBPbmUgdXNlIGlzIHRvIGN5Y2xlCiAgICB0aHJvdWdoIGEgbGlzdCBvZiBjaGlsZHJlbiAicGFnZXMiLgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxpcm9uLXBhZ2VzIHNlbGVjdGVkPSIwIj4KICAgICAgICAgIDxkaXY+T25lPC9kaXY+CiAgICAgICAgICA8ZGl2PlR3bzwvZGl2PgogICAgICAgICAgPGRpdj5UaHJlZTwvZGl2PgogICAgICAgIDwvaXJvbi1wYWdlcz4KCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgcGFnZXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdpcm9uLXBhZ2VzJyk7CiAgICAgICAgICAgIHBhZ2VzLnNlbGVjdE5leHQoKTsKICAgICAgICAgIH0pOwogICAgICAgIDwvSkFWQV9TQ1JJSUlJUFQvPgoKICAgIEBncm91cCBJcm9uIEVsZW1lbnRzCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKDpub3Qoc2xvdCk6bm90KC5pcm9uLXNlbGVjdGVkKSkgewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsCgogICAgICBpczogJ2lyb24tcGFnZXMnLAogICAgICBiZWhhdmlvcnM6IFtJcm9uUmVzaXphYmxlQmVoYXZpb3IsIElyb25TZWxlY3RhYmxlQmVoYXZpb3JdLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvLyBhcyB0aGUgc2VsZWN0ZWQgcGFnZSBpcyB0aGUgb25seSBvbmUgdmlzaWJsZSwgYWN0aXZhdGVFdmVudAogICAgICAgIC8vIGlzIGJvdGggbm9uLXNlbnNpY2FsIGFuZCBwcm9ibGVtYXRpYzsgZS5nLiBpbiBjYXNlcyB3aGVyZSBhIHVzZXIKICAgICAgICAvLyBoYW5kbGVyIGF0dGVtcHRzIHRvIGNoYW5nZSB0aGUgcGFnZSBhbmQgdGhlIGFjdGl2YXRlRXZlbnQKICAgICAgICAvLyBoYW5kbGVyIGltbWVkaWF0ZWx5IGNoYW5nZXMgaXQgYmFjawogICAgICAgIGFjdGl2YXRlRXZlbnQ6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiBudWxsfQoKICAgICAgfSwKCiAgICAgIG9ic2VydmVyczogWydfc2VsZWN0ZWRQYWdlQ2hhbmdlZChzZWxlY3RlZCknXSwKCiAgICAgIF9zZWxlY3RlZFBhZ2VDaGFuZ2VkOiBmdW5jdGlvbihzZWxlY3RlZCwgb2xkKSB7CiAgICAgICAgdGhpcy5hc3luYyh0aGlzLm5vdGlmeVJlc2l6ZSk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgY29uc3QgdGVtcGxhdGUkNCA9IGh0bWxgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CgogICAgICAtLXNoYWRvdy10cmFuc2l0aW9uOiB7CiAgICAgICAgdHJhbnNpdGlvbjogYm94LXNoYWRvdyAwLjI4cyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctbm9uZTogewogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgIH07CgogICAgICAvKiBmcm9tIGh0dHA6Ly9jb2RlcGVuLmlvL3NoeW5kbWFuL3Blbi9jNTM5NGRkZjJlOGIyYTVjOTE4NTkwNGI1NzQyMWNkYiAqLwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTJkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMnB4IDJweCAwIHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCAxcHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMik7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tM2RwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAzcHggNHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCA4cHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi00ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDRweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgMXB4IDEwcHggMCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi02ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDZweCAxMHB4IDAgcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDFweCAxOHB4IDAgcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgfTsKCiAgICAgIC0tc2hhZG93LWVsZXZhdGlvbi0xMmRwOiB7CiAgICAgICAgYm94LXNoYWRvdzogMCAxMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksCiAgICAgICAgICAgICAgICAgICAgMCA0cHggMjJweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKSwKICAgICAgICAgICAgICAgICAgICAwIDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgIH07CgogICAgICAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDogewogICAgICAgIGJveC1zaGFkb3c6IDAgMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLAogICAgICAgICAgICAgICAgICAgIDAgIDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgIDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwoKICAgICAgLS1zaGFkb3ctZWxldmF0aW9uLTI0ZHA6IHsKICAgICAgICBib3gtc2hhZG93OiAwIDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwKICAgICAgICAgICAgICAgICAgICAwIDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpLAogICAgICAgICAgICAgICAgICAgIDAgMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjQpOwogICAgICB9OwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPmA7CiAgICB0ZW1wbGF0ZSQ0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUkNC5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KICAgIGNvbnN0IHRlbXBsYXRlJDUgPSBodG1sYAo8ZG9tLW1vZHVsZSBpZD0icGFwZXItbWF0ZXJpYWwtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIGh0bWwgewogICAgICAgIC0tcGFwZXItbWF0ZXJpYWw6IHsKICAgICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tNmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNDogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi04ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgICAgfTsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWwgewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsOwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjEiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMiJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjsKICAgICAgfQogICAgICAucGFwZXItbWF0ZXJpYWxbZWxldmF0aW9uPSIzIl0gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOwogICAgICB9CiAgICAgIC5wYXBlci1tYXRlcmlhbFtlbGV2YXRpb249IjQiXSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KICAgICAgLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNSJdIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTsKICAgICAgfQoKICAgICAgLyogRHVwbGljYXRlIHRoZSBzdHlsZXMgYmVjYXVzZSBvZiBodHRwczovL2dpdGh1Yi5jb20vd2ViY29tcG9uZW50cy9zaGFkeWNzcy9pc3N1ZXMvMTkzICovCiAgICAgIDpob3N0IHsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsOiB7CiAgICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMjogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi00ZHA7CiAgICAgICAgfTsKICAgICAgICAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0zOiB7CiAgICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTZkcDsKICAgICAgICB9OwogICAgICAgIC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ6IHsKICAgICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICAgIH07CiAgICAgICAgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tNTogewogICAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0xNmRwOwogICAgICAgIH07CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMiJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTI7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTM7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNCJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICAgIH0KICAgICAgOmhvc3QoLnBhcGVyLW1hdGVyaWFsW2VsZXZhdGlvbj0iNSJdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPmA7CiAgICB0ZW1wbGF0ZSQ1LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUkNS5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgICogQHBvbHltZXJCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBJcm9uQ29udHJvbFN0YXRlID0gewoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgZWxlbWVudCBjdXJyZW50bHkgaGFzIGZvY3VzLgogICAgICAgICAqLwogICAgICAgIGZvY3VzZWQ6IHsKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICByZWFkT25seTogdHJ1ZSwKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHRoZSB1c2VyIGNhbm5vdCBpbnRlcmFjdCB3aXRoIHRoaXMgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlZDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgIG9ic2VydmVyOiAnX2Rpc2FibGVkQ2hhbmdlZCcsCiAgICAgICAgICByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBWYWx1ZSBvZiB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUgYmVmb3JlIGBkaXNhYmxlZGAgd2FzIGFjdGl2YXRlZC4KICAgICAgICAgKiBgbnVsbGAgbWVhbnMgdGhlIGF0dHJpYnV0ZSB3YXMgbm90IHByZXNlbnQuCiAgICAgICAgICogQHR5cGUgez9zdHJpbmd8dW5kZWZpbmVkfQogICAgICAgICAqLwogICAgICAgIF9vbGRUYWJJbmRleDoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIF9ib3VuZEZvY3VzQmx1ckhhbmRsZXI6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9jdXNCbHVySGFuZGxlci5iaW5kKHRoaXMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIG9ic2VydmVyczogWydfY2hhbmdlZENvbnRyb2xTdGF0ZShmb2N1c2VkLCBkaXNhYmxlZCknXSwKCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXMnLCB0aGlzLl9ib3VuZEZvY3VzQmx1ckhhbmRsZXIsIHRydWUpOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX2JvdW5kRm9jdXNCbHVySGFuZGxlciwgdHJ1ZSk7CiAgICAgIH0sCgogICAgICBfZm9jdXNCbHVySGFuZGxlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAvLyBQb2x5bWVyIHRha2VzIGNhcmUgb2YgcmV0YXJnZXRpbmcgZXZlbnRzLgogICAgICAgIHRoaXMuX3NldEZvY3VzZWQoZXZlbnQudHlwZSA9PT0gJ2ZvY3VzJyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9LAoKICAgICAgX2Rpc2FibGVkQ2hhbmdlZDogZnVuY3Rpb24oZGlzYWJsZWQsIG9sZCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWRpc2FibGVkJywgZGlzYWJsZWQgPyAndHJ1ZScgOiAnZmFsc2UnKTsKICAgICAgICB0aGlzLnN0eWxlLnBvaW50ZXJFdmVudHMgPSBkaXNhYmxlZCA/ICdub25lJyA6ICcnOwogICAgICAgIGlmIChkaXNhYmxlZCkgewogICAgICAgICAgLy8gUmVhZCB0aGUgYHRhYmluZGV4YCBhdHRyaWJ1dGUgaW5zdGVhZCBvZiB0aGUgYHRhYkluZGV4YCBwcm9wZXJ0eS4KICAgICAgICAgIC8vIFRoZSBwcm9wZXJ0eSByZXR1cm5zIGAtMWAgaWYgdGhlcmUgaXMgbm8gYHRhYmluZGV4YCBhdHRyaWJ1dGUuCiAgICAgICAgICAvLyBUaGlzIGRpc3RpbmN0aW9uIGlzIGltcG9ydGFudCB3aGVuIHJlc3RvcmluZyB0aGUgdmFsdWUgYmVjYXVzZQogICAgICAgICAgLy8gbGVhdmluZyBgLTFgIGhpZGVzIHNoYWRvdyByb290IGNoaWxkcmVuIGZyb20gdGhlIHRhYiBvcmRlci4KICAgICAgICAgIHRoaXMuX29sZFRhYkluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7CiAgICAgICAgICB0aGlzLl9zZXRGb2N1c2VkKGZhbHNlKTsKICAgICAgICAgIHRoaXMudGFiSW5kZXggPSAtMTsKICAgICAgICAgIHRoaXMuYmx1cigpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fb2xkVGFiSW5kZXggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKHRoaXMuX29sZFRhYkluZGV4ID09PSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgdGhpcy5fb2xkVGFiSW5kZXgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9jaGFuZ2VkQ29udHJvbFN0YXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBfY29udHJvbFN0YXRlQ2hhbmdlZCBpcyBhYnN0cmFjdCwgZm9sbG93LW9uIGJlaGF2aW9ycyBtYXkgaW1wbGVtZW50IGl0CiAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2xTdGF0ZUNoYW5nZWQpIHsKICAgICAgICAgIHRoaXMuX2NvbnRyb2xTdGF0ZUNoYW5nZWQoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAgKiBAcG9seW1lckJlaGF2aW9yIElyb25CdXR0b25TdGF0ZQogICAgICovCiAgICBjb25zdCBJcm9uQnV0dG9uU3RhdGVJbXBsID0gewoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBpcyBjdXJyZW50bHkgaG9sZGluZyBkb3duIHRoZSBidXR0b24uCiAgICAgICAgICovCiAgICAgICAgcHJlc3NlZDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfcHJlc3NlZENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIGJ1dHRvbiB0b2dnbGVzIHRoZSBhY3RpdmUgc3RhdGUgd2l0aCBlYWNoIHRhcCBvciBwcmVzcwogICAgICAgICAqIG9mIHRoZSBzcGFjZWJhci4KICAgICAgICAgKi8KICAgICAgICB0b2dnbGVzOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlLCByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgYnV0dG9uIGlzIGEgdG9nZ2xlIGFuZCBpcyBjdXJyZW50bHkgaW4gdGhlIGFjdGl2ZSBzdGF0ZS4KICAgICAgICAgKi8KICAgICAgICBhY3RpdmU6CiAgICAgICAgICAgIHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIG5vdGlmeTogdHJ1ZSwgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBjdXJyZW50bHkgYmVpbmcgcHJlc3NlZCBieSBhICJwb2ludGVyLCIgd2hpY2gKICAgICAgICAgKiBpcyBsb29zZWx5IGRlZmluZWQgYXMgbW91c2Ugb3IgdG91Y2ggaW5wdXQgKGJ1dCBzcGVjaWZpY2FsbHkgZXhjbHVkaW5nCiAgICAgICAgICoga2V5Ym9hcmQgaW5wdXQpLgogICAgICAgICAqLwogICAgICAgIHBvaW50ZXJEb3duOiB7dHlwZTogQm9vbGVhbiwgcmVhZE9ubHk6IHRydWUsIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRydWUgaWYgdGhlIGlucHV0IGRldmljZSB0aGF0IGNhdXNlZCB0aGUgZWxlbWVudCB0byByZWNlaXZlIGZvY3VzCiAgICAgICAgICogd2FzIGEga2V5Ym9hcmQuCiAgICAgICAgICovCiAgICAgICAgcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZDoge3R5cGU6IEJvb2xlYW4sIHJlYWRPbmx5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGFyaWEgYXR0cmlidXRlIHRvIGJlIHNldCBpZiB0aGUgYnV0dG9uIGlzIGEgdG9nZ2xlIGFuZCBpbiB0aGUKICAgICAgICAgKiBhY3RpdmUgc3RhdGUuCiAgICAgICAgICovCiAgICAgICAgYXJpYUFjdGl2ZUF0dHJpYnV0ZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgdmFsdWU6ICdhcmlhLXByZXNzZWQnLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfYXJpYUFjdGl2ZUF0dHJpYnV0ZUNoYW5nZWQnCiAgICAgICAgfQogICAgICB9LAoKICAgICAgbGlzdGVuZXJzOiB7ZG93bjogJ19kb3duSGFuZGxlcicsIHVwOiAnX3VwSGFuZGxlcicsIHRhcDogJ190YXBIYW5kbGVyJ30sCgogICAgICBvYnNlcnZlcnM6CiAgICAgICAgICBbJ19mb2N1c0NoYW5nZWQoZm9jdXNlZCknLCAnX2FjdGl2ZUNoYW5nZWQoYWN0aXZlLCBhcmlhQWN0aXZlQXR0cmlidXRlKSddLAoKICAgICAgLyoqCiAgICAgICAqIEB0eXBlIHshT2JqZWN0fQogICAgICAgKi8KICAgICAga2V5QmluZGluZ3M6IHsKICAgICAgICAnZW50ZXI6a2V5ZG93bic6ICdfYXN5bmNDbGljaycsCiAgICAgICAgJ3NwYWNlOmtleWRvd24nOiAnX3NwYWNlS2V5RG93bkhhbmRsZXInLAogICAgICAgICdzcGFjZTprZXl1cCc6ICdfc3BhY2VLZXlVcEhhbmRsZXInLAogICAgICB9LAoKICAgICAgX21vdXNlRXZlbnRSZTogL15tb3VzZS8sCgogICAgICBfdGFwSGFuZGxlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMudG9nZ2xlcykgewogICAgICAgICAgLy8gYSB0YXAgaXMgbmVlZGVkIHRvIHRvZ2dsZSB0aGUgYWN0aXZlIHN0YXRlCiAgICAgICAgICB0aGlzLl91c2VyQWN0aXZhdGUoIXRoaXMuYWN0aXZlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfZm9jdXNDaGFuZ2VkOiBmdW5jdGlvbihmb2N1c2VkKSB7CiAgICAgICAgdGhpcy5fZGV0ZWN0S2V5Ym9hcmRGb2N1cyhmb2N1c2VkKTsKCiAgICAgICAgaWYgKCFmb2N1c2VkKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcmVzc2VkKGZhbHNlKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfZGV0ZWN0S2V5Ym9hcmRGb2N1czogZnVuY3Rpb24oZm9jdXNlZCkgewogICAgICAgIHRoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoIXRoaXMucG9pbnRlckRvd24gJiYgZm9jdXNlZCk7CiAgICAgIH0sCgogICAgICAvLyB0byBlbXVsYXRlIG5hdGl2ZSBjaGVja2JveCwgKGRlLSlhY3RpdmF0aW9ucyBmcm9tIGEgdXNlciBpbnRlcmFjdGlvbiBmaXJlCiAgICAgIC8vICdjaGFuZ2UnIGV2ZW50cwogICAgICBfdXNlckFjdGl2YXRlOiBmdW5jdGlvbihhY3RpdmUpIHsKICAgICAgICBpZiAodGhpcy5hY3RpdmUgIT09IGFjdGl2ZSkgewogICAgICAgICAgdGhpcy5hY3RpdmUgPSBhY3RpdmU7CiAgICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9kb3duSGFuZGxlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLl9zZXRQb2ludGVyRG93bih0cnVlKTsKICAgICAgICB0aGlzLl9zZXRQcmVzc2VkKHRydWUpOwogICAgICAgIHRoaXMuX3NldFJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQoZmFsc2UpOwogICAgICB9LAoKICAgICAgX3VwSGFuZGxlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fc2V0UG9pbnRlckRvd24oZmFsc2UpOwogICAgICAgIHRoaXMuX3NldFByZXNzZWQoZmFsc2UpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7IUtleWJvYXJkRXZlbnR9IGV2ZW50IC4KICAgICAgICovCiAgICAgIF9zcGFjZUtleURvd25IYW5kbGVyOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBrZXlib2FyZEV2ZW50ID0gZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQ7CiAgICAgICAgdmFyIHRhcmdldCA9IGRvbShrZXlib2FyZEV2ZW50KS5sb2NhbFRhcmdldDsKCiAgICAgICAgLy8gSWdub3JlIHRoZSBldmVudCBpZiB0aGlzIGlzIGNvbWluZyBmcm9tIGEgZm9jdXNlZCBsaWdodCBjaGlsZCwgc2luY2UgdGhhdAogICAgICAgIC8vIGVsZW1lbnQgd2lsbCBkZWFsIHdpdGggaXQuCiAgICAgICAgaWYgKHRoaXMuaXNMaWdodERlc2NlbmRhbnQoLyoqIEB0eXBlIHtOb2RlfSAqLyAodGFyZ2V0KSkpCiAgICAgICAgICByZXR1cm47CgogICAgICAgIGtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICBrZXlib2FyZEV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgIHRoaXMuX3NldFByZXNzZWQodHJ1ZSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHBhcmFtIHshS2V5Ym9hcmRFdmVudH0gZXZlbnQgLgogICAgICAgKi8KICAgICAgX3NwYWNlS2V5VXBIYW5kbGVyOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBrZXlib2FyZEV2ZW50ID0gZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQ7CiAgICAgICAgdmFyIHRhcmdldCA9IGRvbShrZXlib2FyZEV2ZW50KS5sb2NhbFRhcmdldDsKCiAgICAgICAgLy8gSWdub3JlIHRoZSBldmVudCBpZiB0aGlzIGlzIGNvbWluZyBmcm9tIGEgZm9jdXNlZCBsaWdodCBjaGlsZCwgc2luY2UgdGhhdAogICAgICAgIC8vIGVsZW1lbnQgd2lsbCBkZWFsIHdpdGggaXQuCiAgICAgICAgaWYgKHRoaXMuaXNMaWdodERlc2NlbmRhbnQoLyoqIEB0eXBlIHtOb2RlfSAqLyAodGFyZ2V0KSkpCiAgICAgICAgICByZXR1cm47CgogICAgICAgIGlmICh0aGlzLnByZXNzZWQpIHsKICAgICAgICAgIHRoaXMuX2FzeW5jQ2xpY2soKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2V0UHJlc3NlZChmYWxzZSk7CiAgICAgIH0sCgogICAgICAvLyB0cmlnZ2VyIGNsaWNrIGFzeW5jaHJvbm91c2x5LCB0aGUgYXN5bmNocm9ueSBpcyB1c2VmdWwgdG8gYWxsb3cgb25lCiAgICAgIC8vIGV2ZW50IGhhbmRsZXIgdG8gdW53aW5kIGJlZm9yZSB0cmlnZ2VyaW5nIGFub3RoZXIgZXZlbnQKICAgICAgX2FzeW5jQ2xpY2s6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuYXN5bmMoZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmNsaWNrKCk7CiAgICAgICAgfSwgMSk7CiAgICAgIH0sCgogICAgICAvLyBhbnkgb2YgdGhlc2UgY2hhbmdlcyBhcmUgY29uc2lkZXJlZCBhIGNoYW5nZSB0byBidXR0b24gc3RhdGUKCiAgICAgIF9wcmVzc2VkQ2hhbmdlZDogZnVuY3Rpb24ocHJlc3NlZCkgewogICAgICAgIHRoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpOwogICAgICB9LAoKICAgICAgX2FyaWFBY3RpdmVBdHRyaWJ1dGVDaGFuZ2VkOiBmdW5jdGlvbih2YWx1ZSwgb2xkVmFsdWUpIHsKICAgICAgICBpZiAob2xkVmFsdWUgJiYgb2xkVmFsdWUgIT0gdmFsdWUgJiYgdGhpcy5oYXNBdHRyaWJ1dGUob2xkVmFsdWUpKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShvbGRWYWx1ZSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2FjdGl2ZUNoYW5nZWQ6IGZ1bmN0aW9uKGFjdGl2ZSwgYXJpYUFjdGl2ZUF0dHJpYnV0ZSkgewogICAgICAgIGlmICh0aGlzLnRvZ2dsZXMpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSwgYWN0aXZlID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKHRoaXMuYXJpYUFjdGl2ZUF0dHJpYnV0ZSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NoYW5nZWRCdXR0b25TdGF0ZSgpOwogICAgICB9LAoKICAgICAgX2NvbnRyb2xTdGF0ZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICB0aGlzLl9zZXRQcmVzc2VkKGZhbHNlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fY2hhbmdlZEJ1dHRvblN0YXRlKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLy8gcHJvdmlkZSBob29rIGZvciBmb2xsb3ctb24gYmVoYXZpb3JzIHRvIHJlYWN0IHRvIGJ1dHRvbi1zdGF0ZQoKICAgICAgX2NoYW5nZWRCdXR0b25TdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2J1dHRvblN0YXRlQ2hhbmdlZCkgewogICAgICAgICAgdGhpcy5fYnV0dG9uU3RhdGVDaGFuZ2VkKCk7ICAvLyBhYnN0cmFjdAogICAgICAgIH0KICAgICAgfQoKICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IElyb25CdXR0b25TdGF0ZSA9IFtJcm9uQTExeUtleXNCZWhhdmlvciwgSXJvbkJ1dHRvblN0YXRlSW1wbF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE0IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgdmFyIFV0aWxpdHkgPSB7CiAgICAgIGRpc3RhbmNlOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MikgewogICAgICAgIHZhciB4RGVsdGEgPSAoeDEgLSB4Mik7CiAgICAgICAgdmFyIHlEZWx0YSA9ICh5MSAtIHkyKTsKCiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh4RGVsdGEgKiB4RGVsdGEgKyB5RGVsdGEgKiB5RGVsdGEpOwogICAgICB9LAoKICAgICAgbm93OiB3aW5kb3cucGVyZm9ybWFuY2UgJiYgd2luZG93LnBlcmZvcm1hbmNlLm5vdyA/CiAgICAgICAgICB3aW5kb3cucGVyZm9ybWFuY2Uubm93LmJpbmQod2luZG93LnBlcmZvcm1hbmNlKSA6CiAgICAgICAgICBEYXRlLm5vdwogICAgfTsKCiAgICAvKioKICAgICAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICovCiAgICBmdW5jdGlvbiBFbGVtZW50TWV0cmljcyhlbGVtZW50KSB7CiAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgIHRoaXMud2lkdGggPSB0aGlzLmJvdW5kaW5nUmVjdC53aWR0aDsKICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmJvdW5kaW5nUmVjdC5oZWlnaHQ7CgogICAgICB0aGlzLnNpemUgPSBNYXRoLm1heCh0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7CiAgICB9CgogICAgRWxlbWVudE1ldHJpY3MucHJvdG90eXBlID0gewogICAgICBnZXQgYm91bmRpbmdSZWN0KCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIH0sCgogICAgICBmdXJ0aGVzdENvcm5lckRpc3RhbmNlRnJvbTogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciB0b3BMZWZ0ID0gVXRpbGl0eS5kaXN0YW5jZSh4LCB5LCAwLCAwKTsKICAgICAgICB2YXIgdG9wUmlnaHQgPSBVdGlsaXR5LmRpc3RhbmNlKHgsIHksIHRoaXMud2lkdGgsIDApOwogICAgICAgIHZhciBib3R0b21MZWZ0ID0gVXRpbGl0eS5kaXN0YW5jZSh4LCB5LCAwLCB0aGlzLmhlaWdodCk7CiAgICAgICAgdmFyIGJvdHRvbVJpZ2h0ID0gVXRpbGl0eS5kaXN0YW5jZSh4LCB5LCB0aGlzLndpZHRoLCB0aGlzLmhlaWdodCk7CgogICAgICAgIHJldHVybiBNYXRoLm1heCh0b3BMZWZ0LCB0b3BSaWdodCwgYm90dG9tTGVmdCwgYm90dG9tUmlnaHQpOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudAogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIFJpcHBsZShlbGVtZW50KSB7CiAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgIHRoaXMuY29sb3IgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KS5jb2xvcjsKCiAgICAgIHRoaXMud2F2ZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICB0aGlzLndhdmVDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgdGhpcy53YXZlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IHRoaXMuY29sb3I7CiAgICAgIHRoaXMud2F2ZS5jbGFzc0xpc3QuYWRkKCd3YXZlJyk7CiAgICAgIHRoaXMud2F2ZUNvbnRhaW5lci5jbGFzc0xpc3QuYWRkKCd3YXZlLWNvbnRhaW5lcicpOwogICAgICBkb20odGhpcy53YXZlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLndhdmUpOwoKICAgICAgdGhpcy5yZXNldEludGVyYWN0aW9uU3RhdGUoKTsKICAgIH0KCiAgICBSaXBwbGUuTUFYX1JBRElVUyA9IDMwMDsKCiAgICBSaXBwbGUucHJvdG90eXBlID0gewogICAgICBnZXQgcmVjZW50ZXJzKCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQucmVjZW50ZXJzOwogICAgICB9LAoKICAgICAgZ2V0IGNlbnRlcigpIHsKICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50LmNlbnRlcjsKICAgICAgfSwKCiAgICAgIGdldCBtb3VzZURvd25FbGFwc2VkKCkgewogICAgICAgIHZhciBlbGFwc2VkOwoKICAgICAgICBpZiAoIXRoaXMubW91c2VEb3duU3RhcnQpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KCiAgICAgICAgZWxhcHNlZCA9IFV0aWxpdHkubm93KCkgLSB0aGlzLm1vdXNlRG93blN0YXJ0OwoKICAgICAgICBpZiAodGhpcy5tb3VzZVVwU3RhcnQpIHsKICAgICAgICAgIGVsYXBzZWQgLT0gdGhpcy5tb3VzZVVwRWxhcHNlZDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBlbGFwc2VkOwogICAgICB9LAoKICAgICAgZ2V0IG1vdXNlVXBFbGFwc2VkKCkgewogICAgICAgIHJldHVybiB0aGlzLm1vdXNlVXBTdGFydCA/IFV0aWxpdHkubm93KCkgLSB0aGlzLm1vdXNlVXBTdGFydCA6IDA7CiAgICAgIH0sCgogICAgICBnZXQgbW91c2VEb3duRWxhcHNlZFNlY29uZHMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubW91c2VEb3duRWxhcHNlZCAvIDEwMDA7CiAgICAgIH0sCgogICAgICBnZXQgbW91c2VVcEVsYXBzZWRTZWNvbmRzKCkgewogICAgICAgIHJldHVybiB0aGlzLm1vdXNlVXBFbGFwc2VkIC8gMTAwMDsKICAgICAgfSwKCiAgICAgIGdldCBtb3VzZUludGVyYWN0aW9uU2Vjb25kcygpIHsKICAgICAgICByZXR1cm4gdGhpcy5tb3VzZURvd25FbGFwc2VkU2Vjb25kcyArIHRoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzOwogICAgICB9LAoKICAgICAgZ2V0IGluaXRpYWxPcGFjaXR5KCkgewogICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnQuaW5pdGlhbE9wYWNpdHk7CiAgICAgIH0sCgogICAgICBnZXQgb3BhY2l0eURlY2F5VmVsb2NpdHkoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudC5vcGFjaXR5RGVjYXlWZWxvY2l0eTsKICAgICAgfSwKCiAgICAgIGdldCByYWRpdXMoKSB7CiAgICAgICAgdmFyIHdpZHRoMiA9IHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aCAqIHRoaXMuY29udGFpbmVyTWV0cmljcy53aWR0aDsKICAgICAgICB2YXIgaGVpZ2h0MiA9IHRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQgKiB0aGlzLmNvbnRhaW5lck1ldHJpY3MuaGVpZ2h0OwogICAgICAgIHZhciB3YXZlUmFkaXVzID0KICAgICAgICAgICAgTWF0aC5taW4oTWF0aC5zcXJ0KHdpZHRoMiArIGhlaWdodDIpLCBSaXBwbGUuTUFYX1JBRElVUykgKiAxLjEgKyA1OwoKICAgICAgICB2YXIgZHVyYXRpb24gPSAxLjEgLSAwLjIgKiAod2F2ZVJhZGl1cyAvIFJpcHBsZS5NQVhfUkFESVVTKTsKICAgICAgICB2YXIgdGltZU5vdyA9IHRoaXMubW91c2VJbnRlcmFjdGlvblNlY29uZHMgLyBkdXJhdGlvbjsKICAgICAgICB2YXIgc2l6ZSA9IHdhdmVSYWRpdXMgKiAoMSAtIE1hdGgucG93KDgwLCAtdGltZU5vdykpOwoKICAgICAgICByZXR1cm4gTWF0aC5hYnMoc2l6ZSk7CiAgICAgIH0sCgogICAgICBnZXQgb3BhY2l0eSgpIHsKICAgICAgICBpZiAoIXRoaXMubW91c2VVcFN0YXJ0KSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pbml0aWFsT3BhY2l0eTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBNYXRoLm1heCgKICAgICAgICAgICAgMCwKICAgICAgICAgICAgdGhpcy5pbml0aWFsT3BhY2l0eSAtCiAgICAgICAgICAgICAgICB0aGlzLm1vdXNlVXBFbGFwc2VkU2Vjb25kcyAqIHRoaXMub3BhY2l0eURlY2F5VmVsb2NpdHkpOwogICAgICB9LAoKICAgICAgZ2V0IG91dGVyT3BhY2l0eSgpIHsKICAgICAgICAvLyBMaW5lYXIgaW5jcmVhc2UgaW4gYmFja2dyb3VuZCBvcGFjaXR5LCBjYXBwZWQgYXQgdGhlIG9wYWNpdHkKICAgICAgICAvLyBvZiB0aGUgd2F2ZWZyb250ICh3YXZlT3BhY2l0eSkuCiAgICAgICAgdmFyIG91dGVyT3BhY2l0eSA9IHRoaXMubW91c2VVcEVsYXBzZWRTZWNvbmRzICogMC4zOwogICAgICAgIHZhciB3YXZlT3BhY2l0eSA9IHRoaXMub3BhY2l0eTsKCiAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIE1hdGgubWluKG91dGVyT3BhY2l0eSwgd2F2ZU9wYWNpdHkpKTsKICAgICAgfSwKCiAgICAgIGdldCBpc09wYWNpdHlGdWxseURlY2F5ZWQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3BhY2l0eSA8IDAuMDEgJiYKICAgICAgICAgICAgdGhpcy5yYWRpdXMgPj0gTWF0aC5taW4odGhpcy5tYXhSYWRpdXMsIFJpcHBsZS5NQVhfUkFESVVTKTsKICAgICAgfSwKCiAgICAgIGdldCBpc1Jlc3RpbmdBdE1heFJhZGl1cygpIHsKICAgICAgICByZXR1cm4gdGhpcy5vcGFjaXR5ID49IHRoaXMuaW5pdGlhbE9wYWNpdHkgJiYKICAgICAgICAgICAgdGhpcy5yYWRpdXMgPj0gTWF0aC5taW4odGhpcy5tYXhSYWRpdXMsIFJpcHBsZS5NQVhfUkFESVVTKTsKICAgICAgfSwKCiAgICAgIGdldCBpc0FuaW1hdGlvbkNvbXBsZXRlKCkgewogICAgICAgIHJldHVybiB0aGlzLm1vdXNlVXBTdGFydCA/IHRoaXMuaXNPcGFjaXR5RnVsbHlEZWNheWVkIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmlzUmVzdGluZ0F0TWF4UmFkaXVzOwogICAgICB9LAoKICAgICAgZ2V0IHRyYW5zbGF0aW9uRnJhY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWluKAogICAgICAgICAgICAxLCB0aGlzLnJhZGl1cyAvIHRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplICogMiAvIE1hdGguc3FydCgyKSk7CiAgICAgIH0sCgogICAgICBnZXQgeE5vdygpIHsKICAgICAgICBpZiAodGhpcy54RW5kKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy54U3RhcnQgKyB0aGlzLnRyYW5zbGF0aW9uRnJhY3Rpb24gKiAodGhpcy54RW5kIC0gdGhpcy54U3RhcnQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXMueFN0YXJ0OwogICAgICB9LAoKICAgICAgZ2V0IHlOb3coKSB7CiAgICAgICAgaWYgKHRoaXMueUVuZCkgewogICAgICAgICAgcmV0dXJuIHRoaXMueVN0YXJ0ICsgdGhpcy50cmFuc2xhdGlvbkZyYWN0aW9uICogKHRoaXMueUVuZCAtIHRoaXMueVN0YXJ0KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzLnlTdGFydDsKICAgICAgfSwKCiAgICAgIGdldCBpc01vdXNlRG93bigpIHsKICAgICAgICByZXR1cm4gdGhpcy5tb3VzZURvd25TdGFydCAmJiAhdGhpcy5tb3VzZVVwU3RhcnQ7CiAgICAgIH0sCgogICAgICByZXNldEludGVyYWN0aW9uU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMubWF4UmFkaXVzID0gMDsKICAgICAgICB0aGlzLm1vdXNlRG93blN0YXJ0ID0gMDsKICAgICAgICB0aGlzLm1vdXNlVXBTdGFydCA9IDA7CgogICAgICAgIHRoaXMueFN0YXJ0ID0gMDsKICAgICAgICB0aGlzLnlTdGFydCA9IDA7CiAgICAgICAgdGhpcy54RW5kID0gMDsKICAgICAgICB0aGlzLnlFbmQgPSAwOwogICAgICAgIHRoaXMuc2xpZGVEaXN0YW5jZSA9IDA7CgogICAgICAgIHRoaXMuY29udGFpbmVyTWV0cmljcyA9IG5ldyBFbGVtZW50TWV0cmljcyh0aGlzLmVsZW1lbnQpOwogICAgICB9LAoKICAgICAgZHJhdzogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjYWxlOwogICAgICAgIHZhciBkeDsKICAgICAgICB2YXIgZHk7CgogICAgICAgIHRoaXMud2F2ZS5zdHlsZS5vcGFjaXR5ID0gdGhpcy5vcGFjaXR5OwoKICAgICAgICBzY2FsZSA9IHRoaXMucmFkaXVzIC8gKHRoaXMuY29udGFpbmVyTWV0cmljcy5zaXplIC8gMik7CiAgICAgICAgZHggPSB0aGlzLnhOb3cgLSAodGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoIC8gMik7CiAgICAgICAgZHkgPSB0aGlzLnlOb3cgLSAodGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCAvIDIpOwoKCiAgICAgICAgLy8gMmQgdHJhbnNmb3JtIGZvciBzYWZhcmkgYmVjYXVzZSBvZiBib3JkZXItcmFkaXVzIGFuZCBvdmVyZmxvdzpoaWRkZW4KICAgICAgICAvLyBjbGlwcGluZyBidWcuIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD05ODUzOAogICAgICAgIHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPQogICAgICAgICAgICAndHJhbnNsYXRlKCcgKyBkeCArICdweCwgJyArIGR5ICsgJ3B4KSc7CiAgICAgICAgdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLnRyYW5zZm9ybSA9CiAgICAgICAgICAgICd0cmFuc2xhdGUzZCgnICsgZHggKyAncHgsICcgKyBkeSArICdweCwgMCknOwogICAgICAgIHRoaXMud2F2ZS5zdHlsZS53ZWJraXRUcmFuc2Zvcm0gPSAnc2NhbGUoJyArIHNjYWxlICsgJywnICsgc2NhbGUgKyAnKSc7CiAgICAgICAgdGhpcy53YXZlLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZTNkKCcgKyBzY2FsZSArICcsJyArIHNjYWxlICsgJywxKSc7CiAgICAgIH0sCgogICAgICAvKiogQHBhcmFtIHtFdmVudD19IGV2ZW50ICovCiAgICAgIGRvd25BY3Rpb246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdmFyIHhDZW50ZXIgPSB0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGggLyAyOwogICAgICAgIHZhciB5Q2VudGVyID0gdGhpcy5jb250YWluZXJNZXRyaWNzLmhlaWdodCAvIDI7CgogICAgICAgIHRoaXMucmVzZXRJbnRlcmFjdGlvblN0YXRlKCk7CiAgICAgICAgdGhpcy5tb3VzZURvd25TdGFydCA9IFV0aWxpdHkubm93KCk7CgogICAgICAgIGlmICh0aGlzLmNlbnRlcikgewogICAgICAgICAgdGhpcy54U3RhcnQgPSB4Q2VudGVyOwogICAgICAgICAgdGhpcy55U3RhcnQgPSB5Q2VudGVyOwogICAgICAgICAgdGhpcy5zbGlkZURpc3RhbmNlID0KICAgICAgICAgICAgICBVdGlsaXR5LmRpc3RhbmNlKHRoaXMueFN0YXJ0LCB0aGlzLnlTdGFydCwgdGhpcy54RW5kLCB0aGlzLnlFbmQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnhTdGFydCA9IGV2ZW50ID8KICAgICAgICAgICAgICBldmVudC5kZXRhaWwueCAtIHRoaXMuY29udGFpbmVyTWV0cmljcy5ib3VuZGluZ1JlY3QubGVmdCA6CiAgICAgICAgICAgICAgdGhpcy5jb250YWluZXJNZXRyaWNzLndpZHRoIC8gMjsKICAgICAgICAgIHRoaXMueVN0YXJ0ID0gZXZlbnQgPwogICAgICAgICAgICAgIGV2ZW50LmRldGFpbC55IC0gdGhpcy5jb250YWluZXJNZXRyaWNzLmJvdW5kaW5nUmVjdC50b3AgOgogICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQgLyAyOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMucmVjZW50ZXJzKSB7CiAgICAgICAgICB0aGlzLnhFbmQgPSB4Q2VudGVyOwogICAgICAgICAgdGhpcy55RW5kID0geUNlbnRlcjsKICAgICAgICAgIHRoaXMuc2xpZGVEaXN0YW5jZSA9CiAgICAgICAgICAgICAgVXRpbGl0eS5kaXN0YW5jZSh0aGlzLnhTdGFydCwgdGhpcy55U3RhcnQsIHRoaXMueEVuZCwgdGhpcy55RW5kKTsKICAgICAgICB9CgogICAgICAgIHRoaXMubWF4UmFkaXVzID0gdGhpcy5jb250YWluZXJNZXRyaWNzLmZ1cnRoZXN0Q29ybmVyRGlzdGFuY2VGcm9tKAogICAgICAgICAgICB0aGlzLnhTdGFydCwgdGhpcy55U3RhcnQpOwoKICAgICAgICB0aGlzLndhdmVDb250YWluZXIuc3R5bGUudG9wID0KICAgICAgICAgICAgKHRoaXMuY29udGFpbmVyTWV0cmljcy5oZWlnaHQgLSB0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkgLyAyICsgJ3B4JzsKICAgICAgICB0aGlzLndhdmVDb250YWluZXIuc3R5bGUubGVmdCA9CiAgICAgICAgICAgICh0aGlzLmNvbnRhaW5lck1ldHJpY3Mud2lkdGggLSB0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSkgLyAyICsgJ3B4JzsKCiAgICAgICAgdGhpcy53YXZlQ29udGFpbmVyLnN0eWxlLndpZHRoID0gdGhpcy5jb250YWluZXJNZXRyaWNzLnNpemUgKyAncHgnOwogICAgICAgIHRoaXMud2F2ZUNvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLmNvbnRhaW5lck1ldHJpY3Muc2l6ZSArICdweCc7CiAgICAgIH0sCgogICAgICAvKiogQHBhcmFtIHtFdmVudD19IGV2ZW50ICovCiAgICAgIHVwQWN0aW9uOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICghdGhpcy5pc01vdXNlRG93bikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5tb3VzZVVwU3RhcnQgPSBVdGlsaXR5Lm5vdygpOwogICAgICB9LAoKICAgICAgcmVtb3ZlOiBmdW5jdGlvbigpIHsKICAgICAgICBkb20oZG9tKHRoaXMud2F2ZUNvbnRhaW5lcikucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcy53YXZlQ29udGFpbmVyKTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIE1hdGVyaWFsIGRlc2lnbjogW1N1cmZhY2UKICAgIHJlYWN0aW9uXShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2FuaW1hdGlvbi9yZXNwb25zaXZlLWludGVyYWN0aW9uLmh0bWwjcmVzcG9uc2l2ZS1pbnRlcmFjdGlvbi1zdXJmYWNlLXJlYWN0aW9uKQoKICAgIGBwYXBlci1yaXBwbGVgIHByb3ZpZGVzIGEgdmlzdWFsIGVmZmVjdCB0aGF0IG90aGVyIHBhcGVyIGVsZW1lbnRzIGNhbgogICAgdXNlIHRvIHNpbXVsYXRlIGEgcmlwcGxpbmcgZWZmZWN0IGVtYW5hdGluZyBmcm9tIHRoZSBwb2ludCBvZiBjb250YWN0LiAgVGhlCiAgICBlZmZlY3QgY2FuIGJlIHZpc3VhbGl6ZWQgYXMgYSBjb25jZW50cmljIGNpcmNsZSB3aXRoIG1vdGlvbi4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8ZGl2IHN0eWxlPSJwb3NpdGlvbjpyZWxhdGl2ZSI+CiAgICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIDwvZGl2PgoKICAgIE5vdGUsIGl0J3MgaW1wb3J0YW50IHRoYXQgdGhlIHBhcmVudCBjb250YWluZXIgb2YgdGhlIHJpcHBsZSBiZSByZWxhdGl2ZQogICAgcG9zaXRpb24sIG90aGVyd2lzZSB0aGUgcmlwcGxlIHdpbGwgZW1hbmF0ZSBvdXRzaWRlIG9mIHRoZSBkZXNpcmVkIGNvbnRhaW5lci4KCiAgICBgcGFwZXItcmlwcGxlYCBsaXN0ZW5zIHRvICJtb3VzZWRvd24iIGFuZCAibW91c2V1cCIgZXZlbnRzIHNvIGl0IHdvdWxkIGRpc3BsYXkKICAgIHJpcHBsZSBlZmZlY3Qgd2hlbiB0b3VjaGVzIG9uIGl0LiAgWW91IGNhbiBhbHNvIGRlZmVhdCB0aGUgZGVmYXVsdCBiZWhhdmlvciBhbmQKICAgIG1hbnVhbGx5IHJvdXRlIHRoZSBkb3duIGFuZCB1cCBhY3Rpb25zIHRvIHRoZSByaXBwbGUgZWxlbWVudC4gIE5vdGUgdGhhdCBpdCBpcwogICAgaW1wb3J0YW50IGlmIHlvdSBjYWxsIGBkb3duQWN0aW9uKClgIHlvdSB3aWxsIGhhdmUgdG8gbWFrZSBzdXJlIHRvIGNhbGwKICAgIGB1cEFjdGlvbigpYCBzbyB0aGF0IGBwYXBlci1yaXBwbGVgIHdvdWxkIGVuZCB0aGUgYW5pbWF0aW9uIGxvb3AuCgogICAgRXhhbXBsZToKCiAgICAgICAgPHBhcGVyLXJpcHBsZSBpZD0icmlwcGxlIiBzdHlsZT0icG9pbnRlci1ldmVudHM6IG5vbmU7Ij48L3BhcGVyLXJpcHBsZT4KICAgICAgICAuLi4KICAgICAgICBkb3duQWN0aW9uOiBmdW5jdGlvbihlKSB7CiAgICAgICAgICB0aGlzLiQucmlwcGxlLmRvd25BY3Rpb24oZS5kZXRhaWwpOwogICAgICAgIH0sCiAgICAgICAgdXBBY3Rpb246IGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIHRoaXMuJC5yaXBwbGUudXBBY3Rpb24oKTsKICAgICAgICB9CgogICAgU3R5bGluZyByaXBwbGUgZWZmZWN0OgoKICAgICAgVXNlIENTUyBjb2xvciBwcm9wZXJ0eSB0byBzdHlsZSB0aGUgcmlwcGxlOgoKICAgICAgICBwYXBlci1yaXBwbGUgewogICAgICAgICAgY29sb3I6ICM0Mjg1ZjQ7CiAgICAgICAgfQoKICAgICAgTm90ZSB0aGF0IENTUyBjb2xvciBwcm9wZXJ0eSBpcyBpbmhlcml0ZWQgc28gaXQgaXMgbm90IHJlcXVpcmVkIHRvIHNldCBpdCBvbgogICAgICB0aGUgYHBhcGVyLXJpcHBsZWAgZWxlbWVudCBkaXJlY3RseS4KCiAgICBCeSBkZWZhdWx0LCB0aGUgcmlwcGxlIGlzIGNlbnRlcmVkIG9uIHRoZSBwb2ludCBvZiBjb250YWN0LiAgQXBwbHkgdGhlCiAgICBgcmVjZW50ZXJzYCBhdHRyaWJ1dGUgdG8gaGF2ZSB0aGUgcmlwcGxlIGdyb3cgdG93YXJkIHRoZSBjZW50ZXIgb2YgaXRzCiAgICBjb250YWluZXIuCgogICAgICAgIDxwYXBlci1yaXBwbGUgcmVjZW50ZXJzPjwvcGFwZXItcmlwcGxlPgoKICAgIFlvdSBjYW4gYWxzbyAgY2VudGVyIHRoZSByaXBwbGUgaW5zaWRlIGl0cyBjb250YWluZXIgZnJvbSB0aGUgc3RhcnQuCgogICAgICAgIDxwYXBlci1yaXBwbGUgY2VudGVyPjwvcGFwZXItcmlwcGxlPgoKICAgIEFwcGx5IGBjaXJjbGVgIGNsYXNzIHRvIG1ha2UgdGhlIHJpcHBsaW5nIGVmZmVjdCB3aXRoaW4gYSBjaXJjbGUuCgogICAgICAgIDxwYXBlci1yaXBwbGUgY2xhc3M9ImNpcmNsZSI+PC9wYXBlci1yaXBwbGU+CgogICAgQGVsZW1lbnQgcGFwZXItcmlwcGxlCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKCiAgICAgICAgLyogU2VlIFBvbHltZXJFbGVtZW50cy9wYXBlci1iZWhhdmlvcnMvaXNzdWVzLzM0LiBPbiBub24tQ2hyb21lIGJyb3dzZXJzLAogICAgICAgICAqIGNyZWF0aW5nIGEgbm9kZSAod2l0aCBhIHBvc2l0aW9uOmFic29sdXRlKSBpbiB0aGUgbWlkZGxlIG9mIGFuIGV2ZW50CiAgICAgICAgICogaGFuZGxlciAiaW50ZXJydXB0cyIgdGhhdCBldmVudCBoYW5kbGVyICh3aGljaCBoYXBwZW5zIHdoZW4gdGhlCiAgICAgICAgICogcmlwcGxlIGlzIGNyZWF0ZWQgb24gZGVtYW5kKSAqLwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbYW5pbWF0aW5nXSkgewogICAgICAgIC8qIFRoaXMgcmVzb2x2ZXMgYSByZW5kZXJpbmcgaXNzdWUgaW4gQ2hyb21lIChhcyBvZiA0MCkgd2hlcmUgdGhlCiAgICAgICAgICAgcmlwcGxlIGlzIG5vdCBwcm9wZXJseSBjbGlwcGVkIGJ5IGl0cyBwYXJlbnQgKHdoaWNoIG1heSBoYXZlCiAgICAgICAgICAgcm91bmRlZCBjb3JuZXJzKS4gU2VlOiBodHRwOi8vanNiaW4uY29tL3RlbWV4YS80CgogICAgICAgICAgIE5vdGU6IFdlIG9ubHkgYXBwbHkgdGhpcyBzdHlsZSBjb25kaXRpb25hbGx5LiBPdGhlcndpc2UsIHRoZSBicm93c2VyCiAgICAgICAgICAgd2lsbCBjcmVhdGUgYSBuZXcgY29tcG9zaXRpbmcgbGF5ZXIgZm9yIGV2ZXJ5IHJpcHBsZSBlbGVtZW50IG9uIHRoZQogICAgICAgICAgIHBhZ2UsIGFuZCB0aGF0IHdvdWxkIGJlIGJhZC4gKi8KICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlKDAsIDApOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlM2QoMCwgMCwgMCk7CiAgICAgIH0KCiAgICAgICNiYWNrZ3JvdW5kLAogICAgICAjd2F2ZXMsCiAgICAgIC53YXZlLWNvbnRhaW5lciwKICAgICAgLndhdmUgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgICNiYWNrZ3JvdW5kLAogICAgICAud2F2ZSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgfQoKICAgICAgI3dhdmVzLAogICAgICAud2F2ZSB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLndhdmUtY29udGFpbmVyLAogICAgICAud2F2ZSB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICB9CgogICAgICA6aG9zdCguY2lyY2xlKSAjYmFja2dyb3VuZCwKICAgICAgOmhvc3QoLmNpcmNsZSkgI3dhdmVzIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jaXJjbGUpIC53YXZlLWNvbnRhaW5lciB7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJiYWNrZ3JvdW5kIj48L2Rpdj4KICAgIDxkaXYgaWQ9IndhdmVzIj48L2Rpdj4KYCwKCiAgICAgIGlzOiAncGFwZXItcmlwcGxlJywKICAgICAgYmVoYXZpb3JzOiBbSXJvbkExMXlLZXlzQmVoYXZpb3JdLAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBpbml0aWFsIG9wYWNpdHkgc2V0IG9uIHRoZSB3YXZlLgogICAgICAgICAqIEB0eXBlIG51bWJlcgogICAgICAgICAqIEBkZWZhdWx0IDAuMjUKICAgICAgICAgKi8KICAgICAgICBpbml0aWFsT3BhY2l0eToge3R5cGU6IE51bWJlciwgdmFsdWU6IDAuMjV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBIb3cgZmFzdCAob3BhY2l0eSBwZXIgc2Vjb25kKSB0aGUgd2F2ZSBmYWRlcyBvdXQuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSBudW1iZXIKICAgICAgICAgKiBAZGVmYXVsdCAwLjgKICAgICAgICAgKi8KICAgICAgICBvcGFjaXR5RGVjYXlWZWxvY2l0eToge3R5cGU6IE51bWJlciwgdmFsdWU6IDAuOH0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHJpcHBsZXMgd2lsbCBleGhpYml0IGEgZ3Jhdml0YXRpb25hbCBwdWxsIHRvd2FyZHMKICAgICAgICAgKiB0aGUgY2VudGVyIG9mIHRoZWlyIGNvbnRhaW5lciBhcyB0aGV5IGZhZGUgYXdheS4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIGJvb2xlYW4KICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZQogICAgICAgICAqLwogICAgICAgIHJlY2VudGVyczoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHJpcHBsZXMgd2lsbCBjZW50ZXIgaW5zaWRlIGl0cyBjb250YWluZXIKICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIGJvb2xlYW4KICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZQogICAgICAgICAqLwogICAgICAgIGNlbnRlcjoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIEEgbGlzdCBvZiB0aGUgdmlzdWFsIHJpcHBsZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSBBcnJheQogICAgICAgICAqIEBkZWZhdWx0IFtdCiAgICAgICAgICovCiAgICAgICAgcmlwcGxlczogewogICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIHdoZW4gdGhlcmUgYXJlIHZpc2libGUgcmlwcGxlcyBhbmltYXRpbmcgd2l0aGluIHRoZQogICAgICAgICAqIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgYW5pbWF0aW5nOgogICAgICAgICAgICB7dHlwZTogQm9vbGVhbiwgcmVhZE9ubHk6IHRydWUsIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHJpcHBsZSB3aWxsIHJlbWFpbiBpbiB0aGUgImRvd24iIHN0YXRlIHVudGlsIGBob2xkRG93bmAKICAgICAgICAgKiBpcyBzZXQgdG8gZmFsc2UgYWdhaW4uCiAgICAgICAgICovCiAgICAgICAgaG9sZERvd246IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIG9ic2VydmVyOiAnX2hvbGREb3duQ2hhbmdlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgcmlwcGxlIHdpbGwgbm90IGdlbmVyYXRlIGEgcmlwcGxlIGVmZmVjdAogICAgICAgICAqIHZpYSBwb2ludGVyIGludGVyYWN0aW9uLgogICAgICAgICAqIENhbGxpbmcgcmlwcGxlJ3MgaW1wZXJhdGl2ZSBhcGkgbGlrZSBgc2ltdWxhdGVkUmlwcGxlYCB3aWxsCiAgICAgICAgICogc3RpbGwgZ2VuZXJhdGUgdGhlIHJpcHBsZSBlZmZlY3QuCiAgICAgICAgICovCiAgICAgICAgbm9pbms6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICBfYW5pbWF0aW5nOiB7dHlwZTogQm9vbGVhbn0sCgogICAgICAgIF9ib3VuZEFuaW1hdGU6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRlLmJpbmQodGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgZ2V0IHRhcmdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5rZXlFdmVudFRhcmdldDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7IU9iamVjdH0KICAgICAgICovCiAgICAgIGtleUJpbmRpbmdzOiB7CiAgICAgICAgJ2VudGVyOmtleWRvd24nOiAnX29uRW50ZXJLZXlkb3duJywKICAgICAgICAnc3BhY2U6a2V5ZG93bic6ICdfb25TcGFjZUtleWRvd24nLAogICAgICAgICdzcGFjZTprZXl1cCc6ICdfb25TcGFjZUtleXVwJwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gU2V0IHVwIGExMXlLZXlzQmVoYXZpb3IgdG8gbGlzdGVuIHRvIGtleSBldmVudHMgb24gdGhlIHRhcmdldCwKICAgICAgICAvLyBzbyB0aGF0IHNwYWNlIGFuZCBlbnRlciBhY3RpdmF0ZSB0aGUgcmlwcGxlIGV2ZW4gaWYgdGhlIHRhcmdldCBkb2Vzbid0CiAgICAgICAgLy8gaGFuZGxlIGtleSBldmVudHMuIFRoZSBrZXkgaGFuZGxlcnMgZGVhbCB3aXRoIGBub2lua2AgdGhlbXNlbHZlcy4KICAgICAgICBpZiAoZG9tKHRoaXMpLnBhcmVudE5vZGUubm9kZVR5cGUgPT0gMTEpIHsgIC8vIERPQ1VNRU5UX0ZSQUdNRU5UX05PREUKICAgICAgICAgIHRoaXMua2V5RXZlbnRUYXJnZXQgPSBkb20odGhpcykuZ2V0T3duZXJSb290KCkuaG9zdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5rZXlFdmVudFRhcmdldCA9IGRvbSh0aGlzKS5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICB2YXIga2V5RXZlbnRUYXJnZXQgPSAvKiogQHR5cGUgeyFFdmVudFRhcmdldH0gKi8gKHRoaXMua2V5RXZlbnRUYXJnZXQpOwogICAgICAgIHRoaXMubGlzdGVuKGtleUV2ZW50VGFyZ2V0LCAndXAnLCAndWlVcEFjdGlvbicpOwogICAgICAgIHRoaXMubGlzdGVuKGtleUV2ZW50VGFyZ2V0LCAnZG93bicsICd1aURvd25BY3Rpb24nKTsKICAgICAgfSwKCiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgZGV0YWNoZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudW5saXN0ZW4odGhpcy5rZXlFdmVudFRhcmdldCwgJ3VwJywgJ3VpVXBBY3Rpb24nKTsKICAgICAgICB0aGlzLnVubGlzdGVuKHRoaXMua2V5RXZlbnRUYXJnZXQsICdkb3duJywgJ3VpRG93bkFjdGlvbicpOwogICAgICAgIHRoaXMua2V5RXZlbnRUYXJnZXQgPSBudWxsOwogICAgICB9LAoKICAgICAgZ2V0IHNob3VsZEtlZXBBbmltYXRpbmcoKSB7CiAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucmlwcGxlcy5sZW5ndGg7ICsraW5kZXgpIHsKICAgICAgICAgIGlmICghdGhpcy5yaXBwbGVzW2luZGV4XS5pc0FuaW1hdGlvbkNvbXBsZXRlKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAoKICAgICAgc2ltdWxhdGVkUmlwcGxlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmRvd25BY3Rpb24obnVsbCk7CgogICAgICAgIC8vIFBsZWFzZSBzZWUgcG9seW1lci9wb2x5bWVyIzEzMDUKICAgICAgICB0aGlzLmFzeW5jKGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy51cEFjdGlvbigpOwogICAgICAgIH0sIDEpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFByb3Zva2VzIGEgcmlwcGxlIGRvd24gZWZmZWN0IHZpYSBhIFVJIGV2ZW50LAogICAgICAgKiByZXNwZWN0aW5nIHRoZSBgbm9pbmtgIHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge0V2ZW50PX0gZXZlbnQKICAgICAgICovCiAgICAgIHVpRG93bkFjdGlvbjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoIXRoaXMubm9pbmspIHsKICAgICAgICAgIHRoaXMuZG93bkFjdGlvbihldmVudCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFByb3Zva2VzIGEgcmlwcGxlIGRvd24gZWZmZWN0IHZpYSBhIFVJIGV2ZW50LAogICAgICAgKiAqbm90KiByZXNwZWN0aW5nIHRoZSBgbm9pbmtgIHByb3BlcnR5LgogICAgICAgKiBAcGFyYW0ge0V2ZW50PX0gZXZlbnQKICAgICAgICovCiAgICAgIGRvd25BY3Rpb246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKHRoaXMuaG9sZERvd24gJiYgdGhpcy5yaXBwbGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciByaXBwbGUgPSB0aGlzLmFkZFJpcHBsZSgpOwoKICAgICAgICByaXBwbGUuZG93bkFjdGlvbihldmVudCk7CgogICAgICAgIGlmICghdGhpcy5fYW5pbWF0aW5nKSB7CiAgICAgICAgICB0aGlzLl9hbmltYXRpbmcgPSB0cnVlOwogICAgICAgICAgdGhpcy5hbmltYXRlKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFByb3Zva2VzIGEgcmlwcGxlIHVwIGVmZmVjdCB2aWEgYSBVSSBldmVudCwKICAgICAgICogcmVzcGVjdGluZyB0aGUgYG5vaW5rYCBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtFdmVudD19IGV2ZW50CiAgICAgICAqLwogICAgICB1aVVwQWN0aW9uOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICghdGhpcy5ub2luaykgewogICAgICAgICAgdGhpcy51cEFjdGlvbihldmVudCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFByb3Zva2VzIGEgcmlwcGxlIHVwIGVmZmVjdCB2aWEgYSBVSSBldmVudCwKICAgICAgICogKm5vdCogcmVzcGVjdGluZyB0aGUgYG5vaW5rYCBwcm9wZXJ0eS4KICAgICAgICogQHBhcmFtIHtFdmVudD19IGV2ZW50CiAgICAgICAqLwogICAgICB1cEFjdGlvbjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5ob2xkRG93bikgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5yaXBwbGVzLmZvckVhY2goZnVuY3Rpb24ocmlwcGxlKSB7CiAgICAgICAgICByaXBwbGUudXBBY3Rpb24oZXZlbnQpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLl9hbmltYXRpbmcgPSB0cnVlOwogICAgICAgIHRoaXMuYW5pbWF0ZSgpOwogICAgICB9LAoKICAgICAgb25BbmltYXRpb25Db21wbGV0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fYW5pbWF0aW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJyc7CiAgICAgICAgdGhpcy5maXJlKCd0cmFuc2l0aW9uZW5kJyk7CiAgICAgIH0sCgogICAgICBhZGRSaXBwbGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByaXBwbGUgPSBuZXcgUmlwcGxlKHRoaXMpOwoKICAgICAgICBkb20odGhpcy4kLndhdmVzKS5hcHBlbmRDaGlsZChyaXBwbGUud2F2ZUNvbnRhaW5lcik7CiAgICAgICAgdGhpcy4kLmJhY2tncm91bmQuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcmlwcGxlLmNvbG9yOwogICAgICAgIHRoaXMucmlwcGxlcy5wdXNoKHJpcHBsZSk7CgogICAgICAgIHRoaXMuX3NldEFuaW1hdGluZyh0cnVlKTsKCiAgICAgICAgcmV0dXJuIHJpcHBsZTsKICAgICAgfSwKCiAgICAgIHJlbW92ZVJpcHBsZTogZnVuY3Rpb24ocmlwcGxlKSB7CiAgICAgICAgdmFyIHJpcHBsZUluZGV4ID0gdGhpcy5yaXBwbGVzLmluZGV4T2YocmlwcGxlKTsKCiAgICAgICAgaWYgKHJpcHBsZUluZGV4IDwgMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5yaXBwbGVzLnNwbGljZShyaXBwbGVJbmRleCwgMSk7CgogICAgICAgIHJpcHBsZS5yZW1vdmUoKTsKCiAgICAgICAgaWYgKCF0aGlzLnJpcHBsZXMubGVuZ3RoKSB7CiAgICAgICAgICB0aGlzLl9zZXRBbmltYXRpbmcoZmFsc2UpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBEZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFuaW1hdGVSaXBwbGUoKSBpbnN0ZWFkLgogICAgICAgKgogICAgICAgKiBUaGlzIG1ldGhvZCBuYW1lIGNvbmZsaWN0cyB3aXRoIEVsZW1lbnQjYW5pbWF0ZSgpLgogICAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvRWxlbWVudC9hbmltYXRlLgogICAgICAgKgogICAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgYW5pbWF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLl9hbmltYXRpbmcpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGluZGV4OwogICAgICAgIHZhciByaXBwbGU7CgogICAgICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IHRoaXMucmlwcGxlcy5sZW5ndGg7ICsraW5kZXgpIHsKICAgICAgICAgIHJpcHBsZSA9IHRoaXMucmlwcGxlc1tpbmRleF07CgogICAgICAgICAgcmlwcGxlLmRyYXcoKTsKCiAgICAgICAgICB0aGlzLiQuYmFja2dyb3VuZC5zdHlsZS5vcGFjaXR5ID0gcmlwcGxlLm91dGVyT3BhY2l0eTsKCiAgICAgICAgICBpZiAocmlwcGxlLmlzT3BhY2l0eUZ1bGx5RGVjYXllZCAmJiAhcmlwcGxlLmlzUmVzdGluZ0F0TWF4UmFkaXVzKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlUmlwcGxlKHJpcHBsZSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIXRoaXMuc2hvdWxkS2VlcEFuaW1hdGluZyAmJiB0aGlzLnJpcHBsZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICB0aGlzLm9uQW5pbWF0aW9uQ29tcGxldGUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSh0aGlzLl9ib3VuZEFuaW1hdGUpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBbiBhbGlhcyBmb3IgYW5pbWF0ZSgpIHdob3NlIG5hbWUgZG9lcyBub3QgY29uZmxpY3Qgd2l0aCB0aGUgcGxhdGZvcm0KICAgICAgICogRWxlbWVudC5hbmltYXRlKCkgbWV0aG9kLgogICAgICAgKi8KICAgICAgYW5pbWF0ZVJpcHBsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYW5pbWF0ZSgpOwogICAgICB9LAoKICAgICAgX29uRW50ZXJLZXlkb3duOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnVpRG93bkFjdGlvbigpOwogICAgICAgIHRoaXMuYXN5bmModGhpcy51aVVwQWN0aW9uLCAxKTsKICAgICAgfSwKCiAgICAgIF9vblNwYWNlS2V5ZG93bjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy51aURvd25BY3Rpb24oKTsKICAgICAgfSwKCiAgICAgIF9vblNwYWNlS2V5dXA6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudWlVcEFjdGlvbigpOwogICAgICB9LAoKICAgICAgLy8gbm90ZTogaG9sZERvd24gZG9lcyBub3QgcmVzcGVjdCBub2luayBzaW5jZSBpdCBjYW4gYmUgYSBmb2N1cyBiYXNlZAogICAgICAvLyBlZmZlY3QuCiAgICAgIF9ob2xkRG93bkNoYW5nZWQ6IGZ1bmN0aW9uKG5ld1ZhbCwgb2xkVmFsKSB7CiAgICAgICAgaWYgKG9sZFZhbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmIChuZXdWYWwpIHsKICAgICAgICAgIHRoaXMuZG93bkFjdGlvbigpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnVwQWN0aW9uKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgRmlyZWQgd2hlbiB0aGUgYW5pbWF0aW9uIGZpbmlzaGVzLgogICAgICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0byB3YWl0IHVudGlsCiAgICAgIHRoZSByaXBwbGUgYW5pbWF0aW9uIGZpbmlzaGVzIHRvIHBlcmZvcm0gc29tZSBhY3Rpb24uCgogICAgICBAZXZlbnQgdHJhbnNpdGlvbmVuZAogICAgICBAcGFyYW0ge3tub2RlOiBPYmplY3R9fSBkZXRhaWwgQ29udGFpbnMgdGhlIGFuaW1hdGVkIG5vZGUuCiAgICAgICovCiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIGBQYXBlclJpcHBsZUJlaGF2aW9yYCBkeW5hbWljYWxseSBpbXBsZW1lbnRzIGEgcmlwcGxlIHdoZW4gdGhlIGVsZW1lbnQgaGFzCiAgICAgKiBmb2N1cyB2aWEgcG9pbnRlciBvciBrZXlib2FyZC4KICAgICAqCiAgICAgKiBOT1RFOiBUaGlzIGJlaGF2aW9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBhbmQgYWZ0ZXIKICAgICAqIGBJcm9uQnV0dG9uU3RhdGVgIGFuZCBgSXJvbkNvbnRyb2xTdGF0ZWAuCiAgICAgKgogICAgICogQHBvbHltZXJCZWhhdmlvciBQYXBlclJpcHBsZUJlaGF2aW9yCiAgICAgKi8KICAgIGNvbnN0IFBhcGVyUmlwcGxlQmVoYXZpb3IgPSB7CiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgZWxlbWVudCB3aWxsIG5vdCBwcm9kdWNlIGEgcmlwcGxlIGVmZmVjdCB3aGVuIGludGVyYWN0ZWQKICAgICAgICAgKiB3aXRoIHZpYSB0aGUgcG9pbnRlci4KICAgICAgICAgKi8KICAgICAgICBub2luazoge3R5cGU6IEJvb2xlYW4sIG9ic2VydmVyOiAnX25vaW5rQ2hhbmdlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBAdHlwZSB7RWxlbWVudHx1bmRlZmluZWR9CiAgICAgICAgICovCiAgICAgICAgX3JpcHBsZUNvbnRhaW5lcjogewogICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIGEgYDxwYXBlci1yaXBwbGU+YCBlbGVtZW50IGlzIGF2YWlsYWJsZSB3aGVuIHRoZSBlbGVtZW50IGlzCiAgICAgICAqIGZvY3VzZWQuCiAgICAgICAqLwogICAgICBfYnV0dG9uU3RhdGVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5mb2N1c2VkKSB7CiAgICAgICAgICB0aGlzLmVuc3VyZVJpcHBsZSgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBJbiBhZGRpdGlvbiB0byB0aGUgZnVuY3Rpb25hbGl0eSBwcm92aWRlZCBpbiBgSXJvbkJ1dHRvblN0YXRlYCwgZW5zdXJlcwogICAgICAgKiBhIHJpcHBsZSBlZmZlY3QgaXMgY3JlYXRlZCB3aGVuIHRoZSBlbGVtZW50IGlzIGluIGEgYHByZXNzZWRgIHN0YXRlLgogICAgICAgKi8KICAgICAgX2Rvd25IYW5kbGVyOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIElyb25CdXR0b25TdGF0ZUltcGwuX2Rvd25IYW5kbGVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgIGlmICh0aGlzLnByZXNzZWQpIHsKICAgICAgICAgIHRoaXMuZW5zdXJlUmlwcGxlKGV2ZW50KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRW5zdXJlcyB0aGlzIGVsZW1lbnQgY29udGFpbnMgYSByaXBwbGUgZWZmZWN0LiBGb3Igc3RhcnR1cCBlZmZpY2llbmN5CiAgICAgICAqIHRoZSByaXBwbGUgZWZmZWN0IGlzIGR5bmFtaWNhbGx5IG9uIGRlbWFuZCB3aGVuIG5lZWRlZC4KICAgICAgICogQHBhcmFtIHshRXZlbnQ9fSBvcHRUcmlnZ2VyaW5nRXZlbnQgKG9wdGlvbmFsKSBldmVudCB0aGF0IHRyaWdnZXJlZCB0aGUKICAgICAgICogcmlwcGxlLgogICAgICAgKi8KICAgICAgZW5zdXJlUmlwcGxlOiBmdW5jdGlvbihvcHRUcmlnZ2VyaW5nRXZlbnQpIHsKICAgICAgICBpZiAoIXRoaXMuaGFzUmlwcGxlKCkpIHsKICAgICAgICAgIHRoaXMuX3JpcHBsZSA9IHRoaXMuX2NyZWF0ZVJpcHBsZSgpOwogICAgICAgICAgdGhpcy5fcmlwcGxlLm5vaW5rID0gdGhpcy5ub2luazsKICAgICAgICAgIHZhciByaXBwbGVDb250YWluZXIgPSB0aGlzLl9yaXBwbGVDb250YWluZXIgfHwgdGhpcy5yb290OwogICAgICAgICAgaWYgKHJpcHBsZUNvbnRhaW5lcikgewogICAgICAgICAgICBkb20ocmlwcGxlQ29udGFpbmVyKS5hcHBlbmRDaGlsZCh0aGlzLl9yaXBwbGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKG9wdFRyaWdnZXJpbmdFdmVudCkgewogICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgZXZlbnQgaGFwcGVuZWQgaW5zaWRlIG9mIHRoZSByaXBwbGUgY29udGFpbmVyCiAgICAgICAgICAgIC8vIEZhbGwgYmFjayB0byBob3N0IGluc3RlYWQgb2YgdGhlIHJvb3QgYmVjYXVzZSBkaXN0cmlidXRlZCB0ZXh0CiAgICAgICAgICAgIC8vIG5vZGVzIGFyZSBub3QgdmFsaWQgZXZlbnQgdGFyZ2V0cwogICAgICAgICAgICB2YXIgZG9tQ29udGFpbmVyID0gZG9tKHRoaXMuX3JpcHBsZUNvbnRhaW5lciB8fCB0aGlzKTsKICAgICAgICAgICAgdmFyIHRhcmdldCA9IGRvbShvcHRUcmlnZ2VyaW5nRXZlbnQpLnJvb3RUYXJnZXQ7CiAgICAgICAgICAgIGlmIChkb21Db250YWluZXIuZGVlcENvbnRhaW5zKC8qKiBAdHlwZSB7Tm9kZX0gKi8gKHRhcmdldCkpKSB7CiAgICAgICAgICAgICAgdGhpcy5fcmlwcGxlLnVpRG93bkFjdGlvbihvcHRUcmlnZ2VyaW5nRXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGA8cGFwZXItcmlwcGxlPmAgZWxlbWVudCB1c2VkIGJ5IHRoaXMgZWxlbWVudCB0byBjcmVhdGUKICAgICAgICogcmlwcGxlIGVmZmVjdHMuIFRoZSBlbGVtZW50J3MgcmlwcGxlIGlzIGNyZWF0ZWQgb24gZGVtYW5kLCB3aGVuCiAgICAgICAqIG5lY2Vzc2FyeSwgYW5kIGNhbGxpbmcgdGhpcyBtZXRob2Qgd2lsbCBmb3JjZSB0aGUKICAgICAgICogcmlwcGxlIHRvIGJlIGNyZWF0ZWQuCiAgICAgICAqLwogICAgICBnZXRSaXBwbGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuZW5zdXJlUmlwcGxlKCk7CiAgICAgICAgcmV0dXJuIHRoaXMuX3JpcHBsZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBlbGVtZW50IGN1cnJlbnRseSBjb250YWlucyBhIHJpcHBsZSBlZmZlY3QuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgICAqLwogICAgICBoYXNSaXBwbGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMuX3JpcHBsZSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ3JlYXRlIHRoZSBlbGVtZW50J3MgcmlwcGxlIGVmZmVjdCB2aWEgY3JlYXRpbmcgYSBgPHBhcGVyLXJpcHBsZT5gLgogICAgICAgKiBPdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjdXN0b21pemUgdGhlIHJpcHBsZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHshUGFwZXJSaXBwbGVFbGVtZW50fSBSZXR1cm5zIGEgYDxwYXBlci1yaXBwbGU+YCBlbGVtZW50LgogICAgICAgKi8KICAgICAgX2NyZWF0ZVJpcHBsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSAvKiogQHR5cGUgeyFQYXBlclJpcHBsZUVsZW1lbnR9ICovICgKICAgICAgICAgICAgZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgncGFwZXItcmlwcGxlJykpOwogICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICB9LAoKICAgICAgX25vaW5rQ2hhbmdlZDogZnVuY3Rpb24obm9pbmspIHsKICAgICAgICBpZiAodGhpcy5oYXNSaXBwbGUoKSkgewogICAgICAgICAgdGhpcy5fcmlwcGxlLm5vaW5rID0gbm9pbms7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKiBAcG9seW1lckJlaGF2aW9yIFBhcGVyQnV0dG9uQmVoYXZpb3IgKi8KICAgIGNvbnN0IFBhcGVyQnV0dG9uQmVoYXZpb3JJbXBsID0gewogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHotZGVwdGggb2YgdGhpcyBlbGVtZW50LCBmcm9tIDAtNS4gU2V0dGluZyB0byAwIHdpbGwgcmVtb3ZlIHRoZQogICAgICAgICAqIHNoYWRvdywgYW5kIGVhY2ggaW5jcmVhc2luZyBudW1iZXIgZ3JlYXRlciB0aGFuIDAgd2lsbCBiZSAiZGVlcGVyIgogICAgICAgICAqIHRoYW4gdGhlIGxhc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAYXR0cmlidXRlIGVsZXZhdGlvbgogICAgICAgICAqIEB0eXBlIG51bWJlcgogICAgICAgICAqIEBkZWZhdWx0IDEKICAgICAgICAgKi8KICAgICAgICBlbGV2YXRpb246IHt0eXBlOiBOdW1iZXIsIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwgcmVhZE9ubHk6IHRydWV9CiAgICAgIH0sCgogICAgICBvYnNlcnZlcnM6IFsKICAgICAgICAnX2NhbGN1bGF0ZUVsZXZhdGlvbihmb2N1c2VkLCBkaXNhYmxlZCwgYWN0aXZlLCBwcmVzc2VkLCByZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKScsCiAgICAgICAgJ19jb21wdXRlS2V5Ym9hcmRDbGFzcyhyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKScKICAgICAgXSwKCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7cm9sZTogJ2J1dHRvbicsIHRhYmluZGV4OiAnMCcsIGFuaW1hdGVkOiB0cnVlfSwKCiAgICAgIF9jYWxjdWxhdGVFbGV2YXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlID0gMTsKICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgZSA9IDA7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmFjdGl2ZSB8fCB0aGlzLnByZXNzZWQpIHsKICAgICAgICAgIGUgPSA0OwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5yZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSB7CiAgICAgICAgICBlID0gMzsKICAgICAgICB9CiAgICAgICAgdGhpcy5fc2V0RWxldmF0aW9uKGUpOwogICAgICB9LAoKICAgICAgX2NvbXB1dGVLZXlib2FyZENsYXNzOiBmdW5jdGlvbihyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSB7CiAgICAgICAgdGhpcy50b2dnbGVDbGFzcygna2V5Ym9hcmQtZm9jdXMnLCByZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBJbiBhZGRpdGlvbiB0byBgSXJvbkJ1dHRvblN0YXRlYCBiZWhhdmlvciwgd2hlbiBzcGFjZSBrZXkgZ29lcyBkb3duLAogICAgICAgKiBjcmVhdGUgYSByaXBwbGUgZG93biBlZmZlY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUtleWJvYXJkRXZlbnR9IGV2ZW50IC4KICAgICAgICovCiAgICAgIF9zcGFjZUtleURvd25IYW5kbGVyOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIElyb25CdXR0b25TdGF0ZUltcGwuX3NwYWNlS2V5RG93bkhhbmRsZXIuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlcmUgaXMgYXQgbW9zdCBvbmUgcmlwcGxlIHdoZW4gdGhlIHNwYWNlIGtleSBpcyBoZWxkIGRvd24uCiAgICAgICAgaWYgKHRoaXMuaGFzUmlwcGxlKCkgJiYgdGhpcy5nZXRSaXBwbGUoKS5yaXBwbGVzLmxlbmd0aCA8IDEpIHsKICAgICAgICAgIHRoaXMuX3JpcHBsZS51aURvd25BY3Rpb24oKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSW4gYWRkaXRpb24gdG8gYElyb25CdXR0b25TdGF0ZWAgYmVoYXZpb3IsIHdoZW4gc3BhY2Uga2V5IGdvZXMgdXAsCiAgICAgICAqIGNyZWF0ZSBhIHJpcHBsZSB1cCBlZmZlY3QuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IUtleWJvYXJkRXZlbnR9IGV2ZW50IC4KICAgICAgICovCiAgICAgIF9zcGFjZUtleVVwSGFuZGxlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBJcm9uQnV0dG9uU3RhdGVJbXBsLl9zcGFjZUtleVVwSGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICBpZiAodGhpcy5oYXNSaXBwbGUoKSkgewogICAgICAgICAgdGhpcy5fcmlwcGxlLnVpVXBBY3Rpb24oKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IFBhcGVyQnV0dG9uQmVoYXZpb3IgPSBbCiAgICAgIElyb25CdXR0b25TdGF0ZSwKICAgICAgSXJvbkNvbnRyb2xTdGF0ZSwKICAgICAgUGFwZXJSaXBwbGVCZWhhdmlvciwKICAgICAgUGFwZXJCdXR0b25CZWhhdmlvckltcGwKICAgIF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgdGVtcGxhdGUkNiA9IGh0bWxgCiAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXN0eWxlcyI+CiAgICAvKiBOZWVkIHRvIHNwZWNpZnkgdGhlIHNhbWUgc3BlY2lmaWNpdHkgYXMgdGhlIHN0eWxlcyBpbXBvcnRlZCBmcm9tIHBhcGVyLW1hdGVyaWFsLiAqLwogICAgOmhvc3QgewogICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWNlbnRlcjsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBtaW4td2lkdGg6IDUuMTRlbTsKICAgICAgbWFyZ2luOiAwIDAuMjllbTsKICAgICAgYmFja2dyb3VuZDogdHJhbnNwYXJlbnQ7CiAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgZm9udDogaW5oZXJpdDsKICAgICAgdGV4dC10cmFuc2Zvcm06IHVwcGVyY2FzZTsKICAgICAgb3V0bGluZS13aWR0aDogMDsKICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIHotaW5kZXg6IDA7CiAgICAgIHBhZGRpbmc6IDAuN2VtIDAuNTdlbTsKCiAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbjsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSIxIl0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTE7CiAgICB9CgogICAgOmhvc3QoW2VsZXZhdGlvbj0iMiJdKSB7CiAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi0yOwogICAgfQoKICAgIDpob3N0KFtlbGV2YXRpb249IjMiXSkgewogICAgICBAYXBwbHkgLS1wYXBlci1tYXRlcmlhbC1lbGV2YXRpb24tMzsKICAgIH0KCiAgICA6aG9zdChbZWxldmF0aW9uPSI0Il0pIHsKICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWwtZWxldmF0aW9uLTQ7CiAgICB9CgogICAgOmhvc3QoW2VsZXZhdGlvbj0iNSJdKSB7CiAgICAgIEBhcHBseSAtLXBhcGVyLW1hdGVyaWFsLWVsZXZhdGlvbi01OwogICAgfQoKICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICA6aG9zdChbcmFpc2VkXS5rZXlib2FyZC1mb2N1cykgewogICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgQGFwcGx5IC0tcGFwZXItYnV0dG9uLXJhaXNlZC1rZXlib2FyZC1mb2N1czsKICAgIH0KCiAgICA6aG9zdCg6bm90KFtyYWlzZWRdKS5rZXlib2FyZC1mb2N1cykgewogICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgQGFwcGx5IC0tcGFwZXItYnV0dG9uLWZsYXQta2V5Ym9hcmQtZm9jdXM7CiAgICB9CgogICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICBjb2xvcjogI2E4YThhODsKICAgICAgY3Vyc29yOiBhdXRvOwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKCiAgICAgIEBhcHBseSAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZDsKICAgIH0KCiAgICA6aG9zdChbZGlzYWJsZWRdW3JhaXNlZF0pIHsKICAgICAgYmFja2dyb3VuZDogI2VhZWFlYTsKICAgIH0KCgogICAgOmhvc3QoW2FuaW1hdGVkXSkgewogICAgICBAYXBwbHkgLS1zaGFkb3ctdHJhbnNpdGlvbjsKICAgIH0KCiAgICBwYXBlci1yaXBwbGUgewogICAgICBjb2xvcjogdmFyKC0tcGFwZXItYnV0dG9uLWluay1jb2xvcik7CiAgICB9CiAgPC9zdHlsZT4KCiAgPHNsb3Q+PC9zbG90PmA7CgogICAgdGVtcGxhdGUkNi5zZXRBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnLCAnJyk7CgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbQnV0dG9uc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL2J1dHRvbnMuaHRtbCkKCiAgICBgcGFwZXItYnV0dG9uYCBpcyBhIGJ1dHRvbi4gV2hlbiB0aGUgdXNlciB0b3VjaGVzIHRoZSBidXR0b24sIGEgcmlwcGxlIGVmZmVjdAogICAgZW1hbmF0ZXMgZnJvbSB0aGUgcG9pbnQgb2YgY29udGFjdC4gSXQgbWF5IGJlIGZsYXQgb3IgcmFpc2VkLiBBIHJhaXNlZCBidXR0b24gaXMKICAgIHN0eWxlZCB3aXRoIGEgc2hhZG93LgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci1idXR0b24+RmxhdCBidXR0b248L3BhcGVyLWJ1dHRvbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZD5SYWlzZWQgYnV0dG9uPC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBub2luaz5ObyByaXBwbGUgZWZmZWN0PC9wYXBlci1idXR0b24+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiB0b2dnbGVzPlRvZ2dsZS1hYmxlIGJ1dHRvbjwvcGFwZXItYnV0dG9uPgoKICAgIEEgYnV0dG9uIHRoYXQgaGFzIGB0b2dnbGVzYCB0cnVlIHdpbGwgcmVtYWluIGBhY3RpdmVgIGFmdGVyIGJlaW5nIGNsaWNrZWQgKGFuZAogICAgd2lsbCBoYXZlIGFuIGBhY3RpdmVgIGF0dHJpYnV0ZSBzZXQpLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIHRoZQogICAgYElyb25CdXR0b25TdGF0ZWAgYmVoYXZpb3IuCgogICAgWW91IG1heSB1c2UgY3VzdG9tIERPTSBpbiB0aGUgYnV0dG9uIGJvZHkgdG8gY3JlYXRlIGEgdmFyaWV0eSBvZiBidXR0b25zLiBGb3IKICAgIGV4YW1wbGUsIHRvIGNyZWF0ZSBhIGJ1dHRvbiB3aXRoIGFuIGljb24gYW5kIHNvbWUgdGV4dDoKCiAgICAgICAgPHBhcGVyLWJ1dHRvbj4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZmF2b3JpdGUiPjwvaXJvbi1pY29uPgogICAgICAgICAgY3VzdG9tIGJ1dHRvbiBjb250ZW50CiAgICAgICAgPC9wYXBlci1idXR0b24+CgogICAgVG8gdXNlIGBwYXBlci1idXR0b25gIGFzIGEgbGluaywgd3JhcCBpdCBpbiBhbiBhbmNob3IgdGFnLiBTaW5jZSBgcGFwZXItYnV0dG9uYAogICAgd2lsbCBhbHJlYWR5IHJlY2VpdmUgZm9jdXMsIHlvdSBtYXkgd2FudCB0byBwcmV2ZW50IHRoZSBhbmNob3IgdGFnIGZyb20KICAgIHJlY2VpdmluZyBmb2N1cyBhcyB3ZWxsIGJ5IHNldHRpbmcgaXRzIHRhYmluZGV4IHRvIC0xLgoKICAgICAgICA8YSBocmVmPSJodHRwczovL3d3dy5wb2x5bWVyLXByb2plY3Qub3JnLyIgdGFiaW5kZXg9Ii0xIj4KICAgICAgICAgIDxwYXBlci1idXR0b24gcmFpc2VkPlBvbHltZXIgUHJvamVjdDwvcGFwZXItYnV0dG9uPgogICAgICAgIDwvYT4KCiAgICAjIyMgU3R5bGluZwoKICAgIFN0eWxlIHRoZSBidXR0b24gd2l0aCBDU1MgYXMgeW91IHdvdWxkIGEgbm9ybWFsIERPTSBlbGVtZW50LgoKICAgICAgICBwYXBlci1idXR0b24uZmFuY3kgewogICAgICAgICAgYmFja2dyb3VuZDogZ3JlZW47CiAgICAgICAgICBjb2xvcjogeWVsbG93OwogICAgICAgIH0KCiAgICAgICAgcGFwZXItYnV0dG9uLmZhbmN5OmhvdmVyIHsKICAgICAgICAgIGJhY2tncm91bmQ6IGxpbWU7CiAgICAgICAgfQoKICAgICAgICBwYXBlci1idXR0b25bZGlzYWJsZWRdLAogICAgICAgIHBhcGVyLWJ1dHRvblt0b2dnbGVzXVthY3RpdmVdIHsKICAgICAgICAgIGJhY2tncm91bmQ6IHJlZDsKICAgICAgICB9CgogICAgQnkgZGVmYXVsdCwgdGhlIHJpcHBsZSBpcyB0aGUgc2FtZSBjb2xvciBhcyB0aGUgZm9yZWdyb3VuZCBhdCAyNSUgb3BhY2l0eS4gWW91CiAgICBtYXkgY3VzdG9taXplIHRoZSBjb2xvciB1c2luZyB0aGUgYC0tcGFwZXItYnV0dG9uLWluay1jb2xvcmAgY3VzdG9tIHByb3BlcnR5LgoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYWxzbyBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItYnV0dG9uLWluay1jb2xvcmAgfCBCYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSByaXBwbGUgfCBgQmFzZWQgb24gdGhlIGJ1dHRvbidzIGNvbG9yYAogICAgYC0tcGFwZXItYnV0dG9uYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGJ1dHRvbiB8IGB7fWAKICAgIGAtLXBhcGVyLWJ1dHRvbi1kaXNhYmxlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBkaXNhYmxlZCBidXR0b24uIE5vdGUgdGhhdCB5b3UgY2FuIGFsc28gdXNlIHRoZSBgcGFwZXItYnV0dG9uW2Rpc2FibGVkXWAgc2VsZWN0b3IgfCBge31gCiAgICBgLS1wYXBlci1idXR0b24tZmxhdC1rZXlib2FyZC1mb2N1c2AgfCBNaXhpbiBhcHBsaWVkIHRvIGEgZmxhdCBidXR0b24gYWZ0ZXIgaXQncyBiZWVuIGZvY3VzZWQgdXNpbmcgdGhlIGtleWJvYXJkIHwgYHt9YAogICAgYC0tcGFwZXItYnV0dG9uLXJhaXNlZC1rZXlib2FyZC1mb2N1c2AgfCBNaXhpbiBhcHBsaWVkIHRvIGEgcmFpc2VkIGJ1dHRvbiBhZnRlciBpdCdzIGJlZW4gZm9jdXNlZCB1c2luZyB0aGUga2V5Ym9hcmQgfCBge31gCgogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogdGVtcGxhdGUkNiwKCiAgICAgIGlzOiAncGFwZXItYnV0dG9uJywKCiAgICAgIGJlaGF2aW9yczogW1BhcGVyQnV0dG9uQmVoYXZpb3JdLAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHRoZSBidXR0b24gc2hvdWxkIGJlIHN0eWxlZCB3aXRoIGEgc2hhZG93LgogICAgICAgICAqLwogICAgICAgIHJhaXNlZDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIG9ic2VydmVyOiAnX2NhbGN1bGF0ZUVsZXZhdGlvbicsCiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2NhbGN1bGF0ZUVsZXZhdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLnJhaXNlZCkgewogICAgICAgICAgdGhpcy5fc2V0RWxldmF0aW9uKDApOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBQYXBlckJ1dHRvbkJlaGF2aW9ySW1wbC5fY2FsY3VsYXRlRWxldmF0aW9uLmFwcGx5KHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgIEZpcmVkIHdoZW4gdGhlIGFuaW1hdGlvbiBmaW5pc2hlcy4KICAgICAgVGhpcyBpcyB1c2VmdWwgaWYgeW91IHdhbnQgdG8gd2FpdCB1bnRpbAogICAgICB0aGUgcmlwcGxlIGFuaW1hdGlvbiBmaW5pc2hlcyB0byBwZXJmb3JtIHNvbWUgYWN0aW9uLgoKICAgICAgQGV2ZW50IHRyYW5zaXRpb25lbmQKICAgICAgRXZlbnQgcGFyYW06IHt7bm9kZTogT2JqZWN0fX0gZGV0YWlsIENvbnRhaW5zIHRoZSBhbmltYXRlZCBub2RlLgogICAgICAqLwogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCiAgICBjb25zdCB0ZW1wbGF0ZSQ3ID0gaHRtbGAKPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC8qIE1hdGVyaWFsIERlc2lnbiBjb2xvciBwYWxldHRlIGZvciBHb29nbGUgcHJvZHVjdHMgKi8KCiAgICAgIC0tZ29vZ2xlLXJlZC0xMDA6ICNmNGM3YzM7CiAgICAgIC0tZ29vZ2xlLXJlZC0zMDA6ICNlNjdjNzM7CiAgICAgIC0tZ29vZ2xlLXJlZC01MDA6ICNkYjQ0Mzc7CiAgICAgIC0tZ29vZ2xlLXJlZC03MDA6ICNjNTM5Mjk7CgogICAgICAtLWdvb2dsZS1ibHVlLTEwMDogI2M2ZGFmYzsKICAgICAgLS1nb29nbGUtYmx1ZS0zMDA6ICM3YmFhZjc7CiAgICAgIC0tZ29vZ2xlLWJsdWUtNTAwOiAjNDI4NWY0OwogICAgICAtLWdvb2dsZS1ibHVlLTcwMDogIzMzNjdkNjsKCiAgICAgIC0tZ29vZ2xlLWdyZWVuLTEwMDogI2I3ZTFjZDsKICAgICAgLS1nb29nbGUtZ3JlZW4tMzAwOiAjNTdiYjhhOwogICAgICAtLWdvb2dsZS1ncmVlbi01MDA6ICMwZjlkNTg7CiAgICAgIC0tZ29vZ2xlLWdyZWVuLTcwMDogIzBiODA0MzsKCiAgICAgIC0tZ29vZ2xlLXllbGxvdy0xMDA6ICNmY2U4YjI7CiAgICAgIC0tZ29vZ2xlLXllbGxvdy0zMDA6ICNmN2NiNGQ7CiAgICAgIC0tZ29vZ2xlLXllbGxvdy01MDA6ICNmNGI0MDA7CiAgICAgIC0tZ29vZ2xlLXllbGxvdy03MDA6ICNmMDkzMDA7CgogICAgICAtLWdvb2dsZS1ncmV5LTEwMDogI2Y1ZjVmNTsKICAgICAgLS1nb29nbGUtZ3JleS0zMDA6ICNlMGUwZTA7CiAgICAgIC0tZ29vZ2xlLWdyZXktNTAwOiAjOWU5ZTllOwogICAgICAtLWdvb2dsZS1ncmV5LTcwMDogIzYxNjE2MTsKCiAgICAgIC8qIE1hdGVyaWFsIERlc2lnbiBjb2xvciBwYWxldHRlIGZyb20gb25saW5lIHNwZWMgZG9jdW1lbnQgKi8KCiAgICAgIC0tcGFwZXItcmVkLTUwOiAjZmZlYmVlOwogICAgICAtLXBhcGVyLXJlZC0xMDA6ICNmZmNkZDI7CiAgICAgIC0tcGFwZXItcmVkLTIwMDogI2VmOWE5YTsKICAgICAgLS1wYXBlci1yZWQtMzAwOiAjZTU3MzczOwogICAgICAtLXBhcGVyLXJlZC00MDA6ICNlZjUzNTA7CiAgICAgIC0tcGFwZXItcmVkLTUwMDogI2Y0NDMzNjsKICAgICAgLS1wYXBlci1yZWQtNjAwOiAjZTUzOTM1OwogICAgICAtLXBhcGVyLXJlZC03MDA6ICNkMzJmMmY7CiAgICAgIC0tcGFwZXItcmVkLTgwMDogI2M2MjgyODsKICAgICAgLS1wYXBlci1yZWQtOTAwOiAjYjcxYzFjOwogICAgICAtLXBhcGVyLXJlZC1hMTAwOiAjZmY4YTgwOwogICAgICAtLXBhcGVyLXJlZC1hMjAwOiAjZmY1MjUyOwogICAgICAtLXBhcGVyLXJlZC1hNDAwOiAjZmYxNzQ0OwogICAgICAtLXBhcGVyLXJlZC1hNzAwOiAjZDUwMDAwOwoKICAgICAgLS1wYXBlci1waW5rLTUwOiAjZmNlNGVjOwogICAgICAtLXBhcGVyLXBpbmstMTAwOiAjZjhiYmQwOwogICAgICAtLXBhcGVyLXBpbmstMjAwOiAjZjQ4ZmIxOwogICAgICAtLXBhcGVyLXBpbmstMzAwOiAjZjA2MjkyOwogICAgICAtLXBhcGVyLXBpbmstNDAwOiAjZWM0MDdhOwogICAgICAtLXBhcGVyLXBpbmstNTAwOiAjZTkxZTYzOwogICAgICAtLXBhcGVyLXBpbmstNjAwOiAjZDgxYjYwOwogICAgICAtLXBhcGVyLXBpbmstNzAwOiAjYzIxODViOwogICAgICAtLXBhcGVyLXBpbmstODAwOiAjYWQxNDU3OwogICAgICAtLXBhcGVyLXBpbmstOTAwOiAjODgwZTRmOwogICAgICAtLXBhcGVyLXBpbmstYTEwMDogI2ZmODBhYjsKICAgICAgLS1wYXBlci1waW5rLWEyMDA6ICNmZjQwODE7CiAgICAgIC0tcGFwZXItcGluay1hNDAwOiAjZjUwMDU3OwogICAgICAtLXBhcGVyLXBpbmstYTcwMDogI2M1MTE2MjsKCiAgICAgIC0tcGFwZXItcHVycGxlLTUwOiAjZjNlNWY1OwogICAgICAtLXBhcGVyLXB1cnBsZS0xMDA6ICNlMWJlZTc7CiAgICAgIC0tcGFwZXItcHVycGxlLTIwMDogI2NlOTNkODsKICAgICAgLS1wYXBlci1wdXJwbGUtMzAwOiAjYmE2OGM4OwogICAgICAtLXBhcGVyLXB1cnBsZS00MDA6ICNhYjQ3YmM7CiAgICAgIC0tcGFwZXItcHVycGxlLTUwMDogIzljMjdiMDsKICAgICAgLS1wYXBlci1wdXJwbGUtNjAwOiAjOGUyNGFhOwogICAgICAtLXBhcGVyLXB1cnBsZS03MDA6ICM3YjFmYTI7CiAgICAgIC0tcGFwZXItcHVycGxlLTgwMDogIzZhMWI5YTsKICAgICAgLS1wYXBlci1wdXJwbGUtOTAwOiAjNGExNDhjOwogICAgICAtLXBhcGVyLXB1cnBsZS1hMTAwOiAjZWE4MGZjOwogICAgICAtLXBhcGVyLXB1cnBsZS1hMjAwOiAjZTA0MGZiOwogICAgICAtLXBhcGVyLXB1cnBsZS1hNDAwOiAjZDUwMGY5OwogICAgICAtLXBhcGVyLXB1cnBsZS1hNzAwOiAjYWEwMGZmOwoKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS01MDogI2VkZTdmNjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS0xMDA6ICNkMWM0ZTk7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtMjAwOiAjYjM5ZGRiOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTMwMDogIzk1NzVjZDsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS00MDA6ICM3ZTU3YzI7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtNTAwOiAjNjczYWI3OwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTYwMDogIzVlMzViMTsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS03MDA6ICM1MTJkYTg7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtODAwOiAjNDUyN2EwOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLTkwMDogIzMxMWI5MjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hMTAwOiAjYjM4OGZmOwogICAgICAtLXBhcGVyLWRlZXAtcHVycGxlLWEyMDA6ICM3YzRkZmY7CiAgICAgIC0tcGFwZXItZGVlcC1wdXJwbGUtYTQwMDogIzY1MWZmZjsKICAgICAgLS1wYXBlci1kZWVwLXB1cnBsZS1hNzAwOiAjNjIwMGVhOwoKICAgICAgLS1wYXBlci1pbmRpZ28tNTA6ICNlOGVhZjY7CiAgICAgIC0tcGFwZXItaW5kaWdvLTEwMDogI2M1Y2FlOTsKICAgICAgLS1wYXBlci1pbmRpZ28tMjAwOiAjOWZhOGRhOwogICAgICAtLXBhcGVyLWluZGlnby0zMDA6ICM3OTg2Y2I7CiAgICAgIC0tcGFwZXItaW5kaWdvLTQwMDogIzVjNmJjMDsKICAgICAgLS1wYXBlci1pbmRpZ28tNTAwOiAjM2Y1MWI1OwogICAgICAtLXBhcGVyLWluZGlnby02MDA6ICMzOTQ5YWI7CiAgICAgIC0tcGFwZXItaW5kaWdvLTcwMDogIzMwM2Y5ZjsKICAgICAgLS1wYXBlci1pbmRpZ28tODAwOiAjMjgzNTkzOwogICAgICAtLXBhcGVyLWluZGlnby05MDA6ICMxYTIzN2U7CiAgICAgIC0tcGFwZXItaW5kaWdvLWExMDA6ICM4YzllZmY7CiAgICAgIC0tcGFwZXItaW5kaWdvLWEyMDA6ICM1MzZkZmU7CiAgICAgIC0tcGFwZXItaW5kaWdvLWE0MDA6ICMzZDVhZmU7CiAgICAgIC0tcGFwZXItaW5kaWdvLWE3MDA6ICMzMDRmZmU7CgogICAgICAtLXBhcGVyLWJsdWUtNTA6ICNlM2YyZmQ7CiAgICAgIC0tcGFwZXItYmx1ZS0xMDA6ICNiYmRlZmI7CiAgICAgIC0tcGFwZXItYmx1ZS0yMDA6ICM5MGNhZjk7CiAgICAgIC0tcGFwZXItYmx1ZS0zMDA6ICM2NGI1ZjY7CiAgICAgIC0tcGFwZXItYmx1ZS00MDA6ICM0MmE1ZjU7CiAgICAgIC0tcGFwZXItYmx1ZS01MDA6ICMyMTk2ZjM7CiAgICAgIC0tcGFwZXItYmx1ZS02MDA6ICMxZTg4ZTU7CiAgICAgIC0tcGFwZXItYmx1ZS03MDA6ICMxOTc2ZDI7CiAgICAgIC0tcGFwZXItYmx1ZS04MDA6ICMxNTY1YzA7CiAgICAgIC0tcGFwZXItYmx1ZS05MDA6ICMwZDQ3YTE7CiAgICAgIC0tcGFwZXItYmx1ZS1hMTAwOiAjODJiMWZmOwogICAgICAtLXBhcGVyLWJsdWUtYTIwMDogIzQ0OGFmZjsKICAgICAgLS1wYXBlci1ibHVlLWE0MDA6ICMyOTc5ZmY7CiAgICAgIC0tcGFwZXItYmx1ZS1hNzAwOiAjMjk2MmZmOwoKICAgICAgLS1wYXBlci1saWdodC1ibHVlLTUwOiAjZTFmNWZlOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtMTAwOiAjYjNlNWZjOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtMjAwOiAjODFkNGZhOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtMzAwOiAjNGZjM2Y3OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNDAwOiAjMjliNmY2OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwOiAjMDNhOWY0OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNjAwOiAjMDM5YmU1OwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtNzAwOiAjMDI4OGQxOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtODAwOiAjMDI3N2JkOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwOiAjMDE1NzliOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTEwMDogIzgwZDhmZjsKICAgICAgLS1wYXBlci1saWdodC1ibHVlLWEyMDA6ICM0MGM0ZmY7CiAgICAgIC0tcGFwZXItbGlnaHQtYmx1ZS1hNDAwOiAjMDBiMGZmOwogICAgICAtLXBhcGVyLWxpZ2h0LWJsdWUtYTcwMDogIzAwOTFlYTsKCiAgICAgIC0tcGFwZXItY3lhbi01MDogI2UwZjdmYTsKICAgICAgLS1wYXBlci1jeWFuLTEwMDogI2IyZWJmMjsKICAgICAgLS1wYXBlci1jeWFuLTIwMDogIzgwZGVlYTsKICAgICAgLS1wYXBlci1jeWFuLTMwMDogIzRkZDBlMTsKICAgICAgLS1wYXBlci1jeWFuLTQwMDogIzI2YzZkYTsKICAgICAgLS1wYXBlci1jeWFuLTUwMDogIzAwYmNkNDsKICAgICAgLS1wYXBlci1jeWFuLTYwMDogIzAwYWNjMTsKICAgICAgLS1wYXBlci1jeWFuLTcwMDogIzAwOTdhNzsKICAgICAgLS1wYXBlci1jeWFuLTgwMDogIzAwODM4ZjsKICAgICAgLS1wYXBlci1jeWFuLTkwMDogIzAwNjA2NDsKICAgICAgLS1wYXBlci1jeWFuLWExMDA6ICM4NGZmZmY7CiAgICAgIC0tcGFwZXItY3lhbi1hMjAwOiAjMThmZmZmOwogICAgICAtLXBhcGVyLWN5YW4tYTQwMDogIzAwZTVmZjsKICAgICAgLS1wYXBlci1jeWFuLWE3MDA6ICMwMGI4ZDQ7CgogICAgICAtLXBhcGVyLXRlYWwtNTA6ICNlMGYyZjE7CiAgICAgIC0tcGFwZXItdGVhbC0xMDA6ICNiMmRmZGI7CiAgICAgIC0tcGFwZXItdGVhbC0yMDA6ICM4MGNiYzQ7CiAgICAgIC0tcGFwZXItdGVhbC0zMDA6ICM0ZGI2YWM7CiAgICAgIC0tcGFwZXItdGVhbC00MDA6ICMyNmE2OWE7CiAgICAgIC0tcGFwZXItdGVhbC01MDA6ICMwMDk2ODg7CiAgICAgIC0tcGFwZXItdGVhbC02MDA6ICMwMDg5N2I7CiAgICAgIC0tcGFwZXItdGVhbC03MDA6ICMwMDc5NmI7CiAgICAgIC0tcGFwZXItdGVhbC04MDA6ICMwMDY5NWM7CiAgICAgIC0tcGFwZXItdGVhbC05MDA6ICMwMDRkNDA7CiAgICAgIC0tcGFwZXItdGVhbC1hMTAwOiAjYTdmZmViOwogICAgICAtLXBhcGVyLXRlYWwtYTIwMDogIzY0ZmZkYTsKICAgICAgLS1wYXBlci10ZWFsLWE0MDA6ICMxZGU5YjY7CiAgICAgIC0tcGFwZXItdGVhbC1hNzAwOiAjMDBiZmE1OwoKICAgICAgLS1wYXBlci1ncmVlbi01MDogI2U4ZjVlOTsKICAgICAgLS1wYXBlci1ncmVlbi0xMDA6ICNjOGU2Yzk7CiAgICAgIC0tcGFwZXItZ3JlZW4tMjAwOiAjYTVkNmE3OwogICAgICAtLXBhcGVyLWdyZWVuLTMwMDogIzgxYzc4NDsKICAgICAgLS1wYXBlci1ncmVlbi00MDA6ICM2NmJiNmE7CiAgICAgIC0tcGFwZXItZ3JlZW4tNTAwOiAjNGNhZjUwOwogICAgICAtLXBhcGVyLWdyZWVuLTYwMDogIzQzYTA0NzsKICAgICAgLS1wYXBlci1ncmVlbi03MDA6ICMzODhlM2M7CiAgICAgIC0tcGFwZXItZ3JlZW4tODAwOiAjMmU3ZDMyOwogICAgICAtLXBhcGVyLWdyZWVuLTkwMDogIzFiNWUyMDsKICAgICAgLS1wYXBlci1ncmVlbi1hMTAwOiAjYjlmNmNhOwogICAgICAtLXBhcGVyLWdyZWVuLWEyMDA6ICM2OWYwYWU7CiAgICAgIC0tcGFwZXItZ3JlZW4tYTQwMDogIzAwZTY3NjsKICAgICAgLS1wYXBlci1ncmVlbi1hNzAwOiAjMDBjODUzOwoKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi01MDogI2YxZjhlOTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi0xMDA6ICNkY2VkYzg7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tMjAwOiAjYzVlMWE1OwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTMwMDogI2FlZDU4MTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi00MDA6ICM5Y2NjNjU7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tNTAwOiAjOGJjMzRhOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTYwMDogIzdjYjM0MjsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi03MDA6ICM2ODlmMzg7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tODAwOiAjNTU4YjJmOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLTkwMDogIzMzNjkxZTsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hMTAwOiAjY2NmZjkwOwogICAgICAtLXBhcGVyLWxpZ2h0LWdyZWVuLWEyMDA6ICNiMmZmNTk7CiAgICAgIC0tcGFwZXItbGlnaHQtZ3JlZW4tYTQwMDogIzc2ZmYwMzsKICAgICAgLS1wYXBlci1saWdodC1ncmVlbi1hNzAwOiAjNjRkZDE3OwoKICAgICAgLS1wYXBlci1saW1lLTUwOiAjZjlmYmU3OwogICAgICAtLXBhcGVyLWxpbWUtMTAwOiAjZjBmNGMzOwogICAgICAtLXBhcGVyLWxpbWUtMjAwOiAjZTZlZTljOwogICAgICAtLXBhcGVyLWxpbWUtMzAwOiAjZGNlNzc1OwogICAgICAtLXBhcGVyLWxpbWUtNDAwOiAjZDRlMTU3OwogICAgICAtLXBhcGVyLWxpbWUtNTAwOiAjY2RkYzM5OwogICAgICAtLXBhcGVyLWxpbWUtNjAwOiAjYzBjYTMzOwogICAgICAtLXBhcGVyLWxpbWUtNzAwOiAjYWZiNDJiOwogICAgICAtLXBhcGVyLWxpbWUtODAwOiAjOWU5ZDI0OwogICAgICAtLXBhcGVyLWxpbWUtOTAwOiAjODI3NzE3OwogICAgICAtLXBhcGVyLWxpbWUtYTEwMDogI2Y0ZmY4MTsKICAgICAgLS1wYXBlci1saW1lLWEyMDA6ICNlZWZmNDE7CiAgICAgIC0tcGFwZXItbGltZS1hNDAwOiAjYzZmZjAwOwogICAgICAtLXBhcGVyLWxpbWUtYTcwMDogI2FlZWEwMDsKCiAgICAgIC0tcGFwZXIteWVsbG93LTUwOiAjZmZmZGU3OwogICAgICAtLXBhcGVyLXllbGxvdy0xMDA6ICNmZmY5YzQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTIwMDogI2ZmZjU5ZDsKICAgICAgLS1wYXBlci15ZWxsb3ctMzAwOiAjZmZmMTc2OwogICAgICAtLXBhcGVyLXllbGxvdy00MDA6ICNmZmVlNTg7CiAgICAgIC0tcGFwZXIteWVsbG93LTUwMDogI2ZmZWIzYjsKICAgICAgLS1wYXBlci15ZWxsb3ctNjAwOiAjZmRkODM1OwogICAgICAtLXBhcGVyLXllbGxvdy03MDA6ICNmYmMwMmQ7CiAgICAgIC0tcGFwZXIteWVsbG93LTgwMDogI2Y5YTgyNTsKICAgICAgLS1wYXBlci15ZWxsb3ctOTAwOiAjZjU3ZjE3OwogICAgICAtLXBhcGVyLXllbGxvdy1hMTAwOiAjZmZmZjhkOwogICAgICAtLXBhcGVyLXllbGxvdy1hMjAwOiAjZmZmZjAwOwogICAgICAtLXBhcGVyLXllbGxvdy1hNDAwOiAjZmZlYTAwOwogICAgICAtLXBhcGVyLXllbGxvdy1hNzAwOiAjZmZkNjAwOwoKICAgICAgLS1wYXBlci1hbWJlci01MDogI2ZmZjhlMTsKICAgICAgLS1wYXBlci1hbWJlci0xMDA6ICNmZmVjYjM7CiAgICAgIC0tcGFwZXItYW1iZXItMjAwOiAjZmZlMDgyOwogICAgICAtLXBhcGVyLWFtYmVyLTMwMDogI2ZmZDU0ZjsKICAgICAgLS1wYXBlci1hbWJlci00MDA6ICNmZmNhMjg7CiAgICAgIC0tcGFwZXItYW1iZXItNTAwOiAjZmZjMTA3OwogICAgICAtLXBhcGVyLWFtYmVyLTYwMDogI2ZmYjMwMDsKICAgICAgLS1wYXBlci1hbWJlci03MDA6ICNmZmEwMDA7CiAgICAgIC0tcGFwZXItYW1iZXItODAwOiAjZmY4ZjAwOwogICAgICAtLXBhcGVyLWFtYmVyLTkwMDogI2ZmNmYwMDsKICAgICAgLS1wYXBlci1hbWJlci1hMTAwOiAjZmZlNTdmOwogICAgICAtLXBhcGVyLWFtYmVyLWEyMDA6ICNmZmQ3NDA7CiAgICAgIC0tcGFwZXItYW1iZXItYTQwMDogI2ZmYzQwMDsKICAgICAgLS1wYXBlci1hbWJlci1hNzAwOiAjZmZhYjAwOwoKICAgICAgLS1wYXBlci1vcmFuZ2UtNTA6ICNmZmYzZTA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTEwMDogI2ZmZTBiMjsKICAgICAgLS1wYXBlci1vcmFuZ2UtMjAwOiAjZmZjYzgwOwogICAgICAtLXBhcGVyLW9yYW5nZS0zMDA6ICNmZmI3NGQ7CiAgICAgIC0tcGFwZXItb3JhbmdlLTQwMDogI2ZmYTcyNjsKICAgICAgLS1wYXBlci1vcmFuZ2UtNTAwOiAjZmY5ODAwOwogICAgICAtLXBhcGVyLW9yYW5nZS02MDA6ICNmYjhjMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLTcwMDogI2Y1N2MwMDsKICAgICAgLS1wYXBlci1vcmFuZ2UtODAwOiAjZWY2YzAwOwogICAgICAtLXBhcGVyLW9yYW5nZS05MDA6ICNlNjUxMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWExMDA6ICNmZmQxODA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWEyMDA6ICNmZmFiNDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWE0MDA6ICNmZjkxMDA7CiAgICAgIC0tcGFwZXItb3JhbmdlLWE3MDA6ICNmZjY1MDA7CgogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTUwOiAjZmJlOWU3OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTEwMDogI2ZmY2NiYzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS0yMDA6ICNmZmFiOTE7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtMzAwOiAjZmY4YTY1OwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTQwMDogI2ZmNzA0MzsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS01MDA6ICNmZjU3MjI7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtNjAwOiAjZjQ1MTFlOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLTcwMDogI2U2NGExOTsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS04MDA6ICNkODQzMTU7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtOTAwOiAjYmYzNjBjOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWExMDA6ICNmZjllODA7CiAgICAgIC0tcGFwZXItZGVlcC1vcmFuZ2UtYTIwMDogI2ZmNmU0MDsKICAgICAgLS1wYXBlci1kZWVwLW9yYW5nZS1hNDAwOiAjZmYzZDAwOwogICAgICAtLXBhcGVyLWRlZXAtb3JhbmdlLWE3MDA6ICNkZDJjMDA7CgogICAgICAtLXBhcGVyLWJyb3duLTUwOiAjZWZlYmU5OwogICAgICAtLXBhcGVyLWJyb3duLTEwMDogI2Q3Y2NjODsKICAgICAgLS1wYXBlci1icm93bi0yMDA6ICNiY2FhYTQ7CiAgICAgIC0tcGFwZXItYnJvd24tMzAwOiAjYTE4ODdmOwogICAgICAtLXBhcGVyLWJyb3duLTQwMDogIzhkNmU2MzsKICAgICAgLS1wYXBlci1icm93bi01MDA6ICM3OTU1NDg7CiAgICAgIC0tcGFwZXItYnJvd24tNjAwOiAjNmQ0YzQxOwogICAgICAtLXBhcGVyLWJyb3duLTcwMDogIzVkNDAzNzsKICAgICAgLS1wYXBlci1icm93bi04MDA6ICM0ZTM0MmU7CiAgICAgIC0tcGFwZXItYnJvd24tOTAwOiAjM2UyNzIzOwoKICAgICAgLS1wYXBlci1ncmV5LTUwOiAjZmFmYWZhOwogICAgICAtLXBhcGVyLWdyZXktMTAwOiAjZjVmNWY1OwogICAgICAtLXBhcGVyLWdyZXktMjAwOiAjZWVlZWVlOwogICAgICAtLXBhcGVyLWdyZXktMzAwOiAjZTBlMGUwOwogICAgICAtLXBhcGVyLWdyZXktNDAwOiAjYmRiZGJkOwogICAgICAtLXBhcGVyLWdyZXktNTAwOiAjOWU5ZTllOwogICAgICAtLXBhcGVyLWdyZXktNjAwOiAjNzU3NTc1OwogICAgICAtLXBhcGVyLWdyZXktNzAwOiAjNjE2MTYxOwogICAgICAtLXBhcGVyLWdyZXktODAwOiAjNDI0MjQyOwogICAgICAtLXBhcGVyLWdyZXktOTAwOiAjMjEyMTIxOwoKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNTA6ICNlY2VmZjE7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTEwMDogI2NmZDhkYzsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktMjAwOiAjYjBiZWM1OwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS0zMDA6ICM5MGE0YWU7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTQwMDogIzc4OTA5YzsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktNTAwOiAjNjA3ZDhiOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS02MDA6ICM1NDZlN2E7CiAgICAgIC0tcGFwZXItYmx1ZS1ncmV5LTcwMDogIzQ1NWE2NDsKICAgICAgLS1wYXBlci1ibHVlLWdyZXktODAwOiAjMzc0NzRmOwogICAgICAtLXBhcGVyLWJsdWUtZ3JleS05MDA6ICMyNjMyMzg7CgogICAgICAvKiBvcGFjaXR5IGZvciBkYXJrIHRleHQgb24gYSBsaWdodCBiYWNrZ3JvdW5kICovCiAgICAgIC0tZGFyay1kaXZpZGVyLW9wYWNpdHk6IDAuMTI7CiAgICAgIC0tZGFyay1kaXNhYmxlZC1vcGFjaXR5OiAwLjM4OyAvKiBvciBoaW50IHRleHQgb3IgaWNvbiAqLwogICAgICAtLWRhcmstc2Vjb25kYXJ5LW9wYWNpdHk6IDAuNTQ7CiAgICAgIC0tZGFyay1wcmltYXJ5LW9wYWNpdHk6IDAuODc7CgogICAgICAvKiBvcGFjaXR5IGZvciBsaWdodCB0ZXh0IG9uIGEgZGFyayBiYWNrZ3JvdW5kICovCiAgICAgIC0tbGlnaHQtZGl2aWRlci1vcGFjaXR5OiAwLjEyOwogICAgICAtLWxpZ2h0LWRpc2FibGVkLW9wYWNpdHk6IDAuMzsgLyogb3IgaGludCB0ZXh0IG9yIGljb24gKi8KICAgICAgLS1saWdodC1zZWNvbmRhcnktb3BhY2l0eTogMC43OwogICAgICAtLWxpZ2h0LXByaW1hcnktb3BhY2l0eTogMS4wOwoKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CmA7CiAgICB0ZW1wbGF0ZSQ3LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUkNy5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KICAgIGNvbnN0IHRlbXBsYXRlJDggPSBodG1sYAo8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgIGh0bWwgewogICAgICAvKgogICAgICAgKiBZb3UgY2FuIHVzZSB0aGVzZSBnZW5lcmljIHZhcmlhYmxlcyBpbiB5b3VyIGVsZW1lbnRzIGZvciBlYXN5IHRoZW1pbmcuCiAgICAgICAqIEZvciBleGFtcGxlLCBpZiBhbGwgeW91ciBlbGVtZW50cyB1c2UgXGAtLXByaW1hcnktdGV4dC1jb2xvclxgIGFzIGl0cyBtYWluCiAgICAgICAqIGNvbG9yLCB0aGVuIHN3aXRjaGluZyBmcm9tIGEgbGlnaHQgdG8gYSBkYXJrIHRoZW1lIGlzIGp1c3QgYSBtYXR0ZXIgb2YKICAgICAgICogY2hhbmdpbmcgdGhlIHZhbHVlIG9mIFxgLS1wcmltYXJ5LXRleHQtY29sb3JcYCBpbiB5b3VyIGFwcGxpY2F0aW9uLgogICAgICAgKi8KICAgICAgLS1wcmltYXJ5LXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLXRleHQtY29sb3IpOwogICAgICAtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtYmFja2dyb3VuZC1jb2xvcik7CiAgICAgIC0tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcik7CiAgICAgIC0tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbGlnaHQtdGhlbWUtZGlzYWJsZWQtY29sb3IpOwogICAgICAtLWRpdmlkZXItY29sb3I6IHZhcigtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3IpOwogICAgICAtLWVycm9yLWNvbG9yOiB2YXIoLS1wYXBlci1kZWVwLW9yYW5nZS1hNzAwKTsKCiAgICAgIC8qCiAgICAgICAqIFByaW1hcnkgYW5kIGFjY2VudCBjb2xvcnMuIEFsc28gc2VlIGNvbG9yLmpzIGZvciBtb3JlIGNvbG9ycy4KICAgICAgICovCiAgICAgIC0tcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tbGlnaHQtcHJpbWFyeS1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTEwMCk7CiAgICAgIC0tZGFyay1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wYXBlci1pbmRpZ28tNzAwKTsKCiAgICAgIC0tYWNjZW50LWNvbG9yOiB2YXIoLS1wYXBlci1waW5rLWEyMDApOwogICAgICAtLWxpZ2h0LWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hMTAwKTsKICAgICAgLS1kYXJrLWFjY2VudC1jb2xvcjogdmFyKC0tcGFwZXItcGluay1hNDAwKTsKCgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gTGlnaHQgYmFja2dyb3VuZCB0aGVtZQogICAgICAgKi8KICAgICAgLS1saWdodC10aGVtZS1iYWNrZ3JvdW5kLWNvbG9yOiAjZmZmZmZmOwogICAgICAtLWxpZ2h0LXRoZW1lLWJhc2UtY29sb3I6ICMwMDAwMDA7CiAgICAgIC0tbGlnaHQtdGhlbWUtdGV4dC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWxpZ2h0LXRoZW1lLXNlY29uZGFyeS1jb2xvcjogIzczNzM3MzsgIC8qIGZvciBzZWNvbmRhcnkgdGV4dCBhbmQgaWNvbnMgKi8KICAgICAgLS1saWdodC10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzliOWI5YjsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWxpZ2h0LXRoZW1lLWRpdmlkZXItY29sb3I6ICNkYmRiZGI7CgogICAgICAvKgogICAgICAgKiBNYXRlcmlhbCBEZXNpZ24gRGFyayBiYWNrZ3JvdW5kIHRoZW1lCiAgICAgICAqLwogICAgICAtLWRhcmstdGhlbWUtYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JleS05MDApOwogICAgICAtLWRhcmstdGhlbWUtYmFzZS1jb2xvcjogI2ZmZmZmZjsKICAgICAgLS1kYXJrLXRoZW1lLXRleHQtY29sb3I6ICNmZmZmZmY7CiAgICAgIC0tZGFyay10aGVtZS1zZWNvbmRhcnktY29sb3I6ICNiY2JjYmM7ICAvKiBmb3Igc2Vjb25kYXJ5IHRleHQgYW5kIGljb25zICovCiAgICAgIC0tZGFyay10aGVtZS1kaXNhYmxlZC1jb2xvcjogIzY0NjQ2NDsgIC8qIGRpc2FibGVkL2hpbnQgdGV4dCAqLwogICAgICAtLWRhcmstdGhlbWUtZGl2aWRlci1jb2xvcjogIzNjM2MzYzsKCiAgICAgIC8qCiAgICAgICAqIERlcHJlY2F0ZWQgdmFsdWVzIGJlY2F1c2Ugb2YgdGhlaXIgY29uZnVzaW5nIG5hbWVzLgogICAgICAgKi8KICAgICAgLS10ZXh0LXByaW1hcnktY29sb3I6IHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcik7CiAgICAgIC0tZGVmYXVsdC1wcmltYXJ5LWNvbG9yOiB2YXIoLS1wcmltYXJ5LWNvbG9yKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gOwogICAgdGVtcGxhdGUkOC5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmU7Jyk7CiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHRlbXBsYXRlJDguY29udGVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgIElyb25Gb3JtRWxlbWVudEJlaGF2aW9yIGFkZHMgYSBgbmFtZWAsIGB2YWx1ZWAgYW5kIGByZXF1aXJlZGAgcHJvcGVydGllcyB0bwogICAgICBhIGN1c3RvbSBlbGVtZW50LiBJdCBtb3N0bHkgZXhpc3RzIGZvciBiYWNrY29tcGF0aWJpbGl0eSB3aXRoIFBvbHltZXIgMS54LCBhbmQKICAgICAgaXMgcHJvYmFibHkgbm90IHNvbWV0aGluZyB5b3Ugd2FudCB0byB1c2UuCgogICAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAgQHBvbHltZXJCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBJcm9uRm9ybUVsZW1lbnRCZWhhdmlvciA9IHsKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmFtZSBvZiB0aGlzIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgbmFtZToge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50LgogICAgICAgICAqIEB0eXBlIHsqfQogICAgICAgICAqLwogICAgICAgIHZhbHVlOiB7bm90aWZ5OiB0cnVlLCB0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBtYXJrIHRoZSBpbnB1dCBhcyByZXF1aXJlZC4gSWYgdXNlZCBpbiBhIGZvcm0sIGEKICAgICAgICAgKiBjdXN0b20gZWxlbWVudCB0aGF0IHVzZXMgdGhpcyBiZWhhdmlvciBzaG91bGQgYWxzbyB1c2UKICAgICAgICAgKiBJcm9uVmFsaWRhdGFibGVCZWhhdmlvciBhbmQgZGVmaW5lIGEgY3VzdG9tIHZhbGlkYXRpb24gbWV0aG9kLgogICAgICAgICAqIE90aGVyd2lzZSwgYSBgcmVxdWlyZWRgIGVsZW1lbnQgd2lsbCBhbHdheXMgYmUgY29uc2lkZXJlZCB2YWxpZC4KICAgICAgICAgKiBJdCdzIGFsc28gc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gcHJvdmlkZSBhIHZpc3VhbCBzdHlsZSBmb3IgdGhlIGVsZW1lbnQKICAgICAgICAgKiB3aGVuIGl0cyB2YWx1ZSBpcyBpbnZhbGlkLgogICAgICAgICAqLwogICAgICAgIHJlcXVpcmVkOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKICAgICAgfSwKCiAgICAgIC8vIEVtcHR5IGltcGxlbWVudGF0aW9ucyBmb3IgYmFja2NvbXBhdGliaWxpdHkuCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHt9LAogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7fQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIFNpbmdsZXRvbiBJcm9uTWV0YSBpbnN0YW5jZS4KICAgICAqLwogICAgbGV0IElyb25WYWxpZGF0YWJsZUJlaGF2aW9yTWV0YSA9IG51bGw7CgogICAgLyoqCiAgICAgKiBgVXNlIElyb25WYWxpZGF0YWJsZUJlaGF2aW9yYCB0byBpbXBsZW1lbnQgYW4gZWxlbWVudCB0aGF0IHZhbGlkYXRlcwogICAgICogdXNlciBpbnB1dC4gVXNlIHRoZSByZWxhdGVkIGBJcm9uVmFsaWRhdG9yQmVoYXZpb3JgIHRvIGFkZCBjdXN0b20KICAgICAqIHZhbGlkYXRpb24gbG9naWMgdG8gYW4gaXJvbi1pbnB1dC4KICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCBhbiBgPGlyb24tZm9ybT5gIGVsZW1lbnQgdmFsaWRhdGVzIGl0cyBmaWVsZHMgd2hlbiB0aGUgdXNlcgogICAgICogcHJlc3NlcyB0aGUgc3VibWl0IGJ1dHRvbi4gVG8gdmFsaWRhdGUgYSBmb3JtIGltcGVyYXRpdmVseSwgY2FsbCB0aGUgZm9ybSdzCiAgICAgKiBgdmFsaWRhdGUoKWAgbWV0aG9kLCB3aGljaCBpbiB0dXJuIHdpbGwgY2FsbCBgdmFsaWRhdGUoKWAgb24gYWxsIGl0cwogICAgICogY2hpbGRyZW4uIEJ5IHVzaW5nIGBJcm9uVmFsaWRhdGFibGVCZWhhdmlvcmAsIHlvdXIgY3VzdG9tIGVsZW1lbnQKICAgICAqIHdpbGwgZ2V0IGEgcHVibGljIGB2YWxpZGF0ZSgpYCwgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHZhbGlkaXR5IG9mIHRoZQogICAgICogZWxlbWVudCwgYW5kIGEgY29ycmVzcG9uZGluZyBgaW52YWxpZGAgYXR0cmlidXRlLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IKICAgICAqIHN0eWxpbmcuCiAgICAgKgogICAgICogVG8gaW1wbGVtZW50IHRoZSBjdXN0b20gdmFsaWRhdGlvbiBsb2dpYyBvZiB5b3VyIGVsZW1lbnQsIHlvdSBtdXN0IG92ZXJyaWRlCiAgICAgKiB0aGUgcHJvdGVjdGVkIGBfZ2V0VmFsaWRpdHkoKWAgbWV0aG9kIG9mIHRoaXMgYmVoYXZpb3VyLCByYXRoZXIgdGhhbgogICAgICogYHZhbGlkYXRlKClgLiBTZWUKICAgICAqIFt0aGlzXShodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL2lyb24tZm9ybS9ibG9iL21hc3Rlci9kZW1vL3NpbXBsZS1lbGVtZW50Lmh0bWwpCiAgICAgKiBmb3IgYW4gZXhhbXBsZS4KICAgICAqCiAgICAgKiAjIyMgQWNjZXNzaWJpbGl0eQogICAgICoKICAgICAqIENoYW5naW5nIHRoZSBgaW52YWxpZGAgcHJvcGVydHksIGVpdGhlciBtYW51YWxseSBvciBieSBjYWxsaW5nIGB2YWxpZGF0ZSgpYAogICAgICogd2lsbCB1cGRhdGUgdGhlIGBhcmlhLWludmFsaWRgIGF0dHJpYnV0ZS4KICAgICAqCiAgICAgKiBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgY29uc3QgSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogTmFtZSBvZiB0aGUgdmFsaWRhdG9yIHRvIHVzZS4KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0b3I6IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBsYXN0IGNhbGwgdG8gYHZhbGlkYXRlYCBpcyBpbnZhbGlkLgogICAgICAgICAqLwogICAgICAgIGludmFsaWQ6IHsKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICBvYnNlcnZlcjogJ19pbnZhbGlkQ2hhbmdlZCcKICAgICAgICB9LAogICAgICB9LAoKICAgICAgcmVnaXN0ZXJlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhID0gbmV3IElyb25NZXRhKHt0eXBlOiAndmFsaWRhdG9yJ30pOwogICAgICB9LAoKICAgICAgX2ludmFsaWRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5pbnZhbGlkKSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1pbnZhbGlkJywgJ3RydWUnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtaW52YWxpZCcpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qIFJlY29tcHV0ZSB0aGlzIGV2ZXJ5IHRpbWUgaXQncyBuZWVkZWQsIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGUKICAgICAgICogdW5kZXJseWluZyBJcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEgaGFzIGNoYW5nZWQuICovCiAgICAgIGdldCBfdmFsaWRhdG9yKCkgewogICAgICAgIHJldHVybiBJcm9uVmFsaWRhdGFibGVCZWhhdmlvck1ldGEgJiYKICAgICAgICAgICAgSXJvblZhbGlkYXRhYmxlQmVoYXZpb3JNZXRhLmJ5S2V5KHRoaXMudmFsaWRhdG9yKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWxpZGF0b3IgYHZhbGlkYXRvcmAgZXhpc3RzLgogICAgICAgKi8KICAgICAgaGFzVmFsaWRhdG9yOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmFsaWRhdG9yICE9IG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBgdmFsdWVgIGlzIHZhbGlkLCBhbmQgdXBkYXRlcyBgaW52YWxpZGAuIElmIHlvdSB3YW50CiAgICAgICAqIHlvdXIgZWxlbWVudCB0byBoYXZlIGN1c3RvbSB2YWxpZGF0aW9uIGxvZ2ljLCBkbyBub3Qgb3ZlcnJpZGUgdGhpcyBtZXRob2Q7CiAgICAgICAqIG92ZXJyaWRlIGBfZ2V0VmFsaWRpdHkodmFsdWUpYCBpbnN0ZWFkLgoKICAgICAgICogQHBhcmFtIHtPYmplY3R9IHZhbHVlIERlcHJlY2F0ZWQ6IFRoZSB2YWx1ZSB0byBiZSB2YWxpZGF0ZWQuIEJ5IGRlZmF1bHQsCiAgICAgICAqIGl0IGlzIHBhc3NlZCB0byB0aGUgdmFsaWRhdG9yJ3MgYHZhbGlkYXRlKClgIGZ1bmN0aW9uLCBpZiBhIHZhbGlkYXRvciBpcwogICAgICAgc2V0LgogICAgICAgKiBJZiB0aGlzIGFyZ3VtZW50IGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gdGhlIGVsZW1lbnQncyBgdmFsdWVgIHByb3BlcnR5CiAgICAgICAqIGlzIHVzZWQsIGlmIGl0IGV4aXN0cy4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLgogICAgICAgKi8KICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgLy8gSWYgdGhpcyBpcyBhbiBlbGVtZW50IHRoYXQgYWxzbyBoYXMgYSB2YWx1ZSBwcm9wZXJ0eSwgYW5kIHRoZXJlIHdhcwogICAgICAgIC8vIG5vIGV4cGxpY2l0IHZhbHVlIGFyZ3VtZW50IHBhc3NlZCwgdXNlIHRoZSBlbGVtZW50J3MgcHJvcGVydHkgaW5zdGVhZC4KICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCAmJiB0aGlzLnZhbHVlICE9PSB1bmRlZmluZWQpCiAgICAgICAgICB0aGlzLmludmFsaWQgPSAhdGhpcy5fZ2V0VmFsaWRpdHkodGhpcy52YWx1ZSk7CiAgICAgICAgZWxzZQogICAgICAgICAgdGhpcy5pbnZhbGlkID0gIXRoaXMuX2dldFZhbGlkaXR5KHZhbHVlKTsKICAgICAgICByZXR1cm4gIXRoaXMuaW52YWxpZDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gIEJ5IGRlZmF1bHQsIGl0IGlzIHBhc3NlZAogICAgICAgKiB0byB0aGUgdmFsaWRhdG9yJ3MgYHZhbGlkYXRlKClgIGZ1bmN0aW9uLCBpZiBhIHZhbGlkYXRvciBpcyBzZXQuIFlvdQogICAgICAgKiBzaG91bGQgb3ZlcnJpZGUgdGhpcyBtZXRob2QgaWYgeW91IHdhbnQgdG8gaW1wbGVtZW50IGN1c3RvbSB2YWxpZGl0eQogICAgICAgKiBsb2dpYyBmb3IgeW91ciBlbGVtZW50LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIHZhbGlkYXRlZC4KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiBgdmFsdWVgIGlzIHZhbGlkLgogICAgICAgKi8KCiAgICAgIF9nZXRWYWxpZGl0eTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5oYXNWYWxpZGF0b3IoKSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbGlkYXRvci52YWxpZGF0ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogVXNlIGBJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcmAgdG8gaW1wbGVtZW50IGEgY3VzdG9tIGVsZW1lbnQgdGhhdCBoYXMgYQogICAgICogYGNoZWNrZWRgIHByb3BlcnR5LCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgdmFsaWRhdGlvbiBpZiB0aGUgZWxlbWVudCBpcyBhbHNvCiAgICAgKiBgcmVxdWlyZWRgLiBFbGVtZW50IGluc3RhbmNlcyBpbXBsZW1lbnRpbmcgdGhpcyBiZWhhdmlvciB3aWxsIGFsc28gYmUKICAgICAqIHJlZ2lzdGVyZWQgZm9yIHVzZSBpbiBhbiBgaXJvbi1mb3JtYCBlbGVtZW50LgogICAgICoKICAgICAqIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgICogQHBvbHltZXJCZWhhdmlvciBJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGlyb24tY2hhbmdlCiAgICAgICAgICovCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgb3Igc2V0cyB0aGUgc3RhdGUsIGB0cnVlYCBpcyBjaGVja2VkIGFuZCBgZmFsc2VgIGlzIHVuY2hlY2tlZC4KICAgICAgICAgKi8KICAgICAgICBjaGVja2VkOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfY2hlY2tlZENoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIGJ1dHRvbiB0b2dnbGVzIHRoZSBhY3RpdmUgc3RhdGUgd2l0aCBlYWNoIHRhcCBvciBwcmVzcwogICAgICAgICAqIG9mIHRoZSBzcGFjZWJhci4KICAgICAgICAgKi8KICAgICAgICB0b2dnbGVzOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IHRydWUsIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZX0sCgogICAgICAgIC8qIE92ZXJyaWRlbiBmcm9tIElyb25Gb3JtRWxlbWVudEJlaGF2aW9yICovCiAgICAgICAgdmFsdWU6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnb24nLCBvYnNlcnZlcjogJ192YWx1ZUNoYW5nZWQnfQogICAgICB9LAoKICAgICAgb2JzZXJ2ZXJzOiBbJ19yZXF1aXJlZENoYW5nZWQocmVxdWlyZWQpJ10sCgogICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBVc2VkIGJ5IGBpcm9uLWZvcm1gIHRvIGhhbmRsZSB0aGUgY2FzZSB0aGF0IGFuIGVsZW1lbnQgd2l0aCB0aGlzIGJlaGF2aW9yCiAgICAgICAgLy8gZG9lc24ndCBoYXZlIGEgcm9sZSBvZiAnY2hlY2tib3gnIG9yICdyYWRpbycsIGJ1dCBzaG91bGQgc3RpbGwgb25seSBiZQogICAgICAgIC8vIGluY2x1ZGVkIHdoZW4gdGhlIGZvcm0gaXMgc2VyaWFsaXplZCBpZiBgdGhpcy5jaGVja2VkID09PSB0cnVlYC4KICAgICAgICB0aGlzLl9oYXNJcm9uQ2hlY2tlZEVsZW1lbnRCZWhhdmlvciA9IHRydWU7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgZWxlbWVudCBpcyByZXF1aXJlZCBhbmQgbm90IGNoZWNrZWQsIGFuZCB0cnVlCiAgICAgICAqIG90aGVyd2lzZS4KICAgICAgICogQHBhcmFtIHsqPX0gX3ZhbHVlIElnbm9yZWQuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgYHJlcXVpcmVkYCBpcyBmYWxzZSBvciBpZiBgY2hlY2tlZGAgaXMgdHJ1ZS4KICAgICAgICovCiAgICAgIF9nZXRWYWxpZGl0eTogZnVuY3Rpb24oX3ZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMucmVxdWlyZWQgfHwgdGhpcy5jaGVja2VkOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZSB0aGUgYXJpYS1yZXF1aXJlZCBsYWJlbCB3aGVuIGByZXF1aXJlZGAgaXMgY2hhbmdlZC4KICAgICAgICovCiAgICAgIF9yZXF1aXJlZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLnJlcXVpcmVkKSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1yZXF1aXJlZCcsICd0cnVlJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXJlcXVpcmVkJyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEZpcmUgYGlyb24tY2hhbmdlZGAgd2hlbiB0aGUgY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzLgogICAgICAgKi8KICAgICAgX2NoZWNrZWRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmFjdGl2ZSA9IHRoaXMuY2hlY2tlZDsKICAgICAgICB0aGlzLmZpcmUoJ2lyb24tY2hhbmdlJyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVzZXQgdmFsdWUgdG8gJ29uJyBpZiBpdCBpcyBzZXQgdG8gYHVuZGVmaW5lZGAuCiAgICAgICAqLwogICAgICBfdmFsdWVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy52YWx1ZSA9PT0gdW5kZWZpbmVkIHx8IHRoaXMudmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMudmFsdWUgPSAnb24nOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKiogQHBvbHltZXJCZWhhdmlvciAqLwogICAgY29uc3QgSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3IgPSBbCiAgICAgIElyb25Gb3JtRWxlbWVudEJlaGF2aW9yLAogICAgICBJcm9uVmFsaWRhdGFibGVCZWhhdmlvciwKICAgICAgSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsCiAgICBdOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogYFBhcGVySW5reUZvY3VzQmVoYXZpb3JgIGltcGxlbWVudHMgYSByaXBwbGUgd2hlbiB0aGUgZWxlbWVudCBoYXMga2V5Ym9hcmQKICAgICAqIGZvY3VzLgogICAgICoKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IgUGFwZXJJbmt5Rm9jdXNCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBQYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbCA9IHsKICAgICAgb2JzZXJ2ZXJzOiBbJ19mb2N1c2VkQ2hhbmdlZChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSddLAoKICAgICAgX2ZvY3VzZWRDaGFuZ2VkOiBmdW5jdGlvbihyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSB7CiAgICAgICAgaWYgKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIHsKICAgICAgICAgIHRoaXMuZW5zdXJlUmlwcGxlKCk7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmhhc1JpcHBsZSgpKSB7CiAgICAgICAgICB0aGlzLl9yaXBwbGUuaG9sZERvd24gPSByZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9jcmVhdGVSaXBwbGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByaXBwbGUgPSBQYXBlclJpcHBsZUJlaGF2aW9yLl9jcmVhdGVSaXBwbGUoKTsKICAgICAgICByaXBwbGUuaWQgPSAnaW5rJzsKICAgICAgICByaXBwbGUuc2V0QXR0cmlidXRlKCdjZW50ZXInLCAnJyk7CiAgICAgICAgcmlwcGxlLmNsYXNzTGlzdC5hZGQoJ2NpcmNsZScpOwogICAgICAgIHJldHVybiByaXBwbGU7CiAgICAgIH0KICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IFBhcGVySW5reUZvY3VzQmVoYXZpb3IgPSBbCiAgICAgIElyb25CdXR0b25TdGF0ZSwKICAgICAgSXJvbkNvbnRyb2xTdGF0ZSwKICAgICAgUGFwZXJSaXBwbGVCZWhhdmlvciwKICAgICAgUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGwKICAgIF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBVc2UgYFBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvcmAgdG8gaW1wbGVtZW50IGEgY3VzdG9tIGVsZW1lbnQgdGhhdCBoYXMgYQogICAgICogYGNoZWNrZWRgIHByb3BlcnR5IHNpbWlsYXIgdG8gYElyb25DaGVja2VkRWxlbWVudEJlaGF2aW9yYCBhbmQgaXMgY29tcGF0aWJsZQogICAgICogd2l0aCBoYXZpbmcgYSByaXBwbGUgZWZmZWN0LgogICAgICogQHBvbHltZXJCZWhhdmlvciBQYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3IKICAgICAqLwogICAgY29uc3QgUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9ySW1wbCA9IHsKICAgICAgLyoqCiAgICAgICAqIFN5bmNocm9uaXplcyB0aGUgZWxlbWVudCdzIGNoZWNrZWQgc3RhdGUgd2l0aCBpdHMgcmlwcGxlIGVmZmVjdC4KICAgICAgICovCiAgICAgIF9jaGVja2VkQ2hhbmdlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3JJbXBsLl9jaGVja2VkQ2hhbmdlZC5jYWxsKHRoaXMpOwogICAgICAgIGlmICh0aGlzLmhhc1JpcHBsZSgpKSB7CiAgICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7CiAgICAgICAgICAgIHRoaXMuX3JpcHBsZS5zZXRBdHRyaWJ1dGUoJ2NoZWNrZWQnLCAnJyk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9yaXBwbGUucmVtb3ZlQXR0cmlidXRlKCdjaGVja2VkJyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFN5bmNocm9uaXplcyB0aGUgZWxlbWVudCdzIGBhY3RpdmVgIGFuZCBgY2hlY2tlZGAgc3RhdGUuCiAgICAgICAqLwogICAgICBfYnV0dG9uU3RhdGVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICBQYXBlclJpcHBsZUJlaGF2aW9yLl9idXR0b25TdGF0ZUNoYW5nZWQuY2FsbCh0aGlzKTsKICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aGlzLmNoZWNrZWQgPSB0aGlzLmFjdGl2ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IFBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvciA9IFsKICAgICAgUGFwZXJJbmt5Rm9jdXNCZWhhdmlvciwKICAgICAgSXJvbkNoZWNrZWRFbGVtZW50QmVoYXZpb3IsCiAgICAgIFBhcGVyQ2hlY2tlZEVsZW1lbnRCZWhhdmlvckltcGwKICAgIF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCB0ZW1wbGF0ZSQ5ID0gaHRtbGA8c3R5bGU+CiAgOmhvc3QgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1zaXplOiB2YXIoLS1wYXBlci1jaGVja2JveC1zaXplLCAxOHB4KTsKICAgIC8qIC0xcHggaXMgYSBzZW50aW5lbCBmb3IgdGhlIGRlZmF1bHQgYW5kIGlzIHJlcGxhY2VkIGluIFxgYXR0YWNoZWRcYC4gKi8KICAgIC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZTogdmFyKC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemUsIC0xcHgpOwogICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICB9CgogIDpob3N0KFtoaWRkZW5dKSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgfQoKICA6aG9zdCg6Zm9jdXMpIHsKICAgIG91dGxpbmU6IG5vbmU7CiAgfQoKICAuaGlkZGVuIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAjY2hlY2tib3hDb250YWluZXIgewogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBtaW4td2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSk7CiAgICBtYXJnaW46IHZhcigtLXBhcGVyLWNoZWNrYm94LW1hcmdpbiwgaW5pdGlhbCk7CiAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItY2hlY2tib3gtdmVydGljYWwtYWxpZ24sIG1pZGRsZSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtYmFja2dyb3VuZC1jb2xvciwgdHJhbnNwYXJlbnQpOwogIH0KCiAgI2luayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CgogICAgLyogQ2VudGVyIHRoZSByaXBwbGUgaW4gdGhlIGNoZWNrYm94IGJ5IG5lZ2F0aXZlIG9mZnNldHRpbmcgaXQgYnkKICAgICAqIChpbmtXaWR0aCAtIHJpcHBsZVdpZHRoKSAvIDIgKi8KICAgIHRvcDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgbGVmdDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtaW5rLXNpemUpOwogICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplKTsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogIH0KCiAgI2luazpkaXIocnRsKSB7CiAgICByaWdodDogY2FsYygwcHggLSAodmFyKC0tY2FsY3VsYXRlZC1wYXBlci1jaGVja2JveC1pbmstc2l6ZSkgLSB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKSAvIDIpOwogICAgbGVmdDogYXV0bzsKICB9CgogICNpbmtbY2hlY2tlZF0gewogICAgY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICAjY2hlY2tib3ggewogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIGhlaWdodDogMTAwJTsKICAgIGJvcmRlcjogc29saWQgMnB4OwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAtd2Via2l0LXRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKICAgIHRyYW5zaXRpb246IGJhY2tncm91bmQtY29sb3IgMTQwbXMsIGJvcmRlci1jb2xvciAxNDBtczsKCiAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLWNoZWNrYm94LWFuaW1hdGlvbi1kdXJhdGlvbiwgMTQwbXMpOwogICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgfQoKICAvKiBjaGVja2JveCBjaGVja2VkIGFuaW1hdGlvbnMgKi8KICAjY2hlY2tib3guY2hlY2tlZCAjY2hlY2ttYXJrIHsKICAgIC13ZWJraXQtYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwogICAgYW5pbWF0aW9uOiBjaGVja21hcmstZXhwYW5kIDE0MG1zIGVhc2Utb3V0IGZvcndhcmRzOwoKICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1jaGVja2JveC1hbmltYXRpb24tZHVyYXRpb24sIDE0MG1zKTsKICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItY2hlY2tib3gtYW5pbWF0aW9uLWR1cmF0aW9uLCAxNDBtcyk7CiAgfQoKICBALXdlYmtpdC1rZXlmcmFtZXMgY2hlY2ttYXJrLWV4cGFuZCB7CiAgICAwJSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgfQogICAgMTAwJSB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZSgxLCAxKSByb3RhdGUoNDVkZWcpOwogICAgfQogIH0KCiAgQGtleWZyYW1lcyBjaGVja21hcmstZXhwYW5kIHsKICAgIDAlIHsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLCAwKSByb3RhdGUoNDVkZWcpOwogICAgfQogICAgMTAwJSB7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSwgMSkgcm90YXRlKDQ1ZGVnKTsKICAgIH0KICB9CgogICNjaGVja2JveC5jaGVja2VkIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogIH0KCiAgI2NoZWNrbWFyayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB3aWR0aDogMzYlOwogICAgaGVpZ2h0OiA3MCU7CiAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgYm9yZGVyLXRvcDogbm9uZTsKICAgIGJvcmRlci1sZWZ0OiBub25lOwogICAgYm9yZGVyLXJpZ2h0LXdpZHRoOiBjYWxjKDIvMTUgKiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUpKTsKICAgIGJvcmRlci1ib3R0b20td2lkdGg6IGNhbGMoMi8xNSAqIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItY2hlY2tib3gtc2l6ZSkpOwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1jaGVja21hcmstY29sb3IsIHdoaXRlKTsKICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogOTclIDg2JTsKICAgIHRyYW5zZm9ybS1vcmlnaW46IDk3JSA4NiU7CiAgICBib3gtc2l6aW5nOiBjb250ZW50LWJveDsgLyogcHJvdGVjdCBhZ2FpbnN0IHBhZ2UtbGV2ZWwgYm94LXNpemluZyAqLwogIH0KCiAgI2NoZWNrbWFyazpkaXIocnRsKSB7CiAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IDUwJSAxNCU7CiAgICB0cmFuc2Zvcm0tb3JpZ2luOiA1MCUgMTQlOwogIH0KCiAgLyogbGFiZWwgKi8KICAjY2hlY2tib3hMYWJlbCB7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgcGFkZGluZy1sZWZ0OiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgIGxpbmUtaGVpZ2h0OiBub3JtYWw7CiAgICBjb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWw7CiAgfQoKICA6aG9zdChbY2hlY2tlZF0pICNjaGVja2JveExhYmVsIHsKICAgIGNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkLWNvbG9yLCB2YXIoLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSkpOwogICAgQGFwcGx5IC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZDsKICB9CgogICNjaGVja2JveExhYmVsOmRpcihydGwpIHsKICAgIHBhZGRpbmctcmlnaHQ6IHZhcigtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmcsIDhweCk7CiAgICBwYWRkaW5nLWxlZnQ6IDA7CiAgfQoKICAjY2hlY2tib3hMYWJlbFtoaWRkZW5dIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3ggewogICAgb3BhY2l0eTogMC41OwogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogIH0KCiAgOmhvc3QoW2Rpc2FibGVkXVtjaGVja2VkXSkgI2NoZWNrYm94IHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBvcGFjaXR5OiAwLjU7CiAgfQoKICA6aG9zdChbZGlzYWJsZWRdKSAjY2hlY2tib3hMYWJlbCAgewogICAgb3BhY2l0eTogMC42NTsKICB9CgogIC8qIGludmFsaWQgc3RhdGUgKi8KICAjY2hlY2tib3guaW52YWxpZDpub3QoLmNoZWNrZWQpIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItY2hlY2tib3gtZXJyb3ItY29sb3IsIHZhcigtLWVycm9yLWNvbG9yKSk7CiAgfQo8L3N0eWxlPgoKPGRpdiBpZD0iY2hlY2tib3hDb250YWluZXIiPgogIDxkaXYgaWQ9ImNoZWNrYm94IiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja2JveENsYXNzKGNoZWNrZWQsIGludmFsaWQpXV0iPgogICAgPGRpdiBpZD0iY2hlY2ttYXJrIiBjbGFzcyQ9IltbX2NvbXB1dGVDaGVja21hcmtDbGFzcyhjaGVja2VkKV1dIj48L2Rpdj4KICA8L2Rpdj4KPC9kaXY+Cgo8ZGl2IGlkPSJjaGVja2JveExhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+YDsKICAgIHRlbXBsYXRlJDkuc2V0QXR0cmlidXRlKCdzdHJpcC13aGl0ZXNwYWNlJywgJycpOwoKICAgIC8qKgogICAgTWF0ZXJpYWwgZGVzaWduOgogICAgW0NoZWNrYm94XShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvc2VsZWN0aW9uLWNvbnRyb2xzLmh0bWwjc2VsZWN0aW9uLWNvbnRyb2xzLWNoZWNrYm94KQoKICAgIGBwYXBlci1jaGVja2JveGAgaXMgYSBidXR0b24gdGhhdCBjYW4gYmUgZWl0aGVyIGNoZWNrZWQgb3IgdW5jaGVja2VkLiBVc2VyIGNhbgogICAgdGFwIHRoZSBjaGVja2JveCB0byBjaGVjayBvciB1bmNoZWNrIGl0LiBVc3VhbGx5IHlvdSB1c2UgY2hlY2tib3hlcyB0byBhbGxvdwogICAgdXNlciB0byBzZWxlY3QgbXVsdGlwbGUgb3B0aW9ucyBmcm9tIGEgc2V0LiBJZiB5b3UgaGF2ZSBhIHNpbmdsZSBPTi9PRkYgb3B0aW9uLAogICAgYXZvaWQgdXNpbmcgYSBzaW5nbGUgY2hlY2tib3ggYW5kIHVzZSBgcGFwZXItdG9nZ2xlLWJ1dHRvbmAgaW5zdGVhZC4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItY2hlY2tib3g+bGFiZWw8L3BhcGVyLWNoZWNrYm94PgoKICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD4gbGFiZWw8L3BhcGVyLWNoZWNrYm94PgoKICAgICMjIyBTdHlsaW5nCgogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3JgIHwgQ2hlY2tib3ggYmFja2dyb3VuZCBjb2xvciB3aGVuIHRoZSBpbnB1dCBpcyBub3QgY2hlY2tlZCB8IGB0cmFuc3BhcmVudGAKICAgIGAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcmAgfCBDaGVja2JveCBib3JkZXIgY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgbm90IGNoZWNrZWQgfCBgLS1wcmltYXJ5LXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yYCB8IFNlbGVjdGVkL2ZvY3VzIHJpcHBsZSBjb2xvciB3aGVuIHRoZSBpbnB1dCBpcyBub3QgY2hlY2tlZCB8IGAtLXByaW1hcnktdGV4dC1jb2xvcmAKICAgIGAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3JgIHwgQ2hlY2tib3ggY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgY2hlY2tlZCB8IGAtLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcmAgfCBTZWxlY3RlZC9mb2N1cyByaXBwbGUgY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgY2hlY2tlZCB8IGAtLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci1jaGVja2JveC1jaGVja21hcmstY29sb3JgIHwgQ2hlY2ttYXJrIGNvbG9yIHwgYHdoaXRlYAogICAgYC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY29sb3JgIHwgTGFiZWwgY29sb3IgfCBgLS1wcmltYXJ5LXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jaGVja2VkLWNvbG9yYCB8IExhYmVsIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGNoZWNrZWQgfCBgLS1wYXBlci1jaGVja2JveC1sYWJlbC1jb2xvcmAKICAgIGAtLXBhcGVyLWNoZWNrYm94LWxhYmVsLXNwYWNpbmdgIHwgU3BhY2luZyBiZXR3ZWVuIHRoZSBsYWJlbCBhbmQgdGhlIGNoZWNrYm94IHwgYDhweGAKICAgIGAtLXBhcGVyLWNoZWNrYm94LWxhYmVsYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGxhYmVsIHwgYHt9YAogICAgYC0tcGFwZXItY2hlY2tib3gtbGFiZWwtY2hlY2tlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBsYWJlbCB3aGVuIHRoZSBpbnB1dCBpcyBjaGVja2VkIHwgYHt9YAogICAgYC0tcGFwZXItY2hlY2tib3gtZXJyb3ItY29sb3JgIHwgQ2hlY2tib3ggY29sb3Igd2hlbiBpbnZhbGlkIHwgYC0tZXJyb3ItY29sb3JgCiAgICBgLS1wYXBlci1jaGVja2JveC1zaXplYCB8IFNpemUgb2YgdGhlIGNoZWNrYm94IHwgYDE4cHhgCiAgICBgLS1wYXBlci1jaGVja2JveC1pbmstc2l6ZWAgfCBTaXplIG9mIHRoZSByaXBwbGUgfCBgNDhweGAKICAgIGAtLXBhcGVyLWNoZWNrYm94LW1hcmdpbmAgfCBNYXJnaW4gYXJvdW5kIHRoZSBjaGVja2JveCBjb250YWluZXIgfCBgaW5pdGlhbGAKICAgIGAtLXBhcGVyLWNoZWNrYm94LXZlcnRpY2FsLWFsaWduYCB8IFZlcnRpY2FsIGFsaWdubWVudCBvZiB0aGUgY2hlY2tib3ggY29udGFpbmVyIHwgYG1pZGRsZWAKCiAgICBUaGlzIGVsZW1lbnQgYXBwbGllcyB0aGUgbWl4aW4gYC0tcGFwZXItZm9udC1jb21tb24tYmFzZWAgYnV0IGRvZXMgbm90IGltcG9ydAogICAgYHBhcGVyLXN0eWxlcy90eXBvZ3JhcGh5Lmh0bWxgLiBJbiBvcmRlciB0byBhcHBseSB0aGUgYFJvYm90b2AgZm9udCB0byB0aGlzCiAgICBlbGVtZW50LCBtYWtlIHN1cmUgeW91J3ZlIGltcG9ydGVkIGBwYXBlci1zdHlsZXMvdHlwb2dyYXBoeS5odG1sYC4KCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiB0ZW1wbGF0ZSQ5LAoKICAgICAgaXM6ICdwYXBlci1jaGVja2JveCcsCgogICAgICBiZWhhdmlvcnM6IFtQYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7cm9sZTogJ2NoZWNrYm94JywgJ2FyaWEtY2hlY2tlZCc6IGZhbHNlLCB0YWJpbmRleDogMH0sCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzIGR1ZSB0byB1c2VyIGludGVyYWN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGNoYW5nZQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBjaGVja2VkIHN0YXRlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXZlbnQgaXJvbi1jaGFuZ2UKICAgICAgICAgKi8KICAgICAgICBhcmlhQWN0aXZlQXR0cmlidXRlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ2FyaWEtY2hlY2tlZCd9CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gV2FpdCB1bnRpbCBzdHlsZXMgaGF2ZSByZXNvbHZlZCB0byBjaGVjayBmb3IgdGhlIGRlZmF1bHQgc2VudGluZWwuCiAgICAgICAgLy8gU2VlIHBvbHltZXIjNDAwOSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIGFmdGVyTmV4dFJlbmRlcih0aGlzLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBpbmtTaXplID0KICAgICAgICAgICAgICB0aGlzLmdldENvbXB1dGVkU3R5bGVWYWx1ZSgnLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LWluay1zaXplJykKICAgICAgICAgICAgICAgICAgLnRyaW0oKTsKICAgICAgICAgIC8vIElmIHVuc2V0LCBjb21wdXRlIGFuZCBzZXQgdGhlIGRlZmF1bHQgYC0tcGFwZXItY2hlY2tib3gtaW5rLXNpemVgLgogICAgICAgICAgaWYgKGlua1NpemUgPT09ICctMXB4JykgewogICAgICAgICAgICB2YXIgY2hlY2tib3hTaXplVGV4dCA9CiAgICAgICAgICAgICAgICB0aGlzLmdldENvbXB1dGVkU3R5bGVWYWx1ZSgnLS1jYWxjdWxhdGVkLXBhcGVyLWNoZWNrYm94LXNpemUnKQogICAgICAgICAgICAgICAgICAgIC50cmltKCk7CgogICAgICAgICAgICB2YXIgdW5pdHMgPSAncHgnOwogICAgICAgICAgICB2YXIgdW5pdHNNYXRjaGVzID0gY2hlY2tib3hTaXplVGV4dC5tYXRjaCgvW0EtWmEtel0rJC8pOwogICAgICAgICAgICBpZiAodW5pdHNNYXRjaGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgdW5pdHMgPSB1bml0c01hdGNoZXNbMF07CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHZhciBjaGVja2JveFNpemUgPSBwYXJzZUZsb2F0KGNoZWNrYm94U2l6ZVRleHQpOwogICAgICAgICAgICB2YXIgZGVmYXVsdElua1NpemUgPSAoOCAvIDMpICogY2hlY2tib3hTaXplOwoKICAgICAgICAgICAgaWYgKHVuaXRzID09PSAncHgnKSB7CiAgICAgICAgICAgICAgZGVmYXVsdElua1NpemUgPSBNYXRoLmZsb29yKGRlZmF1bHRJbmtTaXplKTsKCiAgICAgICAgICAgICAgLy8gVGhlIGNoZWNrYm94IGFuZCByaXBwbGUgbmVlZCB0byBoYXZlIHRoZSBzYW1lIHBhcml0eSBzbyB0aGF0IHRoZWlyCiAgICAgICAgICAgICAgLy8gY2VudGVycyBhbGlnbi4KICAgICAgICAgICAgICBpZiAoZGVmYXVsdElua1NpemUgJSAyICE9PSBjaGVja2JveFNpemUgJSAyKSB7CiAgICAgICAgICAgICAgICBkZWZhdWx0SW5rU2l6ZSsrOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQoKICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoewogICAgICAgICAgICAgICctLXBhcGVyLWNoZWNrYm94LWluay1zaXplJzogZGVmYXVsdElua1NpemUgKyB1bml0cywKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICBfY29tcHV0ZUNoZWNrYm94Q2xhc3M6IGZ1bmN0aW9uKGNoZWNrZWQsIGludmFsaWQpIHsKICAgICAgICB2YXIgY2xhc3NOYW1lID0gJyc7CiAgICAgICAgaWYgKGNoZWNrZWQpIHsKICAgICAgICAgIGNsYXNzTmFtZSArPSAnY2hlY2tlZCAnOwogICAgICAgIH0KICAgICAgICBpZiAoaW52YWxpZCkgewogICAgICAgICAgY2xhc3NOYW1lICs9ICdpbnZhbGlkJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKICAgICAgfSwKCiAgICAgIF9jb21wdXRlQ2hlY2ttYXJrQ2xhc3M6IGZ1bmN0aW9uKGNoZWNrZWQpIHsKICAgICAgICByZXR1cm4gY2hlY2tlZCA/ICcnIDogJ2hpZGRlbic7CiAgICAgIH0sCgogICAgICAvLyBjcmVhdGUgcmlwcGxlIGluc2lkZSB0aGUgY2hlY2tib3hDb250YWluZXIKICAgICAgX2NyZWF0ZVJpcHBsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcmlwcGxlQ29udGFpbmVyID0gdGhpcy4kLmNoZWNrYm94Q29udGFpbmVyOwogICAgICAgIHJldHVybiBQYXBlcklua3lGb2N1c0JlaGF2aW9ySW1wbC5fY3JlYXRlUmlwcGxlLmNhbGwodGhpcyk7CiAgICAgIH0KCiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgIGBQb2x5bWVyLklyb25GaXRCZWhhdmlvcmAgZml0cyBhbiBlbGVtZW50IGluIGFub3RoZXIgZWxlbWVudCB1c2luZyBgbWF4LWhlaWdodGAKICAgIGFuZCBgbWF4LXdpZHRoYCwgYW5kIG9wdGlvbmFsbHkgY2VudGVycyBpdCBpbiB0aGUgd2luZG93IG9yIGFub3RoZXIgZWxlbWVudC4KCiAgICBUaGUgZWxlbWVudCB3aWxsIG9ubHkgYmUgc2l6ZWQgYW5kL29yIHBvc2l0aW9uZWQgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4KICAgIHNpemVkIGFuZC9vciBwb3NpdGlvbmVkIGJ5IENTUy4KCiAgICBDU1MgcHJvcGVydGllcyAgICAgICAgICAgIHwgQWN0aW9uCiAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICBgcG9zaXRpb25gIHNldCAgICAgICAgICAgIHwgRWxlbWVudCBpcyBub3QgY2VudGVyZWQgaG9yaXpvbnRhbGx5IG9yIHZlcnRpY2FsbHkKICAgIGB0b3BgIG9yIGBib3R0b21gIHNldCAgICAgfCBFbGVtZW50IGlzIG5vdCB2ZXJ0aWNhbGx5IGNlbnRlcmVkCiAgICBgbGVmdGAgb3IgYHJpZ2h0YCBzZXQgICAgIHwgRWxlbWVudCBpcyBub3QgaG9yaXpvbnRhbGx5IGNlbnRlcmVkCiAgICBgbWF4LWhlaWdodGAgc2V0ICAgICAgICAgIHwgRWxlbWVudCByZXNwZWN0cyBgbWF4LWhlaWdodGAKICAgIGBtYXgtd2lkdGhgIHNldCAgICAgICAgICAgfCBFbGVtZW50IHJlc3BlY3RzIGBtYXgtd2lkdGhgCgogICAgYFBvbHltZXIuSXJvbkZpdEJlaGF2aW9yYCBjYW4gcG9zaXRpb24gYW4gZWxlbWVudCBpbnRvIGFub3RoZXIgZWxlbWVudCB1c2luZwogICAgYHZlcnRpY2FsQWxpZ25gIGFuZCBgaG9yaXpvbnRhbEFsaWduYC4gVGhpcyB3aWxsIG92ZXJyaWRlIHRoZSBlbGVtZW50J3MgY3NzCiAgICBwb3NpdGlvbi4KCiAgICAgICAgPGRpdiBjbGFzcz0iY29udGFpbmVyIj4KICAgICAgICAgIDxpcm9uLWZpdC1pbXBsIHZlcnRpY2FsLWFsaWduPSJ0b3AiIGhvcml6b250YWwtYWxpZ249ImF1dG8iPgogICAgICAgICAgICBQb3NpdGlvbmVkIGludG8gdGhlIGNvbnRhaW5lcgogICAgICAgICAgPC9pcm9uLWZpdC1pbXBsPgogICAgICAgIDwvZGl2PgoKICAgIFVzZSBgbm9PdmVybGFwYCB0byBwb3NpdGlvbiB0aGUgZWxlbWVudCBhcm91bmQgYW5vdGhlciBlbGVtZW50IHdpdGhvdXQKICAgIG92ZXJsYXBwaW5nIGl0LgoKICAgICAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICAgICAgPGlyb24tZml0LWltcGwgbm8tb3ZlcmxhcCB2ZXJ0aWNhbC1hbGlnbj0iYXV0byIgaG9yaXpvbnRhbC1hbGlnbj0iYXV0byI+CiAgICAgICAgICAgIFBvc2l0aW9uZWQgYXJvdW5kIHRoZSBjb250YWluZXIKICAgICAgICAgIDwvaXJvbi1maXQtaW1wbD4KICAgICAgICA8L2Rpdj4KCiAgICBVc2UgYGhvcml6b250YWxPZmZzZXQsIHZlcnRpY2FsT2Zmc2V0YCB0byBvZmZzZXQgdGhlIGVsZW1lbnQgZnJvbSBpdHMKICAgIGBwb3NpdGlvblRhcmdldGA7IGBQb2x5bWVyLklyb25GaXRCZWhhdmlvcmAgd2lsbCBjb2xsYXBzZSB0aGVzZSBpbiBvcmRlciB0bwogICAga2VlcCB0aGUgZWxlbWVudCB3aXRoaW4gYGZpdEludG9gIGJvdW5kYXJpZXMsIHdoaWxlIHByZXNlcnZpbmcgdGhlIGVsZW1lbnQncwogICAgQ1NTIG1hcmdpbiB2YWx1ZXMuCgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgICAgICA8aXJvbi1maXQtaW1wbCB2ZXJ0aWNhbC1hbGlnbj0idG9wIiB2ZXJ0aWNhbC1vZmZzZXQ9IjIwIj4KICAgICAgICAgICAgV2l0aCB2ZXJ0aWNhbCBvZmZzZXQKICAgICAgICAgIDwvaXJvbi1maXQtaW1wbD4KICAgICAgICA8L2Rpdj4KCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgIEBwb2x5bWVyQmVoYXZpb3IKICAgICovCiAgICBjb25zdCBJcm9uRml0QmVoYXZpb3IgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBlbGVtZW50IHRoYXQgd2lsbCByZWNlaXZlIGEgYG1heC1oZWlnaHRgL2B3aWR0aGAuIEJ5IGRlZmF1bHQgaXQgaXMKICAgICAgICAgKiB0aGUgc2FtZSBhcyBgdGhpc2AsIGJ1dCBpdCBjYW4gYmUgc2V0IHRvIGEgY2hpbGQgZWxlbWVudC4gVGhpcyBpcyB1c2VmdWwsCiAgICAgICAgICogZm9yIGV4YW1wbGUsIGZvciBpbXBsZW1lbnRpbmcgYSBzY3JvbGxpbmcgcmVnaW9uIGluc2lkZSB0aGUgZWxlbWVudC4KICAgICAgICAgKiBAdHlwZSB7IUVsZW1lbnR9CiAgICAgICAgICovCiAgICAgICAgc2l6aW5nVGFyZ2V0OiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBlbGVtZW50IHRvIGZpdCBgdGhpc2AgaW50by4KICAgICAgICAgKi8KICAgICAgICBmaXRJbnRvOiB7dHlwZTogT2JqZWN0LCB2YWx1ZTogd2luZG93fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2lsbCBwb3NpdGlvbiB0aGUgZWxlbWVudCBhcm91bmQgdGhlIHBvc2l0aW9uVGFyZ2V0IHdpdGhvdXQgb3ZlcmxhcHBpbmcKICAgICAgICAgKiBpdC4KICAgICAgICAgKi8KICAgICAgICBub092ZXJsYXA6IHt0eXBlOiBCb29sZWFufSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVsZW1lbnQgdGhhdCBzaG91bGQgYmUgdXNlZCB0byBwb3NpdGlvbiB0aGUgZWxlbWVudC4gSWYgbm90IHNldCwgaXQKICAgICAgICAgKiB3aWxsIGRlZmF1bHQgdG8gdGhlIHBhcmVudCBub2RlLgogICAgICAgICAqIEB0eXBlIHshRWxlbWVudH0KICAgICAgICAgKi8KICAgICAgICBwb3NpdGlvblRhcmdldDoge3R5cGU6IEVsZW1lbnR9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3JpZW50YXRpb24gYWdhaW5zdCB3aGljaCB0byBhbGlnbiB0aGUgZWxlbWVudCBob3Jpem9udGFsbHkKICAgICAgICAgKiByZWxhdGl2ZSB0byB0aGUgYHBvc2l0aW9uVGFyZ2V0YC4gUG9zc2libGUgdmFsdWVzIGFyZSAibGVmdCIsICJyaWdodCIsCiAgICAgICAgICogImNlbnRlciIsICJhdXRvIi4KICAgICAgICAgKi8KICAgICAgICBob3Jpem9udGFsQWxpZ246IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3JpZW50YXRpb24gYWdhaW5zdCB3aGljaCB0byBhbGlnbiB0aGUgZWxlbWVudCB2ZXJ0aWNhbGx5CiAgICAgICAgICogcmVsYXRpdmUgdG8gdGhlIGBwb3NpdGlvblRhcmdldGAuIFBvc3NpYmxlIHZhbHVlcyBhcmUgInRvcCIsICJib3R0b20iLAogICAgICAgICAqICJtaWRkbGUiLCAiYXV0byIuCiAgICAgICAgICovCiAgICAgICAgdmVydGljYWxBbGlnbjoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIGl0IHdpbGwgdXNlIGBob3Jpem9udGFsQWxpZ25gIGFuZCBgdmVydGljYWxBbGlnbmAgdmFsdWVzIGFzCiAgICAgICAgICogcHJlZmVycmVkIGFsaWdubWVudCBhbmQgaWYgdGhlcmUncyBub3QgZW5vdWdoIHNwYWNlLCBpdCB3aWxsIHBpY2sgdGhlCiAgICAgICAgICogdmFsdWVzIHdoaWNoIG1pbmltaXplIHRoZSBjcm9wcGluZy4KICAgICAgICAgKi8KICAgICAgICBkeW5hbWljQWxpZ246IHt0eXBlOiBCb29sZWFufSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCB2YWx1ZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBvc2l0aW9uIGNhbGN1bGF0ZWQgZm9yIHRoZQogICAgICAgICAqIGdpdmVuIGBob3Jpem9udGFsQWxpZ25gLCBpbiB0aGUgZGlyZWN0aW9uIG9mIGFsaWdubWVudC4gWW91IGNhbiB0aGluawogICAgICAgICAqIG9mIGl0IGFzIGluY3JlYXNpbmcgb3IgZGVjcmVhc2luZyB0aGUgZGlzdGFuY2UgdG8gdGhlIHNpZGUgb2YgdGhlCiAgICAgICAgICogc2NyZWVuIGdpdmVuIGJ5IGBob3Jpem9udGFsQWxpZ25gLgogICAgICAgICAqCiAgICAgICAgICogSWYgYGhvcml6b250YWxBbGlnbmAgaXMgImxlZnQiIG9yICJjZW50ZXIiLCB0aGlzIG9mZnNldCB3aWxsIGluY3JlYXNlIG9yCiAgICAgICAgICogZGVjcmVhc2UgdGhlIGRpc3RhbmNlIHRvIHRoZSBsZWZ0IHNpZGUgb2YgdGhlIHNjcmVlbjogYSBuZWdhdGl2ZSBvZmZzZXQKICAgICAgICAgKiB3aWxsIG1vdmUgdGhlIGRyb3Bkb3duIHRvIHRoZSBsZWZ0OyBhIHBvc2l0aXZlIG9uZSwgdG8gdGhlIHJpZ2h0LgogICAgICAgICAqCiAgICAgICAgICogQ29udmVyc2VseSBpZiBgaG9yaXpvbnRhbEFsaWduYCBpcyAicmlnaHQiLCB0aGlzIG9mZnNldCB3aWxsIGluY3JlYXNlCiAgICAgICAgICogb3IgZGVjcmVhc2UgdGhlIGRpc3RhbmNlIHRvIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzY3JlZW46IGEgbmVnYXRpdmUKICAgICAgICAgKiBvZmZzZXQgd2lsbCBtb3ZlIHRoZSBkcm9wZG93biB0byB0aGUgcmlnaHQ7IGEgcG9zaXRpdmUgb25lLCB0byB0aGUgbGVmdC4KICAgICAgICAgKi8KICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiB7dHlwZTogTnVtYmVyLCB2YWx1ZTogMCwgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCB2YWx1ZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBvc2l0aW9uIGNhbGN1bGF0ZWQgZm9yIHRoZQogICAgICAgICAqIGdpdmVuIGB2ZXJ0aWNhbEFsaWduYCwgaW4gdGhlIGRpcmVjdGlvbiBvZiBhbGlnbm1lbnQuIFlvdSBjYW4gdGhpbmsKICAgICAgICAgKiBvZiBpdCBhcyBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcgdGhlIGRpc3RhbmNlIHRvIHRoZSBzaWRlIG9mIHRoZQogICAgICAgICAqIHNjcmVlbiBnaXZlbiBieSBgdmVydGljYWxBbGlnbmAuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBgdmVydGljYWxBbGlnbmAgaXMgInRvcCIgb3IgIm1pZGRsZSIsIHRoaXMgb2Zmc2V0IHdpbGwgaW5jcmVhc2Ugb3IKICAgICAgICAgKiBkZWNyZWFzZSB0aGUgZGlzdGFuY2UgdG8gdGhlIHRvcCBzaWRlIG9mIHRoZSBzY3JlZW46IGEgbmVnYXRpdmUgb2Zmc2V0CiAgICAgICAgICogd2lsbCBtb3ZlIHRoZSBkcm9wZG93biB1cHdhcmRzOyBhIHBvc2l0aXZlIG9uZSwgZG93bndhcmRzLgogICAgICAgICAqCiAgICAgICAgICogQ29udmVyc2VseSBpZiBgdmVydGljYWxBbGlnbmAgaXMgImJvdHRvbSIsIHRoaXMgb2Zmc2V0IHdpbGwgaW5jcmVhc2UKICAgICAgICAgKiBvciBkZWNyZWFzZSB0aGUgZGlzdGFuY2UgdG8gdGhlIGJvdHRvbSBzaWRlIG9mIHRoZSBzY3JlZW46IGEgbmVnYXRpdmUKICAgICAgICAgKiBvZmZzZXQgd2lsbCBtb3ZlIHRoZSBkcm9wZG93biBkb3dud2FyZHM7IGEgcG9zaXRpdmUgb25lLCB1cHdhcmRzLgogICAgICAgICAqLwogICAgICAgIHZlcnRpY2FsT2Zmc2V0OiB7dHlwZTogTnVtYmVyLCB2YWx1ZTogMCwgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gYXV0by1maXQgb24gYXR0YWNoLgogICAgICAgICAqLwogICAgICAgIGF1dG9GaXRPbkF0dGFjaDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKiBAdHlwZSB7P09iamVjdH0gKi8KICAgICAgICBfZml0SW5mbzoge3R5cGU6IE9iamVjdH0KICAgICAgfSwKCiAgICAgIGdldCBfZml0V2lkdGgoKSB7CiAgICAgICAgdmFyIGZpdFdpZHRoOwogICAgICAgIGlmICh0aGlzLmZpdEludG8gPT09IHdpbmRvdykgewogICAgICAgICAgZml0V2lkdGggPSB0aGlzLmZpdEludG8uaW5uZXJXaWR0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZml0V2lkdGggPSB0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmaXRXaWR0aDsKICAgICAgfSwKCiAgICAgIGdldCBfZml0SGVpZ2h0KCkgewogICAgICAgIHZhciBmaXRIZWlnaHQ7CiAgICAgICAgaWYgKHRoaXMuZml0SW50byA9PT0gd2luZG93KSB7CiAgICAgICAgICBmaXRIZWlnaHQgPSB0aGlzLmZpdEludG8uaW5uZXJIZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGZpdEhlaWdodCA9IHRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmaXRIZWlnaHQ7CiAgICAgIH0sCgogICAgICBnZXQgX2ZpdExlZnQoKSB7CiAgICAgICAgdmFyIGZpdExlZnQ7CiAgICAgICAgaWYgKHRoaXMuZml0SW50byA9PT0gd2luZG93KSB7CiAgICAgICAgICBmaXRMZWZ0ID0gMDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZml0TGVmdCA9IHRoaXMuZml0SW50by5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZml0TGVmdDsKICAgICAgfSwKCiAgICAgIGdldCBfZml0VG9wKCkgewogICAgICAgIHZhciBmaXRUb3A7CiAgICAgICAgaWYgKHRoaXMuZml0SW50byA9PT0gd2luZG93KSB7CiAgICAgICAgICBmaXRUb3AgPSAwOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBmaXRUb3AgPSB0aGlzLmZpdEludG8uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZml0VG9wOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBlbGVtZW50IHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gcG9zaXRpb24gdGhlIGVsZW1lbnQsCiAgICAgICAqIGlmIG5vIHBvc2l0aW9uIHRhcmdldCBpcyBjb25maWd1cmVkLgogICAgICAgKi8KICAgICAgZ2V0IF9kZWZhdWx0UG9zaXRpb25UYXJnZXQoKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IGRvbSh0aGlzKS5wYXJlbnROb2RlOwoKICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC5ub2RlVHlwZSA9PT0gTm9kZS5ET0NVTUVOVF9GUkFHTUVOVF9OT0RFKSB7CiAgICAgICAgICBwYXJlbnQgPSBwYXJlbnQuaG9zdDsKICAgICAgICB9CgogICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhlIGhvcml6b250YWwgYWxpZ24gdmFsdWUsIGFjY291bnRpbmcgZm9yIHRoZSBSVEwvTFRSIHRleHQgZGlyZWN0aW9uLgogICAgICAgKi8KICAgICAgZ2V0IF9sb2NhbGVIb3Jpem9udGFsQWxpZ24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzUlRMKSB7CiAgICAgICAgICAvLyBJbiBSVEwsICJsZWZ0IiBiZWNvbWVzICJyaWdodCIuCiAgICAgICAgICBpZiAodGhpcy5ob3Jpem9udGFsQWxpZ24gPT09ICdyaWdodCcpIHsKICAgICAgICAgICAgcmV0dXJuICdsZWZ0JzsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh0aGlzLmhvcml6b250YWxBbGlnbiA9PT0gJ2xlZnQnKSB7CiAgICAgICAgICAgIHJldHVybiAncmlnaHQnOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5ob3Jpem9udGFsQWxpZ247CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVHJ1ZSBpZiB0aGUgZWxlbWVudCBzaG91bGQgYmUgcG9zaXRpb25lZCBpbnN0ZWFkIG9mIGNlbnRlcmVkLgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgZ2V0IF9fc2hvdWxkUG9zaXRpb24oKSB7CiAgICAgICAgcmV0dXJuICh0aGlzLmhvcml6b250YWxBbGlnbiB8fCB0aGlzLnZlcnRpY2FsQWxpZ24pICYmIHRoaXMucG9zaXRpb25UYXJnZXQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVHJ1ZSBpZiB0aGUgY29tcG9uZW50IGlzIFJUTC4KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIGdldCBfaXNSVEwoKSB7CiAgICAgICAgLy8gTWVtb2l6ZSB0aGlzIHRvIGF2b2lkIGV4cGVuc2l2ZSBjYWxjdWxhdGlvbnMgJiByZWxheW91dHMuCiAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGRvIGl0IG9ubHkgb25jZQogICAgICAgIGlmICh0eXBlb2YgdGhpcy5fbWVtb2l6ZWRJc1JUTCA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgIHRoaXMuX21lbW9pemVkSXNSVEwgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKS5kaXJlY3Rpb24gPT0gJ3J0bCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9tZW1vaXplZElzUlRMOwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5wb3NpdGlvblRhcmdldCA9IHRoaXMucG9zaXRpb25UYXJnZXQgfHwgdGhpcy5fZGVmYXVsdFBvc2l0aW9uVGFyZ2V0OwogICAgICAgIGlmICh0aGlzLmF1dG9GaXRPbkF0dGFjaCkgewogICAgICAgICAgaWYgKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHRoaXMuZml0KCk7CiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvLyBOT1RFOiBzaGFkeWRvbSBhcHBsaWVzIGRpc3RyaWJ1dGlvbiBhc3luY2hyb25vdXNseQogICAgICAgICAgICAvLyBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZWJjb21wb25lbnRzL3NoYWR5ZG9tIzEyMAogICAgICAgICAgICAvLyBGbHVzaCB0byBnZXQgY29ycmVjdCBsYXlvdXQgaW5mby4KICAgICAgICAgICAgd2luZG93LlNoYWR5RE9NICYmIFNoYWR5RE9NLmZsdXNoKCk7CiAgICAgICAgICAgIHRoaXMuZml0KCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX19kZWZlcnJlZEZpdCkgewogICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX19kZWZlcnJlZEZpdCk7CiAgICAgICAgICB0aGlzLl9fZGVmZXJyZWRGaXQgPSBudWxsOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBQb3NpdGlvbnMgYW5kIGZpdHMgdGhlIGVsZW1lbnQgaW50byB0aGUgYGZpdEludG9gIGVsZW1lbnQuCiAgICAgICAqLwogICAgICBmaXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucG9zaXRpb24oKTsKICAgICAgICB0aGlzLmNvbnN0cmFpbigpOwogICAgICAgIHRoaXMuY2VudGVyKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogTWVtb2l6ZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcG9zaXRpb24gYW5kIHNpemUgdGhlIHRhcmdldCBlbGVtZW50LgogICAgICAgKiBAc3VwcHJlc3Mge2RlcHJlY2F0ZWR9CiAgICAgICAqLwogICAgICBfZGlzY292ZXJJbmZvOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fZml0SW5mbykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgdGFyZ2V0ID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7CiAgICAgICAgdmFyIHNpemVyID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcy5zaXppbmdUYXJnZXQpOwoKICAgICAgICB0aGlzLl9maXRJbmZvID0gewogICAgICAgICAgaW5saW5lU3R5bGU6IHsKICAgICAgICAgICAgdG9wOiB0aGlzLnN0eWxlLnRvcCB8fCAnJywKICAgICAgICAgICAgbGVmdDogdGhpcy5zdHlsZS5sZWZ0IHx8ICcnLAogICAgICAgICAgICBwb3NpdGlvbjogdGhpcy5zdHlsZS5wb3NpdGlvbiB8fCAnJwogICAgICAgICAgfSwKICAgICAgICAgIHNpemVySW5saW5lU3R5bGU6IHsKICAgICAgICAgICAgbWF4V2lkdGg6IHRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heFdpZHRoIHx8ICcnLAogICAgICAgICAgICBtYXhIZWlnaHQ6IHRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLm1heEhlaWdodCB8fCAnJywKICAgICAgICAgICAgYm94U2l6aW5nOiB0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmcgfHwgJycKICAgICAgICAgIH0sCiAgICAgICAgICBwb3NpdGlvbmVkQnk6IHsKICAgICAgICAgICAgdmVydGljYWxseTogdGFyZ2V0LnRvcCAhPT0gJ2F1dG8nID8KICAgICAgICAgICAgICAgICd0b3AnIDoKICAgICAgICAgICAgICAgICh0YXJnZXQuYm90dG9tICE9PSAnYXV0bycgPyAnYm90dG9tJyA6IG51bGwpLAogICAgICAgICAgICBob3Jpem9udGFsbHk6IHRhcmdldC5sZWZ0ICE9PSAnYXV0bycgPwogICAgICAgICAgICAgICAgJ2xlZnQnIDoKICAgICAgICAgICAgICAgICh0YXJnZXQucmlnaHQgIT09ICdhdXRvJyA/ICdyaWdodCcgOiBudWxsKQogICAgICAgICAgfSwKICAgICAgICAgIHNpemVkQnk6IHsKICAgICAgICAgICAgaGVpZ2h0OiBzaXplci5tYXhIZWlnaHQgIT09ICdub25lJywKICAgICAgICAgICAgd2lkdGg6IHNpemVyLm1heFdpZHRoICE9PSAnbm9uZScsCiAgICAgICAgICAgIG1pbldpZHRoOiBwYXJzZUludChzaXplci5taW5XaWR0aCwgMTApIHx8IDAsCiAgICAgICAgICAgIG1pbkhlaWdodDogcGFyc2VJbnQoc2l6ZXIubWluSGVpZ2h0LCAxMCkgfHwgMAogICAgICAgICAgfSwKICAgICAgICAgIG1hcmdpbjogewogICAgICAgICAgICB0b3A6IHBhcnNlSW50KHRhcmdldC5tYXJnaW5Ub3AsIDEwKSB8fCAwLAogICAgICAgICAgICByaWdodDogcGFyc2VJbnQodGFyZ2V0Lm1hcmdpblJpZ2h0LCAxMCkgfHwgMCwKICAgICAgICAgICAgYm90dG9tOiBwYXJzZUludCh0YXJnZXQubWFyZ2luQm90dG9tLCAxMCkgfHwgMCwKICAgICAgICAgICAgbGVmdDogcGFyc2VJbnQodGFyZ2V0Lm1hcmdpbkxlZnQsIDEwKSB8fCAwCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXNldHMgdGhlIHRhcmdldCBlbGVtZW50J3MgcG9zaXRpb24gYW5kIHNpemUgY29uc3RyYWludHMsIGFuZCBjbGVhcgogICAgICAgKiB0aGUgbWVtb2l6ZWQgZGF0YS4KICAgICAgICovCiAgICAgIHJlc2V0Rml0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW5mbyA9IHRoaXMuX2ZpdEluZm8gfHwge307CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gaW5mby5zaXplcklubGluZVN0eWxlKSB7CiAgICAgICAgICB0aGlzLnNpemluZ1RhcmdldC5zdHlsZVtwcm9wZXJ0eV0gPSBpbmZvLnNpemVySW5saW5lU3R5bGVbcHJvcGVydHldOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiBpbmZvLmlubGluZVN0eWxlKSB7CiAgICAgICAgICB0aGlzLnN0eWxlW3Byb3BlcnR5XSA9IGluZm8uaW5saW5lU3R5bGVbcHJvcGVydHldOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fZml0SW5mbyA9IG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRXF1aXZhbGVudCB0byBjYWxsaW5nIGByZXNldEZpdCgpYCBhbmQgYGZpdCgpYC4gVXNlZnVsIHRvIGNhbGwgdGhpcyBhZnRlcgogICAgICAgKiB0aGUgZWxlbWVudCBvciB0aGUgYGZpdEludG9gIGVsZW1lbnQgaGFzIGJlZW4gcmVzaXplZCwgb3IgaWYgYW55IG9mIHRoZQogICAgICAgKiBwb3NpdGlvbmluZyBwcm9wZXJ0aWVzIChlLmcuIGBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ25gKSBpcyB1cGRhdGVkLgogICAgICAgKiBJdCBwcmVzZXJ2ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgc2l6aW5nVGFyZ2V0LgogICAgICAgKi8KICAgICAgcmVmaXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY3JvbGxMZWZ0ID0gdGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsTGVmdDsKICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5zaXppbmdUYXJnZXQuc2Nyb2xsVG9wOwogICAgICAgIHRoaXMucmVzZXRGaXQoKTsKICAgICAgICB0aGlzLmZpdCgpOwogICAgICAgIHRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0OwogICAgICAgIHRoaXMuc2l6aW5nVGFyZ2V0LnNjcm9sbFRvcCA9IHNjcm9sbFRvcDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBQb3NpdGlvbnMgdGhlIGVsZW1lbnQgYWNjb3JkaW5nIHRvIGBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsQWxpZ25gLgogICAgICAgKi8KICAgICAgcG9zaXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5fX3Nob3VsZFBvc2l0aW9uKSB7CiAgICAgICAgICAvLyBuZWVkcyB0byBiZSBjZW50ZXJlZCwgYW5kIGl0IGlzIGRvbmUgYWZ0ZXIgY29uc3RyYWluLgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9kaXNjb3ZlckluZm8oKTsKCiAgICAgICAgdGhpcy5zdHlsZS5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICAgICAgLy8gTmVlZCBib3JkZXItYm94IGZvciBtYXJnaW4vcGFkZGluZy4KICAgICAgICB0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5ib3hTaXppbmcgPSAnYm9yZGVyLWJveCc7CiAgICAgICAgLy8gU2V0IHRvIDAsIDAgaW4gb3JkZXIgdG8gZGlzY292ZXIgYW55IG9mZnNldCBjYXVzZWQgYnkgcGFyZW50IHN0YWNraW5nCiAgICAgICAgLy8gY29udGV4dHMuCiAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ID0gJzBweCc7CiAgICAgICAgdGhpcy5zdHlsZS50b3AgPSAnMHB4JzsKCiAgICAgICAgdmFyIHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciBwb3NpdGlvblJlY3QgPSB0aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5wb3NpdGlvblRhcmdldCk7CiAgICAgICAgdmFyIGZpdFJlY3QgPSB0aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTsKCiAgICAgICAgdmFyIG1hcmdpbiA9IHRoaXMuX2ZpdEluZm8ubWFyZ2luOwoKICAgICAgICAvLyBDb25zaWRlciB0aGUgbWFyZ2luIGFzIHBhcnQgb2YgdGhlIHNpemUgZm9yIHBvc2l0aW9uIGNhbGN1bGF0aW9ucy4KICAgICAgICB2YXIgc2l6ZSA9IHsKICAgICAgICAgIHdpZHRoOiByZWN0LndpZHRoICsgbWFyZ2luLmxlZnQgKyBtYXJnaW4ucmlnaHQsCiAgICAgICAgICBoZWlnaHQ6IHJlY3QuaGVpZ2h0ICsgbWFyZ2luLnRvcCArIG1hcmdpbi5ib3R0b20KICAgICAgICB9OwoKICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl9fZ2V0UG9zaXRpb24oCiAgICAgICAgICAgIHRoaXMuX2xvY2FsZUhvcml6b250YWxBbGlnbiwKICAgICAgICAgICAgdGhpcy52ZXJ0aWNhbEFsaWduLAogICAgICAgICAgICBzaXplLAogICAgICAgICAgICByZWN0LAogICAgICAgICAgICBwb3NpdGlvblJlY3QsCiAgICAgICAgICAgIGZpdFJlY3QpOwoKICAgICAgICB2YXIgbGVmdCA9IHBvc2l0aW9uLmxlZnQgKyBtYXJnaW4ubGVmdDsKICAgICAgICB2YXIgdG9wID0gcG9zaXRpb24udG9wICsgbWFyZ2luLnRvcDsKCiAgICAgICAgLy8gV2UgZmlyc3QgbGltaXQgcmlnaHQvYm90dG9tIHdpdGhpbiBmaXRJbnRvIHJlc3BlY3RpbmcgdGhlIG1hcmdpbiwKICAgICAgICAvLyB0aGVuIHVzZSB0aG9zZSB2YWx1ZXMgdG8gbGltaXQgdG9wL2xlZnQuCiAgICAgICAgdmFyIHJpZ2h0ID0gTWF0aC5taW4oZml0UmVjdC5yaWdodCAtIG1hcmdpbi5yaWdodCwgbGVmdCArIHJlY3Qud2lkdGgpOwogICAgICAgIHZhciBib3R0b20gPSBNYXRoLm1pbihmaXRSZWN0LmJvdHRvbSAtIG1hcmdpbi5ib3R0b20sIHRvcCArIHJlY3QuaGVpZ2h0KTsKCiAgICAgICAgLy8gS2VlcCBsZWZ0L3RvcCB3aXRoaW4gZml0SW50byByZXNwZWN0aW5nIHRoZSBtYXJnaW4uCiAgICAgICAgbGVmdCA9IE1hdGgubWF4KAogICAgICAgICAgICBmaXRSZWN0LmxlZnQgKyBtYXJnaW4ubGVmdCwKICAgICAgICAgICAgTWF0aC5taW4obGVmdCwgcmlnaHQgLSB0aGlzLl9maXRJbmZvLnNpemVkQnkubWluV2lkdGgpKTsKICAgICAgICB0b3AgPSBNYXRoLm1heCgKICAgICAgICAgICAgZml0UmVjdC50b3AgKyBtYXJnaW4udG9wLAogICAgICAgICAgICBNYXRoLm1pbih0b3AsIGJvdHRvbSAtIHRoaXMuX2ZpdEluZm8uc2l6ZWRCeS5taW5IZWlnaHQpKTsKCiAgICAgICAgLy8gVXNlIHJpZ2h0L2JvdHRvbSB0byBzZXQgbWF4V2lkdGgvbWF4SGVpZ2h0LCBhbmQgcmVzcGVjdAogICAgICAgIC8vIG1pbldpZHRoL21pbkhlaWdodC4KICAgICAgICB0aGlzLnNpemluZ1RhcmdldC5zdHlsZS5tYXhXaWR0aCA9CiAgICAgICAgICAgIE1hdGgubWF4KHJpZ2h0IC0gbGVmdCwgdGhpcy5fZml0SW5mby5zaXplZEJ5Lm1pbldpZHRoKSArICdweCc7CiAgICAgICAgdGhpcy5zaXppbmdUYXJnZXQuc3R5bGUubWF4SGVpZ2h0ID0KICAgICAgICAgICAgTWF0aC5tYXgoYm90dG9tIC0gdG9wLCB0aGlzLl9maXRJbmZvLnNpemVkQnkubWluSGVpZ2h0KSArICdweCc7CgogICAgICAgIC8vIFJlbW92ZSB0aGUgb2Zmc2V0IGNhdXNlZCBieSBhbnkgc3RhY2tpbmcgY29udGV4dC4KICAgICAgICB0aGlzLnN0eWxlLmxlZnQgPSAobGVmdCAtIHJlY3QubGVmdCkgKyAncHgnOwogICAgICAgIHRoaXMuc3R5bGUudG9wID0gKHRvcCAtIHJlY3QudG9wKSArICdweCc7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ29uc3RyYWlucyB0aGUgc2l6ZSBvZiB0aGUgZWxlbWVudCB0byBgZml0SW50b2AgYnkgc2V0dGluZyBgbWF4LWhlaWdodGAKICAgICAgICogYW5kL29yIGBtYXgtd2lkdGhgLgogICAgICAgKi8KICAgICAgY29uc3RyYWluOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fX3Nob3VsZFBvc2l0aW9uKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2Rpc2NvdmVySW5mbygpOwoKICAgICAgICB2YXIgaW5mbyA9IHRoaXMuX2ZpdEluZm87CiAgICAgICAgLy8gcG9zaXRpb24gYXQgKDBweCwgMHB4KSBpZiBub3QgYWxyZWFkeSBwb3NpdGlvbmVkLCBzbyB3ZSBjYW4gbWVhc3VyZSB0aGUKICAgICAgICAvLyBuYXR1cmFsIHNpemUuCiAgICAgICAgaWYgKCFpbmZvLnBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5KSB7CiAgICAgICAgICB0aGlzLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgICAgIHRoaXMuc3R5bGUudG9wID0gJzBweCc7CiAgICAgICAgfQogICAgICAgIGlmICghaW5mby5wb3NpdGlvbmVkQnkuaG9yaXpvbnRhbGx5KSB7CiAgICAgICAgICB0aGlzLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgICAgIHRoaXMuc3R5bGUubGVmdCA9ICcwcHgnOwogICAgICAgIH0KCiAgICAgICAgLy8gbmVlZCBib3JkZXItYm94IGZvciBtYXJnaW4vcGFkZGluZwogICAgICAgIHRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlLmJveFNpemluZyA9ICdib3JkZXItYm94JzsKICAgICAgICAvLyBjb25zdHJhaW4gdGhlIHdpZHRoIGFuZCBoZWlnaHQgaWYgbm90IGFscmVhZHkgc2V0CiAgICAgICAgdmFyIHJlY3QgPSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmICghaW5mby5zaXplZEJ5LmhlaWdodCkgewogICAgICAgICAgdGhpcy5fX3NpemVEaW1lbnNpb24oCiAgICAgICAgICAgICAgcmVjdCwgaW5mby5wb3NpdGlvbmVkQnkudmVydGljYWxseSwgJ3RvcCcsICdib3R0b20nLCAnSGVpZ2h0Jyk7CiAgICAgICAgfQogICAgICAgIGlmICghaW5mby5zaXplZEJ5LndpZHRoKSB7CiAgICAgICAgICB0aGlzLl9fc2l6ZURpbWVuc2lvbigKICAgICAgICAgICAgICByZWN0LCBpbmZvLnBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHksICdsZWZ0JywgJ3JpZ2h0JywgJ1dpZHRoJyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICogQGRlcHJlY2F0ZWQKICAgICAgICovCiAgICAgIF9zaXplRGltZW5zaW9uOiBmdW5jdGlvbihyZWN0LCBwb3NpdGlvbmVkQnksIHN0YXJ0LCBlbmQsIGV4dGVudCkgewogICAgICAgIHRoaXMuX19zaXplRGltZW5zaW9uKHJlY3QsIHBvc2l0aW9uZWRCeSwgc3RhcnQsIGVuZCwgZXh0ZW50KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX19zaXplRGltZW5zaW9uOiBmdW5jdGlvbihyZWN0LCBwb3NpdGlvbmVkQnksIHN0YXJ0LCBlbmQsIGV4dGVudCkgewogICAgICAgIHZhciBpbmZvID0gdGhpcy5fZml0SW5mbzsKICAgICAgICB2YXIgZml0UmVjdCA9IHRoaXMuX19nZXROb3JtYWxpemVkUmVjdCh0aGlzLmZpdEludG8pOwogICAgICAgIHZhciBtYXggPSBleHRlbnQgPT09ICdXaWR0aCcgPyBmaXRSZWN0LndpZHRoIDogZml0UmVjdC5oZWlnaHQ7CiAgICAgICAgdmFyIGZsaXAgPSAocG9zaXRpb25lZEJ5ID09PSBlbmQpOwogICAgICAgIHZhciBvZmZzZXQgPSBmbGlwID8gbWF4IC0gcmVjdFtlbmRdIDogcmVjdFtzdGFydF07CiAgICAgICAgdmFyIG1hcmdpbiA9IGluZm8ubWFyZ2luW2ZsaXAgPyBzdGFydCA6IGVuZF07CiAgICAgICAgdmFyIG9mZnNldEV4dGVudCA9ICdvZmZzZXQnICsgZXh0ZW50OwogICAgICAgIHZhciBzaXppbmdPZmZzZXQgPSB0aGlzW29mZnNldEV4dGVudF0gLSB0aGlzLnNpemluZ1RhcmdldFtvZmZzZXRFeHRlbnRdOwogICAgICAgIHRoaXMuc2l6aW5nVGFyZ2V0LnN0eWxlWydtYXgnICsgZXh0ZW50XSA9CiAgICAgICAgICAgIChtYXggLSBtYXJnaW4gLSBvZmZzZXQgLSBzaXppbmdPZmZzZXQpICsgJ3B4JzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDZW50ZXJzIGhvcml6b250YWxseSBhbmQgdmVydGljYWxseSBpZiBub3QgYWxyZWFkeSBwb3NpdGlvbmVkLiBUaGlzIGFsc28KICAgICAgICogc2V0cyBgcG9zaXRpb246Zml4ZWRgLgogICAgICAgKi8KICAgICAgY2VudGVyOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fX3Nob3VsZFBvc2l0aW9uKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2Rpc2NvdmVySW5mbygpOwoKICAgICAgICB2YXIgcG9zaXRpb25lZEJ5ID0gdGhpcy5fZml0SW5mby5wb3NpdGlvbmVkQnk7CiAgICAgICAgaWYgKHBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5ICYmIHBvc2l0aW9uZWRCeS5ob3Jpem9udGFsbHkpIHsKICAgICAgICAgIC8vIEFscmVhZHkgcG9zaXRpb25lZC4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gTmVlZCBwb3NpdGlvbjpmaXhlZCB0byBjZW50ZXIKICAgICAgICB0aGlzLnN0eWxlLnBvc2l0aW9uID0gJ2ZpeGVkJzsKICAgICAgICAvLyBUYWtlIGludG8gYWNjb3VudCB0aGUgb2Zmc2V0IGNhdXNlZCBieSBwYXJlbnRzIHRoYXQgY3JlYXRlIHN0YWNraW5nCiAgICAgICAgLy8gY29udGV4dHMgKGUuZy4gd2l0aCB0cmFuc2Zvcm06IHRyYW5zbGF0ZTNkKS4gVHJhbnNsYXRlIHRvIDAsMCBhbmQKICAgICAgICAvLyBtZWFzdXJlIHRoZSBib3VuZGluZyByZWN0LgogICAgICAgIGlmICghcG9zaXRpb25lZEJ5LnZlcnRpY2FsbHkpIHsKICAgICAgICAgIHRoaXMuc3R5bGUudG9wID0gJzBweCc7CiAgICAgICAgfQogICAgICAgIGlmICghcG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSkgewogICAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ID0gJzBweCc7CiAgICAgICAgfQogICAgICAgIC8vIEl0IHdpbGwgdGFrZSBpbiBjb25zaWRlcmF0aW9uIG1hcmdpbnMgYW5kIHRyYW5zZm9ybXMKICAgICAgICB2YXIgcmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgdmFyIGZpdFJlY3QgPSB0aGlzLl9fZ2V0Tm9ybWFsaXplZFJlY3QodGhpcy5maXRJbnRvKTsKICAgICAgICBpZiAoIXBvc2l0aW9uZWRCeS52ZXJ0aWNhbGx5KSB7CiAgICAgICAgICB2YXIgdG9wID0gZml0UmVjdC50b3AgLSByZWN0LnRvcCArIChmaXRSZWN0LmhlaWdodCAtIHJlY3QuaGVpZ2h0KSAvIDI7CiAgICAgICAgICB0aGlzLnN0eWxlLnRvcCA9IHRvcCArICdweCc7CiAgICAgICAgfQogICAgICAgIGlmICghcG9zaXRpb25lZEJ5Lmhvcml6b250YWxseSkgewogICAgICAgICAgdmFyIGxlZnQgPSBmaXRSZWN0LmxlZnQgLSByZWN0LmxlZnQgKyAoZml0UmVjdC53aWR0aCAtIHJlY3Qud2lkdGgpIC8gMjsKICAgICAgICAgIHRoaXMuc3R5bGUubGVmdCA9IGxlZnQgKyAncHgnOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9fZ2V0Tm9ybWFsaXplZFJlY3Q6IGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgIGlmICh0YXJnZXQgPT09IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCB8fCB0YXJnZXQgPT09IHdpbmRvdykgewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdG9wOiAwLAogICAgICAgICAgICBsZWZ0OiAwLAogICAgICAgICAgICB3aWR0aDogd2luZG93LmlubmVyV2lkdGgsCiAgICAgICAgICAgIGhlaWdodDogd2luZG93LmlubmVySGVpZ2h0LAogICAgICAgICAgICByaWdodDogd2luZG93LmlubmVyV2lkdGgsCiAgICAgICAgICAgIGJvdHRvbTogd2luZG93LmlubmVySGVpZ2h0CiAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICB9LAoKICAgICAgX19nZXRPZmZzY3JlZW5BcmVhOiBmdW5jdGlvbihwb3NpdGlvbiwgc2l6ZSwgZml0UmVjdCkgewogICAgICAgIHZhciB2ZXJ0aWNhbENyb3AgPSBNYXRoLm1pbigwLCBwb3NpdGlvbi50b3ApICsKICAgICAgICAgICAgTWF0aC5taW4oMCwgZml0UmVjdC5ib3R0b20gLSAocG9zaXRpb24udG9wICsgc2l6ZS5oZWlnaHQpKTsKICAgICAgICB2YXIgaG9yaXpvbnRhbENyb3AgPSBNYXRoLm1pbigwLCBwb3NpdGlvbi5sZWZ0KSArCiAgICAgICAgICAgIE1hdGgubWluKDAsIGZpdFJlY3QucmlnaHQgLSAocG9zaXRpb24ubGVmdCArIHNpemUud2lkdGgpKTsKICAgICAgICByZXR1cm4gTWF0aC5hYnModmVydGljYWxDcm9wKSAqIHNpemUud2lkdGggKwogICAgICAgICAgICBNYXRoLmFicyhob3Jpem9udGFsQ3JvcCkgKiBzaXplLmhlaWdodDsKICAgICAgfSwKCgogICAgICBfX2dldFBvc2l0aW9uOiBmdW5jdGlvbigKICAgICAgICAgIGhBbGlnbiwgdkFsaWduLCBzaXplLCBzaXplTm9NYXJnaW5zLCBwb3NpdGlvblJlY3QsIGZpdFJlY3QpIHsKICAgICAgICAvLyBBbGwgdGhlIHBvc3NpYmxlIGNvbmZpZ3VyYXRpb25zLgogICAgICAgIC8vIE9yZGVyZWQgYXMgdG9wLWxlZnQsIHRvcC1yaWdodCwgYm90dG9tLWxlZnQsIGJvdHRvbS1yaWdodC4KICAgICAgICB2YXIgcG9zaXRpb25zID0gWwogICAgICAgICAgewogICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJywKICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnbGVmdCcsCiAgICAgICAgICAgIHRvcDogcG9zaXRpb25SZWN0LnRvcCArIHRoaXMudmVydGljYWxPZmZzZXQsCiAgICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uUmVjdC5sZWZ0ICsgdGhpcy5ob3Jpem9udGFsT2Zmc2V0CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJywKICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAncmlnaHQnLAogICAgICAgICAgICB0b3A6IHBvc2l0aW9uUmVjdC50b3AgKyB0aGlzLnZlcnRpY2FsT2Zmc2V0LAogICAgICAgICAgICBsZWZ0OiBwb3NpdGlvblJlY3QucmlnaHQgLSBzaXplLndpZHRoIC0gdGhpcy5ob3Jpem9udGFsT2Zmc2V0CiAgICAgICAgICB9LAogICAgICAgICAgewogICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnYm90dG9tJywKICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnbGVmdCcsCiAgICAgICAgICAgIHRvcDogcG9zaXRpb25SZWN0LmJvdHRvbSAtIHNpemUuaGVpZ2h0IC0gdGhpcy52ZXJ0aWNhbE9mZnNldCwKICAgICAgICAgICAgbGVmdDogcG9zaXRpb25SZWN0LmxlZnQgKyB0aGlzLmhvcml6b250YWxPZmZzZXQKICAgICAgICAgIH0sCiAgICAgICAgICB7CiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdib3R0b20nLAogICAgICAgICAgICBob3Jpem9udGFsQWxpZ246ICdyaWdodCcsCiAgICAgICAgICAgIHRvcDogcG9zaXRpb25SZWN0LmJvdHRvbSAtIHNpemUuaGVpZ2h0IC0gdGhpcy52ZXJ0aWNhbE9mZnNldCwKICAgICAgICAgICAgbGVmdDogcG9zaXRpb25SZWN0LnJpZ2h0IC0gc2l6ZS53aWR0aCAtIHRoaXMuaG9yaXpvbnRhbE9mZnNldAogICAgICAgICAgfQogICAgICAgIF07CgogICAgICAgIGlmICh0aGlzLm5vT3ZlcmxhcCkgewogICAgICAgICAgLy8gRHVwbGljYXRlLgogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwb3NpdGlvbnMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgICAgIHZhciBjb3B5ID0ge307CiAgICAgICAgICAgIGZvciAodmFyIGtleSBpbiBwb3NpdGlvbnNbaV0pIHsKICAgICAgICAgICAgICBjb3B5W2tleV0gPSBwb3NpdGlvbnNbaV1ba2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3NpdGlvbnMucHVzaChjb3B5KTsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEhvcml6b250YWwgb3ZlcmxhcCBvbmx5LgogICAgICAgICAgcG9zaXRpb25zWzBdLnRvcCA9IHBvc2l0aW9uc1sxXS50b3AgKz0gcG9zaXRpb25SZWN0LmhlaWdodDsKICAgICAgICAgIHBvc2l0aW9uc1syXS50b3AgPSBwb3NpdGlvbnNbM10udG9wIC09IHBvc2l0aW9uUmVjdC5oZWlnaHQ7CiAgICAgICAgICAvLyBWZXJ0aWNhbCBvdmVybGFwIG9ubHkuCiAgICAgICAgICBwb3NpdGlvbnNbNF0ubGVmdCA9IHBvc2l0aW9uc1s2XS5sZWZ0ICs9IHBvc2l0aW9uUmVjdC53aWR0aDsKICAgICAgICAgIHBvc2l0aW9uc1s1XS5sZWZ0ID0gcG9zaXRpb25zWzddLmxlZnQgLT0gcG9zaXRpb25SZWN0LndpZHRoOwogICAgICAgIH0KCiAgICAgICAgLy8gQ29uc2lkZXIgYXV0byBhcyBudWxsIGZvciBjb2RpbmcgY29udmVuaWVuY2UuCiAgICAgICAgdkFsaWduID0gdkFsaWduID09PSAnYXV0bycgPyBudWxsIDogdkFsaWduOwogICAgICAgIGhBbGlnbiA9IGhBbGlnbiA9PT0gJ2F1dG8nID8gbnVsbCA6IGhBbGlnbjsKCiAgICAgICAgaWYgKCFoQWxpZ24gfHwgaEFsaWduID09PSAnY2VudGVyJykgewogICAgICAgICAgcG9zaXRpb25zLnB1c2goewogICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAndG9wJywKICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnY2VudGVyJywKICAgICAgICAgICAgdG9wOiBwb3NpdGlvblJlY3QudG9wICsgdGhpcy52ZXJ0aWNhbE9mZnNldCArCiAgICAgICAgICAgICAgICAodGhpcy5ub092ZXJsYXAgPyBwb3NpdGlvblJlY3QuaGVpZ2h0IDogMCksCiAgICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uUmVjdC5sZWZ0IC0gc2l6ZU5vTWFyZ2lucy53aWR0aCAvIDIgKwogICAgICAgICAgICAgICAgcG9zaXRpb25SZWN0LndpZHRoIC8gMiArIHRoaXMuaG9yaXpvbnRhbE9mZnNldAogICAgICAgICAgfSk7CiAgICAgICAgICBwb3NpdGlvbnMucHVzaCh7CiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdib3R0b20nLAogICAgICAgICAgICBob3Jpem9udGFsQWxpZ246ICdjZW50ZXInLAogICAgICAgICAgICB0b3A6IHBvc2l0aW9uUmVjdC5ib3R0b20gLSBzaXplLmhlaWdodCAtIHRoaXMudmVydGljYWxPZmZzZXQgLQogICAgICAgICAgICAgICAgKHRoaXMubm9PdmVybGFwID8gcG9zaXRpb25SZWN0LmhlaWdodCA6IDApLAogICAgICAgICAgICBsZWZ0OiBwb3NpdGlvblJlY3QubGVmdCAtIHNpemVOb01hcmdpbnMud2lkdGggLyAyICsKICAgICAgICAgICAgICAgIHBvc2l0aW9uUmVjdC53aWR0aCAvIDIgKyB0aGlzLmhvcml6b250YWxPZmZzZXQKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF2QWxpZ24gfHwgdkFsaWduID09PSAnbWlkZGxlJykgewogICAgICAgICAgcG9zaXRpb25zLnB1c2goewogICAgICAgICAgICB2ZXJ0aWNhbEFsaWduOiAnbWlkZGxlJywKICAgICAgICAgICAgaG9yaXpvbnRhbEFsaWduOiAnbGVmdCcsCiAgICAgICAgICAgIHRvcDogcG9zaXRpb25SZWN0LnRvcCAtIHNpemVOb01hcmdpbnMuaGVpZ2h0IC8gMiArCiAgICAgICAgICAgICAgICBwb3NpdGlvblJlY3QuaGVpZ2h0IC8gMiArIHRoaXMudmVydGljYWxPZmZzZXQsCiAgICAgICAgICAgIGxlZnQ6IHBvc2l0aW9uUmVjdC5sZWZ0ICsgdGhpcy5ob3Jpem9udGFsT2Zmc2V0ICsKICAgICAgICAgICAgICAgICh0aGlzLm5vT3ZlcmxhcCA/IHBvc2l0aW9uUmVjdC53aWR0aCA6IDApCiAgICAgICAgICB9KTsKICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHsKICAgICAgICAgICAgdmVydGljYWxBbGlnbjogJ21pZGRsZScsCiAgICAgICAgICAgIGhvcml6b250YWxBbGlnbjogJ3JpZ2h0JywKICAgICAgICAgICAgdG9wOiBwb3NpdGlvblJlY3QudG9wIC0gc2l6ZU5vTWFyZ2lucy5oZWlnaHQgLyAyICsKICAgICAgICAgICAgICAgIHBvc2l0aW9uUmVjdC5oZWlnaHQgLyAyICsgdGhpcy52ZXJ0aWNhbE9mZnNldCwKICAgICAgICAgICAgbGVmdDogcG9zaXRpb25SZWN0LnJpZ2h0IC0gc2l6ZS53aWR0aCAtIHRoaXMuaG9yaXpvbnRhbE9mZnNldCAtCiAgICAgICAgICAgICAgICAodGhpcy5ub092ZXJsYXAgPyBwb3NpdGlvblJlY3Qud2lkdGggOiAwKQogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICBpZiAodkFsaWduID09PSAnbWlkZGxlJyAmJiBoQWxpZ24gPT09ICdjZW50ZXInKSB7CiAgICAgICAgICBwb3NpdGlvbnMucHVzaCh7CiAgICAgICAgICAgIHZlcnRpY2FsQWxpZ246ICdtaWRkbGUnLAogICAgICAgICAgICBob3Jpem9udGFsQWxpZ246ICdjZW50ZXInLAogICAgICAgICAgICB0b3A6IHBvc2l0aW9uUmVjdC50b3AgLSBzaXplTm9NYXJnaW5zLmhlaWdodCAvIDIgKwogICAgICAgICAgICAgICAgcG9zaXRpb25SZWN0LmhlaWdodCAvIDIgKyB0aGlzLnZlcnRpY2FsT2Zmc2V0LAogICAgICAgICAgICBsZWZ0OiBwb3NpdGlvblJlY3QubGVmdCAtIHNpemVOb01hcmdpbnMud2lkdGggLyAyICsKICAgICAgICAgICAgICAgIHBvc2l0aW9uUmVjdC53aWR0aCAvIDIgKyB0aGlzLmhvcml6b250YWxPZmZzZXQKICAgICAgICAgIH0pOwogICAgICAgIH0KCiAgICAgICAgdmFyIHBvc2l0aW9uOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgY2FuZGlkYXRlID0gcG9zaXRpb25zW2ldOwogICAgICAgICAgdmFyIHZBbGlnbk9rID0gY2FuZGlkYXRlLnZlcnRpY2FsQWxpZ24gPT09IHZBbGlnbjsKICAgICAgICAgIHZhciBoQWxpZ25PayA9IGNhbmRpZGF0ZS5ob3Jpem9udGFsQWxpZ24gPT09IGhBbGlnbjsKCiAgICAgICAgICAvLyBJZiBib3RoIHZBbGlnbiBhbmQgaEFsaWduIGFyZSBkZWZpbmVkLCByZXR1cm4gZXhhY3QgbWF0Y2guCiAgICAgICAgICAvLyBGb3IgZHluYW1pY0FsaWduIGFuZCBub092ZXJsYXAgd2UnbGwgaGF2ZSBtb3JlIHRoYW4gb25lIGNhbmRpZGF0ZSwgc28KICAgICAgICAgIC8vIHdlJ2xsIGhhdmUgdG8gY2hlY2sgdGhlIG9mZnNjcmVlbkFyZWEgdG8gbWFrZSB0aGUgYmVzdCBjaG9pY2UuCiAgICAgICAgICBpZiAoIXRoaXMuZHluYW1pY0FsaWduICYmICF0aGlzLm5vT3ZlcmxhcCAmJiB2QWxpZ25PayAmJiBoQWxpZ25PaykgewogICAgICAgICAgICBwb3NpdGlvbiA9IGNhbmRpZGF0ZTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gQWxpZ24gaXMgb2sgaWYgYWxpZ25tZW50IHByZWZlcmVuY2VzIGFyZSByZXNwZWN0ZWQuIElmIG5vIHByZWZlcmVuY2VzLAogICAgICAgICAgLy8gaXQgaXMgY29uc2lkZXJlZCBvay4KICAgICAgICAgIHZhciBhbGlnbk9rID0gKCF2QWxpZ24gfHwgdkFsaWduT2spICYmICghaEFsaWduIHx8IGhBbGlnbk9rKTsKCiAgICAgICAgICAvLyBGaWx0ZXIgb3V0IGVsZW1lbnRzIHRoYXQgZG9uJ3QgbWF0Y2ggdGhlIGFsaWdubWVudCAoaWYgZGVmaW5lZCkuCiAgICAgICAgICAvLyBXaXRoIGR5bmFtaWNBbGlnbiwgd2UgbmVlZCB0byBjb25zaWRlciBhbGwgdGhlIHBvc2l0aW9ucyB0byBmaW5kIHRoZQogICAgICAgICAgLy8gb25lIHRoYXQgbWluaW1pemVzIHRoZSBjcm9wcGVkIGFyZWEuCiAgICAgICAgICBpZiAoIXRoaXMuZHluYW1pY0FsaWduICYmICFhbGlnbk9rKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQoKICAgICAgICAgIGNhbmRpZGF0ZS5vZmZzY3JlZW5BcmVhID0KICAgICAgICAgICAgICB0aGlzLl9fZ2V0T2Zmc2NyZWVuQXJlYShjYW5kaWRhdGUsIHNpemUsIGZpdFJlY3QpOwogICAgICAgICAgLy8gSWYgbm90IGNyb3BwZWQgYW5kIHJlc3BlY3RzIHRoZSBhbGlnbiByZXF1aXJlbWVudHMsIGtlZXAgaXQuCiAgICAgICAgICAvLyBUaGlzIGFsbG93cyB0byBwcmVmZXIgcG9zaXRpb25zIG92ZXJsYXBwaW5nIGhvcml6b250YWxseSBvdmVyIHRoZQogICAgICAgICAgLy8gb25lcyBvdmVybGFwcGluZyB2ZXJ0aWNhbGx5LgogICAgICAgICAgaWYgKGNhbmRpZGF0ZS5vZmZzY3JlZW5BcmVhID09PSAwICYmIGFsaWduT2spIHsKICAgICAgICAgICAgcG9zaXRpb24gPSBjYW5kaWRhdGU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgcG9zaXRpb24gPSBwb3NpdGlvbiB8fCBjYW5kaWRhdGU7CiAgICAgICAgICB2YXIgZGlmZiA9IGNhbmRpZGF0ZS5vZmZzY3JlZW5BcmVhIC0gcG9zaXRpb24ub2Zmc2NyZWVuQXJlYTsKICAgICAgICAgIC8vIENoZWNrIHdoaWNoIGNyb3BzIGxlc3MuIElmIGl0IGNyb3BzIGVxdWFsbHksIGNoZWNrIGlmIGF0IGxlYXN0IG9uZQogICAgICAgICAgLy8gYWxpZ24gc2V0dGluZyBpcyBvay4KICAgICAgICAgIGlmIChkaWZmIDwgMCB8fCAoZGlmZiA9PT0gMCAmJiAodkFsaWduT2sgfHwgaEFsaWduT2spKSkgewogICAgICAgICAgICBwb3NpdGlvbiA9IGNhbmRpZGF0ZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgfQoKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgdmFyIHAkMSA9IEVsZW1lbnQucHJvdG90eXBlOwogICAgdmFyIG1hdGNoZXMkMSA9IHAkMS5tYXRjaGVzIHx8IHAkMS5tYXRjaGVzU2VsZWN0b3IgfHwgcCQxLm1vek1hdGNoZXNTZWxlY3RvciB8fAogICAgICAgIHAkMS5tc01hdGNoZXNTZWxlY3RvciB8fCBwJDEub01hdGNoZXNTZWxlY3RvciB8fCBwJDEud2Via2l0TWF0Y2hlc1NlbGVjdG9yOwoKICAgIGNsYXNzIElyb25Gb2N1c2FibGVzSGVscGVyQ2xhc3MgewogICAgICAvKioKICAgICAgICogUmV0dXJucyBhIHNvcnRlZCBhcnJheSBvZiB0YWJiYWJsZSBub2RlcywgaW5jbHVkaW5nIHRoZSByb290IG5vZGUuCiAgICAgICAqIEl0IHNlYXJjaGVzIHRoZSB0YWJiYWJsZSBub2RlcyBpbiB0aGUgbGlnaHQgYW5kIHNoYWRvdyBkb20gb2YgdGhlIGNoaWRyZW4sCiAgICAgICAqIHNvcnRpbmcgdGhlIHJlc3VsdCBieSB0YWJpbmRleC4KICAgICAgICogQHBhcmFtIHshTm9kZX0gbm9kZQogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0KICAgICAgICovCiAgICAgIGdldFRhYmJhYmxlTm9kZXMobm9kZSkgewogICAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhdCBsZWFzdCBvbmUgZWxlbWVudCB3aXRoIHRhYmluZGV4ID4gMCwgd2UgbmVlZCB0byBzb3J0CiAgICAgICAgLy8gdGhlIGZpbmFsIGFycmF5IGJ5IHRhYmluZGV4LgogICAgICAgIHZhciBuZWVkc1NvcnRCeVRhYkluZGV4ID0gdGhpcy5fY29sbGVjdFRhYmJhYmxlTm9kZXMobm9kZSwgcmVzdWx0KTsKICAgICAgICBpZiAobmVlZHNTb3J0QnlUYWJJbmRleCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnRCeVRhYkluZGV4KHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGlmIGEgZWxlbWVudCBpcyBmb2N1c2FibGUuCiAgICAgICAqIEBwYXJhbSB7IUhUTUxFbGVtZW50fSBlbGVtZW50CiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgICAqLwogICAgICBpc0ZvY3VzYWJsZShlbGVtZW50KSB7CiAgICAgICAgLy8gRnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xNjAwMTk0LzQyMjg3MDM6CiAgICAgICAgLy8gVGhlcmUgaXNuJ3QgYSBkZWZpbml0ZSBsaXN0LCBpdCdzIHVwIHRvIHRoZSBicm93c2VyLiBUaGUgb25seQogICAgICAgIC8vIHN0YW5kYXJkIHdlIGhhdmUgaXMgRE9NIExldmVsIDIgSFRNTAogICAgICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMi1IVE1ML2h0bWwuaHRtbCwgYWNjb3JkaW5nIHRvIHdoaWNoIHRoZQogICAgICAgIC8vIG9ubHkgZWxlbWVudHMgdGhhdCBoYXZlIGEgZm9jdXMoKSBtZXRob2QgYXJlIEhUTUxJbnB1dEVsZW1lbnQsCiAgICAgICAgLy8gSFRNTFNlbGVjdEVsZW1lbnQsIEhUTUxUZXh0QXJlYUVsZW1lbnQgYW5kIEhUTUxBbmNob3JFbGVtZW50LiBUaGlzCiAgICAgICAgLy8gbm90YWJseSBvbWl0cyBIVE1MQnV0dG9uRWxlbWVudCBhbmQgSFRNTEFyZWFFbGVtZW50LiBSZWZlcnJpbmcgdG8gdGhlc2UKICAgICAgICAvLyB0ZXN0cyB3aXRoIHRhYmJhYmxlcyBpbiBkaWZmZXJlbnQgYnJvd3NlcnMKICAgICAgICAvLyBodHRwOi8vYWxseWpzLmlvL2RhdGEtdGFibGVzL2ZvY3VzYWJsZS5odG1sCgogICAgICAgIC8vIEVsZW1lbnRzIHRoYXQgY2Fubm90IGJlIGZvY3VzZWQgaWYgdGhleSBoYXZlIFtkaXNhYmxlZF0gYXR0cmlidXRlLgogICAgICAgIGlmIChtYXRjaGVzJDEuY2FsbChlbGVtZW50LCAnaW5wdXQsIHNlbGVjdCwgdGV4dGFyZWEsIGJ1dHRvbiwgb2JqZWN0JykpIHsKICAgICAgICAgIHJldHVybiBtYXRjaGVzJDEuY2FsbChlbGVtZW50LCAnOm5vdChbZGlzYWJsZWRdKScpOwogICAgICAgIH0KICAgICAgICAvLyBFbGVtZW50cyB0aGF0IGNhbiBiZSBmb2N1c2VkIGV2ZW4gaWYgdGhleSBoYXZlIFtkaXNhYmxlZF0gYXR0cmlidXRlLgogICAgICAgIHJldHVybiBtYXRjaGVzJDEuY2FsbCgKICAgICAgICAgICAgZWxlbWVudCwgJ2FbaHJlZl0sIGFyZWFbaHJlZl0sIGlmcmFtZSwgW3RhYmluZGV4XSwgW2NvbnRlbnRFZGl0YWJsZV0nKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgaWYgYSBlbGVtZW50IGlzIHRhYmJhYmxlLiBUbyBiZSB0YWJiYWJsZSwgYSBlbGVtZW50IG11c3QgYmUKICAgICAgICogZm9jdXNhYmxlLCB2aXNpYmxlLCBhbmQgd2l0aCBhIHRhYmluZGV4ICE9PSAtMS4KICAgICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsZW1lbnQKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICovCiAgICAgIGlzVGFiYmFibGUoZWxlbWVudCkgewogICAgICAgIHJldHVybiB0aGlzLmlzRm9jdXNhYmxlKGVsZW1lbnQpICYmCiAgICAgICAgICAgIG1hdGNoZXMkMS5jYWxsKGVsZW1lbnQsICc6bm90KFt0YWJpbmRleD0iLTEiXSknKSAmJgogICAgICAgICAgICB0aGlzLl9pc1Zpc2libGUoZWxlbWVudCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBub3JtYWxpemVkIGVsZW1lbnQgdGFiaW5kZXguIElmIG5vdCBmb2N1c2FibGUsIHJldHVybnMgLTEuCiAgICAgICAqIEl0IGNoZWNrcyBmb3IgdGhlIGF0dHJpYnV0ZSAidGFiaW5kZXgiIGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkKICAgICAgICogYHRhYkluZGV4YCBzaW5jZSBicm93c2VycyBhc3NpZ24gZGlmZmVyZW50IHZhbHVlcyB0byBpdC4KICAgICAgICogZS5nLiBpbiBGaXJlZm94IGA8ZGl2IGNvbnRlbnRlZGl0YWJsZT5gIGhhcyBgdGFiSW5kZXggPSAtMWAKICAgICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsZW1lbnQKICAgICAgICogQHJldHVybiB7IW51bWJlcn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9ub3JtYWxpemVkVGFiSW5kZXgoZWxlbWVudCkgewogICAgICAgIGlmICh0aGlzLmlzRm9jdXNhYmxlKGVsZW1lbnQpKSB7CiAgICAgICAgICB2YXIgdGFiSW5kZXggPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgndGFiaW5kZXgnKSB8fCAwOwogICAgICAgICAgcmV0dXJuIE51bWJlcih0YWJJbmRleCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNlYXJjaGVzIGZvciBub2RlcyB0aGF0IGFyZSB0YWJiYWJsZSBhbmQgYWRkcyB0aGVtIHRvIHRoZSBgcmVzdWx0YCBhcnJheS4KICAgICAgICogUmV0dXJucyBpZiB0aGUgYHJlc3VsdGAgYXJyYXkgbmVlZHMgdG8gYmUgc29ydGVkIGJ5IHRhYmluZGV4LgogICAgICAgKiBAcGFyYW0geyFOb2RlfSBub2RlIFRoZSBzdGFydGluZyBwb2ludCBmb3IgdGhlIHNlYXJjaDsgYWRkZWQgdG8gYHJlc3VsdGAKICAgICAgICogaWYgdGFiYmFibGUuCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PCFIVE1MRWxlbWVudD59IHJlc3VsdAogICAgICAgKiBAcmV0dXJuIHtib29sZWFufQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX2NvbGxlY3RUYWJiYWJsZU5vZGVzKG5vZGUsIHJlc3VsdCkgewogICAgICAgIC8vIElmIG5vdCBhbiBlbGVtZW50IG9yIG5vdCB2aXNpYmxlLCBubyBuZWVkIHRvIGV4cGxvcmUgY2hpbGRyZW4uCiAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT09IE5vZGUuRUxFTUVOVF9OT0RFKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHZhciBlbGVtZW50ID0gLyoqIEB0eXBlIHshSFRNTEVsZW1lbnR9ICovIChub2RlKTsKICAgICAgICBpZiAoIXRoaXMuX2lzVmlzaWJsZShlbGVtZW50KSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICB2YXIgdGFiSW5kZXggPSB0aGlzLl9ub3JtYWxpemVkVGFiSW5kZXgoZWxlbWVudCk7CiAgICAgICAgdmFyIG5lZWRzU29ydCA9IHRhYkluZGV4ID4gMDsKICAgICAgICBpZiAodGFiSW5kZXggPj0gMCkgewogICAgICAgICAgcmVzdWx0LnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIC8vIEluIFNoYWRvd0RPTSB2MSwgdGFiIG9yZGVyIGlzIGFmZmVjdGVkIGJ5IHRoZSBvcmRlciBvZiBkaXN0cnVidXRpb24uCiAgICAgICAgLy8gRS5nLiBnZXRUYWJiYWJsZU5vZGVzKCNyb290KSBpbiBTaGFkb3dET00gdjEgc2hvdWxkIHJldHVybiBbI0EsICNCXTsKICAgICAgICAvLyBpbiBTaGFkb3dET00gdjAgdGFiIG9yZGVyIGlzIG5vdCBhZmZlY3RlZCBieSB0aGUgZGlzdHJ1YnV0aW9uIG9yZGVyLAogICAgICAgIC8vIGluIGZhY3QgZ2V0VGFiYmFibGVOb2Rlcygjcm9vdCkgcmV0dXJucyBbI0IsICNBXS4KICAgICAgICAvLyAgPGRpdiBpZD0icm9vdCI+CiAgICAgICAgLy8gICA8IS0tIHNoYWRvdyAtLT4KICAgICAgICAvLyAgICAgPHNsb3QgbmFtZT0iYSI+CiAgICAgICAgLy8gICAgIDxzbG90IG5hbWU9ImIiPgogICAgICAgIC8vICAgPCEtLSAvc2hhZG93IC0tPgogICAgICAgIC8vICAgPGlucHV0IGlkPSJBIiBzbG90PSJhIj4KICAgICAgICAvLyAgIDxpbnB1dCBpZD0iQiIgc2xvdD0iYiIgdGFiaW5kZXg9IjEiPgogICAgICAgIC8vICA8L2Rpdj4KICAgICAgICAvLyBUT0RPKHZhbGRyaW4pIHN1cHBvcnQgU2hhZG93RE9NIHYxIHdoZW4gdXBncmFkaW5nIHRvIFBvbHltZXIgdjIuMC4KICAgICAgICB2YXIgY2hpbGRyZW47CiAgICAgICAgaWYgKGVsZW1lbnQubG9jYWxOYW1lID09PSAnY29udGVudCcgfHwgZWxlbWVudC5sb2NhbE5hbWUgPT09ICdzbG90JykgewogICAgICAgICAgY2hpbGRyZW4gPSBkb20oZWxlbWVudCkuZ2V0RGlzdHJpYnV0ZWROb2RlcygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBVc2Ugc2hhZG93IHJvb3QgaWYgcG9zc2libGUsIHdpbGwgY2hlY2sgZm9yIGRpc3RyaWJ1dGVkIG5vZGVzLgogICAgICAgICAgY2hpbGRyZW4gPSBkb20oZWxlbWVudC5yb290IHx8IGVsZW1lbnQpLmNoaWxkcmVuOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAvLyBFbnN1cmUgbWV0aG9kIGlzIGFsd2F5cyBpbnZva2VkIHRvIGNvbGxlY3QgdGFiYmFibGUgY2hpbGRyZW4uCiAgICAgICAgICBuZWVkc1NvcnQgPSB0aGlzLl9jb2xsZWN0VGFiYmFibGVOb2RlcyhjaGlsZHJlbltpXSwgcmVzdWx0KSB8fCBuZWVkc1NvcnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZWVkc1NvcnQ7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbGVtZW50IGhhcyBgdmlzaWJpbGl0eTogaGlkZGVuYCBvciBgZGlzcGxheTogbm9uZWAKICAgICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGVsZW1lbnQKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9pc1Zpc2libGUoZWxlbWVudCkgewogICAgICAgIC8vIENoZWNrIGlubGluZSBzdHlsZSBmaXJzdCB0byBzYXZlIGEgcmUtZmxvdy4gSWYgbG9va3MgZ29vZCwgY2hlY2sgYWxzbwogICAgICAgIC8vIGNvbXB1dGVkIHN0eWxlLgogICAgICAgIHZhciBzdHlsZSA9IGVsZW1lbnQuc3R5bGU7CiAgICAgICAgaWYgKHN0eWxlLnZpc2liaWxpdHkgIT09ICdoaWRkZW4nICYmIHN0eWxlLmRpc3BsYXkgIT09ICdub25lJykgewogICAgICAgICAgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KTsKICAgICAgICAgIHJldHVybiAoc3R5bGUudmlzaWJpbGl0eSAhPT0gJ2hpZGRlbicgJiYgc3R5bGUuZGlzcGxheSAhPT0gJ25vbmUnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogU29ydHMgYW4gYXJyYXkgb2YgdGFiYmFibGUgZWxlbWVudHMgYnkgdGFiaW5kZXguIFJldHVybnMgYSBuZXcgYXJyYXkuCiAgICAgICAqIEBwYXJhbSB7IUFycmF5PCFIVE1MRWxlbWVudD59IHRhYmJhYmxlcwogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9zb3J0QnlUYWJJbmRleCh0YWJiYWJsZXMpIHsKICAgICAgICAvLyBJbXBsZW1lbnQgYSBtZXJnZSBzb3J0IGFzIEFycmF5LnByb3RvdHlwZS5zb3J0IGRvZXMgYSBub24tc3RhYmxlIHNvcnQKICAgICAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb3J0CiAgICAgICAgdmFyIGxlbiA9IHRhYmJhYmxlcy5sZW5ndGg7CiAgICAgICAgaWYgKGxlbiA8IDIpIHsKICAgICAgICAgIHJldHVybiB0YWJiYWJsZXM7CiAgICAgICAgfQogICAgICAgIHZhciBwaXZvdCA9IE1hdGguY2VpbChsZW4gLyAyKTsKICAgICAgICB2YXIgbGVmdCA9IHRoaXMuX3NvcnRCeVRhYkluZGV4KHRhYmJhYmxlcy5zbGljZSgwLCBwaXZvdCkpOwogICAgICAgIHZhciByaWdodCA9IHRoaXMuX3NvcnRCeVRhYkluZGV4KHRhYmJhYmxlcy5zbGljZShwaXZvdCkpOwogICAgICAgIHJldHVybiB0aGlzLl9tZXJnZVNvcnRCeVRhYkluZGV4KGxlZnQsIHJpZ2h0KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIE1lcmdlIHNvcnQgaXRlcmF0b3IsIG1lcmdlcyB0aGUgdHdvIGFycmF5cyBpbnRvIG9uZSwgc29ydGVkIGJ5IHRhYiBpbmRleC4KICAgICAgICogQHBhcmFtIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0gbGVmdAogICAgICAgKiBAcGFyYW0geyFBcnJheTwhSFRNTEVsZW1lbnQ+fSByaWdodAogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IUhUTUxFbGVtZW50Pn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9tZXJnZVNvcnRCeVRhYkluZGV4KGxlZnQsIHJpZ2h0KSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIHdoaWxlICgobGVmdC5sZW5ndGggPiAwKSAmJiAocmlnaHQubGVuZ3RoID4gMCkpIHsKICAgICAgICAgIGlmICh0aGlzLl9oYXNMb3dlclRhYk9yZGVyKGxlZnRbMF0sIHJpZ2h0WzBdKSkgewogICAgICAgICAgICByZXN1bHQucHVzaChyaWdodC5zaGlmdCgpKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGxlZnQuc2hpZnQoKSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcmVzdWx0LmNvbmNhdChsZWZ0LCByaWdodCk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGlmIGVsZW1lbnQgYGFgIGhhcyBsb3dlciB0YWIgb3JkZXIgY29tcGFyZWQgdG8gZWxlbWVudCBgYmAKICAgICAgICogKGJvdGggZWxlbWVudHMgYXJlIGFzc3VtZWQgdG8gYmUgZm9jdXNhYmxlIGFuZCB0YWJiYWJsZSkuCiAgICAgICAqIEVsZW1lbnRzIHdpdGggdGFiaW5kZXggPSAwIGhhdmUgbG93ZXIgdGFiIG9yZGVyIGNvbXBhcmVkIHRvIGVsZW1lbnRzCiAgICAgICAqIHdpdGggdGFiaW5kZXggPiAwLgogICAgICAgKiBJZiBib3RoIGhhdmUgc2FtZSB0YWJpbmRleCwgaXQgcmV0dXJucyBmYWxzZS4KICAgICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGEKICAgICAgICogQHBhcmFtIHshSFRNTEVsZW1lbnR9IGIKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9oYXNMb3dlclRhYk9yZGVyKGEsIGIpIHsKICAgICAgICAvLyBOb3JtYWxpemUgdGFiSW5kZXhlcwogICAgICAgIC8vIGUuZy4gaW4gRmlyZWZveCBgPGRpdiBjb250ZW50ZWRpdGFibGU+YCBoYXMgYHRhYkluZGV4ID0gLTFgCiAgICAgICAgdmFyIGF0aSA9IE1hdGgubWF4KGEudGFiSW5kZXgsIDApOwogICAgICAgIHZhciBidGkgPSBNYXRoLm1heChiLnRhYkluZGV4LCAwKTsKICAgICAgICByZXR1cm4gKGF0aSA9PT0gMCB8fCBidGkgPT09IDApID8gYnRpID4gYXRpIDogYXRpID4gYnRpOwogICAgICB9CiAgICB9CgogICAgY29uc3QgSXJvbkZvY3VzYWJsZXNIZWxwZXIgPSBuZXcgSXJvbkZvY3VzYWJsZXNIZWxwZXJDbGFzcygpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qCiAgICBgaXJvbi1vdmVybGF5LWJhY2tkcm9wYCBpcyBhIGJhY2tkcm9wIHVzZWQgYnkgYFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcmAuIEl0CiAgICBzaG91bGQgYmUgYSBzaW5nbGV0b24uCgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZy4KCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLQogICAgYC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLWJhY2tncm91bmQtY29sb3JgIHwgQmFja2Ryb3AgYmFja2dyb3VuZCBjb2xvciB8ICMwMDAKICAgIGAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGFjaXR5YCAgICAgICAgICB8IEJhY2tkcm9wIG9wYWNpdHkgfCAwLjYKICAgIGAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcGAgICAgICAgICAgICAgICAgICB8IE1peGluIGFwcGxpZWQgdG8gYGlyb24tb3ZlcmxheS1iYWNrZHJvcGAuICAgICAgICAgICAgICAgICAgICAgIHwge30KICAgIGAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGVuZWRgICAgICAgICAgICB8IE1peGluIGFwcGxpZWQgdG8gYGlyb24tb3ZlcmxheS1iYWNrZHJvcGAgd2hlbiBpdCBpcyBkaXNwbGF5ZWQgfCB7fQogICAgKi8KICAgIFBvbHltZXIoewogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0taXJvbi1vdmVybGF5LWJhY2tkcm9wLWJhY2tncm91bmQtY29sb3IsICMwMDApOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjJzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcDsKICAgICAgfQoKICAgICAgOmhvc3QoLm9wZW5lZCkgewogICAgICAgIG9wYWNpdHk6IHZhcigtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGFjaXR5LCAwLjYpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICAgIEBhcHBseSAtLWlyb24tb3ZlcmxheS1iYWNrZHJvcC1vcGVuZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLAoKICAgICAgaXM6ICdpcm9uLW92ZXJsYXktYmFja2Ryb3AnLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGJhY2tkcm9wIGlzIG9wZW5lZC4KICAgICAgICAgKi8KICAgICAgICBvcGVuZWQ6IHsKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICBvYnNlcnZlcjogJ19vcGVuZWRDaGFuZ2VkJywKICAgICAgICB9CgogICAgICB9LAoKICAgICAgbGlzdGVuZXJzOiB7CiAgICAgICAgJ3RyYW5zaXRpb25lbmQnOiAnX29uVHJhbnNpdGlvbmVuZCcsCiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIGNyZWF0ZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFVzZWQgdG8gY2FuY2VsIHByZXZpb3VzIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxscyB3aGVuIG9wZW5lZCBjaGFuZ2VzLgogICAgICAgIHRoaXMuX19vcGVuZWRSYWYgPSBudWxsOwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5vcGVuZWQgJiYgdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQXBwZW5kcyB0aGUgYmFja2Ryb3AgdG8gZG9jdW1lbnQgYm9keSBpZiBuZWVkZWQuCiAgICAgICAqLwogICAgICBwcmVwYXJlOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5vcGVuZWQgJiYgIXRoaXMucGFyZW50Tm9kZSkgewogICAgICAgICAgZG9tKGRvY3VtZW50LmJvZHkpLmFwcGVuZENoaWxkKHRoaXMpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTaG93cyB0aGUgYmFja2Ryb3AuCiAgICAgICAqLwogICAgICBvcGVuOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLm9wZW5lZCA9IHRydWU7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSGlkZXMgdGhlIGJhY2tkcm9wLgogICAgICAgKi8KICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMub3BlbmVkID0gZmFsc2U7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVtb3ZlcyB0aGUgYmFja2Ryb3AgZnJvbSBkb2N1bWVudCBib2R5IGlmIG5lZWRlZC4KICAgICAgICovCiAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMub3BlbmVkICYmIHRoaXMucGFyZW50Tm9kZSA9PT0gZG9jdW1lbnQuYm9keSkgewogICAgICAgICAgZG9tKHRoaXMucGFyZW50Tm9kZSkucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX29uVHJhbnNpdGlvbmVuZDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoZXZlbnQgJiYgZXZlbnQudGFyZ2V0ID09PSB0aGlzKSB7CiAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gb3BlbmVkCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfb3BlbmVkQ2hhbmdlZDogZnVuY3Rpb24ob3BlbmVkKSB7CiAgICAgICAgaWYgKG9wZW5lZCkgewogICAgICAgICAgLy8gQXV0by1hdHRhY2guCiAgICAgICAgICB0aGlzLnByZXBhcmUoKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gQW5pbWF0aW9uIG1pZ2h0IGJlIGRpc2FibGVkIHZpYSB0aGUgbWl4aW4gb3Igb3BhY2l0eSBjdXN0b20gcHJvcGVydHkuCiAgICAgICAgICAvLyBJZiBpdCBpcyBkaXNhYmxlZCBpbiBvdGhlciB3YXlzLCBpdCdzIHVwIHRvIHRoZSB1c2VyIHRvIGNhbGwgY29tcGxldGUuCiAgICAgICAgICB2YXIgY3MgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0aGlzKTsKICAgICAgICAgIGlmIChjcy50cmFuc2l0aW9uRHVyYXRpb24gPT09ICcwcycgfHwgY3Mub3BhY2l0eSA9PSAwKSB7CiAgICAgICAgICAgIHRoaXMuY29tcGxldGUoKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICghdGhpcy5pc0F0dGFjaGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBBbHdheXMgY2FuY2VsIHByZXZpb3VzIHJlcXVlc3RBbmltYXRpb25GcmFtZS4KICAgICAgICBpZiAodGhpcy5fX29wZW5lZFJhZikgewogICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX19vcGVuZWRSYWYpOwogICAgICAgICAgdGhpcy5fX29wZW5lZFJhZiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIEZvcmNlIHJlbGF5b3V0IHRvIGVuc3VyZSBwcm9wZXIgdHJhbnNpdGlvbnMuCiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKICAgICAgICB0aGlzLl9fb3BlbmVkUmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbigpIHsKICAgICAgICAgIHRoaXMuX19vcGVuZWRSYWYgPSBudWxsOwogICAgICAgICAgdGhpcy50b2dnbGVDbGFzcygnb3BlbmVkJywgdGhpcy5vcGVuZWQpOwogICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogQHBhY2thZ2UKICAgICAqLwogICAgY2xhc3MgSXJvbk92ZXJsYXlNYW5hZ2VyQ2xhc3MgewogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgdGhlIG9wZW5lZCBvdmVybGF5cy4KICAgICAgICAgKiBAcHJpdmF0ZSB7IUFycmF5PCFFbGVtZW50Pn0KICAgICAgICAgKi8KICAgICAgICB0aGlzLl9vdmVybGF5cyA9IFtdOwoKICAgICAgICAvKioKICAgICAgICAgKiBpZnJhbWVzIGhhdmUgYSBkZWZhdWx0IHotaW5kZXggb2YgMTAwLAogICAgICAgICAqIHNvIHRoaXMgZGVmYXVsdCBzaG91bGQgYmUgYXQgbGVhc3QgdGhhdC4KICAgICAgICAgKiBAcHJpdmF0ZSB7bnVtYmVyfQogICAgICAgICAqLwogICAgICAgIHRoaXMuX21pbmltdW1aID0gMTAxOwoKICAgICAgICAvKioKICAgICAgICAgKiBNZW1vaXplZCBiYWNrZHJvcCBlbGVtZW50LgogICAgICAgICAqIEBwcml2YXRlIHtFbGVtZW50fG51bGx9CiAgICAgICAgICovCiAgICAgICAgdGhpcy5fYmFja2Ryb3BFbGVtZW50ID0gbnVsbDsKCiAgICAgICAgLy8gRW5hYmxlIGRvY3VtZW50LXdpZGUgdGFwIHJlY29nbml6ZXIuCiAgICAgICAgLy8gTk9URTogVXNlIHVzZUNhcHR1cmU9dHJ1ZSB0byBhdm9pZCBhY2NpZGVudGFsbHkgcHJldmVudGlvbiBvZiB0aGUgY2xvc2luZwogICAgICAgIC8vIG9mIGFuIG92ZXJsYXkgdmlhIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpLiBUaGUgb25seSB3YXkgdG8gcHJldmVudAogICAgICAgIC8vIGNsb3Npbmcgb2YgYW4gb3ZlcmxheSBzaG91bGQgYmUgdGhyb3VnaCBpdHMgQVBJcy4KICAgICAgICAvLyBOT1RFOiBlbmFibGUgdGFwIG9uIDxodG1sPiB0byB3b3JrYXJvdW5kIFBvbHltZXIvcG9seW1lciM0NDU5CiAgICAgICAgLy8gUGFzcyBuby1vcCBmdW5jdGlvbiBiZWNhdXNlIE1TRWRnZSAxNSBkb2Vzbid0IGhhbmRsZSBudWxsIGFzIDJuZCBhcmd1bWVudAogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzg2MwogICAgICAgIGFkZExpc3RlbmVyKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgJ3RhcCcsIGZ1bmN0aW9uKCkge30pOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RhcCcsIHRoaXMuX29uQ2FwdHVyZUNsaWNrLmJpbmQodGhpcyksIHRydWUpOwogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fb25DYXB0dXJlRm9jdXMuYmluZCh0aGlzKSwgdHJ1ZSk7CiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICAgJ2tleWRvd24nLCB0aGlzLl9vbkNhcHR1cmVLZXlEb3duLmJpbmQodGhpcyksIHRydWUpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIHNoYXJlZCBiYWNrZHJvcCBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHshRWxlbWVudH0gYmFja2Ryb3BFbGVtZW50CiAgICAgICAqLwogICAgICBnZXQgYmFja2Ryb3BFbGVtZW50KCkgewogICAgICAgIGlmICghdGhpcy5fYmFja2Ryb3BFbGVtZW50KSB7CiAgICAgICAgICB0aGlzLl9iYWNrZHJvcEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpcm9uLW92ZXJsYXktYmFja2Ryb3AnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2tkcm9wRWxlbWVudDsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRoZSBkZWVwZXN0IGFjdGl2ZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHshRWxlbWVudH0gYWN0aXZlRWxlbWVudCB0aGUgYWN0aXZlIGVsZW1lbnQKICAgICAgICovCiAgICAgIGdldCBkZWVwQWN0aXZlRWxlbWVudCgpIHsKICAgICAgICB2YXIgYWN0aXZlID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgICAgICAvLyBkb2N1bWVudC5hY3RpdmVFbGVtZW50IGNhbiBiZSBudWxsCiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0RvY3VtZW50L2FjdGl2ZUVsZW1lbnQKICAgICAgICAvLyBJbiBJRSAxMSwgaXQgY2FuIGFsc28gYmUgYW4gb2JqZWN0IHdoZW4gb3BlcmF0aW5nIGluIGlmcmFtZXMuCiAgICAgICAgLy8gSW4gdGhlc2UgY2FzZXMsIGRlZmF1bHQgaXQgdG8gZG9jdW1lbnQuYm9keS4KICAgICAgICBpZiAoIWFjdGl2ZSB8fCBhY3RpdmUgaW5zdGFuY2VvZiBFbGVtZW50ID09PSBmYWxzZSkgewogICAgICAgICAgYWN0aXZlID0gZG9jdW1lbnQuYm9keTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKGFjdGl2ZS5yb290ICYmIGRvbShhY3RpdmUucm9vdCkuYWN0aXZlRWxlbWVudCkgewogICAgICAgICAgYWN0aXZlID0gZG9tKGFjdGl2ZS5yb290KS5hY3RpdmVFbGVtZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gYWN0aXZlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQnJpbmdzIHRoZSBvdmVybGF5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggdG8gdGhlIGZyb250LgogICAgICAgKiBAcGFyYW0ge251bWJlcn0gaQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250KGkpIHsKICAgICAgICB2YXIgb3ZlcmxheSA9IHRoaXMuX292ZXJsYXlzW2ldOwogICAgICAgIGlmICghb3ZlcmxheSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2YXIgbGFzdEkgPSB0aGlzLl9vdmVybGF5cy5sZW5ndGggLSAxOwogICAgICAgIHZhciBjdXJyZW50T3ZlcmxheSA9IHRoaXMuX292ZXJsYXlzW2xhc3RJXTsKICAgICAgICAvLyBFbnN1cmUgYWx3YXlzLW9uLXRvcCBvdmVybGF5IHN0YXlzIG9uIHRvcC4KICAgICAgICBpZiAoY3VycmVudE92ZXJsYXkgJiYKICAgICAgICAgICAgdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KG92ZXJsYXksIGN1cnJlbnRPdmVybGF5KSkgewogICAgICAgICAgbGFzdEktLTsKICAgICAgICB9CiAgICAgICAgLy8gSWYgYWxyZWFkeSB0aGUgdG9wIGVsZW1lbnQsIHJldHVybi4KICAgICAgICBpZiAoaSA+PSBsYXN0SSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBVcGRhdGUgei1pbmRleCB0byBiZSBvbiB0b3AuCiAgICAgICAgdmFyIG1pbmltdW1aID0gTWF0aC5tYXgodGhpcy5jdXJyZW50T3ZlcmxheVooKSwgdGhpcy5fbWluaW11bVopOwogICAgICAgIGlmICh0aGlzLl9nZXRaKG92ZXJsYXkpIDw9IG1pbmltdW1aKSB7CiAgICAgICAgICB0aGlzLl9hcHBseU92ZXJsYXlaKG92ZXJsYXksIG1pbmltdW1aKTsKICAgICAgICB9CgogICAgICAgIC8vIFNoaWZ0IG90aGVyIG92ZXJsYXlzIGJlaGluZCB0aGUgbmV3IG9uIHRvcC4KICAgICAgICB3aGlsZSAoaSA8IGxhc3RJKSB7CiAgICAgICAgICB0aGlzLl9vdmVybGF5c1tpXSA9IHRoaXMuX292ZXJsYXlzW2kgKyAxXTsKICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb3ZlcmxheXNbbGFzdEldID0gb3ZlcmxheTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFkZHMgdGhlIG92ZXJsYXkgYW5kIHVwZGF0ZXMgaXRzIHotaW5kZXggaWYgaXQncyBvcGVuZWQsIG9yIHJlbW92ZXMgaXQgaWYKICAgICAgICogaXQncyBjbG9zZWQuIEFsc28gdXBkYXRlcyB0aGUgYmFja2Ryb3Agei1pbmRleC4KICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gb3ZlcmxheQogICAgICAgKi8KICAgICAgYWRkT3JSZW1vdmVPdmVybGF5KG92ZXJsYXkpIHsKICAgICAgICBpZiAob3ZlcmxheS5vcGVuZWQpIHsKICAgICAgICAgIHRoaXMuYWRkT3ZlcmxheShvdmVybGF5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5yZW1vdmVPdmVybGF5KG92ZXJsYXkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFRyYWNrcyBvdmVybGF5cyBmb3Igei1pbmRleCBhbmQgZm9jdXMgbWFuYWdlbWVudC4KICAgICAgICogRW5zdXJlcyB0aGUgbGFzdCBhZGRlZCBvdmVybGF5IHdpdGggYWx3YXlzLW9uLXRvcCByZW1haW5zIG9uIHRvcC4KICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gb3ZlcmxheQogICAgICAgKi8KICAgICAgYWRkT3ZlcmxheShvdmVybGF5KSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLl9vdmVybGF5cy5pbmRleE9mKG92ZXJsYXkpOwogICAgICAgIGlmIChpID49IDApIHsKICAgICAgICAgIHRoaXMuX2JyaW5nT3ZlcmxheUF0SW5kZXhUb0Zyb250KGkpOwogICAgICAgICAgdGhpcy50cmFja0JhY2tkcm9wKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciBpbnNlcnRpb25JbmRleCA9IHRoaXMuX292ZXJsYXlzLmxlbmd0aDsKICAgICAgICB2YXIgY3VycmVudE92ZXJsYXkgPSB0aGlzLl9vdmVybGF5c1tpbnNlcnRpb25JbmRleCAtIDFdOwogICAgICAgIHZhciBtaW5pbXVtWiA9IE1hdGgubWF4KHRoaXMuX2dldFooY3VycmVudE92ZXJsYXkpLCB0aGlzLl9taW5pbXVtWik7CiAgICAgICAgdmFyIG5ld1ogPSB0aGlzLl9nZXRaKG92ZXJsYXkpOwoKICAgICAgICAvLyBFbnN1cmUgYWx3YXlzLW9uLXRvcCBvdmVybGF5IHN0YXlzIG9uIHRvcC4KICAgICAgICBpZiAoY3VycmVudE92ZXJsYXkgJiYKICAgICAgICAgICAgdGhpcy5fc2hvdWxkQmVCZWhpbmRPdmVybGF5KG92ZXJsYXksIGN1cnJlbnRPdmVybGF5KSkgewogICAgICAgICAgLy8gVGhpcyBidW1wcyB0aGUgei1pbmRleCBvZiArMi4KICAgICAgICAgIHRoaXMuX2FwcGx5T3ZlcmxheVooY3VycmVudE92ZXJsYXksIG1pbmltdW1aKTsKICAgICAgICAgIGluc2VydGlvbkluZGV4LS07CiAgICAgICAgICAvLyBVcGRhdGUgbWluaW11bVogdG8gbWF0Y2ggcHJldmlvdXMgb3ZlcmxheSdzIHotaW5kZXguCiAgICAgICAgICB2YXIgcHJldmlvdXNPdmVybGF5ID0gdGhpcy5fb3ZlcmxheXNbaW5zZXJ0aW9uSW5kZXggLSAxXTsKICAgICAgICAgIG1pbmltdW1aID0gTWF0aC5tYXgodGhpcy5fZ2V0WihwcmV2aW91c092ZXJsYXkpLCB0aGlzLl9taW5pbXVtWik7CiAgICAgICAgfQoKICAgICAgICAvLyBVcGRhdGUgei1pbmRleCBhbmQgaW5zZXJ0IG92ZXJsYXkuCiAgICAgICAgaWYgKG5ld1ogPD0gbWluaW11bVopIHsKICAgICAgICAgIHRoaXMuX2FwcGx5T3ZlcmxheVoob3ZlcmxheSwgbWluaW11bVopOwogICAgICAgIH0KICAgICAgICB0aGlzLl9vdmVybGF5cy5zcGxpY2UoaW5zZXJ0aW9uSW5kZXgsIDAsIG92ZXJsYXkpOwoKICAgICAgICB0aGlzLnRyYWNrQmFja2Ryb3AoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IG92ZXJsYXkKICAgICAgICovCiAgICAgIHJlbW92ZU92ZXJsYXkob3ZlcmxheSkgewogICAgICAgIHZhciBpID0gdGhpcy5fb3ZlcmxheXMuaW5kZXhPZihvdmVybGF5KTsKICAgICAgICBpZiAoaSA9PT0gLTEpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb3ZlcmxheXMuc3BsaWNlKGksIDEpOwoKICAgICAgICB0aGlzLnRyYWNrQmFja2Ryb3AoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3ZlcmxheS4KICAgICAgICogQHJldHVybiB7IUVsZW1lbnR8dW5kZWZpbmVkfQogICAgICAgKi8KICAgICAgY3VycmVudE92ZXJsYXkoKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLl9vdmVybGF5cy5sZW5ndGggLSAxOwogICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5c1tpXTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgb3ZlcmxheSB6LWluZGV4LgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICAgICAqLwogICAgICBjdXJyZW50T3ZlcmxheVooKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFoodGhpcy5jdXJyZW50T3ZlcmxheSgpKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgdGhhdCB0aGUgbWluaW11bSB6LWluZGV4IG9mIG5ldyBvdmVybGF5cyBpcyBhdCBsZWFzdCBgbWluaW11bVpgLgogICAgICAgKiBUaGlzIGRvZXMgbm90IGVmZmVjdCB0aGUgei1pbmRleCBvZiBhbnkgZXhpc3Rpbmcgb3ZlcmxheXMuCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBtaW5pbXVtWgogICAgICAgKi8KICAgICAgZW5zdXJlTWluaW11bVoobWluaW11bVopIHsKICAgICAgICB0aGlzLl9taW5pbXVtWiA9IE1hdGgubWF4KHRoaXMuX21pbmltdW1aLCBtaW5pbXVtWik7CiAgICAgIH0KCiAgICAgIGZvY3VzT3ZlcmxheSgpIHsKICAgICAgICB2YXIgY3VycmVudCA9IC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY3VycmVudE92ZXJsYXkoKSk7CiAgICAgICAgaWYgKGN1cnJlbnQpIHsKICAgICAgICAgIGN1cnJlbnQuX2FwcGx5Rm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBVcGRhdGVzIHRoZSBiYWNrZHJvcCB6LWluZGV4LgogICAgICAgKi8KICAgICAgdHJhY2tCYWNrZHJvcCgpIHsKICAgICAgICB2YXIgb3ZlcmxheSA9IHRoaXMuX292ZXJsYXlXaXRoQmFja2Ryb3AoKTsKICAgICAgICAvLyBBdm9pZCBjcmVhdGluZyB0aGUgYmFja2Ryb3AgaWYgdGhlcmUgaXMgbm8gb3ZlcmxheSB3aXRoIGJhY2tkcm9wLgogICAgICAgIGlmICghb3ZlcmxheSAmJiAhdGhpcy5fYmFja2Ryb3BFbGVtZW50KSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuYmFja2Ryb3BFbGVtZW50LnN0eWxlLnpJbmRleCA9IHRoaXMuX2dldFoob3ZlcmxheSkgLSAxOwogICAgICAgIHRoaXMuYmFja2Ryb3BFbGVtZW50Lm9wZW5lZCA9ICEhb3ZlcmxheTsKICAgICAgICAvLyBQcm9wZXJ0eSBvYnNlcnZlcnMgYXJlIG5vdCBmaXJlZCB1bnRpbCBlbGVtZW50IGlzIGF0dGFjaGVkCiAgICAgICAgLy8gaW4gUG9seW1lciAyLngsIHNvIHdlIGVuc3VyZSBlbGVtZW50IGlzIGF0dGFjaGVkIGlmIG5lZWRlZC4KICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2lzc3Vlcy80NTI2CiAgICAgICAgdGhpcy5iYWNrZHJvcEVsZW1lbnQucHJlcGFyZSgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHJldHVybiB7IUFycmF5PCFFbGVtZW50Pn0KICAgICAgICovCiAgICAgIGdldEJhY2tkcm9wcygpIHsKICAgICAgICB2YXIgYmFja2Ryb3BzID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9vdmVybGF5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlzW2ldLndpdGhCYWNrZHJvcCkgewogICAgICAgICAgICBiYWNrZHJvcHMucHVzaCh0aGlzLl9vdmVybGF5c1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBiYWNrZHJvcHM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSB6LWluZGV4IGZvciB0aGUgYmFja2Ryb3AuCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0KICAgICAgICovCiAgICAgIGJhY2tkcm9wWigpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Wih0aGlzLl9vdmVybGF5V2l0aEJhY2tkcm9wKCkpIC0gMTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHRvcCBvcGVuZWQgb3ZlcmxheSB0aGF0IGhhcyBhIGJhY2tkcm9wLgogICAgICAgKiBAcmV0dXJuIHshRWxlbWVudHx1bmRlZmluZWR9CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfb3ZlcmxheVdpdGhCYWNrZHJvcCgpIHsKICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5fb3ZlcmxheXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5c1tpXS53aXRoQmFja2Ryb3ApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENhbGN1bGF0ZXMgdGhlIG1pbmltdW0gei1pbmRleCBmb3IgdGhlIG92ZXJsYXkuCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudD19IG92ZXJsYXkKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9nZXRaKG92ZXJsYXkpIHsKICAgICAgICB2YXIgeiA9IHRoaXMuX21pbmltdW1aOwogICAgICAgIGlmIChvdmVybGF5KSB7CiAgICAgICAgICB2YXIgejEgPSBOdW1iZXIoCiAgICAgICAgICAgICAgb3ZlcmxheS5zdHlsZS56SW5kZXggfHwgd2luZG93LmdldENvbXB1dGVkU3R5bGUob3ZlcmxheSkuekluZGV4KTsKICAgICAgICAgIC8vIENoZWNrIGlmIGlzIGEgbnVtYmVyCiAgICAgICAgICAvLyBOdW1iZXIuaXNOYU4gbm90IHN1cHBvcnRlZCBpbiBJRSAxMCsKICAgICAgICAgIGlmICh6MSA9PT0gejEpIHsKICAgICAgICAgICAgeiA9IHoxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gejsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7IUVsZW1lbnR9IGVsZW1lbnQKICAgICAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB6CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfc2V0WihlbGVtZW50LCB6KSB7CiAgICAgICAgZWxlbWVudC5zdHlsZS56SW5kZXggPSB6OwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gb3ZlcmxheQogICAgICAgKiBAcGFyYW0ge251bWJlcn0gYWJvdmVaCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfYXBwbHlPdmVybGF5WihvdmVybGF5LCBhYm92ZVopIHsKICAgICAgICB0aGlzLl9zZXRaKG92ZXJsYXksIGFib3ZlWiArIDIpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgZGVlcGVzdCBvdmVybGF5IGluIHRoZSBwYXRoLgogICAgICAgKiBAcGFyYW0geyFBcnJheTwhRWxlbWVudD49fSBwYXRoCiAgICAgICAqIEByZXR1cm4geyFFbGVtZW50fHVuZGVmaW5lZH0KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9vdmVybGF5SW5QYXRoKHBhdGgpIHsKICAgICAgICBwYXRoID0gcGF0aCB8fCBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChwYXRoW2ldLl9tYW5hZ2VyID09PSB0aGlzKSB7CiAgICAgICAgICAgIHJldHVybiBwYXRoW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEVuc3VyZXMgdGhlIGNsaWNrIGV2ZW50IGlzIGRlbGVnYXRlZCB0byB0aGUgcmlnaHQgb3ZlcmxheS4KICAgICAgICogQHBhcmFtIHshRXZlbnR9IGV2ZW50CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfb25DYXB0dXJlQ2xpY2soZXZlbnQpIHsKICAgICAgICB2YXIgaSA9IHRoaXMuX292ZXJsYXlzLmxlbmd0aCAtIDE7CiAgICAgICAgaWYgKGkgPT09IC0xKQogICAgICAgICAgcmV0dXJuOwogICAgICAgIHZhciBwYXRoID0gLyoqIEB0eXBlIHshQXJyYXk8IUV2ZW50VGFyZ2V0Pn0gKi8gKGRvbShldmVudCkucGF0aCk7CiAgICAgICAgdmFyIG92ZXJsYXk7CiAgICAgICAgLy8gQ2hlY2sgaWYgY2xpY2tlZCBvdXRzaWRlIG9mIG92ZXJsYXkuCiAgICAgICAgd2hpbGUgKChvdmVybGF5ID0gLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb3ZlcmxheXNbaV0pKSAmJgogICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5SW5QYXRoKHBhdGgpICE9PSBvdmVybGF5KSB7CiAgICAgICAgICBvdmVybGF5Ll9vbkNhcHR1cmVDbGljayhldmVudCk7CiAgICAgICAgICBpZiAob3ZlcmxheS5hbGxvd0NsaWNrVGhyb3VnaCkgewogICAgICAgICAgICBpLS07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFbnN1cmVzIHRoZSBmb2N1cyBldmVudCBpcyBkZWxlZ2F0ZWQgdG8gdGhlIHJpZ2h0IG92ZXJsYXkuCiAgICAgICAqIEBwYXJhbSB7IUV2ZW50fSBldmVudAogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX29uQ2FwdHVyZUZvY3VzKGV2ZW50KSB7CiAgICAgICAgdmFyIG92ZXJsYXkgPSAvKiogQHR5cGUgez99ICovICh0aGlzLmN1cnJlbnRPdmVybGF5KCkpOwogICAgICAgIGlmIChvdmVybGF5KSB7CiAgICAgICAgICBvdmVybGF5Ll9vbkNhcHR1cmVGb2N1cyhldmVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogRW5zdXJlcyBUQUIgYW5kIEVTQyBrZXlib2FyZCBldmVudHMgYXJlIGRlbGVnYXRlZCB0byB0aGUgcmlnaHQgb3ZlcmxheS4KICAgICAgICogQHBhcmFtIHshRXZlbnR9IGV2ZW50CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfb25DYXB0dXJlS2V5RG93bihldmVudCkgewogICAgICAgIHZhciBvdmVybGF5ID0gLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5jdXJyZW50T3ZlcmxheSgpKTsKICAgICAgICBpZiAob3ZlcmxheSkgewogICAgICAgICAgaWYgKElyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhldmVudCwgJ2VzYycpKSB7CiAgICAgICAgICAgIG92ZXJsYXkuX29uQ2FwdHVyZUVzYyhldmVudCk7CiAgICAgICAgICB9IGVsc2UgaWYgKElyb25BMTF5S2V5c0JlaGF2aW9yLmtleWJvYXJkRXZlbnRNYXRjaGVzS2V5cyhldmVudCwgJ3RhYicpKSB7CiAgICAgICAgICAgIG92ZXJsYXkuX29uQ2FwdHVyZVRhYihldmVudCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogUmV0dXJucyBpZiB0aGUgb3ZlcmxheTEgc2hvdWxkIGJlIGJlaGluZCBvdmVybGF5Mi4KICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gb3ZlcmxheTEKICAgICAgICogQHBhcmFtIHshRWxlbWVudH0gb3ZlcmxheTIKICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICogQHN1cHByZXNzIHttaXNzaW5nUHJvcGVydGllc30KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9zaG91bGRCZUJlaGluZE92ZXJsYXkob3ZlcmxheTEsIG92ZXJsYXkyKSB7CiAgICAgICAgcmV0dXJuICFvdmVybGF5MS5hbHdheXNPblRvcCAmJiBvdmVybGF5Mi5hbHdheXNPblRvcDsKICAgICAgfQogICAgfQogICAgY29uc3QgSXJvbk92ZXJsYXlNYW5hZ2VyID0gbmV3IElyb25PdmVybGF5TWFuYWdlckNsYXNzKCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCiAgICAvKioKICAgICAqIFVzZWQgdG8gY2FsY3VsYXRlIHRoZSBzY3JvbGwgZGlyZWN0aW9uIGR1cmluZyB0b3VjaCBldmVudHMuCiAgICAgKiBAdHlwZSB7IU9iamVjdH0KICAgICAqLwogICAgdmFyIGxhc3RUb3VjaFBvc2l0aW9uID0ge3BhZ2VYOiAwLCBwYWdlWTogMH07CiAgICAvKioKICAgICAqIFVzZWQgdG8gYXZvaWQgY29tcHV0aW5nIGV2ZW50LnBhdGggYW5kIGZpbHRlciBzY3JvbGxhYmxlIG5vZGVzIChiZXR0ZXIgcGVyZikuCiAgICAgKiBAdHlwZSB7P0V2ZW50VGFyZ2V0fQogICAgICovCiAgICB2YXIgbGFzdFJvb3RUYXJnZXQgPSBudWxsOwogICAgLyoqCiAgICAgKiBAdHlwZSB7IUFycmF5PCFOb2RlPn0KICAgICAqLwogICAgdmFyIGxhc3RTY3JvbGxhYmxlTm9kZXMgPSBbXTsKICAgIC8qKgogICAgICogQHR5cGUgeyFBcnJheTxzdHJpbmc+fQogICAgICovCiAgICB2YXIgc2Nyb2xsRXZlbnRzID0gWwogICAgICAvLyBNb2Rlcm4gYHdoZWVsYCBldmVudCBmb3IgbW91c2Ugd2hlZWwgc2Nyb2xsaW5nOgogICAgICAnd2hlZWwnLAogICAgICAvLyBPbGRlciwgbm9uLXN0YW5kYXJkIGBtb3VzZXdoZWVsYCBldmVudCBmb3Igc29tZSBGRjoKICAgICAgJ21vdXNld2hlZWwnLAogICAgICAvLyBJRToKICAgICAgJ0RPTU1vdXNlU2Nyb2xsJywKICAgICAgLy8gVG91Y2ggZW5hYmxlZCBkZXZpY2VzCiAgICAgICd0b3VjaHN0YXJ0JywKICAgICAgJ3RvdWNobW92ZScKICAgIF07CiAgICAvLyBtdXN0IGJlIGRlZmluZWQgZm9yIG1vZHVsaXplcgogICAgdmFyIF9ib3VuZFNjcm9sbEhhbmRsZXI7CgogICAgLyoqCiAgICAgKiBUaGUgY3VycmVudCBlbGVtZW50IHRoYXQgZGVmaW5lcyB0aGUgRE9NIGJvdW5kYXJpZXMgb2YgdGhlCiAgICAgKiBzY3JvbGwgbG9jay4gVGhpcyBpcyBhbHdheXMgdGhlIG1vc3QgcmVjZW50bHkgbG9ja2luZyBlbGVtZW50LgogICAgICoKICAgICAqIEB0eXBlIHshTm9kZXx1bmRlZmluZWR9CiAgICAgKi8KICAgIHZhciBjdXJyZW50TG9ja2luZ0VsZW1lbnQ7CgogICAgLyoqCiAgICAgKiBQdXNoIGFuIGVsZW1lbnQgb250byB0aGUgY3VycmVudCBzY3JvbGwgbG9jayBzdGFjay4gVGhlIG1vc3QgcmVjZW50bHkKICAgICAqIHB1c2hlZCBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW4gd2lsbCBiZSBjb25zaWRlcmVkIHNjcm9sbGFibGUuIEFsbAogICAgICogb3RoZXIgZWxlbWVudHMgd2lsbCBub3QgYmUgc2Nyb2xsYWJsZS4KICAgICAqCiAgICAgKiBTY3JvbGwgbG9ja2luZyBpcyBpbXBsZW1lbnRlZCBhcyBhIHN0YWNrIHNvIHRoYXQgY2FzZXMgc3VjaCBhcwogICAgICogZHJvcGRvd25zIHdpdGhpbiBkcm9wZG93bnMgYXJlIGhhbmRsZWQgd2VsbC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0aGF0IHNob3VsZCBsb2NrIHNjcm9sbC4KICAgICAqLwogICAgZnVuY3Rpb24gcHVzaFNjcm9sbExvY2soZWxlbWVudCkgewogICAgICAvLyBQcmV2ZW50IHB1c2hpbmcgdGhlIHNhbWUgZWxlbWVudCB0d2ljZQogICAgICBpZiAoX2xvY2tpbmdFbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpID49IDApIHsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmIChfbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgIF9sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zKCk7CiAgICAgIH0KCiAgICAgIF9sb2NraW5nRWxlbWVudHMucHVzaChlbGVtZW50KTsKICAgICAgY3VycmVudExvY2tpbmdFbGVtZW50ID0gX2xvY2tpbmdFbGVtZW50c1tfbG9ja2luZ0VsZW1lbnRzLmxlbmd0aCAtIDFdOwogICAgfQoKICAgIC8qKgogICAgICogUmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSB0aGUgc2Nyb2xsIGxvY2sgc3RhY2suIFRoZSBlbGVtZW50IGJlaW5nCiAgICAgKiByZW1vdmVkIGRvZXMgbm90IG5lZWQgdG8gYmUgdGhlIG1vc3QgcmVjZW50bHkgcHVzaGVkIGVsZW1lbnQuIEhvd2V2ZXIsCiAgICAgKiB0aGUgc2Nyb2xsIGxvY2sgY29uc3RyYWludHMgb25seSBjaGFuZ2Ugd2hlbiB0aGUgbW9zdCByZWNlbnRseSBwdXNoZWQKICAgICAqIGVsZW1lbnQgaXMgcmVtb3ZlZC4KICAgICAqCiAgICAgKiBAcGFyYW0geyFIVE1MRWxlbWVudH0gZWxlbWVudCBUaGUgZWxlbWVudCB0byByZW1vdmUgZnJvbSB0aGUgc2Nyb2xsCiAgICAgKiBsb2NrIHN0YWNrLgogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVTY3JvbGxMb2NrKGVsZW1lbnQpIHsKICAgICAgdmFyIGluZGV4ID0gX2xvY2tpbmdFbGVtZW50cy5pbmRleE9mKGVsZW1lbnQpOwoKICAgICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgX2xvY2tpbmdFbGVtZW50cy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICBjdXJyZW50TG9ja2luZ0VsZW1lbnQgPSBfbG9ja2luZ0VsZW1lbnRzW19sb2NraW5nRWxlbWVudHMubGVuZ3RoIC0gMV07CgogICAgICBpZiAoX2xvY2tpbmdFbGVtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICBfdW5sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zKCk7CiAgICAgIH0KICAgIH0KCiAgICBjb25zdCBfbG9ja2luZ0VsZW1lbnRzID0gW107CgogICAgZnVuY3Rpb24gX3Njcm9sbEludGVyYWN0aW9uSGFuZGxlcihldmVudCkgewogICAgICAvLyBBdm9pZCBjYW5jZWxpbmcgYW4gZXZlbnQgd2l0aCBjYW5jZWxhYmxlPWZhbHNlLCBlLmcuIHNjcm9sbGluZyBpcyBpbgogICAgICAvLyBwcm9ncmVzcyBhbmQgY2Fubm90IGJlIGludGVycnVwdGVkLgogICAgICBpZiAoZXZlbnQuY2FuY2VsYWJsZSAmJiBfc2hvdWxkUHJldmVudFNjcm9sbGluZyhldmVudCkpIHsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9CiAgICAgIC8vIElmIGV2ZW50IGhhcyB0YXJnZXRUb3VjaGVzICh0b3VjaCBldmVudCksIHVwZGF0ZSBsYXN0IHRvdWNoIHBvc2l0aW9uLgogICAgICBpZiAoZXZlbnQudGFyZ2V0VG91Y2hlcykgewogICAgICAgIHZhciB0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07CiAgICAgICAgbGFzdFRvdWNoUG9zaXRpb24ucGFnZVggPSB0b3VjaC5wYWdlWDsKICAgICAgICBsYXN0VG91Y2hQb3NpdGlvbi5wYWdlWSA9IHRvdWNoLnBhZ2VZOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gX2xvY2tTY3JvbGxJbnRlcmFjdGlvbnMoKSB7CiAgICAgIF9ib3VuZFNjcm9sbEhhbmRsZXIgPQogICAgICAgICAgX2JvdW5kU2Nyb2xsSGFuZGxlciB8fCBfc2Nyb2xsSW50ZXJhY3Rpb25IYW5kbGVyLmJpbmQodW5kZWZpbmVkKTsKICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBzY3JvbGxFdmVudHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7CiAgICAgICAgLy8gTk9URTogYnJvd3NlcnMgdGhhdCBkb24ndCBzdXBwb3J0IG9iamVjdHMgYXMgdGhpcmQgYXJnIHdpbGwKICAgICAgICAvLyBpbnRlcnByZXQgaXQgYXMgYm9vbGVhbiwgaGVuY2UgdXNlQ2FwdHVyZSA9IHRydWUgaW4gdGhpcyBjYXNlLgogICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoCiAgICAgICAgICAgIHNjcm9sbEV2ZW50c1tpXSwgX2JvdW5kU2Nyb2xsSGFuZGxlciwge2NhcHR1cmU6IHRydWUsIHBhc3NpdmU6IGZhbHNlfSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBfdW5sb2NrU2Nyb2xsSW50ZXJhY3Rpb25zKCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbCA9IHNjcm9sbEV2ZW50cy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAvLyBOT1RFOiBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQgb2JqZWN0cyBhcyB0aGlyZCBhcmcgd2lsbAogICAgICAgIC8vIGludGVycHJldCBpdCBhcyBib29sZWFuLCBoZW5jZSB1c2VDYXB0dXJlID0gdHJ1ZSBpbiB0aGlzIGNhc2UuCiAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigKICAgICAgICAgICAgc2Nyb2xsRXZlbnRzW2ldLCBfYm91bmRTY3JvbGxIYW5kbGVyLCB7Y2FwdHVyZTogdHJ1ZSwgcGFzc2l2ZTogZmFsc2V9KTsKICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBldmVudCBjYXVzZXMgc2Nyb2xsIG91dHNpZGUgdGhlIGN1cnJlbnQgbG9ja2luZwogICAgICogZWxlbWVudCwgZS5nLiBwb2ludGVyL2tleWJvYXJkIGludGVyYWN0aW9ucywgb3Igc2Nyb2xsICJsZWFraW5nIgogICAgICogb3V0c2lkZSB0aGUgbG9ja2luZyBlbGVtZW50IHdoZW4gaXQgaXMgYWxyZWFkeSBhdCBpdHMgc2Nyb2xsIGJvdW5kYXJpZXMuCiAgICAgKiBAcGFyYW0geyFFdmVudH0gZXZlbnQKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgKiBAcGFja2FnZQogICAgICovCiAgICBmdW5jdGlvbiBfc2hvdWxkUHJldmVudFNjcm9sbGluZyhldmVudCkgewogICAgICAvLyBVcGRhdGUgaWYgcm9vdCB0YXJnZXQgY2hhbmdlZC4gRm9yIHRvdWNoIGV2ZW50cywgZW5zdXJlIHdlIGRvbid0CiAgICAgIC8vIHVwZGF0ZSBkdXJpbmcgdG91Y2htb3ZlLgogICAgICB2YXIgdGFyZ2V0ID0gZG9tKGV2ZW50KS5yb290VGFyZ2V0OwogICAgICBpZiAoZXZlbnQudHlwZSAhPT0gJ3RvdWNobW92ZScgJiYgbGFzdFJvb3RUYXJnZXQgIT09IHRhcmdldCkgewogICAgICAgIGxhc3RSb290VGFyZ2V0ID0gdGFyZ2V0OwogICAgICAgIGxhc3RTY3JvbGxhYmxlTm9kZXMgPSBfZ2V0U2Nyb2xsYWJsZU5vZGVzKGRvbShldmVudCkucGF0aCk7CiAgICAgIH0KCiAgICAgIC8vIFByZXZlbnQgZXZlbnQgaWYgbm8gc2Nyb2xsYWJsZSBub2Rlcy4KICAgICAgaWYgKCFsYXN0U2Nyb2xsYWJsZU5vZGVzLmxlbmd0aCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIC8vIERvbid0IHByZXZlbnQgdG91Y2hzdGFydCBldmVudCBpbnNpZGUgdGhlIGxvY2tpbmcgZWxlbWVudCB3aGVuIGl0IGhhcwogICAgICAvLyBzY3JvbGxhYmxlIG5vZGVzLgogICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIC8vIEdldCBkZWx0YVgvWS4KICAgICAgdmFyIGluZm8gPSBfZ2V0U2Nyb2xsSW5mbyhldmVudCk7CiAgICAgIC8vIFByZXZlbnQgaWYgdGhlcmUgaXMgbm8gY2hpbGQgdGhhdCBjYW4gc2Nyb2xsLgogICAgICByZXR1cm4gIV9nZXRTY3JvbGxpbmdOb2RlKGxhc3RTY3JvbGxhYmxlTm9kZXMsIGluZm8uZGVsdGFYLCBpbmZvLmRlbHRhWSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHNjcm9sbGFibGUgbm9kZXMgdXAgdG8gdGhlIGN1cnJlbnQgbG9ja2luZyBlbGVtZW50LAogICAgICogd2hpY2ggaXMgaW5jbHVkZWQgdG9vIGlmIHNjcm9sbGFibGUuCiAgICAgKiBAcGFyYW0geyFBcnJheTwhTm9kZT59IG5vZGVzCiAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fSBzY3JvbGxhYmxlcwogICAgICogQHBhY2thZ2UKICAgICAqLwogICAgZnVuY3Rpb24gX2dldFNjcm9sbGFibGVOb2Rlcyhub2RlcykgewogICAgICB2YXIgc2Nyb2xsYWJsZXMgPSBbXTsKICAgICAgdmFyIGxvY2tpbmdJbmRleCA9CiAgICAgICAgICBub2Rlcy5pbmRleE9mKC8qKiBAdHlwZSB7IU5vZGV9ICovIChjdXJyZW50TG9ja2luZ0VsZW1lbnQpKTsKICAgICAgLy8gTG9vcCBmcm9tIHJvb3QgdGFyZ2V0IHRvIGxvY2tpbmcgZWxlbWVudCAoaW5jbHVkZWQpLgogICAgICBmb3IgKHZhciBpID0gMDsgaSA8PSBsb2NraW5nSW5kZXg7IGkrKykgewogICAgICAgIC8vIFNraXAgbm9uLUVsZW1lbnQgbm9kZXMuCiAgICAgICAgaWYgKG5vZGVzW2ldLm5vZGVUeXBlICE9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgICAgY29udGludWU7CiAgICAgICAgfQogICAgICAgIHZhciBub2RlID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKG5vZGVzW2ldKTsKICAgICAgICAvLyBDaGVjayBpbmxpbmUgc3R5bGUgYmVmb3JlIGNoZWNraW5nIGNvbXB1dGVkIHN0eWxlLgogICAgICAgIHZhciBzdHlsZSA9IG5vZGUuc3R5bGU7CiAgICAgICAgaWYgKHN0eWxlLm92ZXJmbG93ICE9PSAnc2Nyb2xsJyAmJiBzdHlsZS5vdmVyZmxvdyAhPT0gJ2F1dG8nKSB7CiAgICAgICAgICBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpOwogICAgICAgIH0KICAgICAgICBpZiAoc3R5bGUub3ZlcmZsb3cgPT09ICdzY3JvbGwnIHx8IHN0eWxlLm92ZXJmbG93ID09PSAnYXV0bycpIHsKICAgICAgICAgIHNjcm9sbGFibGVzLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBzY3JvbGxhYmxlczsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG5vZGUgdGhhdCBpcyBzY3JvbGxpbmcuIElmIHRoZXJlIGlzIG5vIHNjcm9sbGluZywKICAgICAqIHJldHVybnMgdW5kZWZpbmVkLgogICAgICogQHBhcmFtIHshQXJyYXk8IU5vZGU+fSBub2RlcwogICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhWCBTY3JvbGwgZGVsdGEgb24gdGhlIHgtYXhpcwogICAgICogQHBhcmFtIHtudW1iZXJ9IGRlbHRhWSBTY3JvbGwgZGVsdGEgb24gdGhlIHktYXhpcwogICAgICogQHJldHVybiB7IU5vZGV8dW5kZWZpbmVkfQogICAgICogQHBhY2thZ2UKICAgICAqLwogICAgZnVuY3Rpb24gX2dldFNjcm9sbGluZ05vZGUobm9kZXMsIGRlbHRhWCwgZGVsdGFZKSB7CiAgICAgIC8vIE5vIHNjcm9sbC4KICAgICAgaWYgKCFkZWx0YVggJiYgIWRlbHRhWSkgewogICAgICAgIHJldHVybjsKICAgICAgfQogICAgICAvLyBDaGVjayBvbmx5IG9uZSBheGlzIGFjY29yZGluZyB0byB3aGVyZSB0aGVyZSBpcyBtb3JlIHNjcm9sbC4KICAgICAgLy8gUHJlZmVyIHZlcnRpY2FsIHRvIGhvcml6b250YWwuCiAgICAgIHZhciB2ZXJ0aWNhbFNjcm9sbCA9IE1hdGguYWJzKGRlbHRhWSkgPj0gTWF0aC5hYnMoZGVsdGFYKTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBub2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07CiAgICAgICAgdmFyIGNhblNjcm9sbCA9IGZhbHNlOwogICAgICAgIGlmICh2ZXJ0aWNhbFNjcm9sbCkgewogICAgICAgICAgLy8gZGVsdGEgPCAwIGlzIHNjcm9sbCB1cCwgZGVsdGEgPiAwIGlzIHNjcm9sbCBkb3duLgogICAgICAgICAgY2FuU2Nyb2xsID0gZGVsdGFZIDwgMCA/CiAgICAgICAgICAgICAgbm9kZS5zY3JvbGxUb3AgPiAwIDoKICAgICAgICAgICAgICBub2RlLnNjcm9sbFRvcCA8IG5vZGUuc2Nyb2xsSGVpZ2h0IC0gbm9kZS5jbGllbnRIZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIC8vIGRlbHRhIDwgMCBpcyBzY3JvbGwgbGVmdCwgZGVsdGEgPiAwIGlzIHNjcm9sbCByaWdodC4KICAgICAgICAgIGNhblNjcm9sbCA9IGRlbHRhWCA8IDAgPwogICAgICAgICAgICAgIG5vZGUuc2Nyb2xsTGVmdCA+IDAgOgogICAgICAgICAgICAgIG5vZGUuc2Nyb2xsTGVmdCA8IG5vZGUuc2Nyb2xsV2lkdGggLSBub2RlLmNsaWVudFdpZHRoOwogICAgICAgIH0KICAgICAgICBpZiAoY2FuU2Nyb2xsKSB7CiAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgc2Nyb2xsIGBkZWx0YVhgIGFuZCBgZGVsdGFZYC4KICAgICAqIEBwYXJhbSB7IUV2ZW50fSBldmVudCBUaGUgc2Nyb2xsIGV2ZW50CiAgICAgKiBAcmV0dXJuIHt7ZGVsdGFYOiBudW1iZXIsIGRlbHRhWTogbnVtYmVyfX0gT2JqZWN0IGNvbnRhaW5pbmcgdGhlCiAgICAgKiB4LWF4aXMgc2Nyb2xsIGRlbHRhIChwb3NpdGl2ZTogc2Nyb2xsIHJpZ2h0LCBuZWdhdGl2ZTogc2Nyb2xsIGxlZnQsCiAgICAgKiAwOiBubyBzY3JvbGwpLCBhbmQgdGhlIHktYXhpcyBzY3JvbGwgZGVsdGEgKHBvc2l0aXZlOiBzY3JvbGwgZG93biwKICAgICAqIG5lZ2F0aXZlOiBzY3JvbGwgdXAsIDA6IG5vIHNjcm9sbCkuCiAgICAgKiBAcGFja2FnZQogICAgICovCiAgICBmdW5jdGlvbiBfZ2V0U2Nyb2xsSW5mbyhldmVudCkgewogICAgICB2YXIgaW5mbyA9IHtkZWx0YVg6IGV2ZW50LmRlbHRhWCwgZGVsdGFZOiBldmVudC5kZWx0YVl9OwogICAgICAvLyBBbHJlYWR5IGF2YWlsYWJsZS4KICAgICAgaWYgKCdkZWx0YVgnIGluIGV2ZW50KSA7CiAgICAgIC8vIFNhZmFyaSBoYXMgc2Nyb2xsIGluZm8gaW4gYHdoZWVsRGVsdGFYL1lgLgogICAgICBlbHNlIGlmICgnd2hlZWxEZWx0YVgnIGluIGV2ZW50ICYmICd3aGVlbERlbHRhWScgaW4gZXZlbnQpIHsKICAgICAgICBpbmZvLmRlbHRhWCA9IC1ldmVudC53aGVlbERlbHRhWDsKICAgICAgICBpbmZvLmRlbHRhWSA9IC1ldmVudC53aGVlbERlbHRhWTsKICAgICAgfQogICAgICAvLyBJRTEwIGhhcyBvbmx5IHZlcnRpY2FsIHNjcm9sbCBpbmZvIGluIGB3aGVlbERlbHRhYC4KICAgICAgZWxzZSBpZiAoJ3doZWVsRGVsdGEnIGluIGV2ZW50KSB7CiAgICAgICAgaW5mby5kZWx0YVggPSAwOwogICAgICAgIGluZm8uZGVsdGFZID0gLWV2ZW50LndoZWVsRGVsdGE7CiAgICAgIH0KICAgICAgLy8gRmlyZWZveCBoYXMgc2Nyb2xsIGluZm8gaW4gYGRldGFpbGAgYW5kIGBheGlzYC4KICAgICAgZWxzZSBpZiAoJ2F4aXMnIGluIGV2ZW50KSB7CiAgICAgICAgaW5mby5kZWx0YVggPSBldmVudC5heGlzID09PSAxID8gZXZlbnQuZGV0YWlsIDogMDsKICAgICAgICBpbmZvLmRlbHRhWSA9IGV2ZW50LmF4aXMgPT09IDIgPyBldmVudC5kZXRhaWwgOiAwOwogICAgICB9CiAgICAgIC8vIE9uIG1vYmlsZSBkZXZpY2VzLCBjYWxjdWxhdGUgc2Nyb2xsIGRpcmVjdGlvbi4KICAgICAgZWxzZSBpZiAoZXZlbnQudGFyZ2V0VG91Y2hlcykgewogICAgICAgIHZhciB0b3VjaCA9IGV2ZW50LnRhcmdldFRvdWNoZXNbMF07CiAgICAgICAgLy8gVG91Y2ggbW92ZXMgZnJvbSByaWdodCB0byBsZWZ0ID0+IHNjcm9sbGluZyBnb2VzIHJpZ2h0LgogICAgICAgIGluZm8uZGVsdGFYID0gbGFzdFRvdWNoUG9zaXRpb24ucGFnZVggLSB0b3VjaC5wYWdlWDsKICAgICAgICAvLyBUb3VjaCBtb3ZlcyBmcm9tIGRvd24gdG8gdXAgPT4gc2Nyb2xsaW5nIGdvZXMgZG93bi4KICAgICAgICBpbmZvLmRlbHRhWSA9IGxhc3RUb3VjaFBvc2l0aW9uLnBhZ2VZIC0gdG91Y2gucGFnZVk7CiAgICAgIH0KICAgICAgcmV0dXJuIGluZm87CiAgICB9CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IElyb25PdmVybGF5QmVoYXZpb3JJbXBsID0gewoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBvdmVybGF5IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQuCiAgICAgICAgICovCiAgICAgICAgb3BlbmVkOgogICAgICAgICAgICB7b2JzZXJ2ZXI6ICdfb3BlbmVkQ2hhbmdlZCcsIHR5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZSwgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGUgb3ZlcmxheSB3YXMgY2FuY2VsZWQgd2hlbiBpdCB3YXMgbGFzdCBjbG9zZWQuCiAgICAgICAgICovCiAgICAgICAgY2FuY2VsZWQ6IHsKICAgICAgICAgIG9ic2VydmVyOiAnX2NhbmNlbGVkQ2hhbmdlZCcsCiAgICAgICAgICByZWFkT25seTogdHJ1ZSwKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNwbGF5IGEgYmFja2Ryb3AgYmVoaW5kIHRoZSBvdmVybGF5LiBJdCB0cmFwcyB0aGUgZm9jdXMKICAgICAgICAgKiB3aXRoaW4gdGhlIGxpZ2h0IERPTSBvZiB0aGUgb3ZlcmxheS4KICAgICAgICAgKi8KICAgICAgICB3aXRoQmFja2Ryb3A6IHsKICAgICAgICAgIG9ic2VydmVyOiAnX3dpdGhCYWNrZHJvcENoYW5nZWQnLAogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG8tZm9jdXNpbmcgdGhlIG92ZXJsYXkgb3IgY2hpbGQgbm9kZXMgd2l0aAogICAgICAgICAqIHRoZSBgYXV0b2ZvY3VzYCBhdHRyaWJ1dGVgIHdoZW4gdGhlIG92ZXJsYXkgaXMgb3BlbmVkLgogICAgICAgICAqLwogICAgICAgIG5vQXV0b0ZvY3VzOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgY2FuY2VsaW5nIHRoZSBvdmVybGF5IHdpdGggdGhlIEVTQyBrZXkuCiAgICAgICAgICovCiAgICAgICAgbm9DYW5jZWxPbkVzY0tleTogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGNhbmNlbGluZyB0aGUgb3ZlcmxheSBieSBjbGlja2luZyBvdXRzaWRlIGl0LgogICAgICAgICAqLwogICAgICAgIG5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s6IHsKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udGFpbnMgdGhlIHJlYXNvbihzKSB0aGlzIG92ZXJsYXkgd2FzIGxhc3QgY2xvc2VkIChzZWUKICAgICAgICAgKiBgaXJvbi1vdmVybGF5LWNsb3NlZGApLiBgSXJvbk92ZXJsYXlCZWhhdmlvcmAgcHJvdmlkZXMgdGhlIGBjYW5jZWxlZGAKICAgICAgICAgKiByZWFzb247IGltcGxlbWVudGVycyBvZiB0aGUgYmVoYXZpb3IgY2FuIHByb3ZpZGUgb3RoZXIgcmVhc29ucyBpbgogICAgICAgICAqIGFkZGl0aW9uIHRvIGBjYW5jZWxlZGAuCiAgICAgICAgICovCiAgICAgICAgY2xvc2luZ1JlYXNvbjogewogICAgICAgICAgLy8gd2FzIGEgZ2V0dGVyIGJlZm9yZSwgYnV0IG5lZWRzIHRvIGJlIGEgcHJvcGVydHkgc28gb3RoZXIKICAgICAgICAgIC8vIGJlaGF2aW9ycyBjYW4gb3ZlcnJpZGUgdGhpcy4KICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBlbmFibGUgcmVzdG9yaW5nIG9mIGZvY3VzIHdoZW4gb3ZlcmxheSBpcyBjbG9zZWQuCiAgICAgICAgICovCiAgICAgICAgcmVzdG9yZUZvY3VzT25DbG9zZTogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBhbGxvdyBjbGlja3MgdG8gZ28gdGhyb3VnaCBvdmVybGF5cy4KICAgICAgICAgKiBXaGVuIHRoZSB1c2VyIGNsaWNrcyBvdXRzaWRlIHRoaXMgb3ZlcmxheSwgdGhlIGNsaWNrIG1heQogICAgICAgICAqIGNsb3NlIHRoZSBvdmVybGF5IGJlbG93LgogICAgICAgICAqLwogICAgICAgIGFsbG93Q2xpY2tUaHJvdWdoOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGtlZXAgb3ZlcmxheSBhbHdheXMgb24gdG9wLgogICAgICAgICAqLwogICAgICAgIGFsd2F5c09uVG9wOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hpY2ggYWN0aW9uIHRvIHBlcmZvcm0gd2hlbiBzY3JvbGwgb3V0c2lkZSBhbiBvcGVuZWQgb3ZlcmxheQogICAgICAgICAqIGhhcHBlbnMuIFBvc3NpYmxlIHZhbHVlczogbG9jayAtIGJsb2NrcyBzY3JvbGxpbmcgZnJvbSBoYXBwZW5pbmcsIHJlZml0IC0KICAgICAgICAgKiBjb21wdXRlcyB0aGUgbmV3IHBvc2l0aW9uIG9uIHRoZSBvdmVybGF5IGNhbmNlbCAtIGNhdXNlcyB0aGUgb3ZlcmxheSB0bwogICAgICAgICAqIGNsb3NlCiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsQWN0aW9uOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2hvcnRjdXQgdG8gYWNjZXNzIHRvIHRoZSBvdmVybGF5IG1hbmFnZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAdHlwZSB7IUlyb25PdmVybGF5TWFuYWdlckNsYXNzfQogICAgICAgICAqLwogICAgICAgIF9tYW5hZ2VyOiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogSXJvbk92ZXJsYXlNYW5hZ2VyLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBub2RlIGJlaW5nIGZvY3VzZWQuCiAgICAgICAgICogQHR5cGUgez9Ob2RlfQogICAgICAgICAqLwogICAgICAgIF9mb2N1c2VkQ2hpbGQ6IHsKICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9CgogICAgICB9LAoKICAgICAgbGlzdGVuZXJzOiB7J2lyb24tcmVzaXplJzogJ19vbklyb25SZXNpemUnfSwKCiAgICAgIG9ic2VydmVyczogWydfX3VwZGF0ZVNjcm9sbE9ic2VydmVycyhpc0F0dGFjaGVkLCBvcGVuZWQsIHNjcm9sbEFjdGlvbiknXSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgYmFja2Ryb3AgZWxlbWVudC4KICAgICAgICogQHJldHVybiB7IUVsZW1lbnR9CiAgICAgICAqLwogICAgICBnZXQgYmFja2Ryb3BFbGVtZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLl9tYW5hZ2VyLmJhY2tkcm9wRWxlbWVudDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRoZSBub2RlIHRvIGdpdmUgZm9jdXMgdG8uCiAgICAgICAqIEByZXR1cm4geyFOb2RlfQogICAgICAgKi8KICAgICAgZ2V0IF9mb2N1c05vZGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZvY3VzZWRDaGlsZCB8fCBkb20odGhpcykucXVlcnlTZWxlY3RvcignW2F1dG9mb2N1c10nKSB8fCB0aGlzOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEFycmF5IG9mIG5vZGVzIHRoYXQgY2FuIHJlY2VpdmUgZm9jdXMgKG92ZXJsYXkgaW5jbHVkZWQpLCBvcmRlcmVkIGJ5CiAgICAgICAqIGB0YWJpbmRleGAuIFRoaXMgaXMgdXNlZCB0byByZXRyaWV2ZSB3aGljaCBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgZm9jdXNhYmxlCiAgICAgICAqIG5vZGVzIGluIG9yZGVyIHRvIHdyYXAgdGhlIGZvY3VzIGZvciBvdmVybGF5cyBgd2l0aC1iYWNrZHJvcGAuCiAgICAgICAqCiAgICAgICAqIElmIHlvdSBrbm93IHdoYXQgaXMgeW91ciBjb250ZW50IChzcGVjaWZpY2FsbHkgdGhlIGZpcnN0IGFuZCBsYXN0IGZvY3VzYWJsZQogICAgICAgKiBjaGlsZHJlbiksIHlvdSBjYW4gb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gcmV0dXJuIG9ubHkgYFtmaXJzdEZvY3VzYWJsZSwKICAgICAgICogbGFzdEZvY3VzYWJsZV07YAogICAgICAgKiBAcmV0dXJuIHshQXJyYXk8IU5vZGU+fQogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBnZXQgX2ZvY3VzYWJsZU5vZGVzKCkgewogICAgICAgIHJldHVybiBJcm9uRm9jdXNhYmxlc0hlbHBlci5nZXRUYWJiYWJsZU5vZGVzKHRoaXMpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICByZWFkeTogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gVXNlZCB0byBza2lwIGNhbGxzIHRvIG5vdGlmeVJlc2l6ZSBhbmQgcmVmaXQgd2hpbGUgdGhlIG92ZXJsYXkgaXMKICAgICAgICAvLyBhbmltYXRpbmcuCiAgICAgICAgdGhpcy5fX2lzQW5pbWF0aW5nID0gZmFsc2U7CiAgICAgICAgLy8gd2l0aC1iYWNrZHJvcCBuZWVkcyB0YWJpbmRleCB0byBiZSBzZXQgaW4gb3JkZXIgdG8gdHJhcCB0aGUgZm9jdXMuCiAgICAgICAgLy8gSWYgaXQgaXMgbm90IHNldCwgSXJvbk92ZXJsYXlCZWhhdmlvciB3aWxsIHNldCBpdCwgYW5kIHJlbW92ZSBpdCBpZgogICAgICAgIC8vIHdpdGgtYmFja2Ryb3AgPSBmYWxzZS4KICAgICAgICB0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXggPSBmYWxzZTsKICAgICAgICAvLyBVc2VkIGZvciB3cmFwcGluZyB0aGUgZm9jdXMgb24gVEFCIC8gU2hpZnQrVEFCLgogICAgICAgIHRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGUgPSB0aGlzLl9fbGFzdEZvY3VzYWJsZU5vZGUgPSBudWxsOwogICAgICAgIC8vIFVzZWQgYnkgdG8ga2VlcCB0cmFjayBvZiB0aGUgUkFGIGNhbGxiYWNrcy4KICAgICAgICB0aGlzLl9fcmFmcyA9IHt9OwogICAgICAgIC8vIEZvY3VzZWQgbm9kZSBiZWZvcmUgb3ZlcmxheSBnZXRzIG9wZW5lZC4gQ2FuIGJlIHJlc3RvcmVkIG9uIGNsb3NlLgogICAgICAgIHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlID0gbnVsbDsKICAgICAgICAvLyBTY3JvbGwgaW5mbyB0byBiZSByZXN0b3JlZC4KICAgICAgICB0aGlzLl9fc2Nyb2xsVG9wID0gdGhpcy5fX3Njcm9sbExlZnQgPSBudWxsOwogICAgICAgIHRoaXMuX19vbkNhcHR1cmVTY3JvbGwgPSB0aGlzLl9fb25DYXB0dXJlU2Nyb2xsLmJpbmQodGhpcyk7CiAgICAgICAgLy8gUm9vdCBub2RlcyBob3N0aW5nIHRoZSBvdmVybGF5LCB1c2VkIHRvIGxpc3RlbiBmb3Igc2Nyb2xsIGV2ZW50cyBvbiB0aGVtLgogICAgICAgIHRoaXMuX19yb290Tm9kZXMgPSBudWxsOwogICAgICAgIHRoaXMuX2Vuc3VyZVNldHVwKCk7CiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBDYWxsIF9vcGVuZWRDaGFuZ2VkIGhlcmUgc28gdGhhdCBwb3NpdGlvbiBjYW4gYmUgY29tcHV0ZWQgY29ycmVjdGx5LgogICAgICAgIGlmICh0aGlzLm9wZW5lZCkgewogICAgICAgICAgdGhpcy5fb3BlbmVkQ2hhbmdlZCh0aGlzLm9wZW5lZCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX29ic2VydmVyID0gZG9tKHRoaXMpLm9ic2VydmVOb2Rlcyh0aGlzLl9vbk5vZGVzQ2hhbmdlKTsKICAgICAgfSwKCiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgZGV0YWNoZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFRPRE8oYmlja25lbGxyKTogUGVyIHNwZWMsIGNoZWNraW5nIGB0aGlzLl9vYnNlcnZlcmAgc2hvdWxkIG5ldmVyIGJlCiAgICAgICAgLy8gbmVjZXNzYXJ5IGJlY2F1c2UgYGNvbm5lY3RlZENhbGxiYWNrYCBhbmQgYGRpc2Nvbm5lY3RlZENhbGxiYWNrYCBzaG91bGQKICAgICAgICAvLyBhbHdheXMgYmUgY2FsbGVkIGluIGFsdGVybmF0aW5nIG9yZGVyLiBIb3dldmVyLCB0aGUgY3VzdG9tIGVsZW1lbnRzCiAgICAgICAgLy8gcG9seWZpbGwgZG9lc24ndCBpbXBsZW1lbnQgdGhlIHJlYWN0aW9ucyBzdGFjaywgc28gdGhpcyBjYW4gc29tZXRpbWVzCiAgICAgICAgLy8gaGFwcGVuLCBwYXJ0aWN1bGFybHkgaWYgU2hhZHlET00gaXMgaW4gbm9QYXRjaCBtb2RlIHdoZXJlIHRoZSBjdXN0b20KICAgICAgICAvLyBlbGVtZW50cyBwb2x5ZmlsbCBpcyBpbnN0YWxsZWQgYmVmb3JlIFNoYWR5RE9NLiBXZSBzaG91bGQgaW52ZXN0aWdhdGUKICAgICAgICAvLyB3aGV0aGVyIG9yIG5vdCB3ZSBjYW4gZWl0aGVyIGltcGxlbWVudCB0aGUgcmVhY3Rpb25zIHN0YWNrIHdpdGhvdXQgbWFqb3IKICAgICAgICAvLyBwZXJmb3JtYW5jZSBpbXBsaWNhdGlvbnMgb3IgcGF0Y2ggU2hhZHlET00ncyBmdW5jdGlvbnMgdG8gcmVzdG9yZSB0aGUKICAgICAgICAvLyB0eXBpY2FsIFNoYWR5RE9NLXRoZW4tY3VzdG9tLWVsZW1lbnRzIG9yZGVyIGFuZCByZW1vdmUgdGhpcyB3b3JrYXJvdW5kLgogICAgICAgIGlmICh0aGlzLl9vYnNlcnZlcikgewogICAgICAgICAgZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBudWxsOwogICAgICAgIGZvciAodmFyIGNiIGluIHRoaXMuX19yYWZzKSB7CiAgICAgICAgICBpZiAodGhpcy5fX3JhZnNbY2JdICE9PSBudWxsKSB7CiAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX19yYWZzW2NiXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX19yYWZzID0ge307CiAgICAgICAgdGhpcy5fbWFuYWdlci5yZW1vdmVPdmVybGF5KHRoaXMpOwoKICAgICAgICAvLyBXZSBnb3QgZGV0YWNoZWQgd2hpbGUgYW5pbWF0aW5nLCBlbnN1cmUgd2Ugc2hvdy9oaWRlIHRoZSBvdmVybGF5CiAgICAgICAgLy8gYW5kIGZpcmUgaXJvbi1vdmVybGF5LW9wZW5lZC9jbG9zZWQgZXZlbnQhCiAgICAgICAgaWYgKHRoaXMuX19pc0FuaW1hdGluZykgewogICAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgZm9jdXMgaWYgbmVjZXNzYXJ5LgogICAgICAgICAgICB0aGlzLl9hcHBseUZvY3VzKCk7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUb2dnbGUgdGhlIG9wZW5lZCBzdGF0ZSBvZiB0aGUgb3ZlcmxheS4KICAgICAgICovCiAgICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fc2V0Q2FuY2VsZWQoZmFsc2UpOwogICAgICAgIHRoaXMub3BlbmVkID0gIXRoaXMub3BlbmVkOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIE9wZW4gdGhlIG92ZXJsYXkuCiAgICAgICAqLwogICAgICBvcGVuOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9zZXRDYW5jZWxlZChmYWxzZSk7CiAgICAgICAgdGhpcy5vcGVuZWQgPSB0cnVlOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENsb3NlIHRoZSBvdmVybGF5LgogICAgICAgKi8KICAgICAgY2xvc2U6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3NldENhbmNlbGVkKGZhbHNlKTsKICAgICAgICB0aGlzLm9wZW5lZCA9IGZhbHNlOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbmNlbHMgdGhlIG92ZXJsYXkuCiAgICAgICAqIEBwYXJhbSB7RXZlbnQ9fSBldmVudCBUaGUgb3JpZ2luYWwgZXZlbnQKICAgICAgICovCiAgICAgIGNhbmNlbDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgY2FuY2VsRXZlbnQgPQogICAgICAgICAgICB0aGlzLmZpcmUoJ2lyb24tb3ZlcmxheS1jYW5jZWxlZCcsIGV2ZW50LCB7Y2FuY2VsYWJsZTogdHJ1ZX0pOwogICAgICAgIGlmIChjYW5jZWxFdmVudC5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9zZXRDYW5jZWxlZCh0cnVlKTsKICAgICAgICB0aGlzLm9wZW5lZCA9IGZhbHNlOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEludmFsaWRhdGVzIHRoZSBjYWNoZWQgdGFiYmFibGUgbm9kZXMuIFRvIGJlIGNhbGxlZCB3aGVuIGFueSBvZiB0aGUKICAgICAgICogZm9jdXNhYmxlIGNvbnRlbnQgY2hhbmdlcyAoZS5nLiBhIGJ1dHRvbiBpcyBkaXNhYmxlZCkuCiAgICAgICAqLwogICAgICBpbnZhbGlkYXRlVGFiYmFibGVzOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlID0gdGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlID0gbnVsbDsKICAgICAgfSwKCiAgICAgIF9lbnN1cmVTZXR1cDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlTZXR1cCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9vdmVybGF5U2V0dXAgPSB0cnVlOwogICAgICAgIHRoaXMuc3R5bGUub3V0bGluZSA9ICdub25lJzsKICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FsbGVkIHdoZW4gYG9wZW5lZGAgY2hhbmdlcy4KICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gb3BlbmVkCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9vcGVuZWRDaGFuZ2VkOiBmdW5jdGlvbihvcGVuZWQpIHsKICAgICAgICBpZiAob3BlbmVkKSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTsKICAgICAgICB9CgogICAgICAgIC8vIERlZmVyIGFueSBhbmltYXRpb24tcmVsYXRlZCBjb2RlIG9uIGF0dGFjaGVkCiAgICAgICAgLy8gKF9vcGVuZWRDaGFuZ2VkIGdldHMgY2FsbGVkIGFnYWluIG9uIGF0dGFjaGVkKS4KICAgICAgICBpZiAoIXRoaXMuaXNBdHRhY2hlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fX2lzQW5pbWF0aW5nID0gdHJ1ZTsKCiAgICAgICAgLy8gRGVyYWYgZm9yIG5vbi1ibG9ja2luZyByZW5kZXJpbmcuCiAgICAgICAgdGhpcy5fX2RlcmFmKCdfX29wZW5lZENoYW5nZWQnLCB0aGlzLl9fb3BlbmVkQ2hhbmdlZCk7CiAgICAgIH0sCgogICAgICBfY2FuY2VsZWRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb24gPSB0aGlzLmNsb3NpbmdSZWFzb24gfHwge307CiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uLmNhbmNlbGVkID0gdGhpcy5jYW5jZWxlZDsKICAgICAgfSwKCiAgICAgIF93aXRoQmFja2Ryb3BDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBJZiB0YWJpbmRleCBpcyBhbHJlYWR5IHNldCwgbm8gbmVlZCB0byBvdmVycmlkZSBpdC4KICAgICAgICBpZiAodGhpcy53aXRoQmFja2Ryb3AgJiYgIXRoaXMuaGFzQXR0cmlidXRlKCd0YWJpbmRleCcpKSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTsKICAgICAgICAgIHRoaXMuX19zaG91bGRSZW1vdmVUYWJJbmRleCA9IHRydWU7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9fc2hvdWxkUmVtb3ZlVGFiSW5kZXgpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCd0YWJpbmRleCcpOwogICAgICAgICAgdGhpcy5fX3Nob3VsZFJlbW92ZVRhYkluZGV4ID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLm9wZW5lZCAmJiB0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIHRoaXMuX21hbmFnZXIudHJhY2tCYWNrZHJvcCgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiB0YXNrcyB3aGljaCBtdXN0IG9jY3VyIGJlZm9yZSBvcGVuaW5nOyBlLmcuIG1ha2luZyB0aGUgZWxlbWVudCB2aXNpYmxlLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfcHJlcGFyZVJlbmRlck9wZW5lZDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gU3RvcmUgZm9jdXNlZCBub2RlLgogICAgICAgIHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlID0gdGhpcy5fbWFuYWdlci5kZWVwQWN0aXZlRWxlbWVudDsKCiAgICAgICAgLy8gTmVlZGVkIHRvIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgb3ZlcmxheSBzbyB0aGF0IHRyYW5zaXRpb25zIG9uIGl0cwogICAgICAgIC8vIHNpemUgd2lsbCBoYXZlIHRoZSBjb3JyZWN0IHN0YXJ0aW5nIHBvaW50cy4KICAgICAgICB0aGlzLl9wcmVwYXJlUG9zaXRpb25pbmcoKTsKICAgICAgICB0aGlzLnJlZml0KCk7CiAgICAgICAgdGhpcy5fZmluaXNoUG9zaXRpb25pbmcoKTsKCiAgICAgICAgLy8gU2FmYXJpIHdpbGwgYXBwbHkgdGhlIGZvY3VzIHRvIHRoZSBhdXRvZm9jdXMgZWxlbWVudCB3aGVuIGRpc3BsYXllZAogICAgICAgIC8vIGZvciB0aGUgZmlyc3QgdGltZSwgc28gd2UgbWFrZSBzdXJlIHRvIHJldHVybiB0aGUgZm9jdXMgd2hlcmUgaXQgd2FzLgogICAgICAgIGlmICh0aGlzLm5vQXV0b0ZvY3VzICYmIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IHRoaXMuX2ZvY3VzTm9kZSkgewogICAgICAgICAgdGhpcy5fZm9jdXNOb2RlLmJsdXIoKTsKICAgICAgICAgIHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRhc2tzIHdoaWNoIGNhdXNlIHRoZSBvdmVybGF5IHRvIGFjdHVhbGx5IG9wZW47IHR5cGljYWxseSBwbGF5IGFuCiAgICAgICAqIGFuaW1hdGlvbi4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlbmRlck9wZW5lZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZmluaXNoUmVuZGVyT3BlbmVkKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGFza3Mgd2hpY2ggY2F1c2UgdGhlIG92ZXJsYXkgdG8gYWN0dWFsbHkgY2xvc2U7IHR5cGljYWxseSBwbGF5IGFuCiAgICAgICAqIGFuaW1hdGlvbi4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX3JlbmRlckNsb3NlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZmluaXNoUmVuZGVyQ2xvc2VkKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGFza3MgdG8gYmUgcGVyZm9ybWVkIGF0IHRoZSBlbmQgb2Ygb3BlbiBhY3Rpb24uIFdpbGwgZmlyZQogICAgICAgKiBgaXJvbi1vdmVybGF5LW9wZW5lZGAuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9maW5pc2hSZW5kZXJPcGVuZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgdGhpcy5fX2lzQW5pbWF0aW5nID0gZmFsc2U7CgogICAgICAgIHRoaXMuZmlyZSgnaXJvbi1vdmVybGF5LW9wZW5lZCcpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRhc2tzIHRvIGJlIHBlcmZvcm1lZCBhdCB0aGUgZW5kIG9mIGNsb3NlIGFjdGlvbi4gV2lsbCBmaXJlCiAgICAgICAqIGBpcm9uLW92ZXJsYXktY2xvc2VkYC4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2ZpbmlzaFJlbmRlckNsb3NlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gSGlkZSB0aGUgb3ZlcmxheS4KICAgICAgICB0aGlzLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7CiAgICAgICAgLy8gUmVzZXQgei1pbmRleCBvbmx5IGF0IHRoZSBlbmQgb2YgdGhlIGFuaW1hdGlvbi4KICAgICAgICB0aGlzLnN0eWxlLnpJbmRleCA9ICcnOwogICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgdGhpcy5fX2lzQW5pbWF0aW5nID0gZmFsc2U7CiAgICAgICAgdGhpcy5maXJlKCdpcm9uLW92ZXJsYXktY2xvc2VkJywgdGhpcy5jbG9zaW5nUmVhc29uKTsKICAgICAgfSwKCiAgICAgIF9wcmVwYXJlUG9zaXRpb25pbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGUudHJhbnNpdGlvbiA9IHRoaXMuc3R5bGUud2Via2l0VHJhbnNpdGlvbiA9ICdub25lJzsKICAgICAgICB0aGlzLnN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gJ25vbmUnOwogICAgICAgIHRoaXMuc3R5bGUuZGlzcGxheSA9ICcnOwogICAgICB9LAoKICAgICAgX2ZpbmlzaFBvc2l0aW9uaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBGaXJzdCwgbWFrZSBpdCBpbnZpc2libGUgJiByZWFjdGl2YXRlIGFuaW1hdGlvbnMuCiAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgIC8vIEZvcmNlIHJlZmxvdyBiZWZvcmUgcmUtZW5hYmxpbmcgYW5pbWF0aW9ucyBzbyB0aGF0IHRoZXkgZG9uJ3Qgc3RhcnQuCiAgICAgICAgLy8gU2V0IHNjcm9sbFRvcCB0byBpdHNlbGYgc28gdGhhdCBDbG9zdXJlIENvbXBpbGVyIGRvZXNuJ3QgcmVtb3ZlIHRoaXMuCiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRvcDsKICAgICAgICB0aGlzLnN0eWxlLnRyYW5zaXRpb24gPSB0aGlzLnN0eWxlLndlYmtpdFRyYW5zaXRpb24gPSAnJzsKICAgICAgICB0aGlzLnN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuc3R5bGUud2Via2l0VHJhbnNmb3JtID0gJyc7CiAgICAgICAgLy8gTm93IHRoYXQgYW5pbWF0aW9ucyBhcmUgZW5hYmxlZCwgbWFrZSBpdCB2aXNpYmxlIGFnYWluCiAgICAgICAgdGhpcy5zdHlsZS5kaXNwbGF5ID0gJyc7CiAgICAgICAgLy8gRm9yY2UgcmVmbG93LCBzbyB0aGF0IGZvbGxvd2luZyBhbmltYXRpb25zIGFyZSBwcm9wZXJseSBzdGFydGVkLgogICAgICAgIC8vIFNldCBzY3JvbGxUb3AgdG8gaXRzZWxmIHNvIHRoYXQgQ2xvc3VyZSBDb21waWxlciBkb2Vzbid0IHJlbW92ZSB0aGlzLgogICAgICAgIHRoaXMuc2Nyb2xsVG9wID0gdGhpcy5zY3JvbGxUb3A7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQXBwbGllcyBmb2N1cyBhY2NvcmRpbmcgdG8gdGhlIG9wZW5lZCBzdGF0ZS4KICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX2FwcGx5Rm9jdXM6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm9wZW5lZCkgewogICAgICAgICAgaWYgKCF0aGlzLm5vQXV0b0ZvY3VzKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTm9kZS5mb2N1cygpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBSZXN0b3JlIGZvY3VzLgogICAgICAgICAgaWYgKHRoaXMucmVzdG9yZUZvY3VzT25DbG9zZSAmJiB0aGlzLl9fcmVzdG9yZUZvY3VzTm9kZSkgewogICAgICAgICAgICAvLyBJZiB0aGUgYWN0aXZlRWxlbWVudCBpcyBgPGJvZHk+YCBvciBpbnNpZGUgdGhlIG92ZXJsYXksCiAgICAgICAgICAgIC8vIHdlIGFyZSBhbGxvd2VkIHRvIHJlc3RvcmUgdGhlIGZvY3VzLiBJbiBhbGwgdGhlIG90aGVyCiAgICAgICAgICAgIC8vIGNhc2VzIGZvY3VzIG1pZ2h0IGhhdmUgYmVlbiBtb3ZlZCBlbHNld2hlcmUgYnkgYW5vdGhlcgogICAgICAgICAgICAvLyBjb21wb25lbnQgb3IgYnkgYW4gdXNlciBpbnRlcmFjdGlvbiAoZS5nLiBjbGljayBvbiBhCiAgICAgICAgICAgIC8vIGJ1dHRvbiBvdXRzaWRlIHRoZSBvdmVybGF5KS4KICAgICAgICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50OwogICAgICAgICAgICBpZiAoYWN0aXZlRWxlbWVudCA9PT0gZG9jdW1lbnQuYm9keSB8fAogICAgICAgICAgICAgICAgY29tcG9zZWRDb250YWlucyh0aGlzLCBhY3RpdmVFbGVtZW50KSkgewogICAgICAgICAgICAgIHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlLmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19yZXN0b3JlRm9jdXNOb2RlID0gbnVsbDsKICAgICAgICAgIHRoaXMuX2ZvY3VzTm9kZS5ibHVyKCk7CiAgICAgICAgICB0aGlzLl9mb2N1c2VkQ2hpbGQgPSBudWxsOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIChjbG9zZXMpIHRoZSBvdmVybGF5LiBDYWxsIHdoZW4gY2xpY2sgaGFwcGVucyBvdXRzaWRlIHRoZSBvdmVybGF5LgogICAgICAgKiBAcGFyYW0geyFFdmVudH0gZXZlbnQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX29uQ2FwdHVyZUNsaWNrOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICghdGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrKSB7CiAgICAgICAgICB0aGlzLmNhbmNlbChldmVudCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBmb2N1c2VkIGNoaWxkLiBJZiB3aXRoQmFja2Ryb3AsIHRyYXBzIGZvY3VzIHdpdGhpbgogICAgICAgKiBvdmVybGF5LgogICAgICAgKiBAcGFyYW0geyFFdmVudH0gZXZlbnQKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgX29uQ2FwdHVyZUZvY3VzOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICghdGhpcy53aXRoQmFja2Ryb3ApIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIHBhdGggPSBkb20oZXZlbnQpLnBhdGg7CiAgICAgICAgaWYgKHBhdGguaW5kZXhPZih0aGlzKSA9PT0gLTEpIHsKICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgdGhpcy5fYXBwbHlGb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9mb2N1c2VkQ2hpbGQgPSAvKiogQHR5cGUge05vZGV9ICovIChwYXRoWzBdKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSGFuZGxlcyB0aGUgRVNDIGtleSBldmVudCBhbmQgY2FuY2VscyAoY2xvc2VzKSB0aGUgb3ZlcmxheS4KICAgICAgICogQHBhcmFtIHshRXZlbnR9IGV2ZW50CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9vbkNhcHR1cmVFc2M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLm5vQ2FuY2VsT25Fc2NLZXkpIHsKICAgICAgICAgIHRoaXMuY2FuY2VsKGV2ZW50KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSGFuZGxlcyBUQUIga2V5IGV2ZW50cyB0byB0cmFjayBmb2N1cyBjaGFuZ2VzLgogICAgICAgKiBXaWxsIHdyYXAgZm9jdXMgZm9yIG92ZXJsYXlzIHdpdGhCYWNrZHJvcC4KICAgICAgICogQHBhcmFtIHshRXZlbnR9IGV2ZW50CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9vbkNhcHR1cmVUYWI6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLndpdGhCYWNrZHJvcCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0aGlzLl9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlcygpOwogICAgICAgIC8vIFRBQiB3cmFwcyBmcm9tIGxhc3QgdG8gZmlyc3QgZm9jdXNhYmxlLgogICAgICAgIC8vIFNoaWZ0ICsgVEFCIHdyYXBzIGZyb20gZmlyc3QgdG8gbGFzdCBmb2N1c2FibGUuCiAgICAgICAgdmFyIHNoaWZ0ID0gZXZlbnQuc2hpZnRLZXk7CiAgICAgICAgdmFyIG5vZGVUb0NoZWNrID0KICAgICAgICAgICAgc2hpZnQgPyB0aGlzLl9fZmlyc3RGb2N1c2FibGVOb2RlIDogdGhpcy5fX2xhc3RGb2N1c2FibGVOb2RlOwogICAgICAgIHZhciBub2RlVG9TZXQgPQogICAgICAgICAgICBzaGlmdCA/IHRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZSA6IHRoaXMuX19maXJzdEZvY3VzYWJsZU5vZGU7CiAgICAgICAgdmFyIHNob3VsZFdyYXAgPSBmYWxzZTsKICAgICAgICBpZiAobm9kZVRvQ2hlY2sgPT09IG5vZGVUb1NldCkgewogICAgICAgICAgLy8gSWYgbm9kZVRvQ2hlY2sgaXMgdGhlIHNhbWUgYXMgbm9kZVRvU2V0LCBpdCBtZWFucyB3ZSBoYXZlIGFuIG92ZXJsYXkKICAgICAgICAgIC8vIHdpdGggMCBvciAxIGZvY3VzYWJsZXM7IGluIGVpdGhlciBjYXNlIHdlIHN0aWxsIG5lZWQgdG8gdHJhcCB0aGUKICAgICAgICAgIC8vIGZvY3VzIHdpdGhpbiB0aGUgb3ZlcmxheS4KICAgICAgICAgIHNob3VsZFdyYXAgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBJbiBkb209c2hhZG93LCB0aGUgbWFuYWdlciB3aWxsIHJlY2VpdmUgZm9jdXMgY2hhbmdlcyBvbiB0aGUgbWFpbgogICAgICAgICAgLy8gcm9vdCBidXQgbm90IHRoZSBvbmVzIHdpdGhpbiBvdGhlciBzaGFkb3cgcm9vdHMsIHNvIHdlIGNhbid0IHJlbHkgb24KICAgICAgICAgIC8vIF9mb2N1c2VkQ2hpbGQsIGJ1dCB3ZSBzaG91bGQgY2hlY2sgdGhlIGRlZXBlc3QgYWN0aXZlIGVsZW1lbnQuCiAgICAgICAgICB2YXIgZm9jdXNlZE5vZGUgPSB0aGlzLl9tYW5hZ2VyLmRlZXBBY3RpdmVFbGVtZW50OwogICAgICAgICAgLy8gSWYgdGhlIGFjdGl2ZSBlbGVtZW50IGlzIG5vdCB0aGUgbm9kZVRvQ2hlY2sgYnV0IHRoZSBvdmVybGF5IGl0c2VsZiwKICAgICAgICAgIC8vIGl0IG1lYW5zIHRoZSBmb2N1cyBpcyBhYm91dCB0byBnbyBvdXRzaWRlIHRoZSBvdmVybGF5LCBoZW5jZSB3ZQogICAgICAgICAgLy8gc2hvdWxkIHByZXZlbnQgdGhhdCAoZS5nLiB1c2VyIG9wZW5zIHRoZSBvdmVybGF5IGFuZCBoaXQgU2hpZnQrVEFCKS4KICAgICAgICAgIHNob3VsZFdyYXAgPSAoZm9jdXNlZE5vZGUgPT09IG5vZGVUb0NoZWNrIHx8IGZvY3VzZWROb2RlID09PSB0aGlzKTsKICAgICAgICB9CgogICAgICAgIGlmIChzaG91bGRXcmFwKSB7CiAgICAgICAgICAvLyBXaGVuIHRoZSBvdmVybGF5IGNvbnRhaW5zIHRoZSBsYXN0IGZvY3VzYWJsZSBlbGVtZW50IG9mIHRoZSBkb2N1bWVudAogICAgICAgICAgLy8gYW5kIGl0J3MgYWxyZWFkeSBmb2N1c2VkLCBwcmVzc2luZyBUQUIgd291bGQgbW92ZSB0aGUgZm9jdXMgb3V0c2lkZQogICAgICAgICAgLy8gdGhlIGRvY3VtZW50IChlLmcuIHRvIHRoZSBicm93c2VyIHNlYXJjaCBiYXIpLiBTaW1pbGFybHksIHdoZW4gdGhlCiAgICAgICAgICAvLyBvdmVybGF5IGNvbnRhaW5zIHRoZSBmaXJzdCBmb2N1c2FibGUgZWxlbWVudCBvZiB0aGUgZG9jdW1lbnQgYW5kIGl0J3MKICAgICAgICAgIC8vIGFscmVhZHkgZm9jdXNlZCwgcHJlc3NpbmcgU2hpZnQrVEFCIHdvdWxkIG1vdmUgdGhlIGZvY3VzIG91dHNpZGUgdGhlCiAgICAgICAgICAvLyBkb2N1bWVudCAoZS5nLiB0byB0aGUgYnJvd3NlciBzZWFyY2ggYmFyKS4KICAgICAgICAgIC8vIEluIGJvdGggY2FzZXMsIHdlIHdvdWxkIG5vdCByZWNlaXZlIGEgZm9jdXMgZXZlbnQsIGJ1dCBvbmx5IGEgYmx1ci4KICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGFjaGlldmUgZm9jdXMgd3JhcHBpbmcsIHdlIHByZXZlbnQgdGhpcyBUQUIgZXZlbnQgYW5kCiAgICAgICAgICAvLyBmb3JjZSB0aGUgZm9jdXMuIFRoaXMgd2lsbCBhbHNvIHByZXZlbnQgdGhlIGZvY3VzIHRvIHRlbXBvcmFyaWx5IG1vdmUKICAgICAgICAgIC8vIG91dHNpZGUgdGhlIG92ZXJsYXksIHdoaWNoIG1pZ2h0IGNhdXNlIHNjcm9sbGluZy4KICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICB0aGlzLl9mb2N1c2VkQ2hpbGQgPSBub2RlVG9TZXQ7CiAgICAgICAgICB0aGlzLl9hcHBseUZvY3VzKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJlZml0cyBpZiB0aGUgb3ZlcmxheSBpcyBvcGVuZWQgYW5kIG5vdCBhbmltYXRpbmcuCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9vbklyb25SZXNpemU6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm9wZW5lZCAmJiAhdGhpcy5fX2lzQW5pbWF0aW5nKSB7CiAgICAgICAgICB0aGlzLl9fZGVyYWYoJ3JlZml0JywgdGhpcy5yZWZpdCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFdpbGwgY2FsbCBub3RpZnlSZXNpemUgaWYgb3ZlcmxheSBpcyBvcGVuZWQuCiAgICAgICAqIENhbiBiZSBvdmVycmlkZGVuIGluIG9yZGVyIHRvIGF2b2lkIG11bHRpcGxlIG9ic2VydmVycyBvbiB0aGUgc2FtZSBub2RlLgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfb25Ob2Rlc0NoYW5nZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMub3BlbmVkICYmICF0aGlzLl9faXNBbmltYXRpbmcpIHsKICAgICAgICAgIC8vIEl0IG1pZ2h0IGhhdmUgYWRkZWQgZm9jdXNhYmxlIG5vZGVzLCBzbyBpbnZhbGlkYXRlIGNhY2hlZCB2YWx1ZXMuCiAgICAgICAgICB0aGlzLmludmFsaWRhdGVUYWJiYWJsZXMoKTsKICAgICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFVwZGF0ZXMgdGhlIHJlZmVyZW5jZXMgdG8gdGhlIGZpcnN0IGFuZCBsYXN0IGZvY3VzYWJsZSBub2Rlcy4KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9fZW5zdXJlRmlyc3RMYXN0Rm9jdXNhYmxlczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGZvY3VzYWJsZU5vZGVzID0gdGhpcy5fZm9jdXNhYmxlTm9kZXM7CiAgICAgICAgdGhpcy5fX2ZpcnN0Rm9jdXNhYmxlTm9kZSA9IGZvY3VzYWJsZU5vZGVzWzBdOwogICAgICAgIHRoaXMuX19sYXN0Rm9jdXNhYmxlTm9kZSA9IGZvY3VzYWJsZU5vZGVzW2ZvY3VzYWJsZU5vZGVzLmxlbmd0aCAtIDFdOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRhc2tzIGV4ZWN1dGVkIHdoZW4gb3BlbmVkIGNoYW5nZXM6IHByZXBhcmUgZm9yIHRoZSBvcGVuaW5nLCBtb3ZlIHRoZQogICAgICAgKiBmb2N1cywgdXBkYXRlIHRoZSBtYW5hZ2VyLCByZW5kZXIgb3BlbmVkL2Nsb3NlZC4KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9fb3BlbmVkQ2hhbmdlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMub3BlbmVkKSB7CiAgICAgICAgICAvLyBNYWtlIG92ZXJsYXkgdmlzaWJsZSwgdGhlbiBhZGQgaXQgdG8gdGhlIG1hbmFnZXIuCiAgICAgICAgICB0aGlzLl9wcmVwYXJlUmVuZGVyT3BlbmVkKCk7CiAgICAgICAgICB0aGlzLl9tYW5hZ2VyLmFkZE92ZXJsYXkodGhpcyk7CiAgICAgICAgICAvLyBNb3ZlIHRoZSBmb2N1cyB0byB0aGUgY2hpbGQgbm9kZSB3aXRoIFthdXRvZm9jdXNdLgogICAgICAgICAgdGhpcy5fYXBwbHlGb2N1cygpOwoKICAgICAgICAgIHRoaXMuX3JlbmRlck9wZW5lZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBSZW1vdmUgb3ZlcmxheSwgdGhlbiByZXN0b3JlIHRoZSBmb2N1cyBiZWZvcmUgYWN0dWFsbHkgY2xvc2luZy4KICAgICAgICAgIHRoaXMuX21hbmFnZXIucmVtb3ZlT3ZlcmxheSh0aGlzKTsKICAgICAgICAgIHRoaXMuX2FwcGx5Rm9jdXMoKTsKCiAgICAgICAgICB0aGlzLl9yZW5kZXJDbG9zZWQoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRGVib3VuY2VzIHRoZSBleGVjdXRpb24gb2YgYSBjYWxsYmFjayB0byB0aGUgbmV4dCBhbmltYXRpb24gZnJhbWUuCiAgICAgICAqIEBwYXJhbSB7IXN0cmluZ30gam9ibmFtZQogICAgICAgKiBAcGFyYW0geyFGdW5jdGlvbn0gY2FsbGJhY2sgQWx3YXlzIGJvdW5kIHRvIGB0aGlzYAogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX19kZXJhZjogZnVuY3Rpb24oam9ibmFtZSwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgcmFmcyA9IHRoaXMuX19yYWZzOwogICAgICAgIGlmIChyYWZzW2pvYm5hbWVdICE9PSBudWxsKSB7CiAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZShyYWZzW2pvYm5hbWVdKTsKICAgICAgICB9CiAgICAgICAgcmFmc1tqb2JuYW1lXSA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShmdW5jdGlvbiBuZXh0QW5pbWF0aW9uRnJhbWUoKSB7CiAgICAgICAgICByYWZzW2pvYm5hbWVdID0gbnVsbDsKICAgICAgICAgIGNhbGxiYWNrLmNhbGwodGhpcyk7CiAgICAgICAgfS5iaW5kKHRoaXMpKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGlzQXR0YWNoZWQKICAgICAgICogQHBhcmFtIHtib29sZWFufSBvcGVuZWQKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzY3JvbGxBY3Rpb24KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9fdXBkYXRlU2Nyb2xsT2JzZXJ2ZXJzOiBmdW5jdGlvbihpc0F0dGFjaGVkLCBvcGVuZWQsIHNjcm9sbEFjdGlvbikgewogICAgICAgIGlmICghaXNBdHRhY2hlZCB8fCAhb3BlbmVkIHx8ICF0aGlzLl9faXNWYWxpZFNjcm9sbEFjdGlvbihzY3JvbGxBY3Rpb24pKSB7CiAgICAgICAgICByZW1vdmVTY3JvbGxMb2NrKHRoaXMpOwogICAgICAgICAgdGhpcy5fX3JlbW92ZVNjcm9sbExpc3RlbmVycygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoc2Nyb2xsQWN0aW9uID09PSAnbG9jaycpIHsKICAgICAgICAgICAgdGhpcy5fX3NhdmVTY3JvbGxQb3NpdGlvbigpOwogICAgICAgICAgICBwdXNoU2Nyb2xsTG9jayh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19hZGRTY3JvbGxMaXN0ZW5lcnMoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9fYWRkU2Nyb2xsTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuX19yb290Tm9kZXMpIHsKICAgICAgICAgIHRoaXMuX19yb290Tm9kZXMgPSBbXTsKICAgICAgICAgIC8vIExpc3RlbiBmb3Igc2Nyb2xsIGV2ZW50cyBpbiBhbGwgc2hhZG93Um9vdHMgaG9zdGluZyB0aGlzIG92ZXJsYXkgb25seQogICAgICAgICAgLy8gd2hlbiBpbiBuYXRpdmUgU2hhZG93RE9NLgogICAgICAgICAgaWYgKHVzZVNoYWRvdykgewogICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXM7CiAgICAgICAgICAgIHdoaWxlIChub2RlKSB7CiAgICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERSAmJiBub2RlLmhvc3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuX19yb290Tm9kZXMucHVzaChub2RlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuaG9zdCB8fCBub2RlLmFzc2lnbmVkU2xvdCB8fCBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX19yb290Tm9kZXMucHVzaChkb2N1bWVudCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX19yb290Tm9kZXMuZm9yRWFjaChmdW5jdGlvbihlbCkgewogICAgICAgICAgZWwuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgdGhpcy5fX29uQ2FwdHVyZVNjcm9sbCwgewogICAgICAgICAgICBjYXB0dXJlOiB0cnVlLAogICAgICAgICAgICBwYXNzaXZlOiB0cnVlLAogICAgICAgICAgfSk7CiAgICAgICAgfSwgdGhpcyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9fcmVtb3ZlU2Nyb2xsTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fX3Jvb3ROb2RlcykgewogICAgICAgICAgdGhpcy5fX3Jvb3ROb2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGVsKSB7CiAgICAgICAgICAgIGVsLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuX19vbkNhcHR1cmVTY3JvbGwsIHsKICAgICAgICAgICAgICBjYXB0dXJlOiB0cnVlLAogICAgICAgICAgICAgIHBhc3NpdmU6IHRydWUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIGlmICghdGhpcy5pc0F0dGFjaGVkKSB7CiAgICAgICAgICB0aGlzLl9fcm9vdE5vZGVzID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHBhcmFtIHtzdHJpbmc9fSBzY3JvbGxBY3Rpb24KICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9faXNWYWxpZFNjcm9sbEFjdGlvbjogZnVuY3Rpb24oc2Nyb2xsQWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHNjcm9sbEFjdGlvbiA9PT0gJ2xvY2snIHx8IHNjcm9sbEFjdGlvbiA9PT0gJ3JlZml0JyB8fAogICAgICAgICAgICBzY3JvbGxBY3Rpb24gPT09ICdjYW5jZWwnOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfX29uQ2FwdHVyZVNjcm9sbDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5fX2lzQW5pbWF0aW5nKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrIGlmIHNjcm9sbCBvdXRzaWRlIHRoZSBvdmVybGF5LgogICAgICAgIGlmIChkb20oZXZlbnQpLnBhdGguaW5kZXhPZih0aGlzKSA+PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHN3aXRjaCAodGhpcy5zY3JvbGxBY3Rpb24pIHsKICAgICAgICAgIGNhc2UgJ2xvY2snOgogICAgICAgICAgICAvLyBOT1RFOiBzY3JvbGxpbmcgbWlnaHQgaGFwcGVuIGlmIGEgc2Nyb2xsIGV2ZW50IGlzIG5vdCBjYW5jZWxsYWJsZSwgb3IKICAgICAgICAgICAgLy8gaWYgdXNlciBwcmVzc2VkIGtleXMgdGhhdCBjYXVzZSBzY3JvbGxpbmcgKHRoZXkncmUgbm90IHByZXZlbnRlZCBpbgogICAgICAgICAgICAvLyBvcmRlciBub3QgdG8gYnJlYWsgYTExeSBmZWF0dXJlcyBsaWtlIG5hdmlnYXRlIHdpdGggYXJyb3cga2V5cykuCiAgICAgICAgICAgIHRoaXMuX19yZXN0b3JlU2Nyb2xsUG9zaXRpb24oKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdyZWZpdCc6CiAgICAgICAgICAgIHRoaXMuX19kZXJhZigncmVmaXQnLCB0aGlzLnJlZml0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdjYW5jZWwnOgogICAgICAgICAgICB0aGlzLmNhbmNlbChldmVudCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBNZW1vaXplcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBvdXRzaWRlIHNjcm9sbGluZyBlbGVtZW50LgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX19zYXZlU2Nyb2xsUG9zaXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIGlmIChkb2N1bWVudC5zY3JvbGxpbmdFbGVtZW50KSB7CiAgICAgICAgICB0aGlzLl9fc2Nyb2xsVG9wID0gZG9jdW1lbnQuc2Nyb2xsaW5nRWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgICB0aGlzLl9fc2Nyb2xsTGVmdCA9IGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3Qga25vdyBpZiBpcyB0aGUgYm9keSBvciBodG1sLCBnZXQgbWF4LgogICAgICAgICAgdGhpcy5fX3Njcm9sbFRvcCA9CiAgICAgICAgICAgICAgTWF0aC5tYXgoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCwgZG9jdW1lbnQuYm9keS5zY3JvbGxUb3ApOwogICAgICAgICAgdGhpcy5fX3Njcm9sbExlZnQgPSBNYXRoLm1heCgKICAgICAgICAgICAgICBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVzZXRzIHRoZSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIG91dHNpZGUgc2Nyb2xsaW5nIGVsZW1lbnQuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfX3Jlc3RvcmVTY3JvbGxQb3NpdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQpIHsKICAgICAgICAgIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsVG9wID0gdGhpcy5fX3Njcm9sbFRvcDsKICAgICAgICAgIGRvY3VtZW50LnNjcm9sbGluZ0VsZW1lbnQuc2Nyb2xsTGVmdCA9IHRoaXMuX19zY3JvbGxMZWZ0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBTaW5jZSB3ZSBkb24ndCBrbm93IGlmIGlzIHRoZSBib2R5IG9yIGh0bWwsIHNldCBib3RoLgogICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCA9IGRvY3VtZW50LmJvZHkuc2Nyb2xsVG9wID0KICAgICAgICAgICAgICB0aGlzLl9fc2Nyb2xsVG9wOwogICAgICAgICAgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbExlZnQgPSBkb2N1bWVudC5ib2R5LnNjcm9sbExlZnQgPQogICAgICAgICAgICAgIHRoaXMuX19zY3JvbGxMZWZ0OwogICAgICAgIH0KICAgICAgfSwKCiAgICB9OwoKICAgIGNvbnN0IGNvbXBvc2VkUGFyZW50ID0gbm9kZSA9PgogICAgICAgIG5vZGUuYXNzaWduZWRTbG90IHx8IG5vZGUucGFyZW50Tm9kZSB8fCBub2RlLmhvc3Q7CgogICAgY29uc3QgY29tcG9zZWRDb250YWlucyA9IChhbmNlc3RvciwgZGVzY2VuZGFudCkgPT4gewogICAgICBmb3IgKGxldCBlbGVtZW50ID0gZGVzY2VuZGFudDsgZWxlbWVudDsgZWxlbWVudCA9IGNvbXBvc2VkUGFyZW50KGVsZW1lbnQpKSB7CiAgICAgICAgaWYgKGVsZW1lbnQgPT09IGFuY2VzdG9yKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfTsKCiAgICAvKioKICAgICAgVXNlIGBQb2x5bWVyLklyb25PdmVybGF5QmVoYXZpb3JgIHRvIGltcGxlbWVudCBhbiBlbGVtZW50IHRoYXQgY2FuIGJlIGhpZGRlbgogICAgICBvciBzaG93biwgYW5kIGRpc3BsYXlzIG9uIHRvcCBvZiBvdGhlciBjb250ZW50LiBJdCBpbmNsdWRlcyBhbiBvcHRpb25hbAogICAgICBiYWNrZHJvcCwgYW5kIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCBhIHZhcmlldHkgb2YgVUkgY29udHJvbHMgaW5jbHVkaW5nCiAgICAgIGRpYWxvZ3MgYW5kIGRyb3AgZG93bnMuIE11bHRpcGxlIG92ZXJsYXlzIG1heSBiZSBkaXNwbGF5ZWQgYXQgb25jZS4KCiAgICAgIFNlZSB0aGUgW2RlbW8gc291cmNlCiAgICAgIGNvZGVdKGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyRWxlbWVudHMvaXJvbi1vdmVybGF5LWJlaGF2aW9yL2Jsb2IvbWFzdGVyL2RlbW8vc2ltcGxlLW92ZXJsYXkuaHRtbCkKICAgICAgZm9yIGFuIGV4YW1wbGUuCgogICAgICAjIyMgQ2xvc2luZyBhbmQgY2FuY2VsaW5nCgogICAgICBBbiBvdmVybGF5IG1heSBiZSBoaWRkZW4gYnkgY2xvc2luZyBvciBjYW5jZWxpbmcuIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gY2xvc2UKICAgICAgYW5kIGNhbmNlbCBpcyB1c2VyIGludGVudC4gQ2xvc2luZyBnZW5lcmFsbHkgaW1wbGllcyB0aGF0IHRoZSB1c2VyCiAgICAgIGFja25vd2xlZGdlZCB0aGUgY29udGVudCBvbiB0aGUgb3ZlcmxheS4gQnkgZGVmYXVsdCwgaXQgd2lsbCBjYW5jZWwgd2hlbmV2ZXIKICAgICAgdGhlIHVzZXIgdGFwcyBvdXRzaWRlIGl0IG9yIHByZXNzZXMgdGhlIGVzY2FwZSBrZXkuIFRoaXMgYmVoYXZpb3IgaXMKICAgICAgY29uZmlndXJhYmxlIHdpdGggdGhlIGBuby1jYW5jZWwtb24tZXNjLWtleWAgYW5kIHRoZQogICAgICBgbm8tY2FuY2VsLW9uLW91dHNpZGUtY2xpY2tgIHByb3BlcnRpZXMuIGBjbG9zZSgpYCBzaG91bGQgYmUgY2FsbGVkIGV4cGxpY2l0bHkKICAgICAgYnkgdGhlIGltcGxlbWVudGVyIHdoZW4gdGhlIHVzZXIgaW50ZXJhY3RzIHdpdGggYSBjb250cm9sIGluIHRoZSBvdmVybGF5CiAgICAgIGVsZW1lbnQuIFdoZW4gdGhlIGRpYWxvZyBpcyBjYW5jZWxlZCwgdGhlIG92ZXJsYXkgZmlyZXMgYW4KICAgICAgJ2lyb24tb3ZlcmxheS1jYW5jZWxlZCcgZXZlbnQuIENhbGwgYHByZXZlbnREZWZhdWx0YCBvbiB0aGlzIGV2ZW50IHRvIHByZXZlbnQKICAgICAgdGhlIG92ZXJsYXkgZnJvbSBjbG9zaW5nLgoKICAgICAgIyMjIFBvc2l0aW9uaW5nCgogICAgICBCeSBkZWZhdWx0IHRoZSBlbGVtZW50IGlzIHNpemVkIGFuZCBwb3NpdGlvbmVkIHRvIGZpdCBhbmQgY2VudGVyZWQgaW5zaWRlIHRoZQogICAgICB3aW5kb3cuIFlvdSBjYW4gcG9zaXRpb24gYW5kIHNpemUgaXQgbWFudWFsbHkgdXNpbmcgQ1NTLiBTZWUKICAgICAgYFBvbHltZXIuSXJvbkZpdEJlaGF2aW9yYC4KCiAgICAgICMjIyBCYWNrZHJvcAoKICAgICAgU2V0IHRoZSBgd2l0aC1iYWNrZHJvcGAgYXR0cmlidXRlIHRvIGRpc3BsYXkgYSBiYWNrZHJvcCBiZWhpbmQgdGhlIG92ZXJsYXkuCiAgICAgIFRoZSBiYWNrZHJvcCBpcyBhcHBlbmRlZCB0byBgPGJvZHk+YCBhbmQgaXMgb2YgdHlwZSBgPGlyb24tb3ZlcmxheS1iYWNrZHJvcD5gLgogICAgICBTZWUgaXRzIGRvYyBwYWdlIGZvciBzdHlsaW5nIG9wdGlvbnMuCgogICAgICBJbiBhZGRpdGlvbiwgYHdpdGgtYmFja2Ryb3BgIHdpbGwgd3JhcCB0aGUgZm9jdXMgd2l0aGluIHRoZSBjb250ZW50IGluIHRoZQogICAgICBsaWdodCBET00uIE92ZXJyaWRlIHRoZSBbYF9mb2N1c2FibGVOb2Rlc2AKICAgICAgZ2V0dGVyXSgjUG9seW1lci5Jcm9uT3ZlcmxheUJlaGF2aW9yOnByb3BlcnR5LV9mb2N1c2FibGVOb2RlcykgdG8gYWNoaWV2ZSBhCiAgICAgIGRpZmZlcmVudCBiZWhhdmlvci4KCiAgICAgICMjIyBMaW1pdGF0aW9ucwoKICAgICAgVGhlIGVsZW1lbnQgaXMgc3R5bGVkIHRvIGFwcGVhciBvbiB0b3Agb2Ygb3RoZXIgY29udGVudCBieSBzZXR0aW5nIGl0cwogICAgICBgei1pbmRleGAgcHJvcGVydHkuIFlvdSBtdXN0IGVuc3VyZSBubyBlbGVtZW50IGhhcyBhIHN0YWNraW5nIGNvbnRleHQgd2l0aCBhCiAgICAgIGhpZ2hlciBgei1pbmRleGAgdGhhbiBpdHMgcGFyZW50IHN0YWNraW5nIGNvbnRleHQuIFlvdSBzaG91bGQgcGxhY2UgdGhpcwogICAgICBlbGVtZW50IGFzIGEgY2hpbGQgb2YgYDxib2R5PmAgd2hlbmV2ZXIgcG9zc2libGUuCgogICAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAgQHBvbHltZXJCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBJcm9uT3ZlcmxheUJlaGF2aW9yID0KICAgICAgICBbSXJvbkZpdEJlaGF2aW9yLCBJcm9uUmVzaXphYmxlQmVoYXZpb3IsIElyb25PdmVybGF5QmVoYXZpb3JJbXBsXTsKCiAgICAvKioKICAgICAqIEZpcmVkIGFmdGVyIHRoZSBvdmVybGF5IG9wZW5zLgogICAgICogQGV2ZW50IGlyb24tb3ZlcmxheS1vcGVuZWQKICAgICAqLwoKICAgIC8qKgogICAgICogRmlyZWQgd2hlbiB0aGUgb3ZlcmxheSBpcyBjYW5jZWxlZCwgYnV0IGJlZm9yZSBpdCBpcyBjbG9zZWQuCiAgICAgKiBAZXZlbnQgaXJvbi1vdmVybGF5LWNhbmNlbGVkCiAgICAgKiBAcGFyYW0ge0V2ZW50fSBldmVudCBUaGUgY2xvc2luZyBvZiB0aGUgb3ZlcmxheSBjYW4gYmUgcHJldmVudGVkCiAgICAgKiBieSBjYWxsaW5nIGBldmVudC5wcmV2ZW50RGVmYXVsdCgpYC4gVGhlIGBldmVudC5kZXRhaWxgIGlzIHRoZSBvcmlnaW5hbCBldmVudAogICAgICogdGhhdCBvcmlnaW5hdGVkIHRoZSBjYW5jZWxpbmcgKGUuZy4gRVNDIGtleWJvYXJkIGV2ZW50IG9yIGNsaWNrIGV2ZW50IG91dHNpZGUKICAgICAqIHRoZSBvdmVybGF5KS4KICAgICAqLwoKICAgIC8qKgogICAgICogRmlyZWQgYWZ0ZXIgdGhlIG92ZXJsYXkgY2xvc2VzLgogICAgICogQGV2ZW50IGlyb24tb3ZlcmxheS1jbG9zZWQKICAgICAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IFRoZSBgZXZlbnQuZGV0YWlsYCBpcyB0aGUgYGNsb3NpbmdSZWFzb25gIHByb3BlcnR5CiAgICAgKiAoY29udGFpbnMgYGNhbmNlbGVkYCwgd2hldGhlciB0aGUgb3ZlcmxheSB3YXMgY2FuY2VsZWQpLgogICAgICovCgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgIFVzZSBgUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yYCBhbmQgYHBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzLmh0bWxgIHRvCiAgICAgIGltcGxlbWVudCBhIE1hdGVyaWFsIERlc2lnbiBkaWFsb2cuCgogICAgICBGb3IgZXhhbXBsZSwgaWYgYDxwYXBlci1kaWFsb2ctaW1wbD5gIGltcGxlbWVudHMgdGhpcyBiZWhhdmlvcjoKCiAgICAgICAgICA8cGFwZXItZGlhbG9nLWltcGw+CiAgICAgICAgICAgICAgPGgyPkhlYWRlcjwvaDI+CiAgICAgICAgICAgICAgPGRpdj5EaWFsb2cgYm9keTwvZGl2PgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgogICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1kaXNtaXNzPkNhbmNlbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGRpYWxvZy1jb25maXJtPkFjY2VwdDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9wYXBlci1kaWFsb2ctaW1wbD4KCiAgICAgIGBwYXBlci1kaWFsb2ctc2hhcmVkLXN0eWxlcy5odG1sYCBwcm92aWRlIHN0eWxlcyBmb3IgYSBoZWFkZXIsIGNvbnRlbnQgYXJlYSwKICAgICAgYW5kIGFuIGFjdGlvbiBhcmVhIGZvciBidXR0b25zLiBVc2UgdGhlIGA8aDI+YCB0YWcgZm9yIHRoZSBoZWFkZXIgYW5kIHRoZQogICAgICBgYnV0dG9uc2AgY2xhc3MgZm9yIHRoZSBhY3Rpb24gYXJlYS4gWW91IGNhbiB1c2UgdGhlIGBwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZWAKICAgICAgZWxlbWVudCAoaW4gaXRzIG93biByZXBvc2l0b3J5KSBpZiB5b3UgbmVlZCBhIHNjcm9sbGluZyBjb250ZW50IGFyZWEuCgogICAgICBVc2UgdGhlIGBkaWFsb2ctZGlzbWlzc2AgYW5kIGBkaWFsb2ctY29uZmlybWAgYXR0cmlidXRlcyBvbiBpbnRlcmFjdGl2ZQogICAgICBjb250cm9scyB0byBjbG9zZSB0aGUgZGlhbG9nLiBJZiB0aGUgdXNlciBkaXNtaXNzZXMgdGhlIGRpYWxvZyB3aXRoCiAgICAgIGBkaWFsb2ctY29uZmlybWAsIHRoZSBgY2xvc2luZ1JlYXNvbmAgd2lsbCB1cGRhdGUgdG8gaW5jbHVkZSBgY29uZmlybWVkOgogICAgICB0cnVlYC4KCiAgICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgICBUaGlzIGVsZW1lbnQgaGFzIGByb2xlPSJkaWFsb2ciYCBieSBkZWZhdWx0LiBEZXBlbmRpbmcgb24gdGhlIGNvbnRleHQsIGl0IG1heQogICAgICBiZSBtb3JlIGFwcHJvcHJpYXRlIHRvIG92ZXJyaWRlIHRoaXMgYXR0cmlidXRlIHdpdGggYHJvbGU9ImFsZXJ0ZGlhbG9nImAuCgogICAgICBJZiBgbW9kYWxgIGlzIHNldCwgdGhlIGVsZW1lbnQgd2lsbCBwcmV2ZW50IHRoZSBmb2N1cyBmcm9tIGV4aXRpbmcgdGhlCiAgICAgIGVsZW1lbnQuIEl0IHdpbGwgYWxzbyBlbnN1cmUgdGhhdCBmb2N1cyByZW1haW5zIGluIHRoZSBkaWFsb2cuCgogICAgICBAaGVybyBoZXJvLnN2ZwogICAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAgQHBvbHltZXJCZWhhdmlvciBQYXBlckRpYWxvZ0JlaGF2aW9yCiAgICAgKi8KICAgIGNvbnN0IFBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsID0gewoKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHsncm9sZSc6ICdkaWFsb2cnLCAndGFiaW5kZXgnOiAnLTEnfSwKCiAgICAgIHByb3BlcnRpZXM6IHsKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgYG1vZGFsYCBpcyB0cnVlLCB0aGlzIGltcGxpZXMgYG5vLWNhbmNlbC1vbi1vdXRzaWRlLWNsaWNrYCwKICAgICAgICAgKiBgbm8tY2FuY2VsLW9uLWVzYy1rZXlgIGFuZCBgd2l0aC1iYWNrZHJvcGAuCiAgICAgICAgICovCiAgICAgICAgbW9kYWw6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICBfX3JlYWRpZWQ6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9CgogICAgICB9LAoKICAgICAgb2JzZXJ2ZXJzOiBbJ19tb2RhbENoYW5nZWQobW9kYWwsIF9fcmVhZGllZCknXSwKCiAgICAgIGxpc3RlbmVyczogeyd0YXAnOiAnX29uRGlhbG9nQ2xpY2snfSwKCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgcmVhZHk6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIE9ubHkgbm93IHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIHJlYWQuCiAgICAgICAgdGhpcy5fX3ByZXZOb0NhbmNlbE9uT3V0c2lkZUNsaWNrID0gdGhpcy5ub0NhbmNlbE9uT3V0c2lkZUNsaWNrOwogICAgICAgIHRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSA9IHRoaXMubm9DYW5jZWxPbkVzY0tleTsKICAgICAgICB0aGlzLl9fcHJldldpdGhCYWNrZHJvcCA9IHRoaXMud2l0aEJhY2tkcm9wOwogICAgICAgIHRoaXMuX19yZWFkaWVkID0gdHJ1ZTsKICAgICAgfSwKCiAgICAgIF9tb2RhbENoYW5nZWQ6IGZ1bmN0aW9uKG1vZGFsLCByZWFkaWVkKSB7CiAgICAgICAgLy8gbW9kYWwgaW1wbGllcyBub0NhbmNlbE9uT3V0c2lkZUNsaWNrLCBub0NhbmNlbE9uRXNjS2V5IGFuZCB3aXRoQmFja2Ryb3AuCiAgICAgICAgLy8gV2UgbmVlZCB0byB3YWl0IGZvciB0aGUgZWxlbWVudCB0byBiZSByZWFkeSBiZWZvcmUgd2UgY2FuIHJlYWQgdGhlCiAgICAgICAgLy8gcHJvcGVydGllcyB2YWx1ZXMuCiAgICAgICAgaWYgKCFyZWFkaWVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBpZiAobW9kYWwpIHsKICAgICAgICAgIHRoaXMuX19wcmV2Tm9DYW5jZWxPbk91dHNpZGVDbGljayA9IHRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljazsKICAgICAgICAgIHRoaXMuX19wcmV2Tm9DYW5jZWxPbkVzY0tleSA9IHRoaXMubm9DYW5jZWxPbkVzY0tleTsKICAgICAgICAgIHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wID0gdGhpcy53aXRoQmFja2Ryb3A7CiAgICAgICAgICB0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2sgPSB0cnVlOwogICAgICAgICAgdGhpcy5ub0NhbmNlbE9uRXNjS2V5ID0gdHJ1ZTsKICAgICAgICAgIHRoaXMud2l0aEJhY2tkcm9wID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gSWYgdGhlIHZhbHVlIHdhcyBjaGFuZ2VkIHRvIGZhbHNlLCBsZXQgaXQgZmFsc2UuCiAgICAgICAgICB0aGlzLm5vQ2FuY2VsT25PdXRzaWRlQ2xpY2sgPQogICAgICAgICAgICAgIHRoaXMubm9DYW5jZWxPbk91dHNpZGVDbGljayAmJiB0aGlzLl9fcHJldk5vQ2FuY2VsT25PdXRzaWRlQ2xpY2s7CiAgICAgICAgICB0aGlzLm5vQ2FuY2VsT25Fc2NLZXkgPQogICAgICAgICAgICAgIHRoaXMubm9DYW5jZWxPbkVzY0tleSAmJiB0aGlzLl9fcHJldk5vQ2FuY2VsT25Fc2NLZXk7CiAgICAgICAgICB0aGlzLndpdGhCYWNrZHJvcCA9IHRoaXMud2l0aEJhY2tkcm9wICYmIHRoaXMuX19wcmV2V2l0aEJhY2tkcm9wOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkOiBmdW5jdGlvbihjb25maXJtZWQpIHsKICAgICAgICB0aGlzLmNsb3NpbmdSZWFzb24gPSB0aGlzLmNsb3NpbmdSZWFzb24gfHwge307CiAgICAgICAgdGhpcy5jbG9zaW5nUmVhc29uLmNvbmZpcm1lZCA9IGNvbmZpcm1lZDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBXaWxsIGRpc21pc3MgdGhlIGRpYWxvZyBpZiB1c2VyIGNsaWNrZWQgb24gYW4gZWxlbWVudCB3aXRoIGRpYWxvZy1kaXNtaXNzCiAgICAgICAqIG9yIGRpYWxvZy1jb25maXJtIGF0dHJpYnV0ZS4KICAgICAgICovCiAgICAgIF9vbkRpYWxvZ0NsaWNrOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGVsZW1lbnQgd2l0aCBkaWFsb2ctY29uZmlybSBvciBkaWFsb2ctZGlzbWlzcywKICAgICAgICAvLyBmcm9tIHRoZSByb290IHRhcmdldCB1bnRpbCB0aGlzIChleGNsdWRlZCkuCiAgICAgICAgdmFyIHBhdGggPSBkb20oZXZlbnQpLnBhdGg7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBwYXRoLmluZGV4T2YodGhpcyk7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIHZhciB0YXJnZXQgPSBwYXRoW2ldOwogICAgICAgICAgaWYgKHRhcmdldC5oYXNBdHRyaWJ1dGUgJiYKICAgICAgICAgICAgICAodGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlhbG9nLWRpc21pc3MnKSB8fAogICAgICAgICAgICAgICB0YXJnZXQuaGFzQXR0cmlidXRlKCdkaWFsb2ctY29uZmlybScpKSkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVDbG9zaW5nUmVhc29uQ29uZmlybWVkKAogICAgICAgICAgICAgICAgdGFyZ2V0Lmhhc0F0dHJpYnV0ZSgnZGlhbG9nLWNvbmZpcm0nKSk7CiAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IFBhcGVyRGlhbG9nQmVoYXZpb3IgPQogICAgICAgIFtJcm9uT3ZlcmxheUJlaGF2aW9yLCBQYXBlckRpYWxvZ0JlaGF2aW9ySW1wbF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbRGlhbG9nc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL2RpYWxvZ3MuaHRtbCkKCiAgICBgcGFwZXItZGlhbG9nLXNjcm9sbGFibGVgIGltcGxlbWVudHMgYSBzY3JvbGxpbmcgYXJlYSB1c2VkIGluIGEgTWF0ZXJpYWwgRGVzaWduCiAgICBkaWFsb2cuIEl0IHNob3dzIGEgZGl2aWRlciBhdCB0aGUgdG9wIGFuZC9vciBib3R0b20gaW5kaWNhdGluZyBtb3JlIGNvbnRlbnQsCiAgICBkZXBlbmRpbmcgb24gc2Nyb2xsIHBvc2l0aW9uLiBVc2UgdGhpcyB0b2dldGhlciB3aXRoIGVsZW1lbnRzIGltcGxlbWVudGluZwogICAgYFBvbHltZXIuUGFwZXJEaWFsb2dCZWhhdmlvcmAuCgogICAgICAgIDxwYXBlci1kaWFsb2ctaW1wbD4KICAgICAgICAgIDxoMj5IZWFkZXI8L2gyPgogICAgICAgICAgPHBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPgogICAgICAgICAgICBMb3JlbSBpcHN1bS4uLgogICAgICAgICAgPC9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgIDxkaXYgY2xhc3M9ImJ1dHRvbnMiPgogICAgICAgICAgICA8cGFwZXItYnV0dG9uPk9LPC9wYXBlci1idXR0b24+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLWRpYWxvZy1pbXBsPgoKICAgIEl0IHNob3dzIGEgdG9wIGRpdmlkZXIgYWZ0ZXIgc2Nyb2xsaW5nIGlmIGl0IGlzIG5vdCB0aGUgZmlyc3QgY2hpbGQgaW4gaXRzCiAgICBwYXJlbnQgY29udGFpbmVyLCBpbmRpY2F0aW5nIHRoZXJlIGlzIG1vcmUgY29udGVudCBhYm92ZS4gSXQgc2hvd3MgYSBib3R0b20KICAgIGRpdmlkZXIgaWYgaXQgaXMgc2Nyb2xsYWJsZSBhbmQgaXQgaXMgbm90IHRoZSBsYXN0IGNoaWxkIGluIGl0cyBwYXJlbnQKICAgIGNvbnRhaW5lciwgaW5kaWNhdGluZyB0aGVyZSBpcyBtb3JlIGNvbnRlbnQgYmVsb3cuIFRoZSBib3R0b20gZGl2aWRlciBpcyBoaWRkZW4KICAgIGlmIGl0IGlzIHNjcm9sbGVkIHRvIHRoZSBib3R0b20uCgogICAgSWYgYHBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlYCBpcyBub3QgYSBkaXJlY3QgY2hpbGQgb2YgdGhlIGVsZW1lbnQgaW1wbGVtZW50aW5nCiAgICBgUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yYCwgcmVtZW1iZXIgdG8gc2V0IHRoZSBgZGlhbG9nRWxlbWVudGA6CgogICAgICAgIDxwYXBlci1kaWFsb2ctaW1wbCBpZD0ibXlEaWFsb2ciPgogICAgICAgICAgPGgyPkhlYWRlcjwvaDI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJteS1jb250ZW50LXdyYXBwZXIiPgogICAgICAgICAgICA8aDQ+U3ViLWhlYWRlcjwvaDQ+CiAgICAgICAgICAgIDxwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgICAgICAgICBMb3JlbSBpcHN1bS4uLgogICAgICAgICAgICA8L3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJidXR0b25zIj4KICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbj5PSzwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1kaWFsb2ctaW1wbD4KCiAgICAgICAgPHNjcmlwdD4KICAgICAgICAgIHZhciBzY3JvbGxhYmxlID0KICAgIFBvbHltZXIuZG9tKG15RGlhbG9nKS5xdWVyeVNlbGVjdG9yKCdwYXBlci1kaWFsb2ctc2Nyb2xsYWJsZScpOwogICAgICAgICAgc2Nyb2xsYWJsZS5kaWFsb2dFbGVtZW50ID0gbXlEaWFsb2c7CiAgICAgICAgPC9KQVZBX1NDUklJSUlQVC8+CgogICAgIyMjIFN0eWxpbmcKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlYCB8IE1peGluIGZvciB0aGUgc2Nyb2xsYWJsZSBjb250ZW50IHwge30KCiAgICBAZ3JvdXAgUGFwZXIgRWxlbWVudHMKICAgIEBlbGVtZW50IHBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgIEBoZXJvIGhlcm8uc3ZnCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcy1zY3JvbGxlZDpub3QoOmZpcnN0LWNoaWxkKSk6OmJlZm9yZSB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGhlaWdodDogMXB4OwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWRpdmlkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdCguY2FuLXNjcm9sbDpub3QoLnNjcm9sbGVkLXRvLWJvdHRvbSk6bm90KDpsYXN0LWNoaWxkKSk6OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tZGl2aWRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC5zY3JvbGxhYmxlIHsKICAgICAgICBwYWRkaW5nOiAwIDI0cHg7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1zY3JvbGw7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXNjcm9sbGFibGU7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0ic2Nyb2xsYWJsZSIgY2xhc3M9InNjcm9sbGFibGUiIG9uLXNjcm9sbD0idXBkYXRlU2Nyb2xsU3RhdGUiPgogICAgICA8c2xvdD48L3Nsb3Q+CiAgICA8L2Rpdj4KYCwKCiAgICAgIGlzOiAncGFwZXItZGlhbG9nLXNjcm9sbGFibGUnLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGlhbG9nIGVsZW1lbnQgdGhhdCBpbXBsZW1lbnRzIGBQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JgCiAgICAgICAgICogY29udGFpbmluZyB0aGlzIGVsZW1lbnQuCiAgICAgICAgICogQHR5cGUgez9Ob2RlfQogICAgICAgICAqLwogICAgICAgIGRpYWxvZ0VsZW1lbnQ6IHt0eXBlOiBPYmplY3R9CgogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHNjcm9sbGluZyBlbGVtZW50LgogICAgICAgKi8KICAgICAgZ2V0IHNjcm9sbFRhcmdldCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kLnNjcm9sbGFibGU7CiAgICAgIH0sCgogICAgICByZWFkeTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlVGFyZ2V0KCk7CiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCduby1wYWRkaW5nJyk7CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlVGFyZ2V0KCk7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMudXBkYXRlU2Nyb2xsU3RhdGUuYmluZCh0aGlzKSk7CiAgICAgIH0sCgogICAgICB1cGRhdGVTY3JvbGxTdGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50b2dnbGVDbGFzcygnaXMtc2Nyb2xsZWQnLCB0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3AgPiAwKTsKICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKAogICAgICAgICAgICAnY2FuLXNjcm9sbCcsCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCA8IHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbEhlaWdodCk7CiAgICAgICAgdGhpcy50b2dnbGVDbGFzcygKICAgICAgICAgICAgJ3Njcm9sbGVkLXRvLWJvdHRvbScsCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCArIHRoaXMuc2Nyb2xsVGFyZ2V0Lm9mZnNldEhlaWdodCA+PQogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsSGVpZ2h0KTsKICAgICAgfSwKCiAgICAgIF9lbnN1cmVUYXJnZXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFJlYWQgcGFyZW50RWxlbWVudCBpbnN0ZWFkIG9mIHBhcmVudE5vZGUgaW4gb3JkZXIgdG8gc2tpcCBzaGFkb3dSb290cy4KICAgICAgICB0aGlzLmRpYWxvZ0VsZW1lbnQgPSB0aGlzLmRpYWxvZ0VsZW1lbnQgfHwgdGhpcy5wYXJlbnRFbGVtZW50OwogICAgICAgIC8vIENoZWNrIGlmIGRpYWxvZyBpbXBsZW1lbnRzIHBhcGVyLWRpYWxvZy1iZWhhdmlvci4gSWYgbm90LCBmaXQKICAgICAgICAvLyBzY3JvbGxUYXJnZXQgdG8gaG9zdC4KICAgICAgICBpZiAodGhpcy5kaWFsb2dFbGVtZW50ICYmIHRoaXMuZGlhbG9nRWxlbWVudC5iZWhhdmlvcnMgJiYKICAgICAgICAgICAgdGhpcy5kaWFsb2dFbGVtZW50LmJlaGF2aW9ycy5pbmRleE9mKFBhcGVyRGlhbG9nQmVoYXZpb3JJbXBsKSA+PSAwKSB7CiAgICAgICAgICB0aGlzLmRpYWxvZ0VsZW1lbnQuc2l6aW5nVGFyZ2V0ID0gdGhpcy5zY3JvbGxUYXJnZXQ7CiAgICAgICAgICB0aGlzLnNjcm9sbFRhcmdldC5jbGFzc0xpc3QucmVtb3ZlKCdmaXQnKTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZGlhbG9nRWxlbWVudCkgewogICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQuY2xhc3NMaXN0LmFkZCgnZml0Jyk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvLyBHaXZlIHRoZSB1c2VyIHRoZSBjaG9pY2UgdG8gb3B0IG91dCBvZiBmb250IGxvYWRpbmcuCiAgICBpZiAoIXdpbmRvdy5wb2x5bWVyU2tpcExvYWRpbmdGb250Um9ib3RvKSB7CiAgICAgIGNvbnN0IGxpbmsgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaW5rJyk7CiAgICAgIGxpbmsucmVsID0gJ3N0eWxlc2hlZXQnOwogICAgICBsaW5rLnR5cGUgPSAndGV4dC9jc3MnOwogICAgICBsaW5rLmNyb3NzT3JpZ2luID0gJ2Fub255bW91cyc7CiAgICAgIGxpbmsuaHJlZiA9CiAgICAgICAgICAnaHR0cHM6Ly9mb250cy5nb29nbGVhcGlzLmNvbS9jc3M/ZmFtaWx5PVJvYm90bytNb25vOjQwMCw3MDB8Um9ib3RvOjQwMCwzMDAsMzAwaXRhbGljLDQwMGl0YWxpYyw1MDAsNTAwaXRhbGljLDcwMCw3MDBpdGFsaWMnOwogICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKGxpbmspOwogICAgfQoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgY29uc3QgdGVtcGxhdGUkYSA9IGh0bWxgPGN1c3RvbS1zdHlsZT4KICA8c3R5bGUgaXM9ImN1c3RvbS1zdHlsZSI+CiAgICBodG1sIHsKCiAgICAgIC8qIFNoYXJlZCBTdHlsZXMgKi8KICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOiB7CiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8nLCAnTm90bycsIHNhbnMtc2VyaWY7CiAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLWNvZGU6IHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgJ0NvbnNvbGFzJywgJ01lbmxvJywgbW9ub3NwYWNlOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvbW1vbi1leHBlbnNpdmUta2VybmluZzogewogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDogewogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfTsKCiAgICAgIC8qIE1hdGVyaWFsIEZvbnQgU3R5bGVzICovCgogICAgICAtLXBhcGVyLWZvbnQtZGlzcGxheTQ6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKCiAgICAgICAgZm9udC1zaXplOiAxMTJweDsKICAgICAgICBmb250LXdlaWdodDogMzAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjA0NGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MzogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDU2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogLS4wMjZlbTsKICAgICAgICBsaW5lLWhlaWdodDogNjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1kaXNwbGF5MjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogNDVweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxOGVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiA0OHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWRpc3BsYXkxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAzNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0uMDFlbTsKICAgICAgICBsaW5lLWhlaWdodDogNDBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1oZWFkbGluZTogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMjRweDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAtLjAxMmVtOwogICAgICAgIGxpbmUtaGVpZ2h0OiAzMnB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LXRpdGxlOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyOHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LXN1YmhlYWQ6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwoKICAgICAgICBmb250LXNpemU6IDE2cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1ib2R5MjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CgogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJvZHkxOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY2FwdGlvbjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDQwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMTFlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICAgIC0tcGFwZXItZm9udC1tZW51OiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1ub3dyYXA7CgogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNHB4OwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWJ1dHRvbjogewogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tbm93cmFwOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsZXR0ZXItc3BhY2luZzogMC4wMThlbTsKICAgICAgICBsaW5lLWhlaWdodDogMjRweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICB9OwoKICAgICAgLS1wYXBlci1mb250LWNvZGUyOiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tY29kZTsKCiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgIH07CgogICAgICAtLXBhcGVyLWZvbnQtY29kZTE6IHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1jb2RlOwoKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgICBsaW5lLWhlaWdodDogMjBweDsKICAgICAgfTsKCiAgICB9CgogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPmA7CiAgICB0ZW1wbGF0ZSRhLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUkYS5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KICAgIGNvbnN0ICRfZG9jdW1lbnRDb250YWluZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpOwogICAgJF9kb2N1bWVudENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmU7Jyk7CgogICAgJF9kb2N1bWVudENvbnRhaW5lci5pbm5lckhUTUwgPSBgPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWRpYWxvZy1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDI0cHggNDBweDsKCiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItZGlhbG9nLWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWJvZHkxOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMTZkcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1kaWFsb2c7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDAgMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLm5vLXBhZGRpbmcpIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoKjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCo6bGFzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDI0cHg7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhpcyBzZWxlY3RvciB3YXMgXGA6aG9zdCA+IDo6Y29udGVudCBoMlxgLiBJbiAyLnggPHNsb3Q+IGFsbG93cwogICAgICB0byBzZWxlY3QgZGlyZWN0IGNoaWxkcmVuIG9ubHksIHdoaWNoIGluY3JlYXNlcyB0aGUgd2VpZ2h0IG9mIHRoaXMKICAgICAgc2VsZWN0b3IsIHNvIHdlIGhhdmUgdG8gcmUtZGVmaW5lIGZpcnN0LWNoaWxkL2xhc3QtY2hpbGQgbWFyZ2lucyBiZWxvdy4gKi8KICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoaDIpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWFyZ2luOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXRpdGxlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgLyogQXBwbHkgbWl4aW4gYWdhaW4sIGluIGNhc2UgaXQgc2V0cyBtYXJnaW4tdG9wLiAqLwogICAgICA6aG9zdCA+IDo6c2xvdHRlZChoMjpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDI0cHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZGlhbG9nLXRpdGxlOwogICAgICB9CgogICAgICAvKiBBcHBseSBtaXhpbiBhZ2FpbiwgaW4gY2FzZSBpdCBzZXRzIG1hcmdpbi1ib3R0b20uICovCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKGgyOmxhc3QtY2hpbGQpIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNHB4OwogICAgICAgIEBhcHBseSAtLXBhcGVyLWRpYWxvZy10aXRsZTsKICAgICAgfQoKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLnBhcGVyLWRpYWxvZy1idXR0b25zKSwKICAgICAgOmhvc3QgPiA6OnNsb3R0ZWQoLmJ1dHRvbnMpIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4IDhweCA4cHggMjRweDsKICAgICAgICBtYXJnaW46IDA7CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1kaWFsb2ctYnV0dG9uLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT5gOwoKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoJF9kb2N1bWVudENvbnRhaW5lci5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIGBOZW9uQW5pbWF0YWJsZUJlaGF2aW9yYCBpcyBpbXBsZW1lbnRlZCBieSBlbGVtZW50cyBjb250YWluaW5nCiAgICAgKiBhbmltYXRpb25zIGZvciB1c2Ugd2l0aCBlbGVtZW50cyBpbXBsZW1lbnRpbmcKICAgICAqIGBOZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JgLgogICAgICogQHBvbHltZXJCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBOZW9uQW5pbWF0YWJsZUJlaGF2aW9yID0gewoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBBbmltYXRpb24gY29uZmlndXJhdGlvbi4gU2VlIFJFQURNRSBmb3IgbW9yZSBpbmZvLgogICAgICAgICAqLwogICAgICAgIGFuaW1hdGlvbkNvbmZpZzoge3R5cGU6IE9iamVjdH0sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlbmllbmNlIHByb3BlcnR5IGZvciBzZXR0aW5nIGFuICdlbnRyeScgYW5pbWF0aW9uLiBEbyBub3Qgc2V0CiAgICAgICAgICogYGFuaW1hdGlvbkNvbmZpZy5lbnRyeWAgbWFudWFsbHkgaWYgdXNpbmcgdGhpcy4gVGhlIGFuaW1hdGVkIG5vZGUgaXMgc2V0CiAgICAgICAgICogdG8gYHRoaXNgIGlmIHVzaW5nIHRoaXMgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgZW50cnlBbmltYXRpb246IHsKICAgICAgICAgIG9ic2VydmVyOiAnX2VudHJ5QW5pbWF0aW9uQ2hhbmdlZCcsCiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udmVuaWVuY2UgcHJvcGVydHkgZm9yIHNldHRpbmcgYW4gJ2V4aXQnIGFuaW1hdGlvbi4gRG8gbm90IHNldAogICAgICAgICAqIGBhbmltYXRpb25Db25maWcuZXhpdGAgbWFudWFsbHkgaWYgdXNpbmcgdGhpcy4gVGhlIGFuaW1hdGVkIG5vZGUgaXMgc2V0CiAgICAgICAgICogdG8gYHRoaXNgIGlmIHVzaW5nIHRoaXMgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgZXhpdEFuaW1hdGlvbjogewogICAgICAgICAgb2JzZXJ2ZXI6ICdfZXhpdEFuaW1hdGlvbkNoYW5nZWQnLAogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0sCgogICAgICB9LAoKICAgICAgX2VudHJ5QW5pbWF0aW9uQ2hhbmdlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5hbmltYXRpb25Db25maWcgPSB0aGlzLmFuaW1hdGlvbkNvbmZpZyB8fCB7fTsKICAgICAgICB0aGlzLmFuaW1hdGlvbkNvbmZpZ1snZW50cnknXSA9IFt7bmFtZTogdGhpcy5lbnRyeUFuaW1hdGlvbiwgbm9kZTogdGhpc31dOwogICAgICB9LAoKICAgICAgX2V4aXRBbmltYXRpb25DaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmFuaW1hdGlvbkNvbmZpZyA9IHRoaXMuYW5pbWF0aW9uQ29uZmlnIHx8IHt9OwogICAgICAgIHRoaXMuYW5pbWF0aW9uQ29uZmlnWydleGl0J10gPSBbe25hbWU6IHRoaXMuZXhpdEFuaW1hdGlvbiwgbm9kZTogdGhpc31dOwogICAgICB9LAoKICAgICAgX2NvcHlQcm9wZXJ0aWVzOiBmdW5jdGlvbihjb25maWcxLCBjb25maWcyKSB7CiAgICAgICAgLy8gc2hhbGxvd2x5IGNvcHkgcHJvcGVydGllcyBmcm9tIGNvbmZpZzIgdG8gY29uZmlnMQogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGNvbmZpZzIpIHsKICAgICAgICAgIGNvbmZpZzFbcHJvcGVydHldID0gY29uZmlnMltwcm9wZXJ0eV07CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2Nsb25lQ29uZmlnOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICB2YXIgY2xvbmUgPSB7aXNDbG9uZTogdHJ1ZX07CiAgICAgICAgdGhpcy5fY29weVByb3BlcnRpZXMoY2xvbmUsIGNvbmZpZyk7CiAgICAgICAgcmV0dXJuIGNsb25lOwogICAgICB9LAoKICAgICAgX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZTogZnVuY3Rpb24odHlwZSwgbWFwLCBhbGxDb25maWdzKSB7CiAgICAgICAgaWYgKCF0aGlzLmFuaW1hdGlvbkNvbmZpZykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uQ29uZmlnLnZhbHVlICYmCiAgICAgICAgICAgIHR5cGVvZiB0aGlzLmFuaW1hdGlvbkNvbmZpZy52YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgdGhpcy5fd2Fybih0aGlzLl9sb2dmKAogICAgICAgICAgICAgICdwbGF5QW5pbWF0aW9uJywKICAgICAgICAgICAgICAnUGxlYXNlIHB1dCBcJ2FuaW1hdGlvbkNvbmZpZ1wnIGluc2lkZSBvZiB5b3VyIGNvbXBvbmVudHMgXCdwcm9wZXJ0aWVzXCcgb2JqZWN0IGluc3RlYWQgb2Ygb3V0c2lkZSBvZiBpdC4nKSk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyB0eXBlIGlzIG9wdGlvbmFsCiAgICAgICAgdmFyIHRoaXNDb25maWc7CiAgICAgICAgaWYgKHR5cGUpIHsKICAgICAgICAgIHRoaXNDb25maWcgPSB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0eXBlXTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpc0NvbmZpZyA9IHRoaXMuYW5pbWF0aW9uQ29uZmlnOwogICAgICAgIH0KCiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXNDb25maWcpKSB7CiAgICAgICAgICB0aGlzQ29uZmlnID0gW3RoaXNDb25maWddOwogICAgICAgIH0KCiAgICAgICAgLy8gaXRlcmF0ZSBhbmltYXRpb25zIGFuZCByZWN1cnNlIHRvIHByb2Nlc3MgY29uZmlndXJhdGlvbnMgZnJvbSBjaGlsZCBub2RlcwogICAgICAgIGlmICh0aGlzQ29uZmlnKSB7CiAgICAgICAgICBmb3IgKHZhciBjb25maWcsIGluZGV4ID0gMDsgY29uZmlnID0gdGhpc0NvbmZpZ1tpbmRleF07IGluZGV4KyspIHsKICAgICAgICAgICAgaWYgKGNvbmZpZy5hbmltYXRhYmxlKSB7CiAgICAgICAgICAgICAgY29uZmlnLmFuaW1hdGFibGUuX2dldEFuaW1hdGlvbkNvbmZpZ1JlY3Vyc2l2ZSgKICAgICAgICAgICAgICAgICAgY29uZmlnLnR5cGUgfHwgdHlwZSwgbWFwLCBhbGxDb25maWdzKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoY29uZmlnLmlkKSB7CiAgICAgICAgICAgICAgICB2YXIgY2FjaGVkQ29uZmlnID0gbWFwW2NvbmZpZy5pZF07CiAgICAgICAgICAgICAgICBpZiAoY2FjaGVkQ29uZmlnKSB7CiAgICAgICAgICAgICAgICAgIC8vIG1lcmdlIGNvbmZpZ3VyYXRpb25zIHdpdGggdGhlIHNhbWUgaWQsIG1ha2luZyBhIGNsb25lIGxhemlseQogICAgICAgICAgICAgICAgICBpZiAoIWNhY2hlZENvbmZpZy5pc0Nsb25lKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwW2NvbmZpZy5pZF0gPSB0aGlzLl9jbG9uZUNvbmZpZyhjYWNoZWRDb25maWcpOwogICAgICAgICAgICAgICAgICAgIGNhY2hlZENvbmZpZyA9IG1hcFtjb25maWcuaWRdOwogICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgIHRoaXMuX2NvcHlQcm9wZXJ0aWVzKGNhY2hlZENvbmZpZywgY29uZmlnKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIC8vIHB1dCBhbnkgY29uZmlncyB3aXRoIGFuIGlkIGludG8gYSBtYXAKICAgICAgICAgICAgICAgICAgbWFwW2NvbmZpZy5pZF0gPSBjb25maWc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGFsbENvbmZpZ3MucHVzaChjb25maWcpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBbiBlbGVtZW50IGltcGxlbWVudGluZyBgTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yYCBjYWxscyB0aGlzCiAgICAgICAqIG1ldGhvZCB0byBjb25maWd1cmUgYW4gYW5pbWF0aW9uIHdpdGggYW4gb3B0aW9uYWwgdHlwZS4gRWxlbWVudHMKICAgICAgICogaW1wbGVtZW50aW5nIGBOZW9uQW5pbWF0YWJsZUJlaGF2aW9yYCBzaG91bGQgZGVmaW5lIHRoZSBwcm9wZXJ0eQogICAgICAgKiBgYW5pbWF0aW9uQ29uZmlnYCwgd2hpY2ggaXMgZWl0aGVyIGEgY29uZmlndXJhdGlvbiBvYmplY3Qgb3IgYSBtYXAgb2YKICAgICAgICogYW5pbWF0aW9uIHR5cGUgdG8gYXJyYXkgb2YgY29uZmlndXJhdGlvbiBvYmplY3RzLgogICAgICAgKi8KICAgICAgZ2V0QW5pbWF0aW9uQ29uZmlnOiBmdW5jdGlvbih0eXBlKSB7CiAgICAgICAgdmFyIG1hcCA9IHt9OwogICAgICAgIHZhciBhbGxDb25maWdzID0gW107CiAgICAgICAgdGhpcy5fZ2V0QW5pbWF0aW9uQ29uZmlnUmVjdXJzaXZlKHR5cGUsIG1hcCwgYWxsQ29uZmlncyk7CiAgICAgICAgLy8gYXBwZW5kIHRoZSBjb25maWd1cmF0aW9ucyBzYXZlZCBpbiB0aGUgbWFwIHRvIHRoZSBhcnJheQogICAgICAgIGZvciAodmFyIGtleSBpbiBtYXApIHsKICAgICAgICAgIGFsbENvbmZpZ3MucHVzaChtYXBba2V5XSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGxDb25maWdzOwogICAgICB9CgogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIGBOZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3JgIGFkZHMgYSBtZXRob2QgdG8gcnVuIGFuaW1hdGlvbnMuCiAgICAgKgogICAgICogQHBvbHltZXJCZWhhdmlvciBOZW9uQW5pbWF0aW9uUnVubmVyQmVoYXZpb3IKICAgICAqLwogICAgY29uc3QgTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9ySW1wbCA9IHsKCiAgICAgIF9jb25maWd1cmVBbmltYXRpb25zOiBmdW5jdGlvbihjb25maWdzKSB7CiAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICB2YXIgcmVzdWx0c1RvUGxheSA9IFtdOwoKICAgICAgICBpZiAoY29uZmlncy5sZW5ndGggPiAwKSB7CiAgICAgICAgICBmb3IgKGxldCBjb25maWcsIGluZGV4ID0gMDsgY29uZmlnID0gY29uZmlnc1tpbmRleF07IGluZGV4KyspIHsKICAgICAgICAgICAgbGV0IG5lb25BbmltYXRpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGNvbmZpZy5uYW1lKTsKICAgICAgICAgICAgLy8gaXMgdGhpcyBlbGVtZW50IGFjdHVhbGx5IGEgbmVvbiBhbmltYXRpb24/CiAgICAgICAgICAgIGlmIChuZW9uQW5pbWF0aW9uLmlzTmVvbkFuaW1hdGlvbikgewogICAgICAgICAgICAgIGxldCByZXN1bHQgPSBudWxsOwogICAgICAgICAgICAgIC8vIENsb3N1cmUgY29tcGlsZXIgZG9lcyBub3Qgd29yayB3ZWxsIHdpdGggYSB0cnkgLyBjYXRjaCBoZXJlLgogICAgICAgICAgICAgIC8vIC5jb25maWd1cmUgbmVlZHMgdG8gYmUgZXhwbGljaXRseSBkZWZpbmVkCiAgICAgICAgICAgICAgaWYgKCFuZW9uQW5pbWF0aW9uLmNvbmZpZ3VyZSkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0ge09iamVjdH0gY29uZmlnCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHtBbmltYXRpb25FZmZlY3RSZWFkT25seX0KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbmVvbkFuaW1hdGlvbi5jb25maWd1cmUgPSBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgcmVzdWx0ID0gbmVvbkFuaW1hdGlvbi5jb25maWd1cmUoY29uZmlnKTsKICAgICAgICAgICAgICByZXN1bHRzVG9QbGF5LnB1c2goewogICAgICAgICAgICAgICAgcmVzdWx0OiByZXN1bHQsCiAgICAgICAgICAgICAgICBjb25maWc6IGNvbmZpZywKICAgICAgICAgICAgICAgIG5lb25BbmltYXRpb246IG5lb25BbmltYXRpb24sCiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgY29uc29sZS53YXJuKHRoaXMuaXMgKyAnOicsIGNvbmZpZy5uYW1lLCAnbm90IGZvdW5kIScpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHJlc3VsdHNUb1BsYXkubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGxldCByZXN1bHQgPSByZXN1bHRzVG9QbGF5W2ldLnJlc3VsdDsKICAgICAgICAgIGxldCBjb25maWcgPSByZXN1bHRzVG9QbGF5W2ldLmNvbmZpZzsKICAgICAgICAgIGxldCBuZW9uQW5pbWF0aW9uID0gcmVzdWx0c1RvUGxheVtpXS5uZW9uQW5pbWF0aW9uOwogICAgICAgICAgLy8gY29uZmlndXJhdGlvbiBvciBwbGF5IGNvdWxkIGZhaWwgaWYgcG9seWZpbGxzIGFyZW4ndCBsb2FkZWQKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8vIENoZWNrIGlmIHdlIGhhdmUgYW4gRWZmZWN0IHJhdGhlciB0aGFuIGFuIEFuaW1hdGlvbgogICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdC5jYW5jZWwgIT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgIHJlc3VsdCA9IGRvY3VtZW50LnRpbWVsaW5lLnBsYXkocmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgICByZXN1bHQgPSBudWxsOwogICAgICAgICAgICBjb25zb2xlLndhcm4oJ0NvdWxkbnQgcGxheScsICcoJywgY29uZmlnLm5hbWUsICcpLicsIGUpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICBuZW9uQW5pbWF0aW9uOiBuZW9uQW5pbWF0aW9uLAogICAgICAgICAgICAgIGNvbmZpZzogY29uZmlnLAogICAgICAgICAgICAgIGFuaW1hdGlvbjogcmVzdWx0LAogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICB9LAoKICAgICAgX3Nob3VsZENvbXBsZXRlOiBmdW5jdGlvbihhY3RpdmVFbnRyaWVzKSB7CiAgICAgICAgdmFyIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdGl2ZUVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGlmIChhY3RpdmVFbnRyaWVzW2ldLmFuaW1hdGlvbi5wbGF5U3RhdGUgIT0gJ2ZpbmlzaGVkJykgewogICAgICAgICAgICBmaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbmlzaGVkOwogICAgICB9LAoKICAgICAgX2NvbXBsZXRlOiBmdW5jdGlvbihhY3RpdmVFbnRyaWVzKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhY3RpdmVFbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBhY3RpdmVFbnRyaWVzW2ldLm5lb25BbmltYXRpb24uY29tcGxldGUoYWN0aXZlRW50cmllc1tpXS5jb25maWcpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFjdGl2ZUVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgIGFjdGl2ZUVudHJpZXNbaV0uYW5pbWF0aW9uLmNhbmNlbCgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBQbGF5cyBhbiBhbmltYXRpb24gd2l0aCBhbiBvcHRpb25hbCBgdHlwZWAuCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nPX0gdHlwZQogICAgICAgKiBAcGFyYW0geyFPYmplY3Q9fSBjb29raWUKICAgICAgICovCiAgICAgIHBsYXlBbmltYXRpb246IGZ1bmN0aW9uKHR5cGUsIGNvb2tpZSkgewogICAgICAgIHZhciBjb25maWdzID0gdGhpcy5nZXRBbmltYXRpb25Db25maWcodHlwZSk7CiAgICAgICAgaWYgKCFjb25maWdzKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRoaXMuX2FjdGl2ZSB8fCB7fTsKICAgICAgICBpZiAodGhpcy5fYWN0aXZlW3R5cGVdKSB7CiAgICAgICAgICB0aGlzLl9jb21wbGV0ZSh0aGlzLl9hY3RpdmVbdHlwZV0pOwogICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZVt0eXBlXTsKICAgICAgICB9CgogICAgICAgIHZhciBhY3RpdmVFbnRyaWVzID0gdGhpcy5fY29uZmlndXJlQW5pbWF0aW9ucyhjb25maWdzKTsKCiAgICAgICAgaWYgKGFjdGl2ZUVudHJpZXMubGVuZ3RoID09IDApIHsKICAgICAgICAgIHRoaXMuZmlyZSgnbmVvbi1hbmltYXRpb24tZmluaXNoJywgY29va2llLCB7YnViYmxlczogZmFsc2V9KTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2FjdGl2ZVt0eXBlXSA9IGFjdGl2ZUVudHJpZXM7CgogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYWN0aXZlRW50cmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgYWN0aXZlRW50cmllc1tpXS5hbmltYXRpb24ub25maW5pc2ggPSBmdW5jdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Nob3VsZENvbXBsZXRlKGFjdGl2ZUVudHJpZXMpKSB7CiAgICAgICAgICAgICAgdGhpcy5fY29tcGxldGUoYWN0aXZlRW50cmllcyk7CiAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2FjdGl2ZVt0eXBlXTsKICAgICAgICAgICAgICB0aGlzLmZpcmUoJ25lb24tYW5pbWF0aW9uLWZpbmlzaCcsIGNvb2tpZSwge2J1YmJsZXM6IGZhbHNlfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0uYmluZCh0aGlzKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FuY2VscyB0aGUgY3VycmVudGx5IHJ1bm5pbmcgYW5pbWF0aW9ucy4KICAgICAgICovCiAgICAgIGNhbmNlbEFuaW1hdGlvbjogZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgayBpbiB0aGlzLl9hY3RpdmUpIHsKICAgICAgICAgIHZhciBlbnRyaWVzID0gdGhpcy5fYWN0aXZlW2tdOwoKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaiBpbiBlbnRyaWVzKSB7CiAgICAgICAgICAgIGVudHJpZXNbal0uYW5pbWF0aW9uLmNhbmNlbCgpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWN0aXZlID0ge307CiAgICAgIH0KICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IE5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvciA9CiAgICAgICAgW05lb25BbmltYXRhYmxlQmVoYXZpb3IsIE5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvckltcGxdOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgTWF0ZXJpYWwgZGVzaWduOgogICAgW0RpYWxvZ3NdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9kaWFsb2dzLmh0bWwpCgogICAgYDxwYXBlci1kaWFsb2c+YCBpcyBhIGRpYWxvZyB3aXRoIE1hdGVyaWFsIERlc2lnbiBzdHlsaW5nIGFuZCBvcHRpb25hbAogICAgYW5pbWF0aW9ucyB3aGVuIGl0IGlzIG9wZW5lZCBvciBjbG9zZWQuIEl0IHByb3ZpZGVzIHN0eWxlcyBmb3IgYSBoZWFkZXIsIGNvbnRlbnQKICAgIGFyZWEsIGFuZCBhbiBhY3Rpb24gYXJlYSBmb3IgYnV0dG9ucy4gWW91IGNhbiB1c2UgdGhlCiAgICBgPHBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPmAgZWxlbWVudCAoaW4gaXRzIG93biByZXBvc2l0b3J5KSBpZiB5b3UgbmVlZCBhCiAgICBzY3JvbGxpbmcgY29udGVudCBhcmVhLiBUbyBhdXRvZm9jdXMgYSBzcGVjaWZpYyBjaGlsZCBlbGVtZW50IGFmdGVyIG9wZW5pbmcgdGhlCiAgICBkaWFsb2csIGdpdmUgaXQgdGhlIGBhdXRvZm9jdXNgIGF0dHJpYnV0ZS4gU2VlIGBQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JgIGFuZAogICAgYFBvbHltZXIuSXJvbk92ZXJsYXlCZWhhdmlvcmAgZm9yIHNwZWNpZmljcy4KCiAgICBGb3IgZXhhbXBsZSwgdGhlIGZvbGxvd2luZyBjb2RlIGltcGxlbWVudHMgYSBkaWFsb2cgd2l0aCBhIGhlYWRlciwgc2Nyb2xsaW5nCiAgICBjb250ZW50IGFyZWEgYW5kIGJ1dHRvbnMuIEZvY3VzIHdpbGwgYmUgZ2l2ZW4gdG8gdGhlIGBkaWFsb2ctY29uZmlybWAgYnV0dG9uCiAgICB3aGVuIHRoZSBkaWFsb2cgaXMgb3BlbmVkLgoKICAgICAgICA8cGFwZXItZGlhbG9nPgogICAgICAgICAgPGgyPkhlYWRlcjwvaDI+CiAgICAgICAgICA8cGFwZXItZGlhbG9nLXNjcm9sbGFibGU+CiAgICAgICAgICAgIExvcmVtIGlwc3VtLi4uCiAgICAgICAgICA8L3BhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPgogICAgICAgICAgPGRpdiBjbGFzcz0iYnV0dG9ucyI+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWRpc21pc3M+Q2FuY2VsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDxwYXBlci1idXR0b24gZGlhbG9nLWNvbmZpcm0gYXV0b2ZvY3VzPkFjY2VwdDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9wYXBlci1kaWFsb2c+CgogICAgIyMjIFN0eWxpbmcKCiAgICBTZWUgdGhlIGRvY3MgZm9yIGBQb2x5bWVyLlBhcGVyRGlhbG9nQmVoYXZpb3JgIGZvciB0aGUgY3VzdG9tIHByb3BlcnRpZXMKICAgIGF2YWlsYWJsZSBmb3Igc3R5bGluZyB0aGlzIGVsZW1lbnQuCgogICAgIyMjIEFuaW1hdGlvbnMKCiAgICBTZXQgdGhlIGBlbnRyeS1hbmltYXRpb25gIGFuZC9vciBgZXhpdC1hbmltYXRpb25gIGF0dHJpYnV0ZXMgdG8gYWRkIGFuIGFuaW1hdGlvbgogICAgd2hlbiB0aGUgZGlhbG9nIGlzIG9wZW5lZCBvciBjbG9zZWQuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBpbgogICAgW1BvbHltZXJFbGVtZW50cy9uZW9uLWFuaW1hdGlvbl0oaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9uZW9uLWFuaW1hdGlvbikKICAgIGZvciBtb3JlIGluZm8uCgogICAgRm9yIGV4YW1wbGU6CgogICAgICAgIDxzY3JpcHQgdHlwZT0ibW9kdWxlIj4KICAgICAgICAgIGltcG9ydCAnQHBvbHltZXIvbmVvbi1hbmltYXRpb24vYW5pbWF0aW9ucy9mYWRlLW91dC1hbmltYXRpb24uanMnOwogICAgICAgICAgaW1wb3J0ICdAcG9seW1lci9uZW9uLWFuaW1hdGlvbi9hbmltYXRpb25zL3NjYWxlLXVwLWFuaW1hdGlvbi5qcyc7CiAgICAgICAgPC9KQVZBX1NDUklJSUlQVC8+CgogICAgICAgIDxwYXBlci1kaWFsb2cgZW50cnktYW5pbWF0aW9uPSJzY2FsZS11cC1hbmltYXRpb24iCiAgICAgICAgICAgICAgICAgICAgICBleGl0LWFuaW1hdGlvbj0iZmFkZS1vdXQtYW5pbWF0aW9uIj4KICAgICAgICAgIDxoMj5IZWFkZXI8L2gyPgogICAgICAgICAgPGRpdj5EaWFsb2cgYm9keTwvZGl2PgogICAgICAgIDwvcGFwZXItZGlhbG9nPgoKICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgU2VlIHRoZSBkb2NzIGZvciBgUG9seW1lci5QYXBlckRpYWxvZ0JlaGF2aW9yYCBmb3IgYWNjZXNzaWJpbGl0eSBmZWF0dXJlcwogICAgaW1wbGVtZW50ZWQgYnkgdGhpcyBlbGVtZW50LgoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItZGlhbG9nCiAgICBAaGVybyBoZXJvLnN2ZwogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1kaWFsb2ctc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KICAgIDxzbG90Pjwvc2xvdD4KYCwKCiAgICAgIGlzOiAncGFwZXItZGlhbG9nJywKICAgICAgYmVoYXZpb3JzOiBbUGFwZXJEaWFsb2dCZWhhdmlvciwgTmVvbkFuaW1hdGlvblJ1bm5lckJlaGF2aW9yXSwKICAgICAgbGlzdGVuZXJzOiB7J25lb24tYW5pbWF0aW9uLWZpbmlzaCc6ICdfb25OZW9uQW5pbWF0aW9uRmluaXNoJ30sCgogICAgICBfcmVuZGVyT3BlbmVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbigpOwogICAgICAgIHRoaXMucGxheUFuaW1hdGlvbignZW50cnknKTsKICAgICAgfSwKCiAgICAgIF9yZW5kZXJDbG9zZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY2FuY2VsQW5pbWF0aW9uKCk7CiAgICAgICAgdGhpcy5wbGF5QW5pbWF0aW9uKCdleGl0Jyk7CiAgICAgIH0sCgogICAgICBfb25OZW9uQW5pbWF0aW9uRmluaXNoOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHsKICAgICAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgYGlyb24tYTExeS1hbm5vdW5jZXJgIGlzIGEgc2luZ2xldG9uIGVsZW1lbnQgdGhhdCBpcyBpbnRlbmRlZCB0byBhZGQgYTExeQogICAgdG8gZmVhdHVyZXMgdGhhdCByZXF1aXJlIG9uLWRlbWFuZCBhbm5vdW5jZW1lbnQgZnJvbSBzY3JlZW4gcmVhZGVycy4gSW4KICAgIG9yZGVyIHRvIG1ha2UgdXNlIG9mIHRoZSBhbm5vdW5jZXIsIGl0IGlzIGJlc3QgdG8gcmVxdWVzdCBpdHMgYXZhaWxhYmlsaXR5CiAgICBpbiB0aGUgYW5ub3VuY2luZyBlbGVtZW50LgoKICAgIEV4YW1wbGU6CgogICAgICAgIFBvbHltZXIoewoKICAgICAgICAgIGlzOiAneC1jaGF0dHknLAoKICAgICAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGNyZWF0ZSB0aGUgc2luZ2xldG9uIGVsZW1lbnQgaWYgaXQgaGFzIG5vdAogICAgICAgICAgICAvLyBiZWVuIGNyZWF0ZWQgeWV0OgogICAgICAgICAgICBQb2x5bWVyLklyb25BMTF5QW5ub3VuY2VyLnJlcXVlc3RBdmFpbGFiaWxpdHkoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICBBZnRlciB0aGUgYGlyb24tYTExeS1hbm5vdW5jZXJgIGhhcyBiZWVuIG1hZGUgYXZhaWxhYmxlLCBlbGVtZW50cyBjYW4KICAgIG1ha2UgYW5ub3VuY2VzIGJ5IGZpcmluZyBidWJibGluZyBgaXJvbi1hbm5vdW5jZWAgZXZlbnRzLgoKICAgIEV4YW1wbGU6CgogICAgICAgIHRoaXMuZmlyZSgnaXJvbi1hbm5vdW5jZScsIHsKICAgICAgICAgIHRleHQ6ICdUaGlzIGlzIGFuIGFubm91bmNlbWVudCEnCiAgICAgICAgfSwgeyBidWJibGVzOiB0cnVlIH0pOwoKICAgIE5vdGU6IGFubm91bmNlbWVudHMgYXJlIG9ubHkgYXVkaWJsZSBpZiB5b3UgaGF2ZSBhIHNjcmVlbiByZWFkZXIgZW5hYmxlZC4KCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBjb25zdCBJcm9uQTExeUFubm91bmNlciA9IFBvbHltZXIoewogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgY2xpcDogcmVjdCgwcHgsMHB4LDBweCwwcHgpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPGRpdiBhcmlhLWxpdmUkPSJbW21vZGVdXSI+W1tfdGV4dF1dPC9kaXY+CmAsCgogICAgICBpczogJ2lyb24tYTExeS1hbm5vdW5jZXInLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdmFsdWUgb2YgbW9kZSBpcyB1c2VkIHRvIHNldCB0aGUgYGFyaWEtbGl2ZWAgYXR0cmlidXRlCiAgICAgICAgICogZm9yIHRoZSBlbGVtZW50IHRoYXQgd2lsbCBiZSBhbm5vdW5jZWQuIFZhbGlkIHZhbHVlcyBhcmU6IGBvZmZgLAogICAgICAgICAqIGBwb2xpdGVgIGFuZCBgYXNzZXJ0aXZlYC4KICAgICAgICAgKi8KICAgICAgICBtb2RlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ3BvbGl0ZSd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdGltZW91dCBvbiByZWZyZXNoaW5nIHRoZSBhbm5vdW5jZW1lbnQgdGV4dC4gTGFyZ2VyIHRpbWVvdXRzIGFyZQogICAgICAgICAqIG5lZWRlZCBmb3IgY2VydGFpbiBzY3JlZW4gcmVhZGVycyB0byByZS1hbm5vdW5jZSB0aGUgc2FtZSBtZXNzYWdlLgogICAgICAgICAqLwogICAgICAgIHRpbWVvdXQ6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAxNTB9LAoKICAgICAgICBfdGV4dDoge3R5cGU6IFN0cmluZywgdmFsdWU6ICcnfSwKICAgICAgfSwKCiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCFJcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSkgewogICAgICAgICAgSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2UgPSB0aGlzOwogICAgICAgIH0KCiAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignaXJvbi1hbm5vdW5jZScsIHRoaXMuX29uSXJvbkFubm91bmNlLmJpbmQodGhpcykpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhdXNlIGEgdGV4dCBzdHJpbmcgdG8gYmUgYW5ub3VuY2VkIGJ5IHNjcmVlbiByZWFkZXJzLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGV4dCBUaGUgdGV4dCB0aGF0IHNob3VsZCBiZSBhbm5vdW5jZWQuCiAgICAgICAqLwogICAgICBhbm5vdW5jZTogZnVuY3Rpb24odGV4dCkgewogICAgICAgIHRoaXMuX3RleHQgPSAnJzsKICAgICAgICB0aGlzLmFzeW5jKGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5fdGV4dCA9IHRleHQ7CiAgICAgICAgfSwgdGhpcy50aW1lb3V0KTsKICAgICAgfSwKCiAgICAgIF9vbklyb25Bbm5vdW5jZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoZXZlbnQuZGV0YWlsICYmIGV2ZW50LmRldGFpbC50ZXh0KSB7CiAgICAgICAgICB0aGlzLmFubm91bmNlKGV2ZW50LmRldGFpbC50ZXh0KTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIElyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlID0gbnVsbDsKCiAgICBJcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5ID0gZnVuY3Rpb24oKSB7CiAgICAgIGlmICghSXJvbkExMXlBbm5vdW5jZXIuaW5zdGFuY2UpIHsKICAgICAgICBJcm9uQTExeUFubm91bmNlci5pbnN0YW5jZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lyb24tYTExeS1hbm5vdW5jZXInKTsKICAgICAgfQoKICAgICAgaWYgKGRvY3VtZW50LmJvZHkpIHsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKElyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKElyb25BMTF5QW5ub3VuY2VyLmluc3RhbmNlKTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgIGA8aXJvbi1pbnB1dD5gIGlzIGEgd3JhcHBlciB0byBhIG5hdGl2ZSBgPGlucHV0PmAgZWxlbWVudCwgdGhhdCBhZGRzIHR3by13YXkKICAgIGJpbmRpbmcgYW5kIHByZXZlbnRpb24gb2YgaW52YWxpZCBpbnB1dC4gVG8gdXNlIGl0LCB5b3UgbXVzdCBkaXN0cmlidXRlIGEgbmF0aXZlCiAgICBgPGlucHV0PmAgeW91cnNlbGYuIFlvdSBjYW4gY29udGludWUgdG8gdXNlIHRoZSBuYXRpdmUgYGlucHV0YCBhcyB5b3Ugd291bGQKICAgIG5vcm1hbGx5OgoKICAgICAgICA8aXJvbi1pbnB1dD4KICAgICAgICAgIDxpbnB1dD4KICAgICAgICA8L2lyb24taW5wdXQ+CgogICAgICAgIDxpcm9uLWlucHV0PgogICAgICAgICAgPGlucHV0IHR5cGU9ImVtYWlsIiBkaXNhYmxlZD4KICAgICAgICA8L2lyb24taW5wdXQ+CgogICAgIyMjIFR3by13YXkgYmluZGluZwoKICAgIEJ5IGRlZmF1bHQgeW91IGNhbiBvbmx5IGdldCBub3RpZmllZCBvZiBjaGFuZ2VzIHRvIGEgbmF0aXZlIGA8aW5wdXQ+YCdzIGB2YWx1ZWAKICAgIGR1ZSB0byB1c2VyIGlucHV0OgoKICAgICAgICA8aW5wdXQgdmFsdWU9Int7bXlWYWx1ZTo6aW5wdXR9fSI+CgogICAgVGhpcyBtZWFucyB0aGF0IGlmIHlvdSBpbXBlcmF0aXZlbHkgc2V0IHRoZSB2YWx1ZSAoaS5lLiBgc29tZU5hdGl2ZUlucHV0LnZhbHVlID0KICAgICdmb28nYCksIG5vIGV2ZW50cyB3aWxsIGJlIGZpcmVkIGFuZCB0aGlzIGNoYW5nZSBjYW5ub3QgYmUgb2JzZXJ2ZWQuCgogICAgYGlyb24taW5wdXRgIGFkZHMgdGhlIGBiaW5kLXZhbHVlYCBwcm9wZXJ0eSB0aGF0IG1pcnJvcnMgdGhlIG5hdGl2ZSBgaW5wdXRgJ3MKICAgICdgdmFsdWVgIHByb3BlcnR5OyB0aGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIGZvciB0d28td2F5IGRhdGEgYmluZGluZy4KICAgIGBiaW5kLXZhbHVlYCB3aWxsIG5vdGlmeSBpZiBpdCBpcyBjaGFuZ2VkIGVpdGhlciBieSB1c2VyIGlucHV0IG9yIGJ5IHNjcmlwdC4KCiAgICAgICAgPGlyb24taW5wdXQgYmluZC12YWx1ZT0ie3tteVZhbHVlfX0iPgogICAgICAgICAgPGlucHV0PgogICAgICAgIDwvaXJvbi1pbnB1dD4KCiAgICBOb3RlOiB0aGlzIG1lYW5zIHRoYXQgaWYgeW91IHdhbnQgdG8gaW1wZXJhdGl2ZWx5IHNldCB0aGUgbmF0aXZlIGBpbnB1dGAncywgeW91CiAgICBfbXVzdF8gc2V0IGBiaW5kLXZhbHVlYCBpbnN0ZWFkLCBzbyB0aGF0IHRoZSB3cmFwcGVyIGBpcm9uLWlucHV0YCBjYW4gYmUKICAgIG5vdGlmaWVkLgoKICAgICMjIyBWYWxpZGF0aW9uCgogICAgYGlyb24taW5wdXRgIHVzZXMgdGhlIG5hdGl2ZSBgaW5wdXRgJ3MgdmFsaWRhdGlvbi4gRm9yIHNpbXBsaWNpdHksIGBpcm9uLWlucHV0YAogICAgaGFzIGEgYHZhbGlkYXRlKClgIG1ldGhvZCAod2hpY2ggaW50ZXJuYWxseSBqdXN0IGNoZWNrcyB0aGUgZGlzdHJpYnV0ZWQKICAgIGBpbnB1dGAncyB2YWxpZGl0eSksIHdoaWNoIHNldHMgYW4gYGludmFsaWRgIGF0dHJpYnV0ZSB0aGF0IGNhbiBhbHNvIGJlIHVzZWQgZm9yCiAgICBzdHlsaW5nLgoKICAgIFRvIHZhbGlkYXRlIGF1dG9tYXRpY2FsbHkgYXMgeW91IHR5cGUsIHlvdSBjYW4gdXNlIHRoZSBgYXV0by12YWxpZGF0ZWAKICAgIGF0dHJpYnV0ZS4KCiAgICBgaXJvbi1pbnB1dGAgYWxzbyBmaXJlcyBhbiBgaXJvbi1pbnB1dC12YWxpZGF0ZWAgZXZlbnQgYWZ0ZXIgYHZhbGlkYXRlKClgIGlzCiAgICBjYWxsZWQuIFlvdSBjYW4gdXNlIGl0IHRvIGltcGxlbWVudCBhIGN1c3RvbSB2YWxpZGF0b3I6CgogICAgICAgIHZhciBDYXRzT25seVZhbGlkYXRvciA9IHsKICAgICAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbihpcm9uSW5wdXQpIHsKICAgICAgICAgICAgdmFyIHZhbGlkID0gIWlyb25JbnB1dC5iaW5kVmFsdWUgfHwgaXJvbklucHV0LmJpbmRWYWx1ZSA9PT0gJ2NhdCc7CiAgICAgICAgICAgIGlyb25JbnB1dC5pbnZhbGlkID0gIXZhbGlkOwogICAgICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlyb25JbnB1dC5hZGRFdmVudExpc3RlbmVyKCdpcm9uLWlucHV0LXZhbGlkYXRlJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICBDYXRzT25seS52YWxpZGF0ZShpbnB1dDIpOwogICAgICAgIH0pOwoKICAgIFlvdSBjYW4gYWxzbyB1c2UgYW4gZWxlbWVudCBpbXBsZW1lbnRpbmcgYW4KICAgIFtgSXJvblZhbGlkYXRvckJlaGF2aW9yYF0oL2VsZW1lbnQvUG9seW1lckVsZW1lbnRzL2lyb24tdmFsaWRhdGFibGUtYmVoYXZpb3IpLgogICAgVGhpcyBleGFtcGxlIGNhbiBhbHNvIGJlIGZvdW5kIGluIHRoZSBkZW1vIGZvciB0aGlzIGVsZW1lbnQ6CgogICAgICAgIDxpcm9uLWlucHV0IHZhbGlkYXRvcj0iY2F0cy1vbmx5Ij4KICAgICAgICAgIDxpbnB1dD4KICAgICAgICA8L2lyb24taW5wdXQ+CgogICAgIyMjIFByZXZlbnRpbmcgaW52YWxpZCBpbnB1dAoKICAgIEl0IG1heSBiZSBkZXNpcmFibGUgdG8gb25seSBhbGxvdyB1c2VycyB0byBlbnRlciBjZXJ0YWluIGNoYXJhY3RlcnMuIFlvdSBjYW4gdXNlCiAgICB0aGUgYGFsbG93ZWQtcGF0dGVybmAgYXR0cmlidXRlIHRvIGFjY29tcGxpc2ggdGhpcy4gVGhpcyBmZWF0dXJlIGlzIHNlcGFyYXRlCiAgICBmcm9tIHZhbGlkYXRpb24sIGFuZCBgYWxsb3dlZC1wYXR0ZXJuYCBkb2VzIG5vdCBhZmZlY3QgaG93IHRoZSBpbnB1dCBpcwogICAgdmFsaWRhdGVkLgoKICAgICAgICAvLyBPbmx5IGFsbG93IHR5cGluZyBkaWdpdHMsIGJ1dCBhIHZhbGlkIGlucHV0IGhhcyBleGFjdGx5IDUgZGlnaXRzLgogICAgICAgIDxpcm9uLWlucHV0IGFsbG93ZWQtcGF0dGVybj0iWzAtOV0iPgogICAgICAgICAgPGlucHV0IHBhdHRlcm49IlxkezV9Ij4KICAgICAgICA8L2lyb24taW5wdXQ+CgogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90IGlkPSJjb250ZW50Ij48L3Nsb3Q+CmAsCgogICAgICBpczogJ2lyb24taW5wdXQnLAogICAgICBiZWhhdmlvcnM6IFtJcm9uVmFsaWRhdGFibGVCZWhhdmlvcl0sCgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbmV2ZXIgYHZhbGlkYXRlKClgIGlzIGNhbGxlZC4KICAgICAgICoKICAgICAgICogQGV2ZW50IGlyb24taW5wdXQtdmFsaWRhdGUKICAgICAgICovCgogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIFVzZSB0aGlzIHByb3BlcnR5IGluc3RlYWQgb2YgYHZhbHVlYCBmb3IgdHdvLXdheSBkYXRhIGJpbmRpbmcsIG9yIHRvCiAgICAgICAgICogc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGlucHV0LiAqKkRvIG5vdCoqIHVzZSB0aGUgZGlzdHJpYnV0ZWQKICAgICAgICAgKiBpbnB1dCdzIGB2YWx1ZWAgcHJvcGVydHkgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBiaW5kVmFsdWU6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVkIHByb3BlcnR5IHRoYXQgZWNob2VzIGBiaW5kVmFsdWVgIChtb3N0bHkgdXNlZCBmb3IgUG9seW1lciAxLjAKICAgICAgICAgKiBiYWNrY29tcGF0aWJpbGl0eSwgaWYgeW91IHdlcmUgb25lLXdheSBiaW5kaW5nIHRvIHRoZSBQb2x5bWVyIDEuMAogICAgICAgICAqIGBpbnB1dCBpcz0iaXJvbi1pbnB1dCJgIHZhbHVlIGF0dHJpYnV0ZSkuCiAgICAgICAgICovCiAgICAgICAgdmFsdWU6IHt0eXBlOiBTdHJpbmcsIGNvbXB1dGVkOiAnX2NvbXB1dGVWYWx1ZShiaW5kVmFsdWUpJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2V4LWxpa2UgbGlzdCBvZiBjaGFyYWN0ZXJzIGFsbG93ZWQgYXMgaW5wdXQ7IGFsbCBjaGFyYWN0ZXJzIG5vdCBpbiB0aGUKICAgICAgICAgKiBsaXN0IHdpbGwgYmUgcmVqZWN0ZWQuIFRoZSByZWNvbW1lbmRlZCBmb3JtYXQgc2hvdWxkIGJlIGEgbGlzdCBvZiBhbGxvd2VkCiAgICAgICAgICogY2hhcmFjdGVycywgZm9yIGV4YW1wbGUsIGBbYS16QS1aMC05ListITs6XWAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIHBhdHRlcm4gcmVwcmVzZW50cyB0aGUgYWxsb3dlZCBjaGFyYWN0ZXJzIGZvciB0aGUgZmllbGQ7IGFzIHRoZSB1c2VyCiAgICAgICAgICogaW5wdXRzIHRleHQsIGVhY2ggaW5kaXZpZHVhbCBjaGFyYWN0ZXIgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QgdGhlCiAgICAgICAgICogcGF0dGVybiAocmF0aGVyIHRoYW4gY2hlY2tpbmcgdGhlIGVudGlyZSB2YWx1ZSBhcyBhIHdob2xlKS4gSWYgYQogICAgICAgICAqIGNoYXJhY3RlciBpcyBub3QgYSBtYXRjaCwgaXQgd2lsbCBiZSByZWplY3RlZC4KICAgICAgICAgKgogICAgICAgICAqIFBhc3RlZCBpbnB1dCB3aWxsIGhhdmUgZWFjaCBjaGFyYWN0ZXIgY2hlY2tlZCBpbmRpdmlkdWFsbHk7IGlmIGFueQogICAgICAgICAqIGNoYXJhY3RlciBkb2Vzbid0IG1hdGNoIGBhbGxvd2VkUGF0dGVybmAsIHRoZSBlbnRpcmUgcGFzdGVkIHN0cmluZyB3aWxsCiAgICAgICAgICogYmUgcmVqZWN0ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlOiBpZiB5b3Ugd2VyZSB1c2luZyBgaXJvbi1pbnB1dGAgaW4gMS4wLCB5b3Ugd2VyZSBhbHNvIHJlcXVpcmVkIHRvCiAgICAgICAgICogc2V0IGBwcmV2ZW50LWludmFsaWQtaW5wdXRgLiBUaGlzIGlzIG5vIGxvbmdlciBuZWVkZWQgYXMgb2YgUG9seW1lciAyLjAsCiAgICAgICAgICogYW5kIHdpbGwgYmUgc2V0IGF1dG9tYXRpY2FsbHkgZm9yIHlvdSBpZiBhbiBgYWxsb3dlZFBhdHRlcm5gIGlzIHByb3ZpZGVkLgogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgYWxsb3dlZFBhdHRlcm46IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBhdXRvLXZhbGlkYXRlIHRoZSBpbnB1dCB2YWx1ZSBhcyB5b3UgdHlwZS4KICAgICAgICAgKi8KICAgICAgICBhdXRvVmFsaWRhdGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbmF0aXZlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgX2lucHV0RWxlbWVudDogT2JqZWN0LAogICAgICB9LAoKICAgICAgb2JzZXJ2ZXJzOiBbJ19iaW5kVmFsdWVDaGFuZ2VkKGJpbmRWYWx1ZSwgX2lucHV0RWxlbWVudCknXSwKICAgICAgbGlzdGVuZXJzOiB7J2lucHV0JzogJ19vbklucHV0JywgJ2tleXByZXNzJzogJ19vbktleXByZXNzJ30sCgogICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHsKICAgICAgICBJcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCk7CiAgICAgICAgdGhpcy5fcHJldmlvdXNWYWxpZElucHV0ID0gJyc7CiAgICAgICAgdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkID0gZmFsc2U7CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gSWYgdGhlIGlucHV0IGlzIGFkZGVkIGF0IGEgbGF0ZXIgdGltZSwgdXBkYXRlIHRoZSBpbnRlcm5hbCByZWZlcmVuY2UuCiAgICAgICAgdGhpcy5fb2JzZXJ2ZXIgPSBkb20odGhpcykub2JzZXJ2ZU5vZGVzKGZ1bmN0aW9uKGluZm8pIHsKICAgICAgICAgIHRoaXMuX2luaXRTbG90dGVkSW5wdXQoKTsKICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICB9LAoKICAgICAgZGV0YWNoZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9vYnNlcnZlcikgewogICAgICAgICAgZG9tKHRoaXMpLnVub2JzZXJ2ZU5vZGVzKHRoaXMuX29ic2VydmVyKTsKICAgICAgICAgIHRoaXMuX29ic2VydmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgZGlzdHJpYnV0ZWQgaW5wdXQgZWxlbWVudC4KICAgICAgICovCiAgICAgIGdldCBpbnB1dEVsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2lucHV0RWxlbWVudDsKICAgICAgfSwKCiAgICAgIF9pbml0U2xvdHRlZElucHV0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9pbnB1dEVsZW1lbnQgPSB0aGlzLmdldEVmZmVjdGl2ZUNoaWxkcmVuKClbMF07CgogICAgICAgIGlmICh0aGlzLmlucHV0RWxlbWVudCAmJiB0aGlzLmlucHV0RWxlbWVudC52YWx1ZSkgewogICAgICAgICAgdGhpcy5iaW5kVmFsdWUgPSB0aGlzLmlucHV0RWxlbWVudC52YWx1ZTsKICAgICAgICB9CgogICAgICAgIHRoaXMuZmlyZSgnaXJvbi1pbnB1dC1yZWFkeScpOwogICAgICB9LAoKICAgICAgZ2V0IF9wYXR0ZXJuUmVnRXhwKCkgewogICAgICAgIHZhciBwYXR0ZXJuOwogICAgICAgIGlmICh0aGlzLmFsbG93ZWRQYXR0ZXJuKSB7CiAgICAgICAgICBwYXR0ZXJuID0gbmV3IFJlZ0V4cCh0aGlzLmFsbG93ZWRQYXR0ZXJuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc3dpdGNoICh0aGlzLmlucHV0RWxlbWVudC50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgJ251bWJlcic6CiAgICAgICAgICAgICAgcGF0dGVybiA9IC9bMC05LixlLV0vOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcGF0dGVybjsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN9CiAgICAgICAqLwogICAgICBfYmluZFZhbHVlQ2hhbmdlZDogZnVuY3Rpb24oYmluZFZhbHVlLCBpbnB1dEVsZW1lbnQpIHsKICAgICAgICAvLyBUaGUgb2JzZXJ2ZXIgY291bGQgaGF2ZSBydW4gYmVmb3JlIGF0dGFjaGVkKCkgd2hlbiB3ZSBoYXZlIGFjdHVhbGx5CiAgICAgICAgLy8gaW5pdGlhbGl6ZWQgdGhpcyBwcm9wZXJ0eS4KICAgICAgICBpZiAoIWlucHV0RWxlbWVudCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJpbmRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpbnB1dEVsZW1lbnQudmFsdWUgPSBudWxsOwogICAgICAgIH0gZWxzZSBpZiAoYmluZFZhbHVlICE9PSBpbnB1dEVsZW1lbnQudmFsdWUpIHsKICAgICAgICAgIHRoaXMuaW5wdXRFbGVtZW50LnZhbHVlID0gYmluZFZhbHVlOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuYXV0b1ZhbGlkYXRlKSB7CiAgICAgICAgICB0aGlzLnZhbGlkYXRlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyBtYW51YWxseSBub3RpZnkgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIG5vdGlmeSB1bnRpbCBhZnRlciBzZXR0aW5nIHZhbHVlCiAgICAgICAgdGhpcy5maXJlKCdiaW5kLXZhbHVlLWNoYW5nZWQnLCB7dmFsdWU6IGJpbmRWYWx1ZX0pOwogICAgICB9LAoKICAgICAgX29uSW5wdXQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIE5lZWQgdG8gdmFsaWRhdGUgZWFjaCBvZiB0aGUgY2hhcmFjdGVycyBwYXN0ZWQgaWYgdGhleSBoYXZlbid0CiAgICAgICAgLy8gYmVlbiB2YWxpZGF0ZWQgaW5zaWRlIGBfb25LZXlwcmVzc2AgYWxyZWFkeS4KICAgICAgICBpZiAodGhpcy5hbGxvd2VkUGF0dGVybiAmJiAhdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkKSB7CiAgICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLl9jaGVja1BhdHRlcm5WYWxpZGl0eSgpOwogICAgICAgICAgaWYgKCF2YWxpZCkgewogICAgICAgICAgICB0aGlzLl9hbm5vdW5jZUludmFsaWRDaGFyYWN0ZXIoCiAgICAgICAgICAgICAgICAnSW52YWxpZCBzdHJpbmcgb2YgY2hhcmFjdGVycyBub3QgZW50ZXJlZC4nKTsKICAgICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQudmFsdWUgPSB0aGlzLl9wcmV2aW91c1ZhbGlkSW5wdXQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuYmluZFZhbHVlID0gdGhpcy5fcHJldmlvdXNWYWxpZElucHV0ID0gdGhpcy5pbnB1dEVsZW1lbnQudmFsdWU7CiAgICAgICAgdGhpcy5fcGF0dGVybkFscmVhZHlDaGVja2VkID0gZmFsc2U7CiAgICAgIH0sCgogICAgICBfaXNQcmludGFibGU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgLy8gV2hhdCBhIGNvbnRyb2wvcHJpbnRhYmxlIGNoYXJhY3RlciBpcyB2YXJpZXMgd2lsZGx5IGJhc2VkIG9uIHRoZSBicm93c2VyLgogICAgICAgIC8vIC0gbW9zdCBjb250cm9sIGNoYXJhY3RlcnMgKGFycm93cywgYmFja3NwYWNlKSBkbyBub3Qgc2VuZCBhIGBrZXlwcmVzc2AKICAgICAgICAvLyBldmVudAogICAgICAgIC8vICAgaW4gQ2hyb21lLCBidXQgdGhlICpkbyogb24gRmlyZWZveAogICAgICAgIC8vIC0gaW4gRmlyZWZveCwgd2hlbiB0aGV5IGRvIHNlbmQgYSBga2V5cHJlc3NgIGV2ZW50LCBjb250cm9sIGNoYXJzIGhhdmUKICAgICAgICAvLyAgIGEgY2hhckNvZGUgPSAwLCBrZXlDb2RlID0geHggKGZvciBleC4gNDAgZm9yIGRvd24gYXJyb3cpCiAgICAgICAgLy8gLSBwcmludGFibGUgY2hhcmFjdGVycyBhbHdheXMgc2VuZCBhIGtleXByZXNzIGV2ZW50LgogICAgICAgIC8vIC0gaW4gRmlyZWZveCwgcHJpbnRhYmxlIGNoYXJzIGFsd2F5cyBoYXZlIGEga2V5Q29kZSA9IDAuIEluIENocm9tZSwgdGhlCiAgICAgICAgLy8ga2V5Q29kZQogICAgICAgIC8vICAgYWx3YXlzIG1hdGNoZXMgdGhlIGNoYXJDb2RlLgogICAgICAgIC8vIE5vbmUgb2YgdGhpcyBtYWtlcyBhbnkgc2Vuc2UuCgogICAgICAgIC8vIEZvciB0aGVzZSBrZXlzLCBBU0NJSSBjb2RlID09IGJyb3dzZXIga2V5Y29kZS4KICAgICAgICB2YXIgYW55Tm9uUHJpbnRhYmxlID0gKGV2ZW50LmtleUNvZGUgPT0gOCkgfHwgIC8vIGJhY2tzcGFjZQogICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSA5KSB8fCAgICAgICAgICAgICAgICAgICAgLy8gdGFiCiAgICAgICAgICAgIChldmVudC5rZXlDb2RlID09IDEzKSB8fCAgICAgICAgICAgICAgICAgICAvLyBlbnRlcgogICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAyNyk7ICAgICAgICAgICAgICAgICAgICAgLy8gZXNjYXBlCgogICAgICAgIC8vIEZvciB0aGVzZSBrZXlzLCBtYWtlIHN1cmUgaXQncyBhIGJyb3dzZXIga2V5Y29kZSBhbmQgbm90IGFuIEFTQ0lJIGNvZGUuCiAgICAgICAgdmFyIG1vek5vblByaW50YWJsZSA9IChldmVudC5rZXlDb2RlID09IDE5KSB8fCAgLy8gcGF1c2UKICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPT0gMjApIHx8ICAgICAgICAgICAgICAgICAgICAvLyBjYXBzIGxvY2sKICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPT0gNDUpIHx8ICAgICAgICAgICAgICAgICAgICAvLyBpbnNlcnQKICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPT0gNDYpIHx8ICAgICAgICAgICAgICAgICAgICAvLyBkZWxldGUKICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPT0gMTQ0KSB8fCAgICAgICAgICAgICAgICAgICAvLyBudW0gbG9jawogICAgICAgICAgICAoZXZlbnQua2V5Q29kZSA9PSAxNDUpIHx8ICAgICAgICAgICAgICAgICAgIC8vIHNjcm9sbCBsb2NrCiAgICAgICAgICAgIChldmVudC5rZXlDb2RlID4gMzIgJiYKICAgICAgICAgICAgIGV2ZW50LmtleUNvZGUgPCA0MSkgfHwgIC8vIHBhZ2UgdXAvZG93biwgZW5kLCBob21lLCBhcnJvd3MKICAgICAgICAgICAgKGV2ZW50LmtleUNvZGUgPiAxMTEgJiYgZXZlbnQua2V5Q29kZSA8IDEyNCk7ICAvLyBmbiBrZXlzCgogICAgICAgIHJldHVybiAhYW55Tm9uUHJpbnRhYmxlICYmICEoZXZlbnQuY2hhckNvZGUgPT0gMCAmJiBtb3pOb25QcmludGFibGUpOwogICAgICB9LAoKICAgICAgX29uS2V5cHJlc3M6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLmFsbG93ZWRQYXR0ZXJuICYmIHRoaXMuaW5wdXRFbGVtZW50LnR5cGUgIT09ICdudW1iZXInKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHZhciByZWdleHAgPSB0aGlzLl9wYXR0ZXJuUmVnRXhwOwogICAgICAgIGlmICghcmVnZXhwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBIYW5kbGUgc3BlY2lhbCBrZXlzIGFuZCBiYWNrc3BhY2UKICAgICAgICBpZiAoZXZlbnQubWV0YUtleSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50LmFsdEtleSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgdGhlIHBhdHRlcm4gZWl0aGVyIGhlcmUgb3IgaW4gYF9vbklucHV0YCwgYnV0IG5vdCBpbiBib3RoLgogICAgICAgIHRoaXMuX3BhdHRlcm5BbHJlYWR5Q2hlY2tlZCA9IHRydWU7CgogICAgICAgIHZhciB0aGlzQ2hhciA9IFN0cmluZy5mcm9tQ2hhckNvZGUoZXZlbnQuY2hhckNvZGUpOwogICAgICAgIGlmICh0aGlzLl9pc1ByaW50YWJsZShldmVudCkgJiYgIXJlZ2V4cC50ZXN0KHRoaXNDaGFyKSkgewogICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRoaXMuX2Fubm91bmNlSW52YWxpZENoYXJhY3RlcigKICAgICAgICAgICAgICAnSW52YWxpZCBjaGFyYWN0ZXIgJyArIHRoaXNDaGFyICsgJyBub3QgZW50ZXJlZC4nKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfY2hlY2tQYXR0ZXJuVmFsaWRpdHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciByZWdleHAgPSB0aGlzLl9wYXR0ZXJuUmVnRXhwOwogICAgICAgIGlmICghcmVnZXhwKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmlucHV0RWxlbWVudC52YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgaWYgKCFyZWdleHAudGVzdCh0aGlzLmlucHV0RWxlbWVudC52YWx1ZVtpXSkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYHZhbHVlYCBpcyB2YWxpZC4gVGhlIHZhbGlkYXRvciBwcm92aWRlZCBpbiBgdmFsaWRhdG9yYAogICAgICAgKiB3aWxsIGJlIHVzZWQgZmlyc3QsIHRoZW4gYW55IGNvbnN0cmFpbnRzLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZC4KICAgICAgICovCiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIXRoaXMuaW5wdXRFbGVtZW50KSB7CiAgICAgICAgICB0aGlzLmludmFsaWQgPSBmYWxzZTsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gVXNlIHRoZSBuZXN0ZWQgaW5wdXQncyBuYXRpdmUgdmFsaWRpdHkuCiAgICAgICAgdmFyIHZhbGlkID0gdGhpcy5pbnB1dEVsZW1lbnQuY2hlY2tWYWxpZGl0eSgpOwoKICAgICAgICAvLyBPbmx5IGRvIGV4dHJhIGNoZWNraW5nIGlmIHRoZSBicm93c2VyIHRob3VnaHQgdGhpcyB3YXMgdmFsaWQuCiAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAvLyBFbXB0eSwgcmVxdWlyZWQgaW5wdXQgaXMgaW52YWxpZAogICAgICAgICAgaWYgKHRoaXMucmVxdWlyZWQgJiYgdGhpcy5iaW5kVmFsdWUgPT09ICcnKSB7CiAgICAgICAgICAgIHZhbGlkID0gZmFsc2U7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFzVmFsaWRhdG9yKCkpIHsKICAgICAgICAgICAgdmFsaWQgPSBJcm9uVmFsaWRhdGFibGVCZWhhdmlvci52YWxpZGF0ZS5jYWxsKHRoaXMsIHRoaXMuYmluZFZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuaW52YWxpZCA9ICF2YWxpZDsKICAgICAgICB0aGlzLmZpcmUoJ2lyb24taW5wdXQtdmFsaWRhdGUnKTsKICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgIH0sCgogICAgICBfYW5ub3VuY2VJbnZhbGlkQ2hhcmFjdGVyOiBmdW5jdGlvbihtZXNzYWdlKSB7CiAgICAgICAgdGhpcy5maXJlKCdpcm9uLWFubm91bmNlJywge3RleHQ6IG1lc3NhZ2V9KTsKICAgICAgfSwKCiAgICAgIF9jb21wdXRlVmFsdWU6IGZ1bmN0aW9uKGJpbmRWYWx1ZSkgewogICAgICAgIHJldHVybiBiaW5kVmFsdWU7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgICogVXNlIGBQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yYCB0byBpbXBsZW1lbnQgYW4gYWRkLW9uIGZvcgogICAgICogYDxwYXBlci1pbnB1dC1jb250YWluZXI+YC4gQSBhZGQtb24gYXBwZWFycyBiZWxvdyB0aGUgaW5wdXQsIGFuZCBtYXkgZGlzcGxheQogICAgICogaW5mb3JtYXRpb24gYmFzZWQgb24gdGhlIGlucHV0IHZhbHVlIGFuZCB2YWxpZGl0eSBzdWNoIGFzIGEgY2hhcmFjdGVyIGNvdW50ZXIKICAgICAqIG9yIGFuIGVycm9yIG1lc3NhZ2UuCiAgICAgKiBAcG9seW1lckJlaGF2aW9yCiAgICAgKi8KICAgIGNvbnN0IFBhcGVySW5wdXRBZGRvbkJlaGF2aW9yID0gewogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5maXJlKCdhZGRvbi1hdHRhY2hlZCcpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBmdW5jdGlvbiBjYWxsZWQgYnkgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCB3aGVuIHRoZSBpbnB1dCB2YWx1ZSBvcgogICAgICAgKiB2YWxpZGl0eSBjaGFuZ2VzLgogICAgICAgKiBAcGFyYW0ge3sKICAgICAgICogICBpbnZhbGlkOiBib29sZWFuLAogICAgICAgKiAgIGlucHV0RWxlbWVudDogKEVsZW1lbnR8dW5kZWZpbmVkKSwKICAgICAgICogICB2YWx1ZTogKHN0cmluZ3x1bmRlZmluZWQpCiAgICAgICAqIH19IHN0YXRlIC0KICAgICAgICogICAgIGlucHV0RWxlbWVudDogVGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAqICAgICB2YWx1ZTogVGhlIGlucHV0IHZhbHVlLgogICAgICAgKiAgICAgaW52YWxpZDogVHJ1ZSBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgaW52YWxpZC4KICAgICAgICovCiAgICAgIHVwZGF0ZTogZnVuY3Rpb24oc3RhdGUpIHt9CgogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKgogICAgYDxwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI+YCBpcyBhIGNoYXJhY3RlciBjb3VudGVyIGZvciB1c2Ugd2l0aAogICAgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YC4gSXQgc2hvd3MgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIGVudGVyZWQgaW4gdGhlCiAgICBpbnB1dCBhbmQgdGhlIG1heCBsZW5ndGggaWYgaXQgaXMgc3BlY2lmaWVkLgoKICAgICAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyPgogICAgICAgICAgPGlucHV0IG1heGxlbmd0aD0iMjAiPgogICAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlcj48L3BhcGVyLWlucHV0LWNoYXItY291bnRlcj4KICAgICAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KCiAgICAjIyMgU3R5bGluZwoKICAgIFRoZSBmb2xsb3dpbmcgbWl4aW4gaXMgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLWlucHV0LWNoYXItY291bnRlcmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IHwgYHt9YAogICAgKi8KICAgIFBvbHltZXIoewogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBmbG9hdDogcmlnaHQ7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY2FwdGlvbjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c3Bhbj5bW19jaGFyQ291bnRlclN0cl1dPC9zcGFuPgpgLAoKICAgICAgaXM6ICdwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXInLAogICAgICBiZWhhdmlvcnM6IFtQYXBlcklucHV0QWRkb25CZWhhdmlvcl0sCiAgICAgIHByb3BlcnRpZXM6IHtfY2hhckNvdW50ZXJTdHI6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnMCd9fSwKCiAgICAgIC8qKgogICAgICAgKiBUaGlzIG92ZXJyaWRlcyB0aGUgdXBkYXRlIGZ1bmN0aW9uIGluIFBhcGVySW5wdXRBZGRvbkJlaGF2aW9yLgogICAgICAgKiBAcGFyYW0ge3sKICAgICAgICogICBpbnB1dEVsZW1lbnQ6IChFbGVtZW50fHVuZGVmaW5lZCksCiAgICAgICAqICAgdmFsdWU6IChzdHJpbmd8dW5kZWZpbmVkKSwKICAgICAgICogICBpbnZhbGlkOiBib29sZWFuCiAgICAgICAqIH19IHN0YXRlIC0KICAgICAgICogICAgIGlucHV0RWxlbWVudDogVGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAqICAgICB2YWx1ZTogVGhlIGlucHV0IHZhbHVlLgogICAgICAgKiAgICAgaW52YWxpZDogVHJ1ZSBpZiB0aGUgaW5wdXQgdmFsdWUgaXMgaW52YWxpZC4KICAgICAgICovCiAgICAgIHVwZGF0ZTogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICBpZiAoIXN0YXRlLmlucHV0RWxlbWVudCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3RhdGUudmFsdWUgPSBzdGF0ZS52YWx1ZSB8fCAnJzsKCiAgICAgICAgdmFyIGNvdW50ZXIgPSBzdGF0ZS52YWx1ZS50b1N0cmluZygpLmxlbmd0aC50b1N0cmluZygpOwoKICAgICAgICBpZiAoc3RhdGUuaW5wdXRFbGVtZW50Lmhhc0F0dHJpYnV0ZSgnbWF4bGVuZ3RoJykpIHsKICAgICAgICAgIGNvdW50ZXIgKz0gJy8nICsgc3RhdGUuaW5wdXRFbGVtZW50LmdldEF0dHJpYnV0ZSgnbWF4bGVuZ3RoJyk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9jaGFyQ291bnRlclN0ciA9IGNvdW50ZXI7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgY29uc3QgdGVtcGxhdGUkYiA9IGh0bWxgCjxjdXN0b20tc3R5bGU+CiAgPHN0eWxlIGlzPSJjdXN0b20tc3R5bGUiPgogICAgaHRtbCB7CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZTogewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsgLyogdG8gbWFrZSBhIHN0YWNraW5nIGNvbnRleHQgKi8KICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IG5vbmU7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICAgIGJhY2tncm91bmQ6IHRyYW5zcGFyZW50OwogICAgICAgIGJvcmRlcjogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7CiAgICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWFsaWduLCBib3R0b20pOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgIH07CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+CmA7CiAgICB0ZW1wbGF0ZSRiLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUkYi5jb250ZW50KTsKCiAgICAvKgogICAgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCBpcyBhIGNvbnRhaW5lciBmb3IgYSBgPGxhYmVsPmAsIGFuIGA8aXJvbi1pbnB1dD5gIG9yCiAgICBgPHRleHRhcmVhPmAgYW5kIG9wdGlvbmFsIGFkZC1vbiBlbGVtZW50cyBzdWNoIGFzIGFuIGVycm9yIG1lc3NhZ2Ugb3IgY2hhcmFjdGVyCiAgICBjb3VudGVyLCB1c2VkIHRvIGltcGxlbWVudCBNYXRlcmlhbCBEZXNpZ24gdGV4dCBmaWVsZHMuCgogICAgRm9yIGV4YW1wbGU6CgogICAgICAgIDxwYXBlci1pbnB1dC1jb250YWluZXI+CiAgICAgICAgICA8bGFiZWwgc2xvdD0ibGFiZWwiPllvdXIgbmFtZTwvbGFiZWw+CiAgICAgICAgICA8aXJvbi1pbnB1dCBzbG90PSJpbnB1dCI+CiAgICAgICAgICAgIDxpbnB1dD4KICAgICAgICAgIDwvaXJvbi1pbnB1dD4KICAgICAgICAgIC8vIEluIFBvbHltZXIgMS4wLCB5b3Ugd291bGQgdXNlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiIHNsb3Q9ImlucHV0Ij5gCiAgICBpbnN0ZWFkIG9mIHRoZSBhYm92ZS4KICAgICAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KCiAgICBZb3UgY2FuIHN0eWxlIHRoZSBuZXN0ZWQgYDxpbnB1dD5gIGhvd2V2ZXIgeW91IHdhbnQ7IGlmIHlvdSB3YW50IGl0IHRvIGxvb2sgbGlrZQogICAgYSBNYXRlcmlhbCBEZXNpZ24gaW5wdXQsIHlvdSBjYW4gc3R5bGUgaXQgd2l0aCB0aGUKICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXNoYXJlZC1pbnB1dC1zdHlsZSBtaXhpbi4KCiAgICBEbyBub3Qgd3JhcCBgPHBhcGVyLWlucHV0LWNvbnRhaW5lcj5gIGFyb3VuZCBlbGVtZW50cyB0aGF0IGFscmVhZHkgaW5jbHVkZSBpdCwKICAgIHN1Y2ggYXMgYDxwYXBlci1pbnB1dD5gLiBEb2luZyBzbyBtYXkgY2F1c2UgZXZlbnRzIHRvIGJvdW5jZSBpbmZpbml0ZWx5IGJldHdlZW4KICAgIHRoZSBjb250YWluZXIgYW5kIGl0cyBjb250YWluZWQgZWxlbWVudC4KCiAgICAjIyMgTGlzdGVuaW5nIGZvciBpbnB1dCBjaGFuZ2VzCgogICAgQnkgZGVmYXVsdCwgaXQgbGlzdGVucyBmb3IgY2hhbmdlcyBvbiB0aGUgYGJpbmQtdmFsdWVgIGF0dHJpYnV0ZSBvbiBpdHMgY2hpbGRyZW4KICAgIG5vZGVzIGFuZCBwZXJmb3JtIHRhc2tzIHN1Y2ggYXMgYXV0by12YWxpZGF0aW5nIGFuZCBsYWJlbCBzdHlsaW5nIHdoZW4gdGhlCiAgICBgYmluZC12YWx1ZWAgY2hhbmdlcy4gWW91IGNhbiBjb25maWd1cmUgdGhlIGF0dHJpYnV0ZSBpdCBsaXN0ZW5zIHRvIHdpdGggdGhlCiAgICBgYXR0ci1mb3ItdmFsdWVgIGF0dHJpYnV0ZS4KCiAgICAjIyMgVXNpbmcgYSBjdXN0b20gaW5wdXQgZWxlbWVudAoKICAgIFlvdSBjYW4gdXNlIGEgY3VzdG9tIGlucHV0IGVsZW1lbnQgaW4gYSBgPHBhcGVyLWlucHV0LWNvbnRhaW5lcj5gLCBmb3IgZXhhbXBsZQogICAgdG8gaW1wbGVtZW50IGEgY29tcG91bmQgaW5wdXQgZmllbGQgbGlrZSBhIHNvY2lhbCBzZWN1cml0eSBudW1iZXIgaW5wdXQuIFRoZQogICAgY3VzdG9tIGlucHV0IGVsZW1lbnQgc2hvdWxkIGhhdmUgdGhlIGBwYXBlci1pbnB1dC1pbnB1dGAgY2xhc3MsIGhhdmUgYQogICAgYG5vdGlmeTp0cnVlYCB2YWx1ZSBwcm9wZXJ0eSBhbmQgb3B0aW9uYWxseSBpbXBsZW1lbnRzCiAgICBgUG9seW1lci5Jcm9uVmFsaWRhdGFibGVCZWhhdmlvcmAgaWYgaXQgaXMgdmFsaWRhdGFibGUuCgogICAgICAgIDxwYXBlci1pbnB1dC1jb250YWluZXIgYXR0ci1mb3ItdmFsdWU9InNzbi12YWx1ZSI+CiAgICAgICAgICA8bGFiZWwgc2xvdD0ibGFiZWwiPlNvY2lhbCBzZWN1cml0eSBudW1iZXI8L2xhYmVsPgogICAgICAgICAgPHNzbi1pbnB1dCBzbG90PSJpbnB1dCIgY2xhc3M9InBhcGVyLWlucHV0LWlucHV0Ij48L3Nzbi1pbnB1dD4KICAgICAgICA8L3BhcGVyLWlucHV0LWNvbnRhaW5lcj4KCgogICAgSWYgeW91J3JlIHVzaW5nIGEgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCBpbXBlcmF0aXZlbHksIGl0J3MgaW1wb3J0YW50IHRvIG1ha2UKICAgIHN1cmUgdGhhdCB5b3UgYXR0YWNoIGl0cyBjaGlsZHJlbiAodGhlIGBpcm9uLWlucHV0YCBhbmQgdGhlIG9wdGlvbmFsIGBsYWJlbGApCiAgICBiZWZvcmUgeW91IGF0dGFjaCB0aGUgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCBpdHNlbGYsIHNvIHRoYXQgaXQgY2FuIGJlIHNldCB1cAogICAgY29ycmVjdGx5LgoKICAgICMjIyBWYWxpZGF0aW9uCgogICAgSWYgdGhlIGBhdXRvLXZhbGlkYXRlYCBhdHRyaWJ1dGUgaXMgc2V0LCB0aGUgaW5wdXQgY29udGFpbmVyIHdpbGwgdmFsaWRhdGUgdGhlCiAgICBpbnB1dCBhbmQgdXBkYXRlIHRoZSBjb250YWluZXIgc3R5bGluZyB3aGVuIHRoZSBpbnB1dCB2YWx1ZSBjaGFuZ2VzLgoKICAgICMjIyBBZGQtb25zCgogICAgQWRkLW9ucyBhcmUgY2hpbGQgZWxlbWVudHMgb2YgYSBgPHBhcGVyLWlucHV0LWNvbnRhaW5lcj5gIHdpdGggdGhlIGBhZGQtb25gCiAgICBhdHRyaWJ1dGUgYW5kIGltcGxlbWVudHMgdGhlIGBQb2x5bWVyLlBhcGVySW5wdXRBZGRvbkJlaGF2aW9yYCBiZWhhdmlvci4gVGhleQogICAgYXJlIG5vdGlmaWVkIHdoZW4gdGhlIGlucHV0IHZhbHVlIG9yIHZhbGlkaXR5IGNoYW5nZXMsIGFuZCBtYXkgaW1wbGVtZW50CiAgICBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgZXJyb3IgbWVzc2FnZXMgb3IgY2hhcmFjdGVyIGNvdW50ZXJzLiBUaGV5IGFwcGVhciBhdCB0aGUKICAgIGJvdHRvbSBvZiB0aGUgaW5wdXQuCgogICAgIyMjIFByZWZpeGVzIGFuZCBzdWZmaXhlcwogICAgVGhlc2UgYXJlIGNoaWxkIGVsZW1lbnRzIG9mIGEgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCB3aXRoIHRoZSBgcHJlZml4YAogICAgb3IgYHN1ZmZpeGAgYXR0cmlidXRlLCBhbmQgYXJlIGRpc3BsYXllZCBpbmxpbmUgd2l0aCB0aGUgaW5wdXQsIGJlZm9yZSBvciBhZnRlci4KCiAgICAgICAgPHBhcGVyLWlucHV0LWNvbnRhaW5lcj4KICAgICAgICAgIDxkaXYgc2xvdD0icHJlZml4Ij4kPC9kaXY+CiAgICAgICAgICA8bGFiZWwgc2xvdD0ibGFiZWwiPlRvdGFsPC9sYWJlbD4KICAgICAgICAgIDxpcm9uLWlucHV0IHNsb3Q9ImlucHV0Ij4KICAgICAgICAgICAgPGlucHV0PgogICAgICAgICAgPC9pcm9uLWlucHV0PgogICAgICAgICAgLy8gSW4gUG9seW1lciAxLjAsIHlvdSB3b3VsZCB1c2UgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCIgc2xvdD0iaW5wdXQiPmAKICAgIGluc3RlYWQgb2YgdGhlIGFib3ZlLiA8cGFwZXItaWNvbi1idXR0b24gc2xvdD0ic3VmZml4IgogICAgaWNvbj0iY2xlYXIiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPC9wYXBlci1pbnB1dC1jb250YWluZXI+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3JgIHwgTGFiZWwgYW5kIHVuZGVybGluZSBjb2xvciB3aGVuIHRoZSBpbnB1dCBpcyBub3QgZm9jdXNlZCB8IGAtLXNlY29uZGFyeS10ZXh0LWNvbG9yYAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yYCB8IExhYmVsIGFuZCB1bmRlcmxpbmUgY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgZm9jdXNlZCB8IGAtLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvcmAgfCBMYWJlbCBhbmQgdW5kZXJsaW5lIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGlzIGludmFsaWQgfCBgLS1lcnJvci1jb2xvcmAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1jb2xvcmAgfCBJbnB1dCBmb3JlZ3JvdW5kIGNvbG9yIHwgYC0tcHJpbWFyeS10ZXh0LWNvbG9yYAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciB8IGB7fWAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1kaXNhYmxlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgd2hlbiBpdCdzIGRpc2FibGVkIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGxhYmVsIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZvY3VzYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGxhYmVsIHdoZW4gdGhlIGlucHV0IGlzIGZvY3VzZWQgfCBge31gCiAgICBgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtZmxvYXRpbmdgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgbGFiZWwgd2hlbiBmbG9hdGluZyB8IGB7fWAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBpbnB1dCB8IGB7fWAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1hbGlnbmAgfCBUaGUgdmVydGljYWwtYWxpZ24gcHJvcGVydHkgb2YgdGhlIGlucHV0IHwgYGJvdHRvbWAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC1kaXNhYmxlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBpbnB1dCB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGlzYWJsZWQgfCBge31gCiAgICBgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZm9jdXNgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgaW5wdXQgd2hlbiBmb2N1c2VkIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWludmFsaWRgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgaW5wdXQgd2hlbiBpbnZhbGlkIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHdlYmtpdCBzcGlubmVyIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1jbGVhcmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSB3ZWJraXQgY2xlYXIgYnV0dG9uIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1jYWxlbmRhci1waWNrZXItaW5kaWNhdG9yYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHdlYmtpdCBjYWxlbmRhciBwaWNrZXIgaW5kaWNhdG9yIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLW1zLWNsZWFyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIEludGVybmV0IEV4cGxvcmVyIGNsZWFyIGJ1dHRvbiB8IGB7fWAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmVgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdW5kZXJsaW5lIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1c2AgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSB1bmRlcmxpbmUgd2hlbiB0aGUgaW5wdXQgaXMgZm9jdXNlZCB8IGB7fWAKICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci11bmRlcmxpbmUtZGlzYWJsZWRgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdW5kZXJsaW5lIHdoZW4gdGhlIGlucHV0IGlzIGRpc2FibGVkIHwgYHt9YAogICAgYC0tcGFwZXItaW5wdXQtcHJlZml4YCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGlucHV0IHByZWZpeCB8IGB7fWAKICAgIGAtLXBhcGVyLWlucHV0LXN1ZmZpeGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBpbnB1dCBzdWZmaXggfCBge31gCiAgICBgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWwtYmVmb3JlYCB8IE1peGluIGFwcGxpZWQgdG8gbGFiZWwgYmVmb3JlIHBzZXVkbyBlbGVtZW50IHwge30KICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbC1hZnRlcmAgfCBNaXhpbiBhcHBsaWVkIHRvIGxhYmVsIGFmdGVyIHBzZXVkbyBlbGVtZW50ICh1c2VmdWwgZm9yIHJlcXVpcmVkIGFzdGVyaXNrKSB8IHt9CgogICAgVGhpcyBlbGVtZW50IGlzIGBkaXNwbGF5OmJsb2NrYCBieSBkZWZhdWx0LCBidXQgeW91IGNhbiBzZXQgdGhlIGBpbmxpbmVgCiAgICBhdHRyaWJ1dGUgdG8gbWFrZSBpdCBgZGlzcGxheTppbmxpbmUtYmxvY2tgLgogICAgKi8KICAgIFBvbHltZXIoewogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2lubGluZV0pIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjMzOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAuZmxvYXRlZC1sYWJlbC1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICB9CgogICAgICAudW5kZXJsaW5lIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIC5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMnB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwoKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGNlbnRlciBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUzZCgwLDEsMSk7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZTNkKDAsMSwxKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1mb2N1czsKICAgICAgfQoKICAgICAgLnVuZGVybGluZS5pcy1oaWdobGlnaHRlZCAuZm9jdXNlZC1saW5lIHsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5kZXJsaW5lLmlzLWludmFsaWQgLmZvY3VzZWQtbGluZSB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXM7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgogICAgICAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkIHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItdW5kZXJsaW5lOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSAudW5mb2N1c2VkLWxpbmUgewogICAgICAgIGJvcmRlci1ib3R0b206IDFweCBkYXNoZWQ7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLXVuZGVybGluZS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgLmlucHV0LXdyYXBwZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtcmVsYXRpdmU7CiAgICAgICAgbWF4LXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQobGFiZWwpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1jb2xvciwgdmFyKC0tc2Vjb25kYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIDAuMjVzLCB3aWR0aCAwLjI1czsKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4yNXMsIHdpZHRoIDAuMjVzOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCB0b3A7CiAgICAgICAgLyogRml4IGZvciBzYWZhcmkgbm90IGZvY3VzaW5nIDAtaGVpZ2h0IGRhdGUvdGltZSBpbnB1dHMgd2l0aCAtd2Via2l0LWFwcGVyYW5jZTogbm9uZTsgKi8KICAgICAgICBtaW4taGVpZ2h0OiAxcHg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLW5vd3JhcDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRyYW5zaXRpb24tZWFzaW5nOwogICAgICB9CgoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGxhYmVsKTpiZWZvcmUsCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpOmJlZm9yZSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWJlZm9yZTsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGxhYmVsKTphZnRlciwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCk6YWZ0ZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbC1hZnRlcjsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtZmxvYXRpbmcgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC03NSUpIHNjYWxlKDAuNzUpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtNzUlKSBzY2FsZSgwLjc1KTsKCiAgICAgICAgLyogU2luY2Ugd2Ugc2NhbGUgdG8gNzUvMTAwIG9mIHRoZSBzaXplLCB3ZSBhY3R1YWxseSBoYXZlIDEwMC83NSBvZiB0aGUKICAgICAgICBvcmlnaW5hbCBzcGFjZSBub3cgYXZhaWxhYmxlICovCiAgICAgICAgd2lkdGg6IDEzMyU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbC1mbG9hdGluZzsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSAuaW5wdXQtY29udGVudC5sYWJlbC1pcy1mbG9hdGluZyA6OnNsb3R0ZWQobGFiZWwpLAogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWZsb2F0aW5nIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtbGFiZWwpIHsKICAgICAgICByaWdodDogMDsKICAgICAgICBsZWZ0OiBhdXRvOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgdG9wOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IHRvcDsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKGxhYmVsKSwKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlnaGxpZ2h0ZWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItZm9jdXMtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsLWZvY3VzOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1sYWJlbCkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQubGFiZWwtaXMtaGlkZGVuIDo6c2xvdHRlZChsYWJlbCksCiAgICAgIC5pbnB1dC1jb250ZW50LmxhYmVsLWlzLWhpZGRlbiA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWxhYmVsKSB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQoaXJvbi1pbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpcm9uLWF1dG9ncm93LXRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKC5wYXBlci1pbnB1dC1pbnB1dCkgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgLyogVGhlIGFwcGx5IHNoaW0gZG9lc24ndCBhcHBseSB0aGUgbmVzdGVkIGNvbG9yIGN1c3RvbSBwcm9wZXJ0eSwKICAgICAgICAgIHNvIHdlIGhhdmUgdG8gcmUtYXBwbHkgaXQgaGVyZS4gKi8KICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ7CiAgICAgIH0KCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCk6Oi13ZWJraXQtb3V0ZXItc3Bpbi1idXR0b24sCiAgICAgIC5pbnB1dC1jb250ZW50IDo6c2xvdHRlZChpbnB1dCk6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtc3Bpbm5lcjsKICAgICAgfQoKICAgICAgLmlucHV0LWNvbnRlbnQuZm9jdXNlZCA6OnNsb3R0ZWQoaW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpcm9uLWlucHV0KSwKICAgICAgLmlucHV0LWNvbnRlbnQuZm9jdXNlZCA6OnNsb3R0ZWQodGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5mb2N1c2VkIDo6c2xvdHRlZChpcm9uLWF1dG9ncm93LXRleHRhcmVhKSwKICAgICAgLmlucHV0LWNvbnRlbnQuZm9jdXNlZCA6OnNsb3R0ZWQoLnBhcGVyLWlucHV0LWlucHV0KSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LWZvY3VzOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZChpbnB1dCksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlyb24taW5wdXQpLAogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCh0ZXh0YXJlYSksCiAgICAgIC5pbnB1dC1jb250ZW50LmlzLWludmFsaWQgOjpzbG90dGVkKGlyb24tYXV0b2dyb3ctdGV4dGFyZWEpLAogICAgICAuaW5wdXQtY29udGVudC5pcy1pbnZhbGlkIDo6c2xvdHRlZCgucGFwZXItaW5wdXQtaW5wdXQpIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtaW52YWxpZDsKICAgICAgfQoKICAgICAgLnByZWZpeCA6OnNsb3R0ZWQoKikgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LXN1YmhlYWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtbm9uZTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1wcmVmaXg7CiAgICAgIH0KCiAgICAgIC5zdWZmaXggOjpzbG90dGVkKCopIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4LW5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LXN1ZmZpeDsKICAgICAgfQoKICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgLmlucHV0LWNvbnRlbnQgOjpzbG90dGVkKGlucHV0KSB7CiAgICAgICAgbWluLXdpZHRoOiAwOwogICAgICB9CgogICAgICAuaW5wdXQtY29udGVudCA6OnNsb3R0ZWQodGV4dGFyZWEpIHsKICAgICAgICByZXNpemU6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5hZGQtb24tY29udGVudCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAuYWRkLW9uLWNvbnRlbnQuaXMtaW52YWxpZCA6OnNsb3R0ZWQoKikgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQoKICAgICAgLmFkZC1vbi1jb250ZW50LmlzLWhpZ2hsaWdodGVkIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvciwgdmFyKC0tcHJpbWFyeS1jb2xvcikpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImZsb2F0ZWQtbGFiZWwtcGxhY2Vob2xkZXIiIGFyaWEtaGlkZGVuPSJ0cnVlIiBoaWRkZW49Iltbbm9MYWJlbEZsb2F0XV0iPiZuYnNwOzwvZGl2PgoKICAgIDxkaXYgY2xhc3M9ImlucHV0LXdyYXBwZXIiPgogICAgICA8c3BhbiBjbGFzcz0icHJlZml4Ij48c2xvdCBuYW1lPSJwcmVmaXgiPjwvc2xvdD48L3NwYW4+CgogICAgICA8ZGl2IGNsYXNzJD0iW1tfY29tcHV0ZUlucHV0Q29udGVudENsYXNzKG5vTGFiZWxGbG9hdCxhbHdheXNGbG9hdExhYmVsLGZvY3VzZWQsaW52YWxpZCxfaW5wdXRIYXNDb250ZW50KV1dIiBpZD0ibGFiZWxBbmRJbnB1dENvbnRhaW5lciI+CiAgICAgICAgPHNsb3QgbmFtZT0ibGFiZWwiPjwvc2xvdD4KICAgICAgICA8c2xvdCBuYW1lPSJpbnB1dCI+PC9zbG90PgogICAgICA8L2Rpdj4KCiAgICAgIDxzcGFuIGNsYXNzPSJzdWZmaXgiPjxzbG90IG5hbWU9InN1ZmZpeCI+PC9zbG90Pjwvc3Bhbj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3MkPSJbW19jb21wdXRlVW5kZXJsaW5lQ2xhc3MoZm9jdXNlZCxpbnZhbGlkKV1dIj4KICAgICAgPGRpdiBjbGFzcz0idW5mb2N1c2VkLWxpbmUiPjwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJmb2N1c2VkLWxpbmUiPjwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcyQ9IltbX2NvbXB1dGVBZGRPbkNvbnRlbnRDbGFzcyhmb2N1c2VkLGludmFsaWQpXV0iPgogICAgICA8c2xvdCBuYW1lPSJhZGQtb24iPjwvc2xvdD4KICAgIDwvZGl2PgpgLAoKICAgICAgaXM6ICdwYXBlci1pbnB1dC1jb250YWluZXInLAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhlIGZsb2F0aW5nIGxhYmVsLiBUaGUgbGFiZWwgZGlzYXBwZWFycyB3aGVuIHRoZQogICAgICAgICAqIGlucHV0IHZhbHVlIGlzIG5vdCBudWxsLgogICAgICAgICAqLwogICAgICAgIG5vTGFiZWxGbG9hdDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGFsd2F5cyBmbG9hdCB0aGUgZmxvYXRpbmcgbGFiZWwuCiAgICAgICAgICovCiAgICAgICAgYWx3YXlzRmxvYXRMYWJlbDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBhdHRyaWJ1dGUgdG8gbGlzdGVuIGZvciB2YWx1ZSBjaGFuZ2VzIG9uLgogICAgICAgICAqLwogICAgICAgIGF0dHJGb3JWYWx1ZToge3R5cGU6IFN0cmluZywgdmFsdWU6ICdiaW5kLXZhbHVlJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGF1dG8tdmFsaWRhdGUgdGhlIGlucHV0IHZhbHVlIHdoZW4gaXQgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICBhdXRvVmFsaWRhdGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkLiBUaGlzIHByb3BlcnR5IGlzIHNldCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlCiAgICAgICAgICogaW5wdXQgdmFsdWUgY2hhbmdlcyBpZiBhdXRvLXZhbGlkYXRpbmcsIG9yIHdoZW4gdGhlIGBpcm9uLWlucHV0LXZhbGlkYXRlYAogICAgICAgICAqIGV2ZW50IGlzIGhlYXJkIGZyb20gYSBjaGlsZC4KICAgICAgICAgKi8KICAgICAgICBpbnZhbGlkOiB7b2JzZXJ2ZXI6ICdfaW52YWxpZENoYW5nZWQnLCB0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBpbnB1dCBoYXMgZm9jdXMuCiAgICAgICAgICovCiAgICAgICAgZm9jdXNlZDoge3JlYWRPbmx5OiB0cnVlLCB0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIG5vdGlmeTogdHJ1ZX0sCgogICAgICAgIF9hZGRvbnM6IHsKICAgICAgICAgIHR5cGU6IEFycmF5CiAgICAgICAgICAvLyBkbyBub3Qgc2V0IGEgZGVmYXVsdCB2YWx1ZSBoZXJlIGludGVudGlvbmFsbHkgLSBpdCB3aWxsIGJlIGluaXRpYWxpemVkCiAgICAgICAgICAvLyBsYXppbHkgd2hlbiBhIGRpc3RyaWJ1dGVkIGNoaWxkIGlzIGF0dGFjaGVkLCB3aGljaCBtYXkgb2NjdXIgYmVmb3JlCiAgICAgICAgICAvLyBjb25maWd1cmF0aW9uIGZvciB0aGlzIGVsZW1lbnQgaW4gcG9seWZpbGwuCiAgICAgICAgfSwKCiAgICAgICAgX2lucHV0SGFzQ29udGVudDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIF9pbnB1dFNlbGVjdG9yOgogICAgICAgICAgICB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ2lucHV0LGlyb24taW5wdXQsdGV4dGFyZWEsLnBhcGVyLWlucHV0LWlucHV0J30sCgogICAgICAgIF9ib3VuZE9uRm9jdXM6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb25Gb2N1cy5iaW5kKHRoaXMpOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIF9ib3VuZE9uQmx1cjogewogICAgICAgICAgdHlwZTogRnVuY3Rpb24sCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vbkJsdXIuYmluZCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfYm91bmRPbklucHV0OiB7CiAgICAgICAgICB0eXBlOiBGdW5jdGlvbiwKICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uSW5wdXQuYmluZCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICBfYm91bmRWYWx1ZUNoYW5nZWQ6IHsKICAgICAgICAgIHR5cGU6IEZ1bmN0aW9uLAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb25WYWx1ZUNoYW5nZWQuYmluZCh0aGlzKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHsKICAgICAgICAnYWRkb24tYXR0YWNoZWQnOiAnX29uQWRkb25BdHRhY2hlZCcsCiAgICAgICAgJ2lyb24taW5wdXQtdmFsaWRhdGUnOiAnX29uSXJvbklucHV0VmFsaWRhdGUnCiAgICAgIH0sCgogICAgICBnZXQgX3ZhbHVlQ2hhbmdlZEV2ZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLmF0dHJGb3JWYWx1ZSArICctY2hhbmdlZCc7CiAgICAgIH0sCgogICAgICBnZXQgX3Byb3BlcnR5Rm9yVmFsdWUoKSB7CiAgICAgICAgcmV0dXJuIGRhc2hUb0NhbWVsQ2FzZSh0aGlzLmF0dHJGb3JWYWx1ZSk7CiAgICAgIH0sCgogICAgICBnZXQgX2lucHV0RWxlbWVudCgpIHsKICAgICAgICByZXR1cm4gZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3IodGhpcy5faW5wdXRTZWxlY3Rvcik7CiAgICAgIH0sCgogICAgICBnZXQgX2lucHV0RWxlbWVudFZhbHVlKCkgewogICAgICAgIHJldHVybiB0aGlzLl9pbnB1dEVsZW1lbnRbdGhpcy5fcHJvcGVydHlGb3JWYWx1ZV0gfHwKICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50LnZhbHVlOwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICByZWFkeTogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gUGFwZXItaW5wdXQgdHJlYXRzIGEgdmFsdWUgb2YgdW5kZWZpbmVkIGRpZmZlcmVudGx5IGF0IHN0YXJ0dXAgdGhhbgogICAgICAgIC8vIHRoZSByZXN0IG9mIHRoZSB0aW1lIChzcGVjaWZpY2FsbHk6IGl0IGRvZXMgbm90IHZhbGlkYXRlIGl0IGF0IHN0YXJ0dXAsCiAgICAgICAgLy8gYnV0IGl0IGRvZXMgYWZ0ZXIgdGhhdC4gV2UgbmVlZCB0byB0cmFjayB3aGV0aGVyIHRoZSBmaXJzdCB0aW1lIHdlCiAgICAgICAgLy8gZW5jb3VudGVyIHRoZSB2YWx1ZSBpcyBiYXNpY2FsbHkgdGhpcyBmaXJzdCB0aW1lLCBzbyB0aGF0IHdlIGNhbiB2YWxpZGF0ZQogICAgICAgIC8vIGl0IGNvcnJlY3RseSB0aGUgcmVzdCBvZiB0aGUgdGltZS4gU2VlCiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9wYXBlci1pbnB1dC9pc3N1ZXMvNjA1CiAgICAgICAgdGhpcy5fX2lzRmlyc3RWYWx1ZVVwZGF0ZSA9IHRydWU7CiAgICAgICAgaWYgKCF0aGlzLl9hZGRvbnMpIHsKICAgICAgICAgIHRoaXMuX2FkZG9ucyA9IFtdOwogICAgICAgIH0KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fYm91bmRPbkZvY3VzLCB0cnVlKTsKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl9ib3VuZE9uQmx1ciwgdHJ1ZSk7CiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5hdHRyRm9yVmFsdWUpIHsKICAgICAgICAgIHRoaXMuX2lucHV0RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKAogICAgICAgICAgICAgIHRoaXMuX3ZhbHVlQ2hhbmdlZEV2ZW50LCB0aGlzLl9ib3VuZFZhbHVlQ2hhbmdlZCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignaW5wdXQnLCB0aGlzLl9vbklucHV0KTsKICAgICAgICB9CgogICAgICAgIC8vIE9ubHkgdmFsaWRhdGUgd2hlbiBhdHRhY2hlZCBpZiB0aGUgaW5wdXQgYWxyZWFkeSBoYXMgYSB2YWx1ZS4KICAgICAgICBpZiAodGhpcy5faW5wdXRFbGVtZW50VmFsdWUgJiYgdGhpcy5faW5wdXRFbGVtZW50VmFsdWUgIT0gJycpIHsKICAgICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlKHRoaXMuX2lucHV0RWxlbWVudCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2hhbmRsZVZhbHVlKHRoaXMuX2lucHV0RWxlbWVudCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIF9vbkFkZG9uQXR0YWNoZWQ6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKCF0aGlzLl9hZGRvbnMpIHsKICAgICAgICAgIHRoaXMuX2FkZG9ucyA9IFtdOwogICAgICAgIH0KICAgICAgICB2YXIgdGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwogICAgICAgIGlmICh0aGlzLl9hZGRvbnMuaW5kZXhPZih0YXJnZXQpID09PSAtMSkgewogICAgICAgICAgdGhpcy5fYWRkb25zLnB1c2godGFyZ2V0KTsKICAgICAgICAgIGlmICh0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgICAgdGhpcy5faGFuZGxlVmFsdWUodGhpcy5faW5wdXRFbGVtZW50KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgX29uRm9jdXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3NldEZvY3VzZWQodHJ1ZSk7CiAgICAgIH0sCgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgX29uQmx1cjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fc2V0Rm9jdXNlZChmYWxzZSk7CiAgICAgICAgdGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5faW5wdXRFbGVtZW50KTsKICAgICAgfSwKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBfb25JbnB1dDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLl9oYW5kbGVWYWx1ZUFuZEF1dG9WYWxpZGF0ZShldmVudC50YXJnZXQpOwogICAgICB9LAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIF9vblZhbHVlQ2hhbmdlZDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgaW5wdXQgPSBldmVudC50YXJnZXQ7CgogICAgICAgIC8vIFBhcGVyLWlucHV0IHRyZWF0cyBhIHZhbHVlIG9mIHVuZGVmaW5lZCBkaWZmZXJlbnRseSBhdCBzdGFydHVwIHRoYW4KICAgICAgICAvLyB0aGUgcmVzdCBvZiB0aGUgdGltZSAoc3BlY2lmaWNhbGx5OiBpdCBkb2VzIG5vdCB2YWxpZGF0ZSBpdCBhdCBzdGFydHVwLAogICAgICAgIC8vIGJ1dCBpdCBkb2VzIGFmdGVyIHRoYXQuIElmIHRoaXMgaXMgaW4gZmFjdCB0aGUgYm9vdHVwIGNhc2UsIGlnbm9yZQogICAgICAgIC8vIHZhbGlkYXRpb24sIGp1c3QgdGhpcyBvbmNlLgogICAgICAgIGlmICh0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlKSB7CiAgICAgICAgICB0aGlzLl9faXNGaXJzdFZhbHVlVXBkYXRlID0gZmFsc2U7CiAgICAgICAgICBpZiAoaW5wdXQudmFsdWUgPT09IHVuZGVmaW5lZCB8fCBpbnB1dC52YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUoZXZlbnQudGFyZ2V0KTsKICAgICAgfSwKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBfaGFuZGxlVmFsdWU6IGZ1bmN0aW9uKGlucHV0RWxlbWVudCkgewogICAgICAgIHZhciB2YWx1ZSA9IHRoaXMuX2lucHV0RWxlbWVudFZhbHVlOwoKICAgICAgICAvLyB0eXBlPSJudW1iZXIiIGhhY2sgbmVlZGVkIGJlY2F1c2UgdGhpcy52YWx1ZSBpcyBlbXB0eSB1bnRpbCBpdCdzIHZhbGlkCiAgICAgICAgaWYgKHZhbHVlIHx8IHZhbHVlID09PSAwIHx8CiAgICAgICAgICAgIChpbnB1dEVsZW1lbnQudHlwZSA9PT0gJ251bWJlcicgJiYgIWlucHV0RWxlbWVudC5jaGVja1ZhbGlkaXR5KCkpKSB7CiAgICAgICAgICB0aGlzLl9pbnB1dEhhc0NvbnRlbnQgPSB0cnVlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9pbnB1dEhhc0NvbnRlbnQgPSBmYWxzZTsKICAgICAgICB9CgogICAgICAgIHRoaXMudXBkYXRlQWRkb25zKAogICAgICAgICAgICB7aW5wdXRFbGVtZW50OiBpbnB1dEVsZW1lbnQsIHZhbHVlOiB2YWx1ZSwgaW52YWxpZDogdGhpcy5pbnZhbGlkfSk7CiAgICAgIH0sCgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgX2hhbmRsZVZhbHVlQW5kQXV0b1ZhbGlkYXRlOiBmdW5jdGlvbihpbnB1dEVsZW1lbnQpIHsKICAgICAgICBpZiAodGhpcy5hdXRvVmFsaWRhdGUgJiYgaW5wdXRFbGVtZW50KSB7CiAgICAgICAgICB2YXIgdmFsaWQ7CgogICAgICAgICAgaWYgKGlucHV0RWxlbWVudC52YWxpZGF0ZSkgewogICAgICAgICAgICB2YWxpZCA9IGlucHV0RWxlbWVudC52YWxpZGF0ZSh0aGlzLl9pbnB1dEVsZW1lbnRWYWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWxpZCA9IGlucHV0RWxlbWVudC5jaGVja1ZhbGlkaXR5KCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLmludmFsaWQgPSAhdmFsaWQ7CiAgICAgICAgfQoKICAgICAgICAvLyBDYWxsIHRoaXMgbGFzdCB0byBub3RpZnkgdGhlIGFkZC1vbnMuCiAgICAgICAgdGhpcy5faGFuZGxlVmFsdWUoaW5wdXRFbGVtZW50KTsKICAgICAgfSwKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBfb25Jcm9uSW5wdXRWYWxpZGF0ZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLmludmFsaWQgPSB0aGlzLl9pbnB1dEVsZW1lbnQuaW52YWxpZDsKICAgICAgfSwKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBfaW52YWxpZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9hZGRvbnMpIHsKICAgICAgICAgIHRoaXMudXBkYXRlQWRkb25zKHtpbnZhbGlkOiB0aGlzLmludmFsaWR9KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FsbCB0aGlzIHRvIHVwZGF0ZSB0aGUgc3RhdGUgb2YgYWRkLW9ucy4KICAgICAgICogQHBhcmFtIHtPYmplY3R9IHN0YXRlIEFkZC1vbiBzdGF0ZS4KICAgICAgICovCiAgICAgIHVwZGF0ZUFkZG9uczogZnVuY3Rpb24oc3RhdGUpIHsKICAgICAgICBmb3IgKHZhciBhZGRvbiwgaW5kZXggPSAwOyBhZGRvbiA9IHRoaXMuX2FkZG9uc1tpbmRleF07IGluZGV4KyspIHsKICAgICAgICAgIGFkZG9uLnVwZGF0ZShzdGF0ZSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIF9jb21wdXRlSW5wdXRDb250ZW50Q2xhc3M6IGZ1bmN0aW9uKAogICAgICAgICAgbm9MYWJlbEZsb2F0LCBhbHdheXNGbG9hdExhYmVsLCBmb2N1c2VkLCBpbnZhbGlkLCBfaW5wdXRIYXNDb250ZW50KSB7CiAgICAgICAgdmFyIGNscyA9ICdpbnB1dC1jb250ZW50JzsKICAgICAgICBpZiAoIW5vTGFiZWxGbG9hdCkgewogICAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5xdWVyeVNlbGVjdG9yKCdsYWJlbCcpOwoKICAgICAgICAgIGlmIChhbHdheXNGbG9hdExhYmVsIHx8IF9pbnB1dEhhc0NvbnRlbnQpIHsKICAgICAgICAgICAgY2xzICs9ICcgbGFiZWwtaXMtZmxvYXRpbmcnOwogICAgICAgICAgICAvLyBJZiB0aGUgbGFiZWwgaXMgZmxvYXRpbmcsIGlnbm9yZSBhbnkgb2Zmc2V0cyB0aGF0IG1heSBoYXZlIGJlZW4KICAgICAgICAgICAgLy8gYXBwbGllZCBmcm9tIGEgcHJlZml4IGVsZW1lbnQuCiAgICAgICAgICAgIHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3N0YXRpYyc7CgogICAgICAgICAgICBpZiAoaW52YWxpZCkgewogICAgICAgICAgICAgIGNscyArPSAnIGlzLWludmFsaWQnOwogICAgICAgICAgICB9IGVsc2UgaWYgKGZvY3VzZWQpIHsKICAgICAgICAgICAgICBjbHMgKz0gJyBsYWJlbC1pcy1oaWdobGlnaHRlZCc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGxhYmVsIGlzIG5vdCBmbG9hdGluZywgaXQgc2hvdWxkIG92ZXJsYXAgdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICAgIGlmIChsYWJlbCkgewogICAgICAgICAgICAgIHRoaXMuJC5sYWJlbEFuZElucHV0Q29udGFpbmVyLnN0eWxlLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW52YWxpZCkgewogICAgICAgICAgICAgIGNscyArPSAnIGlzLWludmFsaWQnOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChfaW5wdXRIYXNDb250ZW50KSB7CiAgICAgICAgICAgIGNscyArPSAnIGxhYmVsLWlzLWhpZGRlbic7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaW52YWxpZCkgewogICAgICAgICAgICBjbHMgKz0gJyBpcy1pbnZhbGlkJzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGZvY3VzZWQpIHsKICAgICAgICAgIGNscyArPSAnIGZvY3VzZWQnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xzOwogICAgICB9LAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIF9jb21wdXRlVW5kZXJsaW5lQ2xhc3M6IGZ1bmN0aW9uKGZvY3VzZWQsIGludmFsaWQpIHsKICAgICAgICB2YXIgY2xzID0gJ3VuZGVybGluZSc7CiAgICAgICAgaWYgKGludmFsaWQpIHsKICAgICAgICAgIGNscyArPSAnIGlzLWludmFsaWQnOwogICAgICAgIH0gZWxzZSBpZiAoZm9jdXNlZCkgewogICAgICAgICAgY2xzICs9ICcgaXMtaGlnaGxpZ2h0ZWQnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY2xzOwogICAgICB9LAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIF9jb21wdXRlQWRkT25Db250ZW50Q2xhc3M6IGZ1bmN0aW9uKGZvY3VzZWQsIGludmFsaWQpIHsKICAgICAgICB2YXIgY2xzID0gJ2FkZC1vbi1jb250ZW50JzsKICAgICAgICBpZiAoaW52YWxpZCkgewogICAgICAgICAgY2xzICs9ICcgaXMtaW52YWxpZCc7CiAgICAgICAgfSBlbHNlIGlmIChmb2N1c2VkKSB7CiAgICAgICAgICBjbHMgKz0gJyBpcy1oaWdobGlnaHRlZCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjbHM7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qCiAgICBgPHBhcGVyLWlucHV0LWVycm9yPmAgaXMgYW4gZXJyb3IgbWVzc2FnZSBmb3IgdXNlIHdpdGgKICAgIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAuIFRoZSBlcnJvciBpcyBkaXNwbGF5ZWQgd2hlbiB0aGUKICAgIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAgaXMgYGludmFsaWRgLgoKICAgICAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyPgogICAgICAgICAgPGlucHV0IHBhdHRlcm49IlswLTldKiI+CiAgICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3Igc2xvdD0iYWRkLW9uIj5Pbmx5IG51bWJlcnMgYXJlCiAgICBhbGxvd2VkITwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgICAgPC9wYXBlci1pbnB1dC1jb250YWluZXI+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvcmAgfCBUaGUgZm9yZWdyb3VuZCBjb2xvciBvZiB0aGUgZXJyb3IgfCBgLS1lcnJvci1jb2xvcmAKICAgIGAtLXBhcGVyLWlucHV0LWVycm9yYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGVycm9yIHwgYHt9YAogICAgKi8KICAgIFBvbHltZXIoewogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CgogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItaW52YWxpZC1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jYXB0aW9uOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWVycm9yOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBsZWZ0OjA7CiAgICAgICAgcmlnaHQ6MDsKICAgICAgfQoKICAgICAgOmhvc3QoW2ludmFsaWRdKSB7CiAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI2ExMXlXcmFwcGVyIHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbnZhbGlkXSkgI2ExMXlXcmFwcGVyIHsKICAgICAgICB2aXNpYmlsaXR5OiB2aXNpYmxlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDwhLS0KICAgIElmIHRoZSBwYXBlci1pbnB1dC1lcnJvciBlbGVtZW50IGlzIGRpcmVjdGx5IHJlZmVyZW5jZWQgYnkgYW4KICAgIFxgYXJpYS1kZXNjcmliZWRieVxgIGF0dHJpYnV0ZSwgc3VjaCBhcyB3aGVuIHVzZWQgYXMgYSBwYXBlci1pbnB1dCBhZGQtb24sCiAgICB0aGVuIGFwcGx5aW5nIFxgdmlzaWJpbGl0eTogaGlkZGVuO1xgIHRvIHRoZSBwYXBlci1pbnB1dC1lcnJvciBlbGVtZW50IGl0c2VsZgogICAgZG9lcyBub3QgaGlkZSB0aGUgZXJyb3IuCgogICAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZToKICAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hY2NuYW1lLTEuMS8jbWFwcGluZ19hZGRpdGlvbmFsX25kX2Rlc2NyaXB0aW9uCiAgICAtLT4KICAgIDxkaXYgaWQ9ImExMXlXcmFwcGVyIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsCgogICAgICBpczogJ3BhcGVyLWlucHV0LWVycm9yJywKICAgICAgYmVoYXZpb3JzOiBbUGFwZXJJbnB1dEFkZG9uQmVoYXZpb3JdLAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIFRydWUgaWYgdGhlIGVycm9yIGlzIHNob3dpbmcuCiAgICAgICAgICovCiAgICAgICAgaW52YWxpZDoge3JlYWRPbmx5OiB0cnVlLCByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWUsIHR5cGU6IEJvb2xlYW59CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhpcyBvdmVycmlkZXMgdGhlIHVwZGF0ZSBmdW5jdGlvbiBpbiBQYXBlcklucHV0QWRkb25CZWhhdmlvci4KICAgICAgICogQHBhcmFtIHt7CiAgICAgICAqICAgaW5wdXRFbGVtZW50OiAoRWxlbWVudHx1bmRlZmluZWQpLAogICAgICAgKiAgIHZhbHVlOiAoc3RyaW5nfHVuZGVmaW5lZCksCiAgICAgICAqICAgaW52YWxpZDogYm9vbGVhbgogICAgICAgKiB9fSBzdGF0ZSAtCiAgICAgICAqICAgICBpbnB1dEVsZW1lbnQ6IFRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgKiAgICAgdmFsdWU6IFRoZSBpbnB1dCB2YWx1ZS4KICAgICAgICogICAgIGludmFsaWQ6IFRydWUgaWYgdGhlIGlucHV0IHZhbHVlIGlzIGludmFsaWQuCiAgICAgICAqLwogICAgICB1cGRhdGU6IGZ1bmN0aW9uKHN0YXRlKSB7CiAgICAgICAgdGhpcy5fc2V0SW52YWxpZChzdGF0ZS5pbnZhbGlkKTsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLy8gR2VuZXJhdGUgdW5pcXVlLCBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgSURzIGZvciBsYWJlbHMgKG5lZWRlZCBieQogICAgLy8gYXJpYS1sYWJlbGxlZGJ5KSBhbmQgYWRkLW9ucy4KICAgIGNvbnN0IFBhcGVySW5wdXRIZWxwZXIgPSB7fTsKCiAgICBQYXBlcklucHV0SGVscGVyLk5leHRMYWJlbElEID0gMTsKICAgIFBhcGVySW5wdXRIZWxwZXIuTmV4dEFkZG9uSUQgPSAxOwogICAgUGFwZXJJbnB1dEhlbHBlci5OZXh0SW5wdXRJRCA9IDE7CgogICAgLyoqCiAgICAgKiBVc2UgYFBhcGVySW5wdXRCZWhhdmlvcmAgdG8gaW1wbGVtZW50IGlucHV0cyB3aXRoIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAuCiAgICAgKiBUaGlzIGJlaGF2aW9yIGlzIGltcGxlbWVudGVkIGJ5IGA8cGFwZXItaW5wdXQ+YC4gSXQgZXhwb3NlcyBhIG51bWJlciBvZgogICAgICogcHJvcGVydGllcyBmcm9tIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAgYW5kIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAgYW5kCiAgICAgKiB0aGV5IHNob3VsZCBiZSBib3VuZCBpbiB5b3VyIHRlbXBsYXRlLgogICAgICoKICAgICAqIFRoZSBpbnB1dCBlbGVtZW50IGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgYGlucHV0RWxlbWVudGAgcHJvcGVydHkgaWYgeW91IG5lZWQKICAgICAqIHRvIGFjY2VzcyBwcm9wZXJ0aWVzIG9yIG1ldGhvZHMgdGhhdCBhcmUgbm90IGV4cG9zZWQuCiAgICAgKiBAcG9seW1lckJlaGF2aW9yIFBhcGVySW5wdXRCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBQYXBlcklucHV0QmVoYXZpb3JJbXBsID0gewoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIGlucHV0IGNoYW5nZXMgZHVlIHRvIHVzZXIgaW50ZXJhY3Rpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAZXZlbnQgY2hhbmdlCiAgICAgICAgICovCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsYWJlbCBmb3IgdGhpcyBpbnB1dC4gSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0bwogICAgICAgICAqIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlIGVsZW1lbnQsIGJpbmQgdGhpcyB0bwogICAgICAgICAqIGA8bGFiZWw+YCdzIGNvbnRlbnQgYW5kIGBoaWRkZW5gIHByb3BlcnR5LCBlLmcuCiAgICAgICAgICogYDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIj5bW2xhYmVsXV08L2xhYmVsPmAgaW4geW91ciBgdGVtcGxhdGVgCiAgICAgICAgICovCiAgICAgICAgbGFiZWw6IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdmFsdWUgZm9yIHRoaXMgaW5wdXQuIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8KICAgICAgICAgKiBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kIHRoaXMgdG8KICAgICAgICAgKiB0aGUgYDxpcm9uLWlucHV0PmAncyBgYmluZFZhbHVlYAogICAgICAgICAqIHByb3BlcnR5LCBvciB0aGUgdmFsdWUgcHJvcGVydHkgb2YgeW91ciBpbnB1dCB0aGF0IGlzIGBub3RpZnk6dHJ1ZWAuCiAgICAgICAgICogQHR5cGUgeyp9CiAgICAgICAgICovCiAgICAgICAgdmFsdWU6IHtub3RpZnk6IHRydWUsIHR5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgdGhpcyBpbnB1dC4gSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0bwogICAgICAgICAqIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlIGVsZW1lbnQsIGJpbmQgdGhpcyB0bwogICAgICAgICAqIGJvdGggdGhlIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAncyBhbmQgdGhlIGlucHV0J3MgYGRpc2FibGVkYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlZDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgaW52YWxpZC4gSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvcgogICAgICAgICAqIHRvIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlIGVsZW1lbnQsIGJpbmQgdGhpcyB0byBib3RoIHRoZQogICAgICAgICAqIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAncyBhbmQgdGhlIGlucHV0J3MgYGludmFsaWRgIHByb3BlcnR5LgogICAgICAgICAqCiAgICAgICAgICogSWYgYGF1dG9WYWxpZGF0ZWAgaXMgdHJ1ZSwgdGhlIGBpbnZhbGlkYCBhdHRyaWJ1dGUgaXMgbWFuYWdlZAogICAgICAgICAqIGF1dG9tYXRpY2FsbHksIHdoaWNoIGNhbiBjbG9iYmVyIGF0dGVtcHRzIHRvIG1hbmFnZSBpdCBtYW51YWxseS4KICAgICAgICAgKi8KICAgICAgICBpbnZhbGlkOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlLCBub3RpZnk6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdGhpcyB0byBzcGVjaWZ5IHRoZSBwYXR0ZXJuIGFsbG93ZWQgYnkgYHByZXZlbnRJbnZhbGlkSW5wdXRgLiBJZgogICAgICAgICAqIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgYWxsb3dlZFBhdHRlcm5gCiAgICAgICAgICogcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgYWxsb3dlZFBhdHRlcm46IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdHlwZSBvZiB0aGUgaW5wdXQuIFRoZSBzdXBwb3J0ZWQgdHlwZXMgYXJlIHRoZQogICAgICAgICAqIFtuYXRpdmUgaW5wdXQncwogICAgICAgICAqIHR5cGVzXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQjRm9ybV88aW5wdXQ+X3R5cGVzKS4KICAgICAgICAgKiBJZiB5b3UncmUgdXNpbmcgUGFwZXJJbnB1dEJlaGF2aW9yIHRvIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlCiAgICAgICAgICogZWxlbWVudCwgYmluZCB0aGlzIHRvIHRoZSAoUG9seW1lciAxKSBgPGlucHV0IGlzPSJpcm9uLWlucHV0Ij5gJ3Mgb3IKICAgICAgICAgKiAoUG9seW1lciAyKQogICAgICAgICAqIGA8aXJvbi1pbnB1dD5gJ3MgYHR5cGVgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIHR5cGU6IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGF0YWxpc3Qgb2YgdGhlIGlucHV0IChpZiBhbnkpLiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgaWQgb2YgYW4KICAgICAgICAgKiBleGlzdGluZyBgPGRhdGFsaXN0PmAuIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50CiAgICAgICAgICogeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQKICAgICAgICAgKiBpcz0iaXJvbi1pbnB1dCI+YCdzIGBsaXN0YCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBsaXN0OiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwYXR0ZXJuIHRvIHZhbGlkYXRlIHRoZSBgaW5wdXRgIHdpdGguIElmIHlvdSdyZSB1c2luZwogICAgICAgICAqIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kCiAgICAgICAgICogdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGBwYXR0ZXJuYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBwYXR0ZXJuOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gbWFyayB0aGUgaW5wdXQgYXMgcmVxdWlyZWQuIElmIHlvdSdyZSB1c2luZwogICAgICAgICAqIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kCiAgICAgICAgICogdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGByZXF1aXJlZGAgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgcmVxdWlyZWQ6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdGhlIGlucHV0IGlzIGludmFsaWQuIElmIHlvdSdyZSB1c2luZwogICAgICAgICAqIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LAogICAgICAgICAqIGJpbmQgdGhpcyB0byB0aGUgYDxwYXBlci1pbnB1dC1lcnJvcj5gJ3MgY29udGVudCwgaWYgdXNpbmcuCiAgICAgICAgICovCiAgICAgICAgZXJyb3JNZXNzYWdlOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gc2hvdyBhIGNoYXJhY3RlciBjb3VudGVyLgogICAgICAgICAqLwogICAgICAgIGNoYXJDb3VudGVyOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gZGlzYWJsZSB0aGUgZmxvYXRpbmcgbGFiZWwuIElmIHlvdSdyZSB1c2luZwogICAgICAgICAqIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kCiAgICAgICAgICogdGhpcyB0byB0aGUgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCdzIGBub0xhYmVsRmxvYXRgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIG5vTGFiZWxGbG9hdDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGFsd2F5cyBmbG9hdCB0aGUgbGFiZWwuIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IKICAgICAgICAgKiB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlCiAgICAgICAgICogYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCdzIGBhbHdheXNGbG9hdExhYmVsYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBhbHdheXNGbG9hdExhYmVsOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gYXV0by12YWxpZGF0ZSB0aGUgaW5wdXQgdmFsdWUuIElmIHlvdSdyZSB1c2luZwogICAgICAgICAqIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kCiAgICAgICAgICogdGhpcyB0byB0aGUgYDxwYXBlci1pbnB1dC1jb250YWluZXI+YCdzIGBhdXRvVmFsaWRhdGVgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGF1dG9WYWxpZGF0ZToge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIE5hbWUgb2YgdGhlIHZhbGlkYXRvciB0byB1c2UuIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8KICAgICAgICAgKiBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZSBlbGVtZW50LCBiaW5kIHRoaXMgdG8KICAgICAgICAgKiB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGB2YWxpZGF0b3JgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIHZhbGlkYXRvcjoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8vIEhUTUxJbnB1dEVsZW1lbnQgYXR0cmlidXRlcyBmb3IgYmluZGluZyBpZiBuZWVkZWQKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZQogICAgICAgICAqIGVsZW1lbnQsIGJpbmQgdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGBhdXRvY29tcGxldGVgCiAgICAgICAgICogcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgYXV0b2NvbXBsZXRlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ29mZid9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB5b3UncmUgdXNpbmcgUGFwZXJJbnB1dEJlaGF2aW9yIHRvIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlCiAgICAgICAgICogZWxlbWVudCwgYmluZCB0aGlzIHRvIHRoZSBgPGlucHV0IGlzPSJpcm9uLWlucHV0Ij5gJ3MgYGF1dG9mb2N1c2AKICAgICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHshYm9vbGVhbn0KICAgICAgICAgKi8KICAgICAgICBhdXRvZm9jdXM6IHt0eXBlOiBCb29sZWFuLCBvYnNlcnZlcjogJ19hdXRvZm9jdXNDaGFuZ2VkJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgaW5wdXRtb2RlYAogICAgICAgICAqIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGlucHV0bW9kZToge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgdmFsdWUuCiAgICAgICAgICogSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZQogICAgICAgICAqIGVsZW1lbnQsIGJpbmQgdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGBtaW5sZW5ndGhgCiAgICAgICAgICogcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgbWlubGVuZ3RoOiB7dHlwZTogTnVtYmVyfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBpbnB1dCB2YWx1ZS4KICAgICAgICAgKiBJZiB5b3UncmUgdXNpbmcgUGFwZXJJbnB1dEJlaGF2aW9yIHRvIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlCiAgICAgICAgICogZWxlbWVudCwgYmluZCB0aGlzIHRvIHRoZSBgPGlucHV0IGlzPSJpcm9uLWlucHV0Ij5gJ3MgYG1heGxlbmd0aGAKICAgICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBtYXhsZW5ndGg6IHt0eXBlOiBOdW1iZXJ9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbWluaW11bSAobnVtZXJpYyBvciBkYXRlLXRpbWUpIGlucHV0IHZhbHVlLgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgbWluYCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBtaW46IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbWF4aW11bSAobnVtZXJpYyBvciBkYXRlLXRpbWUpIGlucHV0IHZhbHVlLgogICAgICAgICAqIENhbiBiZSBhIFN0cmluZyAoZS5nLiBgIjIwMDAtMDEtMDEiYCkgb3IgYSBOdW1iZXIgKGUuZy4gYDJgKS4KICAgICAgICAgKiBJZiB5b3UncmUgdXNpbmcgUGFwZXJJbnB1dEJlaGF2aW9yIHRvIGltcGxlbWVudCB5b3VyIG93biBwYXBlci1pbnB1dC1saWtlCiAgICAgICAgICogZWxlbWVudCwgYmluZCB0aGlzIHRvIHRoZSBgPGlucHV0IGlzPSJpcm9uLWlucHV0Ij5gJ3MgYG1heGAgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgbWF4OiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogTGltaXRzIHRoZSBudW1lcmljIG9yIGRhdGUtdGltZSBpbmNyZW1lbnRzLgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgc3RlcGAgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgc3RlcDoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgbmFtZWAgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgbmFtZToge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIEEgcGxhY2Vob2xkZXIgc3RyaW5nIGluIGFkZGl0aW9uIHRvIHRoZSBsYWJlbC4gSWYgdGhpcyBpcyBzZXQsIHRoZSBsYWJlbAogICAgICAgICAqIHdpbGwgYWx3YXlzIGZsb2F0LgogICAgICAgICAqLwogICAgICAgIHBsYWNlaG9sZGVyOiB7CiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAvLyBuZWVkIHRvIHNldCBhIGRlZmF1bHQgc28gX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsIGlzIHJ1bgogICAgICAgICAgdmFsdWU6ICcnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZQogICAgICAgICAqIGVsZW1lbnQsIGJpbmQgdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGByZWFkb25seWAKICAgICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICByZWFkb25seToge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgc2l6ZWAgcHJvcGVydHkuCiAgICAgICAgICovCiAgICAgICAgc2l6ZToge3R5cGU6IE51bWJlcn0sCgogICAgICAgIC8vIE5vbnN0YW5kYXJkIGF0dHJpYnV0ZXMgZm9yIGJpbmRpbmcgaWYgbmVlZGVkCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgYXV0b2NhcGl0YWxpemVgCiAgICAgICAgICogcHJvcGVydHkuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7c3RyaW5nfQogICAgICAgICAqLwogICAgICAgIGF1dG9jYXBpdGFsaXplOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ25vbmUnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZQogICAgICAgICAqIGVsZW1lbnQsIGJpbmQgdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGBhdXRvY29ycmVjdGAKICAgICAgICAgKiBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBhdXRvY29ycmVjdDoge3R5cGU6IFN0cmluZywgdmFsdWU6ICdvZmYnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZQogICAgICAgICAqIGVsZW1lbnQsIGJpbmQgdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGBhdXRvc2F2ZWAKICAgICAgICAgKiBwcm9wZXJ0eSwgdXNlZCB3aXRoIHR5cGU9c2VhcmNoLgogICAgICAgICAqLwogICAgICAgIGF1dG9zYXZlOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgeW91J3JlIHVzaW5nIFBhcGVySW5wdXRCZWhhdmlvciB0byBpbXBsZW1lbnQgeW91ciBvd24gcGFwZXItaW5wdXQtbGlrZQogICAgICAgICAqIGVsZW1lbnQsIGJpbmQgdGhpcyB0byB0aGUgYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGByZXN1bHRzYCBwcm9wZXJ0eSwKICAgICAgICAgKiB1c2VkIHdpdGggdHlwZT1zZWFyY2guCiAgICAgICAgICovCiAgICAgICAgcmVzdWx0czoge3R5cGU6IE51bWJlcn0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlIGA8aW5wdXQgaXM9Imlyb24taW5wdXQiPmAncyBgYWNjZXB0YCBwcm9wZXJ0eSwKICAgICAgICAgKiB1c2VkIHdpdGggdHlwZT1maWxlLgogICAgICAgICAqLwogICAgICAgIGFjY2VwdDoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHlvdSdyZSB1c2luZyBQYXBlcklucHV0QmVoYXZpb3IgdG8gaW1wbGVtZW50IHlvdXIgb3duIHBhcGVyLWlucHV0LWxpa2UKICAgICAgICAgKiBlbGVtZW50LCBiaW5kIHRoaXMgdG8gdGhlYDxpbnB1dCBpcz0iaXJvbi1pbnB1dCI+YCdzIGBtdWx0aXBsZWAgcHJvcGVydHksCiAgICAgICAgICogdXNlZCB3aXRoIHR5cGU9ZmlsZS4KICAgICAgICAgKi8KICAgICAgICBtdWx0aXBsZToge3R5cGU6IEJvb2xlYW59LAoKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBfYXJpYURlc2NyaWJlZEJ5OiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJyd9LAoKICAgICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgICBfYXJpYUxhYmVsbGVkQnk6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnJ30sCgogICAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICAgIF9pbnB1dElkOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJyd9CiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHsKICAgICAgICAnYWRkb24tYXR0YWNoZWQnOiAnX29uQWRkb25BdHRhY2hlZCcsCiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHR5cGUgeyFPYmplY3R9CiAgICAgICAqLwogICAgICBrZXlCaW5kaW5nczogeydzaGlmdCt0YWI6a2V5ZG93bic6ICdfb25TaGlmdFRhYkRvd24nfSwKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBob3N0QXR0cmlidXRlczoge3RhYmluZGV4OiAwfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHshSFRNTEVsZW1lbnR9CiAgICAgICAqLwogICAgICBnZXQgaW5wdXRFbGVtZW50KCkgewogICAgICAgIC8vIENocm9tZSBnZW5lcmF0ZXMgYXVkaXQgZXJyb3JzIGlmIGFuIDxpbnB1dCB0eXBlPSJwYXNzd29yZCI+IGhhcyBhCiAgICAgICAgLy8gZHVwbGljYXRlIElELCB3aGljaCBpcyBhbG1vc3QgYWx3YXlzIHRydWUgaW4gU2hhZHkgRE9NLiBHZW5lcmF0ZQogICAgICAgIC8vIGEgdW5pcXVlIElEIGluc3RlYWQuCiAgICAgICAgaWYgKCF0aGlzLiQpIHsKICAgICAgICAgIHRoaXMuJCA9IHt9OwogICAgICAgIH0KICAgICAgICBpZiAoIXRoaXMuJC5pbnB1dCkgewogICAgICAgICAgdGhpcy5fZ2VuZXJhdGVJbnB1dElkKCk7CiAgICAgICAgICB0aGlzLiQuaW5wdXQgPSB0aGlzLiQkKCcjJyArIHRoaXMuX2lucHV0SWQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy4kLmlucHV0OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGZvY3VzYWJsZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHshSFRNTEVsZW1lbnR9CiAgICAgICAqLwogICAgICBnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50OwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBUaGVzZSB0eXBlcyBoYXZlIHNvbWUgZGVmYXVsdCBwbGFjZWhvbGRlciB0ZXh0OyBvdmVybGFwcGluZwogICAgICAgIC8vIHRoZSBsYWJlbCBvbiB0b3Agb2YgaXQgbG9va3MgdGVycmlibGUuIEF1dG8tZmxvYXQgdGhlIGxhYmVsIGluIHRoaXMgY2FzZS4KICAgICAgICB0aGlzLl90eXBlc1RoYXRIYXZlVGV4dCA9CiAgICAgICAgICAgIFsnZGF0ZScsICdkYXRldGltZScsICdkYXRldGltZS1sb2NhbCcsICdtb250aCcsICd0aW1lJywgJ3dlZWsnLCAnZmlsZSddOwogICAgICB9LAoKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKTsKCiAgICAgICAgLy8gSW4gdGhlIDIuMCB2ZXJzaW9uIG9mIHRoZSBlbGVtZW50LCB0aGlzIGlzIGhhbmRsZWQgaW4gYG9uSXJvbklucHV0UmVhZHlgLAogICAgICAgIC8vIGkuZS4gYWZ0ZXIgdGhlIG5hdGl2ZSBpbnB1dCBoYXMgZmluaXNoZWQgZGlzdHJpYnV0aW5nLiBJbiB0aGUgMS4wCiAgICAgICAgLy8gdmVyc2lvbiwgdGhlIGlucHV0IGlzIGluIHRoZSBzaGFkb3cgdHJlZSwgc28gaXQncyBhbHJlYWR5IGF2YWlsYWJsZS4KICAgICAgICBpZiAoIVBvbHltZXJFbGVtZW50ICYmIHRoaXMuaW5wdXRFbGVtZW50ICYmCiAgICAgICAgICAgIHRoaXMuX3R5cGVzVGhhdEhhdmVUZXh0LmluZGV4T2YodGhpcy5pbnB1dEVsZW1lbnQudHlwZSkgIT09IC0xKSB7CiAgICAgICAgICB0aGlzLmFsd2F5c0Zsb2F0TGFiZWwgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9hcHBlbmRTdHJpbmdXaXRoU3BhY2U6IGZ1bmN0aW9uKHN0ciwgbW9yZSkgewogICAgICAgIGlmIChzdHIpIHsKICAgICAgICAgIHN0ciA9IHN0ciArICcgJyArIG1vcmU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0ciA9IG1vcmU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHI7CiAgICAgIH0sCgogICAgICBfb25BZGRvbkF0dGFjaGVkOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciB0YXJnZXQgPSBkb20oZXZlbnQpLnJvb3RUYXJnZXQ7CiAgICAgICAgaWYgKHRhcmdldC5pZCkgewogICAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlZEJ5ID0KICAgICAgICAgICAgICB0aGlzLl9hcHBlbmRTdHJpbmdXaXRoU3BhY2UodGhpcy5fYXJpYURlc2NyaWJlZEJ5LCB0YXJnZXQuaWQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgaWQgPSAncGFwZXItaW5wdXQtYWRkLW9uLScgKyBQYXBlcklucHV0SGVscGVyLk5leHRBZGRvbklEKys7CiAgICAgICAgICB0YXJnZXQuaWQgPSBpZDsKICAgICAgICAgIHRoaXMuX2FyaWFEZXNjcmliZWRCeSA9CiAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kU3RyaW5nV2l0aFNwYWNlKHRoaXMuX2FyaWFEZXNjcmliZWRCeSwgaWQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBWYWxpZGF0ZXMgdGhlIGlucHV0IGVsZW1lbnQgYW5kIHNldHMgYW4gZXJyb3Igc3R5bGUgaWYgbmVlZGVkLgogICAgICAgKgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufQogICAgICAgKi8KICAgICAgdmFsaWRhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmlucHV0RWxlbWVudC52YWxpZGF0ZSgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEZvcndhcmQgZm9jdXMgdG8gaW5wdXRFbGVtZW50LiBPdmVycmlkZW4gZnJvbSBJcm9uQ29udHJvbFN0YXRlLgogICAgICAgKi8KICAgICAgX2ZvY3VzQmx1ckhhbmRsZXI6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgSXJvbkNvbnRyb2xTdGF0ZS5fZm9jdXNCbHVySGFuZGxlci5jYWxsKHRoaXMsIGV2ZW50KTsKCiAgICAgICAgLy8gRm9yd2FyZCB0aGUgZm9jdXMgdG8gdGhlIG5lc3RlZCBpbnB1dC4KICAgICAgICBpZiAodGhpcy5mb2N1c2VkICYmICF0aGlzLl9zaGlmdFRhYlByZXNzZWQgJiYgdGhpcy5fZm9jdXNhYmxlRWxlbWVudCkgewogICAgICAgICAgdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5mb2N1cygpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBIYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBzaGlmdCt0YWIga2V5cHJlc3MgaXMgZGV0ZWN0ZWQgYnkgdGhlIG1lbnUuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2ZW50IEEga2V5IGNvbWJpbmF0aW9uIGV2ZW50LgogICAgICAgKi8KICAgICAgX29uU2hpZnRUYWJEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciBvbGRUYWJJbmRleCA9IHRoaXMuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpOwogICAgICAgIHRoaXMuX3NoaWZ0VGFiUHJlc3NlZCA9IHRydWU7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7CiAgICAgICAgdGhpcy5hc3luYyhmdW5jdGlvbigpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIG9sZFRhYkluZGV4KTsKICAgICAgICAgIHRoaXMuX3NoaWZ0VGFiUHJlc3NlZCA9IGZhbHNlOwogICAgICAgIH0sIDEpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIElmIGBhdXRvVmFsaWRhdGVgIGlzIHRydWUsIHRoZW4gdmFsaWRhdGVzIHRoZSBlbGVtZW50LgogICAgICAgKi8KICAgICAgX2hhbmRsZUF1dG9WYWxpZGF0ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuYXV0b1ZhbGlkYXRlKQogICAgICAgICAgdGhpcy52YWxpZGF0ZSgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJlc3RvcmVzIHRoZSBjdXJzb3IgdG8gaXRzIG9yaWdpbmFsIHBvc2l0aW9uIGFmdGVyIHVwZGF0aW5nIHRoZSB2YWx1ZS4KICAgICAgICogQHBhcmFtIHtzdHJpbmd9IG5ld1ZhbHVlIFRoZSB2YWx1ZSB0aGF0IHNob3VsZCBiZSBzYXZlZC4KICAgICAgICovCiAgICAgIHVwZGF0ZVZhbHVlQW5kUHJlc2VydmVDYXJldDogZnVuY3Rpb24obmV3VmFsdWUpIHsKICAgICAgICAvLyBOb3QgYWxsIGVsZW1lbnRzIG1pZ2h0IGhhdmUgc2VsZWN0aW9uLCBhbmQgZXZlbiBpZiB0aGV5IGhhdmUgdGhlCiAgICAgICAgLy8gcmlnaHQgcHJvcGVydGllcywgYWNjZXNzaW5nIHRoZW0gbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIChsaWtlIGZvcgogICAgICAgIC8vIDxpbnB1dCB0eXBlPW51bWJlcj4pCiAgICAgICAgdHJ5IHsKICAgICAgICAgIHZhciBzdGFydCA9IHRoaXMuaW5wdXRFbGVtZW50LnNlbGVjdGlvblN0YXJ0OwogICAgICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwoKICAgICAgICAgIC8vIFRoZSBjdXJzb3IgYXV0b21hdGljYWxseSBqdW1wcyB0byB0aGUgZW5kIGFmdGVyIHJlLXNldHRpbmcgdGhlIHZhbHVlLAogICAgICAgICAgLy8gc28gcmVzdG9yZSBpdCB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24uCiAgICAgICAgICB0aGlzLmlucHV0RWxlbWVudC5zZWxlY3Rpb25TdGFydCA9IHN0YXJ0OwogICAgICAgICAgdGhpcy5pbnB1dEVsZW1lbnQuc2VsZWN0aW9uRW5kID0gc3RhcnQ7CiAgICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgICAgLy8gSnVzdCBzZXQgdGhlIHZhbHVlIGFuZCBnaXZlIHVwIG9uIHRoZSBjYXJldC4KICAgICAgICAgIHRoaXMudmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfY29tcHV0ZUFsd2F5c0Zsb2F0TGFiZWw6IGZ1bmN0aW9uKGFsd2F5c0Zsb2F0TGFiZWwsIHBsYWNlaG9sZGVyKSB7CiAgICAgICAgcmV0dXJuIHBsYWNlaG9sZGVyIHx8IGFsd2F5c0Zsb2F0TGFiZWw7CiAgICAgIH0sCgogICAgICBfdXBkYXRlQXJpYUxhYmVsbGVkQnk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsYWJlbCA9IGRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3IoJ2xhYmVsJyk7CiAgICAgICAgaWYgKCFsYWJlbCkgewogICAgICAgICAgdGhpcy5fYXJpYUxhYmVsbGVkQnkgPSAnJzsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdmFyIGxhYmVsbGVkQnk7CiAgICAgICAgaWYgKGxhYmVsLmlkKSB7CiAgICAgICAgICBsYWJlbGxlZEJ5ID0gbGFiZWwuaWQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGxhYmVsbGVkQnkgPSAncGFwZXItaW5wdXQtbGFiZWwtJyArIFBhcGVySW5wdXRIZWxwZXIuTmV4dExhYmVsSUQrKzsKICAgICAgICAgIGxhYmVsLmlkID0gbGFiZWxsZWRCeTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYXJpYUxhYmVsbGVkQnkgPSBsYWJlbGxlZEJ5OwogICAgICB9LAoKICAgICAgX2dlbmVyYXRlSW5wdXRJZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLl9pbnB1dElkIHx8IHRoaXMuX2lucHV0SWQgPT09ICcnKSB7CiAgICAgICAgICB0aGlzLl9pbnB1dElkID0gJ2lucHV0LScgKyBQYXBlcklucHV0SGVscGVyLk5leHRJbnB1dElEKys7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX29uQ2hhbmdlOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIC8vIEluIHRoZSBTaGFkb3cgRE9NLCB0aGUgYGNoYW5nZWAgZXZlbnQgaXMgbm90IGxlYWtlZCBpbnRvIHRoZQogICAgICAgIC8vIGFuY2VzdG9yIHRyZWUsIHNvIHdlIG11c3QgZG8gdGhpcyBtYW51YWxseS4KICAgICAgICAvLyBTZWUKICAgICAgICAvLyBodHRwczovL3czYy5naXRodWIuaW8vd2ViY29tcG9uZW50cy9zcGVjL3NoYWRvdy8jZXZlbnRzLXRoYXQtYXJlLW5vdC1sZWFrZWQtaW50by1hbmNlc3Rvci10cmVlcy4KICAgICAgICBpZiAodGhpcy5zaGFkb3dSb290KSB7CiAgICAgICAgICB0aGlzLmZpcmUoCiAgICAgICAgICAgICAgZXZlbnQudHlwZSwKICAgICAgICAgICAgICB7c291cmNlRXZlbnQ6IGV2ZW50fSwKICAgICAgICAgICAgICB7bm9kZTogdGhpcywgYnViYmxlczogZXZlbnQuYnViYmxlcywgY2FuY2VsYWJsZTogZXZlbnQuY2FuY2VsYWJsZX0pOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9hdXRvZm9jdXNDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBGaXJlZm94IGRvZXNuJ3QgcmVzcGVjdCB0aGUgYXV0b2ZvY3VzIGF0dHJpYnV0ZSBpZiBpdCdzIGFwcGxpZWQgYWZ0ZXIKICAgICAgICAvLyB0aGUgcGFnZSBpcyBsb2FkZWQgKENocm9tZS9XZWJLaXQgZG8gcmVzcGVjdCBpdCksIHByZXZlbnRpbmcgYW4KICAgICAgICAvLyBhdXRvZm9jdXMgYXR0cmlidXRlIHNwZWNpZmllZCBpbiBtYXJrdXAgZnJvbSB0YWtpbmcgZWZmZWN0IHdoZW4gdGhlCiAgICAgICAgLy8gZWxlbWVudCBpcyB1cGdyYWRlZC4gQXMgYSB3b3JrYXJvdW5kLCBpZiB0aGUgYXV0b2ZvY3VzIHByb3BlcnR5IGlzIHNldCwKICAgICAgICAvLyBhbmQgdGhlIGZvY3VzIGhhc24ndCBhbHJlYWR5IGJlZW4gbW92ZWQgZWxzZXdoZXJlLCB3ZSB0YWtlIGZvY3VzLgogICAgICAgIGlmICh0aGlzLmF1dG9mb2N1cyAmJiB0aGlzLl9mb2N1c2FibGVFbGVtZW50KSB7CiAgICAgICAgICAvLyBJbiBJRSAxMSwgdGhlIGRlZmF1bHQgZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBjYW4gYmUgdGhlIHBhZ2UncwogICAgICAgICAgLy8gb3V0ZXJtb3N0IGh0bWwgZWxlbWVudCwgYnV0IHRoZXJlIGFyZSBhbHNvIGNhc2VzICh1bmRlciB0aGUKICAgICAgICAgIC8vIHBvbHlmaWxsPykgaW4gd2hpY2ggdGhlIGFjdGl2ZUVsZW1lbnQgaXMgbm90IGEgcmVhbCBIVE1MRWxlbWVudCwgYnV0CiAgICAgICAgICAvLyBqdXN0IGEgcGxhaW4gb2JqZWN0LiBXZSBpZGVudGlmeSB0aGUgbGF0dGVyIGNhc2UgYXMgaGF2aW5nIG5vIHZhbGlkCiAgICAgICAgICAvLyBhY3RpdmVFbGVtZW50LgogICAgICAgICAgdmFyIGFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgICAgICAgdmFyIGlzQWN0aXZlRWxlbWVudFZhbGlkID0gYWN0aXZlRWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50OwoKICAgICAgICAgIC8vIEhhcyBzb21lIG90aGVyIGVsZW1lbnQgaGFzIGFscmVhZHkgdGFrZW4gdGhlIGZvY3VzPwogICAgICAgICAgdmFyIGlzU29tZUVsZW1lbnRBY3RpdmUgPSBpc0FjdGl2ZUVsZW1lbnRWYWxpZCAmJgogICAgICAgICAgICAgIGFjdGl2ZUVsZW1lbnQgIT09IGRvY3VtZW50LmJvZHkgJiYKICAgICAgICAgICAgICBhY3RpdmVFbGVtZW50ICE9PSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7IC8qIElFIDExICovCiAgICAgICAgICBpZiAoIWlzU29tZUVsZW1lbnRBY3RpdmUpIHsKICAgICAgICAgICAgLy8gTm8gc3BlY2lmaWMgZWxlbWVudCBoYXMgdGFrZW4gdGhlIGZvY3VzIHlldCwgc28gd2UgY2FuIHRha2UgaXQuCiAgICAgICAgICAgIHRoaXMuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IFBhcGVySW5wdXRCZWhhdmlvciA9CiAgICAgICAgW0lyb25Db250cm9sU3RhdGUsIElyb25BMTF5S2V5c0JlaGF2aW9yLCBQYXBlcklucHV0QmVoYXZpb3JJbXBsXTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgIE1hdGVyaWFsIGRlc2lnbjogW1RleHQKICAgIGZpZWxkc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL3RleHQtZmllbGRzLmh0bWwpCgogICAgYDxwYXBlci1pbnB1dD5gIGlzIGEgc2luZ2xlLWxpbmUgdGV4dCBmaWVsZCB3aXRoIE1hdGVyaWFsIERlc2lnbiBzdHlsaW5nLgoKICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9IklucHV0IGxhYmVsIj48L3BhcGVyLWlucHV0PgoKICAgIEl0IG1heSBpbmNsdWRlIGFuIG9wdGlvbmFsIGVycm9yIG1lc3NhZ2Ugb3IgY2hhcmFjdGVyIGNvdW50ZXIuCgogICAgICAgIDxwYXBlci1pbnB1dCBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0ISIgbGFiZWw9IklucHV0CiAgICAgICAgbGFiZWwiPjwvcGFwZXItaW5wdXQ+IDxwYXBlci1pbnB1dCBjaGFyLWNvdW50ZXIgbGFiZWw9IklucHV0CiAgICAgICAgbGFiZWwiPjwvcGFwZXItaW5wdXQ+CgogICAgSXQgY2FuIGFsc28gaW5jbHVkZSBjdXN0b20gcHJlZml4IG9yIHN1ZmZpeCBlbGVtZW50cywgd2hpY2ggYXJlIGRpc3BsYXllZAogICAgYmVmb3JlIG9yIGFmdGVyIHRoZSB0ZXh0IGlucHV0IGl0c2VsZi4gSW4gb3JkZXIgZm9yIGFuIGVsZW1lbnQgdG8gYmUKICAgIGNvbnNpZGVyZWQgYXMgYSBwcmVmaXgsIGl0IG11c3QgaGF2ZSB0aGUgYHByZWZpeGAgYXR0cmlidXRlIChhbmQgc2ltaWxhcmx5CiAgICBmb3IgYHN1ZmZpeGApLgoKICAgICAgICA8cGFwZXItaW5wdXQgbGFiZWw9InRvdGFsIj4KICAgICAgICAgIDxkaXYgcHJlZml4PiQ8L2Rpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzbG90PSJzdWZmaXgiIGljb249ImNsZWFyIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvcGFwZXItaW5wdXQ+CgogICAgQSBgcGFwZXItaW5wdXRgIGNhbiB1c2UgdGhlIG5hdGl2ZSBgdHlwZT1zZWFyY2hgIG9yIGB0eXBlPWZpbGVgIGZlYXR1cmVzLgogICAgSG93ZXZlciwgc2luY2Ugd2UgY2FuJ3QgY29udHJvbCB0aGUgbmF0aXZlIHN0eWxpbmcgb2YgdGhlIGlucHV0IChzZWFyY2ggaWNvbiwKICAgIGZpbGUgYnV0dG9uLCBkYXRlIHBsYWNlaG9sZGVyLCBldGMuKSwgaW4gdGhlc2UgY2FzZXMgdGhlIGxhYmVsIHdpbGwgYmUKICAgIGF1dG9tYXRpY2FsbHkgZmxvYXRlZC4gVGhlIGBwbGFjZWhvbGRlcmAgYXR0cmlidXRlIGNhbiBzdGlsbCBiZSB1c2VkIGZvcgogICAgYWRkaXRpb25hbCBpbmZvcm1hdGlvbmFsIHRleHQuCgogICAgICAgIDxwYXBlci1pbnB1dCBsYWJlbD0ic2VhcmNoISIgdHlwZT0ic2VhcmNoIgogICAgICAgICAgICBwbGFjZWhvbGRlcj0ic2VhcmNoIGZvciBjYXRzIiBhdXRvc2F2ZT0idGVzdCIgcmVzdWx0cz0iNSI+CiAgICAgICAgPC9wYXBlci1pbnB1dD4KCiAgICBTZWUgYFBvbHltZXIuUGFwZXJJbnB1dEJlaGF2aW9yYCBmb3IgbW9yZSBBUEkgZG9jcy4KCiAgICAjIyMgRm9jdXMKCiAgICBUbyBmb2N1cyBhIHBhcGVyLWlucHV0LCB5b3UgY2FuIGNhbGwgdGhlIG5hdGl2ZSBgZm9jdXMoKWAgbWV0aG9kIGFzIGxvbmcgYXMgdGhlCiAgICBwYXBlciBpbnB1dCBoYXMgYSB0YWIgaW5kZXguIFNpbWlsYXJseSwgYGJsdXIoKWAgd2lsbCBibHVyIHRoZSBlbGVtZW50LgoKICAgICMjIyBTdHlsaW5nCgogICAgU2VlIGBQb2x5bWVyLlBhcGVySW5wdXRDb250YWluZXJgIGZvciBhIGxpc3Qgb2YgY3VzdG9tIHByb3BlcnRpZXMgdXNlZCB0bwogICAgc3R5bGUgdGhpcyBlbGVtZW50LgoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1tcy1jbGVhcmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBJbnRlcm5ldCBFeHBsb3JlciByZXZlYWwgYnV0dG9uICh0aGUgZXllYmFsbCkgfCB7fQoKICAgIEBlbGVtZW50IHBhcGVyLWlucHV0CiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgaXM6ICdwYXBlci1pbnB1dCcsCiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtmb2N1c2VkXSkgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBpbnB1dCB7CiAgICAgICAgLyogRmlyZWZveCBzZXRzIGEgbWluLXdpZHRoIG9uIHRoZSBpbnB1dCwgd2hpY2ggY2FuIGNhdXNlIGxheW91dCBpc3N1ZXMgKi8KICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgIH0KCiAgICAgIC8qIEluIDEueCwgdGhlIDxpbnB1dD4gaXMgZGlzdHJpYnV0ZWQgdG8gcGFwZXItaW5wdXQtY29udGFpbmVyLCB3aGljaCBzdHlsZXMgaXQuCiAgICAgIEluIDIueCB0aGUgPGlyb24taW5wdXQ+IGlzIGRpc3RyaWJ1dGVkIHRvIHBhcGVyLWlucHV0LWNvbnRhaW5lciwgd2hpY2ggc3R5bGVzCiAgICAgIGl0LCBidXQgaW4gb3JkZXIgZm9yIHRoaXMgdG8gd29yayBjb3JyZWN0bHksIHdlIG5lZWQgdG8gcmVzZXQgc29tZQogICAgICBvZiB0aGUgbmF0aXZlIGlucHV0J3MgcHJvcGVydGllcyB0byBpbmhlcml0IChmcm9tIHRoZSBpcm9uLWlucHV0KSAqLwogICAgICBpcm9uLWlucHV0ID4gaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1zaGFyZWQtaW5wdXQtc3R5bGU7CiAgICAgICAgZm9udC1mYW1pbHk6IGluaGVyaXQ7CiAgICAgICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7CiAgICAgICAgZm9udC1zaXplOiBpbmhlcml0OwogICAgICAgIGxldHRlci1zcGFjaW5nOiBpbmhlcml0OwogICAgICAgIHdvcmQtc3BhY2luZzogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LXNoYWRvdzogaW5oZXJpdDsKICAgICAgICBjb2xvcjogaW5oZXJpdDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgIH0KCiAgICAgIGlucHV0OmRpc2FibGVkIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQtZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLAogICAgICBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0LXdlYmtpdC1zcGlubmVyOwogICAgICB9CgogICAgICBpbnB1dDo6LXdlYmtpdC1jbGVhci1idXR0b24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dC13ZWJraXQtY2FsZW5kYXItcGlja2VyLWluZGljYXRvcjsKICAgICAgfQoKICAgICAgaW5wdXQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0Oi1tb3otcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWNvbG9yLCB2YXIoLS1zZWNvbmRhcnktdGV4dC1jb2xvcikpOwogICAgICB9CgogICAgICBpbnB1dDo6LW1zLWNsZWFyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtY2xlYXI7CiAgICAgIH0KCiAgICAgIGlucHV0OjotbXMtcmV2ZWFsIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pbnB1dC1jb250YWluZXItbXMtcmV2ZWFsOwogICAgICB9CgogICAgICBpbnB1dDotbXMtaW5wdXQtcGxhY2Vob2xkZXIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pbnB1dC1jb250YWluZXItY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIGlkPSJjb250YWluZXIiIG5vLWxhYmVsLWZsb2F0PSJbW25vTGFiZWxGbG9hdF1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbX2NvbXB1dGVBbHdheXNGbG9hdExhYmVsKGFsd2F5c0Zsb2F0TGFiZWwscGxhY2Vob2xkZXIpXV0iIGF1dG8tdmFsaWRhdGUkPSJbW2F1dG9WYWxpZGF0ZV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgaW52YWxpZD0iW1tpbnZhbGlkXV0iPgoKICAgICAgPHNsb3QgbmFtZT0icHJlZml4IiBzbG90PSJwcmVmaXgiPjwvc2xvdD4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDwhLS0gTmVlZCB0byBiaW5kIG1heGxlbmd0aCBzbyB0aGF0IHRoZSBwYXBlci1pbnB1dC1jaGFyLWNvdW50ZXIgd29ya3MgY29ycmVjdGx5IC0tPgogICAgICA8aXJvbi1pbnB1dCBiaW5kLXZhbHVlPSJ7e3ZhbHVlfX0iIHNsb3Q9ImlucHV0IiBjbGFzcz0iaW5wdXQtZWxlbWVudCIgaWQkPSJbW19pbnB1dElkXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iIGFsbG93ZWQtcGF0dGVybj0iW1thbGxvd2VkUGF0dGVybl1dIiBpbnZhbGlkPSJ7e2ludmFsaWR9fSIgdmFsaWRhdG9yPSJbW3ZhbGlkYXRvcl1dIj4KICAgICAgICA8aW5wdXQgYXJpYS1sYWJlbGxlZGJ5JD0iW1tfYXJpYUxhYmVsbGVkQnldXSIgYXJpYS1kZXNjcmliZWRieSQ9IltbX2FyaWFEZXNjcmliZWRCeV1dIiBkaXNhYmxlZCQ9IltbZGlzYWJsZWRdXSIgdGl0bGUkPSJbW3RpdGxlXV0iIHR5cGUkPSJbW3R5cGVdXSIgcGF0dGVybiQ9IltbcGF0dGVybl1dIiByZXF1aXJlZCQ9IltbcmVxdWlyZWRdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgaW5wdXRtb2RlJD0iW1tpbnB1dG1vZGVdXSIgbWlubGVuZ3RoJD0iW1ttaW5sZW5ndGhdXSIgbWF4bGVuZ3RoJD0iW1ttYXhsZW5ndGhdXSIgbWluJD0iW1ttaW5dXSIgbWF4JD0iW1ttYXhdXSIgc3RlcCQ9Iltbc3RlcF1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgbGlzdCQ9IltbbGlzdF1dIiBzaXplJD0iW1tzaXplXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiBhdXRvY29ycmVjdCQ9IltbYXV0b2NvcnJlY3RdXSIgb24tY2hhbmdlPSJfb25DaGFuZ2UiIHRhYmluZGV4JD0iW1t0YWJJbmRleF1dIiBhdXRvc2F2ZSQ9IltbYXV0b3NhdmVdXSIgcmVzdWx0cyQ9IltbcmVzdWx0c11dIiBhY2NlcHQkPSJbW2FjY2VwdF1dIiBtdWx0aXBsZSQ9IltbbXVsdGlwbGVdXSIgcm9sZSQ9IltbaW5wdXRSb2xlXV0iIGFyaWEtaGFzcG9wdXAkPSJbW2lucHV0QXJpYUhhc3BvcHVwXV0iPgogICAgICA8L2lyb24taW5wdXQ+CgogICAgICA8c2xvdCBuYW1lPSJzdWZmaXgiIHNsb3Q9InN1ZmZpeCI+PC9zbG90PgoKICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2Vycm9yTWVzc2FnZV1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtZXJyb3IgYXJpYS1saXZlPSJhc3NlcnRpdmUiIHNsb3Q9ImFkZC1vbiI+W1tlcnJvck1lc3NhZ2VdXTwvcGFwZXItaW5wdXQtZXJyb3I+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhckNvdW50ZXJdXSI+CiAgICAgICAgPHBhcGVyLWlucHV0LWNoYXItY291bnRlciBzbG90PSJhZGQtb24iPjwvcGFwZXItaW5wdXQtY2hhci1jb3VudGVyPgogICAgICA8L3RlbXBsYXRlPgoKICAgIDwvcGFwZXItaW5wdXQtY29udGFpbmVyPgogIGAsCgogICAgICBiZWhhdmlvcnM6IFtQYXBlcklucHV0QmVoYXZpb3IsIElyb25Gb3JtRWxlbWVudEJlaGF2aW9yXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICB2YWx1ZTogewogICAgICAgICAgLy8gUmVxdWlyZWQgZm9yIHRoZSBjb3JyZWN0IFR5cGVTY3JpcHQgdHlwZS1nZW5lcmF0aW9uCiAgICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgICB9LAoKICAgICAgICBpbnB1dFJvbGU6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgfSwKCiAgICAgICAgaW5wdXRBcmlhSGFzcG9wdXA6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIHZhbHVlOiB1bmRlZmluZWQsCiAgICAgICAgfSwKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBmb2N1c2FibGUgZWxlbWVudC4gT3ZlcnJpZGRlbiBmcm9tCiAgICAgICAqIFBhcGVySW5wdXRCZWhhdmlvciB0byBjb3JyZWN0bHkgZm9jdXMgdGhlIG5hdGl2ZSBpbnB1dC4KICAgICAgICoKICAgICAgICogQHJldHVybiB7IUhUTUxFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IF9mb2N1c2FibGVFbGVtZW50KCkgewogICAgICAgIHJldHVybiB0aGlzLmlucHV0RWxlbWVudC5faW5wdXRFbGVtZW50OwogICAgICB9LAoKICAgICAgLy8gTm90ZTogVGhpcyBldmVudCBpcyBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgMS4wIHZlcnNpb24gb2YgdGhpcyBlbGVtZW50LgogICAgICAvLyBJbiAyLjAsIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGBfb25Jcm9uSW5wdXRSZWFkeWAgaXMgZG9uZSBpbgogICAgICAvLyBQYXBlcklucHV0QmVoYXZpb3I6OmF0dGFjaGVkLgogICAgICBsaXN0ZW5lcnM6IHsnaXJvbi1pbnB1dC1yZWFkeSc6ICdfb25Jcm9uSW5wdXRSZWFkeSd9LAoKICAgICAgX29uSXJvbklucHV0UmVhZHk6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIEV2ZW4gdGhvdWdoIHRoaXMgaXMgb25seSB1c2VkIGluIHRoZSBuZXh0IGxpbmUsIHNhdmUgdGhpcyBmb3IKICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgc2luY2UgdGhlIG5hdGl2ZSBpbnB1dCBoYWQgdGhpcyBJRCB1bnRpbCAyLjAuNS4KICAgICAgICBpZiAoIXRoaXMuJC5uYXRpdmVJbnB1dCkgewogICAgICAgICAgdGhpcy4kLm5hdGl2ZUlucHV0ID0gLyoqIEB0eXBlIHshRWxlbWVudH0gKi8gKHRoaXMuJCQoJ2lucHV0JykpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5pbnB1dEVsZW1lbnQgJiYKICAgICAgICAgICAgdGhpcy5fdHlwZXNUaGF0SGF2ZVRleHQuaW5kZXhPZih0aGlzLiQubmF0aXZlSW5wdXQudHlwZSkgIT09IC0xKSB7CiAgICAgICAgICB0aGlzLmFsd2F5c0Zsb2F0TGFiZWwgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gT25seSB2YWxpZGF0ZSB3aGVuIGF0dGFjaGVkIGlmIHRoZSBpbnB1dCBhbHJlYWR5IGhhcyBhIHZhbHVlLgogICAgICAgIGlmICghIXRoaXMuaW5wdXRFbGVtZW50LmJpbmRWYWx1ZSkgewogICAgICAgICAgdGhpcy4kLmNvbnRhaW5lci5faGFuZGxlVmFsdWVBbmRBdXRvVmFsaWRhdGUodGhpcy5pbnB1dEVsZW1lbnQpOwogICAgICAgIH0KICAgICAgfSwKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgYDxpcm9uLWRyb3Bkb3duPmAgaXMgYSBnZW5lcmFsaXplZCBlbGVtZW50IHRoYXQgaXMgdXNlZnVsIHdoZW4geW91IGhhdmUKICAgIGhpZGRlbiBjb250ZW50IChgZHJvcGRvd24tY29udGVudGApIHRoYXQgaXMgcmV2ZWFsZWQgZHVlIHRvIHNvbWUgY2hhbmdlIGluCiAgICBzdGF0ZSB0aGF0IHNob3VsZCBjYXVzZSBpdCB0byBkbyBzby4KCiAgICBOb3RlIHRoYXQgdGhpcyBpcyBhIGxvdy1sZXZlbCBlbGVtZW50IGludGVuZGVkIHRvIGJlIHVzZWQgYXMgcGFydCBvZiBvdGhlcgogICAgY29tcG9zaXRlIGVsZW1lbnRzIHRoYXQgY2F1c2UgZHJvcGRvd25zIHRvIGJlIHJldmVhbGVkLgoKICAgIEV4YW1wbGVzIG9mIGVsZW1lbnRzIHRoYXQgbWlnaHQgYmUgaW1wbGVtZW50ZWQgdXNpbmcgYW4gYGlyb24tZHJvcGRvd25gCiAgICBpbmNsdWRlIGNvbWJvYm94ZXMsIG1lbnVidXR0b25zLCBzZWxlY3RzLiBUaGUgbGlzdCBnb2VzIG9uLgoKICAgIFRoZSBgPGlyb24tZHJvcGRvd24+YCBlbGVtZW50IGV4cG9zZXMgYXR0cmlidXRlcyB0aGF0IGFsbG93IHRoZSBwb3NpdGlvbgogICAgb2YgdGhlIGBkcm9wZG93bi1jb250ZW50YCByZWxhdGl2ZSB0byB0aGUgYGRyb3Bkb3duLXRyaWdnZXJgIHRvIGJlCiAgICBjb25maWd1cmVkLgoKICAgICAgICA8aXJvbi1kcm9wZG93biBob3Jpem9udGFsLWFsaWduPSJyaWdodCIgdmVydGljYWwtYWxpZ249InRvcCI+CiAgICAgICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPkhlbGxvITwvZGl2PgogICAgICAgIDwvaXJvbi1kcm9wZG93bj4KCiAgICBJbiB0aGUgYWJvdmUgZXhhbXBsZSwgdGhlIGA8ZGl2PmAgYXNzaWduZWQgdG8gdGhlIGBkcm9wZG93bi1jb250ZW50YCBzbG90IHdpbGwKICAgIGJlIGhpZGRlbiB1bnRpbCB0aGUgZHJvcGRvd24gZWxlbWVudCBoYXMgYG9wZW5lZGAgc2V0IHRvIHRydWUsIG9yIHdoZW4gdGhlCiAgICBgb3BlbmAgbWV0aG9kIGlzIGNhbGxlZCBvbiB0aGUgZWxlbWVudC4KCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB9CgogICAgICAjY29udGVudFdyYXBwZXIgOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQoKICAgICAgI2NvbnRlbnRXcmFwcGVyLmFuaW1hdGluZyA6OnNsb3R0ZWQoKikgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0iY29udGVudFdyYXBwZXIiPgogICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgPC9kaXY+CmAsCgogICAgICBpczogJ2lyb24tZHJvcGRvd24nLAoKICAgICAgYmVoYXZpb3JzOiBbCiAgICAgICAgSXJvbkNvbnRyb2xTdGF0ZSwKICAgICAgICBJcm9uQTExeUtleXNCZWhhdmlvciwKICAgICAgICBJcm9uT3ZlcmxheUJlaGF2aW9yLAogICAgICAgIE5lb25BbmltYXRpb25SdW5uZXJCZWhhdmlvcgogICAgICBdLAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBvcmllbnRhdGlvbiBhZ2FpbnN0IHdoaWNoIHRvIGFsaWduIHRoZSBkcm9wZG93biBjb250ZW50CiAgICAgICAgICogaG9yaXpvbnRhbGx5IHJlbGF0aXZlIHRvIHRoZSBkcm9wZG93biB0cmlnZ2VyLgogICAgICAgICAqIE92ZXJyaWRkZW4gZnJvbSBgUG9seW1lci5Jcm9uRml0QmVoYXZpb3JgLgogICAgICAgICAqLwogICAgICAgIGhvcml6b250YWxBbGlnbjoge3R5cGU6IFN0cmluZywgdmFsdWU6ICdsZWZ0JywgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG9yaWVudGF0aW9uIGFnYWluc3Qgd2hpY2ggdG8gYWxpZ24gdGhlIGRyb3Bkb3duIGNvbnRlbnQKICAgICAgICAgKiB2ZXJ0aWNhbGx5IHJlbGF0aXZlIHRvIHRoZSBkcm9wZG93biB0cmlnZ2VyLgogICAgICAgICAqIE92ZXJyaWRkZW4gZnJvbSBgUG9seW1lci5Jcm9uRml0QmVoYXZpb3JgLgogICAgICAgICAqLwogICAgICAgIHZlcnRpY2FsQWxpZ246IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAndG9wJywgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gYW5pbWF0aW9uIGNvbmZpZy4gSWYgcHJvdmlkZWQsIHRoaXMgd2lsbCBiZSB1c2VkIHRvIGFuaW1hdGUgdGhlCiAgICAgICAgICogb3BlbmluZyBvZiB0aGUgZHJvcGRvd24uIFBhc3MgYW4gQXJyYXkgZm9yIG11bHRpcGxlIGFuaW1hdGlvbnMuCiAgICAgICAgICogU2VlIGBuZW9uLWFuaW1hdGlvbmAgZG9jdW1lbnRhdGlvbiBmb3IgbW9yZSBhbmltYXRpb24gY29uZmlndXJhdGlvbgogICAgICAgICAqIGRldGFpbHMuCiAgICAgICAgICovCiAgICAgICAgb3BlbkFuaW1hdGlvbkNvbmZpZzoge3R5cGU6IE9iamVjdH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFuIGFuaW1hdGlvbiBjb25maWcuIElmIHByb3ZpZGVkLCB0aGlzIHdpbGwgYmUgdXNlZCB0byBhbmltYXRlIHRoZQogICAgICAgICAqIGNsb3Npbmcgb2YgdGhlIGRyb3Bkb3duLiBQYXNzIGFuIEFycmF5IGZvciBtdWx0aXBsZSBhbmltYXRpb25zLgogICAgICAgICAqIFNlZSBgbmVvbi1hbmltYXRpb25gIGRvY3VtZW50YXRpb24gZm9yIG1vcmUgYW5pbWF0aW9uIGNvbmZpZ3VyYXRpb24KICAgICAgICAgKiBkZXRhaWxzLgogICAgICAgICAqLwogICAgICAgIGNsb3NlQW5pbWF0aW9uQ29uZmlnOiB7dHlwZTogT2JqZWN0fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgcHJvdmlkZWQsIHRoaXMgd2lsbCBiZSB0aGUgZWxlbWVudCB0aGF0IHdpbGwgYmUgZm9jdXNlZCB3aGVuCiAgICAgICAgICogdGhlIGRyb3Bkb3duIG9wZW5zLgogICAgICAgICAqLwogICAgICAgIGZvY3VzVGFyZ2V0OiB7dHlwZTogT2JqZWN0fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhbmltYXRpb25zIHdoZW4gb3BlbmluZyBhbmQgY2xvc2luZyB0aGUKICAgICAgICAgKiBkcm9wZG93bi4KICAgICAgICAgKi8KICAgICAgICBub0FuaW1hdGlvbnM6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZHJvcGRvd24gd2lsbCBjb25zdHJhaW4gc2Nyb2xsaW5nIG9uIHRoZSBwYWdlCiAgICAgICAgICogdG8gaXRzZWxmIHdoZW4gb3BlbmVkLgogICAgICAgICAqIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIHByZXZlbnQgc2Nyb2xsIGZyb20gYmVpbmcgY29uc3RyYWluZWQKICAgICAgICAgKiB0byB0aGUgZHJvcGRvd24gd2hlbiBpdCBvcGVucy4KICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGEgc2hvcnRjdXQgdG8gc2V0IGBzY3JvbGxBY3Rpb25gIHRvIGxvY2sgb3IgcmVmaXQuCiAgICAgICAgICogUHJlZmVyIGRpcmVjdGx5IHNldHRpbmcgdGhlIGBzY3JvbGxBY3Rpb25gIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGFsbG93T3V0c2lkZVNjcm9sbDoKICAgICAgICAgICAge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZSwgb2JzZXJ2ZXI6ICdfYWxsb3dPdXRzaWRlU2Nyb2xsQ2hhbmdlZCd9CiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHsnbmVvbi1hbmltYXRpb24tZmluaXNoJzogJ19vbk5lb25BbmltYXRpb25GaW5pc2gnfSwKCiAgICAgIG9ic2VydmVyczogWwogICAgICAgICdfdXBkYXRlT3ZlcmxheVBvc2l0aW9uKHBvc2l0aW9uVGFyZ2V0LCB2ZXJ0aWNhbEFsaWduLCBob3Jpem9udGFsQWxpZ24sIHZlcnRpY2FsT2Zmc2V0LCBob3Jpem9udGFsT2Zmc2V0KScKICAgICAgXSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgZWxlbWVudCB0aGF0IGlzIGNvbnRhaW5lZCBieSB0aGUgZHJvcGRvd24sIGlmIGFueS4KICAgICAgICovCiAgICAgIGdldCBjb250YWluZWRFbGVtZW50KCkgewogICAgICAgIC8vIFBvbHltZXIgMi54IHJldHVybnMgc2xvdC5hc3NpZ25lZE5vZGVzIHdoaWNoIGNhbiBjb250YWluIHRleHQgbm9kZXMuCiAgICAgICAgdmFyIG5vZGVzID0gZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIGlmIChub2Rlc1tpXS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIHJlYWR5OiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBFbnN1cmUgc2Nyb2xsQWN0aW9uIGlzIHNldC4KICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsQWN0aW9uKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbEFjdGlvbiA9IHRoaXMuYWxsb3dPdXRzaWRlU2Nyb2xsID8gJ3JlZml0JyA6ICdsb2NrJzsKICAgICAgICB9CiAgICAgICAgdGhpcy5fcmVhZGllZCA9IHRydWU7CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLnNpemluZ1RhcmdldCB8fCB0aGlzLnNpemluZ1RhcmdldCA9PT0gdGhpcykgewogICAgICAgICAgdGhpcy5zaXppbmdUYXJnZXQgPSB0aGlzLmNvbnRhaW5lZEVsZW1lbnQgfHwgdGhpczsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jYW5jZWxBbmltYXRpb24oKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgYG9wZW5lZGAgY2hhbmdlcy4KICAgICAgICogT3ZlcnJpZGRlbiBmcm9tIGBJcm9uT3ZlcmxheUJlaGF2aW9yYAogICAgICAgKi8KICAgICAgX29wZW5lZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm9wZW5lZCAmJiB0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICB0aGlzLmNhbmNlbCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmNhbmNlbEFuaW1hdGlvbigpOwogICAgICAgICAgdGhpcy5fdXBkYXRlQW5pbWF0aW9uQ29uZmlnKCk7CiAgICAgICAgICBJcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fb3BlbmVkQ2hhbmdlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZGVuIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKi8KICAgICAgX3JlbmRlck9wZW5lZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLm5vQW5pbWF0aW9ucyAmJiB0aGlzLmFuaW1hdGlvbkNvbmZpZy5vcGVuKSB7CiAgICAgICAgICB0aGlzLiQuY29udGVudFdyYXBwZXIuY2xhc3NMaXN0LmFkZCgnYW5pbWF0aW5nJyk7CiAgICAgICAgICB0aGlzLnBsYXlBbmltYXRpb24oJ29wZW4nKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX3JlbmRlck9wZW5lZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZGVuIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKi8KICAgICAgX3JlbmRlckNsb3NlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLm5vQW5pbWF0aW9ucyAmJiB0aGlzLmFuaW1hdGlvbkNvbmZpZy5jbG9zZSkgewogICAgICAgICAgdGhpcy4kLmNvbnRlbnRXcmFwcGVyLmNsYXNzTGlzdC5hZGQoJ2FuaW1hdGluZycpOwogICAgICAgICAgdGhpcy5wbGF5QW5pbWF0aW9uKCdjbG9zZScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBJcm9uT3ZlcmxheUJlaGF2aW9ySW1wbC5fcmVuZGVyQ2xvc2VkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB3aGVuIGFuaW1hdGlvbiBmaW5pc2hlcyBvbiB0aGUgZHJvcGRvd24gKHdoZW4gb3BlbmluZyBvcgogICAgICAgKiBjbG9zaW5nKS4gUmVzcG9uc2libGUgZm9yICJjb21wbGV0aW5nIiB0aGUgcHJvY2VzcyBvZiBvcGVuaW5nIG9yCiAgICAgICAqIGNsb3NpbmcgdGhlIGRyb3Bkb3duIGJ5IHBvc2l0aW9uaW5nIGl0IG9yIHNldHRpbmcgaXRzIGRpc3BsYXkgdG8KICAgICAgICogbm9uZS4KICAgICAgICovCiAgICAgIF9vbk5lb25BbmltYXRpb25GaW5pc2g6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuJC5jb250ZW50V3JhcHBlci5jbGFzc0xpc3QucmVtb3ZlKCdhbmltYXRpbmcnKTsKICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHsKICAgICAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlck9wZW5lZCgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9maW5pc2hSZW5kZXJDbG9zZWQoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ29uc3RydWN0cyB0aGUgZmluYWwgYW5pbWF0aW9uIGNvbmZpZyBmcm9tIGRpZmZlcmVudCBwcm9wZXJ0aWVzIHVzZWQKICAgICAgICogdG8gY29uZmlndXJlIHNwZWNpZmljIHBhcnRzIG9mIHRoZSBvcGVuaW5nIGFuZCBjbG9zaW5nIGFuaW1hdGlvbnMuCiAgICAgICAqLwogICAgICBfdXBkYXRlQW5pbWF0aW9uQ29uZmlnOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBVcGRhdGUgdGhlIGFuaW1hdGlvbiBub2RlIHRvIGJlIHRoZSBjb250YWluZWRFbGVtZW50LgogICAgICAgIHZhciBhbmltYXRpb25Ob2RlID0gdGhpcy5jb250YWluZWRFbGVtZW50OwogICAgICAgIHZhciBhbmltYXRpb25zID0gW10uY29uY2F0KHRoaXMub3BlbkFuaW1hdGlvbkNvbmZpZyB8fCBbXSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29uY2F0KHRoaXMuY2xvc2VBbmltYXRpb25Db25maWcgfHwgW10pOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYW5pbWF0aW9ucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgYW5pbWF0aW9uc1tpXS5ub2RlID0gYW5pbWF0aW9uTm9kZTsKICAgICAgICB9CiAgICAgICAgdGhpcy5hbmltYXRpb25Db25maWcgPSB7CiAgICAgICAgICBvcGVuOiB0aGlzLm9wZW5BbmltYXRpb25Db25maWcsCiAgICAgICAgICBjbG9zZTogdGhpcy5jbG9zZUFuaW1hdGlvbkNvbmZpZwogICAgICAgIH07CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVXBkYXRlcyB0aGUgb3ZlcmxheSBwb3NpdGlvbiBiYXNlZCBvbiBjb25maWd1cmVkIGhvcml6b250YWwKICAgICAgICogYW5kIHZlcnRpY2FsIGFsaWdubWVudC4KICAgICAgICovCiAgICAgIF91cGRhdGVPdmVybGF5UG9zaXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgIC8vIFRoaXMgdHJpZ2dlcnMgaXJvbi1yZXNpemUsIGFuZCBpcm9uLW92ZXJsYXktYmVoYXZpb3Igd2lsbCBjYWxsIHJlZml0IGlmCiAgICAgICAgICAvLyBuZWVkZWQuCiAgICAgICAgICB0aGlzLm5vdGlmeVJlc2l6ZSgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHNjcm9sbEFjdGlvbiBhY2NvcmRpbmcgdG8gdGhlIHZhbHVlIG9mIGFsbG93T3V0c2lkZVNjcm9sbC4KICAgICAgICogUHJlZmVyIHNldHRpbmcgZGlyZWN0bHkgc2Nyb2xsQWN0aW9uLgogICAgICAgKi8KICAgICAgX2FsbG93T3V0c2lkZVNjcm9sbENoYW5nZWQ6IGZ1bmN0aW9uKGFsbG93T3V0c2lkZVNjcm9sbCkgewogICAgICAgIC8vIFdhaXQgdW50aWwgaW5pdGlhbCB2YWx1ZXMgYXJlIGFsbCBzZXQuCiAgICAgICAgaWYgKCF0aGlzLl9yZWFkaWVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlmICghYWxsb3dPdXRzaWRlU2Nyb2xsKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbEFjdGlvbiA9ICdsb2NrJzsKICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLnNjcm9sbEFjdGlvbiB8fCB0aGlzLnNjcm9sbEFjdGlvbiA9PT0gJ2xvY2snKSB7CiAgICAgICAgICB0aGlzLnNjcm9sbEFjdGlvbiA9ICdyZWZpdCc7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEFwcGx5IGZvY3VzIHRvIGZvY3VzVGFyZ2V0IG9yIGNvbnRhaW5lZEVsZW1lbnQKICAgICAgICovCiAgICAgIF9hcHBseUZvY3VzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZm9jdXNUYXJnZXQgPSB0aGlzLmZvY3VzVGFyZ2V0IHx8IHRoaXMuY29udGFpbmVkRWxlbWVudDsKICAgICAgICBpZiAoZm9jdXNUYXJnZXQgJiYgdGhpcy5vcGVuZWQgJiYgIXRoaXMubm9BdXRvRm9jdXMpIHsKICAgICAgICAgIGZvY3VzVGFyZ2V0LmZvY3VzKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIElyb25PdmVybGF5QmVoYXZpb3JJbXBsLl9hcHBseUZvY3VzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIFVzZSBgTmVvbkFuaW1hdGlvbkJlaGF2aW9yYCB0byBpbXBsZW1lbnQgYW4gYW5pbWF0aW9uLgogICAgICogQHBvbHltZXJCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBOZW9uQW5pbWF0aW9uQmVoYXZpb3IgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgdGhlIGFuaW1hdGlvbiB0aW1pbmcuCiAgICAgICAgICovCiAgICAgICAgYW5pbWF0aW9uVGltaW5nOiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgZHVyYXRpb246IDUwMCwgZWFzaW5nOiAnY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKScsIGZpbGw6ICdib3RoJwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhhdCBlbGVtZW50cyBpbXBsZW1lbnQgdGhpcyBiZWhhdmlvci4KICAgICAgICovCiAgICAgIGlzTmVvbkFuaW1hdGlvbjogdHJ1ZSwKCiAgICAgIC8qKgogICAgICAgKiBEbyBhbnkgYW5pbWF0aW9uIGNvbmZpZ3VyYXRpb24gaGVyZS4KICAgICAgICovCiAgICAgIC8vIGNvbmZpZ3VyZTogZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgIC8vIH0sCgogICAgICBjcmVhdGVkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAoIWRvY3VtZW50LmJvZHkuYW5pbWF0ZSkgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAgICdObyB3ZWIgYW5pbWF0aW9ucyBkZXRlY3RlZC4gVGhpcyBlbGVtZW50IHdpbGwgbm90JyArCiAgICAgICAgICAgICAgJyBmdW5jdGlvbiB3aXRob3V0IGEgd2ViIGFuaW1hdGlvbnMgcG9seWZpbGwuJyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIGFuaW1hdGlvbiB0aW1pbmcgYnkgbWl4aW5nIGluIHByb3BlcnRpZXMgZnJvbSBgY29uZmlnYCB0byB0aGUKICAgICAgICogZGVmYXVsdHMgZGVmaW5lZCBieSB0aGUgYW5pbWF0aW9uLgogICAgICAgKi8KICAgICAgdGltaW5nRnJvbUNvbmZpZzogZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgaWYgKGNvbmZpZy50aW1pbmcpIHsKICAgICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIGNvbmZpZy50aW1pbmcpIHsKICAgICAgICAgICAgdGhpcy5hbmltYXRpb25UaW1pbmdbcHJvcGVydHldID0gY29uZmlnLnRpbWluZ1twcm9wZXJ0eV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvblRpbWluZzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGB0cmFuc2Zvcm1gIGFuZCBgdHJhbnNmb3JtT3JpZ2luYCBwcm9wZXJ0aWVzIGFsb25nIHdpdGggdGhlIHByZWZpeGVkCiAgICAgICAqIHZlcnNpb25zLgogICAgICAgKi8KICAgICAgc2V0UHJlZml4ZWRQcm9wZXJ0eTogZnVuY3Rpb24obm9kZSwgcHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgdmFyIG1hcCA9IHsKICAgICAgICAgICd0cmFuc2Zvcm0nOiBbJ3dlYmtpdFRyYW5zZm9ybSddLAogICAgICAgICAgJ3RyYW5zZm9ybU9yaWdpbic6IFsnbW96VHJhbnNmb3JtT3JpZ2luJywgJ3dlYmtpdFRyYW5zZm9ybU9yaWdpbiddCiAgICAgICAgfTsKICAgICAgICB2YXIgcHJlZml4ZXMgPSBtYXBbcHJvcGVydHldOwogICAgICAgIGZvciAodmFyIHByZWZpeCwgaW5kZXggPSAwOyBwcmVmaXggPSBwcmVmaXhlc1tpbmRleF07IGluZGV4KyspIHsKICAgICAgICAgIG5vZGUuc3R5bGVbcHJlZml4XSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICBub2RlLnN0eWxlW3Byb3BlcnR5XSA9IHZhbHVlOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBhbmltYXRpb24gZmluaXNoZXMuCiAgICAgICAqLwogICAgICBjb21wbGV0ZTogZnVuY3Rpb24oY29uZmlnKSB7fQoKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCiAgICAvKgogICAgYDxmYWRlLWluLWFuaW1hdGlvbj5gIGFuaW1hdGVzIHRoZSBvcGFjaXR5IG9mIGFuIGVsZW1lbnQgZnJvbSAwIHRvIDEuCgogICAgQ29uZmlndXJhdGlvbjoKICAgIGBgYAogICAgewogICAgICBuYW1lOiAnZmFkZS1pbi1hbmltYXRpb24nLAogICAgICBub2RlOiA8bm9kZT4KICAgICAgdGltaW5nOiA8YW5pbWF0aW9uLXRpbWluZz4KICAgIH0KICAgIGBgYAogICAgKi8KICAgIFBvbHltZXIoewoKICAgICAgaXM6ICdmYWRlLWluLWFuaW1hdGlvbicsCgogICAgICBiZWhhdmlvcnM6IFtOZW9uQW5pbWF0aW9uQmVoYXZpb3JdLAoKICAgICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy5ub2RlOwogICAgICAgIHRoaXMuX2VmZmVjdCA9IG5ldyBLZXlmcmFtZUVmZmVjdCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgW3snb3BhY2l0eSc6ICcwJ30sIHsnb3BhY2l0eSc6ICcxJ31dLAogICAgICAgICAgICB0aGlzLnRpbWluZ0Zyb21Db25maWcoY29uZmlnKSk7CiAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdDsKICAgICAgfQoKICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgLyoKICAgIGA8ZmFkZS1vdXQtYW5pbWF0aW9uPmAgYW5pbWF0ZXMgdGhlIG9wYWNpdHkgb2YgYW4gZWxlbWVudCBmcm9tIDEgdG8gMC4KCiAgICBDb25maWd1cmF0aW9uOgogICAgYGBgCiAgICB7CiAgICAgIG5hbWU6ICdmYWRlLW91dC1hbmltYXRpb24nLAogICAgICBub2RlOiA8bm9kZT4KICAgICAgdGltaW5nOiA8YW5pbWF0aW9uLXRpbWluZz4KICAgIH0KICAgIGBgYAogICAgKi8KICAgIFBvbHltZXIoewoKICAgICAgaXM6ICdmYWRlLW91dC1hbmltYXRpb24nLAoKICAgICAgYmVoYXZpb3JzOiBbTmVvbkFuaW1hdGlvbkJlaGF2aW9yXSwKCiAgICAgIGNvbmZpZ3VyZTogZnVuY3Rpb24oY29uZmlnKSB7CiAgICAgICAgdmFyIG5vZGUgPSBjb25maWcubm9kZTsKICAgICAgICB0aGlzLl9lZmZlY3QgPSBuZXcgS2V5ZnJhbWVFZmZlY3QoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICB7J29wYWNpdHknOiAnMSd9LAogICAgICAgICAgICAgIHsnb3BhY2l0eSc6ICcwJ30sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIHRoaXMudGltaW5nRnJvbUNvbmZpZyhjb25maWcpKTsKICAgICAgICByZXR1cm4gdGhpcy5fZWZmZWN0OwogICAgICB9CgogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgaXM6ICdwYXBlci1tZW51LWdyb3ctaGVpZ2h0LWFuaW1hdGlvbicsCgogICAgICBiZWhhdmlvcnM6IFtOZW9uQW5pbWF0aW9uQmVoYXZpb3JdLAoKICAgICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy5ub2RlOwogICAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2YXIgaGVpZ2h0ID0gcmVjdC5oZWlnaHQ7CgogICAgICAgIHRoaXMuX2VmZmVjdCA9IG5ldyBLZXlmcmFtZUVmZmVjdCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgW3toZWlnaHQ6IChoZWlnaHQgLyAyKSArICdweCd9LCB7aGVpZ2h0OiBoZWlnaHQgKyAncHgnfV0sCiAgICAgICAgICAgIHRoaXMudGltaW5nRnJvbUNvbmZpZyhjb25maWcpKTsKCiAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdDsKICAgICAgfQogICAgfSk7CgogICAgUG9seW1lcih7CiAgICAgIGlzOiAncGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbicsCgogICAgICBiZWhhdmlvcnM6IFtOZW9uQW5pbWF0aW9uQmVoYXZpb3JdLAoKICAgICAgY29uZmlndXJlOiBmdW5jdGlvbihjb25maWcpIHsKICAgICAgICB2YXIgbm9kZSA9IGNvbmZpZy5ub2RlOwogICAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2YXIgd2lkdGggPSByZWN0LndpZHRoOwoKICAgICAgICB0aGlzLl9lZmZlY3QgPSBuZXcgS2V5ZnJhbWVFZmZlY3QoCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIFt7d2lkdGg6ICh3aWR0aCAvIDIpICsgJ3B4J30sIHt3aWR0aDogd2lkdGggKyAncHgnfV0sCiAgICAgICAgICAgIHRoaXMudGltaW5nRnJvbUNvbmZpZyhjb25maWcpKTsKCiAgICAgICAgcmV0dXJuIHRoaXMuX2VmZmVjdDsKICAgICAgfQogICAgfSk7CgogICAgUG9seW1lcih7CiAgICAgIGlzOiAncGFwZXItbWVudS1zaHJpbmstd2lkdGgtYW5pbWF0aW9uJywKCiAgICAgIGJlaGF2aW9yczogW05lb25BbmltYXRpb25CZWhhdmlvcl0sCgogICAgICBjb25maWd1cmU6IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICAgIHZhciBub2RlID0gY29uZmlnLm5vZGU7CiAgICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciB3aWR0aCA9IHJlY3Qud2lkdGg7CgogICAgICAgIHRoaXMuX2VmZmVjdCA9IG5ldyBLZXlmcmFtZUVmZmVjdCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgW3t3aWR0aDogd2lkdGggKyAncHgnfSwge3dpZHRoOiB3aWR0aCAtICh3aWR0aCAvIDIwKSArICdweCd9XSwKICAgICAgICAgICAgdGhpcy50aW1pbmdGcm9tQ29uZmlnKGNvbmZpZykpOwoKICAgICAgICByZXR1cm4gdGhpcy5fZWZmZWN0OwogICAgICB9CiAgICB9KTsKCiAgICBQb2x5bWVyKHsKICAgICAgaXM6ICdwYXBlci1tZW51LXNocmluay1oZWlnaHQtYW5pbWF0aW9uJywKCiAgICAgIGJlaGF2aW9yczogW05lb25BbmltYXRpb25CZWhhdmlvcl0sCgogICAgICBjb25maWd1cmU6IGZ1bmN0aW9uKGNvbmZpZykgewogICAgICAgIHZhciBub2RlID0gY29uZmlnLm5vZGU7CiAgICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciBoZWlnaHQgPSByZWN0LmhlaWdodDsKCiAgICAgICAgdGhpcy5zZXRQcmVmaXhlZFByb3BlcnR5KG5vZGUsICd0cmFuc2Zvcm1PcmlnaW4nLCAnMCAwJyk7CgogICAgICAgIHRoaXMuX2VmZmVjdCA9IG5ldyBLZXlmcmFtZUVmZmVjdCgKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgWwogICAgICAgICAgICAgIHtoZWlnaHQ6IGhlaWdodCArICdweCcsIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknfSwKICAgICAgICAgICAgICB7aGVpZ2h0OiBoZWlnaHQgLyAyICsgJ3B4JywgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMjBweCknfQogICAgICAgICAgICBdLAogICAgICAgICAgICB0aGlzLnRpbWluZ0Zyb21Db25maWcoY29uZmlnKSk7CgogICAgICAgIHJldHVybiB0aGlzLl9lZmZlY3Q7CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIHZhciBjb25maWcgPSB7CiAgICAgIEFOSU1BVElPTl9DVUJJQ19CRVpJRVI6ICdjdWJpYy1iZXppZXIoLjMsLjk1LC41LDEpJywKICAgICAgTUFYX0FOSU1BVElPTl9USU1FX01TOiA0MDAKICAgIH07CgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246IFtEcm9wZG93bgogICAgYnV0dG9uc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL2J1dHRvbnMuaHRtbCNidXR0b25zLWRyb3Bkb3duLWJ1dHRvbnMpCgogICAgYHBhcGVyLW1lbnUtYnV0dG9uYCBhbGxvd3Mgb25lIHRvIGNvbXBvc2UgYSBkZXNpZ25hdGVkICJ0cmlnZ2VyIiBlbGVtZW50IHdpdGgKICAgIGFub3RoZXIgZWxlbWVudCB0aGF0IHJlcHJlc2VudHMgImNvbnRlbnQiLCB0byBjcmVhdGUgYSBkcm9wZG93biBtZW51IHRoYXQKICAgIGRpc3BsYXlzIHRoZSAiY29udGVudCIgd2hlbiB0aGUgInRyaWdnZXIiIGlzIGNsaWNrZWQuCgogICAgVGhlIGNoaWxkIGVsZW1lbnQgYXNzaWduZWQgdG8gdGhlIGBkcm9wZG93bi10cmlnZ2VyYCBzbG90IHdpbGwgYmUgdXNlZCBhcyB0aGUKICAgICJ0cmlnZ2VyIiBlbGVtZW50LiBUaGUgY2hpbGQgZWxlbWVudCBhc3NpZ25lZCB0byB0aGUgYGRyb3Bkb3duLWNvbnRlbnRgIHNsb3QKICAgIHdpbGwgYmUgdXNlZCBhcyB0aGUgImNvbnRlbnQiIGVsZW1lbnQuCgogICAgVGhlIGBwYXBlci1tZW51LWJ1dHRvbmAgaXMgc2Vuc2l0aXZlIHRvIGl0cyBjb250ZW50J3MgYGlyb24tc2VsZWN0YCBldmVudHMuIElmCiAgICB0aGUgImNvbnRlbnQiIGVsZW1lbnQgdHJpZ2dlcnMgYW4gYGlyb24tc2VsZWN0YCBldmVudCwgdGhlIGBwYXBlci1tZW51LWJ1dHRvbmAKICAgIHdpbGwgY2xvc2UgYXV0b21hdGljYWxseS4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItbWVudS1idXR0b24+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ibWVudSIKICAgIHNsb3Q9ImRyb3Bkb3duLXRyaWdnZXIiPjwvcGFwZXItaWNvbi1idXR0b24+IDxwYXBlci1saXN0Ym94CiAgICBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4gPHBhcGVyLWl0ZW0+U2hhcmU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPlNldHRpbmdzPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbT5IZWxwPC9wYXBlci1pdGVtPgogICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgIDwvcGFwZXItbWVudS1idXR0b24+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGFsc28gYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duLWJhY2tncm91bmRgIHwgQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgcGFwZXItbWVudS1idXR0b24gZHJvcGRvd24gfCBgLS1wcmltYXJ5LWJhY2tncm91bmQtY29sb3JgCiAgICBgLS1wYXBlci1tZW51LWJ1dHRvbmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBwYXBlci1tZW51LWJ1dHRvbiB8IGB7fWAKICAgIGAtLXBhcGVyLW1lbnUtYnV0dG9uLWRpc2FibGVkYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHBhcGVyLW1lbnUtYnV0dG9uIHdoZW4gZGlzYWJsZWQgfCBge31gCiAgICBgLS1wYXBlci1tZW51LWJ1dHRvbi1kcm9wZG93bmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBwYXBlci1tZW51LWJ1dHRvbiBkcm9wZG93biB8IGB7fWAKICAgIGAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnRgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgcGFwZXItbWVudS1idXR0b24gY29udGVudCB8IGB7fWAKCiAgICBAaGVybyBoZXJvLnN2ZwogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgY29uc3QgUGFwZXJNZW51QnV0dG9uID0gUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgcGFkZGluZzogOHB4OwogICAgICAgIG91dGxpbmU6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgY3Vyc29yOiBhdXRvOwogICAgICAgIGNvbG9yOiB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWVudS1idXR0b24tZGlzYWJsZWQ7CiAgICAgIH0KCiAgICAgIGlyb24tZHJvcGRvd24gewogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWRyb3Bkb3duOwogICAgICB9CgogICAgICAuZHJvcGRvd24tY29udGVudCB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi0yZHA7CgogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItbWVudS1idXR0b24tZHJvcGRvd24tYmFja2dyb3VuZCwgdmFyKC0tcHJpbWFyeS1iYWNrZ3JvdW5kLWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLW1lbnUtYnV0dG9uLWNvbnRlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFt2ZXJ0aWNhbC1hbGlnbj0idG9wIl0pIC5kcm9wZG93bi1jb250ZW50IHsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyMHB4OwogICAgICAgIG1hcmdpbi10b3A6IC0xMHB4OwogICAgICAgIHRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoW3ZlcnRpY2FsLWFsaWduPSJib3R0b20iXSkgLmRyb3Bkb3duLWNvbnRlbnQgewogICAgICAgIGJvdHRvbTogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAtMTBweDsKICAgICAgICBtYXJnaW4tdG9wOiAyMHB4OwogICAgICB9CgogICAgICAjdHJpZ2dlciB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgaWQ9InRyaWdnZXIiIG9uLXRhcD0idG9nZ2xlIj4KICAgICAgPHNsb3QgbmFtZT0iZHJvcGRvd24tdHJpZ2dlciI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGlyb24tZHJvcGRvd24gaWQ9ImRyb3Bkb3duIiBvcGVuZWQ9Int7b3BlbmVkfX0iIGhvcml6b250YWwtYWxpZ249IltbaG9yaXpvbnRhbEFsaWduXV0iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgaG9yaXpvbnRhbC1vZmZzZXQ9IltbaG9yaXpvbnRhbE9mZnNldF1dIiB2ZXJ0aWNhbC1vZmZzZXQ9IltbdmVydGljYWxPZmZzZXRdXSIgbm8tb3ZlcmxhcD0iW1tub092ZXJsYXBdXSIgb3Blbi1hbmltYXRpb24tY29uZmlnPSJbW29wZW5BbmltYXRpb25Db25maWddXSIgY2xvc2UtYW5pbWF0aW9uLWNvbmZpZz0iW1tjbG9zZUFuaW1hdGlvbkNvbmZpZ11dIiBuby1hbmltYXRpb25zPSJbW25vQW5pbWF0aW9uc11dIiBmb2N1cy10YXJnZXQ9IltbX2Ryb3Bkb3duQ29udGVudF1dIiBhbGxvdy1vdXRzaWRlLXNjcm9sbD0iW1thbGxvd091dHNpZGVTY3JvbGxdXSIgcmVzdG9yZS1mb2N1cy1vbi1jbG9zZT0iW1tyZXN0b3JlRm9jdXNPbkNsb3NlXV0iIG9uLWlyb24tb3ZlcmxheS1jYW5jZWxlZD0iX19vbklyb25PdmVybGF5Q2FuY2VsZWQiPgogICAgICA8ZGl2IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiIGNsYXNzPSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICA8c2xvdCBpZD0iY29udGVudCIgbmFtZT0iZHJvcGRvd24tY29udGVudCI+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvaXJvbi1kcm9wZG93bj4KYCwKCiAgICAgIGlzOiAncGFwZXItbWVudS1idXR0b24nLAoKICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gdGhlIGRyb3Bkb3duIG9wZW5zLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgcGFwZXItZHJvcGRvd24tb3BlbgogICAgICAgKi8KCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuIHRoZSBkcm9wZG93biBjbG9zZXMuCiAgICAgICAqCiAgICAgICAqIEBldmVudCBwYXBlci1kcm9wZG93bi1jbG9zZQogICAgICAgKi8KCiAgICAgIGJlaGF2aW9yczogW0lyb25BMTF5S2V5c0JlaGF2aW9yLCBJcm9uQ29udHJvbFN0YXRlXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBjb250ZW50IGlzIGN1cnJlbnRseSBkaXNwbGF5ZWQuCiAgICAgICAgICovCiAgICAgICAgb3BlbmVkOgogICAgICAgICAgICB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlLCBub3RpZnk6IHRydWUsIG9ic2VydmVyOiAnX29wZW5lZENoYW5nZWQnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG9yaWVudGF0aW9uIGFnYWluc3Qgd2hpY2ggdG8gYWxpZ24gdGhlIG1lbnUgZHJvcGRvd24KICAgICAgICAgKiBob3Jpem9udGFsbHkgcmVsYXRpdmUgdG8gdGhlIGRyb3Bkb3duIHRyaWdnZXIuCiAgICAgICAgICovCiAgICAgICAgaG9yaXpvbnRhbEFsaWduOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ2xlZnQnLCByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3JpZW50YXRpb24gYWdhaW5zdCB3aGljaCB0byBhbGlnbiB0aGUgbWVudSBkcm9wZG93bgogICAgICAgICAqIHZlcnRpY2FsbHkgcmVsYXRpdmUgdG8gdGhlIGRyb3Bkb3duIHRyaWdnZXIuCiAgICAgICAgICovCiAgICAgICAgdmVydGljYWxBbGlnbjoge3R5cGU6IFN0cmluZywgdmFsdWU6ICd0b3AnLCByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgYGhvcml6b250YWxBbGlnbmAgYW5kIGB2ZXJ0aWNhbEFsaWduYCBwcm9wZXJ0aWVzIHdpbGwKICAgICAgICAgKiBiZSBjb25zaWRlcmVkIHByZWZlcmVuY2VzIGluc3RlYWQgb2Ygc3RyaWN0IHJlcXVpcmVtZW50cyB3aGVuCiAgICAgICAgICogcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duIGFuZCBtYXkgYmUgY2hhbmdlZCBpZiBkb2luZyBzbyByZWR1Y2VzCiAgICAgICAgICogdGhlIGFyZWEgb2YgdGhlIGRyb3Bkb3duIGZhbGxpbmcgb3V0c2lkZSBvZiBgZml0SW50b2AuCiAgICAgICAgICovCiAgICAgICAgZHluYW1pY0FsaWduOiB7dHlwZTogQm9vbGVhbn0sCgogICAgICAgIC8qKgogICAgICAgICAqIEEgcGl4ZWwgdmFsdWUgdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwb3NpdGlvbiBjYWxjdWxhdGVkIGZvciB0aGUKICAgICAgICAgKiBnaXZlbiBgaG9yaXpvbnRhbEFsaWduYC4gVXNlIGEgbmVnYXRpdmUgdmFsdWUgdG8gb2Zmc2V0IHRvIHRoZQogICAgICAgICAqIGxlZnQsIG9yIGEgcG9zaXRpdmUgdmFsdWUgdG8gb2Zmc2V0IHRvIHRoZSByaWdodC4KICAgICAgICAgKi8KICAgICAgICBob3Jpem9udGFsT2Zmc2V0OiB7dHlwZTogTnVtYmVyLCB2YWx1ZTogMCwgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQSBwaXhlbCB2YWx1ZSB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIHBvc2l0aW9uIGNhbGN1bGF0ZWQgZm9yIHRoZQogICAgICAgICAqIGdpdmVuIGB2ZXJ0aWNhbEFsaWduYC4gVXNlIGEgbmVnYXRpdmUgdmFsdWUgdG8gb2Zmc2V0IHRvd2FyZHMgdGhlCiAgICAgICAgICogdG9wLCBvciBhIHBvc2l0aXZlIHZhbHVlIHRvIG9mZnNldCB0b3dhcmRzIHRoZSBib3R0b20uCiAgICAgICAgICovCiAgICAgICAgdmVydGljYWxPZmZzZXQ6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAwLCBub3RpZnk6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgZHJvcGRvd24gd2lsbCBiZSBwb3NpdGlvbmVkIHNvIHRoYXQgaXQgZG9lc24ndCBvdmVybGFwCiAgICAgICAgICogdGhlIGJ1dHRvbi4KICAgICAgICAgKi8KICAgICAgICBub092ZXJsYXA6IHt0eXBlOiBCb29sZWFufSwKCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRvIHRydWUgdG8gZGlzYWJsZSBhbmltYXRpb25zIHdoZW4gb3BlbmluZyBhbmQgY2xvc2luZyB0aGUKICAgICAgICAgKiBkcm9wZG93bi4KICAgICAgICAgKi8KICAgICAgICBub0FuaW1hdGlvbnM6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGF1dG9tYXRpY2FsbHkgY2xvc2luZyB0aGUgZHJvcGRvd24gYWZ0ZXIKICAgICAgICAgKiBhIHNlbGVjdGlvbiBoYXMgYmVlbiBtYWRlLgogICAgICAgICAqLwogICAgICAgIGlnbm9yZVNlbGVjdDoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGVuYWJsZSBhdXRvbWF0aWNhbGx5IGNsb3NpbmcgdGhlIGRyb3Bkb3duIGFmdGVyIGFuCiAgICAgICAgICogaXRlbSBoYXMgYmVlbiBhY3RpdmF0ZWQsIGV2ZW4gaWYgdGhlIHNlbGVjdGlvbiBkaWQgbm90IGNoYW5nZS4KICAgICAgICAgKi8KICAgICAgICBjbG9zZU9uQWN0aXZhdGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBBbiBhbmltYXRpb24gY29uZmlnLiBJZiBwcm92aWRlZCwgdGhpcyB3aWxsIGJlIHVzZWQgdG8gYW5pbWF0ZSB0aGUKICAgICAgICAgKiBvcGVuaW5nIG9mIHRoZSBkcm9wZG93bi4KICAgICAgICAgKi8KICAgICAgICBvcGVuQW5pbWF0aW9uQ29uZmlnOiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAge25hbWU6ICdmYWRlLWluLWFuaW1hdGlvbicsIHRpbWluZzoge2RlbGF5OiAxMDAsIGR1cmF0aW9uOiAyMDB9fSwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuYW1lOiAncGFwZXItbWVudS1ncm93LXdpZHRoLWFuaW1hdGlvbicsCiAgICAgICAgICAgICAgICB0aW1pbmc6IHsKICAgICAgICAgICAgICAgICAgZGVsYXk6IDEwMCwKICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDE1MCwKICAgICAgICAgICAgICAgICAgZWFzaW5nOiBjb25maWcuQU5JTUFUSU9OX0NVQklDX0JFWklFUgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogJ3BhcGVyLW1lbnUtZ3Jvdy1oZWlnaHQtYW5pbWF0aW9uJywKICAgICAgICAgICAgICAgIHRpbWluZzogewogICAgICAgICAgICAgICAgICBkZWxheTogMTAwLAogICAgICAgICAgICAgICAgICBkdXJhdGlvbjogMjc1LAogICAgICAgICAgICAgICAgICBlYXNpbmc6IGNvbmZpZy5BTklNQVRJT05fQ1VCSUNfQkVaSUVSCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBdOwogICAgICAgICAgfQogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIEFuIGFuaW1hdGlvbiBjb25maWcuIElmIHByb3ZpZGVkLCB0aGlzIHdpbGwgYmUgdXNlZCB0byBhbmltYXRlIHRoZQogICAgICAgICAqIGNsb3Npbmcgb2YgdGhlIGRyb3Bkb3duLgogICAgICAgICAqLwogICAgICAgIGNsb3NlQW5pbWF0aW9uQ29uZmlnOiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAge25hbWU6ICdmYWRlLW91dC1hbmltYXRpb24nLCB0aW1pbmc6IHtkdXJhdGlvbjogMTUwfX0sCiAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgbmFtZTogJ3BhcGVyLW1lbnUtc2hyaW5rLXdpZHRoLWFuaW1hdGlvbicsCiAgICAgICAgICAgICAgICB0aW1pbmc6IHsKICAgICAgICAgICAgICAgICAgZGVsYXk6IDEwMCwKICAgICAgICAgICAgICAgICAgZHVyYXRpb246IDUwLAogICAgICAgICAgICAgICAgICBlYXNpbmc6IGNvbmZpZy5BTklNQVRJT05fQ1VCSUNfQkVaSUVSCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBuYW1lOiAncGFwZXItbWVudS1zaHJpbmstaGVpZ2h0LWFuaW1hdGlvbicsCiAgICAgICAgICAgICAgICB0aW1pbmc6IHtkdXJhdGlvbjogMjAwLCBlYXNpbmc6ICdlYXNlLWluJ30KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIF07CiAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQnkgZGVmYXVsdCwgdGhlIGRyb3Bkb3duIHdpbGwgY29uc3RyYWluIHNjcm9sbGluZyBvbiB0aGUgcGFnZQogICAgICAgICAqIHRvIGl0c2VsZiB3aGVuIG9wZW5lZC4KICAgICAgICAgKiBTZXQgdG8gdHJ1ZSBpbiBvcmRlciB0byBwcmV2ZW50IHNjcm9sbCBmcm9tIGJlaW5nIGNvbnN0cmFpbmVkCiAgICAgICAgICogdG8gdGhlIGRyb3Bkb3duIHdoZW4gaXQgb3BlbnMuCiAgICAgICAgICovCiAgICAgICAgYWxsb3dPdXRzaWRlU2Nyb2xsOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBmb2N1cyBzaG91bGQgYmUgcmVzdG9yZWQgdG8gdGhlIGJ1dHRvbiB3aGVuIHRoZSBtZW51IGNsb3Nlcy4KICAgICAgICAgKi8KICAgICAgICByZXN0b3JlRm9jdXNPbkNsb3NlOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBlbGVtZW50IGludGVuZGVkIHRvIGJlIGJvdW5kIGFzIHRoZSBmb2N1cyB0YXJnZXQKICAgICAgICAgKiBmb3IgdGhlIGBpcm9uLWRyb3Bkb3duYCBjb250YWluZWQgYnkgYHBhcGVyLW1lbnUtYnV0dG9uYC4KICAgICAgICAgKi8KICAgICAgICBfZHJvcGRvd25Db250ZW50OiB7dHlwZTogT2JqZWN0fQogICAgICB9LAoKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHtyb2xlOiAnZ3JvdXAnLCAnYXJpYS1oYXNwb3B1cCc6ICd0cnVlJ30sCgogICAgICBsaXN0ZW5lcnM6CiAgICAgICAgICB7J2lyb24tYWN0aXZhdGUnOiAnX29uSXJvbkFjdGl2YXRlJywgJ2lyb24tc2VsZWN0JzogJ19vbklyb25TZWxlY3QnfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgY29udGVudCBlbGVtZW50IHRoYXQgaXMgY29udGFpbmVkIGJ5IHRoZSBtZW51IGJ1dHRvbiwgaWYgYW55LgogICAgICAgKi8KICAgICAgZ2V0IGNvbnRlbnRFbGVtZW50KCkgewogICAgICAgIC8vIFBvbHltZXIgMi54IHJldHVybnMgc2xvdC5hc3NpZ25lZE5vZGVzIHdoaWNoIGNhbiBjb250YWluIHRleHQgbm9kZXMuCiAgICAgICAgdmFyIG5vZGVzID0gZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIGlmIChub2Rlc1tpXS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUb2dnbGVzIHRoZSBkcm9wZG93biBjb250ZW50IGJldHdlZW4gb3BlbmVkIGFuZCBjbG9zZWQuCiAgICAgICAqLwogICAgICB0b2dnbGU6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm9wZW5lZCkgewogICAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLm9wZW4oKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogTWFrZSB0aGUgZHJvcGRvd24gY29udGVudCBhcHBlYXIgYXMgYW4gb3ZlcmxheSBwb3NpdGlvbmVkIHJlbGF0aXZlCiAgICAgICAqIHRvIHRoZSBkcm9wZG93biB0cmlnZ2VyLgogICAgICAgKi8KICAgICAgb3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRoaXMuJC5kcm9wZG93bi5vcGVuKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSGlkZSB0aGUgZHJvcGRvd24gY29udGVudC4KICAgICAgICovCiAgICAgIGNsb3NlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLiQuZHJvcGRvd24uY2xvc2UoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBXaGVuIGFuIGBpcm9uLXNlbGVjdGAgZXZlbnQgaXMgcmVjZWl2ZWQsIHRoZSBkcm9wZG93biBzaG91bGQKICAgICAgICogYXV0b21hdGljYWxseSBjbG9zZSBvbiB0aGUgYXNzdW1wdGlvbiB0aGF0IGEgdmFsdWUgaGFzIGJlZW4gY2hvc2VuLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBBIEN1c3RvbUV2ZW50IGluc3RhbmNlIHdpdGggdHlwZQogICAgICAgKiBzZXQgdG8gYCJpcm9uLXNlbGVjdCJgLgogICAgICAgKi8KICAgICAgX29uSXJvblNlbGVjdDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoIXRoaXMuaWdub3JlU2VsZWN0KSB7CiAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENsb3NlcyB0aGUgZHJvcGRvd24gd2hlbiBhbiBgaXJvbi1hY3RpdmF0ZWAgZXZlbnQgaXMgcmVjZWl2ZWQgaWYKICAgICAgICogYGNsb3NlT25BY3RpdmF0ZWAgaXMgdHJ1ZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgQSBDdXN0b21FdmVudCBvZiB0eXBlICdpcm9uLWFjdGl2YXRlJy4KICAgICAgICovCiAgICAgIF9vbklyb25BY3RpdmF0ZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5jbG9zZU9uQWN0aXZhdGUpIHsKICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogV2hlbiB0aGUgZHJvcGRvd24gb3BlbnMsIHRoZSBgcGFwZXItbWVudS1idXR0b25gIGZpcmVzIGBwYXBlci1vcGVuYC4KICAgICAgICogV2hlbiB0aGUgZHJvcGRvd24gY2xvc2VzLCB0aGUgYHBhcGVyLW1lbnUtYnV0dG9uYCBmaXJlcyBgcGFwZXItY2xvc2VgLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IG9wZW5lZCBUcnVlIGlmIHRoZSBkcm9wZG93biBpcyBvcGVuZWQsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgICogQHBhcmFtIHtib29sZWFufSBvbGRPcGVuZWQgVGhlIHByZXZpb3VzIHZhbHVlIG9mIGBvcGVuZWRgLgogICAgICAgKi8KICAgICAgX29wZW5lZENoYW5nZWQ6IGZ1bmN0aW9uKG9wZW5lZCwgb2xkT3BlbmVkKSB7CiAgICAgICAgaWYgKG9wZW5lZCkgewogICAgICAgICAgLy8gVE9ETyhjZGF0YSk6IFVwZGF0ZSB0aGlzIHdoZW4gd2UgY2FuIG1lYXN1cmUgY2hhbmdlcyBpbiBkaXN0cmlidXRlZAogICAgICAgICAgLy8gY2hpbGRyZW4gaW4gYW4gaWRpb21hdGljIHdheS4KICAgICAgICAgIC8vIFdlIHBva2UgdGhpcyBwcm9wZXJ0eSBpbiBjYXNlIHRoZSBlbGVtZW50IGhhcyBjaGFuZ2VkLiBUaGlzIHdpbGwKICAgICAgICAgIC8vIGNhdXNlIHRoZSBmb2N1cyB0YXJnZXQgZm9yIHRoZSBgaXJvbi1kcm9wZG93bmAgdG8gYmUgdXBkYXRlZCBhcwogICAgICAgICAgLy8gbmVjZXNzYXJ5OgogICAgICAgICAgdGhpcy5fZHJvcGRvd25Db250ZW50ID0gdGhpcy5jb250ZW50RWxlbWVudDsKICAgICAgICAgIHRoaXMuZmlyZSgncGFwZXItZHJvcGRvd24tb3BlbicpOwogICAgICAgIH0gZWxzZSBpZiAob2xkT3BlbmVkICE9IG51bGwpIHsKICAgICAgICAgIHRoaXMuZmlyZSgncGFwZXItZHJvcGRvd24tY2xvc2UnKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSWYgdGhlIGRyb3Bkb3duIGlzIG9wZW4gd2hlbiBkaXNhYmxlZCBiZWNvbWVzIHRydWUsIGNsb3NlIHRoZQogICAgICAgKiBkcm9wZG93bi4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtib29sZWFufSBkaXNhYmxlZCBUcnVlIGlmIGRpc2FibGVkLCBvdGhlcndpc2UgZmFsc2UuCiAgICAgICAqLwogICAgICBfZGlzYWJsZWRDaGFuZ2VkOiBmdW5jdGlvbihkaXNhYmxlZCkgewogICAgICAgIElyb25Db250cm9sU3RhdGUuX2Rpc2FibGVkQ2hhbmdlZC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmIChkaXNhYmxlZCAmJiB0aGlzLm9wZW5lZCkgewogICAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9fb25Jcm9uT3ZlcmxheUNhbmNlbGVkOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciB1aUV2ZW50ID0gZXZlbnQuZGV0YWlsOwogICAgICAgIHZhciB0cmlnZ2VyID0gdGhpcy4kLnRyaWdnZXI7CiAgICAgICAgdmFyIHBhdGggPSBkb20odWlFdmVudCkucGF0aDsKCiAgICAgICAgaWYgKHBhdGguaW5kZXhPZih0cmlnZ2VyKSA+IC0xKSB7CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfQogICAgfSk7CgogICAgT2JqZWN0LmtleXMoY29uZmlnKS5mb3JFYWNoKGZ1bmN0aW9uKGtleSkgewogICAgICBQYXBlck1lbnVCdXR0b25ba2V5XSA9IGNvbmZpZ1trZXldOwogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCiAgICBjb25zdCAkX2RvY3VtZW50Q29udGFpbmVyJDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpOwogICAgJF9kb2N1bWVudENvbnRhaW5lciQxLnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKCiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDEuaW5uZXJIVE1MID0KICAgICAgICBgPGlyb24taWNvbnNldC1zdmcgbmFtZT0icGFwZXItZHJvcGRvd24tbWVudSIgc2l6ZT0iMjQiPgo8c3ZnPjxkZWZzPgo8ZyBpZD0iYXJyb3ctZHJvcC1kb3duIj48cGF0aCBkPSJNNyAxMGw1IDUgNS01eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+YDsKCiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCRfZG9jdW1lbnRDb250YWluZXIkMS5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTYgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KICAgIGNvbnN0ICRfZG9jdW1lbnRDb250YWluZXIkMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDIuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpOwoKICAgICRfZG9jdW1lbnRDb250YWluZXIkMi5pbm5lckhUTUwgPQogICAgICAgIGA8ZG9tLW1vZHVsZSBpZD0icGFwZXItZHJvcGRvd24tbWVudS1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CgogICAgICAgIC8qIE5PVEUoY2RhdGEpOiBCb3RoIHZhbHVlcyBhcmUgbmVlZGVkLCBzaW5jZSBzb21lIHBob25lcyByZXF1aXJlIHRoZQogICAgICAgICAqIHZhbHVlIHRvIGJlIFxgdHJhbnNwYXJlbnRcYC4KICAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwwLDAsMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIH07CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnU7CiAgICAgIH0KCiAgICAgIC8qIHBhcGVyLWRyb3Bkb3duLW1lbnUgYW5kIHBhcGVyLWRyb3Bkb3duLW1lbnUtbGlnaHQgYm90aCBkZWxlZ2F0ZSBmb2N1cwogICAgICAgKiB0byBvdGhlciBpbnRlcm5hbCBlbGVtZW50cyB3aGljaCBtYW5hZ2UgZm9jdXMgc3R5bGluZy4gKi8KICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoOmRpcihydGwpKSB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CgogICAgICAgIEBhcHBseSgtLXBhcGVyLWRyb3Bkb3duLW1lbnUpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW25vaW5rXSkgcGFwZXItcmlwcGxlIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbbm8tbGFiZWwtZmxvYXRdKSBwYXBlci1yaXBwbGUgewogICAgICAgIHRvcDogOHB4OwogICAgICB9CgogICAgICBwYXBlci1yaXBwbGUgewogICAgICAgIHRvcDogMTJweDsKICAgICAgICBsZWZ0OiAwcHg7CiAgICAgICAgYm90dG9tOiA4cHg7CiAgICAgICAgcmlnaHQ6IDBweDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItZHJvcGRvd24tbWVudS1yaXBwbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLW1lbnUtYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWJ1dHRvbjsKICAgICAgfQoKICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaW5wdXQ7CiAgICAgIH0KCiAgICAgIGlyb24taWNvbiB7CiAgICAgICAgY29sb3I6IHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1kcm9wZG93bi1tZW51LWljb247CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkX2RvY3VtZW50Q29udGFpbmVyJDIuY29udGVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLy8gTGVnYWN5RWxlbWVudE1peGluIGRlZHVwZXMgYW5kIHRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGVsZW1lbnRzIGNyZWF0ZWQKICAgIC8vIHdpdGggdGhlIGBQb2x5bWVyYCBmdW5jdGlvbiwgc28gdGhpcyBpcyBvbmx5IGEgY2FjaGUgbG9va3VwLgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXIvcG9seW1lci9ibG9iLzY0MGJjODBhYzcxNzdiNzYxZDQ2YjJmYTljNDU1YzMxOGYyYjg1YzYvbGliL2xlZ2FjeS9jbGFzcy5qcyNMNTMzLUw1MzQKICAgIGNvbnN0IExlZ2FjeVBvbHltZXJFbGVtZW50QmFzZSA9IExlZ2FjeUVsZW1lbnRNaXhpbihIVE1MRWxlbWVudCk7CgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246IFtEcm9wZG93bgogICAgbWVudXNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9idXR0b25zLmh0bWwjYnV0dG9ucy1kcm9wZG93bi1idXR0b25zKQoKICAgIGBwYXBlci1kcm9wZG93bi1tZW51YCBpcyBzaW1pbGFyIHRvIGEgbmF0aXZlIGJyb3dzZXIgc2VsZWN0IGVsZW1lbnQuCiAgICBgcGFwZXItZHJvcGRvd24tbWVudWAgd29ya3Mgd2l0aCBzZWxlY3RhYmxlIGNvbnRlbnQuIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQKICAgIGl0ZW0gaXMgZGlzcGxheWVkIGluIHRoZSBjb250cm9sLiBJZiBubyBpdGVtIGlzIHNlbGVjdGVkLCB0aGUgYGxhYmVsYCBpcwogICAgZGlzcGxheWVkIGluc3RlYWQuCgogICAgRXhhbXBsZToKCiAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUgbGFiZWw9IllvdXIgZmF2b3VyaXRlIHBhc3RyeSI+CiAgICAgICAgICA8cGFwZXItbGlzdGJveCBzbG90PSJkcm9wZG93bi1jb250ZW50Ij4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+Q3JvaXNzYW50PC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbT5Eb251dDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPHBhcGVyLWl0ZW0+RmluYW5jaWVyPC9wYXBlci1pdGVtPgogICAgICAgICAgICA8cGFwZXItaXRlbT5NYWRlbGVpbmU8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgIFRoaXMgZXhhbXBsZSByZW5kZXJzIGEgZHJvcGRvd24gbWVudSB3aXRoIDQgb3B0aW9ucy4KCiAgICBUaGUgY2hpbGQgZWxlbWVudCB3aXRoIHRoZSBzbG90IGBkcm9wZG93bi1jb250ZW50YCBpcyB1c2VkIGFzIHRoZSBkcm9wZG93bgogICAgbWVudS4gVGhpcyBjYW4gYmUgYSBbYHBhcGVyLWxpc3Rib3hgXShwYXBlci1saXN0Ym94KSwgb3IgYW55IG90aGVyIG9yCiAgICBlbGVtZW50IHRoYXQgYWN0cyBsaWtlIGFuIFtgaXJvbi1zZWxlY3RvcmBdKGlyb24tc2VsZWN0b3IpLgoKICAgIFNwZWNpZmljYWxseSwgdGhlIG1lbnUgY2hpbGQgbXVzdCBmaXJlIGFuCiAgICBbYGlyb24tc2VsZWN0YF0oaXJvbi1zZWxlY3RvciNldmVudC1pcm9uLXNlbGVjdCkgZXZlbnQgd2hlbiBvbmUgb2YgaXRzCiAgICBjaGlsZHJlbiBpcyBzZWxlY3RlZCwgYW5kIGFuCiAgICBbYGlyb24tZGVzZWxlY3RgXShpcm9uLXNlbGVjdG9yI2V2ZW50LWlyb24tZGVzZWxlY3QpIGV2ZW50IHdoZW4gYSBjaGlsZCBpcwogICAgZGVzZWxlY3RlZC4gVGhlIHNlbGVjdGVkIG9yIGRlc2VsZWN0ZWQgaXRlbSBtdXN0IGJlIHBhc3NlZCBhcyB0aGUgZXZlbnQncwogICAgYGRldGFpbC5pdGVtYCBwcm9wZXJ0eS4KCiAgICBBcHBsaWNhdGlvbnMgY2FuIGxpc3RlbiBmb3IgdGhlIGBpcm9uLXNlbGVjdGAgYW5kIGBpcm9uLWRlc2VsZWN0YCBldmVudHMKICAgIHRvIHJlYWN0IHdoZW4gb3B0aW9ucyBhcmUgc2VsZWN0ZWQgYW5kIGRlc2VsZWN0ZWQuCgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGFsc28gYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLWRyb3Bkb3duLW1lbnVgIHwgQSBtaXhpbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgaG9zdCB8IGB7fWAKICAgIGAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtZGlzYWJsZWRgIHwgQSBtaXhpbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgaG9zdCB3aGVuIGRpc2FibGVkIHwgYHt9YAogICAgYC0tcGFwZXItZHJvcGRvd24tbWVudS1yaXBwbGVgIHwgQSBtaXhpbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGludGVybmFsIHJpcHBsZSB8IGB7fWAKICAgIGAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtYnV0dG9uYCB8IEEgbWl4aW4gdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSBpbnRlcm5hbCBtZW51IGJ1dHRvbiB8IGB7fWAKICAgIGAtLXBhcGVyLWRyb3Bkb3duLW1lbnUtaW5wdXRgIHwgQSBtaXhpbiB0aGF0IGlzIGFwcGxpZWQgdG8gdGhlIGludGVybmFsIHBhcGVyIGlucHV0IHwgYHt9YAogICAgYC0tcGFwZXItZHJvcGRvd24tbWVudS1pY29uYCB8IEEgbWl4aW4gdGhhdCBpcyBhcHBsaWVkIHRvIHRoZSBpbnRlcm5hbCBpY29uIHwgYHt9YAoKICAgIFlvdSBjYW4gYWxzbyB1c2UgYW55IG9mIHRoZSBgcGFwZXItaW5wdXQtY29udGFpbmVyYCBhbmQgYHBhcGVyLW1lbnUtYnV0dG9uYAogICAgc3R5bGUgbWl4aW5zIGFuZCBjdXN0b20gcHJvcGVydGllcyB0byBzdHlsZSB0aGUgaW50ZXJuYWwgaW5wdXQgYW5kIG1lbnUgYnV0dG9uCiAgICByZXNwZWN0aXZlbHkuCgogICAgQGVsZW1lbnQgcGFwZXItZHJvcGRvd24tbWVudQogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWRyb3Bkb3duLW1lbnUtc2hhcmVkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8cGFwZXItbWVudS1idXR0b24gaWQ9Im1lbnVCdXR0b24iIHZlcnRpY2FsLWFsaWduPSJbW3ZlcnRpY2FsQWxpZ25dXSIgaG9yaXpvbnRhbC1hbGlnbj0iW1tob3Jpem9udGFsQWxpZ25dXSIgZHluYW1pYy1hbGlnbj0iW1tkeW5hbWljQWxpZ25dXSIgdmVydGljYWwtb2Zmc2V0PSJbW19jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0KG5vTGFiZWxGbG9hdCwgdmVydGljYWxPZmZzZXQpXV0iIGRpc2FibGVkPSJbW2Rpc2FibGVkXV0iIG5vLWFuaW1hdGlvbnM9Iltbbm9BbmltYXRpb25zXV0iIG9uLWlyb24tc2VsZWN0PSJfb25Jcm9uU2VsZWN0IiBvbi1pcm9uLWRlc2VsZWN0PSJfb25Jcm9uRGVzZWxlY3QiIG9wZW5lZD0ie3tvcGVuZWR9fSIgY2xvc2Utb24tYWN0aXZhdGUgYWxsb3ctb3V0c2lkZS1zY3JvbGw9IltbYWxsb3dPdXRzaWRlU2Nyb2xsXV0iIHJlc3RvcmUtZm9jdXMtb24tY2xvc2U9IltbcmVzdG9yZUZvY3VzT25DbG9zZV1dIj4KICAgICAgPCEtLSBzdXBwb3J0IGh5YnJpZCBtb2RlOiB1c2VyIG1pZ2h0IGJlIHVzaW5nIHBhcGVyLW1lbnUtYnV0dG9uIDEueCB3aGljaCBkaXN0cmlidXRlcyB2aWEgPGNvbnRlbnQ+IC0tPgogICAgICA8ZGl2IGNsYXNzPSJkcm9wZG93bi10cmlnZ2VyIiBzbG90PSJkcm9wZG93bi10cmlnZ2VyIj4KICAgICAgICA8cGFwZXItcmlwcGxlPjwvcGFwZXItcmlwcGxlPgogICAgICAgIDwhLS0gcGFwZXItaW5wdXQgaGFzIHR5cGU9InRleHQiIGZvciBhMTF5LCBkbyBub3QgcmVtb3ZlIC0tPgogICAgICAgIDxwYXBlci1pbnB1dCBpZD0iaW5wdXQiIHR5cGU9InRleHQiIGludmFsaWQ9IltbaW52YWxpZF1dIiByZWFkb25seSBkaXNhYmxlZD0iW1tkaXNhYmxlZF1dIiB2YWx1ZT0iW1t2YWx1ZV1dIiBwbGFjZWhvbGRlcj0iW1twbGFjZWhvbGRlcl1dIiBlcnJvci1tZXNzYWdlPSJbW2Vycm9yTWVzc2FnZV1dIiBhbHdheXMtZmxvYXQtbGFiZWw9IltbYWx3YXlzRmxvYXRMYWJlbF1dIiBuby1sYWJlbC1mbG9hdD0iW1tub0xhYmVsRmxvYXRdXSIgbGFiZWw9IltbbGFiZWxdXSIgaW5wdXQtcm9sZT0iYnV0dG9uIiBpbnB1dC1hcmlhLWhhc3BvcHVwPSJsaXN0Ym94IiBhdXRvY29tcGxldGU9Im9mZiI+CiAgICAgICAgICA8IS0tIHN1cHBvcnQgaHlicmlkIG1vZGU6IHVzZXIgbWlnaHQgYmUgdXNpbmcgcGFwZXItaW5wdXQgMS54IHdoaWNoIGRpc3RyaWJ1dGVzIHZpYSA8Y29udGVudD4gLS0+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249InBhcGVyLWRyb3Bkb3duLW1lbnU6YXJyb3ctZHJvcC1kb3duIiBzdWZmaXggc2xvdD0ic3VmZml4Ij48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8L2Rpdj4KICAgICAgPHNsb3QgaWQ9ImNvbnRlbnQiIG5hbWU9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPjwvc2xvdD4KICAgIDwvcGFwZXItbWVudS1idXR0b24+CmAsCgogICAgICBpczogJ3BhcGVyLWRyb3Bkb3duLW1lbnUnLAoKICAgICAgYmVoYXZpb3JzOiBbCiAgICAgICAgSXJvbkJ1dHRvblN0YXRlLAogICAgICAgIElyb25Db250cm9sU3RhdGUsCiAgICAgICAgSXJvbkZvcm1FbGVtZW50QmVoYXZpb3IsCiAgICAgICAgSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IKICAgICAgXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGVyaXZlZCAibGFiZWwiIG9mIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgaXRlbS4gVGhpcyB2YWx1ZQogICAgICAgICAqIGlzIHRoZSBgbGFiZWxgIHByb3BlcnR5IG9uIHRoZSBzZWxlY3RlZCBpdGVtIGlmIHNldCwgb3IgZWxzZSB0aGUKICAgICAgICAgKiB0cmltbWVkIHRleHQgY29udGVudCBvZiB0aGUgc2VsZWN0ZWQgaXRlbS4KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZEl0ZW1MYWJlbDoge3R5cGU6IFN0cmluZywgbm90aWZ5OiB0cnVlLCByZWFkT25seTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsYXN0IHNlbGVjdGVkIGl0ZW0uIEFuIGl0ZW0gaXMgc2VsZWN0ZWQgaWYgdGhlIGRyb3Bkb3duIG1lbnUgaGFzCiAgICAgICAgICogYSBjaGlsZCB3aXRoIHNsb3QgYGRyb3Bkb3duLWNvbnRlbnRgLCBhbmQgdGhhdCBjaGlsZCB0cmlnZ2VycyBhbgogICAgICAgICAqIGBpcm9uLXNlbGVjdGAgZXZlbnQgd2l0aCB0aGUgc2VsZWN0ZWQgYGl0ZW1gIGluIHRoZSBgZGV0YWlsYC4KICAgICAgICAgKgogICAgICAgICAqIEB0eXBlIHs/T2JqZWN0fQogICAgICAgICAqLwogICAgICAgIHNlbGVjdGVkSXRlbToge3R5cGU6IE9iamVjdCwgbm90aWZ5OiB0cnVlLCByZWFkT25seTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB2YWx1ZSBmb3IgdGhpcyBlbGVtZW50IHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gc3VibWl0dGluZyBpbgogICAgICAgICAqIGEgZm9ybS4gSXQgcmVmbGVjdHMgdGhlIHZhbHVlIG9mIGBzZWxlY3RlZEl0ZW1MYWJlbGAuIElmIHNldCBkaXJlY3RseSwKICAgICAgICAgKiBpdCB3aWxsIG5vdCB1cGRhdGUgdGhlIGBzZWxlY3RlZEl0ZW1MYWJlbGAgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgdmFsdWU6IHsKICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGFiZWwgZm9yIHRoZSBkcm9wZG93bi4KICAgICAgICAgKi8KICAgICAgICBsYWJlbDoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwbGFjZWhvbGRlciBmb3IgdGhlIGRyb3Bkb3duLgogICAgICAgICAqLwogICAgICAgIHBsYWNlaG9sZGVyOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVycm9yIG1lc3NhZ2UgdG8gZGlzcGxheSB3aGVuIGludmFsaWQuCiAgICAgICAgICovCiAgICAgICAgZXJyb3JNZXNzYWdlOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVHJ1ZSBpZiB0aGUgZHJvcGRvd24gaXMgb3Blbi4gT3RoZXJ3aXNlLCBmYWxzZS4KICAgICAgICAgKi8KICAgICAgICBvcGVuZWQ6CiAgICAgICAgICAgIHt0eXBlOiBCb29sZWFuLCBub3RpZnk6IHRydWUsIHZhbHVlOiBmYWxzZSwgb2JzZXJ2ZXI6ICdfb3BlbmVkQ2hhbmdlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZHJvcGRvd24gd2lsbCBjb25zdHJhaW4gc2Nyb2xsaW5nIG9uIHRoZSBwYWdlCiAgICAgICAgICogdG8gaXRzZWxmIHdoZW4gb3BlbmVkLgogICAgICAgICAqIFNldCB0byB0cnVlIGluIG9yZGVyIHRvIHByZXZlbnQgc2Nyb2xsIGZyb20gYmVpbmcgY29uc3RyYWluZWQKICAgICAgICAgKiB0byB0aGUgZHJvcGRvd24gd2hlbiBpdCBvcGVucy4KICAgICAgICAgKi8KICAgICAgICBhbGxvd091dHNpZGVTY3JvbGw6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIHRoZSBmbG9hdGluZyBsYWJlbC4gQmluZCB0aGlzIHRvIHRoZQogICAgICAgICAqIGA8cGFwZXItaW5wdXQtY29udGFpbmVyPmAncyBgbm9MYWJlbEZsb2F0YCBwcm9wZXJ0eS4KICAgICAgICAgKi8KICAgICAgICBub0xhYmVsRmxvYXQ6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGFsd2F5cyBmbG9hdCB0aGUgbGFiZWwuIEJpbmQgdGhpcyB0byB0aGUKICAgICAgICAgKiBgPHBhcGVyLWlucHV0LWNvbnRhaW5lcj5gJ3MgYGFsd2F5c0Zsb2F0TGFiZWxgIHByb3BlcnR5LgogICAgICAgICAqLwogICAgICAgIGFsd2F5c0Zsb2F0TGFiZWw6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBkaXNhYmxlIGFuaW1hdGlvbnMgd2hlbiBvcGVuaW5nIGFuZCBjbG9zaW5nIHRoZQogICAgICAgICAqIGRyb3Bkb3duLgogICAgICAgICAqLwogICAgICAgIG5vQW5pbWF0aW9uczoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBvcmllbnRhdGlvbiBhZ2FpbnN0IHdoaWNoIHRvIGFsaWduIHRoZSBtZW51IGRyb3Bkb3duCiAgICAgICAgICogaG9yaXpvbnRhbGx5IHJlbGF0aXZlIHRvIHRoZSBkcm9wZG93biB0cmlnZ2VyLgogICAgICAgICAqLwogICAgICAgIGhvcml6b250YWxBbGlnbjoge3R5cGU6IFN0cmluZywgdmFsdWU6ICdyaWdodCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3JpZW50YXRpb24gYWdhaW5zdCB3aGljaCB0byBhbGlnbiB0aGUgbWVudSBkcm9wZG93bgogICAgICAgICAqIHZlcnRpY2FsbHkgcmVsYXRpdmUgdG8gdGhlIGRyb3Bkb3duIHRyaWdnZXIuCiAgICAgICAgICovCiAgICAgICAgdmVydGljYWxBbGlnbjoge3R5cGU6IFN0cmluZywgdmFsdWU6ICd0b3AnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVzIHRoZSB2ZXJ0aWNhbCBvZmZzZXQgY29tcHV0ZWQgaW4KICAgICAgICAgKiBfY29tcHV0ZU1lbnVWZXJ0aWNhbE9mZnNldC4KICAgICAgICAgKi8KICAgICAgICB2ZXJ0aWNhbE9mZnNldDogTnVtYmVyLAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgYGhvcml6b250YWxBbGlnbmAgYW5kIGB2ZXJ0aWNhbEFsaWduYCBwcm9wZXJ0aWVzIHdpbGwKICAgICAgICAgKiBiZSBjb25zaWRlcmVkIHByZWZlcmVuY2VzIGluc3RlYWQgb2Ygc3RyaWN0IHJlcXVpcmVtZW50cyB3aGVuCiAgICAgICAgICogcG9zaXRpb25pbmcgdGhlIGRyb3Bkb3duIGFuZCBtYXkgYmUgY2hhbmdlZCBpZiBkb2luZyBzbyByZWR1Y2VzCiAgICAgICAgICogdGhlIGFyZWEgb2YgdGhlIGRyb3Bkb3duIGZhbGxpbmcgb3V0c2lkZSBvZiBgZml0SW50b2AuCiAgICAgICAgICovCiAgICAgICAgZHluYW1pY0FsaWduOiB7dHlwZTogQm9vbGVhbn0sCgogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgZm9jdXMgc2hvdWxkIGJlIHJlc3RvcmVkIHRvIHRoZSBkcm9wZG93biB3aGVuIHRoZSBtZW51IGNsb3Nlcy4KICAgICAgICAgKi8KICAgICAgICByZXN0b3JlRm9jdXNPbkNsb3NlOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IHRydWV9LAogICAgICB9LAoKICAgICAgbGlzdGVuZXJzOiB7J3RhcCc6ICdfb25UYXAnfSwKCiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7IU9iamVjdH0KICAgICAgICovCiAgICAgIGtleUJpbmRpbmdzOiB7J3VwIGRvd24nOiAnb3BlbicsICdlc2MnOiAnY2xvc2UnfSwKCiAgICAgIG9ic2VydmVyczogWydfc2VsZWN0ZWRJdGVtQ2hhbmdlZChzZWxlY3RlZEl0ZW0pJ10sCgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGUgYF9hdHRhY2hEb21gIHNvIHRoYXQgd2UgY2FuIHBhc3MgYGRlbGVnYXRlc0ZvY3VzYC4gVGhlIG92ZXJyaWRkZW4KICAgICAgICogaW1wbGVtZW50YXRpb24gb2YgYF9hdHRhY2hEb21gIHNwZWNpZmljYWxseSBza2lwcyB0aGUgc3RlcHMgcGVyZm9ybWVkIGhlcmUKICAgICAgICogaWYgdGhlIG5vZGUgYWxyZWFkeSBob3N0cyBhIHNoYWRvdyByb290OgogICAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vUG9seW1lci9wb2x5bWVyL2Jsb2IvNjQwYmM4MGFjNzE3N2I3NjFkNDZiMmZhOWM0NTVjMzE4ZjJiODVjNi9saWIvbWl4aW5zL2VsZW1lbnQtbWl4aW4uanMjTDY5MS1MNjk0CiAgICAgICAqIEBvdmVycmlkZQogICAgICAgKi8KICAgICAgX2F0dGFjaERvbShkb20pIHsKICAgICAgICBjb25zdCB3cmFwcGVkVGhpcyA9IHdyYXAodGhpcyk7CiAgICAgICAgd3JhcHBlZFRoaXMuYXR0YWNoU2hhZG93KHsKICAgICAgICAgIG1vZGU6ICdvcGVuJywKICAgICAgICAgIGRlbGVnYXRlc0ZvY3VzOiB0cnVlLAogICAgICAgICAgc2hhZHlVcGdyYWRlRnJhZ21lbnQ6IGRvbSwKICAgICAgICB9KTsKICAgICAgICB3cmFwcGVkVGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKGRvbSk7CiAgICAgICAgcmV0dXJuIExlZ2FjeVBvbHltZXJFbGVtZW50QmFzZS5wcm90b3R5cGUuX2F0dGFjaERvbS5jYWxsKHRoaXMsIGRvbSk7CiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIGZvY3VzKCkgewogICAgICAgIC8vIFdoZW4gdXNpbmcgU2hhZHkgRE9NIGFuZCBpbiBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvcnQKICAgICAgICAvLyBgZGVsZWdhdGVzRm9jdXNgLCBhdHRlbXB0aW5nIHRvIGZvY3VzIHRoaXMgZWxlbWVudCB3aXRoIHRoZSBicm93c2VyJ3MKICAgICAgICAvLyBuYXRpdmUgYEhUTUxFbGVtZW50I2ZvY3VzYCB3aWxsIGNhdXNlIGZvY3VzIHRvIGJlIGxvc3QgYmVjYXVzZSB0aGlzCiAgICAgICAgLy8gZWxlbWVudCBpc24ndCBmb2N1c2FibGUgaW4gdGhvc2Ugc2l0dWF0aW9ucy4gVG8gd29yayBhcm91bmQgdGhpcywgdGhlCiAgICAgICAgLy8gZWxlbWVudCBpbiB0aGUgc2hhZG93IHJvb3QgdGhhdCB0aGlzIGVsZW1lbnQgaW50ZW5kcyB0byBkZWxlZ2F0ZSBmb2N1cwogICAgICAgIC8vIHRvIGlzIG1hbnVhbGx5IGZvY3VzZWQgaW5zdGVhZC4KICAgICAgICB0aGlzLiQuaW5wdXQuX2ZvY3VzYWJsZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgfSwKCiAgICAgIC8qKiBAb3ZlcnJpZGUgKi8KICAgICAgYXR0YWNoZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIE5PVEUoY2RhdGEpOiBEdWUgdG8gdGltaW5nLCBhIHByZXNlbGVjdGVkIHZhbHVlIGluIGEgYElyb25TZWxlY3RhYmxlYAogICAgICAgIC8vIGNoaWxkIHdpbGwgY2F1c2UgYW4gYGlyb24tc2VsZWN0YCBldmVudCB0byBmaXJlIHdoaWxlIHRoZSBlbGVtZW50IGlzCiAgICAgICAgLy8gc3RpbGwgaW4gYSBgRG9jdW1lbnRGcmFnbWVudGAuIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgY2F1c2luZwogICAgICAgIC8vIGhhbmRsZXJzIG5vdCB0byBmaXJlLiBTbywgd2UgZG91YmxlIGNoZWNrIHRoaXMgdmFsdWUgb24gYXR0YWNoZWQ6CiAgICAgICAgdmFyIGNvbnRlbnRFbGVtZW50ID0gdGhpcy5jb250ZW50RWxlbWVudDsKICAgICAgICBpZiAoY29udGVudEVsZW1lbnQgJiYgY29udGVudEVsZW1lbnQuc2VsZWN0ZWRJdGVtKSB7CiAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oY29udGVudEVsZW1lbnQuc2VsZWN0ZWRJdGVtKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhlIGNvbnRlbnQgZWxlbWVudCB0aGF0IGlzIGNvbnRhaW5lZCBieSB0aGUgZHJvcGRvd24gbWVudSwgaWYgYW55LgogICAgICAgKi8KICAgICAgZ2V0IGNvbnRlbnRFbGVtZW50KCkgewogICAgICAgIC8vIFBvbHltZXIgMi54IHJldHVybnMgc2xvdC5hc3NpZ25lZE5vZGVzIHdoaWNoIGNhbiBjb250YWluIHRleHQgbm9kZXMuCiAgICAgICAgdmFyIG5vZGVzID0gZG9tKHRoaXMuJC5jb250ZW50KS5nZXREaXN0cmlidXRlZE5vZGVzKCk7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBub2Rlcy5sZW5ndGg7IGkgPCBsOyBpKyspIHsKICAgICAgICAgIGlmIChub2Rlc1tpXS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGVzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTaG93IHRoZSBkcm9wZG93biBjb250ZW50LgogICAgICAgKi8KICAgICAgb3BlbjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kLm1lbnVCdXR0b24ub3BlbigpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEhpZGUgdGhlIGRyb3Bkb3duIGNvbnRlbnQuCiAgICAgICAqLwogICAgICBjbG9zZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kLm1lbnVCdXR0b24uY2xvc2UoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBgaXJvbi1zZWxlY3RgIGlzIGZpcmVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBBbiBgaXJvbi1zZWxlY3RgIGV2ZW50LgogICAgICAgKi8KICAgICAgX29uSXJvblNlbGVjdDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW0oZXZlbnQuZGV0YWlsLml0ZW0pOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEEgaGFuZGxlciB0aGF0IGlzIGNhbGxlZCB3aGVuIGBpcm9uLWRlc2VsZWN0YCBpcyBmaXJlZC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgQW4gYGlyb24tZGVzZWxlY3RgIGV2ZW50LgogICAgICAgKi8KICAgICAgX29uSXJvbkRlc2VsZWN0OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHRoaXMuX3NldFNlbGVjdGVkSXRlbShudWxsKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBIGhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZHJvcGRvd24gaXMgdGFwcGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBBIHRhcCBldmVudC4KICAgICAgICovCiAgICAgIF9vblRhcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoZmluZE9yaWdpbmFsVGFyZ2V0KGV2ZW50KSA9PT0gdGhpcykgewogICAgICAgICAgdGhpcy5vcGVuKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENvbXB1dGUgdGhlIGxhYmVsIGZvciB0aGUgZHJvcGRvd24gZ2l2ZW4gYSBzZWxlY3RlZCBpdGVtLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IHNlbGVjdGVkSXRlbSBBIHNlbGVjdGVkIEVsZW1lbnQgaXRlbSwgd2l0aCBhbgogICAgICAgKiBvcHRpb25hbCBgbGFiZWxgIHByb3BlcnR5LgogICAgICAgKi8KICAgICAgX3NlbGVjdGVkSXRlbUNoYW5nZWQ6IGZ1bmN0aW9uKHNlbGVjdGVkSXRlbSkgewogICAgICAgIHZhciB2YWx1ZSA9ICcnOwogICAgICAgIGlmICghc2VsZWN0ZWRJdGVtKSB7CiAgICAgICAgICB2YWx1ZSA9ICcnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YWx1ZSA9IHNlbGVjdGVkSXRlbS5sYWJlbCB8fCBzZWxlY3RlZEl0ZW0uZ2V0QXR0cmlidXRlKCdsYWJlbCcpIHx8CiAgICAgICAgICAgICAgc2VsZWN0ZWRJdGVtLnRleHRDb250ZW50LnRyaW0oKTsKICAgICAgICB9CgogICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW1MYWJlbCh2YWx1ZSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ29tcHV0ZSB0aGUgdmVydGljYWwgb2Zmc2V0IG9mIHRoZSBtZW51IGJhc2VkIG9uIHRoZSB2YWx1ZSBvZgogICAgICAgKiBgbm9MYWJlbEZsb2F0YC4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtib29sZWFufSBub0xhYmVsRmxvYXQgVHJ1ZSBpZiB0aGUgbGFiZWwgc2hvdWxkIG5vdCBmbG9hdAogICAgICAgKiBAcGFyYW0ge251bWJlcj19IG9wdF92ZXJ0aWNhbE9mZnNldCBPcHRpb25hbCBvZmZzZXQgZnJvbSB0aGUgdXNlcgogICAgICAgKiBhYm92ZSB0aGUgaW5wdXQsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgICovCiAgICAgIF9jb21wdXRlTWVudVZlcnRpY2FsT2Zmc2V0OiBmdW5jdGlvbihub0xhYmVsRmxvYXQsIG9wdF92ZXJ0aWNhbE9mZnNldCkgewogICAgICAgIC8vIE92ZXJyaWRlIG9mZnNldCBpZiBpdCdzIHBhc3NlZCBmcm9tIHRoZSB1c2VyLgogICAgICAgIGlmIChvcHRfdmVydGljYWxPZmZzZXQpIHsKICAgICAgICAgIHJldHVybiBvcHRfdmVydGljYWxPZmZzZXQ7CiAgICAgICAgfQoKICAgICAgICAvLyBOT1RFKGNkYXRhKTogVGhlc2UgbnVtYmVycyBhcmUgc29tZXdoYXQgbWFnaWNhbCBiZWNhdXNlIHRoZXkgYXJlCiAgICAgICAgLy8gZGVyaXZlZCBmcm9tIHRoZSBtZXRyaWNzIG9mIGVsZW1lbnRzIGludGVybmFsIHRvIGBwYXBlci1pbnB1dGAncwogICAgICAgIC8vIHRlbXBsYXRlLiBUaGUgbWV0cmljcyB3aWxsIGNoYW5nZSBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdGhlCiAgICAgICAgLy8gaW5wdXQgaGFzIGEgZmxvYXRpbmcgbGFiZWwuCiAgICAgICAgcmV0dXJuIG5vTGFiZWxGbG9hdCA/IC00IDogODsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbGVtZW50IGlzIHJlcXVpcmVkIGFuZCBkb2VzIG5vdCBoYXZlIGEgc2VsZWN0aW9uLAogICAgICAgKiBhbmQgdHJ1ZSBvdGhlcndpc2UuCiAgICAgICAqIEBwYXJhbSB7Kj19IF92YWx1ZSBJZ25vcmVkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGByZXF1aXJlZGAgaXMgZmFsc2UsIG9yIGlmIGByZXF1aXJlZGAgaXMgdHJ1ZQogICAgICAgKiBhbmQgdGhlIGVsZW1lbnQgaGFzIGEgdmFsaWQgc2VsZWN0aW9uLgogICAgICAgKi8KICAgICAgX2dldFZhbGlkaXR5OiBmdW5jdGlvbihfdmFsdWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5yZXF1aXJlZCB8fCAodGhpcy5yZXF1aXJlZCAmJiAhIXRoaXMudmFsdWUpOwogICAgICB9LAoKICAgICAgX29wZW5lZENoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvcGVuU3RhdGUgPSB0aGlzLm9wZW5lZCA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICAgICAgdmFyIGUgPSB0aGlzLmNvbnRlbnRFbGVtZW50OwogICAgICAgIGlmIChlKSB7CiAgICAgICAgICBlLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIG9wZW5TdGF0ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICB2YXIgU0hBRE9XX1dIRU5fU0NST0xMSU5HID0gMTsKICAgIHZhciBTSEFET1dfQUxXQVlTID0gMjsKICAgIHZhciBNT0RFX0NPTkZJR1MgPSB7CiAgICAgIG91dGVyU2Nyb2xsOiB7J3Njcm9sbCc6IHRydWV9LAoKICAgICAgc2hhZG93TW9kZTogewogICAgICAgICdzdGFuZGFyZCc6IFNIQURPV19BTFdBWVMsCiAgICAgICAgJ3dhdGVyZmFsbCc6IFNIQURPV19XSEVOX1NDUk9MTElORywKICAgICAgICAnd2F0ZXJmYWxsLXRhbGwnOiBTSEFET1dfV0hFTl9TQ1JPTExJTkcKICAgICAgfSwKCiAgICAgIHRhbGxNb2RlOiB7J3dhdGVyZmFsbC10YWxsJzogdHJ1ZX0KICAgIH07CgogICAgLyoqCiAgICAqKlRoaXMgZWxlbWVudCBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm9yIG9mCiAgICBbYXBwLWxheW91dF0oaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9hcHAtbGF5b3V0KS4qKgoKICAgIGBwYXBlci1oZWFkZXItcGFuZWxgIGNvbnRhaW5zIGEgaGVhZGVyIHNlY3Rpb24gYW5kIGEgY29udGVudCBwYW5lbCBzZWN0aW9uLgoKICAgIF9fSW1wb3J0YW50Ol9fIFRoZSBgcGFwZXItaGVhZGVyLXBhbmVsYCB3aWxsIG5vdCBkaXNwbGF5IGlmIGl0cyBwYXJlbnQgZG9lcyBub3QKICAgIGhhdmUgYSBoZWlnaHQuCgogICAgVXNpbmcgbGF5b3V0IGNsYXNzZXMsIHlvdSBjYW4gbWFrZSB0aGUgYHBhcGVyLWhlYWRlci1wYW5lbGAgZmlsbCB0aGUgc2NyZWVuCgogICAgICAgIDxib2R5IGNsYXNzPSJmdWxsYmxlZWQgbGF5b3V0IHZlcnRpY2FsIj4KICAgICAgICAgIDxwYXBlci1oZWFkZXItcGFuZWwgY2xhc3M9ImZsZXgiPgogICAgICAgICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiPgogICAgICAgICAgICAgIDxkaXY+SGVsbG8gV29ybGQhPC9kaXY+CiAgICAgICAgICAgIDwvcGFwZXItdG9vbGJhcj4KICAgICAgICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgogICAgICAgIDwvYm9keT4KCiAgICBTcGVjaWFsIHN1cHBvcnQgaXMgcHJvdmlkZWQgZm9yIHNjcm9sbGluZyBtb2RlcyB3aGVuIG9uZSB1c2VzIGEgcGFwZXItdG9vbGJhciBvcgogICAgZXF1aXZhbGVudCBmb3IgdGhlIGhlYWRlciBzZWN0aW9uLgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci1oZWFkZXItcGFuZWw+CiAgICAgICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiPkhlYWRlcjwvcGFwZXItdG9vbGJhcj4KICAgICAgICAgIDxkaXY+Q29udGVudCBnb2VzIGhlcmUuLi48L2Rpdj4KICAgICAgICA8L3BhcGVyLWhlYWRlci1wYW5lbD4KCiAgICBUbyBoYXZlIHRoZSBjb250ZW50IGZpdCB0byB0aGUgbWFpbiBhcmVhLCB1c2UgdGhlIGBmaXRgIGNsYXNzLgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci1oZWFkZXItcGFuZWw+CiAgICAgICAgICA8ZGl2IHNsb3Q9ImhlYWRlciI+c3RhbmRhcmQ8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImZpdCI+Y29udGVudCBmaXRzIDEwMCUgYmVsb3cgdGhlIGhlYWRlcjwvZGl2PgogICAgICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgICMjIyBNb2RlcwoKICAgIENvbnRyb2xzIGhlYWRlciBhbmQgc2Nyb2xsaW5nIGJlaGF2aW9yLiBPcHRpb25zIGFyZSBgc3RhbmRhcmRgLCBgc2VhbWVkYCwKICAgIGB3YXRlcmZhbGxgLCBgd2F0ZXJmYWxsLXRhbGxgLCBgc2Nyb2xsYCBhbmQgYGNvdmVyYC4gRGVmYXVsdCBpcyBgc3RhbmRhcmRgLgoKICAgIE1vZGUgfCBEZXNjcmlwdGlvbgogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tCiAgICBgc3RhbmRhcmRgIHwgVGhlIGhlYWRlciBpcyBhIHN0ZXAgYWJvdmUgdGhlIHBhbmVsLiBUaGUgaGVhZGVyIHdpbGwgY29uc3VtZSB0aGUgcGFuZWwgYXQgdGhlIHBvaW50IG9mIGVudHJ5LCBwcmV2ZW50aW5nIGl0IGZyb20gcGFzc2luZyB0aHJvdWdoIHRvIHRoZSBvcHBvc2l0ZSBzaWRlLgogICAgYHNlYW1lZGAgfCBUaGUgaGVhZGVyIGlzIHByZXNlbnRlZCBhcyBzZWFtZWQgd2l0aCB0aGUgcGFuZWwuCiAgICBgd2F0ZXJmYWxsYCB8IFNpbWlsYXIgdG8gc3RhbmRhcmQgbW9kZSwgYnV0IGhlYWRlciBpcyBpbml0aWFsbHkgcHJlc2VudGVkIGFzIHNlYW1lZCB3aXRoIHBhbmVsLCBidXQgdGhlbiBzZXBhcmF0ZXMgdG8gZm9ybSB0aGUgc3RlcC4KICAgIGB3YXRlcmZhbGwtdGFsbGAgfCBUaGUgaGVhZGVyIGlzIGluaXRpYWxseSB0YWxsZXIgKGB0YWxsYCBjbGFzcyBpcyBhZGRlZCB0byB0aGUgaGVhZGVyKS4gQXMgdGhlIHVzZXIgc2Nyb2xscywgdGhlIGhlYWRlciBzZXBhcmF0ZXMgKGZvcm1pbmcgYW4gZWRnZSkgd2hpbGUgY29uZGVuc2luZyAoYHRhbGxgIGNsYXNzIGlzIHJlbW92ZWQgZnJvbSB0aGUgaGVhZGVyKS4KICAgIGBzY3JvbGxgIHwgVGhlIGhlYWRlciBrZWVwcyBpdHMgc2VhbSB3aXRoIHRoZSBwYW5lbCwgYW5kIGlzIHB1c2hlZCBvZmYgc2NyZWVuLgogICAgYGNvdmVyYCB8IFRoZSBwYW5lbCBjb3ZlcnMgdGhlIHdob2xlIGBwYXBlci1oZWFkZXItcGFuZWxgIGluY2x1ZGluZyB0aGUgaGVhZGVyLiBUaGlzIGFsbG93cyB1c2VyIHRvIHN0eWxlIHRoZSBwYW5lbCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHBhbmVsIGlzIHBhcnRpYWxseSBjb3ZlcmluZyB0aGUgaGVhZGVyLgoKICAgICMjIyBTdHlsaW5nCgogICAgVG8gY2hhbmdlIHRoZSBzaGFkb3cgdGhhdCBzaG93cyB1cCB1bmRlcm5lYXRoIHRoZSBoZWFkZXI6CgogICAgICAgIHBhcGVyLWhlYWRlci1wYW5lbCB7CiAgICAgICAgICAtLXBhcGVyLWhlYWRlci1wYW5lbC1zaGFkb3c6IHsKICAgICAgICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICAgICAgICBib3R0b206IC02cHg7CiAgICAgICAgICAgICAgYm94LXNoYWRvdzogaW5zZXQgMHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuNCk7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICBUbyBjaGFuZ2UgdGhlIHBhbmVsIGNvbnRhaW5lcjoKCiAgICAgICAgcGFwZXItaGVhZGVyLXBhbmVsIHsKICAgICAgICAgIC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvbnRhaW5lcjogewogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogICAgICAgICAgfTsKCiAgICBUbyBjaGFuZ2UgdGhlIHBhbmVsIGNvbnRhaW5lciBpbiBkaWZmZXJlbnQgbW9kZXM6CgogICAgICAgIHBhcGVyLWhlYWRlci1wYW5lbCB7CiAgICAgICAgICAtLXBhcGVyLWhlYWRlci1wYW5lbC1zdGFuZGFyZC1jb250YWluZXI6IHsKICAgICAgICAgICAgYm9yZGVyOiAxcHggc29saWQgZ3JheTsKICAgICAgICAgIH07CgogICAgICAgICAgLS1wYXBlci1oZWFkZXItcGFuZWwtc2VhbWVkLWNvbnRhaW5lcjogewogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogICAgICAgICAgfTsKCiAgICAgICAgICAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtY29udGFpbmVyOiB7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7CiAgICAgICAgICB9OwoKICAgICAgICAgIC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC10YWxsLWNvbnRhaW5lcjogewogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogICAgICAgICAgfTsKCiAgICAgICAgICAtLXBhcGVyLWhlYWRlci1wYW5lbC1zY3JvbGwtY29udGFpbmVyOiB7CiAgICAgICAgICAgIGJvcmRlcjogMXB4IHNvbGlkIGdyYXk7CiAgICAgICAgICB9OwoKICAgICAgICAgIC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvdmVyLWNvbnRhaW5lcjogewogICAgICAgICAgICBib3JkZXI6IDFweCBzb2xpZCBncmF5OwogICAgICAgICAgfTsKICAgICAgICB9CgogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItaGVhZGVyLXBhbmVsYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGVsZW1lbnQgfCBge31gCiAgICBgLS1wYXBlci1oZWFkZXItcGFuZWwtYm9keWAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50J3MgYm9keSAoaS5lLiBldmVyeXRoaW5nIGJlbG93IHRoZSB0b29sYmFyKSB8IGB7fWAKICAgIGAtLXBhcGVyLWhlYWRlci1wYW5lbC1jb250YWluZXJgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgY29udGFpbmVyIGluIGFueSBtb2RlIHwgYHt9YAogICAgYC0tcGFwZXItaGVhZGVyLXBhbmVsLXNjcm9sbC1jb250YWluZXJgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgY29udGFpbmVyIHdoZW4gaW4gc2Nyb2xsIG1vZGUgfCBge31gCiAgICBgLS1wYXBlci1oZWFkZXItcGFuZWwtY292ZXItY29udGFpbmVyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciB3aGVuIGluIGNvdmVyIG1vZGUgfCBge31gCiAgICBgLS1wYXBlci1oZWFkZXItcGFuZWwtc3RhbmRhcmQtY29udGFpbmVyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciB3aGVuIGluIHN0YW5kYXJkIG1vZGUgfCBge31gCiAgICBgLS1wYXBlci1oZWFkZXItcGFuZWwtc2VhbWVkLWNvbnRhaW5lcmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgd2hlbiBpbiBzZWFtZWQgbW9kZSB8IGB7fWAKICAgIGAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtY29udGFpbmVyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGNvbnRhaW5lciB3aGVuIGluIHdhdGVyZmFsbCBtb2RlIHwgYHt9YAogICAgYC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC10YWxsLWNvbnRhaW5lcmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBjb250YWluZXIgd2hlbiBpbiB0YWxsIHdhdGVyZmFsbCBtb2RlIHwgYHt9YAogICAgYC0tcGFwZXItaGVhZGVyLXBhbmVsLXNoYWRvd2AgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSB3YXRlcmZhbGwgc2hhZG93IHwgYHt9YAoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItaGVhZGVyLXBhbmVsCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgIEBoZXJvIGhlcm8uc3ZnCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbDsKICAgICAgfQoKICAgICAgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICAtd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzogdG91Y2g7CiAgICAgIH0KCiAgICAgICNtYWluUGFuZWwgewogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtYm9keTsKICAgICAgfQoKICAgICAgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1jb250YWluZXI7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHNjcm9sbAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9c2Nyb2xsXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC1zY3JvbGwtY29udGFpbmVyOwogICAgICAgIG92ZXJmbG93OiB2aXNpYmxlOwogICAgICB9CgogICAgICA6aG9zdChbbW9kZT1zY3JvbGxdKSB7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IHRvdWNoOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBjb3ZlcgogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9Y292ZXJdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLWNvdmVyLWNvbnRhaW5lcjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICB9CgogICAgICA6aG9zdChbbW9kZT1jb3Zlcl0pICNtYWluUGFuZWwgewogICAgICAgIHBvc2l0aW9uOiBzdGF0aWM7CiAgICAgIH0KCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHN0YW5kYXJkCiAgICAgICAqLwogICAgICA6aG9zdChbbW9kZT1zdGFuZGFyZF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc3RhbmRhcmQtY29udGFpbmVyOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiBzZWFtZWQKICAgICAgICovCiAgICAgIDpob3N0KFttb2RlPXNlYW1lZF0pICNtYWluQ29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc2VhbWVkLWNvbnRhaW5lcjsKICAgICAgfQoKCiAgICAgIC8qCiAgICAgICAqIG1vZGU6IHdhdGVyZmFsbAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9d2F0ZXJmYWxsXSkgI21haW5Db250YWluZXIgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWhlYWRlci1wYW5lbC13YXRlcmZhbGwtY29udGFpbmVyOwogICAgICB9CgogICAgICAvKgogICAgICAgKiBtb2RlOiB3YXRlcmZhbGwtdGFsbAogICAgICAgKi8KICAgICAgOmhvc3QoW21vZGU9d2F0ZXJmYWxsLXRhbGxdKSAjbWFpbkNvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItaGVhZGVyLXBhbmVsLXdhdGVyZmFsbC10YWxsLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI2Ryb3BTaGFkb3cgewogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC41czsKICAgICAgICBoZWlnaHQ6IDZweDsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC40KTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1oZWFkZXItcGFuZWwtc2hhZG93OwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICAjZHJvcFNoYWRvdy5oYXMtc2hhZG93IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAjbWFpbkNvbnRhaW5lciA+IDo6c2xvdHRlZCguZml0KSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQoKICAgIDwvc3R5bGU+CgogICAgPHNsb3QgaWQ9ImhlYWRlclNsb3QiIG5hbWU9ImhlYWRlciI+PC9zbG90PgoKICAgIDxkaXYgaWQ9Im1haW5QYW5lbCI+CiAgICAgIDxkaXYgaWQ9Im1haW5Db250YWluZXIiIGNsYXNzXCQ9IltbX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3MobW9kZSldXSI+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBpZD0iZHJvcFNoYWRvdyI+PC9kaXY+CiAgICA8L2Rpdj4KYCwKCiAgICAgIGlzOiAncGFwZXItaGVhZGVyLXBhbmVsJywKCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuIHRoZSBjb250ZW50IGhhcyBiZWVuIHNjcm9sbGVkLiBgZXZlbnQuZGV0YWlsLnRhcmdldGAgcmV0dXJucwogICAgICAgKiB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50IHdoaWNoIHlvdSBjYW4gdXNlIHRvIGFjY2VzcyBzY3JvbGwgaW5mbyBzdWNoIGFzCiAgICAgICAqIGBzY3JvbGxUb3BgLgogICAgICAgKgogICAgICAgKiAgICAgPHBhcGVyLWhlYWRlci1wYW5lbCBvbi1jb250ZW50LXNjcm9sbD0ic2Nyb2xsSGFuZGxlciI+CiAgICAgICAqICAgICAgIC4uLgogICAgICAgKiAgICAgPC9wYXBlci1oZWFkZXItcGFuZWw+CiAgICAgICAqCiAgICAgICAqCiAgICAgICAqICAgICBzY3JvbGxIYW5kbGVyOiBmdW5jdGlvbihldmVudCkgewogICAgICAgKiAgICAgICB2YXIgc2Nyb2xsZXIgPSBldmVudC5kZXRhaWwudGFyZ2V0OwogICAgICAgKiAgICAgICBjb25zb2xlLmxvZyhzY3JvbGxlci5zY3JvbGxUb3ApOwogICAgICAgKiAgICAgfQogICAgICAgKgogICAgICAgKiBAZXZlbnQgY29udGVudC1zY3JvbGwKICAgICAgICovCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29udHJvbHMgaGVhZGVyIGFuZCBzY3JvbGxpbmcgYmVoYXZpb3IuIE9wdGlvbnMgYXJlCiAgICAgICAgICogYHN0YW5kYXJkYCwgYHNlYW1lZGAsIGB3YXRlcmZhbGxgLCBgd2F0ZXJmYWxsLXRhbGxgLCBgc2Nyb2xsYCBhbmQKICAgICAgICAgKiBgY292ZXJgLiBEZWZhdWx0IGlzIGBzdGFuZGFyZGAuCiAgICAgICAgICoKICAgICAgICAgKiBgc3RhbmRhcmRgOiBUaGUgaGVhZGVyIGlzIGEgc3RlcCBhYm92ZSB0aGUgcGFuZWwuIFRoZSBoZWFkZXIgd2lsbCBjb25zdW1lCiAgICAgICAgICogdGhlIHBhbmVsIGF0IHRoZSBwb2ludCBvZiBlbnRyeSwgcHJldmVudGluZyBpdCBmcm9tIHBhc3NpbmcgdGhyb3VnaCB0bwogICAgICAgICAqIHRoZSBvcHBvc2l0ZSBzaWRlLgogICAgICAgICAqCiAgICAgICAgICogYHNlYW1lZGA6IFRoZSBoZWFkZXIgaXMgcHJlc2VudGVkIGFzIHNlYW1lZCB3aXRoIHRoZSBwYW5lbC4KICAgICAgICAgKgogICAgICAgICAqIGB3YXRlcmZhbGxgOiBTaW1pbGFyIHRvIHN0YW5kYXJkIG1vZGUsIGJ1dCBoZWFkZXIgaXMgaW5pdGlhbGx5IHByZXNlbnRlZAogICAgICAgICAqIGFzIHNlYW1lZCB3aXRoIHBhbmVsLCBidXQgdGhlbiBzZXBhcmF0ZXMgdG8gZm9ybSB0aGUgc3RlcC4KICAgICAgICAgKgogICAgICAgICAqIGB3YXRlcmZhbGwtdGFsbGA6IFRoZSBoZWFkZXIgaXMgaW5pdGlhbGx5IHRhbGxlciAoYHRhbGxgIGNsYXNzIGlzIGFkZGVkCiAgICAgICAgICogdG8gdGhlIGhlYWRlcikuICBBcyB0aGUgdXNlciBzY3JvbGxzLCB0aGUgaGVhZGVyIHNlcGFyYXRlcyAoZm9ybWluZyBhbgogICAgICAgICAqIGVkZ2UpIHdoaWxlIGNvbmRlbnNpbmcgKGB0YWxsYCBjbGFzcyBpcyByZW1vdmVkIGZyb20gdGhlIGhlYWRlcikuCiAgICAgICAgICoKICAgICAgICAgKiBgc2Nyb2xsYDogVGhlIGhlYWRlciBrZWVwcyBpdHMgc2VhbSB3aXRoIHRoZSBwYW5lbCwgYW5kIGlzIHB1c2hlZCBvZmYKICAgICAgICAgKiBzY3JlZW4uCiAgICAgICAgICoKICAgICAgICAgKiBgY292ZXJgOiBUaGUgcGFuZWwgY292ZXJzIHRoZSB3aG9sZSBgcGFwZXItaGVhZGVyLXBhbmVsYCBpbmNsdWRpbmcgdGhlCiAgICAgICAgICogaGVhZGVyLiBUaGlzIGFsbG93cyB1c2VyIHRvIHN0eWxlIHRoZSBwYW5lbCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHBhbmVsCiAgICAgICAgICogaXMgcGFydGlhbGx5IGNvdmVyaW5nIHRoZSBoZWFkZXIuCiAgICAgICAgICoKICAgICAgICAgKiAgICAgPHBhcGVyLWhlYWRlci1wYW5lbCBtb2RlPSJjb3ZlciI+CiAgICAgICAgICogICAgICAgPHBhcGVyLXRvb2xiYXIgc2xvdD0iaGVhZGVyIiBjbGFzcz0idGFsbCI+CiAgICAgICAgICogICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0ibWVudSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgKiAgICAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICAgICAgICogICAgICAgPGRpdj48L2Rpdj4KICAgICAgICAgKiAgICAgPC9wYXBlci1oZWFkZXItcGFuZWw+CiAgICAgICAgICovCiAgICAgICAgbW9kZTogewogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgdmFsdWU6ICdzdGFuZGFyZCcsCiAgICAgICAgICBvYnNlcnZlcjogJ19tb2RlQ2hhbmdlZCcsCiAgICAgICAgICByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWUKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgZHJvcC1zaGFkb3cgaXMgYWx3YXlzIHNob3duIG5vIG1hdHRlciB3aGF0IG1vZGUgaXMgc2V0IHRvLgogICAgICAgICAqLwogICAgICAgIHNoYWRvdzoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjbGFzcyB1c2VkIGluIHdhdGVyZmFsbC10YWxsIG1vZGUuICBDaGFuZ2UgdGhpcyBpZiB0aGUgaGVhZGVyCiAgICAgICAgICogYWNjZXB0cyBhIGRpZmZlcmVudCBjbGFzcyBmb3IgdG9nZ2xpbmcgaGVpZ2h0LCBlLmcuICJtZWRpdW0tdGFsbCIKICAgICAgICAgKi8KICAgICAgICB0YWxsQ2xhc3M6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAndGFsbCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgc2Nyb2xsZXIgaXMgYXQgdGhlIHRvcAogICAgICAgICAqLwogICAgICAgIGF0VG9wOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgdmFsdWU6IHRydWUsCiAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICByZWFkT25seTogdHJ1ZSwKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIG9ic2VydmVyczogWydfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW4oYXRUb3AsIG1vZGUsIHNoYWRvdyknXSwKCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9hZGRMaXN0ZW5lcigpOwogICAgICAgIC8vIFJ1biBgc2Nyb2xsYCBsb2dpYyBvbmNlIHRvIGluaXRpYWxpemUgY2xhc3MgbmFtZXMsIGV0Yy4KICAgICAgICB0aGlzLl9rZWVwU2Nyb2xsaW5nU3RhdGUoKTsKICAgICAgfSwKCiAgICAgIGRldGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcigpOwogICAgICB9LAoKICAgICAgcmVhZHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlciA9IHRoaXMuX3Njcm9sbC5iaW5kKHRoaXMpOwogICAgICAgIGNvbnNvbGUud2Fybih0aGlzLmlzLCAnaXMgZGVwcmVjYXRlZC4gUGxlYXNlIHVzZSBhcHAtbGF5b3V0IGluc3RlYWQhJyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgaGVhZGVyIGVsZW1lbnQKICAgICAgICogQHJldHVybiB7IUVsZW1lbnR8dW5kZWZpbmVkfQogICAgICAgKi8KICAgICAgZ2V0IGhlYWRlcigpIHsKICAgICAgICByZXR1cm4gZG9tKHRoaXMuJC5oZWFkZXJTbG90KS5nZXREaXN0cmlidXRlZE5vZGVzKClbMF07CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgc2Nyb2xsYWJsZSBlbGVtZW50LgogICAgICAgKiBAcmV0dXJuIHshSFRNTEVsZW1lbnR9CiAgICAgICAqLwogICAgICBnZXQgc2Nyb2xsZXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNjcm9sbGVyRm9yTW9kZSh0aGlzLm1vZGUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Nyb2xsZXIgaGFzIGEgdmlzaWJsZSBzaGFkb3cuCiAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59CiAgICAgICAqLwogICAgICBnZXQgdmlzaWJsZVNoYWRvdygpIHsKICAgICAgICByZXR1cm4gdGhpcy4kLmRyb3BTaGFkb3cuY2xhc3NMaXN0LmNvbnRhaW5zKCdoYXMtc2hhZG93Jyk7CiAgICAgIH0sCgogICAgICBfY29tcHV0ZURyb3BTaGFkb3dIaWRkZW46IGZ1bmN0aW9uKGF0VG9wLCBtb2RlLCBzaGFkb3cpIHsKICAgICAgICB2YXIgc2hhZG93TW9kZSA9IE1PREVfQ09ORklHUy5zaGFkb3dNb2RlW21vZGVdOwoKICAgICAgICBpZiAodGhpcy5zaGFkb3cpIHsKICAgICAgICAgIHRoaXMudG9nZ2xlQ2xhc3MoJ2hhcy1zaGFkb3cnLCB0cnVlLCB0aGlzLiQuZHJvcFNoYWRvdyk7CiAgICAgICAgfSBlbHNlIGlmIChzaGFkb3dNb2RlID09PSBTSEFET1dfQUxXQVlTKSB7CiAgICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdoYXMtc2hhZG93JywgdHJ1ZSwgdGhpcy4kLmRyb3BTaGFkb3cpOwogICAgICAgIH0gZWxzZSBpZiAoc2hhZG93TW9kZSA9PT0gU0hBRE9XX1dIRU5fU0NST0xMSU5HICYmICFhdFRvcCkgewogICAgICAgICAgdGhpcy50b2dnbGVDbGFzcygnaGFzLXNoYWRvdycsIHRydWUsIHRoaXMuJC5kcm9wU2hhZG93KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy50b2dnbGVDbGFzcygnaGFzLXNoYWRvdycsIGZhbHNlLCB0aGlzLiQuZHJvcFNoYWRvdyk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2NvbXB1dGVNYWluQ29udGFpbmVyQ2xhc3M6IGZ1bmN0aW9uKG1vZGUpIHsKICAgICAgICAvLyBUT0RPOiAgSXQgd2lsbCBiZSB1c2VmdWwgdG8gaGF2ZSBhIHV0aWxpdHkgZm9yIGNsYXNzZXMKICAgICAgICAvLyBlLmcuIFBvbHltZXIuVXRpbHMuY2xhc3Nlcyh7IGZvbzogdHJ1ZSB9KTsKCiAgICAgICAgdmFyIGNsYXNzZXMgPSB7fTsKCiAgICAgICAgY2xhc3Nlc1snZmxleCddID0gbW9kZSAhPT0gJ2NvdmVyJzsKCiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKGNsYXNzZXMpCiAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oY2xhc3NOYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzZXNbY2xhc3NOYW1lXTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgLmpvaW4oJyAnKTsKICAgICAgfSwKCiAgICAgIF9hZGRMaXN0ZW5lcjogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zY3JvbGxlci5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnNjcm9sbEhhbmRsZXIpOwogICAgICB9LAoKICAgICAgX3JlbW92ZUxpc3RlbmVyOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNjcm9sbGVyLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsSGFuZGxlcik7CiAgICAgIH0sCgogICAgICBfbW9kZUNoYW5nZWQ6IGZ1bmN0aW9uKG5ld01vZGUsIG9sZE1vZGUpIHsKICAgICAgICB2YXIgY29uZmlncyA9IE1PREVfQ09ORklHUzsKICAgICAgICB2YXIgaGVhZGVyID0gdGhpcy5oZWFkZXI7CiAgICAgICAgdmFyIGFuaW1hdGVEdXJhdGlvbiA9IDIwMDsKCiAgICAgICAgaWYgKGhlYWRlcikgewogICAgICAgICAgLy8gaW4gdGFsbE1vZGUgaXQgbWF5IGFkZCB0YWxsQ2xhc3MgdG8gdGhlIGhlYWRlcjsgc28gZG8gdGhlIGNsZWFudXAKICAgICAgICAgIC8vIHdoZW4gbW9kZSBpcyBjaGFuZ2VkIGZyb20gdGFsbE1vZGUgdG8gbm90IHRhbGxNb2RlCiAgICAgICAgICBpZiAoY29uZmlncy50YWxsTW9kZVtvbGRNb2RlXSAmJiAhY29uZmlncy50YWxsTW9kZVtuZXdNb2RlXSkgewogICAgICAgICAgICBoZWFkZXIuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLnRhbGxDbGFzcyk7CiAgICAgICAgICAgIHRoaXMuYXN5bmMoZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgaGVhZGVyLmNsYXNzTGlzdC5yZW1vdmUoJ2FuaW1hdGUnKTsKICAgICAgICAgICAgfSwgYW5pbWF0ZUR1cmF0aW9uKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2xhc3MoJ2FuaW1hdGUnLCBjb25maWdzLnRhbGxNb2RlW25ld01vZGVdLCBoZWFkZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLl9rZWVwU2Nyb2xsaW5nU3RhdGUoKTsKICAgICAgfSwKCiAgICAgIF9rZWVwU2Nyb2xsaW5nU3RhdGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBtYWluID0gdGhpcy5zY3JvbGxlcjsKICAgICAgICB2YXIgaGVhZGVyID0gdGhpcy5oZWFkZXI7CgogICAgICAgIHRoaXMuX3NldEF0VG9wKG1haW4uc2Nyb2xsVG9wID09PSAwKTsKCiAgICAgICAgaWYgKGhlYWRlciAmJiB0aGlzLnRhbGxDbGFzcyAmJiBNT0RFX0NPTkZJR1MudGFsbE1vZGVbdGhpcy5tb2RlXSkgewogICAgICAgICAgdGhpcy50b2dnbGVDbGFzcygKICAgICAgICAgICAgICB0aGlzLnRhbGxDbGFzcywKICAgICAgICAgICAgICB0aGlzLmF0VG9wIHx8CiAgICAgICAgICAgICAgICAgIGhlYWRlci5jbGFzc0xpc3QuY29udGFpbnModGhpcy50YWxsQ2xhc3MpICYmCiAgICAgICAgICAgICAgICAgICAgICBtYWluLnNjcm9sbEhlaWdodCA8IHRoaXMub2Zmc2V0SGVpZ2h0LAogICAgICAgICAgICAgIGhlYWRlcik7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3Njcm9sbDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fa2VlcFNjcm9sbGluZ1N0YXRlKCk7CiAgICAgICAgdGhpcy5maXJlKCdjb250ZW50LXNjcm9sbCcsIHt0YXJnZXQ6IHRoaXMuc2Nyb2xsZXJ9LCB7YnViYmxlczogZmFsc2V9KTsKICAgICAgfSwKCiAgICAgIF9nZXRTY3JvbGxlckZvck1vZGU6IGZ1bmN0aW9uKG1vZGUpIHsKICAgICAgICByZXR1cm4gTU9ERV9DT05GSUdTLm91dGVyU2Nyb2xsW21vZGVdID8gdGhpcyA6IHRoaXMuJC5tYWluQ29udGFpbmVyOwogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgIE1hdGVyaWFsIGRlc2lnbjogW0ljb24KICAgIHRvZ2dsZXNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9idXR0b25zLmh0bWwjYnV0dG9ucy10b2dnbGUtYnV0dG9ucykKCiAgICBgcGFwZXItaWNvbi1idXR0b25gIGlzIGEgYnV0dG9uIHdpdGggYW4gaW1hZ2UgcGxhY2VkIGF0IHRoZSBjZW50ZXIuIFdoZW4gdGhlCiAgICB1c2VyIHRvdWNoZXMgdGhlIGJ1dHRvbiwgYSByaXBwbGUgZWZmZWN0IGVtYW5hdGVzIGZyb20gdGhlIGNlbnRlciBvZiB0aGUgYnV0dG9uLgoKICAgIGBwYXBlci1pY29uLWJ1dHRvbmAgZG9lcyBub3QgaW5jbHVkZSBhIGRlZmF1bHQgaWNvbiBzZXQuIFRvIHVzZSBpY29ucyBmcm9tIHRoZQogICAgZGVmYXVsdCBzZXQsIGluY2x1ZGUgYFBvbHltZXJFbGVtZW50cy9pcm9uLWljb25zL2lyb24taWNvbnMuaHRtbGAsIGFuZCB1c2UgdGhlCiAgICBgaWNvbmAgYXR0cmlidXRlIHRvIHNwZWNpZnkgd2hpY2ggaWNvbiBmcm9tIHRoZSBpY29uIHNldCB0byB1c2UuCgogICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJtZW51Ij48L3BhcGVyLWljb24tYnV0dG9uPgoKICAgIFNlZSBbYGlyb24taWNvbnNldGBdKGlyb24taWNvbnNldCkgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKICAgIGhvdyB0byB1c2UgYSBjdXN0b20gaWNvbiBzZXQuCgogICAgRXhhbXBsZToKCiAgICAgICAgPHNjcmlwdCB0eXBlPSJtb2R1bGUiPgogICAgICAgICAgaW1wb3J0ICdAcG9seW1lci9pcm9uLWljb25zL2lyb24taWNvbnMuanMnOwogICAgICAgIDwvSkFWQV9TQ1JJSUlJUFQvPgoKICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmF2b3JpdGUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNyYz0ic3Rhci5wbmciPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgVG8gdXNlIGBwYXBlci1pY29uLWJ1dHRvbmAgYXMgYSBsaW5rLCB3cmFwIGl0IGluIGFuIGFuY2hvciB0YWcuIFNpbmNlCiAgICBgcGFwZXItaWNvbi1idXR0b25gIHdpbGwgYWxyZWFkeSByZWNlaXZlIGZvY3VzLCB5b3UgbWF5IHdhbnQgdG8gcHJldmVudCB0aGUKICAgIGFuY2hvciB0YWcgZnJvbSByZWNlaXZpbmcgZm9jdXMgYXMgd2VsbCBieSBzZXR0aW5nIGl0cyB0YWJpbmRleCB0byAtMS4KCiAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cucG9seW1lci1wcm9qZWN0Lm9yZyIgdGFiaW5kZXg9Ii0xIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwb2x5bWVyIj48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvYT4KCiAgICAjIyMgU3R5bGluZwoKICAgIFN0eWxlIHRoZSBidXR0b24gd2l0aCBDU1MgYXMgeW91IHdvdWxkIGEgbm9ybWFsIERPTSBlbGVtZW50LiBJZiB5b3UgYXJlIHVzaW5nCiAgICB0aGUgaWNvbnMgcHJvdmlkZWQgYnkgYGlyb24taWNvbnNgLCB0aGV5IHdpbGwgaW5oZXJpdCB0aGUgZm9yZWdyb3VuZCBjb2xvciBvZgogICAgdGhlIGJ1dHRvbi4KCiAgICAgICAgLyogbWFrZSBhIHJlZCAiZmF2b3JpdGUiIGJ1dHRvbiAqXC8KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24gaWNvbj0iZmF2b3JpdGUiIHN0eWxlPSJjb2xvcjogcmVkOyI+PC9wYXBlci1pY29uLWJ1dHRvbj4KCiAgICBCeSBkZWZhdWx0LCB0aGUgcmlwcGxlIGlzIHRoZSBzYW1lIGNvbG9yIGFzIHRoZSBmb3JlZ3JvdW5kIGF0IDI1JSBvcGFjaXR5LiBZb3UKICAgIG1heSBjdXN0b21pemUgdGhlIGNvbG9yIHVzaW5nIHRoZSBgLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3JgIGN1c3RvbQogICAgcHJvcGVydHkuCgogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWQtdGV4dGAgfCBUaGUgY29sb3Igb2YgdGhlIGRpc2FibGVkIGJ1dHRvbiB8IGAtLWRpc2FibGVkLXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3JgIHwgU2VsZWN0ZWQvZm9jdXMgcmlwcGxlIGNvbG9yIHwgYC0tcHJpbWFyeS10ZXh0LWNvbG9yYAogICAgYC0tcGFwZXItaWNvbi1idXR0b25gIHwgTWl4aW4gZm9yIGEgYnV0dG9uIHwgYHt9YAogICAgYC0tcGFwZXItaWNvbi1idXR0b24tZGlzYWJsZWRgIHwgTWl4aW4gZm9yIGEgZGlzYWJsZWQgYnV0dG9uIHwgYHt9YAogICAgYC0tcGFwZXItaWNvbi1idXR0b24taG92ZXJgIHwgTWl4aW4gZm9yIGJ1dHRvbiBvbiBob3ZlciB8IGB7fWAKCiAgICBAZ3JvdXAgUGFwZXIgRWxlbWVudHMKICAgIEBlbGVtZW50IHBhcGVyLWljb24tYnV0dG9uCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgaXM6ICdwYXBlci1pY29uLWJ1dHRvbicsCgogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHotaW5kZXg6IDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CgogICAgICAgIHdpZHRoOiA0MHB4OwogICAgICAgIGhlaWdodDogNDBweDsKCiAgICAgICAgLyoKICAgICAgICAgIE5PVEU6IEJvdGggdmFsdWVzIGFyZSBuZWVkZWQsIHNpbmNlIHNvbWUgcGhvbmVzIHJlcXVpcmUgdGhlIHZhbHVlIHRvCiAgICAgICAgICBiZSBcYHRyYW5zcGFyZW50XGAuCiAgICAgICAgKi8KICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKCiAgICAgICAgLyogQmVjYXVzZSBvZiBwb2x5bWVyLzI1NTgsIHRoaXMgc3R5bGUgaGFzIGxvd2VyIHNwZWNpZmljaXR5IHRoYW4gKiAqLwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3ggIWltcG9ydGFudDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaWNvbi1idXR0b247CiAgICAgIH0KCiAgICAgIDpob3N0ICNpbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgICAgIG9wYWNpdHk6IDAuNjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZC10ZXh0LCB2YXIoLS1kaXNhYmxlZC10ZXh0LWNvbG9yKSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBhdXRvOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWJ1dHRvbi1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpob3ZlcikgewogICAgICAgIEBhcHBseSAtLXBhcGVyLWljb24tYnV0dG9uLWhvdmVyOwogICAgICB9CgogICAgICBpcm9uLWljb24gewogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxMDAlOwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8aXJvbi1pY29uIGlkPSJpY29uIiBzcmM9Iltbc3JjXV0iIGljb249IltbaWNvbl1dIgogICAgICAgICAgICAgICBhbHQkPSJbW2FsdF1dIj48L2lyb24taWNvbj4KICBgLAoKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHtyb2xlOiAnYnV0dG9uJywgdGFiaW5kZXg6ICcwJ30sCgogICAgICBiZWhhdmlvcnM6IFtQYXBlcklua3lGb2N1c0JlaGF2aW9yXSwKCiAgICAgIHJlZ2lzdGVyZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3RlbXBsYXRlLnNldEF0dHJpYnV0ZSgnc3RyaXAtd2hpdGVzcGFjZScsICcnKTsKICAgICAgfSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgVVJMIG9mIGFuIGltYWdlIGZvciB0aGUgaWNvbi4gSWYgdGhlIHNyYyBwcm9wZXJ0eSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICogdGhlIGljb24gcHJvcGVydHkgc2hvdWxkIG5vdCBiZS4KICAgICAgICAgKi8KICAgICAgICBzcmM6IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTcGVjaWZpZXMgdGhlIGljb24gbmFtZSBvciBpbmRleCBpbiB0aGUgc2V0IG9mIGljb25zIGF2YWlsYWJsZSBpbgogICAgICAgICAqIHRoZSBpY29uJ3MgaWNvbiBzZXQuIElmIHRoZSBpY29uIHByb3BlcnR5IGlzIHNwZWNpZmllZCwKICAgICAgICAgKiB0aGUgc3JjIHByb3BlcnR5IHNob3VsZCBub3QgYmUuCiAgICAgICAgICovCiAgICAgICAgaWNvbjoge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFNwZWNpZmllcyB0aGUgYWx0ZXJuYXRlIHRleHQgZm9yIHRoZSBidXR0b24sIGZvciBhY2Nlc3NpYmlsaXR5LgogICAgICAgICAqLwogICAgICAgIGFsdDoge3R5cGU6IFN0cmluZywgb2JzZXJ2ZXI6ICdfYWx0Q2hhbmdlZCd9CiAgICAgIH0sCgogICAgICBfYWx0Q2hhbmdlZDogZnVuY3Rpb24obmV3VmFsdWUsIG9sZFZhbHVlKSB7CiAgICAgICAgdmFyIGxhYmVsID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnKTsKCiAgICAgICAgLy8gRG9uJ3Qgc3RvbXAgb3ZlciBhIHVzZXItc2V0IGFyaWEtbGFiZWwuCiAgICAgICAgaWYgKCFsYWJlbCB8fCBvbGRWYWx1ZSA9PSBsYWJlbCkgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWwnLCBuZXdWYWx1ZSk7CiAgICAgICAgfQogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgIGBpcm9uLWF1dG9ncm93LXRleHRhcmVhYCBpcyBhbiBlbGVtZW50IGNvbnRhaW5pbmcgYSB0ZXh0YXJlYSB0aGF0IGdyb3dzIGluCiAgICBoZWlnaHQgYXMgbW9yZSBsaW5lcyBvZiBpbnB1dCBhcmUgZW50ZXJlZC4gVW5sZXNzIGFuIGV4cGxpY2l0IGhlaWdodCBvciB0aGUKICAgIGBtYXhSb3dzYCBwcm9wZXJ0eSBpcyBzZXQsIGl0IHdpbGwgbmV2ZXIgc2Nyb2xsLgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxpcm9uLWF1dG9ncm93LXRleHRhcmVhPjwvaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYT4KCiAgICAjIyMgU3R5bGluZwoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWFgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdGV4dGFyZWEgfCBge31gCiAgICBgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHRleHRhcmVhIHBsYWNlaG9sZGVyIHwgYHt9YAoKICAgIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgKi8KICAgIFBvbHltZXIoewogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2lkdGg6IDQwMHB4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkOwogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICAtbW96LWFwcGVhcmFuY2U6IHRleHRhcmVhOwogICAgICAgIC13ZWJraXQtYXBwZWFyYW5jZTogdGV4dGFyZWE7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLm1pcnJvci10ZXh0IHsKICAgICAgICB2aXNpYmlsaXR5OiBoaWRkZW47CiAgICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIC5maXQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgcmVzaXplOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IGluaGVyaXQ7CiAgICAgICAgY29sb3I6IGluaGVyaXQ7CiAgICAgICAgLyogc2VlIGNvbW1lbnRzIGluIHRlbXBsYXRlICovCiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogaW5oZXJpdDsKICAgICAgICBmb250LWZhbWlseTogaW5oZXJpdDsKICAgICAgICBsaW5lLWhlaWdodDogaW5oZXJpdDsKICAgICAgICB0ZXh0LWFsaWduOiBpbmhlcml0OwogICAgICAgIEBhcHBseSAtLWlyb24tYXV0b2dyb3ctdGV4dGFyZWE7CiAgICAgIH0KCiAgICAgIHRleHRhcmVhOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTotbW96LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CgogICAgICB0ZXh0YXJlYTo6LW1vei1wbGFjZWhvbGRlciB7CiAgICAgICAgQGFwcGx5IC0taXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYS1wbGFjZWhvbGRlcjsKICAgICAgfQoKICAgICAgdGV4dGFyZWE6LW1zLWlucHV0LXBsYWNlaG9sZGVyIHsKICAgICAgICBAYXBwbHkgLS1pcm9uLWF1dG9ncm93LXRleHRhcmVhLXBsYWNlaG9sZGVyOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDwhLS0gdGhlIG1pcnJvciBzaXplcyB0aGUgaW5wdXQvdGV4dGFyZWEgc28gaXQgZ3Jvd3Mgd2l0aCB0eXBpbmcgLS0+CiAgICA8IS0tIHVzZSAmIzE2MDsgaW5zdGVhZCAmbmJzcDsgb2YgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIGJlIHVzZWQgaW4gWEhUTUwgLS0+CiAgICA8ZGl2IGlkPSJtaXJyb3IiIGNsYXNzPSJtaXJyb3ItdGV4dCIgYXJpYS1oaWRkZW49InRydWUiPiZuYnNwOzwvZGl2PgoKICAgIDwhLS0gc2l6ZSB0aGUgaW5wdXQvdGV4dGFyZWEgd2l0aCBhIGRpdiwgYmVjYXVzZSB0aGUgdGV4dGFyZWEgaGFzIGludHJpbnNpYyBzaXplIGluIGZmIC0tPgogICAgPGRpdiBjbGFzcz0idGV4dGFyZWEtY29udGFpbmVyIGZpdCI+CiAgICAgIDx0ZXh0YXJlYSBpZD0idGV4dGFyZWEiIG5hbWUkPSJbW25hbWVdXSIgYXJpYS1sYWJlbCQ9IltbbGFiZWxdXSIgYXV0b2NvbXBsZXRlJD0iW1thdXRvY29tcGxldGVdXSIgYXV0b2ZvY3VzJD0iW1thdXRvZm9jdXNdXSIgYXV0b2NhcGl0YWxpemUkPSJbW2F1dG9jYXBpdGFsaXplXV0iIGlucHV0bW9kZSQ9IltbaW5wdXRtb2RlXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiByb3dzJD0iW1tyb3dzXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iPjwvdGV4dGFyZWE+CiAgICA8L2Rpdj4KYCwKCiAgICAgIGlzOiAnaXJvbi1hdXRvZ3Jvdy10ZXh0YXJlYScsCiAgICAgIGJlaGF2aW9yczogW0lyb25WYWxpZGF0YWJsZUJlaGF2aW9yLCBJcm9uQ29udHJvbFN0YXRlXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgdGhpcyBwcm9wZXJ0eSBpbnN0ZWFkIG9mIGBiaW5kLXZhbHVlYCBmb3IgdHdvLXdheSBkYXRhIGJpbmRpbmcuCiAgICAgICAgICogQHR5cGUge3N0cmluZ3xudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgdmFsdWU6IHtvYnNlcnZlcjogJ192YWx1ZUNoYW5nZWQnLCB0eXBlOiBTdHJpbmcsIG5vdGlmeTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZCwgYW5kIGp1c3QgbWlycm9ycyBgdmFsdWVgLiBVc2UgYHZhbHVlYAogICAgICAgICAqIGluc3RlYWQuCiAgICAgICAgICogQHR5cGUge3N0cmluZ3xudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgYmluZFZhbHVlOiB7b2JzZXJ2ZXI6ICdfYmluZFZhbHVlQ2hhbmdlZCcsIHR5cGU6IFN0cmluZywgbm90aWZ5OiB0cnVlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGluaXRpYWwgbnVtYmVyIG9mIHJvd3MuCiAgICAgICAgICoKICAgICAgICAgKiBAYXR0cmlidXRlIHJvd3MKICAgICAgICAgKiBAdHlwZSBudW1iZXIKICAgICAgICAgKiBAZGVmYXVsdCAxCiAgICAgICAgICovCiAgICAgICAgcm93czoge3R5cGU6IE51bWJlciwgdmFsdWU6IDEsIG9ic2VydmVyOiAnX3VwZGF0ZUNhY2hlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2Ygcm93cyB0aGlzIGVsZW1lbnQgY2FuIGdyb3cgdG8gdW50aWwgaXQKICAgICAgICAgKiBzY3JvbGxzLiAwIG1lYW5zIG5vIG1heGltdW0uCiAgICAgICAgICoKICAgICAgICAgKiBAYXR0cmlidXRlIG1heFJvd3MKICAgICAgICAgKiBAdHlwZSBudW1iZXIKICAgICAgICAgKiBAZGVmYXVsdCAwCiAgICAgICAgICovCiAgICAgICAgbWF4Um93czoge3R5cGU6IE51bWJlciwgdmFsdWU6IDAsIG9ic2VydmVyOiAnX3VwZGF0ZUNhY2hlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCb3VuZCB0byB0aGUgdGV4dGFyZWEncyBgYXV0b2NvbXBsZXRlYCBhdHRyaWJ1dGUuCiAgICAgICAgICovCiAgICAgICAgYXV0b2NvbXBsZXRlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ29mZid9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCb3VuZCB0byB0aGUgdGV4dGFyZWEncyBgYXV0b2ZvY3VzYCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBAdHlwZSB7IWJvb2xlYW59CiAgICAgICAgICovCiAgICAgICAgYXV0b2ZvY3VzOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQm91bmQgdG8gdGhlIHRleHRhcmVhJ3MgYGF1dG9jYXBpdGFsaXplYCBhdHRyaWJ1dGUuCiAgICAgICAgICovCiAgICAgICAgYXV0b2NhcGl0YWxpemU6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnbm9uZSd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCb3VuZCB0byB0aGUgdGV4dGFyZWEncyBgaW5wdXRtb2RlYCBhdHRyaWJ1dGUuCiAgICAgICAgICovCiAgICAgICAgaW5wdXRtb2RlOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQm91bmQgdG8gdGhlIHRleHRhcmVhJ3MgYHBsYWNlaG9sZGVyYCBhdHRyaWJ1dGUuCiAgICAgICAgICovCiAgICAgICAgcGxhY2Vob2xkZXI6IHt0eXBlOiBTdHJpbmd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCb3VuZCB0byB0aGUgdGV4dGFyZWEncyBgcmVhZG9ubHlgIGF0dHJpYnV0ZS4KICAgICAgICAgKi8KICAgICAgICByZWFkb25seToge3R5cGU6IFN0cmluZ30sCgogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIG1hcmsgdGhlIHRleHRhcmVhIGFzIHJlcXVpcmVkLgogICAgICAgICAqLwogICAgICAgIHJlcXVpcmVkOiB7dHlwZTogQm9vbGVhbn0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBtaW5pbXVtIGxlbmd0aCBvZiB0aGUgaW5wdXQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgbWlubGVuZ3RoOiB7dHlwZTogTnVtYmVyfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1heGltdW0gbGVuZ3RoIG9mIHRoZSBpbnB1dCB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBtYXhsZW5ndGg6IHt0eXBlOiBOdW1iZXJ9LAoKICAgICAgICAvKioKICAgICAgICAgKiBCb3VuZCB0byB0aGUgdGV4dGFyZWEncyBgYXJpYS1sYWJlbGAgYXR0cmlidXRlLgogICAgICAgICAqLwogICAgICAgIGxhYmVsOiB7dHlwZTogU3RyaW5nfQoKICAgICAgfSwKCiAgICAgIGxpc3RlbmVyczogeydpbnB1dCc6ICdfb25JbnB1dCd9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgdGV4dGFyZWEuCiAgICAgICAqIEByZXR1cm4geyFIVE1MVGV4dEFyZWFFbGVtZW50fQogICAgICAgKi8KICAgICAgZ2V0IHRleHRhcmVhKCkgewogICAgICAgIHJldHVybiAvKiogQHR5cGUgeyFIVE1MVGV4dEFyZWFFbGVtZW50fSAqLyAodGhpcy4kLnRleHRhcmVhKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRleHRhcmVhJ3Mgc2VsZWN0aW9uIHN0YXJ0LgogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICAgICAqLwogICAgICBnZXQgc2VsZWN0aW9uU3RhcnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIHRleHRhcmVhJ3Mgc2VsZWN0aW9uIGVuZC4KICAgICAgICogQHJldHVybiB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IHNlbGVjdGlvbkVuZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kLnRleHRhcmVhLnNlbGVjdGlvbkVuZDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSB0ZXh0YXJlYSdzIHNlbGVjdGlvbiBzdGFydC4KICAgICAgICovCiAgICAgIHNldCBzZWxlY3Rpb25TdGFydCh2YWx1ZSkgewogICAgICAgIHRoaXMuJC50ZXh0YXJlYS5zZWxlY3Rpb25TdGFydCA9IHZhbHVlOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNldHMgdGhlIHRleHRhcmVhJ3Mgc2VsZWN0aW9uIGVuZC4KICAgICAgICovCiAgICAgIHNldCBzZWxlY3Rpb25FbmQodmFsdWUpIHsKICAgICAgICB0aGlzLiQudGV4dGFyZWEuc2VsZWN0aW9uRW5kID0gdmFsdWU7CiAgICAgIH0sCgogICAgICAvKiogQG92ZXJyaWRlICovCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAvKiBpT1MgaGFzIGFuIGFyYml0cmFyeSBsZWZ0IG1hcmdpbiBvZiAzcHggdGhhdCBpc24ndCBwcmVzZW50CiAgICAgICAgICogaW4gYW55IG90aGVyIGJyb3dzZXIsIGFuZCBtZWFucyB0aGF0IHRoZSBwYXBlci10ZXh0YXJlYSdzIGN1cnNvcgogICAgICAgICAqIG92ZXJsYXBzIHRoZSBsYWJlbC4KICAgICAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL1BvbHltZXJFbGVtZW50cy9wYXBlci1pbnB1dC9pc3N1ZXMvNDY4LgogICAgICAgICAqLwogICAgICAgIHZhciBJU19JT1MgPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9pUCg/OltvYV1kfGhvbmUpLykgJiYKICAgICAgICAgICAgIW5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL09TIDFbMzQ1Njc4OV0vKTsKICAgICAgICBpZiAoSVNfSU9TKSB7CiAgICAgICAgICB0aGlzLiQudGV4dGFyZWEuc3R5bGUubWFyZ2luTGVmdCA9ICctM3B4JzsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0cnVlIGlmIGB2YWx1ZWAgaXMgdmFsaWQuIFRoZSB2YWxpZGF0b3IgcHJvdmlkZWQgaW4gYHZhbGlkYXRvcmAKICAgICAgICogd2lsbCBiZSB1c2VkIGZpcnN0LCBpZiBpdCBleGlzdHM7IG90aGVyd2lzZSwgdGhlIGB0ZXh0YXJlYWAncyB2YWxpZGl0eQogICAgICAgKiBpcyB1c2VkLgogICAgICAgKiBAcmV0dXJuIHtib29sZWFufSBUcnVlIGlmIHRoZSB2YWx1ZSBpcyB2YWxpZC4KICAgICAgICovCiAgICAgIHZhbGlkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBVc2UgdGhlIG5lc3RlZCBpbnB1dCdzIG5hdGl2ZSB2YWxpZGl0eS4KICAgICAgICB2YXIgdmFsaWQgPSB0aGlzLiQudGV4dGFyZWEudmFsaWRpdHkudmFsaWQ7CgogICAgICAgIC8vIE9ubHkgZG8gZXh0cmEgY2hlY2tpbmcgaWYgdGhlIGJyb3dzZXIgdGhvdWdodCB0aGlzIHdhcyB2YWxpZC4KICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgIC8vIEVtcHR5LCByZXF1aXJlZCBpbnB1dCBpcyBpbnZhbGlkCiAgICAgICAgICBpZiAodGhpcy5yZXF1aXJlZCAmJiB0aGlzLnZhbHVlID09PSAnJykgewogICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc1ZhbGlkYXRvcigpKSB7CiAgICAgICAgICAgIHZhbGlkID0gSXJvblZhbGlkYXRhYmxlQmVoYXZpb3IudmFsaWRhdGUuY2FsbCh0aGlzLCB0aGlzLnZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuaW52YWxpZCA9ICF2YWxpZDsKICAgICAgICB0aGlzLmZpcmUoJ2lyb24taW5wdXQtdmFsaWRhdGUnKTsKICAgICAgICByZXR1cm4gdmFsaWQ7CiAgICAgIH0sCgogICAgICBfYmluZFZhbHVlQ2hhbmdlZDogZnVuY3Rpb24oYmluZFZhbHVlKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IGJpbmRWYWx1ZTsKICAgICAgfSwKCiAgICAgIF92YWx1ZUNoYW5nZWQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFyIHRleHRhcmVhID0gdGhpcy50ZXh0YXJlYTsKICAgICAgICBpZiAoIXRleHRhcmVhKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGUgYmluZFZhbHVlIGNoYW5nZWQgbWFudWFsbHksIHRoZW4gd2UgbmVlZCB0byBhbHNvIHVwZGF0ZQogICAgICAgIC8vIHRoZSB1bmRlcmx5aW5nIHRleHRhcmVhJ3MgdmFsdWUuIE90aGVyd2lzZSB0aGlzIGNoYW5nZSB3YXMgcHJvYmFibHkKICAgICAgICAvLyBnZW5lcmF0ZWQgZnJvbSB0aGUgX29uSW5wdXQgaGFuZGxlciwgYW5kIHRoZSB0d28gdmFsdWVzIGFyZSBhbHJlYWR5CiAgICAgICAgLy8gdGhlIHNhbWUuCiAgICAgICAgaWYgKHRleHRhcmVhLnZhbHVlICE9PSB2YWx1ZSkgewogICAgICAgICAgdGV4dGFyZWEudmFsdWUgPSAhKHZhbHVlIHx8IHZhbHVlID09PSAwKSA/ICcnIDogdmFsdWU7CiAgICAgICAgfQoKICAgICAgICB0aGlzLmJpbmRWYWx1ZSA9IHZhbHVlOwogICAgICAgIHRoaXMuJC5taXJyb3IuaW5uZXJIVE1MID0gdGhpcy5fdmFsdWVGb3JNaXJyb3IoKTsKCiAgICAgICAgLy8gTWFudWFsbHkgbm90aWZ5IGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBub3RpZnkgdW50aWwgYWZ0ZXIgc2V0dGluZwogICAgICAgIC8vIHZhbHVlLgogICAgICAgIHRoaXMuZmlyZSgnYmluZC12YWx1ZS1jaGFuZ2VkJywge3ZhbHVlOiB0aGlzLmJpbmRWYWx1ZX0pOwogICAgICB9LAoKICAgICAgX29uSW5wdXQ6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdmFyIGV2ZW50UGF0aCA9IGRvbShldmVudCkucGF0aDsKICAgICAgICB0aGlzLnZhbHVlID0gZXZlbnRQYXRoID8gZXZlbnRQYXRoWzBdLnZhbHVlIDogZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICB9LAoKICAgICAgX2NvbnN0cmFpbjogZnVuY3Rpb24odG9rZW5zKSB7CiAgICAgICAgdmFyIF90b2tlbnM7CiAgICAgICAgdG9rZW5zID0gdG9rZW5zIHx8IFsnJ107CiAgICAgICAgLy8gRW5mb3JjZSB0aGUgbWluIGFuZCBtYXggaGVpZ2h0cyBmb3IgYSBtdWx0aWxpbmUgaW5wdXQgdG8gYXZvaWQKICAgICAgICAvLyBtZWFzdXJlbWVudAogICAgICAgIGlmICh0aGlzLm1heFJvd3MgPiAwICYmIHRva2Vucy5sZW5ndGggPiB0aGlzLm1heFJvd3MpIHsKICAgICAgICAgIF90b2tlbnMgPSB0b2tlbnMuc2xpY2UoMCwgdGhpcy5tYXhSb3dzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgX3Rva2VucyA9IHRva2Vucy5zbGljZSgwKTsKICAgICAgICB9CiAgICAgICAgd2hpbGUgKHRoaXMucm93cyA+IDAgJiYgX3Rva2Vucy5sZW5ndGggPCB0aGlzLnJvd3MpIHsKICAgICAgICAgIF90b2tlbnMucHVzaCgnJyk7CiAgICAgICAgfQogICAgICAgIC8vIFVzZSAmIzE2MDsgaW5zdGVhZCAmbmJzcDsgb2YgdG8gYWxsb3cgdGhpcyBlbGVtZW50IHRvIGJlIHVzZWQgaW4gWEhUTUwuCiAgICAgICAgcmV0dXJuIF90b2tlbnMuam9pbignPGJyLz4nKSArICcmIzE2MDsnOwogICAgICB9LAoKICAgICAgX3ZhbHVlRm9yTWlycm9yOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaW5wdXQgPSB0aGlzLnRleHRhcmVhOwogICAgICAgIGlmICghaW5wdXQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy50b2tlbnMgPSAoaW5wdXQgJiYgaW5wdXQudmFsdWUpID8gaW5wdXQudmFsdWUucmVwbGFjZSgvJi9nbSwgJyZhbXA7JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyIvZ20sICcmcXVvdDsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nbSwgJyYjMzk7JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzwvZ20sICcmbHQ7JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLz4vZ20sICcmZ3Q7JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnNwbGl0KCdcbicpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJyddOwogICAgICAgIHJldHVybiB0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpOwogICAgICB9LAoKICAgICAgX3VwZGF0ZUNhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy4kLm1pcnJvci5pbm5lckhUTUwgPSB0aGlzLl9jb25zdHJhaW4odGhpcy50b2tlbnMpOwogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKgogICAgYDxwYXBlci10ZXh0YXJlYT5gIGlzIGEgbXVsdGktbGluZSB0ZXh0IGZpZWxkIHdpdGggTWF0ZXJpYWwgRGVzaWduIHN0eWxpbmcuCgogICAgICAgIDxwYXBlci10ZXh0YXJlYSBsYWJlbD0iVGV4dGFyZWEgbGFiZWwiPjwvcGFwZXItdGV4dGFyZWE+CgogICAgU2VlIGBQb2x5bWVyLlBhcGVySW5wdXRCZWhhdmlvcmAgZm9yIG1vcmUgQVBJIGRvY3MuCgogICAgIyMjIFZhbGlkYXRpb24KCiAgICBDdXJyZW50bHkgb25seSBgcmVxdWlyZWRgIGFuZCBgbWF4bGVuZ3RoYCB2YWxpZGF0aW9uIGlzIHN1cHBvcnRlZC4KCiAgICAjIyMgU3R5bGluZwoKICAgIFNlZSBgUG9seW1lci5QYXBlcklucHV0Q29udGFpbmVyYCBmb3IgYSBsaXN0IG9mIGN1c3RvbSBwcm9wZXJ0aWVzIHVzZWQgdG8KICAgIHN0eWxlIHRoaXMgZWxlbWVudC4KICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgLyoqIEBvdmVycmlkZSAqLwogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGxhYmVsIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8cGFwZXItaW5wdXQtY29udGFpbmVyIG5vLWxhYmVsLWZsb2F0JD0iW1tub0xhYmVsRmxvYXRdXSIgYWx3YXlzLWZsb2F0LWxhYmVsPSJbW19jb21wdXRlQWx3YXlzRmxvYXRMYWJlbChhbHdheXNGbG9hdExhYmVsLHBsYWNlaG9sZGVyKV1dIiBhdXRvLXZhbGlkYXRlJD0iW1thdXRvVmFsaWRhdGVdXSIgZGlzYWJsZWQkPSJbW2Rpc2FibGVkXV0iIGludmFsaWQ9IltbaW52YWxpZF1dIj4KCiAgICAgIDxsYWJlbCBoaWRkZW4kPSJbWyFsYWJlbF1dIiBhcmlhLWhpZGRlbj0idHJ1ZSIgZm9yJD0iW1tfaW5wdXRJZF1dIiBzbG90PSJsYWJlbCI+W1tsYWJlbF1dPC9sYWJlbD4KCiAgICAgIDxpcm9uLWF1dG9ncm93LXRleHRhcmVhIGNsYXNzPSJwYXBlci1pbnB1dC1pbnB1dCIgc2xvdD0iaW5wdXQiIGlkJD0iW1tfaW5wdXRJZF1dIiBhcmlhLWxhYmVsbGVkYnkkPSJbW19hcmlhTGFiZWxsZWRCeV1dIiBhcmlhLWRlc2NyaWJlZGJ5JD0iW1tfYXJpYURlc2NyaWJlZEJ5XV0iIGJpbmQtdmFsdWU9Int7dmFsdWV9fSIgaW52YWxpZD0ie3tpbnZhbGlkfX0iIHZhbGlkYXRvciQ9IltbdmFsaWRhdG9yXV0iIGRpc2FibGVkJD0iW1tkaXNhYmxlZF1dIiBhdXRvY29tcGxldGUkPSJbW2F1dG9jb21wbGV0ZV1dIiBhdXRvZm9jdXMkPSJbW2F1dG9mb2N1c11dIiBpbnB1dG1vZGUkPSJbW2lucHV0bW9kZV1dIiBuYW1lJD0iW1tuYW1lXV0iIHBsYWNlaG9sZGVyJD0iW1twbGFjZWhvbGRlcl1dIiByZWFkb25seSQ9IltbcmVhZG9ubHldXSIgcmVxdWlyZWQkPSJbW3JlcXVpcmVkXV0iIG1pbmxlbmd0aCQ9IltbbWlubGVuZ3RoXV0iIG1heGxlbmd0aCQ9IltbbWF4bGVuZ3RoXV0iIGF1dG9jYXBpdGFsaXplJD0iW1thdXRvY2FwaXRhbGl6ZV1dIiByb3dzJD0iW1tyb3dzXV0iIG1heC1yb3dzJD0iW1ttYXhSb3dzXV0iIG9uLWNoYW5nZT0iX29uQ2hhbmdlIj48L2lyb24tYXV0b2dyb3ctdGV4dGFyZWE+CgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZXJyb3JNZXNzYWdlXV0iPgogICAgICAgIDxwYXBlci1pbnB1dC1lcnJvciBhcmlhLWxpdmU9ImFzc2VydGl2ZSIgc2xvdD0iYWRkLW9uIj5bW2Vycm9yTWVzc2FnZV1dPC9wYXBlci1pbnB1dC1lcnJvcj4KICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFyQ291bnRlcl1dIj4KICAgICAgICA8cGFwZXItaW5wdXQtY2hhci1jb3VudGVyIHNsb3Q9ImFkZC1vbiI+PC9wYXBlci1pbnB1dC1jaGFyLWNvdW50ZXI+CiAgICAgIDwvdGVtcGxhdGU+CgogICAgPC9wYXBlci1pbnB1dC1jb250YWluZXI+CmAsCgogICAgICBpczogJ3BhcGVyLXRleHRhcmVhJywKCiAgICAgIGJlaGF2aW9yczogWwogICAgICAgIFBhcGVySW5wdXRCZWhhdmlvciwKICAgICAgICBJcm9uRm9ybUVsZW1lbnRCZWhhdmlvciwKICAgICAgXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICBfYXJpYUxhYmVsbGVkQnk6IHsKICAgICAgICAgIG9ic2VydmVyOiAnX2FyaWFMYWJlbGxlZEJ5Q2hhbmdlZCcsCiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSwKCiAgICAgICAgX2FyaWFEZXNjcmliZWRCeTogewogICAgICAgICAgb2JzZXJ2ZXI6ICdfYXJpYURlc2NyaWJlZEJ5Q2hhbmdlZCcsCiAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSwKCiAgICAgICAgdmFsdWU6IHsKICAgICAgICAgIC8vIFJlcXVpcmVkIGZvciB0aGUgY29ycmVjdCBUeXBlU2NyaXB0IHR5cGUtZ2VuZXJhdGlvbgogICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBpbml0aWFsIG51bWJlciBvZiByb3dzLgogICAgICAgICAqIEB0eXBlIHtudW1iZXJ9CiAgICAgICAgICogQGRlZmF1bHQgMQogICAgICAgICAqLwogICAgICAgIHJvd3M6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIHZhbHVlOiAxLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiByb3dzIHRoaXMgZWxlbWVudCBjYW4gZ3JvdyB0byB1bnRpbCBpdAogICAgICAgICAqIHNjcm9sbHMuIDAgbWVhbnMgbm8gbWF4aW11bS4KICAgICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgICAqIEBkZWZhdWx0IDAKICAgICAgICAgKi8KICAgICAgICBtYXhSb3dzOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICB9LAogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge251bWJlcn0KICAgICAgICovCiAgICAgIGdldCBzZWxlY3Rpb25TdGFydCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0OwogICAgICB9LAoKICAgICAgc2V0IHNlbGVjdGlvblN0YXJ0KHN0YXJ0KSB7CiAgICAgICAgdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvblN0YXJ0ID0gc3RhcnQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHJldHVybiB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IHNlbGVjdGlvbkVuZCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZDsKICAgICAgfSwKCiAgICAgIHNldCBzZWxlY3Rpb25FbmQoZW5kKSB7CiAgICAgICAgdGhpcy4kLmlucHV0LnRleHRhcmVhLnNlbGVjdGlvbkVuZCA9IGVuZDsKICAgICAgfSwKCiAgICAgIF9hcmlhTGFiZWxsZWRCeUNoYW5nZWQ6IGZ1bmN0aW9uKGFyaWFMYWJlbGxlZEJ5KSB7CiAgICAgICAgdGhpcy5fZm9jdXNhYmxlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGFyaWFMYWJlbGxlZEJ5KTsKICAgICAgfSwKCiAgICAgIF9hcmlhRGVzY3JpYmVkQnlDaGFuZ2VkOiBmdW5jdGlvbihhcmlhRGVzY3JpYmVkQnkpIHsKICAgICAgICB0aGlzLl9mb2N1c2FibGVFbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1kZXNjcmliZWRieScsIGFyaWFEZXNjcmliZWRCeSk7CiAgICAgIH0sCgogICAgICBnZXQgX2ZvY3VzYWJsZUVsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5wdXRFbGVtZW50LnRleHRhcmVhOwogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KICAgIGNvbnN0ICRfZG9jdW1lbnRDb250YWluZXIkMyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDMuc2V0QXR0cmlidXRlKCdzdHlsZScsICdkaXNwbGF5OiBub25lOycpOwoKICAgICRfZG9jdW1lbnRDb250YWluZXIkMy5pbm5lckhUTUwgPSBgPGRvbS1tb2R1bGUgaWQ9InBhcGVyLWl0ZW0tc2hhcmVkLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCwgLnBhcGVyLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1wYXBlci1pdGVtLW1pbi1oZWlnaHQsIDQ4cHgpOwogICAgICAgIHBhZGRpbmc6IDBweCAxNnB4OwogICAgICB9CgogICAgICAucGFwZXItaXRlbSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1zdWJoZWFkOwogICAgICAgIGJvcmRlcjpub25lOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQoKICAgICAgOmhvc3QoW2hpZGRlbl0pLCAucGFwZXItaXRlbVtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KC5pcm9uLXNlbGVjdGVkKSwgLnBhcGVyLWl0ZW0uaXJvbi1zZWxlY3RlZCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQtd2VpZ2h0LCBib2xkKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1zZWxlY3RlZDsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSksIC5wYXBlci1pdGVtW2Rpc2FibGVkXSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tZGlzYWJsZWQtY29sb3IsIHZhcigtLWRpc2FibGVkLXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbS1kaXNhYmxlZDsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSwgLnBhcGVyLWl0ZW06Zm9jdXMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdXRsaW5lOiAwOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1pdGVtLWZvY3VzZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cyk6YmVmb3JlLCAucGFwZXItaXRlbTpmb2N1czpiZWZvcmUgewogICAgICAgIEBhcHBseSAtLWxheW91dC1maXQ7CgogICAgICAgIGJhY2tncm91bmQ6IGN1cnJlbnRDb2xvcjsKICAgICAgICBjb250ZW50OiAnJzsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1kYXJrLWRpdmlkZXItb3BhY2l0eSk7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tZm9jdXNlZC1iZWZvcmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkX2RvY3VtZW50Q29udGFpbmVyJDMuY29udGVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoKICAgIGBQYXBlckl0ZW1CZWhhdmlvcmAgaXMgYSBjb252ZW5pZW5jZSBiZWhhdmlvciBzaGFyZWQgYnkgPHBhcGVyLWl0ZW0+IGFuZAogICAgPHBhcGVyLWljb24taXRlbT4gdGhhdCBtYW5hZ2VzIHRoZSBzaGFyZWQgY29udHJvbCBzdGF0ZXMgYW5kIGF0dHJpYnV0ZXMgb2YKICAgIHRoZSBpdGVtcy4KICAgICovCiAgICAvKiogQHBvbHltZXJCZWhhdmlvciBQYXBlckl0ZW1CZWhhdmlvciAqLwogICAgY29uc3QgUGFwZXJJdGVtQmVoYXZpb3JJbXBsID0gewogICAgICBob3N0QXR0cmlidXRlczoge3JvbGU6ICdvcHRpb24nLCB0YWJpbmRleDogJzAnfQogICAgfTsKCiAgICAvKiogQHBvbHltZXJCZWhhdmlvciAqLwogICAgY29uc3QgUGFwZXJJdGVtQmVoYXZpb3IgPQogICAgICAgIFtJcm9uQnV0dG9uU3RhdGUsIElyb25Db250cm9sU3RhdGUsIFBhcGVySXRlbUJlaGF2aW9ySW1wbF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbTGlzdHNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9saXN0cy5odG1sKQoKICAgIGA8cGFwZXItaXRlbT5gIGlzIGFuIGludGVyYWN0aXZlIGxpc3QgaXRlbS4gQnkgZGVmYXVsdCwgaXQgaXMgYSBob3Jpem9udGFsCiAgICBmbGV4Ym94LgoKICAgICAgICA8cGFwZXItaXRlbT5JdGVtPC9wYXBlci1pdGVtPgoKICAgIFVzZSB0aGlzIGVsZW1lbnQgd2l0aCBgPHBhcGVyLWl0ZW0tYm9keT5gIHRvIG1ha2UgTWF0ZXJpYWwgRGVzaWduIHN0eWxlZAogICAgdHdvLWxpbmUgYW5kIHRocmVlLWxpbmUgaXRlbXMuCgogICAgICAgIDxwYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0tYm9keSB0d28tbGluZT4KICAgICAgICAgICAgPGRpdj5TaG93IHlvdXIgc3RhdHVzPC9kaXY+CiAgICAgICAgICAgIDxkaXYgc2Vjb25kYXJ5PllvdXIgc3RhdHVzIGlzIHZpc2libGUgdG8gZXZlcnlvbmU8L2Rpdj4KICAgICAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJ3YXJuaW5nIj48L2lyb24taWNvbj4KICAgICAgICA8L3BhcGVyLWl0ZW0+CgogICAgVG8gdXNlIGBwYXBlci1pdGVtYCBhcyBhIGxpbmssIHdyYXAgaXQgaW4gYW4gYW5jaG9yIHRhZy4gU2luY2UgYHBhcGVyLWl0ZW1gIHdpbGwKICAgIGFscmVhZHkgcmVjZWl2ZSBmb2N1cywgeW91IG1heSB3YW50IHRvIHByZXZlbnQgdGhlIGFuY2hvciB0YWcgZnJvbSByZWNlaXZpbmcKICAgIGZvY3VzIGFzIHdlbGwgYnkgc2V0dGluZyBpdHMgdGFiaW5kZXggdG8gLTEuCgogICAgICAgIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnBvbHltZXItcHJvamVjdC5vcmcvIiB0YWJpbmRleD0iLTEiPgogICAgICAgICAgPHBhcGVyLWl0ZW0gcmFpc2VkPlBvbHltZXIgUHJvamVjdDwvcGFwZXItaXRlbT4KICAgICAgICA8L2E+CgogICAgSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgcGVyZm9ybWFuY2UgYW5kIHdhbnQgdG8gdXNlIGBwYXBlci1pdGVtYCBpbiBhCiAgICBgcGFwZXItbGlzdGJveGAgd2l0aCBtYW55IGl0ZW1zLCB5b3UgY2FuIGp1c3QgdXNlIGEgbmF0aXZlIGBidXR0b25gIHdpdGggdGhlCiAgICBgcGFwZXItaXRlbWAgY2xhc3MgYXBwbGllZCAocHJvdmlkZWQgeW91IGhhdmUgY29ycmVjdGx5IGluY2x1ZGVkIHRoZSBzaGFyZWQKICAgIHN0eWxlcyk6CgogICAgICAgIDxzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIiBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CgogICAgICAgIDxwYXBlci1saXN0Ym94PgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGFwZXItaXRlbSIgcm9sZT0ib3B0aW9uIj5JbmJveDwvYnV0dG9uPgogICAgICAgICAgPGJ1dHRvbiBjbGFzcz0icGFwZXItaXRlbSIgcm9sZT0ib3B0aW9uIj5TdGFycmVkPC9idXR0b24+CiAgICAgICAgICA8YnV0dG9uIGNsYXNzPSJwYXBlci1pdGVtIiByb2xlPSJvcHRpb24iPlNlbnQgbWFpbDwvYnV0dG9uPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KCiAgICAjIyMgU3R5bGluZwoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodGAgfCBNaW5pbXVtIGhlaWdodCBvZiB0aGUgaXRlbSB8IGA0OHB4YAogICAgYC0tcGFwZXItaXRlbWAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBpdGVtIHwgYHt9YAogICAgYC0tcGFwZXItaXRlbS1zZWxlY3RlZC13ZWlnaHRgIHwgVGhlIGZvbnQgd2VpZ2h0IG9mIGEgc2VsZWN0ZWQgaXRlbSB8IGBib2xkYAogICAgYC0tcGFwZXItaXRlbS1zZWxlY3RlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIHNlbGVjdGVkIHBhcGVyLWl0ZW1zIHwgYHt9YAogICAgYC0tcGFwZXItaXRlbS1kaXNhYmxlZC1jb2xvcmAgfCBUaGUgY29sb3IgZm9yIGRpc2FibGVkIHBhcGVyLWl0ZW1zIHwgYC0tZGlzYWJsZWQtdGV4dC1jb2xvcmAKICAgIGAtLXBhcGVyLWl0ZW0tZGlzYWJsZWRgIHwgTWl4aW4gYXBwbGllZCB0byBkaXNhYmxlZCBwYXBlci1pdGVtcyB8IGB7fWAKICAgIGAtLXBhcGVyLWl0ZW0tZm9jdXNlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIGZvY3VzZWQgcGFwZXItaXRlbXMgfCBge31gCiAgICBgLS1wYXBlci1pdGVtLWZvY3VzZWQtYmVmb3JlYCB8IE1peGluIGFwcGxpZWQgdG8gOmJlZm9yZSBmb2N1c2VkIHBhcGVyLWl0ZW1zIHwgYHt9YAoKICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgVGhpcyBlbGVtZW50IGhhcyBgcm9sZT0ibGlzdGl0ZW0iYCBieSBkZWZhdWx0LiBEZXBlbmRpbmcgb24gdXNhZ2UsIGl0IG1heSBiZQogICAgbW9yZSBhcHByb3ByaWF0ZSB0byBzZXQgYHJvbGU9Im1lbnVpdGVtImAsIGByb2xlPSJtZW51aXRlbWNoZWNrYm94ImAgb3IKICAgIGByb2xlPSJtZW51aXRlbXJhZGlvImAuCgogICAgICAgIDxwYXBlci1pdGVtIHJvbGU9Im1lbnVpdGVtY2hlY2tib3giPgogICAgICAgICAgPHBhcGVyLWl0ZW0tYm9keT4KICAgICAgICAgICAgU2hvdyB5b3VyIHN0YXR1cwogICAgICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICAgICAgICA8cGFwZXItY2hlY2tib3g+PC9wYXBlci1jaGVja2JveD4KICAgICAgICA8L3BhcGVyLWl0ZW0+CgogICAgQGdyb3VwIFBhcGVyIEVsZW1lbnRzCiAgICBAZWxlbWVudCBwYXBlci1pdGVtCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLWl0ZW0tc2hhcmVkLXN0eWxlcyI+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzbG90Pjwvc2xvdD4KYCwKCiAgICAgIGlzOiAncGFwZXItaXRlbScsCiAgICAgIGJlaGF2aW9yczogW1BhcGVySXRlbUJlaGF2aW9yXQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoKICAgIFVzZSBgPHBhcGVyLWl0ZW0tYm9keT5gIGluIGEgYDxwYXBlci1pdGVtPmAgb3IgYDxwYXBlci1pY29uLWl0ZW0+YCB0byBtYWtlIHR3by0KICAgIG9yIHRocmVlLSBsaW5lIGl0ZW1zLiBJdCBpcyBhIGZsZXggaXRlbSB0aGF0IGlzIGEgdmVydGljYWwgZmxleGJveC4KCiAgICAgICAgPHBhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgICAgICA8ZGl2PlNob3cgeW91ciBzdGF0dXM8L2Rpdj4KICAgICAgICAgICAgPGRpdiBzZWNvbmRhcnk+WW91ciBzdGF0dXMgaXMgdmlzaWJsZSB0byBldmVyeW9uZTwvZGl2PgogICAgICAgICAgPC9wYXBlci1pdGVtLWJvZHk+CiAgICAgICAgPC9wYXBlci1pdGVtPgoKICAgIFRoZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBgc2Vjb25kYXJ5YCBhdHRyaWJ1dGUgaXMgZ2l2ZW4gc2Vjb25kYXJ5IHRleHQKICAgIHN0eWxpbmcuCgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1pdGVtLWJvZHktdHdvLWxpbmUtbWluLWhlaWdodGAgfCBNaW5pbXVtIGhlaWdodCBvZiBhIHR3by1saW5lIGl0ZW0gfCBgNzJweGAKICAgIGAtLXBhcGVyLWl0ZW0tYm9keS10aHJlZS1saW5lLW1pbi1oZWlnaHRgIHwgTWluaW11bSBoZWlnaHQgb2YgYSB0aHJlZS1saW5lIGl0ZW0gfCBgODhweGAKICAgIGAtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnktY29sb3JgIHwgRm9yZWdyb3VuZCBjb2xvciBmb3IgdGhlIGBzZWNvbmRhcnlgIGFyZWEgfCBgLS1zZWNvbmRhcnktdGV4dC1jb2xvcmAKICAgIGAtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnlgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgYHNlY29uZGFyeWAgYXJlYSB8IGB7fWAKCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIG92ZXJmbG93OiBoaWRkZW47IC8qIG5lZWRlZCBmb3IgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXMgdG8gd29yayBvbiBmZiAqLwogICAgICAgIEBhcHBseSAtLWxheW91dC12ZXJ0aWNhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZmxleDsKICAgICAgfQoKICAgICAgOmhvc3QoW3R3by1saW5lXSkgewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS10d28tbGluZS1taW4taGVpZ2h0LCA3MnB4KTsKICAgICAgfQoKICAgICAgOmhvc3QoW3RocmVlLWxpbmVdKSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tcGFwZXItaXRlbS1ib2R5LXRocmVlLWxpbmUtbWluLWhlaWdodCwgODhweCk7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKCopIHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgIDpob3N0ID4gOjpzbG90dGVkKFtzZWNvbmRhcnldKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1ib2R5MTsKCiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnktY29sb3IsIHZhcigtLXNlY29uZGFyeS10ZXh0LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0tYm9keS1zZWNvbmRhcnk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLAoKICAgICAgaXM6ICdwYXBlci1pdGVtLWJvZHknCiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKgogICAgYDxwYXBlci1pY29uLWl0ZW0+YCBpcyBhIGNvbnZlbmllbmNlIGVsZW1lbnQgdG8gbWFrZSBhbiBpdGVtIHdpdGggaWNvbi4gSXQgaXMgYW4KICAgIGludGVyYWN0aXZlIGxpc3QgaXRlbSB3aXRoIGEgZml4ZWQtd2lkdGggaWNvbiBhcmVhLCBhY2NvcmRpbmcgdG8gTWF0ZXJpYWwKICAgIERlc2lnbi4gVGhpcyBpcyB1c2VmdWwgaWYgdGhlIGljb25zIGFyZSBvZiB2YXJ5aW5nIHdpZHRocywgYnV0IHlvdSB3YW50IHRoZSBpdGVtCiAgICBib2RpZXMgdG8gbGluZSB1cC4gVXNlIHRoaXMgbGlrZSBhIGA8cGFwZXItaXRlbT5gLiBUaGUgY2hpbGQgbm9kZSB3aXRoIHRoZSBzbG90CiAgICBuYW1lIGBpdGVtLWljb25gIGlzIHBsYWNlZCBpbiB0aGUgaWNvbiBhcmVhLgoKICAgICAgICA8cGFwZXItaWNvbi1pdGVtPgogICAgICAgICAgPGlyb24taWNvbiBpY29uPSJmYXZvcml0ZSIgc2xvdD0iaXRlbS1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIEZhdm9yaXRlCiAgICAgICAgPC9wYXBlci1pY29uLWl0ZW0+CiAgICAgICAgPHBhcGVyLWljb24taXRlbT4KICAgICAgICAgIDxkaXYgY2xhc3M9ImF2YXRhciIgc2xvdD0iaXRlbS1pY29uIj48L2Rpdj4KICAgICAgICAgIEF2YXRhcgogICAgICAgIDwvcGFwZXItaWNvbi1pdGVtPgoKICAgICMjIyBTdHlsaW5nCgogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItaXRlbS1pY29uLXdpZHRoYCB8IFdpZHRoIG9mIHRoZSBpY29uIGFyZWEgfCBgNTZweGAKICAgIGAtLXBhcGVyLWl0ZW0taWNvbmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBpY29uIGFyZWEgfCBge31gCiAgICBgLS1wYXBlci1pY29uLWl0ZW1gIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgaXRlbSB8IGB7fWAKICAgIGAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWQtd2VpZ2h0YCB8IFRoZSBmb250IHdlaWdodCBvZiBhIHNlbGVjdGVkIGl0ZW0gfCBgYm9sZGAKICAgIGAtLXBhcGVyLWl0ZW0tc2VsZWN0ZWRgIHwgTWl4aW4gYXBwbGllZCB0byBzZWxlY3RlZCBwYXBlci1pdGVtcyB8IGB7fWAKICAgIGAtLXBhcGVyLWl0ZW0tZGlzYWJsZWQtY29sb3JgIHwgVGhlIGNvbG9yIGZvciBkaXNhYmxlZCBwYXBlci1pdGVtcyB8IGAtLWRpc2FibGVkLXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1pdGVtLWRpc2FibGVkYCB8IE1peGluIGFwcGxpZWQgdG8gZGlzYWJsZWQgcGFwZXItaXRlbXMgfCBge31gCiAgICBgLS1wYXBlci1pdGVtLWZvY3VzZWRgIHwgTWl4aW4gYXBwbGllZCB0byBmb2N1c2VkIHBhcGVyLWl0ZW1zIHwgYHt9YAogICAgYC0tcGFwZXItaXRlbS1mb2N1c2VkLWJlZm9yZWAgfCBNaXhpbiBhcHBsaWVkIHRvIDpiZWZvcmUgZm9jdXNlZCBwYXBlci1pdGVtcyB8IGB7fWAKCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZSBpbmNsdWRlPSJwYXBlci1pdGVtLXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtc3ViaGVhZDsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItaXRlbTsKICAgICAgICBAYXBwbHkgLS1wYXBlci1pY29uLWl0ZW07CiAgICAgIH0KCiAgICAgIC5jb250ZW50LWljb24gewogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CgogICAgICAgIHdpZHRoOiB2YXIoLS1wYXBlci1pdGVtLWljb24td2lkdGgsIDU2cHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWl0ZW0taWNvbjsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJjb250ZW50SWNvbiIgY2xhc3M9ImNvbnRlbnQtaWNvbiI+CiAgICAgIDxzbG90IG5hbWU9Iml0ZW0taWNvbiI+PC9zbG90PgogICAgPC9kaXY+CiAgICA8c2xvdD48L3Nsb3Q+CmAsCgogICAgICBpczogJ3BhcGVyLWljb24taXRlbScsCiAgICAgIGJlaGF2aW9yczogW1BhcGVySXRlbUJlaGF2aW9yXQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBAcG9seW1lckJlaGF2aW9yIElyb25NdWx0aVNlbGVjdGFibGVCZWhhdmlvcgogICAgICovCiAgICBjb25zdCBJcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3JJbXBsID0gewogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIG11bHRpcGxlIHNlbGVjdGlvbnMgYXJlIGFsbG93ZWQuCiAgICAgICAgICovCiAgICAgICAgbXVsdGk6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2UsIG9ic2VydmVyOiAnbXVsdGlDaGFuZ2VkJ30sCgogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgb3Igc2V0cyB0aGUgc2VsZWN0ZWQgZWxlbWVudHMuIFRoaXMgaXMgdXNlZCBpbnN0ZWFkIG9mIGBzZWxlY3RlZGAKICAgICAgICAgKiB3aGVuIGBtdWx0aWAgaXMgdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZFZhbHVlczogewogICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgIH0KICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIGN1cnJlbnRseSBzZWxlY3RlZCBpdGVtcy4KICAgICAgICAgKi8KICAgICAgICBzZWxlY3RlZEl0ZW1zOiB7CiAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICB9CiAgICAgICAgfSwKCiAgICAgIH0sCgogICAgICBvYnNlcnZlcnM6IFsnX3VwZGF0ZVNlbGVjdGVkKHNlbGVjdGVkVmFsdWVzLnNwbGljZXMpJ10sCgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gdmFsdWUuIElmIHRoZSBgbXVsdGlgIHByb3BlcnR5IGlzIHRydWUsIHRoZW4gdGhlIHNlbGVjdGVkCiAgICAgICAqIHN0YXRlIG9mIHRoZSBgdmFsdWVgIHdpbGwgYmUgdG9nZ2xlZDsgb3RoZXJ3aXNlIHRoZSBgdmFsdWVgIHdpbGwgYmUKICAgICAgICogc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBtZXRob2Qgc2VsZWN0CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgdGhlIHZhbHVlIHRvIHNlbGVjdC4KICAgICAgICovCiAgICAgIHNlbGVjdDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICBpZiAodGhpcy5tdWx0aSkgewogICAgICAgICAgdGhpcy5fdG9nZ2xlU2VsZWN0ZWQodmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNlbGVjdGVkID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgbXVsdGlDaGFuZ2VkOiBmdW5jdGlvbihtdWx0aSkgewogICAgICAgIHRoaXMuX3NlbGVjdGlvbi5tdWx0aSA9IG11bHRpOwogICAgICAgIHRoaXMuX3VwZGF0ZVNlbGVjdGVkKCk7CiAgICAgIH0sCgogICAgICAvLyBVTlVTRUQsIEZPUiBBUEkgQ09NUEFUSUJJTElUWQogICAgICBnZXQgX3Nob3VsZFVwZGF0ZVNlbGVjdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCAhPSBudWxsIHx8CiAgICAgICAgICAgICh0aGlzLnNlbGVjdGVkVmFsdWVzICE9IG51bGwgJiYgdGhpcy5zZWxlY3RlZFZhbHVlcy5sZW5ndGgpOwogICAgICB9LAoKICAgICAgX3VwZGF0ZUF0dHJGb3JTZWxlY3RlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLm11bHRpKSB7CiAgICAgICAgICBJcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl91cGRhdGVBdHRyRm9yU2VsZWN0ZWQuYXBwbHkodGhpcyk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkSXRlbXMgJiYgdGhpcy5zZWxlY3RlZEl0ZW1zLmxlbmd0aCA+IDApIHsKICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWYWx1ZXMgPQogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcwogICAgICAgICAgICAgICAgICAubWFwKAogICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24oc2VsZWN0ZWRJdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbmRleFRvVmFsdWUodGhpcy5pbmRleE9mKHNlbGVjdGVkSXRlbSkpOwogICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgIHRoaXMpCiAgICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24odW5maWx0ZXJlZFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVuZmlsdGVyZWRWYWx1ZSAhPSBudWxsOwogICAgICAgICAgICAgICAgICB9LCB0aGlzKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfdXBkYXRlU2VsZWN0ZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm11bHRpKSB7CiAgICAgICAgICB0aGlzLl9zZWxlY3RNdWx0aSh0aGlzLnNlbGVjdGVkVmFsdWVzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fc2VsZWN0U2VsZWN0ZWQodGhpcy5zZWxlY3RlZCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3NlbGVjdE11bHRpOiBmdW5jdGlvbih2YWx1ZXMpIHsKICAgICAgICB2YWx1ZXMgPSB2YWx1ZXMgfHwgW107CgogICAgICAgIHZhciBzZWxlY3RlZEl0ZW1zID0KICAgICAgICAgICAgKHRoaXMuX3ZhbHVlc1RvSXRlbXModmFsdWVzKSB8fCBbXSkuZmlsdGVyKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgICAgICByZXR1cm4gaXRlbSAhPT0gbnVsbCAmJiBpdGVtICE9PSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0pOwoKICAgICAgICAvLyBjbGVhciBhbGwgYnV0IHRoZSBjdXJyZW50IHNlbGVjdGVkIGl0ZW1zCiAgICAgICAgdGhpcy5fc2VsZWN0aW9uLmNsZWFyKHNlbGVjdGVkSXRlbXMpOwoKICAgICAgICAvLyBzZWxlY3Qgb25seSB0aG9zZSBub3Qgc2VsZWN0ZWQgeWV0CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzZWxlY3RlZEl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24uc2V0SXRlbVNlbGVjdGVkKHNlbGVjdGVkSXRlbXNbaV0sIHRydWUpOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2hlY2sgZm9yIGl0ZW1zLCBzaW5jZSB0aGlzIGFycmF5IGlzIHBvcHVsYXRlZCBvbmx5IHdoZW4gYXR0YWNoZWQKICAgICAgICBpZiAodGhpcy5mYWxsYmFja1NlbGVjdGlvbiAmJiAhdGhpcy5fc2VsZWN0aW9uLmdldCgpLmxlbmd0aCkgewogICAgICAgICAgdmFyIGZhbGxiYWNrID0gdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5mYWxsYmFja1NlbGVjdGlvbik7CiAgICAgICAgICBpZiAoZmFsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3QodGhpcy5mYWxsYmFja1NlbGVjdGlvbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3NlbGVjdGlvbkNoYW5nZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHMgPSB0aGlzLl9zZWxlY3Rpb24uZ2V0KCk7CiAgICAgICAgaWYgKHRoaXMubXVsdGkpIHsKICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGVkSXRlbXMocyk7CiAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW0ocy5sZW5ndGggPyBzWzBdIDogbnVsbCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzICE9PSBudWxsICYmIHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW1zKFtzXSk7CiAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGVkSXRlbShzKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGVkSXRlbXMoW10pOwogICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3RlZEl0ZW0obnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3RvZ2dsZVNlbGVjdGVkOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHZhciBpID0gdGhpcy5zZWxlY3RlZFZhbHVlcy5pbmRleE9mKHZhbHVlKTsKICAgICAgICB2YXIgdW5zZWxlY3RlZCA9IGkgPCAwOwogICAgICAgIGlmICh1bnNlbGVjdGVkKSB7CiAgICAgICAgICB0aGlzLnB1c2goJ3NlbGVjdGVkVmFsdWVzJywgdmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNwbGljZSgnc2VsZWN0ZWRWYWx1ZXMnLCBpLCAxKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfdmFsdWVzVG9JdGVtczogZnVuY3Rpb24odmFsdWVzKSB7CiAgICAgICAgcmV0dXJuICh2YWx1ZXMgPT0gbnVsbCkgPyBudWxsIDogdmFsdWVzLm1hcChmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlVG9JdGVtKHZhbHVlKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfQogICAgfTsKCiAgICAvKiogQHBvbHltZXJCZWhhdmlvciAqLwogICAgY29uc3QgSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9yID0KICAgICAgICBbSXJvblNlbGVjdGFibGVCZWhhdmlvciwgSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBgSXJvbk1lbnVCZWhhdmlvcmAgaW1wbGVtZW50cyBhY2Nlc3NpYmxlIG1lbnUgYmVoYXZpb3IuCiAgICAgKgogICAgICogQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAgKiBAcG9seW1lckJlaGF2aW9yIElyb25NZW51QmVoYXZpb3IKICAgICAqLwogICAgY29uc3QgSXJvbk1lbnVCZWhhdmlvckltcGwgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnRseSBmb2N1c2VkIGl0ZW0uCiAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICovCiAgICAgICAgZm9jdXNlZEl0ZW06CiAgICAgICAgICAgIHtvYnNlcnZlcjogJ19mb2N1c2VkSXRlbUNoYW5nZWQnLCByZWFkT25seTogdHJ1ZSwgdHlwZTogT2JqZWN0fSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGF0dHJpYnV0ZSB0byB1c2Ugb24gbWVudSBpdGVtcyB0byBsb29rIHVwIHRoZSBpdGVtIHRpdGxlLiBUeXBpbmcgdGhlCiAgICAgICAgICogZmlyc3QgbGV0dGVyIG9mIGFuIGl0ZW0gd2hlbiB0aGUgbWVudSBpcyBvcGVuIGZvY3VzZXMgdGhhdCBpdGVtLiBJZgogICAgICAgICAqIHVuc2V0LCBgdGV4dENvbnRlbnRgIHdpbGwgYmUgdXNlZC4KICAgICAgICAgKi8KICAgICAgICBhdHRyRm9ySXRlbVRpdGxlOiB7dHlwZTogU3RyaW5nfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQHR5cGUge2Jvb2xlYW59CiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZWQ6IHsKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICBvYnNlcnZlcjogJ19kaXNhYmxlZENoYW5nZWQnLAogICAgICAgIH0sCiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhlIGxpc3Qgb2Yga2V5cyBoYXMgYmVlbiB0YWtlbiBmcm9tCiAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9LZXlib2FyZEV2ZW50L2dldE1vZGlmaWVyU3RhdGUKICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9NT0RJRklFUl9LRVlTOiBbCiAgICAgICAgJ0FsdCcsCiAgICAgICAgJ0FsdEdyYXBoJywKICAgICAgICAnQ2Fwc0xvY2snLAogICAgICAgICdDb250cm9sJywKICAgICAgICAnRm4nLAogICAgICAgICdGbkxvY2snLAogICAgICAgICdIeXBlcicsCiAgICAgICAgJ01ldGEnLAogICAgICAgICdOdW1Mb2NrJywKICAgICAgICAnT1MnLAogICAgICAgICdTY3JvbGxMb2NrJywKICAgICAgICAnU2hpZnQnLAogICAgICAgICdTdXBlcicsCiAgICAgICAgJ1N5bWJvbCcsCiAgICAgICAgJ1N5bWJvbExvY2snCiAgICAgIF0sCgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgX1NFQVJDSF9SRVNFVF9USU1FT1VUX01TOiAxMDAwLAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIF9wcmV2aW91c1RhYkluZGV4OiAwLAoKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHsKICAgICAgICAncm9sZSc6ICdtZW51JywKICAgICAgfSwKCiAgICAgIG9ic2VydmVyczogWydfdXBkYXRlTXVsdGlzZWxlY3RhYmxlKG11bHRpKSddLAoKICAgICAgbGlzdGVuZXJzOiB7CiAgICAgICAgJ2ZvY3VzJzogJ19vbkZvY3VzJywKICAgICAgICAna2V5ZG93bic6ICdfb25LZXlkb3duJywKICAgICAgICAnaXJvbi1pdGVtcy1jaGFuZ2VkJzogJ19vbklyb25JdGVtc0NoYW5nZWQnCiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQHR5cGUgeyFPYmplY3R9CiAgICAgICAqLwogICAgICBrZXlCaW5kaW5nczogewogICAgICAgICd1cCc6ICdfb25VcEtleScsCiAgICAgICAgJ2Rvd24nOiAnX29uRG93bktleScsCiAgICAgICAgJ2VzYyc6ICdfb25Fc2NLZXknLAogICAgICAgICdzaGlmdCt0YWI6a2V5ZG93bic6ICdfb25TaGlmdFRhYkRvd24nCiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2VsZWN0cyB0aGUgZ2l2ZW4gdmFsdWUuIElmIHRoZSBgbXVsdGlgIHByb3BlcnR5IGlzIHRydWUsIHRoZW4gdGhlIHNlbGVjdGVkCiAgICAgICAqIHN0YXRlIG9mIHRoZSBgdmFsdWVgIHdpbGwgYmUgdG9nZ2xlZDsgb3RoZXJ3aXNlIHRoZSBgdmFsdWVgIHdpbGwgYmUKICAgICAgICogc2VsZWN0ZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gdmFsdWUgdGhlIHZhbHVlIHRvIHNlbGVjdC4KICAgICAgICovCiAgICAgIHNlbGVjdDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAvLyBDYW5jZWwgYXV0b21hdGljYWxseSBmb2N1c2luZyBhIGRlZmF1bHQgaXRlbSBpZiB0aGUgbWVudSByZWNlaXZlZCBmb2N1cwogICAgICAgIC8vIHRocm91Z2ggYSB1c2VyIGFjdGlvbiBzZWxlY3RpbmcgYSBwYXJ0aWN1bGFyIGl0ZW0uCiAgICAgICAgaWYgKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKSB7CiAgICAgICAgICB0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKTsKICAgICAgICAgIHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLl92YWx1ZVRvSXRlbSh2YWx1ZSk7CiAgICAgICAgaWYgKGl0ZW0gJiYgaXRlbS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpCiAgICAgICAgICByZXR1cm47CiAgICAgICAgdGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaXRlbSk7CiAgICAgICAgSXJvbk11bHRpU2VsZWN0YWJsZUJlaGF2aW9ySW1wbC5zZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXNldHMgYWxsIHRhYmluZGV4IGF0dHJpYnV0ZXMgdG8gdGhlIGFwcHJvcHJpYXRlIHZhbHVlIGJhc2VkIG9uIHRoZQogICAgICAgKiBjdXJyZW50IHNlbGVjdGlvbiBzdGF0ZS4gVGhlIGFwcHJvcHJpYXRlIHZhbHVlIGlzIGAwYCAoZm9jdXNhYmxlKSBmb3IKICAgICAgICogdGhlIGRlZmF1bHQgc2VsZWN0ZWQgaXRlbSwgYW5kIGAtMWAgKG5vdCBrZXlib2FyZCBmb2N1c2FibGUpIGZvciBhbGwKICAgICAgICogb3RoZXIgaXRlbXMuIEFsc28gc2V0cyB0aGUgY29ycmVjdCBpbml0aWFsIHZhbHVlcyBmb3IgYXJpYS1zZWxlY3RlZAogICAgICAgKiBhdHRyaWJ1dGUsIHRydWUgZm9yIGRlZmF1bHQgc2VsZWN0ZWQgaXRlbSBhbmQgZmFsc2UgZm9yIG90aGVycy4KICAgICAgICovCiAgICAgIF9yZXNldFRhYmluZGljZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBmaXJzdFNlbGVjdGVkSXRlbSA9IHRoaXMubXVsdGkgPwogICAgICAgICAgICAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtc1swXSkgOgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkSXRlbTsKCiAgICAgICAgdGhpcy5pdGVtcy5mb3JFYWNoKGZ1bmN0aW9uKGl0ZW0pIHsKICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIGl0ZW0gPT09IGZpcnN0U2VsZWN0ZWRJdGVtID8gJzAnIDogJy0xJyk7CiAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIHRoaXMuX3NlbGVjdGlvbi5pc1NlbGVjdGVkKGl0ZW0pKTsKICAgICAgICB9LCB0aGlzKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIGFwcHJvcHJpYXRlIEFSSUEgYmFzZWQgb24gd2hldGhlciBvciBub3QgdGhlIG1lbnUgaXMgbWVhbnQgdG8gYmUKICAgICAgICogbXVsdGktc2VsZWN0YWJsZS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtib29sZWFufSBtdWx0aSBUcnVlIGlmIHRoZSBtZW51IHNob3VsZCBiZSBtdWx0aS1zZWxlY3RhYmxlLgogICAgICAgKi8KICAgICAgX3VwZGF0ZU11bHRpc2VsZWN0YWJsZTogZnVuY3Rpb24obXVsdGkpIHsKICAgICAgICBpZiAobXVsdGkpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLW11bHRpc2VsZWN0YWJsZScsICd0cnVlJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhcmlhLW11bHRpc2VsZWN0YWJsZScpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBHaXZlbiBhIEtleWJvYXJkRXZlbnQsIHRoaXMgbWV0aG9kIHdpbGwgZm9jdXMgdGhlIGFwcHJvcHJpYXRlIGl0ZW0gaW4gdGhlCiAgICAgICAqIG1lbnUgKGlmIHRoZXJlIGlzIGEgcmVsZXZhbnQgaXRlbSwgYW5kIGl0IGlzIHBvc3NpYmxlIHRvIGZvY3VzIGl0KS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtLZXlib2FyZEV2ZW50fSBldmVudCBBIEtleWJvYXJkRXZlbnQuCiAgICAgICAqLwogICAgICBfZm9jdXNXaXRoS2V5Ym9hcmRFdmVudDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUga2V5IHByZXNzZWQgaXMgbm90IGEgbW9kaWZpZXIga2V5LgogICAgICAgIC8vIGdldE1vZGlmaWVyU3RhdGUgaXMgbm90IGJlaW5nIHVzZWQsIGFzIGl0IGlzIG5vdCBhdmFpbGFibGUgaW4gU2FmYXJpCiAgICAgICAgLy8gZWFybGllciB0aGFuIDEwLjAuMiAoaHR0cHM6Ly90cmFjLndlYmtpdC5vcmcvY2hhbmdlc2V0LzIwNjcyNS93ZWJraXQpCiAgICAgICAgaWYgKHRoaXMuX01PRElGSUVSX0tFWVMuaW5kZXhPZihldmVudC5rZXkpICE9PSAtMSkKICAgICAgICAgIHJldHVybjsKCiAgICAgICAgdGhpcy5jYW5jZWxEZWJvdW5jZXIoJ19jbGVhclNlYXJjaFRleHQnKTsKCiAgICAgICAgdmFyIHNlYXJjaFRleHQgPSB0aGlzLl9zZWFyY2hUZXh0IHx8ICcnOwogICAgICAgIHZhciBrZXkgPSBldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PSAxID8KICAgICAgICAgICAgZXZlbnQua2V5IDoKICAgICAgICAgICAgU3RyaW5nLmZyb21DaGFyQ29kZShldmVudC5rZXlDb2RlKTsKICAgICAgICBzZWFyY2hUZXh0ICs9IGtleS50b0xvY2FsZUxvd2VyQ2FzZSgpOwoKICAgICAgICB2YXIgc2VhcmNoTGVuZ3RoID0gc2VhcmNoVGV4dC5sZW5ndGg7CgogICAgICAgIGZvciAodmFyIGkgPSAwLCBpdGVtOyBpdGVtID0gdGhpcy5pdGVtc1tpXTsgaSsrKSB7CiAgICAgICAgICBpZiAoaXRlbS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIGF0dHIgPSB0aGlzLmF0dHJGb3JJdGVtVGl0bGUgfHwgJ3RleHRDb250ZW50JzsKICAgICAgICAgIHZhciB0aXRsZSA9IChpdGVtW2F0dHJdIHx8IGl0ZW0uZ2V0QXR0cmlidXRlKGF0dHIpIHx8ICcnKS50cmltKCk7CgogICAgICAgICAgaWYgKHRpdGxlLmxlbmd0aCA8IHNlYXJjaExlbmd0aCkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAodGl0bGUuc2xpY2UoMCwgc2VhcmNoTGVuZ3RoKS50b0xvY2FsZUxvd2VyQ2FzZSgpID09IHNlYXJjaFRleHQpIHsKICAgICAgICAgICAgdGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaXRlbSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fc2VhcmNoVGV4dCA9IHNlYXJjaFRleHQ7CiAgICAgICAgdGhpcy5kZWJvdW5jZSgKICAgICAgICAgICAgJ19jbGVhclNlYXJjaFRleHQnLAogICAgICAgICAgICB0aGlzLl9jbGVhclNlYXJjaFRleHQsCiAgICAgICAgICAgIHRoaXMuX1NFQVJDSF9SRVNFVF9USU1FT1VUX01TKTsKICAgICAgfSwKCiAgICAgIF9jbGVhclNlYXJjaFRleHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3NlYXJjaFRleHQgPSAnJzsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBGb2N1c2VzIHRoZSBwcmV2aW91cyBpdGVtIChyZWxhdGl2ZSB0byB0aGUgY3VycmVudGx5IGZvY3VzZWQgaXRlbSkgaW4gdGhlCiAgICAgICAqIG1lbnUsIGRpc2FibGVkIGl0ZW1zIHdpbGwgYmUgc2tpcHBlZC4KICAgICAgICogTG9vcCB1bnRpbCBsZW5ndGggKyAxIHRvIGhhbmRsZSBjYXNlIG9mIHNpbmdsZSBpdGVtIGluIG1lbnUuCiAgICAgICAqLwogICAgICBfZm9jdXNQcmV2aW91czogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9IHRoaXMuaXRlbXMubGVuZ3RoOwogICAgICAgIHZhciBjdXJGb2N1c0luZGV4ID0gTnVtYmVyKHRoaXMuaW5kZXhPZih0aGlzLmZvY3VzZWRJdGVtKSk7CgogICAgICAgIGZvciAodmFyIGkgPSAxOyBpIDwgbGVuZ3RoICsgMTsgaSsrKSB7CiAgICAgICAgICB2YXIgaXRlbSA9IHRoaXMuaXRlbXNbKGN1ckZvY3VzSW5kZXggLSBpICsgbGVuZ3RoKSAlIGxlbmd0aF07CiAgICAgICAgICBpZiAoIWl0ZW0uaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgIHZhciBvd25lciA9IGRvbShpdGVtKS5nZXRPd25lclJvb3QoKSB8fCBkb2N1bWVudDsKICAgICAgICAgICAgdGhpcy5fc2V0Rm9jdXNlZEl0ZW0oaXRlbSk7CgogICAgICAgICAgICAvLyBGb2N1cyBtaWdodCBub3QgaGF2ZSB3b3JrZWQsIGlmIHRoZSBlbGVtZW50IHdhcyBoaWRkZW4gb3Igbm90CiAgICAgICAgICAgIC8vIGZvY3VzYWJsZS4gSW4gdGhhdCBjYXNlLCB0cnkgYWdhaW4uCiAgICAgICAgICAgIGlmIChkb20ob3duZXIpLmFjdGl2ZUVsZW1lbnQgPT0gaXRlbSkgewogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBGb2N1c2VzIHRoZSBuZXh0IGl0ZW0gKHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50bHkgZm9jdXNlZCBpdGVtKSBpbiB0aGUKICAgICAgICogbWVudSwgZGlzYWJsZWQgaXRlbXMgd2lsbCBiZSBza2lwcGVkLgogICAgICAgKiBMb29wIHVudGlsIGxlbmd0aCArIDEgdG8gaGFuZGxlIGNhc2Ugb2Ygc2luZ2xlIGl0ZW0gaW4gbWVudS4KICAgICAgICovCiAgICAgIF9mb2N1c05leHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBsZW5ndGggPSB0aGlzLml0ZW1zLmxlbmd0aDsKICAgICAgICB2YXIgY3VyRm9jdXNJbmRleCA9IE51bWJlcih0aGlzLmluZGV4T2YodGhpcy5mb2N1c2VkSXRlbSkpOwoKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGxlbmd0aCArIDE7IGkrKykgewogICAgICAgICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zWyhjdXJGb2N1c0luZGV4ICsgaSkgJSBsZW5ndGhdOwogICAgICAgICAgaWYgKCFpdGVtLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkgewogICAgICAgICAgICB2YXIgb3duZXIgPSBkb20oaXRlbSkuZ2V0T3duZXJSb290KCkgfHwgZG9jdW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX3NldEZvY3VzZWRJdGVtKGl0ZW0pOwoKICAgICAgICAgICAgLy8gRm9jdXMgbWlnaHQgbm90IGhhdmUgd29ya2VkLCBpZiB0aGUgZWxlbWVudCB3YXMgaGlkZGVuIG9yIG5vdAogICAgICAgICAgICAvLyBmb2N1c2FibGUuIEluIHRoYXQgY2FzZSwgdHJ5IGFnYWluLgogICAgICAgICAgICBpZiAoZG9tKG93bmVyKS5hY3RpdmVFbGVtZW50ID09IGl0ZW0pIHsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogTXV0YXRlcyBpdGVtcyBpbiB0aGUgbWVudSBiYXNlZCBvbiBwcm92aWRlZCBzZWxlY3Rpb24gZGV0YWlscywgc28gdGhhdAogICAgICAgKiBhbGwgaXRlbXMgY29ycmVjdGx5IHJlZmxlY3Qgc2VsZWN0aW9uIHN0YXRlLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0VsZW1lbnR9IGl0ZW0gQW4gaXRlbSBpbiB0aGUgbWVudS4KICAgICAgICogQHBhcmFtIHtib29sZWFufSBpc1NlbGVjdGVkIFRydWUgaWYgdGhlIGl0ZW0gc2hvdWxkIGJlIHNob3duIGluIGEKICAgICAgICogc2VsZWN0ZWQgc3RhdGUsIG90aGVyd2lzZSBmYWxzZS4KICAgICAgICovCiAgICAgIF9hcHBseVNlbGVjdGlvbjogZnVuY3Rpb24oaXRlbSwgaXNTZWxlY3RlZCkgewogICAgICAgIGlmIChpc1NlbGVjdGVkKSB7CiAgICAgICAgICBpdGVtLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsICd0cnVlJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGl0ZW0uc2V0QXR0cmlidXRlKCdhcmlhLXNlbGVjdGVkJywgJ2ZhbHNlJyk7CiAgICAgICAgfQogICAgICAgIElyb25TZWxlY3RhYmxlQmVoYXZpb3IuX2FwcGx5U2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogRGlzY3JldGVseSB1cGRhdGVzIHRhYmluZGV4IHZhbHVlcyBhbW9uZyBtZW51IGl0ZW1zIGFzIHRoZSBmb2N1c2VkIGl0ZW0KICAgICAgICogY2hhbmdlcy4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBmb2N1c2VkSXRlbSBUaGUgZWxlbWVudCB0aGF0IGlzIGN1cnJlbnRseSBmb2N1c2VkLgogICAgICAgKiBAcGFyYW0gez9FbGVtZW50fSBvbGQgVGhlIGxhc3QgZWxlbWVudCB0aGF0IHdhcyBjb25zaWRlcmVkIGZvY3VzZWQsIGlmCiAgICAgICAqIGFwcGxpY2FibGUuCiAgICAgICAqLwogICAgICBfZm9jdXNlZEl0ZW1DaGFuZ2VkOiBmdW5jdGlvbihmb2N1c2VkSXRlbSwgb2xkKSB7CiAgICAgICAgb2xkICYmIG9sZC5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7CiAgICAgICAgaWYgKGZvY3VzZWRJdGVtICYmICFmb2N1c2VkSXRlbS5oYXNBdHRyaWJ1dGUoJ2Rpc2FibGVkJykgJiYKICAgICAgICAgICAgIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgIGZvY3VzZWRJdGVtLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpOwogICAgICAgICAgZm9jdXNlZEl0ZW0uZm9jdXMoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQSBoYW5kbGVyIHRoYXQgcmVzcG9uZHMgdG8gbXV0YXRpb24gY2hhbmdlcyByZWxhdGVkIHRvIHRoZSBsaXN0IG9mIGl0ZW1zCiAgICAgICAqIGluIHRoZSBtZW51LgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBBbiBldmVudCBjb250YWluaW5nIG11dGF0aW9uIHJlY29yZHMgYXMgaXRzCiAgICAgICAqIGRldGFpbC4KICAgICAgICovCiAgICAgIF9vbklyb25JdGVtc0NoYW5nZWQ6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKGV2ZW50LmRldGFpbC5hZGRlZE5vZGVzLmxlbmd0aCkgewogICAgICAgICAgdGhpcy5fcmVzZXRUYWJpbmRpY2VzKCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiBhIHNoaWZ0K3RhYiBrZXlwcmVzcyBpcyBkZXRlY3RlZCBieSB0aGUgbWVudS4KICAgICAgICoKICAgICAgICogQHBhcmFtIHtDdXN0b21FdmVudH0gZXZlbnQgQSBrZXkgY29tYmluYXRpb24gZXZlbnQuCiAgICAgICAqLwogICAgICBfb25TaGlmdFRhYkRvd246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdmFyIG9sZFRhYkluZGV4ID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7CgogICAgICAgIElyb25NZW51QmVoYXZpb3JJbXBsLl9zaGlmdFRhYlByZXNzZWQgPSB0cnVlOwoKICAgICAgICB0aGlzLl9zZXRGb2N1c2VkSXRlbShudWxsKTsKCiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7CgogICAgICAgIHRoaXMuYXN5bmMoZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCBvbGRUYWJJbmRleCk7CiAgICAgICAgICBJcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkID0gZmFsc2U7CiAgICAgICAgICAvLyBOT1RFKGNkYXRhKTogcG9seW1lci9wb2x5bWVyIzEzMDUKICAgICAgICB9LCAxKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBIYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIG1lbnUgcmVjZWl2ZXMgZm9jdXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Rm9jdXNFdmVudH0gZXZlbnQgQSBmb2N1cyBldmVudC4KICAgICAgICovCiAgICAgIF9vbkZvY3VzOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmIChJcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkKSB7CiAgICAgICAgICAvLyBkbyBub3QgZm9jdXMgdGhlIG1lbnUgaXRzZWxmCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBEbyBub3QgZm9jdXMgdGhlIHNlbGVjdGVkIHRhYiBpZiB0aGUgZGVlcGVzdCB0YXJnZXQgaXMgcGFydCBvZiB0aGUKICAgICAgICAvLyBtZW51IGVsZW1lbnQncyBsb2NhbCBET00gYW5kIGlzIGZvY3VzYWJsZS4KICAgICAgICB2YXIgcm9vdFRhcmdldCA9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P0hUTUxFbGVtZW50fSAqLyAoZG9tKGV2ZW50KS5yb290VGFyZ2V0KTsKICAgICAgICBpZiAocm9vdFRhcmdldCAhPT0gdGhpcyAmJiB0eXBlb2Ygcm9vdFRhcmdldC50YWJJbmRleCAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICAgICAgIXRoaXMuaXNMaWdodERlc2NlbmRhbnQocm9vdFRhcmdldCkpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIGNsZWFyIHRoZSBjYWNoZWQgZm9jdXMgaXRlbQogICAgICAgIHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jID0gdGhpcy5hc3luYyhmdW5jdGlvbigpIHsKICAgICAgICAgIC8vIGZvY3VzIHRoZSBzZWxlY3RlZCBpdGVtIHdoZW4gdGhlIG1lbnUgcmVjZWl2ZXMgZm9jdXMsIG9yIHRoZSBmaXJzdCBpdGVtCiAgICAgICAgICAvLyBpZiBubyBpdGVtIGlzIHNlbGVjdGVkCiAgICAgICAgICB2YXIgZmlyc3RTZWxlY3RlZEl0ZW0gPSB0aGlzLm11bHRpID8KICAgICAgICAgICAgICAodGhpcy5zZWxlY3RlZEl0ZW1zICYmIHRoaXMuc2VsZWN0ZWRJdGVtc1swXSkgOgogICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtOwoKICAgICAgICAgIHRoaXMuX3NldEZvY3VzZWRJdGVtKG51bGwpOwoKICAgICAgICAgIGlmIChmaXJzdFNlbGVjdGVkSXRlbSkgewogICAgICAgICAgICB0aGlzLl9zZXRGb2N1c2VkSXRlbShmaXJzdFNlbGVjdGVkSXRlbSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXRlbXNbMF0pIHsKICAgICAgICAgICAgLy8gV2UgZmluZCB0aGUgZmlyc3Qgbm9uZS1kaXNhYmxlZCBpdGVtIChpZiBvbmUgZXhpc3RzKQogICAgICAgICAgICB0aGlzLl9mb2N1c05leHQoKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBIYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHVwIGtleSBpcyBwcmVzc2VkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBBIGtleSBjb21iaW5hdGlvbiBldmVudC4KICAgICAgICovCiAgICAgIF9vblVwS2V5OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIC8vIHVwIGFuZCBkb3duIGFycm93cyBtb3ZlcyB0aGUgZm9jdXMKICAgICAgICB0aGlzLl9mb2N1c1ByZXZpb3VzKCk7CiAgICAgICAgZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBIYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIGRvd24ga2V5IGlzIHByZXNzZWQuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2ZW50IEEga2V5IGNvbWJpbmF0aW9uIGV2ZW50LgogICAgICAgKi8KICAgICAgX29uRG93bktleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLl9mb2N1c05leHQoKTsKICAgICAgICBldmVudC5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEhhbmRsZXIgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZXNjIGtleSBpcyBwcmVzc2VkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0N1c3RvbUV2ZW50fSBldmVudCBBIGtleSBjb21iaW5hdGlvbiBldmVudC4KICAgICAgICovCiAgICAgIF9vbkVzY0tleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgZm9jdXNlZEl0ZW0gPSB0aGlzLmZvY3VzZWRJdGVtOwogICAgICAgIGlmIChmb2N1c2VkSXRlbSkgewogICAgICAgICAgZm9jdXNlZEl0ZW0uYmx1cigpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBIYW5kbGVyIHRoYXQgaXMgY2FsbGVkIHdoZW4gYSBrZXlkb3duIGV2ZW50IGlzIGRldGVjdGVkLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge0tleWJvYXJkRXZlbnR9IGV2ZW50IEEga2V5Ym9hcmQgZXZlbnQuCiAgICAgICAqLwogICAgICBfb25LZXlkb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICghdGhpcy5rZXlib2FyZEV2ZW50TWF0Y2hlc0tleXMoZXZlbnQsICd1cCBkb3duIGVzYycpKSB7CiAgICAgICAgICAvLyBhbGwgb3RoZXIga2V5cyBmb2N1cyB0aGUgbWVudSBpdGVtIHN0YXJ0aW5nIHdpdGggdGhhdCBjaGFyYWN0ZXIKICAgICAgICAgIHRoaXMuX2ZvY3VzV2l0aEtleWJvYXJkRXZlbnQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgfSwKCiAgICAgIC8vIG92ZXJyaWRlIF9hY3RpdmF0ZUhhbmRsZXIKICAgICAgX2FjdGl2YXRlSGFuZGxlcjogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBJcm9uU2VsZWN0YWJsZUJlaGF2aW9yLl9hY3RpdmF0ZUhhbmRsZXIuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVXBkYXRlcyB0aGlzIGVsZW1lbnQncyB0YWIgaW5kZXggd2hlbiBpdCdzIGVuYWJsZWQvZGlzYWJsZWQuCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzYWJsZWQKICAgICAgICovCiAgICAgIF9kaXNhYmxlZENoYW5nZWQ6IGZ1bmN0aW9uKGRpc2FibGVkKSB7CiAgICAgICAgaWYgKGRpc2FibGVkKSB7CiAgICAgICAgICB0aGlzLl9wcmV2aW91c1RhYkluZGV4ID0KICAgICAgICAgICAgICB0aGlzLmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSA/IHRoaXMudGFiSW5kZXggOiAwOwogICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoCiAgICAgICAgICAgICAgJ3RhYmluZGV4Jyk7ICAvLyBObyB0YWJpbmRleCBtZWFucyBub3QgdGFiLWFibGUgb3Igc2VsZWN0LWFibGUuCiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ3RhYmluZGV4JykpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCd0YWJpbmRleCcsIHRoaXMuX3ByZXZpb3VzVGFiSW5kZXgpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBJcm9uTWVudUJlaGF2aW9ySW1wbC5fc2hpZnRUYWJQcmVzc2VkID0gZmFsc2U7CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IElyb25NZW51QmVoYXZpb3IgPQogICAgICAgIFtJcm9uTXVsdGlTZWxlY3RhYmxlQmVoYXZpb3IsIElyb25BMTF5S2V5c0JlaGF2aW9yLCBJcm9uTWVudUJlaGF2aW9ySW1wbF07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbTWVudXNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9tZW51cy5odG1sKQoKICAgIGA8cGFwZXItbGlzdGJveD5gIGltcGxlbWVudHMgYW4gYWNjZXNzaWJsZSBsaXN0Ym94IGNvbnRyb2wgd2l0aCBNYXRlcmlhbCBEZXNpZ24KICAgIHN0eWxpbmcuIFRoZSBmb2N1c2VkIGl0ZW0gaXMgaGlnaGxpZ2h0ZWQsIGFuZCB0aGUgc2VsZWN0ZWQgaXRlbSBoYXMgYm9sZGVkIHRleHQuCgogICAgICAgIDxwYXBlci1saXN0Ym94PgogICAgICAgICAgPHBhcGVyLWl0ZW0+SXRlbSAxPC9wYXBlci1pdGVtPgogICAgICAgICAgPHBhcGVyLWl0ZW0+SXRlbSAyPC9wYXBlci1pdGVtPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KCiAgICBBbiBpbml0aWFsIHNlbGVjdGlvbiBjYW4gYmUgc3BlY2lmaWVkIHdpdGggdGhlIGBzZWxlY3RlZGAgYXR0cmlidXRlLgoKICAgICAgICA8cGFwZXItbGlzdGJveCBzZWxlY3RlZD0iMCI+CiAgICAgICAgICA8cGFwZXItaXRlbT5JdGVtIDE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbT5JdGVtIDI8L3BhcGVyLWl0ZW0+CiAgICAgICAgPC9wYXBlci1saXN0Ym94PgoKICAgIE1ha2UgYSBtdWx0aS1zZWxlY3QgbGlzdGJveCB3aXRoIHRoZSBgbXVsdGlgIGF0dHJpYnV0ZS4gSXRlbXMgaW4gYSBtdWx0aS1zZWxlY3QKICAgIGxpc3Rib3ggY2FuIGJlIGRlc2VsZWN0ZWQsIGFuZCBtdWx0aXBsZSBpdGVtIGNhbiBiZSBzZWxlY3RlZC4KCiAgICAgICAgPHBhcGVyLWxpc3Rib3ggbXVsdGk+CiAgICAgICAgICA8cGFwZXItaXRlbT5JdGVtIDE8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8cGFwZXItaXRlbT5JdGVtIDI8L3BhcGVyLWl0ZW0+CiAgICAgICAgPC9wYXBlci1saXN0Ym94PgoKICAgICMjIyBTdHlsaW5nCgogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItbGlzdGJveC1iYWNrZ3JvdW5kLWNvbG9yYCAgIHwgTWVudSBiYWNrZ3JvdW5kIGNvbG9yIHwKICAgIGAtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcmAKICAgIGAtLXBhcGVyLWxpc3Rib3gtY29sb3JgICAgICAgICAgICAgICB8IE1lbnUgZm9yZWdyb3VuZCBjb2xvciB8CiAgICBgLS1wcmltYXJ5LXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1saXN0Ym94YCAgICAgICAgICAgICAgICAgICAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBsaXN0Ym94IHwgYHt9YAoKICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgYDxwYXBlci1saXN0Ym94PmAgaGFzIGByb2xlPSJsaXN0Ym94ImAgYnkgZGVmYXVsdC4gQSBtdWx0aS1zZWxlY3QgbGlzdGJveCB3aWxsCiAgICBhbHNvIGhhdmUgYGFyaWEtbXVsdGlzZWxlY3RhYmxlYCBzZXQuIEl0IGltcGxlbWVudHMga2V5IGJpbmRpbmdzIHRvIG5hdmlnYXRlCiAgICB0aHJvdWdoIHRoZSBsaXN0Ym94IHdpdGggdGhlIHVwIGFuZCBkb3duIGFycm93IGtleXMsIGVzYyB0byBleGl0IHRoZSBsaXN0Ym94LAogICAgYW5kIGVudGVyIHRvIGFjdGl2YXRlIGEgbGlzdGJveCBpdGVtLiBUeXBpbmcgdGhlIGZpcnN0IGxldHRlciBvZiBhIGxpc3Rib3ggaXRlbQogICAgd2lsbCBhbHNvIGZvY3VzIGl0LgoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItbGlzdGJveAogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmc6IDhweCAwOwoKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1saXN0Ym94LWJhY2tncm91bmQtY29sb3IsIHZhcigtLXByaW1hcnktYmFja2dyb3VuZC1jb2xvcikpOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1saXN0Ym94LWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItbGlzdGJveDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8c2xvdD48L3Nsb3Q+CmAsCgogICAgICBpczogJ3BhcGVyLWxpc3Rib3gnLAogICAgICBiZWhhdmlvcnM6IFtJcm9uTWVudUJlaGF2aW9yXSwKCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBob3N0QXR0cmlidXRlczoge3JvbGU6ICdsaXN0Ym94J30KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwogICAgY29uc3QgdGVtcGxhdGUkYyA9IGh0bWxgCjxkb20tbW9kdWxlIGlkPSJwYXBlci1tYXRlcmlhbC1zaGFyZWQtc3R5bGVzIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjEiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSIyIl0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTRkcDsKICAgICAgfQoKICAgICAgOmhvc3QoW2VsZXZhdGlvbj0iMyJdKSB7CiAgICAgICAgQGFwcGx5IC0tc2hhZG93LWVsZXZhdGlvbi02ZHA7CiAgICAgIH0KCiAgICAgIDpob3N0KFtlbGV2YXRpb249IjQiXSkgewogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tOGRwOwogICAgICB9CgogICAgICA6aG9zdChbZWxldmF0aW9uPSI1Il0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctZWxldmF0aW9uLTE2ZHA7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPgpgOwogICAgdGVtcGxhdGUkYy5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJ2Rpc3BsYXk6IG5vbmU7Jyk7CiAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHRlbXBsYXRlJGMuY29udGVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbQ2FyZHNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9jYXJkcy5odG1sKQoKICAgIGBwYXBlci1tYXRlcmlhbGAgaXMgYSBjb250YWluZXIgdGhhdCByZW5kZXJzIHR3byBzaGFkb3dzIG9uIHRvcCBvZiBlYWNoIG90aGVyIHRvCiAgICBjcmVhdGUgdGhlIGVmZmVjdCBvZiBhIGxpZnRlZCBwaWVjZSBvZiBwYXBlci4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItbWF0ZXJpYWwgZWxldmF0aW9uPSIxIj4KICAgICAgICAgIC4uLiBjb250ZW50IC4uLgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CgogICAgQGdyb3VwIFBhcGVyIEVsZW1lbnRzCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLW1hdGVyaWFsLXNoYXJlZC1zdHlsZXMiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0KFthbmltYXRlZF0pIHsKICAgICAgICBAYXBwbHkgLS1zaGFkb3ctdHJhbnNpdGlvbjsKICAgICAgfQogICAgICA6aG9zdCB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItbWF0ZXJpYWw7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLAoKICAgICAgaXM6ICdwYXBlci1tYXRlcmlhbCcsCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHotZGVwdGggb2YgdGhpcyBlbGVtZW50LCBmcm9tIDAtNS4gU2V0dGluZyB0byAwIHdpbGwgcmVtb3ZlIHRoZQogICAgICAgICAqIHNoYWRvdywgYW5kIGVhY2ggaW5jcmVhc2luZyBudW1iZXIgZ3JlYXRlciB0aGFuIDAgd2lsbCBiZSAiZGVlcGVyIgogICAgICAgICAqIHRoYW4gdGhlIGxhc3QuCiAgICAgICAgICoKICAgICAgICAgKiBAYXR0cmlidXRlIGVsZXZhdGlvbgogICAgICAgICAqIEB0eXBlIG51bWJlcgogICAgICAgICAqIEBkZWZhdWx0IDEKICAgICAgICAgKi8KICAgICAgICBlbGV2YXRpb246IHt0eXBlOiBOdW1iZXIsIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwgdmFsdWU6IDF9LAoKICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdGhpcyB0byB0cnVlIHRvIGFuaW1hdGUgdGhlIHNoYWRvdyB3aGVuIHNldHRpbmcgYSBuZXcKICAgICAgICAgKiBgZWxldmF0aW9uYCB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIEBhdHRyaWJ1dGUgYW5pbWF0ZWQKICAgICAgICAgKiBAdHlwZSBib29sZWFuCiAgICAgICAgICogQGRlZmF1bHQgZmFsc2UKICAgICAgICAgKi8KICAgICAgICBhbmltYXRlZDoge3R5cGU6IEJvb2xlYW4sIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwgdmFsdWU6IGZhbHNlfQogICAgICB9CiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICAqIGBpcm9uLXJhbmdlLWJlaGF2aW9yYCBwcm92aWRlcyB0aGUgYmVoYXZpb3IgZm9yIHNvbWV0aGluZyB3aXRoIGEgbWluaW11bSB0bwogICAgICogbWF4aW11bSByYW5nZS4KICAgICAqCiAgICAgKiBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICAqIEBwb2x5bWVyQmVoYXZpb3IKICAgICAqLwogICAgY29uc3QgSXJvblJhbmdlQmVoYXZpb3IgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgdGhhdCByZXByZXNlbnRzIHRoZSBjdXJyZW50IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHZhbHVlOiB7dHlwZTogTnVtYmVyLCB2YWx1ZTogMCwgbm90aWZ5OiB0cnVlLCByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIHRoYXQgaW5kaWNhdGVzIHRoZSBtaW5pbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KICAgICAgICAgKi8KICAgICAgICBtaW46IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAwLCBub3RpZnk6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIHRoYXQgaW5kaWNhdGVzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIHRoZSByYW5nZS4KICAgICAgICAgKi8KICAgICAgICBtYXg6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAxMDAsIG5vdGlmeTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFNwZWNpZmllcyB0aGUgdmFsdWUgZ3JhbnVsYXJpdHkgb2YgdGhlIHJhbmdlJ3MgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgc3RlcDoge3R5cGU6IE51bWJlciwgdmFsdWU6IDEsIG5vdGlmeTogdHJ1ZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHJhdGlvIG9mIHRoZSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICByYXRpbzoge3R5cGU6IE51bWJlciwgdmFsdWU6IDAsIHJlYWRPbmx5OiB0cnVlLCBub3RpZnk6IHRydWV9LAogICAgICB9LAoKICAgICAgb2JzZXJ2ZXJzOiBbJ191cGRhdGUodmFsdWUsIG1pbiwgbWF4LCBzdGVwKSddLAoKICAgICAgX2NhbGNSYXRpbzogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gKHRoaXMuX2NsYW1wVmFsdWUodmFsdWUpIC0gdGhpcy5taW4pIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pOwogICAgICB9LAoKICAgICAgX2NsYW1wVmFsdWU6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMubWF4LCBNYXRoLm1heCh0aGlzLm1pbiwgdGhpcy5fY2FsY1N0ZXAodmFsdWUpKSk7CiAgICAgIH0sCgogICAgICBfY2FsY1N0ZXA6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgLy8gcG9seW1lci9pc3N1ZXMvMjQ5MwogICAgICAgIHZhbHVlID0gcGFyc2VGbG9hdCh2YWx1ZSk7CgogICAgICAgIGlmICghdGhpcy5zdGVwKSB7CiAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQoKICAgICAgICB2YXIgbnVtU3RlcHMgPSBNYXRoLnJvdW5kKCh2YWx1ZSAtIHRoaXMubWluKSAvIHRoaXMuc3RlcCk7CiAgICAgICAgaWYgKHRoaXMuc3RlcCA8IDEpIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogRm9yIHNtYWxsIHZhbHVlcyBvZiB0aGlzLnN0ZXAsIGlmIHdlIGNhbGN1bGF0ZSB0aGUgc3RlcCB1c2luZwogICAgICAgICAgICogYE1hdGgucm91bmQodmFsdWUgLyBzdGVwKSAqIHN0ZXBgIHdlIG1heSBoaXQgYSBwcmVjaXNpb24gcG9pbnQgaXNzdWUKICAgICAgICAgICAqIGVnLiAwLjEgKiAwLjIgPSAgMC4wMjAwMDAwMDAwMDAwMDAwMDQKICAgICAgICAgICAqIGh0dHA6Ly9kb2NzLm9yYWNsZS5jb20vY2QvRTE5OTU3LTAxLzgwNi0zNTY4L25jZ19nb2xkYmVyZy5odG1sCiAgICAgICAgICAgKgogICAgICAgICAgICogYXMgYSB3b3JrIGFyb3VuZCB3ZSBjYW4gZGl2aWRlIGJ5IHRoZSByZWNpcHJvY2FsIG9mIGBzdGVwYAogICAgICAgICAgICovCiAgICAgICAgICByZXR1cm4gbnVtU3RlcHMgLyAoMSAvIHRoaXMuc3RlcCkgKyB0aGlzLm1pbjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIG51bVN0ZXBzICogdGhpcy5zdGVwICsgdGhpcy5taW47CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3ZhbGlkYXRlVmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdGhpcy5fY2xhbXBWYWx1ZSh0aGlzLnZhbHVlKTsKICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5vbGRWYWx1ZSA9IGlzTmFOKHYpID8gdGhpcy5vbGRWYWx1ZSA6IHY7CiAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgIT09IHY7CiAgICAgIH0sCgogICAgICBfdXBkYXRlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl92YWxpZGF0ZVZhbHVlKCk7CiAgICAgICAgdGhpcy5fc2V0UmF0aW8odGhpcy5fY2FsY1JhdGlvKHRoaXMudmFsdWUpICogMTAwKTsKICAgICAgfQoKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246IFtQcm9ncmVzcyAmCiAgICBhY3Rpdml0eV0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL3Byb2dyZXNzLWFjdGl2aXR5Lmh0bWwpCgogICAgVGhlIHByb2dyZXNzIGJhcnMgYXJlIGZvciBzaXR1YXRpb25zIHdoZXJlIHRoZSBwZXJjZW50YWdlIGNvbXBsZXRlZCBjYW4gYmUKICAgIGRldGVybWluZWQuIFRoZXkgZ2l2ZSB1c2VycyBhIHF1aWNrIHNlbnNlIG9mIGhvdyBtdWNoIGxvbmdlciBhbiBvcGVyYXRpb24KICAgIHdpbGwgdGFrZS4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItcHJvZ3Jlc3MgdmFsdWU9IjEwIj48L3BhcGVyLXByb2dyZXNzPgoKICAgIFRoZXJlIGlzIGFsc28gYSBzZWNvbmRhcnkgcHJvZ3Jlc3Mgd2hpY2ggaXMgdXNlZnVsIGZvciBkaXNwbGF5aW5nIGludGVybWVkaWF0ZQogICAgcHJvZ3Jlc3MsIHN1Y2ggYXMgdGhlIGJ1ZmZlciBsZXZlbCBkdXJpbmcgYSBzdHJlYW1pbmcgcGxheWJhY2sgcHJvZ3Jlc3MgYmFyLgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci1wcm9ncmVzcyB2YWx1ZT0iMTAiIHNlY29uZGFyeS1wcm9ncmVzcz0iMzAiPjwvcGFwZXItcHJvZ3Jlc3M+CgogICAgIyMjIFN0eWxpbmcgcHJvZ3Jlc3MgYmFyOgoKICAgIFRvIGNoYW5nZSB0aGUgYWN0aXZlIHByb2dyZXNzIGJhciBjb2xvcjoKCiAgICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiAjZTkxZTYzOwogICAgICAgIH0KCiAgICBUbyBjaGFuZ2UgdGhlIHNlY29uZGFyeSBwcm9ncmVzcyBiYXIgY29sb3I6CgogICAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICAgIC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yOiAjZjhiYmQwOwogICAgICAgIH0KCiAgICBUbyBjaGFuZ2UgdGhlIHByb2dyZXNzIGJhciBiYWNrZ3JvdW5kIGNvbG9yOgoKICAgICAgICBwYXBlci1wcm9ncmVzcyB7CiAgICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvcjogIzY0ZmZkYTsKICAgICAgICB9CgogICAgQWRkIHRoZSBjbGFzcyBgdHJhbnNpdGluZ2AgdG8gYSBwYXBlci1wcm9ncmVzcyB0byBhbmltYXRlIHRoZSBwcm9ncmVzcyBiYXIgd2hlbgogICAgdGhlIHZhbHVlIGNoYW5nZWQuIFlvdSBjYW4gYWxzbyBjdXN0b21pemUgdGhlIHRyYW5zaXRpb246CgogICAgICAgIHBhcGVyLXByb2dyZXNzIHsKICAgICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wOHM7CiAgICAgICAgICAtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlOwogICAgICAgICAgLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWRlbGF5OiAwczsKICAgICAgICB9CgogICAgVG8gY2hhbmdlIHRoZSBkdXJhdGlvbiBvZiB0aGUgaW5kZXRlcm1pbmF0ZSBjeWNsZToKCiAgICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgICAgLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uOiAyczsKICAgICAgICB9CgogICAgVGhlIGZvbGxvd2luZyBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0KICAgIGAtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lcmAgfCBNaXhpbiBhcHBsaWVkIHRvIGNvbnRhaW5lciB8IGB7fWAKICAgIGAtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb25gIHwgRHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24gfCBgMC4wOHNgCiAgICBgLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbmAgfCBUaGUgdGltaW5nIGZ1bmN0aW9uIGZvciB0aGUgdHJhbnNpdGlvbiB8IGBlYXNlYAogICAgYC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheWAgfCBkZWxheSBmb3IgdGhlIHRyYW5zaXRpb24gfCBgMHNgCiAgICBgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3JgIHwgQ29sb3Igb2YgdGhlIGNvbnRhaW5lciB8IGAtLWdvb2dsZS1ncmV5LTMwMGAKICAgIGAtLXBhcGVyLXByb2dyZXNzLWFjdGl2ZS1jb2xvcmAgfCBUaGUgY29sb3Igb2YgdGhlIGFjdGl2ZSBiYXIgfCBgLS1nb29nbGUtZ3JlZW4tNTAwYAogICAgYC0tcGFwZXItcHJvZ3Jlc3Mtc2Vjb25kYXJ5LWNvbG9yYCB8IFRoZSBjb2xvciBvZiB0aGUgc2Vjb25kYXJ5IGJhciB8IGAtLWdvb2dsZS1ncmVlbi0xMDBgCiAgICBgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1hY3RpdmUtY29sb3JgIHwgVGhlIGNvbG9yIG9mIHRoZSBhY3RpdmUgYmFyIGlmIGRpc2FibGVkIHwgYC0tZ29vZ2xlLWdyZXktNTAwYAogICAgYC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtc2Vjb25kYXJ5LWNvbG9yYCB8IFRoZSBjb2xvciBvZiB0aGUgc2Vjb25kYXJ5IGJhciBpZiBkaXNhYmxlZCAgfCBgLS1nb29nbGUtZ3JleS0zMDBgCiAgICBgLS1wYXBlci1wcm9ncmVzcy1oZWlnaHRgIHwgVGhlIGhlaWdodCBvZiB0aGUgcHJvZ3Jlc3MgYmFyIHwgYDRweGAKICAgIGAtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb25gIHwgRHVyYXRpb24gb2YgYW4gaW5kZXRlcm1pbmF0ZSBjeWNsZSB8IGAyc2AKCiAgICBAZ3JvdXAgUGFwZXIgRWxlbWVudHMKICAgIEBlbGVtZW50IHBhcGVyLXByb2dyZXNzCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDIwMHB4OwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICA6aG9zdChbaGlkZGVuXSksIFtoaWRkZW5dIHsKICAgICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgICNwcm9ncmVzc0NvbnRhaW5lciB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItcHJvZ3Jlc3MtY29udGFpbmVyOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyLAogICAgICAvKiB0aGUgc3RyaXBlIGZvciB0aGUgaW5kZXRlcm1pbmF0ZSBhbmltYXRpb24qLwogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGhlaWdodDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0LCA0cHgpOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzLAogICAgICAjc2Vjb25kYXJ5UHJvZ3Jlc3MsCiAgICAgIC5pbmRldGVybWluYXRlOjphZnRlciB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZpdDsKICAgICAgfQoKICAgICAgI3Byb2dyZXNzQ29udGFpbmVyLAogICAgICAuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXBhcGVyLXByb2dyZXNzLWNvbnRhaW5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZXktMzAwKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KC50cmFuc2l0aW5nKSAjcHJpbWFyeVByb2dyZXNzLAogICAgICA6aG9zdCgudHJhbnNpdGluZykgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtOwogICAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybTsKCiAgICAgICAgLyogRHVyYXRpb24gKi8KICAgICAgICAtd2Via2l0LXRyYW5zaXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZHVyYXRpb24sIDAuMDhzKTsKICAgICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1wcm9ncmVzcy10cmFuc2l0aW9uLWR1cmF0aW9uLCAwLjA4cyk7CgogICAgICAgIC8qIFRpbWluZyBmdW5jdGlvbiAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uLCBlYXNlKTsKICAgICAgICB0cmFuc2l0aW9uLXRpbWluZy1mdW5jdGlvbjogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb24sIGVhc2UpOwoKICAgICAgICAvKiBEZWxheSAqLwogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbi1kZWxheTogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtdHJhbnNpdGlvbi1kZWxheSwgMHMpOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXByb2dyZXNzLXRyYW5zaXRpb24tZGVsYXksIDBzKTsKICAgICAgfQoKICAgICAgI3ByaW1hcnlQcm9ncmVzcywKICAgICAgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtZml0OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgdHJhbnNmb3JtLW9yaWdpbjogbGVmdCBjZW50ZXI7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgwKTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAjcHJpbWFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1hY3RpdmUtY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi01MDApKTsKICAgICAgfQoKICAgICAgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ncmVlbi0xMDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI3ByaW1hcnlQcm9ncmVzcyB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItcHJvZ3Jlc3MtZGlzYWJsZWQtYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtZ3JleS01MDApKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgI3NlY29uZGFyeVByb2dyZXNzIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ncmV5LTMwMCkpOwogICAgICB9CgogICAgICA6aG9zdCg6bm90KFtkaXNhYmxlZF0pKSAjcHJpbWFyeVByb2dyZXNzLmluZGV0ZXJtaW5hdGUgewogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogcmlnaHQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IHJpZ2h0IGNlbnRlcjsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1iYXIgdmFyKC0tcGFwZXItcHJvZ3Jlc3MtaW5kZXRlcm1pbmF0ZS1jeWNsZS1kdXJhdGlvbiwgMnMpIGxpbmVhciBpbmZpbml0ZTsKICAgICAgICBhbmltYXRpb246IGluZGV0ZXJtaW5hdGUtYmFyIHZhcigtLXBhcGVyLXByb2dyZXNzLWluZGV0ZXJtaW5hdGUtY3ljbGUtZHVyYXRpb24sIDJzKSBsaW5lYXIgaW5maW5pdGU7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW2Rpc2FibGVkXSkpICNwcmltYXJ5UHJvZ3Jlc3MuaW5kZXRlcm1pbmF0ZTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtLW9yaWdpbjogY2VudGVyIGNlbnRlcjsKICAgICAgICB0cmFuc2Zvcm0tb3JpZ2luOiBjZW50ZXIgY2VudGVyOwoKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogaW5kZXRlcm1pbmF0ZS1zcGxpdHRlciB2YXIoLS1wYXBlci1wcm9ncmVzcy1pbmRldGVybWluYXRlLWN5Y2xlLWR1cmF0aW9uLCAycykgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1iYXIgewogICAgICAgIDAlIHsKICAgICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgtMTAwJSk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgICA3NSUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKC4yOCwuNjIsLjM3LC45MSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlWCgwKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBpbmRldGVybWluYXRlLXNwbGl0dGVyIHsKICAgICAgICAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgfQogICAgICAgIDMwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgtMTI1JSk7CiAgICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguNDIsMCwuNiwuOCk7CiAgICAgICAgfQogICAgICAgIDkwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGVYKC43NSkgdHJhbnNsYXRlWCgxMjUlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgaW5kZXRlcm1pbmF0ZS1iYXIgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpIHRyYW5zbGF0ZVgoLTEwMCUpOwogICAgICAgIH0KICAgICAgICA1MCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoMSkgdHJhbnNsYXRlWCgwJSk7CiAgICAgICAgfQogICAgICAgIDc1JSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCgxKSB0cmFuc2xhdGVYKDAlKTsKICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguMjgsLjYyLC4zNywuOTEpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDApIHRyYW5zbGF0ZVgoMCUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBpbmRldGVybWluYXRlLXNwbGl0dGVyIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoLTEyNSUpOwogICAgICAgIH0KICAgICAgICAzMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKC0xMjUlKTsKICAgICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllciguNDIsMCwuNiwuOCk7CiAgICAgICAgfQogICAgICAgIDkwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlWCguNzUpIHRyYW5zbGF0ZVgoMTI1JSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZVgoLjc1KSB0cmFuc2xhdGVYKDEyNSUpOwogICAgICAgIH0KICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJwcm9ncmVzc0NvbnRhaW5lciI+CiAgICAgIDxkaXYgaWQ9InNlY29uZGFyeVByb2dyZXNzIiBoaWRkZW5cJD0iW1tfaGlkZVNlY29uZGFyeVByb2dyZXNzKHNlY29uZGFyeVJhdGlvKV1dIj48L2Rpdj4KICAgICAgPGRpdiBpZD0icHJpbWFyeVByb2dyZXNzIj48L2Rpdj4KICAgIDwvZGl2PgpgLAoKICAgICAgaXM6ICdwYXBlci1wcm9ncmVzcycsCiAgICAgIGJlaGF2aW9yczogW0lyb25SYW5nZUJlaGF2aW9yXSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzZWNvbmRhcnkgcHJvZ3Jlc3MuCiAgICAgICAgICovCiAgICAgICAgc2Vjb25kYXJ5UHJvZ3Jlc3M6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAwfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHNlY29uZGFyeSByYXRpbwogICAgICAgICAqLwogICAgICAgIHNlY29uZGFyeVJhdGlvOiB7dHlwZTogTnVtYmVyLCB2YWx1ZTogMCwgcmVhZE9ubHk6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBVc2UgYW4gaW5kZXRlcm1pbmF0ZSBwcm9ncmVzcyBpbmRpY2F0b3IuCiAgICAgICAgICovCiAgICAgICAgaW5kZXRlcm1pbmF0ZToKICAgICAgICAgICAge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZSwgb2JzZXJ2ZXI6ICdfdG9nZ2xlSW5kZXRlcm1pbmF0ZSd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIGlmIHRoZSBwcm9ncmVzcyBpcyBkaXNhYmxlZC4KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlZDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgIG9ic2VydmVyOiAnX2Rpc2FibGVkQ2hhbmdlZCcKICAgICAgICB9CiAgICAgIH0sCgogICAgICBvYnNlcnZlcnM6CiAgICAgICAgICBbJ19wcm9ncmVzc0NoYW5nZWQoc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSknXSwKCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7cm9sZTogJ3Byb2dyZXNzYmFyJ30sCgogICAgICBfdG9nZ2xlSW5kZXRlcm1pbmF0ZTogZnVuY3Rpb24oaW5kZXRlcm1pbmF0ZSkgewogICAgICAgIC8vIElmIHdlIHVzZSBhdHRyaWJ1dGUvY2xhc3MgYmluZGluZywgdGhlIGFuaW1hdGlvbiBzb21ldGltZXMgZG9lc24ndAogICAgICAgIC8vIHRyYW5zbGF0ZSBwcm9wZXJseSBvbiBTYWZhcmkgNy4xLiBTbyBpbnN0ZWFkLCB3ZSB0b2dnbGUgdGhlIGNsYXNzIGhlcmUgaW4KICAgICAgICAvLyB0aGUgdXBkYXRlIG1ldGhvZC4KICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdpbmRldGVybWluYXRlJywgaW5kZXRlcm1pbmF0ZSwgdGhpcy4kLnByaW1hcnlQcm9ncmVzcyk7CiAgICAgIH0sCgogICAgICBfdHJhbnNmb3JtUHJvZ3Jlc3M6IGZ1bmN0aW9uKHByb2dyZXNzLCByYXRpbykgewogICAgICAgIHZhciB0cmFuc2Zvcm0gPSAnc2NhbGVYKCcgKyAocmF0aW8gLyAxMDApICsgJyknOwogICAgICAgIHByb2dyZXNzLnN0eWxlLnRyYW5zZm9ybSA9IHByb2dyZXNzLnN0eWxlLndlYmtpdFRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKICAgICAgfSwKCiAgICAgIF9tYWluUmF0aW9DaGFuZ2VkOiBmdW5jdGlvbihyYXRpbykgewogICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsIHJhdGlvKTsKICAgICAgfSwKCiAgICAgIF9wcm9ncmVzc0NoYW5nZWQ6IGZ1bmN0aW9uKAogICAgICAgICAgc2Vjb25kYXJ5UHJvZ3Jlc3MsIHZhbHVlLCBtaW4sIG1heCwgaW5kZXRlcm1pbmF0ZSkgewogICAgICAgIHNlY29uZGFyeVByb2dyZXNzID0gdGhpcy5fY2xhbXBWYWx1ZShzZWNvbmRhcnlQcm9ncmVzcyk7CiAgICAgICAgdmFsdWUgPSB0aGlzLl9jbGFtcFZhbHVlKHZhbHVlKTsKCiAgICAgICAgdmFyIHNlY29uZGFyeVJhdGlvID0gdGhpcy5fY2FsY1JhdGlvKHNlY29uZGFyeVByb2dyZXNzKSAqIDEwMDsKICAgICAgICB2YXIgbWFpblJhdGlvID0gdGhpcy5fY2FsY1JhdGlvKHZhbHVlKSAqIDEwMDsKCiAgICAgICAgdGhpcy5fc2V0U2Vjb25kYXJ5UmF0aW8oc2Vjb25kYXJ5UmF0aW8pOwogICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5zZWNvbmRhcnlQcm9ncmVzcywgc2Vjb25kYXJ5UmF0aW8pOwogICAgICAgIHRoaXMuX3RyYW5zZm9ybVByb2dyZXNzKHRoaXMuJC5wcmltYXJ5UHJvZ3Jlc3MsIG1haW5SYXRpbyk7CgogICAgICAgIHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MgPSBzZWNvbmRhcnlQcm9ncmVzczsKCiAgICAgICAgaWYgKGluZGV0ZXJtaW5hdGUpIHsKICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhcmlhLXZhbHVlbm93Jyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbm93JywgdmFsdWUpOwogICAgICAgIH0KICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1pbicsIG1pbik7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVtYXgnLCBtYXgpOwogICAgICB9LAoKICAgICAgX2Rpc2FibGVkQ2hhbmdlZDogZnVuY3Rpb24oZGlzYWJsZWQpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1kaXNhYmxlZCcsIGRpc2FibGVkID8gJ3RydWUnIDogJ2ZhbHNlJyk7CiAgICAgIH0sCgogICAgICBfaGlkZVNlY29uZGFyeVByb2dyZXNzOiBmdW5jdGlvbihzZWNvbmRhcnlSYXRpbykgewogICAgICAgIHJldHVybiBzZWNvbmRhcnlSYXRpbyA9PT0gMDsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCB0ZW1wbGF0ZSRkID0gaHRtbGAKPHN0eWxlPgogIDpob3N0IHsKICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemU6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1zaXplLCAxNnB4KTsKICAgIC8qIC0xcHggaXMgYSBzZW50aW5lbCBmb3IgdGhlIGRlZmF1bHQgYW5kIGlzIHJlcGxhY2UgaW4gXGBhdHRhY2hlZFxgLiAqLwogICAgLS1jYWxjdWxhdGVkLXBhcGVyLXJhZGlvLWJ1dHRvbi1pbmstc2l6ZTogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplLCAtMXB4KTsKICB9CgogIDpob3N0KDpmb2N1cykgewogICAgb3V0bGluZTogbm9uZTsKICB9CgogICNyYWRpb0NvbnRhaW5lciB7CiAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB3aWR0aDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZSk7CiAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLXNpemUpOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKCiAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyOwogIH0KCiAgI2luayB7CiAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB0b3A6IDUwJTsKICAgIGxlZnQ6IDUwJTsKICAgIHJpZ2h0OiBhdXRvOwogICAgd2lkdGg6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplKTsKICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUpOwogICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNjsKICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgtNTAlLCAtNTAlKTsKICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlKC01MCUsIC01MCUpOwogIH0KCiAgI2lua1tjaGVja2VkXSB7CiAgICBjb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgfQoKICAjb2ZmUmFkaW8sICNvblJhZGlvIHsKICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICB0b3A6IDA7CiAgICBsZWZ0OiAwOwogICAgd2lkdGg6IDEwMCU7CiAgICBoZWlnaHQ6IDEwMCU7CiAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgfQoKICAjb2ZmUmFkaW8gewogICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWJhY2tncm91bmQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgIHRyYW5zaXRpb246IGJvcmRlci1jb2xvciAwLjI4czsKICB9CgogICNvblJhZGlvIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDApOwogICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gZWFzZSAwLjI4czsKICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSBlYXNlIDAuMjhzOwogICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI29mZlJhZGlvIHsKICAgIGJvcmRlci1jb2xvcjogdmFyKC0tcGFwZXItcmFkaW8tYnV0dG9uLWNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKICB9CgogIDpob3N0KFtjaGVja2VkXSkgI29uUmFkaW8gewogICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNSk7CiAgfQoKICAjcmFkaW9MYWJlbCB7CiAgICBsaW5lLWhlaWdodDogbm9ybWFsOwogICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgIG1hcmdpbi1sZWZ0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgICB3aGl0ZS1zcGFjZTogbm9ybWFsOwogICAgY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi1sYWJlbC1jb2xvciwgdmFyKC0tcHJpbWFyeS10ZXh0LWNvbG9yKSk7CgogICAgQGFwcGx5IC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsOwogIH0KCiAgOmhvc3QoW2NoZWNrZWRdKSAjcmFkaW9MYWJlbCB7CiAgICBAYXBwbHkgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY2hlY2tlZDsKICB9CgogICNyYWRpb0xhYmVsOmRpcihydGwpIHsKICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgbWFyZ2luLXJpZ2h0OiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZywgMTBweCk7CiAgfQoKICAjcmFkaW9MYWJlbFtoaWRkZW5dIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgfQoKICAvKiBkaXNhYmxlZCBzdGF0ZSAqLwoKICA6aG9zdChbZGlzYWJsZWRdKSAjb2ZmUmFkaW8gewogICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgIG9wYWNpdHk6IDAuNTsKICB9CgogIDpob3N0KFtkaXNhYmxlZF1bY2hlY2tlZF0pICNvblJhZGlvIHsKICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXJhZGlvLWJ1dHRvbi11bmNoZWNrZWQtY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwogICAgb3BhY2l0eTogMC41OwogIH0KCiAgOmhvc3QoW2Rpc2FibGVkXSkgI3JhZGlvTGFiZWwgewogICAgLyogc2xpZ2h0bHkgZGFya2VyIHRoYW4gdGhlIGJ1dHRvbiwgc28gdGhhdCBpdCdzIHJlYWRhYmxlICovCiAgICBvcGFjaXR5OiAwLjY1OwogIH0KPC9zdHlsZT4KCjxkaXYgaWQ9InJhZGlvQ29udGFpbmVyIj4KICA8ZGl2IGlkPSJvZmZSYWRpbyI+PC9kaXY+CiAgPGRpdiBpZD0ib25SYWRpbyI+PC9kaXY+CjwvZGl2PgoKPGRpdiBpZD0icmFkaW9MYWJlbCI+PHNsb3Q+PC9zbG90PjwvZGl2PmA7CiAgICB0ZW1wbGF0ZSRkLnNldEF0dHJpYnV0ZSgnc3RyaXAtd2hpdGVzcGFjZScsICcnKTsKCiAgICAvKioKICAgIE1hdGVyaWFsIGRlc2lnbjogW1JhZGlvIGJ1dHRvbl0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL3NlbGVjdGlvbi1jb250cm9scy5odG1sI3NlbGVjdGlvbi1jb250cm9scy1yYWRpby1idXR0b24pCgogICAgYHBhcGVyLXJhZGlvLWJ1dHRvbmAgaXMgYSBidXR0b24gdGhhdCBjYW4gYmUgZWl0aGVyIGNoZWNrZWQgb3IgdW5jaGVja2VkLiBUaGUKICAgIHVzZXIgY2FuIHRhcCB0aGUgcmFkaW8gYnV0dG9uIHRvIGNoZWNrIG9yIHVuY2hlY2sgaXQuCgogICAgVXNlIGEgYDxwYXBlci1yYWRpby1ncm91cD5gIHRvIGdyb3VwIGEgc2V0IG9mIHJhZGlvIGJ1dHRvbnMuIFdoZW4gcmFkaW8gYnV0dG9ucwogICAgYXJlIGluc2lkZSBhIHJhZGlvIGdyb3VwLCBleGFjdGx5IG9uZSByYWRpbyBidXR0b24gaW4gdGhlIGdyb3VwIGNhbiBiZSBjaGVja2VkCiAgICBhdCBhbnkgdGltZS4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uPjwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgIDxwYXBlci1yYWRpby1idXR0b24+SXRlbSBsYWJlbDwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICMjIyBTdHlsaW5nCgogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1iYWNrZ3JvdW5kLWNvbG9yYCB8IFJhZGlvIGJ1dHRvbiBiYWNrZ3JvdW5kIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIG5vdCBjaGVja2VkIHwgYHRyYW5zcGFyZW50YAogICAgYC0tcGFwZXItcmFkaW8tYnV0dG9uLXVuY2hlY2tlZC1jb2xvcmAgfCBSYWRpbyBidXR0b24gY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgbm90IGNoZWNrZWQgfCBgLS1wcmltYXJ5LXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tdW5jaGVja2VkLWluay1jb2xvcmAgfCBTZWxlY3RlZC9mb2N1cyByaXBwbGUgY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgbm90IGNoZWNrZWQgfCBgLS1wcmltYXJ5LXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1jb2xvcmAgfCBSYWRpbyBidXR0b24gY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgY2hlY2tlZCB8IGAtLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tY2hlY2tlZC1pbmstY29sb3JgIHwgU2VsZWN0ZWQvZm9jdXMgcmlwcGxlIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGNoZWNrZWQgfCBgLS1wcmltYXJ5LWNvbG9yYAogICAgYC0tcGFwZXItcmFkaW8tYnV0dG9uLXNpemVgIHwgU2l6ZSBvZiB0aGUgcmFkaW8gYnV0dG9uIHwgYDE2cHhgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemVgIHwgU2l6ZSBvZiB0aGUgcmlwcGxlIHwgYDQ4cHhgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY29sb3JgIHwgTGFiZWwgY29sb3IgfCBgLS1wcmltYXJ5LXRleHQtY29sb3JgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtc3BhY2luZ2AgfCBTcGFjaW5nIGJldHdlZW4gdGhlIGxhYmVsIGFuZCB0aGUgYnV0dG9uIHwgYDEwcHhgCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tcmFkaW8tY29udGFpbmVyYCB8IEEgbWl4aW4gYXBwbGllZCB0byB0aGUgaW50ZXJuYWwgcmFkaW8gY29udGFpbmVyIHwgYHt9YAogICAgYC0tcGFwZXItcmFkaW8tYnV0dG9uLWxhYmVsYCB8IEEgbWl4aW4gYXBwbGllZCB0byB0aGUgaW50ZXJuYWwgbGFiZWwgfCBge31gCiAgICBgLS1wYXBlci1yYWRpby1idXR0b24tbGFiZWwtY2hlY2tlZGAgfCBBIG1peGluIGFwcGxpZWQgdG8gdGhlIGludGVybmFsIGxhYmVsIHdoZW4gdGhlIHJhZGlvIGJ1dHRvbiBpcyBjaGVja2VkIHwgYHt9YAoKICAgIFRoaXMgZWxlbWVudCBhcHBsaWVzIHRoZSBtaXhpbiBgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlYCBidXQgZG9lcyBub3QgaW1wb3J0CiAgICBgcGFwZXItc3R5bGVzL3R5cG9ncmFwaHkuaHRtbGAuIEluIG9yZGVyIHRvIGFwcGx5IHRoZSBgUm9ib3RvYCBmb250IHRvIHRoaXMKICAgIGVsZW1lbnQsIG1ha2Ugc3VyZSB5b3UndmUgaW1wb3J0ZWQgYHBhcGVyLXN0eWxlcy90eXBvZ3JhcGh5Lmh0bWxgLgoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItcmFkaW8tYnV0dG9uCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiB0ZW1wbGF0ZSRkLAoKICAgICAgaXM6ICdwYXBlci1yYWRpby1idXR0b24nLAoKICAgICAgYmVoYXZpb3JzOiBbUGFwZXJDaGVja2VkRWxlbWVudEJlaGF2aW9yXSwKCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7cm9sZTogJ3JhZGlvJywgJ2FyaWEtY2hlY2tlZCc6IGZhbHNlLCB0YWJpbmRleDogMH0sCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzIGR1ZSB0byB1c2VyIGludGVyYWN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IGNoYW5nZQogICAgICAgICAqLwoKICAgICAgICAvKioKICAgICAgICAgKiBGaXJlZCB3aGVuIHRoZSBjaGVja2VkIHN0YXRlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAZXZlbnQgaXJvbi1jaGFuZ2UKICAgICAgICAgKi8KCiAgICAgICAgYXJpYUFjdGl2ZUF0dHJpYnV0ZToge3R5cGU6IFN0cmluZywgdmFsdWU6ICdhcmlhLWNoZWNrZWQnfQogICAgICB9LAoKICAgICAgcmVhZHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3JpcHBsZUNvbnRhaW5lciA9IHRoaXMuJC5yYWRpb0NvbnRhaW5lcjsKICAgICAgfSwKCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICAvLyBXYWl0IHVudGlsIHN0eWxlcyBoYXZlIHJlc29sdmVkIHRvIGNoZWNrIGZvciB0aGUgZGVmYXVsdCBzZW50aW5lbC4KICAgICAgICAvLyBTZWUgcG9seW1lciM0MDA5IGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGlua1NpemUgPQogICAgICAgICAgICAgIHRoaXMuZ2V0Q29tcHV0ZWRTdHlsZVZhbHVlKCctLWNhbGN1bGF0ZWQtcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplJykKICAgICAgICAgICAgICAgICAgLnRyaW0oKTsKICAgICAgICAgIC8vIElmIHVuc2V0LCBjb21wdXRlIGFuZCBzZXQgdGhlIGRlZmF1bHQgYC0tcGFwZXItcmFkaW8tYnV0dG9uLWluay1zaXplYC4KICAgICAgICAgIGlmIChpbmtTaXplID09PSAnLTFweCcpIHsKICAgICAgICAgICAgdmFyIHNpemUgPSBwYXJzZUZsb2F0KAogICAgICAgICAgICAgICAgdGhpcy5nZXRDb21wdXRlZFN0eWxlVmFsdWUoJy0tY2FsY3VsYXRlZC1wYXBlci1yYWRpby1idXR0b24tc2l6ZScpCiAgICAgICAgICAgICAgICAgICAgLnRyaW0oKSk7CiAgICAgICAgICAgIHZhciBkZWZhdWx0SW5rU2l6ZSA9IE1hdGguZmxvb3IoMyAqIHNpemUpOwoKICAgICAgICAgICAgLy8gVGhlIGJ1dHRvbiBhbmQgcmlwcGxlIG5lZWQgdG8gaGF2ZSB0aGUgc2FtZSBwYXJpdHkgc28gdGhhdCB0aGVpcgogICAgICAgICAgICAvLyBjZW50ZXJzIGFsaWduLgogICAgICAgICAgICBpZiAoZGVmYXVsdElua1NpemUgJSAyICE9PSBzaXplICUgMikgewogICAgICAgICAgICAgIGRlZmF1bHRJbmtTaXplKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHsKICAgICAgICAgICAgICAnLS1wYXBlci1yYWRpby1idXR0b24taW5rLXNpemUnOiBkZWZhdWx0SW5rU2l6ZSArICdweCcsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9LAogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICAgKiBgSXJvbk1lbnViYXJCZWhhdmlvcmAgaW1wbGVtZW50cyBhY2Nlc3NpYmxlIG1lbnViYXIgYmVoYXZpb3IuCiAgICAgKgogICAgICogQHBvbHltZXJCZWhhdmlvciBJcm9uTWVudWJhckJlaGF2aW9yCiAgICAgKi8KICAgIGNvbnN0IElyb25NZW51YmFyQmVoYXZpb3JJbXBsID0gewoKICAgICAgaG9zdEF0dHJpYnV0ZXM6IHsncm9sZSc6ICdtZW51YmFyJ30sCgogICAgICAvKioKICAgICAgICogQHR5cGUgeyFPYmplY3R9CiAgICAgICAqLwogICAgICBrZXlCaW5kaW5nczogeydsZWZ0JzogJ19vbkxlZnRLZXknLCAncmlnaHQnOiAnX29uUmlnaHRLZXknfSwKCiAgICAgIF9vblVwS2V5OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHRoaXMuZm9jdXNlZEl0ZW0uY2xpY2soKTsKICAgICAgICBldmVudC5kZXRhaWwua2V5Ym9hcmRFdmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICB9LAoKICAgICAgX29uRG93bktleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLmZvY3VzZWRJdGVtLmNsaWNrKCk7CiAgICAgICAgZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfSwKCiAgICAgIGdldCBfaXNSVEwoKSB7CiAgICAgICAgcmV0dXJuIHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpWydkaXJlY3Rpb24nXSA9PT0gJ3J0bCc7CiAgICAgIH0sCgogICAgICBfb25MZWZ0S2V5OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICh0aGlzLl9pc1JUTCkgewogICAgICAgICAgdGhpcy5fZm9jdXNOZXh0KCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXMoKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfSwKCiAgICAgIF9vblJpZ2h0S2V5OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICh0aGlzLl9pc1JUTCkgewogICAgICAgICAgdGhpcy5fZm9jdXNQcmV2aW91cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl9mb2N1c05leHQoKTsKICAgICAgICB9CiAgICAgICAgZXZlbnQuZGV0YWlsLmtleWJvYXJkRXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgfSwKCiAgICAgIF9vbktleWRvd246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKHRoaXMua2V5Ym9hcmRFdmVudE1hdGNoZXNLZXlzKGV2ZW50LCAndXAgZG93biBsZWZ0IHJpZ2h0IGVzYycpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBhbGwgb3RoZXIga2V5cyBmb2N1cyB0aGUgbWVudSBpdGVtIHN0YXJ0aW5nIHdpdGggdGhhdCBjaGFyYWN0ZXIKICAgICAgICB0aGlzLl9mb2N1c1dpdGhLZXlib2FyZEV2ZW50KGV2ZW50KTsKICAgICAgfQoKICAgIH07CgogICAgLyoqIEBwb2x5bWVyQmVoYXZpb3IgKi8KICAgIGNvbnN0IElyb25NZW51YmFyQmVoYXZpb3IgPSBbSXJvbk1lbnVCZWhhdmlvciwgSXJvbk1lbnViYXJCZWhhdmlvckltcGxdOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qKgogICAgTWF0ZXJpYWwgZGVzaWduOiBbUmFkaW8KICAgIGJ1dHRvbl0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL3NlbGVjdGlvbi1jb250cm9scy5odG1sI3NlbGVjdGlvbi1jb250cm9scy1yYWRpby1idXR0b24pCgogICAgYHBhcGVyLXJhZGlvLWdyb3VwYCBhbGxvd3MgdXNlciB0byBzZWxlY3QgYXQgbW9zdCBvbmUgcmFkaW8gYnV0dG9uIGZyb20gYSBzZXQuCiAgICBDaGVja2luZyBvbmUgcmFkaW8gYnV0dG9uIHRoYXQgYmVsb25ncyB0byBhIHJhZGlvIGdyb3VwIHVuY2hlY2tzIGFueQogICAgcHJldmlvdXNseSBjaGVja2VkIHJhZGlvIGJ1dHRvbiB3aXRoaW4gdGhlIHNhbWUgZ3JvdXAuIFVzZQogICAgYHNlbGVjdGVkYCB0byBnZXQgb3Igc2V0IHRoZSBzZWxlY3RlZCByYWRpbyBidXR0b24uCgogICAgVGhlIDxwYXBlci1yYWRpby1idXR0b25zPiBpbnNpZGUgdGhlIGdyb3VwIG11c3QgaGF2ZSB0aGUgYG5hbWVgIGF0dHJpYnV0ZQogICAgc2V0LgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ic21hbGwiPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzbWFsbCI+U21hbGw8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ibWVkaXVtIj5NZWRpdW08L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0ibGFyZ2UiPkxhcmdlPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KCiAgICBSYWRpby1idXR0b24tZ3JvdXBzIGNhbiBiZSBtYWRlIG9wdGlvbmFsLCBhbmQgYWxsb3cgemVybyBidXR0b25zIHRvIGJlIHNlbGVjdGVkOgoKICAgICAgICA8cGFwZXItcmFkaW8tZ3JvdXAgc2VsZWN0ZWQ9InNtYWxsIiBhbGxvdy1lbXB0eS1zZWxlY3Rpb24+CiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9InNtYWxsIj5TbWFsbDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJtZWRpdW0iPk1lZGl1bTwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJsYXJnZSI+TGFyZ2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgoKICAgIFNlZSA8YSBocmVmPSJwYXBlci1yYWRpby1idXR0b24iPnBhcGVyLXJhZGlvLWJ1dHRvbjwvYT4gZm9yIG1vcmUKICAgIGluZm9ybWF0aW9uIGFib3V0IGBwYXBlci1yYWRpby1idXR0b25gLgoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1yYWRpby1ncm91cC1pdGVtLXBhZGRpbmdgIHwgVGhlIHBhZGRpbmcgb2YgdGhlIGl0ZW0gfCBgMTJweGAKCiAgICBAZ3JvdXAgUGFwZXIgRWxlbWVudHMKICAgIEBlbGVtZW50IHBhcGVyLXJhZGlvLWdyb3VwCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCA6OnNsb3R0ZWQoKikgewogICAgICAgIHBhZGRpbmc6IHZhcigtLXBhcGVyLXJhZGlvLWdyb3VwLWl0ZW0tcGFkZGluZywgMTJweCk7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgLAoKICAgICAgaXM6ICdwYXBlci1yYWRpby1ncm91cCcsCiAgICAgIGJlaGF2aW9yczogW0lyb25NZW51YmFyQmVoYXZpb3JdLAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7CiAgICAgICAgcm9sZTogJ3JhZGlvZ3JvdXAnLAogICAgICB9LAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHJhZGlvIGdyb3VwIHNlbGVjdGlvbiBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQGV2ZW50IHBhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQKICAgICAgICAgKi8KCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVuIGZyb20gUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yCiAgICAgICAgICovCiAgICAgICAgYXR0ckZvclNlbGVjdGVkOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ25hbWUnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogT3ZlcnJpZGVuIGZyb20gUG9seW1lci5Jcm9uU2VsZWN0YWJsZUJlaGF2aW9yCiAgICAgICAgICovCiAgICAgICAgc2VsZWN0ZWRBdHRyaWJ1dGU6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnY2hlY2tlZCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZW4gZnJvbSBQb2x5bWVyLklyb25TZWxlY3RhYmxlQmVoYXZpb3IKICAgICAgICAgKi8KICAgICAgICBzZWxlY3RhYmxlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ3BhcGVyLXJhZGlvLWJ1dHRvbid9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCByYWRpby1idXR0b25zIGNhbiBiZSBkZXNlbGVjdGVkCiAgICAgICAgICovCiAgICAgICAgYWxsb3dFbXB0eVNlbGVjdGlvbjoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3RzIHRoZSBnaXZlbiB2YWx1ZS4KICAgICAgICovCiAgICAgIHNlbGVjdDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgbmV3SXRlbSA9IHRoaXMuX3ZhbHVlVG9JdGVtKHZhbHVlKTsKICAgICAgICBpZiAobmV3SXRlbSAmJiBuZXdJdGVtLmhhc0F0dHJpYnV0ZSgnZGlzYWJsZWQnKSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQpIHsKICAgICAgICAgIHZhciBvbGRJdGVtID0gdGhpcy5fdmFsdWVUb0l0ZW0odGhpcy5zZWxlY3RlZCk7CgogICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWQgPT0gdmFsdWUpIHsKICAgICAgICAgICAgLy8gSWYgZGVzZWxlY3RpbmcgaXMgYWxsb3dlZCB3ZSdsbCBoYXZlIHRvIGFwcGx5IGFuIGVtcHR5IHNlbGVjdGlvbi4KICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB3ZSBzaG91bGQgZm9yY2UgdGhlIHNlbGVjdGlvbiB0byBzdGF5IGFuZCBtYWtlIHRoaXMKICAgICAgICAgICAgLy8gYWN0aW9uIGEgbm8tb3AuCiAgICAgICAgICAgIGlmICh0aGlzLmFsbG93RW1wdHlTZWxlY3Rpb24pIHsKICAgICAgICAgICAgICB2YWx1ZSA9ICcnOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChvbGRJdGVtKQogICAgICAgICAgICAgICAgb2xkSXRlbS5jaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAob2xkSXRlbSkKICAgICAgICAgICAgb2xkSXRlbS5jaGVja2VkID0gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBJcm9uU2VsZWN0YWJsZUJlaGF2aW9yLnNlbGVjdC5hcHBseSh0aGlzLCBbdmFsdWVdKTsKICAgICAgICB0aGlzLmZpcmUoJ3BhcGVyLXJhZGlvLWdyb3VwLWNoYW5nZWQnKTsKICAgICAgfSwKCiAgICAgIF9hY3RpdmF0ZUZvY3VzZWRJdGVtOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9pdGVtQWN0aXZhdGUodGhpcy5fdmFsdWVGb3JJdGVtKHRoaXMuZm9jdXNlZEl0ZW0pLCB0aGlzLmZvY3VzZWRJdGVtKTsKICAgICAgfSwKCiAgICAgIF9vblVwS2V5OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHRoaXMuX2ZvY3VzUHJldmlvdXMoKTsKICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKTsKICAgICAgfSwKCiAgICAgIF9vbkRvd25LZXk6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdGhpcy5fZm9jdXNOZXh0KCk7CiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCk7CiAgICAgIH0sCgogICAgICBfb25MZWZ0S2V5OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIElyb25NZW51YmFyQmVoYXZpb3JJbXBsLl9vbkxlZnRLZXkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLl9hY3RpdmF0ZUZvY3VzZWRJdGVtKCk7CiAgICAgIH0sCgogICAgICBfb25SaWdodEtleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBJcm9uTWVudWJhckJlaGF2aW9ySW1wbC5fb25SaWdodEtleS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMuX2FjdGl2YXRlRm9jdXNlZEl0ZW0oKTsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgdGVtcGxhdGUkZSA9IGh0bWxgCiAgPHN0eWxlPgogICAgOmhvc3QgewogICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgIHdpZHRoOiAyMDBweDsKICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMCk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1zZWNvbmRhcnktY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTMwMCkpOwogICAgICAtLXBhcGVyLXByb2dyZXNzLWRpc2FibGVkLWFjdGl2ZS1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWFjdGl2ZS1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1zZWNvbmRhcnktY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0OiB2YXIoLS1wYXBlci1zbGlkZXItaGVpZ2h0LCAycHgpOwogICAgfQoKICAgIC8qIGZvY3VzIHNob3dzIHRoZSByaXBwbGUgKi8KICAgIDpob3N0KDpmb2N1cykgewogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgIC8qKgogICAgICAqIE5PVEUoa2VhbnVsZWUpOiBUaG91Z2ggOmhvc3QtY29udGV4dCBpcyBub3QgdW5pdmVyc2FsbHkgc3VwcG9ydGVkLCBzb21lIHBhZ2VzCiAgICAgICogc3RpbGwgcmVseSBvbiBwYXBlci1zbGlkZXIgYmVpbmcgZmxpcHBlZCB3aGVuIGRpcj0icnRsIiBpcyBzZXQgb24gYm9keS4gRm9yIGZ1bGwKICAgICAgKiBjb21wYXRpYmlsaXR5LCBkaXI9InJ0bCIgbXVzdCBiZSBleHBsaWNpdGx5IHNldCBvbiBwYXBlci1zbGlkZXIuCiAgICAgICovCiAgICA6ZGlyKHJ0bCkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICB9CgogICAgLyoqCiAgICAgICogTk9URShrZWFudWxlZSk6IFRoaXMgaXMgc2VwYXJhdGUgZnJvbSB0aGUgcnVsZSBhYm92ZSBiZWNhdXNlIDpob3N0LWNvbnRleHQgbWF5CiAgICAgICogbm90IGJlIHJlY29nbml6ZWQuCiAgICAgICovCiAgICA6aG9zdChbZGlyPSJydGwiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoLTEpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlWCgtMSk7CiAgICB9CgogICAgLyoqCiAgICAgICogTk9URShrZWFudWxlZSk6IE5lZWRlZCB0byBvdmVycmlkZSB0aGUgOmhvc3QtY29udGV4dCBydWxlICh3aGVyZSBzdXBwb3J0ZWQpCiAgICAgICogdG8gc3VwcG9ydCBMVFIgc2xpZGVycyBpbiBSVEwgcGFnZXMuCiAgICAgICovCiAgICA6aG9zdChbZGlyPSJsdHIiXSkgI3NsaWRlckNvbnRhaW5lciB7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZVgoMSk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGVYKDEpOwogICAgfQoKICAgICNzbGlkZXJDb250YWluZXIgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICBtYXJnaW4tbGVmdDogY2FsYygxNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgbWFyZ2luLXJpZ2h0OiBjYWxjKDE1cHggKyB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpLzIpOwogICAgfQoKICAgICNzbGlkZXJDb250YWluZXI6Zm9jdXMgewogICAgICBvdXRsaW5lOiAwOwogICAgfQoKICAgICNzbGlkZXJDb250YWluZXIuZWRpdGFibGUgewogICAgICBtYXJnaW4tdG9wOiAxMnB4OwogICAgICBtYXJnaW4tYm90dG9tOiAxMnB4OwogICAgfQoKICAgIC5iYXItY29udGFpbmVyIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICB9CgogICAgLnJpbmcgPiAuYmFyLWNvbnRhaW5lciB7CiAgICAgIGxlZnQ6IGNhbGMoNXB4ICsgdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjE4cyBlYXNlOwogICAgfQoKICAgIC5yaW5nLmV4cGFuZC5kcmFnZ2luZyA+IC5iYXItY29udGFpbmVyIHsKICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgIH0KCiAgICAucmluZy5leHBhbmQ6bm90KC5waW4pID4gLmJhci1jb250YWluZXIgewogICAgICBsZWZ0OiBjYWxjKDhweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkvMik7CiAgICB9CgogICAgI3NsaWRlckJhciB7CiAgICAgIHBhZGRpbmc6IDE1cHggMDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1iYXItY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgLS1wYXBlci1wcm9ncmVzcy1jb250YWluZXItY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1jb250YWluZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXNsaWRlci1oZWlnaHQpOwogICAgfQoKICAgIC5zbGlkZXItbWFya2VycyB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgLyogc2xpZGVyLWtub2IgaXMgMzBweCArIHRoZSBzbGlkZXItaGVpZ2h0IHNvIHRoYXQgdGhlIG1hcmtlcnMgc2hvdWxkIHN0YXJ0IGF0IGEgb2Zmc2V0IG9mIDE1cHgqLwogICAgICB0b3A6IDE1cHg7CiAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgbGVmdDogMDsKICAgICAgcmlnaHQ6IC0xcHg7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgIH0KCiAgICAuc2xpZGVyLW1hcmtlciB7CiAgICAgIEBhcHBseSAtLWxheW91dC1mbGV4OwogICAgfQogICAgLnNsaWRlci1tYXJrZXJzOjphZnRlciwKICAgIC5zbGlkZXItbWFya2VyOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6ICIiOwogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7CiAgICAgIHdpZHRoOiAycHg7CiAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KTsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvciwgIzAwMCk7CiAgICB9CgogICAgLnNsaWRlci1rbm9iIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICBsZWZ0OiAwOwogICAgICB0b3A6IDA7CiAgICAgIG1hcmdpbi1sZWZ0OiBjYWxjKC0xNXB4IC0gdmFyKC0tY2FsY3VsYXRlZC1wYXBlci1zbGlkZXItaGVpZ2h0KS8yKTsKICAgICAgd2lkdGg6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgICBoZWlnaHQ6IGNhbGMoMzBweCArIHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItc2xpZGVyLWhlaWdodCkpOwogICAgfQoKICAgIC50cmFuc2l0aW5nID4gLnNsaWRlci1rbm9iIHsKICAgICAgdHJhbnNpdGlvbjogbGVmdCAwLjA4cyBlYXNlOwogICAgfQoKICAgIC5zbGlkZXIta25vYjpmb2N1cyB7CiAgICAgIG91dGxpbmU6IG5vbmU7CiAgICB9CgogICAgLnNsaWRlci1rbm9iLmRyYWdnaW5nIHsKICAgICAgdHJhbnNpdGlvbjogbm9uZTsKICAgIH0KCiAgICAuc25hcHMgPiAuc2xpZGVyLWtub2IuZHJhZ2dpbmcgewogICAgICB0cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjA4cyBlYXNlOwogICAgICB0cmFuc2l0aW9uOiB0cmFuc2Zvcm0gMC4wOHMgZWFzZTsKICAgIH0KCiAgICAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICBtYXJnaW46IDEwcHg7CiAgICAgIHdpZHRoOiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgaGVpZ2h0OiBjYWxjKDEwMCUgLSAyMHB4KTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3IsIHZhcigtLWdvb2dsZS1ibHVlLTcwMCkpOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKCiAgICAgIC1tb3otYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKCiAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IC13ZWJraXQtdHJhbnNmb3JtLCBiYWNrZ3JvdW5kLWNvbG9yLCBib3JkZXI7CiAgICAgIHRyYW5zaXRpb24tcHJvcGVydHk6IHRyYW5zZm9ybSwgYmFja2dyb3VuZC1jb2xvciwgYm9yZGVyOwogICAgICB0cmFuc2l0aW9uLWR1cmF0aW9uOiAwLjE4czsKICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2U7CiAgICB9CgogICAgLmV4cGFuZDpub3QoLnBpbikgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICAtd2Via2l0LXRyYW5zZm9ybTogc2NhbGUoMS41KTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjUpOwogICAgfQoKICAgIC5yaW5nID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3IsIHRyYW5zcGFyZW50KTsKICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTQwMCkpOwogICAgfQoKICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNzAwKSk7CiAgICB9CgogICAgLnBpbiA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgY29udGVudDogIiI7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiA1MCU7CiAgICAgIG1hcmdpbi1sZWZ0OiAtMTNweDsKICAgICAgd2lkdGg6IDI2cHg7CiAgICAgIGhlaWdodDogMjZweDsKICAgICAgYm9yZGVyLXJhZGl1czogNTAlIDUwJSA1MCUgMDsKCiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTQ1ZGVnKSBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMCkgdHJhbnNsYXRlKDApOwogICAgfQoKICAgIC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlLAogICAgLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgIHRyYW5zaXRpb246IC13ZWJraXQtdHJhbnNmb3JtIC4xOHMgZWFzZSwgYmFja2dyb3VuZC1jb2xvciAuMThzIGVhc2U7CiAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAuMThzIGVhc2UsIGJhY2tncm91bmQtY29sb3IgLjE4cyBlYXNlOwogICAgfQoKICAgIC5waW4ucmluZyA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgIH0KCiAgICAucGluLmV4cGFuZCA+IC5zbGlkZXIta25vYiA+IC5zbGlkZXIta25vYi1pbm5lcjo6YmVmb3JlIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtNDVkZWcpIHNjYWxlKDEpIHRyYW5zbGF0ZSgxN3B4LCAtMTdweCk7CiAgICAgIHRyYW5zZm9ybTogcm90YXRlKC00NWRlZykgc2NhbGUoMSkgdHJhbnNsYXRlKDE3cHgsIC0xN3B4KTsKICAgIH0KCiAgICAucGluID4gLnNsaWRlci1rbm9iID4gLnNsaWRlci1rbm9iLWlubmVyOjphZnRlciB7CiAgICAgIGNvbnRlbnQ6IGF0dHIodmFsdWUpOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgbGVmdDogNTAlOwogICAgICBtYXJnaW4tbGVmdDogLTE2cHg7CiAgICAgIHdpZHRoOiAzMnB4OwogICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1mb250LWNvbG9yLCAjZmZmKTsKICAgICAgZm9udC1zaXplOiAxMHB4OwoKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApIHRyYW5zbGF0ZSgwKTsKICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKSB0cmFuc2xhdGUoMCk7CiAgICB9CgogICAgLnBpbi5leHBhbmQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXI6OmFmdGVyIHsKICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDEpIHRyYW5zbGF0ZSgwLCAtMTdweCk7CiAgICAgIHRyYW5zZm9ybTogc2NhbGUoMSkgdHJhbnNsYXRlKDAsIC0xN3B4KTsKICAgIH0KCiAgICAvKiBwYXBlci1pbnB1dCAqLwogICAgLnNsaWRlci1pbnB1dCB7CiAgICAgIHdpZHRoOiA1MHB4OwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQtY29udGFpbmVyLWlucHV0OwogICAgICB9OwogICAgICBAYXBwbHkgLS1wYXBlci1zbGlkZXItaW5wdXQ7CiAgICB9CgogICAgLyogZGlzYWJsZWQgc3RhdGUgKi8KICAgICNzbGlkZXJDb250YWluZXIuZGlzYWJsZWQgewogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgIH0KCiAgICAuZGlzYWJsZWQgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXItZGlzYWJsZWQta25vYi1jb2xvciwgdmFyKC0tcGFwZXItZ3JleS00MDApKTsKICAgICAgYm9yZGVyOiAycHggc29saWQgdmFyKC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLWtub2ItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiBzY2FsZTNkKDAuNzUsIDAuNzUsIDEpOwogICAgICB0cmFuc2Zvcm06IHNjYWxlM2QoMC43NSwgMC43NSwgMSk7CiAgICB9CgogICAgLmRpc2FibGVkLnJpbmcgPiAuc2xpZGVyLWtub2IgPiAuc2xpZGVyLWtub2ItaW5uZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvciwgdHJhbnNwYXJlbnQpOwogICAgICBib3JkZXI6IDJweCBzb2xpZCB2YXIoLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3IsIHZhcigtLXBhcGVyLWdyZXktNDAwKSk7CiAgICB9CgogICAgcGFwZXItcmlwcGxlIHsKICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS03MDApKTsKICAgIH0KICA8L3N0eWxlPgoKICA8ZGl2IGlkPSJzbGlkZXJDb250YWluZXIiIGNsYXNzXCQ9IltbX2dldENsYXNzTmFtZXMoZGlzYWJsZWQsIHBpbiwgc25hcHMsIGltbWVkaWF0ZVZhbHVlLCBtaW4sIGV4cGFuZCwgZHJhZ2dpbmcsIHRyYW5zaXRpbmcsIGVkaXRhYmxlKV1dIj4KICAgIDxkaXYgY2xhc3M9ImJhci1jb250YWluZXIiPgogICAgICA8cGFwZXItcHJvZ3Jlc3MgZGlzYWJsZWRcJD0iW1tkaXNhYmxlZF1dIiBpZD0ic2xpZGVyQmFyIiBhcmlhLWhpZGRlbj0idHJ1ZSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIHN0ZXA9Iltbc3RlcF1dIiB2YWx1ZT0iW1tpbW1lZGlhdGVWYWx1ZV1dIiBzZWNvbmRhcnktcHJvZ3Jlc3M9Iltbc2Vjb25kYXJ5UHJvZ3Jlc3NdXSIgb24tZG93bj0iX2JhcmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX2JhcnRyYWNrIiBvbi10YXA9Il9iYXJjbGljayI+CiAgICAgIDwvcGFwZXItcHJvZ3Jlc3M+CiAgICA8L2Rpdj4KCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc25hcHNdXSI+CiAgICAgIDxkaXYgY2xhc3M9InNsaWRlci1tYXJrZXJzIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW21hcmtlcnNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzbGlkZXItbWFya2VyIj48L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPGRpdiBpZD0ic2xpZGVyS25vYiIgY2xhc3M9InNsaWRlci1rbm9iIiBvbi1kb3duPSJfa25vYmRvd24iIG9uLXVwPSJfcmVzZXRLbm9iIiBvbi10cmFjaz0iX29uVHJhY2siIG9uLXRyYW5zaXRpb25lbmQ9Il9rbm9iVHJhbnNpdGlvbkVuZCI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2xpZGVyLWtub2ItaW5uZXIiIHZhbHVlXCQ9IltbaW1tZWRpYXRlVmFsdWVdXSI+PC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KCiAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2VkaXRhYmxlXV0iPgogICAgPHBhcGVyLWlucHV0IGlkPSJpbnB1dCIgdHlwZT0ibnVtYmVyIiBzdGVwPSJbW3N0ZXBdXSIgbWluPSJbW21pbl1dIiBtYXg9IltbbWF4XV0iIGNsYXNzPSJzbGlkZXItaW5wdXQiIGRpc2FibGVkXCQ9IltbZGlzYWJsZWRdXSIgdmFsdWU9IltbaW1tZWRpYXRlVmFsdWVdXSIgb24tY2hhbmdlPSJfY2hhbmdlVmFsdWUiIG9uLWtleWRvd249Il9pbnB1dEtleURvd24iIG5vLWxhYmVsLWZsb2F0PgogICAgPC9wYXBlci1pbnB1dD4KICA8L3RlbXBsYXRlPgpgOwogICAgdGVtcGxhdGUkZS5zZXRBdHRyaWJ1dGUoJ3N0cmlwLXdoaXRlc3BhY2UnLCAnJyk7CgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbU2xpZGVyc10oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL3NsaWRlcnMuaHRtbCkKCiAgICBgcGFwZXItc2xpZGVyYCBhbGxvd3MgdXNlciB0byBzZWxlY3QgYSB2YWx1ZSBmcm9tIGEgcmFuZ2Ugb2YgdmFsdWVzIGJ5CiAgICBtb3ZpbmcgdGhlIHNsaWRlciB0aHVtYi4gIFRoZSBpbnRlcmFjdGl2ZSBuYXR1cmUgb2YgdGhlIHNsaWRlciBtYWtlcyBpdCBhCiAgICBncmVhdCBjaG9pY2UgZm9yIHNldHRpbmdzIHRoYXQgcmVmbGVjdCBpbnRlbnNpdHkgbGV2ZWxzLCBzdWNoIGFzIHZvbHVtZSwKICAgIGJyaWdodG5lc3MsIG9yIGNvbG9yIHNhdHVyYXRpb24uCgogICAgRXhhbXBsZToKCiAgICAgICAgPHBhcGVyLXNsaWRlcj48L3BhcGVyLXNsaWRlcj4KCiAgICBVc2UgYG1pbmAgYW5kIGBtYXhgIHRvIHNwZWNpZnkgdGhlIHNsaWRlciByYW5nZS4gIERlZmF1bHQgaXMgMCB0byAxMDAuCgogICAgRXhhbXBsZToKCiAgICAgICAgPHBhcGVyLXNsaWRlciBtaW49IjEwIiBtYXg9IjIwMCIgdmFsdWU9IjExMCI+PC9wYXBlci1zbGlkZXI+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1zbGlkZXItY29udGFpbmVyLWNvbG9yYCB8IFRoZSBiYWNrZ3JvdW5kIGNvbG9yIG9mIHRoZSBiYXIgfCBgLS1wYXBlci1ncmV5LTQwMGAKICAgIGAtLXBhcGVyLXNsaWRlci1iYXItY29sb3JgIHwgVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHNsaWRlciB8IGB0cmFuc3BhcmVudGAKICAgIGAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3JgIHwgVGhlIHByb2dyZXNzIGJhciBjb2xvciB8IGAtLWdvb2dsZS1ibHVlLTcwMGAKICAgIGAtLXBhcGVyLXNsaWRlci1zZWNvbmRhcnktY29sb3JgIHwgVGhlIHNlY29uZGFyeSBwcm9ncmVzcyBiYXIgY29sb3IgfCBgLS1nb29nbGUtYmx1ZS0zMDBgCiAgICBgLS1wYXBlci1zbGlkZXIta25vYi1jb2xvcmAgfCBUaGUga25vYiBjb2xvciB8IGAtLWdvb2dsZS1ibHVlLTcwMGAKICAgIGAtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1rbm9iLWNvbG9yYCB8IFRoZSBkaXNhYmxlZCBrbm9iIGNvbG9yIHwgYC0tcGFwZXItZ3JleS00MDBgCiAgICBgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yYCB8IFRoZSBwaW4gY29sb3IgfCBgLS1nb29nbGUtYmx1ZS03MDBgCiAgICBgLS1wYXBlci1zbGlkZXItZm9udC1jb2xvcmAgfCBUaGUgcGluJ3MgdGV4dCBjb2xvciB8IGAjZmZmYAogICAgYC0tcGFwZXItc2xpZGVyLW1hcmtlcnMtY29sb3JgIHwgVGhlIHNuYXBzIG1hcmtlcnMgY29sb3IgfCBgIzAwMGAKICAgIGAtLXBhcGVyLXNsaWRlci1kaXNhYmxlZC1hY3RpdmUtY29sb3JgIHwgVGhlIGRpc2FibGVkIHByb2dyZXNzIGJhciBjb2xvciB8IGAtLXBhcGVyLWdyZXktNDAwYAogICAgYC0tcGFwZXItc2xpZGVyLWRpc2FibGVkLXNlY29uZGFyeS1jb2xvcmAgfCBUaGUgZGlzYWJsZWQgc2Vjb25kYXJ5IHByb2dyZXNzIGJhciBjb2xvciB8IGAtLXBhcGVyLWdyZXktNDAwYAogICAgYC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtY29sb3JgIHwgVGhlIGZpbGwgY29sb3Igb2YgdGhlIGtub2IgYXQgdGhlIGZhciBsZWZ0IHwgYHRyYW5zcGFyZW50YAogICAgYC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yYCB8IFRoZSBib3JkZXIgY29sb3Igb2YgdGhlIGtub2IgYXQgdGhlIGZhciBsZWZ0IHwgYC0tcGFwZXItZ3JleS00MDBgCiAgICBgLS1wYXBlci1zbGlkZXItcGluLXN0YXJ0LWNvbG9yYCB8IFRoZSBjb2xvciBvZiB0aGUgcGluIGF0IHRoZSBmYXIgbGVmdCB8IGAtLXBhcGVyLWdyZXktNDAwYAogICAgYC0tcGFwZXItc2xpZGVyLWhlaWdodGAgfCBIZWlnaHQgb2YgdGhlIHByb2dyZXNzIGJhciB8IGAycHhgCiAgICBgLS1wYXBlci1zbGlkZXItaW5wdXRgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgaW5wdXQgaW4gZWRpdGFibGUgbW9kZSB8IGB7fWAKICAgIGAtLXBhcGVyLXNsaWRlci1pbnB1dC1jb250YWluZXItaW5wdXRgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0IGluIGVkaXRhYmxlIG1vZGUgfCBge31gCgogICAgQGdyb3VwIFBhcGVyIEVsZW1lbnRzCiAgICBAZWxlbWVudCBwYXBlci1zbGlkZXIKICAgIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgKi8KICAgIFBvbHltZXIoewogICAgICBfdGVtcGxhdGU6IHRlbXBsYXRlJGUsCgogICAgICBpczogJ3BhcGVyLXNsaWRlcicsCgogICAgICBiZWhhdmlvcnM6IFsKICAgICAgICBJcm9uQTExeUtleXNCZWhhdmlvciwKICAgICAgICBJcm9uRm9ybUVsZW1lbnRCZWhhdmlvciwKICAgICAgICBQYXBlcklua3lGb2N1c0JlaGF2aW9yLAogICAgICAgIElyb25SYW5nZUJlaGF2aW9yCiAgICAgIF0sCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgdmFsdWU6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHRoZSBzbGlkZXIgdGh1bWIgc25hcHMgdG8gdGljayBtYXJrcyBldmVubHkgc3BhY2VkIGJhc2VkCiAgICAgICAgICogb24gdGhlIGBzdGVwYCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBzbmFwczogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCBhIHBpbiB3aXRoIG51bWVyaWMgdmFsdWUgbGFiZWwgaXMgc2hvd24gd2hlbiB0aGUgc2xpZGVyIHRodW1iCiAgICAgICAgICogaXMgcHJlc3NlZC4gVXNlIGZvciBzZXR0aW5ncyBmb3Igd2hpY2ggdXNlcnMgbmVlZCB0byBrbm93IHRoZSBleGFjdAogICAgICAgICAqIHZhbHVlIG9mIHRoZSBzZXR0aW5nLgogICAgICAgICAqLwogICAgICAgIHBpbjogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbnVtYmVyIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBzZWNvbmRhcnkgcHJvZ3Jlc3MuCiAgICAgICAgICovCiAgICAgICAgc2Vjb25kYXJ5UHJvZ3Jlc3M6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfc2Vjb25kYXJ5UHJvZ3Jlc3NDaGFuZ2VkJywKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCBhbiBpbnB1dCBpcyBzaG93biBhbmQgdXNlciBjYW4gdXNlIGl0IHRvIHNldCB0aGUgc2xpZGVyIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGVkaXRhYmxlOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBpbW1lZGlhdGUgdmFsdWUgb2YgdGhlIHNsaWRlci4gIFRoaXMgdmFsdWUgaXMgdXBkYXRlZCB3aGlsZSB0aGUgdXNlcgogICAgICAgICAqIGlzIGRyYWdnaW5nIHRoZSBzbGlkZXIuCiAgICAgICAgICovCiAgICAgICAgaW1tZWRpYXRlVmFsdWU6IHsKICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG1hcmtlcnMKICAgICAgICAgKi8KICAgICAgICBtYXhNYXJrZXJzOiB7CiAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUga25vYiBpcyBleHBhbmRlZAogICAgICAgICAqLwogICAgICAgIGV4cGFuZDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgIH0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIGEgdG91Y2htb3ZlIG9uIHRoZSBzbGlkZXIgYmFyIGRvZXNuJ3QgZHJhZyB0aGUgc2xpZGVyIHRodW5iLgogICAgICAgICAqIFRhcHBpbmcgb24gdGhlIHNsaWRlciBiYXIgc3RpbGwgdXBkYXRlcyB0aGUgc2xpZGVyJ3MgcG9zaXRpb24KICAgICAgICAgKi8KICAgICAgICBpZ25vcmVCYXJUb3VjaDogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUcnVlIHdoZW4gdGhlIHVzZXIgaXMgZHJhZ2dpbmcgdGhlIHNsaWRlci4KICAgICAgICAgKi8KICAgICAgICBkcmFnZ2luZzogewogICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgIHZhbHVlOiBmYWxzZSwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0sCgogICAgICAgIHRyYW5zaXRpbmc6IHsKICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICByZWFkT25seTogdHJ1ZSwKICAgICAgICB9LAoKICAgICAgICBtYXJrZXJzOiB7CiAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgIH0sCgogICAgICBvYnNlcnZlcnM6IFsKICAgICAgICAnX3VwZGF0ZUtub2IodmFsdWUsIG1pbiwgbWF4LCBzbmFwcywgc3RlcCknLAogICAgICAgICdfdmFsdWVDaGFuZ2VkKHZhbHVlKScsCiAgICAgICAgJ19pbW1lZGlhdGVWYWx1ZUNoYW5nZWQoaW1tZWRpYXRlVmFsdWUpJywKICAgICAgICAnX3VwZGF0ZU1hcmtlcnMobWF4TWFya2VycywgbWluLCBtYXgsIHNuYXBzKScsCiAgICAgIF0sCgogICAgICBob3N0QXR0cmlidXRlczogewogICAgICAgIHJvbGU6ICdzbGlkZXInLAogICAgICAgIHRhYmluZGV4OiAwLAogICAgICB9LAoKICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSAqLwogICAgICBrZXlCaW5kaW5nczogewogICAgICAgICdsZWZ0JzogJ19sZWZ0S2V5JywKICAgICAgICAncmlnaHQnOiAnX3JpZ2h0S2V5JywKICAgICAgICAnZG93biBwYWdlZG93biBob21lJzogJ19kZWNyZW1lbnRLZXknLAogICAgICAgICd1cCBwYWdldXAgZW5kJzogJ19pbmNyZW1lbnRLZXknLAogICAgICB9LAoKICAgICAgcmVhZHk6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLmlnbm9yZUJhclRvdWNoKSB7CiAgICAgICAgICBzZXRUb3VjaEFjdGlvbih0aGlzLiQuc2xpZGVyQmFyLCAnYXV0bycpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBJbmNyZWFzZXMgdmFsdWUgYnkgYHN0ZXBgIGJ1dCBub3QgYWJvdmUgYG1heGAuCiAgICAgICAqIEBtZXRob2QgaW5jcmVtZW50CiAgICAgICAqLwogICAgICBpbmNyZW1lbnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9jbGFtcFZhbHVlKHRoaXMudmFsdWUgKyB0aGlzLnN0ZXApOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIERlY3JlYXNlcyB2YWx1ZSBieSBgc3RlcGAgYnV0IG5vdCBiZWxvdyBgbWluYC4KICAgICAgICogQG1ldGhvZCBkZWNyZW1lbnQKICAgICAgICovCiAgICAgIGRlY3JlbWVudDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuX2NsYW1wVmFsdWUodGhpcy52YWx1ZSAtIHRoaXMuc3RlcCk7CiAgICAgIH0sCgogICAgICBfdXBkYXRlS25vYjogZnVuY3Rpb24odmFsdWUsIG1pbiwgbWF4LCBzbmFwcywgc3RlcCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLXZhbHVlbWluJywgbWluKTsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS12YWx1ZW1heCcsIG1heCk7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtdmFsdWVub3cnLCB2YWx1ZSk7CgogICAgICAgIHRoaXMuX3Bvc2l0aW9uS25vYih0aGlzLl9jYWxjUmF0aW8odmFsdWUpICogMTAwKTsKICAgICAgfSwKCiAgICAgIF92YWx1ZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuZmlyZSgndmFsdWUtY2hhbmdlJywge2NvbXBvc2VkOiB0cnVlfSk7CiAgICAgIH0sCgogICAgICBfaW1tZWRpYXRlVmFsdWVDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5kcmFnZ2luZykgewogICAgICAgICAgdGhpcy5maXJlKCdpbW1lZGlhdGUtdmFsdWUtY2hhbmdlJywge2NvbXBvc2VkOiB0cnVlfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLmltbWVkaWF0ZVZhbHVlOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9zZWNvbmRhcnlQcm9ncmVzc0NoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MgPSB0aGlzLl9jbGFtcFZhbHVlKHRoaXMuc2Vjb25kYXJ5UHJvZ3Jlc3MpOwogICAgICB9LAoKICAgICAgX2V4cGFuZEtub2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3NldEV4cGFuZCh0cnVlKTsKICAgICAgfSwKCiAgICAgIF9yZXNldEtub2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY2FuY2VsRGVib3VuY2VyKCdleHBhbmRLbm9iJyk7CiAgICAgICAgdGhpcy5fc2V0RXhwYW5kKGZhbHNlKTsKICAgICAgfSwKCiAgICAgIF9wb3NpdGlvbktub2I6IGZ1bmN0aW9uKHJhdGlvKSB7CiAgICAgICAgdGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUodGhpcy5fY2FsY1N0ZXAodGhpcy5fY2FsY0tub2JQb3NpdGlvbihyYXRpbykpKTsKICAgICAgICB0aGlzLl9zZXRSYXRpbyh0aGlzLl9jYWxjUmF0aW8odGhpcy5pbW1lZGlhdGVWYWx1ZSkgKiAxMDApOwoKICAgICAgICB0aGlzLiQuc2xpZGVyS25vYi5zdHlsZS5sZWZ0ID0gdGhpcy5yYXRpbyArICclJzsKICAgICAgICBpZiAodGhpcy5kcmFnZ2luZykgewogICAgICAgICAgdGhpcy5fa25vYnN0YXJ0eCA9ICh0aGlzLnJhdGlvICogdGhpcy5fdykgLyAxMDA7CiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZTNkKDAsIDAsIDAsIHRoaXMuJC5zbGlkZXJLbm9iKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfY2FsY0tub2JQb3NpdGlvbjogZnVuY3Rpb24ocmF0aW8pIHsKICAgICAgICByZXR1cm4gKHRoaXMubWF4IC0gdGhpcy5taW4pICogcmF0aW8gLyAxMDAgKyB0aGlzLm1pbjsKICAgICAgfSwKCiAgICAgIF9vblRyYWNrOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIHN3aXRjaCAoZXZlbnQuZGV0YWlsLnN0YXRlKSB7CiAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgIHRoaXMuX3RyYWNrU3RhcnQoZXZlbnQpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ3RyYWNrJzoKICAgICAgICAgICAgdGhpcy5fdHJhY2tYKGV2ZW50KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdlbmQnOgogICAgICAgICAgICB0aGlzLl90cmFja0VuZCgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfdHJhY2tTdGFydDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLl9zZXRUcmFuc2l0aW5nKGZhbHNlKTsKICAgICAgICB0aGlzLl93ID0gdGhpcy4kLnNsaWRlckJhci5vZmZzZXRXaWR0aDsKICAgICAgICB0aGlzLl94ID0gdGhpcy5yYXRpbyAqIHRoaXMuX3cgLyAxMDA7CiAgICAgICAgdGhpcy5fc3RhcnR4ID0gdGhpcy5feDsKICAgICAgICB0aGlzLl9rbm9ic3RhcnR4ID0gdGhpcy5fc3RhcnR4OwogICAgICAgIHRoaXMuX21pbnggPSAtdGhpcy5fc3RhcnR4OwogICAgICAgIHRoaXMuX21heHggPSB0aGlzLl93IC0gdGhpcy5fc3RhcnR4OwogICAgICAgIHRoaXMuJC5zbGlkZXJLbm9iLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7CiAgICAgICAgdGhpcy5fc2V0RHJhZ2dpbmcodHJ1ZSk7CiAgICAgIH0sCgogICAgICBfdHJhY2tYOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICghdGhpcy5kcmFnZ2luZykgewogICAgICAgICAgdGhpcy5fdHJhY2tTdGFydChldmVudCk7CiAgICAgICAgfQoKICAgICAgICB2YXIgZGlyZWN0aW9uID0gdGhpcy5faXNSVEwgPyAtMSA6IDE7CiAgICAgICAgdmFyIGR4ID0KICAgICAgICAgICAgTWF0aC5taW4odGhpcy5fbWF4eCwgTWF0aC5tYXgodGhpcy5fbWlueCwgZXZlbnQuZGV0YWlsLmR4ICogZGlyZWN0aW9uKSk7CiAgICAgICAgdGhpcy5feCA9IHRoaXMuX3N0YXJ0eCArIGR4OwoKICAgICAgICB2YXIgaW1tZWRpYXRlVmFsdWUgPQogICAgICAgICAgICB0aGlzLl9jYWxjU3RlcCh0aGlzLl9jYWxjS25vYlBvc2l0aW9uKHRoaXMuX3ggLyB0aGlzLl93ICogMTAwKSk7CiAgICAgICAgdGhpcy5fc2V0SW1tZWRpYXRlVmFsdWUoaW1tZWRpYXRlVmFsdWUpOwoKICAgICAgICAvLyB1cGRhdGUga25vYidzIHBvc2l0aW9uCiAgICAgICAgdmFyIHRyYW5zbGF0ZVggPQogICAgICAgICAgICAoKHRoaXMuX2NhbGNSYXRpbyh0aGlzLmltbWVkaWF0ZVZhbHVlKSAqIHRoaXMuX3cpIC0gdGhpcy5fa25vYnN0YXJ0eCk7CiAgICAgICAgdGhpcy50cmFuc2xhdGUzZCh0cmFuc2xhdGVYICsgJ3B4JywgMCwgMCwgdGhpcy4kLnNsaWRlcktub2IpOwogICAgICB9LAoKICAgICAgX3RyYWNrRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcyA9IHRoaXMuJC5zbGlkZXJLbm9iLnN0eWxlOwoKICAgICAgICB0aGlzLiQuc2xpZGVyS25vYi5jbGFzc0xpc3QucmVtb3ZlKCdkcmFnZ2luZycpOwogICAgICAgIHRoaXMuX3NldERyYWdnaW5nKGZhbHNlKTsKICAgICAgICB0aGlzLl9yZXNldEtub2IoKTsKICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5pbW1lZGlhdGVWYWx1ZTsKCiAgICAgICAgcy50cmFuc2Zvcm0gPSBzLndlYmtpdFRyYW5zZm9ybSA9ICcnOwoKICAgICAgICB0aGlzLmZpcmUoJ2NoYW5nZScsIHtjb21wb3NlZDogdHJ1ZX0pOwogICAgICB9LAoKICAgICAgX2tub2Jkb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHRoaXMuX2V4cGFuZEtub2IoKTsKCiAgICAgICAgLy8gY2FuY2VsIHNlbGVjdGlvbgogICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgIC8vIHNldCB0aGUgZm9jdXMgbWFudWFsbHkgYmVjYXVzZSB3ZSB3aWxsIGNhbGxlZCBwcmV2ZW50IGRlZmF1bHQKICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgIH0sCgogICAgICBfYmFydHJhY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKHRoaXMuX2FsbG93QmFyRXZlbnQoZXZlbnQpKSB7CiAgICAgICAgICB0aGlzLl9vblRyYWNrKGV2ZW50KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfYmFyY2xpY2s6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdGhpcy5fdyA9IHRoaXMuJC5zbGlkZXJCYXIub2Zmc2V0V2lkdGg7CiAgICAgICAgdmFyIHJlY3QgPSB0aGlzLiQuc2xpZGVyQmFyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciByYXRpbyA9IChldmVudC5kZXRhaWwueCAtIHJlY3QubGVmdCkgLyB0aGlzLl93ICogMTAwOwogICAgICAgIGlmICh0aGlzLl9pc1JUTCkgewogICAgICAgICAgcmF0aW8gPSAxMDAgLSByYXRpbzsKICAgICAgICB9CiAgICAgICAgdmFyIHByZXZSYXRpbyA9IHRoaXMucmF0aW87CgogICAgICAgIHRoaXMuX3NldFRyYW5zaXRpbmcodHJ1ZSk7CiAgICAgICAgdGhpcy5fcG9zaXRpb25Lbm9iKHJhdGlvKTsKCiAgICAgICAgLy8gaWYgdGhlIHJhdGlvIGRvZXNuJ3QgY2hhbmdlLCBzbGlkZXJLbm9iJ3MgYW5pbWF0aW9uIHdvbid0IHN0YXJ0CiAgICAgICAgLy8gYW5kIGBfa25vYlRyYW5zaXRpb25FbmRgIHdvbid0IGJlIGNhbGxlZAogICAgICAgIC8vIFRoZXJlZm9yZSwgd2UgbmVlZCB0byBtYW51YWxseSB1cGRhdGUgdGhlIGB0cmFuc2l0aW5nYCBzdGF0ZQogICAgICAgIGlmIChwcmV2UmF0aW8gPT09IHRoaXMucmF0aW8pIHsKICAgICAgICAgIHRoaXMuX3NldFRyYW5zaXRpbmcoZmFsc2UpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5hc3luYyhmdW5jdGlvbigpIHsKICAgICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJywge2NvbXBvc2VkOiB0cnVlfSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIGNhbmNlbCBzZWxlY3Rpb24KICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICAvLyBzZXQgdGhlIGZvY3VzIG1hbnVhbGx5IGJlY2F1c2Ugd2Ugd2lsbCBjYWxsZWQgcHJldmVudCBkZWZhdWx0CiAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICB9LAoKICAgICAgX2JhcmRvd246IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKHRoaXMuX2FsbG93QmFyRXZlbnQoZXZlbnQpKSB7CiAgICAgICAgICB0aGlzLmRlYm91bmNlKCdleHBhbmRLbm9iJywgdGhpcy5fZXhwYW5kS25vYiwgNjApOwogICAgICAgICAgdGhpcy5fYmFyY2xpY2soZXZlbnQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9rbm9iVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09PSB0aGlzLiQuc2xpZGVyS25vYikgewogICAgICAgICAgdGhpcy5fc2V0VHJhbnNpdGluZyhmYWxzZSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3VwZGF0ZU1hcmtlcnM6IGZ1bmN0aW9uKG1heE1hcmtlcnMsIG1pbiwgbWF4LCBzbmFwcykgewogICAgICAgIGlmICghc25hcHMpIHsKICAgICAgICAgIHRoaXMuX3NldE1hcmtlcnMoW10pOwogICAgICAgIH0KICAgICAgICB2YXIgc3RlcHMgPSBNYXRoLnJvdW5kKChtYXggLSBtaW4pIC8gdGhpcy5zdGVwKTsKICAgICAgICBpZiAoc3RlcHMgPiBtYXhNYXJrZXJzKSB7CiAgICAgICAgICBzdGVwcyA9IG1heE1hcmtlcnM7CiAgICAgICAgfQogICAgICAgIGlmIChzdGVwcyA8IDAgfHwgIWlzRmluaXRlKHN0ZXBzKSkgewogICAgICAgICAgc3RlcHMgPSAwOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zZXRNYXJrZXJzKG5ldyBBcnJheShzdGVwcykpOwogICAgICB9LAoKICAgICAgX21lcmdlQ2xhc3NlczogZnVuY3Rpb24oY2xhc3NlcykgewogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhjbGFzc2VzKQogICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uKGNsYXNzTmFtZSkgewogICAgICAgICAgICAgIHJldHVybiBjbGFzc2VzW2NsYXNzTmFtZV07CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIC5qb2luKCcgJyk7CiAgICAgIH0sCgogICAgICBfZ2V0Q2xhc3NOYW1lczogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX21lcmdlQ2xhc3Nlcyh7CiAgICAgICAgICBkaXNhYmxlZDogdGhpcy5kaXNhYmxlZCwKICAgICAgICAgIHBpbjogdGhpcy5waW4sCiAgICAgICAgICBzbmFwczogdGhpcy5zbmFwcywKICAgICAgICAgIHJpbmc6IHRoaXMuaW1tZWRpYXRlVmFsdWUgPD0gdGhpcy5taW4sCiAgICAgICAgICBleHBhbmQ6IHRoaXMuZXhwYW5kLAogICAgICAgICAgZHJhZ2dpbmc6IHRoaXMuZHJhZ2dpbmcsCiAgICAgICAgICB0cmFuc2l0aW5nOiB0aGlzLnRyYW5zaXRpbmcsCiAgICAgICAgICBlZGl0YWJsZTogdGhpcy5lZGl0YWJsZQogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgX2FsbG93QmFyRXZlbnQ6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgcmV0dXJuICgKICAgICAgICAgICAgIXRoaXMuaWdub3JlQmFyVG91Y2ggfHwKICAgICAgICAgICAgKGV2ZW50LmRldGFpbC5zb3VyY2VFdmVudCBpbnN0YW5jZW9mIE1vdXNlRXZlbnQpKQogICAgICB9LAoKICAgICAgZ2V0IF9pc1JUTCgpIHsKICAgICAgICBpZiAodGhpcy5fX2lzUlRMID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMuX19pc1JUTCA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRoaXMpWydkaXJlY3Rpb24nXSA9PT0gJ3J0bCc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9faXNSVEw7CiAgICAgIH0sCgogICAgICBfbGVmdEtleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5faXNSVEwpCiAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRLZXkoZXZlbnQpOwogICAgICAgIGVsc2UKICAgICAgICAgIHRoaXMuX2RlY3JlbWVudEtleShldmVudCk7CiAgICAgIH0sCgogICAgICBfcmlnaHRLZXk6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgaWYgKHRoaXMuX2lzUlRMKQogICAgICAgICAgdGhpcy5fZGVjcmVtZW50S2V5KGV2ZW50KTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLl9pbmNyZW1lbnRLZXkoZXZlbnQpOwogICAgICB9LAoKICAgICAgX2luY3JlbWVudEtleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgIGlmIChldmVudC5kZXRhaWwua2V5ID09PSAnZW5kJykgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmluY3JlbWVudCgpOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5maXJlKCdjaGFuZ2UnKTsKICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX2RlY3JlbWVudEtleTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgIGlmIChldmVudC5kZXRhaWwua2V5ID09PSAnaG9tZScpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWluOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5kZWNyZW1lbnQoKTsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJyk7CiAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9jaGFuZ2VWYWx1ZTogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB0aGlzLnZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlOwogICAgICAgIHRoaXMuZmlyZSgnY2hhbmdlJywge2NvbXBvc2VkOiB0cnVlfSk7CiAgICAgIH0sCgogICAgICBfaW5wdXRLZXlEb3duOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICB9LAoKICAgICAgLy8gY3JlYXRlIHRoZSBlbGVtZW50IHJpcHBsZSBpbnNpZGUgdGhlIGBzbGlkZXJLbm9iYAogICAgICBfY3JlYXRlUmlwcGxlOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9yaXBwbGVDb250YWluZXIgPSB0aGlzLiQuc2xpZGVyS25vYjsKICAgICAgICByZXR1cm4gUGFwZXJJbmt5Rm9jdXNCZWhhdmlvckltcGwuX2NyZWF0ZVJpcHBsZS5jYWxsKHRoaXMpOwogICAgICB9LAoKICAgICAgLy8gSGlkZSB0aGUgcmlwcGxlIHdoZW4gdXNlciBpcyBub3QgaW50ZXJhY3Rpbmcgd2l0aCBrZXlib2FyZC4KICAgICAgLy8gVGhpcyBiZWhhdmlvciBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciByaXBwbGUteSBjb250cm9scywgYnV0IGlzCiAgICAgIC8vIGFjY29yZGluZyB0byBzcGVjOgogICAgICAvLyBodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvc2xpZGVycy5odG1sCiAgICAgIF9mb2N1c2VkQ2hhbmdlZDogZnVuY3Rpb24ocmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZCkgewogICAgICAgIGlmIChyZWNlaXZlZEZvY3VzRnJvbUtleWJvYXJkKSB7CiAgICAgICAgICB0aGlzLmVuc3VyZVJpcHBsZSgpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5oYXNSaXBwbGUoKSkgewogICAgICAgICAgLy8gbm90ZSwgcmlwcGxlIG11c3QgYmUgdW4taGlkZGVuIHByaW9yIHRvIHNldHRpbmcgYGhvbGREb3duYAogICAgICAgICAgaWYgKHJlY2VpdmVkRm9jdXNGcm9tS2V5Ym9hcmQpIHsKICAgICAgICAgICAgdGhpcy5fcmlwcGxlLnN0eWxlLmRpc3BsYXkgPSAnJzsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX3JpcHBsZS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fcmlwcGxlLmhvbGREb3duID0gcmVjZWl2ZWRGb2N1c0Zyb21LZXlib2FyZDsKICAgICAgICB9CiAgICAgIH0KICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHNsaWRlcidzIHZhbHVlIGNoYW5nZXMuCiAgICAgICAqCiAgICAgICAqIEBldmVudCB2YWx1ZS1jaGFuZ2UKICAgICAgICovCgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbiB0aGUgc2xpZGVyJ3MgaW1tZWRpYXRlVmFsdWUgY2hhbmdlcy4gT25seSBvY2N1cnMgd2hpbGUgdGhlCiAgICAgICAqIHVzZXIgaXMgZHJhZ2dpbmcuCiAgICAgICAqCiAgICAgICAqIFRvIGRldGVjdCBjaGFuZ2VzIHRvIGltbWVkaWF0ZVZhbHVlIHRoYXQgaGFwcGVuIGZvciBhbnkgaW5wdXQgKGkuZS4KICAgICAgICogZHJhZ2dpbmcsIHRhcHBpbmcsIGNsaWNraW5nLCBldGMuKSBsaXN0ZW4gZm9yIGltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkCiAgICAgICAqIGluc3RlYWQuCiAgICAgICAqCiAgICAgICAqIEBldmVudCBpbW1lZGlhdGUtdmFsdWUtY2hhbmdlCiAgICAgICAqLwoKICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gdGhlIHNsaWRlcidzIHZhbHVlIGNoYW5nZXMgZHVlIHRvIHVzZXIgaW50ZXJhY3Rpb24uCiAgICAgICAqCiAgICAgICAqIENoYW5nZXMgdG8gdGhlIHNsaWRlcidzIHZhbHVlIGR1ZSB0byBjaGFuZ2VzIGluIGFuIHVuZGVybHlpbmcKICAgICAgICogYm91bmQgdmFyaWFibGUgd2lsbCBub3QgdHJpZ2dlciB0aGlzIGV2ZW50LgogICAgICAgKgogICAgICAgKiBAZXZlbnQgY2hhbmdlCiAgICAgICAqLwogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCiAgICBjb25zdCAkX2RvY3VtZW50Q29udGFpbmVyJDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpOwogICAgJF9kb2N1bWVudENvbnRhaW5lciQ0LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCAnZGlzcGxheTogbm9uZTsnKTsKCiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDQuaW5uZXJIVE1MID0gYDxkb20tbW9kdWxlIGlkPSJwYXBlci1zcGlubmVyLXN0eWxlcyI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAgICAgIC8qIFNUWUxFUyBGT1IgVEhFIFNQSU5ORVIgKi8KICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqLwoKICAgICAgLyoKICAgICAgICogQ29uc3RhbnRzOgogICAgICAgKiAgICAgIEFSQ1NJWkUgICAgID0gMjcwIGRlZ3JlZXMgKGFtb3VudCBvZiBjaXJjbGUgdGhlIGFyYyB0YWtlcyB1cCkKICAgICAgICogICAgICBBUkNUSU1FICAgICA9IDEzMzNtcyAodGltZSBpdCB0YWtlcyB0byBleHBhbmQgYW5kIGNvbnRyYWN0IGFyYykKICAgICAgICogICAgICBBUkNTVEFSVFJPVCA9IDIxNiBkZWdyZWVzIChob3cgbXVjaCB0aGUgc3RhcnQgbG9jYXRpb24gb2YgdGhlIGFyYwogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIHJvdGF0ZSBlYWNoIHRpbWUsIDIxNiBnaXZlcyB1cyBhCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1IHBvaW50ZWQgc3RhciBzaGFwZSAoaXQncyAzNjAvNSAqIDMpLgogICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yIGEgNyBwb2ludGVkIHN0YXIsIHdlIG1pZ2h0IGRvCiAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjAvNyAqIDMgPSAxNTQuMjg2KQogICAgICAgKiAgICAgIFNIUklOS19USU1FID0gNDAwbXMKICAgICAgICovCgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICB3aWR0aDogMjhweDsKICAgICAgICBoZWlnaHQ6IDI4cHg7CgogICAgICAgIC8qIDM2MCAqIEFSQ1RJTUUgLyAoQVJDU1RBUlRST1QgKyAoMzYwLUFSQ1NJWkUpKSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb250YWluZXItcm90YXRpb24tZHVyYXRpb246IDE1NjhtczsKCiAgICAgICAgLyogQVJDVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb246IDEzMzNtczsKCiAgICAgICAgLyogNCAqIEFSQ1RJTUUgKi8KICAgICAgICAtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbjogNTMzMm1zOwoKICAgICAgICAvKiBTSFJJTktfVElNRSAqLwogICAgICAgIC0tcGFwZXItc3Bpbm5lci1jb29sZG93bi1kdXJhdGlvbjogNDAwbXM7CiAgICAgIH0KCiAgICAgICNzcGlubmVyQ29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CgogICAgICAgIC8qIFRoZSBzcGlubmVyIGRvZXMgbm90IGhhdmUgYW55IGNvbnRlbnRzIHRoYXQgd291bGQgaGF2ZSB0byBiZQogICAgICAgICAqIGZsaXBwZWQgaWYgdGhlIGRpcmVjdGlvbiBjaGFuZ2VzLiBBbHdheXMgdXNlIGx0ciBzbyB0aGF0IHRoZQogICAgICAgICAqIHN0eWxlIHdvcmtzIG91dCBjb3JyZWN0bHkgaW4gYm90aCBjYXNlcy4gKi8KICAgICAgICBkaXJlY3Rpb246IGx0cjsKICAgICAgfQoKICAgICAgI3NwaW5uZXJDb250YWluZXIuYWN0aXZlIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgY29udGFpbmVyLXJvdGF0ZSB7CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDM2MGRlZykgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGNvbnRhaW5lci1yb3RhdGUgewogICAgICAgIHRvIHsgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKSB9CiAgICAgIH0KCiAgICAgIC5zcGlubmVyLWxheWVyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1jb2xvciwgdmFyKC0tZ29vZ2xlLWJsdWUtNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci0xIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0xLWNvbG9yLCB2YXIoLS1nb29nbGUtYmx1ZS01MDApKTsKICAgICAgfQoKICAgICAgLmxheWVyLTIgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1zcGlubmVyLWxheWVyLTItY29sb3IsIHZhcigtLWdvb2dsZS1yZWQtNTAwKSk7CiAgICAgIH0KCiAgICAgIC5sYXllci0zIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItc3Bpbm5lci1sYXllci0zLWNvbG9yLCB2YXIoLS1nb29nbGUteWVsbG93LTUwMCkpOwogICAgICB9CgogICAgICAubGF5ZXItNCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXNwaW5uZXItbGF5ZXItNC1jb2xvciwgdmFyKC0tZ29vZ2xlLWdyZWVuLTUwMCkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogSU1QT1JUQU5UIE5PVEUgQUJPVVQgQ1NTIEFOSU1BVElPTiBQUk9QRVJUSUVTIChrZWFudWxlZSk6CiAgICAgICAqCiAgICAgICAqIGlPUyBTYWZhcmkgKHRlc3RlZCBvbiBpT1MgOC4xKSBkb2VzIG5vdCBoYW5kbGUgYW5pbWF0aW9uLWRlbGF5IHZlcnkgd2VsbCAtIGl0IGRvZXNuJ3QKICAgICAgICogZ3VhcmFudGVlIHRoYXQgdGhlIGFuaW1hdGlvbiB3aWxsIHN0YXJ0IF9leGFjdGx5XyBhZnRlciB0aGF0IHZhbHVlLiBTbyB3ZSBhdm9pZCB1c2luZwogICAgICAgKiBhbmltYXRpb24tZGVsYXkgYW5kIGluc3RlYWQgc2V0IGN1c3RvbSBrZXlmcmFtZXMgZm9yIGVhY2ggY29sb3IgKGFzIGxheWVyLTJ1bmRhbnQgYXMgaXQKICAgICAgICogc2VlbXMpLgogICAgICAgKi8KICAgICAgLmFjdGl2ZSAuc3Bpbm5lci1sYXllciB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci1zcGlubmVyLWZ1bGwtY3ljbGUtZHVyYXRpb24pOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIC13ZWJraXQtYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogaW5maW5pdGU7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGZpbGwtdW5maWxsLXJvdGF0ZTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZnVsbC1jeWNsZS1kdXJhdGlvbik7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAwLjIsIDEpOwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMSB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0xLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTEtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMiB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0yLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTItZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItMyB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci0zLWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTMtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIC5hY3RpdmUgLnNwaW5uZXItbGF5ZXIubGF5ZXItNCB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogZmlsbC11bmZpbGwtcm90YXRlLCBsYXllci00LWZhZGUtaW4tb3V0OwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBmaWxsLXVuZmlsbC1yb3RhdGUsIGxheWVyLTQtZmFkZS1pbi1vdXQ7CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUgewogICAgICAgIDEyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMzVkZWcpIH0gLyogMC41ICogQVJDU0laRSAqLwogICAgICAgIDI1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgyNzBkZWcpIH0gLyogMSAgICogQVJDU0laRSAqLwogICAgICAgIDM3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqLwogICAgICAgIDUwJSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1NDBkZWcpIH0gLyogMiAgICogQVJDU0laRSAqLwogICAgICAgIDYyLjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg2NzVkZWcpIH0gLyogMi41ICogQVJDU0laRSAqLwogICAgICAgIDc1JSAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqLwogICAgICAgIDg3LjUlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg5NDVkZWcpIH0gLyogMy41ICogQVJDU0laRSAqLwogICAgICAgIHRvICAgIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgxMDgwZGVnKSB9IC8qIDQgICAqIEFSQ1NJWkUgKi8KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBmaWxsLXVuZmlsbC1yb3RhdGUgewogICAgICAgIDEyLjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoMTM1ZGVnKSB9IC8qIDAuNSAqIEFSQ1NJWkUgKi8KICAgICAgICAyNSUgICB7IHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZykgfSAvKiAxICAgKiBBUkNTSVpFICovCiAgICAgICAgMzcuNSUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg0MDVkZWcpIH0gLyogMS41ICogQVJDU0laRSAqLwogICAgICAgIDUwJSAgIHsgdHJhbnNmb3JtOiByb3RhdGUoNTQwZGVnKSB9IC8qIDIgICAqIEFSQ1NJWkUgKi8KICAgICAgICA2Mi41JSB7IHRyYW5zZm9ybTogcm90YXRlKDY3NWRlZykgfSAvKiAyLjUgKiBBUkNTSVpFICovCiAgICAgICAgNzUlICAgeyB0cmFuc2Zvcm06IHJvdGF0ZSg4MTBkZWcpIH0gLyogMyAgICogQVJDU0laRSAqLwogICAgICAgIDg3LjUlIHsgdHJhbnNmb3JtOiByb3RhdGUoOTQ1ZGVnKSB9IC8qIDMuNSAqIEFSQ1NJWkUgKi8KICAgICAgICB0byAgICB7IHRyYW5zZm9ybTogcm90YXRlKDEwODBkZWcpIH0gLyogNCAgICogQVJDU0laRSAqLwogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItMS1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICAyNiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA4OSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDEgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTEtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgMjYlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgODklIHsgb3BhY2l0eTogMCB9CiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAxIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxheWVyLTItZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMTUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgMjUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgNTElIHsgb3BhY2l0eTogMCB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBsYXllci0yLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDE1JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDI1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDUxJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEAtd2Via2l0LWtleWZyYW1lcyBsYXllci0zLWZhZGUtaW4tb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDQwJSB7IG9wYWNpdHk6IDAgfQogICAgICAgIDUwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc1JSB7IG9wYWNpdHk6IDEgfQogICAgICAgIDc2JSB7IG9wYWNpdHk6IDAgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGF5ZXItMy1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA0MCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA1MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA3NiUgeyBvcGFjaXR5OiAwIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBALXdlYmtpdC1rZXlmcmFtZXMgbGF5ZXItNC1mYWRlLWluLW91dCB7CiAgICAgICAgMCUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA2NSUgeyBvcGFjaXR5OiAwIH0KICAgICAgICA3NSUgeyBvcGFjaXR5OiAxIH0KICAgICAgICA5MCUgeyBvcGFjaXR5OiAxIH0KICAgICAgICB0byB7IG9wYWNpdHk6IDAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGxheWVyLTQtZmFkZS1pbi1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNjUlIHsgb3BhY2l0eTogMCB9CiAgICAgICAgNzUlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgOTAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQoKICAgICAgLmNpcmNsZS1jbGlwcGVyIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiA1MCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBQYXRjaCB0aGUgZ2FwIHRoYXQgYXBwZWFyIGJldHdlZW4gdGhlIHR3byBhZGphY2VudCBkaXYuY2lyY2xlLWNsaXBwZXIgd2hpbGUgdGhlCiAgICAgICAqIHNwaW5uZXIgaXMgcm90YXRpbmcgKGFwcGVhcnMgb24gQ2hyb21lIDUwLCBTYWZhcmkgOS4xLjEsIGFuZCBFZGdlKS4KICAgICAgICovCiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciB7CiAgICAgICAgY29udGVudDogJyc7CiAgICAgICAgbGVmdDogNDUlOwogICAgICAgIHdpZHRoOiAxMCU7CiAgICAgICAgYm9yZGVyLXRvcC1zdHlsZTogc29saWQ7CiAgICAgIH0KCiAgICAgIC5zcGlubmVyLWxheWVyOjphZnRlciwKICAgICAgLmNpcmNsZS1jbGlwcGVyIC5jaXJjbGUgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3JkZXItd2lkdGg6IHZhcigtLXBhcGVyLXNwaW5uZXItc3Ryb2tlLXdpZHRoLCAzcHgpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgfQoKICAgICAgLmNpcmNsZS1jbGlwcGVyIC5jaXJjbGUgewogICAgICAgIGJvdHRvbTogMDsKICAgICAgICB3aWR0aDogMjAwJTsKICAgICAgICBib3JkZXItc3R5bGU6IHNvbGlkOwogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5jaXJjbGUtY2xpcHBlci5sZWZ0IC5jaXJjbGUgewogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudCAhaW1wb3J0YW50OwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTI5ZGVnKTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxMjlkZWcpOwogICAgICB9CgogICAgICAuY2lyY2xlLWNsaXBwZXIucmlnaHQgLmNpcmNsZSB7CiAgICAgICAgbGVmdDogLTEwMCU7CiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTI5ZGVnKTsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgtMTI5ZGVnKTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuZ2FwLXBhdGNoOjphZnRlciwKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIgLmNpcmNsZSB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXNwaW5uZXItZXhwYW5kLWNvbnRyYWN0LWR1cmF0aW9uKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IGluZmluaXRlOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItc3Bpbm5lci1leHBhbmQtY29udHJhY3QtZHVyYXRpb24pOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiBpbmZpbml0ZTsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIubGVmdCAuY2lyY2xlIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbi1uYW1lOiBsZWZ0LXNwaW47CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGxlZnQtc3BpbjsKICAgICAgfQoKICAgICAgLmFjdGl2ZSAuY2lyY2xlLWNsaXBwZXIucmlnaHQgLmNpcmNsZSB7CiAgICAgICAgLXdlYmtpdC1hbmltYXRpb24tbmFtZTogcmlnaHQtc3BpbjsKICAgICAgICBhbmltYXRpb24tbmFtZTogcmlnaHQtc3BpbjsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGxlZnQtc3BpbiB7CiAgICAgICAgMCUgeyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICAgIDUwJSB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoLTVkZWcpIH0KICAgICAgICB0byB7IC13ZWJraXQtdHJhbnNmb3JtOiByb3RhdGUoMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgbGVmdC1zcGluIHsKICAgICAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKDEzMGRlZykgfQogICAgICAgIDUwJSB7IHRyYW5zZm9ybTogcm90YXRlKC01ZGVnKSB9CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgxMzBkZWcpIH0KICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIHJpZ2h0LXNwaW4gewogICAgICAgIDAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgICAgNTAlIHsgLXdlYmtpdC10cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSB9CiAgICAgICAgdG8geyAtd2Via2l0LXRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyByaWdodC1zcGluIHsKICAgICAgICAwJSB7IHRyYW5zZm9ybTogcm90YXRlKC0xMzBkZWcpIH0KICAgICAgICA1MCUgeyB0cmFuc2Zvcm06IHJvdGF0ZSg1ZGVnKSB9CiAgICAgICAgdG8geyB0cmFuc2Zvcm06IHJvdGF0ZSgtMTMwZGVnKSB9CiAgICAgIH0KCiAgICAgICNzcGlubmVyQ29udGFpbmVyLmNvb2xkb3duIHsKICAgICAgICAtd2Via2l0LWFuaW1hdGlvbjogY29udGFpbmVyLXJvdGF0ZSB2YXIoLS1wYXBlci1zcGlubmVyLWNvbnRhaW5lci1yb3RhdGlvbi1kdXJhdGlvbikgbGluZWFyIGluZmluaXRlLCBmYWRlLW91dCB2YXIoLS1wYXBlci1zcGlubmVyLWNvb2xkb3duLWR1cmF0aW9uKSBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSk7CiAgICAgICAgYW5pbWF0aW9uOiBjb250YWluZXItcm90YXRlIHZhcigtLXBhcGVyLXNwaW5uZXItY29udGFpbmVyLXJvdGF0aW9uLWR1cmF0aW9uKSBsaW5lYXIgaW5maW5pdGUsIGZhZGUtb3V0IHZhcigtLXBhcGVyLXNwaW5uZXItY29vbGRvd24tZHVyYXRpb24pIGN1YmljLWJlemllcigwLjQsIDAuMCwgMC4yLCAxKTsKICAgICAgfQoKICAgICAgQC13ZWJraXQta2V5ZnJhbWVzIGZhZGUtb3V0IHsKICAgICAgICAwJSB7IG9wYWNpdHk6IDEgfQogICAgICAgIHRvIHsgb3BhY2l0eTogMCB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMgZmFkZS1vdXQgewogICAgICAgIDAlIHsgb3BhY2l0eTogMSB9CiAgICAgICAgdG8geyBvcGFjaXR5OiAwIH0KICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+YDsKCiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCRfZG9jdW1lbnRDb250YWluZXIkNC5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKiogQHBvbHltZXJCZWhhdmlvciAqLwogICAgY29uc3QgUGFwZXJTcGlubmVyQmVoYXZpb3IgPSB7CgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogRGlzcGxheXMgdGhlIHNwaW5uZXIuCiAgICAgICAgICovCiAgICAgICAgYWN0aXZlOiB7CiAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgdmFsdWU6IGZhbHNlLAogICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgICAgb2JzZXJ2ZXI6ICdfX2FjdGl2ZUNoYW5nZWQnCiAgICAgICAgfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQWx0ZXJuYXRpdmUgdGV4dCBjb250ZW50IGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQuCiAgICAgICAgICogSWYgYWx0IGlzIHByZXNlbnQsIGl0IHdpbGwgYWRkIGFuIGFyaWEtbGFiZWwgd2hvc2UgY29udGVudCBtYXRjaGVzIGFsdAogICAgICAgICAqIHdoZW4gYWN0aXZlLiBJZiBhbHQgaXMgbm90IHByZXNlbnQsIGl0IHdpbGwgZGVmYXVsdCB0byAnbG9hZGluZycgYXMgdGhlCiAgICAgICAgICogYWx0IHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGFsdDoge3R5cGU6IFN0cmluZywgdmFsdWU6ICdsb2FkaW5nJywgb2JzZXJ2ZXI6ICdfX2FsdENoYW5nZWQnfSwKCiAgICAgICAgX19jb29saW5nRG93bjoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0KICAgICAgfSwKCiAgICAgIF9fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXM6IGZ1bmN0aW9uKGFjdGl2ZSwgY29vbGluZ0Rvd24pIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgYWN0aXZlIHx8IGNvb2xpbmdEb3duID8gJ2FjdGl2ZScgOiAnJywKICAgICAgICAgIGNvb2xpbmdEb3duID8gJ2Nvb2xkb3duJyA6ICcnCiAgICAgICAgXS5qb2luKCcgJyk7CiAgICAgIH0sCgogICAgICBfX2FjdGl2ZUNoYW5nZWQ6IGZ1bmN0aW9uKGFjdGl2ZSwgb2xkKSB7CiAgICAgICAgdGhpcy5fX3NldEFyaWFIaWRkZW4oIWFjdGl2ZSk7CiAgICAgICAgdGhpcy5fX2Nvb2xpbmdEb3duID0gIWFjdGl2ZSAmJiBvbGQ7CiAgICAgIH0sCgogICAgICBfX2FsdENoYW5nZWQ6IGZ1bmN0aW9uKGFsdCkgewogICAgICAgIC8vIHVzZXItcHJvdmlkZWQgYGFyaWEtbGFiZWxgIHRha2VzIHByZWNlZGVuY2Ugb3ZlciBwcm90b3R5cGUgZGVmYXVsdAogICAgICAgIGlmIChhbHQgPT09ICdsb2FkaW5nJykgewogICAgICAgICAgdGhpcy5hbHQgPSB0aGlzLmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpIHx8IGFsdDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fX3NldEFyaWFIaWRkZW4oYWx0ID09PSAnJyk7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcsIGFsdCk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX19zZXRBcmlhSGlkZGVuOiBmdW5jdGlvbihoaWRkZW4pIHsKICAgICAgICB2YXIgYXR0ciA9ICdhcmlhLWhpZGRlbic7CiAgICAgICAgaWYgKGhpZGRlbikgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoYXR0ciwgJ3RydWUnKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX19yZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICB0aGlzLl9fY29vbGluZ0Rvd24gPSBmYWxzZTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICBjb25zdCB0ZW1wbGF0ZSRmID0gaHRtbGAKICA8c3R5bGUgaW5jbHVkZT0icGFwZXItc3Bpbm5lci1zdHlsZXMiPjwvc3R5bGU+CgogIDxkaXYgaWQ9InNwaW5uZXJDb250YWluZXIiIGNsYXNzLW5hbWU9IltbX19jb21wdXRlQ29udGFpbmVyQ2xhc3NlcyhhY3RpdmUsIF9fY29vbGluZ0Rvd24pXV0iIG9uLWFuaW1hdGlvbmVuZD0iX19yZXNldCIgb24td2Via2l0LWFuaW1hdGlvbi1lbmQ9Il9fcmVzZXQiPgogICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciI+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKICAgIHRlbXBsYXRlJGYuc2V0QXR0cmlidXRlKCdzdHJpcC13aGl0ZXNwYWNlJywgJycpOwoKICAgIC8qKgogICAgTWF0ZXJpYWwgZGVzaWduOiBbUHJvZ3Jlc3MgJgogICAgYWN0aXZpdHldKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9wcm9ncmVzcy1hY3Rpdml0eS5odG1sKQoKICAgIEVsZW1lbnQgcHJvdmlkaW5nIGEgc2luZ2xlIGNvbG9yIG1hdGVyaWFsIGRlc2lnbiBjaXJjdWxhciBzcGlubmVyLgoKICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFjdGl2ZT48L3BhcGVyLXNwaW5uZXItbGl0ZT4KCiAgICBUaGUgZGVmYXVsdCBzcGlubmVyIGlzIGJsdWUuIEl0IGNhbiBiZSBjdXN0b21pemVkIHRvIGJlIGEgZGlmZmVyZW50IGNvbG9yLgoKICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgQWx0IGF0dHJpYnV0ZSBzaG91bGQgYmUgc2V0IHRvIHByb3ZpZGUgYWRlcXVhdGUgY29udGV4dCBmb3IgYWNjZXNzaWJpbGl0eS4gSWYKICAgIG5vdCBwcm92aWRlZCwgaXQgZGVmYXVsdHMgdG8gJ2xvYWRpbmcnLiBFbXB0eSBhbHQgY2FuIGJlIHByb3ZpZGVkIHRvIG1hcmsgdGhlCiAgICBlbGVtZW50IGFzIGRlY29yYXRpdmUgaWYgYWx0ZXJuYXRpdmUgY29udGVudCBpcyBwcm92aWRlZCBpbiBhbm90aGVyIGZvcm0gKGUuZy4gYQogICAgdGV4dCBibG9jayBmb2xsb3dpbmcgdGhlIHNwaW5uZXIpLgoKICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlIGFsdD0iTG9hZGluZyBjb250YWN0cyBsaXN0IiBhY3RpdmU+PC9wYXBlci1zcGlubmVyLWxpdGU+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1zcGlubmVyLWNvbG9yYCB8IENvbG9yIG9mIHRoZSBzcGlubmVyIHwgYC0tZ29vZ2xlLWJsdWUtNTAwYAogICAgYC0tcGFwZXItc3Bpbm5lci1zdHJva2Utd2lkdGhgIHwgVGhlIHdpZHRoIG9mIHRoZSBzcGlubmVyIHN0cm9rZSB8IDNweAoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItc3Bpbm5lci1saXRlCiAgICBAaGVybyBoZXJvLnN2ZwogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogdGVtcGxhdGUkZiwKCiAgICAgIGlzOiAncGFwZXItc3Bpbm5lci1saXRlJywKCiAgICAgIGJlaGF2aW9yczogW1BhcGVyU3Bpbm5lckJlaGF2aW9yXQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgdGVtcGxhdGUkZyA9IGh0bWxgCiAgPHN0eWxlIGluY2x1ZGU9InBhcGVyLXNwaW5uZXItc3R5bGVzIj48L3N0eWxlPgoKICA8ZGl2IGlkPSJzcGlubmVyQ29udGFpbmVyIiBjbGFzcy1uYW1lPSJbW19fY29tcHV0ZUNvbnRhaW5lckNsYXNzZXMoYWN0aXZlLCBfX2Nvb2xpbmdEb3duKV1dIiBvbi1hbmltYXRpb25lbmQ9Il9fcmVzZXQiIG9uLXdlYmtpdC1hbmltYXRpb24tZW5kPSJfX3Jlc2V0Ij4KICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItMSI+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJzcGlubmVyLWxheWVyIGxheWVyLTIiPgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciBsZWZ0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgcmlnaHQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0ic3Bpbm5lci1sYXllciBsYXllci0zIj4KICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlLWNsaXBwZXIgbGVmdCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIHJpZ2h0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUiPjwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxkaXYgY2xhc3M9InNwaW5uZXItbGF5ZXIgbGF5ZXItNCI+CiAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZS1jbGlwcGVyIGxlZnQiPgogICAgICAgIDxkaXYgY2xhc3M9ImNpcmNsZSI+PC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjaXJjbGUtY2xpcHBlciByaWdodCI+CiAgICAgICAgPGRpdiBjbGFzcz0iY2lyY2xlIj48L2Rpdj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICA8L2Rpdj4KYDsKICAgIHRlbXBsYXRlJGcuc2V0QXR0cmlidXRlKCdzdHJpcC13aGl0ZXNwYWNlJywgJycpOwoKICAgIC8qKgogICAgTWF0ZXJpYWwgZGVzaWduOiBbUHJvZ3Jlc3MgJgogICAgYWN0aXZpdHldKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy9wcm9ncmVzcy1hY3Rpdml0eS5odG1sKQoKICAgIEVsZW1lbnQgcHJvdmlkaW5nIGEgbXVsdGlwbGUgY29sb3IgbWF0ZXJpYWwgZGVzaWduIGNpcmN1bGFyIHNwaW5uZXIuCgogICAgICAgIDxwYXBlci1zcGlubmVyIGFjdGl2ZT48L3BhcGVyLXNwaW5uZXI+CgogICAgVGhlIGRlZmF1bHQgc3Bpbm5lciBjeWNsZXMgYmV0d2VlbiBmb3VyIGxheWVycyBvZiBjb2xvcnM7IGJ5IGRlZmF1bHQgdGhleSBhcmUKICAgIGJsdWUsIHJlZCwgeWVsbG93IGFuZCBncmVlbi4gSXQgY2FuIGJlIGN1c3RvbWl6ZWQgdG8gY3ljbGUgYmV0d2VlbiBmb3VyCiAgICBkaWZmZXJlbnQgY29sb3JzLiBVc2UgPHBhcGVyLXNwaW5uZXItbGl0ZT4gZm9yIHNpbmdsZSBjb2xvciBzcGlubmVycy4KCiAgICAjIyMgQWNjZXNzaWJpbGl0eQoKICAgIEFsdCBhdHRyaWJ1dGUgc2hvdWxkIGJlIHNldCB0byBwcm92aWRlIGFkZXF1YXRlIGNvbnRleHQgZm9yIGFjY2Vzc2liaWxpdHkuIElmCiAgICBub3QgcHJvdmlkZWQsIGl0IGRlZmF1bHRzIHRvICdsb2FkaW5nJy4gRW1wdHkgYWx0IGNhbiBiZSBwcm92aWRlZCB0byBtYXJrIHRoZQogICAgZWxlbWVudCBhcyBkZWNvcmF0aXZlIGlmIGFsdGVybmF0aXZlIGNvbnRlbnQgaXMgcHJvdmlkZWQgaW4gYW5vdGhlciBmb3JtIChlLmcuIGEKICAgIHRleHQgYmxvY2sgZm9sbG93aW5nIHRoZSBzcGlubmVyKS4KCiAgICAgICAgPHBhcGVyLXNwaW5uZXIgYWx0PSJMb2FkaW5nIGNvbnRhY3RzIGxpc3QiIGFjdGl2ZT48L3BhcGVyLXNwaW5uZXI+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci1zcGlubmVyLWxheWVyLTEtY29sb3JgIHwgQ29sb3Igb2YgdGhlIGZpcnN0IHNwaW5uZXIgcm90YXRpb24gfCBgLS1nb29nbGUtYmx1ZS01MDBgCiAgICBgLS1wYXBlci1zcGlubmVyLWxheWVyLTItY29sb3JgIHwgQ29sb3Igb2YgdGhlIHNlY29uZCBzcGlubmVyIHJvdGF0aW9uIHwgYC0tZ29vZ2xlLXJlZC01MDBgCiAgICBgLS1wYXBlci1zcGlubmVyLWxheWVyLTMtY29sb3JgIHwgQ29sb3Igb2YgdGhlIHRoaXJkIHNwaW5uZXIgcm90YXRpb24gfCBgLS1nb29nbGUteWVsbG93LTUwMGAKICAgIGAtLXBhcGVyLXNwaW5uZXItbGF5ZXItNC1jb2xvcmAgfCBDb2xvciBvZiB0aGUgZm91cnRoIHNwaW5uZXIgcm90YXRpb24gfCBgLS1nb29nbGUtZ3JlZW4tNTAwYAogICAgYC0tcGFwZXItc3Bpbm5lci1zdHJva2Utd2lkdGhgIHwgVGhlIHdpZHRoIG9mIHRoZSBzcGlubmVyIHN0cm9rZSB8IDNweAoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItc3Bpbm5lcgogICAgQGhlcm8gaGVyby5zdmcKICAgIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgKi8KICAgIFBvbHltZXIoewogICAgICBfdGVtcGxhdGU6IHRlbXBsYXRlJGcsCgogICAgICBpczogJ3BhcGVyLXNwaW5uZXInLAoKICAgICAgYmVoYXZpb3JzOiBbUGFwZXJTcGlubmVyQmVoYXZpb3JdCiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIGNvbnN0IHRlbXBsYXRlJGggPSBodG1sYDxpcm9uLWljb25zZXQtc3ZnIG5hbWU9InBhcGVyLXRhYnMiIHNpemU9IjI0Ij4KPHN2Zz48ZGVmcz4KPGcgaWQ9ImNoZXZyb24tbGVmdCI+PHBhdGggZD0iTTE1LjQxIDcuNDFMMTQgNmwtNiA2IDYgNiAxLjQxLTEuNDFMMTAuODMgMTJ6Ij48L3BhdGg+PC9nPgo8ZyBpZD0iY2hldnJvbi1yaWdodCI+PHBhdGggZD0iTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiI+PC9wYXRoPjwvZz4KPC9kZWZzPjwvc3ZnPgo8L2lyb24taWNvbnNldC1zdmc+YDsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQodGVtcGxhdGUkaC5jb250ZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dAogICAgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28KICAgIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8qCiAgICBgcGFwZXItdGFiYCBpcyBzdHlsZWQgdG8gbG9vayBsaWtlIGEgdGFiLiBJdCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoCiAgICBgcGFwZXItdGFic2AuCgogICAgRXhhbXBsZToKCiAgICAgICAgPHBhcGVyLXRhYnMgc2VsZWN0ZWQ9IjAiPgogICAgICAgICAgPHBhcGVyLXRhYj5UQUIgMTwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYj5UQUIgMjwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYj5UQUIgMzwvcGFwZXItdGFiPgogICAgICAgIDwvcGFwZXItdGFicz4KCiAgICAjIyMgU3R5bGluZwoKICAgIFRoZSBmb2xsb3dpbmcgY3VzdG9tIHByb3BlcnRpZXMgYW5kIG1peGlucyBhcmUgYXZhaWxhYmxlIGZvciBzdHlsaW5nOgoKICAgIEN1c3RvbSBwcm9wZXJ0eSB8IERlc2NyaXB0aW9uIHwgRGVmYXVsdAogICAgLS0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0KICAgIGAtLXBhcGVyLXRhYi1pbmtgIHwgSW5rIGNvbG9yIHwgYC0tcGFwZXIteWVsbG93LWExMDBgCiAgICBgLS1wYXBlci10YWJgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdGFiIHwgYHt9YAogICAgYC0tcGFwZXItdGFiLWNvbnRlbnRgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdGFiIGNvbnRlbnQgfCBge31gCiAgICBgLS1wYXBlci10YWItY29udGVudC1mb2N1c2VkYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHRhYiBjb250ZW50IHdoZW4gdGhlIHRhYiBpcyBmb2N1c2VkIHwgYHt9YAogICAgYC0tcGFwZXItdGFiLWNvbnRlbnQtdW5zZWxlY3RlZGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSB0YWIgY29udGVudCB3aGVuIHRoZSB0YWIgaXMgbm90IHNlbGVjdGVkIHwgYHt9YAoKICAgIFRoaXMgZWxlbWVudCBhcHBsaWVzIHRoZSBtaXhpbiBgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlYCBidXQgZG9lcyBub3QgaW1wb3J0CiAgICBgcGFwZXItc3R5bGVzL3R5cG9ncmFwaHkuaHRtbGAuIEluIG9yZGVyIHRvIGFwcGx5IHRoZSBgUm9ib3RvYCBmb250IHRvIHRoaXMKICAgIGVsZW1lbnQsIG1ha2Ugc3VyZSB5b3UndmUgaW1wb3J0ZWQgYHBhcGVyLXN0eWxlcy90eXBvZ3JhcGh5Lmh0bWxgLgogICAgKi8KICAgIFBvbHltZXIoewogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaW5saW5lOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1qdXN0aWZpZWQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHBhZGRpbmc6IDAgMTJweDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci1mb250LWNvbW1vbi1iYXNlOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYjsKICAgICAgfQoKICAgICAgOmhvc3QoOmZvY3VzKSB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2xpbmtdKSB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRhYi1jb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVooMCk7CiAgICAgICAgdHJhbnNpdGlvbjogb3BhY2l0eSAwLjFzIGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWhvcml6b250YWw7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWItY29udGVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdCguaXJvbi1zZWxlY3RlZCkpID4gLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAwLjg7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LXVuc2VsZWN0ZWQ7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmb2N1cykgLnRhYi1jb250ZW50IHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIGZvbnQtd2VpZ2h0OiA3MDA7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRhYi1jb250ZW50LWZvY3VzZWQ7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJpcHBsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRhYi1pbmssIHZhcigtLXBhcGVyLXllbGxvdy1hMTAwKSk7CiAgICAgIH0KCiAgICAgIC50YWItY29udGVudCA+IDo6c2xvdHRlZChhKSB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKCiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9InRhYi1jb250ZW50Ij4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsCgogICAgICBpczogJ3BhcGVyLXRhYicsCgogICAgICBiZWhhdmlvcnM6IFtJcm9uQ29udHJvbFN0YXRlLCBJcm9uQnV0dG9uU3RhdGUsIFBhcGVyUmlwcGxlQmVoYXZpb3JdLAoKICAgICAgcHJvcGVydGllczogewoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdGFiIHdpbGwgZm9yd2FyZCBrZXlib2FyZCBjbGlja3MgKGVudGVyL3NwYWNlKSB0bwogICAgICAgICAqIHRoZSBmaXJzdCBhbmNob3IgZWxlbWVudCBmb3VuZCBpbiBpdHMgZGVzY2VuZGFudHMKICAgICAgICAgKi8KICAgICAgICBsaW5rOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlLCByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWV9CgogICAgICB9LAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7cm9sZTogJ3RhYid9LAoKICAgICAgbGlzdGVuZXJzOiB7ZG93bjogJ191cGRhdGVOb2luaycsIHRhcDogJ19vblRhcCd9LAoKICAgICAgYXR0YWNoZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3VwZGF0ZU5vaW5rKCk7CiAgICAgIH0sCgogICAgICBnZXQgX3BhcmVudE5vaW5rKCkgewogICAgICAgIHZhciBwYXJlbnQgPSBkb20odGhpcykucGFyZW50Tm9kZTsKICAgICAgICByZXR1cm4gISFwYXJlbnQgJiYgISFwYXJlbnQubm9pbms7CiAgICAgIH0sCgogICAgICBfdXBkYXRlTm9pbms6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMubm9pbmsgPSAhIXRoaXMubm9pbmsgfHwgISF0aGlzLl9wYXJlbnROb2luazsKICAgICAgfSwKCiAgICAgIF9vblRhcDogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICBpZiAodGhpcy5saW5rKSB7CiAgICAgICAgICB2YXIgYW5jaG9yID0gdGhpcy5xdWVyeUVmZmVjdGl2ZUNoaWxkcmVuKCdhJyk7CgogICAgICAgICAgaWYgKCFhbmNob3IpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIERvbid0IGdldCBzdHVjayBpbiBhIGxvb3AgZGVsZWdhdGluZwogICAgICAgICAgLy8gdGhlIGxpc3RlbmVyIGZyb20gdGhlIGNoaWxkIGFuY2hvcgogICAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gYW5jaG9yKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBhbmNob3IuY2xpY2soKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246IFtUYWJzXShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvdGFicy5odG1sKQoKICAgIGBwYXBlci10YWJzYCBtYWtlcyBpdCBlYXN5IHRvIGV4cGxvcmUgYW5kIHN3aXRjaCBiZXR3ZWVuIGRpZmZlcmVudCB2aWV3cyBvcgogICAgZnVuY3Rpb25hbCBhc3BlY3RzIG9mIGFuIGFwcCwgb3IgdG8gYnJvd3NlIGNhdGVnb3JpemVkIGRhdGEgc2V0cy4KCiAgICBVc2UgYHNlbGVjdGVkYCBwcm9wZXJ0eSB0byBnZXQgb3Igc2V0IHRoZSBzZWxlY3RlZCB0YWIuCgogICAgRXhhbXBsZToKCiAgICAgICAgPHBhcGVyLXRhYnMgc2VsZWN0ZWQ9IjAiPgogICAgICAgICAgPHBhcGVyLXRhYj5UQUIgMTwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYj5UQUIgMjwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYj5UQUIgMzwvcGFwZXItdGFiPgogICAgICAgIDwvcGFwZXItdGFicz4KCiAgICBTZWUgPGEgaHJlZj0iP2FjdGl2ZT1wYXBlci10YWIiPnBhcGVyLXRhYjwvYT4gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKICAgIGBwYXBlci10YWJgLgoKICAgIEEgY29tbW9uIHVzYWdlIGZvciBgcGFwZXItdGFic2AgaXMgdG8gdXNlIGl0IGFsb25nIHdpdGggYGlyb24tcGFnZXNgIHRvIHN3aXRjaAogICAgYmV0d2VlbiBkaWZmZXJlbnQgdmlld3MuCgogICAgICAgIDxwYXBlci10YWJzIHNlbGVjdGVkPSJ7e3NlbGVjdGVkfX0iPgogICAgICAgICAgPHBhcGVyLXRhYj5UYWIgMTwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYj5UYWIgMjwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYj5UYWIgMzwvcGFwZXItdGFiPgogICAgICAgIDwvcGFwZXItdGFicz4KCiAgICAgICAgPGlyb24tcGFnZXMgc2VsZWN0ZWQ9Int7c2VsZWN0ZWR9fSI+CiAgICAgICAgICA8ZGl2PlBhZ2UgMTwvZGl2PgogICAgICAgICAgPGRpdj5QYWdlIDI8L2Rpdj4KICAgICAgICAgIDxkaXY+UGFnZSAzPC9kaXY+CiAgICAgICAgPC9pcm9uLXBhZ2VzPgoKICAgIFRvIHVzZSBsaW5rcyBpbiB0YWJzLCBhZGQgYGxpbmtgIGF0dHJpYnV0ZSB0byBgcGFwZXItdGFiYCBhbmQgcHV0IGFuIGA8YT5gCiAgICBlbGVtZW50IGluIGBwYXBlci10YWJgIHdpdGggYSBgdGFiaW5kZXhgIG9mIC0xLgoKICAgIEV4YW1wbGU6CgogICAgPHByZT48Y29kZT4KICAgICZsdDtzdHlsZSBpcz0iY3VzdG9tLXN0eWxlIj4KICAgICAgLmxpbmsgewogICAgICAgICYjNjQ7YXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICAmIzY0O2FwcGx5IC0tbGF5b3V0LWNlbnRlci1jZW50ZXI7CiAgICAgIH0KICAgICZsdDsvc3R5bGU+CgogICAgJmx0O3BhcGVyLXRhYnMgc2VsZWN0ZWQ9IjAiPgogICAgICAmbHQ7cGFwZXItdGFiIGxpbms+CiAgICAgICAgJmx0O2EgaHJlZj0iI2xpbmsxIiBjbGFzcz0ibGluayIgdGFiaW5kZXg9Ii0xIj5UQUIgT05FJmx0Oy9hPgogICAgICAmbHQ7L3BhcGVyLXRhYj4KICAgICAgJmx0O3BhcGVyLXRhYiBsaW5rPgogICAgICAgICZsdDthIGhyZWY9IiNsaW5rMiIgY2xhc3M9ImxpbmsiIHRhYmluZGV4PSItMSI+VEFCIFRXTyZsdDsvYT4KICAgICAgJmx0Oy9wYXBlci10YWI+CiAgICAgICZsdDtwYXBlci10YWIgbGluaz4KICAgICAgICAmbHQ7YSBocmVmPSIjbGluazMiIGNsYXNzPSJsaW5rIiB0YWJpbmRleD0iLTEiPlRBQiBUSFJFRSZsdDsvYT4KICAgICAgJmx0Oy9wYXBlci10YWI+CiAgICAmbHQ7L3BhcGVyLXRhYnM+CiAgICA8L2NvZGU+PC9wcmU+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXItY29sb3JgIHwgQ29sb3IgZm9yIHRoZSBzZWxlY3Rpb24gYmFyIHwgYC0tcGFwZXIteWVsbG93LWExMDBgCiAgICBgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXJgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgc2VsZWN0aW9uIGJhciB8IGB7fWAKICAgIGAtLXBhcGVyLXRhYnNgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdGFicyB8IGB7fWAKICAgIGAtLXBhcGVyLXRhYnMtY29udGVudGAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBjb250ZW50IGNvbnRhaW5lciBvZiB0YWJzIHwgYHt9YAogICAgYC0tcGFwZXItdGFicy1jb250YWluZXJgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgbGF5b3V0IGNvbnRhaW5lciBvZiB0YWJzIHwgYHt9YAoKICAgIEBkZW1vIGRlbW8vaW5kZXguaHRtbAogICAgKi8KICAgIFBvbHltZXIoewogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQ7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWNlbnRlcjsKCiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKCiAgICAgICAgLyogTk9URTogQm90aCB2YWx1ZXMgYXJlIG5lZWRlZCwgc2luY2Ugc29tZSBwaG9uZXMgcmVxdWlyZSB0aGUgdmFsdWUgdG8gYmUgXGB0cmFuc3BhcmVudFxgLiAqLwogICAgICAgIC13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjogcmdiYSgwLCAwLCAwLCAwKTsKICAgICAgICAtd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6IHRyYW5zcGFyZW50OwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzOwogICAgICB9CgogICAgICA6aG9zdCg6ZGlyKHJ0bCkpIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbC1yZXZlcnNlOwogICAgICB9CgogICAgICAjdGFic0NvbnRhaW5lciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLWNvbnRhaW5lcjsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgLW1vei1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIC1tcy1mbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGZsZXgtYmFzaXM6IGF1dG87CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdGFicy1jb250ZW50OwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZSB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudDpub3QoLnNjcm9sbGFibGUpLAogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgfQoKICAgICAgI3RhYnNDb250ZW50LnNjcm9sbGFibGUuZml0LWNvbnRhaW5lciB7CiAgICAgICAgbWluLXdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjdGFic0NvbnRlbnQuc2Nyb2xsYWJsZS5maXQtY29udGFpbmVyID4gOjpzbG90dGVkKCopIHsKICAgICAgICAvKiBJRSAtIHByZXZlbnQgdGFicyBmcm9tIGNvbXByZXNzaW5nIHdoZW4gdGhleSBzaG91bGQgc2Nyb2xsLiAqLwogICAgICAgIC1tcy1mbGV4OiAxIDAgYXV0bzsKICAgICAgICAtd2Via2l0LWZsZXg6IDEgMCBhdXRvOwogICAgICAgIGZsZXg6IDEgMCBhdXRvOwogICAgICB9CgogICAgICAuaGlkZGVuIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAubm90LXZpc2libGUgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgY3Vyc29yOiBkZWZhdWx0OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgd2lkdGg6IDQ4cHg7CiAgICAgICAgaGVpZ2h0OiA0OHB4OwogICAgICAgIHBhZGRpbmc6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwIDRweDsKICAgICAgfQoKICAgICAgI3NlbGVjdGlvbkJhciB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3JkZXItYm90dG9tOiAycHggc29saWQgdmFyKC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yLCB2YXIoLS1wYXBlci15ZWxsb3ctYTEwMCkpOwogICAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHNjYWxlKDApOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgICAtd2Via2l0LXRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IGxlZnQgY2VudGVyOwogICAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm07CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10YWJzLXNlbGVjdGlvbi1iYXI7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuYWxpZ24tYm90dG9tIHsKICAgICAgICB0b3A6IDA7CiAgICAgICAgYm90dG9tOiBhdXRvOwogICAgICB9CgogICAgICAjc2VsZWN0aW9uQmFyLmV4cGFuZCB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4xNXM7CiAgICAgICAgdHJhbnNpdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgIH0KCiAgICAgICNzZWxlY3Rpb25CYXIuY29udHJhY3QgewogICAgICAgIHRyYW5zaXRpb24tZHVyYXRpb246IDAuMThzOwogICAgICAgIHRyYW5zaXRpb24tdGltaW5nLWZ1bmN0aW9uOiBjdWJpYy1iZXppZXIoMC4wLCAwLjAsIDAuMiwgMSk7CiAgICAgIH0KCiAgICAgICN0YWJzQ29udGVudCA+IDo6c2xvdHRlZCg6bm90KCNzZWxlY3Rpb25CYXIpKSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tbGVmdCIgY2xhc3MkPSJbW19jb21wdXRlU2Nyb2xsQnV0dG9uQ2xhc3MoX2xlZnRIaWRkZW4sIHNjcm9sbGFibGUsIGhpZGVTY3JvbGxCdXR0b25zKV1dIiBvbi11cD0iX29uU2Nyb2xsQnV0dG9uVXAiIG9uLWRvd249Il9vbkxlZnRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CgogICAgPGRpdiBpZD0idGFic0NvbnRhaW5lciIgb24tdHJhY2s9Il9zY3JvbGwiIG9uLWRvd249Il9kb3duIj4KICAgICAgPGRpdiBpZD0idGFic0NvbnRlbnQiIGNsYXNzJD0iW1tfY29tcHV0ZVRhYnNDb250ZW50Q2xhc3Moc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKV1dIj4KICAgICAgICA8ZGl2IGlkPSJzZWxlY3Rpb25CYXIiIGNsYXNzJD0iW1tfY29tcHV0ZVNlbGVjdGlvbkJhckNsYXNzKG5vQmFyLCBhbGlnbkJvdHRvbSldXSIgb24tdHJhbnNpdGlvbmVuZD0iX29uQmFyVHJhbnNpdGlvbkVuZCI+PC9kaXY+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxwYXBlci1pY29uLWJ1dHRvbiBpY29uPSJwYXBlci10YWJzOmNoZXZyb24tcmlnaHQiIGNsYXNzJD0iW1tfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzKF9yaWdodEhpZGRlbiwgc2Nyb2xsYWJsZSwgaGlkZVNjcm9sbEJ1dHRvbnMpXV0iIG9uLXVwPSJfb25TY3JvbGxCdXR0b25VcCIgb24tZG93bj0iX29uUmlnaHRTY3JvbGxCdXR0b25Eb3duIiB0YWJpbmRleD0iLTEiPjwvcGFwZXItaWNvbi1idXR0b24+CmAsCgogICAgICBpczogJ3BhcGVyLXRhYnMnLAogICAgICBiZWhhdmlvcnM6IFtJcm9uUmVzaXphYmxlQmVoYXZpb3IsIElyb25NZW51YmFyQmVoYXZpb3JdLAoKICAgICAgcHJvcGVydGllczogewogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIGluayByaXBwbGUgZWZmZWN0IGlzIGRpc2FibGVkLiBXaGVuIHRoaXMgcHJvcGVydHkgaXMgY2hhbmdlZCwKICAgICAgICAgKiBhbGwgZGVzY2VuZGFudCBgPHBhcGVyLXRhYj5gIGVsZW1lbnRzIGhhdmUgdGhlaXIgYG5vaW5rYCBwcm9wZXJ0eQogICAgICAgICAqIGNoYW5nZWQgdG8gdGhlIG5ldyB2YWx1ZSBhcyB3ZWxsLgogICAgICAgICAqLwogICAgICAgIG5vaW5rOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlLCBvYnNlcnZlcjogJ19ub2lua0NoYW5nZWQnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIGJvdHRvbSBiYXIgdG8gaW5kaWNhdGUgdGhlIHNlbGVjdGVkIHRhYiB3aWxsIG5vdCBiZSBzaG93bi4KICAgICAgICAgKi8KICAgICAgICBub0Jhcjoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCgogICAgICAgIC8qKgogICAgICAgICAqIElmIHRydWUsIHRoZSBzbGlkZSBlZmZlY3QgZm9yIHRoZSBib3R0b20gYmFyIGlzIGRpc2FibGVkLgogICAgICAgICAqLwogICAgICAgIG5vU2xpZGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0YWJzIGFyZSBzY3JvbGxhYmxlIGFuZCB0aGUgdGFiIHdpZHRoIGlzIGJhc2VkIG9uIHRoZSBsYWJlbAogICAgICAgICAqIHdpZHRoLgogICAgICAgICAqLwogICAgICAgIHNjcm9sbGFibGU6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0YWJzIGV4cGFuZCB0byBmaXQgdGhlaXIgY29udGFpbmVyLiBUaGlzIGN1cnJlbnRseSBvbmx5IGFwcGxpZXMKICAgICAgICAgKiB3aGVuIHNjcm9sbGFibGUgaXMgdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBmaXRDb250YWluZXI6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCBkcmFnZ2luZyBvbiB0aGUgdGFicyB0byBzY3JvbGwgaXMgZGlzYWJsZWQuCiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZURyYWc6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCBzY3JvbGwgYnV0dG9ucyAobGVmdC9yaWdodCBhcnJvdykgd2lsbCBiZSBoaWRkZW4gZm9yIHNjcm9sbGFibGUKICAgICAgICAgKiB0YWJzLgogICAgICAgICAqLwogICAgICAgIGhpZGVTY3JvbGxCdXR0b25zOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdHJ1ZSwgdGhlIHRhYnMgYXJlIGFsaWduZWQgdG8gYm90dG9tICh0aGUgc2VsZWN0aW9uIGJhciBhcHBlYXJzIGF0IHRoZQogICAgICAgICAqIHRvcCkuCiAgICAgICAgICovCiAgICAgICAgYWxpZ25Cb3R0b206IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICBzZWxlY3RhYmxlOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ3BhcGVyLXRhYid9LAoKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCB0YWJzIGFyZSBhdXRvbWF0aWNhbGx5IHNlbGVjdGVkIHdoZW4gZm9jdXNlZCB1c2luZyB0aGUKICAgICAgICAgKiBrZXlib2FyZC4KICAgICAgICAgKi8KICAgICAgICBhdXRvc2VsZWN0OiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IGZhbHNlfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRlbGF5IChpbiBtaWxsaXNlY29uZHMpIGJldHdlZW4gd2hlbiB0aGUgdXNlciBzdG9wcyBpbnRlcmFjdGluZwogICAgICAgICAqIHdpdGggdGhlIHRhYnMgdGhyb3VnaCB0aGUga2V5Ym9hcmQgYW5kIHdoZW4gdGhlIGZvY3VzZWQgaXRlbSBpcwogICAgICAgICAqIGF1dG9tYXRpY2FsbHkgc2VsZWN0ZWQgKGlmIGBhdXRvc2VsZWN0YCBpcyB0cnVlKS4KICAgICAgICAgKi8KICAgICAgICBhdXRvc2VsZWN0RGVsYXk6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAwfSwKCiAgICAgICAgX3N0ZXA6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAxMH0sCgogICAgICAgIF9ob2xkRGVsYXk6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiAxfSwKCiAgICAgICAgX2xlZnRIaWRkZW46IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICBfcmlnaHRIaWRkZW46IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9LAoKICAgICAgICBfcHJldmlvdXNUYWI6IHt0eXBlOiBPYmplY3R9CiAgICAgIH0sCgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgaG9zdEF0dHJpYnV0ZXM6IHtyb2xlOiAndGFibGlzdCd9LAoKICAgICAgbGlzdGVuZXJzOiB7CiAgICAgICAgJ2lyb24tcmVzaXplJzogJ19vblRhYlNpemluZ0NoYW5nZWQnLAogICAgICAgICdpcm9uLWl0ZW1zLWNoYW5nZWQnOiAnX29uVGFiU2l6aW5nQ2hhbmdlZCcsCiAgICAgICAgJ2lyb24tc2VsZWN0JzogJ19vbklyb25TZWxlY3QnLAogICAgICAgICdpcm9uLWRlc2VsZWN0JzogJ19vbklyb25EZXNlbGVjdCcKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAdHlwZSB7IU9iamVjdH0KICAgICAgICovCiAgICAgIGtleUJpbmRpbmdzOiB7J2xlZnQ6a2V5dXAgcmlnaHQ6a2V5dXAnOiAnX29uQXJyb3dLZXl1cCd9LAoKICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5faG9sZEpvYiA9IG51bGw7CiAgICAgICAgdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtID0gdW5kZWZpbmVkOwogICAgICAgIHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCA9IHVuZGVmaW5lZDsKICAgICAgICB0aGlzLl9iaW5kRGVsYXllZEFjdGl2YXRpb25IYW5kbGVyID0KICAgICAgICAgICAgdGhpcy5fZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyLmJpbmQodGhpcyk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fb25CbHVyQ2FwdHVyZS5iaW5kKHRoaXMpLCB0cnVlKTsKICAgICAgfSwKCiAgICAgIHJlYWR5OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNldFNjcm9sbERpcmVjdGlvbigneScsIHRoaXMuJC50YWJzQ29udGFpbmVyKTsKICAgICAgfSwKCiAgICAgIGRldGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpOwogICAgICB9LAoKICAgICAgX25vaW5rQ2hhbmdlZDogZnVuY3Rpb24obm9pbmspIHsKICAgICAgICB2YXIgY2hpbGRUYWJzID0gZG9tKHRoaXMpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3BhcGVyLXRhYicpOwogICAgICAgIGNoaWxkVGFicy5mb3JFYWNoKAogICAgICAgICAgICBub2luayA/IHRoaXMuX3NldE5vaW5rQXR0cmlidXRlIDogdGhpcy5fcmVtb3ZlTm9pbmtBdHRyaWJ1dGUpOwogICAgICB9LAoKICAgICAgX3NldE5vaW5rQXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ25vaW5rJywgJycpOwogICAgICB9LAoKICAgICAgX3JlbW92ZU5vaW5rQXR0cmlidXRlOiBmdW5jdGlvbihlbGVtZW50KSB7CiAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ25vaW5rJyk7CiAgICAgIH0sCgogICAgICBfY29tcHV0ZVNjcm9sbEJ1dHRvbkNsYXNzOiBmdW5jdGlvbigKICAgICAgICAgIGhpZGVUaGlzQnV0dG9uLCBzY3JvbGxhYmxlLCBoaWRlU2Nyb2xsQnV0dG9ucykgewogICAgICAgIGlmICghc2Nyb2xsYWJsZSB8fCBoaWRlU2Nyb2xsQnV0dG9ucykgewogICAgICAgICAgcmV0dXJuICdoaWRkZW4nOwogICAgICAgIH0KCiAgICAgICAgaWYgKGhpZGVUaGlzQnV0dG9uKSB7CiAgICAgICAgICByZXR1cm4gJ25vdC12aXNpYmxlJzsKICAgICAgICB9CgogICAgICAgIHJldHVybiAnJzsKICAgICAgfSwKCiAgICAgIF9jb21wdXRlVGFic0NvbnRlbnRDbGFzczogZnVuY3Rpb24oc2Nyb2xsYWJsZSwgZml0Q29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIHNjcm9sbGFibGUgPyAnc2Nyb2xsYWJsZScgKyAoZml0Q29udGFpbmVyID8gJyBmaXQtY29udGFpbmVyJyA6ICcnKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGZpdC1jb250YWluZXInOwogICAgICB9LAoKICAgICAgX2NvbXB1dGVTZWxlY3Rpb25CYXJDbGFzczogZnVuY3Rpb24obm9CYXIsIGFsaWduQm90dG9tKSB7CiAgICAgICAgaWYgKG5vQmFyKSB7CiAgICAgICAgICByZXR1cm4gJ2hpZGRlbic7CiAgICAgICAgfSBlbHNlIGlmIChhbGlnbkJvdHRvbSkgewogICAgICAgICAgcmV0dXJuICdhbGlnbi1ib3R0b20nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICcnOwogICAgICB9LAoKICAgICAgLy8gVE9ETyhjZGF0YSk6IEFkZCBgdHJhY2tgIHJlc3BvbnNlIGJhY2sgaW4gd2hlbiBnZXN0dXJlIGxhbmRzLgoKICAgICAgX29uVGFiU2l6aW5nQ2hhbmdlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5kZWJvdW5jZSgnX29uVGFiU2l6aW5nQ2hhbmdlZCcsIGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5fc2Nyb2xsKCk7CiAgICAgICAgICB0aGlzLl90YWJDaGFuZ2VkKHRoaXMuc2VsZWN0ZWRJdGVtKTsKICAgICAgICB9LCAxMCk7CiAgICAgIH0sCgogICAgICBfb25Jcm9uU2VsZWN0OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHRoaXMuX3RhYkNoYW5nZWQoZXZlbnQuZGV0YWlsLml0ZW0sIHRoaXMuX3ByZXZpb3VzVGFiKTsKICAgICAgICB0aGlzLl9wcmV2aW91c1RhYiA9IGV2ZW50LmRldGFpbC5pdGVtOwogICAgICAgIHRoaXMuY2FuY2VsRGVib3VuY2VyKCd0YWItY2hhbmdlZCcpOwogICAgICB9LAoKICAgICAgX29uSXJvbkRlc2VsZWN0OiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHRoaXMuZGVib3VuY2UoJ3RhYi1jaGFuZ2VkJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLl90YWJDaGFuZ2VkKG51bGwsIHRoaXMuX3ByZXZpb3VzVGFiKTsKICAgICAgICAgIHRoaXMuX3ByZXZpb3VzVGFiID0gbnVsbDsKICAgICAgICAgIC8vIFNlZSBwb2x5bWVyL3BvbHltZXIjMTMwNQogICAgICAgIH0sIDEpOwogICAgICB9LAoKICAgICAgX2FjdGl2YXRlSGFuZGxlcjogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gQ2FuY2VsIGl0ZW0gYWN0aXZhdGlvbnMgc2NoZWR1bGVkIGJ5IGtleWJvYXJkIGV2ZW50cyB3aGVuIGFueSBvdGhlcgogICAgICAgIC8vIGFjdGlvbiBjYXVzZXMgYW4gaXRlbSB0byBiZSBhY3RpdmF0ZWQgKGUuZy4gY2xpY2tzKS4KICAgICAgICB0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpOwoKICAgICAgICBJcm9uTWVudUJlaGF2aW9ySW1wbC5fYWN0aXZhdGVIYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQWN0aXZhdGVzIGFuIGl0ZW0gYWZ0ZXIgYSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzKS4KICAgICAgICovCiAgICAgIF9zY2hlZHVsZUFjdGl2YXRpb246IGZ1bmN0aW9uKGl0ZW0sIGRlbGF5KSB7CiAgICAgICAgdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtID0gaXRlbTsKICAgICAgICB0aGlzLl9wZW5kaW5nQWN0aXZhdGlvblRpbWVvdXQgPQogICAgICAgICAgICB0aGlzLmFzeW5jKHRoaXMuX2JpbmREZWxheWVkQWN0aXZhdGlvbkhhbmRsZXIsIGRlbGF5KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBBY3RpdmF0ZXMgdGhlIGxhc3QgaXRlbSBnaXZlbiB0byBgX3NjaGVkdWxlQWN0aXZhdGlvbmAuCiAgICAgICAqLwogICAgICBfZGVsYXllZEFjdGl2YXRpb25IYW5kbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaXRlbSA9IHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbTsKICAgICAgICB0aGlzLl9wZW5kaW5nQWN0aXZhdGlvbkl0ZW0gPSB1bmRlZmluZWQ7CiAgICAgICAgdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0ID0gdW5kZWZpbmVkOwogICAgICAgIGl0ZW0uZmlyZSh0aGlzLmFjdGl2YXRlRXZlbnQsIG51bGwsIHtidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlfSk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQ2FuY2VscyBhIHByZXZpb3VzbHkgc2NoZWR1bGVkIGl0ZW0gYWN0aXZhdGlvbiBtYWRlIHdpdGgKICAgICAgICogYF9zY2hlZHVsZUFjdGl2YXRpb25gLgogICAgICAgKi8KICAgICAgX2NhbmNlbFBlbmRpbmdBY3RpdmF0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMuY2FuY2VsQXN5bmModGhpcy5fcGVuZGluZ0FjdGl2YXRpb25UaW1lb3V0KTsKICAgICAgICAgIHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uSXRlbSA9IHVuZGVmaW5lZDsKICAgICAgICAgIHRoaXMuX3BlbmRpbmdBY3RpdmF0aW9uVGltZW91dCA9IHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfb25BcnJvd0tleXVwOiBmdW5jdGlvbihldmVudCkgewogICAgICAgIGlmICh0aGlzLmF1dG9zZWxlY3QpIHsKICAgICAgICAgIHRoaXMuX3NjaGVkdWxlQWN0aXZhdGlvbih0aGlzLmZvY3VzZWRJdGVtLCB0aGlzLmF1dG9zZWxlY3REZWxheSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX29uQmx1ckNhcHR1cmU6IGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgLy8gQ2FuY2VsIGEgc2NoZWR1bGVkIGl0ZW0gYWN0aXZhdGlvbiAoaWYgYW55KSB3aGVuIHRoYXQgaXRlbSBpcwogICAgICAgIC8vIGJsdXJyZWQuCiAgICAgICAgaWYgKGV2ZW50LnRhcmdldCA9PT0gdGhpcy5fcGVuZGluZ0FjdGl2YXRpb25JdGVtKSB7CiAgICAgICAgICB0aGlzLl9jYW5jZWxQZW5kaW5nQWN0aXZhdGlvbigpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIGdldCBfdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZSgpIHsKICAgICAgICByZXR1cm4gTWF0aC5tYXgoCiAgICAgICAgICAgIDAsIHRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbFdpZHRoIC0gdGhpcy4kLnRhYnNDb250YWluZXIub2Zmc2V0V2lkdGgpOwogICAgICB9LAoKICAgICAgX3Njcm9sbDogZnVuY3Rpb24oZSwgZGV0YWlsKSB7CiAgICAgICAgaWYgKCF0aGlzLnNjcm9sbGFibGUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciBkZHggPSAoZGV0YWlsICYmIC1kZXRhaWwuZGR4KSB8fCAwOwogICAgICAgIHRoaXMuX2FmZmVjdFNjcm9sbChkZHgpOwogICAgICB9LAoKICAgICAgX2Rvd246IGZ1bmN0aW9uKGUpIHsKICAgICAgICAvLyBnbyBvbmUgYmVhdCBhc3luYyB0byBkZWZlYXQgSXJvbk1lbnVCZWhhdmlvcgogICAgICAgIC8vIGF1dG9yZWZvY3VzLW9uLW5vLXNlbGVjdGlvbiB0aW1lb3V0CiAgICAgICAgdGhpcy5hc3luYyhmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICh0aGlzLl9kZWZhdWx0Rm9jdXNBc3luYykgewogICAgICAgICAgICB0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2RlZmF1bHRGb2N1c0FzeW5jKTsKICAgICAgICAgICAgdGhpcy5fZGVmYXVsdEZvY3VzQXN5bmMgPSBudWxsOwogICAgICAgICAgfQogICAgICAgIH0sIDEpOwogICAgICB9LAoKICAgICAgX2FmZmVjdFNjcm9sbDogZnVuY3Rpb24oZHgpIHsKICAgICAgICB0aGlzLiQudGFic0NvbnRhaW5lci5zY3JvbGxMZWZ0ICs9IGR4OwoKICAgICAgICB2YXIgc2Nyb2xsTGVmdCA9IHRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQ7CgogICAgICAgIHRoaXMuX2xlZnRIaWRkZW4gPSBzY3JvbGxMZWZ0ID09PSAwOwogICAgICAgIHRoaXMuX3JpZ2h0SGlkZGVuID0gc2Nyb2xsTGVmdCA9PT0gdGhpcy5fdGFiQ29udGFpbmVyU2Nyb2xsU2l6ZTsKICAgICAgfSwKCiAgICAgIF9vbkxlZnRTY3JvbGxCdXR0b25Eb3duOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9zY3JvbGxUb0xlZnQoKTsKICAgICAgICB0aGlzLl9ob2xkSm9iID0gc2V0SW50ZXJ2YWwodGhpcy5fc2Nyb2xsVG9MZWZ0LmJpbmQodGhpcyksIHRoaXMuX2hvbGREZWxheSk7CiAgICAgIH0sCgogICAgICBfb25SaWdodFNjcm9sbEJ1dHRvbkRvd246IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3Njcm9sbFRvUmlnaHQoKTsKICAgICAgICB0aGlzLl9ob2xkSm9iID0KICAgICAgICAgICAgc2V0SW50ZXJ2YWwodGhpcy5fc2Nyb2xsVG9SaWdodC5iaW5kKHRoaXMpLCB0aGlzLl9ob2xkRGVsYXkpOwogICAgICB9LAoKICAgICAgX29uU2Nyb2xsQnV0dG9uVXA6IGZ1bmN0aW9uKCkgewogICAgICAgIGNsZWFySW50ZXJ2YWwodGhpcy5faG9sZEpvYik7CiAgICAgICAgdGhpcy5faG9sZEpvYiA9IG51bGw7CiAgICAgIH0sCgogICAgICBfc2Nyb2xsVG9MZWZ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9hZmZlY3RTY3JvbGwoLXRoaXMuX3N0ZXApOwogICAgICB9LAoKICAgICAgX3Njcm9sbFRvUmlnaHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2FmZmVjdFNjcm9sbCh0aGlzLl9zdGVwKTsKICAgICAgfSwKCiAgICAgIF90YWJDaGFuZ2VkOiBmdW5jdGlvbih0YWIsIG9sZCkgewogICAgICAgIGlmICghdGFiKSB7CiAgICAgICAgICAvLyBSZW1vdmUgdGhlIGJhciB3aXRob3V0IGFuaW1hdGlvbi4KICAgICAgICAgIHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgnZXhwYW5kJyk7CiAgICAgICAgICB0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5yZW1vdmUoJ2NvbnRyYWN0Jyk7CiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkJhcigwLCAwKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciByID0gdGhpcy4kLnRhYnNDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciB3ID0gci53aWR0aDsKICAgICAgICB2YXIgdGFiUmVjdCA9IHRhYi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICB2YXIgdGFiT2Zmc2V0TGVmdCA9IHRhYlJlY3QubGVmdCAtIHIubGVmdDsKCiAgICAgICAgdGhpcy5fcG9zID0gewogICAgICAgICAgd2lkdGg6IHRoaXMuX2NhbGNQZXJjZW50KHRhYlJlY3Qud2lkdGgsIHcpLAogICAgICAgICAgbGVmdDogdGhpcy5fY2FsY1BlcmNlbnQodGFiT2Zmc2V0TGVmdCwgdykKICAgICAgICB9OwoKICAgICAgICBpZiAodGhpcy5ub1NsaWRlIHx8IG9sZCA9PSBudWxsKSB7CiAgICAgICAgICAvLyBQb3NpdGlvbiB0aGUgYmFyIHdpdGhvdXQgYW5pbWF0aW9uLgogICAgICAgICAgdGhpcy4kLnNlbGVjdGlvbkJhci5jbGFzc0xpc3QucmVtb3ZlKCdleHBhbmQnKTsKICAgICAgICAgIHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0LnJlbW92ZSgnY29udHJhY3QnKTsKICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uQmFyKHRoaXMuX3Bvcy53aWR0aCwgdGhpcy5fcG9zLmxlZnQpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIG9sZFJlY3QgPSBvbGQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgdmFyIG9sZEluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKG9sZCk7CiAgICAgICAgdmFyIGluZGV4ID0gdGhpcy5pdGVtcy5pbmRleE9mKHRhYik7CiAgICAgICAgdmFyIG0gPSA1OwoKICAgICAgICAvLyBiYXIgYW5pbWF0aW9uOiBleHBhbmQKICAgICAgICB0aGlzLiQuc2VsZWN0aW9uQmFyLmNsYXNzTGlzdC5hZGQoJ2V4cGFuZCcpOwoKICAgICAgICB2YXIgbW92ZVJpZ2h0ID0gb2xkSW5kZXggPCBpbmRleDsKICAgICAgICB2YXIgaXNSVEwgPSB0aGlzLl9pc1JUTDsKICAgICAgICBpZiAoaXNSVEwpIHsKICAgICAgICAgIG1vdmVSaWdodCA9ICFtb3ZlUmlnaHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAobW92ZVJpZ2h0KSB7CiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkJhcigKICAgICAgICAgICAgICB0aGlzLl9jYWxjUGVyY2VudCh0YWJSZWN0LmxlZnQgKyB0YWJSZWN0LndpZHRoIC0gb2xkUmVjdC5sZWZ0LCB3KSAtIG0sCiAgICAgICAgICAgICAgdGhpcy5fbGVmdCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uQmFyKAogICAgICAgICAgICAgIHRoaXMuX2NhbGNQZXJjZW50KG9sZFJlY3QubGVmdCArIG9sZFJlY3Qud2lkdGggLSB0YWJSZWN0LmxlZnQsIHcpIC0gbSwKICAgICAgICAgICAgICB0aGlzLl9jYWxjUGVyY2VudCh0YWJPZmZzZXRMZWZ0LCB3KSArIG0pOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkgewogICAgICAgICAgdGhpcy5fc2Nyb2xsVG9TZWxlY3RlZElmTmVlZGVkKHRhYlJlY3Qud2lkdGgsIHRhYk9mZnNldExlZnQpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9zY3JvbGxUb1NlbGVjdGVkSWZOZWVkZWQ6IGZ1bmN0aW9uKHRhYldpZHRoLCB0YWJPZmZzZXRMZWZ0KSB7CiAgICAgICAgdmFyIGwgPSB0YWJPZmZzZXRMZWZ0IC0gdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdDsKICAgICAgICBpZiAobCA8IDApIHsKICAgICAgICAgIHRoaXMuJC50YWJzQ29udGFpbmVyLnNjcm9sbExlZnQgKz0gbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgbCArPSAodGFiV2lkdGggLSB0aGlzLiQudGFic0NvbnRhaW5lci5vZmZzZXRXaWR0aCk7CiAgICAgICAgICBpZiAobCA+IDApIHsKICAgICAgICAgICAgdGhpcy4kLnRhYnNDb250YWluZXIuc2Nyb2xsTGVmdCArPSBsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9jYWxjUGVyY2VudDogZnVuY3Rpb24odywgdzApIHsKICAgICAgICByZXR1cm4gMTAwICogdyAvIHcwOwogICAgICB9LAoKICAgICAgX3Bvc2l0aW9uQmFyOiBmdW5jdGlvbih3aWR0aCwgbGVmdCkgewogICAgICAgIHdpZHRoID0gd2lkdGggfHwgMDsKICAgICAgICBsZWZ0ID0gbGVmdCB8fCAwOwoKICAgICAgICB0aGlzLl93aWR0aCA9IHdpZHRoOwogICAgICAgIHRoaXMuX2xlZnQgPSBsZWZ0OwogICAgICAgIHRoaXMudHJhbnNmb3JtKAogICAgICAgICAgICAndHJhbnNsYXRlWCgnICsgbGVmdCArICclKSBzY2FsZVgoJyArICh3aWR0aCAvIDEwMCkgKyAnKScsCiAgICAgICAgICAgIHRoaXMuJC5zZWxlY3Rpb25CYXIpOwogICAgICB9LAoKICAgICAgX29uQmFyVHJhbnNpdGlvbkVuZDogZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBjbCA9IHRoaXMuJC5zZWxlY3Rpb25CYXIuY2xhc3NMaXN0OwogICAgICAgIC8vIGJhciBhbmltYXRpb246IGV4cGFuZCAtPiBjb250cmFjdAogICAgICAgIGlmIChjbC5jb250YWlucygnZXhwYW5kJykpIHsKICAgICAgICAgIGNsLnJlbW92ZSgnZXhwYW5kJyk7CiAgICAgICAgICBjbC5hZGQoJ2NvbnRyYWN0Jyk7CiAgICAgICAgICB0aGlzLl9wb3NpdGlvbkJhcih0aGlzLl9wb3Mud2lkdGgsIHRoaXMuX3Bvcy5sZWZ0KTsKICAgICAgICAgIC8vIGJhciBhbmltYXRpb24gZG9uZQogICAgICAgIH0gZWxzZSBpZiAoY2wuY29udGFpbnMoJ2NvbnRyYWN0JykpIHsKICAgICAgICAgIGNsLnJlbW92ZSgnY29udHJhY3QnKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9MSUNFTlNFLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQVVUSE9SUy50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlCiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vQ09OVFJJQlVUT1JTLnR4dCBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcwogICAgcGFydCBvZiB0aGUgcG9seW1lciBwcm9qZWN0IGlzIGFsc28gc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudAogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL1BBVEVOVFMudHh0CiAgICAqLwoKICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB0b2FzdCBjdXJyZW50bHkgb3BlbmVkLgogICAgdmFyIGN1cnJlbnRUb2FzdCA9IG51bGw7CgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246IFtTbmFja2JhcnMgJgogICAgdG9hc3RzXShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvc25hY2tiYXJzLXRvYXN0cy5odG1sKQoKICAgIGBwYXBlci10b2FzdGAgcHJvdmlkZXMgYSBzdWJ0bGUgbm90aWZpY2F0aW9uIHRvYXN0LiBPbmx5IG9uZSBgcGFwZXItdG9hc3RgIHdpbGwKICAgIGJlIHZpc2libGUgb24gc2NyZWVuLgoKICAgIFVzZSBgb3BlbmVkYCB0byBzaG93IHRoZSB0b2FzdDoKCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItdG9hc3QgdGV4dD0iSGVsbG8gd29ybGQhIiBvcGVuZWQ+PC9wYXBlci10b2FzdD4KCiAgICBBbHNvIGBvcGVuKClgIG9yIGBzaG93KClgIGNhbiBiZSB1c2VkIHRvIHNob3cgdGhlIHRvYXN0OgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci1idXR0b24gb24tY2xpY2s9Im9wZW5Ub2FzdCI+T3BlbiBUb2FzdDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxwYXBlci10b2FzdCBpZD0idG9hc3QiIHRleHQ9IkhlbGxvIHdvcmxkISI+PC9wYXBlci10b2FzdD4KCiAgICAgICAgLi4uCgogICAgICAgIG9wZW5Ub2FzdDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLiQudG9hc3Qub3BlbigpOwogICAgICAgIH0KCiAgICBTZXQgYGR1cmF0aW9uYCB0byAwLCBhIG5lZ2F0aXZlIG51bWJlciBvciBJbmZpbml0eSB0byBwZXJzaXN0IHRoZSB0b2FzdCBvbgogICAgc2NyZWVuOgoKICAgIEV4YW1wbGU6CgogICAgICAgIDxwYXBlci10b2FzdCB0ZXh0PSJUZXJtcyBhbmQgY29uZGl0aW9ucyIgb3BlbmVkIGR1cmF0aW9uPSIwIj4KICAgICAgICAgIDxhIGhyZWY9IiMiPlNob3cgbW9yZTwvYT4KICAgICAgICA8L3BhcGVyLXRvYXN0PgoKCiAgICAjIyMgU3R5bGluZwogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CgogICAgQ3VzdG9tIHByb3BlcnR5IHwgRGVzY3JpcHRpb24gfCBEZWZhdWx0CiAgICAtLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLQogICAgYC0tcGFwZXItdG9hc3QtYmFja2dyb3VuZC1jb2xvcmAgfCBUaGUgcGFwZXItdG9hc3QgYmFja2dyb3VuZC1jb2xvciB8IGAjMzIzMjMyYAogICAgYC0tcGFwZXItdG9hc3QtY29sb3JgIHwgVGhlIHBhcGVyLXRvYXN0IGNvbG9yIHwgYCNmMWYxZjFgCgogICAgVGhpcyBlbGVtZW50IGFwcGxpZXMgdGhlIG1peGluIGAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2VgIGJ1dCBkb2VzIG5vdCBpbXBvcnQKICAgIGBwYXBlci1zdHlsZXMvdHlwb2dyYXBoeS5odG1sYC4gSW4gb3JkZXIgdG8gYXBwbHkgdGhlIGBSb2JvdG9gIGZvbnQgdG8gdGhpcwogICAgZWxlbWVudCwgbWFrZSBzdXJlIHlvdSd2ZSBpbXBvcnRlZCBgcGFwZXItc3R5bGVzL3R5cG9ncmFwaHkuaHRtbGAuCgogICAgQGdyb3VwIFBhcGVyIEVsZW1lbnRzCiAgICBAZWxlbWVudCBwYXBlci10b2FzdAogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICBAaGVybyBoZXJvLnN2ZwogICAgKi8KICAgIFBvbHltZXIoewogICAgICBfdGVtcGxhdGU6IGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9hc3QtYmFja2dyb3VuZC1jb2xvciwgIzMyMzIzMik7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvYXN0LWNvbG9yLCAjZjFmMWYxKTsKICAgICAgICBtaW4taGVpZ2h0OiA0OHB4OwogICAgICAgIG1pbi13aWR0aDogMjg4cHg7CiAgICAgICAgcGFkZGluZzogMTZweCAyNHB4OwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgYm94LXNoYWRvdzogMCAycHggNXB4IDAgcmdiYSgwLCAwLCAwLCAwLjI2KTsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgbWFyZ2luOiAxMnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgICAgLXdlYmtpdC10cmFuc2l0aW9uOiAtd2Via2l0LXRyYW5zZm9ybSAwLjNzLCBvcGFjaXR5IDAuM3M7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuM3MsIG9wYWNpdHkgMC4zczsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIC13ZWJraXQtdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMHB4KTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwcHgpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgIH0KCiAgICAgIDpob3N0KC5jYXBzdWxlKSB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMjRweDsKICAgICAgfQoKICAgICAgOmhvc3QoLmZpdC1ib3R0b20pIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBtaW4td2lkdGg6IDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIDpob3N0KC5wYXBlci10b2FzdC1vcGVuKSB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICAtd2Via2l0LXRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpOwogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwcHgpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxzcGFuIGlkPSJsYWJlbCI+e3t0ZXh0fX08L3NwYW4+CiAgICA8c2xvdD48L3Nsb3Q+CmAsCgogICAgICBpczogJ3BhcGVyLXRvYXN0JywKICAgICAgYmVoYXZpb3JzOiBbSXJvbk92ZXJsYXlCZWhhdmlvcl0sCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVsZW1lbnQgdG8gZml0IGB0aGlzYCBpbnRvLgogICAgICAgICAqIE92ZXJyaWRkZW4gZnJvbSBgUG9seW1lci5Jcm9uRml0QmVoYXZpb3JgLgogICAgICAgICAqLwogICAgICAgIGZpdEludG86IHt0eXBlOiBPYmplY3QsIHZhbHVlOiB3aW5kb3csIG9ic2VydmVyOiAnX29uRml0SW50b0NoYW5nZWQnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG9yaWVudGF0aW9uIGFnYWluc3Qgd2hpY2ggdG8gYWxpZ24gdGhlIGRyb3Bkb3duIGNvbnRlbnQKICAgICAgICAgKiBob3Jpem9udGFsbHkgcmVsYXRpdmUgdG8gYHBvc2l0aW9uVGFyZ2V0YC4KICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gYFBvbHltZXIuSXJvbkZpdEJlaGF2aW9yYC4KICAgICAgICAgKi8KICAgICAgICBob3Jpem9udGFsQWxpZ246IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnbGVmdCd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3JpZW50YXRpb24gYWdhaW5zdCB3aGljaCB0byBhbGlnbiB0aGUgZHJvcGRvd24gY29udGVudAogICAgICAgICAqIHZlcnRpY2FsbHkgcmVsYXRpdmUgdG8gYHBvc2l0aW9uVGFyZ2V0YC4KICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gYFBvbHltZXIuSXJvbkZpdEJlaGF2aW9yYC4KICAgICAgICAgKi8KICAgICAgICB2ZXJ0aWNhbEFsaWduOiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJ2JvdHRvbSd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzIHRvIHNob3cgdGhlIHRvYXN0LgogICAgICAgICAqIFNldCB0byBgMGAsIGEgbmVnYXRpdmUgbnVtYmVyLCBvciBgSW5maW5pdHlgLCB0byBkaXNhYmxlIHRoZQogICAgICAgICAqIHRvYXN0IGF1dG8tY2xvc2luZy4KICAgICAgICAgKi8KICAgICAgICBkdXJhdGlvbjoge3R5cGU6IE51bWJlciwgdmFsdWU6IDMwMDB9LAoKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdGV4dCB0byBkaXNwbGF5IGluIHRoZSB0b2FzdC4KICAgICAgICAgKi8KICAgICAgICB0ZXh0OiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJyd9LAoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgICAqIFNldCB0byBmYWxzZSB0byBlbmFibGUgY2xvc2luZyBvZiB0aGUgdG9hc3QgYnkgY2xpY2tpbmcgb3V0c2lkZSBpdC4KICAgICAgICAgKi8KICAgICAgICBub0NhbmNlbE9uT3V0c2lkZUNsaWNrOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IHRydWV9LAoKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZGVuIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgICAqIFNldCB0byB0cnVlIHRvIGRpc2FibGUgYXV0by1mb2N1c2luZyB0aGUgdG9hc3Qgb3IgY2hpbGQgbm9kZXMgd2l0aAogICAgICAgICAqIHRoZSBgYXV0b2ZvY3VzYCBhdHRyaWJ1dGVgIHdoZW4gdGhlIG92ZXJsYXkgaXMgb3BlbmVkLgogICAgICAgICAqLwogICAgICAgIG5vQXV0b0ZvY3VzOiB7dHlwZTogQm9vbGVhbiwgdmFsdWU6IHRydWV9CiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHsndHJhbnNpdGlvbmVuZCc6ICdfX29uVHJhbnNpdGlvbkVuZCd9LAoKICAgICAgLyoqCiAgICAgICAqIFJlYWQtb25seS4gRGVwcmVjYXRlZC4gVXNlIGBvcGVuZWRgIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKiBAcHJvcGVydHkgdmlzaWJsZQogICAgICAgKiBAZGVwcmVjYXRlZAogICAgICAgKi8KICAgICAgZ2V0IHZpc2libGUoKSB7CiAgICAgICAgQmFzZS5fd2FybignYHZpc2libGVgIGlzIGRlcHJlY2F0ZWQsIHVzZSBgb3BlbmVkYCBpbnN0ZWFkJyk7CiAgICAgICAgcmV0dXJuIHRoaXMub3BlbmVkOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJlYWQtb25seS4gQ2FuIGF1dG8tY2xvc2UgaWYgZHVyYXRpb24gaXMgYSBwb3NpdGl2ZSBmaW5pdGUgbnVtYmVyLgogICAgICAgKiBAcHJvcGVydHkgX2NhbkF1dG9DbG9zZQogICAgICAgKi8KICAgICAgZ2V0IF9jYW5BdXRvQ2xvc2UoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZHVyYXRpb24gPiAwICYmIHRoaXMuZHVyYXRpb24gIT09IEluZmluaXR5OwogICAgICB9LAoKICAgICAgY3JlYXRlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fYXV0b0Nsb3NlID0gbnVsbDsKICAgICAgICBJcm9uQTExeUFubm91bmNlci5yZXF1ZXN0QXZhaWxhYmlsaXR5KCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2hvdyB0aGUgdG9hc3QuIFdpdGhvdXQgYXJndW1lbnRzLCB0aGlzIGlzIHRoZSBzYW1lIGFzIGBvcGVuKClgIGZyb20KICAgICAgICogYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKiBAcGFyYW0geyhPYmplY3R8c3RyaW5nKT19IHByb3BlcnRpZXMgUHJvcGVydGllcyB0byBiZSBzZXQgYmVmb3JlIG9wZW5pbmcgdGhlIHRvYXN0LgogICAgICAgKiBlLmcuIGB0b2FzdC5zaG93KCdoZWxsbycpYCBvciBgdG9hc3Quc2hvdyh7dGV4dDogJ2hlbGxvJywgZHVyYXRpb246IDMwMDB9KWAKICAgICAgICovCiAgICAgIHNob3c6IGZ1bmN0aW9uKHByb3BlcnRpZXMpIHsKICAgICAgICBpZiAodHlwZW9mIHByb3BlcnRpZXMgPT0gJ3N0cmluZycpIHsKICAgICAgICAgIHByb3BlcnRpZXMgPSB7dGV4dDogcHJvcGVydGllc307CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHByb3BlcnRpZXMpIHsKICAgICAgICAgIGlmIChwcm9wZXJ0eS5pbmRleE9mKCdfJykgPT09IDApIHsKICAgICAgICAgICAgQmFzZS5fd2FybigKICAgICAgICAgICAgICAgICdUaGUgcHJvcGVydHkgIicgKyBwcm9wZXJ0eSArICciIGlzIHByaXZhdGUgYW5kIHdhcyBub3Qgc2V0LicpOwogICAgICAgICAgfSBlbHNlIGlmIChwcm9wZXJ0eSBpbiB0aGlzKSB7CiAgICAgICAgICAgIHRoaXNbcHJvcGVydHldID0gcHJvcGVydGllc1twcm9wZXJ0eV07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBCYXNlLl93YXJuKCdUaGUgcHJvcGVydHkgIicgKyBwcm9wZXJ0eSArICciIGlzIG5vdCB2YWxpZC4nKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5vcGVuKCk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogSGlkZSB0aGUgdG9hc3QuIFNhbWUgYXMgYGNsb3NlKClgIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKi8KICAgICAgaGlkZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCBvbiB0cmFuc2l0aW9ucyBvZiB0aGUgdG9hc3QsIGluZGljYXRpbmcgYSBmaW5pc2hlZCBhbmltYXRpb24KICAgICAgICogQHByaXZhdGUKICAgICAgICovCiAgICAgIF9fb25UcmFuc2l0aW9uRW5kOiBmdW5jdGlvbihlKSB7CiAgICAgICAgLy8gdGhlcmUgYXJlIGRpZmZlcmVudCB0cmFuc2l0aW9ucyB0aGF0IGFyZSBoYXBwZW5pbmcgd2hlbiBvcGVuaW5nIGFuZAogICAgICAgIC8vIGNsb3NpbmcgdGhlIHRvYXN0LiBUaGUgbGFzdCBvbmUgc28gZmFyIGlzIGZvciBgb3BhY2l0eWAuCiAgICAgICAgLy8gVGhpcyBtYXJrcyB0aGUgZW5kIG9mIHRoZSB0cmFuc2l0aW9uLCBzbyB3ZSBjaGVjayBmb3IgdGhpcyB0byBkZXRlcm1pbmUKICAgICAgICAvLyBpZiB0aGlzIGlzIHRoZSBjb3JyZWN0IGV2ZW50LgogICAgICAgIGlmIChlICYmIGUudGFyZ2V0ID09PSB0aGlzICYmIGUucHJvcGVydHlOYW1lID09PSAnb3BhY2l0eScpIHsKICAgICAgICAgIGlmICh0aGlzLm9wZW5lZCkgewogICAgICAgICAgICB0aGlzLl9maW5pc2hSZW5kZXJPcGVuZWQoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaFJlbmRlckNsb3NlZCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZGVuIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdmFsdWUgb2YgYG9wZW5lZGAgY2hhbmdlcy4KICAgICAgICovCiAgICAgIF9vcGVuZWRDaGFuZ2VkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fYXV0b0Nsb3NlICE9PSBudWxsKSB7CiAgICAgICAgICB0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX2F1dG9DbG9zZSk7CiAgICAgICAgICB0aGlzLl9hdXRvQ2xvc2UgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5vcGVuZWQpIHsKICAgICAgICAgIGlmIChjdXJyZW50VG9hc3QgJiYgY3VycmVudFRvYXN0ICE9PSB0aGlzKSB7CiAgICAgICAgICAgIGN1cnJlbnRUb2FzdC5jbG9zZSgpOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudFRvYXN0ID0gdGhpczsKICAgICAgICAgIHRoaXMuZmlyZSgnaXJvbi1hbm5vdW5jZScsIHt0ZXh0OiB0aGlzLnRleHR9KTsKICAgICAgICAgIGlmICh0aGlzLl9jYW5BdXRvQ2xvc2UpIHsKICAgICAgICAgICAgdGhpcy5fYXV0b0Nsb3NlID0gdGhpcy5hc3luYyh0aGlzLmNsb3NlLCB0aGlzLmR1cmF0aW9uKTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUb2FzdCA9PT0gdGhpcykgewogICAgICAgICAgY3VycmVudFRvYXN0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgSXJvbk92ZXJsYXlCZWhhdmlvckltcGwuX29wZW5lZENoYW5nZWQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBPdmVycmlkZGVuIGZyb20gYElyb25PdmVybGF5QmVoYXZpb3JgLgogICAgICAgKi8KICAgICAgX3JlbmRlck9wZW5lZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5jbGFzc0xpc3QuYWRkKCdwYXBlci10b2FzdC1vcGVuJyk7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogT3ZlcnJpZGRlbiBmcm9tIGBJcm9uT3ZlcmxheUJlaGF2aW9yYC4KICAgICAgICovCiAgICAgIF9yZW5kZXJDbG9zZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuY2xhc3NMaXN0LnJlbW92ZSgncGFwZXItdG9hc3Qtb3BlbicpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfb25GaXRJbnRvQ2hhbmdlZDogZnVuY3Rpb24oZml0SW50bykgewogICAgICAgIHRoaXMucG9zaXRpb25UYXJnZXQgPSBmaXRJbnRvOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbiBgcGFwZXItdG9hc3RgIGlzIG9wZW5lZC4KICAgICAgICoKICAgICAgICogQGV2ZW50ICdpcm9uLWFubm91bmNlJwogICAgICAgKiBAcGFyYW0ge3t0ZXh0OiBzdHJpbmd9fSBkZXRhaWwgQ29udGFpbnMgdGV4dCB0aGF0IHdpbGwgYmUgYW5ub3VuY2VkLgogICAgICAgKi8KICAgIH0pOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNSBUaGUgUG9seW1lciBQcm9qZWN0IEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICBUaGlzIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCB1bmRlciB0aGUgQlNEIHN0eWxlIGxpY2Vuc2UgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGF1dGhvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dAogICAgVGhlIGNvbXBsZXRlIHNldCBvZiBjb250cmlidXRvcnMgbWF5IGJlIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0CiAgICBDb2RlIGRpc3RyaWJ1dGVkIGJ5IEdvb2dsZSBhcyBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbwogICAgc3ViamVjdCB0byBhbiBhZGRpdGlvbmFsIElQIHJpZ2h0cyBncmFudCBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgY29uc3QgdGVtcGxhdGUkaSA9IGh0bWxgCgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIEBhcHBseSAtLWxheW91dC1ob3Jpem9udGFsOwogICAgICAgIEBhcHBseSAtLWxheW91dC1jZW50ZXI7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICB9CgogICAgICA6aG9zdCg6Zm9jdXMpIHsKICAgICAgICBvdXRsaW5lOm5vbmU7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYmFyIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDhweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBvcGFjaXR5OiAwLjQ7CiAgICAgICAgdHJhbnNpdGlvbjogYmFja2dyb3VuZC1jb2xvciBsaW5lYXIgLjA4czsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1iYXItY29sb3IsICMwMDAwMDApOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1iYXI7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAtM3B4OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgaGVpZ2h0OiAyMHB4OwogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGJvcmRlci1yYWRpdXM6IDUwJTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA1cHggMCByZ2JhKDAsIDAsIDAsIDAuNik7CiAgICAgICAgdHJhbnNpdGlvbjogLXdlYmtpdC10cmFuc2Zvcm0gbGluZWFyIC4wOHMsIGJhY2tncm91bmQtY29sb3IgbGluZWFyIC4wOHM7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIGxpbmVhciAuMDhzLCBiYWNrZ3JvdW5kLWNvbG9yIGxpbmVhciAuMDhzOwogICAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi11bmNoZWNrZWQtYnV0dG9uLWNvbG9yLCB2YXIoLS1wYXBlci1ncmV5LTUwKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJ1dHRvbjsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1idXR0b24uZHJhZ2dpbmcgewogICAgICAgIC13ZWJraXQtdHJhbnNpdGlvbjogbm9uZTsKICAgICAgICB0cmFuc2l0aW9uOiBub25lOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF06bm90KFtkaXNhYmxlZF0pKSAudG9nZ2xlLWJhciB7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1iYXItY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJhcjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnRvZ2dsZS1iYXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICMwMDA7CiAgICAgICAgb3BhY2l0eTogMC4xMjsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdKSAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNnB4LCAwKTsKICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZSgxNnB4LCAwKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2NoZWNrZWRdOm5vdChbZGlzYWJsZWRdKSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1idXR0b24tY29sb3IsIHZhcigtLXByaW1hcnktY29sb3IpKTsKCiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbjsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgLnRvZ2dsZS1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNiZGJkYmQ7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmsgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IC0xNHB4OwogICAgICAgIGxlZnQ6IC0xNHB4OwogICAgICAgIHJpZ2h0OiBhdXRvOwogICAgICAgIGJvdHRvbTogYXV0bzsKICAgICAgICB3aWR0aDogNDhweDsKICAgICAgICBoZWlnaHQ6IDQ4cHg7CiAgICAgICAgb3BhY2l0eTogMC41OwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1pbmstY29sb3IsIHZhcigtLXByaW1hcnktdGV4dC1jb2xvcikpOwoKICAgICAgICBAYXBwbHkgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1pbms7CiAgICAgIH0KCiAgICAgIDpob3N0KFtjaGVja2VkXSkgLnRvZ2dsZS1pbmsgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtaW5rLWNvbG9yLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CgogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbms7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIHdpZHRoOiAzNnB4OwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICAvKiBUaGUgdG9nZ2xlIGJ1dHRvbiBoYXMgYW4gYWJzb2x1dGUgcG9zaXRpb24gb2YgLTNweDsgVGhlIGV4dHJhIDFweAogICAgICAgIC8qIGFjY291bnRzIGZvciB0aGUgdG9nZ2xlIGJ1dHRvbiBzaGFkb3cgYm94LiAqLwogICAgICAgIG1hcmdpbjogNHB4IDFweDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1sYWJlbCB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICAgIHBhZGRpbmctbGVmdDogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1sYWJlbC1zcGFjaW5nLCA4cHgpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWxhYmVsLWNvbG9yLCB2YXIoLS1wcmltYXJ5LXRleHQtY29sb3IpKTsKICAgICAgfQoKICAgICAgLyogaW52YWxpZCBzdGF0ZSAqLwogICAgICA6aG9zdChbaW52YWxpZF0pIC50b2dnbGUtYmFyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtYmFyLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci10b2dnbGUtYnV0dG9uLWludmFsaWQtYnV0dG9uLWNvbG9yLCB2YXIoLS1lcnJvci1jb2xvcikpOwogICAgICB9CgogICAgICA6aG9zdChbaW52YWxpZF0pIC50b2dnbGUtaW5rIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1pbnZhbGlkLWluay1jb2xvciwgdmFyKC0tZXJyb3ItY29sb3IpKTsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGNsYXNzPSJ0b2dnbGUtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0idG9nZ2xlQmFyIiBjbGFzcz0idG9nZ2xlLWJhciI+PC9kaXY+CiAgICAgIDxkaXYgaWQ9InRvZ2dsZUJ1dHRvbiIgY2xhc3M9InRvZ2dsZS1idXR0b24iPjwvZGl2PgogICAgPC9kaXY+CgogICAgPGRpdiBjbGFzcz0idG9nZ2xlLWxhYmVsIj48c2xvdD48L3Nsb3Q+PC9kaXY+CgogIGA7CiAgICB0ZW1wbGF0ZSRpLnNldEF0dHJpYnV0ZSgnc3RyaXAtd2hpdGVzcGFjZScsICcnKTsKCiAgICAvKioKICAgIE1hdGVyaWFsIGRlc2lnbjogW1N3aXRjaF0oaHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS9kZXNpZ24vc3BlYy9jb21wb25lbnRzL3NlbGVjdGlvbi1jb250cm9scy5odG1sI3NlbGVjdGlvbi1jb250cm9scy1zd2l0Y2gpCgogICAgYHBhcGVyLXRvZ2dsZS1idXR0b25gIHByb3ZpZGVzIGEgT04vT0ZGIHN3aXRjaCB0aGF0IHVzZXIgY2FuIHRvZ2dsZSB0aGUgc3RhdGUKICAgIGJ5IHRhcHBpbmcgb3IgYnkgZHJhZ2dpbmcgdGhlIHN3aXRjaC4KCiAgICBFeGFtcGxlOgoKICAgICAgICA8cGFwZXItdG9nZ2xlLWJ1dHRvbj48L3BhcGVyLXRvZ2dsZS1idXR0b24+CgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1iYXItY29sb3JgIHwgU2xpZGVyIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIG5vdCBjaGVja2VkIHwgYCMwMDAwMDBgCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b24tY29sb3JgIHwgQnV0dG9uIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIG5vdCBjaGVja2VkIHwgYC0tcGFwZXItZ3JleS01MGAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWluay1jb2xvcmAgfCBTZWxlY3RlZC9mb2N1cyByaXBwbGUgY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgbm90IGNoZWNrZWQgfCBgLS1kYXJrLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyLWNvbG9yYCB8IFNsaWRlciBidXR0b24gY29sb3Igd2hlbiB0aGUgaW5wdXQgaXMgY2hlY2tlZCB8IGAtLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYnV0dG9uLWNvbG9yYCB8IEJ1dHRvbiBjb2xvciB3aGVuIHRoZSBpbnB1dCBpcyBjaGVja2VkIHwgYC0tcHJpbWFyeS1jb2xvcmAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24tY2hlY2tlZC1pbmstY29sb3JgIHwgU2VsZWN0ZWQvZm9jdXMgcmlwcGxlIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGNoZWNrZWQgfCBgLS1wcmltYXJ5LWNvbG9yYAogICAgYC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1pbnZhbGlkLWJhci1jb2xvcmAgfCBTbGlkZXIgYnV0dG9uIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGludmFsaWQgfCBgLS1lcnJvci1jb2xvcmAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1idXR0b24tY29sb3JgIHwgQnV0dG9uIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGludmFsaWQgfCBgLS1lcnJvci1jb2xvcmAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24taW52YWxpZC1pbmstY29sb3JgIHwgU2VsZWN0ZWQvZm9jdXMgcmlwcGxlIGNvbG9yIHdoZW4gdGhlIGlucHV0IGlzIGludmFsaWQgfCBgLS1lcnJvci1jb2xvcmAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWJhcmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBzbGlkZXIgd2hlbiB0aGUgaW5wdXQgaXMgbm90IGNoZWNrZWQgfCBge31gCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLXVuY2hlY2tlZC1idXR0b25gIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgc2xpZGVyIGJ1dHRvbiB3aGVuIHRoZSBpbnB1dCBpcyBub3QgY2hlY2tlZCB8IGB7fWAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24tdW5jaGVja2VkLWlua2AgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSByaXBwbGUgd2hlbiB0aGUgaW5wdXQgaXMgbm90IGNoZWNrZWQgfCBge31gCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtYmFyYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHNsaWRlciB3aGVuIHRoZSBpbnB1dCBpcyBjaGVja2VkIHwgYHt9YAogICAgYC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1jaGVja2VkLWJ1dHRvbmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSBzbGlkZXIgYnV0dG9uIHdoZW4gdGhlIGlucHV0IGlzIGNoZWNrZWQgfCBge31gCiAgICBgLS1wYXBlci10b2dnbGUtYnV0dG9uLWNoZWNrZWQtaW5rYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHJpcHBsZSB3aGVuIHRoZSBpbnB1dCBpcyBjaGVja2VkIHwgYHt9YAogICAgYC0tcGFwZXItdG9nZ2xlLWJ1dHRvbi1sYWJlbC1jb2xvcmAgfCBMYWJlbCBjb2xvciB8IGAtLXByaW1hcnktdGV4dC1jb2xvcmAKICAgIGAtLXBhcGVyLXRvZ2dsZS1idXR0b24tbGFiZWwtc3BhY2luZ2AgfCBTcGFjaW5nIGJldHdlZW4gdGhlIGxhYmVsIGFuZCB0aGUgYnV0dG9uIHwgYDhweGAKCiAgICBUaGlzIGVsZW1lbnQgYXBwbGllcyB0aGUgbWl4aW4gYC0tcGFwZXItZm9udC1jb21tb24tYmFzZWAgYnV0IGRvZXMgbm90IGltcG9ydCBgcGFwZXItc3R5bGVzL3R5cG9ncmFwaHkuaHRtbGAuCiAgICBJbiBvcmRlciB0byBhcHBseSB0aGUgYFJvYm90b2AgZm9udCB0byB0aGlzIGVsZW1lbnQsIG1ha2Ugc3VyZSB5b3UndmUgaW1wb3J0ZWQgYHBhcGVyLXN0eWxlcy90eXBvZ3JhcGh5Lmh0bWxgLgoKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItdG9nZ2xlLWJ1dHRvbgogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogdGVtcGxhdGUkaSwKCiAgICAgIGlzOiAncGFwZXItdG9nZ2xlLWJ1dHRvbicsCgogICAgICBiZWhhdmlvcnM6IFtQYXBlckNoZWNrZWRFbGVtZW50QmVoYXZpb3JdLAoKICAgICAgLyoqIEBwcml2YXRlICovCiAgICAgIGhvc3RBdHRyaWJ1dGVzOiB7cm9sZTogJ2J1dHRvbicsICdhcmlhLXByZXNzZWQnOiAnZmFsc2UnLCB0YWJpbmRleDogMH0sCgogICAgICBwcm9wZXJ0aWVzOiB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIEZpcmVkIHdoZW4gdGhlIGNoZWNrZWQgc3RhdGUgY2hhbmdlcyBkdWUgdG8gdXNlciBpbnRlcmFjdGlvbi4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBAZXZlbnQgY2hhbmdlCiAgICAgICAgICAgKi8KICAgICAgICAgIC8qKgogICAgICAgICAgICogRmlyZWQgd2hlbiB0aGUgY2hlY2tlZCBzdGF0ZSBjaGFuZ2VzLgogICAgICAgICAgICoKICAgICAgICAgICAqIEBldmVudCBpcm9uLWNoYW5nZQogICAgICAgICAgICovCiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHt0cmFjazogJ19vbnRyYWNrJ30sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgYWZ0ZXJOZXh0UmVuZGVyKHRoaXMsIGZ1bmN0aW9uKCkgewogICAgICAgICAgc2V0VG91Y2hBY3Rpb24odGhpcywgJ3Bhbi15Jyk7CiAgICAgICAgfSk7CiAgICAgIH0sCgogICAgICBfb250cmFjazogZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgdHJhY2sgPSBldmVudC5kZXRhaWw7CiAgICAgICAgaWYgKHRyYWNrLnN0YXRlID09PSAnc3RhcnQnKSB7CiAgICAgICAgICB0aGlzLl90cmFja1N0YXJ0KHRyYWNrKTsKICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLnN0YXRlID09PSAndHJhY2snKSB7CiAgICAgICAgICB0aGlzLl90cmFja01vdmUodHJhY2spOwogICAgICAgIH0gZWxzZSBpZiAodHJhY2suc3RhdGUgPT09ICdlbmQnKSB7CiAgICAgICAgICB0aGlzLl90cmFja0VuZCh0cmFjayk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgX3RyYWNrU3RhcnQ6IGZ1bmN0aW9uKHRyYWNrKSB7CiAgICAgICAgdGhpcy5fd2lkdGggPSB0aGlzLiQudG9nZ2xlQmFyLm9mZnNldFdpZHRoIC8gMjsKICAgICAgICAvKgogICAgICAgICAqIGtlZXAgYW4gdHJhY2stb25seSBjaGVjayBzdGF0ZSB0byBrZWVwIHRoZSBkcmFnZ2luZyBiZWhhdmlvciBzbW9vdGgKICAgICAgICAgKiB3aGlsZSB0b2dnbGluZyBhY3RpdmF0aW9ucwogICAgICAgICAqLwogICAgICAgIHRoaXMuX3RyYWNrQ2hlY2tlZCA9IHRoaXMuY2hlY2tlZDsKICAgICAgICB0aGlzLiQudG9nZ2xlQnV0dG9uLmNsYXNzTGlzdC5hZGQoJ2RyYWdnaW5nJyk7CiAgICAgIH0sCgogICAgICBfdHJhY2tNb3ZlOiBmdW5jdGlvbih0cmFjaykgewogICAgICAgIHZhciBkeCA9IHRyYWNrLmR4OwogICAgICAgIHRoaXMuX3ggPSBNYXRoLm1pbigKICAgICAgICAgICAgdGhpcy5fd2lkdGgsIE1hdGgubWF4KDAsIHRoaXMuX3RyYWNrQ2hlY2tlZCA/IHRoaXMuX3dpZHRoICsgZHggOiBkeCkpOwogICAgICAgIHRoaXMudHJhbnNsYXRlM2QodGhpcy5feCArICdweCcsIDAsIDAsIHRoaXMuJC50b2dnbGVCdXR0b24pOwogICAgICAgIHRoaXMuX3VzZXJBY3RpdmF0ZSh0aGlzLl94ID4gKHRoaXMuX3dpZHRoIC8gMikpOwogICAgICB9LAoKICAgICAgX3RyYWNrRW5kOiBmdW5jdGlvbih0cmFjaykgewogICAgICAgIHRoaXMuJC50b2dnbGVCdXR0b24uY2xhc3NMaXN0LnJlbW92ZSgnZHJhZ2dpbmcnKTsKICAgICAgICB0aGlzLnRyYW5zZm9ybSgnJywgdGhpcy4kLnRvZ2dsZUJ1dHRvbik7CiAgICAgIH0sCgogICAgICAvLyBjdXN0b21pemUgdGhlIGVsZW1lbnQncyByaXBwbGUKICAgICAgX2NyZWF0ZVJpcHBsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcmlwcGxlQ29udGFpbmVyID0gdGhpcy4kLnRvZ2dsZUJ1dHRvbjsKICAgICAgICB2YXIgcmlwcGxlID0gUGFwZXJSaXBwbGVCZWhhdmlvci5fY3JlYXRlUmlwcGxlKCk7CiAgICAgICAgcmlwcGxlLmlkID0gJ2luayc7CiAgICAgICAgcmlwcGxlLnNldEF0dHJpYnV0ZSgncmVjZW50ZXJzJywgJycpOwogICAgICAgIHJpcHBsZS5jbGFzc0xpc3QuYWRkKCdjaXJjbGUnLCAndG9nZ2xlLWluaycpOwogICAgICAgIHJldHVybiByaXBwbGU7CiAgICAgIH0KCiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTUgVGhlIFBvbHltZXIgUHJvamVjdCBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgVGhpcyBjb2RlIG1heSBvbmx5IGJlIHVzZWQgdW5kZXIgdGhlIEJTRCBzdHlsZSBsaWNlbnNlIGZvdW5kIGF0CiAgICBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQgVGhlIGNvbXBsZXRlIHNldCBvZiBhdXRob3JzIG1heSBiZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgY29udHJpYnV0b3JzIG1heSBiZQogICAgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQgQ29kZSBkaXN0cmlidXRlZCBieSBHb29nbGUgYXMKICAgIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvIHN1YmplY3QgdG8gYW4gYWRkaXRpb25hbCBJUCByaWdodHMgZ3JhbnQKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KCiAgICAvKioKICAgICoqVGhpcyBlbGVtZW50IGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YKICAgIFthcHAtbGF5b3V0XShodHRwczovL2dpdGh1Yi5jb20vUG9seW1lckVsZW1lbnRzL2FwcC1sYXlvdXQpLioqCgogICAgTWF0ZXJpYWwgZGVzaWduOgogICAgW1Rvb2xiYXJzXShodHRwczovL3d3dy5nb29nbGUuY29tL2Rlc2lnbi9zcGVjL2NvbXBvbmVudHMvdG9vbGJhcnMuaHRtbCkKCiAgICBgcGFwZXItdG9vbGJhcmAgaXMgYSBob3Jpem9udGFsIGJhciBjb250YWluaW5nIGl0ZW1zIHRoYXQgY2FuIGJlIHVzZWQgZm9yCiAgICBsYWJlbCwgbmF2aWdhdGlvbiwgc2VhcmNoIGFuZCBhY3Rpb25zLiAgVGhlIGl0ZW1zIHBsYWNlZCBpbnNpZGUgdGhlCiAgICBgcGFwZXItdG9vbGJhcmAgYXJlIHByb2plY3RlZCBpbnRvIGEgYGNsYXNzPSJob3Jpem9udGFsIGNlbnRlciBsYXlvdXQiYAogICAgY29udGFpbmVyIGluc2lkZSBvZiBgcGFwZXItdG9vbGJhcmAncyBTaGFkb3cgRE9NLiAgWW91IGNhbiB1c2UgZmxleCBhdHRyaWJ1dGVzCiAgICB0byBjb250cm9sIHRoZSBpdGVtcycgc2l6aW5nLgoKICAgIEV4YW1wbGU6CgogICAgYGBgaHRtbAogICAgPHBhcGVyLXRvb2xiYXI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzbG90PSJ0b3AiIGljb249Im1lbnUiCiAgICBvbi10YXA9Im1lbnVBY3Rpb24iPjwvcGFwZXItaWNvbi1idXR0b24+IDxkaXYgc2xvdD0idG9wIgogICAgY2xhc3M9InRpdGxlIj5UaXRsZTwvZGl2PiA8cGFwZXItaWNvbi1idXR0b24gc2xvdD0idG9wIiBpY29uPSJtb3JlLXZlcnQiCiAgICBvbi10YXA9Im1vcmVBY3Rpb24iPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICBgYGAKCiAgICBgcGFwZXItdG9vbGJhcmAgaGFzIGEgc3RhbmRhcmQgaGVpZ2h0LCBidXQgY2FuIG1hZGUgYmUgdGFsbGVyIGJ5IHNldHRpbmcgYHRhbGxgCiAgICBjbGFzcyBvbiB0aGUgYHBhcGVyLXRvb2xiYXJgLiBUaGlzIHdpbGwgbWFrZSB0aGUgdG9vbGJhciAzeCB0aGUgbm9ybWFsIGhlaWdodC4KCiAgICBgYGBodG1sCiAgICA8cGFwZXItdG9vbGJhciBjbGFzcz0idGFsbCI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbiBzbG90PSJ0b3AiIGljb249Im1lbnUiPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICBgYGAKCiAgICBBcHBseSBgbWVkaXVtLXRhbGxgIGNsYXNzIHRvIG1ha2UgdGhlIHRvb2xiYXIgbWVkaXVtIHRhbGwuICBUaGlzIHdpbGwgbWFrZSB0aGUKICAgIHRvb2xiYXIgMnggdGhlIG5vcm1hbCBoZWlnaHQuCgogICAgYGBgaHRtbAogICAgPHBhcGVyLXRvb2xiYXIgY2xhc3M9Im1lZGl1bS10YWxsIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uIHNsb3Q9InRvcCIgaWNvbj0ibWVudSI+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgIDwvcGFwZXItdG9vbGJhcj4KICAgIGBgYAoKICAgIFdoZW4gYHRhbGxgLCBpdGVtcyBjYW4gcGluIHRvIGVpdGhlciB0aGUgdG9wIChkZWZhdWx0KSwgbWlkZGxlIG9yIGJvdHRvbS4gVXNlCiAgICBgbWlkZGxlYCBzbG90IGZvciBtaWRkbGUgY29udGVudCBhbmQgYGJvdHRvbWAgc2xvdCBmb3IgYm90dG9tIGNvbnRlbnQuCgogICAgYGBgaHRtbAogICAgPHBhcGVyLXRvb2xiYXIgY2xhc3M9InRhbGwiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24gc2xvdD0idG9wIiBpY29uPSJtZW51Ij48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8ZGl2IHNsb3Q9Im1pZGRsZSIgY2xhc3M9InRpdGxlIj5NaWRkbGUgVGl0bGU8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJib3R0b20iIGNsYXNzPSJ0aXRsZSI+Qm90dG9tIFRpdGxlPC9kaXY+CiAgICA8L3BhcGVyLXRvb2xiYXI+CiAgICBgYGAKCiAgICBGb3IgYG1lZGl1bS10YWxsYCB0b29sYmFyLCB0aGUgbWlkZGxlIGFuZCBib3R0b20gY29udGVudHMgb3ZlcmxhcCBhbmQgYXJlCiAgICBwaW5uZWQgdG8gdGhlIGJvdHRvbS4gQnV0IGBtaWRkbGVKdXN0aWZ5YCBhbmQgYGJvdHRvbUp1c3RpZnlgIGF0dHJpYnV0ZXMgYXJlCiAgICBzdGlsbCBob25vcmVkIHNlcGFyYXRlbHkuCgogICAgVG8gbWFrZSBhbiBlbGVtZW50IGNvbXBsZXRlbHkgZml0IGF0IHRoZSBib3R0b20gb2YgdGhlIHRvb2xiYXIsIHVzZSBgZml0YCBhbG9uZwogICAgd2l0aCBgYm90dG9tYC4KCiAgICBgYGBodG1sCiAgICA8cGFwZXItdG9vbGJhciBjbGFzcz0idGFsbCI+CiAgICAgIDxkaXYgaWQ9InByb2dyZXNzQmFyIiBzbG90PSJib3R0b20iIGNsYXNzPSJmaXQiPjwvZGl2PgogICAgPC9wYXBlci10b29sYmFyPgogICAgYGBgCgogICAgV2hlbiBpbnNpZGUgYSBgcGFwZXItaGVhZGVyLXBhbmVsYCBlbGVtZW50IHdpdGggYG1vZGU9IndhdGVyZmFsbC10YWxsImAsCiAgICB0aGUgY2xhc3MgYC5hbmltYXRlYCBpcyB0b2dnbGVkIHRvIGFuaW1hdGUgdGhlIGhlaWdodCBjaGFuZ2UgaW4gdGhlIHRvb2xiYXIuCgogICAgIyMjIFN0eWxpbmcKCiAgICBUaGUgZm9sbG93aW5nIGN1c3RvbSBwcm9wZXJ0aWVzIGFuZCBtaXhpbnMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKCiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci10b29sYmFyLXRpdGxlYCAgICAgIHwgTWl4aW4gYXBwbGllZCB0byB0aGUgdGl0bGUgb2YgdGhlIHRvb2xiYXIgfCBge31gCiAgICBgLS1wYXBlci10b29sYmFyLWJhY2tncm91bmRgIHwgVG9vbGJhciBiYWNrZ3JvdW5kIGNvbG9yICAgICB8IGAtLXByaW1hcnktY29sb3JgCiAgICBgLS1wYXBlci10b29sYmFyLWNvbG9yYCAgICAgIHwgVG9vbGJhciBmb3JlZ3JvdW5kIGNvbG9yICAgICB8IGAtLWRhcmstdGhlbWUtdGV4dC1jb2xvcmAKICAgIGAtLXBhcGVyLXRvb2xiYXItaGVpZ2h0YCAgICAgfCBDdXN0b20gaGVpZ2h0IGZvciB0b29sYmFyICAgIHwgYDY0cHhgCiAgICBgLS1wYXBlci10b29sYmFyLXNtLWhlaWdodGAgIHwgQ3VzdG9tIGhlaWdodCBmb3Igc21hbGwgc2NyZWVuIHRvb2xiYXIgfCBgNTZweGAKICAgIGAtLXBhcGVyLXRvb2xiYXJgICAgICAgICAgICAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSB0b29sYmFyIHwgYHt9YAogICAgYC0tcGFwZXItdG9vbGJhci1jb250ZW50YCAgICB8IE1peGluIGFwcGxpZWQgdG8gdGhlIGNvbnRlbnQgc2VjdGlvbiBvZiB0aGUgdG9vbGJhciB8IGB7fWAKICAgIGAtLXBhcGVyLXRvb2xiYXItbWVkaXVtYCAgICAgfCBNaXhpbiBhcHBsaWVkIHRvIG1lZGl1bSBoZWlnaHQgdG9vbGJhciB8IGB7fWAKICAgIGAtLXBhcGVyLXRvb2xiYXItdGFsbGAgICAgICAgfCBNaXhpbiBhcHBsaWVkIHRvIHRhbGwgaGVpZ2h0IHRvb2xiYXIgfCBge31gCiAgICBgLS1wYXBlci10b29sYmFyLXRyYW5zaXRpb25gIHwgVHJhbnNpdGlvbiBhcHBsaWVkIHRvIHRoZSBgLmFuaW1hdGVgIGNsYXNzIHwgYGhlaWdodCAwLjE4cyBlYXNlLWluYAoKICAgICMjIyBBY2Nlc3NpYmlsaXR5CgogICAgYDxwYXBlci10b29sYmFyPmAgaGFzIGByb2xlPSJ0b29sYmFyImAgYnkgZGVmYXVsdC4gQW55IGVsZW1lbnRzIHdpdGggdGhlIGNsYXNzCiAgICBgdGl0bGVgIHdpbGwgYmUgdXNlZCBhcyB0aGUgbGFiZWwgb2YgdGhlIHRvb2xiYXIgdmlhIGBhcmlhLWxhYmVsbGVkYnlgLgoKICAgICMjIyBCcmVha2luZyBjaGFuZ2UgaW4gMi4wCgogICAgKiBJbiBQb2x5bWVyIDEueCwgZGVmYXVsdCBjb250ZW50IHVzZWQgdG8gYmUgZGlzdHJpYnVpdGVkIGF1dG9tYXRpY2FsbHkgdG8gdGhlCiAgICB0b3AgdG9vbGJhci4gSW4gdjIsIHRoZSB5b3UgbXVzdCBzZXQgYHNsb3Q9InRvcCJgIG9uIHRoZSBkZWZhdWx0IGNvbnRlbnQgdG8KICAgIGRpc3RyaWJ1aXRlIHRoZSBjb250ZW50IHRvIHRoZSB0b3AgdG9vbGJhci4KCiAgICBAZGVtbyBkZW1vL2luZGV4Lmh0bWwKICAgICovCiAgICBQb2x5bWVyKHsKICAgICAgX3RlbXBsYXRlOiBodG1sYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0OiB2YXIoLS1wYXBlci10b29sYmFyLWhlaWdodCwgNjRweCk7CiAgICAgICAgLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0OiB2YXIoLS1wYXBlci10b29sYmFyLXNtLWhlaWdodCwgNTZweCk7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgLW1vei1ib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGhlaWdodDogdmFyKC0tY2FsY3VsYXRlZC1wYXBlci10b29sYmFyLWhlaWdodCk7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tcGFwZXItdG9vbGJhci1iYWNrZ3JvdW5kLCB2YXIoLS1wcmltYXJ5LWNvbG9yKSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2xiYXItY29sb3IsIHZhcigtLWRhcmstdGhlbWUtdGV4dC1jb2xvcikpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXI7CiAgICAgIH0KCiAgICAgIDpob3N0KC5hbmltYXRlKSB7CiAgICAgICAgdHJhbnNpdGlvbjogdmFyKC0tcGFwZXItdG9vbGJhci10cmFuc2l0aW9uLCBoZWlnaHQgMC4xOHMgZWFzZS1pbik7CiAgICAgIH0KCiAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgewogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KSAqIDIpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItbWVkaXVtOwogICAgICB9CgogICAgICA6aG9zdCgudGFsbCkgewogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItaGVpZ2h0KSAqIDMpOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItdGFsbDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgewogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1oZWlnaHQpOwogICAgICAgIHBhZGRpbmc6IDAgMTZweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtaG9yaXpvbnRhbDsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2xiYXItY29udGVudDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogVE9ETzogV2hlcmUgc2hvdWxkIG1lZGlhIHF1ZXJ5IGJyZWFrcG9pbnRzIGxpdmUgc28gdGhleSBjYW4gYmUgc2hhcmVkIGJldHdlZW4gZWxlbWVudHM/CiAgICAgICAqLwoKICAgICAgQG1lZGlhIChtYXgtd2lkdGg6IDYwMHB4KSB7CiAgICAgICAgOmhvc3QgewogICAgICAgICAgaGVpZ2h0OiB2YXIoLS1jYWxjdWxhdGVkLXBhcGVyLXRvb2xiYXItc20taGVpZ2h0KTsKICAgICAgICB9CgogICAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgewogICAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpICogMik7CiAgICAgICAgfQoKICAgICAgICA6aG9zdCgudGFsbCkgewogICAgICAgICAgaGVpZ2h0OiBjYWxjKHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpICogMyk7CiAgICAgICAgfQoKICAgICAgICAudG9vbGJhci10b29scyB7CiAgICAgICAgICBoZWlnaHQ6IHZhcigtLWNhbGN1bGF0ZWQtcGFwZXItdG9vbGJhci1zbS1oZWlnaHQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgI3RvcEJhciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICAvKiBtaWRkbGUgYmFyICovCiAgICAgICNtaWRkbGVCYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgOmhvc3QoLnRhbGwpICNtaWRkbGVCYXIsCiAgICAgIDpob3N0KC5tZWRpdW0tdGFsbCkgI21pZGRsZUJhciB7CiAgICAgICAgLXdlYmtpdC10cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMTAwJSk7CiAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDEwMCUpOwogICAgICB9CgogICAgICAvKiBib3R0b20gYmFyICovCiAgICAgICNib3R0b21CYXIgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogMDsKICAgICAgICBib3R0b206IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgfQoKICAgICAgLyoKICAgICAgICogbWFrZSBlbGVtZW50cyAoZS5nLiBidXR0b25zKSByZXNwb25kIHRvIG1vdXNlL3RvdWNoIGV2ZW50cwogICAgICAgKgogICAgICAgKiBcYC50b29sYmFyLXRvb2xzXGAgZGlzYWJsZXMgdG91Y2ggZXZlbnRzIHNvIG11bHRpcGxlIHRvb2xiYXJzIGNhbiBzdGFjayBhbmQgbm90CiAgICAgICAqIGFic29yYiBldmVudHMuIEFsbCBjaGlsZHJlbiBtdXN0IGhhdmUgcG9pbnRlciBldmVudHMgcmUtZW5hYmxlZCB0byB3b3JrIGFzCiAgICAgICAqIGV4cGVjdGVkLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoKjpub3QoW2Rpc2FibGVkXSkpIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItZm9udC1jb21tb24tYmFzZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgICAgZm9udC1zaXplOiAyMHB4OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgbGluZS1oZWlnaHQ6IDE7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXg7CiAgICAgIH0KCiAgICAgIC50b29sYmFyLXRvb2xzID4gOjpzbG90dGVkKC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiA1NnB4OwogICAgICB9CgogICAgICAudG9vbGJhci10b29scyA+IDo6c2xvdHRlZChwYXBlci1pY29uLWJ1dHRvbiArIC50aXRsZSkgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVGhlIC0tcGFwZXItdG9vbGJhci10aXRsZSBtaXhpbiBpcyBhcHBsaWVkIGhlcmUgaW5zdGVhZCBvZiBhYm92ZSB0bwogICAgICAgKiBmaXggdGhlIGlzc3VlIHdpdGggbWFyZ2luLWxlZnQgYmVpbmcgaWdub3JlZCBkdWUgdG8gY3NzIG9yZGVyaW5nLgogICAgICAgKi8KICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLnRpdGxlKSB7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbGJhci10aXRsZTsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQocGFwZXItaWNvbi1idXR0b25baWNvbj1tZW51XSkgewogICAgICAgIG1hcmdpbi1yaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLnRvb2xiYXItdG9vbHMgPiA6OnNsb3R0ZWQoLmZpdCkgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IGF1dG87CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICAvKiBUT0RPKG5vbXMpOiBVbnRpbCB3ZSBoYXZlIGEgYmV0dGVyIHNvbHV0aW9uIGZvciBjbGFzc2VzIHRoYXQgZG9uJ3QgdXNlCiAgICAgICAqIC9kZWVwLyBjcmVhdGUgb3VyIG93bi4KICAgICAgICovCiAgICAgIC5zdGFydC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1zdGFydC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5jZW50ZXItanVzdGlmaWVkIHsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtY2VudGVyLWp1c3RpZmllZDsKICAgICAgfQoKICAgICAgLmVuZC1qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1lbmQtanVzdGlmaWVkOwogICAgICB9CgogICAgICAuYXJvdW5kLWp1c3RpZmllZCB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWFyb3VuZC1qdXN0aWZpZWQ7CiAgICAgIH0KCiAgICAgIC5qdXN0aWZpZWQgewogICAgICAgIEBhcHBseSAtLWxheW91dC1qdXN0aWZpZWQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPGRpdiBpZD0idG9wQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoanVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9InRvcCI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0ibWlkZGxlQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMobWlkZGxlSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9Im1pZGRsZSI+PC9zbG90PgogICAgPC9kaXY+CgogICAgPGRpdiBpZD0iYm90dG9tQmFyIiBjbGFzc1wkPSJ0b29sYmFyLXRvb2xzIFtbX2NvbXB1dGVCYXJFeHRyYUNsYXNzZXMoYm90dG9tSnVzdGlmeSldXSI+CiAgICAgIDxzbG90IG5hbWU9ImJvdHRvbSI+PC9zbG90PgogICAgPC9kaXY+CmAsCgogICAgICBpczogJ3BhcGVyLXRvb2xiYXInLAogICAgICBob3N0QXR0cmlidXRlczogeydyb2xlJzogJ3Rvb2xiYXInfSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBDb250cm9scyBob3cgdGhlIGl0ZW1zIGFyZSBhbGlnbmVkIGhvcml6b250YWxseSB3aGVuIHRoZXkgYXJlIHBsYWNlZAogICAgICAgICAqIGF0IHRoZSBib3R0b20uCiAgICAgICAgICogT3B0aW9ucyBhcmUgYHN0YXJ0YCwgYGNlbnRlcmAsIGBlbmRgLCBganVzdGlmaWVkYCBhbmQgYGFyb3VuZGAuCiAgICAgICAgICovCiAgICAgICAgYm90dG9tSnVzdGlmeToge3R5cGU6IFN0cmluZywgdmFsdWU6ICcnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udHJvbHMgaG93IHRoZSBpdGVtcyBhcmUgYWxpZ25lZCBob3Jpem9udGFsbHkuCiAgICAgICAgICogT3B0aW9ucyBhcmUgYHN0YXJ0YCwgYGNlbnRlcmAsIGBlbmRgLCBganVzdGlmaWVkYCBhbmQgYGFyb3VuZGAuCiAgICAgICAgICovCiAgICAgICAganVzdGlmeToge3R5cGU6IFN0cmluZywgdmFsdWU6ICcnfSwKCiAgICAgICAgLyoqCiAgICAgICAgICogQ29udHJvbHMgaG93IHRoZSBpdGVtcyBhcmUgYWxpZ25lZCBob3Jpem9udGFsbHkgd2hlbiB0aGV5IGFyZSBwbGFjZWQKICAgICAgICAgKiBpbiB0aGUgbWlkZGxlLgogICAgICAgICAqIE9wdGlvbnMgYXJlIGBzdGFydGAsIGBjZW50ZXJgLCBgZW5kYCwgYGp1c3RpZmllZGAgYW5kIGBhcm91bmRgLgogICAgICAgICAqLwogICAgICAgIG1pZGRsZUp1c3RpZnk6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnJ30KCiAgICAgIH0sCgogICAgICByZWFkeTogZnVuY3Rpb24oKSB7CiAgICAgICAgY29uc29sZS53YXJuKHRoaXMuaXMsICdpcyBkZXByZWNhdGVkLiBQbGVhc2UgdXNlIGFwcC1sYXlvdXQgaW5zdGVhZCEnKTsKICAgICAgfSwKCiAgICAgIGF0dGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9vYnNlcnZlciA9IHRoaXMuX29ic2VydmUodGhpcyk7CiAgICAgICAgdGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKTsKICAgICAgfSwKCiAgICAgIGRldGFjaGVkOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fb2JzZXJ2ZXIpIHsKICAgICAgICAgIHRoaXMuX29ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfb2JzZXJ2ZTogZnVuY3Rpb24obm9kZSkgewogICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBNdXRhdGlvbk9ic2VydmVyKGZ1bmN0aW9uKCkgewogICAgICAgICAgdGhpcy5fdXBkYXRlQXJpYUxhYmVsbGVkQnkoKTsKICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICAgIG9ic2VydmVyLm9ic2VydmUobm9kZSwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pOwogICAgICAgIHJldHVybiBvYnNlcnZlcjsKICAgICAgfSwKCiAgICAgIF91cGRhdGVBcmlhTGFiZWxsZWRCeTogZnVuY3Rpb24oKSB7CiAgICAgICAgZmx1c2goKTsKICAgICAgICB2YXIgbGFiZWxsZWRCeSA9IFtdOwogICAgICAgIHZhciBjb250ZW50cyA9CiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGRvbSh0aGlzLnJvb3QpLnF1ZXJ5U2VsZWN0b3JBbGwoJ3Nsb3QnKSkKICAgICAgICAgICAgICAgIC5jb25jYXQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoCiAgICAgICAgICAgICAgICAgICAgZG9tKHRoaXMucm9vdCkucXVlcnlTZWxlY3RvckFsbCgnY29udGVudCcpKSk7CgogICAgICAgIGZvciAodmFyIGNvbnRlbnQsIGluZGV4ID0gMDsgY29udGVudCA9IGNvbnRlbnRzW2luZGV4XTsgaW5kZXgrKykgewogICAgICAgICAgdmFyIG5vZGVzID0gZG9tKGNvbnRlbnQpLmdldERpc3RyaWJ1dGVkTm9kZXMoKTsKICAgICAgICAgIGZvciAodmFyIG5vZGUsIGpuZGV4ID0gMDsgbm9kZSA9IG5vZGVzW2puZGV4XTsgam5kZXgrKykgewogICAgICAgICAgICBpZiAobm9kZS5jbGFzc0xpc3QgJiYgbm9kZS5jbGFzc0xpc3QuY29udGFpbnMoJ3RpdGxlJykpIHsKICAgICAgICAgICAgICBpZiAobm9kZS5pZCkgewogICAgICAgICAgICAgICAgbGFiZWxsZWRCeS5wdXNoKG5vZGUuaWQpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgaWQgPSAncGFwZXItdG9vbGJhci1sYWJlbC0nICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMTAwMDApOwogICAgICAgICAgICAgICAgbm9kZS5pZCA9IGlkOwogICAgICAgICAgICAgICAgbGFiZWxsZWRCeS5wdXNoKGlkKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGxhYmVsbGVkQnkubGVuZ3RoID4gMCkgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGFiZWxsZWRieScsIGxhYmVsbGVkQnkuam9pbignICcpKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfY29tcHV0ZUJhckV4dHJhQ2xhc3NlczogZnVuY3Rpb24oYmFySnVzdGlmeSkgewogICAgICAgIGlmICghYmFySnVzdGlmeSkKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICByZXR1cm4gYmFySnVzdGlmeSArIChiYXJKdXN0aWZ5ID09PSAnanVzdGlmaWVkJyA/ICcnIDogJy1qdXN0aWZpZWQnKTsKICAgICAgfQogICAgfSk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE1IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdAogICAgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0xJQ0VOU0UudHh0IFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQKICAgIGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9BVVRIT1JTLnR4dCBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUKICAgIGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9DT05UUklCVVRPUlMudHh0IENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzCiAgICBwYXJ0IG9mIHRoZSBwb2x5bWVyIHByb2plY3QgaXMgYWxzbyBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50CiAgICBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vUEFURU5UUy50eHQKICAgICovCgogICAgLyoqCiAgICBNYXRlcmlhbCBkZXNpZ246CiAgICBbVG9vbHRpcHNdKGh0dHBzOi8vd3d3Lmdvb2dsZS5jb20vZGVzaWduL3NwZWMvY29tcG9uZW50cy90b29sdGlwcy5odG1sKQogICAgYDxwYXBlci10b29sdGlwPmAgaXMgYSBsYWJlbCB0aGF0IGFwcGVhcnMgb24gaG92ZXIgYW5kIGZvY3VzIHdoZW4gdGhlIHVzZXIKICAgIGhvdmVycyBvdmVyIGFuIGVsZW1lbnQgd2l0aCB0aGUgY3Vyc29yIG9yIHdpdGggdGhlIGtleWJvYXJkLiBJdCB3aWxsIGJlIGNlbnRlcmVkCiAgICB0byBhbiBhbmNob3IgZWxlbWVudCBzcGVjaWZpZWQgaW4gdGhlIGBmb3JgIGF0dHJpYnV0ZSwgb3IsIGlmIHRoYXQgZG9lc24ndAogICAgZXhpc3QsIGNlbnRlcmVkIHRvIHRoZSBwYXJlbnQgbm9kZSBjb250YWluaW5nIGl0LgogICAgRXhhbXBsZToKICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jayI+CiAgICAgICAgICA8YnV0dG9uPkNsaWNrIG1lITwvYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXA+VG9vbHRpcCB0ZXh0PC9wYXBlci10b29sdGlwPgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXY+CiAgICAgICAgICA8YnV0dG9uIGlkPSJidG4iPkNsaWNrIG1lITwvYnV0dG9uPgogICAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJidG4iPlRvb2x0aXAgdGV4dDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L2Rpdj4KICAgIFRoZSB0b29sdGlwIGNhbiBiZSBwb3NpdGlvbmVkIG9uIHRoZSB0b3B8Ym90dG9tfGxlZnR8cmlnaHQgb2YgdGhlIGFuY2hvciB1c2luZwogICAgdGhlIGBwb3NpdGlvbmAgYXR0cmlidXRlLiBUaGUgZGVmYXVsdCBwb3NpdGlvbiBpcyBib3R0b20uCiAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJidG4iIHBvc2l0aW9uPSJsZWZ0Ij5Ub29sdGlwIHRleHQ8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgPHBhcGVyLXRvb2x0aXAgZm9yPSJidG4iIHBvc2l0aW9uPSJ0b3AiPlRvb2x0aXAgdGV4dDwvcGFwZXItdG9vbHRpcD4KCiAgICAjIyMgU3R5bGluZwogICAgVGhlIGZvbGxvd2luZyBjdXN0b20gcHJvcGVydGllcyBhbmQgbWl4aW5zIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CiAgICBDdXN0b20gcHJvcGVydHkgfCBEZXNjcmlwdGlvbiB8IERlZmF1bHQKICAgIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tCiAgICBgLS1wYXBlci10b29sdGlwLWJhY2tncm91bmRgIHwgVGhlIGJhY2tncm91bmQgY29sb3Igb2YgdGhlIHRvb2x0aXAgfCBgIzYxNjE2MWAKICAgIGAtLXBhcGVyLXRvb2x0aXAtb3BhY2l0eWAgfCBUaGUgb3BhY2l0eSBvZiB0aGUgdG9vbHRpcCB8IGAwLjlgCiAgICBgLS1wYXBlci10b29sdGlwLXRleHQtY29sb3JgIHwgVGhlIHRleHQgY29sb3Igb2YgdGhlIHRvb2x0aXAgfCBgd2hpdGVgCiAgICBgLS1wYXBlci10b29sdGlwYCB8IE1peGluIGFwcGxpZWQgdG8gdGhlIHRvb2x0aXAgfCBge31gCiAgICBgLS1wYXBlci10b29sdGlwLWRlbGF5LWluYCB8IERlbGF5IGJlZm9yZSB0b29sdGlwIHN0YXJ0cyB0byBmYWRlIGluIHwgYDUwMGAKICAgIGAtLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0YCB8IERlbGF5IGJlZm9yZSB0b29sdGlwIHN0YXJ0cyB0byBmYWRlIG91dCB8IGAwYAogICAgYC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1pbmAgfCBUaW1pbmcgZm9yIGFuaW1hdGlvbiB3aGVuIHNob3dpbmcgdG9vbHRpcCB8IGA1MDBgCiAgICBgLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dGAgfCBUaW1pbmcgZm9yIGFuaW1hdGlvbiB3aGVuIGhpZGluZyB0b29sdGlwIHwgYDBgCiAgICBgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbmAgfCBNaXhpbiBhcHBsaWVkIHRvIHRoZSB0b29sdGlwIGFuaW1hdGlvbiB8IGB7fWAKICAgIEBncm91cCBQYXBlciBFbGVtZW50cwogICAgQGVsZW1lbnQgcGFwZXItdG9vbHRpcAogICAgQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAqLwogICAgUG9seW1lcih7CiAgICAgIF90ZW1wbGF0ZTogaHRtbGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIHotaW5kZXg6IDEwMDI7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbXMtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIH0KCiAgICAgICN0b29sdGlwIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICAgIEBhcHBseSAtLXBhcGVyLWZvbnQtY29tbW9uLWJhc2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtYmFja2dyb3VuZCwgIzYxNjE2MSk7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLXRvb2x0aXAtdGV4dC1jb2xvciwgd2hpdGUpOwogICAgICAgIHBhZGRpbmc6IDhweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAycHg7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcDsKICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZVNjYWxlVXAgewogICAgICAgIDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMC4wKTsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2NhbGVEb3duIHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDEuMCk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwLjApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVJbk9wYWNpdHkgewogICAgICAgIDAlIHsKICAgICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgQGtleWZyYW1lcyBrZXlGcmFtZUZhZGVPdXRPcGFjaXR5IHsKICAgICAgICAwJSB7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIEBrZXlmcmFtZXMga2V5RnJhbWVTbGlkZURvd25JbiB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgICAgMTAlIHsKICAgICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICB9CiAgICAgICAgMTAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIGtleUZyYW1lU2xpZGVEb3duT3V0IHsKICAgICAgICAwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHRyYW5zbGF0ZVkoMCk7CiAgICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgfQogICAgICAgIDEwJSB7CiAgICAgICAgICBvcGFjaXR5OiAwLjI7CiAgICAgICAgfQogICAgICAgIDEwMCUgewogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKC0yMDAwcHgpOwogICAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5mYWRlLWluLWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBhbmltYXRpb24tZGVsYXk6IHZhcigtLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVGYWRlSW5PcGFjaXR5OwogICAgICAgIGFuaW1hdGlvbi1pdGVyYXRpb24tY291bnQ6IDE7CiAgICAgICAgYW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjogZWFzZS1pbjsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24taW4sIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLmZhZGUtb3V0LWFuaW1hdGlvbiB7CiAgICAgICAgb3BhY2l0eTogdmFyKC0tcGFwZXItdG9vbHRpcC1vcGFjaXR5LCAwLjkpOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lRmFkZU91dE9wYWNpdHk7CiAgICAgICAgYW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDogMTsKICAgICAgICBhbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOiBlYXNlLWluOwogICAgICAgIGFuaW1hdGlvbi1kdXJhdGlvbjogdmFyKC0tcGFwZXItdG9vbHRpcC1kdXJhdGlvbi1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tZmlsbC1tb2RlOiBmb3J3YXJkczsKICAgICAgICBAYXBwbHkgLS1wYXBlci10b29sdGlwLWFuaW1hdGlvbjsKICAgICAgfQoKICAgICAgLnNjYWxlLXVwLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLW5hbWU6IGtleUZyYW1lU2NhbGVVcDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLWluLCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zY2FsZS1kb3duLWFuaW1hdGlvbiB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNjYWxlRG93bjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGVhc2UtaW47CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuc2xpZGUtZG93bi1hbmltYXRpb24gewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgtMjAwMHB4KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIGFuaW1hdGlvbi1kZWxheTogdmFyKC0tcGFwZXItdG9vbHRpcC1kZWxheS1vdXQsIDUwMG1zKTsKICAgICAgICBhbmltYXRpb24tbmFtZToga2V5RnJhbWVTbGlkZURvd25JbjsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjAsIDAuMCwgMC4yLCAxKTsKICAgICAgICBhbmltYXRpb24tZHVyYXRpb246IHZhcigtLXBhcGVyLXRvb2x0aXAtZHVyYXRpb24tb3V0LCA1MDBtcyk7CiAgICAgICAgYW5pbWF0aW9uLWZpbGwtbW9kZTogZm9yd2FyZHM7CiAgICAgICAgQGFwcGx5IC0tcGFwZXItdG9vbHRpcC1hbmltYXRpb247CiAgICAgIH0KCiAgICAgIC5zbGlkZS1kb3duLWFuaW1hdGlvbi1vdXQgewogICAgICAgIHRyYW5zZm9ybTogdHJhbnNsYXRlWSgwKTsKICAgICAgICBvcGFjaXR5OiB2YXIoLS1wYXBlci10b29sdGlwLW9wYWNpdHksIDAuOSk7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiB2YXIoLS1wYXBlci10b29sdGlwLWRlbGF5LW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1uYW1lOiBrZXlGcmFtZVNsaWRlRG93bk91dDsKICAgICAgICBhbmltYXRpb24taXRlcmF0aW9uLWNvdW50OiAxOwogICAgICAgIGFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246IGN1YmljLWJlemllcigwLjQsIDAuMCwgMSwgMSk7CiAgICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiB2YXIoLS1wYXBlci10b29sdGlwLWR1cmF0aW9uLW91dCwgNTAwbXMpOwogICAgICAgIGFuaW1hdGlvbi1maWxsLW1vZGU6IGZvcndhcmRzOwogICAgICAgIEBhcHBseSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uOwogICAgICB9CgogICAgICAuY2FuY2VsLWFuaW1hdGlvbiB7CiAgICAgICAgYW5pbWF0aW9uLWRlbGF5OiAtMzBzICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoYW5rcyBJRSAxMC4gKi8KCiAgICAgIC5oaWRkZW4gewogICAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJ0b29sdGlwIiBjbGFzcz0iaGlkZGVuIj4KICAgICAgPHNsb3Q+PC9zbG90PgogICAgPC9kaXY+CmAsCgogICAgICBpczogJ3BhcGVyLXRvb2x0aXAnLAogICAgICBob3N0QXR0cmlidXRlczoge3JvbGU6ICd0b29sdGlwJywgdGFiaW5kZXg6IC0xfSwKCiAgICAgIHByb3BlcnRpZXM6IHsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgaWQgb2YgdGhlIGVsZW1lbnQgdGhhdCB0aGUgdG9vbHRpcCBpcyBhbmNob3JlZCB0by4gVGhpcyBlbGVtZW50CiAgICAgICAgICogbXVzdCBiZSBhIHNpYmxpbmcgb2YgdGhlIHRvb2x0aXAuIElmIHRoaXMgcHJvcGVydHkgaXMgbm90IHNldCwKICAgICAgICAgKiB0aGVuIHRoZSB0b29sdGlwIHdpbGwgYmUgY2VudGVyZWQgdG8gdGhlIHBhcmVudCBub2RlIGNvbnRhaW5pbmcgaXQuCiAgICAgICAgICovCiAgICAgICAgZm9yOiB7dHlwZTogU3RyaW5nLCBvYnNlcnZlcjogJ19maW5kVGFyZ2V0J30sCiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRoaXMgdG8gdHJ1ZSBpZiB5b3Ugd2FudCB0byBtYW51YWxseSBjb250cm9sIHdoZW4gdGhlIHRvb2x0aXAKICAgICAgICAgKiBpcyBzaG93biBvciBoaWRkZW4uCiAgICAgICAgICovCiAgICAgICAgbWFudWFsTW9kZToge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZSwgb2JzZXJ2ZXI6ICdfbWFudWFsTW9kZUNoYW5nZWQnfSwKICAgICAgICAvKioKICAgICAgICAgKiBQb3NpdGlvbnMgdGhlIHRvb2x0aXAgdG8gdGhlIHRvcCwgcmlnaHQsIGJvdHRvbSwgbGVmdCBvZiBpdHMgY29udGVudC4KICAgICAgICAgKi8KICAgICAgICBwb3NpdGlvbjoge3R5cGU6IFN0cmluZywgdmFsdWU6ICdib3R0b20nfSwKICAgICAgICAvKioKICAgICAgICAgKiBJZiB0cnVlLCBubyBwYXJ0cyBvZiB0aGUgdG9vbHRpcCB3aWxsIGV2ZXIgYmUgc2hvd24gb2Zmc2NyZWVuLgogICAgICAgICAqLwogICAgICAgIGZpdFRvVmlzaWJsZUJvdW5kczoge3R5cGU6IEJvb2xlYW4sIHZhbHVlOiBmYWxzZX0sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHNwYWNpbmcgYmV0d2VlbiB0aGUgdG9wIG9mIHRoZSB0b29sdGlwIGFuZCB0aGUgZWxlbWVudCBpdCBpcwogICAgICAgICAqIGFuY2hvcmVkIHRvLgogICAgICAgICAqLwogICAgICAgIG9mZnNldDoge3R5cGU6IE51bWJlciwgdmFsdWU6IDE0fSwKICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHByb3BlcnR5IGlzIGRlcHJlY2F0ZWQsIGJ1dCBsZWZ0IG92ZXIgc28gdGhhdCBpdCBkb2Vzbid0CiAgICAgICAgICogYnJlYWsgZXhpdGluZyBjb2RlLiBQbGVhc2UgdXNlIGBvZmZzZXRgIGluc3RlYWQuIElmIGJvdGggYG9mZnNldGAgYW5kCiAgICAgICAgICogYG1hcmdpblRvcGAgYXJlIHByb3ZpZGVkLCBgbWFyZ2luVG9wYCB3aWxsIGJlIGlnbm9yZWQuCiAgICAgICAgICogQGRlcHJlY2F0ZWQgc2luY2UgdmVyc2lvbiAxLjAuMwogICAgICAgICAqLwogICAgICAgIG1hcmdpblRvcDoge3R5cGU6IE51bWJlciwgdmFsdWU6IDE0fSwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGVsYXkgdGhhdCB3aWxsIGJlIGFwcGxpZWQgYmVmb3JlIHRoZSBgZW50cnlgIGFuaW1hdGlvbiBpcwogICAgICAgICAqIHBsYXllZCB3aGVuIHNob3dpbmcgdGhlIHRvb2x0aXAuCiAgICAgICAgICovCiAgICAgICAgYW5pbWF0aW9uRGVsYXk6IHt0eXBlOiBOdW1iZXIsIHZhbHVlOiA1MDAsIG9ic2VydmVyOiAnX2RlbGF5Q2hhbmdlJ30sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgYmUgcGxheWVkIG9uIGVudHJ5LiAgVGhpcyByZXBsYWNlcyB0aGUKICAgICAgICAgKiBkZXByZWNhdGVkIGFuaW1hdGlvbkNvbmZpZy4gIEVudHJpZXMgaGVyZSB3aWxsIG92ZXJyaWRlIHRoZQogICAgICAgICAqIGFuaW1hdGlvbkNvbmZpZyBzZXR0aW5ncy4gIFlvdSBjYW4gZW50ZXIgeW91ciBvd24gYW5pbWF0aW9uCiAgICAgICAgICogYnkgc2V0dGluZyBpdCB0byB0aGUgY3NzIGNsYXNzIG5hbWUuCiAgICAgICAgICovCiAgICAgICAgYW5pbWF0aW9uRW50cnk6IHt0eXBlOiBTdHJpbmcsIHZhbHVlOiAnJ30sCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGFuaW1hdGlvbiB0aGF0IHdpbGwgYmUgcGxheWVkIG9uIGV4aXQuICBUaGlzIHJlcGxhY2VzIHRoZQogICAgICAgICAqIGRlcHJlY2F0ZWQgYW5pbWF0aW9uQ29uZmlnLiAgRW50cmllcyBoZXJlIHdpbGwgb3ZlcnJpZGUgdGhlCiAgICAgICAgICogYW5pbWF0aW9uQ29uZmlnIHNldHRpbmdzLiAgWW91IGNhbiBlbnRlciB5b3VyIG93biBhbmltYXRpb24KICAgICAgICAgKiBieSBzZXR0aW5nIGl0IHRvIHRoZSBjc3MgY2xhc3MgbmFtZS4KICAgICAgICAgKi8KICAgICAgICBhbmltYXRpb25FeGl0OiB7dHlwZTogU3RyaW5nLCB2YWx1ZTogJyd9LAogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgZGVwcmVjYXRlZC4gIFVzZSAtLXBhcGVyLXRvb2x0aXAtYW5pbWF0aW9uIHRvIGNoYW5nZSB0aGUKICAgICAgICAgKiBhbmltYXRpb24uIFRoZSBlbnRyeSBhbmQgZXhpdCBhbmltYXRpb25zIHRoYXQgd2lsbCBiZSBwbGF5ZWQgd2hlbiBzaG93aW5nCiAgICAgICAgICogYW5kIGhpZGluZyB0aGUgdG9vbHRpcC4gSWYgeW91IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcywgeW91IG11c3QgZW5zdXJlCiAgICAgICAgICogdGhhdCB5b3VyIGFuaW1hdGlvbkNvbmZpZyBoYXMgdGhlIGV4YWN0IGZvcm1hdCBiZWxvdy4KICAgICAgICAgKiBAZGVwcmVjYXRlZCBzaW5jZSB2ZXJzaW9uCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZW50cnkgYW5kIGV4aXQgYW5pbWF0aW9ucyB0aGF0IHdpbGwgYmUgcGxheWVkIHdoZW4gc2hvd2luZyBhbmQKICAgICAgICAgKiBoaWRpbmcgdGhlIHRvb2x0aXAuIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoaXMsIHlvdSBtdXN0IGVuc3VyZQogICAgICAgICAqIHRoYXQgeW91ciBhbmltYXRpb25Db25maWcgaGFzIHRoZSBleGFjdCBmb3JtYXQgYmVsb3cuCiAgICAgICAgICovCiAgICAgICAgYW5pbWF0aW9uQ29uZmlnOiB7CiAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgJ2VudHJ5JzoKICAgICAgICAgICAgICAgICAgW3tuYW1lOiAnZmFkZS1pbi1hbmltYXRpb24nLCBub2RlOiB0aGlzLCB0aW1pbmc6IHtkZWxheTogMH19XSwKICAgICAgICAgICAgICAgICAgJ2V4aXQnOiBbe25hbWU6ICdmYWRlLW91dC1hbmltYXRpb24nLCBub2RlOiB0aGlzfV0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0sCiAgICAgICAgX3Nob3dpbmc6IHt0eXBlOiBCb29sZWFuLCB2YWx1ZTogZmFsc2V9CiAgICAgIH0sCgogICAgICBsaXN0ZW5lcnM6IHsKICAgICAgICAnd2Via2l0QW5pbWF0aW9uRW5kJzogJ19vbkFuaW1hdGlvbkVuZCcsCiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmV0dXJucyB0aGUgdGFyZ2V0IGVsZW1lbnQgdGhhdCB0aGlzIHRvb2x0aXAgaXMgYW5jaG9yZWQgdG8uIEl0IGlzCiAgICAgICAqIGVpdGhlciB0aGUgZWxlbWVudCBnaXZlbiBieSB0aGUgYGZvcmAgYXR0cmlidXRlLCBvciB0aGUgaW1tZWRpYXRlIHBhcmVudAogICAgICAgKiBvZiB0aGUgdG9vbHRpcC4KICAgICAgICoKICAgICAgICogQHR5cGUge05vZGV9CiAgICAgICAqLwogICAgICBnZXQgdGFyZ2V0KCkgewogICAgICAgIHZhciBwYXJlbnROb2RlID0gZG9tKHRoaXMpLnBhcmVudE5vZGU7CiAgICAgICAgLy8gSWYgdGhlIHBhcmVudE5vZGUgaXMgYSBkb2N1bWVudCBmcmFnbWVudCwgdGhlbiB3ZSBuZWVkIHRvIHVzZSB0aGUgaG9zdC4KICAgICAgICB2YXIgb3duZXJSb290ID0gZG9tKHRoaXMpLmdldE93bmVyUm9vdCgpOwogICAgICAgIHZhciB0YXJnZXQ7CiAgICAgICAgaWYgKHRoaXMuZm9yKSB7CiAgICAgICAgICB0YXJnZXQgPSBkb20ob3duZXJSb290KS5xdWVyeVNlbGVjdG9yKCcjJyArIHRoaXMuZm9yKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGFyZ2V0ID0gcGFyZW50Tm9kZS5ub2RlVHlwZSA9PSBOb2RlLkRPQ1VNRU5UX0ZSQUdNRU5UX05PREUgPwogICAgICAgICAgICAgIG93bmVyUm9vdC5ob3N0IDoKICAgICAgICAgICAgICBwYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZmluZFRhcmdldCgpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEByZXR1cm4ge3ZvaWR9CiAgICAgICAqLwogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLm1hbnVhbE1vZGUpCiAgICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXBsYWNlcyBOZW9uLUFuaW1hdGlvbiBwbGF5QW5pbWF0aW9uIC0ganVzdCBjYWxscyBzaG93IGFuZCBoaWRlLgogICAgICAgKiBAZGVwcmVjYXRlZCBVc2Ugc2hvdyBhbmQgaGlkZSBpbnN0ZWFkLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSBFaXRoZXIgYGVudHJ5YCBvciBgZXhpdGAKICAgICAgICovCiAgICAgIHBsYXlBbmltYXRpb246IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICBpZiAodHlwZSA9PT0gJ2VudHJ5JykgewogICAgICAgICAgdGhpcy5zaG93KCk7CiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnZXhpdCcpIHsKICAgICAgICAgIHRoaXMuaGlkZSgpOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBDYW5jZWxzIHRoZSBhbmltYXRpb24gYW5kIGVpdGhlciBmdWxseSBzaG93cyBvciBmdWxseSBoaWRlcyB0b29sdGlwCiAgICAgICAqLwogICAgICBjYW5jZWxBbmltYXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFNob3J0LWN1dCBhbmQgY2FuY2VsIGFsbCBhbmltYXRpb25zIGFuZCBoaWRlCiAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCgnY2FuY2VsLWFuaW1hdGlvbicpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNob3dzIHRoZSB0b29sdGlwIHByb2dyYW1hdGljYWxseQogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgc2hvdzogZnVuY3Rpb24oKSB7CiAgICAgICAgLy8gSWYgdGhlIHRvb2x0aXAgaXMgYWxyZWFkeSBzaG93aW5nLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCiAgICAgICAgaWYgKHRoaXMuX3Nob3dpbmcpCiAgICAgICAgICByZXR1cm47CgogICAgICAgIGlmIChkb20odGhpcykudGV4dENvbnRlbnQudHJpbSgpID09PSAnJykgewogICAgICAgICAgLy8gQ2hlY2sgaWYgZWZmZWN0aXZlIGNoaWxkcmVuIGFyZSBhbHNvIGVtcHR5CiAgICAgICAgICB2YXIgYWxsQ2hpbGRyZW5FbXB0eSA9IHRydWU7CiAgICAgICAgICB2YXIgZWZmZWN0aXZlQ2hpbGRyZW4gPSBkb20odGhpcykuZ2V0RWZmZWN0aXZlQ2hpbGROb2RlcygpOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlZmZlY3RpdmVDaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoZWZmZWN0aXZlQ2hpbGRyZW5baV0udGV4dENvbnRlbnQudHJpbSgpICE9PSAnJykgewogICAgICAgICAgICAgIGFsbENoaWxkcmVuRW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGFsbENoaWxkcmVuRW1wdHkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fc2hvd2luZyA9IHRydWU7CiAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgnaGlkZGVuJyk7CiAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgnY2FuY2VsLWFuaW1hdGlvbicpOwogICAgICAgIHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgnZXhpdCcpKTsKICAgICAgICB0aGlzLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgdGhpcy5fYW5pbWF0aW9uUGxheWluZyA9IHRydWU7CiAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LmFkZCh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCdlbnRyeScpKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBIaWRlcyB0aGUgdG9vbHRpcCBwcm9ncmFtYXRpY2FsbHkKICAgICAgICogQHJldHVybiB7dm9pZH0KICAgICAgICovCiAgICAgIGhpZGU6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIElmIHRoZSB0b29sdGlwIGlzIGFscmVhZHkgaGlkZGVuLCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uCiAgICAgICAgaWYgKCF0aGlzLl9zaG93aW5nKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGUgZW50cnkgYW5pbWF0aW9uIGlzIHN0aWxsIHBsYXlpbmcsIGRvbid0IHRyeSB0byBwbGF5IHRoZSBleGl0CiAgICAgICAgLy8gYW5pbWF0aW9uIHNpbmNlIHRoaXMgd2lsbCByZXNldCB0aGUgb3BhY2l0eSB0byAxLiBKdXN0IGVuZCB0aGUgYW5pbWF0aW9uLgogICAgICAgIGlmICh0aGlzLl9hbmltYXRpb25QbGF5aW5nKSB7CiAgICAgICAgICB0aGlzLl9zaG93aW5nID0gZmFsc2U7CiAgICAgICAgICB0aGlzLl9jYW5jZWxBbmltYXRpb24oKTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgLy8gUGxheSBFeGl0IEFuaW1hdGlvbgogICAgICAgICAgdGhpcy5fb25BbmltYXRpb25GaW5pc2goKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX3Nob3dpbmcgPSBmYWxzZTsKICAgICAgICB0aGlzLl9hbmltYXRpb25QbGF5aW5nID0gdHJ1ZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBAcmV0dXJuIHt2b2lkfQogICAgICAgKi8KICAgICAgdXBkYXRlUG9zaXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5fdGFyZ2V0IHx8ICF0aGlzLm9mZnNldFBhcmVudCkKICAgICAgICAgIHJldHVybjsKICAgICAgICB2YXIgb2Zmc2V0ID0gdGhpcy5vZmZzZXQ7CiAgICAgICAgLy8gSWYgYSBtYXJnaW5Ub3AgaGFzIGJlZW4gcHJvdmlkZWQgYnkgdGhlIHVzZXIgKHByZSAxLjAuMyksIHVzZSBpdC4KICAgICAgICBpZiAodGhpcy5tYXJnaW5Ub3AgIT0gMTQgJiYgdGhpcy5vZmZzZXQgPT0gMTQpCiAgICAgICAgICBvZmZzZXQgPSB0aGlzLm1hcmdpblRvcDsKICAgICAgICB2YXIgcGFyZW50UmVjdCA9IHRoaXMub2Zmc2V0UGFyZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciB0YXJnZXRSZWN0ID0gdGhpcy5fdGFyZ2V0LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHZhciB0aGlzUmVjdCA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgdmFyIGhvcml6b250YWxDZW50ZXJPZmZzZXQgPSAodGFyZ2V0UmVjdC53aWR0aCAtIHRoaXNSZWN0LndpZHRoKSAvIDI7CiAgICAgICAgdmFyIHZlcnRpY2FsQ2VudGVyT2Zmc2V0ID0gKHRhcmdldFJlY3QuaGVpZ2h0IC0gdGhpc1JlY3QuaGVpZ2h0KSAvIDI7CiAgICAgICAgdmFyIHRhcmdldExlZnQgPSB0YXJnZXRSZWN0LmxlZnQgLSBwYXJlbnRSZWN0LmxlZnQ7CiAgICAgICAgdmFyIHRhcmdldFRvcCA9IHRhcmdldFJlY3QudG9wIC0gcGFyZW50UmVjdC50b3A7CiAgICAgICAgdmFyIHRvb2x0aXBMZWZ0LCB0b29sdGlwVG9wOwogICAgICAgIHN3aXRjaCAodGhpcy5wb3NpdGlvbikgewogICAgICAgICAgY2FzZSAndG9wJzoKICAgICAgICAgICAgdG9vbHRpcExlZnQgPSB0YXJnZXRMZWZ0ICsgaG9yaXpvbnRhbENlbnRlck9mZnNldDsKICAgICAgICAgICAgdG9vbHRpcFRvcCA9IHRhcmdldFRvcCAtIHRoaXNSZWN0LmhlaWdodCAtIG9mZnNldDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdib3R0b20nOgogICAgICAgICAgICB0b29sdGlwTGVmdCA9IHRhcmdldExlZnQgKyBob3Jpem9udGFsQ2VudGVyT2Zmc2V0OwogICAgICAgICAgICB0b29sdGlwVG9wID0gdGFyZ2V0VG9wICsgdGFyZ2V0UmVjdC5oZWlnaHQgKyBvZmZzZXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnbGVmdCc6CiAgICAgICAgICAgIHRvb2x0aXBMZWZ0ID0gdGFyZ2V0TGVmdCAtIHRoaXNSZWN0LndpZHRoIC0gb2Zmc2V0OwogICAgICAgICAgICB0b29sdGlwVG9wID0gdGFyZ2V0VG9wICsgdmVydGljYWxDZW50ZXJPZmZzZXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAncmlnaHQnOgogICAgICAgICAgICB0b29sdGlwTGVmdCA9IHRhcmdldExlZnQgKyB0YXJnZXRSZWN0LndpZHRoICsgb2Zmc2V0OwogICAgICAgICAgICB0b29sdGlwVG9wID0gdGFyZ2V0VG9wICsgdmVydGljYWxDZW50ZXJPZmZzZXQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKG5vbXMpOiBUaGlzIHNob3VsZCB1c2UgSXJvbkZpdEJlaGF2aW9yIGlmIHBvc3NpYmxlLgogICAgICAgIGlmICh0aGlzLmZpdFRvVmlzaWJsZUJvdW5kcykgewogICAgICAgICAgLy8gQ2xpcCB0aGUgbGVmdC9yaWdodCBzaWRlCiAgICAgICAgICBpZiAocGFyZW50UmVjdC5sZWZ0ICsgdG9vbHRpcExlZnQgKyB0aGlzUmVjdC53aWR0aCA+IHdpbmRvdy5pbm5lcldpZHRoKSB7CiAgICAgICAgICAgIHRoaXMuc3R5bGUucmlnaHQgPSAnMHB4JzsKICAgICAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ID0gJ2F1dG8nOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ID0gTWF0aC5tYXgoMCwgdG9vbHRpcExlZnQpICsgJ3B4JzsKICAgICAgICAgICAgdGhpcy5zdHlsZS5yaWdodCA9ICdhdXRvJzsKICAgICAgICAgIH0KICAgICAgICAgIC8vIENsaXAgdGhlIHRvcC9ib3R0b20gc2lkZS4KICAgICAgICAgIGlmIChwYXJlbnRSZWN0LnRvcCArIHRvb2x0aXBUb3AgKyB0aGlzUmVjdC5oZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHsKICAgICAgICAgICAgdGhpcy5zdHlsZS5ib3R0b20gPSAocGFyZW50UmVjdC5oZWlnaHQgLSB0YXJnZXRUb3AgKyBvZmZzZXQpICsgJ3B4JzsKICAgICAgICAgICAgdGhpcy5zdHlsZS50b3AgPSAnYXV0byc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnN0eWxlLnRvcCA9IE1hdGgubWF4KC1wYXJlbnRSZWN0LnRvcCwgdG9vbHRpcFRvcCkgKyAncHgnOwogICAgICAgICAgICB0aGlzLnN0eWxlLmJvdHRvbSA9ICdhdXRvJzsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5zdHlsZS5sZWZ0ID0gdG9vbHRpcExlZnQgKyAncHgnOwogICAgICAgICAgdGhpcy5zdHlsZS50b3AgPSB0b29sdGlwVG9wICsgJ3B4JzsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfYWRkTGlzdGVuZXJzOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fdGFyZ2V0KSB7CiAgICAgICAgICB0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsICdtb3VzZWVudGVyJywgJ3Nob3cnKTsKICAgICAgICAgIHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwgJ2ZvY3VzJywgJ3Nob3cnKTsKICAgICAgICAgIHRoaXMubGlzdGVuKHRoaXMuX3RhcmdldCwgJ21vdXNlbGVhdmUnLCAnaGlkZScpOwogICAgICAgICAgdGhpcy5saXN0ZW4odGhpcy5fdGFyZ2V0LCAnYmx1cicsICdoaWRlJyk7CiAgICAgICAgICB0aGlzLmxpc3Rlbih0aGlzLl90YXJnZXQsICd0YXAnLCAnaGlkZScpOwogICAgICAgIH0KICAgICAgICB0aGlzLmxpc3Rlbih0aGlzLiQudG9vbHRpcCwgJ2FuaW1hdGlvbmVuZCcsICdfb25BbmltYXRpb25FbmQnKTsKICAgICAgICB0aGlzLmxpc3Rlbih0aGlzLCAnbW91c2VlbnRlcicsICdoaWRlJyk7CiAgICAgIH0sCgogICAgICBfZmluZFRhcmdldDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKCF0aGlzLm1hbnVhbE1vZGUpCiAgICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgICB0aGlzLl90YXJnZXQgPSB0aGlzLnRhcmdldDsKICAgICAgICBpZiAoIXRoaXMubWFudWFsTW9kZSkKICAgICAgICAgIHRoaXMuX2FkZExpc3RlbmVycygpOwogICAgICB9LAoKICAgICAgX2RlbGF5Q2hhbmdlOiBmdW5jdGlvbihuZXdWYWx1ZSkgewogICAgICAgIC8vIE9ubHkgVXBkYXRlIGRlbGF5IGlmIGRpZmZlcmVudCB2YWx1ZSBzZXQKICAgICAgICBpZiAobmV3VmFsdWUgIT09IDUwMCkgewogICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoeyctLXBhcGVyLXRvb2x0aXAtZGVsYXktaW4nOiBuZXdWYWx1ZSArICdtcyd9KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfbWFudWFsTW9kZUNoYW5nZWQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLm1hbnVhbE1vZGUpCiAgICAgICAgICB0aGlzLl9yZW1vdmVMaXN0ZW5lcnMoKTsKICAgICAgICBlbHNlCiAgICAgICAgICB0aGlzLl9hZGRMaXN0ZW5lcnMoKTsKICAgICAgfSwKCiAgICAgIF9jYW5jZWxBbmltYXRpb246IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIFNob3J0LWN1dCBhbmQgY2FuY2VsIGFsbCBhbmltYXRpb25zIGFuZCBoaWRlCiAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCdlbnRyeScpKTsKICAgICAgICB0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoJ2V4aXQnKSk7CiAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSgnY2FuY2VsLWFuaW1hdGlvbicpOwogICAgICAgIHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOwogICAgICB9LAoKICAgICAgX29uQW5pbWF0aW9uRmluaXNoOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fc2hvd2luZykgewogICAgICAgICAgdGhpcy4kLnRvb2x0aXAuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9nZXRBbmltYXRpb25UeXBlKCdlbnRyeScpKTsKICAgICAgICAgIHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5yZW1vdmUoJ2NhbmNlbC1hbmltYXRpb24nKTsKICAgICAgICAgIHRoaXMuJC50b29sdGlwLmNsYXNzTGlzdC5hZGQodGhpcy5fZ2V0QW5pbWF0aW9uVHlwZSgnZXhpdCcpKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfb25BbmltYXRpb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIC8vIElmIG5vIGxvbmdlciBzaG93aW5nIGFkZCBjbGFzcyBoaWRkZW4gdG8gY29tcGxldGVseSBoaWRlIHRvb2x0aXAKICAgICAgICB0aGlzLl9hbmltYXRpb25QbGF5aW5nID0gZmFsc2U7CiAgICAgICAgaWYgKCF0aGlzLl9zaG93aW5nKSB7CiAgICAgICAgICB0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2dldEFuaW1hdGlvblR5cGUoJ2V4aXQnKSk7CiAgICAgICAgICB0aGlzLiQudG9vbHRpcC5jbGFzc0xpc3QuYWRkKCdoaWRkZW4nKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICBfZ2V0QW5pbWF0aW9uVHlwZTogZnVuY3Rpb24odHlwZSkgewogICAgICAgIC8vIFRoZXNlIHByb3BlcnRpZXMgaGF2ZSBwcmlvcml0eSBvdmVyIGFuaW1hdGlvbkNvbmZpZyB2YWx1ZXMKICAgICAgICBpZiAoKHR5cGUgPT09ICdlbnRyeScpICYmICh0aGlzLmFuaW1hdGlvbkVudHJ5ICE9PSAnJykpIHsKICAgICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbkVudHJ5OwogICAgICAgIH0KICAgICAgICBpZiAoKHR5cGUgPT09ICdleGl0JykgJiYgKHRoaXMuYW5pbWF0aW9uRXhpdCAhPT0gJycpKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5hbmltYXRpb25FeGl0OwogICAgICAgIH0KICAgICAgICAvLyBJZiBubyByZXN1bHRzIHRoZW4gcmV0dXJuIHRoZSBsZWdhY3kgdmFsdWUgZnJvbSBhbmltYXRpb25Db25maWcKICAgICAgICBpZiAodGhpcy5hbmltYXRpb25Db25maWdbdHlwZV0gJiYKICAgICAgICAgICAgdHlwZW9mIHRoaXMuYW5pbWF0aW9uQ29uZmlnW3R5cGVdWzBdLm5hbWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAvLyBDaGVja2luZyBUaW1pbmcgYW5kIFVwZGF0ZSBpZiBuZWNlc3NhcnkgLSBMZWdhY3kgZm9yIGFuaW1hdGlvbkNvbmZpZwogICAgICAgICAgaWYgKHRoaXMuYW5pbWF0aW9uQ29uZmlnW3R5cGVdWzBdLnRpbWluZyAmJgogICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uQ29uZmlnW3R5cGVdWzBdLnRpbWluZy5kZWxheSAmJgogICAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uQ29uZmlnW3R5cGVdWzBdLnRpbWluZy5kZWxheSAhPT0gMCkgewogICAgICAgICAgICB2YXIgdGltaW5nRGVsYXkgPSB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0eXBlXVswXS50aW1pbmcuZGVsYXk7CiAgICAgICAgICAgIC8vIEhhcyBUaW1pbmcgQ2hhbmdlIC0gVXBkYXRlIENTUwogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ2VudHJ5JykgewogICAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHsnLS1wYXBlci10b29sdGlwLWRlbGF5LWluJzogdGltaW5nRGVsYXkgKyAnbXMnfSk7CiAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ2V4aXQnKSB7CiAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoeyctLXBhcGVyLXRvb2x0aXAtZGVsYXktb3V0JzogdGltaW5nRGVsYXkgKyAnbXMnfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzLmFuaW1hdGlvbkNvbmZpZ1t0eXBlXVswXS5uYW1lOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIF9yZW1vdmVMaXN0ZW5lcnM6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl90YXJnZXQpIHsKICAgICAgICAgIHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCAnbW91c2VlbnRlcicsICdzaG93Jyk7CiAgICAgICAgICB0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwgJ2ZvY3VzJywgJ3Nob3cnKTsKICAgICAgICAgIHRoaXMudW5saXN0ZW4odGhpcy5fdGFyZ2V0LCAnbW91c2VsZWF2ZScsICdoaWRlJyk7CiAgICAgICAgICB0aGlzLnVubGlzdGVuKHRoaXMuX3RhcmdldCwgJ2JsdXInLCAnaGlkZScpOwogICAgICAgICAgdGhpcy51bmxpc3Rlbih0aGlzLl90YXJnZXQsICd0YXAnLCAnaGlkZScpOwogICAgICAgIH0KICAgICAgICB0aGlzLnVubGlzdGVuKHRoaXMuJC50b29sdGlwLCAnYW5pbWF0aW9uZW5kJywgJ19vbkFuaW1hdGlvbkVuZCcpOwogICAgICAgIHRoaXMudW5saXN0ZW4odGhpcywgJ21vdXNlZW50ZXInLCAnaGlkZScpOwogICAgICB9CiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIExpc3RlbktleSB7CiAgICAgICAgY29uc3RydWN0b3IobGlzdGVuZXIpIHsKICAgICAgICAgICAgdGhpcy5saXN0ZW5lciA9IGxpc3RlbmVyOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IGhhc2hMaXN0ZW5lcnMgPSBuZXcgU2V0KCk7CiAgICBjb25zdCBzdG9yYWdlTGlzdGVuZXJzID0gbmV3IFNldCgpOwogICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2hhc2hjaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgaGFzaExpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5LZXkpID0+IGxpc3RlbktleS5saXN0ZW5lcigpKTsKICAgIH0pOwogICAgLy8gWzFdOiBUaGUgZXZlbnQgb25seSB0cmlnZ2VycyB3aGVuIGFub3RoZXIgdGFiIGVkaXRzIHRoZSBzdG9yYWdlLiBDaGFuZ2luZyBhCiAgICAvLyB2YWx1ZSBpbiBjdXJyZW50IGJyb3dzZXIgdGFiIHdpbGwgTk9UIHRyaWdnZXIgYmVsb3cgZXZlbnQuCiAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc3RvcmFnZScsICgpID0+IHsKICAgICAgICBzdG9yYWdlTGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbktleSkgPT4gbGlzdGVuS2V5Lmxpc3RlbmVyKCkpOwogICAgfSk7CiAgICBmdW5jdGlvbiBhZGRIYXNoTGlzdGVuZXIoZm4pIHsKICAgICAgICBjb25zdCBrZXkgPSBuZXcgTGlzdGVuS2V5KGZuKTsKICAgICAgICBoYXNoTGlzdGVuZXJzLmFkZChrZXkpOwogICAgICAgIHJldHVybiBrZXk7CiAgICB9CiAgICBmdW5jdGlvbiBhZGRTdG9yYWdlTGlzdGVuZXIoZm4pIHsKICAgICAgICBjb25zdCBrZXkgPSBuZXcgTGlzdGVuS2V5KGZuKTsKICAgICAgICBzdG9yYWdlTGlzdGVuZXJzLmFkZChrZXkpOwogICAgICAgIHJldHVybiBrZXk7CiAgICB9CiAgICBmdW5jdGlvbiBmaXJlU3RvcmFnZUNoYW5nZWQoKSB7CiAgICAgICAgc3RvcmFnZUxpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5LZXkpID0+IGxpc3RlbktleS5saXN0ZW5lcigpKTsKICAgIH0KICAgIGZ1bmN0aW9uIHJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5KGtleSkgewogICAgICAgIGhhc2hMaXN0ZW5lcnMuZGVsZXRlKGtleSk7CiAgICB9CiAgICBmdW5jdGlvbiByZW1vdmVTdG9yYWdlTGlzdGVuZXJCeUtleShrZXkpIHsKICAgICAgICBzdG9yYWdlTGlzdGVuZXJzLmRlbGV0ZShrZXkpOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE2IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLy8gSWYgdHJ1ZSwgVGVuc29yQm9hcmQgc3RvcmVzIGl0cyBoYXNoIGluIHRoZSBVUkkgc3RhdGUuCiAgICAvLyBJZiBmYWxzZSwgdGFiIHN3aXRjaGluZyBpbiBUZW5zb3JCb2FyZCB3aWxsIG5vdCB1cGRhdGUgbG9jYXRpb24gaGFzaCwKICAgIC8vIGJlY2F1c2UgaGFzaCB1cGRhdGVzIGludGVyZmVyZSB3aXRoIHdjdF90ZXN0cy4KICAgIGxldCBfdXNlSGFzaCA9IGZhbHNlOwogICAgZnVuY3Rpb24gc2V0VXNlSGFzaChzaG91bGRVc2VIYXNoKSB7CiAgICAgICAgX3VzZUhhc2ggPSBzaG91bGRVc2VIYXNoOwogICAgfQogICAgZnVuY3Rpb24gdXNlSGFzaCgpIHsKICAgICAgICByZXR1cm4gX3VzZUhhc2g7CiAgICB9CiAgICBsZXQgX2Zha2VIYXNoID0gJyc7CiAgICBmdW5jdGlvbiBzZXRGYWtlSGFzaChoKSB7CiAgICAgICAgX2Zha2VIYXNoID0gaDsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEZha2VIYXNoKCkgewogICAgICAgIHJldHVybiBfZmFrZUhhc2g7CiAgICB9CgogICAgdmFyIHRmX2dsb2JhbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIHNldFVzZUhhc2g6IHNldFVzZUhhc2gsCiAgICAgICAgdXNlSGFzaDogdXNlSGFzaCwKICAgICAgICBzZXRGYWtlSGFzaDogc2V0RmFrZUhhc2gsCiAgICAgICAgZ2V0RmFrZUhhc2g6IGdldEZha2VIYXNoCiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQSBrZXl3b3JkIHRoYXQgdXNlcnMgY2Fubm90IHVzZSwgc2luY2UgVGVuc29yQm9hcmQgdXNlcyB0aGlzIHRvIHN0b3JlIGluZm8KICAgICAqIGFib3V0IHRoZSBhY3RpdmUgdGFiLgogICAgICovCiAgICBjb25zdCBUQUIgPSAnX190YWJfXyc7CiAgICAvKioKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSBmb3IgdXNlcnMgdG8gc2V0IG9uIGEgUG9seW1lciBjb21wb25lbnQKICAgICAqIGluIG9yZGVyIGZvciBpdHMgc3RvcmVkIHByb3BlcnRpZXMgdG8gYmUgc3RvcmVkIGluIHRoZSBVUkkgdW5hbWJpZ3VvdXNseS4KICAgICAqIChObyBuZWVkIHRvIHNldCB0aGlzIGlmIHlvdSB3YW50IG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgY29tcG9uZW50IHRvCiAgICAgKiBzaGFyZSBVUkkgc3RhdGUpCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqIDxteS1jb21wb25lbnQgZGlzYW1iaWd1YXRvcj0iMCI+PC9teS1jb21wb25lbnQ+CiAgICAgKgogICAgICogVGhlIGRpc2FtYmlndWF0b3Igc2hvdWxkIGJlIHNldCB0byBhbnkgdW5pcXVlIHZhbHVlIHNvIHRoYXQgbXVsdGlwbGUKICAgICAqIGluc3RhbmNlcyBvZiB0aGUgY29tcG9uZW50IGNhbiBzdG9yZSBwcm9wZXJ0aWVzIGluIFVSSSBzdG9yYWdlLgogICAgICoKICAgICAqIEJlY2F1c2UgaXQncyBoYXJkIHRvIGRlcmVmZXJlbmNlIHRoaXMgdmFyaWFibGUgaW4gSFRNTCBwcm9wZXJ0eSBiaW5kaW5ncywKICAgICAqIGl0IGlzIE5PVCBzYWZlIHRvIGNoYW5nZSB0aGUgZGlzYW1iaWd1YXRvciBzdHJpbmcgd2l0aG91dCBmaW5kK3JlcGxhY2UKICAgICAqIGFjcm9zcyB0aGUgY29kZWJhc2UuCiAgICAgKi8KICAgIGNvbnN0IERJU0FNQklHVUFUT1IgPSAnZGlzYW1iaWd1YXRvcic7CiAgICAvLyBLZWVwIGFuIHVwLXRvLWRhdGUgc3RvcmUgb2YgVVJMIHBhcmFtcywgd2hpY2ggaWZyYW1lZCBwbHVnaW5zIGNhbiByZXF1ZXN0LgogICAgbGV0IHVybERpY3QgPSB7fTsKICAgIGZ1bmN0aW9uIGdldFVybERpY3QoKSB7CiAgICAgICAgcmV0dXJuIHVybERpY3Q7CiAgICB9CiAgICBhZGRIYXNoTGlzdGVuZXIoKCkgPT4gewogICAgICAgIHVybERpY3QgPSBjb21wb25lbnRUb0RpY3QocmVhZENvbXBvbmVudCgpKTsKICAgIH0pOwogICAgY29uc3QgeyBnZXQ6IGdldFN0cmluZywgc2V0OiBzZXRTdHJpbmcsIGdldEluaXRpYWxpemVyOiBnZXRTdHJpbmdJbml0aWFsaXplciwgZ2V0T2JzZXJ2ZXI6IGdldFN0cmluZ09ic2VydmVyLCBkaXNwb3NlQmluZGluZzogZGlzcG9zZVN0cmluZ0JpbmRpbmcsIH0gPSBtYWtlQmluZGluZ3MoKHgpID0+IHgsICh4KSA9PiB4KTsKICAgIGNvbnN0IHsgZ2V0OiBnZXRCb29sZWFuLCBzZXQ6IHNldEJvb2xlYW4sIGdldEluaXRpYWxpemVyOiBnZXRCb29sZWFuSW5pdGlhbGl6ZXIsIGdldE9ic2VydmVyOiBnZXRCb29sZWFuT2JzZXJ2ZXIsIGRpc3Bvc2VCaW5kaW5nOiBkaXNwb3NlQm9vbGVhbkJpbmRpbmcsIH0gPSBtYWtlQmluZGluZ3MoKHMpID0+IChzID09PSAndHJ1ZScgPyB0cnVlIDogcyA9PT0gJ2ZhbHNlJyA/IGZhbHNlIDogdW5kZWZpbmVkKSwgKGIpID0+IGIudG9TdHJpbmcoKSk7CiAgICBjb25zdCB7IGdldDogZ2V0TnVtYmVyLCBzZXQ6IHNldE51bWJlciwgZ2V0SW5pdGlhbGl6ZXI6IGdldE51bWJlckluaXRpYWxpemVyLCBnZXRPYnNlcnZlcjogZ2V0TnVtYmVyT2JzZXJ2ZXIsIGRpc3Bvc2VCaW5kaW5nOiBkaXNwb3NlTnVtYmVyQmluZGluZywgfSA9IG1ha2VCaW5kaW5ncygocykgPT4gK3MsIChuKSA9PiBuLnRvU3RyaW5nKCkpOwogICAgY29uc3QgeyBnZXQ6IGdldE9iamVjdCwgc2V0OiBzZXRPYmplY3QsIGdldEluaXRpYWxpemVyOiBnZXRPYmplY3RJbml0aWFsaXplciwgZ2V0T2JzZXJ2ZXI6IGdldE9iamVjdE9ic2VydmVyLCBkaXNwb3NlQmluZGluZzogZGlzcG9zZU9iamVjdEJpbmRpbmcsIH0gPSBtYWtlQmluZGluZ3MoKHMpID0+IEpTT04ucGFyc2UoYXRvYihzKSksIChvKSA9PiBidG9hKEpTT04uc3RyaW5naWZ5KG8pKSk7CiAgICBmdW5jdGlvbiBtYWtlQmluZGluZ3MoZnJvbVN0cmluZywgdG9TdHJpbmcpIHsKICAgICAgICBjb25zdCBoYXNoTGlzdGVuZXJzID0gW107CiAgICAgICAgY29uc3Qgc3RvcmFnZUxpc3RlbmVycyA9IFtdOwogICAgICAgIGZ1bmN0aW9uIGdldChrZXksIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBjb25zdCB7IGRlZmF1bHRWYWx1ZSwgdXNlTG9jYWxTdG9yYWdlID0gZmFsc2UgfSA9IG9wdGlvbnM7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdXNlTG9jYWxTdG9yYWdlCiAgICAgICAgICAgICAgICA/IHdpbmRvdy5sb2NhbFN0b3JhZ2UuZ2V0SXRlbShrZXkpCiAgICAgICAgICAgICAgICA6IGNvbXBvbmVudFRvRGljdChyZWFkQ29tcG9uZW50KCkpW2tleV07CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA9PSB1bmRlZmluZWQgPyBsb2Rhc2guY2xvbmVEZWVwKGRlZmF1bHRWYWx1ZSkgOiBmcm9tU3RyaW5nKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUsIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICBjb25zdCB7IGRlZmF1bHRWYWx1ZSwgdXNlTG9jYWxTdG9yYWdlID0gZmFsc2UsIHVzZUxvY2F0aW9uUmVwbGFjZSA9IGZhbHNlLCB9ID0gb3B0aW9uczsKICAgICAgICAgICAgY29uc3Qgc3RyaW5nVmFsdWUgPSB0b1N0cmluZyh2YWx1ZSk7CiAgICAgICAgICAgIGlmICh1c2VMb2NhbFN0b3JhZ2UpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhbFN0b3JhZ2Uuc2V0SXRlbShrZXksIHN0cmluZ1ZhbHVlKTsKICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgbGlzdGVuZXJzLnRzOlsxXSwgd2UgbmVlZCB0byBtYW51YWxseSBub3RpZnkgYWxsIFVJIGVsZW1lbnRzCiAgICAgICAgICAgICAgICAvLyBsaXN0ZW5pbmcgdG8gc3RvcmFnZSB3aXRoaW4gdGhlIHRhYiBvZiBhIGNoYW5nZS4KICAgICAgICAgICAgICAgIGZpcmVTdG9yYWdlQ2hhbmdlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFsb2Rhc2guaXNFcXVhbCh2YWx1ZSwgZ2V0KGtleSwgeyB1c2VMb2NhbFN0b3JhZ2UgfSkpKSB7CiAgICAgICAgICAgICAgICBpZiAobG9kYXNoLmlzRXF1YWwodmFsdWUsIGRlZmF1bHRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB1bnNldEZyb21VUkkoa2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gY29tcG9uZW50VG9EaWN0KHJlYWRDb21wb25lbnQoKSk7CiAgICAgICAgICAgICAgICAgICAgaXRlbXNba2V5XSA9IHN0cmluZ1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIHdyaXRlQ29tcG9uZW50KGRpY3RUb0NvbXBvbmVudChpdGVtcyksIHVzZUxvY2F0aW9uUmVwbGFjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgb24gYSBgdmFsdWVgIGRlY2xhcmF0aW9uIHRvIGEgUG9seW1lcgogICAgICAgICAqIHByb3BlcnR5LiBJdCB1cGRhdGVzIHRoZSBgcG9seW1lclByb3BlcnR5YCB3aGVuIHN0b3JhZ2UgY2hhbmdlcyAtLSBpLmUuLAogICAgICAgICAqIHdoZW4gYHVzZUxvY2FsU3RvcmFnZWAsIGl0IGxpc3RlbnMgdG8gc3RvcmFnZSBjaGFuZ2UgZnJvbSBhbm90aGVyIHRhYiBhbmQKICAgICAgICAgKiB3aGVuIGB1c2VMb2NhbFN0b3JhZ2U9ZmFsc2VgLCBpdCBsaXN0ZW5zIHRvIGhhc2hjaGFuZ2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0SW5pdGlhbGl6ZXIoa2V5LCBvcHRpb25zKSB7CiAgICAgICAgICAgIGNvbnN0IGZ1bGxPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0VmFsdWUsIHBvbHltZXJQcm9wZXJ0eToga2V5LCB1c2VMb2NhbFN0b3JhZ2U6IGZhbHNlIH0sIG9wdGlvbnMpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY29uc3QgdXJpU3RvcmFnZU5hbWUgPSBnZXRVUklTdG9yYWdlTmFtZSh0aGlzLCBrZXkpOwogICAgICAgICAgICAgICAgLy8gc2V0Q29tcG9uZW50VmFsdWUgd2lsbCBiZSBjYWxsZWQgZXZlcnkgdGltZSB0aGUgdW5kZXJseWluZyBzdG9yYWdlCiAgICAgICAgICAgICAgICAvLyBjaGFuZ2VzIGFuZCBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCBuZXcgc3RhdGUgd2lsbCBwcm9wYWdhdGUKICAgICAgICAgICAgICAgIC8vIHRvIHRoZSBjb21wb25lbnQgd2l0aCBzcGVjaWZpZWQgcHJvcGVydHkuIEl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGRvZXMgbm90IHJlLWFzc2lnbiBuZWVkbGVzc2x5LCB0byBhdm9pZCBQb2x5bWVyIG9ic2VydmVyCiAgICAgICAgICAgICAgICAvLyBjaHVybi4KICAgICAgICAgICAgICAgIGNvbnN0IHNldENvbXBvbmVudFZhbHVlID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0b3JlZFZhbHVlID0gZ2V0KHVyaVN0b3JhZ2VOYW1lLCBmdWxsT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFZhbHVlID0gdGhpc1tmdWxsT3B0aW9ucy5wb2x5bWVyUHJvcGVydHldOwogICAgICAgICAgICAgICAgICAgIGlmICghbG9kYXNoLmlzRXF1YWwoc3RvcmVkVmFsdWUsIGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tmdWxsT3B0aW9ucy5wb2x5bWVyUHJvcGVydHldID0gc3RvcmVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGFkZExpc3RlbmVyID0gZnVsbE9wdGlvbnMudXNlTG9jYWxTdG9yYWdlCiAgICAgICAgICAgICAgICAgICAgPyBhZGRTdG9yYWdlTGlzdGVuZXIKICAgICAgICAgICAgICAgICAgICA6IGFkZEhhc2hMaXN0ZW5lcjsKICAgICAgICAgICAgICAgIC8vIFRPRE8oc3RlcGhhbndsZWUpOiBXaGVuIHVzaW5nIGZha2VIYXNoLCBpdCBfc2hvdWxkIG5vdF8gbGlzdGVuIHRvIHRoZQogICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5oYXNoY2hhbmdlLgogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuS2V5ID0gYWRkTGlzdGVuZXIoKCkgPT4gc2V0Q29tcG9uZW50VmFsdWUoKSk7CiAgICAgICAgICAgICAgICBpZiAoZnVsbE9wdGlvbnMudXNlTG9jYWxTdG9yYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgc3RvcmFnZUxpc3RlbmVycy5wdXNoKGxpc3RlbktleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBoYXNoTGlzdGVuZXJzLnB1c2gobGlzdGVuS2V5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgdmFsdWUgb24gdGhlIHByb3BlcnR5LgogICAgICAgICAgICAgICAgc2V0Q29tcG9uZW50VmFsdWUoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzW2Z1bGxPcHRpb25zLnBvbHltZXJQcm9wZXJ0eV07CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGRpc3Bvc2VCaW5kaW5nKCkgewogICAgICAgICAgICBoYXNoTGlzdGVuZXJzLmZvckVhY2goKGtleSkgPT4gcmVtb3ZlSGFzaExpc3RlbmVyQnlLZXkoa2V5KSk7CiAgICAgICAgICAgIHN0b3JhZ2VMaXN0ZW5lcnMuZm9yRWFjaCgoa2V5KSA9PiByZW1vdmVTdG9yYWdlTGlzdGVuZXJCeUtleShrZXkpKTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gZ2V0T2JzZXJ2ZXIoa2V5LCBvcHRpb25zKSB7CiAgICAgICAgICAgIGNvbnN0IGZ1bGxPcHRpb25zID0gT2JqZWN0LmFzc2lnbih7IGRlZmF1bHRWYWx1ZTogb3B0aW9ucy5kZWZhdWx0VmFsdWUsIHBvbHltZXJQcm9wZXJ0eToga2V5LCB1c2VMb2NhbFN0b3JhZ2U6IGZhbHNlIH0sIG9wdGlvbnMpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY29uc3QgdXJpU3RvcmFnZU5hbWUgPSBnZXRVUklTdG9yYWdlTmFtZSh0aGlzLCBrZXkpOwogICAgICAgICAgICAgICAgY29uc3QgbmV3VmFsID0gdGhpc1tmdWxsT3B0aW9ucy5wb2x5bWVyUHJvcGVydHldOwogICAgICAgICAgICAgICAgc2V0KHVyaVN0b3JhZ2VOYW1lLCBuZXdWYWwsIGZ1bGxPcHRpb25zKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgZ2V0LCBzZXQsIGdldEluaXRpYWxpemVyLCBnZXRPYnNlcnZlciwgZGlzcG9zZUJpbmRpbmcgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogVE9ETyhwc3lidXp6KTogbW92ZSB0byBzb21lIGNvbXBhdGliaWxpdHkgZmlsZS4KICAgICAgICAgKiBGb3IgZWFjaCBXSVQgVVJMIHBhcmFtIGluIHRoZSBsZWdhY3kgc2NoZW1lLCBjcmVhdGUgYW5vdGhlciBVUkwgcGFyYW0KICAgICAgICAgKiBpbiB0aGUgbmV3IHNjaGVtZS4gT25jZSBXSVQgbWlncmF0ZXMgdG8gdXNpbmcgdGhlIG5ldyBwbHVnaW4gQVBJCiAgICAgICAgICogYGdldFVSTFBsdWdpbkRhdGEoKWAsIHdlIGNhbiB1cGRhdGUgdGhpcyBtZXRob2QgdG8gZGVsZXRlIHRoZSBsZWdhY3kKICAgICAgICAgKiBzY2hlbWUgcGFyYW1zLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBsaXN0IG9mIHBhcmFtcyB3YXMgdGFrZW4gb24gMS8xNi8yMDIwLiBMdWNraWx5LCBXSVQgb25seSBzdG9yZWQKICAgICAgICAgKiBzdHJpbmdzLCBib29sZWFucy4KICAgICAgICAgKi8KICAgICAgICBjb25zdCB3aXRVcmxDb21wYXRpYmlsaXR5U2V0ID0gbmV3IFNldChbCiAgICAgICAgICAgICdleGFtcGxlc1BhdGgnLAogICAgICAgICAgICAnaGlkZU1vZGVsUGFuZTInLAogICAgICAgICAgICAnbW9kZWxOYW1lMScsCiAgICAgICAgICAgICdtb2RlbE5hbWUyJywKICAgICAgICAgICAgJ2luZmVyZW5jZUFkZHJlc3MxJywKICAgICAgICAgICAgJ2luZmVyZW5jZUFkZHJlc3MyJywKICAgICAgICAgICAgJ21vZGVsVHlwZScsCiAgICAgICAgICAgICdtb2RlbFZlcnNpb24xJywKICAgICAgICAgICAgJ21vZGVsVmVyc2lvbjInLAogICAgICAgICAgICAnbW9kZWxTaWduYXR1cmUxJywKICAgICAgICAgICAgJ21vZGVsU2lnbmF0dXJlMicsCiAgICAgICAgICAgICdtYXhFeGFtcGxlcycsCiAgICAgICAgICAgICdsYWJlbFZvY2FiUGF0aCcsCiAgICAgICAgICAgICdtdWx0aUNsYXNzJywKICAgICAgICAgICAgJ3NlcXVlbmNlRXhhbXBsZXMnLAogICAgICAgICAgICAnbWF4Q2xhc3Nlc1RvRGlzcGxheScsCiAgICAgICAgICAgICdzYW1wbGluZ09kZHMnLAogICAgICAgICAgICAndXNlUHJlZGljdEFwaScsCiAgICAgICAgICAgICdwcmVkaWN0SW5wdXRUZW5zb3InLAogICAgICAgICAgICAncHJlZGljdE91dHB1dFRlbnNvcicsCiAgICAgICAgXSk7CiAgICAgICAgY29uc3QgaXRlbXMgPSBjb21wb25lbnRUb0RpY3QocmVhZENvbXBvbmVudCgpKTsKICAgICAgICBpZiAoaXRlbXNbVEFCXSA9PT0gJ3doYXRpZicpIHsKICAgICAgICAgICAgZm9yIChsZXQgb2xkTmFtZSBvZiB3aXRVcmxDb21wYXRpYmlsaXR5U2V0KSB7CiAgICAgICAgICAgICAgICBpZiAob2xkTmFtZSBpbiBpdGVtcykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gaXRlbXNbb2xkTmFtZV07CiAgICAgICAgICAgICAgICAgICAgaXRlbXNbYHAud2hhdGlmLiR7b2xkTmFtZX1gXSA9IG9sZFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdyaXRlQ29tcG9uZW50KGRpY3RUb0NvbXBvbmVudChpdGVtcykpOwogICAgICAgIHVybERpY3QgPSBpdGVtczsKICAgIH0KICAgIC8qKgogICAgICogR2V0IGEgdW5pcXVlIHN0b3JhZ2UgbmFtZSBmb3IgYSAoUG9seW1lciBjb21wb25lbnQsIHByb3BlcnR5TmFtZSkgdHVwbGUuCiAgICAgKgogICAgICogRElTQU1CSUdVQVRPUiBtdXN0IGJlIHNldCBvbiB0aGUgY29tcG9uZW50LCBpZiBvdGhlciBjb21wb25lbnRzIHVzZSB0aGUKICAgICAqIHNhbWUgcHJvcGVydHlOYW1lLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRVUklTdG9yYWdlTmFtZShjb21wb25lbnQsIHByb3BlcnR5TmFtZSkgewogICAgICAgIGNvbnN0IGQgPSBjb21wb25lbnRbRElTQU1CSUdVQVRPUl07CiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IGQgPT0gbnVsbCA/IFtwcm9wZXJ0eU5hbWVdIDogW2QsIHByb3BlcnR5TmFtZV07CiAgICAgICAgcmV0dXJuIGNvbXBvbmVudHMuam9pbignLicpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWFkIGNvbXBvbmVudCBmcm9tIFVSSSAoZS5nLiByZXR1cm5zICJldmVudHMmcnVuUHJlZml4PXRyYWluKiIpLgogICAgICovCiAgICBmdW5jdGlvbiByZWFkQ29tcG9uZW50KCkgewogICAgICAgIHJldHVybiB1c2VIYXNoKCkgPyB3aW5kb3cubG9jYXRpb24uaGFzaC5zbGljZSgxKSA6IGdldEZha2VIYXNoKCk7CiAgICB9CiAgICAvKioKICAgICAqIFdyaXRlIGNvbXBvbmVudCB0byBVUkkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyaXRlQ29tcG9uZW50KGNvbXBvbmVudCwgdXNlTG9jYXRpb25SZXBsYWNlID0gZmFsc2UpIHsKICAgICAgICBpZiAodXNlSGFzaCgpKSB7CiAgICAgICAgICAgIGlmICh1c2VMb2NhdGlvblJlcGxhY2UpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwod2luZG93LmxvY2F0aW9uLmhyZWYpOwogICAgICAgICAgICAgICAgdXJsLmhhc2ggPSBjb21wb25lbnQ7CiAgICAgICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsIHVybC50b1N0cmluZygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5oYXNoID0gY29tcG9uZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzZXRGYWtlSGFzaChjb21wb25lbnQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29udmVydCBkaWN0aW9uYXJ5IG9mIHN0cmluZ3MgaW50byBhIFVSSSBDb21wb25lbnQuCiAgICAgKiBBbGwga2V5IHZhbHVlIGVudHJpZXMgZ2V0IGFkZGVkIGFzIGtleSB2YWx1ZSBwYWlycyBpbiB0aGUgY29tcG9uZW50LAogICAgICogd2l0aCB0aGUgZXhjZXB0aW9uIG9mIGEga2V5IHdpdGggdGhlIFRBQiB2YWx1ZSwgd2hpY2ggaWYgcHJlc2VudAogICAgICogZ2V0cyBwcmVwZW5kZWQgdG8gdGhlIFVSSSBDb21wb25lbnQgc3RyaW5nIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQogICAgICogcmVhc29ucy4KICAgICAqLwogICAgZnVuY3Rpb24gZGljdFRvQ29tcG9uZW50KGl0ZW1zKSB7CiAgICAgICAgbGV0IGNvbXBvbmVudCA9ICcnOwogICAgICAgIC8vIEFkZCB0aGUgdGFiIG5hbWUgZS5nLiAnZXZlbnRzJywgJ2ltYWdlcycsICdoaXN0b2dyYW1zJyBhcyBhIHByZWZpeAogICAgICAgIC8vIGZvciBiYWNrd2FyZHMgY29tcGF0YmlsaXR5LgogICAgICAgIGlmIChpdGVtc1tUQUJdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29tcG9uZW50ICs9IGl0ZW1zW1RBQl07CiAgICAgICAgfQogICAgICAgIC8vIEpvaW4gb3RoZXIgc3RyaW5ncyB3aXRoICZrZXk9dmFsdWUgbm90YXRpb24KICAgICAgICBjb25zdCBub25UYWIgPSBPYmplY3Qua2V5cyhpdGVtcykKICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBba2V5LCBpdGVtc1trZXldXSkKICAgICAgICAgICAgLmZpbHRlcigocGFpcikgPT4gcGFpclswXSAhPT0gVEFCKQogICAgICAgICAgICAubWFwKChwYWlyKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQocGFpclswXSkgKyAnPScgKyBlbmNvZGVVUklDb21wb25lbnQocGFpclsxXSk7CiAgICAgICAgfSkKICAgICAgICAgICAgLmpvaW4oJyYnKTsKICAgICAgICByZXR1cm4gbm9uVGFiLmxlbmd0aCA+IDAgPyBjb21wb25lbnQgKyAnJicgKyBub25UYWIgOiBjb21wb25lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnQgYSBVUkkgQ29tcG9uZW50IGludG8gYSBkaWN0aW9uYXJ5IG9mIHN0cmluZ3MuCiAgICAgKiBDb21wb25lbnQgc2hvdWxkIGNvbnNpc3Qgb2Yga2V5LXZhbHVlIHBhaXJzIGpvaW5lZCBieSBhIGRlbGltaXRlcgogICAgICogd2l0aCB0aGUgZXhjZXB0aW9uIG9mIHRoZSB0YWJOYW1lLgogICAgICogUmV0dXJucyBkaWN0IGNvbnNpc3Rpbmcgb2YgYWxsIGtleS12YWx1ZSBwYWlycyBhbmQKICAgICAqIGRpY3RbVEFCXSA9IHRhYk5hbWUKICAgICAqLwogICAgZnVuY3Rpb24gY29tcG9uZW50VG9EaWN0KGNvbXBvbmVudCkgewogICAgICAgIGNvbnN0IGl0ZW1zID0ge307CiAgICAgICAgY29uc3QgdG9rZW5zID0gY29tcG9uZW50LnNwbGl0KCcmJyk7CiAgICAgICAgdG9rZW5zLmZvckVhY2goKHRva2VuKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGt2ID0gdG9rZW4uc3BsaXQoJz0nKTsKICAgICAgICAgICAgLy8gU3BlY2lhbCBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSBmb3IgVVJJIGNvbXBvbmVudHMgbGlrZSAjc2NhbGFycy4KICAgICAgICAgICAgaWYgKGt2Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgaXRlbXNbVEFCXSA9IGt2WzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGt2Lmxlbmd0aCA9PT0gMikgewogICAgICAgICAgICAgICAgaXRlbXNbZGVjb2RlVVJJQ29tcG9uZW50KGt2WzBdKV0gPSBkZWNvZGVVUklDb21wb25lbnQoa3ZbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGl0ZW1zOwogICAgfQogICAgLyoqCiAgICAgKiBEZWxldGUgYSBrZXkgZnJvbSB0aGUgVVJJLgogICAgICovCiAgICBmdW5jdGlvbiB1bnNldEZyb21VUkkoa2V5KSB7CiAgICAgICAgY29uc3QgaXRlbXMgPSBjb21wb25lbnRUb0RpY3QocmVhZENvbXBvbmVudCgpKTsKICAgICAgICBkZWxldGUgaXRlbXNba2V5XTsKICAgICAgICB3cml0ZUNvbXBvbmVudChkaWN0VG9Db21wb25lbnQoaXRlbXMpKTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZlRhZ0ZpbHRlcmVyID0gY2xhc3MgVGZUYWdGaWx0ZXJlciBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5fdGFnRmlsdGVyID0gZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoJ3RhZ0ZpbHRlcicsIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICB1c2VMb2NhbFN0b3JhZ2U6IGZhbHNlLAogICAgICAgICAgICAgICAgcG9seW1lclByb3BlcnR5OiAnX3RhZ0ZpbHRlcicsCiAgICAgICAgICAgIH0pLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3RhZ0ZpbHRlck9ic2VydmVyID0gZ2V0U3RyaW5nT2JzZXJ2ZXIoJ3RhZ0ZpbHRlcicsIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgICAgICB1c2VMb2NhbFN0b3JhZ2U6IGZhbHNlLAogICAgICAgICAgICAgICAgcG9seW1lclByb3BlcnR5OiAnX3RhZ0ZpbHRlcicsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfY29tcHV0ZVRhZ0ZpbHRlcigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RhZ0ZpbHRlcjsKICAgICAgICB9CiAgICB9OwogICAgVGZUYWdGaWx0ZXJlci50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHBhcGVyLWlucHV0CiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJGaWx0ZXIgdGFncyAocmVndWxhciBleHByZXNzaW9ucyBzdXBwb3J0ZWQpIgogICAgICB2YWx1ZT0ie3tfdGFnRmlsdGVyfX0iCiAgICAgIGNsYXNzPSJzZWFyY2gtaW5wdXQiCiAgICA+CiAgICAgIDxpcm9uLWljb24gcHJlZml4PSIiIGljb249InNlYXJjaCIgc2xvdD0icHJlZml4Ij48L2lyb24taWNvbj4KICAgIDwvcGFwZXItaW5wdXQ+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDEwcHggMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgY29tcHV0ZWQ6ICdfY29tcHV0ZVRhZ0ZpbHRlcihfdGFnRmlsdGVyKScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlRhZ0ZpbHRlcmVyLnByb3RvdHlwZSwgInRhZ0ZpbHRlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfdGFnRmlsdGVyT2JzZXJ2ZXInLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZUYWdGaWx0ZXJlci5wcm90b3R5cGUsICJfdGFnRmlsdGVyIiwgdm9pZCAwKTsKICAgIFRmVGFnRmlsdGVyZXIgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi10YWctZmlsdGVyZXInKQogICAgXSwgVGZUYWdGaWx0ZXJlcik7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEludGVyb3AgZm9yIFBvbHltZXIgMyBzdHlsaW5nCiAgICAgKgogICAgICogRnJvbSBodHRwczovL3BvbHltZXItbGlicmFyeS5wb2x5bWVyLXByb2plY3Qub3JnLzMuMC9kb2NzL2Rldmd1aWRlL3N0eWxlLXNoYWRvdy1kb206CiAgICAgKiAgIFRoZSBmb2xsb3dpbmcgcHJvY2VzcyBpcyBhIHdvcmthcm91bmQuIFdoaWxlIFBvbHltZXIgMy4wIGRvZXMgbm90IHVzZQogICAgICogICA8ZG9tLW1vZHVsZT4gZWxlbWVudHMgZm9yIHRlbXBsYXRpbmcsIHN0eWxlIG1vZHVsZXMgZG8uIFRoZSBmb2xsb3dpbmcgcHJvY2VzcwogICAgICogICBpcyBhIHdvcmthcm91bmQgZm9yIHRoaXMgZmFjdC4gVGhpcyBwcm9jZXNzIG1heSBiZSB1cGRhdGVkIGFzIHJlcXVpcmVkLgogICAgICovCiAgICBmdW5jdGlvbiByZWdpc3RlclN0eWxlRG9tTW9kdWxlKGFyZ3MpIHsKICAgICAgICBjb25zdCB7IG1vZHVsZU5hbWUsIHN0eWxlQ29udGVudCB9ID0gYXJnczsKICAgICAgICBjb25zdCBkb21Nb2R1bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkb20tbW9kdWxlJyk7CiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpOwogICAgICAgIGNvbnN0IHN0eWxlSW5jbHVkZXMgPSBbXTsKICAgICAgICBpZiAoYXJncy5zdHlsZURlcGVuZGVuY2llcykgewogICAgICAgICAgICBhcmdzLnN0eWxlRGVwZW5kZW5jaWVzLmZvckVhY2goKGRlcCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgc3R5bGUuc2V0QXR0cmlidXRlKCdpbmNsdWRlJywgZGVwKTsKICAgICAgICAgICAgICAgIHN0eWxlSW5jbHVkZXMucHVzaChzdHlsZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb25zdCBzdHlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgT2JqZWN0LmFzc2lnbihzdHlsZSwgeyB0ZXh0Q29udGVudDogc3R5bGVDb250ZW50IH0pOwogICAgICAgIHN0eWxlSW5jbHVkZXMuZm9yRWFjaCgoc3R5bGVFbGVtZW50KSA9PiB7CiAgICAgICAgICAgIHRlbXBsYXRlLmNvbnRlbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbGVtZW50KTsKICAgICAgICB9KTsKICAgICAgICB0ZW1wbGF0ZS5jb250ZW50LmFwcGVuZENoaWxkKHN0eWxlKTsKICAgICAgICBkb21Nb2R1bGUuYXBwZW5kQ2hpbGQodGVtcGxhdGUpOwogICAgICAgIGRvbU1vZHVsZS5yZWdpc3Rlcihtb2R1bGVOYW1lKTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHJlZ2lzdGVyU3R5bGVEb21Nb2R1bGUoewogICAgICAgIG1vZHVsZU5hbWU6ICdkYXNoYm9hcmQtc3R5bGUnLAogICAgICAgIHN0eWxlRGVwZW5kZW5jaWVzOiBbJ2lyb24tZmxleCddLAogICAgICAgIHN0eWxlQ29udGVudDogYAogICAgICA6aG9zdCB7CiAgICAgICAgLS1zaWRlYmFyLXZlcnRpY2FsLXBhZGRpbmc6IDE1cHg7CiAgICAgICAgLS1zaWRlYmFyLWxlZnQtcGFkZGluZzogMzBweDsKICAgICAgfQoKICAgICAgW3Nsb3Q9J3NpZGViYXInXSB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgcGFkZGluZzogNXB4IDA7CiAgICAgICAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7CiAgICAgIH0KCiAgICAgIC5zZXR0aW5ncyB7CiAgICAgICAgbWluLWhlaWdodDogNTBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWluLWhlaWdodDogMjAwcHg7CiAgICAgIH0KCiAgICAgIHRmLXJ1bnMtc2VsZWN0b3IgewogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBsZWZ0OiB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgbWF4LWhlaWdodDogY2FsYygxMDAlIC0gdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSAqIDIpOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICB9CgogICAgICAuc2VhcmNoLWlucHV0IHsKICAgICAgICBtYXJnaW46IDEwcHggNXB4IDAgMTBweDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiB7CiAgICAgICAgYm9yZGVyLXRvcDogc29saWQgMXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIHBhZGRpbmc6IHZhcigtLXNpZGViYXItdmVydGljYWwtcGFkZGluZykgMAogICAgICAgICAgdmFyKC0tc2lkZWJhci12ZXJ0aWNhbC1wYWRkaW5nKSB2YXIoLS1zaWRlYmFyLWxlZnQtcGFkZGluZyk7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb246Zmlyc3Qtb2YtdHlwZSB7CiAgICAgICAgYm9yZGVyOiBub25lOwogICAgICB9CgogICAgICAuc2lkZWJhci1zZWN0aW9uIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgbWFyZ2luOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmZpcnN0LW9mLXR5cGUgewogICAgICAgIG1hcmdpbi1sZWZ0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gcGFwZXItYnV0dG9uOmxhc3Qtb2YtdHlwZSB7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDA7CiAgICAgICAgcGFkZGluZy10b3A6IDA7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyLXNlY3Rpb24gPiA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMDsKICAgICAgfQoKICAgICAgLnNpZGViYXItc2VjdGlvbiBoMyB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHg7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIHBhcGVyLWNoZWNrYm94IHsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBtYXJnaW4tdG9wOiA1cHg7CiAgICAgIH0KICBgLAogICAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMTYgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBzdHlsZSQxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgIHN0eWxlJDEuc2V0QXR0cmlidXRlKCdpcycsICdjdXN0b20tc3R5bGUnKTsKICAgIHN0eWxlJDEudGV4dENvbnRlbnQgPSBgCiAgOnJvb3QgewogICAgLS10Yi1vcmFuZ2Utd2VhazogI2ZmYTcyNjsKICAgIC0tdGItb3JhbmdlLXN0cm9uZzogI2Y1N2MwMDsKICAgIC0tdGItb3JhbmdlLWRhcms6ICNkYzczMjA7CiAgICAtLXRiLWdyZXktZGFya2VyOiAjZTJlMmUyOwogICAgLS10Yi1ncmV5LWxpZ2h0ZXI6ICNmM2YzZjM7CiAgICAtLXRiLXVpLWRhcmstYWNjZW50OiAjNzU3NTc1OwogICAgLS10Yi11aS1saWdodC1hY2NlbnQ6ICNlMGUwZTA7CiAgICAtLXRiLWdyYXBoLWZhZGVkOiAjZTBkNGIzOwogIH0KYDsKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoc3R5bGUkMSk7CgogICAgLyogQ29weXJpZ2h0IDIwMTYgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICByZWdpc3RlclN0eWxlRG9tTW9kdWxlKHsKICAgICAgICBtb2R1bGVOYW1lOiAnc2Nyb2xsYmFyLXN0eWxlJywKICAgICAgICBzdHlsZUNvbnRlbnQ6IGAKICAgIC5zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyLXRyYWNrIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIC5zY3JvbGxiYXI6Oi13ZWJraXQtc2Nyb2xsYmFyIHsKICAgICAgd2lkdGg6IDEwcHg7CiAgICB9CgogICAgLnNjcm9sbGJhcjo6LXdlYmtpdC1zY3JvbGxiYXItdGh1bWIgewogICAgICBib3JkZXItcmFkaXVzOiAxMHB4OwogICAgICAtd2Via2l0LWJveC1zaGFkb3c6IGluc2V0IDAgMCAycHggcmdiYSgwLCAwLCAwLCAwLjMpOwogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTkwMCk7CiAgICB9CiAgICAuc2Nyb2xsYmFyIHsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgIH0KICBgLAogICAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZEYXNoYm9hcmRMYXlvdXQgPSBjbGFzcyBUZkRhc2hib2FyZExheW91dCBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgIH07CiAgICBUZkRhc2hib2FyZExheW91dC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPGRpdiBpZD0ic2lkZWJhciI+CiAgICAgIDxzbG90IG5hbWU9InNpZGViYXIiPjwvc2xvdD4KICAgIDwvZGl2PgoKICAgIDxkaXYgaWQ9ImNlbnRlciI+CiAgICAgIDxzbG90IG5hbWU9ImNlbnRlciIgY2xhc3M9InNjb2xsYmFyIj48L3Nsb3Q+CiAgICA8L2Rpdj4KICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjc2lkZWJhciB7CiAgICAgICAgZmxleDogMCAwIHZhcigtLXRmLWRhc2hib2FyZC1sYXlvdXQtc2lkZWJhci1iYXNpcywgMjUlKTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbWF4LXdpZHRoOiB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItbWF4LXdpZHRoLCAzNTBweCk7CiAgICAgICAgbWluLXdpZHRoOiB2YXIoLS10Zi1kYXNoYm9hcmQtbGF5b3V0LXNpZGViYXItbWluLXdpZHRoLCAyNzBweCk7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgfQoKICAgICAgI2NlbnRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQoW3Nsb3Q9J2NlbnRlciddKSB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAudGYtZ3JhcGgtZGFzaGJvYXJkICNjZW50ZXIgewogICAgICAgIGJhY2tncm91bmQ6ICNmZmY7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIFRmRGFzaGJvYXJkTGF5b3V0ID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZGFzaGJvYXJkLWxheW91dCcpCiAgICBdLCBUZkRhc2hib2FyZExheW91dCk7CgogICAgLyogQ29weXJpZ2h0IDIwMTcgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBMSU1JVF9MT0NBTF9TVE9SQUdFX0tFWSA9ICdURi5UZW5zb3JCb2FyZC5QYWdpbmF0ZWRWaWV3LmxpbWl0JzsKICAgIGNvbnN0IERFRkFVTFRfTElNSVQgPSAxMjsgLy8gcmVhc29uYWJseSBzbWFsbCBhbmQgaGFzIGxvdHMgb2YgZmFjdG9ycwogICAgbGV0IF9saW1pdCA9IG51bGw7IC8vIGNhY2hlZCBsb2NhbFN0b3JhZ2UgdmFsdWUKICAgIGNvbnN0IGxpc3RlbmVycyA9IG5ldyBTZXQoKTsKICAgIC8qKgogICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciAobnVsbGFyeSBmdW5jdGlvbikgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHBhZ2UKICAgICAqIGxpbWl0IGNoYW5nZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZExpbWl0TGlzdGVuZXIobGlzdGVuZXIpIHsKICAgICAgICBsaXN0ZW5lcnMuYWRkKGxpc3RlbmVyKTsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlIGEgbGlzdGVuZXIgcmVnaXN0ZXJlZCB3aXRoIGBhZGRMaW1pdExpc3RlbmVyYC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlTGltaXRMaXN0ZW5lcihsaXN0ZW5lcikgewogICAgICAgIGxpc3RlbmVycy5kZWxldGUobGlzdGVuZXIpOwogICAgfQogICAgZnVuY3Rpb24gZ2V0TGltaXQoKSB7CiAgICAgICAgaWYgKF9saW1pdCA9PSBudWxsKSB7CiAgICAgICAgICAgIF9saW1pdCA9IGdldE51bWJlcihMSU1JVF9MT0NBTF9TVE9SQUdFX0tFWSwgewogICAgICAgICAgICAgICAgdXNlTG9jYWxTdG9yYWdlOiB0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKF9saW1pdCA9PSBudWxsIHx8ICFpc0Zpbml0ZShfbGltaXQpIHx8IF9saW1pdCA8PSAwKSB7CiAgICAgICAgICAgICAgICBfbGltaXQgPSBERUZBVUxUX0xJTUlUOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBfbGltaXQ7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRMaW1pdChsaW1pdCkgewogICAgICAgIGlmIChsaW1pdCAhPT0gTWF0aC5mbG9vcihsaW1pdCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBsaW1pdCBtdXN0IGJlIGFuIGludGVnZXIsIGJ1dCBnb3Q6ICR7bGltaXR9YCk7CiAgICAgICAgfQogICAgICAgIGlmIChsaW1pdCA8PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSwgYnV0IGdvdDogJHtsaW1pdH1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGxpbWl0ID09PSBfbGltaXQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBfbGltaXQgPSBsaW1pdDsKICAgICAgICBzZXROdW1iZXIoTElNSVRfTE9DQUxfU1RPUkFHRV9LRVksIF9saW1pdCwgewogICAgICAgICAgICB1c2VMb2NhbFN0b3JhZ2U6IHRydWUsCiAgICAgICAgfSk7CiAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKGxpc3RlbmVyKSA9PiB7CiAgICAgICAgICAgIGxpc3RlbmVyKCk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBBcnJheVVwZGF0ZUhlbHBlciBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgICAgICB1cGRhdGVBcnJheVByb3AocHJvcCwgdmFsdWUsIGdldEtleSkgewogICAgICAgICAgICBsZXQgb3JpZyA9IHRoaXMuZ2V0KHByb3ApOwogICAgICAgICAgICBjb25zdCBuZXdWYWwgPSB2YWx1ZTsKICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KG5ld1ZhbCkpIHsKICAgICAgICAgICAgICAgIHRocm93IFJhbmdlRXJyb3IoYEV4cGVjdGVkIG5ldyB2YWx1ZSB0byAnJHtwcm9wfScgdG8gYmUgYW4gYXJyYXkuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW4gY2FzZSB1c2luZyBDb21wbGV4T2JzZXJ2ZXIsIHRoZSBtZXRob2QgY2FuIGJlIGludm9rZWQgYmVmb3JlIHRoZSBwcm9wCiAgICAgICAgICAgIC8vIGhhZCBhIGNoYW5jZSB0byBpbml0aWFsaXplIHByb3Blcmx5LgogICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob3JpZykpIHsKICAgICAgICAgICAgICAgIG9yaWcgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KHByb3AsIG9yaWcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGxvb2t1cCA9IG5ldyBTZXQobmV3VmFsLm1hcCgoaXRlbSwgaSkgPT4gZ2V0S2V5KGl0ZW0sIGkpKSk7CiAgICAgICAgICAgIGxldCBvcmlnSW5kID0gMDsKICAgICAgICAgICAgbGV0IG5ld1ZhbEluZCA9IDA7CiAgICAgICAgICAgIHdoaWxlIChvcmlnSW5kIDwgb3JpZy5sZW5ndGggJiYgbmV3VmFsSW5kIDwgbmV3VmFsLmxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKCFsb29rdXAuaGFzKGdldEtleShvcmlnW29yaWdJbmRdLCBvcmlnSW5kKSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNwbGljZShwcm9wLCBvcmlnSW5kLCAxKTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdldEtleShvcmlnW29yaWdJbmRdLCBvcmlnSW5kKSA9PSBnZXRLZXkobmV3VmFsW25ld1ZhbEluZF0sIG5ld1ZhbEluZCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGVsZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhzdGVwaGFud2xlZSk6IFdlIG1heSBiZSBhYmxlIHRvIHVwZGF0ZSB0aGUgb3JpZ2luYWwgcmVmZXJlbmNlIG9mCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGB2YWx1ZWAgYnkgZGVlcC1jb3B5aW5nIHRoZSBuZXcgdmFsdWUgb3Zlci4KICAgICAgICAgICAgICAgICAgICB0aGlzLnNldChgJHtwcm9wfS4ke29yaWdJbmR9YCwgbmV3VmFsW25ld1ZhbEluZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zcGxpY2UocHJvcCwgb3JpZ0luZCwgMCwgbmV3VmFsW25ld1ZhbEluZF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV3VmFsSW5kKys7CiAgICAgICAgICAgICAgICBvcmlnSW5kKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9yaWdJbmQgPCBvcmlnLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhpcy5zcGxpY2UocHJvcCwgb3JpZ0luZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld1ZhbEluZCA8IG5ld1ZhbC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMucHVzaChwcm9wLCAuLi5uZXdWYWwuc2xpY2UobmV3VmFsSW5kKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBUaGUgVGZEb21SZXBlYXRCZWhhdmlvciByZS1pbXBsZW1lbnRzIHBhcnQgb2YgdGhlIGRvbS1yZXBlYXQgdGVtcGxhdGUuCiAgICAgKiBJdCBjYW4gYmUgYXBwbGllZCB0byBhbnkgUG9seW1lciBjb21wb25lbnRzIHRvIG1ha2UgaXQgZG9tLXJlcGVhdC1saWtlLgogICAgICogVGhlIG1ham9yIGRpc2NyZXBlbmN5IGlzIGluIHN5bnRheCB3aGVuIHVzaW5nOgogICAgICoKICAgICAqICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0Ij4KICAgICAqICAgICAuLi4KICAgICAqICAgPC90ZW1wbGF0ZT4KICAgICAqICAgLy8gdmVyc3VzCiAgICAgKiAgIDxmb28tY29tcD4KICAgICAqICAgICA8dGVtcGxhdGU+CiAgICAgKiAgICAgICAuLi4KICAgICAqICAgICA8L3RlbXBsYXRlPgogICAgICogICA8L2Zvby1jb21wPgogICAgICoKICAgICAqIFdoZW4gaW1wbGVtZW50aW5nIHRoZSBiZWhhdmlvciwgdGhlIFBvbHltZXIgY29tcG9uZW50IGhhcyB0byBpbnZva2UKICAgICAqIGB0aGlzLnVwZGF0ZURvbShuZXdJdGVtcylgLiBPdGhlciBwcm90ZWN0ZWQgQVBJcyBhcmUgYHNldEdldEl0ZW1LZXlgIGFuZAogICAgICogYHNldENhY2hlU2l6ZWAgKHBsZWFzZSBzZWUgcmVzcGVjdGl2ZSBkb2MgZm9yIGRldGFpbHMpLgogICAgICovCiAgICBjbGFzcyBUZkRvbVJlcGVhdCBleHRlbmRzIEFycmF5VXBkYXRlSGVscGVyIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5hcyA9ICdpdGVtJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgYWxsIHN0YW1wZWQgaXRlbXMgYXJlIGFjdGl2ZSBvciBub3QuCiAgICAgICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRBY3RpdmUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kb21Cb290c3RyYXBwZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY3RvciA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIGxpc3Qgb2YgcmVuZGVyZWQgYW5kIG1vdW50ZWQgaXRlbXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlZEl0ZW1zID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIG1hcCBvZiBzdGFtcGVkIGNoaWxkIGNvbXBvbmVudHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZW4gaXRlbSBpcyByZW1vdmVkLCBpdCBpcyBwbGFjZWQgaW4gYSBjYWNoZSBhbmQgdGhlIG9sZGVzdCBpdGVtIGdldHMKICAgICAgICAgICAgICogcmVtb3ZlZCB3aGVuIExSVSBncm93cyBtb3JlIHRoYW4gc2l6ZSBvZiB0aGUgMnhfbGltaXQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9scnVDYWNoZWRJdGVtcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5fY2FjaGVTaXplID0gMTA7CiAgICAgICAgICAgIHRoaXMuX2dldEl0ZW1LZXkgPSAoaXRlbSkgPT4gSlNPTi5zdHJpbmdpZnkoaXRlbSk7CiAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgICB0aGlzLl9pc0Nvbm5lY3RlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHNpemUgb2YgdGhlIERPTSBjYWNoZSB1c2VkIGZvciBvcHRpbWl6aW5nIHBlcmZvcm1hbmNlLiBUaGUKICAgICAgICAgKiBkZWZhdWx0IGNhY2hlIHNpemUgaXMgMTAuCiAgICAgICAgICovCiAgICAgICAgc2V0Q2FjaGVTaXplKHNpemUpIHsKICAgICAgICAgICAgdGhpcy5fY2FjaGVTaXplID0gc2l6ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBnZXRJdGVtS2V5LCBhIGZ1bmN0aW9uIHRoYXQgcmVxdWlyZXMgYSB1bmlxdWUgaWRlbnRpZmllciBmb3IgYW4KICAgICAgICAgKiBpdGVtLiBJdCBpcyB1c2VkIHRvIG9wdGltaXplIHBlcmZvcm1hbmNlIG9mIHJlZHJhd3MuIFRoZSBkZWZhdWx0IGlzCiAgICAgICAgICogSlNPTi5zdHJpbmdpZnkoaXRlbSkuCiAgICAgICAgICovCiAgICAgICAgc2V0R2V0SXRlbUtleShnZXRJdGVtS2V5KSB7CiAgICAgICAgICAgIHRoaXMuX2dldEl0ZW1LZXkgPSBnZXRJdGVtS2V5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIERPTSB0byByZWZsZWN0IGNoYW5nZXMgaW4gYGl0ZW1zYC4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVEb20oaXRlbXMpIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVBcnJheVByb3AoJ19yZW5kZXJlZEl0ZW1zJywgaXRlbXMsIHRoaXMuX2dldEl0ZW1LZXkpOwogICAgICAgIH0KICAgICAgICBfZW5zdXJlVGVtcGxhdGl6ZWQoKSB7CiAgICAgICAgICAgIC8vIFBvbHltZXIgaXMgbm90IHJlYWR5IChhbmQgcHJvcHMvRE9NIGZvciB0aGUgY29tcG9uZW50cyBhcmUgbm90CiAgICAgICAgICAgIC8vIHBvcHVsYXRlZCkKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQ29ubmVjdGVkKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMuX2N0b3IpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlTm9kZSA9IHRoaXMucXVlcnlTZWxlY3RvcigndGVtcGxhdGUnKTsKICAgICAgICAgICAgICAgIHRoaXMuX2N0b3IgPSB0ZW1wbGF0aXplKHRlbXBsYXRlTm9kZSwgdGhpcywgewogICAgICAgICAgICAgICAgICAgIHBhcmVudE1vZGVsOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGluc3RhbmNlUHJvcHM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXMuYXNdOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHRoaXMuX2NvbnRlbnRBY3RpdmUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uIChwcm9wLCB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5mb3JFYWNoKChpbnN0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0LmZvcndhcmRIb3N0UHJvcChwcm9wLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX2Jvb3RzdHJhcERvbSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9lbnN1cmVUZW1wbGF0aXplZCgpIHx8IHRoaXMuX2RvbUJvb3RzdHJhcHBlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IE11dGF0aW9uT2JzZXJ2ZXIoKG11dGF0aW9uc0xpc3QpID0+IHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbXV0YXRpb24gb2YgbXV0YXRpb25zTGlzdCkgewogICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlID09PSAnY2hpbGRMaXN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG5vZGUgb2YgQXJyYXkuZnJvbShtdXRhdGlvbi5hZGRlZE5vZGVzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUoJ3Nsb3QnLCAnaXRlbXMnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIG9ic2VydmVyLm9ic2VydmUodGhpcywgeyBjaGlsZExpc3Q6IHRydWUgfSk7CiAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy5jaGlsZHJlbikuZm9yRWFjaCgoY2hpbGQpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2hpbGQoY2hpbGQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRJdGVtcy5mb3JFYWNoKChpdGVtLCBpbmRleCkgPT4gdGhpcy5faW5zZXJ0SXRlbShpdGVtLCBpbmRleCkpOwogICAgICAgICAgICB0aGlzLl9kb21Cb290c3RyYXBwZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBfdXBkYXRlQWN0aXZlKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2RvbUJvb3RzdHJhcHBlZCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC52YWx1ZXMoKSkuZm9yRWFjaCgoaW5zdCkgPT4gewogICAgICAgICAgICAgICAgaW5zdC5ub3RpZnlQYXRoKCdhY3RpdmUnLCB0aGlzLl9jb250ZW50QWN0aXZlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVEb20oZXZlbnQgLy8gUG9seW1lckRlZXBQcm9wZXJ0eUNoYW5nZTxULCBQb2x5bWVyU3BsaWNlQ2hhbmdlPFRbXT4+CiAgICAgICAgKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZG9tQm9vdHN0cmFwcGVkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAvLyBUaGVzZSBhcmUgdW5pbnRlcmVzdGluZy4KICAgICAgICAgICAgaWYgKGV2ZW50LnBhdGggPT0gJ19yZW5kZXJlZEl0ZW1zJyB8fAogICAgICAgICAgICAgICAgZXZlbnQucGF0aCA9PSAnX3JlbmRlcmVkSXRlbXMubGVuZ3RoJykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChldmVudC5wYXRoID09PSAnX3JlbmRlcmVkSXRlbXMuc3BsaWNlcycpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudmFsdWU7IC8vIFBvbHltZXJTcGxpY2VDaGFuZ2U8VFtdPjsKICAgICAgICAgICAgICAgIHZhbHVlLmluZGV4U3BsaWNlcy5mb3JFYWNoKChzcGxpY2UpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGluZGV4LCBhZGRlZENvdW50LCBvYmplY3QsIHJlbW92ZWQgfSA9IHNwbGljZTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVkLmZvckVhY2goKGl0ZW0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlSXRlbShpdGVtLCB0aGlzLmNoaWxkcmVuW2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgb2JqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgIC5zbGljZShpbmRleCwgaW5kZXggKyBhZGRlZENvdW50KQogICAgICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoaXRlbSwgaW5kKSA9PiB0aGlzLl9pbnNlcnRJdGVtKGl0ZW0sIGluZGV4ICsgaW5kKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJpbUNhY2hlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RhbXBlZCBhbmQgbW91bnRlZCBET00gbW9kZWwgYnkgbm90aWZ5aW5nLgogICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0SXRlbUtleShldmVudC52YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFRlbXBsYXRlSW5zdC5nZXQoa2V5KS5ub3RpZnlQYXRoKHRoaXMuYXMsIGV2ZW50LnZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihgRXhwZWN0ZWQgJyR7a2V5fScgdG8gZXhpc3QgaW4gdGhlIERPTSBidXQgYCArIGBjb3VsZCBub3QgZmluZCBvbmUuYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2luc2VydEl0ZW0oaXRlbSwgYXRJbmRleCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2Vuc3VyZVRlbXBsYXRpemVkKCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdGVtcGxhdGl6ZWQgYmVmb3JlIGluc2VydGluZyBhbiBpdGVtJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGZyYWdPckVsOwogICAgICAgICAgICBjb25zdCBrZXkgPSB0aGlzLl9nZXRJdGVtS2V5KGl0ZW0pOwogICAgICAgICAgICBpZiAodGhpcy5fbHJ1Q2FjaGVkSXRlbXMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgIGZyYWdPckVsID0gdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuZ2V0KGtleSk7CiAgICAgICAgICAgICAgICB0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0CiAgICAgICAgICAgICAgICAgICAgLmdldChrZXkpCiAgICAgICAgICAgICAgICAgICAgLm5vdGlmeVBhdGgoJ2FjdGl2ZScsIHRoaXMuX2NvbnRlbnRBY3RpdmUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgcHJvcCA9IHsgW3RoaXMuYXNdOiBpdGVtLCBhY3RpdmU6IHRoaXMuX2NvbnRlbnRBY3RpdmUgfTsKICAgICAgICAgICAgICAgIGNvbnN0IGluc3QgPSBuZXcgdGhpcy5fY3Rvcihwcm9wKTsKICAgICAgICAgICAgICAgIGZyYWdPckVsID0gaW5zdC5yb290OwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3Quc2V0KGtleSwgaW5zdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuY2hpbGRyZW5bYXRJbmRleF0pIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5zZXJ0QmVmb3JlKGZyYWdPckVsLCB0aGlzLmNoaWxkcmVuW2F0SW5kZXhdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVscyA9IGZyYWdPckVsLm5vZGVUeXBlID09IE5vZGUuRE9DVU1FTlRfRlJBR01FTlRfTk9ERQogICAgICAgICAgICAgICAgICAgID8gQXJyYXkuZnJvbShmcmFnT3JFbC5jaGlsZHJlbikKICAgICAgICAgICAgICAgICAgICA6IFtmcmFnT3JFbF07CiAgICAgICAgICAgICAgICBlbHMuZm9yRWFjaCgoZWwpID0+IGVsLnNldEF0dHJpYnV0ZSgnc2xvdCcsICdpdGVtcycpKTsKICAgICAgICAgICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoZnJhZ09yRWwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9yZW1vdmVJdGVtKGl0ZW0sIG5vZGUpIHsKICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkKICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5fZ2V0SXRlbUtleShpdGVtKTsKICAgICAgICAgICAgdGhpcy5fbHJ1Q2FjaGVkSXRlbXMuc2V0KGtleSwgbm9kZSk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkVGVtcGxhdGVJbnN0LmdldChrZXkpLm5vdGlmeVBhdGgoJ2FjdGl2ZScsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgX3RyaW1DYWNoZSgpIHsKICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2xydUNhY2hlZEl0ZW1zLnNpemUgPiB0aGlzLl9jYWNoZVNpemUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IFtmaXJzdEtleV0gPSB0aGlzLl9scnVDYWNoZWRJdGVtcy5rZXlzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9scnVDYWNoZWRJdGVtcy5kZWxldGUoZmlyc3RLZXkpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRUZW1wbGF0ZUluc3QuZGVsZXRlKGZpcnN0S2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZEb21SZXBlYXQucHJvdG90eXBlLCAiYXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZEb21SZXBlYXQucHJvdG90eXBlLCAiaXRlbXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmRG9tUmVwZWF0LnByb3RvdHlwZSwgIl9jb250ZW50QWN0aXZlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmRG9tUmVwZWF0LnByb3RvdHlwZSwgIl9kb21Cb290c3RyYXBwZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfY3RvciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfcmVuZGVyZWRJdGVtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmRG9tUmVwZWF0LnByb3RvdHlwZSwgIl9yZW5kZXJlZFRlbXBsYXRlSW5zdCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmRG9tUmVwZWF0LnByb3RvdHlwZSwgIl9scnVDYWNoZWRJdGVtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmRG9tUmVwZWF0LnByb3RvdHlwZSwgIl9jYWNoZVNpemUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfZ2V0SXRlbUtleSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfaXNDb25uZWN0ZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX2lzQ29ubmVjdGVkJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfYm9vdHN0cmFwRG9tIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdfY29udGVudEFjdGl2ZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZEb21SZXBlYXQucHJvdG90eXBlLCAiX3VwZGF0ZUFjdGl2ZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX3JlbmRlcmVkSXRlbXMuKicsICdfZG9tQm9vdHN0cmFwcGVkJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbT2JqZWN0XSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfdXBkYXRlRG9tIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdfY2FjaGVTaXplJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkRvbVJlcGVhdC5wcm90b3R5cGUsICJfdHJpbUNhY2hlIiwgbnVsbCk7CgogICAgLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcgPSBjbGFzcyBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldyBleHRlbmRzIFRmRG9tUmVwZWF0IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlUGFnaW5hdGlvbiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmdldENhdGVnb3J5SXRlbUtleSA9IChpdGVtKSA9PiBKU09OLnN0cmluZ2lmeShpdGVtKTsKICAgICAgICAgICAgdGhpcy5fbGltaXQgPSAxMjsKICAgICAgICAgICAgdGhpcy5fYWN0aXZlSW5kZXggPSAwOwogICAgICAgICAgICB0aGlzLl9wYWdlSW5wdXRSYXdWYWx1ZSA9ICcnOwogICAgICAgICAgICB0aGlzLl9wYWdlSW5wdXRGb2N1c2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlQ291bnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9oYXNNdWx0aXBsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ID4gMTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZVBhbmUoKSB7CiAgICAgICAgICAgIHRoaXMub3BlbmVkID0gIXRoaXMub3BlbmVkOwogICAgICAgIH0KICAgICAgICBfY2hhbmdlQ29udGVudEFjdGl2ZShvcGVuZWQpIHsKICAgICAgICAgICAgdGhpcy5fY29udGVudEFjdGl2ZSA9IG9wZW5lZDsKICAgICAgICB9CiAgICAgICAgX29uUGFuZVJlbmRlcmVkQ2hhbmdlZChuZXdSZW5kZXJlZCwgb2xkUmVuZGVyZWQpIHsKICAgICAgICAgICAgaWYgKG5ld1JlbmRlcmVkICYmIG5ld1JlbmRlcmVkICE9PSBvbGRSZW5kZXJlZCkgewogICAgICAgICAgICAgICAgLy8gRm9yY2UgZG9tLWlmIHJlbmRlciB3aXRob3V0IHdhaXRpbmcgZm9yIG9uZSByQUYuCiAgICAgICAgICAgICAgICB0aGlzLiQuaWZSZW5kZXJlZC5yZW5kZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfY29tcHV0ZVBhbmVSZW5kZXJlZChjYXRlZ29yeSkgewogICAgICAgICAgICAvLyBTaG93IGEgY2F0ZWdvcnkgdW5sZXNzIGl0J3MgYSBzZWFyY2ggcmVzdWx0cyBjYXRlZ29yeSB3aGVyZQogICAgICAgICAgICAvLyB0aGVyZSB3YXNuJ3QgYWN0dWFsbHkgYSBzZWFyY2ggcXVlcnkuCiAgICAgICAgICAgIHJldHVybiAhKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUgPT09IENhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUyAmJgogICAgICAgICAgICAgICAgY2F0ZWdvcnkubmFtZSA9PT0gJycpOwogICAgICAgIH0KICAgICAgICBnZXQgX2l0ZW1zUmVuZGVyZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYW5lUmVuZGVyZWQgJiYgdGhpcy5vcGVuZWQ7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlSXNTZWFyY2hSZXN1bHRzKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT09IENhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUzsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVJc0ludmFsaWRTZWFyY2hSZXN1bHRzKG1ldGFkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAobWV0YWRhdGEudHlwZSA9PT0gQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTICYmICFtZXRhZGF0YS52YWxpZFJlZ2V4KTsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVJc1VuaXZlcnNhbFNlYXJjaFF1ZXJ5KG1ldGFkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiAobWV0YWRhdGEudHlwZSA9PT0gQ2F0ZWdvcnlUeXBlLlNFQVJDSF9SRVNVTFRTICYmIG1ldGFkYXRhLnVuaXZlcnNhbFJlZ2V4KTsKICAgICAgICB9CiAgICAgICAgX2lzQ29tcG9zaXRlU2VhcmNoKCkgewogICAgICAgICAgICBjb25zdCB7IHR5cGUsIGNvbXBvc2l0ZVNlYXJjaCB9ID0gdGhpcy5jYXRlZ29yeS5tZXRhZGF0YTsKICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2l0ZVNlYXJjaCAmJiB0eXBlID09PSBDYXRlZ29yeVR5cGUuU0VBUkNIX1JFU1VMVFM7CiAgICAgICAgfQogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgICB0aGlzLm9wZW5lZCA9IHRoaXMuaW5pdGlhbE9wZW5lZCA9PSBudWxsID8gdHJ1ZSA6IHRoaXMuaW5pdGlhbE9wZW5lZDsKICAgICAgICAgICAgdGhpcy5fbGltaXRMaXN0ZW5lciA9ICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfbGltaXQnLCBnZXRMaW1pdCgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYWRkTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKTsKICAgICAgICAgICAgdGhpcy5fbGltaXRMaXN0ZW5lcigpOwogICAgICAgIH0KICAgICAgICBkZXRhY2hlZCgpIHsKICAgICAgICAgICAgcmVtb3ZlTGltaXRMaXN0ZW5lcih0aGlzLl9saW1pdExpc3RlbmVyKTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZVJlbmRlcmVkSXRlbXMoKSB7CiAgICAgICAgICAgIHZhciBpdGVtc1JlbmRlcmVkID0gdGhpcy5faXRlbXNSZW5kZXJlZDsKICAgICAgICAgICAgdmFyIGxpbWl0ID0gdGhpcy5fbGltaXQ7CiAgICAgICAgICAgIHZhciBhY3RpdmVJbmRleCA9IHRoaXMuX2FjdGl2ZUluZGV4OwogICAgICAgICAgICB2YXIgZGlzYWJsZVBhZ2luYXRpb24gPSB0aGlzLmRpc2FibGVQYWdpbmF0aW9uOwogICAgICAgICAgICBpZiAoIWl0ZW1zUmVuZGVyZWQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZVBhZ2VJbmRleCA9IE1hdGguZmxvb3IoYWN0aXZlSW5kZXggLyBsaW1pdCk7CiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5jYXRlZ29yeS5pdGVtcyB8fCBbXTsKICAgICAgICAgICAgY29uc3QgZG9tSXRlbXMgPSBkaXNhYmxlUGFnaW5hdGlvbgogICAgICAgICAgICAgICAgPyBpdGVtcwogICAgICAgICAgICAgICAgOiBpdGVtcy5zbGljZShhY3RpdmVQYWdlSW5kZXggKiBsaW1pdCwgKGFjdGl2ZVBhZ2VJbmRleCArIDEpICogbGltaXQpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZURvbShkb21JdGVtcyk7CiAgICAgICAgfQogICAgICAgIF9saW1pdENoYW5nZWQobGltaXQpIHsKICAgICAgICAgICAgdGhpcy5zZXRDYWNoZVNpemUobGltaXQgKiAyKTsKICAgICAgICB9CiAgICAgICAgX2dldENhdGVnb3J5SXRlbUtleUNoYW5nZWQoKSB7CiAgICAgICAgICAgIHRoaXMuc2V0R2V0SXRlbUtleSh0aGlzLmdldENhdGVnb3J5SXRlbUtleSk7CiAgICAgICAgfQogICAgICAgIGdldCBfY3VycmVudFBhZ2UoKSB7CiAgICAgICAgICAgIHZhciBsaW1pdCA9IHRoaXMuX2xpbWl0OwogICAgICAgICAgICB2YXIgYWN0aXZlSW5kZXggPSB0aGlzLl9hY3RpdmVJbmRleDsKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoYWN0aXZlSW5kZXggLyBsaW1pdCkgKyAxOwogICAgICAgIH0KICAgICAgICBfY29tcHV0ZVBhZ2VDb3VudChfLCBsaW1pdCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jYXRlZ29yeSA/IE1hdGguY2VpbCh0aGlzLmNhdGVnb3J5Lml0ZW1zLmxlbmd0aCAvIGxpbWl0KSA6IDA7CiAgICAgICAgfQogICAgICAgIGdldCBfbXVsdGlwbGVQYWdlc0V4aXN0KCkgewogICAgICAgICAgICB2YXIgcGFnZUNvdW50ID0gdGhpcy5fcGFnZUNvdW50OwogICAgICAgICAgICB2YXIgZGlzYWJsZVBhZ2luYXRpb24gPSB0aGlzLmRpc2FibGVQYWdpbmF0aW9uOwogICAgICAgICAgICByZXR1cm4gIWRpc2FibGVQYWdpbmF0aW9uICYmIHBhZ2VDb3VudCA+IDE7CiAgICAgICAgfQogICAgICAgIGdldCBfaGFzUHJldmlvdXNQYWdlKCkgewogICAgICAgICAgICB2YXIgY3VycmVudFBhZ2UgPSB0aGlzLl9jdXJyZW50UGFnZTsKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRQYWdlID4gMTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9oYXNOZXh0UGFnZSgpIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnRQYWdlID0gdGhpcy5fY3VycmVudFBhZ2U7CiAgICAgICAgICAgIHZhciBwYWdlQ291bnQgPSB0aGlzLl9wYWdlQ291bnQ7CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UGFnZSA8IHBhZ2VDb3VudDsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVJbnB1dFdpZHRoKHBhZ2VDb3VudCkgewogICAgICAgICAgICAvLyBBZGQgMjBweCBmb3IgdGhlICsvLSBhcnJvd3MgYWRkZWQgYnkgYnJvd3NlcnMuCiAgICAgICAgICAgIHJldHVybiBgY2FsYygke3BhZ2VDb3VudC50b1N0cmluZygpLmxlbmd0aH1lbSArIDIwcHgpYDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlIF9hY3RpdmVJbmRleCwgbWFpbnRhaW5pbmcgaXRzIHJhbmdlIGludmFyaWFudC4KICAgICAgICAgKi8KICAgICAgICBfc2V0QWN0aXZlSW5kZXgoaW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgbWF4SW5kZXggPSAodGhpcy5jYXRlZ29yeS5pdGVtcyB8fCBbXSkubGVuZ3RoIC0gMTsKICAgICAgICAgICAgaWYgKGluZGV4ID4gbWF4SW5kZXgpIHsKICAgICAgICAgICAgICAgIGluZGV4ID0gbWF4SW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2V0KCdfYWN0aXZlSW5kZXgnLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIF9jbGFtcEFjdGl2ZUluZGV4KCkgewogICAgICAgICAgICB0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCk7CiAgICAgICAgfQogICAgICAgIF9wZXJmb3JtUHJldmlvdXNQYWdlKCkgewogICAgICAgICAgICB0aGlzLl9zZXRBY3RpdmVJbmRleCh0aGlzLl9hY3RpdmVJbmRleCAtIHRoaXMuX2xpbWl0KTsKICAgICAgICB9CiAgICAgICAgX3BlcmZvcm1OZXh0UGFnZSgpIHsKICAgICAgICAgICAgdGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fYWN0aXZlSW5kZXggKyB0aGlzLl9saW1pdCk7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlUGFnZUlucHV0VmFsdWUoZm9jdXNlZCwgcmF3VmFsdWUsIGN1cnJlbnRQYWdlKSB7CiAgICAgICAgICAgIHJldHVybiBmb2N1c2VkID8gcmF3VmFsdWUgOiBjdXJyZW50UGFnZS50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlUGFnZUlucHV0RXZlbnQoZSkgewogICAgICAgICAgICB0aGlzLnNldCgnX3BhZ2VJbnB1dFJhd1ZhbHVlJywgZS50YXJnZXQudmFsdWUpOwogICAgICAgICAgICBjb25zdCBvbmVJbmRleGVkUGFnZSA9IE51bWJlcihlLnRhcmdldC52YWx1ZSB8fCBOYU4pOwogICAgICAgICAgICBpZiAoaXNOYU4ob25lSW5kZXhlZFBhZ2UpKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBwYWdlID0gTWF0aC5tYXgoMSwgTWF0aC5taW4ob25lSW5kZXhlZFBhZ2UsIHRoaXMuX3BhZ2VDb3VudCkpIC0gMTsKICAgICAgICAgICAgdGhpcy5fc2V0QWN0aXZlSW5kZXgodGhpcy5fbGltaXQgKiBwYWdlKTsKICAgICAgICB9CiAgICAgICAgX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCgpIHsKICAgICAgICAgICAgLy8gT2NjdXJzIG9uIEVudGVyLCBldGMuIENvbW1pdCB0aGUgdHJ1ZSBzdGF0ZS4KICAgICAgICAgICAgdGhpcy5zZXQoJ19wYWdlSW5wdXRSYXdWYWx1ZScsIHRoaXMuX2N1cnJlbnRQYWdlLnRvU3RyaW5nKCkpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlUGFnZUZvY3VzRXZlbnQoKSB7CiAgICAgICAgICAgIC8vIERpc2NhcmQgYW55IG9sZCAob3IgdW5pbml0aWFsaXplZCkgc3RhdGUgYmVmb3JlIHdlIGdyYW50IGZvY3VzLgogICAgICAgICAgICB0aGlzLnNldCgnX3BhZ2VJbnB1dFJhd1ZhbHVlJywgdGhpcy5fcGFnZUlucHV0VmFsdWUpOwogICAgICAgICAgICB0aGlzLnNldCgnX3BhZ2VJbnB1dEZvY3VzZWQnLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgX2hhbmRsZVBhZ2VCbHVyRXZlbnQoKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfcGFnZUlucHV0Rm9jdXNlZCcsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZVBhZ2VJbnB1dFZhbHVlKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIC8vIEZvcmNlIHR3by13YXkgYmluZGluZy4KICAgICAgICAgICAgY29uc3QgcGFnZUlucHV0ID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJyNwYWdlLWlucHV0IGlucHV0Jyk7CiAgICAgICAgICAgIGlmIChwYWdlSW5wdXQpIHsKICAgICAgICAgICAgICAgIHBhZ2VJbnB1dC52YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF91cGRhdGVJbnB1dFdpZHRoKCkgewogICAgICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcyh7CiAgICAgICAgICAgICAgICAnLS10Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldy1wYWdlLWlucHV0LXdpZHRoJzogdGhpcy5faW5wdXRXaWR0aCwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIFRmQ2F0ZWdvcnlQYWdpbmF0ZWRWaWV3LnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3BhbmVSZW5kZXJlZF1dIiBpZD0iaWZSZW5kZXJlZCI+CiAgICAgIDxidXR0b24gY2xhc3M9ImhlYWRpbmciIG9uLXRhcD0iX3RvZ2dsZVBhbmUiIG9wZW4tYnV0dG9uJD0iW1tvcGVuZWRdXSI+CiAgICAgICAgPHNwYW4gY2xhc3M9Im5hbWUiPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1NlYXJjaFJlc3VsdHNdXSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuPlRhZ3MgbWF0Y2hpbmcgbXVsdGlwbGUgZXhwZXJpbWVudHM8L3NwYW4+CiAgICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0ludmFsaWRTZWFyY2hSZXN1bHRzXV0iPgogICAgICAgICAgICAgICAgPHNwYW4KICAgICAgICAgICAgICAgICAgPiZuYnNwOzxzdHJvbmc+KG1hbGZvcm1lZCByZWd1bGFyIGV4cHJlc3Npb24pPC9zdHJvbmc+PC9zcGFuCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfaXNDb21wb3NpdGVTZWFyY2goY2F0ZWdvcnkpXV0iPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+VGFncyBtYXRjaGluZyAvPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1uYW1lIiB0aXRsZSQ9IltbY2F0ZWdvcnkubmFtZV1dIgogICAgICAgICAgICAgICAgPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJsaWdodCI+Lzwvc3Bhbj4KICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzVW5pdmVyc2FsU2VhcmNoUXVlcnldXSI+CiAgICAgICAgICAgICAgICA8c3Bhbj4gKGFsbCB0YWdzKTwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNJbnZhbGlkU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgICAgIDxzcGFuPiA8c3Ryb25nPihtYWxmb3JtZWQgcmVndWxhciBleHByZXNzaW9uKTwvc3Ryb25nPjwvc3Bhbj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzU2VhcmNoUmVzdWx0c11dIj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LW5hbWUiIHRpdGxlJD0iW1tjYXRlZ29yeS5uYW1lXV0iCiAgICAgICAgICAgICAgPltbY2F0ZWdvcnkubmFtZV1dPC9zcGFuCiAgICAgICAgICAgID4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudCI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlXV0iPgogICAgICAgICAgICA8c3Bhbj5bW19jb3VudF1dPC9zcGFuPgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZXhwYW5kLW1vcmUiIGNsYXNzPSJleHBhbmQtYXJyb3ciPjwvaXJvbi1pY29uPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9idXR0b24+CiAgICAgIDwhLS0gVE9ETyhzdGVwaGFud2xlZSk6IGludmVzdGlnYXRlIGZ1cnRoZXIuIEZvciBzb21lIHJlYXNvbiwKICAgICAgICB0cmFuc2l0aW9uZW5kIHRoYXQgdGhlIGlyb24tY29sbGFwc2UgcmVsaWVzIG9uIHNvbWV0aW1lcyBkb2VzIG5vdAogICAgICAgIHRyaWdnZXIgd2hlbiByZW5kZXJpbmcgYSBjaGFydCB3aXRoIGEgc3Bpbm5lci4gQSB0b3kgZXhhbXBsZSBjYW5ub3QKICAgICAgICByZXByb2R1Y2UgdGhpcyBidWcuIC0tPgogICAgICA8aXJvbi1jb2xsYXBzZSBvcGVuZWQ9Iltbb3BlbmVkXV0iIG5vLWFuaW1hdGlvbj0iIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgICAgIDxzcGFuIGlkPSJ0b3Atb2YtY29udGFpbmVyIj48L3NwYW4+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX211bHRpcGxlUGFnZXNFeGlzdF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi1ib3R0b206IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIgogICAgICAgICAgICAgICAgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iCiAgICAgICAgICAgICAgICA+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iCiAgICAgICAgICAgICAgICA+TmV4dCBwYWdlPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8ZGl2IGlkPSJpdGVtcyI+CiAgICAgICAgICAgIDxzbG90IG5hbWU9Iml0ZW1zIj48L3Nsb3Q+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbXVsdGlwbGVQYWdlc0V4aXN0XV0iPgogICAgICAgICAgICA8ZGl2IGlkPSJjb250cm9scy1jb250YWluZXIiPgogICAgICAgICAgICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGlubGluZS1ibG9jazsgcGFkZGluZzogMCA1cHgiPgogICAgICAgICAgICAgICAgUGFnZQogICAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICAgIGlkPSJwYWdlLWlucHV0IgogICAgICAgICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgICAgICAgICAgICAgIG1pbj0iMSIKICAgICAgICAgICAgICAgICAgbWF4PSJbW19wYWdlQ291bnRdXSIKICAgICAgICAgICAgICAgICAgdmFsdWU9IltbX3BhZ2VJbnB1dFZhbHVlXV0iCiAgICAgICAgICAgICAgICAgIG9uLWlucHV0PSJfaGFuZGxlUGFnZUlucHV0RXZlbnQiCiAgICAgICAgICAgICAgICAgIG9uLWNoYW5nZT0iX2hhbmRsZVBhZ2VDaGFuZ2VFdmVudCIKICAgICAgICAgICAgICAgICAgb24tZm9jdXM9Il9oYW5kbGVQYWdlRm9jdXNFdmVudCIKICAgICAgICAgICAgICAgICAgb24tYmx1cj0iX2hhbmRsZVBhZ2VCbHVyRXZlbnQiCiAgICAgICAgICAgICAgICA+PC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgICAgIG9mIFtbX3BhZ2VDb3VudF1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgICAgPGRpdiBjbGFzcz0iYmlnLXBhZ2UtYnV0dG9ucyIgc3R5bGU9Im1hcmdpbi10b3A6IDEwcHg7Ij4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBvbi10YXA9Il9wZXJmb3JtUHJldmlvdXNQYWdlIgogICAgICAgICAgICAgICAgZGlzYWJsZWQkPSJbWyFfaGFzUHJldmlvdXNQYWdlXV0iCiAgICAgICAgICAgICAgICA+UHJldmlvdXMgcGFnZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIG9uLXRhcD0iX3BlcmZvcm1OZXh0UGFnZSIKICAgICAgICAgICAgICAgIGRpc2FibGVkJD0iW1shX2hhc05leHRQYWdlXV0iCiAgICAgICAgICAgICAgICA+TmV4dCBwYWdlPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1hcmdpbjogMCA1cHggMXB4IDEwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KDpmaXJzdC1vZi10eXBlKSB7CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgfQoKICAgICAgOmhvc3QoOmxhc3Qtb2YtdHlwZSkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7CiAgICAgIH0KCiAgICAgIC5oZWFkaW5nIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXI6IG5vbmU7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGZvbnQtc2l6ZTogMTVweDsKICAgICAgICBsaW5lLWhlaWdodDogMTsKICAgICAgICBib3gtc2hhZG93OiAwIDFweCA1cHggcmdiYSgwLCAwLCAwLCAwLjIpOwogICAgICAgIHBhZGRpbmc6IDEwcHggMTVweDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICBbb3Blbi1idXR0b25dIHsKICAgICAgICBib3JkZXItYm90dG9tLWxlZnQtcmFkaXVzOiAwICFpbXBvcnRhbnQ7CiAgICAgICAgYm9yZGVyLWJvdHRvbS1yaWdodC1yYWRpdXM6IDAgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgW29wZW4tYnV0dG9uXSAuZXhwYW5kLWFycm93IHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZVooMTgwZGVnKTsKICAgICAgfQoKICAgICAgLm5hbWUgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1mbGV4OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIC5saWdodCB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktNTAwKTsKICAgICAgfQoKICAgICAgLmNhdGVnb3J5LW5hbWUgewogICAgICAgIHdoaXRlLXNwYWNlOiBwcmU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB0ZXh0LW92ZXJmbG93OiBlbGxpcHNpczsKICAgICAgICBwYWRkaW5nOiAycHggMDsKICAgICAgfQoKICAgICAgLmNvdW50IHsKICAgICAgICBtYXJnaW46IDAgNXB4OwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS01MDApOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBmbGV4OiBub25lOwogICAgICB9CgogICAgICAuaGVhZGluZzo6LW1vei1mb2N1cy1pbm5lciB7CiAgICAgICAgcGFkZGluZzogMTBweCAxNXB4OwogICAgICB9CgogICAgICAuY29udGVudCB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGJhY2tncm91bmQ6IHdoaXRlOwogICAgICAgIGJvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6IDJweDsKICAgICAgICBib3JkZXItYm90dG9tLXJpZ2h0LXJhZGl1czogMnB4OwogICAgICAgIGJvcmRlci10b3A6IG5vbmU7CiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2RlZGVkZTsKICAgICAgICBwYWRkaW5nOiAxNXB4OwogICAgICB9CgogICAgICAubGlnaHQgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTUwMCk7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgewogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgICNjb250cm9scy1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIC5iaWctcGFnZS1idXR0b25zIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b24gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLXVpLWRhcmstYWNjZW50KTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgZmxleC1iYXNpczogMDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAuYmlnLXBhZ2UtYnV0dG9ucyBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICB9CgogICAgICBzbG90IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgICB9CgogICAgICA6OnNsb3R0ZWQoW3Nsb3Q9J2l0ZW1zJ10pIHsKICAgICAgICAvKiBUb29sdGlwIGZvciBkZXNjcmlwdGlvbnMgYW5kIG90aGVycyBicmVhayB3aXRoIG1vcmUgc3RyaWN0IG9uZXMuICovCiAgICAgICAgY29udGFpbjogc3R5bGU7CiAgICAgIH0KCiAgICAgICNwYWdlLWlucHV0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgICAgd2lkdGg6IHZhcigtLXRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3LXBhZ2UtaW5wdXQtd2lkdGgsIDEwMCUpOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmQ2F0ZWdvcnlQYWdpbmF0ZWRWaWV3LnByb3RvdHlwZSwgImNhdGVnb3J5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJpbml0aWFsT3BlbmVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ2F0ZWdvcnlQYWdpbmF0ZWRWaWV3LnByb3RvdHlwZSwgIm9wZW5lZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiZGlzYWJsZVBhZ2luYXRpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVDb3VudChjYXRlZ29yeS5pdGVtcy4qKScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfY291bnQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBjb21wdXRlZDogJ19jb21wdXRlUGFuZVJlbmRlcmVkKGNhdGVnb3J5KScsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX29uUGFuZVJlbmRlcmVkQ2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX3BhbmVSZW5kZXJlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVJc1NlYXJjaFJlc3VsdHMoY2F0ZWdvcnkubWV0YWRhdGEudHlwZSknLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ2F0ZWdvcnlQYWdpbmF0ZWRWaWV3LnByb3RvdHlwZSwgIl9pc1NlYXJjaFJlc3VsdHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBjb21wdXRlZDogJ19jb21wdXRlSXNJbnZhbGlkU2VhcmNoUmVzdWx0cyhjYXRlZ29yeS5tZXRhZGF0YSknLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ2F0ZWdvcnlQYWdpbmF0ZWRWaWV3LnByb3RvdHlwZSwgIl9pc0ludmFsaWRTZWFyY2hSZXN1bHRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgY29tcHV0ZWQ6ICdfY29tcHV0ZUlzVW5pdmVyc2FsU2VhcmNoUXVlcnkoY2F0ZWdvcnkubWV0YWRhdGEpJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfaXNVbml2ZXJzYWxTZWFyY2hRdWVyeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfZ2V0Q2F0ZWdvcnlJdGVtS2V5Q2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJnZXRDYXRlZ29yeUl0ZW1LZXkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX2xpbWl0Q2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfbGltaXQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfYWN0aXZlSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVQYWdlQ291bnQoY2F0ZWdvcnkuaXRlbXMuKiwgX2xpbWl0KScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfcGFnZUNvdW50Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBjb21wdXRlZDogJ19jb21wdXRlSW5wdXRXaWR0aChfcGFnZUNvdW50KScsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX3VwZGF0ZUlucHV0V2lkdGgnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX2lucHV0V2lkdGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVQYWdlSW5wdXRWYWx1ZShfcGFnZUlucHV0Rm9jdXNlZCwgX3BhZ2VJbnB1dFJhd1ZhbHVlLCBfY3VycmVudFBhZ2UpJywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfdXBkYXRlUGFnZUlucHV0VmFsdWUnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX3BhZ2VJbnB1dFZhbHVlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX3BhZ2VJbnB1dFJhd1ZhbHVlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfcGFnZUlucHV0Rm9jdXNlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX2NvdW50JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX2hhc011bHRpcGxlIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdvcGVuZWQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtCb29sZWFuXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfY2hhbmdlQ29udGVudEFjdGl2ZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ29wZW5lZCcsICdfcGFuZVJlbmRlcmVkJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX2l0ZW1zUmVuZGVyZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19pdGVtc1JlbmRlcmVkJywgJ2NhdGVnb3J5Lml0ZW1zLionLCAnX2xpbWl0JywgJ19hY3RpdmVJbmRleCcsICdfcGFnZUNvdW50JywgJ2Rpc2FibGVQYWdpbmF0aW9uJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfdXBkYXRlUmVuZGVyZWRJdGVtcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19saW1pdCcsICdfYWN0aXZlSW5kZXgnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlciksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmQ2F0ZWdvcnlQYWdpbmF0ZWRWaWV3LnByb3RvdHlwZSwgIl9jdXJyZW50UGFnZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19wYWdlQ291bnQnLCAnZGlzYWJsZVBhZ2luYXRpb24nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfbXVsdGlwbGVQYWdlc0V4aXN0IiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX2N1cnJlbnRQYWdlJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX2hhc1ByZXZpb3VzUGFnZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19jdXJyZW50UGFnZScsICdfcGFnZUNvdW50JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcucHJvdG90eXBlLCAiX2hhc05leHRQYWdlIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdjYXRlZ29yeS5pdGVtcy4qJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldy5wcm90b3R5cGUsICJfY2xhbXBBY3RpdmVJbmRleCIsIG51bGwpOwogICAgVGZDYXRlZ29yeVBhZ2luYXRlZFZpZXcgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldycpCiAgICBdLCBUZkNhdGVnb3J5UGFnaW5hdGVkVmlldyk7CgogICAgLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICsKICAgICtMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgICt5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICArWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAgICArCiAgICArICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogICAgKwogICAgK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgICtkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgK1dJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgICtsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgICs9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLy8gQSB1bmlxdWUgcmVmZXJlbmNlIHRvIGEgbGlzdGVuZXIgZm9yIGFuIGVhc2llciBkZXJlZmVyZW5jaW5nLgogICAgY2xhc3MgTGlzdGVuS2V5JDEgewogICAgICAgIGNvbnN0cnVjdG9yKGxpc3RlbmVyKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBCYXNlU3RvcmUgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLnJlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKDEgLyogc2ltdWx0YW5lb3VzIHJlcXVlc3QgKi8pOwogICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmVmcmVzaCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9hZCgpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIChudWxsYXJ5IGZ1bmN0aW9uKSB0byBiZSBjYWxsZWQgd2hlbiBuZXcgcnVucyBhcmUKICAgICAgICAgKiBhdmFpbGFibGUuCiAgICAgICAgICovCiAgICAgICAgYWRkTGlzdGVuZXIobGlzdGVuZXIpIHsKICAgICAgICAgICAgY29uc3Qga2V5ID0gbmV3IExpc3RlbktleSQxKGxpc3RlbmVyKTsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLmFkZChrZXkpOwogICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmUgYSBsaXN0ZW5lciByZWdpc3RlcmVkIHdpdGggYGFkZExpc3RlbmVyYC4KICAgICAgICAgKi8KICAgICAgICByZW1vdmVMaXN0ZW5lckJ5S2V5KGxpc3RlbktleSkgewogICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZGVsZXRlKGxpc3RlbktleSk7CiAgICAgICAgfQogICAgICAgIGVtaXRDaGFuZ2UoKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVycy5mb3JFYWNoKChsaXN0ZW5LZXkpID0+IHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdGVuS2V5Lmxpc3RlbmVyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSBleGNlcHRpb25zIG9uIHRoZSBsaXN0ZW5lciBzaWRlLgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBFbnZpcm9ubWVudFN0b3JlIGV4dGVuZHMgQmFzZVN0b3JlIHsKICAgICAgICBsb2FkKCkgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSb3V0ZXIoKS5lbnZpcm9ubWVudCgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHVybCkudGhlbigocmVzdWx0KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBlbnZpcm9ubWVudCA9IHsKICAgICAgICAgICAgICAgICAgICBkYXRhTG9jYXRpb246IHJlc3VsdC5kYXRhX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgIHdpbmRvd1RpdGxlOiByZXN1bHQud2luZG93X3RpdGxlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZXhwZXJpbWVudF9uYW1lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudC5leHBlcmltZW50TmFtZSA9IHJlc3VsdC5leHBlcmltZW50X25hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmV4cGVyaW1lbnRfZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbiA9IHJlc3VsdC5leHBlcmltZW50X2Rlc2NyaXB0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jcmVhdGlvbl90aW1lICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBlbnZpcm9ubWVudC5jcmVhdGlvblRpbWUgPSByZXN1bHQuY3JlYXRpb25fdGltZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNFcXVhbCh0aGlzLmVudmlyb25tZW50LCBlbnZpcm9ubWVudCkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdGhpcy5lbnZpcm9ubWVudCA9IGVudmlyb25tZW50OwogICAgICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBnZXREYXRhTG9jYXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50ID8gdGhpcy5lbnZpcm9ubWVudC5kYXRhTG9jYXRpb24gOiAnJzsKICAgICAgICB9CiAgICAgICAgZ2V0V2luZG93VGl0bGUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50ID8gdGhpcy5lbnZpcm9ubWVudC53aW5kb3dUaXRsZSA6ICcnOwogICAgICAgIH0KICAgICAgICBnZXRFeHBlcmltZW50TmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQgPyB0aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnROYW1lIDogJyc7CiAgICAgICAgfQogICAgICAgIGdldEV4cGVyaW1lbnREZXNjcmlwdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW52aXJvbm1lbnQgPyB0aGlzLmVudmlyb25tZW50LmV4cGVyaW1lbnREZXNjcmlwdGlvbiA6ICcnOwogICAgICAgIH0KICAgICAgICBnZXRDcmVhdGlvblRpbWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudmlyb25tZW50ID8gdGhpcy5lbnZpcm9ubWVudC5jcmVhdGlvblRpbWUgOiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IGVudmlyb25tZW50U3RvcmUgPSBuZXcgRW52aXJvbm1lbnRTdG9yZSgpOwoKICAgIC8qIENvcHlyaWdodCAyMDE3IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgUnVuc1N0b3JlIGV4dGVuZHMgQmFzZVN0b3JlIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5fcnVucyA9IFtdOwogICAgICAgIH0KICAgICAgICBsb2FkKCkgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSb3V0ZXIoKS5ydW5zKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKChuZXdSdW5zKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIWxvZGFzaC5pc0VxdWFsKHRoaXMuX3J1bnMsIG5ld1J1bnMpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcnVucyA9IG5ld1J1bnM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbWl0Q2hhbmdlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgbGlzdCBvZiBydW5zLiBJZiBubyBkYXRhIGlzIGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlCiAgICAgICAgICogYW4gZW1wdHkgYXJyYXkgKGkuZS4sIHRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gIm5vIHJ1bnMiIGFuZAogICAgICAgICAqICJubyBydW5zIHlldCIpLgogICAgICAgICAqLwogICAgICAgIGdldFJ1bnMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ydW5zLnNsaWNlKCk7CiAgICAgICAgfQogICAgfQogICAgY29uc3QgcnVuc1N0b3JlID0gbmV3IFJ1bnNTdG9yZSgpOwoKICAgIHZhciB2ZXJzaW9uJDEgPSAiNS43LjAiOwoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZyhhLCBiKSB7CiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBiaXNlY3Rvcihjb21wYXJlKSB7CiAgICAgIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IoY29tcGFyZSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOwogICAgICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsKICAgICAgICAgICAgZWxzZSBoaSA9IG1pZDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsbzsKICAgICAgICB9LAogICAgICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7CiAgICAgICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGxvOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdDb21wYXJhdG9yKGYpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHsKICAgICAgICByZXR1cm4gYXNjZW5kaW5nKGYoZCksIHgpOwogICAgICB9OwogICAgfQoKICAgIHZhciBhc2NlbmRpbmdCaXNlY3QgPSBiaXNlY3Rvcihhc2NlbmRpbmcpOwogICAgdmFyIGJpc2VjdFJpZ2h0ID0gYXNjZW5kaW5nQmlzZWN0LnJpZ2h0OwogICAgdmFyIGJpc2VjdExlZnQgPSBhc2NlbmRpbmdCaXNlY3QubGVmdDsKCiAgICBmdW5jdGlvbiBwYWlycyhhcnJheSwgZikgewogICAgICBpZiAoZiA9PSBudWxsKSBmID0gcGFpcjsKICAgICAgdmFyIGkgPSAwLCBuID0gYXJyYXkubGVuZ3RoIC0gMSwgcCA9IGFycmF5WzBdLCBwYWlycyA9IG5ldyBBcnJheShuIDwgMCA/IDAgOiBuKTsKICAgICAgd2hpbGUgKGkgPCBuKSBwYWlyc1tpXSA9IGYocCwgcCA9IGFycmF5WysraV0pOwogICAgICByZXR1cm4gcGFpcnM7CiAgICB9CgogICAgZnVuY3Rpb24gcGFpcihhLCBiKSB7CiAgICAgIHJldHVybiBbYSwgYl07CiAgICB9CgogICAgZnVuY3Rpb24gY3Jvc3ModmFsdWVzMCwgdmFsdWVzMSwgcmVkdWNlKSB7CiAgICAgIHZhciBuMCA9IHZhbHVlczAubGVuZ3RoLAogICAgICAgICAgbjEgPSB2YWx1ZXMxLmxlbmd0aCwKICAgICAgICAgIHZhbHVlcyA9IG5ldyBBcnJheShuMCAqIG4xKSwKICAgICAgICAgIGkwLAogICAgICAgICAgaTEsCiAgICAgICAgICBpLAogICAgICAgICAgdmFsdWUwOwoKICAgICAgaWYgKHJlZHVjZSA9PSBudWxsKSByZWR1Y2UgPSBwYWlyOwoKICAgICAgZm9yIChpMCA9IGkgPSAwOyBpMCA8IG4wOyArK2kwKSB7CiAgICAgICAgZm9yICh2YWx1ZTAgPSB2YWx1ZXMwW2kwXSwgaTEgPSAwOyBpMSA8IG4xOyArK2kxLCArK2kpIHsKICAgICAgICAgIHZhbHVlc1tpXSA9IHJlZHVjZSh2YWx1ZTAsIHZhbHVlczFbaTFdKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB2YWx1ZXM7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzY2VuZGluZyhhLCBiKSB7CiAgICAgIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBudW1iZXIoeCkgewogICAgICByZXR1cm4geCA9PT0gbnVsbCA/IE5hTiA6ICt4OwogICAgfQoKICAgIGZ1bmN0aW9uIHZhcmlhbmNlKHZhbHVlcywgdmFsdWVvZikgewogICAgICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgICBtID0gMCwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIG1lYW4gPSAwLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBkZWx0YSwKICAgICAgICAgIHN1bSA9IDA7CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ldKSkpIHsKICAgICAgICAgICAgZGVsdGEgPSB2YWx1ZSAtIG1lYW47CiAgICAgICAgICAgIG1lYW4gKz0gZGVsdGEgLyArK207CiAgICAgICAgICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZWxzZSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgewogICAgICAgICAgICBkZWx0YSA9IHZhbHVlIC0gbWVhbjsKICAgICAgICAgICAgbWVhbiArPSBkZWx0YSAvICsrbTsKICAgICAgICAgICAgc3VtICs9IGRlbHRhICogKHZhbHVlIC0gbWVhbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAobSA+IDEpIHJldHVybiBzdW0gLyAobSAtIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldmlhdGlvbihhcnJheSwgZikgewogICAgICB2YXIgdiA9IHZhcmlhbmNlKGFycmF5LCBmKTsKICAgICAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dGVudCh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBtaW4sCiAgICAgICAgICBtYXg7CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICAgICAgbWluID0gbWF4ID0gdmFsdWU7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBlbHNlIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgICAgIG1pbiA9IG1heCA9IHZhbHVlOwogICAgICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLgogICAgICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKG1pbiA+IHZhbHVlKSBtaW4gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIGlmIChtYXggPCB2YWx1ZSkgbWF4ID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gW21pbiwgbWF4XTsKICAgIH0KCiAgICB2YXIgYXJyYXkgPSBBcnJheS5wcm90b3R5cGU7CgogICAgdmFyIHNsaWNlID0gYXJyYXkuc2xpY2U7CiAgICB2YXIgbWFwID0gYXJyYXkubWFwOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50KHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5KHgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgZnVuY3Rpb24gc2VxdWVuY2Uoc3RhcnQsIHN0b3AsIHN0ZXApIHsKICAgICAgc3RhcnQgPSArc3RhcnQsIHN0b3AgPSArc3RvcCwgc3RlcCA9IChuID0gYXJndW1lbnRzLmxlbmd0aCkgPCAyID8gKHN0b3AgPSBzdGFydCwgc3RhcnQgPSAwLCAxKSA6IG4gPCAzID8gMSA6ICtzdGVwOwoKICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSkgfCAwLAogICAgICAgICAgcmFuZ2UgPSBuZXcgQXJyYXkobik7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDsKICAgICAgfQoKICAgICAgcmV0dXJuIHJhbmdlOwogICAgfQoKICAgIHZhciBlMTAgPSBNYXRoLnNxcnQoNTApLAogICAgICAgIGU1ID0gTWF0aC5zcXJ0KDEwKSwKICAgICAgICBlMiA9IE1hdGguc3FydCgyKTsKCiAgICBmdW5jdGlvbiB0aWNrcyhzdGFydCwgc3RvcCwgY291bnQpIHsKICAgICAgdmFyIHJldmVyc2UsCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICBuLAogICAgICAgICAgdGlja3MsCiAgICAgICAgICBzdGVwOwoKICAgICAgc3RvcCA9ICtzdG9wLCBzdGFydCA9ICtzdGFydCwgY291bnQgPSArY291bnQ7CiAgICAgIGlmIChzdGFydCA9PT0gc3RvcCAmJiBjb3VudCA+IDApIHJldHVybiBbc3RhcnRdOwogICAgICBpZiAocmV2ZXJzZSA9IHN0b3AgPCBzdGFydCkgbiA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBuOwogICAgICBpZiAoKHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkpID09PSAwIHx8ICFpc0Zpbml0ZShzdGVwKSkgcmV0dXJuIFtdOwoKICAgICAgaWYgKHN0ZXAgPiAwKSB7CiAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKTsKICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wIC8gc3RlcCk7CiAgICAgICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3RhcnQgKyAxKSk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0ICsgaSkgKiBzdGVwOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApOwogICAgICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAqIHN0ZXApOwogICAgICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RhcnQgLSBzdG9wICsgMSkpOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCAtIGkpIC8gc3RlcDsKICAgICAgfQoKICAgICAgaWYgKHJldmVyc2UpIHRpY2tzLnJldmVyc2UoKTsKCiAgICAgIHJldHVybiB0aWNrczsKICAgIH0KCiAgICBmdW5jdGlvbiB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCkgewogICAgICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLAogICAgICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXApIC8gTWF0aC5MTjEwKSwKICAgICAgICAgIGVycm9yID0gc3RlcCAvIE1hdGgucG93KDEwLCBwb3dlcik7CiAgICAgIHJldHVybiBwb3dlciA+PSAwCiAgICAgICAgICA/IChlcnJvciA+PSBlMTAgPyAxMCA6IGVycm9yID49IGU1ID8gNSA6IGVycm9yID49IGUyID8gMiA6IDEpICogTWF0aC5wb3coMTAsIHBvd2VyKQogICAgICAgICAgOiAtTWF0aC5wb3coMTAsIC1wb3dlcikgLyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aWNrU3RlcChzdGFydCwgc3RvcCwgY291bnQpIHsKICAgICAgdmFyIHN0ZXAwID0gTWF0aC5hYnMoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSwKICAgICAgICAgIHN0ZXAxID0gTWF0aC5wb3coMTAsIE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcDApIC8gTWF0aC5MTjEwKSksCiAgICAgICAgICBlcnJvciA9IHN0ZXAwIC8gc3RlcDE7CiAgICAgIGlmIChlcnJvciA+PSBlMTApIHN0ZXAxICo9IDEwOwogICAgICBlbHNlIGlmIChlcnJvciA+PSBlNSkgc3RlcDEgKj0gNTsKICAgICAgZWxzZSBpZiAoZXJyb3IgPj0gZTIpIHN0ZXAxICo9IDI7CiAgICAgIHJldHVybiBzdG9wIDwgc3RhcnQgPyAtc3RlcDEgOiBzdGVwMTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aHJlc2hvbGRTdHVyZ2VzKHZhbHVlcykgewogICAgICByZXR1cm4gTWF0aC5jZWlsKE1hdGgubG9nKHZhbHVlcy5sZW5ndGgpIC8gTWF0aC5MTjIpICsgMTsKICAgIH0KCiAgICBmdW5jdGlvbiBoaXN0b2dyYW0oKSB7CiAgICAgIHZhciB2YWx1ZSA9IGlkZW50aXR5LAogICAgICAgICAgZG9tYWluID0gZXh0ZW50LAogICAgICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkU3R1cmdlczsKCiAgICAgIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgeCwKICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKTsKICAgICAgICB9CgogICAgICAgIHZhciB4eiA9IGRvbWFpbih2YWx1ZXMpLAogICAgICAgICAgICB4MCA9IHh6WzBdLAogICAgICAgICAgICB4MSA9IHh6WzFdLAogICAgICAgICAgICB0eiA9IHRocmVzaG9sZCh2YWx1ZXMsIHgwLCB4MSk7CgogICAgICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuCiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAgICAgICAgdHogPSB0aWNrU3RlcCh4MCwgeDEsIHR6KTsKICAgICAgICAgIHR6ID0gc2VxdWVuY2UoTWF0aC5jZWlsKHgwIC8gdHopICogdHosIHgxLCB0eik7IC8vIGV4Y2x1c2l2ZQogICAgICAgIH0KCiAgICAgICAgLy8gUmVtb3ZlIGFueSB0aHJlc2hvbGRzIG91dHNpZGUgdGhlIGRvbWFpbi4KICAgICAgICB2YXIgbSA9IHR6Lmxlbmd0aDsKICAgICAgICB3aGlsZSAodHpbMF0gPD0geDApIHR6LnNoaWZ0KCksIC0tbTsKICAgICAgICB3aGlsZSAodHpbbSAtIDFdID4geDEpIHR6LnBvcCgpLCAtLW07CgogICAgICAgIHZhciBiaW5zID0gbmV3IEFycmF5KG0gKyAxKSwKICAgICAgICAgICAgYmluOwoKICAgICAgICAvLyBJbml0aWFsaXplIGJpbnMuCiAgICAgICAgZm9yIChpID0gMDsgaSA8PSBtOyArK2kpIHsKICAgICAgICAgIGJpbiA9IGJpbnNbaV0gPSBbXTsKICAgICAgICAgIGJpbi54MCA9IGkgPiAwID8gdHpbaSAtIDFdIDogeDA7CiAgICAgICAgICBiaW4ueDEgPSBpIDwgbSA/IHR6W2ldIDogeDE7CiAgICAgICAgfQoKICAgICAgICAvLyBBc3NpZ24gZGF0YSB0byBiaW5zIGJ5IHZhbHVlLCBpZ25vcmluZyBhbnkgb3V0c2lkZSB0aGUgZG9tYWluLgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHggPSB2YWx1ZXNbaV07CiAgICAgICAgICBpZiAoeDAgPD0geCAmJiB4IDw9IHgxKSB7CiAgICAgICAgICAgIGJpbnNbYmlzZWN0UmlnaHQodHosIHgsIDAsIG0pXS5wdXNoKGRhdGFbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGJpbnM7CiAgICAgIH0KCiAgICAgIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdmFsdWU7CiAgICAgIH07CgogICAgICBoaXN0b2dyYW0uZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50KFtfWzBdLCBfWzFdXSksIGhpc3RvZ3JhbSkgOiBkb21haW47CiAgICAgIH07CgogICAgICBoaXN0b2dyYW0udGhyZXNob2xkcyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQoc2xpY2UuY2FsbChfKSkgOiBjb25zdGFudChfKSwgaGlzdG9ncmFtKSA6IHRocmVzaG9sZDsKICAgICAgfTsKCiAgICAgIHJldHVybiBoaXN0b2dyYW07CiAgICB9CgogICAgZnVuY3Rpb24gdGhyZXNob2xkKHZhbHVlcywgcCwgdmFsdWVvZikgewogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB2YWx1ZW9mID0gbnVtYmVyOwogICAgICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkpIHJldHVybjsKICAgICAgaWYgKChwID0gK3ApIDw9IDAgfHwgbiA8IDIpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbMF0sIDAsIHZhbHVlcyk7CiAgICAgIGlmIChwID49IDEpIHJldHVybiArdmFsdWVvZih2YWx1ZXNbbiAtIDFdLCBuIC0gMSwgdmFsdWVzKTsKICAgICAgdmFyIG4sCiAgICAgICAgICBpID0gKG4gLSAxKSAqIHAsCiAgICAgICAgICBpMCA9IE1hdGguZmxvb3IoaSksCiAgICAgICAgICB2YWx1ZTAgPSArdmFsdWVvZih2YWx1ZXNbaTBdLCBpMCwgdmFsdWVzKSwKICAgICAgICAgIHZhbHVlMSA9ICt2YWx1ZW9mKHZhbHVlc1tpMCArIDFdLCBpMCArIDEsIHZhbHVlcyk7CiAgICAgIHJldHVybiB2YWx1ZTAgKyAodmFsdWUxIC0gdmFsdWUwKSAqIChpIC0gaTApOwogICAgfQoKICAgIGZ1bmN0aW9uIGZyZWVkbWFuRGlhY29uaXModmFsdWVzLCBtaW4sIG1heCkgewogICAgICB2YWx1ZXMgPSBtYXAuY2FsbCh2YWx1ZXMsIG51bWJlcikuc29ydChhc2NlbmRpbmcpOwogICAgICByZXR1cm4gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKDIgKiAodGhyZXNob2xkKHZhbHVlcywgMC43NSkgLSB0aHJlc2hvbGQodmFsdWVzLCAwLjI1KSkgKiBNYXRoLnBvdyh2YWx1ZXMubGVuZ3RoLCAtMSAvIDMpKSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2NvdHQodmFsdWVzLCBtaW4sIG1heCkgewogICAgICByZXR1cm4gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKDMuNSAqIGRldmlhdGlvbih2YWx1ZXMpICogTWF0aC5wb3codmFsdWVzLmxlbmd0aCwgLTEgLyAzKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1heCh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBtYXg7CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkgewogICAgICAgICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBlbHNlIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgICAgIG1heCA9IHZhbHVlOwogICAgICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLgogICAgICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+IG1heCkgewogICAgICAgICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbWF4OwogICAgfQoKICAgIGZ1bmN0aW9uIG1lYW4odmFsdWVzLCB2YWx1ZW9mKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgICAgIG0gPSBuLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBzdW0gPSAwOwoKICAgICAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlc1tpXSkpKSBzdW0gKz0gdmFsdWU7CiAgICAgICAgICBlbHNlIC0tbTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHN1bSArPSB2YWx1ZTsKICAgICAgICAgIGVsc2UgLS1tOwogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKG0pIHJldHVybiBzdW0gLyBtOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lZGlhbih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBudW1iZXJzID0gW107CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIodmFsdWVzW2ldKSkpIHsKICAgICAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyKHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSkpIHsKICAgICAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0aHJlc2hvbGQobnVtYmVycy5zb3J0KGFzY2VuZGluZyksIDAuNSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWVyZ2UoYXJyYXlzKSB7CiAgICAgIHZhciBuID0gYXJyYXlzLmxlbmd0aCwKICAgICAgICAgIG0sCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICBqID0gMCwKICAgICAgICAgIG1lcmdlZCwKICAgICAgICAgIGFycmF5OwoKICAgICAgd2hpbGUgKCsraSA8IG4pIGogKz0gYXJyYXlzW2ldLmxlbmd0aDsKICAgICAgbWVyZ2VkID0gbmV3IEFycmF5KGopOwoKICAgICAgd2hpbGUgKC0tbiA+PSAwKSB7CiAgICAgICAgYXJyYXkgPSBhcnJheXNbbl07CiAgICAgICAgbSA9IGFycmF5Lmxlbmd0aDsKICAgICAgICB3aGlsZSAoLS1tID49IDApIHsKICAgICAgICAgIG1lcmdlZFstLWpdID0gYXJyYXlbbV07CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbWVyZ2VkOwogICAgfQoKICAgIGZ1bmN0aW9uIG1pbih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBtaW47CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgewogICAgICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBlbHNlIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgICAgIG1pbiA9IHZhbHVlOwogICAgICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLgogICAgICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgewogICAgICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbWluOwogICAgfQoKICAgIGZ1bmN0aW9uIHBlcm11dGUoYXJyYXksIGluZGV4ZXMpIHsKICAgICAgdmFyIGkgPSBpbmRleGVzLmxlbmd0aCwgcGVybXV0ZXMgPSBuZXcgQXJyYXkoaSk7CiAgICAgIHdoaWxlIChpLS0pIHBlcm11dGVzW2ldID0gYXJyYXlbaW5kZXhlc1tpXV07CiAgICAgIHJldHVybiBwZXJtdXRlczsKICAgIH0KCiAgICBmdW5jdGlvbiBzY2FuKHZhbHVlcywgY29tcGFyZSkgewogICAgICBpZiAoIShuID0gdmFsdWVzLmxlbmd0aCkpIHJldHVybjsKICAgICAgdmFyIG4sCiAgICAgICAgICBpID0gMCwKICAgICAgICAgIGogPSAwLAogICAgICAgICAgeGksCiAgICAgICAgICB4aiA9IHZhbHVlc1tqXTsKCiAgICAgIGlmIChjb21wYXJlID09IG51bGwpIGNvbXBhcmUgPSBhc2NlbmRpbmc7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmIChjb21wYXJlKHhpID0gdmFsdWVzW2ldLCB4aikgPCAwIHx8IGNvbXBhcmUoeGosIHhqKSAhPT0gMCkgewogICAgICAgICAgeGogPSB4aSwgaiA9IGk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoY29tcGFyZSh4aiwgeGopID09PSAwKSByZXR1cm4gajsKICAgIH0KCiAgICBmdW5jdGlvbiBzaHVmZmxlKGFycmF5LCBpMCwgaTEpIHsKICAgICAgdmFyIG0gPSAoaTEgPT0gbnVsbCA/IGFycmF5Lmxlbmd0aCA6IGkxKSAtIChpMCA9IGkwID09IG51bGwgPyAwIDogK2kwKSwKICAgICAgICAgIHQsCiAgICAgICAgICBpOwoKICAgICAgd2hpbGUgKG0pIHsKICAgICAgICBpID0gTWF0aC5yYW5kb20oKSAqIG0tLSB8IDA7CiAgICAgICAgdCA9IGFycmF5W20gKyBpMF07CiAgICAgICAgYXJyYXlbbSArIGkwXSA9IGFycmF5W2kgKyBpMF07CiAgICAgICAgYXJyYXlbaSArIGkwXSA9IHQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdW0odmFsdWVzLCB2YWx1ZW9mKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgc3VtID0gMDsKCiAgICAgIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKHZhbHVlID0gK3ZhbHVlc1tpXSkgc3VtICs9IHZhbHVlOyAvLyBOb3RlOiB6ZXJvIGFuZCBudWxsIGFyZSBlcXVpdmFsZW50LgogICAgICAgIH0KICAgICAgfQoKICAgICAgZWxzZSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgc3VtICs9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHN1bTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc3Bvc2UobWF0cml4KSB7CiAgICAgIGlmICghKG4gPSBtYXRyaXgubGVuZ3RoKSkgcmV0dXJuIFtdOwogICAgICBmb3IgKHZhciBpID0gLTEsIG0gPSBtaW4obWF0cml4LCBsZW5ndGgpLCB0cmFuc3Bvc2UgPSBuZXcgQXJyYXkobSk7ICsraSA8IG07KSB7CiAgICAgICAgZm9yICh2YXIgaiA9IC0xLCBuLCByb3cgPSB0cmFuc3Bvc2VbaV0gPSBuZXcgQXJyYXkobik7ICsraiA8IG47KSB7CiAgICAgICAgICByb3dbal0gPSBtYXRyaXhbal1baV07CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cmFuc3Bvc2U7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuZ3RoKGQpIHsKICAgICAgcmV0dXJuIGQubGVuZ3RoOwogICAgfQoKICAgIGZ1bmN0aW9uIHppcCgpIHsKICAgICAgcmV0dXJuIHRyYW5zcG9zZShhcmd1bWVudHMpOwogICAgfQoKICAgIHZhciBzbGljZSQxID0gQXJyYXkucHJvdG90eXBlLnNsaWNlOwoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JDEoeCkgewogICAgICByZXR1cm4geDsKICAgIH0KCiAgICB2YXIgdG9wID0gMSwKICAgICAgICByaWdodCA9IDIsCiAgICAgICAgYm90dG9tID0gMywKICAgICAgICBsZWZ0ID0gNCwKICAgICAgICBlcHNpbG9uID0gMWUtNjsKCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVYKHgpIHsKICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArICh4ICsgMC41KSArICIsMCkiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVkoeSkgewogICAgICByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyAoeSArIDAuNSkgKyAiKSI7CiAgICB9CgogICAgZnVuY3Rpb24gbnVtYmVyJDEoc2NhbGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gK3NjYWxlKGQpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRlcihzY2FsZSkgewogICAgICB2YXIgb2Zmc2V0ID0gTWF0aC5tYXgoMCwgc2NhbGUuYmFuZHdpZHRoKCkgLSAxKSAvIDI7IC8vIEFkanVzdCBmb3IgMC41cHggb2Zmc2V0LgogICAgICBpZiAoc2NhbGUucm91bmQoKSkgb2Zmc2V0ID0gTWF0aC5yb3VuZChvZmZzZXQpOwogICAgICByZXR1cm4gZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiArc2NhbGUoZCkgKyBvZmZzZXQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZW50ZXJpbmcoKSB7CiAgICAgIHJldHVybiAhdGhpcy5fX2F4aXM7CiAgICB9CgogICAgZnVuY3Rpb24gYXhpcyhvcmllbnQsIHNjYWxlKSB7CiAgICAgIHZhciB0aWNrQXJndW1lbnRzID0gW10sCiAgICAgICAgICB0aWNrVmFsdWVzID0gbnVsbCwKICAgICAgICAgIHRpY2tGb3JtYXQgPSBudWxsLAogICAgICAgICAgdGlja1NpemVJbm5lciA9IDYsCiAgICAgICAgICB0aWNrU2l6ZU91dGVyID0gNiwKICAgICAgICAgIHRpY2tQYWRkaW5nID0gMywKICAgICAgICAgIGsgPSBvcmllbnQgPT09IHRvcCB8fCBvcmllbnQgPT09IGxlZnQgPyAtMSA6IDEsCiAgICAgICAgICB4ID0gb3JpZW50ID09PSBsZWZ0IHx8IG9yaWVudCA9PT0gcmlnaHQgPyAieCIgOiAieSIsCiAgICAgICAgICB0cmFuc2Zvcm0gPSBvcmllbnQgPT09IHRvcCB8fCBvcmllbnQgPT09IGJvdHRvbSA/IHRyYW5zbGF0ZVggOiB0cmFuc2xhdGVZOwoKICAgICAgZnVuY3Rpb24gYXhpcyhjb250ZXh0KSB7CiAgICAgICAgdmFyIHZhbHVlcyA9IHRpY2tWYWx1ZXMgPT0gbnVsbCA/IChzY2FsZS50aWNrcyA/IHNjYWxlLnRpY2tzLmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzKSA6IHNjYWxlLmRvbWFpbigpKSA6IHRpY2tWYWx1ZXMsCiAgICAgICAgICAgIGZvcm1hdCA9IHRpY2tGb3JtYXQgPT0gbnVsbCA/IChzY2FsZS50aWNrRm9ybWF0ID8gc2NhbGUudGlja0Zvcm1hdC5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBpZGVudGl0eSQxKSA6IHRpY2tGb3JtYXQsCiAgICAgICAgICAgIHNwYWNpbmcgPSBNYXRoLm1heCh0aWNrU2l6ZUlubmVyLCAwKSArIHRpY2tQYWRkaW5nLAogICAgICAgICAgICByYW5nZSA9IHNjYWxlLnJhbmdlKCksCiAgICAgICAgICAgIHJhbmdlMCA9ICtyYW5nZVswXSArIDAuNSwKICAgICAgICAgICAgcmFuZ2UxID0gK3JhbmdlW3JhbmdlLmxlbmd0aCAtIDFdICsgMC41LAogICAgICAgICAgICBwb3NpdGlvbiA9IChzY2FsZS5iYW5kd2lkdGggPyBjZW50ZXIgOiBudW1iZXIkMSkoc2NhbGUuY29weSgpKSwKICAgICAgICAgICAgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCwKICAgICAgICAgICAgcGF0aCA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSksCiAgICAgICAgICAgIHRpY2sgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCIudGljayIpLmRhdGEodmFsdWVzLCBzY2FsZSkub3JkZXIoKSwKICAgICAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKSwKICAgICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgInRpY2siKSwKICAgICAgICAgICAgbGluZSA9IHRpY2suc2VsZWN0KCJsaW5lIiksCiAgICAgICAgICAgIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpOwoKICAgICAgICBwYXRoID0gcGF0aC5tZXJnZShwYXRoLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwgIi50aWNrIikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiY3VycmVudENvbG9yIikpOwoKICAgICAgICB0aWNrID0gdGljay5tZXJnZSh0aWNrRW50ZXIpOwoKICAgICAgICBsaW5lID0gbGluZS5tZXJnZSh0aWNrRW50ZXIuYXBwZW5kKCJsaW5lIikKICAgICAgICAgICAgLmF0dHIoInN0cm9rZSIsICJjdXJyZW50Q29sb3IiKQogICAgICAgICAgICAuYXR0cih4ICsgIjIiLCBrICogdGlja1NpemVJbm5lcikpOwoKICAgICAgICB0ZXh0ID0gdGV4dC5tZXJnZSh0aWNrRW50ZXIuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAiY3VycmVudENvbG9yIikKICAgICAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpCiAgICAgICAgICAgIC5hdHRyKCJkeSIsIG9yaWVudCA9PT0gdG9wID8gIjBlbSIgOiBvcmllbnQgPT09IGJvdHRvbSA/ICIwLjcxZW0iIDogIjAuMzJlbSIpKTsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgICAgcGF0aCA9IHBhdGgudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIHRpY2sgPSB0aWNrLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBsaW5lID0gbGluZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgICAgdGV4dCA9IHRleHQudHJhbnNpdGlvbihjb250ZXh0KTsKCiAgICAgICAgICB0aWNrRXhpdCA9IHRpY2tFeGl0LnRyYW5zaXRpb24oY29udGV4dCkKICAgICAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIGVwc2lsb24pCiAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGlzRmluaXRlKGQgPSBwb3NpdGlvbihkKSkgPyB0cmFuc2Zvcm0oZCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIik7IH0pOwoKICAgICAgICAgIHRpY2tFbnRlcgogICAgICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikKICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyB2YXIgcCA9IHRoaXMucGFyZW50Tm9kZS5fX2F4aXM7IHJldHVybiB0cmFuc2Zvcm0ocCAmJiBpc0Zpbml0ZShwID0gcChkKSkgPyBwIDogcG9zaXRpb24oZCkpOyB9KTsKICAgICAgICB9CgogICAgICAgIHRpY2tFeGl0LnJlbW92ZSgpOwoKICAgICAgICBwYXRoCiAgICAgICAgICAgIC5hdHRyKCJkIiwgb3JpZW50ID09PSBsZWZ0IHx8IG9yaWVudCA9PSByaWdodAogICAgICAgICAgICAgICAgPyAodGlja1NpemVPdXRlciA/ICJNIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIiwiICsgcmFuZ2UwICsgIkgwLjVWIiArIHJhbmdlMSArICJIIiArIGsgKiB0aWNrU2l6ZU91dGVyIDogIk0wLjUsIiArIHJhbmdlMCArICJWIiArIHJhbmdlMSkKICAgICAgICAgICAgICAgIDogKHRpY2tTaXplT3V0ZXIgPyAiTSIgKyByYW5nZTAgKyAiLCIgKyBrICogdGlja1NpemVPdXRlciArICJWMC41SCIgKyByYW5nZTEgKyAiViIgKyBrICogdGlja1NpemVPdXRlciA6ICJNIiArIHJhbmdlMCArICIsMC41SCIgKyByYW5nZTEpKTsKCiAgICAgICAgdGljawogICAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIDEpCiAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiB0cmFuc2Zvcm0ocG9zaXRpb24oZCkpOyB9KTsKCiAgICAgICAgbGluZQogICAgICAgICAgICAuYXR0cih4ICsgIjIiLCBrICogdGlja1NpemVJbm5lcik7CgogICAgICAgIHRleHQKICAgICAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpCiAgICAgICAgICAgIC50ZXh0KGZvcm1hdCk7CgogICAgICAgIHNlbGVjdGlvbi5maWx0ZXIoZW50ZXJpbmcpCiAgICAgICAgICAgIC5hdHRyKCJmaWxsIiwgIm5vbmUiKQogICAgICAgICAgICAuYXR0cigiZm9udC1zaXplIiwgMTApCiAgICAgICAgICAgIC5hdHRyKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgb3JpZW50ID09PSByaWdodCA/ICJzdGFydCIgOiBvcmllbnQgPT09IGxlZnQgPyAiZW5kIiA6ICJtaWRkbGUiKTsKCiAgICAgICAgc2VsZWN0aW9uCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLl9fYXhpcyA9IHBvc2l0aW9uOyB9KTsKICAgICAgfQoKICAgICAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRpY2tBcmd1bWVudHMgPSBzbGljZSQxLmNhbGwoYXJndW1lbnRzKSwgYXhpczsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja0FyZ3VtZW50cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrQXJndW1lbnRzID0gXyA9PSBudWxsID8gW10gOiBzbGljZSQxLmNhbGwoXyksIGF4aXMpIDogdGlja0FyZ3VtZW50cy5zbGljZSgpOwogICAgICB9OwoKICAgICAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tWYWx1ZXMgPSBfID09IG51bGwgPyBudWxsIDogc2xpY2UkMS5jYWxsKF8pLCBheGlzKSA6IHRpY2tWYWx1ZXMgJiYgdGlja1ZhbHVlcy5zbGljZSgpOwogICAgICB9OwoKICAgICAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tGb3JtYXQgPSBfLCBheGlzKSA6IHRpY2tGb3JtYXQ7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSB0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1NpemVJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1NpemVPdXRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVPdXRlcjsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1BhZGRpbmcgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1BhZGRpbmcgPSArXywgYXhpcykgOiB0aWNrUGFkZGluZzsKICAgICAgfTsKCiAgICAgIHJldHVybiBheGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGF4aXNUb3Aoc2NhbGUpIHsKICAgICAgcmV0dXJuIGF4aXModG9wLCBzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXhpc1JpZ2h0KHNjYWxlKSB7CiAgICAgIHJldHVybiBheGlzKHJpZ2h0LCBzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXhpc0JvdHRvbShzY2FsZSkgewogICAgICByZXR1cm4gYXhpcyhib3R0b20sIHNjYWxlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBheGlzTGVmdChzY2FsZSkgewogICAgICByZXR1cm4gYXhpcyhsZWZ0LCBzY2FsZSk7CiAgICB9CgogICAgdmFyIG5vb3AgPSB7dmFsdWU6IGZ1bmN0aW9uKCkge319OwoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoKCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyAiIikgfHwgKHQgaW4gXykgfHwgL1tccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIiArIHQpOwogICAgICAgIF9bdF0gPSBbXTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERpc3BhdGNoKF8pOwogICAgfQoKICAgIGZ1bmN0aW9uIERpc3BhdGNoKF8pIHsKICAgICAgdGhpcy5fID0gXzsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZXMsIHR5cGVzKSB7CiAgICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHQpOwogICAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgICAgIH0pOwogICAgfQoKICAgIERpc3BhdGNoLnByb3RvdHlwZSA9IGRpc3BhdGNoLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IERpc3BhdGNoLAogICAgICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyh0eXBlbmFtZSArICIiLCBfKSwKICAgICAgICAgICAgdCwKICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICBuID0gVC5sZW5ndGg7CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQkMShfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLgogICAgICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuCiAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldCQxKF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JDEoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXzsKICAgICAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaChjb3B5KTsKICAgICAgfSwKICAgICAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkgewogICAgICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTsKICAgICAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0sCiAgICAgIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXQkMSh0eXBlLCBuYW1lKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICByZXR1cm4gYy52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXQkMSh0eXBlLCBuYW1lLCBjYWxsYmFjaykgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgdHlwZVtpXSA9IG5vb3AsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIHZhciB4aHRtbCA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsKCiAgICB2YXIgbmFtZXNwYWNlcyA9IHsKICAgICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgICB4aHRtbDogeGh0bWwsCiAgICAgIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICAgIHhtbG5zOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iCiAgICB9OwoKICAgIGZ1bmN0aW9uIG5hbWVzcGFjZShuYW1lKSB7CiAgICAgIHZhciBwcmVmaXggPSBuYW1lICs9ICIiLCBpID0gcHJlZml4LmluZGV4T2YoIjoiKTsKICAgICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgICAgcmV0dXJuIG5hbWVzcGFjZXMuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlc1twcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0KG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7CiAgICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwKICAgICAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpCiAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvckZpeGVkKGZ1bGxuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3IobmFtZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CiAgICAgIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgICAgID8gY3JlYXRvckZpeGVkCiAgICAgICAgICA6IGNyZWF0b3JJbmhlcml0KShmdWxsbmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9uZSgpIHt9CgogICAgZnVuY3Rpb24gc2VsZWN0b3Ioc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lIDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdChzZWxlY3QpIHsKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eSgpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdG9yQWxsKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0QWxsKHNlbGVjdCkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gbWF0Y2hlcihzZWxlY3RvcikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2ZpbHRlcihtYXRjaCkgewogICAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwYXJzZSh1cGRhdGUpIHsKICAgICAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHsKICAgICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsKICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOwogICAgfQoKICAgIEVudGVyTm9kZS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sCiAgICAgIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LAogICAgICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAogICAgICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDEoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGtleVByZWZpeCA9ICIkIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uCgogICAgZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgICAgdmFyIGkgPSAwLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS4KICAgICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAgIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci4KICAgICAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC4KICAgICAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsKICAgICAgdmFyIGksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwKICAgICAgICAgIGtleVZhbHVlOwoKICAgICAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuCiAgICAgIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsKICAgICAgICAgIGlmIChrZXlWYWx1ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uCiAgICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci4KICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICAgIGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTsKICAgICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgewogICAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7CiAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSh2YWx1ZSwga2V5KSB7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICBkYXRhID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaiA9IC0xOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9CgogICAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cywKICAgICAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwczsKCiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQkMSh2YWx1ZSk7CgogICAgICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSwKICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sCiAgICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgICBkYXRhID0gdmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpLAogICAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwKICAgICAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksCiAgICAgICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdAogICAgICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHsKICAgICAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTsKICAgICAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7CiAgICAgIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjsKICAgICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgICAgcmV0dXJuIHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCgpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHsKICAgICAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7CiAgICAgIGVudGVyID0gdHlwZW9mIG9uZW50ZXIgPT09ICJmdW5jdGlvbiIgPyBvbmVudGVyKGVudGVyKSA6IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgICBpZiAob251cGRhdGUgIT0gbnVsbCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTsKICAgICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbWVyZ2Uoc2VsZWN0aW9uKSB7CgogICAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgewogICAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlcigpIHsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAgICAgICBuZXh0ID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zb3J0KGNvbXBhcmUpIHsKICAgICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nJDE7CgogICAgICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOwogICAgICB9CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nJDEoYSwgYikgewogICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2NhbGwoKSB7CiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsKICAgICAgYXJndW1lbnRzWzBdID0gdGhpczsKICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzKCkgewogICAgICB2YXIgbm9kZXMgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBpID0gLTE7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUoKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zaXplKCkgewogICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTsKICAgICAgcmV0dXJuIHNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VtcHR5KCkgewogICAgICByZXR1cm4gIXRoaXMubm9kZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoKGNhbGxiYWNrKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbAogICAgICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKQogICAgICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRWaWV3KG5vZGUpIHsKICAgICAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZQogICAgICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uCiAgICAgICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAgICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkgewogICAgICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpCiAgICAgICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEKICAgICAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvbgogICAgICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkgewogICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkgewogICAgICB0aGlzLl9ub2RlID0gbm9kZTsKICAgICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICAgIH0KCiAgICBDbGFzc0xpc3QucHJvdG90eXBlID0gewogICAgICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlbW92ZTogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHsKICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7CiAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZQogICAgICAgICAgPyBjbGFzc2VkVHJ1ZQogICAgICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0KHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gdGV4dEZ1bmN0aW9uCiAgICAgICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2h0bWwodmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBodG1sRnVuY3Rpb24KICAgICAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7CiAgICB9CgogICAgZnVuY3Rpb24gcmFpc2UoKSB7CiAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3JhaXNlKCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb3dlcigpIHsKICAgICAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbG93ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gobG93ZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQobmFtZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnROdWxsKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faW5zZXJ0KG5hbWUsIGJlZm9yZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSwKICAgICAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gImZ1bmN0aW9uIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmUoKSB7CiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fcmVtb3ZlKCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdygpIHsKICAgICAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAoKSB7CiAgICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZShkZWVwKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3cpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kYXR1bSh2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsKICAgIH0KCiAgICB2YXIgZmlsdGVyRXZlbnRzID0ge307CgogICAgdmFyIGV2ZW50ID0gbnVsbDsKCiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgICAgaWYgKCEoIm9ubW91c2VlbnRlciIgaW4gZWxlbWVudCkpIHsKICAgICAgICBmaWx0ZXJFdmVudHMgPSB7bW91c2VlbnRlcjogIm1vdXNlb3ZlciIsIG1vdXNlbGVhdmU6ICJtb3VzZW91dCJ9OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyQ29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICAgICAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIobGlzdGVuZXIsIGluZGV4LCBncm91cCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsKICAgICAgICBpZiAoIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRoaXMgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpICYgOCkpKSB7CiAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkgewogICAgICAgIHZhciBldmVudDAgPSBldmVudDsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS4KICAgICAgICBldmVudCA9IGV2ZW50MTsKICAgICAgICB0cnkgewogICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB0aGlzLl9fZGF0YV9fLCBpbmRleCwgZ3JvdXApOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBldmVudCA9IGV2ZW50MDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXMkMSh0eXBlbmFtZXMpIHsKICAgICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBvblJlbW92ZSh0eXBlbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG9uID0gdGhpcy5fX29uOwogICAgICAgIGlmICghb24pIHJldHVybjsKICAgICAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9uWysraV0gPSBvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpOwogICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbkFkZCh0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICAgICAgdmFyIHdyYXAgPSBmaWx0ZXJFdmVudHMuaGFzT3duUHJvcGVydHkodHlwZW5hbWUudHlwZSkgPyBmaWx0ZXJDb250ZXh0TGlzdGVuZXIgOiBjb250ZXh0TGlzdGVuZXI7CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBpLCBncm91cCkgewogICAgICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7CiAgICAgICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5jYXB0dXJlID0gY2FwdHVyZSk7CiAgICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpOwogICAgICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIGNhcHR1cmU6IGNhcHR1cmV9OwogICAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTsKICAgICAgICBlbHNlIG9uLnB1c2gobyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX29uKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgewogICAgICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXMkMSh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICAgIHJldHVybiBvLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgb24gPSB2YWx1ZSA/IG9uQWRkIDogb25SZW1vdmU7CiAgICAgIGlmIChjYXB0dXJlID09IG51bGwpIGNhcHR1cmUgPSBmYWxzZTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gY3VzdG9tRXZlbnQoZXZlbnQxLCBsaXN0ZW5lciwgdGhhdCwgYXJncykgewogICAgICB2YXIgZXZlbnQwID0gZXZlbnQ7CiAgICAgIGV2ZW50MS5zb3VyY2VFdmVudCA9IGV2ZW50OwogICAgICBldmVudCA9IGV2ZW50MTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZXZlbnQgPSBldmVudDA7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50KG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXcobm9kZSksCiAgICAgICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKCiAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsOwogICAgICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0KCiAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCh0eXBlLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbih0eXBlLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50KHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGlzcGF0Y2godHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gZGlzcGF0Y2hGdW5jdGlvbgogICAgICAgICAgOiBkaXNwYXRjaENvbnN0YW50KSh0eXBlLCBwYXJhbXMpKTsKICAgIH0KCiAgICB2YXIgcm9vdCQxID0gW251bGxdOwoKICAgIGZ1bmN0aW9uIFNlbGVjdGlvbihncm91cHMsIHBhcmVudHMpIHsKICAgICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb24oKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QkMSk7CiAgICB9CgogICAgU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sCiAgICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwKICAgICAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLAogICAgICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsCiAgICAgIGRhdGE6IHNlbGVjdGlvbl9kYXRhLAogICAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogICAgICBleGl0OiBzZWxlY3Rpb25fZXhpdCwKICAgICAgam9pbjogc2VsZWN0aW9uX2pvaW4sCiAgICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgICAgIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsCiAgICAgIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LAogICAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcywKICAgICAgbm9kZTogc2VsZWN0aW9uX25vZGUsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9zaXplLAogICAgICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LAogICAgICBlYWNoOiBzZWxlY3Rpb25fZWFjaCwKICAgICAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgICAgIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsCiAgICAgIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksCiAgICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogICAgICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCwKICAgICAgaHRtbDogc2VsZWN0aW9uX2h0bWwsCiAgICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgICAgIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsCiAgICAgIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCwKICAgICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogICAgICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsCiAgICAgIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsCiAgICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sCiAgICAgIG9uOiBzZWxlY3Rpb25fb24sCiAgICAgIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gKICAgIH07CgogICAgZnVuY3Rpb24gc2VsZWN0KHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCiAgICAgICAgICA/IG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkKICAgICAgICAgIDogbmV3IFNlbGVjdGlvbihbW3NlbGVjdG9yXV0sIHJvb3QkMSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUpIHsKICAgICAgcmV0dXJuIHNlbGVjdChjcmVhdG9yKG5hbWUpLmNhbGwoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSk7CiAgICB9CgogICAgdmFyIG5leHRJZCA9IDA7CgogICAgZnVuY3Rpb24gbG9jYWwoKSB7CiAgICAgIHJldHVybiBuZXcgTG9jYWw7CiAgICB9CgogICAgZnVuY3Rpb24gTG9jYWwoKSB7CiAgICAgIHRoaXMuXyA9ICJAIiArICgrK25leHRJZCkudG9TdHJpbmcoMzYpOwogICAgfQoKICAgIExvY2FsLnByb3RvdHlwZSA9IGxvY2FsLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IExvY2FsLAogICAgICBnZXQ6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICB2YXIgaWQgPSB0aGlzLl87CiAgICAgICAgd2hpbGUgKCEoaWQgaW4gbm9kZSkpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgICAgICAgcmV0dXJuIG5vZGVbaWRdOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKG5vZGUsIHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIG5vZGVbdGhpcy5fXSA9IHZhbHVlOwogICAgICB9LAogICAgICByZW1vdmU6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fIGluIG5vZGUgJiYgZGVsZXRlIG5vZGVbdGhpcy5fXTsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl87CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gc291cmNlRXZlbnQoKSB7CiAgICAgIHZhciBjdXJyZW50ID0gZXZlbnQsIHNvdXJjZTsKICAgICAgd2hpbGUgKHNvdXJjZSA9IGN1cnJlbnQuc291cmNlRXZlbnQpIGN1cnJlbnQgPSBzb3VyY2U7CiAgICAgIHJldHVybiBjdXJyZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50KG5vZGUsIGV2ZW50KSB7CiAgICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlOwoKICAgICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkgewogICAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTsKICAgICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7CiAgICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTsKICAgICAgfQoKICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZShub2RlKSB7CiAgICAgIHZhciBldmVudCA9IHNvdXJjZUV2ZW50KCk7CiAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgcmV0dXJuIHBvaW50KG5vZGUsIGV2ZW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RBbGwoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgICAgID8gbmV3IFNlbGVjdGlvbihbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkKICAgICAgICAgIDogbmV3IFNlbGVjdGlvbihbc2VsZWN0b3IgPT0gbnVsbCA/IFtdIDogc2VsZWN0b3JdLCByb290JDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvdWNoKG5vZGUsIHRvdWNoZXMsIGlkZW50aWZpZXIpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAzKSBpZGVudGlmaWVyID0gdG91Y2hlcywgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkuY2hhbmdlZFRvdWNoZXM7CgogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHRvdWNoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHsKICAgICAgICAgIHJldHVybiBwb2ludChub2RlLCB0b3VjaCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiB0b3VjaGVzKG5vZGUsIHRvdWNoZXMpIHsKICAgICAgaWYgKHRvdWNoZXMgPT0gbnVsbCkgdG91Y2hlcyA9IHNvdXJjZUV2ZW50KCkudG91Y2hlczsKCiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgcG9pbnRzID0gbmV3IEFycmF5KG4pOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcG9pbnRzW2ldID0gcG9pbnQobm9kZSwgdG91Y2hlc1tpXSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBwb2ludHM7CiAgICB9CgogICAgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbigpIHsKICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ldmVudCgpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZHJhZ0Rpc2FibGUodmlldykgewogICAgICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0KHZpZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG5vZXZlbnQsIHRydWUpOwogICAgICBpZiAoIm9uc2VsZWN0c3RhcnQiIGluIHJvb3QpIHsKICAgICAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0YXJ0LmRyYWciLCBub2V2ZW50LCB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7CiAgICAgICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gIm5vbmUiOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24geWVzZHJhZyh2aWV3LCBub2NsaWNrKSB7CiAgICAgIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3Qodmlldykub24oImRyYWdzdGFydC5kcmFnIiwgbnVsbCk7CiAgICAgIGlmIChub2NsaWNrKSB7CiAgICAgICAgc2VsZWN0aW9uLm9uKCJjbGljay5kcmFnIiwgbm9ldmVudCwgdHJ1ZSk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKCJjbGljay5kcmFnIiwgbnVsbCk7IH0sIDApOwogICAgICB9CiAgICAgIGlmICgib25zZWxlY3RzdGFydCIgaW4gcm9vdCkgewogICAgICAgIHNlbGVjdGlvbi5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDsKICAgICAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkMih4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBEcmFnRXZlbnQodGFyZ2V0LCB0eXBlLCBzdWJqZWN0LCBpZCwgYWN0aXZlLCB4LCB5LCBkeCwgZHksIGRpc3BhdGNoKSB7CiAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwogICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZDsKICAgICAgdGhpcy5hY3RpdmUgPSBhY3RpdmU7CiAgICAgIHRoaXMueCA9IHg7CiAgICAgIHRoaXMueSA9IHk7CiAgICAgIHRoaXMuZHggPSBkeDsKICAgICAgdGhpcy5keSA9IGR5OwogICAgICB0aGlzLl8gPSBkaXNwYXRjaDsKICAgIH0KCiAgICBEcmFnRXZlbnQucHJvdG90eXBlLm9uID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2YWx1ZSA9IHRoaXMuXy5vbi5hcHBseSh0aGlzLl8sIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdGhpcy5fID8gdGhpcyA6IHZhbHVlOwogICAgfTsKCiAgICAvLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS4KICAgIGZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoKSB7CiAgICAgIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRDb250YWluZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLnBhcmVudE5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFN1YmplY3QoZCkgewogICAgICByZXR1cm4gZCA9PSBudWxsID8ge3g6IGV2ZW50LngsIHk6IGV2ZW50Lnl9IDogZDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlKCkgewogICAgICByZXR1cm4gbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzIHx8ICgib250b3VjaHN0YXJ0IiBpbiB0aGlzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmFnKCkgewogICAgICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlciwKICAgICAgICAgIGNvbnRhaW5lciA9IGRlZmF1bHRDb250YWluZXIsCiAgICAgICAgICBzdWJqZWN0ID0gZGVmYXVsdFN1YmplY3QsCiAgICAgICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlLAogICAgICAgICAgZ2VzdHVyZXMgPSB7fSwKICAgICAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoKCJzdGFydCIsICJkcmFnIiwgImVuZCIpLAogICAgICAgICAgYWN0aXZlID0gMCwKICAgICAgICAgIG1vdXNlZG93bngsCiAgICAgICAgICBtb3VzZWRvd255LAogICAgICAgICAgbW91c2Vtb3ZpbmcsCiAgICAgICAgICB0b3VjaGVuZGluZywKICAgICAgICAgIGNsaWNrRGlzdGFuY2UyID0gMDsKCiAgICAgIGZ1bmN0aW9uIGRyYWcoc2VsZWN0aW9uKSB7CiAgICAgICAgc2VsZWN0aW9uCiAgICAgICAgICAgIC5vbigibW91c2Vkb3duLmRyYWciLCBtb3VzZWRvd25lZCkKICAgICAgICAgIC5maWx0ZXIodG91Y2hhYmxlKQogICAgICAgICAgICAub24oInRvdWNoc3RhcnQuZHJhZyIsIHRvdWNoc3RhcnRlZCkKICAgICAgICAgICAgLm9uKCJ0b3VjaG1vdmUuZHJhZyIsIHRvdWNobW92ZWQpCiAgICAgICAgICAgIC5vbigidG91Y2hlbmQuZHJhZyB0b3VjaGNhbmNlbC5kcmFnIiwgdG91Y2hlbmRlZCkKICAgICAgICAgICAgLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCAibm9uZSIpCiAgICAgICAgICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbW91c2Vkb3duZWQoKSB7CiAgICAgICAgaWYgKHRvdWNoZW5kaW5nIHx8ICFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwogICAgICAgIHZhciBnZXN0dXJlID0gYmVmb3Jlc3RhcnQoIm1vdXNlIiwgY29udGFpbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIG1vdXNlLCB0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuOwogICAgICAgIHNlbGVjdChldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLmRyYWciLCBtb3VzZW1vdmVkLCB0cnVlKS5vbigibW91c2V1cC5kcmFnIiwgbW91c2V1cHBlZCwgdHJ1ZSk7CiAgICAgICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7CiAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAgIG1vdXNlbW92aW5nID0gZmFsc2U7CiAgICAgICAgbW91c2Vkb3dueCA9IGV2ZW50LmNsaWVudFg7CiAgICAgICAgbW91c2Vkb3dueSA9IGV2ZW50LmNsaWVudFk7CiAgICAgICAgZ2VzdHVyZSgic3RhcnQiKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbW91c2Vtb3ZlZCgpIHsKICAgICAgICBub2V2ZW50KCk7CiAgICAgICAgaWYgKCFtb3VzZW1vdmluZykgewogICAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIG1vdXNlZG93bngsIGR5ID0gZXZlbnQuY2xpZW50WSAtIG1vdXNlZG93bnk7CiAgICAgICAgICBtb3VzZW1vdmluZyA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7CiAgICAgICAgfQogICAgICAgIGdlc3R1cmVzLm1vdXNlKCJkcmFnIik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoKSB7CiAgICAgICAgc2VsZWN0KGV2ZW50LnZpZXcpLm9uKCJtb3VzZW1vdmUuZHJhZyBtb3VzZXVwLmRyYWciLCBudWxsKTsKICAgICAgICB5ZXNkcmFnKGV2ZW50LnZpZXcsIG1vdXNlbW92aW5nKTsKICAgICAgICBub2V2ZW50KCk7CiAgICAgICAgZ2VzdHVyZXMubW91c2UoImVuZCIpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoKSB7CiAgICAgICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwogICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQuY2hhbmdlZFRvdWNoZXMsCiAgICAgICAgICAgIGMgPSBjb250YWluZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KHRvdWNoZXNbaV0uaWRlbnRpZmllciwgYywgdG91Y2gsIHRoaXMsIGFyZ3VtZW50cykpIHsKICAgICAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAgICAgICBnZXN0dXJlKCJzdGFydCIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gdG91Y2htb3ZlZCgpIHsKICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLAogICAgICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkgewogICAgICAgICAgICBub2V2ZW50KCk7CiAgICAgICAgICAgIGdlc3R1cmUoImRyYWciKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRvdWNoZW5kZWQoKSB7CiAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlcywKICAgICAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgICAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7CiAgICAgICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHsKICAgICAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAgICAgICBnZXN0dXJlKCJlbmQiKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGJlZm9yZXN0YXJ0KGlkLCBjb250YWluZXIsIHBvaW50LCB0aGF0LCBhcmdzKSB7CiAgICAgICAgdmFyIHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgcywgZHgsIGR5LAogICAgICAgICAgICBzdWJsaXN0ZW5lcnMgPSBsaXN0ZW5lcnMuY29weSgpOwoKICAgICAgICBpZiAoIWN1c3RvbUV2ZW50KG5ldyBEcmFnRXZlbnQoZHJhZywgImJlZm9yZXN0YXJ0IiwgcywgaWQsIGFjdGl2ZSwgcFswXSwgcFsxXSwgMCwgMCwgc3VibGlzdGVuZXJzKSwgZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoKGV2ZW50LnN1YmplY3QgPSBzID0gc3ViamVjdC5hcHBseSh0aGF0LCBhcmdzKSkgPT0gbnVsbCkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgZHggPSBzLnggLSBwWzBdIHx8IDA7CiAgICAgICAgICBkeSA9IHMueSAtIHBbMV0gfHwgMDsKICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0pKSByZXR1cm47CgogICAgICAgIHJldHVybiBmdW5jdGlvbiBnZXN0dXJlKHR5cGUpIHsKICAgICAgICAgIHZhciBwMCA9IHAsIG47CiAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgY2FzZSAic3RhcnQiOiBnZXN0dXJlc1tpZF0gPSBnZXN0dXJlLCBuID0gYWN0aXZlKys7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJlbmQiOiBkZWxldGUgZ2VzdHVyZXNbaWRdLCAtLWFjdGl2ZTsgLy8gbm9icmVhawogICAgICAgICAgICBjYXNlICJkcmFnIjogcCA9IHBvaW50KGNvbnRhaW5lciwgaWQpLCBuID0gYWN0aXZlOyBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGN1c3RvbUV2ZW50KG5ldyBEcmFnRXZlbnQoZHJhZywgdHlwZSwgcywgaWQsIG4sIHBbMF0gKyBkeCwgcFsxXSArIGR5LCBwWzBdIC0gcDBbMF0sIHBbMV0gLSBwMFsxXSwgc3VibGlzdGVuZXJzKSwgc3VibGlzdGVuZXJzLmFwcGx5LCBzdWJsaXN0ZW5lcnMsIFt0eXBlLCB0aGF0LCBhcmdzXSk7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgZHJhZy5maWx0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMighIV8pLCBkcmFnKSA6IGZpbHRlcjsKICAgICAgfTsKCiAgICAgIGRyYWcuY29udGFpbmVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnRhaW5lciA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDIoXyksIGRyYWcpIDogY29udGFpbmVyOwogICAgICB9OwoKICAgICAgZHJhZy5zdWJqZWN0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN1YmplY3QgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKF8pLCBkcmFnKSA6IHN1YmplY3Q7CiAgICAgIH07CgogICAgICBkcmFnLnRvdWNoYWJsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0b3VjaGFibGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQyKCEhXyksIGRyYWcpIDogdG91Y2hhYmxlOwogICAgICB9OwoKICAgICAgZHJhZy5vbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyBkcmFnIDogdmFsdWU7CiAgICAgIH07CgogICAgICBkcmFnLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIGRyYWcpIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBkcmFnOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmluZShjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7CiAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7CiAgICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07CiAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICB9CgogICAgZnVuY3Rpb24gQ29sb3IoKSB7fQoKICAgIHZhciBkYXJrZXIgPSAwLjc7CiAgICB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyOwoKICAgIHZhciByZUkgPSAiXFxzKihbKy1dP1xcZCspXFxzKiIsCiAgICAgICAgcmVOID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsCiAgICAgICAgcmVQID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLAogICAgICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sCiAgICAgICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVJLCByZUksIHJlSV0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlUCwgcmVQLCByZVBdICsgIlxcKSQiKSwKICAgICAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVQLCByZVAsIHJlUCwgcmVOXSArICJcXCkkIiksCiAgICAgICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXmhzbFxcKCIgKyBbcmVOLCByZVAsIHJlUF0gKyAiXFwpJCIpLAogICAgICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKCJeaHNsYVxcKCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArICJcXCkkIik7CgogICAgdmFyIG5hbWVkID0gewogICAgICBhbGljZWJsdWU6IDB4ZjBmOGZmLAogICAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgICBhcXVhOiAweDAwZmZmZiwKICAgICAgYXF1YW1hcmluZTogMHg3ZmZmZDQsCiAgICAgIGF6dXJlOiAweGYwZmZmZiwKICAgICAgYmVpZ2U6IDB4ZjVmNWRjLAogICAgICBiaXNxdWU6IDB4ZmZlNGM0LAogICAgICBibGFjazogMHgwMDAwMDAsCiAgICAgIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCwKICAgICAgYmx1ZTogMHgwMDAwZmYsCiAgICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgICBicm93bjogMHhhNTJhMmEsCiAgICAgIGJ1cmx5d29vZDogMHhkZWI4ODcsCiAgICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICAgIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLAogICAgICBjaG9jb2xhdGU6IDB4ZDI2OTFlLAogICAgICBjb3JhbDogMHhmZjdmNTAsCiAgICAgIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCwKICAgICAgY29ybnNpbGs6IDB4ZmZmOGRjLAogICAgICBjcmltc29uOiAweGRjMTQzYywKICAgICAgY3lhbjogMHgwMGZmZmYsCiAgICAgIGRhcmtibHVlOiAweDAwMDA4YiwKICAgICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYiwKICAgICAgZGFya2dyYXk6IDB4YTlhOWE5LAogICAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgICBkYXJrZ3JleTogMHhhOWE5YTksCiAgICAgIGRhcmtraGFraTogMHhiZGI3NmIsCiAgICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgICAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLAogICAgICBkYXJrb3JhbmdlOiAweGZmOGMwMCwKICAgICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICAgIGRhcmtyZWQ6IDB4OGIwMDAwLAogICAgICBkYXJrc2FsbW9uOiAweGU5OTY3YSwKICAgICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgICAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsCiAgICAgIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLAogICAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgICAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsCiAgICAgIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLAogICAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICAgIGRlZXBza3libHVlOiAweDAwYmZmZiwKICAgICAgZGltZ3JheTogMHg2OTY5NjksCiAgICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgICBkb2RnZXJibHVlOiAweDFlOTBmZiwKICAgICAgZmlyZWJyaWNrOiAweGIyMjIyMiwKICAgICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsCiAgICAgIGZ1Y2hzaWE6IDB4ZmYwMGZmLAogICAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgICBnaG9zdHdoaXRlOiAweGY4ZjhmZiwKICAgICAgZ29sZDogMHhmZmQ3MDAsCiAgICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICAgIGdyYXk6IDB4ODA4MDgwLAogICAgICBncmVlbjogMHgwMDgwMDAsCiAgICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgICAgZ3JleTogMHg4MDgwODAsCiAgICAgIGhvbmV5ZGV3OiAweGYwZmZmMCwKICAgICAgaG90cGluazogMHhmZjY5YjQsCiAgICAgIGluZGlhbnJlZDogMHhjZDVjNWMsCiAgICAgIGluZGlnbzogMHg0YjAwODIsCiAgICAgIGl2b3J5OiAweGZmZmZmMCwKICAgICAga2hha2k6IDB4ZjBlNjhjLAogICAgICBsYXZlbmRlcjogMHhlNmU2ZmEsCiAgICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgICBsYXduZ3JlZW46IDB4N2NmYzAwLAogICAgICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLAogICAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgICBsaWdodGNvcmFsOiAweGYwODA4MCwKICAgICAgbGlnaHRjeWFuOiAweGUwZmZmZiwKICAgICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgICBsaWdodGdyYXk6IDB4ZDNkM2QzLAogICAgICBsaWdodGdyZWVuOiAweDkwZWU5MCwKICAgICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgICAgbGlnaHRwaW5rOiAweGZmYjZjMSwKICAgICAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLAogICAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgICAgbGlnaHRza3libHVlOiAweDg3Y2VmYSwKICAgICAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LAogICAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICAgIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSwKICAgICAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLAogICAgICBsaW1lOiAweDAwZmYwMCwKICAgICAgbGltZWdyZWVuOiAweDMyY2QzMiwKICAgICAgbGluZW46IDB4ZmFmMGU2LAogICAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgICAgbWFyb29uOiAweDgwMDAwMCwKICAgICAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsCiAgICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLAogICAgICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLAogICAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICAgIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsCiAgICAgIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwKICAgICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgICAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSwKICAgICAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwKICAgICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgICAgbWlzdHlyb3NlOiAweGZmZTRlMSwKICAgICAgbW9jY2FzaW46IDB4ZmZlNGI1LAogICAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICAgIG5hdnk6IDB4MDAwMDgwLAogICAgICBvbGRsYWNlOiAweGZkZjVlNiwKICAgICAgb2xpdmU6IDB4ODA4MDAwLAogICAgICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLAogICAgICBvcmFuZ2U6IDB4ZmZhNTAwLAogICAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgICBvcmNoaWQ6IDB4ZGE3MGQ2LAogICAgICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwKICAgICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgICAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsCiAgICAgIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLAogICAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgICAgcGVhY2hwdWZmOiAweGZmZGFiOSwKICAgICAgcGVydTogMHhjZDg1M2YsCiAgICAgIHBpbms6IDB4ZmZjMGNiLAogICAgICBwbHVtOiAweGRkYTBkZCwKICAgICAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsCiAgICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICAgIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LAogICAgICByZWQ6IDB4ZmYwMDAwLAogICAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgICByb3lhbGJsdWU6IDB4NDE2OWUxLAogICAgICBzYWRkbGVicm93bjogMHg4YjQ1MTMsCiAgICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICAgIHNhbmR5YnJvd246IDB4ZjRhNDYwLAogICAgICBzZWFncmVlbjogMHgyZThiNTcsCiAgICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgICAgc2llbm5hOiAweGEwNTIyZCwKICAgICAgc2lsdmVyOiAweGMwYzBjMCwKICAgICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICAgIHNsYXRlYmx1ZTogMHg2YTVhY2QsCiAgICAgIHNsYXRlZ3JheTogMHg3MDgwOTAsCiAgICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICAgIHNub3c6IDB4ZmZmYWZhLAogICAgICBzcHJpbmdncmVlbjogMHgwMGZmN2YsCiAgICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICAgIHRhbjogMHhkMmI0OGMsCiAgICAgIHRlYWw6IDB4MDA4MDgwLAogICAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgICAgdG9tYXRvOiAweGZmNjM0NywKICAgICAgdHVycXVvaXNlOiAweDQwZTBkMCwKICAgICAgdmlvbGV0OiAweGVlODJlZSwKICAgICAgd2hlYXQ6IDB4ZjVkZWIzLAogICAgICB3aGl0ZTogMHhmZmZmZmYsCiAgICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgICB5ZWxsb3c6IDB4ZmZmZjAwLAogICAgICB5ZWxsb3dncmVlbjogMHg5YWNkMzIKICAgIH07CgogICAgZGVmaW5lKENvbG9yLCBjb2xvciwgewogICAgICBjb3B5OiBmdW5jdGlvbihjaGFubmVscykgewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7CiAgICAgIH0sCiAgICAgIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpOwogICAgICB9LAogICAgICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICAgICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICAgIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLAogICAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICAgICAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYgogICAgfSk7CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkgewogICAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7CiAgICAgIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7CiAgICAgIHZhciBtLCBsOwogICAgICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMAogICAgICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwCiAgICAgICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMAogICAgICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwCiAgICAgICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4CiAgICAgICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApCiAgICAgICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpCiAgICAgICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSkKICAgICAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpCiAgICAgICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKQogICAgICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKQogICAgICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucwogICAgICAgICAgOiBmb3JtYXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgICAgICA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcmdibihuKSB7CiAgICAgIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7CiAgICAgIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjsKICAgICAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjsKICAgICAgbyA9IG8ucmdiKCk7CiAgICAgIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5yID0gK3I7CiAgICAgIHRoaXMuZyA9ICtnOwogICAgICB0aGlzLmIgPSArYjsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9LAogICAgICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICAgIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCwKICAgICAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLAogICAgICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYgogICAgfSkpOwoKICAgIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgICAgIHJldHVybiAiIyIgKyBoZXgodGhpcy5yKSArIGhleCh0aGlzLmcpICsgaGV4KHRoaXMuYik7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHsKICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgIHJldHVybiAoYSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCIpCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSkKICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICB9CgogICAgZnVuY3Rpb24gaGV4KHZhbHVlKSB7CiAgICAgIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgICAgIHJldHVybiAodmFsdWUgPCAxNiA/ICIwIiA6ICIiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICAgICAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOOwogICAgICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjsKICAgICAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOOwogICAgICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvOwogICAgICBvID0gby5yZ2IoKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksCiAgICAgICAgICBoID0gTmFOLAogICAgICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7CiAgICAgIGlmIChzKSB7CiAgICAgICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICAgICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyOwogICAgICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDsKICAgICAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgICAgIGggKj0gNjA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkgewogICAgICB0aGlzLmggPSAraDsKICAgICAgdGhpcy5zID0gK3M7CiAgICAgIHRoaXMubCA9ICtsOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIHJnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsCiAgICAgICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICAgICAgbCA9IHRoaXMubCwKICAgICAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcywKICAgICAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICAgIHJldHVybiBuZXcgUmdiKAogICAgICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksCiAgICAgICAgICB0aGlzLm9wYWNpdHkKICAgICAgICApOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7CiAgICAgIH0sCiAgICAgIGZvcm1hdEhzbDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgICAgcmV0dXJuIChhID09PSAxID8gImhzbCgiIDogImhzbGEoIikKICAgICAgICAgICAgKyAodGhpcy5oIHx8IDApICsgIiwgIgogICAgICAgICAgICArICh0aGlzLnMgfHwgMCkgKiAxMDAgKyAiJSwgIgogICAgICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyAiJSIKICAgICAgICAgICAgKyAoYSA9PT0gMSA/ICIpIiA6ICIsICIgKyBhICsgIikiKTsKICAgICAgfQogICAgfSkpOwoKICAgIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICAgIGZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7CiAgICAgIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjAKICAgICAgICAgIDogaCA8IDE4MCA/IG0yCiAgICAgICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwCiAgICAgICAgICA6IG0xKSAqIDI1NTsKICAgIH0KCiAgICB2YXIgZGVnMnJhZCA9IE1hdGguUEkgLyAxODA7CiAgICB2YXIgcmFkMmRlZyA9IDE4MCAvIE1hdGguUEk7CgogICAgLy8gaHR0cHM6Ly9vYnNlcnZhYmxlaHEuY29tL0BtYm9zdG9jay9sYWItYW5kLXJnYgogICAgdmFyIEsgPSAxOCwKICAgICAgICBYbiA9IDAuOTY0MjIsCiAgICAgICAgWW4gPSAxLAogICAgICAgIFpuID0gMC44MjUyMSwKICAgICAgICB0MCA9IDQgLyAyOSwKICAgICAgICB0MSA9IDYgLyAyOSwKICAgICAgICB0MiA9IDMgKiB0MSAqIHQxLAogICAgICAgIHQzID0gdDEgKiB0MSAqIHQxOwoKICAgIGZ1bmN0aW9uIGxhYkNvbnZlcnQobykgewogICAgICBpZiAobyBpbnN0YW5jZW9mIExhYikgcmV0dXJuIG5ldyBMYWIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIY2wpIHJldHVybiBoY2wybGFiKG8pOwogICAgICBpZiAoIShvIGluc3RhbmNlb2YgUmdiKSkgbyA9IHJnYkNvbnZlcnQobyk7CiAgICAgIHZhciByID0gcmdiMmxyZ2Ioby5yKSwKICAgICAgICAgIGcgPSByZ2IybHJnYihvLmcpLAogICAgICAgICAgYiA9IHJnYjJscmdiKG8uYiksCiAgICAgICAgICB5ID0geHl6MmxhYigoMC4yMjI1MDQ1ICogciArIDAuNzE2ODc4NiAqIGcgKyAwLjA2MDYxNjkgKiBiKSAvIFluKSwgeCwgejsKICAgICAgaWYgKHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHsKICAgICAgICB4ID0geHl6MmxhYigoMC40MzYwNzQ3ICogciArIDAuMzg1MDY0OSAqIGcgKyAwLjE0MzA4MDQgKiBiKSAvIFhuKTsKICAgICAgICB6ID0geHl6MmxhYigoMC4wMTM5MzIyICogciArIDAuMDk3MTA0NSAqIGcgKyAwLjcxNDE3MzMgKiBiKSAvIFpuKTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IExhYigxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ3JheShsLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBuZXcgTGFiKGwsIDAsIDAsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsYWIobCwgYSwgYiwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQobCkgOiBuZXcgTGFiKGwsIGEsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBMYWIobCwgYSwgYiwgb3BhY2l0eSkgewogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5hID0gK2E7CiAgICAgIHRoaXMuYiA9ICtiOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUoTGFiLCBsYWIsIGV4dGVuZChDb2xvciwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiBuZXcgTGFiKHRoaXMubCArIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMYWIodGhpcy5sIC0gSyAqIChrID09IG51bGwgPyAxIDogayksIHRoaXMuYSwgdGhpcy5iLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB5ID0gKHRoaXMubCArIDE2KSAvIDExNiwKICAgICAgICAgICAgeCA9IGlzTmFOKHRoaXMuYSkgPyB5IDogeSArIHRoaXMuYSAvIDUwMCwKICAgICAgICAgICAgeiA9IGlzTmFOKHRoaXMuYikgPyB5IDogeSAtIHRoaXMuYiAvIDIwMDsKICAgICAgICB4ID0gWG4gKiBsYWIyeHl6KHgpOwogICAgICAgIHkgPSBZbiAqIGxhYjJ4eXooeSk7CiAgICAgICAgeiA9IFpuICogbGFiMnh5eih6KTsKICAgICAgICByZXR1cm4gbmV3IFJnYigKICAgICAgICAgIGxyZ2IycmdiKCAzLjEzMzg1NjEgKiB4IC0gMS42MTY4NjY3ICogeSAtIDAuNDkwNjE0NiAqIHopLAogICAgICAgICAgbHJnYjJyZ2IoLTAuOTc4NzY4NCAqIHggKyAxLjkxNjE0MTUgKiB5ICsgMC4wMzM0NTQwICogeiksCiAgICAgICAgICBscmdiMnJnYiggMC4wNzE5NDUzICogeCAtIDAuMjI4OTkxNCAqIHkgKyAxLjQwNTI0MjcgKiB6KSwKICAgICAgICAgIHRoaXMub3BhY2l0eQogICAgICAgICk7CiAgICAgIH0KICAgIH0pKTsKCiAgICBmdW5jdGlvbiB4eXoybGFiKHQpIHsKICAgICAgcmV0dXJuIHQgPiB0MyA/IE1hdGgucG93KHQsIDEgLyAzKSA6IHQgLyB0MiArIHQwOwogICAgfQoKICAgIGZ1bmN0aW9uIGxhYjJ4eXoodCkgewogICAgICByZXR1cm4gdCA+IHQxID8gdCAqIHQgKiB0IDogdDIgKiAodCAtIHQwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBscmdiMnJnYih4KSB7CiAgICAgIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYjJscmdiKHgpIHsKICAgICAgcmV0dXJuICh4IC89IDI1NSkgPD0gMC4wNDA0NSA/IHggLyAxMi45MiA6IE1hdGgucG93KCh4ICsgMC4wNTUpIC8gMS4wNTUsIDIuNCk7CiAgICB9CgogICAgZnVuY3Rpb24gaGNsQ29udmVydChvKSB7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgSGNsKSByZXR1cm4gbmV3IEhjbChvLmgsIG8uYywgby5sLCBvLm9wYWNpdHkpOwogICAgICBpZiAoIShvIGluc3RhbmNlb2YgTGFiKSkgbyA9IGxhYkNvbnZlcnQobyk7CiAgICAgIGlmIChvLmEgPT09IDAgJiYgby5iID09PSAwKSByZXR1cm4gbmV3IEhjbChOYU4sIDAgPCBvLmwgJiYgby5sIDwgMTAwID8gMCA6IE5hTiwgby5sLCBvLm9wYWNpdHkpOwogICAgICB2YXIgaCA9IE1hdGguYXRhbjIoby5iLCBvLmEpICogcmFkMmRlZzsKICAgICAgcmV0dXJuIG5ldyBIY2woaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsY2gobCwgYywgaCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQobCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2woaCwgYywgbCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhjbENvbnZlcnQoaCkgOiBuZXcgSGNsKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBIY2woaCwgYywgbCwgb3BhY2l0eSkgewogICAgICB0aGlzLmggPSAraDsKICAgICAgdGhpcy5jID0gK2M7CiAgICAgIHRoaXMubCA9ICtsOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2wybGFiKG8pIHsKICAgICAgaWYgKGlzTmFOKG8uaCkpIHJldHVybiBuZXcgTGFiKG8ubCwgMCwgMCwgby5vcGFjaXR5KTsKICAgICAgdmFyIGggPSBvLmggKiBkZWcycmFkOwogICAgICByZXR1cm4gbmV3IExhYihvLmwsIE1hdGguY29zKGgpICogby5jLCBNYXRoLnNpbihoKSAqIG8uYywgby5vcGFjaXR5KTsKICAgIH0KCiAgICBkZWZpbmUoSGNsLCBoY2wsIGV4dGVuZChDb2xvciwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiBuZXcgSGNsKHRoaXMuaCwgdGhpcy5jLCB0aGlzLmwgKyBLICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBIY2wodGhpcy5oLCB0aGlzLmMsIHRoaXMubCAtIEsgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBoY2wybGFiKHRoaXMpLnJnYigpOwogICAgICB9CiAgICB9KSk7CgogICAgdmFyIEEgPSAtMC4xNDg2MSwKICAgICAgICBCID0gKzEuNzgyNzcsCiAgICAgICAgQyA9IC0wLjI5MjI3LAogICAgICAgIEQgPSAtMC45MDY0OSwKICAgICAgICBFID0gKzEuOTcyOTQsCiAgICAgICAgRUQgPSBFICogRCwKICAgICAgICBFQiA9IEUgKiBCLAogICAgICAgIEJDX0RBID0gQiAqIEMgLSBEICogQTsKCiAgICBmdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0KG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDdWJlaGVsaXgpIHJldHVybiBuZXcgQ3ViZWhlbGl4KG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IpKSBvID0gcmdiQ29udmVydChvKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIGwgPSAoQkNfREEgKiBiICsgRUQgKiByIC0gRUIgKiBnKSAvIChCQ19EQSArIEVEIC0gRUIpLAogICAgICAgICAgYmwgPSBiIC0gbCwKICAgICAgICAgIGsgPSAoRSAqIChnIC0gbCkgLSBDICogYmwpIC8gRCwKICAgICAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MQogICAgICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGssIGJsKSAqIHJhZDJkZWcgLSAxMjAgOiBOYU47CiAgICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KGggPCAwID8gaCArIDM2MCA6IGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjdWJlaGVsaXhDb252ZXJ0KGgpIDogbmV3IEN1YmVoZWxpeChoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gQ3ViZWhlbGl4KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5oID0gK2g7CiAgICAgIHRoaXMucyA9ICtzOwogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lKEN1YmVoZWxpeCwgY3ViZWhlbGl4LCBleHRlbmQoQ29sb3IsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIgOiBNYXRoLnBvdyhkYXJrZXIsIGspOwogICAgICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIGRlZzJyYWQsCiAgICAgICAgICAgIGwgPSArdGhpcy5sLAogICAgICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSwKICAgICAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLAogICAgICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IoCiAgICAgICAgICAyNTUgKiAobCArIGEgKiAoQSAqIGNvc2ggKyBCICogc2luaCkpLAogICAgICAgICAgMjU1ICogKGwgKyBhICogKEMgKiBjb3NoICsgRCAqIHNpbmgpKSwKICAgICAgICAgIDI1NSAqIChsICsgYSAqIChFICogY29zaCkpLAogICAgICAgICAgdGhpcy5vcGFjaXR5CiAgICAgICAgKTsKICAgICAgfQogICAgfSkpOwoKICAgIGZ1bmN0aW9uIGJhc2lzKHQxLCB2MCwgdjEsIHYyLCB2MykgewogICAgICB2YXIgdDIgPSB0MSAqIHQxLCB0MyA9IHQyICogdDE7CiAgICAgIHJldHVybiAoKDEgLSAzICogdDEgKyAzICogdDIgLSB0MykgKiB2MAogICAgICAgICAgKyAoNCAtIDYgKiB0MiArIDMgKiB0MykgKiB2MQogICAgICAgICAgKyAoMSArIDMgKiB0MSArIDMgKiB0MiAtIDMgKiB0MykgKiB2MgogICAgICAgICAgKyB0MyAqIHYzKSAvIDY7CiAgICB9CgogICAgZnVuY3Rpb24gYmFzaXMkMSh2YWx1ZXMpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoIC0gMTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgaSA9IHQgPD0gMCA/ICh0ID0gMCkgOiB0ID49IDEgPyAodCA9IDEsIG4gLSAxKSA6IE1hdGguZmxvb3IodCAqIG4pLAogICAgICAgICAgICB2MSA9IHZhbHVlc1tpXSwKICAgICAgICAgICAgdjIgPSB2YWx1ZXNbaSArIDFdLAogICAgICAgICAgICB2MCA9IGkgPiAwID8gdmFsdWVzW2kgLSAxXSA6IDIgKiB2MSAtIHYyLAogICAgICAgICAgICB2MyA9IGkgPCBuIC0gMSA/IHZhbHVlc1tpICsgMl0gOiAyICogdjIgLSB2MTsKICAgICAgICByZXR1cm4gYmFzaXMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYmFzaXNDbG9zZWQodmFsdWVzKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgaSA9IE1hdGguZmxvb3IoKCh0ICU9IDEpIDwgMCA/ICsrdCA6IHQpICogbiksCiAgICAgICAgICAgIHYwID0gdmFsdWVzWyhpICsgbiAtIDEpICUgbl0sCiAgICAgICAgICAgIHYxID0gdmFsdWVzW2kgJSBuXSwKICAgICAgICAgICAgdjIgPSB2YWx1ZXNbKGkgKyAxKSAlIG5dLAogICAgICAgICAgICB2MyA9IHZhbHVlc1soaSArIDIpICUgbl07CiAgICAgICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDMoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyKGEsIGQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gYSArIHQgKiBkOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHsKICAgICAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaHVlKGEsIGIpIHsKICAgICAgdmFyIGQgPSBiIC0gYTsKICAgICAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudCQzKGlzTmFOKGEpID8gYiA6IGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdhbW1hKHkpIHsKICAgICAgcmV0dXJuICh5ID0gK3kpID09PSAxID8gbm9nYW1tYSA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbChhLCBiLCB5KSA6IGNvbnN0YW50JDMoaXNOYU4oYSkgPyBiIDogYSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbm9nYW1tYShhLCBiKSB7CiAgICAgIHZhciBkID0gYiAtIGE7CiAgICAgIHJldHVybiBkID8gbGluZWFyKGEsIGQpIDogY29uc3RhbnQkMyhpc05hTihhKSA/IGIgOiBhKTsKICAgIH0KCiAgICB2YXIgaW50ZXJwb2xhdGVSZ2IgPSAoZnVuY3Rpb24gcmdiR2FtbWEoeSkgewogICAgICB2YXIgY29sb3IgPSBnYW1tYSh5KTsKCiAgICAgIGZ1bmN0aW9uIHJnYiQxKHN0YXJ0LCBlbmQpIHsKICAgICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYihzdGFydCkpLnIsIChlbmQgPSByZ2IoZW5kKSkuciksCiAgICAgICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksCiAgICAgICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksCiAgICAgICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgICBzdGFydC5nID0gZyh0KTsKICAgICAgICAgIHN0YXJ0LmIgPSBiKHQpOwogICAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgICB9OwogICAgICB9CgogICAgICByZ2IkMS5nYW1tYSA9IHJnYkdhbW1hOwoKICAgICAgcmV0dXJuIHJnYiQxOwogICAgfSkoMSk7CgogICAgZnVuY3Rpb24gcmdiU3BsaW5lKHNwbGluZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oY29sb3JzKSB7CiAgICAgICAgdmFyIG4gPSBjb2xvcnMubGVuZ3RoLAogICAgICAgICAgICByID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICBnID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICBiID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICBpLCBjb2xvcjsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBjb2xvciA9IHJnYihjb2xvcnNbaV0pOwogICAgICAgICAgcltpXSA9IGNvbG9yLnIgfHwgMDsKICAgICAgICAgIGdbaV0gPSBjb2xvci5nIHx8IDA7CiAgICAgICAgICBiW2ldID0gY29sb3IuYiB8fCAwOwogICAgICAgIH0KICAgICAgICByID0gc3BsaW5lKHIpOwogICAgICAgIGcgPSBzcGxpbmUoZyk7CiAgICAgICAgYiA9IHNwbGluZShiKTsKICAgICAgICBjb2xvci5vcGFjaXR5ID0gMTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgY29sb3IuciA9IHIodCk7CiAgICAgICAgICBjb2xvci5nID0gZyh0KTsKICAgICAgICAgIGNvbG9yLmIgPSBiKHQpOwogICAgICAgICAgcmV0dXJuIGNvbG9yICsgIiI7CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgcmdiQmFzaXMgPSByZ2JTcGxpbmUoYmFzaXMkMSk7CiAgICB2YXIgcmdiQmFzaXNDbG9zZWQgPSByZ2JTcGxpbmUoYmFzaXNDbG9zZWQpOwoKICAgIGZ1bmN0aW9uIG51bWJlckFycmF5KGEsIGIpIHsKICAgICAgaWYgKCFiKSBiID0gW107CiAgICAgIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLAogICAgICAgICAgYyA9IGIuc2xpY2UoKSwKICAgICAgICAgIGk7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaXNOdW1iZXJBcnJheSh4KSB7CiAgICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoeCkgJiYgISh4IGluc3RhbmNlb2YgRGF0YVZpZXcpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFycmF5JDEoYSwgYikgewogICAgICByZXR1cm4gKGlzTnVtYmVyQXJyYXkoYikgPyBudW1iZXJBcnJheSA6IGdlbmVyaWNBcnJheSkoYSwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJpY0FycmF5KGEsIGIpIHsKICAgICAgdmFyIG5iID0gYiA/IGIubGVuZ3RoIDogMCwKICAgICAgICAgIG5hID0gYSA/IE1hdGgubWluKG5iLCBhLmxlbmd0aCkgOiAwLAogICAgICAgICAgeCA9IG5ldyBBcnJheShuYSksCiAgICAgICAgICBjID0gbmV3IEFycmF5KG5iKSwKICAgICAgICAgIGk7CgogICAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgeFtpXSA9IGludGVycG9sYXRlVmFsdWUoYVtpXSwgYltpXSk7CiAgICAgIGZvciAoOyBpIDwgbmI7ICsraSkgY1tpXSA9IGJbaV07CgogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSBjW2ldID0geFtpXSh0KTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkYXRlKGEsIGIpIHsKICAgICAgdmFyIGQgPSBuZXcgRGF0ZTsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGQuc2V0VGltZShhICogKDEgLSB0KSArIGIgKiB0KSwgZDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKSB7CiAgICAgIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG9iamVjdChhLCBiKSB7CiAgICAgIHZhciBpID0ge30sCiAgICAgICAgICBjID0ge30sCiAgICAgICAgICBrOwoKICAgICAgaWYgKGEgPT09IG51bGwgfHwgdHlwZW9mIGEgIT09ICJvYmplY3QiKSBhID0ge307CiAgICAgIGlmIChiID09PSBudWxsIHx8IHR5cGVvZiBiICE9PSAib2JqZWN0IikgYiA9IHt9OwoKICAgICAgZm9yIChrIGluIGIpIHsKICAgICAgICBpZiAoayBpbiBhKSB7CiAgICAgICAgICBpW2tdID0gaW50ZXJwb2xhdGVWYWx1ZShhW2tdLCBiW2tdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY1trXSA9IGJba107CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgcmVBID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgICAgIHJlQiA9IG5ldyBSZWdFeHAocmVBLnNvdXJjZSwgImciKTsKCiAgICBmdW5jdGlvbiB6ZXJvKGIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uZShiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGIodCkgKyAiIjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmluZyhhLCBiKSB7CiAgICAgIHZhciBiaSA9IHJlQS5sYXN0SW5kZXggPSByZUIubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYgogICAgICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYQogICAgICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55CiAgICAgICAgICBpID0gLTEsIC8vIGluZGV4IGluIHMKICAgICAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCgogICAgICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgICAgIGEgPSBhICsgIiIsIGIgPSBiICsgIiI7CgogICAgICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLgogICAgICB3aGlsZSAoKGFtID0gcmVBLmV4ZWMoYSkpCiAgICAgICAgICAmJiAoYm0gPSByZUIuZXhlYyhiKSkpIHsKICAgICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGIKICAgICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgICAgIH0KICAgICAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJtOwogICAgICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzCiAgICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgICAgcS5wdXNoKHtpOiBpLCB4OiBpbnRlcnBvbGF0ZU51bWJlcihhbSwgYm0pfSk7CiAgICAgICAgfQogICAgICAgIGJpID0gcmVCLmxhc3RJbmRleDsKICAgICAgfQoKICAgICAgLy8gQWRkIHJlbWFpbnMgb2YgYi4KICAgICAgaWYgKGJpIDwgYi5sZW5ndGgpIHsKICAgICAgICBicyA9IGIuc2xpY2UoYmkpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgIH0KCiAgICAgIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLgogICAgICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLgogICAgICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF0KICAgICAgICAgID8gb25lKHFbMF0ueCkKICAgICAgICAgIDogemVybyhiKSkKICAgICAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICAgICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlVmFsdWUoYSwgYikgewogICAgICB2YXIgdCA9IHR5cGVvZiBiLCBjOwogICAgICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50JDMoYikKICAgICAgICAgIDogKHQgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIKICAgICAgICAgIDogdCA9PT0gInN0cmluZyIgPyAoKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKSA6IGludGVycG9sYXRlU3RyaW5nKQogICAgICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYgogICAgICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUKICAgICAgICAgIDogaXNOdW1iZXJBcnJheShiKSA/IG51bWJlckFycmF5CiAgICAgICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJyYXkKICAgICAgICAgIDogdHlwZW9mIGIudmFsdWVPZiAhPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgYi50b1N0cmluZyAhPT0gImZ1bmN0aW9uIiB8fCBpc05hTihiKSA/IG9iamVjdAogICAgICAgICAgOiBpbnRlcnBvbGF0ZU51bWJlcikoYSwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzY3JldGUocmFuZ2UpIHsKICAgICAgdmFyIG4gPSByYW5nZS5sZW5ndGg7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIHJhbmdlW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBodWUkMShhLCBiKSB7CiAgICAgIHZhciBpID0gaHVlKCthLCArYik7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIHggPSBpKHQpOwogICAgICAgIHJldHVybiB4IC0gMzYwICogTWF0aC5mbG9vcih4IC8gMzYwKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVJvdW5kKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYSAqICgxIC0gdCkgKyBiICogdCk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwoKICAgIHZhciBpZGVudGl0eSQyID0gewogICAgICB0cmFuc2xhdGVYOiAwLAogICAgICB0cmFuc2xhdGVZOiAwLAogICAgICByb3RhdGU6IDAsCiAgICAgIHNrZXdYOiAwLAogICAgICBzY2FsZVg6IDEsCiAgICAgIHNjYWxlWTogMQogICAgfTsKCiAgICBmdW5jdGlvbiBkZWNvbXBvc2UoYSwgYiwgYywgZCwgZSwgZikgewogICAgICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYOwogICAgICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgICAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7CiAgICAgIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHJhbnNsYXRlWDogZSwKICAgICAgICB0cmFuc2xhdGVZOiBmLAogICAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsCiAgICAgICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLAogICAgICAgIHNjYWxlWDogc2NhbGVYLAogICAgICAgIHNjYWxlWTogc2NhbGVZCiAgICAgIH07CiAgICB9CgogICAgdmFyIGNzc05vZGUsCiAgICAgICAgY3NzUm9vdCwKICAgICAgICBjc3NWaWV3LAogICAgICAgIHN2Z05vZGU7CgogICAgZnVuY3Rpb24gcGFyc2VDc3MkMSh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT09ICJub25lIikgcmV0dXJuIGlkZW50aXR5JDI7CiAgICAgIGlmICghY3NzTm9kZSkgY3NzTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIkRJViIpLCBjc3NSb290ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBjc3NWaWV3ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CiAgICAgIGNzc05vZGUuc3R5bGUudHJhbnNmb3JtID0gdmFsdWU7CiAgICAgIHZhbHVlID0gY3NzVmlldy5nZXRDb21wdXRlZFN0eWxlKGNzc1Jvb3QuYXBwZW5kQ2hpbGQoY3NzTm9kZSksIG51bGwpLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpOwogICAgICBjc3NSb290LnJlbW92ZUNoaWxkKGNzc05vZGUpOwogICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDcsIC0xKS5zcGxpdCgiLCIpOwogICAgICByZXR1cm4gZGVjb21wb3NlKCt2YWx1ZVswXSwgK3ZhbHVlWzFdLCArdmFsdWVbMl0sICt2YWx1ZVszXSwgK3ZhbHVlWzRdLCArdmFsdWVbNV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlU3ZnKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHkkMjsKICAgICAgaWYgKCFzdmdOb2RlKSBzdmdOb2RlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsICJnIik7CiAgICAgIHN2Z05vZGUuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCB2YWx1ZSk7CiAgICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5JDI7CiAgICAgIHZhbHVlID0gdmFsdWUubWF0cml4OwogICAgICByZXR1cm4gZGVjb21wb3NlKHZhbHVlLmEsIHZhbHVlLmIsIHZhbHVlLmMsIHZhbHVlLmQsIHZhbHVlLmUsIHZhbHVlLmYpOwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlVHJhbnNmb3JtKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICAgICAgZnVuY3Rpb24gcG9wKHMpIHsKICAgICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogaW50ZXJwb2xhdGVOdW1iZXIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIoeWEsIHliKX0pOwogICAgICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHsKICAgICAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHsKICAgICAgICBpZiAoYSAhPT0gYikgewogICAgICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHsKICAgICAgICBpZiAoYSAhPT0gYikgewogICAgICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5Yil9KTsKICAgICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIgKyB4YiArICIsIiArIHliICsgIikiKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTsKICAgICAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTsKICAgICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTsKICAgICAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7CiAgICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZUNzcyQxLCAicHgsICIsICJweCkiLCAiZGVnKSIpOwogICAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtU3ZnID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VTdmcsICIsICIsICIpIiwgIikiKTsKCiAgICB2YXIgcmhvID0gTWF0aC5TUVJUMiwKICAgICAgICByaG8yID0gMiwKICAgICAgICByaG80ID0gNCwKICAgICAgICBlcHNpbG9uMiA9IDFlLTEyOwoKICAgIGZ1bmN0aW9uIGNvc2goeCkgewogICAgICByZXR1cm4gKCh4ID0gTWF0aC5leHAoeCkpICsgMSAvIHgpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5oKHgpIHsKICAgICAgcmV0dXJuICgoeCA9IE1hdGguZXhwKHgpKSAtIDEgLyB4KSAvIDI7CiAgICB9CgogICAgZnVuY3Rpb24gdGFuaCh4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwogICAgfQoKICAgIC8vIHAwID0gW3V4MCwgdXkwLCB3MF0KICAgIC8vIHAxID0gW3V4MSwgdXkxLCB3MV0KICAgIGZ1bmN0aW9uIGludGVycG9sYXRlWm9vbShwMCwgcDEpIHsKICAgICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSwKICAgICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSwKICAgICAgICAgIGR4ID0gdXgxIC0gdXgwLAogICAgICAgICAgZHkgPSB1eTEgLSB1eTAsCiAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LAogICAgICAgICAgaSwKICAgICAgICAgIFM7CgogICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS4KICAgICAgaWYgKGQyIDwgZXBzaWxvbjIpIHsKICAgICAgICBTID0gTWF0aC5sb2codzEgLyB3MCkgLyByaG87CiAgICAgICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHV4MCArIHQgKiBkeCwKICAgICAgICAgICAgdXkwICsgdCAqIGR5LAogICAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyAqIHQgKiBTKQogICAgICAgICAgXTsKICAgICAgICB9OwogICAgICB9CgogICAgICAvLyBHZW5lcmFsIGNhc2UuCiAgICAgIGVsc2UgewogICAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksCiAgICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCAqIGQyKSAvICgyICogdzAgKiByaG8yICogZDEpLAogICAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQgKiBkMikgLyAoMiAqIHcxICogcmhvMiAqIGQxKSwKICAgICAgICAgICAgcjAgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjAgKiBiMCArIDEpIC0gYjApLAogICAgICAgICAgICByMSA9IE1hdGgubG9nKE1hdGguc3FydChiMSAqIGIxICsgMSkgLSBiMSk7CiAgICAgICAgUyA9IChyMSAtIHIwKSAvIHJobzsKICAgICAgICBpID0gZnVuY3Rpb24odCkgewogICAgICAgICAgdmFyIHMgPSB0ICogUywKICAgICAgICAgICAgICBjb3NocjAgPSBjb3NoKHIwKSwKICAgICAgICAgICAgICB1ID0gdzAgLyAocmhvMiAqIGQxKSAqIChjb3NocjAgKiB0YW5oKHJobyAqIHMgKyByMCkgLSBzaW5oKHIwKSk7CiAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB1eDAgKyB1ICogZHgsCiAgICAgICAgICAgIHV5MCArIHUgKiBkeSwKICAgICAgICAgICAgdzAgKiBjb3NocjAgLyBjb3NoKHJobyAqIHMgKyByMCkKICAgICAgICAgIF07CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwOwoKICAgICAgcmV0dXJuIGk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsJDEoaHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gaHNsKHN0YXJ0KSkuaCwgKGVuZCA9IGhzbChlbmQpKS5oKSwKICAgICAgICAgICAgcyA9IG5vZ2FtbWEoc3RhcnQucywgZW5kLnMpLAogICAgICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksCiAgICAgICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgc3RhcnQuaCA9IGgodCk7CiAgICAgICAgICBzdGFydC5zID0gcyh0KTsKICAgICAgICAgIHN0YXJ0LmwgPSBsKHQpOwogICAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgICB9OwogICAgICB9CiAgICB9CgogICAgdmFyIGhzbCQyID0gaHNsJDEoaHVlKTsKICAgIHZhciBoc2xMb25nID0gaHNsJDEobm9nYW1tYSk7CgogICAgZnVuY3Rpb24gbGFiJDEoc3RhcnQsIGVuZCkgewogICAgICB2YXIgbCA9IG5vZ2FtbWEoKHN0YXJ0ID0gbGFiKHN0YXJ0KSkubCwgKGVuZCA9IGxhYihlbmQpKS5sKSwKICAgICAgICAgIGEgPSBub2dhbW1hKHN0YXJ0LmEsIGVuZC5hKSwKICAgICAgICAgIGIgPSBub2dhbW1hKHN0YXJ0LmIsIGVuZC5iKSwKICAgICAgICAgIG9wYWNpdHkgPSBub2dhbW1hKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICBzdGFydC5sID0gbCh0KTsKICAgICAgICBzdGFydC5hID0gYSh0KTsKICAgICAgICBzdGFydC5iID0gYih0KTsKICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2wkMShodWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBoY2woc3RhcnQpKS5oLCAoZW5kID0gaGNsKGVuZCkpLmgpLAogICAgICAgICAgICBjID0gbm9nYW1tYShzdGFydC5jLCBlbmQuYyksCiAgICAgICAgICAgIGwgPSBub2dhbW1hKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICBzdGFydC5oID0gaCh0KTsKICAgICAgICAgIHN0YXJ0LmMgPSBjKHQpOwogICAgICAgICAgc3RhcnQubCA9IGwodCk7CiAgICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgICAgIH07CiAgICAgIH0KICAgIH0KCiAgICB2YXIgaGNsJDIgPSBoY2wkMShodWUpOwogICAgdmFyIGhjbExvbmcgPSBoY2wkMShub2dhbW1hKTsKCiAgICBmdW5jdGlvbiBjdWJlaGVsaXgkMShodWUpIHsKICAgICAgcmV0dXJuIChmdW5jdGlvbiBjdWJlaGVsaXhHYW1tYSh5KSB7CiAgICAgICAgeSA9ICt5OwoKICAgICAgICBmdW5jdGlvbiBjdWJlaGVsaXgkMShzdGFydCwgZW5kKSB7CiAgICAgICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjdWJlaGVsaXgoc3RhcnQpKS5oLCAoZW5kID0gY3ViZWhlbGl4KGVuZCkpLmgpLAogICAgICAgICAgICAgIHMgPSBub2dhbW1hKHN0YXJ0LnMsIGVuZC5zKSwKICAgICAgICAgICAgICBsID0gbm9nYW1tYShzdGFydC5sLCBlbmQubCksCiAgICAgICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgc3RhcnQuaCA9IGgodCk7CiAgICAgICAgICAgIHN0YXJ0LnMgPSBzKHQpOwogICAgICAgICAgICBzdGFydC5sID0gbChNYXRoLnBvdyh0LCB5KSk7CiAgICAgICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICBjdWJlaGVsaXgkMS5nYW1tYSA9IGN1YmVoZWxpeEdhbW1hOwoKICAgICAgICByZXR1cm4gY3ViZWhlbGl4JDE7CiAgICAgIH0pKDEpOwogICAgfQoKICAgIHZhciBjdWJlaGVsaXgkMiA9IGN1YmVoZWxpeCQxKGh1ZSk7CiAgICB2YXIgY3ViZWhlbGl4TG9uZyA9IGN1YmVoZWxpeCQxKG5vZ2FtbWEpOwoKICAgIGZ1bmN0aW9uIHBpZWNld2lzZShpbnRlcnBvbGF0ZSwgdmFsdWVzKSB7CiAgICAgIHZhciBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGggLSAxLCB2ID0gdmFsdWVzWzBdLCBJID0gbmV3IEFycmF5KG4gPCAwID8gMCA6IG4pOwogICAgICB3aGlsZSAoaSA8IG4pIElbaV0gPSBpbnRlcnBvbGF0ZSh2LCB2ID0gdmFsdWVzWysraV0pOwogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHZhciBpID0gTWF0aC5tYXgoMCwgTWF0aC5taW4obiAtIDEsIE1hdGguZmxvb3IodCAqPSBuKSkpOwogICAgICAgIHJldHVybiBJW2ldKHQgLSBpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBxdWFudGl6ZShpbnRlcnBvbGF0b3IsIG4pIHsKICAgICAgdmFyIHNhbXBsZXMgPSBuZXcgQXJyYXkobik7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSBzYW1wbGVzW2ldID0gaW50ZXJwb2xhdG9yKGkgLyAobiAtIDEpKTsKICAgICAgcmV0dXJuIHNhbXBsZXM7CiAgICB9CgogICAgdmFyIGZyYW1lID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/CiAgICAgICAgdGltZW91dCA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgICAgIGludGVydmFsID0gMCwgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgICAgIHBva2VEZWxheSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICAgICAgdGFza0hlYWQsCiAgICAgICAgdGFza1RhaWwsCiAgICAgICAgY2xvY2tMYXN0ID0gMCwKICAgICAgICBjbG9ja05vdyA9IDAsCiAgICAgICAgY2xvY2tTa2V3ID0gMCwKICAgICAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTsKCiAgICBmdW5jdGlvbiBub3coKSB7CiAgICAgIHJldHVybiBjbG9ja05vdyB8fCAoc2V0RnJhbWUoY2xlYXJOb3cpLCBjbG9ja05vdyA9IGNsb2NrLm5vdygpICsgY2xvY2tTa2V3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhck5vdygpIHsKICAgICAgY2xvY2tOb3cgPSAwOwogICAgfQoKICAgIGZ1bmN0aW9uIFRpbWVyKCkgewogICAgICB0aGlzLl9jYWxsID0KICAgICAgdGhpcy5fdGltZSA9CiAgICAgIHRoaXMuX25leHQgPSBudWxsOwogICAgfQoKICAgIFRpbWVyLnByb3RvdHlwZSA9IHRpbWVyLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRpbWVyLAogICAgICByZXN0YXJ0OiBmdW5jdGlvbihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgVHlwZUVycm9yKCJjYWxsYmFjayBpcyBub3QgYSBmdW5jdGlvbiIpOwogICAgICAgIHRpbWUgPSAodGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCAhPT0gdGhpcykgewogICAgICAgICAgaWYgKHRhc2tUYWlsKSB0YXNrVGFpbC5fbmV4dCA9IHRoaXM7CiAgICAgICAgICBlbHNlIHRhc2tIZWFkID0gdGhpczsKICAgICAgICAgIHRhc2tUYWlsID0gdGhpczsKICAgICAgICB9CiAgICAgICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgICAgIHRoaXMuX3RpbWUgPSB0aW1lOwogICAgICAgIHNsZWVwKCk7CiAgICAgIH0sCiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgICB0aGlzLl9jYWxsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTsKICAgICAgICAgIHNsZWVwKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHRpbWVyKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgICB2YXIgdCA9IG5ldyBUaW1lcjsKICAgICAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVyRmx1c2goKSB7CiAgICAgIG5vdygpOyAvLyBHZXQgdGhlIGN1cnJlbnQgdGltZSwgaWYgbm90IGFscmVhZHkgc2V0LgogICAgICArK2ZyYW1lOyAvLyBQcmV0ZW5kIHdl4oCZdmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlbuKAmXQgYWxyZWFkeS4KICAgICAgdmFyIHQgPSB0YXNrSGVhZCwgZTsKICAgICAgd2hpbGUgKHQpIHsKICAgICAgICBpZiAoKGUgPSBjbG9ja05vdyAtIHQuX3RpbWUpID49IDApIHQuX2NhbGwuY2FsbChudWxsLCBlKTsKICAgICAgICB0ID0gdC5fbmV4dDsKICAgICAgfQogICAgICAtLWZyYW1lOwogICAgfQoKICAgIGZ1bmN0aW9uIHdha2UoKSB7CiAgICAgIGNsb2NrTm93ID0gKGNsb2NrTGFzdCA9IGNsb2NrLm5vdygpKSArIGNsb2NrU2tldzsKICAgICAgZnJhbWUgPSB0aW1lb3V0ID0gMDsKICAgICAgdHJ5IHsKICAgICAgICB0aW1lckZsdXNoKCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZnJhbWUgPSAwOwogICAgICAgIG5hcCgpOwogICAgICAgIGNsb2NrTm93ID0gMDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHBva2UoKSB7CiAgICAgIHZhciBub3cgPSBjbG9jay5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3Q7CiAgICAgIGlmIChkZWxheSA+IHBva2VEZWxheSkgY2xvY2tTa2V3IC09IGRlbGF5LCBjbG9ja0xhc3QgPSBub3c7CiAgICB9CgogICAgZnVuY3Rpb24gbmFwKCkgewogICAgICB2YXIgdDAsIHQxID0gdGFza0hlYWQsIHQyLCB0aW1lID0gSW5maW5pdHk7CiAgICAgIHdoaWxlICh0MSkgewogICAgICAgIGlmICh0MS5fY2FsbCkgewogICAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCA9IHQyOwogICAgICAgIH0KICAgICAgfQogICAgICB0YXNrVGFpbCA9IHQwOwogICAgICBzbGVlcCh0aW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzbGVlcCh0aW1lKSB7CiAgICAgIGlmIChmcmFtZSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLgogICAgICBpZiAodGltZW91dCkgdGltZW91dCA9IGNsZWFyVGltZW91dCh0aW1lb3V0KTsKICAgICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgICAgaWYgKGRlbGF5ID4gMjQpIHsKICAgICAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0ID0gc2V0VGltZW91dCh3YWtlLCB0aW1lIC0gY2xvY2subm93KCkgLSBjbG9ja1NrZXcpOwogICAgICAgIGlmIChpbnRlcnZhbCkgaW50ZXJ2YWwgPSBjbGVhckludGVydmFsKGludGVydmFsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZiAoIWludGVydmFsKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwgPSBzZXRJbnRlcnZhbChwb2tlLCBwb2tlRGVsYXkpOwogICAgICAgIGZyYW1lID0gMSwgc2V0RnJhbWUod2FrZSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lb3V0JDEoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIHZhciB0ID0gbmV3IFRpbWVyOwogICAgICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5OwogICAgICB0LnJlc3RhcnQoZnVuY3Rpb24oZWxhcHNlZCkgewogICAgICAgIHQuc3RvcCgpOwogICAgICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7CiAgICAgIH0sIGRlbGF5LCB0aW1lKTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJ2YWwkMShjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXIsIHRvdGFsID0gZGVsYXk7CiAgICAgIGlmIChkZWxheSA9PSBudWxsKSByZXR1cm4gdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSksIHQ7CiAgICAgIGRlbGF5ID0gK2RlbGF5LCB0aW1lID0gdGltZSA9PSBudWxsID8gbm93KCkgOiArdGltZTsKICAgICAgdC5yZXN0YXJ0KGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgICAgIGVsYXBzZWQgKz0gdG90YWw7CiAgICAgICAgdC5yZXN0YXJ0KHRpY2ssIHRvdGFsICs9IGRlbGF5LCB0aW1lKTsKICAgICAgICBjYWxsYmFjayhlbGFwc2VkKTsKICAgICAgfSwgZGVsYXksIHRpbWUpOwogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICB2YXIgZW1wdHlPbiA9IGRpc3BhdGNoKCJzdGFydCIsICJlbmQiLCAiY2FuY2VsIiwgImludGVycnVwdCIpOwogICAgdmFyIGVtcHR5VHdlZW4gPSBbXTsKCiAgICB2YXIgQ1JFQVRFRCA9IDA7CiAgICB2YXIgU0NIRURVTEVEID0gMTsKICAgIHZhciBTVEFSVElORyA9IDI7CiAgICB2YXIgU1RBUlRFRCA9IDM7CiAgICB2YXIgUlVOTklORyA9IDQ7CiAgICB2YXIgRU5ESU5HID0gNTsKICAgIHZhciBFTkRFRCA9IDY7CgogICAgZnVuY3Rpb24gc2NoZWR1bGUkMShub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTsKICAgICAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47CiAgICAgIGNyZWF0ZSQxKG5vZGUsIGlkLCB7CiAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgICBvbjogZW1wdHlPbiwKICAgICAgICB0d2VlbjogZW1wdHlUd2VlbiwKICAgICAgICB0aW1lOiB0aW1pbmcudGltZSwKICAgICAgICBkZWxheTogdGltaW5nLmRlbGF5LAogICAgICAgIGR1cmF0aW9uOiB0aW1pbmcuZHVyYXRpb24sCiAgICAgICAgZWFzZTogdGltaW5nLmVhc2UsCiAgICAgICAgdGltZXI6IG51bGwsCiAgICAgICAgc3RhdGU6IENSRUFURUQKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdChub2RlLCBpZCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBnZXQkMihub2RlLCBpZCk7CiAgICAgIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQpIHRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgc2NoZWR1bGVkIik7CiAgICAgIHJldHVybiBzY2hlZHVsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXQkMihub2RlLCBpZCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBnZXQkMihub2RlLCBpZCk7CiAgICAgIGlmIChzY2hlZHVsZS5zdGF0ZSA+IFNUQVJURUQpIHRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpOwogICAgICByZXR1cm4gc2NoZWR1bGU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0JDIobm9kZSwgaWQpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247CiAgICAgIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTsKICAgICAgcmV0dXJuIHNjaGVkdWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZSQxKG5vZGUsIGlkLCBzZWxmKSB7CiAgICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgICAgIHR3ZWVuOwoKICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuCiAgICAgIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIQogICAgICBzY2hlZHVsZXNbaWRdID0gc2VsZjsKICAgICAgc2VsZi50aW1lciA9IHRpbWVyKHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOwoKICAgICAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkgewogICAgICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQ7CiAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHN0YXJ0LCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwoKICAgICAgICAvLyBJZiB0aGUgZWxhcHNlZCBkZWxheSBpcyBsZXNzIHRoYW4gb3VyIGZpcnN0IHNsZWVwLCBzdGFydCBpbW1lZGlhdGVseS4KICAgICAgICBpZiAoc2VsZi5kZWxheSA8PSBlbGFwc2VkKSBzdGFydChlbGFwc2VkIC0gc2VsZi5kZWxheSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHN0YXJ0KGVsYXBzZWQpIHsKICAgICAgICB2YXIgaSwgaiwgbiwgbzsKCiAgICAgICAgLy8gSWYgdGhlIHN0YXRlIGlzIG5vdCBTQ0hFRFVMRUQsIHRoZW4gd2UgcHJldmlvdXNseSBlcnJvcmVkIG9uIHN0YXJ0LgogICAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTQ0hFRFVMRUQpIHJldHVybiBzdG9wKCk7CgogICAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICAgIG8gPSBzY2hlZHVsZXNbaV07CiAgICAgICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlOwoKICAgICAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsCiAgICAgICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGEKICAgICAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhCiAgICAgICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCkgcmV0dXJuIHRpbWVvdXQkMShzdGFydCk7CgogICAgICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LgogICAgICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkcpIHsKICAgICAgICAgICAgby5zdGF0ZSA9IEVOREVEOwogICAgICAgICAgICBvLnRpbWVyLnN0b3AoKTsKICAgICAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuCiAgICAgICAgICBlbHNlIGlmICgraSA8IGlkKSB7CiAgICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICAgIG8ub24uY2FsbCgiY2FuY2VsIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7CiAgICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LgogICAgICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IQogICAgICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay4KICAgICAgICB0aW1lb3V0JDEoZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCkgewogICAgICAgICAgICBzZWxmLnN0YXRlID0gUlVOTklORzsKICAgICAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7CiAgICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLgogICAgICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORzsKICAgICAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HKSByZXR1cm47IC8vIGludGVycnVwdGVkCiAgICAgICAgc2VsZi5zdGF0ZSA9IFNUQVJURUQ7CgogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgICB0d2VlblsrK2pdID0gbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HLCAxKSwKICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICBuID0gdHdlZW4ubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTsKICAgICAgICB9CgogICAgICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuCiAgICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORykgewogICAgICAgICAgc2VsZi5vbi5jYWxsKCJlbmQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICAgIHN0b3AoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHN0b3AoKSB7CiAgICAgICAgc2VsZi5zdGF0ZSA9IEVOREVEOwogICAgICAgIHNlbGYudGltZXIuc3RvcCgpOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnJ1cHQobm9kZSwgbmFtZSkgewogICAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgICAgICBzY2hlZHVsZSwKICAgICAgICAgIGFjdGl2ZSwKICAgICAgICAgIGVtcHR5ID0gdHJ1ZSwKICAgICAgICAgIGk7CgogICAgICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuOwoKICAgICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CgogICAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfQogICAgICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkcgJiYgc2NoZWR1bGUuc3RhdGUgPCBFTkRJTkc7CiAgICAgICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRDsKICAgICAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7CiAgICAgICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgIH0KCiAgICAgIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9pbnRlcnJ1cHQobmFtZSkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIGludGVycnVwdCh0aGlzLCBuYW1lKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHdlZW5SZW1vdmUoaWQsIG5hbWUpIHsKICAgICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JDIodGhpcywgaWQpLAogICAgICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTsKICAgICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uKGlkLCBuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgdHdlZW4wLCB0d2VlbjE7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQyKHRoaXMsIGlkKSwKICAgICAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQogICAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgewogICAgICAgICAgdHdlZW4xID0gKHR3ZWVuMCA9IHR3ZWVuKS5zbGljZSgpOwogICAgICAgICAgZm9yICh2YXIgdCA9IHtuYW1lOiBuYW1lLCB2YWx1ZTogdmFsdWV9LCBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgICAgdHdlZW4xW2ldID0gdDsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGkgPT09IG4pIHR3ZWVuMS5wdXNoKHQpOwogICAgICAgIH0KCiAgICAgICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl90d2VlbihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIG5hbWUgKz0gIiI7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgdHdlZW4gPSBnZXQkMih0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgICByZXR1cm4gdC52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSA6IHR3ZWVuRnVuY3Rpb24pKGlkLCBuYW1lLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHR3ZWVuVmFsdWUodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7CgogICAgICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JDIodGhpcywgaWQpOwogICAgICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgICAgIHJldHVybiBnZXQkMihub2RlLCBpZCkudmFsdWVbbmFtZV07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoYSwgYikgewogICAgICB2YXIgYzsKICAgICAgcmV0dXJuICh0eXBlb2YgYiA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlcgogICAgICAgICAgOiBiIGluc3RhbmNlb2YgY29sb3IgPyBpbnRlcnBvbGF0ZVJnYgogICAgICAgICAgOiAoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpCiAgICAgICAgICA6IGludGVycG9sYXRlU3RyaW5nKShhLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlJDEobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDEoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQkMShuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIiwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMkMShmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24kMShuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7CiAgICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQxKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7CiAgICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiI7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fYXR0cihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gInRyYW5zZm9ybSIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyA6IGludGVycG9sYXRlOwogICAgICByZXR1cm4gdGhpcy5hdHRyVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TJDEgOiBhdHRyRnVuY3Rpb24kMSkoZnVsbG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgImF0dHIuIiArIG5hbWUsIHZhbHVlKSkKICAgICAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyQxIDogYXR0clJlbW92ZSQxKShmdWxsbmFtZSkKICAgICAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMkMSA6IGF0dHJDb25zdGFudCQxKShmdWxsbmFtZSwgaSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUobmFtZSwgaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgaS5jYWxsKHRoaXMsIHQpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyhmdWxsbmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIHQwLCBpMDsKICAgICAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyhmdWxsbmFtZSwgaSk7CiAgICAgICAgcmV0dXJuIHQwOwogICAgICB9CiAgICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm4gdHdlZW47CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciB0MCwgaTA7CiAgICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlKG5hbWUsIGkpOwogICAgICAgIHJldHVybiB0MDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fYXR0clR3ZWVuKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBrZXkgPSAiYXR0ci4iICsgbmFtZTsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TIDogYXR0clR3ZWVuKShmdWxsbmFtZSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWxheUZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgaW5pdCh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWxheUNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgewogICAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9kZWxheSh2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBkZWxheUZ1bmN0aW9uCiAgICAgICAgICAgICAgOiBkZWxheUNvbnN0YW50KShpZCwgdmFsdWUpKQogICAgICAgICAgOiBnZXQkMih0aGlzLm5vZGUoKSwgaWQpLmRlbGF5OwogICAgfQoKICAgIGZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24oaWQsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBzZXQkMih0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgewogICAgICAgIHNldCQyKHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZHVyYXRpb24odmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvbgogICAgICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCkoaWQsIHZhbHVlKSkKICAgICAgICAgIDogZ2V0JDIodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHNldCQyKHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9lYXNlKHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudChpZCwgdmFsdWUpKQogICAgICAgICAgOiBnZXQkMih0aGlzLm5vZGUoKSwgaWQpLmVhc2U7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIobWF0Y2gpIHsKICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyKG1hdGNoKTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkgewogICAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fbWVyZ2UodHJhbnNpdGlvbikgewogICAgICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7CgogICAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsKICAgICAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yICg7IGogPCBtMDsgKytqKSB7CiAgICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXJ0KG5hbWUpIHsKICAgICAgcmV0dXJuIChuYW1lICsgIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICByZXR1cm4gIXQgfHwgdCA9PT0gInN0YXJ0IjsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpIHsKICAgICAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydChuYW1lKSA/IGluaXQgOiBzZXQkMjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksCiAgICAgICAgICAgIG9uID0gc2NoZWR1bGUub247CgogICAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIQogICAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CgogICAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fb24obmFtZSwgbGlzdGVuZXIpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIKICAgICAgICAgID8gZ2V0JDIodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKQogICAgICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbihpZCwgbmFtZSwgbGlzdGVuZXIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVGdW5jdGlvbihpZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47CiAgICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fcmVtb3ZlKCkgewogICAgICByZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsIHJlbW92ZUZ1bmN0aW9uKHRoaXMuX2lkKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Qoc2VsZWN0KSB7CiAgICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgICAgIGlkID0gdGhpcy5faWQ7CgogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICAgIHNjaGVkdWxlJDEoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0JDIobm9kZSwgaWQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3NlbGVjdEFsbChzZWxlY3QpIHsKICAgICAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICAgICAgaWQgPSB0aGlzLl9pZDsKCiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbChzZWxlY3QpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0JDIobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykgewogICAgICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7CiAgICAgICAgICAgICAgICBzY2hlZHVsZSQxKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTsKICAgIH0KCiAgICB2YXIgU2VsZWN0aW9uJDEgPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yOwoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhpcywgbmFtZSkpOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDEobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCA9IHN0eWxlVmFsdWUodGhpcywgbmFtZSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbiQxKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSwKICAgICAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHsKICAgICAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9ICJzdHlsZS4iICsgbmFtZSwgZXZlbnQgPSAiZW5kLiIgKyBrZXksIHJlbW92ZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQyKHRoaXMsIGlkKSwKICAgICAgICAgICAgb24gPSBzY2hlZHVsZS5vbiwKICAgICAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlJDEobmFtZSkpIDogdW5kZWZpbmVkOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwoKICAgICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3N0eWxlKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICB2YXIgaSA9IChuYW1lICs9ICIiKSA9PT0gInRyYW5zZm9ybSIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA6IGludGVycG9sYXRlOwogICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXMKICAgICAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBzdHlsZVJlbW92ZSQxKG5hbWUpKQogICAgICAgIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcwogICAgICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbiQxKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgInN0eWxlLiIgKyBuYW1lLCB2YWx1ZSkpKQogICAgICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpCiAgICAgICAgOiB0aGlzCiAgICAgICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50JDEobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBudWxsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICB2YXIgdCwgaTA7CiAgICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgICByZXR1cm4gdDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIGtleSA9ICJzdHlsZS4iICsgKG5hbWUgKz0gIiIpOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dENvbnN0YW50JDEodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24kMSh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpOwogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/ICIiIDogdmFsdWUxOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdGV4dCh2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyB0ZXh0RnVuY3Rpb24kMSh0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAgICAgICAgOiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkgewogICAgICB2YXIgdDAsIGkwOwogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTsKICAgICAgICByZXR1cm4gdDA7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHRUd2Vlbih2YWx1ZSkgewogICAgICB2YXIga2V5ID0gInRleHQiOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHJhbnNpdGlvbigpIHsKICAgICAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgICAgICBpZDEgPSBuZXdJZCgpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQkMihub2RlLCBpZDApOwogICAgICAgICAgICBzY2hlZHVsZSQxKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHsKICAgICAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgICBkZWxheTogMCwKICAgICAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZW5kKCkgewogICAgICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LAogICAgICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19OwoKICAgICAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMih0aGlzLCBpZCksCiAgICAgICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIQogICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgICAgaWYgKG9uICE9PSBvbjApIHsKICAgICAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7CiAgICAgICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7CiAgICAgICAgICB9CgogICAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBpZCA9IDA7CgogICAgZnVuY3Rpb24gVHJhbnNpdGlvbihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICAgIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICAgICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgICB0aGlzLl9pZCA9IGlkOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb24obmFtZSkgewogICAgICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXdJZCgpIHsKICAgICAgcmV0dXJuICsraWQ7CiAgICB9CgogICAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlOwoKICAgIFRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbi5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBUcmFuc2l0aW9uLAogICAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0LAogICAgICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsLAogICAgICBmaWx0ZXI6IHRyYW5zaXRpb25fZmlsdGVyLAogICAgICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSwKICAgICAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbiwKICAgICAgdHJhbnNpdGlvbjogdHJhbnNpdGlvbl90cmFuc2l0aW9uLAogICAgICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlLmNhbGwsCiAgICAgIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGVzLAogICAgICBub2RlOiBzZWxlY3Rpb25fcHJvdG90eXBlLm5vZGUsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUuc2l6ZSwKICAgICAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUuZW1wdHksCiAgICAgIGVhY2g6IHNlbGVjdGlvbl9wcm90b3R5cGUuZWFjaCwKICAgICAgb246IHRyYW5zaXRpb25fb24sCiAgICAgIGF0dHI6IHRyYW5zaXRpb25fYXR0ciwKICAgICAgYXR0clR3ZWVuOiB0cmFuc2l0aW9uX2F0dHJUd2VlbiwKICAgICAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUsCiAgICAgIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbiwKICAgICAgdGV4dDogdHJhbnNpdGlvbl90ZXh0LAogICAgICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuLAogICAgICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlLAogICAgICB0d2VlbjogdHJhbnNpdGlvbl90d2VlbiwKICAgICAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXksCiAgICAgIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uLAogICAgICBlYXNlOiB0cmFuc2l0aW9uX2Vhc2UsCiAgICAgIGVuZDogdHJhbnNpdGlvbl9lbmQKICAgIH07CgogICAgZnVuY3Rpb24gbGluZWFyJDEodCkgewogICAgICByZXR1cm4gK3Q7CiAgICB9CgogICAgZnVuY3Rpb24gcXVhZEluKHQpIHsKICAgICAgcmV0dXJuIHQgKiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YWRPdXQodCkgewogICAgICByZXR1cm4gdCAqICgyIC0gdCk7CiAgICB9CgogICAgZnVuY3Rpb24gcXVhZEluT3V0KHQpIHsKICAgICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgOiAtLXQgKiAoMiAtIHQpICsgMSkgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1YmljSW4odCkgewogICAgICByZXR1cm4gdCAqIHQgKiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIGN1YmljT3V0KHQpIHsKICAgICAgcmV0dXJuIC0tdCAqIHQgKiB0ICsgMTsKICAgIH0KCiAgICBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHsKICAgICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjsKICAgIH0KCiAgICB2YXIgZXhwb25lbnQgPSAzOwoKICAgIHZhciBwb2x5SW4gPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsKICAgICAgZSA9ICtlOwoKICAgICAgZnVuY3Rpb24gcG9seUluKHQpIHsKICAgICAgICByZXR1cm4gTWF0aC5wb3codCwgZSk7CiAgICAgIH0KCiAgICAgIHBvbHlJbi5leHBvbmVudCA9IGN1c3RvbTsKCiAgICAgIHJldHVybiBwb2x5SW47CiAgICB9KShleHBvbmVudCk7CgogICAgdmFyIHBvbHlPdXQgPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsKICAgICAgZSA9ICtlOwoKICAgICAgZnVuY3Rpb24gcG9seU91dCh0KSB7CiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gdCwgZSk7CiAgICAgIH0KCiAgICAgIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207CgogICAgICByZXR1cm4gcG9seU91dDsKICAgIH0pKGV4cG9uZW50KTsKCiAgICB2YXIgcG9seUluT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShlKSB7CiAgICAgIGUgPSArZTsKCiAgICAgIGZ1bmN0aW9uIHBvbHlJbk91dCh0KSB7CiAgICAgICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gTWF0aC5wb3codCwgZSkgOiAyIC0gTWF0aC5wb3coMiAtIHQsIGUpKSAvIDI7CiAgICAgIH0KCiAgICAgIHBvbHlJbk91dC5leHBvbmVudCA9IGN1c3RvbTsKCiAgICAgIHJldHVybiBwb2x5SW5PdXQ7CiAgICB9KShleHBvbmVudCk7CgogICAgdmFyIHBpID0gTWF0aC5QSSwKICAgICAgICBoYWxmUGkgPSBwaSAvIDI7CgogICAgZnVuY3Rpb24gc2luSW4odCkgewogICAgICByZXR1cm4gMSAtIE1hdGguY29zKHQgKiBoYWxmUGkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpbk91dCh0KSB7CiAgICAgIHJldHVybiBNYXRoLnNpbih0ICogaGFsZlBpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5Jbk91dCh0KSB7CiAgICAgIHJldHVybiAoMSAtIE1hdGguY29zKHBpICogdCkpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBJbih0KSB7CiAgICAgIHJldHVybiBNYXRoLnBvdygyLCAxMCAqIHQgLSAxMCk7CiAgICB9CgogICAgZnVuY3Rpb24gZXhwT3V0KHQpIHsKICAgICAgcmV0dXJuIDEgLSBNYXRoLnBvdygyLCAtMTAgKiB0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBJbk91dCh0KSB7CiAgICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KDIsIDEwICogdCAtIDEwKSA6IDIgLSBNYXRoLnBvdygyLCAxMCAtIDEwICogdCkpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjaXJjbGVJbih0KSB7CiAgICAgIHJldHVybiAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2lyY2xlT3V0KHQpIHsKICAgICAgcmV0dXJuIE1hdGguc3FydCgxIC0gLS10ICogdCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2lyY2xlSW5PdXQodCkgewogICAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCkgOiBNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSAvIDI7CiAgICB9CgogICAgdmFyIGIxID0gNCAvIDExLAogICAgICAgIGIyID0gNiAvIDExLAogICAgICAgIGIzID0gOCAvIDExLAogICAgICAgIGI0ID0gMyAvIDQsCiAgICAgICAgYjUgPSA5IC8gMTEsCiAgICAgICAgYjYgPSAxMCAvIDExLAogICAgICAgIGI3ID0gMTUgLyAxNiwKICAgICAgICBiOCA9IDIxIC8gMjIsCiAgICAgICAgYjkgPSA2MyAvIDY0LAogICAgICAgIGIwID0gMSAvIGIxIC8gYjE7CgogICAgZnVuY3Rpb24gYm91bmNlSW4odCkgewogICAgICByZXR1cm4gMSAtIGJvdW5jZU91dCgxIC0gdCk7CiAgICB9CgogICAgZnVuY3Rpb24gYm91bmNlT3V0KHQpIHsKICAgICAgcmV0dXJuICh0ID0gK3QpIDwgYjEgPyBiMCAqIHQgKiB0IDogdCA8IGIzID8gYjAgKiAodCAtPSBiMikgKiB0ICsgYjQgOiB0IDwgYjYgPyBiMCAqICh0IC09IGI1KSAqIHQgKyBiNyA6IGIwICogKHQgLT0gYjgpICogdCArIGI5OwogICAgfQoKICAgIGZ1bmN0aW9uIGJvdW5jZUluT3V0KHQpIHsKICAgICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gMSAtIGJvdW5jZU91dCgxIC0gdCkgOiBib3VuY2VPdXQodCAtIDEpICsgMSkgLyAyOwogICAgfQoKICAgIHZhciBvdmVyc2hvb3QgPSAxLjcwMTU4OwoKICAgIHZhciBiYWNrSW4gPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICAgICAgcyA9ICtzOwoKICAgICAgZnVuY3Rpb24gYmFja0luKHQpIHsKICAgICAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKICAgICAgfQoKICAgICAgYmFja0luLm92ZXJzaG9vdCA9IGN1c3RvbTsKCiAgICAgIHJldHVybiBiYWNrSW47CiAgICB9KShvdmVyc2hvb3QpOwoKICAgIHZhciBiYWNrT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShzKSB7CiAgICAgIHMgPSArczsKCiAgICAgIGZ1bmN0aW9uIGJhY2tPdXQodCkgewogICAgICAgIHJldHVybiAtLXQgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAxOwogICAgICB9CgogICAgICBiYWNrT3V0Lm92ZXJzaG9vdCA9IGN1c3RvbTsKCiAgICAgIHJldHVybiBiYWNrT3V0OwogICAgfSkob3ZlcnNob290KTsKCiAgICB2YXIgYmFja0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShzKSB7CiAgICAgIHMgPSArczsKCiAgICAgIGZ1bmN0aW9uIGJhY2tJbk91dCh0KSB7CiAgICAgICAgcmV0dXJuICgodCAqPSAyKSA8IDEgPyB0ICogdCAqICgocyArIDEpICogdCAtIHMpIDogKHQgLT0gMikgKiB0ICogKChzICsgMSkgKiB0ICsgcykgKyAyKSAvIDI7CiAgICAgIH0KCiAgICAgIGJhY2tJbk91dC5vdmVyc2hvb3QgPSBjdXN0b207CgogICAgICByZXR1cm4gYmFja0luT3V0OwogICAgfSkob3ZlcnNob290KTsKCiAgICB2YXIgdGF1ID0gMiAqIE1hdGguUEksCiAgICAgICAgYW1wbGl0dWRlID0gMSwKICAgICAgICBwZXJpb2QgPSAwLjM7CgogICAgdmFyIGVsYXN0aWNJbiA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkgewogICAgICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1KTsKCiAgICAgIGZ1bmN0aW9uIGVsYXN0aWNJbih0KSB7CiAgICAgICAgcmV0dXJuIGEgKiBNYXRoLnBvdygyLCAxMCAqIC0tdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCk7CiAgICAgIH0KCiAgICAgIGVsYXN0aWNJbi5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSk7IH07CiAgICAgIGVsYXN0aWNJbi5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogICAgICByZXR1cm4gZWxhc3RpY0luOwogICAgfSkoYW1wbGl0dWRlLCBwZXJpb2QpOwoKICAgIHZhciBlbGFzdGljT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7CiAgICAgIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpOwoKICAgICAgZnVuY3Rpb24gZWxhc3RpY091dCh0KSB7CiAgICAgICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApOwogICAgICB9CgogICAgICBlbGFzdGljT3V0LmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTsKICAgICAgZWxhc3RpY091dC5wZXJpb2QgPSBmdW5jdGlvbihwKSB7IHJldHVybiBjdXN0b20oYSwgcCk7IH07CgogICAgICByZXR1cm4gZWxhc3RpY091dDsKICAgIH0pKGFtcGxpdHVkZSwgcGVyaW9kKTsKCiAgICB2YXIgZWxhc3RpY0luT3V0ID0gKGZ1bmN0aW9uIGN1c3RvbShhLCBwKSB7CiAgICAgIHZhciBzID0gTWF0aC5hc2luKDEgLyAoYSA9IE1hdGgubWF4KDEsIGEpKSkgKiAocCAvPSB0YXUpOwoKICAgICAgZnVuY3Rpb24gZWxhc3RpY0luT3V0KHQpIHsKICAgICAgICByZXR1cm4gKCh0ID0gdCAqIDIgLSAxKSA8IDAKICAgICAgICAgICAgPyBhICogTWF0aC5wb3coMiwgMTAgKiB0KSAqIE1hdGguc2luKChzIC0gdCkgLyBwKQogICAgICAgICAgICA6IDIgLSBhICogTWF0aC5wb3coMiwgLTEwICogdCkgKiBNYXRoLnNpbigocyArIHQpIC8gcCkpIC8gMjsKICAgICAgfQoKICAgICAgZWxhc3RpY0luT3V0LmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1KTsgfTsKICAgICAgZWxhc3RpY0luT3V0LnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTsKCiAgICAgIHJldHVybiBlbGFzdGljSW5PdXQ7CiAgICB9KShhbXBsaXR1ZGUsIHBlcmlvZCk7CgogICAgdmFyIHNyYyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgZWFzZUxpbmVhcjogbGluZWFyJDEsCiAgICAgICAgZWFzZVF1YWQ6IHF1YWRJbk91dCwKICAgICAgICBlYXNlUXVhZEluOiBxdWFkSW4sCiAgICAgICAgZWFzZVF1YWRPdXQ6IHF1YWRPdXQsCiAgICAgICAgZWFzZVF1YWRJbk91dDogcXVhZEluT3V0LAogICAgICAgIGVhc2VDdWJpYzogY3ViaWNJbk91dCwKICAgICAgICBlYXNlQ3ViaWNJbjogY3ViaWNJbiwKICAgICAgICBlYXNlQ3ViaWNPdXQ6IGN1YmljT3V0LAogICAgICAgIGVhc2VDdWJpY0luT3V0OiBjdWJpY0luT3V0LAogICAgICAgIGVhc2VQb2x5OiBwb2x5SW5PdXQsCiAgICAgICAgZWFzZVBvbHlJbjogcG9seUluLAogICAgICAgIGVhc2VQb2x5T3V0OiBwb2x5T3V0LAogICAgICAgIGVhc2VQb2x5SW5PdXQ6IHBvbHlJbk91dCwKICAgICAgICBlYXNlU2luOiBzaW5Jbk91dCwKICAgICAgICBlYXNlU2luSW46IHNpbkluLAogICAgICAgIGVhc2VTaW5PdXQ6IHNpbk91dCwKICAgICAgICBlYXNlU2luSW5PdXQ6IHNpbkluT3V0LAogICAgICAgIGVhc2VFeHA6IGV4cEluT3V0LAogICAgICAgIGVhc2VFeHBJbjogZXhwSW4sCiAgICAgICAgZWFzZUV4cE91dDogZXhwT3V0LAogICAgICAgIGVhc2VFeHBJbk91dDogZXhwSW5PdXQsCiAgICAgICAgZWFzZUNpcmNsZTogY2lyY2xlSW5PdXQsCiAgICAgICAgZWFzZUNpcmNsZUluOiBjaXJjbGVJbiwKICAgICAgICBlYXNlQ2lyY2xlT3V0OiBjaXJjbGVPdXQsCiAgICAgICAgZWFzZUNpcmNsZUluT3V0OiBjaXJjbGVJbk91dCwKICAgICAgICBlYXNlQm91bmNlOiBib3VuY2VPdXQsCiAgICAgICAgZWFzZUJvdW5jZUluOiBib3VuY2VJbiwKICAgICAgICBlYXNlQm91bmNlT3V0OiBib3VuY2VPdXQsCiAgICAgICAgZWFzZUJvdW5jZUluT3V0OiBib3VuY2VJbk91dCwKICAgICAgICBlYXNlQmFjazogYmFja0luT3V0LAogICAgICAgIGVhc2VCYWNrSW46IGJhY2tJbiwKICAgICAgICBlYXNlQmFja091dDogYmFja091dCwKICAgICAgICBlYXNlQmFja0luT3V0OiBiYWNrSW5PdXQsCiAgICAgICAgZWFzZUVsYXN0aWM6IGVsYXN0aWNPdXQsCiAgICAgICAgZWFzZUVsYXN0aWNJbjogZWxhc3RpY0luLAogICAgICAgIGVhc2VFbGFzdGljT3V0OiBlbGFzdGljT3V0LAogICAgICAgIGVhc2VFbGFzdGljSW5PdXQ6IGVsYXN0aWNJbk91dAogICAgfSk7CgogICAgdmFyIGRlZmF1bHRUaW1pbmcgPSB7CiAgICAgIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuCiAgICAgIGRlbGF5OiAwLAogICAgICBkdXJhdGlvbjogMjUwLAogICAgICBlYXNlOiBjdWJpY0luT3V0CiAgICB9OwoKICAgIGZ1bmN0aW9uIGluaGVyaXQobm9kZSwgaWQpIHsKICAgICAgdmFyIHRpbWluZzsKICAgICAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHsKICAgICAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmcudGltZSA9IG5vdygpLCBkZWZhdWx0VGltaW5nOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGltaW5nOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl90cmFuc2l0aW9uKG5hbWUpIHsKICAgICAgdmFyIGlkLAogICAgICAgICAgdGltaW5nOwoKICAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uKSB7CiAgICAgICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWQgPSBuZXdJZCgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZykudGltZSA9IG5vdygpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgICAgfQoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgc2NoZWR1bGUkMShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7CiAgICB9CgogICAgc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0OwogICAgc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247CgogICAgdmFyIHJvb3QkMiA9IFtudWxsXTsKCiAgICBmdW5jdGlvbiBhY3RpdmUobm9kZSwgbmFtZSkgewogICAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgICAgICBzY2hlZHVsZSwKICAgICAgICAgIGk7CgogICAgICBpZiAoc2NoZWR1bGVzKSB7CiAgICAgICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgICAgICAgZm9yIChpIGluIHNjaGVkdWxlcykgewogICAgICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkuc3RhdGUgPiBTQ0hFRFVMRUQgJiYgc2NoZWR1bGUubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oW1tub2RlXV0sIHJvb3QkMiwgbmFtZSwgK2kpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkNCh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBCcnVzaEV2ZW50KHRhcmdldCwgdHlwZSwgc2VsZWN0aW9uKSB7CiAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uJDEoKSB7CiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZXZlbnQkMSgpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgdmFyIE1PREVfRFJBRyA9IHtuYW1lOiAiZHJhZyJ9LAogICAgICAgIE1PREVfU1BBQ0UgPSB7bmFtZTogInNwYWNlIn0sCiAgICAgICAgTU9ERV9IQU5ETEUgPSB7bmFtZTogImhhbmRsZSJ9LAogICAgICAgIE1PREVfQ0VOVEVSID0ge25hbWU6ICJjZW50ZXIifTsKCiAgICBmdW5jdGlvbiBudW1iZXIxKGUpIHsKICAgICAgcmV0dXJuIFsrZVswXSwgK2VbMV1dOwogICAgfQoKICAgIGZ1bmN0aW9uIG51bWJlcjIoZSkgewogICAgICByZXR1cm4gW251bWJlcjEoZVswXSksIG51bWJlcjEoZVsxXSldOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvdWNoZXIoaWRlbnRpZmllcikgewogICAgICByZXR1cm4gZnVuY3Rpb24odGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIHRvdWNoKHRhcmdldCwgZXZlbnQudG91Y2hlcywgaWRlbnRpZmllcik7CiAgICAgIH07CiAgICB9CgogICAgdmFyIFggPSB7CiAgICAgIG5hbWU6ICJ4IiwKICAgICAgaGFuZGxlczogWyJ3IiwgImUiXS5tYXAodHlwZSksCiAgICAgIGlucHV0OiBmdW5jdGlvbih4LCBlKSB7IHJldHVybiB4ID09IG51bGwgPyBudWxsIDogW1sreFswXSwgZVswXVsxXV0sIFsreFsxXSwgZVsxXVsxXV1dOyB9LAogICAgICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMF0sIHh5WzFdWzBdXTsgfQogICAgfTsKCiAgICB2YXIgWSA9IHsKICAgICAgbmFtZTogInkiLAogICAgICBoYW5kbGVzOiBbIm4iLCAicyJdLm1hcCh0eXBlKSwKICAgICAgaW5wdXQ6IGZ1bmN0aW9uKHksIGUpIHsgcmV0dXJuIHkgPT0gbnVsbCA/IG51bGwgOiBbW2VbMF1bMF0sICt5WzBdXSwgW2VbMV1bMF0sICt5WzFdXV07IH0sCiAgICAgIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ICYmIFt4eVswXVsxXSwgeHlbMV1bMV1dOyB9CiAgICB9OwoKICAgIHZhciBYWSA9IHsKICAgICAgbmFtZTogInh5IiwKICAgICAgaGFuZGxlczogWyJuIiwgInciLCAiZSIsICJzIiwgIm53IiwgIm5lIiwgInN3IiwgInNlIl0ubWFwKHR5cGUpLAogICAgICBpbnB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5ID09IG51bGwgPyBudWxsIDogbnVtYmVyMih4eSk7IH0sCiAgICAgIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5OyB9CiAgICB9OwoKICAgIHZhciBjdXJzb3JzID0gewogICAgICBvdmVybGF5OiAiY3Jvc3NoYWlyIiwKICAgICAgc2VsZWN0aW9uOiAibW92ZSIsCiAgICAgIG46ICJucy1yZXNpemUiLAogICAgICBlOiAiZXctcmVzaXplIiwKICAgICAgczogIm5zLXJlc2l6ZSIsCiAgICAgIHc6ICJldy1yZXNpemUiLAogICAgICBudzogIm53c2UtcmVzaXplIiwKICAgICAgbmU6ICJuZXN3LXJlc2l6ZSIsCiAgICAgIHNlOiAibndzZS1yZXNpemUiLAogICAgICBzdzogIm5lc3ctcmVzaXplIgogICAgfTsKCiAgICB2YXIgZmxpcFggPSB7CiAgICAgIGU6ICJ3IiwKICAgICAgdzogImUiLAogICAgICBudzogIm5lIiwKICAgICAgbmU6ICJudyIsCiAgICAgIHNlOiAic3ciLAogICAgICBzdzogInNlIgogICAgfTsKCiAgICB2YXIgZmxpcFkgPSB7CiAgICAgIG46ICJzIiwKICAgICAgczogIm4iLAogICAgICBudzogInN3IiwKICAgICAgbmU6ICJzZSIsCiAgICAgIHNlOiAibmUiLAogICAgICBzdzogIm53IgogICAgfTsKCiAgICB2YXIgc2lnbnNYID0gewogICAgICBvdmVybGF5OiArMSwKICAgICAgc2VsZWN0aW9uOiArMSwKICAgICAgbjogbnVsbCwKICAgICAgZTogKzEsCiAgICAgIHM6IG51bGwsCiAgICAgIHc6IC0xLAogICAgICBudzogLTEsCiAgICAgIG5lOiArMSwKICAgICAgc2U6ICsxLAogICAgICBzdzogLTEKICAgIH07CgogICAgdmFyIHNpZ25zWSA9IHsKICAgICAgb3ZlcmxheTogKzEsCiAgICAgIHNlbGVjdGlvbjogKzEsCiAgICAgIG46IC0xLAogICAgICBlOiBudWxsLAogICAgICBzOiArMSwKICAgICAgdzogbnVsbCwKICAgICAgbnc6IC0xLAogICAgICBuZTogLTEsCiAgICAgIHNlOiArMSwKICAgICAgc3c6ICsxCiAgICB9OwoKICAgIGZ1bmN0aW9uIHR5cGUodCkgewogICAgICByZXR1cm4ge3R5cGU6IHR9OwogICAgfQoKICAgIC8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgogICAgZnVuY3Rpb24gZGVmYXVsdEZpbHRlciQxKCkgewogICAgICByZXR1cm4gIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmJ1dHRvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0RXh0ZW50KCkgewogICAgICB2YXIgc3ZnID0gdGhpcy5vd25lclNWR0VsZW1lbnQgfHwgdGhpczsKICAgICAgaWYgKHN2Zy5oYXNBdHRyaWJ1dGUoInZpZXdCb3giKSkgewogICAgICAgIHN2ZyA9IHN2Zy52aWV3Qm94LmJhc2VWYWw7CiAgICAgICAgcmV0dXJuIFtbc3ZnLngsIHN2Zy55XSwgW3N2Zy54ICsgc3ZnLndpZHRoLCBzdmcueSArIHN2Zy5oZWlnaHRdXTsKICAgICAgfQogICAgICByZXR1cm4gW1swLCAwXSwgW3N2Zy53aWR0aC5iYXNlVmFsLnZhbHVlLCBzdmcuaGVpZ2h0LmJhc2VWYWwudmFsdWVdXTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlJDEoKSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKCJvbnRvdWNoc3RhcnQiIGluIHRoaXMpOwogICAgfQoKICAgIC8vIExpa2UgZDMubG9jYWwsIGJ1dCB3aXRoIHRoZSBuYW1lIOKAnF9fYnJ1c2jigJ0gcmF0aGVyIHRoYW4gYXV0by1nZW5lcmF0ZWQuCiAgICBmdW5jdGlvbiBsb2NhbCQxKG5vZGUpIHsKICAgICAgd2hpbGUgKCFub2RlLl9fYnJ1c2gpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgICAgIHJldHVybiBub2RlLl9fYnJ1c2g7CiAgICB9CgogICAgZnVuY3Rpb24gZW1wdHkkMShleHRlbnQpIHsKICAgICAgcmV0dXJuIGV4dGVudFswXVswXSA9PT0gZXh0ZW50WzFdWzBdCiAgICAgICAgICB8fCBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXTsKICAgIH0KCiAgICBmdW5jdGlvbiBicnVzaFNlbGVjdGlvbihub2RlKSB7CiAgICAgIHZhciBzdGF0ZSA9IG5vZGUuX19icnVzaDsKICAgICAgcmV0dXJuIHN0YXRlID8gc3RhdGUuZGltLm91dHB1dChzdGF0ZS5zZWxlY3Rpb24pIDogbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBicnVzaFgoKSB7CiAgICAgIHJldHVybiBicnVzaCQxKFgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJydXNoWSgpIHsKICAgICAgcmV0dXJuIGJydXNoJDEoWSk7CiAgICB9CgogICAgZnVuY3Rpb24gYnJ1c2goKSB7CiAgICAgIHJldHVybiBicnVzaCQxKFhZKTsKICAgIH0KCiAgICBmdW5jdGlvbiBicnVzaCQxKGRpbSkgewogICAgICB2YXIgZXh0ZW50ID0gZGVmYXVsdEV4dGVudCwKICAgICAgICAgIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIkMSwKICAgICAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUkMSwKICAgICAgICAgIGtleXMgPSB0cnVlLAogICAgICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2goInN0YXJ0IiwgImJydXNoIiwgImVuZCIpLAogICAgICAgICAgaGFuZGxlU2l6ZSA9IDYsCiAgICAgICAgICB0b3VjaGVuZGluZzsKCiAgICAgIGZ1bmN0aW9uIGJydXNoKGdyb3VwKSB7CiAgICAgICAgdmFyIG92ZXJsYXkgPSBncm91cAogICAgICAgICAgICAucHJvcGVydHkoIl9fYnJ1c2giLCBpbml0aWFsaXplKQogICAgICAgICAgLnNlbGVjdEFsbCgiLm92ZXJsYXkiKQogICAgICAgICAgLmRhdGEoW3R5cGUoIm92ZXJsYXkiKV0pOwoKICAgICAgICBvdmVybGF5LmVudGVyKCkuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgIm92ZXJsYXkiKQogICAgICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIikKICAgICAgICAgICAgLmF0dHIoImN1cnNvciIsIGN1cnNvcnMub3ZlcmxheSkKICAgICAgICAgIC5tZXJnZShvdmVybGF5KQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgZXh0ZW50ID0gbG9jYWwkMSh0aGlzKS5leHRlbnQ7CiAgICAgICAgICAgICAgc2VsZWN0KHRoaXMpCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgICAgICAuYXR0cigieSIsIGV4dGVudFswXVsxXSkKICAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIGdyb3VwLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpCiAgICAgICAgICAuZGF0YShbdHlwZSgic2VsZWN0aW9uIildKQogICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgInNlbGVjdGlvbiIpCiAgICAgICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzLnNlbGVjdGlvbikKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAiIzc3NyIpCiAgICAgICAgICAgIC5hdHRyKCJmaWxsLW9wYWNpdHkiLCAwLjMpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiI2ZmZiIpCiAgICAgICAgICAgIC5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOwoKICAgICAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0pOwoKICAgICAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpOwoKICAgICAgICBoYW5kbGUuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiaGFuZGxlIGhhbmRsZS0tIiArIGQudHlwZTsgfSkKICAgICAgICAgICAgLmF0dHIoImN1cnNvciIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnNbZC50eXBlXTsgfSk7CgogICAgICAgIGdyb3VwCiAgICAgICAgICAgIC5lYWNoKHJlZHJhdykKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAibm9uZSIpCiAgICAgICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQogICAgICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIHN0YXJ0ZWQpCiAgICAgICAgICAuZmlsdGVyKHRvdWNoYWJsZSkKICAgICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIiwgc3RhcnRlZCkKICAgICAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCB0b3VjaG1vdmVkKQogICAgICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIiwgdG91Y2hlbmRlZCkKICAgICAgICAgICAgLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCAibm9uZSIpCiAgICAgICAgICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKTsKICAgICAgfQoKICAgICAgYnJ1c2gubW92ZSA9IGZ1bmN0aW9uKGdyb3VwLCBzZWxlY3Rpb24pIHsKICAgICAgICBpZiAoZ3JvdXAuc2VsZWN0aW9uKSB7CiAgICAgICAgICBncm91cAogICAgICAgICAgICAgIC5vbigic3RhcnQuYnJ1c2giLCBmdW5jdGlvbigpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKTsgfSkKICAgICAgICAgICAgICAub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLCBmdW5jdGlvbigpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgICAgIC50d2VlbigiYnJ1c2giLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMpLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjAgPSBzdGF0ZS5zZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uID09PSAiZnVuY3Rpb24iID8gc2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlVmFsdWUoc2VsZWN0aW9uMCwgc2VsZWN0aW9uMSk7CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gdHdlZW4odCkgewogICAgICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTsKICAgICAgICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICAgICAgICAgIGVtaXQuYnJ1c2goKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uMCAhPT0gbnVsbCAmJiBzZWxlY3Rpb24xICE9PSBudWxsID8gdHdlZW4gOiB0d2VlbigxKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ3JvdXAKICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gImZ1bmN0aW9uIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBhcmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSwKICAgICAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmdzKS5iZWZvcmVzdGFydCgpOwoKICAgICAgICAgICAgICAgIGludGVycnVwdCh0aGF0KTsKICAgICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogc2VsZWN0aW9uMTsKICAgICAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpOwogICAgICAgICAgICAgICAgZW1pdC5zdGFydCgpLmJydXNoKCkuZW5kKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbihncm91cCkgewogICAgICAgIGJydXNoLm1vdmUoZ3JvdXAsIG51bGwpOwogICAgICB9OwoKICAgICAgZnVuY3Rpb24gcmVkcmF3KCkgewogICAgICAgIHZhciBncm91cCA9IHNlbGVjdCh0aGlzKSwKICAgICAgICAgICAgc2VsZWN0aW9uID0gbG9jYWwkMSh0aGlzKS5zZWxlY3Rpb247CgogICAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICAgIGdyb3VwLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpCiAgICAgICAgICAgICAgLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCkKICAgICAgICAgICAgICAuYXR0cigieCIsIHNlbGVjdGlvblswXVswXSkKICAgICAgICAgICAgICAuYXR0cigieSIsIHNlbGVjdGlvblswXVsxXSkKICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0pCiAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSk7CgogICAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgICAgICAgICAuc3R5bGUoImRpc3BsYXkiLCBudWxsKQogICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gImUiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVswXSA9PT0gInMiID8gc2VsZWN0aW9uWzFdWzFdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMV0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJuIiB8fCBkLnR5cGUgPT09ICJzIiA/IHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KQogICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJlIiB8fCBkLnR5cGUgPT09ICJ3IiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKQogICAgICAgICAgICAgIC5zdHlsZSgiZGlzcGxheSIsICJub25lIikKICAgICAgICAgICAgICAuYXR0cigieCIsIG51bGwpCiAgICAgICAgICAgICAgLmF0dHIoInkiLCBudWxsKQogICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIG51bGwpCiAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIG51bGwpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gZW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbikgewogICAgICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX19icnVzaC5lbWl0dGVyKSB8fCBuZXcgRW1pdHRlcih0aGF0LCBhcmdzKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gRW1pdHRlcih0aGF0LCBhcmdzKSB7CiAgICAgICAgdGhpcy50aGF0ID0gdGhhdDsKICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgICAgIHRoaXMuc3RhdGUgPSB0aGF0Ll9fYnJ1c2g7CiAgICAgICAgdGhpcy5hY3RpdmUgPSAwOwogICAgICB9CgogICAgICBFbWl0dGVyLnByb3RvdHlwZSA9IHsKICAgICAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgdGhpcy5zdGF0ZS5lbWl0dGVyID0gdGhpcywgdGhpcy5zdGFydGluZyA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIHN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICh0aGlzLnN0YXJ0aW5nKSB0aGlzLnN0YXJ0aW5nID0gZmFsc2UsIHRoaXMuZW1pdCgic3RhcnQiKTsKICAgICAgICAgIGVsc2UgdGhpcy5lbWl0KCJicnVzaCIpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBicnVzaDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmVtaXQoImJydXNoIik7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlciwgdGhpcy5lbWl0KCJlbmQiKTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCiAgICAgICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgY3VzdG9tRXZlbnQobmV3IEJydXNoRXZlbnQoYnJ1c2gsIHR5cGUsIGRpbS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSwgbGlzdGVuZXJzLmFwcGx5LCBsaXN0ZW5lcnMsIFt0eXBlLCB0aGlzLnRoYXQsIHRoaXMuYXJnc10pOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIHN0YXJ0ZWQoKSB7CiAgICAgICAgaWYgKHRvdWNoZW5kaW5nICYmICFldmVudC50b3VjaGVzKSByZXR1cm47CiAgICAgICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwoKICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgIHR5cGUgPSBldmVudC50YXJnZXQuX19kYXRhX18udHlwZSwKICAgICAgICAgICAgbW9kZSA9IChrZXlzICYmIGV2ZW50Lm1ldGFLZXkgPyB0eXBlID0gIm92ZXJsYXkiIDogdHlwZSkgPT09ICJzZWxlY3Rpb24iID8gTU9ERV9EUkFHIDogKGtleXMgJiYgZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RFX0hBTkRMRSksCiAgICAgICAgICAgIHNpZ25YID0gZGltID09PSBZID8gbnVsbCA6IHNpZ25zWFt0eXBlXSwKICAgICAgICAgICAgc2lnblkgPSBkaW0gPT09IFggPyBudWxsIDogc2lnbnNZW3R5cGVdLAogICAgICAgICAgICBzdGF0ZSA9IGxvY2FsJDEodGhhdCksCiAgICAgICAgICAgIGV4dGVudCA9IHN0YXRlLmV4dGVudCwKICAgICAgICAgICAgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uLAogICAgICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsCiAgICAgICAgICAgIE4gPSBleHRlbnRbMF1bMV0sIG4wLCBuMSwKICAgICAgICAgICAgRSA9IGV4dGVudFsxXVswXSwgZTAsIGUxLAogICAgICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsCiAgICAgICAgICAgIGR4ID0gMCwKICAgICAgICAgICAgZHkgPSAwLAogICAgICAgICAgICBtb3ZpbmcsCiAgICAgICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblkgJiYga2V5cyAmJiBldmVudC5zaGlmdEtleSwKICAgICAgICAgICAgbG9ja1gsCiAgICAgICAgICAgIGxvY2tZLAogICAgICAgICAgICBwb2ludGVyID0gZXZlbnQudG91Y2hlcyA/IHRvdWNoZXIoZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF0uaWRlbnRpZmllcikgOiBtb3VzZSwKICAgICAgICAgICAgcG9pbnQwID0gcG9pbnRlcih0aGF0KSwKICAgICAgICAgICAgcG9pbnQgPSBwb2ludDAsCiAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cywgdHJ1ZSkuYmVmb3Jlc3RhcnQoKTsKCiAgICAgICAgaWYgKHR5cGUgPT09ICJvdmVybGF5IikgewogICAgICAgICAgaWYgKHNlbGVjdGlvbikgbW92aW5nID0gdHJ1ZTsKICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbiA9IFsKICAgICAgICAgICAgW3cwID0gZGltID09PSBZID8gVyA6IHBvaW50MFswXSwgbjAgPSBkaW0gPT09IFggPyBOIDogcG9pbnQwWzFdXSwKICAgICAgICAgICAgW2UwID0gZGltID09PSBZID8gRSA6IHcwLCBzMCA9IGRpbSA9PT0gWCA/IFMgOiBuMF0KICAgICAgICAgIF07CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHcwID0gc2VsZWN0aW9uWzBdWzBdOwogICAgICAgICAgbjAgPSBzZWxlY3Rpb25bMF1bMV07CiAgICAgICAgICBlMCA9IHNlbGVjdGlvblsxXVswXTsKICAgICAgICAgIHMwID0gc2VsZWN0aW9uWzFdWzFdOwogICAgICAgIH0KCiAgICAgICAgdzEgPSB3MDsKICAgICAgICBuMSA9IG4wOwogICAgICAgIGUxID0gZTA7CiAgICAgICAgczEgPSBzMDsKCiAgICAgICAgdmFyIGdyb3VwID0gc2VsZWN0KHRoYXQpCiAgICAgICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJub25lIik7CgogICAgICAgIHZhciBvdmVybGF5ID0gZ3JvdXAuc2VsZWN0QWxsKCIub3ZlcmxheSIpCiAgICAgICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGVdKTsKCiAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMpIHsKICAgICAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDsKICAgICAgICAgIGVtaXQuZW5kZWQgPSBlbmRlZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHZpZXcgPSBzZWxlY3QoZXZlbnQudmlldykKICAgICAgICAgICAgICAub24oIm1vdXNlbW92ZS5icnVzaCIsIG1vdmVkLCB0cnVlKQogICAgICAgICAgICAgIC5vbigibW91c2V1cC5icnVzaCIsIGVuZGVkLCB0cnVlKTsKICAgICAgICAgIGlmIChrZXlzKSB2aWV3CiAgICAgICAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bmVkLCB0cnVlKQogICAgICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBrZXl1cHBlZCwgdHJ1ZSk7CgogICAgICAgICAgZHJhZ0Rpc2FibGUoZXZlbnQudmlldyk7CiAgICAgICAgfQoKICAgICAgICBub3Byb3BhZ2F0aW9uJDEoKTsKICAgICAgICBpbnRlcnJ1cHQodGhhdCk7CiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgZW1pdC5zdGFydCgpOwoKICAgICAgICBmdW5jdGlvbiBtb3ZlZCgpIHsKICAgICAgICAgIHZhciBwb2ludDEgPSBwb2ludGVyKHRoYXQpOwogICAgICAgICAgaWYgKHNoaWZ0aW5nICYmICFsb2NrWCAmJiAhbG9ja1kpIHsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKHBvaW50MVswXSAtIHBvaW50WzBdKSA+IE1hdGguYWJzKHBvaW50MVsxXSAtIHBvaW50WzFdKSkgbG9ja1kgPSB0cnVlOwogICAgICAgICAgICBlbHNlIGxvY2tYID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHBvaW50ID0gcG9pbnQxOwogICAgICAgICAgbW92aW5nID0gdHJ1ZTsKICAgICAgICAgIG5vZXZlbnQkMSgpOwogICAgICAgICAgbW92ZSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW92ZSgpIHsKICAgICAgICAgIHZhciB0OwoKICAgICAgICAgIGR4ID0gcG9pbnRbMF0gLSBwb2ludDBbMF07CiAgICAgICAgICBkeSA9IHBvaW50WzFdIC0gcG9pbnQwWzFdOwoKICAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICBjYXNlIE1PREVfU1BBQ0U6CiAgICAgICAgICAgIGNhc2UgTU9ERV9EUkFHOiB7CiAgICAgICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTAgKyBkeDsKICAgICAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgoTiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHsKICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIHcwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTA7CiAgICAgICAgICAgICAgZWxzZSBpZiAoc2lnblggPiAwKSBkeCA9IE1hdGgubWF4KFcgLSBlMCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwLCBlMSA9IGUwICsgZHg7CiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBNYXRoLm1heChOIC0gbjAsIE1hdGgubWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwOwogICAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25ZID4gMCkgZHkgPSBNYXRoLm1heChOIC0gczAsIE1hdGgubWluKFMgLSBzMCwgZHkpKSwgbjEgPSBuMCwgczEgPSBzMCArIGR5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgTU9ERV9DRU5URVI6IHsKICAgICAgICAgICAgICBpZiAoc2lnblgpIHcxID0gTWF0aC5tYXgoVywgTWF0aC5taW4oRSwgdzAgLSBkeCAqIHNpZ25YKSksIGUxID0gTWF0aC5tYXgoVywgTWF0aC5taW4oRSwgZTAgKyBkeCAqIHNpZ25YKSk7CiAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIHMwICsgZHkgKiBzaWduWSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGUxIDwgdzEpIHsKICAgICAgICAgICAgc2lnblggKj0gLTE7CiAgICAgICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0OwogICAgICAgICAgICB0ID0gdzEsIHcxID0gZTEsIGUxID0gdDsKICAgICAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFgpIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29yc1t0eXBlID0gZmxpcFhbdHlwZV1dKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoczEgPCBuMSkgewogICAgICAgICAgICBzaWduWSAqPSAtMTsKICAgICAgICAgICAgdCA9IG4wLCBuMCA9IHMwLCBzMCA9IHQ7CiAgICAgICAgICAgIHQgPSBuMSwgbjEgPSBzMSwgczEgPSB0OwogICAgICAgICAgICBpZiAodHlwZSBpbiBmbGlwWSkgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWVt0eXBlXV0pOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIQogICAgICAgICAgaWYgKGxvY2tYKSB3MSA9IHNlbGVjdGlvblswXVswXSwgZTEgPSBzZWxlY3Rpb25bMV1bMF07CiAgICAgICAgICBpZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTsKCiAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdWzBdICE9PSB3MQogICAgICAgICAgICAgIHx8IHNlbGVjdGlvblswXVsxXSAhPT0gbjEKICAgICAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMF0gIT09IGUxCiAgICAgICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzFdICE9PSBzMSkgewogICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBbW3cxLCBuMV0sIFtlMSwgczFdXTsKICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICAgIGVtaXQuYnJ1c2goKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGVuZGVkKCkgewogICAgICAgICAgbm9wcm9wYWdhdGlvbiQxKCk7CiAgICAgICAgICBpZiAoZXZlbnQudG91Y2hlcykgewogICAgICAgICAgICBpZiAoZXZlbnQudG91Y2hlcy5sZW5ndGgpIHJldHVybjsKICAgICAgICAgICAgaWYgKHRvdWNoZW5kaW5nKSBjbGVhclRpbWVvdXQodG91Y2hlbmRpbmcpOwogICAgICAgICAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgeWVzZHJhZyhldmVudC52aWV3LCBtb3ZpbmcpOwogICAgICAgICAgICB2aWV3Lm9uKCJrZXlkb3duLmJydXNoIGtleXVwLmJydXNoIG1vdXNlbW92ZS5icnVzaCBtb3VzZXVwLmJydXNoIiwgbnVsbCk7CiAgICAgICAgICB9CiAgICAgICAgICBncm91cC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKTsKICAgICAgICAgIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5vdmVybGF5KTsKICAgICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIChvbiBzdGFydCkhCiAgICAgICAgICBpZiAoZW1wdHkkMShzZWxlY3Rpb24pKSBzdGF0ZS5zZWxlY3Rpb24gPSBudWxsLCByZWRyYXcuY2FsbCh0aGF0KTsKICAgICAgICAgIGVtaXQuZW5kKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBrZXlkb3duZWQoKSB7CiAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHsKICAgICAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVAogICAgICAgICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAxODogeyAvLyBBTFQKICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUpIHsKICAgICAgICAgICAgICAgIGlmIChzaWduWCkgZTAgPSBlMSAtIGR4ICogc2lnblgsIHcwID0gdzEgKyBkeCAqIHNpZ25YOwogICAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7CiAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7CiAgICAgICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0U7IHRha2VzIHByaW9yaXR5IG92ZXIgQUxUCiAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfSEFORExFIHx8IG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxIC0gZHg7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MSAtIGR4OwogICAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMSAtIGR5OyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjEgLSBkeTsKICAgICAgICAgICAgICAgIG1vZGUgPSBNT0RFX1NQQUNFOwogICAgICAgICAgICAgICAgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzLnNlbGVjdGlvbik7CiAgICAgICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIG5vZXZlbnQkMSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24ga2V5dXBwZWQoKSB7CiAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHsKICAgICAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVAogICAgICAgICAgICAgIGlmIChzaGlmdGluZykgewogICAgICAgICAgICAgICAgbG9ja1ggPSBsb2NrWSA9IHNoaWZ0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUCiAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfQ0VOVEVSKSB7CiAgICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxOyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7CiAgICAgICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxOyBlbHNlIGlmIChzaWduWSA+IDApIG4wID0gbjE7CiAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7CiAgICAgICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0UKICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9TUEFDRSkgewogICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFsdEtleSkgewogICAgICAgICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDsKICAgICAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBzMCA9IHMxIC0gZHkgKiBzaWduWSwgbjAgPSBuMSArIGR5ICogc2lnblk7CiAgICAgICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUjsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTsKICAgICAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBvdmVybGF5LmF0dHIoImN1cnNvciIsIGN1cnNvcnNbdHlwZV0pOwogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBub2V2ZW50JDEoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRvdWNobW92ZWQoKSB7CiAgICAgICAgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLm1vdmVkKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRvdWNoZW5kZWQoKSB7CiAgICAgICAgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZGVkKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgdmFyIHN0YXRlID0gdGhpcy5fX2JydXNoIHx8IHtzZWxlY3Rpb246IG51bGx9OwogICAgICAgIHN0YXRlLmV4dGVudCA9IG51bWJlcjIoZXh0ZW50LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICAgIHN0YXRlLmRpbSA9IGRpbTsKICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgIH0KCiAgICAgIGJydXNoLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ0KG51bWJlcjIoXykpLCBicnVzaCkgOiBleHRlbnQ7CiAgICAgIH07CgogICAgICBicnVzaC5maWx0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNCghIV8pLCBicnVzaCkgOiBmaWx0ZXI7CiAgICAgIH07CgogICAgICBicnVzaC50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNCghIV8pLCBicnVzaCkgOiB0b3VjaGFibGU7CiAgICAgIH07CgogICAgICBicnVzaC5oYW5kbGVTaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGhhbmRsZVNpemUgPSArXywgYnJ1c2gpIDogaGFuZGxlU2l6ZTsKICAgICAgfTsKCiAgICAgIGJydXNoLmtleU1vZGlmaWVycyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrZXlzID0gISFfLCBicnVzaCkgOiBrZXlzOwogICAgICB9OwoKICAgICAgYnJ1c2gub24gPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIHJldHVybiBicnVzaDsKICAgIH0KCiAgICB2YXIgY29zID0gTWF0aC5jb3M7CiAgICB2YXIgc2luID0gTWF0aC5zaW47CiAgICB2YXIgcGkkMSA9IE1hdGguUEk7CiAgICB2YXIgaGFsZlBpJDEgPSBwaSQxIC8gMjsKICAgIHZhciB0YXUkMSA9IHBpJDEgKiAyOwogICAgdmFyIG1heCQxID0gTWF0aC5tYXg7CgogICAgZnVuY3Rpb24gY29tcGFyZVZhbHVlKGNvbXBhcmUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gY29tcGFyZSgKICAgICAgICAgIGEuc291cmNlLnZhbHVlICsgYS50YXJnZXQudmFsdWUsCiAgICAgICAgICBiLnNvdXJjZS52YWx1ZSArIGIudGFyZ2V0LnZhbHVlCiAgICAgICAgKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjaG9yZCgpIHsKICAgICAgdmFyIHBhZEFuZ2xlID0gMCwKICAgICAgICAgIHNvcnRHcm91cHMgPSBudWxsLAogICAgICAgICAgc29ydFN1Ymdyb3VwcyA9IG51bGwsCiAgICAgICAgICBzb3J0Q2hvcmRzID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIGNob3JkKG1hdHJpeCkgewogICAgICAgIHZhciBuID0gbWF0cml4Lmxlbmd0aCwKICAgICAgICAgICAgZ3JvdXBTdW1zID0gW10sCiAgICAgICAgICAgIGdyb3VwSW5kZXggPSBzZXF1ZW5jZShuKSwKICAgICAgICAgICAgc3ViZ3JvdXBJbmRleCA9IFtdLAogICAgICAgICAgICBjaG9yZHMgPSBbXSwKICAgICAgICAgICAgZ3JvdXBzID0gY2hvcmRzLmdyb3VwcyA9IG5ldyBBcnJheShuKSwKICAgICAgICAgICAgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG4gKiBuKSwKICAgICAgICAgICAgaywKICAgICAgICAgICAgeCwKICAgICAgICAgICAgeDAsCiAgICAgICAgICAgIGR4LAogICAgICAgICAgICBpLAogICAgICAgICAgICBqOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBzdW0uCiAgICAgICAgayA9IDAsIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIHggPSAwLCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgICAgIHggKz0gbWF0cml4W2ldW2pdOwogICAgICAgICAgfQogICAgICAgICAgZ3JvdXBTdW1zLnB1c2goeCk7CiAgICAgICAgICBzdWJncm91cEluZGV4LnB1c2goc2VxdWVuY2UobikpOwogICAgICAgICAgayArPSB4OwogICAgICAgIH0KCiAgICAgICAgLy8gU29ydCBncm91cHPigKYKICAgICAgICBpZiAoc29ydEdyb3VwcykgZ3JvdXBJbmRleC5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgIHJldHVybiBzb3J0R3JvdXBzKGdyb3VwU3Vtc1thXSwgZ3JvdXBTdW1zW2JdKTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gU29ydCBzdWJncm91cHPigKYKICAgICAgICBpZiAoc29ydFN1Ymdyb3Vwcykgc3ViZ3JvdXBJbmRleC5mb3JFYWNoKGZ1bmN0aW9uKGQsIGkpIHsKICAgICAgICAgIGQuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBzb3J0U3ViZ3JvdXBzKG1hdHJpeFtpXVthXSwgbWF0cml4W2ldW2JdKTsKICAgICAgICAgIH0pOwogICAgICAgIH0pOwoKICAgICAgICAvLyBDb252ZXJ0IHRoZSBzdW0gdG8gc2NhbGluZyBmYWN0b3IgZm9yIFswLCAycGldLgogICAgICAgIC8vIFRPRE8gQWxsb3cgc3RhcnQgYW5kIGVuZCBhbmdsZSB0byBiZSBzcGVjaWZpZWQ/CiAgICAgICAgLy8gVE9ETyBBbGxvdyBwYWRkaW5nIHRvIGJlIHNwZWNpZmllZCBhcyBwZXJjZW50YWdlPwogICAgICAgIGsgPSBtYXgkMSgwLCB0YXUkMSAtIHBhZEFuZ2xlICogbikgLyBrOwogICAgICAgIGR4ID0gayA/IHBhZEFuZ2xlIDogdGF1JDEgLyBuOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBzdGFydCBhbmQgZW5kIGFuZ2xlIGZvciBlYWNoIGdyb3VwIGFuZCBzdWJncm91cC4KICAgICAgICAvLyBOb3RlOiBPcGVyYSBoYXMgYSBidWcgcmVvcmRlcmluZyBvYmplY3QgbGl0ZXJhbCBwcm9wZXJ0aWVzIQogICAgICAgIHggPSAwLCBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICB4MCA9IHgsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICAgICAgdmFyIGRpID0gZ3JvdXBJbmRleFtpXSwKICAgICAgICAgICAgICAgIGRqID0gc3ViZ3JvdXBJbmRleFtkaV1bal0sCiAgICAgICAgICAgICAgICB2ID0gbWF0cml4W2RpXVtkal0sCiAgICAgICAgICAgICAgICBhMCA9IHgsCiAgICAgICAgICAgICAgICBhMSA9IHggKz0gdiAqIGs7CiAgICAgICAgICAgIHN1Ymdyb3Vwc1tkaiAqIG4gKyBkaV0gPSB7CiAgICAgICAgICAgICAgaW5kZXg6IGRpLAogICAgICAgICAgICAgIHN1YmluZGV4OiBkaiwKICAgICAgICAgICAgICBzdGFydEFuZ2xlOiBhMCwKICAgICAgICAgICAgICBlbmRBbmdsZTogYTEsCiAgICAgICAgICAgICAgdmFsdWU6IHYKICAgICAgICAgICAgfTsKICAgICAgICAgIH0KICAgICAgICAgIGdyb3Vwc1tkaV0gPSB7CiAgICAgICAgICAgIGluZGV4OiBkaSwKICAgICAgICAgICAgc3RhcnRBbmdsZTogeDAsCiAgICAgICAgICAgIGVuZEFuZ2xlOiB4LAogICAgICAgICAgICB2YWx1ZTogZ3JvdXBTdW1zW2RpXQogICAgICAgICAgfTsKICAgICAgICAgIHggKz0gZHg7CiAgICAgICAgfQoKICAgICAgICAvLyBHZW5lcmF0ZSBjaG9yZHMgZm9yIGVhY2ggKG5vbi1lbXB0eSkgc3ViZ3JvdXAtc3ViZ3JvdXAgbGluay4KICAgICAgICBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBqID0gaSAtIDE7IHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgICAgIHZhciBzb3VyY2UgPSBzdWJncm91cHNbaiAqIG4gKyBpXSwKICAgICAgICAgICAgICAgIHRhcmdldCA9IHN1Ymdyb3Vwc1tpICogbiArIGpdOwogICAgICAgICAgICBpZiAoc291cmNlLnZhbHVlIHx8IHRhcmdldC52YWx1ZSkgewogICAgICAgICAgICAgIGNob3Jkcy5wdXNoKHNvdXJjZS52YWx1ZSA8IHRhcmdldC52YWx1ZQogICAgICAgICAgICAgICAgICA/IHtzb3VyY2U6IHRhcmdldCwgdGFyZ2V0OiBzb3VyY2V9CiAgICAgICAgICAgICAgICAgIDoge3NvdXJjZTogc291cmNlLCB0YXJnZXQ6IHRhcmdldH0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc29ydENob3JkcyA/IGNob3Jkcy5zb3J0KHNvcnRDaG9yZHMpIDogY2hvcmRzOwogICAgICB9CgogICAgICBjaG9yZC5wYWRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IG1heCQxKDAsIF8pLCBjaG9yZCkgOiBwYWRBbmdsZTsKICAgICAgfTsKCiAgICAgIGNob3JkLnNvcnRHcm91cHMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydEdyb3VwcyA9IF8sIGNob3JkKSA6IHNvcnRHcm91cHM7CiAgICAgIH07CgogICAgICBjaG9yZC5zb3J0U3ViZ3JvdXBzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnRTdWJncm91cHMgPSBfLCBjaG9yZCkgOiBzb3J0U3ViZ3JvdXBzOwogICAgICB9OwoKICAgICAgY2hvcmQuc29ydENob3JkcyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBzb3J0Q2hvcmRzID0gbnVsbCA6IChzb3J0Q2hvcmRzID0gY29tcGFyZVZhbHVlKF8pKS5fID0gXywgY2hvcmQpIDogc29ydENob3JkcyAmJiBzb3J0Q2hvcmRzLl87CiAgICAgIH07CgogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9CgogICAgdmFyIHNsaWNlJDIgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgogICAgZnVuY3Rpb24gY29uc3RhbnQkNSh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgcGkkMiA9IE1hdGguUEksCiAgICAgICAgdGF1JDIgPSAyICogcGkkMiwKICAgICAgICBlcHNpbG9uJDEgPSAxZS02LAogICAgICAgIHRhdUVwc2lsb24gPSB0YXUkMiAtIGVwc2lsb24kMTsKCiAgICBmdW5jdGlvbiBQYXRoKCkgewogICAgICB0aGlzLl94MCA9IHRoaXMuX3kwID0gLy8gc3RhcnQgb2YgY3VycmVudCBzdWJwYXRoCiAgICAgIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVudCBzdWJwYXRoCiAgICAgIHRoaXMuXyA9ICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhdGgoKSB7CiAgICAgIHJldHVybiBuZXcgUGF0aDsKICAgIH0KCiAgICBQYXRoLnByb3RvdHlwZSA9IHBhdGgucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogUGF0aCwKICAgICAgbW92ZVRvOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJNIiArICh0aGlzLl94MCA9IHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kwID0gdGhpcy5feTEgPSAreSk7CiAgICAgIH0sCiAgICAgIGNsb3NlUGF0aDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX3gxICE9PSBudWxsKSB7CiAgICAgICAgICB0aGlzLl94MSA9IHRoaXMuX3gwLCB0aGlzLl95MSA9IHRoaXMuX3kwOwogICAgICAgICAgdGhpcy5fICs9ICJaIjsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGxpbmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHRoaXMuXyArPSAiTCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7CiAgICAgIH0sCiAgICAgIHF1YWRyYXRpY0N1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeCwgeSkgewogICAgICAgIHRoaXMuXyArPSAiUSIgKyAoK3gxKSArICIsIiArICgreTEpICsgIiwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogICAgICB9LAogICAgICBiZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgeCwgeSkgewogICAgICAgIHRoaXMuXyArPSAiQyIgKyAoK3gxKSArICIsIiArICgreTEpICsgIiwiICsgKCt4MikgKyAiLCIgKyAoK3kyKSArICIsIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgYXJjVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCByKSB7CiAgICAgICAgeDEgPSAreDEsIHkxID0gK3kxLCB4MiA9ICt4MiwgeTIgPSAreTIsIHIgPSArcjsKICAgICAgICB2YXIgeDAgPSB0aGlzLl94MSwKICAgICAgICAgICAgeTAgPSB0aGlzLl95MSwKICAgICAgICAgICAgeDIxID0geDIgLSB4MSwKICAgICAgICAgICAgeTIxID0geTIgLSB5MSwKICAgICAgICAgICAgeDAxID0geDAgLSB4MSwKICAgICAgICAgICAgeTAxID0geTAgLSB5MSwKICAgICAgICAgICAgbDAxXzIgPSB4MDEgKiB4MDEgKyB5MDEgKiB5MDE7CgogICAgICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLgogICAgICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIgKyByKTsKCiAgICAgICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MSx5MSkuCiAgICAgICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgICAgIH0KCiAgICAgICAgLy8gT3IsIGlzICh4MSx5MSkgY29pbmNpZGVudCB3aXRoICh4MCx5MCk/IERvIG5vdGhpbmcuCiAgICAgICAgZWxzZSBpZiAoIShsMDFfMiA+IGVwc2lsb24kMSkpOwoKICAgICAgICAvLyBPciwgYXJlICh4MCx5MCksICh4MSx5MSkgYW5kICh4Mix5MikgY29sbGluZWFyPwogICAgICAgIC8vIEVxdWl2YWxlbnRseSwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgyLHkyKT8KICAgICAgICAvLyBPciwgaXMgdGhlIHJhZGl1cyB6ZXJvPyBMaW5lIHRvICh4MSx5MSkuCiAgICAgICAgZWxzZSBpZiAoIShNYXRoLmFicyh5MDEgKiB4MjEgLSB5MjEgKiB4MDEpID4gZXBzaWxvbiQxKSB8fCAhcikgewogICAgICAgICAgdGhpcy5fICs9ICJMIiArICh0aGlzLl94MSA9IHgxKSArICIsIiArICh0aGlzLl95MSA9IHkxKTsKICAgICAgICB9CgogICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyBhbiBhcmMhCiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgeDIwID0geDIgLSB4MCwKICAgICAgICAgICAgICB5MjAgPSB5MiAtIHkwLAogICAgICAgICAgICAgIGwyMV8yID0geDIxICogeDIxICsgeTIxICogeTIxLAogICAgICAgICAgICAgIGwyMF8yID0geDIwICogeDIwICsgeTIwICogeTIwLAogICAgICAgICAgICAgIGwyMSA9IE1hdGguc3FydChsMjFfMiksCiAgICAgICAgICAgICAgbDAxID0gTWF0aC5zcXJ0KGwwMV8yKSwKICAgICAgICAgICAgICBsID0gciAqIE1hdGgudGFuKChwaSQyIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8gKDIgKiBsMjEgKiBsMDEpKSkgLyAyKSwKICAgICAgICAgICAgICB0MDEgPSBsIC8gbDAxLAogICAgICAgICAgICAgIHQyMSA9IGwgLyBsMjE7CgogICAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLgogICAgICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbiQxKSB7CiAgICAgICAgICAgIHRoaXMuXyArPSAiTCIgKyAoeDEgKyB0MDEgKiB4MDEpICsgIiwiICsgKHkxICsgdDAxICogeTAxKTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLl8gKz0gIkEiICsgciArICIsIiArIHIgKyAiLDAsMCwiICsgKCsoeTAxICogeDIwID4geDAxICogeTIwKSkgKyAiLCIgKyAodGhpcy5feDEgPSB4MSArIHQyMSAqIHgyMSkgKyAiLCIgKyAodGhpcy5feTEgPSB5MSArIHQyMSAqIHkyMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBhcmM6IGZ1bmN0aW9uKHgsIHksIHIsIGEwLCBhMSwgY2N3KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3ksIHIgPSArciwgY2N3ID0gISFjY3c7CiAgICAgICAgdmFyIGR4ID0gciAqIE1hdGguY29zKGEwKSwKICAgICAgICAgICAgZHkgPSByICogTWF0aC5zaW4oYTApLAogICAgICAgICAgICB4MCA9IHggKyBkeCwKICAgICAgICAgICAgeTAgPSB5ICsgZHksCiAgICAgICAgICAgIGN3ID0gMSBeIGNjdywKICAgICAgICAgICAgZGEgPSBjY3cgPyBhMCAtIGExIDogYTEgLSBhMDsKCiAgICAgICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICAgICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOwoKICAgICAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS4KICAgICAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuXyArPSAiTSIgKyB4MCArICIsIiArIHkwOwogICAgICAgIH0KCiAgICAgICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5jaWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS4KICAgICAgICBlbHNlIGlmIChNYXRoLmFicyh0aGlzLl94MSAtIHgwKSA+IGVwc2lsb24kMSB8fCBNYXRoLmFicyh0aGlzLl95MSAtIHkwKSA+IGVwc2lsb24kMSkgewogICAgICAgICAgdGhpcy5fICs9ICJMIiArIHgwICsgIiwiICsgeTA7CiAgICAgICAgfQoKICAgICAgICAvLyBJcyB0aGlzIGFyYyBlbXB0eT8gV2XigJlyZSBkb25lLgogICAgICAgIGlmICghcikgcmV0dXJuOwoKICAgICAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBGbGlwIHRoZSBkaXJlY3Rpb24uCiAgICAgICAgaWYgKGRhIDwgMCkgZGEgPSBkYSAlIHRhdSQyICsgdGF1JDI7CgogICAgICAgIC8vIElzIHRoaXMgYSBjb21wbGV0ZSBjaXJjbGU/IERyYXcgdHdvIGFyY3MgdG8gY29tcGxldGUgdGhlIGNpcmNsZS4KICAgICAgICBpZiAoZGEgPiB0YXVFcHNpbG9uKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkEiICsgciArICIsIiArIHIgKyAiLDAsMSwiICsgY3cgKyAiLCIgKyAoeCAtIGR4KSArICIsIiArICh5IC0gZHkpICsgIkEiICsgciArICIsIiArIHIgKyAiLDAsMSwiICsgY3cgKyAiLCIgKyAodGhpcy5feDEgPSB4MCkgKyAiLCIgKyAodGhpcy5feTEgPSB5MCk7CiAgICAgICAgfQoKICAgICAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIQogICAgICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbiQxKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkEiICsgciArICIsIiArIHIgKyAiLDAsIiArICgrKGRhID49IHBpJDIpKSArICIsIiArIGN3ICsgIiwiICsgKHRoaXMuX3gxID0geCArIHIgKiBNYXRoLmNvcyhhMSkpICsgIiwiICsgKHRoaXMuX3kxID0geSArIHIgKiBNYXRoLnNpbihhMSkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVjdDogZnVuY3Rpb24oeCwgeSwgdywgaCkgewogICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpICsgImgiICsgKCt3KSArICJ2IiArICgraCkgKyAiaCIgKyAoLXcpICsgIloiOwogICAgICB9LAogICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXzsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBkZWZhdWx0U291cmNlKGQpIHsKICAgICAgcmV0dXJuIGQuc291cmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRUYXJnZXQoZCkgewogICAgICByZXR1cm4gZC50YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFJhZGl1cyhkKSB7CiAgICAgIHJldHVybiBkLnJhZGl1czsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0U3RhcnRBbmdsZShkKSB7CiAgICAgIHJldHVybiBkLnN0YXJ0QW5nbGU7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdEVuZEFuZ2xlKGQpIHsKICAgICAgcmV0dXJuIGQuZW5kQW5nbGU7CiAgICB9CgogICAgZnVuY3Rpb24gcmliYm9uKCkgewogICAgICB2YXIgc291cmNlID0gZGVmYXVsdFNvdXJjZSwKICAgICAgICAgIHRhcmdldCA9IGRlZmF1bHRUYXJnZXQsCiAgICAgICAgICByYWRpdXMgPSBkZWZhdWx0UmFkaXVzLAogICAgICAgICAgc3RhcnRBbmdsZSA9IGRlZmF1bHRTdGFydEFuZ2xlLAogICAgICAgICAgZW5kQW5nbGUgPSBkZWZhdWx0RW5kQW5nbGUsCiAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIHJpYmJvbigpIHsKICAgICAgICB2YXIgYnVmZmVyLAogICAgICAgICAgICBhcmd2ID0gc2xpY2UkMi5jYWxsKGFyZ3VtZW50cyksCiAgICAgICAgICAgIHMgPSBzb3VyY2UuYXBwbHkodGhpcywgYXJndiksCiAgICAgICAgICAgIHQgPSB0YXJnZXQuYXBwbHkodGhpcywgYXJndiksCiAgICAgICAgICAgIHNyID0gK3JhZGl1cy5hcHBseSh0aGlzLCAoYXJndlswXSA9IHMsIGFyZ3YpKSwKICAgICAgICAgICAgc2EwID0gc3RhcnRBbmdsZS5hcHBseSh0aGlzLCBhcmd2KSAtIGhhbGZQaSQxLAogICAgICAgICAgICBzYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd2KSAtIGhhbGZQaSQxLAogICAgICAgICAgICBzeDAgPSBzciAqIGNvcyhzYTApLAogICAgICAgICAgICBzeTAgPSBzciAqIHNpbihzYTApLAogICAgICAgICAgICB0ciA9ICtyYWRpdXMuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksCiAgICAgICAgICAgIHRhMCA9IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMSwKICAgICAgICAgICAgdGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkMTsKCiAgICAgICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpOwoKICAgICAgICBjb250ZXh0Lm1vdmVUbyhzeDAsIHN5MCk7CiAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgc3IsIHNhMCwgc2ExKTsKICAgICAgICBpZiAoc2EwICE9PSB0YTAgfHwgc2ExICE9PSB0YTEpIHsgLy8gVE9ETyBzciAhPT0gdHI/CiAgICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oMCwgMCwgdHIgKiBjb3ModGEwKSwgdHIgKiBzaW4odGEwKSk7CiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCB0ciwgdGEwLCB0YTEpOwogICAgICAgIH0KICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oMCwgMCwgc3gwLCBzeTApOwogICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CgogICAgICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICAgICAgfQoKICAgICAgcmliYm9uLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ1KCtfKSwgcmliYm9uKSA6IHJhZGl1czsKICAgICAgfTsKCiAgICAgIHJpYmJvbi5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ1KCtfKSwgcmliYm9uKSA6IHN0YXJ0QW5nbGU7CiAgICAgIH07CgogICAgICByaWJib24uZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW5kQW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ1KCtfKSwgcmliYm9uKSA6IGVuZEFuZ2xlOwogICAgICB9OwoKICAgICAgcmliYm9uLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3VyY2UgPSBfLCByaWJib24pIDogc291cmNlOwogICAgICB9OwoKICAgICAgcmliYm9uLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCByaWJib24pIDogdGFyZ2V0OwogICAgICB9OwoKICAgICAgcmliYm9uLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIHJpYmJvbikgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIHJpYmJvbjsKICAgIH0KCiAgICB2YXIgcHJlZml4ID0gIiQiOwoKICAgIGZ1bmN0aW9uIE1hcCQxKCkge30KCiAgICBNYXAkMS5wcm90b3R5cGUgPSBtYXAkMS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBNYXAkMSwKICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpczsKICAgICAgfSwKICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKICAgICAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7CiAgICAgICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbcHJvcGVydHldOwogICAgICB9LAogICAgICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICAgICAgfSwKICAgICAga2V5czogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTsKICAgICAgICByZXR1cm4ga2V5czsKICAgICAgfSwKICAgICAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHZhbHVlcy5wdXNoKHRoaXNbcHJvcGVydHldKTsKICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICB9LAogICAgICBlbnRyaWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZW50cmllcyA9IFtdOwogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pOwogICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICB9LAogICAgICBzaXplOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTsKICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgfSwKICAgICAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCiAgICAgIGVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG1hcCQxKG9iamVjdCwgZikgewogICAgICB2YXIgbWFwID0gbmV3IE1hcCQxOwoKICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCQxKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOwoKICAgICAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLgogICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICAgICAgbzsKCiAgICAgICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoaSwgb2JqZWN0W2ldKTsKICAgICAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7CiAgICAgIH0KCiAgICAgIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4KICAgICAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXN0KCkgewogICAgICB2YXIga2V5cyA9IFtdLAogICAgICAgICAgc29ydEtleXMgPSBbXSwKICAgICAgICAgIHNvcnRWYWx1ZXMsCiAgICAgICAgICByb2xsdXAsCiAgICAgICAgICBuZXN0OwoKICAgICAgZnVuY3Rpb24gYXBwbHkoYXJyYXksIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkgewogICAgICAgIGlmIChkZXB0aCA+PSBrZXlzLmxlbmd0aCkgewogICAgICAgICAgaWYgKHNvcnRWYWx1ZXMgIT0gbnVsbCkgYXJyYXkuc29ydChzb3J0VmFsdWVzKTsKICAgICAgICAgIHJldHVybiByb2xsdXAgIT0gbnVsbCA/IHJvbGx1cChhcnJheSkgOiBhcnJheTsKICAgICAgICB9CgogICAgICAgIHZhciBpID0gLTEsCiAgICAgICAgICAgIG4gPSBhcnJheS5sZW5ndGgsCiAgICAgICAgICAgIGtleSA9IGtleXNbZGVwdGgrK10sCiAgICAgICAgICAgIGtleVZhbHVlLAogICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgdmFsdWVzQnlLZXkgPSBtYXAkMSgpLAogICAgICAgICAgICB2YWx1ZXMsCiAgICAgICAgICAgIHJlc3VsdCA9IGNyZWF0ZVJlc3VsdCgpOwoKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKHZhbHVlcyA9IHZhbHVlc0J5S2V5LmdldChrZXlWYWx1ZSA9IGtleSh2YWx1ZSA9IGFycmF5W2ldKSArICIiKSkgewogICAgICAgICAgICB2YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZXNCeUtleS5zZXQoa2V5VmFsdWUsIFt2YWx1ZV0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdmFsdWVzQnlLZXkuZWFjaChmdW5jdGlvbih2YWx1ZXMsIGtleSkgewogICAgICAgICAgc2V0UmVzdWx0KHJlc3VsdCwga2V5LCBhcHBseSh2YWx1ZXMsIGRlcHRoLCBjcmVhdGVSZXN1bHQsIHNldFJlc3VsdCkpOwogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICBmdW5jdGlvbiBlbnRyaWVzKG1hcCwgZGVwdGgpIHsKICAgICAgICBpZiAoKytkZXB0aCA+IGtleXMubGVuZ3RoKSByZXR1cm4gbWFwOwogICAgICAgIHZhciBhcnJheSwgc29ydEtleSA9IHNvcnRLZXlzW2RlcHRoIC0gMV07CiAgICAgICAgaWYgKHJvbGx1cCAhPSBudWxsICYmIGRlcHRoID49IGtleXMubGVuZ3RoKSBhcnJheSA9IG1hcC5lbnRyaWVzKCk7CiAgICAgICAgZWxzZSBhcnJheSA9IFtdLCBtYXAuZWFjaChmdW5jdGlvbih2LCBrKSB7IGFycmF5LnB1c2goe2tleTogaywgdmFsdWVzOiBlbnRyaWVzKHYsIGRlcHRoKX0pOyB9KTsKICAgICAgICByZXR1cm4gc29ydEtleSAhPSBudWxsID8gYXJyYXkuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzb3J0S2V5KGEua2V5LCBiLmtleSk7IH0pIDogYXJyYXk7CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXN0ID0gewogICAgICAgIG9iamVjdDogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGFwcGx5KGFycmF5LCAwLCBjcmVhdGVPYmplY3QsIHNldE9iamVjdCQxKTsgfSwKICAgICAgICBtYXA6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBhcHBseShhcnJheSwgMCwgY3JlYXRlTWFwLCBzZXRNYXApOyB9LAogICAgICAgIGVudHJpZXM6IGZ1bmN0aW9uKGFycmF5KSB7IHJldHVybiBlbnRyaWVzKGFwcGx5KGFycmF5LCAwLCBjcmVhdGVNYXAsIHNldE1hcCksIDApOyB9LAogICAgICAgIGtleTogZnVuY3Rpb24oZCkgeyBrZXlzLnB1c2goZCk7IHJldHVybiBuZXN0OyB9LAogICAgICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LAogICAgICAgIHNvcnRWYWx1ZXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRWYWx1ZXMgPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sCiAgICAgICAgcm9sbHVwOiBmdW5jdGlvbihmKSB7IHJvbGx1cCA9IGY7IHJldHVybiBuZXN0OyB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0KCkgewogICAgICByZXR1cm4ge307CiAgICB9CgogICAgZnVuY3Rpb24gc2V0T2JqZWN0JDEob2JqZWN0LCBrZXksIHZhbHVlKSB7CiAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlTWFwKCkgewogICAgICByZXR1cm4gbWFwJDEoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRNYXAobWFwLCBrZXksIHZhbHVlKSB7CiAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0JDEoKSB7fQoKICAgIHZhciBwcm90byQxID0gbWFwJDEucHJvdG90eXBlOwoKICAgIFNldCQxLnByb3RvdHlwZSA9IHNldCQzLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFNldCQxLAogICAgICBoYXM6IHByb3RvJDEuaGFzLAogICAgICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFsdWUgKz0gIiI7CiAgICAgICAgdGhpc1twcmVmaXggKyB2YWx1ZV0gPSB2YWx1ZTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgcmVtb3ZlOiBwcm90byQxLnJlbW92ZSwKICAgICAgY2xlYXI6IHByb3RvJDEuY2xlYXIsCiAgICAgIHZhbHVlczogcHJvdG8kMS5rZXlzLAogICAgICBzaXplOiBwcm90byQxLnNpemUsCiAgICAgIGVtcHR5OiBwcm90byQxLmVtcHR5LAogICAgICBlYWNoOiBwcm90byQxLmVhY2gKICAgIH07CgogICAgZnVuY3Rpb24gc2V0JDMob2JqZWN0LCBmKSB7CiAgICAgIHZhciBzZXQgPSBuZXcgU2V0JDE7CgogICAgICAvLyBDb3B5IGNvbnN0cnVjdG9yLgogICAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU2V0JDEpIG9iamVjdC5lYWNoKGZ1bmN0aW9uKHZhbHVlKSB7IHNldC5hZGQodmFsdWUpOyB9KTsKCiAgICAgIC8vIE90aGVyd2lzZSwgYXNzdW1lIGl04oCZcyBhbiBhcnJheS4KICAgICAgZWxzZSBpZiAob2JqZWN0KSB7CiAgICAgICAgdmFyIGkgPSAtMSwgbiA9IG9iamVjdC5sZW5ndGg7CiAgICAgICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIHNldC5hZGQob2JqZWN0W2ldKTsKICAgICAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKGYob2JqZWN0W2ldLCBpLCBvYmplY3QpKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHNldDsKICAgIH0KCiAgICBmdW5jdGlvbiBrZXlzKG1hcCkgewogICAgICB2YXIga2V5cyA9IFtdOwogICAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBrZXlzLnB1c2goa2V5KTsKICAgICAgcmV0dXJuIGtleXM7CiAgICB9CgogICAgZnVuY3Rpb24gdmFsdWVzKG1hcCkgewogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTsKICAgICAgcmV0dXJuIHZhbHVlczsKICAgIH0KCiAgICBmdW5jdGlvbiBlbnRyaWVzKG1hcCkgewogICAgICB2YXIgZW50cmllcyA9IFtdOwogICAgICBmb3IgKHZhciBrZXkgaW4gbWFwKSBlbnRyaWVzLnB1c2goe2tleToga2V5LCB2YWx1ZTogbWFwW2tleV19KTsKICAgICAgcmV0dXJuIGVudHJpZXM7CiAgICB9CgogICAgdmFyIGFycmF5JDIgPSBBcnJheS5wcm90b3R5cGU7CgogICAgdmFyIHNsaWNlJDMgPSBhcnJheSQyLnNsaWNlOwoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZyQyKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgLSBiOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWEocmluZykgewogICAgICB2YXIgaSA9IDAsIG4gPSByaW5nLmxlbmd0aCwgYXJlYSA9IHJpbmdbbiAtIDFdWzFdICogcmluZ1swXVswXSAtIHJpbmdbbiAtIDFdWzBdICogcmluZ1swXVsxXTsKICAgICAgd2hpbGUgKCsraSA8IG4pIGFyZWEgKz0gcmluZ1tpIC0gMV1bMV0gKiByaW5nW2ldWzBdIC0gcmluZ1tpIC0gMV1bMF0gKiByaW5nW2ldWzFdOwogICAgICByZXR1cm4gYXJlYTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudCQ2KHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRhaW5zKHJpbmcsIGhvbGUpIHsKICAgICAgdmFyIGkgPSAtMSwgbiA9IGhvbGUubGVuZ3RoLCBjOwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGMgPSByaW5nQ29udGFpbnMocmluZywgaG9sZVtpXSkpIHJldHVybiBjOwogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiByaW5nQ29udGFpbnMocmluZywgcG9pbnQpIHsKICAgICAgdmFyIHggPSBwb2ludFswXSwgeSA9IHBvaW50WzFdLCBjb250YWlucyA9IC0xOwogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHJpbmcubGVuZ3RoLCBqID0gbiAtIDE7IGkgPCBuOyBqID0gaSsrKSB7CiAgICAgICAgdmFyIHBpID0gcmluZ1tpXSwgeGkgPSBwaVswXSwgeWkgPSBwaVsxXSwgcGogPSByaW5nW2pdLCB4aiA9IHBqWzBdLCB5aiA9IHBqWzFdOwogICAgICAgIGlmIChzZWdtZW50Q29udGFpbnMocGksIHBqLCBwb2ludCkpIHJldHVybiAwOwogICAgICAgIGlmICgoKHlpID4geSkgIT09ICh5aiA+IHkpKSAmJiAoKHggPCAoeGogLSB4aSkgKiAoeSAtIHlpKSAvICh5aiAtIHlpKSArIHhpKSkpIGNvbnRhaW5zID0gLWNvbnRhaW5zOwogICAgICB9CiAgICAgIHJldHVybiBjb250YWluczsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWdtZW50Q29udGFpbnMoYSwgYiwgYykgewogICAgICB2YXIgaTsgcmV0dXJuIGNvbGxpbmVhcihhLCBiLCBjKSAmJiB3aXRoaW4oYVtpID0gKyhhWzBdID09PSBiWzBdKV0sIGNbaV0sIGJbaV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbGxpbmVhcihhLCBiLCBjKSB7CiAgICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKGNbMV0gLSBhWzFdKSA9PT0gKGNbMF0gLSBhWzBdKSAqIChiWzFdIC0gYVsxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gd2l0aGluKHAsIHEsIHIpIHsKICAgICAgcmV0dXJuIHAgPD0gcSAmJiBxIDw9IHIgfHwgciA8PSBxICYmIHEgPD0gcDsKICAgIH0KCiAgICBmdW5jdGlvbiBub29wJDEoKSB7fQoKICAgIHZhciBjYXNlcyA9IFsKICAgICAgW10sCiAgICAgIFtbWzEuMCwgMS41XSwgWzAuNSwgMS4wXV1dLAogICAgICBbW1sxLjUsIDEuMF0sIFsxLjAsIDEuNV1dXSwKICAgICAgW1tbMS41LCAxLjBdLCBbMC41LCAxLjBdXV0sCiAgICAgIFtbWzEuMCwgMC41XSwgWzEuNSwgMS4wXV1dLAogICAgICBbW1sxLjAsIDEuNV0sIFswLjUsIDEuMF1dLCBbWzEuMCwgMC41XSwgWzEuNSwgMS4wXV1dLAogICAgICBbW1sxLjAsIDAuNV0sIFsxLjAsIDEuNV1dXSwKICAgICAgW1tbMS4wLCAwLjVdLCBbMC41LCAxLjBdXV0sCiAgICAgIFtbWzAuNSwgMS4wXSwgWzEuMCwgMC41XV1dLAogICAgICBbW1sxLjAsIDEuNV0sIFsxLjAsIDAuNV1dXSwKICAgICAgW1tbMC41LCAxLjBdLCBbMS4wLCAwLjVdXSwgW1sxLjUsIDEuMF0sIFsxLjAsIDEuNV1dXSwKICAgICAgW1tbMS41LCAxLjBdLCBbMS4wLCAwLjVdXV0sCiAgICAgIFtbWzAuNSwgMS4wXSwgWzEuNSwgMS4wXV1dLAogICAgICBbW1sxLjAsIDEuNV0sIFsxLjUsIDEuMF1dXSwKICAgICAgW1tbMC41LCAxLjBdLCBbMS4wLCAxLjVdXV0sCiAgICAgIFtdCiAgICBdOwoKICAgIGZ1bmN0aW9uIGNvbnRvdXJzKCkgewogICAgICB2YXIgZHggPSAxLAogICAgICAgICAgZHkgPSAxLAogICAgICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkU3R1cmdlcywKICAgICAgICAgIHNtb290aCA9IHNtb290aExpbmVhcjsKCiAgICAgIGZ1bmN0aW9uIGNvbnRvdXJzKHZhbHVlcykgewogICAgICAgIHZhciB0eiA9IHRocmVzaG9sZCh2YWx1ZXMpOwoKICAgICAgICAvLyBDb252ZXJ0IG51bWJlciBvZiB0aHJlc2hvbGRzIGludG8gdW5pZm9ybSB0aHJlc2hvbGRzLgogICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh0eikpIHsKICAgICAgICAgIHZhciBkb21haW4gPSBleHRlbnQodmFsdWVzKSwgc3RhcnQgPSBkb21haW5bMF0sIHN0b3AgPSBkb21haW5bMV07CiAgICAgICAgICB0eiA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCB0eik7CiAgICAgICAgICB0eiA9IHNlcXVlbmNlKE1hdGguZmxvb3Ioc3RhcnQgLyB0eikgKiB0eiwgTWF0aC5mbG9vcihzdG9wIC8gdHopICogdHosIHR6KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHogPSB0ei5zbGljZSgpLnNvcnQoYXNjZW5kaW5nJDIpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHR6Lm1hcChmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGNvbnRvdXIodmFsdWVzLCB2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8vIEFjY3VtdWxhdGUsIHNtb290aCBjb250b3VyIHJpbmdzLCBhc3NpZ24gaG9sZXMgdG8gZXh0ZXJpb3IgcmluZ3MuCiAgICAgIC8vIEJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9zaGFwZWZpbGUvYmxvYi92MC42LjIvc2hwL3BvbHlnb24uanMKICAgICAgZnVuY3Rpb24gY29udG91cih2YWx1ZXMsIHZhbHVlKSB7CiAgICAgICAgdmFyIHBvbHlnb25zID0gW10sCiAgICAgICAgICAgIGhvbGVzID0gW107CgogICAgICAgIGlzb3JpbmdzKHZhbHVlcywgdmFsdWUsIGZ1bmN0aW9uKHJpbmcpIHsKICAgICAgICAgIHNtb290aChyaW5nLCB2YWx1ZXMsIHZhbHVlKTsKICAgICAgICAgIGlmIChhcmVhKHJpbmcpID4gMCkgcG9seWdvbnMucHVzaChbcmluZ10pOwogICAgICAgICAgZWxzZSBob2xlcy5wdXNoKHJpbmcpOwogICAgICAgIH0pOwoKICAgICAgICBob2xlcy5mb3JFYWNoKGZ1bmN0aW9uKGhvbGUpIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbnMubGVuZ3RoLCBwb2x5Z29uOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGlmIChjb250YWlucygocG9seWdvbiA9IHBvbHlnb25zW2ldKVswXSwgaG9sZSkgIT09IC0xKSB7CiAgICAgICAgICAgICAgcG9seWdvbi5wdXNoKGhvbGUpOwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICByZXR1cm4gewogICAgICAgICAgdHlwZTogIk11bHRpUG9seWdvbiIsCiAgICAgICAgICB2YWx1ZTogdmFsdWUsCiAgICAgICAgICBjb29yZGluYXRlczogcG9seWdvbnMKICAgICAgICB9OwogICAgICB9CgogICAgICAvLyBNYXJjaGluZyBzcXVhcmVzIHdpdGggaXNvbGluZXMgc3RpdGNoZWQgaW50byByaW5ncy4KICAgICAgLy8gQmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL3RvcG9qc29uL3RvcG9qc29uLWNsaWVudC9ibG9iL3YzLjAuMC9zcmMvc3RpdGNoLmpzCiAgICAgIGZ1bmN0aW9uIGlzb3JpbmdzKHZhbHVlcywgdmFsdWUsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIGZyYWdtZW50QnlTdGFydCA9IG5ldyBBcnJheSwKICAgICAgICAgICAgZnJhZ21lbnRCeUVuZCA9IG5ldyBBcnJheSwKICAgICAgICAgICAgeCwgeSwgdDAsIHQxLCB0MiwgdDM7CgogICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGZpcnN0IHJvdyAoeSA9IC0xLCB0MiA9IHQzID0gMCkuCiAgICAgICAgeCA9IHkgPSAtMTsKICAgICAgICB0MSA9IHZhbHVlc1swXSA+PSB2YWx1ZTsKICAgICAgICBjYXNlc1t0MSA8PCAxXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgICAgd2hpbGUgKCsreCA8IGR4IC0gMSkgewogICAgICAgICAgdDAgPSB0MSwgdDEgPSB2YWx1ZXNbeCArIDFdID49IHZhbHVlOwogICAgICAgICAgY2FzZXNbdDAgfCB0MSA8PCAxXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgICAgfQogICAgICAgIGNhc2VzW3QxIDw8IDBdLmZvckVhY2goc3RpdGNoKTsKCiAgICAgICAgLy8gR2VuZXJhbCBjYXNlIGZvciB0aGUgaW50ZXJtZWRpYXRlIHJvd3MuCiAgICAgICAgd2hpbGUgKCsreSA8IGR5IC0gMSkgewogICAgICAgICAgeCA9IC0xOwogICAgICAgICAgdDEgPSB2YWx1ZXNbeSAqIGR4ICsgZHhdID49IHZhbHVlOwogICAgICAgICAgdDIgPSB2YWx1ZXNbeSAqIGR4XSA+PSB2YWx1ZTsKICAgICAgICAgIGNhc2VzW3QxIDw8IDEgfCB0MiA8PCAyXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgICAgICB3aGlsZSAoKyt4IDwgZHggLSAxKSB7CiAgICAgICAgICAgIHQwID0gdDEsIHQxID0gdmFsdWVzW3kgKiBkeCArIGR4ICsgeCArIDFdID49IHZhbHVlOwogICAgICAgICAgICB0MyA9IHQyLCB0MiA9IHZhbHVlc1t5ICogZHggKyB4ICsgMV0gPj0gdmFsdWU7CiAgICAgICAgICAgIGNhc2VzW3QwIHwgdDEgPDwgMSB8IHQyIDw8IDIgfCB0MyA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlc1t0MSB8IHQyIDw8IDNdLmZvckVhY2goc3RpdGNoKTsKICAgICAgICB9CgogICAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdGhlIGxhc3Qgcm93ICh5ID0gZHkgLSAxLCB0MCA9IHQxID0gMCkuCiAgICAgICAgeCA9IC0xOwogICAgICAgIHQyID0gdmFsdWVzW3kgKiBkeF0gPj0gdmFsdWU7CiAgICAgICAgY2FzZXNbdDIgPDwgMl0uZm9yRWFjaChzdGl0Y2gpOwogICAgICAgIHdoaWxlICgrK3ggPCBkeCAtIDEpIHsKICAgICAgICAgIHQzID0gdDIsIHQyID0gdmFsdWVzW3kgKiBkeCArIHggKyAxXSA+PSB2YWx1ZTsKICAgICAgICAgIGNhc2VzW3QyIDw8IDIgfCB0MyA8PCAzXS5mb3JFYWNoKHN0aXRjaCk7CiAgICAgICAgfQogICAgICAgIGNhc2VzW3QyIDw8IDNdLmZvckVhY2goc3RpdGNoKTsKCiAgICAgICAgZnVuY3Rpb24gc3RpdGNoKGxpbmUpIHsKICAgICAgICAgIHZhciBzdGFydCA9IFtsaW5lWzBdWzBdICsgeCwgbGluZVswXVsxXSArIHldLAogICAgICAgICAgICAgIGVuZCA9IFtsaW5lWzFdWzBdICsgeCwgbGluZVsxXVsxXSArIHldLAogICAgICAgICAgICAgIHN0YXJ0SW5kZXggPSBpbmRleChzdGFydCksCiAgICAgICAgICAgICAgZW5kSW5kZXggPSBpbmRleChlbmQpLAogICAgICAgICAgICAgIGYsIGc7CiAgICAgICAgICBpZiAoZiA9IGZyYWdtZW50QnlFbmRbc3RhcnRJbmRleF0pIHsKICAgICAgICAgICAgaWYgKGcgPSBmcmFnbWVudEJ5U3RhcnRbZW5kSW5kZXhdKSB7CiAgICAgICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlFbmRbZi5lbmRdOwogICAgICAgICAgICAgIGRlbGV0ZSBmcmFnbWVudEJ5U3RhcnRbZy5zdGFydF07CiAgICAgICAgICAgICAgaWYgKGYgPT09IGcpIHsKICAgICAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhmLnJpbmcpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRbZi5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2cuZW5kXSA9IHtzdGFydDogZi5zdGFydCwgZW5kOiBnLmVuZCwgcmluZzogZi5yaW5nLmNvbmNhdChnLnJpbmcpfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlFbmRbZi5lbmRdOwogICAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAgICAgICAgICAgZnJhZ21lbnRCeUVuZFtmLmVuZCA9IGVuZEluZGV4XSA9IGY7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoZiA9IGZyYWdtZW50QnlTdGFydFtlbmRJbmRleF0pIHsKICAgICAgICAgICAgaWYgKGcgPSBmcmFnbWVudEJ5RW5kW3N0YXJ0SW5kZXhdKSB7CiAgICAgICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTsKICAgICAgICAgICAgICBkZWxldGUgZnJhZ21lbnRCeUVuZFtnLmVuZF07CiAgICAgICAgICAgICAgaWYgKGYgPT09IGcpIHsKICAgICAgICAgICAgICAgIGYucmluZy5wdXNoKGVuZCk7CiAgICAgICAgICAgICAgICBjYWxsYmFjayhmLnJpbmcpOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBmcmFnbWVudEJ5U3RhcnRbZy5zdGFydF0gPSBmcmFnbWVudEJ5RW5kW2YuZW5kXSA9IHtzdGFydDogZy5zdGFydCwgZW5kOiBmLmVuZCwgcmluZzogZy5yaW5nLmNvbmNhdChmLnJpbmcpfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgZGVsZXRlIGZyYWdtZW50QnlTdGFydFtmLnN0YXJ0XTsKICAgICAgICAgICAgICBmLnJpbmcudW5zaGlmdChzdGFydCk7CiAgICAgICAgICAgICAgZnJhZ21lbnRCeVN0YXJ0W2Yuc3RhcnQgPSBzdGFydEluZGV4XSA9IGY7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGZyYWdtZW50QnlTdGFydFtzdGFydEluZGV4XSA9IGZyYWdtZW50QnlFbmRbZW5kSW5kZXhdID0ge3N0YXJ0OiBzdGFydEluZGV4LCBlbmQ6IGVuZEluZGV4LCByaW5nOiBbc3RhcnQsIGVuZF19OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW5kZXgocG9pbnQpIHsKICAgICAgICByZXR1cm4gcG9pbnRbMF0gKiAyICsgcG9pbnRbMV0gKiAoZHggKyAxKSAqIDQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNtb290aExpbmVhcihyaW5nLCB2YWx1ZXMsIHZhbHVlKSB7CiAgICAgICAgcmluZy5mb3JFYWNoKGZ1bmN0aW9uKHBvaW50KSB7CiAgICAgICAgICB2YXIgeCA9IHBvaW50WzBdLAogICAgICAgICAgICAgIHkgPSBwb2ludFsxXSwKICAgICAgICAgICAgICB4dCA9IHggfCAwLAogICAgICAgICAgICAgIHl0ID0geSB8IDAsCiAgICAgICAgICAgICAgdjAsCiAgICAgICAgICAgICAgdjEgPSB2YWx1ZXNbeXQgKiBkeCArIHh0XTsKICAgICAgICAgIGlmICh4ID4gMCAmJiB4IDwgZHggJiYgeHQgPT09IHgpIHsKICAgICAgICAgICAgdjAgPSB2YWx1ZXNbeXQgKiBkeCArIHh0IC0gMV07CiAgICAgICAgICAgIHBvaW50WzBdID0geCArICh2YWx1ZSAtIHYwKSAvICh2MSAtIHYwKSAtIDAuNTsKICAgICAgICAgIH0KICAgICAgICAgIGlmICh5ID4gMCAmJiB5IDwgZHkgJiYgeXQgPT09IHkpIHsKICAgICAgICAgICAgdjAgPSB2YWx1ZXNbKHl0IC0gMSkgKiBkeCArIHh0XTsKICAgICAgICAgICAgcG9pbnRbMV0gPSB5ICsgKHZhbHVlIC0gdjApIC8gKHYxIC0gdjApIC0gMC41OwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBjb250b3Vycy5jb250b3VyID0gY29udG91cjsKCiAgICAgIGNvbnRvdXJzLnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW2R4LCBkeV07CiAgICAgICAgdmFyIF8wID0gTWF0aC5jZWlsKF9bMF0pLCBfMSA9IE1hdGguY2VpbChfWzFdKTsKICAgICAgICBpZiAoIShfMCA+IDApIHx8ICEoXzEgPiAwKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIHNpemUiKTsKICAgICAgICByZXR1cm4gZHggPSBfMCwgZHkgPSBfMSwgY29udG91cnM7CiAgICAgIH07CgogICAgICBjb250b3Vycy50aHJlc2hvbGRzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRocmVzaG9sZCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IEFycmF5LmlzQXJyYXkoXykgPyBjb25zdGFudCQ2KHNsaWNlJDMuY2FsbChfKSkgOiBjb25zdGFudCQ2KF8pLCBjb250b3VycykgOiB0aHJlc2hvbGQ7CiAgICAgIH07CgogICAgICBjb250b3Vycy5zbW9vdGggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc21vb3RoID0gXyA/IHNtb290aExpbmVhciA6IG5vb3AkMSwgY29udG91cnMpIDogc21vb3RoID09PSBzbW9vdGhMaW5lYXI7CiAgICAgIH07CgogICAgICByZXR1cm4gY29udG91cnM7CiAgICB9CgogICAgLy8gVE9ETyBPcHRpbWl6ZSBlZGdlIGNhc2VzLgogICAgLy8gVE9ETyBPcHRpbWl6ZSBpbmRleCBjYWxjdWxhdGlvbi4KICAgIC8vIFRPRE8gT3B0aW1pemUgYXJndW1lbnRzLgogICAgZnVuY3Rpb24gYmx1clgoc291cmNlLCB0YXJnZXQsIHIpIHsKICAgICAgdmFyIG4gPSBzb3VyY2Uud2lkdGgsCiAgICAgICAgICBtID0gc291cmNlLmhlaWdodCwKICAgICAgICAgIHcgPSAociA8PCAxKSArIDE7CiAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIHNyID0gMDsgaSA8IG4gKyByOyArK2kpIHsKICAgICAgICAgIGlmIChpIDwgbikgewogICAgICAgICAgICBzciArPSBzb3VyY2UuZGF0YVtpICsgaiAqIG5dOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGkgPj0gcikgewogICAgICAgICAgICBpZiAoaSA+PSB3KSB7CiAgICAgICAgICAgICAgc3IgLT0gc291cmNlLmRhdGFbaSAtIHcgKyBqICogbl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGFyZ2V0LmRhdGFbaSAtIHIgKyBqICogbl0gPSBzciAvIE1hdGgubWluKGkgKyAxLCBuIC0gMSArIHcgLSBpLCB3KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICAvLyBUT0RPIE9wdGltaXplIGVkZ2UgY2FzZXMuCiAgICAvLyBUT0RPIE9wdGltaXplIGluZGV4IGNhbGN1bGF0aW9uLgogICAgLy8gVE9ETyBPcHRpbWl6ZSBhcmd1bWVudHMuCiAgICBmdW5jdGlvbiBibHVyWShzb3VyY2UsIHRhcmdldCwgcikgewogICAgICB2YXIgbiA9IHNvdXJjZS53aWR0aCwKICAgICAgICAgIG0gPSBzb3VyY2UuaGVpZ2h0LAogICAgICAgICAgdyA9IChyIDw8IDEpICsgMTsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBmb3IgKHZhciBqID0gMCwgc3IgPSAwOyBqIDwgbSArIHI7ICsraikgewogICAgICAgICAgaWYgKGogPCBtKSB7CiAgICAgICAgICAgIHNyICs9IHNvdXJjZS5kYXRhW2kgKyBqICogbl07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaiA+PSByKSB7CiAgICAgICAgICAgIGlmIChqID49IHcpIHsKICAgICAgICAgICAgICBzciAtPSBzb3VyY2UuZGF0YVtpICsgKGogLSB3KSAqIG5dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhcmdldC5kYXRhW2kgKyAoaiAtIHIpICogbl0gPSBzciAvIE1hdGgubWluKGogKyAxLCBtIC0gMSArIHcgLSBqLCB3KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0WChkKSB7CiAgICAgIHJldHVybiBkWzBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRZKGQpIHsKICAgICAgcmV0dXJuIGRbMV07CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFdlaWdodCgpIHsKICAgICAgcmV0dXJuIDE7CiAgICB9CgogICAgZnVuY3Rpb24gZGVuc2l0eSgpIHsKICAgICAgdmFyIHggPSBkZWZhdWx0WCwKICAgICAgICAgIHkgPSBkZWZhdWx0WSwKICAgICAgICAgIHdlaWdodCA9IGRlZmF1bHRXZWlnaHQsCiAgICAgICAgICBkeCA9IDk2MCwKICAgICAgICAgIGR5ID0gNTAwLAogICAgICAgICAgciA9IDIwLCAvLyBibHVyIHJhZGl1cwogICAgICAgICAgayA9IDIsIC8vIGxvZzIoZ3JpZCBjZWxsIHNpemUpCiAgICAgICAgICBvID0gciAqIDMsIC8vIGdyaWQgb2Zmc2V0LCB0byBwYWQgZm9yIGJsdXIKICAgICAgICAgIG4gPSAoZHggKyBvICogMikgPj4gaywgLy8gZ3JpZCB3aWR0aAogICAgICAgICAgbSA9IChkeSArIG8gKiAyKSA+PiBrLCAvLyBncmlkIGhlaWdodAogICAgICAgICAgdGhyZXNob2xkID0gY29uc3RhbnQkNigyMCk7CgogICAgICBmdW5jdGlvbiBkZW5zaXR5KGRhdGEpIHsKICAgICAgICB2YXIgdmFsdWVzMCA9IG5ldyBGbG9hdDMyQXJyYXkobiAqIG0pLAogICAgICAgICAgICB2YWx1ZXMxID0gbmV3IEZsb2F0MzJBcnJheShuICogbSk7CgogICAgICAgIGRhdGEuZm9yRWFjaChmdW5jdGlvbihkLCBpLCBkYXRhKSB7CiAgICAgICAgICB2YXIgeGkgPSAoK3goZCwgaSwgZGF0YSkgKyBvKSA+PiBrLAogICAgICAgICAgICAgIHlpID0gKCt5KGQsIGksIGRhdGEpICsgbykgPj4gaywKICAgICAgICAgICAgICB3aSA9ICt3ZWlnaHQoZCwgaSwgZGF0YSk7CiAgICAgICAgICBpZiAoeGkgPj0gMCAmJiB4aSA8IG4gJiYgeWkgPj0gMCAmJiB5aSA8IG0pIHsKICAgICAgICAgICAgdmFsdWVzMFt4aSArIHlpICogbl0gKz0gd2k7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIFRPRE8gT3B0aW1pemUuCiAgICAgICAgYmx1clgoe3dpZHRoOiBuLCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMX0sIHIgPj4gayk7CiAgICAgICAgYmx1clkoe3dpZHRoOiBuLCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMH0sIHIgPj4gayk7CiAgICAgICAgYmx1clgoe3dpZHRoOiBuLCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMX0sIHIgPj4gayk7CiAgICAgICAgYmx1clkoe3dpZHRoOiBuLCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMH0sIHIgPj4gayk7CiAgICAgICAgYmx1clgoe3dpZHRoOiBuLCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczB9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMX0sIHIgPj4gayk7CiAgICAgICAgYmx1clkoe3dpZHRoOiBuLCBoZWlnaHQ6IG0sIGRhdGE6IHZhbHVlczF9LCB7d2lkdGg6IG4sIGhlaWdodDogbSwgZGF0YTogdmFsdWVzMH0sIHIgPj4gayk7CgogICAgICAgIHZhciB0eiA9IHRocmVzaG9sZCh2YWx1ZXMwKTsKCiAgICAgICAgLy8gQ29udmVydCBudW1iZXIgb2YgdGhyZXNob2xkcyBpbnRvIHVuaWZvcm0gdGhyZXNob2xkcy4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHopKSB7CiAgICAgICAgICB2YXIgc3RvcCA9IG1heCh2YWx1ZXMwKTsKICAgICAgICAgIHR6ID0gdGlja1N0ZXAoMCwgc3RvcCwgdHopOwogICAgICAgICAgdHogPSBzZXF1ZW5jZSgwLCBNYXRoLmZsb29yKHN0b3AgLyB0eikgKiB0eiwgdHopOwogICAgICAgICAgdHouc2hpZnQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjb250b3VycygpCiAgICAgICAgICAgIC50aHJlc2hvbGRzKHR6KQogICAgICAgICAgICAuc2l6ZShbbiwgbV0pCiAgICAgICAgICAodmFsdWVzMCkKICAgICAgICAgICAgLm1hcCh0cmFuc2Zvcm0pOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2Zvcm0oZ2VvbWV0cnkpIHsKICAgICAgICBnZW9tZXRyeS52YWx1ZSAqPSBNYXRoLnBvdygyLCAtMiAqIGspOyAvLyBEZW5zaXR5IGluIHBvaW50cyBwZXIgc3F1YXJlIHBpeGVsLgogICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtUG9seWdvbik7CiAgICAgICAgcmV0dXJuIGdlb21ldHJ5OwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2x5Z29uKGNvb3JkaW5hdGVzKSB7CiAgICAgICAgY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm1SaW5nKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gdHJhbnNmb3JtUmluZyhjb29yZGluYXRlcykgewogICAgICAgIGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtUG9pbnQpOwogICAgICB9CgogICAgICAvLyBUT0RPIE9wdGltaXplLgogICAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChjb29yZGluYXRlcykgewogICAgICAgIGNvb3JkaW5hdGVzWzBdID0gY29vcmRpbmF0ZXNbMF0gKiBNYXRoLnBvdygyLCBrKSAtIG87CiAgICAgICAgY29vcmRpbmF0ZXNbMV0gPSBjb29yZGluYXRlc1sxXSAqIE1hdGgucG93KDIsIGspIC0gbzsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcmVzaXplKCkgewogICAgICAgIG8gPSByICogMzsKICAgICAgICBuID0gKGR4ICsgbyAqIDIpID4+IGs7CiAgICAgICAgbSA9IChkeSArIG8gKiAyKSA+PiBrOwogICAgICAgIHJldHVybiBkZW5zaXR5OwogICAgICB9CgogICAgICBkZW5zaXR5LnggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDYoK18pLCBkZW5zaXR5KSA6IHg7CiAgICAgIH07CgogICAgICBkZW5zaXR5LnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDYoK18pLCBkZW5zaXR5KSA6IHk7CiAgICAgIH07CgogICAgICBkZW5zaXR5LndlaWdodCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh3ZWlnaHQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ2KCtfKSwgZGVuc2l0eSkgOiB3ZWlnaHQ7CiAgICAgIH07CgogICAgICBkZW5zaXR5LnNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW2R4LCBkeV07CiAgICAgICAgdmFyIF8wID0gTWF0aC5jZWlsKF9bMF0pLCBfMSA9IE1hdGguY2VpbChfWzFdKTsKICAgICAgICBpZiAoIShfMCA+PSAwKSAmJiAhKF8wID49IDApKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgc2l6ZSIpOwogICAgICAgIHJldHVybiBkeCA9IF8wLCBkeSA9IF8xLCByZXNpemUoKTsKICAgICAgfTsKCiAgICAgIGRlbnNpdHkuY2VsbFNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gMSA8PCBrOwogICAgICAgIGlmICghKChfID0gK18pID49IDEpKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2VsbCBzaXplIik7CiAgICAgICAgcmV0dXJuIGsgPSBNYXRoLmZsb29yKE1hdGgubG9nKF8pIC8gTWF0aC5MTjIpLCByZXNpemUoKTsKICAgICAgfTsKCiAgICAgIGRlbnNpdHkudGhyZXNob2xkcyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aHJlc2hvbGQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBBcnJheS5pc0FycmF5KF8pID8gY29uc3RhbnQkNihzbGljZSQzLmNhbGwoXykpIDogY29uc3RhbnQkNihfKSwgZGVuc2l0eSkgOiB0aHJlc2hvbGQ7CiAgICAgIH07CgogICAgICBkZW5zaXR5LmJhbmR3aWR0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBNYXRoLnNxcnQociAqIChyICsgMSkpOwogICAgICAgIGlmICghKChfID0gK18pID49IDApKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgYmFuZHdpZHRoIik7CiAgICAgICAgcmV0dXJuIHIgPSBNYXRoLnJvdW5kKChNYXRoLnNxcnQoNCAqIF8gKiBfICsgMSkgLSAxKSAvIDIpLCByZXNpemUoKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBkZW5zaXR5OwogICAgfQoKICAgIHZhciBFT0wgPSB7fSwKICAgICAgICBFT0YgPSB7fSwKICAgICAgICBRVU9URSA9IDM0LAogICAgICAgIE5FV0xJTkUgPSAxMCwKICAgICAgICBSRVRVUk4gPSAxMzsKCiAgICBmdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIoY29sdW1ucykgewogICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCJkIiwgInJldHVybiB7IiArIGNvbHVtbnMubWFwKGZ1bmN0aW9uKG5hbWUsIGkpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkobmFtZSkgKyAiOiBkWyIgKyBpICsgIl0gfHwgXCJcIiI7CiAgICAgIH0pLmpvaW4oIiwiKSArICJ9Iik7CiAgICB9CgogICAgZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyKGNvbHVtbnMsIGYpIHsKICAgICAgdmFyIG9iamVjdCA9IG9iamVjdENvbnZlcnRlcihjb2x1bW5zKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHJvdywgaSkgewogICAgICAgIHJldHVybiBmKG9iamVjdChyb3cpLCBpLCBjb2x1bW5zKTsKICAgICAgfTsKICAgIH0KCiAgICAvLyBDb21wdXRlIHVuaXF1ZSBjb2x1bW5zIGluIG9yZGVyIG9mIGRpc2NvdmVyeS4KICAgIGZ1bmN0aW9uIGluZmVyQ29sdW1ucyhyb3dzKSB7CiAgICAgIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLAogICAgICAgICAgY29sdW1ucyA9IFtdOwoKICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykgewogICAgICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHsKICAgICAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7CiAgICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5TZXRbY29sdW1uXSA9IGNvbHVtbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHJldHVybiBjb2x1bW5zOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhZCh2YWx1ZSwgd2lkdGgpIHsKICAgICAgdmFyIHMgPSB2YWx1ZSArICIiLCBsZW5ndGggPSBzLmxlbmd0aDsKICAgICAgcmV0dXJuIGxlbmd0aCA8IHdpZHRoID8gbmV3IEFycmF5KHdpZHRoIC0gbGVuZ3RoICsgMSkuam9pbigwKSArIHMgOiBzOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFllYXIoeWVhcikgewogICAgICByZXR1cm4geWVhciA8IDAgPyAiLSIgKyBwYWQoLXllYXIsIDYpCiAgICAgICAgOiB5ZWFyID4gOTk5OSA/ICIrIiArIHBhZCh5ZWFyLCA2KQogICAgICAgIDogcGFkKHllYXIsIDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdERhdGUoZGF0ZSkgewogICAgICB2YXIgaG91cnMgPSBkYXRlLmdldFVUQ0hvdXJzKCksCiAgICAgICAgICBtaW51dGVzID0gZGF0ZS5nZXRVVENNaW51dGVzKCksCiAgICAgICAgICBzZWNvbmRzID0gZGF0ZS5nZXRVVENTZWNvbmRzKCksCiAgICAgICAgICBtaWxsaXNlY29uZHMgPSBkYXRlLmdldFVUQ01pbGxpc2Vjb25kcygpOwogICAgICByZXR1cm4gaXNOYU4oZGF0ZSkgPyAiSW52YWxpZCBEYXRlIgogICAgICAgICAgOiBmb3JtYXRZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSkgKyAiLSIgKyBwYWQoZGF0ZS5nZXRVVENNb250aCgpICsgMSwgMikgKyAiLSIgKyBwYWQoZGF0ZS5nZXRVVENEYXRlKCksIDIpCiAgICAgICAgICArIChtaWxsaXNlY29uZHMgPyAiVCIgKyBwYWQoaG91cnMsIDIpICsgIjoiICsgcGFkKG1pbnV0ZXMsIDIpICsgIjoiICsgcGFkKHNlY29uZHMsIDIpICsgIi4iICsgcGFkKG1pbGxpc2Vjb25kcywgMykgKyAiWiIKICAgICAgICAgIDogc2Vjb25kcyA/ICJUIiArIHBhZChob3VycywgMikgKyAiOiIgKyBwYWQobWludXRlcywgMikgKyAiOiIgKyBwYWQoc2Vjb25kcywgMikgKyAiWiIKICAgICAgICAgIDogbWludXRlcyB8fCBob3VycyA/ICJUIiArIHBhZChob3VycywgMikgKyAiOiIgKyBwYWQobWludXRlcywgMikgKyAiWiIKICAgICAgICAgIDogIiIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRzdkZvcm1hdChkZWxpbWl0ZXIpIHsKICAgICAgdmFyIHJlRm9ybWF0ID0gbmV3IFJlZ0V4cCgiW1wiIiArIGRlbGltaXRlciArICJcblxyXSIpLAogICAgICAgICAgREVMSU1JVEVSID0gZGVsaW1pdGVyLmNoYXJDb2RlQXQoMCk7CgogICAgICBmdW5jdGlvbiBwYXJzZSh0ZXh0LCBmKSB7CiAgICAgICAgdmFyIGNvbnZlcnQsIGNvbHVtbnMsIHJvd3MgPSBwYXJzZVJvd3ModGV4dCwgZnVuY3Rpb24ocm93LCBpKSB7CiAgICAgICAgICBpZiAoY29udmVydCkgcmV0dXJuIGNvbnZlcnQocm93LCBpIC0gMSk7CiAgICAgICAgICBjb2x1bW5zID0gcm93LCBjb252ZXJ0ID0gZiA/IGN1c3RvbUNvbnZlcnRlcihyb3csIGYpIDogb2JqZWN0Q29udmVydGVyKHJvdyk7CiAgICAgICAgfSk7CiAgICAgICAgcm93cy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTsKICAgICAgICByZXR1cm4gcm93czsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VSb3dzKHRleHQsIGYpIHsKICAgICAgICB2YXIgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93cwogICAgICAgICAgICBOID0gdGV4dC5sZW5ndGgsCiAgICAgICAgICAgIEkgPSAwLCAvLyBjdXJyZW50IGNoYXJhY3RlciBpbmRleAogICAgICAgICAgICBuID0gMCwgLy8gY3VycmVudCBsaW5lIG51bWJlcgogICAgICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuCiAgICAgICAgICAgIGVvZiA9IE4gPD0gMCwgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0Y/CiAgICAgICAgICAgIGVvbCA9IGZhbHNlOyAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD8KCiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuCiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUpIC0tTjsKICAgICAgICBpZiAodGV4dC5jaGFyQ29kZUF0KE4gLSAxKSA9PT0gUkVUVVJOKSAtLU47CgogICAgICAgIGZ1bmN0aW9uIHRva2VuKCkgewogICAgICAgICAgaWYgKGVvZikgcmV0dXJuIEVPRjsKICAgICAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MOwoKICAgICAgICAgIC8vIFVuZXNjYXBlIHF1b3Rlcy4KICAgICAgICAgIHZhciBpLCBqID0gSSwgYzsKICAgICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaikgPT09IFFVT1RFKSB7CiAgICAgICAgICAgIHdoaWxlIChJKysgPCBOICYmIHRleHQuY2hhckNvZGVBdChJKSAhPT0gUVVPVEUgfHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFKTsKICAgICAgICAgICAgaWYgKChpID0gSSkgPj0gTikgZW9mID0gdHJ1ZTsKICAgICAgICAgICAgZWxzZSBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoSSsrKSkgPT09IE5FV0xJTkUpIGVvbCA9IHRydWU7CiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTikgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FKSArK0k7IH0KICAgICAgICAgICAgcmV0dXJuIHRleHQuc2xpY2UoaiArIDEsIGkgLSAxKS5yZXBsYWNlKC8iIi9nLCAiXCIiKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBGaW5kIG5leHQgZGVsaW1pdGVyIG9yIG5ld2xpbmUuCiAgICAgICAgICB3aGlsZSAoSSA8IE4pIHsKICAgICAgICAgICAgaWYgKChjID0gdGV4dC5jaGFyQ29kZUF0KGkgPSBJKyspKSA9PT0gTkVXTElORSkgZW9sID0gdHJ1ZTsKICAgICAgICAgICAgZWxzZSBpZiAoYyA9PT0gUkVUVVJOKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUpICsrSTsgfQogICAgICAgICAgICBlbHNlIGlmIChjICE9PSBERUxJTUlURVIpIGNvbnRpbnVlOwogICAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqLCBpKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBSZXR1cm4gbGFzdCB0b2tlbiBiZWZvcmUgRU9GLgogICAgICAgICAgcmV0dXJuIGVvZiA9IHRydWUsIHRleHQuc2xpY2UoaiwgTik7CiAgICAgICAgfQoKICAgICAgICB3aGlsZSAoKHQgPSB0b2tlbigpKSAhPT0gRU9GKSB7CiAgICAgICAgICB2YXIgcm93ID0gW107CiAgICAgICAgICB3aGlsZSAodCAhPT0gRU9MICYmIHQgIT09IEVPRikgcm93LnB1c2godCksIHQgPSB0b2tlbigpOwogICAgICAgICAgaWYgKGYgJiYgKHJvdyA9IGYocm93LCBuKyspKSA9PSBudWxsKSBjb250aW51ZTsKICAgICAgICAgIHJvd3MucHVzaChyb3cpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHJvd3M7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykgewogICAgICAgIHJldHVybiByb3dzLm1hcChmdW5jdGlvbihyb3cpIHsKICAgICAgICAgIHJldHVybiBjb2x1bW5zLm1hcChmdW5jdGlvbihjb2x1bW4pIHsKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlKHJvd1tjb2x1bW5dKTsKICAgICAgICAgIH0pLmpvaW4oZGVsaW1pdGVyKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0KHJvd3MsIGNvbHVtbnMpIHsKICAgICAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zKHJvd3MpOwogICAgICAgIHJldHVybiBbY29sdW1ucy5tYXAoZm9ybWF0VmFsdWUpLmpvaW4oZGVsaW1pdGVyKV0uY29uY2F0KHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykpLmpvaW4oIlxuIik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdEJvZHkocm93cywgY29sdW1ucykgewogICAgICAgIGlmIChjb2x1bW5zID09IG51bGwpIGNvbHVtbnMgPSBpbmZlckNvbHVtbnMocm93cyk7CiAgICAgICAgcmV0dXJuIHByZWZvcm1hdEJvZHkocm93cywgY29sdW1ucykuam9pbigiXG4iKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0Um93cyhyb3dzKSB7CiAgICAgICAgcmV0dXJuIHJvd3MubWFwKGZvcm1hdFJvdykuam9pbigiXG4iKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0Um93KHJvdykgewogICAgICAgIHJldHVybiByb3cubWFwKGZvcm1hdFZhbHVlKS5qb2luKGRlbGltaXRlcik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFZhbHVlKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyAiIgogICAgICAgICAgICA6IHZhbHVlIGluc3RhbmNlb2YgRGF0ZSA/IGZvcm1hdERhdGUodmFsdWUpCiAgICAgICAgICAgIDogcmVGb3JtYXQudGVzdCh2YWx1ZSArPSAiIikgPyAiXCIiICsgdmFsdWUucmVwbGFjZSgvIi9nLCAiXCJcIiIpICsgIlwiIgogICAgICAgICAgICA6IHZhbHVlOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHBhcnNlOiBwYXJzZSwKICAgICAgICBwYXJzZVJvd3M6IHBhcnNlUm93cywKICAgICAgICBmb3JtYXQ6IGZvcm1hdCwKICAgICAgICBmb3JtYXRCb2R5OiBmb3JtYXRCb2R5LAogICAgICAgIGZvcm1hdFJvd3M6IGZvcm1hdFJvd3MsCiAgICAgICAgZm9ybWF0Um93OiBmb3JtYXRSb3csCiAgICAgICAgZm9ybWF0VmFsdWU6IGZvcm1hdFZhbHVlCiAgICAgIH07CiAgICB9CgogICAgdmFyIGNzdiA9IGRzdkZvcm1hdCgiLCIpOwoKICAgIHZhciBjc3ZQYXJzZSA9IGNzdi5wYXJzZTsKICAgIHZhciBjc3ZQYXJzZVJvd3MgPSBjc3YucGFyc2VSb3dzOwogICAgdmFyIGNzdkZvcm1hdCA9IGNzdi5mb3JtYXQ7CiAgICB2YXIgY3N2Rm9ybWF0Qm9keSA9IGNzdi5mb3JtYXRCb2R5OwogICAgdmFyIGNzdkZvcm1hdFJvd3MgPSBjc3YuZm9ybWF0Um93czsKICAgIHZhciBjc3ZGb3JtYXRSb3cgPSBjc3YuZm9ybWF0Um93OwogICAgdmFyIGNzdkZvcm1hdFZhbHVlID0gY3N2LmZvcm1hdFZhbHVlOwoKICAgIHZhciB0c3YgPSBkc3ZGb3JtYXQoIlx0Iik7CgogICAgdmFyIHRzdlBhcnNlID0gdHN2LnBhcnNlOwogICAgdmFyIHRzdlBhcnNlUm93cyA9IHRzdi5wYXJzZVJvd3M7CiAgICB2YXIgdHN2Rm9ybWF0ID0gdHN2LmZvcm1hdDsKICAgIHZhciB0c3ZGb3JtYXRCb2R5ID0gdHN2LmZvcm1hdEJvZHk7CiAgICB2YXIgdHN2Rm9ybWF0Um93cyA9IHRzdi5mb3JtYXRSb3dzOwogICAgdmFyIHRzdkZvcm1hdFJvdyA9IHRzdi5mb3JtYXRSb3c7CiAgICB2YXIgdHN2Rm9ybWF0VmFsdWUgPSB0c3YuZm9ybWF0VmFsdWU7CgogICAgZnVuY3Rpb24gYXV0b1R5cGUob2JqZWN0KSB7CiAgICAgIGZvciAodmFyIGtleSBpbiBvYmplY3QpIHsKICAgICAgICB2YXIgdmFsdWUgPSBvYmplY3Rba2V5XS50cmltKCksIG51bWJlciwgbTsKICAgICAgICBpZiAoIXZhbHVlKSB2YWx1ZSA9IG51bGw7CiAgICAgICAgZWxzZSBpZiAodmFsdWUgPT09ICJ0cnVlIikgdmFsdWUgPSB0cnVlOwogICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAiZmFsc2UiKSB2YWx1ZSA9IGZhbHNlOwogICAgICAgIGVsc2UgaWYgKHZhbHVlID09PSAiTmFOIikgdmFsdWUgPSBOYU47CiAgICAgICAgZWxzZSBpZiAoIWlzTmFOKG51bWJlciA9ICt2YWx1ZSkpIHZhbHVlID0gbnVtYmVyOwogICAgICAgIGVsc2UgaWYgKG0gPSB2YWx1ZS5tYXRjaCgvXihbLStdXGR7Mn0pP1xkezR9KC1cZHsyfSgtXGR7Mn0pPyk/KFRcZHsyfTpcZHsyfSg6XGR7Mn0oXC5cZHszfSk/KT8oWnxbLStdXGR7Mn06XGR7Mn0pPyk/JC8pKSB7CiAgICAgICAgICBpZiAoZml4dHogJiYgISFtWzRdICYmICFtWzddKSB2YWx1ZSA9IHZhbHVlLnJlcGxhY2UoLy0vZywgIi8iKS5yZXBsYWNlKC9ULywgIiAiKTsKICAgICAgICAgIHZhbHVlID0gbmV3IERhdGUodmFsdWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIGNvbnRpbnVlOwogICAgICAgIG9iamVjdFtrZXldID0gdmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIG9iamVjdDsKICAgIH0KCiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtZHN2L2lzc3Vlcy80NQogICAgdmFyIGZpeHR6ID0gbmV3IERhdGUoIjIwMTktMDEtMDFUMDA6MDAiKS5nZXRIb3VycygpIHx8IG5ldyBEYXRlKCIyMDE5LTA3LTAxVDAwOjAwIikuZ2V0SG91cnMoKTsKCiAgICBmdW5jdGlvbiByZXNwb25zZUJsb2IocmVzcG9uc2UpIHsKICAgICAgaWYgKCFyZXNwb25zZS5vaykgdGhyb3cgbmV3IEVycm9yKHJlc3BvbnNlLnN0YXR1cyArICIgIiArIHJlc3BvbnNlLnN0YXR1c1RleHQpOwogICAgICByZXR1cm4gcmVzcG9uc2UuYmxvYigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJsb2IoaW5wdXQsIGluaXQpIHsKICAgICAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlQmxvYik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzcG9uc2VBcnJheUJ1ZmZlcihyZXNwb25zZSkgewogICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgIiAiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7CiAgICAgIHJldHVybiByZXNwb25zZS5hcnJheUJ1ZmZlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1ZmZlcihpbnB1dCwgaW5pdCkgewogICAgICByZXR1cm4gZmV0Y2goaW5wdXQsIGluaXQpLnRoZW4ocmVzcG9uc2VBcnJheUJ1ZmZlcik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzcG9uc2VUZXh0KHJlc3BvbnNlKSB7CiAgICAgIGlmICghcmVzcG9uc2Uub2spIHRocm93IG5ldyBFcnJvcihyZXNwb25zZS5zdGF0dXMgKyAiICIgKyByZXNwb25zZS5zdGF0dXNUZXh0KTsKICAgICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0KGlucHV0LCBpbml0KSB7CiAgICAgIHJldHVybiBmZXRjaChpbnB1dCwgaW5pdCkudGhlbihyZXNwb25zZVRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRzdlBhcnNlKHBhcnNlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihpbnB1dCwgaW5pdCwgcm93KSB7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgdHlwZW9mIGluaXQgPT09ICJmdW5jdGlvbiIpIHJvdyA9IGluaXQsIGluaXQgPSB1bmRlZmluZWQ7CiAgICAgICAgcmV0dXJuIHRleHQoaW5wdXQsIGluaXQpLnRoZW4oZnVuY3Rpb24ocmVzcG9uc2UpIHsKICAgICAgICAgIHJldHVybiBwYXJzZShyZXNwb25zZSwgcm93KTsKICAgICAgICB9KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkc3YoZGVsaW1pdGVyLCBpbnB1dCwgaW5pdCwgcm93KSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAzICYmIHR5cGVvZiBpbml0ID09PSAiZnVuY3Rpb24iKSByb3cgPSBpbml0LCBpbml0ID0gdW5kZWZpbmVkOwogICAgICB2YXIgZm9ybWF0ID0gZHN2Rm9ybWF0KGRlbGltaXRlcik7CiAgICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHJlc3BvbnNlKSB7CiAgICAgICAgcmV0dXJuIGZvcm1hdC5wYXJzZShyZXNwb25zZSwgcm93KTsKICAgICAgfSk7CiAgICB9CgogICAgdmFyIGNzdiQxID0gZHN2UGFyc2UoY3N2UGFyc2UpOwogICAgdmFyIHRzdiQxID0gZHN2UGFyc2UodHN2UGFyc2UpOwoKICAgIGZ1bmN0aW9uIGltYWdlKGlucHV0LCBpbml0KSB7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgaW1hZ2UgPSBuZXcgSW1hZ2U7CiAgICAgICAgZm9yICh2YXIga2V5IGluIGluaXQpIGltYWdlW2tleV0gPSBpbml0W2tleV07CiAgICAgICAgaW1hZ2Uub25lcnJvciA9IHJlamVjdDsKICAgICAgICBpbWFnZS5vbmxvYWQgPSBmdW5jdGlvbigpIHsgcmVzb2x2ZShpbWFnZSk7IH07CiAgICAgICAgaW1hZ2Uuc3JjID0gaW5wdXQ7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc3BvbnNlSnNvbihyZXNwb25zZSkgewogICAgICBpZiAoIXJlc3BvbnNlLm9rKSB0aHJvdyBuZXcgRXJyb3IocmVzcG9uc2Uuc3RhdHVzICsgIiAiICsgcmVzcG9uc2Uuc3RhdHVzVGV4dCk7CiAgICAgIGlmIChyZXNwb25zZS5zdGF0dXMgPT09IDIwNCB8fCByZXNwb25zZS5zdGF0dXMgPT09IDIwNSkgcmV0dXJuOwogICAgICByZXR1cm4gcmVzcG9uc2UuanNvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGpzb24oaW5wdXQsIGluaXQpIHsKICAgICAgcmV0dXJuIGZldGNoKGlucHV0LCBpbml0KS50aGVuKHJlc3BvbnNlSnNvbik7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VyKHR5cGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGlucHV0LCBpbml0KSAgewogICAgICAgIHJldHVybiB0ZXh0KGlucHV0LCBpbml0KS50aGVuKGZ1bmN0aW9uKHRleHQpIHsKICAgICAgICAgIHJldHVybiAobmV3IERPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKHRleHQsIHR5cGUpOwogICAgICAgIH0pOwogICAgICB9OwogICAgfQoKICAgIHZhciB4bWwgPSBwYXJzZXIoImFwcGxpY2F0aW9uL3htbCIpOwoKICAgIHZhciBodG1sJDEgPSBwYXJzZXIoInRleHQvaHRtbCIpOwoKICAgIHZhciBzdmcgPSBwYXJzZXIoImltYWdlL3N2Zyt4bWwiKTsKCiAgICBmdW5jdGlvbiBjZW50ZXIkMSh4LCB5KSB7CiAgICAgIHZhciBub2RlczsKCiAgICAgIGlmICh4ID09IG51bGwpIHggPSAwOwogICAgICBpZiAoeSA9PSBudWxsKSB5ID0gMDsKCiAgICAgIGZ1bmN0aW9uIGZvcmNlKCkgewogICAgICAgIHZhciBpLAogICAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICBzeCA9IDAsCiAgICAgICAgICAgIHN5ID0gMDsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgbm9kZSA9IG5vZGVzW2ldLCBzeCArPSBub2RlLngsIHN5ICs9IG5vZGUueTsKICAgICAgICB9CgogICAgICAgIGZvciAoc3ggPSBzeCAvIG4gLSB4LCBzeSA9IHN5IC8gbiAtIHksIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueCAtPSBzeCwgbm9kZS55IC09IHN5OwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBub2RlcyA9IF87CiAgICAgIH07CgogICAgICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArXywgZm9yY2UpIDogeDsKICAgICAgfTsKCiAgICAgIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9ICtfLCBmb3JjZSkgOiB5OwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDcoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gamlnZ2xlKCkgewogICAgICByZXR1cm4gKE1hdGgucmFuZG9tKCkgLSAwLjUpICogMWUtNjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX2FkZChkKSB7CiAgICAgIHZhciB4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSwKICAgICAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpOwogICAgICByZXR1cm4gYWRkKHRoaXMuY292ZXIoeCwgeSksIHgsIHksIGQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZCh0cmVlLCB4LCB5LCBkKSB7CiAgICAgIGlmIChpc05hTih4KSB8fCBpc05hTih5KSkgcmV0dXJuIHRyZWU7IC8vIGlnbm9yZSBpbnZhbGlkIHBvaW50cwoKICAgICAgdmFyIHBhcmVudCwKICAgICAgICAgIG5vZGUgPSB0cmVlLl9yb290LAogICAgICAgICAgbGVhZiA9IHtkYXRhOiBkfSwKICAgICAgICAgIHgwID0gdHJlZS5feDAsCiAgICAgICAgICB5MCA9IHRyZWUuX3kwLAogICAgICAgICAgeDEgPSB0cmVlLl94MSwKICAgICAgICAgIHkxID0gdHJlZS5feTEsCiAgICAgICAgICB4bSwKICAgICAgICAgIHltLAogICAgICAgICAgeHAsCiAgICAgICAgICB5cCwKICAgICAgICAgIHJpZ2h0LAogICAgICAgICAgYm90dG9tLAogICAgICAgICAgaSwKICAgICAgICAgIGo7CgogICAgICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuCiAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlOwoKICAgICAgLy8gRmluZCB0aGUgZXhpc3RpbmcgbGVhZiBmb3IgdGhlIG5ldyBwb2ludCwgb3IgYWRkIGl0LgogICAgICB3aGlsZSAobm9kZS5sZW5ndGgpIHsKICAgICAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07CiAgICAgICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsKICAgICAgICBpZiAocGFyZW50ID0gbm9kZSwgIShub2RlID0gbm9kZVtpID0gYm90dG9tIDw8IDEgfCByaWdodF0pKSByZXR1cm4gcGFyZW50W2ldID0gbGVhZiwgdHJlZTsKICAgICAgfQoKICAgICAgLy8gSXMgdGhlIG5ldyBwb2ludCBpcyBleGFjdGx5IGNvaW5jaWRlbnQgd2l0aCB0aGUgZXhpc3RpbmcgcG9pbnQ/CiAgICAgIHhwID0gK3RyZWUuX3guY2FsbChudWxsLCBub2RlLmRhdGEpOwogICAgICB5cCA9ICt0cmVlLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKTsKICAgICAgaWYgKHggPT09IHhwICYmIHkgPT09IHlwKSByZXR1cm4gbGVhZi5uZXh0ID0gbm9kZSwgcGFyZW50ID8gcGFyZW50W2ldID0gbGVhZiA6IHRyZWUuX3Jvb3QgPSBsZWFmLCB0cmVlOwoKICAgICAgLy8gT3RoZXJ3aXNlLCBzcGxpdCB0aGUgbGVhZiBub2RlIHVudGlsIHRoZSBvbGQgYW5kIG5ldyBwb2ludCBhcmUgc2VwYXJhdGVkLgogICAgICBkbyB7CiAgICAgICAgcGFyZW50ID0gcGFyZW50ID8gcGFyZW50W2ldID0gbmV3IEFycmF5KDQpIDogdHJlZS5fcm9vdCA9IG5ldyBBcnJheSg0KTsKICAgICAgICBpZiAocmlnaHQgPSB4ID49ICh4bSA9ICh4MCArIHgxKSAvIDIpKSB4MCA9IHhtOyBlbHNlIHgxID0geG07CiAgICAgICAgaWYgKGJvdHRvbSA9IHkgPj0gKHltID0gKHkwICsgeTEpIC8gMikpIHkwID0geW07IGVsc2UgeTEgPSB5bTsKICAgICAgfSB3aGlsZSAoKGkgPSBib3R0b20gPDwgMSB8IHJpZ2h0KSA9PT0gKGogPSAoeXAgPj0geW0pIDw8IDEgfCAoeHAgPj0geG0pKSk7CiAgICAgIHJldHVybiBwYXJlbnRbal0gPSBub2RlLCBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZEFsbChkYXRhKSB7CiAgICAgIHZhciBkLCBpLCBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICB4LAogICAgICAgICAgeSwKICAgICAgICAgIHh6ID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgeXogPSBuZXcgQXJyYXkobiksCiAgICAgICAgICB4MCA9IEluZmluaXR5LAogICAgICAgICAgeTAgPSBJbmZpbml0eSwKICAgICAgICAgIHgxID0gLUluZmluaXR5LAogICAgICAgICAgeTEgPSAtSW5maW5pdHk7CgogICAgICAvLyBDb21wdXRlIHRoZSBwb2ludHMgYW5kIHRoZWlyIGV4dGVudC4KICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkID0gZGF0YVtpXSkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgY29udGludWU7CiAgICAgICAgeHpbaV0gPSB4OwogICAgICAgIHl6W2ldID0geTsKICAgICAgICBpZiAoeCA8IHgwKSB4MCA9IHg7CiAgICAgICAgaWYgKHggPiB4MSkgeDEgPSB4OwogICAgICAgIGlmICh5IDwgeTApIHkwID0geTsKICAgICAgICBpZiAoeSA+IHkxKSB5MSA9IHk7CiAgICAgIH0KCiAgICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gKHZhbGlkKSBwb2ludHMsIGFib3J0LgogICAgICBpZiAoeDAgPiB4MSB8fCB5MCA+IHkxKSByZXR1cm4gdGhpczsKCiAgICAgIC8vIEV4cGFuZCB0aGUgdHJlZSB0byBjb3ZlciB0aGUgbmV3IHBvaW50cy4KICAgICAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVyKHgxLCB5MSk7CgogICAgICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBhZGQodGhpcywgeHpbaV0sIHl6W2ldLCBkYXRhW2ldKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9jb3Zlcih4LCB5KSB7CiAgICAgIGlmIChpc05hTih4ID0gK3gpIHx8IGlzTmFOKHkgPSAreSkpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHMKCiAgICAgIHZhciB4MCA9IHRoaXMuX3gwLAogICAgICAgICAgeTAgPSB0aGlzLl95MCwKICAgICAgICAgIHgxID0gdGhpcy5feDEsCiAgICAgICAgICB5MSA9IHRoaXMuX3kxOwoKICAgICAgLy8gSWYgdGhlIHF1YWR0cmVlIGhhcyBubyBleHRlbnQsIGluaXRpYWxpemUgdGhlbS4KICAgICAgLy8gSW50ZWdlciBleHRlbnQgYXJlIG5lY2Vzc2FyeSBzbyB0aGF0IGlmIHdlIGxhdGVyIGRvdWJsZSB0aGUgZXh0ZW50LAogICAgICAvLyB0aGUgZXhpc3RpbmcgcXVhZHJhbnQgYm91bmRhcmllcyBkb27igJl0IGNoYW5nZSBkdWUgdG8gZmxvYXRpbmcgcG9pbnQgZXJyb3IhCiAgICAgIGlmIChpc05hTih4MCkpIHsKICAgICAgICB4MSA9ICh4MCA9IE1hdGguZmxvb3IoeCkpICsgMTsKICAgICAgICB5MSA9ICh5MCA9IE1hdGguZmxvb3IoeSkpICsgMTsKICAgICAgfQoKICAgICAgLy8gT3RoZXJ3aXNlLCBkb3VibGUgcmVwZWF0ZWRseSB0byBjb3Zlci4KICAgICAgZWxzZSB7CiAgICAgICAgdmFyIHogPSB4MSAtIHgwLAogICAgICAgICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgICAgICAgcGFyZW50LAogICAgICAgICAgICBpOwoKICAgICAgICB3aGlsZSAoeDAgPiB4IHx8IHggPj0geDEgfHwgeTAgPiB5IHx8IHkgPj0geTEpIHsKICAgICAgICAgIGkgPSAoeSA8IHkwKSA8PCAxIHwgKHggPCB4MCk7CiAgICAgICAgICBwYXJlbnQgPSBuZXcgQXJyYXkoNCksIHBhcmVudFtpXSA9IG5vZGUsIG5vZGUgPSBwYXJlbnQsIHogKj0gMjsKICAgICAgICAgIHN3aXRjaCAoaSkgewogICAgICAgICAgICBjYXNlIDA6IHgxID0geDAgKyB6LCB5MSA9IHkwICsgejsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMTogeDAgPSB4MSAtIHosIHkxID0geTAgKyB6OyBicmVhazsKICAgICAgICAgICAgY2FzZSAyOiB4MSA9IHgwICsgeiwgeTAgPSB5MSAtIHo7IGJyZWFrOwogICAgICAgICAgICBjYXNlIDM6IHgwID0geDEgLSB6LCB5MCA9IHkxIC0gejsgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7CiAgICAgIH0KCiAgICAgIHRoaXMuX3gwID0geDA7CiAgICAgIHRoaXMuX3kwID0geTA7CiAgICAgIHRoaXMuX3gxID0geDE7CiAgICAgIHRoaXMuX3kxID0geTE7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfZGF0YSgpIHsKICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgdGhpcy52aXNpdChmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gZGF0YS5wdXNoKG5vZGUuZGF0YSk7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KQogICAgICB9KTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9leHRlbnQoXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmNvdmVyKCtfWzBdWzBdLCArX1swXVsxXSkuY292ZXIoK19bMV1bMF0sICtfWzFdWzFdKQogICAgICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTsKICAgIH0KCiAgICBmdW5jdGlvbiBRdWFkKG5vZGUsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIHRoaXMubm9kZSA9IG5vZGU7CiAgICAgIHRoaXMueDAgPSB4MDsKICAgICAgdGhpcy55MCA9IHkwOwogICAgICB0aGlzLngxID0geDE7CiAgICAgIHRoaXMueTEgPSB5MTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX2ZpbmQoeCwgeSwgcmFkaXVzKSB7CiAgICAgIHZhciBkYXRhLAogICAgICAgICAgeDAgPSB0aGlzLl94MCwKICAgICAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgICAgICB4MSwKICAgICAgICAgIHkxLAogICAgICAgICAgeDIsCiAgICAgICAgICB5MiwKICAgICAgICAgIHgzID0gdGhpcy5feDEsCiAgICAgICAgICB5MyA9IHRoaXMuX3kxLAogICAgICAgICAgcXVhZHMgPSBbXSwKICAgICAgICAgIG5vZGUgPSB0aGlzLl9yb290LAogICAgICAgICAgcSwKICAgICAgICAgIGk7CgogICAgICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZChub2RlLCB4MCwgeTAsIHgzLCB5MykpOwogICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICBlbHNlIHsKICAgICAgICB4MCA9IHggLSByYWRpdXMsIHkwID0geSAtIHJhZGl1czsKICAgICAgICB4MyA9IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1czsKICAgICAgICByYWRpdXMgKj0gcmFkaXVzOwogICAgICB9CgogICAgICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CgogICAgICAgIC8vIFN0b3Agc2VhcmNoaW5nIGlmIHRoaXMgcXVhZHJhbnQgY2Fu4oCZdCBjb250YWluIGEgY2xvc2VyIG5vZGUuCiAgICAgICAgaWYgKCEobm9kZSA9IHEubm9kZSkKICAgICAgICAgICAgfHwgKHgxID0gcS54MCkgPiB4MwogICAgICAgICAgICB8fCAoeTEgPSBxLnkwKSA+IHkzCiAgICAgICAgICAgIHx8ICh4MiA9IHEueDEpIDwgeDAKICAgICAgICAgICAgfHwgKHkyID0gcS55MSkgPCB5MCkgY29udGludWU7CgogICAgICAgIC8vIEJpc2VjdCB0aGUgY3VycmVudCBxdWFkcmFudC4KICAgICAgICBpZiAobm9kZS5sZW5ndGgpIHsKICAgICAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsCiAgICAgICAgICAgICAgeW0gPSAoeTEgKyB5MikgLyAyOwoKICAgICAgICAgIHF1YWRzLnB1c2goCiAgICAgICAgICAgIG5ldyBRdWFkKG5vZGVbM10sIHhtLCB5bSwgeDIsIHkyKSwKICAgICAgICAgICAgbmV3IFF1YWQobm9kZVsyXSwgeDEsIHltLCB4bSwgeTIpLAogICAgICAgICAgICBuZXcgUXVhZChub2RlWzFdLCB4bSwgeTEsIHgyLCB5bSksCiAgICAgICAgICAgIG5ldyBRdWFkKG5vZGVbMF0sIHgxLCB5MSwgeG0sIHltKQogICAgICAgICAgKTsKCiAgICAgICAgICAvLyBWaXNpdCB0aGUgY2xvc2VzdCBxdWFkcmFudCBmaXJzdC4KICAgICAgICAgIGlmIChpID0gKHkgPj0geW0pIDw8IDEgfCAoeCA+PSB4bSkpIHsKICAgICAgICAgICAgcSA9IHF1YWRzW3F1YWRzLmxlbmd0aCAtIDFdOwogICAgICAgICAgICBxdWFkc1txdWFkcy5sZW5ndGggLSAxXSA9IHF1YWRzW3F1YWRzLmxlbmd0aCAtIDEgLSBpXTsKICAgICAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldID0gcTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIFZpc2l0IHRoaXMgcG9pbnQuIChWaXNpdGluZyBjb2luY2lkZW50IHBvaW50cyBpc27igJl0IG5lY2Vzc2FyeSEpCiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgZHggPSB4IC0gK3RoaXMuX3guY2FsbChudWxsLCBub2RlLmRhdGEpLAogICAgICAgICAgICAgIGR5ID0geSAtICt0aGlzLl95LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICAgICAgaWYgKGQyIDwgcmFkaXVzKSB7CiAgICAgICAgICAgIHZhciBkID0gTWF0aC5zcXJ0KHJhZGl1cyA9IGQyKTsKICAgICAgICAgICAgeDAgPSB4IC0gZCwgeTAgPSB5IC0gZDsKICAgICAgICAgICAgeDMgPSB4ICsgZCwgeTMgPSB5ICsgZDsKICAgICAgICAgICAgZGF0YSA9IG5vZGUuZGF0YTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBkYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfcmVtb3ZlKGQpIHsKICAgICAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQpKSB8fCBpc05hTih5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKSkpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHMKCiAgICAgIHZhciBwYXJlbnQsCiAgICAgICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgICAgIHJldGFpbmVyLAogICAgICAgICAgcHJldmlvdXMsCiAgICAgICAgICBuZXh0LAogICAgICAgICAgeDAgPSB0aGlzLl94MCwKICAgICAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgICAgICB4MSA9IHRoaXMuX3gxLAogICAgICAgICAgeTEgPSB0aGlzLl95MSwKICAgICAgICAgIHgsCiAgICAgICAgICB5LAogICAgICAgICAgeG0sCiAgICAgICAgICB5bSwKICAgICAgICAgIHJpZ2h0LAogICAgICAgICAgYm90dG9tLAogICAgICAgICAgaSwKICAgICAgICAgIGo7CgogICAgICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuCiAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRoaXM7CgogICAgICAvLyBGaW5kIHRoZSBsZWFmIG5vZGUgZm9yIHRoZSBwb2ludC4KICAgICAgLy8gV2hpbGUgZGVzY2VuZGluZywgYWxzbyByZXRhaW4gdGhlIGRlZXBlc3QgcGFyZW50IHdpdGggYSBub24tcmVtb3ZlZCBzaWJsaW5nLgogICAgICBpZiAobm9kZS5sZW5ndGgpIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07CiAgICAgICAgaWYgKCEocGFyZW50ID0gbm9kZSwgbm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKCFub2RlLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgaWYgKHBhcmVudFsoaSArIDEpICYgM10gfHwgcGFyZW50WyhpICsgMikgJiAzXSB8fCBwYXJlbnRbKGkgKyAzKSAmIDNdKSByZXRhaW5lciA9IHBhcmVudCwgaiA9IGk7CiAgICAgIH0KCiAgICAgIC8vIEZpbmQgdGhlIHBvaW50IHRvIHJlbW92ZS4KICAgICAgd2hpbGUgKG5vZGUuZGF0YSAhPT0gZCkgaWYgKCEocHJldmlvdXMgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0KSkgcmV0dXJuIHRoaXM7CiAgICAgIGlmIChuZXh0ID0gbm9kZS5uZXh0KSBkZWxldGUgbm9kZS5uZXh0OwoKICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQgcG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuCiAgICAgIGlmIChwcmV2aW91cykgcmV0dXJuIChuZXh0ID8gcHJldmlvdXMubmV4dCA9IG5leHQgOiBkZWxldGUgcHJldmlvdXMubmV4dCksIHRoaXM7CgogICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IHBvaW50LCByZW1vdmUgaXQuCiAgICAgIGlmICghcGFyZW50KSByZXR1cm4gdGhpcy5fcm9vdCA9IG5leHQsIHRoaXM7CgogICAgICAvLyBSZW1vdmUgdGhpcyBsZWFmLgogICAgICBuZXh0ID8gcGFyZW50W2ldID0gbmV4dCA6IGRlbGV0ZSBwYXJlbnRbaV07CgogICAgICAvLyBJZiB0aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZsdW91cyBwYXJlbnRzLgogICAgICBpZiAoKG5vZGUgPSBwYXJlbnRbMF0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbM10pCiAgICAgICAgICAmJiBub2RlID09PSAocGFyZW50WzNdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzBdKQogICAgICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7CiAgICAgICAgaWYgKHJldGFpbmVyKSByZXRhaW5lcltqXSA9IG5vZGU7CiAgICAgICAgZWxzZSB0aGlzLl9yb290ID0gbm9kZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlQWxsKGRhdGEpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBkYXRhLmxlbmd0aDsgaSA8IG47ICsraSkgdGhpcy5yZW1vdmUoZGF0YVtpXSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfcm9vdCgpIHsKICAgICAgcmV0dXJuIHRoaXMuX3Jvb3Q7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9zaXplKCkgewogICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmICghbm9kZS5sZW5ndGgpIGRvICsrc2l6ZTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpCiAgICAgIH0pOwogICAgICByZXR1cm4gc2l6ZTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3Zpc2l0KGNhbGxiYWNrKSB7CiAgICAgIHZhciBxdWFkcyA9IFtdLCBxLCBub2RlID0gdGhpcy5fcm9vdCwgY2hpbGQsIHgwLCB5MCwgeDEsIHkxOwogICAgICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZChub2RlLCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpOwogICAgICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CiAgICAgICAgaWYgKCFjYWxsYmFjayhub2RlID0gcS5ub2RlLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEpICYmIG5vZGUubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEsIHltKSk7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3Zpc2l0QWZ0ZXIoY2FsbGJhY2spIHsKICAgICAgdmFyIHF1YWRzID0gW10sIG5leHQgPSBbXSwgcTsKICAgICAgaWYgKHRoaXMuX3Jvb3QpIHF1YWRzLnB1c2gobmV3IFF1YWQodGhpcy5fcm9vdCwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTsKICAgICAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkgewogICAgICAgIHZhciBub2RlID0gcS5ub2RlOwogICAgICAgIGlmIChub2RlLmxlbmd0aCkgewogICAgICAgICAgdmFyIGNoaWxkLCB4MCA9IHEueDAsIHkwID0gcS55MCwgeDEgPSBxLngxLCB5MSA9IHEueTEsIHhtID0gKHgwICsgeDEpIC8gMiwgeW0gPSAoeTAgKyB5MSkgLyAyOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQoY2hpbGQsIHhtLCB5MCwgeDEsIHltKSk7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzJdKSBxdWFkcy5wdXNoKG5ldyBRdWFkKGNoaWxkLCB4MCwgeW0sIHhtLCB5MSkpOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZChjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTsKICAgICAgICB9CiAgICAgICAgbmV4dC5wdXNoKHEpOwogICAgICB9CiAgICAgIHdoaWxlIChxID0gbmV4dC5wb3AoKSkgewogICAgICAgIGNhbGxiYWNrKHEubm9kZSwgcS54MCwgcS55MCwgcS54MSwgcS55MSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFgkMShkKSB7CiAgICAgIHJldHVybiBkWzBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfeChfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFkkMShkKSB7CiAgICAgIHJldHVybiBkWzFdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfeShfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3kgPSBfLCB0aGlzKSA6IHRoaXMuX3k7CiAgICB9CgogICAgZnVuY3Rpb24gcXVhZHRyZWUobm9kZXMsIHgsIHkpIHsKICAgICAgdmFyIHRyZWUgPSBuZXcgUXVhZHRyZWUoeCA9PSBudWxsID8gZGVmYXVsdFgkMSA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZJDEgOiB5LCBOYU4sIE5hTiwgTmFOLCBOYU4pOwogICAgICByZXR1cm4gbm9kZXMgPT0gbnVsbCA/IHRyZWUgOiB0cmVlLmFkZEFsbChub2Rlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gUXVhZHRyZWUoeCwgeSwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdGhpcy5feCA9IHg7CiAgICAgIHRoaXMuX3kgPSB5OwogICAgICB0aGlzLl94MCA9IHgwOwogICAgICB0aGlzLl95MCA9IHkwOwogICAgICB0aGlzLl94MSA9IHgxOwogICAgICB0aGlzLl95MSA9IHkxOwogICAgICB0aGlzLl9yb290ID0gdW5kZWZpbmVkOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlYWZfY29weShsZWFmKSB7CiAgICAgIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5OwogICAgICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9OwogICAgICByZXR1cm4gY29weTsKICAgIH0KCiAgICB2YXIgdHJlZVByb3RvID0gcXVhZHRyZWUucHJvdG90eXBlID0gUXVhZHRyZWUucHJvdG90eXBlOwoKICAgIHRyZWVQcm90by5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb3B5ID0gbmV3IFF1YWR0cmVlKHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSwKICAgICAgICAgIG5vZGUgPSB0aGlzLl9yb290LAogICAgICAgICAgbm9kZXMsCiAgICAgICAgICBjaGlsZDsKCiAgICAgIGlmICghbm9kZSkgcmV0dXJuIGNvcHk7CgogICAgICBpZiAoIW5vZGUubGVuZ3RoKSByZXR1cm4gY29weS5fcm9vdCA9IGxlYWZfY29weShub2RlKSwgY29weTsKCiAgICAgIG5vZGVzID0gW3tzb3VyY2U6IG5vZGUsIHRhcmdldDogY29weS5fcm9vdCA9IG5ldyBBcnJheSg0KX1dOwogICAgICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGUuc291cmNlW2ldKSB7CiAgICAgICAgICAgIGlmIChjaGlsZC5sZW5ndGgpIG5vZGVzLnB1c2goe3NvdXJjZTogY2hpbGQsIHRhcmdldDogbm9kZS50YXJnZXRbaV0gPSBuZXcgQXJyYXkoNCl9KTsKICAgICAgICAgICAgZWxzZSBub2RlLnRhcmdldFtpXSA9IGxlYWZfY29weShjaGlsZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gY29weTsKICAgIH07CgogICAgdHJlZVByb3RvLmFkZCA9IHRyZWVfYWRkOwogICAgdHJlZVByb3RvLmFkZEFsbCA9IGFkZEFsbDsKICAgIHRyZWVQcm90by5jb3ZlciA9IHRyZWVfY292ZXI7CiAgICB0cmVlUHJvdG8uZGF0YSA9IHRyZWVfZGF0YTsKICAgIHRyZWVQcm90by5leHRlbnQgPSB0cmVlX2V4dGVudDsKICAgIHRyZWVQcm90by5maW5kID0gdHJlZV9maW5kOwogICAgdHJlZVByb3RvLnJlbW92ZSA9IHRyZWVfcmVtb3ZlOwogICAgdHJlZVByb3RvLnJlbW92ZUFsbCA9IHJlbW92ZUFsbDsKICAgIHRyZWVQcm90by5yb290ID0gdHJlZV9yb290OwogICAgdHJlZVByb3RvLnNpemUgPSB0cmVlX3NpemU7CiAgICB0cmVlUHJvdG8udmlzaXQgPSB0cmVlX3Zpc2l0OwogICAgdHJlZVByb3RvLnZpc2l0QWZ0ZXIgPSB0cmVlX3Zpc2l0QWZ0ZXI7CiAgICB0cmVlUHJvdG8ueCA9IHRyZWVfeDsKICAgIHRyZWVQcm90by55ID0gdHJlZV95OwoKICAgIGZ1bmN0aW9uIHgoZCkgewogICAgICByZXR1cm4gZC54ICsgZC52eDsKICAgIH0KCiAgICBmdW5jdGlvbiB5KGQpIHsKICAgICAgcmV0dXJuIGQueSArIGQudnk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sbGlkZShyYWRpdXMpIHsKICAgICAgdmFyIG5vZGVzLAogICAgICAgICAgcmFkaWksCiAgICAgICAgICBzdHJlbmd0aCA9IDEsCiAgICAgICAgICBpdGVyYXRpb25zID0gMTsKCiAgICAgIGlmICh0eXBlb2YgcmFkaXVzICE9PSAiZnVuY3Rpb24iKSByYWRpdXMgPSBjb25zdGFudCQ3KHJhZGl1cyA9PSBudWxsID8gMSA6ICtyYWRpdXMpOwoKICAgICAgZnVuY3Rpb24gZm9yY2UoKSB7CiAgICAgICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgICAgIHRyZWUsCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHhpLAogICAgICAgICAgICB5aSwKICAgICAgICAgICAgcmksCiAgICAgICAgICAgIHJpMjsKCiAgICAgICAgZm9yICh2YXIgayA9IDA7IGsgPCBpdGVyYXRpb25zOyArK2spIHsKICAgICAgICAgIHRyZWUgPSBxdWFkdHJlZShub2RlcywgeCwgeSkudmlzaXRBZnRlcihwcmVwYXJlKTsKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgICByaSA9IHJhZGlpW25vZGUuaW5kZXhdLCByaTIgPSByaSAqIHJpOwogICAgICAgICAgICB4aSA9IG5vZGUueCArIG5vZGUudng7CiAgICAgICAgICAgIHlpID0gbm9kZS55ICsgbm9kZS52eTsKICAgICAgICAgICAgdHJlZS52aXNpdChhcHBseSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBhcHBseShxdWFkLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICAgICAgdmFyIGRhdGEgPSBxdWFkLmRhdGEsIHJqID0gcXVhZC5yLCByID0gcmkgKyByajsKICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgIGlmIChkYXRhLmluZGV4ID4gbm9kZS5pbmRleCkgewogICAgICAgICAgICAgIHZhciB4ID0geGkgLSBkYXRhLnggLSBkYXRhLnZ4LAogICAgICAgICAgICAgICAgICB5ID0geWkgLSBkYXRhLnkgLSBkYXRhLnZ5LAogICAgICAgICAgICAgICAgICBsID0geCAqIHggKyB5ICogeTsKICAgICAgICAgICAgICBpZiAobCA8IHIgKiByKSB7CiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZSgpLCBsICs9IHggKiB4OwogICAgICAgICAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUoKSwgbCArPSB5ICogeTsKICAgICAgICAgICAgICAgIGwgPSAociAtIChsID0gTWF0aC5zcXJ0KGwpKSkgLyBsICogc3RyZW5ndGg7CiAgICAgICAgICAgICAgICBub2RlLnZ4ICs9ICh4ICo9IGwpICogKHIgPSAocmogKj0gcmopIC8gKHJpMiArIHJqKSk7CiAgICAgICAgICAgICAgICBub2RlLnZ5ICs9ICh5ICo9IGwpICogcjsKICAgICAgICAgICAgICAgIGRhdGEudnggLT0geCAqIChyID0gMSAtIHIpOwogICAgICAgICAgICAgICAgZGF0YS52eSAtPSB5ICogcjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHgwID4geGkgKyByIHx8IHgxIDwgeGkgLSByIHx8IHkwID4geWkgKyByIHx8IHkxIDwgeWkgLSByOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gcHJlcGFyZShxdWFkKSB7CiAgICAgICAgaWYgKHF1YWQuZGF0YSkgcmV0dXJuIHF1YWQuciA9IHJhZGlpW3F1YWQuZGF0YS5pbmRleF07CiAgICAgICAgZm9yICh2YXIgaSA9IHF1YWQuciA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGlmIChxdWFkW2ldICYmIHF1YWRbaV0uciA+IHF1YWQucikgewogICAgICAgICAgICBxdWFkLnIgPSBxdWFkW2ldLnI7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsKICAgICAgICByYWRpaSA9IG5ldyBBcnJheShuKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHJhZGlpW25vZGUuaW5kZXhdID0gK3JhZGl1cyhub2RlLCBpLCBub2Rlcyk7CiAgICAgIH0KCiAgICAgIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgbm9kZXMgPSBfOwogICAgICAgIGluaXRpYWxpemUoKTsKICAgICAgfTsKCiAgICAgIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaXRlcmF0aW9ucyA9ICtfLCBmb3JjZSkgOiBpdGVyYXRpb25zOwogICAgICB9OwoKICAgICAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSArXywgZm9yY2UpIDogc3RyZW5ndGg7CiAgICAgIH07CgogICAgICBmb3JjZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogcmFkaXVzOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGluZGV4KGQpIHsKICAgICAgcmV0dXJuIGQuaW5kZXg7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZChub2RlQnlJZCwgbm9kZUlkKSB7CiAgICAgIHZhciBub2RlID0gbm9kZUJ5SWQuZ2V0KG5vZGVJZCk7CiAgICAgIGlmICghbm9kZSkgdGhyb3cgbmV3IEVycm9yKCJtaXNzaW5nOiAiICsgbm9kZUlkKTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gbGluayhsaW5rcykgewogICAgICB2YXIgaWQgPSBpbmRleCwKICAgICAgICAgIHN0cmVuZ3RoID0gZGVmYXVsdFN0cmVuZ3RoLAogICAgICAgICAgc3RyZW5ndGhzLAogICAgICAgICAgZGlzdGFuY2UgPSBjb25zdGFudCQ3KDMwKSwKICAgICAgICAgIGRpc3RhbmNlcywKICAgICAgICAgIG5vZGVzLAogICAgICAgICAgY291bnQsCiAgICAgICAgICBiaWFzLAogICAgICAgICAgaXRlcmF0aW9ucyA9IDE7CgogICAgICBpZiAobGlua3MgPT0gbnVsbCkgbGlua3MgPSBbXTsKCiAgICAgIGZ1bmN0aW9uIGRlZmF1bHRTdHJlbmd0aChsaW5rKSB7CiAgICAgICAgcmV0dXJuIDEgLyBNYXRoLm1pbihjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0sIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICAgICAgZm9yICh2YXIgayA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGsgPCBpdGVyYXRpb25zOyArK2spIHsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBsaW5rLCBzb3VyY2UsIHRhcmdldCwgeCwgeSwgbCwgYjsgaSA8IG47ICsraSkgewogICAgICAgICAgICBsaW5rID0gbGlua3NbaV0sIHNvdXJjZSA9IGxpbmsuc291cmNlLCB0YXJnZXQgPSBsaW5rLnRhcmdldDsKICAgICAgICAgICAgeCA9IHRhcmdldC54ICsgdGFyZ2V0LnZ4IC0gc291cmNlLnggLSBzb3VyY2UudnggfHwgamlnZ2xlKCk7CiAgICAgICAgICAgIHkgPSB0YXJnZXQueSArIHRhcmdldC52eSAtIHNvdXJjZS55IC0gc291cmNlLnZ5IHx8IGppZ2dsZSgpOwogICAgICAgICAgICBsID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpOwogICAgICAgICAgICBsID0gKGwgLSBkaXN0YW5jZXNbaV0pIC8gbCAqIGFscGhhICogc3RyZW5ndGhzW2ldOwogICAgICAgICAgICB4ICo9IGwsIHkgKj0gbDsKICAgICAgICAgICAgdGFyZ2V0LnZ4IC09IHggKiAoYiA9IGJpYXNbaV0pOwogICAgICAgICAgICB0YXJnZXQudnkgLT0geSAqIGI7CiAgICAgICAgICAgIHNvdXJjZS52eCArPSB4ICogKGIgPSAxIC0gYik7CiAgICAgICAgICAgIHNvdXJjZS52eSArPSB5ICogYjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCwKICAgICAgICAgICAgbm9kZUJ5SWQgPSBtYXAkMShub2RlcywgaWQpLAogICAgICAgICAgICBsaW5rOwoKICAgICAgICBmb3IgKGkgPSAwLCBjb3VudCA9IG5ldyBBcnJheShuKTsgaSA8IG07ICsraSkgewogICAgICAgICAgbGluayA9IGxpbmtzW2ldLCBsaW5rLmluZGV4ID0gaTsKICAgICAgICAgIGlmICh0eXBlb2YgbGluay5zb3VyY2UgIT09ICJvYmplY3QiKSBsaW5rLnNvdXJjZSA9IGZpbmQobm9kZUJ5SWQsIGxpbmsuc291cmNlKTsKICAgICAgICAgIGlmICh0eXBlb2YgbGluay50YXJnZXQgIT09ICJvYmplY3QiKSBsaW5rLnRhcmdldCA9IGZpbmQobm9kZUJ5SWQsIGxpbmsudGFyZ2V0KTsKICAgICAgICAgIGNvdW50W2xpbmsuc291cmNlLmluZGV4XSA9IChjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gfHwgMCkgKyAxOwogICAgICAgICAgY291bnRbbGluay50YXJnZXQuaW5kZXhdID0gKGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSB8fCAwKSArIDE7CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwLCBiaWFzID0gbmV3IEFycmF5KG0pOyBpIDwgbTsgKytpKSB7CiAgICAgICAgICBsaW5rID0gbGlua3NbaV0sIGJpYXNbaV0gPSBjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gLyAoY291bnRbbGluay5zb3VyY2UuaW5kZXhdICsgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTsKICAgICAgICB9CgogICAgICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZVN0cmVuZ3RoKCk7CiAgICAgICAgZGlzdGFuY2VzID0gbmV3IEFycmF5KG0pLCBpbml0aWFsaXplRGlzdGFuY2UoKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZVN0cmVuZ3RoKCkgewogICAgICAgIGlmICghbm9kZXMpIHJldHVybjsKCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHN0cmVuZ3Roc1tpXSA9ICtzdHJlbmd0aChsaW5rc1tpXSwgaSwgbGlua3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZURpc3RhbmNlKCkgewogICAgICAgIGlmICghbm9kZXMpIHJldHVybjsKCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBsaW5rcy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGRpc3RhbmNlc1tpXSA9ICtkaXN0YW5jZShsaW5rc1tpXSwgaSwgbGlua3MpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBub2RlcyA9IF87CiAgICAgICAgaW5pdGlhbGl6ZSgpOwogICAgICB9OwoKICAgICAgZm9yY2UubGlua3MgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobGlua3MgPSBfLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IGxpbmtzOwogICAgICB9OwoKICAgICAgZm9yY2UuaWQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaWQgPSBfLCBmb3JjZSkgOiBpZDsKICAgICAgfTsKCiAgICAgIGZvcmNlLml0ZXJhdGlvbnMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaXRlcmF0aW9ucyA9ICtfLCBmb3JjZSkgOiBpdGVyYXRpb25zOwogICAgICB9OwoKICAgICAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwgaW5pdGlhbGl6ZVN0cmVuZ3RoKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogICAgICB9OwoKICAgICAgZm9yY2UuZGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2UgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCksIGZvcmNlKSA6IGRpc3RhbmNlOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHgkMShkKSB7CiAgICAgIHJldHVybiBkLng7CiAgICB9CgogICAgZnVuY3Rpb24geSQxKGQpIHsKICAgICAgcmV0dXJuIGQueTsKICAgIH0KCiAgICB2YXIgaW5pdGlhbFJhZGl1cyA9IDEwLAogICAgICAgIGluaXRpYWxBbmdsZSA9IE1hdGguUEkgKiAoMyAtIE1hdGguc3FydCg1KSk7CgogICAgZnVuY3Rpb24gc2ltdWxhdGlvbihub2RlcykgewogICAgICB2YXIgc2ltdWxhdGlvbiwKICAgICAgICAgIGFscGhhID0gMSwKICAgICAgICAgIGFscGhhTWluID0gMC4wMDEsCiAgICAgICAgICBhbHBoYURlY2F5ID0gMSAtIE1hdGgucG93KGFscGhhTWluLCAxIC8gMzAwKSwKICAgICAgICAgIGFscGhhVGFyZ2V0ID0gMCwKICAgICAgICAgIHZlbG9jaXR5RGVjYXkgPSAwLjYsCiAgICAgICAgICBmb3JjZXMgPSBtYXAkMSgpLAogICAgICAgICAgc3RlcHBlciA9IHRpbWVyKHN0ZXApLAogICAgICAgICAgZXZlbnQgPSBkaXNwYXRjaCgidGljayIsICJlbmQiKTsKCiAgICAgIGlmIChub2RlcyA9PSBudWxsKSBub2RlcyA9IFtdOwoKICAgICAgZnVuY3Rpb24gc3RlcCgpIHsKICAgICAgICB0aWNrKCk7CiAgICAgICAgZXZlbnQuY2FsbCgidGljayIsIHNpbXVsYXRpb24pOwogICAgICAgIGlmIChhbHBoYSA8IGFscGhhTWluKSB7CiAgICAgICAgICBzdGVwcGVyLnN0b3AoKTsKICAgICAgICAgIGV2ZW50LmNhbGwoImVuZCIsIHNpbXVsYXRpb24pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gdGljayhpdGVyYXRpb25zKSB7CiAgICAgICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7CgogICAgICAgIGlmIChpdGVyYXRpb25zID09PSB1bmRlZmluZWQpIGl0ZXJhdGlvbnMgPSAxOwoKICAgICAgICBmb3IgKHZhciBrID0gMDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTsKCiAgICAgICAgICBmb3JjZXMuZWFjaChmdW5jdGlvbiAoZm9yY2UpIHsKICAgICAgICAgICAgZm9yY2UoYWxwaGEpOwogICAgICAgICAgfSk7CgogICAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBub2RlID0gbm9kZXNbaV07CiAgICAgICAgICAgIGlmIChub2RlLmZ4ID09IG51bGwpIG5vZGUueCArPSBub2RlLnZ4ICo9IHZlbG9jaXR5RGVjYXk7CiAgICAgICAgICAgIGVsc2Ugbm9kZS54ID0gbm9kZS5meCwgbm9kZS52eCA9IDA7CiAgICAgICAgICAgIGlmIChub2RlLmZ5ID09IG51bGwpIG5vZGUueSArPSBub2RlLnZ5ICo9IHZlbG9jaXR5RGVjYXk7CiAgICAgICAgICAgIGVsc2Ugbm9kZS55ID0gbm9kZS5meSwgbm9kZS52eSA9IDA7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2ltdWxhdGlvbjsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZU5vZGVzKCkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUuaW5kZXggPSBpOwogICAgICAgICAgaWYgKG5vZGUuZnggIT0gbnVsbCkgbm9kZS54ID0gbm9kZS5meDsKICAgICAgICAgIGlmIChub2RlLmZ5ICE9IG51bGwpIG5vZGUueSA9IG5vZGUuZnk7CiAgICAgICAgICBpZiAoaXNOYU4obm9kZS54KSB8fCBpc05hTihub2RlLnkpKSB7CiAgICAgICAgICAgIHZhciByYWRpdXMgPSBpbml0aWFsUmFkaXVzICogTWF0aC5zcXJ0KGkpLCBhbmdsZSA9IGkgKiBpbml0aWFsQW5nbGU7CiAgICAgICAgICAgIG5vZGUueCA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTsKICAgICAgICAgICAgbm9kZS55ID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTmFOKG5vZGUudngpIHx8IGlzTmFOKG5vZGUudnkpKSB7CiAgICAgICAgICAgIG5vZGUudnggPSBub2RlLnZ5ID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSkgewogICAgICAgIGlmIChmb3JjZS5pbml0aWFsaXplKSBmb3JjZS5pbml0aWFsaXplKG5vZGVzKTsKICAgICAgICByZXR1cm4gZm9yY2U7CiAgICAgIH0KCiAgICAgIGluaXRpYWxpemVOb2RlcygpOwoKICAgICAgcmV0dXJuIHNpbXVsYXRpb24gPSB7CiAgICAgICAgdGljazogdGljaywKCiAgICAgICAgcmVzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc3RlcHBlci5yZXN0YXJ0KHN0ZXApLCBzaW11bGF0aW9uOwogICAgICAgIH0sCgogICAgICAgIHN0b3A6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHN0ZXBwZXIuc3RvcCgpLCBzaW11bGF0aW9uOwogICAgICAgIH0sCgogICAgICAgIG5vZGVzOiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlcyA9IF8sIGluaXRpYWxpemVOb2RlcygpLCBmb3JjZXMuZWFjaChpbml0aWFsaXplRm9yY2UpLCBzaW11bGF0aW9uKSA6IG5vZGVzOwogICAgICAgIH0sCgogICAgICAgIGFscGhhOiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhOwogICAgICAgIH0sCgogICAgICAgIGFscGhhTWluOiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYU1pbiA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhTWluOwogICAgICAgIH0sCgogICAgICAgIGFscGhhRGVjYXk6IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhRGVjYXkgPSArXywgc2ltdWxhdGlvbikgOiArYWxwaGFEZWNheTsKICAgICAgICB9LAoKICAgICAgICBhbHBoYVRhcmdldDogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFUYXJnZXQgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYVRhcmdldDsKICAgICAgICB9LAoKICAgICAgICB2ZWxvY2l0eURlY2F5OiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2ZWxvY2l0eURlY2F5ID0gMSAtIF8sIHNpbXVsYXRpb24pIDogMSAtIHZlbG9jaXR5RGVjYXk7CiAgICAgICAgfSwKCiAgICAgICAgZm9yY2U6IGZ1bmN0aW9uKG5hbWUsIF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICgoXyA9PSBudWxsID8gZm9yY2VzLnJlbW92ZShuYW1lKSA6IGZvcmNlcy5zZXQobmFtZSwgaW5pdGlhbGl6ZUZvcmNlKF8pKSksIHNpbXVsYXRpb24pIDogZm9yY2VzLmdldChuYW1lKTsKICAgICAgICB9LAoKICAgICAgICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHsKICAgICAgICAgIHZhciBpID0gMCwKICAgICAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgICAgIGR4LAogICAgICAgICAgICAgIGR5LAogICAgICAgICAgICAgIGQyLAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgY2xvc2VzdDsKCiAgICAgICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICAgICAgZWxzZSByYWRpdXMgKj0gcmFkaXVzOwoKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgICBkeCA9IHggLSBub2RlLng7CiAgICAgICAgICAgIGR5ID0geSAtIG5vZGUueTsKICAgICAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICAgICAgaWYgKGQyIDwgcmFkaXVzKSBjbG9zZXN0ID0gbm9kZSwgcmFkaXVzID0gZDI7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGNsb3Nlc3Q7CiAgICAgICAgfSwKCiAgICAgICAgb246IGZ1bmN0aW9uKG5hbWUsIF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1lKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWFueUJvZHkoKSB7CiAgICAgIHZhciBub2RlcywKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBhbHBoYSwKICAgICAgICAgIHN0cmVuZ3RoID0gY29uc3RhbnQkNygtMzApLAogICAgICAgICAgc3RyZW5ndGhzLAogICAgICAgICAgZGlzdGFuY2VNaW4yID0gMSwKICAgICAgICAgIGRpc3RhbmNlTWF4MiA9IEluZmluaXR5LAogICAgICAgICAgdGhldGEyID0gMC44MTsKCiAgICAgIGZ1bmN0aW9uIGZvcmNlKF8pIHsKICAgICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgdHJlZSA9IHF1YWR0cmVlKG5vZGVzLCB4JDEsIHkkMSkudmlzaXRBZnRlcihhY2N1bXVsYXRlKTsKICAgICAgICBmb3IgKGFscGhhID0gXywgaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgdHJlZS52aXNpdChhcHBseSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOwogICAgICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHN0cmVuZ3Roc1tub2RlLmluZGV4XSA9ICtzdHJlbmd0aChub2RlLCBpLCBub2Rlcyk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFjY3VtdWxhdGUocXVhZCkgewogICAgICAgIHZhciBzdHJlbmd0aCA9IDAsIHEsIGMsIHdlaWdodCA9IDAsIHgsIHksIGk7CgogICAgICAgIC8vIEZvciBpbnRlcm5hbCBub2RlcywgYWNjdW11bGF0ZSBmb3JjZXMgZnJvbSBjaGlsZCBxdWFkcmFudHMuCiAgICAgICAgaWYgKHF1YWQubGVuZ3RoKSB7CiAgICAgICAgICBmb3IgKHggPSB5ID0gaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgICAgaWYgKChxID0gcXVhZFtpXSkgJiYgKGMgPSBNYXRoLmFicyhxLnZhbHVlKSkpIHsKICAgICAgICAgICAgICBzdHJlbmd0aCArPSBxLnZhbHVlLCB3ZWlnaHQgKz0gYywgeCArPSBjICogcS54LCB5ICs9IGMgKiBxLnk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHF1YWQueCA9IHggLyB3ZWlnaHQ7CiAgICAgICAgICBxdWFkLnkgPSB5IC8gd2VpZ2h0OwogICAgICAgIH0KCiAgICAgICAgLy8gRm9yIGxlYWYgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY29pbmNpZGVudCBxdWFkcmFudHMuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICBxID0gcXVhZDsKICAgICAgICAgIHEueCA9IHEuZGF0YS54OwogICAgICAgICAgcS55ID0gcS5kYXRhLnk7CiAgICAgICAgICBkbyBzdHJlbmd0aCArPSBzdHJlbmd0aHNbcS5kYXRhLmluZGV4XTsKICAgICAgICAgIHdoaWxlIChxID0gcS5uZXh0KTsKICAgICAgICB9CgogICAgICAgIHF1YWQudmFsdWUgPSBzdHJlbmd0aDsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDEsIF8sIHgyKSB7CiAgICAgICAgaWYgKCFxdWFkLnZhbHVlKSByZXR1cm4gdHJ1ZTsKCiAgICAgICAgdmFyIHggPSBxdWFkLnggLSBub2RlLngsCiAgICAgICAgICAgIHkgPSBxdWFkLnkgLSBub2RlLnksCiAgICAgICAgICAgIHcgPSB4MiAtIHgxLAogICAgICAgICAgICBsID0geCAqIHggKyB5ICogeTsKCiAgICAgICAgLy8gQXBwbHkgdGhlIEJhcm5lcy1IdXQgYXBwcm94aW1hdGlvbiBpZiBwb3NzaWJsZS4KICAgICAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC4KICAgICAgICBpZiAodyAqIHcgLyB0aGV0YTIgPCBsKSB7CiAgICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWF4MikgewogICAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZSgpLCBsICs9IHggKiB4OwogICAgICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZSgpLCBsICs9IHkgKiB5OwogICAgICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTsKICAgICAgICAgICAgbm9kZS52eCArPSB4ICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDsKICAgICAgICAgICAgbm9kZS52eSArPSB5ICogcXVhZC52YWx1ZSAqIGFscGhhIC8gbDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBwcm9jZXNzIHBvaW50cyBkaXJlY3RseS4KICAgICAgICBlbHNlIGlmIChxdWFkLmxlbmd0aCB8fCBsID49IGRpc3RhbmNlTWF4MikgcmV0dXJuOwoKICAgICAgICAvLyBMaW1pdCBmb3JjZXMgZm9yIHZlcnkgY2xvc2Ugbm9kZXM7IHJhbmRvbWl6ZSBkaXJlY3Rpb24gaWYgY29pbmNpZGVudC4KICAgICAgICBpZiAocXVhZC5kYXRhICE9PSBub2RlIHx8IHF1YWQubmV4dCkgewogICAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUoKSwgbCArPSB4ICogeDsKICAgICAgICAgIGlmICh5ID09PSAwKSB5ID0gamlnZ2xlKCksIGwgKz0geSAqIHk7CiAgICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTsKICAgICAgICB9CgogICAgICAgIGRvIGlmIChxdWFkLmRhdGEgIT09IG5vZGUpIHsKICAgICAgICAgIHcgPSBzdHJlbmd0aHNbcXVhZC5kYXRhLmluZGV4XSAqIGFscGhhIC8gbDsKICAgICAgICAgIG5vZGUudnggKz0geCAqIHc7CiAgICAgICAgICBub2RlLnZ5ICs9IHkgKiB3OwogICAgICAgIH0gd2hpbGUgKHF1YWQgPSBxdWFkLm5leHQpOwogICAgICB9CgogICAgICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIG5vZGVzID0gXzsKICAgICAgICBpbml0aWFsaXplKCk7CiAgICAgIH07CgogICAgICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogICAgICB9OwoKICAgICAgZm9yY2UuZGlzdGFuY2VNaW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNaW4yID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1pbjIpOwogICAgICB9OwoKICAgICAgZm9yY2UuZGlzdGFuY2VNYXggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNYXgyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1heDIpOwogICAgICB9OwoKICAgICAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhldGEyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydCh0aGV0YTIpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhZGlhbChyYWRpdXMsIHgsIHkpIHsKICAgICAgdmFyIG5vZGVzLAogICAgICAgICAgc3RyZW5ndGggPSBjb25zdGFudCQ3KDAuMSksCiAgICAgICAgICBzdHJlbmd0aHMsCiAgICAgICAgICByYWRpdXNlczsKCiAgICAgIGlmICh0eXBlb2YgcmFkaXVzICE9PSAiZnVuY3Rpb24iKSByYWRpdXMgPSBjb25zdGFudCQ3KCtyYWRpdXMpOwogICAgICBpZiAoeCA9PSBudWxsKSB4ID0gMDsKICAgICAgaWYgKHkgPT0gbnVsbCkgeSA9IDA7CgogICAgICBmdW5jdGlvbiBmb3JjZShhbHBoYSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldLAogICAgICAgICAgICAgIGR4ID0gbm9kZS54IC0geCB8fCAxZS02LAogICAgICAgICAgICAgIGR5ID0gbm9kZS55IC0geSB8fCAxZS02LAogICAgICAgICAgICAgIHIgPSBNYXRoLnNxcnQoZHggKiBkeCArIGR5ICogZHkpLAogICAgICAgICAgICAgIGsgPSAocmFkaXVzZXNbaV0gLSByKSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhIC8gcjsKICAgICAgICAgIG5vZGUudnggKz0gZHggKiBrOwogICAgICAgICAgbm9kZS52eSArPSBkeSAqIGs7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDsKICAgICAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICAgICAgcmFkaXVzZXMgPSBuZXcgQXJyYXkobik7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgcmFkaXVzZXNbaV0gPSArcmFkaXVzKG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICAgICAgICBzdHJlbmd0aHNbaV0gPSBpc05hTihyYWRpdXNlc1tpXSkgPyAwIDogK3N0cmVuZ3RoKG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIG5vZGVzID0gXywgaW5pdGlhbGl6ZSgpOwogICAgICB9OwoKICAgICAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDsKICAgICAgfTsKCiAgICAgIGZvcmNlLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiByYWRpdXM7CiAgICAgIH07CgogICAgICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArXywgZm9yY2UpIDogeDsKICAgICAgfTsKCiAgICAgIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9ICtfLCBmb3JjZSkgOiB5OwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHgkMih4KSB7CiAgICAgIHZhciBzdHJlbmd0aCA9IGNvbnN0YW50JDcoMC4xKSwKICAgICAgICAgIG5vZGVzLAogICAgICAgICAgc3RyZW5ndGhzLAogICAgICAgICAgeHo7CgogICAgICBpZiAodHlwZW9mIHggIT09ICJmdW5jdGlvbiIpIHggPSBjb25zdGFudCQ3KHggPT0gbnVsbCA/IDAgOiAreCk7CgogICAgICBmdW5jdGlvbiBmb3JjZShhbHBoYSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnggKz0gKHh6W2ldIC0gbm9kZS54KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgICAgICBpZiAoIW5vZGVzKSByZXR1cm47CiAgICAgICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGg7CiAgICAgICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pOwogICAgICAgIHh6ID0gbmV3IEFycmF5KG4pOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHh6W2ldID0gK3gobm9kZXNbaV0sIGksIG5vZGVzKSkgPyAwIDogK3N0cmVuZ3RoKG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIG5vZGVzID0gXzsKICAgICAgICBpbml0aWFsaXplKCk7CiAgICAgIH07CgogICAgICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogICAgICB9OwoKICAgICAgZm9yY2UueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNygrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogeDsKICAgICAgfTsKCiAgICAgIHJldHVybiBmb3JjZTsKICAgIH0KCiAgICBmdW5jdGlvbiB5JDIoeSkgewogICAgICB2YXIgc3RyZW5ndGggPSBjb25zdGFudCQ3KDAuMSksCiAgICAgICAgICBub2RlcywKICAgICAgICAgIHN0cmVuZ3RocywKICAgICAgICAgIHl6OwoKICAgICAgaWYgKHR5cGVvZiB5ICE9PSAiZnVuY3Rpb24iKSB5ID0gY29uc3RhbnQkNyh5ID09IG51bGwgPyAwIDogK3kpOwoKICAgICAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLnZ5ICs9ICh5eltpXSAtIG5vZGUueSkgKiBzdHJlbmd0aHNbaV0gKiBhbHBoYTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoOwogICAgICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTsKICAgICAgICB5eiA9IG5ldyBBcnJheShuKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBzdHJlbmd0aHNbaV0gPSBpc05hTih5eltpXSA9ICt5KG5vZGVzW2ldLCBpLCBub2RlcykpID8gMCA6ICtzdHJlbmd0aChub2Rlc1tpXSwgaSwgbm9kZXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBub2RlcyA9IF87CiAgICAgICAgaW5pdGlhbGl6ZSgpOwogICAgICB9OwoKICAgICAgZm9yY2Uuc3RyZW5ndGggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RyZW5ndGggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ3KCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBzdHJlbmd0aDsKICAgICAgfTsKCiAgICAgIGZvcmNlLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDcoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHk7CiAgICAgIH07CgogICAgICByZXR1cm4gZm9yY2U7CiAgICB9CgogICAgLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aAogICAgLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuCiAgICAvLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5zIFsiMTIzIiwgMF0uCiAgICBmdW5jdGlvbiBmb3JtYXREZWNpbWFsKHgsIHApIHsKICAgICAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgwrFJbmZpbml0eQogICAgICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpOwoKICAgICAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXGRcLlxkK2VbLStdXGQrCiAgICAgIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxkZVstK11cZCsgKGUuZy4sIDFlKzMpLgogICAgICByZXR1cm4gWwogICAgICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsCiAgICAgICAgK3guc2xpY2UoaSArIDEpCiAgICAgIF07CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb25lbnQkMSh4KSB7CiAgICAgIHJldHVybiB4ID0gZm9ybWF0RGVjaW1hbChNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEdyb3VwKGdyb3VwaW5nLCB0aG91c2FuZHMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlLCB3aWR0aCkgewogICAgICAgIHZhciBpID0gdmFsdWUubGVuZ3RoLAogICAgICAgICAgICB0ID0gW10sCiAgICAgICAgICAgIGogPSAwLAogICAgICAgICAgICBnID0gZ3JvdXBpbmdbMF0sCiAgICAgICAgICAgIGxlbmd0aCA9IDA7CgogICAgICAgIHdoaWxlIChpID4gMCAmJiBnID4gMCkgewogICAgICAgICAgaWYgKGxlbmd0aCArIGcgKyAxID4gd2lkdGgpIGcgPSBNYXRoLm1heCgxLCB3aWR0aCAtIGxlbmd0aCk7CiAgICAgICAgICB0LnB1c2godmFsdWUuc3Vic3RyaW5nKGkgLT0gZywgaSArIGcpKTsKICAgICAgICAgIGlmICgobGVuZ3RoICs9IGcgKyAxKSA+IHdpZHRoKSBicmVhazsKICAgICAgICAgIGcgPSBncm91cGluZ1tqID0gKGogKyAxKSAlIGdyb3VwaW5nLmxlbmd0aF07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdC5yZXZlcnNlKCkuam9pbih0aG91c2FuZHMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE51bWVyYWxzKG51bWVyYWxzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKC9bMC05XS9nLCBmdW5jdGlvbihpKSB7CiAgICAgICAgICByZXR1cm4gbnVtZXJhbHNbK2ldOwogICAgICAgIH0pOwogICAgICB9OwogICAgfQoKICAgIC8vIFtbZmlsbF1hbGlnbl1bc2lnbl1bc3ltYm9sXVswXVt3aWR0aF1bLF1bLnByZWNpc2lvbl1bfl1bdHlwZV0KICAgIHZhciByZSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pOwoKICAgIGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHsKICAgICAgaWYgKCEobWF0Y2ggPSByZS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiICsgc3BlY2lmaWVyKTsKICAgICAgdmFyIG1hdGNoOwogICAgICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllcih7CiAgICAgICAgZmlsbDogbWF0Y2hbMV0sCiAgICAgICAgYWxpZ246IG1hdGNoWzJdLAogICAgICAgIHNpZ246IG1hdGNoWzNdLAogICAgICAgIHN5bWJvbDogbWF0Y2hbNF0sCiAgICAgICAgemVybzogbWF0Y2hbNV0sCiAgICAgICAgd2lkdGg6IG1hdGNoWzZdLAogICAgICAgIGNvbW1hOiBtYXRjaFs3XSwKICAgICAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLAogICAgICAgIHRyaW06IG1hdGNoWzldLAogICAgICAgIHR5cGU6IG1hdGNoWzEwXQogICAgICB9KTsKICAgIH0KCiAgICBmb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZTsgLy8gaW5zdGFuY2VvZgoKICAgIGZ1bmN0aW9uIEZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpIHsKICAgICAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/ICIgIiA6IHNwZWNpZmllci5maWxsICsgIiI7CiAgICAgIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/ICI+IiA6IHNwZWNpZmllci5hbGlnbiArICIiOwogICAgICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gIi0iIDogc3BlY2lmaWVyLnNpZ24gKyAiIjsKICAgICAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyAiIiA6IHNwZWNpZmllci5zeW1ib2wgKyAiIjsKICAgICAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybzsKICAgICAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDsKICAgICAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hOwogICAgICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uOwogICAgICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltOwogICAgICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gIiIgOiBzcGVjaWZpZXIudHlwZSArICIiOwogICAgfQoKICAgIEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIHRoaXMuZmlsbAogICAgICAgICAgKyB0aGlzLmFsaWduCiAgICAgICAgICArIHRoaXMuc2lnbgogICAgICAgICAgKyB0aGlzLnN5bWJvbAogICAgICAgICAgKyAodGhpcy56ZXJvID8gIjAiIDogIiIpCiAgICAgICAgICArICh0aGlzLndpZHRoID09PSB1bmRlZmluZWQgPyAiIiA6IE1hdGgubWF4KDEsIHRoaXMud2lkdGggfCAwKSkKICAgICAgICAgICsgKHRoaXMuY29tbWEgPyAiLCIgOiAiIikKICAgICAgICAgICsgKHRoaXMucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyAiIiA6ICIuIiArIE1hdGgubWF4KDAsIHRoaXMucHJlY2lzaW9uIHwgMCkpCiAgICAgICAgICArICh0aGlzLnRyaW0gPyAifiIgOiAiIikKICAgICAgICAgICsgdGhpcy50eXBlOwogICAgfTsKCiAgICAvLyBUcmltcyBpbnNpZ25pZmljYW50IHplcm9zLCBlLmcuLCByZXBsYWNlcyAxLjIwMDBrIHdpdGggMS4yay4KICAgIGZ1bmN0aW9uIGZvcm1hdFRyaW0ocykgewogICAgICBvdXQ6IGZvciAodmFyIG4gPSBzLmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgc3dpdGNoIChzW2ldKSB7CiAgICAgICAgICBjYXNlICIuIjogaTAgPSBpMSA9IGk7IGJyZWFrOwogICAgICAgICAgY2FzZSAiMCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrOwogICAgICAgICAgZGVmYXVsdDogaWYgKCErc1tpXSkgYnJlYWsgb3V0OyBpZiAoaTAgPiAwKSBpMCA9IDA7IGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gaTAgPiAwID8gcy5zbGljZSgwLCBpMCkgKyBzLnNsaWNlKGkxICsgMSkgOiBzOwogICAgfQoKICAgIHZhciBwcmVmaXhFeHBvbmVudDsKCiAgICBmdW5jdGlvbiBmb3JtYXRQcmVmaXhBdXRvKHgsIHApIHsKICAgICAgdmFyIGQgPSBmb3JtYXREZWNpbWFsKHgsIHApOwogICAgICBpZiAoIWQpIHJldHVybiB4ICsgIiI7CiAgICAgIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgICAgICBleHBvbmVudCA9IGRbMV0sCiAgICAgICAgICBpID0gZXhwb25lbnQgLSAocHJlZml4RXhwb25lbnQgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCAvIDMpKSkgKiAzKSArIDEsCiAgICAgICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoOwogICAgICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50CiAgICAgICAgICA6IGkgPiBuID8gY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoaSAtIG4gKyAxKS5qb2luKCIwIikKICAgICAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpCiAgICAgICAgICA6ICIwLiIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oIjAiKSArIGZvcm1hdERlY2ltYWwoeCwgTWF0aC5tYXgoMCwgcCArIGkgLSAxKSlbMF07IC8vIGxlc3MgdGhhbiAxeSEKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRSb3VuZGVkKHgsIHApIHsKICAgICAgdmFyIGQgPSBmb3JtYXREZWNpbWFsKHgsIHApOwogICAgICBpZiAoIWQpIHJldHVybiB4ICsgIiI7CiAgICAgIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgICAgICBleHBvbmVudCA9IGRbMV07CiAgICAgIHJldHVybiBleHBvbmVudCA8IDAgPyAiMC4iICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbigiMCIpICsgY29lZmZpY2llbnQKICAgICAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSkKICAgICAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKCIwIik7CiAgICB9CgogICAgdmFyIGZvcm1hdFR5cGVzID0gewogICAgICAiJSI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuICh4ICogMTAwKS50b0ZpeGVkKHApOyB9LAogICAgICAiYiI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMik7IH0sCiAgICAgICJjIjogZnVuY3Rpb24oeCkgeyByZXR1cm4geCArICIiOyB9LAogICAgICAiZCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTApOyB9LAogICAgICAiZSI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9FeHBvbmVudGlhbChwKTsgfSwKICAgICAgImYiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRml4ZWQocCk7IH0sCiAgICAgICJnIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b1ByZWNpc2lvbihwKTsgfSwKICAgICAgIm8iOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDgpOyB9LAogICAgICAicCI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIGZvcm1hdFJvdW5kZWQoeCAqIDEwMCwgcCk7IH0sCiAgICAgICJyIjogZm9ybWF0Um91bmRlZCwKICAgICAgInMiOiBmb3JtYXRQcmVmaXhBdXRvLAogICAgICAiWCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH0sCiAgICAgICJ4IjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNik7IH0KICAgIH07CgogICAgZnVuY3Rpb24gaWRlbnRpdHkkMyh4KSB7CiAgICAgIHJldHVybiB4OwogICAgfQoKICAgIHZhciBtYXAkMiA9IEFycmF5LnByb3RvdHlwZS5tYXAsCiAgICAgICAgcHJlZml4ZXMgPSBbInkiLCJ6IiwiYSIsImYiLCJwIiwibiIsIsK1IiwibSIsIiIsImsiLCJNIiwiRyIsIlQiLCJQIiwiRSIsIloiLCJZIl07CgogICAgZnVuY3Rpb24gZm9ybWF0TG9jYWxlKGxvY2FsZSkgewogICAgICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSQzIDogZm9ybWF0R3JvdXAobWFwJDIuY2FsbChsb2NhbGUuZ3JvdXBpbmcsIE51bWJlciksIGxvY2FsZS50aG91c2FuZHMgKyAiIiksCiAgICAgICAgICBjdXJyZW5jeVByZWZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gIiIgOiBsb2NhbGUuY3VycmVuY3lbMF0gKyAiIiwKICAgICAgICAgIGN1cnJlbmN5U3VmZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyAiIiA6IGxvY2FsZS5jdXJyZW5jeVsxXSArICIiLAogICAgICAgICAgZGVjaW1hbCA9IGxvY2FsZS5kZWNpbWFsID09PSB1bmRlZmluZWQgPyAiLiIgOiBsb2NhbGUuZGVjaW1hbCArICIiLAogICAgICAgICAgbnVtZXJhbHMgPSBsb2NhbGUubnVtZXJhbHMgPT09IHVuZGVmaW5lZCA/IGlkZW50aXR5JDMgOiBmb3JtYXROdW1lcmFscyhtYXAkMi5jYWxsKGxvY2FsZS5udW1lcmFscywgU3RyaW5nKSksCiAgICAgICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgPT09IHVuZGVmaW5lZCA/ICIlIiA6IGxvY2FsZS5wZXJjZW50ICsgIiIsCiAgICAgICAgICBtaW51cyA9IGxvY2FsZS5taW51cyA9PT0gdW5kZWZpbmVkID8gIi0iIDogbG9jYWxlLm1pbnVzICsgIiIsCiAgICAgICAgICBuYW4gPSBsb2NhbGUubmFuID09PSB1bmRlZmluZWQgPyAiTmFOIiA6IGxvY2FsZS5uYW4gKyAiIjsKCiAgICAgIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIpIHsKICAgICAgICBzcGVjaWZpZXIgPSBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKTsKCiAgICAgICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCwKICAgICAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sCiAgICAgICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwKICAgICAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCwKICAgICAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLAogICAgICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCwKICAgICAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsCiAgICAgICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sCiAgICAgICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSwKICAgICAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlOwoKICAgICAgICAvLyBUaGUgIm4iIHR5cGUgaXMgYW4gYWxpYXMgZm9yICIsZyIuCiAgICAgICAgaWYgKHR5cGUgPT09ICJuIikgY29tbWEgPSB0cnVlLCB0eXBlID0gImciOwoKICAgICAgICAvLyBUaGUgIiIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciAiLjEyfmciLgogICAgICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlc1t0eXBlXSkgcHJlY2lzaW9uID09PSB1bmRlZmluZWQgJiYgKHByZWNpc2lvbiA9IDEyKSwgdHJpbSA9IHRydWUsIHR5cGUgPSAiZyI7CgogICAgICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLgogICAgICAgIGlmICh6ZXJvIHx8IChmaWxsID09PSAiMCIgJiYgYWxpZ24gPT09ICI9IikpIHplcm8gPSB0cnVlLCBmaWxsID0gIjAiLCBhbGlnbiA9ICI9IjsKCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguCiAgICAgICAgLy8gRm9yIFNJLXByZWZpeCwgdGhlIHN1ZmZpeCBpcyBsYXppbHkgY29tcHV0ZWQuCiAgICAgICAgdmFyIHByZWZpeCA9IHN5bWJvbCA9PT0gIiQiID8gY3VycmVuY3lQcmVmaXggOiBzeW1ib2wgPT09ICIjIiAmJiAvW2JveFhdLy50ZXN0KHR5cGUpID8gIjAiICsgdHlwZS50b0xvd2VyQ2FzZSgpIDogIiIsCiAgICAgICAgICAgIHN1ZmZpeCA9IHN5bWJvbCA9PT0gIiQiID8gY3VycmVuY3lTdWZmaXggOiAvWyVwXS8udGVzdCh0eXBlKSA/IHBlcmNlbnQgOiAiIjsKCiAgICAgICAgLy8gV2hhdCBmb3JtYXQgZnVuY3Rpb24gc2hvdWxkIHdlIHVzZT8KICAgICAgICAvLyBJcyB0aGlzIGFuIGludGVnZXIgdHlwZT8KICAgICAgICAvLyBDYW4gdGhpcyB0eXBlIGdlbmVyYXRlIGV4cG9uZW50aWFsIG5vdGF0aW9uPwogICAgICAgIHZhciBmb3JtYXRUeXBlID0gZm9ybWF0VHlwZXNbdHlwZV0sCiAgICAgICAgICAgIG1heWJlU3VmZml4ID0gL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7CgogICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCwKICAgICAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLgogICAgICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS4KICAgICAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uCiAgICAgICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyA2CiAgICAgICAgICAgIDogL1tncHJzXS8udGVzdCh0eXBlKSA/IE1hdGgubWF4KDEsIE1hdGgubWluKDIxLCBwcmVjaXNpb24pKQogICAgICAgICAgICA6IE1hdGgubWF4KDAsIE1hdGgubWluKDIwLCBwcmVjaXNpb24pKTsKCiAgICAgICAgZnVuY3Rpb24gZm9ybWF0KHZhbHVlKSB7CiAgICAgICAgICB2YXIgdmFsdWVQcmVmaXggPSBwcmVmaXgsCiAgICAgICAgICAgICAgdmFsdWVTdWZmaXggPSBzdWZmaXgsCiAgICAgICAgICAgICAgaSwgbiwgYzsKCiAgICAgICAgICBpZiAodHlwZSA9PT0gImMiKSB7CiAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gZm9ybWF0VHlwZSh2YWx1ZSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgdmFsdWUgPSAiIjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlID0gK3ZhbHVlOwoKICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBzaWduLiAtMCBpcyBub3QgbGVzcyB0aGFuIDAsIGJ1dCAxIC8gLTAgaXMhCiAgICAgICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwIHx8IDEgLyB2YWx1ZSA8IDA7CgogICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuCiAgICAgICAgICAgIHZhbHVlID0gaXNOYU4odmFsdWUpID8gbmFuIDogZm9ybWF0VHlwZShNYXRoLmFicyh2YWx1ZSksIHByZWNpc2lvbik7CgogICAgICAgICAgICAvLyBUcmltIGluc2lnbmlmaWNhbnQgemVyb3MuCiAgICAgICAgICAgIGlmICh0cmltKSB2YWx1ZSA9IGZvcm1hdFRyaW0odmFsdWUpOwoKICAgICAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uCiAgICAgICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSAiKyIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAgICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09ICIoIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSAiLSIgfHwgc2lnbiA9PT0gIigiID8gIiIgOiBzaWduKSArIHZhbHVlUHJlZml4OwogICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSAicyIgPyBwcmVmaXhlc1s4ICsgcHJlZml4RXhwb25lbnQgLyAzXSA6ICIiKSArIHZhbHVlU3VmZml4ICsgKHZhbHVlTmVnYXRpdmUgJiYgc2lnbiA9PT0gIigiID8gIikiIDogIiIpOwoKICAgICAgICAgICAgLy8gQnJlYWsgdGhlIGZvcm1hdHRlZCB2YWx1ZSBpbnRvIHRoZSBpbnRlZ2VyIOKAnHZhbHVl4oCdIHBhcnQgdGhhdCBjYW4gYmUKICAgICAgICAgICAgLy8gZ3JvdXBlZCwgYW5kIGZyYWN0aW9uYWwgb3IgZXhwb25lbnRpYWwg4oCcc3VmZml44oCdIHBhcnQgdGhhdCBpcyBub3QuCiAgICAgICAgICAgIGlmIChtYXliZVN1ZmZpeCkgewogICAgICAgICAgICAgIGkgPSAtMSwgbiA9IHZhbHVlLmxlbmd0aDsKICAgICAgICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgICAgICAgaWYgKGMgPSB2YWx1ZS5jaGFyQ29kZUF0KGkpLCA0OCA+IGMgfHwgYyA+IDU3KSB7CiAgICAgICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gKGMgPT09IDQ2ID8gZGVjaW1hbCArIHZhbHVlLnNsaWNlKGkgKyAxKSA6IHZhbHVlLnNsaWNlKGkpKSArIHZhbHVlU3VmZml4OwogICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDAsIGkpOwogICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgbm90ICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBiZWZvcmUgcGFkZGluZy4KICAgICAgICAgIGlmIChjb21tYSAmJiAhemVybykgdmFsdWUgPSBncm91cCh2YWx1ZSwgSW5maW5pdHkpOwoKICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHBhZGRpbmcuCiAgICAgICAgICB2YXIgbGVuZ3RoID0gdmFsdWVQcmVmaXgubGVuZ3RoICsgdmFsdWUubGVuZ3RoICsgdmFsdWVTdWZmaXgubGVuZ3RoLAogICAgICAgICAgICAgIHBhZGRpbmcgPSBsZW5ndGggPCB3aWR0aCA/IG5ldyBBcnJheSh3aWR0aCAtIGxlbmd0aCArIDEpLmpvaW4oZmlsbCkgOiAiIjsKCiAgICAgICAgICAvLyBJZiB0aGUgZmlsbCBjaGFyYWN0ZXIgaXMgIjAiLCBncm91cGluZyBpcyBhcHBsaWVkIGFmdGVyIHBhZGRpbmcuCiAgICAgICAgICBpZiAoY29tbWEgJiYgemVybykgdmFsdWUgPSBncm91cChwYWRkaW5nICsgdmFsdWUsIHBhZGRpbmcubGVuZ3RoID8gd2lkdGggLSB2YWx1ZVN1ZmZpeC5sZW5ndGggOiBJbmZpbml0eSksIHBhZGRpbmcgPSAiIjsKCiAgICAgICAgICAvLyBSZWNvbnN0cnVjdCB0aGUgZmluYWwgb3V0cHV0IGJhc2VkIG9uIHRoZSBkZXNpcmVkIGFsaWdubWVudC4KICAgICAgICAgIHN3aXRjaCAoYWxpZ24pIHsKICAgICAgICAgICAgY2FzZSAiPCI6IHZhbHVlID0gdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZzsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgIj0iOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgcGFkZGluZyArIHZhbHVlICsgdmFsdWVTdWZmaXg7IGJyZWFrOwogICAgICAgICAgICBjYXNlICJeIjogdmFsdWUgPSBwYWRkaW5nLnNsaWNlKDAsIGxlbmd0aCA9IHBhZGRpbmcubGVuZ3RoID4+IDEpICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4ICsgcGFkZGluZy5zbGljZShsZW5ndGgpOyBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDogdmFsdWUgPSBwYWRkaW5nICsgdmFsdWVQcmVmaXggKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsKICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gbnVtZXJhbHModmFsdWUpOwogICAgICAgIH0KCiAgICAgICAgZm9ybWF0LnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc3BlY2lmaWVyICsgIiI7CiAgICAgICAgfTsKCiAgICAgICAgcmV0dXJuIGZvcm1hdDsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpIHsKICAgICAgICB2YXIgZiA9IG5ld0Zvcm1hdCgoc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gImYiLCBzcGVjaWZpZXIpKSwKICAgICAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50JDEodmFsdWUpIC8gMykpKSAqIDMsCiAgICAgICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLAogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhlc1s4ICsgZSAvIDNdOwogICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgcmV0dXJuIGYoayAqIHZhbHVlKSArIHByZWZpeDsKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGZvcm1hdDogbmV3Rm9ybWF0LAogICAgICAgIGZvcm1hdFByZWZpeDogZm9ybWF0UHJlZml4CiAgICAgIH07CiAgICB9CgogICAgdmFyIGxvY2FsZTsKICAgIHZhciBmb3JtYXQ7CiAgICB2YXIgZm9ybWF0UHJlZml4OwoKICAgIGRlZmF1bHRMb2NhbGUoewogICAgICBkZWNpbWFsOiAiLiIsCiAgICAgIHRob3VzYW5kczogIiwiLAogICAgICBncm91cGluZzogWzNdLAogICAgICBjdXJyZW5jeTogWyIkIiwgIiJdLAogICAgICBtaW51czogIi0iCiAgICB9KTsKCiAgICBmdW5jdGlvbiBkZWZhdWx0TG9jYWxlKGRlZmluaXRpb24pIHsKICAgICAgbG9jYWxlID0gZm9ybWF0TG9jYWxlKGRlZmluaXRpb24pOwogICAgICBmb3JtYXQgPSBsb2NhbGUuZm9ybWF0OwogICAgICBmb3JtYXRQcmVmaXggPSBsb2NhbGUuZm9ybWF0UHJlZml4OwogICAgICByZXR1cm4gbG9jYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWNpc2lvbkZpeGVkKHN0ZXApIHsKICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIC1leHBvbmVudCQxKE1hdGguYWJzKHN0ZXApKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQxKHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQkMShNYXRoLmFicyhzdGVwKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWNpc2lvblJvdW5kKHN0ZXAsIG1heCkgewogICAgICBzdGVwID0gTWF0aC5hYnMoc3RlcCksIG1heCA9IE1hdGguYWJzKG1heCkgLSBzdGVwOwogICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwb25lbnQkMShtYXgpIC0gZXhwb25lbnQkMShzdGVwKSkgKyAxOwogICAgfQoKICAgIC8vIEFkZHMgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB3aXRoIHR3aWNlIHRoZSBub3JtYWwgcHJlY2lzaW9uLgogICAgLy8gUmVmZXJlbmNlOiBKLiBSLiBTaGV3Y2h1aywgQWRhcHRpdmUgUHJlY2lzaW9uIEZsb2F0aW5nLVBvaW50IEFyaXRobWV0aWMgYW5kCiAgICAvLyBGYXN0IFJvYnVzdCBHZW9tZXRyaWMgUHJlZGljYXRlcywgRGlzY3JldGUgJiBDb21wdXRhdGlvbmFsIEdlb21ldHJ5IDE4KDMpCiAgICAvLyAzMDXigJMzNjMgKDE5OTcpLgogICAgLy8gQ29kZSBhZGFwdGVkIGZyb20gR2VvZ3JhcGhpY0xpYiBieSBDaGFybGVzIEYuIEYuIEthcm5leSwKICAgIC8vIGh0dHA6Ly9nZW9ncmFwaGljbGliLnNvdXJjZWZvcmdlLm5ldC8KCiAgICBmdW5jdGlvbiBhZGRlcigpIHsKICAgICAgcmV0dXJuIG5ldyBBZGRlcjsKICAgIH0KCiAgICBmdW5jdGlvbiBBZGRlcigpIHsKICAgICAgdGhpcy5yZXNldCgpOwogICAgfQoKICAgIEFkZGVyLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IEFkZGVyLAogICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zID0gLy8gcm91bmRlZCB2YWx1ZQogICAgICAgIHRoaXMudCA9IDA7IC8vIGV4YWN0IGVycm9yCiAgICAgIH0sCiAgICAgIGFkZDogZnVuY3Rpb24oeSkgewogICAgICAgIGFkZCQxKHRlbXAsIHksIHRoaXMudCk7CiAgICAgICAgYWRkJDEodGhpcywgdGVtcC5zLCB0aGlzLnMpOwogICAgICAgIGlmICh0aGlzLnMpIHRoaXMudCArPSB0ZW1wLnQ7CiAgICAgICAgZWxzZSB0aGlzLnMgPSB0ZW1wLnQ7CiAgICAgIH0sCiAgICAgIHZhbHVlT2Y6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnM7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHRlbXAgPSBuZXcgQWRkZXI7CgogICAgZnVuY3Rpb24gYWRkJDEoYWRkZXIsIGEsIGIpIHsKICAgICAgdmFyIHggPSBhZGRlci5zID0gYSArIGIsCiAgICAgICAgICBidiA9IHggLSBhLAogICAgICAgICAgYXYgPSB4IC0gYnY7CiAgICAgIGFkZGVyLnQgPSAoYSAtIGF2KSArIChiIC0gYnYpOwogICAgfQoKICAgIHZhciBlcHNpbG9uJDIgPSAxZS02OwogICAgdmFyIGVwc2lsb24yJDEgPSAxZS0xMjsKICAgIHZhciBwaSQzID0gTWF0aC5QSTsKICAgIHZhciBoYWxmUGkkMiA9IHBpJDMgLyAyOwogICAgdmFyIHF1YXJ0ZXJQaSA9IHBpJDMgLyA0OwogICAgdmFyIHRhdSQzID0gcGkkMyAqIDI7CgogICAgdmFyIGRlZ3JlZXMkMSA9IDE4MCAvIHBpJDM7CiAgICB2YXIgcmFkaWFucyA9IHBpJDMgLyAxODA7CgogICAgdmFyIGFicyA9IE1hdGguYWJzOwogICAgdmFyIGF0YW4gPSBNYXRoLmF0YW47CiAgICB2YXIgYXRhbjIgPSBNYXRoLmF0YW4yOwogICAgdmFyIGNvcyQxID0gTWF0aC5jb3M7CiAgICB2YXIgY2VpbCA9IE1hdGguY2VpbDsKICAgIHZhciBleHAgPSBNYXRoLmV4cDsKICAgIHZhciBsb2cgPSBNYXRoLmxvZzsKICAgIHZhciBwb3cgPSBNYXRoLnBvdzsKICAgIHZhciBzaW4kMSA9IE1hdGguc2luOwogICAgdmFyIHNpZ24gPSBNYXRoLnNpZ24gfHwgZnVuY3Rpb24oeCkgeyByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7IH07CiAgICB2YXIgc3FydCA9IE1hdGguc3FydDsKICAgIHZhciB0YW4gPSBNYXRoLnRhbjsKCiAgICBmdW5jdGlvbiBhY29zKHgpIHsKICAgICAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpJDMgOiBNYXRoLmFjb3MoeCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNpbih4KSB7CiAgICAgIHJldHVybiB4ID4gMSA/IGhhbGZQaSQyIDogeCA8IC0xID8gLWhhbGZQaSQyIDogTWF0aC5hc2luKHgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhhdmVyc2luKHgpIHsKICAgICAgcmV0dXJuICh4ID0gc2luJDEoeCAvIDIpKSAqIHg7CiAgICB9CgogICAgZnVuY3Rpb24gbm9vcCQyKCkge30KCiAgICBmdW5jdGlvbiBzdHJlYW1HZW9tZXRyeShnZW9tZXRyeSwgc3RyZWFtKSB7CiAgICAgIGlmIChnZW9tZXRyeSAmJiBzdHJlYW1HZW9tZXRyeVR5cGUuaGFzT3duUHJvcGVydHkoZ2VvbWV0cnkudHlwZSkpIHsKICAgICAgICBzdHJlYW1HZW9tZXRyeVR5cGVbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIHN0cmVhbSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgc3RyZWFtT2JqZWN0VHlwZSA9IHsKICAgICAgRmVhdHVyZTogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgICAgICBzdHJlYW1HZW9tZXRyeShvYmplY3QuZ2VvbWV0cnksIHN0cmVhbSk7CiAgICAgIH0sCiAgICAgIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHZhciBmZWF0dXJlcyA9IG9iamVjdC5mZWF0dXJlcywgaSA9IC0xLCBuID0gZmVhdHVyZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1HZW9tZXRyeShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgc3RyZWFtKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgc3RyZWFtR2VvbWV0cnlUeXBlID0gewogICAgICBTcGhlcmU6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtLnNwaGVyZSgpOwogICAgICB9LAogICAgICBQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgICAgICBvYmplY3QgPSBvYmplY3QuY29vcmRpbmF0ZXM7CiAgICAgICAgc3RyZWFtLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pOwogICAgICB9LAogICAgICBNdWx0aVBvaW50OiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBvYmplY3QgPSBjb29yZGluYXRlc1tpXSwgc3RyZWFtLnBvaW50KG9iamVjdFswXSwgb2JqZWN0WzFdLCBvYmplY3RbMl0pOwogICAgICB9LAogICAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHN0cmVhbUxpbmUob2JqZWN0LmNvb3JkaW5hdGVzLCBzdHJlYW0sIDApOwogICAgICB9LAogICAgICBNdWx0aUxpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMCk7CiAgICAgIH0sCiAgICAgIFBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIHN0cmVhbSk7CiAgICAgIH0sCiAgICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtUG9seWdvbihjb29yZGluYXRlc1tpXSwgc3RyZWFtKTsKICAgICAgfSwKICAgICAgR2VvbWV0cnlDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHZhciBnZW9tZXRyaWVzID0gb2JqZWN0Lmdlb21ldHJpZXMsIGkgPSAtMSwgbiA9IGdlb21ldHJpZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1HZW9tZXRyeShnZW9tZXRyaWVzW2ldLCBzdHJlYW0pOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHN0cmVhbUxpbmUoY29vcmRpbmF0ZXMsIHN0cmVhbSwgY2xvc2VkKSB7CiAgICAgIHZhciBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGggLSBjbG9zZWQsIGNvb3JkaW5hdGU7CiAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgd2hpbGUgKCsraSA8IG4pIGNvb3JkaW5hdGUgPSBjb29yZGluYXRlc1tpXSwgc3RyZWFtLnBvaW50KGNvb3JkaW5hdGVbMF0sIGNvb3JkaW5hdGVbMV0sIGNvb3JkaW5hdGVbMl0pOwogICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0cmVhbVBvbHlnb24oY29vcmRpbmF0ZXMsIHN0cmVhbSkgewogICAgICB2YXIgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICBzdHJlYW0ucG9seWdvblN0YXJ0KCk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDEpOwogICAgICBzdHJlYW0ucG9seWdvbkVuZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlb1N0cmVhbShvYmplY3QsIHN0cmVhbSkgewogICAgICBpZiAob2JqZWN0ICYmIHN0cmVhbU9iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpKSB7CiAgICAgICAgc3RyZWFtT2JqZWN0VHlwZVtvYmplY3QudHlwZV0ob2JqZWN0LCBzdHJlYW0pOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbUdlb21ldHJ5KG9iamVjdCwgc3RyZWFtKTsKICAgICAgfQogICAgfQoKICAgIHZhciBhcmVhUmluZ1N1bSA9IGFkZGVyKCk7CgogICAgdmFyIGFyZWFTdW0gPSBhZGRlcigpLAogICAgICAgIGxhbWJkYTAwLAogICAgICAgIHBoaTAwLAogICAgICAgIGxhbWJkYTAsCiAgICAgICAgY29zUGhpMCwKICAgICAgICBzaW5QaGkwOwoKICAgIHZhciBhcmVhU3RyZWFtID0gewogICAgICBwb2ludDogbm9vcCQyLAogICAgICBsaW5lU3RhcnQ6IG5vb3AkMiwKICAgICAgbGluZUVuZDogbm9vcCQyLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGFyZWFSaW5nU3VtLnJlc2V0KCk7CiAgICAgICAgYXJlYVN0cmVhbS5saW5lU3RhcnQgPSBhcmVhUmluZ1N0YXJ0OwogICAgICAgIGFyZWFTdHJlYW0ubGluZUVuZCA9IGFyZWFSaW5nRW5kOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJlYVJpbmcgPSArYXJlYVJpbmdTdW07CiAgICAgICAgYXJlYVN1bS5hZGQoYXJlYVJpbmcgPCAwID8gdGF1JDMgKyBhcmVhUmluZyA6IGFyZWFSaW5nKTsKICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMubGluZUVuZCA9IHRoaXMucG9pbnQgPSBub29wJDI7CiAgICAgIH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgYXJlYVN1bS5hZGQodGF1JDMpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGFyZWFSaW5nU3RhcnQoKSB7CiAgICAgIGFyZWFTdHJlYW0ucG9pbnQgPSBhcmVhUG9pbnRGaXJzdDsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhUmluZ0VuZCgpIHsKICAgICAgYXJlYVBvaW50KGxhbWJkYTAwLCBwaGkwMCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJlYVBvaW50Rmlyc3QobGFtYmRhLCBwaGkpIHsKICAgICAgYXJlYVN0cmVhbS5wb2ludCA9IGFyZWFQb2ludDsKICAgICAgbGFtYmRhMDAgPSBsYW1iZGEsIHBoaTAwID0gcGhpOwogICAgICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7CiAgICAgIGxhbWJkYTAgPSBsYW1iZGEsIGNvc1BoaTAgPSBjb3MkMShwaGkgPSBwaGkgLyAyICsgcXVhcnRlclBpKSwgc2luUGhpMCA9IHNpbiQxKHBoaSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJlYVBvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICAgICAgcGhpID0gcGhpIC8gMiArIHF1YXJ0ZXJQaTsgLy8gaGFsZiB0aGUgYW5ndWxhciBkaXN0YW5jZSBmcm9tIHNvdXRoIHBvbGUKCiAgICAgIC8vIFNwaGVyaWNhbCBleGNlc3MgRSBmb3IgYSBzcGhlcmljYWwgdHJpYW5nbGUgd2l0aCB2ZXJ0aWNlczogc291dGggcG9sZSwKICAgICAgLy8gcHJldmlvdXMgcG9pbnQsIGN1cnJlbnQgcG9pbnQuICBVc2VzIGEgZm9ybXVsYSBkZXJpdmVkIGZyb20gQ2Fnbm9saeKAmXMKICAgICAgLy8gdGhlb3JlbS4gIFNlZSBUb2RodW50ZXIsIFNwaGVyaWNhbCBUcmlnLiAoMTg3MSksIFNlYy4gMTAzLCBFcS4gKDIpLgogICAgICB2YXIgZExhbWJkYSA9IGxhbWJkYSAtIGxhbWJkYTAsCiAgICAgICAgICBzZExhbWJkYSA9IGRMYW1iZGEgPj0gMCA/IDEgOiAtMSwKICAgICAgICAgIGFkTGFtYmRhID0gc2RMYW1iZGEgKiBkTGFtYmRhLAogICAgICAgICAgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgICAgIHNpblBoaSA9IHNpbiQxKHBoaSksCiAgICAgICAgICBrID0gc2luUGhpMCAqIHNpblBoaSwKICAgICAgICAgIHUgPSBjb3NQaGkwICogY29zUGhpICsgayAqIGNvcyQxKGFkTGFtYmRhKSwKICAgICAgICAgIHYgPSBrICogc2RMYW1iZGEgKiBzaW4kMShhZExhbWJkYSk7CiAgICAgIGFyZWFSaW5nU3VtLmFkZChhdGFuMih2LCB1KSk7CgogICAgICAvLyBBZHZhbmNlIHRoZSBwcmV2aW91cyBwb2ludHMuCiAgICAgIGxhbWJkYTAgPSBsYW1iZGEsIGNvc1BoaTAgPSBjb3NQaGksIHNpblBoaTAgPSBzaW5QaGk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJlYSQxKG9iamVjdCkgewogICAgICBhcmVhU3VtLnJlc2V0KCk7CiAgICAgIGdlb1N0cmVhbShvYmplY3QsIGFyZWFTdHJlYW0pOwogICAgICByZXR1cm4gYXJlYVN1bSAqIDI7CiAgICB9CgogICAgZnVuY3Rpb24gc3BoZXJpY2FsKGNhcnRlc2lhbikgewogICAgICByZXR1cm4gW2F0YW4yKGNhcnRlc2lhblsxXSwgY2FydGVzaWFuWzBdKSwgYXNpbihjYXJ0ZXNpYW5bMl0pXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW4oc3BoZXJpY2FsKSB7CiAgICAgIHZhciBsYW1iZGEgPSBzcGhlcmljYWxbMF0sIHBoaSA9IHNwaGVyaWNhbFsxXSwgY29zUGhpID0gY29zJDEocGhpKTsKICAgICAgcmV0dXJuIFtjb3NQaGkgKiBjb3MkMShsYW1iZGEpLCBjb3NQaGkgKiBzaW4kMShsYW1iZGEpLCBzaW4kMShwaGkpXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW5Eb3QoYSwgYikgewogICAgICByZXR1cm4gYVswXSAqIGJbMF0gKyBhWzFdICogYlsxXSArIGFbMl0gKiBiWzJdOwogICAgfQoKICAgIGZ1bmN0aW9uIGNhcnRlc2lhbkNyb3NzKGEsIGIpIHsKICAgICAgcmV0dXJuIFthWzFdICogYlsyXSAtIGFbMl0gKiBiWzFdLCBhWzJdICogYlswXSAtIGFbMF0gKiBiWzJdLCBhWzBdICogYlsxXSAtIGFbMV0gKiBiWzBdXTsKICAgIH0KCiAgICAvLyBUT0RPIHJldHVybiBhCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW5BZGRJblBsYWNlKGEsIGIpIHsKICAgICAgYVswXSArPSBiWzBdLCBhWzFdICs9IGJbMV0sIGFbMl0gKz0gYlsyXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW5TY2FsZSh2ZWN0b3IsIGspIHsKICAgICAgcmV0dXJuIFt2ZWN0b3JbMF0gKiBrLCB2ZWN0b3JbMV0gKiBrLCB2ZWN0b3JbMl0gKiBrXTsKICAgIH0KCiAgICAvLyBUT0RPIHJldHVybiBkCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGQpIHsKICAgICAgdmFyIGwgPSBzcXJ0KGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7CiAgICAgIGRbMF0gLz0gbCwgZFsxXSAvPSBsLCBkWzJdIC89IGw7CiAgICB9CgogICAgdmFyIGxhbWJkYTAkMSwgcGhpMCwgbGFtYmRhMSwgcGhpMSwgLy8gYm91bmRzCiAgICAgICAgbGFtYmRhMiwgLy8gcHJldmlvdXMgbGFtYmRhLWNvb3JkaW5hdGUKICAgICAgICBsYW1iZGEwMCQxLCBwaGkwMCQxLCAvLyBmaXJzdCBwb2ludAogICAgICAgIHAwLCAvLyBwcmV2aW91cyAzRCBwb2ludAogICAgICAgIGRlbHRhU3VtID0gYWRkZXIoKSwKICAgICAgICByYW5nZXMsCiAgICAgICAgcmFuZ2U7CgogICAgdmFyIGJvdW5kc1N0cmVhbSA9IHsKICAgICAgcG9pbnQ6IGJvdW5kc1BvaW50LAogICAgICBsaW5lU3RhcnQ6IGJvdW5kc0xpbmVTdGFydCwKICAgICAgbGluZUVuZDogYm91bmRzTGluZUVuZCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBib3VuZHNTdHJlYW0ucG9pbnQgPSBib3VuZHNSaW5nUG9pbnQ7CiAgICAgICAgYm91bmRzU3RyZWFtLmxpbmVTdGFydCA9IGJvdW5kc1JpbmdTdGFydDsKICAgICAgICBib3VuZHNTdHJlYW0ubGluZUVuZCA9IGJvdW5kc1JpbmdFbmQ7CiAgICAgICAgZGVsdGFTdW0ucmVzZXQoKTsKICAgICAgICBhcmVhU3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBhcmVhU3RyZWFtLnBvbHlnb25FbmQoKTsKICAgICAgICBib3VuZHNTdHJlYW0ucG9pbnQgPSBib3VuZHNQb2ludDsKICAgICAgICBib3VuZHNTdHJlYW0ubGluZVN0YXJ0ID0gYm91bmRzTGluZVN0YXJ0OwogICAgICAgIGJvdW5kc1N0cmVhbS5saW5lRW5kID0gYm91bmRzTGluZUVuZDsKICAgICAgICBpZiAoYXJlYVJpbmdTdW0gPCAwKSBsYW1iZGEwJDEgPSAtKGxhbWJkYTEgPSAxODApLCBwaGkwID0gLShwaGkxID0gOTApOwogICAgICAgIGVsc2UgaWYgKGRlbHRhU3VtID4gZXBzaWxvbiQyKSBwaGkxID0gOTA7CiAgICAgICAgZWxzZSBpZiAoZGVsdGFTdW0gPCAtZXBzaWxvbiQyKSBwaGkwID0gLTkwOwogICAgICAgIHJhbmdlWzBdID0gbGFtYmRhMCQxLCByYW5nZVsxXSA9IGxhbWJkYTE7CiAgICAgIH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgbGFtYmRhMCQxID0gLShsYW1iZGExID0gMTgwKSwgcGhpMCA9IC0ocGhpMSA9IDkwKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBib3VuZHNQb2ludChsYW1iZGEsIHBoaSkgewogICAgICByYW5nZXMucHVzaChyYW5nZSA9IFtsYW1iZGEwJDEgPSBsYW1iZGEsIGxhbWJkYTEgPSBsYW1iZGFdKTsKICAgICAgaWYgKHBoaSA8IHBoaTApIHBoaTAgPSBwaGk7CiAgICAgIGlmIChwaGkgPiBwaGkxKSBwaGkxID0gcGhpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVQb2ludChsYW1iZGEsIHBoaSkgewogICAgICB2YXIgcCA9IGNhcnRlc2lhbihbbGFtYmRhICogcmFkaWFucywgcGhpICogcmFkaWFuc10pOwogICAgICBpZiAocDApIHsKICAgICAgICB2YXIgbm9ybWFsID0gY2FydGVzaWFuQ3Jvc3MocDAsIHApLAogICAgICAgICAgICBlcXVhdG9yaWFsID0gW25vcm1hbFsxXSwgLW5vcm1hbFswXSwgMF0sCiAgICAgICAgICAgIGluZmxlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhlcXVhdG9yaWFsLCBub3JtYWwpOwogICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoaW5mbGVjdGlvbik7CiAgICAgICAgaW5mbGVjdGlvbiA9IHNwaGVyaWNhbChpbmZsZWN0aW9uKTsKICAgICAgICB2YXIgZGVsdGEgPSBsYW1iZGEgLSBsYW1iZGEyLAogICAgICAgICAgICBzaWduID0gZGVsdGEgPiAwID8gMSA6IC0xLAogICAgICAgICAgICBsYW1iZGFpID0gaW5mbGVjdGlvblswXSAqIGRlZ3JlZXMkMSAqIHNpZ24sCiAgICAgICAgICAgIHBoaWksCiAgICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFicyhkZWx0YSkgPiAxODA7CiAgICAgICAgaWYgKGFudGltZXJpZGlhbiBeIChzaWduICogbGFtYmRhMiA8IGxhbWJkYWkgJiYgbGFtYmRhaSA8IHNpZ24gKiBsYW1iZGEpKSB7CiAgICAgICAgICBwaGlpID0gaW5mbGVjdGlvblsxXSAqIGRlZ3JlZXMkMTsKICAgICAgICAgIGlmIChwaGlpID4gcGhpMSkgcGhpMSA9IHBoaWk7CiAgICAgICAgfSBlbHNlIGlmIChsYW1iZGFpID0gKGxhbWJkYWkgKyAzNjApICUgMzYwIC0gMTgwLCBhbnRpbWVyaWRpYW4gXiAoc2lnbiAqIGxhbWJkYTIgPCBsYW1iZGFpICYmIGxhbWJkYWkgPCBzaWduICogbGFtYmRhKSkgewogICAgICAgICAgcGhpaSA9IC1pbmZsZWN0aW9uWzFdICogZGVncmVlcyQxOwogICAgICAgICAgaWYgKHBoaWkgPCBwaGkwKSBwaGkwID0gcGhpaTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKHBoaSA8IHBoaTApIHBoaTAgPSBwaGk7CiAgICAgICAgICBpZiAocGhpID4gcGhpMSkgcGhpMSA9IHBoaTsKICAgICAgICB9CiAgICAgICAgaWYgKGFudGltZXJpZGlhbikgewogICAgICAgICAgaWYgKGxhbWJkYSA8IGxhbWJkYTIpIHsKICAgICAgICAgICAgaWYgKGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhKSA+IGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhMSkpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoYW5nbGUobGFtYmRhLCBsYW1iZGExKSA+IGFuZ2xlKGxhbWJkYTAkMSwgbGFtYmRhMSkpIGxhbWJkYTAkMSA9IGxhbWJkYTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgaWYgKGxhbWJkYTEgPj0gbGFtYmRhMCQxKSB7CiAgICAgICAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEwJDEpIGxhbWJkYTAkMSA9IGxhbWJkYTsKICAgICAgICAgICAgaWYgKGxhbWJkYSA+IGxhbWJkYTEpIGxhbWJkYTEgPSBsYW1iZGE7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobGFtYmRhID4gbGFtYmRhMikgewogICAgICAgICAgICAgIGlmIChhbmdsZShsYW1iZGEwJDEsIGxhbWJkYSkgPiBhbmdsZShsYW1iZGEwJDEsIGxhbWJkYTEpKSBsYW1iZGExID0gbGFtYmRhOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChhbmdsZShsYW1iZGEsIGxhbWJkYTEpID4gYW5nbGUobGFtYmRhMCQxLCBsYW1iZGExKSkgbGFtYmRhMCQxID0gbGFtYmRhOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHJhbmdlcy5wdXNoKHJhbmdlID0gW2xhbWJkYTAkMSA9IGxhbWJkYSwgbGFtYmRhMSA9IGxhbWJkYV0pOwogICAgICB9CiAgICAgIGlmIChwaGkgPCBwaGkwKSBwaGkwID0gcGhpOwogICAgICBpZiAocGhpID4gcGhpMSkgcGhpMSA9IHBoaTsKICAgICAgcDAgPSBwLCBsYW1iZGEyID0gbGFtYmRhOwogICAgfQoKICAgIGZ1bmN0aW9uIGJvdW5kc0xpbmVTdGFydCgpIHsKICAgICAgYm91bmRzU3RyZWFtLnBvaW50ID0gbGluZVBvaW50OwogICAgfQoKICAgIGZ1bmN0aW9uIGJvdW5kc0xpbmVFbmQoKSB7CiAgICAgIHJhbmdlWzBdID0gbGFtYmRhMCQxLCByYW5nZVsxXSA9IGxhbWJkYTE7CiAgICAgIGJvdW5kc1N0cmVhbS5wb2ludCA9IGJvdW5kc1BvaW50OwogICAgICBwMCA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gYm91bmRzUmluZ1BvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgIGlmIChwMCkgewogICAgICAgIHZhciBkZWx0YSA9IGxhbWJkYSAtIGxhbWJkYTI7CiAgICAgICAgZGVsdGFTdW0uYWRkKGFicyhkZWx0YSkgPiAxODAgPyBkZWx0YSArIChkZWx0YSA+IDAgPyAzNjAgOiAtMzYwKSA6IGRlbHRhKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBsYW1iZGEwMCQxID0gbGFtYmRhLCBwaGkwMCQxID0gcGhpOwogICAgICB9CiAgICAgIGFyZWFTdHJlYW0ucG9pbnQobGFtYmRhLCBwaGkpOwogICAgICBsaW5lUG9pbnQobGFtYmRhLCBwaGkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJvdW5kc1JpbmdTdGFydCgpIHsKICAgICAgYXJlYVN0cmVhbS5saW5lU3RhcnQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBib3VuZHNSaW5nRW5kKCkgewogICAgICBib3VuZHNSaW5nUG9pbnQobGFtYmRhMDAkMSwgcGhpMDAkMSk7CiAgICAgIGFyZWFTdHJlYW0ubGluZUVuZCgpOwogICAgICBpZiAoYWJzKGRlbHRhU3VtKSA+IGVwc2lsb24kMikgbGFtYmRhMCQxID0gLShsYW1iZGExID0gMTgwKTsKICAgICAgcmFuZ2VbMF0gPSBsYW1iZGEwJDEsIHJhbmdlWzFdID0gbGFtYmRhMTsKICAgICAgcDAgPSBudWxsOwogICAgfQoKICAgIC8vIEZpbmRzIHRoZSBsZWZ0LXJpZ2h0IGRpc3RhbmNlIGJldHdlZW4gdHdvIGxvbmdpdHVkZXMuCiAgICAvLyBUaGlzIGlzIGFsbW9zdCB0aGUgc2FtZSBhcyAobGFtYmRhMSAtIGxhbWJkYTAgKyAzNjDCsCkgJSAzNjDCsCwgZXhjZXB0IHRoYXQgd2Ugd2FudAogICAgLy8gdGhlIGRpc3RhbmNlIGJldHdlZW4gwrExODDCsCB0byBiZSAzNjDCsC4KICAgIGZ1bmN0aW9uIGFuZ2xlKGxhbWJkYTAsIGxhbWJkYTEpIHsKICAgICAgcmV0dXJuIChsYW1iZGExIC09IGxhbWJkYTApIDwgMCA/IGxhbWJkYTEgKyAzNjAgOiBsYW1iZGExOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhbmdlQ29tcGFyZShhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdIC0gYlswXTsKICAgIH0KCiAgICBmdW5jdGlvbiByYW5nZUNvbnRhaW5zKHJhbmdlLCB4KSB7CiAgICAgIHJldHVybiByYW5nZVswXSA8PSByYW5nZVsxXSA/IHJhbmdlWzBdIDw9IHggJiYgeCA8PSByYW5nZVsxXSA6IHggPCByYW5nZVswXSB8fCByYW5nZVsxXSA8IHg7CiAgICB9CgogICAgZnVuY3Rpb24gYm91bmRzKGZlYXR1cmUpIHsKICAgICAgdmFyIGksIG4sIGEsIGIsIG1lcmdlZCwgZGVsdGFNYXgsIGRlbHRhOwoKICAgICAgcGhpMSA9IGxhbWJkYTEgPSAtKGxhbWJkYTAkMSA9IHBoaTAgPSBJbmZpbml0eSk7CiAgICAgIHJhbmdlcyA9IFtdOwogICAgICBnZW9TdHJlYW0oZmVhdHVyZSwgYm91bmRzU3RyZWFtKTsKCiAgICAgIC8vIEZpcnN0LCBzb3J0IHJhbmdlcyBieSB0aGVpciBtaW5pbXVtIGxvbmdpdHVkZXMuCiAgICAgIGlmIChuID0gcmFuZ2VzLmxlbmd0aCkgewogICAgICAgIHJhbmdlcy5zb3J0KHJhbmdlQ29tcGFyZSk7CgogICAgICAgIC8vIFRoZW4sIG1lcmdlIGFueSByYW5nZXMgdGhhdCBvdmVybGFwLgogICAgICAgIGZvciAoaSA9IDEsIGEgPSByYW5nZXNbMF0sIG1lcmdlZCA9IFthXTsgaSA8IG47ICsraSkgewogICAgICAgICAgYiA9IHJhbmdlc1tpXTsKICAgICAgICAgIGlmIChyYW5nZUNvbnRhaW5zKGEsIGJbMF0pIHx8IHJhbmdlQ29udGFpbnMoYSwgYlsxXSkpIHsKICAgICAgICAgICAgaWYgKGFuZ2xlKGFbMF0sIGJbMV0pID4gYW5nbGUoYVswXSwgYVsxXSkpIGFbMV0gPSBiWzFdOwogICAgICAgICAgICBpZiAoYW5nbGUoYlswXSwgYVsxXSkgPiBhbmdsZShhWzBdLCBhWzFdKSkgYVswXSA9IGJbMF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBtZXJnZWQucHVzaChhID0gYik7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBGaW5hbGx5LCBmaW5kIHRoZSBsYXJnZXN0IGdhcCBiZXR3ZWVuIHRoZSBtZXJnZWQgcmFuZ2VzLgogICAgICAgIC8vIFRoZSBmaW5hbCBib3VuZGluZyBib3ggd2lsbCBiZSB0aGUgaW52ZXJzZSBvZiB0aGlzIGdhcC4KICAgICAgICBmb3IgKGRlbHRhTWF4ID0gLUluZmluaXR5LCBuID0gbWVyZ2VkLmxlbmd0aCAtIDEsIGkgPSAwLCBhID0gbWVyZ2VkW25dOyBpIDw9IG47IGEgPSBiLCArK2kpIHsKICAgICAgICAgIGIgPSBtZXJnZWRbaV07CiAgICAgICAgICBpZiAoKGRlbHRhID0gYW5nbGUoYVsxXSwgYlswXSkpID4gZGVsdGFNYXgpIGRlbHRhTWF4ID0gZGVsdGEsIGxhbWJkYTAkMSA9IGJbMF0sIGxhbWJkYTEgPSBhWzFdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmFuZ2VzID0gcmFuZ2UgPSBudWxsOwoKICAgICAgcmV0dXJuIGxhbWJkYTAkMSA9PT0gSW5maW5pdHkgfHwgcGhpMCA9PT0gSW5maW5pdHkKICAgICAgICAgID8gW1tOYU4sIE5hTl0sIFtOYU4sIE5hTl1dCiAgICAgICAgICA6IFtbbGFtYmRhMCQxLCBwaGkwXSwgW2xhbWJkYTEsIHBoaTFdXTsKICAgIH0KCiAgICB2YXIgVzAsIFcxLAogICAgICAgIFgwLCBZMCwgWjAsCiAgICAgICAgWDEsIFkxLCBaMSwKICAgICAgICBYMiwgWTIsIFoyLAogICAgICAgIGxhbWJkYTAwJDIsIHBoaTAwJDIsIC8vIGZpcnN0IHBvaW50CiAgICAgICAgeDAsIHkwLCB6MDsgLy8gcHJldmlvdXMgcG9pbnQKCiAgICB2YXIgY2VudHJvaWRTdHJlYW0gPSB7CiAgICAgIHNwaGVyZTogbm9vcCQyLAogICAgICBwb2ludDogY2VudHJvaWRQb2ludCwKICAgICAgbGluZVN0YXJ0OiBjZW50cm9pZExpbmVTdGFydCwKICAgICAgbGluZUVuZDogY2VudHJvaWRMaW5lRW5kLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVTdGFydCA9IGNlbnRyb2lkUmluZ1N0YXJ0OwogICAgICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVFbmQgPSBjZW50cm9pZFJpbmdFbmQ7CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVTdGFydCA9IGNlbnRyb2lkTGluZVN0YXJ0OwogICAgICAgIGNlbnRyb2lkU3RyZWFtLmxpbmVFbmQgPSBjZW50cm9pZExpbmVFbmQ7CiAgICAgIH0KICAgIH07CgogICAgLy8gQXJpdGhtZXRpYyBtZWFuIG9mIENhcnRlc2lhbiB2ZWN0b3JzLgogICAgZnVuY3Rpb24gY2VudHJvaWRQb2ludChsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7CiAgICAgIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpOwogICAgICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKGNvc1BoaSAqIGNvcyQxKGxhbWJkYSksIGNvc1BoaSAqIHNpbiQxKGxhbWJkYSksIHNpbiQxKHBoaSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4oeCwgeSwgeikgewogICAgICArK1cwOwogICAgICBYMCArPSAoeCAtIFgwKSAvIFcwOwogICAgICBZMCArPSAoeSAtIFkwKSAvIFcwOwogICAgICBaMCArPSAoeiAtIFowKSAvIFcwOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkTGluZVN0YXJ0KCkgewogICAgICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50Rmlyc3Q7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRMaW5lUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7CiAgICAgIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpOwogICAgICB4MCA9IGNvc1BoaSAqIGNvcyQxKGxhbWJkYSk7CiAgICAgIHkwID0gY29zUGhpICogc2luJDEobGFtYmRhKTsKICAgICAgejAgPSBzaW4kMShwaGkpOwogICAgICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50OwogICAgICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkTGluZVBvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICAgICAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSksCiAgICAgICAgICB4ID0gY29zUGhpICogY29zJDEobGFtYmRhKSwKICAgICAgICAgIHkgPSBjb3NQaGkgKiBzaW4kMShsYW1iZGEpLAogICAgICAgICAgeiA9IHNpbiQxKHBoaSksCiAgICAgICAgICB3ID0gYXRhbjIoc3FydCgodyA9IHkwICogeiAtIHowICogeSkgKiB3ICsgKHcgPSB6MCAqIHggLSB4MCAqIHopICogdyArICh3ID0geDAgKiB5IC0geTAgKiB4KSAqIHcpLCB4MCAqIHggKyB5MCAqIHkgKyB6MCAqIHopOwogICAgICBXMSArPSB3OwogICAgICBYMSArPSB3ICogKHgwICsgKHgwID0geCkpOwogICAgICBZMSArPSB3ICogKHkwICsgKHkwID0geSkpOwogICAgICBaMSArPSB3ICogKHowICsgKHowID0geikpOwogICAgICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkTGluZUVuZCgpIHsKICAgICAgY2VudHJvaWRTdHJlYW0ucG9pbnQgPSBjZW50cm9pZFBvaW50OwogICAgfQoKICAgIC8vIFNlZSBKLiBFLiBCcm9jaywgVGhlIEluZXJ0aWEgVGVuc29yIGZvciBhIFNwaGVyaWNhbCBUcmlhbmdsZSwKICAgIC8vIEouIEFwcGxpZWQgTWVjaGFuaWNzIDQyLCAyMzkgKDE5NzUpLgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nU3RhcnQoKSB7CiAgICAgIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRSaW5nUG9pbnRGaXJzdDsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZFJpbmdFbmQoKSB7CiAgICAgIGNlbnRyb2lkUmluZ1BvaW50KGxhbWJkYTAwJDIsIHBoaTAwJDIpOwogICAgICBjZW50cm9pZFN0cmVhbS5wb2ludCA9IGNlbnRyb2lkUG9pbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nUG9pbnRGaXJzdChsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEwMCQyID0gbGFtYmRhLCBwaGkwMCQyID0gcGhpOwogICAgICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7CiAgICAgIGNlbnRyb2lkU3RyZWFtLnBvaW50ID0gY2VudHJvaWRSaW5nUG9pbnQ7CiAgICAgIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpOwogICAgICB4MCA9IGNvc1BoaSAqIGNvcyQxKGxhbWJkYSk7CiAgICAgIHkwID0gY29zUGhpICogc2luJDEobGFtYmRhKTsKICAgICAgejAgPSBzaW4kMShwaGkpOwogICAgICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUmluZ1BvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICAgICAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSksCiAgICAgICAgICB4ID0gY29zUGhpICogY29zJDEobGFtYmRhKSwKICAgICAgICAgIHkgPSBjb3NQaGkgKiBzaW4kMShsYW1iZGEpLAogICAgICAgICAgeiA9IHNpbiQxKHBoaSksCiAgICAgICAgICBjeCA9IHkwICogeiAtIHowICogeSwKICAgICAgICAgIGN5ID0gejAgKiB4IC0geDAgKiB6LAogICAgICAgICAgY3ogPSB4MCAqIHkgLSB5MCAqIHgsCiAgICAgICAgICBtID0gc3FydChjeCAqIGN4ICsgY3kgKiBjeSArIGN6ICogY3opLAogICAgICAgICAgdyA9IGFzaW4obSksIC8vIGxpbmUgd2VpZ2h0ID0gYW5nbGUKICAgICAgICAgIHYgPSBtICYmIC13IC8gbTsgLy8gYXJlYSB3ZWlnaHQgbXVsdGlwbGllcgogICAgICBYMiArPSB2ICogY3g7CiAgICAgIFkyICs9IHYgKiBjeTsKICAgICAgWjIgKz0gdiAqIGN6OwogICAgICBXMSArPSB3OwogICAgICBYMSArPSB3ICogKHgwICsgKHgwID0geCkpOwogICAgICBZMSArPSB3ICogKHkwICsgKHkwID0geSkpOwogICAgICBaMSArPSB3ICogKHowICsgKHowID0geikpOwogICAgICBjZW50cm9pZFBvaW50Q2FydGVzaWFuKHgwLCB5MCwgejApOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkKG9iamVjdCkgewogICAgICBXMCA9IFcxID0KICAgICAgWDAgPSBZMCA9IFowID0KICAgICAgWDEgPSBZMSA9IFoxID0KICAgICAgWDIgPSBZMiA9IFoyID0gMDsKICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgY2VudHJvaWRTdHJlYW0pOwoKICAgICAgdmFyIHggPSBYMiwKICAgICAgICAgIHkgPSBZMiwKICAgICAgICAgIHogPSBaMiwKICAgICAgICAgIG0gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7CgogICAgICAvLyBJZiB0aGUgYXJlYS13ZWlnaHRlZCBjY2VudHJvaWQgaXMgdW5kZWZpbmVkLCBmYWxsIGJhY2sgdG8gbGVuZ3RoLXdlaWdodGVkIGNjZW50cm9pZC4KICAgICAgaWYgKG0gPCBlcHNpbG9uMiQxKSB7CiAgICAgICAgeCA9IFgxLCB5ID0gWTEsIHogPSBaMTsKICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZSBoYXMgemVybyBsZW5ndGgsIGZhbGwgYmFjayB0byBhcml0aG1ldGljIG1lYW4gb2YgcG9pbnQgdmVjdG9ycy4KICAgICAgICBpZiAoVzEgPCBlcHNpbG9uJDIpIHggPSBYMCwgeSA9IFkwLCB6ID0gWjA7CiAgICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejsKICAgICAgICAvLyBJZiB0aGUgZmVhdHVyZSBzdGlsbCBoYXMgYW4gdW5kZWZpbmVkIGNjZW50cm9pZCwgdGhlbiByZXR1cm4uCiAgICAgICAgaWYgKG0gPCBlcHNpbG9uMiQxKSByZXR1cm4gW05hTiwgTmFOXTsKICAgICAgfQoKICAgICAgcmV0dXJuIFthdGFuMih5LCB4KSAqIGRlZ3JlZXMkMSwgYXNpbih6IC8gc3FydChtKSkgKiBkZWdyZWVzJDFdOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDgoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY29tcG9zZShhLCBiKSB7CgogICAgICBmdW5jdGlvbiBjb21wb3NlKHgsIHkpIHsKICAgICAgICByZXR1cm4geCA9IGEoeCwgeSksIGIoeFswXSwgeFsxXSk7CiAgICAgIH0KCiAgICAgIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgcmV0dXJuIHggPSBiLmludmVydCh4LCB5KSwgeCAmJiBhLmludmVydCh4WzBdLCB4WzFdKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBjb21wb3NlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJvdGF0aW9uSWRlbnRpdHkobGFtYmRhLCBwaGkpIHsKICAgICAgcmV0dXJuIFthYnMobGFtYmRhKSA+IHBpJDMgPyBsYW1iZGEgKyBNYXRoLnJvdW5kKC1sYW1iZGEgLyB0YXUkMykgKiB0YXUkMyA6IGxhbWJkYSwgcGhpXTsKICAgIH0KCiAgICByb3RhdGlvbklkZW50aXR5LmludmVydCA9IHJvdGF0aW9uSWRlbnRpdHk7CgogICAgZnVuY3Rpb24gcm90YXRlUmFkaWFucyhkZWx0YUxhbWJkYSwgZGVsdGFQaGksIGRlbHRhR2FtbWEpIHsKICAgICAgcmV0dXJuIChkZWx0YUxhbWJkYSAlPSB0YXUkMykgPyAoZGVsdGFQaGkgfHwgZGVsdGFHYW1tYSA/IGNvbXBvc2Uocm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpLCByb3RhdGlvblBoaUdhbW1hKGRlbHRhUGhpLCBkZWx0YUdhbW1hKSkKICAgICAgICA6IHJvdGF0aW9uTGFtYmRhKGRlbHRhTGFtYmRhKSkKICAgICAgICA6IChkZWx0YVBoaSB8fCBkZWx0YUdhbW1hID8gcm90YXRpb25QaGlHYW1tYShkZWx0YVBoaSwgZGVsdGFHYW1tYSkKICAgICAgICA6IHJvdGF0aW9uSWRlbnRpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcndhcmRSb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkgewogICAgICByZXR1cm4gZnVuY3Rpb24obGFtYmRhLCBwaGkpIHsKICAgICAgICByZXR1cm4gbGFtYmRhICs9IGRlbHRhTGFtYmRhLCBbbGFtYmRhID4gcGkkMyA/IGxhbWJkYSAtIHRhdSQzIDogbGFtYmRhIDwgLXBpJDMgPyBsYW1iZGEgKyB0YXUkMyA6IGxhbWJkYSwgcGhpXTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiByb3RhdGlvbkxhbWJkYShkZWx0YUxhbWJkYSkgewogICAgICB2YXIgcm90YXRpb24gPSBmb3J3YXJkUm90YXRpb25MYW1iZGEoZGVsdGFMYW1iZGEpOwogICAgICByb3RhdGlvbi5pbnZlcnQgPSBmb3J3YXJkUm90YXRpb25MYW1iZGEoLWRlbHRhTGFtYmRhKTsKICAgICAgcmV0dXJuIHJvdGF0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIHJvdGF0aW9uUGhpR2FtbWEoZGVsdGFQaGksIGRlbHRhR2FtbWEpIHsKICAgICAgdmFyIGNvc0RlbHRhUGhpID0gY29zJDEoZGVsdGFQaGkpLAogICAgICAgICAgc2luRGVsdGFQaGkgPSBzaW4kMShkZWx0YVBoaSksCiAgICAgICAgICBjb3NEZWx0YUdhbW1hID0gY29zJDEoZGVsdGFHYW1tYSksCiAgICAgICAgICBzaW5EZWx0YUdhbW1hID0gc2luJDEoZGVsdGFHYW1tYSk7CgogICAgICBmdW5jdGlvbiByb3RhdGlvbihsYW1iZGEsIHBoaSkgewogICAgICAgIHZhciBjb3NQaGkgPSBjb3MkMShwaGkpLAogICAgICAgICAgICB4ID0gY29zJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICAgICAgeSA9IHNpbiQxKGxhbWJkYSkgKiBjb3NQaGksCiAgICAgICAgICAgIHogPSBzaW4kMShwaGkpLAogICAgICAgICAgICBrID0geiAqIGNvc0RlbHRhUGhpICsgeCAqIHNpbkRlbHRhUGhpOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICBhdGFuMih5ICogY29zRGVsdGFHYW1tYSAtIGsgKiBzaW5EZWx0YUdhbW1hLCB4ICogY29zRGVsdGFQaGkgLSB6ICogc2luRGVsdGFQaGkpLAogICAgICAgICAgYXNpbihrICogY29zRGVsdGFHYW1tYSArIHkgKiBzaW5EZWx0YUdhbW1hKQogICAgICAgIF07CiAgICAgIH0KCiAgICAgIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgdmFyIGNvc1BoaSA9IGNvcyQxKHBoaSksCiAgICAgICAgICAgIHggPSBjb3MkMShsYW1iZGEpICogY29zUGhpLAogICAgICAgICAgICB5ID0gc2luJDEobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICAgICAgeiA9IHNpbiQxKHBoaSksCiAgICAgICAgICAgIGsgPSB6ICogY29zRGVsdGFHYW1tYSAtIHkgKiBzaW5EZWx0YUdhbW1hOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICBhdGFuMih5ICogY29zRGVsdGFHYW1tYSArIHogKiBzaW5EZWx0YUdhbW1hLCB4ICogY29zRGVsdGFQaGkgKyBrICogc2luRGVsdGFQaGkpLAogICAgICAgICAgYXNpbihrICogY29zRGVsdGFQaGkgLSB4ICogc2luRGVsdGFQaGkpCiAgICAgICAgXTsKICAgICAgfTsKCiAgICAgIHJldHVybiByb3RhdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiByb3RhdGlvbihyb3RhdGUpIHsKICAgICAgcm90YXRlID0gcm90YXRlUmFkaWFucyhyb3RhdGVbMF0gKiByYWRpYW5zLCByb3RhdGVbMV0gKiByYWRpYW5zLCByb3RhdGUubGVuZ3RoID4gMiA/IHJvdGF0ZVsyXSAqIHJhZGlhbnMgOiAwKTsKCiAgICAgIGZ1bmN0aW9uIGZvcndhcmQoY29vcmRpbmF0ZXMpIHsKICAgICAgICBjb29yZGluYXRlcyA9IHJvdGF0ZShjb29yZGluYXRlc1swXSAqIHJhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogcmFkaWFucyk7CiAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcyQxLCBjb29yZGluYXRlczsKICAgICAgfQoKICAgICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlLmludmVydChjb29yZGluYXRlc1swXSAqIHJhZGlhbnMsIGNvb3JkaW5hdGVzWzFdICogcmFkaWFucyk7CiAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMkMSwgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcyQxLCBjb29yZGluYXRlczsKICAgICAgfTsKCiAgICAgIHJldHVybiBmb3J3YXJkOwogICAgfQoKICAgIC8vIEdlbmVyYXRlcyBhIGNpcmNsZSBjZW50ZXJlZCBhdCBbMMKwLCAwwrBdLCB3aXRoIGEgZ2l2ZW4gcmFkaXVzIGFuZCBwcmVjaXNpb24uCiAgICBmdW5jdGlvbiBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIHQwLCB0MSkgewogICAgICBpZiAoIWRlbHRhKSByZXR1cm47CiAgICAgIHZhciBjb3NSYWRpdXMgPSBjb3MkMShyYWRpdXMpLAogICAgICAgICAgc2luUmFkaXVzID0gc2luJDEocmFkaXVzKSwKICAgICAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTsKICAgICAgaWYgKHQwID09IG51bGwpIHsKICAgICAgICB0MCA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIHRhdSQzOwogICAgICAgIHQxID0gcmFkaXVzIC0gc3RlcCAvIDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdDAgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MCk7CiAgICAgICAgdDEgPSBjaXJjbGVSYWRpdXMoY29zUmFkaXVzLCB0MSk7CiAgICAgICAgaWYgKGRpcmVjdGlvbiA+IDAgPyB0MCA8IHQxIDogdDAgPiB0MSkgdDAgKz0gZGlyZWN0aW9uICogdGF1JDM7CiAgICAgIH0KICAgICAgZm9yICh2YXIgcG9pbnQsIHQgPSB0MDsgZGlyZWN0aW9uID4gMCA/IHQgPiB0MSA6IHQgPCB0MTsgdCAtPSBzdGVwKSB7CiAgICAgICAgcG9pbnQgPSBzcGhlcmljYWwoW2Nvc1JhZGl1cywgLXNpblJhZGl1cyAqIGNvcyQxKHQpLCAtc2luUmFkaXVzICogc2luJDEodCldKTsKICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKTsKICAgICAgfQogICAgfQoKICAgIC8vIFJldHVybnMgdGhlIHNpZ25lZCBhbmdsZSBvZiBhIGNhcnRlc2lhbiBwb2ludCByZWxhdGl2ZSB0byBbY29zUmFkaXVzLCAwLCAwXS4KICAgIGZ1bmN0aW9uIGNpcmNsZVJhZGl1cyhjb3NSYWRpdXMsIHBvaW50KSB7CiAgICAgIHBvaW50ID0gY2FydGVzaWFuKHBvaW50KSwgcG9pbnRbMF0gLT0gY29zUmFkaXVzOwogICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKHBvaW50KTsKICAgICAgdmFyIHJhZGl1cyA9IGFjb3MoLXBvaW50WzFdKTsKICAgICAgcmV0dXJuICgoLXBvaW50WzJdIDwgMCA/IC1yYWRpdXMgOiByYWRpdXMpICsgdGF1JDMgLSBlcHNpbG9uJDIpICUgdGF1JDM7CiAgICB9CgogICAgZnVuY3Rpb24gY2lyY2xlKCkgewogICAgICB2YXIgY2VudGVyID0gY29uc3RhbnQkOChbMCwgMF0pLAogICAgICAgICAgcmFkaXVzID0gY29uc3RhbnQkOCg5MCksCiAgICAgICAgICBwcmVjaXNpb24gPSBjb25zdGFudCQ4KDYpLAogICAgICAgICAgcmluZywKICAgICAgICAgIHJvdGF0ZSwKICAgICAgICAgIHN0cmVhbSA9IHtwb2ludDogcG9pbnR9OwoKICAgICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkgewogICAgICAgIHJpbmcucHVzaCh4ID0gcm90YXRlKHgsIHkpKTsKICAgICAgICB4WzBdICo9IGRlZ3JlZXMkMSwgeFsxXSAqPSBkZWdyZWVzJDE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNpcmNsZSgpIHsKICAgICAgICB2YXIgYyA9IGNlbnRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgICAgICByID0gcmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zLAogICAgICAgICAgICBwID0gcHJlY2lzaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zOwogICAgICAgIHJpbmcgPSBbXTsKICAgICAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKC1jWzBdICogcmFkaWFucywgLWNbMV0gKiByYWRpYW5zLCAwKS5pbnZlcnQ7CiAgICAgICAgY2lyY2xlU3RyZWFtKHN0cmVhbSwgciwgcCwgMSk7CiAgICAgICAgYyA9IHt0eXBlOiAiUG9seWdvbiIsIGNvb3JkaW5hdGVzOiBbcmluZ119OwogICAgICAgIHJpbmcgPSByb3RhdGUgPSBudWxsOwogICAgICAgIHJldHVybiBjOwogICAgICB9CgogICAgICBjaXJjbGUuY2VudGVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNlbnRlciA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDgoWytfWzBdLCArX1sxXV0pLCBjaXJjbGUpIDogY2VudGVyOwogICAgICB9OwoKICAgICAgY2lyY2xlLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ4KCtfKSwgY2lyY2xlKSA6IHJhZGl1czsKICAgICAgfTsKCiAgICAgIGNpcmNsZS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2lzaW9uID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkOCgrXyksIGNpcmNsZSkgOiBwcmVjaXNpb247CiAgICAgIH07CgogICAgICByZXR1cm4gY2lyY2xlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsaXBCdWZmZXIoKSB7CiAgICAgIHZhciBsaW5lcyA9IFtdLAogICAgICAgICAgbGluZTsKICAgICAgcmV0dXJuIHsKICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSwgbSkgewogICAgICAgICAgbGluZS5wdXNoKFt4LCB5LCBtXSk7CiAgICAgICAgfSwKICAgICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbGluZXMucHVzaChsaW5lID0gW10pOwogICAgICAgIH0sCiAgICAgICAgbGluZUVuZDogbm9vcCQyLAogICAgICAgIHJlam9pbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5wb3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpOwogICAgICAgIH0sCiAgICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBsaW5lczsKICAgICAgICAgIGxpbmVzID0gW107CiAgICAgICAgICBsaW5lID0gbnVsbDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50RXF1YWwoYSwgYikgewogICAgICByZXR1cm4gYWJzKGFbMF0gLSBiWzBdKSA8IGVwc2lsb24kMiAmJiBhYnMoYVsxXSAtIGJbMV0pIDwgZXBzaWxvbiQyOwogICAgfQoKICAgIGZ1bmN0aW9uIEludGVyc2VjdGlvbihwb2ludCwgcG9pbnRzLCBvdGhlciwgZW50cnkpIHsKICAgICAgdGhpcy54ID0gcG9pbnQ7CiAgICAgIHRoaXMueiA9IHBvaW50czsKICAgICAgdGhpcy5vID0gb3RoZXI7IC8vIGFub3RoZXIgaW50ZXJzZWN0aW9uCiAgICAgIHRoaXMuZSA9IGVudHJ5OyAvLyBpcyBhbiBlbnRyeT8KICAgICAgdGhpcy52ID0gZmFsc2U7IC8vIHZpc2l0ZWQKICAgICAgdGhpcy5uID0gdGhpcy5wID0gbnVsbDsgLy8gbmV4dCAmIHByZXZpb3VzCiAgICB9CgogICAgLy8gQSBnZW5lcmFsaXplZCBwb2x5Z29uIGNsaXBwaW5nIGFsZ29yaXRobTogZ2l2ZW4gYSBwb2x5Z29uIHRoYXQgaGFzIGJlZW4gY3V0CiAgICAvLyBpbnRvIGl0cyB2aXNpYmxlIGxpbmUgc2VnbWVudHMsIGFuZCByZWpvaW5zIHRoZSBzZWdtZW50cyBieSBpbnRlcnBvbGF0aW5nCiAgICAvLyBhbG9uZyB0aGUgY2xpcCBlZGdlLgogICAgZnVuY3Rpb24gY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pIHsKICAgICAgdmFyIHN1YmplY3QgPSBbXSwKICAgICAgICAgIGNsaXAgPSBbXSwKICAgICAgICAgIGksCiAgICAgICAgICBuOwoKICAgICAgc2VnbWVudHMuZm9yRWFjaChmdW5jdGlvbihzZWdtZW50KSB7CiAgICAgICAgaWYgKChuID0gc2VnbWVudC5sZW5ndGggLSAxKSA8PSAwKSByZXR1cm47CiAgICAgICAgdmFyIG4sIHAwID0gc2VnbWVudFswXSwgcDEgPSBzZWdtZW50W25dLCB4OwoKICAgICAgICBpZiAocG9pbnRFcXVhbChwMCwgcDEpKSB7CiAgICAgICAgICBpZiAoIXAwWzJdICYmICFwMVsyXSkgewogICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2ludCgocDAgPSBzZWdtZW50W2ldKVswXSwgcDBbMV0pOwogICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICAvLyBoYW5kbGUgZGVnZW5lcmF0ZSBjYXNlcyBieSBtb3ZpbmcgdGhlIHBvaW50CiAgICAgICAgICBwMVswXSArPSAyICogZXBzaWxvbiQyOwogICAgICAgIH0KCiAgICAgICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJzZWN0aW9uKHAwLCBzZWdtZW50LCBudWxsLCB0cnVlKSk7CiAgICAgICAgY2xpcC5wdXNoKHgubyA9IG5ldyBJbnRlcnNlY3Rpb24ocDAsIG51bGwsIHgsIGZhbHNlKSk7CiAgICAgICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJzZWN0aW9uKHAxLCBzZWdtZW50LCBudWxsLCBmYWxzZSkpOwogICAgICAgIGNsaXAucHVzaCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uKHAxLCBudWxsLCB4LCB0cnVlKSk7CiAgICAgIH0pOwoKICAgICAgaWYgKCFzdWJqZWN0Lmxlbmd0aCkgcmV0dXJuOwoKICAgICAgY2xpcC5zb3J0KGNvbXBhcmVJbnRlcnNlY3Rpb24pOwogICAgICBsaW5rJDEoc3ViamVjdCk7CiAgICAgIGxpbmskMShjbGlwKTsKCiAgICAgIGZvciAoaSA9IDAsIG4gPSBjbGlwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgIGNsaXBbaV0uZSA9IHN0YXJ0SW5zaWRlID0gIXN0YXJ0SW5zaWRlOwogICAgICB9CgogICAgICB2YXIgc3RhcnQgPSBzdWJqZWN0WzBdLAogICAgICAgICAgcG9pbnRzLAogICAgICAgICAgcG9pbnQ7CgogICAgICB3aGlsZSAoMSkgewogICAgICAgIC8vIEZpbmQgZmlyc3QgdW52aXNpdGVkIGludGVyc2VjdGlvbi4KICAgICAgICB2YXIgY3VycmVudCA9IHN0YXJ0LAogICAgICAgICAgICBpc1N1YmplY3QgPSB0cnVlOwogICAgICAgIHdoaWxlIChjdXJyZW50LnYpIGlmICgoY3VycmVudCA9IGN1cnJlbnQubikgPT09IHN0YXJ0KSByZXR1cm47CiAgICAgICAgcG9pbnRzID0gY3VycmVudC56OwogICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICBkbyB7CiAgICAgICAgICBjdXJyZW50LnYgPSBjdXJyZW50Lm8udiA9IHRydWU7CiAgICAgICAgICBpZiAoY3VycmVudC5lKSB7CiAgICAgICAgICAgIGlmIChpc1N1YmplY3QpIHsKICAgICAgICAgICAgICBmb3IgKGkgPSAwLCBuID0gcG9pbnRzLmxlbmd0aDsgaSA8IG47ICsraSkgc3RyZWFtLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQubi54LCAxLCBzdHJlYW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm47CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaXNTdWJqZWN0KSB7CiAgICAgICAgICAgICAgcG9pbnRzID0gY3VycmVudC5wLno7CiAgICAgICAgICAgICAgZm9yIChpID0gcG9pbnRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSBzdHJlYW0ucG9pbnQoKHBvaW50ID0gcG9pbnRzW2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGludGVycG9sYXRlKGN1cnJlbnQueCwgY3VycmVudC5wLngsIC0xLCBzdHJlYW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnA7CiAgICAgICAgICB9CiAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5vOwogICAgICAgICAgcG9pbnRzID0gY3VycmVudC56OwogICAgICAgICAgaXNTdWJqZWN0ID0gIWlzU3ViamVjdDsKICAgICAgICB9IHdoaWxlICghY3VycmVudC52KTsKICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbGluayQxKGFycmF5KSB7CiAgICAgIGlmICghKG4gPSBhcnJheS5sZW5ndGgpKSByZXR1cm47CiAgICAgIHZhciBuLAogICAgICAgICAgaSA9IDAsCiAgICAgICAgICBhID0gYXJyYXlbMF0sCiAgICAgICAgICBiOwogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGEubiA9IGIgPSBhcnJheVtpXTsKICAgICAgICBiLnAgPSBhOwogICAgICAgIGEgPSBiOwogICAgICB9CiAgICAgIGEubiA9IGIgPSBhcnJheVswXTsKICAgICAgYi5wID0gYTsKICAgIH0KCiAgICB2YXIgc3VtJDEgPSBhZGRlcigpOwoKICAgIGZ1bmN0aW9uIGxvbmdpdHVkZShwb2ludCkgewogICAgICBpZiAoYWJzKHBvaW50WzBdKSA8PSBwaSQzKQogICAgICAgIHJldHVybiBwb2ludFswXTsKICAgICAgZWxzZQogICAgICAgIHJldHVybiBzaWduKHBvaW50WzBdKSAqICgoYWJzKHBvaW50WzBdKSArIHBpJDMpICUgdGF1JDMgLSBwaSQzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2x5Z29uQ29udGFpbnMocG9seWdvbiwgcG9pbnQpIHsKICAgICAgdmFyIGxhbWJkYSA9IGxvbmdpdHVkZShwb2ludCksCiAgICAgICAgICBwaGkgPSBwb2ludFsxXSwKICAgICAgICAgIHNpblBoaSA9IHNpbiQxKHBoaSksCiAgICAgICAgICBub3JtYWwgPSBbc2luJDEobGFtYmRhKSwgLWNvcyQxKGxhbWJkYSksIDBdLAogICAgICAgICAgYW5nbGUgPSAwLAogICAgICAgICAgd2luZGluZyA9IDA7CgogICAgICBzdW0kMS5yZXNldCgpOwoKICAgICAgaWYgKHNpblBoaSA9PT0gMSkgcGhpID0gaGFsZlBpJDIgKyBlcHNpbG9uJDI7CiAgICAgIGVsc2UgaWYgKHNpblBoaSA9PT0gLTEpIHBoaSA9IC1oYWxmUGkkMiAtIGVwc2lsb24kMjsKCiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoIShtID0gKHJpbmcgPSBwb2x5Z29uW2ldKS5sZW5ndGgpKSBjb250aW51ZTsKICAgICAgICB2YXIgcmluZywKICAgICAgICAgICAgbSwKICAgICAgICAgICAgcG9pbnQwID0gcmluZ1ttIC0gMV0sCiAgICAgICAgICAgIGxhbWJkYTAgPSBsb25naXR1ZGUocG9pbnQwKSwKICAgICAgICAgICAgcGhpMCA9IHBvaW50MFsxXSAvIDIgKyBxdWFydGVyUGksCiAgICAgICAgICAgIHNpblBoaTAgPSBzaW4kMShwaGkwKSwKICAgICAgICAgICAgY29zUGhpMCA9IGNvcyQxKHBoaTApOwoKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraiwgbGFtYmRhMCA9IGxhbWJkYTEsIHNpblBoaTAgPSBzaW5QaGkxLCBjb3NQaGkwID0gY29zUGhpMSwgcG9pbnQwID0gcG9pbnQxKSB7CiAgICAgICAgICB2YXIgcG9pbnQxID0gcmluZ1tqXSwKICAgICAgICAgICAgICBsYW1iZGExID0gbG9uZ2l0dWRlKHBvaW50MSksCiAgICAgICAgICAgICAgcGhpMSA9IHBvaW50MVsxXSAvIDIgKyBxdWFydGVyUGksCiAgICAgICAgICAgICAgc2luUGhpMSA9IHNpbiQxKHBoaTEpLAogICAgICAgICAgICAgIGNvc1BoaTEgPSBjb3MkMShwaGkxKSwKICAgICAgICAgICAgICBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEwLAogICAgICAgICAgICAgIHNpZ24gPSBkZWx0YSA+PSAwID8gMSA6IC0xLAogICAgICAgICAgICAgIGFic0RlbHRhID0gc2lnbiAqIGRlbHRhLAogICAgICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFic0RlbHRhID4gcGkkMywKICAgICAgICAgICAgICBrID0gc2luUGhpMCAqIHNpblBoaTE7CgogICAgICAgICAgc3VtJDEuYWRkKGF0YW4yKGsgKiBzaWduICogc2luJDEoYWJzRGVsdGEpLCBjb3NQaGkwICogY29zUGhpMSArIGsgKiBjb3MkMShhYnNEZWx0YSkpKTsKICAgICAgICAgIGFuZ2xlICs9IGFudGltZXJpZGlhbiA/IGRlbHRhICsgc2lnbiAqIHRhdSQzIDogZGVsdGE7CgogICAgICAgICAgLy8gQXJlIHRoZSBsb25naXR1ZGVzIGVpdGhlciBzaWRlIG9mIHRoZSBwb2ludOKAmXMgbWVyaWRpYW4gKGxhbWJkYSksCiAgICAgICAgICAvLyBhbmQgYXJlIHRoZSBsYXRpdHVkZXMgc21hbGxlciB0aGFuIHRoZSBwYXJhbGxlbCAocGhpKT8KICAgICAgICAgIGlmIChhbnRpbWVyaWRpYW4gXiBsYW1iZGEwID49IGxhbWJkYSBeIGxhbWJkYTEgPj0gbGFtYmRhKSB7CiAgICAgICAgICAgIHZhciBhcmMgPSBjYXJ0ZXNpYW5Dcm9zcyhjYXJ0ZXNpYW4ocG9pbnQwKSwgY2FydGVzaWFuKHBvaW50MSkpOwogICAgICAgICAgICBjYXJ0ZXNpYW5Ob3JtYWxpemVJblBsYWNlKGFyYyk7CiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjYXJ0ZXNpYW5Dcm9zcyhub3JtYWwsIGFyYyk7CiAgICAgICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UoaW50ZXJzZWN0aW9uKTsKICAgICAgICAgICAgdmFyIHBoaUFyYyA9IChhbnRpbWVyaWRpYW4gXiBkZWx0YSA+PSAwID8gLTEgOiAxKSAqIGFzaW4oaW50ZXJzZWN0aW9uWzJdKTsKICAgICAgICAgICAgaWYgKHBoaSA+IHBoaUFyYyB8fCBwaGkgPT09IHBoaUFyYyAmJiAoYXJjWzBdIHx8IGFyY1sxXSkpIHsKICAgICAgICAgICAgICB3aW5kaW5nICs9IGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAxIDogLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEZpcnN0LCBkZXRlcm1pbmUgd2hldGhlciB0aGUgU291dGggcG9sZSBpcyBpbnNpZGUgb3Igb3V0c2lkZToKICAgICAgLy8KICAgICAgLy8gSXQgaXMgaW5zaWRlIGlmOgogICAgICAvLyAqIHRoZSBwb2x5Z29uIHdpbmRzIGFyb3VuZCBpdCBpbiBhIGNsb2Nrd2lzZSBkaXJlY3Rpb24uCiAgICAgIC8vICogdGhlIHBvbHlnb24gZG9lcyBub3QgKGN1bXVsYXRpdmVseSkgd2luZCBhcm91bmQgaXQsIGJ1dCBoYXMgYSBuZWdhdGl2ZQogICAgICAvLyAgIChjb3VudGVyLWNsb2Nrd2lzZSkgYXJlYS4KICAgICAgLy8KICAgICAgLy8gU2Vjb25kLCBjb3VudCB0aGUgKHNpZ25lZCkgbnVtYmVyIG9mIHRpbWVzIGEgc2VnbWVudCBjcm9zc2VzIGEgbGFtYmRhCiAgICAgIC8vIGZyb20gdGhlIHBvaW50IHRvIHRoZSBTb3V0aCBwb2xlLiAgSWYgaXQgaXMgemVybywgdGhlbiB0aGUgcG9pbnQgaXMgdGhlCiAgICAgIC8vIHNhbWUgc2lkZSBhcyB0aGUgU291dGggcG9sZS4KCiAgICAgIHJldHVybiAoYW5nbGUgPCAtZXBzaWxvbiQyIHx8IGFuZ2xlIDwgZXBzaWxvbiQyICYmIHN1bSQxIDwgLWVwc2lsb24kMikgXiAod2luZGluZyAmIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsaXAocG9pbnRWaXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHN0YXJ0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzaW5rKSB7CiAgICAgICAgdmFyIGxpbmUgPSBjbGlwTGluZShzaW5rKSwKICAgICAgICAgICAgcmluZ0J1ZmZlciA9IGNsaXBCdWZmZXIoKSwKICAgICAgICAgICAgcmluZ1NpbmsgPSBjbGlwTGluZShyaW5nQnVmZmVyKSwKICAgICAgICAgICAgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZSwKICAgICAgICAgICAgcG9seWdvbiwKICAgICAgICAgICAgc2VnbWVudHMsCiAgICAgICAgICAgIHJpbmc7CgogICAgICAgIHZhciBjbGlwID0gewogICAgICAgICAgcG9pbnQ6IHBvaW50LAogICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50UmluZzsKICAgICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgICAgIGNsaXAubGluZUVuZCA9IHJpbmdFbmQ7CiAgICAgICAgICAgIHNlZ21lbnRzID0gW107CiAgICAgICAgICAgIHBvbHlnb24gPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50OwogICAgICAgICAgICBjbGlwLmxpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgICAgICAgY2xpcC5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICAgICAgc2VnbWVudHMgPSBtZXJnZShzZWdtZW50cyk7CiAgICAgICAgICAgIHZhciBzdGFydEluc2lkZSA9IHBvbHlnb25Db250YWlucyhwb2x5Z29uLCBzdGFydCk7CiAgICAgICAgICAgIGlmIChzZWdtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgY2xpcFJlam9pbihzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzaW5rKTsKICAgICAgICAgICAgfSBlbHNlIGlmIChzdGFydEluc2lkZSkgewogICAgICAgICAgICAgIGlmICghcG9seWdvblN0YXJ0ZWQpIHNpbmsucG9seWdvblN0YXJ0KCksIHBvbHlnb25TdGFydGVkID0gdHJ1ZTsKICAgICAgICAgICAgICBzaW5rLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHNpbmspOwogICAgICAgICAgICAgIHNpbmsubGluZUVuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uRW5kKCksIHBvbHlnb25TdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgIHNlZ21lbnRzID0gcG9seWdvbiA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgc3BoZXJlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgc2luay5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgICAgc2luay5saW5lU3RhcnQoKTsKICAgICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgc2luayk7CiAgICAgICAgICAgIHNpbmsubGluZUVuZCgpOwogICAgICAgICAgICBzaW5rLnBvbHlnb25FbmQoKTsKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwb2ludChsYW1iZGEsIHBoaSkgewogICAgICAgICAgaWYgKHBvaW50VmlzaWJsZShsYW1iZGEsIHBoaSkpIHNpbmsucG9pbnQobGFtYmRhLCBwaGkpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcG9pbnRMaW5lKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgICBsaW5lLnBvaW50KGxhbWJkYSwgcGhpKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHsKICAgICAgICAgIGNsaXAucG9pbnQgPSBwb2ludExpbmU7CiAgICAgICAgICBsaW5lLmxpbmVTdGFydCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgICAgIGNsaXAucG9pbnQgPSBwb2ludDsKICAgICAgICAgIGxpbmUubGluZUVuZCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcG9pbnRSaW5nKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgICByaW5nLnB1c2goW2xhbWJkYSwgcGhpXSk7CiAgICAgICAgICByaW5nU2luay5wb2ludChsYW1iZGEsIHBoaSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7CiAgICAgICAgICByaW5nU2luay5saW5lU3RhcnQoKTsKICAgICAgICAgIHJpbmcgPSBbXTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgICAgICBwb2ludFJpbmcocmluZ1swXVswXSwgcmluZ1swXVsxXSk7CiAgICAgICAgICByaW5nU2luay5saW5lRW5kKCk7CgogICAgICAgICAgdmFyIGNsZWFuID0gcmluZ1NpbmsuY2xlYW4oKSwKICAgICAgICAgICAgICByaW5nU2VnbWVudHMgPSByaW5nQnVmZmVyLnJlc3VsdCgpLAogICAgICAgICAgICAgIGksIG4gPSByaW5nU2VnbWVudHMubGVuZ3RoLCBtLAogICAgICAgICAgICAgIHNlZ21lbnQsCiAgICAgICAgICAgICAgcG9pbnQ7CgogICAgICAgICAgcmluZy5wb3AoKTsKICAgICAgICAgIHBvbHlnb24ucHVzaChyaW5nKTsKICAgICAgICAgIHJpbmcgPSBudWxsOwoKICAgICAgICAgIGlmICghbikgcmV0dXJuOwoKICAgICAgICAgIC8vIE5vIGludGVyc2VjdGlvbnMuCiAgICAgICAgICBpZiAoY2xlYW4gJiAxKSB7CiAgICAgICAgICAgIHNlZ21lbnQgPSByaW5nU2VnbWVudHNbMF07CiAgICAgICAgICAgIGlmICgobSA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPiAwKSB7CiAgICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG07ICsraSkgc2luay5wb2ludCgocG9pbnQgPSBzZWdtZW50W2ldKVswXSwgcG9pbnRbMV0pOwogICAgICAgICAgICAgIHNpbmsubGluZUVuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBSZWpvaW4gY29ubmVjdGVkIHNlZ21lbnRzLgogICAgICAgICAgLy8gVE9ETyByZXVzZSByaW5nQnVmZmVyLnJlam9pbigpPwogICAgICAgICAgaWYgKG4gPiAxICYmIGNsZWFuICYgMikgcmluZ1NlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLnBvcCgpLmNvbmNhdChyaW5nU2VnbWVudHMuc2hpZnQoKSkpOwoKICAgICAgICAgIHNlZ21lbnRzLnB1c2gocmluZ1NlZ21lbnRzLmZpbHRlcih2YWxpZFNlZ21lbnQpKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjbGlwOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHZhbGlkU2VnbWVudChzZWdtZW50KSB7CiAgICAgIHJldHVybiBzZWdtZW50Lmxlbmd0aCA+IDE7CiAgICB9CgogICAgLy8gSW50ZXJzZWN0aW9ucyBhcmUgc29ydGVkIGFsb25nIHRoZSBjbGlwIGVkZ2UuIEZvciBib3RoIGFudGltZXJpZGlhbiBjdXR0aW5nCiAgICAvLyBhbmQgY2lyY2xlIGNsaXBwaW5nLCB0aGUgc2FtZSBjb21wYXJpc29uIGlzIHVzZWQuCiAgICBmdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uKGEsIGIpIHsKICAgICAgcmV0dXJuICgoYSA9IGEueClbMF0gPCAwID8gYVsxXSAtIGhhbGZQaSQyIC0gZXBzaWxvbiQyIDogaGFsZlBpJDIgLSBhWzFdKQogICAgICAgICAgIC0gKChiID0gYi54KVswXSA8IDAgPyBiWzFdIC0gaGFsZlBpJDIgLSBlcHNpbG9uJDIgOiBoYWxmUGkkMiAtIGJbMV0pOwogICAgfQoKICAgIHZhciBjbGlwQW50aW1lcmlkaWFuID0gY2xpcCgKICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9LAogICAgICBjbGlwQW50aW1lcmlkaWFuTGluZSwKICAgICAgY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlLAogICAgICBbLXBpJDMsIC1oYWxmUGkkMl0KICAgICk7CgogICAgLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlczogMCAtIHRoZXJlIHdlcmUKICAgIC8vIGludGVyc2VjdGlvbnMgb3IgdGhlIGxpbmUgd2FzIGVtcHR5OyAxIC0gbm8gaW50ZXJzZWN0aW9uczsgMiAtIHRoZXJlIHdlcmUKICAgIC8vIGludGVyc2VjdGlvbnMsIGFuZCB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgc2hvdWxkIGJlIHJlam9pbmVkLgogICAgZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkxpbmUoc3RyZWFtKSB7CiAgICAgIHZhciBsYW1iZGEwID0gTmFOLAogICAgICAgICAgcGhpMCA9IE5hTiwKICAgICAgICAgIHNpZ24wID0gTmFOLAogICAgICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnMKCiAgICAgIHJldHVybiB7CiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgIGNsZWFuID0gMTsKICAgICAgICB9LAogICAgICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGExLCBwaGkxKSB7CiAgICAgICAgICB2YXIgc2lnbjEgPSBsYW1iZGExID4gMCA/IHBpJDMgOiAtcGkkMywKICAgICAgICAgICAgICBkZWx0YSA9IGFicyhsYW1iZGExIC0gbGFtYmRhMCk7CiAgICAgICAgICBpZiAoYWJzKGRlbHRhIC0gcGkkMykgPCBlcHNpbG9uJDIpIHsgLy8gbGluZSBjcm9zc2VzIGEgcG9sZQogICAgICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMCwgcGhpMCA9IChwaGkwICsgcGhpMSkgLyAyID4gMCA/IGhhbGZQaSQyIDogLWhhbGZQaSQyKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTsKICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApOwogICAgICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMSwgcGhpMCk7CiAgICAgICAgICAgIGNsZWFuID0gMDsKICAgICAgICAgIH0gZWxzZSBpZiAoc2lnbjAgIT09IHNpZ24xICYmIGRlbHRhID49IHBpJDMpIHsgLy8gbGluZSBjcm9zc2VzIGFudGltZXJpZGlhbgogICAgICAgICAgICBpZiAoYWJzKGxhbWJkYTAgLSBzaWduMCkgPCBlcHNpbG9uJDIpIGxhbWJkYTAgLT0gc2lnbjAgKiBlcHNpbG9uJDI7IC8vIGhhbmRsZSBkZWdlbmVyYWNpZXMKICAgICAgICAgICAgaWYgKGFicyhsYW1iZGExIC0gc2lnbjEpIDwgZXBzaWxvbiQyKSBsYW1iZGExIC09IHNpZ24xICogZXBzaWxvbiQyOwogICAgICAgICAgICBwaGkwID0gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdChsYW1iZGEwLCBwaGkwLCBsYW1iZGExLCBwaGkxKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24wLCBwaGkwKTsKICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICBzdHJlYW0ucG9pbnQoc2lnbjEsIHBoaTApOwogICAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhMCA9IGxhbWJkYTEsIHBoaTAgPSBwaGkxKTsKICAgICAgICAgIHNpZ24wID0gc2lnbjE7CiAgICAgICAgfSwKICAgICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICBsYW1iZGEwID0gcGhpMCA9IE5hTjsKICAgICAgICB9LAogICAgICAgIGNsZWFuOiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAyIC0gY2xlYW47IC8vIGlmIGludGVyc2VjdGlvbnMsIHJlam9pbiBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0KGxhbWJkYTAsIHBoaTAsIGxhbWJkYTEsIHBoaTEpIHsKICAgICAgdmFyIGNvc1BoaTAsCiAgICAgICAgICBjb3NQaGkxLAogICAgICAgICAgc2luTGFtYmRhMExhbWJkYTEgPSBzaW4kMShsYW1iZGEwIC0gbGFtYmRhMSk7CiAgICAgIHJldHVybiBhYnMoc2luTGFtYmRhMExhbWJkYTEpID4gZXBzaWxvbiQyCiAgICAgICAgICA/IGF0YW4oKHNpbiQxKHBoaTApICogKGNvc1BoaTEgPSBjb3MkMShwaGkxKSkgKiBzaW4kMShsYW1iZGExKQogICAgICAgICAgICAgIC0gc2luJDEocGhpMSkgKiAoY29zUGhpMCA9IGNvcyQxKHBoaTApKSAqIHNpbiQxKGxhbWJkYTApKQogICAgICAgICAgICAgIC8gKGNvc1BoaTAgKiBjb3NQaGkxICogc2luTGFtYmRhMExhbWJkYTEpKQogICAgICAgICAgOiAocGhpMCArIHBoaTEpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7CiAgICAgIHZhciBwaGk7CiAgICAgIGlmIChmcm9tID09IG51bGwpIHsKICAgICAgICBwaGkgPSBkaXJlY3Rpb24gKiBoYWxmUGkkMjsKICAgICAgICBzdHJlYW0ucG9pbnQoLXBpJDMsIHBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KDAsIHBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KHBpJDMsIHBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KHBpJDMsIDApOwogICAgICAgIHN0cmVhbS5wb2ludChwaSQzLCAtcGhpKTsKICAgICAgICBzdHJlYW0ucG9pbnQoMCwgLXBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KC1waSQzLCAtcGhpKTsKICAgICAgICBzdHJlYW0ucG9pbnQoLXBpJDMsIDApOwogICAgICAgIHN0cmVhbS5wb2ludCgtcGkkMywgcGhpKTsKICAgICAgfSBlbHNlIGlmIChhYnMoZnJvbVswXSAtIHRvWzBdKSA+IGVwc2lsb24kMikgewogICAgICAgIHZhciBsYW1iZGEgPSBmcm9tWzBdIDwgdG9bMF0gPyBwaSQzIDogLXBpJDM7CiAgICAgICAgcGhpID0gZGlyZWN0aW9uICogbGFtYmRhIC8gMjsKICAgICAgICBzdHJlYW0ucG9pbnQoLWxhbWJkYSwgcGhpKTsKICAgICAgICBzdHJlYW0ucG9pbnQoMCwgcGhpKTsKICAgICAgICBzdHJlYW0ucG9pbnQobGFtYmRhLCBwaGkpOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbS5wb2ludCh0b1swXSwgdG9bMV0pOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY2xpcENpcmNsZShyYWRpdXMpIHsKICAgICAgdmFyIGNyID0gY29zJDEocmFkaXVzKSwKICAgICAgICAgIGRlbHRhID0gNiAqIHJhZGlhbnMsCiAgICAgICAgICBzbWFsbFJhZGl1cyA9IGNyID4gMCwKICAgICAgICAgIG5vdEhlbWlzcGhlcmUgPSBhYnMoY3IpID4gZXBzaWxvbiQyOyAvLyBUT0RPIG9wdGltaXNlIGZvciB0aGlzIGNvbW1vbiBjYXNlCgogICAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZShmcm9tLCB0bywgZGlyZWN0aW9uLCBzdHJlYW0pIHsKICAgICAgICBjaXJjbGVTdHJlYW0oc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIGZyb20sIHRvKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gdmlzaWJsZShsYW1iZGEsIHBoaSkgewogICAgICAgIHJldHVybiBjb3MkMShsYW1iZGEpICogY29zJDEocGhpKSA+IGNyOwogICAgICB9CgogICAgICAvLyBUYWtlcyBhIGxpbmUgYW5kIGN1dHMgaW50byB2aXNpYmxlIHNlZ21lbnRzLiBSZXR1cm4gdmFsdWVzIHVzZWQgZm9yIHBvbHlnb24KICAgICAgLy8gY2xpcHBpbmc6IDAgLSB0aGVyZSB3ZXJlIGludGVyc2VjdGlvbnMgb3IgdGhlIGxpbmUgd2FzIGVtcHR5OyAxIC0gbm8KICAgICAgLy8gaW50ZXJzZWN0aW9ucyAyIC0gdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzCiAgICAgIC8vIHNob3VsZCBiZSByZWpvaW5lZC4KICAgICAgZnVuY3Rpb24gY2xpcExpbmUoc3RyZWFtKSB7CiAgICAgICAgdmFyIHBvaW50MCwgLy8gcHJldmlvdXMgcG9pbnQKICAgICAgICAgICAgYzAsIC8vIGNvZGUgZm9yIHByZXZpb3VzIHBvaW50CiAgICAgICAgICAgIHYwLCAvLyB2aXNpYmlsaXR5IG9mIHByZXZpb3VzIHBvaW50CiAgICAgICAgICAgIHYwMCwgLy8gdmlzaWJpbGl0eSBvZiBmaXJzdCBwb2ludAogICAgICAgICAgICBjbGVhbjsgLy8gbm8gaW50ZXJzZWN0aW9ucwogICAgICAgIHJldHVybiB7CiAgICAgICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICB2MDAgPSB2MCA9IGZhbHNlOwogICAgICAgICAgICBjbGVhbiA9IDE7CiAgICAgICAgICB9LAogICAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgICAgIHZhciBwb2ludDEgPSBbbGFtYmRhLCBwaGldLAogICAgICAgICAgICAgICAgcG9pbnQyLAogICAgICAgICAgICAgICAgdiA9IHZpc2libGUobGFtYmRhLCBwaGkpLAogICAgICAgICAgICAgICAgYyA9IHNtYWxsUmFkaXVzCiAgICAgICAgICAgICAgICAgID8gdiA/IDAgOiBjb2RlKGxhbWJkYSwgcGhpKQogICAgICAgICAgICAgICAgICA6IHYgPyBjb2RlKGxhbWJkYSArIChsYW1iZGEgPCAwID8gcGkkMyA6IC1waSQzKSwgcGhpKSA6IDA7CiAgICAgICAgICAgIGlmICghcG9pbnQwICYmICh2MDAgPSB2MCA9IHYpKSBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgIGlmICh2ICE9PSB2MCkgewogICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAgICAgICAgaWYgKCFwb2ludDIgfHwgcG9pbnRFcXVhbChwb2ludDAsIHBvaW50MikgfHwgcG9pbnRFcXVhbChwb2ludDEsIHBvaW50MikpCiAgICAgICAgICAgICAgICBwb2ludDFbMl0gPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2ICE9PSB2MCkgewogICAgICAgICAgICAgIGNsZWFuID0gMDsKICAgICAgICAgICAgICBpZiAodikgewogICAgICAgICAgICAgICAgLy8gb3V0c2lkZSBnb2luZyBpbgogICAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwKTsKICAgICAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSk7CiAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGluc2lkZSBnb2luZyBvdXQKICAgICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQyWzBdLCBwb2ludDJbMV0sIDIpOwogICAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcG9pbnQwID0gcG9pbnQyOwogICAgICAgICAgICB9IGVsc2UgaWYgKG5vdEhlbWlzcGhlcmUgJiYgcG9pbnQwICYmIHNtYWxsUmFkaXVzIF4gdikgewogICAgICAgICAgICAgIHZhciB0OwogICAgICAgICAgICAgIC8vIElmIHRoZSBjb2RlcyBmb3IgdHdvIHBvaW50cyBhcmUgZGlmZmVyZW50LCBvciBhcmUgYm90aCB6ZXJvLAogICAgICAgICAgICAgIC8vIGFuZCB0aGVyZSB0aGlzIHNlZ21lbnQgaW50ZXJzZWN0cyB3aXRoIHRoZSBzbWFsbCBjaXJjbGUuCiAgICAgICAgICAgICAgaWYgKCEoYyAmIGMwKSAmJiAodCA9IGludGVyc2VjdChwb2ludDEsIHBvaW50MCwgdHJ1ZSkpKSB7CiAgICAgICAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgICAgICAgICBpZiAoc21hbGxSYWRpdXMpIHsKICAgICAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSk7CiAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTsKICAgICAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzFdWzBdLCB0WzFdWzFdKTsKICAgICAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQodFswXVswXSwgdFswXVsxXSwgMyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh2ICYmICghcG9pbnQwIHx8ICFwb2ludEVxdWFsKHBvaW50MCwgcG9pbnQxKSkpIHsKICAgICAgICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnQxWzBdLCBwb2ludDFbMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBvaW50MCA9IHBvaW50MSwgdjAgPSB2LCBjMCA9IGM7CiAgICAgICAgICB9LAogICAgICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIGlmICh2MCkgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgcG9pbnQwID0gbnVsbDsKICAgICAgICAgIH0sCiAgICAgICAgICAvLyBSZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMgaWYgdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zIGFuZCB0aGUgZmlyc3QKICAgICAgICAgIC8vIGFuZCBsYXN0IHBvaW50cyB3ZXJlIHZpc2libGUuCiAgICAgICAgICBjbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiBjbGVhbiB8ICgodjAwICYmIHYwKSA8PCAxKTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICAvLyBJbnRlcnNlY3RzIHRoZSBncmVhdCBjaXJjbGUgYmV0d2VlbiBhIGFuZCBiIHdpdGggdGhlIGNsaXAgY2lyY2xlLgogICAgICBmdW5jdGlvbiBpbnRlcnNlY3QoYSwgYiwgdHdvKSB7CiAgICAgICAgdmFyIHBhID0gY2FydGVzaWFuKGEpLAogICAgICAgICAgICBwYiA9IGNhcnRlc2lhbihiKTsKCiAgICAgICAgLy8gV2UgaGF2ZSB0d28gcGxhbmVzLCBuMS5wID0gZDEgYW5kIG4yLnAgPSBkMi4KICAgICAgICAvLyBGaW5kIGludGVyc2VjdGlvbiBsaW5lIHAodCkgPSBjMSBuMSArIGMyIG4yICsgdCAobjEg4qivIG4yKS4KICAgICAgICB2YXIgbjEgPSBbMSwgMCwgMF0sIC8vIG5vcm1hbAogICAgICAgICAgICBuMiA9IGNhcnRlc2lhbkNyb3NzKHBhLCBwYiksCiAgICAgICAgICAgIG4ybjIgPSBjYXJ0ZXNpYW5Eb3QobjIsIG4yKSwKICAgICAgICAgICAgbjFuMiA9IG4yWzBdLCAvLyBjYXJ0ZXNpYW5Eb3QobjEsIG4yKSwKICAgICAgICAgICAgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7CgogICAgICAgIC8vIFR3byBwb2xhciBwb2ludHMuCiAgICAgICAgaWYgKCFkZXRlcm1pbmFudCkgcmV0dXJuICF0d28gJiYgYTsKCiAgICAgICAgdmFyIGMxID0gIGNyICogbjJuMiAvIGRldGVybWluYW50LAogICAgICAgICAgICBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwKICAgICAgICAgICAgbjF4bjIgPSBjYXJ0ZXNpYW5Dcm9zcyhuMSwgbjIpLAogICAgICAgICAgICBBID0gY2FydGVzaWFuU2NhbGUobjEsIGMxKSwKICAgICAgICAgICAgQiA9IGNhcnRlc2lhblNjYWxlKG4yLCBjMik7CiAgICAgICAgY2FydGVzaWFuQWRkSW5QbGFjZShBLCBCKTsKCiAgICAgICAgLy8gU29sdmUgfHAodCl8XjIgPSAxLgogICAgICAgIHZhciB1ID0gbjF4bjIsCiAgICAgICAgICAgIHcgPSBjYXJ0ZXNpYW5Eb3QoQSwgdSksCiAgICAgICAgICAgIHV1ID0gY2FydGVzaWFuRG90KHUsIHUpLAogICAgICAgICAgICB0MiA9IHcgKiB3IC0gdXUgKiAoY2FydGVzaWFuRG90KEEsIEEpIC0gMSk7CgogICAgICAgIGlmICh0MiA8IDApIHJldHVybjsKCiAgICAgICAgdmFyIHQgPSBzcXJ0KHQyKSwKICAgICAgICAgICAgcSA9IGNhcnRlc2lhblNjYWxlKHUsICgtdyAtIHQpIC8gdXUpOwogICAgICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocSwgQSk7CiAgICAgICAgcSA9IHNwaGVyaWNhbChxKTsKCiAgICAgICAgaWYgKCF0d28pIHJldHVybiBxOwoKICAgICAgICAvLyBUd28gaW50ZXJzZWN0aW9uIHBvaW50cy4KICAgICAgICB2YXIgbGFtYmRhMCA9IGFbMF0sCiAgICAgICAgICAgIGxhbWJkYTEgPSBiWzBdLAogICAgICAgICAgICBwaGkwID0gYVsxXSwKICAgICAgICAgICAgcGhpMSA9IGJbMV0sCiAgICAgICAgICAgIHo7CgogICAgICAgIGlmIChsYW1iZGExIDwgbGFtYmRhMCkgeiA9IGxhbWJkYTAsIGxhbWJkYTAgPSBsYW1iZGExLCBsYW1iZGExID0gejsKCiAgICAgICAgdmFyIGRlbHRhID0gbGFtYmRhMSAtIGxhbWJkYTAsCiAgICAgICAgICAgIHBvbGFyID0gYWJzKGRlbHRhIC0gcGkkMykgPCBlcHNpbG9uJDIsCiAgICAgICAgICAgIG1lcmlkaWFuID0gcG9sYXIgfHwgZGVsdGEgPCBlcHNpbG9uJDI7CgogICAgICAgIGlmICghcG9sYXIgJiYgcGhpMSA8IHBoaTApIHogPSBwaGkwLCBwaGkwID0gcGhpMSwgcGhpMSA9IHo7CgogICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpcnN0IHBvaW50IGlzIGJldHdlZW4gYSBhbmQgYi4KICAgICAgICBpZiAobWVyaWRpYW4KICAgICAgICAgICAgPyBwb2xhcgogICAgICAgICAgICAgID8gcGhpMCArIHBoaTEgPiAwIF4gcVsxXSA8IChhYnMocVswXSAtIGxhbWJkYTApIDwgZXBzaWxvbiQyID8gcGhpMCA6IHBoaTEpCiAgICAgICAgICAgICAgOiBwaGkwIDw9IHFbMV0gJiYgcVsxXSA8PSBwaGkxCiAgICAgICAgICAgIDogZGVsdGEgPiBwaSQzIF4gKGxhbWJkYTAgPD0gcVswXSAmJiBxWzBdIDw9IGxhbWJkYTEpKSB7CiAgICAgICAgICB2YXIgcTEgPSBjYXJ0ZXNpYW5TY2FsZSh1LCAoLXcgKyB0KSAvIHV1KTsKICAgICAgICAgIGNhcnRlc2lhbkFkZEluUGxhY2UocTEsIEEpOwogICAgICAgICAgcmV0dXJuIFtxLCBzcGhlcmljYWwocTEpXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEdlbmVyYXRlcyBhIDQtYml0IHZlY3RvciByZXByZXNlbnRpbmcgdGhlIGxvY2F0aW9uIG9mIGEgcG9pbnQgcmVsYXRpdmUgdG8KICAgICAgLy8gdGhlIHNtYWxsIGNpcmNsZSdzIGJvdW5kaW5nIGJveC4KICAgICAgZnVuY3Rpb24gY29kZShsYW1iZGEsIHBoaSkgewogICAgICAgIHZhciByID0gc21hbGxSYWRpdXMgPyByYWRpdXMgOiBwaSQzIC0gcmFkaXVzLAogICAgICAgICAgICBjb2RlID0gMDsKICAgICAgICBpZiAobGFtYmRhIDwgLXIpIGNvZGUgfD0gMTsgLy8gbGVmdAogICAgICAgIGVsc2UgaWYgKGxhbWJkYSA+IHIpIGNvZGUgfD0gMjsgLy8gcmlnaHQKICAgICAgICBpZiAocGhpIDwgLXIpIGNvZGUgfD0gNDsgLy8gYmVsb3cKICAgICAgICBlbHNlIGlmIChwaGkgPiByKSBjb2RlIHw9IDg7IC8vIGFib3ZlCiAgICAgICAgcmV0dXJuIGNvZGU7CiAgICAgIH0KCiAgICAgIHJldHVybiBjbGlwKHZpc2libGUsIGNsaXBMaW5lLCBpbnRlcnBvbGF0ZSwgc21hbGxSYWRpdXMgPyBbMCwgLXJhZGl1c10gOiBbLXBpJDMsIHJhZGl1cyAtIHBpJDNdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgYXggPSBhWzBdLAogICAgICAgICAgYXkgPSBhWzFdLAogICAgICAgICAgYnggPSBiWzBdLAogICAgICAgICAgYnkgPSBiWzFdLAogICAgICAgICAgdDAgPSAwLAogICAgICAgICAgdDEgPSAxLAogICAgICAgICAgZHggPSBieCAtIGF4LAogICAgICAgICAgZHkgPSBieSAtIGF5LAogICAgICAgICAgcjsKCiAgICAgIHIgPSB4MCAtIGF4OwogICAgICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAgICAgIHIgLz0gZHg7CiAgICAgIGlmIChkeCA8IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0KCiAgICAgIHIgPSB4MSAtIGF4OwogICAgICBpZiAoIWR4ICYmIHIgPCAwKSByZXR1cm47CiAgICAgIHIgLz0gZHg7CiAgICAgIGlmIChkeCA8IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0KCiAgICAgIHIgPSB5MCAtIGF5OwogICAgICBpZiAoIWR5ICYmIHIgPiAwKSByZXR1cm47CiAgICAgIHIgLz0gZHk7CiAgICAgIGlmIChkeSA8IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0KCiAgICAgIHIgPSB5MSAtIGF5OwogICAgICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47CiAgICAgIHIgLz0gZHk7CiAgICAgIGlmIChkeSA8IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0KCiAgICAgIGlmICh0MCA+IDApIGFbMF0gPSBheCArIHQwICogZHgsIGFbMV0gPSBheSArIHQwICogZHk7CiAgICAgIGlmICh0MSA8IDEpIGJbMF0gPSBheCArIHQxICogZHgsIGJbMV0gPSBheSArIHQxICogZHk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHZhciBjbGlwTWF4ID0gMWU5LCBjbGlwTWluID0gLWNsaXBNYXg7CgogICAgLy8gVE9ETyBVc2UgZDMtcG9seWdvbuKAmXMgcG9seWdvbkNvbnRhaW5zIGhlcmUgZm9yIHRoZSByaW5nIGNoZWNrPwogICAgLy8gVE9ETyBFbGltaW5hdGUgZHVwbGljYXRlIGJ1ZmZlcmluZyBpbiBjbGlwQnVmZmVyIGFuZCBwb2x5Z29uLnB1c2g/CgogICAgZnVuY3Rpb24gY2xpcFJlY3RhbmdsZSh4MCwgeTAsIHgxLCB5MSkgewoKICAgICAgZnVuY3Rpb24gdmlzaWJsZSh4LCB5KSB7CiAgICAgICAgcmV0dXJuIHgwIDw9IHggJiYgeCA8PSB4MSAmJiB5MCA8PSB5ICYmIHkgPD0geTE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkgewogICAgICAgIHZhciBhID0gMCwgYTEgPSAwOwogICAgICAgIGlmIChmcm9tID09IG51bGwKICAgICAgICAgICAgfHwgKGEgPSBjb3JuZXIoZnJvbSwgZGlyZWN0aW9uKSkgIT09IChhMSA9IGNvcm5lcih0bywgZGlyZWN0aW9uKSkKICAgICAgICAgICAgfHwgY29tcGFyZVBvaW50KGZyb20sIHRvKSA8IDAgXiBkaXJlY3Rpb24gPiAwKSB7CiAgICAgICAgICBkbyBzdHJlYW0ucG9pbnQoYSA9PT0gMCB8fCBhID09PSAzID8geDAgOiB4MSwgYSA+IDEgPyB5MSA6IHkwKTsKICAgICAgICAgIHdoaWxlICgoYSA9IChhICsgZGlyZWN0aW9uICsgNCkgJSA0KSAhPT0gYTEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzdHJlYW0ucG9pbnQodG9bMF0sIHRvWzFdKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNvcm5lcihwLCBkaXJlY3Rpb24pIHsKICAgICAgICByZXR1cm4gYWJzKHBbMF0gLSB4MCkgPCBlcHNpbG9uJDIgPyBkaXJlY3Rpb24gPiAwID8gMCA6IDMKICAgICAgICAgICAgOiBhYnMocFswXSAtIHgxKSA8IGVwc2lsb24kMiA/IGRpcmVjdGlvbiA+IDAgPyAyIDogMQogICAgICAgICAgICA6IGFicyhwWzFdIC0geTApIDwgZXBzaWxvbiQyID8gZGlyZWN0aW9uID4gMCA/IDEgOiAwCiAgICAgICAgICAgIDogZGlyZWN0aW9uID4gMCA/IDMgOiAyOyAvLyBhYnMocFsxXSAtIHkxKSA8IGVwc2lsb24KICAgICAgfQoKICAgICAgZnVuY3Rpb24gY29tcGFyZUludGVyc2VjdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGNvbXBhcmVQb2ludChhLngsIGIueCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGNvbXBhcmVQb2ludChhLCBiKSB7CiAgICAgICAgdmFyIGNhID0gY29ybmVyKGEsIDEpLAogICAgICAgICAgICBjYiA9IGNvcm5lcihiLCAxKTsKICAgICAgICByZXR1cm4gY2EgIT09IGNiID8gY2EgLSBjYgogICAgICAgICAgICA6IGNhID09PSAwID8gYlsxXSAtIGFbMV0KICAgICAgICAgICAgOiBjYSA9PT0gMSA/IGFbMF0gLSBiWzBdCiAgICAgICAgICAgIDogY2EgPT09IDIgPyBhWzFdIC0gYlsxXQogICAgICAgICAgICA6IGJbMF0gLSBhWzBdOwogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgdmFyIGFjdGl2ZVN0cmVhbSA9IHN0cmVhbSwKICAgICAgICAgICAgYnVmZmVyU3RyZWFtID0gY2xpcEJ1ZmZlcigpLAogICAgICAgICAgICBzZWdtZW50cywKICAgICAgICAgICAgcG9seWdvbiwKICAgICAgICAgICAgcmluZywKICAgICAgICAgICAgeF9fLCB5X18sIHZfXywgLy8gZmlyc3QgcG9pbnQKICAgICAgICAgICAgeF8sIHlfLCB2XywgLy8gcHJldmlvdXMgcG9pbnQKICAgICAgICAgICAgZmlyc3QsCiAgICAgICAgICAgIGNsZWFuOwoKICAgICAgICB2YXIgY2xpcFN0cmVhbSA9IHsKICAgICAgICAgIHBvaW50OiBwb2ludCwKICAgICAgICAgIGxpbmVTdGFydDogbGluZVN0YXJ0LAogICAgICAgICAgbGluZUVuZDogbGluZUVuZCwKICAgICAgICAgIHBvbHlnb25TdGFydDogcG9seWdvblN0YXJ0LAogICAgICAgICAgcG9seWdvbkVuZDogcG9seWdvbkVuZAogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHsKICAgICAgICAgIGlmICh2aXNpYmxlKHgsIHkpKSBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwb2x5Z29uSW5zaWRlKCkgewogICAgICAgICAgdmFyIHdpbmRpbmcgPSAwOwoKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgZm9yICh2YXIgcmluZyA9IHBvbHlnb25baV0sIGogPSAxLCBtID0gcmluZy5sZW5ndGgsIHBvaW50ID0gcmluZ1swXSwgYTAsIGExLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICAgICAgYTAgPSBiMCwgYTEgPSBiMSwgcG9pbnQgPSByaW5nW2pdLCBiMCA9IHBvaW50WzBdLCBiMSA9IHBvaW50WzFdOwogICAgICAgICAgICAgIGlmIChhMSA8PSB5MSkgeyBpZiAoYjEgPiB5MSAmJiAoYjAgLSBhMCkgKiAoeTEgLSBhMSkgPiAoYjEgLSBhMSkgKiAoeDAgLSBhMCkpICsrd2luZGluZzsgfQogICAgICAgICAgICAgIGVsc2UgeyBpZiAoYjEgPD0geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpIDwgKGIxIC0gYTEpICogKHgwIC0gYTApKSAtLXdpbmRpbmc7IH0KICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIHJldHVybiB3aW5kaW5nOwogICAgICAgIH0KCiAgICAgICAgLy8gQnVmZmVyIGdlb21ldHJ5IHdpdGhpbiBhIHBvbHlnb24gYW5kIHRoZW4gY2xpcCBpdCBlbiBtYXNzZS4KICAgICAgICBmdW5jdGlvbiBwb2x5Z29uU3RhcnQoKSB7CiAgICAgICAgICBhY3RpdmVTdHJlYW0gPSBidWZmZXJTdHJlYW0sIHNlZ21lbnRzID0gW10sIHBvbHlnb24gPSBbXSwgY2xlYW4gPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcG9seWdvbkVuZCgpIHsKICAgICAgICAgIHZhciBzdGFydEluc2lkZSA9IHBvbHlnb25JbnNpZGUoKSwKICAgICAgICAgICAgICBjbGVhbkluc2lkZSA9IGNsZWFuICYmIHN0YXJ0SW5zaWRlLAogICAgICAgICAgICAgIHZpc2libGUgPSAoc2VnbWVudHMgPSBtZXJnZShzZWdtZW50cykpLmxlbmd0aDsKICAgICAgICAgIGlmIChjbGVhbkluc2lkZSB8fCB2aXNpYmxlKSB7CiAgICAgICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgICAgaWYgKGNsZWFuSW5zaWRlKSB7CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHN0cmVhbSk7CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgIGNsaXBSZWpvaW4oc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdHJlYW0ucG9seWdvbkVuZCgpOwogICAgICAgICAgfQogICAgICAgICAgYWN0aXZlU3RyZWFtID0gc3RyZWFtLCBzZWdtZW50cyA9IHBvbHlnb24gPSByaW5nID0gbnVsbDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxpbmVTdGFydCgpIHsKICAgICAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICAgICAgICBpZiAocG9seWdvbikgcG9seWdvbi5wdXNoKHJpbmcgPSBbXSk7CiAgICAgICAgICBmaXJzdCA9IHRydWU7CiAgICAgICAgICB2XyA9IGZhbHNlOwogICAgICAgICAgeF8gPSB5XyA9IE5hTjsKICAgICAgICB9CgogICAgICAgIC8vIFRPRE8gcmF0aGVyIHRoYW4gc3BlY2lhbC1jYXNlIHBvbHlnb25zLCBzaW1wbHkgaGFuZGxlIHRoZW0gc2VwYXJhdGVseS4KICAgICAgICAvLyBJZGVhbGx5LCBjb2luY2lkZW50IGludGVyc2VjdGlvbiBwb2ludHMgc2hvdWxkIGJlIGppdHRlcmVkIHRvIGF2b2lkCiAgICAgICAgLy8gY2xpcHBpbmcgaXNzdWVzLgogICAgICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgICAgICBpZiAoc2VnbWVudHMpIHsKICAgICAgICAgICAgbGluZVBvaW50KHhfXywgeV9fKTsKICAgICAgICAgICAgaWYgKHZfXyAmJiB2XykgYnVmZmVyU3RyZWFtLnJlam9pbigpOwogICAgICAgICAgICBzZWdtZW50cy5wdXNoKGJ1ZmZlclN0cmVhbS5yZXN1bHQoKSk7CiAgICAgICAgICB9CiAgICAgICAgICBjbGlwU3RyZWFtLnBvaW50ID0gcG9pbnQ7CiAgICAgICAgICBpZiAodl8pIGFjdGl2ZVN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lUG9pbnQoeCwgeSkgewogICAgICAgICAgdmFyIHYgPSB2aXNpYmxlKHgsIHkpOwogICAgICAgICAgaWYgKHBvbHlnb24pIHJpbmcucHVzaChbeCwgeV0pOwogICAgICAgICAgaWYgKGZpcnN0KSB7CiAgICAgICAgICAgIHhfXyA9IHgsIHlfXyA9IHksIHZfXyA9IHY7CiAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7CiAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKHYgJiYgdl8pIGFjdGl2ZVN0cmVhbS5wb2ludCh4LCB5KTsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgdmFyIGEgPSBbeF8gPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB4XykpLCB5XyA9IE1hdGgubWF4KGNsaXBNaW4sIE1hdGgubWluKGNsaXBNYXgsIHlfKSldLAogICAgICAgICAgICAgICAgICBiID0gW3ggPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB4KSksIHkgPSBNYXRoLm1heChjbGlwTWluLCBNYXRoLm1pbihjbGlwTWF4LCB5KSldOwogICAgICAgICAgICAgIGlmIChjbGlwTGluZShhLCBiLCB4MCwgeTAsIHgxLCB5MSkpIHsKICAgICAgICAgICAgICAgIGlmICghdl8pIHsKICAgICAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYVswXSwgYVsxXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoYlswXSwgYlsxXSk7CiAgICAgICAgICAgICAgICBpZiAoIXYpIGFjdGl2ZVN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAodikgewogICAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpOwogICAgICAgICAgICAgICAgY2xlYW4gPSBmYWxzZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHhfID0geCwgeV8gPSB5LCB2XyA9IHY7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2xpcFN0cmVhbTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRlbnQkMSgpIHsKICAgICAgdmFyIHgwID0gMCwKICAgICAgICAgIHkwID0gMCwKICAgICAgICAgIHgxID0gOTYwLAogICAgICAgICAgeTEgPSA1MDAsCiAgICAgICAgICBjYWNoZSwKICAgICAgICAgIGNhY2hlU3RyZWFtLAogICAgICAgICAgY2xpcDsKCiAgICAgIHJldHVybiBjbGlwID0gewogICAgICAgIHN0cmVhbTogZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgICByZXR1cm4gY2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSBjbGlwUmVjdGFuZ2xlKHgwLCB5MCwgeDEsIHkxKShjYWNoZVN0cmVhbSA9IHN0cmVhbSk7CiAgICAgICAgfSwKICAgICAgICBleHRlbnQ6IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0sIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsLCBjbGlwKSA6IFtbeDAsIHkwXSwgW3gxLCB5MV1dOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICB2YXIgbGVuZ3RoU3VtID0gYWRkZXIoKSwKICAgICAgICBsYW1iZGEwJDIsCiAgICAgICAgc2luUGhpMCQxLAogICAgICAgIGNvc1BoaTAkMTsKCiAgICB2YXIgbGVuZ3RoU3RyZWFtID0gewogICAgICBzcGhlcmU6IG5vb3AkMiwKICAgICAgcG9pbnQ6IG5vb3AkMiwKICAgICAgbGluZVN0YXJ0OiBsZW5ndGhMaW5lU3RhcnQsCiAgICAgIGxpbmVFbmQ6IG5vb3AkMiwKICAgICAgcG9seWdvblN0YXJ0OiBub29wJDIsCiAgICAgIHBvbHlnb25FbmQ6IG5vb3AkMgogICAgfTsKCiAgICBmdW5jdGlvbiBsZW5ndGhMaW5lU3RhcnQoKSB7CiAgICAgIGxlbmd0aFN0cmVhbS5wb2ludCA9IGxlbmd0aFBvaW50Rmlyc3Q7CiAgICAgIGxlbmd0aFN0cmVhbS5saW5lRW5kID0gbGVuZ3RoTGluZUVuZDsKICAgIH0KCiAgICBmdW5jdGlvbiBsZW5ndGhMaW5lRW5kKCkgewogICAgICBsZW5ndGhTdHJlYW0ucG9pbnQgPSBsZW5ndGhTdHJlYW0ubGluZUVuZCA9IG5vb3AkMjsKICAgIH0KCiAgICBmdW5jdGlvbiBsZW5ndGhQb2ludEZpcnN0KGxhbWJkYSwgcGhpKSB7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zLCBwaGkgKj0gcmFkaWFuczsKICAgICAgbGFtYmRhMCQyID0gbGFtYmRhLCBzaW5QaGkwJDEgPSBzaW4kMShwaGkpLCBjb3NQaGkwJDEgPSBjb3MkMShwaGkpOwogICAgICBsZW5ndGhTdHJlYW0ucG9pbnQgPSBsZW5ndGhQb2ludDsKICAgIH0KCiAgICBmdW5jdGlvbiBsZW5ndGhQb2ludChsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucywgcGhpICo9IHJhZGlhbnM7CiAgICAgIHZhciBzaW5QaGkgPSBzaW4kMShwaGkpLAogICAgICAgICAgY29zUGhpID0gY29zJDEocGhpKSwKICAgICAgICAgIGRlbHRhID0gYWJzKGxhbWJkYSAtIGxhbWJkYTAkMiksCiAgICAgICAgICBjb3NEZWx0YSA9IGNvcyQxKGRlbHRhKSwKICAgICAgICAgIHNpbkRlbHRhID0gc2luJDEoZGVsdGEpLAogICAgICAgICAgeCA9IGNvc1BoaSAqIHNpbkRlbHRhLAogICAgICAgICAgeSA9IGNvc1BoaTAkMSAqIHNpblBoaSAtIHNpblBoaTAkMSAqIGNvc1BoaSAqIGNvc0RlbHRhLAogICAgICAgICAgeiA9IHNpblBoaTAkMSAqIHNpblBoaSArIGNvc1BoaTAkMSAqIGNvc1BoaSAqIGNvc0RlbHRhOwogICAgICBsZW5ndGhTdW0uYWRkKGF0YW4yKHNxcnQoeCAqIHggKyB5ICogeSksIHopKTsKICAgICAgbGFtYmRhMCQyID0gbGFtYmRhLCBzaW5QaGkwJDEgPSBzaW5QaGksIGNvc1BoaTAkMSA9IGNvc1BoaTsKICAgIH0KCiAgICBmdW5jdGlvbiBsZW5ndGgkMShvYmplY3QpIHsKICAgICAgbGVuZ3RoU3VtLnJlc2V0KCk7CiAgICAgIGdlb1N0cmVhbShvYmplY3QsIGxlbmd0aFN0cmVhbSk7CiAgICAgIHJldHVybiArbGVuZ3RoU3VtOwogICAgfQoKICAgIHZhciBjb29yZGluYXRlcyA9IFtudWxsLCBudWxsXSwKICAgICAgICBvYmplY3QkMSA9IHt0eXBlOiAiTGluZVN0cmluZyIsIGNvb3JkaW5hdGVzOiBjb29yZGluYXRlc307CgogICAgZnVuY3Rpb24gZGlzdGFuY2UoYSwgYikgewogICAgICBjb29yZGluYXRlc1swXSA9IGE7CiAgICAgIGNvb3JkaW5hdGVzWzFdID0gYjsKICAgICAgcmV0dXJuIGxlbmd0aCQxKG9iamVjdCQxKTsKICAgIH0KCiAgICB2YXIgY29udGFpbnNPYmplY3RUeXBlID0gewogICAgICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zR2VvbWV0cnkob2JqZWN0Lmdlb21ldHJ5LCBwb2ludCk7CiAgICAgIH0sCiAgICAgIEZlYXR1cmVDb2xsZWN0aW9uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgdmFyIGZlYXR1cmVzID0gb2JqZWN0LmZlYXR1cmVzLCBpID0gLTEsIG4gPSBmZWF0dXJlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc0dlb21ldHJ5KGZlYXR1cmVzW2ldLmdlb21ldHJ5LCBwb2ludCkpIHJldHVybiB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgY29udGFpbnNHZW9tZXRyeVR5cGUgPSB7CiAgICAgIFNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCiAgICAgIFBvaW50OiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zUG9pbnQob2JqZWN0LmNvb3JkaW5hdGVzLCBwb2ludCk7CiAgICAgIH0sCiAgICAgIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBvYmplY3QuY29vcmRpbmF0ZXMsIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zUG9pbnQoY29vcmRpbmF0ZXNbaV0sIHBvaW50KSkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICBMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zTGluZShvYmplY3QuY29vcmRpbmF0ZXMsIHBvaW50KTsKICAgICAgfSwKICAgICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc0xpbmUoY29vcmRpbmF0ZXNbaV0sIHBvaW50KSkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICBQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zUG9seWdvbihvYmplY3QuY29vcmRpbmF0ZXMsIHBvaW50KTsKICAgICAgfSwKICAgICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc1BvbHlnb24oY29vcmRpbmF0ZXNbaV0sIHBvaW50KSkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAgICAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zR2VvbWV0cnkoZ2VvbWV0cmllc1tpXSwgcG9pbnQpKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY29udGFpbnNHZW9tZXRyeShnZW9tZXRyeSwgcG9pbnQpIHsKICAgICAgcmV0dXJuIGdlb21ldHJ5ICYmIGNvbnRhaW5zR2VvbWV0cnlUeXBlLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpCiAgICAgICAgICA/IGNvbnRhaW5zR2VvbWV0cnlUeXBlW2dlb21ldHJ5LnR5cGVdKGdlb21ldHJ5LCBwb2ludCkKICAgICAgICAgIDogZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gY29udGFpbnNQb2ludChjb29yZGluYXRlcywgcG9pbnQpIHsKICAgICAgcmV0dXJuIGRpc3RhbmNlKGNvb3JkaW5hdGVzLCBwb2ludCkgPT09IDA7CiAgICB9CgogICAgZnVuY3Rpb24gY29udGFpbnNMaW5lKGNvb3JkaW5hdGVzLCBwb2ludCkgewogICAgICB2YXIgYW8sIGJvLCBhYjsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7IGkgPCBuOyBpKyspIHsKICAgICAgICBibyA9IGRpc3RhbmNlKGNvb3JkaW5hdGVzW2ldLCBwb2ludCk7CiAgICAgICAgaWYgKGJvID09PSAwKSByZXR1cm4gdHJ1ZTsKICAgICAgICBpZiAoaSA+IDApIHsKICAgICAgICAgIGFiID0gZGlzdGFuY2UoY29vcmRpbmF0ZXNbaV0sIGNvb3JkaW5hdGVzW2kgLSAxXSk7CiAgICAgICAgICBpZiAoCiAgICAgICAgICAgIGFiID4gMCAmJgogICAgICAgICAgICBhbyA8PSBhYiAmJgogICAgICAgICAgICBibyA8PSBhYiAmJgogICAgICAgICAgICAoYW8gKyBibyAtIGFiKSAqICgxIC0gTWF0aC5wb3coKGFvIC0gYm8pIC8gYWIsIDIpKSA8IGVwc2lsb24yJDEgKiBhYgogICAgICAgICAgKQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgYW8gPSBibzsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgZnVuY3Rpb24gY29udGFpbnNQb2x5Z29uKGNvb3JkaW5hdGVzLCBwb2ludCkgewogICAgICByZXR1cm4gISFwb2x5Z29uQ29udGFpbnMoY29vcmRpbmF0ZXMubWFwKHJpbmdSYWRpYW5zKSwgcG9pbnRSYWRpYW5zKHBvaW50KSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmluZ1JhZGlhbnMocmluZykgewogICAgICByZXR1cm4gcmluZyA9IHJpbmcubWFwKHBvaW50UmFkaWFucyksIHJpbmcucG9wKCksIHJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnRSYWRpYW5zKHBvaW50KSB7CiAgICAgIHJldHVybiBbcG9pbnRbMF0gKiByYWRpYW5zLCBwb2ludFsxXSAqIHJhZGlhbnNdOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRhaW5zJDEob2JqZWN0LCBwb2ludCkgewogICAgICByZXR1cm4gKG9iamVjdCAmJiBjb250YWluc09iamVjdFR5cGUuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpCiAgICAgICAgICA/IGNvbnRhaW5zT2JqZWN0VHlwZVtvYmplY3QudHlwZV0KICAgICAgICAgIDogY29udGFpbnNHZW9tZXRyeSkob2JqZWN0LCBwb2ludCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ3JhdGljdWxlWCh5MCwgeTEsIGR5KSB7CiAgICAgIHZhciB5ID0gc2VxdWVuY2UoeTAsIHkxIC0gZXBzaWxvbiQyLCBkeSkuY29uY2F0KHkxKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHkubWFwKGZ1bmN0aW9uKHkpIHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07CiAgICB9CgogICAgZnVuY3Rpb24gZ3JhdGljdWxlWSh4MCwgeDEsIGR4KSB7CiAgICAgIHZhciB4ID0gc2VxdWVuY2UoeDAsIHgxIC0gZXBzaWxvbiQyLCBkeCkuY29uY2F0KHgxKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHgubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07CiAgICB9CgogICAgZnVuY3Rpb24gZ3JhdGljdWxlKCkgewogICAgICB2YXIgeDEsIHgwLCBYMSwgWDAsCiAgICAgICAgICB5MSwgeTAsIFkxLCBZMCwKICAgICAgICAgIGR4ID0gMTAsIGR5ID0gZHgsIERYID0gOTAsIERZID0gMzYwLAogICAgICAgICAgeCwgeSwgWCwgWSwKICAgICAgICAgIHByZWNpc2lvbiA9IDIuNTsKCiAgICAgIGZ1bmN0aW9uIGdyYXRpY3VsZSgpIHsKICAgICAgICByZXR1cm4ge3R5cGU6ICJNdWx0aUxpbmVTdHJpbmciLCBjb29yZGluYXRlczogbGluZXMoKX07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGxpbmVzKCkgewogICAgICAgIHJldHVybiBzZXF1ZW5jZShjZWlsKFgwIC8gRFgpICogRFgsIFgxLCBEWCkubWFwKFgpCiAgICAgICAgICAgIC5jb25jYXQoc2VxdWVuY2UoY2VpbChZMCAvIERZKSAqIERZLCBZMSwgRFkpLm1hcChZKSkKICAgICAgICAgICAgLmNvbmNhdChzZXF1ZW5jZShjZWlsKHgwIC8gZHgpICogZHgsIHgxLCBkeCkuZmlsdGVyKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIGFicyh4ICUgRFgpID4gZXBzaWxvbiQyOyB9KS5tYXAoeCkpCiAgICAgICAgICAgIC5jb25jYXQoc2VxdWVuY2UoY2VpbCh5MCAvIGR5KSAqIGR5LCB5MSwgZHkpLmZpbHRlcihmdW5jdGlvbih5KSB7IHJldHVybiBhYnMoeSAlIERZKSA+IGVwc2lsb24kMjsgfSkubWFwKHkpKTsKICAgICAgfQoKICAgICAgZ3JhdGljdWxlLmxpbmVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGxpbmVzKCkubWFwKGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7IHJldHVybiB7dHlwZTogIkxpbmVTdHJpbmciLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9OyB9KTsKICAgICAgfTsKCiAgICAgIGdyYXRpY3VsZS5vdXRsaW5lID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHR5cGU6ICJQb2x5Z29uIiwKICAgICAgICAgIGNvb3JkaW5hdGVzOiBbCiAgICAgICAgICAgIFgoWDApLmNvbmNhdCgKICAgICAgICAgICAgWShZMSkuc2xpY2UoMSksCiAgICAgICAgICAgIFgoWDEpLnJldmVyc2UoKS5zbGljZSgxKSwKICAgICAgICAgICAgWShZMCkucmV2ZXJzZSgpLnNsaWNlKDEpKQogICAgICAgICAgXQogICAgICAgIH07CiAgICAgIH07CgogICAgICBncmF0aWN1bGUuZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5leHRlbnRNaW5vcigpOwogICAgICAgIHJldHVybiBncmF0aWN1bGUuZXh0ZW50TWFqb3IoXykuZXh0ZW50TWlub3IoXyk7CiAgICAgIH07CgogICAgICBncmF0aWN1bGUuZXh0ZW50TWFqb3IgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW1tYMCwgWTBdLCBbWDEsIFkxXV07CiAgICAgICAgWDAgPSArX1swXVswXSwgWDEgPSArX1sxXVswXTsKICAgICAgICBZMCA9ICtfWzBdWzFdLCBZMSA9ICtfWzFdWzFdOwogICAgICAgIGlmIChYMCA+IFgxKSBfID0gWDAsIFgwID0gWDEsIFgxID0gXzsKICAgICAgICBpZiAoWTAgPiBZMSkgXyA9IFkwLCBZMCA9IFkxLCBZMSA9IF87CiAgICAgICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTsKICAgICAgfTsKCiAgICAgIGdyYXRpY3VsZS5leHRlbnRNaW5vciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgICAgICB4MCA9ICtfWzBdWzBdLCB4MSA9ICtfWzFdWzBdOwogICAgICAgIHkwID0gK19bMF1bMV0sIHkxID0gK19bMV1bMV07CiAgICAgICAgaWYgKHgwID4geDEpIF8gPSB4MCwgeDAgPSB4MSwgeDEgPSBfOwogICAgICAgIGlmICh5MCA+IHkxKSBfID0geTAsIHkwID0geTEsIHkxID0gXzsKICAgICAgICByZXR1cm4gZ3JhdGljdWxlLnByZWNpc2lvbihwcmVjaXNpb24pOwogICAgICB9OwoKICAgICAgZ3JhdGljdWxlLnN0ZXAgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZ3JhdGljdWxlLnN0ZXBNaW5vcigpOwogICAgICAgIHJldHVybiBncmF0aWN1bGUuc3RlcE1ham9yKF8pLnN0ZXBNaW5vcihfKTsKICAgICAgfTsKCiAgICAgIGdyYXRpY3VsZS5zdGVwTWFqb3IgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW0RYLCBEWV07CiAgICAgICAgRFggPSArX1swXSwgRFkgPSArX1sxXTsKICAgICAgICByZXR1cm4gZ3JhdGljdWxlOwogICAgICB9OwoKICAgICAgZ3JhdGljdWxlLnN0ZXBNaW5vciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBbZHgsIGR5XTsKICAgICAgICBkeCA9ICtfWzBdLCBkeSA9ICtfWzFdOwogICAgICAgIHJldHVybiBncmF0aWN1bGU7CiAgICAgIH07CgogICAgICBncmF0aWN1bGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHByZWNpc2lvbjsKICAgICAgICBwcmVjaXNpb24gPSArXzsKICAgICAgICB4ID0gZ3JhdGljdWxlWCh5MCwgeTEsIDkwKTsKICAgICAgICB5ID0gZ3JhdGljdWxlWSh4MCwgeDEsIHByZWNpc2lvbik7CiAgICAgICAgWCA9IGdyYXRpY3VsZVgoWTAsIFkxLCA5MCk7CiAgICAgICAgWSA9IGdyYXRpY3VsZVkoWDAsIFgxLCBwcmVjaXNpb24pOwogICAgICAgIHJldHVybiBncmF0aWN1bGU7CiAgICAgIH07CgogICAgICByZXR1cm4gZ3JhdGljdWxlCiAgICAgICAgICAuZXh0ZW50TWFqb3IoW1stMTgwLCAtOTAgKyBlcHNpbG9uJDJdLCBbMTgwLCA5MCAtIGVwc2lsb24kMl1dKQogICAgICAgICAgLmV4dGVudE1pbm9yKFtbLTE4MCwgLTgwIC0gZXBzaWxvbiQyXSwgWzE4MCwgODAgKyBlcHNpbG9uJDJdXSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ3JhdGljdWxlMTAoKSB7CiAgICAgIHJldHVybiBncmF0aWN1bGUoKSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlJDEoYSwgYikgewogICAgICB2YXIgeDAgPSBhWzBdICogcmFkaWFucywKICAgICAgICAgIHkwID0gYVsxXSAqIHJhZGlhbnMsCiAgICAgICAgICB4MSA9IGJbMF0gKiByYWRpYW5zLAogICAgICAgICAgeTEgPSBiWzFdICogcmFkaWFucywKICAgICAgICAgIGN5MCA9IGNvcyQxKHkwKSwKICAgICAgICAgIHN5MCA9IHNpbiQxKHkwKSwKICAgICAgICAgIGN5MSA9IGNvcyQxKHkxKSwKICAgICAgICAgIHN5MSA9IHNpbiQxKHkxKSwKICAgICAgICAgIGt4MCA9IGN5MCAqIGNvcyQxKHgwKSwKICAgICAgICAgIGt5MCA9IGN5MCAqIHNpbiQxKHgwKSwKICAgICAgICAgIGt4MSA9IGN5MSAqIGNvcyQxKHgxKSwKICAgICAgICAgIGt5MSA9IGN5MSAqIHNpbiQxKHgxKSwKICAgICAgICAgIGQgPSAyICogYXNpbihzcXJ0KGhhdmVyc2luKHkxIC0geTApICsgY3kwICogY3kxICogaGF2ZXJzaW4oeDEgLSB4MCkpKSwKICAgICAgICAgIGsgPSBzaW4kMShkKTsKCiAgICAgIHZhciBpbnRlcnBvbGF0ZSA9IGQgPyBmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIEIgPSBzaW4kMSh0ICo9IGQpIC8gaywKICAgICAgICAgICAgQSA9IHNpbiQxKGQgLSB0KSAvIGssCiAgICAgICAgICAgIHggPSBBICoga3gwICsgQiAqIGt4MSwKICAgICAgICAgICAgeSA9IEEgKiBreTAgKyBCICoga3kxLAogICAgICAgICAgICB6ID0gQSAqIHN5MCArIEIgKiBzeTE7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIGF0YW4yKHksIHgpICogZGVncmVlcyQxLAogICAgICAgICAgYXRhbjIoeiwgc3FydCh4ICogeCArIHkgKiB5KSkgKiBkZWdyZWVzJDEKICAgICAgICBdOwogICAgICB9IDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIFt4MCAqIGRlZ3JlZXMkMSwgeTAgKiBkZWdyZWVzJDFdOwogICAgICB9OwoKICAgICAgaW50ZXJwb2xhdGUuZGlzdGFuY2UgPSBkOwoKICAgICAgcmV0dXJuIGludGVycG9sYXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JDQoeCkgewogICAgICByZXR1cm4geDsKICAgIH0KCiAgICB2YXIgYXJlYVN1bSQxID0gYWRkZXIoKSwKICAgICAgICBhcmVhUmluZ1N1bSQxID0gYWRkZXIoKSwKICAgICAgICB4MDAsCiAgICAgICAgeTAwLAogICAgICAgIHgwJDEsCiAgICAgICAgeTAkMTsKCiAgICB2YXIgYXJlYVN0cmVhbSQxID0gewogICAgICBwb2ludDogbm9vcCQyLAogICAgICBsaW5lU3RhcnQ6IG5vb3AkMiwKICAgICAgbGluZUVuZDogbm9vcCQyLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGFyZWFTdHJlYW0kMS5saW5lU3RhcnQgPSBhcmVhUmluZ1N0YXJ0JDE7CiAgICAgICAgYXJlYVN0cmVhbSQxLmxpbmVFbmQgPSBhcmVhUmluZ0VuZCQxOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBhcmVhU3RyZWFtJDEubGluZVN0YXJ0ID0gYXJlYVN0cmVhbSQxLmxpbmVFbmQgPSBhcmVhU3RyZWFtJDEucG9pbnQgPSBub29wJDI7CiAgICAgICAgYXJlYVN1bSQxLmFkZChhYnMoYXJlYVJpbmdTdW0kMSkpOwogICAgICAgIGFyZWFSaW5nU3VtJDEucmVzZXQoKTsKICAgICAgfSwKICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJlYSA9IGFyZWFTdW0kMSAvIDI7CiAgICAgICAgYXJlYVN1bSQxLnJlc2V0KCk7CiAgICAgICAgcmV0dXJuIGFyZWE7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYXJlYVJpbmdTdGFydCQxKCkgewogICAgICBhcmVhU3RyZWFtJDEucG9pbnQgPSBhcmVhUG9pbnRGaXJzdCQxOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWFQb2ludEZpcnN0JDEoeCwgeSkgewogICAgICBhcmVhU3RyZWFtJDEucG9pbnQgPSBhcmVhUG9pbnQkMTsKICAgICAgeDAwID0geDAkMSA9IHgsIHkwMCA9IHkwJDEgPSB5OwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWFQb2ludCQxKHgsIHkpIHsKICAgICAgYXJlYVJpbmdTdW0kMS5hZGQoeTAkMSAqIHggLSB4MCQxICogeSk7CiAgICAgIHgwJDEgPSB4LCB5MCQxID0geTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhUmluZ0VuZCQxKCkgewogICAgICBhcmVhUG9pbnQkMSh4MDAsIHkwMCk7CiAgICB9CgogICAgdmFyIHgwJDIgPSBJbmZpbml0eSwKICAgICAgICB5MCQyID0geDAkMiwKICAgICAgICB4MSA9IC14MCQyLAogICAgICAgIHkxID0geDE7CgogICAgdmFyIGJvdW5kc1N0cmVhbSQxID0gewogICAgICBwb2ludDogYm91bmRzUG9pbnQkMSwKICAgICAgbGluZVN0YXJ0OiBub29wJDIsCiAgICAgIGxpbmVFbmQ6IG5vb3AkMiwKICAgICAgcG9seWdvblN0YXJ0OiBub29wJDIsCiAgICAgIHBvbHlnb25FbmQ6IG5vb3AkMiwKICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYm91bmRzID0gW1t4MCQyLCB5MCQyXSwgW3gxLCB5MV1dOwogICAgICAgIHgxID0geTEgPSAtKHkwJDIgPSB4MCQyID0gSW5maW5pdHkpOwogICAgICAgIHJldHVybiBib3VuZHM7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYm91bmRzUG9pbnQkMSh4LCB5KSB7CiAgICAgIGlmICh4IDwgeDAkMikgeDAkMiA9IHg7CiAgICAgIGlmICh4ID4geDEpIHgxID0geDsKICAgICAgaWYgKHkgPCB5MCQyKSB5MCQyID0geTsKICAgICAgaWYgKHkgPiB5MSkgeTEgPSB5OwogICAgfQoKICAgIC8vIFRPRE8gRW5mb3JjZSBwb3NpdGl2ZSBhcmVhIGZvciBleHRlcmlvciwgbmVnYXRpdmUgYXJlYSBmb3IgaW50ZXJpb3I/CgogICAgdmFyIFgwJDEgPSAwLAogICAgICAgIFkwJDEgPSAwLAogICAgICAgIFowJDEgPSAwLAogICAgICAgIFgxJDEgPSAwLAogICAgICAgIFkxJDEgPSAwLAogICAgICAgIFoxJDEgPSAwLAogICAgICAgIFgyJDEgPSAwLAogICAgICAgIFkyJDEgPSAwLAogICAgICAgIFoyJDEgPSAwLAogICAgICAgIHgwMCQxLAogICAgICAgIHkwMCQxLAogICAgICAgIHgwJDMsCiAgICAgICAgeTAkMzsKCiAgICB2YXIgY2VudHJvaWRTdHJlYW0kMSA9IHsKICAgICAgcG9pbnQ6IGNlbnRyb2lkUG9pbnQkMSwKICAgICAgbGluZVN0YXJ0OiBjZW50cm9pZExpbmVTdGFydCQxLAogICAgICBsaW5lRW5kOiBjZW50cm9pZExpbmVFbmQkMSwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBjZW50cm9pZFN0cmVhbSQxLmxpbmVTdGFydCA9IGNlbnRyb2lkUmluZ1N0YXJ0JDE7CiAgICAgICAgY2VudHJvaWRTdHJlYW0kMS5saW5lRW5kID0gY2VudHJvaWRSaW5nRW5kJDE7CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50JDE7CiAgICAgICAgY2VudHJvaWRTdHJlYW0kMS5saW5lU3RhcnQgPSBjZW50cm9pZExpbmVTdGFydCQxOwogICAgICAgIGNlbnRyb2lkU3RyZWFtJDEubGluZUVuZCA9IGNlbnRyb2lkTGluZUVuZCQxOwogICAgICB9LAogICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjZW50cm9pZCA9IFoyJDEgPyBbWDIkMSAvIFoyJDEsIFkyJDEgLyBaMiQxXQogICAgICAgICAgICA6IFoxJDEgPyBbWDEkMSAvIFoxJDEsIFkxJDEgLyBaMSQxXQogICAgICAgICAgICA6IFowJDEgPyBbWDAkMSAvIFowJDEsIFkwJDEgLyBaMCQxXQogICAgICAgICAgICA6IFtOYU4sIE5hTl07CiAgICAgICAgWDAkMSA9IFkwJDEgPSBaMCQxID0KICAgICAgICBYMSQxID0gWTEkMSA9IFoxJDEgPQogICAgICAgIFgyJDEgPSBZMiQxID0gWjIkMSA9IDA7CiAgICAgICAgcmV0dXJuIGNlbnRyb2lkOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnQkMSh4LCB5KSB7CiAgICAgIFgwJDEgKz0geDsKICAgICAgWTAkMSArPSB5OwogICAgICArK1owJDE7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRMaW5lU3RhcnQkMSgpIHsKICAgICAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnRGaXJzdExpbmU7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRQb2ludEZpcnN0TGluZSh4LCB5KSB7CiAgICAgIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50TGluZTsKICAgICAgY2VudHJvaWRQb2ludCQxKHgwJDMgPSB4LCB5MCQzID0geSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRQb2ludExpbmUoeCwgeSkgewogICAgICB2YXIgZHggPSB4IC0geDAkMywgZHkgPSB5IC0geTAkMywgeiA9IHNxcnQoZHggKiBkeCArIGR5ICogZHkpOwogICAgICBYMSQxICs9IHogKiAoeDAkMyArIHgpIC8gMjsKICAgICAgWTEkMSArPSB6ICogKHkwJDMgKyB5KSAvIDI7CiAgICAgIFoxJDEgKz0gejsKICAgICAgY2VudHJvaWRQb2ludCQxKHgwJDMgPSB4LCB5MCQzID0geSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRMaW5lRW5kJDEoKSB7CiAgICAgIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50JDE7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nU3RhcnQkMSgpIHsKICAgICAgY2VudHJvaWRTdHJlYW0kMS5wb2ludCA9IGNlbnRyb2lkUG9pbnRGaXJzdFJpbmc7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nRW5kJDEoKSB7CiAgICAgIGNlbnRyb2lkUG9pbnRSaW5nKHgwMCQxLCB5MDAkMSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRQb2ludEZpcnN0UmluZyh4LCB5KSB7CiAgICAgIGNlbnRyb2lkU3RyZWFtJDEucG9pbnQgPSBjZW50cm9pZFBvaW50UmluZzsKICAgICAgY2VudHJvaWRQb2ludCQxKHgwMCQxID0geDAkMyA9IHgsIHkwMCQxID0geTAkMyA9IHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRSaW5nKHgsIHkpIHsKICAgICAgdmFyIGR4ID0geCAtIHgwJDMsCiAgICAgICAgICBkeSA9IHkgLSB5MCQzLAogICAgICAgICAgeiA9IHNxcnQoZHggKiBkeCArIGR5ICogZHkpOwoKICAgICAgWDEkMSArPSB6ICogKHgwJDMgKyB4KSAvIDI7CiAgICAgIFkxJDEgKz0geiAqICh5MCQzICsgeSkgLyAyOwogICAgICBaMSQxICs9IHo7CgogICAgICB6ID0geTAkMyAqIHggLSB4MCQzICogeTsKICAgICAgWDIkMSArPSB6ICogKHgwJDMgKyB4KTsKICAgICAgWTIkMSArPSB6ICogKHkwJDMgKyB5KTsKICAgICAgWjIkMSArPSB6ICogMzsKICAgICAgY2VudHJvaWRQb2ludCQxKHgwJDMgPSB4LCB5MCQzID0geSk7CiAgICB9CgogICAgZnVuY3Rpb24gUGF0aENvbnRleHQoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBQYXRoQ29udGV4dC5wcm90b3R5cGUgPSB7CiAgICAgIF9yYWRpdXM6IDQuNSwKICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gdGhpcy5fcmFkaXVzID0gXywgdGhpczsKICAgICAgfSwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lID09PSAwKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIHRoaXMuX3BvaW50ID0gTmFOOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogewogICAgICAgICAgICB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsKICAgICAgICAgICAgdGhpcy5fcG9pbnQgPSAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMTogewogICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHggKyB0aGlzLl9yYWRpdXMsIHkpOwogICAgICAgICAgICB0aGlzLl9jb250ZXh0LmFyYyh4LCB5LCB0aGlzLl9yYWRpdXMsIDAsIHRhdSQzKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICByZXN1bHQ6IG5vb3AkMgogICAgfTsKCiAgICB2YXIgbGVuZ3RoU3VtJDEgPSBhZGRlcigpLAogICAgICAgIGxlbmd0aFJpbmcsCiAgICAgICAgeDAwJDIsCiAgICAgICAgeTAwJDIsCiAgICAgICAgeDAkNCwKICAgICAgICB5MCQ0OwoKICAgIHZhciBsZW5ndGhTdHJlYW0kMSA9IHsKICAgICAgcG9pbnQ6IG5vb3AkMiwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBsZW5ndGhTdHJlYW0kMS5wb2ludCA9IGxlbmd0aFBvaW50Rmlyc3QkMTsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGxlbmd0aFJpbmcpIGxlbmd0aFBvaW50JDEoeDAwJDIsIHkwMCQyKTsKICAgICAgICBsZW5ndGhTdHJlYW0kMS5wb2ludCA9IG5vb3AkMjsKICAgICAgfSwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBsZW5ndGhSaW5nID0gdHJ1ZTsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgbGVuZ3RoUmluZyA9IG51bGw7CiAgICAgIH0sCiAgICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9ICtsZW5ndGhTdW0kMTsKICAgICAgICBsZW5ndGhTdW0kMS5yZXNldCgpOwogICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gbGVuZ3RoUG9pbnRGaXJzdCQxKHgsIHkpIHsKICAgICAgbGVuZ3RoU3RyZWFtJDEucG9pbnQgPSBsZW5ndGhQb2ludCQxOwogICAgICB4MDAkMiA9IHgwJDQgPSB4LCB5MDAkMiA9IHkwJDQgPSB5OwogICAgfQoKICAgIGZ1bmN0aW9uIGxlbmd0aFBvaW50JDEoeCwgeSkgewogICAgICB4MCQ0IC09IHgsIHkwJDQgLT0geTsKICAgICAgbGVuZ3RoU3VtJDEuYWRkKHNxcnQoeDAkNCAqIHgwJDQgKyB5MCQ0ICogeTAkNCkpOwogICAgICB4MCQ0ID0geCwgeTAkNCA9IHk7CiAgICB9CgogICAgZnVuY3Rpb24gUGF0aFN0cmluZygpIHsKICAgICAgdGhpcy5fc3RyaW5nID0gW107CiAgICB9CgogICAgUGF0aFN0cmluZy5wcm90b3R5cGUgPSB7CiAgICAgIF9yYWRpdXM6IDQuNSwKICAgICAgX2NpcmNsZTogY2lyY2xlJDEoNC41KSwKICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoKF8gPSArXykgIT09IHRoaXMuX3JhZGl1cykgdGhpcy5fcmFkaXVzID0gXywgdGhpcy5fY2lyY2xlID0gbnVsbDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lID09PSAwKSB0aGlzLl9zdHJpbmcucHVzaCgiWiIpOwogICAgICAgIHRoaXMuX3BvaW50ID0gTmFOOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogewogICAgICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSk7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goIkwiLCB4LCAiLCIsIHkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZSA9PSBudWxsKSB0aGlzLl9jaXJjbGUgPSBjaXJjbGUkMSh0aGlzLl9yYWRpdXMpOwogICAgICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSwgdGhpcy5fY2lyY2xlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9zdHJpbmcubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc3RyaW5nLmpvaW4oIiIpOwogICAgICAgICAgdGhpcy5fc3RyaW5nID0gW107CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY2lyY2xlJDEocmFkaXVzKSB7CiAgICAgIHJldHVybiAibTAsIiArIHJhZGl1cwogICAgICAgICAgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArIC0yICogcmFkaXVzCiAgICAgICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgMiAqIHJhZGl1cwogICAgICAgICAgKyAieiI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5kZXgkMShwcm9qZWN0aW9uLCBjb250ZXh0KSB7CiAgICAgIHZhciBwb2ludFJhZGl1cyA9IDQuNSwKICAgICAgICAgIHByb2plY3Rpb25TdHJlYW0sCiAgICAgICAgICBjb250ZXh0U3RyZWFtOwoKICAgICAgZnVuY3Rpb24gcGF0aChvYmplY3QpIHsKICAgICAgICBpZiAob2JqZWN0KSB7CiAgICAgICAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSBjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICAgIGdlb1N0cmVhbShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oY29udGV4dFN0cmVhbSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGV4dFN0cmVhbS5yZXN1bHQoKTsKICAgICAgfQoKICAgICAgcGF0aC5hcmVhID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShhcmVhU3RyZWFtJDEpKTsKICAgICAgICByZXR1cm4gYXJlYVN0cmVhbSQxLnJlc3VsdCgpOwogICAgICB9OwoKICAgICAgcGF0aC5tZWFzdXJlID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShsZW5ndGhTdHJlYW0kMSkpOwogICAgICAgIHJldHVybiBsZW5ndGhTdHJlYW0kMS5yZXN1bHQoKTsKICAgICAgfTsKCiAgICAgIHBhdGguYm91bmRzID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShib3VuZHNTdHJlYW0kMSkpOwogICAgICAgIHJldHVybiBib3VuZHNTdHJlYW0kMS5yZXN1bHQoKTsKICAgICAgfTsKCiAgICAgIHBhdGguY2VudHJvaWQgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICBnZW9TdHJlYW0ob2JqZWN0LCBwcm9qZWN0aW9uU3RyZWFtKGNlbnRyb2lkU3RyZWFtJDEpKTsKICAgICAgICByZXR1cm4gY2VudHJvaWRTdHJlYW0kMS5yZXN1bHQoKTsKICAgICAgfTsKCiAgICAgIHBhdGgucHJvamVjdGlvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwcm9qZWN0aW9uU3RyZWFtID0gXyA9PSBudWxsID8gKHByb2plY3Rpb24gPSBudWxsLCBpZGVudGl0eSQ0KSA6IChwcm9qZWN0aW9uID0gXykuc3RyZWFtLCBwYXRoKSA6IHByb2plY3Rpb247CiAgICAgIH07CgogICAgICBwYXRoLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gY29udGV4dDsKICAgICAgICBjb250ZXh0U3RyZWFtID0gXyA9PSBudWxsID8gKGNvbnRleHQgPSBudWxsLCBuZXcgUGF0aFN0cmluZykgOiBuZXcgUGF0aENvbnRleHQoY29udGV4dCA9IF8pOwogICAgICAgIGlmICh0eXBlb2YgcG9pbnRSYWRpdXMgIT09ICJmdW5jdGlvbiIpIGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMocG9pbnRSYWRpdXMpOwogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9OwoKICAgICAgcGF0aC5wb2ludFJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwb2ludFJhZGl1czsKICAgICAgICBwb2ludFJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IChjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtfKSwgK18pOwogICAgICAgIHJldHVybiBwYXRoOwogICAgICB9OwoKICAgICAgcmV0dXJuIHBhdGgucHJvamVjdGlvbihwcm9qZWN0aW9uKS5jb250ZXh0KGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybShtZXRob2RzKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgc3RyZWFtOiB0cmFuc2Zvcm1lcihtZXRob2RzKQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybWVyKG1ldGhvZHMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHZhciBzID0gbmV3IFRyYW5zZm9ybVN0cmVhbTsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gbWV0aG9kcykgc1trZXldID0gbWV0aG9kc1trZXldOwogICAgICAgIHMuc3RyZWFtID0gc3RyZWFtOwogICAgICAgIHJldHVybiBzOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIFRyYW5zZm9ybVN0cmVhbSgpIHt9CgogICAgVHJhbnNmb3JtU3RyZWFtLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRyYW5zZm9ybVN0cmVhbSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5zdHJlYW0ucG9pbnQoeCwgeSk7IH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnNwaGVyZSgpOyB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lU3RhcnQoKTsgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLmxpbmVFbmQoKTsgfSwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvblN0YXJ0KCk7IH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5wb2x5Z29uRW5kKCk7IH0KICAgIH07CgogICAgZnVuY3Rpb24gZml0KHByb2plY3Rpb24sIGZpdEJvdW5kcywgb2JqZWN0KSB7CiAgICAgIHZhciBjbGlwID0gcHJvamVjdGlvbi5jbGlwRXh0ZW50ICYmIHByb2plY3Rpb24uY2xpcEV4dGVudCgpOwogICAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLCAwXSk7CiAgICAgIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xpcEV4dGVudChudWxsKTsKICAgICAgZ2VvU3RyZWFtKG9iamVjdCwgcHJvamVjdGlvbi5zdHJlYW0oYm91bmRzU3RyZWFtJDEpKTsKICAgICAgZml0Qm91bmRzKGJvdW5kc1N0cmVhbSQxLnJlc3VsdCgpKTsKICAgICAgaWYgKGNsaXAgIT0gbnVsbCkgcHJvamVjdGlvbi5jbGlwRXh0ZW50KGNsaXApOwogICAgICByZXR1cm4gcHJvamVjdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXRFeHRlbnQocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3QpIHsKICAgICAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7CiAgICAgICAgdmFyIHcgPSBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sCiAgICAgICAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0sCiAgICAgICAgICAgIGsgPSBNYXRoLm1pbih3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSwgaCAvIChiWzFdWzFdIC0gYlswXVsxXSkpLAogICAgICAgICAgICB4ID0gK2V4dGVudFswXVswXSArICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMiwKICAgICAgICAgICAgeSA9ICtleHRlbnRbMF1bMV0gKyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7CiAgICAgICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTsKICAgICAgfSwgb2JqZWN0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXRTaXplKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCkgewogICAgICByZXR1cm4gZml0RXh0ZW50KHByb2plY3Rpb24sIFtbMCwgMF0sIHNpemVdLCBvYmplY3QpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpIHsKICAgICAgcmV0dXJuIGZpdChwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7CiAgICAgICAgdmFyIHcgPSArd2lkdGgsCiAgICAgICAgICAgIGsgPSB3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSwKICAgICAgICAgICAgeCA9ICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMiwKICAgICAgICAgICAgeSA9IC1rICogYlswXVsxXTsKICAgICAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pOwogICAgICB9LCBvYmplY3QpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCkgewogICAgICByZXR1cm4gZml0KHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHsKICAgICAgICB2YXIgaCA9ICtoZWlnaHQsCiAgICAgICAgICAgIGsgPSBoIC8gKGJbMV1bMV0gLSBiWzBdWzFdKSwKICAgICAgICAgICAgeCA9IC1rICogYlswXVswXSwKICAgICAgICAgICAgeSA9IChoIC0gayAqIChiWzFdWzFdICsgYlswXVsxXSkpIC8gMjsKICAgICAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pOwogICAgICB9LCBvYmplY3QpOwogICAgfQoKICAgIHZhciBtYXhEZXB0aCA9IDE2LCAvLyBtYXhpbXVtIGRlcHRoIG9mIHN1YmRpdmlzaW9uCiAgICAgICAgY29zTWluRGlzdGFuY2UgPSBjb3MkMSgzMCAqIHJhZGlhbnMpOyAvLyBjb3MobWluaW11bSBhbmd1bGFyIGRpc3RhbmNlKQoKICAgIGZ1bmN0aW9uIHJlc2FtcGxlKHByb2plY3QsIGRlbHRhMikgewogICAgICByZXR1cm4gK2RlbHRhMiA/IHJlc2FtcGxlJDEocHJvamVjdCwgZGVsdGEyKSA6IHJlc2FtcGxlTm9uZShwcm9qZWN0KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNhbXBsZU5vbmUocHJvamVjdCkgewogICAgICByZXR1cm4gdHJhbnNmb3JtZXIoewogICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgICB4ID0gcHJvamVjdCh4LCB5KTsKICAgICAgICAgIHRoaXMuc3RyZWFtLnBvaW50KHhbMF0sIHhbMV0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzYW1wbGUkMShwcm9qZWN0LCBkZWx0YTIpIHsKCiAgICAgIGZ1bmN0aW9uIHJlc2FtcGxlTGluZVRvKHgwLCB5MCwgbGFtYmRhMCwgYTAsIGIwLCBjMCwgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKSB7CiAgICAgICAgdmFyIGR4ID0geDEgLSB4MCwKICAgICAgICAgICAgZHkgPSB5MSAtIHkwLAogICAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICAgIGlmIChkMiA+IDQgKiBkZWx0YTIgJiYgZGVwdGgtLSkgewogICAgICAgICAgdmFyIGEgPSBhMCArIGExLAogICAgICAgICAgICAgIGIgPSBiMCArIGIxLAogICAgICAgICAgICAgIGMgPSBjMCArIGMxLAogICAgICAgICAgICAgIG0gPSBzcXJ0KGEgKiBhICsgYiAqIGIgKyBjICogYyksCiAgICAgICAgICAgICAgcGhpMiA9IGFzaW4oYyAvPSBtKSwKICAgICAgICAgICAgICBsYW1iZGEyID0gYWJzKGFicyhjKSAtIDEpIDwgZXBzaWxvbiQyIHx8IGFicyhsYW1iZGEwIC0gbGFtYmRhMSkgPCBlcHNpbG9uJDIgPyAobGFtYmRhMCArIGxhbWJkYTEpIC8gMiA6IGF0YW4yKGIsIGEpLAogICAgICAgICAgICAgIHAgPSBwcm9qZWN0KGxhbWJkYTIsIHBoaTIpLAogICAgICAgICAgICAgIHgyID0gcFswXSwKICAgICAgICAgICAgICB5MiA9IHBbMV0sCiAgICAgICAgICAgICAgZHgyID0geDIgLSB4MCwKICAgICAgICAgICAgICBkeTIgPSB5MiAtIHkwLAogICAgICAgICAgICAgIGR6ID0gZHkgKiBkeDIgLSBkeCAqIGR5MjsKICAgICAgICAgIGlmIChkeiAqIGR6IC8gZDIgPiBkZWx0YTIgLy8gcGVycGVuZGljdWxhciBwcm9qZWN0ZWQgZGlzdGFuY2UKICAgICAgICAgICAgICB8fCBhYnMoKGR4ICogZHgyICsgZHkgKiBkeTIpIC8gZDIgLSAwLjUpID4gMC4zIC8vIG1pZHBvaW50IGNsb3NlIHRvIGFuIGVuZAogICAgICAgICAgICAgIHx8IGEwICogYTEgKyBiMCAqIGIxICsgYzAgKiBjMSA8IGNvc01pbkRpc3RhbmNlKSB7IC8vIGFuZ3VsYXIgZGlzdGFuY2UKICAgICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MiwgeTIsIGxhbWJkYTIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHgyLCB5Mik7CiAgICAgICAgICAgIHJlc2FtcGxlTGluZVRvKHgyLCB5MiwgbGFtYmRhMiwgYSwgYiwgYywgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHZhciBsYW1iZGEwMCwgeDAwLCB5MDAsIGEwMCwgYjAwLCBjMDAsIC8vIGZpcnN0IHBvaW50CiAgICAgICAgICAgIGxhbWJkYTAsIHgwLCB5MCwgYTAsIGIwLCBjMDsgLy8gcHJldmlvdXMgcG9pbnQKCiAgICAgICAgdmFyIHJlc2FtcGxlU3RyZWFtID0gewogICAgICAgICAgcG9pbnQ6IHBvaW50LAogICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgc3RyZWFtLnBvbHlnb25TdGFydCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSByaW5nU3RhcnQ7IH0sCiAgICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsgc3RyZWFtLnBvbHlnb25FbmQoKTsgcmVzYW1wbGVTdHJlYW0ubGluZVN0YXJ0ID0gbGluZVN0YXJ0OyB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkgewogICAgICAgICAgeCA9IHByb2plY3QoeCwgeSk7CiAgICAgICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgICAgICB4MCA9IE5hTjsKICAgICAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50OwogICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbGluZVBvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgICAgICB2YXIgYyA9IGNhcnRlc2lhbihbbGFtYmRhLCBwaGldKSwgcCA9IHByb2plY3QobGFtYmRhLCBwaGkpOwogICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MCA9IHBbMF0sIHkwID0gcFsxXSwgbGFtYmRhMCA9IGxhbWJkYSwgYTAgPSBjWzBdLCBiMCA9IGNbMV0sIGMwID0gY1syXSwgbWF4RGVwdGgsIHN0cmVhbSk7CiAgICAgICAgICBzdHJlYW0ucG9pbnQoeDAsIHkwKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxpbmVFbmQoKSB7CiAgICAgICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IHBvaW50OwogICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHsKICAgICAgICAgIGxpbmVTdGFydCgpOwogICAgICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSByaW5nUG9pbnQ7CiAgICAgICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gcmluZ0VuZDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJpbmdQb2ludChsYW1iZGEsIHBoaSkgewogICAgICAgICAgbGluZVBvaW50KGxhbWJkYTAwID0gbGFtYmRhLCBwaGkpLCB4MDAgPSB4MCwgeTAwID0geTAsIGEwMCA9IGEwLCBiMDAgPSBiMCwgYzAwID0gYzA7CiAgICAgICAgICByZXNhbXBsZVN0cmVhbS5wb2ludCA9IGxpbmVQb2ludDsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJpbmdFbmQoKSB7CiAgICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgwMCwgeTAwLCBsYW1iZGEwMCwgYTAwLCBiMDAsIGMwMCwgbWF4RGVwdGgsIHN0cmVhbSk7CiAgICAgICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICAgIGxpbmVFbmQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNhbXBsZVN0cmVhbTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgdHJhbnNmb3JtUmFkaWFucyA9IHRyYW5zZm9ybWVyKHsKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB0aGlzLnN0cmVhbS5wb2ludCh4ICogcmFkaWFucywgeSAqIHJhZGlhbnMpOwogICAgICB9CiAgICB9KTsKCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1Sb3RhdGUocm90YXRlKSB7CiAgICAgIHJldHVybiB0cmFuc2Zvcm1lcih7CiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICAgIHZhciByID0gcm90YXRlKHgsIHkpOwogICAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sIHJbMV0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGUoaywgZHgsIGR5LCBzeCwgc3kpIHsKICAgICAgZnVuY3Rpb24gdHJhbnNmb3JtKHgsIHkpIHsKICAgICAgICB4ICo9IHN4OyB5ICo9IHN5OwogICAgICAgIHJldHVybiBbZHggKyBrICogeCwgZHkgLSBrICogeV07CiAgICAgIH0KICAgICAgdHJhbnNmb3JtLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICByZXR1cm4gWyh4IC0gZHgpIC8gayAqIHN4LCAoZHkgLSB5KSAvIGsgKiBzeV07CiAgICAgIH07CiAgICAgIHJldHVybiB0cmFuc2Zvcm07CiAgICB9CgogICAgZnVuY3Rpb24gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgZHgsIGR5LCBzeCwgc3ksIGFscGhhKSB7CiAgICAgIHZhciBjb3NBbHBoYSA9IGNvcyQxKGFscGhhKSwKICAgICAgICAgIHNpbkFscGhhID0gc2luJDEoYWxwaGEpLAogICAgICAgICAgYSA9IGNvc0FscGhhICogaywKICAgICAgICAgIGIgPSBzaW5BbHBoYSAqIGssCiAgICAgICAgICBhaSA9IGNvc0FscGhhIC8gaywKICAgICAgICAgIGJpID0gc2luQWxwaGEgLyBrLAogICAgICAgICAgY2kgPSAoc2luQWxwaGEgKiBkeSAtIGNvc0FscGhhICogZHgpIC8gaywKICAgICAgICAgIGZpID0gKHNpbkFscGhhICogZHggKyBjb3NBbHBoYSAqIGR5KSAvIGs7CiAgICAgIGZ1bmN0aW9uIHRyYW5zZm9ybSh4LCB5KSB7CiAgICAgICAgeCAqPSBzeDsgeSAqPSBzeTsKICAgICAgICByZXR1cm4gW2EgKiB4IC0gYiAqIHkgKyBkeCwgZHkgLSBiICogeCAtIGEgKiB5XTsKICAgICAgfQogICAgICB0cmFuc2Zvcm0uaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHJldHVybiBbc3ggKiAoYWkgKiB4IC0gYmkgKiB5ICsgY2kpLCBzeSAqIChmaSAtIGJpICogeCAtIGFpICogeSldOwogICAgICB9OwogICAgICByZXR1cm4gdHJhbnNmb3JtOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb2plY3Rpb24ocHJvamVjdCkgewogICAgICByZXR1cm4gcHJvamVjdGlvbk11dGF0b3IoZnVuY3Rpb24oKSB7IHJldHVybiBwcm9qZWN0OyB9KSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCkgewogICAgICB2YXIgcHJvamVjdCwKICAgICAgICAgIGsgPSAxNTAsIC8vIHNjYWxlCiAgICAgICAgICB4ID0gNDgwLCB5ID0gMjUwLCAvLyB0cmFuc2xhdGUKICAgICAgICAgIGxhbWJkYSA9IDAsIHBoaSA9IDAsIC8vIGNlbnRlcgogICAgICAgICAgZGVsdGFMYW1iZGEgPSAwLCBkZWx0YVBoaSA9IDAsIGRlbHRhR2FtbWEgPSAwLCByb3RhdGUsIC8vIHByZS1yb3RhdGUKICAgICAgICAgIGFscGhhID0gMCwgLy8gcG9zdC1yb3RhdGUgYW5nbGUKICAgICAgICAgIHN4ID0gMSwgLy8gcmVmbGVjdFgKICAgICAgICAgIHN5ID0gMSwgLy8gcmVmbGVjdFgKICAgICAgICAgIHRoZXRhID0gbnVsbCwgcHJlY2xpcCA9IGNsaXBBbnRpbWVyaWRpYW4sIC8vIHByZS1jbGlwIGFuZ2xlCiAgICAgICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTEsIHBvc3RjbGlwID0gaWRlbnRpdHkkNCwgLy8gcG9zdC1jbGlwIGV4dGVudAogICAgICAgICAgZGVsdGEyID0gMC41LCAvLyBwcmVjaXNpb24KICAgICAgICAgIHByb2plY3RSZXNhbXBsZSwKICAgICAgICAgIHByb2plY3RUcmFuc2Zvcm0sCiAgICAgICAgICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtLAogICAgICAgICAgY2FjaGUsCiAgICAgICAgICBjYWNoZVN0cmVhbTsKCiAgICAgIGZ1bmN0aW9uIHByb2plY3Rpb24ocG9pbnQpIHsKICAgICAgICByZXR1cm4gcHJvamVjdFJvdGF0ZVRyYW5zZm9ybShwb2ludFswXSAqIHJhZGlhbnMsIHBvaW50WzFdICogcmFkaWFucyk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGludmVydChwb2ludCkgewogICAgICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZVRyYW5zZm9ybS5pbnZlcnQocG9pbnRbMF0sIHBvaW50WzFdKTsKICAgICAgICByZXR1cm4gcG9pbnQgJiYgW3BvaW50WzBdICogZGVncmVlcyQxLCBwb2ludFsxXSAqIGRlZ3JlZXMkMV07CiAgICAgIH0KCiAgICAgIHByb2plY3Rpb24uc3RyZWFtID0gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtUmFkaWFucyh0cmFuc2Zvcm1Sb3RhdGUocm90YXRlKShwcmVjbGlwKHByb2plY3RSZXNhbXBsZShwb3N0Y2xpcChjYWNoZVN0cmVhbSA9IHN0cmVhbSkpKSkpOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5wcmVjbGlwID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSBfLCB0aGV0YSA9IHVuZGVmaW5lZCwgcmVzZXQoKSkgOiBwcmVjbGlwOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5wb3N0Y2xpcCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9IF8sIHgwID0geTAgPSB4MSA9IHkxID0gbnVsbCwgcmVzZXQoKSkgOiBwb3N0Y2xpcDsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uY2xpcEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNsaXAgPSArXyA/IGNsaXBDaXJjbGUodGhldGEgPSBfICogcmFkaWFucykgOiAodGhldGEgPSBudWxsLCBjbGlwQW50aW1lcmlkaWFuKSwgcmVzZXQoKSkgOiB0aGV0YSAqIGRlZ3JlZXMkMTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9IF8gPT0gbnVsbCA/ICh4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIGlkZW50aXR5JDQpIDogY2xpcFJlY3RhbmdsZSh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdKSwgcmVzZXQoKSkgOiB4MCA9PSBudWxsID8gbnVsbCA6IFtbeDAsIHkwXSwgW3gxLCB5MV1dOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrID0gK18sIHJlY2VudGVyKCkpIDogazsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24udHJhbnNsYXRlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSArX1swXSwgeSA9ICtfWzFdLCByZWNlbnRlcigpKSA6IFt4LCB5XTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uY2VudGVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxhbWJkYSA9IF9bMF0gJSAzNjAgKiByYWRpYW5zLCBwaGkgPSBfWzFdICUgMzYwICogcmFkaWFucywgcmVjZW50ZXIoKSkgOiBbbGFtYmRhICogZGVncmVlcyQxLCBwaGkgKiBkZWdyZWVzJDFdOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5yb3RhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVsdGFMYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucywgZGVsdGFQaGkgPSBfWzFdICUgMzYwICogcmFkaWFucywgZGVsdGFHYW1tYSA9IF8ubGVuZ3RoID4gMiA/IF9bMl0gJSAzNjAgKiByYWRpYW5zIDogMCwgcmVjZW50ZXIoKSkgOiBbZGVsdGFMYW1iZGEgKiBkZWdyZWVzJDEsIGRlbHRhUGhpICogZGVncmVlcyQxLCBkZWx0YUdhbW1hICogZGVncmVlcyQxXTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uYW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGEgPSBfICUgMzYwICogcmFkaWFucywgcmVjZW50ZXIoKSkgOiBhbHBoYSAqIGRlZ3JlZXMkMTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ggPSBfID8gLTEgOiAxLCByZWNlbnRlcigpKSA6IHN4IDwgMDsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24ucmVmbGVjdFkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3kgPSBfID8gLTEgOiAxLCByZWNlbnRlcigpKSA6IHN5IDwgMDsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24ucHJlY2lzaW9uID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByb2plY3RSZXNhbXBsZSA9IHJlc2FtcGxlKHByb2plY3RUcmFuc2Zvcm0sIGRlbHRhMiA9IF8gKiBfKSwgcmVzZXQoKSkgOiBzcXJ0KGRlbHRhMik7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEV4dGVudChwcm9qZWN0aW9uLCBleHRlbnQsIG9iamVjdCk7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLmZpdFNpemUgPSBmdW5jdGlvbihzaXplLCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0U2l6ZShwcm9qZWN0aW9uLCBzaXplLCBvYmplY3QpOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5maXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoLCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0V2lkdGgocHJvamVjdGlvbiwgd2lkdGgsIG9iamVjdCk7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCk7CiAgICAgIH07CgogICAgICBmdW5jdGlvbiByZWNlbnRlcigpIHsKICAgICAgICB2YXIgY2VudGVyID0gc2NhbGVUcmFuc2xhdGVSb3RhdGUoaywgMCwgMCwgc3gsIHN5LCBhbHBoYSkuYXBwbHkobnVsbCwgcHJvamVjdChsYW1iZGEsIHBoaSkpLAogICAgICAgICAgICB0cmFuc2Zvcm0gPSAoYWxwaGEgPyBzY2FsZVRyYW5zbGF0ZVJvdGF0ZSA6IHNjYWxlVHJhbnNsYXRlKShrLCB4IC0gY2VudGVyWzBdLCB5IC0gY2VudGVyWzFdLCBzeCwgc3ksIGFscGhhKTsKICAgICAgICByb3RhdGUgPSByb3RhdGVSYWRpYW5zKGRlbHRhTGFtYmRhLCBkZWx0YVBoaSwgZGVsdGFHYW1tYSk7CiAgICAgICAgcHJvamVjdFRyYW5zZm9ybSA9IGNvbXBvc2UocHJvamVjdCwgdHJhbnNmb3JtKTsKICAgICAgICBwcm9qZWN0Um90YXRlVHJhbnNmb3JtID0gY29tcG9zZShyb3RhdGUsIHByb2plY3RUcmFuc2Zvcm0pOwogICAgICAgIHByb2plY3RSZXNhbXBsZSA9IHJlc2FtcGxlKHByb2plY3RUcmFuc2Zvcm0sIGRlbHRhMik7CiAgICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgICAgIHJldHVybiBwcm9qZWN0aW9uOwogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcHJvamVjdCA9IHByb2plY3RBdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gcHJvamVjdC5pbnZlcnQgJiYgaW52ZXJ0OwogICAgICAgIHJldHVybiByZWNlbnRlcigpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljUHJvamVjdGlvbihwcm9qZWN0QXQpIHsKICAgICAgdmFyIHBoaTAgPSAwLAogICAgICAgICAgcGhpMSA9IHBpJDMgLyAzLAogICAgICAgICAgbSA9IHByb2plY3Rpb25NdXRhdG9yKHByb2plY3RBdCksCiAgICAgICAgICBwID0gbShwaGkwLCBwaGkxKTsKCiAgICAgIHAucGFyYWxsZWxzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gbShwaGkwID0gX1swXSAqIHJhZGlhbnMsIHBoaTEgPSBfWzFdICogcmFkaWFucykgOiBbcGhpMCAqIGRlZ3JlZXMkMSwgcGhpMSAqIGRlZ3JlZXMkMV07CiAgICAgIH07CgogICAgICByZXR1cm4gcDsKICAgIH0KCiAgICBmdW5jdGlvbiBjeWxpbmRyaWNhbEVxdWFsQXJlYVJhdyhwaGkwKSB7CiAgICAgIHZhciBjb3NQaGkwID0gY29zJDEocGhpMCk7CgogICAgICBmdW5jdGlvbiBmb3J3YXJkKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgcmV0dXJuIFtsYW1iZGEgKiBjb3NQaGkwLCBzaW4kMShwaGkpIC8gY29zUGhpMF07CiAgICAgIH0KCiAgICAgIGZvcndhcmQuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHJldHVybiBbeCAvIGNvc1BoaTAsIGFzaW4oeSAqIGNvc1BoaTApXTsKICAgICAgfTsKCiAgICAgIHJldHVybiBmb3J3YXJkOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljRXF1YWxBcmVhUmF3KHkwLCB5MSkgewogICAgICB2YXIgc3kwID0gc2luJDEoeTApLCBuID0gKHN5MCArIHNpbiQxKHkxKSkgLyAyOwoKICAgICAgLy8gQXJlIHRoZSBwYXJhbGxlbHMgc3ltbWV0cmljYWwgYXJvdW5kIHRoZSBFcXVhdG9yPwogICAgICBpZiAoYWJzKG4pIDwgZXBzaWxvbiQyKSByZXR1cm4gY3lsaW5kcmljYWxFcXVhbEFyZWFSYXcoeTApOwoKICAgICAgdmFyIGMgPSAxICsgc3kwICogKDIgKiBuIC0gc3kwKSwgcjAgPSBzcXJ0KGMpIC8gbjsKCiAgICAgIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkgewogICAgICAgIHZhciByID0gc3FydChjIC0gMiAqIG4gKiBzaW4kMSh5KSkgLyBuOwogICAgICAgIHJldHVybiBbciAqIHNpbiQxKHggKj0gbiksIHIwIC0gciAqIGNvcyQxKHgpXTsKICAgICAgfQoKICAgICAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdmFyIHIweSA9IHIwIC0geSwKICAgICAgICAgICAgbCA9IGF0YW4yKHgsIGFicyhyMHkpKSAqIHNpZ24ocjB5KTsKICAgICAgICBpZiAocjB5ICogbiA8IDApCiAgICAgICAgICBsIC09IHBpJDMgKiBzaWduKHgpICogc2lnbihyMHkpOwogICAgICAgIHJldHVybiBbbCAvIG4sIGFzaW4oKGMgLSAoeCAqIHggKyByMHkgKiByMHkpICogbiAqIG4pIC8gKDIgKiBuKSldOwogICAgICB9OwoKICAgICAgcmV0dXJuIHByb2plY3Q7CiAgICB9CgogICAgZnVuY3Rpb24gY29uaWNFcXVhbEFyZWEoKSB7CiAgICAgIHJldHVybiBjb25pY1Byb2plY3Rpb24oY29uaWNFcXVhbEFyZWFSYXcpCiAgICAgICAgICAuc2NhbGUoMTU1LjQyNCkKICAgICAgICAgIC5jZW50ZXIoWzAsIDMzLjY0NDJdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhbGJlcnMoKSB7CiAgICAgIHJldHVybiBjb25pY0VxdWFsQXJlYSgpCiAgICAgICAgICAucGFyYWxsZWxzKFsyOS41LCA0NS41XSkKICAgICAgICAgIC5zY2FsZSgxMDcwKQogICAgICAgICAgLnRyYW5zbGF0ZShbNDgwLCAyNTBdKQogICAgICAgICAgLnJvdGF0ZShbOTYsIDBdKQogICAgICAgICAgLmNlbnRlcihbLTAuNiwgMzguN10pOwogICAgfQoKICAgIC8vIFRoZSBwcm9qZWN0aW9ucyBtdXN0IGhhdmUgbXV0dWFsbHkgZXhjbHVzaXZlIGNsaXAgcmVnaW9ucyBvbiB0aGUgc3BoZXJlLAogICAgLy8gYXMgdGhpcyB3aWxsIGF2b2lkIGVtaXR0aW5nIGludGVybGVhdmluZyBsaW5lcyBhbmQgcG9seWdvbnMuCiAgICBmdW5jdGlvbiBtdWx0aXBsZXgoc3RyZWFtcykgewogICAgICB2YXIgbiA9IHN0cmVhbXMubGVuZ3RoOwogICAgICByZXR1cm4gewogICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvaW50KHgsIHkpOyB9LAogICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnNwaGVyZSgpOyB9LAogICAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLmxpbmVTdGFydCgpOyB9LAogICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5saW5lRW5kKCk7IH0sCiAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgdmFyIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHN0cmVhbXNbaV0ucG9seWdvblN0YXJ0KCk7IH0sCiAgICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25FbmQoKTsgfQogICAgICB9OwogICAgfQoKICAgIC8vIEEgY29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBjb25maWd1cmVkIGJ5IGRlZmF1bHQgZm9yCiAgICAvLyA5NjDDlzUwMC4gVGhlIHByb2plY3Rpb24gYWxzbyB3b3JrcyBxdWl0ZSB3ZWxsIGF0IDk2MMOXNjAwIGlmIHlvdSBjaGFuZ2UgdGhlCiAgICAvLyBzY2FsZSB0byAxMjg1IGFuZCBhZGp1c3QgdGhlIHRyYW5zbGF0ZSBhY2NvcmRpbmdseS4gVGhlIHNldCBvZiBzdGFuZGFyZAogICAgLy8gcGFyYWxsZWxzIGZvciBlYWNoIHJlZ2lvbiBjb21lcyBmcm9tIFVTR1MsIHdoaWNoIGlzIHB1Ymxpc2hlZCBoZXJlOgogICAgLy8gaHR0cDovL2Vnc2MudXNncy5nb3YvaXNiL3B1YnMvTWFwUHJvamVjdGlvbnMvcHJvamVjdGlvbnMuaHRtbCNhbGJlcnMKICAgIGZ1bmN0aW9uIGFsYmVyc1VzYSgpIHsKICAgICAgdmFyIGNhY2hlLAogICAgICAgICAgY2FjaGVTdHJlYW0sCiAgICAgICAgICBsb3dlcjQ4ID0gYWxiZXJzKCksIGxvd2VyNDhQb2ludCwKICAgICAgICAgIGFsYXNrYSA9IGNvbmljRXF1YWxBcmVhKCkucm90YXRlKFsxNTQsIDBdKS5jZW50ZXIoWy0yLCA1OC41XSkucGFyYWxsZWxzKFs1NSwgNjVdKSwgYWxhc2thUG9pbnQsIC8vIEVQU0c6MzMzOAogICAgICAgICAgaGF3YWlpID0gY29uaWNFcXVhbEFyZWEoKS5yb3RhdGUoWzE1NywgMF0pLmNlbnRlcihbLTMsIDE5LjldKS5wYXJhbGxlbHMoWzgsIDE4XSksIGhhd2FpaVBvaW50LCAvLyBFU1JJOjEwMjAwNwogICAgICAgICAgcG9pbnQsIHBvaW50U3RyZWFtID0ge3BvaW50OiBmdW5jdGlvbih4LCB5KSB7IHBvaW50ID0gW3gsIHldOyB9fTsKCiAgICAgIGZ1bmN0aW9uIGFsYmVyc1VzYShjb29yZGluYXRlcykgewogICAgICAgIHZhciB4ID0gY29vcmRpbmF0ZXNbMF0sIHkgPSBjb29yZGluYXRlc1sxXTsKICAgICAgICByZXR1cm4gcG9pbnQgPSBudWxsLAogICAgICAgICAgICAobG93ZXI0OFBvaW50LnBvaW50KHgsIHkpLCBwb2ludCkKICAgICAgICAgICAgfHwgKGFsYXNrYVBvaW50LnBvaW50KHgsIHkpLCBwb2ludCkKICAgICAgICAgICAgfHwgKGhhd2FpaVBvaW50LnBvaW50KHgsIHkpLCBwb2ludCk7CiAgICAgIH0KCiAgICAgIGFsYmVyc1VzYS5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgICAgIHZhciBrID0gbG93ZXI0OC5zY2FsZSgpLAogICAgICAgICAgICB0ID0gbG93ZXI0OC50cmFuc2xhdGUoKSwKICAgICAgICAgICAgeCA9IChjb29yZGluYXRlc1swXSAtIHRbMF0pIC8gaywKICAgICAgICAgICAgeSA9IChjb29yZGluYXRlc1sxXSAtIHRbMV0pIC8gazsKICAgICAgICByZXR1cm4gKHkgPj0gMC4xMjAgJiYgeSA8IDAuMjM0ICYmIHggPj0gLTAuNDI1ICYmIHggPCAtMC4yMTQgPyBhbGFza2EKICAgICAgICAgICAgOiB5ID49IDAuMTY2ICYmIHkgPCAwLjIzNCAmJiB4ID49IC0wLjIxNCAmJiB4IDwgLTAuMTE1ID8gaGF3YWlpCiAgICAgICAgICAgIDogbG93ZXI0OCkuaW52ZXJ0KGNvb3JkaW5hdGVzKTsKICAgICAgfTsKCiAgICAgIGFsYmVyc1VzYS5zdHJlYW0gPSBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICByZXR1cm4gY2FjaGUgJiYgY2FjaGVTdHJlYW0gPT09IHN0cmVhbSA/IGNhY2hlIDogY2FjaGUgPSBtdWx0aXBsZXgoW2xvd2VyNDguc3RyZWFtKGNhY2hlU3RyZWFtID0gc3RyZWFtKSwgYWxhc2thLnN0cmVhbShzdHJlYW0pLCBoYXdhaWkuc3RyZWFtKHN0cmVhbSldKTsKICAgICAgfTsKCiAgICAgIGFsYmVyc1VzYS5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC5wcmVjaXNpb24oKTsKICAgICAgICBsb3dlcjQ4LnByZWNpc2lvbihfKSwgYWxhc2thLnByZWNpc2lvbihfKSwgaGF3YWlpLnByZWNpc2lvbihfKTsKICAgICAgICByZXR1cm4gcmVzZXQoKTsKICAgICAgfTsKCiAgICAgIGFsYmVyc1VzYS5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnNjYWxlKCk7CiAgICAgICAgbG93ZXI0OC5zY2FsZShfKSwgYWxhc2thLnNjYWxlKF8gKiAwLjM1KSwgaGF3YWlpLnNjYWxlKF8pOwogICAgICAgIHJldHVybiBhbGJlcnNVc2EudHJhbnNsYXRlKGxvd2VyNDgudHJhbnNsYXRlKCkpOwogICAgICB9OwoKICAgICAgYWxiZXJzVXNhLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBsb3dlcjQ4LnRyYW5zbGF0ZSgpOwogICAgICAgIHZhciBrID0gbG93ZXI0OC5zY2FsZSgpLCB4ID0gK19bMF0sIHkgPSArX1sxXTsKCiAgICAgICAgbG93ZXI0OFBvaW50ID0gbG93ZXI0OAogICAgICAgICAgICAudHJhbnNsYXRlKF8pCiAgICAgICAgICAgIC5jbGlwRXh0ZW50KFtbeCAtIDAuNDU1ICogaywgeSAtIDAuMjM4ICoga10sIFt4ICsgMC40NTUgKiBrLCB5ICsgMC4yMzggKiBrXV0pCiAgICAgICAgICAgIC5zdHJlYW0ocG9pbnRTdHJlYW0pOwoKICAgICAgICBhbGFza2FQb2ludCA9IGFsYXNrYQogICAgICAgICAgICAudHJhbnNsYXRlKFt4IC0gMC4zMDcgKiBrLCB5ICsgMC4yMDEgKiBrXSkKICAgICAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC40MjUgKiBrICsgZXBzaWxvbiQyLCB5ICsgMC4xMjAgKiBrICsgZXBzaWxvbiQyXSwgW3ggLSAwLjIxNCAqIGsgLSBlcHNpbG9uJDIsIHkgKyAwLjIzNCAqIGsgLSBlcHNpbG9uJDJdXSkKICAgICAgICAgICAgLnN0cmVhbShwb2ludFN0cmVhbSk7CgogICAgICAgIGhhd2FpaVBvaW50ID0gaGF3YWlpCiAgICAgICAgICAgIC50cmFuc2xhdGUoW3ggLSAwLjIwNSAqIGssIHkgKyAwLjIxMiAqIGtdKQogICAgICAgICAgICAuY2xpcEV4dGVudChbW3ggLSAwLjIxNCAqIGsgKyBlcHNpbG9uJDIsIHkgKyAwLjE2NiAqIGsgKyBlcHNpbG9uJDJdLCBbeCAtIDAuMTE1ICogayAtIGVwc2lsb24kMiwgeSArIDAuMjM0ICogayAtIGVwc2lsb24kMl1dKQogICAgICAgICAgICAuc3RyZWFtKHBvaW50U3RyZWFtKTsKCiAgICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICAgIH07CgogICAgICBhbGJlcnNVc2EuZml0RXh0ZW50ID0gZnVuY3Rpb24oZXh0ZW50LCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0RXh0ZW50KGFsYmVyc1VzYSwgZXh0ZW50LCBvYmplY3QpOwogICAgICB9OwoKICAgICAgYWxiZXJzVXNhLmZpdFNpemUgPSBmdW5jdGlvbihzaXplLCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0U2l6ZShhbGJlcnNVc2EsIHNpemUsIG9iamVjdCk7CiAgICAgIH07CgogICAgICBhbGJlcnNVc2EuZml0V2lkdGggPSBmdW5jdGlvbih3aWR0aCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdFdpZHRoKGFsYmVyc1VzYSwgd2lkdGgsIG9iamVjdCk7CiAgICAgIH07CgogICAgICBhbGJlcnNVc2EuZml0SGVpZ2h0ID0gZnVuY3Rpb24oaGVpZ2h0LCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0SGVpZ2h0KGFsYmVyc1VzYSwgaGVpZ2h0LCBvYmplY3QpOwogICAgICB9OwoKICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgY2FjaGUgPSBjYWNoZVN0cmVhbSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGFsYmVyc1VzYTsKICAgICAgfQoKICAgICAgcmV0dXJuIGFsYmVyc1VzYS5zY2FsZSgxMDcwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhemltdXRoYWxSYXcoc2NhbGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB2YXIgY3ggPSBjb3MkMSh4KSwKICAgICAgICAgICAgY3kgPSBjb3MkMSh5KSwKICAgICAgICAgICAgayA9IHNjYWxlKGN4ICogY3kpOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICBrICogY3kgKiBzaW4kMSh4KSwKICAgICAgICAgIGsgKiBzaW4kMSh5KQogICAgICAgIF07CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhemltdXRoYWxJbnZlcnQoYW5nbGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB2YXIgeiA9IHNxcnQoeCAqIHggKyB5ICogeSksCiAgICAgICAgICAgIGMgPSBhbmdsZSh6KSwKICAgICAgICAgICAgc2MgPSBzaW4kMShjKSwKICAgICAgICAgICAgY2MgPSBjb3MkMShjKTsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgYXRhbjIoeCAqIHNjLCB6ICogY2MpLAogICAgICAgICAgYXNpbih6ICYmIHkgKiBzYyAvIHopCiAgICAgICAgXTsKICAgICAgfQogICAgfQoKICAgIHZhciBhemltdXRoYWxFcXVhbEFyZWFSYXcgPSBhemltdXRoYWxSYXcoZnVuY3Rpb24oY3hjeSkgewogICAgICByZXR1cm4gc3FydCgyIC8gKDEgKyBjeGN5KSk7CiAgICB9KTsKCiAgICBhemltdXRoYWxFcXVhbEFyZWFSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9uKHopIHsKICAgICAgcmV0dXJuIDIgKiBhc2luKHogLyAyKTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIGF6aW11dGhhbEVxdWFsQXJlYSgpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24oYXppbXV0aGFsRXF1YWxBcmVhUmF3KQogICAgICAgICAgLnNjYWxlKDEyNC43NSkKICAgICAgICAgIC5jbGlwQW5nbGUoMTgwIC0gMWUtMyk7CiAgICB9CgogICAgdmFyIGF6aW11dGhhbEVxdWlkaXN0YW50UmF3ID0gYXppbXV0aGFsUmF3KGZ1bmN0aW9uKGMpIHsKICAgICAgcmV0dXJuIChjID0gYWNvcyhjKSkgJiYgYyAvIHNpbiQxKGMpOwogICAgfSk7CgogICAgYXppbXV0aGFsRXF1aWRpc3RhbnRSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9uKHopIHsKICAgICAgcmV0dXJuIHo7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBhemltdXRoYWxFcXVpZGlzdGFudCgpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24oYXppbXV0aGFsRXF1aWRpc3RhbnRSYXcpCiAgICAgICAgICAuc2NhbGUoNzkuNDE4OCkKICAgICAgICAgIC5jbGlwQW5nbGUoMTgwIC0gMWUtMyk7CiAgICB9CgogICAgZnVuY3Rpb24gbWVyY2F0b3JSYXcobGFtYmRhLCBwaGkpIHsKICAgICAgcmV0dXJuIFtsYW1iZGEsIGxvZyh0YW4oKGhhbGZQaSQyICsgcGhpKSAvIDIpKV07CiAgICB9CgogICAgbWVyY2F0b3JSYXcuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICByZXR1cm4gW3gsIDIgKiBhdGFuKGV4cCh5KSkgLSBoYWxmUGkkMl07CiAgICB9OwoKICAgIGZ1bmN0aW9uIG1lcmNhdG9yKCkgewogICAgICByZXR1cm4gbWVyY2F0b3JQcm9qZWN0aW9uKG1lcmNhdG9yUmF3KQogICAgICAgICAgLnNjYWxlKDk2MSAvIHRhdSQzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZXJjYXRvclByb2plY3Rpb24ocHJvamVjdCkgewogICAgICB2YXIgbSA9IHByb2plY3Rpb24ocHJvamVjdCksCiAgICAgICAgICBjZW50ZXIgPSBtLmNlbnRlciwKICAgICAgICAgIHNjYWxlID0gbS5zY2FsZSwKICAgICAgICAgIHRyYW5zbGF0ZSA9IG0udHJhbnNsYXRlLAogICAgICAgICAgY2xpcEV4dGVudCA9IG0uY2xpcEV4dGVudCwKICAgICAgICAgIHgwID0gbnVsbCwgeTAsIHgxLCB5MTsgLy8gY2xpcCBleHRlbnQKCiAgICAgIG0uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUoXyksIHJlY2xpcCgpKSA6IHNjYWxlKCk7CiAgICAgIH07CgogICAgICBtLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGUoXyksIHJlY2xpcCgpKSA6IHRyYW5zbGF0ZSgpOwogICAgICB9OwoKICAgICAgbS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VudGVyKF8pLCByZWNsaXAoKSkgOiBjZW50ZXIoKTsKICAgICAgfTsKCiAgICAgIG0uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoXyA9PSBudWxsID8geDAgPSB5MCA9IHgxID0geTEgPSBudWxsIDogKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pKSwgcmVjbGlwKCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIHJlY2xpcCgpIHsKICAgICAgICB2YXIgayA9IHBpJDMgKiBzY2FsZSgpLAogICAgICAgICAgICB0ID0gbShyb3RhdGlvbihtLnJvdGF0ZSgpKS5pbnZlcnQoWzAsIDBdKSk7CiAgICAgICAgcmV0dXJuIGNsaXBFeHRlbnQoeDAgPT0gbnVsbAogICAgICAgICAgICA/IFtbdFswXSAtIGssIHRbMV0gLSBrXSwgW3RbMF0gKyBrLCB0WzFdICsga11dIDogcHJvamVjdCA9PT0gbWVyY2F0b3JSYXcKICAgICAgICAgICAgPyBbW01hdGgubWF4KHRbMF0gLSBrLCB4MCksIHkwXSwgW01hdGgubWluKHRbMF0gKyBrLCB4MSksIHkxXV0KICAgICAgICAgICAgOiBbW3gwLCBNYXRoLm1heCh0WzFdIC0gaywgeTApXSwgW3gxLCBNYXRoLm1pbih0WzFdICsgaywgeTEpXV0pOwogICAgICB9CgogICAgICByZXR1cm4gcmVjbGlwKCk7CiAgICB9CgogICAgZnVuY3Rpb24gdGFueSh5KSB7CiAgICAgIHJldHVybiB0YW4oKGhhbGZQaSQyICsgeSkgLyAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25pY0NvbmZvcm1hbFJhdyh5MCwgeTEpIHsKICAgICAgdmFyIGN5MCA9IGNvcyQxKHkwKSwKICAgICAgICAgIG4gPSB5MCA9PT0geTEgPyBzaW4kMSh5MCkgOiBsb2coY3kwIC8gY29zJDEoeTEpKSAvIGxvZyh0YW55KHkxKSAvIHRhbnkoeTApKSwKICAgICAgICAgIGYgPSBjeTAgKiBwb3codGFueSh5MCksIG4pIC8gbjsKCiAgICAgIGlmICghbikgcmV0dXJuIG1lcmNhdG9yUmF3OwoKICAgICAgZnVuY3Rpb24gcHJvamVjdCh4LCB5KSB7CiAgICAgICAgaWYgKGYgPiAwKSB7IGlmICh5IDwgLWhhbGZQaSQyICsgZXBzaWxvbiQyKSB5ID0gLWhhbGZQaSQyICsgZXBzaWxvbiQyOyB9CiAgICAgICAgZWxzZSB7IGlmICh5ID4gaGFsZlBpJDIgLSBlcHNpbG9uJDIpIHkgPSBoYWxmUGkkMiAtIGVwc2lsb24kMjsgfQogICAgICAgIHZhciByID0gZiAvIHBvdyh0YW55KHkpLCBuKTsKICAgICAgICByZXR1cm4gW3IgKiBzaW4kMShuICogeCksIGYgLSByICogY29zJDEobiAqIHgpXTsKICAgICAgfQoKICAgICAgcHJvamVjdC5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdmFyIGZ5ID0gZiAtIHksIHIgPSBzaWduKG4pICogc3FydCh4ICogeCArIGZ5ICogZnkpLAogICAgICAgICAgbCA9IGF0YW4yKHgsIGFicyhmeSkpICogc2lnbihmeSk7CiAgICAgICAgaWYgKGZ5ICogbiA8IDApCiAgICAgICAgICBsIC09IHBpJDMgKiBzaWduKHgpICogc2lnbihmeSk7CiAgICAgICAgcmV0dXJuIFtsIC8gbiwgMiAqIGF0YW4ocG93KGYgLyByLCAxIC8gbikpIC0gaGFsZlBpJDJdOwogICAgICB9OwoKICAgICAgcmV0dXJuIHByb2plY3Q7CiAgICB9CgogICAgZnVuY3Rpb24gY29uaWNDb25mb3JtYWwoKSB7CiAgICAgIHJldHVybiBjb25pY1Byb2plY3Rpb24oY29uaWNDb25mb3JtYWxSYXcpCiAgICAgICAgICAuc2NhbGUoMTA5LjUpCiAgICAgICAgICAucGFyYWxsZWxzKFszMCwgMzBdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlcXVpcmVjdGFuZ3VsYXJSYXcobGFtYmRhLCBwaGkpIHsKICAgICAgcmV0dXJuIFtsYW1iZGEsIHBoaV07CiAgICB9CgogICAgZXF1aXJlY3Rhbmd1bGFyUmF3LmludmVydCA9IGVxdWlyZWN0YW5ndWxhclJhdzsKCiAgICBmdW5jdGlvbiBlcXVpcmVjdGFuZ3VsYXIoKSB7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uKGVxdWlyZWN0YW5ndWxhclJhdykKICAgICAgICAgIC5zY2FsZSgxNTIuNjMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljRXF1aWRpc3RhbnRSYXcoeTAsIHkxKSB7CiAgICAgIHZhciBjeTAgPSBjb3MkMSh5MCksCiAgICAgICAgICBuID0geTAgPT09IHkxID8gc2luJDEoeTApIDogKGN5MCAtIGNvcyQxKHkxKSkgLyAoeTEgLSB5MCksCiAgICAgICAgICBnID0gY3kwIC8gbiArIHkwOwoKICAgICAgaWYgKGFicyhuKSA8IGVwc2lsb24kMikgcmV0dXJuIGVxdWlyZWN0YW5ndWxhclJhdzsKCiAgICAgIGZ1bmN0aW9uIHByb2plY3QoeCwgeSkgewogICAgICAgIHZhciBneSA9IGcgLSB5LCBueCA9IG4gKiB4OwogICAgICAgIHJldHVybiBbZ3kgKiBzaW4kMShueCksIGcgLSBneSAqIGNvcyQxKG54KV07CiAgICAgIH0KCiAgICAgIHByb2plY3QuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciBneSA9IGcgLSB5LAogICAgICAgICAgICBsID0gYXRhbjIoeCwgYWJzKGd5KSkgKiBzaWduKGd5KTsKICAgICAgICBpZiAoZ3kgKiBuIDwgMCkKICAgICAgICAgIGwgLT0gcGkkMyAqIHNpZ24oeCkgKiBzaWduKGd5KTsKICAgICAgICByZXR1cm4gW2wgLyBuLCBnIC0gc2lnbihuKSAqIHNxcnQoeCAqIHggKyBneSAqIGd5KV07CiAgICAgIH07CgogICAgICByZXR1cm4gcHJvamVjdDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25pY0VxdWlkaXN0YW50KCkgewogICAgICByZXR1cm4gY29uaWNQcm9qZWN0aW9uKGNvbmljRXF1aWRpc3RhbnRSYXcpCiAgICAgICAgICAuc2NhbGUoMTMxLjE1NCkKICAgICAgICAgIC5jZW50ZXIoWzAsIDEzLjkzODldKTsKICAgIH0KCiAgICB2YXIgQTEgPSAxLjM0MDI2NCwKICAgICAgICBBMiA9IC0wLjA4MTEwNiwKICAgICAgICBBMyA9IDAuMDAwODkzLAogICAgICAgIEE0ID0gMC4wMDM3OTYsCiAgICAgICAgTSA9IHNxcnQoMykgLyAyLAogICAgICAgIGl0ZXJhdGlvbnMgPSAxMjsKCiAgICBmdW5jdGlvbiBlcXVhbEVhcnRoUmF3KGxhbWJkYSwgcGhpKSB7CiAgICAgIHZhciBsID0gYXNpbihNICogc2luJDEocGhpKSksIGwyID0gbCAqIGwsIGw2ID0gbDIgKiBsMiAqIGwyOwogICAgICByZXR1cm4gWwogICAgICAgIGxhbWJkYSAqIGNvcyQxKGwpIC8gKE0gKiAoQTEgKyAzICogQTIgKiBsMiArIGw2ICogKDcgKiBBMyArIDkgKiBBNCAqIGwyKSkpLAogICAgICAgIGwgKiAoQTEgKyBBMiAqIGwyICsgbDYgKiAoQTMgKyBBNCAqIGwyKSkKICAgICAgXTsKICAgIH0KCiAgICBlcXVhbEVhcnRoUmF3LmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgdmFyIGwgPSB5LCBsMiA9IGwgKiBsLCBsNiA9IGwyICogbDIgKiBsMjsKICAgICAgZm9yICh2YXIgaSA9IDAsIGRlbHRhLCBmeSwgZnB5OyBpIDwgaXRlcmF0aW9uczsgKytpKSB7CiAgICAgICAgZnkgPSBsICogKEExICsgQTIgKiBsMiArIGw2ICogKEEzICsgQTQgKiBsMikpIC0geTsKICAgICAgICBmcHkgPSBBMSArIDMgKiBBMiAqIGwyICsgbDYgKiAoNyAqIEEzICsgOSAqIEE0ICogbDIpOwogICAgICAgIGwgLT0gZGVsdGEgPSBmeSAvIGZweSwgbDIgPSBsICogbCwgbDYgPSBsMiAqIGwyICogbDI7CiAgICAgICAgaWYgKGFicyhkZWx0YSkgPCBlcHNpbG9uMiQxKSBicmVhazsKICAgICAgfQogICAgICByZXR1cm4gWwogICAgICAgIE0gKiB4ICogKEExICsgMyAqIEEyICogbDIgKyBsNiAqICg3ICogQTMgKyA5ICogQTQgKiBsMikpIC8gY29zJDEobCksCiAgICAgICAgYXNpbihzaW4kMShsKSAvIE0pCiAgICAgIF07CiAgICB9OwoKICAgIGZ1bmN0aW9uIGVxdWFsRWFydGgoKSB7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uKGVxdWFsRWFydGhSYXcpCiAgICAgICAgICAuc2NhbGUoMTc3LjE1OCk7CiAgICB9CgogICAgZnVuY3Rpb24gZ25vbW9uaWNSYXcoeCwgeSkgewogICAgICB2YXIgY3kgPSBjb3MkMSh5KSwgayA9IGNvcyQxKHgpICogY3k7CiAgICAgIHJldHVybiBbY3kgKiBzaW4kMSh4KSAvIGssIHNpbiQxKHkpIC8ga107CiAgICB9CgogICAgZ25vbW9uaWNSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGF0YW4pOwoKICAgIGZ1bmN0aW9uIGdub21vbmljKCkgewogICAgICByZXR1cm4gcHJvamVjdGlvbihnbm9tb25pY1JhdykKICAgICAgICAgIC5zY2FsZSgxNDQuMDQ5KQogICAgICAgICAgLmNsaXBBbmdsZSg2MCk7CiAgICB9CgogICAgZnVuY3Rpb24gaWRlbnRpdHkkNSgpIHsKICAgICAgdmFyIGsgPSAxLCB0eCA9IDAsIHR5ID0gMCwgc3ggPSAxLCBzeSA9IDEsIC8vIHNjYWxlLCB0cmFuc2xhdGUgYW5kIHJlZmxlY3QKICAgICAgICAgIGFscGhhID0gMCwgY2EsIHNhLCAvLyBhbmdsZQogICAgICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxLCAvLyBjbGlwIGV4dGVudAogICAgICAgICAga3ggPSAxLCBreSA9IDEsCiAgICAgICAgICB0cmFuc2Zvcm0gPSB0cmFuc2Zvcm1lcih7CiAgICAgICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgICAgICAgdmFyIHAgPSBwcm9qZWN0aW9uKFt4LCB5XSk7CiAgICAgICAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQocFswXSwgcFsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pLAogICAgICAgICAgcG9zdGNsaXAgPSBpZGVudGl0eSQ0LAogICAgICAgICAgY2FjaGUsCiAgICAgICAgICBjYWNoZVN0cmVhbTsKCiAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgIGt4ID0gayAqIHN4OwogICAgICAgIGt5ID0gayAqIHN5OwogICAgICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgICAgIHJldHVybiBwcm9qZWN0aW9uOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwcm9qZWN0aW9uIChwKSB7CiAgICAgICAgdmFyIHggPSBwWzBdICoga3gsIHkgPSBwWzFdICoga3k7CiAgICAgICAgaWYgKGFscGhhKSB7CiAgICAgICAgICB2YXIgdCA9IHkgKiBjYSAtIHggKiBzYTsKICAgICAgICAgIHggPSB4ICogY2EgKyB5ICogc2E7CiAgICAgICAgICB5ID0gdDsKICAgICAgICB9ICAgIAogICAgICAgIHJldHVybiBbeCArIHR4LCB5ICsgdHldOwogICAgICB9CiAgICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gZnVuY3Rpb24ocCkgewogICAgICAgIHZhciB4ID0gcFswXSAtIHR4LCB5ID0gcFsxXSAtIHR5OwogICAgICAgIGlmIChhbHBoYSkgewogICAgICAgICAgdmFyIHQgPSB5ICogY2EgKyB4ICogc2E7CiAgICAgICAgICB4ID0geCAqIGNhIC0geSAqIHNhOwogICAgICAgICAgeSA9IHQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBbeCAvIGt4LCB5IC8ga3ldOwogICAgICB9OwogICAgICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IHRyYW5zZm9ybShwb3N0Y2xpcChjYWNoZVN0cmVhbSA9IHN0cmVhbSkpOwogICAgICB9OwogICAgICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXywgeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCByZXNldCgpKSA6IHBvc3RjbGlwOwogICAgICB9OwogICAgICBwcm9qZWN0aW9uLmNsaXBFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfID09IG51bGwgPyAoeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCBpZGVudGl0eSQ0KSA6IGNsaXBSZWN0YW5nbGUoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsxXSksIHJlc2V0KCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgICAgfTsKICAgICAgcHJvamVjdGlvbi5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChrID0gK18sIHJlc2V0KCkpIDogazsKICAgICAgfTsKICAgICAgcHJvamVjdGlvbi50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHggPSArX1swXSwgdHkgPSArX1sxXSwgcmVzZXQoKSkgOiBbdHgsIHR5XTsKICAgICAgfTsKICAgICAgcHJvamVjdGlvbi5hbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9IF8gJSAzNjAgKiByYWRpYW5zLCBzYSA9IHNpbiQxKGFscGhhKSwgY2EgPSBjb3MkMShhbHBoYSksIHJlc2V0KCkpIDogYWxwaGEgKiBkZWdyZWVzJDE7CiAgICAgIH07CiAgICAgIHByb2plY3Rpb24ucmVmbGVjdFggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ggPSBfID8gLTEgOiAxLCByZXNldCgpKSA6IHN4IDwgMDsKICAgICAgfTsKICAgICAgcHJvamVjdGlvbi5yZWZsZWN0WSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzeSA9IF8gPyAtMSA6IDEsIHJlc2V0KCkpIDogc3kgPCAwOwogICAgICB9OwogICAgICBwcm9qZWN0aW9uLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEV4dGVudChwcm9qZWN0aW9uLCBleHRlbnQsIG9iamVjdCk7CiAgICAgIH07CiAgICAgIHByb2plY3Rpb24uZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewogICAgICAgIHJldHVybiBmaXRTaXplKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCk7CiAgICAgIH07CiAgICAgIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3aWR0aCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdFdpZHRoKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpOwogICAgICB9OwogICAgICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEhlaWdodChwcm9qZWN0aW9uLCBoZWlnaHQsIG9iamVjdCk7CiAgICAgIH07CgogICAgICByZXR1cm4gcHJvamVjdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBuYXR1cmFsRWFydGgxUmF3KGxhbWJkYSwgcGhpKSB7CiAgICAgIHZhciBwaGkyID0gcGhpICogcGhpLCBwaGk0ID0gcGhpMiAqIHBoaTI7CiAgICAgIHJldHVybiBbCiAgICAgICAgbGFtYmRhICogKDAuODcwNyAtIDAuMTMxOTc5ICogcGhpMiArIHBoaTQgKiAoLTAuMDEzNzkxICsgcGhpNCAqICgwLjAwMzk3MSAqIHBoaTIgLSAwLjAwMTUyOSAqIHBoaTQpKSksCiAgICAgICAgcGhpICogKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSArIHBoaTQgKiAoLTAuMDQ0NDc1ICsgMC4wMjg4NzQgKiBwaGkyIC0gMC4wMDU5MTYgKiBwaGk0KSkpCiAgICAgIF07CiAgICB9CgogICAgbmF0dXJhbEVhcnRoMVJhdy5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgIHZhciBwaGkgPSB5LCBpID0gMjUsIGRlbHRhOwogICAgICBkbyB7CiAgICAgICAgdmFyIHBoaTIgPSBwaGkgKiBwaGksIHBoaTQgPSBwaGkyICogcGhpMjsKICAgICAgICBwaGkgLT0gZGVsdGEgPSAocGhpICogKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSArIHBoaTQgKiAoLTAuMDQ0NDc1ICsgMC4wMjg4NzQgKiBwaGkyIC0gMC4wMDU5MTYgKiBwaGk0KSkpIC0geSkgLwogICAgICAgICAgICAoMS4wMDcyMjYgKyBwaGkyICogKDAuMDE1MDg1ICogMyArIHBoaTQgKiAoLTAuMDQ0NDc1ICogNyArIDAuMDI4ODc0ICogOSAqIHBoaTIgLSAwLjAwNTkxNiAqIDExICogcGhpNCkpKTsKICAgICAgfSB3aGlsZSAoYWJzKGRlbHRhKSA+IGVwc2lsb24kMiAmJiAtLWkgPiAwKTsKICAgICAgcmV0dXJuIFsKICAgICAgICB4IC8gKDAuODcwNyArIChwaGkyID0gcGhpICogcGhpKSAqICgtMC4xMzE5NzkgKyBwaGkyICogKC0wLjAxMzc5MSArIHBoaTIgKiBwaGkyICogcGhpMiAqICgwLjAwMzk3MSAtIDAuMDAxNTI5ICogcGhpMikpKSksCiAgICAgICAgcGhpCiAgICAgIF07CiAgICB9OwoKICAgIGZ1bmN0aW9uIG5hdHVyYWxFYXJ0aDEoKSB7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uKG5hdHVyYWxFYXJ0aDFSYXcpCiAgICAgICAgICAuc2NhbGUoMTc1LjI5NSk7CiAgICB9CgogICAgZnVuY3Rpb24gb3J0aG9ncmFwaGljUmF3KHgsIHkpIHsKICAgICAgcmV0dXJuIFtjb3MkMSh5KSAqIHNpbiQxKHgpLCBzaW4kMSh5KV07CiAgICB9CgogICAgb3J0aG9ncmFwaGljUmF3LmludmVydCA9IGF6aW11dGhhbEludmVydChhc2luKTsKCiAgICBmdW5jdGlvbiBvcnRob2dyYXBoaWMoKSB7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uKG9ydGhvZ3JhcGhpY1JhdykKICAgICAgICAgIC5zY2FsZSgyNDkuNSkKICAgICAgICAgIC5jbGlwQW5nbGUoOTAgKyBlcHNpbG9uJDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXJlb2dyYXBoaWNSYXcoeCwgeSkgewogICAgICB2YXIgY3kgPSBjb3MkMSh5KSwgayA9IDEgKyBjb3MkMSh4KSAqIGN5OwogICAgICByZXR1cm4gW2N5ICogc2luJDEoeCkgLyBrLCBzaW4kMSh5KSAvIGtdOwogICAgfQoKICAgIHN0ZXJlb2dyYXBoaWNSYXcuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0KGZ1bmN0aW9uKHopIHsKICAgICAgcmV0dXJuIDIgKiBhdGFuKHopOwogICAgfSk7CgogICAgZnVuY3Rpb24gc3RlcmVvZ3JhcGhpYygpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24oc3RlcmVvZ3JhcGhpY1JhdykKICAgICAgICAgIC5zY2FsZSgyNTApCiAgICAgICAgICAuY2xpcEFuZ2xlKDE0Mik7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnN2ZXJzZU1lcmNhdG9yUmF3KGxhbWJkYSwgcGhpKSB7CiAgICAgIHJldHVybiBbbG9nKHRhbigoaGFsZlBpJDIgKyBwaGkpIC8gMikpLCAtbGFtYmRhXTsKICAgIH0KCiAgICB0cmFuc3ZlcnNlTWVyY2F0b3JSYXcuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICByZXR1cm4gWy15LCAyICogYXRhbihleHAoeCkpIC0gaGFsZlBpJDJdOwogICAgfTsKCiAgICBmdW5jdGlvbiB0cmFuc3ZlcnNlTWVyY2F0b3IoKSB7CiAgICAgIHZhciBtID0gbWVyY2F0b3JQcm9qZWN0aW9uKHRyYW5zdmVyc2VNZXJjYXRvclJhdyksCiAgICAgICAgICBjZW50ZXIgPSBtLmNlbnRlciwKICAgICAgICAgIHJvdGF0ZSA9IG0ucm90YXRlOwoKICAgICAgbS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjZW50ZXIoWy1fWzFdLCBfWzBdXSkgOiAoXyA9IGNlbnRlcigpLCBbX1sxXSwgLV9bMF1dKTsKICAgICAgfTsKCiAgICAgIG0ucm90YXRlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gcm90YXRlKFtfWzBdLCBfWzFdLCBfLmxlbmd0aCA+IDIgPyBfWzJdICsgOTAgOiA5MF0pIDogKF8gPSByb3RhdGUoKSwgW19bMF0sIF9bMV0sIF9bMl0gLSA5MF0pOwogICAgICB9OwoKICAgICAgcmV0dXJuIHJvdGF0ZShbMCwgMCwgOTBdKQogICAgICAgICAgLnNjYWxlKDE1OS4xNTUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRTZXBhcmF0aW9uKGEsIGIpIHsKICAgICAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lYW5YKGNoaWxkcmVuKSB7CiAgICAgIHJldHVybiBjaGlsZHJlbi5yZWR1Y2UobWVhblhSZWR1Y2UsIDApIC8gY2hpbGRyZW4ubGVuZ3RoOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lYW5YUmVkdWNlKHgsIGMpIHsKICAgICAgcmV0dXJuIHggKyBjLng7CiAgICB9CgogICAgZnVuY3Rpb24gbWF4WShjaGlsZHJlbikgewogICAgICByZXR1cm4gMSArIGNoaWxkcmVuLnJlZHVjZShtYXhZUmVkdWNlLCAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYXhZUmVkdWNlKHksIGMpIHsKICAgICAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGVhZkxlZnQobm9kZSkgewogICAgICB2YXIgY2hpbGRyZW47CiAgICAgIHdoaWxlIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIG5vZGUgPSBjaGlsZHJlblswXTsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gbGVhZlJpZ2h0KG5vZGUpIHsKICAgICAgdmFyIGNoaWxkcmVuOwogICAgICB3aGlsZSAoY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuKSBub2RlID0gY2hpbGRyZW5bY2hpbGRyZW4ubGVuZ3RoIC0gMV07CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsdXN0ZXIoKSB7CiAgICAgIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24sCiAgICAgICAgICBkeCA9IDEsCiAgICAgICAgICBkeSA9IDEsCiAgICAgICAgICBub2RlU2l6ZSA9IGZhbHNlOwoKICAgICAgZnVuY3Rpb24gY2x1c3Rlcihyb290KSB7CiAgICAgICAgdmFyIHByZXZpb3VzTm9kZSwKICAgICAgICAgICAgeCA9IDA7CgogICAgICAgIC8vIEZpcnN0IHdhbGssIGNvbXB1dGluZyB0aGUgaW5pdGlhbCB4ICYgeSB2YWx1ZXMuCiAgICAgICAgcm9vdC5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgdmFyIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgICAgIGlmIChjaGlsZHJlbikgewogICAgICAgICAgICBub2RlLnggPSBtZWFuWChjaGlsZHJlbik7CiAgICAgICAgICAgIG5vZGUueSA9IG1heFkoY2hpbGRyZW4pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOwogICAgICAgICAgICBub2RlLnkgPSAwOwogICAgICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB2YXIgbGVmdCA9IGxlYWZMZWZ0KHJvb3QpLAogICAgICAgICAgICByaWdodCA9IGxlYWZSaWdodChyb290KSwKICAgICAgICAgICAgeDAgPSBsZWZ0LnggLSBzZXBhcmF0aW9uKGxlZnQsIHJpZ2h0KSAvIDIsCiAgICAgICAgICAgIHgxID0gcmlnaHQueCArIHNlcGFyYXRpb24ocmlnaHQsIGxlZnQpIC8gMjsKCiAgICAgICAgLy8gU2Vjb25kIHdhbGssIG5vcm1hbGl6aW5nIHggJiB5IHRvIHRoZSBkZXNpcmVkIHNpemUuCiAgICAgICAgcmV0dXJuIHJvb3QuZWFjaEFmdGVyKG5vZGVTaXplID8gZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgbm9kZS54ID0gKG5vZGUueCAtIHJvb3QueCkgKiBkeDsKICAgICAgICAgIG5vZGUueSA9IChyb290LnkgLSBub2RlLnkpICogZHk7CiAgICAgICAgfSA6IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgIG5vZGUueCA9IChub2RlLnggLSB4MCkgLyAoeDEgLSB4MCkgKiBkeDsKICAgICAgICAgIG5vZGUueSA9ICgxIC0gKHJvb3QueSA/IG5vZGUueSAvIHJvb3QueSA6IDEpKSAqIGR5OwogICAgICAgIH0pOwogICAgICB9CgogICAgICBjbHVzdGVyLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIGNsdXN0ZXIpIDogc2VwYXJhdGlvbjsKICAgICAgfTsKCiAgICAgIGNsdXN0ZXIuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBjbHVzdGVyKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7CiAgICAgIH07CgogICAgICBjbHVzdGVyLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNsdXN0ZXI7CiAgICB9CgogICAgZnVuY3Rpb24gY291bnQobm9kZSkgewogICAgICB2YXIgc3VtID0gMCwKICAgICAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwKICAgICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7CiAgICAgIGlmICghaSkgc3VtID0gMTsKICAgICAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTsKICAgICAgbm9kZS52YWx1ZSA9IHN1bTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2NvdW50KCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoY291bnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfZWFjaChjYWxsYmFjaykgewogICAgICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuOwogICAgICBkbyB7CiAgICAgICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107CiAgICAgICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7CiAgICAgICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIG5leHQucHVzaChjaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IHdoaWxlIChuZXh0Lmxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfZWFjaEJlZm9yZShjYWxsYmFjaykgewogICAgICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBjaGlsZHJlbiwgaTsKICAgICAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgICAgIGNhbGxiYWNrKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSBjaGlsZHJlbi5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgbm9kZXMucHVzaChjaGlsZHJlbltpXSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfZWFjaEFmdGVyKGNhbGxiYWNrKSB7CiAgICAgIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIG5leHQgPSBbXSwgY2hpbGRyZW4sIGksIG47CiAgICAgIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHsKICAgICAgICBuZXh0LnB1c2gobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IDAsIG4gPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIG5vZGVzLnB1c2goY2hpbGRyZW5baV0pOwogICAgICAgIH0KICAgICAgfQogICAgICB3aGlsZSAobm9kZSA9IG5leHQucG9wKCkpIHsKICAgICAgICBjYWxsYmFjayhub2RlKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX3N1bSh2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkgewogICAgICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLAogICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sCiAgICAgICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7CiAgICAgICAgbm9kZS52YWx1ZSA9IHN1bTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9zb3J0KGNvbXBhcmUpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHsKICAgICAgICAgIG5vZGUuY2hpbGRyZW4uc29ydChjb21wYXJlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfcGF0aChlbmQpIHsKICAgICAgdmFyIHN0YXJ0ID0gdGhpcywKICAgICAgICAgIGFuY2VzdG9yID0gbGVhc3RDb21tb25BbmNlc3RvcihzdGFydCwgZW5kKSwKICAgICAgICAgIG5vZGVzID0gW3N0YXJ0XTsKICAgICAgd2hpbGUgKHN0YXJ0ICE9PSBhbmNlc3RvcikgewogICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50OwogICAgICAgIG5vZGVzLnB1c2goc3RhcnQpOwogICAgICB9CiAgICAgIHZhciBrID0gbm9kZXMubGVuZ3RoOwogICAgICB3aGlsZSAoZW5kICE9PSBhbmNlc3RvcikgewogICAgICAgIG5vZGVzLnNwbGljZShrLCAwLCBlbmQpOwogICAgICAgIGVuZCA9IGVuZC5wYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlYXN0Q29tbW9uQW5jZXN0b3IoYSwgYikgewogICAgICBpZiAoYSA9PT0gYikgcmV0dXJuIGE7CiAgICAgIHZhciBhTm9kZXMgPSBhLmFuY2VzdG9ycygpLAogICAgICAgICAgYk5vZGVzID0gYi5hbmNlc3RvcnMoKSwKICAgICAgICAgIGMgPSBudWxsOwogICAgICBhID0gYU5vZGVzLnBvcCgpOwogICAgICBiID0gYk5vZGVzLnBvcCgpOwogICAgICB3aGlsZSAoYSA9PT0gYikgewogICAgICAgIGMgPSBhOwogICAgICAgIGEgPSBhTm9kZXMucG9wKCk7CiAgICAgICAgYiA9IGJOb2Rlcy5wb3AoKTsKICAgICAgfQogICAgICByZXR1cm4gYzsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2FuY2VzdG9ycygpIHsKICAgICAgdmFyIG5vZGUgPSB0aGlzLCBub2RlcyA9IFtub2RlXTsKICAgICAgd2hpbGUgKG5vZGUgPSBub2RlLnBhcmVudCkgewogICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfZGVzY2VuZGFudHMoKSB7CiAgICAgIHZhciBub2RlcyA9IFtdOwogICAgICB0aGlzLmVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9sZWF2ZXMoKSB7CiAgICAgIHZhciBsZWF2ZXMgPSBbXTsKICAgICAgdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHsKICAgICAgICAgIGxlYXZlcy5wdXNoKG5vZGUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBsZWF2ZXM7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9saW5rcygpIHsKICAgICAgdmFyIHJvb3QgPSB0aGlzLCBsaW5rcyA9IFtdOwogICAgICByb290LmVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmIChub2RlICE9PSByb290KSB7IC8vIERvbuKAmXQgaW5jbHVkZSB0aGUgcm9vdOKAmXMgcGFyZW50LCBpZiBhbnkuCiAgICAgICAgICBsaW5rcy5wdXNoKHtzb3VyY2U6IG5vZGUucGFyZW50LCB0YXJnZXQ6IG5vZGV9KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gbGlua3M7CiAgICB9CgogICAgZnVuY3Rpb24gaGllcmFyY2h5KGRhdGEsIGNoaWxkcmVuKSB7CiAgICAgIHZhciByb290ID0gbmV3IE5vZGUkMShkYXRhKSwKICAgICAgICAgIHZhbHVlZCA9ICtkYXRhLnZhbHVlICYmIChyb290LnZhbHVlID0gZGF0YS52YWx1ZSksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZXMgPSBbcm9vdF0sCiAgICAgICAgICBjaGlsZCwKICAgICAgICAgIGNoaWxkcywKICAgICAgICAgIGksCiAgICAgICAgICBuOwoKICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIGNoaWxkcmVuID0gZGVmYXVsdENoaWxkcmVuOwoKICAgICAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgICAgIGlmICh2YWx1ZWQpIG5vZGUudmFsdWUgPSArbm9kZS5kYXRhLnZhbHVlOwogICAgICAgIGlmICgoY2hpbGRzID0gY2hpbGRyZW4obm9kZS5kYXRhKSkgJiYgKG4gPSBjaGlsZHMubGVuZ3RoKSkgewogICAgICAgICAgbm9kZS5jaGlsZHJlbiA9IG5ldyBBcnJheShuKTsKICAgICAgICAgIGZvciAoaSA9IG4gLSAxOyBpID49IDA7IC0taSkgewogICAgICAgICAgICBub2Rlcy5wdXNoKGNoaWxkID0gbm9kZS5jaGlsZHJlbltpXSA9IG5ldyBOb2RlJDEoY2hpbGRzW2ldKSk7CiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7CiAgICAgICAgICAgIGNoaWxkLmRlcHRoID0gbm9kZS5kZXB0aCArIDE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcm9vdC5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfY29weSgpIHsKICAgICAgcmV0dXJuIGhpZXJhcmNoeSh0aGlzKS5lYWNoQmVmb3JlKGNvcHlEYXRhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0Q2hpbGRyZW4oZCkgewogICAgICByZXR1cm4gZC5jaGlsZHJlbjsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5RGF0YShub2RlKSB7CiAgICAgIG5vZGUuZGF0YSA9IG5vZGUuZGF0YS5kYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXB1dGVIZWlnaHQobm9kZSkgewogICAgICB2YXIgaGVpZ2h0ID0gMDsKICAgICAgZG8gbm9kZS5oZWlnaHQgPSBoZWlnaHQ7CiAgICAgIHdoaWxlICgobm9kZSA9IG5vZGUucGFyZW50KSAmJiAobm9kZS5oZWlnaHQgPCArK2hlaWdodCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIE5vZGUkMShkYXRhKSB7CiAgICAgIHRoaXMuZGF0YSA9IGRhdGE7CiAgICAgIHRoaXMuZGVwdGggPQogICAgICB0aGlzLmhlaWdodCA9IDA7CiAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKICAgIH0KCiAgICBOb2RlJDEucHJvdG90eXBlID0gaGllcmFyY2h5LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IE5vZGUkMSwKICAgICAgY291bnQ6IG5vZGVfY291bnQsCiAgICAgIGVhY2g6IG5vZGVfZWFjaCwKICAgICAgZWFjaEFmdGVyOiBub2RlX2VhY2hBZnRlciwKICAgICAgZWFjaEJlZm9yZTogbm9kZV9lYWNoQmVmb3JlLAogICAgICBzdW06IG5vZGVfc3VtLAogICAgICBzb3J0OiBub2RlX3NvcnQsCiAgICAgIHBhdGg6IG5vZGVfcGF0aCwKICAgICAgYW5jZXN0b3JzOiBub2RlX2FuY2VzdG9ycywKICAgICAgZGVzY2VuZGFudHM6IG5vZGVfZGVzY2VuZGFudHMsCiAgICAgIGxlYXZlczogbm9kZV9sZWF2ZXMsCiAgICAgIGxpbmtzOiBub2RlX2xpbmtzLAogICAgICBjb3B5OiBub2RlX2NvcHkKICAgIH07CgogICAgdmFyIHNsaWNlJDQgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgogICAgZnVuY3Rpb24gc2h1ZmZsZSQxKGFycmF5KSB7CiAgICAgIHZhciBtID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgdCwKICAgICAgICAgIGk7CgogICAgICB3aGlsZSAobSkgewogICAgICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsKICAgICAgICB0ID0gYXJyYXlbbV07CiAgICAgICAgYXJyYXlbbV0gPSBhcnJheVtpXTsKICAgICAgICBhcnJheVtpXSA9IHQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmNsb3NlKGNpcmNsZXMpIHsKICAgICAgdmFyIGkgPSAwLCBuID0gKGNpcmNsZXMgPSBzaHVmZmxlJDEoc2xpY2UkNC5jYWxsKGNpcmNsZXMpKSkubGVuZ3RoLCBCID0gW10sIHAsIGU7CgogICAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgICBwID0gY2lyY2xlc1tpXTsKICAgICAgICBpZiAoZSAmJiBlbmNsb3Nlc1dlYWsoZSwgcCkpICsraTsKICAgICAgICBlbHNlIGUgPSBlbmNsb3NlQmFzaXMoQiA9IGV4dGVuZEJhc2lzKEIsIHApKSwgaSA9IDA7CiAgICAgIH0KCiAgICAgIHJldHVybiBlOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dGVuZEJhc2lzKEIsIHApIHsKICAgICAgdmFyIGksIGo7CgogICAgICBpZiAoZW5jbG9zZXNXZWFrQWxsKHAsIEIpKSByZXR1cm4gW3BdOwoKICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4KICAgICAgZm9yIChpID0gMDsgaSA8IEIubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoZW5jbG9zZXNOb3QocCwgQltpXSkKICAgICAgICAgICAgJiYgZW5jbG9zZXNXZWFrQWxsKGVuY2xvc2VCYXNpczIoQltpXSwgcCksIEIpKSB7CiAgICAgICAgICByZXR1cm4gW0JbaV0sIHBdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBCLmxlbmd0aCAtIDE7ICsraSkgewogICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgQi5sZW5ndGg7ICsraikgewogICAgICAgICAgaWYgKGVuY2xvc2VzTm90KGVuY2xvc2VCYXNpczIoQltpXSwgQltqXSksIHApCiAgICAgICAgICAgICAgJiYgZW5jbG9zZXNOb3QoZW5jbG9zZUJhc2lzMihCW2ldLCBwKSwgQltqXSkKICAgICAgICAgICAgICAmJiBlbmNsb3Nlc05vdChlbmNsb3NlQmFzaXMyKEJbal0sIHApLCBCW2ldKQogICAgICAgICAgICAgICYmIGVuY2xvc2VzV2Vha0FsbChlbmNsb3NlQmFzaXMzKEJbaV0sIEJbal0sIHApLCBCKSkgewogICAgICAgICAgICByZXR1cm4gW0JbaV0sIEJbal0sIHBdOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBzb21ldGhpbmcgaXMgdmVyeSB3cm9uZy4KICAgICAgdGhyb3cgbmV3IEVycm9yOwogICAgfQoKICAgIGZ1bmN0aW9uIGVuY2xvc2VzTm90KGEsIGIpIHsKICAgICAgdmFyIGRyID0gYS5yIC0gYi5yLCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7CiAgICAgIHJldHVybiBkciA8IDAgfHwgZHIgKiBkciA8IGR4ICogZHggKyBkeSAqIGR5OwogICAgfQoKICAgIGZ1bmN0aW9uIGVuY2xvc2VzV2VhayhhLCBiKSB7CiAgICAgIHZhciBkciA9IGEuciAtIGIuciArIDFlLTYsIGR4ID0gYi54IC0gYS54LCBkeSA9IGIueSAtIGEueTsKICAgICAgcmV0dXJuIGRyID4gMCAmJiBkciAqIGRyID4gZHggKiBkeCArIGR5ICogZHk7CiAgICB9CgogICAgZnVuY3Rpb24gZW5jbG9zZXNXZWFrQWxsKGEsIEIpIHsKICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBCLmxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKCFlbmNsb3Nlc1dlYWsoYSwgQltpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gZW5jbG9zZUJhc2lzKEIpIHsKICAgICAgc3dpdGNoIChCLmxlbmd0aCkgewogICAgICAgIGNhc2UgMTogcmV0dXJuIGVuY2xvc2VCYXNpczEoQlswXSk7CiAgICAgICAgY2FzZSAyOiByZXR1cm4gZW5jbG9zZUJhc2lzMihCWzBdLCBCWzFdKTsKICAgICAgICBjYXNlIDM6IHJldHVybiBlbmNsb3NlQmFzaXMzKEJbMF0sIEJbMV0sIEJbMl0pOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZW5jbG9zZUJhc2lzMShhKSB7CiAgICAgIHJldHVybiB7CiAgICAgICAgeDogYS54LAogICAgICAgIHk6IGEueSwKICAgICAgICByOiBhLnIKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmNsb3NlQmFzaXMyKGEsIGIpIHsKICAgICAgdmFyIHgxID0gYS54LCB5MSA9IGEueSwgcjEgPSBhLnIsCiAgICAgICAgICB4MiA9IGIueCwgeTIgPSBiLnksIHIyID0gYi5yLAogICAgICAgICAgeDIxID0geDIgLSB4MSwgeTIxID0geTIgLSB5MSwgcjIxID0gcjIgLSByMSwKICAgICAgICAgIGwgPSBNYXRoLnNxcnQoeDIxICogeDIxICsgeTIxICogeTIxKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAoeDEgKyB4MiArIHgyMSAvIGwgKiByMjEpIC8gMiwKICAgICAgICB5OiAoeTEgKyB5MiArIHkyMSAvIGwgKiByMjEpIC8gMiwKICAgICAgICByOiAobCArIHIxICsgcjIpIC8gMgogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGVuY2xvc2VCYXNpczMoYSwgYiwgYykgewogICAgICB2YXIgeDEgPSBhLngsIHkxID0gYS55LCByMSA9IGEuciwKICAgICAgICAgIHgyID0gYi54LCB5MiA9IGIueSwgcjIgPSBiLnIsCiAgICAgICAgICB4MyA9IGMueCwgeTMgPSBjLnksIHIzID0gYy5yLAogICAgICAgICAgYTIgPSB4MSAtIHgyLAogICAgICAgICAgYTMgPSB4MSAtIHgzLAogICAgICAgICAgYjIgPSB5MSAtIHkyLAogICAgICAgICAgYjMgPSB5MSAtIHkzLAogICAgICAgICAgYzIgPSByMiAtIHIxLAogICAgICAgICAgYzMgPSByMyAtIHIxLAogICAgICAgICAgZDEgPSB4MSAqIHgxICsgeTEgKiB5MSAtIHIxICogcjEsCiAgICAgICAgICBkMiA9IGQxIC0geDIgKiB4MiAtIHkyICogeTIgKyByMiAqIHIyLAogICAgICAgICAgZDMgPSBkMSAtIHgzICogeDMgLSB5MyAqIHkzICsgcjMgKiByMywKICAgICAgICAgIGFiID0gYTMgKiBiMiAtIGEyICogYjMsCiAgICAgICAgICB4YSA9IChiMiAqIGQzIC0gYjMgKiBkMikgLyAoYWIgKiAyKSAtIHgxLAogICAgICAgICAgeGIgPSAoYjMgKiBjMiAtIGIyICogYzMpIC8gYWIsCiAgICAgICAgICB5YSA9IChhMyAqIGQyIC0gYTIgKiBkMykgLyAoYWIgKiAyKSAtIHkxLAogICAgICAgICAgeWIgPSAoYTIgKiBjMyAtIGEzICogYzIpIC8gYWIsCiAgICAgICAgICBBID0geGIgKiB4YiArIHliICogeWIgLSAxLAogICAgICAgICAgQiA9IDIgKiAocjEgKyB4YSAqIHhiICsgeWEgKiB5YiksCiAgICAgICAgICBDID0geGEgKiB4YSArIHlhICogeWEgLSByMSAqIHIxLAogICAgICAgICAgciA9IC0oQSA/IChCICsgTWF0aC5zcXJ0KEIgKiBCIC0gNCAqIEEgKiBDKSkgLyAoMiAqIEEpIDogQyAvIEIpOwogICAgICByZXR1cm4gewogICAgICAgIHg6IHgxICsgeGEgKyB4YiAqIHIsCiAgICAgICAgeTogeTEgKyB5YSArIHliICogciwKICAgICAgICByOiByCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcGxhY2UoYiwgYSwgYykgewogICAgICB2YXIgZHggPSBiLnggLSBhLngsIHgsIGEyLAogICAgICAgICAgZHkgPSBiLnkgLSBhLnksIHksIGIyLAogICAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgaWYgKGQyKSB7CiAgICAgICAgYTIgPSBhLnIgKyBjLnIsIGEyICo9IGEyOwogICAgICAgIGIyID0gYi5yICsgYy5yLCBiMiAqPSBiMjsKICAgICAgICBpZiAoYTIgPiBiMikgewogICAgICAgICAgeCA9IChkMiArIGIyIC0gYTIpIC8gKDIgKiBkMik7CiAgICAgICAgICB5ID0gTWF0aC5zcXJ0KE1hdGgubWF4KDAsIGIyIC8gZDIgLSB4ICogeCkpOwogICAgICAgICAgYy54ID0gYi54IC0geCAqIGR4IC0geSAqIGR5OwogICAgICAgICAgYy55ID0gYi55IC0geCAqIGR5ICsgeSAqIGR4OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB4ID0gKGQyICsgYTIgLSBiMikgLyAoMiAqIGQyKTsKICAgICAgICAgIHkgPSBNYXRoLnNxcnQoTWF0aC5tYXgoMCwgYTIgLyBkMiAtIHggKiB4KSk7CiAgICAgICAgICBjLnggPSBhLnggKyB4ICogZHggLSB5ICogZHk7CiAgICAgICAgICBjLnkgPSBhLnkgKyB4ICogZHkgKyB5ICogZHg7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIGMueCA9IGEueCArIGMucjsKICAgICAgICBjLnkgPSBhLnk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnNlY3RzKGEsIGIpIHsKICAgICAgdmFyIGRyID0gYS5yICsgYi5yIC0gMWUtNiwgZHggPSBiLnggLSBhLngsIGR5ID0gYi55IC0gYS55OwogICAgICByZXR1cm4gZHIgPiAwICYmIGRyICogZHIgPiBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY29yZShub2RlKSB7CiAgICAgIHZhciBhID0gbm9kZS5fLAogICAgICAgICAgYiA9IG5vZGUubmV4dC5fLAogICAgICAgICAgYWIgPSBhLnIgKyBiLnIsCiAgICAgICAgICBkeCA9IChhLnggKiBiLnIgKyBiLnggKiBhLnIpIC8gYWIsCiAgICAgICAgICBkeSA9IChhLnkgKiBiLnIgKyBiLnkgKiBhLnIpIC8gYWI7CiAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIH0KCiAgICBmdW5jdGlvbiBOb2RlJDIoY2lyY2xlKSB7CiAgICAgIHRoaXMuXyA9IGNpcmNsZTsKICAgICAgdGhpcy5uZXh0ID0gbnVsbDsKICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcGFja0VuY2xvc2UoY2lyY2xlcykgewogICAgICBpZiAoIShuID0gY2lyY2xlcy5sZW5ndGgpKSByZXR1cm4gMDsKCiAgICAgIHZhciBhLCBiLCBjLCBuLCBhYSwgY2EsIGksIGosIGssIHNqLCBzazsKCiAgICAgIC8vIFBsYWNlIHRoZSBmaXJzdCBjaXJjbGUuCiAgICAgIGEgPSBjaXJjbGVzWzBdLCBhLnggPSAwLCBhLnkgPSAwOwogICAgICBpZiAoIShuID4gMSkpIHJldHVybiBhLnI7CgogICAgICAvLyBQbGFjZSB0aGUgc2Vjb25kIGNpcmNsZS4KICAgICAgYiA9IGNpcmNsZXNbMV0sIGEueCA9IC1iLnIsIGIueCA9IGEuciwgYi55ID0gMDsKICAgICAgaWYgKCEobiA+IDIpKSByZXR1cm4gYS5yICsgYi5yOwoKICAgICAgLy8gUGxhY2UgdGhlIHRoaXJkIGNpcmNsZS4KICAgICAgcGxhY2UoYiwgYSwgYyA9IGNpcmNsZXNbMl0pOwoKICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZnJvbnQtY2hhaW4gdXNpbmcgdGhlIGZpcnN0IHRocmVlIGNpcmNsZXMgYSwgYiBhbmQgYy4KICAgICAgYSA9IG5ldyBOb2RlJDIoYSksIGIgPSBuZXcgTm9kZSQyKGIpLCBjID0gbmV3IE5vZGUkMihjKTsKICAgICAgYS5uZXh0ID0gYy5wcmV2aW91cyA9IGI7CiAgICAgIGIubmV4dCA9IGEucHJldmlvdXMgPSBjOwogICAgICBjLm5leHQgPSBiLnByZXZpb3VzID0gYTsKCiAgICAgIC8vIEF0dGVtcHQgdG8gcGxhY2UgZWFjaCByZW1haW5pbmcgY2lyY2xl4oCmCiAgICAgIHBhY2s6IGZvciAoaSA9IDM7IGkgPCBuOyArK2kpIHsKICAgICAgICBwbGFjZShhLl8sIGIuXywgYyA9IGNpcmNsZXNbaV0pLCBjID0gbmV3IE5vZGUkMihjKTsKCiAgICAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBpbnRlcnNlY3RpbmcgY2lyY2xlIG9uIHRoZSBmcm9udC1jaGFpbiwgaWYgYW55LgogICAgICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRlcm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uCiAgICAgICAgLy8g4oCcQWhlYWTigJ0gb3Ig4oCcYmVoaW5k4oCdIGlzIGxpa2V3aXNlIGRldGVybWluZWQgYnkgbGluZWFyIGRpc3RhbmNlLgogICAgICAgIGogPSBiLm5leHQsIGsgPSBhLnByZXZpb3VzLCBzaiA9IGIuXy5yLCBzayA9IGEuXy5yOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChzaiA8PSBzaykgewogICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyhqLl8sIGMuXykpIHsKICAgICAgICAgICAgICBiID0gaiwgYS5uZXh0ID0gYiwgYi5wcmV2aW91cyA9IGEsIC0taTsKICAgICAgICAgICAgICBjb250aW51ZSBwYWNrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNqICs9IGouXy5yLCBqID0gai5uZXh0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGludGVyc2VjdHMoay5fLCBjLl8pKSB7CiAgICAgICAgICAgICAgYSA9IGssIGEubmV4dCA9IGIsIGIucHJldmlvdXMgPSBhLCAtLWk7CiAgICAgICAgICAgICAgY29udGludWUgcGFjazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzayArPSBrLl8uciwgayA9IGsucHJldmlvdXM7CiAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSAoaiAhPT0gay5uZXh0KTsKCiAgICAgICAgLy8gU3VjY2VzcyEgSW5zZXJ0IHRoZSBuZXcgY2lyY2xlIGMgYmV0d2VlbiBhIGFuZCBiLgogICAgICAgIGMucHJldmlvdXMgPSBhLCBjLm5leHQgPSBiLCBhLm5leHQgPSBiLnByZXZpb3VzID0gYiA9IGM7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIG5ldyBjbG9zZXN0IGNpcmNsZSBwYWlyIHRvIHRoZSBjZW50cm9pZC4KICAgICAgICBhYSA9IHNjb3JlKGEpOwogICAgICAgIHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIHsKICAgICAgICAgIGlmICgoY2EgPSBzY29yZShjKSkgPCBhYSkgewogICAgICAgICAgICBhID0gYywgYWEgPSBjYTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYiA9IGEubmV4dDsKICAgICAgfQoKICAgICAgLy8gQ29tcHV0ZSB0aGUgZW5jbG9zaW5nIGNpcmNsZSBvZiB0aGUgZnJvbnQgY2hhaW4uCiAgICAgIGEgPSBbYi5fXSwgYyA9IGI7IHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIGEucHVzaChjLl8pOyBjID0gZW5jbG9zZShhKTsKCiAgICAgIC8vIFRyYW5zbGF0ZSB0aGUgY2lyY2xlcyB0byBwdXQgdGhlIGVuY2xvc2luZyBjaXJjbGUgYXJvdW5kIHRoZSBvcmlnaW4uCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGEgPSBjaXJjbGVzW2ldLCBhLnggLT0gYy54LCBhLnkgLT0gYy55OwoKICAgICAgcmV0dXJuIGMucjsKICAgIH0KCiAgICBmdW5jdGlvbiBzaWJsaW5ncyhjaXJjbGVzKSB7CiAgICAgIHBhY2tFbmNsb3NlKGNpcmNsZXMpOwogICAgICByZXR1cm4gY2lyY2xlczsKICAgIH0KCiAgICBmdW5jdGlvbiBvcHRpb25hbChmKSB7CiAgICAgIHJldHVybiBmID09IG51bGwgPyBudWxsIDogcmVxdWlyZWQoZik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVxdWlyZWQoZikgewogICAgICBpZiAodHlwZW9mIGYgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgcmV0dXJuIGY7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnRaZXJvKCkgewogICAgICByZXR1cm4gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudCQ5KHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRSYWRpdXMkMShkKSB7CiAgICAgIHJldHVybiBNYXRoLnNxcnQoZC52YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5kZXgkMigpIHsKICAgICAgdmFyIHJhZGl1cyA9IG51bGwsCiAgICAgICAgICBkeCA9IDEsCiAgICAgICAgICBkeSA9IDEsCiAgICAgICAgICBwYWRkaW5nID0gY29uc3RhbnRaZXJvOwoKICAgICAgZnVuY3Rpb24gcGFjayhyb290KSB7CiAgICAgICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7CiAgICAgICAgaWYgKHJhZGl1cykgewogICAgICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYocmFkaXVzKSkKICAgICAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihwYWRkaW5nLCAwLjUpKQogICAgICAgICAgICAgIC5lYWNoQmVmb3JlKHRyYW5zbGF0ZUNoaWxkKDEpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYoZGVmYXVsdFJhZGl1cyQxKSkKICAgICAgICAgICAgICAuZWFjaEFmdGVyKHBhY2tDaGlsZHJlbihjb25zdGFudFplcm8sIDEpKQogICAgICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuKHBhZGRpbmcsIHJvb3QuciAvIE1hdGgubWluKGR4LCBkeSkpKQogICAgICAgICAgICAgIC5lYWNoQmVmb3JlKHRyYW5zbGF0ZUNoaWxkKE1hdGgubWluKGR4LCBkeSkgLyAoMiAqIHJvb3QucikpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH0KCiAgICAgIHBhY2sucmFkaXVzID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IG9wdGlvbmFsKHgpLCBwYWNrKSA6IHJhZGl1czsKICAgICAgfTsKCiAgICAgIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYWNrKSA6IFtkeCwgZHldOwogICAgICB9OwoKICAgICAgcGFjay5wYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmcgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCQ5KCt4KSwgcGFjaykgOiBwYWRkaW5nOwogICAgICB9OwoKICAgICAgcmV0dXJuIHBhY2s7CiAgICB9CgogICAgZnVuY3Rpb24gcmFkaXVzTGVhZihyYWRpdXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBpZiAoIW5vZGUuY2hpbGRyZW4pIHsKICAgICAgICAgIG5vZGUuciA9IE1hdGgubWF4KDAsICtyYWRpdXMobm9kZSkgfHwgMCk7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBhY2tDaGlsZHJlbihwYWRkaW5nLCBrKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgewogICAgICAgICAgdmFyIGNoaWxkcmVuLAogICAgICAgICAgICAgIGksCiAgICAgICAgICAgICAgbiA9IGNoaWxkcmVuLmxlbmd0aCwKICAgICAgICAgICAgICByID0gcGFkZGluZyhub2RlKSAqIGsgfHwgMCwKICAgICAgICAgICAgICBlOwoKICAgICAgICAgIGlmIChyKSBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBjaGlsZHJlbltpXS5yICs9IHI7CiAgICAgICAgICBlID0gcGFja0VuY2xvc2UoY2hpbGRyZW4pOwogICAgICAgICAgaWYgKHIpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNoaWxkcmVuW2ldLnIgLT0gcjsKICAgICAgICAgIG5vZGUuciA9IGUgKyByOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVDaGlsZChrKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUucGFyZW50OwogICAgICAgIG5vZGUuciAqPSBrOwogICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgIG5vZGUueCA9IHBhcmVudC54ICsgayAqIG5vZGUueDsKICAgICAgICAgIG5vZGUueSA9IHBhcmVudC55ICsgayAqIG5vZGUueTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcm91bmROb2RlKG5vZGUpIHsKICAgICAgbm9kZS54MCA9IE1hdGgucm91bmQobm9kZS54MCk7CiAgICAgIG5vZGUueTAgPSBNYXRoLnJvdW5kKG5vZGUueTApOwogICAgICBub2RlLngxID0gTWF0aC5yb3VuZChub2RlLngxKTsKICAgICAgbm9kZS55MSA9IE1hdGgucm91bmQobm9kZS55MSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZW1hcERpY2UocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgICBub2RlLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHgxIC0geDApIC8gcGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxOwogICAgICAgIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgwICs9IG5vZGUudmFsdWUgKiBrOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcGFydGl0aW9uKCkgewogICAgICB2YXIgZHggPSAxLAogICAgICAgICAgZHkgPSAxLAogICAgICAgICAgcGFkZGluZyA9IDAsCiAgICAgICAgICByb3VuZCA9IGZhbHNlOwoKICAgICAgZnVuY3Rpb24gcGFydGl0aW9uKHJvb3QpIHsKICAgICAgICB2YXIgbiA9IHJvb3QuaGVpZ2h0ICsgMTsKICAgICAgICByb290LngwID0KICAgICAgICByb290LnkwID0gcGFkZGluZzsKICAgICAgICByb290LngxID0gZHg7CiAgICAgICAgcm9vdC55MSA9IGR5IC8gbjsKICAgICAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKGR5LCBuKSk7CiAgICAgICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlKTsKICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcG9zaXRpb25Ob2RlKGR5LCBuKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgICAgICAgIHRyZWVtYXBEaWNlKG5vZGUsIG5vZGUueDAsIGR5ICogKG5vZGUuZGVwdGggKyAxKSAvIG4sIG5vZGUueDEsIGR5ICogKG5vZGUuZGVwdGggKyAyKSAvIG4pOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHgwID0gbm9kZS54MCwKICAgICAgICAgICAgICB5MCA9IG5vZGUueTAsCiAgICAgICAgICAgICAgeDEgPSBub2RlLngxIC0gcGFkZGluZywKICAgICAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nOwogICAgICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOwogICAgICAgICAgbm9kZS54MCA9IHgwOwogICAgICAgICAgbm9kZS55MCA9IHkwOwogICAgICAgICAgbm9kZS54MSA9IHgxOwogICAgICAgICAgbm9kZS55MSA9IHkxOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHBhcnRpdGlvbi5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgcGFydGl0aW9uKSA6IHJvdW5kOwogICAgICB9OwoKICAgICAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFydGl0aW9uKSA6IFtkeCwgZHldOwogICAgICB9OwoKICAgICAgcGFydGl0aW9uLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZyA9ICt4LCBwYXJ0aXRpb24pIDogcGFkZGluZzsKICAgICAgfTsKCiAgICAgIHJldHVybiBwYXJ0aXRpb247CiAgICB9CgogICAgdmFyIGtleVByZWZpeCQxID0gIiQiLCAvLyBQcm90ZWN0IGFnYWluc3Qga2V5cyBsaWtlIOKAnF9fcHJvdG9fX+KAnS4KICAgICAgICBwcmVyb290ID0ge2RlcHRoOiAtMX0sCiAgICAgICAgYW1iaWd1b3VzID0ge307CgogICAgZnVuY3Rpb24gZGVmYXVsdElkKGQpIHsKICAgICAgcmV0dXJuIGQuaWQ7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFBhcmVudElkKGQpIHsKICAgICAgcmV0dXJuIGQucGFyZW50SWQ7CiAgICB9CgogICAgZnVuY3Rpb24gc3RyYXRpZnkoKSB7CiAgICAgIHZhciBpZCA9IGRlZmF1bHRJZCwKICAgICAgICAgIHBhcmVudElkID0gZGVmYXVsdFBhcmVudElkOwoKICAgICAgZnVuY3Rpb24gc3RyYXRpZnkoZGF0YSkgewogICAgICAgIHZhciBkLAogICAgICAgICAgICBpLAogICAgICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIHJvb3QsCiAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgbm9kZSwKICAgICAgICAgICAgbm9kZXMgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIG5vZGVJZCwKICAgICAgICAgICAgbm9kZUtleSwKICAgICAgICAgICAgbm9kZUJ5S2V5ID0ge307CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGQgPSBkYXRhW2ldLCBub2RlID0gbm9kZXNbaV0gPSBuZXcgTm9kZSQxKGQpOwogICAgICAgICAgaWYgKChub2RlSWQgPSBpZChkLCBpLCBkYXRhKSkgIT0gbnVsbCAmJiAobm9kZUlkICs9ICIiKSkgewogICAgICAgICAgICBub2RlS2V5ID0ga2V5UHJlZml4JDEgKyAobm9kZS5pZCA9IG5vZGVJZCk7CiAgICAgICAgICAgIG5vZGVCeUtleVtub2RlS2V5XSA9IG5vZGVLZXkgaW4gbm9kZUJ5S2V5ID8gYW1iaWd1b3VzIDogbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZUlkID0gcGFyZW50SWQoZGF0YVtpXSwgaSwgZGF0YSk7CiAgICAgICAgICBpZiAobm9kZUlkID09IG51bGwgfHwgIShub2RlSWQgKz0gIiIpKSB7CiAgICAgICAgICAgIGlmIChyb290KSB0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIHJvb3RzIik7CiAgICAgICAgICAgIHJvb3QgPSBub2RlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcGFyZW50ID0gbm9kZUJ5S2V5W2tleVByZWZpeCQxICsgbm9kZUlkXTsKICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHRocm93IG5ldyBFcnJvcigibWlzc2luZzogIiArIG5vZGVJZCk7CiAgICAgICAgICAgIGlmIChwYXJlbnQgPT09IGFtYmlndW91cykgdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIgKyBub2RlSWQpOwogICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuKSBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTsKICAgICAgICAgICAgZWxzZSBwYXJlbnQuY2hpbGRyZW4gPSBbbm9kZV07CiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoIm5vIHJvb3QiKTsKICAgICAgICByb290LnBhcmVudCA9IHByZXJvb3Q7CiAgICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsgbm9kZS5kZXB0aCA9IG5vZGUucGFyZW50LmRlcHRoICsgMTsgLS1uOyB9KS5lYWNoQmVmb3JlKGNvbXB1dGVIZWlnaHQpOwogICAgICAgIHJvb3QucGFyZW50ID0gbnVsbDsKICAgICAgICBpZiAobiA+IDApIHRocm93IG5ldyBFcnJvcigiY3ljbGUiKTsKCiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH0KCiAgICAgIHN0cmF0aWZ5LmlkID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlkID0gcmVxdWlyZWQoeCksIHN0cmF0aWZ5KSA6IGlkOwogICAgICB9OwoKICAgICAgc3RyYXRpZnkucGFyZW50SWQgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFyZW50SWQgPSByZXF1aXJlZCh4KSwgc3RyYXRpZnkpIDogcGFyZW50SWQ7CiAgICAgIH07CgogICAgICByZXR1cm4gc3RyYXRpZnk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFNlcGFyYXRpb24kMShhLCBiKSB7CiAgICAgIHJldHVybiBhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMjsKICAgIH0KCiAgICAvLyBmdW5jdGlvbiByYWRpYWxTZXBhcmF0aW9uKGEsIGIpIHsKICAgIC8vICAgcmV0dXJuIChhLnBhcmVudCA9PT0gYi5wYXJlbnQgPyAxIDogMikgLyBhLmRlcHRoOwogICAgLy8gfQoKICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byB0cmF2ZXJzZSB0aGUgbGVmdCBjb250b3VyIG9mIGEgc3VidHJlZSAob3IKICAgIC8vIHN1YmZvcmVzdCkuIEl0IHJldHVybnMgdGhlIHN1Y2Nlc3NvciBvZiB2IG9uIHRoaXMgY29udG91ci4gVGhpcyBzdWNjZXNzb3IgaXMKICAgIC8vIGVpdGhlciBnaXZlbiBieSB0aGUgbGVmdG1vc3QgY2hpbGQgb2YgdiBvciBieSB0aGUgdGhyZWFkIG9mIHYuIFRoZSBmdW5jdGlvbgogICAgLy8gcmV0dXJucyBudWxsIGlmIGFuZCBvbmx5IGlmIHYgaXMgb24gdGhlIGhpZ2hlc3QgbGV2ZWwgb2YgaXRzIHN1YnRyZWUuCiAgICBmdW5jdGlvbiBuZXh0TGVmdCh2KSB7CiAgICAgIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW47CiAgICAgIHJldHVybiBjaGlsZHJlbiA/IGNoaWxkcmVuWzBdIDogdi50OwogICAgfQoKICAgIC8vIFRoaXMgZnVuY3Rpb24gd29ya3MgYW5hbG9nb3VzbHkgdG8gbmV4dExlZnQuCiAgICBmdW5jdGlvbiBuZXh0UmlnaHQodikgewogICAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOwogICAgICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA6IHYudDsKICAgIH0KCiAgICAvLyBTaGlmdHMgdGhlIGN1cnJlbnQgc3VidHJlZSByb290ZWQgYXQgdysuIFRoaXMgaXMgZG9uZSBieSBpbmNyZWFzaW5nCiAgICAvLyBwcmVsaW0odyspIGFuZCBtb2QodyspIGJ5IHNoaWZ0LgogICAgZnVuY3Rpb24gbW92ZVN1YnRyZWUod20sIHdwLCBzaGlmdCkgewogICAgICB2YXIgY2hhbmdlID0gc2hpZnQgLyAod3AuaSAtIHdtLmkpOwogICAgICB3cC5jIC09IGNoYW5nZTsKICAgICAgd3AucyArPSBzaGlmdDsKICAgICAgd20uYyArPSBjaGFuZ2U7CiAgICAgIHdwLnogKz0gc2hpZnQ7CiAgICAgIHdwLm0gKz0gc2hpZnQ7CiAgICB9CgogICAgLy8gQWxsIG90aGVyIHNoaWZ0cywgYXBwbGllZCB0byB0aGUgc21hbGxlciBzdWJ0cmVlcyBiZXR3ZWVuIHctIGFuZCB3KywgYXJlCiAgICAvLyBwZXJmb3JtZWQgYnkgdGhpcyBmdW5jdGlvbi4gVG8gcHJlcGFyZSB0aGUgc2hpZnRzLCB3ZSBoYXZlIHRvIGFkanVzdAogICAgLy8gY2hhbmdlKHcrKSwgc2hpZnQodyspLCBhbmQgY2hhbmdlKHctKS4KICAgIGZ1bmN0aW9uIGV4ZWN1dGVTaGlmdHModikgewogICAgICB2YXIgc2hpZnQgPSAwLAogICAgICAgICAgY2hhbmdlID0gMCwKICAgICAgICAgIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwKICAgICAgICAgIGkgPSBjaGlsZHJlbi5sZW5ndGgsCiAgICAgICAgICB3OwogICAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgICB3ID0gY2hpbGRyZW5baV07CiAgICAgICAgdy56ICs9IHNoaWZ0OwogICAgICAgIHcubSArPSBzaGlmdDsKICAgICAgICBzaGlmdCArPSB3LnMgKyAoY2hhbmdlICs9IHcuYyk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBJZiB2aS3igJlzIGFuY2VzdG9yIGlzIGEgc2libGluZyBvZiB2LCByZXR1cm5zIHZpLeKAmXMgYW5jZXN0b3IuIE90aGVyd2lzZSwKICAgIC8vIHJldHVybnMgdGhlIHNwZWNpZmllZCAoZGVmYXVsdCkgYW5jZXN0b3IuCiAgICBmdW5jdGlvbiBuZXh0QW5jZXN0b3IodmltLCB2LCBhbmNlc3RvcikgewogICAgICByZXR1cm4gdmltLmEucGFyZW50ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7CiAgICB9CgogICAgZnVuY3Rpb24gVHJlZU5vZGUobm9kZSwgaSkgewogICAgICB0aGlzLl8gPSBub2RlOwogICAgICB0aGlzLnBhcmVudCA9IG51bGw7CiAgICAgIHRoaXMuY2hpbGRyZW4gPSBudWxsOwogICAgICB0aGlzLkEgPSBudWxsOyAvLyBkZWZhdWx0IGFuY2VzdG9yCiAgICAgIHRoaXMuYSA9IHRoaXM7IC8vIGFuY2VzdG9yCiAgICAgIHRoaXMueiA9IDA7IC8vIHByZWxpbQogICAgICB0aGlzLm0gPSAwOyAvLyBtb2QKICAgICAgdGhpcy5jID0gMDsgLy8gY2hhbmdlCiAgICAgIHRoaXMucyA9IDA7IC8vIHNoaWZ0CiAgICAgIHRoaXMudCA9IG51bGw7IC8vIHRocmVhZAogICAgICB0aGlzLmkgPSBpOyAvLyBudW1iZXIKICAgIH0KCiAgICBUcmVlTm9kZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKE5vZGUkMS5wcm90b3R5cGUpOwoKICAgIGZ1bmN0aW9uIHRyZWVSb290KHJvb3QpIHsKICAgICAgdmFyIHRyZWUgPSBuZXcgVHJlZU5vZGUocm9vdCwgMCksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZXMgPSBbdHJlZV0sCiAgICAgICAgICBjaGlsZCwKICAgICAgICAgIGNoaWxkcmVuLAogICAgICAgICAgaSwKICAgICAgICAgIG47CgogICAgICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICAgICAgaWYgKGNoaWxkcmVuID0gbm9kZS5fLmNoaWxkcmVuKSB7CiAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KG4gPSBjaGlsZHJlbi5sZW5ndGgpOwogICAgICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldID0gbmV3IFRyZWVOb2RlKGNoaWxkcmVuW2ldLCBpKSk7CiAgICAgICAgICAgIGNoaWxkLnBhcmVudCA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAodHJlZS5wYXJlbnQgPSBuZXcgVHJlZU5vZGUobnVsbCwgMCkpLmNoaWxkcmVuID0gW3RyZWVdOwogICAgICByZXR1cm4gdHJlZTsKICAgIH0KCiAgICAvLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkICJ0aWR5IiBhbGdvcml0aG0KICAgIGZ1bmN0aW9uIHRyZWUoKSB7CiAgICAgIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24kMSwKICAgICAgICAgIGR4ID0gMSwKICAgICAgICAgIGR5ID0gMSwKICAgICAgICAgIG5vZGVTaXplID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIHRyZWUocm9vdCkgewogICAgICAgIHZhciB0ID0gdHJlZVJvb3Qocm9vdCk7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIGxheW91dCB1c2luZyBCdWNoaGVpbSBldCBhbC7igJlzIGFsZ29yaXRobS4KICAgICAgICB0LmVhY2hBZnRlcihmaXJzdFdhbGspLCB0LnBhcmVudC5tID0gLXQuejsKICAgICAgICB0LmVhY2hCZWZvcmUoc2Vjb25kV2Fsayk7CgogICAgICAgIC8vIElmIGEgZml4ZWQgbm9kZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeS4KICAgICAgICBpZiAobm9kZVNpemUpIHJvb3QuZWFjaEJlZm9yZShzaXplTm9kZSk7CgogICAgICAgIC8vIElmIGEgZml4ZWQgdHJlZSBzaXplIGlzIHNwZWNpZmllZCwgc2NhbGUgeCBhbmQgeSBiYXNlZCBvbiB0aGUgZXh0ZW50LgogICAgICAgIC8vIENvbXB1dGUgdGhlIGxlZnQtbW9zdCwgcmlnaHQtbW9zdCwgYW5kIGRlcHRoLW1vc3Qgbm9kZXMgZm9yIGV4dGVudHMuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgbGVmdCA9IHJvb3QsCiAgICAgICAgICAgICAgcmlnaHQgPSByb290LAogICAgICAgICAgICAgIGJvdHRvbSA9IHJvb3Q7CiAgICAgICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewogICAgICAgICAgICBpZiAobm9kZS54IDwgbGVmdC54KSBsZWZ0ID0gbm9kZTsKICAgICAgICAgICAgaWYgKG5vZGUueCA+IHJpZ2h0LngpIHJpZ2h0ID0gbm9kZTsKICAgICAgICAgICAgaWYgKG5vZGUuZGVwdGggPiBib3R0b20uZGVwdGgpIGJvdHRvbSA9IG5vZGU7CiAgICAgICAgICB9KTsKICAgICAgICAgIHZhciBzID0gbGVmdCA9PT0gcmlnaHQgPyAxIDogc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLAogICAgICAgICAgICAgIHR4ID0gcyAtIGxlZnQueCwKICAgICAgICAgICAgICBreCA9IGR4IC8gKHJpZ2h0LnggKyBzICsgdHgpLAogICAgICAgICAgICAgIGt5ID0gZHkgLyAoYm90dG9tLmRlcHRoIHx8IDEpOwogICAgICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgbm9kZS54ID0gKG5vZGUueCArIHR4KSAqIGt4OwogICAgICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICoga3k7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByb290OwogICAgICB9CgogICAgICAvLyBDb21wdXRlcyBhIHByZWxpbWluYXJ5IHgtY29vcmRpbmF0ZSBmb3Igdi4gQmVmb3JlIHRoYXQsIEZJUlNUIFdBTEsgaXMKICAgICAgLy8gYXBwbGllZCByZWN1cnNpdmVseSB0byB0aGUgY2hpbGRyZW4gb2YgdiwgYXMgd2VsbCBhcyB0aGUgZnVuY3Rpb24KICAgICAgLy8gQVBQT1JUSU9OLiBBZnRlciBzcGFjaW5nIG91dCB0aGUgY2hpbGRyZW4gYnkgY2FsbGluZyBFWEVDVVRFIFNISUZUUywgdGhlCiAgICAgIC8vIG5vZGUgdiBpcyBwbGFjZWQgdG8gdGhlIG1pZHBvaW50IG9mIGl0cyBvdXRlcm1vc3QgY2hpbGRyZW4uCiAgICAgIGZ1bmN0aW9uIGZpcnN0V2Fsayh2KSB7CiAgICAgICAgdmFyIGNoaWxkcmVuID0gdi5jaGlsZHJlbiwKICAgICAgICAgICAgc2libGluZ3MgPSB2LnBhcmVudC5jaGlsZHJlbiwKICAgICAgICAgICAgdyA9IHYuaSA/IHNpYmxpbmdzW3YuaSAtIDFdIDogbnVsbDsKICAgICAgICBpZiAoY2hpbGRyZW4pIHsKICAgICAgICAgIGV4ZWN1dGVTaGlmdHModik7CiAgICAgICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjsKICAgICAgICAgIGlmICh3KSB7CiAgICAgICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pOwogICAgICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHYueiA9IG1pZHBvaW50OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodykgewogICAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7CiAgICAgICAgfQogICAgICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5wYXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGVzIGFsbCByZWFsIHgtY29vcmRpbmF0ZXMgYnkgc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIHJlY3Vyc2l2ZWx5LgogICAgICBmdW5jdGlvbiBzZWNvbmRXYWxrKHYpIHsKICAgICAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07CiAgICAgICAgdi5tICs9IHYucGFyZW50Lm07CiAgICAgIH0KCiAgICAgIC8vIFRoZSBjb3JlIG9mIHRoZSBhbGdvcml0aG0uIEhlcmUsIGEgbmV3IHN1YnRyZWUgaXMgY29tYmluZWQgd2l0aCB0aGUKICAgICAgLy8gcHJldmlvdXMgc3VidHJlZXMuIFRocmVhZHMgYXJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGluc2lkZSBhbmQgb3V0c2lkZQogICAgICAvLyBjb250b3VycyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSB1cCB0byB0aGUgaGlnaGVzdCBjb21tb24gbGV2ZWwuIFRoZQogICAgICAvLyB2ZXJ0aWNlcyB1c2VkIGZvciB0aGUgdHJhdmVyc2FscyBhcmUgdmkrLCB2aS0sIHZvLSwgYW5kIHZvKywgd2hlcmUgdGhlCiAgICAgIC8vIHN1cGVyc2NyaXB0IG8gbWVhbnMgb3V0c2lkZSBhbmQgaSBtZWFucyBpbnNpZGUsIHRoZSBzdWJzY3JpcHQgLSBtZWFucyBsZWZ0CiAgICAgIC8vIHN1YnRyZWUgYW5kICsgbWVhbnMgcmlnaHQgc3VidHJlZS4gRm9yIHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyBhbG9uZyB0aGUKICAgICAgLy8gY29udG91ciwgd2UgdXNlIHJlc3BlY3RpdmUgdmFyaWFibGVzIHNpKywgc2ktLCBzby0sIGFuZCBzbysuIFdoZW5ldmVyIHR3bwogICAgICAvLyBub2RlcyBvZiB0aGUgaW5zaWRlIGNvbnRvdXJzIGNvbmZsaWN0LCB3ZSBjb21wdXRlIHRoZSBsZWZ0IG9uZSBvZiB0aGUKICAgICAgLy8gZ3JlYXRlc3QgdW5jb21tb24gYW5jZXN0b3JzIHVzaW5nIHRoZSBmdW5jdGlvbiBBTkNFU1RPUiBhbmQgY2FsbCBNT1ZFCiAgICAgIC8vIFNVQlRSRUUgdG8gc2hpZnQgdGhlIHN1YnRyZWUgYW5kIHByZXBhcmUgdGhlIHNoaWZ0cyBvZiBzbWFsbGVyIHN1YnRyZWVzLgogICAgICAvLyBGaW5hbGx5LCB3ZSBhZGQgYSBuZXcgdGhyZWFkIChpZiBuZWNlc3NhcnkpLgogICAgICBmdW5jdGlvbiBhcHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHsKICAgICAgICBpZiAodykgewogICAgICAgICAgdmFyIHZpcCA9IHYsCiAgICAgICAgICAgICAgdm9wID0gdiwKICAgICAgICAgICAgICB2aW0gPSB3LAogICAgICAgICAgICAgIHZvbSA9IHZpcC5wYXJlbnQuY2hpbGRyZW5bMF0sCiAgICAgICAgICAgICAgc2lwID0gdmlwLm0sCiAgICAgICAgICAgICAgc29wID0gdm9wLm0sCiAgICAgICAgICAgICAgc2ltID0gdmltLm0sCiAgICAgICAgICAgICAgc29tID0gdm9tLm0sCiAgICAgICAgICAgICAgc2hpZnQ7CiAgICAgICAgICB3aGlsZSAodmltID0gbmV4dFJpZ2h0KHZpbSksIHZpcCA9IG5leHRMZWZ0KHZpcCksIHZpbSAmJiB2aXApIHsKICAgICAgICAgICAgdm9tID0gbmV4dExlZnQodm9tKTsKICAgICAgICAgICAgdm9wID0gbmV4dFJpZ2h0KHZvcCk7CiAgICAgICAgICAgIHZvcC5hID0gdjsKICAgICAgICAgICAgc2hpZnQgPSB2aW0ueiArIHNpbSAtIHZpcC56IC0gc2lwICsgc2VwYXJhdGlvbih2aW0uXywgdmlwLl8pOwogICAgICAgICAgICBpZiAoc2hpZnQgPiAwKSB7CiAgICAgICAgICAgICAgbW92ZVN1YnRyZWUobmV4dEFuY2VzdG9yKHZpbSwgdiwgYW5jZXN0b3IpLCB2LCBzaGlmdCk7CiAgICAgICAgICAgICAgc2lwICs9IHNoaWZ0OwogICAgICAgICAgICAgIHNvcCArPSBzaGlmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzaW0gKz0gdmltLm07CiAgICAgICAgICAgIHNpcCArPSB2aXAubTsKICAgICAgICAgICAgc29tICs9IHZvbS5tOwogICAgICAgICAgICBzb3AgKz0gdm9wLm07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltICYmICFuZXh0UmlnaHQodm9wKSkgewogICAgICAgICAgICB2b3AudCA9IHZpbTsKICAgICAgICAgICAgdm9wLm0gKz0gc2ltIC0gc29wOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHZpcCAmJiAhbmV4dExlZnQodm9tKSkgewogICAgICAgICAgICB2b20udCA9IHZpcDsKICAgICAgICAgICAgdm9tLm0gKz0gc2lwIC0gc29tOwogICAgICAgICAgICBhbmNlc3RvciA9IHY7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbmNlc3RvcjsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2l6ZU5vZGUobm9kZSkgewogICAgICAgIG5vZGUueCAqPSBkeDsKICAgICAgICBub2RlLnkgPSBub2RlLmRlcHRoICogZHk7CiAgICAgIH0KCiAgICAgIHRyZWUuc2VwYXJhdGlvbiA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzZXBhcmF0aW9uID0geCwgdHJlZSkgOiBzZXBhcmF0aW9uOwogICAgICB9OwoKICAgICAgdHJlZS5zaXplID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gZmFsc2UsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWUpIDogKG5vZGVTaXplID8gbnVsbCA6IFtkeCwgZHldKTsKICAgICAgfTsKCiAgICAgIHRyZWUubm9kZVNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSB0cnVlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IFtkeCwgZHldIDogbnVsbCk7CiAgICAgIH07CgogICAgICByZXR1cm4gdHJlZTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlbWFwU2xpY2UocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgICBub2RlLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgxOwogICAgICAgIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkwICs9IG5vZGUudmFsdWUgKiBrOwogICAgICB9CiAgICB9CgogICAgdmFyIHBoaSA9ICgxICsgTWF0aC5zcXJ0KDUpKSAvIDI7CgogICAgZnVuY3Rpb24gc3F1YXJpZnlSYXRpbyhyYXRpbywgcGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgcm93cyA9IFtdLAogICAgICAgICAgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgICByb3csCiAgICAgICAgICBub2RlVmFsdWUsCiAgICAgICAgICBpMCA9IDAsCiAgICAgICAgICBpMSA9IDAsCiAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgZHgsIGR5LAogICAgICAgICAgdmFsdWUgPSBwYXJlbnQudmFsdWUsCiAgICAgICAgICBzdW1WYWx1ZSwKICAgICAgICAgIG1pblZhbHVlLAogICAgICAgICAgbWF4VmFsdWUsCiAgICAgICAgICBuZXdSYXRpbywKICAgICAgICAgIG1pblJhdGlvLAogICAgICAgICAgYWxwaGEsCiAgICAgICAgICBiZXRhOwoKICAgICAgd2hpbGUgKGkwIDwgbikgewogICAgICAgIGR4ID0geDEgLSB4MCwgZHkgPSB5MSAtIHkwOwoKICAgICAgICAvLyBGaW5kIHRoZSBuZXh0IG5vbi1lbXB0eSBub2RlLgogICAgICAgIGRvIHN1bVZhbHVlID0gbm9kZXNbaTErK10udmFsdWU7IHdoaWxlICghc3VtVmFsdWUgJiYgaTEgPCBuKTsKICAgICAgICBtaW5WYWx1ZSA9IG1heFZhbHVlID0gc3VtVmFsdWU7CiAgICAgICAgYWxwaGEgPSBNYXRoLm1heChkeSAvIGR4LCBkeCAvIGR5KSAvICh2YWx1ZSAqIHJhdGlvKTsKICAgICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOwogICAgICAgIG1pblJhdGlvID0gTWF0aC5tYXgobWF4VmFsdWUgLyBiZXRhLCBiZXRhIC8gbWluVmFsdWUpOwoKICAgICAgICAvLyBLZWVwIGFkZGluZyBub2RlcyB3aGlsZSB0aGUgYXNwZWN0IHJhdGlvIG1haW50YWlucyBvciBpbXByb3Zlcy4KICAgICAgICBmb3IgKDsgaTEgPCBuOyArK2kxKSB7CiAgICAgICAgICBzdW1WYWx1ZSArPSBub2RlVmFsdWUgPSBub2Rlc1tpMV0udmFsdWU7CiAgICAgICAgICBpZiAobm9kZVZhbHVlIDwgbWluVmFsdWUpIG1pblZhbHVlID0gbm9kZVZhbHVlOwogICAgICAgICAgaWYgKG5vZGVWYWx1ZSA+IG1heFZhbHVlKSBtYXhWYWx1ZSA9IG5vZGVWYWx1ZTsKICAgICAgICAgIGJldGEgPSBzdW1WYWx1ZSAqIHN1bVZhbHVlICogYWxwaGE7CiAgICAgICAgICBuZXdSYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTsKICAgICAgICAgIGlmIChuZXdSYXRpbyA+IG1pblJhdGlvKSB7IHN1bVZhbHVlIC09IG5vZGVWYWx1ZTsgYnJlYWs7IH0KICAgICAgICAgIG1pblJhdGlvID0gbmV3UmF0aW87CiAgICAgICAgfQoKICAgICAgICAvLyBQb3NpdGlvbiBhbmQgcmVjb3JkIHRoZSByb3cgb3JpZW50YXRpb24uCiAgICAgICAgcm93cy5wdXNoKHJvdyA9IHt2YWx1ZTogc3VtVmFsdWUsIGRpY2U6IGR4IDwgZHksIGNoaWxkcmVuOiBub2Rlcy5zbGljZShpMCwgaTEpfSk7CiAgICAgICAgaWYgKHJvdy5kaWNlKSB0cmVlbWFwRGljZShyb3csIHgwLCB5MCwgeDEsIHZhbHVlID8geTAgKz0gZHkgKiBzdW1WYWx1ZSAvIHZhbHVlIDogeTEpOwogICAgICAgIGVsc2UgdHJlZW1hcFNsaWNlKHJvdywgeDAsIHkwLCB2YWx1ZSA/IHgwICs9IGR4ICogc3VtVmFsdWUgLyB2YWx1ZSA6IHgxLCB5MSk7CiAgICAgICAgdmFsdWUgLT0gc3VtVmFsdWUsIGkwID0gaTE7CiAgICAgIH0KCiAgICAgIHJldHVybiByb3dzOwogICAgfQoKICAgIHZhciBzcXVhcmlmeSA9IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgICAgIGZ1bmN0aW9uIHNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgICBzcXVhcmlmeVJhdGlvKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTsKICAgICAgfQoKICAgICAgc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7CiAgICAgIH07CgogICAgICByZXR1cm4gc3F1YXJpZnk7CiAgICB9KShwaGkpOwoKICAgIGZ1bmN0aW9uIGluZGV4JDMoKSB7CiAgICAgIHZhciB0aWxlID0gc3F1YXJpZnksCiAgICAgICAgICByb3VuZCA9IGZhbHNlLAogICAgICAgICAgZHggPSAxLAogICAgICAgICAgZHkgPSAxLAogICAgICAgICAgcGFkZGluZ1N0YWNrID0gWzBdLAogICAgICAgICAgcGFkZGluZ0lubmVyID0gY29uc3RhbnRaZXJvLAogICAgICAgICAgcGFkZGluZ1RvcCA9IGNvbnN0YW50WmVybywKICAgICAgICAgIHBhZGRpbmdSaWdodCA9IGNvbnN0YW50WmVybywKICAgICAgICAgIHBhZGRpbmdCb3R0b20gPSBjb25zdGFudFplcm8sCiAgICAgICAgICBwYWRkaW5nTGVmdCA9IGNvbnN0YW50WmVybzsKCiAgICAgIGZ1bmN0aW9uIHRyZWVtYXAocm9vdCkgewogICAgICAgIHJvb3QueDAgPQogICAgICAgIHJvb3QueTAgPSAwOwogICAgICAgIHJvb3QueDEgPSBkeDsKICAgICAgICByb290LnkxID0gZHk7CiAgICAgICAgcm9vdC5lYWNoQmVmb3JlKHBvc2l0aW9uTm9kZSk7CiAgICAgICAgcGFkZGluZ1N0YWNrID0gWzBdOwogICAgICAgIGlmIChyb3VuZCkgcm9vdC5lYWNoQmVmb3JlKHJvdW5kTm9kZSk7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShub2RlKSB7CiAgICAgICAgdmFyIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aF0sCiAgICAgICAgICAgIHgwID0gbm9kZS54MCArIHAsCiAgICAgICAgICAgIHkwID0gbm9kZS55MCArIHAsCiAgICAgICAgICAgIHgxID0gbm9kZS54MSAtIHAsCiAgICAgICAgICAgIHkxID0gbm9kZS55MSAtIHA7CiAgICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsKICAgICAgICBub2RlLngwID0geDA7CiAgICAgICAgbm9kZS55MCA9IHkwOwogICAgICAgIG5vZGUueDEgPSB4MTsKICAgICAgICBub2RlLnkxID0geTE7CiAgICAgICAgaWYgKG5vZGUuY2hpbGRyZW4pIHsKICAgICAgICAgIHAgPSBwYWRkaW5nU3RhY2tbbm9kZS5kZXB0aCArIDFdID0gcGFkZGluZ0lubmVyKG5vZGUpIC8gMjsKICAgICAgICAgIHgwICs9IHBhZGRpbmdMZWZ0KG5vZGUpIC0gcDsKICAgICAgICAgIHkwICs9IHBhZGRpbmdUb3Aobm9kZSkgLSBwOwogICAgICAgICAgeDEgLT0gcGFkZGluZ1JpZ2h0KG5vZGUpIC0gcDsKICAgICAgICAgIHkxIC09IHBhZGRpbmdCb3R0b20obm9kZSkgLSBwOwogICAgICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOwogICAgICAgICAgdGlsZShub2RlLCB4MCwgeTAsIHgxLCB5MSk7CiAgICAgICAgfQogICAgICB9CgogICAgICB0cmVlbWFwLnJvdW5kID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISF4LCB0cmVlbWFwKSA6IHJvdW5kOwogICAgICB9OwoKICAgICAgdHJlZW1hcC5zaXplID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIHRyZWVtYXApIDogW2R4LCBkeV07CiAgICAgIH07CgogICAgICB0cmVlbWFwLnRpbGUgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlsZSA9IHJlcXVpcmVkKHgpLCB0cmVlbWFwKSA6IHRpbGU7CiAgICAgIH07CgogICAgICB0cmVlbWFwLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdJbm5lcih4KS5wYWRkaW5nT3V0ZXIoeCkgOiB0cmVlbWFwLnBhZGRpbmdJbm5lcigpOwogICAgICB9OwoKICAgICAgdHJlZW1hcC5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyOwogICAgICB9OwoKICAgICAgdHJlZW1hcC5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRpbmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ1RvcCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nVG9wID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ1JpZ2h0ID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdSaWdodCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JDkoK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdSaWdodDsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkOSgreCksIHRyZWVtYXApIDogcGFkZGluZ0JvdHRvbTsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ0xlZnQgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0xlZnQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCQ5KCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nTGVmdDsKICAgICAgfTsKCiAgICAgIHJldHVybiB0cmVlbWFwOwogICAgfQoKICAgIGZ1bmN0aW9uIGJpbmFyeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIHZhciBub2RlcyA9IHBhcmVudC5jaGlsZHJlbiwKICAgICAgICAgIGksIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgICBzdW0sIHN1bXMgPSBuZXcgQXJyYXkobiArIDEpOwoKICAgICAgZm9yIChzdW1zWzBdID0gc3VtID0gaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBzdW1zW2kgKyAxXSA9IHN1bSArPSBub2Rlc1tpXS52YWx1ZTsKICAgICAgfQoKICAgICAgcGFydGl0aW9uKDAsIG4sIHBhcmVudC52YWx1ZSwgeDAsIHkwLCB4MSwgeTEpOwoKICAgICAgZnVuY3Rpb24gcGFydGl0aW9uKGksIGosIHZhbHVlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICAgIGlmIChpID49IGogLSAxKSB7CiAgICAgICAgICB2YXIgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgbm9kZS54MCA9IHgwLCBub2RlLnkwID0geTA7CiAgICAgICAgICBub2RlLngxID0geDEsIG5vZGUueTEgPSB5MTsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHZhciB2YWx1ZU9mZnNldCA9IHN1bXNbaV0sCiAgICAgICAgICAgIHZhbHVlVGFyZ2V0ID0gKHZhbHVlIC8gMikgKyB2YWx1ZU9mZnNldCwKICAgICAgICAgICAgayA9IGkgKyAxLAogICAgICAgICAgICBoaSA9IGogLSAxOwoKICAgICAgICB3aGlsZSAoayA8IGhpKSB7CiAgICAgICAgICB2YXIgbWlkID0gayArIGhpID4+PiAxOwogICAgICAgICAgaWYgKHN1bXNbbWlkXSA8IHZhbHVlVGFyZ2V0KSBrID0gbWlkICsgMTsKICAgICAgICAgIGVsc2UgaGkgPSBtaWQ7CiAgICAgICAgfQoKICAgICAgICBpZiAoKHZhbHVlVGFyZ2V0IC0gc3Vtc1trIC0gMV0pIDwgKHN1bXNba10gLSB2YWx1ZVRhcmdldCkgJiYgaSArIDEgPCBrKSAtLWs7CgogICAgICAgIHZhciB2YWx1ZUxlZnQgPSBzdW1zW2tdIC0gdmFsdWVPZmZzZXQsCiAgICAgICAgICAgIHZhbHVlUmlnaHQgPSB2YWx1ZSAtIHZhbHVlTGVmdDsKCiAgICAgICAgaWYgKCh4MSAtIHgwKSA+ICh5MSAtIHkwKSkgewogICAgICAgICAgdmFyIHhrID0gKHgwICogdmFsdWVSaWdodCArIHgxICogdmFsdWVMZWZ0KSAvIHZhbHVlOwogICAgICAgICAgcGFydGl0aW9uKGksIGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4aywgeTEpOwogICAgICAgICAgcGFydGl0aW9uKGssIGosIHZhbHVlUmlnaHQsIHhrLCB5MCwgeDEsIHkxKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHlrID0gKHkwICogdmFsdWVSaWdodCArIHkxICogdmFsdWVMZWZ0KSAvIHZhbHVlOwogICAgICAgICAgcGFydGl0aW9uKGksIGssIHZhbHVlTGVmdCwgeDAsIHkwLCB4MSwgeWspOwogICAgICAgICAgcGFydGl0aW9uKGssIGosIHZhbHVlUmlnaHQsIHgwLCB5aywgeDEsIHkxKTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzbGljZURpY2UocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICAocGFyZW50LmRlcHRoICYgMSA/IHRyZWVtYXBTbGljZSA6IHRyZWVtYXBEaWNlKShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTsKICAgIH0KCiAgICB2YXIgcmVzcXVhcmlmeSA9IChmdW5jdGlvbiBjdXN0b20ocmF0aW8pIHsKCiAgICAgIGZ1bmN0aW9uIHJlc3F1YXJpZnkocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICAgIGlmICgocm93cyA9IHBhcmVudC5fc3F1YXJpZnkpICYmIChyb3dzLnJhdGlvID09PSByYXRpbykpIHsKICAgICAgICAgIHZhciByb3dzLAogICAgICAgICAgICAgIHJvdywKICAgICAgICAgICAgICBub2RlcywKICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgIGogPSAtMSwKICAgICAgICAgICAgICBuLAogICAgICAgICAgICAgIG0gPSByb3dzLmxlbmd0aCwKICAgICAgICAgICAgICB2YWx1ZSA9IHBhcmVudC52YWx1ZTsKCiAgICAgICAgICB3aGlsZSAoKytqIDwgbSkgewogICAgICAgICAgICByb3cgPSByb3dzW2pdLCBub2RlcyA9IHJvdy5jaGlsZHJlbjsKICAgICAgICAgICAgZm9yIChpID0gcm93LnZhbHVlID0gMCwgbiA9IG5vZGVzLmxlbmd0aDsgaSA8IG47ICsraSkgcm93LnZhbHVlICs9IG5vZGVzW2ldLnZhbHVlOwogICAgICAgICAgICBpZiAocm93LmRpY2UpIHRyZWVtYXBEaWNlKHJvdywgeDAsIHkwLCB4MSwgeTAgKz0gKHkxIC0geTApICogcm93LnZhbHVlIC8gdmFsdWUpOwogICAgICAgICAgICBlbHNlIHRyZWVtYXBTbGljZShyb3csIHgwLCB5MCwgeDAgKz0gKHgxIC0geDApICogcm93LnZhbHVlIC8gdmFsdWUsIHkxKTsKICAgICAgICAgICAgdmFsdWUgLT0gcm93LnZhbHVlOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwYXJlbnQuX3NxdWFyaWZ5ID0gcm93cyA9IHNxdWFyaWZ5UmF0aW8ocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOwogICAgICAgICAgcm93cy5yYXRpbyA9IHJhdGlvOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmVzcXVhcmlmeS5yYXRpbyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCh4ID0gK3gpID4gMSA/IHggOiAxKTsKICAgICAgfTsKCiAgICAgIHJldHVybiByZXNxdWFyaWZ5OwogICAgfSkocGhpKTsKCiAgICBmdW5jdGlvbiBhcmVhJDIocG9seWdvbikgewogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLAogICAgICAgICAgYSwKICAgICAgICAgIGIgPSBwb2x5Z29uW24gLSAxXSwKICAgICAgICAgIGFyZWEgPSAwOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBhID0gYjsKICAgICAgICBiID0gcG9seWdvbltpXTsKICAgICAgICBhcmVhICs9IGFbMV0gKiBiWzBdIC0gYVswXSAqIGJbMV07CiAgICAgIH0KCiAgICAgIHJldHVybiBhcmVhIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZCQxKHBvbHlnb24pIHsKICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgICAgIHggPSAwLAogICAgICAgICAgeSA9IDAsCiAgICAgICAgICBhLAogICAgICAgICAgYiA9IHBvbHlnb25bbiAtIDFdLAogICAgICAgICAgYywKICAgICAgICAgIGsgPSAwOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBhID0gYjsKICAgICAgICBiID0gcG9seWdvbltpXTsKICAgICAgICBrICs9IGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdOwogICAgICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7CiAgICAgICAgeSArPSAoYVsxXSArIGJbMV0pICogYzsKICAgICAgfQoKICAgICAgcmV0dXJuIGsgKj0gMywgW3ggLyBrLCB5IC8ga107CiAgICB9CgogICAgLy8gUmV0dXJucyB0aGUgMkQgY3Jvc3MgcHJvZHVjdCBvZiBBQiBhbmQgQUMgdmVjdG9ycywgaS5lLiwgdGhlIHotY29tcG9uZW50IG9mCiAgICAvLyB0aGUgM0QgY3Jvc3MgcHJvZHVjdCBpbiBhIHF1YWRyYW50IEkgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtICgreCBpcwogICAgLy8gcmlnaHQsICt5IGlzIHVwKS4gUmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlIGlmIEFCQyBpcyBjb3VudGVyLWNsb2Nrd2lzZSwKICAgIC8vIG5lZ2F0aXZlIGlmIGNsb2Nrd2lzZSwgYW5kIHplcm8gaWYgdGhlIHBvaW50cyBhcmUgY29sbGluZWFyLgogICAgZnVuY3Rpb24gY3Jvc3MkMShhLCBiLCBjKSB7CiAgICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKGNbMV0gLSBhWzFdKSAtIChiWzFdIC0gYVsxXSkgKiAoY1swXSAtIGFbMF0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGxleGljb2dyYXBoaWNPcmRlcihhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdIC0gYlswXSB8fCBhWzFdIC0gYlsxXTsKICAgIH0KCiAgICAvLyBDb21wdXRlcyB0aGUgdXBwZXIgY29udmV4IGh1bGwgcGVyIHRoZSBtb25vdG9uZSBjaGFpbiBhbGdvcml0aG0uCiAgICAvLyBBc3N1bWVzIHBvaW50cy5sZW5ndGggPj0gMywgaXMgc29ydGVkIGJ5IHgsIHVuaXF1ZSBpbiB5LgogICAgLy8gUmV0dXJucyBhbiBhcnJheSBvZiBpbmRpY2VzIGludG8gcG9pbnRzIGluIGxlZnQtdG8tcmlnaHQgb3JkZXIuCiAgICBmdW5jdGlvbiBjb21wdXRlVXBwZXJIdWxsSW5kZXhlcyhwb2ludHMpIHsKICAgICAgdmFyIG4gPSBwb2ludHMubGVuZ3RoLAogICAgICAgICAgaW5kZXhlcyA9IFswLCAxXSwKICAgICAgICAgIHNpemUgPSAyOwoKICAgICAgZm9yICh2YXIgaSA9IDI7IGkgPCBuOyArK2kpIHsKICAgICAgICB3aGlsZSAoc2l6ZSA+IDEgJiYgY3Jvc3MkMShwb2ludHNbaW5kZXhlc1tzaXplIC0gMl1dLCBwb2ludHNbaW5kZXhlc1tzaXplIC0gMV1dLCBwb2ludHNbaV0pIDw9IDApIC0tc2l6ZTsKICAgICAgICBpbmRleGVzW3NpemUrK10gPSBpOwogICAgICB9CgogICAgICByZXR1cm4gaW5kZXhlcy5zbGljZSgwLCBzaXplKTsgLy8gcmVtb3ZlIHBvcHBlZCBwb2ludHMKICAgIH0KCiAgICBmdW5jdGlvbiBodWxsKHBvaW50cykgewogICAgICBpZiAoKG4gPSBwb2ludHMubGVuZ3RoKSA8IDMpIHJldHVybiBudWxsOwoKICAgICAgdmFyIGksCiAgICAgICAgICBuLAogICAgICAgICAgc29ydGVkUG9pbnRzID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgZmxpcHBlZFBvaW50cyA9IG5ldyBBcnJheShuKTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNvcnRlZFBvaW50c1tpXSA9IFsrcG9pbnRzW2ldWzBdLCArcG9pbnRzW2ldWzFdLCBpXTsKICAgICAgc29ydGVkUG9pbnRzLnNvcnQobGV4aWNvZ3JhcGhpY09yZGVyKTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgZmxpcHBlZFBvaW50c1tpXSA9IFtzb3J0ZWRQb2ludHNbaV1bMF0sIC1zb3J0ZWRQb2ludHNbaV1bMV1dOwoKICAgICAgdmFyIHVwcGVySW5kZXhlcyA9IGNvbXB1dGVVcHBlckh1bGxJbmRleGVzKHNvcnRlZFBvaW50cyksCiAgICAgICAgICBsb3dlckluZGV4ZXMgPSBjb21wdXRlVXBwZXJIdWxsSW5kZXhlcyhmbGlwcGVkUG9pbnRzKTsKCiAgICAgIC8vIENvbnN0cnVjdCB0aGUgaHVsbCBwb2x5Z29uLCByZW1vdmluZyBwb3NzaWJsZSBkdXBsaWNhdGUgZW5kcG9pbnRzLgogICAgICB2YXIgc2tpcExlZnQgPSBsb3dlckluZGV4ZXNbMF0gPT09IHVwcGVySW5kZXhlc1swXSwKICAgICAgICAgIHNraXBSaWdodCA9IGxvd2VySW5kZXhlc1tsb3dlckluZGV4ZXMubGVuZ3RoIC0gMV0gPT09IHVwcGVySW5kZXhlc1t1cHBlckluZGV4ZXMubGVuZ3RoIC0gMV0sCiAgICAgICAgICBodWxsID0gW107CgogICAgICAvLyBBZGQgdXBwZXIgaHVsbCBpbiByaWdodC10by1sIG9yZGVyLgogICAgICAvLyBUaGVuIGFkZCBsb3dlciBodWxsIGluIGxlZnQtdG8tcmlnaHQgb3JkZXIuCiAgICAgIGZvciAoaSA9IHVwcGVySW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbdXBwZXJJbmRleGVzW2ldXVsyXV0pOwogICAgICBmb3IgKGkgPSArc2tpcExlZnQ7IGkgPCBsb3dlckluZGV4ZXMubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIGh1bGwucHVzaChwb2ludHNbc29ydGVkUG9pbnRzW2xvd2VySW5kZXhlc1tpXV1bMl1dKTsKCiAgICAgIHJldHVybiBodWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRhaW5zJDIocG9seWdvbiwgcG9pbnQpIHsKICAgICAgdmFyIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgICAgIHAgPSBwb2x5Z29uW24gLSAxXSwKICAgICAgICAgIHggPSBwb2ludFswXSwgeSA9IHBvaW50WzFdLAogICAgICAgICAgeDAgPSBwWzBdLCB5MCA9IHBbMV0sCiAgICAgICAgICB4MSwgeTEsCiAgICAgICAgICBpbnNpZGUgPSBmYWxzZTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcCA9IHBvbHlnb25baV0sIHgxID0gcFswXSwgeTEgPSBwWzFdOwogICAgICAgIGlmICgoKHkxID4geSkgIT09ICh5MCA+IHkpKSAmJiAoeCA8ICh4MCAtIHgxKSAqICh5IC0geTEpIC8gKHkwIC0geTEpICsgeDEpKSBpbnNpZGUgPSAhaW5zaWRlOwogICAgICAgIHgwID0geDEsIHkwID0geTE7CiAgICAgIH0KCiAgICAgIHJldHVybiBpbnNpZGU7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuZ3RoJDIocG9seWdvbikgewogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLAogICAgICAgICAgYiA9IHBvbHlnb25bbiAtIDFdLAogICAgICAgICAgeGEsCiAgICAgICAgICB5YSwKICAgICAgICAgIHhiID0gYlswXSwKICAgICAgICAgIHliID0gYlsxXSwKICAgICAgICAgIHBlcmltZXRlciA9IDA7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHhhID0geGI7CiAgICAgICAgeWEgPSB5YjsKICAgICAgICBiID0gcG9seWdvbltpXTsKICAgICAgICB4YiA9IGJbMF07CiAgICAgICAgeWIgPSBiWzFdOwogICAgICAgIHhhIC09IHhiOwogICAgICAgIHlhIC09IHliOwogICAgICAgIHBlcmltZXRlciArPSBNYXRoLnNxcnQoeGEgKiB4YSArIHlhICogeWEpOwogICAgICB9CgogICAgICByZXR1cm4gcGVyaW1ldGVyOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRTb3VyY2UkMSgpIHsKICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCk7CiAgICB9CgogICAgdmFyIHVuaWZvcm0gPSAoZnVuY3Rpb24gc291cmNlUmFuZG9tVW5pZm9ybShzb3VyY2UpIHsKICAgICAgZnVuY3Rpb24gcmFuZG9tVW5pZm9ybShtaW4sIG1heCkgewogICAgICAgIG1pbiA9IG1pbiA9PSBudWxsID8gMCA6ICttaW47CiAgICAgICAgbWF4ID0gbWF4ID09IG51bGwgPyAxIDogK21heDsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMSkgbWF4ID0gbWluLCBtaW4gPSAwOwogICAgICAgIGVsc2UgbWF4IC09IG1pbjsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc291cmNlKCkgKiBtYXggKyBtaW47CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgcmFuZG9tVW5pZm9ybS5zb3VyY2UgPSBzb3VyY2VSYW5kb21Vbmlmb3JtOwoKICAgICAgcmV0dXJuIHJhbmRvbVVuaWZvcm07CiAgICB9KShkZWZhdWx0U291cmNlJDEpOwoKICAgIHZhciBub3JtYWwgPSAoZnVuY3Rpb24gc291cmNlUmFuZG9tTm9ybWFsKHNvdXJjZSkgewogICAgICBmdW5jdGlvbiByYW5kb21Ob3JtYWwobXUsIHNpZ21hKSB7CiAgICAgICAgdmFyIHgsIHI7CiAgICAgICAgbXUgPSBtdSA9PSBudWxsID8gMCA6ICttdTsKICAgICAgICBzaWdtYSA9IHNpZ21hID09IG51bGwgPyAxIDogK3NpZ21hOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciB5OwoKICAgICAgICAgIC8vIElmIGF2YWlsYWJsZSwgdXNlIHRoZSBzZWNvbmQgcHJldmlvdXNseS1nZW5lcmF0ZWQgdW5pZm9ybSByYW5kb20uCiAgICAgICAgICBpZiAoeCAhPSBudWxsKSB5ID0geCwgeCA9IG51bGw7CgogICAgICAgICAgLy8gT3RoZXJ3aXNlLCBnZW5lcmF0ZSBhIG5ldyB4IGFuZCB5LgogICAgICAgICAgZWxzZSBkbyB7CiAgICAgICAgICAgIHggPSBzb3VyY2UoKSAqIDIgLSAxOwogICAgICAgICAgICB5ID0gc291cmNlKCkgKiAyIC0gMTsKICAgICAgICAgICAgciA9IHggKiB4ICsgeSAqIHk7CiAgICAgICAgICB9IHdoaWxlICghciB8fCByID4gMSk7CgogICAgICAgICAgcmV0dXJuIG11ICsgc2lnbWEgKiB5ICogTWF0aC5zcXJ0KC0yICogTWF0aC5sb2cocikgLyByKTsKICAgICAgICB9OwogICAgICB9CgogICAgICByYW5kb21Ob3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTm9ybWFsOwoKICAgICAgcmV0dXJuIHJhbmRvbU5vcm1hbDsKICAgIH0pKGRlZmF1bHRTb3VyY2UkMSk7CgogICAgdmFyIGxvZ05vcm1hbCA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Mb2dOb3JtYWwoc291cmNlKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmRvbUxvZ05vcm1hbCgpIHsKICAgICAgICB2YXIgcmFuZG9tTm9ybWFsID0gbm9ybWFsLnNvdXJjZShzb3VyY2UpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIE1hdGguZXhwKHJhbmRvbU5vcm1hbCgpKTsKICAgICAgICB9OwogICAgICB9CgogICAgICByYW5kb21Mb2dOb3JtYWwuc291cmNlID0gc291cmNlUmFuZG9tTG9nTm9ybWFsOwoKICAgICAgcmV0dXJuIHJhbmRvbUxvZ05vcm1hbDsKICAgIH0pKGRlZmF1bHRTb3VyY2UkMSk7CgogICAgdmFyIGlyd2luSGFsbCA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21JcndpbkhhbGwoc291cmNlKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmRvbUlyd2luSGFsbChuKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgZm9yICh2YXIgc3VtID0gMCwgaSA9IDA7IGkgPCBuOyArK2kpIHN1bSArPSBzb3VyY2UoKTsKICAgICAgICAgIHJldHVybiBzdW07CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgcmFuZG9tSXJ3aW5IYWxsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUlyd2luSGFsbDsKCiAgICAgIHJldHVybiByYW5kb21JcndpbkhhbGw7CiAgICB9KShkZWZhdWx0U291cmNlJDEpOwoKICAgIHZhciBiYXRlcyA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21CYXRlcyhzb3VyY2UpIHsKICAgICAgZnVuY3Rpb24gcmFuZG9tQmF0ZXMobikgewogICAgICAgIHZhciByYW5kb21JcndpbkhhbGwgPSBpcndpbkhhbGwuc291cmNlKHNvdXJjZSkobik7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHJhbmRvbUlyd2luSGFsbCgpIC8gbjsKICAgICAgICB9OwogICAgICB9CgogICAgICByYW5kb21CYXRlcy5zb3VyY2UgPSBzb3VyY2VSYW5kb21CYXRlczsKCiAgICAgIHJldHVybiByYW5kb21CYXRlczsKICAgIH0pKGRlZmF1bHRTb3VyY2UkMSk7CgogICAgdmFyIGV4cG9uZW50aWFsJDEgPSAoZnVuY3Rpb24gc291cmNlUmFuZG9tRXhwb25lbnRpYWwoc291cmNlKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmRvbUV4cG9uZW50aWFsKGxhbWJkYSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiAtTWF0aC5sb2coMSAtIHNvdXJjZSgpKSAvIGxhbWJkYTsKICAgICAgICB9OwogICAgICB9CgogICAgICByYW5kb21FeHBvbmVudGlhbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21FeHBvbmVudGlhbDsKCiAgICAgIHJldHVybiByYW5kb21FeHBvbmVudGlhbDsKICAgIH0pKGRlZmF1bHRTb3VyY2UkMSk7CgogICAgZnVuY3Rpb24gaW5pdFJhbmdlKGRvbWFpbiwgcmFuZ2UpIHsKICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHRoaXMucmFuZ2UoZG9tYWluKTsgYnJlYWs7CiAgICAgICAgZGVmYXVsdDogdGhpcy5yYW5nZShyYW5nZSkuZG9tYWluKGRvbWFpbik7IGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXRJbnRlcnBvbGF0b3IoZG9tYWluLCBpbnRlcnBvbGF0b3IpIHsKICAgICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7CiAgICAgICAgY2FzZSAwOiBicmVhazsKICAgICAgICBjYXNlIDE6IHRoaXMuaW50ZXJwb2xhdG9yKGRvbWFpbik7IGJyZWFrOwogICAgICAgIGRlZmF1bHQ6IHRoaXMuaW50ZXJwb2xhdG9yKGludGVycG9sYXRvcikuZG9tYWluKGRvbWFpbik7IGJyZWFrOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHZhciBhcnJheSQzID0gQXJyYXkucHJvdG90eXBlOwoKICAgIHZhciBtYXAkMyA9IGFycmF5JDMubWFwOwogICAgdmFyIHNsaWNlJDUgPSBhcnJheSQzLnNsaWNlOwoKICAgIHZhciBpbXBsaWNpdCA9IHtuYW1lOiAiaW1wbGljaXQifTsKCiAgICBmdW5jdGlvbiBvcmRpbmFsKCkgewogICAgICB2YXIgaW5kZXggPSBtYXAkMSgpLAogICAgICAgICAgZG9tYWluID0gW10sCiAgICAgICAgICByYW5nZSA9IFtdLAogICAgICAgICAgdW5rbm93biA9IGltcGxpY2l0OwoKICAgICAgZnVuY3Rpb24gc2NhbGUoZCkgewogICAgICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsKICAgICAgICBpZiAoIWkpIHsKICAgICAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCkgcmV0dXJuIHVua25vd247CiAgICAgICAgICBpbmRleC5zZXQoa2V5LCBpID0gZG9tYWluLnB1c2goZCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2VbKGkgLSAxKSAlIHJhbmdlLmxlbmd0aF07CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTsKICAgICAgICBkb21haW4gPSBbXSwgaW5kZXggPSBtYXAkMSgpOwogICAgICAgIHZhciBpID0gLTEsIG4gPSBfLmxlbmd0aCwgZCwga2V5OwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWluZGV4LmhhcyhrZXkgPSAoZCA9IF9baV0pICsgIiIpKSBpbmRleC5zZXQoa2V5LCBkb21haW4ucHVzaChkKSk7CiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9OwoKICAgICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZSQ1LmNhbGwoXyksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7CiAgICAgIH07CgogICAgICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBvcmRpbmFsKGRvbWFpbiwgcmFuZ2UpLnVua25vd24odW5rbm93bik7CiAgICAgIH07CgogICAgICBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7CgogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CgogICAgZnVuY3Rpb24gYmFuZCgpIHsKICAgICAgdmFyIHNjYWxlID0gb3JkaW5hbCgpLnVua25vd24odW5kZWZpbmVkKSwKICAgICAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbiwKICAgICAgICAgIG9yZGluYWxSYW5nZSA9IHNjYWxlLnJhbmdlLAogICAgICAgICAgcmFuZ2UgPSBbMCwgMV0sCiAgICAgICAgICBzdGVwLAogICAgICAgICAgYmFuZHdpZHRoLAogICAgICAgICAgcm91bmQgPSBmYWxzZSwKICAgICAgICAgIHBhZGRpbmdJbm5lciA9IDAsCiAgICAgICAgICBwYWRkaW5nT3V0ZXIgPSAwLAogICAgICAgICAgYWxpZ24gPSAwLjU7CgogICAgICBkZWxldGUgc2NhbGUudW5rbm93bjsKCiAgICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgICAgdmFyIG4gPSBkb21haW4oKS5sZW5ndGgsCiAgICAgICAgICAgIHJldmVyc2UgPSByYW5nZVsxXSA8IHJhbmdlWzBdLAogICAgICAgICAgICBzdGFydCA9IHJhbmdlW3JldmVyc2UgLSAwXSwKICAgICAgICAgICAgc3RvcCA9IHJhbmdlWzEgLSByZXZlcnNlXTsKICAgICAgICBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgxLCBuIC0gcGFkZGluZ0lubmVyICsgcGFkZGluZ091dGVyICogMik7CiAgICAgICAgaWYgKHJvdW5kKSBzdGVwID0gTWF0aC5mbG9vcihzdGVwKTsKICAgICAgICBzdGFydCArPSAoc3RvcCAtIHN0YXJ0IC0gc3RlcCAqIChuIC0gcGFkZGluZ0lubmVyKSkgKiBhbGlnbjsKICAgICAgICBiYW5kd2lkdGggPSBzdGVwICogKDEgLSBwYWRkaW5nSW5uZXIpOwogICAgICAgIGlmIChyb3VuZCkgc3RhcnQgPSBNYXRoLnJvdW5kKHN0YXJ0KSwgYmFuZHdpZHRoID0gTWF0aC5yb3VuZChiYW5kd2lkdGgpOwogICAgICAgIHZhciB2YWx1ZXMgPSBzZXF1ZW5jZShuKS5tYXAoZnVuY3Rpb24oaSkgeyByZXR1cm4gc3RhcnQgKyBzdGVwICogaTsgfSk7CiAgICAgICAgcmV0dXJuIG9yZGluYWxSYW5nZShyZXZlcnNlID8gdmFsdWVzLnJldmVyc2UoKSA6IHZhbHVlcyk7CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4oXyksIHJlc2NhbGUoKSkgOiBkb21haW4oKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gWytfWzBdLCArX1sxXV0sIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUucmFuZ2VSb3VuZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gcmFuZ2UgPSBbK19bMF0sICtfWzFdXSwgcm91bmQgPSB0cnVlLCByZXNjYWxlKCk7CiAgICAgIH07CgogICAgICBzY2FsZS5iYW5kd2lkdGggPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYmFuZHdpZHRoOwogICAgICB9OwoKICAgICAgc2NhbGUuc3RlcCA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBzdGVwOwogICAgICB9OwoKICAgICAgc2NhbGUucm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocm91bmQgPSAhIV8sIHJlc2NhbGUoKSkgOiByb3VuZDsKICAgICAgfTsKCiAgICAgIHNjYWxlLnBhZGRpbmcgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gTWF0aC5taW4oMSwgcGFkZGluZ091dGVyID0gK18pLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyOwogICAgICB9OwoKICAgICAgc2NhbGUucGFkZGluZ0lubmVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIF8pLCByZXNjYWxlKCkpIDogcGFkZGluZ0lubmVyOwogICAgICB9OwoKICAgICAgc2NhbGUucGFkZGluZ091dGVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdPdXRlciA9ICtfLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyOwogICAgICB9OwoKICAgICAgc2NhbGUuYWxpZ24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYmFuZChkb21haW4oKSwgcmFuZ2UpCiAgICAgICAgICAgIC5yb3VuZChyb3VuZCkKICAgICAgICAgICAgLnBhZGRpbmdJbm5lcihwYWRkaW5nSW5uZXIpCiAgICAgICAgICAgIC5wYWRkaW5nT3V0ZXIocGFkZGluZ091dGVyKQogICAgICAgICAgICAuYWxpZ24oYWxpZ24pOwogICAgICB9OwoKICAgICAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShyZXNjYWxlKCksIGFyZ3VtZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnRpc2goc2NhbGUpIHsKICAgICAgdmFyIGNvcHkgPSBzY2FsZS5jb3B5OwoKICAgICAgc2NhbGUucGFkZGluZyA9IHNjYWxlLnBhZGRpbmdPdXRlcjsKICAgICAgZGVsZXRlIHNjYWxlLnBhZGRpbmdJbm5lcjsKICAgICAgZGVsZXRlIHNjYWxlLnBhZGRpbmdPdXRlcjsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcG9pbnRpc2goY29weSgpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBzY2FsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2ludCQxKCkgewogICAgICByZXR1cm4gcG9pbnRpc2goYmFuZC5hcHBseShudWxsLCBhcmd1bWVudHMpLnBhZGRpbmdJbm5lcigxKSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkYSh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBudW1iZXIkMih4KSB7CiAgICAgIHJldHVybiAreDsKICAgIH0KCiAgICB2YXIgdW5pdCA9IFswLCAxXTsKCiAgICBmdW5jdGlvbiBpZGVudGl0eSQ2KHgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ybWFsaXplJDEoYSwgYikgewogICAgICByZXR1cm4gKGIgLT0gKGEgPSArYSkpCiAgICAgICAgICA/IGZ1bmN0aW9uKHgpIHsgcmV0dXJuICh4IC0gYSkgLyBiOyB9CiAgICAgICAgICA6IGNvbnN0YW50JGEoaXNOYU4oYikgPyBOYU4gOiAwLjUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYW1wZXIoZG9tYWluKSB7CiAgICAgIHZhciBhID0gZG9tYWluWzBdLCBiID0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSwgdDsKICAgICAgaWYgKGEgPiBiKSB0ID0gYSwgYSA9IGIsIGIgPSB0OwogICAgICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5tYXgoYSwgTWF0aC5taW4oYiwgeCkpOyB9OwogICAgfQoKICAgIC8vIG5vcm1hbGl6ZShhLCBiKSh4KSB0YWtlcyBhIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0IGluIFswLDFdLgogICAgLy8gaW50ZXJwb2xhdGUoYSwgYikodCkgdGFrZXMgYSBwYXJhbWV0ZXIgdCBpbiBbMCwxXSBhbmQgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyByYW5nZSB2YWx1ZSB4IGluIFthLGJdLgogICAgZnVuY3Rpb24gYmltYXAoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUpIHsKICAgICAgdmFyIGQwID0gZG9tYWluWzBdLCBkMSA9IGRvbWFpblsxXSwgcjAgPSByYW5nZVswXSwgcjEgPSByYW5nZVsxXTsKICAgICAgaWYgKGQxIDwgZDApIGQwID0gbm9ybWFsaXplJDEoZDEsIGQwKSwgcjAgPSBpbnRlcnBvbGF0ZShyMSwgcjApOwogICAgICBlbHNlIGQwID0gbm9ybWFsaXplJDEoZDAsIGQxKSwgcjAgPSBpbnRlcnBvbGF0ZShyMCwgcjEpOwogICAgICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4gcjAoZDAoeCkpOyB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvbHltYXAoZG9tYWluLCByYW5nZSwgaW50ZXJwb2xhdGUpIHsKICAgICAgdmFyIGogPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGgpIC0gMSwKICAgICAgICAgIGQgPSBuZXcgQXJyYXkoaiksCiAgICAgICAgICByID0gbmV3IEFycmF5KGopLAogICAgICAgICAgaSA9IC0xOwoKICAgICAgLy8gUmV2ZXJzZSBkZXNjZW5kaW5nIGRvbWFpbnMuCiAgICAgIGlmIChkb21haW5bal0gPCBkb21haW5bMF0pIHsKICAgICAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKS5yZXZlcnNlKCk7CiAgICAgICAgcmFuZ2UgPSByYW5nZS5zbGljZSgpLnJldmVyc2UoKTsKICAgICAgfQoKICAgICAgd2hpbGUgKCsraSA8IGopIHsKICAgICAgICBkW2ldID0gbm9ybWFsaXplJDEoZG9tYWluW2ldLCBkb21haW5baSArIDFdKTsKICAgICAgICByW2ldID0gaW50ZXJwb2xhdGUocmFuZ2VbaV0sIHJhbmdlW2kgKyAxXSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgICAgdmFyIGkgPSBiaXNlY3RSaWdodChkb21haW4sIHgsIDEsIGopIC0gMTsKICAgICAgICByZXR1cm4gcltpXShkW2ldKHgpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5KHNvdXJjZSwgdGFyZ2V0KSB7CiAgICAgIHJldHVybiB0YXJnZXQKICAgICAgICAgIC5kb21haW4oc291cmNlLmRvbWFpbigpKQogICAgICAgICAgLnJhbmdlKHNvdXJjZS5yYW5nZSgpKQogICAgICAgICAgLmludGVycG9sYXRlKHNvdXJjZS5pbnRlcnBvbGF0ZSgpKQogICAgICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKQogICAgICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtZXIkMSgpIHsKICAgICAgdmFyIGRvbWFpbiA9IHVuaXQsCiAgICAgICAgICByYW5nZSA9IHVuaXQsCiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsCiAgICAgICAgICB0cmFuc2Zvcm0sCiAgICAgICAgICB1bnRyYW5zZm9ybSwKICAgICAgICAgIHVua25vd24sCiAgICAgICAgICBjbGFtcCA9IGlkZW50aXR5JDYsCiAgICAgICAgICBwaWVjZXdpc2UsCiAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICBpbnB1dDsKCiAgICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgICAgcGllY2V3aXNlID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBwb2x5bWFwIDogYmltYXA7CiAgICAgICAgb3V0cHV0ID0gaW5wdXQgPSBudWxsOwogICAgICAgIHJldHVybiBzY2FsZTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICAgIHJldHVybiBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IChvdXRwdXQgfHwgKG91dHB1dCA9IHBpZWNld2lzZShkb21haW4ubWFwKHRyYW5zZm9ybSksIHJhbmdlLCBpbnRlcnBvbGF0ZSkpKSh0cmFuc2Zvcm0oY2xhbXAoeCkpKTsKICAgICAgfQoKICAgICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgICAgIHJldHVybiBjbGFtcCh1bnRyYW5zZm9ybSgoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4ubWFwKHRyYW5zZm9ybSksIGludGVycG9sYXRlTnVtYmVyKSkpKHkpKSk7CiAgICAgIH07CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDMuY2FsbChfLCBudW1iZXIkMiksIGNsYW1wID09PSBpZGVudGl0eSQ2IHx8IChjbGFtcCA9IGNsYW1wZXIoZG9tYWluKSksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UkNS5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIHJhbmdlID0gc2xpY2UkNS5jYWxsKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gXyA/IGNsYW1wZXIoZG9tYWluKSA6IGlkZW50aXR5JDYsIHNjYWxlKSA6IGNsYW1wICE9PSBpZGVudGl0eSQ2OwogICAgICB9OwoKICAgICAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCByZXNjYWxlKCkpIDogaW50ZXJwb2xhdGU7CiAgICAgIH07CgogICAgICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIHUpIHsKICAgICAgICB0cmFuc2Zvcm0gPSB0LCB1bnRyYW5zZm9ybSA9IHU7CiAgICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250aW51b3VzKHRyYW5zZm9ybSwgdW50cmFuc2Zvcm0pIHsKICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyJDEoKSh0cmFuc2Zvcm0sIHVudHJhbnNmb3JtKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aWNrRm9ybWF0KHN0YXJ0LCBzdG9wLCBjb3VudCwgc3BlY2lmaWVyKSB7CiAgICAgIHZhciBzdGVwID0gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSwKICAgICAgICAgIHByZWNpc2lvbjsKICAgICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllciA9PSBudWxsID8gIixmIiA6IHNwZWNpZmllcik7CiAgICAgIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHsKICAgICAgICBjYXNlICJzIjogewogICAgICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSk7CiAgICAgICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25QcmVmaXgoc3RlcCwgdmFsdWUpKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbjsKICAgICAgICAgIHJldHVybiBmb3JtYXRQcmVmaXgoc3BlY2lmaWVyLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGNhc2UgIiI6CiAgICAgICAgY2FzZSAiZSI6CiAgICAgICAgY2FzZSAiZyI6CiAgICAgICAgY2FzZSAicCI6CiAgICAgICAgY2FzZSAiciI6IHsKICAgICAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvblJvdW5kKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICJlIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiZiI6CiAgICAgICAgY2FzZSAiJSI6IHsKICAgICAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVkKHN0ZXApKSkgc3BlY2lmaWVyLnByZWNpc2lvbiA9IHByZWNpc2lvbiAtIChzcGVjaWZpZXIudHlwZSA9PT0gIiUiKSAqIDI7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZvcm1hdChzcGVjaWZpZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVhcmlzaChzY2FsZSkgewogICAgICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluOwoKICAgICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgewogICAgICAgIHZhciBkID0gZG9tYWluKCk7CiAgICAgICAgcmV0dXJuIHRpY2tzKGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQpOwogICAgICB9OwoKICAgICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsKICAgICAgICB2YXIgZCA9IGRvbWFpbigpOwogICAgICAgIHJldHVybiB0aWNrRm9ybWF0KGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgY291bnQgPT0gbnVsbCA/IDEwIDogY291bnQsIHNwZWNpZmllcik7CiAgICAgIH07CgogICAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oY291bnQpIHsKICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsKCiAgICAgICAgdmFyIGQgPSBkb21haW4oKSwKICAgICAgICAgICAgaTAgPSAwLAogICAgICAgICAgICBpMSA9IGQubGVuZ3RoIC0gMSwKICAgICAgICAgICAgc3RhcnQgPSBkW2kwXSwKICAgICAgICAgICAgc3RvcCA9IGRbaTFdLAogICAgICAgICAgICBzdGVwOwoKICAgICAgICBpZiAoc3RvcCA8IHN0YXJ0KSB7CiAgICAgICAgICBzdGVwID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IHN0ZXA7CiAgICAgICAgICBzdGVwID0gaTAsIGkwID0gaTEsIGkxID0gc3RlcDsKICAgICAgICB9CgogICAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7CgogICAgICAgIGlmIChzdGVwID4gMCkgewogICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgc3RvcCA9IE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTsKICAgICAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7CiAgICAgICAgICBzdGFydCA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXApIC8gc3RlcDsKICAgICAgICAgIHN0b3AgPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7CiAgICAgICAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOwogICAgICAgIH0KCiAgICAgICAgaWYgKHN0ZXAgPiAwKSB7CiAgICAgICAgICBkW2kwXSA9IE1hdGguZmxvb3Ioc3RhcnQgLyBzdGVwKSAqIHN0ZXA7CiAgICAgICAgICBkW2kxXSA9IE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgZG9tYWluKGQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RlcCA8IDApIHsKICAgICAgICAgIGRbaTBdID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwOwogICAgICAgICAgZFtpMV0gPSBNYXRoLmZsb29yKHN0b3AgKiBzdGVwKSAvIHN0ZXA7CiAgICAgICAgICBkb21haW4oZCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc2NhbGU7CiAgICAgIH07CgogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyJDIoKSB7CiAgICAgIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMoaWRlbnRpdHkkNiwgaWRlbnRpdHkkNik7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkoc2NhbGUsIGxpbmVhciQyKCkpOwogICAgICB9OwoKICAgICAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwoKICAgICAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gaWRlbnRpdHkkNyhkb21haW4pIHsKICAgICAgdmFyIHVua25vd247CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgcmV0dXJuIGlzTmFOKHggPSAreCkgPyB1bmtub3duIDogeDsKICAgICAgfQoKICAgICAgc2NhbGUuaW52ZXJ0ID0gc2NhbGU7CgogICAgICBzY2FsZS5kb21haW4gPSBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBtYXAkMy5jYWxsKF8sIG51bWJlciQyKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7CiAgICAgIH07CgogICAgICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBpZGVudGl0eSQ3KGRvbWFpbikudW5rbm93bih1bmtub3duKTsKICAgICAgfTsKCiAgICAgIGRvbWFpbiA9IGFyZ3VtZW50cy5sZW5ndGggPyBtYXAkMy5jYWxsKGRvbWFpbiwgbnVtYmVyJDIpIDogWzAsIDFdOwoKICAgICAgcmV0dXJuIGxpbmVhcmlzaChzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbmljZShkb21haW4sIGludGVydmFsKSB7CiAgICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpOwoKICAgICAgdmFyIGkwID0gMCwKICAgICAgICAgIGkxID0gZG9tYWluLmxlbmd0aCAtIDEsCiAgICAgICAgICB4MCA9IGRvbWFpbltpMF0sCiAgICAgICAgICB4MSA9IGRvbWFpbltpMV0sCiAgICAgICAgICB0OwoKICAgICAgaWYgKHgxIDwgeDApIHsKICAgICAgICB0ID0gaTAsIGkwID0gaTEsIGkxID0gdDsKICAgICAgICB0ID0geDAsIHgwID0geDEsIHgxID0gdDsKICAgICAgfQoKICAgICAgZG9tYWluW2kwXSA9IGludGVydmFsLmZsb29yKHgwKTsKICAgICAgZG9tYWluW2kxXSA9IGludGVydmFsLmNlaWwoeDEpOwogICAgICByZXR1cm4gZG9tYWluOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUxvZyh4KSB7CiAgICAgIHJldHVybiBNYXRoLmxvZyh4KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1FeHAoeCkgewogICAgICByZXR1cm4gTWF0aC5leHAoeCk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtTG9nbih4KSB7CiAgICAgIHJldHVybiAtTWF0aC5sb2coLXgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybUV4cG4oeCkgewogICAgICByZXR1cm4gLU1hdGguZXhwKC14KTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3cxMCh4KSB7CiAgICAgIHJldHVybiBpc0Zpbml0ZSh4KSA/ICsoIjFlIiArIHgpIDogeCA8IDAgPyAwIDogeDsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3dwKGJhc2UpIHsKICAgICAgcmV0dXJuIGJhc2UgPT09IDEwID8gcG93MTAKICAgICAgICAgIDogYmFzZSA9PT0gTWF0aC5FID8gTWF0aC5leHAKICAgICAgICAgIDogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5wb3coYmFzZSwgeCk7IH07CiAgICB9CgogICAgZnVuY3Rpb24gbG9ncChiYXNlKSB7CiAgICAgIHJldHVybiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmxvZwogICAgICAgICAgOiBiYXNlID09PSAxMCAmJiBNYXRoLmxvZzEwCiAgICAgICAgICB8fCBiYXNlID09PSAyICYmIE1hdGgubG9nMgogICAgICAgICAgfHwgKGJhc2UgPSBNYXRoLmxvZyhiYXNlKSwgZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5sb2coeCkgLyBiYXNlOyB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWZsZWN0KGYpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gLWYoLXgpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGxvZ2dpc2godHJhbnNmb3JtKSB7CiAgICAgIHZhciBzY2FsZSA9IHRyYW5zZm9ybSh0cmFuc2Zvcm1Mb2csIHRyYW5zZm9ybUV4cCksCiAgICAgICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sCiAgICAgICAgICBiYXNlID0gMTAsCiAgICAgICAgICBsb2dzLAogICAgICAgICAgcG93czsKCiAgICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgICAgbG9ncyA9IGxvZ3AoYmFzZSksIHBvd3MgPSBwb3dwKGJhc2UpOwogICAgICAgIGlmIChkb21haW4oKVswXSA8IDApIHsKICAgICAgICAgIGxvZ3MgPSByZWZsZWN0KGxvZ3MpLCBwb3dzID0gcmVmbGVjdChwb3dzKTsKICAgICAgICAgIHRyYW5zZm9ybSh0cmFuc2Zvcm1Mb2duLCB0cmFuc2Zvcm1FeHBuKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdHJhbnNmb3JtKHRyYW5zZm9ybUxvZywgdHJhbnNmb3JtRXhwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9CgogICAgICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7CiAgICAgIH07CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgICAgIH07CgogICAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7CiAgICAgICAgdmFyIGQgPSBkb21haW4oKSwKICAgICAgICAgICAgdSA9IGRbMF0sCiAgICAgICAgICAgIHYgPSBkW2QubGVuZ3RoIC0gMV0sCiAgICAgICAgICAgIHI7CgogICAgICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7CgogICAgICAgIHZhciBpID0gbG9ncyh1KSwKICAgICAgICAgICAgaiA9IGxvZ3ModiksCiAgICAgICAgICAgIHAsCiAgICAgICAgICAgIGssCiAgICAgICAgICAgIHQsCiAgICAgICAgICAgIG4gPSBjb3VudCA9PSBudWxsID8gMTAgOiArY291bnQsCiAgICAgICAgICAgIHogPSBbXTsKCiAgICAgICAgaWYgKCEoYmFzZSAlIDEpICYmIGogLSBpIDwgbikgewogICAgICAgICAgaSA9IE1hdGgucm91bmQoaSkgLSAxLCBqID0gTWF0aC5yb3VuZChqKSArIDE7CiAgICAgICAgICBpZiAodSA+IDApIGZvciAoOyBpIDwgajsgKytpKSB7CiAgICAgICAgICAgIGZvciAoayA9IDEsIHAgPSBwb3dzKGkpOyBrIDwgYmFzZTsgKytrKSB7CiAgICAgICAgICAgICAgdCA9IHAgKiBrOwogICAgICAgICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgICAgICB6LnB1c2godCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBmb3IgKDsgaSA8IGo7ICsraSkgewogICAgICAgICAgICBmb3IgKGsgPSBiYXNlIC0gMSwgcCA9IHBvd3MoaSk7IGsgPj0gMTsgLS1rKSB7CiAgICAgICAgICAgICAgdCA9IHAgKiBrOwogICAgICAgICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgICAgICB6LnB1c2godCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgeiA9IHRpY2tzKGksIGosIE1hdGgubWluKGogLSBpLCBuKSkubWFwKHBvd3MpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHIgPyB6LnJldmVyc2UoKSA6IHo7CiAgICAgIH07CgogICAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgewogICAgICAgIGlmIChzcGVjaWZpZXIgPT0gbnVsbCkgc3BlY2lmaWVyID0gYmFzZSA9PT0gMTAgPyAiLjBlIiA6ICIsIjsKICAgICAgICBpZiAodHlwZW9mIHNwZWNpZmllciAhPT0gImZ1bmN0aW9uIikgc3BlY2lmaWVyID0gZm9ybWF0KHNwZWNpZmllcik7CiAgICAgICAgaWYgKGNvdW50ID09PSBJbmZpbml0eSkgcmV0dXJuIHNwZWNpZmllcjsKICAgICAgICBpZiAoY291bnQgPT0gbnVsbCkgY291bnQgPSAxMDsKICAgICAgICB2YXIgayA9IE1hdGgubWF4KDEsIGJhc2UgKiBjb3VudCAvIHNjYWxlLnRpY2tzKCkubGVuZ3RoKTsgLy8gVE9ETyBmYXN0IGVzdGltYXRlPwogICAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgICAgICB2YXIgaSA9IGQgLyBwb3dzKE1hdGgucm91bmQobG9ncyhkKSkpOwogICAgICAgICAgaWYgKGkgKiBiYXNlIDwgYmFzZSAtIDAuNSkgaSAqPSBiYXNlOwogICAgICAgICAgcmV0dXJuIGkgPD0gayA/IHNwZWNpZmllcihkKSA6ICIiOwogICAgICAgIH07CiAgICAgIH07CgogICAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRvbWFpbihuaWNlKGRvbWFpbigpLCB7CiAgICAgICAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gcG93cyhNYXRoLmZsb29yKGxvZ3MoeCkpKTsgfSwKICAgICAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5jZWlsKGxvZ3MoeCkpKTsgfQogICAgICAgIH0pKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBzY2FsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2ckMSgpIHsKICAgICAgdmFyIHNjYWxlID0gbG9nZ2lzaCh0cmFuc2Zvcm1lciQxKCkpLmRvbWFpbihbMSwgMTBdKTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gY29weShzY2FsZSwgbG9nJDEoKSkuYmFzZShzY2FsZS5iYXNlKCkpOwogICAgICB9OwoKICAgICAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVN5bWxvZyhjKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIE1hdGguc2lnbih4KSAqIE1hdGgubG9nMXAoTWF0aC5hYnMoeCAvIGMpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1TeW1leHAoYykgewogICAgICByZXR1cm4gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBNYXRoLnNpZ24oeCkgKiBNYXRoLmV4cG0xKE1hdGguYWJzKHgpKSAqIGM7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3ltbG9naXNoKHRyYW5zZm9ybSkgewogICAgICB2YXIgYyA9IDEsIHNjYWxlID0gdHJhbnNmb3JtKHRyYW5zZm9ybVN5bWxvZyhjKSwgdHJhbnNmb3JtU3ltZXhwKGMpKTsKCiAgICAgIHNjYWxlLmNvbnN0YW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gdHJhbnNmb3JtKHRyYW5zZm9ybVN5bWxvZyhjID0gK18pLCB0cmFuc2Zvcm1TeW1leHAoYykpIDogYzsKICAgICAgfTsKCiAgICAgIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN5bWxvZygpIHsKICAgICAgdmFyIHNjYWxlID0gc3ltbG9naXNoKHRyYW5zZm9ybWVyJDEoKSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkoc2NhbGUsIHN5bWxvZygpKS5jb25zdGFudChzY2FsZS5jb25zdGFudCgpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0UmFuZ2UuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtUG93KGV4cG9uZW50KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBleHBvbmVudCkgOiBNYXRoLnBvdyh4LCBleHBvbmVudCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtU3FydCh4KSB7CiAgICAgIHJldHVybiB4IDwgMCA/IC1NYXRoLnNxcnQoLXgpIDogTWF0aC5zcXJ0KHgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVNxdWFyZSh4KSB7CiAgICAgIHJldHVybiB4IDwgMCA/IC14ICogeCA6IHggKiB4OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvd2lzaCh0cmFuc2Zvcm0pIHsKICAgICAgdmFyIHNjYWxlID0gdHJhbnNmb3JtKGlkZW50aXR5JDYsIGlkZW50aXR5JDYpLAogICAgICAgICAgZXhwb25lbnQgPSAxOwoKICAgICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgICByZXR1cm4gZXhwb25lbnQgPT09IDEgPyB0cmFuc2Zvcm0oaWRlbnRpdHkkNiwgaWRlbnRpdHkkNikKICAgICAgICAgICAgOiBleHBvbmVudCA9PT0gMC41ID8gdHJhbnNmb3JtKHRyYW5zZm9ybVNxcnQsIHRyYW5zZm9ybVNxdWFyZSkKICAgICAgICAgICAgOiB0cmFuc2Zvcm0odHJhbnNmb3JtUG93KGV4cG9uZW50KSwgdHJhbnNmb3JtUG93KDEgLyBleHBvbmVudCkpOwogICAgICB9CgogICAgICBzY2FsZS5leHBvbmVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHBvbmVudCA9ICtfLCByZXNjYWxlKCkpIDogZXhwb25lbnQ7CiAgICAgIH07CgogICAgICByZXR1cm4gbGluZWFyaXNoKHNjYWxlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb3ckMSgpIHsKICAgICAgdmFyIHNjYWxlID0gcG93aXNoKHRyYW5zZm9ybWVyJDEoKSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkoc2NhbGUsIHBvdyQxKCkpLmV4cG9uZW50KHNjYWxlLmV4cG9uZW50KCkpOwogICAgICB9OwoKICAgICAgaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNxcnQkMSgpIHsKICAgICAgcmV0dXJuIHBvdyQxLmFwcGx5KG51bGwsIGFyZ3VtZW50cykuZXhwb25lbnQoMC41KTsKICAgIH0KCiAgICBmdW5jdGlvbiBxdWFudGlsZSgpIHsKICAgICAgdmFyIGRvbWFpbiA9IFtdLAogICAgICAgICAgcmFuZ2UgPSBbXSwKICAgICAgICAgIHRocmVzaG9sZHMgPSBbXSwKICAgICAgICAgIHVua25vd247CgogICAgICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlLmxlbmd0aCk7CiAgICAgICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gdGhyZXNob2xkKGRvbWFpbiwgaSAvIG4pOwogICAgICAgIHJldHVybiBzY2FsZTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICAgIHJldHVybiBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IHJhbmdlW2Jpc2VjdFJpZ2h0KHRocmVzaG9sZHMsIHgpXTsKICAgICAgfQoKICAgICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgICAgIHZhciBpID0gcmFuZ2UuaW5kZXhPZih5KTsKICAgICAgICByZXR1cm4gaSA8IDAgPyBbTmFOLCBOYU5dIDogWwogICAgICAgICAgaSA+IDAgPyB0aHJlc2hvbGRzW2kgLSAxXSA6IGRvbWFpblswXSwKICAgICAgICAgIGkgPCB0aHJlc2hvbGRzLmxlbmd0aCA/IHRocmVzaG9sZHNbaV0gOiBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdCiAgICAgICAgXTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTsKICAgICAgICBkb21haW4gPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IF8ubGVuZ3RoLCBkOyBpIDwgbjsgKytpKSBpZiAoZCA9IF9baV0sIGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7CiAgICAgICAgZG9tYWluLnNvcnQoYXNjZW5kaW5nKTsKICAgICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZSQ1LmNhbGwoXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjsKICAgICAgfTsKCiAgICAgIHNjYWxlLnF1YW50aWxlcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aHJlc2hvbGRzLnNsaWNlKCk7CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHF1YW50aWxlKCkKICAgICAgICAgICAgLmRvbWFpbihkb21haW4pCiAgICAgICAgICAgIC5yYW5nZShyYW5nZSkKICAgICAgICAgICAgLnVua25vd24odW5rbm93bik7CiAgICAgIH07CgogICAgICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YW50aXplJDEoKSB7CiAgICAgIHZhciB4MCA9IDAsCiAgICAgICAgICB4MSA9IDEsCiAgICAgICAgICBuID0gMSwKICAgICAgICAgIGRvbWFpbiA9IFswLjVdLAogICAgICAgICAgcmFuZ2UgPSBbMCwgMV0sCiAgICAgICAgICB1bmtub3duOwoKICAgICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICAgIHJldHVybiB4IDw9IHggPyByYW5nZVtiaXNlY3RSaWdodChkb21haW4sIHgsIDAsIG4pXSA6IHVua25vd247CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgICAgdmFyIGkgPSAtMTsKICAgICAgICBkb21haW4gPSBuZXcgQXJyYXkobik7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTsKICAgICAgICByZXR1cm4gc2NhbGU7CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCByZXNjYWxlKCkpIDogW3gwLCB4MV07CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuID0gKHJhbmdlID0gc2xpY2UkNS5jYWxsKF8pKS5sZW5ndGggLSAxLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgICAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7CiAgICAgICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXQogICAgICAgICAgICA6IGkgPCAxID8gW3gwLCBkb21haW5bMF1dCiAgICAgICAgICAgIDogaSA+PSBuID8gW2RvbWFpbltuIC0gMV0sIHgxXQogICAgICAgICAgICA6IFtkb21haW5baSAtIDFdLCBkb21haW5baV1dOwogICAgICB9OwoKICAgICAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogc2NhbGU7CiAgICAgIH07CgogICAgICBzY2FsZS50aHJlc2hvbGRzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRvbWFpbi5zbGljZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBxdWFudGl6ZSQxKCkKICAgICAgICAgICAgLmRvbWFpbihbeDAsIHgxXSkKICAgICAgICAgICAgLnJhbmdlKHJhbmdlKQogICAgICAgICAgICAudW5rbm93bih1bmtub3duKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0UmFuZ2UuYXBwbHkobGluZWFyaXNoKHNjYWxlKSwgYXJndW1lbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aHJlc2hvbGQkMSgpIHsKICAgICAgdmFyIGRvbWFpbiA9IFswLjVdLAogICAgICAgICAgcmFuZ2UgPSBbMCwgMV0sCiAgICAgICAgICB1bmtub3duLAogICAgICAgICAgbiA9IDE7CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgcmV0dXJuIHggPD0geCA/IHJhbmdlW2Jpc2VjdFJpZ2h0KGRvbWFpbiwgeCwgMCwgbildIDogdW5rbm93bjsKICAgICAgfQoKICAgICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IHNsaWNlJDUuY2FsbChfKSwgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UkNS5jYWxsKF8pLCBuID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoIC0gMSksIHNjYWxlKSA6IHJhbmdlLnNsaWNlKCk7CiAgICAgIH07CgogICAgICBzY2FsZS5pbnZlcnRFeHRlbnQgPSBmdW5jdGlvbih5KSB7CiAgICAgICAgdmFyIGkgPSByYW5nZS5pbmRleE9mKHkpOwogICAgICAgIHJldHVybiBbZG9tYWluW2kgLSAxXSwgZG9tYWluW2ldXTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRocmVzaG9sZCQxKCkKICAgICAgICAgICAgLmRvbWFpbihkb21haW4pCiAgICAgICAgICAgIC5yYW5nZShyYW5nZSkKICAgICAgICAgICAgLnVua25vd24odW5rbm93bik7CiAgICAgIH07CgogICAgICByZXR1cm4gaW5pdFJhbmdlLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIHZhciB0MCQxID0gbmV3IERhdGUsCiAgICAgICAgdDEkMSA9IG5ldyBEYXRlOwoKICAgIGZ1bmN0aW9uIG5ld0ludGVydmFsKGZsb29yaSwgb2Zmc2V0aSwgY291bnQsIGZpZWxkKSB7CgogICAgICBmdW5jdGlvbiBpbnRlcnZhbChkYXRlKSB7CiAgICAgICAgcmV0dXJuIGZsb29yaShkYXRlID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMCA/IG5ldyBEYXRlIDogbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTsKICAgICAgfQoKICAgICAgaW50ZXJ2YWwuZmxvb3IgPSBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoK2RhdGUpKSwgZGF0ZTsKICAgICAgfTsKCiAgICAgIGludGVydmFsLmNlaWwgPSBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgcmV0dXJuIGZsb29yaShkYXRlID0gbmV3IERhdGUoZGF0ZSAtIDEpKSwgb2Zmc2V0aShkYXRlLCAxKSwgZmxvb3JpKGRhdGUpLCBkYXRlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwucm91bmQgPSBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgdmFyIGQwID0gaW50ZXJ2YWwoZGF0ZSksCiAgICAgICAgICAgIGQxID0gaW50ZXJ2YWwuY2VpbChkYXRlKTsKICAgICAgICByZXR1cm4gZGF0ZSAtIGQwIDwgZDEgLSBkYXRlID8gZDAgOiBkMTsKICAgICAgfTsKCiAgICAgIGludGVydmFsLm9mZnNldCA9IGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICByZXR1cm4gb2Zmc2V0aShkYXRlID0gbmV3IERhdGUoK2RhdGUpLCBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKSksIGRhdGU7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5yYW5nZSA9IGZ1bmN0aW9uKHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICAgICAgdmFyIHJhbmdlID0gW10sIHByZXZpb3VzOwogICAgICAgIHN0YXJ0ID0gaW50ZXJ2YWwuY2VpbChzdGFydCk7CiAgICAgICAgc3RlcCA9IHN0ZXAgPT0gbnVsbCA/IDEgOiBNYXRoLmZsb29yKHN0ZXApOwogICAgICAgIGlmICghKHN0YXJ0IDwgc3RvcCkgfHwgIShzdGVwID4gMCkpIHJldHVybiByYW5nZTsgLy8gYWxzbyBoYW5kbGVzIEludmFsaWQgRGF0ZQogICAgICAgIGRvIHJhbmdlLnB1c2gocHJldmlvdXMgPSBuZXcgRGF0ZSgrc3RhcnQpKSwgb2Zmc2V0aShzdGFydCwgc3RlcCksIGZsb29yaShzdGFydCk7CiAgICAgICAgd2hpbGUgKHByZXZpb3VzIDwgc3RhcnQgJiYgc3RhcnQgPCBzdG9wKTsKICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5maWx0ZXIgPSBmdW5jdGlvbih0ZXN0KSB7CiAgICAgICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOwogICAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHsKICAgICAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIGlmIChjb3VudCkgewogICAgICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgICAgdDAkMS5zZXRUaW1lKCtzdGFydCksIHQxJDEuc2V0VGltZSgrZW5kKTsKICAgICAgICAgIGZsb29yaSh0MCQxKSwgZmxvb3JpKHQxJDEpOwogICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAkMSwgdDEkMSkpOwogICAgICAgIH07CgogICAgICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgewogICAgICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICAgICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbAogICAgICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbAogICAgICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkCiAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9CiAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gaW50ZXJ2YWw7CiAgICB9CgogICAgdmFyIG1pbGxpc2Vjb25kID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oKSB7CiAgICAgIC8vIG5vb3AKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiBlbmQgLSBzdGFydDsKICAgIH0pOwoKICAgIC8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KICAgIG1pbGxpc2Vjb25kLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogICAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgICAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7CiAgICAgIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kOwogICAgICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBrKSAqIGspOwogICAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGspOwogICAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBrOwogICAgICB9KTsKICAgIH07CiAgICB2YXIgbWlsbGlzZWNvbmRzID0gbWlsbGlzZWNvbmQucmFuZ2U7CgogICAgdmFyIGR1cmF0aW9uU2Vjb25kID0gMWUzOwogICAgdmFyIGR1cmF0aW9uTWludXRlID0gNmU0OwogICAgdmFyIGR1cmF0aW9uSG91ciA9IDM2ZTU7CiAgICB2YXIgZHVyYXRpb25EYXkgPSA4NjRlNTsKICAgIHZhciBkdXJhdGlvbldlZWsgPSA2MDQ4ZTU7CgogICAgdmFyIHNlY29uZCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvblNlY29uZDsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDU2Vjb25kcygpOwogICAgfSk7CiAgICB2YXIgc2Vjb25kcyA9IHNlY29uZC5yYW5nZTsKCiAgICB2YXIgbWludXRlID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOwogICAgfSk7CiAgICB2YXIgbWludXRlcyA9IG1pbnV0ZS5yYW5nZTsKCiAgICB2YXIgaG91ciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpIC0gZGF0ZS5nZXRTZWNvbmRzKCkgKiBkdXJhdGlvblNlY29uZCAtIGRhdGUuZ2V0TWludXRlcygpICogZHVyYXRpb25NaW51dGUpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCk7CiAgICB9KTsKICAgIHZhciBob3VycyA9IGhvdXIucmFuZ2U7CgogICAgdmFyIGRheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlKSAvIGR1cmF0aW9uRGF5OwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOwogICAgfSk7CiAgICB2YXIgZGF5cyA9IGRheS5yYW5nZTsKCiAgICBmdW5jdGlvbiB3ZWVrZGF5KGkpIHsKICAgICAgcmV0dXJuIG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7CiAgICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSkgLyBkdXJhdGlvbldlZWs7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBzdW5kYXkgPSB3ZWVrZGF5KDApOwogICAgdmFyIG1vbmRheSA9IHdlZWtkYXkoMSk7CiAgICB2YXIgdHVlc2RheSA9IHdlZWtkYXkoMik7CiAgICB2YXIgd2VkbmVzZGF5ID0gd2Vla2RheSgzKTsKICAgIHZhciB0aHVyc2RheSA9IHdlZWtkYXkoNCk7CiAgICB2YXIgZnJpZGF5ID0gd2Vla2RheSg1KTsKICAgIHZhciBzYXR1cmRheSA9IHdlZWtkYXkoNik7CgogICAgdmFyIHN1bmRheXMgPSBzdW5kYXkucmFuZ2U7CiAgICB2YXIgbW9uZGF5cyA9IG1vbmRheS5yYW5nZTsKICAgIHZhciB0dWVzZGF5cyA9IHR1ZXNkYXkucmFuZ2U7CiAgICB2YXIgd2VkbmVzZGF5cyA9IHdlZG5lc2RheS5yYW5nZTsKICAgIHZhciB0aHVyc2RheXMgPSB0aHVyc2RheS5yYW5nZTsKICAgIHZhciBmcmlkYXlzID0gZnJpZGF5LnJhbmdlOwogICAgdmFyIHNhdHVyZGF5cyA9IHNhdHVyZGF5LnJhbmdlOwoKICAgIHZhciBtb250aCA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXREYXRlKDEpOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kLmdldE1vbnRoKCkgLSBzdGFydC5nZXRNb250aCgpICsgKGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKSkgKiAxMjsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsKICAgIH0pOwogICAgdmFyIG1vbnRocyA9IG1vbnRoLnJhbmdlOwoKICAgIHZhciB5ZWFyID0gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldE1vbnRoKDAsIDEpOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgfSk7CgogICAgLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLgogICAgeWVhci5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICAgICAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIGRhdGUuc2V0RnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldEZ1bGxZZWFyKCkgLyBrKSAqIGspOwogICAgICAgIGRhdGUuc2V0TW9udGgoMCwgMSk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICAgIGRhdGUuc2V0RnVsbFllYXIoZGF0ZS5nZXRGdWxsWWVhcigpICsgc3RlcCAqIGspOwogICAgICB9KTsKICAgIH07CiAgICB2YXIgeWVhcnMgPSB5ZWFyLnJhbmdlOwoKICAgIHZhciB1dGNNaW51dGUgPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VVRDU2Vjb25kcygwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbk1pbnV0ZTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDTWludXRlcygpOwogICAgfSk7CiAgICB2YXIgdXRjTWludXRlcyA9IHV0Y01pbnV0ZS5yYW5nZTsKCiAgICB2YXIgdXRjSG91ciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENNaW51dGVzKDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCkgLyBkdXJhdGlvbkhvdXI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ0hvdXJzKCk7CiAgICB9KTsKICAgIHZhciB1dGNIb3VycyA9IHV0Y0hvdXIucmFuZ2U7CgogICAgdmFyIHV0Y0RheSA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25EYXk7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ0RhdGUoKSAtIDE7CiAgICB9KTsKICAgIHZhciB1dGNEYXlzID0gdXRjRGF5LnJhbmdlOwoKICAgIGZ1bmN0aW9uIHV0Y1dlZWtkYXkoaSkgewogICAgICByZXR1cm4gbmV3SW50ZXJ2YWwoZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSAtIChkYXRlLmdldFVUQ0RheSgpICsgNyAtIGkpICUgNyk7CiAgICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICAgIGRhdGUuc2V0VVRDRGF0ZShkYXRlLmdldFVUQ0RhdGUoKSArIHN0ZXAgKiA3KTsKICAgICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25XZWVrOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgdXRjU3VuZGF5ID0gdXRjV2Vla2RheSgwKTsKICAgIHZhciB1dGNNb25kYXkgPSB1dGNXZWVrZGF5KDEpOwogICAgdmFyIHV0Y1R1ZXNkYXkgPSB1dGNXZWVrZGF5KDIpOwogICAgdmFyIHV0Y1dlZG5lc2RheSA9IHV0Y1dlZWtkYXkoMyk7CiAgICB2YXIgdXRjVGh1cnNkYXkgPSB1dGNXZWVrZGF5KDQpOwogICAgdmFyIHV0Y0ZyaWRheSA9IHV0Y1dlZWtkYXkoNSk7CiAgICB2YXIgdXRjU2F0dXJkYXkgPSB1dGNXZWVrZGF5KDYpOwoKICAgIHZhciB1dGNTdW5kYXlzID0gdXRjU3VuZGF5LnJhbmdlOwogICAgdmFyIHV0Y01vbmRheXMgPSB1dGNNb25kYXkucmFuZ2U7CiAgICB2YXIgdXRjVHVlc2RheXMgPSB1dGNUdWVzZGF5LnJhbmdlOwogICAgdmFyIHV0Y1dlZG5lc2RheXMgPSB1dGNXZWRuZXNkYXkucmFuZ2U7CiAgICB2YXIgdXRjVGh1cnNkYXlzID0gdXRjVGh1cnNkYXkucmFuZ2U7CiAgICB2YXIgdXRjRnJpZGF5cyA9IHV0Y0ZyaWRheS5yYW5nZTsKICAgIHZhciB1dGNTYXR1cmRheXMgPSB1dGNTYXR1cmRheS5yYW5nZTsKCiAgICB2YXIgdXRjTW9udGggPSBuZXdJbnRlcnZhbChmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VVRDRGF0ZSgxKTsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENNb250aChkYXRlLmdldFVUQ01vbnRoKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIGVuZC5nZXRVVENNb250aCgpIC0gc3RhcnQuZ2V0VVRDTW9udGgoKSArIChlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCkpICogMTI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ01vbnRoKCk7CiAgICB9KTsKICAgIHZhciB1dGNNb250aHMgPSB1dGNNb250aC5yYW5nZTsKCiAgICB2YXIgdXRjWWVhciA9IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENNb250aCgwLCAxKTsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIGVuZC5nZXRVVENGdWxsWWVhcigpIC0gc3RhcnQuZ2V0VVRDRnVsbFllYXIoKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDRnVsbFllYXIoKTsKICAgIH0pOwoKICAgIC8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KICAgIHV0Y1llYXIuZXZlcnkgPSBmdW5jdGlvbihrKSB7CiAgICAgIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC8gaykgKiBrKTsKICAgICAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOwogICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXAgKiBrKTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIHV0Y1llYXJzID0gdXRjWWVhci5yYW5nZTsKCiAgICBmdW5jdGlvbiBsb2NhbERhdGUoZCkgewogICAgICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgtMSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCk7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkLnkpOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZShkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOwogICAgfQoKICAgIGZ1bmN0aW9uIHV0Y0RhdGUoZCkgewogICAgICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygtMSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCkpOwogICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZC55KTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3RGF0ZSh5LCBtLCBkKSB7CiAgICAgIHJldHVybiB7eTogeSwgbTogbSwgZDogZCwgSDogMCwgTTogMCwgUzogMCwgTDogMH07CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TG9jYWxlJDEobG9jYWxlKSB7CiAgICAgIHZhciBsb2NhbGVfZGF0ZVRpbWUgPSBsb2NhbGUuZGF0ZVRpbWUsCiAgICAgICAgICBsb2NhbGVfZGF0ZSA9IGxvY2FsZS5kYXRlLAogICAgICAgICAgbG9jYWxlX3RpbWUgPSBsb2NhbGUudGltZSwKICAgICAgICAgIGxvY2FsZV9wZXJpb2RzID0gbG9jYWxlLnBlcmlvZHMsCiAgICAgICAgICBsb2NhbGVfd2Vla2RheXMgPSBsb2NhbGUuZGF5cywKICAgICAgICAgIGxvY2FsZV9zaG9ydFdlZWtkYXlzID0gbG9jYWxlLnNob3J0RGF5cywKICAgICAgICAgIGxvY2FsZV9tb250aHMgPSBsb2NhbGUubW9udGhzLAogICAgICAgICAgbG9jYWxlX3Nob3J0TW9udGhzID0gbG9jYWxlLnNob3J0TW9udGhzOwoKICAgICAgdmFyIHBlcmlvZFJlID0gZm9ybWF0UmUobG9jYWxlX3BlcmlvZHMpLAogICAgICAgICAgcGVyaW9kTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV93ZWVrZGF5cyksCiAgICAgICAgICB3ZWVrZGF5TG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV93ZWVrZGF5cyksCiAgICAgICAgICBzaG9ydFdlZWtkYXlSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfc2hvcnRXZWVrZGF5cyksCiAgICAgICAgICBtb250aFJlID0gZm9ybWF0UmUobG9jYWxlX21vbnRocyksCiAgICAgICAgICBtb250aExvb2t1cCA9IGZvcm1hdExvb2t1cChsb2NhbGVfbW9udGhzKSwKICAgICAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlKGxvY2FsZV9zaG9ydE1vbnRocyksCiAgICAgICAgICBzaG9ydE1vbnRoTG9va3VwID0gZm9ybWF0TG9va3VwKGxvY2FsZV9zaG9ydE1vbnRocyk7CgogICAgICB2YXIgZm9ybWF0cyA9IHsKICAgICAgICAiYSI6IGZvcm1hdFNob3J0V2Vla2RheSwKICAgICAgICAiQSI6IGZvcm1hdFdlZWtkYXksCiAgICAgICAgImIiOiBmb3JtYXRTaG9ydE1vbnRoLAogICAgICAgICJCIjogZm9ybWF0TW9udGgsCiAgICAgICAgImMiOiBudWxsLAogICAgICAgICJkIjogZm9ybWF0RGF5T2ZNb250aCwKICAgICAgICAiZSI6IGZvcm1hdERheU9mTW9udGgsCiAgICAgICAgImYiOiBmb3JtYXRNaWNyb3NlY29uZHMsCiAgICAgICAgIkgiOiBmb3JtYXRIb3VyMjQsCiAgICAgICAgIkkiOiBmb3JtYXRIb3VyMTIsCiAgICAgICAgImoiOiBmb3JtYXREYXlPZlllYXIsCiAgICAgICAgIkwiOiBmb3JtYXRNaWxsaXNlY29uZHMsCiAgICAgICAgIm0iOiBmb3JtYXRNb250aE51bWJlciwKICAgICAgICAiTSI6IGZvcm1hdE1pbnV0ZXMsCiAgICAgICAgInAiOiBmb3JtYXRQZXJpb2QsCiAgICAgICAgInEiOiBmb3JtYXRRdWFydGVyLAogICAgICAgICJRIjogZm9ybWF0VW5peFRpbWVzdGFtcCwKICAgICAgICAicyI6IGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzLAogICAgICAgICJTIjogZm9ybWF0U2Vjb25kcywKICAgICAgICAidSI6IGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXksCiAgICAgICAgIlUiOiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5LAogICAgICAgICJWIjogZm9ybWF0V2Vla051bWJlcklTTywKICAgICAgICAidyI6IGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXksCiAgICAgICAgIlciOiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5LAogICAgICAgICJ4IjogbnVsbCwKICAgICAgICAiWCI6IG51bGwsCiAgICAgICAgInkiOiBmb3JtYXRZZWFyJDEsCiAgICAgICAgIlkiOiBmb3JtYXRGdWxsWWVhciwKICAgICAgICAiWiI6IGZvcm1hdFpvbmUsCiAgICAgICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudAogICAgICB9OwoKICAgICAgdmFyIHV0Y0Zvcm1hdHMgPSB7CiAgICAgICAgImEiOiBmb3JtYXRVVENTaG9ydFdlZWtkYXksCiAgICAgICAgIkEiOiBmb3JtYXRVVENXZWVrZGF5LAogICAgICAgICJiIjogZm9ybWF0VVRDU2hvcnRNb250aCwKICAgICAgICAiQiI6IGZvcm1hdFVUQ01vbnRoLAogICAgICAgICJjIjogbnVsbCwKICAgICAgICAiZCI6IGZvcm1hdFVUQ0RheU9mTW9udGgsCiAgICAgICAgImUiOiBmb3JtYXRVVENEYXlPZk1vbnRoLAogICAgICAgICJmIjogZm9ybWF0VVRDTWljcm9zZWNvbmRzLAogICAgICAgICJIIjogZm9ybWF0VVRDSG91cjI0LAogICAgICAgICJJIjogZm9ybWF0VVRDSG91cjEyLAogICAgICAgICJqIjogZm9ybWF0VVRDRGF5T2ZZZWFyLAogICAgICAgICJMIjogZm9ybWF0VVRDTWlsbGlzZWNvbmRzLAogICAgICAgICJtIjogZm9ybWF0VVRDTW9udGhOdW1iZXIsCiAgICAgICAgIk0iOiBmb3JtYXRVVENNaW51dGVzLAogICAgICAgICJwIjogZm9ybWF0VVRDUGVyaW9kLAogICAgICAgICJxIjogZm9ybWF0VVRDUXVhcnRlciwKICAgICAgICAiUSI6IGZvcm1hdFVuaXhUaW1lc3RhbXAsCiAgICAgICAgInMiOiBmb3JtYXRVbml4VGltZXN0YW1wU2Vjb25kcywKICAgICAgICAiUyI6IGZvcm1hdFVUQ1NlY29uZHMsCiAgICAgICAgInUiOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5LAogICAgICAgICJVIjogZm9ybWF0VVRDV2Vla051bWJlclN1bmRheSwKICAgICAgICAiViI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJJU08sCiAgICAgICAgInciOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyU3VuZGF5LAogICAgICAgICJXIjogZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSwKICAgICAgICAieCI6IG51bGwsCiAgICAgICAgIlgiOiBudWxsLAogICAgICAgICJ5IjogZm9ybWF0VVRDWWVhciwKICAgICAgICAiWSI6IGZvcm1hdFVUQ0Z1bGxZZWFyLAogICAgICAgICJaIjogZm9ybWF0VVRDWm9uZSwKICAgICAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50CiAgICAgIH07CgogICAgICB2YXIgcGFyc2VzID0gewogICAgICAgICJhIjogcGFyc2VTaG9ydFdlZWtkYXksCiAgICAgICAgIkEiOiBwYXJzZVdlZWtkYXksCiAgICAgICAgImIiOiBwYXJzZVNob3J0TW9udGgsCiAgICAgICAgIkIiOiBwYXJzZU1vbnRoLAogICAgICAgICJjIjogcGFyc2VMb2NhbGVEYXRlVGltZSwKICAgICAgICAiZCI6IHBhcnNlRGF5T2ZNb250aCwKICAgICAgICAiZSI6IHBhcnNlRGF5T2ZNb250aCwKICAgICAgICAiZiI6IHBhcnNlTWljcm9zZWNvbmRzLAogICAgICAgICJIIjogcGFyc2VIb3VyMjQsCiAgICAgICAgIkkiOiBwYXJzZUhvdXIyNCwKICAgICAgICAiaiI6IHBhcnNlRGF5T2ZZZWFyLAogICAgICAgICJMIjogcGFyc2VNaWxsaXNlY29uZHMsCiAgICAgICAgIm0iOiBwYXJzZU1vbnRoTnVtYmVyLAogICAgICAgICJNIjogcGFyc2VNaW51dGVzLAogICAgICAgICJwIjogcGFyc2VQZXJpb2QsCiAgICAgICAgInEiOiBwYXJzZVF1YXJ0ZXIsCiAgICAgICAgIlEiOiBwYXJzZVVuaXhUaW1lc3RhbXAsCiAgICAgICAgInMiOiBwYXJzZVVuaXhUaW1lc3RhbXBTZWNvbmRzLAogICAgICAgICJTIjogcGFyc2VTZWNvbmRzLAogICAgICAgICJ1IjogcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5LAogICAgICAgICJVIjogcGFyc2VXZWVrTnVtYmVyU3VuZGF5LAogICAgICAgICJWIjogcGFyc2VXZWVrTnVtYmVySVNPLAogICAgICAgICJ3IjogcGFyc2VXZWVrZGF5TnVtYmVyU3VuZGF5LAogICAgICAgICJXIjogcGFyc2VXZWVrTnVtYmVyTW9uZGF5LAogICAgICAgICJ4IjogcGFyc2VMb2NhbGVEYXRlLAogICAgICAgICJYIjogcGFyc2VMb2NhbGVUaW1lLAogICAgICAgICJ5IjogcGFyc2VZZWFyLAogICAgICAgICJZIjogcGFyc2VGdWxsWWVhciwKICAgICAgICAiWiI6IHBhcnNlWm9uZSwKICAgICAgICAiJSI6IHBhcnNlTGl0ZXJhbFBlcmNlbnQKICAgICAgfTsKCiAgICAgIC8vIFRoZXNlIHJlY3Vyc2l2ZSBkaXJlY3RpdmUgZGVmaW5pdGlvbnMgbXVzdCBiZSBkZWZlcnJlZC4KICAgICAgZm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCBmb3JtYXRzKTsKICAgICAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3JtYXRzKTsKICAgICAgZm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgZm9ybWF0cyk7CiAgICAgIHV0Y0Zvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgdXRjRm9ybWF0cyk7CiAgICAgIHV0Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7CiAgICAgIHV0Y0Zvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIHV0Y0Zvcm1hdHMpOwoKICAgICAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgICB2YXIgc3RyaW5nID0gW10sCiAgICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICAgIGogPSAwLAogICAgICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLAogICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgcGFkLAogICAgICAgICAgICAgIGZvcm1hdDsKCiAgICAgICAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSk7CgogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgICAgaWYgKHNwZWNpZmllci5jaGFyQ29kZUF0KGkpID09PSAzNykgewogICAgICAgICAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7CiAgICAgICAgICAgICAgaWYgKChwYWQgPSBwYWRzW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNoYXJBdCgrK2kpOwogICAgICAgICAgICAgIGVsc2UgcGFkID0gYyA9PT0gImUiID8gIiAiIDogIjAiOwogICAgICAgICAgICAgIGlmIChmb3JtYXQgPSBmb3JtYXRzW2NdKSBjID0gZm9ybWF0KGRhdGUsIHBhZCk7CiAgICAgICAgICAgICAgc3RyaW5nLnB1c2goYyk7CiAgICAgICAgICAgICAgaiA9IGkgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsKICAgICAgICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbmV3UGFyc2Uoc3BlY2lmaWVyLCBaKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgICAgdmFyIGQgPSBuZXdEYXRlKDE5MDAsIHVuZGVmaW5lZCwgMSksCiAgICAgICAgICAgICAgaSA9IHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nICs9ICIiLCAwKSwKICAgICAgICAgICAgICB3ZWVrLCBkYXkkMTsKICAgICAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOwoKICAgICAgICAgIC8vIElmIGEgVU5JWCB0aW1lc3RhbXAgaXMgc3BlY2lmaWVkLCByZXR1cm4gaXQuCiAgICAgICAgICBpZiAoIlEiIGluIGQpIHJldHVybiBuZXcgRGF0ZShkLlEpOwogICAgICAgICAgaWYgKCJzIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5zICogMTAwMCArICgiTCIgaW4gZCA/IGQuTCA6IDApKTsKCiAgICAgICAgICAvLyBJZiB0aGlzIGlzIHV0Y1BhcnNlLCBuZXZlciB1c2UgdGhlIGxvY2FsIHRpbWV6b25lLgogICAgICAgICAgaWYgKFogJiYgISgiWiIgaW4gZCkpIGQuWiA9IDA7CgogICAgICAgICAgLy8gVGhlIGFtLXBtIGZsYWcgaXMgMCBmb3IgQU0sIGFuZCAxIGZvciBQTS4KICAgICAgICAgIGlmICgicCIgaW4gZCkgZC5IID0gZC5IICUgMTIgKyBkLnAgKiAxMjsKCiAgICAgICAgICAvLyBJZiB0aGUgbW9udGggd2FzIG5vdCBzcGVjaWZpZWQsIGluaGVyaXQgZnJvbSB0aGUgcXVhcnRlci4KICAgICAgICAgIGlmIChkLm0gPT09IHVuZGVmaW5lZCkgZC5tID0gInEiIGluIGQgPyBkLnEgOiAwOwoKICAgICAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci4KICAgICAgICAgIGlmICgiViIgaW4gZCkgewogICAgICAgICAgICBpZiAoZC5WIDwgMSB8fCBkLlYgPiA1MykgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGlmICghKCJ3IiBpbiBkKSkgZC53ID0gMTsKICAgICAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICAgICAgd2VlayA9IHV0Y0RhdGUobmV3RGF0ZShkLnksIDAsIDEpKSwgZGF5JDEgPSB3ZWVrLmdldFVUQ0RheSgpOwogICAgICAgICAgICAgIHdlZWsgPSBkYXkkMSA+IDQgfHwgZGF5JDEgPT09IDAgPyB1dGNNb25kYXkuY2VpbCh3ZWVrKSA6IHV0Y01vbmRheSh3ZWVrKTsKICAgICAgICAgICAgICB3ZWVrID0gdXRjRGF5Lm9mZnNldCh3ZWVrLCAoZC5WIC0gMSkgKiA3KTsKICAgICAgICAgICAgICBkLnkgPSB3ZWVrLmdldFVUQ0Z1bGxZZWFyKCk7CiAgICAgICAgICAgICAgZC5tID0gd2Vlay5nZXRVVENNb250aCgpOwogICAgICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0VVRDRGF0ZSgpICsgKGQudyArIDYpICUgNzsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB3ZWVrID0gbG9jYWxEYXRlKG5ld0RhdGUoZC55LCAwLCAxKSksIGRheSQxID0gd2Vlay5nZXREYXkoKTsKICAgICAgICAgICAgICB3ZWVrID0gZGF5JDEgPiA0IHx8IGRheSQxID09PSAwID8gbW9uZGF5LmNlaWwod2VlaykgOiBtb25kYXkod2Vlayk7CiAgICAgICAgICAgICAgd2VlayA9IGRheS5vZmZzZXQod2VlaywgKGQuViAtIDEpICogNyk7CiAgICAgICAgICAgICAgZC55ID0gd2Vlay5nZXRGdWxsWWVhcigpOwogICAgICAgICAgICAgIGQubSA9IHdlZWsuZ2V0TW9udGgoKTsKICAgICAgICAgICAgICBkLmQgPSB3ZWVrLmdldERhdGUoKSArIChkLncgKyA2KSAlIDc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoIlciIGluIGQgfHwgIlUiIGluIGQpIHsKICAgICAgICAgICAgaWYgKCEoInciIGluIGQpKSBkLncgPSAidSIgaW4gZCA/IGQudSAlIDcgOiAiVyIgaW4gZCA/IDEgOiAwOwogICAgICAgICAgICBkYXkkMSA9ICJaIiBpbiBkID8gdXRjRGF0ZShuZXdEYXRlKGQueSwgMCwgMSkpLmdldFVUQ0RheSgpIDogbG9jYWxEYXRlKG5ld0RhdGUoZC55LCAwLCAxKSkuZ2V0RGF5KCk7CiAgICAgICAgICAgIGQubSA9IDA7CiAgICAgICAgICAgIGQuZCA9ICJXIiBpbiBkID8gKGQudyArIDYpICUgNyArIGQuVyAqIDcgLSAoZGF5JDEgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSQxICsgNikgJSA3OwogICAgICAgICAgfQoKICAgICAgICAgIC8vIElmIGEgdGltZSB6b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0aGVuCiAgICAgICAgICAvLyBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lLgogICAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICAgIGQuSCArPSBkLlogLyAxMDAgfCAwOwogICAgICAgICAgICBkLk0gKz0gZC5aICUgMTAwOwogICAgICAgICAgICByZXR1cm4gdXRjRGF0ZShkKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuCiAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlKGQpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nLCBqKSB7CiAgICAgICAgdmFyIGkgPSAwLAogICAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCwKICAgICAgICAgICAgbSA9IHN0cmluZy5sZW5ndGgsCiAgICAgICAgICAgIGMsCiAgICAgICAgICAgIHBhcnNlOwoKICAgICAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgICAgIGlmIChqID49IG0pIHJldHVybiAtMTsKICAgICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckNvZGVBdChpKyspOwogICAgICAgICAgaWYgKGMgPT09IDM3KSB7CiAgICAgICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7CiAgICAgICAgICAgIHBhcnNlID0gcGFyc2VzW2MgaW4gcGFkcyA/IHNwZWNpZmllci5jaGFyQXQoaSsrKSA6IGNdOwogICAgICAgICAgICBpZiAoIXBhcnNlIHx8ICgoaiA9IHBhcnNlKGQsIHN0cmluZywgaikpIDwgMCkpIHJldHVybiAtMTsKICAgICAgICAgIH0gZWxzZSBpZiAoYyAhPSBzdHJpbmcuY2hhckNvZGVBdChqKyspKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiBqOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZVBlcmlvZChkLCBzdHJpbmcsIGkpIHsKICAgICAgICB2YXIgbiA9IHBlcmlvZFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgICByZXR1cm4gbiA/IChkLnAgPSBwZXJpb2RMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZVNob3J0V2Vla2RheShkLCBzdHJpbmcsIGkpIHsKICAgICAgICB2YXIgbiA9IHNob3J0V2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgICByZXR1cm4gbiA/IChkLncgPSBzaG9ydFdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgdmFyIG4gPSB3ZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICAgIHJldHVybiBuID8gKGQudyA9IHdlZWtkYXlMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZVNob3J0TW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgdmFyIG4gPSBzaG9ydE1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICAgIHJldHVybiBuID8gKGQubSA9IHNob3J0TW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZU1vbnRoKGQsIHN0cmluZywgaSkgewogICAgICAgIHZhciBuID0gbW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgICAgcmV0dXJuIG4gPyAoZC5tID0gbW9udGhMb29rdXBbblswXS50b0xvd2VyQ2FzZSgpXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGVUaW1lKGQsIHN0cmluZywgaSkgewogICAgICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZVRpbWUsIHN0cmluZywgaSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZShkLCBzdHJpbmcsIGkpIHsKICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGUsIHN0cmluZywgaSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlTG9jYWxlVGltZShkLCBzdHJpbmcsIGkpIHsKICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX3RpbWUsIHN0cmluZywgaSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFNob3J0V2Vla2RheShkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0RGF5KCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5KGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0RGF5KCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRTaG9ydE1vbnRoKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0TW9udGgoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdE1vbnRoKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldE1vbnRoKCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRQZXJpb2QoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0SG91cnMoKSA+PSAxMildOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRRdWFydGVyKGQpIHsKICAgICAgICByZXR1cm4gMSArIH5+KGQuZ2V0TW9udGgoKSAvIDMpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydFdlZWtkYXkoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheShkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldFVUQ0RheSgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0VVRDU2hvcnRNb250aChkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldFVUQ01vbnRoKCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRVVENNb250aChkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRVVENNb250aCgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0VVRDUGVyaW9kKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldFVUQ0hvdXJzKCkgPj0gMTIpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0VVRDUXVhcnRlcihkKSB7CiAgICAgICAgcmV0dXJuIDEgKyB+fihkLmdldFVUQ01vbnRoKCkgLyAzKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHsKICAgICAgICBmb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoc3BlY2lmaWVyICs9ICIiLCBmb3JtYXRzKTsKICAgICAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsKICAgICAgICAgIHJldHVybiBmOwogICAgICAgIH0sCiAgICAgICAgcGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIgKz0gIiIsIGZhbHNlKTsKICAgICAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsKICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH0sCiAgICAgICAgdXRjRm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSAiIiwgdXRjRm9ybWF0cyk7CiAgICAgICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgICAgICByZXR1cm4gZjsKICAgICAgICB9LAogICAgICAgIHV0Y1BhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyICs9ICIiLCB0cnVlKTsKICAgICAgICAgIHAudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsKICAgICAgICAgIHJldHVybiBwOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICB2YXIgcGFkcyA9IHsiLSI6ICIiLCAiXyI6ICIgIiwgIjAiOiAiMCJ9LAogICAgICAgIG51bWJlclJlID0gL15ccypcZCsvLCAvLyBub3RlOiBpZ25vcmVzIG5leHQgZGlyZWN0aXZlCiAgICAgICAgcGVyY2VudFJlID0gL14lLywKICAgICAgICByZXF1b3RlUmUgPSAvW1xcXiQqKz98W1xdKCkue31dL2c7CgogICAgZnVuY3Rpb24gcGFkJDEodmFsdWUsIGZpbGwsIHdpZHRoKSB7CiAgICAgIHZhciBzaWduID0gdmFsdWUgPCAwID8gIi0iIDogIiIsCiAgICAgICAgICBzdHJpbmcgPSAoc2lnbiA/IC12YWx1ZSA6IHZhbHVlKSArICIiLAogICAgICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgICAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXF1b3RlKHMpIHsKICAgICAgcmV0dXJuIHMucmVwbGFjZShyZXF1b3RlUmUsICJcXCQmIik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0UmUobmFtZXMpIHsKICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUpLmpvaW4oInwiKSArICIpIiwgImkiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRMb29rdXAobmFtZXMpIHsKICAgICAgdmFyIG1hcCA9IHt9LCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBtYXBbbmFtZXNbaV0udG9Mb3dlckNhc2UoKV0gPSBpOwogICAgICByZXR1cm4gbWFwOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheU51bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgICByZXR1cm4gbiA/IChkLncgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheU51bWJlck1vbmRheShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgICByZXR1cm4gbiA/IChkLnUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLlUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla051bWJlcklTTyhkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLlYgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla051bWJlck1vbmRheShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLlcgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRnVsbFllYXIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDQpKTsKICAgICAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVllYXIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC55ID0gK25bMF0gKyAoK25bMF0gPiA2OCA/IDE5MDAgOiAyMDAwKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlWm9uZShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSAvXihaKXwoWystXVxkXGQpKD86Oj8oXGRcZCkpPy8uZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5aID0gblsxXSA/IDAgOiAtKG5bMl0gKyAoblszXSB8fCAiMDAiKSksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVF1YXJ0ZXIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5xID0gblswXSAqIDMgLSAzLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VNb250aE51bWJlcihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRGF5T2ZNb250aChkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLmQgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRGF5T2ZZZWFyKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7CiAgICAgIHJldHVybiBuID8gKGQubSA9IDAsIGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VIb3VyMjQoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU1pbnV0ZXMoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5NID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVNlY29uZHMoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5TID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyhkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpOwogICAgICByZXR1cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlTWljcm9zZWNvbmRzKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7CiAgICAgIHJldHVybiBuID8gKGQuTCA9IE1hdGguZmxvb3IoblswXSAvIDEwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VMaXRlcmFsUGVyY2VudChkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBwZXJjZW50UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICAgICAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVVuaXhUaW1lc3RhbXAoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICByZXR1cm4gbiA/IChkLlEgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcFNlY29uZHMoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICByZXR1cm4gbiA/IChkLnMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdERheU9mTW9udGgoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDEoZC5nZXREYXRlKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEhvdXIyNChkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldEhvdXJzKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEhvdXIxMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldEhvdXJzKCkgJSAxMiB8fCAxMiwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0RGF5T2ZZZWFyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKDEgKyBkYXkuY291bnQoeWVhcihkKSwgZCksIHAsIDMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE1pbGxpc2Vjb25kcyhkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldE1pbGxpc2Vjb25kcygpLCBwLCAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRNaWNyb3NlY29uZHMoZCwgcCkgewogICAgICByZXR1cm4gZm9ybWF0TWlsbGlzZWNvbmRzKGQsIHApICsgIjAwMCI7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TW9udGhOdW1iZXIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDEoZC5nZXRNb250aCgpICsgMSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TWludXRlcyhkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldE1pbnV0ZXMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyhkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldFNlY29uZHMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0V2Vla2RheU51bWJlck1vbmRheShkKSB7CiAgICAgIHZhciBkYXkgPSBkLmdldERheSgpOwogICAgICByZXR1cm4gZGF5ID09PSAwID8gNyA6IGRheTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5KGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKHN1bmRheS5jb3VudCh5ZWFyKGQpIC0gMSwgZCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJJU08oZCwgcCkgewogICAgICB2YXIgZGF5ID0gZC5nZXREYXkoKTsKICAgICAgZCA9IChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdGh1cnNkYXkoZCkgOiB0aHVyc2RheS5jZWlsKGQpOwogICAgICByZXR1cm4gcGFkJDEodGh1cnNkYXkuY291bnQoeWVhcihkKSwgZCkgKyAoeWVhcihkKS5nZXREYXkoKSA9PT0gNCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkoZCkgewogICAgICByZXR1cm4gZC5nZXREYXkoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5KGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKG1vbmRheS5jb3VudCh5ZWFyKGQpIC0gMSwgZCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFllYXIkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldEZ1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEZ1bGxZZWFyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRab25lKGQpIHsKICAgICAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgIHJldHVybiAoeiA+IDAgPyAiLSIgOiAoeiAqPSAtMSwgIisiKSkKICAgICAgICAgICsgcGFkJDEoeiAvIDYwIHwgMCwgIjAiLCAyKQogICAgICAgICAgKyBwYWQkMSh6ICUgNjAsICIwIiwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZNb250aChkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldFVUQ0RhdGUoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDSG91cjI0KGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDSG91cnMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENEYXlPZlllYXIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDEoMSArIHV0Y0RheS5jb3VudCh1dGNZZWFyKGQpLCBkKSwgcCwgMyk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRzKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDTWlsbGlzZWNvbmRzKCksIHAsIDMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ01pY3Jvc2Vjb25kcyhkLCBwKSB7CiAgICAgIHJldHVybiBmb3JtYXRVVENNaWxsaXNlY29uZHMoZCwgcCkgKyAiMDAwIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlcihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldFVUQ01vbnRoKCkgKyAxLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENNaW51dGVzKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDTWludXRlcygpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENTZWNvbmRzKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDU2Vjb25kcygpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5KGQpIHsKICAgICAgdmFyIGRvdyA9IGQuZ2V0VVRDRGF5KCk7CiAgICAgIHJldHVybiBkb3cgPT09IDAgPyA3IDogZG93OwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJTdW5kYXkoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDEodXRjU3VuZGF5LmNvdW50KHV0Y1llYXIoZCkgLSAxLCBkKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlcklTTyhkLCBwKSB7CiAgICAgIHZhciBkYXkgPSBkLmdldFVUQ0RheSgpOwogICAgICBkID0gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB1dGNUaHVyc2RheShkKSA6IHV0Y1RodXJzZGF5LmNlaWwoZCk7CiAgICAgIHJldHVybiBwYWQkMSh1dGNUaHVyc2RheS5jb3VudCh1dGNZZWFyKGQpLCBkKSArICh1dGNZZWFyKGQpLmdldFVUQ0RheSgpID09PSA0KSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlclN1bmRheShkKSB7CiAgICAgIHJldHVybiBkLmdldFVUQ0RheSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDEodXRjTW9uZGF5LmNvdW50KHV0Y1llYXIoZCkgLSAxLCBkKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDWWVhcihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMShkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQxKGQuZ2V0VVRDRnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENab25lKCkgewogICAgICByZXR1cm4gIiswMDAwIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRMaXRlcmFsUGVyY2VudCgpIHsKICAgICAgcmV0dXJuICIlIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wKGQpIHsKICAgICAgcmV0dXJuICtkOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzKGQpIHsKICAgICAgcmV0dXJuIE1hdGguZmxvb3IoK2QgLyAxMDAwKTsKICAgIH0KCiAgICB2YXIgbG9jYWxlJDE7CiAgICB2YXIgdGltZUZvcm1hdDsKICAgIHZhciB0aW1lUGFyc2U7CiAgICB2YXIgdXRjRm9ybWF0OwogICAgdmFyIHV0Y1BhcnNlOwoKICAgIGRlZmF1bHRMb2NhbGUkMSh7CiAgICAgIGRhdGVUaW1lOiAiJXgsICVYIiwKICAgICAgZGF0ZTogIiUtbS8lLWQvJVkiLAogICAgICB0aW1lOiAiJS1JOiVNOiVTICVwIiwKICAgICAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogICAgICBkYXlzOiBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sCiAgICAgIHNob3J0RGF5czogWyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwKICAgICAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICAgICAgc2hvcnRNb250aHM6IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXQogICAgfSk7CgogICAgZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQxKGRlZmluaXRpb24pIHsKICAgICAgbG9jYWxlJDEgPSBmb3JtYXRMb2NhbGUkMShkZWZpbml0aW9uKTsKICAgICAgdGltZUZvcm1hdCA9IGxvY2FsZSQxLmZvcm1hdDsKICAgICAgdGltZVBhcnNlID0gbG9jYWxlJDEucGFyc2U7CiAgICAgIHV0Y0Zvcm1hdCA9IGxvY2FsZSQxLnV0Y0Zvcm1hdDsKICAgICAgdXRjUGFyc2UgPSBsb2NhbGUkMS51dGNQYXJzZTsKICAgICAgcmV0dXJuIGxvY2FsZSQxOwogICAgfQoKICAgIHZhciBpc29TcGVjaWZpZXIgPSAiJVktJW0tJWRUJUg6JU06JVMuJUxaIjsKCiAgICBmdW5jdGlvbiBmb3JtYXRJc29OYXRpdmUoZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOwogICAgfQoKICAgIHZhciBmb3JtYXRJc28gPSBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZwogICAgICAgID8gZm9ybWF0SXNvTmF0aXZlCiAgICAgICAgOiB1dGNGb3JtYXQoaXNvU3BlY2lmaWVyKTsKCiAgICBmdW5jdGlvbiBwYXJzZUlzb05hdGl2ZShzdHJpbmcpIHsKICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShzdHJpbmcpOwogICAgICByZXR1cm4gaXNOYU4oZGF0ZSkgPyBudWxsIDogZGF0ZTsKICAgIH0KCiAgICB2YXIgcGFyc2VJc28gPSArbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpCiAgICAgICAgPyBwYXJzZUlzb05hdGl2ZQogICAgICAgIDogdXRjUGFyc2UoaXNvU3BlY2lmaWVyKTsKCiAgICB2YXIgZHVyYXRpb25TZWNvbmQkMSA9IDEwMDAsCiAgICAgICAgZHVyYXRpb25NaW51dGUkMSA9IGR1cmF0aW9uU2Vjb25kJDEgKiA2MCwKICAgICAgICBkdXJhdGlvbkhvdXIkMSA9IGR1cmF0aW9uTWludXRlJDEgKiA2MCwKICAgICAgICBkdXJhdGlvbkRheSQxID0gZHVyYXRpb25Ib3VyJDEgKiAyNCwKICAgICAgICBkdXJhdGlvbldlZWskMSA9IGR1cmF0aW9uRGF5JDEgKiA3LAogICAgICAgIGR1cmF0aW9uTW9udGggPSBkdXJhdGlvbkRheSQxICogMzAsCiAgICAgICAgZHVyYXRpb25ZZWFyID0gZHVyYXRpb25EYXkkMSAqIDM2NTsKCiAgICBmdW5jdGlvbiBkYXRlJDEodCkgewogICAgICByZXR1cm4gbmV3IERhdGUodCk7CiAgICB9CgogICAgZnVuY3Rpb24gbnVtYmVyJDModCkgewogICAgICByZXR1cm4gdCBpbnN0YW5jZW9mIERhdGUgPyArdCA6ICtuZXcgRGF0ZSgrdCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2FsZW5kYXIoeWVhciwgbW9udGgsIHdlZWssIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kLCBmb3JtYXQpIHsKICAgICAgdmFyIHNjYWxlID0gY29udGludW91cyhpZGVudGl0eSQ2LCBpZGVudGl0eSQ2KSwKICAgICAgICAgIGludmVydCA9IHNjYWxlLmludmVydCwKICAgICAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgICAgIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCgiLiVMIiksCiAgICAgICAgICBmb3JtYXRTZWNvbmQgPSBmb3JtYXQoIjolUyIpLAogICAgICAgICAgZm9ybWF0TWludXRlID0gZm9ybWF0KCIlSTolTSIpLAogICAgICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCgiJUkgJXAiKSwKICAgICAgICAgIGZvcm1hdERheSA9IGZvcm1hdCgiJWEgJWQiKSwKICAgICAgICAgIGZvcm1hdFdlZWsgPSBmb3JtYXQoIiViICVkIiksCiAgICAgICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCgiJUIiKSwKICAgICAgICAgIGZvcm1hdFllYXIgPSBmb3JtYXQoIiVZIik7CgogICAgICB2YXIgdGlja0ludGVydmFscyA9IFsKICAgICAgICBbc2Vjb25kLCAgMSwgICAgICBkdXJhdGlvblNlY29uZCQxXSwKICAgICAgICBbc2Vjb25kLCAgNSwgIDUgKiBkdXJhdGlvblNlY29uZCQxXSwKICAgICAgICBbc2Vjb25kLCAxNSwgMTUgKiBkdXJhdGlvblNlY29uZCQxXSwKICAgICAgICBbc2Vjb25kLCAzMCwgMzAgKiBkdXJhdGlvblNlY29uZCQxXSwKICAgICAgICBbbWludXRlLCAgMSwgICAgICBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgICAgICBbbWludXRlLCAgNSwgIDUgKiBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgICAgICBbbWludXRlLCAxNSwgMTUgKiBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgICAgICBbbWludXRlLCAzMCwgMzAgKiBkdXJhdGlvbk1pbnV0ZSQxXSwKICAgICAgICBbICBob3VyLCAgMSwgICAgICBkdXJhdGlvbkhvdXIkMSAgXSwKICAgICAgICBbICBob3VyLCAgMywgIDMgKiBkdXJhdGlvbkhvdXIkMSAgXSwKICAgICAgICBbICBob3VyLCAgNiwgIDYgKiBkdXJhdGlvbkhvdXIkMSAgXSwKICAgICAgICBbICBob3VyLCAxMiwgMTIgKiBkdXJhdGlvbkhvdXIkMSAgXSwKICAgICAgICBbICAgZGF5LCAgMSwgICAgICBkdXJhdGlvbkRheSQxICAgXSwKICAgICAgICBbICAgZGF5LCAgMiwgIDIgKiBkdXJhdGlvbkRheSQxICAgXSwKICAgICAgICBbICB3ZWVrLCAgMSwgICAgICBkdXJhdGlvbldlZWskMSAgXSwKICAgICAgICBbIG1vbnRoLCAgMSwgICAgICBkdXJhdGlvbk1vbnRoIF0sCiAgICAgICAgWyBtb250aCwgIDMsICAzICogZHVyYXRpb25Nb250aCBdLAogICAgICAgIFsgIHllYXIsICAxLCAgICAgIGR1cmF0aW9uWWVhciAgXQogICAgICBdOwoKICAgICAgZnVuY3Rpb24gdGlja0Zvcm1hdChkYXRlKSB7CiAgICAgICAgcmV0dXJuIChzZWNvbmQoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWlsbGlzZWNvbmQKICAgICAgICAgICAgOiBtaW51dGUoZGF0ZSkgPCBkYXRlID8gZm9ybWF0U2Vjb25kCiAgICAgICAgICAgIDogaG91cihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaW51dGUKICAgICAgICAgICAgOiBkYXkoZGF0ZSkgPCBkYXRlID8gZm9ybWF0SG91cgogICAgICAgICAgICA6IG1vbnRoKGRhdGUpIDwgZGF0ZSA/ICh3ZWVrKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdERheSA6IGZvcm1hdFdlZWspCiAgICAgICAgICAgIDogeWVhcihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNb250aAogICAgICAgICAgICA6IGZvcm1hdFllYXIpKGRhdGUpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICAgICAgaWYgKGludGVydmFsID09IG51bGwpIGludGVydmFsID0gMTA7CgogICAgICAgIC8vIElmIGEgZGVzaXJlZCB0aWNrIGNvdW50IGlzIHNwZWNpZmllZCwgcGljayBhIHJlYXNvbmFibGUgdGljayBpbnRlcnZhbAogICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgdGhlIGRvbWFpbiBhbmQgYSByb3VnaCBlc3RpbWF0ZSBvZiB0aWNrIHNpemUuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaW50ZXJ2YWwgaXMgYWxyZWFkeSBhIHRpbWUgaW50ZXJ2YWwgYW5kIHVzZSBpdC4KICAgICAgICBpZiAodHlwZW9mIGludGVydmFsID09PSAibnVtYmVyIikgewogICAgICAgICAgdmFyIHRhcmdldCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBpbnRlcnZhbCwKICAgICAgICAgICAgICBpID0gYmlzZWN0b3IoZnVuY3Rpb24oaSkgeyByZXR1cm4gaVsyXTsgfSkucmlnaHQodGlja0ludGVydmFscywgdGFyZ2V0KTsKICAgICAgICAgIGlmIChpID09PSB0aWNrSW50ZXJ2YWxzLmxlbmd0aCkgewogICAgICAgICAgICBzdGVwID0gdGlja1N0ZXAoc3RhcnQgLyBkdXJhdGlvblllYXIsIHN0b3AgLyBkdXJhdGlvblllYXIsIGludGVydmFsKTsKICAgICAgICAgICAgaW50ZXJ2YWwgPSB5ZWFyOwogICAgICAgICAgfSBlbHNlIGlmIChpKSB7CiAgICAgICAgICAgIGkgPSB0aWNrSW50ZXJ2YWxzW3RhcmdldCAvIHRpY2tJbnRlcnZhbHNbaSAtIDFdWzJdIDwgdGlja0ludGVydmFsc1tpXVsyXSAvIHRhcmdldCA/IGkgLSAxIDogaV07CiAgICAgICAgICAgIHN0ZXAgPSBpWzFdOwogICAgICAgICAgICBpbnRlcnZhbCA9IGlbMF07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBzdGVwID0gTWF0aC5tYXgodGlja1N0ZXAoc3RhcnQsIHN0b3AsIGludGVydmFsKSwgMSk7CiAgICAgICAgICAgIGludGVydmFsID0gbWlsbGlzZWNvbmQ7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gc3RlcCA9PSBudWxsID8gaW50ZXJ2YWwgOiBpbnRlcnZhbC5ldmVyeShzdGVwKTsKICAgICAgfQoKICAgICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgICAgIHJldHVybiBuZXcgRGF0ZShpbnZlcnQoeSkpOwogICAgICB9OwoKICAgICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gZG9tYWluKG1hcCQzLmNhbGwoXywgbnVtYmVyJDMpKSA6IGRvbWFpbigpLm1hcChkYXRlJDEpOwogICAgICB9OwoKICAgICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihpbnRlcnZhbCwgc3RlcCkgewogICAgICAgIHZhciBkID0gZG9tYWluKCksCiAgICAgICAgICAgIHQwID0gZFswXSwKICAgICAgICAgICAgdDEgPSBkW2QubGVuZ3RoIC0gMV0sCiAgICAgICAgICAgIHIgPSB0MSA8IHQwLAogICAgICAgICAgICB0OwogICAgICAgIGlmIChyKSB0ID0gdDAsIHQwID0gdDEsIHQxID0gdDsKICAgICAgICB0ID0gdGlja0ludGVydmFsKGludGVydmFsLCB0MCwgdDEsIHN0ZXApOwogICAgICAgIHQgPSB0ID8gdC5yYW5nZSh0MCwgdDEgKyAxKSA6IFtdOyAvLyBpbmNsdXNpdmUgc3RvcAogICAgICAgIHJldHVybiByID8gdC5yZXZlcnNlKCkgOiB0OwogICAgICB9OwoKICAgICAgc2NhbGUudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKGNvdW50LCBzcGVjaWZpZXIpIHsKICAgICAgICByZXR1cm4gc3BlY2lmaWVyID09IG51bGwgPyB0aWNrRm9ybWF0IDogZm9ybWF0KHNwZWNpZmllcik7CiAgICAgIH07CgogICAgICBzY2FsZS5uaWNlID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsKICAgICAgICB2YXIgZCA9IGRvbWFpbigpOwogICAgICAgIHJldHVybiAoaW50ZXJ2YWwgPSB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIGRbMF0sIGRbZC5sZW5ndGggLSAxXSwgc3RlcCkpCiAgICAgICAgICAgID8gZG9tYWluKG5pY2UoZCwgaW50ZXJ2YWwpKQogICAgICAgICAgICA6IHNjYWxlOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5KHNjYWxlLCBjYWxlbmRhcih5ZWFyLCBtb250aCwgd2VlaywgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIGZvcm1hdCkpOwogICAgICB9OwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWUoKSB7CiAgICAgIHJldHVybiBpbml0UmFuZ2UuYXBwbHkoY2FsZW5kYXIoeWVhciwgbW9udGgsIHN1bmRheSwgZGF5LCBob3VyLCBtaW51dGUsIHNlY29uZCwgbWlsbGlzZWNvbmQsIHRpbWVGb3JtYXQpLmRvbWFpbihbbmV3IERhdGUoMjAwMCwgMCwgMSksIG5ldyBEYXRlKDIwMDAsIDAsIDIpXSksIGFyZ3VtZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gdXRjVGltZSgpIHsKICAgICAgcmV0dXJuIGluaXRSYW5nZS5hcHBseShjYWxlbmRhcih1dGNZZWFyLCB1dGNNb250aCwgdXRjU3VuZGF5LCB1dGNEYXksIHV0Y0hvdXIsIHV0Y01pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgdXRjRm9ybWF0KS5kb21haW4oW0RhdGUuVVRDKDIwMDAsIDAsIDEpLCBEYXRlLlVUQygyMDAwLCAwLCAyKV0pLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybWVyJDIoKSB7CiAgICAgIHZhciB4MCA9IDAsCiAgICAgICAgICB4MSA9IDEsCiAgICAgICAgICB0MCwKICAgICAgICAgIHQxLAogICAgICAgICAgazEwLAogICAgICAgICAgdHJhbnNmb3JtLAogICAgICAgICAgaW50ZXJwb2xhdG9yID0gaWRlbnRpdHkkNiwKICAgICAgICAgIGNsYW1wID0gZmFsc2UsCiAgICAgICAgICB1bmtub3duOwoKICAgICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICAgIHJldHVybiBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IGludGVycG9sYXRvcihrMTAgPT09IDAgPyAwLjUgOiAoeCA9ICh0cmFuc2Zvcm0oeCkgLSB0MCkgKiBrMTAsIGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgeCkpIDogeCkpOwogICAgICB9CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodDAgPSB0cmFuc2Zvcm0oeDAgPSArX1swXSksIHQxID0gdHJhbnNmb3JtKHgxID0gK19bMV0pLCBrMTAgPSB0MCA9PT0gdDEgPyAwIDogMSAvICh0MSAtIHQwKSwgc2NhbGUpIDogW3gwLCB4MV07CiAgICAgIH07CgogICAgICBzY2FsZS5jbGFtcCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGFtcCA9ICEhXywgc2NhbGUpIDogY2xhbXA7CiAgICAgIH07CgogICAgICBzY2FsZS5pbnRlcnBvbGF0b3IgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdG9yID0gXywgc2NhbGUpIDogaW50ZXJwb2xhdG9yOwogICAgICB9OwoKICAgICAgc2NhbGUudW5rbm93biA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh1bmtub3duID0gXywgc2NhbGUpIDogdW5rbm93bjsKICAgICAgfTsKCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdHJhbnNmb3JtID0gdCwgdDAgPSB0KHgwKSwgdDEgPSB0KHgxKSwgazEwID0gdDAgPT09IHQxID8gMCA6IDEgLyAodDEgLSB0MCk7CiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkkMShzb3VyY2UsIHRhcmdldCkgewogICAgICByZXR1cm4gdGFyZ2V0CiAgICAgICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSkKICAgICAgICAgIC5pbnRlcnBvbGF0b3Ioc291cmNlLmludGVycG9sYXRvcigpKQogICAgICAgICAgLmNsYW1wKHNvdXJjZS5jbGFtcCgpKQogICAgICAgICAgLnVua25vd24oc291cmNlLnVua25vd24oKSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VxdWVudGlhbCgpIHsKICAgICAgdmFyIHNjYWxlID0gbGluZWFyaXNoKHRyYW5zZm9ybWVyJDIoKShpZGVudGl0eSQ2KSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbCgpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlcXVlbnRpYWxMb2coKSB7CiAgICAgIHZhciBzY2FsZSA9IGxvZ2dpc2godHJhbnNmb3JtZXIkMigpKS5kb21haW4oWzEsIDEwXSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbExvZygpKS5iYXNlKHNjYWxlLmJhc2UoKSk7CiAgICAgIH07CgogICAgICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXF1ZW50aWFsU3ltbG9nKCkgewogICAgICB2YXIgc2NhbGUgPSBzeW1sb2dpc2godHJhbnNmb3JtZXIkMigpKTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gY29weSQxKHNjYWxlLCBzZXF1ZW50aWFsU3ltbG9nKCkpLmNvbnN0YW50KHNjYWxlLmNvbnN0YW50KCkpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VxdWVudGlhbFBvdygpIHsKICAgICAgdmFyIHNjYWxlID0gcG93aXNoKHRyYW5zZm9ybWVyJDIoKSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgc2VxdWVudGlhbFBvdygpKS5leHBvbmVudChzY2FsZS5leHBvbmVudCgpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlcXVlbnRpYWxTcXJ0KCkgewogICAgICByZXR1cm4gc2VxdWVudGlhbFBvdy5hcHBseShudWxsLCBhcmd1bWVudHMpLmV4cG9uZW50KDAuNSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VxdWVudGlhbFF1YW50aWxlKCkgewogICAgICB2YXIgZG9tYWluID0gW10sCiAgICAgICAgICBpbnRlcnBvbGF0b3IgPSBpZGVudGl0eSQ2OwoKICAgICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICAgIGlmICghaXNOYU4oeCA9ICt4KSkgcmV0dXJuIGludGVycG9sYXRvcigoYmlzZWN0UmlnaHQoZG9tYWluLCB4KSAtIDEpIC8gKGRvbWFpbi5sZW5ndGggLSAxKSk7CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBkb21haW4uc2xpY2UoKTsKICAgICAgICBkb21haW4gPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IF8ubGVuZ3RoLCBkOyBpIDwgbjsgKytpKSBpZiAoZCA9IF9baV0sIGQgIT0gbnVsbCAmJiAhaXNOYU4oZCA9ICtkKSkgZG9tYWluLnB1c2goZCk7CiAgICAgICAgZG9tYWluLnNvcnQoYXNjZW5kaW5nKTsKICAgICAgICByZXR1cm4gc2NhbGU7CiAgICAgIH07CgogICAgICBzY2FsZS5pbnRlcnBvbGF0b3IgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdG9yID0gXywgc2NhbGUpIDogaW50ZXJwb2xhdG9yOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBzZXF1ZW50aWFsUXVhbnRpbGUoaW50ZXJwb2xhdG9yKS5kb21haW4oZG9tYWluKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybWVyJDMoKSB7CiAgICAgIHZhciB4MCA9IDAsCiAgICAgICAgICB4MSA9IDAuNSwKICAgICAgICAgIHgyID0gMSwKICAgICAgICAgIHQwLAogICAgICAgICAgdDEsCiAgICAgICAgICB0MiwKICAgICAgICAgIGsxMCwKICAgICAgICAgIGsyMSwKICAgICAgICAgIGludGVycG9sYXRvciA9IGlkZW50aXR5JDYsCiAgICAgICAgICB0cmFuc2Zvcm0sCiAgICAgICAgICBjbGFtcCA9IGZhbHNlLAogICAgICAgICAgdW5rbm93bjsKCiAgICAgIGZ1bmN0aW9uIHNjYWxlKHgpIHsKICAgICAgICByZXR1cm4gaXNOYU4oeCA9ICt4KSA/IHVua25vd24gOiAoeCA9IDAuNSArICgoeCA9ICt0cmFuc2Zvcm0oeCkpIC0gdDEpICogKHggPCB0MSA/IGsxMCA6IGsyMSksIGludGVycG9sYXRvcihjbGFtcCA/IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHgpKSA6IHgpKTsKICAgICAgfQoKICAgICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHQwID0gdHJhbnNmb3JtKHgwID0gK19bMF0pLCB0MSA9IHRyYW5zZm9ybSh4MSA9ICtfWzFdKSwgdDIgPSB0cmFuc2Zvcm0oeDIgPSArX1syXSksIGsxMCA9IHQwID09PSB0MSA/IDAgOiAwLjUgLyAodDEgLSB0MCksIGsyMSA9IHQxID09PSB0MiA/IDAgOiAwLjUgLyAodDIgLSB0MSksIHNjYWxlKSA6IFt4MCwgeDEsIHgyXTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsKICAgICAgfTsKCiAgICAgIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7CiAgICAgIH07CgogICAgICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0cmFuc2Zvcm0gPSB0LCB0MCA9IHQoeDApLCB0MSA9IHQoeDEpLCB0MiA9IHQoeDIpLCBrMTAgPSB0MCA9PT0gdDEgPyAwIDogMC41IC8gKHQxIC0gdDApLCBrMjEgPSB0MSA9PT0gdDIgPyAwIDogMC41IC8gKHQyIC0gdDEpOwogICAgICAgIHJldHVybiBzY2FsZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXZlcmdpbmcoKSB7CiAgICAgIHZhciBzY2FsZSA9IGxpbmVhcmlzaCh0cmFuc2Zvcm1lciQzKCkoaWRlbnRpdHkkNikpOwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5JDEoc2NhbGUsIGRpdmVyZ2luZygpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpdmVyZ2luZ0xvZygpIHsKICAgICAgdmFyIHNjYWxlID0gbG9nZ2lzaCh0cmFuc2Zvcm1lciQzKCkpLmRvbWFpbihbMC4xLCAxLCAxMF0pOwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5JDEoc2NhbGUsIGRpdmVyZ2luZ0xvZygpKS5iYXNlKHNjYWxlLmJhc2UoKSk7CiAgICAgIH07CgogICAgICByZXR1cm4gaW5pdEludGVycG9sYXRvci5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXZlcmdpbmdTeW1sb2coKSB7CiAgICAgIHZhciBzY2FsZSA9IHN5bWxvZ2lzaCh0cmFuc2Zvcm1lciQzKCkpOwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5JDEoc2NhbGUsIGRpdmVyZ2luZ1N5bWxvZygpKS5jb25zdGFudChzY2FsZS5jb25zdGFudCgpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0SW50ZXJwb2xhdG9yLmFwcGx5KHNjYWxlLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpdmVyZ2luZ1BvdygpIHsKICAgICAgdmFyIHNjYWxlID0gcG93aXNoKHRyYW5zZm9ybWVyJDMoKSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkkMShzY2FsZSwgZGl2ZXJnaW5nUG93KCkpLmV4cG9uZW50KHNjYWxlLmV4cG9uZW50KCkpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGluaXRJbnRlcnBvbGF0b3IuYXBwbHkoc2NhbGUsIGFyZ3VtZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gZGl2ZXJnaW5nU3FydCgpIHsKICAgICAgcmV0dXJuIGRpdmVyZ2luZ1Bvdy5hcHBseShudWxsLCBhcmd1bWVudHMpLmV4cG9uZW50KDAuNSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3JzKHNwZWNpZmllcikgewogICAgICB2YXIgbiA9IHNwZWNpZmllci5sZW5ndGggLyA2IHwgMCwgY29sb3JzID0gbmV3IEFycmF5KG4pLCBpID0gMDsKICAgICAgd2hpbGUgKGkgPCBuKSBjb2xvcnNbaV0gPSAiIyIgKyBzcGVjaWZpZXIuc2xpY2UoaSAqIDYsICsraSAqIDYpOwogICAgICByZXR1cm4gY29sb3JzOwogICAgfQoKICAgIHZhciBjYXRlZ29yeTEwID0gY29sb3JzKCIxZjc3YjRmZjdmMGUyY2EwMmNkNjI3Mjg5NDY3YmQ4YzU2NGJlMzc3YzI3ZjdmN2ZiY2JkMjIxN2JlY2YiKTsKCiAgICB2YXIgQWNjZW50ID0gY29sb3JzKCI3ZmM5N2ZiZWFlZDRmZGMwODZmZmZmOTkzODZjYjBmMDAyN2ZiZjViMTc2NjY2NjYiKTsKCiAgICB2YXIgRGFyazIgPSBjb2xvcnMoIjFiOWU3N2Q5NWYwMjc1NzBiM2U3Mjk4YTY2YTYxZWU2YWIwMmE2NzYxZDY2NjY2NiIpOwoKICAgIHZhciBQYWlyZWQgPSBjb2xvcnMoImE2Y2VlMzFmNzhiNGIyZGY4YTMzYTAyY2ZiOWE5OWUzMWExY2ZkYmY2ZmZmN2YwMGNhYjJkNjZhM2Q5YWZmZmY5OWIxNTkyOCIpOwoKICAgIHZhciBQYXN0ZWwxID0gY29sb3JzKCJmYmI0YWViM2NkZTNjY2ViYzVkZWNiZTRmZWQ5YTZmZmZmY2NlNWQ4YmRmZGRhZWNmMmYyZjIiKTsKCiAgICB2YXIgUGFzdGVsMiA9IGNvbG9ycygiYjNlMmNkZmRjZGFjY2JkNWU4ZjRjYWU0ZTZmNWM5ZmZmMmFlZjFlMmNjY2NjY2NjIik7CgogICAgdmFyIFNldDEgPSBjb2xvcnMoImU0MWExYzM3N2ViODRkYWY0YTk4NGVhM2ZmN2YwMGZmZmYzM2E2NTYyOGY3ODFiZjk5OTk5OSIpOwoKICAgIHZhciBTZXQyID0gY29sb3JzKCI2NmMyYTVmYzhkNjI4ZGEwY2JlNzhhYzNhNmQ4NTRmZmQ5MmZlNWM0OTRiM2IzYjMiKTsKCiAgICB2YXIgU2V0MyA9IGNvbG9ycygiOGRkM2M3ZmZmZmIzYmViYWRhZmI4MDcyODBiMWQzZmRiNDYyYjNkZTY5ZmNjZGU1ZDlkOWQ5YmM4MGJkY2NlYmM1ZmZlZDZmIik7CgogICAgdmFyIFRhYmxlYXUxMCA9IGNvbG9ycygiNGU3OWE3ZjI4ZTJjZTE1NzU5NzZiN2IyNTlhMTRmZWRjOTQ5YWY3YWExZmY5ZGE3OWM3NTVmYmFiMGFiIik7CgogICAgZnVuY3Rpb24gcmFtcChzY2hlbWUpIHsKICAgICAgcmV0dXJuIHJnYkJhc2lzKHNjaGVtZVtzY2hlbWUubGVuZ3RoIC0gMV0pOwogICAgfQoKICAgIHZhciBzY2hlbWUgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZDhiMzY1ZjVmNWY1NWFiNGFjIiwKICAgICAgImE2NjExYWRmYzI3ZDgwY2RjMTAxODU3MSIsCiAgICAgICJhNjYxMWFkZmMyN2RmNWY1ZjU4MGNkYzEwMTg1NzEiLAogICAgICAiOGM1MTBhZDhiMzY1ZjZlOGMzYzdlYWU1NWFiNGFjMDE2NjVlIiwKICAgICAgIjhjNTEwYWQ4YjM2NWY2ZThjM2Y1ZjVmNWM3ZWFlNTVhYjRhYzAxNjY1ZSIsCiAgICAgICI4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUiLAogICAgICAiOGM1MTBhYmY4MTJkZGZjMjdkZjZlOGMzZjVmNWY1YzdlYWU1ODBjZGMxMzU5NzhmMDE2NjVlIiwKICAgICAgIjU0MzAwNThjNTEwYWJmODEyZGRmYzI3ZGY2ZThjM2M3ZWFlNTgwY2RjMTM1OTc4ZjAxNjY1ZTAwM2MzMCIsCiAgICAgICI1NDMwMDU4YzUxMGFiZjgxMmRkZmMyN2RmNmU4YzNmNWY1ZjVjN2VhZTU4MGNkYzEzNTk3OGYwMTY2NWUwMDNjMzAiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBCckJHID0gcmFtcChzY2hlbWUpOwoKICAgIHZhciBzY2hlbWUkMSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJhZjhkYzNmN2Y3Zjc3ZmJmN2IiLAogICAgICAiN2IzMjk0YzJhNWNmYTZkYmEwMDA4ODM3IiwKICAgICAgIjdiMzI5NGMyYTVjZmY3ZjdmN2E2ZGJhMDAwODgzNyIsCiAgICAgICI3NjJhODNhZjhkYzNlN2Q0ZThkOWYwZDM3ZmJmN2IxYjc4MzciLAogICAgICAiNzYyYTgzYWY4ZGMzZTdkNGU4ZjdmN2Y3ZDlmMGQzN2ZiZjdiMWI3ODM3IiwKICAgICAgIjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGQ5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNyIsCiAgICAgICI3NjJhODM5OTcwYWJjMmE1Y2ZlN2Q0ZThmN2Y3ZjdkOWYwZDNhNmRiYTA1YWFlNjExYjc4MzciLAogICAgICAiNDAwMDRiNzYyYTgzOTk3MGFiYzJhNWNmZTdkNGU4ZDlmMGQzYTZkYmEwNWFhZTYxMWI3ODM3MDA0NDFiIiwKICAgICAgIjQwMDA0Yjc2MmE4Mzk5NzBhYmMyYTVjZmU3ZDRlOGY3ZjdmN2Q5ZjBkM2E2ZGJhMDVhYWU2MTFiNzgzNzAwNDQxYiIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIFBSR24gPSByYW1wKHNjaGVtZSQxKTsKCiAgICB2YXIgc2NoZW1lJDIgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZTlhM2M5ZjdmN2Y3YTFkNzZhIiwKICAgICAgImQwMWM4YmYxYjZkYWI4ZTE4NjRkYWMyNiIsCiAgICAgICJkMDFjOGJmMWI2ZGFmN2Y3ZjdiOGUxODY0ZGFjMjYiLAogICAgICAiYzUxYjdkZTlhM2M5ZmRlMGVmZTZmNWQwYTFkNzZhNGQ5MjIxIiwKICAgICAgImM1MWI3ZGU5YTNjOWZkZTBlZmY3ZjdmN2U2ZjVkMGExZDc2YTRkOTIyMSIsCiAgICAgICJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEiLAogICAgICAiYzUxYjdkZGU3N2FlZjFiNmRhZmRlMGVmZjdmN2Y3ZTZmNWQwYjhlMTg2N2ZiYzQxNGQ5MjIxIiwKICAgICAgIjhlMDE1MmM1MWI3ZGRlNzdhZWYxYjZkYWZkZTBlZmU2ZjVkMGI4ZTE4NjdmYmM0MTRkOTIyMTI3NjQxOSIsCiAgICAgICI4ZTAxNTJjNTFiN2RkZTc3YWVmMWI2ZGFmZGUwZWZmN2Y3ZjdlNmY1ZDBiOGUxODY3ZmJjNDE0ZDkyMjEyNzY0MTkiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBQaVlHID0gcmFtcChzY2hlbWUkMik7CgogICAgdmFyIHNjaGVtZSQzID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgIjk5OGVjM2Y3ZjdmN2YxYTM0MCIsCiAgICAgICI1ZTNjOTliMmFiZDJmZGI4NjNlNjYxMDEiLAogICAgICAiNWUzYzk5YjJhYmQyZjdmN2Y3ZmRiODYzZTY2MTAxIiwKICAgICAgIjU0Mjc4ODk5OGVjM2Q4ZGFlYmZlZTBiNmYxYTM0MGIzNTgwNiIsCiAgICAgICI1NDI3ODg5OThlYzNkOGRhZWJmN2Y3ZjdmZWUwYjZmMWEzNDBiMzU4MDYiLAogICAgICAiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2IiwKICAgICAgIjU0Mjc4ODgwNzNhY2IyYWJkMmQ4ZGFlYmY3ZjdmN2ZlZTBiNmZkYjg2M2UwODIxNGIzNTgwNiIsCiAgICAgICIyZDAwNGI1NDI3ODg4MDczYWNiMmFiZDJkOGRhZWJmZWUwYjZmZGI4NjNlMDgyMTRiMzU4MDY3ZjNiMDgiLAogICAgICAiMmQwMDRiNTQyNzg4ODA3M2FjYjJhYmQyZDhkYWViZjdmN2Y3ZmVlMGI2ZmRiODYzZTA4MjE0YjM1ODA2N2YzYjA4IgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgUHVPciA9IHJhbXAoc2NoZW1lJDMpOwoKICAgIHZhciBzY2hlbWUkNCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJlZjhhNjJmN2Y3Zjc2N2E5Y2YiLAogICAgICAiY2EwMDIwZjRhNTgyOTJjNWRlMDU3MWIwIiwKICAgICAgImNhMDAyMGY0YTU4MmY3ZjdmNzkyYzVkZTA1NzFiMCIsCiAgICAgICJiMjE4MmJlZjhhNjJmZGRiYzdkMWU1ZjA2N2E5Y2YyMTY2YWMiLAogICAgICAiYjIxODJiZWY4YTYyZmRkYmM3ZjdmN2Y3ZDFlNWYwNjdhOWNmMjE2NmFjIiwKICAgICAgImIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYyIsCiAgICAgICJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmN2Y3ZjdkMWU1ZjA5MmM1ZGU0MzkzYzMyMTY2YWMiLAogICAgICAiNjcwMDFmYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZDFlNWYwOTJjNWRlNDM5M2MzMjE2NmFjMDUzMDYxIiwKICAgICAgIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2Y3ZjdmN2QxZTVmMDkyYzVkZTQzOTNjMzIxNjZhYzA1MzA2MSIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIFJkQnUgPSByYW1wKHNjaGVtZSQ0KTsKCiAgICB2YXIgc2NoZW1lJDUgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZWY4YTYyZmZmZmZmOTk5OTk5IiwKICAgICAgImNhMDAyMGY0YTU4MmJhYmFiYTQwNDA0MCIsCiAgICAgICJjYTAwMjBmNGE1ODJmZmZmZmZiYWJhYmE0MDQwNDAiLAogICAgICAiYjIxODJiZWY4YTYyZmRkYmM3ZTBlMGUwOTk5OTk5NGQ0ZDRkIiwKICAgICAgImIyMTgyYmVmOGE2MmZkZGJjN2ZmZmZmZmUwZTBlMDk5OTk5OTRkNGQ0ZCIsCiAgICAgICJiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQiLAogICAgICAiYjIxODJiZDY2MDRkZjRhNTgyZmRkYmM3ZmZmZmZmZTBlMGUwYmFiYWJhODc4Nzg3NGQ0ZDRkIiwKICAgICAgIjY3MDAxZmIyMTgyYmQ2NjA0ZGY0YTU4MmZkZGJjN2UwZTBlMGJhYmFiYTg3ODc4NzRkNGQ0ZDFhMWExYSIsCiAgICAgICI2NzAwMWZiMjE4MmJkNjYwNGRmNGE1ODJmZGRiYzdmZmZmZmZlMGUwZTBiYWJhYmE4Nzg3ODc0ZDRkNGQxYTFhMWEiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBSZEd5ID0gcmFtcChzY2hlbWUkNSk7CgogICAgdmFyIHNjaGVtZSQ2ID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImZjOGQ1OWZmZmZiZjkxYmZkYiIsCiAgICAgICJkNzE5MWNmZGFlNjFhYmQ5ZTkyYzdiYjYiLAogICAgICAiZDcxOTFjZmRhZTYxZmZmZmJmYWJkOWU5MmM3YmI2IiwKICAgICAgImQ3MzAyN2ZjOGQ1OWZlZTA5MGUwZjNmODkxYmZkYjQ1NzViNCIsCiAgICAgICJkNzMwMjdmYzhkNTlmZWUwOTBmZmZmYmZlMGYzZjg5MWJmZGI0NTc1YjQiLAogICAgICAiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0IiwKICAgICAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA5MGZmZmZiZmUwZjNmOGFiZDllOTc0YWRkMTQ1NzViNCIsCiAgICAgICJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOTBlMGYzZjhhYmQ5ZTk3NGFkZDE0NTc1YjQzMTM2OTUiLAogICAgICAiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDkwZmZmZmJmZTBmM2Y4YWJkOWU5NzRhZGQxNDU3NWI0MzEzNjk1IgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgUmRZbEJ1ID0gcmFtcChzY2hlbWUkNik7CgogICAgdmFyIHNjaGVtZSQ3ID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImZjOGQ1OWZmZmZiZjkxY2Y2MCIsCiAgICAgICJkNzE5MWNmZGFlNjFhNmQ5NmExYTk2NDEiLAogICAgICAiZDcxOTFjZmRhZTYxZmZmZmJmYTZkOTZhMWE5NjQxIiwKICAgICAgImQ3MzAyN2ZjOGQ1OWZlZTA4YmQ5ZWY4YjkxY2Y2MDFhOTg1MCIsCiAgICAgICJkNzMwMjdmYzhkNTlmZWUwOGJmZmZmYmZkOWVmOGI5MWNmNjAxYTk4NTAiLAogICAgICAiZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwIiwKICAgICAgImQ3MzAyN2Y0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmQ5ZWY4YmE2ZDk2YTY2YmQ2MzFhOTg1MCIsCiAgICAgICJhNTAwMjZkNzMwMjdmNDZkNDNmZGFlNjFmZWUwOGJkOWVmOGJhNmQ5NmE2NmJkNjMxYTk4NTAwMDY4MzciLAogICAgICAiYTUwMDI2ZDczMDI3ZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZDllZjhiYTZkOTZhNjZiZDYzMWE5ODUwMDA2ODM3IgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgUmRZbEduID0gcmFtcChzY2hlbWUkNyk7CgogICAgdmFyIHNjaGVtZSQ4ID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImZjOGQ1OWZmZmZiZjk5ZDU5NCIsCiAgICAgICJkNzE5MWNmZGFlNjFhYmRkYTQyYjgzYmEiLAogICAgICAiZDcxOTFjZmRhZTYxZmZmZmJmYWJkZGE0MmI4M2JhIiwKICAgICAgImQ1M2U0ZmZjOGQ1OWZlZTA4YmU2ZjU5ODk5ZDU5NDMyODhiZCIsCiAgICAgICJkNTNlNGZmYzhkNTlmZWUwOGJmZmZmYmZlNmY1OTg5OWQ1OTQzMjg4YmQiLAogICAgICAiZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkIiwKICAgICAgImQ1M2U0ZmY0NmQ0M2ZkYWU2MWZlZTA4YmZmZmZiZmU2ZjU5OGFiZGRhNDY2YzJhNTMyODhiZCIsCiAgICAgICI5ZTAxNDJkNTNlNGZmNDZkNDNmZGFlNjFmZWUwOGJlNmY1OThhYmRkYTQ2NmMyYTUzMjg4YmQ1ZTRmYTIiLAogICAgICAiOWUwMTQyZDUzZTRmZjQ2ZDQzZmRhZTYxZmVlMDhiZmZmZmJmZTZmNTk4YWJkZGE0NjZjMmE1MzI4OGJkNWU0ZmEyIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgU3BlY3RyYWwgPSByYW1wKHNjaGVtZSQ4KTsKCiAgICB2YXIgc2NoZW1lJDkgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZTVmNWY5OTlkOGM5MmNhMjVmIiwKICAgICAgImVkZjhmYmIyZTJlMjY2YzJhNDIzOGI0NSIsCiAgICAgICJlZGY4ZmJiMmUyZTI2NmMyYTQyY2EyNWYwMDZkMmMiLAogICAgICAiZWRmOGZiY2NlY2U2OTlkOGM5NjZjMmE0MmNhMjVmMDA2ZDJjIiwKICAgICAgImVkZjhmYmNjZWNlNjk5ZDhjOTY2YzJhNDQxYWU3NjIzOGI0NTAwNTgyNCIsCiAgICAgICJmN2ZjZmRlNWY1ZjljY2VjZTY5OWQ4Yzk2NmMyYTQ0MWFlNzYyMzhiNDUwMDU4MjQiLAogICAgICAiZjdmY2ZkZTVmNWY5Y2NlY2U2OTlkOGM5NjZjMmE0NDFhZTc2MjM4YjQ1MDA2ZDJjMDA0NDFiIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgQnVHbiA9IHJhbXAoc2NoZW1lJDkpOwoKICAgIHZhciBzY2hlbWUkYSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJlMGVjZjQ5ZWJjZGE4ODU2YTciLAogICAgICAiZWRmOGZiYjNjZGUzOGM5NmM2ODg0MTlkIiwKICAgICAgImVkZjhmYmIzY2RlMzhjOTZjNjg4NTZhNzgxMGY3YyIsCiAgICAgICJlZGY4ZmJiZmQzZTY5ZWJjZGE4Yzk2YzY4ODU2YTc4MTBmN2MiLAogICAgICAiZWRmOGZiYmZkM2U2OWViY2RhOGM5NmM2OGM2YmIxODg0MTlkNmUwMTZiIiwKICAgICAgImY3ZmNmZGUwZWNmNGJmZDNlNjllYmNkYThjOTZjNjhjNmJiMTg4NDE5ZDZlMDE2YiIsCiAgICAgICJmN2ZjZmRlMGVjZjRiZmQzZTY5ZWJjZGE4Yzk2YzY4YzZiYjE4ODQxOWQ4MTBmN2M0ZDAwNGIiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBCdVB1ID0gcmFtcChzY2hlbWUkYSk7CgogICAgdmFyIHNjaGVtZSRiID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImUwZjNkYmE4ZGRiNTQzYTJjYSIsCiAgICAgICJmMGY5ZThiYWU0YmM3YmNjYzQyYjhjYmUiLAogICAgICAiZjBmOWU4YmFlNGJjN2JjY2M0NDNhMmNhMDg2OGFjIiwKICAgICAgImYwZjllOGNjZWJjNWE4ZGRiNTdiY2NjNDQzYTJjYTA4NjhhYyIsCiAgICAgICJmMGY5ZThjY2ViYzVhOGRkYjU3YmNjYzQ0ZWIzZDMyYjhjYmUwODU4OWUiLAogICAgICAiZjdmY2YwZTBmM2RiY2NlYmM1YThkZGI1N2JjY2M0NGViM2QzMmI4Y2JlMDg1ODllIiwKICAgICAgImY3ZmNmMGUwZjNkYmNjZWJjNWE4ZGRiNTdiY2NjNDRlYjNkMzJiOGNiZTA4NjhhYzA4NDA4MSIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIEduQnUgPSByYW1wKHNjaGVtZSRiKTsKCiAgICB2YXIgc2NoZW1lJGMgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZmVlOGM4ZmRiYjg0ZTM0YTMzIiwKICAgICAgImZlZjBkOWZkY2M4YWZjOGQ1OWQ3MzAxZiIsCiAgICAgICJmZWYwZDlmZGNjOGFmYzhkNTllMzRhMzNiMzAwMDAiLAogICAgICAiZmVmMGQ5ZmRkNDllZmRiYjg0ZmM4ZDU5ZTM0YTMzYjMwMDAwIiwKICAgICAgImZlZjBkOWZkZDQ5ZWZkYmI4NGZjOGQ1OWVmNjU0OGQ3MzAxZjk5MDAwMCIsCiAgICAgICJmZmY3ZWNmZWU4YzhmZGQ0OWVmZGJiODRmYzhkNTllZjY1NDhkNzMwMWY5OTAwMDAiLAogICAgICAiZmZmN2VjZmVlOGM4ZmRkNDllZmRiYjg0ZmM4ZDU5ZWY2NTQ4ZDczMDFmYjMwMDAwN2YwMDAwIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgT3JSZCA9IHJhbXAoc2NoZW1lJGMpOwoKICAgIHZhciBzY2hlbWUkZCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJlY2UyZjBhNmJkZGIxYzkwOTkiLAogICAgICAiZjZlZmY3YmRjOWUxNjdhOWNmMDI4MThhIiwKICAgICAgImY2ZWZmN2JkYzllMTY3YTljZjFjOTA5OTAxNmM1OSIsCiAgICAgICJmNmVmZjdkMGQxZTZhNmJkZGI2N2E5Y2YxYzkwOTkwMTZjNTkiLAogICAgICAiZjZlZmY3ZDBkMWU2YTZiZGRiNjdhOWNmMzY5MGMwMDI4MThhMDE2NDUwIiwKICAgICAgImZmZjdmYmVjZTJmMGQwZDFlNmE2YmRkYjY3YTljZjM2OTBjMDAyODE4YTAxNjQ1MCIsCiAgICAgICJmZmY3ZmJlY2UyZjBkMGQxZTZhNmJkZGI2N2E5Y2YzNjkwYzAwMjgxOGEwMTZjNTkwMTQ2MzYiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBQdUJ1R24gPSByYW1wKHNjaGVtZSRkKTsKCiAgICB2YXIgc2NoZW1lJGUgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZWNlN2YyYTZiZGRiMmI4Y2JlIiwKICAgICAgImYxZWVmNmJkYzllMTc0YTljZjA1NzBiMCIsCiAgICAgICJmMWVlZjZiZGM5ZTE3NGE5Y2YyYjhjYmUwNDVhOGQiLAogICAgICAiZjFlZWY2ZDBkMWU2YTZiZGRiNzRhOWNmMmI4Y2JlMDQ1YThkIiwKICAgICAgImYxZWVmNmQwZDFlNmE2YmRkYjc0YTljZjM2OTBjMDA1NzBiMDAzNGU3YiIsCiAgICAgICJmZmY3ZmJlY2U3ZjJkMGQxZTZhNmJkZGI3NGE5Y2YzNjkwYzAwNTcwYjAwMzRlN2IiLAogICAgICAiZmZmN2ZiZWNlN2YyZDBkMWU2YTZiZGRiNzRhOWNmMzY5MGMwMDU3MGIwMDQ1YThkMDIzODU4IgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgUHVCdSA9IHJhbXAoc2NoZW1lJGUpOwoKICAgIHZhciBzY2hlbWUkZiA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJlN2UxZWZjOTk0YzdkZDFjNzciLAogICAgICAiZjFlZWY2ZDdiNWQ4ZGY2NWIwY2UxMjU2IiwKICAgICAgImYxZWVmNmQ3YjVkOGRmNjViMGRkMWM3Nzk4MDA0MyIsCiAgICAgICJmMWVlZjZkNGI5ZGFjOTk0YzdkZjY1YjBkZDFjNzc5ODAwNDMiLAogICAgICAiZjFlZWY2ZDRiOWRhYzk5NGM3ZGY2NWIwZTcyOThhY2UxMjU2OTEwMDNmIiwKICAgICAgImY3ZjRmOWU3ZTFlZmQ0YjlkYWM5OTRjN2RmNjViMGU3Mjk4YWNlMTI1NjkxMDAzZiIsCiAgICAgICJmN2Y0ZjllN2UxZWZkNGI5ZGFjOTk0YzdkZjY1YjBlNzI5OGFjZTEyNTY5ODAwNDM2NzAwMWYiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBQdVJkID0gcmFtcChzY2hlbWUkZik7CgogICAgdmFyIHNjaGVtZSRnID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImZkZTBkZGZhOWZiNWM1MWI4YSIsCiAgICAgICJmZWViZTJmYmI0YjlmNzY4YTFhZTAxN2UiLAogICAgICAiZmVlYmUyZmJiNGI5Zjc2OGExYzUxYjhhN2EwMTc3IiwKICAgICAgImZlZWJlMmZjYzVjMGZhOWZiNWY3NjhhMWM1MWI4YTdhMDE3NyIsCiAgICAgICJmZWViZTJmY2M1YzBmYTlmYjVmNzY4YTFkZDM0OTdhZTAxN2U3YTAxNzciLAogICAgICAiZmZmN2YzZmRlMGRkZmNjNWMwZmE5ZmI1Zjc2OGExZGQzNDk3YWUwMTdlN2EwMTc3IiwKICAgICAgImZmZjdmM2ZkZTBkZGZjYzVjMGZhOWZiNWY3NjhhMWRkMzQ5N2FlMDE3ZTdhMDE3NzQ5MDA2YSIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIFJkUHUgPSByYW1wKHNjaGVtZSRnKTsKCiAgICB2YXIgc2NoZW1lJGggPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZWRmOGIxN2ZjZGJiMmM3ZmI4IiwKICAgICAgImZmZmZjY2ExZGFiNDQxYjZjNDIyNWVhOCIsCiAgICAgICJmZmZmY2NhMWRhYjQ0MWI2YzQyYzdmYjgyNTM0OTQiLAogICAgICAiZmZmZmNjYzdlOWI0N2ZjZGJiNDFiNmM0MmM3ZmI4MjUzNDk0IiwKICAgICAgImZmZmZjY2M3ZTliNDdmY2RiYjQxYjZjNDFkOTFjMDIyNWVhODBjMmM4NCIsCiAgICAgICJmZmZmZDllZGY4YjFjN2U5YjQ3ZmNkYmI0MWI2YzQxZDkxYzAyMjVlYTgwYzJjODQiLAogICAgICAiZmZmZmQ5ZWRmOGIxYzdlOWI0N2ZjZGJiNDFiNmM0MWQ5MWMwMjI1ZWE4MjUzNDk0MDgxZDU4IgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgWWxHbkJ1ID0gcmFtcChzY2hlbWUkaCk7CgogICAgdmFyIHNjaGVtZSRpID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImY3ZmNiOWFkZGQ4ZTMxYTM1NCIsCiAgICAgICJmZmZmY2NjMmU2OTk3OGM2NzkyMzg0NDMiLAogICAgICAiZmZmZmNjYzJlNjk5NzhjNjc5MzFhMzU0MDA2ODM3IiwKICAgICAgImZmZmZjY2Q5ZjBhM2FkZGQ4ZTc4YzY3OTMxYTM1NDAwNjgzNyIsCiAgICAgICJmZmZmY2NkOWYwYTNhZGRkOGU3OGM2Nzk0MWFiNWQyMzg0NDMwMDVhMzIiLAogICAgICAiZmZmZmU1ZjdmY2I5ZDlmMGEzYWRkZDhlNzhjNjc5NDFhYjVkMjM4NDQzMDA1YTMyIiwKICAgICAgImZmZmZlNWY3ZmNiOWQ5ZjBhM2FkZGQ4ZTc4YzY3OTQxYWI1ZDIzODQ0MzAwNjgzNzAwNDUyOSIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIFlsR24gPSByYW1wKHNjaGVtZSRpKTsKCiAgICB2YXIgc2NoZW1lJGogPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZmZmN2JjZmVjNDRmZDk1ZjBlIiwKICAgICAgImZmZmZkNGZlZDk4ZWZlOTkyOWNjNGMwMiIsCiAgICAgICJmZmZmZDRmZWQ5OGVmZTk5MjlkOTVmMGU5OTM0MDQiLAogICAgICAiZmZmZmQ0ZmVlMzkxZmVjNDRmZmU5OTI5ZDk1ZjBlOTkzNDA0IiwKICAgICAgImZmZmZkNGZlZTM5MWZlYzQ0ZmZlOTkyOWVjNzAxNGNjNGMwMjhjMmQwNCIsCiAgICAgICJmZmZmZTVmZmY3YmNmZWUzOTFmZWM0NGZmZTk5MjllYzcwMTRjYzRjMDI4YzJkMDQiLAogICAgICAiZmZmZmU1ZmZmN2JjZmVlMzkxZmVjNDRmZmU5OTI5ZWM3MDE0Y2M0YzAyOTkzNDA0NjYyNTA2IgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgWWxPckJyID0gcmFtcChzY2hlbWUkaik7CgogICAgdmFyIHNjaGVtZSRrID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImZmZWRhMGZlYjI0Y2YwM2IyMCIsCiAgICAgICJmZmZmYjJmZWNjNWNmZDhkM2NlMzFhMWMiLAogICAgICAiZmZmZmIyZmVjYzVjZmQ4ZDNjZjAzYjIwYmQwMDI2IiwKICAgICAgImZmZmZiMmZlZDk3NmZlYjI0Y2ZkOGQzY2YwM2IyMGJkMDAyNiIsCiAgICAgICJmZmZmYjJmZWQ5NzZmZWIyNGNmZDhkM2NmYzRlMmFlMzFhMWNiMTAwMjYiLAogICAgICAiZmZmZmNjZmZlZGEwZmVkOTc2ZmViMjRjZmQ4ZDNjZmM0ZTJhZTMxYTFjYjEwMDI2IiwKICAgICAgImZmZmZjY2ZmZWRhMGZlZDk3NmZlYjI0Y2ZkOGQzY2ZjNGUyYWUzMWExY2JkMDAyNjgwMDAyNiIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIFlsT3JSZCA9IHJhbXAoc2NoZW1lJGspOwoKICAgIHZhciBzY2hlbWUkbCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJkZWViZjc5ZWNhZTEzMTgyYmQiLAogICAgICAiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwKICAgICAgImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsCiAgICAgICJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLAogICAgICAiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwKICAgICAgImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsCiAgICAgICJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBCbHVlcyA9IHJhbXAoc2NoZW1lJGwpOwoKICAgIHZhciBzY2hlbWUkbSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJlNWY1ZTBhMWQ5OWIzMWEzNTQiLAogICAgICAiZWRmOGU5YmFlNGIzNzRjNDc2MjM4YjQ1IiwKICAgICAgImVkZjhlOWJhZTRiMzc0YzQ3NjMxYTM1NDAwNmQyYyIsCiAgICAgICJlZGY4ZTljN2U5YzBhMWQ5OWI3NGM0NzYzMWEzNTQwMDZkMmMiLAogICAgICAiZWRmOGU5YzdlOWMwYTFkOTliNzRjNDc2NDFhYjVkMjM4YjQ1MDA1YTMyIiwKICAgICAgImY3ZmNmNWU1ZjVlMGM3ZTljMGExZDk5Yjc0YzQ3NjQxYWI1ZDIzOGI0NTAwNWEzMiIsCiAgICAgICJmN2ZjZjVlNWY1ZTBjN2U5YzBhMWQ5OWI3NGM0NzY0MWFiNWQyMzhiNDUwMDZkMmMwMDQ0MWIiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBHcmVlbnMgPSByYW1wKHNjaGVtZSRtKTsKCiAgICB2YXIgc2NoZW1lJG4gPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZjBmMGYwYmRiZGJkNjM2MzYzIiwKICAgICAgImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsCiAgICAgICJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLAogICAgICAiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwKICAgICAgImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsCiAgICAgICJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLAogICAgICAiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgR3JleXMgPSByYW1wKHNjaGVtZSRuKTsKCiAgICB2YXIgc2NoZW1lJG8gPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZWZlZGY1YmNiZGRjNzU2YmIxIiwKICAgICAgImYyZjBmN2NiYzllMjllOWFjODZhNTFhMyIsCiAgICAgICJmMmYwZjdjYmM5ZTI5ZTlhYzg3NTZiYjE1NDI3OGYiLAogICAgICAiZjJmMGY3ZGFkYWViYmNiZGRjOWU5YWM4NzU2YmIxNTQyNzhmIiwKICAgICAgImYyZjBmN2RhZGFlYmJjYmRkYzllOWFjODgwN2RiYTZhNTFhMzRhMTQ4NiIsCiAgICAgICJmY2ZiZmRlZmVkZjVkYWRhZWJiY2JkZGM5ZTlhYzg4MDdkYmE2YTUxYTM0YTE0ODYiLAogICAgICAiZmNmYmZkZWZlZGY1ZGFkYWViYmNiZGRjOWU5YWM4ODA3ZGJhNmE1MWEzNTQyNzhmM2YwMDdkIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgUHVycGxlcyA9IHJhbXAoc2NoZW1lJG8pOwoKICAgIHZhciBzY2hlbWUkcCA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJmZWUwZDJmYzkyNzJkZTJkMjYiLAogICAgICAiZmVlNWQ5ZmNhZTkxZmI2YTRhY2IxODFkIiwKICAgICAgImZlZTVkOWZjYWU5MWZiNmE0YWRlMmQyNmE1MGYxNSIsCiAgICAgICJmZWU1ZDlmY2JiYTFmYzkyNzJmYjZhNGFkZTJkMjZhNTBmMTUiLAogICAgICAiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkOTkwMDBkIiwKICAgICAgImZmZjVmMGZlZTBkMmZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsCiAgICAgICJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWRhNTBmMTU2NzAwMGQiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBSZWRzID0gcmFtcChzY2hlbWUkcCk7CgogICAgdmFyIHNjaGVtZSRxID0gbmV3IEFycmF5KDMpLmNvbmNhdCgKICAgICAgImZlZTZjZWZkYWU2YmU2NTUwZCIsCiAgICAgICJmZWVkZGVmZGJlODVmZDhkM2NkOTQ3MDEiLAogICAgICAiZmVlZGRlZmRiZTg1ZmQ4ZDNjZTY1NTBkYTYzNjAzIiwKICAgICAgImZlZWRkZWZkZDBhMmZkYWU2YmZkOGQzY2U2NTUwZGE2MzYwMyIsCiAgICAgICJmZWVkZGVmZGQwYTJmZGFlNmJmZDhkM2NmMTY5MTNkOTQ4MDE4YzJkMDQiLAogICAgICAiZmZmNWViZmVlNmNlZmRkMGEyZmRhZTZiZmQ4ZDNjZjE2OTEzZDk0ODAxOGMyZDA0IiwKICAgICAgImZmZjVlYmZlZTZjZWZkZDBhMmZkYWU2YmZkOGQzY2YxNjkxM2Q5NDgwMWE2MzYwMzdmMjcwNCIKICAgICkubWFwKGNvbG9ycyk7CgogICAgdmFyIE9yYW5nZXMgPSByYW1wKHNjaGVtZSRxKTsKCiAgICBmdW5jdGlvbiBjaXZpZGlzKHQpIHsKICAgICAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTsKICAgICAgcmV0dXJuICJyZ2IoIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoLTQuNTQgLSB0ICogKDM1LjM0IC0gdCAqICgyMzgxLjczIC0gdCAqICg2NDAyLjcgLSB0ICogKDcwMjQuNzIgLSB0ICogMjcxMC41NykpKSkpKSkgKyAiLCAiCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCgzMi40OSArIHQgKiAoMTcwLjczICsgdCAqICg1Mi44MiAtIHQgKiAoMTMxLjQ2IC0gdCAqICgxNzYuNTggLSB0ICogNjcuMzcpKSkpKSkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoODEuMjQgKyB0ICogKDQ0Mi4zNiAtIHQgKiAoMjQ4Mi40MyAtIHQgKiAoNjE2Ny4yNCAtIHQgKiAoNjYxNC45NCAtIHQgKiAyNDc1LjY3KSkpKSkpKQogICAgICAgICAgKyAiKSI7CiAgICB9CgogICAgdmFyIGN1YmVoZWxpeCQzID0gY3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoMzAwLCAwLjUsIDAuMCksIGN1YmVoZWxpeCgtMjQwLCAwLjUsIDEuMCkpOwoKICAgIHZhciB3YXJtID0gY3ViZWhlbGl4TG9uZyhjdWJlaGVsaXgoLTEwMCwgMC43NSwgMC4zNSksIGN1YmVoZWxpeCg4MCwgMS41MCwgMC44KSk7CgogICAgdmFyIGNvb2wgPSBjdWJlaGVsaXhMb25nKGN1YmVoZWxpeCgyNjAsIDAuNzUsIDAuMzUpLCBjdWJlaGVsaXgoODAsIDEuNTAsIDAuOCkpOwoKICAgIHZhciBjID0gY3ViZWhlbGl4KCk7CgogICAgZnVuY3Rpb24gcmFpbmJvdyh0KSB7CiAgICAgIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBNYXRoLmZsb29yKHQpOwogICAgICB2YXIgdHMgPSBNYXRoLmFicyh0IC0gMC41KTsKICAgICAgYy5oID0gMzYwICogdCAtIDEwMDsKICAgICAgYy5zID0gMS41IC0gMS41ICogdHM7CiAgICAgIGMubCA9IDAuOCAtIDAuOSAqIHRzOwogICAgICByZXR1cm4gYyArICIiOwogICAgfQoKICAgIHZhciBjJDEgPSByZ2IoKSwKICAgICAgICBwaV8xXzMgPSBNYXRoLlBJIC8gMywKICAgICAgICBwaV8yXzMgPSBNYXRoLlBJICogMiAvIDM7CgogICAgZnVuY3Rpb24gc2luZWJvdyh0KSB7CiAgICAgIHZhciB4OwogICAgICB0ID0gKDAuNSAtIHQpICogTWF0aC5QSTsKICAgICAgYyQxLnIgPSAyNTUgKiAoeCA9IE1hdGguc2luKHQpKSAqIHg7CiAgICAgIGMkMS5nID0gMjU1ICogKHggPSBNYXRoLnNpbih0ICsgcGlfMV8zKSkgKiB4OwogICAgICBjJDEuYiA9IDI1NSAqICh4ID0gTWF0aC5zaW4odCArIHBpXzJfMykpICogeDsKICAgICAgcmV0dXJuIGMkMSArICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIHR1cmJvKHQpIHsKICAgICAgdCA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIHQpKTsKICAgICAgcmV0dXJuICJyZ2IoIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMzQuNjEgKyB0ICogKDExNzIuMzMgLSB0ICogKDEwNzkzLjU2IC0gdCAqICgzMzMwMC4xMiAtIHQgKiAoMzgzOTQuNDkgLSB0ICogMTQ4MjUuMDUpKSkpKSkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMjMuMzEgKyB0ICogKDU1Ny4zMyArIHQgKiAoMTIyNS4zMyAtIHQgKiAoMzU3NC45NiAtIHQgKiAoMTA3My43NyArIHQgKiA3MDcuNTYpKSkpKSkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQoMjcuMiArIHQgKiAoMzIxMS4xIC0gdCAqICgxNTMyNy45NyAtIHQgKiAoMjc4MTQgLSB0ICogKDIyNTY5LjE4IC0gdCAqIDY4MzguNjYpKSkpKSkpCiAgICAgICAgICArICIpIjsKICAgIH0KCiAgICBmdW5jdGlvbiByYW1wJDEocmFuZ2UpIHsKICAgICAgdmFyIG4gPSByYW5nZS5sZW5ndGg7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIHJhbmdlW01hdGgubWF4KDAsIE1hdGgubWluKG4gLSAxLCBNYXRoLmZsb29yKHQgKiBuKSkpXTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgdmlyaWRpcyA9IHJhbXAkMShjb2xvcnMoIjQ0MDE1NDQ0MDI1NjQ1MDQ1NzQ1MDU1OTQ2MDc1YTQ2MDg1YzQ2MGE1ZDQ2MGI1ZTQ3MGQ2MDQ3MGU2MTQ3MTA2MzQ3MTE2NDQ3MTM2NTQ4MTQ2NzQ4MTY2ODQ4MTc2OTQ4MTg2YTQ4MWE2YzQ4MWI2ZDQ4MWM2ZTQ4MWQ2ZjQ4MWY3MDQ4MjA3MTQ4MjE3MzQ4MjM3NDQ4MjQ3NTQ4MjU3NjQ4MjY3NzQ4Mjg3ODQ4Mjk3OTQ3MmE3YTQ3MmM3YTQ3MmQ3YjQ3MmU3YzQ3MmY3ZDQ2MzA3ZTQ2MzI3ZTQ2MzM3ZjQ2MzQ4MDQ1MzU4MTQ1Mzc4MTQ1Mzg4MjQ0Mzk4MzQ0M2E4MzQ0M2I4NDQzM2Q4NDQzM2U4NTQyM2Y4NTQyNDA4NjQyNDE4NjQxNDI4NzQxNDQ4NzQwNDU4ODQwNDY4ODNmNDc4ODNmNDg4OTNlNDk4OTNlNGE4OTNlNGM4YTNkNGQ4YTNkNGU4YTNjNGY4YTNjNTA4YjNiNTE4YjNiNTI4YjNhNTM4YjNhNTQ4YzM5NTU4YzM5NTY4YzM4NTg4YzM4NTk4YzM3NWE4YzM3NWI4ZDM2NWM4ZDM2NWQ4ZDM1NWU4ZDM1NWY4ZDM0NjA4ZDM0NjE4ZDMzNjI4ZDMzNjM4ZDMyNjQ4ZTMyNjU4ZTMxNjY4ZTMxNjc4ZTMxNjg4ZTMwNjk4ZTMwNmE4ZTJmNmI4ZTJmNmM4ZTJlNmQ4ZTJlNmU4ZTJlNmY4ZTJkNzA4ZTJkNzE4ZTJjNzE4ZTJjNzI4ZTJjNzM4ZTJiNzQ4ZTJiNzU4ZTJhNzY4ZTJhNzc4ZTJhNzg4ZTI5Nzk4ZTI5N2E4ZTI5N2I4ZTI4N2M4ZTI4N2Q4ZTI3N2U4ZTI3N2Y4ZTI3ODA4ZTI2ODE4ZTI2ODI4ZTI2ODI4ZTI1ODM4ZTI1ODQ4ZTI1ODU4ZTI0ODY4ZTI0ODc4ZTIzODg4ZTIzODk4ZTIzOGE4ZDIyOGI4ZDIyOGM4ZDIyOGQ4ZDIxOGU4ZDIxOGY4ZDIxOTA4ZDIxOTE4YzIwOTI4YzIwOTI4YzIwOTM4YzFmOTQ4YzFmOTU4YjFmOTY4YjFmOTc4YjFmOTg4YjFmOTk4YTFmOWE4YTFlOWI4YTFlOWM4OTFlOWQ4OTFmOWU4OTFmOWY4ODFmYTA4ODFmYTE4ODFmYTE4NzFmYTI4NzIwYTM4NjIwYTQ4NjIxYTU4NTIxYTY4NTIyYTc4NTIyYTg4NDIzYTk4MzI0YWE4MzI1YWI4MjI1YWM4MjI2YWQ4MTI3YWQ4MTI4YWU4MDI5YWY3ZjJhYjA3ZjJjYjE3ZTJkYjI3ZDJlYjM3YzJmYjQ3YzMxYjU3YjMyYjY3YTM0YjY3OTM1Yjc3OTM3Yjg3ODM4Yjk3NzNhYmE3NjNiYmI3NTNkYmM3NDNmYmM3MzQwYmQ3MjQyYmU3MTQ0YmY3MDQ2YzA2ZjQ4YzE2ZTRhYzE2ZDRjYzI2YzRlYzM2YjUwYzQ2YTUyYzU2OTU0YzU2ODU2YzY2NzU4Yzc2NTVhYzg2NDVjYzg2MzVlYzk2MjYwY2E2MDYzY2I1ZjY1Y2I1ZTY3Y2M1YzY5Y2Q1YjZjY2Q1YTZlY2U1ODcwY2Y1NzczZDA1Njc1ZDA1NDc3ZDE1MzdhZDE1MTdjZDI1MDdmZDM0ZTgxZDM0ZDg0ZDQ0Yjg2ZDU0OTg5ZDU0ODhiZDY0NjhlZDY0NTkwZDc0MzkzZDc0MTk1ZDg0MDk4ZDgzZTliZDkzYzlkZDkzYmEwZGEzOWEyZGEzN2E1ZGIzNmE4ZGIzNGFhZGMzMmFkZGMzMGIwZGQyZmIyZGQyZGI1ZGUyYmI4ZGUyOWJhZGUyOGJkZGYyNmMwZGYyNWMyZGYyM2M1ZTAyMWM4ZTAyMGNhZTExZmNkZTExZGQwZTExY2QyZTIxYmQ1ZTIxYWQ4ZTIxOWRhZTMxOWRkZTMxOGRmZTMxOGUyZTQxOGU1ZTQxOWU3ZTQxOWVhZTUxYWVjZTUxYmVmZTUxY2YxZTUxZGY0ZTYxZWY2ZTYyMGY4ZTYyMWZiZTcyM2ZkZTcyNSIpKTsKCiAgICB2YXIgbWFnbWEgPSByYW1wJDEoY29sb3JzKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSk7CgogICAgdmFyIGluZmVybm8gPSByYW1wJDEoY29sb3JzKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMGEwMjAyMGMwMjAyMGUwMzAyMTAwNDAzMTIwNDAzMTQwNTA0MTcwNjA0MTkwNzA1MWIwODA1MWQwOTA2MWYwYTA3MjIwYjA3MjQwYzA4MjYwZDA4MjkwZTA5MmIxMDA5MmQxMTBhMzAxMjBhMzIxNDBiMzQxNTBiMzcxNjBiMzkxODBjM2MxOTBjM2UxYjBjNDExYzBjNDMxZTBjNDUxZjBjNDgyMTBjNGEyMzBjNGMyNDBjNGYyNjBjNTEyODBiNTMyOTBiNTUyYjBiNTcyZDBiNTkyZjBhNWIzMTBhNWMzMjBhNWUzNDBhNWYzNjA5NjEzODA5NjIzOTA5NjMzYjA5NjQzZDA5NjUzZTA5NjY0MDBhNjc0MjBhNjg0NDBhNjg0NTBhNjk0NzBiNmE0OTBiNmE0YTBjNmI0YzBjNmI0ZDBkNmM0ZjBkNmM1MTBlNmM1MjBlNmQ1NDBmNmQ1NTBmNmQ1NzEwNmU1OTEwNmU1YTExNmU1YzEyNmU1ZDEyNmU1ZjEzNmU2MTEzNmU2MjE0NmU2NDE1NmU2NTE1NmU2NzE2NmU2OTE2NmU2YTE3NmU2YzE4NmU2ZDE4NmU2ZjE5NmU3MTE5NmU3MjFhNmU3NDFhNmU3NTFiNmU3NzFjNmQ3ODFjNmQ3YTFkNmQ3YzFkNmQ3ZDFlNmQ3ZjFlNmM4MDFmNmM4MjIwNmM4NDIwNmI4NTIxNmI4NzIxNmI4ODIyNmE4YTIyNmE4YzIzNjk4ZDIzNjk4ZjI0Njk5MDI1Njg5MjI1Njg5MzI2Njc5NTI2Njc5NzI3NjY5ODI3NjY5YTI4NjU5YjI5NjQ5ZDI5NjQ5ZjJhNjNhMDJhNjNhMjJiNjJhMzJjNjFhNTJjNjBhNjJkNjBhODJlNWZhOTJlNWVhYjJmNWVhZDMwNWRhZTMwNWNiMDMxNWJiMTMyNWFiMzMyNWFiNDMzNTliNjM0NThiNzM1NTdiOTM1NTZiYTM2NTViYzM3NTRiZDM4NTNiZjM5NTJjMDNhNTFjMTNhNTBjMzNiNGZjNDNjNGVjNjNkNGRjNzNlNGNjODNmNGJjYTQwNGFjYjQxNDljYzQyNDhjZTQzNDdjZjQ0NDZkMDQ1NDVkMjQ2NDRkMzQ3NDNkNDQ4NDJkNTRhNDFkNzRiM2ZkODRjM2VkOTRkM2RkYTRlM2NkYjUwM2JkZDUxM2FkZTUyMzhkZjUzMzdlMDU1MzZlMTU2MzVlMjU3MzRlMzU5MzNlNDVhMzFlNTVjMzBlNjVkMmZlNzVlMmVlODYwMmRlOTYxMmJlYTYzMmFlYjY0MjllYjY2MjhlYzY3MjZlZDY5MjVlZTZhMjRlZjZjMjNlZjZlMjFmMDZmMjBmMTcxMWZmMTczMWRmMjc0MWNmMzc2MWJmMzc4MTlmNDc5MThmNTdiMTdmNTdkMTVmNjdlMTRmNjgwMTNmNzgyMTJmNzg0MTBmODg1MGZmODg3MGVmODg5MGNmOThiMGJmOThjMGFmOThlMDlmYTkwMDhmYTkyMDdmYTk0MDdmYjk2MDZmYjk3MDZmYjk5MDZmYjliMDZmYjlkMDdmYzlmMDdmY2ExMDhmY2EzMDlmY2E1MGFmY2E2MGNmY2E4MGRmY2FhMGZmY2FjMTFmY2FlMTJmY2IwMTRmY2IyMTZmY2I0MThmYmI2MWFmYmI4MWRmYmJhMWZmYmJjMjFmYmJlMjNmYWMwMjZmYWMyMjhmYWM0MmFmYWM2MmRmOWM3MmZmOWM5MzJmOWNiMzVmOGNkMzdmOGNmM2FmN2QxM2RmN2QzNDBmNmQ1NDNmNmQ3NDZmNWQ5NDlmNWRiNGNmNGRkNGZmNGRmNTNmNGUxNTZmM2UzNWFmM2U1NWRmMmU2NjFmMmU4NjVmMmVhNjlmMWVjNmRmMWVkNzFmMWVmNzVmMWYxNzlmMmYyN2RmMmY0ODJmM2Y1ODZmM2Y2OGFmNGY4OGVmNWY5OTJmNmZhOTZmOGZiOWFmOWZjOWRmYWZkYTFmY2ZmYTQiKSk7CgogICAgdmFyIHBsYXNtYSA9IHJhbXAkMShjb2xvcnMoIjBkMDg4NzEwMDc4ODEzMDc4OTE2MDc4YTE5MDY4YzFiMDY4ZDFkMDY4ZTIwMDY4ZjIyMDY5MDI0MDY5MTI2MDU5MTI4MDU5MjJhMDU5MzJjMDU5NDJlMDU5NTJmMDU5NjMxMDU5NzMzMDU5NzM1MDQ5ODM3MDQ5OTM4MDQ5YTNhMDQ5YTNjMDQ5YjNlMDQ5YzNmMDQ5YzQxMDQ5ZDQzMDM5ZTQ0MDM5ZTQ2MDM5ZjQ4MDM5ZjQ5MDNhMDRiMDNhMTRjMDJhMTRlMDJhMjUwMDJhMjUxMDJhMzUzMDJhMzU1MDJhNDU2MDFhNDU4MDFhNDU5MDFhNTViMDFhNTVjMDFhNjVlMDFhNjYwMDFhNjYxMDBhNzYzMDBhNzY0MDBhNzY2MDBhNzY3MDBhODY5MDBhODZhMDBhODZjMDBhODZlMDBhODZmMDBhODcxMDBhODcyMDFhODc0MDFhODc1MDFhODc3MDFhODc4MDFhODdhMDJhODdiMDJhODdkMDNhODdlMDNhODgwMDRhODgxMDRhNzgzMDVhNzg0MDVhNzg2MDZhNjg3MDdhNjg4MDhhNjhhMDlhNThiMGFhNThkMGJhNThlMGNhNDhmMGRhNDkxMGVhMzkyMGZhMzk0MTBhMjk1MTFhMTk2MTNhMTk4MTRhMDk5MTU5ZjlhMTY5ZjljMTc5ZTlkMTg5ZDllMTk5ZGEwMWE5Y2ExMWI5YmEyMWQ5YWEzMWU5YWE1MWY5OWE2MjA5OGE3MjE5N2E4MjI5NmFhMjM5NWFiMjQ5NGFjMjY5NGFkMjc5M2FlMjg5MmIwMjk5MWIxMmE5MGIyMmI4ZmIzMmM4ZWI0MmU4ZGI1MmY4Y2I2MzA4YmI3MzE4YWI4MzI4OWJhMzM4OGJiMzQ4OGJjMzU4N2JkMzc4NmJlMzg4NWJmMzk4NGMwM2E4M2MxM2I4MmMyM2M4MWMzM2Q4MGM0M2U3ZmM1NDA3ZWM2NDE3ZGM3NDI3Y2M4NDM3YmM5NDQ3YWNhNDU3YWNiNDY3OWNjNDc3OGNjNDk3N2NkNGE3NmNlNGI3NWNmNGM3NGQwNGQ3M2QxNGU3MmQyNGY3MWQzNTE3MWQ0NTI3MGQ1NTM2ZmQ1NTQ2ZWQ2NTU2ZGQ3NTY2Y2Q4NTc2YmQ5NTg2YWRhNWE2YWRhNWI2OWRiNWM2OGRjNWQ2N2RkNWU2NmRlNWY2NWRlNjE2NGRmNjI2M2UwNjM2M2UxNjQ2MmUyNjU2MWUyNjY2MGUzNjg1ZmU0Njk1ZWU1NmE1ZGU1NmI1ZGU2NmM1Y2U3NmU1YmU3NmY1YWU4NzA1OWU5NzE1OGU5NzI1N2VhNzQ1N2ViNzU1NmViNzY1NWVjNzc1NGVkNzk1M2VkN2E1MmVlN2I1MWVmN2M1MWVmN2U1MGYwN2Y0ZmYwODA0ZWYxODE0ZGYxODM0Y2YyODQ0YmYzODU0YmYzODc0YWY0ODg0OWY0ODk0OGY1OGI0N2Y1OGM0NmY2OGQ0NWY2OGY0NGY3OTA0NGY3OTE0M2Y3OTM0MmY4OTQ0MWY4OTU0MGY5OTczZmY5OTgzZWY5OWEzZWZhOWIzZGZhOWMzY2ZhOWUzYmZiOWYzYWZiYTEzOWZiYTIzOGZjYTMzOGZjYTUzN2ZjYTYzNmZjYTgzNWZjYTkzNGZkYWIzM2ZkYWMzM2ZkYWUzMmZkYWYzMWZkYjEzMGZkYjIyZmZkYjQyZmZkYjUyZWZlYjcyZGZlYjgyY2ZlYmEyY2ZlYmIyYmZlYmQyYWZlYmUyYWZlYzAyOWZkYzIyOWZkYzMyOGZkYzUyN2ZkYzYyN2ZkYzgyN2ZkY2EyNmZkY2IyNmZjY2QyNWZjY2UyNWZjZDAyNWZjZDIyNWZiZDMyNGZiZDUyNGZiZDcyNGZhZDgyNGZhZGEyNGY5ZGMyNGY5ZGQyNWY4ZGYyNWY4ZTEyNWY3ZTIyNWY3ZTQyNWY2ZTYyNmY2ZTgyNmY1ZTkyNmY1ZWIyN2Y0ZWQyN2YzZWUyN2YzZjAyN2YyZjIyN2YxZjQyNmYxZjUyNWYwZjcyNGYwZjkyMSIpKTsKCiAgICBmdW5jdGlvbiBjb25zdGFudCRiKHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNvbnN0YW50KCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIHZhciBhYnMkMSA9IE1hdGguYWJzOwogICAgdmFyIGF0YW4yJDEgPSBNYXRoLmF0YW4yOwogICAgdmFyIGNvcyQyID0gTWF0aC5jb3M7CiAgICB2YXIgbWF4JDIgPSBNYXRoLm1heDsKICAgIHZhciBtaW4kMSA9IE1hdGgubWluOwogICAgdmFyIHNpbiQyID0gTWF0aC5zaW47CiAgICB2YXIgc3FydCQyID0gTWF0aC5zcXJ0OwoKICAgIHZhciBlcHNpbG9uJDMgPSAxZS0xMjsKICAgIHZhciBwaSQ0ID0gTWF0aC5QSTsKICAgIHZhciBoYWxmUGkkMyA9IHBpJDQgLyAyOwogICAgdmFyIHRhdSQ0ID0gMiAqIHBpJDQ7CgogICAgZnVuY3Rpb24gYWNvcyQxKHgpIHsKICAgICAgcmV0dXJuIHggPiAxID8gMCA6IHggPCAtMSA/IHBpJDQgOiBNYXRoLmFjb3MoeCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNpbiQxKHgpIHsKICAgICAgcmV0dXJuIHggPj0gMSA/IGhhbGZQaSQzIDogeCA8PSAtMSA/IC1oYWxmUGkkMyA6IE1hdGguYXNpbih4KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmNJbm5lclJhZGl1cyhkKSB7CiAgICAgIHJldHVybiBkLmlubmVyUmFkaXVzOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyY091dGVyUmFkaXVzKGQpIHsKICAgICAgcmV0dXJuIGQub3V0ZXJSYWRpdXM7CiAgICB9CgogICAgZnVuY3Rpb24gYXJjU3RhcnRBbmdsZShkKSB7CiAgICAgIHJldHVybiBkLnN0YXJ0QW5nbGU7CiAgICB9CgogICAgZnVuY3Rpb24gYXJjRW5kQW5nbGUoZCkgewogICAgICByZXR1cm4gZC5lbmRBbmdsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmNQYWRBbmdsZShkKSB7CiAgICAgIHJldHVybiBkICYmIGQucGFkQW5nbGU7IC8vIE5vdGU6IG9wdGlvbmFsIQogICAgfQoKICAgIGZ1bmN0aW9uIGludGVyc2VjdCh4MCwgeTAsIHgxLCB5MSwgeDIsIHkyLCB4MywgeTMpIHsKICAgICAgdmFyIHgxMCA9IHgxIC0geDAsIHkxMCA9IHkxIC0geTAsCiAgICAgICAgICB4MzIgPSB4MyAtIHgyLCB5MzIgPSB5MyAtIHkyLAogICAgICAgICAgdCA9IHkzMiAqIHgxMCAtIHgzMiAqIHkxMDsKICAgICAgaWYgKHQgKiB0IDwgZXBzaWxvbiQzKSByZXR1cm47CiAgICAgIHQgPSAoeDMyICogKHkwIC0geTIpIC0geTMyICogKHgwIC0geDIpKSAvIHQ7CiAgICAgIHJldHVybiBbeDAgKyB0ICogeDEwLCB5MCArIHQgKiB5MTBdOwogICAgfQoKICAgIC8vIENvbXB1dGUgcGVycGVuZGljdWxhciBvZmZzZXQgbGluZSBvZiBsZW5ndGggcmMuCiAgICAvLyBodHRwOi8vbWF0aHdvcmxkLndvbGZyYW0uY29tL0NpcmNsZS1MaW5lSW50ZXJzZWN0aW9uLmh0bWwKICAgIGZ1bmN0aW9uIGNvcm5lclRhbmdlbnRzKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7CiAgICAgIHZhciB4MDEgPSB4MCAtIHgxLAogICAgICAgICAgeTAxID0geTAgLSB5MSwKICAgICAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCQyKHgwMSAqIHgwMSArIHkwMSAqIHkwMSksCiAgICAgICAgICBveCA9IGxvICogeTAxLAogICAgICAgICAgb3kgPSAtbG8gKiB4MDEsCiAgICAgICAgICB4MTEgPSB4MCArIG94LAogICAgICAgICAgeTExID0geTAgKyBveSwKICAgICAgICAgIHgxMCA9IHgxICsgb3gsCiAgICAgICAgICB5MTAgPSB5MSArIG95LAogICAgICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAyLAogICAgICAgICAgeTAwID0gKHkxMSArIHkxMCkgLyAyLAogICAgICAgICAgZHggPSB4MTAgLSB4MTEsCiAgICAgICAgICBkeSA9IHkxMCAtIHkxMSwKICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksCiAgICAgICAgICByID0gcjEgLSByYywKICAgICAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsCiAgICAgICAgICBkID0gKGR5IDwgMCA/IC0xIDogMSkgKiBzcXJ0JDIobWF4JDIoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksCiAgICAgICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLAogICAgICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsCiAgICAgICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLAogICAgICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsCiAgICAgICAgICBkeDAgPSBjeDAgLSB4MDAsCiAgICAgICAgICBkeTAgPSBjeTAgLSB5MDAsCiAgICAgICAgICBkeDEgPSBjeDEgLSB4MDAsCiAgICAgICAgICBkeTEgPSBjeTEgLSB5MDA7CgogICAgICAvLyBQaWNrIHRoZSBjbG9zZXIgb2YgdGhlIHR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLgogICAgICAvLyBUT0RPIElzIHRoZXJlIGEgZmFzdGVyIHdheSB0byBkZXRlcm1pbmUgd2hpY2ggaW50ZXJzZWN0aW9uIHRvIHVzZT8KICAgICAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7CgogICAgICByZXR1cm4gewogICAgICAgIGN4OiBjeDAsCiAgICAgICAgY3k6IGN5MCwKICAgICAgICB4MDE6IC1veCwKICAgICAgICB5MDE6IC1veSwKICAgICAgICB4MTE6IGN4MCAqIChyMSAvIHIgLSAxKSwKICAgICAgICB5MTE6IGN5MCAqIChyMSAvIHIgLSAxKQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFyYygpIHsKICAgICAgdmFyIGlubmVyUmFkaXVzID0gYXJjSW5uZXJSYWRpdXMsCiAgICAgICAgICBvdXRlclJhZGl1cyA9IGFyY091dGVyUmFkaXVzLAogICAgICAgICAgY29ybmVyUmFkaXVzID0gY29uc3RhbnQkYigwKSwKICAgICAgICAgIHBhZFJhZGl1cyA9IG51bGwsCiAgICAgICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSwKICAgICAgICAgIGVuZEFuZ2xlID0gYXJjRW5kQW5nbGUsCiAgICAgICAgICBwYWRBbmdsZSA9IGFyY1BhZEFuZ2xlLAogICAgICAgICAgY29udGV4dCA9IG51bGw7CgogICAgICBmdW5jdGlvbiBhcmMoKSB7CiAgICAgICAgdmFyIGJ1ZmZlciwKICAgICAgICAgICAgciwKICAgICAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGkkMywKICAgICAgICAgICAgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpJDMsCiAgICAgICAgICAgIGRhID0gYWJzJDEoYTEgLSBhMCksCiAgICAgICAgICAgIGN3ID0gYTEgPiBhMDsKCiAgICAgICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCgpOwoKICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgb3V0ZXIgcmFkaXVzIGlzIGFsd2F5cyBsYXJnZXIgdGhhbiB0aGUgaW5uZXIgcmFkaXVzLgogICAgICAgIGlmIChyMSA8IHIwKSByID0gcjEsIHIxID0gcjAsIHIwID0gcjsKCiAgICAgICAgLy8gSXMgaXQgYSBwb2ludD8KICAgICAgICBpZiAoIShyMSA+IGVwc2lsb24kMykpIGNvbnRleHQubW92ZVRvKDAsIDApOwoKICAgICAgICAvLyBPciBpcyBpdCBhIGNpcmNsZSBvciBhbm51bHVzPwogICAgICAgIGVsc2UgaWYgKGRhID4gdGF1JDQgLSBlcHNpbG9uJDMpIHsKICAgICAgICAgIGNvbnRleHQubW92ZVRvKHIxICogY29zJDIoYTApLCByMSAqIHNpbiQyKGEwKSk7CiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByMSwgYTAsIGExLCAhY3cpOwogICAgICAgICAgaWYgKHIwID4gZXBzaWxvbiQzKSB7CiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHIwICogY29zJDIoYTEpLCByMCAqIHNpbiQyKGExKSk7CiAgICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMSwgYTAsIGN3KTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9yIGlzIGl0IGEgY2lyY3VsYXIgb3IgYW5udWxhciBzZWN0b3I/CiAgICAgICAgZWxzZSB7CiAgICAgICAgICB2YXIgYTAxID0gYTAsCiAgICAgICAgICAgICAgYTExID0gYTEsCiAgICAgICAgICAgICAgYTAwID0gYTAsCiAgICAgICAgICAgICAgYTEwID0gYTEsCiAgICAgICAgICAgICAgZGEwID0gZGEsCiAgICAgICAgICAgICAgZGExID0gZGEsCiAgICAgICAgICAgICAgYXAgPSBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC8gMiwKICAgICAgICAgICAgICBycCA9IChhcCA+IGVwc2lsb24kMykgJiYgKHBhZFJhZGl1cyA/ICtwYWRSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHNxcnQkMihyMCAqIHIwICsgcjEgKiByMSkpLAogICAgICAgICAgICAgIHJjID0gbWluJDEoYWJzJDEocjEgLSByMCkgLyAyLCArY29ybmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpLAogICAgICAgICAgICAgIHJjMCA9IHJjLAogICAgICAgICAgICAgIHJjMSA9IHJjLAogICAgICAgICAgICAgIHQwLAogICAgICAgICAgICAgIHQxOwoKICAgICAgICAgIC8vIEFwcGx5IHBhZGRpbmc/IE5vdGUgdGhhdCBzaW5jZSByMSDiiaUgcjAsIGRhMSDiiaUgZGEwLgogICAgICAgICAgaWYgKHJwID4gZXBzaWxvbiQzKSB7CiAgICAgICAgICAgIHZhciBwMCA9IGFzaW4kMShycCAvIHIwICogc2luJDIoYXApKSwKICAgICAgICAgICAgICAgIHAxID0gYXNpbiQxKHJwIC8gcjEgKiBzaW4kMihhcCkpOwogICAgICAgICAgICBpZiAoKGRhMCAtPSBwMCAqIDIpID4gZXBzaWxvbiQzKSBwMCAqPSAoY3cgPyAxIDogLTEpLCBhMDAgKz0gcDAsIGExMCAtPSBwMDsKICAgICAgICAgICAgZWxzZSBkYTAgPSAwLCBhMDAgPSBhMTAgPSAoYTAgKyBhMSkgLyAyOwogICAgICAgICAgICBpZiAoKGRhMSAtPSBwMSAqIDIpID4gZXBzaWxvbiQzKSBwMSAqPSAoY3cgPyAxIDogLTEpLCBhMDEgKz0gcDEsIGExMSAtPSBwMTsKICAgICAgICAgICAgZWxzZSBkYTEgPSAwLCBhMDEgPSBhMTEgPSAoYTAgKyBhMSkgLyAyOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciB4MDEgPSByMSAqIGNvcyQyKGEwMSksCiAgICAgICAgICAgICAgeTAxID0gcjEgKiBzaW4kMihhMDEpLAogICAgICAgICAgICAgIHgxMCA9IHIwICogY29zJDIoYTEwKSwKICAgICAgICAgICAgICB5MTAgPSByMCAqIHNpbiQyKGExMCk7CgogICAgICAgICAgLy8gQXBwbHkgcm91bmRlZCBjb3JuZXJzPwogICAgICAgICAgaWYgKHJjID4gZXBzaWxvbiQzKSB7CiAgICAgICAgICAgIHZhciB4MTEgPSByMSAqIGNvcyQyKGExMSksCiAgICAgICAgICAgICAgICB5MTEgPSByMSAqIHNpbiQyKGExMSksCiAgICAgICAgICAgICAgICB4MDAgPSByMCAqIGNvcyQyKGEwMCksCiAgICAgICAgICAgICAgICB5MDAgPSByMCAqIHNpbiQyKGEwMCksCiAgICAgICAgICAgICAgICBvYzsKCiAgICAgICAgICAgIC8vIFJlc3RyaWN0IHRoZSBjb3JuZXIgcmFkaXVzIGFjY29yZGluZyB0byB0aGUgc2VjdG9yIGFuZ2xlLgogICAgICAgICAgICBpZiAoZGEgPCBwaSQ0ICYmIChvYyA9IGludGVyc2VjdCh4MDEsIHkwMSwgeDAwLCB5MDAsIHgxMSwgeTExLCB4MTAsIHkxMCkpKSB7CiAgICAgICAgICAgICAgdmFyIGF4ID0geDAxIC0gb2NbMF0sCiAgICAgICAgICAgICAgICAgIGF5ID0geTAxIC0gb2NbMV0sCiAgICAgICAgICAgICAgICAgIGJ4ID0geDExIC0gb2NbMF0sCiAgICAgICAgICAgICAgICAgIGJ5ID0geTExIC0gb2NbMV0sCiAgICAgICAgICAgICAgICAgIGtjID0gMSAvIHNpbiQyKGFjb3MkMSgoYXggKiBieCArIGF5ICogYnkpIC8gKHNxcnQkMihheCAqIGF4ICsgYXkgKiBheSkgKiBzcXJ0JDIoYnggKiBieCArIGJ5ICogYnkpKSkgLyAyKSwKICAgICAgICAgICAgICAgICAgbGMgPSBzcXJ0JDIob2NbMF0gKiBvY1swXSArIG9jWzFdICogb2NbMV0pOwogICAgICAgICAgICAgIHJjMCA9IG1pbiQxKHJjLCAocjAgLSBsYykgLyAoa2MgLSAxKSk7CiAgICAgICAgICAgICAgcmMxID0gbWluJDEocmMsIChyMSAtIGxjKSAvIChrYyArIDEpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIElzIHRoZSBzZWN0b3IgY29sbGFwc2VkIHRvIGEgbGluZT8KICAgICAgICAgIGlmICghKGRhMSA+IGVwc2lsb24kMykpIGNvbnRleHQubW92ZVRvKHgwMSwgeTAxKTsKCiAgICAgICAgICAvLyBEb2VzIHRoZSBzZWN0b3LigJlzIG91dGVyIHJpbmcgaGF2ZSByb3VuZGVkIGNvcm5lcnM/CiAgICAgICAgICBlbHNlIGlmIChyYzEgPiBlcHNpbG9uJDMpIHsKICAgICAgICAgICAgdDAgPSBjb3JuZXJUYW5nZW50cyh4MDAsIHkwMCwgeDAxLCB5MDEsIHIxLCByYzEsIGN3KTsKICAgICAgICAgICAgdDEgPSBjb3JuZXJUYW5nZW50cyh4MTEsIHkxMSwgeDEwLCB5MTAsIHIxLCByYzEsIGN3KTsKCiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7CgogICAgICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8KICAgICAgICAgICAgaWYgKHJjMSA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIkMSh0MC55MDEsIHQwLngwMSksIGF0YW4yJDEodDEueTAxLCB0MS54MDEpLCAhY3cpOwoKICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMiQxKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIkMSh0MC55MTEsIHQwLngxMSksICFjdyk7CiAgICAgICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGF0YW4yJDEodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIkMSh0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCAhY3cpOwogICAgICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBhdGFuMiQxKHQxLnkxMSwgdDEueDExKSwgYXRhbjIkMSh0MS55MDEsIHQxLngwMSksICFjdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjPwogICAgICAgICAgZWxzZSBjb250ZXh0Lm1vdmVUbyh4MDEsIHkwMSksIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhMDEsIGExMSwgIWN3KTsKCiAgICAgICAgICAvLyBJcyB0aGVyZSBubyBpbm5lciByaW5nLCBhbmQgaXTigJlzIGEgY2lyY3VsYXIgc2VjdG9yPwogICAgICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nPwogICAgICAgICAgaWYgKCEocjAgPiBlcHNpbG9uJDMpIHx8ICEoZGEwID4gZXBzaWxvbiQzKSkgY29udGV4dC5saW5lVG8oeDEwLCB5MTApOwoKICAgICAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgaW5uZXIgcmluZyAob3IgcG9pbnQpIGhhdmUgcm91bmRlZCBjb3JuZXJzPwogICAgICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbiQzKSB7CiAgICAgICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMoeDEwLCB5MTAsIHgxMSwgeTExLCByMCwgLXJjMCwgY3cpOwogICAgICAgICAgICB0MSA9IGNvcm5lclRhbmdlbnRzKHgwMSwgeTAxLCB4MDAsIHkwMCwgcjAsIC1yYzAsIGN3KTsKCiAgICAgICAgICAgIGNvbnRleHQubGluZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7CgogICAgICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8KICAgICAgICAgICAgaWYgKHJjMCA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIkMSh0MC55MDEsIHQwLngwMSksIGF0YW4yJDEodDEueTAxLCB0MS54MDEpLCAhY3cpOwoKICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMwLCBhdGFuMiQxKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIkMSh0MC55MTEsIHQwLngxMSksICFjdyk7CiAgICAgICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjAsIGF0YW4yJDEodDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIkMSh0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCBjdyk7CiAgICAgICAgICAgICAgY29udGV4dC5hcmModDEuY3gsIHQxLmN5LCByYzAsIGF0YW4yJDEodDEueTExLCB0MS54MTEpLCBhdGFuMiQxKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIC8vIE9yIGlzIHRoZSBpbm5lciByaW5nIGp1c3QgYSBjaXJjdWxhciBhcmM/CiAgICAgICAgICBlbHNlIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhMTAsIGEwMCwgY3cpOwogICAgICAgIH0KCiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKCiAgICAgICAgaWYgKGJ1ZmZlcikgcmV0dXJuIGNvbnRleHQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOwogICAgICB9CgogICAgICBhcmMuY2VudHJvaWQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgciA9ICgraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtvdXRlclJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIsCiAgICAgICAgICAgIGEgPSAoK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSArICtlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSAvIDIgLSBwaSQ0IC8gMjsKICAgICAgICByZXR1cm4gW2NvcyQyKGEpICogciwgc2luJDIoYSkgKiByXTsKICAgICAgfTsKCiAgICAgIGFyYy5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbm5lclJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogaW5uZXJSYWRpdXM7CiAgICAgIH07CgogICAgICBhcmMub3V0ZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3V0ZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgYXJjKSA6IG91dGVyUmFkaXVzOwogICAgICB9OwoKICAgICAgYXJjLmNvcm5lclJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb3JuZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgYXJjKSA6IGNvcm5lclJhZGl1czsKICAgICAgfTsKCiAgICAgIGFyYy5wYWRSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkUmFkaXVzID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogcGFkUmFkaXVzOwogICAgICB9OwoKICAgICAgYXJjLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogc3RhcnRBbmdsZTsKICAgICAgfTsKCiAgICAgIGFyYy5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbmRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmMpIDogZW5kQW5nbGU7CiAgICAgIH07CgogICAgICBhcmMucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgYXJjKSA6IHBhZEFuZ2xlOwogICAgICB9OwoKICAgICAgYXJjLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGFyYykgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIGFyYzsKICAgIH0KCiAgICBmdW5jdGlvbiBMaW5lYXIoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBMaW5lYXIucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOyBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY3VydmVMaW5lYXIoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IExpbmVhcihjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB4JDMocCkgewogICAgICByZXR1cm4gcFswXTsKICAgIH0KCiAgICBmdW5jdGlvbiB5JDMocCkgewogICAgICByZXR1cm4gcFsxXTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lKCkgewogICAgICB2YXIgeCA9IHgkMywKICAgICAgICAgIHkgPSB5JDMsCiAgICAgICAgICBkZWZpbmVkID0gY29uc3RhbnQkYih0cnVlKSwKICAgICAgICAgIGNvbnRleHQgPSBudWxsLAogICAgICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhciwKICAgICAgICAgIG91dHB1dCA9IG51bGw7CgogICAgICBmdW5jdGlvbiBsaW5lKGRhdGEpIHsKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICBkLAogICAgICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLAogICAgICAgICAgICBidWZmZXI7CgogICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIG91dHB1dCA9IGN1cnZlKGJ1ZmZlciA9IHBhdGgoKSk7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7CiAgICAgICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreChkLCBpLCBkYXRhKSwgK3koZCwgaSwgZGF0YSkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmUpIDogeDsKICAgICAgfTsKCiAgICAgIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmUpIDogeTsKICAgICAgfTsKCiAgICAgIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYighIV8pLCBsaW5lKSA6IGRlZmluZWQ7CiAgICAgIH07CgogICAgICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGxpbmUpIDogY3VydmU7CiAgICAgIH07CgogICAgICBsaW5lLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGxpbmUpIDogY29udGV4dDsKICAgICAgfTsKCiAgICAgIHJldHVybiBsaW5lOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWEkMygpIHsKICAgICAgdmFyIHgwID0geCQzLAogICAgICAgICAgeDEgPSBudWxsLAogICAgICAgICAgeTAgPSBjb25zdGFudCRiKDApLAogICAgICAgICAgeTEgPSB5JDMsCiAgICAgICAgICBkZWZpbmVkID0gY29uc3RhbnQkYih0cnVlKSwKICAgICAgICAgIGNvbnRleHQgPSBudWxsLAogICAgICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhciwKICAgICAgICAgIG91dHB1dCA9IG51bGw7CgogICAgICBmdW5jdGlvbiBhcmVhKGRhdGEpIHsKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgaiwKICAgICAgICAgICAgaywKICAgICAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICBkLAogICAgICAgICAgICBkZWZpbmVkMCA9IGZhbHNlLAogICAgICAgICAgICBidWZmZXIsCiAgICAgICAgICAgIHgweiA9IG5ldyBBcnJheShuKSwKICAgICAgICAgICAgeTB6ID0gbmV3IEFycmF5KG4pOwoKICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkgewogICAgICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkgewogICAgICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIHsKICAgICAgICAgICAgICBqID0gaTsKICAgICAgICAgICAgICBvdXRwdXQuYXJlYVN0YXJ0KCk7CiAgICAgICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7CiAgICAgICAgICAgICAgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIGZvciAoayA9IGkgLSAxOyBrID49IGo7IC0taykgewogICAgICAgICAgICAgICAgb3V0cHV0LnBvaW50KHgweltrXSwgeTB6W2tdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgb3V0cHV0LmxpbmVFbmQoKTsKICAgICAgICAgICAgICBvdXRwdXQuYXJlYUVuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVmaW5lZDApIHsKICAgICAgICAgICAgeDB6W2ldID0gK3gwKGQsIGksIGRhdGEpLCB5MHpbaV0gPSAreTAoZCwgaSwgZGF0YSk7CiAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MSA/ICt4MShkLCBpLCBkYXRhKSA6IHgweltpXSwgeTEgPyAreTEoZCwgaSwgZGF0YSkgOiB5MHpbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFyZWFsaW5lKCkgewogICAgICAgIHJldHVybiBsaW5lKCkuZGVmaW5lZChkZWZpbmVkKS5jdXJ2ZShjdXJ2ZSkuY29udGV4dChjb250ZXh0KTsKICAgICAgfQoKICAgICAgYXJlYS54ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIHgxID0gbnVsbCwgYXJlYSkgOiB4MDsKICAgICAgfTsKCiAgICAgIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgYXJlYSkgOiB4MDsKICAgICAgfTsKCiAgICAgIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGFyZWEpIDogeDE7CiAgICAgIH07CgogICAgICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgeTEgPSBudWxsLCBhcmVhKSA6IHkwOwogICAgICB9OwoKICAgICAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBhcmVhKSA6IHkwOwogICAgICB9OwoKICAgICAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MSA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgYXJlYSkgOiB5MTsKICAgICAgfTsKCiAgICAgIGFyZWEubGluZVgwID0KICAgICAgYXJlYS5saW5lWTAgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkwKTsKICAgICAgfTsKCiAgICAgIGFyZWEubGluZVkxID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MSk7CiAgICAgIH07CgogICAgICBhcmVhLmxpbmVYMSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBhcmVhbGluZSgpLngoeDEpLnkoeTApOwogICAgICB9OwoKICAgICAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCEhXyksIGFyZWEpIDogZGVmaW5lZDsKICAgICAgfTsKCiAgICAgIGFyZWEuY3VydmUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgYXJlYSkgOiBjdXJ2ZTsKICAgICAgfTsKCiAgICAgIGFyZWEuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgYXJlYSkgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzY2VuZGluZyQxKGEsIGIpIHsKICAgICAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JDgoZCkgewogICAgICByZXR1cm4gZDsKICAgIH0KCiAgICBmdW5jdGlvbiBwaWUoKSB7CiAgICAgIHZhciB2YWx1ZSA9IGlkZW50aXR5JDgsCiAgICAgICAgICBzb3J0VmFsdWVzID0gZGVzY2VuZGluZyQxLAogICAgICAgICAgc29ydCA9IG51bGwsCiAgICAgICAgICBzdGFydEFuZ2xlID0gY29uc3RhbnQkYigwKSwKICAgICAgICAgIGVuZEFuZ2xlID0gY29uc3RhbnQkYih0YXUkNCksCiAgICAgICAgICBwYWRBbmdsZSA9IGNvbnN0YW50JGIoMCk7CgogICAgICBmdW5jdGlvbiBwaWUoZGF0YSkgewogICAgICAgIHZhciBpLAogICAgICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIGosCiAgICAgICAgICAgIGssCiAgICAgICAgICAgIHN1bSA9IDAsCiAgICAgICAgICAgIGluZGV4ID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICBhcmNzID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICBhMCA9ICtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIGRhID0gTWF0aC5taW4odGF1JDQsIE1hdGgubWF4KC10YXUkNCwgZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSAtIGEwKSksCiAgICAgICAgICAgIGExLAogICAgICAgICAgICBwID0gTWF0aC5taW4oTWF0aC5hYnMoZGEpIC8gbiwgcGFkQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSksCiAgICAgICAgICAgIHBhID0gcCAqIChkYSA8IDAgPyAtMSA6IDEpLAogICAgICAgICAgICB2OwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHYgPSBhcmNzW2luZGV4W2ldID0gaV0gPSArdmFsdWUoZGF0YVtpXSwgaSwgZGF0YSkpID4gMCkgewogICAgICAgICAgICBzdW0gKz0gdjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIE9wdGlvbmFsbHkgc29ydCB0aGUgYXJjcyBieSBwcmV2aW91c2x5LWNvbXB1dGVkIHZhbHVlcyBvciBieSBkYXRhLgogICAgICAgIGlmIChzb3J0VmFsdWVzICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydFZhbHVlcyhhcmNzW2ldLCBhcmNzW2pdKTsgfSk7CiAgICAgICAgZWxzZSBpZiAoc29ydCAhPSBudWxsKSBpbmRleC5zb3J0KGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIHNvcnQoZGF0YVtpXSwgZGF0YVtqXSk7IH0pOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBhcmNzISBUaGV5IGFyZSBzdG9yZWQgaW4gdGhlIG9yaWdpbmFsIGRhdGEncyBvcmRlci4KICAgICAgICBmb3IgKGkgPSAwLCBrID0gc3VtID8gKGRhIC0gbiAqIHBhKSAvIHN1bSA6IDA7IGkgPCBuOyArK2ksIGEwID0gYTEpIHsKICAgICAgICAgIGogPSBpbmRleFtpXSwgdiA9IGFyY3Nbal0sIGExID0gYTAgKyAodiA+IDAgPyB2ICogayA6IDApICsgcGEsIGFyY3Nbal0gPSB7CiAgICAgICAgICAgIGRhdGE6IGRhdGFbal0sCiAgICAgICAgICAgIGluZGV4OiBpLAogICAgICAgICAgICB2YWx1ZTogdiwKICAgICAgICAgICAgc3RhcnRBbmdsZTogYTAsCiAgICAgICAgICAgIGVuZEFuZ2xlOiBhMSwKICAgICAgICAgICAgcGFkQW5nbGU6IHAKICAgICAgICAgIH07CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJjczsKICAgICAgfQoKICAgICAgcGllLnZhbHVlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIHBpZSkgOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIHBpZS5zb3J0VmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnRWYWx1ZXMgPSBfLCBzb3J0ID0gbnVsbCwgcGllKSA6IHNvcnRWYWx1ZXM7CiAgICAgIH07CgogICAgICBwaWUuc29ydCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0ID0gXywgc29ydFZhbHVlcyA9IG51bGwsIHBpZSkgOiBzb3J0OwogICAgICB9OwoKICAgICAgcGllLnN0YXJ0QW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3RhcnRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBwaWUpIDogc3RhcnRBbmdsZTsKICAgICAgfTsKCiAgICAgIHBpZS5lbmRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChlbmRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoK18pLCBwaWUpIDogZW5kQW5nbGU7CiAgICAgIH07CgogICAgICBwaWUucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgcGllKSA6IHBhZEFuZ2xlOwogICAgICB9OwoKICAgICAgcmV0dXJuIHBpZTsKICAgIH0KCiAgICB2YXIgY3VydmVSYWRpYWxMaW5lYXIgPSBjdXJ2ZVJhZGlhbChjdXJ2ZUxpbmVhcik7CgogICAgZnVuY3Rpb24gUmFkaWFsKGN1cnZlKSB7CiAgICAgIHRoaXMuX2N1cnZlID0gY3VydmU7CiAgICB9CgogICAgUmFkaWFsLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKTsKICAgICAgfSwKICAgICAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fY3VydmUuYXJlYUVuZCgpOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2N1cnZlLmxpbmVTdGFydCgpOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9jdXJ2ZS5saW5lRW5kKCk7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbihhLCByKSB7CiAgICAgICAgdGhpcy5fY3VydmUucG9pbnQociAqIE1hdGguc2luKGEpLCByICogLU1hdGguY29zKGEpKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjdXJ2ZVJhZGlhbChjdXJ2ZSkgewoKICAgICAgZnVuY3Rpb24gcmFkaWFsKGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gbmV3IFJhZGlhbChjdXJ2ZShjb250ZXh0KSk7CiAgICAgIH0KCiAgICAgIHJhZGlhbC5fY3VydmUgPSBjdXJ2ZTsKCiAgICAgIHJldHVybiByYWRpYWw7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZVJhZGlhbChsKSB7CiAgICAgIHZhciBjID0gbC5jdXJ2ZTsKCiAgICAgIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7CiAgICAgIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwoKICAgICAgbC5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGMoY3VydmVSYWRpYWwoXykpIDogYygpLl9jdXJ2ZTsKICAgICAgfTsKCiAgICAgIHJldHVybiBsOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVSYWRpYWwkMSgpIHsKICAgICAgcmV0dXJuIGxpbmVSYWRpYWwobGluZSgpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyKSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJlYVJhZGlhbCgpIHsKICAgICAgdmFyIGEgPSBhcmVhJDMoKS5jdXJ2ZShjdXJ2ZVJhZGlhbExpbmVhciksCiAgICAgICAgICBjID0gYS5jdXJ2ZSwKICAgICAgICAgIHgwID0gYS5saW5lWDAsCiAgICAgICAgICB4MSA9IGEubGluZVgxLAogICAgICAgICAgeTAgPSBhLmxpbmVZMCwKICAgICAgICAgIHkxID0gYS5saW5lWTE7CgogICAgICBhLmFuZ2xlID0gYS54LCBkZWxldGUgYS54OwogICAgICBhLnN0YXJ0QW5nbGUgPSBhLngwLCBkZWxldGUgYS54MDsKICAgICAgYS5lbmRBbmdsZSA9IGEueDEsIGRlbGV0ZSBhLngxOwogICAgICBhLnJhZGl1cyA9IGEueSwgZGVsZXRlIGEueTsKICAgICAgYS5pbm5lclJhZGl1cyA9IGEueTAsIGRlbGV0ZSBhLnkwOwogICAgICBhLm91dGVyUmFkaXVzID0gYS55MSwgZGVsZXRlIGEueTE7CiAgICAgIGEubGluZVN0YXJ0QW5nbGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwoeDAoKSk7IH0sIGRlbGV0ZSBhLmxpbmVYMDsKICAgICAgYS5saW5lRW5kQW5nbGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwoeDEoKSk7IH0sIGRlbGV0ZSBhLmxpbmVYMTsKICAgICAgYS5saW5lSW5uZXJSYWRpdXMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwoeTAoKSk7IH0sIGRlbGV0ZSBhLmxpbmVZMDsKICAgICAgYS5saW5lT3V0ZXJSYWRpdXMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwoeTEoKSk7IH0sIGRlbGV0ZSBhLmxpbmVZMTsKCiAgICAgIGEuY3VydmUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyBjKGN1cnZlUmFkaWFsKF8pKSA6IGMoKS5fY3VydmU7CiAgICAgIH07CgogICAgICByZXR1cm4gYTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2ludFJhZGlhbCh4LCB5KSB7CiAgICAgIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTsKICAgIH0KCiAgICB2YXIgc2xpY2UkNiA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCiAgICBmdW5jdGlvbiBsaW5rU291cmNlKGQpIHsKICAgICAgcmV0dXJuIGQuc291cmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmtUYXJnZXQoZCkgewogICAgICByZXR1cm4gZC50YXJnZXQ7CiAgICB9CgogICAgZnVuY3Rpb24gbGluayQyKGN1cnZlKSB7CiAgICAgIHZhciBzb3VyY2UgPSBsaW5rU291cmNlLAogICAgICAgICAgdGFyZ2V0ID0gbGlua1RhcmdldCwKICAgICAgICAgIHggPSB4JDMsCiAgICAgICAgICB5ID0geSQzLAogICAgICAgICAgY29udGV4dCA9IG51bGw7CgogICAgICBmdW5jdGlvbiBsaW5rKCkgewogICAgICAgIHZhciBidWZmZXIsIGFyZ3YgPSBzbGljZSQ2LmNhbGwoYXJndW1lbnRzKSwgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KTsKICAgICAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoKCk7CiAgICAgICAgY3VydmUoY29udGV4dCwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSBzLCBhcmd2KSksICt5LmFwcGx5KHRoaXMsIGFyZ3YpLCAreC5hcHBseSh0aGlzLCAoYXJndlswXSA9IHQsIGFyZ3YpKSwgK3kuYXBwbHkodGhpcywgYXJndikpOwogICAgICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICAgICAgfQoKICAgICAgbGluay5zb3VyY2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc291cmNlID0gXywgbGluaykgOiBzb3VyY2U7CiAgICAgIH07CgogICAgICBsaW5rLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCBsaW5rKSA6IHRhcmdldDsKICAgICAgfTsKCiAgICAgIGxpbmsueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmspIDogeDsKICAgICAgfTsKCiAgICAgIGxpbmsueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIGxpbmspIDogeTsKICAgICAgfTsKCiAgICAgIGxpbmsuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoY29udGV4dCA9IF8gPT0gbnVsbCA/IG51bGwgOiBfKSwgbGluaykgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIGxpbms7CiAgICB9CgogICAgZnVuY3Rpb24gY3VydmVIb3Jpem9udGFsKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7CiAgICAgIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3VydmVWZXJ0aWNhbChjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApOwogICAgICBjb250ZXh0LmJlemllckN1cnZlVG8oeDAsIHkwID0gKHkwICsgeTEpIC8gMiwgeDEsIHkwLCB4MSwgeTEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1cnZlUmFkaWFsJDEoY29udGV4dCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdmFyIHAwID0gcG9pbnRSYWRpYWwoeDAsIHkwKSwKICAgICAgICAgIHAxID0gcG9pbnRSYWRpYWwoeDAsIHkwID0gKHkwICsgeTEpIC8gMiksCiAgICAgICAgICBwMiA9IHBvaW50UmFkaWFsKHgxLCB5MCksCiAgICAgICAgICBwMyA9IHBvaW50UmFkaWFsKHgxLCB5MSk7CiAgICAgIGNvbnRleHQubW92ZVRvKHAwWzBdLCBwMFsxXSk7CiAgICAgIGNvbnRleHQuYmV6aWVyQ3VydmVUbyhwMVswXSwgcDFbMV0sIHAyWzBdLCBwMlsxXSwgcDNbMF0sIHAzWzFdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5rSG9yaXpvbnRhbCgpIHsKICAgICAgcmV0dXJuIGxpbmskMihjdXJ2ZUhvcml6b250YWwpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmtWZXJ0aWNhbCgpIHsKICAgICAgcmV0dXJuIGxpbmskMihjdXJ2ZVZlcnRpY2FsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5rUmFkaWFsKCkgewogICAgICB2YXIgbCA9IGxpbmskMihjdXJ2ZVJhZGlhbCQxKTsKICAgICAgbC5hbmdsZSA9IGwueCwgZGVsZXRlIGwueDsKICAgICAgbC5yYWRpdXMgPSBsLnksIGRlbGV0ZSBsLnk7CiAgICAgIHJldHVybiBsOwogICAgfQoKICAgIHZhciBjaXJjbGUkMiA9IHsKICAgICAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyBwaSQ0KTsKICAgICAgICBjb250ZXh0Lm1vdmVUbyhyLCAwKTsKICAgICAgICBjb250ZXh0LmFyYygwLCAwLCByLCAwLCB0YXUkNCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGNyb3NzJDIgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gNSkgLyAyOwogICAgICAgIGNvbnRleHQubW92ZVRvKC0zICogciwgLXIpOwogICAgICAgIGNvbnRleHQubGluZVRvKC1yLCAtcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oLXIsIC0zICogcik7CiAgICAgICAgY29udGV4dC5saW5lVG8ociwgLTMgKiByKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhyLCAtcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oMyAqIHIsIC1yKTsKICAgICAgICBjb250ZXh0LmxpbmVUbygzICogciwgcik7CiAgICAgICAgY29udGV4dC5saW5lVG8ociwgcik7CiAgICAgICAgY29udGV4dC5saW5lVG8ociwgMyAqIHIpOwogICAgICAgIGNvbnRleHQubGluZVRvKC1yLCAzICogcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oLXIsIHIpOwogICAgICAgIGNvbnRleHQubGluZVRvKC0zICogciwgcik7CiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgdGFuMzAgPSBNYXRoLnNxcnQoMSAvIDMpLAogICAgICAgIHRhbjMwXzIgPSB0YW4zMCAqIDI7CgogICAgdmFyIGRpYW1vbmQgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgeSA9IE1hdGguc3FydChzaXplIC8gdGFuMzBfMiksCiAgICAgICAgICAgIHggPSB5ICogdGFuMzA7CiAgICAgICAgY29udGV4dC5tb3ZlVG8oMCwgLXkpOwogICAgICAgIGNvbnRleHQubGluZVRvKHgsIDApOwogICAgICAgIGNvbnRleHQubGluZVRvKDAsIHkpOwogICAgICAgIGNvbnRleHQubGluZVRvKC14LCAwKTsKICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBrYSA9IDAuODkwODEzMDkxNTI5Mjg1MjI4MTAsCiAgICAgICAga3IgPSBNYXRoLnNpbihwaSQ0IC8gMTApIC8gTWF0aC5zaW4oNyAqIHBpJDQgLyAxMCksCiAgICAgICAga3ggPSBNYXRoLnNpbih0YXUkNCAvIDEwKSAqIGtyLAogICAgICAgIGt5ID0gLU1hdGguY29zKHRhdSQ0IC8gMTApICoga3I7CgogICAgdmFyIHN0YXIgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgciA9IE1hdGguc3FydChzaXplICoga2EpLAogICAgICAgICAgICB4ID0ga3ggKiByLAogICAgICAgICAgICB5ID0ga3kgKiByOwogICAgICAgIGNvbnRleHQubW92ZVRvKDAsIC1yKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IDU7ICsraSkgewogICAgICAgICAgdmFyIGEgPSB0YXUkNCAqIGkgLyA1LAogICAgICAgICAgICAgIGMgPSBNYXRoLmNvcyhhKSwKICAgICAgICAgICAgICBzID0gTWF0aC5zaW4oYSk7CiAgICAgICAgICBjb250ZXh0LmxpbmVUbyhzICogciwgLWMgKiByKTsKICAgICAgICAgIGNvbnRleHQubGluZVRvKGMgKiB4IC0gcyAqIHksIHMgKiB4ICsgYyAqIHkpOwogICAgICAgIH0KICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBzcXVhcmUgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgdyA9IE1hdGguc3FydChzaXplKSwKICAgICAgICAgICAgeCA9IC13IC8gMjsKICAgICAgICBjb250ZXh0LnJlY3QoeCwgeCwgdywgdyk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHNxcnQzID0gTWF0aC5zcXJ0KDMpOwoKICAgIHZhciB0cmlhbmdsZSA9IHsKICAgICAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgICAgIHZhciB5ID0gLU1hdGguc3FydChzaXplIC8gKHNxcnQzICogMykpOwogICAgICAgIGNvbnRleHQubW92ZVRvKDAsIHkgKiAyKTsKICAgICAgICBjb250ZXh0LmxpbmVUbygtc3FydDMgKiB5LCAteSk7CiAgICAgICAgY29udGV4dC5saW5lVG8oc3FydDMgKiB5LCAteSk7CiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgYyQyID0gLTAuNSwKICAgICAgICBzID0gTWF0aC5zcXJ0KDMpIC8gMiwKICAgICAgICBrID0gMSAvIE1hdGguc3FydCgxMiksCiAgICAgICAgYSA9IChrIC8gMiArIDEpICogMzsKCiAgICB2YXIgd3llID0gewogICAgICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIGEpLAogICAgICAgICAgICB4MCA9IHIgLyAyLAogICAgICAgICAgICB5MCA9IHIgKiBrLAogICAgICAgICAgICB4MSA9IHgwLAogICAgICAgICAgICB5MSA9IHIgKiBrICsgciwKICAgICAgICAgICAgeDIgPSAteDEsCiAgICAgICAgICAgIHkyID0geTE7CiAgICAgICAgY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyh4MSwgeTEpOwogICAgICAgIGNvbnRleHQubGluZVRvKHgyLCB5Mik7CiAgICAgICAgY29udGV4dC5saW5lVG8oYyQyICogeDAgLSBzICogeTAsIHMgKiB4MCArIGMkMiAqIHkwKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDIgKiB4MSAtIHMgKiB5MSwgcyAqIHgxICsgYyQyICogeTEpOwogICAgICAgIGNvbnRleHQubGluZVRvKGMkMiAqIHgyIC0gcyAqIHkyLCBzICogeDIgKyBjJDIgKiB5Mik7CiAgICAgICAgY29udGV4dC5saW5lVG8oYyQyICogeDAgKyBzICogeTAsIGMkMiAqIHkwIC0gcyAqIHgwKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDIgKiB4MSArIHMgKiB5MSwgYyQyICogeTEgLSBzICogeDEpOwogICAgICAgIGNvbnRleHQubGluZVRvKGMkMiAqIHgyICsgcyAqIHkyLCBjJDIgKiB5MiAtIHMgKiB4Mik7CiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgc3ltYm9scyA9IFsKICAgICAgY2lyY2xlJDIsCiAgICAgIGNyb3NzJDIsCiAgICAgIGRpYW1vbmQsCiAgICAgIHNxdWFyZSwKICAgICAgc3RhciwKICAgICAgdHJpYW5nbGUsCiAgICAgIHd5ZQogICAgXTsKCiAgICBmdW5jdGlvbiBzeW1ib2woKSB7CiAgICAgIHZhciB0eXBlID0gY29uc3RhbnQkYihjaXJjbGUkMiksCiAgICAgICAgICBzaXplID0gY29uc3RhbnQkYig2NCksCiAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIHN5bWJvbCgpIHsKICAgICAgICB2YXIgYnVmZmVyOwogICAgICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgoKTsKICAgICAgICB0eXBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykuZHJhdyhjb250ZXh0LCArc2l6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKF8pLCBzeW1ib2wpIDogdHlwZTsKICAgICAgfTsKCiAgICAgIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKCtfKSwgc3ltYm9sKSA6IHNpemU7CiAgICAgIH07CgogICAgICBzeW1ib2wuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8sIHN5bWJvbCkgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIHN5bWJvbDsKICAgIH0KCiAgICBmdW5jdGlvbiBub29wJDMoKSB7fQoKICAgIGZ1bmN0aW9uIHBvaW50JDIodGhhdCwgeCwgeSkgewogICAgICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oCiAgICAgICAgKDIgKiB0aGF0Ll94MCArIHRoYXQuX3gxKSAvIDMsCiAgICAgICAgKDIgKiB0aGF0Ll95MCArIHRoYXQuX3kxKSAvIDMsCiAgICAgICAgKHRoYXQuX3gwICsgMiAqIHRoYXQuX3gxKSAvIDMsCiAgICAgICAgKHRoYXQuX3kwICsgMiAqIHRoYXQuX3kxKSAvIDMsCiAgICAgICAgKHRoYXQuX3gwICsgNCAqIHRoYXQuX3gxICsgeCkgLyA2LAogICAgICAgICh0aGF0Ll95MCArIDQgKiB0aGF0Ll95MSArIHkpIC8gNgogICAgICApOwogICAgfQoKICAgIGZ1bmN0aW9uIEJhc2lzKGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgQmFzaXMucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDM6IHBvaW50JDIodGhpcywgdGhpcy5feDEsIHRoaXMuX3kxKTsgLy8gcHJvY2VlZAogICAgICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2NvbnRleHQubGluZVRvKCg1ICogdGhpcy5feDAgKyB0aGlzLl94MSkgLyA2LCAoNSAqIHRoaXMuX3kwICsgdGhpcy5feTEpIC8gNik7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JDIodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5OwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGJhc2lzJDIoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IEJhc2lzKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIEJhc2lzQ2xvc2VkKGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgQmFzaXNDbG9zZWQucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IG5vb3AkMywKICAgICAgYXJlYUVuZDogbm9vcCQzLAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDI6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gyICsgMiAqIHRoaXMuX3gzKSAvIDMsICh0aGlzLl95MiArIDIgKiB0aGlzLl95MykgLyAzKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oKHRoaXMuX3gzICsgMiAqIHRoaXMuX3gyKSAvIDMsICh0aGlzLl95MyArIDIgKiB0aGlzLl95MikgLyAzKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDM6IHsKICAgICAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MiwgdGhpcy5feTIpOwogICAgICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgICAgIHRoaXMucG9pbnQodGhpcy5feDQsIHRoaXMuX3k0KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MiA9IHgsIHRoaXMuX3kyID0geTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDMgPSB4LCB0aGlzLl95MyA9IHk7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5OyB0aGlzLl9jb250ZXh0Lm1vdmVUbygodGhpcy5feDAgKyA0ICogdGhpcy5feDEgKyB4KSAvIDYsICh0aGlzLl95MCArIDQgKiB0aGlzLl95MSArIHkpIC8gNik7IGJyZWFrOwogICAgICAgICAgZGVmYXVsdDogcG9pbnQkMih0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDsKICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYmFzaXNDbG9zZWQkMShjb250ZXh0KSB7CiAgICAgIHJldHVybiBuZXcgQmFzaXNDbG9zZWQoY29udGV4dCk7CiAgICB9CgogICAgZnVuY3Rpb24gQmFzaXNPcGVuKGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgQmFzaXNPcGVuLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDMpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdmFyIHgwID0gKHRoaXMuX3gwICsgNCAqIHRoaXMuX3gxICsgeCkgLyA2LCB5MCA9ICh0aGlzLl95MCArIDQgKiB0aGlzLl95MSArIHkpIC8gNjsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgwLCB5MCkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4MCwgeTApOyBicmVhazsKICAgICAgICAgIGNhc2UgMzogdGhpcy5fcG9pbnQgPSA0OyAvLyBwcm9jZWVkCiAgICAgICAgICBkZWZhdWx0OiBwb2ludCQyKHRoaXMsIHgsIHkpOyBicmVhazsKICAgICAgICB9CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4OwogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBiYXNpc09wZW4oY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IEJhc2lzT3Blbihjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBCdW5kbGUoY29udGV4dCwgYmV0YSkgewogICAgICB0aGlzLl9iYXNpcyA9IG5ldyBCYXNpcyhjb250ZXh0KTsKICAgICAgdGhpcy5fYmV0YSA9IGJldGE7CiAgICB9CgogICAgQnVuZGxlLnByb3RvdHlwZSA9IHsKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94ID0gW107CiAgICAgICAgdGhpcy5feSA9IFtdOwogICAgICAgIHRoaXMuX2Jhc2lzLmxpbmVTdGFydCgpOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgeCA9IHRoaXMuX3gsCiAgICAgICAgICAgIHkgPSB0aGlzLl95LAogICAgICAgICAgICBqID0geC5sZW5ndGggLSAxOwoKICAgICAgICBpZiAoaiA+IDApIHsKICAgICAgICAgIHZhciB4MCA9IHhbMF0sCiAgICAgICAgICAgICAgeTAgPSB5WzBdLAogICAgICAgICAgICAgIGR4ID0geFtqXSAtIHgwLAogICAgICAgICAgICAgIGR5ID0geVtqXSAtIHkwLAogICAgICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgICAgICB0OwoKICAgICAgICAgIHdoaWxlICgrK2kgPD0gaikgewogICAgICAgICAgICB0ID0gaSAvIGo7CiAgICAgICAgICAgIHRoaXMuX2Jhc2lzLnBvaW50KAogICAgICAgICAgICAgIHRoaXMuX2JldGEgKiB4W2ldICsgKDEgLSB0aGlzLl9iZXRhKSAqICh4MCArIHQgKiBkeCksCiAgICAgICAgICAgICAgdGhpcy5fYmV0YSAqIHlbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHkwICsgdCAqIGR5KQogICAgICAgICAgICApOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsOwogICAgICAgIHRoaXMuX2Jhc2lzLmxpbmVFbmQoKTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB0aGlzLl94LnB1c2goK3gpOwogICAgICAgIHRoaXMuX3kucHVzaCgreSk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGJ1bmRsZSA9IChmdW5jdGlvbiBjdXN0b20oYmV0YSkgewoKICAgICAgZnVuY3Rpb24gYnVuZGxlKGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gYmV0YSA9PT0gMSA/IG5ldyBCYXNpcyhjb250ZXh0KSA6IG5ldyBCdW5kbGUoY29udGV4dCwgYmV0YSk7CiAgICAgIH0KCiAgICAgIGJ1bmRsZS5iZXRhID0gZnVuY3Rpb24oYmV0YSkgewogICAgICAgIHJldHVybiBjdXN0b20oK2JldGEpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGJ1bmRsZTsKICAgIH0pKDAuODUpOwoKICAgIGZ1bmN0aW9uIHBvaW50JDModGhhdCwgeCwgeSkgewogICAgICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oCiAgICAgICAgdGhhdC5feDEgKyB0aGF0Ll9rICogKHRoYXQuX3gyIC0gdGhhdC5feDApLAogICAgICAgIHRoYXQuX3kxICsgdGhhdC5fayAqICh0aGF0Ll95MiAtIHRoYXQuX3kwKSwKICAgICAgICB0aGF0Ll94MiArIHRoYXQuX2sgKiAodGhhdC5feDEgLSB4KSwKICAgICAgICB0aGF0Ll95MiArIHRoYXQuX2sgKiAodGhhdC5feTEgLSB5KSwKICAgICAgICB0aGF0Ll94MiwKICAgICAgICB0aGF0Ll95MgogICAgICApOwogICAgfQoKICAgIGZ1bmN0aW9uIENhcmRpbmFsKGNvbnRleHQsIHRlbnNpb24pIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsKICAgIH0KCiAgICBDYXJkaW5hbC5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgICAgY2FzZSAzOiBwb2ludCQzKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JDModGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXJkaW5hbCA9IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikgewoKICAgICAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgewogICAgICAgIHJldHVybiBuZXcgQ2FyZGluYWwoY29udGV4dCwgdGVuc2lvbik7CiAgICAgIH0KCiAgICAgIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7CiAgICAgIH07CgogICAgICByZXR1cm4gY2FyZGluYWw7CiAgICB9KSgwKTsKCiAgICBmdW5jdGlvbiBDYXJkaW5hbENsb3NlZChjb250ZXh0LCB0ZW5zaW9uKSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7CiAgICB9CgogICAgQ2FyZGluYWxDbG9zZWQucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IG5vb3AkMywKICAgICAgYXJlYUVuZDogbm9vcCQzLAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9IHRoaXMuX3gzID0gdGhpcy5feDQgPSB0aGlzLl94NSA9CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gdGhpcy5feTMgPSB0aGlzLl95NCA9IHRoaXMuX3k1ID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NCwgdGhpcy5feTQpOwogICAgICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g1LCB0aGlzLl95NSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDMgPSB4LCB0aGlzLl95MyA9IHk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3g0ID0geCwgdGhpcy5feTQgPSB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5feDUgPSB4LCB0aGlzLl95NSA9IHk7IGJyZWFrOwogICAgICAgICAgZGVmYXVsdDogcG9pbnQkMyh0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGNhcmRpbmFsQ2xvc2VkID0gKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7CgogICAgICBmdW5jdGlvbiBjYXJkaW5hbChjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBDYXJkaW5hbENsb3NlZChjb250ZXh0LCB0ZW5zaW9uKTsKICAgICAgfQoKICAgICAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBjYXJkaW5hbDsKICAgIH0pKDApOwoKICAgIGZ1bmN0aW9uIENhcmRpbmFsT3Blbihjb250ZXh0LCB0ZW5zaW9uKSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7CiAgICB9CgogICAgQ2FyZGluYWxPcGVuLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjsKICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MiwgdGhpcy5feTIpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICAgICAgZGVmYXVsdDogcG9pbnQkMyh0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0gdGhpcy5feDIsIHRoaXMuX3gyID0geDsKICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHRoaXMuX3kyLCB0aGlzLl95MiA9IHk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGNhcmRpbmFsT3BlbiA9IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikgewoKICAgICAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgewogICAgICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuKGNvbnRleHQsIHRlbnNpb24pOwogICAgICB9CgogICAgICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgewogICAgICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNhcmRpbmFsOwogICAgfSkoMCk7CgogICAgZnVuY3Rpb24gcG9pbnQkNCh0aGF0LCB4LCB5KSB7CiAgICAgIHZhciB4MSA9IHRoYXQuX3gxLAogICAgICAgICAgeTEgPSB0aGF0Ll95MSwKICAgICAgICAgIHgyID0gdGhhdC5feDIsCiAgICAgICAgICB5MiA9IHRoYXQuX3kyOwoKICAgICAgaWYgKHRoYXQuX2wwMV9hID4gZXBzaWxvbiQzKSB7CiAgICAgICAgdmFyIGEgPSAyICogdGhhdC5fbDAxXzJhICsgMyAqIHRoYXQuX2wwMV9hICogdGhhdC5fbDEyX2EgKyB0aGF0Ll9sMTJfMmEsCiAgICAgICAgICAgIG4gPSAzICogdGhhdC5fbDAxX2EgKiAodGhhdC5fbDAxX2EgKyB0aGF0Ll9sMTJfYSk7CiAgICAgICAgeDEgPSAoeDEgKiBhIC0gdGhhdC5feDAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll94MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogICAgICAgIHkxID0gKHkxICogYSAtIHRoYXQuX3kwICogdGhhdC5fbDEyXzJhICsgdGhhdC5feTIgKiB0aGF0Ll9sMDFfMmEpIC8gbjsKICAgICAgfQoKICAgICAgaWYgKHRoYXQuX2wyM19hID4gZXBzaWxvbiQzKSB7CiAgICAgICAgdmFyIGIgPSAyICogdGhhdC5fbDIzXzJhICsgMyAqIHRoYXQuX2wyM19hICogdGhhdC5fbDEyX2EgKyB0aGF0Ll9sMTJfMmEsCiAgICAgICAgICAgIG0gPSAzICogdGhhdC5fbDIzX2EgKiAodGhhdC5fbDIzX2EgKyB0aGF0Ll9sMTJfYSk7CiAgICAgICAgeDIgPSAoeDIgKiBiICsgdGhhdC5feDEgKiB0aGF0Ll9sMjNfMmEgLSB4ICogdGhhdC5fbDEyXzJhKSAvIG07CiAgICAgICAgeTIgPSAoeTIgKiBiICsgdGhhdC5feTEgKiB0aGF0Ll9sMjNfMmEgLSB5ICogdGhhdC5fbDEyXzJhKSAvIG07CiAgICAgIH0KCiAgICAgIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MSwgeTEsIHgyLCB5MiwgdGhhdC5feDIsIHRoYXQuX3kyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBDYXRtdWxsUm9tKGNvbnRleHQsIGFscGhhKSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl9hbHBoYSA9IGFscGhhOwogICAgfQoKICAgIENhdG11bGxSb20ucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOOwogICAgICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9CiAgICAgICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID0KICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6IHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CgogICAgICAgIGlmICh0aGlzLl9wb2ludCkgewogICAgICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwKICAgICAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JDQodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsKICAgICAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXRtdWxsUm9tID0gKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgewoKICAgICAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb20oY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsKGNvbnRleHQsIDApOwogICAgICB9CgogICAgICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7CiAgICAgIH07CgogICAgICByZXR1cm4gY2F0bXVsbFJvbTsKICAgIH0pKDAuNSk7CgogICAgZnVuY3Rpb24gQ2F0bXVsbFJvbUNsb3NlZChjb250ZXh0LCBhbHBoYSkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgICAgdGhpcy5fYWxwaGEgPSBhbHBoYTsKICAgIH0KCiAgICBDYXRtdWxsUm9tQ2xvc2VkLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBub29wJDMsCiAgICAgIGFyZWFFbmQ6IG5vb3AkMywKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0gdGhpcy5feDUgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IHRoaXMuX3kzID0gdGhpcy5feTQgPSB0aGlzLl95NSA9IE5hTjsKICAgICAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPQogICAgICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDI6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDM6IHsKICAgICAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7CiAgICAgICAgICAgIHRoaXMucG9pbnQodGhpcy5feDUsIHRoaXMuX3k1KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwoKICAgICAgICBpZiAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIHZhciB4MjMgPSB0aGlzLl94MiAtIHgsCiAgICAgICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5OwogICAgICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geSk7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHRoaXMuX3g1ID0geCwgdGhpcy5feTUgPSB5OyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JDQodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsKICAgICAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXRtdWxsUm9tQ2xvc2VkID0gKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgewoKICAgICAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21DbG9zZWQoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsQ2xvc2VkKGNvbnRleHQsIDApOwogICAgICB9CgogICAgICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7CiAgICAgIH07CgogICAgICByZXR1cm4gY2F0bXVsbFJvbTsKICAgIH0pKDAuNSk7CgogICAgZnVuY3Rpb24gQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwgYWxwaGEpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgIHRoaXMuX2FscGhhID0gYWxwaGE7CiAgICB9CgogICAgQ2F0bXVsbFJvbU9wZW4ucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOOwogICAgICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9CiAgICAgICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID0KICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CgogICAgICAgIGlmICh0aGlzLl9wb2ludCkgewogICAgICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwKICAgICAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95MikgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh0aGlzLl94MiwgdGhpcy5feTIpOyBicmVhazsKICAgICAgICAgIGNhc2UgMzogdGhpcy5fcG9pbnQgPSA0OyAvLyBwcm9jZWVkCiAgICAgICAgICBkZWZhdWx0OiBwb2ludCQ0KHRoaXMsIHgsIHkpOyBicmVhazsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2E7CiAgICAgICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhLCB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmE7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4OwogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgY2F0bXVsbFJvbU9wZW4gPSAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7CgogICAgICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbU9wZW4oY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsT3Blbihjb250ZXh0LCAwKTsKICAgICAgfQoKICAgICAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNhdG11bGxSb207CiAgICB9KSgwLjUpOwoKICAgIGZ1bmN0aW9uIExpbmVhckNsb3NlZChjb250ZXh0KSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgfQoKICAgIExpbmVhckNsb3NlZC5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogbm9vcCQzLAogICAgICBhcmVhRW5kOiBub29wJDMsCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgaWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgICAgICBlbHNlIHRoaXMuX3BvaW50ID0gMSwgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gbGluZWFyQ2xvc2VkKGNvbnRleHQpIHsKICAgICAgcmV0dXJuIG5ldyBMaW5lYXJDbG9zZWQoY29udGV4dCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2lnbiQxKHgpIHsKICAgICAgcmV0dXJuIHggPCAwID8gLTEgOiAxOwogICAgfQoKICAgIC8vIENhbGN1bGF0ZSB0aGUgc2xvcGVzIG9mIHRoZSB0YW5nZW50cyAoSGVybWl0ZS10eXBlIGludGVycG9sYXRpb24pIGJhc2VkIG9uCiAgICAvLyB0aGUgZm9sbG93aW5nIHBhcGVyOiBTdGVmZmVuLCBNLiAxOTkwLiBBIFNpbXBsZSBNZXRob2QgZm9yIE1vbm90b25pYwogICAgLy8gSW50ZXJwb2xhdGlvbiBpbiBPbmUgRGltZW5zaW9uLiBBc3Ryb25vbXkgYW5kIEFzdHJvcGh5c2ljcywgVm9sLiAyMzksIE5PLgogICAgLy8gTk9WKElJKSwgUC4gNDQzLCAxOTkwLgogICAgZnVuY3Rpb24gc2xvcGUzKHRoYXQsIHgyLCB5MikgewogICAgICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLAogICAgICAgICAgaDEgPSB4MiAtIHRoYXQuX3gxLAogICAgICAgICAgczAgPSAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyAoaDAgfHwgaDEgPCAwICYmIC0wKSwKICAgICAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksCiAgICAgICAgICBwID0gKHMwICogaDEgKyBzMSAqIGgwKSAvIChoMCArIGgxKTsKICAgICAgcmV0dXJuIChzaWduJDEoczApICsgc2lnbiQxKHMxKSkgKiBNYXRoLm1pbihNYXRoLmFicyhzMCksIE1hdGguYWJzKHMxKSwgMC41ICogTWF0aC5hYnMocCkpIHx8IDA7CiAgICB9CgogICAgLy8gQ2FsY3VsYXRlIGEgb25lLXNpZGVkIHNsb3BlLgogICAgZnVuY3Rpb24gc2xvcGUyKHRoYXQsIHQpIHsKICAgICAgdmFyIGggPSB0aGF0Ll94MSAtIHRoYXQuX3gwOwogICAgICByZXR1cm4gaCA/ICgzICogKHRoYXQuX3kxIC0gdGhhdC5feTApIC8gaCAtIHQpIC8gMiA6IHQ7CiAgICB9CgogICAgLy8gQWNjb3JkaW5nIHRvIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N1YmljX0hlcm1pdGVfc3BsaW5lI1JlcHJlc2VudGF0aW9ucwogICAgLy8gInlvdSBjYW4gZXhwcmVzcyBjdWJpYyBIZXJtaXRlIGludGVycG9sYXRpb24gaW4gdGVybXMgb2YgY3ViaWMgQsOpemllciBjdXJ2ZXMKICAgIC8vIHdpdGggcmVzcGVjdCB0byB0aGUgZm91ciB2YWx1ZXMgcDAsIHAwICsgbTAgLyAzLCBwMSAtIG0xIC8gMywgcDEiLgogICAgZnVuY3Rpb24gcG9pbnQkNSh0aGF0LCB0MCwgdDEpIHsKICAgICAgdmFyIHgwID0gdGhhdC5feDAsCiAgICAgICAgICB5MCA9IHRoYXQuX3kwLAogICAgICAgICAgeDEgPSB0aGF0Ll94MSwKICAgICAgICAgIHkxID0gdGhhdC5feTEsCiAgICAgICAgICBkeCA9ICh4MSAtIHgwKSAvIDM7CiAgICAgIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCArIGR4LCB5MCArIGR4ICogdDAsIHgxIC0gZHgsIHkxIC0gZHggKiB0MSwgeDEsIHkxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBNb25vdG9uZVgoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBNb25vdG9uZVgucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPQogICAgICAgIHRoaXMuX3QwID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhazsKICAgICAgICAgIGNhc2UgMzogcG9pbnQkNSh0aGlzLCB0aGlzLl90MCwgc2xvcGUyKHRoaXMsIHRoaXMuX3QwKSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciB0MSA9IE5hTjsKCiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgaWYgKHggPT09IHRoaXMuX3gxICYmIHkgPT09IHRoaXMuX3kxKSByZXR1cm47IC8vIElnbm9yZSBjb2luY2lkZW50IHBvaW50cy4KICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHBvaW50JDUodGhpcywgc2xvcGUyKHRoaXMsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JDUodGhpcywgdGhpcy5fdDAsIHQxID0gc2xvcGUzKHRoaXMsIHgsIHkpKTsgYnJlYWs7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5OwogICAgICAgIHRoaXMuX3QwID0gdDE7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gTW9ub3RvbmVZKGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IG5ldyBSZWZsZWN0Q29udGV4dChjb250ZXh0KTsKICAgIH0KCiAgICAoTW9ub3RvbmVZLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoTW9ub3RvbmVYLnByb3RvdHlwZSkpLnBvaW50ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICBNb25vdG9uZVgucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIFJlZmxlY3RDb250ZXh0KGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgUmVmbGVjdENvbnRleHQucHJvdG90eXBlID0gewogICAgICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5fY29udGV4dC5tb3ZlVG8oeSwgeCk7IH0sCiAgICAgIGNsb3NlUGF0aDogZnVuY3Rpb24oKSB7IHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7IH0sCiAgICAgIGxpbmVUbzogZnVuY3Rpb24oeCwgeSkgeyB0aGlzLl9jb250ZXh0LmxpbmVUbyh5LCB4KTsgfSwKICAgICAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsgdGhpcy5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHkxLCB4MSwgeTIsIHgyLCB5LCB4KTsgfQogICAgfTsKCiAgICBmdW5jdGlvbiBtb25vdG9uZVgoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IE1vbm90b25lWChjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb25vdG9uZVkoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IE1vbm90b25lWShjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBOYXR1cmFsKGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgTmF0dXJhbC5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feCA9IFtdOwogICAgICAgIHRoaXMuX3kgPSBbXTsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHggPSB0aGlzLl94LAogICAgICAgICAgICB5ID0gdGhpcy5feSwKICAgICAgICAgICAgbiA9IHgubGVuZ3RoOwoKICAgICAgICBpZiAobikgewogICAgICAgICAgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHhbMF0sIHlbMF0pIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeFswXSwgeVswXSk7CiAgICAgICAgICBpZiAobiA9PT0gMikgewogICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzFdLCB5WzFdKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhciBweCA9IGNvbnRyb2xQb2ludHMoeCksCiAgICAgICAgICAgICAgICBweSA9IGNvbnRyb2xQb2ludHMoeSk7CiAgICAgICAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAxOyBpMSA8IG47ICsraTAsICsraTEpIHsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmJlemllckN1cnZlVG8ocHhbMF1baTBdLCBweVswXVtpMF0sIHB4WzFdW2kwXSwgcHlbMV1baTBdLCB4W2kxXSwgeVtpMV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiBuID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgICAgdGhpcy5feCA9IHRoaXMuX3kgPSBudWxsOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHRoaXMuX3gucHVzaCgreCk7CiAgICAgICAgdGhpcy5feS5wdXNoKCt5KTsKICAgICAgfQogICAgfTsKCiAgICAvLyBTZWUgaHR0cHM6Ly93d3cucGFydGljbGVpbmNlbGwuY29tLzIwMTIvYmV6aWVyLXNwbGluZXMvIGZvciBkZXJpdmF0aW9uLgogICAgZnVuY3Rpb24gY29udHJvbFBvaW50cyh4KSB7CiAgICAgIHZhciBpLAogICAgICAgICAgbiA9IHgubGVuZ3RoIC0gMSwKICAgICAgICAgIG0sCiAgICAgICAgICBhID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgYiA9IG5ldyBBcnJheShuKSwKICAgICAgICAgIHIgPSBuZXcgQXJyYXkobik7CiAgICAgIGFbMF0gPSAwLCBiWzBdID0gMiwgclswXSA9IHhbMF0gKyAyICogeFsxXTsKICAgICAgZm9yIChpID0gMTsgaSA8IG4gLSAxOyArK2kpIGFbaV0gPSAxLCBiW2ldID0gNCwgcltpXSA9IDQgKiB4W2ldICsgMiAqIHhbaSArIDFdOwogICAgICBhW24gLSAxXSA9IDIsIGJbbiAtIDFdID0gNywgcltuIC0gMV0gPSA4ICogeFtuIC0gMV0gKyB4W25dOwogICAgICBmb3IgKGkgPSAxOyBpIDwgbjsgKytpKSBtID0gYVtpXSAvIGJbaSAtIDFdLCBiW2ldIC09IG0sIHJbaV0gLT0gbSAqIHJbaSAtIDFdOwogICAgICBhW24gLSAxXSA9IHJbbiAtIDFdIC8gYltuIC0gMV07CiAgICAgIGZvciAoaSA9IG4gLSAyOyBpID49IDA7IC0taSkgYVtpXSA9IChyW2ldIC0gYVtpICsgMV0pIC8gYltpXTsKICAgICAgYltuIC0gMV0gPSAoeFtuXSArIGFbbiAtIDFdKSAvIDI7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuIC0gMTsgKytpKSBiW2ldID0gMiAqIHhbaSArIDFdIC0gYVtpICsgMV07CiAgICAgIHJldHVybiBbYSwgYl07CiAgICB9CgogICAgZnVuY3Rpb24gbmF0dXJhbChjb250ZXh0KSB7CiAgICAgIHJldHVybiBuZXcgTmF0dXJhbChjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBTdGVwKGNvbnRleHQsIHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgIHRoaXMuX3QgPSB0OwogICAgfQoKICAgIFN0ZXAucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3ggPSB0aGlzLl95ID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKDAgPCB0aGlzLl90ICYmIHRoaXMuX3QgPCAxICYmIHRoaXMuX3BvaW50ID09PSAyKSB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB0aGlzLl95KTsKICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgPj0gMCkgdGhpcy5fdCA9IDEgLSB0aGlzLl90LCB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkCiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGlmICh0aGlzLl90IDw9IDApIHsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB5KTsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgeDEgPSB0aGlzLl94ICogKDEgLSB0aGlzLl90KSArIHggKiB0aGlzLl90OwogICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB0aGlzLl95KTsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MSwgeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ggPSB4LCB0aGlzLl95ID0geTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBzdGVwKGNvbnRleHQpIHsKICAgICAgcmV0dXJuIG5ldyBTdGVwKGNvbnRleHQsIDAuNSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RlcEJlZm9yZShjb250ZXh0KSB7CiAgICAgIHJldHVybiBuZXcgU3RlcChjb250ZXh0LCAwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGVwQWZ0ZXIoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IFN0ZXAoY29udGV4dCwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9uZSQxKHNlcmllcywgb3JkZXIpIHsKICAgICAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47CiAgICAgIGZvciAodmFyIGkgPSAxLCBqLCBzMCwgczEgPSBzZXJpZXNbb3JkZXJbMF1dLCBuLCBtID0gczEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgczAgPSBzMSwgczEgPSBzZXJpZXNbb3JkZXJbaV1dOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICAgIHMxW2pdWzFdICs9IHMxW2pdWzBdID0gaXNOYU4oczBbal1bMV0pID8gczBbal1bMF0gOiBzMFtqXVsxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBub25lJDIoc2VyaWVzKSB7CiAgICAgIHZhciBuID0gc2VyaWVzLmxlbmd0aCwgbyA9IG5ldyBBcnJheShuKTsKICAgICAgd2hpbGUgKC0tbiA+PSAwKSBvW25dID0gbjsKICAgICAgcmV0dXJuIG87CiAgICB9CgogICAgZnVuY3Rpb24gc3RhY2tWYWx1ZShkLCBrZXkpIHsKICAgICAgcmV0dXJuIGRba2V5XTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGFjaygpIHsKICAgICAgdmFyIGtleXMgPSBjb25zdGFudCRiKFtdKSwKICAgICAgICAgIG9yZGVyID0gbm9uZSQyLAogICAgICAgICAgb2Zmc2V0ID0gbm9uZSQxLAogICAgICAgICAgdmFsdWUgPSBzdGFja1ZhbHVlOwoKICAgICAgZnVuY3Rpb24gc3RhY2soZGF0YSkgewogICAgICAgIHZhciBreiA9IGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgbSA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICBuID0ga3oubGVuZ3RoLAogICAgICAgICAgICBzeiA9IG5ldyBBcnJheShuKSwKICAgICAgICAgICAgb3o7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGZvciAodmFyIGtpID0ga3pbaV0sIHNpID0gc3pbaV0gPSBuZXcgQXJyYXkobSksIGogPSAwLCBzaWo7IGogPCBtOyArK2opIHsKICAgICAgICAgICAgc2lbal0gPSBzaWogPSBbMCwgK3ZhbHVlKGRhdGFbal0sIGtpLCBqLCBkYXRhKV07CiAgICAgICAgICAgIHNpai5kYXRhID0gZGF0YVtqXTsKICAgICAgICAgIH0KICAgICAgICAgIHNpLmtleSA9IGtpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMCwgb3ogPSBvcmRlcihzeik7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHN6W296W2ldXS5pbmRleCA9IGk7CiAgICAgICAgfQoKICAgICAgICBvZmZzZXQoc3osIG96KTsKICAgICAgICByZXR1cm4gc3o7CiAgICAgIH0KCiAgICAgIHN0YWNrLmtleXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoa2V5cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGIoc2xpY2UkNi5jYWxsKF8pKSwgc3RhY2spIDoga2V5czsKICAgICAgfTsKCiAgICAgIHN0YWNrLnZhbHVlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYigrXyksIHN0YWNrKSA6IHZhbHVlOwogICAgICB9OwoKICAgICAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JkZXIgPSBfID09IG51bGwgPyBub25lJDIgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRiKHNsaWNlJDYuY2FsbChfKSksIHN0YWNrKSA6IG9yZGVyOwogICAgICB9OwoKICAgICAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG5vbmUkMSA6IF8sIHN0YWNrKSA6IG9mZnNldDsKICAgICAgfTsKCiAgICAgIHJldHVybiBzdGFjazsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBhbmQoc2VyaWVzLCBvcmRlcikgewogICAgICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkpIHJldHVybjsKICAgICAgZm9yICh2YXIgaSwgbiwgaiA9IDAsIG0gPSBzZXJpZXNbMF0ubGVuZ3RoLCB5OyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh5ID0gaSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7CiAgICAgICAgaWYgKHkpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNlcmllc1tpXVtqXVsxXSAvPSB5OwogICAgICB9CiAgICAgIG5vbmUkMShzZXJpZXMsIG9yZGVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXZlcmdpbmckMShzZXJpZXMsIG9yZGVyKSB7CiAgICAgIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuOwogICAgICBmb3IgKHZhciBpLCBqID0gMCwgZCwgZHksIHlwLCB5biwgbiwgbSA9IHNlcmllc1tvcmRlclswXV0ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh5cCA9IHluID0gMCwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgoZHkgPSAoZCA9IHNlcmllc1tvcmRlcltpXV1bal0pWzFdIC0gZFswXSkgPiAwKSB7CiAgICAgICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5OwogICAgICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHsKICAgICAgICAgICAgZFsxXSA9IHluLCBkWzBdID0geW4gKz0gZHk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkWzBdID0gMCwgZFsxXSA9IGR5OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNpbGhvdWV0dGUoc2VyaWVzLCBvcmRlcikgewogICAgICBpZiAoISgobiA9IHNlcmllcy5sZW5ndGgpID4gMCkpIHJldHVybjsKICAgICAgZm9yICh2YXIgaiA9IDAsIHMwID0gc2VyaWVzW29yZGVyWzBdXSwgbiwgbSA9IHMwLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGkgPSAwLCB5ID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDsKICAgICAgICBzMFtqXVsxXSArPSBzMFtqXVswXSA9IC15IC8gMjsKICAgICAgfQogICAgICBub25lJDEoc2VyaWVzLCBvcmRlcik7CiAgICB9CgogICAgZnVuY3Rpb24gd2lnZ2xlKHNlcmllcywgb3JkZXIpIHsKICAgICAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApIHx8ICEoKG0gPSAoczAgPSBzZXJpZXNbb3JkZXJbMF1dKS5sZW5ndGgpID4gMCkpIHJldHVybjsKICAgICAgZm9yICh2YXIgeSA9IDAsIGogPSAxLCBzMCwgbSwgbjsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBzMSA9IDAsIHMyID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIHNpID0gc2VyaWVzW29yZGVyW2ldXSwKICAgICAgICAgICAgICBzaWowID0gc2lbal1bMV0gfHwgMCwKICAgICAgICAgICAgICBzaWoxID0gc2lbaiAtIDFdWzFdIHx8IDAsCiAgICAgICAgICAgICAgczMgPSAoc2lqMCAtIHNpajEpIC8gMjsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaTsgKytrKSB7CiAgICAgICAgICAgIHZhciBzayA9IHNlcmllc1tvcmRlcltrXV0sCiAgICAgICAgICAgICAgICBza2owID0gc2tbal1bMV0gfHwgMCwKICAgICAgICAgICAgICAgIHNrajEgPSBza1tqIC0gMV1bMV0gfHwgMDsKICAgICAgICAgICAgczMgKz0gc2tqMCAtIHNrajE7CiAgICAgICAgICB9CiAgICAgICAgICBzMSArPSBzaWowLCBzMiArPSBzMyAqIHNpajA7CiAgICAgICAgfQogICAgICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogICAgICAgIGlmIChzMSkgeSAtPSBzMiAvIHMxOwogICAgICB9CiAgICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogICAgICBub25lJDEoc2VyaWVzLCBvcmRlcik7CiAgICB9CgogICAgZnVuY3Rpb24gYXBwZWFyYW5jZShzZXJpZXMpIHsKICAgICAgdmFyIHBlYWtzID0gc2VyaWVzLm1hcChwZWFrKTsKICAgICAgcmV0dXJuIG5vbmUkMihzZXJpZXMpLnNvcnQoZnVuY3Rpb24oYSwgYikgeyByZXR1cm4gcGVha3NbYV0gLSBwZWFrc1tiXTsgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGVhayhzZXJpZXMpIHsKICAgICAgdmFyIGkgPSAtMSwgaiA9IDAsIG4gPSBzZXJpZXMubGVuZ3RoLCB2aSwgdmogPSAtSW5maW5pdHk7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHZpID0gK3Nlcmllc1tpXVsxXSkgPiB2aikgdmogPSB2aSwgaiA9IGk7CiAgICAgIHJldHVybiBqOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZyQzKHNlcmllcykgewogICAgICB2YXIgc3VtcyA9IHNlcmllcy5tYXAoc3VtJDIpOwogICAgICByZXR1cm4gbm9uZSQyKHNlcmllcykuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzdW1zW2FdIC0gc3Vtc1tiXTsgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3VtJDIoc2VyaWVzKSB7CiAgICAgIHZhciBzID0gMCwgaSA9IC0xLCBuID0gc2VyaWVzLmxlbmd0aCwgdjsKICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICh2ID0gK3Nlcmllc1tpXVsxXSkgcyArPSB2OwogICAgICByZXR1cm4gczsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXNjZW5kaW5nJDIoc2VyaWVzKSB7CiAgICAgIHJldHVybiBhc2NlbmRpbmckMyhzZXJpZXMpLnJldmVyc2UoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNpZGVPdXQoc2VyaWVzKSB7CiAgICAgIHZhciBuID0gc2VyaWVzLmxlbmd0aCwKICAgICAgICAgIGksCiAgICAgICAgICBqLAogICAgICAgICAgc3VtcyA9IHNlcmllcy5tYXAoc3VtJDIpLAogICAgICAgICAgb3JkZXIgPSBhcHBlYXJhbmNlKHNlcmllcyksCiAgICAgICAgICB0b3AgPSAwLAogICAgICAgICAgYm90dG9tID0gMCwKICAgICAgICAgIHRvcHMgPSBbXSwKICAgICAgICAgIGJvdHRvbXMgPSBbXTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBqID0gb3JkZXJbaV07CiAgICAgICAgaWYgKHRvcCA8IGJvdHRvbSkgewogICAgICAgICAgdG9wICs9IHN1bXNbal07CiAgICAgICAgICB0b3BzLnB1c2goaik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJvdHRvbSArPSBzdW1zW2pdOwogICAgICAgICAgYm90dG9tcy5wdXNoKGopOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXZlcnNlKHNlcmllcykgewogICAgICByZXR1cm4gbm9uZSQyKHNlcmllcykucmV2ZXJzZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JGMoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24geCQ0KGQpIHsKICAgICAgcmV0dXJuIGRbMF07CiAgICB9CgogICAgZnVuY3Rpb24geSQ0KGQpIHsKICAgICAgcmV0dXJuIGRbMV07CiAgICB9CgogICAgZnVuY3Rpb24gUmVkQmxhY2tUcmVlKCkgewogICAgICB0aGlzLl8gPSBudWxsOyAvLyByb290IG5vZGUKICAgIH0KCiAgICBmdW5jdGlvbiBSZWRCbGFja05vZGUobm9kZSkgewogICAgICBub2RlLlUgPSAvLyBwYXJlbnQgbm9kZQogICAgICBub2RlLkMgPSAvLyBjb2xvciAtIHRydWUgZm9yIHJlZCwgZmFsc2UgZm9yIGJsYWNrCiAgICAgIG5vZGUuTCA9IC8vIGxlZnQgbm9kZQogICAgICBub2RlLlIgPSAvLyByaWdodCBub2RlCiAgICAgIG5vZGUuUCA9IC8vIHByZXZpb3VzIG5vZGUKICAgICAgbm9kZS5OID0gbnVsbDsgLy8gbmV4dCBub2RlCiAgICB9CgogICAgUmVkQmxhY2tUcmVlLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFJlZEJsYWNrVHJlZSwKCiAgICAgIGluc2VydDogZnVuY3Rpb24oYWZ0ZXIsIG5vZGUpIHsKICAgICAgICB2YXIgcGFyZW50LCBncmFuZHBhLCB1bmNsZTsKCiAgICAgICAgaWYgKGFmdGVyKSB7CiAgICAgICAgICBub2RlLlAgPSBhZnRlcjsKICAgICAgICAgIG5vZGUuTiA9IGFmdGVyLk47CiAgICAgICAgICBpZiAoYWZ0ZXIuTikgYWZ0ZXIuTi5QID0gbm9kZTsKICAgICAgICAgIGFmdGVyLk4gPSBub2RlOwogICAgICAgICAgaWYgKGFmdGVyLlIpIHsKICAgICAgICAgICAgYWZ0ZXIgPSBhZnRlci5SOwogICAgICAgICAgICB3aGlsZSAoYWZ0ZXIuTCkgYWZ0ZXIgPSBhZnRlci5MOwogICAgICAgICAgICBhZnRlci5MID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGFmdGVyLlIgPSBub2RlOwogICAgICAgICAgfQogICAgICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl8pIHsKICAgICAgICAgIGFmdGVyID0gUmVkQmxhY2tGaXJzdCh0aGlzLl8pOwogICAgICAgICAgbm9kZS5QID0gbnVsbDsKICAgICAgICAgIG5vZGUuTiA9IGFmdGVyOwogICAgICAgICAgYWZ0ZXIuUCA9IGFmdGVyLkwgPSBub2RlOwogICAgICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUuUCA9IG5vZGUuTiA9IG51bGw7CiAgICAgICAgICB0aGlzLl8gPSBub2RlOwogICAgICAgICAgcGFyZW50ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgbm9kZS5MID0gbm9kZS5SID0gbnVsbDsKICAgICAgICBub2RlLlUgPSBwYXJlbnQ7CiAgICAgICAgbm9kZS5DID0gdHJ1ZTsKCiAgICAgICAgYWZ0ZXIgPSBub2RlOwogICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LkMpIHsKICAgICAgICAgIGdyYW5kcGEgPSBwYXJlbnQuVTsKICAgICAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkgewogICAgICAgICAgICB1bmNsZSA9IGdyYW5kcGEuUjsKICAgICAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHsKICAgICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5SKSB7CiAgICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAgICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTsKICAgICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgZ3JhbmRwYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHVuY2xlID0gZ3JhbmRwYS5MOwogICAgICAgICAgICBpZiAodW5jbGUgJiYgdW5jbGUuQykgewogICAgICAgICAgICAgIHBhcmVudC5DID0gdW5jbGUuQyA9IGZhbHNlOwogICAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICAgICAgYWZ0ZXIgPSBncmFuZHBhOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChhZnRlciA9PT0gcGFyZW50LkwpIHsKICAgICAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAgICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTsKICAgICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVmdCh0aGlzLCBncmFuZHBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fLkMgPSBmYWxzZTsKICAgICAgfSwKCiAgICAgIHJlbW92ZTogZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmIChub2RlLk4pIG5vZGUuTi5QID0gbm9kZS5QOwogICAgICAgIGlmIChub2RlLlApIG5vZGUuUC5OID0gbm9kZS5OOwogICAgICAgIG5vZGUuTiA9IG5vZGUuUCA9IG51bGw7CgogICAgICAgIHZhciBwYXJlbnQgPSBub2RlLlUsCiAgICAgICAgICAgIHNpYmxpbmcsCiAgICAgICAgICAgIGxlZnQgPSBub2RlLkwsCiAgICAgICAgICAgIHJpZ2h0ID0gbm9kZS5SLAogICAgICAgICAgICBuZXh0LAogICAgICAgICAgICByZWQ7CgogICAgICAgIGlmICghbGVmdCkgbmV4dCA9IHJpZ2h0OwogICAgICAgIGVsc2UgaWYgKCFyaWdodCkgbmV4dCA9IGxlZnQ7CiAgICAgICAgZWxzZSBuZXh0ID0gUmVkQmxhY2tGaXJzdChyaWdodCk7CgogICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgIGlmIChwYXJlbnQuTCA9PT0gbm9kZSkgcGFyZW50LkwgPSBuZXh0OwogICAgICAgICAgZWxzZSBwYXJlbnQuUiA9IG5leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuXyA9IG5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAobGVmdCAmJiByaWdodCkgewogICAgICAgICAgcmVkID0gbmV4dC5DOwogICAgICAgICAgbmV4dC5DID0gbm9kZS5DOwogICAgICAgICAgbmV4dC5MID0gbGVmdDsKICAgICAgICAgIGxlZnQuVSA9IG5leHQ7CiAgICAgICAgICBpZiAobmV4dCAhPT0gcmlnaHQpIHsKICAgICAgICAgICAgcGFyZW50ID0gbmV4dC5VOwogICAgICAgICAgICBuZXh0LlUgPSBub2RlLlU7CiAgICAgICAgICAgIG5vZGUgPSBuZXh0LlI7CiAgICAgICAgICAgIHBhcmVudC5MID0gbm9kZTsKICAgICAgICAgICAgbmV4dC5SID0gcmlnaHQ7CiAgICAgICAgICAgIHJpZ2h0LlUgPSBuZXh0OwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbmV4dC5VID0gcGFyZW50OwogICAgICAgICAgICBwYXJlbnQgPSBuZXh0OwogICAgICAgICAgICBub2RlID0gbmV4dC5SOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZWQgPSBub2RlLkM7CiAgICAgICAgICBub2RlID0gbmV4dDsKICAgICAgICB9CgogICAgICAgIGlmIChub2RlKSBub2RlLlUgPSBwYXJlbnQ7CiAgICAgICAgaWYgKHJlZCkgcmV0dXJuOwogICAgICAgIGlmIChub2RlICYmIG5vZGUuQykgeyBub2RlLkMgPSBmYWxzZTsgcmV0dXJuOyB9CgogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChub2RlID09PSB0aGlzLl8pIGJyZWFrOwogICAgICAgICAgaWYgKG5vZGUgPT09IHBhcmVudC5MKSB7CiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuUjsKICAgICAgICAgICAgaWYgKHNpYmxpbmcuQykgewogICAgICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAgICAgICAgIHBhcmVudC5DID0gdHJ1ZTsKICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAgICAgICAgICAgICB8fCAoc2libGluZy5SICYmIHNpYmxpbmcuUi5DKSkgewogICAgICAgICAgICAgIGlmICghc2libGluZy5SIHx8ICFzaWJsaW5nLlIuQykgewogICAgICAgICAgICAgICAgc2libGluZy5MLkMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHNpYmxpbmcuQyA9IHRydWU7CiAgICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0KHRoaXMsIHNpYmxpbmcpOwogICAgICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5SOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzaWJsaW5nLkMgPSBwYXJlbnQuQzsKICAgICAgICAgICAgICBwYXJlbnQuQyA9IHNpYmxpbmcuUi5DID0gZmFsc2U7CiAgICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHBhcmVudCk7CiAgICAgICAgICAgICAgbm9kZSA9IHRoaXMuXzsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgICAgICBpZiAoc2libGluZy5DKSB7CiAgICAgICAgICAgICAgc2libGluZy5DID0gZmFsc2U7CiAgICAgICAgICAgICAgcGFyZW50LkMgPSB0cnVlOwogICAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlUmlnaHQodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAgICAgICAgICAgfHwgKHNpYmxpbmcuUiAmJiBzaWJsaW5nLlIuQykpIHsKICAgICAgICAgICAgICBpZiAoIXNpYmxpbmcuTCB8fCAhc2libGluZy5MLkMpIHsKICAgICAgICAgICAgICAgIHNpYmxpbmcuUi5DID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlOwogICAgICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0KHRoaXMsIHNpYmxpbmcpOwogICAgICAgICAgICAgICAgc2libGluZyA9IHBhcmVudC5MOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBzaWJsaW5nLkMgPSBwYXJlbnQuQzsKICAgICAgICAgICAgICBwYXJlbnQuQyA9IHNpYmxpbmcuTC5DID0gZmFsc2U7CiAgICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHNpYmxpbmcuQyA9IHRydWU7CiAgICAgICAgICBub2RlID0gcGFyZW50OwogICAgICAgICAgcGFyZW50ID0gcGFyZW50LlU7CiAgICAgICAgfSB3aGlsZSAoIW5vZGUuQyk7CgogICAgICAgIGlmIChub2RlKSBub2RlLkMgPSBmYWxzZTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBSZWRCbGFja1JvdGF0ZUxlZnQodHJlZSwgbm9kZSkgewogICAgICB2YXIgcCA9IG5vZGUsCiAgICAgICAgICBxID0gbm9kZS5SLAogICAgICAgICAgcGFyZW50ID0gcC5VOwoKICAgICAgaWYgKHBhcmVudCkgewogICAgICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxOwogICAgICAgIGVsc2UgcGFyZW50LlIgPSBxOwogICAgICB9IGVsc2UgewogICAgICAgIHRyZWUuXyA9IHE7CiAgICAgIH0KCiAgICAgIHEuVSA9IHBhcmVudDsKICAgICAgcC5VID0gcTsKICAgICAgcC5SID0gcS5MOwogICAgICBpZiAocC5SKSBwLlIuVSA9IHA7CiAgICAgIHEuTCA9IHA7CiAgICB9CgogICAgZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVSaWdodCh0cmVlLCBub2RlKSB7CiAgICAgIHZhciBwID0gbm9kZSwKICAgICAgICAgIHEgPSBub2RlLkwsCiAgICAgICAgICBwYXJlbnQgPSBwLlU7CgogICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgaWYgKHBhcmVudC5MID09PSBwKSBwYXJlbnQuTCA9IHE7CiAgICAgICAgZWxzZSBwYXJlbnQuUiA9IHE7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdHJlZS5fID0gcTsKICAgICAgfQoKICAgICAgcS5VID0gcGFyZW50OwogICAgICBwLlUgPSBxOwogICAgICBwLkwgPSBxLlI7CiAgICAgIGlmIChwLkwpIHAuTC5VID0gcDsKICAgICAgcS5SID0gcDsKICAgIH0KCiAgICBmdW5jdGlvbiBSZWRCbGFja0ZpcnN0KG5vZGUpIHsKICAgICAgd2hpbGUgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsKICAgICAgcmV0dXJuIG5vZGU7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlRWRnZShsZWZ0LCByaWdodCwgdjAsIHYxKSB7CiAgICAgIHZhciBlZGdlID0gW251bGwsIG51bGxdLAogICAgICAgICAgaW5kZXggPSBlZGdlcy5wdXNoKGVkZ2UpIC0gMTsKICAgICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgICAgZWRnZS5yaWdodCA9IHJpZ2h0OwogICAgICBpZiAodjApIHNldEVkZ2VFbmQoZWRnZSwgbGVmdCwgcmlnaHQsIHYwKTsKICAgICAgaWYgKHYxKSBzZXRFZGdlRW5kKGVkZ2UsIHJpZ2h0LCBsZWZ0LCB2MSk7CiAgICAgIGNlbGxzW2xlZnQuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKGluZGV4KTsKICAgICAgY2VsbHNbcmlnaHQuaW5kZXhdLmhhbGZlZGdlcy5wdXNoKGluZGV4KTsKICAgICAgcmV0dXJuIGVkZ2U7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlQm9yZGVyRWRnZShsZWZ0LCB2MCwgdjEpIHsKICAgICAgdmFyIGVkZ2UgPSBbdjAsIHYxXTsKICAgICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgICAgcmV0dXJuIGVkZ2U7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0RWRnZUVuZChlZGdlLCBsZWZ0LCByaWdodCwgdmVydGV4KSB7CiAgICAgIGlmICghZWRnZVswXSAmJiAhZWRnZVsxXSkgewogICAgICAgIGVkZ2VbMF0gPSB2ZXJ0ZXg7CiAgICAgICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgICAgICBlZGdlLnJpZ2h0ID0gcmlnaHQ7CiAgICAgIH0gZWxzZSBpZiAoZWRnZS5sZWZ0ID09PSByaWdodCkgewogICAgICAgIGVkZ2VbMV0gPSB2ZXJ0ZXg7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZWRnZVswXSA9IHZlcnRleDsKICAgICAgfQogICAgfQoKICAgIC8vIExpYW5n4oCTQmFyc2t5IGxpbmUgY2xpcHBpbmcuCiAgICBmdW5jdGlvbiBjbGlwRWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgYSA9IGVkZ2VbMF0sCiAgICAgICAgICBiID0gZWRnZVsxXSwKICAgICAgICAgIGF4ID0gYVswXSwKICAgICAgICAgIGF5ID0gYVsxXSwKICAgICAgICAgIGJ4ID0gYlswXSwKICAgICAgICAgIGJ5ID0gYlsxXSwKICAgICAgICAgIHQwID0gMCwKICAgICAgICAgIHQxID0gMSwKICAgICAgICAgIGR4ID0gYnggLSBheCwKICAgICAgICAgIGR5ID0gYnkgLSBheSwKICAgICAgICAgIHI7CgogICAgICByID0geDAgLSBheDsKICAgICAgaWYgKCFkeCAmJiByID4gMCkgcmV0dXJuOwogICAgICByIC89IGR4OwogICAgICBpZiAoZHggPCAwKSB7CiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICAgICAgfSBlbHNlIGlmIChkeCA+IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9CgogICAgICByID0geDEgLSBheDsKICAgICAgaWYgKCFkeCAmJiByIDwgMCkgcmV0dXJuOwogICAgICByIC89IGR4OwogICAgICBpZiAoZHggPCAwKSB7CiAgICAgICAgaWYgKHIgPiB0MSkgcmV0dXJuOwogICAgICAgIGlmIChyID4gdDApIHQwID0gcjsKICAgICAgfSBlbHNlIGlmIChkeCA+IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9CgogICAgICByID0geTAgLSBheTsKICAgICAgaWYgKCFkeSAmJiByID4gMCkgcmV0dXJuOwogICAgICByIC89IGR5OwogICAgICBpZiAoZHkgPCAwKSB7CiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICAgICAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9CgogICAgICByID0geTEgLSBheTsKICAgICAgaWYgKCFkeSAmJiByIDwgMCkgcmV0dXJuOwogICAgICByIC89IGR5OwogICAgICBpZiAoZHkgPCAwKSB7CiAgICAgICAgaWYgKHIgPiB0MSkgcmV0dXJuOwogICAgICAgIGlmIChyID4gdDApIHQwID0gcjsKICAgICAgfSBlbHNlIGlmIChkeSA+IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9CgogICAgICBpZiAoISh0MCA+IDApICYmICEodDEgPCAxKSkgcmV0dXJuIHRydWU7IC8vIFRPRE8gQmV0dGVyIGNoZWNrPwoKICAgICAgaWYgKHQwID4gMCkgZWRnZVswXSA9IFtheCArIHQwICogZHgsIGF5ICsgdDAgKiBkeV07CiAgICAgIGlmICh0MSA8IDEpIGVkZ2VbMV0gPSBbYXggKyB0MSAqIGR4LCBheSArIHQxICogZHldOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25uZWN0RWRnZShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgdjEgPSBlZGdlWzFdOwogICAgICBpZiAodjEpIHJldHVybiB0cnVlOwoKICAgICAgdmFyIHYwID0gZWRnZVswXSwKICAgICAgICAgIGxlZnQgPSBlZGdlLmxlZnQsCiAgICAgICAgICByaWdodCA9IGVkZ2UucmlnaHQsCiAgICAgICAgICBseCA9IGxlZnRbMF0sCiAgICAgICAgICBseSA9IGxlZnRbMV0sCiAgICAgICAgICByeCA9IHJpZ2h0WzBdLAogICAgICAgICAgcnkgPSByaWdodFsxXSwKICAgICAgICAgIGZ4ID0gKGx4ICsgcngpIC8gMiwKICAgICAgICAgIGZ5ID0gKGx5ICsgcnkpIC8gMiwKICAgICAgICAgIGZtLAogICAgICAgICAgZmI7CgogICAgICBpZiAocnkgPT09IGx5KSB7CiAgICAgICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjsKICAgICAgICBpZiAobHggPiByeCkgewogICAgICAgICAgaWYgKCF2MCkgdjAgPSBbZngsIHkwXTsKICAgICAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkxKSByZXR1cm47CiAgICAgICAgICB2MSA9IFtmeCwgeTFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXYwKSB2MCA9IFtmeCwgeTFdOwogICAgICAgICAgZWxzZSBpZiAodjBbMV0gPCB5MCkgcmV0dXJuOwogICAgICAgICAgdjEgPSBbZngsIHkwXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm0gPSAobHggLSByeCkgLyAocnkgLSBseSk7CiAgICAgICAgZmIgPSBmeSAtIGZtICogZng7CiAgICAgICAgaWYgKGZtIDwgLTEgfHwgZm0gPiAxKSB7CiAgICAgICAgICBpZiAobHggPiByeCkgewogICAgICAgICAgICBpZiAoIXYwKSB2MCA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICAgICAgICBlbHNlIGlmICh2MFsxXSA+PSB5MSkgcmV0dXJuOwogICAgICAgICAgICB2MSA9IFsoeTEgLSBmYikgLyBmbSwgeTFdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCF2MCkgdjAgPSBbKHkxIC0gZmIpIC8gZm0sIHkxXTsKICAgICAgICAgICAgZWxzZSBpZiAodjBbMV0gPCB5MCkgcmV0dXJuOwogICAgICAgICAgICB2MSA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobHkgPCByeSkgewogICAgICAgICAgICBpZiAoIXYwKSB2MCA9IFt4MCwgZm0gKiB4MCArIGZiXTsKICAgICAgICAgICAgZWxzZSBpZiAodjBbMF0gPj0geDEpIHJldHVybjsKICAgICAgICAgICAgdjEgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIXYwKSB2MCA9IFt4MSwgZm0gKiB4MSArIGZiXTsKICAgICAgICAgICAgZWxzZSBpZiAodjBbMF0gPCB4MCkgcmV0dXJuOwogICAgICAgICAgICB2MSA9IFt4MCwgZm0gKiB4MCArIGZiXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVkZ2VbMF0gPSB2MDsKICAgICAgZWRnZVsxXSA9IHYxOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwRWRnZXMoeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdmFyIGkgPSBlZGdlcy5sZW5ndGgsCiAgICAgICAgICBlZGdlOwoKICAgICAgd2hpbGUgKGktLSkgewogICAgICAgIGlmICghY29ubmVjdEVkZ2UoZWRnZSA9IGVkZ2VzW2ldLCB4MCwgeTAsIHgxLCB5MSkKICAgICAgICAgICAgfHwgIWNsaXBFZGdlKGVkZ2UsIHgwLCB5MCwgeDEsIHkxKQogICAgICAgICAgICB8fCAhKE1hdGguYWJzKGVkZ2VbMF1bMF0gLSBlZGdlWzFdWzBdKSA+IGVwc2lsb24kNAogICAgICAgICAgICAgICAgfHwgTWF0aC5hYnMoZWRnZVswXVsxXSAtIGVkZ2VbMV1bMV0pID4gZXBzaWxvbiQ0KSkgewogICAgICAgICAgZGVsZXRlIGVkZ2VzW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUNlbGwoc2l0ZSkgewogICAgICByZXR1cm4gY2VsbHNbc2l0ZS5pbmRleF0gPSB7CiAgICAgICAgc2l0ZTogc2l0ZSwKICAgICAgICBoYWxmZWRnZXM6IFtdCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2VsbEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZSkgewogICAgICB2YXIgc2l0ZSA9IGNlbGwuc2l0ZSwKICAgICAgICAgIHZhID0gZWRnZS5sZWZ0LAogICAgICAgICAgdmIgPSBlZGdlLnJpZ2h0OwogICAgICBpZiAoc2l0ZSA9PT0gdmIpIHZiID0gdmEsIHZhID0gc2l0ZTsKICAgICAgaWYgKHZiKSByZXR1cm4gTWF0aC5hdGFuMih2YlsxXSAtIHZhWzFdLCB2YlswXSAtIHZhWzBdKTsKICAgICAgaWYgKHNpdGUgPT09IHZhKSB2YSA9IGVkZ2VbMV0sIHZiID0gZWRnZVswXTsKICAgICAgZWxzZSB2YSA9IGVkZ2VbMF0sIHZiID0gZWRnZVsxXTsKICAgICAgcmV0dXJuIE1hdGguYXRhbjIodmFbMF0gLSB2YlswXSwgdmJbMV0gLSB2YVsxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VsbEhhbGZlZGdlU3RhcnQoY2VsbCwgZWRnZSkgewogICAgICByZXR1cm4gZWRnZVsrKGVkZ2UubGVmdCAhPT0gY2VsbC5zaXRlKV07CiAgICB9CgogICAgZnVuY3Rpb24gY2VsbEhhbGZlZGdlRW5kKGNlbGwsIGVkZ2UpIHsKICAgICAgcmV0dXJuIGVkZ2VbKyhlZGdlLmxlZnQgPT09IGNlbGwuc2l0ZSldOwogICAgfQoKICAgIGZ1bmN0aW9uIHNvcnRDZWxsSGFsZmVkZ2VzKCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGNlbGxzLmxlbmd0aCwgY2VsbCwgaGFsZmVkZ2VzLCBqLCBtOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChjZWxsID0gY2VsbHNbaV0pICYmIChtID0gKGhhbGZlZGdlcyA9IGNlbGwuaGFsZmVkZ2VzKS5sZW5ndGgpKSB7CiAgICAgICAgICB2YXIgaW5kZXggPSBuZXcgQXJyYXkobSksCiAgICAgICAgICAgICAgYXJyYXkgPSBuZXcgQXJyYXkobSk7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSBpbmRleFtqXSA9IGosIGFycmF5W2pdID0gY2VsbEhhbGZlZGdlQW5nbGUoY2VsbCwgZWRnZXNbaGFsZmVkZ2VzW2pdXSk7CiAgICAgICAgICBpbmRleC5zb3J0KGZ1bmN0aW9uKGksIGopIHsgcmV0dXJuIGFycmF5W2pdIC0gYXJyYXlbaV07IH0pOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgYXJyYXlbal0gPSBoYWxmZWRnZXNbaW5kZXhbal1dOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgaGFsZmVkZ2VzW2pdID0gYXJyYXlbal07CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gY2xpcENlbGxzKHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIHZhciBuQ2VsbHMgPSBjZWxscy5sZW5ndGgsCiAgICAgICAgICBpQ2VsbCwKICAgICAgICAgIGNlbGwsCiAgICAgICAgICBzaXRlLAogICAgICAgICAgaUhhbGZlZGdlLAogICAgICAgICAgaGFsZmVkZ2VzLAogICAgICAgICAgbkhhbGZlZGdlcywKICAgICAgICAgIHN0YXJ0LAogICAgICAgICAgc3RhcnRYLAogICAgICAgICAgc3RhcnRZLAogICAgICAgICAgZW5kLAogICAgICAgICAgZW5kWCwKICAgICAgICAgIGVuZFksCiAgICAgICAgICBjb3ZlciA9IHRydWU7CgogICAgICBmb3IgKGlDZWxsID0gMDsgaUNlbGwgPCBuQ2VsbHM7ICsraUNlbGwpIHsKICAgICAgICBpZiAoY2VsbCA9IGNlbGxzW2lDZWxsXSkgewogICAgICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgICAgIGhhbGZlZGdlcyA9IGNlbGwuaGFsZmVkZ2VzOwogICAgICAgICAgaUhhbGZlZGdlID0gaGFsZmVkZ2VzLmxlbmd0aDsKCiAgICAgICAgICAvLyBSZW1vdmUgYW55IGRhbmdsaW5nIGNsaXBwZWQgZWRnZXMuCiAgICAgICAgICB3aGlsZSAoaUhhbGZlZGdlLS0pIHsKICAgICAgICAgICAgaWYgKCFlZGdlc1toYWxmZWRnZXNbaUhhbGZlZGdlXV0pIHsKICAgICAgICAgICAgICBoYWxmZWRnZXMuc3BsaWNlKGlIYWxmZWRnZSwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJbnNlcnQgYW55IGJvcmRlciBlZGdlcyBhcyBuZWNlc3NhcnkuCiAgICAgICAgICBpSGFsZmVkZ2UgPSAwLCBuSGFsZmVkZ2VzID0gaGFsZmVkZ2VzLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChpSGFsZmVkZ2UgPCBuSGFsZmVkZ2VzKSB7CiAgICAgICAgICAgIGVuZCA9IGNlbGxIYWxmZWRnZUVuZChjZWxsLCBlZGdlc1toYWxmZWRnZXNbaUhhbGZlZGdlXV0pLCBlbmRYID0gZW5kWzBdLCBlbmRZID0gZW5kWzFdOwogICAgICAgICAgICBzdGFydCA9IGNlbGxIYWxmZWRnZVN0YXJ0KGNlbGwsIGVkZ2VzW2hhbGZlZGdlc1srK2lIYWxmZWRnZSAlIG5IYWxmZWRnZXNdXSksIHN0YXJ0WCA9IHN0YXJ0WzBdLCBzdGFydFkgPSBzdGFydFsxXTsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKGVuZFggLSBzdGFydFgpID4gZXBzaWxvbiQ0IHx8IE1hdGguYWJzKGVuZFkgLSBzdGFydFkpID4gZXBzaWxvbiQ0KSB7CiAgICAgICAgICAgICAgaGFsZmVkZ2VzLnNwbGljZShpSGFsZmVkZ2UsIDAsIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCBlbmQsCiAgICAgICAgICAgICAgICAgIE1hdGguYWJzKGVuZFggLSB4MCkgPCBlcHNpbG9uJDQgJiYgeTEgLSBlbmRZID4gZXBzaWxvbiQ0ID8gW3gwLCBNYXRoLmFicyhzdGFydFggLSB4MCkgPCBlcHNpbG9uJDQgPyBzdGFydFkgOiB5MV0KICAgICAgICAgICAgICAgICAgOiBNYXRoLmFicyhlbmRZIC0geTEpIDwgZXBzaWxvbiQ0ICYmIHgxIC0gZW5kWCA+IGVwc2lsb24kNCA/IFtNYXRoLmFicyhzdGFydFkgLSB5MSkgPCBlcHNpbG9uJDQgPyBzdGFydFggOiB4MSwgeTFdCiAgICAgICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWCAtIHgxKSA8IGVwc2lsb24kNCAmJiBlbmRZIC0geTAgPiBlcHNpbG9uJDQgPyBbeDEsIE1hdGguYWJzKHN0YXJ0WCAtIHgxKSA8IGVwc2lsb24kNCA/IHN0YXJ0WSA6IHkwXQogICAgICAgICAgICAgICAgICA6IE1hdGguYWJzKGVuZFkgLSB5MCkgPCBlcHNpbG9uJDQgJiYgZW5kWCAtIHgwID4gZXBzaWxvbiQ0ID8gW01hdGguYWJzKHN0YXJ0WSAtIHkwKSA8IGVwc2lsb24kNCA/IHN0YXJ0WCA6IHgwLCB5MF0KICAgICAgICAgICAgICAgICAgOiBudWxsKSkgLSAxKTsKICAgICAgICAgICAgICArK25IYWxmZWRnZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBpZiAobkhhbGZlZGdlcykgY292ZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIElmIHRoZXJlIHdlcmVu4oCZdCBhbnkgZWRnZXMsIGhhdmUgdGhlIGNsb3Nlc3Qgc2l0ZSBjb3ZlciB0aGUgZXh0ZW50LgogICAgICAvLyBJdCBkb2VzbuKAmXQgbWF0dGVyIHdoaWNoIGNvcm5lciBvZiB0aGUgZXh0ZW50IHdlIG1lYXN1cmUhCiAgICAgIGlmIChjb3ZlcikgewogICAgICAgIHZhciBkeCwgZHksIGQyLCBkYyA9IEluZmluaXR5OwoKICAgICAgICBmb3IgKGlDZWxsID0gMCwgY292ZXIgPSBudWxsOyBpQ2VsbCA8IG5DZWxsczsgKytpQ2VsbCkgewogICAgICAgICAgaWYgKGNlbGwgPSBjZWxsc1tpQ2VsbF0pIHsKICAgICAgICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgICAgICAgZHggPSBzaXRlWzBdIC0geDA7CiAgICAgICAgICAgIGR5ID0gc2l0ZVsxXSAtIHkwOwogICAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICAgICAgICBpZiAoZDIgPCBkYykgZGMgPSBkMiwgY292ZXIgPSBjZWxsOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNvdmVyKSB7CiAgICAgICAgICB2YXIgdjAwID0gW3gwLCB5MF0sIHYwMSA9IFt4MCwgeTFdLCB2MTEgPSBbeDEsIHkxXSwgdjEwID0gW3gxLCB5MF07CiAgICAgICAgICBjb3Zlci5oYWxmZWRnZXMucHVzaCgKICAgICAgICAgICAgZWRnZXMucHVzaChjcmVhdGVCb3JkZXJFZGdlKHNpdGUgPSBjb3Zlci5zaXRlLCB2MDAsIHYwMSkpIC0gMSwKICAgICAgICAgICAgZWRnZXMucHVzaChjcmVhdGVCb3JkZXJFZGdlKHNpdGUsIHYwMSwgdjExKSkgLSAxLAogICAgICAgICAgICBlZGdlcy5wdXNoKGNyZWF0ZUJvcmRlckVkZ2Uoc2l0ZSwgdjExLCB2MTApKSAtIDEsCiAgICAgICAgICAgIGVkZ2VzLnB1c2goY3JlYXRlQm9yZGVyRWRnZShzaXRlLCB2MTAsIHYwMCkpIC0gMQogICAgICAgICAgKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIExhc3RseSBkZWxldGUgYW55IGNlbGxzIHdpdGggbm8gZWRnZXM7IHRoZXNlIHdlcmUgZW50aXJlbHkgY2xpcHBlZC4KICAgICAgZm9yIChpQ2VsbCA9IDA7IGlDZWxsIDwgbkNlbGxzOyArK2lDZWxsKSB7CiAgICAgICAgaWYgKGNlbGwgPSBjZWxsc1tpQ2VsbF0pIHsKICAgICAgICAgIGlmICghY2VsbC5oYWxmZWRnZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGRlbGV0ZSBjZWxsc1tpQ2VsbF07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgdmFyIGNpcmNsZVBvb2wgPSBbXTsKCiAgICB2YXIgZmlyc3RDaXJjbGU7CgogICAgZnVuY3Rpb24gQ2lyY2xlKCkgewogICAgICBSZWRCbGFja05vZGUodGhpcyk7CiAgICAgIHRoaXMueCA9CiAgICAgIHRoaXMueSA9CiAgICAgIHRoaXMuYXJjID0KICAgICAgdGhpcy5zaXRlID0KICAgICAgdGhpcy5jeSA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0YWNoQ2lyY2xlKGFyYykgewogICAgICB2YXIgbEFyYyA9IGFyYy5QLAogICAgICAgICAgckFyYyA9IGFyYy5OOwoKICAgICAgaWYgKCFsQXJjIHx8ICFyQXJjKSByZXR1cm47CgogICAgICB2YXIgbFNpdGUgPSBsQXJjLnNpdGUsCiAgICAgICAgICBjU2l0ZSA9IGFyYy5zaXRlLAogICAgICAgICAgclNpdGUgPSByQXJjLnNpdGU7CgogICAgICBpZiAobFNpdGUgPT09IHJTaXRlKSByZXR1cm47CgogICAgICB2YXIgYnggPSBjU2l0ZVswXSwKICAgICAgICAgIGJ5ID0gY1NpdGVbMV0sCiAgICAgICAgICBheCA9IGxTaXRlWzBdIC0gYngsCiAgICAgICAgICBheSA9IGxTaXRlWzFdIC0gYnksCiAgICAgICAgICBjeCA9IHJTaXRlWzBdIC0gYngsCiAgICAgICAgICBjeSA9IHJTaXRlWzFdIC0gYnk7CgogICAgICB2YXIgZCA9IDIgKiAoYXggKiBjeSAtIGF5ICogY3gpOwogICAgICBpZiAoZCA+PSAtZXBzaWxvbjIkMikgcmV0dXJuOwoKICAgICAgdmFyIGhhID0gYXggKiBheCArIGF5ICogYXksCiAgICAgICAgICBoYyA9IGN4ICogY3ggKyBjeSAqIGN5LAogICAgICAgICAgeCA9IChjeSAqIGhhIC0gYXkgKiBoYykgLyBkLAogICAgICAgICAgeSA9IChheCAqIGhjIC0gY3ggKiBoYSkgLyBkOwoKICAgICAgdmFyIGNpcmNsZSA9IGNpcmNsZVBvb2wucG9wKCkgfHwgbmV3IENpcmNsZTsKICAgICAgY2lyY2xlLmFyYyA9IGFyYzsKICAgICAgY2lyY2xlLnNpdGUgPSBjU2l0ZTsKICAgICAgY2lyY2xlLnggPSB4ICsgYng7CiAgICAgIGNpcmNsZS55ID0gKGNpcmNsZS5jeSA9IHkgKyBieSkgKyBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7IC8vIHkgYm90dG9tCgogICAgICBhcmMuY2lyY2xlID0gY2lyY2xlOwoKICAgICAgdmFyIGJlZm9yZSA9IG51bGwsCiAgICAgICAgICBub2RlID0gY2lyY2xlcy5fOwoKICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBpZiAoY2lyY2xlLnkgPCBub2RlLnkgfHwgKGNpcmNsZS55ID09PSBub2RlLnkgJiYgY2lyY2xlLnggPD0gbm9kZS54KSkgewogICAgICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsKICAgICAgICAgIGVsc2UgeyBiZWZvcmUgPSBub2RlLlA7IGJyZWFrOyB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChub2RlLlIpIG5vZGUgPSBub2RlLlI7CiAgICAgICAgICBlbHNlIHsgYmVmb3JlID0gbm9kZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNpcmNsZXMuaW5zZXJ0KGJlZm9yZSwgY2lyY2xlKTsKICAgICAgaWYgKCFiZWZvcmUpIGZpcnN0Q2lyY2xlID0gY2lyY2xlOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldGFjaENpcmNsZShhcmMpIHsKICAgICAgdmFyIGNpcmNsZSA9IGFyYy5jaXJjbGU7CiAgICAgIGlmIChjaXJjbGUpIHsKICAgICAgICBpZiAoIWNpcmNsZS5QKSBmaXJzdENpcmNsZSA9IGNpcmNsZS5OOwogICAgICAgIGNpcmNsZXMucmVtb3ZlKGNpcmNsZSk7CiAgICAgICAgY2lyY2xlUG9vbC5wdXNoKGNpcmNsZSk7CiAgICAgICAgUmVkQmxhY2tOb2RlKGNpcmNsZSk7CiAgICAgICAgYXJjLmNpcmNsZSA9IG51bGw7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgYmVhY2hQb29sID0gW107CgogICAgZnVuY3Rpb24gQmVhY2goKSB7CiAgICAgIFJlZEJsYWNrTm9kZSh0aGlzKTsKICAgICAgdGhpcy5lZGdlID0KICAgICAgdGhpcy5zaXRlID0KICAgICAgdGhpcy5jaXJjbGUgPSBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJlYWNoKHNpdGUpIHsKICAgICAgdmFyIGJlYWNoID0gYmVhY2hQb29sLnBvcCgpIHx8IG5ldyBCZWFjaDsKICAgICAgYmVhY2guc2l0ZSA9IHNpdGU7CiAgICAgIHJldHVybiBiZWFjaDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXRhY2hCZWFjaChiZWFjaCkgewogICAgICBkZXRhY2hDaXJjbGUoYmVhY2gpOwogICAgICBiZWFjaGVzLnJlbW92ZShiZWFjaCk7CiAgICAgIGJlYWNoUG9vbC5wdXNoKGJlYWNoKTsKICAgICAgUmVkQmxhY2tOb2RlKGJlYWNoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVCZWFjaChiZWFjaCkgewogICAgICB2YXIgY2lyY2xlID0gYmVhY2guY2lyY2xlLAogICAgICAgICAgeCA9IGNpcmNsZS54LAogICAgICAgICAgeSA9IGNpcmNsZS5jeSwKICAgICAgICAgIHZlcnRleCA9IFt4LCB5XSwKICAgICAgICAgIHByZXZpb3VzID0gYmVhY2guUCwKICAgICAgICAgIG5leHQgPSBiZWFjaC5OLAogICAgICAgICAgZGlzYXBwZWFyaW5nID0gW2JlYWNoXTsKCiAgICAgIGRldGFjaEJlYWNoKGJlYWNoKTsKCiAgICAgIHZhciBsQXJjID0gcHJldmlvdXM7CiAgICAgIHdoaWxlIChsQXJjLmNpcmNsZQogICAgICAgICAgJiYgTWF0aC5hYnMoeCAtIGxBcmMuY2lyY2xlLngpIDwgZXBzaWxvbiQ0CiAgICAgICAgICAmJiBNYXRoLmFicyh5IC0gbEFyYy5jaXJjbGUuY3kpIDwgZXBzaWxvbiQ0KSB7CiAgICAgICAgcHJldmlvdXMgPSBsQXJjLlA7CiAgICAgICAgZGlzYXBwZWFyaW5nLnVuc2hpZnQobEFyYyk7CiAgICAgICAgZGV0YWNoQmVhY2gobEFyYyk7CiAgICAgICAgbEFyYyA9IHByZXZpb3VzOwogICAgICB9CgogICAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTsKICAgICAgZGV0YWNoQ2lyY2xlKGxBcmMpOwoKICAgICAgdmFyIHJBcmMgPSBuZXh0OwogICAgICB3aGlsZSAockFyYy5jaXJjbGUKICAgICAgICAgICYmIE1hdGguYWJzKHggLSByQXJjLmNpcmNsZS54KSA8IGVwc2lsb24kNAogICAgICAgICAgJiYgTWF0aC5hYnMoeSAtIHJBcmMuY2lyY2xlLmN5KSA8IGVwc2lsb24kNCkgewogICAgICAgIG5leHQgPSByQXJjLk47CiAgICAgICAgZGlzYXBwZWFyaW5nLnB1c2gockFyYyk7CiAgICAgICAgZGV0YWNoQmVhY2gockFyYyk7CiAgICAgICAgckFyYyA9IG5leHQ7CiAgICAgIH0KCiAgICAgIGRpc2FwcGVhcmluZy5wdXNoKHJBcmMpOwogICAgICBkZXRhY2hDaXJjbGUockFyYyk7CgogICAgICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLAogICAgICAgICAgaUFyYzsKICAgICAgZm9yIChpQXJjID0gMTsgaUFyYyA8IG5BcmNzOyArK2lBcmMpIHsKICAgICAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdOwogICAgICAgIGxBcmMgPSBkaXNhcHBlYXJpbmdbaUFyYyAtIDFdOwogICAgICAgIHNldEVkZ2VFbmQockFyYy5lZGdlLCBsQXJjLnNpdGUsIHJBcmMuc2l0ZSwgdmVydGV4KTsKICAgICAgfQoKICAgICAgbEFyYyA9IGRpc2FwcGVhcmluZ1swXTsKICAgICAgckFyYyA9IGRpc2FwcGVhcmluZ1tuQXJjcyAtIDFdOwogICAgICByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlKGxBcmMuc2l0ZSwgckFyYy5zaXRlLCBudWxsLCB2ZXJ0ZXgpOwoKICAgICAgYXR0YWNoQ2lyY2xlKGxBcmMpOwogICAgICBhdHRhY2hDaXJjbGUockFyYyk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQmVhY2goc2l0ZSkgewogICAgICB2YXIgeCA9IHNpdGVbMF0sCiAgICAgICAgICBkaXJlY3RyaXggPSBzaXRlWzFdLAogICAgICAgICAgbEFyYywKICAgICAgICAgIHJBcmMsCiAgICAgICAgICBkeGwsCiAgICAgICAgICBkeHIsCiAgICAgICAgICBub2RlID0gYmVhY2hlcy5fOwoKICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBkeGwgPSBsZWZ0QnJlYWtQb2ludChub2RlLCBkaXJlY3RyaXgpIC0geDsKICAgICAgICBpZiAoZHhsID4gZXBzaWxvbiQ0KSBub2RlID0gbm9kZS5MOyBlbHNlIHsKICAgICAgICAgIGR4ciA9IHggLSByaWdodEJyZWFrUG9pbnQobm9kZSwgZGlyZWN0cml4KTsKICAgICAgICAgIGlmIChkeHIgPiBlcHNpbG9uJDQpIHsKICAgICAgICAgICAgaWYgKCFub2RlLlIpIHsKICAgICAgICAgICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBub2RlID0gbm9kZS5SOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGR4bCA+IC1lcHNpbG9uJDQpIHsKICAgICAgICAgICAgICBsQXJjID0gbm9kZS5QOwogICAgICAgICAgICAgIHJBcmMgPSBub2RlOwogICAgICAgICAgICB9IGVsc2UgaWYgKGR4ciA+IC1lcHNpbG9uJDQpIHsKICAgICAgICAgICAgICBsQXJjID0gbm9kZTsKICAgICAgICAgICAgICByQXJjID0gbm9kZS5OOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGxBcmMgPSByQXJjID0gbm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNyZWF0ZUNlbGwoc2l0ZSk7CiAgICAgIHZhciBuZXdBcmMgPSBjcmVhdGVCZWFjaChzaXRlKTsKICAgICAgYmVhY2hlcy5pbnNlcnQobEFyYywgbmV3QXJjKTsKCiAgICAgIGlmICghbEFyYyAmJiAhckFyYykgcmV0dXJuOwoKICAgICAgaWYgKGxBcmMgPT09IHJBcmMpIHsKICAgICAgICBkZXRhY2hDaXJjbGUobEFyYyk7CiAgICAgICAgckFyYyA9IGNyZWF0ZUJlYWNoKGxBcmMuc2l0ZSk7CiAgICAgICAgYmVhY2hlcy5pbnNlcnQobmV3QXJjLCByQXJjKTsKICAgICAgICBuZXdBcmMuZWRnZSA9IHJBcmMuZWRnZSA9IGNyZWF0ZUVkZ2UobEFyYy5zaXRlLCBuZXdBcmMuc2l0ZSk7CiAgICAgICAgYXR0YWNoQ2lyY2xlKGxBcmMpOwogICAgICAgIGF0dGFjaENpcmNsZShyQXJjKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIGlmICghckFyYykgeyAvLyAmJiBsQXJjCiAgICAgICAgbmV3QXJjLmVkZ2UgPSBjcmVhdGVFZGdlKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgLy8gZWxzZSBsQXJjICE9PSByQXJjCiAgICAgIGRldGFjaENpcmNsZShsQXJjKTsKICAgICAgZGV0YWNoQ2lyY2xlKHJBcmMpOwoKICAgICAgdmFyIGxTaXRlID0gbEFyYy5zaXRlLAogICAgICAgICAgYXggPSBsU2l0ZVswXSwKICAgICAgICAgIGF5ID0gbFNpdGVbMV0sCiAgICAgICAgICBieCA9IHNpdGVbMF0gLSBheCwKICAgICAgICAgIGJ5ID0gc2l0ZVsxXSAtIGF5LAogICAgICAgICAgclNpdGUgPSByQXJjLnNpdGUsCiAgICAgICAgICBjeCA9IHJTaXRlWzBdIC0gYXgsCiAgICAgICAgICBjeSA9IHJTaXRlWzFdIC0gYXksCiAgICAgICAgICBkID0gMiAqIChieCAqIGN5IC0gYnkgKiBjeCksCiAgICAgICAgICBoYiA9IGJ4ICogYnggKyBieSAqIGJ5LAogICAgICAgICAgaGMgPSBjeCAqIGN4ICsgY3kgKiBjeSwKICAgICAgICAgIHZlcnRleCA9IFsoY3kgKiBoYiAtIGJ5ICogaGMpIC8gZCArIGF4LCAoYnggKiBoYyAtIGN4ICogaGIpIC8gZCArIGF5XTsKCiAgICAgIHNldEVkZ2VFbmQockFyYy5lZGdlLCBsU2l0ZSwgclNpdGUsIHZlcnRleCk7CiAgICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZShsU2l0ZSwgc2l0ZSwgbnVsbCwgdmVydGV4KTsKICAgICAgckFyYy5lZGdlID0gY3JlYXRlRWRnZShzaXRlLCByU2l0ZSwgbnVsbCwgdmVydGV4KTsKICAgICAgYXR0YWNoQ2lyY2xlKGxBcmMpOwogICAgICBhdHRhY2hDaXJjbGUockFyYyk7CiAgICB9CgogICAgZnVuY3Rpb24gbGVmdEJyZWFrUG9pbnQoYXJjLCBkaXJlY3RyaXgpIHsKICAgICAgdmFyIHNpdGUgPSBhcmMuc2l0ZSwKICAgICAgICAgIHJmb2N4ID0gc2l0ZVswXSwKICAgICAgICAgIHJmb2N5ID0gc2l0ZVsxXSwKICAgICAgICAgIHBieTIgPSByZm9jeSAtIGRpcmVjdHJpeDsKCiAgICAgIGlmICghcGJ5MikgcmV0dXJuIHJmb2N4OwoKICAgICAgdmFyIGxBcmMgPSBhcmMuUDsKICAgICAgaWYgKCFsQXJjKSByZXR1cm4gLUluZmluaXR5OwoKICAgICAgc2l0ZSA9IGxBcmMuc2l0ZTsKICAgICAgdmFyIGxmb2N4ID0gc2l0ZVswXSwKICAgICAgICAgIGxmb2N5ID0gc2l0ZVsxXSwKICAgICAgICAgIHBsYnkyID0gbGZvY3kgLSBkaXJlY3RyaXg7CgogICAgICBpZiAoIXBsYnkyKSByZXR1cm4gbGZvY3g7CgogICAgICB2YXIgaGwgPSBsZm9jeCAtIHJmb2N4LAogICAgICAgICAgYWJ5MiA9IDEgLyBwYnkyIC0gMSAvIHBsYnkyLAogICAgICAgICAgYiA9IGhsIC8gcGxieTI7CgogICAgICBpZiAoYWJ5MikgcmV0dXJuICgtYiArIE1hdGguc3FydChiICogYiAtIDIgKiBhYnkyICogKGhsICogaGwgLyAoLTIgKiBwbGJ5MikgLSBsZm9jeSArIHBsYnkyIC8gMiArIHJmb2N5IC0gcGJ5MiAvIDIpKSkgLyBhYnkyICsgcmZvY3g7CgogICAgICByZXR1cm4gKHJmb2N4ICsgbGZvY3gpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiByaWdodEJyZWFrUG9pbnQoYXJjLCBkaXJlY3RyaXgpIHsKICAgICAgdmFyIHJBcmMgPSBhcmMuTjsKICAgICAgaWYgKHJBcmMpIHJldHVybiBsZWZ0QnJlYWtQb2ludChyQXJjLCBkaXJlY3RyaXgpOwogICAgICB2YXIgc2l0ZSA9IGFyYy5zaXRlOwogICAgICByZXR1cm4gc2l0ZVsxXSA9PT0gZGlyZWN0cml4ID8gc2l0ZVswXSA6IEluZmluaXR5OwogICAgfQoKICAgIHZhciBlcHNpbG9uJDQgPSAxZS02OwogICAgdmFyIGVwc2lsb24yJDIgPSAxZS0xMjsKICAgIHZhciBiZWFjaGVzOwogICAgdmFyIGNlbGxzOwogICAgdmFyIGNpcmNsZXM7CiAgICB2YXIgZWRnZXM7CgogICAgZnVuY3Rpb24gdHJpYW5nbGVBcmVhKGEsIGIsIGMpIHsKICAgICAgcmV0dXJuIChhWzBdIC0gY1swXSkgKiAoYlsxXSAtIGFbMV0pIC0gKGFbMF0gLSBiWzBdKSAqIChjWzFdIC0gYVsxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGV4aWNvZ3JhcGhpYyhhLCBiKSB7CiAgICAgIHJldHVybiBiWzFdIC0gYVsxXQogICAgICAgICAgfHwgYlswXSAtIGFbMF07CiAgICB9CgogICAgZnVuY3Rpb24gRGlhZ3JhbShzaXRlcywgZXh0ZW50KSB7CiAgICAgIHZhciBzaXRlID0gc2l0ZXMuc29ydChsZXhpY29ncmFwaGljKS5wb3AoKSwKICAgICAgICAgIHgsCiAgICAgICAgICB5LAogICAgICAgICAgY2lyY2xlOwoKICAgICAgZWRnZXMgPSBbXTsKICAgICAgY2VsbHMgPSBuZXcgQXJyYXkoc2l0ZXMubGVuZ3RoKTsKICAgICAgYmVhY2hlcyA9IG5ldyBSZWRCbGFja1RyZWU7CiAgICAgIGNpcmNsZXMgPSBuZXcgUmVkQmxhY2tUcmVlOwoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBjaXJjbGUgPSBmaXJzdENpcmNsZTsKICAgICAgICBpZiAoc2l0ZSAmJiAoIWNpcmNsZSB8fCBzaXRlWzFdIDwgY2lyY2xlLnkgfHwgKHNpdGVbMV0gPT09IGNpcmNsZS55ICYmIHNpdGVbMF0gPCBjaXJjbGUueCkpKSB7CiAgICAgICAgICBpZiAoc2l0ZVswXSAhPT0geCB8fCBzaXRlWzFdICE9PSB5KSB7CiAgICAgICAgICAgIGFkZEJlYWNoKHNpdGUpOwogICAgICAgICAgICB4ID0gc2l0ZVswXSwgeSA9IHNpdGVbMV07CiAgICAgICAgICB9CiAgICAgICAgICBzaXRlID0gc2l0ZXMucG9wKCk7CiAgICAgICAgfSBlbHNlIGlmIChjaXJjbGUpIHsKICAgICAgICAgIHJlbW92ZUJlYWNoKGNpcmNsZS5hcmMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNvcnRDZWxsSGFsZmVkZ2VzKCk7CgogICAgICBpZiAoZXh0ZW50KSB7CiAgICAgICAgdmFyIHgwID0gK2V4dGVudFswXVswXSwKICAgICAgICAgICAgeTAgPSArZXh0ZW50WzBdWzFdLAogICAgICAgICAgICB4MSA9ICtleHRlbnRbMV1bMF0sCiAgICAgICAgICAgIHkxID0gK2V4dGVudFsxXVsxXTsKICAgICAgICBjbGlwRWRnZXMoeDAsIHkwLCB4MSwgeTEpOwogICAgICAgIGNsaXBDZWxscyh4MCwgeTAsIHgxLCB5MSk7CiAgICAgIH0KCiAgICAgIHRoaXMuZWRnZXMgPSBlZGdlczsKICAgICAgdGhpcy5jZWxscyA9IGNlbGxzOwoKICAgICAgYmVhY2hlcyA9CiAgICAgIGNpcmNsZXMgPQogICAgICBlZGdlcyA9CiAgICAgIGNlbGxzID0gbnVsbDsKICAgIH0KCiAgICBEaWFncmFtLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IERpYWdyYW0sCgogICAgICBwb2x5Z29uczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVkZ2VzID0gdGhpcy5lZGdlczsKCiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHMubWFwKGZ1bmN0aW9uKGNlbGwpIHsKICAgICAgICAgIHZhciBwb2x5Z29uID0gY2VsbC5oYWxmZWRnZXMubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIGNlbGxIYWxmZWRnZVN0YXJ0KGNlbGwsIGVkZ2VzW2ldKTsgfSk7CiAgICAgICAgICBwb2x5Z29uLmRhdGEgPSBjZWxsLnNpdGUuZGF0YTsKICAgICAgICAgIHJldHVybiBwb2x5Z29uOwogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgdHJpYW5nbGVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdHJpYW5nbGVzID0gW10sCiAgICAgICAgICAgIGVkZ2VzID0gdGhpcy5lZGdlczsKCiAgICAgICAgdGhpcy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGkpIHsKICAgICAgICAgIGlmICghKG0gPSAoaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRnZXMpLmxlbmd0aCkpIHJldHVybjsKICAgICAgICAgIHZhciBzaXRlID0gY2VsbC5zaXRlLAogICAgICAgICAgICAgIGhhbGZlZGdlcywKICAgICAgICAgICAgICBqID0gLTEsCiAgICAgICAgICAgICAgbSwKICAgICAgICAgICAgICBzMCwKICAgICAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1ttIC0gMV1dLAogICAgICAgICAgICAgIHMxID0gZTEubGVmdCA9PT0gc2l0ZSA/IGUxLnJpZ2h0IDogZTEubGVmdDsKCiAgICAgICAgICB3aGlsZSAoKytqIDwgbSkgewogICAgICAgICAgICBzMCA9IHMxOwogICAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1tqXV07CiAgICAgICAgICAgIHMxID0gZTEubGVmdCA9PT0gc2l0ZSA/IGUxLnJpZ2h0IDogZTEubGVmdDsKICAgICAgICAgICAgaWYgKHMwICYmIHMxICYmIGkgPCBzMC5pbmRleCAmJiBpIDwgczEuaW5kZXggJiYgdHJpYW5nbGVBcmVhKHNpdGUsIHMwLCBzMSkgPCAwKSB7CiAgICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2goW3NpdGUuZGF0YSwgczAuZGF0YSwgczEuZGF0YV0pOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiB0cmlhbmdsZXM7CiAgICAgIH0sCgogICAgICBsaW5rczogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuZWRnZXMuZmlsdGVyKGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgICAgIHJldHVybiBlZGdlLnJpZ2h0OwogICAgICAgIH0pLm1hcChmdW5jdGlvbihlZGdlKSB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzb3VyY2U6IGVkZ2UubGVmdC5kYXRhLAogICAgICAgICAgICB0YXJnZXQ6IGVkZ2UucmlnaHQuZGF0YQogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIGZpbmQ6IGZ1bmN0aW9uKHgsIHksIHJhZGl1cykgewogICAgICAgIHZhciB0aGF0ID0gdGhpcywgaTAsIGkxID0gdGhhdC5fZm91bmQgfHwgMCwgbiA9IHRoYXQuY2VsbHMubGVuZ3RoLCBjZWxsOwoKICAgICAgICAvLyBVc2UgdGhlIHByZXZpb3VzbHktZm91bmQgY2VsbCwgb3Igc3RhcnQgd2l0aCBhbiBhcmJpdHJhcnkgb25lLgogICAgICAgIHdoaWxlICghKGNlbGwgPSB0aGF0LmNlbGxzW2kxXSkpIGlmICgrK2kxID49IG4pIHJldHVybiBudWxsOwogICAgICAgIHZhciBkeCA9IHggLSBjZWxsLnNpdGVbMF0sIGR5ID0geSAtIGNlbGwuc2l0ZVsxXSwgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKCiAgICAgICAgLy8gVHJhdmVyc2UgdGhlIGhhbGYtZWRnZXMgdG8gZmluZCBhIGNsb3NlciBjZWxsLCBpZiBhbnkuCiAgICAgICAgZG8gewogICAgICAgICAgY2VsbCA9IHRoYXQuY2VsbHNbaTAgPSBpMV0sIGkxID0gbnVsbDsKICAgICAgICAgIGNlbGwuaGFsZmVkZ2VzLmZvckVhY2goZnVuY3Rpb24oZSkgewogICAgICAgICAgICB2YXIgZWRnZSA9IHRoYXQuZWRnZXNbZV0sIHYgPSBlZGdlLmxlZnQ7CiAgICAgICAgICAgIGlmICgodiA9PT0gY2VsbC5zaXRlIHx8ICF2KSAmJiAhKHYgPSBlZGdlLnJpZ2h0KSkgcmV0dXJuOwogICAgICAgICAgICB2YXIgdnggPSB4IC0gdlswXSwgdnkgPSB5IC0gdlsxXSwgdjIgPSB2eCAqIHZ4ICsgdnkgKiB2eTsKICAgICAgICAgICAgaWYgKHYyIDwgZDIpIGQyID0gdjIsIGkxID0gdi5pbmRleDsKICAgICAgICAgIH0pOwogICAgICAgIH0gd2hpbGUgKGkxICE9PSBudWxsKTsKCiAgICAgICAgdGhhdC5fZm91bmQgPSBpMDsKCiAgICAgICAgcmV0dXJuIHJhZGl1cyA9PSBudWxsIHx8IGQyIDw9IHJhZGl1cyAqIHJhZGl1cyA/IGNlbGwuc2l0ZSA6IG51bGw7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdm9yb25vaSgpIHsKICAgICAgdmFyIHggPSB4JDQsCiAgICAgICAgICB5ID0geSQ0LAogICAgICAgICAgZXh0ZW50ID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIHZvcm9ub2koZGF0YSkgewogICAgICAgIHJldHVybiBuZXcgRGlhZ3JhbShkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgICB2YXIgcyA9IFtNYXRoLnJvdW5kKHgoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJDQpICogZXBzaWxvbiQ0LCBNYXRoLnJvdW5kKHkoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJDQpICogZXBzaWxvbiQ0XTsKICAgICAgICAgIHMuaW5kZXggPSBpOwogICAgICAgICAgcy5kYXRhID0gZDsKICAgICAgICAgIHJldHVybiBzOwogICAgICAgIH0pLCBleHRlbnQpOwogICAgICB9CgogICAgICB2b3Jvbm9pLnBvbHlnb25zID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiB2b3Jvbm9pKGRhdGEpLnBvbHlnb25zKCk7CiAgICAgIH07CgogICAgICB2b3Jvbm9pLmxpbmtzID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiB2b3Jvbm9pKGRhdGEpLmxpbmtzKCk7CiAgICAgIH07CgogICAgICB2b3Jvbm9pLnRyaWFuZ2xlcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gdm9yb25vaShkYXRhKS50cmlhbmdsZXMoKTsKICAgICAgfTsKCiAgICAgIHZvcm9ub2kueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYygrXyksIHZvcm9ub2kpIDogeDsKICAgICAgfTsKCiAgICAgIHZvcm9ub2kueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkYygrXyksIHZvcm9ub2kpIDogeTsKICAgICAgfTsKCiAgICAgIHZvcm9ub2kuZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IF8gPT0gbnVsbCA/IG51bGwgOiBbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSwgdm9yb25vaSkgOiBleHRlbnQgJiYgW1tleHRlbnRbMF1bMF0sIGV4dGVudFswXVsxXV0sIFtleHRlbnRbMV1bMF0sIGV4dGVudFsxXVsxXV1dOwogICAgICB9OwoKICAgICAgdm9yb25vaS5zaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IF8gPT0gbnVsbCA/IG51bGwgOiBbWzAsIDBdLCBbK19bMF0sICtfWzFdXV0sIHZvcm9ub2kpIDogZXh0ZW50ICYmIFtleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sIGV4dGVudFsxXVsxXSAtIGV4dGVudFswXVsxXV07CiAgICAgIH07CgogICAgICByZXR1cm4gdm9yb25vaTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudCRkKHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIFpvb21FdmVudCh0YXJnZXQsIHR5cGUsIHRyYW5zZm9ybSkgewogICAgICB0aGlzLnRhcmdldCA9IHRhcmdldDsKICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgdGhpcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm07CiAgICB9CgogICAgZnVuY3Rpb24gVHJhbnNmb3JtKGssIHgsIHkpIHsKICAgICAgdGhpcy5rID0gazsKICAgICAgdGhpcy54ID0geDsKICAgICAgdGhpcy55ID0geTsKICAgIH0KCiAgICBUcmFuc2Zvcm0ucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtLAogICAgICBzY2FsZTogZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiBrID09PSAxID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0odGhpcy5rICogaywgdGhpcy54LCB0aGlzLnkpOwogICAgICB9LAogICAgICB0cmFuc2xhdGU6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICByZXR1cm4geCA9PT0gMCAmIHkgPT09IDAgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwogICAgICB9LAogICAgICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHsKICAgICAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07CiAgICAgIH0sCiAgICAgIGFwcGx5WDogZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OwogICAgICB9LAogICAgICBhcHBseVk6IGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKICAgICAgfSwKICAgICAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikgewogICAgICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107CiAgICAgIH0sCiAgICAgIGludmVydFg6IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rOwogICAgICB9LAogICAgICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7CiAgICAgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKICAgICAgfSwKICAgICAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTsKICAgICAgfSwKICAgICAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwogICAgICB9CiAgICB9OwoKICAgIHZhciBpZGVudGl0eSQ5ID0gbmV3IFRyYW5zZm9ybSgxLCAwLCAwKTsKCiAgICB0cmFuc2Zvcm0kMS5wcm90b3R5cGUgPSBUcmFuc2Zvcm0ucHJvdG90eXBlOwoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybSQxKG5vZGUpIHsKICAgICAgd2hpbGUgKCFub2RlLl9fem9vbSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybiBpZGVudGl0eSQ5OwogICAgICByZXR1cm4gbm9kZS5fX3pvb207CiAgICB9CgogICAgZnVuY3Rpb24gbm9wcm9wYWdhdGlvbiQyKCkgewogICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2V2ZW50JDIoKSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgfQoKICAgIC8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgogICAgZnVuY3Rpb24gZGVmYXVsdEZpbHRlciQyKCkgewogICAgICByZXR1cm4gIWV2ZW50LmN0cmxLZXkgJiYgIWV2ZW50LmJ1dHRvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0RXh0ZW50JDEoKSB7CiAgICAgIHZhciBlID0gdGhpczsKICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7CiAgICAgICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7CiAgICAgICAgaWYgKGUuaGFzQXR0cmlidXRlKCJ2aWV3Qm94IikpIHsKICAgICAgICAgIGUgPSBlLnZpZXdCb3guYmFzZVZhbDsKICAgICAgICAgIHJldHVybiBbW2UueCwgZS55XSwgW2UueCArIGUud2lkdGgsIGUueSArIGUuaGVpZ2h0XV07CiAgICAgICAgfQogICAgICAgIHJldHVybiBbWzAsIDBdLCBbZS53aWR0aC5iYXNlVmFsLnZhbHVlLCBlLmhlaWdodC5iYXNlVmFsLnZhbHVlXV07CiAgICAgIH0KICAgICAgcmV0dXJuIFtbMCwgMF0sIFtlLmNsaWVudFdpZHRoLCBlLmNsaWVudEhlaWdodF1dOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRUcmFuc2Zvcm0oKSB7CiAgICAgIHJldHVybiB0aGlzLl9fem9vbSB8fCBpZGVudGl0eSQ5OwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRXaGVlbERlbHRhKCkgewogICAgICByZXR1cm4gLWV2ZW50LmRlbHRhWSAqIChldmVudC5kZWx0YU1vZGUgPT09IDEgPyAwLjA1IDogZXZlbnQuZGVsdGFNb2RlID8gMSA6IDAuMDAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0VG91Y2hhYmxlJDIoKSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKCJvbnRvdWNoc3RhcnQiIGluIHRoaXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRDb25zdHJhaW4odHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkgewogICAgICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSwKICAgICAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sCiAgICAgICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLAogICAgICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTsKICAgICAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoCiAgICAgICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLAogICAgICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKQogICAgICApOwogICAgfQoKICAgIGZ1bmN0aW9uIHpvb20oKSB7CiAgICAgIHZhciBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyJDIsCiAgICAgICAgICBleHRlbnQgPSBkZWZhdWx0RXh0ZW50JDEsCiAgICAgICAgICBjb25zdHJhaW4gPSBkZWZhdWx0Q29uc3RyYWluLAogICAgICAgICAgd2hlZWxEZWx0YSA9IGRlZmF1bHRXaGVlbERlbHRhLAogICAgICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSQyLAogICAgICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLAogICAgICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSwKICAgICAgICAgIGR1cmF0aW9uID0gMjUwLAogICAgICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20sCiAgICAgICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaCgic3RhcnQiLCAiem9vbSIsICJlbmQiKSwKICAgICAgICAgIHRvdWNoc3RhcnRpbmcsCiAgICAgICAgICB0b3VjaGVuZGluZywKICAgICAgICAgIHRvdWNoRGVsYXkgPSA1MDAsCiAgICAgICAgICB3aGVlbERlbGF5ID0gMTUwLAogICAgICAgICAgY2xpY2tEaXN0YW5jZTIgPSAwOwoKICAgICAgZnVuY3Rpb24gem9vbShzZWxlY3Rpb24pIHsKICAgICAgICBzZWxlY3Rpb24KICAgICAgICAgICAgLnByb3BlcnR5KCJfX3pvb20iLCBkZWZhdWx0VHJhbnNmb3JtKQogICAgICAgICAgICAub24oIndoZWVsLnpvb20iLCB3aGVlbGVkKQogICAgICAgICAgICAub24oIm1vdXNlZG93bi56b29tIiwgbW91c2Vkb3duZWQpCiAgICAgICAgICAgIC5vbigiZGJsY2xpY2suem9vbSIsIGRibGNsaWNrZWQpCiAgICAgICAgICAuZmlsdGVyKHRvdWNoYWJsZSkKICAgICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0Lnpvb20iLCB0b3VjaHN0YXJ0ZWQpCiAgICAgICAgICAgIC5vbigidG91Y2htb3ZlLnpvb20iLCB0b3VjaG1vdmVkKQogICAgICAgICAgICAub24oInRvdWNoZW5kLnpvb20gdG91Y2hjYW5jZWwuem9vbSIsIHRvdWNoZW5kZWQpCiAgICAgICAgICAgIC5zdHlsZSgidG91Y2gtYWN0aW9uIiwgIm5vbmUiKQogICAgICAgICAgICAuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsICJyZ2JhKDAsMCwwLDApIik7CiAgICAgIH0KCiAgICAgIHpvb20udHJhbnNmb3JtID0gZnVuY3Rpb24oY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCkgewogICAgICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uOwogICAgICAgIHNlbGVjdGlvbi5wcm9wZXJ0eSgiX196b29tIiwgZGVmYXVsdFRyYW5zZm9ybSk7CiAgICAgICAgaWYgKGNvbGxlY3Rpb24gIT09IHNlbGVjdGlvbikgewogICAgICAgICAgc2NoZWR1bGUoY29sbGVjdGlvbiwgdHJhbnNmb3JtLCBwb2ludCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHNlbGVjdGlvbi5pbnRlcnJ1cHQoKS5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgICBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cykKICAgICAgICAgICAgICAgIC5zdGFydCgpCiAgICAgICAgICAgICAgICAuem9vbShudWxsLCB0eXBlb2YgdHJhbnNmb3JtID09PSAiZnVuY3Rpb24iID8gdHJhbnNmb3JtLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB0cmFuc2Zvcm0pCiAgICAgICAgICAgICAgICAuZW5kKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH07CgogICAgICB6b29tLnNjYWxlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIGssIHApIHsKICAgICAgICB6b29tLnNjYWxlVG8oc2VsZWN0aW9uLCBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBrMCA9IHRoaXMuX196b29tLmssCiAgICAgICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gImZ1bmN0aW9uIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7CiAgICAgICAgICByZXR1cm4gazAgKiBrMTsKICAgICAgICB9LCBwKTsKICAgICAgfTsKCiAgICAgIHpvb20uc2NhbGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgaywgcCkgewogICAgICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgICAgICAgIHQwID0gdGhpcy5fX3pvb20sCiAgICAgICAgICAgICAgcDAgPSBwID09IG51bGwgPyBjZW50cm9pZChlKSA6IHR5cGVvZiBwID09PSAiZnVuY3Rpb24iID8gcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogcCwKICAgICAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksCiAgICAgICAgICAgICAgazEgPSB0eXBlb2YgayA9PT0gImZ1bmN0aW9uIiA/IGsuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGs7CiAgICAgICAgICByZXR1cm4gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBlLCB0cmFuc2xhdGVFeHRlbnQpOwogICAgICAgIH0sIHApOwogICAgICB9OwoKICAgICAgem9vbS50cmFuc2xhdGVCeSA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSkgewogICAgICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gY29uc3RyYWluKHRoaXMuX196b29tLnRyYW5zbGF0ZSgKICAgICAgICAgICAgdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB4LAogICAgICAgICAgICB0eXBlb2YgeSA9PT0gImZ1bmN0aW9uIiA/IHkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IHkKICAgICAgICAgICksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpOwogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgem9vbS50cmFuc2xhdGVUbyA9IGZ1bmN0aW9uKHNlbGVjdGlvbiwgeCwgeSwgcCkgewogICAgICAgIHpvb20udHJhbnNmb3JtKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgZSA9IGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgICAgICAgIHQgPSB0aGlzLl9fem9vbSwKICAgICAgICAgICAgICBwMCA9IHAgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHAgPT09ICJmdW5jdGlvbiIgPyBwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBwOwogICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eSQ5LnRyYW5zbGF0ZShwMFswXSwgcDBbMV0pLnNjYWxlKHQuaykudHJhbnNsYXRlKAogICAgICAgICAgICB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IC14LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiAteCwKICAgICAgICAgICAgdHlwZW9mIHkgPT09ICJmdW5jdGlvbiIgPyAteS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXkKICAgICAgICAgICksIGUsIHRyYW5zbGF0ZUV4dGVudCk7CiAgICAgICAgfSwgcCk7CiAgICAgIH07CgogICAgICBmdW5jdGlvbiBzY2FsZSh0cmFuc2Zvcm0sIGspIHsKICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCBrKSk7CiAgICAgICAgcmV0dXJuIGsgPT09IHRyYW5zZm9ybS5rID8gdHJhbnNmb3JtIDogbmV3IFRyYW5zZm9ybShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHsKICAgICAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uazsKICAgICAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtKHRyYW5zZm9ybS5rLCB4LCB5KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY2VudHJvaWQoZXh0ZW50KSB7CiAgICAgICAgcmV0dXJuIFsoK2V4dGVudFswXVswXSArICtleHRlbnRbMV1bMF0pIC8gMiwgKCtleHRlbnRbMF1bMV0gKyArZXh0ZW50WzFdWzFdKSAvIDJdOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzY2hlZHVsZSh0cmFuc2l0aW9uLCB0cmFuc2Zvcm0sIHBvaW50KSB7CiAgICAgICAgdHJhbnNpdGlvbgogICAgICAgICAgICAub24oInN0YXJ0Lnpvb20iLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLnN0YXJ0KCk7IH0pCiAgICAgICAgICAgIC5vbigiaW50ZXJydXB0Lnpvb20gZW5kLnpvb20iLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgICAudHdlZW4oInpvb20iLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLAogICAgICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLAogICAgICAgICAgICAgICAgICBwID0gcG9pbnQgPT0gbnVsbCA/IGNlbnRyb2lkKGUpIDogdHlwZW9mIHBvaW50ID09PSAiZnVuY3Rpb24iID8gcG9pbnQuYXBwbHkodGhhdCwgYXJncykgOiBwb2ludCwKICAgICAgICAgICAgICAgICAgdyA9IE1hdGgubWF4KGVbMV1bMF0gLSBlWzBdWzBdLCBlWzFdWzFdIC0gZVswXVsxXSksCiAgICAgICAgICAgICAgICAgIGEgPSB0aGF0Ll9fem9vbSwKICAgICAgICAgICAgICAgICAgYiA9IHR5cGVvZiB0cmFuc2Zvcm0gPT09ICJmdW5jdGlvbiIgPyB0cmFuc2Zvcm0uYXBwbHkodGhhdCwgYXJncykgOiB0cmFuc2Zvcm0sCiAgICAgICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZShhLmludmVydChwKS5jb25jYXQodyAvIGEuayksIGIuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYi5rKSk7CiAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICAgIGlmICh0ID09PSAxKSB0ID0gYjsgLy8gQXZvaWQgcm91bmRpbmcgZXJyb3Igb24gZW5kLgogICAgICAgICAgICAgICAgZWxzZSB7IHZhciBsID0gaSh0KSwgayA9IHcgLyBsWzJdOyB0ID0gbmV3IFRyYW5zZm9ybShrLCBwWzBdIC0gbFswXSAqIGssIHBbMV0gLSBsWzFdICogayk7IH0KICAgICAgICAgICAgICAgIGcuem9vbShudWxsLCB0KTsKICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZ2VzdHVyZSh0aGF0LCBhcmdzLCBjbGVhbikgewogICAgICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX196b29taW5nKSB8fCBuZXcgR2VzdHVyZSh0aGF0LCBhcmdzKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gR2VzdHVyZSh0aGF0LCBhcmdzKSB7CiAgICAgICAgdGhpcy50aGF0ID0gdGhhdDsKICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgICAgIHRoaXMuYWN0aXZlID0gMDsKICAgICAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgICB0aGlzLnRhcHMgPSAwOwogICAgICB9CgogICAgICBHZXN0dXJlLnByb3RvdHlwZSA9IHsKICAgICAgICBzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgewogICAgICAgICAgICB0aGlzLnRoYXQuX196b29taW5nID0gdGhpczsKICAgICAgICAgICAgdGhpcy5lbWl0KCJzdGFydCIpOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICB6b29tOiBmdW5jdGlvbihrZXksIHRyYW5zZm9ybSkgewogICAgICAgICAgaWYgKHRoaXMubW91c2UgJiYga2V5ICE9PSAibW91c2UiKSB0aGlzLm1vdXNlWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLm1vdXNlWzBdKTsKICAgICAgICAgIGlmICh0aGlzLnRvdWNoMCAmJiBrZXkgIT09ICJ0b3VjaCIpIHRoaXMudG91Y2gwWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMFswXSk7CiAgICAgICAgICBpZiAodGhpcy50b3VjaDEgJiYga2V5ICE9PSAidG91Y2giKSB0aGlzLnRvdWNoMVsxXSA9IHRyYW5zZm9ybS5pbnZlcnQodGhpcy50b3VjaDFbMF0pOwogICAgICAgICAgdGhpcy50aGF0Ll9fem9vbSA9IHRyYW5zZm9ybTsKICAgICAgICAgIHRoaXMuZW1pdCgiem9vbSIpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBlbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKC0tdGhpcy5hY3RpdmUgPT09IDApIHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMudGhhdC5fX3pvb21pbmc7CiAgICAgICAgICAgIHRoaXMuZW1pdCgiZW5kIik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGVtaXQ6IGZ1bmN0aW9uKHR5cGUpIHsKICAgICAgICAgIGN1c3RvbUV2ZW50KG5ldyBab29tRXZlbnQoem9vbSwgdHlwZSwgdGhpcy50aGF0Ll9fem9vbSksIGxpc3RlbmVycy5hcHBseSwgbGlzdGVuZXJzLCBbdHlwZSwgdGhpcy50aGF0LCB0aGlzLmFyZ3NdKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBmdW5jdGlvbiB3aGVlbGVkKCkgewogICAgICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgdCA9IHRoaXMuX196b29tLAogICAgICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksCiAgICAgICAgICAgIHAgPSBtb3VzZSh0aGlzKTsKCiAgICAgICAgLy8gSWYgdGhlIG1vdXNlIGlzIGluIHRoZSBzYW1lIGxvY2F0aW9uIGFzIGJlZm9yZSwgcmV1c2UgaXQuCiAgICAgICAgLy8gSWYgdGhlcmUgd2VyZSByZWNlbnQgd2hlZWwgZXZlbnRzLCByZXNldCB0aGUgd2hlZWwgaWRsZSB0aW1lb3V0LgogICAgICAgIGlmIChnLndoZWVsKSB7CiAgICAgICAgICBpZiAoZy5tb3VzZVswXVswXSAhPT0gcFswXSB8fCBnLm1vdXNlWzBdWzFdICE9PSBwWzFdKSB7CiAgICAgICAgICAgIGcubW91c2VbMV0gPSB0LmludmVydChnLm1vdXNlWzBdID0gcCk7CiAgICAgICAgICB9CiAgICAgICAgICBjbGVhclRpbWVvdXQoZy53aGVlbCk7CiAgICAgICAgfQoKICAgICAgICAvLyBJZiB0aGlzIHdoZWVsIGV2ZW50IHdvbuKAmXQgdHJpZ2dlciBhIHRyYW5zZm9ybSBjaGFuZ2UsIGlnbm9yZSBpdC4KICAgICAgICBlbHNlIGlmICh0LmsgPT09IGspIHJldHVybjsKCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjYXB0dXJlIHRoZSBtb3VzZSBwb2ludCBhbmQgbG9jYXRpb24gYXQgdGhlIHN0YXJ0LgogICAgICAgIGVsc2UgewogICAgICAgICAgZy5tb3VzZSA9IFtwLCB0LmludmVydChwKV07CiAgICAgICAgICBpbnRlcnJ1cHQodGhpcyk7CiAgICAgICAgICBnLnN0YXJ0KCk7CiAgICAgICAgfQoKICAgICAgICBub2V2ZW50JDIoKTsKICAgICAgICBnLndoZWVsID0gc2V0VGltZW91dCh3aGVlbGlkbGVkLCB3aGVlbERlbGF5KTsKICAgICAgICBnLnpvb20oIm1vdXNlIiwgY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0LCBrKSwgZy5tb3VzZVswXSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTsKCiAgICAgICAgZnVuY3Rpb24gd2hlZWxpZGxlZCgpIHsKICAgICAgICAgIGcud2hlZWwgPSBudWxsOwogICAgICAgICAgZy5lbmQoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1vdXNlZG93bmVkKCkgewogICAgICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzLCB0cnVlKSwKICAgICAgICAgICAgdiA9IHNlbGVjdChldmVudC52aWV3KS5vbigibW91c2Vtb3ZlLnpvb20iLCBtb3VzZW1vdmVkLCB0cnVlKS5vbigibW91c2V1cC56b29tIiwgbW91c2V1cHBlZCwgdHJ1ZSksCiAgICAgICAgICAgIHAgPSBtb3VzZSh0aGlzKSwKICAgICAgICAgICAgeDAgPSBldmVudC5jbGllbnRYLAogICAgICAgICAgICB5MCA9IGV2ZW50LmNsaWVudFk7CgogICAgICAgIGRyYWdEaXNhYmxlKGV2ZW50LnZpZXcpOwogICAgICAgIG5vcHJvcGFnYXRpb24kMigpOwogICAgICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTsKICAgICAgICBpbnRlcnJ1cHQodGhpcyk7CiAgICAgICAgZy5zdGFydCgpOwoKICAgICAgICBmdW5jdGlvbiBtb3VzZW1vdmVkKCkgewogICAgICAgICAgbm9ldmVudCQyKCk7CiAgICAgICAgICBpZiAoIWcubW92ZWQpIHsKICAgICAgICAgICAgdmFyIGR4ID0gZXZlbnQuY2xpZW50WCAtIHgwLCBkeSA9IGV2ZW50LmNsaWVudFkgLSB5MDsKICAgICAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7CiAgICAgICAgICB9CiAgICAgICAgICBnLnpvb20oIm1vdXNlIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gbW91c2UoZy50aGF0KSwgZy5tb3VzZVsxXSksIGcuZXh0ZW50LCB0cmFuc2xhdGVFeHRlbnQpKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIG1vdXNldXBwZWQoKSB7CiAgICAgICAgICB2Lm9uKCJtb3VzZW1vdmUuem9vbSBtb3VzZXVwLnpvb20iLCBudWxsKTsKICAgICAgICAgIHllc2RyYWcoZXZlbnQudmlldywgZy5tb3ZlZCk7CiAgICAgICAgICBub2V2ZW50JDIoKTsKICAgICAgICAgIGcuZW5kKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBkYmxjbGlja2VkKCkgewogICAgICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSwKICAgICAgICAgICAgcDAgPSBtb3VzZSh0aGlzKSwKICAgICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLAogICAgICAgICAgICBrMSA9IHQwLmsgKiAoZXZlbnQuc2hpZnRLZXkgPyAwLjUgOiAyKSwKICAgICAgICAgICAgdDEgPSBjb25zdHJhaW4odHJhbnNsYXRlKHNjYWxlKHQwLCBrMSksIHAwLCBwMSksIGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0cmFuc2xhdGVFeHRlbnQpOwoKICAgICAgICBub2V2ZW50JDIoKTsKICAgICAgICBpZiAoZHVyYXRpb24gPiAwKSBzZWxlY3QodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDApOwogICAgICAgIGVsc2Ugc2VsZWN0KHRoaXMpLmNhbGwoem9vbS50cmFuc2Zvcm0sIHQxKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gdG91Y2hzdGFydGVkKCkgewogICAgICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgdG91Y2hlcyA9IGV2ZW50LnRvdWNoZXMsCiAgICAgICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwKICAgICAgICAgICAgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzLCBldmVudC5jaGFuZ2VkVG91Y2hlcy5sZW5ndGggPT09IG4pLAogICAgICAgICAgICBzdGFydGVkLCBpLCB0LCBwOwoKICAgICAgICBub3Byb3BhZ2F0aW9uJDIoKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHRvdWNoKHRoaXMsIHRvdWNoZXMsIHQuaWRlbnRpZmllcik7CiAgICAgICAgICBwID0gW3AsIHRoaXMuX196b29tLmludmVydChwKSwgdC5pZGVudGlmaWVyXTsKICAgICAgICAgIGlmICghZy50b3VjaDApIGcudG91Y2gwID0gcCwgc3RhcnRlZCA9IHRydWUsIGcudGFwcyA9IDEgKyAhIXRvdWNoc3RhcnRpbmc7CiAgICAgICAgICBlbHNlIGlmICghZy50b3VjaDEgJiYgZy50b3VjaDBbMl0gIT09IHBbMl0pIGcudG91Y2gxID0gcCwgZy50YXBzID0gMDsKICAgICAgICB9CgogICAgICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpOwoKICAgICAgICBpZiAoc3RhcnRlZCkgewogICAgICAgICAgaWYgKGcudGFwcyA8IDIpIHRvdWNoc3RhcnRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaHN0YXJ0aW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7CiAgICAgICAgICBpbnRlcnJ1cHQodGhpcyk7CiAgICAgICAgICBnLnN0YXJ0KCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaG1vdmVkKCkgewogICAgICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjsKICAgICAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLAogICAgICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQsIHAsIGw7CgogICAgICAgIG5vZXZlbnQkMigpOwogICAgICAgIGlmICh0b3VjaHN0YXJ0aW5nKSB0b3VjaHN0YXJ0aW5nID0gY2xlYXJUaW1lb3V0KHRvdWNoc3RhcnRpbmcpOwogICAgICAgIGcudGFwcyA9IDA7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSB0b3VjaCh0aGlzLCB0b3VjaGVzLCB0LmlkZW50aWZpZXIpOwogICAgICAgICAgaWYgKGcudG91Y2gwICYmIGcudG91Y2gwWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gwWzBdID0gcDsKICAgICAgICAgIGVsc2UgaWYgKGcudG91Y2gxICYmIGcudG91Y2gxWzJdID09PSB0LmlkZW50aWZpZXIpIGcudG91Y2gxWzBdID0gcDsKICAgICAgICB9CiAgICAgICAgdCA9IGcudGhhdC5fX3pvb207CiAgICAgICAgaWYgKGcudG91Y2gxKSB7CiAgICAgICAgICB2YXIgcDAgPSBnLnRvdWNoMFswXSwgbDAgPSBnLnRvdWNoMFsxXSwKICAgICAgICAgICAgICBwMSA9IGcudG91Y2gxWzBdLCBsMSA9IGcudG91Y2gxWzFdLAogICAgICAgICAgICAgIGRwID0gKGRwID0gcDFbMF0gLSBwMFswXSkgKiBkcCArIChkcCA9IHAxWzFdIC0gcDBbMV0pICogZHAsCiAgICAgICAgICAgICAgZGwgPSAoZGwgPSBsMVswXSAtIGwwWzBdKSAqIGRsICsgKGRsID0gbDFbMV0gLSBsMFsxXSkgKiBkbDsKICAgICAgICAgIHQgPSBzY2FsZSh0LCBNYXRoLnNxcnQoZHAgLyBkbCkpOwogICAgICAgICAgcCA9IFsocDBbMF0gKyBwMVswXSkgLyAyLCAocDBbMV0gKyBwMVsxXSkgLyAyXTsKICAgICAgICAgIGwgPSBbKGwwWzBdICsgbDFbMF0pIC8gMiwgKGwwWzFdICsgbDFbMV0pIC8gMl07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGcudG91Y2gwKSBwID0gZy50b3VjaDBbMF0sIGwgPSBnLnRvdWNoMFsxXTsKICAgICAgICBlbHNlIHJldHVybjsKICAgICAgICBnLnpvb20oInRvdWNoIiwgY29uc3RyYWluKHRyYW5zbGF0ZSh0LCBwLCBsKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaGVuZGVkKCkgewogICAgICAgIGlmICghdGhpcy5fX3pvb21pbmcpIHJldHVybjsKICAgICAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgdG91Y2hlcyA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzLAogICAgICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7CgogICAgICAgIG5vcHJvcGFnYXRpb24kMigpOwogICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTsKICAgICAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdCA9IHRvdWNoZXNbaV07CiAgICAgICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwOwogICAgICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxOwogICAgICAgIH0KICAgICAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7CiAgICAgICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBnLmVuZCgpOwogICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYSBkYmx0YXAsIHJlcm91dGUgdG8gdGhlIChvcHRpb25hbCkgZGJsY2xpY2suem9vbSBoYW5kbGVyLgogICAgICAgICAgaWYgKGcudGFwcyA9PT0gMikgewogICAgICAgICAgICB2YXIgcCA9IHNlbGVjdCh0aGlzKS5vbigiZGJsY2xpY2suem9vbSIpOwogICAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgem9vbS53aGVlbERlbHRhID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHdoZWVsRGVsdGEgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRkKCtfKSwgem9vbSkgOiB3aGVlbERlbHRhOwogICAgICB9OwoKICAgICAgem9vbS5maWx0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZmlsdGVyID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkZCghIV8pLCB6b29tKSA6IGZpbHRlcjsKICAgICAgfTsKCiAgICAgIHpvb20udG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGQoISFfKSwgem9vbSkgOiB0b3VjaGFibGU7CiAgICAgIH07CgogICAgICB6b29tLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHRlbnQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRkKFtbK19bMF1bMF0sICtfWzBdWzFdXSwgWytfWzFdWzBdLCArX1sxXVsxXV1dKSwgem9vbSkgOiBleHRlbnQ7CiAgICAgIH07CgogICAgICB6b29tLnNjYWxlRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNjYWxlRXh0ZW50WzBdID0gK19bMF0sIHNjYWxlRXh0ZW50WzFdID0gK19bMV0sIHpvb20pIDogW3NjYWxlRXh0ZW50WzBdLCBzY2FsZUV4dGVudFsxXV07CiAgICAgIH07CgogICAgICB6b29tLnRyYW5zbGF0ZUV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGVFeHRlbnRbMF1bMF0gPSArX1swXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzBdID0gK19bMV1bMF0sIHRyYW5zbGF0ZUV4dGVudFswXVsxXSA9ICtfWzBdWzFdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV0gPSArX1sxXVsxXSwgem9vbSkgOiBbW3RyYW5zbGF0ZUV4dGVudFswXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdXSwgW3RyYW5zbGF0ZUV4dGVudFsxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzFdWzFdXV07CiAgICAgIH07CgogICAgICB6b29tLmNvbnN0cmFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb25zdHJhaW4gPSBfLCB6b29tKSA6IGNvbnN0cmFpbjsKICAgICAgfTsKCiAgICAgIHpvb20uZHVyYXRpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHVyYXRpb24gPSArXywgem9vbSkgOiBkdXJhdGlvbjsKICAgICAgfTsKCiAgICAgIHpvb20uaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCB6b29tKSA6IGludGVycG9sYXRlOwogICAgICB9OwoKICAgICAgem9vbS5vbiA9IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZSA9IGxpc3RlbmVycy5vbi5hcHBseShsaXN0ZW5lcnMsIGFyZ3VtZW50cyk7CiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBsaXN0ZW5lcnMgPyB6b29tIDogdmFsdWU7CiAgICAgIH07CgogICAgICB6b29tLmNsaWNrRGlzdGFuY2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xpY2tEaXN0YW5jZTIgPSAoXyA9ICtfKSAqIF8sIHpvb20pIDogTWF0aC5zcXJ0KGNsaWNrRGlzdGFuY2UyKTsKICAgICAgfTsKCiAgICAgIHJldHVybiB6b29tOwogICAgfQoKICAgIHZhciBkM1R5cGVkID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uJDEsCiAgICAgICAgYmlzZWN0OiBiaXNlY3RSaWdodCwKICAgICAgICBiaXNlY3RSaWdodDogYmlzZWN0UmlnaHQsCiAgICAgICAgYmlzZWN0TGVmdDogYmlzZWN0TGVmdCwKICAgICAgICBhc2NlbmRpbmc6IGFzY2VuZGluZywKICAgICAgICBiaXNlY3RvcjogYmlzZWN0b3IsCiAgICAgICAgY3Jvc3M6IGNyb3NzLAogICAgICAgIGRlc2NlbmRpbmc6IGRlc2NlbmRpbmcsCiAgICAgICAgZGV2aWF0aW9uOiBkZXZpYXRpb24sCiAgICAgICAgZXh0ZW50OiBleHRlbnQsCiAgICAgICAgaGlzdG9ncmFtOiBoaXN0b2dyYW0sCiAgICAgICAgdGhyZXNob2xkRnJlZWRtYW5EaWFjb25pczogZnJlZWRtYW5EaWFjb25pcywKICAgICAgICB0aHJlc2hvbGRTY290dDogc2NvdHQsCiAgICAgICAgdGhyZXNob2xkU3R1cmdlczogdGhyZXNob2xkU3R1cmdlcywKICAgICAgICBtYXg6IG1heCwKICAgICAgICBtZWFuOiBtZWFuLAogICAgICAgIG1lZGlhbjogbWVkaWFuLAogICAgICAgIG1lcmdlOiBtZXJnZSwKICAgICAgICBtaW46IG1pbiwKICAgICAgICBwYWlyczogcGFpcnMsCiAgICAgICAgcGVybXV0ZTogcGVybXV0ZSwKICAgICAgICBxdWFudGlsZTogdGhyZXNob2xkLAogICAgICAgIHJhbmdlOiBzZXF1ZW5jZSwKICAgICAgICBzY2FuOiBzY2FuLAogICAgICAgIHNodWZmbGU6IHNodWZmbGUsCiAgICAgICAgc3VtOiBzdW0sCiAgICAgICAgdGlja3M6IHRpY2tzLAogICAgICAgIHRpY2tJbmNyZW1lbnQ6IHRpY2tJbmNyZW1lbnQsCiAgICAgICAgdGlja1N0ZXA6IHRpY2tTdGVwLAogICAgICAgIHRyYW5zcG9zZTogdHJhbnNwb3NlLAogICAgICAgIHZhcmlhbmNlOiB2YXJpYW5jZSwKICAgICAgICB6aXA6IHppcCwKICAgICAgICBheGlzVG9wOiBheGlzVG9wLAogICAgICAgIGF4aXNSaWdodDogYXhpc1JpZ2h0LAogICAgICAgIGF4aXNCb3R0b206IGF4aXNCb3R0b20sCiAgICAgICAgYXhpc0xlZnQ6IGF4aXNMZWZ0LAogICAgICAgIGJydXNoOiBicnVzaCwKICAgICAgICBicnVzaFg6IGJydXNoWCwKICAgICAgICBicnVzaFk6IGJydXNoWSwKICAgICAgICBicnVzaFNlbGVjdGlvbjogYnJ1c2hTZWxlY3Rpb24sCiAgICAgICAgY2hvcmQ6IGNob3JkLAogICAgICAgIHJpYmJvbjogcmliYm9uLAogICAgICAgIG5lc3Q6IG5lc3QsCiAgICAgICAgc2V0OiBzZXQkMywKICAgICAgICBtYXA6IG1hcCQxLAogICAgICAgIGtleXM6IGtleXMsCiAgICAgICAgdmFsdWVzOiB2YWx1ZXMsCiAgICAgICAgZW50cmllczogZW50cmllcywKICAgICAgICBjb2xvcjogY29sb3IsCiAgICAgICAgcmdiOiByZ2IsCiAgICAgICAgaHNsOiBoc2wsCiAgICAgICAgbGFiOiBsYWIsCiAgICAgICAgaGNsOiBoY2wsCiAgICAgICAgbGNoOiBsY2gsCiAgICAgICAgZ3JheTogZ3JheSwKICAgICAgICBjdWJlaGVsaXg6IGN1YmVoZWxpeCwKICAgICAgICBjb250b3VyczogY29udG91cnMsCiAgICAgICAgY29udG91ckRlbnNpdHk6IGRlbnNpdHksCiAgICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoLAogICAgICAgIGRyYWc6IGRyYWcsCiAgICAgICAgZHJhZ0Rpc2FibGU6IGRyYWdEaXNhYmxlLAogICAgICAgIGRyYWdFbmFibGU6IHllc2RyYWcsCiAgICAgICAgZHN2Rm9ybWF0OiBkc3ZGb3JtYXQsCiAgICAgICAgY3N2UGFyc2U6IGNzdlBhcnNlLAogICAgICAgIGNzdlBhcnNlUm93czogY3N2UGFyc2VSb3dzLAogICAgICAgIGNzdkZvcm1hdDogY3N2Rm9ybWF0LAogICAgICAgIGNzdkZvcm1hdEJvZHk6IGNzdkZvcm1hdEJvZHksCiAgICAgICAgY3N2Rm9ybWF0Um93czogY3N2Rm9ybWF0Um93cywKICAgICAgICBjc3ZGb3JtYXRSb3c6IGNzdkZvcm1hdFJvdywKICAgICAgICBjc3ZGb3JtYXRWYWx1ZTogY3N2Rm9ybWF0VmFsdWUsCiAgICAgICAgdHN2UGFyc2U6IHRzdlBhcnNlLAogICAgICAgIHRzdlBhcnNlUm93czogdHN2UGFyc2VSb3dzLAogICAgICAgIHRzdkZvcm1hdDogdHN2Rm9ybWF0LAogICAgICAgIHRzdkZvcm1hdEJvZHk6IHRzdkZvcm1hdEJvZHksCiAgICAgICAgdHN2Rm9ybWF0Um93czogdHN2Rm9ybWF0Um93cywKICAgICAgICB0c3ZGb3JtYXRSb3c6IHRzdkZvcm1hdFJvdywKICAgICAgICB0c3ZGb3JtYXRWYWx1ZTogdHN2Rm9ybWF0VmFsdWUsCiAgICAgICAgYXV0b1R5cGU6IGF1dG9UeXBlLAogICAgICAgIGVhc2VMaW5lYXI6IGxpbmVhciQxLAogICAgICAgIGVhc2VRdWFkOiBxdWFkSW5PdXQsCiAgICAgICAgZWFzZVF1YWRJbjogcXVhZEluLAogICAgICAgIGVhc2VRdWFkT3V0OiBxdWFkT3V0LAogICAgICAgIGVhc2VRdWFkSW5PdXQ6IHF1YWRJbk91dCwKICAgICAgICBlYXNlQ3ViaWM6IGN1YmljSW5PdXQsCiAgICAgICAgZWFzZUN1YmljSW46IGN1YmljSW4sCiAgICAgICAgZWFzZUN1YmljT3V0OiBjdWJpY091dCwKICAgICAgICBlYXNlQ3ViaWNJbk91dDogY3ViaWNJbk91dCwKICAgICAgICBlYXNlUG9seTogcG9seUluT3V0LAogICAgICAgIGVhc2VQb2x5SW46IHBvbHlJbiwKICAgICAgICBlYXNlUG9seU91dDogcG9seU91dCwKICAgICAgICBlYXNlUG9seUluT3V0OiBwb2x5SW5PdXQsCiAgICAgICAgZWFzZVNpbjogc2luSW5PdXQsCiAgICAgICAgZWFzZVNpbkluOiBzaW5JbiwKICAgICAgICBlYXNlU2luT3V0OiBzaW5PdXQsCiAgICAgICAgZWFzZVNpbkluT3V0OiBzaW5Jbk91dCwKICAgICAgICBlYXNlRXhwOiBleHBJbk91dCwKICAgICAgICBlYXNlRXhwSW46IGV4cEluLAogICAgICAgIGVhc2VFeHBPdXQ6IGV4cE91dCwKICAgICAgICBlYXNlRXhwSW5PdXQ6IGV4cEluT3V0LAogICAgICAgIGVhc2VDaXJjbGU6IGNpcmNsZUluT3V0LAogICAgICAgIGVhc2VDaXJjbGVJbjogY2lyY2xlSW4sCiAgICAgICAgZWFzZUNpcmNsZU91dDogY2lyY2xlT3V0LAogICAgICAgIGVhc2VDaXJjbGVJbk91dDogY2lyY2xlSW5PdXQsCiAgICAgICAgZWFzZUJvdW5jZTogYm91bmNlT3V0LAogICAgICAgIGVhc2VCb3VuY2VJbjogYm91bmNlSW4sCiAgICAgICAgZWFzZUJvdW5jZU91dDogYm91bmNlT3V0LAogICAgICAgIGVhc2VCb3VuY2VJbk91dDogYm91bmNlSW5PdXQsCiAgICAgICAgZWFzZUJhY2s6IGJhY2tJbk91dCwKICAgICAgICBlYXNlQmFja0luOiBiYWNrSW4sCiAgICAgICAgZWFzZUJhY2tPdXQ6IGJhY2tPdXQsCiAgICAgICAgZWFzZUJhY2tJbk91dDogYmFja0luT3V0LAogICAgICAgIGVhc2VFbGFzdGljOiBlbGFzdGljT3V0LAogICAgICAgIGVhc2VFbGFzdGljSW46IGVsYXN0aWNJbiwKICAgICAgICBlYXNlRWxhc3RpY091dDogZWxhc3RpY091dCwKICAgICAgICBlYXNlRWxhc3RpY0luT3V0OiBlbGFzdGljSW5PdXQsCiAgICAgICAgYmxvYjogYmxvYiwKICAgICAgICBidWZmZXI6IGJ1ZmZlciwKICAgICAgICBkc3Y6IGRzdiwKICAgICAgICBjc3Y6IGNzdiQxLAogICAgICAgIHRzdjogdHN2JDEsCiAgICAgICAgaW1hZ2U6IGltYWdlLAogICAgICAgIGpzb246IGpzb24sCiAgICAgICAgdGV4dDogdGV4dCwKICAgICAgICB4bWw6IHhtbCwKICAgICAgICBodG1sOiBodG1sJDEsCiAgICAgICAgc3ZnOiBzdmcsCiAgICAgICAgZm9yY2VDZW50ZXI6IGNlbnRlciQxLAogICAgICAgIGZvcmNlQ29sbGlkZTogY29sbGlkZSwKICAgICAgICBmb3JjZUxpbms6IGxpbmssCiAgICAgICAgZm9yY2VNYW55Qm9keTogbWFueUJvZHksCiAgICAgICAgZm9yY2VSYWRpYWw6IHJhZGlhbCwKICAgICAgICBmb3JjZVNpbXVsYXRpb246IHNpbXVsYXRpb24sCiAgICAgICAgZm9yY2VYOiB4JDIsCiAgICAgICAgZm9yY2VZOiB5JDIsCiAgICAgICAgZm9ybWF0RGVmYXVsdExvY2FsZTogZGVmYXVsdExvY2FsZSwKICAgICAgICBnZXQgZm9ybWF0ICgpIHsgcmV0dXJuIGZvcm1hdDsgfSwKICAgICAgICBnZXQgZm9ybWF0UHJlZml4ICgpIHsgcmV0dXJuIGZvcm1hdFByZWZpeDsgfSwKICAgICAgICBmb3JtYXRMb2NhbGU6IGZvcm1hdExvY2FsZSwKICAgICAgICBmb3JtYXRTcGVjaWZpZXI6IGZvcm1hdFNwZWNpZmllciwKICAgICAgICBGb3JtYXRTcGVjaWZpZXI6IEZvcm1hdFNwZWNpZmllciwKICAgICAgICBwcmVjaXNpb25GaXhlZDogcHJlY2lzaW9uRml4ZWQsCiAgICAgICAgcHJlY2lzaW9uUHJlZml4OiBwcmVjaXNpb25QcmVmaXgsCiAgICAgICAgcHJlY2lzaW9uUm91bmQ6IHByZWNpc2lvblJvdW5kLAogICAgICAgIGdlb0FyZWE6IGFyZWEkMSwKICAgICAgICBnZW9Cb3VuZHM6IGJvdW5kcywKICAgICAgICBnZW9DZW50cm9pZDogY2VudHJvaWQsCiAgICAgICAgZ2VvQ2lyY2xlOiBjaXJjbGUsCiAgICAgICAgZ2VvQ2xpcEFudGltZXJpZGlhbjogY2xpcEFudGltZXJpZGlhbiwKICAgICAgICBnZW9DbGlwQ2lyY2xlOiBjbGlwQ2lyY2xlLAogICAgICAgIGdlb0NsaXBFeHRlbnQ6IGV4dGVudCQxLAogICAgICAgIGdlb0NsaXBSZWN0YW5nbGU6IGNsaXBSZWN0YW5nbGUsCiAgICAgICAgZ2VvQ29udGFpbnM6IGNvbnRhaW5zJDEsCiAgICAgICAgZ2VvRGlzdGFuY2U6IGRpc3RhbmNlLAogICAgICAgIGdlb0dyYXRpY3VsZTogZ3JhdGljdWxlLAogICAgICAgIGdlb0dyYXRpY3VsZTEwOiBncmF0aWN1bGUxMCwKICAgICAgICBnZW9JbnRlcnBvbGF0ZTogaW50ZXJwb2xhdGUkMSwKICAgICAgICBnZW9MZW5ndGg6IGxlbmd0aCQxLAogICAgICAgIGdlb1BhdGg6IGluZGV4JDEsCiAgICAgICAgZ2VvQWxiZXJzOiBhbGJlcnMsCiAgICAgICAgZ2VvQWxiZXJzVXNhOiBhbGJlcnNVc2EsCiAgICAgICAgZ2VvQXppbXV0aGFsRXF1YWxBcmVhOiBhemltdXRoYWxFcXVhbEFyZWEsCiAgICAgICAgZ2VvQXppbXV0aGFsRXF1YWxBcmVhUmF3OiBhemltdXRoYWxFcXVhbEFyZWFSYXcsCiAgICAgICAgZ2VvQXppbXV0aGFsRXF1aWRpc3RhbnQ6IGF6aW11dGhhbEVxdWlkaXN0YW50LAogICAgICAgIGdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3OiBhemltdXRoYWxFcXVpZGlzdGFudFJhdywKICAgICAgICBnZW9Db25pY0NvbmZvcm1hbDogY29uaWNDb25mb3JtYWwsCiAgICAgICAgZ2VvQ29uaWNDb25mb3JtYWxSYXc6IGNvbmljQ29uZm9ybWFsUmF3LAogICAgICAgIGdlb0NvbmljRXF1YWxBcmVhOiBjb25pY0VxdWFsQXJlYSwKICAgICAgICBnZW9Db25pY0VxdWFsQXJlYVJhdzogY29uaWNFcXVhbEFyZWFSYXcsCiAgICAgICAgZ2VvQ29uaWNFcXVpZGlzdGFudDogY29uaWNFcXVpZGlzdGFudCwKICAgICAgICBnZW9Db25pY0VxdWlkaXN0YW50UmF3OiBjb25pY0VxdWlkaXN0YW50UmF3LAogICAgICAgIGdlb0VxdWFsRWFydGg6IGVxdWFsRWFydGgsCiAgICAgICAgZ2VvRXF1YWxFYXJ0aFJhdzogZXF1YWxFYXJ0aFJhdywKICAgICAgICBnZW9FcXVpcmVjdGFuZ3VsYXI6IGVxdWlyZWN0YW5ndWxhciwKICAgICAgICBnZW9FcXVpcmVjdGFuZ3VsYXJSYXc6IGVxdWlyZWN0YW5ndWxhclJhdywKICAgICAgICBnZW9Hbm9tb25pYzogZ25vbW9uaWMsCiAgICAgICAgZ2VvR25vbW9uaWNSYXc6IGdub21vbmljUmF3LAogICAgICAgIGdlb0lkZW50aXR5OiBpZGVudGl0eSQ1LAogICAgICAgIGdlb1Byb2plY3Rpb246IHByb2plY3Rpb24sCiAgICAgICAgZ2VvUHJvamVjdGlvbk11dGF0b3I6IHByb2plY3Rpb25NdXRhdG9yLAogICAgICAgIGdlb01lcmNhdG9yOiBtZXJjYXRvciwKICAgICAgICBnZW9NZXJjYXRvclJhdzogbWVyY2F0b3JSYXcsCiAgICAgICAgZ2VvTmF0dXJhbEVhcnRoMTogbmF0dXJhbEVhcnRoMSwKICAgICAgICBnZW9OYXR1cmFsRWFydGgxUmF3OiBuYXR1cmFsRWFydGgxUmF3LAogICAgICAgIGdlb09ydGhvZ3JhcGhpYzogb3J0aG9ncmFwaGljLAogICAgICAgIGdlb09ydGhvZ3JhcGhpY1Jhdzogb3J0aG9ncmFwaGljUmF3LAogICAgICAgIGdlb1N0ZXJlb2dyYXBoaWM6IHN0ZXJlb2dyYXBoaWMsCiAgICAgICAgZ2VvU3RlcmVvZ3JhcGhpY1Jhdzogc3RlcmVvZ3JhcGhpY1JhdywKICAgICAgICBnZW9UcmFuc3ZlcnNlTWVyY2F0b3I6IHRyYW5zdmVyc2VNZXJjYXRvciwKICAgICAgICBnZW9UcmFuc3ZlcnNlTWVyY2F0b3JSYXc6IHRyYW5zdmVyc2VNZXJjYXRvclJhdywKICAgICAgICBnZW9Sb3RhdGlvbjogcm90YXRpb24sCiAgICAgICAgZ2VvU3RyZWFtOiBnZW9TdHJlYW0sCiAgICAgICAgZ2VvVHJhbnNmb3JtOiB0cmFuc2Zvcm0sCiAgICAgICAgY2x1c3RlcjogY2x1c3RlciwKICAgICAgICBoaWVyYXJjaHk6IGhpZXJhcmNoeSwKICAgICAgICBwYWNrOiBpbmRleCQyLAogICAgICAgIHBhY2tTaWJsaW5nczogc2libGluZ3MsCiAgICAgICAgcGFja0VuY2xvc2U6IGVuY2xvc2UsCiAgICAgICAgcGFydGl0aW9uOiBwYXJ0aXRpb24sCiAgICAgICAgc3RyYXRpZnk6IHN0cmF0aWZ5LAogICAgICAgIHRyZWU6IHRyZWUsCiAgICAgICAgdHJlZW1hcDogaW5kZXgkMywKICAgICAgICB0cmVlbWFwQmluYXJ5OiBiaW5hcnksCiAgICAgICAgdHJlZW1hcERpY2U6IHRyZWVtYXBEaWNlLAogICAgICAgIHRyZWVtYXBTbGljZTogdHJlZW1hcFNsaWNlLAogICAgICAgIHRyZWVtYXBTbGljZURpY2U6IHNsaWNlRGljZSwKICAgICAgICB0cmVlbWFwU3F1YXJpZnk6IHNxdWFyaWZ5LAogICAgICAgIHRyZWVtYXBSZXNxdWFyaWZ5OiByZXNxdWFyaWZ5LAogICAgICAgIGludGVycG9sYXRlOiBpbnRlcnBvbGF0ZVZhbHVlLAogICAgICAgIGludGVycG9sYXRlQXJyYXk6IGFycmF5JDEsCiAgICAgICAgaW50ZXJwb2xhdGVCYXNpczogYmFzaXMkMSwKICAgICAgICBpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOiBiYXNpc0Nsb3NlZCwKICAgICAgICBpbnRlcnBvbGF0ZURhdGU6IGRhdGUsCiAgICAgICAgaW50ZXJwb2xhdGVEaXNjcmV0ZTogZGlzY3JldGUsCiAgICAgICAgaW50ZXJwb2xhdGVIdWU6IGh1ZSQxLAogICAgICAgIGludGVycG9sYXRlTnVtYmVyOiBpbnRlcnBvbGF0ZU51bWJlciwKICAgICAgICBpbnRlcnBvbGF0ZU51bWJlckFycmF5OiBudW1iZXJBcnJheSwKICAgICAgICBpbnRlcnBvbGF0ZU9iamVjdDogb2JqZWN0LAogICAgICAgIGludGVycG9sYXRlUm91bmQ6IGludGVycG9sYXRlUm91bmQsCiAgICAgICAgaW50ZXJwb2xhdGVTdHJpbmc6IGludGVycG9sYXRlU3RyaW5nLAogICAgICAgIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzOiBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcywKICAgICAgICBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZzogaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcsCiAgICAgICAgaW50ZXJwb2xhdGVab29tOiBpbnRlcnBvbGF0ZVpvb20sCiAgICAgICAgaW50ZXJwb2xhdGVSZ2I6IGludGVycG9sYXRlUmdiLAogICAgICAgIGludGVycG9sYXRlUmdiQmFzaXM6IHJnYkJhc2lzLAogICAgICAgIGludGVycG9sYXRlUmdiQmFzaXNDbG9zZWQ6IHJnYkJhc2lzQ2xvc2VkLAogICAgICAgIGludGVycG9sYXRlSHNsOiBoc2wkMiwKICAgICAgICBpbnRlcnBvbGF0ZUhzbExvbmc6IGhzbExvbmcsCiAgICAgICAgaW50ZXJwb2xhdGVMYWI6IGxhYiQxLAogICAgICAgIGludGVycG9sYXRlSGNsOiBoY2wkMiwKICAgICAgICBpbnRlcnBvbGF0ZUhjbExvbmc6IGhjbExvbmcsCiAgICAgICAgaW50ZXJwb2xhdGVDdWJlaGVsaXg6IGN1YmVoZWxpeCQyLAogICAgICAgIGludGVycG9sYXRlQ3ViZWhlbGl4TG9uZzogY3ViZWhlbGl4TG9uZywKICAgICAgICBwaWVjZXdpc2U6IHBpZWNld2lzZSwKICAgICAgICBxdWFudGl6ZTogcXVhbnRpemUsCiAgICAgICAgcGF0aDogcGF0aCwKICAgICAgICBwb2x5Z29uQXJlYTogYXJlYSQyLAogICAgICAgIHBvbHlnb25DZW50cm9pZDogY2VudHJvaWQkMSwKICAgICAgICBwb2x5Z29uSHVsbDogaHVsbCwKICAgICAgICBwb2x5Z29uQ29udGFpbnM6IGNvbnRhaW5zJDIsCiAgICAgICAgcG9seWdvbkxlbmd0aDogbGVuZ3RoJDIsCiAgICAgICAgcXVhZHRyZWU6IHF1YWR0cmVlLAogICAgICAgIHJhbmRvbVVuaWZvcm06IHVuaWZvcm0sCiAgICAgICAgcmFuZG9tTm9ybWFsOiBub3JtYWwsCiAgICAgICAgcmFuZG9tTG9nTm9ybWFsOiBsb2dOb3JtYWwsCiAgICAgICAgcmFuZG9tQmF0ZXM6IGJhdGVzLAogICAgICAgIHJhbmRvbUlyd2luSGFsbDogaXJ3aW5IYWxsLAogICAgICAgIHJhbmRvbUV4cG9uZW50aWFsOiBleHBvbmVudGlhbCQxLAogICAgICAgIHNjYWxlQmFuZDogYmFuZCwKICAgICAgICBzY2FsZVBvaW50OiBwb2ludCQxLAogICAgICAgIHNjYWxlSWRlbnRpdHk6IGlkZW50aXR5JDcsCiAgICAgICAgc2NhbGVMaW5lYXI6IGxpbmVhciQyLAogICAgICAgIHNjYWxlTG9nOiBsb2ckMSwKICAgICAgICBzY2FsZVN5bWxvZzogc3ltbG9nLAogICAgICAgIHNjYWxlT3JkaW5hbDogb3JkaW5hbCwKICAgICAgICBzY2FsZUltcGxpY2l0OiBpbXBsaWNpdCwKICAgICAgICBzY2FsZVBvdzogcG93JDEsCiAgICAgICAgc2NhbGVTcXJ0OiBzcXJ0JDEsCiAgICAgICAgc2NhbGVRdWFudGlsZTogcXVhbnRpbGUsCiAgICAgICAgc2NhbGVRdWFudGl6ZTogcXVhbnRpemUkMSwKICAgICAgICBzY2FsZVRocmVzaG9sZDogdGhyZXNob2xkJDEsCiAgICAgICAgc2NhbGVUaW1lOiB0aW1lLAogICAgICAgIHNjYWxlVXRjOiB1dGNUaW1lLAogICAgICAgIHNjYWxlU2VxdWVudGlhbDogc2VxdWVudGlhbCwKICAgICAgICBzY2FsZVNlcXVlbnRpYWxMb2c6IHNlcXVlbnRpYWxMb2csCiAgICAgICAgc2NhbGVTZXF1ZW50aWFsUG93OiBzZXF1ZW50aWFsUG93LAogICAgICAgIHNjYWxlU2VxdWVudGlhbFNxcnQ6IHNlcXVlbnRpYWxTcXJ0LAogICAgICAgIHNjYWxlU2VxdWVudGlhbFN5bWxvZzogc2VxdWVudGlhbFN5bWxvZywKICAgICAgICBzY2FsZVNlcXVlbnRpYWxRdWFudGlsZTogc2VxdWVudGlhbFF1YW50aWxlLAogICAgICAgIHNjYWxlRGl2ZXJnaW5nOiBkaXZlcmdpbmcsCiAgICAgICAgc2NhbGVEaXZlcmdpbmdMb2c6IGRpdmVyZ2luZ0xvZywKICAgICAgICBzY2FsZURpdmVyZ2luZ1BvdzogZGl2ZXJnaW5nUG93LAogICAgICAgIHNjYWxlRGl2ZXJnaW5nU3FydDogZGl2ZXJnaW5nU3FydCwKICAgICAgICBzY2FsZURpdmVyZ2luZ1N5bWxvZzogZGl2ZXJnaW5nU3ltbG9nLAogICAgICAgIHRpY2tGb3JtYXQ6IHRpY2tGb3JtYXQsCiAgICAgICAgc2NoZW1lQ2F0ZWdvcnkxMDogY2F0ZWdvcnkxMCwKICAgICAgICBzY2hlbWVBY2NlbnQ6IEFjY2VudCwKICAgICAgICBzY2hlbWVEYXJrMjogRGFyazIsCiAgICAgICAgc2NoZW1lUGFpcmVkOiBQYWlyZWQsCiAgICAgICAgc2NoZW1lUGFzdGVsMTogUGFzdGVsMSwKICAgICAgICBzY2hlbWVQYXN0ZWwyOiBQYXN0ZWwyLAogICAgICAgIHNjaGVtZVNldDE6IFNldDEsCiAgICAgICAgc2NoZW1lU2V0MjogU2V0MiwKICAgICAgICBzY2hlbWVTZXQzOiBTZXQzLAogICAgICAgIHNjaGVtZVRhYmxlYXUxMDogVGFibGVhdTEwLAogICAgICAgIGludGVycG9sYXRlQnJCRzogQnJCRywKICAgICAgICBzY2hlbWVCckJHOiBzY2hlbWUsCiAgICAgICAgaW50ZXJwb2xhdGVQUkduOiBQUkduLAogICAgICAgIHNjaGVtZVBSR246IHNjaGVtZSQxLAogICAgICAgIGludGVycG9sYXRlUGlZRzogUGlZRywKICAgICAgICBzY2hlbWVQaVlHOiBzY2hlbWUkMiwKICAgICAgICBpbnRlcnBvbGF0ZVB1T3I6IFB1T3IsCiAgICAgICAgc2NoZW1lUHVPcjogc2NoZW1lJDMsCiAgICAgICAgaW50ZXJwb2xhdGVSZEJ1OiBSZEJ1LAogICAgICAgIHNjaGVtZVJkQnU6IHNjaGVtZSQ0LAogICAgICAgIGludGVycG9sYXRlUmRHeTogUmRHeSwKICAgICAgICBzY2hlbWVSZEd5OiBzY2hlbWUkNSwKICAgICAgICBpbnRlcnBvbGF0ZVJkWWxCdTogUmRZbEJ1LAogICAgICAgIHNjaGVtZVJkWWxCdTogc2NoZW1lJDYsCiAgICAgICAgaW50ZXJwb2xhdGVSZFlsR246IFJkWWxHbiwKICAgICAgICBzY2hlbWVSZFlsR246IHNjaGVtZSQ3LAogICAgICAgIGludGVycG9sYXRlU3BlY3RyYWw6IFNwZWN0cmFsLAogICAgICAgIHNjaGVtZVNwZWN0cmFsOiBzY2hlbWUkOCwKICAgICAgICBpbnRlcnBvbGF0ZUJ1R246IEJ1R24sCiAgICAgICAgc2NoZW1lQnVHbjogc2NoZW1lJDksCiAgICAgICAgaW50ZXJwb2xhdGVCdVB1OiBCdVB1LAogICAgICAgIHNjaGVtZUJ1UHU6IHNjaGVtZSRhLAogICAgICAgIGludGVycG9sYXRlR25CdTogR25CdSwKICAgICAgICBzY2hlbWVHbkJ1OiBzY2hlbWUkYiwKICAgICAgICBpbnRlcnBvbGF0ZU9yUmQ6IE9yUmQsCiAgICAgICAgc2NoZW1lT3JSZDogc2NoZW1lJGMsCiAgICAgICAgaW50ZXJwb2xhdGVQdUJ1R246IFB1QnVHbiwKICAgICAgICBzY2hlbWVQdUJ1R246IHNjaGVtZSRkLAogICAgICAgIGludGVycG9sYXRlUHVCdTogUHVCdSwKICAgICAgICBzY2hlbWVQdUJ1OiBzY2hlbWUkZSwKICAgICAgICBpbnRlcnBvbGF0ZVB1UmQ6IFB1UmQsCiAgICAgICAgc2NoZW1lUHVSZDogc2NoZW1lJGYsCiAgICAgICAgaW50ZXJwb2xhdGVSZFB1OiBSZFB1LAogICAgICAgIHNjaGVtZVJkUHU6IHNjaGVtZSRnLAogICAgICAgIGludGVycG9sYXRlWWxHbkJ1OiBZbEduQnUsCiAgICAgICAgc2NoZW1lWWxHbkJ1OiBzY2hlbWUkaCwKICAgICAgICBpbnRlcnBvbGF0ZVlsR246IFlsR24sCiAgICAgICAgc2NoZW1lWWxHbjogc2NoZW1lJGksCiAgICAgICAgaW50ZXJwb2xhdGVZbE9yQnI6IFlsT3JCciwKICAgICAgICBzY2hlbWVZbE9yQnI6IHNjaGVtZSRqLAogICAgICAgIGludGVycG9sYXRlWWxPclJkOiBZbE9yUmQsCiAgICAgICAgc2NoZW1lWWxPclJkOiBzY2hlbWUkaywKICAgICAgICBpbnRlcnBvbGF0ZUJsdWVzOiBCbHVlcywKICAgICAgICBzY2hlbWVCbHVlczogc2NoZW1lJGwsCiAgICAgICAgaW50ZXJwb2xhdGVHcmVlbnM6IEdyZWVucywKICAgICAgICBzY2hlbWVHcmVlbnM6IHNjaGVtZSRtLAogICAgICAgIGludGVycG9sYXRlR3JleXM6IEdyZXlzLAogICAgICAgIHNjaGVtZUdyZXlzOiBzY2hlbWUkbiwKICAgICAgICBpbnRlcnBvbGF0ZVB1cnBsZXM6IFB1cnBsZXMsCiAgICAgICAgc2NoZW1lUHVycGxlczogc2NoZW1lJG8sCiAgICAgICAgaW50ZXJwb2xhdGVSZWRzOiBSZWRzLAogICAgICAgIHNjaGVtZVJlZHM6IHNjaGVtZSRwLAogICAgICAgIGludGVycG9sYXRlT3JhbmdlczogT3JhbmdlcywKICAgICAgICBzY2hlbWVPcmFuZ2VzOiBzY2hlbWUkcSwKICAgICAgICBpbnRlcnBvbGF0ZUNpdmlkaXM6IGNpdmlkaXMsCiAgICAgICAgaW50ZXJwb2xhdGVDdWJlaGVsaXhEZWZhdWx0OiBjdWJlaGVsaXgkMywKICAgICAgICBpbnRlcnBvbGF0ZVJhaW5ib3c6IHJhaW5ib3csCiAgICAgICAgaW50ZXJwb2xhdGVXYXJtOiB3YXJtLAogICAgICAgIGludGVycG9sYXRlQ29vbDogY29vbCwKICAgICAgICBpbnRlcnBvbGF0ZVNpbmVib3c6IHNpbmVib3csCiAgICAgICAgaW50ZXJwb2xhdGVUdXJibzogdHVyYm8sCiAgICAgICAgaW50ZXJwb2xhdGVWaXJpZGlzOiB2aXJpZGlzLAogICAgICAgIGludGVycG9sYXRlTWFnbWE6IG1hZ21hLAogICAgICAgIGludGVycG9sYXRlSW5mZXJubzogaW5mZXJubywKICAgICAgICBpbnRlcnBvbGF0ZVBsYXNtYTogcGxhc21hLAogICAgICAgIGNyZWF0ZTogY3JlYXRlLAogICAgICAgIGNyZWF0b3I6IGNyZWF0b3IsCiAgICAgICAgbG9jYWw6IGxvY2FsLAogICAgICAgIG1hdGNoZXI6IG1hdGNoZXIsCiAgICAgICAgbW91c2U6IG1vdXNlLAogICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlLAogICAgICAgIG5hbWVzcGFjZXM6IG5hbWVzcGFjZXMsCiAgICAgICAgY2xpZW50UG9pbnQ6IHBvaW50LAogICAgICAgIHNlbGVjdDogc2VsZWN0LAogICAgICAgIHNlbGVjdEFsbDogc2VsZWN0QWxsLAogICAgICAgIHNlbGVjdGlvbjogc2VsZWN0aW9uLAogICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvciwKICAgICAgICBzZWxlY3RvckFsbDogc2VsZWN0b3JBbGwsCiAgICAgICAgc3R5bGU6IHN0eWxlVmFsdWUsCiAgICAgICAgdG91Y2g6IHRvdWNoLAogICAgICAgIHRvdWNoZXM6IHRvdWNoZXMsCiAgICAgICAgd2luZG93OiBkZWZhdWx0VmlldywKICAgICAgICBnZXQgZXZlbnQgKCkgeyByZXR1cm4gZXZlbnQ7IH0sCiAgICAgICAgY3VzdG9tRXZlbnQ6IGN1c3RvbUV2ZW50LAogICAgICAgIGFyYzogYXJjLAogICAgICAgIGFyZWE6IGFyZWEkMywKICAgICAgICBsaW5lOiBsaW5lLAogICAgICAgIHBpZTogcGllLAogICAgICAgIGFyZWFSYWRpYWw6IGFyZWFSYWRpYWwsCiAgICAgICAgcmFkaWFsQXJlYTogYXJlYVJhZGlhbCwKICAgICAgICBsaW5lUmFkaWFsOiBsaW5lUmFkaWFsJDEsCiAgICAgICAgcmFkaWFsTGluZTogbGluZVJhZGlhbCQxLAogICAgICAgIHBvaW50UmFkaWFsOiBwb2ludFJhZGlhbCwKICAgICAgICBsaW5rSG9yaXpvbnRhbDogbGlua0hvcml6b250YWwsCiAgICAgICAgbGlua1ZlcnRpY2FsOiBsaW5rVmVydGljYWwsCiAgICAgICAgbGlua1JhZGlhbDogbGlua1JhZGlhbCwKICAgICAgICBzeW1ib2w6IHN5bWJvbCwKICAgICAgICBzeW1ib2xzOiBzeW1ib2xzLAogICAgICAgIHN5bWJvbENpcmNsZTogY2lyY2xlJDIsCiAgICAgICAgc3ltYm9sQ3Jvc3M6IGNyb3NzJDIsCiAgICAgICAgc3ltYm9sRGlhbW9uZDogZGlhbW9uZCwKICAgICAgICBzeW1ib2xTcXVhcmU6IHNxdWFyZSwKICAgICAgICBzeW1ib2xTdGFyOiBzdGFyLAogICAgICAgIHN5bWJvbFRyaWFuZ2xlOiB0cmlhbmdsZSwKICAgICAgICBzeW1ib2xXeWU6IHd5ZSwKICAgICAgICBjdXJ2ZUJhc2lzQ2xvc2VkOiBiYXNpc0Nsb3NlZCQxLAogICAgICAgIGN1cnZlQmFzaXNPcGVuOiBiYXNpc09wZW4sCiAgICAgICAgY3VydmVCYXNpczogYmFzaXMkMiwKICAgICAgICBjdXJ2ZUJ1bmRsZTogYnVuZGxlLAogICAgICAgIGN1cnZlQ2FyZGluYWxDbG9zZWQ6IGNhcmRpbmFsQ2xvc2VkLAogICAgICAgIGN1cnZlQ2FyZGluYWxPcGVuOiBjYXJkaW5hbE9wZW4sCiAgICAgICAgY3VydmVDYXJkaW5hbDogY2FyZGluYWwsCiAgICAgICAgY3VydmVDYXRtdWxsUm9tQ2xvc2VkOiBjYXRtdWxsUm9tQ2xvc2VkLAogICAgICAgIGN1cnZlQ2F0bXVsbFJvbU9wZW46IGNhdG11bGxSb21PcGVuLAogICAgICAgIGN1cnZlQ2F0bXVsbFJvbTogY2F0bXVsbFJvbSwKICAgICAgICBjdXJ2ZUxpbmVhckNsb3NlZDogbGluZWFyQ2xvc2VkLAogICAgICAgIGN1cnZlTGluZWFyOiBjdXJ2ZUxpbmVhciwKICAgICAgICBjdXJ2ZU1vbm90b25lWDogbW9ub3RvbmVYLAogICAgICAgIGN1cnZlTW9ub3RvbmVZOiBtb25vdG9uZVksCiAgICAgICAgY3VydmVOYXR1cmFsOiBuYXR1cmFsLAogICAgICAgIGN1cnZlU3RlcDogc3RlcCwKICAgICAgICBjdXJ2ZVN0ZXBBZnRlcjogc3RlcEFmdGVyLAogICAgICAgIGN1cnZlU3RlcEJlZm9yZTogc3RlcEJlZm9yZSwKICAgICAgICBzdGFjazogc3RhY2ssCiAgICAgICAgc3RhY2tPZmZzZXRFeHBhbmQ6IGV4cGFuZCwKICAgICAgICBzdGFja09mZnNldERpdmVyZ2luZzogZGl2ZXJnaW5nJDEsCiAgICAgICAgc3RhY2tPZmZzZXROb25lOiBub25lJDEsCiAgICAgICAgc3RhY2tPZmZzZXRTaWxob3VldHRlOiBzaWxob3VldHRlLAogICAgICAgIHN0YWNrT2Zmc2V0V2lnZ2xlOiB3aWdnbGUsCiAgICAgICAgc3RhY2tPcmRlckFwcGVhcmFuY2U6IGFwcGVhcmFuY2UsCiAgICAgICAgc3RhY2tPcmRlckFzY2VuZGluZzogYXNjZW5kaW5nJDMsCiAgICAgICAgc3RhY2tPcmRlckRlc2NlbmRpbmc6IGRlc2NlbmRpbmckMiwKICAgICAgICBzdGFja09yZGVySW5zaWRlT3V0OiBpbnNpZGVPdXQsCiAgICAgICAgc3RhY2tPcmRlck5vbmU6IG5vbmUkMiwKICAgICAgICBzdGFja09yZGVyUmV2ZXJzZTogcmV2ZXJzZSwKICAgICAgICB0aW1lSW50ZXJ2YWw6IG5ld0ludGVydmFsLAogICAgICAgIHRpbWVNaWxsaXNlY29uZDogbWlsbGlzZWNvbmQsCiAgICAgICAgdGltZU1pbGxpc2Vjb25kczogbWlsbGlzZWNvbmRzLAogICAgICAgIHV0Y01pbGxpc2Vjb25kOiBtaWxsaXNlY29uZCwKICAgICAgICB1dGNNaWxsaXNlY29uZHM6IG1pbGxpc2Vjb25kcywKICAgICAgICB0aW1lU2Vjb25kOiBzZWNvbmQsCiAgICAgICAgdGltZVNlY29uZHM6IHNlY29uZHMsCiAgICAgICAgdXRjU2Vjb25kOiBzZWNvbmQsCiAgICAgICAgdXRjU2Vjb25kczogc2Vjb25kcywKICAgICAgICB0aW1lTWludXRlOiBtaW51dGUsCiAgICAgICAgdGltZU1pbnV0ZXM6IG1pbnV0ZXMsCiAgICAgICAgdGltZUhvdXI6IGhvdXIsCiAgICAgICAgdGltZUhvdXJzOiBob3VycywKICAgICAgICB0aW1lRGF5OiBkYXksCiAgICAgICAgdGltZURheXM6IGRheXMsCiAgICAgICAgdGltZVdlZWs6IHN1bmRheSwKICAgICAgICB0aW1lV2Vla3M6IHN1bmRheXMsCiAgICAgICAgdGltZVN1bmRheTogc3VuZGF5LAogICAgICAgIHRpbWVTdW5kYXlzOiBzdW5kYXlzLAogICAgICAgIHRpbWVNb25kYXk6IG1vbmRheSwKICAgICAgICB0aW1lTW9uZGF5czogbW9uZGF5cywKICAgICAgICB0aW1lVHVlc2RheTogdHVlc2RheSwKICAgICAgICB0aW1lVHVlc2RheXM6IHR1ZXNkYXlzLAogICAgICAgIHRpbWVXZWRuZXNkYXk6IHdlZG5lc2RheSwKICAgICAgICB0aW1lV2VkbmVzZGF5czogd2VkbmVzZGF5cywKICAgICAgICB0aW1lVGh1cnNkYXk6IHRodXJzZGF5LAogICAgICAgIHRpbWVUaHVyc2RheXM6IHRodXJzZGF5cywKICAgICAgICB0aW1lRnJpZGF5OiBmcmlkYXksCiAgICAgICAgdGltZUZyaWRheXM6IGZyaWRheXMsCiAgICAgICAgdGltZVNhdHVyZGF5OiBzYXR1cmRheSwKICAgICAgICB0aW1lU2F0dXJkYXlzOiBzYXR1cmRheXMsCiAgICAgICAgdGltZU1vbnRoOiBtb250aCwKICAgICAgICB0aW1lTW9udGhzOiBtb250aHMsCiAgICAgICAgdGltZVllYXI6IHllYXIsCiAgICAgICAgdGltZVllYXJzOiB5ZWFycywKICAgICAgICB1dGNNaW51dGU6IHV0Y01pbnV0ZSwKICAgICAgICB1dGNNaW51dGVzOiB1dGNNaW51dGVzLAogICAgICAgIHV0Y0hvdXI6IHV0Y0hvdXIsCiAgICAgICAgdXRjSG91cnM6IHV0Y0hvdXJzLAogICAgICAgIHV0Y0RheTogdXRjRGF5LAogICAgICAgIHV0Y0RheXM6IHV0Y0RheXMsCiAgICAgICAgdXRjV2VlazogdXRjU3VuZGF5LAogICAgICAgIHV0Y1dlZWtzOiB1dGNTdW5kYXlzLAogICAgICAgIHV0Y1N1bmRheTogdXRjU3VuZGF5LAogICAgICAgIHV0Y1N1bmRheXM6IHV0Y1N1bmRheXMsCiAgICAgICAgdXRjTW9uZGF5OiB1dGNNb25kYXksCiAgICAgICAgdXRjTW9uZGF5czogdXRjTW9uZGF5cywKICAgICAgICB1dGNUdWVzZGF5OiB1dGNUdWVzZGF5LAogICAgICAgIHV0Y1R1ZXNkYXlzOiB1dGNUdWVzZGF5cywKICAgICAgICB1dGNXZWRuZXNkYXk6IHV0Y1dlZG5lc2RheSwKICAgICAgICB1dGNXZWRuZXNkYXlzOiB1dGNXZWRuZXNkYXlzLAogICAgICAgIHV0Y1RodXJzZGF5OiB1dGNUaHVyc2RheSwKICAgICAgICB1dGNUaHVyc2RheXM6IHV0Y1RodXJzZGF5cywKICAgICAgICB1dGNGcmlkYXk6IHV0Y0ZyaWRheSwKICAgICAgICB1dGNGcmlkYXlzOiB1dGNGcmlkYXlzLAogICAgICAgIHV0Y1NhdHVyZGF5OiB1dGNTYXR1cmRheSwKICAgICAgICB1dGNTYXR1cmRheXM6IHV0Y1NhdHVyZGF5cywKICAgICAgICB1dGNNb250aDogdXRjTW9udGgsCiAgICAgICAgdXRjTW9udGhzOiB1dGNNb250aHMsCiAgICAgICAgdXRjWWVhcjogdXRjWWVhciwKICAgICAgICB1dGNZZWFyczogdXRjWWVhcnMsCiAgICAgICAgdGltZUZvcm1hdERlZmF1bHRMb2NhbGU6IGRlZmF1bHRMb2NhbGUkMSwKICAgICAgICBnZXQgdGltZUZvcm1hdCAoKSB7IHJldHVybiB0aW1lRm9ybWF0OyB9LAogICAgICAgIGdldCB0aW1lUGFyc2UgKCkgeyByZXR1cm4gdGltZVBhcnNlOyB9LAogICAgICAgIGdldCB1dGNGb3JtYXQgKCkgeyByZXR1cm4gdXRjRm9ybWF0OyB9LAogICAgICAgIGdldCB1dGNQYXJzZSAoKSB7IHJldHVybiB1dGNQYXJzZTsgfSwKICAgICAgICB0aW1lRm9ybWF0TG9jYWxlOiBmb3JtYXRMb2NhbGUkMSwKICAgICAgICBpc29Gb3JtYXQ6IGZvcm1hdElzbywKICAgICAgICBpc29QYXJzZTogcGFyc2VJc28sCiAgICAgICAgbm93OiBub3csCiAgICAgICAgdGltZXI6IHRpbWVyLAogICAgICAgIHRpbWVyRmx1c2g6IHRpbWVyRmx1c2gsCiAgICAgICAgdGltZW91dDogdGltZW91dCQxLAogICAgICAgIGludGVydmFsOiBpbnRlcnZhbCQxLAogICAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb24sCiAgICAgICAgYWN0aXZlOiBhY3RpdmUsCiAgICAgICAgaW50ZXJydXB0OiBpbnRlcnJ1cHQsCiAgICAgICAgdm9yb25vaTogdm9yb25vaSwKICAgICAgICB6b29tOiB6b29tLAogICAgICAgIHpvb21UcmFuc2Zvcm06IHRyYW5zZm9ybSQxLAogICAgICAgIHpvb21JZGVudGl0eTogaWRlbnRpdHkkOQogICAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMTYgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBwYWxldHRlcyA9IHsKICAgICAgICBnb29nbGVTdGFuZGFyZDogWwogICAgICAgICAgICAnI2RiNDQzNycsCiAgICAgICAgICAgICcjZmY3MDQzJywKICAgICAgICAgICAgJyNmNGI0MDAnLAogICAgICAgICAgICAnIzBmOWQ1OCcsCiAgICAgICAgICAgICcjMDA3OTZiJywKICAgICAgICAgICAgJyMwMGFjYzEnLAogICAgICAgICAgICAnIzQyODVmNCcsCiAgICAgICAgICAgICcjNWM2YmMwJywKICAgICAgICAgICAgJyNhYjQ3YmMnLAogICAgICAgIF0sCiAgICAgICAgZ29vZ2xlQ29vbDogWwogICAgICAgICAgICAnIzllOWQyNCcsCiAgICAgICAgICAgICcjMGY5ZDU4JywKICAgICAgICAgICAgJyMwMDc5NmInLAogICAgICAgICAgICAnIzAwYWNjMScsCiAgICAgICAgICAgICcjNDI4NWY0JywKICAgICAgICAgICAgJyM1YzZiYzAnLAogICAgICAgICAgICAnIzYwN2Q4YicsCiAgICAgICAgXSwKICAgICAgICBnb29nbGVXYXJtOiBbCiAgICAgICAgICAgICcjNzk1NTQ4JywKICAgICAgICAgICAgJyNhYjQ3YmMnLAogICAgICAgICAgICAnI2YwNjI5MicsCiAgICAgICAgICAgICcjYzIxODViJywKICAgICAgICAgICAgJyNkYjQ0MzcnLAogICAgICAgICAgICAnI2ZmNzA0MycsCiAgICAgICAgICAgICcjZjRiNDAwJywKICAgICAgICBdLAogICAgICAgIGdvb2dsZUNvbG9yQmxpbmRBc3Npc3Q6IFsKICAgICAgICAgICAgJyNmZjcwNDMnLAogICAgICAgICAgICAnIzAwQUNDMScsCiAgICAgICAgICAgICcjQUI0N0JDJywKICAgICAgICAgICAgJyMyQTU2QzYnLAogICAgICAgICAgICAnIzBiODA0MycsCiAgICAgICAgICAgICcjRjdDQjREJywKICAgICAgICAgICAgJyNjMGNhMzMnLAogICAgICAgICAgICAnIzVlMzViMScsCiAgICAgICAgICAgICcjQTUyNzE0JywKICAgICAgICBdLAogICAgICAgIC8vIEEgY29sb3JibGluZC1mcmllbmRseSBwYWxldHRlIGRlc2lnbmVkIGZvciBUZW5zb3JCb2FyZCBieSBQYXVsIFRvbAogICAgICAgIC8vIChodHRwczovL3BlcnNvbmFsLnNyb24ubmwvfnBhdWx0LykuCiAgICAgICAgdGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OiBbCiAgICAgICAgICAgICcjZmY3MDQzJywKICAgICAgICAgICAgJyMwMDc3YmInLAogICAgICAgICAgICAnI2NjMzMxMScsCiAgICAgICAgICAgICcjMzNiYmVlJywKICAgICAgICAgICAgJyNlZTMzNzcnLAogICAgICAgICAgICAnIzAwOTk4OCcsCiAgICAgICAgICAgICcjYmJiYmJiJywKICAgICAgICBdLAogICAgICAgIC8vIFRoZXNlIHBhbGV0dGVzIHRyeSB0byBiZSBiZXR0ZXIgZm9yIGNvbG9yIGRpZmZlcmVudGlhdGlvbi4KICAgICAgICAvLyBodHRwczovL3BlcnNvbmFsLnNyb24ubmwvfnBhdWx0LwogICAgICAgIGNvbG9yQmxpbmRBc3Npc3QxOiBbCiAgICAgICAgICAgICcjNDQ3N2FhJywKICAgICAgICAgICAgJyM0NGFhYWEnLAogICAgICAgICAgICAnI2FhYWE0NCcsCiAgICAgICAgICAgICcjYWE3NzQ0JywKICAgICAgICAgICAgJyNhYTQ0NTUnLAogICAgICAgICAgICAnI2FhNDQ4OCcsCiAgICAgICAgXSwKICAgICAgICBjb2xvckJsaW5kQXNzaXN0MjogWwogICAgICAgICAgICAnIzg4Y2NlZScsCiAgICAgICAgICAgICcjNDRhYTk5JywKICAgICAgICAgICAgJyMxMTc3MzMnLAogICAgICAgICAgICAnIzk5OTkzMycsCiAgICAgICAgICAgICcjZGRjYzc3JywKICAgICAgICAgICAgJyNjYzY2NzcnLAogICAgICAgICAgICAnIzg4MjI1NScsCiAgICAgICAgICAgICcjYWE0NDk5JywKICAgICAgICBdLAogICAgICAgIGNvbG9yQmxpbmRBc3Npc3QzOiBbCiAgICAgICAgICAgICcjMzMyMjg4JywKICAgICAgICAgICAgJyM2Njk5Y2MnLAogICAgICAgICAgICAnIzg4Y2NlZScsCiAgICAgICAgICAgICcjNDRhYTk5JywKICAgICAgICAgICAgJyMxMTc3MzMnLAogICAgICAgICAgICAnIzk5OTkzMycsCiAgICAgICAgICAgICcjZGRjYzc3JywKICAgICAgICAgICAgJyNjYzY2NzcnLAogICAgICAgICAgICAnI2FhNDQ2NicsCiAgICAgICAgICAgICcjODgyMjU1JywKICAgICAgICAgICAgJyM2NjExMDAnLAogICAgICAgICAgICAnI2FhNDQ5OScsCiAgICAgICAgXSwKICAgICAgICBjb2xvckJsaW5kQXNzaXN0NDogWwogICAgICAgICAgICAvLyBQYXVsIFRvbCdzICJBbHRlcm5hdGl2ZSBTY2hlbWUgZm9yIFF1YWxpdGF0aXZlIERhdGEiLiBQcmVmZXJyZWQKICAgICAgICAgICAgLy8gaWYgYHRlbnNvcmJvYXJkQ29sb3JCbGluZEFzc2lzdGAgY2Fubm90IGJlIHVzZWQgZm9yIGFueSByZWFzb24uCiAgICAgICAgICAgICcjNDQ3N2FhJywKICAgICAgICAgICAgJyM2NmNjZWUnLAogICAgICAgICAgICAnIzIyODgzMycsCiAgICAgICAgICAgICcjY2NiYjQ0JywKICAgICAgICAgICAgJyNlZTY2NzcnLAogICAgICAgICAgICAnI2FhMzM3NycsCiAgICAgICAgICAgICcjYmJiYmJiJywKICAgICAgICBdLAogICAgICAgIC8vIGJhc2VkIG9uIHRoaXMgcGFsZXR0ZTogaHR0cDovL21rd2ViLmJjZ3NjLmNhL2Jpb3ZpczIwMTIvCiAgICAgICAgY29sb3JCbGluZEFzc2lzdDU6IFsKICAgICAgICAgICAgJyNGRjZEQjYnLAogICAgICAgICAgICAnIzkyMDAwMCcsCiAgICAgICAgICAgICcjOTI0OTAwJywKICAgICAgICAgICAgJyNEQkQxMDAnLAogICAgICAgICAgICAnIzI0RkYyNCcsCiAgICAgICAgICAgICcjMDA2RERCJywKICAgICAgICAgICAgJyM0OTAwOTInLAogICAgICAgIF0sCiAgICAgICAgbWxkYXNoOiBbCiAgICAgICAgICAgICcjRTQ3RUFEJywKICAgICAgICAgICAgJyNGNDY0MEQnLAogICAgICAgICAgICAnI0ZBQTMwMCcsCiAgICAgICAgICAgICcjRjVFNjM2JywKICAgICAgICAgICAgJyMwMEEwNzcnLAogICAgICAgICAgICAnIzAwNzdCOCcsCiAgICAgICAgICAgICcjMDBCN0VEJywKICAgICAgICBdLAogICAgfTsKICAgIGNvbnN0IHN0YW5kYXJkID0gcGFsZXR0ZXMudGVuc29yYm9hcmRDb2xvckJsaW5kQXNzaXN0OwoKICAgIC8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgRXhwZXJpbWVudHNTdG9yZSBleHRlbmRzIEJhc2VTdG9yZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX2V4cGVyaW1lbnRzID0gW107CiAgICAgICAgfQogICAgICAgIGxvYWQoKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLmV4cGVyaW1lbnRzKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKChuZXdFeHBlcmltZW50cykgPT4gewogICAgICAgICAgICAgICAgaWYgKCFsb2Rhc2guaXNFcXVhbCh0aGlzLl9leHBlcmltZW50cywgbmV3RXhwZXJpbWVudHMpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXhwZXJpbWVudHMgPSBuZXdFeHBlcmltZW50czsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVtaXRDaGFuZ2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCB0aGUgY3VycmVudCBsaXN0IG9mIGV4cGVyaW1lbnRzLiBJZiBubyBkYXRhIGlzIGF2YWlsYWJsZSwgdGhpcyB3aWxsIGJlCiAgICAgICAgICogYW4gZW1wdHkgYXJyYXkgKGkuZS4sIHRoZXJlIGlzIG5vIGRpc3RpbmN0aW9uIGJldHdlZW4gIm5vIGV4cGVyaW1lbnQiIGFuZAogICAgICAgICAqICJubyBleHBlcmltZW50IHlldCIpLgogICAgICAgICAqLwogICAgICAgIGdldEV4cGVyaW1lbnRzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwZXJpbWVudHMuc2xpY2UoKTsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCBleHBlcmltZW50c1N0b3JlID0gbmV3IEV4cGVyaW1lbnRzU3RvcmUoKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8vIEV4YW1wbGUgdXNhZ2U6CiAgICAvLyBydW5zID0gWyJ0cmFpbiIsICJ0ZXN0IiwgInRlc3QxIiwgInRlc3QyIl0KICAgIC8vIGNjcyA9IG5ldyBDb2xvclNjYWxlKCk7CiAgICAvLyBjY3MuZG9tYWluKHJ1bnMpOwogICAgLy8gY2NzLmdldENvbG9yKCJ0cmFpbiIpOwogICAgLy8gY2NzLmdldENvbG9yKCJ0ZXN0MSIpOwogICAgY2xhc3MgQ29sb3JTY2FsZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGNvbG9yIHNjYWxlIHdpdGggb3B0aW9uYWwgY3VzdG9tIHBhbGV0dGUuCiAgICAgICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBwYWxldHRlIFRoZSBjb2xvciBwYWxldHRlIHRvIHVzZSwgYXMgYW4KICAgICAgICAgKiAgIEFycmF5IG9mIGhleCBzdHJpbmdzLiBEZWZhdWx0cyB0byB0aGUgc3RhbmRhcmQgcGFsZXR0ZS4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihwYWxldHRlID0gc3RhbmRhcmQpIHsKICAgICAgICAgICAgdGhpcy5wYWxldHRlID0gcGFsZXR0ZTsKICAgICAgICAgICAgdGhpcy5pZGVudGlmaWVycyA9IG1hcCQxKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0aGUgZG9tYWluIG9mIHN0cmluZ3MuCiAgICAgICAgICogQHBhcmFtIHtBcnJheTxzdHJpbmc+fSBzdHJpbmdzIC0gQW4gYXJyYXkgb2YgcG9zc2libGUgc3RyaW5ncyB0byB1c2UgYXMgdGhlCiAgICAgICAgICogICAgIGRvbWFpbiBmb3IgeW91ciBzY2FsZS4KICAgICAgICAgKi8KICAgICAgICBzZXREb21haW4oc3RyaW5ncykgewogICAgICAgICAgICB0aGlzLmlkZW50aWZpZXJzID0gbWFwJDEoKTsKICAgICAgICAgICAgc3RyaW5ncy5mb3JFYWNoKChzLCBpKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmlkZW50aWZpZXJzLnNldChzLCB0aGlzLnBhbGV0dGVbaSAlIHRoaXMucGFsZXR0ZS5sZW5ndGhdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVc2UgdGhlIGNvbG9yIHNjYWxlIHRvIHRyYW5zZm9ybSBhbiBlbGVtZW50IGluIHRoZSBkb21haW4gaW50byBhIGNvbG9yLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgaW5wdXQgc3RyaW5nIHRvIG1hcCB0byBhIGNvbG9yLgogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhhdCBpbnB1dCBzdHJpbmcuCiAgICAgICAgICogQHRocm93cyBXaWxsIGVycm9yIGlmIGlucHV0IHN0cmluZyBpcyBub3QgaW4gdGhlIHNjYWxlJ3MgZG9tYWluLgogICAgICAgICAqLwogICAgICAgIGdldENvbG9yKHMpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlkZW50aWZpZXJzLmhhcyhzKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgJHtzfSB3YXMgbm90IGluIHRoZSBkb21haW4uYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaWRlbnRpZmllcnMuZ2V0KHMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBjb2xvciBzY2FsZSBvZiBhIGRvbWFpbiBmcm9tIGEgc3RvcmUuIEF1dG9tYXRpY2FsbHkgdXBkYXRlZCB3aGVuIHRoZSBzdG9yZQogICAgICogZW1pdHMgYSBjaGFuZ2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUF1dG9VcGRhdGVDb2xvclNjYWxlKHN0b3JlLCBnZXREb21haW4pIHsKICAgICAgICBjb25zdCBjb2xvclNjYWxlID0gbmV3IENvbG9yU2NhbGUoKTsKICAgICAgICBmdW5jdGlvbiB1cGRhdGVSdW5zQ29sb3JTY2FsZSgpIHsKICAgICAgICAgICAgY29sb3JTY2FsZS5zZXREb21haW4oZ2V0RG9tYWluKCkpOwogICAgICAgIH0KICAgICAgICBzdG9yZS5hZGRMaXN0ZW5lcih1cGRhdGVSdW5zQ29sb3JTY2FsZSk7CiAgICAgICAgdXBkYXRlUnVuc0NvbG9yU2NhbGUoKTsKICAgICAgICByZXR1cm4gKGRvbWFpbikgPT4gY29sb3JTY2FsZS5nZXRDb2xvcihkb21haW4pOwogICAgfQogICAgY29uc3QgcnVuc0NvbG9yU2NhbGUgPSBjcmVhdGVBdXRvVXBkYXRlQ29sb3JTY2FsZShydW5zU3RvcmUsICgpID0+IHJ1bnNTdG9yZS5nZXRSdW5zKCkpOwogICAgY29uc3QgZXhwZXJpbWVudHNDb2xvclNjYWxlID0gY3JlYXRlQXV0b1VwZGF0ZUNvbG9yU2NhbGUoZXhwZXJpbWVudHNTdG9yZSwgKCkgPT4gewogICAgICAgIHJldHVybiBleHBlcmltZW50c1N0b3JlLmdldEV4cGVyaW1lbnRzKCkubWFwKCh7IG5hbWUgfSkgPT4gbmFtZSk7CiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHJlZ2lzdGVyU3R5bGVEb21Nb2R1bGUoewogICAgICAgIG1vZHVsZU5hbWU6ICdydW4tY29sb3Itc3R5bGUnLAogICAgICAgIHN0eWxlQ29udGVudDogYAogICAgW2NvbG9yLWNsYXNzPSdsaWdodC1ibHVlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtNTAwKTsKICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItbGlnaHQtYmx1ZS05MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWxpZ2h0LWJsdWUtOTAwKTsKICAgIH0KICAgIFtjb2xvci1jbGFzcz0ncmVkJ10gcGFwZXItY2hlY2tib3ggewogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1yZWQtNTAwKTsKICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXJlZC05MDApOwogICAgfQogICAgW2NvbG9yLWNsYXNzPSdncmVlbiddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItZ3JlZW4tOTAwKTsKICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1ncmVlbi05MDApOwogICAgfQogICAgW2NvbG9yLWNsYXNzPSdwdXJwbGUnXSBwYXBlci1jaGVja2JveCB7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTUwMCk7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXB1cnBsZS01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcHVycGxlLTkwMCk7CiAgICB9CiAgICBbY29sb3ItY2xhc3M9J3RlYWwnXSBwYXBlci1jaGVja2JveCB7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTUwMCk7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci10ZWFsLTkwMCk7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItdGVhbC05MDApOwogICAgfQogICAgW2NvbG9yLWNsYXNzPSdwaW5rJ10gcGFwZXItY2hlY2tib3ggewogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLXBpbmstNTAwKTsKICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItcGluay01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItcGluay05MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLXBpbmstOTAwKTsKICAgIH0KICAgIFtjb2xvci1jbGFzcz0nb3JhbmdlJ10gcGFwZXItY2hlY2tib3ggewogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1vcmFuZ2UtNTAwKTsKICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLW9yYW5nZS05MDApOwogICAgfQogICAgW2NvbG9yLWNsYXNzPSdicm93biddIHBhcGVyLWNoZWNrYm94IHsKICAgICAgLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LWNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItYnJvd24tOTAwKTsKICAgICAgLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yOiB2YXIoLS1wYXBlci1icm93bi05MDApOwogICAgfQogICAgW2NvbG9yLWNsYXNzPSdpbmRpZ28nXSBwYXBlci1jaGVja2JveCB7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTUwMCk7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3I6IHZhcigtLXBhcGVyLWluZGlnby01MDApOwogICAgICAtLXBhcGVyLWNoZWNrYm94LXVuY2hlY2tlZC1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICAgIC0tcGFwZXItY2hlY2tib3gtdW5jaGVja2VkLWluay1jb2xvcjogdmFyKC0tcGFwZXItaW5kaWdvLTkwMCk7CiAgICB9CiAgYCwKICAgIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoKICAgIHRmLW11bHRpLWNoZWNrYm94IGNyZWF0ZXMgYSBsaXN0IG9mIGNoZWNrYm94ZXMgdGhhdCBjYW4gYmUgdXNlZCB0byB0b2dnbGUgb24gb3Igb2ZmCiAgICBhIGxhcmdlIG51bWJlciBvZiB2YWx1ZXMuIEVhY2ggY2hlY2tib3ggZGlzcGxheXMgYSBuYW1lLCBhbmQgbWF5IGFsc28gaGF2ZSBhbgogICAgYXNzb2NpYXRlZCB0b29sdGlwIHZhbHVlLiBDaGVja2JveGVzIGNhbiBiZSBoaWdobGlnaHRlZCwgaGlkZGVuLCBhbmQgcmUtb3JkZXJlZC4KCiAgICB0Zi1tdWx0aS1jaGVja2JveCBhc3N1bWVzIHRoYXQgdGhlIG5hbWVzIG1heSBiZSB2ZXJ5IGxvbmcgY29tcGFyZWQgdG8gdGhlIHdpZHRoCiAgICBvZiB0aGUgY2hlY2tib3gsIGFuZCB0aGUgbnVtYmVyIG9mIG5hbWVzIG1heSBhbHNvIGJlIHZlcnkgbGFyZ2UsIGFuZCB3b3JrcyB0bwogICAgaGFuZGxlIHRoZXNlIHNpdHVhdGlvbnMgZ3JhY2VmdWxseS4KICAgICovCiAgICBsZXQgVGZNdWx0aUNoZWNrYm94ID0gY2xhc3MgVGZNdWx0aUNoZWNrYm94IGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8vIEFsbCB0aGUgdmFsdWVzIG9mIHRoZSBjaGVja2JveC4KICAgICAgICAgICAgdGhpcy5uYW1lcyA9IFtdOwogICAgICAgICAgICB0aGlzLmNvbG9yaW5nID0gewogICAgICAgICAgICAgICAgZ2V0Q29sb3I6ICgpID0+ICcnLAogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBSZWdleCBmb3IgZmlsdGVyaW5nIHRoZSBuYW1lcy4KICAgICAgICAgICAgdGhpcy5yZWdleCA9ICcnOwogICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXRlID0ge307CiAgICAgICAgICAgIHRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdCA9IDQwOwogICAgICAgICAgICAvLyBVcGRhdGluZyB0aGUgcmVnZXggY2FuIGJlIHNsb3csIGJlY2F1c2UgaXQgaW52b2x2ZXMgdXBkYXRpbmcgc3R5bGVzCiAgICAgICAgICAgIC8vIG9uIGEgbGFyZ2UgbnVtYmVyIG9mIFBvbHltZXIgcGFwZXItY2hlY2tib3hlcy4gV2UgZG9uJ3Qgd2FudCB0byBkbwogICAgICAgICAgICAvLyB0aGlzIHdoaWxlIHRoZSB1c2VyIGlzIHR5cGluZywgYXMgaXQgbWF5IG1ha2UgYSBiYWQsIGxhZ2d5IFVJLgogICAgICAgICAgICAvLyBTbyB3ZSBkZWJvdW5jZSB0aGUgdXBkYXRlcyB0aGF0IGNvbWUgZnJvbSB1c2VyIHR5cGluZy4KICAgICAgICAgICAgdGhpcy5fZGVib3VuY2VkUmVnZXhDaGFuZ2UgPSB0aGlzLl9kZWJvdW5jZWRSZWdleENoYW5nZUltcGwoKTsKICAgICAgICB9CiAgICAgICAgX2RlYm91bmNlZFJlZ2V4Q2hhbmdlSW1wbCgpIHsKICAgICAgICAgICAgdmFyIGRlYm91bmNlZCA9IGxvZGFzaC5kZWJvdW5jZSgocikgPT4gewogICAgICAgICAgICAgICAgdGhpcy5yZWdleCA9IHI7CiAgICAgICAgICAgIH0sIDE1MCwgeyBsZWFkaW5nOiBmYWxzZSB9KTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciByID0gdGhpcy4kJCgnI25hbWVzLXJlZ2V4JykudmFsdWU7CiAgICAgICAgICAgICAgICBpZiAociA9PSAnJykgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGNsZWFyZWQgdGhlIGZpZWxkLCB0aGV5IG1heSBiZSBkb25lIHR5cGluZywgc28KICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgbW9yZSBxdWlja2x5LgogICAgICAgICAgICAgICAgICAgIHRoaXMuYXN5bmMoKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlZ2V4ID0gcjsKICAgICAgICAgICAgICAgICAgICB9LCAzMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBkZWJvdW5jZWQocik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIGdldCBfcmVnZXgoKSB7CiAgICAgICAgICAgIHZhciByZWdleFN0cmluZyA9IHRoaXMucmVnZXg7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJlZ0V4cChyZWdleFN0cmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9zZXRJc29sYXRvckljb24oKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3Rpb25NYXAgPSB0aGlzLnNlbGVjdGlvblN0YXRlOwogICAgICAgICAgICB2YXIgbnVtQ2hlY2tlZCA9IGxvZGFzaC5maWx0ZXIobG9kYXNoLnZhbHVlcyhzZWxlY3Rpb25NYXApKS5sZW5ndGg7CiAgICAgICAgICAgIHZhciBidXR0b25zID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJy5pc29sYXRvcicpKTsKICAgICAgICAgICAgYnV0dG9ucy5mb3JFYWNoKGZ1bmN0aW9uIChiKSB7CiAgICAgICAgICAgICAgICBpZiAobnVtQ2hlY2tlZCA9PT0gMSAmJiBzZWxlY3Rpb25NYXBbYi5uYW1lXSkgewogICAgICAgICAgICAgICAgICAgIGIuaWNvbiA9ICdyYWRpby1idXR0b24tY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBiLmljb24gPSAncmFkaW8tYnV0dG9uLXVuY2hlY2tlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4KF9fLCBfX18pIHsKICAgICAgICAgICAgY29uc3QgcmVnZXggPSB0aGlzLl9yZWdleDsKICAgICAgICAgICAgcmV0dXJuIHJlZ2V4ID8gdGhpcy5uYW1lcy5maWx0ZXIoKG4pID0+IHJlZ2V4LnRlc3QobikpIDogdGhpcy5uYW1lczsKICAgICAgICB9CiAgICAgICAgY29tcHV0ZU91dFNlbGVjdGVkKF9fLCBfX18pIHsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvblN0YXRlID0gdGhpcy5zZWxlY3Rpb25TdGF0ZTsKICAgICAgICAgICAgdmFyIG51bSA9IHRoaXMubWF4TmFtZXNUb0VuYWJsZUJ5RGVmYXVsdDsKICAgICAgICAgICAgdmFyIGFsbEVuYWJsZWQgPSB0aGlzLm5hbWVzTWF0Y2hpbmdSZWdleC5sZW5ndGggPD0gbnVtOwogICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguZmlsdGVyKChuKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uU3RhdGVbbl0gPT0gbnVsbCA/IGFsbEVuYWJsZWQgOiBzZWxlY3Rpb25TdGF0ZVtuXTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHN5bmNocm9uaXplQ29sb3JzKGUpIHsKICAgICAgICAgICAgdGhpcy5fc2V0SXNvbGF0b3JJY29uKCk7CiAgICAgICAgICAgIGNvbnN0IGNoZWNrYm94ZXMgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgncGFwZXItY2hlY2tib3gnKTsKICAgICAgICAgICAgY2hlY2tib3hlcy5mb3JFYWNoKChwKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjb2xvciA9IHRoaXMuY29sb3JpbmcuZ2V0Q29sb3IocC5uYW1lKTsKICAgICAgICAgICAgICAgIHAudXBkYXRlU3R5bGVzKHsKICAgICAgICAgICAgICAgICAgICAnLS1wYXBlci1jaGVja2JveC1jaGVja2VkLWNvbG9yJzogY29sb3IsCiAgICAgICAgICAgICAgICAgICAgJy0tcGFwZXItY2hlY2tib3gtY2hlY2tlZC1pbmstY29sb3InOiBjb2xvciwKICAgICAgICAgICAgICAgICAgICAnLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtY29sb3InOiBjb2xvciwKICAgICAgICAgICAgICAgICAgICAnLS1wYXBlci1jaGVja2JveC11bmNoZWNrZWQtaW5rLWNvbG9yJzogY29sb3IsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGJ1dHRvbnMgPSB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgnLmlzb2xhdG9yJyk7CiAgICAgICAgICAgIGJ1dHRvbnMuZm9yRWFjaCgocCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY29sb3IgPSB0aGlzLmNvbG9yaW5nLmdldENvbG9yKHAubmFtZSk7CiAgICAgICAgICAgICAgICBwLnN0eWxlWydjb2xvciddID0gY29sb3I7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBUaGUgdXBkYXRlU3R5bGVzIGNhbGwgZmFpbHMgc2lsZW50bHkgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBoYXZlIGZvY3VzLAogICAgICAgICAgICAvLyBlLmcuIGlmIFRlbnNvckJvYXJkIHdhcyBvcGVuZWQgaW50byBhIG5ldyB0YWIgdGhhdCBpc24ndCB2aXNpYmxlLgogICAgICAgICAgICAvLyBTbyB3ZSB3YWl0IGZvciByZXF1ZXN0QW5pbWF0aW9uRnJhbWUuCiAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9pc29sYXRlTmFtZShlKSB7CiAgICAgICAgICAgIC8vIElmIHVzZXIgY2xpY2tzIG9uIHRoZSBsYWJlbCBmb3Igb25lIG5hbWUsIGVuYWJsZSBpdCBhbmQgZGlzYWJsZSBhbGwgb3RoZXIKICAgICAgICAgICAgLy8gbmFtZXMuCiAgICAgICAgICAgIHZhciBuYW1lID0gZS50YXJnZXQubmFtZTsKICAgICAgICAgICAgdmFyIHNlbGVjdGlvblN0YXRlID0ge307CiAgICAgICAgICAgIHRoaXMubmFtZXMuZm9yRWFjaChmdW5jdGlvbiAobikgewogICAgICAgICAgICAgICAgc2VsZWN0aW9uU3RhdGVbbl0gPSBuID09IG5hbWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnNlbGVjdGlvblN0YXRlID0gc2VsZWN0aW9uU3RhdGU7CiAgICAgICAgfQogICAgICAgIF9jaGVja2JveENoYW5nZShlKSB7CiAgICAgICAgICAgIHZhciB0YXJnZXQgPSBlLnRhcmdldDsKICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0aW9uU3RhdGUgPSBsb2Rhc2guY2xvbmUodGhpcy5zZWxlY3Rpb25TdGF0ZSk7CiAgICAgICAgICAgIG5ld1NlbGVjdGlvblN0YXRlW3RhcmdldC5uYW1lXSA9IHRhcmdldC5jaGVja2VkOwogICAgICAgICAgICAvLyBuLmIuIG5vdGlmeVBhdGggd29uJ3Qgd29yayBiZWNhdXNlIG5hbWVzIG1heSBoYXZlIHBlcmlvZHMuCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uU3RhdGUgPSBuZXdTZWxlY3Rpb25TdGF0ZTsKICAgICAgICB9CiAgICAgICAgX2lzQ2hlY2tlZChpdGVtLCBvdXRTZWxlY3RlZENoYW5nZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vdXRTZWxlY3RlZC5pbmRleE9mKGl0ZW0pICE9IC0xOwogICAgICAgIH0KICAgICAgICB0b2dnbGVBbGwoKSB7CiAgICAgICAgICAgIC8vIElmIGFueSBhcmUgdG9nZ2xlZCBvbiwgd2UgdHVybiBldmVyeXRoaW5nIG9mZi4gT3IsIGlmIG5vbmUgYXJlIHRvZ2dsZWQKICAgICAgICAgICAgLy8gb24sIHdlIHR1cm4gZXZlcnl0aGluZyBvbi4KICAgICAgICAgICAgY29uc3QgYW55VG9nZ2xlZE9uID0gdGhpcy5uYW1lc01hdGNoaW5nUmVnZXguc29tZSgobmFtZSkgPT4gdGhpcy5vdXRTZWxlY3RlZC5pbmNsdWRlcyhuYW1lKSk7CiAgICAgICAgICAgIGNvbnN0IG5ld1NlbGVjdGlvblN0YXRlID0ge307CiAgICAgICAgICAgIHRoaXMubmFtZXMuZm9yRWFjaCgobikgPT4gewogICAgICAgICAgICAgICAgbmV3U2VsZWN0aW9uU3RhdGVbbl0gPSAhYW55VG9nZ2xlZE9uOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25TdGF0ZSA9IG5ld1NlbGVjdGlvblN0YXRlOwogICAgICAgIH0KICAgIH07CiAgICBUZk11bHRpQ2hlY2tib3gudGVtcGxhdGUgPSBodG1sIGAKICAgIDxzdHlsZSBpbmNsdWRlPSJzY3JvbGxiYXItc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGUgaW5jbHVkZT0icnVuLWNvbG9yLXN0eWxlIj48L3N0eWxlPgoKICAgIDxwYXBlci1pbnB1dAogICAgICBpZD0ibmFtZXMtcmVnZXgiCiAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgIGxhYmVsPSJXcml0ZSBhIHJlZ2V4IHRvIGZpbHRlciBydW5zIgogICAgICB2YWx1ZT0iW1tyZWdleF1dIgogICAgICBvbi1iaW5kLXZhbHVlLWNoYW5nZWQ9Il9kZWJvdW5jZWRSZWdleENoYW5nZSIKICAgID48L3BhcGVyLWlucHV0PgogICAgPGRpdiBpZD0ib3V0ZXItY29udGFpbmVyIiBjbGFzcz0ic2Nyb2xsYmFyIj4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9IltbbmFtZXNNYXRjaGluZ1JlZ2V4XV0iCiAgICAgICAgb24tZG9tLWNoYW5nZT0ic3luY2hyb25pemVDb2xvcnMiCiAgICAgID4KICAgICAgICA8ZGl2IGNsYXNzPSJuYW1lLXJvdyI+CiAgICAgICAgICA8ZGl2CiAgICAgICAgICAgIGNsYXNzPSJpY29uLWNvbnRhaW5lciBjaGVja2JveC1jb250YWluZXIgdmVydGljYWwtYWxpZ24tY29udGFpbmVyIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjbGFzcz0iY2hlY2tib3ggdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIGlkJD0iY2hlY2tib3gtW1tpdGVtXV0iCiAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtXV0iCiAgICAgICAgICAgICAgY2hlY2tlZCQ9IltbX2lzQ2hlY2tlZChpdGVtLCBzZWxlY3Rpb25TdGF0ZS4qKV1dIgogICAgICAgICAgICAgIG9uLWNoYW5nZT0iX2NoZWNrYm94Q2hhbmdlIgogICAgICAgICAgICA+PC9wYXBlci1jaGVja2JveD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iaWNvbi1jb250YWluZXIgaXNvbGF0b3ItY29udGFpbmVyIHZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgICAgaWNvbj0icmFkaW8tYnV0dG9uLXVuY2hlY2tlZCIKICAgICAgICAgICAgICBjbGFzcz0iaXNvbGF0b3IgdmVydGljYWwtYWxpZ24tY2VudGVyIgogICAgICAgICAgICAgIG9uLXRhcD0iX2lzb2xhdGVOYW1lIgogICAgICAgICAgICAgIG5hbWU9IltbaXRlbV1dIgogICAgICAgICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0iaXRlbS1sYWJlbC1jb250YWluZXIiPgogICAgICAgICAgICA8c3Bhbj5bW2l0ZW1dXTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIHBhcGVyLWlucHV0IHsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItaW5wdXQ6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXItbGFiZWw6IHsKICAgICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICB9CiAgICAgIH0KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQogICAgICAjb3V0ZXItY29udGFpbmVyIHsKICAgICAgICBjb250YWluOiBjb250ZW50OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAubmFtZS1yb3cgewogICAgICAgIGNvbnRhaW46IGNvbnRlbnQ7CiAgICAgICAgcGFkZGluZy10b3A6IDVweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogNXB4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstYWxsOyAvKiBtYWtlcyB3cmFwcGluZyBvZiBoeXBlcnBhcmFtIHN0cmluZ3MgYmV0dGVyICovCiAgICAgIH0KICAgICAgLmljb24tY29udGFpbmVyIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAycHg7CiAgICAgIH0KICAgICAgLmNoZWNrYm94IHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmlzb2xhdG9yIHsKICAgICAgICB3aWR0aDogMThweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgICAgcGFkZGluZzogMHB4OwogICAgICB9CiAgICAgIC5pc29sYXRvci1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNnB4OwogICAgICAgIHBhZGRpbmctcmlnaHQ6IDNweDsKICAgICAgfQogICAgICAuY2hlY2tib3gtY29udGFpbmVyIHsKICAgICAgICBwYWRkaW5nLWxlZnQ6IDJweDsKICAgICAgfQogICAgICAuaXRlbS1sYWJlbC1jb250YWluZXIgewogICAgICAgIHBhZGRpbmctbGVmdDogNXB4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICB3aWR0aDogMHB4OyAvKiBoYWNrIHRvIGdldCB0aGUgZmxleC1ncm93IHRvIHdvcmsgcHJvcGVybHkgKi8KICAgICAgfQogICAgICAudG9vbHRpcC12YWx1ZS1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIHBhZGRpbmctbGVmdDogMnB4OwogICAgICB9CiAgICAgIC52ZXJ0aWNhbC1hbGlnbi1jb250YWluZXIgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tY2VudGVyIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgIH0KICAgICAgLnZlcnRpY2FsLWFsaWduLWNvbnRhaW5lciAudmVydGljYWwtYWxpZ24tdG9wIHsKICAgICAgICBhbGlnbi1zZWxmOiBzdGFydDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZNdWx0aUNoZWNrYm94LnByb3RvdHlwZSwgIm5hbWVzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZNdWx0aUNoZWNrYm94LnByb3RvdHlwZSwgImNvbG9yaW5nIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk11bHRpQ2hlY2tib3gucHJvdG90eXBlLCAicmVnZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgY29tcHV0ZWQ6ICdjb21wdXRlTmFtZXNNYXRjaGluZ1JlZ2V4KG5hbWVzLiosIF9yZWdleCknLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZk11bHRpQ2hlY2tib3gucHJvdG90eXBlLCAibmFtZXNNYXRjaGluZ1JlZ2V4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgLy8gSWYgYSBuYW1lIGlzIGV4cGxpY2l0bHkgZW5hYmxlZCBieSB1c2VyIGdlc3R1cmUsIFRydWUsIGlmIGV4cGxpY2l0bHkKICAgICAgICAgICAgLy8gZGlzYWJsZWQsIEZhbHNlLiBJZiB1bmRlZmluZWQsIGRlZmF1bHQgdmFsdWUgKGVuYWJsZSBmb3IgZmlyc3QgawogICAgICAgICAgICAvLyBuYW1lcywgZGlzYWJsZSBhZnRlcikuCiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZNdWx0aUNoZWNrYm94LnByb3RvdHlwZSwgInNlbGVjdGlvblN0YXRlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgY29tcHV0ZWQ6ICdjb21wdXRlT3V0U2VsZWN0ZWQobmFtZXNNYXRjaGluZ1JlZ2V4LiosIHNlbGVjdGlvblN0YXRlLiopJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZNdWx0aUNoZWNrYm94LnByb3RvdHlwZSwgIm91dFNlbGVjdGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgLy8gV2hlbiBUQiBmaXJzdCBsb2FkcywgaWYgaXQgaGFzIGsgb3IgZmV3ZXIgbmFtZXMsIHRoZXkgYXJlIGFsbCBlbmFibGVkCiAgICAgICAgICAgIC8vIGJ5IGRlZmF1bHQuIElmIHRoZXJlIGFyZSBtb3JlLCB0aGVuIHRoZXkgYXJlIGFsbCBkaXNhYmxlZC4KICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZNdWx0aUNoZWNrYm94LnByb3RvdHlwZSwgIm1heE5hbWVzVG9FbmFibGVCeURlZmF1bHQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk11bHRpQ2hlY2tib3gucHJvdG90eXBlLCAiX2RlYm91bmNlZFJlZ2V4Q2hhbmdlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdyZWdleCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVnRXhwKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZNdWx0aUNoZWNrYm94LnByb3RvdHlwZSwgIl9yZWdleCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnc2VsZWN0aW9uU3RhdGUnLCAnbmFtZXMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmTXVsdGlDaGVja2JveC5wcm90b3R5cGUsICJfc2V0SXNvbGF0b3JJY29uIiwgbnVsbCk7CiAgICBUZk11bHRpQ2hlY2tib3ggPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1tdWx0aS1jaGVja2JveCcpCiAgICBdLCBUZk11bHRpQ2hlY2tib3gpOwoKICAgIC8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLy8gdGYtd2JyLXN0cmluZyBzYWZlbHkgcmVuZGVycyBhIHN0cmluZywgd2l0aCA8d2JyPiB3b3JkIGJyZWFrIGVsZW1lbnRzIGluc2VydGVkCiAgICAvLyBhZnRlciBzdWJzdHJpbmdzIHRoYXQgbWF0Y2ggYSByZWd1bGFyIGV4cHJlc3Npb24gcGF0dGVybi4KICAgIGxldCBUZldiclN0cmluZyA9IGNsYXNzIFRmV2JyU3RyaW5nIGV4dGVuZHMgUG9seW1lckVsZW1lbnQgewogICAgICAgIGdldCBfcGFydHMoKSB7CiAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIHZhciBkZWxpbWl0ZXJQYXR0ZXJuID0gdGhpcy5kZWxpbWl0ZXJQYXR0ZXJuOwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRlbGltaXRlclJlZ0V4cCA9IG5ldyBSZWdFeHAoZGVsaW1pdGVyUGF0dGVybiwgJ2cnKTsKICAgICAgICAgICAgICAgIGRlbGltaXRlclJlZ0V4cC50ZXN0KHZhbHVlKTsKICAgICAgICAgICAgICAgIGlmIChkZWxpbWl0ZXJSZWdFeHAubGFzdEluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUuc2xpY2UoMCwgZGVsaW1pdGVyUmVnRXhwLmxhc3RJbmRleCkpOwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoZGVsaW1pdGVyUmVnRXhwLmxhc3RJbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICB9OwogICAgVGZXYnJTdHJpbmcudGVtcGxhdGUgPSBodG1sIGAKICAgIDwhLS0KICAgICAgVGhpcyB1Z2x5IGZvcm1hdHRpbmcgaXMgcmVxdWlyZWQgdG8gcHJldmVudCBzcGFjZXMgZnJvbSBzbGlwcGluZwogICAgICBpbnRvIHRoZSBIVE1MLgogICAgLS0+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19wYXJ0c11dIiBhcz0icGFydCIKICAgICAgPltbcGFydF1dPHdicgogICAgLz48L3RlbXBsYXRlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmV2JyU3RyaW5nLnByb3RvdHlwZSwgInZhbHVlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZXYnJTdHJpbmcucHJvdG90eXBlLCAiZGVsaW1pdGVyUGF0dGVybiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgndmFsdWUnLCAnZGVsaW1pdGVyUGF0dGVybicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZldiclN0cmluZy5wcm90b3R5cGUsICJfcGFydHMiLCBudWxsKTsKICAgIFRmV2JyU3RyaW5nID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtd2JyLXN0cmluZycpCiAgICBdLCBUZldiclN0cmluZyk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZSdW5zU2VsZWN0b3IgPSBjbGFzcyBUZlJ1bnNTZWxlY3RvciBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLnJ1blNlbGVjdGlvblN0YXRlID0gZ2V0T2JqZWN0SW5pdGlhbGl6ZXIoJ3J1blNlbGVjdGlvblN0YXRlJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB7fSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLnJlZ2V4SW5wdXQgPSBnZXRTdHJpbmdJbml0aWFsaXplcigncmVnZXhJbnB1dCcsIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogJycsCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCA9IDI1MDsKICAgICAgICAgICAgdGhpcy5fZGF0YUxvY2F0aW9uRGVsaW1pdGVyUGF0dGVybiA9ICdbLz1fLC1dJzsKICAgICAgICAgICAgdGhpcy5jb2xvcmluZyA9IHsKICAgICAgICAgICAgICAgIGdldENvbG9yOiBydW5zQ29sb3JTY2FsZSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZSA9IGdldE9iamVjdE9ic2VydmVyKCdydW5TZWxlY3Rpb25TdGF0ZScsIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZToge30sCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9yZWdleE9ic2VydmVyID0gZ2V0U3RyaW5nT2JzZXJ2ZXIoJ3JlZ2V4SW5wdXQnLCB7CiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuX3J1blN0b3JlTGlzdGVuZXIgPSBydW5zU3RvcmUuYWRkTGlzdGVuZXIoKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ3J1bnMnLCBydW5zU3RvcmUuZ2V0UnVucygpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuc2V0KCdydW5zJywgcnVuc1N0b3JlLmdldFJ1bnMoKSk7CiAgICAgICAgICAgIHRoaXMuX2VudlN0b3JlTGlzdGVuZXIgPSBlbnZpcm9ubWVudFN0b3JlLmFkZExpc3RlbmVyKCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdkYXRhTG9jYXRpb24nLCBlbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuc2V0KCdkYXRhTG9jYXRpb24nLCBlbnZpcm9ubWVudFN0b3JlLmdldERhdGFMb2NhdGlvbigpKTsKICAgICAgICB9CiAgICAgICAgZGV0YWNoZWQoKSB7CiAgICAgICAgICAgIHJ1bnNTdG9yZS5yZW1vdmVMaXN0ZW5lckJ5S2V5KHRoaXMuX3J1blN0b3JlTGlzdGVuZXIpOwogICAgICAgICAgICBlbnZpcm9ubWVudFN0b3JlLnJlbW92ZUxpc3RlbmVyQnlLZXkodGhpcy5fZW52U3RvcmVMaXN0ZW5lcik7CiAgICAgICAgfQogICAgICAgIF90b2dnbGVBbGwoKSB7CiAgICAgICAgICAgIHRoaXMuJC5tdWx0aUNoZWNrYm94LnRvZ2dsZUFsbCgpOwogICAgICAgIH0KICAgICAgICBnZXQgX2NsaXBwZWREYXRhTG9jYXRpb24oKSB7CiAgICAgICAgICAgIHZhciBkYXRhTG9jYXRpb24gPSB0aGlzLmRhdGFMb2NhdGlvbjsKICAgICAgICAgICAgdmFyIGRhdGFMb2NhdGlvbkNsaXBMZW5ndGggPSB0aGlzLl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoOwogICAgICAgICAgICBpZiAoZGF0YUxvY2F0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBkYXRhTG9jYXRpb24gaGFzIG5vdCBiZWVuIHNldCB5ZXQuCiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkYXRhTG9jYXRpb24ubGVuZ3RoID4gZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCkgewogICAgICAgICAgICAgICAgLy8gQ2xpcCB0aGUgZGF0YUxvY2F0aW9uIHRvIGF2b2lkIGJsb2NraW5nIHRoZSBydW5zIHNlbGVjdG9yLiBMZXQgdGhlCiAgICAgICAgICAgICAgICAvLyB1c2VyIHZpZXcgYSBtb3JlIGZ1bGwgdmVyc2lvbiBvZiB0aGUgZGF0YUxvY2F0aW9uLgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFMb2NhdGlvbi5zdWJzdHJpbmcoMCwgZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUxvY2F0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9vcGVuRGF0YUxvY2F0aW9uRGlhbG9nKGV2ZW50KSB7CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHRoaXMuJCQoJyNkYXRhLWxvY2F0aW9uLWRpYWxvZycpLm9wZW4oKTsKICAgICAgICB9CiAgICAgICAgX3Nob3VsZFNob3dFeHBhbmREYXRhTG9jYXRpb25CdXR0b24oZGF0YUxvY2F0aW9uLCBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gZGF0YUxvY2F0aW9uICYmIGRhdGFMb2NhdGlvbi5sZW5ndGggPiBfZGF0YUxvY2F0aW9uQ2xpcExlbmd0aDsKICAgICAgICB9CiAgICB9OwogICAgVGZSdW5zU2VsZWN0b3IudGVtcGxhdGUgPSBodG1sIGAKICAgIDxwYXBlci1kaWFsb2cgd2l0aC1iYWNrZHJvcD0iIiBpZD0iZGF0YS1sb2NhdGlvbi1kaWFsb2ciPgogICAgICA8aDI+RGF0YSBMb2NhdGlvbjwvaDI+CiAgICAgIDx0Zi13YnItc3RyaW5nCiAgICAgICAgdmFsdWU9IltbZGF0YUxvY2F0aW9uXV0iCiAgICAgICAgZGVsaW1pdGVyLXBhdHRlcm49IltbX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm5dXSIKICAgICAgPgogICAgICA8L3RmLXdici1zdHJpbmcKICAgID48L3BhcGVyLWRpYWxvZz4KICAgIDxkaXYgaWQ9InRvcC10ZXh0Ij4KICAgICAgPGgzIGlkPSJ0b29sdGlwLWhlbHAiIGNsYXNzPSJ0b29sdGlwLWNvbnRhaW5lciI+UnVuczwvaDM+CiAgICA8L2Rpdj4KICAgIDx0Zi1tdWx0aS1jaGVja2JveAogICAgICBpZD0ibXVsdGlDaGVja2JveCIKICAgICAgbmFtZXM9IltbcnVuc11dIgogICAgICBzZWxlY3Rpb24tc3RhdGU9Int7cnVuU2VsZWN0aW9uU3RhdGV9fSIKICAgICAgb3V0LXNlbGVjdGVkPSJ7e3NlbGVjdGVkUnVuc319IgogICAgICByZWdleD0ie3tyZWdleElucHV0fX0iCiAgICAgIGNvbG9yaW5nPSJbW2NvbG9yaW5nXV0iCiAgICA+PC90Zi1tdWx0aS1jaGVja2JveD4KICAgIDxwYXBlci1idXR0b24gY2xhc3M9IngtYnV0dG9uIiBpZD0idG9nZ2xlLWFsbCIgb24tdGFwPSJfdG9nZ2xlQWxsIj4KICAgICAgVG9nZ2xlIEFsbCBSdW5zCiAgICA8L3BhcGVyLWJ1dHRvbj4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tkYXRhTG9jYXRpb25dXSI+CiAgICAgIDxkaXYgaWQ9ImRhdGEtbG9jYXRpb24iPgogICAgICAgIDx0Zi13YnItc3RyaW5nCiAgICAgICAgICB2YWx1ZT0iW1tfY2xpcHBlZERhdGFMb2NhdGlvbl1dIgogICAgICAgICAgZGVsaW1pdGVyLXBhdHRlcm49IltbX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm5dXSIKICAgICAgICA+PC90Zi13YnItc3RyaW5nCiAgICAgICAgPjwhLS0KICAgICAgICAgIFdlIHVzZSBIVE1MIGNvbW1lbnRzIHRvIHJlbW92ZSBzcGFjZXMgYmVmb3JlIHRoZSBlbGxpcHNpcy4KICAgICAgICAtLT48dGVtcGxhdGUKICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICBpZj0iW1tfc2hvdWxkU2hvd0V4cGFuZERhdGFMb2NhdGlvbkJ1dHRvbihkYXRhTG9jYXRpb24sIF9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoKV1dIgogICAgICAgICAgPjwhLS0KICAgICAgICAgIC0tPjxhIGhyZWY9IiIgb24tY2xpY2s9Il9vcGVuRGF0YUxvY2F0aW9uRGlhbG9nIj7igKY8L2E+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgcGFkZGluZy1ib3R0b206IDEwcHg7CiAgICAgIH0KICAgICAgI3RvcC10ZXh0IHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgcGFkZGluZy1yaWdodDogMTZweDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgIH0KICAgICAgdGYtbXVsdGktY2hlY2tib3ggewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLngtYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICB9CiAgICAgICN0b29sdGlwLWhlbHAgewogICAgICAgIGNvbG9yOiB2YXIoLS1wYXBlci1ncmV5LTgwMCk7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDVweDsKICAgICAgfQogICAgICBwYXBlci1idXR0b24gewogICAgICAgIG1hcmdpbi1sZWZ0OiAwOwogICAgICB9CiAgICAgICNkYXRhLWxvY2F0aW9uIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW46IDVweCAwIDAgMDsKICAgICAgICBtYXgtd2lkdGg6IDI4OHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfc3RvcmVSdW5TZWxlY3Rpb25TdGF0ZScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlJ1bnNTZWxlY3Rvci5wcm90b3R5cGUsICJydW5TZWxlY3Rpb25TdGF0ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfcmVnZXhPYnNlcnZlcicsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlJ1bnNTZWxlY3Rvci5wcm90b3R5cGUsICJyZWdleElucHV0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZSdW5zU2VsZWN0b3IucHJvdG90eXBlLCAic2VsZWN0ZWRSdW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmUnVuc1NlbGVjdG9yLnByb3RvdHlwZSwgInJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmUnVuc1NlbGVjdG9yLnByb3RvdHlwZSwgImRhdGFMb2NhdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmUnVuc1NlbGVjdG9yLnByb3RvdHlwZSwgIl9kYXRhTG9jYXRpb25DbGlwTGVuZ3RoIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZSdW5zU2VsZWN0b3IucHJvdG90eXBlLCAiX2RhdGFMb2NhdGlvbkRlbGltaXRlclBhdHRlcm4iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlJ1bnNTZWxlY3Rvci5wcm90b3R5cGUsICJjb2xvcmluZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnZGF0YUxvY2F0aW9uJywgJ19kYXRhTG9jYXRpb25DbGlwTGVuZ3RoJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZlJ1bnNTZWxlY3Rvci5wcm90b3R5cGUsICJfY2xpcHBlZERhdGFMb2NhdGlvbiIsIG51bGwpOwogICAgVGZSdW5zU2VsZWN0b3IgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ydW5zLXNlbGVjdG9yJykKICAgIF0sIFRmUnVuc1NlbGVjdG9yKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQSBjbGFzcyB0aGF0IGFsbG93cyBtYXJraW5nIHByb21pc2VzIGFzIGNhbmNlbGxlZC4KICAgICAqCiAgICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgdG8sIGUuZy4sIHByZXZlbnQgb2xkIG5ldHdvcmsgcmVxdWVzdHMgZnJvbQogICAgICogc3RvbXBpbmcgbmV3IG9uZXMgYW5kIHdyaXRpbmcgYmFkIGRhdGEuCiAgICAgKgogICAgICogVXNhZ2U6CiAgICAgKgogICAgICogICAgIGNvbnN0IGNhbmNlbGxlciA9IG5ldyBDYW5jZWxsZXIoKTsKICAgICAqICAgICBsZXQgbXlQcm9taXNlOiBQcm9taXNlPEZvbz4gPSBnZXRQcm9taXNlKCk7CiAgICAgKiAgICAgbXlQcm9taXNlLnRoZW4oY2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7dmFsdWUsIGNhbmNlbGxlZH0gPT4gewogICAgICogICAgICAgaWYgKGNhbmNlbGxlZCkgewogICAgICogICAgICAgICBjb25zb2xlLndhcm4oIkRvbid0IG1ha2UgcHJvbWlzZXMgeW91IGNhbid0IGtlZXAgPjoteyIpOwogICAgICogICAgICAgfQogICAgICogICAgICAgY29uc29sZS5sb2coIkVuam95IHlvdXIgdmFsdWU6IiwgdmFsdWUpOwogICAgICogICAgIH0pKTsKICAgICAqCiAgICAgKiAgICAgLy8gSWYgYG15UHJvbWlzZWAgaXMgcmVzb2x2ZWQgbm93LCB0aGVuIGBjYW5jZWxsZWRgIHdpbGwgYmUgYGZhbHNlYC4KICAgICAqICAgICBjYW5jZWxsZXIuY2FuY2VsQWxsKCk7CiAgICAgKiAgICAgLy8gSWYgYG15UHJvbWlzZWAgaXMgcmVzb2x2ZWQgbm93LCB0aGVuIGBjYW5jZWxsZWRgIHdpbGwgYmUgYHRydWVgLgogICAgICovCiAgICBjbGFzcyBDYW5jZWxsZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSG93IG1hbnkgdGltZXMgaGFzIGBjYW5jZWxBbGxgIGJlZW4gY2FsbGVkPwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jYW5jZWxsYXRpb25Db3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIGNhbmNlbGxhYmxlIHRhc2suIFRoaXMgcmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0LCB3aGVuCiAgICAgICAgICogaW52b2tlZCwgd2lsbCBwYXNzIGl0cyBhcmd1bWVudCB0byB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gYXMgd2VsbCBhcwogICAgICAgICAqIGEgYGNhbmNlbGxlZGAgYXJndW1lbnQuIFRoaXMgYXJndW1lbnQgd2lsbCBiZSBgZmFsc2VgIHVubGVzcyBhbmQKICAgICAgICAgKiB1bnRpbCBgY2FuY2VsQWxsYCBpcyBpbnZva2VkIGFmdGVyIHRoZSBjcmVhdGlvbiBvZiB0aGlzIHRhc2suCiAgICAgICAgICovCiAgICAgICAgY2FuY2VsbGFibGUoZikgewogICAgICAgICAgICBjb25zdCBvcmlnaW5hbENhbmNlbGxhdGlvbkNvdW50ID0gdGhpcy5jYW5jZWxsYXRpb25Db3VudDsKICAgICAgICAgICAgcmV0dXJuICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY2FuY2VsbGVkID0gdGhpcy5jYW5jZWxsYXRpb25Db3VudCAhPT0gb3JpZ2luYWxDYW5jZWxsYXRpb25Db3VudDsKICAgICAgICAgICAgICAgIHJldHVybiBmKHsgdmFsdWUsIGNhbmNlbGxlZCB9KTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFyayBhbGwgb3V0c3RhbmRpbmcgdGFza3MgYXMgY2FuY2VsbGVkLiBUYXNrcyBub3QgeWV0IGNyZWF0ZWQgd2lsbAogICAgICAgICAqIG5vdCBiZSBhZmZlY3RlZC4KICAgICAgICAgKi8KICAgICAgICBjYW5jZWxBbGwoKSB7CiAgICAgICAgICAgIHRoaXMuY2FuY2VsbGF0aW9uQ291bnQrKzsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIERvZXMgbm90IGFjdHVhbGx5IHNhbml0aXplIGh0bWwuCiAgICAgKgogICAgICogVGhpcyBleHBvcnRlZCBmdW5jdGlvbiBpcyBvdmVycmlkZW4gaW4gdGhlIGludGVybmFsIEdvb2dsZSByZXBvc2l0b3J5IGZvcgogICAgICogY29tcGF0aWJpbGl0eSB3aXRoIHNlY3VyaXR5IGxpYnJhcmllcyB1c2VkIGludGVybmFsbHkgYXQgR29vZ2xlLgogICAgICovCiAgICBmdW5jdGlvbiBzYW5pdGl6ZShodG1sKSB7CiAgICAgICAgcmV0dXJuIGh0bWw7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTcgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvLyB0Zi1tYXJrZG93bi12aWV3IHJlbmRlcnMgcmF3IEhUTUwgdGhhdCBoYXMgYmVlbiBjb252ZXJ0ZWQgZnJvbQogICAgLy8gTWFya2Rvd24gYnkgc29tZSBvdGhlciBhZ2VudC4gVGhlIEhUTUwgbXVzdCBiZSBzYW5pdGl6ZWQsIGFuZCBtdXN0IGJlCiAgICAvLyBzYWZlIHRvIGluamVjdCBkaXJlY3RseSBpbnRvIHRoZSBET00uCiAgICAvLyBUZW5zb3JCb2FyZCBwbHVnaW5zIGNhbiB1c2UgdGhlIGBtYXJrZG93bl90b19zYWZlX2h0bWxgIGZ1bmN0aW9uIGZyb20KICAgIC8vIHRoZSBgdGVuc29yYm9hcmQucGx1Z2luX3V0aWxgIG1vZHVsZSBvbiB0aGUgYmFja2VuZCB0byBnZW5lcmF0ZSBIVE1MCiAgICAvLyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggdGhpcyBjb21wb25lbnQuCiAgICBsZXQgVGZNYXJrZG93blZpZXcgPSBjbGFzcyBUZk1hcmtkb3duVmlldyBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLmh0bWwgPSAnJzsKICAgICAgICB9CiAgICAgICAgZ2V0IHNhbml0aXplZEh0bWwoKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZSh0aGlzLmh0bWwpOwogICAgICAgIH0KICAgICAgICBhdHRhY2hlZCgpIHsKICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQubWFya2Rvd24sIC8qc2hvdWxkT2JzZXJ2ZT0qLyB0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIFRmTWFya2Rvd25WaWV3LnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGlkPSJtYXJrZG93biIgaW5uZXItaC10LW0tbD0iW1tzYW5pdGl6ZWRIdG1sXV0iPjwvZGl2PgogICAgPHN0eWxlPgogICAgICAvKgogICAgICAgKiBSZWR1Y2UgdG9wbW9zdCBhbmQgYm90dG9tbW9zdCBtYXJnaW5zIGZyb20gMTZweCB0byAwLjNlbSAocmVuZGVycwogICAgICAgKiBhdCBhYm91dCA0LjhweCkgdG8ga2VlcCB0aGUgbGF5b3V0IGNvbXBhY3QuIFRoaXMgaW1wcm92ZXMgdGhlCiAgICAgICAqIGFwcGVhcmFuY2Ugd2hlbiB0aGVyZSBpcyBvbmx5IG9uZSBsaW5lIG9mIHRleHQ7IHN0YW5kYXJkIE1hcmtkb3duCiAgICAgICAqIHJlbmRlcmVycyB3aWxsIHN0aWxsIGluY2x1ZGUgYSBcYDxwPlxgIGVsZW1lbnQuCiAgICAgICAqCiAgICAgICAqIEJ5IHRhcmdldGluZyBvbmx5IHRoZSB0b3AtbGV2ZWwsIGV4dHJlbWFsIGVsZW1lbnRzLCB3ZSBwcmVzZXJ2ZSBhbnkKICAgICAgICogYWN0dWFsIHBhcmFncmFwaCBicmVha3MgYW5kIG9ubHkgY2hhbmdlIHRoZSBwYWRkaW5nIGFnYWluc3QgdGhlCiAgICAgICAqIGNvbXBvbmVudCBlZGdlcy4KICAgICAgICovCiAgICAgICNtYXJrZG93biA+IHA6Zmlyc3QtY2hpbGQgewogICAgICAgIG1hcmdpbi10b3A6IDAuM2VtOwogICAgICB9CiAgICAgICNtYXJrZG93biA+IHA6bGFzdC1jaGlsZCB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4zZW07CiAgICAgIH0KCiAgICAgIC8qIFBsZWFzYW50IHN0eWxlcyBmb3IgTWFya2Rvd24gdGFibGVzLiAqLwogICAgICAjbWFya2Rvd24gdGFibGUgewogICAgICAgIGJvcmRlci1jb2xsYXBzZTogY29sbGFwc2U7CiAgICAgIH0KICAgICAgI21hcmtkb3duIHRhYmxlIHRoIHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0aCwKICAgICAgI21hcmtkb3duIHRhYmxlIHRkIHsKICAgICAgICBwYWRkaW5nOiA2cHggMTNweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZGZlMmU1OwogICAgICB9CiAgICAgICNtYXJrZG93biB0YWJsZSB0ciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgI2M2Y2JkMTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk1hcmtkb3duVmlldy5wcm90b3R5cGUsICJodG1sIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdodG1sJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZk1hcmtkb3duVmlldy5wcm90b3R5cGUsICJzYW5pdGl6ZWRIdG1sIiwgbnVsbCk7CiAgICBUZk1hcmtkb3duVmlldyA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLW1hcmtkb3duLXZpZXcnKQogICAgXSwgVGZNYXJrZG93blZpZXcpOwoKICAgIC8qIENvcHlyaWdodCAyMDE3IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBmdW5jdGlvbiBmb3JtYXREYXRlJDEoZGF0ZSkgewogICAgICAgIGlmICghZGF0ZSkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIC8vIFR1cm4gdGhpbmdzIGxpa2UgIkdNVC0wNzAwIChQRFQpIiBpbnRvIGp1c3QgIlBEVCIuCiAgICAgICAgcmV0dXJuIGRhdGUudG9TdHJpbmcoKS5yZXBsYWNlKC9HTVQtXGQrIFwoKFteKV0rKVwpLywgJyQxJyk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgQ1NTIGNvbG9yIHRoYXQgd2lsbCBjb250cmFzdCBhZ2FpbnN0IGJhY2tncm91bmQuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IGJhY2tncm91bmQgUkdCIGhleCBjb2xvciBjb2RlLCBlLmcuICNlZWUsICNlZWVlZWUuCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBpY2tUZXh0Q29sb3IoYmFja2dyb3VuZCkgewogICAgICAgIGNvbnN0IHJnYiA9IGNvbnZlcnRIZXhUb1JnYihiYWNrZ3JvdW5kKTsKICAgICAgICBpZiAoIXJnYikgewogICAgICAgICAgICByZXR1cm4gJ2luaGVyaXQnOwogICAgICAgIH0KICAgICAgICAvLyBTZWU6IGh0dHA6Ly93d3cudzMub3JnL1RSL0FFUlQjY29sb3ItY29udHJhc3QKICAgICAgICBjb25zdCBicmlnaHRuZXNzID0gTWF0aC5yb3VuZCgocmdiWzBdICogMjk5ICsgcmdiWzFdICogNTg3ICsgcmdiWzJdICogMTE0KSAvIDEwMDApOwogICAgICAgIHJldHVybiBicmlnaHRuZXNzID4gMTI1ID8gJ2luaGVyaXQnIDogJyNlZWUnOwogICAgfQogICAgLyoqCiAgICAgKiBUdXJucyBhIGhleCBzdHJpbmcgaW50byBhbiBSR0IgYXJyYXkuCiAgICAgKiBAcGFyYW0gez9zdHJpbmd9IGNvbG9yIFJHQiBoZXggY29sb3IgY29kZSwgZS5nLiAjZWVlLCAjZWVlZWVlLgogICAgICogQHJldHVybiB7QXJyYXk8bnVtYmVyPn0KICAgICAqLwogICAgZnVuY3Rpb24gY29udmVydEhleFRvUmdiKGNvbG9yKSB7CiAgICAgICAgaWYgKCFjb2xvcikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgbGV0IG0gPSBjb2xvci5tYXRjaCgvXiMoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkoWzAtOWEtZl17MSwyfSkkLyk7CiAgICAgICAgaWYgKCFtKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoY29sb3IubGVuZ3RoID09IDQpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gMzsgaSsrKSB7CiAgICAgICAgICAgICAgICBtW2ldID0gbVtpXSArIG1baV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtwYXJzZUludChtWzFdLCAxNiksIHBhcnNlSW50KG1bMl0sIDE2KSwgcGFyc2VJbnQobVszXSwgMTYpXTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxNyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHJlZ2lzdGVyU3R5bGVEb21Nb2R1bGUoewogICAgICAgIG1vZHVsZU5hbWU6ICd0Zi1jYXJkLWhlYWRpbmctc3R5bGUnLAogICAgICAgIHN0eWxlQ29udGVudDogYAogICAgZmlnY2FwdGlvbiB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgIC8qKiBIb3Jpem9udGFsIGxpbmUgb2YgbGFiZWxzLiAqLwogICAgLmhlYWRpbmctcm93IHsKICAgICAgbWFyZ2luLXRvcDogLTRweDsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgZmxleC13cmFwOiB3cmFwOwogICAgfQoKICAgIC8qKiBQaWVjZSBvZiB0ZXh0IGluIHRoZSBmaWd1cmUgY2FwdGlvbi4gKi8KICAgIC5oZWFkaW5nLWxhYmVsIHsKICAgICAgZmxleC1ncm93OiAxOwogICAgICBtYXJnaW4tdG9wOiA0cHg7CiAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgd29yZC13cmFwOiBicmVhay13b3JkOwogICAgfQoKICAgIC8qKiBNYWtlcyBsYWJlbCBzaG93IG9uIHRoZSByaWdodC4gKi8KICAgIC5oZWFkaW5nLXJpZ2h0IHsKICAgICAgZmxleC1ncm93OiAwOwogICAgfQogIGAsCiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQSBjb21wYWN0IGhlYWRpbmcgdG8gYXBwZWFyIGFib3ZlIGEgc2luZ2xlIHZpc3VhbGl6YXRpb24sIHN1bW1hcml6aW5nCiAgICAgKiB0aGUgbWV0YWRhdGEgYWJvdXQgYSB0YWcgb3IgcnVuLXRhZyBjb21iaW5hdGlvbi4KICAgICAqCiAgICAgKiBQcm9wZXJ0aWVzIChhbGwgb3B0aW9uYWwpOgogICAgICogICAtIGBkaXNwbGF5TmFtZWAsIGB0YWdgLCBhbmQgYGRlc2NyaXB0aW9uYCBhcmUgcHJvcGVydGllcyBmcm9tIHRoZQogICAgICogICAgIHJlbGV2YW50IFN1bW1hcnkgcHJvdG9idWYuCiAgICAgKiAgIC0gYHJ1bmAgaXMgdGhlIG5hbWUgb2YgdGhlIFRlbnNvckZsb3cgcnVuLCBpZiBhcHBsaWNhYmxlLgogICAgICogICAtIGBjb2xvcmAgY2FuIGJlIHNldCB0byBkaXNwbGF5IGEgY29sb3JlZCBib3JkZXIgYXQgdGhlIGxlZnQgb2YgdGhlCiAgICAgKiAgICAgY2FyZDsgaWYgbGVmdCB1bnNldCwgbm8gYm9yZGVyIHdpbGwgYmUgZGlzcGxheWVkLgogICAgICogICAtIEFueSBjaGlsZHJlbiBvZiB0aGlzIGNvbXBvbmVudCB3aWxsIGJlIHJlbmRlcmVkIGJlbG93IHRoZSBhYm92ZQogICAgICogICAgIGluZm9ybWF0aW9uLCBhbmQgY2FuIGJlIHVzZWQgdG8gZGlzcGxheSAoZm9yIGV4YW1wbGUpIHNvbWUgc21hbGwKICAgICAqICAgICBjb250cm9sIHdpZGdldHMuCiAgICAgKi8KICAgIGxldCBUZkNhcmRIZWFkaW5nID0gY2xhc3MgVGZDYXJkSGVhZGluZyBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMudGFnID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5ydW4gPSBudWxsOwogICAgICAgICAgICB0aGlzLmRlc2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5jb2xvciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVIZWFkaW5nU3R5bGUoKSB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHsKICAgICAgICAgICAgICAgICctLXRmLWNhcmQtaGVhZGluZy1iYWNrZ3JvdW5kLWNvbG9yJzogdGhpcy5fcnVuQmFja2dyb3VuZCwKICAgICAgICAgICAgICAgICctLXRmLWNhcmQtaGVhZGluZy1jb2xvcic6IHRoaXMuX3J1bkNvbG9yLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVSdW5CYWNrZ3JvdW5kKGNvbG9yKSB7CiAgICAgICAgICAgIHJldHVybiBjb2xvciB8fCAnbm9uZSc7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlUnVuQ29sb3IoY29sb3IpIHsKICAgICAgICAgICAgcmV0dXJuIHBpY2tUZXh0Q29sb3IoY29sb3IpOwogICAgICAgIH0KICAgICAgICBnZXQgX25hbWVMYWJlbCgpIHsKICAgICAgICAgICAgdmFyIGRpc3BsYXlOYW1lID0gdGhpcy5kaXNwbGF5TmFtZTsKICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMudGFnOwogICAgICAgICAgICByZXR1cm4gZGlzcGxheU5hbWUgfHwgdGFnIHx8ICcnOwogICAgICAgIH0KICAgICAgICBnZXQgX3RhZ0xhYmVsKCkgewogICAgICAgICAgICB2YXIgZGlzcGxheU5hbWUgPSB0aGlzLmRpc3BsYXlOYW1lOwogICAgICAgICAgICB2YXIgdGFnID0gdGhpcy50YWc7CiAgICAgICAgICAgIHJldHVybiB0YWcgJiYgdGFnICE9PSBkaXNwbGF5TmFtZSA/IHRhZyA6ICcnOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2coZSkgewogICAgICAgICAgICBjb25zdCBkaWFsb2cgPSB0aGlzLiQuZGVzY3JpcHRpb25EaWFsb2c7CiAgICAgICAgICAgIGRpYWxvZy5wb3NpdGlvblRhcmdldCA9IGUudGFyZ2V0OwogICAgICAgICAgICBkaWFsb2cudG9nZ2xlKCk7CiAgICAgICAgfQogICAgfTsKICAgIFRmQ2FyZEhlYWRpbmcudGVtcGxhdGUgPSBodG1sIGAKICAgIDxkaXYgY2xhc3M9ImNvbnRhaW5lciI+CiAgICAgIDxmaWdjYXB0aW9uIGNsYXNzPSJjb250ZW50Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX25hbWVMYWJlbF1dIj4KICAgICAgICAgICAgPGRpdiBpdGVtcHJvcD0ibmFtZSIgY2xhc3M9ImhlYWRpbmctbGFiZWwgbmFtZSI+W1tfbmFtZUxhYmVsXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbcnVuXV0iPgogICAgICAgICAgICA8IS0tIEV4dHJhIHdyYXBwaW5nIHNwYW4gbmVlZGVkIHRvIGF2b2lkIGZsZXhib3ggYmxvY2tpZmljYXRpb24uIC0tPgogICAgICAgICAgICA8IS0tIChzZWUgZmxleGJveCBzcGVjLCBzZWN0aW9uIDQgIkZsZXggSXRlbXMiKSAtLT4KICAgICAgICAgICAgPHNwYW4+CiAgICAgICAgICAgICAgPHNwYW4KICAgICAgICAgICAgICAgIGl0ZW1wcm9wPSJydW4iCiAgICAgICAgICAgICAgICBpZD0iaGVhZGluZy1ydW4iCiAgICAgICAgICAgICAgICBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0IHJ1biIKICAgICAgICAgICAgICAgID5bW3J1bl1dPC9zcGFuCiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfdGFnTGFiZWxdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICAgIHRhZzogPHNwYW4gaXRlbXByb3A9InRhZyI+W1tfdGFnTGFiZWxdXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDxzbG90Pjwvc2xvdD4KICAgICAgPC9maWdjYXB0aW9uPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbZGVzY3JpcHRpb25dXSI+CiAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICBpY29uPSJpbmZvIgogICAgICAgICAgb24tdGFwPSJfdG9nZ2xlRGVzY3JpcHRpb25EaWFsb2ciCiAgICAgICAgICB0aXRsZT0iU2hvdyBzdW1tYXJ5IGRlc2NyaXB0aW9uIgogICAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8cGFwZXItZGlhbG9nCiAgICAgICAgaWQ9ImRlc2NyaXB0aW9uRGlhbG9nIgogICAgICAgIG5vLW92ZXJsYXA9IiIKICAgICAgICBob3Jpem9udGFsLWFsaWduPSJhdXRvIgogICAgICAgIHZlcnRpY2FsLWFsaWduPSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tkZXNjcmlwdGlvbl1dIj48L3RmLW1hcmtkb3duLXZpZXc+CiAgICAgICAgPC9wYXBlci1kaWFsb2ctc2Nyb2xsYWJsZT4KICAgICAgPC9wYXBlci1kaWFsb2c+CiAgICA8L2Rpdj4KICAgIDxzdHlsZSBpbmNsdWRlPSJ0Zi1jYXJkLWhlYWRpbmctc3R5bGUiPgogICAgICAuY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgIC5jb250ZW50IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5uYW1lIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KICAgICAgLnJ1biB7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweDsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgICBwYWRkaW5nOiAxcHggNHB4IDJweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICB9CiAgICAgIHBhcGVyLWRpYWxvZy1zY3JvbGxhYmxlIHsKICAgICAgICBtYXgtd2lkdGg6IDY0MHB4OwogICAgICB9CiAgICAgICNoZWFkaW5nLXJ1biB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGYtY2FyZC1oZWFkaW5nLWJhY2tncm91bmQtY29sb3IpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Zi1jYXJkLWhlYWRpbmctY29sb3IpOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmQ2FyZEhlYWRpbmcucHJvdG90eXBlLCAiZGlzcGxheU5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkNhcmRIZWFkaW5nLnByb3RvdHlwZSwgInRhZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmQ2FyZEhlYWRpbmcucHJvdG90eXBlLCAicnVuIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZDYXJkSGVhZGluZy5wcm90b3R5cGUsICJkZXNjcmlwdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmQ2FyZEhlYWRpbmcucHJvdG90eXBlLCAiY29sb3IiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVSdW5CYWNrZ3JvdW5kKGNvbG9yKScsCiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ191cGRhdGVIZWFkaW5nU3R5bGUnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZDYXJkSGVhZGluZy5wcm90b3R5cGUsICJfcnVuQmFja2dyb3VuZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgY29tcHV0ZWQ6ICdfY29tcHV0ZVJ1bkNvbG9yKGNvbG9yKScsCiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ191cGRhdGVIZWFkaW5nU3R5bGUnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZDYXJkSGVhZGluZy5wcm90b3R5cGUsICJfcnVuQ29sb3IiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ2Rpc3BsYXlOYW1lJywgJ3RhZycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZDYXJkSGVhZGluZy5wcm90b3R5cGUsICJfbmFtZUxhYmVsIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnZGlzcGxheU5hbWUnLCAndGFnJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkNhcmRIZWFkaW5nLnByb3RvdHlwZSwgIl90YWdMYWJlbCIsIG51bGwpOwogICAgVGZDYXJkSGVhZGluZyA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWNhcmQtaGVhZGluZycpCiAgICBdLCBUZkNhcmRIZWFkaW5nKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qCiAgICB0Zi1hdWRpby1sb2FkZXIgbG9hZHMgYW4gaW5kaXZpZHVhbCBhdWRpbyBjbGlwIGZyb20gdGhlIFRlbnNvckJvYXJkCiAgICBiYWNrZW5kLgogICAgKi8KICAgIGxldCBfVGZBdWRpb0xvYWRlciA9IGNsYXNzIF9UZkF1ZGlvTG9hZGVyIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyID0gbmV3IENhbmNlbGxlcigpOwogICAgICAgICAgICB0aGlzLl9zdGVwcyA9IFtdOwogICAgICAgICAgICB0aGlzLl9hdHRhY2hlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBnZXQgX3J1bkNvbG9yKCkgewogICAgICAgICAgICB2YXIgcnVuID0gdGhpcy5ydW47CiAgICAgICAgICAgIHJldHVybiBydW5zQ29sb3JTY2FsZShydW4pOwogICAgICAgIH0KICAgICAgICBnZXQgX2hhc0F0TGVhc3RPbmVTdGVwKCkgewogICAgICAgICAgICB2YXIgc3RlcHMgPSB0aGlzLl9zdGVwczsKICAgICAgICAgICAgcmV0dXJuICEhc3RlcHMgJiYgc3RlcHMubGVuZ3RoID4gMDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9oYXNNdWx0aXBsZVN0ZXBzKCkgewogICAgICAgICAgICB2YXIgc3RlcHMgPSB0aGlzLl9zdGVwczsKICAgICAgICAgICAgcmV0dXJuICEhc3RlcHMgJiYgc3RlcHMubGVuZ3RoID4gMTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9tYXhTdGVwSW5kZXgoKSB7CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHRoaXMuX3N0ZXBzOwogICAgICAgICAgICByZXR1cm4gc3RlcHMubGVuZ3RoIC0gMTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jdXJyZW50RGF0dW0oKSB7CiAgICAgICAgICAgIHZhciBzdGVwcyA9IHRoaXMuX3N0ZXBzOwogICAgICAgICAgICB2YXIgc3RlcEluZGV4ID0gdGhpcy5fc3RlcEluZGV4OwogICAgICAgICAgICByZXR1cm4gc3RlcHNbc3RlcEluZGV4XTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9zYW1wbGVUZXh0KCkgewogICAgICAgICAgICB2YXIgc2FtcGxlID0gdGhpcy5zYW1wbGU7CiAgICAgICAgICAgIHJldHVybiBgJHtzYW1wbGUgKyAxfWA7CiAgICAgICAgfQogICAgICAgIGdldCBfaGFzTXVsdGlwbGVTYW1wbGVzKCkgewogICAgICAgICAgICB2YXIgdG90YWxTYW1wbGVzID0gdGhpcy50b3RhbFNhbXBsZXM7CiAgICAgICAgICAgIHJldHVybiB0b3RhbFNhbXBsZXMgPiAxOwogICAgICAgIH0KICAgICAgICBhdHRhY2hlZCgpIHsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICBfcmVsb2FkT25SdW5UYWdDaGFuZ2UoKSB7CiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9hdHRhY2hlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbEFsbCgpOwogICAgICAgICAgICBjb25zdCByb3V0ZXIgPSBnZXRSb3V0ZXIoKTsKICAgICAgICAgICAgY29uc3QgdXJsID0gcm91dGVyLnBsdWdpblJvdXRlKCdhdWRpbycsICcvYXVkaW8nLCBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgICAgICAgICAgICAgIHRhZzogdGhpcy50YWcsCiAgICAgICAgICAgICAgICBydW46IHRoaXMucnVuLAogICAgICAgICAgICAgICAgc2FtcGxlOiBTdHJpbmcodGhpcy5zYW1wbGUpLAogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZVN0ZXBzID0gdGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsbGFibGUoKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzdWx0LnZhbHVlOwogICAgICAgICAgICAgICAgY29uc3Qgc3RlcHMgPSBkYXRhLm1hcCh0aGlzLl9jcmVhdGVTdGVwRGF0dW0uYmluZCh0aGlzKSk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3N0ZXBzJywgc3RlcHMpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19zdGVwSW5kZXgnLCBzdGVwcy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwpLnRoZW4odXBkYXRlU3RlcHMpOwogICAgICAgIH0KICAgICAgICBfY3JlYXRlU3RlcERhdHVtKGF1ZGlvTWV0YWRhdGEpIHsKICAgICAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW0gPSBuZXcgVVJMU2VhcmNoUGFyYW1zKGF1ZGlvTWV0YWRhdGEucXVlcnkpOwogICAgICAgICAgICAvLyBJbmNsdWRlIHdhbGxfdGltZSBqdXN0IHRvIGRpc2FtYmlndWF0ZSB0aGUgVVJMIGFuZCBmb3JjZQogICAgICAgICAgICAvLyB0aGUgYnJvd3NlciB0byByZWxvYWQgdGhlIGF1ZGlvIHdoZW4gdGhlIFVSTCBjaGFuZ2VzLiBUaGUKICAgICAgICAgICAgLy8gYmFja2VuZCBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIHZhbHVlLgogICAgICAgICAgICBzZWFyY2hQYXJhbS5hcHBlbmQoJ3RzJywgU3RyaW5nKGF1ZGlvTWV0YWRhdGEud2FsbF90aW1lKSk7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLnBsdWdpblJvdXRlKCdhdWRpbycsICcvaW5kaXZpZHVhbEF1ZGlvJywgc2VhcmNoUGFyYW0pOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgd2FsbF90aW1lOiBmb3JtYXREYXRlJDEobmV3IERhdGUoYXVkaW9NZXRhZGF0YS53YWxsX3RpbWUgKiAxMDAwKSksCiAgICAgICAgICAgICAgICBzdGVwOiBhdWRpb01ldGFkYXRhLnN0ZXAsCiAgICAgICAgICAgICAgICBsYWJlbDogYXVkaW9NZXRhZGF0YS5sYWJlbCwKICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBhdWRpb01ldGFkYXRhLmNvbnRlbnRUeXBlLAogICAgICAgICAgICAgICAgdXJsLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH07CiAgICBfVGZBdWRpb0xvYWRlci50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIHJ1bj0iW1tydW5dXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICAgIGNvbG9yPSJbW19ydW5Db2xvcl1dIgogICAgPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlc11dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc2FtcGxlOiBbW19zYW1wbGVUZXh0XV0gb2YgW1t0b3RhbFNhbXBsZXNdXQogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXBdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCI+CiAgICAgICAgICAgIHN0ZXAgPHN0cm9uZz5bW19jdXJyZW50RGF0dW0uc3RlcF1dPC9zdHJvbmc+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudERhdHVtLndhbGxfdGltZV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1sYWJlbCBoZWFkaW5nLXJpZ2h0Ij4KICAgICAgICAgICAgICBbW19jdXJyZW50RGF0dW0ud2FsbF90aW1lXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhZGluZy1yb3ciPgogICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICBpZD0ic3RlcHMiCiAgICAgICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICAgIG1heD0iW1tfbWF4U3RlcEluZGV4XV0iCiAgICAgICAgICAgIG1heC1tYXJrZXJzPSJbW19tYXhTdGVwSW5kZXhdXSIKICAgICAgICAgICAgc25hcHM9IiIKICAgICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgICAgdmFsdWU9Int7X3N0ZXBJbmRleH19IgogICAgICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICA8YXVkaW8KICAgICAgICBjb250cm9scz0iIgogICAgICAgIHNyYyQ9IltbX2N1cnJlbnREYXR1bS51cmxdXSIKICAgICAgICB0eXBlJD0iW1tfY3VycmVudERhdHVtLmNvbnRlbnRUeXBlXV0iCiAgICAgID48L2F1ZGlvPgogICAgICA8dGYtbWFya2Rvd24tdmlldyBodG1sPSJbW19jdXJyZW50RGF0dW0ubGFiZWxdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgPC90ZW1wbGF0ZT4KICAgIDxkaXYgaWQ9Im1haW4tYXVkaW8tY29udGFpbmVyIj48L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY2FyZC1oZWFkaW5nLXN0eWxlIj4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzNTBweDsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcjogIzQyNDI0MjsKICAgICAgICBtYXJnaW4tcmlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTVweDsKICAgICAgfQoKICAgICAgI3N0ZXBzIHsKICAgICAgICBoZWlnaHQ6IDE1cHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHBhZGRpbmc6IDAgNXB4OyAvKiBzbyB0aGUgc2xpZGVyIGtub2IgZG9lc24ndCBidXR0IG91dCAqLwogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1ib3JkZXItY29sb3I6IHZhcigtLXN0ZXAtc2xpZGVyLWtub2ItY29sb3IpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tc3RlcC1zbGlkZXIta25vYi1jb2xvcik7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAicnVuIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAidGFnIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAic2FtcGxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAidG90YWxTYW1wbGVzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAidGFnTWV0YWRhdGEiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBSZXF1ZXN0TWFuYWdlcikKICAgIF0sIF9UZkF1ZGlvTG9hZGVyLnByb3RvdHlwZSwgInJlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQ2FuY2VsbGVyKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAiX21ldGFkYXRhQ2FuY2VsbGVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIF9UZkF1ZGlvTG9hZGVyLnByb3RvdHlwZSwgIl9zdGVwcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIF9UZkF1ZGlvTG9hZGVyLnByb3RvdHlwZSwgIl9zdGVwSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ3J1bicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAiX3J1bkNvbG9yIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3N0ZXBzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAiX2hhc0F0TGVhc3RPbmVTdGVwIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3N0ZXBzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAiX2hhc011bHRpcGxlU3RlcHMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfc3RlcHMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlciksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIF9UZkF1ZGlvTG9hZGVyLnByb3RvdHlwZSwgIl9tYXhTdGVwSW5kZXgiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfc3RlcHMnLCAnX3N0ZXBJbmRleCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAiX2N1cnJlbnREYXR1bSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ3NhbXBsZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQXVkaW9Mb2FkZXIucHJvdG90eXBlLCAiX3NhbXBsZVRleHQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCd0b3RhbFNhbXBsZXMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBfVGZBdWRpb0xvYWRlci5wcm90b3R5cGUsICJfaGFzTXVsdGlwbGVTYW1wbGVzIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdydW4nLCAndGFnJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBfVGZBdWRpb0xvYWRlci5wcm90b3R5cGUsICJfcmVsb2FkT25SdW5UYWdDaGFuZ2UiLCBudWxsKTsKICAgIF9UZkF1ZGlvTG9hZGVyID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtYXVkaW8tbG9hZGVyJykKICAgIF0sIF9UZkF1ZGlvTG9hZGVyKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qCiAgICB0Zi1hdWRpby1kYXNoYm9hcmQgZGlzcGxheXMgYSBkYXNoYm9hcmQgdGhhdCBsb2FkcyBhdWRpbyBmcm9tIGEgVGVuc29yRmxvdyBydW4uCiAgICAqLwogICAgbGV0IFRmQXVkaW9EYXNoYm9hcmQgPSBjbGFzcyBUZkF1ZGlvRGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkT25SZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3RhZ0ZpbHRlciA9ICcnOwogICAgICAgICAgICB0aGlzLl9yZXF1ZXN0TWFuYWdlciA9IG5ldyBSZXF1ZXN0TWFuYWdlcigpOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgaWYgKHRoaXMucmVsb2FkT25SZWFkeSkKICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgdGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRBdWRpbygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2ZldGNoVGFncygpIHsKICAgICAgICAgICAgY29uc3QgdXJsID0gZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ2F1ZGlvJywgJy90YWdzJyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHVybCkudGhlbigocnVuVG9UYWdJbmZvKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobG9kYXNoLmlzRXF1YWwocnVuVG9UYWdJbmZvLCB0aGlzLl9ydW5Ub1RhZ0luZm8pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB1cGRhdGUgYW55dGhpbmcgaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcnVuVG9UYWcgPSBsb2Rhc2gubWFwVmFsdWVzKHJ1blRvVGFnSW5mbywgKHgpID0+IE9iamVjdC5rZXlzKHgpKTsKICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRUYWdzKHJ1blRvVGFnKTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfZGF0YU5vdEZvdW5kJywgdGFncy5sZW5ndGggPT09IDApOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19ydW5Ub1RhZ0luZm8nLCBydW5Ub1RhZ0luZm8pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3JlbG9hZEF1ZGlvKCkgewogICAgICAgICAgICB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgndGYtYXVkaW8tbG9hZGVyJykuZm9yRWFjaCgoYXVkaW8pID0+IHsKICAgICAgICAgICAgICAgIGF1ZGlvLnJlbG9hZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3Nob3VsZE9wZW4oaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4IDw9IDI7CiAgICAgICAgfQogICAgICAgIGdldCBfY2F0ZWdvcmllcygpIHsKICAgICAgICAgICAgdmFyIHJ1blRvVGFnSW5mbyA9IHRoaXMuX3J1blRvVGFnSW5mbzsKICAgICAgICAgICAgdmFyIHNlbGVjdGVkUnVucyA9IHRoaXMuX3NlbGVjdGVkUnVuczsKICAgICAgICAgICAgdmFyIHRhZ0ZpbHRlciA9IHRoaXMuX3RhZ0ZpbHRlcjsKICAgICAgICAgICAgY29uc3QgcnVuVG9UYWcgPSBsb2Rhc2gubWFwVmFsdWVzKHJ1blRvVGFnSW5mbywgKHgpID0+IE9iamVjdC5rZXlzKHgpKTsKICAgICAgICAgICAgY29uc3QgYmFzZUNhdGVnb3JpZXMgPSBjYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKHJ1blRvVGFnLCBzZWxlY3RlZFJ1bnMsIHRhZ0ZpbHRlcik7CiAgICAgICAgICAgIGZ1bmN0aW9uIGV4cGxvZGVJdGVtKGl0ZW0pIHsKICAgICAgICAgICAgICAgIGNvbnN0IHNhbXBsZXMgPSBydW5Ub1RhZ0luZm9baXRlbS5ydW5dW2l0ZW0udGFnXS5zYW1wbGVzOwogICAgICAgICAgICAgICAgcmV0dXJuIGxvZGFzaC5yYW5nZShzYW1wbGVzKS5tYXAoKGkpID0+IE9iamVjdC5hc3NpZ24oe30sIGl0ZW0sIHsKICAgICAgICAgICAgICAgICAgICBzYW1wbGU6IGksCiAgICAgICAgICAgICAgICAgICAgdG90YWxTYW1wbGVzOiBzYW1wbGVzLAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHdpdGhTYW1wbGVzID0gYmFzZUNhdGVnb3JpZXMubWFwKChjYXRlZ29yeSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgY2F0ZWdvcnksIHsKICAgICAgICAgICAgICAgIGl0ZW1zOiBbXS5jb25jYXQuYXBwbHkoW10sIGNhdGVnb3J5Lml0ZW1zLm1hcChleHBsb2RlSXRlbSkpLAogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiB3aXRoU2FtcGxlczsKICAgICAgICB9CiAgICAgICAgX3RhZ01ldGFkYXRhKHJ1blRvVGFnSW5mbywgcnVuLCB0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIHJ1blRvVGFnSW5mb1tydW5dW3RhZ107CiAgICAgICAgfQogICAgfTsKICAgIFRmQXVkaW9EYXNoYm9hcmQudGVtcGxhdGUgPSBodG1sIGAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvcgogICAgICAgICAgICBpZD0icnVucy1zZWxlY3RvciIKICAgICAgICAgICAgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iCiAgICAgICAgICA+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGF1ZGlvIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBhdWRpbyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtYXVkaW8tbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgcnVuPSJbW2l0ZW0ucnVuXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIKICAgICAgICAgICAgICAgICAgdG90YWwtc2FtcGxlcz0iW1tpdGVtLnRvdGFsU2FtcGxlc11dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgPjwvdGYtYXVkaW8tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkF1ZGlvRGFzaGJvYXJkLnByb3RvdHlwZSwgInJlbG9hZE9uUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZBdWRpb0Rhc2hib2FyZC5wcm90b3R5cGUsICJfc2VsZWN0ZWRSdW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZBdWRpb0Rhc2hib2FyZC5wcm90b3R5cGUsICJfcnVuVG9UYWdJbmZvIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkF1ZGlvRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kYXRhTm90Rm91bmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkF1ZGlvRGFzaGJvYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBSZXF1ZXN0TWFuYWdlcikKICAgIF0sIFRmQXVkaW9EYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfcnVuVG9UYWdJbmZvJywgJ19zZWxlY3RlZFJ1bnMnLCAnX3RhZ0ZpbHRlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkF1ZGlvRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYXRlZ29yaWVzIiwgbnVsbCk7CiAgICBUZkF1ZGlvRGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtYXVkaW8tZGFzaGJvYXJkJykKICAgIF0sIFRmQXVkaW9EYXNoYm9hcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmT3B0aW9uU2VsZWN0b3IgPSBjbGFzcyBUZk9wdGlvblNlbGVjdG9yIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuYXN5bmMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxpc3Rlbihub2RlLCAndGFwJywgJ19zZWxlY3RUYXJnZXQnKTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfc2VsZWN0VGFyZ2V0KGUpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZElkID0gZS5jdXJyZW50VGFyZ2V0LmlkOwogICAgICAgIH0KICAgICAgICBfc2VsZWN0ZWRJZENoYW5nZWQoKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZCA9IHRoaXMucXVlcnlFZmZlY3RpdmVDaGlsZHJlbignIycgKyB0aGlzLnNlbGVjdGVkSWQpOwogICAgICAgICAgICBpZiAoIXNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5nZXRFZmZlY3RpdmVDaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgICAgIG5vZGUuY2xhc3NMaXN0LnJlbW92ZSgnc2VsZWN0ZWQnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHNlbGVjdGVkLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkJyk7CiAgICAgICAgfQogICAgfTsKICAgIFRmT3B0aW9uU2VsZWN0b3IudGVtcGxhdGUgPSBodG1sIGAKICAgIDxkaXYgaWQ9IndyYXAiPgogICAgICA8aDM+W1tuYW1lXV08L2gzPgogICAgICA8ZGl2IGNsYXNzPSJjb250ZW50LXdyYXBwZXIiPjxzbG90Pjwvc2xvdD48L2Rpdj4KICAgIDwvZGl2PgogICAgPHN0eWxlPgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCgqKSB7CiAgICAgICAgYmFja2dyb3VuZDogbm9uZTsKICAgICAgICBjb2xvcjogdmFyKC0tdGItdWktZGFyay1hY2NlbnQpOwogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICB9CgogICAgICAuY29udGVudC13cmFwcGVyIDo6c2xvdHRlZCguc2VsZWN0ZWQpIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgICAgY29sb3I6IHdoaXRlICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIGgzIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIG1hcmdpbjogMCAwIDVweDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk9wdGlvblNlbGVjdG9yLnByb3RvdHlwZSwgIm5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfc2VsZWN0ZWRJZENoYW5nZWQnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZPcHRpb25TZWxlY3Rvci5wcm90b3R5cGUsICJzZWxlY3RlZElkIiwgdm9pZCAwKTsKICAgIFRmT3B0aW9uU2VsZWN0b3IgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1vcHRpb24tc2VsZWN0b3InKQogICAgXSwgVGZPcHRpb25TZWxlY3Rvcik7CgogICAgLyogQ29weXJpZ2h0IDIwMTcgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEdpdmVuIG1hbnkgb2NjdXJyZW5jZXMgb2YgdGFnIGluZm8gZm9yIGEgcGFydGljdWxhciB0YWcgYWNyb3NzCiAgICAgKiBtdWx0aXBsZSBydW5zLCBjcmVhdGUgYSByZXByZXNlbnRhdGl2ZSBpbmZvIG9iamVjdC4gVGhpcyBpcyB1c2VmdWwKICAgICAqIGZvciBwbHVnaW5zIHRoYXQgZGlzcGxheSBqdXN0IG9uZSB2aXN1YWxpemF0aW9uIHBlciB0YWcsIGluc3RlYWQgb2YKICAgICAqIG9uZSBwZXIgcnVuLS10YWcgY29tYmluYXRpb246IGVhY2ggcnVuLS10YWcgY29tYmluYXRpb24gY2FuIGhhdmUgaXRzCiAgICAgKiBvd24gZGlzcGxheSBuYW1lIG9yIGRlc2NyaXB0aW9uLCBzbyB0aGVyZSBpcyBhIGRpbWVuc2lvbiBtaXNtYXRjaC4gV2UKICAgICAqIHJlY29uY2lsZSB0aGlzIGFzIGZvbGxvd3M6CiAgICAgKgogICAgICogICAtIFdlIG9ubHkgc2hvdyBhIGRpc3BsYXkgbmFtZSBpZiBhbGwgcnVucyBhZ3JlZS4gT3RoZXJ3aXNlLCBvciBpZgogICAgICogICAgIHRoZXJlIGFyZSBubyBydW5zLCB3ZSB1c2UgdGhlIHByb3ZpZGVkIGBkZWZhdWx0RGlzcGxheU5hbWVgLgogICAgICoKICAgICAqICAgLSBJZiBhbGwgcnVucyBhZ3JlZSBvbiBhIGRlc2NyaXB0aW9uLCB3ZSB1c2UgaXQuIE90aGVyd2lzZSwKICAgICAqICAgICB3ZSBjb25jYXRlbmF0ZSBhbGwgZGVzY3JpcHRpb25zLCBhbm5vdGF0aW5nIHdoaWNoIG9uZXMKICAgICAqICAgICBjYW1lIGZyb20gd2hpY2ggcnVuLCBhbmQgZGlzcGxheSB0aGVtIGluIGEgbGlzdC4KICAgICAqCiAgICAgKiBOT1RFOiBQZXIgVGVuc29yQm9hcmQgY29udmVudGlvbiwgd2UgYXNzdW1lIHRoYXQgdGhlIHByb3ZpZGVkCiAgICAgKiBgZGVzY3JpcHRpb25gcyBoYXZlIHNhbml0aXplZCBIVE1MIGFuZCBhcmUgc2FmZSB0byByZW5kZXIgaW50byB0aGUKICAgICAqIERPTSwgd2hpbGUgdGhlIGBkaXNwbGF5TmFtZWAgbWF5IGJlIGFuIGFyYml0cmFyeSBzdHJpbmcuIFRoZSBvdXRwdXQKICAgICAqIG9mIHRoaXMgZnVuY3Rpb24gcmVzcGVjdHMgdGhpcyBjb252ZW50aW9uIGFzIHdlbGwuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFnZ3JlZ2F0ZVRhZ0luZm8ocnVuVG9UYWdJbmZvLCBkZWZhdWx0RGlzcGxheU5hbWUpIHsKICAgICAgICBsZXQgdW5hbmltb3VzRGlzcGxheU5hbWUgPSB1bmRlZmluZWQ7CiAgICAgICAgY29uc3QgZGVzY3JpcHRpb25Ub1J1bnMgPSB7fTsKICAgICAgICBPYmplY3Qua2V5cyhydW5Ub1RhZ0luZm8pLmZvckVhY2goKHJ1bikgPT4gewogICAgICAgICAgICBjb25zdCBpbmZvID0gcnVuVG9UYWdJbmZvW3J1bl07CiAgICAgICAgICAgIGlmICh1bmFuaW1vdXNEaXNwbGF5TmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB1bmFuaW1vdXNEaXNwbGF5TmFtZSA9IGluZm8uZGlzcGxheU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHVuYW5pbW91c0Rpc3BsYXlOYW1lICE9PSBpbmZvLmRpc3BsYXlOYW1lKSB7CiAgICAgICAgICAgICAgICB1bmFuaW1vdXNEaXNwbGF5TmFtZSA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uVG9SdW5zW2luZm8uZGVzY3JpcHRpb25dID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGRlc2NyaXB0aW9uVG9SdW5zW2luZm8uZGVzY3JpcHRpb25dID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzY3JpcHRpb25Ub1J1bnNbaW5mby5kZXNjcmlwdGlvbl0ucHVzaChydW4pOwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gdW5hbmltb3VzRGlzcGxheU5hbWUgIT0gbnVsbCA/IHVuYW5pbW91c0Rpc3BsYXlOYW1lIDogZGVmYXVsdERpc3BsYXlOYW1lOwogICAgICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKCgpID0+IHsKICAgICAgICAgICAgY29uc3QgZGVzY3JpcHRpb25zID0gT2JqZWN0LmtleXMoZGVzY3JpcHRpb25Ub1J1bnMpOwogICAgICAgICAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRlc2NyaXB0aW9ucy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnNbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9IGRlc2NyaXB0aW9ucy5tYXAoKGRlc2NyaXB0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVucyA9IGRlc2NyaXB0aW9uVG9SdW5zW2Rlc2NyaXB0aW9uXS5tYXAoKHJ1bikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSdyZSBzcGxpY2luZyBwb3RlbnRpYWxseSB1bnNhZmUgZGlzcGxheSBuYW1lcyBpbnRvCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbml0aXplZCBkZXNjcmlwdGlvbnMsIHNvIHdlIG5lZWQgdG8gc2FuaXRpemUgdGhlbS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FmZVJ1biA9IHJ1bgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLzwvZywgJyZsdDsnKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKSAvLyBmb3Igc3ltbWV0cnkgOi0pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJi9nLCAnJmFtcDsnKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8Y29kZT4ke3NhZmVSdW59PC9jb2RlPmA7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgam9pbmVkID0gcnVucy5sZW5ndGggPiAyCiAgICAgICAgICAgICAgICAgICAgICAgID8gcnVucy5zbGljZSgwLCBydW5zLmxlbmd0aCAtIDEpLmpvaW4oJywgJykgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJywgYW5kICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVuc1tydW5zLmxlbmd0aCAtIDFdCiAgICAgICAgICAgICAgICAgICAgICAgIDogcnVucy5qb2luKCcgYW5kICcpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bk5vdW4gPSBuZ2V0dGV4dChydW5zLmxlbmd0aCwgJ3J1bicsICdydW5zJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGA8bGk+PHA+Rm9yICR7cnVuTm91bn0gJHtqb2luZWR9OjwvcD4ke2Rlc2NyaXB0aW9ufTwvbGk+YDsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY29uc3QgcHJlZml4ID0gJzxwPjxzdHJvbmc+TXVsdGlwbGUgZGVzY3JpcHRpb25zOjwvc3Ryb25nPjwvcD4nOwogICAgICAgICAgICAgICAgcmV0dXJuIGAke3ByZWZpeH08dWw+JHtpdGVtcy5qb2luKCcnKX08L3VsPmA7CiAgICAgICAgICAgIH0KICAgICAgICB9KSgpOwogICAgICAgIHJldHVybiB7IGRpc3BsYXlOYW1lLCBkZXNjcmlwdGlvbiB9OwogICAgfQogICAgZnVuY3Rpb24gbmdldHRleHQoaywgZW5TaW5ndWxhciwgZW5QbHVyYWwpIHsKICAgICAgICAvLyBQb3RlbnRpYWwgZXh0ZW5zaW9uIHBvaW50IGZvciBwcm9wZXIgaTE4biBpbmZyYXN0cnVjdHVyZSwgaWYgd2UKICAgICAgICAvLyBldmVyIGltcGxlbWVudCBpdC4KICAgICAgICByZXR1cm4gayA9PT0gMSA/IGVuU2luZ3VsYXIgOiBlblBsdXJhbDsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogdGYtc21vb3RoaW5nLWlucHV0IGNyZWF0ZXMgYW4gaW5wdXQgY29tcG9uZW50IGZvciBleHBvbmVudGlhbCBzbW9vdGhpbmcuCiAgICAgKi8KICAgIGxldCBUZlNtb290aGluZ0lucHV0ID0gCiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLXZhcmlhYmxlCiAgICBjbGFzcyBUZlNtb290aGluZ0lucHV0IGV4dGVuZHMgUG9seW1lckVsZW1lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLndlaWdodCA9IDAuNjsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlV2VpZ2h0ID0gbG9kYXNoLmRlYm91bmNlKGZ1bmN0aW9uICh2YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMud2VpZ2h0ID0gdmFsOwogICAgICAgICAgICB9LCAyNTApOwogICAgICAgIH0KICAgICAgICBfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJDaGFuZ2VkKCkgewogICAgICAgICAgICB0aGlzLl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQgPSB0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlci50b1N0cmluZygpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVXZWlnaHQuY2FsbCh0aGlzLCB0aGlzLl9pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlcik7CiAgICAgICAgfQogICAgICAgIF9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXRDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAoK3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dCA8IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dCA9ICcwJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgrdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0ID4gMSkgewogICAgICAgICAgICAgICAgdGhpcy5faW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0ID0gJzEnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkID0gK3RoaXMuX2lucHV0V2VpZ2h0U3RyaW5nRm9yUGFwZXJJbnB1dDsKICAgICAgICAgICAgaWYgKCFpc05hTihkKSkgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlV2VpZ2h0LmNhbGwodGhpcywgZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgVGZTbW9vdGhpbmdJbnB1dC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPGgzIGNsYXNzPSJ0aXRsZSI+U21vb3RoaW5nPC9oMz4KICAgIDxkaXYgY2xhc3M9InNtb290aGluZy1ibG9jayI+CiAgICAgIDxwYXBlci1zbGlkZXIKICAgICAgICBpZD0ic2xpZGVyIgogICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXJ9fSIKICAgICAgICBtYXg9IltbbWF4XV0iCiAgICAgICAgbWluPSJbW21pbl1dIgogICAgICAgIHBpbgogICAgICAgIHN0ZXA9Iltbc3RlcF1dIgogICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICB2YWx1ZT0ie3t3ZWlnaHR9fSIKICAgICAgPjwvcGFwZXItc2xpZGVyPgogICAgICA8cGFwZXItaW5wdXQKICAgICAgICBpZD0iaW5wdXQiCiAgICAgICAgbGFiZWw9IndlaWdodCIKICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgIHZhbHVlPSJ7e19pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXR9fSIKICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgc3RlcD0iW1tzdGVwXV0iCiAgICAgICAgbWluPSJbW21pbl1dIgogICAgICAgIG1heD0iW1ttYXhdXSIKICAgICAgPjwvcGFwZXItaW5wdXQ+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgLnRpdGxlIHsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItZ3JleS04MDApOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICAgIGZvbnQtc2l6ZTogMTRweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgIH0KCiAgICAgIC5zbW9vdGhpbmctYmxvY2sgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgLS1wYXBlci1zbGlkZXItYWN0aXZlLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWJvcmRlci1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXIta25vYi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItbWFya2Vycy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgLS1wYXBlci1zbGlkZXItcGluLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tc3RhcnQtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIGZsZXgtZ3JvdzogMjsKICAgICAgfQoKICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWZvY3VzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1pbnB1dDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1sYWJlbDogewogICAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIH0KICAgICAgICB3aWR0aDogNjBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZlNtb290aGluZ0lucHV0LnByb3RvdHlwZSwgInN0ZXAiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZlNtb290aGluZ0lucHV0LnByb3RvdHlwZSwgIm1heCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmU21vb3RoaW5nSW5wdXQucHJvdG90eXBlLCAibWluIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZlNtb290aGluZ0lucHV0LnByb3RvdHlwZSwgIndlaWdodCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ19pbW1lZGlhdGVXZWlnaHROdW1iZXJGb3JQYXBlclNsaWRlckNoYW5nZWQnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZTbW9vdGhpbmdJbnB1dC5wcm90b3R5cGUsICJfaW1tZWRpYXRlV2VpZ2h0TnVtYmVyRm9yUGFwZXJTbGlkZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfaW5wdXRXZWlnaHRTdHJpbmdGb3JQYXBlcklucHV0Q2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlNtb290aGluZ0lucHV0LnByb3RvdHlwZSwgIl9pbnB1dFdlaWdodFN0cmluZ0ZvclBhcGVySW5wdXQiLCB2b2lkIDApOwogICAgVGZTbW9vdGhpbmdJbnB1dCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLXNtb290aGluZy1pbnB1dCcpCiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC12YXJpYWJsZQogICAgXSwgVGZTbW9vdGhpbmdJbnB1dCk7CgogICAgLyogQ29weXJpZ2h0IDIwMTUgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEFkZCBxdWVyeSBwYXJhbWV0ZXJzIHRvIGEgVVJMLiBWYWx1ZXMgd2lsbCBiZSBVUkwtZW5jb2RlZC4gVGhlIFVSTAogICAgICogbWF5IG9yIG1heSBub3QgYWxyZWFkeSBoYXZlIHF1ZXJ5IHBhcmFtZXRlcnMuIEZvciBjb252ZW5pZW5jZSwKICAgICAqIHBhcmFtZXRlcnMgd2hvc2UgdmFsdWUgaXMgYHVuZGVmaW5lZGAgd2lsbCBiZSBkcm9wcGVkLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCB0aGUgZm9sbG93aW5nIGV4cHJlc3Npb25zIGFyZSBlcXVpdmFsZW50OgogICAgICoKICAgICAqICAgICBhZGRQYXJhbXMoImh0dHA6Ly9mb28iLCB7YTogIjEiLCBiOiBbIjIiLCAiMys0Il0sIGM6ICI1In0pCiAgICAgKiAgICAgYWRkUGFyYW1zKCJodHRwOi8vZm9vP2E9MSIsIHtiOiBbIjIiLCAiMys0Il0sIGM6ICI1IiwgZDogdW5kZWZpbmVkfSkKICAgICAqICAgICAiaHR0cDovL2Zvbz9hPTEmYj0yJmI9MyUyQjQmYz01IgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIElmIHVzZWQgd2l0aCBgcm91dGVyLnBsdWdpblJvdXRlYCwgcGxlYXNlIHVzZSB0aGUgcXVlcnlQYXJhbXMKICAgICAqIGFyZ3VtZW50LgogICAgICovCiAgICBmdW5jdGlvbiBhZGRQYXJhbXMoYmFzZVVSTCwgcGFyYW1zKSB7CiAgICAgICAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKHBhcmFtcykKICAgICAgICAgICAgLnNvcnQoKQogICAgICAgICAgICAuZmlsdGVyKChrKSA9PiBwYXJhbXNba10gIT09IHVuZGVmaW5lZCk7CiAgICAgICAgaWYgKCFrZXlzLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gYmFzZVVSTDsgLy8gbm8gbmVlZCB0byBjaGFuZ2UgJy9mb28nIHRvICcvZm9vPycKICAgICAgICB9CiAgICAgICAgY29uc3QgZGVsaW1pdGVyID0gYmFzZVVSTC5pbmRleE9mKCc/JykgIT09IC0xID8gJyYnIDogJz8nOwogICAgICAgIGNvbnN0IHBhcnRzID0gW10uY29uY2F0KC4uLmtleXMubWFwKChrZXkpID0+IHsKICAgICAgICAgICAgY29uc3QgcmF3VmFsdWUgPSBwYXJhbXNba2V5XTsKICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gQXJyYXkuaXNBcnJheShyYXdWYWx1ZSkgPyByYXdWYWx1ZSA6IFtyYXdWYWx1ZV07CiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMubWFwKCh2YWx1ZSkgPT4gYCR7a2V5fT0ke19lbmNvZGVVUklDb21wb25lbnQodmFsdWUpfWApOwogICAgICAgIH0pKTsKICAgICAgICBjb25zdCBxdWVyeSA9IHBhcnRzLmpvaW4oJyYnKTsKICAgICAgICByZXR1cm4gYmFzZVVSTCArIGRlbGltaXRlciArIHF1ZXJ5OwogICAgfQogICAgZnVuY3Rpb24gX2VuY29kZVVSSUNvbXBvbmVudCh4KSB7CiAgICAgICAgLy8gUmVwbGFjZSBwYXJlbnRoZXNlcyBmb3IgY29uc2lzdGVuY3kgd2l0aCBQeXRob24ncyB1cmxsaWIudXJsZW5jb2RlLgogICAgICAgIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoeCkucmVwbGFjZSgvXCgvZywgJyUyOCcpLnJlcGxhY2UoL1wpL2csICclMjknKTsKICAgIH0KCiAgICAvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4NCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlDQogICAgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUNCiAgICBMaWNlbnNlIGF0IGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KDQogICAgVEhJUyBDT0RFIElTIFBST1ZJREVEIE9OIEFOICpBUyBJUyogQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KICAgIEtJTkQsIEVJVEhFUiBFWFBSRVNTIE9SIElNUExJRUQsIElOQ0xVRElORyBXSVRIT1VUIExJTUlUQVRJT04gQU5ZIElNUExJRUQNCiAgICBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgVElUTEUsIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLA0KICAgIE1FUkNIQU5UQUJMSVRZIE9SIE5PTi1JTkZSSU5HRU1FTlQuDQoNCiAgICBTZWUgdGhlIEFwYWNoZSBWZXJzaW9uIDIuMCBMaWNlbnNlIGZvciBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMNCiAgICBhbmQgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCiAgICAvKiBnbG9iYWwgUmVmbGVjdCwgUHJvbWlzZSAqLw0KDQogICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwNCiAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fA0KICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsNCg0KICAgIGZ1bmN0aW9uIF9fZXh0ZW5kcyhkLCBiKSB7DQogICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7DQogICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQ0KICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7DQogICAgfQ0KDQogICAgdmFyIF9fYXNzaWduID0gT2JqZWN0LmFzc2lnbiB8fCBmdW5jdGlvbiBfX2Fzc2lnbih0KSB7DQogICAgICAgIGZvciAodmFyIHMsIGkgPSAxLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSA8IG47IGkrKykgew0KICAgICAgICAgICAgcyA9IGFyZ3VtZW50c1tpXTsNCiAgICAgICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSkgdFtwXSA9IHNbcF07DQogICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHQ7DQogICAgfTsNCg0KICAgIGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7DQogICAgICAgIHZhciB0ID0ge307DQogICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKQ0KICAgICAgICAgICAgdFtwXSA9IHNbcF07DQogICAgICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICJmdW5jdGlvbiIpDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSBpZiAoZS5pbmRleE9mKHBbaV0pIDwgMCkNCiAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTsNCiAgICAgICAgcmV0dXJuIHQ7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19kZWNvcmF0ZSQxKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKSB7DQogICAgICAgIHZhciBjID0gYXJndW1lbnRzLmxlbmd0aCwgciA9IGMgPCAzID8gdGFyZ2V0IDogZGVzYyA9PT0gbnVsbCA/IGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwga2V5KSA6IGRlc2MsIGQ7DQogICAgICAgIGlmICh0eXBlb2YgUmVmbGVjdCA9PT0gIm9iamVjdCIgJiYgdHlwZW9mIFJlZmxlY3QuZGVjb3JhdGUgPT09ICJmdW5jdGlvbiIpIHIgPSBSZWZsZWN0LmRlY29yYXRlKGRlY29yYXRvcnMsIHRhcmdldCwga2V5LCBkZXNjKTsNCiAgICAgICAgZWxzZSBmb3IgKHZhciBpID0gZGVjb3JhdG9ycy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgaWYgKGQgPSBkZWNvcmF0b3JzW2ldKSByID0gKGMgPCAzID8gZChyKSA6IGMgPiAzID8gZCh0YXJnZXQsIGtleSwgcikgOiBkKHRhcmdldCwga2V5KSkgfHwgcjsNCiAgICAgICAgcmV0dXJuIGMgPiAzICYmIHIgJiYgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwga2V5LCByKSwgcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfX3BhcmFtKHBhcmFtSW5kZXgsIGRlY29yYXRvcikgew0KICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRhcmdldCwga2V5KSB7IGRlY29yYXRvcih0YXJnZXQsIGtleSwgcGFyYW1JbmRleCk7IH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfX21ldGFkYXRhJDEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHsNCiAgICAgICAgaWYgKHR5cGVvZiBSZWZsZWN0ID09PSAib2JqZWN0IiAmJiB0eXBlb2YgUmVmbGVjdC5tZXRhZGF0YSA9PT0gImZ1bmN0aW9uIikgcmV0dXJuIFJlZmxlY3QubWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIF9fYXdhaXRlciQxKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICByZXR1cm4gbmV3IChQIHx8IChQID0gUHJvbWlzZSkpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsNCiAgICAgICAgICAgIGZ1bmN0aW9uIGZ1bGZpbGxlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvci5uZXh0KHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHJlamVjdGVkKHZhbHVlKSB7IHRyeSB7IHN0ZXAoZ2VuZXJhdG9yWyJ0aHJvdyJdKHZhbHVlKSk7IH0gY2F0Y2ggKGUpIHsgcmVqZWN0KGUpOyB9IH0NCiAgICAgICAgICAgIGZ1bmN0aW9uIHN0ZXAocmVzdWx0KSB7IHJlc3VsdC5kb25lID8gcmVzb2x2ZShyZXN1bHQudmFsdWUpIDogbmV3IFAoZnVuY3Rpb24gKHJlc29sdmUpIHsgcmVzb2x2ZShyZXN1bHQudmFsdWUpOyB9KS50aGVuKGZ1bGZpbGxlZCwgcmVqZWN0ZWQpOyB9DQogICAgICAgICAgICBzdGVwKChnZW5lcmF0b3IgPSBnZW5lcmF0b3IuYXBwbHkodGhpc0FyZywgX2FyZ3VtZW50cyB8fCBbXSkpLm5leHQoKSk7DQogICAgICAgIH0pOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIF9fZ2VuZXJhdG9yKHRoaXNBcmcsIGJvZHkpIHsNCiAgICAgICAgdmFyIF8gPSB7IGxhYmVsOiAwLCBzZW50OiBmdW5jdGlvbigpIHsgaWYgKHRbMF0gJiAxKSB0aHJvdyB0WzFdOyByZXR1cm4gdFsxXTsgfSwgdHJ5czogW10sIG9wczogW10gfSwgZiwgeSwgdCwgZzsNCiAgICAgICAgcmV0dXJuIGcgPSB7IG5leHQ6IHZlcmIoMCksICJ0aHJvdyI6IHZlcmIoMSksICJyZXR1cm4iOiB2ZXJiKDIpIH0sIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgKGdbU3ltYm9sLml0ZXJhdG9yXSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpczsgfSksIGc7DQogICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyByZXR1cm4gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHN0ZXAoW24sIHZdKTsgfTsgfQ0KICAgICAgICBmdW5jdGlvbiBzdGVwKG9wKSB7DQogICAgICAgICAgICBpZiAoZikgdGhyb3cgbmV3IFR5cGVFcnJvcigiR2VuZXJhdG9yIGlzIGFscmVhZHkgZXhlY3V0aW5nLiIpOw0KICAgICAgICAgICAgd2hpbGUgKF8pIHRyeSB7DQogICAgICAgICAgICAgICAgaWYgKGYgPSAxLCB5ICYmICh0ID0geVtvcFswXSAmIDIgPyAicmV0dXJuIiA6IG9wWzBdID8gInRocm93IiA6ICJuZXh0Il0pICYmICEodCA9IHQuY2FsbCh5LCBvcFsxXSkpLmRvbmUpIHJldHVybiB0Ow0KICAgICAgICAgICAgICAgIGlmICh5ID0gMCwgdCkgb3AgPSBbMCwgdC52YWx1ZV07DQogICAgICAgICAgICAgICAgc3dpdGNoIChvcFswXSkgew0KICAgICAgICAgICAgICAgICAgICBjYXNlIDA6IGNhc2UgMTogdCA9IG9wOyBicmVhazsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OiBfLmxhYmVsKys7IHJldHVybiB7IHZhbHVlOiBvcFsxXSwgZG9uZTogZmFsc2UgfTsNCiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OiBfLmxhYmVsKys7IHkgPSBvcFsxXTsgb3AgPSBbMF07IGNvbnRpbnVlOw0KICAgICAgICAgICAgICAgICAgICBjYXNlIDc6IG9wID0gXy5vcHMucG9wKCk7IF8udHJ5cy5wb3AoKTsgY29udGludWU7DQogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0ID0gXy50cnlzLCB0ID0gdC5sZW5ndGggPiAwICYmIHRbdC5sZW5ndGggLSAxXSkgJiYgKG9wWzBdID09PSA2IHx8IG9wWzBdID09PSAyKSkgeyBfID0gMDsgY29udGludWU7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcFswXSA9PT0gMyAmJiAoIXQgfHwgKG9wWzFdID4gdFswXSAmJiBvcFsxXSA8IHRbM10pKSkgeyBfLmxhYmVsID0gb3BbMV07IGJyZWFrOyB9DQogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3BbMF0gPT09IDYgJiYgXy5sYWJlbCA8IHRbMV0pIHsgXy5sYWJlbCA9IHRbMV07IHQgPSBvcDsgYnJlYWs7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ICYmIF8ubGFiZWwgPCB0WzJdKSB7IF8ubGFiZWwgPSB0WzJdOyBfLm9wcy5wdXNoKG9wKTsgYnJlYWs7IH0NCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0WzJdKSBfLm9wcy5wb3AoKTsNCiAgICAgICAgICAgICAgICAgICAgICAgIF8udHJ5cy5wb3AoKTsgY29udGludWU7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIG9wID0gYm9keS5jYWxsKHRoaXNBcmcsIF8pOw0KICAgICAgICAgICAgfSBjYXRjaCAoZSkgeyBvcCA9IFs2LCBlXTsgeSA9IDA7IH0gZmluYWxseSB7IGYgPSB0ID0gMDsgfQ0KICAgICAgICAgICAgaWYgKG9wWzBdICYgNSkgdGhyb3cgb3BbMV07IHJldHVybiB7IHZhbHVlOiBvcFswXSA/IG9wWzFdIDogdm9pZCAwLCBkb25lOiB0cnVlIH07DQogICAgICAgIH0NCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfX2V4cG9ydFN0YXIobSwgZXhwb3J0cykgew0KICAgICAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX192YWx1ZXMobykgew0KICAgICAgICB2YXIgbSA9IHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb1tTeW1ib2wuaXRlcmF0b3JdLCBpID0gMDsNCiAgICAgICAgaWYgKG0pIHJldHVybiBtLmNhbGwobyk7DQogICAgICAgIHJldHVybiB7DQogICAgICAgICAgICBuZXh0OiBmdW5jdGlvbiAoKSB7DQogICAgICAgICAgICAgICAgaWYgKG8gJiYgaSA+PSBvLmxlbmd0aCkgbyA9IHZvaWQgMDsNCiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogbyAmJiBvW2krK10sIGRvbmU6ICFvIH07DQogICAgICAgICAgICB9DQogICAgICAgIH07DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19yZWFkKG8sIG4pIHsNCiAgICAgICAgdmFyIG0gPSB0eXBlb2YgU3ltYm9sID09PSAiZnVuY3Rpb24iICYmIG9bU3ltYm9sLml0ZXJhdG9yXTsNCiAgICAgICAgaWYgKCFtKSByZXR1cm4gbzsNCiAgICAgICAgdmFyIGkgPSBtLmNhbGwobyksIHIsIGFyID0gW10sIGU7DQogICAgICAgIHRyeSB7DQogICAgICAgICAgICB3aGlsZSAoKG4gPT09IHZvaWQgMCB8fCBuLS0gPiAwKSAmJiAhKHIgPSBpLm5leHQoKSkuZG9uZSkgYXIucHVzaChyLnZhbHVlKTsNCiAgICAgICAgfQ0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsgZSA9IHsgZXJyb3I6IGVycm9yIH07IH0NCiAgICAgICAgZmluYWxseSB7DQogICAgICAgICAgICB0cnkgew0KICAgICAgICAgICAgICAgIGlmIChyICYmICFyLmRvbmUgJiYgKG0gPSBpWyJyZXR1cm4iXSkpIG0uY2FsbChpKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGZpbmFsbHkgeyBpZiAoZSkgdGhyb3cgZS5lcnJvcjsgfQ0KICAgICAgICB9DQogICAgICAgIHJldHVybiBhcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfX3NwcmVhZCgpIHsNCiAgICAgICAgZm9yICh2YXIgYXIgPSBbXSwgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspDQogICAgICAgICAgICBhciA9IGFyLmNvbmNhdChfX3JlYWQoYXJndW1lbnRzW2ldKSk7DQogICAgICAgIHJldHVybiBhcjsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfX2F3YWl0KHYpIHsNCiAgICAgICAgcmV0dXJuIHRoaXMgaW5zdGFuY2VvZiBfX2F3YWl0ID8gKHRoaXMudiA9IHYsIHRoaXMpIDogbmV3IF9fYXdhaXQodik7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19hc3luY0dlbmVyYXRvcih0aGlzQXJnLCBfYXJndW1lbnRzLCBnZW5lcmF0b3IpIHsNCiAgICAgICAgaWYgKCFTeW1ib2wuYXN5bmNJdGVyYXRvcikgdGhyb3cgbmV3IFR5cGVFcnJvcigiU3ltYm9sLmFzeW5jSXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7DQogICAgICAgIHZhciBnID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pLCBpLCBxID0gW107DQogICAgICAgIHJldHVybiBpID0ge30sIHZlcmIoIm5leHQiKSwgdmVyYigidGhyb3ciKSwgdmVyYigicmV0dXJuIiksIGlbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfSwgaTsNCiAgICAgICAgZnVuY3Rpb24gdmVyYihuKSB7IGlmIChnW25dKSBpW25dID0gZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChhLCBiKSB7IHEucHVzaChbbiwgdiwgYSwgYl0pID4gMSB8fCByZXN1bWUobiwgdik7IH0pOyB9OyB9DQogICAgICAgIGZ1bmN0aW9uIHJlc3VtZShuLCB2KSB7IHRyeSB7IHN0ZXAoZ1tuXSh2KSk7IH0gY2F0Y2ggKGUpIHsgc2V0dGxlKHFbMF1bM10sIGUpOyB9IH0NCiAgICAgICAgZnVuY3Rpb24gc3RlcChyKSB7IHIudmFsdWUgaW5zdGFuY2VvZiBfX2F3YWl0ID8gUHJvbWlzZS5yZXNvbHZlKHIudmFsdWUudikudGhlbihmdWxmaWxsLCByZWplY3QpIDogc2V0dGxlKHFbMF1bMl0sIHIpOyAgfQ0KICAgICAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZSgibmV4dCIsIHZhbHVlKTsgfQ0KICAgICAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKCJ0aHJvdyIsIHZhbHVlKTsgfQ0KICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19hc3luY0RlbGVnYXRvcihvKSB7DQogICAgICAgIHZhciBpLCBwOw0KICAgICAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiwgZnVuY3Rpb24gKGUpIHsgdGhyb3cgZTsgfSksIHZlcmIoInJldHVybiIpLCBpW1N5bWJvbC5pdGVyYXRvcl0gPSBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9LCBpOw0KICAgICAgICBmdW5jdGlvbiB2ZXJiKG4sIGYpIHsgaWYgKG9bbl0pIGlbbl0gPSBmdW5jdGlvbiAodikgeyByZXR1cm4gKHAgPSAhcCkgPyB7IHZhbHVlOiBfX2F3YWl0KG9bbl0odikpLCBkb25lOiBuID09PSAicmV0dXJuIiB9IDogZiA/IGYodikgOiB2OyB9OyB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7DQogICAgICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOw0KICAgICAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdOw0KICAgICAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IHR5cGVvZiBfX3ZhbHVlcyA9PT0gImZ1bmN0aW9uIiA/IF9fdmFsdWVzKG8pIDogb1tTeW1ib2wuaXRlcmF0b3JdKCk7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19tYWtlVGVtcGxhdGVPYmplY3QoY29va2VkLCByYXcpIHsNCiAgICAgICAgaWYgKE9iamVjdC5kZWZpbmVQcm9wZXJ0eSkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkoY29va2VkLCAicmF3IiwgeyB2YWx1ZTogcmF3IH0pOyB9IGVsc2UgeyBjb29rZWQucmF3ID0gcmF3OyB9DQogICAgICAgIHJldHVybiBjb29rZWQ7DQogICAgfQoKICAgIHZhciB0c2xpYl9lczYgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIF9fZXh0ZW5kczogX19leHRlbmRzLAogICAgICAgIF9fYXNzaWduOiBfX2Fzc2lnbiwKICAgICAgICBfX3Jlc3Q6IF9fcmVzdCwKICAgICAgICBfX2RlY29yYXRlOiBfX2RlY29yYXRlJDEsCiAgICAgICAgX19wYXJhbTogX19wYXJhbSwKICAgICAgICBfX21ldGFkYXRhOiBfX21ldGFkYXRhJDEsCiAgICAgICAgX19hd2FpdGVyOiBfX2F3YWl0ZXIkMSwKICAgICAgICBfX2dlbmVyYXRvcjogX19nZW5lcmF0b3IsCiAgICAgICAgX19leHBvcnRTdGFyOiBfX2V4cG9ydFN0YXIsCiAgICAgICAgX192YWx1ZXM6IF9fdmFsdWVzLAogICAgICAgIF9fcmVhZDogX19yZWFkLAogICAgICAgIF9fc3ByZWFkOiBfX3NwcmVhZCwKICAgICAgICBfX2F3YWl0OiBfX2F3YWl0LAogICAgICAgIF9fYXN5bmNHZW5lcmF0b3I6IF9fYXN5bmNHZW5lcmF0b3IsCiAgICAgICAgX19hc3luY0RlbGVnYXRvcjogX19hc3luY0RlbGVnYXRvciwKICAgICAgICBfX2FzeW5jVmFsdWVzOiBfX2FzeW5jVmFsdWVzLAogICAgICAgIF9fbWFrZVRlbXBsYXRlT2JqZWN0OiBfX21ha2VUZW1wbGF0ZU9iamVjdAogICAgfSk7CgogICAgdmFyIHZlcnNpb24kMiA9ICI0LjEzLjAiOwoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZyQ0KGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIGJpc2VjdG9yJDEoY29tcGFyZSkgewogICAgICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yJDEoY29tcGFyZSk7CiAgICAgIHJldHVybiB7CiAgICAgICAgbGVmdDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOwogICAgICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA8IDApIGxvID0gbWlkICsgMTsKICAgICAgICAgICAgZWxzZSBoaSA9IG1pZDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsbzsKICAgICAgICB9LAogICAgICAgIHJpZ2h0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpID4gMCkgaGkgPSBtaWQ7CiAgICAgICAgICAgIGVsc2UgbG8gPSBtaWQgKyAxOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGxvOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmdDb21wYXJhdG9yJDEoZikgewogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgeCkgewogICAgICAgIHJldHVybiBhc2NlbmRpbmckNChmKGQpLCB4KTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgYXNjZW5kaW5nQmlzZWN0JDEgPSBiaXNlY3RvciQxKGFzY2VuZGluZyQ0KTsKICAgIHZhciBiaXNlY3RSaWdodCQxID0gYXNjZW5kaW5nQmlzZWN0JDEucmlnaHQ7CiAgICB2YXIgYmlzZWN0TGVmdCQxID0gYXNjZW5kaW5nQmlzZWN0JDEubGVmdDsKCiAgICBmdW5jdGlvbiBwYWlycyQxKGFycmF5LCBmKSB7CiAgICAgIGlmIChmID09IG51bGwpIGYgPSBwYWlyJDE7CiAgICAgIHZhciBpID0gMCwgbiA9IGFycmF5Lmxlbmd0aCAtIDEsIHAgPSBhcnJheVswXSwgcGFpcnMgPSBuZXcgQXJyYXkobiA8IDAgPyAwIDogbik7CiAgICAgIHdoaWxlIChpIDwgbikgcGFpcnNbaV0gPSBmKHAsIHAgPSBhcnJheVsrK2ldKTsKICAgICAgcmV0dXJuIHBhaXJzOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhaXIkMShhLCBiKSB7CiAgICAgIHJldHVybiBbYSwgYl07CiAgICB9CgogICAgZnVuY3Rpb24gY3Jvc3MkMyh2YWx1ZXMwLCB2YWx1ZXMxLCByZWR1Y2UpIHsKICAgICAgdmFyIG4wID0gdmFsdWVzMC5sZW5ndGgsCiAgICAgICAgICBuMSA9IHZhbHVlczEubGVuZ3RoLAogICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4wICogbjEpLAogICAgICAgICAgaTAsCiAgICAgICAgICBpMSwKICAgICAgICAgIGksCiAgICAgICAgICB2YWx1ZTA7CgogICAgICBpZiAocmVkdWNlID09IG51bGwpIHJlZHVjZSA9IHBhaXIkMTsKCiAgICAgIGZvciAoaTAgPSBpID0gMDsgaTAgPCBuMDsgKytpMCkgewogICAgICAgIGZvciAodmFsdWUwID0gdmFsdWVzMFtpMF0sIGkxID0gMDsgaTEgPCBuMTsgKytpMSwgKytpKSB7CiAgICAgICAgICB2YWx1ZXNbaV0gPSByZWR1Y2UodmFsdWUwLCB2YWx1ZXMxW2kxXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdmFsdWVzOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlc2NlbmRpbmckMyhhLCBiKSB7CiAgICAgIHJldHVybiBiIDwgYSA/IC0xIDogYiA+IGEgPyAxIDogYiA+PSBhID8gMCA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBudW1iZXIkNCh4KSB7CiAgICAgIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7CiAgICB9CgogICAgZnVuY3Rpb24gdmFyaWFuY2UkMSh2YWx1ZXMsIHZhbHVlb2YpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgbSA9IDAsCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICBtZWFuID0gMCwKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgZGVsdGEsCiAgICAgICAgICBzdW0gPSAwOwoKICAgICAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyJDQodmFsdWVzW2ldKSkpIHsKICAgICAgICAgICAgZGVsdGEgPSB2YWx1ZSAtIG1lYW47CiAgICAgICAgICAgIG1lYW4gKz0gZGVsdGEgLyArK207CiAgICAgICAgICAgIHN1bSArPSBkZWx0YSAqICh2YWx1ZSAtIG1lYW4pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZWxzZSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICghaXNOYU4odmFsdWUgPSBudW1iZXIkNCh2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkpKSB7CiAgICAgICAgICAgIGRlbHRhID0gdmFsdWUgLSBtZWFuOwogICAgICAgICAgICBtZWFuICs9IGRlbHRhIC8gKyttOwogICAgICAgICAgICBzdW0gKz0gZGVsdGEgKiAodmFsdWUgLSBtZWFuKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmIChtID4gMSkgcmV0dXJuIHN1bSAvIChtIC0gMSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGV2aWF0aW9uJDEoYXJyYXksIGYpIHsKICAgICAgdmFyIHYgPSB2YXJpYW5jZSQxKGFycmF5LCBmKTsKICAgICAgcmV0dXJuIHYgPyBNYXRoLnNxcnQodikgOiB2OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dGVudCQyKHZhbHVlcywgdmFsdWVvZikgewogICAgICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICB2YWx1ZSwKICAgICAgICAgIG1pbiwKICAgICAgICAgIG1heDsKCiAgICAgIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAgICAgICAgICBtaW4gPSBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4KICAgICAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICAgICAgbWluID0gbWF4ID0gdmFsdWU7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAobWluID4gdmFsdWUpIG1pbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKG1heCA8IHZhbHVlKSBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBbbWluLCBtYXhdOwogICAgfQoKICAgIHZhciBhcnJheSQ0ID0gQXJyYXkucHJvdG90eXBlOwoKICAgIHZhciBzbGljZSQ3ID0gYXJyYXkkNC5zbGljZTsKICAgIHZhciBtYXAkNCA9IGFycmF5JDQubWFwOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JGUoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaWRlbnRpdHkkYSh4KSB7CiAgICAgIHJldHVybiB4OwogICAgfQoKICAgIGZ1bmN0aW9uIHJhbmdlJDEoc3RhcnQsIHN0b3AsIHN0ZXApIHsKICAgICAgc3RhcnQgPSArc3RhcnQsIHN0b3AgPSArc3RvcCwgc3RlcCA9IChuID0gYXJndW1lbnRzLmxlbmd0aCkgPCAyID8gKHN0b3AgPSBzdGFydCwgc3RhcnQgPSAwLCAxKSA6IG4gPCAzID8gMSA6ICtzdGVwOwoKICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgIG4gPSBNYXRoLm1heCgwLCBNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSkgfCAwLAogICAgICAgICAgcmFuZ2UgPSBuZXcgQXJyYXkobik7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHJhbmdlW2ldID0gc3RhcnQgKyBpICogc3RlcDsKICAgICAgfQoKICAgICAgcmV0dXJuIHJhbmdlOwogICAgfQoKICAgIHZhciBlMTAkMSA9IE1hdGguc3FydCg1MCksCiAgICAgICAgZTUkMSA9IE1hdGguc3FydCgxMCksCiAgICAgICAgZTIkMSA9IE1hdGguc3FydCgyKTsKCiAgICBmdW5jdGlvbiB0aWNrcyQxKHN0YXJ0LCBzdG9wLCBjb3VudCkgewogICAgICB2YXIgcmV2ZXJzZSwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIG4sCiAgICAgICAgICB0aWNrcywKICAgICAgICAgIHN0ZXA7CgogICAgICBzdG9wID0gK3N0b3AsIHN0YXJ0ID0gK3N0YXJ0LCBjb3VudCA9ICtjb3VudDsKICAgICAgaWYgKHN0YXJ0ID09PSBzdG9wICYmIGNvdW50ID4gMCkgcmV0dXJuIFtzdGFydF07CiAgICAgIGlmIChyZXZlcnNlID0gc3RvcCA8IHN0YXJ0KSBuID0gc3RhcnQsIHN0YXJ0ID0gc3RvcCwgc3RvcCA9IG47CiAgICAgIGlmICgoc3RlcCA9IHRpY2tJbmNyZW1lbnQkMShzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTsKCiAgICAgIGlmIChzdGVwID4gMCkgewogICAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0IC8gc3RlcCk7CiAgICAgICAgc3RvcCA9IE1hdGguZmxvb3Ioc3RvcCAvIHN0ZXApOwogICAgICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RvcCAtIHN0YXJ0ICsgMSkpOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCArIGkpICogc3RlcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgKiBzdGVwKTsKICAgICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgKiBzdGVwKTsKICAgICAgICB0aWNrcyA9IG5ldyBBcnJheShuID0gTWF0aC5jZWlsKHN0YXJ0IC0gc3RvcCArIDEpKTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAoc3RhcnQgLSBpKSAvIHN0ZXA7CiAgICAgIH0KCiAgICAgIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNlKCk7CgogICAgICByZXR1cm4gdGlja3M7CiAgICB9CgogICAgZnVuY3Rpb24gdGlja0luY3JlbWVudCQxKHN0YXJ0LCBzdG9wLCBjb3VudCkgewogICAgICB2YXIgc3RlcCA9IChzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLAogICAgICAgICAgcG93ZXIgPSBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXApIC8gTWF0aC5MTjEwKSwKICAgICAgICAgIGVycm9yID0gc3RlcCAvIE1hdGgucG93KDEwLCBwb3dlcik7CiAgICAgIHJldHVybiBwb3dlciA+PSAwCiAgICAgICAgICA/IChlcnJvciA+PSBlMTAkMSA/IDEwIDogZXJyb3IgPj0gZTUkMSA/IDUgOiBlcnJvciA+PSBlMiQxID8gMiA6IDEpICogTWF0aC5wb3coMTAsIHBvd2VyKQogICAgICAgICAgOiAtTWF0aC5wb3coMTAsIC1wb3dlcikgLyAoZXJyb3IgPj0gZTEwJDEgPyAxMCA6IGVycm9yID49IGU1JDEgPyA1IDogZXJyb3IgPj0gZTIkMSA/IDIgOiAxKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aWNrU3RlcCQxKHN0YXJ0LCBzdG9wLCBjb3VudCkgewogICAgICB2YXIgc3RlcDAgPSBNYXRoLmFicyhzdG9wIC0gc3RhcnQpIC8gTWF0aC5tYXgoMCwgY291bnQpLAogICAgICAgICAgc3RlcDEgPSBNYXRoLnBvdygxMCwgTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwMCkgLyBNYXRoLkxOMTApKSwKICAgICAgICAgIGVycm9yID0gc3RlcDAgLyBzdGVwMTsKICAgICAgaWYgKGVycm9yID49IGUxMCQxKSBzdGVwMSAqPSAxMDsKICAgICAgZWxzZSBpZiAoZXJyb3IgPj0gZTUkMSkgc3RlcDEgKj0gNTsKICAgICAgZWxzZSBpZiAoZXJyb3IgPj0gZTIkMSkgc3RlcDEgKj0gMjsKICAgICAgcmV0dXJuIHN0b3AgPCBzdGFydCA/IC1zdGVwMSA6IHN0ZXAxOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0dXJnZXModmFsdWVzKSB7CiAgICAgIHJldHVybiBNYXRoLmNlaWwoTWF0aC5sb2codmFsdWVzLmxlbmd0aCkgLyBNYXRoLkxOMikgKyAxOwogICAgfQoKICAgIGZ1bmN0aW9uIGhpc3RvZ3JhbSQxKCkgewogICAgICB2YXIgdmFsdWUgPSBpZGVudGl0eSRhLAogICAgICAgICAgZG9tYWluID0gZXh0ZW50JDIsCiAgICAgICAgICB0aHJlc2hvbGQgPSBzdHVyZ2VzOwoKICAgICAgZnVuY3Rpb24gaGlzdG9ncmFtKGRhdGEpIHsKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICB4LAogICAgICAgICAgICB2YWx1ZXMgPSBuZXcgQXJyYXkobik7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHZhbHVlc1tpXSA9IHZhbHVlKGRhdGFbaV0sIGksIGRhdGEpOwogICAgICAgIH0KCiAgICAgICAgdmFyIHh6ID0gZG9tYWluKHZhbHVlcyksCiAgICAgICAgICAgIHgwID0geHpbMF0sCiAgICAgICAgICAgIHgxID0geHpbMV0sCiAgICAgICAgICAgIHR6ID0gdGhyZXNob2xkKHZhbHVlcywgeDAsIHgxKTsKCiAgICAgICAgLy8gQ29udmVydCBudW1iZXIgb2YgdGhyZXNob2xkcyBpbnRvIHVuaWZvcm0gdGhyZXNob2xkcy4KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodHopKSB7CiAgICAgICAgICB0eiA9IHRpY2tTdGVwJDEoeDAsIHgxLCB0eik7CiAgICAgICAgICB0eiA9IHJhbmdlJDEoTWF0aC5jZWlsKHgwIC8gdHopICogdHosIE1hdGguZmxvb3IoeDEgLyB0eikgKiB0eiwgdHopOyAvLyBleGNsdXNpdmUKICAgICAgICB9CgogICAgICAgIC8vIFJlbW92ZSBhbnkgdGhyZXNob2xkcyBvdXRzaWRlIHRoZSBkb21haW4uCiAgICAgICAgdmFyIG0gPSB0ei5sZW5ndGg7CiAgICAgICAgd2hpbGUgKHR6WzBdIDw9IHgwKSB0ei5zaGlmdCgpLCAtLW07CiAgICAgICAgd2hpbGUgKHR6W20gLSAxXSA+IHgxKSB0ei5wb3AoKSwgLS1tOwoKICAgICAgICB2YXIgYmlucyA9IG5ldyBBcnJheShtICsgMSksCiAgICAgICAgICAgIGJpbjsKCiAgICAgICAgLy8gSW5pdGlhbGl6ZSBiaW5zLgogICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbTsgKytpKSB7CiAgICAgICAgICBiaW4gPSBiaW5zW2ldID0gW107CiAgICAgICAgICBiaW4ueDAgPSBpID4gMCA/IHR6W2kgLSAxXSA6IHgwOwogICAgICAgICAgYmluLngxID0gaSA8IG0gPyB0eltpXSA6IHgxOwogICAgICAgIH0KCiAgICAgICAgLy8gQXNzaWduIGRhdGEgdG8gYmlucyBieSB2YWx1ZSwgaWdub3JpbmcgYW55IG91dHNpZGUgdGhlIGRvbWFpbi4KICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB4ID0gdmFsdWVzW2ldOwogICAgICAgICAgaWYgKHgwIDw9IHggJiYgeCA8PSB4MSkgewogICAgICAgICAgICBiaW5zW2Jpc2VjdFJpZ2h0JDEodHosIHgsIDAsIG0pXS5wdXNoKGRhdGFbaV0pOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGJpbnM7CiAgICAgIH0KCiAgICAgIGhpc3RvZ3JhbS52YWx1ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2YWx1ZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGUoXyksIGhpc3RvZ3JhbSkgOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIGhpc3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkZShbX1swXSwgX1sxXV0pLCBoaXN0b2dyYW0pIDogZG9tYWluOwogICAgICB9OwoKICAgICAgaGlzdG9ncmFtLnRocmVzaG9sZHMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhyZXNob2xkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogQXJyYXkuaXNBcnJheShfKSA/IGNvbnN0YW50JGUoc2xpY2UkNy5jYWxsKF8pKSA6IGNvbnN0YW50JGUoXyksIGhpc3RvZ3JhbSkgOiB0aHJlc2hvbGQ7CiAgICAgIH07CgogICAgICByZXR1cm4gaGlzdG9ncmFtOwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YW50aWxlJDEodmFsdWVzLCBwLCB2YWx1ZW9mKSB7CiAgICAgIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXIkNDsKICAgICAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47CiAgICAgIGlmICgocCA9ICtwKSA8PSAwIHx8IG4gPCAyKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzWzBdLCAwLCB2YWx1ZXMpOwogICAgICBpZiAocCA+PSAxKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzW24gLSAxXSwgbiAtIDEsIHZhbHVlcyk7CiAgICAgIHZhciBuLAogICAgICAgICAgaSA9IChuIC0gMSkgKiBwLAogICAgICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLAogICAgICAgICAgdmFsdWUwID0gK3ZhbHVlb2YodmFsdWVzW2kwXSwgaTAsIHZhbHVlcyksCiAgICAgICAgICB2YWx1ZTEgPSArdmFsdWVvZih2YWx1ZXNbaTAgKyAxXSwgaTAgKyAxLCB2YWx1ZXMpOwogICAgICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmcmVlZG1hbkRpYWNvbmlzJDEodmFsdWVzLCBtaW4sIG1heCkgewogICAgICB2YWx1ZXMgPSBtYXAkNC5jYWxsKHZhbHVlcywgbnVtYmVyJDQpLnNvcnQoYXNjZW5kaW5nJDQpOwogICAgICByZXR1cm4gTWF0aC5jZWlsKChtYXggLSBtaW4pIC8gKDIgKiAocXVhbnRpbGUkMSh2YWx1ZXMsIDAuNzUpIC0gcXVhbnRpbGUkMSh2YWx1ZXMsIDAuMjUpKSAqIE1hdGgucG93KHZhbHVlcy5sZW5ndGgsIC0xIC8gMykpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY290dCQxKHZhbHVlcywgbWluLCBtYXgpIHsKICAgICAgcmV0dXJuIE1hdGguY2VpbCgobWF4IC0gbWluKSAvICgzLjUgKiBkZXZpYXRpb24kMSh2YWx1ZXMpICogTWF0aC5wb3codmFsdWVzLmxlbmd0aCwgLTEgLyAzKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1heCQzKHZhbHVlcywgdmFsdWVvZikgewogICAgICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICB2YWx1ZSwKICAgICAgICAgIG1heDsKCiAgICAgIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAgICAgICAgICBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4KICAgICAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID4gbWF4KSB7CiAgICAgICAgICAgICAgICBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICAgICAgbWF4ID0gdmFsdWU7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID4gbWF4KSB7CiAgICAgICAgICAgICAgICBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBtYXg7CiAgICB9CgogICAgZnVuY3Rpb24gbWVhbiQxKHZhbHVlcywgdmFsdWVvZikgewogICAgICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgICBtID0gbiwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgc3VtID0gMDsKCiAgICAgIGlmICh2YWx1ZW9mID09IG51bGwpIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKCFpc05hTih2YWx1ZSA9IG51bWJlciQ0KHZhbHVlc1tpXSkpKSBzdW0gKz0gdmFsdWU7CiAgICAgICAgICBlbHNlIC0tbTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyJDQodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgc3VtICs9IHZhbHVlOwogICAgICAgICAgZWxzZSAtLW07CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAobSkgcmV0dXJuIHN1bSAvIG07CiAgICB9CgogICAgZnVuY3Rpb24gbWVkaWFuJDEodmFsdWVzLCB2YWx1ZW9mKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgbnVtYmVycyA9IFtdOwoKICAgICAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyJDQodmFsdWVzW2ldKSkpIHsKICAgICAgICAgICAgbnVtYmVycy5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAoIWlzTmFOKHZhbHVlID0gbnVtYmVyJDQodmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpKSkgewogICAgICAgICAgICBudW1iZXJzLnB1c2godmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHF1YW50aWxlJDEobnVtYmVycy5zb3J0KGFzY2VuZGluZyQ0KSwgMC41KTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZXJnZSQxKGFycmF5cykgewogICAgICB2YXIgbiA9IGFycmF5cy5sZW5ndGgsCiAgICAgICAgICBtLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgaiA9IDAsCiAgICAgICAgICBtZXJnZWQsCiAgICAgICAgICBhcnJheTsKCiAgICAgIHdoaWxlICgrK2kgPCBuKSBqICs9IGFycmF5c1tpXS5sZW5ndGg7CiAgICAgIG1lcmdlZCA9IG5ldyBBcnJheShqKTsKCiAgICAgIHdoaWxlICgtLW4gPj0gMCkgewogICAgICAgIGFycmF5ID0gYXJyYXlzW25dOwogICAgICAgIG0gPSBhcnJheS5sZW5ndGg7CiAgICAgICAgd2hpbGUgKC0tbSA+PSAwKSB7CiAgICAgICAgICBtZXJnZWRbLS1qXSA9IGFycmF5W21dOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG1lcmdlZDsKICAgIH0KCiAgICBmdW5jdGlvbiBtaW4kMih2YWx1ZXMsIHZhbHVlb2YpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgdmFsdWUsCiAgICAgICAgICBtaW47CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwgJiYgdmFsdWUgPj0gdmFsdWUpIHsKICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIENvbXBhcmUgdGhlIHJlbWFpbmluZyB2YWx1ZXMuCiAgICAgICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlc1tpXSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgewogICAgICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBlbHNlIHsKICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBGaW5kIHRoZSBmaXJzdCBjb21wYXJhYmxlIHZhbHVlLgogICAgICAgICAgaWYgKCh2YWx1ZSA9IHZhbHVlb2YodmFsdWVzW2ldLCBpLCB2YWx1ZXMpKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgICAgIG1pbiA9IHZhbHVlOwogICAgICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLgogICAgICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiBtaW4gPiB2YWx1ZSkgewogICAgICAgICAgICAgICAgbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbWluOwogICAgfQoKICAgIGZ1bmN0aW9uIHBlcm11dGUkMShhcnJheSwgaW5kZXhlcykgewogICAgICB2YXIgaSA9IGluZGV4ZXMubGVuZ3RoLCBwZXJtdXRlcyA9IG5ldyBBcnJheShpKTsKICAgICAgd2hpbGUgKGktLSkgcGVybXV0ZXNbaV0gPSBhcnJheVtpbmRleGVzW2ldXTsKICAgICAgcmV0dXJuIHBlcm11dGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjYW4kMSh2YWx1ZXMsIGNvbXBhcmUpIHsKICAgICAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47CiAgICAgIHZhciBuLAogICAgICAgICAgaSA9IDAsCiAgICAgICAgICBqID0gMCwKICAgICAgICAgIHhpLAogICAgICAgICAgeGogPSB2YWx1ZXNbal07CgogICAgICBpZiAoY29tcGFyZSA9PSBudWxsKSBjb21wYXJlID0gYXNjZW5kaW5nJDQ7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIGlmIChjb21wYXJlKHhpID0gdmFsdWVzW2ldLCB4aikgPCAwIHx8IGNvbXBhcmUoeGosIHhqKSAhPT0gMCkgewogICAgICAgICAgeGogPSB4aSwgaiA9IGk7CiAgICAgICAgfQogICAgICB9CgogICAgICBpZiAoY29tcGFyZSh4aiwgeGopID09PSAwKSByZXR1cm4gajsKICAgIH0KCiAgICBmdW5jdGlvbiBzaHVmZmxlJDIoYXJyYXksIGkwLCBpMSkgewogICAgICB2YXIgbSA9IChpMSA9PSBudWxsID8gYXJyYXkubGVuZ3RoIDogaTEpIC0gKGkwID0gaTAgPT0gbnVsbCA/IDAgOiAraTApLAogICAgICAgICAgdCwKICAgICAgICAgIGk7CgogICAgICB3aGlsZSAobSkgewogICAgICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsKICAgICAgICB0ID0gYXJyYXlbbSArIGkwXTsKICAgICAgICBhcnJheVttICsgaTBdID0gYXJyYXlbaSArIGkwXTsKICAgICAgICBhcnJheVtpICsgaTBdID0gdDsKICAgICAgfQoKICAgICAgcmV0dXJuIGFycmF5OwogICAgfQoKICAgIGZ1bmN0aW9uIHN1bSQzKHZhbHVlcywgdmFsdWVvZikgewogICAgICB2YXIgbiA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgICBpID0gLTEsCiAgICAgICAgICB2YWx1ZSwKICAgICAgICAgIHN1bSA9IDA7CgogICAgICBpZiAodmFsdWVvZiA9PSBudWxsKSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICh2YWx1ZSA9ICt2YWx1ZXNbaV0pIHN1bSArPSB2YWx1ZTsgLy8gTm90ZTogemVybyBhbmQgbnVsbCBhcmUgZXF1aXZhbGVudC4KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVsc2UgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAodmFsdWUgPSArdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpIHN1bSArPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBzdW07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNwb3NlJDEobWF0cml4KSB7CiAgICAgIGlmICghKG4gPSBtYXRyaXgubGVuZ3RoKSkgcmV0dXJuIFtdOwogICAgICBmb3IgKHZhciBpID0gLTEsIG0gPSBtaW4kMihtYXRyaXgsIGxlbmd0aCQzKSwgdHJhbnNwb3NlID0gbmV3IEFycmF5KG0pOyArK2kgPCBtOykgewogICAgICAgIGZvciAodmFyIGogPSAtMSwgbiwgcm93ID0gdHJhbnNwb3NlW2ldID0gbmV3IEFycmF5KG4pOyArK2ogPCBuOykgewogICAgICAgICAgcm93W2pdID0gbWF0cml4W2pdW2ldOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJhbnNwb3NlOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlbmd0aCQzKGQpIHsKICAgICAgcmV0dXJuIGQubGVuZ3RoOwogICAgfQoKICAgIGZ1bmN0aW9uIHppcCQxKCkgewogICAgICByZXR1cm4gdHJhbnNwb3NlJDEoYXJndW1lbnRzKTsKICAgIH0KCiAgICB2YXIgc2xpY2UkOCA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCiAgICBmdW5jdGlvbiBpZGVudGl0eSRiKHgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgdmFyIHRvcCQxID0gMSwKICAgICAgICByaWdodCQxID0gMiwKICAgICAgICBib3R0b20kMSA9IDMsCiAgICAgICAgbGVmdCQxID0gNCwKICAgICAgICBlcHNpbG9uJDUgPSAxZS02OwoKICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZVgkMSh4KSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyAoeCArIDAuNSkgKyAiLDApIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVZJDEoeSkgewogICAgICByZXR1cm4gInRyYW5zbGF0ZSgwLCIgKyAoeSArIDAuNSkgKyAiKSI7CiAgICB9CgogICAgZnVuY3Rpb24gbnVtYmVyJDUoc2NhbGUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQpIHsKICAgICAgICByZXR1cm4gK3NjYWxlKGQpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRlciQyKHNjYWxlKSB7CiAgICAgIHZhciBvZmZzZXQgPSBNYXRoLm1heCgwLCBzY2FsZS5iYW5kd2lkdGgoKSAtIDEpIC8gMjsgLy8gQWRqdXN0IGZvciAwLjVweCBvZmZzZXQuCiAgICAgIGlmIChzY2FsZS5yb3VuZCgpKSBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuICtzY2FsZShkKSArIG9mZnNldDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbnRlcmluZyQxKCkgewogICAgICByZXR1cm4gIXRoaXMuX19heGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGF4aXMkMShvcmllbnQsIHNjYWxlKSB7CiAgICAgIHZhciB0aWNrQXJndW1lbnRzID0gW10sCiAgICAgICAgICB0aWNrVmFsdWVzID0gbnVsbCwKICAgICAgICAgIHRpY2tGb3JtYXQgPSBudWxsLAogICAgICAgICAgdGlja1NpemVJbm5lciA9IDYsCiAgICAgICAgICB0aWNrU2l6ZU91dGVyID0gNiwKICAgICAgICAgIHRpY2tQYWRkaW5nID0gMywKICAgICAgICAgIGsgPSBvcmllbnQgPT09IHRvcCQxIHx8IG9yaWVudCA9PT0gbGVmdCQxID8gLTEgOiAxLAogICAgICAgICAgeCA9IG9yaWVudCA9PT0gbGVmdCQxIHx8IG9yaWVudCA9PT0gcmlnaHQkMSA/ICJ4IiA6ICJ5IiwKICAgICAgICAgIHRyYW5zZm9ybSA9IG9yaWVudCA9PT0gdG9wJDEgfHwgb3JpZW50ID09PSBib3R0b20kMSA/IHRyYW5zbGF0ZVgkMSA6IHRyYW5zbGF0ZVkkMTsKCiAgICAgIGZ1bmN0aW9uIGF4aXMoY29udGV4dCkgewogICAgICAgIHZhciB2YWx1ZXMgPSB0aWNrVmFsdWVzID09IG51bGwgPyAoc2NhbGUudGlja3MgPyBzY2FsZS50aWNrcy5hcHBseShzY2FsZSwgdGlja0FyZ3VtZW50cykgOiBzY2FsZS5kb21haW4oKSkgOiB0aWNrVmFsdWVzLAogICAgICAgICAgICBmb3JtYXQgPSB0aWNrRm9ybWF0ID09IG51bGwgPyAoc2NhbGUudGlja0Zvcm1hdCA/IHNjYWxlLnRpY2tGb3JtYXQuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHMpIDogaWRlbnRpdHkkYikgOiB0aWNrRm9ybWF0LAogICAgICAgICAgICBzcGFjaW5nID0gTWF0aC5tYXgodGlja1NpemVJbm5lciwgMCkgKyB0aWNrUGFkZGluZywKICAgICAgICAgICAgcmFuZ2UgPSBzY2FsZS5yYW5nZSgpLAogICAgICAgICAgICByYW5nZTAgPSArcmFuZ2VbMF0gKyAwLjUsCiAgICAgICAgICAgIHJhbmdlMSA9ICtyYW5nZVtyYW5nZS5sZW5ndGggLSAxXSArIDAuNSwKICAgICAgICAgICAgcG9zaXRpb24gPSAoc2NhbGUuYmFuZHdpZHRoID8gY2VudGVyJDIgOiBudW1iZXIkNSkoc2NhbGUuY29weSgpKSwKICAgICAgICAgICAgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCwKICAgICAgICAgICAgcGF0aCA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSksCiAgICAgICAgICAgIHRpY2sgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCIudGljayIpLmRhdGEodmFsdWVzLCBzY2FsZSkub3JkZXIoKSwKICAgICAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKSwKICAgICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgInRpY2siKSwKICAgICAgICAgICAgbGluZSA9IHRpY2suc2VsZWN0KCJsaW5lIiksCiAgICAgICAgICAgIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpOwoKICAgICAgICBwYXRoID0gcGF0aC5tZXJnZShwYXRoLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwgIi50aWNrIikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpKTsKCiAgICAgICAgdGljayA9IHRpY2subWVyZ2UodGlja0VudGVyKTsKCiAgICAgICAgbGluZSA9IGxpbmUubWVyZ2UodGlja0VudGVyLmFwcGVuZCgibGluZSIpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiIzAwMCIpCiAgICAgICAgICAgIC5hdHRyKHggKyAiMiIsIGsgKiB0aWNrU2l6ZUlubmVyKSk7CgogICAgICAgIHRleHQgPSB0ZXh0Lm1lcmdlKHRpY2tFbnRlci5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAuYXR0cigiZmlsbCIsICIjMDAwIikKICAgICAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpCiAgICAgICAgICAgIC5hdHRyKCJkeSIsIG9yaWVudCA9PT0gdG9wJDEgPyAiMGVtIiA6IG9yaWVudCA9PT0gYm90dG9tJDEgPyAiMC43MWVtIiA6ICIwLjMyZW0iKSk7CgogICAgICAgIGlmIChjb250ZXh0ICE9PSBzZWxlY3Rpb24pIHsKICAgICAgICAgIHBhdGggPSBwYXRoLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICB0aWNrID0gdGljay50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgICAgbGluZSA9IGxpbmUudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIHRleHQgPSB0ZXh0LnRyYW5zaXRpb24oY29udGV4dCk7CgogICAgICAgICAgdGlja0V4aXQgPSB0aWNrRXhpdC50cmFuc2l0aW9uKGNvbnRleHQpCiAgICAgICAgICAgICAgLmF0dHIoIm9wYWNpdHkiLCBlcHNpbG9uJDUpCiAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGlzRmluaXRlKGQgPSBwb3NpdGlvbihkKSkgPyB0cmFuc2Zvcm0oZCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIik7IH0pOwoKICAgICAgICAgIHRpY2tFbnRlcgogICAgICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbiQ1KQogICAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHZhciBwID0gdGhpcy5wYXJlbnROb2RlLl9fYXhpczsgcmV0dXJuIHRyYW5zZm9ybShwICYmIGlzRmluaXRlKHAgPSBwKGQpKSA/IHAgOiBwb3NpdGlvbihkKSk7IH0pOwogICAgICAgIH0KCiAgICAgICAgdGlja0V4aXQucmVtb3ZlKCk7CgogICAgICAgIHBhdGgKICAgICAgICAgICAgLmF0dHIoImQiLCBvcmllbnQgPT09IGxlZnQkMSB8fCBvcmllbnQgPT0gcmlnaHQkMQogICAgICAgICAgICAgICAgPyAiTSIgKyBrICogdGlja1NpemVPdXRlciArICIsIiArIHJhbmdlMCArICJIMC41ViIgKyByYW5nZTEgKyAiSCIgKyBrICogdGlja1NpemVPdXRlcgogICAgICAgICAgICAgICAgOiAiTSIgKyByYW5nZTAgKyAiLCIgKyBrICogdGlja1NpemVPdXRlciArICJWMC41SCIgKyByYW5nZTEgKyAiViIgKyBrICogdGlja1NpemVPdXRlcik7CgogICAgICAgIHRpY2sKICAgICAgICAgICAgLmF0dHIoIm9wYWNpdHkiLCAxKQogICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gdHJhbnNmb3JtKHBvc2l0aW9uKGQpKTsgfSk7CgogICAgICAgIGxpbmUKICAgICAgICAgICAgLmF0dHIoeCArICIyIiwgayAqIHRpY2tTaXplSW5uZXIpOwoKICAgICAgICB0ZXh0CiAgICAgICAgICAgIC5hdHRyKHgsIGsgKiBzcGFjaW5nKQogICAgICAgICAgICAudGV4dChmb3JtYXQpOwoKICAgICAgICBzZWxlY3Rpb24uZmlsdGVyKGVudGVyaW5nJDEpCiAgICAgICAgICAgIC5hdHRyKCJmaWxsIiwgIm5vbmUiKQogICAgICAgICAgICAuYXR0cigiZm9udC1zaXplIiwgMTApCiAgICAgICAgICAgIC5hdHRyKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgb3JpZW50ID09PSByaWdodCQxID8gInN0YXJ0IiA6IG9yaWVudCA9PT0gbGVmdCQxID8gImVuZCIgOiAibWlkZGxlIik7CgogICAgICAgIHNlbGVjdGlvbgogICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsgdGhpcy5fX2F4aXMgPSBwb3NpdGlvbjsgfSk7CiAgICAgIH0KCiAgICAgIGF4aXMuc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUgPSBfLCBheGlzKSA6IHNjYWxlOwogICAgICB9OwoKICAgICAgYXhpcy50aWNrcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aWNrQXJndW1lbnRzID0gc2xpY2UkOC5jYWxsKGFyZ3VtZW50cyksIGF4aXM7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tBcmd1bWVudHMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja0FyZ3VtZW50cyA9IF8gPT0gbnVsbCA/IFtdIDogc2xpY2UkOC5jYWxsKF8pLCBheGlzKSA6IHRpY2tBcmd1bWVudHMuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1ZhbHVlcyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrVmFsdWVzID0gXyA9PSBudWxsID8gbnVsbCA6IHNsaWNlJDguY2FsbChfKSwgYXhpcykgOiB0aWNrVmFsdWVzICYmIHRpY2tWYWx1ZXMuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja0Zvcm1hdCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrRm9ybWF0ID0gXywgYXhpcykgOiB0aWNrRm9ybWF0OwogICAgICB9OwoKICAgICAgYXhpcy50aWNrU2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gdGlja1NpemVPdXRlciA9ICtfLCBheGlzKSA6IHRpY2tTaXplSW5uZXI7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tTaXplSW5uZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1NpemVJbm5lciA9ICtfLCBheGlzKSA6IHRpY2tTaXplSW5uZXI7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tTaXplT3V0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1NpemVPdXRlciA9ICtfLCBheGlzKSA6IHRpY2tTaXplT3V0ZXI7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tQYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tQYWRkaW5nID0gK18sIGF4aXMpIDogdGlja1BhZGRpbmc7CiAgICAgIH07CgogICAgICByZXR1cm4gYXhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBheGlzVG9wJDEoc2NhbGUpIHsKICAgICAgcmV0dXJuIGF4aXMkMSh0b3AkMSwgc2NhbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGF4aXNSaWdodCQxKHNjYWxlKSB7CiAgICAgIHJldHVybiBheGlzJDEocmlnaHQkMSwgc2NhbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGF4aXNCb3R0b20kMShzY2FsZSkgewogICAgICByZXR1cm4gYXhpcyQxKGJvdHRvbSQxLCBzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXhpc0xlZnQkMShzY2FsZSkgewogICAgICByZXR1cm4gYXhpcyQxKGxlZnQkMSwgc2NhbGUpOwogICAgfQoKICAgIHZhciBub29wJDQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkge319OwoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoJDEoKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArICIiKSB8fCAodCBpbiBfKSB8fCAvW1xzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgICAgX1t0XSA9IFtdOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGlzcGF0Y2gkMShfKTsKICAgIH0KCiAgICBmdW5jdGlvbiBEaXNwYXRjaCQxKF8pIHsKICAgICAgdGhpcy5fID0gXzsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyQyKHR5cGVuYW1lcywgdHlwZXMpIHsKICAgICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTsKICAgICAgfSk7CiAgICB9CgogICAgRGlzcGF0Y2gkMS5wcm90b3R5cGUgPSBkaXNwYXRjaCQxLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IERpc3BhdGNoJDEsCiAgICAgIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgXyA9IHRoaXMuXywKICAgICAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzJDIodHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgICAgIHQsCiAgICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLgogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0JDMoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLgogICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQkNChfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7CiAgICAgICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldCQ0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87CiAgICAgICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpOwogICAgICAgIHJldHVybiBuZXcgRGlzcGF0Y2gkMShjb3B5KTsKICAgICAgfSwKICAgICAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkgewogICAgICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTsKICAgICAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0sCiAgICAgIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXQkMyh0eXBlLCBuYW1lKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICByZXR1cm4gYy52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXQkNCh0eXBlLCBuYW1lLCBjYWxsYmFjaykgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgdHlwZVtpXSA9IG5vb3AkNCwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgdmFyIHhodG1sJDEgPSAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCI7CgogICAgdmFyIG5hbWVzcGFjZXMkMSA9IHsKICAgICAgc3ZnOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLAogICAgICB4aHRtbDogeGh0bWwkMSwKICAgICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgICAgeG1sOiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKICAgICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKICAgIH07CgogICAgZnVuY3Rpb24gbmFtZXNwYWNlJDEobmFtZSkgewogICAgICB2YXIgcHJlZml4ID0gbmFtZSArPSAiIiwgaSA9IHByZWZpeC5pbmRleE9mKCI6Iik7CiAgICAgIGlmIChpID49IDAgJiYgKHByZWZpeCA9IG5hbWUuc2xpY2UoMCwgaSkpICE9PSAieG1sbnMiKSBuYW1lID0gbmFtZS5zbGljZShpICsgMSk7CiAgICAgIHJldHVybiBuYW1lc3BhY2VzJDEuaGFzT3duUHJvcGVydHkocHJlZml4KSA/IHtzcGFjZTogbmFtZXNwYWNlcyQxW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvckluaGVyaXQkMShuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZG9jdW1lbnQgPSB0aGlzLm93bmVyRG9jdW1lbnQsCiAgICAgICAgICAgIHVyaSA9IHRoaXMubmFtZXNwYWNlVVJJOwogICAgICAgIHJldHVybiB1cmkgPT09IHhodG1sJDEgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm5hbWVzcGFjZVVSSSA9PT0geGh0bWwkMQogICAgICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQkMShmdWxsbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMub3duZXJEb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdG9yJDEobmFtZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UkMShuYW1lKTsKICAgICAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbAogICAgICAgICAgPyBjcmVhdG9yRml4ZWQkMQogICAgICAgICAgOiBjcmVhdG9ySW5oZXJpdCQxKShmdWxsbmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9uZSQzKCkge30KCiAgICBmdW5jdGlvbiBzZWxlY3RvciQxKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gbm9uZSQzIDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdCQxKHNlbGVjdCkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3IkMShzZWxlY3QpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHsKICAgICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDIoc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbXB0eSQyKCkgewogICAgICByZXR1cm4gW107CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0b3JBbGwkMShzZWxlY3RvcikgewogICAgICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5JDIgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0QWxsJDEoc2VsZWN0KSB7CiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbCQxKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBzdWJncm91cHMucHVzaChzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpOwogICAgICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQyKHN1Ymdyb3VwcywgcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gbWF0Y2hlciQxKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5tYXRjaGVzKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZmlsdGVyJDEobWF0Y2gpIHsKICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyJDEobWF0Y2gpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQyKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BhcnNlJDEodXBkYXRlKSB7CiAgICAgIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VudGVyJDEoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDIodGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UkMSksIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIEVudGVyTm9kZSQxKHBhcmVudCwgZGF0dW0pIHsKICAgICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsKICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOwogICAgfQoKICAgIEVudGVyTm9kZSQxLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IEVudGVyTm9kZSQxLAogICAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LAogICAgICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwKICAgICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSwKICAgICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjb25zdGFudCRmKHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIHZhciBrZXlQcmVmaXgkMiA9ICIkIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uCgogICAgZnVuY3Rpb24gYmluZEluZGV4JDEocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkgewogICAgICB2YXIgaSA9IDAsCiAgICAgICAgICBub2RlLAogICAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CgogICAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLgogICAgICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci4KICAgICAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLgogICAgICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlJDEocGFyZW50LCBkYXRhW2ldKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgICAgIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGJpbmRLZXkkMShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsKICAgICAgdmFyIGksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwKICAgICAgICAgIGtleVZhbHVlOwoKICAgICAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuCiAgICAgIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleVByZWZpeCQyICsga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOwogICAgICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7CiAgICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAgICAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS4KICAgICAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLgogICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgICAga2V5VmFsdWUgPSBrZXlQcmVmaXgkMiArIGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSk7CiAgICAgICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0pIHsKICAgICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZSQxKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7CiAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSQxKHZhbHVlLCBrZXkpIHsKICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgIGRhdGEgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBqID0gLTE7CiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgIH0KCiAgICAgIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSQxIDogYmluZEluZGV4JDEsCiAgICAgICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cywKICAgICAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwczsKCiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQkZih2YWx1ZSk7CgogICAgICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSwKICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sCiAgICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgICBkYXRhID0gdmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpLAogICAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwKICAgICAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksCiAgICAgICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdAogICAgICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHsKICAgICAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTsKICAgICAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uJDIodXBkYXRlLCBwYXJlbnRzKTsKICAgICAgdXBkYXRlLl9lbnRlciA9IGVudGVyOwogICAgICB1cGRhdGUuX2V4aXQgPSBleGl0OwogICAgICByZXR1cm4gdXBkYXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9leGl0JDEoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDIodGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSQxKSwgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2pvaW4kMShvbmVudGVyLCBvbnVwZGF0ZSwgb25leGl0KSB7CiAgICAgIHZhciBlbnRlciA9IHRoaXMuZW50ZXIoKSwgdXBkYXRlID0gdGhpcywgZXhpdCA9IHRoaXMuZXhpdCgpOwogICAgICBlbnRlciA9IHR5cGVvZiBvbmVudGVyID09PSAiZnVuY3Rpb24iID8gb25lbnRlcihlbnRlcikgOiBlbnRlci5hcHBlbmQob25lbnRlciArICIiKTsKICAgICAgaWYgKG9udXBkYXRlICE9IG51bGwpIHVwZGF0ZSA9IG9udXBkYXRlKHVwZGF0ZSk7CiAgICAgIGlmIChvbmV4aXQgPT0gbnVsbCkgZXhpdC5yZW1vdmUoKTsgZWxzZSBvbmV4aXQoZXhpdCk7CiAgICAgIHJldHVybiBlbnRlciAmJiB1cGRhdGUgPyBlbnRlci5tZXJnZSh1cGRhdGUpLm9yZGVyKCkgOiB1cGRhdGU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX21lcmdlJDEoc2VsZWN0aW9uKSB7CgogICAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgewogICAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQyKG1lcmdlcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX29yZGVyJDEoKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBpZiAobmV4dCAmJiBub2RlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKG5leHQpIF4gNCkgbmV4dC5wYXJlbnROb2RlLmluc2VydEJlZm9yZShub2RlLCBuZXh0KTsKICAgICAgICAgICAgbmV4dCA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc29ydCQxKGNvbXBhcmUpIHsKICAgICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nJDU7CgogICAgICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOwogICAgICB9CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDIoc29ydGdyb3VwcywgdGhpcy5fcGFyZW50cykub3JkZXIoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmckNShhLCBiKSB7CiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2FsbCQxKCkgewogICAgICB2YXIgY2FsbGJhY2sgPSBhcmd1bWVudHNbMF07CiAgICAgIGFyZ3VtZW50c1swXSA9IHRoaXM7CiAgICAgIGNhbGxiYWNrLmFwcGx5KG51bGwsIGFyZ3VtZW50cyk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9ub2RlcyQxKCkgewogICAgICB2YXIgbm9kZXMgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBpID0gLTE7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUkMSgpIHsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB2YXIgbm9kZSA9IGdyb3VwW2ldOwogICAgICAgICAgaWYgKG5vZGUpIHJldHVybiBub2RlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NpemUkMSgpIHsKICAgICAgdmFyIHNpemUgPSAwOwogICAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7ICsrc2l6ZTsgfSk7CiAgICAgIHJldHVybiBzaXplOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9lbXB0eSQxKCkgewogICAgICByZXR1cm4gIXRoaXMubm9kZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoJDEoY2FsbGJhY2spIHsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IDAsIG0gPSBncm91cHMubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSAwLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSBjYWxsYmFjay5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmUkMihuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlTlMkMihmdWxsbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudCQyKG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMkMihmdWxsbmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2YWx1ZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uJDIobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TJDIoZnVsbG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHYpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9hdHRyJDEobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlJDEobmFtZSk7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbAogICAgICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKQogICAgICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMiA6IGF0dHJSZW1vdmUkMikgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJGdW5jdGlvbk5TJDIgOiBhdHRyRnVuY3Rpb24kMikKICAgICAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMkMiA6IGF0dHJDb25zdGFudCQyKSkpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRWaWV3JDEobm9kZSkgewogICAgICByZXR1cm4gKG5vZGUub3duZXJEb2N1bWVudCAmJiBub2RlLm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcpIC8vIG5vZGUgaXMgYSBOb2RlCiAgICAgICAgICB8fCAobm9kZS5kb2N1bWVudCAmJiBub2RlKSAvLyBub2RlIGlzIGEgV2luZG93CiAgICAgICAgICB8fCBub2RlLmRlZmF1bHRWaWV3OyAvLyBub2RlIGlzIGEgRG9jdW1lbnQKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVJlbW92ZSQyKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVDb25zdGFudCQyKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24kMihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogICAgICAgIGVsc2UgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2LCBwcmlvcml0eSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3N0eWxlJDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICAgID8gc3R5bGVSZW1vdmUkMiA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uJDIKICAgICAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCQyKShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKQogICAgICAgICAgOiBzdHlsZVZhbHVlJDEodGhpcy5ub2RlKCksIG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlVmFsdWUkMShub2RlLCBuYW1lKSB7CiAgICAgIHJldHVybiBub2RlLnN0eWxlLmdldFByb3BlcnR5VmFsdWUobmFtZSkKICAgICAgICAgIHx8IGRlZmF1bHRWaWV3JDEobm9kZSkuZ2V0Q29tcHV0ZWRTdHlsZShub2RlLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5UmVtb3ZlJDEobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudCQxKG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzW25hbWVdID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlGdW5jdGlvbiQxKG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgZGVsZXRlIHRoaXNbbmFtZV07CiAgICAgICAgZWxzZSB0aGlzW25hbWVdID0gdjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fcHJvcGVydHkkMShuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEKICAgICAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSQxIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBwcm9wZXJ0eUZ1bmN0aW9uJDEKICAgICAgICAgICAgICA6IHByb3BlcnR5Q29uc3RhbnQkMSkobmFtZSwgdmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0FycmF5JDEoc3RyaW5nKSB7CiAgICAgIHJldHVybiBzdHJpbmcudHJpbSgpLnNwbGl0KC9efFxzKy8pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzTGlzdCQxKG5vZGUpIHsKICAgICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0IHx8IG5ldyBDbGFzc0xpc3QkMShub2RlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBDbGFzc0xpc3QkMShub2RlKSB7CiAgICAgIHRoaXMuX25vZGUgPSBub2RlOwogICAgICB0aGlzLl9uYW1lcyA9IGNsYXNzQXJyYXkkMShub2RlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKSB8fCAiIik7CiAgICB9CgogICAgQ2xhc3NMaXN0JDEucHJvdG90eXBlID0gewogICAgICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlbW92ZTogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNsYXNzZWRBZGQkMShub2RlLCBuYW1lcykgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCQxKG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LmFkZChuYW1lc1tpXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZFJlbW92ZSQxKG5vZGUsIG5hbWVzKSB7CiAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0JDEobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGxpc3QucmVtb3ZlKG5hbWVzW2ldKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkVHJ1ZSQxKG5hbWVzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBjbGFzc2VkQWRkJDEodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZSQxKG5hbWVzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBjbGFzc2VkUmVtb3ZlJDEodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRGdW5jdGlvbiQxKG5hbWVzLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkJDEgOiBjbGFzc2VkUmVtb3ZlJDEpKHRoaXMsIG5hbWVzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xhc3NlZCQxKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkkMShuYW1lICsgIiIpOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QkMSh0aGlzLm5vZGUoKSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCFsaXN0LmNvbnRhaW5zKG5hbWVzW2ldKSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gY2xhc3NlZEZ1bmN0aW9uJDEgOiB2YWx1ZQogICAgICAgICAgPyBjbGFzc2VkVHJ1ZSQxCiAgICAgICAgICA6IGNsYXNzZWRGYWxzZSQxKShuYW1lcywgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0UmVtb3ZlJDEoKSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkMih2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRGdW5jdGlvbiQyKHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fdGV4dCQxKHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyB0ZXh0UmVtb3ZlJDEgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyB0ZXh0RnVuY3Rpb24kMgogICAgICAgICAgICAgIDogdGV4dENvbnN0YW50JDIpKHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbFJlbW92ZSQxKCkgewogICAgICB0aGlzLmlubmVySFRNTCA9ICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWxDb25zdGFudCQxKHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLmlubmVySFRNTCA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWxGdW5jdGlvbiQxKHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2h0bWwkMSh2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgID8gaHRtbFJlbW92ZSQxIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gaHRtbEZ1bmN0aW9uJDEKICAgICAgICAgICAgICA6IGh0bWxDb25zdGFudCQxKSh2YWx1ZSkpCiAgICAgICAgICA6IHRoaXMubm9kZSgpLmlubmVySFRNTDsKICAgIH0KCiAgICBmdW5jdGlvbiByYWlzZSQxKCkgewogICAgICBpZiAodGhpcy5uZXh0U2libGluZykgdGhpcy5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHRoaXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9yYWlzZSQxKCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxvd2VyJDEoKSB7CiAgICAgIGlmICh0aGlzLnByZXZpb3VzU2libGluZykgdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLCB0aGlzLnBhcmVudE5vZGUuZmlyc3RDaGlsZCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2xvd2VyJDEoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gobG93ZXIkMSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2FwcGVuZCQxKG5hbWUpIHsKICAgICAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iID8gbmFtZSA6IGNyZWF0b3IkMShuYW1lKTsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnROdWxsJDEoKSB7CiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9pbnNlcnQkMShuYW1lLCBiZWZvcmUpIHsKICAgICAgdmFyIGNyZWF0ZSA9IHR5cGVvZiBuYW1lID09PSAiZnVuY3Rpb24iID8gbmFtZSA6IGNyZWF0b3IkMShuYW1lKSwKICAgICAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsJDEgOiB0eXBlb2YgYmVmb3JlID09PSAiZnVuY3Rpb24iID8gYmVmb3JlIDogc2VsZWN0b3IkMShiZWZvcmUpOwogICAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0QmVmb3JlKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzZWxlY3QuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCBudWxsKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlJDEoKSB7CiAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fcmVtb3ZlJDEoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3ckMSgpIHsKICAgICAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUoZmFsc2UpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAkMSgpIHsKICAgICAgdmFyIGNsb25lID0gdGhpcy5jbG9uZU5vZGUodHJ1ZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lJDEoZGVlcCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAkMSA6IHNlbGVjdGlvbl9jbG9uZVNoYWxsb3ckMSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2RhdHVtJDEodmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187CiAgICB9CgogICAgdmFyIGZpbHRlckV2ZW50cyQxID0ge307CgogICAgdmFyIGV2ZW50JDEgPSBudWxsOwoKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHZhciBlbGVtZW50JDEgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICAgIGlmICghKCJvbm1vdXNlZW50ZXIiIGluIGVsZW1lbnQkMSkpIHsKICAgICAgICBmaWx0ZXJFdmVudHMkMSA9IHttb3VzZWVudGVyOiAibW91c2VvdmVyIiwgbW91c2VsZWF2ZTogIm1vdXNlb3V0In07CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIkMShsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgICAgIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyJDEobGlzdGVuZXIsIGluZGV4LCBncm91cCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsKICAgICAgICBpZiAoIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRoaXMgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpICYgOCkpKSB7CiAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY29udGV4dExpc3RlbmVyJDEobGlzdGVuZXIsIGluZGV4LCBncm91cCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQxKSB7CiAgICAgICAgdmFyIGV2ZW50MCA9IGV2ZW50JDE7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuCiAgICAgICAgZXZlbnQkMSA9IGV2ZW50MTsKICAgICAgICB0cnkgewogICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCB0aGlzLl9fZGF0YV9fLCBpbmRleCwgZ3JvdXApOwogICAgICAgIH0gZmluYWxseSB7CiAgICAgICAgICBldmVudCQxID0gZXZlbnQwOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyQzKHR5cGVuYW1lcykgewogICAgICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCkgewogICAgICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uUmVtb3ZlJDEodHlwZW5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvbiA9IHRoaXMuX19vbjsKICAgICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvblsrK2ldID0gbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsKICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb25BZGQkMSh0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICAgICAgdmFyIHdyYXAgPSBmaWx0ZXJFdmVudHMkMS5oYXNPd25Qcm9wZXJ0eSh0eXBlbmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciQxIDogY29udGV4dExpc3RlbmVyJDE7CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBpLCBncm91cCkgewogICAgICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7CiAgICAgICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5jYXB0dXJlID0gY2FwdHVyZSk7CiAgICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpOwogICAgICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIGNhcHR1cmU6IGNhcHR1cmV9OwogICAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTsKICAgICAgICBlbHNlIG9uLnB1c2gobyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX29uJDEodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7CiAgICAgIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyQzKHR5cGVuYW1lICsgIiIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247CiAgICAgICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG8udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBvbiA9IHZhbHVlID8gb25BZGQkMSA6IG9uUmVtb3ZlJDE7CiAgICAgIGlmIChjYXB0dXJlID09IG51bGwpIGNhcHR1cmUgPSBmYWxzZTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gY3VzdG9tRXZlbnQkMShldmVudDEsIGxpc3RlbmVyLCB0aGF0LCBhcmdzKSB7CiAgICAgIHZhciBldmVudDAgPSBldmVudCQxOwogICAgICBldmVudDEuc291cmNlRXZlbnQgPSBldmVudCQxOwogICAgICBldmVudCQxID0gZXZlbnQxOwogICAgICB0cnkgewogICAgICAgIHJldHVybiBsaXN0ZW5lci5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBldmVudCQxID0gZXZlbnQwOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCQxKG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXckMShub2RlKSwKICAgICAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50OwoKICAgICAgaWYgKHR5cGVvZiBldmVudCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7CiAgICAgICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7CiAgICAgICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgfQoKICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50JDEodHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCQxKHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbiQxKHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQkMSh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoJDEodHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gZGlzcGF0Y2hGdW5jdGlvbiQxCiAgICAgICAgICA6IGRpc3BhdGNoQ29uc3RhbnQkMSkodHlwZSwgcGFyYW1zKSk7CiAgICB9CgogICAgdmFyIHJvb3QkMyA9IFtudWxsXTsKCiAgICBmdW5jdGlvbiBTZWxlY3Rpb24kMihncm91cHMsIHBhcmVudHMpIHsKICAgICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb24kMSgpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290JDMpOwogICAgfQoKICAgIFNlbGVjdGlvbiQyLnByb3RvdHlwZSA9IHNlbGVjdGlvbiQxLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFNlbGVjdGlvbiQyLAogICAgICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QkMSwKICAgICAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsJDEsCiAgICAgIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlciQxLAogICAgICBkYXRhOiBzZWxlY3Rpb25fZGF0YSQxLAogICAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyJDEsCiAgICAgIGV4aXQ6IHNlbGVjdGlvbl9leGl0JDEsCiAgICAgIGpvaW46IHNlbGVjdGlvbl9qb2luJDEsCiAgICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UkMSwKICAgICAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlciQxLAogICAgICBzb3J0OiBzZWxlY3Rpb25fc29ydCQxLAogICAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCQxLAogICAgICBub2Rlczogc2VsZWN0aW9uX25vZGVzJDEsCiAgICAgIG5vZGU6IHNlbGVjdGlvbl9ub2RlJDEsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9zaXplJDEsCiAgICAgIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHkkMSwKICAgICAgZWFjaDogc2VsZWN0aW9uX2VhY2gkMSwKICAgICAgYXR0cjogc2VsZWN0aW9uX2F0dHIkMSwKICAgICAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSQxLAogICAgICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5JDEsCiAgICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkJDEsCiAgICAgIHRleHQ6IHNlbGVjdGlvbl90ZXh0JDEsCiAgICAgIGh0bWw6IHNlbGVjdGlvbl9odG1sJDEsCiAgICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UkMSwKICAgICAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlciQxLAogICAgICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQkMSwKICAgICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0JDEsCiAgICAgIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSQxLAogICAgICBjbG9uZTogc2VsZWN0aW9uX2Nsb25lJDEsCiAgICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0kMSwKICAgICAgb246IHNlbGVjdGlvbl9vbiQxLAogICAgICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoJDEKICAgIH07CgogICAgZnVuY3Rpb24gc2VsZWN0JDEoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgICAgID8gbmV3IFNlbGVjdGlvbiQyKFtbZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3RvcildXSwgW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF0pCiAgICAgICAgICA6IG5ldyBTZWxlY3Rpb24kMihbW3NlbGVjdG9yXV0sIHJvb3QkMyk7CiAgICB9CgogICAgZnVuY3Rpb24gc291cmNlRXZlbnQkMSgpIHsKICAgICAgdmFyIGN1cnJlbnQgPSBldmVudCQxLCBzb3VyY2U7CiAgICAgIHdoaWxlIChzb3VyY2UgPSBjdXJyZW50LnNvdXJjZUV2ZW50KSBjdXJyZW50ID0gc291cmNlOwogICAgICByZXR1cm4gY3VycmVudDsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2ludCQ2KG5vZGUsIGV2ZW50KSB7CiAgICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlOwoKICAgICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkgewogICAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTsKICAgICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7CiAgICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTsKICAgICAgfQoKICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZSQxKG5vZGUpIHsKICAgICAgdmFyIGV2ZW50ID0gc291cmNlRXZlbnQkMSgpOwogICAgICBpZiAoZXZlbnQuY2hhbmdlZFRvdWNoZXMpIGV2ZW50ID0gZXZlbnQuY2hhbmdlZFRvdWNoZXNbMF07CiAgICAgIHJldHVybiBwb2ludCQ2KG5vZGUsIGV2ZW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2V2ZW50JDMoKSB7CiAgICAgIGV2ZW50JDEucHJldmVudERlZmF1bHQoKTsKICAgICAgZXZlbnQkMS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkcmFnRGlzYWJsZSQxKHZpZXcpIHsKICAgICAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCQxKHZpZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG5vZXZlbnQkMywgdHJ1ZSk7CiAgICAgIGlmICgib25zZWxlY3RzdGFydCIgaW4gcm9vdCkgewogICAgICAgIHNlbGVjdGlvbi5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG5vZXZlbnQkMywgdHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0OwogICAgICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9ICJub25lIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHllc2RyYWckMSh2aWV3LCBub2NsaWNrKSB7CiAgICAgIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3QkMSh2aWV3KS5vbigiZHJhZ3N0YXJ0LmRyYWciLCBudWxsKTsKICAgICAgaWYgKG5vY2xpY2spIHsKICAgICAgICBzZWxlY3Rpb24ub24oImNsaWNrLmRyYWciLCBub2V2ZW50JDMsIHRydWUpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG51bGwpOyB9LCAwKTsKICAgICAgfQogICAgICBpZiAoIm9uc2VsZWN0c3RhcnQiIGluIHJvb3QpIHsKICAgICAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0YXJ0LmRyYWciLCBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7CiAgICAgICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmluZSQxKGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7CiAgICAgIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dGVuZCQxKHBhcmVudCwgZGVmaW5pdGlvbikgewogICAgICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTsKICAgICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogICAgICByZXR1cm4gcHJvdG90eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIENvbG9yJDEoKSB7fQoKICAgIHZhciBkYXJrZXIkMSA9IDAuNzsKICAgIHZhciBicmlnaHRlciQxID0gMSAvIGRhcmtlciQxOwoKICAgIHZhciByZUkkMSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIiwKICAgICAgICByZU4kMSA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLAogICAgICAgIHJlUCQxID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLAogICAgICAgIHJlSGV4JDEgPSAvXiMoWzAtOWEtZl17Myw4fSkkLywKICAgICAgICByZVJnYkludGVnZXIkMSA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlSSQxLCByZUkkMSwgcmVJJDFdICsgIlxcKSQiKSwKICAgICAgICByZVJnYlBlcmNlbnQkMSA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlUCQxLCByZVAkMSwgcmVQJDFdICsgIlxcKSQiKSwKICAgICAgICByZVJnYmFJbnRlZ2VyJDEgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVJJDEsIHJlSSQxLCByZUkkMSwgcmVOJDFdICsgIlxcKSQiKSwKICAgICAgICByZVJnYmFQZXJjZW50JDEgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVQJDEsIHJlUCQxLCByZVAkMSwgcmVOJDFdICsgIlxcKSQiKSwKICAgICAgICByZUhzbFBlcmNlbnQkMSA9IG5ldyBSZWdFeHAoIl5oc2xcXCgiICsgW3JlTiQxLCByZVAkMSwgcmVQJDFdICsgIlxcKSQiKSwKICAgICAgICByZUhzbGFQZXJjZW50JDEgPSBuZXcgUmVnRXhwKCJeaHNsYVxcKCIgKyBbcmVOJDEsIHJlUCQxLCByZVAkMSwgcmVOJDFdICsgIlxcKSQiKTsKCiAgICB2YXIgbmFtZWQkMSA9IHsKICAgICAgYWxpY2VibHVlOiAweGYwZjhmZiwKICAgICAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNywKICAgICAgYXF1YTogMHgwMGZmZmYsCiAgICAgIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LAogICAgICBhenVyZTogMHhmMGZmZmYsCiAgICAgIGJlaWdlOiAweGY1ZjVkYywKICAgICAgYmlzcXVlOiAweGZmZTRjNCwKICAgICAgYmxhY2s6IDB4MDAwMDAwLAogICAgICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsCiAgICAgIGJsdWU6IDB4MDAwMGZmLAogICAgICBibHVldmlvbGV0OiAweDhhMmJlMiwKICAgICAgYnJvd246IDB4YTUyYTJhLAogICAgICBidXJseXdvb2Q6IDB4ZGViODg3LAogICAgICBjYWRldGJsdWU6IDB4NWY5ZWEwLAogICAgICBjaGFydHJldXNlOiAweDdmZmYwMCwKICAgICAgY2hvY29sYXRlOiAweGQyNjkxZSwKICAgICAgY29yYWw6IDB4ZmY3ZjUwLAogICAgICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgICAgIGNvcm5zaWxrOiAweGZmZjhkYywKICAgICAgY3JpbXNvbjogMHhkYzE0M2MsCiAgICAgIGN5YW46IDB4MDBmZmZmLAogICAgICBkYXJrYmx1ZTogMHgwMDAwOGIsCiAgICAgIGRhcmtjeWFuOiAweDAwOGI4YiwKICAgICAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsCiAgICAgIGRhcmtncmF5OiAweGE5YTlhOSwKICAgICAgZGFya2dyZWVuOiAweDAwNjQwMCwKICAgICAgZGFya2dyZXk6IDB4YTlhOWE5LAogICAgICBkYXJra2hha2k6IDB4YmRiNzZiLAogICAgICBkYXJrbWFnZW50YTogMHg4YjAwOGIsCiAgICAgIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICAgICAgZGFya29yYW5nZTogMHhmZjhjMDAsCiAgICAgIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLAogICAgICBkYXJrcmVkOiAweDhiMDAwMCwKICAgICAgZGFya3NhbG1vbjogMHhlOTk2N2EsCiAgICAgIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsCiAgICAgIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLAogICAgICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZiwKICAgICAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsCiAgICAgIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogICAgICBkYXJrdmlvbGV0OiAweDk0MDBkMywKICAgICAgZGVlcHBpbms6IDB4ZmYxNDkzLAogICAgICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgICAgIGRpbWdyYXk6IDB4Njk2OTY5LAogICAgICBkaW1ncmV5OiAweDY5Njk2OSwKICAgICAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsCiAgICAgIGZpcmVicmljazogMHhiMjIyMjIsCiAgICAgIGZsb3JhbHdoaXRlOiAweGZmZmFmMCwKICAgICAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLAogICAgICBmdWNoc2lhOiAweGZmMDBmZiwKICAgICAgZ2FpbnNib3JvOiAweGRjZGNkYywKICAgICAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgICAgIGdvbGQ6IDB4ZmZkNzAwLAogICAgICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLAogICAgICBncmF5OiAweDgwODA4MCwKICAgICAgZ3JlZW46IDB4MDA4MDAwLAogICAgICBncmVlbnllbGxvdzogMHhhZGZmMmYsCiAgICAgIGdyZXk6IDB4ODA4MDgwLAogICAgICBob25leWRldzogMHhmMGZmZjAsCiAgICAgIGhvdHBpbms6IDB4ZmY2OWI0LAogICAgICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogICAgICBpbmRpZ286IDB4NGIwMDgyLAogICAgICBpdm9yeTogMHhmZmZmZjAsCiAgICAgIGtoYWtpOiAweGYwZTY4YywKICAgICAgbGF2ZW5kZXI6IDB4ZTZlNmZhLAogICAgICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSwKICAgICAgbGF3bmdyZWVuOiAweDdjZmMwMCwKICAgICAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCwKICAgICAgbGlnaHRibHVlOiAweGFkZDhlNiwKICAgICAgbGlnaHRjb3JhbDogMHhmMDgwODAsCiAgICAgIGxpZ2h0Y3lhbjogMHhlMGZmZmYsCiAgICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMiwKICAgICAgbGlnaHRncmF5OiAweGQzZDNkMywKICAgICAgbGlnaHRncmVlbjogMHg5MGVlOTAsCiAgICAgIGxpZ2h0Z3JleTogMHhkM2QzZDMsCiAgICAgIGxpZ2h0cGluazogMHhmZmI2YzEsCiAgICAgIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSwKICAgICAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsCiAgICAgIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgICAgIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSwKICAgICAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LAogICAgICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgICAgIGxpZ2h0eWVsbG93OiAweGZmZmZlMCwKICAgICAgbGltZTogMHgwMGZmMDAsCiAgICAgIGxpbWVncmVlbjogMHgzMmNkMzIsCiAgICAgIGxpbmVuOiAweGZhZjBlNiwKICAgICAgbWFnZW50YTogMHhmZjAwZmYsCiAgICAgIG1hcm9vbjogMHg4MDAwMDAsCiAgICAgIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLAogICAgICBtZWRpdW1ibHVlOiAweDAwMDBjZCwKICAgICAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICAgICAgbWVkaXVtcHVycGxlOiAweDkzNzBkYiwKICAgICAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLAogICAgICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogICAgICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsCiAgICAgIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsCiAgICAgIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgICAgIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsCiAgICAgIG1pbnRjcmVhbTogMHhmNWZmZmEsCiAgICAgIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgICAgIG1vY2Nhc2luOiAweGZmZTRiNSwKICAgICAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLAogICAgICBuYXZ5OiAweDAwMDA4MCwKICAgICAgb2xkbGFjZTogMHhmZGY1ZTYsCiAgICAgIG9saXZlOiAweDgwODAwMCwKICAgICAgb2xpdmVkcmFiOiAweDZiOGUyMywKICAgICAgb3JhbmdlOiAweGZmYTUwMCwKICAgICAgb3JhbmdlcmVkOiAweGZmNDUwMCwKICAgICAgb3JjaGlkOiAweGRhNzBkNiwKICAgICAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsCiAgICAgIHBhbGVncmVlbjogMHg5OGZiOTgsCiAgICAgIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogICAgICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MywKICAgICAgcGFwYXlhd2hpcDogMHhmZmVmZDUsCiAgICAgIHBlYWNocHVmZjogMHhmZmRhYjksCiAgICAgIHBlcnU6IDB4Y2Q4NTNmLAogICAgICBwaW5rOiAweGZmYzBjYiwKICAgICAgcGx1bTogMHhkZGEwZGQsCiAgICAgIHBvd2RlcmJsdWU6IDB4YjBlMGU2LAogICAgICBwdXJwbGU6IDB4ODAwMDgwLAogICAgICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICAgICAgcmVkOiAweGZmMDAwMCwKICAgICAgcm9zeWJyb3duOiAweGJjOGY4ZiwKICAgICAgcm95YWxibHVlOiAweDQxNjllMSwKICAgICAgc2FkZGxlYnJvd246IDB4OGI0NTEzLAogICAgICBzYWxtb246IDB4ZmE4MDcyLAogICAgICBzYW5keWJyb3duOiAweGY0YTQ2MCwKICAgICAgc2VhZ3JlZW46IDB4MmU4YjU3LAogICAgICBzZWFzaGVsbDogMHhmZmY1ZWUsCiAgICAgIHNpZW5uYTogMHhhMDUyMmQsCiAgICAgIHNpbHZlcjogMHhjMGMwYzAsCiAgICAgIHNreWJsdWU6IDB4ODdjZWViLAogICAgICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogICAgICBzbGF0ZWdyYXk6IDB4NzA4MDkwLAogICAgICBzbGF0ZWdyZXk6IDB4NzA4MDkwLAogICAgICBzbm93OiAweGZmZmFmYSwKICAgICAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLAogICAgICBzdGVlbGJsdWU6IDB4NDY4MmI0LAogICAgICB0YW46IDB4ZDJiNDhjLAogICAgICB0ZWFsOiAweDAwODA4MCwKICAgICAgdGhpc3RsZTogMHhkOGJmZDgsCiAgICAgIHRvbWF0bzogMHhmZjYzNDcsCiAgICAgIHR1cnF1b2lzZTogMHg0MGUwZDAsCiAgICAgIHZpb2xldDogMHhlZTgyZWUsCiAgICAgIHdoZWF0OiAweGY1ZGViMywKICAgICAgd2hpdGU6IDB4ZmZmZmZmLAogICAgICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSwKICAgICAgeWVsbG93OiAweGZmZmYwMCwKICAgICAgeWVsbG93Z3JlZW46IDB4OWFjZDMyCiAgICB9OwoKICAgIGRlZmluZSQxKENvbG9yJDEsIGNvbG9yJDEsIHsKICAgICAgY29weTogZnVuY3Rpb24oY2hhbm5lbHMpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTsKICAgICAgfSwKICAgICAgaGV4OiBjb2xvcl9mb3JtYXRIZXgkMSwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICAgICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgkMSwKICAgICAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wkMSwKICAgICAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IkMSwKICAgICAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYiQxCiAgICB9KTsKCiAgICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgkMSgpIHsKICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsJDEoKSB7CiAgICAgIHJldHVybiBoc2xDb252ZXJ0JDEodGhpcykuZm9ybWF0SHNsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiJDEoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yJDEoZm9ybWF0KSB7CiAgICAgIHZhciBtLCBsOwogICAgICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gKG0gPSByZUhleCQxLmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibiQxKG0pIC8vICNmZjAwMDAKICAgICAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IkMSgobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwCiAgICAgICAgICA6IGwgPT09IDggPyByZ2JhJDEobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwCiAgICAgICAgICA6IGwgPT09IDQgPyByZ2JhJDEoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMAogICAgICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleAogICAgICAgICAgOiAobSA9IHJlUmdiSW50ZWdlciQxLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiJDEobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkKICAgICAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQkMS5leGVjKGZvcm1hdCkpID8gbmV3IFJnYiQxKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpCiAgICAgICAgICA6IChtID0gcmVSZ2JhSW50ZWdlciQxLmV4ZWMoZm9ybWF0KSkgPyByZ2JhJDEobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpCiAgICAgICAgICA6IChtID0gcmVSZ2JhUGVyY2VudCQxLmV4ZWMoZm9ybWF0KSkgPyByZ2JhJDEobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkKICAgICAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQkMS5leGVjKGZvcm1hdCkpID8gaHNsYSQxKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKQogICAgICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQkMS5leGVjKGZvcm1hdCkpID8gaHNsYSQxKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSkKICAgICAgICAgIDogbmFtZWQkMS5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibiQxKG5hbWVkJDFbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICAgICAgICAgIDogZm9ybWF0ID09PSAidHJhbnNwYXJlbnQiID8gbmV3IFJnYiQxKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgICAgICA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcmdibiQxKG4pIHsKICAgICAgcmV0dXJuIG5ldyBSZ2IkMShuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYmEkMShyLCBnLCBiLCBhKSB7CiAgICAgIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjsKICAgICAgcmV0dXJuIG5ldyBSZ2IkMShyLCBnLCBiLCBhKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JDb252ZXJ0JDEobykgewogICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IkMSkpIG8gPSBjb2xvciQxKG8pOwogICAgICBpZiAoIW8pIHJldHVybiBuZXcgUmdiJDE7CiAgICAgIG8gPSBvLnJnYigpOwogICAgICByZXR1cm4gbmV3IFJnYiQxKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiJDEociwgZywgYiwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQkMShyKSA6IG5ldyBSZ2IkMShyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gUmdiJDEociwgZywgYiwgb3BhY2l0eSkgewogICAgICB0aGlzLnIgPSArcjsKICAgICAgdGhpcy5nID0gK2c7CiAgICAgIHRoaXMuYiA9ICtiOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUkMShSZ2IkMSwgcmdiJDEsIGV4dGVuZCQxKENvbG9yJDEsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIkMSA6IE1hdGgucG93KGJyaWdodGVyJDEsIGspOwogICAgICAgIHJldHVybiBuZXcgUmdiJDEodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciQxIDogTWF0aC5wb3coZGFya2VyJDEsIGspOwogICAgICAgIHJldHVybiBuZXcgUmdiJDEodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9LAogICAgICBoZXg6IHJnYl9mb3JtYXRIZXgkMSwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICAgICAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4JDEsCiAgICAgIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYiQxLAogICAgICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYiQxCiAgICB9KSk7CgogICAgZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCQxKCkgewogICAgICByZXR1cm4gIiMiICsgaGV4JDEodGhpcy5yKSArIGhleCQxKHRoaXMuZykgKyBoZXgkMSh0aGlzLmIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IkMSgpIHsKICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgIHJldHVybiAoYSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCIpCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSkKICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICB9CgogICAgZnVuY3Rpb24gaGV4JDEodmFsdWUpIHsKICAgICAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTsKICAgICAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhzbGEkMShoLCBzLCBsLCBhKSB7CiAgICAgIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjsKICAgICAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47CiAgICAgIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjsKICAgICAgcmV0dXJuIG5ldyBIc2wkMShoLCBzLCBsLCBhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xDb252ZXJ0JDEobykgewogICAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCQxKSByZXR1cm4gbmV3IEhzbCQxKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvciQxKSkgbyA9IGNvbG9yJDEobyk7CiAgICAgIGlmICghbykgcmV0dXJuIG5ldyBIc2wkMTsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wkMSkgcmV0dXJuIG87CiAgICAgIG8gPSBvLnJnYigpOwogICAgICB2YXIgciA9IG8uciAvIDI1NSwKICAgICAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgICAgICBiID0gby5iIC8gMjU1LAogICAgICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksCiAgICAgICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgICAgIGggPSBOYU4sCiAgICAgICAgICBzID0gbWF4IC0gbWluLAogICAgICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgICAgaWYgKHMpIHsKICAgICAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjsKICAgICAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7CiAgICAgICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0OwogICAgICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47CiAgICAgICAgaCAqPSA2MDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEhzbCQxKGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsJDMoaCwgcywgbCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQkMShoKSA6IG5ldyBIc2wkMShoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gSHNsJDEoaCwgcywgbCwgb3BhY2l0eSkgewogICAgICB0aGlzLmggPSAraDsKICAgICAgdGhpcy5zID0gK3M7CiAgICAgIHRoaXMubCA9ICtsOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUkMShIc2wkMSwgaHNsJDMsIGV4dGVuZCQxKENvbG9yJDEsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIkMSA6IE1hdGgucG93KGJyaWdodGVyJDEsIGspOwogICAgICAgIHJldHVybiBuZXcgSHNsJDEodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIkMSA6IE1hdGgucG93KGRhcmtlciQxLCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCQxKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsCiAgICAgICAgICAgIGwgPSB0aGlzLmwsCiAgICAgICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgICAgIG0xID0gMiAqIGwgLSBtMjsKICAgICAgICByZXR1cm4gbmV3IFJnYiQxKAogICAgICAgICAgaHNsMnJnYiQxKGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksCiAgICAgICAgICBoc2wycmdiJDEoaCwgbTEsIG0yKSwKICAgICAgICAgIGhzbDJyZ2IkMShoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksCiAgICAgICAgICB0aGlzLm9wYWNpdHkKICAgICAgICApOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7CiAgICAgIH0sCiAgICAgIGZvcm1hdEhzbDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgICAgcmV0dXJuIChhID09PSAxID8gImhzbCgiIDogImhzbGEoIikKICAgICAgICAgICAgKyAodGhpcy5oIHx8IDApICsgIiwgIgogICAgICAgICAgICArICh0aGlzLnMgfHwgMCkgKiAxMDAgKyAiJSwgIgogICAgICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyAiJSIKICAgICAgICAgICAgKyAoYSA9PT0gMSA/ICIpIiA6ICIsICIgKyBhICsgIikiKTsKICAgICAgfQogICAgfSkpOwoKICAgIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICAgIGZ1bmN0aW9uIGhzbDJyZ2IkMShoLCBtMSwgbTIpIHsKICAgICAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MAogICAgICAgICAgOiBoIDwgMTgwID8gbTIKICAgICAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjAKICAgICAgICAgIDogbTEpICogMjU1OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JGcoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyJDMoYSwgZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb25lbnRpYWwkMihhLCBiLCB5KSB7CiAgICAgIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdhbW1hJDEoeSkgewogICAgICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hJDEgOiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwkMihhLCBiLCB5KSA6IGNvbnN0YW50JGcoaXNOYU4oYSkgPyBiIDogYSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbm9nYW1tYSQxKGEsIGIpIHsKICAgICAgdmFyIGQgPSBiIC0gYTsKICAgICAgcmV0dXJuIGQgPyBsaW5lYXIkMyhhLCBkKSA6IGNvbnN0YW50JGcoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9CgogICAgdmFyIGludGVycG9sYXRlUmdiJDEgPSAoZnVuY3Rpb24gcmdiR2FtbWEoeSkgewogICAgICB2YXIgY29sb3IgPSBnYW1tYSQxKHkpOwoKICAgICAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHsKICAgICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYiQxKHN0YXJ0KSkuciwgKGVuZCA9IHJnYiQxKGVuZCkpLnIpLAogICAgICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLAogICAgICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYSQxKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgICBzdGFydC5nID0gZyh0KTsKICAgICAgICAgIHN0YXJ0LmIgPSBiKHQpOwogICAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgICB9OwogICAgICB9CgogICAgICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTsKCiAgICAgIHJldHVybiByZ2I7CiAgICB9KSgxKTsKCiAgICBmdW5jdGlvbiBudW1iZXJBcnJheSQxKGEsIGIpIHsKICAgICAgaWYgKCFiKSBiID0gW107CiAgICAgIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLAogICAgICAgICAgYyA9IGIuc2xpY2UoKSwKICAgICAgICAgIGk7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaXNOdW1iZXJBcnJheSQxKHgpIHsKICAgICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJpY0FycmF5JDEoYSwgYikgewogICAgICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLAogICAgICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsCiAgICAgICAgICB4ID0gbmV3IEFycmF5KG5hKSwKICAgICAgICAgIGMgPSBuZXcgQXJyYXkobmIpLAogICAgICAgICAgaTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gaW50ZXJwb2xhdGUkMihhW2ldLCBiW2ldKTsKICAgICAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsKCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpOwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRhdGUkMihhLCBiKSB7CiAgICAgIHZhciBkID0gbmV3IERhdGU7CiAgICAgIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBkLnNldFRpbWUoYSAqICgxIC0gdCkgKyBiICogdCksIGQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVOdW1iZXIkMShhLCBiKSB7CiAgICAgIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBhICogKDEgLSB0KSArIGIgKiB0OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG9iamVjdCQyKGEsIGIpIHsKICAgICAgdmFyIGkgPSB7fSwKICAgICAgICAgIGMgPSB7fSwKICAgICAgICAgIGs7CgogICAgICBpZiAoYSA9PT0gbnVsbCB8fCB0eXBlb2YgYSAhPT0gIm9iamVjdCIpIGEgPSB7fTsKICAgICAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09ICJvYmplY3QiKSBiID0ge307CgogICAgICBmb3IgKGsgaW4gYikgewogICAgICAgIGlmIChrIGluIGEpIHsKICAgICAgICAgIGlba10gPSBpbnRlcnBvbGF0ZSQyKGFba10sIGJba10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjW2tdID0gYltrXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpOwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIHZhciByZUEkMSA9IC9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZywKICAgICAgICByZUIkMSA9IG5ldyBSZWdFeHAocmVBJDEuc291cmNlLCAiZyIpOwoKICAgIGZ1bmN0aW9uIHplcm8kMShiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbmUkMShiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGIodCkgKyAiIjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVN0cmluZyQxKGEsIGIpIHsKICAgICAgdmFyIGJpID0gcmVBJDEubGFzdEluZGV4ID0gcmVCJDEubGFzdEluZGV4ID0gMCwgLy8gc2NhbiBpbmRleCBmb3IgbmV4dCBudW1iZXIgaW4gYgogICAgICAgICAgYW0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYQogICAgICAgICAgYm0sIC8vIGN1cnJlbnQgbWF0Y2ggaW4gYgogICAgICAgICAgYnMsIC8vIHN0cmluZyBwcmVjZWRpbmcgY3VycmVudCBudW1iZXIgaW4gYiwgaWYgYW55CiAgICAgICAgICBpID0gLTEsIC8vIGluZGV4IGluIHMKICAgICAgICAgIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCgogICAgICAvLyBDb2VyY2UgaW5wdXRzIHRvIHN0cmluZ3MuCiAgICAgIGEgPSBhICsgIiIsIGIgPSBiICsgIiI7CgogICAgICAvLyBJbnRlcnBvbGF0ZSBwYWlycyBvZiBudW1iZXJzIGluIGEgJiBiLgogICAgICB3aGlsZSAoKGFtID0gcmVBJDEuZXhlYyhhKSkKICAgICAgICAgICYmIChibSA9IHJlQiQxLmV4ZWMoYikpKSB7CiAgICAgICAgaWYgKChicyA9IGJtLmluZGV4KSA+IGJpKSB7IC8vIGEgc3RyaW5nIHByZWNlZGVzIHRoZSBuZXh0IG51bWJlciBpbiBiCiAgICAgICAgICBicyA9IGIuc2xpY2UoYmksIGJzKTsKICAgICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgICAgZWxzZSBzWysraV0gPSBiczsKICAgICAgICB9CiAgICAgICAgaWYgKChhbSA9IGFtWzBdKSA9PT0gKGJtID0gYm1bMF0pKSB7IC8vIG51bWJlcnMgaW4gYSAmIGIgbWF0Y2gKICAgICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJtOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgICAgZWxzZSBzWysraV0gPSBibTsKICAgICAgICB9IGVsc2UgeyAvLyBpbnRlcnBvbGF0ZSBub24tbWF0Y2hpbmcgbnVtYmVycwogICAgICAgICAgc1srK2ldID0gbnVsbDsKICAgICAgICAgIHEucHVzaCh7aTogaSwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMShhbSwgYm0pfSk7CiAgICAgICAgfQogICAgICAgIGJpID0gcmVCJDEubGFzdEluZGV4OwogICAgICB9CgogICAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgICBpZiAoYmkgPCBiLmxlbmd0aCkgewogICAgICAgIGJzID0gYi5zbGljZShiaSk7CiAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgZWxzZSBzWysraV0gPSBiczsKICAgICAgfQoKICAgICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAgIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuCiAgICAgIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXQogICAgICAgICAgPyBvbmUkMShxWzBdLngpCiAgICAgICAgICA6IHplcm8kMShiKSkKICAgICAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICAgICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlJDIoYSwgYikgewogICAgICB2YXIgdCA9IHR5cGVvZiBiLCBjOwogICAgICByZXR1cm4gYiA9PSBudWxsIHx8IHQgPT09ICJib29sZWFuIiA/IGNvbnN0YW50JGcoYikKICAgICAgICAgIDogKHQgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIkMQogICAgICAgICAgOiB0ID09PSAic3RyaW5nIiA/ICgoYyA9IGNvbG9yJDEoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYiQxKSA6IGludGVycG9sYXRlU3RyaW5nJDEpCiAgICAgICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciQxID8gaW50ZXJwb2xhdGVSZ2IkMQogICAgICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUkMgogICAgICAgICAgOiBpc051bWJlckFycmF5JDEoYikgPyBudW1iZXJBcnJheSQxCiAgICAgICAgICA6IEFycmF5LmlzQXJyYXkoYikgPyBnZW5lcmljQXJyYXkkMQogICAgICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0JDIKICAgICAgICAgIDogaW50ZXJwb2xhdGVOdW1iZXIkMSkoYSwgYik7CiAgICB9CgogICAgdmFyIGRlZ3JlZXMkMiA9IDE4MCAvIE1hdGguUEk7CgogICAgdmFyIGlkZW50aXR5JGMgPSB7CiAgICAgIHRyYW5zbGF0ZVg6IDAsCiAgICAgIHRyYW5zbGF0ZVk6IDAsCiAgICAgIHJvdGF0ZTogMCwKICAgICAgc2tld1g6IDAsCiAgICAgIHNjYWxlWDogMSwKICAgICAgc2NhbGVZOiAxCiAgICB9OwoKICAgIGZ1bmN0aW9uIGRlY29tcG9zZSQxKGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgICAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICAgICAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYOwogICAgICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7CiAgICAgIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogICAgICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYOwogICAgICByZXR1cm4gewogICAgICAgIHRyYW5zbGF0ZVg6IGUsCiAgICAgICAgdHJhbnNsYXRlWTogZiwKICAgICAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzJDIsCiAgICAgICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzJDIsCiAgICAgICAgc2NhbGVYOiBzY2FsZVgsCiAgICAgICAgc2NhbGVZOiBzY2FsZVkKICAgICAgfTsKICAgIH0KCiAgICB2YXIgY3NzTm9kZSQxLAogICAgICAgIGNzc1Jvb3QkMSwKICAgICAgICBjc3NWaWV3JDEsCiAgICAgICAgc3ZnTm9kZSQxOwoKICAgIGZ1bmN0aW9uIHBhcnNlQ3NzJDIodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09PSAibm9uZSIpIHJldHVybiBpZGVudGl0eSRjOwogICAgICBpZiAoIWNzc05vZGUkMSkgY3NzTm9kZSQxID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksIGNzc1Jvb3QkMSA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyQxID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CiAgICAgIGNzc05vZGUkMS5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTsKICAgICAgdmFsdWUgPSBjc3NWaWV3JDEuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290JDEuYXBwZW5kQ2hpbGQoY3NzTm9kZSQxKSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7CiAgICAgIGNzc1Jvb3QkMS5yZW1vdmVDaGlsZChjc3NOb2RlJDEpOwogICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDcsIC0xKS5zcGxpdCgiLCIpOwogICAgICByZXR1cm4gZGVjb21wb3NlJDEoK3ZhbHVlWzBdLCArdmFsdWVbMV0sICt2YWx1ZVsyXSwgK3ZhbHVlWzNdLCArdmFsdWVbNF0sICt2YWx1ZVs1XSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VTdmckMSh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5JGM7CiAgICAgIGlmICghc3ZnTm9kZSQxKSBzdmdOb2RlJDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgImciKTsKICAgICAgc3ZnTm9kZSQxLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgdmFsdWUpOwogICAgICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUkMS50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5JGM7CiAgICAgIHZhbHVlID0gdmFsdWUubWF0cml4OwogICAgICByZXR1cm4gZGVjb21wb3NlJDEodmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0kMShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHsKCiAgICAgIGZ1bmN0aW9uIHBvcChzKSB7CiAgICAgICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyJDEoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMSh5YSwgeWIpfSk7CiAgICAgICAgfSBlbHNlIGlmICh4YiB8fCB5YikgewogICAgICAgICAgcy5wdXNoKCJ0cmFuc2xhdGUoIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgICAgIGlmIChhICE9PSBiKSB7CiAgICAgICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGgKICAgICAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMShhLCBiKX0pOwogICAgICAgIH0gZWxzZSBpZiAoYikgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICAgICAgaWYgKGEgIT09IGIpIHsKICAgICAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArICJza2V3WCgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlciQxKGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyJDEoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMSh5YSwgeWIpfSk7CiAgICAgICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCiAgICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7CiAgICAgICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7CiAgICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpOwogICAgICAgIGEgPSBiID0gbnVsbDsgLy8gZ2MKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvOwogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICAgIH07CiAgICAgIH07CiAgICB9CgogICAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzJDEgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybSQxKHBhcnNlQ3NzJDIsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgICB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmckMSA9IGludGVycG9sYXRlVHJhbnNmb3JtJDEocGFyc2VTdmckMSwgIiwgIiwgIikiLCAiKSIpOwoKICAgIHZhciBmcmFtZSQxID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/CiAgICAgICAgdGltZW91dCQyID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/CiAgICAgICAgaW50ZXJ2YWwkMiA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT8KICAgICAgICBwb2tlRGVsYXkkMSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICAgICAgdGFza0hlYWQkMSwKICAgICAgICB0YXNrVGFpbCQxLAogICAgICAgIGNsb2NrTGFzdCQxID0gMCwKICAgICAgICBjbG9ja05vdyQxID0gMCwKICAgICAgICBjbG9ja1NrZXckMSA9IDAsCiAgICAgICAgY2xvY2skMSA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgICAgIHNldEZyYW1lJDEgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9OwoKICAgIGZ1bmN0aW9uIG5vdyQxKCkgewogICAgICByZXR1cm4gY2xvY2tOb3ckMSB8fCAoc2V0RnJhbWUkMShjbGVhck5vdyQxKSwgY2xvY2tOb3ckMSA9IGNsb2NrJDEubm93KCkgKyBjbG9ja1NrZXckMSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJOb3ckMSgpIHsKICAgICAgY2xvY2tOb3ckMSA9IDA7CiAgICB9CgogICAgZnVuY3Rpb24gVGltZXIkMSgpIHsKICAgICAgdGhpcy5fY2FsbCA9CiAgICAgIHRoaXMuX3RpbWUgPQogICAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgIH0KCiAgICBUaW1lciQxLnByb3RvdHlwZSA9IHRpbWVyJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVGltZXIkMSwKICAgICAgcmVzdGFydDogZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgICAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdyQxKCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCQxICE9PSB0aGlzKSB7CiAgICAgICAgICBpZiAodGFza1RhaWwkMSkgdGFza1RhaWwkMS5fbmV4dCA9IHRoaXM7CiAgICAgICAgICBlbHNlIHRhc2tIZWFkJDEgPSB0aGlzOwogICAgICAgICAgdGFza1RhaWwkMSA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjazsKICAgICAgICB0aGlzLl90aW1lID0gdGltZTsKICAgICAgICBzbGVlcCQxKCk7CiAgICAgIH0sCiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgICB0aGlzLl9jYWxsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTsKICAgICAgICAgIHNsZWVwJDEoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdGltZXIkMShjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXIkMTsKICAgICAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVyRmx1c2gkMSgpIHsKICAgICAgbm93JDEoKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgKytmcmFtZSQxOyAvLyBQcmV0ZW5kIHdl4oCZdmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlbuKAmXQgYWxyZWFkeS4KICAgICAgdmFyIHQgPSB0YXNrSGVhZCQxLCBlOwogICAgICB3aGlsZSAodCkgewogICAgICAgIGlmICgoZSA9IGNsb2NrTm93JDEgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7CiAgICAgICAgdCA9IHQuX25leHQ7CiAgICAgIH0KICAgICAgLS1mcmFtZSQxOwogICAgfQoKICAgIGZ1bmN0aW9uIHdha2UkMSgpIHsKICAgICAgY2xvY2tOb3ckMSA9IChjbG9ja0xhc3QkMSA9IGNsb2NrJDEubm93KCkpICsgY2xvY2tTa2V3JDE7CiAgICAgIGZyYW1lJDEgPSB0aW1lb3V0JDIgPSAwOwogICAgICB0cnkgewogICAgICAgIHRpbWVyRmx1c2gkMSgpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGZyYW1lJDEgPSAwOwogICAgICAgIG5hcCQxKCk7CiAgICAgICAgY2xvY2tOb3ckMSA9IDA7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwb2tlJDEoKSB7CiAgICAgIHZhciBub3cgPSBjbG9jayQxLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdCQxOwogICAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkkMSkgY2xvY2tTa2V3JDEgLT0gZGVsYXksIGNsb2NrTGFzdCQxID0gbm93OwogICAgfQoKICAgIGZ1bmN0aW9uIG5hcCQxKCkgewogICAgICB2YXIgdDAsIHQxID0gdGFza0hlYWQkMSwgdDIsIHRpbWUgPSBJbmZpbml0eTsKICAgICAgd2hpbGUgKHQxKSB7CiAgICAgICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7CiAgICAgICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7CiAgICAgICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkJDEgPSB0MjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGFza1RhaWwkMSA9IHQwOwogICAgICBzbGVlcCQxKHRpbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNsZWVwJDEodGltZSkgewogICAgICBpZiAoZnJhbWUkMSkgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLgogICAgICBpZiAodGltZW91dCQyKSB0aW1lb3V0JDIgPSBjbGVhclRpbWVvdXQodGltZW91dCQyKTsKICAgICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93JDE7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LgogICAgICBpZiAoZGVsYXkgPiAyNCkgewogICAgICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQkMiA9IHNldFRpbWVvdXQod2FrZSQxLCB0aW1lIC0gY2xvY2skMS5ub3coKSAtIGNsb2NrU2tldyQxKTsKICAgICAgICBpZiAoaW50ZXJ2YWwkMikgaW50ZXJ2YWwkMiA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwkMik7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFpbnRlcnZhbCQyKSBjbG9ja0xhc3QkMSA9IGNsb2NrJDEubm93KCksIGludGVydmFsJDIgPSBzZXRJbnRlcnZhbChwb2tlJDEsIHBva2VEZWxheSQxKTsKICAgICAgICBmcmFtZSQxID0gMSwgc2V0RnJhbWUkMSh3YWtlJDEpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdGltZW91dCQzKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgICB2YXIgdCA9IG5ldyBUaW1lciQxOwogICAgICBkZWxheSA9IGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5OwogICAgICB0LnJlc3RhcnQoZnVuY3Rpb24oZWxhcHNlZCkgewogICAgICAgIHQuc3RvcCgpOwogICAgICAgIGNhbGxiYWNrKGVsYXBzZWQgKyBkZWxheSk7CiAgICAgIH0sIGRlbGF5LCB0aW1lKTsKICAgICAgcmV0dXJuIHQ7CiAgICB9CgogICAgdmFyIGVtcHR5T24kMSA9IGRpc3BhdGNoJDEoInN0YXJ0IiwgImVuZCIsICJjYW5jZWwiLCAiaW50ZXJydXB0Iik7CiAgICB2YXIgZW1wdHlUd2VlbiQxID0gW107CgogICAgdmFyIENSRUFURUQkMSA9IDA7CiAgICB2YXIgU0NIRURVTEVEJDEgPSAxOwogICAgdmFyIFNUQVJUSU5HJDEgPSAyOwogICAgdmFyIFNUQVJURUQkMSA9IDM7CiAgICB2YXIgUlVOTklORyQxID0gNDsKICAgIHZhciBFTkRJTkckMSA9IDU7CiAgICB2YXIgRU5ERUQkMSA9IDY7CgogICAgZnVuY3Rpb24gc2NoZWR1bGUkMihub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTsKICAgICAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47CiAgICAgIGNyZWF0ZSQyKG5vZGUsIGlkLCB7CiAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgICBvbjogZW1wdHlPbiQxLAogICAgICAgIHR3ZWVuOiBlbXB0eVR3ZWVuJDEsCiAgICAgICAgdGltZTogdGltaW5nLnRpbWUsCiAgICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLAogICAgICAgIGVhc2U6IHRpbWluZy5lYXNlLAogICAgICAgIHRpbWVyOiBudWxsLAogICAgICAgIHN0YXRlOiBDUkVBVEVEJDEKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdCQxKG5vZGUsIGlkKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IGdldCQ0KG5vZGUsIGlkKTsKICAgICAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCQxKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgICByZXR1cm4gc2NoZWR1bGU7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0JDUobm9kZSwgaWQpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gZ2V0JDQobm9kZSwgaWQpOwogICAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEJDEpIHRocm93IG5ldyBFcnJvcigidG9vIGxhdGU7IGFscmVhZHkgcnVubmluZyIpOwogICAgICByZXR1cm4gc2NoZWR1bGU7CiAgICB9CgogICAgZnVuY3Rpb24gZ2V0JDQobm9kZSwgaWQpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gbm9kZS5fX3RyYW5zaXRpb247CiAgICAgIGlmICghc2NoZWR1bGUgfHwgIShzY2hlZHVsZSA9IHNjaGVkdWxlW2lkXSkpIHRocm93IG5ldyBFcnJvcigidHJhbnNpdGlvbiBub3QgZm91bmQiKTsKICAgICAgcmV0dXJuIHNjaGVkdWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZSQyKG5vZGUsIGlkLCBzZWxmKSB7CiAgICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgICAgIHR3ZWVuOwoKICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgc2VsZiB0aW1lciB3aGVuIHRoZSB0cmFuc2l0aW9uIGlzIGNyZWF0ZWQuCiAgICAgIC8vIE5vdGUgdGhlIGFjdHVhbCBkZWxheSBpcyBub3Qga25vd24gdW50aWwgdGhlIGZpcnN0IGNhbGxiYWNrIQogICAgICBzY2hlZHVsZXNbaWRdID0gc2VsZjsKICAgICAgc2VsZi50aW1lciA9IHRpbWVyJDEoc2NoZWR1bGUsIDAsIHNlbGYudGltZSk7CgogICAgICBmdW5jdGlvbiBzY2hlZHVsZShlbGFwc2VkKSB7CiAgICAgICAgc2VsZi5zdGF0ZSA9IFNDSEVEVUxFRCQxOwogICAgICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKCiAgICAgICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7CiAgICAgICAgdmFyIGksIGosIG4sIG87CgogICAgICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC4KICAgICAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEJDEpIHJldHVybiBzdG9wKCk7CgogICAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICAgIG8gPSBzY2hlZHVsZXNbaV07CiAgICAgICAgICBpZiAoby5uYW1lICE9PSBzZWxmLm5hbWUpIGNvbnRpbnVlOwoKICAgICAgICAgIC8vIFdoaWxlIHRoaXMgZWxlbWVudCBhbHJlYWR5IGhhcyBhIHN0YXJ0aW5nIHRyYW5zaXRpb24gZHVyaW5nIHRoaXMgZnJhbWUsCiAgICAgICAgICAvLyBkZWZlciBzdGFydGluZyBhbiBpbnRlcnJ1cHRpbmcgdHJhbnNpdGlvbiB1bnRpbCB0aGF0IHRyYW5zaXRpb24gaGFzIGEKICAgICAgICAgIC8vIGNoYW5jZSB0byB0aWNrIChhbmQgcG9zc2libHkgZW5kKTsgc2VlIGQzL2QzLXRyYW5zaXRpb24jNTQhCiAgICAgICAgICBpZiAoby5zdGF0ZSA9PT0gU1RBUlRFRCQxKSByZXR1cm4gdGltZW91dCQzKHN0YXJ0KTsKCiAgICAgICAgICAvLyBJbnRlcnJ1cHQgdGhlIGFjdGl2ZSB0cmFuc2l0aW9uLCBpZiBhbnkuCiAgICAgICAgICBpZiAoby5zdGF0ZSA9PT0gUlVOTklORyQxKSB7CiAgICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRCQxOwogICAgICAgICAgICBvLnRpbWVyLnN0b3AoKTsKICAgICAgICAgICAgby5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBDYW5jZWwgYW55IHByZS1lbXB0ZWQgdHJhbnNpdGlvbnMuCiAgICAgICAgICBlbHNlIGlmICgraSA8IGlkKSB7CiAgICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRCQxOwogICAgICAgICAgICBvLnRpbWVyLnN0b3AoKTsKICAgICAgICAgICAgby5vbi5jYWxsKCJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBvLmluZGV4LCBvLmdyb3VwKTsKICAgICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuCiAgICAgICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayEKICAgICAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhCiAgICAgICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLgogICAgICAgIHRpbWVvdXQkMyhmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEJDEpIHsKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkckMTsKICAgICAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7CiAgICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLgogICAgICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORyQxOwogICAgICAgIHNlbGYub24uY2FsbCgic3RhcnQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkckMSkgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEJDE7CgogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgICB0d2VlblsrK2pdID0gbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HJDEsIDEpLAogICAgICAgICAgICBpID0gLTEsCiAgICAgICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICB0d2VlbltpXS5jYWxsKG5vZGUsIHQpOwogICAgICAgIH0KCiAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC4KICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HJDEpIHsKICAgICAgICAgIHNlbGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBzdG9wKCkgewogICAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRCQxOwogICAgICAgIHNlbGYudGltZXIuc3RvcCgpOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnJ1cHQkMShub2RlLCBuYW1lKSB7CiAgICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgICAgIHNjaGVkdWxlLAogICAgICAgICAgYWN0aXZlLAogICAgICAgICAgZW1wdHkgPSB0cnVlLAogICAgICAgICAgaTsKCiAgICAgIGlmICghc2NoZWR1bGVzKSByZXR1cm47CgogICAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKCiAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9CiAgICAgICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyQxICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HJDE7CiAgICAgICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRCQxOwogICAgICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTsKICAgICAgICBzY2hlZHVsZS5vbi5jYWxsKGFjdGl2ZSA/ICJpbnRlcnJ1cHQiIDogImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNjaGVkdWxlLmluZGV4LCBzY2hlZHVsZS5ncm91cCk7CiAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgfQoKICAgICAgaWYgKGVtcHR5KSBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2ludGVycnVwdCQxKG5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICBpbnRlcnJ1cHQkMSh0aGlzLCBuYW1lKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHdlZW5SZW1vdmUkMShpZCwgbmFtZSkgewogICAgICB2YXIgdHdlZW4wLCB0d2VlbjE7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQkNSh0aGlzLCBpZCksCiAgICAgICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHsKICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMCA9IHR3ZWVuOwogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgICAgIHR3ZWVuMSA9IHR3ZWVuMS5zbGljZSgpOwogICAgICAgICAgICAgIHR3ZWVuMS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHR3ZWVuRnVuY3Rpb24kMShpZCwgbmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQkNSh0aGlzLCBpZCksCiAgICAgICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHsKICAgICAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTsKICAgICAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTsKICAgICAgICB9CgogICAgICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4kMShuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIG5hbWUgKz0gIiI7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgdHdlZW4gPSBnZXQkNCh0aGlzLm5vZGUoKSwgaWQpLnR3ZWVuOwogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4ubGVuZ3RoLCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKHQgPSB0d2VlbltpXSkubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgICByZXR1cm4gdC52YWx1ZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwgPyB0d2VlblJlbW92ZSQxIDogdHdlZW5GdW5jdGlvbiQxKShpZCwgbmFtZSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0d2VlblZhbHVlJDEodHJhbnNpdGlvbiwgbmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGlkID0gdHJhbnNpdGlvbi5faWQ7CgogICAgICB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JDUodGhpcywgaWQpOwogICAgICAgIChzY2hlZHVsZS52YWx1ZSB8fCAoc2NoZWR1bGUudmFsdWUgPSB7fSkpW25hbWVdID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfSk7CgogICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgICAgIHJldHVybiBnZXQkNChub2RlLCBpZCkudmFsdWVbbmFtZV07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUkMyhhLCBiKSB7CiAgICAgIHZhciBjOwogICAgICByZXR1cm4gKHR5cGVvZiBiID09PSAibnVtYmVyIiA/IGludGVycG9sYXRlTnVtYmVyJDEKICAgICAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yJDEgPyBpbnRlcnBvbGF0ZVJnYiQxCiAgICAgICAgICA6IChjID0gY29sb3IkMShiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiJDEpCiAgICAgICAgICA6IGludGVycG9sYXRlU3RyaW5nJDEpKGEsIGIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmUkMyhuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlTlMkMyhmdWxsbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudCQzKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQzKGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIiwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQzKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTsKICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZShuYW1lKTsKICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiI7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TJDMoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwgc3RyaW5nMTsKICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyJDEobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlJDEobmFtZSksIGkgPSBmdWxsbmFtZSA9PT0gInRyYW5zZm9ybSIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyQxIDogaW50ZXJwb2xhdGUkMzsKICAgICAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyQzIDogYXR0ckZ1bmN0aW9uJDMpKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlJDEodGhpcywgImF0dHIuIiArIG5hbWUsIHZhbHVlKSkKICAgICAgICAgIDogdmFsdWUgPT0gbnVsbCA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyQzIDogYXR0clJlbW92ZSQzKShmdWxsbmFtZSkKICAgICAgICAgIDogKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckNvbnN0YW50TlMkMyA6IGF0dHJDb25zdGFudCQzKShmdWxsbmFtZSwgaSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRySW50ZXJwb2xhdGUkMShuYW1lLCBpKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgaS5jYWxsKHRoaXMsIHQpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRySW50ZXJwb2xhdGVOUyQxKGZ1bGxuYW1lLCBpKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clR3ZWVuTlMkMShmdWxsbmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIHQwLCBpMDsKICAgICAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGVOUyQxKGZ1bGxuYW1lLCBpKTsKICAgICAgICByZXR1cm4gdDA7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyVHdlZW4kMShuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgdDAsIGkwOwogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZSQxKG5hbWUsIGkpOwogICAgICAgIHJldHVybiB0MDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fYXR0clR3ZWVuJDEobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGtleSA9ICJhdHRyLiIgKyBuYW1lOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UkMShuYW1lKTsKICAgICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyQxIDogYXR0clR3ZWVuJDEpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlbGF5RnVuY3Rpb24kMShpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGluaXQkMSh0aGlzLCBpZCkuZGVsYXkgPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWxheUNvbnN0YW50JDEoaWQsIHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgaW5pdCQxKHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZGVsYXkkMSh2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBkZWxheUZ1bmN0aW9uJDEKICAgICAgICAgICAgICA6IGRlbGF5Q29uc3RhbnQkMSkoaWQsIHZhbHVlKSkKICAgICAgICAgIDogZ2V0JDQodGhpcy5ub2RlKCksIGlkKS5kZWxheTsKICAgIH0KCiAgICBmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uJDEoaWQsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBzZXQkNSh0aGlzLCBpZCkuZHVyYXRpb24gPSArdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkdXJhdGlvbkNvbnN0YW50JDEoaWQsIHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9ICt2YWx1ZSwgZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0JDUodGhpcywgaWQpLmR1cmF0aW9uID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9kdXJhdGlvbiQxKHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb24kMQogICAgICAgICAgICAgIDogZHVyYXRpb25Db25zdGFudCQxKShpZCwgdmFsdWUpKQogICAgICAgICAgOiBnZXQkNCh0aGlzLm5vZGUoKSwgaWQpLmR1cmF0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGVhc2VDb25zdGFudCQxKGlkLCB2YWx1ZSkgewogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBzZXQkNSh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZWFzZSQxKHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKGVhc2VDb25zdGFudCQxKGlkLCB2YWx1ZSkpCiAgICAgICAgICA6IGdldCQ0KHRoaXMubm9kZSgpLCBpZCkuZWFzZTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2ZpbHRlciQxKG1hdGNoKSB7CiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gbWF0Y2hlciQxKG1hdGNoKTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkgewogICAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDEoc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9tZXJnZSQxKHRyYW5zaXRpb24pIHsKICAgICAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICAgIG1lcmdlW2ldID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoOyBqIDwgbTA7ICsraikgewogICAgICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbiQxKG1lcmdlcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YXJ0JDEobmFtZSkgewogICAgICByZXR1cm4gKG5hbWUgKyAiIikudHJpbSgpLnNwbGl0KC9efFxzKy8pLmV2ZXJ5KGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICAgIGlmIChpID49IDApIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICAgIHJldHVybiAhdCB8fCB0ID09PSAic3RhcnQiOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbkZ1bmN0aW9uJDEoaWQsIG5hbWUsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQkMShuYW1lKSA/IGluaXQkMSA6IHNldCQ1OwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2l0KHRoaXMsIGlkKSwKICAgICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmIChvbiAhPT0gb24wKSAob24xID0gKG9uMCA9IG9uKS5jb3B5KCkpLm9uKG5hbWUsIGxpc3RlbmVyKTsKCiAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9vbiQxKG5hbWUsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyCiAgICAgICAgICA/IGdldCQ0KHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkKICAgICAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24kMShpZCwgbmFtZSwgbGlzdGVuZXIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVGdW5jdGlvbiQxKGlkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICAgIGZvciAodmFyIGkgaW4gdGhpcy5fX3RyYW5zaXRpb24pIGlmICgraSAhPT0gaWQpIHJldHVybjsKICAgICAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9yZW1vdmUkMSgpIHsKICAgICAgcmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLCByZW1vdmVGdW5jdGlvbiQxKHRoaXMuX2lkKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3QkMShzZWxlY3QpIHsKICAgICAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICAgICAgaWQgPSB0aGlzLl9pZDsKCiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvciQxKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgICAgICBzY2hlZHVsZSQyKHN1Ymdyb3VwW2ldLCBuYW1lLCBpZCwgaSwgc3ViZ3JvdXAsIGdldCQ0KG5vZGUsIGlkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24kMShzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3NlbGVjdEFsbCQxKHNlbGVjdCkgewogICAgICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsCiAgICAgICAgICBpZCA9IHRoaXMuX2lkOwoKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsJDEoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIGZvciAodmFyIGNoaWxkcmVuID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApLCBjaGlsZCwgaW5oZXJpdCA9IGdldCQ0KG5vZGUsIGlkKSwgayA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGsgPCBsOyArK2spIHsKICAgICAgICAgICAgICBpZiAoY2hpbGQgPSBjaGlsZHJlbltrXSkgewogICAgICAgICAgICAgICAgc2NoZWR1bGUkMihjaGlsZCwgbmFtZSwgaWQsIGssIGNoaWxkcmVuLCBpbmhlcml0KTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3ViZ3JvdXBzLnB1c2goY2hpbGRyZW4pOwogICAgICAgICAgICBwYXJlbnRzLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24kMShzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTsKICAgIH0KCiAgICB2YXIgU2VsZWN0aW9uJDMgPSBzZWxlY3Rpb24kMS5wcm90b3R5cGUuY29uc3RydWN0b3I7CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3Rpb24kMSgpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kMyh0aGlzLl9ncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlTnVsbCQxKG5hbWUsIGludGVycG9sYXRlKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlJDEodGhpcywgbmFtZSksCiAgICAgICAgICAgIHN0cmluZzEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSQxKHRoaXMsIG5hbWUpKTsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgc3RyaW5nMTAgPSBzdHJpbmcxKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVJlbW92ZSQzKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVDb25zdGFudCQzKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlJDEodGhpcywgbmFtZSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbiQzKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSQxKHRoaXMsIG5hbWUpLAogICAgICAgICAgICB2YWx1ZTEgPSB2YWx1ZSh0aGlzKSwKICAgICAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiOwogICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgc3RyaW5nMSA9IHZhbHVlMSA9ICh0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpLCBzdHlsZVZhbHVlJDEodGhpcywgbmFtZSkpOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZU1heWJlUmVtb3ZlJDEoaWQsIG5hbWUpIHsKICAgICAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9ICJzdHlsZS4iICsgbmFtZSwgZXZlbnQgPSAiZW5kLiIgKyBrZXksIHJlbW92ZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQ1KHRoaXMsIGlkKSwKICAgICAgICAgICAgb24gPSBzY2hlZHVsZS5vbiwKICAgICAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlJDMobmFtZSkpIDogdW5kZWZpbmVkOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwoKICAgICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3N0eWxlJDEobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHZhciBpID0gKG5hbWUgKz0gIiIpID09PSAidHJhbnNmb3JtIiA/IGludGVycG9sYXRlVHJhbnNmb3JtQ3NzJDEgOiBpbnRlcnBvbGF0ZSQzOwogICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXMKICAgICAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbCQxKG5hbWUsIGkpKQogICAgICAgICAgLm9uKCJlbmQuc3R5bGUuIiArIG5hbWUsIHN0eWxlUmVtb3ZlJDMobmFtZSkpCiAgICAgICAgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIgPyB0aGlzCiAgICAgICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUZ1bmN0aW9uJDMobmFtZSwgaSwgdHdlZW5WYWx1ZSQxKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUpKSkKICAgICAgICAgIC5lYWNoKHN0eWxlTWF5YmVSZW1vdmUkMSh0aGlzLl9pZCwgbmFtZSkpCiAgICAgICAgOiB0aGlzCiAgICAgICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50JDMobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBudWxsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlJDEobmFtZSwgaSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIGkuY2FsbCh0aGlzLCB0KSwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlVHdlZW4kMShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIHQsIGkwOwogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGkgIT09IGkwKSB0ID0gKGkwID0gaSkgJiYgc3R5bGVJbnRlcnBvbGF0ZSQxKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgICByZXR1cm4gdDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGVUd2VlbiQxKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICB2YXIga2V5ID0gInN0eWxlLiIgKyAobmFtZSArPSAiIik7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgc3R5bGVUd2VlbiQxKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRDb25zdGFudCQzKHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDModmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWUxID09IG51bGwgPyAiIiA6IHZhbHVlMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHQkMSh2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyB0ZXh0RnVuY3Rpb24kMyh0d2VlblZhbHVlJDEodGhpcywgInRleHQiLCB2YWx1ZSkpCiAgICAgICAgICA6IHRleHRDb25zdGFudCQzKHZhbHVlID09IG51bGwgPyAiIiA6IHZhbHVlICsgIiIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0SW50ZXJwb2xhdGUkMShpKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IGkuY2FsbCh0aGlzLCB0KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0VHdlZW4kMSh2YWx1ZSkgewogICAgICB2YXIgdDAsIGkwOwogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZSQxKGkpOwogICAgICAgIHJldHVybiB0MDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdGV4dFR3ZWVuJDEodmFsdWUpIHsKICAgICAgdmFyIGtleSA9ICJ0ZXh0IjsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAxKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCB0ZXh0VHdlZW4kMSh2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHJhbnNpdGlvbiQxKCkgewogICAgICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsCiAgICAgICAgICBpZDAgPSB0aGlzLl9pZCwKICAgICAgICAgIGlkMSA9IG5ld0lkJDEoKTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHZhciBpbmhlcml0ID0gZ2V0JDQobm9kZSwgaWQwKTsKICAgICAgICAgICAgc2NoZWR1bGUkMihub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7CiAgICAgICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sCiAgICAgICAgICAgICAgZGVsYXk6IDAsCiAgICAgICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sCiAgICAgICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDEoZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZW5kJDEoKSB7CiAgICAgIHZhciBvbjAsIG9uMSwgdGhhdCA9IHRoaXMsIGlkID0gdGhhdC5faWQsIHNpemUgPSB0aGF0LnNpemUoKTsKICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgIHZhciBjYW5jZWwgPSB7dmFsdWU6IHJlamVjdH0sCiAgICAgICAgICAgIGVuZCA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7IGlmICgtLXNpemUgPT09IDApIHJlc29sdmUoKTsgfX07CgogICAgICAgIHRoYXQuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQ1KHRoaXMsIGlkKSwKICAgICAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uOwoKICAgICAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgICBpZiAob24gIT09IG9uMCkgewogICAgICAgICAgICBvbjEgPSAob24wID0gb24pLmNvcHkoKTsKICAgICAgICAgICAgb24xLl8uY2FuY2VsLnB1c2goY2FuY2VsKTsKICAgICAgICAgICAgb24xLl8uaW50ZXJydXB0LnB1c2goY2FuY2VsKTsKICAgICAgICAgICAgb24xLl8uZW5kLnB1c2goZW5kKTsKICAgICAgICAgIH0KCiAgICAgICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CgogICAgdmFyIGlkJDEgPSAwOwoKICAgIGZ1bmN0aW9uIFRyYW5zaXRpb24kMShncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICAgIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICAgICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgICB0aGlzLl9pZCA9IGlkOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb24kMShuYW1lKSB7CiAgICAgIHJldHVybiBzZWxlY3Rpb24kMSgpLnRyYW5zaXRpb24obmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3SWQkMSgpIHsKICAgICAgcmV0dXJuICsraWQkMTsKICAgIH0KCiAgICB2YXIgc2VsZWN0aW9uX3Byb3RvdHlwZSQxID0gc2VsZWN0aW9uJDEucHJvdG90eXBlOwoKICAgIFRyYW5zaXRpb24kMS5wcm90b3R5cGUgPSB0cmFuc2l0aW9uJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbiQxLAogICAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0JDEsCiAgICAgIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwkMSwKICAgICAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlciQxLAogICAgICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSQxLAogICAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uJDEsCiAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbiQxLAogICAgICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlJDEuY2FsbCwKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUkMS5ub2RlcywKICAgICAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZSQxLm5vZGUsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUkMS5zaXplLAogICAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZSQxLmVtcHR5LAogICAgICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlJDEuZWFjaCwKICAgICAgb246IHRyYW5zaXRpb25fb24kMSwKICAgICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyJDEsCiAgICAgIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4kMSwKICAgICAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUkMSwKICAgICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuJDEsCiAgICAgIHRleHQ6IHRyYW5zaXRpb25fdGV4dCQxLAogICAgICB0ZXh0VHdlZW46IHRyYW5zaXRpb25fdGV4dFR3ZWVuJDEsCiAgICAgIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUkMSwKICAgICAgdHdlZW46IHRyYW5zaXRpb25fdHdlZW4kMSwKICAgICAgZGVsYXk6IHRyYW5zaXRpb25fZGVsYXkkMSwKICAgICAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24kMSwKICAgICAgZWFzZTogdHJhbnNpdGlvbl9lYXNlJDEsCiAgICAgIGVuZDogdHJhbnNpdGlvbl9lbmQkMQogICAgfTsKCiAgICB2YXIgZGVmYXVsdFRpbWluZyQxID0gewogICAgICB0aW1lOiBudWxsLCAvLyBTZXQgb24gdXNlLgogICAgICBkZWxheTogMCwKICAgICAgZHVyYXRpb246IDI1MCwKICAgICAgZWFzZTogY3ViaWNJbk91dAogICAgfTsKCiAgICBmdW5jdGlvbiBpbmhlcml0JDEobm9kZSwgaWQpIHsKICAgICAgdmFyIHRpbWluZzsKICAgICAgd2hpbGUgKCEodGltaW5nID0gbm9kZS5fX3RyYW5zaXRpb24pIHx8ICEodGltaW5nID0gdGltaW5nW2lkXSkpIHsKICAgICAgICBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgewogICAgICAgICAgcmV0dXJuIGRlZmF1bHRUaW1pbmckMS50aW1lID0gbm93JDEoKSwgZGVmYXVsdFRpbWluZyQxOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGltaW5nOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl90cmFuc2l0aW9uJDEobmFtZSkgewogICAgICB2YXIgaWQsCiAgICAgICAgICB0aW1pbmc7CgogICAgICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24kMSkgewogICAgICAgIGlkID0gbmFtZS5faWQsIG5hbWUgPSBuYW1lLl9uYW1lOwogICAgICB9IGVsc2UgewogICAgICAgIGlkID0gbmV3SWQkMSgpLCAodGltaW5nID0gZGVmYXVsdFRpbWluZyQxKS50aW1lID0gbm93JDEoKSwgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHNjaGVkdWxlJDIobm9kZSwgbmFtZSwgaWQsIGksIGdyb3VwLCB0aW1pbmcgfHwgaW5oZXJpdCQxKG5vZGUsIGlkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24kMShncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkKTsKICAgIH0KCiAgICBzZWxlY3Rpb24kMS5wcm90b3R5cGUuaW50ZXJydXB0ID0gc2VsZWN0aW9uX2ludGVycnVwdCQxOwogICAgc2VsZWN0aW9uJDEucHJvdG90eXBlLnRyYW5zaXRpb24gPSBzZWxlY3Rpb25fdHJhbnNpdGlvbiQxOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JGgoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gQnJ1c2hFdmVudCQxKHRhcmdldCwgdHlwZSwgc2VsZWN0aW9uKSB7CiAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uJDMoKSB7CiAgICAgIGV2ZW50JDEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ldmVudCQ0KCkgewogICAgICBldmVudCQxLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50JDEuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgdmFyIE1PREVfRFJBRyQxID0ge25hbWU6ICJkcmFnIn0sCiAgICAgICAgTU9ERV9TUEFDRSQxID0ge25hbWU6ICJzcGFjZSJ9LAogICAgICAgIE1PREVfSEFORExFJDEgPSB7bmFtZTogImhhbmRsZSJ9LAogICAgICAgIE1PREVfQ0VOVEVSJDEgPSB7bmFtZTogImNlbnRlciJ9OwoKICAgIHZhciBYJDEgPSB7CiAgICAgIG5hbWU6ICJ4IiwKICAgICAgaGFuZGxlczogWyJlIiwgInciXS5tYXAodHlwZSQxKSwKICAgICAgaW5wdXQ6IGZ1bmN0aW9uKHgsIGUpIHsgcmV0dXJuIHggJiYgW1t4WzBdLCBlWzBdWzFdXSwgW3hbMV0sIGVbMV1bMV1dXTsgfSwKICAgICAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzBdLCB4eVsxXVswXV07IH0KICAgIH07CgogICAgdmFyIFkkMSA9IHsKICAgICAgbmFtZTogInkiLAogICAgICBoYW5kbGVzOiBbIm4iLCAicyJdLm1hcCh0eXBlJDEpLAogICAgICBpbnB1dDogZnVuY3Rpb24oeSwgZSkgeyByZXR1cm4geSAmJiBbW2VbMF1bMF0sIHlbMF1dLCBbZVsxXVswXSwgeVsxXV1dOyB9LAogICAgICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMV0sIHh5WzFdWzFdXTsgfQogICAgfTsKCiAgICB2YXIgWFkkMSA9IHsKICAgICAgbmFtZTogInh5IiwKICAgICAgaGFuZGxlczogWyJuIiwgImUiLCAicyIsICJ3IiwgIm53IiwgIm5lIiwgInNlIiwgInN3Il0ubWFwKHR5cGUkMSksCiAgICAgIGlucHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHk7IH0sCiAgICAgIG91dHB1dDogZnVuY3Rpb24oeHkpIHsgcmV0dXJuIHh5OyB9CiAgICB9OwoKICAgIHZhciBjdXJzb3JzJDEgPSB7CiAgICAgIG92ZXJsYXk6ICJjcm9zc2hhaXIiLAogICAgICBzZWxlY3Rpb246ICJtb3ZlIiwKICAgICAgbjogIm5zLXJlc2l6ZSIsCiAgICAgIGU6ICJldy1yZXNpemUiLAogICAgICBzOiAibnMtcmVzaXplIiwKICAgICAgdzogImV3LXJlc2l6ZSIsCiAgICAgIG53OiAibndzZS1yZXNpemUiLAogICAgICBuZTogIm5lc3ctcmVzaXplIiwKICAgICAgc2U6ICJud3NlLXJlc2l6ZSIsCiAgICAgIHN3OiAibmVzdy1yZXNpemUiCiAgICB9OwoKICAgIHZhciBmbGlwWCQxID0gewogICAgICBlOiAidyIsCiAgICAgIHc6ICJlIiwKICAgICAgbnc6ICJuZSIsCiAgICAgIG5lOiAibnciLAogICAgICBzZTogInN3IiwKICAgICAgc3c6ICJzZSIKICAgIH07CgogICAgdmFyIGZsaXBZJDEgPSB7CiAgICAgIG46ICJzIiwKICAgICAgczogIm4iLAogICAgICBudzogInN3IiwKICAgICAgbmU6ICJzZSIsCiAgICAgIHNlOiAibmUiLAogICAgICBzdzogIm53IgogICAgfTsKCiAgICB2YXIgc2lnbnNYJDEgPSB7CiAgICAgIG92ZXJsYXk6ICsxLAogICAgICBzZWxlY3Rpb246ICsxLAogICAgICBuOiBudWxsLAogICAgICBlOiArMSwKICAgICAgczogbnVsbCwKICAgICAgdzogLTEsCiAgICAgIG53OiAtMSwKICAgICAgbmU6ICsxLAogICAgICBzZTogKzEsCiAgICAgIHN3OiAtMQogICAgfTsKCiAgICB2YXIgc2lnbnNZJDEgPSB7CiAgICAgIG92ZXJsYXk6ICsxLAogICAgICBzZWxlY3Rpb246ICsxLAogICAgICBuOiAtMSwKICAgICAgZTogbnVsbCwKICAgICAgczogKzEsCiAgICAgIHc6IG51bGwsCiAgICAgIG53OiAtMSwKICAgICAgbmU6IC0xLAogICAgICBzZTogKzEsCiAgICAgIHN3OiArMQogICAgfTsKCiAgICBmdW5jdGlvbiB0eXBlJDEodCkgewogICAgICByZXR1cm4ge3R5cGU6IHR9OwogICAgfQoKICAgIC8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgogICAgZnVuY3Rpb24gZGVmYXVsdEZpbHRlciQzKCkgewogICAgICByZXR1cm4gIWV2ZW50JDEuYnV0dG9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQkMigpIHsKICAgICAgdmFyIHN2ZyA9IHRoaXMub3duZXJTVkdFbGVtZW50IHx8IHRoaXM7CiAgICAgIHJldHVybiBbWzAsIDBdLCBbc3ZnLndpZHRoLmJhc2VWYWwudmFsdWUsIHN2Zy5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dOwogICAgfQoKICAgIC8vIExpa2UgZDMubG9jYWwsIGJ1dCB3aXRoIHRoZSBuYW1lIOKAnF9fYnJ1c2jigJ0gcmF0aGVyIHRoYW4gYXV0by1nZW5lcmF0ZWQuCiAgICBmdW5jdGlvbiBsb2NhbCQyKG5vZGUpIHsKICAgICAgd2hpbGUgKCFub2RlLl9fYnJ1c2gpIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSByZXR1cm47CiAgICAgIHJldHVybiBub2RlLl9fYnJ1c2g7CiAgICB9CgogICAgZnVuY3Rpb24gZW1wdHkkMyhleHRlbnQpIHsKICAgICAgcmV0dXJuIGV4dGVudFswXVswXSA9PT0gZXh0ZW50WzFdWzBdCiAgICAgICAgICB8fCBleHRlbnRbMF1bMV0gPT09IGV4dGVudFsxXVsxXTsKICAgIH0KCiAgICBmdW5jdGlvbiBicnVzaFNlbGVjdGlvbiQxKG5vZGUpIHsKICAgICAgdmFyIHN0YXRlID0gbm9kZS5fX2JydXNoOwogICAgICByZXR1cm4gc3RhdGUgPyBzdGF0ZS5kaW0ub3V0cHV0KHN0YXRlLnNlbGVjdGlvbikgOiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGJydXNoWCQxKCkgewogICAgICByZXR1cm4gYnJ1c2gkMyhYJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJydXNoWSQxKCkgewogICAgICByZXR1cm4gYnJ1c2gkMyhZJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJydXNoJDIoKSB7CiAgICAgIHJldHVybiBicnVzaCQzKFhZJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJydXNoJDMoZGltKSB7CiAgICAgIHZhciBleHRlbnQgPSBkZWZhdWx0RXh0ZW50JDIsCiAgICAgICAgICBmaWx0ZXIgPSBkZWZhdWx0RmlsdGVyJDMsCiAgICAgICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaCQxKGJydXNoLCAic3RhcnQiLCAiYnJ1c2giLCAiZW5kIiksCiAgICAgICAgICBoYW5kbGVTaXplID0gNiwKICAgICAgICAgIHRvdWNoZW5kaW5nOwoKICAgICAgZnVuY3Rpb24gYnJ1c2goZ3JvdXApIHsKICAgICAgICB2YXIgb3ZlcmxheSA9IGdyb3VwCiAgICAgICAgICAgIC5wcm9wZXJ0eSgiX19icnVzaCIsIGluaXRpYWxpemUpCiAgICAgICAgICAuc2VsZWN0QWxsKCIub3ZlcmxheSIpCiAgICAgICAgICAuZGF0YShbdHlwZSQxKCJvdmVybGF5IildKTsKCiAgICAgICAgb3ZlcmxheS5lbnRlcigpLmFwcGVuZCgicmVjdCIpCiAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJvdmVybGF5IikKICAgICAgICAgICAgLmF0dHIoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpCiAgICAgICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzJDEub3ZlcmxheSkKICAgICAgICAgIC5tZXJnZShvdmVybGF5KQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgZXh0ZW50ID0gbG9jYWwkMih0aGlzKS5leHRlbnQ7CiAgICAgICAgICAgICAgc2VsZWN0JDEodGhpcykKICAgICAgICAgICAgICAgICAgLmF0dHIoIngiLCBleHRlbnRbMF1bMF0pCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5IiwgZXh0ZW50WzBdWzFdKQogICAgICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0pCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0pOwogICAgICAgICAgICB9KTsKCiAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuc2VsZWN0aW9uIikKICAgICAgICAgIC5kYXRhKFt0eXBlJDEoInNlbGVjdGlvbiIpXSkKICAgICAgICAgIC5lbnRlcigpLmFwcGVuZCgicmVjdCIpCiAgICAgICAgICAgIC5hdHRyKCJjbGFzcyIsICJzZWxlY3Rpb24iKQogICAgICAgICAgICAuYXR0cigiY3Vyc29yIiwgY3Vyc29ycyQxLnNlbGVjdGlvbikKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAiIzc3NyIpCiAgICAgICAgICAgIC5hdHRyKCJmaWxsLW9wYWNpdHkiLCAwLjMpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiI2ZmZiIpCiAgICAgICAgICAgIC5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOwoKICAgICAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0pOwoKICAgICAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpOwoKICAgICAgICBoYW5kbGUuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiaGFuZGxlIGhhbmRsZS0tIiArIGQudHlwZTsgfSkKICAgICAgICAgICAgLmF0dHIoImN1cnNvciIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnMkMVtkLnR5cGVdOyB9KTsKCiAgICAgICAgZ3JvdXAKICAgICAgICAgICAgLmVhY2gocmVkcmF3KQogICAgICAgICAgICAuYXR0cigiZmlsbCIsICJub25lIikKICAgICAgICAgICAgLmF0dHIoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpCiAgICAgICAgICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKQogICAgICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCB0b3VjaHN0YXJ0LmJydXNoIiwgc3RhcnRlZCk7CiAgICAgIH0KCiAgICAgIGJydXNoLm1vdmUgPSBmdW5jdGlvbihncm91cCwgc2VsZWN0aW9uKSB7CiAgICAgICAgaWYgKGdyb3VwLnNlbGVjdGlvbikgewogICAgICAgICAgZ3JvdXAKICAgICAgICAgICAgICAub24oInN0YXJ0LmJydXNoIiwgZnVuY3Rpb24oKSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5iZWZvcmVzdGFydCgpLnN0YXJ0KCk7IH0pCiAgICAgICAgICAgICAgLm9uKCJpbnRlcnJ1cHQuYnJ1c2ggZW5kLmJydXNoIiwgZnVuY3Rpb24oKSB7IGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmQoKTsgfSkKICAgICAgICAgICAgICAudHdlZW4oImJydXNoIiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSB0aGF0Ll9fYnJ1c2gsCiAgICAgICAgICAgICAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJndW1lbnRzKSwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24wID0gc3RhdGUuc2VsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gImZ1bmN0aW9uIiA/IHNlbGVjdGlvbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc2VsZWN0aW9uLCBzdGF0ZS5leHRlbnQpLAogICAgICAgICAgICAgICAgICAgIGkgPSBpbnRlcnBvbGF0ZSQyKHNlbGVjdGlvbjAsIHNlbGVjdGlvbjEpOwoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHR3ZWVuKHQpIHsKICAgICAgICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gdCA9PT0gMSAmJiBlbXB0eSQzKHNlbGVjdGlvbjEpID8gbnVsbCA6IGkodCk7CiAgICAgICAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpOwogICAgICAgICAgICAgICAgICBlbWl0LmJydXNoKCk7CiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjAgJiYgc2VsZWN0aW9uMSA/IHR3ZWVuIDogdHdlZW4oMSk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGdyb3VwCiAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgICAgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24xID0gZGltLmlucHV0KHR5cGVvZiBzZWxlY3Rpb24gPT09ICJmdW5jdGlvbiIgPyBzZWxlY3Rpb24uYXBwbHkodGhhdCwgYXJncykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICAgICAgZW1pdCA9IGVtaXR0ZXIodGhhdCwgYXJncykuYmVmb3Jlc3RhcnQoKTsKCiAgICAgICAgICAgICAgICBpbnRlcnJ1cHQkMSh0aGF0KTsKICAgICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT0gbnVsbCB8fCBlbXB0eSQzKHNlbGVjdGlvbjEpID8gbnVsbCA6IHNlbGVjdGlvbjE7CiAgICAgICAgICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTsKICAgICAgICAgICAgICAgIGVtaXQuc3RhcnQoKS5icnVzaCgpLmVuZCgpOwogICAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIHJlZHJhdygpIHsKICAgICAgICB2YXIgZ3JvdXAgPSBzZWxlY3QkMSh0aGlzKSwKICAgICAgICAgICAgc2VsZWN0aW9uID0gbG9jYWwkMih0aGlzKS5zZWxlY3Rpb247CgogICAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICAgIGdyb3VwLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpCiAgICAgICAgICAgICAgLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCkKICAgICAgICAgICAgICAuYXR0cigieCIsIHNlbGVjdGlvblswXVswXSkKICAgICAgICAgICAgICAuYXR0cigieSIsIHNlbGVjdGlvblswXVsxXSkKICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0pCiAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSk7CgogICAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgICAgICAgICAuc3R5bGUoImRpc3BsYXkiLCBudWxsKQogICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gImUiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVswXSA9PT0gInMiID8gc2VsZWN0aW9uWzFdWzFdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMV0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJuIiB8fCBkLnR5cGUgPT09ICJzIiA/IHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KQogICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJlIiB8fCBkLnR5cGUgPT09ICJ3IiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKQogICAgICAgICAgICAgIC5zdHlsZSgiZGlzcGxheSIsICJub25lIikKICAgICAgICAgICAgICAuYXR0cigieCIsIG51bGwpCiAgICAgICAgICAgICAgLmF0dHIoInkiLCBudWxsKQogICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIG51bGwpCiAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIG51bGwpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gZW1pdHRlcih0aGF0LCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIHRoYXQuX19icnVzaC5lbWl0dGVyIHx8IG5ldyBFbWl0dGVyKHRoYXQsIGFyZ3MpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBFbWl0dGVyKHRoYXQsIGFyZ3MpIHsKICAgICAgICB0aGlzLnRoYXQgPSB0aGF0OwogICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICAgICAgdGhpcy5zdGF0ZSA9IHRoYXQuX19icnVzaDsKICAgICAgICB0aGlzLmFjdGl2ZSA9IDA7CiAgICAgIH0KCiAgICAgIEVtaXR0ZXIucHJvdG90eXBlID0gewogICAgICAgIGJlZm9yZXN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICgrK3RoaXMuYWN0aXZlID09PSAxKSB0aGlzLnN0YXRlLmVtaXR0ZXIgPSB0aGlzLCB0aGlzLnN0YXJ0aW5nID0gdHJ1ZTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCiAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHRoaXMuc3RhcnRpbmcpIHRoaXMuc3RhcnRpbmcgPSBmYWxzZSwgdGhpcy5lbWl0KCJzdGFydCIpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBicnVzaDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmVtaXQoImJydXNoIik7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlciwgdGhpcy5lbWl0KCJlbmQiKTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCiAgICAgICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgY3VzdG9tRXZlbnQkMShuZXcgQnJ1c2hFdmVudCQxKGJydXNoLCB0eXBlLCBkaW0ub3V0cHV0KHRoaXMuc3RhdGUuc2VsZWN0aW9uKSksIGxpc3RlbmVycy5hcHBseSwgbGlzdGVuZXJzLCBbdHlwZSwgdGhpcy50aGF0LCB0aGlzLmFyZ3NdKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBmdW5jdGlvbiBzdGFydGVkKCkgewogICAgICAgIGlmIChldmVudCQxLnRvdWNoZXMpIHsgaWYgKGV2ZW50JDEuY2hhbmdlZFRvdWNoZXMubGVuZ3RoIDwgZXZlbnQkMS50b3VjaGVzLmxlbmd0aCkgcmV0dXJuIG5vZXZlbnQkNCgpOyB9CiAgICAgICAgZWxzZSBpZiAodG91Y2hlbmRpbmcpIHJldHVybjsKICAgICAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CgogICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgdHlwZSA9IGV2ZW50JDEudGFyZ2V0Ll9fZGF0YV9fLnR5cGUsCiAgICAgICAgICAgIG1vZGUgPSAoZXZlbnQkMS5tZXRhS2V5ID8gdHlwZSA9ICJvdmVybGF5IiA6IHR5cGUpID09PSAic2VsZWN0aW9uIiA/IE1PREVfRFJBRyQxIDogKGV2ZW50JDEuYWx0S2V5ID8gTU9ERV9DRU5URVIkMSA6IE1PREVfSEFORExFJDEpLAogICAgICAgICAgICBzaWduWCA9IGRpbSA9PT0gWSQxID8gbnVsbCA6IHNpZ25zWCQxW3R5cGVdLAogICAgICAgICAgICBzaWduWSA9IGRpbSA9PT0gWCQxID8gbnVsbCA6IHNpZ25zWSQxW3R5cGVdLAogICAgICAgICAgICBzdGF0ZSA9IGxvY2FsJDIodGhhdCksCiAgICAgICAgICAgIGV4dGVudCA9IHN0YXRlLmV4dGVudCwKICAgICAgICAgICAgc2VsZWN0aW9uID0gc3RhdGUuc2VsZWN0aW9uLAogICAgICAgICAgICBXID0gZXh0ZW50WzBdWzBdLCB3MCwgdzEsCiAgICAgICAgICAgIE4gPSBleHRlbnRbMF1bMV0sIG4wLCBuMSwKICAgICAgICAgICAgRSA9IGV4dGVudFsxXVswXSwgZTAsIGUxLAogICAgICAgICAgICBTID0gZXh0ZW50WzFdWzFdLCBzMCwgczEsCiAgICAgICAgICAgIGR4LAogICAgICAgICAgICBkeSwKICAgICAgICAgICAgbW92aW5nLAogICAgICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZICYmIGV2ZW50JDEuc2hpZnRLZXksCiAgICAgICAgICAgIGxvY2tYLAogICAgICAgICAgICBsb2NrWSwKICAgICAgICAgICAgcG9pbnQwID0gbW91c2UkMSh0aGF0KSwKICAgICAgICAgICAgcG9pbnQgPSBwb2ludDAsCiAgICAgICAgICAgIGVtaXQgPSBlbWl0dGVyKHRoYXQsIGFyZ3VtZW50cykuYmVmb3Jlc3RhcnQoKTsKCiAgICAgICAgaWYgKHR5cGUgPT09ICJvdmVybGF5IikgewogICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gc2VsZWN0aW9uID0gWwogICAgICAgICAgICBbdzAgPSBkaW0gPT09IFkkMSA/IFcgOiBwb2ludDBbMF0sIG4wID0gZGltID09PSBYJDEgPyBOIDogcG9pbnQwWzFdXSwKICAgICAgICAgICAgW2UwID0gZGltID09PSBZJDEgPyBFIDogdzAsIHMwID0gZGltID09PSBYJDEgPyBTIDogbjBdCiAgICAgICAgICBdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3MCA9IHNlbGVjdGlvblswXVswXTsKICAgICAgICAgIG4wID0gc2VsZWN0aW9uWzBdWzFdOwogICAgICAgICAgZTAgPSBzZWxlY3Rpb25bMV1bMF07CiAgICAgICAgICBzMCA9IHNlbGVjdGlvblsxXVsxXTsKICAgICAgICB9CgogICAgICAgIHcxID0gdzA7CiAgICAgICAgbjEgPSBuMDsKICAgICAgICBlMSA9IGUwOwogICAgICAgIHMxID0gczA7CgogICAgICAgIHZhciBncm91cCA9IHNlbGVjdCQxKHRoYXQpCiAgICAgICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJub25lIik7CgogICAgICAgIHZhciBvdmVybGF5ID0gZ3JvdXAuc2VsZWN0QWxsKCIub3ZlcmxheSIpCiAgICAgICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzJDFbdHlwZV0pOwoKICAgICAgICBpZiAoZXZlbnQkMS50b3VjaGVzKSB7CiAgICAgICAgICBncm91cAogICAgICAgICAgICAgIC5vbigidG91Y2htb3ZlLmJydXNoIiwgbW92ZWQsIHRydWUpCiAgICAgICAgICAgICAgLm9uKCJ0b3VjaGVuZC5icnVzaCB0b3VjaGNhbmNlbC5icnVzaCIsIGVuZGVkLCB0cnVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHZpZXcgPSBzZWxlY3QkMShldmVudCQxLnZpZXcpCiAgICAgICAgICAgICAgLm9uKCJrZXlkb3duLmJydXNoIiwga2V5ZG93bmVkLCB0cnVlKQogICAgICAgICAgICAgIC5vbigia2V5dXAuYnJ1c2giLCBrZXl1cHBlZCwgdHJ1ZSkKICAgICAgICAgICAgICAub24oIm1vdXNlbW92ZS5icnVzaCIsIG1vdmVkLCB0cnVlKQogICAgICAgICAgICAgIC5vbigibW91c2V1cC5icnVzaCIsIGVuZGVkLCB0cnVlKTsKCiAgICAgICAgICBkcmFnRGlzYWJsZSQxKGV2ZW50JDEudmlldyk7CiAgICAgICAgfQoKICAgICAgICBub3Byb3BhZ2F0aW9uJDMoKTsKICAgICAgICBpbnRlcnJ1cHQkMSh0aGF0KTsKICAgICAgICByZWRyYXcuY2FsbCh0aGF0KTsKICAgICAgICBlbWl0LnN0YXJ0KCk7CgogICAgICAgIGZ1bmN0aW9uIG1vdmVkKCkgewogICAgICAgICAgdmFyIHBvaW50MSA9IG1vdXNlJDEodGhhdCk7CiAgICAgICAgICBpZiAoc2hpZnRpbmcgJiYgIWxvY2tYICYmICFsb2NrWSkgewogICAgICAgICAgICBpZiAoTWF0aC5hYnMocG9pbnQxWzBdIC0gcG9pbnRbMF0pID4gTWF0aC5hYnMocG9pbnQxWzFdIC0gcG9pbnRbMV0pKSBsb2NrWSA9IHRydWU7CiAgICAgICAgICAgIGVsc2UgbG9ja1ggPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgcG9pbnQgPSBwb2ludDE7CiAgICAgICAgICBtb3ZpbmcgPSB0cnVlOwogICAgICAgICAgbm9ldmVudCQ0KCk7CiAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBtb3ZlKCkgewogICAgICAgICAgdmFyIHQ7CgogICAgICAgICAgZHggPSBwb2ludFswXSAtIHBvaW50MFswXTsKICAgICAgICAgIGR5ID0gcG9pbnRbMV0gLSBwb2ludDBbMV07CgogICAgICAgICAgc3dpdGNoIChtb2RlKSB7CiAgICAgICAgICAgIGNhc2UgTU9ERV9TUEFDRSQxOgogICAgICAgICAgICBjYXNlIE1PREVfRFJBRyQxOiB7CiAgICAgICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTAgKyBkeDsKICAgICAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgoTiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgTU9ERV9IQU5ETEUkMTogewogICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGR4ID0gTWF0aC5tYXgoVyAtIHcwLCBNYXRoLm1pbihFIC0gdzAsIGR4KSksIHcxID0gdzAgKyBkeCwgZTEgPSBlMDsKICAgICAgICAgICAgICBlbHNlIGlmIChzaWduWCA+IDApIGR4ID0gTWF0aC5tYXgoVyAtIGUwLCBNYXRoLm1pbihFIC0gZTAsIGR4KSksIHcxID0gdzAsIGUxID0gZTAgKyBkeDsKICAgICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBkeSA9IE1hdGgubWF4KE4gLSBuMCwgTWF0aC5taW4oUyAtIG4wLCBkeSkpLCBuMSA9IG4wICsgZHksIHMxID0gczA7CiAgICAgICAgICAgICAgZWxzZSBpZiAoc2lnblkgPiAwKSBkeSA9IE1hdGgubWF4KE4gLSBzMCwgTWF0aC5taW4oUyAtIHMwLCBkeSkpLCBuMSA9IG4wLCBzMSA9IHMwICsgZHk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBNT0RFX0NFTlRFUiQxOiB7CiAgICAgICAgICAgICAgaWYgKHNpZ25YKSB3MSA9IE1hdGgubWF4KFcsIE1hdGgubWluKEUsIHcwIC0gZHggKiBzaWduWCkpLCBlMSA9IE1hdGgubWF4KFcsIE1hdGgubWluKEUsIGUwICsgZHggKiBzaWduWCkpOwogICAgICAgICAgICAgIGlmIChzaWduWSkgbjEgPSBNYXRoLm1heChOLCBNYXRoLm1pbihTLCBuMCAtIGR5ICogc2lnblkpKSwgczEgPSBNYXRoLm1heChOLCBNYXRoLm1pbihTLCBzMCArIGR5ICogc2lnblkpKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQoKICAgICAgICAgIGlmIChlMSA8IHcxKSB7CiAgICAgICAgICAgIHNpZ25YICo9IC0xOwogICAgICAgICAgICB0ID0gdzAsIHcwID0gZTAsIGUwID0gdDsKICAgICAgICAgICAgdCA9IHcxLCB3MSA9IGUxLCBlMSA9IHQ7CiAgICAgICAgICAgIGlmICh0eXBlIGluIGZsaXBYJDEpIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycyQxW3R5cGUgPSBmbGlwWCQxW3R5cGVdXSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHMxIDwgbjEpIHsKICAgICAgICAgICAgc2lnblkgKj0gLTE7CiAgICAgICAgICAgIHQgPSBuMCwgbjAgPSBzMCwgczAgPSB0OwogICAgICAgICAgICB0ID0gbjEsIG4xID0gczEsIHMxID0gdDsKICAgICAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFkkMSkgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzJDFbdHlwZSA9IGZsaXBZJDFbdHlwZV1dKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSEKICAgICAgICAgIGlmIChsb2NrWCkgdzEgPSBzZWxlY3Rpb25bMF1bMF0sIGUxID0gc2VsZWN0aW9uWzFdWzBdOwogICAgICAgICAgaWYgKGxvY2tZKSBuMSA9IHNlbGVjdGlvblswXVsxXSwgczEgPSBzZWxlY3Rpb25bMV1bMV07CgogICAgICAgICAgaWYgKHNlbGVjdGlvblswXVswXSAhPT0gdzEKICAgICAgICAgICAgICB8fCBzZWxlY3Rpb25bMF1bMV0gIT09IG4xCiAgICAgICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzBdICE9PSBlMQogICAgICAgICAgICAgIHx8IHNlbGVjdGlvblsxXVsxXSAhPT0gczEpIHsKICAgICAgICAgICAgc3RhdGUuc2VsZWN0aW9uID0gW1t3MSwgbjFdLCBbZTEsIHMxXV07CiAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpOwogICAgICAgICAgICBlbWl0LmJydXNoKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBlbmRlZCgpIHsKICAgICAgICAgIG5vcHJvcGFnYXRpb24kMygpOwogICAgICAgICAgaWYgKGV2ZW50JDEudG91Y2hlcykgewogICAgICAgICAgICBpZiAoZXZlbnQkMS50b3VjaGVzLmxlbmd0aCkgcmV0dXJuOwogICAgICAgICAgICBpZiAodG91Y2hlbmRpbmcpIGNsZWFyVGltZW91dCh0b3VjaGVuZGluZyk7CiAgICAgICAgICAgIHRvdWNoZW5kaW5nID0gc2V0VGltZW91dChmdW5jdGlvbigpIHsgdG91Y2hlbmRpbmcgPSBudWxsOyB9LCA1MDApOyAvLyBHaG9zdCBjbGlja3MgYXJlIGRlbGF5ZWQhCiAgICAgICAgICAgIGdyb3VwLm9uKCJ0b3VjaG1vdmUuYnJ1c2ggdG91Y2hlbmQuYnJ1c2ggdG91Y2hjYW5jZWwuYnJ1c2giLCBudWxsKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHllc2RyYWckMShldmVudCQxLnZpZXcsIG1vdmluZyk7CiAgICAgICAgICAgIHZpZXcub24oImtleWRvd24uYnJ1c2gga2V5dXAuYnJ1c2ggbW91c2Vtb3ZlLmJydXNoIG1vdXNldXAuYnJ1c2giLCBudWxsKTsKICAgICAgICAgIH0KICAgICAgICAgIGdyb3VwLmF0dHIoInBvaW50ZXItZXZlbnRzIiwgImFsbCIpOwogICAgICAgICAgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzJDEub3ZlcmxheSk7CiAgICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSAob24gc3RhcnQpIQogICAgICAgICAgaWYgKGVtcHR5JDMoc2VsZWN0aW9uKSkgc3RhdGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICBlbWl0LmVuZCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24ga2V5ZG93bmVkKCkgewogICAgICAgICAgc3dpdGNoIChldmVudCQxLmtleUNvZGUpIHsKICAgICAgICAgICAgY2FzZSAxNjogeyAvLyBTSElGVAogICAgICAgICAgICAgIHNoaWZ0aW5nID0gc2lnblggJiYgc2lnblk7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAxODogeyAvLyBBTFQKICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9IQU5ETEUkMSkgewogICAgICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7CiAgICAgICAgICAgICAgICBpZiAoc2lnblkpIHMwID0gczEgLSBkeSAqIHNpZ25ZLCBuMCA9IG4xICsgZHkgKiBzaWduWTsKICAgICAgICAgICAgICAgIG1vZGUgPSBNT0RFX0NFTlRFUiQxOwogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFOyB0YWtlcyBwcmlvcml0eSBvdmVyIEFMVAogICAgICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSQxIHx8IG1vZGUgPT09IE1PREVfQ0VOVEVSJDEpIHsKICAgICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTEgLSBkeDsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxIC0gZHg7CiAgICAgICAgICAgICAgICBpZiAoc2lnblkgPCAwKSBzMCA9IHMxIC0gZHk7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMSAtIGR5OwogICAgICAgICAgICAgICAgbW9kZSA9IE1PREVfU1BBQ0UkMTsKICAgICAgICAgICAgICAgIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycyQxLnNlbGVjdGlvbik7CiAgICAgICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIG5vZXZlbnQkNCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24ga2V5dXBwZWQoKSB7CiAgICAgICAgICBzd2l0Y2ggKGV2ZW50JDEua2V5Q29kZSkgewogICAgICAgICAgICBjYXNlIDE2OiB7IC8vIFNISUZUCiAgICAgICAgICAgICAgaWYgKHNoaWZ0aW5nKSB7CiAgICAgICAgICAgICAgICBsb2NrWCA9IGxvY2tZID0gc2hpZnRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSAxODogeyAvLyBBTFQKICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9DRU5URVIkMSkgewogICAgICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxOwogICAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFJDE7CiAgICAgICAgICAgICAgICBtb3ZlKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gU1BBQ0UKICAgICAgICAgICAgICBpZiAobW9kZSA9PT0gTU9ERV9TUEFDRSQxKSB7CiAgICAgICAgICAgICAgICBpZiAoZXZlbnQkMS5hbHRLZXkpIHsKICAgICAgICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7CiAgICAgICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZOwogICAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVIkMTsKICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgIGlmIChzaWduWCA8IDApIGUwID0gZTE7IGVsc2UgaWYgKHNpZ25YID4gMCkgdzAgPSB3MTsKICAgICAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9IQU5ETEUkMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycyQxW3R5cGVdKTsKICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgbm9ldmVudCQ0KCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX19icnVzaCB8fCB7c2VsZWN0aW9uOiBudWxsfTsKICAgICAgICBzdGF0ZS5leHRlbnQgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBzdGF0ZS5kaW0gPSBkaW07CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICB9CgogICAgICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkaChbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSksIGJydXNoKSA6IGV4dGVudDsKICAgICAgfTsKCiAgICAgIGJydXNoLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRoKCEhXyksIGJydXNoKSA6IGZpbHRlcjsKICAgICAgfTsKCiAgICAgIGJydXNoLmhhbmRsZVNpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaGFuZGxlU2l6ZSA9ICtfLCBicnVzaCkgOiBoYW5kbGVTaXplOwogICAgICB9OwoKICAgICAgYnJ1c2gub24gPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUgPSBsaXN0ZW5lcnMub24uYXBwbHkobGlzdGVuZXJzLCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiB2YWx1ZSA9PT0gbGlzdGVuZXJzID8gYnJ1c2ggOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIHJldHVybiBicnVzaDsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmckNihhLCBiKSB7CiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBiaXNlY3RvciQyKGNvbXBhcmUpIHsKICAgICAgaWYgKGNvbXBhcmUubGVuZ3RoID09PSAxKSBjb21wYXJlID0gYXNjZW5kaW5nQ29tcGFyYXRvciQyKGNvbXBhcmUpOwogICAgICByZXR1cm4gewogICAgICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgewogICAgICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsKICAgICAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7CiAgICAgICAgICAgIGVsc2UgaGkgPSBtaWQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbG87CiAgICAgICAgfSwKICAgICAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOwogICAgICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkOwogICAgICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsbzsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvciQyKGYpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHsKICAgICAgICByZXR1cm4gYXNjZW5kaW5nJDYoZihkKSwgeCk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGFzY2VuZGluZ0Jpc2VjdCQyID0gYmlzZWN0b3IkMihhc2NlbmRpbmckNik7CgogICAgZnVuY3Rpb24gcmFuZ2UkMihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgICBzdGFydCA9ICtzdGFydCwgc3RvcCA9ICtzdG9wLCBzdGVwID0gKG4gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDIgPyAoc3RvcCA9IHN0YXJ0LCBzdGFydCA9IDAsIDEpIDogbiA8IDMgPyAxIDogK3N0ZXA7CgogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsCiAgICAgICAgICByYW5nZSA9IG5ldyBBcnJheShuKTsKCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwOwogICAgICB9CgogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CgogICAgdmFyIGNvcyQzID0gTWF0aC5jb3M7CiAgICB2YXIgc2luJDMgPSBNYXRoLnNpbjsKICAgIHZhciBwaSQ1ID0gTWF0aC5QSTsKICAgIHZhciBoYWxmUGkkNCA9IHBpJDUgLyAyOwogICAgdmFyIHRhdSQ1ID0gcGkkNSAqIDI7CiAgICB2YXIgbWF4JDQgPSBNYXRoLm1heDsKCiAgICBmdW5jdGlvbiBjb21wYXJlVmFsdWUkMShjb21wYXJlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGNvbXBhcmUoCiAgICAgICAgICBhLnNvdXJjZS52YWx1ZSArIGEudGFyZ2V0LnZhbHVlLAogICAgICAgICAgYi5zb3VyY2UudmFsdWUgKyBiLnRhcmdldC52YWx1ZQogICAgICAgICk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2hvcmQkMSgpIHsKICAgICAgdmFyIHBhZEFuZ2xlID0gMCwKICAgICAgICAgIHNvcnRHcm91cHMgPSBudWxsLAogICAgICAgICAgc29ydFN1Ymdyb3VwcyA9IG51bGwsCiAgICAgICAgICBzb3J0Q2hvcmRzID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIGNob3JkKG1hdHJpeCkgewogICAgICAgIHZhciBuID0gbWF0cml4Lmxlbmd0aCwKICAgICAgICAgICAgZ3JvdXBTdW1zID0gW10sCiAgICAgICAgICAgIGdyb3VwSW5kZXggPSByYW5nZSQyKG4pLAogICAgICAgICAgICBzdWJncm91cEluZGV4ID0gW10sCiAgICAgICAgICAgIGNob3JkcyA9IFtdLAogICAgICAgICAgICBncm91cHMgPSBjaG9yZHMuZ3JvdXBzID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICBzdWJncm91cHMgPSBuZXcgQXJyYXkobiAqIG4pLAogICAgICAgICAgICBrLAogICAgICAgICAgICB4LAogICAgICAgICAgICB4MCwKICAgICAgICAgICAgZHgsCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIGo7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIHN1bS4KICAgICAgICBrID0gMCwgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgeCA9IDAsIGogPSAtMTsgd2hpbGUgKCsraiA8IG4pIHsKICAgICAgICAgICAgeCArPSBtYXRyaXhbaV1bal07CiAgICAgICAgICB9CiAgICAgICAgICBncm91cFN1bXMucHVzaCh4KTsKICAgICAgICAgIHN1Ymdyb3VwSW5kZXgucHVzaChyYW5nZSQyKG4pKTsKICAgICAgICAgIGsgKz0geDsKICAgICAgICB9CgogICAgICAgIC8vIFNvcnQgZ3JvdXBz4oCmCiAgICAgICAgaWYgKHNvcnRHcm91cHMpIGdyb3VwSW5kZXguc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICByZXR1cm4gc29ydEdyb3Vwcyhncm91cFN1bXNbYV0sIGdyb3VwU3Vtc1tiXSk7CiAgICAgICAgfSk7CgogICAgICAgIC8vIFNvcnQgc3ViZ3JvdXBz4oCmCiAgICAgICAgaWYgKHNvcnRTdWJncm91cHMpIHN1Ymdyb3VwSW5kZXguZm9yRWFjaChmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgICBkLnNvcnQoZnVuY3Rpb24oYSwgYikgewogICAgICAgICAgICByZXR1cm4gc29ydFN1Ymdyb3VwcyhtYXRyaXhbaV1bYV0sIG1hdHJpeFtpXVtiXSk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKCiAgICAgICAgLy8gQ29udmVydCB0aGUgc3VtIHRvIHNjYWxpbmcgZmFjdG9yIGZvciBbMCwgMnBpXS4KICAgICAgICAvLyBUT0RPIEFsbG93IHN0YXJ0IGFuZCBlbmQgYW5nbGUgdG8gYmUgc3BlY2lmaWVkPwogICAgICAgIC8vIFRPRE8gQWxsb3cgcGFkZGluZyB0byBiZSBzcGVjaWZpZWQgYXMgcGVyY2VudGFnZT8KICAgICAgICBrID0gbWF4JDQoMCwgdGF1JDUgLSBwYWRBbmdsZSAqIG4pIC8gazsKICAgICAgICBkeCA9IGsgPyBwYWRBbmdsZSA6IHRhdSQ1IC8gbjsKCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc3RhcnQgYW5kIGVuZCBhbmdsZSBmb3IgZWFjaCBncm91cCBhbmQgc3ViZ3JvdXAuCiAgICAgICAgLy8gTm90ZTogT3BlcmEgaGFzIGEgYnVnIHJlb3JkZXJpbmcgb2JqZWN0IGxpdGVyYWwgcHJvcGVydGllcyEKICAgICAgICB4ID0gMCwgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgeDAgPSB4LCBqID0gLTE7IHdoaWxlICgrK2ogPCBuKSB7CiAgICAgICAgICAgIHZhciBkaSA9IGdyb3VwSW5kZXhbaV0sCiAgICAgICAgICAgICAgICBkaiA9IHN1Ymdyb3VwSW5kZXhbZGldW2pdLAogICAgICAgICAgICAgICAgdiA9IG1hdHJpeFtkaV1bZGpdLAogICAgICAgICAgICAgICAgYTAgPSB4LAogICAgICAgICAgICAgICAgYTEgPSB4ICs9IHYgKiBrOwogICAgICAgICAgICBzdWJncm91cHNbZGogKiBuICsgZGldID0gewogICAgICAgICAgICAgIGluZGV4OiBkaSwKICAgICAgICAgICAgICBzdWJpbmRleDogZGosCiAgICAgICAgICAgICAgc3RhcnRBbmdsZTogYTAsCiAgICAgICAgICAgICAgZW5kQW5nbGU6IGExLAogICAgICAgICAgICAgIHZhbHVlOiB2CiAgICAgICAgICAgIH07CiAgICAgICAgICB9CiAgICAgICAgICBncm91cHNbZGldID0gewogICAgICAgICAgICBpbmRleDogZGksCiAgICAgICAgICAgIHN0YXJ0QW5nbGU6IHgwLAogICAgICAgICAgICBlbmRBbmdsZTogeCwKICAgICAgICAgICAgdmFsdWU6IGdyb3VwU3Vtc1tkaV0KICAgICAgICAgIH07CiAgICAgICAgICB4ICs9IGR4OwogICAgICAgIH0KCiAgICAgICAgLy8gR2VuZXJhdGUgY2hvcmRzIGZvciBlYWNoIChub24tZW1wdHkpIHN1Ymdyb3VwLXN1Ymdyb3VwIGxpbmsuCiAgICAgICAgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaiA9IGkgLSAxOyB3aGlsZSAoKytqIDwgbikgewogICAgICAgICAgICB2YXIgc291cmNlID0gc3ViZ3JvdXBzW2ogKiBuICsgaV0sCiAgICAgICAgICAgICAgICB0YXJnZXQgPSBzdWJncm91cHNbaSAqIG4gKyBqXTsKICAgICAgICAgICAgaWYgKHNvdXJjZS52YWx1ZSB8fCB0YXJnZXQudmFsdWUpIHsKICAgICAgICAgICAgICBjaG9yZHMucHVzaChzb3VyY2UudmFsdWUgPCB0YXJnZXQudmFsdWUKICAgICAgICAgICAgICAgICAgPyB7c291cmNlOiB0YXJnZXQsIHRhcmdldDogc291cmNlfQogICAgICAgICAgICAgICAgICA6IHtzb3VyY2U6IHNvdXJjZSwgdGFyZ2V0OiB0YXJnZXR9KTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNvcnRDaG9yZHMgPyBjaG9yZHMuc29ydChzb3J0Q2hvcmRzKSA6IGNob3JkczsKICAgICAgfQoKICAgICAgY2hvcmQucGFkQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkQW5nbGUgPSBtYXgkNCgwLCBfKSwgY2hvcmQpIDogcGFkQW5nbGU7CiAgICAgIH07CgogICAgICBjaG9yZC5zb3J0R3JvdXBzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnRHcm91cHMgPSBfLCBjaG9yZCkgOiBzb3J0R3JvdXBzOwogICAgICB9OwoKICAgICAgY2hvcmQuc29ydFN1Ymdyb3VwcyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3J0U3ViZ3JvdXBzID0gXywgY2hvcmQpIDogc29ydFN1Ymdyb3VwczsKICAgICAgfTsKCiAgICAgIGNob3JkLnNvcnRDaG9yZHMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gc29ydENob3JkcyA9IG51bGwgOiAoc29ydENob3JkcyA9IGNvbXBhcmVWYWx1ZSQxKF8pKS5fID0gXywgY2hvcmQpIDogc29ydENob3JkcyAmJiBzb3J0Q2hvcmRzLl87CiAgICAgIH07CgogICAgICByZXR1cm4gY2hvcmQ7CiAgICB9CgogICAgdmFyIHNsaWNlJDkgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgogICAgZnVuY3Rpb24gY29uc3RhbnQkaSh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgcGkkNiA9IE1hdGguUEksCiAgICAgICAgdGF1JDYgPSAyICogcGkkNiwKICAgICAgICBlcHNpbG9uJDYgPSAxZS02LAogICAgICAgIHRhdUVwc2lsb24kMSA9IHRhdSQ2IC0gZXBzaWxvbiQ2OwoKICAgIGZ1bmN0aW9uIFBhdGgkMSgpIHsKICAgICAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJlbnQgc3VicGF0aAogICAgICB0aGlzLl94MSA9IHRoaXMuX3kxID0gbnVsbDsgLy8gZW5kIG9mIGN1cnJlbnQgc3VicGF0aAogICAgICB0aGlzLl8gPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXRoJDEoKSB7CiAgICAgIHJldHVybiBuZXcgUGF0aCQxOwogICAgfQoKICAgIFBhdGgkMS5wcm90b3R5cGUgPSBwYXRoJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogUGF0aCQxLAogICAgICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7CiAgICAgICAgICB0aGlzLl8gKz0gIloiOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJMIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJRIiArICgreDEpICsgIiwiICsgKCt5MSkgKyAiLCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7CiAgICAgIH0sCiAgICAgIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJDIiArICgreDEpICsgIiwiICsgKCt5MSkgKyAiLCIgKyAoK3gyKSArICIsIiArICgreTIpICsgIiwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogICAgICB9LAogICAgICBhcmNUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHIpIHsKICAgICAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyOwogICAgICAgIHZhciB4MCA9IHRoaXMuX3gxLAogICAgICAgICAgICB5MCA9IHRoaXMuX3kxLAogICAgICAgICAgICB4MjEgPSB4MiAtIHgxLAogICAgICAgICAgICB5MjEgPSB5MiAtIHkxLAogICAgICAgICAgICB4MDEgPSB4MCAtIHgxLAogICAgICAgICAgICB5MDEgPSB5MCAtIHkxLAogICAgICAgICAgICBsMDFfMiA9IHgwMSAqIHgwMSArIHkwMSAqIHkwMTsKCiAgICAgICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICAgICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOwoKICAgICAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS4KICAgICAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDEgPSB4MSkgKyAiLCIgKyAodGhpcy5feTEgPSB5MSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy4KICAgICAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbiQ2KSk7CgogICAgICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/CiAgICAgICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpPwogICAgICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4KICAgICAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uJDYpIHx8ICFyKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgICAgIH0KCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyEKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciB4MjAgPSB4MiAtIHgwLAogICAgICAgICAgICAgIHkyMCA9IHkyIC0geTAsCiAgICAgICAgICAgICAgbDIxXzIgPSB4MjEgKiB4MjEgKyB5MjEgKiB5MjEsCiAgICAgICAgICAgICAgbDIwXzIgPSB4MjAgKiB4MjAgKyB5MjAgKiB5MjAsCiAgICAgICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSwKICAgICAgICAgICAgICBsMDEgPSBNYXRoLnNxcnQobDAxXzIpLAogICAgICAgICAgICAgIGwgPSByICogTWF0aC50YW4oKHBpJDYgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLAogICAgICAgICAgICAgIHQwMSA9IGwgLyBsMDEsCiAgICAgICAgICAgICAgdDIxID0gbCAvIGwyMTsKCiAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgdGFuZ2VudCBpcyBub3QgY29pbmNpZGVudCB3aXRoICh4MCx5MCksIGxpbmUgdG8uCiAgICAgICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uJDYpIHsKICAgICAgICAgICAgdGhpcy5fICs9ICJMIiArICh4MSArIHQwMSAqIHgwMSkgKyAiLCIgKyAoeTEgKyB0MDEgKiB5MDEpOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIsIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsgdDIxICogeTIxKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreSwgciA9ICtyLCBjY3cgPSAhIWNjdzsKICAgICAgICB2YXIgZHggPSByICogTWF0aC5jb3MoYTApLAogICAgICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksCiAgICAgICAgICAgIHgwID0geCArIGR4LAogICAgICAgICAgICB5MCA9IHkgKyBkeSwKICAgICAgICAgICAgY3cgPSAxIF4gY2N3LAogICAgICAgICAgICBkYSA9IGNjdyA/IGEwIC0gYTEgOiBhMSAtIGEwOwoKICAgICAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci4KICAgICAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiICsgcik7CgogICAgICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDAseTApLgogICAgICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkgewogICAgICAgICAgdGhpcy5fICs9ICJNIiArIHgwICsgIiwiICsgeTA7CiAgICAgICAgfQoKICAgICAgICAvLyBPciwgaXMgKHgwLHkwKSBub3QgY29pbmNpZGVudCB3aXRoIHRoZSBwcmV2aW91cyBwb2ludD8gTGluZSB0byAoeDAseTApLgogICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiQ2IHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbiQ2KSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkwiICsgeDAgKyAiLCIgKyB5MDsKICAgICAgICB9CgogICAgICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZeKAmXJlIGRvbmUuCiAgICAgICAgaWYgKCFyKSByZXR1cm47CgogICAgICAgIC8vIERvZXMgdGhlIGFuZ2xlIGdvIHRoZSB3cm9uZyB3YXk/IEZsaXAgdGhlIGRpcmVjdGlvbi4KICAgICAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1JDYgKyB0YXUkNjsKCiAgICAgICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLgogICAgICAgIGlmIChkYSA+IHRhdUVwc2lsb24kMSkgewogICAgICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLDEsIiArIGN3ICsgIiwiICsgKHggLSBkeCkgKyAiLCIgKyAoeSAtIGR5KSArICJBIiArIHIgKyAiLCIgKyByICsgIiwwLDEsIiArIGN3ICsgIiwiICsgKHRoaXMuX3gxID0geDApICsgIiwiICsgKHRoaXMuX3kxID0geTApOwogICAgICAgIH0KCiAgICAgICAgLy8gSXMgdGhpcyBhcmMgbm9uLWVtcHR5PyBEcmF3IGFuIGFyYyEKICAgICAgICBlbHNlIGlmIChkYSA+IGVwc2lsb24kNikgewogICAgICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLCIgKyAoKyhkYSA+PSBwaSQ2KSkgKyAiLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHggKyByICogTWF0aC5jb3MoYTEpKSArICIsIiArICh0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlY3Q6IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHsKICAgICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KSArICJoIiArICgrdykgKyAidiIgKyAoK2gpICsgImgiICsgKC13KSArICJaIjsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl87CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZGVmYXVsdFNvdXJjZSQyKGQpIHsKICAgICAgcmV0dXJuIGQuc291cmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRUYXJnZXQkMShkKSB7CiAgICAgIHJldHVybiBkLnRhcmdldDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0UmFkaXVzJDIoZCkgewogICAgICByZXR1cm4gZC5yYWRpdXM7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFN0YXJ0QW5nbGUkMShkKSB7CiAgICAgIHJldHVybiBkLnN0YXJ0QW5nbGU7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdEVuZEFuZ2xlJDEoZCkgewogICAgICByZXR1cm4gZC5lbmRBbmdsZTsKICAgIH0KCiAgICBmdW5jdGlvbiByaWJib24kMSgpIHsKICAgICAgdmFyIHNvdXJjZSA9IGRlZmF1bHRTb3VyY2UkMiwKICAgICAgICAgIHRhcmdldCA9IGRlZmF1bHRUYXJnZXQkMSwKICAgICAgICAgIHJhZGl1cyA9IGRlZmF1bHRSYWRpdXMkMiwKICAgICAgICAgIHN0YXJ0QW5nbGUgPSBkZWZhdWx0U3RhcnRBbmdsZSQxLAogICAgICAgICAgZW5kQW5nbGUgPSBkZWZhdWx0RW5kQW5nbGUkMSwKICAgICAgICAgIGNvbnRleHQgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gcmliYm9uKCkgewogICAgICAgIHZhciBidWZmZXIsCiAgICAgICAgICAgIGFyZ3YgPSBzbGljZSQ5LmNhbGwoYXJndW1lbnRzKSwKICAgICAgICAgICAgcyA9IHNvdXJjZS5hcHBseSh0aGlzLCBhcmd2KSwKICAgICAgICAgICAgdCA9IHRhcmdldC5hcHBseSh0aGlzLCBhcmd2KSwKICAgICAgICAgICAgc3IgPSArcmFkaXVzLmFwcGx5KHRoaXMsIChhcmd2WzBdID0gcywgYXJndikpLAogICAgICAgICAgICBzYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpJDQsCiAgICAgICAgICAgIHNhMSA9IGVuZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3YpIC0gaGFsZlBpJDQsCiAgICAgICAgICAgIHN4MCA9IHNyICogY29zJDMoc2EwKSwKICAgICAgICAgICAgc3kwID0gc3IgKiBzaW4kMyhzYTApLAogICAgICAgICAgICB0ciA9ICtyYWRpdXMuYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksCiAgICAgICAgICAgIHRhMCA9IHN0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkNCwKICAgICAgICAgICAgdGExID0gZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndikgLSBoYWxmUGkkNDsKCiAgICAgICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCQxKCk7CgogICAgICAgIGNvbnRleHQubW92ZVRvKHN4MCwgc3kwKTsKICAgICAgICBjb250ZXh0LmFyYygwLCAwLCBzciwgc2EwLCBzYTEpOwogICAgICAgIGlmIChzYTAgIT09IHRhMCB8fCBzYTEgIT09IHRhMSkgeyAvLyBUT0RPIHNyICE9PSB0cj8KICAgICAgICAgIGNvbnRleHQucXVhZHJhdGljQ3VydmVUbygwLCAwLCB0ciAqIGNvcyQzKHRhMCksIHRyICogc2luJDModGEwKSk7CiAgICAgICAgICBjb250ZXh0LmFyYygwLCAwLCB0ciwgdGEwLCB0YTEpOwogICAgICAgIH0KICAgICAgICBjb250ZXh0LnF1YWRyYXRpY0N1cnZlVG8oMCwgMCwgc3gwLCBzeTApOwogICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CgogICAgICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICAgICAgfQoKICAgICAgcmliYm9uLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRpKCtfKSwgcmliYm9uKSA6IHJhZGl1czsKICAgICAgfTsKCiAgICAgIHJpYmJvbi5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRpKCtfKSwgcmliYm9uKSA6IHN0YXJ0QW5nbGU7CiAgICAgIH07CgogICAgICByaWJib24uZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW5kQW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRpKCtfKSwgcmliYm9uKSA6IGVuZEFuZ2xlOwogICAgICB9OwoKICAgICAgcmliYm9uLnNvdXJjZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzb3VyY2UgPSBfLCByaWJib24pIDogc291cmNlOwogICAgICB9OwoKICAgICAgcmliYm9uLnRhcmdldCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0YXJnZXQgPSBfLCByaWJib24pIDogdGFyZ2V0OwogICAgICB9OwoKICAgICAgcmliYm9uLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIHJpYmJvbikgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIHJpYmJvbjsKICAgIH0KCiAgICB2YXIgcHJlZml4JDEgPSAiJCI7CgogICAgZnVuY3Rpb24gTWFwJDIoKSB7fQoKICAgIE1hcCQyLnByb3RvdHlwZSA9IG1hcCQ1LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IE1hcCQyLAogICAgICBoYXM6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHJldHVybiAocHJlZml4JDEgKyBrZXkpIGluIHRoaXM7CiAgICAgIH0sCiAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgcmV0dXJuIHRoaXNbcHJlZml4JDEgKyBrZXldOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICB0aGlzW3ByZWZpeCQxICsga2V5XSA9IHZhbHVlOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHZhciBwcm9wZXJ0eSA9IHByZWZpeCQxICsga2V5OwogICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICAgICAgfSwKICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4JDEpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICAgICAgfSwKICAgICAga2V5czogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQxKSBrZXlzLnB1c2gocHJvcGVydHkuc2xpY2UoMSkpOwogICAgICAgIHJldHVybiBrZXlzOwogICAgICB9LAogICAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQxKSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7CiAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgfSwKICAgICAgZW50cmllczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVudHJpZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQxKSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pOwogICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICB9LAogICAgICBzaXplOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMSkgKytzaXplOwogICAgICAgIHJldHVybiBzaXplOwogICAgICB9LAogICAgICBlbXB0eTogZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMSkgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAogICAgICBlYWNoOiBmdW5jdGlvbihmKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMSkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG1hcCQ1KG9iamVjdCwgZikgewogICAgICB2YXIgbWFwID0gbmV3IE1hcCQyOwoKICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCQyKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOwoKICAgICAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLgogICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICAgICAgbzsKCiAgICAgICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoaSwgb2JqZWN0W2ldKTsKICAgICAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7CiAgICAgIH0KCiAgICAgIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4KICAgICAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXN0JDEoKSB7CiAgICAgIHZhciBrZXlzID0gW10sCiAgICAgICAgICBzb3J0S2V5cyA9IFtdLAogICAgICAgICAgc29ydFZhbHVlcywKICAgICAgICAgIHJvbGx1cCwKICAgICAgICAgIG5lc3Q7CgogICAgICBmdW5jdGlvbiBhcHBseShhcnJheSwgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSB7CiAgICAgICAgaWYgKGRlcHRoID49IGtleXMubGVuZ3RoKSB7CiAgICAgICAgICBpZiAoc29ydFZhbHVlcyAhPSBudWxsKSBhcnJheS5zb3J0KHNvcnRWYWx1ZXMpOwogICAgICAgICAgcmV0dXJuIHJvbGx1cCAhPSBudWxsID8gcm9sbHVwKGFycmF5KSA6IGFycmF5OwogICAgICAgIH0KCiAgICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgICAgbiA9IGFycmF5Lmxlbmd0aCwKICAgICAgICAgICAga2V5ID0ga2V5c1tkZXB0aCsrXSwKICAgICAgICAgICAga2V5VmFsdWUsCiAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICB2YWx1ZXNCeUtleSA9IG1hcCQ1KCksCiAgICAgICAgICAgIHZhbHVlcywKICAgICAgICAgICAgcmVzdWx0ID0gY3JlYXRlUmVzdWx0KCk7CgogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAodmFsdWVzID0gdmFsdWVzQnlLZXkuZ2V0KGtleVZhbHVlID0ga2V5KHZhbHVlID0gYXJyYXlbaV0pICsgIiIpKSB7CiAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHZhbHVlc0J5S2V5LnNldChrZXlWYWx1ZSwgW3ZhbHVlXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB2YWx1ZXNCeUtleS5lYWNoKGZ1bmN0aW9uKHZhbHVlcywga2V5KSB7CiAgICAgICAgICBzZXRSZXN1bHQocmVzdWx0LCBrZXksIGFwcGx5KHZhbHVlcywgZGVwdGgsIGNyZWF0ZVJlc3VsdCwgc2V0UmVzdWx0KSk7CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGVudHJpZXMobWFwLCBkZXB0aCkgewogICAgICAgIGlmICgrK2RlcHRoID4ga2V5cy5sZW5ndGgpIHJldHVybiBtYXA7CiAgICAgICAgdmFyIGFycmF5LCBzb3J0S2V5ID0gc29ydEtleXNbZGVwdGggLSAxXTsKICAgICAgICBpZiAocm9sbHVwICE9IG51bGwgJiYgZGVwdGggPj0ga2V5cy5sZW5ndGgpIGFycmF5ID0gbWFwLmVudHJpZXMoKTsKICAgICAgICBlbHNlIGFycmF5ID0gW10sIG1hcC5lYWNoKGZ1bmN0aW9uKHYsIGspIHsgYXJyYXkucHVzaCh7a2V5OiBrLCB2YWx1ZXM6IGVudHJpZXModiwgZGVwdGgpfSk7IH0pOwogICAgICAgIHJldHVybiBzb3J0S2V5ICE9IG51bGwgPyBhcnJheS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHNvcnRLZXkoYS5rZXksIGIua2V5KTsgfSkgOiBhcnJheTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5lc3QgPSB7CiAgICAgICAgb2JqZWN0OiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU9iamVjdCQxLCBzZXRPYmplY3QkMik7IH0sCiAgICAgICAgbWFwOiBmdW5jdGlvbihhcnJheSkgeyByZXR1cm4gYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCQxLCBzZXRNYXAkMSk7IH0sCiAgICAgICAgZW50cmllczogZnVuY3Rpb24oYXJyYXkpIHsgcmV0dXJuIGVudHJpZXMoYXBwbHkoYXJyYXksIDAsIGNyZWF0ZU1hcCQxLCBzZXRNYXAkMSksIDApOyB9LAogICAgICAgIGtleTogZnVuY3Rpb24oZCkgeyBrZXlzLnB1c2goZCk7IHJldHVybiBuZXN0OyB9LAogICAgICAgIHNvcnRLZXlzOiBmdW5jdGlvbihvcmRlcikgeyBzb3J0S2V5c1trZXlzLmxlbmd0aCAtIDFdID0gb3JkZXI7IHJldHVybiBuZXN0OyB9LAogICAgICAgIHNvcnRWYWx1ZXM6IGZ1bmN0aW9uKG9yZGVyKSB7IHNvcnRWYWx1ZXMgPSBvcmRlcjsgcmV0dXJuIG5lc3Q7IH0sCiAgICAgICAgcm9sbHVwOiBmdW5jdGlvbihmKSB7IHJvbGx1cCA9IGY7IHJldHVybiBuZXN0OyB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlT2JqZWN0JDEoKSB7CiAgICAgIHJldHVybiB7fTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRPYmplY3QkMihvYmplY3QsIGtleSwgdmFsdWUpIHsKICAgICAgb2JqZWN0W2tleV0gPSB2YWx1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGVNYXAkMSgpIHsKICAgICAgcmV0dXJuIG1hcCQ1KCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0TWFwJDEobWFwLCBrZXksIHZhbHVlKSB7CiAgICAgIG1hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0JDIoKSB7fQoKICAgIHZhciBwcm90byQyID0gbWFwJDUucHJvdG90eXBlOwoKICAgIFNldCQyLnByb3RvdHlwZSA9IHNldCQ2LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFNldCQyLAogICAgICBoYXM6IHByb3RvJDIuaGFzLAogICAgICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFsdWUgKz0gIiI7CiAgICAgICAgdGhpc1twcmVmaXgkMSArIHZhbHVlXSA9IHZhbHVlOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICByZW1vdmU6IHByb3RvJDIucmVtb3ZlLAogICAgICBjbGVhcjogcHJvdG8kMi5jbGVhciwKICAgICAgdmFsdWVzOiBwcm90byQyLmtleXMsCiAgICAgIHNpemU6IHByb3RvJDIuc2l6ZSwKICAgICAgZW1wdHk6IHByb3RvJDIuZW1wdHksCiAgICAgIGVhY2g6IHByb3RvJDIuZWFjaAogICAgfTsKCiAgICBmdW5jdGlvbiBzZXQkNihvYmplY3QsIGYpIHsKICAgICAgdmFyIHNldCA9IG5ldyBTZXQkMjsKCiAgICAgIC8vIENvcHkgY29uc3RydWN0b3IuCiAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQkMikgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUpIHsgc2V0LmFkZCh2YWx1ZSk7IH0pOwoKICAgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTigJlzIGFuIGFycmF5LgogICAgICBlbHNlIGlmIChvYmplY3QpIHsKICAgICAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDsKICAgICAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pOwogICAgICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpOwogICAgICB9CgogICAgICByZXR1cm4gc2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIGtleXMkMShtYXApIHsKICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgZm9yICh2YXIga2V5IGluIG1hcCkga2V5cy5wdXNoKGtleSk7CiAgICAgIHJldHVybiBrZXlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHZhbHVlcyQxKG1hcCkgewogICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgIGZvciAodmFyIGtleSBpbiBtYXApIHZhbHVlcy5wdXNoKG1hcFtrZXldKTsKICAgICAgcmV0dXJuIHZhbHVlczsKICAgIH0KCiAgICBmdW5jdGlvbiBlbnRyaWVzJDEobWFwKSB7CiAgICAgIHZhciBlbnRyaWVzID0gW107CiAgICAgIGZvciAodmFyIGtleSBpbiBtYXApIGVudHJpZXMucHVzaCh7a2V5OiBrZXksIHZhbHVlOiBtYXBba2V5XX0pOwogICAgICByZXR1cm4gZW50cmllczsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZpbmUkMihjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7CiAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRlbmQkMihwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7CiAgICAgIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTsKICAgICAgcmV0dXJuIHByb3RvdHlwZTsKICAgIH0KCiAgICBmdW5jdGlvbiBDb2xvciQyKCkge30KCiAgICB2YXIgZGFya2VyJDIgPSAwLjc7CiAgICB2YXIgYnJpZ2h0ZXIkMiA9IDEgLyBkYXJrZXIkMjsKCiAgICB2YXIgcmVJJDIgPSAiXFxzKihbKy1dP1xcZCspXFxzKiIsCiAgICAgICAgcmVOJDIgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgICAgICByZVAkMiA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIiwKICAgICAgICByZUhleDMgPSAvXiMoWzAtOWEtZl17M30pJC8sCiAgICAgICAgcmVIZXg2ID0gL14jKFswLTlhLWZdezZ9KSQvLAogICAgICAgIHJlUmdiSW50ZWdlciQyID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVJJDIsIHJlSSQyLCByZUkkMl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiUGVyY2VudCQyID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVQJDIsIHJlUCQyLCByZVAkMl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiYUludGVnZXIkMiA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZUkkMiwgcmVJJDIsIHJlSSQyLCByZU4kMl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiYVBlcmNlbnQkMiA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZVAkMiwgcmVQJDIsIHJlUCQyLCByZU4kMl0gKyAiXFwpJCIpLAogICAgICAgIHJlSHNsUGVyY2VudCQyID0gbmV3IFJlZ0V4cCgiXmhzbFxcKCIgKyBbcmVOJDIsIHJlUCQyLCByZVAkMl0gKyAiXFwpJCIpLAogICAgICAgIHJlSHNsYVBlcmNlbnQkMiA9IG5ldyBSZWdFeHAoIl5oc2xhXFwoIiArIFtyZU4kMiwgcmVQJDIsIHJlUCQyLCByZU4kMl0gKyAiXFwpJCIpOwoKICAgIHZhciBuYW1lZCQyID0gewogICAgICBhbGljZWJsdWU6IDB4ZjBmOGZmLAogICAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgICBhcXVhOiAweDAwZmZmZiwKICAgICAgYXF1YW1hcmluZTogMHg3ZmZmZDQsCiAgICAgIGF6dXJlOiAweGYwZmZmZiwKICAgICAgYmVpZ2U6IDB4ZjVmNWRjLAogICAgICBiaXNxdWU6IDB4ZmZlNGM0LAogICAgICBibGFjazogMHgwMDAwMDAsCiAgICAgIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCwKICAgICAgYmx1ZTogMHgwMDAwZmYsCiAgICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgICBicm93bjogMHhhNTJhMmEsCiAgICAgIGJ1cmx5d29vZDogMHhkZWI4ODcsCiAgICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICAgIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLAogICAgICBjaG9jb2xhdGU6IDB4ZDI2OTFlLAogICAgICBjb3JhbDogMHhmZjdmNTAsCiAgICAgIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCwKICAgICAgY29ybnNpbGs6IDB4ZmZmOGRjLAogICAgICBjcmltc29uOiAweGRjMTQzYywKICAgICAgY3lhbjogMHgwMGZmZmYsCiAgICAgIGRhcmtibHVlOiAweDAwMDA4YiwKICAgICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYiwKICAgICAgZGFya2dyYXk6IDB4YTlhOWE5LAogICAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgICBkYXJrZ3JleTogMHhhOWE5YTksCiAgICAgIGRhcmtraGFraTogMHhiZGI3NmIsCiAgICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgICAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLAogICAgICBkYXJrb3JhbmdlOiAweGZmOGMwMCwKICAgICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICAgIGRhcmtyZWQ6IDB4OGIwMDAwLAogICAgICBkYXJrc2FsbW9uOiAweGU5OTY3YSwKICAgICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgICAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsCiAgICAgIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLAogICAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgICAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsCiAgICAgIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLAogICAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICAgIGRlZXBza3libHVlOiAweDAwYmZmZiwKICAgICAgZGltZ3JheTogMHg2OTY5NjksCiAgICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgICBkb2RnZXJibHVlOiAweDFlOTBmZiwKICAgICAgZmlyZWJyaWNrOiAweGIyMjIyMiwKICAgICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsCiAgICAgIGZ1Y2hzaWE6IDB4ZmYwMGZmLAogICAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgICBnaG9zdHdoaXRlOiAweGY4ZjhmZiwKICAgICAgZ29sZDogMHhmZmQ3MDAsCiAgICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICAgIGdyYXk6IDB4ODA4MDgwLAogICAgICBncmVlbjogMHgwMDgwMDAsCiAgICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgICAgZ3JleTogMHg4MDgwODAsCiAgICAgIGhvbmV5ZGV3OiAweGYwZmZmMCwKICAgICAgaG90cGluazogMHhmZjY5YjQsCiAgICAgIGluZGlhbnJlZDogMHhjZDVjNWMsCiAgICAgIGluZGlnbzogMHg0YjAwODIsCiAgICAgIGl2b3J5OiAweGZmZmZmMCwKICAgICAga2hha2k6IDB4ZjBlNjhjLAogICAgICBsYXZlbmRlcjogMHhlNmU2ZmEsCiAgICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgICBsYXduZ3JlZW46IDB4N2NmYzAwLAogICAgICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLAogICAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgICBsaWdodGNvcmFsOiAweGYwODA4MCwKICAgICAgbGlnaHRjeWFuOiAweGUwZmZmZiwKICAgICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgICBsaWdodGdyYXk6IDB4ZDNkM2QzLAogICAgICBsaWdodGdyZWVuOiAweDkwZWU5MCwKICAgICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgICAgbGlnaHRwaW5rOiAweGZmYjZjMSwKICAgICAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLAogICAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgICAgbGlnaHRza3libHVlOiAweDg3Y2VmYSwKICAgICAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LAogICAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICAgIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSwKICAgICAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLAogICAgICBsaW1lOiAweDAwZmYwMCwKICAgICAgbGltZWdyZWVuOiAweDMyY2QzMiwKICAgICAgbGluZW46IDB4ZmFmMGU2LAogICAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgICAgbWFyb29uOiAweDgwMDAwMCwKICAgICAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsCiAgICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLAogICAgICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLAogICAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICAgIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsCiAgICAgIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwKICAgICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgICAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSwKICAgICAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwKICAgICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgICAgbWlzdHlyb3NlOiAweGZmZTRlMSwKICAgICAgbW9jY2FzaW46IDB4ZmZlNGI1LAogICAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICAgIG5hdnk6IDB4MDAwMDgwLAogICAgICBvbGRsYWNlOiAweGZkZjVlNiwKICAgICAgb2xpdmU6IDB4ODA4MDAwLAogICAgICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLAogICAgICBvcmFuZ2U6IDB4ZmZhNTAwLAogICAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgICBvcmNoaWQ6IDB4ZGE3MGQ2LAogICAgICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwKICAgICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgICAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsCiAgICAgIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLAogICAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgICAgcGVhY2hwdWZmOiAweGZmZGFiOSwKICAgICAgcGVydTogMHhjZDg1M2YsCiAgICAgIHBpbms6IDB4ZmZjMGNiLAogICAgICBwbHVtOiAweGRkYTBkZCwKICAgICAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsCiAgICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICAgIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LAogICAgICByZWQ6IDB4ZmYwMDAwLAogICAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgICByb3lhbGJsdWU6IDB4NDE2OWUxLAogICAgICBzYWRkbGVicm93bjogMHg4YjQ1MTMsCiAgICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICAgIHNhbmR5YnJvd246IDB4ZjRhNDYwLAogICAgICBzZWFncmVlbjogMHgyZThiNTcsCiAgICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgICAgc2llbm5hOiAweGEwNTIyZCwKICAgICAgc2lsdmVyOiAweGMwYzBjMCwKICAgICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICAgIHNsYXRlYmx1ZTogMHg2YTVhY2QsCiAgICAgIHNsYXRlZ3JheTogMHg3MDgwOTAsCiAgICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICAgIHNub3c6IDB4ZmZmYWZhLAogICAgICBzcHJpbmdncmVlbjogMHgwMGZmN2YsCiAgICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICAgIHRhbjogMHhkMmI0OGMsCiAgICAgIHRlYWw6IDB4MDA4MDgwLAogICAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgICAgdG9tYXRvOiAweGZmNjM0NywKICAgICAgdHVycXVvaXNlOiAweDQwZTBkMCwKICAgICAgdmlvbGV0OiAweGVlODJlZSwKICAgICAgd2hlYXQ6IDB4ZjVkZWIzLAogICAgICB3aGl0ZTogMHhmZmZmZmYsCiAgICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgICB5ZWxsb3c6IDB4ZmZmZjAwLAogICAgICB5ZWxsb3dncmVlbjogMHg5YWNkMzIKICAgIH07CgogICAgZGVmaW5lJDIoQ29sb3IkMiwgY29sb3IkMiwgewogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJnYigpICsgIiI7CiAgICAgIH0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIGNvbG9yJDIoZm9ybWF0KSB7CiAgICAgIHZhciBtOwogICAgICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gKG0gPSByZUhleDMuZXhlYyhmb3JtYXQpKSA/IChtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBuZXcgUmdiJDIoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHgwZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpKSAvLyAjZjAwCiAgICAgICAgICA6IChtID0gcmVIZXg2LmV4ZWMoZm9ybWF0KSkgPyByZ2JuJDIocGFyc2VJbnQobVsxXSwgMTYpKSAvLyAjZmYwMDAwCiAgICAgICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyJDIuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IkMihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKQogICAgICAgICAgOiAobSA9IHJlUmdiUGVyY2VudCQyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiJDIobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkKICAgICAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyJDIuZXhlYyhmb3JtYXQpKSA/IHJnYmEkMihtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSkKICAgICAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50JDIuZXhlYyhmb3JtYXQpKSA/IHJnYmEkMihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKQogICAgICAgICAgOiAobSA9IHJlSHNsUGVyY2VudCQyLmV4ZWMoZm9ybWF0KSkgPyBoc2xhJDIobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpCiAgICAgICAgICA6IChtID0gcmVIc2xhUGVyY2VudCQyLmV4ZWMoZm9ybWF0KSkgPyBoc2xhJDIobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKQogICAgICAgICAgOiBuYW1lZCQyLmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuJDIobmFtZWQkMltmb3JtYXRdKQogICAgICAgICAgOiBmb3JtYXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiJDIoTmFOLCBOYU4sIE5hTiwgMCkKICAgICAgICAgIDogbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JuJDIobikgewogICAgICByZXR1cm4gbmV3IFJnYiQyKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiYSQyKHIsIGcsIGIsIGEpIHsKICAgICAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogICAgICByZXR1cm4gbmV3IFJnYiQyKHIsIGcsIGIsIGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYkNvbnZlcnQkMihvKSB7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvciQyKSkgbyA9IGNvbG9yJDIobyk7CiAgICAgIGlmICghbykgcmV0dXJuIG5ldyBSZ2IkMjsKICAgICAgbyA9IG8ucmdiKCk7CiAgICAgIHJldHVybiBuZXcgUmdiJDIoby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2IkMihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydCQyKHIpIDogbmV3IFJnYiQyKHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBSZ2IkMihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICAgIHRoaXMuciA9ICtyOwogICAgICB0aGlzLmcgPSArZzsKICAgICAgdGhpcy5iID0gK2I7CiAgICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogICAgfQoKICAgIGRlZmluZSQyKFJnYiQyLCByZ2IkMiwgZXh0ZW5kJDIoQ29sb3IkMiwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciQyIDogTWF0aC5wb3coYnJpZ2h0ZXIkMiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkMih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gZGFya2VyJDIgOiBNYXRoLnBvdyhkYXJrZXIkMiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkMih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgwIDw9IHRoaXMuciAmJiB0aGlzLnIgPD0gMjU1KQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLmcgJiYgdGhpcy5nIDw9IDI1NSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5iICYmIHRoaXMuYiA8PSAyNTUpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7CiAgICAgIH0sCiAgICAgIHRvU3RyaW5nOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsKICAgICAgICByZXR1cm4gKGEgPT09IDEgPyAicmdiKCIgOiAicmdiYSgiKQogICAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyAiLCAiCiAgICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpCiAgICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICAgIH0KICAgIH0pKTsKCiAgICBmdW5jdGlvbiBoc2xhJDIoaCwgcywgbCwgYSkgewogICAgICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47CiAgICAgIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOOwogICAgICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICAgIHJldHVybiBuZXcgSHNsJDIoaCwgcywgbCwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsQ29udmVydCQyKG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wkMikgcmV0dXJuIG5ldyBIc2wkMihvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOwogICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IkMikpIG8gPSBjb2xvciQyKG8pOwogICAgICBpZiAoIW8pIHJldHVybiBuZXcgSHNsJDI7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgSHNsJDIpIHJldHVybiBvOwogICAgICBvID0gby5yZ2IoKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksCiAgICAgICAgICBoID0gTmFOLAogICAgICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7CiAgICAgIGlmIChzKSB7CiAgICAgICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICAgICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyOwogICAgICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDsKICAgICAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgICAgIGggKj0gNjA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBIc2wkMihoLCBzLCBsLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhzbCQ0KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0JDIoaCkgOiBuZXcgSHNsJDIoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIEhzbCQyKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5oID0gK2g7CiAgICAgIHRoaXMucyA9ICtzOwogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDIoSHNsJDIsIGhzbCQ0LCBleHRlbmQkMihDb2xvciQyLCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyJDIgOiBNYXRoLnBvdyhicmlnaHRlciQyLCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCQyKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gZGFya2VyJDIgOiBNYXRoLnBvdyhkYXJrZXIkMiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBIc2wkMih0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCwKICAgICAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLAogICAgICAgICAgICBsID0gdGhpcy5sLAogICAgICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLAogICAgICAgICAgICBtMSA9IDIgKiBsIC0gbTI7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkMigKICAgICAgICAgIGhzbDJyZ2IkMihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYiQyKGgsIG0xLCBtMiksCiAgICAgICAgICBoc2wycmdiJDIoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLAogICAgICAgICAgdGhpcy5vcGFjaXR5CiAgICAgICAgKTsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9CiAgICB9KSk7CgogICAgLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwogICAgZnVuY3Rpb24gaHNsMnJnYiQyKGgsIG0xLCBtMikgewogICAgICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwCiAgICAgICAgICA6IGggPCAxODAgPyBtMgogICAgICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MAogICAgICAgICAgOiBtMSkgKiAyNTU7CiAgICB9CgogICAgdmFyIGRlZzJyYWQkMSA9IE1hdGguUEkgLyAxODA7CiAgICB2YXIgcmFkMmRlZyQxID0gMTgwIC8gTWF0aC5QSTsKCiAgICB2YXIgS24gPSAxOCwKICAgICAgICBYbiQxID0gMC45NTA0NzAsIC8vIEQ2NSBzdGFuZGFyZCByZWZlcmVudAogICAgICAgIFluJDEgPSAxLAogICAgICAgIFpuJDEgPSAxLjA4ODgzMCwKICAgICAgICB0MCQyID0gNCAvIDI5LAogICAgICAgIHQxJDIgPSA2IC8gMjksCiAgICAgICAgdDIkMSA9IDMgKiB0MSQyICogdDEkMiwKICAgICAgICB0MyQxID0gdDEkMiAqIHQxJDIgKiB0MSQyOwoKICAgIGZ1bmN0aW9uIGxhYkNvbnZlcnQkMShvKSB7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgTGFiJDEpIHJldHVybiBuZXcgTGFiJDEoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIY2wkMSkgewogICAgICAgIHZhciBoID0gby5oICogZGVnMnJhZCQxOwogICAgICAgIHJldHVybiBuZXcgTGFiJDEoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7CiAgICAgIH0KICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYiQyKSkgbyA9IHJnYkNvbnZlcnQkMihvKTsKICAgICAgdmFyIGIgPSByZ2IyeHl6KG8uciksCiAgICAgICAgICBhID0gcmdiMnh5eihvLmcpLAogICAgICAgICAgbCA9IHJnYjJ4eXooby5iKSwKICAgICAgICAgIHggPSB4eXoybGFiJDEoKDAuNDEyNDU2NCAqIGIgKyAwLjM1NzU3NjEgKiBhICsgMC4xODA0Mzc1ICogbCkgLyBYbiQxKSwKICAgICAgICAgIHkgPSB4eXoybGFiJDEoKDAuMjEyNjcyOSAqIGIgKyAwLjcxNTE1MjIgKiBhICsgMC4wNzIxNzUwICogbCkgLyBZbiQxKSwKICAgICAgICAgIHogPSB4eXoybGFiJDEoKDAuMDE5MzMzOSAqIGIgKyAwLjExOTE5MjAgKiBhICsgMC45NTAzMDQxICogbCkgLyBabiQxKTsKICAgICAgcmV0dXJuIG5ldyBMYWIkMSgxMTYgKiB5IC0gMTYsIDUwMCAqICh4IC0geSksIDIwMCAqICh5IC0geiksIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGFiJDIobCwgYSwgYiwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGxhYkNvbnZlcnQkMShsKSA6IG5ldyBMYWIkMShsLCBhLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gTGFiJDEobCwgYSwgYiwgb3BhY2l0eSkgewogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5hID0gK2E7CiAgICAgIHRoaXMuYiA9ICtiOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUkMihMYWIkMSwgbGFiJDIsIGV4dGVuZCQyKENvbG9yJDIsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICByZXR1cm4gbmV3IExhYiQxKHRoaXMubCArIEtuICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5hLCB0aGlzLmIsIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiBuZXcgTGFiJDEodGhpcy5sIC0gS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsCiAgICAgICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsCiAgICAgICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7CiAgICAgICAgeSA9IFluJDEgKiBsYWIyeHl6JDEoeSk7CiAgICAgICAgeCA9IFhuJDEgKiBsYWIyeHl6JDEoeCk7CiAgICAgICAgeiA9IFpuJDEgKiBsYWIyeHl6JDEoeik7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkMigKICAgICAgICAgIHh5ejJyZ2IoIDMuMjQwNDU0MiAqIHggLSAxLjUzNzEzODUgKiB5IC0gMC40OTg1MzE0ICogeiksIC8vIEQ2NSAtPiBzUkdCCiAgICAgICAgICB4eXoycmdiKC0wLjk2OTI2NjAgKiB4ICsgMS44NzYwMTA4ICogeSArIDAuMDQxNTU2MCAqIHopLAogICAgICAgICAgeHl6MnJnYiggMC4wNTU2NDM0ICogeCAtIDAuMjA0MDI1OSAqIHkgKyAxLjA1NzIyNTIgKiB6KSwKICAgICAgICAgIHRoaXMub3BhY2l0eQogICAgICAgICk7CiAgICAgIH0KICAgIH0pKTsKCiAgICBmdW5jdGlvbiB4eXoybGFiJDEodCkgewogICAgICByZXR1cm4gdCA+IHQzJDEgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIkMSArIHQwJDI7CiAgICB9CgogICAgZnVuY3Rpb24gbGFiMnh5eiQxKHQpIHsKICAgICAgcmV0dXJuIHQgPiB0MSQyID8gdCAqIHQgKiB0IDogdDIkMSAqICh0IC0gdDAkMik7CiAgICB9CgogICAgZnVuY3Rpb24geHl6MnJnYih4KSB7CiAgICAgIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYjJ4eXooeCkgewogICAgICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2xDb252ZXJ0JDEobykgewogICAgICBpZiAobyBpbnN0YW5jZW9mIEhjbCQxKSByZXR1cm4gbmV3IEhjbCQxKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBMYWIkMSkpIG8gPSBsYWJDb252ZXJ0JDEobyk7CiAgICAgIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnJDE7CiAgICAgIHJldHVybiBuZXcgSGNsJDEoaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2wkMyhoLCBjLCBsLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydCQxKGgpIDogbmV3IEhjbCQxKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBIY2wkMShoLCBjLCBsLCBvcGFjaXR5KSB7CiAgICAgIHRoaXMuaCA9ICtoOwogICAgICB0aGlzLmMgPSArYzsKICAgICAgdGhpcy5sID0gK2w7CiAgICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogICAgfQoKICAgIGRlZmluZSQyKEhjbCQxLCBoY2wkMywgZXh0ZW5kJDIoQ29sb3IkMiwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIHJldHVybiBuZXcgSGNsJDEodGhpcy5oLCB0aGlzLmMsIHRoaXMubCArIEtuICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBIY2wkMSh0aGlzLmgsIHRoaXMuYywgdGhpcy5sIC0gS24gKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBsYWJDb252ZXJ0JDEodGhpcykucmdiKCk7CiAgICAgIH0KICAgIH0pKTsKCiAgICB2YXIgQSQxID0gLTAuMTQ4NjEsCiAgICAgICAgQiQxID0gKzEuNzgyNzcsCiAgICAgICAgQyQxID0gLTAuMjkyMjcsCiAgICAgICAgRCQxID0gLTAuOTA2NDksCiAgICAgICAgRSQxID0gKzEuOTcyOTQsCiAgICAgICAgRUQkMSA9IEUkMSAqIEQkMSwKICAgICAgICBFQiQxID0gRSQxICogQiQxLAogICAgICAgIEJDX0RBJDEgPSBCJDEgKiBDJDEgLSBEJDEgKiBBJDE7CgogICAgZnVuY3Rpb24gY3ViZWhlbGl4Q29udmVydCQxKG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBDdWJlaGVsaXgkMSkgcmV0dXJuIG5ldyBDdWJlaGVsaXgkMShvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOwogICAgICBpZiAoIShvIGluc3RhbmNlb2YgUmdiJDIpKSBvID0gcmdiQ29udmVydCQyKG8pOwogICAgICB2YXIgciA9IG8uciAvIDI1NSwKICAgICAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgICAgICBiID0gby5iIC8gMjU1LAogICAgICAgICAgbCA9IChCQ19EQSQxICogYiArIEVEJDEgKiByIC0gRUIkMSAqIGcpIC8gKEJDX0RBJDEgKyBFRCQxIC0gRUIkMSksCiAgICAgICAgICBibCA9IGIgLSBsLAogICAgICAgICAgayA9IChFJDEgKiAoZyAtIGwpIC0gQyQxICogYmwpIC8gRCQxLAogICAgICAgICAgcyA9IE1hdGguc3FydChrICogayArIGJsICogYmwpIC8gKEUkMSAqIGwgKiAoMSAtIGwpKSwgLy8gTmFOIGlmIGw9MCBvciBsPTEKICAgICAgICAgIGggPSBzID8gTWF0aC5hdGFuMihrLCBibCkgKiByYWQyZGVnJDEgLSAxMjAgOiBOYU47CiAgICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4JDEoaCA8IDAgPyBoICsgMzYwIDogaCwgcywgbCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjdWJlaGVsaXgkNChoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gY3ViZWhlbGl4Q29udmVydCQxKGgpIDogbmV3IEN1YmVoZWxpeCQxKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBDdWJlaGVsaXgkMShoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICAgIHRoaXMuaCA9ICtoOwogICAgICB0aGlzLnMgPSArczsKICAgICAgdGhpcy5sID0gK2w7CiAgICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogICAgfQoKICAgIGRlZmluZSQyKEN1YmVoZWxpeCQxLCBjdWJlaGVsaXgkNCwgZXh0ZW5kJDIoQ29sb3IkMiwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciQyIDogTWF0aC5wb3coYnJpZ2h0ZXIkMiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgkMSh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciQyIDogTWF0aC5wb3coZGFya2VyJDIsIGspOwogICAgICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4JDEodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIHJnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGggPSBpc05hTih0aGlzLmgpID8gMCA6ICh0aGlzLmggKyAxMjApICogZGVnMnJhZCQxLAogICAgICAgICAgICBsID0gK3RoaXMubCwKICAgICAgICAgICAgYSA9IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zICogbCAqICgxIC0gbCksCiAgICAgICAgICAgIGNvc2ggPSBNYXRoLmNvcyhoKSwKICAgICAgICAgICAgc2luaCA9IE1hdGguc2luKGgpOwogICAgICAgIHJldHVybiBuZXcgUmdiJDIoCiAgICAgICAgICAyNTUgKiAobCArIGEgKiAoQSQxICogY29zaCArIEIkMSAqIHNpbmgpKSwKICAgICAgICAgIDI1NSAqIChsICsgYSAqIChDJDEgKiBjb3NoICsgRCQxICogc2luaCkpLAogICAgICAgICAgMjU1ICogKGwgKyBhICogKEUkMSAqIGNvc2gpKSwKICAgICAgICAgIHRoaXMub3BhY2l0eQogICAgICAgICk7CiAgICAgIH0KICAgIH0pKTsKCiAgICB2YXIgbm9vcCQ1ID0ge3ZhbHVlOiBmdW5jdGlvbigpIHt9fTsKCiAgICBmdW5jdGlvbiBkaXNwYXRjaCQyKCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyAiIikgfHwgKHQgaW4gXykpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgICAgX1t0XSA9IFtdOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGlzcGF0Y2gkMihfKTsKICAgIH0KCiAgICBmdW5jdGlvbiBEaXNwYXRjaCQyKF8pIHsKICAgICAgdGhpcy5fID0gXzsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyQ0KHR5cGVuYW1lcywgdHlwZXMpIHsKICAgICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTsKICAgICAgfSk7CiAgICB9CgogICAgRGlzcGF0Y2gkMi5wcm90b3R5cGUgPSBkaXNwYXRjaCQyLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IERpc3BhdGNoJDIsCiAgICAgIG9uOiBmdW5jdGlvbih0eXBlbmFtZSwgY2FsbGJhY2spIHsKICAgICAgICB2YXIgXyA9IHRoaXMuXywKICAgICAgICAgICAgVCA9IHBhcnNlVHlwZW5hbWVzJDQodHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgICAgIHQsCiAgICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLgogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0JDUoX1t0XSwgdHlwZW5hbWUubmFtZSkpKSByZXR1cm4gdDsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIElmIGEgdHlwZSB3YXMgc3BlY2lmaWVkLCBzZXQgdGhlIGNhbGxiYWNrIGZvciB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgICAvLyBPdGhlcndpc2UsIGlmIGEgbnVsbCBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZW1vdmUgY2FsbGJhY2tzIG9mIHRoZSBnaXZlbiBuYW1lLgogICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICBpZiAodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpIF9bdF0gPSBzZXQkNyhfW3RdLCB0eXBlbmFtZS5uYW1lLCBjYWxsYmFjayk7CiAgICAgICAgICBlbHNlIGlmIChjYWxsYmFjayA9PSBudWxsKSBmb3IgKHQgaW4gXykgX1t0XSA9IHNldCQ3KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87CiAgICAgICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpOwogICAgICAgIHJldHVybiBuZXcgRGlzcGF0Y2gkMihjb3B5KTsKICAgICAgfSwKICAgICAgY2FsbDogZnVuY3Rpb24odHlwZSwgdGhhdCkgewogICAgICAgIGlmICgobiA9IGFyZ3VtZW50cy5sZW5ndGggLSAyKSA+IDApIGZvciAodmFyIGFyZ3MgPSBuZXcgQXJyYXkobiksIGkgPSAwLCBuLCB0OyBpIDwgbjsgKytpKSBhcmdzW2ldID0gYXJndW1lbnRzW2kgKyAyXTsKICAgICAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICBmb3IgKHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0sCiAgICAgIGFwcGx5OiBmdW5jdGlvbih0eXBlLCB0aGF0LCBhcmdzKSB7CiAgICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgZm9yICh2YXIgdCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBnZXQkNSh0eXBlLCBuYW1lKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGgsIGM7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKGMgPSB0eXBlW2ldKS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICByZXR1cm4gYy52YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZXQkNyh0eXBlLCBuYW1lLCBjYWxsYmFjaykgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgdHlwZVtpXSA9IG5vb3AkNSwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgdmFyIG5vb3AkNiA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7fX07CgogICAgZnVuY3Rpb24gZGlzcGF0Y2gkMygpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8ICh0IGluIF8pIHx8IC9bXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIgKyB0KTsKICAgICAgICBfW3RdID0gW107CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaCQzKF8pOwogICAgfQoKICAgIGZ1bmN0aW9uIERpc3BhdGNoJDMoXykgewogICAgICB0aGlzLl8gPSBfOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDUodHlwZW5hbWVzLCB0eXBlcykgewogICAgICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCkgewogICAgICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0KTsKICAgICAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogICAgICB9KTsKICAgIH0KCiAgICBEaXNwYXRjaCQzLnByb3RvdHlwZSA9IGRpc3BhdGNoJDMucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gkMywKICAgICAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIHZhciBfID0gdGhpcy5fLAogICAgICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXMkNSh0eXBlbmFtZSArICIiLCBfKSwKICAgICAgICAgICAgdCwKICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICBuID0gVC5sZW5ndGg7CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQkNihfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLgogICAgICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuCiAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldCQ4KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JDgoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXzsKICAgICAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaCQzKGNvcHkpOwogICAgICB9LAogICAgICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7CiAgICAgICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdOwogICAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfSwKICAgICAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHsKICAgICAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldCQ2KHR5cGUsIG5hbWUpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiBjLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldCQ4KHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICB0eXBlW2ldID0gbm9vcCQ2LCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0KCiAgICB2YXIgeGh0bWwkMiA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsKCiAgICB2YXIgbmFtZXNwYWNlcyQyID0gewogICAgICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAgIHhodG1sOiB4aHRtbCQyLAogICAgICB4bGluazogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLAogICAgICB4bWw6ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAogICAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogICAgfTsKCiAgICBmdW5jdGlvbiBuYW1lc3BhY2UkMihuYW1lKSB7CiAgICAgIHZhciBwcmVmaXggPSBuYW1lICs9ICIiLCBpID0gcHJlZml4LmluZGV4T2YoIjoiKTsKICAgICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgICAgcmV0dXJuIG5hbWVzcGFjZXMkMi5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzJDJbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdCQyKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7CiAgICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwkMiAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbCQyCiAgICAgICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKQogICAgICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3JGaXhlZCQyKGZ1bGxuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3IkMihuYW1lKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQyKG5hbWUpOwogICAgICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsCiAgICAgICAgICA/IGNyZWF0b3JGaXhlZCQyCiAgICAgICAgICA6IGNyZWF0b3JJbmhlcml0JDIpKGZ1bGxuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub25lJDQoKSB7fQoKICAgIGZ1bmN0aW9uIHNlbGVjdG9yJDIoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lJDQgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0JDIoc2VsZWN0KSB7CiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvciQyKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNChzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVtcHR5JDQoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RvckFsbCQyKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkkNCA6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwkMihzZWxlY3QpIHsKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsJDIoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDQoc3ViZ3JvdXBzLCBwYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtYXRjaGVyJDIoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9maWx0ZXIkMihtYXRjaCkgewogICAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIkMihtYXRjaCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDQoc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzcGFyc2UkMih1cGRhdGUpIHsKICAgICAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIkMigpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNCh0aGlzLl9lbnRlciB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSQyKSwgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gRW50ZXJOb2RlJDIocGFyZW50LCBkYXR1bSkgewogICAgICB0aGlzLm93bmVyRG9jdW1lbnQgPSBwYXJlbnQub3duZXJEb2N1bWVudDsKICAgICAgdGhpcy5uYW1lc3BhY2VVUkkgPSBwYXJlbnQubmFtZXNwYWNlVVJJOwogICAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwogICAgICB0aGlzLl9fZGF0YV9fID0gZGF0dW07CiAgICB9CgogICAgRW50ZXJOb2RlJDIucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogRW50ZXJOb2RlJDIsCiAgICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sCiAgICAgIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LAogICAgICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAogICAgICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JGooeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGtleVByZWZpeCQzID0gIiQiOyAvLyBQcm90ZWN0IGFnYWluc3Qga2V5cyBsaWtlIOKAnF9fcHJvdG9fX+KAnS4KCiAgICBmdW5jdGlvbiBiaW5kSW5kZXgkMihwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhKSB7CiAgICAgIHZhciBpID0gMCwKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwKICAgICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKCiAgICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBmaXQgaW50byB1cGRhdGUuCiAgICAgIC8vIFB1dCBhbnkgbnVsbCBub2RlcyBpbnRvIGVudGVyLgogICAgICAvLyBQdXQgYW55IHJlbWFpbmluZyBkYXRhIGludG8gZW50ZXIuCiAgICAgIGZvciAoOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUkMihwYXJlbnQsIGRhdGFbaV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC4KICAgICAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYmluZEtleSQyKHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEsIGtleSkgewogICAgICB2YXIgaSwKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBub2RlQnlLZXlWYWx1ZSA9IHt9LAogICAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICBrZXlWYWx1ZXMgPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpLAogICAgICAgICAga2V5VmFsdWU7CgogICAgICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggbm9kZS4KICAgICAgLy8gSWYgbXVsdGlwbGUgbm9kZXMgaGF2ZSB0aGUgc2FtZSBrZXksIHRoZSBkdXBsaWNhdGVzIGFyZSBhZGRlZCB0byBleGl0LgogICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIGtleVZhbHVlc1tpXSA9IGtleVZhbHVlID0ga2V5UHJlZml4JDMgKyBrZXkuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgICAgICBpZiAoa2V5VmFsdWUgaW4gbm9kZUJ5S2V5VmFsdWUpIHsKICAgICAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIGRhdHVtLgogICAgICAvLyBJZiB0aGVyZSBhIG5vZGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMga2V5LCBqb2luIGFuZCBhZGQgaXQgdG8gdXBkYXRlLgogICAgICAvLyBJZiB0aGVyZSBpcyBub3QgKG9yIHRoZSBrZXkgaXMgYSBkdXBsaWNhdGUpLCBhZGQgaXQgdG8gZW50ZXIuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgICAgICBrZXlWYWx1ZSA9IGtleVByZWZpeCQzICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTsKICAgICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgewogICAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlJDIocGFyZW50LCBkYXRhW2ldKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEFkZCBhbnkgcmVtYWluaW5nIG5vZGVzIHRoYXQgd2VyZSBub3QgYm91bmQgdG8gZGF0YSB0byBleGl0LgogICAgICBmb3IgKGkgPSAwOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAobm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVzW2ldXSA9PT0gbm9kZSkpIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kYXRhJDIodmFsdWUsIGtleSkgewogICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgZGF0YSA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGogPSAtMTsKICAgICAgICB0aGlzLmVhY2goZnVuY3Rpb24oZCkgeyBkYXRhWysral0gPSBkOyB9KTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgICAgfQoKICAgICAgdmFyIGJpbmQgPSBrZXkgPyBiaW5kS2V5JDIgOiBiaW5kSW5kZXgkMiwKICAgICAgICAgIHBhcmVudHMgPSB0aGlzLl9wYXJlbnRzLAogICAgICAgICAgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzOwoKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdmFsdWUgPSBjb25zdGFudCRqKHZhbHVlKTsKCiAgICAgIGZvciAodmFyIG0gPSBncm91cHMubGVuZ3RoLCB1cGRhdGUgPSBuZXcgQXJyYXkobSksIGVudGVyID0gbmV3IEFycmF5KG0pLCBleGl0ID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIHZhciBwYXJlbnQgPSBwYXJlbnRzW2pdLAogICAgICAgICAgICBncm91cCA9IGdyb3Vwc1tqXSwKICAgICAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAgICAgIGRhdGEgPSB2YWx1ZS5jYWxsKHBhcmVudCwgcGFyZW50ICYmIHBhcmVudC5fX2RhdGFfXywgaiwgcGFyZW50cyksCiAgICAgICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgZW50ZXJHcm91cCA9IGVudGVyW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgICAgICB1cGRhdGVHcm91cCA9IHVwZGF0ZVtqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwKICAgICAgICAgICAgZXhpdEdyb3VwID0gZXhpdFtqXSA9IG5ldyBBcnJheShncm91cExlbmd0aCk7CgogICAgICAgIGJpbmQocGFyZW50LCBncm91cCwgZW50ZXJHcm91cCwgdXBkYXRlR3JvdXAsIGV4aXRHcm91cCwgZGF0YSwga2V5KTsKCiAgICAgICAgLy8gTm93IGNvbm5lY3QgdGhlIGVudGVyIG5vZGVzIHRvIHRoZWlyIGZvbGxvd2luZyB1cGRhdGUgbm9kZSwgc3VjaCB0aGF0CiAgICAgICAgLy8gYXBwZW5kQ2hpbGQgY2FuIGluc2VydCB0aGUgbWF0ZXJpYWxpemVkIGVudGVyIG5vZGUgYmVmb3JlIHRoaXMgbm9kZSwKICAgICAgICAvLyByYXRoZXIgdGhhbiBhdCB0aGUgZW5kIG9mIHRoZSBwYXJlbnQgbm9kZS4KICAgICAgICBmb3IgKHZhciBpMCA9IDAsIGkxID0gMCwgcHJldmlvdXMsIG5leHQ7IGkwIDwgZGF0YUxlbmd0aDsgKytpMCkgewogICAgICAgICAgaWYgKHByZXZpb3VzID0gZW50ZXJHcm91cFtpMF0pIHsKICAgICAgICAgICAgaWYgKGkwID49IGkxKSBpMSA9IGkwICsgMTsKICAgICAgICAgICAgd2hpbGUgKCEobmV4dCA9IHVwZGF0ZUdyb3VwW2kxXSkgJiYgKytpMSA8IGRhdGFMZW5ndGgpOwogICAgICAgICAgICBwcmV2aW91cy5fbmV4dCA9IG5leHQgfHwgbnVsbDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHVwZGF0ZSA9IG5ldyBTZWxlY3Rpb24kNCh1cGRhdGUsIHBhcmVudHMpOwogICAgICB1cGRhdGUuX2VudGVyID0gZW50ZXI7CiAgICAgIHVwZGF0ZS5fZXhpdCA9IGV4aXQ7CiAgICAgIHJldHVybiB1cGRhdGU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2V4aXQkMigpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNCh0aGlzLl9leGl0IHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlJDIpLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fam9pbiQyKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHsKICAgICAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7CiAgICAgIGVudGVyID0gdHlwZW9mIG9uZW50ZXIgPT09ICJmdW5jdGlvbiIgPyBvbmVudGVyKGVudGVyKSA6IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgICBpZiAob251cGRhdGUgIT0gbnVsbCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTsKICAgICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbWVyZ2UkMihzZWxlY3Rpb24pIHsKCiAgICAgIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSBzZWxlY3Rpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICAgIG1lcmdlW2ldID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoOyBqIDwgbTA7ICsraikgewogICAgICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDQobWVyZ2VzLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fb3JkZXIkMigpIHsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAgICAgICBuZXh0ID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zb3J0JDIoY29tcGFyZSkgewogICAgICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmckNzsKCiAgICAgIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNChzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZyQ3KGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jYWxsJDIoKSB7CiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsKICAgICAgYXJndW1lbnRzWzBdID0gdGhpczsKICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzJDIoKSB7CiAgICAgIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTsKICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbm9kZSQyKCkgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07CiAgICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2l6ZSQyKCkgewogICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTsKICAgICAgcmV0dXJuIHNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VtcHR5JDIoKSB7CiAgICAgIHJldHVybiAhdGhpcy5ub2RlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VhY2gkMihjYWxsYmFjaykgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZSQ0KG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmVOUyQ0KGZ1bGxuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50JDQobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQ0KGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24kNChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMkNChmdWxsbmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2F0dHIkMihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UkMihuYW1lKTsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CiAgICAgICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsCiAgICAgICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpCiAgICAgICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyQ0IDogYXR0clJlbW92ZSQ0KSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkNCA6IGF0dHJGdW5jdGlvbiQ0KQogICAgICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyQ0IDogYXR0ckNvbnN0YW50JDQpKSkoZnVsbG5hbWUsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFZpZXckMihub2RlKSB7CiAgICAgIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGUKICAgICAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3cKICAgICAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudAogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDQobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDQobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbiQ0KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICAgICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc3R5bGUkMihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSQ0IDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb24kNAogICAgICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50JDQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAgICAgICA6IHN0eWxlVmFsdWUkMih0aGlzLm5vZGUoKSwgbmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVWYWx1ZSQyKG5vZGUsIG5hbWUpIHsKICAgICAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKQogICAgICAgICAgfHwgZGVmYXVsdFZpZXckMihub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUkMihuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50JDIobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uJDIobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9wcm9wZXJ0eSQyKG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlJDIgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb24kMgogICAgICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCQyKShuYW1lLCB2YWx1ZSkpCiAgICAgICAgICA6IHRoaXMubm9kZSgpW25hbWVdOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzQXJyYXkkMihzdHJpbmcpIHsKICAgICAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NMaXN0JDIobm9kZSkgewogICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdCQyKG5vZGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIENsYXNzTGlzdCQyKG5vZGUpIHsKICAgICAgdGhpcy5fbm9kZSA9IG5vZGU7CiAgICAgIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheSQyKG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICAgIH0KCiAgICBDbGFzc0xpc3QkMi5wcm90b3R5cGUgPSB7CiAgICAgIGFkZDogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgICBpZiAoaSA8IDApIHsKICAgICAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICAgIGlmIChpID49IDApIHsKICAgICAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjb250YWluczogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY2xhc3NlZEFkZCQyKG5vZGUsIG5hbWVzKSB7CiAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0JDIobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlJDIobm9kZSwgbmFtZXMpIHsKICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QkMihub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRUcnVlJDIobmFtZXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGNsYXNzZWRBZGQkMih0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZEZhbHNlJDIobmFtZXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGNsYXNzZWRSZW1vdmUkMih0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uJDIobmFtZXMsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQkMiA6IGNsYXNzZWRSZW1vdmUkMikodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbGFzc2VkJDIobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIG5hbWVzID0gY2xhc3NBcnJheSQyKG5hbWUgKyAiIik7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCQyKHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBjbGFzc2VkRnVuY3Rpb24kMiA6IHZhbHVlCiAgICAgICAgICA/IGNsYXNzZWRUcnVlJDIKICAgICAgICAgIDogY2xhc3NlZEZhbHNlJDIpKG5hbWVzLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRSZW1vdmUkMigpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRDb25zdGFudCQ0KHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDQodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0JDIodmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IHRleHRSZW1vdmUkMiA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IHRleHRGdW5jdGlvbiQ0CiAgICAgICAgICAgICAgOiB0ZXh0Q29uc3RhbnQkNCkodmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sUmVtb3ZlJDIoKSB7CiAgICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbENvbnN0YW50JDIodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbEZ1bmN0aW9uJDIodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faHRtbCQyKHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyBodG1sUmVtb3ZlJDIgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBodG1sRnVuY3Rpb24kMgogICAgICAgICAgICAgIDogaHRtbENvbnN0YW50JDIpKHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhaXNlJDIoKSB7CiAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3JhaXNlJDIoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gocmFpc2UkMik7CiAgICB9CgogICAgZnVuY3Rpb24gbG93ZXIkMigpIHsKICAgICAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbG93ZXIkMigpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChsb3dlciQyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fYXBwZW5kJDIobmFtZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvciQyKG5hbWUpOwogICAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudE51bGwkMigpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydCQyKG5hbWUsIGJlZm9yZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvciQyKG5hbWUpLAogICAgICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwkMiA6IHR5cGVvZiBiZWZvcmUgPT09ICJmdW5jdGlvbiIgPyBiZWZvcmUgOiBzZWxlY3RvciQyKGJlZm9yZSk7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmUkMigpIHsKICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUkMigpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUkMik7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyQyKCkgewogICAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZShmYWxzZSksIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgcmV0dXJuIHBhcmVudCA/IHBhcmVudC5pbnNlcnRCZWZvcmUoY2xvbmUsIHRoaXMubmV4dFNpYmxpbmcpIDogY2xvbmU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lRGVlcCQyKCkgewogICAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmUkMihkZWVwKSB7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChkZWVwID8gc2VsZWN0aW9uX2Nsb25lRGVlcCQyIDogc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyQyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0kMih2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLnByb3BlcnR5KCJfX2RhdGFfXyIsIHZhbHVlKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS5fX2RhdGFfXzsKICAgIH0KCiAgICB2YXIgZmlsdGVyRXZlbnRzJDIgPSB7fTsKCiAgICB2YXIgZXZlbnQkMiA9IG51bGw7CgogICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgdmFyIGVsZW1lbnQkMiA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDsKICAgICAgaWYgKCEoIm9ubW91c2VlbnRlciIgaW4gZWxlbWVudCQyKSkgewogICAgICAgIGZpbHRlckV2ZW50cyQyID0ge21vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQifTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGZpbHRlckNvbnRleHRMaXN0ZW5lciQyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICAgICAgbGlzdGVuZXIgPSBjb250ZXh0TGlzdGVuZXIkMihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50KSB7CiAgICAgICAgdmFyIHJlbGF0ZWQgPSBldmVudC5yZWxhdGVkVGFyZ2V0OwogICAgICAgIGlmICghcmVsYXRlZCB8fCAocmVsYXRlZCAhPT0gdGhpcyAmJiAhKHJlbGF0ZWQuY29tcGFyZURvY3VtZW50UG9zaXRpb24odGhpcykgJiA4KSkpIHsKICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgZXZlbnQpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250ZXh0TGlzdGVuZXIkMihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihldmVudDEpIHsKICAgICAgICB2YXIgZXZlbnQwID0gZXZlbnQkMjsgLy8gRXZlbnRzIGNhbiBiZSByZWVudHJhbnQgKGUuZy4sIGZvY3VzKS4KICAgICAgICBldmVudCQyID0gZXZlbnQxOwogICAgICAgIHRyeSB7CiAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIHRoaXMuX19kYXRhX18sIGluZGV4LCBncm91cCk7CiAgICAgICAgfSBmaW5hbGx5IHsKICAgICAgICAgIGV2ZW50JDIgPSBldmVudDA7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDYodHlwZW5hbWVzKSB7CiAgICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25SZW1vdmUkMih0eXBlbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIG9uID0gdGhpcy5fX29uOwogICAgICAgIGlmICghb24pIHJldHVybjsKICAgICAgICBmb3IgKHZhciBqID0gMCwgaSA9IC0xLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBpZiAobyA9IG9uW2pdLCAoIXR5cGVuYW1lLnR5cGUgfHwgby50eXBlID09PSB0eXBlbmFtZS50eXBlKSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG9uWysraV0gPSBvOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoKytpKSBvbi5sZW5ndGggPSBpOwogICAgICAgIGVsc2UgZGVsZXRlIHRoaXMuX19vbjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbkFkZCQyKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgewogICAgICB2YXIgd3JhcCA9IGZpbHRlckV2ZW50cyQyLmhhc093blByb3BlcnR5KHR5cGVuYW1lLnR5cGUpID8gZmlsdGVyQ29udGV4dExpc3RlbmVyJDIgOiBjb250ZXh0TGlzdGVuZXIkMjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIGksIGdyb3VwKSB7CiAgICAgICAgdmFyIG9uID0gdGhpcy5fX29uLCBvLCBsaXN0ZW5lciA9IHdyYXAodmFsdWUsIGksIGdyb3VwKTsKICAgICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBpZiAoKG8gPSBvbltqXSkudHlwZSA9PT0gdHlwZW5hbWUudHlwZSAmJiBvLm5hbWUgPT09IHR5cGVuYW1lLm5hbWUpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmVFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciwgby5jYXB0dXJlKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKG8udHlwZSwgby5saXN0ZW5lciA9IGxpc3RlbmVyLCBvLmNhcHR1cmUgPSBjYXB0dXJlKTsKICAgICAgICAgICAgby52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcih0eXBlbmFtZS50eXBlLCBsaXN0ZW5lciwgY2FwdHVyZSk7CiAgICAgICAgbyA9IHt0eXBlOiB0eXBlbmFtZS50eXBlLCBuYW1lOiB0eXBlbmFtZS5uYW1lLCB2YWx1ZTogdmFsdWUsIGxpc3RlbmVyOiBsaXN0ZW5lciwgY2FwdHVyZTogY2FwdHVyZX07CiAgICAgICAgaWYgKCFvbikgdGhpcy5fX29uID0gW29dOwogICAgICAgIGVsc2Ugb24ucHVzaChvKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fb24kMih0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICAgICAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzJDYodHlwZW5hbWUgKyAiIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0OwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjsKICAgICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHsKICAgICAgICAgICAgICByZXR1cm4gby52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIG9uID0gdmFsdWUgPyBvbkFkZCQyIDogb25SZW1vdmUkMjsKICAgICAgaWYgKGNhcHR1cmUgPT0gbnVsbCkgY2FwdHVyZSA9IGZhbHNlOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB0aGlzLmVhY2gob24odHlwZW5hbWVzW2ldLCB2YWx1ZSwgY2FwdHVyZSkpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBjdXN0b21FdmVudCQyKGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHsKICAgICAgdmFyIGV2ZW50MCA9IGV2ZW50JDI7CiAgICAgIGV2ZW50MS5zb3VyY2VFdmVudCA9IGV2ZW50JDI7CiAgICAgIGV2ZW50JDIgPSBldmVudDE7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGV2ZW50JDIgPSBldmVudDA7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwYXRjaEV2ZW50JDIobm9kZSwgdHlwZSwgcGFyYW1zKSB7CiAgICAgIHZhciB3aW5kb3cgPSBkZWZhdWx0VmlldyQyKG5vZGUpLAogICAgICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7CgogICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsKICAgICAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDsKICAgICAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogICAgICB9CgogICAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQkMih0eXBlLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50JDIodGhpcywgdHlwZSwgcGFyYW1zKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwYXRjaEZ1bmN0aW9uJDIodHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCQyKHRoaXMsIHR5cGUsIHBhcmFtcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGlzcGF0Y2gkMih0eXBlLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHBhcmFtcyA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBkaXNwYXRjaEZ1bmN0aW9uJDIKICAgICAgICAgIDogZGlzcGF0Y2hDb25zdGFudCQyKSh0eXBlLCBwYXJhbXMpKTsKICAgIH0KCiAgICB2YXIgcm9vdCQ0ID0gW251bGxdOwoKICAgIGZ1bmN0aW9uIFNlbGVjdGlvbiQ0KGdyb3VwcywgcGFyZW50cykgewogICAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICAgIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbiQyKCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ0KFtbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XV0sIHJvb3QkNCk7CiAgICB9CgogICAgU2VsZWN0aW9uJDQucHJvdG90eXBlID0gc2VsZWN0aW9uJDIucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogU2VsZWN0aW9uJDQsCiAgICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCQyLAogICAgICBzZWxlY3RBbGw6IHNlbGVjdGlvbl9zZWxlY3RBbGwkMiwKICAgICAgZmlsdGVyOiBzZWxlY3Rpb25fZmlsdGVyJDIsCiAgICAgIGRhdGE6IHNlbGVjdGlvbl9kYXRhJDIsCiAgICAgIGVudGVyOiBzZWxlY3Rpb25fZW50ZXIkMiwKICAgICAgZXhpdDogc2VsZWN0aW9uX2V4aXQkMiwKICAgICAgam9pbjogc2VsZWN0aW9uX2pvaW4kMiwKICAgICAgbWVyZ2U6IHNlbGVjdGlvbl9tZXJnZSQyLAogICAgICBvcmRlcjogc2VsZWN0aW9uX29yZGVyJDIsCiAgICAgIHNvcnQ6IHNlbGVjdGlvbl9zb3J0JDIsCiAgICAgIGNhbGw6IHNlbGVjdGlvbl9jYWxsJDIsCiAgICAgIG5vZGVzOiBzZWxlY3Rpb25fbm9kZXMkMiwKICAgICAgbm9kZTogc2VsZWN0aW9uX25vZGUkMiwKICAgICAgc2l6ZTogc2VsZWN0aW9uX3NpemUkMiwKICAgICAgZW1wdHk6IHNlbGVjdGlvbl9lbXB0eSQyLAogICAgICBlYWNoOiBzZWxlY3Rpb25fZWFjaCQyLAogICAgICBhdHRyOiBzZWxlY3Rpb25fYXR0ciQyLAogICAgICBzdHlsZTogc2VsZWN0aW9uX3N0eWxlJDIsCiAgICAgIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHkkMiwKICAgICAgY2xhc3NlZDogc2VsZWN0aW9uX2NsYXNzZWQkMiwKICAgICAgdGV4dDogc2VsZWN0aW9uX3RleHQkMiwKICAgICAgaHRtbDogc2VsZWN0aW9uX2h0bWwkMiwKICAgICAgcmFpc2U6IHNlbGVjdGlvbl9yYWlzZSQyLAogICAgICBsb3dlcjogc2VsZWN0aW9uX2xvd2VyJDIsCiAgICAgIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCQyLAogICAgICBpbnNlcnQ6IHNlbGVjdGlvbl9pbnNlcnQkMiwKICAgICAgcmVtb3ZlOiBzZWxlY3Rpb25fcmVtb3ZlJDIsCiAgICAgIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUkMiwKICAgICAgZGF0dW06IHNlbGVjdGlvbl9kYXR1bSQyLAogICAgICBvbjogc2VsZWN0aW9uX29uJDIsCiAgICAgIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gkMgogICAgfTsKCiAgICBmdW5jdGlvbiBzZWxlY3QkMihzZWxlY3RvcikgewogICAgICByZXR1cm4gdHlwZW9mIHNlbGVjdG9yID09PSAic3RyaW5nIgogICAgICAgICAgPyBuZXcgU2VsZWN0aW9uJDQoW1tkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKV1dLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkKICAgICAgICAgIDogbmV3IFNlbGVjdGlvbiQ0KFtbc2VsZWN0b3JdXSwgcm9vdCQ0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzb3VyY2VFdmVudCQyKCkgewogICAgICB2YXIgY3VycmVudCA9IGV2ZW50JDIsIHNvdXJjZTsKICAgICAgd2hpbGUgKHNvdXJjZSA9IGN1cnJlbnQuc291cmNlRXZlbnQpIGN1cnJlbnQgPSBzb3VyY2U7CiAgICAgIHJldHVybiBjdXJyZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50JDcobm9kZSwgZXZlbnQpIHsKICAgICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7CgogICAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7CiAgICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZOwogICAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTsKICAgICAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOwogICAgICB9CgogICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlJDIobm9kZSkgewogICAgICB2YXIgZXZlbnQgPSBzb3VyY2VFdmVudCQyKCk7CiAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgcmV0dXJuIHBvaW50JDcobm9kZSwgZXZlbnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvdWNoJDEobm9kZSwgdG91Y2hlcywgaWRlbnRpZmllcikgewogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGlkZW50aWZpZXIgPSB0b3VjaGVzLCB0b3VjaGVzID0gc291cmNlRXZlbnQkMigpLmNoYW5nZWRUb3VjaGVzOwoKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7CiAgICAgICAgICByZXR1cm4gcG9pbnQkNyhub2RlLCB0b3VjaCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uJDQoKSB7CiAgICAgIGV2ZW50JDIuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ldmVudCQ1KCkgewogICAgICBldmVudCQyLnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50JDIuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kcmFnKHZpZXcpIHsKICAgICAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCQyKHZpZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG5vZXZlbnQkNSwgdHJ1ZSk7CiAgICAgIGlmICgib25zZWxlY3RzdGFydCIgaW4gcm9vdCkgewogICAgICAgIHNlbGVjdGlvbi5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG5vZXZlbnQkNSwgdHJ1ZSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcm9vdC5fX25vc2VsZWN0ID0gcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0OwogICAgICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9ICJub25lIjsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHllc2RyYWckMih2aWV3LCBub2NsaWNrKSB7CiAgICAgIHZhciByb290ID0gdmlldy5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsCiAgICAgICAgICBzZWxlY3Rpb24gPSBzZWxlY3QkMih2aWV3KS5vbigiZHJhZ3N0YXJ0LmRyYWciLCBudWxsKTsKICAgICAgaWYgKG5vY2xpY2spIHsKICAgICAgICBzZWxlY3Rpb24ub24oImNsaWNrLmRyYWciLCBub2V2ZW50JDUsIHRydWUpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG51bGwpOyB9LCAwKTsKICAgICAgfQogICAgICBpZiAoIm9uc2VsZWN0c3RhcnQiIGluIHJvb3QpIHsKICAgICAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0YXJ0LmRyYWciLCBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7CiAgICAgICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JGsoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gRHJhZ0V2ZW50JDEodGFyZ2V0LCB0eXBlLCBzdWJqZWN0LCBpZCwgYWN0aXZlLCB4LCB5LCBkeCwgZHksIGRpc3BhdGNoKSB7CiAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLnN1YmplY3QgPSBzdWJqZWN0OwogICAgICB0aGlzLmlkZW50aWZpZXIgPSBpZDsKICAgICAgdGhpcy5hY3RpdmUgPSBhY3RpdmU7CiAgICAgIHRoaXMueCA9IHg7CiAgICAgIHRoaXMueSA9IHk7CiAgICAgIHRoaXMuZHggPSBkeDsKICAgICAgdGhpcy5keSA9IGR5OwogICAgICB0aGlzLl8gPSBkaXNwYXRjaDsKICAgIH0KCiAgICBEcmFnRXZlbnQkMS5wcm90b3R5cGUub24gPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHZhbHVlID0gdGhpcy5fLm9uLmFwcGx5KHRoaXMuXywgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIHZhbHVlID09PSB0aGlzLl8gPyB0aGlzIDogdmFsdWU7CiAgICB9OwoKICAgIC8vIElnbm9yZSByaWdodC1jbGljaywgc2luY2UgdGhhdCBzaG91bGQgb3BlbiB0aGUgY29udGV4dCBtZW51LgogICAgZnVuY3Rpb24gZGVmYXVsdEZpbHRlciQ0KCkgewogICAgICByZXR1cm4gIWV2ZW50JDIuYnV0dG9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRDb250YWluZXIkMSgpIHsKICAgICAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0U3ViamVjdCQxKGQpIHsKICAgICAgcmV0dXJuIGQgPT0gbnVsbCA/IHt4OiBldmVudCQyLngsIHk6IGV2ZW50JDIueX0gOiBkOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUkMygpIHsKICAgICAgcmV0dXJuICJvbnRvdWNoc3RhcnQiIGluIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gZHJhZyQxKCkgewogICAgICB2YXIgZmlsdGVyID0gZGVmYXVsdEZpbHRlciQ0LAogICAgICAgICAgY29udGFpbmVyID0gZGVmYXVsdENvbnRhaW5lciQxLAogICAgICAgICAgc3ViamVjdCA9IGRlZmF1bHRTdWJqZWN0JDEsCiAgICAgICAgICB0b3VjaGFibGUgPSBkZWZhdWx0VG91Y2hhYmxlJDMsCiAgICAgICAgICBnZXN0dXJlcyA9IHt9LAogICAgICAgICAgbGlzdGVuZXJzID0gZGlzcGF0Y2gkMygic3RhcnQiLCAiZHJhZyIsICJlbmQiKSwKICAgICAgICAgIGFjdGl2ZSA9IDAsCiAgICAgICAgICBtb3VzZWRvd254LAogICAgICAgICAgbW91c2Vkb3dueSwKICAgICAgICAgIG1vdXNlbW92aW5nLAogICAgICAgICAgdG91Y2hlbmRpbmcsCiAgICAgICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7CgogICAgICBmdW5jdGlvbiBkcmFnKHNlbGVjdGlvbikgewogICAgICAgIHNlbGVjdGlvbgogICAgICAgICAgICAub24oIm1vdXNlZG93bi5kcmFnIiwgbW91c2Vkb3duZWQpCiAgICAgICAgICAuZmlsdGVyKHRvdWNoYWJsZSkKICAgICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0LmRyYWciLCB0b3VjaHN0YXJ0ZWQpCiAgICAgICAgICAgIC5vbigidG91Y2htb3ZlLmRyYWciLCB0b3VjaG1vdmVkKQogICAgICAgICAgICAub24oInRvdWNoZW5kLmRyYWcgdG91Y2hjYW5jZWwuZHJhZyIsIHRvdWNoZW5kZWQpCiAgICAgICAgICAgIC5zdHlsZSgidG91Y2gtYWN0aW9uIiwgIm5vbmUiKQogICAgICAgICAgICAuc3R5bGUoIi13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvciIsICJyZ2JhKDAsMCwwLDApIik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1vdXNlZG93bmVkKCkgewogICAgICAgIGlmICh0b3VjaGVuZGluZyB8fCAhZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgZ2VzdHVyZSA9IGJlZm9yZXN0YXJ0KCJtb3VzZSIsIGNvbnRhaW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBtb3VzZSQyLCB0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICghZ2VzdHVyZSkgcmV0dXJuOwogICAgICAgIHNlbGVjdCQyKGV2ZW50JDIudmlldykub24oIm1vdXNlbW92ZS5kcmFnIiwgbW91c2Vtb3ZlZCwgdHJ1ZSkub24oIm1vdXNldXAuZHJhZyIsIG1vdXNldXBwZWQsIHRydWUpOwogICAgICAgIG5vZHJhZyhldmVudCQyLnZpZXcpOwogICAgICAgIG5vcHJvcGFnYXRpb24kNCgpOwogICAgICAgIG1vdXNlbW92aW5nID0gZmFsc2U7CiAgICAgICAgbW91c2Vkb3dueCA9IGV2ZW50JDIuY2xpZW50WDsKICAgICAgICBtb3VzZWRvd255ID0gZXZlbnQkMi5jbGllbnRZOwogICAgICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoKSB7CiAgICAgICAgbm9ldmVudCQ1KCk7CiAgICAgICAgaWYgKCFtb3VzZW1vdmluZykgewogICAgICAgICAgdmFyIGR4ID0gZXZlbnQkMi5jbGllbnRYIC0gbW91c2Vkb3dueCwgZHkgPSBldmVudCQyLmNsaWVudFkgLSBtb3VzZWRvd255OwogICAgICAgICAgbW91c2Vtb3ZpbmcgPSBkeCAqIGR4ICsgZHkgKiBkeSA+IGNsaWNrRGlzdGFuY2UyOwogICAgICAgIH0KICAgICAgICBnZXN0dXJlcy5tb3VzZSgiZHJhZyIpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBtb3VzZXVwcGVkKCkgewogICAgICAgIHNlbGVjdCQyKGV2ZW50JDIudmlldykub24oIm1vdXNlbW92ZS5kcmFnIG1vdXNldXAuZHJhZyIsIG51bGwpOwogICAgICAgIHllc2RyYWckMihldmVudCQyLnZpZXcsIG1vdXNlbW92aW5nKTsKICAgICAgICBub2V2ZW50JDUoKTsKICAgICAgICBnZXN0dXJlcy5tb3VzZSgiZW5kIik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRvdWNoc3RhcnRlZCgpIHsKICAgICAgICBpZiAoIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CiAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudCQyLmNoYW5nZWRUb3VjaGVzLAogICAgICAgICAgICBjID0gY29udGFpbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgZ2VzdHVyZTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKGdlc3R1cmUgPSBiZWZvcmVzdGFydCh0b3VjaGVzW2ldLmlkZW50aWZpZXIsIGMsIHRvdWNoJDEsIHRoaXMsIGFyZ3VtZW50cykpIHsKICAgICAgICAgICAgbm9wcm9wYWdhdGlvbiQ0KCk7CiAgICAgICAgICAgIGdlc3R1cmUoInN0YXJ0Iik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaG1vdmVkKCkgewogICAgICAgIHZhciB0b3VjaGVzID0gZXZlbnQkMi5jaGFuZ2VkVG91Y2hlcywKICAgICAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCBnZXN0dXJlOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoZ2VzdHVyZSA9IGdlc3R1cmVzW3RvdWNoZXNbaV0uaWRlbnRpZmllcl0pIHsKICAgICAgICAgICAgbm9ldmVudCQ1KCk7CiAgICAgICAgICAgIGdlc3R1cmUoImRyYWciKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRvdWNoZW5kZWQoKSB7CiAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudCQyLmNoYW5nZWRUb3VjaGVzLAogICAgICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIGdlc3R1cmU7CgogICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTsKICAgICAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgNTAwKTsgLy8gR2hvc3QgY2xpY2tzIGFyZSBkZWxheWVkIQogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChnZXN0dXJlID0gZ2VzdHVyZXNbdG91Y2hlc1tpXS5pZGVudGlmaWVyXSkgewogICAgICAgICAgICBub3Byb3BhZ2F0aW9uJDQoKTsKICAgICAgICAgICAgZ2VzdHVyZSgiZW5kIik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBiZWZvcmVzdGFydChpZCwgY29udGFpbmVyLCBwb2ludCwgdGhhdCwgYXJncykgewogICAgICAgIHZhciBwID0gcG9pbnQoY29udGFpbmVyLCBpZCksIHMsIGR4LCBkeSwKICAgICAgICAgICAgc3VibGlzdGVuZXJzID0gbGlzdGVuZXJzLmNvcHkoKTsKCiAgICAgICAgaWYgKCFjdXN0b21FdmVudCQyKG5ldyBEcmFnRXZlbnQkMShkcmFnLCAiYmVmb3Jlc3RhcnQiLCBzLCBpZCwgYWN0aXZlLCBwWzBdLCBwWzFdLCAwLCAwLCBzdWJsaXN0ZW5lcnMpLCBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICgoZXZlbnQkMi5zdWJqZWN0ID0gcyA9IHN1YmplY3QuYXBwbHkodGhhdCwgYXJncykpID09IG51bGwpIHJldHVybiBmYWxzZTsKICAgICAgICAgIGR4ID0gcy54IC0gcFswXSB8fCAwOwogICAgICAgICAgZHkgPSBzLnkgLSBwWzFdIHx8IDA7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9KSkgcmV0dXJuOwoKICAgICAgICByZXR1cm4gZnVuY3Rpb24gZ2VzdHVyZSh0eXBlKSB7CiAgICAgICAgICB2YXIgcDAgPSBwLCBuOwogICAgICAgICAgc3dpdGNoICh0eXBlKSB7CiAgICAgICAgICAgIGNhc2UgInN0YXJ0IjogZ2VzdHVyZXNbaWRdID0gZ2VzdHVyZSwgbiA9IGFjdGl2ZSsrOyBicmVhazsKICAgICAgICAgICAgY2FzZSAiZW5kIjogZGVsZXRlIGdlc3R1cmVzW2lkXSwgLS1hY3RpdmU7IC8vIG5vYnJlYWsKICAgICAgICAgICAgY2FzZSAiZHJhZyI6IHAgPSBwb2ludChjb250YWluZXIsIGlkKSwgbiA9IGFjdGl2ZTsgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjdXN0b21FdmVudCQyKG5ldyBEcmFnRXZlbnQkMShkcmFnLCB0eXBlLCBzLCBpZCwgbiwgcFswXSArIGR4LCBwWzFdICsgZHksIHBbMF0gLSBwMFswXSwgcFsxXSAtIHAwWzFdLCBzdWJsaXN0ZW5lcnMpLCBzdWJsaXN0ZW5lcnMuYXBwbHksIHN1Ymxpc3RlbmVycywgW3R5cGUsIHRoYXQsIGFyZ3NdKTsKICAgICAgICB9OwogICAgICB9CgogICAgICBkcmFnLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRrKCEhXyksIGRyYWcpIDogZmlsdGVyOwogICAgICB9OwoKICAgICAgZHJhZy5jb250YWluZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29udGFpbmVyID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkayhfKSwgZHJhZykgOiBjb250YWluZXI7CiAgICAgIH07CgogICAgICBkcmFnLnN1YmplY3QgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc3ViamVjdCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGsoXyksIGRyYWcpIDogc3ViamVjdDsKICAgICAgfTsKCiAgICAgIGRyYWcudG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGsoISFfKSwgZHJhZykgOiB0b3VjaGFibGU7CiAgICAgIH07CgogICAgICBkcmFnLm9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGRyYWcgOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIGRyYWcuY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgZHJhZykgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGRyYWc7CiAgICB9CgogICAgdmFyIEVPTCQxID0ge30sCiAgICAgICAgRU9GJDEgPSB7fSwKICAgICAgICBRVU9URSQxID0gMzQsCiAgICAgICAgTkVXTElORSQxID0gMTAsCiAgICAgICAgUkVUVVJOJDEgPSAxMzsKCiAgICBmdW5jdGlvbiBvYmplY3RDb252ZXJ0ZXIkMShjb2x1bW5zKSB7CiAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oImQiLCAicmV0dXJuIHsiICsgY29sdW1ucy5tYXAoZnVuY3Rpb24obmFtZSwgaSkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShuYW1lKSArICI6IGRbIiArIGkgKyAiXSI7CiAgICAgIH0pLmpvaW4oIiwiKSArICJ9Iik7CiAgICB9CgogICAgZnVuY3Rpb24gY3VzdG9tQ29udmVydGVyJDEoY29sdW1ucywgZikgewogICAgICB2YXIgb2JqZWN0ID0gb2JqZWN0Q29udmVydGVyJDEoY29sdW1ucyk7CiAgICAgIHJldHVybiBmdW5jdGlvbihyb3csIGkpIHsKICAgICAgICByZXR1cm4gZihvYmplY3Qocm93KSwgaSwgY29sdW1ucyk7CiAgICAgIH07CiAgICB9CgogICAgLy8gQ29tcHV0ZSB1bmlxdWUgY29sdW1ucyBpbiBvcmRlciBvZiBkaXNjb3ZlcnkuCiAgICBmdW5jdGlvbiBpbmZlckNvbHVtbnMkMShyb3dzKSB7CiAgICAgIHZhciBjb2x1bW5TZXQgPSBPYmplY3QuY3JlYXRlKG51bGwpLAogICAgICAgICAgY29sdW1ucyA9IFtdOwoKICAgICAgcm93cy5mb3JFYWNoKGZ1bmN0aW9uKHJvdykgewogICAgICAgIGZvciAodmFyIGNvbHVtbiBpbiByb3cpIHsKICAgICAgICAgIGlmICghKGNvbHVtbiBpbiBjb2x1bW5TZXQpKSB7CiAgICAgICAgICAgIGNvbHVtbnMucHVzaChjb2x1bW5TZXRbY29sdW1uXSA9IGNvbHVtbik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHJldHVybiBjb2x1bW5zOwogICAgfQoKICAgIGZ1bmN0aW9uIGRzdiQxKGRlbGltaXRlcikgewogICAgICB2YXIgcmVGb3JtYXQgPSBuZXcgUmVnRXhwKCJbXCIiICsgZGVsaW1pdGVyICsgIlxuXHJdIiksCiAgICAgICAgICBERUxJTUlURVIgPSBkZWxpbWl0ZXIuY2hhckNvZGVBdCgwKTsKCiAgICAgIGZ1bmN0aW9uIHBhcnNlKHRleHQsIGYpIHsKICAgICAgICB2YXIgY29udmVydCwgY29sdW1ucywgcm93cyA9IHBhcnNlUm93cyh0ZXh0LCBmdW5jdGlvbihyb3csIGkpIHsKICAgICAgICAgIGlmIChjb252ZXJ0KSByZXR1cm4gY29udmVydChyb3csIGkgLSAxKTsKICAgICAgICAgIGNvbHVtbnMgPSByb3csIGNvbnZlcnQgPSBmID8gY3VzdG9tQ29udmVydGVyJDEocm93LCBmKSA6IG9iamVjdENvbnZlcnRlciQxKHJvdyk7CiAgICAgICAgfSk7CiAgICAgICAgcm93cy5jb2x1bW5zID0gY29sdW1ucyB8fCBbXTsKICAgICAgICByZXR1cm4gcm93czsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VSb3dzKHRleHQsIGYpIHsKICAgICAgICB2YXIgcm93cyA9IFtdLCAvLyBvdXRwdXQgcm93cwogICAgICAgICAgICBOID0gdGV4dC5sZW5ndGgsCiAgICAgICAgICAgIEkgPSAwLCAvLyBjdXJyZW50IGNoYXJhY3RlciBpbmRleAogICAgICAgICAgICBuID0gMCwgLy8gY3VycmVudCBsaW5lIG51bWJlcgogICAgICAgICAgICB0LCAvLyBjdXJyZW50IHRva2VuCiAgICAgICAgICAgIGVvZiA9IE4gPD0gMCwgLy8gY3VycmVudCB0b2tlbiBmb2xsb3dlZCBieSBFT0Y/CiAgICAgICAgICAgIGVvbCA9IGZhbHNlOyAvLyBjdXJyZW50IHRva2VuIGZvbGxvd2VkIGJ5IEVPTD8KCiAgICAgICAgLy8gU3RyaXAgdGhlIHRyYWlsaW5nIG5ld2xpbmUuCiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChOIC0gMSkgPT09IE5FV0xJTkUkMSkgLS1OOwogICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoTiAtIDEpID09PSBSRVRVUk4kMSkgLS1OOwoKICAgICAgICBmdW5jdGlvbiB0b2tlbigpIHsKICAgICAgICAgIGlmIChlb2YpIHJldHVybiBFT0YkMTsKICAgICAgICAgIGlmIChlb2wpIHJldHVybiBlb2wgPSBmYWxzZSwgRU9MJDE7CgogICAgICAgICAgLy8gVW5lc2NhcGUgcXVvdGVzLgogICAgICAgICAgdmFyIGksIGogPSBJLCBjOwogICAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChqKSA9PT0gUVVPVEUkMSkgewogICAgICAgICAgICB3aGlsZSAoSSsrIDwgTiAmJiB0ZXh0LmNoYXJDb2RlQXQoSSkgIT09IFFVT1RFJDEgfHwgdGV4dC5jaGFyQ29kZUF0KCsrSSkgPT09IFFVT1RFJDEpOwogICAgICAgICAgICBpZiAoKGkgPSBJKSA+PSBOKSBlb2YgPSB0cnVlOwogICAgICAgICAgICBlbHNlIGlmICgoYyA9IHRleHQuY2hhckNvZGVBdChJKyspKSA9PT0gTkVXTElORSQxKSBlb2wgPSB0cnVlOwogICAgICAgICAgICBlbHNlIGlmIChjID09PSBSRVRVUk4kMSkgeyBlb2wgPSB0cnVlOyBpZiAodGV4dC5jaGFyQ29kZUF0KEkpID09PSBORVdMSU5FJDEpICsrSTsgfQogICAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZShqICsgMSwgaSAtIDEpLnJlcGxhY2UoLyIiL2csICJcIiIpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIEZpbmQgbmV4dCBkZWxpbWl0ZXIgb3IgbmV3bGluZS4KICAgICAgICAgIHdoaWxlIChJIDwgTikgewogICAgICAgICAgICBpZiAoKGMgPSB0ZXh0LmNoYXJDb2RlQXQoaSA9IEkrKykpID09PSBORVdMSU5FJDEpIGVvbCA9IHRydWU7CiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09IFJFVFVSTiQxKSB7IGVvbCA9IHRydWU7IGlmICh0ZXh0LmNoYXJDb2RlQXQoSSkgPT09IE5FV0xJTkUkMSkgKytJOyB9CiAgICAgICAgICAgIGVsc2UgaWYgKGMgIT09IERFTElNSVRFUikgY29udGludWU7CiAgICAgICAgICAgIHJldHVybiB0ZXh0LnNsaWNlKGosIGkpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFJldHVybiBsYXN0IHRva2VuIGJlZm9yZSBFT0YuCiAgICAgICAgICByZXR1cm4gZW9mID0gdHJ1ZSwgdGV4dC5zbGljZShqLCBOKTsKICAgICAgICB9CgogICAgICAgIHdoaWxlICgodCA9IHRva2VuKCkpICE9PSBFT0YkMSkgewogICAgICAgICAgdmFyIHJvdyA9IFtdOwogICAgICAgICAgd2hpbGUgKHQgIT09IEVPTCQxICYmIHQgIT09IEVPRiQxKSByb3cucHVzaCh0KSwgdCA9IHRva2VuKCk7CiAgICAgICAgICBpZiAoZiAmJiAocm93ID0gZihyb3csIG4rKykpID09IG51bGwpIGNvbnRpbnVlOwogICAgICAgICAgcm93cy5wdXNoKHJvdyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcm93czsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0KHJvd3MsIGNvbHVtbnMpIHsKICAgICAgICBpZiAoY29sdW1ucyA9PSBudWxsKSBjb2x1bW5zID0gaW5mZXJDb2x1bW5zJDEocm93cyk7CiAgICAgICAgcmV0dXJuIFtjb2x1bW5zLm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpXS5jb25jYXQocm93cy5tYXAoZnVuY3Rpb24ocm93KSB7CiAgICAgICAgICByZXR1cm4gY29sdW1ucy5tYXAoZnVuY3Rpb24oY29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiBmb3JtYXRWYWx1ZShyb3dbY29sdW1uXSk7CiAgICAgICAgICB9KS5qb2luKGRlbGltaXRlcik7CiAgICAgICAgfSkpLmpvaW4oIlxuIik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFJvd3Mocm93cykgewogICAgICAgIHJldHVybiByb3dzLm1hcChmb3JtYXRSb3cpLmpvaW4oIlxuIik7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFJvdyhyb3cpIHsKICAgICAgICByZXR1cm4gcm93Lm1hcChmb3JtYXRWYWx1ZSkuam9pbihkZWxpbWl0ZXIpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRWYWx1ZSh0ZXh0KSB7CiAgICAgICAgcmV0dXJuIHRleHQgPT0gbnVsbCA/ICIiCiAgICAgICAgICAgIDogcmVGb3JtYXQudGVzdCh0ZXh0ICs9ICIiKSA/ICJcIiIgKyB0ZXh0LnJlcGxhY2UoLyIvZywgIlwiXCIiKSArICJcIiIKICAgICAgICAgICAgOiB0ZXh0OwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIHBhcnNlOiBwYXJzZSwKICAgICAgICBwYXJzZVJvd3M6IHBhcnNlUm93cywKICAgICAgICBmb3JtYXQ6IGZvcm1hdCwKICAgICAgICBmb3JtYXRSb3dzOiBmb3JtYXRSb3dzCiAgICAgIH07CiAgICB9CgogICAgdmFyIGNzdiQyID0gZHN2JDEoIiwiKTsKCiAgICB2YXIgY3N2UGFyc2UkMSA9IGNzdiQyLnBhcnNlOwogICAgdmFyIGNzdlBhcnNlUm93cyQxID0gY3N2JDIucGFyc2VSb3dzOwogICAgdmFyIGNzdkZvcm1hdCQxID0gY3N2JDIuZm9ybWF0OwogICAgdmFyIGNzdkZvcm1hdFJvd3MkMSA9IGNzdiQyLmZvcm1hdFJvd3M7CgogICAgdmFyIHRzdiQyID0gZHN2JDEoIlx0Iik7CgogICAgdmFyIHRzdlBhcnNlJDEgPSB0c3YkMi5wYXJzZTsKICAgIHZhciB0c3ZQYXJzZVJvd3MkMSA9IHRzdiQyLnBhcnNlUm93czsKICAgIHZhciB0c3ZGb3JtYXQkMSA9IHRzdiQyLmZvcm1hdDsKICAgIHZhciB0c3ZGb3JtYXRSb3dzJDEgPSB0c3YkMi5mb3JtYXRSb3dzOwoKICAgIGZ1bmN0aW9uIGxpbmVhciQ0KHQpIHsKICAgICAgcmV0dXJuICt0OwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YWRJbiQxKHQpIHsKICAgICAgcmV0dXJuIHQgKiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YWRPdXQkMSh0KSB7CiAgICAgIHJldHVybiB0ICogKDIgLSB0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBxdWFkSW5PdXQkMSh0KSB7CiAgICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0IDogLS10ICogKDIgLSB0KSArIDEpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjdWJpY0luJDEodCkgewogICAgICByZXR1cm4gdCAqIHQgKiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIGN1YmljT3V0JDEodCkgewogICAgICByZXR1cm4gLS10ICogdCAqIHQgKyAxOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1YmljSW5PdXQkMSh0KSB7CiAgICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IHQgKiB0ICogdCA6ICh0IC09IDIpICogdCAqIHQgKyAyKSAvIDI7CiAgICB9CgogICAgdmFyIGV4cG9uZW50JDIgPSAzOwoKICAgIHZhciBwb2x5SW4kMSA9IChmdW5jdGlvbiBjdXN0b20oZSkgewogICAgICBlID0gK2U7CgogICAgICBmdW5jdGlvbiBwb2x5SW4odCkgewogICAgICAgIHJldHVybiBNYXRoLnBvdyh0LCBlKTsKICAgICAgfQoKICAgICAgcG9seUluLmV4cG9uZW50ID0gY3VzdG9tOwoKICAgICAgcmV0dXJuIHBvbHlJbjsKICAgIH0pKGV4cG9uZW50JDIpOwoKICAgIHZhciBwb2x5T3V0JDEgPSAoZnVuY3Rpb24gY3VzdG9tKGUpIHsKICAgICAgZSA9ICtlOwoKICAgICAgZnVuY3Rpb24gcG9seU91dCh0KSB7CiAgICAgICAgcmV0dXJuIDEgLSBNYXRoLnBvdygxIC0gdCwgZSk7CiAgICAgIH0KCiAgICAgIHBvbHlPdXQuZXhwb25lbnQgPSBjdXN0b207CgogICAgICByZXR1cm4gcG9seU91dDsKICAgIH0pKGV4cG9uZW50JDIpOwoKICAgIHZhciBwb2x5SW5PdXQkMSA9IChmdW5jdGlvbiBjdXN0b20oZSkgewogICAgICBlID0gK2U7CgogICAgICBmdW5jdGlvbiBwb2x5SW5PdXQodCkgewogICAgICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KHQsIGUpIDogMiAtIE1hdGgucG93KDIgLSB0LCBlKSkgLyAyOwogICAgICB9CgogICAgICBwb2x5SW5PdXQuZXhwb25lbnQgPSBjdXN0b207CgogICAgICByZXR1cm4gcG9seUluT3V0OwogICAgfSkoZXhwb25lbnQkMik7CgogICAgdmFyIHBpJDcgPSBNYXRoLlBJLAogICAgICAgIGhhbGZQaSQ1ID0gcGkkNyAvIDI7CgogICAgZnVuY3Rpb24gc2luSW4kMSh0KSB7CiAgICAgIHJldHVybiAxIC0gTWF0aC5jb3ModCAqIGhhbGZQaSQ1KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzaW5PdXQkMSh0KSB7CiAgICAgIHJldHVybiBNYXRoLnNpbih0ICogaGFsZlBpJDUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpbkluT3V0JDEodCkgewogICAgICByZXR1cm4gKDEgLSBNYXRoLmNvcyhwaSQ3ICogdCkpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBJbiQxKHQpIHsKICAgICAgcmV0dXJuIE1hdGgucG93KDIsIDEwICogdCAtIDEwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBPdXQkMSh0KSB7CiAgICAgIHJldHVybiAxIC0gTWF0aC5wb3coMiwgLTEwICogdCk7CiAgICB9CgogICAgZnVuY3Rpb24gZXhwSW5PdXQkMSh0KSB7CiAgICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IE1hdGgucG93KDIsIDEwICogdCAtIDEwKSA6IDIgLSBNYXRoLnBvdygyLCAxMCAtIDEwICogdCkpIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjaXJjbGVJbiQxKHQpIHsKICAgICAgcmV0dXJuIDEgLSBNYXRoLnNxcnQoMSAtIHQgKiB0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjaXJjbGVPdXQkMSh0KSB7CiAgICAgIHJldHVybiBNYXRoLnNxcnQoMSAtIC0tdCAqIHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNpcmNsZUluT3V0JDEodCkgewogICAgICByZXR1cm4gKCh0ICo9IDIpIDw9IDEgPyAxIC0gTWF0aC5zcXJ0KDEgLSB0ICogdCkgOiBNYXRoLnNxcnQoMSAtICh0IC09IDIpICogdCkgKyAxKSAvIDI7CiAgICB9CgogICAgdmFyIGIxJDEgPSA0IC8gMTEsCiAgICAgICAgYjIkMSA9IDYgLyAxMSwKICAgICAgICBiMyQxID0gOCAvIDExLAogICAgICAgIGI0JDEgPSAzIC8gNCwKICAgICAgICBiNSQxID0gOSAvIDExLAogICAgICAgIGI2JDEgPSAxMCAvIDExLAogICAgICAgIGI3JDEgPSAxNSAvIDE2LAogICAgICAgIGI4JDEgPSAyMSAvIDIyLAogICAgICAgIGI5JDEgPSA2MyAvIDY0LAogICAgICAgIGIwJDEgPSAxIC8gYjEkMSAvIGIxJDE7CgogICAgZnVuY3Rpb24gYm91bmNlSW4kMSh0KSB7CiAgICAgIHJldHVybiAxIC0gYm91bmNlT3V0JDEoMSAtIHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGJvdW5jZU91dCQxKHQpIHsKICAgICAgcmV0dXJuICh0ID0gK3QpIDwgYjEkMSA/IGIwJDEgKiB0ICogdCA6IHQgPCBiMyQxID8gYjAkMSAqICh0IC09IGIyJDEpICogdCArIGI0JDEgOiB0IDwgYjYkMSA/IGIwJDEgKiAodCAtPSBiNSQxKSAqIHQgKyBiNyQxIDogYjAkMSAqICh0IC09IGI4JDEpICogdCArIGI5JDE7CiAgICB9CgogICAgZnVuY3Rpb24gYm91bmNlSW5PdXQkMSh0KSB7CiAgICAgIHJldHVybiAoKHQgKj0gMikgPD0gMSA/IDEgLSBib3VuY2VPdXQkMSgxIC0gdCkgOiBib3VuY2VPdXQkMSh0IC0gMSkgKyAxKSAvIDI7CiAgICB9CgogICAgdmFyIG92ZXJzaG9vdCQxID0gMS43MDE1ODsKCiAgICB2YXIgYmFja0luJDEgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICAgICAgcyA9ICtzOwoKICAgICAgZnVuY3Rpb24gYmFja0luKHQpIHsKICAgICAgICByZXR1cm4gdCAqIHQgKiAoKHMgKyAxKSAqIHQgLSBzKTsKICAgICAgfQoKICAgICAgYmFja0luLm92ZXJzaG9vdCA9IGN1c3RvbTsKCiAgICAgIHJldHVybiBiYWNrSW47CiAgICB9KShvdmVyc2hvb3QkMSk7CgogICAgdmFyIGJhY2tPdXQkMSA9IChmdW5jdGlvbiBjdXN0b20ocykgewogICAgICBzID0gK3M7CgogICAgICBmdW5jdGlvbiBiYWNrT3V0KHQpIHsKICAgICAgICByZXR1cm4gLS10ICogdCAqICgocyArIDEpICogdCArIHMpICsgMTsKICAgICAgfQoKICAgICAgYmFja091dC5vdmVyc2hvb3QgPSBjdXN0b207CgogICAgICByZXR1cm4gYmFja091dDsKICAgIH0pKG92ZXJzaG9vdCQxKTsKCiAgICB2YXIgYmFja0luT3V0JDEgPSAoZnVuY3Rpb24gY3VzdG9tKHMpIHsKICAgICAgcyA9ICtzOwoKICAgICAgZnVuY3Rpb24gYmFja0luT3V0KHQpIHsKICAgICAgICByZXR1cm4gKCh0ICo9IDIpIDwgMSA/IHQgKiB0ICogKChzICsgMSkgKiB0IC0gcykgOiAodCAtPSAyKSAqIHQgKiAoKHMgKyAxKSAqIHQgKyBzKSArIDIpIC8gMjsKICAgICAgfQoKICAgICAgYmFja0luT3V0Lm92ZXJzaG9vdCA9IGN1c3RvbTsKCiAgICAgIHJldHVybiBiYWNrSW5PdXQ7CiAgICB9KShvdmVyc2hvb3QkMSk7CgogICAgdmFyIHRhdSQ3ID0gMiAqIE1hdGguUEksCiAgICAgICAgYW1wbGl0dWRlJDEgPSAxLAogICAgICAgIHBlcmlvZCQxID0gMC4zOwoKICAgIHZhciBlbGFzdGljSW4kMSA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkgewogICAgICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1JDcpOwoKICAgICAgZnVuY3Rpb24gZWxhc3RpY0luKHQpIHsKICAgICAgICByZXR1cm4gYSAqIE1hdGgucG93KDIsIDEwICogLS10KSAqIE1hdGguc2luKChzIC0gdCkgLyBwKTsKICAgICAgfQoKICAgICAgZWxhc3RpY0luLmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1JDcpOyB9OwogICAgICBlbGFzdGljSW4ucGVyaW9kID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gY3VzdG9tKGEsIHApOyB9OwoKICAgICAgcmV0dXJuIGVsYXN0aWNJbjsKICAgIH0pKGFtcGxpdHVkZSQxLCBwZXJpb2QkMSk7CgogICAgdmFyIGVsYXN0aWNPdXQkMSA9IChmdW5jdGlvbiBjdXN0b20oYSwgcCkgewogICAgICB2YXIgcyA9IE1hdGguYXNpbigxIC8gKGEgPSBNYXRoLm1heCgxLCBhKSkpICogKHAgLz0gdGF1JDcpOwoKICAgICAgZnVuY3Rpb24gZWxhc3RpY091dCh0KSB7CiAgICAgICAgcmV0dXJuIDEgLSBhICogTWF0aC5wb3coMiwgLTEwICogKHQgPSArdCkpICogTWF0aC5zaW4oKHQgKyBzKSAvIHApOwogICAgICB9CgogICAgICBlbGFzdGljT3V0LmFtcGxpdHVkZSA9IGZ1bmN0aW9uKGEpIHsgcmV0dXJuIGN1c3RvbShhLCBwICogdGF1JDcpOyB9OwogICAgICBlbGFzdGljT3V0LnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTsKCiAgICAgIHJldHVybiBlbGFzdGljT3V0OwogICAgfSkoYW1wbGl0dWRlJDEsIHBlcmlvZCQxKTsKCiAgICB2YXIgZWxhc3RpY0luT3V0JDEgPSAoZnVuY3Rpb24gY3VzdG9tKGEsIHApIHsKICAgICAgdmFyIHMgPSBNYXRoLmFzaW4oMSAvIChhID0gTWF0aC5tYXgoMSwgYSkpKSAqIChwIC89IHRhdSQ3KTsKCiAgICAgIGZ1bmN0aW9uIGVsYXN0aWNJbk91dCh0KSB7CiAgICAgICAgcmV0dXJuICgodCA9IHQgKiAyIC0gMSkgPCAwCiAgICAgICAgICAgID8gYSAqIE1hdGgucG93KDIsIDEwICogdCkgKiBNYXRoLnNpbigocyAtIHQpIC8gcCkKICAgICAgICAgICAgOiAyIC0gYSAqIE1hdGgucG93KDIsIC0xMCAqIHQpICogTWF0aC5zaW4oKHMgKyB0KSAvIHApKSAvIDI7CiAgICAgIH0KCiAgICAgIGVsYXN0aWNJbk91dC5hbXBsaXR1ZGUgPSBmdW5jdGlvbihhKSB7IHJldHVybiBjdXN0b20oYSwgcCAqIHRhdSQ3KTsgfTsKICAgICAgZWxhc3RpY0luT3V0LnBlcmlvZCA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIGN1c3RvbShhLCBwKTsgfTsKCiAgICAgIHJldHVybiBlbGFzdGljSW5PdXQ7CiAgICB9KShhbXBsaXR1ZGUkMSwgcGVyaW9kJDEpOwoKICAgIGZ1bmN0aW9uIGNlbnRlciQzKHgsIHkpIHsKICAgICAgdmFyIG5vZGVzOwoKICAgICAgaWYgKHggPT0gbnVsbCkgeCA9IDA7CiAgICAgIGlmICh5ID09IG51bGwpIHkgPSAwOwoKICAgICAgZnVuY3Rpb24gZm9yY2UoKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIG4gPSBub2Rlcy5sZW5ndGgsCiAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgIHN4ID0gMCwKICAgICAgICAgICAgc3kgPSAwOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2RlID0gbm9kZXNbaV0sIHN4ICs9IG5vZGUueCwgc3kgKz0gbm9kZS55OwogICAgICAgIH0KCiAgICAgICAgZm9yIChzeCA9IHN4IC8gbiAtIHgsIHN5ID0gc3kgLyBuIC0geSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS54IC09IHN4LCBub2RlLnkgLT0gc3k7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIG5vZGVzID0gXzsKICAgICAgfTsKCiAgICAgIGZvcmNlLnggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4OwogICAgICB9OwoKICAgICAgZm9yY2UueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNlKSA6IHk7CiAgICAgIH07CgogICAgICByZXR1cm4gZm9yY2U7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkbCh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBqaWdnbGUkMSgpIHsKICAgICAgcmV0dXJuIChNYXRoLnJhbmRvbSgpIC0gMC41KSAqIDFlLTY7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9hZGQkMShkKSB7CiAgICAgIHZhciB4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSwKICAgICAgICAgIHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpOwogICAgICByZXR1cm4gYWRkJDIodGhpcy5jb3Zlcih4LCB5KSwgeCwgeSwgZCk7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkJDIodHJlZSwgeCwgeSwgZCkgewogICAgICBpZiAoaXNOYU4oeCkgfHwgaXNOYU4oeSkpIHJldHVybiB0cmVlOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHMKCiAgICAgIHZhciBwYXJlbnQsCiAgICAgICAgICBub2RlID0gdHJlZS5fcm9vdCwKICAgICAgICAgIGxlYWYgPSB7ZGF0YTogZH0sCiAgICAgICAgICB4MCA9IHRyZWUuX3gwLAogICAgICAgICAgeTAgPSB0cmVlLl95MCwKICAgICAgICAgIHgxID0gdHJlZS5feDEsCiAgICAgICAgICB5MSA9IHRyZWUuX3kxLAogICAgICAgICAgeG0sCiAgICAgICAgICB5bSwKICAgICAgICAgIHhwLAogICAgICAgICAgeXAsCiAgICAgICAgICByaWdodCwKICAgICAgICAgIGJvdHRvbSwKICAgICAgICAgIGksCiAgICAgICAgICBqOwoKICAgICAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLgogICAgICBpZiAoIW5vZGUpIHJldHVybiB0cmVlLl9yb290ID0gbGVhZiwgdHJlZTsKCiAgICAgIC8vIEZpbmQgdGhlIGV4aXN0aW5nIGxlYWYgZm9yIHRoZSBuZXcgcG9pbnQsIG9yIGFkZCBpdC4KICAgICAgd2hpbGUgKG5vZGUubGVuZ3RoKSB7CiAgICAgICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07CiAgICAgICAgaWYgKHBhcmVudCA9IG5vZGUsICEobm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7CiAgICAgIH0KCiAgICAgIC8vIElzIHRoZSBuZXcgcG9pbnQgaXMgZXhhY3RseSBjb2luY2lkZW50IHdpdGggdGhlIGV4aXN0aW5nIHBvaW50PwogICAgICB4cCA9ICt0cmVlLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKTsKICAgICAgeXAgPSArdHJlZS5feS5jYWxsKG51bGwsIG5vZGUuZGF0YSk7CiAgICAgIGlmICh4ID09PSB4cCAmJiB5ID09PSB5cCkgcmV0dXJuIGxlYWYubmV4dCA9IG5vZGUsIHBhcmVudCA/IHBhcmVudFtpXSA9IGxlYWYgOiB0cmVlLl9yb290ID0gbGVhZiwgdHJlZTsKCiAgICAgIC8vIE90aGVyd2lzZSwgc3BsaXQgdGhlIGxlYWYgbm9kZSB1bnRpbCB0aGUgb2xkIGFuZCBuZXcgcG9pbnQgYXJlIHNlcGFyYXRlZC4KICAgICAgZG8gewogICAgICAgIHBhcmVudCA9IHBhcmVudCA/IHBhcmVudFtpXSA9IG5ldyBBcnJheSg0KSA6IHRyZWUuX3Jvb3QgPSBuZXcgQXJyYXkoNCk7CiAgICAgICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07CiAgICAgIH0gd2hpbGUgKChpID0gYm90dG9tIDw8IDEgfCByaWdodCkgPT09IChqID0gKHlwID49IHltKSA8PCAxIHwgKHhwID49IHhtKSkpOwogICAgICByZXR1cm4gcGFyZW50W2pdID0gbm9kZSwgcGFyZW50W2ldID0gbGVhZiwgdHJlZTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRBbGwkMShkYXRhKSB7CiAgICAgIHZhciBkLCBpLCBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICB4LAogICAgICAgICAgeSwKICAgICAgICAgIHh6ID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgeXogPSBuZXcgQXJyYXkobiksCiAgICAgICAgICB4MCA9IEluZmluaXR5LAogICAgICAgICAgeTAgPSBJbmZpbml0eSwKICAgICAgICAgIHgxID0gLUluZmluaXR5LAogICAgICAgICAgeTEgPSAtSW5maW5pdHk7CgogICAgICAvLyBDb21wdXRlIHRoZSBwb2ludHMgYW5kIHRoZWlyIGV4dGVudC4KICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkID0gZGF0YVtpXSkpIHx8IGlzTmFOKHkgPSArdGhpcy5feS5jYWxsKG51bGwsIGQpKSkgY29udGludWU7CiAgICAgICAgeHpbaV0gPSB4OwogICAgICAgIHl6W2ldID0geTsKICAgICAgICBpZiAoeCA8IHgwKSB4MCA9IHg7CiAgICAgICAgaWYgKHggPiB4MSkgeDEgPSB4OwogICAgICAgIGlmICh5IDwgeTApIHkwID0geTsKICAgICAgICBpZiAoeSA+IHkxKSB5MSA9IHk7CiAgICAgIH0KCiAgICAgIC8vIElmIHRoZXJlIHdlcmUgbm8gKHZhbGlkKSBwb2ludHMsIGFib3J0LgogICAgICBpZiAoeDAgPiB4MSB8fCB5MCA+IHkxKSByZXR1cm4gdGhpczsKCiAgICAgIC8vIEV4cGFuZCB0aGUgdHJlZSB0byBjb3ZlciB0aGUgbmV3IHBvaW50cy4KICAgICAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVyKHgxLCB5MSk7CgogICAgICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBhZGQkMih0aGlzLCB4eltpXSwgeXpbaV0sIGRhdGFbaV0pOwogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX2NvdmVyJDEoeCwgeSkgewogICAgICBpZiAoaXNOYU4oeCA9ICt4KSB8fCBpc05hTih5ID0gK3kpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogICAgICB2YXIgeDAgPSB0aGlzLl94MCwKICAgICAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgICAgICB4MSA9IHRoaXMuX3gxLAogICAgICAgICAgeTEgPSB0aGlzLl95MTsKCiAgICAgIC8vIElmIHRoZSBxdWFkdHJlZSBoYXMgbm8gZXh0ZW50LCBpbml0aWFsaXplIHRoZW0uCiAgICAgIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nhcnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCwKICAgICAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9u4oCZdCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIQogICAgICBpZiAoaXNOYU4oeDApKSB7CiAgICAgICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgpKSArIDE7CiAgICAgICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7CiAgICAgIH0KCiAgICAgIC8vIE90aGVyd2lzZSwgZG91YmxlIHJlcGVhdGVkbHkgdG8gY292ZXIuCiAgICAgIGVsc2UgewogICAgICAgIHZhciB6ID0geDEgLSB4MCwKICAgICAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgaTsKCiAgICAgICAgd2hpbGUgKHgwID4geCB8fCB4ID49IHgxIHx8IHkwID4geSB8fCB5ID49IHkxKSB7CiAgICAgICAgICBpID0gKHkgPCB5MCkgPDwgMSB8ICh4IDwgeDApOwogICAgICAgICAgcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50LCB6ICo9IDI7CiAgICAgICAgICBzd2l0Y2ggKGkpIHsKICAgICAgICAgICAgY2FzZSAwOiB4MSA9IHgwICsgeiwgeTEgPSB5MCArIHo7IGJyZWFrOwogICAgICAgICAgICBjYXNlIDE6IHgwID0geDEgLSB6LCB5MSA9IHkwICsgejsgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgMjogeDEgPSB4MCArIHosIHkwID0geTEgLSB6OyBicmVhazsKICAgICAgICAgICAgY2FzZSAzOiB4MCA9IHgxIC0geiwgeTAgPSB5MSAtIHo7IGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX3Jvb3QgJiYgdGhpcy5fcm9vdC5sZW5ndGgpIHRoaXMuX3Jvb3QgPSBub2RlOwogICAgICB9CgogICAgICB0aGlzLl94MCA9IHgwOwogICAgICB0aGlzLl95MCA9IHkwOwogICAgICB0aGlzLl94MSA9IHgxOwogICAgICB0aGlzLl95MSA9IHkxOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX2RhdGEkMSgpIHsKICAgICAgdmFyIGRhdGEgPSBbXTsKICAgICAgdGhpcy52aXNpdChmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKCFub2RlLmxlbmd0aCkgZG8gZGF0YS5wdXNoKG5vZGUuZGF0YSk7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KQogICAgICB9KTsKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9leHRlbnQkMShfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuY292ZXIoK19bMF1bMF0sICtfWzBdWzFdKS5jb3ZlcigrX1sxXVswXSwgK19bMV1bMV0pCiAgICAgICAgICA6IGlzTmFOKHRoaXMuX3gwKSA/IHVuZGVmaW5lZCA6IFtbdGhpcy5feDAsIHRoaXMuX3kwXSwgW3RoaXMuX3gxLCB0aGlzLl95MV1dOwogICAgfQoKICAgIGZ1bmN0aW9uIFF1YWQkMShub2RlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICB0aGlzLngwID0geDA7CiAgICAgIHRoaXMueTAgPSB5MDsKICAgICAgdGhpcy54MSA9IHgxOwogICAgICB0aGlzLnkxID0geTE7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9maW5kJDEoeCwgeSwgcmFkaXVzKSB7CiAgICAgIHZhciBkYXRhLAogICAgICAgICAgeDAgPSB0aGlzLl94MCwKICAgICAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgICAgICB4MSwKICAgICAgICAgIHkxLAogICAgICAgICAgeDIsCiAgICAgICAgICB5MiwKICAgICAgICAgIHgzID0gdGhpcy5feDEsCiAgICAgICAgICB5MyA9IHRoaXMuX3kxLAogICAgICAgICAgcXVhZHMgPSBbXSwKICAgICAgICAgIG5vZGUgPSB0aGlzLl9yb290LAogICAgICAgICAgcSwKICAgICAgICAgIGk7CgogICAgICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZCQxKG5vZGUsIHgwLCB5MCwgeDMsIHkzKSk7CiAgICAgIGlmIChyYWRpdXMgPT0gbnVsbCkgcmFkaXVzID0gSW5maW5pdHk7CiAgICAgIGVsc2UgewogICAgICAgIHgwID0geCAtIHJhZGl1cywgeTAgPSB5IC0gcmFkaXVzOwogICAgICAgIHgzID0geCArIHJhZGl1cywgeTMgPSB5ICsgcmFkaXVzOwogICAgICAgIHJhZGl1cyAqPSByYWRpdXM7CiAgICAgIH0KCiAgICAgIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHsKCiAgICAgICAgLy8gU3RvcCBzZWFyY2hpbmcgaWYgdGhpcyBxdWFkcmFudCBjYW7igJl0IGNvbnRhaW4gYSBjbG9zZXIgbm9kZS4KICAgICAgICBpZiAoIShub2RlID0gcS5ub2RlKQogICAgICAgICAgICB8fCAoeDEgPSBxLngwKSA+IHgzCiAgICAgICAgICAgIHx8ICh5MSA9IHEueTApID4geTMKICAgICAgICAgICAgfHwgKHgyID0gcS54MSkgPCB4MAogICAgICAgICAgICB8fCAoeTIgPSBxLnkxKSA8IHkwKSBjb250aW51ZTsKCiAgICAgICAgLy8gQmlzZWN0IHRoZSBjdXJyZW50IHF1YWRyYW50LgogICAgICAgIGlmIChub2RlLmxlbmd0aCkgewogICAgICAgICAgdmFyIHhtID0gKHgxICsgeDIpIC8gMiwKICAgICAgICAgICAgICB5bSA9ICh5MSArIHkyKSAvIDI7CgogICAgICAgICAgcXVhZHMucHVzaCgKICAgICAgICAgICAgbmV3IFF1YWQkMShub2RlWzNdLCB4bSwgeW0sIHgyLCB5MiksCiAgICAgICAgICAgIG5ldyBRdWFkJDEobm9kZVsyXSwgeDEsIHltLCB4bSwgeTIpLAogICAgICAgICAgICBuZXcgUXVhZCQxKG5vZGVbMV0sIHhtLCB5MSwgeDIsIHltKSwKICAgICAgICAgICAgbmV3IFF1YWQkMShub2RlWzBdLCB4MSwgeTEsIHhtLCB5bSkKICAgICAgICAgICk7CgogICAgICAgICAgLy8gVmlzaXQgdGhlIGNsb3Nlc3QgcXVhZHJhbnQgZmlyc3QuCiAgICAgICAgICBpZiAoaSA9ICh5ID49IHltKSA8PCAxIHwgKHggPj0geG0pKSB7CiAgICAgICAgICAgIHEgPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV0gPSBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV07CiAgICAgICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDEgLSBpXSA9IHE7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBWaXNpdCB0aGlzIHBvaW50LiAoVmlzaXRpbmcgY29pbmNpZGVudCBwb2ludHMgaXNu4oCZdCBuZWNlc3NhcnkhKQogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGR4ID0geCAtICt0aGlzLl94LmNhbGwobnVsbCwgbm9kZS5kYXRhKSwKICAgICAgICAgICAgICBkeSA9IHkgLSArdGhpcy5feS5jYWxsKG51bGwsIG5vZGUuZGF0YSksCiAgICAgICAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICAgIGlmIChkMiA8IHJhZGl1cykgewogICAgICAgICAgICB2YXIgZCA9IE1hdGguc3FydChyYWRpdXMgPSBkMik7CiAgICAgICAgICAgIHgwID0geCAtIGQsIHkwID0geSAtIGQ7CiAgICAgICAgICAgIHgzID0geCArIGQsIHkzID0geSArIGQ7CiAgICAgICAgICAgIGRhdGEgPSBub2RlLmRhdGE7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZGF0YTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3JlbW92ZSQxKGQpIHsKICAgICAgaWYgKGlzTmFOKHggPSArdGhpcy5feC5jYWxsKG51bGwsIGQpKSB8fCBpc05hTih5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKSkpIHJldHVybiB0aGlzOyAvLyBpZ25vcmUgaW52YWxpZCBwb2ludHMKCiAgICAgIHZhciBwYXJlbnQsCiAgICAgICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgICAgIHJldGFpbmVyLAogICAgICAgICAgcHJldmlvdXMsCiAgICAgICAgICBuZXh0LAogICAgICAgICAgeDAgPSB0aGlzLl94MCwKICAgICAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgICAgICB4MSA9IHRoaXMuX3gxLAogICAgICAgICAgeTEgPSB0aGlzLl95MSwKICAgICAgICAgIHgsCiAgICAgICAgICB5LAogICAgICAgICAgeG0sCiAgICAgICAgICB5bSwKICAgICAgICAgIHJpZ2h0LAogICAgICAgICAgYm90dG9tLAogICAgICAgICAgaSwKICAgICAgICAgIGo7CgogICAgICAvLyBJZiB0aGUgdHJlZSBpcyBlbXB0eSwgaW5pdGlhbGl6ZSB0aGUgcm9vdCBhcyBhIGxlYWYuCiAgICAgIGlmICghbm9kZSkgcmV0dXJuIHRoaXM7CgogICAgICAvLyBGaW5kIHRoZSBsZWFmIG5vZGUgZm9yIHRoZSBwb2ludC4KICAgICAgLy8gV2hpbGUgZGVzY2VuZGluZywgYWxzbyByZXRhaW4gdGhlIGRlZXBlc3QgcGFyZW50IHdpdGggYSBub24tcmVtb3ZlZCBzaWJsaW5nLgogICAgICBpZiAobm9kZS5sZW5ndGgpIHdoaWxlICh0cnVlKSB7CiAgICAgICAgaWYgKHJpZ2h0ID0geCA+PSAoeG0gPSAoeDAgKyB4MSkgLyAyKSkgeDAgPSB4bTsgZWxzZSB4MSA9IHhtOwogICAgICAgIGlmIChib3R0b20gPSB5ID49ICh5bSA9ICh5MCArIHkxKSAvIDIpKSB5MCA9IHltOyBlbHNlIHkxID0geW07CiAgICAgICAgaWYgKCEocGFyZW50ID0gbm9kZSwgbm9kZSA9IG5vZGVbaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHRdKSkgcmV0dXJuIHRoaXM7CiAgICAgICAgaWYgKCFub2RlLmxlbmd0aCkgYnJlYWs7CiAgICAgICAgaWYgKHBhcmVudFsoaSArIDEpICYgM10gfHwgcGFyZW50WyhpICsgMikgJiAzXSB8fCBwYXJlbnRbKGkgKyAzKSAmIDNdKSByZXRhaW5lciA9IHBhcmVudCwgaiA9IGk7CiAgICAgIH0KCiAgICAgIC8vIEZpbmQgdGhlIHBvaW50IHRvIHJlbW92ZS4KICAgICAgd2hpbGUgKG5vZGUuZGF0YSAhPT0gZCkgaWYgKCEocHJldmlvdXMgPSBub2RlLCBub2RlID0gbm9kZS5uZXh0KSkgcmV0dXJuIHRoaXM7CiAgICAgIGlmIChuZXh0ID0gbm9kZS5uZXh0KSBkZWxldGUgbm9kZS5uZXh0OwoKICAgICAgLy8gSWYgdGhlcmUgYXJlIG11bHRpcGxlIGNvaW5jaWRlbnQgcG9pbnRzLCByZW1vdmUganVzdCB0aGUgcG9pbnQuCiAgICAgIGlmIChwcmV2aW91cykgcmV0dXJuIChuZXh0ID8gcHJldmlvdXMubmV4dCA9IG5leHQgOiBkZWxldGUgcHJldmlvdXMubmV4dCksIHRoaXM7CgogICAgICAvLyBJZiB0aGlzIGlzIHRoZSByb290IHBvaW50LCByZW1vdmUgaXQuCiAgICAgIGlmICghcGFyZW50KSByZXR1cm4gdGhpcy5fcm9vdCA9IG5leHQsIHRoaXM7CgogICAgICAvLyBSZW1vdmUgdGhpcyBsZWFmLgogICAgICBuZXh0ID8gcGFyZW50W2ldID0gbmV4dCA6IGRlbGV0ZSBwYXJlbnRbaV07CgogICAgICAvLyBJZiB0aGUgcGFyZW50IG5vdyBjb250YWlucyBleGFjdGx5IG9uZSBsZWFmLCBjb2xsYXBzZSBzdXBlcmZsdW91cyBwYXJlbnRzLgogICAgICBpZiAoKG5vZGUgPSBwYXJlbnRbMF0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbM10pCiAgICAgICAgICAmJiBub2RlID09PSAocGFyZW50WzNdIHx8IHBhcmVudFsyXSB8fCBwYXJlbnRbMV0gfHwgcGFyZW50WzBdKQogICAgICAgICAgJiYgIW5vZGUubGVuZ3RoKSB7CiAgICAgICAgaWYgKHJldGFpbmVyKSByZXRhaW5lcltqXSA9IG5vZGU7CiAgICAgICAgZWxzZSB0aGlzLl9yb290ID0gbm9kZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlQWxsJDEoZGF0YSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGRhdGEubGVuZ3RoOyBpIDwgbjsgKytpKSB0aGlzLnJlbW92ZShkYXRhW2ldKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9yb290JDEoKSB7CiAgICAgIHJldHVybiB0aGlzLl9yb290OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfc2l6ZSQxKCkgewogICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmICghbm9kZS5sZW5ndGgpIGRvICsrc2l6ZTsgd2hpbGUgKG5vZGUgPSBub2RlLm5leHQpCiAgICAgIH0pOwogICAgICByZXR1cm4gc2l6ZTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3Zpc2l0JDEoY2FsbGJhY2spIHsKICAgICAgdmFyIHF1YWRzID0gW10sIHEsIG5vZGUgPSB0aGlzLl9yb290LCBjaGlsZCwgeDAsIHkwLCB4MSwgeTE7CiAgICAgIGlmIChub2RlKSBxdWFkcy5wdXNoKG5ldyBRdWFkJDEobm9kZSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpKTsKICAgICAgd2hpbGUgKHEgPSBxdWFkcy5wb3AoKSkgewogICAgICAgIGlmICghY2FsbGJhY2sobm9kZSA9IHEubm9kZSwgeDAgPSBxLngwLCB5MCA9IHEueTAsIHgxID0gcS54MSwgeTEgPSBxLnkxKSAmJiBub2RlLmxlbmd0aCkgewogICAgICAgICAgdmFyIHhtID0gKHgwICsgeDEpIC8gMiwgeW0gPSAoeTAgKyB5MSkgLyAyOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVszXSkgcXVhZHMucHVzaChuZXcgUXVhZCQxKGNoaWxkLCB4bSwgeW0sIHgxLCB5MSkpOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVsyXSkgcXVhZHMucHVzaChuZXcgUXVhZCQxKGNoaWxkLCB4MCwgeW0sIHhtLCB5MSkpOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVsxXSkgcXVhZHMucHVzaChuZXcgUXVhZCQxKGNoaWxkLCB4bSwgeTAsIHgxLCB5bSkpOwogICAgICAgICAgaWYgKGNoaWxkID0gbm9kZVswXSkgcXVhZHMucHVzaChuZXcgUXVhZCQxKGNoaWxkLCB4MCwgeTAsIHhtLCB5bSkpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3Zpc2l0QWZ0ZXIkMShjYWxsYmFjaykgewogICAgICB2YXIgcXVhZHMgPSBbXSwgbmV4dCA9IFtdLCBxOwogICAgICBpZiAodGhpcy5fcm9vdCkgcXVhZHMucHVzaChuZXcgUXVhZCQxKHRoaXMuX3Jvb3QsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7CiAgICAgIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHsKICAgICAgICB2YXIgbm9kZSA9IHEubm9kZTsKICAgICAgICBpZiAobm9kZS5sZW5ndGgpIHsKICAgICAgICAgIHZhciBjaGlsZCwgeDAgPSBxLngwLCB5MCA9IHEueTAsIHgxID0gcS54MSwgeTEgPSBxLnkxLCB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQkMShjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQkMShjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQkMShjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQkMShjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTsKICAgICAgICB9CiAgICAgICAgbmV4dC5wdXNoKHEpOwogICAgICB9CiAgICAgIHdoaWxlIChxID0gbmV4dC5wb3AoKSkgewogICAgICAgIGNhbGxiYWNrKHEubm9kZSwgcS54MCwgcS55MCwgcS54MSwgcS55MSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFgkMihkKSB7CiAgICAgIHJldHVybiBkWzBdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfeCQxKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5feCA9IF8sIHRoaXMpIDogdGhpcy5feDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0WSQyKGQpIHsKICAgICAgcmV0dXJuIGRbMV07CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV95JDEoXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aGlzLl95ID0gXywgdGhpcykgOiB0aGlzLl95OwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YWR0cmVlJDEobm9kZXMsIHgsIHkpIHsKICAgICAgdmFyIHRyZWUgPSBuZXcgUXVhZHRyZWUkMSh4ID09IG51bGwgPyBkZWZhdWx0WCQyIDogeCwgeSA9PSBudWxsID8gZGVmYXVsdFkkMiA6IHksIE5hTiwgTmFOLCBOYU4sIE5hTik7CiAgICAgIHJldHVybiBub2RlcyA9PSBudWxsID8gdHJlZSA6IHRyZWUuYWRkQWxsKG5vZGVzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBRdWFkdHJlZSQxKHgsIHksIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIHRoaXMuX3ggPSB4OwogICAgICB0aGlzLl95ID0geTsKICAgICAgdGhpcy5feDAgPSB4MDsKICAgICAgdGhpcy5feTAgPSB5MDsKICAgICAgdGhpcy5feDEgPSB4MTsKICAgICAgdGhpcy5feTEgPSB5MTsKICAgICAgdGhpcy5fcm9vdCA9IHVuZGVmaW5lZDsKICAgIH0KCiAgICBmdW5jdGlvbiBsZWFmX2NvcHkkMShsZWFmKSB7CiAgICAgIHZhciBjb3B5ID0ge2RhdGE6IGxlYWYuZGF0YX0sIG5leHQgPSBjb3B5OwogICAgICB3aGlsZSAobGVhZiA9IGxlYWYubmV4dCkgbmV4dCA9IG5leHQubmV4dCA9IHtkYXRhOiBsZWFmLmRhdGF9OwogICAgICByZXR1cm4gY29weTsKICAgIH0KCiAgICB2YXIgdHJlZVByb3RvJDEgPSBxdWFkdHJlZSQxLnByb3RvdHlwZSA9IFF1YWR0cmVlJDEucHJvdG90eXBlOwoKICAgIHRyZWVQcm90byQxLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIGNvcHkgPSBuZXcgUXVhZHRyZWUkMSh0aGlzLl94LCB0aGlzLl95LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSksCiAgICAgICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgICAgIG5vZGVzLAogICAgICAgICAgY2hpbGQ7CgogICAgICBpZiAoIW5vZGUpIHJldHVybiBjb3B5OwoKICAgICAgaWYgKCFub2RlLmxlbmd0aCkgcmV0dXJuIGNvcHkuX3Jvb3QgPSBsZWFmX2NvcHkkMShub2RlKSwgY29weTsKCiAgICAgIG5vZGVzID0gW3tzb3VyY2U6IG5vZGUsIHRhcmdldDogY29weS5fcm9vdCA9IG5ldyBBcnJheSg0KX1dOwogICAgICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCA0OyArK2kpIHsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGUuc291cmNlW2ldKSB7CiAgICAgICAgICAgIGlmIChjaGlsZC5sZW5ndGgpIG5vZGVzLnB1c2goe3NvdXJjZTogY2hpbGQsIHRhcmdldDogbm9kZS50YXJnZXRbaV0gPSBuZXcgQXJyYXkoNCl9KTsKICAgICAgICAgICAgZWxzZSBub2RlLnRhcmdldFtpXSA9IGxlYWZfY29weSQxKGNoaWxkKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBjb3B5OwogICAgfTsKCiAgICB0cmVlUHJvdG8kMS5hZGQgPSB0cmVlX2FkZCQxOwogICAgdHJlZVByb3RvJDEuYWRkQWxsID0gYWRkQWxsJDE7CiAgICB0cmVlUHJvdG8kMS5jb3ZlciA9IHRyZWVfY292ZXIkMTsKICAgIHRyZWVQcm90byQxLmRhdGEgPSB0cmVlX2RhdGEkMTsKICAgIHRyZWVQcm90byQxLmV4dGVudCA9IHRyZWVfZXh0ZW50JDE7CiAgICB0cmVlUHJvdG8kMS5maW5kID0gdHJlZV9maW5kJDE7CiAgICB0cmVlUHJvdG8kMS5yZW1vdmUgPSB0cmVlX3JlbW92ZSQxOwogICAgdHJlZVByb3RvJDEucmVtb3ZlQWxsID0gcmVtb3ZlQWxsJDE7CiAgICB0cmVlUHJvdG8kMS5yb290ID0gdHJlZV9yb290JDE7CiAgICB0cmVlUHJvdG8kMS5zaXplID0gdHJlZV9zaXplJDE7CiAgICB0cmVlUHJvdG8kMS52aXNpdCA9IHRyZWVfdmlzaXQkMTsKICAgIHRyZWVQcm90byQxLnZpc2l0QWZ0ZXIgPSB0cmVlX3Zpc2l0QWZ0ZXIkMTsKICAgIHRyZWVQcm90byQxLnggPSB0cmVlX3gkMTsKICAgIHRyZWVQcm90byQxLnkgPSB0cmVlX3kkMTsKCiAgICBmdW5jdGlvbiB4JDUoZCkgewogICAgICByZXR1cm4gZC54ICsgZC52eDsKICAgIH0KCiAgICBmdW5jdGlvbiB5JDUoZCkgewogICAgICByZXR1cm4gZC55ICsgZC52eTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xsaWRlJDEocmFkaXVzKSB7CiAgICAgIHZhciBub2RlcywKICAgICAgICAgIHJhZGlpLAogICAgICAgICAgc3RyZW5ndGggPSAxLAogICAgICAgICAgaXRlcmF0aW9ucyA9IDE7CgogICAgICBpZiAodHlwZW9mIHJhZGl1cyAhPT0gImZ1bmN0aW9uIikgcmFkaXVzID0gY29uc3RhbnQkbChyYWRpdXMgPT0gbnVsbCA/IDEgOiArcmFkaXVzKTsKCiAgICAgIGZ1bmN0aW9uIGZvcmNlKCkgewogICAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgICB0cmVlLAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICB4aSwKICAgICAgICAgICAgeWksCiAgICAgICAgICAgIHJpLAogICAgICAgICAgICByaTI7CgogICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaXRlcmF0aW9uczsgKytrKSB7CiAgICAgICAgICB0cmVlID0gcXVhZHRyZWUkMShub2RlcywgeCQ1LCB5JDUpLnZpc2l0QWZ0ZXIocHJlcGFyZSk7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIG5vZGUgPSBub2Rlc1tpXTsKICAgICAgICAgICAgcmkgPSByYWRpaVtub2RlLmluZGV4XSwgcmkyID0gcmkgKiByaTsKICAgICAgICAgICAgeGkgPSBub2RlLnggKyBub2RlLnZ4OwogICAgICAgICAgICB5aSA9IG5vZGUueSArIG5vZGUudnk7CiAgICAgICAgICAgIHRyZWUudmlzaXQoYXBwbHkpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gYXBwbHkocXVhZCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgICAgIHZhciBkYXRhID0gcXVhZC5kYXRhLCByaiA9IHF1YWQuciwgciA9IHJpICsgcmo7CiAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICBpZiAoZGF0YS5pbmRleCA+IG5vZGUuaW5kZXgpIHsKICAgICAgICAgICAgICB2YXIgeCA9IHhpIC0gZGF0YS54IC0gZGF0YS52eCwKICAgICAgICAgICAgICAgICAgeSA9IHlpIC0gZGF0YS55IC0gZGF0YS52eSwKICAgICAgICAgICAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7CiAgICAgICAgICAgICAgaWYgKGwgPCByICogcikgewogICAgICAgICAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUkMSgpLCBsICs9IHggKiB4OwogICAgICAgICAgICAgICAgaWYgKHkgPT09IDApIHkgPSBqaWdnbGUkMSgpLCBsICs9IHkgKiB5OwogICAgICAgICAgICAgICAgbCA9IChyIC0gKGwgPSBNYXRoLnNxcnQobCkpKSAvIGwgKiBzdHJlbmd0aDsKICAgICAgICAgICAgICAgIG5vZGUudnggKz0gKHggKj0gbCkgKiAociA9IChyaiAqPSByaikgLyAocmkyICsgcmopKTsKICAgICAgICAgICAgICAgIG5vZGUudnkgKz0gKHkgKj0gbCkgKiByOwogICAgICAgICAgICAgICAgZGF0YS52eCAtPSB4ICogKHIgPSAxIC0gcik7CiAgICAgICAgICAgICAgICBkYXRhLnZ5IC09IHkgKiByOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4geDAgPiB4aSArIHIgfHwgeDEgPCB4aSAtIHIgfHwgeTAgPiB5aSArIHIgfHwgeTEgPCB5aSAtIHI7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBwcmVwYXJlKHF1YWQpIHsKICAgICAgICBpZiAocXVhZC5kYXRhKSByZXR1cm4gcXVhZC5yID0gcmFkaWlbcXVhZC5kYXRhLmluZGV4XTsKICAgICAgICBmb3IgKHZhciBpID0gcXVhZC5yID0gMDsgaSA8IDQ7ICsraSkgewogICAgICAgICAgaWYgKHF1YWRbaV0gJiYgcXVhZFtpXS5yID4gcXVhZC5yKSB7CiAgICAgICAgICAgIHF1YWQuciA9IHF1YWRbaV0ucjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOwogICAgICAgIHJhZGlpID0gbmV3IEFycmF5KG4pOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIG5vZGUgPSBub2Rlc1tpXSwgcmFkaWlbbm9kZS5pbmRleF0gPSArcmFkaXVzKG5vZGUsIGksIG5vZGVzKTsKICAgICAgfQoKICAgICAgZm9yY2UuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBub2RlcyA9IF87CiAgICAgICAgaW5pdGlhbGl6ZSgpOwogICAgICB9OwoKICAgICAgZm9yY2UuaXRlcmF0aW9ucyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpdGVyYXRpb25zID0gK18sIGZvcmNlKSA6IGl0ZXJhdGlvbnM7CiAgICAgIH07CgogICAgICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9ICtfLCBmb3JjZSkgOiBzdHJlbmd0aDsKICAgICAgfTsKCiAgICAgIGZvcmNlLnJhZGl1cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRsKCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiByYWRpdXM7CiAgICAgIH07CgogICAgICByZXR1cm4gZm9yY2U7CiAgICB9CgogICAgdmFyIHByZWZpeCQyID0gIiQiOwoKICAgIGZ1bmN0aW9uIE1hcCQzKCkge30KCiAgICBNYXAkMy5wcm90b3R5cGUgPSBtYXAkNi5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBNYXAkMywKICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICByZXR1cm4gKHByZWZpeCQyICsga2V5KSBpbiB0aGlzOwogICAgICB9LAogICAgICBnZXQ6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHJldHVybiB0aGlzW3ByZWZpeCQyICsga2V5XTsKICAgICAgfSwKICAgICAgc2V0OiBmdW5jdGlvbihrZXksIHZhbHVlKSB7CiAgICAgICAgdGhpc1twcmVmaXgkMiArIGtleV0gPSB2YWx1ZTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXgkMiArIGtleTsKICAgICAgICByZXR1cm4gcHJvcGVydHkgaW4gdGhpcyAmJiBkZWxldGUgdGhpc1twcm9wZXJ0eV07CiAgICAgIH0sCiAgICAgIGNsZWFyOiBmdW5jdGlvbigpIHsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQyKSBkZWxldGUgdGhpc1twcm9wZXJ0eV07CiAgICAgIH0sCiAgICAgIGtleXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBrZXlzID0gW107CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMikga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTsKICAgICAgICByZXR1cm4ga2V5czsKICAgICAgfSwKICAgICAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMikgdmFsdWVzLnB1c2godGhpc1twcm9wZXJ0eV0pOwogICAgICAgIHJldHVybiB2YWx1ZXM7CiAgICAgIH0sCiAgICAgIGVudHJpZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlbnRyaWVzID0gW107CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMikgZW50cmllcy5wdXNoKHtrZXk6IHByb3BlcnR5LnNsaWNlKDEpLCB2YWx1ZTogdGhpc1twcm9wZXJ0eV19KTsKICAgICAgICByZXR1cm4gZW50cmllczsKICAgICAgfSwKICAgICAgc2l6ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNpemUgPSAwOwogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4JDIpICsrc2l6ZTsKICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgfSwKICAgICAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4JDIpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfSwKICAgICAgZWFjaDogZnVuY3Rpb24oZikgewogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4JDIpIGYodGhpc1twcm9wZXJ0eV0sIHByb3BlcnR5LnNsaWNlKDEpLCB0aGlzKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBtYXAkNihvYmplY3QsIGYpIHsKICAgICAgdmFyIG1hcCA9IG5ldyBNYXAkMzsKCiAgICAgIC8vIENvcHkgY29uc3RydWN0b3IuCiAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBNYXAkMykgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUsIGtleSkgeyBtYXAuc2V0KGtleSwgdmFsdWUpOyB9KTsKCiAgICAgIC8vIEluZGV4IGFycmF5IGJ5IG51bWVyaWMgaW5kZXggb3Igc3BlY2lmaWVkIGtleSBmdW5jdGlvbi4KICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShvYmplY3QpKSB7CiAgICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgICAgbiA9IG9iamVjdC5sZW5ndGgsCiAgICAgICAgICAgIG87CgogICAgICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGksIG9iamVjdFtpXSk7CiAgICAgICAgZWxzZSB3aGlsZSAoKytpIDwgbikgbWFwLnNldChmKG8gPSBvYmplY3RbaV0sIGksIG9iamVjdCksIG8pOwogICAgICB9CgogICAgICAvLyBDb252ZXJ0IG9iamVjdCB0byBtYXAuCiAgICAgIGVsc2UgaWYgKG9iamVjdCkgZm9yICh2YXIga2V5IGluIG9iamVjdCkgbWFwLnNldChrZXksIG9iamVjdFtrZXldKTsKCiAgICAgIHJldHVybiBtYXA7CiAgICB9CgogICAgZnVuY3Rpb24gU2V0JDMoKSB7fQoKICAgIHZhciBwcm90byQzID0gbWFwJDYucHJvdG90eXBlOwoKICAgIFNldCQzLnByb3RvdHlwZSA9IHNldCQ5LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFNldCQzLAogICAgICBoYXM6IHByb3RvJDMuaGFzLAogICAgICBhZGQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgdmFsdWUgKz0gIiI7CiAgICAgICAgdGhpc1twcmVmaXgkMiArIHZhbHVlXSA9IHZhbHVlOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICByZW1vdmU6IHByb3RvJDMucmVtb3ZlLAogICAgICBjbGVhcjogcHJvdG8kMy5jbGVhciwKICAgICAgdmFsdWVzOiBwcm90byQzLmtleXMsCiAgICAgIHNpemU6IHByb3RvJDMuc2l6ZSwKICAgICAgZW1wdHk6IHByb3RvJDMuZW1wdHksCiAgICAgIGVhY2g6IHByb3RvJDMuZWFjaAogICAgfTsKCiAgICBmdW5jdGlvbiBzZXQkOShvYmplY3QsIGYpIHsKICAgICAgdmFyIHNldCA9IG5ldyBTZXQkMzsKCiAgICAgIC8vIENvcHkgY29uc3RydWN0b3IuCiAgICAgIGlmIChvYmplY3QgaW5zdGFuY2VvZiBTZXQkMykgb2JqZWN0LmVhY2goZnVuY3Rpb24odmFsdWUpIHsgc2V0LmFkZCh2YWx1ZSk7IH0pOwoKICAgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaXTigJlzIGFuIGFycmF5LgogICAgICBlbHNlIGlmIChvYmplY3QpIHsKICAgICAgICB2YXIgaSA9IC0xLCBuID0gb2JqZWN0Lmxlbmd0aDsKICAgICAgICBpZiAoZiA9PSBudWxsKSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChvYmplY3RbaV0pOwogICAgICAgIGVsc2Ugd2hpbGUgKCsraSA8IG4pIHNldC5hZGQoZihvYmplY3RbaV0sIGksIG9iamVjdCkpOwogICAgICB9CgogICAgICByZXR1cm4gc2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIGluZGV4JDQoZCkgewogICAgICByZXR1cm4gZC5pbmRleDsKICAgIH0KCiAgICBmdW5jdGlvbiBmaW5kJDEobm9kZUJ5SWQsIG5vZGVJZCkgewogICAgICB2YXIgbm9kZSA9IG5vZGVCeUlkLmdldChub2RlSWQpOwogICAgICBpZiAoIW5vZGUpIHRocm93IG5ldyBFcnJvcigibWlzc2luZzogIiArIG5vZGVJZCk7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmskMyhsaW5rcykgewogICAgICB2YXIgaWQgPSBpbmRleCQ0LAogICAgICAgICAgc3RyZW5ndGggPSBkZWZhdWx0U3RyZW5ndGgsCiAgICAgICAgICBzdHJlbmd0aHMsCiAgICAgICAgICBkaXN0YW5jZSA9IGNvbnN0YW50JGwoMzApLAogICAgICAgICAgZGlzdGFuY2VzLAogICAgICAgICAgbm9kZXMsCiAgICAgICAgICBjb3VudCwKICAgICAgICAgIGJpYXMsCiAgICAgICAgICBpdGVyYXRpb25zID0gMTsKCiAgICAgIGlmIChsaW5rcyA9PSBudWxsKSBsaW5rcyA9IFtdOwoKICAgICAgZnVuY3Rpb24gZGVmYXVsdFN0cmVuZ3RoKGxpbmspIHsKICAgICAgICByZXR1cm4gMSAvIE1hdGgubWluKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSwgY291bnRbbGluay50YXJnZXQuaW5kZXhdKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9yY2UoYWxwaGEpIHsKICAgICAgICBmb3IgKHZhciBrID0gMCwgbiA9IGxpbmtzLmxlbmd0aDsgayA8IGl0ZXJhdGlvbnM7ICsraykgewogICAgICAgICAgZm9yICh2YXIgaSA9IDAsIGxpbmssIHNvdXJjZSwgdGFyZ2V0LCB4LCB5LCBsLCBiOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGxpbmsgPSBsaW5rc1tpXSwgc291cmNlID0gbGluay5zb3VyY2UsIHRhcmdldCA9IGxpbmsudGFyZ2V0OwogICAgICAgICAgICB4ID0gdGFyZ2V0LnggKyB0YXJnZXQudnggLSBzb3VyY2UueCAtIHNvdXJjZS52eCB8fCBqaWdnbGUkMSgpOwogICAgICAgICAgICB5ID0gdGFyZ2V0LnkgKyB0YXJnZXQudnkgLSBzb3VyY2UueSAtIHNvdXJjZS52eSB8fCBqaWdnbGUkMSgpOwogICAgICAgICAgICBsID0gTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpOwogICAgICAgICAgICBsID0gKGwgLSBkaXN0YW5jZXNbaV0pIC8gbCAqIGFscGhhICogc3RyZW5ndGhzW2ldOwogICAgICAgICAgICB4ICo9IGwsIHkgKj0gbDsKICAgICAgICAgICAgdGFyZ2V0LnZ4IC09IHggKiAoYiA9IGJpYXNbaV0pOwogICAgICAgICAgICB0YXJnZXQudnkgLT0geSAqIGI7CiAgICAgICAgICAgIHNvdXJjZS52eCArPSB4ICogKGIgPSAxIC0gYik7CiAgICAgICAgICAgIHNvdXJjZS52eSArPSB5ICogYjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgaWYgKCFub2RlcykgcmV0dXJuOwoKICAgICAgICB2YXIgaSwKICAgICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgICAgbSA9IGxpbmtzLmxlbmd0aCwKICAgICAgICAgICAgbm9kZUJ5SWQgPSBtYXAkNihub2RlcywgaWQpLAogICAgICAgICAgICBsaW5rOwoKICAgICAgICBmb3IgKGkgPSAwLCBjb3VudCA9IG5ldyBBcnJheShuKTsgaSA8IG07ICsraSkgewogICAgICAgICAgbGluayA9IGxpbmtzW2ldLCBsaW5rLmluZGV4ID0gaTsKICAgICAgICAgIGlmICh0eXBlb2YgbGluay5zb3VyY2UgIT09ICJvYmplY3QiKSBsaW5rLnNvdXJjZSA9IGZpbmQkMShub2RlQnlJZCwgbGluay5zb3VyY2UpOwogICAgICAgICAgaWYgKHR5cGVvZiBsaW5rLnRhcmdldCAhPT0gIm9iamVjdCIpIGxpbmsudGFyZ2V0ID0gZmluZCQxKG5vZGVCeUlkLCBsaW5rLnRhcmdldCk7CiAgICAgICAgICBjb3VudFtsaW5rLnNvdXJjZS5pbmRleF0gPSAoY291bnRbbGluay5zb3VyY2UuaW5kZXhdIHx8IDApICsgMTsKICAgICAgICAgIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSA9IChjb3VudFtsaW5rLnRhcmdldC5pbmRleF0gfHwgMCkgKyAxOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMCwgYmlhcyA9IG5ldyBBcnJheShtKTsgaSA8IG07ICsraSkgewogICAgICAgICAgbGluayA9IGxpbmtzW2ldLCBiaWFzW2ldID0gY291bnRbbGluay5zb3VyY2UuaW5kZXhdIC8gKGNvdW50W2xpbmsuc291cmNlLmluZGV4XSArIGNvdW50W2xpbmsudGFyZ2V0LmluZGV4XSk7CiAgICAgICAgfQoKICAgICAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobSksIGluaXRpYWxpemVTdHJlbmd0aCgpOwogICAgICAgIGRpc3RhbmNlcyA9IG5ldyBBcnJheShtKSwgaW5pdGlhbGl6ZURpc3RhbmNlKCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemVTdHJlbmd0aCgpIHsKICAgICAgICBpZiAoIW5vZGVzKSByZXR1cm47CgogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBzdHJlbmd0aHNbaV0gPSArc3RyZW5ndGgobGlua3NbaV0sIGksIGxpbmtzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemVEaXN0YW5jZSgpIHsKICAgICAgICBpZiAoIW5vZGVzKSByZXR1cm47CgogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbGlua3MubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBkaXN0YW5jZXNbaV0gPSArZGlzdGFuY2UobGlua3NbaV0sIGksIGxpbmtzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgbm9kZXMgPSBfOwogICAgICAgIGluaXRpYWxpemUoKTsKICAgICAgfTsKCiAgICAgIGZvcmNlLmxpbmtzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGxpbmtzID0gXywgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiBsaW5rczsKICAgICAgfTsKCiAgICAgIGZvcmNlLmlkID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGlkID0gXywgZm9yY2UpIDogaWQ7CiAgICAgIH07CgogICAgICBmb3JjZS5pdGVyYXRpb25zID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGl0ZXJhdGlvbnMgPSArXywgZm9yY2UpIDogaXRlcmF0aW9uczsKICAgICAgfTsKCiAgICAgIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkbCgrXyksIGluaXRpYWxpemVTdHJlbmd0aCgpLCBmb3JjZSkgOiBzdHJlbmd0aDsKICAgICAgfTsKCiAgICAgIGZvcmNlLmRpc3RhbmNlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRpc3RhbmNlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkbCgrXyksIGluaXRpYWxpemVEaXN0YW5jZSgpLCBmb3JjZSkgOiBkaXN0YW5jZTsKICAgICAgfTsKCiAgICAgIHJldHVybiBmb3JjZTsKICAgIH0KCiAgICB2YXIgbm9vcCQ3ID0ge3ZhbHVlOiBmdW5jdGlvbigpIHt9fTsKCiAgICBmdW5jdGlvbiBkaXNwYXRjaCQ0KCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyAiIikgfHwgKHQgaW4gXykgfHwgL1tccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIiArIHQpOwogICAgICAgIF9bdF0gPSBbXTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERpc3BhdGNoJDQoXyk7CiAgICB9CgogICAgZnVuY3Rpb24gRGlzcGF0Y2gkNChfKSB7CiAgICAgIHRoaXMuXyA9IF87CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXMkNyh0eXBlbmFtZXMsIHR5cGVzKSB7CiAgICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHQpOwogICAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgICAgIH0pOwogICAgfQoKICAgIERpc3BhdGNoJDQucHJvdG90eXBlID0gZGlzcGF0Y2gkNC5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCQ0LAogICAgICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyQ3KHR5cGVuYW1lICsgIiIsIF8pLAogICAgICAgICAgICB0LAogICAgICAgICAgICBpID0gLTEsCiAgICAgICAgICAgIG4gPSBULmxlbmd0aDsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldCQ3KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0JGEoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQkYShfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fOwogICAgICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgICAgICByZXR1cm4gbmV3IERpc3BhdGNoJDQoY29weSk7CiAgICAgIH0sCiAgICAgIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHsKICAgICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9LAogICAgICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykgewogICAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZ2V0JDcodHlwZSwgbmFtZSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgcmV0dXJuIGMudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0JGEodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR5cGVbaV0gPSBub29wJDcsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIHZhciBmcmFtZSQyID0gMCwgLy8gaXMgYW4gYW5pbWF0aW9uIGZyYW1lIHBlbmRpbmc/CiAgICAgICAgdGltZW91dCQ0ID0gMCwgLy8gaXMgYSB0aW1lb3V0IHBlbmRpbmc/CiAgICAgICAgaW50ZXJ2YWwkMyA9IDAsIC8vIGFyZSBhbnkgdGltZXJzIGFjdGl2ZT8KICAgICAgICBwb2tlRGVsYXkkMiA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICAgICAgdGFza0hlYWQkMiwKICAgICAgICB0YXNrVGFpbCQyLAogICAgICAgIGNsb2NrTGFzdCQyID0gMCwKICAgICAgICBjbG9ja05vdyQyID0gMCwKICAgICAgICBjbG9ja1NrZXckMiA9IDAsCiAgICAgICAgY2xvY2skMiA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgICAgIHNldEZyYW1lJDIgPSB0eXBlb2Ygd2luZG93ID09PSAib2JqZWN0IiAmJiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID8gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5iaW5kKHdpbmRvdykgOiBmdW5jdGlvbihmKSB7IHNldFRpbWVvdXQoZiwgMTcpOyB9OwoKICAgIGZ1bmN0aW9uIG5vdyQyKCkgewogICAgICByZXR1cm4gY2xvY2tOb3ckMiB8fCAoc2V0RnJhbWUkMihjbGVhck5vdyQyKSwgY2xvY2tOb3ckMiA9IGNsb2NrJDIubm93KCkgKyBjbG9ja1NrZXckMik7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYXJOb3ckMigpIHsKICAgICAgY2xvY2tOb3ckMiA9IDA7CiAgICB9CgogICAgZnVuY3Rpb24gVGltZXIkMigpIHsKICAgICAgdGhpcy5fY2FsbCA9CiAgICAgIHRoaXMuX3RpbWUgPQogICAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgIH0KCiAgICBUaW1lciQyLnByb3RvdHlwZSA9IHRpbWVyJDIucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVGltZXIkMiwKICAgICAgcmVzdGFydDogZnVuY3Rpb24oY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IFR5cGVFcnJvcigiY2FsbGJhY2sgaXMgbm90IGEgZnVuY3Rpb24iKTsKICAgICAgICB0aW1lID0gKHRpbWUgPT0gbnVsbCA/IG5vdyQyKCkgOiArdGltZSkgKyAoZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXkpOwogICAgICAgIGlmICghdGhpcy5fbmV4dCAmJiB0YXNrVGFpbCQyICE9PSB0aGlzKSB7CiAgICAgICAgICBpZiAodGFza1RhaWwkMikgdGFza1RhaWwkMi5fbmV4dCA9IHRoaXM7CiAgICAgICAgICBlbHNlIHRhc2tIZWFkJDIgPSB0aGlzOwogICAgICAgICAgdGFza1RhaWwkMiA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2NhbGwgPSBjYWxsYmFjazsKICAgICAgICB0aGlzLl90aW1lID0gdGltZTsKICAgICAgICBzbGVlcCQyKCk7CiAgICAgIH0sCiAgICAgIHN0b3A6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9jYWxsKSB7CiAgICAgICAgICB0aGlzLl9jYWxsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX3RpbWUgPSBJbmZpbml0eTsKICAgICAgICAgIHNsZWVwJDIoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdGltZXIkMihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXIkMjsKICAgICAgdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVyRmx1c2gkMigpIHsKICAgICAgbm93JDIoKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgKytmcmFtZSQyOyAvLyBQcmV0ZW5kIHdl4oCZdmUgc2V0IGFuIGFsYXJtLCBpZiB3ZSBoYXZlbuKAmXQgYWxyZWFkeS4KICAgICAgdmFyIHQgPSB0YXNrSGVhZCQyLCBlOwogICAgICB3aGlsZSAodCkgewogICAgICAgIGlmICgoZSA9IGNsb2NrTm93JDIgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7CiAgICAgICAgdCA9IHQuX25leHQ7CiAgICAgIH0KICAgICAgLS1mcmFtZSQyOwogICAgfQoKICAgIGZ1bmN0aW9uIHdha2UkMigpIHsKICAgICAgY2xvY2tOb3ckMiA9IChjbG9ja0xhc3QkMiA9IGNsb2NrJDIubm93KCkpICsgY2xvY2tTa2V3JDI7CiAgICAgIGZyYW1lJDIgPSB0aW1lb3V0JDQgPSAwOwogICAgICB0cnkgewogICAgICAgIHRpbWVyRmx1c2gkMigpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGZyYW1lJDIgPSAwOwogICAgICAgIG5hcCQyKCk7CiAgICAgICAgY2xvY2tOb3ckMiA9IDA7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwb2tlJDIoKSB7CiAgICAgIHZhciBub3cgPSBjbG9jayQyLm5vdygpLCBkZWxheSA9IG5vdyAtIGNsb2NrTGFzdCQyOwogICAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkkMikgY2xvY2tTa2V3JDIgLT0gZGVsYXksIGNsb2NrTGFzdCQyID0gbm93OwogICAgfQoKICAgIGZ1bmN0aW9uIG5hcCQyKCkgewogICAgICB2YXIgdDAsIHQxID0gdGFza0hlYWQkMiwgdDIsIHRpbWUgPSBJbmZpbml0eTsKICAgICAgd2hpbGUgKHQxKSB7CiAgICAgICAgaWYgKHQxLl9jYWxsKSB7CiAgICAgICAgICBpZiAodGltZSA+IHQxLl90aW1lKSB0aW1lID0gdDEuX3RpbWU7CiAgICAgICAgICB0MCA9IHQxLCB0MSA9IHQxLl9uZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0MiA9IHQxLl9uZXh0LCB0MS5fbmV4dCA9IG51bGw7CiAgICAgICAgICB0MSA9IHQwID8gdDAuX25leHQgPSB0MiA6IHRhc2tIZWFkJDIgPSB0MjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGFza1RhaWwkMiA9IHQwOwogICAgICBzbGVlcCQyKHRpbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNsZWVwJDIodGltZSkgewogICAgICBpZiAoZnJhbWUkMikgcmV0dXJuOyAvLyBTb29uZXN0IGFsYXJtIGFscmVhZHkgc2V0LCBvciB3aWxsIGJlLgogICAgICBpZiAodGltZW91dCQ0KSB0aW1lb3V0JDQgPSBjbGVhclRpbWVvdXQodGltZW91dCQ0KTsKICAgICAgdmFyIGRlbGF5ID0gdGltZSAtIGNsb2NrTm93JDI7IC8vIFN0cmljdGx5IGxlc3MgdGhhbiBpZiB3ZSByZWNvbXB1dGVkIGNsb2NrTm93LgogICAgICBpZiAoZGVsYXkgPiAyNCkgewogICAgICAgIGlmICh0aW1lIDwgSW5maW5pdHkpIHRpbWVvdXQkNCA9IHNldFRpbWVvdXQod2FrZSQyLCB0aW1lIC0gY2xvY2skMi5ub3coKSAtIGNsb2NrU2tldyQyKTsKICAgICAgICBpZiAoaW50ZXJ2YWwkMykgaW50ZXJ2YWwkMyA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwkMyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFpbnRlcnZhbCQzKSBjbG9ja0xhc3QkMiA9IGNsb2NrJDIubm93KCksIGludGVydmFsJDMgPSBzZXRJbnRlcnZhbChwb2tlJDIsIHBva2VEZWxheSQyKTsKICAgICAgICBmcmFtZSQyID0gMSwgc2V0RnJhbWUkMih3YWtlJDIpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24geCQ2KGQpIHsKICAgICAgcmV0dXJuIGQueDsKICAgIH0KCiAgICBmdW5jdGlvbiB5JDYoZCkgewogICAgICByZXR1cm4gZC55OwogICAgfQoKICAgIHZhciBpbml0aWFsUmFkaXVzJDEgPSAxMCwKICAgICAgICBpbml0aWFsQW5nbGUkMSA9IE1hdGguUEkgKiAoMyAtIE1hdGguc3FydCg1KSk7CgogICAgZnVuY3Rpb24gc2ltdWxhdGlvbiQxKG5vZGVzKSB7CiAgICAgIHZhciBzaW11bGF0aW9uLAogICAgICAgICAgYWxwaGEgPSAxLAogICAgICAgICAgYWxwaGFNaW4gPSAwLjAwMSwKICAgICAgICAgIGFscGhhRGVjYXkgPSAxIC0gTWF0aC5wb3coYWxwaGFNaW4sIDEgLyAzMDApLAogICAgICAgICAgYWxwaGFUYXJnZXQgPSAwLAogICAgICAgICAgdmVsb2NpdHlEZWNheSA9IDAuNiwKICAgICAgICAgIGZvcmNlcyA9IG1hcCQ2KCksCiAgICAgICAgICBzdGVwcGVyID0gdGltZXIkMihzdGVwKSwKICAgICAgICAgIGV2ZW50ID0gZGlzcGF0Y2gkNCgidGljayIsICJlbmQiKTsKCiAgICAgIGlmIChub2RlcyA9PSBudWxsKSBub2RlcyA9IFtdOwoKICAgICAgZnVuY3Rpb24gc3RlcCgpIHsKICAgICAgICB0aWNrKCk7CiAgICAgICAgZXZlbnQuY2FsbCgidGljayIsIHNpbXVsYXRpb24pOwogICAgICAgIGlmIChhbHBoYSA8IGFscGhhTWluKSB7CiAgICAgICAgICBzdGVwcGVyLnN0b3AoKTsKICAgICAgICAgIGV2ZW50LmNhbGwoImVuZCIsIHNpbXVsYXRpb24pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gdGljaygpIHsKICAgICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsKCiAgICAgICAgYWxwaGEgKz0gKGFscGhhVGFyZ2V0IC0gYWxwaGEpICogYWxwaGFEZWNheTsKCiAgICAgICAgZm9yY2VzLmVhY2goZnVuY3Rpb24oZm9yY2UpIHsKICAgICAgICAgIGZvcmNlKGFscGhhKTsKICAgICAgICB9KTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgaWYgKG5vZGUuZnggPT0gbnVsbCkgbm9kZS54ICs9IG5vZGUudnggKj0gdmVsb2NpdHlEZWNheTsKICAgICAgICAgIGVsc2Ugbm9kZS54ID0gbm9kZS5meCwgbm9kZS52eCA9IDA7CiAgICAgICAgICBpZiAobm9kZS5meSA9PSBudWxsKSBub2RlLnkgKz0gbm9kZS52eSAqPSB2ZWxvY2l0eURlY2F5OwogICAgICAgICAgZWxzZSBub2RlLnkgPSBub2RlLmZ5LCBub2RlLnZ5ID0gMDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemVOb2RlcygpIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgICAgbm9kZSA9IG5vZGVzW2ldLCBub2RlLmluZGV4ID0gaTsKICAgICAgICAgIGlmIChpc05hTihub2RlLngpIHx8IGlzTmFOKG5vZGUueSkpIHsKICAgICAgICAgICAgdmFyIHJhZGl1cyA9IGluaXRpYWxSYWRpdXMkMSAqIE1hdGguc3FydChpKSwgYW5nbGUgPSBpICogaW5pdGlhbEFuZ2xlJDE7CiAgICAgICAgICAgIG5vZGUueCA9IHJhZGl1cyAqIE1hdGguY29zKGFuZ2xlKTsKICAgICAgICAgICAgbm9kZS55ID0gcmFkaXVzICogTWF0aC5zaW4oYW5nbGUpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGlzTmFOKG5vZGUudngpIHx8IGlzTmFOKG5vZGUudnkpKSB7CiAgICAgICAgICAgIG5vZGUudnggPSBub2RlLnZ5ID0gMDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemVGb3JjZShmb3JjZSkgewogICAgICAgIGlmIChmb3JjZS5pbml0aWFsaXplKSBmb3JjZS5pbml0aWFsaXplKG5vZGVzKTsKICAgICAgICByZXR1cm4gZm9yY2U7CiAgICAgIH0KCiAgICAgIGluaXRpYWxpemVOb2RlcygpOwoKICAgICAgcmV0dXJuIHNpbXVsYXRpb24gPSB7CiAgICAgICAgdGljazogdGljaywKCiAgICAgICAgcmVzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gc3RlcHBlci5yZXN0YXJ0KHN0ZXApLCBzaW11bGF0aW9uOwogICAgICAgIH0sCgogICAgICAgIHN0b3A6IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHN0ZXBwZXIuc3RvcCgpLCBzaW11bGF0aW9uOwogICAgICAgIH0sCgogICAgICAgIG5vZGVzOiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlcyA9IF8sIGluaXRpYWxpemVOb2RlcygpLCBmb3JjZXMuZWFjaChpbml0aWFsaXplRm9yY2UpLCBzaW11bGF0aW9uKSA6IG5vZGVzOwogICAgICAgIH0sCgogICAgICAgIGFscGhhOiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYSA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhOwogICAgICAgIH0sCgogICAgICAgIGFscGhhTWluOiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChhbHBoYU1pbiA9ICtfLCBzaW11bGF0aW9uKSA6IGFscGhhTWluOwogICAgICAgIH0sCgogICAgICAgIGFscGhhRGVjYXk6IGZ1bmN0aW9uKF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFscGhhRGVjYXkgPSArXywgc2ltdWxhdGlvbikgOiArYWxwaGFEZWNheTsKICAgICAgICB9LAoKICAgICAgICBhbHBoYVRhcmdldDogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxwaGFUYXJnZXQgPSArXywgc2ltdWxhdGlvbikgOiBhbHBoYVRhcmdldDsKICAgICAgICB9LAoKICAgICAgICB2ZWxvY2l0eURlY2F5OiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh2ZWxvY2l0eURlY2F5ID0gMSAtIF8sIHNpbXVsYXRpb24pIDogMSAtIHZlbG9jaXR5RGVjYXk7CiAgICAgICAgfSwKCiAgICAgICAgZm9yY2U6IGZ1bmN0aW9uKG5hbWUsIF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/ICgoXyA9PSBudWxsID8gZm9yY2VzLnJlbW92ZShuYW1lKSA6IGZvcmNlcy5zZXQobmFtZSwgaW5pdGlhbGl6ZUZvcmNlKF8pKSksIHNpbXVsYXRpb24pIDogZm9yY2VzLmdldChuYW1lKTsKICAgICAgICB9LAoKICAgICAgICBmaW5kOiBmdW5jdGlvbih4LCB5LCByYWRpdXMpIHsKICAgICAgICAgIHZhciBpID0gMCwKICAgICAgICAgICAgICBuID0gbm9kZXMubGVuZ3RoLAogICAgICAgICAgICAgIGR4LAogICAgICAgICAgICAgIGR5LAogICAgICAgICAgICAgIGQyLAogICAgICAgICAgICAgIG5vZGUsCiAgICAgICAgICAgICAgY2xvc2VzdDsKCiAgICAgICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICAgICAgZWxzZSByYWRpdXMgKj0gcmFkaXVzOwoKICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgbm9kZSA9IG5vZGVzW2ldOwogICAgICAgICAgICBkeCA9IHggLSBub2RlLng7CiAgICAgICAgICAgIGR5ID0geSAtIG5vZGUueTsKICAgICAgICAgICAgZDIgPSBkeCAqIGR4ICsgZHkgKiBkeTsKICAgICAgICAgICAgaWYgKGQyIDwgcmFkaXVzKSBjbG9zZXN0ID0gbm9kZSwgcmFkaXVzID0gZDI7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIGNsb3Nlc3Q7CiAgICAgICAgfSwKCiAgICAgICAgb246IGZ1bmN0aW9uKG5hbWUsIF8pIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMSA/IChldmVudC5vbihuYW1lLCBfKSwgc2ltdWxhdGlvbikgOiBldmVudC5vbihuYW1lKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbWFueUJvZHkkMSgpIHsKICAgICAgdmFyIG5vZGVzLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGFscGhhLAogICAgICAgICAgc3RyZW5ndGggPSBjb25zdGFudCRsKC0zMCksCiAgICAgICAgICBzdHJlbmd0aHMsCiAgICAgICAgICBkaXN0YW5jZU1pbjIgPSAxLAogICAgICAgICAgZGlzdGFuY2VNYXgyID0gSW5maW5pdHksCiAgICAgICAgICB0aGV0YTIgPSAwLjgxOwoKICAgICAgZnVuY3Rpb24gZm9yY2UoXykgewogICAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoLCB0cmVlID0gcXVhZHRyZWUkMShub2RlcywgeCQ2LCB5JDYpLnZpc2l0QWZ0ZXIoYWNjdW11bGF0ZSk7CiAgICAgICAgZm9yIChhbHBoYSA9IF8sIGkgPSAwOyBpIDwgbjsgKytpKSBub2RlID0gbm9kZXNbaV0sIHRyZWUudmlzaXQoYXBwbHkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aCwgbm9kZTsKICAgICAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgbm9kZSA9IG5vZGVzW2ldLCBzdHJlbmd0aHNbbm9kZS5pbmRleF0gPSArc3RyZW5ndGgobm9kZSwgaSwgbm9kZXMpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBhY2N1bXVsYXRlKHF1YWQpIHsKICAgICAgICB2YXIgc3RyZW5ndGggPSAwLCBxLCBjLCB3ZWlnaHQgPSAwLCB4LCB5LCBpOwoKICAgICAgICAvLyBGb3IgaW50ZXJuYWwgbm9kZXMsIGFjY3VtdWxhdGUgZm9yY2VzIGZyb20gY2hpbGQgcXVhZHJhbnRzLgogICAgICAgIGlmIChxdWFkLmxlbmd0aCkgewogICAgICAgICAgZm9yICh4ID0geSA9IGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICAgIGlmICgocSA9IHF1YWRbaV0pICYmIChjID0gTWF0aC5hYnMocS52YWx1ZSkpKSB7CiAgICAgICAgICAgICAgc3RyZW5ndGggKz0gcS52YWx1ZSwgd2VpZ2h0ICs9IGMsIHggKz0gYyAqIHEueCwgeSArPSBjICogcS55OwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBxdWFkLnggPSB4IC8gd2VpZ2h0OwogICAgICAgICAgcXVhZC55ID0geSAvIHdlaWdodDsKICAgICAgICB9CgogICAgICAgIC8vIEZvciBsZWFmIG5vZGVzLCBhY2N1bXVsYXRlIGZvcmNlcyBmcm9tIGNvaW5jaWRlbnQgcXVhZHJhbnRzLgogICAgICAgIGVsc2UgewogICAgICAgICAgcSA9IHF1YWQ7CiAgICAgICAgICBxLnggPSBxLmRhdGEueDsKICAgICAgICAgIHEueSA9IHEuZGF0YS55OwogICAgICAgICAgZG8gc3RyZW5ndGggKz0gc3RyZW5ndGhzW3EuZGF0YS5pbmRleF07CiAgICAgICAgICB3aGlsZSAocSA9IHEubmV4dCk7CiAgICAgICAgfQoKICAgICAgICBxdWFkLnZhbHVlID0gc3RyZW5ndGg7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGFwcGx5KHF1YWQsIHgxLCBfLCB4MikgewogICAgICAgIGlmICghcXVhZC52YWx1ZSkgcmV0dXJuIHRydWU7CgogICAgICAgIHZhciB4ID0gcXVhZC54IC0gbm9kZS54LAogICAgICAgICAgICB5ID0gcXVhZC55IC0gbm9kZS55LAogICAgICAgICAgICB3ID0geDIgLSB4MSwKICAgICAgICAgICAgbCA9IHggKiB4ICsgeSAqIHk7CgogICAgICAgIC8vIEFwcGx5IHRoZSBCYXJuZXMtSHV0IGFwcHJveGltYXRpb24gaWYgcG9zc2libGUuCiAgICAgICAgLy8gTGltaXQgZm9yY2VzIGZvciB2ZXJ5IGNsb3NlIG5vZGVzOyByYW5kb21pemUgZGlyZWN0aW9uIGlmIGNvaW5jaWRlbnQuCiAgICAgICAgaWYgKHcgKiB3IC8gdGhldGEyIDwgbCkgewogICAgICAgICAgaWYgKGwgPCBkaXN0YW5jZU1heDIpIHsKICAgICAgICAgICAgaWYgKHggPT09IDApIHggPSBqaWdnbGUkMSgpLCBsICs9IHggKiB4OwogICAgICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZSQxKCksIGwgKz0geSAqIHk7CiAgICAgICAgICAgIGlmIChsIDwgZGlzdGFuY2VNaW4yKSBsID0gTWF0aC5zcXJ0KGRpc3RhbmNlTWluMiAqIGwpOwogICAgICAgICAgICBub2RlLnZ4ICs9IHggKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsOwogICAgICAgICAgICBub2RlLnZ5ICs9IHkgKiBxdWFkLnZhbHVlICogYWxwaGEgLyBsOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICAvLyBPdGhlcndpc2UsIHByb2Nlc3MgcG9pbnRzIGRpcmVjdGx5LgogICAgICAgIGVsc2UgaWYgKHF1YWQubGVuZ3RoIHx8IGwgPj0gZGlzdGFuY2VNYXgyKSByZXR1cm47CgogICAgICAgIC8vIExpbWl0IGZvcmNlcyBmb3IgdmVyeSBjbG9zZSBub2RlczsgcmFuZG9taXplIGRpcmVjdGlvbiBpZiBjb2luY2lkZW50LgogICAgICAgIGlmIChxdWFkLmRhdGEgIT09IG5vZGUgfHwgcXVhZC5uZXh0KSB7CiAgICAgICAgICBpZiAoeCA9PT0gMCkgeCA9IGppZ2dsZSQxKCksIGwgKz0geCAqIHg7CiAgICAgICAgICBpZiAoeSA9PT0gMCkgeSA9IGppZ2dsZSQxKCksIGwgKz0geSAqIHk7CiAgICAgICAgICBpZiAobCA8IGRpc3RhbmNlTWluMikgbCA9IE1hdGguc3FydChkaXN0YW5jZU1pbjIgKiBsKTsKICAgICAgICB9CgogICAgICAgIGRvIGlmIChxdWFkLmRhdGEgIT09IG5vZGUpIHsKICAgICAgICAgIHcgPSBzdHJlbmd0aHNbcXVhZC5kYXRhLmluZGV4XSAqIGFscGhhIC8gbDsKICAgICAgICAgIG5vZGUudnggKz0geCAqIHc7CiAgICAgICAgICBub2RlLnZ5ICs9IHkgKiB3OwogICAgICAgIH0gd2hpbGUgKHF1YWQgPSBxdWFkLm5leHQpOwogICAgICB9CgogICAgICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIG5vZGVzID0gXzsKICAgICAgICBpbml0aWFsaXplKCk7CiAgICAgIH07CgogICAgICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGwoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogICAgICB9OwoKICAgICAgZm9yY2UuZGlzdGFuY2VNaW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNaW4yID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1pbjIpOwogICAgICB9OwoKICAgICAgZm9yY2UuZGlzdGFuY2VNYXggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGlzdGFuY2VNYXgyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydChkaXN0YW5jZU1heDIpOwogICAgICB9OwoKICAgICAgZm9yY2UudGhldGEgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhldGEyID0gXyAqIF8sIGZvcmNlKSA6IE1hdGguc3FydCh0aGV0YTIpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhZGlhbCQxKHJhZGl1cywgeCwgeSkgewogICAgICB2YXIgbm9kZXMsCiAgICAgICAgICBzdHJlbmd0aCA9IGNvbnN0YW50JGwoMC4xKSwKICAgICAgICAgIHN0cmVuZ3RocywKICAgICAgICAgIHJhZGl1c2VzOwoKICAgICAgaWYgKHR5cGVvZiByYWRpdXMgIT09ICJmdW5jdGlvbiIpIHJhZGl1cyA9IGNvbnN0YW50JGwoK3JhZGl1cyk7CiAgICAgIGlmICh4ID09IG51bGwpIHggPSAwOwogICAgICBpZiAoeSA9PSBudWxsKSB5ID0gMDsKCiAgICAgIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBub2Rlcy5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbaV0sCiAgICAgICAgICAgICAgZHggPSBub2RlLnggLSB4IHx8IDFlLTYsCiAgICAgICAgICAgICAgZHkgPSBub2RlLnkgLSB5IHx8IDFlLTYsCiAgICAgICAgICAgICAgciA9IE1hdGguc3FydChkeCAqIGR4ICsgZHkgKiBkeSksCiAgICAgICAgICAgICAgayA9IChyYWRpdXNlc1tpXSAtIHIpICogc3RyZW5ndGhzW2ldICogYWxwaGEgLyByOwogICAgICAgICAgbm9kZS52eCArPSBkeCAqIGs7CiAgICAgICAgICBub2RlLnZ5ICs9IGR5ICogazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGluaXRpYWxpemUoKSB7CiAgICAgICAgaWYgKCFub2RlcykgcmV0dXJuOwogICAgICAgIHZhciBpLCBuID0gbm9kZXMubGVuZ3RoOwogICAgICAgIHN0cmVuZ3RocyA9IG5ldyBBcnJheShuKTsKICAgICAgICByYWRpdXNlcyA9IG5ldyBBcnJheShuKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICByYWRpdXNlc1tpXSA9ICtyYWRpdXMobm9kZXNbaV0sIGksIG5vZGVzKTsKICAgICAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHJhZGl1c2VzW2ldKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgbm9kZXMgPSBfLCBpbml0aWFsaXplKCk7CiAgICAgIH07CgogICAgICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGwoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogICAgICB9OwoKICAgICAgZm9yY2UucmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhZGl1cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGwoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHJhZGl1czsKICAgICAgfTsKCiAgICAgIGZvcmNlLnggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9ICtfLCBmb3JjZSkgOiB4OwogICAgICB9OwoKICAgICAgZm9yY2UueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gK18sIGZvcmNlKSA6IHk7CiAgICAgIH07CgogICAgICByZXR1cm4gZm9yY2U7CiAgICB9CgogICAgZnVuY3Rpb24geCQ3KHgpIHsKICAgICAgdmFyIHN0cmVuZ3RoID0gY29uc3RhbnQkbCgwLjEpLAogICAgICAgICAgbm9kZXMsCiAgICAgICAgICBzdHJlbmd0aHMsCiAgICAgICAgICB4ejsKCiAgICAgIGlmICh0eXBlb2YgeCAhPT0gImZ1bmN0aW9uIikgeCA9IGNvbnN0YW50JGwoeCA9PSBudWxsID8gMCA6ICt4KTsKCiAgICAgIGZ1bmN0aW9uIGZvcmNlKGFscGhhKSB7CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBub2Rlcy5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIG5vZGUgPSBub2Rlc1tpXSwgbm9kZS52eCArPSAoeHpbaV0gLSBub2RlLngpICogc3RyZW5ndGhzW2ldICogYWxwaGE7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgICAgIGlmICghbm9kZXMpIHJldHVybjsKICAgICAgICB2YXIgaSwgbiA9IG5vZGVzLmxlbmd0aDsKICAgICAgICBzdHJlbmd0aHMgPSBuZXcgQXJyYXkobik7CiAgICAgICAgeHogPSBuZXcgQXJyYXkobik7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgc3RyZW5ndGhzW2ldID0gaXNOYU4oeHpbaV0gPSAreChub2Rlc1tpXSwgaSwgbm9kZXMpKSA/IDAgOiArc3RyZW5ndGgobm9kZXNbaV0sIGksIG5vZGVzKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvcmNlLmluaXRpYWxpemUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgbm9kZXMgPSBfOwogICAgICAgIGluaXRpYWxpemUoKTsKICAgICAgfTsKCiAgICAgIGZvcmNlLnN0cmVuZ3RoID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0cmVuZ3RoID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkbCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogc3RyZW5ndGg7CiAgICAgIH07CgogICAgICBmb3JjZS54ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHggPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRsKCtfKSwgaW5pdGlhbGl6ZSgpLCBmb3JjZSkgOiB4OwogICAgICB9OwoKICAgICAgcmV0dXJuIGZvcmNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHkkNyh5KSB7CiAgICAgIHZhciBzdHJlbmd0aCA9IGNvbnN0YW50JGwoMC4xKSwKICAgICAgICAgIG5vZGVzLAogICAgICAgICAgc3RyZW5ndGhzLAogICAgICAgICAgeXo7CgogICAgICBpZiAodHlwZW9mIHkgIT09ICJmdW5jdGlvbiIpIHkgPSBjb25zdGFudCRsKHkgPT0gbnVsbCA/IDAgOiAreSk7CgogICAgICBmdW5jdGlvbiBmb3JjZShhbHBoYSkgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gbm9kZXMubGVuZ3RoLCBub2RlOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUudnkgKz0gKHl6W2ldIC0gbm9kZS55KSAqIHN0cmVuZ3Roc1tpXSAqIGFscGhhOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW5pdGlhbGl6ZSgpIHsKICAgICAgICBpZiAoIW5vZGVzKSByZXR1cm47CiAgICAgICAgdmFyIGksIG4gPSBub2Rlcy5sZW5ndGg7CiAgICAgICAgc3RyZW5ndGhzID0gbmV3IEFycmF5KG4pOwogICAgICAgIHl6ID0gbmV3IEFycmF5KG4pOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHN0cmVuZ3Roc1tpXSA9IGlzTmFOKHl6W2ldID0gK3kobm9kZXNbaV0sIGksIG5vZGVzKSkgPyAwIDogK3N0cmVuZ3RoKG5vZGVzW2ldLCBpLCBub2Rlcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3JjZS5pbml0aWFsaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIG5vZGVzID0gXzsKICAgICAgICBpbml0aWFsaXplKCk7CiAgICAgIH07CgogICAgICBmb3JjZS5zdHJlbmd0aCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdHJlbmd0aCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JGwoK18pLCBpbml0aWFsaXplKCksIGZvcmNlKSA6IHN0cmVuZ3RoOwogICAgICB9OwoKICAgICAgZm9yY2UueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkbCgrXyksIGluaXRpYWxpemUoKSwgZm9yY2UpIDogeTsKICAgICAgfTsKCiAgICAgIHJldHVybiBmb3JjZTsKICAgIH0KCiAgICAvLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoCiAgICAvLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC4KICAgIC8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsKDEuMjMpIHJldHVybnMgWyIxMjMiLCAwXS4KICAgIGZ1bmN0aW9uIGZvcm1hdERlY2ltYWwkMSh4LCBwKSB7CiAgICAgIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkKICAgICAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTsKCiAgICAgIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxkXC5cZCtlWy0rXVxkKwogICAgICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcZGVbLStdXGQrIChlLmcuLCAxZSszKS4KICAgICAgcmV0dXJuIFsKICAgICAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LAogICAgICAgICt4LnNsaWNlKGkgKyAxKQogICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cG9uZW50JDMoeCkgewogICAgICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWwkMShNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEdyb3VwJDEoZ3JvdXBpbmcsIHRob3VzYW5kcykgewogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsCiAgICAgICAgICAgIHQgPSBbXSwKICAgICAgICAgICAgaiA9IDAsCiAgICAgICAgICAgIGcgPSBncm91cGluZ1swXSwKICAgICAgICAgICAgbGVuZ3RoID0gMDsKCiAgICAgICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7CiAgICAgICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTsKICAgICAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpOwogICAgICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrOwogICAgICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TnVtZXJhbHMkMShudW1lcmFscykgewogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkgewogICAgICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTsKICAgICAgICB9KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXREZWZhdWx0KHgsIHApIHsKICAgICAgeCA9IHgudG9QcmVjaXNpb24ocCk7CgogICAgICBvdXQ6IGZvciAodmFyIG4gPSB4Lmxlbmd0aCwgaSA9IDEsIGkwID0gLTEsIGkxOyBpIDwgbjsgKytpKSB7CiAgICAgICAgc3dpdGNoICh4W2ldKSB7CiAgICAgICAgICBjYXNlICIuIjogaTAgPSBpMSA9IGk7IGJyZWFrOwogICAgICAgICAgY2FzZSAiMCI6IGlmIChpMCA9PT0gMCkgaTAgPSBpOyBpMSA9IGk7IGJyZWFrOwogICAgICAgICAgY2FzZSAiZSI6IGJyZWFrIG91dDsKICAgICAgICAgIGRlZmF1bHQ6IGlmIChpMCA+IDApIGkwID0gMDsgYnJlYWs7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gaTAgPiAwID8geC5zbGljZSgwLCBpMCkgKyB4LnNsaWNlKGkxICsgMSkgOiB4OwogICAgfQoKICAgIHZhciBwcmVmaXhFeHBvbmVudCQxOwoKICAgIGZ1bmN0aW9uIGZvcm1hdFByZWZpeEF1dG8kMSh4LCBwKSB7CiAgICAgIHZhciBkID0gZm9ybWF0RGVjaW1hbCQxKHgsIHApOwogICAgICBpZiAoIWQpIHJldHVybiB4ICsgIiI7CiAgICAgIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgICAgICBleHBvbmVudCA9IGRbMV0sCiAgICAgICAgICBpID0gZXhwb25lbnQgLSAocHJlZml4RXhwb25lbnQkMSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50IC8gMykpKSAqIDMpICsgMSwKICAgICAgICAgIG4gPSBjb2VmZmljaWVudC5sZW5ndGg7CiAgICAgIHJldHVybiBpID09PSBuID8gY29lZmZpY2llbnQKICAgICAgICAgIDogaSA+IG4gPyBjb2VmZmljaWVudCArIG5ldyBBcnJheShpIC0gbiArIDEpLmpvaW4oIjAiKQogICAgICAgICAgOiBpID4gMCA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGkpICsgIi4iICsgY29lZmZpY2llbnQuc2xpY2UoaSkKICAgICAgICAgIDogIjAuIiArIG5ldyBBcnJheSgxIC0gaSkuam9pbigiMCIpICsgZm9ybWF0RGVjaW1hbCQxKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhCiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0Um91bmRlZCQxKHgsIHApIHsKICAgICAgdmFyIGQgPSBmb3JtYXREZWNpbWFsJDEoeCwgcCk7CiAgICAgIGlmICghZCkgcmV0dXJuIHggKyAiIjsKICAgICAgdmFyIGNvZWZmaWNpZW50ID0gZFswXSwKICAgICAgICAgIGV4cG9uZW50ID0gZFsxXTsKICAgICAgcmV0dXJuIGV4cG9uZW50IDwgMCA/ICIwLiIgKyBuZXcgQXJyYXkoLWV4cG9uZW50KS5qb2luKCIwIikgKyBjb2VmZmljaWVudAogICAgICAgICAgOiBjb2VmZmljaWVudC5sZW5ndGggPiBleHBvbmVudCArIDEgPyBjb2VmZmljaWVudC5zbGljZSgwLCBleHBvbmVudCArIDEpICsgIi4iICsgY29lZmZpY2llbnQuc2xpY2UoZXhwb25lbnQgKyAxKQogICAgICAgICAgOiBjb2VmZmljaWVudCArIG5ldyBBcnJheShleHBvbmVudCAtIGNvZWZmaWNpZW50Lmxlbmd0aCArIDIpLmpvaW4oIjAiKTsKICAgIH0KCiAgICB2YXIgZm9ybWF0VHlwZXMkMSA9IHsKICAgICAgIiI6IGZvcm1hdERlZmF1bHQsCiAgICAgICIlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gKHggKiAxMDApLnRvRml4ZWQocCk7IH0sCiAgICAgICJiIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKTsgfSwKICAgICAgImMiOiBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgIiI7IH0sCiAgICAgICJkIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxMCk7IH0sCiAgICAgICJlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4cG9uZW50aWFsKHApOyB9LAogICAgICAiZiI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9GaXhlZChwKTsgfSwKICAgICAgImciOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvUHJlY2lzaW9uKHApOyB9LAogICAgICAibyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCk7IH0sCiAgICAgICJwIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gZm9ybWF0Um91bmRlZCQxKHggKiAxMDAsIHApOyB9LAogICAgICAiciI6IGZvcm1hdFJvdW5kZWQkMSwKICAgICAgInMiOiBmb3JtYXRQcmVmaXhBdXRvJDEsCiAgICAgICJYIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfSwKICAgICAgIngiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KTsgfQogICAgfTsKCiAgICAvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW3R5cGVdCiAgICB2YXIgcmUkMSA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcLVwoIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KFthLXolXSk/JC9pOwoKICAgIGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllciQxKHNwZWNpZmllcikgewogICAgICByZXR1cm4gbmV3IEZvcm1hdFNwZWNpZmllciQxKHNwZWNpZmllcik7CiAgICB9CgogICAgZm9ybWF0U3BlY2lmaWVyJDEucHJvdG90eXBlID0gRm9ybWF0U3BlY2lmaWVyJDEucHJvdG90eXBlOyAvLyBpbnN0YW5jZW9mCgogICAgZnVuY3Rpb24gRm9ybWF0U3BlY2lmaWVyJDEoc3BlY2lmaWVyKSB7CiAgICAgIGlmICghKG1hdGNoID0gcmUkMS5leGVjKHNwZWNpZmllcikpKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgZm9ybWF0OiAiICsgc3BlY2lmaWVyKTsKCiAgICAgIHZhciBtYXRjaCwKICAgICAgICAgIGZpbGwgPSBtYXRjaFsxXSB8fCAiICIsCiAgICAgICAgICBhbGlnbiA9IG1hdGNoWzJdIHx8ICI+IiwKICAgICAgICAgIHNpZ24gPSBtYXRjaFszXSB8fCAiLSIsCiAgICAgICAgICBzeW1ib2wgPSBtYXRjaFs0XSB8fCAiIiwKICAgICAgICAgIHplcm8gPSAhIW1hdGNoWzVdLAogICAgICAgICAgd2lkdGggPSBtYXRjaFs2XSAmJiArbWF0Y2hbNl0sCiAgICAgICAgICBjb21tYSA9ICEhbWF0Y2hbN10sCiAgICAgICAgICBwcmVjaXNpb24gPSBtYXRjaFs4XSAmJiArbWF0Y2hbOF0uc2xpY2UoMSksCiAgICAgICAgICB0eXBlID0gbWF0Y2hbOV0gfHwgIiI7CgogICAgICAvLyBUaGUgIm4iIHR5cGUgaXMgYW4gYWxpYXMgZm9yICIsZyIuCiAgICAgIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsKCiAgICAgIC8vIE1hcCBpbnZhbGlkIHR5cGVzIHRvIHRoZSBkZWZhdWx0IGZvcm1hdC4KICAgICAgZWxzZSBpZiAoIWZvcm1hdFR5cGVzJDFbdHlwZV0pIHR5cGUgPSAiIjsKCiAgICAgIC8vIElmIHplcm8gZmlsbCBpcyBzcGVjaWZpZWQsIHBhZGRpbmcgZ29lcyBhZnRlciBzaWduIGFuZCBiZWZvcmUgZGlnaXRzLgogICAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7CgogICAgICB0aGlzLmZpbGwgPSBmaWxsOwogICAgICB0aGlzLmFsaWduID0gYWxpZ247CiAgICAgIHRoaXMuc2lnbiA9IHNpZ247CiAgICAgIHRoaXMuc3ltYm9sID0gc3ltYm9sOwogICAgICB0aGlzLnplcm8gPSB6ZXJvOwogICAgICB0aGlzLndpZHRoID0gd2lkdGg7CiAgICAgIHRoaXMuY29tbWEgPSBjb21tYTsKICAgICAgdGhpcy5wcmVjaXNpb24gPSBwcmVjaXNpb247CiAgICAgIHRoaXMudHlwZSA9IHR5cGU7CiAgICB9CgogICAgRm9ybWF0U3BlY2lmaWVyJDEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmZpbGwKICAgICAgICAgICsgdGhpcy5hbGlnbgogICAgICAgICAgKyB0aGlzLnNpZ24KICAgICAgICAgICsgdGhpcy5zeW1ib2wKICAgICAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQogICAgICAgICAgKyAodGhpcy53aWR0aCA9PSBudWxsID8gIiIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpCiAgICAgICAgICArICh0aGlzLmNvbW1hID8gIiwiIDogIiIpCiAgICAgICAgICArICh0aGlzLnByZWNpc2lvbiA9PSBudWxsID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQogICAgICAgICAgKyB0aGlzLnR5cGU7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JGQoeCkgewogICAgICByZXR1cm4geDsKICAgIH0KCiAgICB2YXIgcHJlZml4ZXMkMSA9IFsieSIsInoiLCJhIiwiZiIsInAiLCJuIiwiwrUiLCJtIiwiIiwiayIsIk0iLCJHIiwiVCIsIlAiLCJFIiwiWiIsIlkiXTsKCiAgICBmdW5jdGlvbiBmb3JtYXRMb2NhbGUkMihsb2NhbGUpIHsKICAgICAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nICYmIGxvY2FsZS50aG91c2FuZHMgPyBmb3JtYXRHcm91cCQxKGxvY2FsZS5ncm91cGluZywgbG9jYWxlLnRob3VzYW5kcykgOiBpZGVudGl0eSRkLAogICAgICAgICAgY3VycmVuY3kgPSBsb2NhbGUuY3VycmVuY3ksCiAgICAgICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwsCiAgICAgICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA/IGZvcm1hdE51bWVyYWxzJDEobG9jYWxlLm51bWVyYWxzKSA6IGlkZW50aXR5JGQsCiAgICAgICAgICBwZXJjZW50ID0gbG9jYWxlLnBlcmNlbnQgfHwgIiUiOwoKICAgICAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllcikgewogICAgICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllciQxKHNwZWNpZmllcik7CgogICAgICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsCiAgICAgICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLAogICAgICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sCiAgICAgICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsCiAgICAgICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybywKICAgICAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsCiAgICAgICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLAogICAgICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLAogICAgICAgICAgICB0eXBlID0gc3BlY2lmaWVyLnR5cGU7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAgICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLgogICAgICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzBdIDogc3ltYm9sID09PSAiIyIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/ICIwIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5WzFdIDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7CgogICAgICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/CiAgICAgICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/CiAgICAgICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj8KICAgICAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzJDFbdHlwZV0sCiAgICAgICAgICAgIG1heWJlU3VmZml4ID0gIXR5cGUgfHwgL1tkZWZncHJzJV0vLnRlc3QodHlwZSk7CgogICAgICAgIC8vIFNldCB0aGUgZGVmYXVsdCBwcmVjaXNpb24gaWYgbm90IHNwZWNpZmllZCwKICAgICAgICAvLyBvciBjbGFtcCB0aGUgc3BlY2lmaWVkIHByZWNpc2lvbiB0byB0aGUgc3VwcG9ydGVkIHJhbmdlLgogICAgICAgIC8vIEZvciBzaWduaWZpY2FudCBwcmVjaXNpb24sIGl0IG11c3QgYmUgaW4gWzEsIDIxXS4KICAgICAgICAvLyBGb3IgZml4ZWQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFswLCAyMF0uCiAgICAgICAgcHJlY2lzaW9uID0gcHJlY2lzaW9uID09IG51bGwgPyAodHlwZSA/IDYgOiAxMikKICAgICAgICAgICAgOiAvW2dwcnNdLy50ZXN0KHR5cGUpID8gTWF0aC5tYXgoMSwgTWF0aC5taW4oMjEsIHByZWNpc2lvbikpCiAgICAgICAgICAgIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMjAsIHByZWNpc2lvbikpOwoKICAgICAgICBmdW5jdGlvbiBmb3JtYXQodmFsdWUpIHsKICAgICAgICAgIHZhciB2YWx1ZVByZWZpeCA9IHByZWZpeCwKICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IHN1ZmZpeCwKICAgICAgICAgICAgICBpLCBuLCBjOwoKICAgICAgICAgIGlmICh0eXBlID09PSAiYyIpIHsKICAgICAgICAgICAgdmFsdWVTdWZmaXggPSBmb3JtYXRUeXBlKHZhbHVlKSArIHZhbHVlU3VmZml4OwogICAgICAgICAgICB2YWx1ZSA9ICIiOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSArdmFsdWU7CgogICAgICAgICAgICAvLyBQZXJmb3JtIHRoZSBpbml0aWFsIGZvcm1hdHRpbmcuCiAgICAgICAgICAgIHZhciB2YWx1ZU5lZ2F0aXZlID0gdmFsdWUgPCAwOwogICAgICAgICAgICB2YWx1ZSA9IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pOwoKICAgICAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBkdXJpbmcgZm9ybWF0dGluZywgdHJlYXQgYXMgcG9zaXRpdmUuCiAgICAgICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCkgdmFsdWVOZWdhdGl2ZSA9IGZhbHNlOwoKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgcHJlZml4IGFuZCBzdWZmaXguCiAgICAgICAgICAgIHZhbHVlUHJlZml4ID0gKHZhbHVlTmVnYXRpdmUgPyAoc2lnbiA9PT0gIigiID8gc2lnbiA6ICItIikgOiBzaWduID09PSAiLSIgfHwgc2lnbiA9PT0gIigiID8gIiIgOiBzaWduKSArIHZhbHVlUHJlZml4OwogICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSAicyIgPyBwcmVmaXhlcyQxWzggKyBwcmVmaXhFeHBvbmVudCQxIC8gM10gOiAiIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09ICIoIiA/ICIpIiA6ICIiKTsKCiAgICAgICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlCiAgICAgICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LgogICAgICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHsKICAgICAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1NykgewogICAgICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuCiAgICAgICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTsKCiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLgogICAgICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCwKICAgICAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogIiI7CgogICAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLgogICAgICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gIiI7CgogICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuCiAgICAgICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgICAgIGNhc2UgIjwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrOwogICAgICAgICAgICBjYXNlICI9IjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsKICAgICAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHNwZWNpZmllciArICIiOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBmb3JtYXQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7CiAgICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllciQxKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gImYiLCBzcGVjaWZpZXIpKSwKICAgICAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50JDModmFsdWUpIC8gMykpKSAqIDMsCiAgICAgICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLAogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhlcyQxWzggKyBlIC8gM107CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4OwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZm9ybWF0OiBuZXdGb3JtYXQsCiAgICAgICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXgKICAgICAgfTsKICAgIH0KCiAgICB2YXIgbG9jYWxlJDI7CiAgICB2YXIgZm9ybWF0JDE7CiAgICB2YXIgZm9ybWF0UHJlZml4JDE7CgogICAgZGVmYXVsdExvY2FsZSQyKHsKICAgICAgZGVjaW1hbDogIi4iLAogICAgICB0aG91c2FuZHM6ICIsIiwKICAgICAgZ3JvdXBpbmc6IFszXSwKICAgICAgY3VycmVuY3k6IFsiJCIsICIiXQogICAgfSk7CgogICAgZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQyKGRlZmluaXRpb24pIHsKICAgICAgbG9jYWxlJDIgPSBmb3JtYXRMb2NhbGUkMihkZWZpbml0aW9uKTsKICAgICAgZm9ybWF0JDEgPSBsb2NhbGUkMi5mb3JtYXQ7CiAgICAgIGZvcm1hdFByZWZpeCQxID0gbG9jYWxlJDIuZm9ybWF0UHJlZml4OwogICAgICByZXR1cm4gbG9jYWxlJDI7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlY2lzaW9uRml4ZWQkMShzdGVwKSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCAtZXhwb25lbnQkMyhNYXRoLmFicyhzdGVwKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWNpc2lvblByZWZpeCQxKHN0ZXAsIHZhbHVlKSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQzKHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQkMyhNYXRoLmFicyhzdGVwKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWNpc2lvblJvdW5kJDEoc3RlcCwgbWF4KSB7CiAgICAgIHN0ZXAgPSBNYXRoLmFicyhzdGVwKSwgbWF4ID0gTWF0aC5hYnMobWF4KSAtIHN0ZXA7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudCQzKG1heCkgLSBleHBvbmVudCQzKHN0ZXApKSArIDE7CiAgICB9CgogICAgLy8gQWRkcyBmbG9hdGluZyBwb2ludCBudW1iZXJzIHdpdGggdHdpY2UgdGhlIG5vcm1hbCBwcmVjaXNpb24uCiAgICAvLyBSZWZlcmVuY2U6IEouIFIuIFNoZXdjaHVrLCBBZGFwdGl2ZSBQcmVjaXNpb24gRmxvYXRpbmctUG9pbnQgQXJpdGhtZXRpYyBhbmQKICAgIC8vIEZhc3QgUm9idXN0IEdlb21ldHJpYyBQcmVkaWNhdGVzLCBEaXNjcmV0ZSAmIENvbXB1dGF0aW9uYWwgR2VvbWV0cnkgMTgoMykKICAgIC8vIDMwNeKAkzM2MyAoMTk5NykuCiAgICAvLyBDb2RlIGFkYXB0ZWQgZnJvbSBHZW9ncmFwaGljTGliIGJ5IENoYXJsZXMgRi4gRi4gS2FybmV5LAogICAgLy8gaHR0cDovL2dlb2dyYXBoaWNsaWIuc291cmNlZm9yZ2UubmV0LwoKICAgIGZ1bmN0aW9uIGFkZGVyJDEoKSB7CiAgICAgIHJldHVybiBuZXcgQWRkZXIkMTsKICAgIH0KCiAgICBmdW5jdGlvbiBBZGRlciQxKCkgewogICAgICB0aGlzLnJlc2V0KCk7CiAgICB9CgogICAgQWRkZXIkMS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBBZGRlciQxLAogICAgICByZXNldDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zID0gLy8gcm91bmRlZCB2YWx1ZQogICAgICAgIHRoaXMudCA9IDA7IC8vIGV4YWN0IGVycm9yCiAgICAgIH0sCiAgICAgIGFkZDogZnVuY3Rpb24oeSkgewogICAgICAgIGFkZCQzKHRlbXAkMSwgeSwgdGhpcy50KTsKICAgICAgICBhZGQkMyh0aGlzLCB0ZW1wJDEucywgdGhpcy5zKTsKICAgICAgICBpZiAodGhpcy5zKSB0aGlzLnQgKz0gdGVtcCQxLnQ7CiAgICAgICAgZWxzZSB0aGlzLnMgPSB0ZW1wJDEudDsKICAgICAgfSwKICAgICAgdmFsdWVPZjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuczsKICAgICAgfQogICAgfTsKCiAgICB2YXIgdGVtcCQxID0gbmV3IEFkZGVyJDE7CgogICAgZnVuY3Rpb24gYWRkJDMoYWRkZXIsIGEsIGIpIHsKICAgICAgdmFyIHggPSBhZGRlci5zID0gYSArIGIsCiAgICAgICAgICBidiA9IHggLSBhLAogICAgICAgICAgYXYgPSB4IC0gYnY7CiAgICAgIGFkZGVyLnQgPSAoYSAtIGF2KSArIChiIC0gYnYpOwogICAgfQoKICAgIHZhciBlcHNpbG9uJDcgPSAxZS02OwogICAgdmFyIGVwc2lsb24yJDMgPSAxZS0xMjsKICAgIHZhciBwaSQ4ID0gTWF0aC5QSTsKICAgIHZhciBoYWxmUGkkNiA9IHBpJDggLyAyOwogICAgdmFyIHF1YXJ0ZXJQaSQxID0gcGkkOCAvIDQ7CiAgICB2YXIgdGF1JDggPSBwaSQ4ICogMjsKCiAgICB2YXIgZGVncmVlcyQzID0gMTgwIC8gcGkkODsKICAgIHZhciByYWRpYW5zJDEgPSBwaSQ4IC8gMTgwOwoKICAgIHZhciBhYnMkMiA9IE1hdGguYWJzOwogICAgdmFyIGF0YW4kMSA9IE1hdGguYXRhbjsKICAgIHZhciBhdGFuMiQyID0gTWF0aC5hdGFuMjsKICAgIHZhciBjb3MkNCA9IE1hdGguY29zOwogICAgdmFyIGNlaWwkMSA9IE1hdGguY2VpbDsKICAgIHZhciBleHAkMSA9IE1hdGguZXhwOwogICAgdmFyIGxvZyQyID0gTWF0aC5sb2c7CiAgICB2YXIgcG93JDIgPSBNYXRoLnBvdzsKICAgIHZhciBzaW4kNCA9IE1hdGguc2luOwogICAgdmFyIHNpZ24kMiA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbih4KSB7IHJldHVybiB4ID4gMCA/IDEgOiB4IDwgMCA/IC0xIDogMDsgfTsKICAgIHZhciBzcXJ0JDMgPSBNYXRoLnNxcnQ7CiAgICB2YXIgdGFuJDEgPSBNYXRoLnRhbjsKCiAgICBmdW5jdGlvbiBhY29zJDIoeCkgewogICAgICByZXR1cm4geCA+IDEgPyAwIDogeCA8IC0xID8gcGkkOCA6IE1hdGguYWNvcyh4KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2luJDIoeCkgewogICAgICByZXR1cm4geCA+IDEgPyBoYWxmUGkkNiA6IHggPCAtMSA/IC1oYWxmUGkkNiA6IE1hdGguYXNpbih4KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoYXZlcnNpbiQxKHgpIHsKICAgICAgcmV0dXJuICh4ID0gc2luJDQoeCAvIDIpKSAqIHg7CiAgICB9CgogICAgZnVuY3Rpb24gbm9vcCQ4KCkge30KCiAgICBmdW5jdGlvbiBzdHJlYW1HZW9tZXRyeSQxKGdlb21ldHJ5LCBzdHJlYW0pIHsKICAgICAgaWYgKGdlb21ldHJ5ICYmIHN0cmVhbUdlb21ldHJ5VHlwZSQxLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpKSB7CiAgICAgICAgc3RyZWFtR2VvbWV0cnlUeXBlJDFbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIHN0cmVhbSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgc3RyZWFtT2JqZWN0VHlwZSQxID0gewogICAgICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHN0cmVhbUdlb21ldHJ5JDEob2JqZWN0Lmdlb21ldHJ5LCBzdHJlYW0pOwogICAgICB9LAogICAgICBGZWF0dXJlQ29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgICAgICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkkMShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgc3RyZWFtKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgc3RyZWFtR2VvbWV0cnlUeXBlJDEgPSB7CiAgICAgIFNwaGVyZTogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgICAgICBzdHJlYW0uc3BoZXJlKCk7CiAgICAgIH0sCiAgICAgIFBvaW50OiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIG9iamVjdCA9IG9iamVjdC5jb29yZGluYXRlczsKICAgICAgICBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7CiAgICAgIH0sCiAgICAgIE11bHRpUG9pbnQ6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIG9iamVjdCA9IGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0ucG9pbnQob2JqZWN0WzBdLCBvYmplY3RbMV0sIG9iamVjdFsyXSk7CiAgICAgIH0sCiAgICAgIExpbmVTdHJpbmc6IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtTGluZSQxKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtLCAwKTsKICAgICAgfSwKICAgICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1MaW5lJDEoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSwgMCk7CiAgICAgIH0sCiAgICAgIFBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgICAgc3RyZWFtUG9seWdvbiQxKG9iamVjdC5jb29yZGluYXRlcywgc3RyZWFtKTsKICAgICAgfSwKICAgICAgTXVsdGlQb2x5Z29uOiBmdW5jdGlvbihvYmplY3QsIHN0cmVhbSkgewogICAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBzdHJlYW1Qb2x5Z29uJDEoY29vcmRpbmF0ZXNbaV0sIHN0cmVhbSk7CiAgICAgIH0sCiAgICAgIEdlb21ldHJ5Q29sbGVjdGlvbjogZnVuY3Rpb24ob2JqZWN0LCBzdHJlYW0pIHsKICAgICAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtR2VvbWV0cnkkMShnZW9tZXRyaWVzW2ldLCBzdHJlYW0pOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHN0cmVhbUxpbmUkMShjb29yZGluYXRlcywgc3RyZWFtLCBjbG9zZWQpIHsKICAgICAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aCAtIGNsb3NlZCwgY29vcmRpbmF0ZTsKICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICB3aGlsZSAoKytpIDwgbikgY29vcmRpbmF0ZSA9IGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0ucG9pbnQoY29vcmRpbmF0ZVswXSwgY29vcmRpbmF0ZVsxXSwgY29vcmRpbmF0ZVsyXSk7CiAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RyZWFtUG9seWdvbiQxKGNvb3JkaW5hdGVzLCBzdHJlYW0pIHsKICAgICAgdmFyIGkgPSAtMSwgbiA9IGNvb3JkaW5hdGVzLmxlbmd0aDsKICAgICAgc3RyZWFtLnBvbHlnb25TdGFydCgpOwogICAgICB3aGlsZSAoKytpIDwgbikgc3RyZWFtTGluZSQxKGNvb3JkaW5hdGVzW2ldLCBzdHJlYW0sIDEpOwogICAgICBzdHJlYW0ucG9seWdvbkVuZCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdlb1N0cmVhbSQxKG9iamVjdCwgc3RyZWFtKSB7CiAgICAgIGlmIChvYmplY3QgJiYgc3RyZWFtT2JqZWN0VHlwZSQxLmhhc093blByb3BlcnR5KG9iamVjdC50eXBlKSkgewogICAgICAgIHN0cmVhbU9iamVjdFR5cGUkMVtvYmplY3QudHlwZV0ob2JqZWN0LCBzdHJlYW0pOwogICAgICB9IGVsc2UgewogICAgICAgIHN0cmVhbUdlb21ldHJ5JDEob2JqZWN0LCBzdHJlYW0pOwogICAgICB9CiAgICB9CgogICAgdmFyIGFyZWFSaW5nU3VtJDIgPSBhZGRlciQxKCk7CgogICAgdmFyIGFyZWFTdW0kMiA9IGFkZGVyJDEoKSwKICAgICAgICBsYW1iZGEwMCQzLAogICAgICAgIHBoaTAwJDMsCiAgICAgICAgbGFtYmRhMCQzLAogICAgICAgIGNvc1BoaTAkMiwKICAgICAgICBzaW5QaGkwJDI7CgogICAgdmFyIGFyZWFTdHJlYW0kMiA9IHsKICAgICAgcG9pbnQ6IG5vb3AkOCwKICAgICAgbGluZVN0YXJ0OiBub29wJDgsCiAgICAgIGxpbmVFbmQ6IG5vb3AkOCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBhcmVhUmluZ1N1bSQyLnJlc2V0KCk7CiAgICAgICAgYXJlYVN0cmVhbSQyLmxpbmVTdGFydCA9IGFyZWFSaW5nU3RhcnQkMjsKICAgICAgICBhcmVhU3RyZWFtJDIubGluZUVuZCA9IGFyZWFSaW5nRW5kJDI7CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhcmVhUmluZyA9ICthcmVhUmluZ1N1bSQyOwogICAgICAgIGFyZWFTdW0kMi5hZGQoYXJlYVJpbmcgPCAwID8gdGF1JDggKyBhcmVhUmluZyA6IGFyZWFSaW5nKTsKICAgICAgICB0aGlzLmxpbmVTdGFydCA9IHRoaXMubGluZUVuZCA9IHRoaXMucG9pbnQgPSBub29wJDg7CiAgICAgIH0sCiAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgYXJlYVN1bSQyLmFkZCh0YXUkOCk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYXJlYVJpbmdTdGFydCQyKCkgewogICAgICBhcmVhU3RyZWFtJDIucG9pbnQgPSBhcmVhUG9pbnRGaXJzdCQyOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWFSaW5nRW5kJDIoKSB7CiAgICAgIGFyZWFQb2ludCQyKGxhbWJkYTAwJDMsIHBoaTAwJDMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWFQb2ludEZpcnN0JDIobGFtYmRhLCBwaGkpIHsKICAgICAgYXJlYVN0cmVhbSQyLnBvaW50ID0gYXJlYVBvaW50JDI7CiAgICAgIGxhbWJkYTAwJDMgPSBsYW1iZGEsIHBoaTAwJDMgPSBwaGk7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zJDEsIHBoaSAqPSByYWRpYW5zJDE7CiAgICAgIGxhbWJkYTAkMyA9IGxhbWJkYSwgY29zUGhpMCQyID0gY29zJDQocGhpID0gcGhpIC8gMiArIHF1YXJ0ZXJQaSQxKSwgc2luUGhpMCQyID0gc2luJDQocGhpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhUG9pbnQkMihsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucyQxLCBwaGkgKj0gcmFkaWFucyQxOwogICAgICBwaGkgPSBwaGkgLyAyICsgcXVhcnRlclBpJDE7IC8vIGhhbGYgdGhlIGFuZ3VsYXIgZGlzdGFuY2UgZnJvbSBzb3V0aCBwb2xlCgogICAgICAvLyBTcGhlcmljYWwgZXhjZXNzIEUgZm9yIGEgc3BoZXJpY2FsIHRyaWFuZ2xlIHdpdGggdmVydGljZXM6IHNvdXRoIHBvbGUsCiAgICAgIC8vIHByZXZpb3VzIHBvaW50LCBjdXJyZW50IHBvaW50LiAgVXNlcyBhIGZvcm11bGEgZGVyaXZlZCBmcm9tIENhZ25vbGnigJlzCiAgICAgIC8vIHRoZW9yZW0uICBTZWUgVG9kaHVudGVyLCBTcGhlcmljYWwgVHJpZy4gKDE4NzEpLCBTZWMuIDEwMywgRXEuICgyKS4KICAgICAgdmFyIGRMYW1iZGEgPSBsYW1iZGEgLSBsYW1iZGEwJDMsCiAgICAgICAgICBzZExhbWJkYSA9IGRMYW1iZGEgPj0gMCA/IDEgOiAtMSwKICAgICAgICAgIGFkTGFtYmRhID0gc2RMYW1iZGEgKiBkTGFtYmRhLAogICAgICAgICAgY29zUGhpID0gY29zJDQocGhpKSwKICAgICAgICAgIHNpblBoaSA9IHNpbiQ0KHBoaSksCiAgICAgICAgICBrID0gc2luUGhpMCQyICogc2luUGhpLAogICAgICAgICAgdSA9IGNvc1BoaTAkMiAqIGNvc1BoaSArIGsgKiBjb3MkNChhZExhbWJkYSksCiAgICAgICAgICB2ID0gayAqIHNkTGFtYmRhICogc2luJDQoYWRMYW1iZGEpOwogICAgICBhcmVhUmluZ1N1bSQyLmFkZChhdGFuMiQyKHYsIHUpKTsKCiAgICAgIC8vIEFkdmFuY2UgdGhlIHByZXZpb3VzIHBvaW50cy4KICAgICAgbGFtYmRhMCQzID0gbGFtYmRhLCBjb3NQaGkwJDIgPSBjb3NQaGksIHNpblBoaTAkMiA9IHNpblBoaTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhJDQob2JqZWN0KSB7CiAgICAgIGFyZWFTdW0kMi5yZXNldCgpOwogICAgICBnZW9TdHJlYW0kMShvYmplY3QsIGFyZWFTdHJlYW0kMik7CiAgICAgIHJldHVybiBhcmVhU3VtJDIgKiAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwaGVyaWNhbCQxKGNhcnRlc2lhbikgewogICAgICByZXR1cm4gW2F0YW4yJDIoY2FydGVzaWFuWzFdLCBjYXJ0ZXNpYW5bMF0pLCBhc2luJDIoY2FydGVzaWFuWzJdKV07CiAgICB9CgogICAgZnVuY3Rpb24gY2FydGVzaWFuJDEoc3BoZXJpY2FsKSB7CiAgICAgIHZhciBsYW1iZGEgPSBzcGhlcmljYWxbMF0sIHBoaSA9IHNwaGVyaWNhbFsxXSwgY29zUGhpID0gY29zJDQocGhpKTsKICAgICAgcmV0dXJuIFtjb3NQaGkgKiBjb3MkNChsYW1iZGEpLCBjb3NQaGkgKiBzaW4kNChsYW1iZGEpLCBzaW4kNChwaGkpXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW5Eb3QkMShhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdICogYlswXSArIGFbMV0gKiBiWzFdICsgYVsyXSAqIGJbMl07CiAgICB9CgogICAgZnVuY3Rpb24gY2FydGVzaWFuQ3Jvc3MkMShhLCBiKSB7CiAgICAgIHJldHVybiBbYVsxXSAqIGJbMl0gLSBhWzJdICogYlsxXSwgYVsyXSAqIGJbMF0gLSBhWzBdICogYlsyXSwgYVswXSAqIGJbMV0gLSBhWzFdICogYlswXV07CiAgICB9CgogICAgLy8gVE9ETyByZXR1cm4gYQogICAgZnVuY3Rpb24gY2FydGVzaWFuQWRkSW5QbGFjZSQxKGEsIGIpIHsKICAgICAgYVswXSArPSBiWzBdLCBhWzFdICs9IGJbMV0sIGFbMl0gKz0gYlsyXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXJ0ZXNpYW5TY2FsZSQxKHZlY3RvciwgaykgewogICAgICByZXR1cm4gW3ZlY3RvclswXSAqIGssIHZlY3RvclsxXSAqIGssIHZlY3RvclsyXSAqIGtdOwogICAgfQoKICAgIC8vIFRPRE8gcmV0dXJuIGQKICAgIGZ1bmN0aW9uIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UkMShkKSB7CiAgICAgIHZhciBsID0gc3FydCQzKGRbMF0gKiBkWzBdICsgZFsxXSAqIGRbMV0gKyBkWzJdICogZFsyXSk7CiAgICAgIGRbMF0gLz0gbCwgZFsxXSAvPSBsLCBkWzJdIC89IGw7CiAgICB9CgogICAgdmFyIGxhbWJkYTAkNCwgcGhpMCQxLCBsYW1iZGExJDEsIHBoaTEkMSwgLy8gYm91bmRzCiAgICAgICAgbGFtYmRhMiQxLCAvLyBwcmV2aW91cyBsYW1iZGEtY29vcmRpbmF0ZQogICAgICAgIGxhbWJkYTAwJDQsIHBoaTAwJDQsIC8vIGZpcnN0IHBvaW50CiAgICAgICAgcDAkMSwgLy8gcHJldmlvdXMgM0QgcG9pbnQKICAgICAgICBkZWx0YVN1bSQxID0gYWRkZXIkMSgpLAogICAgICAgIHJhbmdlcyQxLAogICAgICAgIHJhbmdlJDM7CgogICAgdmFyIGJvdW5kc1N0cmVhbSQyID0gewogICAgICBwb2ludDogYm91bmRzUG9pbnQkMiwKICAgICAgbGluZVN0YXJ0OiBib3VuZHNMaW5lU3RhcnQkMSwKICAgICAgbGluZUVuZDogYm91bmRzTGluZUVuZCQxLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGJvdW5kc1N0cmVhbSQyLnBvaW50ID0gYm91bmRzUmluZ1BvaW50JDE7CiAgICAgICAgYm91bmRzU3RyZWFtJDIubGluZVN0YXJ0ID0gYm91bmRzUmluZ1N0YXJ0JDE7CiAgICAgICAgYm91bmRzU3RyZWFtJDIubGluZUVuZCA9IGJvdW5kc1JpbmdFbmQkMTsKICAgICAgICBkZWx0YVN1bSQxLnJlc2V0KCk7CiAgICAgICAgYXJlYVN0cmVhbSQyLnBvbHlnb25TdGFydCgpOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBhcmVhU3RyZWFtJDIucG9seWdvbkVuZCgpOwogICAgICAgIGJvdW5kc1N0cmVhbSQyLnBvaW50ID0gYm91bmRzUG9pbnQkMjsKICAgICAgICBib3VuZHNTdHJlYW0kMi5saW5lU3RhcnQgPSBib3VuZHNMaW5lU3RhcnQkMTsKICAgICAgICBib3VuZHNTdHJlYW0kMi5saW5lRW5kID0gYm91bmRzTGluZUVuZCQxOwogICAgICAgIGlmIChhcmVhUmluZ1N1bSQyIDwgMCkgbGFtYmRhMCQ0ID0gLShsYW1iZGExJDEgPSAxODApLCBwaGkwJDEgPSAtKHBoaTEkMSA9IDkwKTsKICAgICAgICBlbHNlIGlmIChkZWx0YVN1bSQxID4gZXBzaWxvbiQ3KSBwaGkxJDEgPSA5MDsKICAgICAgICBlbHNlIGlmIChkZWx0YVN1bSQxIDwgLWVwc2lsb24kNykgcGhpMCQxID0gLTkwOwogICAgICAgIHJhbmdlJDNbMF0gPSBsYW1iZGEwJDQsIHJhbmdlJDNbMV0gPSBsYW1iZGExJDE7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYm91bmRzUG9pbnQkMihsYW1iZGEsIHBoaSkgewogICAgICByYW5nZXMkMS5wdXNoKHJhbmdlJDMgPSBbbGFtYmRhMCQ0ID0gbGFtYmRhLCBsYW1iZGExJDEgPSBsYW1iZGFdKTsKICAgICAgaWYgKHBoaSA8IHBoaTAkMSkgcGhpMCQxID0gcGhpOwogICAgICBpZiAocGhpID4gcGhpMSQxKSBwaGkxJDEgPSBwaGk7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZVBvaW50JDEobGFtYmRhLCBwaGkpIHsKICAgICAgdmFyIHAgPSBjYXJ0ZXNpYW4kMShbbGFtYmRhICogcmFkaWFucyQxLCBwaGkgKiByYWRpYW5zJDFdKTsKICAgICAgaWYgKHAwJDEpIHsKICAgICAgICB2YXIgbm9ybWFsID0gY2FydGVzaWFuQ3Jvc3MkMShwMCQxLCBwKSwKICAgICAgICAgICAgZXF1YXRvcmlhbCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF0sIDBdLAogICAgICAgICAgICBpbmZsZWN0aW9uID0gY2FydGVzaWFuQ3Jvc3MkMShlcXVhdG9yaWFsLCBub3JtYWwpOwogICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UkMShpbmZsZWN0aW9uKTsKICAgICAgICBpbmZsZWN0aW9uID0gc3BoZXJpY2FsJDEoaW5mbGVjdGlvbik7CiAgICAgICAgdmFyIGRlbHRhID0gbGFtYmRhIC0gbGFtYmRhMiQxLAogICAgICAgICAgICBzaWduID0gZGVsdGEgPiAwID8gMSA6IC0xLAogICAgICAgICAgICBsYW1iZGFpID0gaW5mbGVjdGlvblswXSAqIGRlZ3JlZXMkMyAqIHNpZ24sCiAgICAgICAgICAgIHBoaWksCiAgICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFicyQyKGRlbHRhKSA+IDE4MDsKICAgICAgICBpZiAoYW50aW1lcmlkaWFuIF4gKHNpZ24gKiBsYW1iZGEyJDEgPCBsYW1iZGFpICYmIGxhbWJkYWkgPCBzaWduICogbGFtYmRhKSkgewogICAgICAgICAgcGhpaSA9IGluZmxlY3Rpb25bMV0gKiBkZWdyZWVzJDM7CiAgICAgICAgICBpZiAocGhpaSA+IHBoaTEkMSkgcGhpMSQxID0gcGhpaTsKICAgICAgICB9IGVsc2UgaWYgKGxhbWJkYWkgPSAobGFtYmRhaSArIDM2MCkgJSAzNjAgLSAxODAsIGFudGltZXJpZGlhbiBeIChzaWduICogbGFtYmRhMiQxIDwgbGFtYmRhaSAmJiBsYW1iZGFpIDwgc2lnbiAqIGxhbWJkYSkpIHsKICAgICAgICAgIHBoaWkgPSAtaW5mbGVjdGlvblsxXSAqIGRlZ3JlZXMkMzsKICAgICAgICAgIGlmIChwaGlpIDwgcGhpMCQxKSBwaGkwJDEgPSBwaGlpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAocGhpIDwgcGhpMCQxKSBwaGkwJDEgPSBwaGk7CiAgICAgICAgICBpZiAocGhpID4gcGhpMSQxKSBwaGkxJDEgPSBwaGk7CiAgICAgICAgfQogICAgICAgIGlmIChhbnRpbWVyaWRpYW4pIHsKICAgICAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEyJDEpIHsKICAgICAgICAgICAgaWYgKGFuZ2xlJDEobGFtYmRhMCQ0LCBsYW1iZGEpID4gYW5nbGUkMShsYW1iZGEwJDQsIGxhbWJkYTEkMSkpIGxhbWJkYTEkMSA9IGxhbWJkYTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChhbmdsZSQxKGxhbWJkYSwgbGFtYmRhMSQxKSA+IGFuZ2xlJDEobGFtYmRhMCQ0LCBsYW1iZGExJDEpKSBsYW1iZGEwJDQgPSBsYW1iZGE7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChsYW1iZGExJDEgPj0gbGFtYmRhMCQ0KSB7CiAgICAgICAgICAgIGlmIChsYW1iZGEgPCBsYW1iZGEwJDQpIGxhbWJkYTAkNCA9IGxhbWJkYTsKICAgICAgICAgICAgaWYgKGxhbWJkYSA+IGxhbWJkYTEkMSkgbGFtYmRhMSQxID0gbGFtYmRhOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGxhbWJkYSA+IGxhbWJkYTIkMSkgewogICAgICAgICAgICAgIGlmIChhbmdsZSQxKGxhbWJkYTAkNCwgbGFtYmRhKSA+IGFuZ2xlJDEobGFtYmRhMCQ0LCBsYW1iZGExJDEpKSBsYW1iZGExJDEgPSBsYW1iZGE7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaWYgKGFuZ2xlJDEobGFtYmRhLCBsYW1iZGExJDEpID4gYW5nbGUkMShsYW1iZGEwJDQsIGxhbWJkYTEkMSkpIGxhbWJkYTAkNCA9IGxhbWJkYTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICByYW5nZXMkMS5wdXNoKHJhbmdlJDMgPSBbbGFtYmRhMCQ0ID0gbGFtYmRhLCBsYW1iZGExJDEgPSBsYW1iZGFdKTsKICAgICAgfQogICAgICBpZiAocGhpIDwgcGhpMCQxKSBwaGkwJDEgPSBwaGk7CiAgICAgIGlmIChwaGkgPiBwaGkxJDEpIHBoaTEkMSA9IHBoaTsKICAgICAgcDAkMSA9IHAsIGxhbWJkYTIkMSA9IGxhbWJkYTsKICAgIH0KCiAgICBmdW5jdGlvbiBib3VuZHNMaW5lU3RhcnQkMSgpIHsKICAgICAgYm91bmRzU3RyZWFtJDIucG9pbnQgPSBsaW5lUG9pbnQkMTsKICAgIH0KCiAgICBmdW5jdGlvbiBib3VuZHNMaW5lRW5kJDEoKSB7CiAgICAgIHJhbmdlJDNbMF0gPSBsYW1iZGEwJDQsIHJhbmdlJDNbMV0gPSBsYW1iZGExJDE7CiAgICAgIGJvdW5kc1N0cmVhbSQyLnBvaW50ID0gYm91bmRzUG9pbnQkMjsKICAgICAgcDAkMSA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gYm91bmRzUmluZ1BvaW50JDEobGFtYmRhLCBwaGkpIHsKICAgICAgaWYgKHAwJDEpIHsKICAgICAgICB2YXIgZGVsdGEgPSBsYW1iZGEgLSBsYW1iZGEyJDE7CiAgICAgICAgZGVsdGFTdW0kMS5hZGQoYWJzJDIoZGVsdGEpID4gMTgwID8gZGVsdGEgKyAoZGVsdGEgPiAwID8gMzYwIDogLTM2MCkgOiBkZWx0YSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbGFtYmRhMDAkNCA9IGxhbWJkYSwgcGhpMDAkNCA9IHBoaTsKICAgICAgfQogICAgICBhcmVhU3RyZWFtJDIucG9pbnQobGFtYmRhLCBwaGkpOwogICAgICBsaW5lUG9pbnQkMShsYW1iZGEsIHBoaSk7CiAgICB9CgogICAgZnVuY3Rpb24gYm91bmRzUmluZ1N0YXJ0JDEoKSB7CiAgICAgIGFyZWFTdHJlYW0kMi5saW5lU3RhcnQoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBib3VuZHNSaW5nRW5kJDEoKSB7CiAgICAgIGJvdW5kc1JpbmdQb2ludCQxKGxhbWJkYTAwJDQsIHBoaTAwJDQpOwogICAgICBhcmVhU3RyZWFtJDIubGluZUVuZCgpOwogICAgICBpZiAoYWJzJDIoZGVsdGFTdW0kMSkgPiBlcHNpbG9uJDcpIGxhbWJkYTAkNCA9IC0obGFtYmRhMSQxID0gMTgwKTsKICAgICAgcmFuZ2UkM1swXSA9IGxhbWJkYTAkNCwgcmFuZ2UkM1sxXSA9IGxhbWJkYTEkMTsKICAgICAgcDAkMSA9IG51bGw7CiAgICB9CgogICAgLy8gRmluZHMgdGhlIGxlZnQtcmlnaHQgZGlzdGFuY2UgYmV0d2VlbiB0d28gbG9uZ2l0dWRlcy4KICAgIC8vIFRoaXMgaXMgYWxtb3N0IHRoZSBzYW1lIGFzIChsYW1iZGExIC0gbGFtYmRhMCArIDM2MMKwKSAlIDM2MMKwLCBleGNlcHQgdGhhdCB3ZSB3YW50CiAgICAvLyB0aGUgZGlzdGFuY2UgYmV0d2VlbiDCsTE4MMKwIHRvIGJlIDM2MMKwLgogICAgZnVuY3Rpb24gYW5nbGUkMShsYW1iZGEwLCBsYW1iZGExKSB7CiAgICAgIHJldHVybiAobGFtYmRhMSAtPSBsYW1iZGEwKSA8IDAgPyBsYW1iZGExICsgMzYwIDogbGFtYmRhMTsKICAgIH0KCiAgICBmdW5jdGlvbiByYW5nZUNvbXBhcmUkMShhLCBiKSB7CiAgICAgIHJldHVybiBhWzBdIC0gYlswXTsKICAgIH0KCiAgICBmdW5jdGlvbiByYW5nZUNvbnRhaW5zJDEocmFuZ2UsIHgpIHsKICAgICAgcmV0dXJuIHJhbmdlWzBdIDw9IHJhbmdlWzFdID8gcmFuZ2VbMF0gPD0geCAmJiB4IDw9IHJhbmdlWzFdIDogeCA8IHJhbmdlWzBdIHx8IHJhbmdlWzFdIDwgeDsKICAgIH0KCiAgICBmdW5jdGlvbiBib3VuZHMkMShmZWF0dXJlKSB7CiAgICAgIHZhciBpLCBuLCBhLCBiLCBtZXJnZWQsIGRlbHRhTWF4LCBkZWx0YTsKCiAgICAgIHBoaTEkMSA9IGxhbWJkYTEkMSA9IC0obGFtYmRhMCQ0ID0gcGhpMCQxID0gSW5maW5pdHkpOwogICAgICByYW5nZXMkMSA9IFtdOwogICAgICBnZW9TdHJlYW0kMShmZWF0dXJlLCBib3VuZHNTdHJlYW0kMik7CgogICAgICAvLyBGaXJzdCwgc29ydCByYW5nZXMgYnkgdGhlaXIgbWluaW11bSBsb25naXR1ZGVzLgogICAgICBpZiAobiA9IHJhbmdlcyQxLmxlbmd0aCkgewogICAgICAgIHJhbmdlcyQxLnNvcnQocmFuZ2VDb21wYXJlJDEpOwoKICAgICAgICAvLyBUaGVuLCBtZXJnZSBhbnkgcmFuZ2VzIHRoYXQgb3ZlcmxhcC4KICAgICAgICBmb3IgKGkgPSAxLCBhID0gcmFuZ2VzJDFbMF0sIG1lcmdlZCA9IFthXTsgaSA8IG47ICsraSkgewogICAgICAgICAgYiA9IHJhbmdlcyQxW2ldOwogICAgICAgICAgaWYgKHJhbmdlQ29udGFpbnMkMShhLCBiWzBdKSB8fCByYW5nZUNvbnRhaW5zJDEoYSwgYlsxXSkpIHsKICAgICAgICAgICAgaWYgKGFuZ2xlJDEoYVswXSwgYlsxXSkgPiBhbmdsZSQxKGFbMF0sIGFbMV0pKSBhWzFdID0gYlsxXTsKICAgICAgICAgICAgaWYgKGFuZ2xlJDEoYlswXSwgYVsxXSkgPiBhbmdsZSQxKGFbMF0sIGFbMV0pKSBhWzBdID0gYlswXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG1lcmdlZC5wdXNoKGEgPSBiKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEZpbmFsbHksIGZpbmQgdGhlIGxhcmdlc3QgZ2FwIGJldHdlZW4gdGhlIG1lcmdlZCByYW5nZXMuCiAgICAgICAgLy8gVGhlIGZpbmFsIGJvdW5kaW5nIGJveCB3aWxsIGJlIHRoZSBpbnZlcnNlIG9mIHRoaXMgZ2FwLgogICAgICAgIGZvciAoZGVsdGFNYXggPSAtSW5maW5pdHksIG4gPSBtZXJnZWQubGVuZ3RoIC0gMSwgaSA9IDAsIGEgPSBtZXJnZWRbbl07IGkgPD0gbjsgYSA9IGIsICsraSkgewogICAgICAgICAgYiA9IG1lcmdlZFtpXTsKICAgICAgICAgIGlmICgoZGVsdGEgPSBhbmdsZSQxKGFbMV0sIGJbMF0pKSA+IGRlbHRhTWF4KSBkZWx0YU1heCA9IGRlbHRhLCBsYW1iZGEwJDQgPSBiWzBdLCBsYW1iZGExJDEgPSBhWzFdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmFuZ2VzJDEgPSByYW5nZSQzID0gbnVsbDsKCiAgICAgIHJldHVybiBsYW1iZGEwJDQgPT09IEluZmluaXR5IHx8IHBoaTAkMSA9PT0gSW5maW5pdHkKICAgICAgICAgID8gW1tOYU4sIE5hTl0sIFtOYU4sIE5hTl1dCiAgICAgICAgICA6IFtbbGFtYmRhMCQ0LCBwaGkwJDFdLCBbbGFtYmRhMSQxLCBwaGkxJDFdXTsKICAgIH0KCiAgICB2YXIgVzAkMSwgVzEkMSwKICAgICAgICBYMCQyLCBZMCQyLCBaMCQyLAogICAgICAgIFgxJDIsIFkxJDIsIFoxJDIsCiAgICAgICAgWDIkMiwgWTIkMiwgWjIkMiwKICAgICAgICBsYW1iZGEwMCQ1LCBwaGkwMCQ1LCAvLyBmaXJzdCBwb2ludAogICAgICAgIHgwJDUsIHkwJDUsIHowJDE7IC8vIHByZXZpb3VzIHBvaW50CgogICAgdmFyIGNlbnRyb2lkU3RyZWFtJDIgPSB7CiAgICAgIHNwaGVyZTogbm9vcCQ4LAogICAgICBwb2ludDogY2VudHJvaWRQb2ludCQyLAogICAgICBsaW5lU3RhcnQ6IGNlbnRyb2lkTGluZVN0YXJ0JDIsCiAgICAgIGxpbmVFbmQ6IGNlbnRyb2lkTGluZUVuZCQyLAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNlbnRyb2lkU3RyZWFtJDIubGluZVN0YXJ0ID0gY2VudHJvaWRSaW5nU3RhcnQkMjsKICAgICAgICBjZW50cm9pZFN0cmVhbSQyLmxpbmVFbmQgPSBjZW50cm9pZFJpbmdFbmQkMjsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgY2VudHJvaWRTdHJlYW0kMi5saW5lU3RhcnQgPSBjZW50cm9pZExpbmVTdGFydCQyOwogICAgICAgIGNlbnRyb2lkU3RyZWFtJDIubGluZUVuZCA9IGNlbnRyb2lkTGluZUVuZCQyOwogICAgICB9CiAgICB9OwoKICAgIC8vIEFyaXRobWV0aWMgbWVhbiBvZiBDYXJ0ZXNpYW4gdmVjdG9ycy4KICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnQkMihsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucyQxLCBwaGkgKj0gcmFkaWFucyQxOwogICAgICB2YXIgY29zUGhpID0gY29zJDQocGhpKTsKICAgICAgY2VudHJvaWRQb2ludENhcnRlc2lhbiQxKGNvc1BoaSAqIGNvcyQ0KGxhbWJkYSksIGNvc1BoaSAqIHNpbiQ0KGxhbWJkYSksIHNpbiQ0KHBoaSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4kMSh4LCB5LCB6KSB7CiAgICAgICsrVzAkMTsKICAgICAgWDAkMiArPSAoeCAtIFgwJDIpIC8gVzAkMTsKICAgICAgWTAkMiArPSAoeSAtIFkwJDIpIC8gVzAkMTsKICAgICAgWjAkMiArPSAoeiAtIFowJDIpIC8gVzAkMTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZExpbmVTdGFydCQyKCkgewogICAgICBjZW50cm9pZFN0cmVhbSQyLnBvaW50ID0gY2VudHJvaWRMaW5lUG9pbnRGaXJzdCQxOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkTGluZVBvaW50Rmlyc3QkMShsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucyQxLCBwaGkgKj0gcmFkaWFucyQxOwogICAgICB2YXIgY29zUGhpID0gY29zJDQocGhpKTsKICAgICAgeDAkNSA9IGNvc1BoaSAqIGNvcyQ0KGxhbWJkYSk7CiAgICAgIHkwJDUgPSBjb3NQaGkgKiBzaW4kNChsYW1iZGEpOwogICAgICB6MCQxID0gc2luJDQocGhpKTsKICAgICAgY2VudHJvaWRTdHJlYW0kMi5wb2ludCA9IGNlbnRyb2lkTGluZVBvaW50JDE7CiAgICAgIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4kMSh4MCQ1LCB5MCQ1LCB6MCQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZExpbmVQb2ludCQxKGxhbWJkYSwgcGhpKSB7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zJDEsIHBoaSAqPSByYWRpYW5zJDE7CiAgICAgIHZhciBjb3NQaGkgPSBjb3MkNChwaGkpLAogICAgICAgICAgeCA9IGNvc1BoaSAqIGNvcyQ0KGxhbWJkYSksCiAgICAgICAgICB5ID0gY29zUGhpICogc2luJDQobGFtYmRhKSwKICAgICAgICAgIHogPSBzaW4kNChwaGkpLAogICAgICAgICAgdyA9IGF0YW4yJDIoc3FydCQzKCh3ID0geTAkNSAqIHogLSB6MCQxICogeSkgKiB3ICsgKHcgPSB6MCQxICogeCAtIHgwJDUgKiB6KSAqIHcgKyAodyA9IHgwJDUgKiB5IC0geTAkNSAqIHgpICogdyksIHgwJDUgKiB4ICsgeTAkNSAqIHkgKyB6MCQxICogeik7CiAgICAgIFcxJDEgKz0gdzsKICAgICAgWDEkMiArPSB3ICogKHgwJDUgKyAoeDAkNSA9IHgpKTsKICAgICAgWTEkMiArPSB3ICogKHkwJDUgKyAoeTAkNSA9IHkpKTsKICAgICAgWjEkMiArPSB3ICogKHowJDEgKyAoejAkMSA9IHopKTsKICAgICAgY2VudHJvaWRQb2ludENhcnRlc2lhbiQxKHgwJDUsIHkwJDUsIHowJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkTGluZUVuZCQyKCkgewogICAgICBjZW50cm9pZFN0cmVhbSQyLnBvaW50ID0gY2VudHJvaWRQb2ludCQyOwogICAgfQoKICAgIC8vIFNlZSBKLiBFLiBCcm9jaywgVGhlIEluZXJ0aWEgVGVuc29yIGZvciBhIFNwaGVyaWNhbCBUcmlhbmdsZSwKICAgIC8vIEouIEFwcGxpZWQgTWVjaGFuaWNzIDQyLCAyMzkgKDE5NzUpLgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nU3RhcnQkMigpIHsKICAgICAgY2VudHJvaWRTdHJlYW0kMi5wb2ludCA9IGNlbnRyb2lkUmluZ1BvaW50Rmlyc3QkMTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZFJpbmdFbmQkMigpIHsKICAgICAgY2VudHJvaWRSaW5nUG9pbnQkMShsYW1iZGEwMCQ1LCBwaGkwMCQ1KTsKICAgICAgY2VudHJvaWRTdHJlYW0kMi5wb2ludCA9IGNlbnRyb2lkUG9pbnQkMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZFJpbmdQb2ludEZpcnN0JDEobGFtYmRhLCBwaGkpIHsKICAgICAgbGFtYmRhMDAkNSA9IGxhbWJkYSwgcGhpMDAkNSA9IHBoaTsKICAgICAgbGFtYmRhICo9IHJhZGlhbnMkMSwgcGhpICo9IHJhZGlhbnMkMTsKICAgICAgY2VudHJvaWRTdHJlYW0kMi5wb2ludCA9IGNlbnRyb2lkUmluZ1BvaW50JDE7CiAgICAgIHZhciBjb3NQaGkgPSBjb3MkNChwaGkpOwogICAgICB4MCQ1ID0gY29zUGhpICogY29zJDQobGFtYmRhKTsKICAgICAgeTAkNSA9IGNvc1BoaSAqIHNpbiQ0KGxhbWJkYSk7CiAgICAgIHowJDEgPSBzaW4kNChwaGkpOwogICAgICBjZW50cm9pZFBvaW50Q2FydGVzaWFuJDEoeDAkNSwgeTAkNSwgejAkMSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nUG9pbnQkMShsYW1iZGEsIHBoaSkgewogICAgICBsYW1iZGEgKj0gcmFkaWFucyQxLCBwaGkgKj0gcmFkaWFucyQxOwogICAgICB2YXIgY29zUGhpID0gY29zJDQocGhpKSwKICAgICAgICAgIHggPSBjb3NQaGkgKiBjb3MkNChsYW1iZGEpLAogICAgICAgICAgeSA9IGNvc1BoaSAqIHNpbiQ0KGxhbWJkYSksCiAgICAgICAgICB6ID0gc2luJDQocGhpKSwKICAgICAgICAgIGN4ID0geTAkNSAqIHogLSB6MCQxICogeSwKICAgICAgICAgIGN5ID0gejAkMSAqIHggLSB4MCQ1ICogeiwKICAgICAgICAgIGN6ID0geDAkNSAqIHkgLSB5MCQ1ICogeCwKICAgICAgICAgIG0gPSBzcXJ0JDMoY3ggKiBjeCArIGN5ICogY3kgKyBjeiAqIGN6KSwKICAgICAgICAgIHcgPSBhc2luJDIobSksIC8vIGxpbmUgd2VpZ2h0ID0gYW5nbGUKICAgICAgICAgIHYgPSBtICYmIC13IC8gbTsgLy8gYXJlYSB3ZWlnaHQgbXVsdGlwbGllcgogICAgICBYMiQyICs9IHYgKiBjeDsKICAgICAgWTIkMiArPSB2ICogY3k7CiAgICAgIFoyJDIgKz0gdiAqIGN6OwogICAgICBXMSQxICs9IHc7CiAgICAgIFgxJDIgKz0gdyAqICh4MCQ1ICsgKHgwJDUgPSB4KSk7CiAgICAgIFkxJDIgKz0gdyAqICh5MCQ1ICsgKHkwJDUgPSB5KSk7CiAgICAgIFoxJDIgKz0gdyAqICh6MCQxICsgKHowJDEgPSB6KSk7CiAgICAgIGNlbnRyb2lkUG9pbnRDYXJ0ZXNpYW4kMSh4MCQ1LCB5MCQ1LCB6MCQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZCQyKG9iamVjdCkgewogICAgICBXMCQxID0gVzEkMSA9CiAgICAgIFgwJDIgPSBZMCQyID0gWjAkMiA9CiAgICAgIFgxJDIgPSBZMSQyID0gWjEkMiA9CiAgICAgIFgyJDIgPSBZMiQyID0gWjIkMiA9IDA7CiAgICAgIGdlb1N0cmVhbSQxKG9iamVjdCwgY2VudHJvaWRTdHJlYW0kMik7CgogICAgICB2YXIgeCA9IFgyJDIsCiAgICAgICAgICB5ID0gWTIkMiwKICAgICAgICAgIHogPSBaMiQyLAogICAgICAgICAgbSA9IHggKiB4ICsgeSAqIHkgKyB6ICogejsKCiAgICAgIC8vIElmIHRoZSBhcmVhLXdlaWdodGVkIGNjZW50cm9pZCBpcyB1bmRlZmluZWQsIGZhbGwgYmFjayB0byBsZW5ndGgtd2VpZ2h0ZWQgY2NlbnRyb2lkLgogICAgICBpZiAobSA8IGVwc2lsb24yJDMpIHsKICAgICAgICB4ID0gWDEkMiwgeSA9IFkxJDIsIHogPSBaMSQyOwogICAgICAgIC8vIElmIHRoZSBmZWF0dXJlIGhhcyB6ZXJvIGxlbmd0aCwgZmFsbCBiYWNrIHRvIGFyaXRobWV0aWMgbWVhbiBvZiBwb2ludCB2ZWN0b3JzLgogICAgICAgIGlmIChXMSQxIDwgZXBzaWxvbiQ3KSB4ID0gWDAkMiwgeSA9IFkwJDIsIHogPSBaMCQyOwogICAgICAgIG0gPSB4ICogeCArIHkgKiB5ICsgeiAqIHo7CiAgICAgICAgLy8gSWYgdGhlIGZlYXR1cmUgc3RpbGwgaGFzIGFuIHVuZGVmaW5lZCBjY2VudHJvaWQsIHRoZW4gcmV0dXJuLgogICAgICAgIGlmIChtIDwgZXBzaWxvbjIkMykgcmV0dXJuIFtOYU4sIE5hTl07CiAgICAgIH0KCiAgICAgIHJldHVybiBbYXRhbjIkMih5LCB4KSAqIGRlZ3JlZXMkMywgYXNpbiQyKHogLyBzcXJ0JDMobSkpICogZGVncmVlcyQzXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudCRtKHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXBvc2UkMShhLCBiKSB7CgogICAgICBmdW5jdGlvbiBjb21wb3NlKHgsIHkpIHsKICAgICAgICByZXR1cm4geCA9IGEoeCwgeSksIGIoeFswXSwgeFsxXSk7CiAgICAgIH0KCiAgICAgIGlmIChhLmludmVydCAmJiBiLmludmVydCkgY29tcG9zZS5pbnZlcnQgPSBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgcmV0dXJuIHggPSBiLmludmVydCh4LCB5KSwgeCAmJiBhLmludmVydCh4WzBdLCB4WzFdKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBjb21wb3NlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJvdGF0aW9uSWRlbnRpdHkkMShsYW1iZGEsIHBoaSkgewogICAgICByZXR1cm4gW2xhbWJkYSA+IHBpJDggPyBsYW1iZGEgLSB0YXUkOCA6IGxhbWJkYSA8IC1waSQ4ID8gbGFtYmRhICsgdGF1JDggOiBsYW1iZGEsIHBoaV07CiAgICB9CgogICAgcm90YXRpb25JZGVudGl0eSQxLmludmVydCA9IHJvdGF0aW9uSWRlbnRpdHkkMTsKCiAgICBmdW5jdGlvbiByb3RhdGVSYWRpYW5zJDEoZGVsdGFMYW1iZGEsIGRlbHRhUGhpLCBkZWx0YUdhbW1hKSB7CiAgICAgIHJldHVybiAoZGVsdGFMYW1iZGEgJT0gdGF1JDgpID8gKGRlbHRhUGhpIHx8IGRlbHRhR2FtbWEgPyBjb21wb3NlJDEocm90YXRpb25MYW1iZGEkMShkZWx0YUxhbWJkYSksIHJvdGF0aW9uUGhpR2FtbWEkMShkZWx0YVBoaSwgZGVsdGFHYW1tYSkpCiAgICAgICAgOiByb3RhdGlvbkxhbWJkYSQxKGRlbHRhTGFtYmRhKSkKICAgICAgICA6IChkZWx0YVBoaSB8fCBkZWx0YUdhbW1hID8gcm90YXRpb25QaGlHYW1tYSQxKGRlbHRhUGhpLCBkZWx0YUdhbW1hKQogICAgICAgIDogcm90YXRpb25JZGVudGl0eSQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3J3YXJkUm90YXRpb25MYW1iZGEkMShkZWx0YUxhbWJkYSkgewogICAgICByZXR1cm4gZnVuY3Rpb24obGFtYmRhLCBwaGkpIHsKICAgICAgICByZXR1cm4gbGFtYmRhICs9IGRlbHRhTGFtYmRhLCBbbGFtYmRhID4gcGkkOCA/IGxhbWJkYSAtIHRhdSQ4IDogbGFtYmRhIDwgLXBpJDggPyBsYW1iZGEgKyB0YXUkOCA6IGxhbWJkYSwgcGhpXTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiByb3RhdGlvbkxhbWJkYSQxKGRlbHRhTGFtYmRhKSB7CiAgICAgIHZhciByb3RhdGlvbiA9IGZvcndhcmRSb3RhdGlvbkxhbWJkYSQxKGRlbHRhTGFtYmRhKTsKICAgICAgcm90YXRpb24uaW52ZXJ0ID0gZm9yd2FyZFJvdGF0aW9uTGFtYmRhJDEoLWRlbHRhTGFtYmRhKTsKICAgICAgcmV0dXJuIHJvdGF0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIHJvdGF0aW9uUGhpR2FtbWEkMShkZWx0YVBoaSwgZGVsdGFHYW1tYSkgewogICAgICB2YXIgY29zRGVsdGFQaGkgPSBjb3MkNChkZWx0YVBoaSksCiAgICAgICAgICBzaW5EZWx0YVBoaSA9IHNpbiQ0KGRlbHRhUGhpKSwKICAgICAgICAgIGNvc0RlbHRhR2FtbWEgPSBjb3MkNChkZWx0YUdhbW1hKSwKICAgICAgICAgIHNpbkRlbHRhR2FtbWEgPSBzaW4kNChkZWx0YUdhbW1hKTsKCiAgICAgIGZ1bmN0aW9uIHJvdGF0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgdmFyIGNvc1BoaSA9IGNvcyQ0KHBoaSksCiAgICAgICAgICAgIHggPSBjb3MkNChsYW1iZGEpICogY29zUGhpLAogICAgICAgICAgICB5ID0gc2luJDQobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICAgICAgeiA9IHNpbiQ0KHBoaSksCiAgICAgICAgICAgIGsgPSB6ICogY29zRGVsdGFQaGkgKyB4ICogc2luRGVsdGFQaGk7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIGF0YW4yJDIoeSAqIGNvc0RlbHRhR2FtbWEgLSBrICogc2luRGVsdGFHYW1tYSwgeCAqIGNvc0RlbHRhUGhpIC0geiAqIHNpbkRlbHRhUGhpKSwKICAgICAgICAgIGFzaW4kMihrICogY29zRGVsdGFHYW1tYSArIHkgKiBzaW5EZWx0YUdhbW1hKQogICAgICAgIF07CiAgICAgIH0KCiAgICAgIHJvdGF0aW9uLmludmVydCA9IGZ1bmN0aW9uKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgdmFyIGNvc1BoaSA9IGNvcyQ0KHBoaSksCiAgICAgICAgICAgIHggPSBjb3MkNChsYW1iZGEpICogY29zUGhpLAogICAgICAgICAgICB5ID0gc2luJDQobGFtYmRhKSAqIGNvc1BoaSwKICAgICAgICAgICAgeiA9IHNpbiQ0KHBoaSksCiAgICAgICAgICAgIGsgPSB6ICogY29zRGVsdGFHYW1tYSAtIHkgKiBzaW5EZWx0YUdhbW1hOwogICAgICAgIHJldHVybiBbCiAgICAgICAgICBhdGFuMiQyKHkgKiBjb3NEZWx0YUdhbW1hICsgeiAqIHNpbkRlbHRhR2FtbWEsIHggKiBjb3NEZWx0YVBoaSArIGsgKiBzaW5EZWx0YVBoaSksCiAgICAgICAgICBhc2luJDIoayAqIGNvc0RlbHRhUGhpIC0geCAqIHNpbkRlbHRhUGhpKQogICAgICAgIF07CiAgICAgIH07CgogICAgICByZXR1cm4gcm90YXRpb247CiAgICB9CgogICAgZnVuY3Rpb24gcm90YXRpb24kMShyb3RhdGUpIHsKICAgICAgcm90YXRlID0gcm90YXRlUmFkaWFucyQxKHJvdGF0ZVswXSAqIHJhZGlhbnMkMSwgcm90YXRlWzFdICogcmFkaWFucyQxLCByb3RhdGUubGVuZ3RoID4gMiA/IHJvdGF0ZVsyXSAqIHJhZGlhbnMkMSA6IDApOwoKICAgICAgZnVuY3Rpb24gZm9yd2FyZChjb29yZGluYXRlcykgewogICAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlKGNvb3JkaW5hdGVzWzBdICogcmFkaWFucyQxLCBjb29yZGluYXRlc1sxXSAqIHJhZGlhbnMkMSk7CiAgICAgICAgcmV0dXJuIGNvb3JkaW5hdGVzWzBdICo9IGRlZ3JlZXMkMywgY29vcmRpbmF0ZXNbMV0gKj0gZGVncmVlcyQzLCBjb29yZGluYXRlczsKICAgICAgfQoKICAgICAgZm9yd2FyZC5pbnZlcnQgPSBmdW5jdGlvbihjb29yZGluYXRlcykgewogICAgICAgIGNvb3JkaW5hdGVzID0gcm90YXRlLmludmVydChjb29yZGluYXRlc1swXSAqIHJhZGlhbnMkMSwgY29vcmRpbmF0ZXNbMV0gKiByYWRpYW5zJDEpOwogICAgICAgIHJldHVybiBjb29yZGluYXRlc1swXSAqPSBkZWdyZWVzJDMsIGNvb3JkaW5hdGVzWzFdICo9IGRlZ3JlZXMkMywgY29vcmRpbmF0ZXM7CiAgICAgIH07CgogICAgICByZXR1cm4gZm9yd2FyZDsKICAgIH0KCiAgICAvLyBHZW5lcmF0ZXMgYSBjaXJjbGUgY2VudGVyZWQgYXQgWzDCsCwgMMKwXSwgd2l0aCBhIGdpdmVuIHJhZGl1cyBhbmQgcHJlY2lzaW9uLgogICAgZnVuY3Rpb24gY2lyY2xlU3RyZWFtJDEoc3RyZWFtLCByYWRpdXMsIGRlbHRhLCBkaXJlY3Rpb24sIHQwLCB0MSkgewogICAgICBpZiAoIWRlbHRhKSByZXR1cm47CiAgICAgIHZhciBjb3NSYWRpdXMgPSBjb3MkNChyYWRpdXMpLAogICAgICAgICAgc2luUmFkaXVzID0gc2luJDQocmFkaXVzKSwKICAgICAgICAgIHN0ZXAgPSBkaXJlY3Rpb24gKiBkZWx0YTsKICAgICAgaWYgKHQwID09IG51bGwpIHsKICAgICAgICB0MCA9IHJhZGl1cyArIGRpcmVjdGlvbiAqIHRhdSQ4OwogICAgICAgIHQxID0gcmFkaXVzIC0gc3RlcCAvIDI7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgdDAgPSBjaXJjbGVSYWRpdXMkMShjb3NSYWRpdXMsIHQwKTsKICAgICAgICB0MSA9IGNpcmNsZVJhZGl1cyQxKGNvc1JhZGl1cywgdDEpOwogICAgICAgIGlmIChkaXJlY3Rpb24gPiAwID8gdDAgPCB0MSA6IHQwID4gdDEpIHQwICs9IGRpcmVjdGlvbiAqIHRhdSQ4OwogICAgICB9CiAgICAgIGZvciAodmFyIHBvaW50LCB0ID0gdDA7IGRpcmVjdGlvbiA+IDAgPyB0ID4gdDEgOiB0IDwgdDE7IHQgLT0gc3RlcCkgewogICAgICAgIHBvaW50ID0gc3BoZXJpY2FsJDEoW2Nvc1JhZGl1cywgLXNpblJhZGl1cyAqIGNvcyQ0KHQpLCAtc2luUmFkaXVzICogc2luJDQodCldKTsKICAgICAgICBzdHJlYW0ucG9pbnQocG9pbnRbMF0sIHBvaW50WzFdKTsKICAgICAgfQogICAgfQoKICAgIC8vIFJldHVybnMgdGhlIHNpZ25lZCBhbmdsZSBvZiBhIGNhcnRlc2lhbiBwb2ludCByZWxhdGl2ZSB0byBbY29zUmFkaXVzLCAwLCAwXS4KICAgIGZ1bmN0aW9uIGNpcmNsZVJhZGl1cyQxKGNvc1JhZGl1cywgcG9pbnQpIHsKICAgICAgcG9pbnQgPSBjYXJ0ZXNpYW4kMShwb2ludCksIHBvaW50WzBdIC09IGNvc1JhZGl1czsKICAgICAgY2FydGVzaWFuTm9ybWFsaXplSW5QbGFjZSQxKHBvaW50KTsKICAgICAgdmFyIHJhZGl1cyA9IGFjb3MkMigtcG9pbnRbMV0pOwogICAgICByZXR1cm4gKCgtcG9pbnRbMl0gPCAwID8gLXJhZGl1cyA6IHJhZGl1cykgKyB0YXUkOCAtIGVwc2lsb24kNykgJSB0YXUkODsKICAgIH0KCiAgICBmdW5jdGlvbiBjaXJjbGUkMygpIHsKICAgICAgdmFyIGNlbnRlciA9IGNvbnN0YW50JG0oWzAsIDBdKSwKICAgICAgICAgIHJhZGl1cyA9IGNvbnN0YW50JG0oOTApLAogICAgICAgICAgcHJlY2lzaW9uID0gY29uc3RhbnQkbSg2KSwKICAgICAgICAgIHJpbmcsCiAgICAgICAgICByb3RhdGUsCiAgICAgICAgICBzdHJlYW0gPSB7cG9pbnQ6IHBvaW50fTsKCiAgICAgIGZ1bmN0aW9uIHBvaW50KHgsIHkpIHsKICAgICAgICByaW5nLnB1c2goeCA9IHJvdGF0ZSh4LCB5KSk7CiAgICAgICAgeFswXSAqPSBkZWdyZWVzJDMsIHhbMV0gKj0gZGVncmVlcyQzOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjaXJjbGUoKSB7CiAgICAgICAgdmFyIGMgPSBjZW50ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgciA9IHJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpICogcmFkaWFucyQxLAogICAgICAgICAgICBwID0gcHJlY2lzaW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKiByYWRpYW5zJDE7CiAgICAgICAgcmluZyA9IFtdOwogICAgICAgIHJvdGF0ZSA9IHJvdGF0ZVJhZGlhbnMkMSgtY1swXSAqIHJhZGlhbnMkMSwgLWNbMV0gKiByYWRpYW5zJDEsIDApLmludmVydDsKICAgICAgICBjaXJjbGVTdHJlYW0kMShzdHJlYW0sIHIsIHAsIDEpOwogICAgICAgIGMgPSB7dHlwZTogIlBvbHlnb24iLCBjb29yZGluYXRlczogW3JpbmddfTsKICAgICAgICByaW5nID0gcm90YXRlID0gbnVsbDsKICAgICAgICByZXR1cm4gYzsKICAgICAgfQoKICAgICAgY2lyY2xlLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjZW50ZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRtKFsrX1swXSwgK19bMV1dKSwgY2lyY2xlKSA6IGNlbnRlcjsKICAgICAgfTsKCiAgICAgIGNpcmNsZS5yYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkbSgrXyksIGNpcmNsZSkgOiByYWRpdXM7CiAgICAgIH07CgogICAgICBjaXJjbGUucHJlY2lzaW9uID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHByZWNpc2lvbiA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JG0oK18pLCBjaXJjbGUpIDogcHJlY2lzaW9uOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNpcmNsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwQnVmZmVyJDEoKSB7CiAgICAgIHZhciBsaW5lcyA9IFtdLAogICAgICAgICAgbGluZTsKICAgICAgcmV0dXJuIHsKICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgbGluZS5wdXNoKFt4LCB5XSk7CiAgICAgICAgfSwKICAgICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgbGluZXMucHVzaChsaW5lID0gW10pOwogICAgICAgIH0sCiAgICAgICAgbGluZUVuZDogbm9vcCQ4LAogICAgICAgIHJlam9pbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgbGluZXMucHVzaChsaW5lcy5wb3AoKS5jb25jYXQobGluZXMuc2hpZnQoKSkpOwogICAgICAgIH0sCiAgICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHZhciByZXN1bHQgPSBsaW5lczsKICAgICAgICAgIGxpbmVzID0gW107CiAgICAgICAgICBsaW5lID0gbnVsbDsKICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50RXF1YWwkMShhLCBiKSB7CiAgICAgIHJldHVybiBhYnMkMihhWzBdIC0gYlswXSkgPCBlcHNpbG9uJDcgJiYgYWJzJDIoYVsxXSAtIGJbMV0pIDwgZXBzaWxvbiQ3OwogICAgfQoKICAgIGZ1bmN0aW9uIEludGVyc2VjdGlvbiQxKHBvaW50LCBwb2ludHMsIG90aGVyLCBlbnRyeSkgewogICAgICB0aGlzLnggPSBwb2ludDsKICAgICAgdGhpcy56ID0gcG9pbnRzOwogICAgICB0aGlzLm8gPSBvdGhlcjsgLy8gYW5vdGhlciBpbnRlcnNlY3Rpb24KICAgICAgdGhpcy5lID0gZW50cnk7IC8vIGlzIGFuIGVudHJ5PwogICAgICB0aGlzLnYgPSBmYWxzZTsgLy8gdmlzaXRlZAogICAgICB0aGlzLm4gPSB0aGlzLnAgPSBudWxsOyAvLyBuZXh0ICYgcHJldmlvdXMKICAgIH0KCiAgICAvLyBBIGdlbmVyYWxpemVkIHBvbHlnb24gY2xpcHBpbmcgYWxnb3JpdGhtOiBnaXZlbiBhIHBvbHlnb24gdGhhdCBoYXMgYmVlbiBjdXQKICAgIC8vIGludG8gaXRzIHZpc2libGUgbGluZSBzZWdtZW50cywgYW5kIHJlam9pbnMgdGhlIHNlZ21lbnRzIGJ5IGludGVycG9sYXRpbmcKICAgIC8vIGFsb25nIHRoZSBjbGlwIGVkZ2UuCiAgICBmdW5jdGlvbiBjbGlwUmVqb2luJDEoc2VnbWVudHMsIGNvbXBhcmVJbnRlcnNlY3Rpb24sIHN0YXJ0SW5zaWRlLCBpbnRlcnBvbGF0ZSwgc3RyZWFtKSB7CiAgICAgIHZhciBzdWJqZWN0ID0gW10sCiAgICAgICAgICBjbGlwID0gW10sCiAgICAgICAgICBpLAogICAgICAgICAgbjsKCiAgICAgIHNlZ21lbnRzLmZvckVhY2goZnVuY3Rpb24oc2VnbWVudCkgewogICAgICAgIGlmICgobiA9IHNlZ21lbnQubGVuZ3RoIC0gMSkgPD0gMCkgcmV0dXJuOwogICAgICAgIHZhciBuLCBwMCA9IHNlZ21lbnRbMF0sIHAxID0gc2VnbWVudFtuXSwgeDsKCiAgICAgICAgLy8gSWYgdGhlIGZpcnN0IGFuZCBsYXN0IHBvaW50cyBvZiBhIHNlZ21lbnQgYXJlIGNvaW5jaWRlbnQsIHRoZW4gdHJlYXQgYXMgYQogICAgICAgIC8vIGNsb3NlZCByaW5nLiBUT0RPIGlmIGFsbCByaW5ncyBhcmUgY2xvc2VkLCB0aGVuIHRoZSB3aW5kaW5nIG9yZGVyIG9mIHRoZQogICAgICAgIC8vIGV4dGVyaW9yIHJpbmcgc2hvdWxkIGJlIGNoZWNrZWQuCiAgICAgICAgaWYgKHBvaW50RXF1YWwkMShwMCwgcDEpKSB7CiAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBzdHJlYW0ucG9pbnQoKHAwID0gc2VnbWVudFtpXSlbMF0sIHAwWzFdKTsKICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBzdWJqZWN0LnB1c2goeCA9IG5ldyBJbnRlcnNlY3Rpb24kMShwMCwgc2VnbWVudCwgbnVsbCwgdHJ1ZSkpOwogICAgICAgIGNsaXAucHVzaCh4Lm8gPSBuZXcgSW50ZXJzZWN0aW9uJDEocDAsIG51bGwsIHgsIGZhbHNlKSk7CiAgICAgICAgc3ViamVjdC5wdXNoKHggPSBuZXcgSW50ZXJzZWN0aW9uJDEocDEsIHNlZ21lbnQsIG51bGwsIGZhbHNlKSk7CiAgICAgICAgY2xpcC5wdXNoKHgubyA9IG5ldyBJbnRlcnNlY3Rpb24kMShwMSwgbnVsbCwgeCwgdHJ1ZSkpOwogICAgICB9KTsKCiAgICAgIGlmICghc3ViamVjdC5sZW5ndGgpIHJldHVybjsKCiAgICAgIGNsaXAuc29ydChjb21wYXJlSW50ZXJzZWN0aW9uKTsKICAgICAgbGluayQ0KHN1YmplY3QpOwogICAgICBsaW5rJDQoY2xpcCk7CgogICAgICBmb3IgKGkgPSAwLCBuID0gY2xpcC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBjbGlwW2ldLmUgPSBzdGFydEluc2lkZSA9ICFzdGFydEluc2lkZTsKICAgICAgfQoKICAgICAgdmFyIHN0YXJ0ID0gc3ViamVjdFswXSwKICAgICAgICAgIHBvaW50cywKICAgICAgICAgIHBvaW50OwoKICAgICAgd2hpbGUgKDEpIHsKICAgICAgICAvLyBGaW5kIGZpcnN0IHVudmlzaXRlZCBpbnRlcnNlY3Rpb24uCiAgICAgICAgdmFyIGN1cnJlbnQgPSBzdGFydCwKICAgICAgICAgICAgaXNTdWJqZWN0ID0gdHJ1ZTsKICAgICAgICB3aGlsZSAoY3VycmVudC52KSBpZiAoKGN1cnJlbnQgPSBjdXJyZW50Lm4pID09PSBzdGFydCkgcmV0dXJuOwogICAgICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgZG8gewogICAgICAgICAgY3VycmVudC52ID0gY3VycmVudC5vLnYgPSB0cnVlOwogICAgICAgICAgaWYgKGN1cnJlbnQuZSkgewogICAgICAgICAgICBpZiAoaXNTdWJqZWN0KSB7CiAgICAgICAgICAgICAgZm9yIChpID0gMCwgbiA9IHBvaW50cy5sZW5ndGg7IGkgPCBuOyArK2kpIHN0cmVhbS5wb2ludCgocG9pbnQgPSBwb2ludHNbaV0pWzBdLCBwb2ludFsxXSk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgaW50ZXJwb2xhdGUoY3VycmVudC54LCBjdXJyZW50Lm4ueCwgMSwgc3RyZWFtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGlzU3ViamVjdCkgewogICAgICAgICAgICAgIHBvaW50cyA9IGN1cnJlbnQucC56OwogICAgICAgICAgICAgIGZvciAoaSA9IHBvaW50cy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgc3RyZWFtLnBvaW50KChwb2ludCA9IHBvaW50c1tpXSlbMF0sIHBvaW50WzFdKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpbnRlcnBvbGF0ZShjdXJyZW50LngsIGN1cnJlbnQucC54LCAtMSwgc3RyZWFtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5wOwogICAgICAgICAgfQogICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubzsKICAgICAgICAgIHBvaW50cyA9IGN1cnJlbnQuejsKICAgICAgICAgIGlzU3ViamVjdCA9ICFpc1N1YmplY3Q7CiAgICAgICAgfSB3aGlsZSAoIWN1cnJlbnQudik7CiAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmskNChhcnJheSkgewogICAgICBpZiAoIShuID0gYXJyYXkubGVuZ3RoKSkgcmV0dXJuOwogICAgICB2YXIgbiwKICAgICAgICAgIGkgPSAwLAogICAgICAgICAgYSA9IGFycmF5WzBdLAogICAgICAgICAgYjsKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBhLm4gPSBiID0gYXJyYXlbaV07CiAgICAgICAgYi5wID0gYTsKICAgICAgICBhID0gYjsKICAgICAgfQogICAgICBhLm4gPSBiID0gYXJyYXlbMF07CiAgICAgIGIucCA9IGE7CiAgICB9CgogICAgdmFyIHN1bSQ0ID0gYWRkZXIkMSgpOwoKICAgIGZ1bmN0aW9uIHBvbHlnb25Db250YWlucyQxKHBvbHlnb24sIHBvaW50KSB7CiAgICAgIHZhciBsYW1iZGEgPSBwb2ludFswXSwKICAgICAgICAgIHBoaSA9IHBvaW50WzFdLAogICAgICAgICAgbm9ybWFsID0gW3NpbiQ0KGxhbWJkYSksIC1jb3MkNChsYW1iZGEpLCAwXSwKICAgICAgICAgIGFuZ2xlID0gMCwKICAgICAgICAgIHdpbmRpbmcgPSAwOwoKICAgICAgc3VtJDQucmVzZXQoKTsKCiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gcG9seWdvbi5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoIShtID0gKHJpbmcgPSBwb2x5Z29uW2ldKS5sZW5ndGgpKSBjb250aW51ZTsKICAgICAgICB2YXIgcmluZywKICAgICAgICAgICAgbSwKICAgICAgICAgICAgcG9pbnQwID0gcmluZ1ttIC0gMV0sCiAgICAgICAgICAgIGxhbWJkYTAgPSBwb2ludDBbMF0sCiAgICAgICAgICAgIHBoaTAgPSBwb2ludDBbMV0gLyAyICsgcXVhcnRlclBpJDEsCiAgICAgICAgICAgIHNpblBoaTAgPSBzaW4kNChwaGkwKSwKICAgICAgICAgICAgY29zUGhpMCA9IGNvcyQ0KHBoaTApOwoKICAgICAgICBmb3IgKHZhciBqID0gMDsgaiA8IG07ICsraiwgbGFtYmRhMCA9IGxhbWJkYTEsIHNpblBoaTAgPSBzaW5QaGkxLCBjb3NQaGkwID0gY29zUGhpMSwgcG9pbnQwID0gcG9pbnQxKSB7CiAgICAgICAgICB2YXIgcG9pbnQxID0gcmluZ1tqXSwKICAgICAgICAgICAgICBsYW1iZGExID0gcG9pbnQxWzBdLAogICAgICAgICAgICAgIHBoaTEgPSBwb2ludDFbMV0gLyAyICsgcXVhcnRlclBpJDEsCiAgICAgICAgICAgICAgc2luUGhpMSA9IHNpbiQ0KHBoaTEpLAogICAgICAgICAgICAgIGNvc1BoaTEgPSBjb3MkNChwaGkxKSwKICAgICAgICAgICAgICBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEwLAogICAgICAgICAgICAgIHNpZ24gPSBkZWx0YSA+PSAwID8gMSA6IC0xLAogICAgICAgICAgICAgIGFic0RlbHRhID0gc2lnbiAqIGRlbHRhLAogICAgICAgICAgICAgIGFudGltZXJpZGlhbiA9IGFic0RlbHRhID4gcGkkOCwKICAgICAgICAgICAgICBrID0gc2luUGhpMCAqIHNpblBoaTE7CgogICAgICAgICAgc3VtJDQuYWRkKGF0YW4yJDIoayAqIHNpZ24gKiBzaW4kNChhYnNEZWx0YSksIGNvc1BoaTAgKiBjb3NQaGkxICsgayAqIGNvcyQ0KGFic0RlbHRhKSkpOwogICAgICAgICAgYW5nbGUgKz0gYW50aW1lcmlkaWFuID8gZGVsdGEgKyBzaWduICogdGF1JDggOiBkZWx0YTsKCiAgICAgICAgICAvLyBBcmUgdGhlIGxvbmdpdHVkZXMgZWl0aGVyIHNpZGUgb2YgdGhlIHBvaW504oCZcyBtZXJpZGlhbiAobGFtYmRhKSwKICAgICAgICAgIC8vIGFuZCBhcmUgdGhlIGxhdGl0dWRlcyBzbWFsbGVyIHRoYW4gdGhlIHBhcmFsbGVsIChwaGkpPwogICAgICAgICAgaWYgKGFudGltZXJpZGlhbiBeIGxhbWJkYTAgPj0gbGFtYmRhIF4gbGFtYmRhMSA+PSBsYW1iZGEpIHsKICAgICAgICAgICAgdmFyIGFyYyA9IGNhcnRlc2lhbkNyb3NzJDEoY2FydGVzaWFuJDEocG9pbnQwKSwgY2FydGVzaWFuJDEocG9pbnQxKSk7CiAgICAgICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UkMShhcmMpOwogICAgICAgICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY2FydGVzaWFuQ3Jvc3MkMShub3JtYWwsIGFyYyk7CiAgICAgICAgICAgIGNhcnRlc2lhbk5vcm1hbGl6ZUluUGxhY2UkMShpbnRlcnNlY3Rpb24pOwogICAgICAgICAgICB2YXIgcGhpQXJjID0gKGFudGltZXJpZGlhbiBeIGRlbHRhID49IDAgPyAtMSA6IDEpICogYXNpbiQyKGludGVyc2VjdGlvblsyXSk7CiAgICAgICAgICAgIGlmIChwaGkgPiBwaGlBcmMgfHwgcGhpID09PSBwaGlBcmMgJiYgKGFyY1swXSB8fCBhcmNbMV0pKSB7CiAgICAgICAgICAgICAgd2luZGluZyArPSBhbnRpbWVyaWRpYW4gXiBkZWx0YSA+PSAwID8gMSA6IC0xOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBGaXJzdCwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhlIFNvdXRoIHBvbGUgaXMgaW5zaWRlIG9yIG91dHNpZGU6CiAgICAgIC8vCiAgICAgIC8vIEl0IGlzIGluc2lkZSBpZjoKICAgICAgLy8gKiB0aGUgcG9seWdvbiB3aW5kcyBhcm91bmQgaXQgaW4gYSBjbG9ja3dpc2UgZGlyZWN0aW9uLgogICAgICAvLyAqIHRoZSBwb2x5Z29uIGRvZXMgbm90IChjdW11bGF0aXZlbHkpIHdpbmQgYXJvdW5kIGl0LCBidXQgaGFzIGEgbmVnYXRpdmUKICAgICAgLy8gICAoY291bnRlci1jbG9ja3dpc2UpIGFyZWEuCiAgICAgIC8vCiAgICAgIC8vIFNlY29uZCwgY291bnQgdGhlIChzaWduZWQpIG51bWJlciBvZiB0aW1lcyBhIHNlZ21lbnQgY3Jvc3NlcyBhIGxhbWJkYQogICAgICAvLyBmcm9tIHRoZSBwb2ludCB0byB0aGUgU291dGggcG9sZS4gIElmIGl0IGlzIHplcm8sIHRoZW4gdGhlIHBvaW50IGlzIHRoZQogICAgICAvLyBzYW1lIHNpZGUgYXMgdGhlIFNvdXRoIHBvbGUuCgogICAgICByZXR1cm4gKGFuZ2xlIDwgLWVwc2lsb24kNyB8fCBhbmdsZSA8IGVwc2lsb24kNyAmJiBzdW0kNCA8IC1lcHNpbG9uJDcpIF4gKHdpbmRpbmcgJiAxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmckOChhLCBiKSB7CiAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogYSA+IGIgPyAxIDogYSA+PSBiID8gMCA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBiaXNlY3RvciQzKGNvbXBhcmUpIHsKICAgICAgaWYgKGNvbXBhcmUubGVuZ3RoID09PSAxKSBjb21wYXJlID0gYXNjZW5kaW5nQ29tcGFyYXRvciQzKGNvbXBhcmUpOwogICAgICByZXR1cm4gewogICAgICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgewogICAgICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsKICAgICAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7CiAgICAgICAgICAgIGVsc2UgaGkgPSBtaWQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbG87CiAgICAgICAgfSwKICAgICAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOwogICAgICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkOwogICAgICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsbzsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvciQzKGYpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGQsIHgpIHsKICAgICAgICByZXR1cm4gYXNjZW5kaW5nJDgoZihkKSwgeCk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGFzY2VuZGluZ0Jpc2VjdCQzID0gYmlzZWN0b3IkMyhhc2NlbmRpbmckOCk7CgogICAgZnVuY3Rpb24gcmFuZ2UkNChzdGFydCwgc3RvcCwgc3RlcCkgewogICAgICBzdGFydCA9ICtzdGFydCwgc3RvcCA9ICtzdG9wLCBzdGVwID0gKG4gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDIgPyAoc3RvcCA9IHN0YXJ0LCBzdGFydCA9IDAsIDEpIDogbiA8IDMgPyAxIDogK3N0ZXA7CgogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsCiAgICAgICAgICByYW5nZSA9IG5ldyBBcnJheShuKTsKCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwOwogICAgICB9CgogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CgogICAgZnVuY3Rpb24gbWVyZ2UkMihhcnJheXMpIHsKICAgICAgdmFyIG4gPSBhcnJheXMubGVuZ3RoLAogICAgICAgICAgbSwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIGogPSAwLAogICAgICAgICAgbWVyZ2VkLAogICAgICAgICAgYXJyYXk7CgogICAgICB3aGlsZSAoKytpIDwgbikgaiArPSBhcnJheXNbaV0ubGVuZ3RoOwogICAgICBtZXJnZWQgPSBuZXcgQXJyYXkoaik7CgogICAgICB3aGlsZSAoLS1uID49IDApIHsKICAgICAgICBhcnJheSA9IGFycmF5c1tuXTsKICAgICAgICBtID0gYXJyYXkubGVuZ3RoOwogICAgICAgIHdoaWxlICgtLW0gPj0gMCkgewogICAgICAgICAgbWVyZ2VkWy0tal0gPSBhcnJheVttXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBtZXJnZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gY2xpcCQxKHBvaW50VmlzaWJsZSwgY2xpcExpbmUsIGludGVycG9sYXRlLCBzdGFydCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oc2luaykgewogICAgICAgIHZhciBsaW5lID0gY2xpcExpbmUoc2luayksCiAgICAgICAgICAgIHJpbmdCdWZmZXIgPSBjbGlwQnVmZmVyJDEoKSwKICAgICAgICAgICAgcmluZ1NpbmsgPSBjbGlwTGluZShyaW5nQnVmZmVyKSwKICAgICAgICAgICAgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZSwKICAgICAgICAgICAgcG9seWdvbiwKICAgICAgICAgICAgc2VnbWVudHMsCiAgICAgICAgICAgIHJpbmc7CgogICAgICAgIHZhciBjbGlwID0gewogICAgICAgICAgcG9pbnQ6IHBvaW50LAogICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50UmluZzsKICAgICAgICAgICAgY2xpcC5saW5lU3RhcnQgPSByaW5nU3RhcnQ7CiAgICAgICAgICAgIGNsaXAubGluZUVuZCA9IHJpbmdFbmQ7CiAgICAgICAgICAgIHNlZ21lbnRzID0gW107CiAgICAgICAgICAgIHBvbHlnb24gPSBbXTsKICAgICAgICAgIH0sCiAgICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50OwogICAgICAgICAgICBjbGlwLmxpbmVTdGFydCA9IGxpbmVTdGFydDsKICAgICAgICAgICAgY2xpcC5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICAgICAgc2VnbWVudHMgPSBtZXJnZSQyKHNlZ21lbnRzKTsKICAgICAgICAgICAgdmFyIHN0YXJ0SW5zaWRlID0gcG9seWdvbkNvbnRhaW5zJDEocG9seWdvbiwgc3RhcnQpOwogICAgICAgICAgICBpZiAoc2VnbWVudHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgIGNsaXBSZWpvaW4kMShzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiQxLCBzdGFydEluc2lkZSwgaW50ZXJwb2xhdGUsIHNpbmspOwogICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0SW5zaWRlKSB7CiAgICAgICAgICAgICAgaWYgKCFwb2x5Z29uU3RhcnRlZCkgc2luay5wb2x5Z29uU3RhcnQoKSwgcG9seWdvblN0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgIHNpbmsubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgaW50ZXJwb2xhdGUobnVsbCwgbnVsbCwgMSwgc2luayk7CiAgICAgICAgICAgICAgc2luay5saW5lRW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25FbmQoKSwgcG9seWdvblN0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgc2VnbWVudHMgPSBwb2x5Z29uID0gbnVsbDsKICAgICAgICAgIH0sCiAgICAgICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBzaW5rLnBvbHlnb25TdGFydCgpOwogICAgICAgICAgICBzaW5rLmxpbmVTdGFydCgpOwogICAgICAgICAgICBpbnRlcnBvbGF0ZShudWxsLCBudWxsLCAxLCBzaW5rKTsKICAgICAgICAgICAgc2luay5saW5lRW5kKCk7CiAgICAgICAgICAgIHNpbmsucG9seWdvbkVuZCgpOwogICAgICAgICAgfQogICAgICAgIH07CgogICAgICAgIGZ1bmN0aW9uIHBvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgICAgICBpZiAocG9pbnRWaXNpYmxlKGxhbWJkYSwgcGhpKSkgc2luay5wb2ludChsYW1iZGEsIHBoaSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwb2ludExpbmUobGFtYmRhLCBwaGkpIHsKICAgICAgICAgIGxpbmUucG9pbnQobGFtYmRhLCBwaGkpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50TGluZTsKICAgICAgICAgIGxpbmUubGluZVN0YXJ0KCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICAgICAgY2xpcC5wb2ludCA9IHBvaW50OwogICAgICAgICAgbGluZS5saW5lRW5kKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBwb2ludFJpbmcobGFtYmRhLCBwaGkpIHsKICAgICAgICAgIHJpbmcucHVzaChbbGFtYmRhLCBwaGldKTsKICAgICAgICAgIHJpbmdTaW5rLnBvaW50KGxhbWJkYSwgcGhpKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHJpbmdTdGFydCgpIHsKICAgICAgICAgIHJpbmdTaW5rLmxpbmVTdGFydCgpOwogICAgICAgICAgcmluZyA9IFtdOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcmluZ0VuZCgpIHsKICAgICAgICAgIHBvaW50UmluZyhyaW5nWzBdWzBdLCByaW5nWzBdWzFdKTsKICAgICAgICAgIHJpbmdTaW5rLmxpbmVFbmQoKTsKCiAgICAgICAgICB2YXIgY2xlYW4gPSByaW5nU2luay5jbGVhbigpLAogICAgICAgICAgICAgIHJpbmdTZWdtZW50cyA9IHJpbmdCdWZmZXIucmVzdWx0KCksCiAgICAgICAgICAgICAgaSwgbiA9IHJpbmdTZWdtZW50cy5sZW5ndGgsIG0sCiAgICAgICAgICAgICAgc2VnbWVudCwKICAgICAgICAgICAgICBwb2ludDsKCiAgICAgICAgICByaW5nLnBvcCgpOwogICAgICAgICAgcG9seWdvbi5wdXNoKHJpbmcpOwogICAgICAgICAgcmluZyA9IG51bGw7CgogICAgICAgICAgaWYgKCFuKSByZXR1cm47CgogICAgICAgICAgLy8gTm8gaW50ZXJzZWN0aW9ucy4KICAgICAgICAgIGlmIChjbGVhbiAmIDEpIHsKICAgICAgICAgICAgc2VnbWVudCA9IHJpbmdTZWdtZW50c1swXTsKICAgICAgICAgICAgaWYgKChtID0gc2VnbWVudC5sZW5ndGggLSAxKSA+IDApIHsKICAgICAgICAgICAgICBpZiAoIXBvbHlnb25TdGFydGVkKSBzaW5rLnBvbHlnb25TdGFydCgpLCBwb2x5Z29uU3RhcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgc2luay5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbTsgKytpKSBzaW5rLnBvaW50KChwb2ludCA9IHNlZ21lbnRbaV0pWzBdLCBwb2ludFsxXSk7CiAgICAgICAgICAgICAgc2luay5saW5lRW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIFJlam9pbiBjb25uZWN0ZWQgc2VnbWVudHMuCiAgICAgICAgICAvLyBUT0RPIHJldXNlIHJpbmdCdWZmZXIucmVqb2luKCk/CiAgICAgICAgICBpZiAobiA+IDEgJiYgY2xlYW4gJiAyKSByaW5nU2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMucG9wKCkuY29uY2F0KHJpbmdTZWdtZW50cy5zaGlmdCgpKSk7CgogICAgICAgICAgc2VnbWVudHMucHVzaChyaW5nU2VnbWVudHMuZmlsdGVyKHZhbGlkU2VnbWVudCQxKSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY2xpcDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB2YWxpZFNlZ21lbnQkMShzZWdtZW50KSB7CiAgICAgIHJldHVybiBzZWdtZW50Lmxlbmd0aCA+IDE7CiAgICB9CgogICAgLy8gSW50ZXJzZWN0aW9ucyBhcmUgc29ydGVkIGFsb25nIHRoZSBjbGlwIGVkZ2UuIEZvciBib3RoIGFudGltZXJpZGlhbiBjdXR0aW5nCiAgICAvLyBhbmQgY2lyY2xlIGNsaXBwaW5nLCB0aGUgc2FtZSBjb21wYXJpc29uIGlzIHVzZWQuCiAgICBmdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uJDEoYSwgYikgewogICAgICByZXR1cm4gKChhID0gYS54KVswXSA8IDAgPyBhWzFdIC0gaGFsZlBpJDYgLSBlcHNpbG9uJDcgOiBoYWxmUGkkNiAtIGFbMV0pCiAgICAgICAgICAgLSAoKGIgPSBiLngpWzBdIDwgMCA/IGJbMV0gLSBoYWxmUGkkNiAtIGVwc2lsb24kNyA6IGhhbGZQaSQ2IC0gYlsxXSk7CiAgICB9CgogICAgdmFyIGNsaXBBbnRpbWVyaWRpYW4kMSA9IGNsaXAkMSgKICAgICAgZnVuY3Rpb24oKSB7IHJldHVybiB0cnVlOyB9LAogICAgICBjbGlwQW50aW1lcmlkaWFuTGluZSQxLAogICAgICBjbGlwQW50aW1lcmlkaWFuSW50ZXJwb2xhdGUkMSwKICAgICAgWy1waSQ4LCAtaGFsZlBpJDZdCiAgICApOwoKICAgIC8vIFRha2VzIGEgbGluZSBhbmQgY3V0cyBpbnRvIHZpc2libGUgc2VnbWVudHMuIFJldHVybiB2YWx1ZXM6IDAgLSB0aGVyZSB3ZXJlCiAgICAvLyBpbnRlcnNlY3Rpb25zIG9yIHRoZSBsaW5lIHdhcyBlbXB0eTsgMSAtIG5vIGludGVyc2VjdGlvbnM7IDIgLSB0aGVyZSB3ZXJlCiAgICAvLyBpbnRlcnNlY3Rpb25zLCBhbmQgdGhlIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzIHNob3VsZCBiZSByZWpvaW5lZC4KICAgIGZ1bmN0aW9uIGNsaXBBbnRpbWVyaWRpYW5MaW5lJDEoc3RyZWFtKSB7CiAgICAgIHZhciBsYW1iZGEwID0gTmFOLAogICAgICAgICAgcGhpMCA9IE5hTiwKICAgICAgICAgIHNpZ24wID0gTmFOLAogICAgICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnMKCiAgICAgIHJldHVybiB7CiAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgIGNsZWFuID0gMTsKICAgICAgICB9LAogICAgICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGExLCBwaGkxKSB7CiAgICAgICAgICB2YXIgc2lnbjEgPSBsYW1iZGExID4gMCA/IHBpJDggOiAtcGkkOCwKICAgICAgICAgICAgICBkZWx0YSA9IGFicyQyKGxhbWJkYTEgLSBsYW1iZGEwKTsKICAgICAgICAgIGlmIChhYnMkMihkZWx0YSAtIHBpJDgpIDwgZXBzaWxvbiQ3KSB7IC8vIGxpbmUgY3Jvc3NlcyBhIHBvbGUKICAgICAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTAsIHBoaTAgPSAocGhpMCArIHBoaTEpIC8gMiA+IDAgPyBoYWxmUGkkNiA6IC1oYWxmUGkkNik7CiAgICAgICAgICAgIHN0cmVhbS5wb2ludChzaWduMCwgcGhpMCk7CiAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24xLCBwaGkwKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTEsIHBoaTApOwogICAgICAgICAgICBjbGVhbiA9IDA7CiAgICAgICAgICB9IGVsc2UgaWYgKHNpZ24wICE9PSBzaWduMSAmJiBkZWx0YSA+PSBwaSQ4KSB7IC8vIGxpbmUgY3Jvc3NlcyBhbnRpbWVyaWRpYW4KICAgICAgICAgICAgaWYgKGFicyQyKGxhbWJkYTAgLSBzaWduMCkgPCBlcHNpbG9uJDcpIGxhbWJkYTAgLT0gc2lnbjAgKiBlcHNpbG9uJDc7IC8vIGhhbmRsZSBkZWdlbmVyYWNpZXMKICAgICAgICAgICAgaWYgKGFicyQyKGxhbWJkYTEgLSBzaWduMSkgPCBlcHNpbG9uJDcpIGxhbWJkYTEgLT0gc2lnbjEgKiBlcHNpbG9uJDc7CiAgICAgICAgICAgIHBoaTAgPSBjbGlwQW50aW1lcmlkaWFuSW50ZXJzZWN0JDEobGFtYmRhMCwgcGhpMCwgbGFtYmRhMSwgcGhpMSk7CiAgICAgICAgICAgIHN0cmVhbS5wb2ludChzaWduMCwgcGhpMCk7CiAgICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICAgIHN0cmVhbS5saW5lU3RhcnQoKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHNpZ24xLCBwaGkwKTsKICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgfQogICAgICAgICAgc3RyZWFtLnBvaW50KGxhbWJkYTAgPSBsYW1iZGExLCBwaGkwID0gcGhpMSk7CiAgICAgICAgICBzaWduMCA9IHNpZ24xOwogICAgICAgIH0sCiAgICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgbGFtYmRhMCA9IHBoaTAgPSBOYU47CiAgICAgICAgfSwKICAgICAgICBjbGVhbjogZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gMiAtIGNsZWFuOyAvLyBpZiBpbnRlcnNlY3Rpb25zLCByZWpvaW4gZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVyc2VjdCQxKGxhbWJkYTAsIHBoaTAsIGxhbWJkYTEsIHBoaTEpIHsKICAgICAgdmFyIGNvc1BoaTAsCiAgICAgICAgICBjb3NQaGkxLAogICAgICAgICAgc2luTGFtYmRhMExhbWJkYTEgPSBzaW4kNChsYW1iZGEwIC0gbGFtYmRhMSk7CiAgICAgIHJldHVybiBhYnMkMihzaW5MYW1iZGEwTGFtYmRhMSkgPiBlcHNpbG9uJDcKICAgICAgICAgID8gYXRhbiQxKChzaW4kNChwaGkwKSAqIChjb3NQaGkxID0gY29zJDQocGhpMSkpICogc2luJDQobGFtYmRhMSkKICAgICAgICAgICAgICAtIHNpbiQ0KHBoaTEpICogKGNvc1BoaTAgPSBjb3MkNChwaGkwKSkgKiBzaW4kNChsYW1iZGEwKSkKICAgICAgICAgICAgICAvIChjb3NQaGkwICogY29zUGhpMSAqIHNpbkxhbWJkYTBMYW1iZGExKSkKICAgICAgICAgIDogKHBoaTAgKyBwaGkxKSAvIDI7CiAgICB9CgogICAgZnVuY3Rpb24gY2xpcEFudGltZXJpZGlhbkludGVycG9sYXRlJDEoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7CiAgICAgIHZhciBwaGk7CiAgICAgIGlmIChmcm9tID09IG51bGwpIHsKICAgICAgICBwaGkgPSBkaXJlY3Rpb24gKiBoYWxmUGkkNjsKICAgICAgICBzdHJlYW0ucG9pbnQoLXBpJDgsIHBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KDAsIHBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KHBpJDgsIHBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KHBpJDgsIDApOwogICAgICAgIHN0cmVhbS5wb2ludChwaSQ4LCAtcGhpKTsKICAgICAgICBzdHJlYW0ucG9pbnQoMCwgLXBoaSk7CiAgICAgICAgc3RyZWFtLnBvaW50KC1waSQ4LCAtcGhpKTsKICAgICAgICBzdHJlYW0ucG9pbnQoLXBpJDgsIDApOwogICAgICAgIHN0cmVhbS5wb2ludCgtcGkkOCwgcGhpKTsKICAgICAgfSBlbHNlIGlmIChhYnMkMihmcm9tWzBdIC0gdG9bMF0pID4gZXBzaWxvbiQ3KSB7CiAgICAgICAgdmFyIGxhbWJkYSA9IGZyb21bMF0gPCB0b1swXSA/IHBpJDggOiAtcGkkODsKICAgICAgICBwaGkgPSBkaXJlY3Rpb24gKiBsYW1iZGEgLyAyOwogICAgICAgIHN0cmVhbS5wb2ludCgtbGFtYmRhLCBwaGkpOwogICAgICAgIHN0cmVhbS5wb2ludCgwLCBwaGkpOwogICAgICAgIHN0cmVhbS5wb2ludChsYW1iZGEsIHBoaSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgc3RyZWFtLnBvaW50KHRvWzBdLCB0b1sxXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwQ2lyY2xlJDEocmFkaXVzKSB7CiAgICAgIHZhciBjciA9IGNvcyQ0KHJhZGl1cyksCiAgICAgICAgICBkZWx0YSA9IDYgKiByYWRpYW5zJDEsCiAgICAgICAgICBzbWFsbFJhZGl1cyA9IGNyID4gMCwKICAgICAgICAgIG5vdEhlbWlzcGhlcmUgPSBhYnMkMihjcikgPiBlcHNpbG9uJDc7IC8vIFRPRE8gb3B0aW1pc2UgZm9yIHRoaXMgY29tbW9uIGNhc2UKCiAgICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKGZyb20sIHRvLCBkaXJlY3Rpb24sIHN0cmVhbSkgewogICAgICAgIGNpcmNsZVN0cmVhbSQxKHN0cmVhbSwgcmFkaXVzLCBkZWx0YSwgZGlyZWN0aW9uLCBmcm9tLCB0byk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHZpc2libGUobGFtYmRhLCBwaGkpIHsKICAgICAgICByZXR1cm4gY29zJDQobGFtYmRhKSAqIGNvcyQ0KHBoaSkgPiBjcjsKICAgICAgfQoKICAgICAgLy8gVGFrZXMgYSBsaW5lIGFuZCBjdXRzIGludG8gdmlzaWJsZSBzZWdtZW50cy4gUmV0dXJuIHZhbHVlcyB1c2VkIGZvciBwb2x5Z29uCiAgICAgIC8vIGNsaXBwaW5nOiAwIC0gdGhlcmUgd2VyZSBpbnRlcnNlY3Rpb25zIG9yIHRoZSBsaW5lIHdhcyBlbXB0eTsgMSAtIG5vCiAgICAgIC8vIGludGVyc2VjdGlvbnMgMiAtIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucywgYW5kIHRoZSBmaXJzdCBhbmQgbGFzdCBzZWdtZW50cwogICAgICAvLyBzaG91bGQgYmUgcmVqb2luZWQuCiAgICAgIGZ1bmN0aW9uIGNsaXBMaW5lKHN0cmVhbSkgewogICAgICAgIHZhciBwb2ludDAsIC8vIHByZXZpb3VzIHBvaW50CiAgICAgICAgICAgIGMwLCAvLyBjb2RlIGZvciBwcmV2aW91cyBwb2ludAogICAgICAgICAgICB2MCwgLy8gdmlzaWJpbGl0eSBvZiBwcmV2aW91cyBwb2ludAogICAgICAgICAgICB2MDAsIC8vIHZpc2liaWxpdHkgb2YgZmlyc3QgcG9pbnQKICAgICAgICAgICAgY2xlYW47IC8vIG5vIGludGVyc2VjdGlvbnMKICAgICAgICByZXR1cm4gewogICAgICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgdjAwID0gdjAgPSBmYWxzZTsKICAgICAgICAgICAgY2xlYW4gPSAxOwogICAgICAgICAgfSwKICAgICAgICAgIHBvaW50OiBmdW5jdGlvbihsYW1iZGEsIHBoaSkgewogICAgICAgICAgICB2YXIgcG9pbnQxID0gW2xhbWJkYSwgcGhpXSwKICAgICAgICAgICAgICAgIHBvaW50MiwKICAgICAgICAgICAgICAgIHYgPSB2aXNpYmxlKGxhbWJkYSwgcGhpKSwKICAgICAgICAgICAgICAgIGMgPSBzbWFsbFJhZGl1cwogICAgICAgICAgICAgICAgICA/IHYgPyAwIDogY29kZShsYW1iZGEsIHBoaSkKICAgICAgICAgICAgICAgICAgOiB2ID8gY29kZShsYW1iZGEgKyAobGFtYmRhIDwgMCA/IHBpJDggOiAtcGkkOCksIHBoaSkgOiAwOwogICAgICAgICAgICBpZiAoIXBvaW50MCAmJiAodjAwID0gdjAgPSB2KSkgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAvLyBIYW5kbGUgZGVnZW5lcmFjaWVzLgogICAgICAgICAgICAvLyBUT0RPIGlnbm9yZSBpZiBub3QgY2xpcHBpbmcgcG9seWdvbnMuCiAgICAgICAgICAgIGlmICh2ICE9PSB2MCkgewogICAgICAgICAgICAgIHBvaW50MiA9IGludGVyc2VjdChwb2ludDAsIHBvaW50MSk7CiAgICAgICAgICAgICAgaWYgKCFwb2ludDIgfHwgcG9pbnRFcXVhbCQxKHBvaW50MCwgcG9pbnQyKSB8fCBwb2ludEVxdWFsJDEocG9pbnQxLCBwb2ludDIpKSB7CiAgICAgICAgICAgICAgICBwb2ludDFbMF0gKz0gZXBzaWxvbiQ3OwogICAgICAgICAgICAgICAgcG9pbnQxWzFdICs9IGVwc2lsb24kNzsKICAgICAgICAgICAgICAgIHYgPSB2aXNpYmxlKHBvaW50MVswXSwgcG9pbnQxWzFdKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHYgIT09IHYwKSB7CiAgICAgICAgICAgICAgY2xlYW4gPSAwOwogICAgICAgICAgICAgIGlmICh2KSB7CiAgICAgICAgICAgICAgICAvLyBvdXRzaWRlIGdvaW5nIGluCiAgICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICBwb2ludDIgPSBpbnRlcnNlY3QocG9pbnQxLCBwb2ludDApOwogICAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MlswXSwgcG9pbnQyWzFdKTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgLy8gaW5zaWRlIGdvaW5nIG91dAogICAgICAgICAgICAgICAgcG9pbnQyID0gaW50ZXJzZWN0KHBvaW50MCwgcG9pbnQxKTsKICAgICAgICAgICAgICAgIHN0cmVhbS5wb2ludChwb2ludDJbMF0sIHBvaW50MlsxXSk7CiAgICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwb2ludDAgPSBwb2ludDI7CiAgICAgICAgICAgIH0gZWxzZSBpZiAobm90SGVtaXNwaGVyZSAmJiBwb2ludDAgJiYgc21hbGxSYWRpdXMgXiB2KSB7CiAgICAgICAgICAgICAgdmFyIHQ7CiAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvZGVzIGZvciB0d28gcG9pbnRzIGFyZSBkaWZmZXJlbnQsIG9yIGFyZSBib3RoIHplcm8sCiAgICAgICAgICAgICAgLy8gYW5kIHRoZXJlIHRoaXMgc2VnbWVudCBpbnRlcnNlY3RzIHdpdGggdGhlIHNtYWxsIGNpcmNsZS4KICAgICAgICAgICAgICBpZiAoIShjICYgYzApICYmICh0ID0gaW50ZXJzZWN0KHBvaW50MSwgcG9pbnQwLCB0cnVlKSkpIHsKICAgICAgICAgICAgICAgIGNsZWFuID0gMDsKICAgICAgICAgICAgICAgIGlmIChzbWFsbFJhZGl1cykgewogICAgICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTsKICAgICAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pOwogICAgICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHRbMV1bMF0sIHRbMV1bMV0pOwogICAgICAgICAgICAgICAgICBzdHJlYW0ubGluZUVuZCgpOwogICAgICAgICAgICAgICAgICBzdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgIHN0cmVhbS5wb2ludCh0WzBdWzBdLCB0WzBdWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHYgJiYgKCFwb2ludDAgfHwgIXBvaW50RXF1YWwkMShwb2ludDAsIHBvaW50MSkpKSB7CiAgICAgICAgICAgICAgc3RyZWFtLnBvaW50KHBvaW50MVswXSwgcG9pbnQxWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb2ludDAgPSBwb2ludDEsIHYwID0gdiwgYzAgPSBjOwogICAgICAgICAgfSwKICAgICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICBpZiAodjApIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgICAgIHBvaW50MCA9IG51bGw7CiAgICAgICAgICB9LAogICAgICAgICAgLy8gUmVqb2luIGZpcnN0IGFuZCBsYXN0IHNlZ21lbnRzIGlmIHRoZXJlIHdlcmUgaW50ZXJzZWN0aW9ucyBhbmQgdGhlIGZpcnN0CiAgICAgICAgICAvLyBhbmQgbGFzdCBwb2ludHMgd2VyZSB2aXNpYmxlLgogICAgICAgICAgY2xlYW46IGZ1bmN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gY2xlYW4gfCAoKHYwMCAmJiB2MCkgPDwgMSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLy8gSW50ZXJzZWN0cyB0aGUgZ3JlYXQgY2lyY2xlIGJldHdlZW4gYSBhbmQgYiB3aXRoIHRoZSBjbGlwIGNpcmNsZS4KICAgICAgZnVuY3Rpb24gaW50ZXJzZWN0KGEsIGIsIHR3bykgewogICAgICAgIHZhciBwYSA9IGNhcnRlc2lhbiQxKGEpLAogICAgICAgICAgICBwYiA9IGNhcnRlc2lhbiQxKGIpOwoKICAgICAgICAvLyBXZSBoYXZlIHR3byBwbGFuZXMsIG4xLnAgPSBkMSBhbmQgbjIucCA9IGQyLgogICAgICAgIC8vIEZpbmQgaW50ZXJzZWN0aW9uIGxpbmUgcCh0KSA9IGMxIG4xICsgYzIgbjIgKyB0IChuMSDiqK8gbjIpLgogICAgICAgIHZhciBuMSA9IFsxLCAwLCAwXSwgLy8gbm9ybWFsCiAgICAgICAgICAgIG4yID0gY2FydGVzaWFuQ3Jvc3MkMShwYSwgcGIpLAogICAgICAgICAgICBuMm4yID0gY2FydGVzaWFuRG90JDEobjIsIG4yKSwKICAgICAgICAgICAgbjFuMiA9IG4yWzBdLCAvLyBjYXJ0ZXNpYW5Eb3QobjEsIG4yKSwKICAgICAgICAgICAgZGV0ZXJtaW5hbnQgPSBuMm4yIC0gbjFuMiAqIG4xbjI7CgogICAgICAgIC8vIFR3byBwb2xhciBwb2ludHMuCiAgICAgICAgaWYgKCFkZXRlcm1pbmFudCkgcmV0dXJuICF0d28gJiYgYTsKCiAgICAgICAgdmFyIGMxID0gIGNyICogbjJuMiAvIGRldGVybWluYW50LAogICAgICAgICAgICBjMiA9IC1jciAqIG4xbjIgLyBkZXRlcm1pbmFudCwKICAgICAgICAgICAgbjF4bjIgPSBjYXJ0ZXNpYW5Dcm9zcyQxKG4xLCBuMiksCiAgICAgICAgICAgIEEgPSBjYXJ0ZXNpYW5TY2FsZSQxKG4xLCBjMSksCiAgICAgICAgICAgIEIgPSBjYXJ0ZXNpYW5TY2FsZSQxKG4yLCBjMik7CiAgICAgICAgY2FydGVzaWFuQWRkSW5QbGFjZSQxKEEsIEIpOwoKICAgICAgICAvLyBTb2x2ZSB8cCh0KXxeMiA9IDEuCiAgICAgICAgdmFyIHUgPSBuMXhuMiwKICAgICAgICAgICAgdyA9IGNhcnRlc2lhbkRvdCQxKEEsIHUpLAogICAgICAgICAgICB1dSA9IGNhcnRlc2lhbkRvdCQxKHUsIHUpLAogICAgICAgICAgICB0MiA9IHcgKiB3IC0gdXUgKiAoY2FydGVzaWFuRG90JDEoQSwgQSkgLSAxKTsKCiAgICAgICAgaWYgKHQyIDwgMCkgcmV0dXJuOwoKICAgICAgICB2YXIgdCA9IHNxcnQkMyh0MiksCiAgICAgICAgICAgIHEgPSBjYXJ0ZXNpYW5TY2FsZSQxKHUsICgtdyAtIHQpIC8gdXUpOwogICAgICAgIGNhcnRlc2lhbkFkZEluUGxhY2UkMShxLCBBKTsKICAgICAgICBxID0gc3BoZXJpY2FsJDEocSk7CgogICAgICAgIGlmICghdHdvKSByZXR1cm4gcTsKCiAgICAgICAgLy8gVHdvIGludGVyc2VjdGlvbiBwb2ludHMuCiAgICAgICAgdmFyIGxhbWJkYTAgPSBhWzBdLAogICAgICAgICAgICBsYW1iZGExID0gYlswXSwKICAgICAgICAgICAgcGhpMCA9IGFbMV0sCiAgICAgICAgICAgIHBoaTEgPSBiWzFdLAogICAgICAgICAgICB6OwoKICAgICAgICBpZiAobGFtYmRhMSA8IGxhbWJkYTApIHogPSBsYW1iZGEwLCBsYW1iZGEwID0gbGFtYmRhMSwgbGFtYmRhMSA9IHo7CgogICAgICAgIHZhciBkZWx0YSA9IGxhbWJkYTEgLSBsYW1iZGEwLAogICAgICAgICAgICBwb2xhciA9IGFicyQyKGRlbHRhIC0gcGkkOCkgPCBlcHNpbG9uJDcsCiAgICAgICAgICAgIG1lcmlkaWFuID0gcG9sYXIgfHwgZGVsdGEgPCBlcHNpbG9uJDc7CgogICAgICAgIGlmICghcG9sYXIgJiYgcGhpMSA8IHBoaTApIHogPSBwaGkwLCBwaGkwID0gcGhpMSwgcGhpMSA9IHo7CgogICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGZpcnN0IHBvaW50IGlzIGJldHdlZW4gYSBhbmQgYi4KICAgICAgICBpZiAobWVyaWRpYW4KICAgICAgICAgICAgPyBwb2xhcgogICAgICAgICAgICAgID8gcGhpMCArIHBoaTEgPiAwIF4gcVsxXSA8IChhYnMkMihxWzBdIC0gbGFtYmRhMCkgPCBlcHNpbG9uJDcgPyBwaGkwIDogcGhpMSkKICAgICAgICAgICAgICA6IHBoaTAgPD0gcVsxXSAmJiBxWzFdIDw9IHBoaTEKICAgICAgICAgICAgOiBkZWx0YSA+IHBpJDggXiAobGFtYmRhMCA8PSBxWzBdICYmIHFbMF0gPD0gbGFtYmRhMSkpIHsKICAgICAgICAgIHZhciBxMSA9IGNhcnRlc2lhblNjYWxlJDEodSwgKC13ICsgdCkgLyB1dSk7CiAgICAgICAgICBjYXJ0ZXNpYW5BZGRJblBsYWNlJDEocTEsIEEpOwogICAgICAgICAgcmV0dXJuIFtxLCBzcGhlcmljYWwkMShxMSldOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gR2VuZXJhdGVzIGEgNC1iaXQgdmVjdG9yIHJlcHJlc2VudGluZyB0aGUgbG9jYXRpb24gb2YgYSBwb2ludCByZWxhdGl2ZSB0bwogICAgICAvLyB0aGUgc21hbGwgY2lyY2xlJ3MgYm91bmRpbmcgYm94LgogICAgICBmdW5jdGlvbiBjb2RlKGxhbWJkYSwgcGhpKSB7CiAgICAgICAgdmFyIHIgPSBzbWFsbFJhZGl1cyA/IHJhZGl1cyA6IHBpJDggLSByYWRpdXMsCiAgICAgICAgICAgIGNvZGUgPSAwOwogICAgICAgIGlmIChsYW1iZGEgPCAtcikgY29kZSB8PSAxOyAvLyBsZWZ0CiAgICAgICAgZWxzZSBpZiAobGFtYmRhID4gcikgY29kZSB8PSAyOyAvLyByaWdodAogICAgICAgIGlmIChwaGkgPCAtcikgY29kZSB8PSA0OyAvLyBiZWxvdwogICAgICAgIGVsc2UgaWYgKHBoaSA+IHIpIGNvZGUgfD0gODsgLy8gYWJvdmUKICAgICAgICByZXR1cm4gY29kZTsKICAgICAgfQoKICAgICAgcmV0dXJuIGNsaXAkMSh2aXNpYmxlLCBjbGlwTGluZSwgaW50ZXJwb2xhdGUsIHNtYWxsUmFkaXVzID8gWzAsIC1yYWRpdXNdIDogWy1waSQ4LCByYWRpdXMgLSBwaSQ4XSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xpcExpbmUkMShhLCBiLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgYXggPSBhWzBdLAogICAgICAgICAgYXkgPSBhWzFdLAogICAgICAgICAgYnggPSBiWzBdLAogICAgICAgICAgYnkgPSBiWzFdLAogICAgICAgICAgdDAgPSAwLAogICAgICAgICAgdDEgPSAxLAogICAgICAgICAgZHggPSBieCAtIGF4LAogICAgICAgICAgZHkgPSBieSAtIGF5LAogICAgICAgICAgcjsKCiAgICAgIHIgPSB4MCAtIGF4OwogICAgICBpZiAoIWR4ICYmIHIgPiAwKSByZXR1cm47CiAgICAgIHIgLz0gZHg7CiAgICAgIGlmIChkeCA8IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0KCiAgICAgIHIgPSB4MSAtIGF4OwogICAgICBpZiAoIWR4ICYmIHIgPCAwKSByZXR1cm47CiAgICAgIHIgLz0gZHg7CiAgICAgIGlmIChkeCA8IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9IGVsc2UgaWYgKGR4ID4gMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0KCiAgICAgIHIgPSB5MCAtIGF5OwogICAgICBpZiAoIWR5ICYmIHIgPiAwKSByZXR1cm47CiAgICAgIHIgLz0gZHk7CiAgICAgIGlmIChkeSA8IDApIHsKICAgICAgICBpZiAociA8IHQwKSByZXR1cm47CiAgICAgICAgaWYgKHIgPCB0MSkgdDEgPSByOwogICAgICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0KCiAgICAgIHIgPSB5MSAtIGF5OwogICAgICBpZiAoIWR5ICYmIHIgPCAwKSByZXR1cm47CiAgICAgIHIgLz0gZHk7CiAgICAgIGlmIChkeSA8IDApIHsKICAgICAgICBpZiAociA+IHQxKSByZXR1cm47CiAgICAgICAgaWYgKHIgPiB0MCkgdDAgPSByOwogICAgICB9IGVsc2UgaWYgKGR5ID4gMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0KCiAgICAgIGlmICh0MCA+IDApIGFbMF0gPSBheCArIHQwICogZHgsIGFbMV0gPSBheSArIHQwICogZHk7CiAgICAgIGlmICh0MSA8IDEpIGJbMF0gPSBheCArIHQxICogZHgsIGJbMV0gPSBheSArIHQxICogZHk7CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHZhciBjbGlwTWF4JDEgPSAxZTksIGNsaXBNaW4kMSA9IC1jbGlwTWF4JDE7CgogICAgLy8gVE9ETyBVc2UgZDMtcG9seWdvbuKAmXMgcG9seWdvbkNvbnRhaW5zIGhlcmUgZm9yIHRoZSByaW5nIGNoZWNrPwogICAgLy8gVE9ETyBFbGltaW5hdGUgZHVwbGljYXRlIGJ1ZmZlcmluZyBpbiBjbGlwQnVmZmVyIGFuZCBwb2x5Z29uLnB1c2g/CgogICAgZnVuY3Rpb24gY2xpcFJlY3RhbmdsZSQxKHgwLCB5MCwgeDEsIHkxKSB7CgogICAgICBmdW5jdGlvbiB2aXNpYmxlKHgsIHkpIHsKICAgICAgICByZXR1cm4geDAgPD0geCAmJiB4IDw9IHgxICYmIHkwIDw9IHkgJiYgeSA8PSB5MTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW50ZXJwb2xhdGUoZnJvbSwgdG8sIGRpcmVjdGlvbiwgc3RyZWFtKSB7CiAgICAgICAgdmFyIGEgPSAwLCBhMSA9IDA7CiAgICAgICAgaWYgKGZyb20gPT0gbnVsbAogICAgICAgICAgICB8fCAoYSA9IGNvcm5lcihmcm9tLCBkaXJlY3Rpb24pKSAhPT0gKGExID0gY29ybmVyKHRvLCBkaXJlY3Rpb24pKQogICAgICAgICAgICB8fCBjb21wYXJlUG9pbnQoZnJvbSwgdG8pIDwgMCBeIGRpcmVjdGlvbiA+IDApIHsKICAgICAgICAgIGRvIHN0cmVhbS5wb2ludChhID09PSAwIHx8IGEgPT09IDMgPyB4MCA6IHgxLCBhID4gMSA/IHkxIDogeTApOwogICAgICAgICAgd2hpbGUgKChhID0gKGEgKyBkaXJlY3Rpb24gKyA0KSAlIDQpICE9PSBhMSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHN0cmVhbS5wb2ludCh0b1swXSwgdG9bMV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gY29ybmVyKHAsIGRpcmVjdGlvbikgewogICAgICAgIHJldHVybiBhYnMkMihwWzBdIC0geDApIDwgZXBzaWxvbiQ3ID8gZGlyZWN0aW9uID4gMCA/IDAgOiAzCiAgICAgICAgICAgIDogYWJzJDIocFswXSAtIHgxKSA8IGVwc2lsb24kNyA/IGRpcmVjdGlvbiA+IDAgPyAyIDogMQogICAgICAgICAgICA6IGFicyQyKHBbMV0gLSB5MCkgPCBlcHNpbG9uJDcgPyBkaXJlY3Rpb24gPiAwID8gMSA6IDAKICAgICAgICAgICAgOiBkaXJlY3Rpb24gPiAwID8gMyA6IDI7IC8vIGFicyhwWzFdIC0geTEpIDwgZXBzaWxvbgogICAgICB9CgogICAgICBmdW5jdGlvbiBjb21wYXJlSW50ZXJzZWN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gY29tcGFyZVBvaW50KGEueCwgYi54KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gY29tcGFyZVBvaW50KGEsIGIpIHsKICAgICAgICB2YXIgY2EgPSBjb3JuZXIoYSwgMSksCiAgICAgICAgICAgIGNiID0gY29ybmVyKGIsIDEpOwogICAgICAgIHJldHVybiBjYSAhPT0gY2IgPyBjYSAtIGNiCiAgICAgICAgICAgIDogY2EgPT09IDAgPyBiWzFdIC0gYVsxXQogICAgICAgICAgICA6IGNhID09PSAxID8gYVswXSAtIGJbMF0KICAgICAgICAgICAgOiBjYSA9PT0gMiA/IGFbMV0gLSBiWzFdCiAgICAgICAgICAgIDogYlswXSAtIGFbMF07CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICB2YXIgYWN0aXZlU3RyZWFtID0gc3RyZWFtLAogICAgICAgICAgICBidWZmZXJTdHJlYW0gPSBjbGlwQnVmZmVyJDEoKSwKICAgICAgICAgICAgc2VnbWVudHMsCiAgICAgICAgICAgIHBvbHlnb24sCiAgICAgICAgICAgIHJpbmcsCiAgICAgICAgICAgIHhfXywgeV9fLCB2X18sIC8vIGZpcnN0IHBvaW50CiAgICAgICAgICAgIHhfLCB5Xywgdl8sIC8vIHByZXZpb3VzIHBvaW50CiAgICAgICAgICAgIGZpcnN0LAogICAgICAgICAgICBjbGVhbjsKCiAgICAgICAgdmFyIGNsaXBTdHJlYW0gPSB7CiAgICAgICAgICBwb2ludDogcG9pbnQsCiAgICAgICAgICBsaW5lU3RhcnQ6IGxpbmVTdGFydCwKICAgICAgICAgIGxpbmVFbmQ6IGxpbmVFbmQsCiAgICAgICAgICBwb2x5Z29uU3RhcnQ6IHBvbHlnb25TdGFydCwKICAgICAgICAgIHBvbHlnb25FbmQ6IHBvbHlnb25FbmQKICAgICAgICB9OwoKICAgICAgICBmdW5jdGlvbiBwb2ludCh4LCB5KSB7CiAgICAgICAgICBpZiAodmlzaWJsZSh4LCB5KSkgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gcG9seWdvbkluc2lkZSgpIHsKICAgICAgICAgIHZhciB3aW5kaW5nID0gMDsKCiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHBvbHlnb24ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGZvciAodmFyIHJpbmcgPSBwb2x5Z29uW2ldLCBqID0gMSwgbSA9IHJpbmcubGVuZ3RoLCBwb2ludCA9IHJpbmdbMF0sIGEwLCBhMSwgYjAgPSBwb2ludFswXSwgYjEgPSBwb2ludFsxXTsgaiA8IG07ICsraikgewogICAgICAgICAgICAgIGEwID0gYjAsIGExID0gYjEsIHBvaW50ID0gcmluZ1tqXSwgYjAgPSBwb2ludFswXSwgYjEgPSBwb2ludFsxXTsKICAgICAgICAgICAgICBpZiAoYTEgPD0geTEpIHsgaWYgKGIxID4geTEgJiYgKGIwIC0gYTApICogKHkxIC0gYTEpID4gKGIxIC0gYTEpICogKHgwIC0gYTApKSArK3dpbmRpbmc7IH0KICAgICAgICAgICAgICBlbHNlIHsgaWYgKGIxIDw9IHkxICYmIChiMCAtIGEwKSAqICh5MSAtIGExKSA8IChiMSAtIGExKSAqICh4MCAtIGEwKSkgLS13aW5kaW5nOyB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICByZXR1cm4gd2luZGluZzsKICAgICAgICB9CgogICAgICAgIC8vIEJ1ZmZlciBnZW9tZXRyeSB3aXRoaW4gYSBwb2x5Z29uIGFuZCB0aGVuIGNsaXAgaXQgZW4gbWFzc2UuCiAgICAgICAgZnVuY3Rpb24gcG9seWdvblN0YXJ0KCkgewogICAgICAgICAgYWN0aXZlU3RyZWFtID0gYnVmZmVyU3RyZWFtLCBzZWdtZW50cyA9IFtdLCBwb2x5Z29uID0gW10sIGNsZWFuID0gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIHBvbHlnb25FbmQoKSB7CiAgICAgICAgICB2YXIgc3RhcnRJbnNpZGUgPSBwb2x5Z29uSW5zaWRlKCksCiAgICAgICAgICAgICAgY2xlYW5JbnNpZGUgPSBjbGVhbiAmJiBzdGFydEluc2lkZSwKICAgICAgICAgICAgICB2aXNpYmxlID0gKHNlZ21lbnRzID0gbWVyZ2UkMihzZWdtZW50cykpLmxlbmd0aDsKICAgICAgICAgIGlmIChjbGVhbkluc2lkZSB8fCB2aXNpYmxlKSB7CiAgICAgICAgICAgIHN0cmVhbS5wb2x5Z29uU3RhcnQoKTsKICAgICAgICAgICAgaWYgKGNsZWFuSW5zaWRlKSB7CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgICAgICAgIGludGVycG9sYXRlKG51bGwsIG51bGwsIDEsIHN0cmVhbSk7CiAgICAgICAgICAgICAgc3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodmlzaWJsZSkgewogICAgICAgICAgICAgIGNsaXBSZWpvaW4kMShzZWdtZW50cywgY29tcGFyZUludGVyc2VjdGlvbiwgc3RhcnRJbnNpZGUsIGludGVycG9sYXRlLCBzdHJlYW0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cmVhbS5wb2x5Z29uRW5kKCk7CiAgICAgICAgICB9CiAgICAgICAgICBhY3RpdmVTdHJlYW0gPSBzdHJlYW0sIHNlZ21lbnRzID0gcG9seWdvbiA9IHJpbmcgPSBudWxsOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbGluZVN0YXJ0KCkgewogICAgICAgICAgY2xpcFN0cmVhbS5wb2ludCA9IGxpbmVQb2ludDsKICAgICAgICAgIGlmIChwb2x5Z29uKSBwb2x5Z29uLnB1c2gocmluZyA9IFtdKTsKICAgICAgICAgIGZpcnN0ID0gdHJ1ZTsKICAgICAgICAgIHZfID0gZmFsc2U7CiAgICAgICAgICB4XyA9IHlfID0gTmFOOwogICAgICAgIH0KCiAgICAgICAgLy8gVE9ETyByYXRoZXIgdGhhbiBzcGVjaWFsLWNhc2UgcG9seWdvbnMsIHNpbXBseSBoYW5kbGUgdGhlbSBzZXBhcmF0ZWx5LgogICAgICAgIC8vIElkZWFsbHksIGNvaW5jaWRlbnQgaW50ZXJzZWN0aW9uIHBvaW50cyBzaG91bGQgYmUgaml0dGVyZWQgdG8gYXZvaWQKICAgICAgICAvLyBjbGlwcGluZyBpc3N1ZXMuCiAgICAgICAgZnVuY3Rpb24gbGluZUVuZCgpIHsKICAgICAgICAgIGlmIChzZWdtZW50cykgewogICAgICAgICAgICBsaW5lUG9pbnQoeF9fLCB5X18pOwogICAgICAgICAgICBpZiAodl9fICYmIHZfKSBidWZmZXJTdHJlYW0ucmVqb2luKCk7CiAgICAgICAgICAgIHNlZ21lbnRzLnB1c2goYnVmZmVyU3RyZWFtLnJlc3VsdCgpKTsKICAgICAgICAgIH0KICAgICAgICAgIGNsaXBTdHJlYW0ucG9pbnQgPSBwb2ludDsKICAgICAgICAgIGlmICh2XykgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGxpbmVQb2ludCh4LCB5KSB7CiAgICAgICAgICB2YXIgdiA9IHZpc2libGUoeCwgeSk7CiAgICAgICAgICBpZiAocG9seWdvbikgcmluZy5wdXNoKFt4LCB5XSk7CiAgICAgICAgICBpZiAoZmlyc3QpIHsKICAgICAgICAgICAgeF9fID0geCwgeV9fID0geSwgdl9fID0gdjsKICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHYpIHsKICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAodiAmJiB2XykgYWN0aXZlU3RyZWFtLnBvaW50KHgsIHkpOwogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICB2YXIgYSA9IFt4XyA9IE1hdGgubWF4KGNsaXBNaW4kMSwgTWF0aC5taW4oY2xpcE1heCQxLCB4XykpLCB5XyA9IE1hdGgubWF4KGNsaXBNaW4kMSwgTWF0aC5taW4oY2xpcE1heCQxLCB5XykpXSwKICAgICAgICAgICAgICAgICAgYiA9IFt4ID0gTWF0aC5tYXgoY2xpcE1pbiQxLCBNYXRoLm1pbihjbGlwTWF4JDEsIHgpKSwgeSA9IE1hdGgubWF4KGNsaXBNaW4kMSwgTWF0aC5taW4oY2xpcE1heCQxLCB5KSldOwogICAgICAgICAgICAgIGlmIChjbGlwTGluZSQxKGEsIGIsIHgwLCB5MCwgeDEsIHkxKSkgewogICAgICAgICAgICAgICAgaWYgKCF2XykgewogICAgICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludChhWzBdLCBhWzFdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFjdGl2ZVN0cmVhbS5wb2ludChiWzBdLCBiWzFdKTsKICAgICAgICAgICAgICAgIGlmICghdikgYWN0aXZlU3RyZWFtLmxpbmVFbmQoKTsKICAgICAgICAgICAgICAgIGNsZWFuID0gZmFsc2U7CiAgICAgICAgICAgICAgfSBlbHNlIGlmICh2KSB7CiAgICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ubGluZVN0YXJ0KCk7CiAgICAgICAgICAgICAgICBhY3RpdmVTdHJlYW0ucG9pbnQoeCwgeSk7CiAgICAgICAgICAgICAgICBjbGVhbiA9IGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgeF8gPSB4LCB5XyA9IHksIHZfID0gdjsKICAgICAgICB9CgogICAgICAgIHJldHVybiBjbGlwU3RyZWFtOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dGVudCQzKCkgewogICAgICB2YXIgeDAgPSAwLAogICAgICAgICAgeTAgPSAwLAogICAgICAgICAgeDEgPSA5NjAsCiAgICAgICAgICB5MSA9IDUwMCwKICAgICAgICAgIGNhY2hlLAogICAgICAgICAgY2FjaGVTdHJlYW0sCiAgICAgICAgICBjbGlwOwoKICAgICAgcmV0dXJuIGNsaXAgPSB7CiAgICAgICAgc3RyZWFtOiBmdW5jdGlvbihzdHJlYW0pIHsKICAgICAgICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IGNsaXBSZWN0YW5nbGUkMSh4MCwgeTAsIHgxLCB5MSkoY2FjaGVTdHJlYW0gPSBzdHJlYW0pOwogICAgICAgIH0sCiAgICAgICAgZXh0ZW50OiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdWzBdLCB5MCA9ICtfWzBdWzFdLCB4MSA9ICtfWzFdWzBdLCB5MSA9ICtfWzFdWzFdLCBjYWNoZSA9IGNhY2hlU3RyZWFtID0gbnVsbCwgY2xpcCkgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgdmFyIGxlbmd0aFN1bSQyID0gYWRkZXIkMSgpLAogICAgICAgIGxhbWJkYTAkNSwKICAgICAgICBzaW5QaGkwJDMsCiAgICAgICAgY29zUGhpMCQzOwoKICAgIHZhciBsZW5ndGhTdHJlYW0kMiA9IHsKICAgICAgc3BoZXJlOiBub29wJDgsCiAgICAgIHBvaW50OiBub29wJDgsCiAgICAgIGxpbmVTdGFydDogbGVuZ3RoTGluZVN0YXJ0JDEsCiAgICAgIGxpbmVFbmQ6IG5vb3AkOCwKICAgICAgcG9seWdvblN0YXJ0OiBub29wJDgsCiAgICAgIHBvbHlnb25FbmQ6IG5vb3AkOAogICAgfTsKCiAgICBmdW5jdGlvbiBsZW5ndGhMaW5lU3RhcnQkMSgpIHsKICAgICAgbGVuZ3RoU3RyZWFtJDIucG9pbnQgPSBsZW5ndGhQb2ludEZpcnN0JDI7CiAgICAgIGxlbmd0aFN0cmVhbSQyLmxpbmVFbmQgPSBsZW5ndGhMaW5lRW5kJDE7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuZ3RoTGluZUVuZCQxKCkgewogICAgICBsZW5ndGhTdHJlYW0kMi5wb2ludCA9IGxlbmd0aFN0cmVhbSQyLmxpbmVFbmQgPSBub29wJDg7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuZ3RoUG9pbnRGaXJzdCQyKGxhbWJkYSwgcGhpKSB7CiAgICAgIGxhbWJkYSAqPSByYWRpYW5zJDEsIHBoaSAqPSByYWRpYW5zJDE7CiAgICAgIGxhbWJkYTAkNSA9IGxhbWJkYSwgc2luUGhpMCQzID0gc2luJDQocGhpKSwgY29zUGhpMCQzID0gY29zJDQocGhpKTsKICAgICAgbGVuZ3RoU3RyZWFtJDIucG9pbnQgPSBsZW5ndGhQb2ludCQyOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlbmd0aFBvaW50JDIobGFtYmRhLCBwaGkpIHsKICAgICAgbGFtYmRhICo9IHJhZGlhbnMkMSwgcGhpICo9IHJhZGlhbnMkMTsKICAgICAgdmFyIHNpblBoaSA9IHNpbiQ0KHBoaSksCiAgICAgICAgICBjb3NQaGkgPSBjb3MkNChwaGkpLAogICAgICAgICAgZGVsdGEgPSBhYnMkMihsYW1iZGEgLSBsYW1iZGEwJDUpLAogICAgICAgICAgY29zRGVsdGEgPSBjb3MkNChkZWx0YSksCiAgICAgICAgICBzaW5EZWx0YSA9IHNpbiQ0KGRlbHRhKSwKICAgICAgICAgIHggPSBjb3NQaGkgKiBzaW5EZWx0YSwKICAgICAgICAgIHkgPSBjb3NQaGkwJDMgKiBzaW5QaGkgLSBzaW5QaGkwJDMgKiBjb3NQaGkgKiBjb3NEZWx0YSwKICAgICAgICAgIHogPSBzaW5QaGkwJDMgKiBzaW5QaGkgKyBjb3NQaGkwJDMgKiBjb3NQaGkgKiBjb3NEZWx0YTsKICAgICAgbGVuZ3RoU3VtJDIuYWRkKGF0YW4yJDIoc3FydCQzKHggKiB4ICsgeSAqIHkpLCB6KSk7CiAgICAgIGxhbWJkYTAkNSA9IGxhbWJkYSwgc2luUGhpMCQzID0gc2luUGhpLCBjb3NQaGkwJDMgPSBjb3NQaGk7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuZ3RoJDQob2JqZWN0KSB7CiAgICAgIGxlbmd0aFN1bSQyLnJlc2V0KCk7CiAgICAgIGdlb1N0cmVhbSQxKG9iamVjdCwgbGVuZ3RoU3RyZWFtJDIpOwogICAgICByZXR1cm4gK2xlbmd0aFN1bSQyOwogICAgfQoKICAgIHZhciBjb29yZGluYXRlcyQxID0gW251bGwsIG51bGxdLAogICAgICAgIG9iamVjdCQzID0ge3R5cGU6ICJMaW5lU3RyaW5nIiwgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzJDF9OwoKICAgIGZ1bmN0aW9uIGRpc3RhbmNlJDEoYSwgYikgewogICAgICBjb29yZGluYXRlcyQxWzBdID0gYTsKICAgICAgY29vcmRpbmF0ZXMkMVsxXSA9IGI7CiAgICAgIHJldHVybiBsZW5ndGgkNChvYmplY3QkMyk7CiAgICB9CgogICAgdmFyIGNvbnRhaW5zT2JqZWN0VHlwZSQxID0gewogICAgICBGZWF0dXJlOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zR2VvbWV0cnkkMShvYmplY3QuZ2VvbWV0cnksIHBvaW50KTsKICAgICAgfSwKICAgICAgRmVhdHVyZUNvbGxlY3Rpb246IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAgICAgICB2YXIgZmVhdHVyZXMgPSBvYmplY3QuZmVhdHVyZXMsIGkgPSAtMSwgbiA9IGZlYXR1cmVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zR2VvbWV0cnkkMShmZWF0dXJlc1tpXS5nZW9tZXRyeSwgcG9pbnQpKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGNvbnRhaW5zR2VvbWV0cnlUeXBlJDEgPSB7CiAgICAgIFNwaGVyZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCiAgICAgIFBvaW50OiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgcmV0dXJuIGNvbnRhaW5zUG9pbnQkMShvYmplY3QuY29vcmRpbmF0ZXMsIHBvaW50KTsKICAgICAgfSwKICAgICAgTXVsdGlQb2ludDogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFpbnNQb2ludCQxKGNvb3JkaW5hdGVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfSwKICAgICAgTGluZVN0cmluZzogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgICAgIHJldHVybiBjb250YWluc0xpbmUkMShvYmplY3QuY29vcmRpbmF0ZXMsIHBvaW50KTsKICAgICAgfSwKICAgICAgTXVsdGlMaW5lU3RyaW5nOiBmdW5jdGlvbihvYmplY3QsIHBvaW50KSB7CiAgICAgICAgdmFyIGNvb3JkaW5hdGVzID0gb2JqZWN0LmNvb3JkaW5hdGVzLCBpID0gLTEsIG4gPSBjb29yZGluYXRlcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmIChjb250YWluc0xpbmUkMShjb29yZGluYXRlc1tpXSwgcG9pbnQpKSByZXR1cm4gdHJ1ZTsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0sCiAgICAgIFBvbHlnb246IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAgICAgICByZXR1cm4gY29udGFpbnNQb2x5Z29uJDEob2JqZWN0LmNvb3JkaW5hdGVzLCBwb2ludCk7CiAgICAgIH0sCiAgICAgIE11bHRpUG9seWdvbjogZnVuY3Rpb24ob2JqZWN0LCBwb2ludCkgewogICAgICAgIHZhciBjb29yZGluYXRlcyA9IG9iamVjdC5jb29yZGluYXRlcywgaSA9IC0xLCBuID0gY29vcmRpbmF0ZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoY29udGFpbnNQb2x5Z29uJDEoY29vcmRpbmF0ZXNbaV0sIHBvaW50KSkgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9LAogICAgICBHZW9tZXRyeUNvbGxlY3Rpb246IGZ1bmN0aW9uKG9iamVjdCwgcG9pbnQpIHsKICAgICAgICB2YXIgZ2VvbWV0cmllcyA9IG9iamVjdC5nZW9tZXRyaWVzLCBpID0gLTEsIG4gPSBnZW9tZXRyaWVzLmxlbmd0aDsKICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKGNvbnRhaW5zR2VvbWV0cnkkMShnZW9tZXRyaWVzW2ldLCBwb2ludCkpIHJldHVybiB0cnVlOwogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjb250YWluc0dlb21ldHJ5JDEoZ2VvbWV0cnksIHBvaW50KSB7CiAgICAgIHJldHVybiBnZW9tZXRyeSAmJiBjb250YWluc0dlb21ldHJ5VHlwZSQxLmhhc093blByb3BlcnR5KGdlb21ldHJ5LnR5cGUpCiAgICAgICAgICA/IGNvbnRhaW5zR2VvbWV0cnlUeXBlJDFbZ2VvbWV0cnkudHlwZV0oZ2VvbWV0cnksIHBvaW50KQogICAgICAgICAgOiBmYWxzZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250YWluc1BvaW50JDEoY29vcmRpbmF0ZXMsIHBvaW50KSB7CiAgICAgIHJldHVybiBkaXN0YW5jZSQxKGNvb3JkaW5hdGVzLCBwb2ludCkgPT09IDA7CiAgICB9CgogICAgZnVuY3Rpb24gY29udGFpbnNMaW5lJDEoY29vcmRpbmF0ZXMsIHBvaW50KSB7CiAgICAgIHZhciBhYiA9IGRpc3RhbmNlJDEoY29vcmRpbmF0ZXNbMF0sIGNvb3JkaW5hdGVzWzFdKSwKICAgICAgICAgIGFvID0gZGlzdGFuY2UkMShjb29yZGluYXRlc1swXSwgcG9pbnQpLAogICAgICAgICAgb2IgPSBkaXN0YW5jZSQxKHBvaW50LCBjb29yZGluYXRlc1sxXSk7CiAgICAgIHJldHVybiBhbyArIG9iIDw9IGFiICsgZXBzaWxvbiQ3OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRhaW5zUG9seWdvbiQxKGNvb3JkaW5hdGVzLCBwb2ludCkgewogICAgICByZXR1cm4gISFwb2x5Z29uQ29udGFpbnMkMShjb29yZGluYXRlcy5tYXAocmluZ1JhZGlhbnMkMSksIHBvaW50UmFkaWFucyQxKHBvaW50KSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmluZ1JhZGlhbnMkMShyaW5nKSB7CiAgICAgIHJldHVybiByaW5nID0gcmluZy5tYXAocG9pbnRSYWRpYW5zJDEpLCByaW5nLnBvcCgpLCByaW5nOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50UmFkaWFucyQxKHBvaW50KSB7CiAgICAgIHJldHVybiBbcG9pbnRbMF0gKiByYWRpYW5zJDEsIHBvaW50WzFdICogcmFkaWFucyQxXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250YWlucyQzKG9iamVjdCwgcG9pbnQpIHsKICAgICAgcmV0dXJuIChvYmplY3QgJiYgY29udGFpbnNPYmplY3RUeXBlJDEuaGFzT3duUHJvcGVydHkob2JqZWN0LnR5cGUpCiAgICAgICAgICA/IGNvbnRhaW5zT2JqZWN0VHlwZSQxW29iamVjdC50eXBlXQogICAgICAgICAgOiBjb250YWluc0dlb21ldHJ5JDEpKG9iamVjdCwgcG9pbnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdyYXRpY3VsZVgkMSh5MCwgeTEsIGR5KSB7CiAgICAgIHZhciB5ID0gcmFuZ2UkNCh5MCwgeTEgLSBlcHNpbG9uJDcsIGR5KS5jb25jYXQoeTEpOwogICAgICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4geS5tYXAoZnVuY3Rpb24oeSkgeyByZXR1cm4gW3gsIHldOyB9KTsgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBncmF0aWN1bGVZJDEoeDAsIHgxLCBkeCkgewogICAgICB2YXIgeCA9IHJhbmdlJDQoeDAsIHgxIC0gZXBzaWxvbiQ3LCBkeCkuY29uY2F0KHgxKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHkpIHsgcmV0dXJuIHgubWFwKGZ1bmN0aW9uKHgpIHsgcmV0dXJuIFt4LCB5XTsgfSk7IH07CiAgICB9CgogICAgZnVuY3Rpb24gZ3JhdGljdWxlJDEoKSB7CiAgICAgIHZhciB4MSwgeDAsIFgxLCBYMCwKICAgICAgICAgIHkxLCB5MCwgWTEsIFkwLAogICAgICAgICAgZHggPSAxMCwgZHkgPSBkeCwgRFggPSA5MCwgRFkgPSAzNjAsCiAgICAgICAgICB4LCB5LCBYLCBZLAogICAgICAgICAgcHJlY2lzaW9uID0gMi41OwoKICAgICAgZnVuY3Rpb24gZ3JhdGljdWxlKCkgewogICAgICAgIHJldHVybiB7dHlwZTogIk11bHRpTGluZVN0cmluZyIsIGNvb3JkaW5hdGVzOiBsaW5lcygpfTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbGluZXMoKSB7CiAgICAgICAgcmV0dXJuIHJhbmdlJDQoY2VpbCQxKFgwIC8gRFgpICogRFgsIFgxLCBEWCkubWFwKFgpCiAgICAgICAgICAgIC5jb25jYXQocmFuZ2UkNChjZWlsJDEoWTAgLyBEWSkgKiBEWSwgWTEsIERZKS5tYXAoWSkpCiAgICAgICAgICAgIC5jb25jYXQocmFuZ2UkNChjZWlsJDEoeDAgLyBkeCkgKiBkeCwgeDEsIGR4KS5maWx0ZXIoZnVuY3Rpb24oeCkgeyByZXR1cm4gYWJzJDIoeCAlIERYKSA+IGVwc2lsb24kNzsgfSkubWFwKHgpKQogICAgICAgICAgICAuY29uY2F0KHJhbmdlJDQoY2VpbCQxKHkwIC8gZHkpICogZHksIHkxLCBkeSkuZmlsdGVyKGZ1bmN0aW9uKHkpIHsgcmV0dXJuIGFicyQyKHkgJSBEWSkgPiBlcHNpbG9uJDc7IH0pLm1hcCh5KSk7CiAgICAgIH0KCiAgICAgIGdyYXRpY3VsZS5saW5lcyA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBsaW5lcygpLm1hcChmdW5jdGlvbihjb29yZGluYXRlcykgeyByZXR1cm4ge3R5cGU6ICJMaW5lU3RyaW5nIiwgY29vcmRpbmF0ZXM6IGNvb3JkaW5hdGVzfTsgfSk7CiAgICAgIH07CgogICAgICBncmF0aWN1bGUub3V0bGluZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICB0eXBlOiAiUG9seWdvbiIsCiAgICAgICAgICBjb29yZGluYXRlczogWwogICAgICAgICAgICBYKFgwKS5jb25jYXQoCiAgICAgICAgICAgIFkoWTEpLnNsaWNlKDEpLAogICAgICAgICAgICBYKFgxKS5yZXZlcnNlKCkuc2xpY2UoMSksCiAgICAgICAgICAgIFkoWTApLnJldmVyc2UoKS5zbGljZSgxKSkKICAgICAgICAgIF0KICAgICAgICB9OwogICAgICB9OwoKICAgICAgZ3JhdGljdWxlLmV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBncmF0aWN1bGUuZXh0ZW50TWlub3IoKTsKICAgICAgICByZXR1cm4gZ3JhdGljdWxlLmV4dGVudE1ham9yKF8pLmV4dGVudE1pbm9yKF8pOwogICAgICB9OwoKICAgICAgZ3JhdGljdWxlLmV4dGVudE1ham9yID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtbWDAsIFkwXSwgW1gxLCBZMV1dOwogICAgICAgIFgwID0gK19bMF1bMF0sIFgxID0gK19bMV1bMF07CiAgICAgICAgWTAgPSArX1swXVsxXSwgWTEgPSArX1sxXVsxXTsKICAgICAgICBpZiAoWDAgPiBYMSkgXyA9IFgwLCBYMCA9IFgxLCBYMSA9IF87CiAgICAgICAgaWYgKFkwID4gWTEpIF8gPSBZMCwgWTAgPSBZMSwgWTEgPSBfOwogICAgICAgIHJldHVybiBncmF0aWN1bGUucHJlY2lzaW9uKHByZWNpc2lvbik7CiAgICAgIH07CgogICAgICBncmF0aWN1bGUuZXh0ZW50TWlub3IgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW1t4MCwgeTBdLCBbeDEsIHkxXV07CiAgICAgICAgeDAgPSArX1swXVswXSwgeDEgPSArX1sxXVswXTsKICAgICAgICB5MCA9ICtfWzBdWzFdLCB5MSA9ICtfWzFdWzFdOwogICAgICAgIGlmICh4MCA+IHgxKSBfID0geDAsIHgwID0geDEsIHgxID0gXzsKICAgICAgICBpZiAoeTAgPiB5MSkgXyA9IHkwLCB5MCA9IHkxLCB5MSA9IF87CiAgICAgICAgcmV0dXJuIGdyYXRpY3VsZS5wcmVjaXNpb24ocHJlY2lzaW9uKTsKICAgICAgfTsKCiAgICAgIGdyYXRpY3VsZS5zdGVwID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGdyYXRpY3VsZS5zdGVwTWlub3IoKTsKICAgICAgICByZXR1cm4gZ3JhdGljdWxlLnN0ZXBNYWpvcihfKS5zdGVwTWlub3IoXyk7CiAgICAgIH07CgogICAgICBncmF0aWN1bGUuc3RlcE1ham9yID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIFtEWCwgRFldOwogICAgICAgIERYID0gK19bMF0sIERZID0gK19bMV07CiAgICAgICAgcmV0dXJuIGdyYXRpY3VsZTsKICAgICAgfTsKCiAgICAgIGdyYXRpY3VsZS5zdGVwTWlub3IgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gW2R4LCBkeV07CiAgICAgICAgZHggPSArX1swXSwgZHkgPSArX1sxXTsKICAgICAgICByZXR1cm4gZ3JhdGljdWxlOwogICAgICB9OwoKICAgICAgZ3JhdGljdWxlLnByZWNpc2lvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoIWFyZ3VtZW50cy5sZW5ndGgpIHJldHVybiBwcmVjaXNpb247CiAgICAgICAgcHJlY2lzaW9uID0gK187CiAgICAgICAgeCA9IGdyYXRpY3VsZVgkMSh5MCwgeTEsIDkwKTsKICAgICAgICB5ID0gZ3JhdGljdWxlWSQxKHgwLCB4MSwgcHJlY2lzaW9uKTsKICAgICAgICBYID0gZ3JhdGljdWxlWCQxKFkwLCBZMSwgOTApOwogICAgICAgIFkgPSBncmF0aWN1bGVZJDEoWDAsIFgxLCBwcmVjaXNpb24pOwogICAgICAgIHJldHVybiBncmF0aWN1bGU7CiAgICAgIH07CgogICAgICByZXR1cm4gZ3JhdGljdWxlCiAgICAgICAgICAuZXh0ZW50TWFqb3IoW1stMTgwLCAtOTAgKyBlcHNpbG9uJDddLCBbMTgwLCA5MCAtIGVwc2lsb24kN11dKQogICAgICAgICAgLmV4dGVudE1pbm9yKFtbLTE4MCwgLTgwIC0gZXBzaWxvbiQ3XSwgWzE4MCwgODAgKyBlcHNpbG9uJDddXSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ3JhdGljdWxlMTAkMSgpIHsKICAgICAgcmV0dXJuIGdyYXRpY3VsZSQxKCkoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZSQ0KGEsIGIpIHsKICAgICAgdmFyIHgwID0gYVswXSAqIHJhZGlhbnMkMSwKICAgICAgICAgIHkwID0gYVsxXSAqIHJhZGlhbnMkMSwKICAgICAgICAgIHgxID0gYlswXSAqIHJhZGlhbnMkMSwKICAgICAgICAgIHkxID0gYlsxXSAqIHJhZGlhbnMkMSwKICAgICAgICAgIGN5MCA9IGNvcyQ0KHkwKSwKICAgICAgICAgIHN5MCA9IHNpbiQ0KHkwKSwKICAgICAgICAgIGN5MSA9IGNvcyQ0KHkxKSwKICAgICAgICAgIHN5MSA9IHNpbiQ0KHkxKSwKICAgICAgICAgIGt4MCA9IGN5MCAqIGNvcyQ0KHgwKSwKICAgICAgICAgIGt5MCA9IGN5MCAqIHNpbiQ0KHgwKSwKICAgICAgICAgIGt4MSA9IGN5MSAqIGNvcyQ0KHgxKSwKICAgICAgICAgIGt5MSA9IGN5MSAqIHNpbiQ0KHgxKSwKICAgICAgICAgIGQgPSAyICogYXNpbiQyKHNxcnQkMyhoYXZlcnNpbiQxKHkxIC0geTApICsgY3kwICogY3kxICogaGF2ZXJzaW4kMSh4MSAtIHgwKSkpLAogICAgICAgICAgayA9IHNpbiQ0KGQpOwoKICAgICAgdmFyIGludGVycG9sYXRlID0gZCA/IGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgQiA9IHNpbiQ0KHQgKj0gZCkgLyBrLAogICAgICAgICAgICBBID0gc2luJDQoZCAtIHQpIC8gaywKICAgICAgICAgICAgeCA9IEEgKiBreDAgKyBCICoga3gxLAogICAgICAgICAgICB5ID0gQSAqIGt5MCArIEIgKiBreTEsCiAgICAgICAgICAgIHogPSBBICogc3kwICsgQiAqIHN5MTsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgYXRhbjIkMih5LCB4KSAqIGRlZ3JlZXMkMywKICAgICAgICAgIGF0YW4yJDIoeiwgc3FydCQzKHggKiB4ICsgeSAqIHkpKSAqIGRlZ3JlZXMkMwogICAgICAgIF07CiAgICAgIH0gOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gW3gwICogZGVncmVlcyQzLCB5MCAqIGRlZ3JlZXMkM107CiAgICAgIH07CgogICAgICBpbnRlcnBvbGF0ZS5kaXN0YW5jZSA9IGQ7CgogICAgICByZXR1cm4gaW50ZXJwb2xhdGU7CiAgICB9CgogICAgZnVuY3Rpb24gaWRlbnRpdHkkZSh4KSB7CiAgICAgIHJldHVybiB4OwogICAgfQoKICAgIHZhciBhcmVhU3VtJDMgPSBhZGRlciQxKCksCiAgICAgICAgYXJlYVJpbmdTdW0kMyA9IGFkZGVyJDEoKSwKICAgICAgICB4MDAkMywKICAgICAgICB5MDAkMywKICAgICAgICB4MCQ2LAogICAgICAgIHkwJDY7CgogICAgdmFyIGFyZWFTdHJlYW0kMyA9IHsKICAgICAgcG9pbnQ6IG5vb3AkOCwKICAgICAgbGluZVN0YXJ0OiBub29wJDgsCiAgICAgIGxpbmVFbmQ6IG5vb3AkOCwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBhcmVhU3RyZWFtJDMubGluZVN0YXJ0ID0gYXJlYVJpbmdTdGFydCQzOwogICAgICAgIGFyZWFTdHJlYW0kMy5saW5lRW5kID0gYXJlYVJpbmdFbmQkMzsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgYXJlYVN0cmVhbSQzLmxpbmVTdGFydCA9IGFyZWFTdHJlYW0kMy5saW5lRW5kID0gYXJlYVN0cmVhbSQzLnBvaW50ID0gbm9vcCQ4OwogICAgICAgIGFyZWFTdW0kMy5hZGQoYWJzJDIoYXJlYVJpbmdTdW0kMykpOwogICAgICAgIGFyZWFSaW5nU3VtJDMucmVzZXQoKTsKICAgICAgfSwKICAgICAgcmVzdWx0OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJlYSA9IGFyZWFTdW0kMyAvIDI7CiAgICAgICAgYXJlYVN1bSQzLnJlc2V0KCk7CiAgICAgICAgcmV0dXJuIGFyZWE7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYXJlYVJpbmdTdGFydCQzKCkgewogICAgICBhcmVhU3RyZWFtJDMucG9pbnQgPSBhcmVhUG9pbnRGaXJzdCQzOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWFQb2ludEZpcnN0JDMoeCwgeSkgewogICAgICBhcmVhU3RyZWFtJDMucG9pbnQgPSBhcmVhUG9pbnQkMzsKICAgICAgeDAwJDMgPSB4MCQ2ID0geCwgeTAwJDMgPSB5MCQ2ID0geTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhUG9pbnQkMyh4LCB5KSB7CiAgICAgIGFyZWFSaW5nU3VtJDMuYWRkKHkwJDYgKiB4IC0geDAkNiAqIHkpOwogICAgICB4MCQ2ID0geCwgeTAkNiA9IHk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJlYVJpbmdFbmQkMygpIHsKICAgICAgYXJlYVBvaW50JDMoeDAwJDMsIHkwMCQzKTsKICAgIH0KCiAgICB2YXIgeDAkNyA9IEluZmluaXR5LAogICAgICAgIHkwJDcgPSB4MCQ3LAogICAgICAgIHgxJDEgPSAteDAkNywKICAgICAgICB5MSQxID0geDEkMTsKCiAgICB2YXIgYm91bmRzU3RyZWFtJDMgPSB7CiAgICAgIHBvaW50OiBib3VuZHNQb2ludCQzLAogICAgICBsaW5lU3RhcnQ6IG5vb3AkOCwKICAgICAgbGluZUVuZDogbm9vcCQ4LAogICAgICBwb2x5Z29uU3RhcnQ6IG5vb3AkOCwKICAgICAgcG9seWdvbkVuZDogbm9vcCQ4LAogICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBib3VuZHMgPSBbW3gwJDcsIHkwJDddLCBbeDEkMSwgeTEkMV1dOwogICAgICAgIHgxJDEgPSB5MSQxID0gLSh5MCQ3ID0geDAkNyA9IEluZmluaXR5KTsKICAgICAgICByZXR1cm4gYm91bmRzOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGJvdW5kc1BvaW50JDMoeCwgeSkgewogICAgICBpZiAoeCA8IHgwJDcpIHgwJDcgPSB4OwogICAgICBpZiAoeCA+IHgxJDEpIHgxJDEgPSB4OwogICAgICBpZiAoeSA8IHkwJDcpIHkwJDcgPSB5OwogICAgICBpZiAoeSA+IHkxJDEpIHkxJDEgPSB5OwogICAgfQoKICAgIC8vIFRPRE8gRW5mb3JjZSBwb3NpdGl2ZSBhcmVhIGZvciBleHRlcmlvciwgbmVnYXRpdmUgYXJlYSBmb3IgaW50ZXJpb3I/CgogICAgdmFyIFgwJDMgPSAwLAogICAgICAgIFkwJDMgPSAwLAogICAgICAgIFowJDMgPSAwLAogICAgICAgIFgxJDMgPSAwLAogICAgICAgIFkxJDMgPSAwLAogICAgICAgIFoxJDMgPSAwLAogICAgICAgIFgyJDMgPSAwLAogICAgICAgIFkyJDMgPSAwLAogICAgICAgIFoyJDMgPSAwLAogICAgICAgIHgwMCQ0LAogICAgICAgIHkwMCQ0LAogICAgICAgIHgwJDgsCiAgICAgICAgeTAkODsKCiAgICB2YXIgY2VudHJvaWRTdHJlYW0kMyA9IHsKICAgICAgcG9pbnQ6IGNlbnRyb2lkUG9pbnQkMywKICAgICAgbGluZVN0YXJ0OiBjZW50cm9pZExpbmVTdGFydCQzLAogICAgICBsaW5lRW5kOiBjZW50cm9pZExpbmVFbmQkMywKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBjZW50cm9pZFN0cmVhbSQzLmxpbmVTdGFydCA9IGNlbnRyb2lkUmluZ1N0YXJ0JDM7CiAgICAgICAgY2VudHJvaWRTdHJlYW0kMy5saW5lRW5kID0gY2VudHJvaWRSaW5nRW5kJDM7CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGNlbnRyb2lkU3RyZWFtJDMucG9pbnQgPSBjZW50cm9pZFBvaW50JDM7CiAgICAgICAgY2VudHJvaWRTdHJlYW0kMy5saW5lU3RhcnQgPSBjZW50cm9pZExpbmVTdGFydCQzOwogICAgICAgIGNlbnRyb2lkU3RyZWFtJDMubGluZUVuZCA9IGNlbnRyb2lkTGluZUVuZCQzOwogICAgICB9LAogICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjZW50cm9pZCA9IFoyJDMgPyBbWDIkMyAvIFoyJDMsIFkyJDMgLyBaMiQzXQogICAgICAgICAgICA6IFoxJDMgPyBbWDEkMyAvIFoxJDMsIFkxJDMgLyBaMSQzXQogICAgICAgICAgICA6IFowJDMgPyBbWDAkMyAvIFowJDMsIFkwJDMgLyBaMCQzXQogICAgICAgICAgICA6IFtOYU4sIE5hTl07CiAgICAgICAgWDAkMyA9IFkwJDMgPSBaMCQzID0KICAgICAgICBYMSQzID0gWTEkMyA9IFoxJDMgPQogICAgICAgIFgyJDMgPSBZMiQzID0gWjIkMyA9IDA7CiAgICAgICAgcmV0dXJuIGNlbnRyb2lkOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnQkMyh4LCB5KSB7CiAgICAgIFgwJDMgKz0geDsKICAgICAgWTAkMyArPSB5OwogICAgICArK1owJDM7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRMaW5lU3RhcnQkMygpIHsKICAgICAgY2VudHJvaWRTdHJlYW0kMy5wb2ludCA9IGNlbnRyb2lkUG9pbnRGaXJzdExpbmUkMTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZFBvaW50Rmlyc3RMaW5lJDEoeCwgeSkgewogICAgICBjZW50cm9pZFN0cmVhbSQzLnBvaW50ID0gY2VudHJvaWRQb2ludExpbmUkMTsKICAgICAgY2VudHJvaWRQb2ludCQzKHgwJDggPSB4LCB5MCQ4ID0geSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRQb2ludExpbmUkMSh4LCB5KSB7CiAgICAgIHZhciBkeCA9IHggLSB4MCQ4LCBkeSA9IHkgLSB5MCQ4LCB6ID0gc3FydCQzKGR4ICogZHggKyBkeSAqIGR5KTsKICAgICAgWDEkMyArPSB6ICogKHgwJDggKyB4KSAvIDI7CiAgICAgIFkxJDMgKz0geiAqICh5MCQ4ICsgeSkgLyAyOwogICAgICBaMSQzICs9IHo7CiAgICAgIGNlbnRyb2lkUG9pbnQkMyh4MCQ4ID0geCwgeTAkOCA9IHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkTGluZUVuZCQzKCkgewogICAgICBjZW50cm9pZFN0cmVhbSQzLnBvaW50ID0gY2VudHJvaWRQb2ludCQzOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUmluZ1N0YXJ0JDMoKSB7CiAgICAgIGNlbnRyb2lkU3RyZWFtJDMucG9pbnQgPSBjZW50cm9pZFBvaW50Rmlyc3RSaW5nJDE7CiAgICB9CgogICAgZnVuY3Rpb24gY2VudHJvaWRSaW5nRW5kJDMoKSB7CiAgICAgIGNlbnRyb2lkUG9pbnRSaW5nJDEoeDAwJDQsIHkwMCQ0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZFBvaW50Rmlyc3RSaW5nJDEoeCwgeSkgewogICAgICBjZW50cm9pZFN0cmVhbSQzLnBvaW50ID0gY2VudHJvaWRQb2ludFJpbmckMTsKICAgICAgY2VudHJvaWRQb2ludCQzKHgwMCQ0ID0geDAkOCA9IHgsIHkwMCQ0ID0geTAkOCA9IHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbnRyb2lkUG9pbnRSaW5nJDEoeCwgeSkgewogICAgICB2YXIgZHggPSB4IC0geDAkOCwKICAgICAgICAgIGR5ID0geSAtIHkwJDgsCiAgICAgICAgICB6ID0gc3FydCQzKGR4ICogZHggKyBkeSAqIGR5KTsKCiAgICAgIFgxJDMgKz0geiAqICh4MCQ4ICsgeCkgLyAyOwogICAgICBZMSQzICs9IHogKiAoeTAkOCArIHkpIC8gMjsKICAgICAgWjEkMyArPSB6OwoKICAgICAgeiA9IHkwJDggKiB4IC0geDAkOCAqIHk7CiAgICAgIFgyJDMgKz0geiAqICh4MCQ4ICsgeCk7CiAgICAgIFkyJDMgKz0geiAqICh5MCQ4ICsgeSk7CiAgICAgIFoyJDMgKz0geiAqIDM7CiAgICAgIGNlbnRyb2lkUG9pbnQkMyh4MCQ4ID0geCwgeTAkOCA9IHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIFBhdGhDb250ZXh0JDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBQYXRoQ29udGV4dCQxLnByb3RvdHlwZSA9IHsKICAgICAgX3JhZGl1czogNC41LAogICAgICBwb2ludFJhZGl1czogZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiB0aGlzLl9yYWRpdXMgPSBfLCB0aGlzOwogICAgICB9LAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgPT09IDApIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fcG9pbnQgPSBOYU47CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOwogICAgICAgICAgICB0aGlzLl9wb2ludCA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCArIHRoaXMuX3JhZGl1cywgeSk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuYXJjKHgsIHksIHRoaXMuX3JhZGl1cywgMCwgdGF1JDgpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlc3VsdDogbm9vcCQ4CiAgICB9OwoKICAgIHZhciBsZW5ndGhTdW0kMyA9IGFkZGVyJDEoKSwKICAgICAgICBsZW5ndGhSaW5nJDEsCiAgICAgICAgeDAwJDUsCiAgICAgICAgeTAwJDUsCiAgICAgICAgeDAkOSwKICAgICAgICB5MCQ5OwoKICAgIHZhciBsZW5ndGhTdHJlYW0kMyA9IHsKICAgICAgcG9pbnQ6IG5vb3AkOCwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICBsZW5ndGhTdHJlYW0kMy5wb2ludCA9IGxlbmd0aFBvaW50Rmlyc3QkMzsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKGxlbmd0aFJpbmckMSkgbGVuZ3RoUG9pbnQkMyh4MDAkNSwgeTAwJDUpOwogICAgICAgIGxlbmd0aFN0cmVhbSQzLnBvaW50ID0gbm9vcCQ4OwogICAgICB9LAogICAgICBwb2x5Z29uU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGxlbmd0aFJpbmckMSA9IHRydWU7CiAgICAgIH0sCiAgICAgIHBvbHlnb25FbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGxlbmd0aFJpbmckMSA9IG51bGw7CiAgICAgIH0sCiAgICAgIHJlc3VsdDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxlbmd0aCA9ICtsZW5ndGhTdW0kMzsKICAgICAgICBsZW5ndGhTdW0kMy5yZXNldCgpOwogICAgICAgIHJldHVybiBsZW5ndGg7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gbGVuZ3RoUG9pbnRGaXJzdCQzKHgsIHkpIHsKICAgICAgbGVuZ3RoU3RyZWFtJDMucG9pbnQgPSBsZW5ndGhQb2ludCQzOwogICAgICB4MDAkNSA9IHgwJDkgPSB4LCB5MDAkNSA9IHkwJDkgPSB5OwogICAgfQoKICAgIGZ1bmN0aW9uIGxlbmd0aFBvaW50JDMoeCwgeSkgewogICAgICB4MCQ5IC09IHgsIHkwJDkgLT0geTsKICAgICAgbGVuZ3RoU3VtJDMuYWRkKHNxcnQkMyh4MCQ5ICogeDAkOSArIHkwJDkgKiB5MCQ5KSk7CiAgICAgIHgwJDkgPSB4LCB5MCQ5ID0geTsKICAgIH0KCiAgICBmdW5jdGlvbiBQYXRoU3RyaW5nJDEoKSB7CiAgICAgIHRoaXMuX3N0cmluZyA9IFtdOwogICAgfQoKICAgIFBhdGhTdHJpbmckMS5wcm90b3R5cGUgPSB7CiAgICAgIF9yYWRpdXM6IDQuNSwKICAgICAgX2NpcmNsZTogY2lyY2xlJDQoNC41KSwKICAgICAgcG9pbnRSYWRpdXM6IGZ1bmN0aW9uKF8pIHsKICAgICAgICBpZiAoKF8gPSArXykgIT09IHRoaXMuX3JhZGl1cykgdGhpcy5fcmFkaXVzID0gXywgdGhpcy5fY2lyY2xlID0gbnVsbDsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lID09PSAwKSB0aGlzLl9zdHJpbmcucHVzaCgiWiIpOwogICAgICAgIHRoaXMuX3BvaW50ID0gTmFOOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogewogICAgICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSk7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgdGhpcy5fc3RyaW5nLnB1c2goIkwiLCB4LCAiLCIsIHkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGRlZmF1bHQ6IHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NpcmNsZSA9PSBudWxsKSB0aGlzLl9jaXJjbGUgPSBjaXJjbGUkNCh0aGlzLl9yYWRpdXMpOwogICAgICAgICAgICB0aGlzLl9zdHJpbmcucHVzaCgiTSIsIHgsICIsIiwgeSwgdGhpcy5fY2lyY2xlKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICByZXN1bHQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9zdHJpbmcubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fc3RyaW5nLmpvaW4oIiIpOwogICAgICAgICAgdGhpcy5fc3RyaW5nID0gW107CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY2lyY2xlJDQocmFkaXVzKSB7CiAgICAgIHJldHVybiAibTAsIiArIHJhZGl1cwogICAgICAgICAgKyAiYSIgKyByYWRpdXMgKyAiLCIgKyByYWRpdXMgKyAiIDAgMSwxIDAsIiArIC0yICogcmFkaXVzCiAgICAgICAgICArICJhIiArIHJhZGl1cyArICIsIiArIHJhZGl1cyArICIgMCAxLDEgMCwiICsgMiAqIHJhZGl1cwogICAgICAgICAgKyAieiI7CiAgICB9CgogICAgZnVuY3Rpb24gaW5kZXgkNShwcm9qZWN0aW9uLCBjb250ZXh0KSB7CiAgICAgIHZhciBwb2ludFJhZGl1cyA9IDQuNSwKICAgICAgICAgIHByb2plY3Rpb25TdHJlYW0sCiAgICAgICAgICBjb250ZXh0U3RyZWFtOwoKICAgICAgZnVuY3Rpb24gcGF0aChvYmplY3QpIHsKICAgICAgICBpZiAob2JqZWN0KSB7CiAgICAgICAgICBpZiAodHlwZW9mIHBvaW50UmFkaXVzID09PSAiZnVuY3Rpb24iKSBjb250ZXh0U3RyZWFtLnBvaW50UmFkaXVzKCtwb2ludFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICAgIGdlb1N0cmVhbSQxKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShjb250ZXh0U3RyZWFtKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBjb250ZXh0U3RyZWFtLnJlc3VsdCgpOwogICAgICB9CgogICAgICBwYXRoLmFyZWEgPSBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICBnZW9TdHJlYW0kMShvYmplY3QsIHByb2plY3Rpb25TdHJlYW0oYXJlYVN0cmVhbSQzKSk7CiAgICAgICAgcmV0dXJuIGFyZWFTdHJlYW0kMy5yZXN1bHQoKTsKICAgICAgfTsKCiAgICAgIHBhdGgubWVhc3VyZSA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIGdlb1N0cmVhbSQxKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShsZW5ndGhTdHJlYW0kMykpOwogICAgICAgIHJldHVybiBsZW5ndGhTdHJlYW0kMy5yZXN1bHQoKTsKICAgICAgfTsKCiAgICAgIHBhdGguYm91bmRzID0gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgZ2VvU3RyZWFtJDEob2JqZWN0LCBwcm9qZWN0aW9uU3RyZWFtKGJvdW5kc1N0cmVhbSQzKSk7CiAgICAgICAgcmV0dXJuIGJvdW5kc1N0cmVhbSQzLnJlc3VsdCgpOwogICAgICB9OwoKICAgICAgcGF0aC5jZW50cm9pZCA9IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIGdlb1N0cmVhbSQxKG9iamVjdCwgcHJvamVjdGlvblN0cmVhbShjZW50cm9pZFN0cmVhbSQzKSk7CiAgICAgICAgcmV0dXJuIGNlbnRyb2lkU3RyZWFtJDMucmVzdWx0KCk7CiAgICAgIH07CgogICAgICBwYXRoLnByb2plY3Rpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJvamVjdGlvblN0cmVhbSA9IF8gPT0gbnVsbCA/IChwcm9qZWN0aW9uID0gbnVsbCwgaWRlbnRpdHkkZSkgOiAocHJvamVjdGlvbiA9IF8pLnN0cmVhbSwgcGF0aCkgOiBwcm9qZWN0aW9uOwogICAgICB9OwoKICAgICAgcGF0aC5jb250ZXh0ID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGNvbnRleHQ7CiAgICAgICAgY29udGV4dFN0cmVhbSA9IF8gPT0gbnVsbCA/IChjb250ZXh0ID0gbnVsbCwgbmV3IFBhdGhTdHJpbmckMSkgOiBuZXcgUGF0aENvbnRleHQkMShjb250ZXh0ID0gXyk7CiAgICAgICAgaWYgKHR5cGVvZiBwb2ludFJhZGl1cyAhPT0gImZ1bmN0aW9uIikgY29udGV4dFN0cmVhbS5wb2ludFJhZGl1cyhwb2ludFJhZGl1cyk7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH07CgogICAgICBwYXRoLnBvaW50UmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHBvaW50UmFkaXVzOwogICAgICAgIHBvaW50UmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogKGNvbnRleHRTdHJlYW0ucG9pbnRSYWRpdXMoK18pLCArXyk7CiAgICAgICAgcmV0dXJuIHBhdGg7CiAgICAgIH07CgogICAgICByZXR1cm4gcGF0aC5wcm9qZWN0aW9uKHByb2plY3Rpb24pLmNvbnRleHQoY29udGV4dCk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtJDIobWV0aG9kcykgewogICAgICByZXR1cm4gewogICAgICAgIHN0cmVhbTogdHJhbnNmb3JtZXIkNChtZXRob2RzKQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybWVyJDQobWV0aG9kcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oc3RyZWFtKSB7CiAgICAgICAgdmFyIHMgPSBuZXcgVHJhbnNmb3JtU3RyZWFtJDE7CiAgICAgICAgZm9yICh2YXIga2V5IGluIG1ldGhvZHMpIHNba2V5XSA9IG1ldGhvZHNba2V5XTsKICAgICAgICBzLnN0cmVhbSA9IHN0cmVhbTsKICAgICAgICByZXR1cm4gczsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBUcmFuc2Zvcm1TdHJlYW0kMSgpIHt9CgogICAgVHJhbnNmb3JtU3RyZWFtJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtU3RyZWFtJDEsCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuc3RyZWFtLnBvaW50KHgsIHkpOyB9LAogICAgICBzcGhlcmU6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5zcGhlcmUoKTsgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ubGluZVN0YXJ0KCk7IH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgeyB0aGlzLnN0cmVhbS5saW5lRW5kKCk7IH0sCiAgICAgIHBvbHlnb25TdGFydDogZnVuY3Rpb24oKSB7IHRoaXMuc3RyZWFtLnBvbHlnb25TdGFydCgpOyB9LAogICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsgdGhpcy5zdHJlYW0ucG9seWdvbkVuZCgpOyB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGZpdCQxKHByb2plY3Rpb24sIGZpdEJvdW5kcywgb2JqZWN0KSB7CiAgICAgIHZhciBjbGlwID0gcHJvamVjdGlvbi5jbGlwRXh0ZW50ICYmIHByb2plY3Rpb24uY2xpcEV4dGVudCgpOwogICAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCkudHJhbnNsYXRlKFswLCAwXSk7CiAgICAgIGlmIChjbGlwICE9IG51bGwpIHByb2plY3Rpb24uY2xpcEV4dGVudChudWxsKTsKICAgICAgZ2VvU3RyZWFtJDEob2JqZWN0LCBwcm9qZWN0aW9uLnN0cmVhbShib3VuZHNTdHJlYW0kMykpOwogICAgICBmaXRCb3VuZHMoYm91bmRzU3RyZWFtJDMucmVzdWx0KCkpOwogICAgICBpZiAoY2xpcCAhPSBudWxsKSBwcm9qZWN0aW9uLmNsaXBFeHRlbnQoY2xpcCk7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpdEV4dGVudCQxKHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KSB7CiAgICAgIHJldHVybiBmaXQkMShwcm9qZWN0aW9uLCBmdW5jdGlvbihiKSB7CiAgICAgICAgdmFyIHcgPSBleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sCiAgICAgICAgICAgIGggPSBleHRlbnRbMV1bMV0gLSBleHRlbnRbMF1bMV0sCiAgICAgICAgICAgIGsgPSBNYXRoLm1pbih3IC8gKGJbMV1bMF0gLSBiWzBdWzBdKSwgaCAvIChiWzFdWzFdIC0gYlswXVsxXSkpLAogICAgICAgICAgICB4ID0gK2V4dGVudFswXVswXSArICh3IC0gayAqIChiWzFdWzBdICsgYlswXVswXSkpIC8gMiwKICAgICAgICAgICAgeSA9ICtleHRlbnRbMF1bMV0gKyAoaCAtIGsgKiAoYlsxXVsxXSArIGJbMF1bMV0pKSAvIDI7CiAgICAgICAgcHJvamVjdGlvbi5zY2FsZSgxNTAgKiBrKS50cmFuc2xhdGUoW3gsIHldKTsKICAgICAgfSwgb2JqZWN0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXRTaXplJDEocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KSB7CiAgICAgIHJldHVybiBmaXRFeHRlbnQkMShwcm9qZWN0aW9uLCBbWzAsIDBdLCBzaXplXSwgb2JqZWN0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXRXaWR0aCQxKHByb2plY3Rpb24sIHdpZHRoLCBvYmplY3QpIHsKICAgICAgcmV0dXJuIGZpdCQxKHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHsKICAgICAgICB2YXIgdyA9ICt3aWR0aCwKICAgICAgICAgICAgayA9IHcgLyAoYlsxXVswXSAtIGJbMF1bMF0pLAogICAgICAgICAgICB4ID0gKHcgLSBrICogKGJbMV1bMF0gKyBiWzBdWzBdKSkgLyAyLAogICAgICAgICAgICB5ID0gLWsgKiBiWzBdWzFdOwogICAgICAgIHByb2plY3Rpb24uc2NhbGUoMTUwICogaykudHJhbnNsYXRlKFt4LCB5XSk7CiAgICAgIH0sIG9iamVjdCk7CiAgICB9CgogICAgZnVuY3Rpb24gZml0SGVpZ2h0JDEocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpIHsKICAgICAgcmV0dXJuIGZpdCQxKHByb2plY3Rpb24sIGZ1bmN0aW9uKGIpIHsKICAgICAgICB2YXIgaCA9ICtoZWlnaHQsCiAgICAgICAgICAgIGsgPSBoIC8gKGJbMV1bMV0gLSBiWzBdWzFdKSwKICAgICAgICAgICAgeCA9IC1rICogYlswXVswXSwKICAgICAgICAgICAgeSA9IChoIC0gayAqIChiWzFdWzFdICsgYlswXVsxXSkpIC8gMjsKICAgICAgICBwcm9qZWN0aW9uLnNjYWxlKDE1MCAqIGspLnRyYW5zbGF0ZShbeCwgeV0pOwogICAgICB9LCBvYmplY3QpOwogICAgfQoKICAgIHZhciBtYXhEZXB0aCQxID0gMTYsIC8vIG1heGltdW0gZGVwdGggb2Ygc3ViZGl2aXNpb24KICAgICAgICBjb3NNaW5EaXN0YW5jZSQxID0gY29zJDQoMzAgKiByYWRpYW5zJDEpOyAvLyBjb3MobWluaW11bSBhbmd1bGFyIGRpc3RhbmNlKQoKICAgIGZ1bmN0aW9uIHJlc2FtcGxlJDIocHJvamVjdCwgZGVsdGEyKSB7CiAgICAgIHJldHVybiArZGVsdGEyID8gcmVzYW1wbGUkMyhwcm9qZWN0LCBkZWx0YTIpIDogcmVzYW1wbGVOb25lJDEocHJvamVjdCk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVzYW1wbGVOb25lJDEocHJvamVjdCkgewogICAgICByZXR1cm4gdHJhbnNmb3JtZXIkNCh7CiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICAgIHggPSBwcm9qZWN0KHgsIHkpOwogICAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXNhbXBsZSQzKHByb2plY3QsIGRlbHRhMikgewoKICAgICAgZnVuY3Rpb24gcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MSwgeTEsIGxhbWJkYTEsIGExLCBiMSwgYzEsIGRlcHRoLCBzdHJlYW0pIHsKICAgICAgICB2YXIgZHggPSB4MSAtIHgwLAogICAgICAgICAgICBkeSA9IHkxIC0geTAsCiAgICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7CiAgICAgICAgaWYgKGQyID4gNCAqIGRlbHRhMiAmJiBkZXB0aC0tKSB7CiAgICAgICAgICB2YXIgYSA9IGEwICsgYTEsCiAgICAgICAgICAgICAgYiA9IGIwICsgYjEsCiAgICAgICAgICAgICAgYyA9IGMwICsgYzEsCiAgICAgICAgICAgICAgbSA9IHNxcnQkMyhhICogYSArIGIgKiBiICsgYyAqIGMpLAogICAgICAgICAgICAgIHBoaTIgPSBhc2luJDIoYyAvPSBtKSwKICAgICAgICAgICAgICBsYW1iZGEyID0gYWJzJDIoYWJzJDIoYykgLSAxKSA8IGVwc2lsb24kNyB8fCBhYnMkMihsYW1iZGEwIC0gbGFtYmRhMSkgPCBlcHNpbG9uJDcgPyAobGFtYmRhMCArIGxhbWJkYTEpIC8gMiA6IGF0YW4yJDIoYiwgYSksCiAgICAgICAgICAgICAgcCA9IHByb2plY3QobGFtYmRhMiwgcGhpMiksCiAgICAgICAgICAgICAgeDIgPSBwWzBdLAogICAgICAgICAgICAgIHkyID0gcFsxXSwKICAgICAgICAgICAgICBkeDIgPSB4MiAtIHgwLAogICAgICAgICAgICAgIGR5MiA9IHkyIC0geTAsCiAgICAgICAgICAgICAgZHogPSBkeSAqIGR4MiAtIGR4ICogZHkyOwogICAgICAgICAgaWYgKGR6ICogZHogLyBkMiA+IGRlbHRhMiAvLyBwZXJwZW5kaWN1bGFyIHByb2plY3RlZCBkaXN0YW5jZQogICAgICAgICAgICAgIHx8IGFicyQyKChkeCAqIGR4MiArIGR5ICogZHkyKSAvIGQyIC0gMC41KSA+IDAuMyAvLyBtaWRwb2ludCBjbG9zZSB0byBhbiBlbmQKICAgICAgICAgICAgICB8fCBhMCAqIGExICsgYjAgKiBiMSArIGMwICogYzEgPCBjb3NNaW5EaXN0YW5jZSQxKSB7IC8vIGFuZ3VsYXIgZGlzdGFuY2UKICAgICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MiwgeTIsIGxhbWJkYTIsIGEgLz0gbSwgYiAvPSBtLCBjLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICAgICAgc3RyZWFtLnBvaW50KHgyLCB5Mik7CiAgICAgICAgICAgIHJlc2FtcGxlTGluZVRvKHgyLCB5MiwgbGFtYmRhMiwgYSwgYiwgYywgeDEsIHkxLCBsYW1iZGExLCBhMSwgYjEsIGMxLCBkZXB0aCwgc3RyZWFtKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHZhciBsYW1iZGEwMCwgeDAwLCB5MDAsIGEwMCwgYjAwLCBjMDAsIC8vIGZpcnN0IHBvaW50CiAgICAgICAgICAgIGxhbWJkYTAsIHgwLCB5MCwgYTAsIGIwLCBjMDsgLy8gcHJldmlvdXMgcG9pbnQKCiAgICAgICAgdmFyIHJlc2FtcGxlU3RyZWFtID0gewogICAgICAgICAgcG9pbnQ6IHBvaW50LAogICAgICAgICAgbGluZVN0YXJ0OiBsaW5lU3RhcnQsCiAgICAgICAgICBsaW5lRW5kOiBsaW5lRW5kLAogICAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgc3RyZWFtLnBvbHlnb25TdGFydCgpOyByZXNhbXBsZVN0cmVhbS5saW5lU3RhcnQgPSByaW5nU3RhcnQ7IH0sCiAgICAgICAgICBwb2x5Z29uRW5kOiBmdW5jdGlvbigpIHsgc3RyZWFtLnBvbHlnb25FbmQoKTsgcmVzYW1wbGVTdHJlYW0ubGluZVN0YXJ0ID0gbGluZVN0YXJ0OyB9CiAgICAgICAgfTsKCiAgICAgICAgZnVuY3Rpb24gcG9pbnQoeCwgeSkgewogICAgICAgICAgeCA9IHByb2plY3QoeCwgeSk7CiAgICAgICAgICBzdHJlYW0ucG9pbnQoeFswXSwgeFsxXSk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lU3RhcnQoKSB7CiAgICAgICAgICB4MCA9IE5hTjsKICAgICAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gbGluZVBvaW50OwogICAgICAgICAgc3RyZWFtLmxpbmVTdGFydCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbGluZVBvaW50KGxhbWJkYSwgcGhpKSB7CiAgICAgICAgICB2YXIgYyA9IGNhcnRlc2lhbiQxKFtsYW1iZGEsIHBoaV0pLCBwID0gcHJvamVjdChsYW1iZGEsIHBoaSk7CiAgICAgICAgICByZXNhbXBsZUxpbmVUbyh4MCwgeTAsIGxhbWJkYTAsIGEwLCBiMCwgYzAsIHgwID0gcFswXSwgeTAgPSBwWzFdLCBsYW1iZGEwID0gbGFtYmRhLCBhMCA9IGNbMF0sIGIwID0gY1sxXSwgYzAgPSBjWzJdLCBtYXhEZXB0aCQxLCBzdHJlYW0pOwogICAgICAgICAgc3RyZWFtLnBvaW50KHgwLCB5MCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiBsaW5lRW5kKCkgewogICAgICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBwb2ludDsKICAgICAgICAgIHN0cmVhbS5saW5lRW5kKCk7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByaW5nU3RhcnQoKSB7CiAgICAgICAgICBsaW5lU3RhcnQoKTsKICAgICAgICAgIHJlc2FtcGxlU3RyZWFtLnBvaW50ID0gcmluZ1BvaW50OwogICAgICAgICAgcmVzYW1wbGVTdHJlYW0ubGluZUVuZCA9IHJpbmdFbmQ7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByaW5nUG9pbnQobGFtYmRhLCBwaGkpIHsKICAgICAgICAgIGxpbmVQb2ludChsYW1iZGEwMCA9IGxhbWJkYSwgcGhpKSwgeDAwID0geDAsIHkwMCA9IHkwLCBhMDAgPSBhMCwgYjAwID0gYjAsIGMwMCA9IGMwOwogICAgICAgICAgcmVzYW1wbGVTdHJlYW0ucG9pbnQgPSBsaW5lUG9pbnQ7CiAgICAgICAgfQoKICAgICAgICBmdW5jdGlvbiByaW5nRW5kKCkgewogICAgICAgICAgcmVzYW1wbGVMaW5lVG8oeDAsIHkwLCBsYW1iZGEwLCBhMCwgYjAsIGMwLCB4MDAsIHkwMCwgbGFtYmRhMDAsIGEwMCwgYjAwLCBjMDAsIG1heERlcHRoJDEsIHN0cmVhbSk7CiAgICAgICAgICByZXNhbXBsZVN0cmVhbS5saW5lRW5kID0gbGluZUVuZDsKICAgICAgICAgIGxpbmVFbmQoKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiByZXNhbXBsZVN0cmVhbTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgdHJhbnNmb3JtUmFkaWFucyQxID0gdHJhbnNmb3JtZXIkNCh7CiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQoeCAqIHJhZGlhbnMkMSwgeSAqIHJhZGlhbnMkMSk7CiAgICAgIH0KICAgIH0pOwoKICAgIGZ1bmN0aW9uIHRyYW5zZm9ybVJvdGF0ZSQxKHJvdGF0ZSkgewogICAgICByZXR1cm4gdHJhbnNmb3JtZXIkNCh7CiAgICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICAgIHZhciByID0gcm90YXRlKHgsIHkpOwogICAgICAgICAgcmV0dXJuIHRoaXMuc3RyZWFtLnBvaW50KHJbMF0sIHJbMV0pOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvamVjdGlvbiQxKHByb2plY3QpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb25NdXRhdG9yJDEoZnVuY3Rpb24oKSB7IHJldHVybiBwcm9qZWN0OyB9KSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByb2plY3Rpb25NdXRhdG9yJDEocHJvamVjdEF0KSB7CiAgICAgIHZhciBwcm9qZWN0LAogICAgICAgICAgayA9IDE1MCwgLy8gc2NhbGUKICAgICAgICAgIHggPSA0ODAsIHkgPSAyNTAsIC8vIHRyYW5zbGF0ZQogICAgICAgICAgZHgsIGR5LCBsYW1iZGEgPSAwLCBwaGkgPSAwLCAvLyBjZW50ZXIKICAgICAgICAgIGRlbHRhTGFtYmRhID0gMCwgZGVsdGFQaGkgPSAwLCBkZWx0YUdhbW1hID0gMCwgcm90YXRlLCBwcm9qZWN0Um90YXRlLCAvLyByb3RhdGUKICAgICAgICAgIHRoZXRhID0gbnVsbCwgcHJlY2xpcCA9IGNsaXBBbnRpbWVyaWRpYW4kMSwgLy8gY2xpcCBhbmdsZQogICAgICAgICAgeDAgPSBudWxsLCB5MCwgeDEsIHkxLCBwb3N0Y2xpcCA9IGlkZW50aXR5JGUsIC8vIGNsaXAgZXh0ZW50CiAgICAgICAgICBkZWx0YTIgPSAwLjUsIHByb2plY3RSZXNhbXBsZSA9IHJlc2FtcGxlJDIocHJvamVjdFRyYW5zZm9ybSwgZGVsdGEyKSwgLy8gcHJlY2lzaW9uCiAgICAgICAgICBjYWNoZSwKICAgICAgICAgIGNhY2hlU3RyZWFtOwoKICAgICAgZnVuY3Rpb24gcHJvamVjdGlvbihwb2ludCkgewogICAgICAgIHBvaW50ID0gcHJvamVjdFJvdGF0ZShwb2ludFswXSAqIHJhZGlhbnMkMSwgcG9pbnRbMV0gKiByYWRpYW5zJDEpOwogICAgICAgIHJldHVybiBbcG9pbnRbMF0gKiBrICsgZHgsIGR5IC0gcG9pbnRbMV0gKiBrXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaW52ZXJ0KHBvaW50KSB7CiAgICAgICAgcG9pbnQgPSBwcm9qZWN0Um90YXRlLmludmVydCgocG9pbnRbMF0gLSBkeCkgLyBrLCAoZHkgLSBwb2ludFsxXSkgLyBrKTsKICAgICAgICByZXR1cm4gcG9pbnQgJiYgW3BvaW50WzBdICogZGVncmVlcyQzLCBwb2ludFsxXSAqIGRlZ3JlZXMkM107CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHByb2plY3RUcmFuc2Zvcm0oeCwgeSkgewogICAgICAgIHJldHVybiB4ID0gcHJvamVjdCh4LCB5KSwgW3hbMF0gKiBrICsgZHgsIGR5IC0geFsxXSAqIGtdOwogICAgICB9CgogICAgICBwcm9qZWN0aW9uLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IHRyYW5zZm9ybVJhZGlhbnMkMSh0cmFuc2Zvcm1Sb3RhdGUkMShyb3RhdGUpKHByZWNsaXAocHJvamVjdFJlc2FtcGxlKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3RyZWFtKSkpKSk7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLnByZWNsaXAgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2xpcCA9IF8sIHRoZXRhID0gdW5kZWZpbmVkLCByZXNldCgpKSA6IHByZWNsaXA7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLnBvc3RjbGlwID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXywgeDAgPSB5MCA9IHgxID0geTEgPSBudWxsLCByZXNldCgpKSA6IHBvc3RjbGlwOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5jbGlwQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJlY2xpcCA9ICtfID8gY2xpcENpcmNsZSQxKHRoZXRhID0gXyAqIHJhZGlhbnMkMSkgOiAodGhldGEgPSBudWxsLCBjbGlwQW50aW1lcmlkaWFuJDEpLCByZXNldCgpKSA6IHRoZXRhICogZGVncmVlcyQzOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5jbGlwRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBvc3RjbGlwID0gXyA9PSBudWxsID8gKHgwID0geTAgPSB4MSA9IHkxID0gbnVsbCwgaWRlbnRpdHkkZSkgOiBjbGlwUmVjdGFuZ2xlJDEoeDAgPSArX1swXVswXSwgeTAgPSArX1swXVsxXSwgeDEgPSArX1sxXVswXSwgeTEgPSArX1sxXVsxXSksIHJlc2V0KCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoayA9ICtfLCByZWNlbnRlcigpKSA6IGs7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gK19bMF0sIHkgPSArX1sxXSwgcmVjZW50ZXIoKSkgOiBbeCwgeV07CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLmNlbnRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChsYW1iZGEgPSBfWzBdICUgMzYwICogcmFkaWFucyQxLCBwaGkgPSBfWzFdICUgMzYwICogcmFkaWFucyQxLCByZWNlbnRlcigpKSA6IFtsYW1iZGEgKiBkZWdyZWVzJDMsIHBoaSAqIGRlZ3JlZXMkM107CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWx0YUxhbWJkYSA9IF9bMF0gJSAzNjAgKiByYWRpYW5zJDEsIGRlbHRhUGhpID0gX1sxXSAlIDM2MCAqIHJhZGlhbnMkMSwgZGVsdGFHYW1tYSA9IF8ubGVuZ3RoID4gMiA/IF9bMl0gJSAzNjAgKiByYWRpYW5zJDEgOiAwLCByZWNlbnRlcigpKSA6IFtkZWx0YUxhbWJkYSAqIGRlZ3JlZXMkMywgZGVsdGFQaGkgKiBkZWdyZWVzJDMsIGRlbHRhR2FtbWEgKiBkZWdyZWVzJDNdOwogICAgICB9OwoKICAgICAgcHJvamVjdGlvbi5wcmVjaXNpb24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocHJvamVjdFJlc2FtcGxlID0gcmVzYW1wbGUkMihwcm9qZWN0VHJhbnNmb3JtLCBkZWx0YTIgPSBfICogXyksIHJlc2V0KCkpIDogc3FydCQzKGRlbHRhMik7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEV4dGVudCQxKHByb2plY3Rpb24sIGV4dGVudCwgb2JqZWN0KTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uZml0U2l6ZSA9IGZ1bmN0aW9uKHNpemUsIG9iamVjdCkgewogICAgICAgIHJldHVybiBmaXRTaXplJDEocHJvamVjdGlvbiwgc2l6ZSwgb2JqZWN0KTsKICAgICAgfTsKCiAgICAgIHByb2plY3Rpb24uZml0V2lkdGggPSBmdW5jdGlvbih3aWR0aCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdFdpZHRoJDEocHJvamVjdGlvbiwgd2lkdGgsIG9iamVjdCk7CiAgICAgIH07CgogICAgICBwcm9qZWN0aW9uLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEhlaWdodCQxKHByb2plY3Rpb24sIGhlaWdodCwgb2JqZWN0KTsKICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIHJlY2VudGVyKCkgewogICAgICAgIHByb2plY3RSb3RhdGUgPSBjb21wb3NlJDEocm90YXRlID0gcm90YXRlUmFkaWFucyQxKGRlbHRhTGFtYmRhLCBkZWx0YVBoaSwgZGVsdGFHYW1tYSksIHByb2plY3QpOwogICAgICAgIHZhciBjZW50ZXIgPSBwcm9qZWN0KGxhbWJkYSwgcGhpKTsKICAgICAgICBkeCA9IHggLSBjZW50ZXJbMF0gKiBrOwogICAgICAgIGR5ID0geSArIGNlbnRlclsxXSAqIGs7CiAgICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgICAgIHJldHVybiBwcm9qZWN0aW9uOwogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcHJvamVjdCA9IHByb2plY3RBdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHByb2plY3Rpb24uaW52ZXJ0ID0gcHJvamVjdC5pbnZlcnQgJiYgaW52ZXJ0OwogICAgICAgIHJldHVybiByZWNlbnRlcigpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljUHJvamVjdGlvbiQxKHByb2plY3RBdCkgewogICAgICB2YXIgcGhpMCA9IDAsCiAgICAgICAgICBwaGkxID0gcGkkOCAvIDMsCiAgICAgICAgICBtID0gcHJvamVjdGlvbk11dGF0b3IkMShwcm9qZWN0QXQpLAogICAgICAgICAgcCA9IG0ocGhpMCwgcGhpMSk7CgogICAgICBwLnBhcmFsbGVscyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IG0ocGhpMCA9IF9bMF0gKiByYWRpYW5zJDEsIHBoaTEgPSBfWzFdICogcmFkaWFucyQxKSA6IFtwaGkwICogZGVncmVlcyQzLCBwaGkxICogZGVncmVlcyQzXTsKICAgICAgfTsKCiAgICAgIHJldHVybiBwOwogICAgfQoKICAgIGZ1bmN0aW9uIGN5bGluZHJpY2FsRXF1YWxBcmVhUmF3JDEocGhpMCkgewogICAgICB2YXIgY29zUGhpMCA9IGNvcyQ0KHBoaTApOwoKICAgICAgZnVuY3Rpb24gZm9yd2FyZChsYW1iZGEsIHBoaSkgewogICAgICAgIHJldHVybiBbbGFtYmRhICogY29zUGhpMCwgc2luJDQocGhpKSAvIGNvc1BoaTBdOwogICAgICB9CgogICAgICBmb3J3YXJkLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICByZXR1cm4gW3ggLyBjb3NQaGkwLCBhc2luJDIoeSAqIGNvc1BoaTApXTsKICAgICAgfTsKCiAgICAgIHJldHVybiBmb3J3YXJkOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljRXF1YWxBcmVhUmF3JDEoeTAsIHkxKSB7CiAgICAgIHZhciBzeTAgPSBzaW4kNCh5MCksIG4gPSAoc3kwICsgc2luJDQoeTEpKSAvIDI7CgogICAgICAvLyBBcmUgdGhlIHBhcmFsbGVscyBzeW1tZXRyaWNhbCBhcm91bmQgdGhlIEVxdWF0b3I/CiAgICAgIGlmIChhYnMkMihuKSA8IGVwc2lsb24kNykgcmV0dXJuIGN5bGluZHJpY2FsRXF1YWxBcmVhUmF3JDEoeTApOwoKICAgICAgdmFyIGMgPSAxICsgc3kwICogKDIgKiBuIC0gc3kwKSwgcjAgPSBzcXJ0JDMoYykgLyBuOwoKICAgICAgZnVuY3Rpb24gcHJvamVjdCh4LCB5KSB7CiAgICAgICAgdmFyIHIgPSBzcXJ0JDMoYyAtIDIgKiBuICogc2luJDQoeSkpIC8gbjsKICAgICAgICByZXR1cm4gW3IgKiBzaW4kNCh4ICo9IG4pLCByMCAtIHIgKiBjb3MkNCh4KV07CiAgICAgIH0KCiAgICAgIHByb2plY3QuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciByMHkgPSByMCAtIHk7CiAgICAgICAgcmV0dXJuIFthdGFuMiQyKHgsIGFicyQyKHIweSkpIC8gbiAqIHNpZ24kMihyMHkpLCBhc2luJDIoKGMgLSAoeCAqIHggKyByMHkgKiByMHkpICogbiAqIG4pIC8gKDIgKiBuKSldOwogICAgICB9OwoKICAgICAgcmV0dXJuIHByb2plY3Q7CiAgICB9CgogICAgZnVuY3Rpb24gY29uaWNFcXVhbEFyZWEkMSgpIHsKICAgICAgcmV0dXJuIGNvbmljUHJvamVjdGlvbiQxKGNvbmljRXF1YWxBcmVhUmF3JDEpCiAgICAgICAgICAuc2NhbGUoMTU1LjQyNCkKICAgICAgICAgIC5jZW50ZXIoWzAsIDMzLjY0NDJdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhbGJlcnMkMSgpIHsKICAgICAgcmV0dXJuIGNvbmljRXF1YWxBcmVhJDEoKQogICAgICAgICAgLnBhcmFsbGVscyhbMjkuNSwgNDUuNV0pCiAgICAgICAgICAuc2NhbGUoMTA3MCkKICAgICAgICAgIC50cmFuc2xhdGUoWzQ4MCwgMjUwXSkKICAgICAgICAgIC5yb3RhdGUoWzk2LCAwXSkKICAgICAgICAgIC5jZW50ZXIoWy0wLjYsIDM4LjddKTsKICAgIH0KCiAgICAvLyBUaGUgcHJvamVjdGlvbnMgbXVzdCBoYXZlIG11dHVhbGx5IGV4Y2x1c2l2ZSBjbGlwIHJlZ2lvbnMgb24gdGhlIHNwaGVyZSwKICAgIC8vIGFzIHRoaXMgd2lsbCBhdm9pZCBlbWl0dGluZyBpbnRlcmxlYXZpbmcgbGluZXMgYW5kIHBvbHlnb25zLgogICAgZnVuY3Rpb24gbXVsdGlwbGV4JDEoc3RyZWFtcykgewogICAgICB2YXIgbiA9IHN0cmVhbXMubGVuZ3RoOwogICAgICByZXR1cm4gewogICAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvaW50KHgsIHkpOyB9LAogICAgICAgIHNwaGVyZTogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnNwaGVyZSgpOyB9LAogICAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLmxpbmVTdGFydCgpOyB9LAogICAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgeyB2YXIgaSA9IC0xOyB3aGlsZSAoKytpIDwgbikgc3RyZWFtc1tpXS5saW5lRW5kKCk7IH0sCiAgICAgICAgcG9seWdvblN0YXJ0OiBmdW5jdGlvbigpIHsgdmFyIGkgPSAtMTsgd2hpbGUgKCsraSA8IG4pIHN0cmVhbXNbaV0ucG9seWdvblN0YXJ0KCk7IH0sCiAgICAgICAgcG9seWdvbkVuZDogZnVuY3Rpb24oKSB7IHZhciBpID0gLTE7IHdoaWxlICgrK2kgPCBuKSBzdHJlYW1zW2ldLnBvbHlnb25FbmQoKTsgfQogICAgICB9OwogICAgfQoKICAgIC8vIEEgY29tcG9zaXRlIHByb2plY3Rpb24gZm9yIHRoZSBVbml0ZWQgU3RhdGVzLCBjb25maWd1cmVkIGJ5IGRlZmF1bHQgZm9yCiAgICAvLyA5NjDDlzUwMC4gVGhlIHByb2plY3Rpb24gYWxzbyB3b3JrcyBxdWl0ZSB3ZWxsIGF0IDk2MMOXNjAwIGlmIHlvdSBjaGFuZ2UgdGhlCiAgICAvLyBzY2FsZSB0byAxMjg1IGFuZCBhZGp1c3QgdGhlIHRyYW5zbGF0ZSBhY2NvcmRpbmdseS4gVGhlIHNldCBvZiBzdGFuZGFyZAogICAgLy8gcGFyYWxsZWxzIGZvciBlYWNoIHJlZ2lvbiBjb21lcyBmcm9tIFVTR1MsIHdoaWNoIGlzIHB1Ymxpc2hlZCBoZXJlOgogICAgLy8gaHR0cDovL2Vnc2MudXNncy5nb3YvaXNiL3B1YnMvTWFwUHJvamVjdGlvbnMvcHJvamVjdGlvbnMuaHRtbCNhbGJlcnMKICAgIGZ1bmN0aW9uIGFsYmVyc1VzYSQxKCkgewogICAgICB2YXIgY2FjaGUsCiAgICAgICAgICBjYWNoZVN0cmVhbSwKICAgICAgICAgIGxvd2VyNDggPSBhbGJlcnMkMSgpLCBsb3dlcjQ4UG9pbnQsCiAgICAgICAgICBhbGFza2EgPSBjb25pY0VxdWFsQXJlYSQxKCkucm90YXRlKFsxNTQsIDBdKS5jZW50ZXIoWy0yLCA1OC41XSkucGFyYWxsZWxzKFs1NSwgNjVdKSwgYWxhc2thUG9pbnQsIC8vIEVQU0c6MzMzOAogICAgICAgICAgaGF3YWlpID0gY29uaWNFcXVhbEFyZWEkMSgpLnJvdGF0ZShbMTU3LCAwXSkuY2VudGVyKFstMywgMTkuOV0pLnBhcmFsbGVscyhbOCwgMThdKSwgaGF3YWlpUG9pbnQsIC8vIEVTUkk6MTAyMDA3CiAgICAgICAgICBwb2ludCwgcG9pbnRTdHJlYW0gPSB7cG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsgcG9pbnQgPSBbeCwgeV07IH19OwoKICAgICAgZnVuY3Rpb24gYWxiZXJzVXNhKGNvb3JkaW5hdGVzKSB7CiAgICAgICAgdmFyIHggPSBjb29yZGluYXRlc1swXSwgeSA9IGNvb3JkaW5hdGVzWzFdOwogICAgICAgIHJldHVybiBwb2ludCA9IG51bGwsCiAgICAgICAgICAgIChsb3dlcjQ4UG9pbnQucG9pbnQoeCwgeSksIHBvaW50KQogICAgICAgICAgICB8fCAoYWxhc2thUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KQogICAgICAgICAgICB8fCAoaGF3YWlpUG9pbnQucG9pbnQoeCwgeSksIHBvaW50KTsKICAgICAgfQoKICAgICAgYWxiZXJzVXNhLmludmVydCA9IGZ1bmN0aW9uKGNvb3JkaW5hdGVzKSB7CiAgICAgICAgdmFyIGsgPSBsb3dlcjQ4LnNjYWxlKCksCiAgICAgICAgICAgIHQgPSBsb3dlcjQ4LnRyYW5zbGF0ZSgpLAogICAgICAgICAgICB4ID0gKGNvb3JkaW5hdGVzWzBdIC0gdFswXSkgLyBrLAogICAgICAgICAgICB5ID0gKGNvb3JkaW5hdGVzWzFdIC0gdFsxXSkgLyBrOwogICAgICAgIHJldHVybiAoeSA+PSAwLjEyMCAmJiB5IDwgMC4yMzQgJiYgeCA+PSAtMC40MjUgJiYgeCA8IC0wLjIxNCA/IGFsYXNrYQogICAgICAgICAgICA6IHkgPj0gMC4xNjYgJiYgeSA8IDAuMjM0ICYmIHggPj0gLTAuMjE0ICYmIHggPCAtMC4xMTUgPyBoYXdhaWkKICAgICAgICAgICAgOiBsb3dlcjQ4KS5pbnZlcnQoY29vcmRpbmF0ZXMpOwogICAgICB9OwoKICAgICAgYWxiZXJzVXNhLnN0cmVhbSA9IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgIHJldHVybiBjYWNoZSAmJiBjYWNoZVN0cmVhbSA9PT0gc3RyZWFtID8gY2FjaGUgOiBjYWNoZSA9IG11bHRpcGxleCQxKFtsb3dlcjQ4LnN0cmVhbShjYWNoZVN0cmVhbSA9IHN0cmVhbSksIGFsYXNrYS5zdHJlYW0oc3RyZWFtKSwgaGF3YWlpLnN0cmVhbShzdHJlYW0pXSk7CiAgICAgIH07CgogICAgICBhbGJlcnNVc2EucHJlY2lzaW9uID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGxvd2VyNDgucHJlY2lzaW9uKCk7CiAgICAgICAgbG93ZXI0OC5wcmVjaXNpb24oXyksIGFsYXNrYS5wcmVjaXNpb24oXyksIGhhd2FpaS5wcmVjaXNpb24oXyk7CiAgICAgICAgcmV0dXJuIHJlc2V0KCk7CiAgICAgIH07CgogICAgICBhbGJlcnNVc2Euc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC5zY2FsZSgpOwogICAgICAgIGxvd2VyNDguc2NhbGUoXyksIGFsYXNrYS5zY2FsZShfICogMC4zNSksIGhhd2FpaS5zY2FsZShfKTsKICAgICAgICByZXR1cm4gYWxiZXJzVXNhLnRyYW5zbGF0ZShsb3dlcjQ4LnRyYW5zbGF0ZSgpKTsKICAgICAgfTsKCiAgICAgIGFsYmVyc1VzYS50cmFuc2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbG93ZXI0OC50cmFuc2xhdGUoKTsKICAgICAgICB2YXIgayA9IGxvd2VyNDguc2NhbGUoKSwgeCA9ICtfWzBdLCB5ID0gK19bMV07CgogICAgICAgIGxvd2VyNDhQb2ludCA9IGxvd2VyNDgKICAgICAgICAgICAgLnRyYW5zbGF0ZShfKQogICAgICAgICAgICAuY2xpcEV4dGVudChbW3ggLSAwLjQ1NSAqIGssIHkgLSAwLjIzOCAqIGtdLCBbeCArIDAuNDU1ICogaywgeSArIDAuMjM4ICoga11dKQogICAgICAgICAgICAuc3RyZWFtKHBvaW50U3RyZWFtKTsKCiAgICAgICAgYWxhc2thUG9pbnQgPSBhbGFza2EKICAgICAgICAgICAgLnRyYW5zbGF0ZShbeCAtIDAuMzA3ICogaywgeSArIDAuMjAxICoga10pCiAgICAgICAgICAgIC5jbGlwRXh0ZW50KFtbeCAtIDAuNDI1ICogayArIGVwc2lsb24kNywgeSArIDAuMTIwICogayArIGVwc2lsb24kN10sIFt4IC0gMC4yMTQgKiBrIC0gZXBzaWxvbiQ3LCB5ICsgMC4yMzQgKiBrIC0gZXBzaWxvbiQ3XV0pCiAgICAgICAgICAgIC5zdHJlYW0ocG9pbnRTdHJlYW0pOwoKICAgICAgICBoYXdhaWlQb2ludCA9IGhhd2FpaQogICAgICAgICAgICAudHJhbnNsYXRlKFt4IC0gMC4yMDUgKiBrLCB5ICsgMC4yMTIgKiBrXSkKICAgICAgICAgICAgLmNsaXBFeHRlbnQoW1t4IC0gMC4yMTQgKiBrICsgZXBzaWxvbiQ3LCB5ICsgMC4xNjYgKiBrICsgZXBzaWxvbiQ3XSwgW3ggLSAwLjExNSAqIGsgLSBlcHNpbG9uJDcsIHkgKyAwLjIzNCAqIGsgLSBlcHNpbG9uJDddXSkKICAgICAgICAgICAgLnN0cmVhbShwb2ludFN0cmVhbSk7CgogICAgICAgIHJldHVybiByZXNldCgpOwogICAgICB9OwoKICAgICAgYWxiZXJzVXNhLmZpdEV4dGVudCA9IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEV4dGVudCQxKGFsYmVyc1VzYSwgZXh0ZW50LCBvYmplY3QpOwogICAgICB9OwoKICAgICAgYWxiZXJzVXNhLmZpdFNpemUgPSBmdW5jdGlvbihzaXplLCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0U2l6ZSQxKGFsYmVyc1VzYSwgc2l6ZSwgb2JqZWN0KTsKICAgICAgfTsKCiAgICAgIGFsYmVyc1VzYS5maXRXaWR0aCA9IGZ1bmN0aW9uKHdpZHRoLCBvYmplY3QpIHsKICAgICAgICByZXR1cm4gZml0V2lkdGgkMShhbGJlcnNVc2EsIHdpZHRoLCBvYmplY3QpOwogICAgICB9OwoKICAgICAgYWxiZXJzVXNhLmZpdEhlaWdodCA9IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGZpdEhlaWdodCQxKGFsYmVyc1VzYSwgaGVpZ2h0LCBvYmplY3QpOwogICAgICB9OwoKICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgY2FjaGUgPSBjYWNoZVN0cmVhbSA9IG51bGw7CiAgICAgICAgcmV0dXJuIGFsYmVyc1VzYTsKICAgICAgfQoKICAgICAgcmV0dXJuIGFsYmVyc1VzYS5zY2FsZSgxMDcwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhemltdXRoYWxSYXckMShzY2FsZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciBjeCA9IGNvcyQ0KHgpLAogICAgICAgICAgICBjeSA9IGNvcyQ0KHkpLAogICAgICAgICAgICBrID0gc2NhbGUoY3ggKiBjeSk7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgIGsgKiBjeSAqIHNpbiQ0KHgpLAogICAgICAgICAgayAqIHNpbiQ0KHkpCiAgICAgICAgXTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGF6aW11dGhhbEludmVydCQxKGFuZ2xlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdmFyIHogPSBzcXJ0JDMoeCAqIHggKyB5ICogeSksCiAgICAgICAgICAgIGMgPSBhbmdsZSh6KSwKICAgICAgICAgICAgc2MgPSBzaW4kNChjKSwKICAgICAgICAgICAgY2MgPSBjb3MkNChjKTsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgYXRhbjIkMih4ICogc2MsIHogKiBjYyksCiAgICAgICAgICBhc2luJDIoeiAmJiB5ICogc2MgLyB6KQogICAgICAgIF07CiAgICAgIH0KICAgIH0KCiAgICB2YXIgYXppbXV0aGFsRXF1YWxBcmVhUmF3JDEgPSBhemltdXRoYWxSYXckMShmdW5jdGlvbihjeGN5KSB7CiAgICAgIHJldHVybiBzcXJ0JDMoMiAvICgxICsgY3hjeSkpOwogICAgfSk7CgogICAgYXppbXV0aGFsRXF1YWxBcmVhUmF3JDEuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0JDEoZnVuY3Rpb24oeikgewogICAgICByZXR1cm4gMiAqIGFzaW4kMih6IC8gMik7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBhemltdXRoYWxFcXVhbEFyZWEkMSgpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24kMShhemltdXRoYWxFcXVhbEFyZWFSYXckMSkKICAgICAgICAgIC5zY2FsZSgxMjQuNzUpCiAgICAgICAgICAuY2xpcEFuZ2xlKDE4MCAtIDFlLTMpOwogICAgfQoKICAgIHZhciBhemltdXRoYWxFcXVpZGlzdGFudFJhdyQxID0gYXppbXV0aGFsUmF3JDEoZnVuY3Rpb24oYykgewogICAgICByZXR1cm4gKGMgPSBhY29zJDIoYykpICYmIGMgLyBzaW4kNChjKTsKICAgIH0pOwoKICAgIGF6aW11dGhhbEVxdWlkaXN0YW50UmF3JDEuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0JDEoZnVuY3Rpb24oeikgewogICAgICByZXR1cm4gejsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIGF6aW11dGhhbEVxdWlkaXN0YW50JDEoKSB7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uJDEoYXppbXV0aGFsRXF1aWRpc3RhbnRSYXckMSkKICAgICAgICAgIC5zY2FsZSg3OS40MTg4KQogICAgICAgICAgLmNsaXBBbmdsZSgxODAgLSAxZS0zKTsKICAgIH0KCiAgICBmdW5jdGlvbiBtZXJjYXRvclJhdyQxKGxhbWJkYSwgcGhpKSB7CiAgICAgIHJldHVybiBbbGFtYmRhLCBsb2ckMih0YW4kMSgoaGFsZlBpJDYgKyBwaGkpIC8gMikpXTsKICAgIH0KCiAgICBtZXJjYXRvclJhdyQxLmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgcmV0dXJuIFt4LCAyICogYXRhbiQxKGV4cCQxKHkpKSAtIGhhbGZQaSQ2XTsKICAgIH07CgogICAgZnVuY3Rpb24gbWVyY2F0b3IkMSgpIHsKICAgICAgcmV0dXJuIG1lcmNhdG9yUHJvamVjdGlvbiQxKG1lcmNhdG9yUmF3JDEpCiAgICAgICAgICAuc2NhbGUoOTYxIC8gdGF1JDgpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lcmNhdG9yUHJvamVjdGlvbiQxKHByb2plY3QpIHsKICAgICAgdmFyIG0gPSBwcm9qZWN0aW9uJDEocHJvamVjdCksCiAgICAgICAgICBjZW50ZXIgPSBtLmNlbnRlciwKICAgICAgICAgIHNjYWxlID0gbS5zY2FsZSwKICAgICAgICAgIHRyYW5zbGF0ZSA9IG0udHJhbnNsYXRlLAogICAgICAgICAgY2xpcEV4dGVudCA9IG0uY2xpcEV4dGVudCwKICAgICAgICAgIHgwID0gbnVsbCwgeTAsIHgxLCB5MTsgLy8gY2xpcCBleHRlbnQKCiAgICAgIG0uc2NhbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGUoXyksIHJlY2xpcCgpKSA6IHNjYWxlKCk7CiAgICAgIH07CgogICAgICBtLnRyYW5zbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0cmFuc2xhdGUoXyksIHJlY2xpcCgpKSA6IHRyYW5zbGF0ZSgpOwogICAgICB9OwoKICAgICAgbS5jZW50ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2VudGVyKF8pLCByZWNsaXAoKSkgOiBjZW50ZXIoKTsKICAgICAgfTsKCiAgICAgIG0uY2xpcEV4dGVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICgoXyA9PSBudWxsID8geDAgPSB5MCA9IHgxID0geTEgPSBudWxsIDogKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pKSwgcmVjbGlwKCkpIDogeDAgPT0gbnVsbCA/IG51bGwgOiBbW3gwLCB5MF0sIFt4MSwgeTFdXTsKICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIHJlY2xpcCgpIHsKICAgICAgICB2YXIgayA9IHBpJDggKiBzY2FsZSgpLAogICAgICAgICAgICB0ID0gbShyb3RhdGlvbiQxKG0ucm90YXRlKCkpLmludmVydChbMCwgMF0pKTsKICAgICAgICByZXR1cm4gY2xpcEV4dGVudCh4MCA9PSBudWxsCiAgICAgICAgICAgID8gW1t0WzBdIC0gaywgdFsxXSAtIGtdLCBbdFswXSArIGssIHRbMV0gKyBrXV0gOiBwcm9qZWN0ID09PSBtZXJjYXRvclJhdyQxCiAgICAgICAgICAgID8gW1tNYXRoLm1heCh0WzBdIC0gaywgeDApLCB5MF0sIFtNYXRoLm1pbih0WzBdICsgaywgeDEpLCB5MV1dCiAgICAgICAgICAgIDogW1t4MCwgTWF0aC5tYXgodFsxXSAtIGssIHkwKV0sIFt4MSwgTWF0aC5taW4odFsxXSArIGssIHkxKV1dKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlY2xpcCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRhbnkkMSh5KSB7CiAgICAgIHJldHVybiB0YW4kMSgoaGFsZlBpJDYgKyB5KSAvIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljQ29uZm9ybWFsUmF3JDEoeTAsIHkxKSB7CiAgICAgIHZhciBjeTAgPSBjb3MkNCh5MCksCiAgICAgICAgICBuID0geTAgPT09IHkxID8gc2luJDQoeTApIDogbG9nJDIoY3kwIC8gY29zJDQoeTEpKSAvIGxvZyQyKHRhbnkkMSh5MSkgLyB0YW55JDEoeTApKSwKICAgICAgICAgIGYgPSBjeTAgKiBwb3ckMih0YW55JDEoeTApLCBuKSAvIG47CgogICAgICBpZiAoIW4pIHJldHVybiBtZXJjYXRvclJhdyQxOwoKICAgICAgZnVuY3Rpb24gcHJvamVjdCh4LCB5KSB7CiAgICAgICAgaWYgKGYgPiAwKSB7IGlmICh5IDwgLWhhbGZQaSQ2ICsgZXBzaWxvbiQ3KSB5ID0gLWhhbGZQaSQ2ICsgZXBzaWxvbiQ3OyB9CiAgICAgICAgZWxzZSB7IGlmICh5ID4gaGFsZlBpJDYgLSBlcHNpbG9uJDcpIHkgPSBoYWxmUGkkNiAtIGVwc2lsb24kNzsgfQogICAgICAgIHZhciByID0gZiAvIHBvdyQyKHRhbnkkMSh5KSwgbik7CiAgICAgICAgcmV0dXJuIFtyICogc2luJDQobiAqIHgpLCBmIC0gciAqIGNvcyQ0KG4gKiB4KV07CiAgICAgIH0KCiAgICAgIHByb2plY3QuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHZhciBmeSA9IGYgLSB5LCByID0gc2lnbiQyKG4pICogc3FydCQzKHggKiB4ICsgZnkgKiBmeSk7CiAgICAgICAgcmV0dXJuIFthdGFuMiQyKHgsIGFicyQyKGZ5KSkgLyBuICogc2lnbiQyKGZ5KSwgMiAqIGF0YW4kMShwb3ckMihmIC8gciwgMSAvIG4pKSAtIGhhbGZQaSQ2XTsKICAgICAgfTsKCiAgICAgIHJldHVybiBwcm9qZWN0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbmljQ29uZm9ybWFsJDEoKSB7CiAgICAgIHJldHVybiBjb25pY1Byb2plY3Rpb24kMShjb25pY0NvbmZvcm1hbFJhdyQxKQogICAgICAgICAgLnNjYWxlKDEwOS41KQogICAgICAgICAgLnBhcmFsbGVscyhbMzAsIDMwXSk7CiAgICB9CgogICAgZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyUmF3JDEobGFtYmRhLCBwaGkpIHsKICAgICAgcmV0dXJuIFtsYW1iZGEsIHBoaV07CiAgICB9CgogICAgZXF1aXJlY3Rhbmd1bGFyUmF3JDEuaW52ZXJ0ID0gZXF1aXJlY3Rhbmd1bGFyUmF3JDE7CgogICAgZnVuY3Rpb24gZXF1aXJlY3Rhbmd1bGFyJDEoKSB7CiAgICAgIHJldHVybiBwcm9qZWN0aW9uJDEoZXF1aXJlY3Rhbmd1bGFyUmF3JDEpCiAgICAgICAgICAuc2NhbGUoMTUyLjYzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25pY0VxdWlkaXN0YW50UmF3JDEoeTAsIHkxKSB7CiAgICAgIHZhciBjeTAgPSBjb3MkNCh5MCksCiAgICAgICAgICBuID0geTAgPT09IHkxID8gc2luJDQoeTApIDogKGN5MCAtIGNvcyQ0KHkxKSkgLyAoeTEgLSB5MCksCiAgICAgICAgICBnID0gY3kwIC8gbiArIHkwOwoKICAgICAgaWYgKGFicyQyKG4pIDwgZXBzaWxvbiQ3KSByZXR1cm4gZXF1aXJlY3Rhbmd1bGFyUmF3JDE7CgogICAgICBmdW5jdGlvbiBwcm9qZWN0KHgsIHkpIHsKICAgICAgICB2YXIgZ3kgPSBnIC0geSwgbnggPSBuICogeDsKICAgICAgICByZXR1cm4gW2d5ICogc2luJDQobngpLCBnIC0gZ3kgKiBjb3MkNChueCldOwogICAgICB9CgogICAgICBwcm9qZWN0LmludmVydCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB2YXIgZ3kgPSBnIC0geTsKICAgICAgICByZXR1cm4gW2F0YW4yJDIoeCwgYWJzJDIoZ3kpKSAvIG4gKiBzaWduJDIoZ3kpLCBnIC0gc2lnbiQyKG4pICogc3FydCQzKHggKiB4ICsgZ3kgKiBneSldOwogICAgICB9OwoKICAgICAgcmV0dXJuIHByb2plY3Q7CiAgICB9CgogICAgZnVuY3Rpb24gY29uaWNFcXVpZGlzdGFudCQxKCkgewogICAgICByZXR1cm4gY29uaWNQcm9qZWN0aW9uJDEoY29uaWNFcXVpZGlzdGFudFJhdyQxKQogICAgICAgICAgLnNjYWxlKDEzMS4xNTQpCiAgICAgICAgICAuY2VudGVyKFswLCAxMy45Mzg5XSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ25vbW9uaWNSYXckMSh4LCB5KSB7CiAgICAgIHZhciBjeSA9IGNvcyQ0KHkpLCBrID0gY29zJDQoeCkgKiBjeTsKICAgICAgcmV0dXJuIFtjeSAqIHNpbiQ0KHgpIC8gaywgc2luJDQoeSkgLyBrXTsKICAgIH0KCiAgICBnbm9tb25pY1JhdyQxLmludmVydCA9IGF6aW11dGhhbEludmVydCQxKGF0YW4kMSk7CgogICAgZnVuY3Rpb24gZ25vbW9uaWMkMSgpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24kMShnbm9tb25pY1JhdyQxKQogICAgICAgICAgLnNjYWxlKDE0NC4wNDkpCiAgICAgICAgICAuY2xpcEFuZ2xlKDYwKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY2FsZVRyYW5zbGF0ZSQxKGt4LCBreSwgdHgsIHR5KSB7CiAgICAgIHJldHVybiBreCA9PT0gMSAmJiBreSA9PT0gMSAmJiB0eCA9PT0gMCAmJiB0eSA9PT0gMCA/IGlkZW50aXR5JGUgOiB0cmFuc2Zvcm1lciQ0KHsKICAgICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgICAgdGhpcy5zdHJlYW0ucG9pbnQoeCAqIGt4ICsgdHgsIHkgKiBreSArIHR5KTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JGYoKSB7CiAgICAgIHZhciBrID0gMSwgdHggPSAwLCB0eSA9IDAsIHN4ID0gMSwgc3kgPSAxLCB0cmFuc2Zvcm0gPSBpZGVudGl0eSRlLCAvLyBzY2FsZSwgdHJhbnNsYXRlIGFuZCByZWZsZWN0CiAgICAgICAgICB4MCA9IG51bGwsIHkwLCB4MSwgeTEsIC8vIGNsaXAgZXh0ZW50CiAgICAgICAgICBwb3N0Y2xpcCA9IGlkZW50aXR5JGUsCiAgICAgICAgICBjYWNoZSwKICAgICAgICAgIGNhY2hlU3RyZWFtLAogICAgICAgICAgcHJvamVjdGlvbjsKCiAgICAgIGZ1bmN0aW9uIHJlc2V0KCkgewogICAgICAgIGNhY2hlID0gY2FjaGVTdHJlYW0gPSBudWxsOwogICAgICAgIHJldHVybiBwcm9qZWN0aW9uOwogICAgICB9CgogICAgICByZXR1cm4gcHJvamVjdGlvbiA9IHsKICAgICAgICBzdHJlYW06IGZ1bmN0aW9uKHN0cmVhbSkgewogICAgICAgICAgcmV0dXJuIGNhY2hlICYmIGNhY2hlU3RyZWFtID09PSBzdHJlYW0gPyBjYWNoZSA6IGNhY2hlID0gdHJhbnNmb3JtKHBvc3RjbGlwKGNhY2hlU3RyZWFtID0gc3RyZWFtKSk7CiAgICAgICAgfSwKICAgICAgICBwb3N0Y2xpcDogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocG9zdGNsaXAgPSBfLCB4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIHJlc2V0KCkpIDogcG9zdGNsaXA7CiAgICAgICAgfSwKICAgICAgICBjbGlwRXh0ZW50OiBmdW5jdGlvbihfKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwb3N0Y2xpcCA9IF8gPT0gbnVsbCA/ICh4MCA9IHkwID0geDEgPSB5MSA9IG51bGwsIGlkZW50aXR5JGUpIDogY2xpcFJlY3RhbmdsZSQxKHgwID0gK19bMF1bMF0sIHkwID0gK19bMF1bMV0sIHgxID0gK19bMV1bMF0sIHkxID0gK19bMV1bMV0pLCByZXNldCgpKSA6IHgwID09IG51bGwgPyBudWxsIDogW1t4MCwgeTBdLCBbeDEsIHkxXV07CiAgICAgICAgfSwKICAgICAgICBzY2FsZTogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNmb3JtID0gc2NhbGVUcmFuc2xhdGUkMSgoayA9ICtfKSAqIHN4LCBrICogc3ksIHR4LCB0eSksIHJlc2V0KCkpIDogazsKICAgICAgICB9LAogICAgICAgIHRyYW5zbGF0ZTogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNmb3JtID0gc2NhbGVUcmFuc2xhdGUkMShrICogc3gsIGsgKiBzeSwgdHggPSArX1swXSwgdHkgPSArX1sxXSksIHJlc2V0KCkpIDogW3R4LCB0eV07CiAgICAgICAgfSwKICAgICAgICByZWZsZWN0WDogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNmb3JtID0gc2NhbGVUcmFuc2xhdGUkMShrICogKHN4ID0gXyA/IC0xIDogMSksIGsgKiBzeSwgdHgsIHR5KSwgcmVzZXQoKSkgOiBzeCA8IDA7CiAgICAgICAgfSwKICAgICAgICByZWZsZWN0WTogZnVuY3Rpb24oXykgewogICAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodHJhbnNmb3JtID0gc2NhbGVUcmFuc2xhdGUkMShrICogc3gsIGsgKiAoc3kgPSBfID8gLTEgOiAxKSwgdHgsIHR5KSwgcmVzZXQoKSkgOiBzeSA8IDA7CiAgICAgICAgfSwKICAgICAgICBmaXRFeHRlbnQ6IGZ1bmN0aW9uKGV4dGVudCwgb2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gZml0RXh0ZW50JDEocHJvamVjdGlvbiwgZXh0ZW50LCBvYmplY3QpOwogICAgICAgIH0sCiAgICAgICAgZml0U2l6ZTogZnVuY3Rpb24oc2l6ZSwgb2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gZml0U2l6ZSQxKHByb2plY3Rpb24sIHNpemUsIG9iamVjdCk7CiAgICAgICAgfSwKICAgICAgICBmaXRXaWR0aDogZnVuY3Rpb24od2lkdGgsIG9iamVjdCkgewogICAgICAgICAgcmV0dXJuIGZpdFdpZHRoJDEocHJvamVjdGlvbiwgd2lkdGgsIG9iamVjdCk7CiAgICAgICAgfSwKICAgICAgICBmaXRIZWlnaHQ6IGZ1bmN0aW9uKGhlaWdodCwgb2JqZWN0KSB7CiAgICAgICAgICByZXR1cm4gZml0SGVpZ2h0JDEocHJvamVjdGlvbiwgaGVpZ2h0LCBvYmplY3QpOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBuYXR1cmFsRWFydGgxUmF3JDEobGFtYmRhLCBwaGkpIHsKICAgICAgdmFyIHBoaTIgPSBwaGkgKiBwaGksIHBoaTQgPSBwaGkyICogcGhpMjsKICAgICAgcmV0dXJuIFsKICAgICAgICBsYW1iZGEgKiAoMC44NzA3IC0gMC4xMzE5NzkgKiBwaGkyICsgcGhpNCAqICgtMC4wMTM3OTEgKyBwaGk0ICogKDAuMDAzOTcxICogcGhpMiAtIDAuMDAxNTI5ICogcGhpNCkpKSwKICAgICAgICBwaGkgKiAoMS4wMDcyMjYgKyBwaGkyICogKDAuMDE1MDg1ICsgcGhpNCAqICgtMC4wNDQ0NzUgKyAwLjAyODg3NCAqIHBoaTIgLSAwLjAwNTkxNiAqIHBoaTQpKSkKICAgICAgXTsKICAgIH0KCiAgICBuYXR1cmFsRWFydGgxUmF3JDEuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICB2YXIgcGhpID0geSwgaSA9IDI1LCBkZWx0YTsKICAgICAgZG8gewogICAgICAgIHZhciBwaGkyID0gcGhpICogcGhpLCBwaGk0ID0gcGhpMiAqIHBoaTI7CiAgICAgICAgcGhpIC09IGRlbHRhID0gKHBoaSAqICgxLjAwNzIyNiArIHBoaTIgKiAoMC4wMTUwODUgKyBwaGk0ICogKC0wLjA0NDQ3NSArIDAuMDI4ODc0ICogcGhpMiAtIDAuMDA1OTE2ICogcGhpNCkpKSAtIHkpIC8KICAgICAgICAgICAgKDEuMDA3MjI2ICsgcGhpMiAqICgwLjAxNTA4NSAqIDMgKyBwaGk0ICogKC0wLjA0NDQ3NSAqIDcgKyAwLjAyODg3NCAqIDkgKiBwaGkyIC0gMC4wMDU5MTYgKiAxMSAqIHBoaTQpKSk7CiAgICAgIH0gd2hpbGUgKGFicyQyKGRlbHRhKSA+IGVwc2lsb24kNyAmJiAtLWkgPiAwKTsKICAgICAgcmV0dXJuIFsKICAgICAgICB4IC8gKDAuODcwNyArIChwaGkyID0gcGhpICogcGhpKSAqICgtMC4xMzE5NzkgKyBwaGkyICogKC0wLjAxMzc5MSArIHBoaTIgKiBwaGkyICogcGhpMiAqICgwLjAwMzk3MSAtIDAuMDAxNTI5ICogcGhpMikpKSksCiAgICAgICAgcGhpCiAgICAgIF07CiAgICB9OwoKICAgIGZ1bmN0aW9uIG5hdHVyYWxFYXJ0aDEkMSgpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24kMShuYXR1cmFsRWFydGgxUmF3JDEpCiAgICAgICAgICAuc2NhbGUoMTc1LjI5NSk7CiAgICB9CgogICAgZnVuY3Rpb24gb3J0aG9ncmFwaGljUmF3JDEoeCwgeSkgewogICAgICByZXR1cm4gW2NvcyQ0KHkpICogc2luJDQoeCksIHNpbiQ0KHkpXTsKICAgIH0KCiAgICBvcnRob2dyYXBoaWNSYXckMS5pbnZlcnQgPSBhemltdXRoYWxJbnZlcnQkMShhc2luJDIpOwoKICAgIGZ1bmN0aW9uIG9ydGhvZ3JhcGhpYyQxKCkgewogICAgICByZXR1cm4gcHJvamVjdGlvbiQxKG9ydGhvZ3JhcGhpY1JhdyQxKQogICAgICAgICAgLnNjYWxlKDI0OS41KQogICAgICAgICAgLmNsaXBBbmdsZSg5MCArIGVwc2lsb24kNyk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RlcmVvZ3JhcGhpY1JhdyQxKHgsIHkpIHsKICAgICAgdmFyIGN5ID0gY29zJDQoeSksIGsgPSAxICsgY29zJDQoeCkgKiBjeTsKICAgICAgcmV0dXJuIFtjeSAqIHNpbiQ0KHgpIC8gaywgc2luJDQoeSkgLyBrXTsKICAgIH0KCiAgICBzdGVyZW9ncmFwaGljUmF3JDEuaW52ZXJ0ID0gYXppbXV0aGFsSW52ZXJ0JDEoZnVuY3Rpb24oeikgewogICAgICByZXR1cm4gMiAqIGF0YW4kMSh6KTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHN0ZXJlb2dyYXBoaWMkMSgpIHsKICAgICAgcmV0dXJuIHByb2plY3Rpb24kMShzdGVyZW9ncmFwaGljUmF3JDEpCiAgICAgICAgICAuc2NhbGUoMjUwKQogICAgICAgICAgLmNsaXBBbmdsZSgxNDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zdmVyc2VNZXJjYXRvclJhdyQxKGxhbWJkYSwgcGhpKSB7CiAgICAgIHJldHVybiBbbG9nJDIodGFuJDEoKGhhbGZQaSQ2ICsgcGhpKSAvIDIpKSwgLWxhbWJkYV07CiAgICB9CgogICAgdHJhbnN2ZXJzZU1lcmNhdG9yUmF3JDEuaW52ZXJ0ID0gZnVuY3Rpb24oeCwgeSkgewogICAgICByZXR1cm4gWy15LCAyICogYXRhbiQxKGV4cCQxKHgpKSAtIGhhbGZQaSQ2XTsKICAgIH07CgogICAgZnVuY3Rpb24gdHJhbnN2ZXJzZU1lcmNhdG9yJDEoKSB7CiAgICAgIHZhciBtID0gbWVyY2F0b3JQcm9qZWN0aW9uJDEodHJhbnN2ZXJzZU1lcmNhdG9yUmF3JDEpLAogICAgICAgICAgY2VudGVyID0gbS5jZW50ZXIsCiAgICAgICAgICByb3RhdGUgPSBtLnJvdGF0ZTsKCiAgICAgIG0uY2VudGVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gY2VudGVyKFstX1sxXSwgX1swXV0pIDogKF8gPSBjZW50ZXIoKSwgW19bMV0sIC1fWzBdXSk7CiAgICAgIH07CgogICAgICBtLnJvdGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IHJvdGF0ZShbX1swXSwgX1sxXSwgXy5sZW5ndGggPiAyID8gX1syXSArIDkwIDogOTBdKSA6IChfID0gcm90YXRlKCksIFtfWzBdLCBfWzFdLCBfWzJdIC0gOTBdKTsKICAgICAgfTsKCiAgICAgIHJldHVybiByb3RhdGUoWzAsIDAsIDkwXSkKICAgICAgICAgIC5zY2FsZSgxNTkuMTU1KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbiQyKGEsIGIpIHsKICAgICAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lYW5YJDEoY2hpbGRyZW4pIHsKICAgICAgcmV0dXJuIGNoaWxkcmVuLnJlZHVjZShtZWFuWFJlZHVjZSQxLCAwKSAvIGNoaWxkcmVuLmxlbmd0aDsKICAgIH0KCiAgICBmdW5jdGlvbiBtZWFuWFJlZHVjZSQxKHgsIGMpIHsKICAgICAgcmV0dXJuIHggKyBjLng7CiAgICB9CgogICAgZnVuY3Rpb24gbWF4WSQxKGNoaWxkcmVuKSB7CiAgICAgIHJldHVybiAxICsgY2hpbGRyZW4ucmVkdWNlKG1heFlSZWR1Y2UkMSwgMCk7CiAgICB9CgogICAgZnVuY3Rpb24gbWF4WVJlZHVjZSQxKHksIGMpIHsKICAgICAgcmV0dXJuIE1hdGgubWF4KHksIGMueSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGVhZkxlZnQkMShub2RlKSB7CiAgICAgIHZhciBjaGlsZHJlbjsKICAgICAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuWzBdOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBsZWFmUmlnaHQkMShub2RlKSB7CiAgICAgIHZhciBjaGlsZHJlbjsKICAgICAgd2hpbGUgKGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbikgbm9kZSA9IGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdOwogICAgICByZXR1cm4gbm9kZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbHVzdGVyJDEoKSB7CiAgICAgIHZhciBzZXBhcmF0aW9uID0gZGVmYXVsdFNlcGFyYXRpb24kMiwKICAgICAgICAgIGR4ID0gMSwKICAgICAgICAgIGR5ID0gMSwKICAgICAgICAgIG5vZGVTaXplID0gZmFsc2U7CgogICAgICBmdW5jdGlvbiBjbHVzdGVyKHJvb3QpIHsKICAgICAgICB2YXIgcHJldmlvdXNOb2RlLAogICAgICAgICAgICB4ID0gMDsKCiAgICAgICAgLy8gRmlyc3Qgd2FsaywgY29tcHV0aW5nIHRoZSBpbml0aWFsIHggJiB5IHZhbHVlcy4KICAgICAgICByb290LmVhY2hBZnRlcihmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgICAgaWYgKGNoaWxkcmVuKSB7CiAgICAgICAgICAgIG5vZGUueCA9IG1lYW5YJDEoY2hpbGRyZW4pOwogICAgICAgICAgICBub2RlLnkgPSBtYXhZJDEoY2hpbGRyZW4pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS54ID0gcHJldmlvdXNOb2RlID8geCArPSBzZXBhcmF0aW9uKG5vZGUsIHByZXZpb3VzTm9kZSkgOiAwOwogICAgICAgICAgICBub2RlLnkgPSAwOwogICAgICAgICAgICBwcmV2aW91c05vZGUgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB2YXIgbGVmdCA9IGxlYWZMZWZ0JDEocm9vdCksCiAgICAgICAgICAgIHJpZ2h0ID0gbGVhZlJpZ2h0JDEocm9vdCksCiAgICAgICAgICAgIHgwID0gbGVmdC54IC0gc2VwYXJhdGlvbihsZWZ0LCByaWdodCkgLyAyLAogICAgICAgICAgICB4MSA9IHJpZ2h0LnggKyBzZXBhcmF0aW9uKHJpZ2h0LCBsZWZ0KSAvIDI7CgogICAgICAgIC8vIFNlY29uZCB3YWxrLCBub3JtYWxpemluZyB4ICYgeSB0byB0aGUgZGVzaXJlZCBzaXplLgogICAgICAgIHJldHVybiByb290LmVhY2hBZnRlcihub2RlU2l6ZSA/IGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgIG5vZGUueCA9IChub2RlLnggLSByb290LngpICogZHg7CiAgICAgICAgICBub2RlLnkgPSAocm9vdC55IC0gbm9kZS55KSAqIGR5OwogICAgICAgIH0gOiBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICBub2RlLnggPSAobm9kZS54IC0geDApIC8gKHgxIC0geDApICogZHg7CiAgICAgICAgICBub2RlLnkgPSAoMSAtIChyb290LnkgPyBub2RlLnkgLyByb290LnkgOiAxKSkgKiBkeTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgY2x1c3Rlci5zZXBhcmF0aW9uID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNlcGFyYXRpb24gPSB4LCBjbHVzdGVyKSA6IHNlcGFyYXRpb247CiAgICAgIH07CgogICAgICBjbHVzdGVyLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAobm9kZVNpemUgPSBmYWxzZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgY2x1c3RlcikgOiAobm9kZVNpemUgPyBudWxsIDogW2R4LCBkeV0pOwogICAgICB9OwoKICAgICAgY2x1c3Rlci5ub2RlU2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IHRydWUsIGR4ID0gK3hbMF0sIGR5ID0gK3hbMV0sIGNsdXN0ZXIpIDogKG5vZGVTaXplID8gW2R4LCBkeV0gOiBudWxsKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBjbHVzdGVyOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvdW50JDEobm9kZSkgewogICAgICB2YXIgc3VtID0gMCwKICAgICAgICAgIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbiwKICAgICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7CiAgICAgIGlmICghaSkgc3VtID0gMTsKICAgICAgZWxzZSB3aGlsZSAoLS1pID49IDApIHN1bSArPSBjaGlsZHJlbltpXS52YWx1ZTsKICAgICAgbm9kZS52YWx1ZSA9IHN1bTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2NvdW50JDEoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2hBZnRlcihjb3VudCQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2VhY2gkMShjYWxsYmFjaykgewogICAgICB2YXIgbm9kZSA9IHRoaXMsIGN1cnJlbnQsIG5leHQgPSBbbm9kZV0sIGNoaWxkcmVuLCBpLCBuOwogICAgICBkbyB7CiAgICAgICAgY3VycmVudCA9IG5leHQucmV2ZXJzZSgpLCBuZXh0ID0gW107CiAgICAgICAgd2hpbGUgKG5vZGUgPSBjdXJyZW50LnBvcCgpKSB7CiAgICAgICAgICBjYWxsYmFjayhub2RlKSwgY2hpbGRyZW4gPSBub2RlLmNoaWxkcmVuOwogICAgICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIG5leHQucHVzaChjaGlsZHJlbltpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9IHdoaWxlIChuZXh0Lmxlbmd0aCk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfZWFjaEJlZm9yZSQxKGNhbGxiYWNrKSB7CiAgICAgIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV0sIGNoaWxkcmVuLCBpOwogICAgICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICAgICAgY2FsbGJhY2sobm9kZSksIGNoaWxkcmVuID0gbm9kZS5jaGlsZHJlbjsKICAgICAgICBpZiAoY2hpbGRyZW4pIGZvciAoaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9lYWNoQWZ0ZXIkMShjYWxsYmFjaykgewogICAgICB2YXIgbm9kZSA9IHRoaXMsIG5vZGVzID0gW25vZGVdLCBuZXh0ID0gW10sIGNoaWxkcmVuLCBpLCBuOwogICAgICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICAgICAgbmV4dC5wdXNoKG5vZGUpLCBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW47CiAgICAgICAgaWYgKGNoaWxkcmVuKSBmb3IgKGkgPSAwLCBuID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2Rlcy5wdXNoKGNoaWxkcmVuW2ldKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgd2hpbGUgKG5vZGUgPSBuZXh0LnBvcCgpKSB7CiAgICAgICAgY2FsbGJhY2sobm9kZSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9zdW0kMSh2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy5lYWNoQWZ0ZXIoZnVuY3Rpb24obm9kZSkgewogICAgICAgIHZhciBzdW0gPSArdmFsdWUobm9kZS5kYXRhKSB8fCAwLAogICAgICAgICAgICBjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4sCiAgICAgICAgICAgIGkgPSBjaGlsZHJlbiAmJiBjaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSBzdW0gKz0gY2hpbGRyZW5baV0udmFsdWU7CiAgICAgICAgbm9kZS52YWx1ZSA9IHN1bTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9zb3J0JDEoY29tcGFyZSkgewogICAgICByZXR1cm4gdGhpcy5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICAgICAgbm9kZS5jaGlsZHJlbi5zb3J0KGNvbXBhcmUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9wYXRoJDEoZW5kKSB7CiAgICAgIHZhciBzdGFydCA9IHRoaXMsCiAgICAgICAgICBhbmNlc3RvciA9IGxlYXN0Q29tbW9uQW5jZXN0b3IkMShzdGFydCwgZW5kKSwKICAgICAgICAgIG5vZGVzID0gW3N0YXJ0XTsKICAgICAgd2hpbGUgKHN0YXJ0ICE9PSBhbmNlc3RvcikgewogICAgICAgIHN0YXJ0ID0gc3RhcnQucGFyZW50OwogICAgICAgIG5vZGVzLnB1c2goc3RhcnQpOwogICAgICB9CiAgICAgIHZhciBrID0gbm9kZXMubGVuZ3RoOwogICAgICB3aGlsZSAoZW5kICE9PSBhbmNlc3RvcikgewogICAgICAgIG5vZGVzLnNwbGljZShrLCAwLCBlbmQpOwogICAgICAgIGVuZCA9IGVuZC5wYXJlbnQ7CiAgICAgIH0KICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlYXN0Q29tbW9uQW5jZXN0b3IkMShhLCBiKSB7CiAgICAgIGlmIChhID09PSBiKSByZXR1cm4gYTsKICAgICAgdmFyIGFOb2RlcyA9IGEuYW5jZXN0b3JzKCksCiAgICAgICAgICBiTm9kZXMgPSBiLmFuY2VzdG9ycygpLAogICAgICAgICAgYyA9IG51bGw7CiAgICAgIGEgPSBhTm9kZXMucG9wKCk7CiAgICAgIGIgPSBiTm9kZXMucG9wKCk7CiAgICAgIHdoaWxlIChhID09PSBiKSB7CiAgICAgICAgYyA9IGE7CiAgICAgICAgYSA9IGFOb2Rlcy5wb3AoKTsKICAgICAgICBiID0gYk5vZGVzLnBvcCgpOwogICAgICB9CiAgICAgIHJldHVybiBjOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZGVfYW5jZXN0b3JzJDEoKSB7CiAgICAgIHZhciBub2RlID0gdGhpcywgbm9kZXMgPSBbbm9kZV07CiAgICAgIHdoaWxlIChub2RlID0gbm9kZS5wYXJlbnQpIHsKICAgICAgICBub2Rlcy5wdXNoKG5vZGUpOwogICAgICB9CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2Rlc2NlbmRhbnRzJDEoKSB7CiAgICAgIHZhciBub2RlcyA9IFtdOwogICAgICB0aGlzLmVhY2goZnVuY3Rpb24obm9kZSkgewogICAgICAgIG5vZGVzLnB1c2gobm9kZSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CgogICAgZnVuY3Rpb24gbm9kZV9sZWF2ZXMkMSgpIHsKICAgICAgdmFyIGxlYXZlcyA9IFtdOwogICAgICB0aGlzLmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgewogICAgICAgICAgbGVhdmVzLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIGxlYXZlczsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2xpbmtzJDEoKSB7CiAgICAgIHZhciByb290ID0gdGhpcywgbGlua3MgPSBbXTsKICAgICAgcm9vdC5lYWNoKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBpZiAobm9kZSAhPT0gcm9vdCkgeyAvLyBEb27igJl0IGluY2x1ZGUgdGhlIHJvb3TigJlzIHBhcmVudCwgaWYgYW55LgogICAgICAgICAgbGlua3MucHVzaCh7c291cmNlOiBub2RlLnBhcmVudCwgdGFyZ2V0OiBub2RlfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIGxpbmtzOwogICAgfQoKICAgIGZ1bmN0aW9uIGhpZXJhcmNoeSQxKGRhdGEsIGNoaWxkcmVuKSB7CiAgICAgIHZhciByb290ID0gbmV3IE5vZGUkMyhkYXRhKSwKICAgICAgICAgIHZhbHVlZCA9ICtkYXRhLnZhbHVlICYmIChyb290LnZhbHVlID0gZGF0YS52YWx1ZSksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZXMgPSBbcm9vdF0sCiAgICAgICAgICBjaGlsZCwKICAgICAgICAgIGNoaWxkcywKICAgICAgICAgIGksCiAgICAgICAgICBuOwoKICAgICAgaWYgKGNoaWxkcmVuID09IG51bGwpIGNoaWxkcmVuID0gZGVmYXVsdENoaWxkcmVuJDE7CgogICAgICB3aGlsZSAobm9kZSA9IG5vZGVzLnBvcCgpKSB7CiAgICAgICAgaWYgKHZhbHVlZCkgbm9kZS52YWx1ZSA9ICtub2RlLmRhdGEudmFsdWU7CiAgICAgICAgaWYgKChjaGlsZHMgPSBjaGlsZHJlbihub2RlLmRhdGEpKSAmJiAobiA9IGNoaWxkcy5sZW5ndGgpKSB7CiAgICAgICAgICBub2RlLmNoaWxkcmVuID0gbmV3IEFycmF5KG4pOwogICAgICAgICAgZm9yIChpID0gbiAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgIG5vZGVzLnB1c2goY2hpbGQgPSBub2RlLmNoaWxkcmVuW2ldID0gbmV3IE5vZGUkMyhjaGlsZHNbaV0pKTsKICAgICAgICAgICAgY2hpbGQucGFyZW50ID0gbm9kZTsKICAgICAgICAgICAgY2hpbGQuZGVwdGggPSBub2RlLmRlcHRoICsgMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiByb290LmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2RlX2NvcHkkMSgpIHsKICAgICAgcmV0dXJuIGhpZXJhcmNoeSQxKHRoaXMpLmVhY2hCZWZvcmUoY29weURhdGEkMSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdENoaWxkcmVuJDEoZCkgewogICAgICByZXR1cm4gZC5jaGlsZHJlbjsKICAgIH0KCiAgICBmdW5jdGlvbiBjb3B5RGF0YSQxKG5vZGUpIHsKICAgICAgbm9kZS5kYXRhID0gbm9kZS5kYXRhLmRhdGE7CiAgICB9CgogICAgZnVuY3Rpb24gY29tcHV0ZUhlaWdodCQxKG5vZGUpIHsKICAgICAgdmFyIGhlaWdodCA9IDA7CiAgICAgIGRvIG5vZGUuaGVpZ2h0ID0gaGVpZ2h0OwogICAgICB3aGlsZSAoKG5vZGUgPSBub2RlLnBhcmVudCkgJiYgKG5vZGUuaGVpZ2h0IDwgKytoZWlnaHQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBOb2RlJDMoZGF0YSkgewogICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICB0aGlzLmRlcHRoID0KICAgICAgdGhpcy5oZWlnaHQgPSAwOwogICAgICB0aGlzLnBhcmVudCA9IG51bGw7CiAgICB9CgogICAgTm9kZSQzLnByb3RvdHlwZSA9IGhpZXJhcmNoeSQxLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IE5vZGUkMywKICAgICAgY291bnQ6IG5vZGVfY291bnQkMSwKICAgICAgZWFjaDogbm9kZV9lYWNoJDEsCiAgICAgIGVhY2hBZnRlcjogbm9kZV9lYWNoQWZ0ZXIkMSwKICAgICAgZWFjaEJlZm9yZTogbm9kZV9lYWNoQmVmb3JlJDEsCiAgICAgIHN1bTogbm9kZV9zdW0kMSwKICAgICAgc29ydDogbm9kZV9zb3J0JDEsCiAgICAgIHBhdGg6IG5vZGVfcGF0aCQxLAogICAgICBhbmNlc3RvcnM6IG5vZGVfYW5jZXN0b3JzJDEsCiAgICAgIGRlc2NlbmRhbnRzOiBub2RlX2Rlc2NlbmRhbnRzJDEsCiAgICAgIGxlYXZlczogbm9kZV9sZWF2ZXMkMSwKICAgICAgbGlua3M6IG5vZGVfbGlua3MkMSwKICAgICAgY29weTogbm9kZV9jb3B5JDEKICAgIH07CgogICAgdmFyIHNsaWNlJGEgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7CgogICAgZnVuY3Rpb24gc2h1ZmZsZSQzKGFycmF5KSB7CiAgICAgIHZhciBtID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgdCwKICAgICAgICAgIGk7CgogICAgICB3aGlsZSAobSkgewogICAgICAgIGkgPSBNYXRoLnJhbmRvbSgpICogbS0tIHwgMDsKICAgICAgICB0ID0gYXJyYXlbbV07CiAgICAgICAgYXJyYXlbbV0gPSBhcnJheVtpXTsKICAgICAgICBhcnJheVtpXSA9IHQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBhcnJheTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmNsb3NlJDEoY2lyY2xlcykgewogICAgICB2YXIgaSA9IDAsIG4gPSAoY2lyY2xlcyA9IHNodWZmbGUkMyhzbGljZSRhLmNhbGwoY2lyY2xlcykpKS5sZW5ndGgsIEIgPSBbXSwgcCwgZTsKCiAgICAgIHdoaWxlIChpIDwgbikgewogICAgICAgIHAgPSBjaXJjbGVzW2ldOwogICAgICAgIGlmIChlICYmIGVuY2xvc2VzV2VhayQxKGUsIHApKSArK2k7CiAgICAgICAgZWxzZSBlID0gZW5jbG9zZUJhc2lzJDEoQiA9IGV4dGVuZEJhc2lzJDEoQiwgcCkpLCBpID0gMDsKICAgICAgfQoKICAgICAgcmV0dXJuIGU7CiAgICB9CgogICAgZnVuY3Rpb24gZXh0ZW5kQmFzaXMkMShCLCBwKSB7CiAgICAgIHZhciBpLCBqOwoKICAgICAgaWYgKGVuY2xvc2VzV2Vha0FsbCQxKHAsIEIpKSByZXR1cm4gW3BdOwoKICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4KICAgICAgZm9yIChpID0gMDsgaSA8IEIubGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoZW5jbG9zZXNOb3QkMShwLCBCW2ldKQogICAgICAgICAgICAmJiBlbmNsb3Nlc1dlYWtBbGwkMShlbmNsb3NlQmFzaXMyJDEoQltpXSwgcCksIEIpKSB7CiAgICAgICAgICByZXR1cm4gW0JbaV0sIHBdOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUgdGhlbiBCIG11c3QgaGF2ZSBhdCBsZWFzdCB0d28gZWxlbWVudHMuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBCLmxlbmd0aCAtIDE7ICsraSkgewogICAgICAgIGZvciAoaiA9IGkgKyAxOyBqIDwgQi5sZW5ndGg7ICsraikgewogICAgICAgICAgaWYgKGVuY2xvc2VzTm90JDEoZW5jbG9zZUJhc2lzMiQxKEJbaV0sIEJbal0pLCBwKQogICAgICAgICAgICAgICYmIGVuY2xvc2VzTm90JDEoZW5jbG9zZUJhc2lzMiQxKEJbaV0sIHApLCBCW2pdKQogICAgICAgICAgICAgICYmIGVuY2xvc2VzTm90JDEoZW5jbG9zZUJhc2lzMiQxKEJbal0sIHApLCBCW2ldKQogICAgICAgICAgICAgICYmIGVuY2xvc2VzV2Vha0FsbCQxKGVuY2xvc2VCYXNpczMkMShCW2ldLCBCW2pdLCBwKSwgQikpIHsKICAgICAgICAgICAgcmV0dXJuIFtCW2ldLCBCW2pdLCBwXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIElmIHdlIGdldCBoZXJlIHRoZW4gc29tZXRoaW5nIGlzIHZlcnkgd3JvbmcuCiAgICAgIHRocm93IG5ldyBFcnJvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmNsb3Nlc05vdCQxKGEsIGIpIHsKICAgICAgdmFyIGRyID0gYS5yIC0gYi5yLCBkeCA9IGIueCAtIGEueCwgZHkgPSBiLnkgLSBhLnk7CiAgICAgIHJldHVybiBkciA8IDAgfHwgZHIgKiBkciA8IGR4ICogZHggKyBkeSAqIGR5OwogICAgfQoKICAgIGZ1bmN0aW9uIGVuY2xvc2VzV2VhayQxKGEsIGIpIHsKICAgICAgdmFyIGRyID0gYS5yIC0gYi5yICsgMWUtNiwgZHggPSBiLnggLSBhLngsIGR5ID0gYi55IC0gYS55OwogICAgICByZXR1cm4gZHIgPiAwICYmIGRyICogZHIgPiBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbmNsb3Nlc1dlYWtBbGwkMShhLCBCKSB7CiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgQi5sZW5ndGg7ICsraSkgewogICAgICAgIGlmICghZW5jbG9zZXNXZWFrJDEoYSwgQltpXSkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gZW5jbG9zZUJhc2lzJDEoQikgewogICAgICBzd2l0Y2ggKEIubGVuZ3RoKSB7CiAgICAgICAgY2FzZSAxOiByZXR1cm4gZW5jbG9zZUJhc2lzMSQxKEJbMF0pOwogICAgICAgIGNhc2UgMjogcmV0dXJuIGVuY2xvc2VCYXNpczIkMShCWzBdLCBCWzFdKTsKICAgICAgICBjYXNlIDM6IHJldHVybiBlbmNsb3NlQmFzaXMzJDEoQlswXSwgQlsxXSwgQlsyXSk7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBlbmNsb3NlQmFzaXMxJDEoYSkgewogICAgICByZXR1cm4gewogICAgICAgIHg6IGEueCwKICAgICAgICB5OiBhLnksCiAgICAgICAgcjogYS5yCiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZW5jbG9zZUJhc2lzMiQxKGEsIGIpIHsKICAgICAgdmFyIHgxID0gYS54LCB5MSA9IGEueSwgcjEgPSBhLnIsCiAgICAgICAgICB4MiA9IGIueCwgeTIgPSBiLnksIHIyID0gYi5yLAogICAgICAgICAgeDIxID0geDIgLSB4MSwgeTIxID0geTIgLSB5MSwgcjIxID0gcjIgLSByMSwKICAgICAgICAgIGwgPSBNYXRoLnNxcnQoeDIxICogeDIxICsgeTIxICogeTIxKTsKICAgICAgcmV0dXJuIHsKICAgICAgICB4OiAoeDEgKyB4MiArIHgyMSAvIGwgKiByMjEpIC8gMiwKICAgICAgICB5OiAoeTEgKyB5MiArIHkyMSAvIGwgKiByMjEpIC8gMiwKICAgICAgICByOiAobCArIHIxICsgcjIpIC8gMgogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGVuY2xvc2VCYXNpczMkMShhLCBiLCBjKSB7CiAgICAgIHZhciB4MSA9IGEueCwgeTEgPSBhLnksIHIxID0gYS5yLAogICAgICAgICAgeDIgPSBiLngsIHkyID0gYi55LCByMiA9IGIuciwKICAgICAgICAgIHgzID0gYy54LCB5MyA9IGMueSwgcjMgPSBjLnIsCiAgICAgICAgICBhMiA9IHgxIC0geDIsCiAgICAgICAgICBhMyA9IHgxIC0geDMsCiAgICAgICAgICBiMiA9IHkxIC0geTIsCiAgICAgICAgICBiMyA9IHkxIC0geTMsCiAgICAgICAgICBjMiA9IHIyIC0gcjEsCiAgICAgICAgICBjMyA9IHIzIC0gcjEsCiAgICAgICAgICBkMSA9IHgxICogeDEgKyB5MSAqIHkxIC0gcjEgKiByMSwKICAgICAgICAgIGQyID0gZDEgLSB4MiAqIHgyIC0geTIgKiB5MiArIHIyICogcjIsCiAgICAgICAgICBkMyA9IGQxIC0geDMgKiB4MyAtIHkzICogeTMgKyByMyAqIHIzLAogICAgICAgICAgYWIgPSBhMyAqIGIyIC0gYTIgKiBiMywKICAgICAgICAgIHhhID0gKGIyICogZDMgLSBiMyAqIGQyKSAvIChhYiAqIDIpIC0geDEsCiAgICAgICAgICB4YiA9IChiMyAqIGMyIC0gYjIgKiBjMykgLyBhYiwKICAgICAgICAgIHlhID0gKGEzICogZDIgLSBhMiAqIGQzKSAvIChhYiAqIDIpIC0geTEsCiAgICAgICAgICB5YiA9IChhMiAqIGMzIC0gYTMgKiBjMikgLyBhYiwKICAgICAgICAgIEEgPSB4YiAqIHhiICsgeWIgKiB5YiAtIDEsCiAgICAgICAgICBCID0gMiAqIChyMSArIHhhICogeGIgKyB5YSAqIHliKSwKICAgICAgICAgIEMgPSB4YSAqIHhhICsgeWEgKiB5YSAtIHIxICogcjEsCiAgICAgICAgICByID0gLShBID8gKEIgKyBNYXRoLnNxcnQoQiAqIEIgLSA0ICogQSAqIEMpKSAvICgyICogQSkgOiBDIC8gQik7CiAgICAgIHJldHVybiB7CiAgICAgICAgeDogeDEgKyB4YSArIHhiICogciwKICAgICAgICB5OiB5MSArIHlhICsgeWIgKiByLAogICAgICAgIHI6IHIKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwbGFjZSQxKGEsIGIsIGMpIHsKICAgICAgdmFyIGF4ID0gYS54LAogICAgICAgICAgYXkgPSBhLnksCiAgICAgICAgICBkYSA9IGIuciArIGMuciwKICAgICAgICAgIGRiID0gYS5yICsgYy5yLAogICAgICAgICAgZHggPSBiLnggLSBheCwKICAgICAgICAgIGR5ID0gYi55IC0gYXksCiAgICAgICAgICBkYyA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICBpZiAoZGMpIHsKICAgICAgICB2YXIgeCA9IDAuNSArICgoZGIgKj0gZGIpIC0gKGRhICo9IGRhKSkgLyAoMiAqIGRjKSwKICAgICAgICAgICAgeSA9IE1hdGguc3FydChNYXRoLm1heCgwLCAyICogZGEgKiAoZGIgKyBkYykgLSAoZGIgLT0gZGMpICogZGIgLSBkYSAqIGRhKSkgLyAoMiAqIGRjKTsKICAgICAgICBjLnggPSBheCArIHggKiBkeCArIHkgKiBkeTsKICAgICAgICBjLnkgPSBheSArIHggKiBkeSAtIHkgKiBkeDsKICAgICAgfSBlbHNlIHsKICAgICAgICBjLnggPSBheCArIGRiOwogICAgICAgIGMueSA9IGF5OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJzZWN0cyQxKGEsIGIpIHsKICAgICAgdmFyIGR4ID0gYi54IC0gYS54LAogICAgICAgICAgZHkgPSBiLnkgLSBhLnksCiAgICAgICAgICBkciA9IGEuciArIGIucjsKICAgICAgcmV0dXJuIGRyICogZHIgLSAxZS02ID4gZHggKiBkeCArIGR5ICogZHk7CiAgICB9CgogICAgZnVuY3Rpb24gc2NvcmUkMShub2RlKSB7CiAgICAgIHZhciBhID0gbm9kZS5fLAogICAgICAgICAgYiA9IG5vZGUubmV4dC5fLAogICAgICAgICAgYWIgPSBhLnIgKyBiLnIsCiAgICAgICAgICBkeCA9IChhLnggKiBiLnIgKyBiLnggKiBhLnIpIC8gYWIsCiAgICAgICAgICBkeSA9IChhLnkgKiBiLnIgKyBiLnkgKiBhLnIpIC8gYWI7CiAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTsKICAgIH0KCiAgICBmdW5jdGlvbiBOb2RlJDQoY2lyY2xlKSB7CiAgICAgIHRoaXMuXyA9IGNpcmNsZTsKICAgICAgdGhpcy5uZXh0ID0gbnVsbDsKICAgICAgdGhpcy5wcmV2aW91cyA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcGFja0VuY2xvc2UkMShjaXJjbGVzKSB7CiAgICAgIGlmICghKG4gPSBjaXJjbGVzLmxlbmd0aCkpIHJldHVybiAwOwoKICAgICAgdmFyIGEsIGIsIGMsIG4sIGFhLCBjYSwgaSwgaiwgaywgc2osIHNrOwoKICAgICAgLy8gUGxhY2UgdGhlIGZpcnN0IGNpcmNsZS4KICAgICAgYSA9IGNpcmNsZXNbMF0sIGEueCA9IDAsIGEueSA9IDA7CiAgICAgIGlmICghKG4gPiAxKSkgcmV0dXJuIGEucjsKCiAgICAgIC8vIFBsYWNlIHRoZSBzZWNvbmQgY2lyY2xlLgogICAgICBiID0gY2lyY2xlc1sxXSwgYS54ID0gLWIuciwgYi54ID0gYS5yLCBiLnkgPSAwOwogICAgICBpZiAoIShuID4gMikpIHJldHVybiBhLnIgKyBiLnI7CgogICAgICAvLyBQbGFjZSB0aGUgdGhpcmQgY2lyY2xlLgogICAgICBwbGFjZSQxKGIsIGEsIGMgPSBjaXJjbGVzWzJdKTsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIGZyb250LWNoYWluIHVzaW5nIHRoZSBmaXJzdCB0aHJlZSBjaXJjbGVzIGEsIGIgYW5kIGMuCiAgICAgIGEgPSBuZXcgTm9kZSQ0KGEpLCBiID0gbmV3IE5vZGUkNChiKSwgYyA9IG5ldyBOb2RlJDQoYyk7CiAgICAgIGEubmV4dCA9IGMucHJldmlvdXMgPSBiOwogICAgICBiLm5leHQgPSBhLnByZXZpb3VzID0gYzsKICAgICAgYy5uZXh0ID0gYi5wcmV2aW91cyA9IGE7CgogICAgICAvLyBBdHRlbXB0IHRvIHBsYWNlIGVhY2ggcmVtYWluaW5nIGNpcmNsZeKApgogICAgICBwYWNrOiBmb3IgKGkgPSAzOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcGxhY2UkMShhLl8sIGIuXywgYyA9IGNpcmNsZXNbaV0pLCBjID0gbmV3IE5vZGUkNChjKTsKCiAgICAgICAgLy8gRmluZCB0aGUgY2xvc2VzdCBpbnRlcnNlY3RpbmcgY2lyY2xlIG9uIHRoZSBmcm9udC1jaGFpbiwgaWYgYW55LgogICAgICAgIC8vIOKAnENsb3NlbmVzc+KAnSBpcyBkZXRlcm1pbmVkIGJ5IGxpbmVhciBkaXN0YW5jZSBhbG9uZyB0aGUgZnJvbnQtY2hhaW4uCiAgICAgICAgLy8g4oCcQWhlYWTigJ0gb3Ig4oCcYmVoaW5k4oCdIGlzIGxpa2V3aXNlIGRldGVybWluZWQgYnkgbGluZWFyIGRpc3RhbmNlLgogICAgICAgIGogPSBiLm5leHQsIGsgPSBhLnByZXZpb3VzLCBzaiA9IGIuXy5yLCBzayA9IGEuXy5yOwogICAgICAgIGRvIHsKICAgICAgICAgIGlmIChzaiA8PSBzaykgewogICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyQxKGouXywgYy5fKSkgewogICAgICAgICAgICAgIGIgPSBqLCBhLm5leHQgPSBiLCBiLnByZXZpb3VzID0gYSwgLS1pOwogICAgICAgICAgICAgIGNvbnRpbnVlIHBhY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2ogKz0gai5fLnIsIGogPSBqLm5leHQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoaW50ZXJzZWN0cyQxKGsuXywgYy5fKSkgewogICAgICAgICAgICAgIGEgPSBrLCBhLm5leHQgPSBiLCBiLnByZXZpb3VzID0gYSwgLS1pOwogICAgICAgICAgICAgIGNvbnRpbnVlIHBhY2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2sgKz0gay5fLnIsIGsgPSBrLnByZXZpb3VzOwogICAgICAgICAgfQogICAgICAgIH0gd2hpbGUgKGogIT09IGsubmV4dCk7CgogICAgICAgIC8vIFN1Y2Nlc3MhIEluc2VydCB0aGUgbmV3IGNpcmNsZSBjIGJldHdlZW4gYSBhbmQgYi4KICAgICAgICBjLnByZXZpb3VzID0gYSwgYy5uZXh0ID0gYiwgYS5uZXh0ID0gYi5wcmV2aW91cyA9IGIgPSBjOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBuZXcgY2xvc2VzdCBjaXJjbGUgcGFpciB0byB0aGUgY2VudHJvaWQuCiAgICAgICAgYWEgPSBzY29yZSQxKGEpOwogICAgICAgIHdoaWxlICgoYyA9IGMubmV4dCkgIT09IGIpIHsKICAgICAgICAgIGlmICgoY2EgPSBzY29yZSQxKGMpKSA8IGFhKSB7CiAgICAgICAgICAgIGEgPSBjLCBhYSA9IGNhOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBiID0gYS5uZXh0OwogICAgICB9CgogICAgICAvLyBDb21wdXRlIHRoZSBlbmNsb3NpbmcgY2lyY2xlIG9mIHRoZSBmcm9udCBjaGFpbi4KICAgICAgYSA9IFtiLl9dLCBjID0gYjsgd2hpbGUgKChjID0gYy5uZXh0KSAhPT0gYikgYS5wdXNoKGMuXyk7IGMgPSBlbmNsb3NlJDEoYSk7CgogICAgICAvLyBUcmFuc2xhdGUgdGhlIGNpcmNsZXMgdG8gcHV0IHRoZSBlbmNsb3NpbmcgY2lyY2xlIGFyb3VuZCB0aGUgb3JpZ2luLgogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBhID0gY2lyY2xlc1tpXSwgYS54IC09IGMueCwgYS55IC09IGMueTsKCiAgICAgIHJldHVybiBjLnI7CiAgICB9CgogICAgZnVuY3Rpb24gc2libGluZ3MkMShjaXJjbGVzKSB7CiAgICAgIHBhY2tFbmNsb3NlJDEoY2lyY2xlcyk7CiAgICAgIHJldHVybiBjaXJjbGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIG9wdGlvbmFsJDEoZikgewogICAgICByZXR1cm4gZiA9PSBudWxsID8gbnVsbCA6IHJlcXVpcmVkJDEoZik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVxdWlyZWQkMShmKSB7CiAgICAgIGlmICh0eXBlb2YgZiAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gZjsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudFplcm8kMSgpIHsKICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkbih4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0UmFkaXVzJDMoZCkgewogICAgICByZXR1cm4gTWF0aC5zcXJ0KGQudmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluZGV4JDYoKSB7CiAgICAgIHZhciByYWRpdXMgPSBudWxsLAogICAgICAgICAgZHggPSAxLAogICAgICAgICAgZHkgPSAxLAogICAgICAgICAgcGFkZGluZyA9IGNvbnN0YW50WmVybyQxOwoKICAgICAgZnVuY3Rpb24gcGFjayhyb290KSB7CiAgICAgICAgcm9vdC54ID0gZHggLyAyLCByb290LnkgPSBkeSAvIDI7CiAgICAgICAgaWYgKHJhZGl1cykgewogICAgICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYkMShyYWRpdXMpKQogICAgICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuJDEocGFkZGluZywgMC41KSkKICAgICAgICAgICAgICAuZWFjaEJlZm9yZSh0cmFuc2xhdGVDaGlsZCQxKDEpKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcm9vdC5lYWNoQmVmb3JlKHJhZGl1c0xlYWYkMShkZWZhdWx0UmFkaXVzJDMpKQogICAgICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuJDEoY29uc3RhbnRaZXJvJDEsIDEpKQogICAgICAgICAgICAgIC5lYWNoQWZ0ZXIocGFja0NoaWxkcmVuJDEocGFkZGluZywgcm9vdC5yIC8gTWF0aC5taW4oZHgsIGR5KSkpCiAgICAgICAgICAgICAgLmVhY2hCZWZvcmUodHJhbnNsYXRlQ2hpbGQkMShNYXRoLm1pbihkeCwgZHkpIC8gKDIgKiByb290LnIpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByb290OwogICAgICB9CgogICAgICBwYWNrLnJhZGl1cyA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYWRpdXMgPSBvcHRpb25hbCQxKHgpLCBwYWNrKSA6IHJhZGl1czsKICAgICAgfTsKCiAgICAgIHBhY2suc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCBwYWNrKSA6IFtkeCwgZHldOwogICAgICB9OwoKICAgICAgcGFjay5wYWRkaW5nID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmcgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCRuKCt4KSwgcGFjaykgOiBwYWRkaW5nOwogICAgICB9OwoKICAgICAgcmV0dXJuIHBhY2s7CiAgICB9CgogICAgZnVuY3Rpb24gcmFkaXVzTGVhZiQxKHJhZGl1cykgewogICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmICghbm9kZS5jaGlsZHJlbikgewogICAgICAgICAgbm9kZS5yID0gTWF0aC5tYXgoMCwgK3JhZGl1cyhub2RlKSB8fCAwKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcGFja0NoaWxkcmVuJDEocGFkZGluZywgaykgewogICAgICByZXR1cm4gZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmIChjaGlsZHJlbiA9IG5vZGUuY2hpbGRyZW4pIHsKICAgICAgICAgIHZhciBjaGlsZHJlbiwKICAgICAgICAgICAgICBpLAogICAgICAgICAgICAgIG4gPSBjaGlsZHJlbi5sZW5ndGgsCiAgICAgICAgICAgICAgciA9IHBhZGRpbmcobm9kZSkgKiBrIHx8IDAsCiAgICAgICAgICAgICAgZTsKCiAgICAgICAgICBpZiAocikgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY2hpbGRyZW5baV0uciArPSByOwogICAgICAgICAgZSA9IHBhY2tFbmNsb3NlJDEoY2hpbGRyZW4pOwogICAgICAgICAgaWYgKHIpIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNoaWxkcmVuW2ldLnIgLT0gcjsKICAgICAgICAgIG5vZGUuciA9IGUgKyByOwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVDaGlsZCQxKGspIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICB2YXIgcGFyZW50ID0gbm9kZS5wYXJlbnQ7CiAgICAgICAgbm9kZS5yICo9IGs7CiAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgbm9kZS54ID0gcGFyZW50LnggKyBrICogbm9kZS54OwogICAgICAgICAgbm9kZS55ID0gcGFyZW50LnkgKyBrICogbm9kZS55OwogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiByb3VuZE5vZGUkMShub2RlKSB7CiAgICAgIG5vZGUueDAgPSBNYXRoLnJvdW5kKG5vZGUueDApOwogICAgICBub2RlLnkwID0gTWF0aC5yb3VuZChub2RlLnkwKTsKICAgICAgbm9kZS54MSA9IE1hdGgucm91bmQobm9kZS54MSk7CiAgICAgIG5vZGUueTEgPSBNYXRoLnJvdW5kKG5vZGUueTEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVtYXBEaWNlJDEocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgICBub2RlLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHgxIC0geDApIC8gcGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkxOwogICAgICAgIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgwICs9IG5vZGUudmFsdWUgKiBrOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcGFydGl0aW9uJDEoKSB7CiAgICAgIHZhciBkeCA9IDEsCiAgICAgICAgICBkeSA9IDEsCiAgICAgICAgICBwYWRkaW5nID0gMCwKICAgICAgICAgIHJvdW5kID0gZmFsc2U7CgogICAgICBmdW5jdGlvbiBwYXJ0aXRpb24ocm9vdCkgewogICAgICAgIHZhciBuID0gcm9vdC5oZWlnaHQgKyAxOwogICAgICAgIHJvb3QueDAgPQogICAgICAgIHJvb3QueTAgPSBwYWRkaW5nOwogICAgICAgIHJvb3QueDEgPSBkeDsKICAgICAgICByb290LnkxID0gZHkgLyBuOwogICAgICAgIHJvb3QuZWFjaEJlZm9yZShwb3NpdGlvbk5vZGUoZHksIG4pKTsKICAgICAgICBpZiAocm91bmQpIHJvb3QuZWFjaEJlZm9yZShyb3VuZE5vZGUkMSk7CiAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBvc2l0aW9uTm9kZShkeSwgbikgewogICAgICAgIHJldHVybiBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICBpZiAobm9kZS5jaGlsZHJlbikgewogICAgICAgICAgICB0cmVlbWFwRGljZSQxKG5vZGUsIG5vZGUueDAsIGR5ICogKG5vZGUuZGVwdGggKyAxKSAvIG4sIG5vZGUueDEsIGR5ICogKG5vZGUuZGVwdGggKyAyKSAvIG4pOwogICAgICAgICAgfQogICAgICAgICAgdmFyIHgwID0gbm9kZS54MCwKICAgICAgICAgICAgICB5MCA9IG5vZGUueTAsCiAgICAgICAgICAgICAgeDEgPSBub2RlLngxIC0gcGFkZGluZywKICAgICAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwYWRkaW5nOwogICAgICAgICAgaWYgKHgxIDwgeDApIHgwID0geDEgPSAoeDAgKyB4MSkgLyAyOwogICAgICAgICAgaWYgKHkxIDwgeTApIHkwID0geTEgPSAoeTAgKyB5MSkgLyAyOwogICAgICAgICAgbm9kZS54MCA9IHgwOwogICAgICAgICAgbm9kZS55MCA9IHkwOwogICAgICAgICAgbm9kZS54MSA9IHgxOwogICAgICAgICAgbm9kZS55MSA9IHkxOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHBhcnRpdGlvbi5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgcGFydGl0aW9uKSA6IHJvdW5kOwogICAgICB9OwoKICAgICAgcGFydGl0aW9uLnNpemUgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZHggPSAreFswXSwgZHkgPSAreFsxXSwgcGFydGl0aW9uKSA6IFtkeCwgZHldOwogICAgICB9OwoKICAgICAgcGFydGl0aW9uLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZyA9ICt4LCBwYXJ0aXRpb24pIDogcGFkZGluZzsKICAgICAgfTsKCiAgICAgIHJldHVybiBwYXJ0aXRpb247CiAgICB9CgogICAgdmFyIGtleVByZWZpeCQ0ID0gIiQiLCAvLyBQcm90ZWN0IGFnYWluc3Qga2V5cyBsaWtlIOKAnF9fcHJvdG9fX+KAnS4KICAgICAgICBwcmVyb290JDEgPSB7ZGVwdGg6IC0xfSwKICAgICAgICBhbWJpZ3VvdXMkMSA9IHt9OwoKICAgIGZ1bmN0aW9uIGRlZmF1bHRJZCQxKGQpIHsKICAgICAgcmV0dXJuIGQuaWQ7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFBhcmVudElkJDEoZCkgewogICAgICByZXR1cm4gZC5wYXJlbnRJZDsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHJhdGlmeSQxKCkgewogICAgICB2YXIgaWQgPSBkZWZhdWx0SWQkMSwKICAgICAgICAgIHBhcmVudElkID0gZGVmYXVsdFBhcmVudElkJDE7CgogICAgICBmdW5jdGlvbiBzdHJhdGlmeShkYXRhKSB7CiAgICAgICAgdmFyIGQsCiAgICAgICAgICAgIGksCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgcm9vdCwKICAgICAgICAgICAgcGFyZW50LAogICAgICAgICAgICBub2RlLAogICAgICAgICAgICBub2RlcyA9IG5ldyBBcnJheShuKSwKICAgICAgICAgICAgbm9kZUlkLAogICAgICAgICAgICBub2RlS2V5LAogICAgICAgICAgICBub2RlQnlLZXkgPSB7fTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgZCA9IGRhdGFbaV0sIG5vZGUgPSBub2Rlc1tpXSA9IG5ldyBOb2RlJDMoZCk7CiAgICAgICAgICBpZiAoKG5vZGVJZCA9IGlkKGQsIGksIGRhdGEpKSAhPSBudWxsICYmIChub2RlSWQgKz0gIiIpKSB7CiAgICAgICAgICAgIG5vZGVLZXkgPSBrZXlQcmVmaXgkNCArIChub2RlLmlkID0gbm9kZUlkKTsKICAgICAgICAgICAgbm9kZUJ5S2V5W25vZGVLZXldID0gbm9kZUtleSBpbiBub2RlQnlLZXkgPyBhbWJpZ3VvdXMkMSA6IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGVJZCA9IHBhcmVudElkKGRhdGFbaV0sIGksIGRhdGEpOwogICAgICAgICAgaWYgKG5vZGVJZCA9PSBudWxsIHx8ICEobm9kZUlkICs9ICIiKSkgewogICAgICAgICAgICBpZiAocm9vdCkgdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSByb290cyIpOwogICAgICAgICAgICByb290ID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHBhcmVudCA9IG5vZGVCeUtleVtrZXlQcmVmaXgkNCArIG5vZGVJZF07CiAgICAgICAgICAgIGlmICghcGFyZW50KSB0aHJvdyBuZXcgRXJyb3IoIm1pc3Npbmc6ICIgKyBub2RlSWQpOwogICAgICAgICAgICBpZiAocGFyZW50ID09PSBhbWJpZ3VvdXMkMSkgdGhyb3cgbmV3IEVycm9yKCJhbWJpZ3VvdXM6ICIgKyBub2RlSWQpOwogICAgICAgICAgICBpZiAocGFyZW50LmNoaWxkcmVuKSBwYXJlbnQuY2hpbGRyZW4ucHVzaChub2RlKTsKICAgICAgICAgICAgZWxzZSBwYXJlbnQuY2hpbGRyZW4gPSBbbm9kZV07CiAgICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKCFyb290KSB0aHJvdyBuZXcgRXJyb3IoIm5vIHJvb3QiKTsKICAgICAgICByb290LnBhcmVudCA9IHByZXJvb3QkMTsKICAgICAgICByb290LmVhY2hCZWZvcmUoZnVuY3Rpb24obm9kZSkgeyBub2RlLmRlcHRoID0gbm9kZS5wYXJlbnQuZGVwdGggKyAxOyAtLW47IH0pLmVhY2hCZWZvcmUoY29tcHV0ZUhlaWdodCQxKTsKICAgICAgICByb290LnBhcmVudCA9IG51bGw7CiAgICAgICAgaWYgKG4gPiAwKSB0aHJvdyBuZXcgRXJyb3IoImN5Y2xlIik7CgogICAgICAgIHJldHVybiByb290OwogICAgICB9CgogICAgICBzdHJhdGlmeS5pZCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpZCA9IHJlcXVpcmVkJDEoeCksIHN0cmF0aWZ5KSA6IGlkOwogICAgICB9OwoKICAgICAgc3RyYXRpZnkucGFyZW50SWQgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFyZW50SWQgPSByZXF1aXJlZCQxKHgpLCBzdHJhdGlmeSkgOiBwYXJlbnRJZDsKICAgICAgfTsKCiAgICAgIHJldHVybiBzdHJhdGlmeTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0U2VwYXJhdGlvbiQzKGEsIGIpIHsKICAgICAgcmV0dXJuIGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyOwogICAgfQoKICAgIC8vIGZ1bmN0aW9uIHJhZGlhbFNlcGFyYXRpb24oYSwgYikgewogICAgLy8gICByZXR1cm4gKGEucGFyZW50ID09PSBiLnBhcmVudCA/IDEgOiAyKSAvIGEuZGVwdGg7CiAgICAvLyB9CgogICAgLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHRyYXZlcnNlIHRoZSBsZWZ0IGNvbnRvdXIgb2YgYSBzdWJ0cmVlIChvcgogICAgLy8gc3ViZm9yZXN0KS4gSXQgcmV0dXJucyB0aGUgc3VjY2Vzc29yIG9mIHYgb24gdGhpcyBjb250b3VyLiBUaGlzIHN1Y2Nlc3NvciBpcwogICAgLy8gZWl0aGVyIGdpdmVuIGJ5IHRoZSBsZWZ0bW9zdCBjaGlsZCBvZiB2IG9yIGJ5IHRoZSB0aHJlYWQgb2Ygdi4gVGhlIGZ1bmN0aW9uCiAgICAvLyByZXR1cm5zIG51bGwgaWYgYW5kIG9ubHkgaWYgdiBpcyBvbiB0aGUgaGlnaGVzdCBsZXZlbCBvZiBpdHMgc3VidHJlZS4KICAgIGZ1bmN0aW9uIG5leHRMZWZ0JDEodikgewogICAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOwogICAgICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlblswXSA6IHYudDsKICAgIH0KCiAgICAvLyBUaGlzIGZ1bmN0aW9uIHdvcmtzIGFuYWxvZ291c2x5IHRvIG5leHRMZWZ0LgogICAgZnVuY3Rpb24gbmV4dFJpZ2h0JDEodikgewogICAgICB2YXIgY2hpbGRyZW4gPSB2LmNoaWxkcmVuOwogICAgICByZXR1cm4gY2hpbGRyZW4gPyBjaGlsZHJlbltjaGlsZHJlbi5sZW5ndGggLSAxXSA6IHYudDsKICAgIH0KCiAgICAvLyBTaGlmdHMgdGhlIGN1cnJlbnQgc3VidHJlZSByb290ZWQgYXQgdysuIFRoaXMgaXMgZG9uZSBieSBpbmNyZWFzaW5nCiAgICAvLyBwcmVsaW0odyspIGFuZCBtb2QodyspIGJ5IHNoaWZ0LgogICAgZnVuY3Rpb24gbW92ZVN1YnRyZWUkMSh3bSwgd3AsIHNoaWZ0KSB7CiAgICAgIHZhciBjaGFuZ2UgPSBzaGlmdCAvICh3cC5pIC0gd20uaSk7CiAgICAgIHdwLmMgLT0gY2hhbmdlOwogICAgICB3cC5zICs9IHNoaWZ0OwogICAgICB3bS5jICs9IGNoYW5nZTsKICAgICAgd3AueiArPSBzaGlmdDsKICAgICAgd3AubSArPSBzaGlmdDsKICAgIH0KCiAgICAvLyBBbGwgb3RoZXIgc2hpZnRzLCBhcHBsaWVkIHRvIHRoZSBzbWFsbGVyIHN1YnRyZWVzIGJldHdlZW4gdy0gYW5kIHcrLCBhcmUKICAgIC8vIHBlcmZvcm1lZCBieSB0aGlzIGZ1bmN0aW9uLiBUbyBwcmVwYXJlIHRoZSBzaGlmdHMsIHdlIGhhdmUgdG8gYWRqdXN0CiAgICAvLyBjaGFuZ2UodyspLCBzaGlmdCh3KyksIGFuZCBjaGFuZ2Uody0pLgogICAgZnVuY3Rpb24gZXhlY3V0ZVNoaWZ0cyQxKHYpIHsKICAgICAgdmFyIHNoaWZ0ID0gMCwKICAgICAgICAgIGNoYW5nZSA9IDAsCiAgICAgICAgICBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sCiAgICAgICAgICBpID0gY2hpbGRyZW4ubGVuZ3RoLAogICAgICAgICAgdzsKICAgICAgd2hpbGUgKC0taSA+PSAwKSB7CiAgICAgICAgdyA9IGNoaWxkcmVuW2ldOwogICAgICAgIHcueiArPSBzaGlmdDsKICAgICAgICB3Lm0gKz0gc2hpZnQ7CiAgICAgICAgc2hpZnQgKz0gdy5zICsgKGNoYW5nZSArPSB3LmMpOwogICAgICB9CiAgICB9CgogICAgLy8gSWYgdmkt4oCZcyBhbmNlc3RvciBpcyBhIHNpYmxpbmcgb2YgdiwgcmV0dXJucyB2aS3igJlzIGFuY2VzdG9yLiBPdGhlcndpc2UsCiAgICAvLyByZXR1cm5zIHRoZSBzcGVjaWZpZWQgKGRlZmF1bHQpIGFuY2VzdG9yLgogICAgZnVuY3Rpb24gbmV4dEFuY2VzdG9yJDEodmltLCB2LCBhbmNlc3RvcikgewogICAgICByZXR1cm4gdmltLmEucGFyZW50ID09PSB2LnBhcmVudCA/IHZpbS5hIDogYW5jZXN0b3I7CiAgICB9CgogICAgZnVuY3Rpb24gVHJlZU5vZGUkMShub2RlLCBpKSB7CiAgICAgIHRoaXMuXyA9IG5vZGU7CiAgICAgIHRoaXMucGFyZW50ID0gbnVsbDsKICAgICAgdGhpcy5jaGlsZHJlbiA9IG51bGw7CiAgICAgIHRoaXMuQSA9IG51bGw7IC8vIGRlZmF1bHQgYW5jZXN0b3IKICAgICAgdGhpcy5hID0gdGhpczsgLy8gYW5jZXN0b3IKICAgICAgdGhpcy56ID0gMDsgLy8gcHJlbGltCiAgICAgIHRoaXMubSA9IDA7IC8vIG1vZAogICAgICB0aGlzLmMgPSAwOyAvLyBjaGFuZ2UKICAgICAgdGhpcy5zID0gMDsgLy8gc2hpZnQKICAgICAgdGhpcy50ID0gbnVsbDsgLy8gdGhyZWFkCiAgICAgIHRoaXMuaSA9IGk7IC8vIG51bWJlcgogICAgfQoKICAgIFRyZWVOb2RlJDEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShOb2RlJDMucHJvdG90eXBlKTsKCiAgICBmdW5jdGlvbiB0cmVlUm9vdCQxKHJvb3QpIHsKICAgICAgdmFyIHRyZWUgPSBuZXcgVHJlZU5vZGUkMShyb290LCAwKSwKICAgICAgICAgIG5vZGUsCiAgICAgICAgICBub2RlcyA9IFt0cmVlXSwKICAgICAgICAgIGNoaWxkLAogICAgICAgICAgY2hpbGRyZW4sCiAgICAgICAgICBpLAogICAgICAgICAgbjsKCiAgICAgIHdoaWxlIChub2RlID0gbm9kZXMucG9wKCkpIHsKICAgICAgICBpZiAoY2hpbGRyZW4gPSBub2RlLl8uY2hpbGRyZW4pIHsKICAgICAgICAgIG5vZGUuY2hpbGRyZW4gPSBuZXcgQXJyYXkobiA9IGNoaWxkcmVuLmxlbmd0aCk7CiAgICAgICAgICBmb3IgKGkgPSBuIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgbm9kZXMucHVzaChjaGlsZCA9IG5vZGUuY2hpbGRyZW5baV0gPSBuZXcgVHJlZU5vZGUkMShjaGlsZHJlbltpXSwgaSkpOwogICAgICAgICAgICBjaGlsZC5wYXJlbnQgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgKHRyZWUucGFyZW50ID0gbmV3IFRyZWVOb2RlJDEobnVsbCwgMCkpLmNoaWxkcmVuID0gW3RyZWVdOwogICAgICByZXR1cm4gdHJlZTsKICAgIH0KCiAgICAvLyBOb2RlLWxpbmsgdHJlZSBkaWFncmFtIHVzaW5nIHRoZSBSZWluZ29sZC1UaWxmb3JkICJ0aWR5IiBhbGdvcml0aG0KICAgIGZ1bmN0aW9uIHRyZWUkMSgpIHsKICAgICAgdmFyIHNlcGFyYXRpb24gPSBkZWZhdWx0U2VwYXJhdGlvbiQzLAogICAgICAgICAgZHggPSAxLAogICAgICAgICAgZHkgPSAxLAogICAgICAgICAgbm9kZVNpemUgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gdHJlZShyb290KSB7CiAgICAgICAgdmFyIHQgPSB0cmVlUm9vdCQxKHJvb3QpOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBsYXlvdXQgdXNpbmcgQnVjaGhlaW0gZXQgYWwu4oCZcyBhbGdvcml0aG0uCiAgICAgICAgdC5lYWNoQWZ0ZXIoZmlyc3RXYWxrKSwgdC5wYXJlbnQubSA9IC10Lno7CiAgICAgICAgdC5lYWNoQmVmb3JlKHNlY29uZFdhbGspOwoKICAgICAgICAvLyBJZiBhIGZpeGVkIG5vZGUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkuCiAgICAgICAgaWYgKG5vZGVTaXplKSByb290LmVhY2hCZWZvcmUoc2l6ZU5vZGUpOwoKICAgICAgICAvLyBJZiBhIGZpeGVkIHRyZWUgc2l6ZSBpcyBzcGVjaWZpZWQsIHNjYWxlIHggYW5kIHkgYmFzZWQgb24gdGhlIGV4dGVudC4KICAgICAgICAvLyBDb21wdXRlIHRoZSBsZWZ0LW1vc3QsIHJpZ2h0LW1vc3QsIGFuZCBkZXB0aC1tb3N0IG5vZGVzIGZvciBleHRlbnRzLgogICAgICAgIGVsc2UgewogICAgICAgICAgdmFyIGxlZnQgPSByb290LAogICAgICAgICAgICAgIHJpZ2h0ID0gcm9vdCwKICAgICAgICAgICAgICBib3R0b20gPSByb290OwogICAgICAgICAgcm9vdC5lYWNoQmVmb3JlKGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgaWYgKG5vZGUueCA8IGxlZnQueCkgbGVmdCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChub2RlLnggPiByaWdodC54KSByaWdodCA9IG5vZGU7CiAgICAgICAgICAgIGlmIChub2RlLmRlcHRoID4gYm90dG9tLmRlcHRoKSBib3R0b20gPSBub2RlOwogICAgICAgICAgfSk7CiAgICAgICAgICB2YXIgcyA9IGxlZnQgPT09IHJpZ2h0ID8gMSA6IHNlcGFyYXRpb24obGVmdCwgcmlnaHQpIC8gMiwKICAgICAgICAgICAgICB0eCA9IHMgLSBsZWZ0LngsCiAgICAgICAgICAgICAga3ggPSBkeCAvIChyaWdodC54ICsgcyArIHR4KSwKICAgICAgICAgICAgICBreSA9IGR5IC8gKGJvdHRvbS5kZXB0aCB8fCAxKTsKICAgICAgICAgIHJvb3QuZWFjaEJlZm9yZShmdW5jdGlvbihub2RlKSB7CiAgICAgICAgICAgIG5vZGUueCA9IChub2RlLnggKyB0eCkgKiBreDsKICAgICAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGt5OwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgfQoKICAgICAgLy8gQ29tcHV0ZXMgYSBwcmVsaW1pbmFyeSB4LWNvb3JkaW5hdGUgZm9yIHYuIEJlZm9yZSB0aGF0LCBGSVJTVCBXQUxLIGlzCiAgICAgIC8vIGFwcGxpZWQgcmVjdXJzaXZlbHkgdG8gdGhlIGNoaWxkcmVuIG9mIHYsIGFzIHdlbGwgYXMgdGhlIGZ1bmN0aW9uCiAgICAgIC8vIEFQUE9SVElPTi4gQWZ0ZXIgc3BhY2luZyBvdXQgdGhlIGNoaWxkcmVuIGJ5IGNhbGxpbmcgRVhFQ1VURSBTSElGVFMsIHRoZQogICAgICAvLyBub2RlIHYgaXMgcGxhY2VkIHRvIHRoZSBtaWRwb2ludCBvZiBpdHMgb3V0ZXJtb3N0IGNoaWxkcmVuLgogICAgICBmdW5jdGlvbiBmaXJzdFdhbGsodikgewogICAgICAgIHZhciBjaGlsZHJlbiA9IHYuY2hpbGRyZW4sCiAgICAgICAgICAgIHNpYmxpbmdzID0gdi5wYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgICAgIHcgPSB2LmkgPyBzaWJsaW5nc1t2LmkgLSAxXSA6IG51bGw7CiAgICAgICAgaWYgKGNoaWxkcmVuKSB7CiAgICAgICAgICBleGVjdXRlU2hpZnRzJDEodik7CiAgICAgICAgICB2YXIgbWlkcG9pbnQgPSAoY2hpbGRyZW5bMF0ueiArIGNoaWxkcmVuW2NoaWxkcmVuLmxlbmd0aCAtIDFdLnopIC8gMjsKICAgICAgICAgIGlmICh3KSB7CiAgICAgICAgICAgIHYueiA9IHcueiArIHNlcGFyYXRpb24odi5fLCB3Ll8pOwogICAgICAgICAgICB2Lm0gPSB2LnogLSBtaWRwb2ludDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHYueiA9IG1pZHBvaW50OwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSBpZiAodykgewogICAgICAgICAgdi56ID0gdy56ICsgc2VwYXJhdGlvbih2Ll8sIHcuXyk7CiAgICAgICAgfQogICAgICAgIHYucGFyZW50LkEgPSBhcHBvcnRpb24odiwgdywgdi5wYXJlbnQuQSB8fCBzaWJsaW5nc1swXSk7CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGVzIGFsbCByZWFsIHgtY29vcmRpbmF0ZXMgYnkgc3VtbWluZyB1cCB0aGUgbW9kaWZpZXJzIHJlY3Vyc2l2ZWx5LgogICAgICBmdW5jdGlvbiBzZWNvbmRXYWxrKHYpIHsKICAgICAgICB2Ll8ueCA9IHYueiArIHYucGFyZW50Lm07CiAgICAgICAgdi5tICs9IHYucGFyZW50Lm07CiAgICAgIH0KCiAgICAgIC8vIFRoZSBjb3JlIG9mIHRoZSBhbGdvcml0aG0uIEhlcmUsIGEgbmV3IHN1YnRyZWUgaXMgY29tYmluZWQgd2l0aCB0aGUKICAgICAgLy8gcHJldmlvdXMgc3VidHJlZXMuIFRocmVhZHMgYXJlIHVzZWQgdG8gdHJhdmVyc2UgdGhlIGluc2lkZSBhbmQgb3V0c2lkZQogICAgICAvLyBjb250b3VycyBvZiB0aGUgbGVmdCBhbmQgcmlnaHQgc3VidHJlZSB1cCB0byB0aGUgaGlnaGVzdCBjb21tb24gbGV2ZWwuIFRoZQogICAgICAvLyB2ZXJ0aWNlcyB1c2VkIGZvciB0aGUgdHJhdmVyc2FscyBhcmUgdmkrLCB2aS0sIHZvLSwgYW5kIHZvKywgd2hlcmUgdGhlCiAgICAgIC8vIHN1cGVyc2NyaXB0IG8gbWVhbnMgb3V0c2lkZSBhbmQgaSBtZWFucyBpbnNpZGUsIHRoZSBzdWJzY3JpcHQgLSBtZWFucyBsZWZ0CiAgICAgIC8vIHN1YnRyZWUgYW5kICsgbWVhbnMgcmlnaHQgc3VidHJlZS4gRm9yIHN1bW1pbmcgdXAgdGhlIG1vZGlmaWVycyBhbG9uZyB0aGUKICAgICAgLy8gY29udG91ciwgd2UgdXNlIHJlc3BlY3RpdmUgdmFyaWFibGVzIHNpKywgc2ktLCBzby0sIGFuZCBzbysuIFdoZW5ldmVyIHR3bwogICAgICAvLyBub2RlcyBvZiB0aGUgaW5zaWRlIGNvbnRvdXJzIGNvbmZsaWN0LCB3ZSBjb21wdXRlIHRoZSBsZWZ0IG9uZSBvZiB0aGUKICAgICAgLy8gZ3JlYXRlc3QgdW5jb21tb24gYW5jZXN0b3JzIHVzaW5nIHRoZSBmdW5jdGlvbiBBTkNFU1RPUiBhbmQgY2FsbCBNT1ZFCiAgICAgIC8vIFNVQlRSRUUgdG8gc2hpZnQgdGhlIHN1YnRyZWUgYW5kIHByZXBhcmUgdGhlIHNoaWZ0cyBvZiBzbWFsbGVyIHN1YnRyZWVzLgogICAgICAvLyBGaW5hbGx5LCB3ZSBhZGQgYSBuZXcgdGhyZWFkIChpZiBuZWNlc3NhcnkpLgogICAgICBmdW5jdGlvbiBhcHBvcnRpb24odiwgdywgYW5jZXN0b3IpIHsKICAgICAgICBpZiAodykgewogICAgICAgICAgdmFyIHZpcCA9IHYsCiAgICAgICAgICAgICAgdm9wID0gdiwKICAgICAgICAgICAgICB2aW0gPSB3LAogICAgICAgICAgICAgIHZvbSA9IHZpcC5wYXJlbnQuY2hpbGRyZW5bMF0sCiAgICAgICAgICAgICAgc2lwID0gdmlwLm0sCiAgICAgICAgICAgICAgc29wID0gdm9wLm0sCiAgICAgICAgICAgICAgc2ltID0gdmltLm0sCiAgICAgICAgICAgICAgc29tID0gdm9tLm0sCiAgICAgICAgICAgICAgc2hpZnQ7CiAgICAgICAgICB3aGlsZSAodmltID0gbmV4dFJpZ2h0JDEodmltKSwgdmlwID0gbmV4dExlZnQkMSh2aXApLCB2aW0gJiYgdmlwKSB7CiAgICAgICAgICAgIHZvbSA9IG5leHRMZWZ0JDEodm9tKTsKICAgICAgICAgICAgdm9wID0gbmV4dFJpZ2h0JDEodm9wKTsKICAgICAgICAgICAgdm9wLmEgPSB2OwogICAgICAgICAgICBzaGlmdCA9IHZpbS56ICsgc2ltIC0gdmlwLnogLSBzaXAgKyBzZXBhcmF0aW9uKHZpbS5fLCB2aXAuXyk7CiAgICAgICAgICAgIGlmIChzaGlmdCA+IDApIHsKICAgICAgICAgICAgICBtb3ZlU3VidHJlZSQxKG5leHRBbmNlc3RvciQxKHZpbSwgdiwgYW5jZXN0b3IpLCB2LCBzaGlmdCk7CiAgICAgICAgICAgICAgc2lwICs9IHNoaWZ0OwogICAgICAgICAgICAgIHNvcCArPSBzaGlmdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzaW0gKz0gdmltLm07CiAgICAgICAgICAgIHNpcCArPSB2aXAubTsKICAgICAgICAgICAgc29tICs9IHZvbS5tOwogICAgICAgICAgICBzb3AgKz0gdm9wLm07CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmltICYmICFuZXh0UmlnaHQkMSh2b3ApKSB7CiAgICAgICAgICAgIHZvcC50ID0gdmltOwogICAgICAgICAgICB2b3AubSArPSBzaW0gLSBzb3A7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodmlwICYmICFuZXh0TGVmdCQxKHZvbSkpIHsKICAgICAgICAgICAgdm9tLnQgPSB2aXA7CiAgICAgICAgICAgIHZvbS5tICs9IHNpcCAtIHNvbTsKICAgICAgICAgICAgYW5jZXN0b3IgPSB2OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYW5jZXN0b3I7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNpemVOb2RlKG5vZGUpIHsKICAgICAgICBub2RlLnggKj0gZHg7CiAgICAgICAgbm9kZS55ID0gbm9kZS5kZXB0aCAqIGR5OwogICAgICB9CgogICAgICB0cmVlLnNlcGFyYXRpb24gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2VwYXJhdGlvbiA9IHgsIHRyZWUpIDogc2VwYXJhdGlvbjsKICAgICAgfTsKCiAgICAgIHRyZWUuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChub2RlU2l6ZSA9IGZhbHNlLCBkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlKSA6IChub2RlU2l6ZSA/IG51bGwgOiBbZHgsIGR5XSk7CiAgICAgIH07CgogICAgICB0cmVlLm5vZGVTaXplID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG5vZGVTaXplID0gdHJ1ZSwgZHggPSAreFswXSwgZHkgPSAreFsxXSwgdHJlZSkgOiAobm9kZVNpemUgPyBbZHgsIGR5XSA6IG51bGwpOwogICAgICB9OwoKICAgICAgcmV0dXJuIHRyZWU7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZW1hcFNsaWNlJDEocGFyZW50LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgbm9kZXMgPSBwYXJlbnQuY2hpbGRyZW4sCiAgICAgICAgICBub2RlLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgIGsgPSBwYXJlbnQudmFsdWUgJiYgKHkxIC0geTApIC8gcGFyZW50LnZhbHVlOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBub2RlID0gbm9kZXNbaV0sIG5vZGUueDAgPSB4MCwgbm9kZS54MSA9IHgxOwogICAgICAgIG5vZGUueTAgPSB5MCwgbm9kZS55MSA9IHkwICs9IG5vZGUudmFsdWUgKiBrOwogICAgICB9CiAgICB9CgogICAgdmFyIHBoaSQxID0gKDEgKyBNYXRoLnNxcnQoNSkpIC8gMjsKCiAgICBmdW5jdGlvbiBzcXVhcmlmeVJhdGlvJDEocmF0aW8sIHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdmFyIHJvd3MgPSBbXSwKICAgICAgICAgIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLAogICAgICAgICAgcm93LAogICAgICAgICAgbm9kZVZhbHVlLAogICAgICAgICAgaTAgPSAwLAogICAgICAgICAgaTEgPSAwLAogICAgICAgICAgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgIGR4LCBkeSwKICAgICAgICAgIHZhbHVlID0gcGFyZW50LnZhbHVlLAogICAgICAgICAgc3VtVmFsdWUsCiAgICAgICAgICBtaW5WYWx1ZSwKICAgICAgICAgIG1heFZhbHVlLAogICAgICAgICAgbmV3UmF0aW8sCiAgICAgICAgICBtaW5SYXRpbywKICAgICAgICAgIGFscGhhLAogICAgICAgICAgYmV0YTsKCiAgICAgIHdoaWxlIChpMCA8IG4pIHsKICAgICAgICBkeCA9IHgxIC0geDAsIGR5ID0geTEgLSB5MDsKCiAgICAgICAgLy8gRmluZCB0aGUgbmV4dCBub24tZW1wdHkgbm9kZS4KICAgICAgICBkbyBzdW1WYWx1ZSA9IG5vZGVzW2kxKytdLnZhbHVlOyB3aGlsZSAoIXN1bVZhbHVlICYmIGkxIDwgbik7CiAgICAgICAgbWluVmFsdWUgPSBtYXhWYWx1ZSA9IHN1bVZhbHVlOwogICAgICAgIGFscGhhID0gTWF0aC5tYXgoZHkgLyBkeCwgZHggLyBkeSkgLyAodmFsdWUgKiByYXRpbyk7CiAgICAgICAgYmV0YSA9IHN1bVZhbHVlICogc3VtVmFsdWUgKiBhbHBoYTsKICAgICAgICBtaW5SYXRpbyA9IE1hdGgubWF4KG1heFZhbHVlIC8gYmV0YSwgYmV0YSAvIG1pblZhbHVlKTsKCiAgICAgICAgLy8gS2VlcCBhZGRpbmcgbm9kZXMgd2hpbGUgdGhlIGFzcGVjdCByYXRpbyBtYWludGFpbnMgb3IgaW1wcm92ZXMuCiAgICAgICAgZm9yICg7IGkxIDwgbjsgKytpMSkgewogICAgICAgICAgc3VtVmFsdWUgKz0gbm9kZVZhbHVlID0gbm9kZXNbaTFdLnZhbHVlOwogICAgICAgICAgaWYgKG5vZGVWYWx1ZSA8IG1pblZhbHVlKSBtaW5WYWx1ZSA9IG5vZGVWYWx1ZTsKICAgICAgICAgIGlmIChub2RlVmFsdWUgPiBtYXhWYWx1ZSkgbWF4VmFsdWUgPSBub2RlVmFsdWU7CiAgICAgICAgICBiZXRhID0gc3VtVmFsdWUgKiBzdW1WYWx1ZSAqIGFscGhhOwogICAgICAgICAgbmV3UmF0aW8gPSBNYXRoLm1heChtYXhWYWx1ZSAvIGJldGEsIGJldGEgLyBtaW5WYWx1ZSk7CiAgICAgICAgICBpZiAobmV3UmF0aW8gPiBtaW5SYXRpbykgeyBzdW1WYWx1ZSAtPSBub2RlVmFsdWU7IGJyZWFrOyB9CiAgICAgICAgICBtaW5SYXRpbyA9IG5ld1JhdGlvOwogICAgICAgIH0KCiAgICAgICAgLy8gUG9zaXRpb24gYW5kIHJlY29yZCB0aGUgcm93IG9yaWVudGF0aW9uLgogICAgICAgIHJvd3MucHVzaChyb3cgPSB7dmFsdWU6IHN1bVZhbHVlLCBkaWNlOiBkeCA8IGR5LCBjaGlsZHJlbjogbm9kZXMuc2xpY2UoaTAsIGkxKX0pOwogICAgICAgIGlmIChyb3cuZGljZSkgdHJlZW1hcERpY2UkMShyb3csIHgwLCB5MCwgeDEsIHZhbHVlID8geTAgKz0gZHkgKiBzdW1WYWx1ZSAvIHZhbHVlIDogeTEpOwogICAgICAgIGVsc2UgdHJlZW1hcFNsaWNlJDEocm93LCB4MCwgeTAsIHZhbHVlID8geDAgKz0gZHggKiBzdW1WYWx1ZSAvIHZhbHVlIDogeDEsIHkxKTsKICAgICAgICB2YWx1ZSAtPSBzdW1WYWx1ZSwgaTAgPSBpMTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJvd3M7CiAgICB9CgogICAgdmFyIHNxdWFyaWZ5JDEgPSAoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7CgogICAgICBmdW5jdGlvbiBzcXVhcmlmeShwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgICAgc3F1YXJpZnlSYXRpbyQxKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTsKICAgICAgfQoKICAgICAgc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7CiAgICAgIH07CgogICAgICByZXR1cm4gc3F1YXJpZnk7CiAgICB9KShwaGkkMSk7CgogICAgZnVuY3Rpb24gaW5kZXgkNygpIHsKICAgICAgdmFyIHRpbGUgPSBzcXVhcmlmeSQxLAogICAgICAgICAgcm91bmQgPSBmYWxzZSwKICAgICAgICAgIGR4ID0gMSwKICAgICAgICAgIGR5ID0gMSwKICAgICAgICAgIHBhZGRpbmdTdGFjayA9IFswXSwKICAgICAgICAgIHBhZGRpbmdJbm5lciA9IGNvbnN0YW50WmVybyQxLAogICAgICAgICAgcGFkZGluZ1RvcCA9IGNvbnN0YW50WmVybyQxLAogICAgICAgICAgcGFkZGluZ1JpZ2h0ID0gY29uc3RhbnRaZXJvJDEsCiAgICAgICAgICBwYWRkaW5nQm90dG9tID0gY29uc3RhbnRaZXJvJDEsCiAgICAgICAgICBwYWRkaW5nTGVmdCA9IGNvbnN0YW50WmVybyQxOwoKICAgICAgZnVuY3Rpb24gdHJlZW1hcChyb290KSB7CiAgICAgICAgcm9vdC54MCA9CiAgICAgICAgcm9vdC55MCA9IDA7CiAgICAgICAgcm9vdC54MSA9IGR4OwogICAgICAgIHJvb3QueTEgPSBkeTsKICAgICAgICByb290LmVhY2hCZWZvcmUocG9zaXRpb25Ob2RlKTsKICAgICAgICBwYWRkaW5nU3RhY2sgPSBbMF07CiAgICAgICAgaWYgKHJvdW5kKSByb290LmVhY2hCZWZvcmUocm91bmROb2RlJDEpOwogICAgICAgIHJldHVybiByb290OwogICAgICB9CgogICAgICBmdW5jdGlvbiBwb3NpdGlvbk5vZGUobm9kZSkgewogICAgICAgIHZhciBwID0gcGFkZGluZ1N0YWNrW25vZGUuZGVwdGhdLAogICAgICAgICAgICB4MCA9IG5vZGUueDAgKyBwLAogICAgICAgICAgICB5MCA9IG5vZGUueTAgKyBwLAogICAgICAgICAgICB4MSA9IG5vZGUueDEgLSBwLAogICAgICAgICAgICB5MSA9IG5vZGUueTEgLSBwOwogICAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjsKICAgICAgICBpZiAoeTEgPCB5MCkgeTAgPSB5MSA9ICh5MCArIHkxKSAvIDI7CiAgICAgICAgbm9kZS54MCA9IHgwOwogICAgICAgIG5vZGUueTAgPSB5MDsKICAgICAgICBub2RlLngxID0geDE7CiAgICAgICAgbm9kZS55MSA9IHkxOwogICAgICAgIGlmIChub2RlLmNoaWxkcmVuKSB7CiAgICAgICAgICBwID0gcGFkZGluZ1N0YWNrW25vZGUuZGVwdGggKyAxXSA9IHBhZGRpbmdJbm5lcihub2RlKSAvIDI7CiAgICAgICAgICB4MCArPSBwYWRkaW5nTGVmdChub2RlKSAtIHA7CiAgICAgICAgICB5MCArPSBwYWRkaW5nVG9wKG5vZGUpIC0gcDsKICAgICAgICAgIHgxIC09IHBhZGRpbmdSaWdodChub2RlKSAtIHA7CiAgICAgICAgICB5MSAtPSBwYWRkaW5nQm90dG9tKG5vZGUpIC0gcDsKICAgICAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHgxID0gKHgwICsgeDEpIC8gMjsKICAgICAgICAgIGlmICh5MSA8IHkwKSB5MCA9IHkxID0gKHkwICsgeTEpIC8gMjsKICAgICAgICAgIHRpbGUobm9kZSwgeDAsIHkwLCB4MSwgeTEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgdHJlZW1hcC5yb3VuZCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyb3VuZCA9ICEheCwgdHJlZW1hcCkgOiByb3VuZDsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAuc2l6ZSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkeCA9ICt4WzBdLCBkeSA9ICt4WzFdLCB0cmVlbWFwKSA6IFtkeCwgZHldOwogICAgICB9OwoKICAgICAgdHJlZW1hcC50aWxlID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpbGUgPSByZXF1aXJlZCQxKHgpLCB0cmVlbWFwKSA6IHRpbGU7CiAgICAgIH07CgogICAgICB0cmVlbWFwLnBhZGRpbmcgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdJbm5lcih4KS5wYWRkaW5nT3V0ZXIoeCkgOiB0cmVlbWFwLnBhZGRpbmdJbm5lcigpOwogICAgICB9OwoKICAgICAgdHJlZW1hcC5wYWRkaW5nSW5uZXIgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0lubmVyID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkbigreCksIHRyZWVtYXApIDogcGFkZGluZ0lubmVyOwogICAgICB9OwoKICAgICAgdHJlZW1hcC5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyB0cmVlbWFwLnBhZGRpbmdUb3AoeCkucGFkZGluZ1JpZ2h0KHgpLnBhZGRpbmdCb3R0b20oeCkucGFkZGluZ0xlZnQoeCkgOiB0cmVlbWFwLnBhZGRpbmdUb3AoKTsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ1RvcCA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nVG9wID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkbigreCksIHRyZWVtYXApIDogcGFkZGluZ1RvcDsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ1JpZ2h0ID0gZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdSaWdodCA9IHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geCA6IGNvbnN0YW50JG4oK3gpLCB0cmVlbWFwKSA6IHBhZGRpbmdSaWdodDsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ0JvdHRvbSA9IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nQm90dG9tID0gdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyB4IDogY29uc3RhbnQkbigreCksIHRyZWVtYXApIDogcGFkZGluZ0JvdHRvbTsKICAgICAgfTsKCiAgICAgIHRyZWVtYXAucGFkZGluZ0xlZnQgPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ0xlZnQgPSB0eXBlb2YgeCA9PT0gImZ1bmN0aW9uIiA/IHggOiBjb25zdGFudCRuKCt4KSwgdHJlZW1hcCkgOiBwYWRkaW5nTGVmdDsKICAgICAgfTsKCiAgICAgIHJldHVybiB0cmVlbWFwOwogICAgfQoKICAgIGZ1bmN0aW9uIGJpbmFyeSQxKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdmFyIG5vZGVzID0gcGFyZW50LmNoaWxkcmVuLAogICAgICAgICAgaSwgbiA9IG5vZGVzLmxlbmd0aCwKICAgICAgICAgIHN1bSwgc3VtcyA9IG5ldyBBcnJheShuICsgMSk7CgogICAgICBmb3IgKHN1bXNbMF0gPSBzdW0gPSBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgIHN1bXNbaSArIDFdID0gc3VtICs9IG5vZGVzW2ldLnZhbHVlOwogICAgICB9CgogICAgICBwYXJ0aXRpb24oMCwgbiwgcGFyZW50LnZhbHVlLCB4MCwgeTAsIHgxLCB5MSk7CgogICAgICBmdW5jdGlvbiBwYXJ0aXRpb24oaSwgaiwgdmFsdWUsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgICAgaWYgKGkgPj0gaiAtIDEpIHsKICAgICAgICAgIHZhciBub2RlID0gbm9kZXNbaV07CiAgICAgICAgICBub2RlLngwID0geDAsIG5vZGUueTAgPSB5MDsKICAgICAgICAgIG5vZGUueDEgPSB4MSwgbm9kZS55MSA9IHkxOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdmFyIHZhbHVlT2Zmc2V0ID0gc3Vtc1tpXSwKICAgICAgICAgICAgdmFsdWVUYXJnZXQgPSAodmFsdWUgLyAyKSArIHZhbHVlT2Zmc2V0LAogICAgICAgICAgICBrID0gaSArIDEsCiAgICAgICAgICAgIGhpID0gaiAtIDE7CgogICAgICAgIHdoaWxlIChrIDwgaGkpIHsKICAgICAgICAgIHZhciBtaWQgPSBrICsgaGkgPj4+IDE7CiAgICAgICAgICBpZiAoc3Vtc1ttaWRdIDwgdmFsdWVUYXJnZXQpIGsgPSBtaWQgKyAxOwogICAgICAgICAgZWxzZSBoaSA9IG1pZDsKICAgICAgICB9CgogICAgICAgIGlmICgodmFsdWVUYXJnZXQgLSBzdW1zW2sgLSAxXSkgPCAoc3Vtc1trXSAtIHZhbHVlVGFyZ2V0KSAmJiBpICsgMSA8IGspIC0tazsKCiAgICAgICAgdmFyIHZhbHVlTGVmdCA9IHN1bXNba10gLSB2YWx1ZU9mZnNldCwKICAgICAgICAgICAgdmFsdWVSaWdodCA9IHZhbHVlIC0gdmFsdWVMZWZ0OwoKICAgICAgICBpZiAoKHgxIC0geDApID4gKHkxIC0geTApKSB7CiAgICAgICAgICB2YXIgeGsgPSAoeDAgKiB2YWx1ZVJpZ2h0ICsgeDEgKiB2YWx1ZUxlZnQpIC8gdmFsdWU7CiAgICAgICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHhrLCB5MSk7CiAgICAgICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeGssIHkwLCB4MSwgeTEpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgeWsgPSAoeTAgKiB2YWx1ZVJpZ2h0ICsgeTEgKiB2YWx1ZUxlZnQpIC8gdmFsdWU7CiAgICAgICAgICBwYXJ0aXRpb24oaSwgaywgdmFsdWVMZWZ0LCB4MCwgeTAsIHgxLCB5ayk7CiAgICAgICAgICBwYXJ0aXRpb24oaywgaiwgdmFsdWVSaWdodCwgeDAsIHlrLCB4MSwgeTEpOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNsaWNlRGljZSQxKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgKHBhcmVudC5kZXB0aCAmIDEgPyB0cmVlbWFwU2xpY2UkMSA6IHRyZWVtYXBEaWNlJDEpKHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpOwogICAgfQoKICAgIHZhciByZXNxdWFyaWZ5JDEgPSAoZnVuY3Rpb24gY3VzdG9tKHJhdGlvKSB7CgogICAgICBmdW5jdGlvbiByZXNxdWFyaWZ5KHBhcmVudCwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgICBpZiAoKHJvd3MgPSBwYXJlbnQuX3NxdWFyaWZ5KSAmJiAocm93cy5yYXRpbyA9PT0gcmF0aW8pKSB7CiAgICAgICAgICB2YXIgcm93cywKICAgICAgICAgICAgICByb3csCiAgICAgICAgICAgICAgbm9kZXMsCiAgICAgICAgICAgICAgaSwKICAgICAgICAgICAgICBqID0gLTEsCiAgICAgICAgICAgICAgbiwKICAgICAgICAgICAgICBtID0gcm93cy5sZW5ndGgsCiAgICAgICAgICAgICAgdmFsdWUgPSBwYXJlbnQudmFsdWU7CgogICAgICAgICAgd2hpbGUgKCsraiA8IG0pIHsKICAgICAgICAgICAgcm93ID0gcm93c1tqXSwgbm9kZXMgPSByb3cuY2hpbGRyZW47CiAgICAgICAgICAgIGZvciAoaSA9IHJvdy52YWx1ZSA9IDAsIG4gPSBub2Rlcy5sZW5ndGg7IGkgPCBuOyArK2kpIHJvdy52YWx1ZSArPSBub2Rlc1tpXS52YWx1ZTsKICAgICAgICAgICAgaWYgKHJvdy5kaWNlKSB0cmVlbWFwRGljZSQxKHJvdywgeDAsIHkwLCB4MSwgeTAgKz0gKHkxIC0geTApICogcm93LnZhbHVlIC8gdmFsdWUpOwogICAgICAgICAgICBlbHNlIHRyZWVtYXBTbGljZSQxKHJvdywgeDAsIHkwLCB4MCArPSAoeDEgLSB4MCkgKiByb3cudmFsdWUgLyB2YWx1ZSwgeTEpOwogICAgICAgICAgICB2YWx1ZSAtPSByb3cudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHBhcmVudC5fc3F1YXJpZnkgPSByb3dzID0gc3F1YXJpZnlSYXRpbyQxKHJhdGlvLCBwYXJlbnQsIHgwLCB5MCwgeDEsIHkxKTsKICAgICAgICAgIHJvd3MucmF0aW8gPSByYXRpbzsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJlc3F1YXJpZnkucmF0aW8gPSBmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgoeCA9ICt4KSA+IDEgPyB4IDogMSk7CiAgICAgIH07CgogICAgICByZXR1cm4gcmVzcXVhcmlmeTsKICAgIH0pKHBoaSQxKTsKCiAgICBmdW5jdGlvbiBkZWZpbmUkMyhjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7CiAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRlbmQkMyhwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7CiAgICAgIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTsKICAgICAgcmV0dXJuIHByb3RvdHlwZTsKICAgIH0KCiAgICBmdW5jdGlvbiBDb2xvciQzKCkge30KCiAgICB2YXIgZGFya2VyJDMgPSAwLjc7CiAgICB2YXIgYnJpZ2h0ZXIkMyA9IDEgLyBkYXJrZXIkMzsKCiAgICB2YXIgcmVJJDMgPSAiXFxzKihbKy1dP1xcZCspXFxzKiIsCiAgICAgICAgcmVOJDMgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgICAgICByZVAkMyA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIiwKICAgICAgICByZUhleCQyID0gL14jKFswLTlhLWZdezMsOH0pJC8sCiAgICAgICAgcmVSZ2JJbnRlZ2VyJDMgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZUkkMywgcmVJJDMsIHJlSSQzXSArICJcXCkkIiksCiAgICAgICAgcmVSZ2JQZXJjZW50JDMgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZVAkMywgcmVQJDMsIHJlUCQzXSArICJcXCkkIiksCiAgICAgICAgcmVSZ2JhSW50ZWdlciQzID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlSSQzLCByZUkkMywgcmVJJDMsIHJlTiQzXSArICJcXCkkIiksCiAgICAgICAgcmVSZ2JhUGVyY2VudCQzID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlUCQzLCByZVAkMywgcmVQJDMsIHJlTiQzXSArICJcXCkkIiksCiAgICAgICAgcmVIc2xQZXJjZW50JDMgPSBuZXcgUmVnRXhwKCJeaHNsXFwoIiArIFtyZU4kMywgcmVQJDMsIHJlUCQzXSArICJcXCkkIiksCiAgICAgICAgcmVIc2xhUGVyY2VudCQzID0gbmV3IFJlZ0V4cCgiXmhzbGFcXCgiICsgW3JlTiQzLCByZVAkMywgcmVQJDMsIHJlTiQzXSArICJcXCkkIik7CgogICAgdmFyIG5hbWVkJDMgPSB7CiAgICAgIGFsaWNlYmx1ZTogMHhmMGY4ZmYsCiAgICAgIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsCiAgICAgIGFxdWE6IDB4MDBmZmZmLAogICAgICBhcXVhbWFyaW5lOiAweDdmZmZkNCwKICAgICAgYXp1cmU6IDB4ZjBmZmZmLAogICAgICBiZWlnZTogMHhmNWY1ZGMsCiAgICAgIGJpc3F1ZTogMHhmZmU0YzQsCiAgICAgIGJsYWNrOiAweDAwMDAwMCwKICAgICAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLAogICAgICBibHVlOiAweDAwMDBmZiwKICAgICAgYmx1ZXZpb2xldDogMHg4YTJiZTIsCiAgICAgIGJyb3duOiAweGE1MmEyYSwKICAgICAgYnVybHl3b29kOiAweGRlYjg4NywKICAgICAgY2FkZXRibHVlOiAweDVmOWVhMCwKICAgICAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsCiAgICAgIGNob2NvbGF0ZTogMHhkMjY5MWUsCiAgICAgIGNvcmFsOiAweGZmN2Y1MCwKICAgICAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLAogICAgICBjb3Juc2lsazogMHhmZmY4ZGMsCiAgICAgIGNyaW1zb246IDB4ZGMxNDNjLAogICAgICBjeWFuOiAweDAwZmZmZiwKICAgICAgZGFya2JsdWU6IDB4MDAwMDhiLAogICAgICBkYXJrY3lhbjogMHgwMDhiOGIsCiAgICAgIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLAogICAgICBkYXJrZ3JheTogMHhhOWE5YTksCiAgICAgIGRhcmtncmVlbjogMHgwMDY0MDAsCiAgICAgIGRhcmtncmV5OiAweGE5YTlhOSwKICAgICAgZGFya2toYWtpOiAweGJkYjc2YiwKICAgICAgZGFya21hZ2VudGE6IDB4OGIwMDhiLAogICAgICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsCiAgICAgIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLAogICAgICBkYXJrb3JjaGlkOiAweDk5MzJjYywKICAgICAgZGFya3JlZDogMHg4YjAwMDAsCiAgICAgIGRhcmtzYWxtb246IDB4ZTk5NjdhLAogICAgICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLAogICAgICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YiwKICAgICAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsCiAgICAgIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLAogICAgICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSwKICAgICAgZGFya3Zpb2xldDogMHg5NDAwZDMsCiAgICAgIGRlZXBwaW5rOiAweGZmMTQ5MywKICAgICAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLAogICAgICBkaW1ncmF5OiAweDY5Njk2OSwKICAgICAgZGltZ3JleTogMHg2OTY5NjksCiAgICAgIGRvZGdlcmJsdWU6IDB4MWU5MGZmLAogICAgICBmaXJlYnJpY2s6IDB4YjIyMjIyLAogICAgICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsCiAgICAgIGZvcmVzdGdyZWVuOiAweDIyOGIyMiwKICAgICAgZnVjaHNpYTogMHhmZjAwZmYsCiAgICAgIGdhaW5zYm9ybzogMHhkY2RjZGMsCiAgICAgIGdob3N0d2hpdGU6IDB4ZjhmOGZmLAogICAgICBnb2xkOiAweGZmZDcwMCwKICAgICAgZ29sZGVucm9kOiAweGRhYTUyMCwKICAgICAgZ3JheTogMHg4MDgwODAsCiAgICAgIGdyZWVuOiAweDAwODAwMCwKICAgICAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLAogICAgICBncmV5OiAweDgwODA4MCwKICAgICAgaG9uZXlkZXc6IDB4ZjBmZmYwLAogICAgICBob3RwaW5rOiAweGZmNjliNCwKICAgICAgaW5kaWFucmVkOiAweGNkNWM1YywKICAgICAgaW5kaWdvOiAweDRiMDA4MiwKICAgICAgaXZvcnk6IDB4ZmZmZmYwLAogICAgICBraGFraTogMHhmMGU2OGMsCiAgICAgIGxhdmVuZGVyOiAweGU2ZTZmYSwKICAgICAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsCiAgICAgIGxhd25ncmVlbjogMHg3Y2ZjMDAsCiAgICAgIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsCiAgICAgIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsCiAgICAgIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLAogICAgICBsaWdodGN5YW46IDB4ZTBmZmZmLAogICAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsCiAgICAgIGxpZ2h0Z3JheTogMHhkM2QzZDMsCiAgICAgIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLAogICAgICBsaWdodGdyZXk6IDB4ZDNkM2QzLAogICAgICBsaWdodHBpbms6IDB4ZmZiNmMxLAogICAgICBsaWdodHNhbG1vbjogMHhmZmEwN2EsCiAgICAgIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLAogICAgICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLAogICAgICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksCiAgICAgIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSwKICAgICAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLAogICAgICBsaWdodHllbGxvdzogMHhmZmZmZTAsCiAgICAgIGxpbWU6IDB4MDBmZjAwLAogICAgICBsaW1lZ3JlZW46IDB4MzJjZDMyLAogICAgICBsaW5lbjogMHhmYWYwZTYsCiAgICAgIG1hZ2VudGE6IDB4ZmYwMGZmLAogICAgICBtYXJvb246IDB4ODAwMDAwLAogICAgICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwKICAgICAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsCiAgICAgIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsCiAgICAgIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsCiAgICAgIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSwKICAgICAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSwKICAgICAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLAogICAgICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLAogICAgICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LAogICAgICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLAogICAgICBtaW50Y3JlYW06IDB4ZjVmZmZhLAogICAgICBtaXN0eXJvc2U6IDB4ZmZlNGUxLAogICAgICBtb2NjYXNpbjogMHhmZmU0YjUsCiAgICAgIG5hdmFqb3doaXRlOiAweGZmZGVhZCwKICAgICAgbmF2eTogMHgwMDAwODAsCiAgICAgIG9sZGxhY2U6IDB4ZmRmNWU2LAogICAgICBvbGl2ZTogMHg4MDgwMDAsCiAgICAgIG9saXZlZHJhYjogMHg2YjhlMjMsCiAgICAgIG9yYW5nZTogMHhmZmE1MDAsCiAgICAgIG9yYW5nZXJlZDogMHhmZjQ1MDAsCiAgICAgIG9yY2hpZDogMHhkYTcwZDYsCiAgICAgIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLAogICAgICBwYWxlZ3JlZW46IDB4OThmYjk4LAogICAgICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSwKICAgICAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsCiAgICAgIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LAogICAgICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LAogICAgICBwZXJ1OiAweGNkODUzZiwKICAgICAgcGluazogMHhmZmMwY2IsCiAgICAgIHBsdW06IDB4ZGRhMGRkLAogICAgICBwb3dkZXJibHVlOiAweGIwZTBlNiwKICAgICAgcHVycGxlOiAweDgwMDA4MCwKICAgICAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksCiAgICAgIHJlZDogMHhmZjAwMDAsCiAgICAgIHJvc3licm93bjogMHhiYzhmOGYsCiAgICAgIHJveWFsYmx1ZTogMHg0MTY5ZTEsCiAgICAgIHNhZGRsZWJyb3duOiAweDhiNDUxMywKICAgICAgc2FsbW9uOiAweGZhODA3MiwKICAgICAgc2FuZHlicm93bjogMHhmNGE0NjAsCiAgICAgIHNlYWdyZWVuOiAweDJlOGI1NywKICAgICAgc2Vhc2hlbGw6IDB4ZmZmNWVlLAogICAgICBzaWVubmE6IDB4YTA1MjJkLAogICAgICBzaWx2ZXI6IDB4YzBjMGMwLAogICAgICBza3libHVlOiAweDg3Y2VlYiwKICAgICAgc2xhdGVibHVlOiAweDZhNWFjZCwKICAgICAgc2xhdGVncmF5OiAweDcwODA5MCwKICAgICAgc2xhdGVncmV5OiAweDcwODA5MCwKICAgICAgc25vdzogMHhmZmZhZmEsCiAgICAgIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwKICAgICAgc3RlZWxibHVlOiAweDQ2ODJiNCwKICAgICAgdGFuOiAweGQyYjQ4YywKICAgICAgdGVhbDogMHgwMDgwODAsCiAgICAgIHRoaXN0bGU6IDB4ZDhiZmQ4LAogICAgICB0b21hdG86IDB4ZmY2MzQ3LAogICAgICB0dXJxdW9pc2U6IDB4NDBlMGQwLAogICAgICB2aW9sZXQ6IDB4ZWU4MmVlLAogICAgICB3aGVhdDogMHhmNWRlYjMsCiAgICAgIHdoaXRlOiAweGZmZmZmZiwKICAgICAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsCiAgICAgIHllbGxvdzogMHhmZmZmMDAsCiAgICAgIHllbGxvd2dyZWVuOiAweDlhY2QzMgogICAgfTsKCiAgICBkZWZpbmUkMyhDb2xvciQzLCBjb2xvciQzLCB7CiAgICAgIGNvcHk6IGZ1bmN0aW9uKGNoYW5uZWxzKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgICAgIH0sCiAgICAgIGhleDogY29sb3JfZm9ybWF0SGV4JDIsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICAgIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4JDIsCiAgICAgIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsJDIsCiAgICAgIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiJDIsCiAgICAgIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2IkMgogICAgfSk7CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4JDIoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCQyKCkgewogICAgICByZXR1cm4gaHNsQ29udmVydCQzKHRoaXMpLmZvcm1hdEhzbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYiQyKCkgewogICAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvciQzKGZvcm1hdCkgewogICAgICB2YXIgbSwgbDsKICAgICAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgcmV0dXJuIChtID0gcmVIZXgkMi5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4kMyhtKSAvLyAjZmYwMDAwCiAgICAgICAgICA6IGwgPT09IDMgPyBuZXcgUmdiJDMoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMAogICAgICAgICAgOiBsID09PSA4ID8gcmdiYSQzKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMAogICAgICAgICAgOiBsID09PSA0ID8gcmdiYSQzKChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDAKICAgICAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXgKICAgICAgICAgIDogKG0gPSByZVJnYkludGVnZXIkMy5leGVjKGZvcm1hdCkpID8gbmV3IFJnYiQzKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApCiAgICAgICAgICA6IChtID0gcmVSZ2JQZXJjZW50JDMuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IkMyhtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKQogICAgICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIkMy5leGVjKGZvcm1hdCkpID8gcmdiYSQzKG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQkMy5leGVjKGZvcm1hdCkpID8gcmdiYSQzKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpCiAgICAgICAgICA6IChtID0gcmVIc2xQZXJjZW50JDMuZXhlYyhmb3JtYXQpKSA/IGhzbGEkMyhtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSkKICAgICAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50JDMuZXhlYyhmb3JtYXQpKSA/IGhzbGEkMyhtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICAgICAgICA6IG5hbWVkJDMuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4kMyhuYW1lZCQzW2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICAgICAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IkMyhOYU4sIE5hTiwgTmFOLCAwKQogICAgICAgICAgOiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYm4kMyhuKSB7CiAgICAgIHJldHVybiBuZXcgUmdiJDMobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JhJDMociwgZywgYiwgYSkgewogICAgICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47CiAgICAgIHJldHVybiBuZXcgUmdiJDMociwgZywgYiwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiQ29udmVydCQzKG8pIHsKICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yJDMpKSBvID0gY29sb3IkMyhvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYiQzOwogICAgICBvID0gby5yZ2IoKTsKICAgICAgcmV0dXJuIG5ldyBSZ2IkMyhvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYiQzKHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0JDMocikgOiBuZXcgUmdiJDMociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIFJnYiQzKHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5yID0gK3I7CiAgICAgIHRoaXMuZyA9ICtnOwogICAgICB0aGlzLmIgPSArYjsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDMoUmdiJDMsIHJnYiQzLCBleHRlbmQkMyhDb2xvciQzLCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyJDMgOiBNYXRoLnBvdyhicmlnaHRlciQzLCBrKTsKICAgICAgICByZXR1cm4gbmV3IFJnYiQzKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIkMyA6IE1hdGgucG93KGRhcmtlciQzLCBrKTsKICAgICAgICByZXR1cm4gbmV3IFJnYiQzKHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIHJnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KQogICAgICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICAgICAgfSwKICAgICAgaGV4OiByZ2JfZm9ybWF0SGV4JDIsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICAgIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCQyLAogICAgICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IkMiwKICAgICAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2IkMgogICAgfSkpOwoKICAgIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgkMigpIHsKICAgICAgcmV0dXJuICIjIiArIGhleCQyKHRoaXMucikgKyBoZXgkMih0aGlzLmcpICsgaGV4JDIodGhpcy5iKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JfZm9ybWF0UmdiJDIoKSB7CiAgICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgICByZXR1cm4gKGEgPT09IDEgPyAicmdiKCIgOiAicmdiYSgiKQogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyAiLCAiCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmcpIHx8IDApKSArICIsICIKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpCiAgICAgICAgICArIChhID09PSAxID8gIikiIDogIiwgIiArIGEgKyAiKSIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhleCQyKHZhbHVlKSB7CiAgICAgIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgICAgIHJldHVybiAodmFsdWUgPCAxNiA/ICIwIiA6ICIiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xhJDMoaCwgcywgbCwgYSkgewogICAgICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47CiAgICAgIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOOwogICAgICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICAgIHJldHVybiBuZXcgSHNsJDMoaCwgcywgbCwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsQ29udmVydCQzKG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wkMykgcmV0dXJuIG5ldyBIc2wkMyhvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOwogICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IkMykpIG8gPSBjb2xvciQzKG8pOwogICAgICBpZiAoIW8pIHJldHVybiBuZXcgSHNsJDM7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgSHNsJDMpIHJldHVybiBvOwogICAgICBvID0gby5yZ2IoKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksCiAgICAgICAgICBoID0gTmFOLAogICAgICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7CiAgICAgIGlmIChzKSB7CiAgICAgICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICAgICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyOwogICAgICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDsKICAgICAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgICAgIGggKj0gNjA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBIc2wkMyhoLCBzLCBsLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhzbCQ1KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0JDMoaCkgOiBuZXcgSHNsJDMoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIEhzbCQzKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5oID0gK2g7CiAgICAgIHRoaXMucyA9ICtzOwogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDMoSHNsJDMsIGhzbCQ1LCBleHRlbmQkMyhDb2xvciQzLCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyJDMgOiBNYXRoLnBvdyhicmlnaHRlciQzLCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCQzKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gZGFya2VyJDMgOiBNYXRoLnBvdyhkYXJrZXIkMywgayk7CiAgICAgICAgcmV0dXJuIG5ldyBIc2wkMyh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCwKICAgICAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLAogICAgICAgICAgICBsID0gdGhpcy5sLAogICAgICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLAogICAgICAgICAgICBtMSA9IDIgKiBsIC0gbTI7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkMygKICAgICAgICAgIGhzbDJyZ2IkMyhoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYiQzKGgsIG0xLCBtMiksCiAgICAgICAgICBoc2wycmdiJDMoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLAogICAgICAgICAgdGhpcy5vcGFjaXR5CiAgICAgICAgKTsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9LAogICAgICBmb3JtYXRIc2w6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgICAgIHJldHVybiAoYSA9PT0gMSA/ICJoc2woIiA6ICJoc2xhKCIpCiAgICAgICAgICAgICsgKHRoaXMuaCB8fCAwKSArICIsICIKICAgICAgICAgICAgKyAodGhpcy5zIHx8IDApICogMTAwICsgIiUsICIKICAgICAgICAgICAgKyAodGhpcy5sIHx8IDApICogMTAwICsgIiUiCiAgICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICAgIH0KICAgIH0pKTsKCiAgICAvKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovCiAgICBmdW5jdGlvbiBoc2wycmdiJDMoaCwgbTEsIG0yKSB7CiAgICAgIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjAKICAgICAgICAgIDogaCA8IDE4MCA/IG0yCiAgICAgICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwCiAgICAgICAgICA6IG0xKSAqIDI1NTsKICAgIH0KCiAgICB2YXIgZGVnMnJhZCQyID0gTWF0aC5QSSAvIDE4MDsKICAgIHZhciByYWQyZGVnJDIgPSAxODAgLyBNYXRoLlBJOwoKICAgIC8vIGh0dHBzOi8vb2JzZXJ2YWJsZWhxLmNvbS9AbWJvc3RvY2svbGFiLWFuZC1yZ2IKICAgIHZhciBLJDEgPSAxOCwKICAgICAgICBYbiQyID0gMC45NjQyMiwKICAgICAgICBZbiQyID0gMSwKICAgICAgICBabiQyID0gMC44MjUyMSwKICAgICAgICB0MCQzID0gNCAvIDI5LAogICAgICAgIHQxJDMgPSA2IC8gMjksCiAgICAgICAgdDIkMiA9IDMgKiB0MSQzICogdDEkMywKICAgICAgICB0MyQyID0gdDEkMyAqIHQxJDMgKiB0MSQzOwoKICAgIGZ1bmN0aW9uIGxhYkNvbnZlcnQkMihvKSB7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgTGFiJDIpIHJldHVybiBuZXcgTGFiJDIoby5sLCBvLmEsIG8uYiwgby5vcGFjaXR5KTsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIY2wkMikgcmV0dXJuIGhjbDJsYWIkMShvKTsKICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYiQzKSkgbyA9IHJnYkNvbnZlcnQkMyhvKTsKICAgICAgdmFyIHIgPSByZ2IybHJnYiQxKG8uciksCiAgICAgICAgICBnID0gcmdiMmxyZ2IkMShvLmcpLAogICAgICAgICAgYiA9IHJnYjJscmdiJDEoby5iKSwKICAgICAgICAgIHkgPSB4eXoybGFiJDIoKDAuMjIyNTA0NSAqIHIgKyAwLjcxNjg3ODYgKiBnICsgMC4wNjA2MTY5ICogYikgLyBZbiQyKSwgeCwgejsKICAgICAgaWYgKHIgPT09IGcgJiYgZyA9PT0gYikgeCA9IHogPSB5OyBlbHNlIHsKICAgICAgICB4ID0geHl6MmxhYiQyKCgwLjQzNjA3NDcgKiByICsgMC4zODUwNjQ5ICogZyArIDAuMTQzMDgwNCAqIGIpIC8gWG4kMik7CiAgICAgICAgeiA9IHh5ejJsYWIkMigoMC4wMTM5MzIyICogciArIDAuMDk3MTA0NSAqIGcgKyAwLjcxNDE3MzMgKiBiKSAvIFpuJDIpOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgTGFiJDIoMTE2ICogeSAtIDE2LCA1MDAgKiAoeCAtIHkpLCAyMDAgKiAoeSAtIHopLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGxhYiQzKGwsIGEsIGIsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBsYWJDb252ZXJ0JDIobCkgOiBuZXcgTGFiJDIobCwgYSwgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIExhYiQyKGwsIGEsIGIsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5sID0gK2w7CiAgICAgIHRoaXMuYSA9ICthOwogICAgICB0aGlzLmIgPSArYjsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDMoTGFiJDIsIGxhYiQzLCBleHRlbmQkMyhDb2xvciQzLCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMYWIkMih0aGlzLmwgKyBLJDEgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMYWIkMih0aGlzLmwgLSBLJDEgKiAoayA9PSBudWxsID8gMSA6IGspLCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgeSA9ICh0aGlzLmwgKyAxNikgLyAxMTYsCiAgICAgICAgICAgIHggPSBpc05hTih0aGlzLmEpID8geSA6IHkgKyB0aGlzLmEgLyA1MDAsCiAgICAgICAgICAgIHogPSBpc05hTih0aGlzLmIpID8geSA6IHkgLSB0aGlzLmIgLyAyMDA7CiAgICAgICAgeCA9IFhuJDIgKiBsYWIyeHl6JDIoeCk7CiAgICAgICAgeSA9IFluJDIgKiBsYWIyeHl6JDIoeSk7CiAgICAgICAgeiA9IFpuJDIgKiBsYWIyeHl6JDIoeik7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkMygKICAgICAgICAgIGxyZ2IycmdiJDEoIDMuMTMzODU2MSAqIHggLSAxLjYxNjg2NjcgKiB5IC0gMC40OTA2MTQ2ICogeiksCiAgICAgICAgICBscmdiMnJnYiQxKC0wLjk3ODc2ODQgKiB4ICsgMS45MTYxNDE1ICogeSArIDAuMDMzNDU0MCAqIHopLAogICAgICAgICAgbHJnYjJyZ2IkMSggMC4wNzE5NDUzICogeCAtIDAuMjI4OTkxNCAqIHkgKyAxLjQwNTI0MjcgKiB6KSwKICAgICAgICAgIHRoaXMub3BhY2l0eQogICAgICAgICk7CiAgICAgIH0KICAgIH0pKTsKCiAgICBmdW5jdGlvbiB4eXoybGFiJDIodCkgewogICAgICByZXR1cm4gdCA+IHQzJDIgPyBNYXRoLnBvdyh0LCAxIC8gMykgOiB0IC8gdDIkMiArIHQwJDM7CiAgICB9CgogICAgZnVuY3Rpb24gbGFiMnh5eiQyKHQpIHsKICAgICAgcmV0dXJuIHQgPiB0MSQzID8gdCAqIHQgKiB0IDogdDIkMiAqICh0IC0gdDAkMyk7CiAgICB9CgogICAgZnVuY3Rpb24gbHJnYjJyZ2IkMSh4KSB7CiAgICAgIHJldHVybiAyNTUgKiAoeCA8PSAwLjAwMzEzMDggPyAxMi45MiAqIHggOiAxLjA1NSAqIE1hdGgucG93KHgsIDEgLyAyLjQpIC0gMC4wNTUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYjJscmdiJDEoeCkgewogICAgICByZXR1cm4gKHggLz0gMjU1KSA8PSAwLjA0MDQ1ID8geCAvIDEyLjkyIDogTWF0aC5wb3coKHggKyAwLjA1NSkgLyAxLjA1NSwgMi40KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2xDb252ZXJ0JDIobykgewogICAgICBpZiAobyBpbnN0YW5jZW9mIEhjbCQyKSByZXR1cm4gbmV3IEhjbCQyKG8uaCwgby5jLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBMYWIkMikpIG8gPSBsYWJDb252ZXJ0JDIobyk7CiAgICAgIGlmIChvLmEgPT09IDAgJiYgby5iID09PSAwKSByZXR1cm4gbmV3IEhjbCQyKE5hTiwgMCA8IG8ubCAmJiBvLmwgPCAxMDAgPyAwIDogTmFOLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIHZhciBoID0gTWF0aC5hdGFuMihvLmIsIG8uYSkgKiByYWQyZGVnJDI7CiAgICAgIHJldHVybiBuZXcgSGNsJDIoaCA8IDAgPyBoICsgMzYwIDogaCwgTWF0aC5zcXJ0KG8uYSAqIG8uYSArIG8uYiAqIG8uYiksIG8ubCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoY2wkNChoLCBjLCBsLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaGNsQ29udmVydCQyKGgpIDogbmV3IEhjbCQyKGgsIGMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBIY2wkMihoLCBjLCBsLCBvcGFjaXR5KSB7CiAgICAgIHRoaXMuaCA9ICtoOwogICAgICB0aGlzLmMgPSArYzsKICAgICAgdGhpcy5sID0gK2w7CiAgICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogICAgfQoKICAgIGZ1bmN0aW9uIGhjbDJsYWIkMShvKSB7CiAgICAgIGlmIChpc05hTihvLmgpKSByZXR1cm4gbmV3IExhYiQyKG8ubCwgMCwgMCwgby5vcGFjaXR5KTsKICAgICAgdmFyIGggPSBvLmggKiBkZWcycmFkJDI7CiAgICAgIHJldHVybiBuZXcgTGFiJDIoby5sLCBNYXRoLmNvcyhoKSAqIG8uYywgTWF0aC5zaW4oaCkgKiBvLmMsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZGVmaW5lJDMoSGNsJDIsIGhjbCQ0LCBleHRlbmQkMyhDb2xvciQzLCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBIY2wkMih0aGlzLmgsIHRoaXMuYywgdGhpcy5sICsgSyQxICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIG5ldyBIY2wkMih0aGlzLmgsIHRoaXMuYywgdGhpcy5sIC0gSyQxICogKGsgPT0gbnVsbCA/IDEgOiBrKSwgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gaGNsMmxhYiQxKHRoaXMpLnJnYigpOwogICAgICB9CiAgICB9KSk7CgogICAgdmFyIEEkMiA9IC0wLjE0ODYxLAogICAgICAgIEIkMiA9ICsxLjc4Mjc3LAogICAgICAgIEMkMiA9IC0wLjI5MjI3LAogICAgICAgIEQkMiA9IC0wLjkwNjQ5LAogICAgICAgIEUkMiA9ICsxLjk3Mjk0LAogICAgICAgIEVEJDIgPSBFJDIgKiBEJDIsCiAgICAgICAgRUIkMiA9IEUkMiAqIEIkMiwKICAgICAgICBCQ19EQSQyID0gQiQyICogQyQyIC0gRCQyICogQSQyOwoKICAgIGZ1bmN0aW9uIGN1YmVoZWxpeENvbnZlcnQkMihvKSB7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgQ3ViZWhlbGl4JDIpIHJldHVybiBuZXcgQ3ViZWhlbGl4JDIoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIFJnYiQzKSkgbyA9IHJnYkNvbnZlcnQkMyhvKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIGwgPSAoQkNfREEkMiAqIGIgKyBFRCQyICogciAtIEVCJDIgKiBnKSAvIChCQ19EQSQyICsgRUQkMiAtIEVCJDIpLAogICAgICAgICAgYmwgPSBiIC0gbCwKICAgICAgICAgIGsgPSAoRSQyICogKGcgLSBsKSAtIEMkMiAqIGJsKSAvIEQkMiwKICAgICAgICAgIHMgPSBNYXRoLnNxcnQoayAqIGsgKyBibCAqIGJsKSAvIChFJDIgKiBsICogKDEgLSBsKSksIC8vIE5hTiBpZiBsPTAgb3IgbD0xCiAgICAgICAgICBoID0gcyA/IE1hdGguYXRhbjIoaywgYmwpICogcmFkMmRlZyQyIC0gMTIwIDogTmFOOwogICAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCQyKGggPCAwID8gaCArIDM2MCA6IGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3ViZWhlbGl4JDUoaCwgcywgbCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGN1YmVoZWxpeENvbnZlcnQkMihoKSA6IG5ldyBDdWJlaGVsaXgkMihoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gQ3ViZWhlbGl4JDIoaCwgcywgbCwgb3BhY2l0eSkgewogICAgICB0aGlzLmggPSAraDsKICAgICAgdGhpcy5zID0gK3M7CiAgICAgIHRoaXMubCA9ICtsOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUkMyhDdWJlaGVsaXgkMiwgY3ViZWhlbGl4JDUsIGV4dGVuZCQzKENvbG9yJDMsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIkMyA6IE1hdGgucG93KGJyaWdodGVyJDMsIGspOwogICAgICAgIHJldHVybiBuZXcgQ3ViZWhlbGl4JDIodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIkMyA6IE1hdGgucG93KGRhcmtlciQzLCBrKTsKICAgICAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCQyKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBoID0gaXNOYU4odGhpcy5oKSA/IDAgOiAodGhpcy5oICsgMTIwKSAqIGRlZzJyYWQkMiwKICAgICAgICAgICAgbCA9ICt0aGlzLmwsCiAgICAgICAgICAgIGEgPSBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucyAqIGwgKiAoMSAtIGwpLAogICAgICAgICAgICBjb3NoID0gTWF0aC5jb3MoaCksCiAgICAgICAgICAgIHNpbmggPSBNYXRoLnNpbihoKTsKICAgICAgICByZXR1cm4gbmV3IFJnYiQzKAogICAgICAgICAgMjU1ICogKGwgKyBhICogKEEkMiAqIGNvc2ggKyBCJDIgKiBzaW5oKSksCiAgICAgICAgICAyNTUgKiAobCArIGEgKiAoQyQyICogY29zaCArIEQkMiAqIHNpbmgpKSwKICAgICAgICAgIDI1NSAqIChsICsgYSAqIChFJDIgKiBjb3NoKSksCiAgICAgICAgICB0aGlzLm9wYWNpdHkKICAgICAgICApOwogICAgICB9CiAgICB9KSk7CgogICAgZnVuY3Rpb24gYmFzaXMkMyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsKICAgICAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxOwogICAgICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjAKICAgICAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjEKICAgICAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjIKICAgICAgICAgICsgdDMgKiB2MykgLyA2OwogICAgfQoKICAgIGZ1bmN0aW9uIGJhc2lzJDQodmFsdWVzKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSwKICAgICAgICAgICAgdjEgPSB2YWx1ZXNbaV0sCiAgICAgICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSwKICAgICAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MiwKICAgICAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7CiAgICAgICAgcmV0dXJuIGJhc2lzJDMoKHQgLSBpIC8gbikgKiBuLCB2MCwgdjEsIHYyLCB2Myk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYmFzaXNDbG9zZWQkMih2YWx1ZXMpIHsKICAgICAgdmFyIG4gPSB2YWx1ZXMubGVuZ3RoOwogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHZhciBpID0gTWF0aC5mbG9vcigoKHQgJT0gMSkgPCAwID8gKyt0IDogdCkgKiBuKSwKICAgICAgICAgICAgdjAgPSB2YWx1ZXNbKGkgKyBuIC0gMSkgJSBuXSwKICAgICAgICAgICAgdjEgPSB2YWx1ZXNbaSAlIG5dLAogICAgICAgICAgICB2MiA9IHZhbHVlc1soaSArIDEpICUgbl0sCiAgICAgICAgICAgIHYzID0gdmFsdWVzWyhpICsgMikgJSBuXTsKICAgICAgICByZXR1cm4gYmFzaXMkMygodCAtIGkgLyBuKSAqIG4sIHYwLCB2MSwgdjIsIHYzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudCRvKHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVhciQ1KGEsIGQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gYSArIHQgKiBkOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cG9uZW50aWFsJDMoYSwgYiwgeSkgewogICAgICByZXR1cm4gYSA9IE1hdGgucG93KGEsIHkpLCBiID0gTWF0aC5wb3coYiwgeSkgLSBhLCB5ID0gMSAvIHksIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gTWF0aC5wb3coYSArIHQgKiBiLCB5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBodWUkMihhLCBiKSB7CiAgICAgIHZhciBkID0gYiAtIGE7CiAgICAgIHJldHVybiBkID8gbGluZWFyJDUoYSwgZCA+IDE4MCB8fCBkIDwgLTE4MCA/IGQgLSAzNjAgKiBNYXRoLnJvdW5kKGQgLyAzNjApIDogZCkgOiBjb25zdGFudCRvKGlzTmFOKGEpID8gYiA6IGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGdhbW1hJDIoeSkgewogICAgICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hJDIgOiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwkMyhhLCBiLCB5KSA6IGNvbnN0YW50JG8oaXNOYU4oYSkgPyBiIDogYSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbm9nYW1tYSQyKGEsIGIpIHsKICAgICAgdmFyIGQgPSBiIC0gYTsKICAgICAgcmV0dXJuIGQgPyBsaW5lYXIkNShhLCBkKSA6IGNvbnN0YW50JG8oaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9CgogICAgdmFyIHJnYiQ0ID0gKGZ1bmN0aW9uIHJnYkdhbW1hKHkpIHsKICAgICAgdmFyIGNvbG9yID0gZ2FtbWEkMih5KTsKCiAgICAgIGZ1bmN0aW9uIHJnYihzdGFydCwgZW5kKSB7CiAgICAgICAgdmFyIHIgPSBjb2xvcigoc3RhcnQgPSByZ2IkMyhzdGFydCkpLnIsIChlbmQgPSByZ2IkMyhlbmQpKS5yKSwKICAgICAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSwKICAgICAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSwKICAgICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEkMihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHN0YXJ0LnIgPSByKHQpOwogICAgICAgICAgc3RhcnQuZyA9IGcodCk7CiAgICAgICAgICBzdGFydC5iID0gYih0KTsKICAgICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgcmdiLmdhbW1hID0gcmdiR2FtbWE7CgogICAgICByZXR1cm4gcmdiOwogICAgfSkoMSk7CgogICAgZnVuY3Rpb24gcmdiU3BsaW5lJDEoc3BsaW5lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHsKICAgICAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsCiAgICAgICAgICAgIHIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGcgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGksIGNvbG9yOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGNvbG9yID0gcmdiJDMoY29sb3JzW2ldKTsKICAgICAgICAgIHJbaV0gPSBjb2xvci5yIHx8IDA7CiAgICAgICAgICBnW2ldID0gY29sb3IuZyB8fCAwOwogICAgICAgICAgYltpXSA9IGNvbG9yLmIgfHwgMDsKICAgICAgICB9CiAgICAgICAgciA9IHNwbGluZShyKTsKICAgICAgICBnID0gc3BsaW5lKGcpOwogICAgICAgIGIgPSBzcGxpbmUoYik7CiAgICAgICAgY29sb3Iub3BhY2l0eSA9IDE7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIGNvbG9yLnIgPSByKHQpOwogICAgICAgICAgY29sb3IuZyA9IGcodCk7CiAgICAgICAgICBjb2xvci5iID0gYih0KTsKICAgICAgICAgIHJldHVybiBjb2xvciArICIiOwogICAgICAgIH07CiAgICAgIH07CiAgICB9CgogICAgdmFyIHJnYkJhc2lzJDEgPSByZ2JTcGxpbmUkMShiYXNpcyQ0KTsKICAgIHZhciByZ2JCYXNpc0Nsb3NlZCQxID0gcmdiU3BsaW5lJDEoYmFzaXNDbG9zZWQkMik7CgogICAgZnVuY3Rpb24gYXJyYXkkNShhLCBiKSB7CiAgICAgIHZhciBuYiA9IGIgPyBiLmxlbmd0aCA6IDAsCiAgICAgICAgICBuYSA9IGEgPyBNYXRoLm1pbihuYiwgYS5sZW5ndGgpIDogMCwKICAgICAgICAgIHggPSBuZXcgQXJyYXkobmEpLAogICAgICAgICAgYyA9IG5ldyBBcnJheShuYiksCiAgICAgICAgICBpOwoKICAgICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIHhbaV0gPSB2YWx1ZShhW2ldLCBiW2ldKTsKICAgICAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsKCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpOwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRhdGUkMyhhLCBiKSB7CiAgICAgIHZhciBkID0gbmV3IERhdGU7CiAgICAgIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBkLnNldFRpbWUoYSArIGIgKiB0KSwgZDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBudW1iZXIkNihhLCBiKSB7CiAgICAgIHJldHVybiBhID0gK2EsIGIgLT0gYSwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBhICsgYiAqIHQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb2JqZWN0JDQoYSwgYikgewogICAgICB2YXIgaSA9IHt9LAogICAgICAgICAgYyA9IHt9LAogICAgICAgICAgazsKCiAgICAgIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSAib2JqZWN0IikgYSA9IHt9OwogICAgICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gIm9iamVjdCIpIGIgPSB7fTsKCiAgICAgIGZvciAoayBpbiBiKSB7CiAgICAgICAgaWYgKGsgaW4gYSkgewogICAgICAgICAgaVtrXSA9IHZhbHVlKGFba10sIGJba10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjW2tdID0gYltrXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpOwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIHZhciByZUEkMiA9IC9bLStdPyg/OlxkK1wuP1xkKnxcLj9cZCspKD86W2VFXVstK10/XGQrKT8vZywKICAgICAgICByZUIkMiA9IG5ldyBSZWdFeHAocmVBJDIuc291cmNlLCAiZyIpOwoKICAgIGZ1bmN0aW9uIHplcm8kMihiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBvbmUkMihiKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGIodCkgKyAiIjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHJpbmcoYSwgYikgewogICAgICB2YXIgYmkgPSByZUEkMi5sYXN0SW5kZXggPSByZUIkMi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhCiAgICAgICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiCiAgICAgICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gcwogICAgICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAgIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4KICAgICAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsKCiAgICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICAgIHdoaWxlICgoYW0gPSByZUEkMi5leGVjKGEpKQogICAgICAgICAgJiYgKGJtID0gcmVCJDIuZXhlYyhiKSkpIHsKICAgICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGIKICAgICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgICAgIH0KICAgICAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJtOwogICAgICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzCiAgICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgICAgcS5wdXNoKHtpOiBpLCB4OiBudW1iZXIkNihhbSwgYm0pfSk7CiAgICAgICAgfQogICAgICAgIGJpID0gcmVCJDIubGFzdEluZGV4OwogICAgICB9CgogICAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgICBpZiAoYmkgPCBiLmxlbmd0aCkgewogICAgICAgIGJzID0gYi5zbGljZShiaSk7CiAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgZWxzZSBzWysraV0gPSBiczsKICAgICAgfQoKICAgICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAgIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuCiAgICAgIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXQogICAgICAgICAgPyBvbmUkMihxWzBdLngpCiAgICAgICAgICA6IHplcm8kMihiKSkKICAgICAgICAgIDogKGIgPSBxLmxlbmd0aCwgZnVuY3Rpb24odCkgewogICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBvOyBpIDwgYjsgKytpKSBzWyhvID0gcVtpXSkuaV0gPSBvLngodCk7CiAgICAgICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICAgICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHZhbHVlKGEsIGIpIHsKICAgICAgdmFyIHQgPSB0eXBlb2YgYiwgYzsKICAgICAgcmV0dXJuIGIgPT0gbnVsbCB8fCB0ID09PSAiYm9vbGVhbiIgPyBjb25zdGFudCRvKGIpCiAgICAgICAgICA6ICh0ID09PSAibnVtYmVyIiA/IG51bWJlciQ2CiAgICAgICAgICA6IHQgPT09ICJzdHJpbmciID8gKChjID0gY29sb3IkMyhiKSkgPyAoYiA9IGMsIHJnYiQ0KSA6IHN0cmluZykKICAgICAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yJDMgPyByZ2IkNAogICAgICAgICAgOiBiIGluc3RhbmNlb2YgRGF0ZSA/IGRhdGUkMwogICAgICAgICAgOiBBcnJheS5pc0FycmF5KGIpID8gYXJyYXkkNQogICAgICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0JDQKICAgICAgICAgIDogbnVtYmVyJDYpKGEsIGIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJvdW5kKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPSArYSwgYiAtPSBhLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYSArIGIgKiB0KTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgZGVncmVlcyQ0ID0gMTgwIC8gTWF0aC5QSTsKCiAgICB2YXIgaWRlbnRpdHkkZyA9IHsKICAgICAgdHJhbnNsYXRlWDogMCwKICAgICAgdHJhbnNsYXRlWTogMCwKICAgICAgcm90YXRlOiAwLAogICAgICBza2V3WDogMCwKICAgICAgc2NhbGVYOiAxLAogICAgICBzY2FsZVk6IDEKICAgIH07CgogICAgZnVuY3Rpb24gZGVjb21wb3NlJDIoYSwgYiwgYywgZCwgZSwgZikgewogICAgICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYOwogICAgICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgICAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7CiAgICAgIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHJhbnNsYXRlWDogZSwKICAgICAgICB0cmFuc2xhdGVZOiBmLAogICAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMkNCwKICAgICAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMkNCwKICAgICAgICBzY2FsZVg6IHNjYWxlWCwKICAgICAgICBzY2FsZVk6IHNjYWxlWQogICAgICB9OwogICAgfQoKICAgIHZhciBjc3NOb2RlJDIsCiAgICAgICAgY3NzUm9vdCQyLAogICAgICAgIGNzc1ZpZXckMiwKICAgICAgICBzdmdOb2RlJDI7CgogICAgZnVuY3Rpb24gcGFyc2VDc3MkMyh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT09ICJub25lIikgcmV0dXJuIGlkZW50aXR5JGc7CiAgICAgIGlmICghY3NzTm9kZSQyKSBjc3NOb2RlJDIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCQyID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBjc3NWaWV3JDIgPSBkb2N1bWVudC5kZWZhdWx0VmlldzsKICAgICAgY3NzTm9kZSQyLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IGNzc1ZpZXckMi5nZXRDb21wdXRlZFN0eWxlKGNzc1Jvb3QkMi5hcHBlbmRDaGlsZChjc3NOb2RlJDIpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsKICAgICAgY3NzUm9vdCQyLnJlbW92ZUNoaWxkKGNzc05vZGUkMik7CiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoNywgLTEpLnNwbGl0KCIsIik7CiAgICAgIHJldHVybiBkZWNvbXBvc2UkMigrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVN2ZyQyKHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHkkZzsKICAgICAgaWYgKCFzdmdOb2RlJDIpIHN2Z05vZGUkMiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgICBzdmdOb2RlJDIuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCB2YWx1ZSk7CiAgICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZSQyLnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHkkZzsKICAgICAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7CiAgICAgIHJldHVybiBkZWNvbXBvc2UkMih2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybSQyKHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICAgICAgZnVuY3Rpb24gcG9wKHMpIHsKICAgICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogbnVtYmVyJDYoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogbnVtYmVyJDYoeWEsIHliKX0pOwogICAgICAgIH0gZWxzZSBpZiAoeGIgfHwgeWIpIHsKICAgICAgICAgIHMucHVzaCgidHJhbnNsYXRlKCIgKyB4YiArIHB4Q29tbWEgKyB5YiArIHB4UGFyZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gcm90YXRlKGEsIGIsIHMsIHEpIHsKICAgICAgICBpZiAoYSAhPT0gYikgewogICAgICAgICAgaWYgKGEgLSBiID4gMTgwKSBiICs9IDM2MDsgZWxzZSBpZiAoYiAtIGEgPiAxODApIGEgKz0gMzYwOyAvLyBzaG9ydGVzdCBwYXRoCiAgICAgICAgICBxLnB1c2goe2k6IHMucHVzaChwb3AocykgKyAicm90YXRlKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlciQ2KGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHsKICAgICAgICBpZiAoYSAhPT0gYikgewogICAgICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IG51bWJlciQ2KGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IG51bWJlciQ2KHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IG51bWJlciQ2KHlhLCB5Yil9KTsKICAgICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIgKyB4YiArICIsIiArIHliICsgIikiKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTsKICAgICAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTsKICAgICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTsKICAgICAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7CiAgICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MkMiA9IGludGVycG9sYXRlVHJhbnNmb3JtJDIocGFyc2VDc3MkMywgInB4LCAiLCAicHgpIiwgImRlZykiKTsKICAgIHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyQyID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0kMihwYXJzZVN2ZyQyLCAiLCAiLCAiKSIsICIpIik7CgogICAgdmFyIHJobyQxID0gTWF0aC5TUVJUMiwKICAgICAgICByaG8yJDEgPSAyLAogICAgICAgIHJobzQkMSA9IDQsCiAgICAgICAgZXBzaWxvbjIkNCA9IDFlLTEyOwoKICAgIGZ1bmN0aW9uIGNvc2gkMSh4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpbmgkMSh4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHRhbmgkMSh4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwogICAgfQoKICAgIC8vIHAwID0gW3V4MCwgdXkwLCB3MF0KICAgIC8vIHAxID0gW3V4MSwgdXkxLCB3MV0KICAgIGZ1bmN0aW9uIHpvb20kMShwMCwgcDEpIHsKICAgICAgdmFyIHV4MCA9IHAwWzBdLCB1eTAgPSBwMFsxXSwgdzAgPSBwMFsyXSwKICAgICAgICAgIHV4MSA9IHAxWzBdLCB1eTEgPSBwMVsxXSwgdzEgPSBwMVsyXSwKICAgICAgICAgIGR4ID0gdXgxIC0gdXgwLAogICAgICAgICAgZHkgPSB1eTEgLSB1eTAsCiAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5LAogICAgICAgICAgaSwKICAgICAgICAgIFM7CgogICAgICAvLyBTcGVjaWFsIGNhc2UgZm9yIHUwIOKJhSB1MS4KICAgICAgaWYgKGQyIDwgZXBzaWxvbjIkNCkgewogICAgICAgIFMgPSBNYXRoLmxvZyh3MSAvIHcwKSAvIHJobyQxOwogICAgICAgIGkgPSBmdW5jdGlvbih0KSB7CiAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICB1eDAgKyB0ICogZHgsCiAgICAgICAgICAgIHV5MCArIHQgKiBkeSwKICAgICAgICAgICAgdzAgKiBNYXRoLmV4cChyaG8kMSAqIHQgKiBTKQogICAgICAgICAgXTsKICAgICAgICB9OwogICAgICB9CgogICAgICAvLyBHZW5lcmFsIGNhc2UuCiAgICAgIGVsc2UgewogICAgICAgIHZhciBkMSA9IE1hdGguc3FydChkMiksCiAgICAgICAgICAgIGIwID0gKHcxICogdzEgLSB3MCAqIHcwICsgcmhvNCQxICogZDIpIC8gKDIgKiB3MCAqIHJobzIkMSAqIGQxKSwKICAgICAgICAgICAgYjEgPSAodzEgKiB3MSAtIHcwICogdzAgLSByaG80JDEgKiBkMikgLyAoMiAqIHcxICogcmhvMiQxICogZDEpLAogICAgICAgICAgICByMCA9IE1hdGgubG9nKE1hdGguc3FydChiMCAqIGIwICsgMSkgLSBiMCksCiAgICAgICAgICAgIHIxID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIxICogYjEgKyAxKSAtIGIxKTsKICAgICAgICBTID0gKHIxIC0gcjApIC8gcmhvJDE7CiAgICAgICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHZhciBzID0gdCAqIFMsCiAgICAgICAgICAgICAgY29zaHIwID0gY29zaCQxKHIwKSwKICAgICAgICAgICAgICB1ID0gdzAgLyAocmhvMiQxICogZDEpICogKGNvc2hyMCAqIHRhbmgkMShyaG8kMSAqIHMgKyByMCkgLSBzaW5oJDEocjApKTsKICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHV4MCArIHUgKiBkeCwKICAgICAgICAgICAgdXkwICsgdSAqIGR5LAogICAgICAgICAgICB3MCAqIGNvc2hyMCAvIGNvc2gkMShyaG8kMSAqIHMgKyByMCkKICAgICAgICAgIF07CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgaS5kdXJhdGlvbiA9IFMgKiAxMDAwOwoKICAgICAgcmV0dXJuIGk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsJDYoaHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gaHNsJDUoc3RhcnQpKS5oLCAoZW5kID0gaHNsJDUoZW5kKSkuaCksCiAgICAgICAgICAgIHMgPSBub2dhbW1hJDIoc3RhcnQucywgZW5kLnMpLAogICAgICAgICAgICBsID0gbm9nYW1tYSQyKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEkMihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHN0YXJ0LmggPSBoKHQpOwogICAgICAgICAgc3RhcnQucyA9IHModCk7CiAgICAgICAgICBzdGFydC5sID0gbCh0KTsKICAgICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgICAgfTsKICAgICAgfQogICAgfQoKICAgIHZhciBoc2wkNyA9IGhzbCQ2KGh1ZSQyKTsKICAgIHZhciBoc2xMb25nJDEgPSBoc2wkNihub2dhbW1hJDIpOwoKICAgIGZ1bmN0aW9uIGxhYiQ0KHN0YXJ0LCBlbmQpIHsKICAgICAgdmFyIGwgPSBub2dhbW1hJDIoKHN0YXJ0ID0gbGFiJDMoc3RhcnQpKS5sLCAoZW5kID0gbGFiJDMoZW5kKSkubCksCiAgICAgICAgICBhID0gbm9nYW1tYSQyKHN0YXJ0LmEsIGVuZC5hKSwKICAgICAgICAgIGIgPSBub2dhbW1hJDIoc3RhcnQuYiwgZW5kLmIpLAogICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEkMihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgc3RhcnQubCA9IGwodCk7CiAgICAgICAgc3RhcnQuYSA9IGEodCk7CiAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaGNsJDUoaHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgdmFyIGggPSBodWUoKHN0YXJ0ID0gaGNsJDQoc3RhcnQpKS5oLCAoZW5kID0gaGNsJDQoZW5kKSkuaCksCiAgICAgICAgICAgIGMgPSBub2dhbW1hJDIoc3RhcnQuYywgZW5kLmMpLAogICAgICAgICAgICBsID0gbm9nYW1tYSQyKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEkMihzdGFydC5vcGFjaXR5LCBlbmQub3BhY2l0eSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHN0YXJ0LmggPSBoKHQpOwogICAgICAgICAgc3RhcnQuYyA9IGModCk7CiAgICAgICAgICBzdGFydC5sID0gbCh0KTsKICAgICAgICAgIHN0YXJ0Lm9wYWNpdHkgPSBvcGFjaXR5KHQpOwogICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgICAgfTsKICAgICAgfQogICAgfQoKICAgIHZhciBoY2wkNiA9IGhjbCQ1KGh1ZSQyKTsKICAgIHZhciBoY2xMb25nJDEgPSBoY2wkNShub2dhbW1hJDIpOwoKICAgIGZ1bmN0aW9uIGN1YmVoZWxpeCQ2KGh1ZSkgewogICAgICByZXR1cm4gKGZ1bmN0aW9uIGN1YmVoZWxpeEdhbW1hKHkpIHsKICAgICAgICB5ID0gK3k7CgogICAgICAgIGZ1bmN0aW9uIGN1YmVoZWxpeChzdGFydCwgZW5kKSB7CiAgICAgICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjdWJlaGVsaXgkNShzdGFydCkpLmgsIChlbmQgPSBjdWJlaGVsaXgkNShlbmQpKS5oKSwKICAgICAgICAgICAgICBzID0gbm9nYW1tYSQyKHN0YXJ0LnMsIGVuZC5zKSwKICAgICAgICAgICAgICBsID0gbm9nYW1tYSQyKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYSQyKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgIHN0YXJ0LmggPSBoKHQpOwogICAgICAgICAgICBzdGFydC5zID0gcyh0KTsKICAgICAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpOwogICAgICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgY3ViZWhlbGl4LmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7CgogICAgICAgIHJldHVybiBjdWJlaGVsaXg7CiAgICAgIH0pKDEpOwogICAgfQoKICAgIHZhciBjdWJlaGVsaXgkNyA9IGN1YmVoZWxpeCQ2KGh1ZSQyKTsKICAgIHZhciBjdWJlaGVsaXhMb25nJDEgPSBjdWJlaGVsaXgkNihub2dhbW1hJDIpOwoKICAgIGZ1bmN0aW9uIHF1YW50aXplJDIoaW50ZXJwb2xhdG9yLCBuKSB7CiAgICAgIHZhciBzYW1wbGVzID0gbmV3IEFycmF5KG4pOwogICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG47ICsraSkgc2FtcGxlc1tpXSA9IGludGVycG9sYXRvcihpIC8gKG4gLSAxKSk7CiAgICAgIHJldHVybiBzYW1wbGVzOwogICAgfQoKICAgIHZhciBwaSQ5ID0gTWF0aC5QSSwKICAgICAgICB0YXUkOSA9IDIgKiBwaSQ5LAogICAgICAgIGVwc2lsb24kOCA9IDFlLTYsCiAgICAgICAgdGF1RXBzaWxvbiQyID0gdGF1JDkgLSBlcHNpbG9uJDg7CgogICAgZnVuY3Rpb24gUGF0aCQyKCkgewogICAgICB0aGlzLl94MCA9IHRoaXMuX3kwID0gLy8gc3RhcnQgb2YgY3VycmVudCBzdWJwYXRoCiAgICAgIHRoaXMuX3gxID0gdGhpcy5feTEgPSBudWxsOyAvLyBlbmQgb2YgY3VycmVudCBzdWJwYXRoCiAgICAgIHRoaXMuXyA9ICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhdGgkMigpIHsKICAgICAgcmV0dXJuIG5ldyBQYXRoJDI7CiAgICB9CgogICAgUGF0aCQyLnByb3RvdHlwZSA9IHBhdGgkMi5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBQYXRoJDIsCiAgICAgIG1vdmVUbzogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpOwogICAgICB9LAogICAgICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl94MSAhPT0gbnVsbCkgewogICAgICAgICAgdGhpcy5feDEgPSB0aGlzLl94MCwgdGhpcy5feTEgPSB0aGlzLl95MDsKICAgICAgICAgIHRoaXMuXyArPSAiWiI7CiAgICAgICAgfQogICAgICB9LAogICAgICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogICAgICB9LAogICAgICBxdWFkcmF0aWNDdXJ2ZVRvOiBmdW5jdGlvbih4MSwgeTEsIHgsIHkpIHsKICAgICAgICB0aGlzLl8gKz0gIlEiICsgKCt4MSkgKyAiLCIgKyAoK3kxKSArICIsIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgYmV6aWVyQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHgsIHkpIHsKICAgICAgICB0aGlzLl8gKz0gIkMiICsgKCt4MSkgKyAiLCIgKyAoK3kxKSArICIsIiArICgreDIpICsgIiwiICsgKCt5MikgKyAiLCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7CiAgICAgIH0sCiAgICAgIGFyY1RvOiBmdW5jdGlvbih4MSwgeTEsIHgyLCB5MiwgcikgewogICAgICAgIHgxID0gK3gxLCB5MSA9ICt5MSwgeDIgPSAreDIsIHkyID0gK3kyLCByID0gK3I7CiAgICAgICAgdmFyIHgwID0gdGhpcy5feDEsCiAgICAgICAgICAgIHkwID0gdGhpcy5feTEsCiAgICAgICAgICAgIHgyMSA9IHgyIC0geDEsCiAgICAgICAgICAgIHkyMSA9IHkyIC0geTEsCiAgICAgICAgICAgIHgwMSA9IHgwIC0geDEsCiAgICAgICAgICAgIHkwMSA9IHkwIC0geTEsCiAgICAgICAgICAgIGwwMV8yID0geDAxICogeDAxICsgeTAxICogeTAxOwoKICAgICAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci4KICAgICAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiICsgcik7CgogICAgICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDEseTEpLgogICAgICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkgewogICAgICAgICAgdGhpcy5fICs9ICJNIiArICh0aGlzLl94MSA9IHgxKSArICIsIiArICh0aGlzLl95MSA9IHkxKTsKICAgICAgICB9CgogICAgICAgIC8vIE9yLCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDAseTApPyBEbyBub3RoaW5nLgogICAgICAgIGVsc2UgaWYgKCEobDAxXzIgPiBlcHNpbG9uJDgpKSA7CgogICAgICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/CiAgICAgICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpPwogICAgICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4KICAgICAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uJDgpIHx8ICFyKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgICAgIH0KCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyEKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciB4MjAgPSB4MiAtIHgwLAogICAgICAgICAgICAgIHkyMCA9IHkyIC0geTAsCiAgICAgICAgICAgICAgbDIxXzIgPSB4MjEgKiB4MjEgKyB5MjEgKiB5MjEsCiAgICAgICAgICAgICAgbDIwXzIgPSB4MjAgKiB4MjAgKyB5MjAgKiB5MjAsCiAgICAgICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSwKICAgICAgICAgICAgICBsMDEgPSBNYXRoLnNxcnQobDAxXzIpLAogICAgICAgICAgICAgIGwgPSByICogTWF0aC50YW4oKHBpJDkgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLAogICAgICAgICAgICAgIHQwMSA9IGwgLyBsMDEsCiAgICAgICAgICAgICAgdDIxID0gbCAvIGwyMTsKCiAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgdGFuZ2VudCBpcyBub3QgY29pbmNpZGVudCB3aXRoICh4MCx5MCksIGxpbmUgdG8uCiAgICAgICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uJDgpIHsKICAgICAgICAgICAgdGhpcy5fICs9ICJMIiArICh4MSArIHQwMSAqIHgwMSkgKyAiLCIgKyAoeTEgKyB0MDEgKiB5MDEpOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIsIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsgdDIxICogeTIxKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreSwgciA9ICtyOwogICAgICAgIHZhciBkeCA9IHIgKiBNYXRoLmNvcyhhMCksCiAgICAgICAgICAgIGR5ID0gciAqIE1hdGguc2luKGEwKSwKICAgICAgICAgICAgeDAgPSB4ICsgZHgsCiAgICAgICAgICAgIHkwID0geSArIGR5LAogICAgICAgICAgICBjdyA9IDEgXiBjY3csCiAgICAgICAgICAgIGRhID0gY2N3ID8gYTAgLSBhMSA6IGExIC0gYTA7CgogICAgICAgIC8vIElzIHRoZSByYWRpdXMgbmVnYXRpdmU/IEVycm9yLgogICAgICAgIGlmIChyIDwgMCkgdGhyb3cgbmV3IEVycm9yKCJuZWdhdGl2ZSByYWRpdXM6ICIgKyByKTsKCiAgICAgICAgLy8gSXMgdGhpcyBwYXRoIGVtcHR5PyBNb3ZlIHRvICh4MCx5MCkuCiAgICAgICAgaWYgKHRoaXMuX3gxID09PSBudWxsKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIk0iICsgeDAgKyAiLCIgKyB5MDsKICAgICAgICB9CgogICAgICAgIC8vIE9yLCBpcyAoeDAseTApIG5vdCBjb2luY2lkZW50IHdpdGggdGhlIHByZXZpb3VzIHBvaW50PyBMaW5lIHRvICh4MCx5MCkuCiAgICAgICAgZWxzZSBpZiAoTWF0aC5hYnModGhpcy5feDEgLSB4MCkgPiBlcHNpbG9uJDggfHwgTWF0aC5hYnModGhpcy5feTEgLSB5MCkgPiBlcHNpbG9uJDgpIHsKICAgICAgICAgIHRoaXMuXyArPSAiTCIgKyB4MCArICIsIiArIHkwOwogICAgICAgIH0KCiAgICAgICAgLy8gSXMgdGhpcyBhcmMgZW1wdHk/IFdl4oCZcmUgZG9uZS4KICAgICAgICBpZiAoIXIpIHJldHVybjsKCiAgICAgICAgLy8gRG9lcyB0aGUgYW5nbGUgZ28gdGhlIHdyb25nIHdheT8gRmxpcCB0aGUgZGlyZWN0aW9uLgogICAgICAgIGlmIChkYSA8IDApIGRhID0gZGEgJSB0YXUkOSArIHRhdSQ5OwoKICAgICAgICAvLyBJcyB0aGlzIGEgY29tcGxldGUgY2lyY2xlPyBEcmF3IHR3byBhcmNzIHRvIGNvbXBsZXRlIHRoZSBjaXJjbGUuCiAgICAgICAgaWYgKGRhID4gdGF1RXBzaWxvbiQyKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkEiICsgciArICIsIiArIHIgKyAiLDAsMSwiICsgY3cgKyAiLCIgKyAoeCAtIGR4KSArICIsIiArICh5IC0gZHkpICsgIkEiICsgciArICIsIiArIHIgKyAiLDAsMSwiICsgY3cgKyAiLCIgKyAodGhpcy5feDEgPSB4MCkgKyAiLCIgKyAodGhpcy5feTEgPSB5MCk7CiAgICAgICAgfQoKICAgICAgICAvLyBJcyB0aGlzIGFyYyBub24tZW1wdHk/IERyYXcgYW4gYXJjIQogICAgICAgIGVsc2UgaWYgKGRhID4gZXBzaWxvbiQ4KSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkEiICsgciArICIsIiArIHIgKyAiLDAsIiArICgrKGRhID49IHBpJDkpKSArICIsIiArIGN3ICsgIiwiICsgKHRoaXMuX3gxID0geCArIHIgKiBNYXRoLmNvcyhhMSkpICsgIiwiICsgKHRoaXMuX3kxID0geSArIHIgKiBNYXRoLnNpbihhMSkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVjdDogZnVuY3Rpb24oeCwgeSwgdywgaCkgewogICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpICsgImgiICsgKCt3KSArICJ2IiArICgraCkgKyAiaCIgKyAoLXcpICsgIloiOwogICAgICB9LAogICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXzsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBhcmVhJDUocG9seWdvbikgewogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLAogICAgICAgICAgYSwKICAgICAgICAgIGIgPSBwb2x5Z29uW24gLSAxXSwKICAgICAgICAgIGFyZWEgPSAwOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBhID0gYjsKICAgICAgICBiID0gcG9seWdvbltpXTsKICAgICAgICBhcmVhICs9IGFbMV0gKiBiWzBdIC0gYVswXSAqIGJbMV07CiAgICAgIH0KCiAgICAgIHJldHVybiBhcmVhIC8gMjsKICAgIH0KCiAgICBmdW5jdGlvbiBjZW50cm9pZCQzKHBvbHlnb24pIHsKICAgICAgdmFyIGkgPSAtMSwKICAgICAgICAgIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgICAgIHggPSAwLAogICAgICAgICAgeSA9IDAsCiAgICAgICAgICBhLAogICAgICAgICAgYiA9IHBvbHlnb25bbiAtIDFdLAogICAgICAgICAgYywKICAgICAgICAgIGsgPSAwOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICBhID0gYjsKICAgICAgICBiID0gcG9seWdvbltpXTsKICAgICAgICBrICs9IGMgPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdOwogICAgICAgIHggKz0gKGFbMF0gKyBiWzBdKSAqIGM7CiAgICAgICAgeSArPSAoYVsxXSArIGJbMV0pICogYzsKICAgICAgfQoKICAgICAgcmV0dXJuIGsgKj0gMywgW3ggLyBrLCB5IC8ga107CiAgICB9CgogICAgLy8gUmV0dXJucyB0aGUgMkQgY3Jvc3MgcHJvZHVjdCBvZiBBQiBhbmQgQUMgdmVjdG9ycywgaS5lLiwgdGhlIHotY29tcG9uZW50IG9mCiAgICAvLyB0aGUgM0QgY3Jvc3MgcHJvZHVjdCBpbiBhIHF1YWRyYW50IEkgQ2FydGVzaWFuIGNvb3JkaW5hdGUgc3lzdGVtICgreCBpcwogICAgLy8gcmlnaHQsICt5IGlzIHVwKS4gUmV0dXJucyBhIHBvc2l0aXZlIHZhbHVlIGlmIEFCQyBpcyBjb3VudGVyLWNsb2Nrd2lzZSwKICAgIC8vIG5lZ2F0aXZlIGlmIGNsb2Nrd2lzZSwgYW5kIHplcm8gaWYgdGhlIHBvaW50cyBhcmUgY29sbGluZWFyLgogICAgZnVuY3Rpb24gY3Jvc3MkNChhLCBiLCBjKSB7CiAgICAgIHJldHVybiAoYlswXSAtIGFbMF0pICogKGNbMV0gLSBhWzFdKSAtIChiWzFdIC0gYVsxXSkgKiAoY1swXSAtIGFbMF0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGxleGljb2dyYXBoaWNPcmRlciQxKGEsIGIpIHsKICAgICAgcmV0dXJuIGFbMF0gLSBiWzBdIHx8IGFbMV0gLSBiWzFdOwogICAgfQoKICAgIC8vIENvbXB1dGVzIHRoZSB1cHBlciBjb252ZXggaHVsbCBwZXIgdGhlIG1vbm90b25lIGNoYWluIGFsZ29yaXRobS4KICAgIC8vIEFzc3VtZXMgcG9pbnRzLmxlbmd0aCA+PSAzLCBpcyBzb3J0ZWQgYnkgeCwgdW5pcXVlIGluIHkuCiAgICAvLyBSZXR1cm5zIGFuIGFycmF5IG9mIGluZGljZXMgaW50byBwb2ludHMgaW4gbGVmdC10by1yaWdodCBvcmRlci4KICAgIGZ1bmN0aW9uIGNvbXB1dGVVcHBlckh1bGxJbmRleGVzJDEocG9pbnRzKSB7CiAgICAgIHZhciBuID0gcG9pbnRzLmxlbmd0aCwKICAgICAgICAgIGluZGV4ZXMgPSBbMCwgMV0sCiAgICAgICAgICBzaXplID0gMjsKCiAgICAgIGZvciAodmFyIGkgPSAyOyBpIDwgbjsgKytpKSB7CiAgICAgICAgd2hpbGUgKHNpemUgPiAxICYmIGNyb3NzJDQocG9pbnRzW2luZGV4ZXNbc2l6ZSAtIDJdXSwgcG9pbnRzW2luZGV4ZXNbc2l6ZSAtIDFdXSwgcG9pbnRzW2ldKSA8PSAwKSAtLXNpemU7CiAgICAgICAgaW5kZXhlc1tzaXplKytdID0gaTsKICAgICAgfQoKICAgICAgcmV0dXJuIGluZGV4ZXMuc2xpY2UoMCwgc2l6ZSk7IC8vIHJlbW92ZSBwb3BwZWQgcG9pbnRzCiAgICB9CgogICAgZnVuY3Rpb24gaHVsbCQxKHBvaW50cykgewogICAgICBpZiAoKG4gPSBwb2ludHMubGVuZ3RoKSA8IDMpIHJldHVybiBudWxsOwoKICAgICAgdmFyIGksCiAgICAgICAgICBuLAogICAgICAgICAgc29ydGVkUG9pbnRzID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgZmxpcHBlZFBvaW50cyA9IG5ldyBBcnJheShuKTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHNvcnRlZFBvaW50c1tpXSA9IFsrcG9pbnRzW2ldWzBdLCArcG9pbnRzW2ldWzFdLCBpXTsKICAgICAgc29ydGVkUG9pbnRzLnNvcnQobGV4aWNvZ3JhcGhpY09yZGVyJDEpOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSBmbGlwcGVkUG9pbnRzW2ldID0gW3NvcnRlZFBvaW50c1tpXVswXSwgLXNvcnRlZFBvaW50c1tpXVsxXV07CgogICAgICB2YXIgdXBwZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4ZXMkMShzb3J0ZWRQb2ludHMpLAogICAgICAgICAgbG93ZXJJbmRleGVzID0gY29tcHV0ZVVwcGVySHVsbEluZGV4ZXMkMShmbGlwcGVkUG9pbnRzKTsKCiAgICAgIC8vIENvbnN0cnVjdCB0aGUgaHVsbCBwb2x5Z29uLCByZW1vdmluZyBwb3NzaWJsZSBkdXBsaWNhdGUgZW5kcG9pbnRzLgogICAgICB2YXIgc2tpcExlZnQgPSBsb3dlckluZGV4ZXNbMF0gPT09IHVwcGVySW5kZXhlc1swXSwKICAgICAgICAgIHNraXBSaWdodCA9IGxvd2VySW5kZXhlc1tsb3dlckluZGV4ZXMubGVuZ3RoIC0gMV0gPT09IHVwcGVySW5kZXhlc1t1cHBlckluZGV4ZXMubGVuZ3RoIC0gMV0sCiAgICAgICAgICBodWxsID0gW107CgogICAgICAvLyBBZGQgdXBwZXIgaHVsbCBpbiByaWdodC10by1sIG9yZGVyLgogICAgICAvLyBUaGVuIGFkZCBsb3dlciBodWxsIGluIGxlZnQtdG8tcmlnaHQgb3JkZXIuCiAgICAgIGZvciAoaSA9IHVwcGVySW5kZXhlcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkgaHVsbC5wdXNoKHBvaW50c1tzb3J0ZWRQb2ludHNbdXBwZXJJbmRleGVzW2ldXVsyXV0pOwogICAgICBmb3IgKGkgPSArc2tpcExlZnQ7IGkgPCBsb3dlckluZGV4ZXMubGVuZ3RoIC0gc2tpcFJpZ2h0OyArK2kpIGh1bGwucHVzaChwb2ludHNbc29ydGVkUG9pbnRzW2xvd2VySW5kZXhlc1tpXV1bMl1dKTsKCiAgICAgIHJldHVybiBodWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRhaW5zJDQocG9seWdvbiwgcG9pbnQpIHsKICAgICAgdmFyIG4gPSBwb2x5Z29uLmxlbmd0aCwKICAgICAgICAgIHAgPSBwb2x5Z29uW24gLSAxXSwKICAgICAgICAgIHggPSBwb2ludFswXSwgeSA9IHBvaW50WzFdLAogICAgICAgICAgeDAgPSBwWzBdLCB5MCA9IHBbMV0sCiAgICAgICAgICB4MSwgeTEsCiAgICAgICAgICBpbnNpZGUgPSBmYWxzZTsKCiAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcCA9IHBvbHlnb25baV0sIHgxID0gcFswXSwgeTEgPSBwWzFdOwogICAgICAgIGlmICgoKHkxID4geSkgIT09ICh5MCA+IHkpKSAmJiAoeCA8ICh4MCAtIHgxKSAqICh5IC0geTEpIC8gKHkwIC0geTEpICsgeDEpKSBpbnNpZGUgPSAhaW5zaWRlOwogICAgICAgIHgwID0geDEsIHkwID0geTE7CiAgICAgIH0KCiAgICAgIHJldHVybiBpbnNpZGU7CiAgICB9CgogICAgZnVuY3Rpb24gbGVuZ3RoJDUocG9seWdvbikgewogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IHBvbHlnb24ubGVuZ3RoLAogICAgICAgICAgYiA9IHBvbHlnb25bbiAtIDFdLAogICAgICAgICAgeGEsCiAgICAgICAgICB5YSwKICAgICAgICAgIHhiID0gYlswXSwKICAgICAgICAgIHliID0gYlsxXSwKICAgICAgICAgIHBlcmltZXRlciA9IDA7CgogICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgIHhhID0geGI7CiAgICAgICAgeWEgPSB5YjsKICAgICAgICBiID0gcG9seWdvbltpXTsKICAgICAgICB4YiA9IGJbMF07CiAgICAgICAgeWIgPSBiWzFdOwogICAgICAgIHhhIC09IHhiOwogICAgICAgIHlhIC09IHliOwogICAgICAgIHBlcmltZXRlciArPSBNYXRoLnNxcnQoeGEgKiB4YSArIHlhICogeWEpOwogICAgICB9CgogICAgICByZXR1cm4gcGVyaW1ldGVyOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfYWRkJDIoZCkgewogICAgICB2YXIgeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCksCiAgICAgICAgICB5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKTsKICAgICAgcmV0dXJuIGFkZCQ0KHRoaXMuY292ZXIoeCwgeSksIHgsIHksIGQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFkZCQ0KHRyZWUsIHgsIHksIGQpIHsKICAgICAgaWYgKGlzTmFOKHgpIHx8IGlzTmFOKHkpKSByZXR1cm4gdHJlZTsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogICAgICB2YXIgcGFyZW50LAogICAgICAgICAgbm9kZSA9IHRyZWUuX3Jvb3QsCiAgICAgICAgICBsZWFmID0ge2RhdGE6IGR9LAogICAgICAgICAgeDAgPSB0cmVlLl94MCwKICAgICAgICAgIHkwID0gdHJlZS5feTAsCiAgICAgICAgICB4MSA9IHRyZWUuX3gxLAogICAgICAgICAgeTEgPSB0cmVlLl95MSwKICAgICAgICAgIHhtLAogICAgICAgICAgeW0sCiAgICAgICAgICB4cCwKICAgICAgICAgIHlwLAogICAgICAgICAgcmlnaHQsCiAgICAgICAgICBib3R0b20sCiAgICAgICAgICBpLAogICAgICAgICAgajsKCiAgICAgIC8vIElmIHRoZSB0cmVlIGlzIGVtcHR5LCBpbml0aWFsaXplIHRoZSByb290IGFzIGEgbGVhZi4KICAgICAgaWYgKCFub2RlKSByZXR1cm4gdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7CgogICAgICAvLyBGaW5kIHRoZSBleGlzdGluZyBsZWFmIGZvciB0aGUgbmV3IHBvaW50LCBvciBhZGQgaXQuCiAgICAgIHdoaWxlIChub2RlLmxlbmd0aCkgewogICAgICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTsKICAgICAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltOwogICAgICAgIGlmIChwYXJlbnQgPSBub2RlLCAhKG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiBwYXJlbnRbaV0gPSBsZWFmLCB0cmVlOwogICAgICB9CgogICAgICAvLyBJcyB0aGUgbmV3IHBvaW50IGlzIGV4YWN0bHkgY29pbmNpZGVudCB3aXRoIHRoZSBleGlzdGluZyBwb2ludD8KICAgICAgeHAgPSArdHJlZS5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSk7CiAgICAgIHlwID0gK3RyZWUuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpOwogICAgICBpZiAoeCA9PT0geHAgJiYgeSA9PT0geXApIHJldHVybiBsZWFmLm5leHQgPSBub2RlLCBwYXJlbnQgPyBwYXJlbnRbaV0gPSBsZWFmIDogdHJlZS5fcm9vdCA9IGxlYWYsIHRyZWU7CgogICAgICAvLyBPdGhlcndpc2UsIHNwbGl0IHRoZSBsZWFmIG5vZGUgdW50aWwgdGhlIG9sZCBhbmQgbmV3IHBvaW50IGFyZSBzZXBhcmF0ZWQuCiAgICAgIGRvIHsKICAgICAgICBwYXJlbnQgPSBwYXJlbnQgPyBwYXJlbnRbaV0gPSBuZXcgQXJyYXkoNCkgOiB0cmVlLl9yb290ID0gbmV3IEFycmF5KDQpOwogICAgICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTsKICAgICAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltOwogICAgICB9IHdoaWxlICgoaSA9IGJvdHRvbSA8PCAxIHwgcmlnaHQpID09PSAoaiA9ICh5cCA+PSB5bSkgPDwgMSB8ICh4cCA+PSB4bSkpKTsKICAgICAgcmV0dXJuIHBhcmVudFtqXSA9IG5vZGUsIHBhcmVudFtpXSA9IGxlYWYsIHRyZWU7CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQWxsJDIoZGF0YSkgewogICAgICB2YXIgZCwgaSwgbiA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgeCwKICAgICAgICAgIHksCiAgICAgICAgICB4eiA9IG5ldyBBcnJheShuKSwKICAgICAgICAgIHl6ID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgeDAgPSBJbmZpbml0eSwKICAgICAgICAgIHkwID0gSW5maW5pdHksCiAgICAgICAgICB4MSA9IC1JbmZpbml0eSwKICAgICAgICAgIHkxID0gLUluZmluaXR5OwoKICAgICAgLy8gQ29tcHV0ZSB0aGUgcG9pbnRzIGFuZCB0aGVpciBleHRlbnQuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoaXNOYU4oeCA9ICt0aGlzLl94LmNhbGwobnVsbCwgZCA9IGRhdGFbaV0pKSB8fCBpc05hTih5ID0gK3RoaXMuX3kuY2FsbChudWxsLCBkKSkpIGNvbnRpbnVlOwogICAgICAgIHh6W2ldID0geDsKICAgICAgICB5eltpXSA9IHk7CiAgICAgICAgaWYgKHggPCB4MCkgeDAgPSB4OwogICAgICAgIGlmICh4ID4geDEpIHgxID0geDsKICAgICAgICBpZiAoeSA8IHkwKSB5MCA9IHk7CiAgICAgICAgaWYgKHkgPiB5MSkgeTEgPSB5OwogICAgICB9CgogICAgICAvLyBJZiB0aGVyZSB3ZXJlIG5vICh2YWxpZCkgcG9pbnRzLCBpbmhlcml0IHRoZSBleGlzdGluZyBleHRlbnQuCiAgICAgIGlmICh4MSA8IHgwKSB4MCA9IHRoaXMuX3gwLCB4MSA9IHRoaXMuX3gxOwogICAgICBpZiAoeTEgPCB5MCkgeTAgPSB0aGlzLl95MCwgeTEgPSB0aGlzLl95MTsKCiAgICAgIC8vIEV4cGFuZCB0aGUgdHJlZSB0byBjb3ZlciB0aGUgbmV3IHBvaW50cy4KICAgICAgdGhpcy5jb3Zlcih4MCwgeTApLmNvdmVyKHgxLCB5MSk7CgogICAgICAvLyBBZGQgdGhlIG5ldyBwb2ludHMuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBhZGQkNCh0aGlzLCB4eltpXSwgeXpbaV0sIGRhdGFbaV0pOwogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX2NvdmVyJDIoeCwgeSkgewogICAgICBpZiAoaXNOYU4oeCA9ICt4KSB8fCBpc05hTih5ID0gK3kpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogICAgICB2YXIgeDAgPSB0aGlzLl94MCwKICAgICAgICAgIHkwID0gdGhpcy5feTAsCiAgICAgICAgICB4MSA9IHRoaXMuX3gxLAogICAgICAgICAgeTEgPSB0aGlzLl95MTsKCiAgICAgIC8vIElmIHRoZSBxdWFkdHJlZSBoYXMgbm8gZXh0ZW50LCBpbml0aWFsaXplIHRoZW0uCiAgICAgIC8vIEludGVnZXIgZXh0ZW50IGFyZSBuZWNlc3Nhcnkgc28gdGhhdCBpZiB3ZSBsYXRlciBkb3VibGUgdGhlIGV4dGVudCwKICAgICAgLy8gdGhlIGV4aXN0aW5nIHF1YWRyYW50IGJvdW5kYXJpZXMgZG9u4oCZdCBjaGFuZ2UgZHVlIHRvIGZsb2F0aW5nIHBvaW50IGVycm9yIQogICAgICBpZiAoaXNOYU4oeDApKSB7CiAgICAgICAgeDEgPSAoeDAgPSBNYXRoLmZsb29yKHgpKSArIDE7CiAgICAgICAgeTEgPSAoeTAgPSBNYXRoLmZsb29yKHkpKSArIDE7CiAgICAgIH0KCiAgICAgIC8vIE90aGVyd2lzZSwgZG91YmxlIHJlcGVhdGVkbHkgdG8gY292ZXIuCiAgICAgIGVsc2UgaWYgKHgwID4geCB8fCB4ID4geDEgfHwgeTAgPiB5IHx8IHkgPiB5MSkgewogICAgICAgIHZhciB6ID0geDEgLSB4MCwKICAgICAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgICAgICAgIHBhcmVudCwKICAgICAgICAgICAgaTsKCiAgICAgICAgc3dpdGNoIChpID0gKHkgPCAoeTAgKyB5MSkgLyAyKSA8PCAxIHwgKHggPCAoeDAgKyB4MSkgLyAyKSkgewogICAgICAgICAgY2FzZSAwOiB7CiAgICAgICAgICAgIGRvIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudDsKICAgICAgICAgICAgd2hpbGUgKHogKj0gMiwgeDEgPSB4MCArIHosIHkxID0geTAgKyB6LCB4ID4geDEgfHwgeSA+IHkxKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgZG8gcGFyZW50ID0gbmV3IEFycmF5KDQpLCBwYXJlbnRbaV0gPSBub2RlLCBub2RlID0gcGFyZW50OwogICAgICAgICAgICB3aGlsZSAoeiAqPSAyLCB4MCA9IHgxIC0geiwgeTEgPSB5MCArIHosIHgwID4geCB8fCB5ID4geTEpOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGNhc2UgMjogewogICAgICAgICAgICBkbyBwYXJlbnQgPSBuZXcgQXJyYXkoNCksIHBhcmVudFtpXSA9IG5vZGUsIG5vZGUgPSBwYXJlbnQ7CiAgICAgICAgICAgIHdoaWxlICh6ICo9IDIsIHgxID0geDAgKyB6LCB5MCA9IHkxIC0geiwgeCA+IHgxIHx8IHkwID4geSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgIGRvIHBhcmVudCA9IG5ldyBBcnJheSg0KSwgcGFyZW50W2ldID0gbm9kZSwgbm9kZSA9IHBhcmVudDsKICAgICAgICAgICAgd2hpbGUgKHogKj0gMiwgeDAgPSB4MSAtIHosIHkwID0geTEgLSB6LCB4MCA+IHggfHwgeTAgPiB5KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5fcm9vdCAmJiB0aGlzLl9yb290Lmxlbmd0aCkgdGhpcy5fcm9vdCA9IG5vZGU7CiAgICAgIH0KCiAgICAgIC8vIElmIHRoZSBxdWFkdHJlZSBjb3ZlcnMgdGhlIHBvaW50IGFscmVhZHksIGp1c3QgcmV0dXJuLgogICAgICBlbHNlIHJldHVybiB0aGlzOwoKICAgICAgdGhpcy5feDAgPSB4MDsKICAgICAgdGhpcy5feTAgPSB5MDsKICAgICAgdGhpcy5feDEgPSB4MTsKICAgICAgdGhpcy5feTEgPSB5MTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9kYXRhJDIoKSB7CiAgICAgIHZhciBkYXRhID0gW107CiAgICAgIHRoaXMudmlzaXQoZnVuY3Rpb24obm9kZSkgewogICAgICAgIGlmICghbm9kZS5sZW5ndGgpIGRvIGRhdGEucHVzaChub2RlLmRhdGEpOyB3aGlsZSAobm9kZSA9IG5vZGUubmV4dCkKICAgICAgfSk7CiAgICAgIHJldHVybiBkYXRhOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfZXh0ZW50JDIoXykgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmNvdmVyKCtfWzBdWzBdLCArX1swXVsxXSkuY292ZXIoK19bMV1bMF0sICtfWzFdWzFdKQogICAgICAgICAgOiBpc05hTih0aGlzLl94MCkgPyB1bmRlZmluZWQgOiBbW3RoaXMuX3gwLCB0aGlzLl95MF0sIFt0aGlzLl94MSwgdGhpcy5feTFdXTsKICAgIH0KCiAgICBmdW5jdGlvbiBRdWFkJDIobm9kZSwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgICAgdGhpcy54MCA9IHgwOwogICAgICB0aGlzLnkwID0geTA7CiAgICAgIHRoaXMueDEgPSB4MTsKICAgICAgdGhpcy55MSA9IHkxOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfZmluZCQyKHgsIHksIHJhZGl1cykgewogICAgICB2YXIgZGF0YSwKICAgICAgICAgIHgwID0gdGhpcy5feDAsCiAgICAgICAgICB5MCA9IHRoaXMuX3kwLAogICAgICAgICAgeDEsCiAgICAgICAgICB5MSwKICAgICAgICAgIHgyLAogICAgICAgICAgeTIsCiAgICAgICAgICB4MyA9IHRoaXMuX3gxLAogICAgICAgICAgeTMgPSB0aGlzLl95MSwKICAgICAgICAgIHF1YWRzID0gW10sCiAgICAgICAgICBub2RlID0gdGhpcy5fcm9vdCwKICAgICAgICAgIHEsCiAgICAgICAgICBpOwoKICAgICAgaWYgKG5vZGUpIHF1YWRzLnB1c2gobmV3IFF1YWQkMihub2RlLCB4MCwgeTAsIHgzLCB5MykpOwogICAgICBpZiAocmFkaXVzID09IG51bGwpIHJhZGl1cyA9IEluZmluaXR5OwogICAgICBlbHNlIHsKICAgICAgICB4MCA9IHggLSByYWRpdXMsIHkwID0geSAtIHJhZGl1czsKICAgICAgICB4MyA9IHggKyByYWRpdXMsIHkzID0geSArIHJhZGl1czsKICAgICAgICByYWRpdXMgKj0gcmFkaXVzOwogICAgICB9CgogICAgICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CgogICAgICAgIC8vIFN0b3Agc2VhcmNoaW5nIGlmIHRoaXMgcXVhZHJhbnQgY2Fu4oCZdCBjb250YWluIGEgY2xvc2VyIG5vZGUuCiAgICAgICAgaWYgKCEobm9kZSA9IHEubm9kZSkKICAgICAgICAgICAgfHwgKHgxID0gcS54MCkgPiB4MwogICAgICAgICAgICB8fCAoeTEgPSBxLnkwKSA+IHkzCiAgICAgICAgICAgIHx8ICh4MiA9IHEueDEpIDwgeDAKICAgICAgICAgICAgfHwgKHkyID0gcS55MSkgPCB5MCkgY29udGludWU7CgogICAgICAgIC8vIEJpc2VjdCB0aGUgY3VycmVudCBxdWFkcmFudC4KICAgICAgICBpZiAobm9kZS5sZW5ndGgpIHsKICAgICAgICAgIHZhciB4bSA9ICh4MSArIHgyKSAvIDIsCiAgICAgICAgICAgICAgeW0gPSAoeTEgKyB5MikgLyAyOwoKICAgICAgICAgIHF1YWRzLnB1c2goCiAgICAgICAgICAgIG5ldyBRdWFkJDIobm9kZVszXSwgeG0sIHltLCB4MiwgeTIpLAogICAgICAgICAgICBuZXcgUXVhZCQyKG5vZGVbMl0sIHgxLCB5bSwgeG0sIHkyKSwKICAgICAgICAgICAgbmV3IFF1YWQkMihub2RlWzFdLCB4bSwgeTEsIHgyLCB5bSksCiAgICAgICAgICAgIG5ldyBRdWFkJDIobm9kZVswXSwgeDEsIHkxLCB4bSwgeW0pCiAgICAgICAgICApOwoKICAgICAgICAgIC8vIFZpc2l0IHRoZSBjbG9zZXN0IHF1YWRyYW50IGZpcnN0LgogICAgICAgICAgaWYgKGkgPSAoeSA+PSB5bSkgPDwgMSB8ICh4ID49IHhtKSkgewogICAgICAgICAgICBxID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIHF1YWRzW3F1YWRzLmxlbmd0aCAtIDFdID0gcXVhZHNbcXVhZHMubGVuZ3RoIC0gMSAtIGldOwogICAgICAgICAgICBxdWFkc1txdWFkcy5sZW5ndGggLSAxIC0gaV0gPSBxOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gVmlzaXQgdGhpcyBwb2ludC4gKFZpc2l0aW5nIGNvaW5jaWRlbnQgcG9pbnRzIGlzbuKAmXQgbmVjZXNzYXJ5ISkKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBkeCA9IHggLSArdGhpcy5feC5jYWxsKG51bGwsIG5vZGUuZGF0YSksCiAgICAgICAgICAgICAgZHkgPSB5IC0gK3RoaXMuX3kuY2FsbChudWxsLCBub2RlLmRhdGEpLAogICAgICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHk7CiAgICAgICAgICBpZiAoZDIgPCByYWRpdXMpIHsKICAgICAgICAgICAgdmFyIGQgPSBNYXRoLnNxcnQocmFkaXVzID0gZDIpOwogICAgICAgICAgICB4MCA9IHggLSBkLCB5MCA9IHkgLSBkOwogICAgICAgICAgICB4MyA9IHggKyBkLCB5MyA9IHkgKyBkOwogICAgICAgICAgICBkYXRhID0gbm9kZS5kYXRhOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGRhdGE7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV9yZW1vdmUkMihkKSB7CiAgICAgIGlmIChpc05hTih4ID0gK3RoaXMuX3guY2FsbChudWxsLCBkKSkgfHwgaXNOYU4oeSA9ICt0aGlzLl95LmNhbGwobnVsbCwgZCkpKSByZXR1cm4gdGhpczsgLy8gaWdub3JlIGludmFsaWQgcG9pbnRzCgogICAgICB2YXIgcGFyZW50LAogICAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgICAgICByZXRhaW5lciwKICAgICAgICAgIHByZXZpb3VzLAogICAgICAgICAgbmV4dCwKICAgICAgICAgIHgwID0gdGhpcy5feDAsCiAgICAgICAgICB5MCA9IHRoaXMuX3kwLAogICAgICAgICAgeDEgPSB0aGlzLl94MSwKICAgICAgICAgIHkxID0gdGhpcy5feTEsCiAgICAgICAgICB4LAogICAgICAgICAgeSwKICAgICAgICAgIHhtLAogICAgICAgICAgeW0sCiAgICAgICAgICByaWdodCwKICAgICAgICAgIGJvdHRvbSwKICAgICAgICAgIGksCiAgICAgICAgICBqOwoKICAgICAgLy8gSWYgdGhlIHRyZWUgaXMgZW1wdHksIGluaXRpYWxpemUgdGhlIHJvb3QgYXMgYSBsZWFmLgogICAgICBpZiAoIW5vZGUpIHJldHVybiB0aGlzOwoKICAgICAgLy8gRmluZCB0aGUgbGVhZiBub2RlIGZvciB0aGUgcG9pbnQuCiAgICAgIC8vIFdoaWxlIGRlc2NlbmRpbmcsIGFsc28gcmV0YWluIHRoZSBkZWVwZXN0IHBhcmVudCB3aXRoIGEgbm9uLXJlbW92ZWQgc2libGluZy4KICAgICAgaWYgKG5vZGUubGVuZ3RoKSB3aGlsZSAodHJ1ZSkgewogICAgICAgIGlmIChyaWdodCA9IHggPj0gKHhtID0gKHgwICsgeDEpIC8gMikpIHgwID0geG07IGVsc2UgeDEgPSB4bTsKICAgICAgICBpZiAoYm90dG9tID0geSA+PSAoeW0gPSAoeTAgKyB5MSkgLyAyKSkgeTAgPSB5bTsgZWxzZSB5MSA9IHltOwogICAgICAgIGlmICghKHBhcmVudCA9IG5vZGUsIG5vZGUgPSBub2RlW2kgPSBib3R0b20gPDwgMSB8IHJpZ2h0XSkpIHJldHVybiB0aGlzOwogICAgICAgIGlmICghbm9kZS5sZW5ndGgpIGJyZWFrOwogICAgICAgIGlmIChwYXJlbnRbKGkgKyAxKSAmIDNdIHx8IHBhcmVudFsoaSArIDIpICYgM10gfHwgcGFyZW50WyhpICsgMykgJiAzXSkgcmV0YWluZXIgPSBwYXJlbnQsIGogPSBpOwogICAgICB9CgogICAgICAvLyBGaW5kIHRoZSBwb2ludCB0byByZW1vdmUuCiAgICAgIHdoaWxlIChub2RlLmRhdGEgIT09IGQpIGlmICghKHByZXZpb3VzID0gbm9kZSwgbm9kZSA9IG5vZGUubmV4dCkpIHJldHVybiB0aGlzOwogICAgICBpZiAobmV4dCA9IG5vZGUubmV4dCkgZGVsZXRlIG5vZGUubmV4dDsKCiAgICAgIC8vIElmIHRoZXJlIGFyZSBtdWx0aXBsZSBjb2luY2lkZW50IHBvaW50cywgcmVtb3ZlIGp1c3QgdGhlIHBvaW50LgogICAgICBpZiAocHJldmlvdXMpIHJldHVybiAobmV4dCA/IHByZXZpb3VzLm5leHQgPSBuZXh0IDogZGVsZXRlIHByZXZpb3VzLm5leHQpLCB0aGlzOwoKICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgcm9vdCBwb2ludCwgcmVtb3ZlIGl0LgogICAgICBpZiAoIXBhcmVudCkgcmV0dXJuIHRoaXMuX3Jvb3QgPSBuZXh0LCB0aGlzOwoKICAgICAgLy8gUmVtb3ZlIHRoaXMgbGVhZi4KICAgICAgbmV4dCA/IHBhcmVudFtpXSA9IG5leHQgOiBkZWxldGUgcGFyZW50W2ldOwoKICAgICAgLy8gSWYgdGhlIHBhcmVudCBub3cgY29udGFpbnMgZXhhY3RseSBvbmUgbGVhZiwgY29sbGFwc2Ugc3VwZXJmbHVvdXMgcGFyZW50cy4KICAgICAgaWYgKChub2RlID0gcGFyZW50WzBdIHx8IHBhcmVudFsxXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzNdKQogICAgICAgICAgJiYgbm9kZSA9PT0gKHBhcmVudFszXSB8fCBwYXJlbnRbMl0gfHwgcGFyZW50WzFdIHx8IHBhcmVudFswXSkKICAgICAgICAgICYmICFub2RlLmxlbmd0aCkgewogICAgICAgIGlmIChyZXRhaW5lcikgcmV0YWluZXJbal0gPSBub2RlOwogICAgICAgIGVsc2UgdGhpcy5fcm9vdCA9IG5vZGU7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUFsbCQyKGRhdGEpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBkYXRhLmxlbmd0aDsgaSA8IG47ICsraSkgdGhpcy5yZW1vdmUoZGF0YVtpXSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfcm9vdCQyKCkgewogICAgICByZXR1cm4gdGhpcy5fcm9vdDsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3NpemUkMigpIHsKICAgICAgdmFyIHNpemUgPSAwOwogICAgICB0aGlzLnZpc2l0KGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICBpZiAoIW5vZGUubGVuZ3RoKSBkbyArK3NpemU7IHdoaWxlIChub2RlID0gbm9kZS5uZXh0KQogICAgICB9KTsKICAgICAgcmV0dXJuIHNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV92aXNpdCQyKGNhbGxiYWNrKSB7CiAgICAgIHZhciBxdWFkcyA9IFtdLCBxLCBub2RlID0gdGhpcy5fcm9vdCwgY2hpbGQsIHgwLCB5MCwgeDEsIHkxOwogICAgICBpZiAobm9kZSkgcXVhZHMucHVzaChuZXcgUXVhZCQyKG5vZGUsIHRoaXMuX3gwLCB0aGlzLl95MCwgdGhpcy5feDEsIHRoaXMuX3kxKSk7CiAgICAgIHdoaWxlIChxID0gcXVhZHMucG9wKCkpIHsKICAgICAgICBpZiAoIWNhbGxiYWNrKG5vZGUgPSBxLm5vZGUsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSkgJiYgbm9kZS5sZW5ndGgpIHsKICAgICAgICAgIHZhciB4bSA9ICh4MCArIHgxKSAvIDIsIHltID0gKHkwICsgeTEpIC8gMjsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbM10pIHF1YWRzLnB1c2gobmV3IFF1YWQkMihjaGlsZCwgeG0sIHltLCB4MSwgeTEpKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMl0pIHF1YWRzLnB1c2gobmV3IFF1YWQkMihjaGlsZCwgeDAsIHltLCB4bSwgeTEpKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMV0pIHF1YWRzLnB1c2gobmV3IFF1YWQkMihjaGlsZCwgeG0sIHkwLCB4MSwgeW0pKTsKICAgICAgICAgIGlmIChjaGlsZCA9IG5vZGVbMF0pIHF1YWRzLnB1c2gobmV3IFF1YWQkMihjaGlsZCwgeDAsIHkwLCB4bSwgeW0pKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gdHJlZV92aXNpdEFmdGVyJDIoY2FsbGJhY2spIHsKICAgICAgdmFyIHF1YWRzID0gW10sIG5leHQgPSBbXSwgcTsKICAgICAgaWYgKHRoaXMuX3Jvb3QpIHF1YWRzLnB1c2gobmV3IFF1YWQkMih0aGlzLl9yb290LCB0aGlzLl94MCwgdGhpcy5feTAsIHRoaXMuX3gxLCB0aGlzLl95MSkpOwogICAgICB3aGlsZSAocSA9IHF1YWRzLnBvcCgpKSB7CiAgICAgICAgdmFyIG5vZGUgPSBxLm5vZGU7CiAgICAgICAgaWYgKG5vZGUubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgY2hpbGQsIHgwID0gcS54MCwgeTAgPSBxLnkwLCB4MSA9IHEueDEsIHkxID0gcS55MSwgeG0gPSAoeDAgKyB4MSkgLyAyLCB5bSA9ICh5MCArIHkxKSAvIDI7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzBdKSBxdWFkcy5wdXNoKG5ldyBRdWFkJDIoY2hpbGQsIHgwLCB5MCwgeG0sIHltKSk7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzFdKSBxdWFkcy5wdXNoKG5ldyBRdWFkJDIoY2hpbGQsIHhtLCB5MCwgeDEsIHltKSk7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzJdKSBxdWFkcy5wdXNoKG5ldyBRdWFkJDIoY2hpbGQsIHgwLCB5bSwgeG0sIHkxKSk7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlWzNdKSBxdWFkcy5wdXNoKG5ldyBRdWFkJDIoY2hpbGQsIHhtLCB5bSwgeDEsIHkxKSk7CiAgICAgICAgfQogICAgICAgIG5leHQucHVzaChxKTsKICAgICAgfQogICAgICB3aGlsZSAocSA9IG5leHQucG9wKCkpIHsKICAgICAgICBjYWxsYmFjayhxLm5vZGUsIHEueDAsIHEueTAsIHEueDEsIHEueTEpOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRYJDMoZCkgewogICAgICByZXR1cm4gZFswXTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmVlX3gkMihfKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRoaXMuX3ggPSBfLCB0aGlzKSA6IHRoaXMuX3g7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFkkMyhkKSB7CiAgICAgIHJldHVybiBkWzFdOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVfeSQyKF8pIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGhpcy5feSA9IF8sIHRoaXMpIDogdGhpcy5feTsKICAgIH0KCiAgICBmdW5jdGlvbiBxdWFkdHJlZSQyKG5vZGVzLCB4LCB5KSB7CiAgICAgIHZhciB0cmVlID0gbmV3IFF1YWR0cmVlJDIoeCA9PSBudWxsID8gZGVmYXVsdFgkMyA6IHgsIHkgPT0gbnVsbCA/IGRlZmF1bHRZJDMgOiB5LCBOYU4sIE5hTiwgTmFOLCBOYU4pOwogICAgICByZXR1cm4gbm9kZXMgPT0gbnVsbCA/IHRyZWUgOiB0cmVlLmFkZEFsbChub2Rlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gUXVhZHRyZWUkMih4LCB5LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB0aGlzLl94ID0geDsKICAgICAgdGhpcy5feSA9IHk7CiAgICAgIHRoaXMuX3gwID0geDA7CiAgICAgIHRoaXMuX3kwID0geTA7CiAgICAgIHRoaXMuX3gxID0geDE7CiAgICAgIHRoaXMuX3kxID0geTE7CiAgICAgIHRoaXMuX3Jvb3QgPSB1bmRlZmluZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gbGVhZl9jb3B5JDIobGVhZikgewogICAgICB2YXIgY29weSA9IHtkYXRhOiBsZWFmLmRhdGF9LCBuZXh0ID0gY29weTsKICAgICAgd2hpbGUgKGxlYWYgPSBsZWFmLm5leHQpIG5leHQgPSBuZXh0Lm5leHQgPSB7ZGF0YTogbGVhZi5kYXRhfTsKICAgICAgcmV0dXJuIGNvcHk7CiAgICB9CgogICAgdmFyIHRyZWVQcm90byQyID0gcXVhZHRyZWUkMi5wcm90b3R5cGUgPSBRdWFkdHJlZSQyLnByb3RvdHlwZTsKCiAgICB0cmVlUHJvdG8kMi5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBjb3B5ID0gbmV3IFF1YWR0cmVlJDIodGhpcy5feCwgdGhpcy5feSwgdGhpcy5feDAsIHRoaXMuX3kwLCB0aGlzLl94MSwgdGhpcy5feTEpLAogICAgICAgICAgbm9kZSA9IHRoaXMuX3Jvb3QsCiAgICAgICAgICBub2RlcywKICAgICAgICAgIGNoaWxkOwoKICAgICAgaWYgKCFub2RlKSByZXR1cm4gY29weTsKCiAgICAgIGlmICghbm9kZS5sZW5ndGgpIHJldHVybiBjb3B5Ll9yb290ID0gbGVhZl9jb3B5JDIobm9kZSksIGNvcHk7CgogICAgICBub2RlcyA9IFt7c291cmNlOiBub2RlLCB0YXJnZXQ6IGNvcHkuX3Jvb3QgPSBuZXcgQXJyYXkoNCl9XTsKICAgICAgd2hpbGUgKG5vZGUgPSBub2Rlcy5wb3AoKSkgewogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgKytpKSB7CiAgICAgICAgICBpZiAoY2hpbGQgPSBub2RlLnNvdXJjZVtpXSkgewogICAgICAgICAgICBpZiAoY2hpbGQubGVuZ3RoKSBub2Rlcy5wdXNoKHtzb3VyY2U6IGNoaWxkLCB0YXJnZXQ6IG5vZGUudGFyZ2V0W2ldID0gbmV3IEFycmF5KDQpfSk7CiAgICAgICAgICAgIGVsc2Ugbm9kZS50YXJnZXRbaV0gPSBsZWFmX2NvcHkkMihjaGlsZCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gY29weTsKICAgIH07CgogICAgdHJlZVByb3RvJDIuYWRkID0gdHJlZV9hZGQkMjsKICAgIHRyZWVQcm90byQyLmFkZEFsbCA9IGFkZEFsbCQyOwogICAgdHJlZVByb3RvJDIuY292ZXIgPSB0cmVlX2NvdmVyJDI7CiAgICB0cmVlUHJvdG8kMi5kYXRhID0gdHJlZV9kYXRhJDI7CiAgICB0cmVlUHJvdG8kMi5leHRlbnQgPSB0cmVlX2V4dGVudCQyOwogICAgdHJlZVByb3RvJDIuZmluZCA9IHRyZWVfZmluZCQyOwogICAgdHJlZVByb3RvJDIucmVtb3ZlID0gdHJlZV9yZW1vdmUkMjsKICAgIHRyZWVQcm90byQyLnJlbW92ZUFsbCA9IHJlbW92ZUFsbCQyOwogICAgdHJlZVByb3RvJDIucm9vdCA9IHRyZWVfcm9vdCQyOwogICAgdHJlZVByb3RvJDIuc2l6ZSA9IHRyZWVfc2l6ZSQyOwogICAgdHJlZVByb3RvJDIudmlzaXQgPSB0cmVlX3Zpc2l0JDI7CiAgICB0cmVlUHJvdG8kMi52aXNpdEFmdGVyID0gdHJlZV92aXNpdEFmdGVyJDI7CiAgICB0cmVlUHJvdG8kMi54ID0gdHJlZV94JDI7CiAgICB0cmVlUHJvdG8kMi55ID0gdHJlZV95JDI7CgogICAgdmFyIHNsaWNlJGIgPSBbXS5zbGljZTsKCiAgICB2YXIgbm9hYm9ydCA9IHt9OwoKICAgIGZ1bmN0aW9uIFF1ZXVlKHNpemUpIHsKICAgICAgdGhpcy5fc2l6ZSA9IHNpemU7CiAgICAgIHRoaXMuX2NhbGwgPQogICAgICB0aGlzLl9lcnJvciA9IG51bGw7CiAgICAgIHRoaXMuX3Rhc2tzID0gW107CiAgICAgIHRoaXMuX2RhdGEgPSBbXTsKICAgICAgdGhpcy5fd2FpdGluZyA9CiAgICAgIHRoaXMuX2FjdGl2ZSA9CiAgICAgIHRoaXMuX2VuZGVkID0KICAgICAgdGhpcy5fc3RhcnQgPSAwOyAvLyBpbnNpZGUgYSBzeW5jaHJvbm91cyB0YXNrIGNhbGxiYWNrPwogICAgfQoKICAgIFF1ZXVlLnByb3RvdHlwZSA9IHF1ZXVlLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFF1ZXVlLAogICAgICBkZWZlcjogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTsKICAgICAgICBpZiAodGhpcy5fY2FsbCkgdGhyb3cgbmV3IEVycm9yKCJkZWZlciBhZnRlciBhd2FpdCIpOwogICAgICAgIGlmICh0aGlzLl9lcnJvciAhPSBudWxsKSByZXR1cm4gdGhpczsKICAgICAgICB2YXIgdCA9IHNsaWNlJGIuY2FsbChhcmd1bWVudHMsIDEpOwogICAgICAgIHQucHVzaChjYWxsYmFjayk7CiAgICAgICAgKyt0aGlzLl93YWl0aW5nLCB0aGlzLl90YXNrcy5wdXNoKHQpOwogICAgICAgIHBva2UkMyh0aGlzKTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgYWJvcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9lcnJvciA9PSBudWxsKSBhYm9ydCh0aGlzLCBuZXcgRXJyb3IoImFib3J0IikpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICBhd2FpdDogZnVuY3Rpb24oY2FsbGJhY2spIHsKICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2siKTsKICAgICAgICBpZiAodGhpcy5fY2FsbCkgdGhyb3cgbmV3IEVycm9yKCJtdWx0aXBsZSBhd2FpdCIpOwogICAgICAgIHRoaXMuX2NhbGwgPSBmdW5jdGlvbihlcnJvciwgcmVzdWx0cykgeyBjYWxsYmFjay5hcHBseShudWxsLCBbZXJyb3JdLmNvbmNhdChyZXN1bHRzKSk7IH07CiAgICAgICAgbWF5YmVOb3RpZnkodGhpcyk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGF3YWl0QWxsOiBmdW5jdGlvbihjYWxsYmFjaykgewogICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjayIpOwogICAgICAgIGlmICh0aGlzLl9jYWxsKSB0aHJvdyBuZXcgRXJyb3IoIm11bHRpcGxlIGF3YWl0Iik7CiAgICAgICAgdGhpcy5fY2FsbCA9IGNhbGxiYWNrOwogICAgICAgIG1heWJlTm90aWZ5KHRoaXMpOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHBva2UkMyhxKSB7CiAgICAgIGlmICghcS5fc3RhcnQpIHsKICAgICAgICB0cnkgeyBzdGFydCQyKHEpOyB9IC8vIGxldCB0aGUgY3VycmVudCB0YXNrIGNvbXBsZXRlCiAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgIGlmIChxLl90YXNrc1txLl9lbmRlZCArIHEuX2FjdGl2ZSAtIDFdKSBhYm9ydChxLCBlKTsgLy8gdGFzayBlcnJvcmVkIHN5bmNocm9ub3VzbHkKICAgICAgICAgIGVsc2UgaWYgKCFxLl9kYXRhKSB0aHJvdyBlOyAvLyBhd2FpdCBjYWxsYmFjayBlcnJvcmVkIHN5bmNocm9ub3VzbHkKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzdGFydCQyKHEpIHsKICAgICAgd2hpbGUgKHEuX3N0YXJ0ID0gcS5fd2FpdGluZyAmJiBxLl9hY3RpdmUgPCBxLl9zaXplKSB7CiAgICAgICAgdmFyIGkgPSBxLl9lbmRlZCArIHEuX2FjdGl2ZSwKICAgICAgICAgICAgdCA9IHEuX3Rhc2tzW2ldLAogICAgICAgICAgICBqID0gdC5sZW5ndGggLSAxLAogICAgICAgICAgICBjID0gdFtqXTsKICAgICAgICB0W2pdID0gZW5kKHEsIGkpOwogICAgICAgIC0tcS5fd2FpdGluZywgKytxLl9hY3RpdmU7CiAgICAgICAgdCA9IGMuYXBwbHkobnVsbCwgdCk7CiAgICAgICAgaWYgKCFxLl90YXNrc1tpXSkgY29udGludWU7IC8vIHRhc2sgZmluaXNoZWQgc3luY2hyb25vdXNseQogICAgICAgIHEuX3Rhc2tzW2ldID0gdCB8fCBub2Fib3J0OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZW5kKHEsIGkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGUsIHIpIHsKICAgICAgICBpZiAoIXEuX3Rhc2tzW2ldKSByZXR1cm47IC8vIGlnbm9yZSBtdWx0aXBsZSBjYWxsYmFja3MKICAgICAgICAtLXEuX2FjdGl2ZSwgKytxLl9lbmRlZDsKICAgICAgICBxLl90YXNrc1tpXSA9IG51bGw7CiAgICAgICAgaWYgKHEuX2Vycm9yICE9IG51bGwpIHJldHVybjsgLy8gaWdub3JlIHNlY29uZGFyeSBlcnJvcnMKICAgICAgICBpZiAoZSAhPSBudWxsKSB7CiAgICAgICAgICBhYm9ydChxLCBlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcS5fZGF0YVtpXSA9IHI7CiAgICAgICAgICBpZiAocS5fd2FpdGluZykgcG9rZSQzKHEpOwogICAgICAgICAgZWxzZSBtYXliZU5vdGlmeShxKTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYWJvcnQocSwgZSkgewogICAgICB2YXIgaSA9IHEuX3Rhc2tzLmxlbmd0aCwgdDsKICAgICAgcS5fZXJyb3IgPSBlOyAvLyBpZ25vcmUgYWN0aXZlIGNhbGxiYWNrcwogICAgICBxLl9kYXRhID0gdW5kZWZpbmVkOyAvLyBhbGxvdyBnYwogICAgICBxLl93YWl0aW5nID0gTmFOOyAvLyBwcmV2ZW50IHN0YXJ0aW5nCgogICAgICB3aGlsZSAoLS1pID49IDApIHsKICAgICAgICBpZiAodCA9IHEuX3Rhc2tzW2ldKSB7CiAgICAgICAgICBxLl90YXNrc1tpXSA9IG51bGw7CiAgICAgICAgICBpZiAodC5hYm9ydCkgewogICAgICAgICAgICB0cnkgeyB0LmFib3J0KCk7IH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsgLyogaWdub3JlICovIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHEuX2FjdGl2ZSA9IE5hTjsgLy8gYWxsb3cgbm90aWZpY2F0aW9uCiAgICAgIG1heWJlTm90aWZ5KHEpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1heWJlTm90aWZ5KHEpIHsKICAgICAgaWYgKCFxLl9hY3RpdmUgJiYgcS5fY2FsbCkgewogICAgICAgIHZhciBkID0gcS5fZGF0YTsKICAgICAgICBxLl9kYXRhID0gdW5kZWZpbmVkOyAvLyBhbGxvdyBnYwogICAgICAgIHEuX2NhbGwocS5fZXJyb3IsIGQpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcXVldWUoY29uY3VycmVuY3kpIHsKICAgICAgaWYgKGNvbmN1cnJlbmN5ID09IG51bGwpIGNvbmN1cnJlbmN5ID0gSW5maW5pdHk7CiAgICAgIGVsc2UgaWYgKCEoKGNvbmN1cnJlbmN5ID0gK2NvbmN1cnJlbmN5KSA+PSAxKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNvbmN1cnJlbmN5Iik7CiAgICAgIHJldHVybiBuZXcgUXVldWUoY29uY3VycmVuY3kpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRTb3VyY2UkMygpIHsKICAgICAgcmV0dXJuIE1hdGgucmFuZG9tKCk7CiAgICB9CgogICAgdmFyIHVuaWZvcm0kMSA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Vbmlmb3JtKHNvdXJjZSkgewogICAgICBmdW5jdGlvbiByYW5kb21Vbmlmb3JtKG1pbiwgbWF4KSB7CiAgICAgICAgbWluID0gbWluID09IG51bGwgPyAwIDogK21pbjsKICAgICAgICBtYXggPSBtYXggPT0gbnVsbCA/IDEgOiArbWF4OwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAxKSBtYXggPSBtaW4sIG1pbiA9IDA7CiAgICAgICAgZWxzZSBtYXggLT0gbWluOwogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIHJldHVybiBzb3VyY2UoKSAqIG1heCArIG1pbjsKICAgICAgICB9OwogICAgICB9CgogICAgICByYW5kb21Vbmlmb3JtLnNvdXJjZSA9IHNvdXJjZVJhbmRvbVVuaWZvcm07CgogICAgICByZXR1cm4gcmFuZG9tVW5pZm9ybTsKICAgIH0pKGRlZmF1bHRTb3VyY2UkMyk7CgogICAgdmFyIG5vcm1hbCQxID0gKGZ1bmN0aW9uIHNvdXJjZVJhbmRvbU5vcm1hbChzb3VyY2UpIHsKICAgICAgZnVuY3Rpb24gcmFuZG9tTm9ybWFsKG11LCBzaWdtYSkgewogICAgICAgIHZhciB4LCByOwogICAgICAgIG11ID0gbXUgPT0gbnVsbCA/IDAgOiArbXU7CiAgICAgICAgc2lnbWEgPSBzaWdtYSA9PSBudWxsID8gMSA6ICtzaWdtYTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgeTsKCiAgICAgICAgICAvLyBJZiBhdmFpbGFibGUsIHVzZSB0aGUgc2Vjb25kIHByZXZpb3VzbHktZ2VuZXJhdGVkIHVuaWZvcm0gcmFuZG9tLgogICAgICAgICAgaWYgKHggIT0gbnVsbCkgeSA9IHgsIHggPSBudWxsOwoKICAgICAgICAgIC8vIE90aGVyd2lzZSwgZ2VuZXJhdGUgYSBuZXcgeCBhbmQgeS4KICAgICAgICAgIGVsc2UgZG8gewogICAgICAgICAgICB4ID0gc291cmNlKCkgKiAyIC0gMTsKICAgICAgICAgICAgeSA9IHNvdXJjZSgpICogMiAtIDE7CiAgICAgICAgICAgIHIgPSB4ICogeCArIHkgKiB5OwogICAgICAgICAgfSB3aGlsZSAoIXIgfHwgciA+IDEpOwoKICAgICAgICAgIHJldHVybiBtdSArIHNpZ21hICogeSAqIE1hdGguc3FydCgtMiAqIE1hdGgubG9nKHIpIC8gcik7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgcmFuZG9tTm9ybWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbU5vcm1hbDsKCiAgICAgIHJldHVybiByYW5kb21Ob3JtYWw7CiAgICB9KShkZWZhdWx0U291cmNlJDMpOwoKICAgIHZhciBsb2dOb3JtYWwkMSA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21Mb2dOb3JtYWwoc291cmNlKSB7CiAgICAgIGZ1bmN0aW9uIHJhbmRvbUxvZ05vcm1hbCgpIHsKICAgICAgICB2YXIgcmFuZG9tTm9ybWFsID0gbm9ybWFsJDEuc291cmNlKHNvdXJjZSkuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5leHAocmFuZG9tTm9ybWFsKCkpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJhbmRvbUxvZ05vcm1hbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21Mb2dOb3JtYWw7CgogICAgICByZXR1cm4gcmFuZG9tTG9nTm9ybWFsOwogICAgfSkoZGVmYXVsdFNvdXJjZSQzKTsKCiAgICB2YXIgaXJ3aW5IYWxsJDEgPSAoZnVuY3Rpb24gc291cmNlUmFuZG9tSXJ3aW5IYWxsKHNvdXJjZSkgewogICAgICBmdW5jdGlvbiByYW5kb21JcndpbkhhbGwobikgewogICAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAgIGZvciAodmFyIHN1bSA9IDAsIGkgPSAwOyBpIDwgbjsgKytpKSBzdW0gKz0gc291cmNlKCk7CiAgICAgICAgICByZXR1cm4gc3VtOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJhbmRvbUlyd2luSGFsbC5zb3VyY2UgPSBzb3VyY2VSYW5kb21JcndpbkhhbGw7CgogICAgICByZXR1cm4gcmFuZG9tSXJ3aW5IYWxsOwogICAgfSkoZGVmYXVsdFNvdXJjZSQzKTsKCiAgICB2YXIgYmF0ZXMkMSA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21CYXRlcyhzb3VyY2UpIHsKICAgICAgZnVuY3Rpb24gcmFuZG9tQmF0ZXMobikgewogICAgICAgIHZhciByYW5kb21JcndpbkhhbGwgPSBpcndpbkhhbGwkMS5zb3VyY2Uoc291cmNlKShuKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICByZXR1cm4gcmFuZG9tSXJ3aW5IYWxsKCkgLyBuOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJhbmRvbUJhdGVzLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUJhdGVzOwoKICAgICAgcmV0dXJuIHJhbmRvbUJhdGVzOwogICAgfSkoZGVmYXVsdFNvdXJjZSQzKTsKCiAgICB2YXIgZXhwb25lbnRpYWwkNCA9IChmdW5jdGlvbiBzb3VyY2VSYW5kb21FeHBvbmVudGlhbChzb3VyY2UpIHsKICAgICAgZnVuY3Rpb24gcmFuZG9tRXhwb25lbnRpYWwobGFtYmRhKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIC1NYXRoLmxvZygxIC0gc291cmNlKCkpIC8gbGFtYmRhOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJhbmRvbUV4cG9uZW50aWFsLnNvdXJjZSA9IHNvdXJjZVJhbmRvbUV4cG9uZW50aWFsOwoKICAgICAgcmV0dXJuIHJhbmRvbUV4cG9uZW50aWFsOwogICAgfSkoZGVmYXVsdFNvdXJjZSQzKTsKCiAgICBmdW5jdGlvbiByZXF1ZXN0KHVybCwgY2FsbGJhY2spIHsKICAgICAgdmFyIHJlcXVlc3QsCiAgICAgICAgICBldmVudCA9IGRpc3BhdGNoKCJiZWZvcmVzZW5kIiwgInByb2dyZXNzIiwgImxvYWQiLCAiZXJyb3IiKSwKICAgICAgICAgIG1pbWVUeXBlLAogICAgICAgICAgaGVhZGVycyA9IG1hcCQxKCksCiAgICAgICAgICB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QsCiAgICAgICAgICB1c2VyID0gbnVsbCwKICAgICAgICAgIHBhc3N3b3JkID0gbnVsbCwKICAgICAgICAgIHJlc3BvbnNlLAogICAgICAgICAgcmVzcG9uc2VUeXBlLAogICAgICAgICAgdGltZW91dCA9IDA7CgogICAgICAvLyBJZiBJRSBkb2VzIG5vdCBzdXBwb3J0IENPUlMsIHVzZSBYRG9tYWluUmVxdWVzdC4KICAgICAgaWYgKHR5cGVvZiBYRG9tYWluUmVxdWVzdCAhPT0gInVuZGVmaW5lZCIKICAgICAgICAgICYmICEoIndpdGhDcmVkZW50aWFscyIgaW4geGhyKQogICAgICAgICAgJiYgL14oaHR0cChzKT86KT9cL1wvLy50ZXN0KHVybCkpIHhociA9IG5ldyBYRG9tYWluUmVxdWVzdDsKCiAgICAgICJvbmxvYWQiIGluIHhocgogICAgICAgICAgPyB4aHIub25sb2FkID0geGhyLm9uZXJyb3IgPSB4aHIub250aW1lb3V0ID0gcmVzcG9uZAogICAgICAgICAgOiB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24obykgeyB4aHIucmVhZHlTdGF0ZSA+IDMgJiYgcmVzcG9uZChvKTsgfTsKCiAgICAgIGZ1bmN0aW9uIHJlc3BvbmQobykgewogICAgICAgIHZhciBzdGF0dXMgPSB4aHIuc3RhdHVzLCByZXN1bHQ7CiAgICAgICAgaWYgKCFzdGF0dXMgJiYgaGFzUmVzcG9uc2UoeGhyKQogICAgICAgICAgICB8fCBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMAogICAgICAgICAgICB8fCBzdGF0dXMgPT09IDMwNCkgewogICAgICAgICAgaWYgKHJlc3BvbnNlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzcG9uc2UuY2FsbChyZXF1ZXN0LCB4aHIpOwogICAgICAgICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgZXZlbnQuY2FsbCgiZXJyb3IiLCByZXF1ZXN0LCBlKTsKICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHJlc3VsdCA9IHhocjsKICAgICAgICAgIH0KICAgICAgICAgIGV2ZW50LmNhbGwoImxvYWQiLCByZXF1ZXN0LCByZXN1bHQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBldmVudC5jYWxsKCJlcnJvciIsIHJlcXVlc3QsIG8pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgeGhyLm9ucHJvZ3Jlc3MgPSBmdW5jdGlvbihlKSB7CiAgICAgICAgZXZlbnQuY2FsbCgicHJvZ3Jlc3MiLCByZXF1ZXN0LCBlKTsKICAgICAgfTsKCiAgICAgIHJlcXVlc3QgPSB7CiAgICAgICAgaGVhZGVyOiBmdW5jdGlvbihuYW1lLCB2YWx1ZSkgewogICAgICAgICAgbmFtZSA9IChuYW1lICsgIiIpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiBoZWFkZXJzLmdldChuYW1lKTsKICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSBoZWFkZXJzLnJlbW92ZShuYW1lKTsKICAgICAgICAgIGVsc2UgaGVhZGVycy5zZXQobmFtZSwgdmFsdWUgKyAiIik7CiAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKICAgICAgICB9LAoKICAgICAgICAvLyBJZiBtaW1lVHlwZSBpcyBub24tbnVsbCBhbmQgbm8gQWNjZXB0IGhlYWRlciBpcyBzZXQsIGEgZGVmYXVsdCBpcyB1c2VkLgogICAgICAgIG1pbWVUeXBlOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gbWltZVR5cGU7CiAgICAgICAgICBtaW1lVHlwZSA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyAiIjsKICAgICAgICAgIHJldHVybiByZXF1ZXN0OwogICAgICAgIH0sCgogICAgICAgIC8vIFNwZWNpZmllcyB3aGF0IHR5cGUgdGhlIHJlc3BvbnNlIHZhbHVlIHNob3VsZCB0YWtlOwogICAgICAgIC8vIGZvciBpbnN0YW5jZSwgYXJyYXlidWZmZXIsIGJsb2IsIGRvY3VtZW50LCBvciB0ZXh0LgogICAgICAgIHJlc3BvbnNlVHlwZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHJlc3BvbnNlVHlwZTsKICAgICAgICAgIHJlc3BvbnNlVHlwZSA9IHZhbHVlOwogICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CiAgICAgICAgfSwKCiAgICAgICAgdGltZW91dDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIHRpbWVvdXQ7CiAgICAgICAgICB0aW1lb3V0ID0gK3ZhbHVlOwogICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CiAgICAgICAgfSwKCiAgICAgICAgdXNlcjogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IHVzZXIgOiAodXNlciA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyAiIiwgcmVxdWVzdCk7CiAgICAgICAgfSwKCiAgICAgICAgcGFzc3dvcmQ6IGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDEgPyBwYXNzd29yZCA6IChwYXNzd29yZCA9IHZhbHVlID09IG51bGwgPyBudWxsIDogdmFsdWUgKyAiIiwgcmVxdWVzdCk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gU3BlY2lmeSBob3cgdG8gY29udmVydCB0aGUgcmVzcG9uc2UgY29udGVudCB0byBhIHNwZWNpZmljIHR5cGU7CiAgICAgICAgLy8gY2hhbmdlcyB0aGUgY2FsbGJhY2sgdmFsdWUgb24gImxvYWQiIGV2ZW50cy4KICAgICAgICByZXNwb25zZTogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICAgIHJlc3BvbnNlID0gdmFsdWU7CiAgICAgICAgICByZXR1cm4gcmVxdWVzdDsKICAgICAgICB9LAoKICAgICAgICAvLyBBbGlhcyBmb3Igc2VuZCgiR0VUIiwg4oCmKS4KICAgICAgICBnZXQ6IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICByZXR1cm4gcmVxdWVzdC5zZW5kKCJHRVQiLCBkYXRhLCBjYWxsYmFjayk7CiAgICAgICAgfSwKCiAgICAgICAgLy8gQWxpYXMgZm9yIHNlbmQoIlBPU1QiLCDigKYpLgogICAgICAgIHBvc3Q6IGZ1bmN0aW9uKGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICByZXR1cm4gcmVxdWVzdC5zZW5kKCJQT1NUIiwgZGF0YSwgY2FsbGJhY2spOwogICAgICAgIH0sCgogICAgICAgIC8vIElmIGNhbGxiYWNrIGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIHVzZWQgZm9yIGVycm9yIGFuZCBsb2FkIGV2ZW50cy4KICAgICAgICBzZW5kOiBmdW5jdGlvbihtZXRob2QsIGRhdGEsIGNhbGxiYWNrKSB7CiAgICAgICAgICB4aHIub3BlbihtZXRob2QsIHVybCwgdHJ1ZSwgdXNlciwgcGFzc3dvcmQpOwogICAgICAgICAgaWYgKG1pbWVUeXBlICE9IG51bGwgJiYgIWhlYWRlcnMuaGFzKCJhY2NlcHQiKSkgaGVhZGVycy5zZXQoImFjY2VwdCIsIG1pbWVUeXBlICsgIiwqLyoiKTsKICAgICAgICAgIGlmICh4aHIuc2V0UmVxdWVzdEhlYWRlcikgaGVhZGVycy5lYWNoKGZ1bmN0aW9uKHZhbHVlLCBuYW1lKSB7IHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlKTsgfSk7CiAgICAgICAgICBpZiAobWltZVR5cGUgIT0gbnVsbCAmJiB4aHIub3ZlcnJpZGVNaW1lVHlwZSkgeGhyLm92ZXJyaWRlTWltZVR5cGUobWltZVR5cGUpOwogICAgICAgICAgaWYgKHJlc3BvbnNlVHlwZSAhPSBudWxsKSB4aHIucmVzcG9uc2VUeXBlID0gcmVzcG9uc2VUeXBlOwogICAgICAgICAgaWYgKHRpbWVvdXQgPiAwKSB4aHIudGltZW91dCA9IHRpbWVvdXQ7CiAgICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCAmJiB0eXBlb2YgZGF0YSA9PT0gImZ1bmN0aW9uIikgY2FsbGJhY2sgPSBkYXRhLCBkYXRhID0gbnVsbDsKICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsICYmIGNhbGxiYWNrLmxlbmd0aCA9PT0gMSkgY2FsbGJhY2sgPSBmaXhDYWxsYmFjayhjYWxsYmFjayk7CiAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgcmVxdWVzdC5vbigiZXJyb3IiLCBjYWxsYmFjaykub24oImxvYWQiLCBmdW5jdGlvbih4aHIpIHsgY2FsbGJhY2sobnVsbCwgeGhyKTsgfSk7CiAgICAgICAgICBldmVudC5jYWxsKCJiZWZvcmVzZW5kIiwgcmVxdWVzdCwgeGhyKTsKICAgICAgICAgIHhoci5zZW5kKGRhdGEgPT0gbnVsbCA/IG51bGwgOiBkYXRhKTsKICAgICAgICAgIHJldHVybiByZXF1ZXN0OwogICAgICAgIH0sCgogICAgICAgIGFib3J0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIHhoci5hYm9ydCgpOwogICAgICAgICAgcmV0dXJuIHJlcXVlc3Q7CiAgICAgICAgfSwKCiAgICAgICAgb246IGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHZhbHVlID0gZXZlbnQub24uYXBwbHkoZXZlbnQsIGFyZ3VtZW50cyk7CiAgICAgICAgICByZXR1cm4gdmFsdWUgPT09IGV2ZW50ID8gcmVxdWVzdCA6IHZhbHVlOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7CiAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjayAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGNhbGxiYWNrOiAiICsgY2FsbGJhY2spOwogICAgICAgIHJldHVybiByZXF1ZXN0LmdldChjYWxsYmFjayk7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXF1ZXN0OwogICAgfQoKICAgIGZ1bmN0aW9uIGZpeENhbGxiYWNrKGNhbGxiYWNrKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihlcnJvciwgeGhyKSB7CiAgICAgICAgY2FsbGJhY2soZXJyb3IgPT0gbnVsbCA/IHhociA6IG51bGwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGhhc1Jlc3BvbnNlKHhocikgewogICAgICB2YXIgdHlwZSA9IHhoci5yZXNwb25zZVR5cGU7CiAgICAgIHJldHVybiB0eXBlICYmIHR5cGUgIT09ICJ0ZXh0IgogICAgICAgICAgPyB4aHIucmVzcG9uc2UgLy8gbnVsbCBvbiBlcnJvcgogICAgICAgICAgOiB4aHIucmVzcG9uc2VUZXh0OyAvLyAiIiBvbiBlcnJvcgogICAgfQoKICAgIGZ1bmN0aW9uIHR5cGUkMihkZWZhdWx0TWltZVR5cGUsIHJlc3BvbnNlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih1cmwsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIHIgPSByZXF1ZXN0KHVybCkubWltZVR5cGUoZGVmYXVsdE1pbWVUeXBlKS5yZXNwb25zZShyZXNwb25zZSk7CiAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgICAgICAgIHJldHVybiByLmdldChjYWxsYmFjayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByOwogICAgICB9OwogICAgfQoKICAgIHZhciBodG1sJDIgPSB0eXBlJDIoInRleHQvaHRtbCIsIGZ1bmN0aW9uKHhocikgewogICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlUmFuZ2UoKS5jcmVhdGVDb250ZXh0dWFsRnJhZ21lbnQoeGhyLnJlc3BvbnNlVGV4dCk7CiAgICB9KTsKCiAgICB2YXIganNvbiQxID0gdHlwZSQyKCJhcHBsaWNhdGlvbi9qc29uIiwgZnVuY3Rpb24oeGhyKSB7CiAgICAgIHJldHVybiBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgfSk7CgogICAgdmFyIHRleHQkMSA9IHR5cGUkMigidGV4dC9wbGFpbiIsIGZ1bmN0aW9uKHhocikgewogICAgICByZXR1cm4geGhyLnJlc3BvbnNlVGV4dDsKICAgIH0pOwoKICAgIHZhciB4bWwkMSA9IHR5cGUkMigiYXBwbGljYXRpb24veG1sIiwgZnVuY3Rpb24oeGhyKSB7CiAgICAgIHZhciB4bWwgPSB4aHIucmVzcG9uc2VYTUw7CiAgICAgIGlmICgheG1sKSB0aHJvdyBuZXcgRXJyb3IoInBhcnNlIGVycm9yIik7CiAgICAgIHJldHVybiB4bWw7CiAgICB9KTsKCiAgICBmdW5jdGlvbiBkc3YkMihkZWZhdWx0TWltZVR5cGUsIHBhcnNlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih1cmwsIHJvdywgY2FsbGJhY2spIHsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDMpIGNhbGxiYWNrID0gcm93LCByb3cgPSBudWxsOwogICAgICAgIHZhciByID0gcmVxdWVzdCh1cmwpLm1pbWVUeXBlKGRlZmF1bHRNaW1lVHlwZSk7CiAgICAgICAgci5yb3cgPSBmdW5jdGlvbihfKSB7IHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gci5yZXNwb25zZShyZXNwb25zZU9mKHBhcnNlLCByb3cgPSBfKSkgOiByb3c7IH07CiAgICAgICAgci5yb3cocm93KTsKICAgICAgICByZXR1cm4gY2FsbGJhY2sgPyByLmdldChjYWxsYmFjaykgOiByOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlc3BvbnNlT2YocGFyc2UsIHJvdykgewogICAgICByZXR1cm4gZnVuY3Rpb24ocmVxdWVzdCkgewogICAgICAgIHJldHVybiBwYXJzZShyZXF1ZXN0LnJlc3BvbnNlVGV4dCwgcm93KTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgY3N2JDMgPSBkc3YkMigidGV4dC9jc3YiLCBjc3ZQYXJzZSk7CgogICAgdmFyIHRzdiQzID0gZHN2JDIoInRleHQvdGFiLXNlcGFyYXRlZC12YWx1ZXMiLCB0c3ZQYXJzZSk7CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nJDkoYSwgYikgewogICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgICB9CgogICAgZnVuY3Rpb24gYmlzZWN0b3IkNChjb21wYXJlKSB7CiAgICAgIGlmIChjb21wYXJlLmxlbmd0aCA9PT0gMSkgY29tcGFyZSA9IGFzY2VuZGluZ0NvbXBhcmF0b3IkNChjb21wYXJlKTsKICAgICAgcmV0dXJuIHsKICAgICAgICBsZWZ0OiBmdW5jdGlvbihhLCB4LCBsbywgaGkpIHsKICAgICAgICAgIGlmIChsbyA9PSBudWxsKSBsbyA9IDA7CiAgICAgICAgICBpZiAoaGkgPT0gbnVsbCkgaGkgPSBhLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChsbyA8IGhpKSB7CiAgICAgICAgICAgIHZhciBtaWQgPSBsbyArIGhpID4+PiAxOwogICAgICAgICAgICBpZiAoY29tcGFyZShhW21pZF0sIHgpIDwgMCkgbG8gPSBtaWQgKyAxOwogICAgICAgICAgICBlbHNlIGhpID0gbWlkOwogICAgICAgICAgfQogICAgICAgICAgcmV0dXJuIGxvOwogICAgICAgIH0sCiAgICAgICAgcmlnaHQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgewogICAgICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsKICAgICAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPiAwKSBoaSA9IG1pZDsKICAgICAgICAgICAgZWxzZSBsbyA9IG1pZCArIDE7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbG87CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZ0NvbXBhcmF0b3IkNChmKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCB4KSB7CiAgICAgICAgcmV0dXJuIGFzY2VuZGluZyQ5KGYoZCksIHgpOwogICAgICB9OwogICAgfQoKICAgIHZhciBhc2NlbmRpbmdCaXNlY3QkNCA9IGJpc2VjdG9yJDQoYXNjZW5kaW5nJDkpOwogICAgdmFyIGJpc2VjdFJpZ2h0JDIgPSBhc2NlbmRpbmdCaXNlY3QkNC5yaWdodDsKCiAgICBmdW5jdGlvbiBudW1iZXIkNyh4KSB7CiAgICAgIHJldHVybiB4ID09PSBudWxsID8gTmFOIDogK3g7CiAgICB9CgogICAgZnVuY3Rpb24gc2VxdWVuY2UkMShzdGFydCwgc3RvcCwgc3RlcCkgewogICAgICBzdGFydCA9ICtzdGFydCwgc3RvcCA9ICtzdG9wLCBzdGVwID0gKG4gPSBhcmd1bWVudHMubGVuZ3RoKSA8IDIgPyAoc3RvcCA9IHN0YXJ0LCBzdGFydCA9IDAsIDEpIDogbiA8IDMgPyAxIDogK3N0ZXA7CgogICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgbiA9IE1hdGgubWF4KDAsIE1hdGguY2VpbCgoc3RvcCAtIHN0YXJ0KSAvIHN0ZXApKSB8IDAsCiAgICAgICAgICByYW5nZSA9IG5ldyBBcnJheShuKTsKCiAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgcmFuZ2VbaV0gPSBzdGFydCArIGkgKiBzdGVwOwogICAgICB9CgogICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CgogICAgdmFyIGUxMCQyID0gTWF0aC5zcXJ0KDUwKSwKICAgICAgICBlNSQyID0gTWF0aC5zcXJ0KDEwKSwKICAgICAgICBlMiQyID0gTWF0aC5zcXJ0KDIpOwoKICAgIGZ1bmN0aW9uIHRpY2tzJDIoc3RhcnQsIHN0b3AsIGNvdW50KSB7CiAgICAgIHZhciByZXZlcnNlLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbiwKICAgICAgICAgIHRpY2tzLAogICAgICAgICAgc3RlcDsKCiAgICAgIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50OwogICAgICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSByZXR1cm4gW3N0YXJ0XTsKICAgICAgaWYgKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpIG4gPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gbjsKICAgICAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudCQyKHN0YXJ0LCBzdG9wLCBjb3VudCkpID09PSAwIHx8ICFpc0Zpbml0ZShzdGVwKSkgcmV0dXJuIFtdOwoKICAgICAgaWYgKHN0ZXAgPiAwKSB7CiAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgLyBzdGVwKTsKICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wIC8gc3RlcCk7CiAgICAgICAgdGlja3MgPSBuZXcgQXJyYXkobiA9IE1hdGguY2VpbChzdG9wIC0gc3RhcnQgKyAxKSk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHRpY2tzW2ldID0gKHN0YXJ0ICsgaSkgKiBzdGVwOwogICAgICB9IGVsc2UgewogICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAqIHN0ZXApOwogICAgICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAqIHN0ZXApOwogICAgICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RhcnQgLSBzdG9wICsgMSkpOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCAtIGkpIC8gc3RlcDsKICAgICAgfQoKICAgICAgaWYgKHJldmVyc2UpIHRpY2tzLnJldmVyc2UoKTsKCiAgICAgIHJldHVybiB0aWNrczsKICAgIH0KCiAgICBmdW5jdGlvbiB0aWNrSW5jcmVtZW50JDIoc3RhcnQsIHN0b3AsIGNvdW50KSB7CiAgICAgIHZhciBzdGVwID0gKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksCiAgICAgICAgICBwb3dlciA9IE1hdGguZmxvb3IoTWF0aC5sb2coc3RlcCkgLyBNYXRoLkxOMTApLAogICAgICAgICAgZXJyb3IgPSBzdGVwIC8gTWF0aC5wb3coMTAsIHBvd2VyKTsKICAgICAgcmV0dXJuIHBvd2VyID49IDAKICAgICAgICAgID8gKGVycm9yID49IGUxMCQyID8gMTAgOiBlcnJvciA+PSBlNSQyID8gNSA6IGVycm9yID49IGUyJDIgPyAyIDogMSkgKiBNYXRoLnBvdygxMCwgcG93ZXIpCiAgICAgICAgICA6IC1NYXRoLnBvdygxMCwgLXBvd2VyKSAvIChlcnJvciA+PSBlMTAkMiA/IDEwIDogZXJyb3IgPj0gZTUkMiA/IDUgOiBlcnJvciA+PSBlMiQyID8gMiA6IDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRpY2tTdGVwJDIoc3RhcnQsIHN0b3AsIGNvdW50KSB7CiAgICAgIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksCiAgICAgICAgICBzdGVwMSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXAwKSAvIE1hdGguTE4xMCkpLAogICAgICAgICAgZXJyb3IgPSBzdGVwMCAvIHN0ZXAxOwogICAgICBpZiAoZXJyb3IgPj0gZTEwJDIpIHN0ZXAxICo9IDEwOwogICAgICBlbHNlIGlmIChlcnJvciA+PSBlNSQyKSBzdGVwMSAqPSA1OwogICAgICBlbHNlIGlmIChlcnJvciA+PSBlMiQyKSBzdGVwMSAqPSAyOwogICAgICByZXR1cm4gc3RvcCA8IHN0YXJ0ID8gLXN0ZXAxIDogc3RlcDE7CiAgICB9CgogICAgZnVuY3Rpb24gdGhyZXNob2xkJDIodmFsdWVzLCBwLCB2YWx1ZW9mKSB7CiAgICAgIGlmICh2YWx1ZW9mID09IG51bGwpIHZhbHVlb2YgPSBudW1iZXIkNzsKICAgICAgaWYgKCEobiA9IHZhbHVlcy5sZW5ndGgpKSByZXR1cm47CiAgICAgIGlmICgocCA9ICtwKSA8PSAwIHx8IG4gPCAyKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzWzBdLCAwLCB2YWx1ZXMpOwogICAgICBpZiAocCA+PSAxKSByZXR1cm4gK3ZhbHVlb2YodmFsdWVzW24gLSAxXSwgbiAtIDEsIHZhbHVlcyk7CiAgICAgIHZhciBuLAogICAgICAgICAgaSA9IChuIC0gMSkgKiBwLAogICAgICAgICAgaTAgPSBNYXRoLmZsb29yKGkpLAogICAgICAgICAgdmFsdWUwID0gK3ZhbHVlb2YodmFsdWVzW2kwXSwgaTAsIHZhbHVlcyksCiAgICAgICAgICB2YWx1ZTEgPSArdmFsdWVvZih2YWx1ZXNbaTAgKyAxXSwgaTAgKyAxLCB2YWx1ZXMpOwogICAgICByZXR1cm4gdmFsdWUwICsgKHZhbHVlMSAtIHZhbHVlMCkgKiAoaSAtIGkwKTsKICAgIH0KCiAgICB2YXIgcHJlZml4JDMgPSAiJCI7CgogICAgZnVuY3Rpb24gTWFwJDQoKSB7fQoKICAgIE1hcCQ0LnByb3RvdHlwZSA9IG1hcCQ3LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IE1hcCQ0LAogICAgICBoYXM6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHJldHVybiAocHJlZml4JDMgKyBrZXkpIGluIHRoaXM7CiAgICAgIH0sCiAgICAgIGdldDogZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgcmV0dXJuIHRoaXNbcHJlZml4JDMgKyBrZXldOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICB0aGlzW3ByZWZpeCQzICsga2V5XSA9IHZhbHVlOwogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICByZW1vdmU6IGZ1bmN0aW9uKGtleSkgewogICAgICAgIHZhciBwcm9wZXJ0eSA9IHByZWZpeCQzICsga2V5OwogICAgICAgIHJldHVybiBwcm9wZXJ0eSBpbiB0aGlzICYmIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICAgICAgfSwKICAgICAgY2xlYXI6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4JDMpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICAgICAgfSwKICAgICAga2V5czogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQzKSBrZXlzLnB1c2gocHJvcGVydHkuc2xpY2UoMSkpOwogICAgICAgIHJldHVybiBrZXlzOwogICAgICB9LAogICAgICB2YWx1ZXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQzKSB2YWx1ZXMucHVzaCh0aGlzW3Byb3BlcnR5XSk7CiAgICAgICAgcmV0dXJuIHZhbHVlczsKICAgICAgfSwKICAgICAgZW50cmllczogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGVudHJpZXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCQzKSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pOwogICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICB9LAogICAgICBzaXplOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMykgKytzaXplOwogICAgICAgIHJldHVybiBzaXplOwogICAgICB9LAogICAgICBlbXB0eTogZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMykgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9LAogICAgICBlYWNoOiBmdW5jdGlvbihmKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgkMykgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG1hcCQ3KG9iamVjdCwgZikgewogICAgICB2YXIgbWFwID0gbmV3IE1hcCQ0OwoKICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCQ0KSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOwoKICAgICAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLgogICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICAgICAgbzsKCiAgICAgICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoaSwgb2JqZWN0W2ldKTsKICAgICAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7CiAgICAgIH0KCiAgICAgIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4KICAgICAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXQkNCgpIHt9CgogICAgdmFyIHByb3RvJDQgPSBtYXAkNy5wcm90b3R5cGU7CgogICAgU2V0JDQucHJvdG90eXBlID0gc2V0JGIucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogU2V0JDQsCiAgICAgIGhhczogcHJvdG8kNC5oYXMsCiAgICAgIGFkZDogZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YWx1ZSArPSAiIjsKICAgICAgICB0aGlzW3ByZWZpeCQzICsgdmFsdWVdID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIHJlbW92ZTogcHJvdG8kNC5yZW1vdmUsCiAgICAgIGNsZWFyOiBwcm90byQ0LmNsZWFyLAogICAgICB2YWx1ZXM6IHByb3RvJDQua2V5cywKICAgICAgc2l6ZTogcHJvdG8kNC5zaXplLAogICAgICBlbXB0eTogcHJvdG8kNC5lbXB0eSwKICAgICAgZWFjaDogcHJvdG8kNC5lYWNoCiAgICB9OwoKICAgIGZ1bmN0aW9uIHNldCRiKG9iamVjdCwgZikgewogICAgICB2YXIgc2V0ID0gbmV3IFNldCQ0OwoKICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCQ0KSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7CgogICAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpdOKAmXMgYW4gYXJyYXkuCiAgICAgIGVsc2UgaWYgKG9iamVjdCkgewogICAgICAgIHZhciBpID0gLTEsIG4gPSBvYmplY3QubGVuZ3RoOwogICAgICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKG9iamVjdFtpXSk7CiAgICAgICAgZWxzZSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChmKG9iamVjdFtpXSwgaSwgb2JqZWN0KSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBzZXQ7CiAgICB9CgogICAgdmFyIGFycmF5JDYgPSBBcnJheS5wcm90b3R5cGU7CgogICAgdmFyIG1hcCQ4ID0gYXJyYXkkNi5tYXA7CiAgICB2YXIgc2xpY2UkYyA9IGFycmF5JDYuc2xpY2U7CgogICAgdmFyIGltcGxpY2l0JDEgPSB7bmFtZTogImltcGxpY2l0In07CgogICAgZnVuY3Rpb24gb3JkaW5hbCQxKHJhbmdlKSB7CiAgICAgIHZhciBpbmRleCA9IG1hcCQ3KCksCiAgICAgICAgICBkb21haW4gPSBbXSwKICAgICAgICAgIHVua25vd24gPSBpbXBsaWNpdCQxOwoKICAgICAgcmFuZ2UgPSByYW5nZSA9PSBudWxsID8gW10gOiBzbGljZSRjLmNhbGwocmFuZ2UpOwoKICAgICAgZnVuY3Rpb24gc2NhbGUoZCkgewogICAgICAgIHZhciBrZXkgPSBkICsgIiIsIGkgPSBpbmRleC5nZXQoa2V5KTsKICAgICAgICBpZiAoIWkpIHsKICAgICAgICAgIGlmICh1bmtub3duICE9PSBpbXBsaWNpdCQxKSByZXR1cm4gdW5rbm93bjsKICAgICAgICAgIGluZGV4LnNldChrZXksIGkgPSBkb21haW4ucHVzaChkKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW5nZVsoaSAtIDEpICUgcmFuZ2UubGVuZ3RoXTsKICAgICAgfQoKICAgICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpOwogICAgICAgIGRvbWFpbiA9IFtdLCBpbmRleCA9IG1hcCQ3KCk7CiAgICAgICAgdmFyIGkgPSAtMSwgbiA9IF8ubGVuZ3RoLCBkLCBrZXk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKGtleSA9IChkID0gX1tpXSkgKyAiIikpIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKGQpKTsKICAgICAgICByZXR1cm4gc2NhbGU7CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJGMuY2FsbChfKSwgc2NhbGUpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG9yZGluYWwkMSgpCiAgICAgICAgICAgIC5kb21haW4oZG9tYWluKQogICAgICAgICAgICAucmFuZ2UocmFuZ2UpCiAgICAgICAgICAgIC51bmtub3duKHVua25vd24pOwogICAgICB9OwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGJhbmQkMSgpIHsKICAgICAgdmFyIHNjYWxlID0gb3JkaW5hbCQxKCkudW5rbm93bih1bmRlZmluZWQpLAogICAgICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLAogICAgICAgICAgb3JkaW5hbFJhbmdlID0gc2NhbGUucmFuZ2UsCiAgICAgICAgICByYW5nZSA9IFswLCAxXSwKICAgICAgICAgIHN0ZXAsCiAgICAgICAgICBiYW5kd2lkdGgsCiAgICAgICAgICByb3VuZCA9IGZhbHNlLAogICAgICAgICAgcGFkZGluZ0lubmVyID0gMCwKICAgICAgICAgIHBhZGRpbmdPdXRlciA9IDAsCiAgICAgICAgICBhbGlnbiA9IDAuNTsKCiAgICAgIGRlbGV0ZSBzY2FsZS51bmtub3duOwoKICAgICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgICB2YXIgbiA9IGRvbWFpbigpLmxlbmd0aCwKICAgICAgICAgICAgcmV2ZXJzZSA9IHJhbmdlWzFdIDwgcmFuZ2VbMF0sCiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2VbcmV2ZXJzZSAtIDBdLAogICAgICAgICAgICBzdG9wID0gcmFuZ2VbMSAtIHJldmVyc2VdOwogICAgICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsKICAgICAgICBpZiAocm91bmQpIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOwogICAgICAgIHN0YXJ0ICs9IChzdG9wIC0gc3RhcnQgLSBzdGVwICogKG4gLSBwYWRkaW5nSW5uZXIpKSAqIGFsaWduOwogICAgICAgIGJhbmR3aWR0aCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7CiAgICAgICAgaWYgKHJvdW5kKSBzdGFydCA9IE1hdGgucm91bmQoc3RhcnQpLCBiYW5kd2lkdGggPSBNYXRoLnJvdW5kKGJhbmR3aWR0aCk7CiAgICAgICAgdmFyIHZhbHVlcyA9IHNlcXVlbmNlJDEobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pOwogICAgICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpOwogICAgICB9CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IFsrX1swXSwgK19bMV1dLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIHJhbmdlID0gWytfWzBdLCArX1sxXV0sIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGJhbmR3aWR0aDsKICAgICAgfTsKCiAgICAgIHNjYWxlLnN0ZXAgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3RlcDsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7CiAgICAgIH07CgogICAgICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IHBhZGRpbmdPdXRlciA9IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIF8pKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsKICAgICAgfTsKCiAgICAgIHNjYWxlLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBwYWRkaW5nSW5uZXI7CiAgICAgIH07CgogICAgICBzY2FsZS5wYWRkaW5nT3V0ZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocGFkZGluZ091dGVyID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogcGFkZGluZ091dGVyOwogICAgICB9OwoKICAgICAgc2NhbGUuYWxpZ24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoYWxpZ24gPSBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBfKSksIHJlc2NhbGUoKSkgOiBhbGlnbjsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYmFuZCQxKCkKICAgICAgICAgICAgLmRvbWFpbihkb21haW4oKSkKICAgICAgICAgICAgLnJhbmdlKHJhbmdlKQogICAgICAgICAgICAucm91bmQocm91bmQpCiAgICAgICAgICAgIC5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKQogICAgICAgICAgICAucGFkZGluZ091dGVyKHBhZGRpbmdPdXRlcikKICAgICAgICAgICAgLmFsaWduKGFsaWduKTsKICAgICAgfTsKCiAgICAgIHJldHVybiByZXNjYWxlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnRpc2gkMShzY2FsZSkgewogICAgICB2YXIgY29weSA9IHNjYWxlLmNvcHk7CgogICAgICBzY2FsZS5wYWRkaW5nID0gc2NhbGUucGFkZGluZ091dGVyOwogICAgICBkZWxldGUgc2NhbGUucGFkZGluZ0lubmVyOwogICAgICBkZWxldGUgc2NhbGUucGFkZGluZ091dGVyOwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBwb2ludGlzaCQxKGNvcHkoKSk7CiAgICAgIH07CgogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnQkOCgpIHsKICAgICAgcmV0dXJuIHBvaW50aXNoJDEoYmFuZCQxKCkucGFkZGluZ0lubmVyKDEpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZpbmUkNChjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7CiAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRlbmQkNChwYXJlbnQsIGRlZmluaXRpb24pIHsKICAgICAgdmFyIHByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50LnByb3RvdHlwZSk7CiAgICAgIGZvciAodmFyIGtleSBpbiBkZWZpbml0aW9uKSBwcm90b3R5cGVba2V5XSA9IGRlZmluaXRpb25ba2V5XTsKICAgICAgcmV0dXJuIHByb3RvdHlwZTsKICAgIH0KCiAgICBmdW5jdGlvbiBDb2xvciQ0KCkge30KCiAgICB2YXIgZGFya2VyJDQgPSAwLjc7CiAgICB2YXIgYnJpZ2h0ZXIkNCA9IDEgLyBkYXJrZXIkNDsKCiAgICB2YXIgcmVJJDQgPSAiXFxzKihbKy1dP1xcZCspXFxzKiIsCiAgICAgICAgcmVOJDQgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPylcXHMqIiwKICAgICAgICByZVAkNCA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KSVcXHMqIiwKICAgICAgICByZUhleCQzID0gL14jKFswLTlhLWZdezMsOH0pJC8sCiAgICAgICAgcmVSZ2JJbnRlZ2VyJDQgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZUkkNCwgcmVJJDQsIHJlSSQ0XSArICJcXCkkIiksCiAgICAgICAgcmVSZ2JQZXJjZW50JDQgPSBuZXcgUmVnRXhwKCJecmdiXFwoIiArIFtyZVAkNCwgcmVQJDQsIHJlUCQ0XSArICJcXCkkIiksCiAgICAgICAgcmVSZ2JhSW50ZWdlciQ0ID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlSSQ0LCByZUkkNCwgcmVJJDQsIHJlTiQ0XSArICJcXCkkIiksCiAgICAgICAgcmVSZ2JhUGVyY2VudCQ0ID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlUCQ0LCByZVAkNCwgcmVQJDQsIHJlTiQ0XSArICJcXCkkIiksCiAgICAgICAgcmVIc2xQZXJjZW50JDQgPSBuZXcgUmVnRXhwKCJeaHNsXFwoIiArIFtyZU4kNCwgcmVQJDQsIHJlUCQ0XSArICJcXCkkIiksCiAgICAgICAgcmVIc2xhUGVyY2VudCQ0ID0gbmV3IFJlZ0V4cCgiXmhzbGFcXCgiICsgW3JlTiQ0LCByZVAkNCwgcmVQJDQsIHJlTiQ0XSArICJcXCkkIik7CgogICAgdmFyIG5hbWVkJDQgPSB7CiAgICAgIGFsaWNlYmx1ZTogMHhmMGY4ZmYsCiAgICAgIGFudGlxdWV3aGl0ZTogMHhmYWViZDcsCiAgICAgIGFxdWE6IDB4MDBmZmZmLAogICAgICBhcXVhbWFyaW5lOiAweDdmZmZkNCwKICAgICAgYXp1cmU6IDB4ZjBmZmZmLAogICAgICBiZWlnZTogMHhmNWY1ZGMsCiAgICAgIGJpc3F1ZTogMHhmZmU0YzQsCiAgICAgIGJsYWNrOiAweDAwMDAwMCwKICAgICAgYmxhbmNoZWRhbG1vbmQ6IDB4ZmZlYmNkLAogICAgICBibHVlOiAweDAwMDBmZiwKICAgICAgYmx1ZXZpb2xldDogMHg4YTJiZTIsCiAgICAgIGJyb3duOiAweGE1MmEyYSwKICAgICAgYnVybHl3b29kOiAweGRlYjg4NywKICAgICAgY2FkZXRibHVlOiAweDVmOWVhMCwKICAgICAgY2hhcnRyZXVzZTogMHg3ZmZmMDAsCiAgICAgIGNob2NvbGF0ZTogMHhkMjY5MWUsCiAgICAgIGNvcmFsOiAweGZmN2Y1MCwKICAgICAgY29ybmZsb3dlcmJsdWU6IDB4NjQ5NWVkLAogICAgICBjb3Juc2lsazogMHhmZmY4ZGMsCiAgICAgIGNyaW1zb246IDB4ZGMxNDNjLAogICAgICBjeWFuOiAweDAwZmZmZiwKICAgICAgZGFya2JsdWU6IDB4MDAwMDhiLAogICAgICBkYXJrY3lhbjogMHgwMDhiOGIsCiAgICAgIGRhcmtnb2xkZW5yb2Q6IDB4Yjg4NjBiLAogICAgICBkYXJrZ3JheTogMHhhOWE5YTksCiAgICAgIGRhcmtncmVlbjogMHgwMDY0MDAsCiAgICAgIGRhcmtncmV5OiAweGE5YTlhOSwKICAgICAgZGFya2toYWtpOiAweGJkYjc2YiwKICAgICAgZGFya21hZ2VudGE6IDB4OGIwMDhiLAogICAgICBkYXJrb2xpdmVncmVlbjogMHg1NTZiMmYsCiAgICAgIGRhcmtvcmFuZ2U6IDB4ZmY4YzAwLAogICAgICBkYXJrb3JjaGlkOiAweDk5MzJjYywKICAgICAgZGFya3JlZDogMHg4YjAwMDAsCiAgICAgIGRhcmtzYWxtb246IDB4ZTk5NjdhLAogICAgICBkYXJrc2VhZ3JlZW46IDB4OGZiYzhmLAogICAgICBkYXJrc2xhdGVibHVlOiAweDQ4M2Q4YiwKICAgICAgZGFya3NsYXRlZ3JheTogMHgyZjRmNGYsCiAgICAgIGRhcmtzbGF0ZWdyZXk6IDB4MmY0ZjRmLAogICAgICBkYXJrdHVycXVvaXNlOiAweDAwY2VkMSwKICAgICAgZGFya3Zpb2xldDogMHg5NDAwZDMsCiAgICAgIGRlZXBwaW5rOiAweGZmMTQ5MywKICAgICAgZGVlcHNreWJsdWU6IDB4MDBiZmZmLAogICAgICBkaW1ncmF5OiAweDY5Njk2OSwKICAgICAgZGltZ3JleTogMHg2OTY5NjksCiAgICAgIGRvZGdlcmJsdWU6IDB4MWU5MGZmLAogICAgICBmaXJlYnJpY2s6IDB4YjIyMjIyLAogICAgICBmbG9yYWx3aGl0ZTogMHhmZmZhZjAsCiAgICAgIGZvcmVzdGdyZWVuOiAweDIyOGIyMiwKICAgICAgZnVjaHNpYTogMHhmZjAwZmYsCiAgICAgIGdhaW5zYm9ybzogMHhkY2RjZGMsCiAgICAgIGdob3N0d2hpdGU6IDB4ZjhmOGZmLAogICAgICBnb2xkOiAweGZmZDcwMCwKICAgICAgZ29sZGVucm9kOiAweGRhYTUyMCwKICAgICAgZ3JheTogMHg4MDgwODAsCiAgICAgIGdyZWVuOiAweDAwODAwMCwKICAgICAgZ3JlZW55ZWxsb3c6IDB4YWRmZjJmLAogICAgICBncmV5OiAweDgwODA4MCwKICAgICAgaG9uZXlkZXc6IDB4ZjBmZmYwLAogICAgICBob3RwaW5rOiAweGZmNjliNCwKICAgICAgaW5kaWFucmVkOiAweGNkNWM1YywKICAgICAgaW5kaWdvOiAweDRiMDA4MiwKICAgICAgaXZvcnk6IDB4ZmZmZmYwLAogICAgICBraGFraTogMHhmMGU2OGMsCiAgICAgIGxhdmVuZGVyOiAweGU2ZTZmYSwKICAgICAgbGF2ZW5kZXJibHVzaDogMHhmZmYwZjUsCiAgICAgIGxhd25ncmVlbjogMHg3Y2ZjMDAsCiAgICAgIGxlbW9uY2hpZmZvbjogMHhmZmZhY2QsCiAgICAgIGxpZ2h0Ymx1ZTogMHhhZGQ4ZTYsCiAgICAgIGxpZ2h0Y29yYWw6IDB4ZjA4MDgwLAogICAgICBsaWdodGN5YW46IDB4ZTBmZmZmLAogICAgICBsaWdodGdvbGRlbnJvZHllbGxvdzogMHhmYWZhZDIsCiAgICAgIGxpZ2h0Z3JheTogMHhkM2QzZDMsCiAgICAgIGxpZ2h0Z3JlZW46IDB4OTBlZTkwLAogICAgICBsaWdodGdyZXk6IDB4ZDNkM2QzLAogICAgICBsaWdodHBpbms6IDB4ZmZiNmMxLAogICAgICBsaWdodHNhbG1vbjogMHhmZmEwN2EsCiAgICAgIGxpZ2h0c2VhZ3JlZW46IDB4MjBiMmFhLAogICAgICBsaWdodHNreWJsdWU6IDB4ODdjZWZhLAogICAgICBsaWdodHNsYXRlZ3JheTogMHg3Nzg4OTksCiAgICAgIGxpZ2h0c2xhdGVncmV5OiAweDc3ODg5OSwKICAgICAgbGlnaHRzdGVlbGJsdWU6IDB4YjBjNGRlLAogICAgICBsaWdodHllbGxvdzogMHhmZmZmZTAsCiAgICAgIGxpbWU6IDB4MDBmZjAwLAogICAgICBsaW1lZ3JlZW46IDB4MzJjZDMyLAogICAgICBsaW5lbjogMHhmYWYwZTYsCiAgICAgIG1hZ2VudGE6IDB4ZmYwMGZmLAogICAgICBtYXJvb246IDB4ODAwMDAwLAogICAgICBtZWRpdW1hcXVhbWFyaW5lOiAweDY2Y2RhYSwKICAgICAgbWVkaXVtYmx1ZTogMHgwMDAwY2QsCiAgICAgIG1lZGl1bW9yY2hpZDogMHhiYTU1ZDMsCiAgICAgIG1lZGl1bXB1cnBsZTogMHg5MzcwZGIsCiAgICAgIG1lZGl1bXNlYWdyZWVuOiAweDNjYjM3MSwKICAgICAgbWVkaXVtc2xhdGVibHVlOiAweDdiNjhlZSwKICAgICAgbWVkaXVtc3ByaW5nZ3JlZW46IDB4MDBmYTlhLAogICAgICBtZWRpdW10dXJxdW9pc2U6IDB4NDhkMWNjLAogICAgICBtZWRpdW12aW9sZXRyZWQ6IDB4YzcxNTg1LAogICAgICBtaWRuaWdodGJsdWU6IDB4MTkxOTcwLAogICAgICBtaW50Y3JlYW06IDB4ZjVmZmZhLAogICAgICBtaXN0eXJvc2U6IDB4ZmZlNGUxLAogICAgICBtb2NjYXNpbjogMHhmZmU0YjUsCiAgICAgIG5hdmFqb3doaXRlOiAweGZmZGVhZCwKICAgICAgbmF2eTogMHgwMDAwODAsCiAgICAgIG9sZGxhY2U6IDB4ZmRmNWU2LAogICAgICBvbGl2ZTogMHg4MDgwMDAsCiAgICAgIG9saXZlZHJhYjogMHg2YjhlMjMsCiAgICAgIG9yYW5nZTogMHhmZmE1MDAsCiAgICAgIG9yYW5nZXJlZDogMHhmZjQ1MDAsCiAgICAgIG9yY2hpZDogMHhkYTcwZDYsCiAgICAgIHBhbGVnb2xkZW5yb2Q6IDB4ZWVlOGFhLAogICAgICBwYWxlZ3JlZW46IDB4OThmYjk4LAogICAgICBwYWxldHVycXVvaXNlOiAweGFmZWVlZSwKICAgICAgcGFsZXZpb2xldHJlZDogMHhkYjcwOTMsCiAgICAgIHBhcGF5YXdoaXA6IDB4ZmZlZmQ1LAogICAgICBwZWFjaHB1ZmY6IDB4ZmZkYWI5LAogICAgICBwZXJ1OiAweGNkODUzZiwKICAgICAgcGluazogMHhmZmMwY2IsCiAgICAgIHBsdW06IDB4ZGRhMGRkLAogICAgICBwb3dkZXJibHVlOiAweGIwZTBlNiwKICAgICAgcHVycGxlOiAweDgwMDA4MCwKICAgICAgcmViZWNjYXB1cnBsZTogMHg2NjMzOTksCiAgICAgIHJlZDogMHhmZjAwMDAsCiAgICAgIHJvc3licm93bjogMHhiYzhmOGYsCiAgICAgIHJveWFsYmx1ZTogMHg0MTY5ZTEsCiAgICAgIHNhZGRsZWJyb3duOiAweDhiNDUxMywKICAgICAgc2FsbW9uOiAweGZhODA3MiwKICAgICAgc2FuZHlicm93bjogMHhmNGE0NjAsCiAgICAgIHNlYWdyZWVuOiAweDJlOGI1NywKICAgICAgc2Vhc2hlbGw6IDB4ZmZmNWVlLAogICAgICBzaWVubmE6IDB4YTA1MjJkLAogICAgICBzaWx2ZXI6IDB4YzBjMGMwLAogICAgICBza3libHVlOiAweDg3Y2VlYiwKICAgICAgc2xhdGVibHVlOiAweDZhNWFjZCwKICAgICAgc2xhdGVncmF5OiAweDcwODA5MCwKICAgICAgc2xhdGVncmV5OiAweDcwODA5MCwKICAgICAgc25vdzogMHhmZmZhZmEsCiAgICAgIHNwcmluZ2dyZWVuOiAweDAwZmY3ZiwKICAgICAgc3RlZWxibHVlOiAweDQ2ODJiNCwKICAgICAgdGFuOiAweGQyYjQ4YywKICAgICAgdGVhbDogMHgwMDgwODAsCiAgICAgIHRoaXN0bGU6IDB4ZDhiZmQ4LAogICAgICB0b21hdG86IDB4ZmY2MzQ3LAogICAgICB0dXJxdW9pc2U6IDB4NDBlMGQwLAogICAgICB2aW9sZXQ6IDB4ZWU4MmVlLAogICAgICB3aGVhdDogMHhmNWRlYjMsCiAgICAgIHdoaXRlOiAweGZmZmZmZiwKICAgICAgd2hpdGVzbW9rZTogMHhmNWY1ZjUsCiAgICAgIHllbGxvdzogMHhmZmZmMDAsCiAgICAgIHllbGxvd2dyZWVuOiAweDlhY2QzMgogICAgfTsKCiAgICBkZWZpbmUkNChDb2xvciQ0LCBjb2xvciQ0LCB7CiAgICAgIGNvcHk6IGZ1bmN0aW9uKGNoYW5uZWxzKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHRoaXMuY29uc3RydWN0b3IsIHRoaXMsIGNoYW5uZWxzKTsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnJnYigpLmRpc3BsYXlhYmxlKCk7CiAgICAgIH0sCiAgICAgIGhleDogY29sb3JfZm9ybWF0SGV4JDMsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICAgIGZvcm1hdEhleDogY29sb3JfZm9ybWF0SGV4JDMsCiAgICAgIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsJDMsCiAgICAgIGZvcm1hdFJnYjogY29sb3JfZm9ybWF0UmdiJDMsCiAgICAgIHRvU3RyaW5nOiBjb2xvcl9mb3JtYXRSZ2IkMwogICAgfSk7CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4JDMoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdEhleCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhzbCQzKCkgewogICAgICByZXR1cm4gaHNsQ29udmVydCQ0KHRoaXMpLmZvcm1hdEhzbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYiQzKCkgewogICAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRSZ2IoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvciQ0KGZvcm1hdCkgewogICAgICB2YXIgbSwgbDsKICAgICAgZm9ybWF0ID0gKGZvcm1hdCArICIiKS50cmltKCkudG9Mb3dlckNhc2UoKTsKICAgICAgcmV0dXJuIChtID0gcmVIZXgkMy5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4kNChtKSAvLyAjZmYwMDAwCiAgICAgICAgICA6IGwgPT09IDMgPyBuZXcgUmdiJDQoKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSwgMSkgLy8gI2YwMAogICAgICAgICAgOiBsID09PSA4ID8gcmdiYSQ0KG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMAogICAgICAgICAgOiBsID09PSA0ID8gcmdiYSQ0KChtID4+IDEyICYgMHhmKSB8IChtID4+IDggJiAweGYwKSwgKG0gPj4gOCAmIDB4ZikgfCAobSA+PiA0ICYgMHhmMCksIChtID4+IDQgJiAweGYpIHwgKG0gJiAweGYwKSwgKCgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZikpIC8gMHhmZikgLy8gI2YwMDAKICAgICAgICAgIDogbnVsbCkgLy8gaW52YWxpZCBoZXgKICAgICAgICAgIDogKG0gPSByZVJnYkludGVnZXIkNC5leGVjKGZvcm1hdCkpID8gbmV3IFJnYiQ0KG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApCiAgICAgICAgICA6IChtID0gcmVSZ2JQZXJjZW50JDQuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IkNChtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCAxKSAvLyByZ2IoMTAwJSwgMCUsIDAlKQogICAgICAgICAgOiAobSA9IHJlUmdiYUludGVnZXIkNC5leGVjKGZvcm1hdCkpID8gcmdiYSQ0KG1bMV0sIG1bMl0sIG1bM10sIG1bNF0pIC8vIHJnYmEoMjU1LCAwLCAwLCAxKQogICAgICAgICAgOiAobSA9IHJlUmdiYVBlcmNlbnQkNC5leGVjKGZvcm1hdCkpID8gcmdiYSQ0KG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpCiAgICAgICAgICA6IChtID0gcmVIc2xQZXJjZW50JDQuZXhlYyhmb3JtYXQpKSA/IGhzbGEkNChtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCAxKSAvLyBoc2woMTIwLCA1MCUsIDUwJSkKICAgICAgICAgIDogKG0gPSByZUhzbGFQZXJjZW50JDQuZXhlYyhmb3JtYXQpKSA/IGhzbGEkNChtWzFdLCBtWzJdIC8gMTAwLCBtWzNdIC8gMTAwLCBtWzRdKSAvLyBoc2xhKDEyMCwgNTAlLCA1MCUsIDEpCiAgICAgICAgICA6IG5hbWVkJDQuaGFzT3duUHJvcGVydHkoZm9ybWF0KSA/IHJnYm4kNChuYW1lZCQ0W2Zvcm1hdF0pIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcHJvdG90eXBlLWJ1aWx0aW5zCiAgICAgICAgICA6IGZvcm1hdCA9PT0gInRyYW5zcGFyZW50IiA/IG5ldyBSZ2IkNChOYU4sIE5hTiwgTmFOLCAwKQogICAgICAgICAgOiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYm4kNChuKSB7CiAgICAgIHJldHVybiBuZXcgUmdiJDQobiA+PiAxNiAmIDB4ZmYsIG4gPj4gOCAmIDB4ZmYsIG4gJiAweGZmLCAxKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JhJDQociwgZywgYiwgYSkgewogICAgICBpZiAoYSA8PSAwKSByID0gZyA9IGIgPSBOYU47CiAgICAgIHJldHVybiBuZXcgUmdiJDQociwgZywgYiwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiQ29udmVydCQ0KG8pIHsKICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yJDQpKSBvID0gY29sb3IkNChvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYiQ0OwogICAgICBvID0gby5yZ2IoKTsKICAgICAgcmV0dXJuIG5ldyBSZ2IkNChvLnIsIG8uZywgby5iLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYiQ1KHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0JDQocikgOiBuZXcgUmdiJDQociwgZywgYiwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIFJnYiQ0KHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5yID0gK3I7CiAgICAgIHRoaXMuZyA9ICtnOwogICAgICB0aGlzLmIgPSArYjsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDQoUmdiJDQsIHJnYiQ1LCBleHRlbmQkNChDb2xvciQ0LCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyJDQgOiBNYXRoLnBvdyhicmlnaHRlciQ0LCBrKTsKICAgICAgICByZXR1cm4gbmV3IFJnYiQ0KHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIkNCA6IE1hdGgucG93KGRhcmtlciQ0LCBrKTsKICAgICAgICByZXR1cm4gbmV3IFJnYiQ0KHRoaXMuciAqIGssIHRoaXMuZyAqIGssIHRoaXMuYiAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIHJnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKC0wLjUgPD0gdGhpcy5yICYmIHRoaXMuciA8IDI1NS41KQogICAgICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmcgJiYgdGhpcy5nIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgtMC41IDw9IHRoaXMuYiAmJiB0aGlzLmIgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICAgICAgfSwKICAgICAgaGV4OiByZ2JfZm9ybWF0SGV4JDMsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICAgIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCQzLAogICAgICBmb3JtYXRSZ2I6IHJnYl9mb3JtYXRSZ2IkMywKICAgICAgdG9TdHJpbmc6IHJnYl9mb3JtYXRSZ2IkMwogICAgfSkpOwoKICAgIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgkMygpIHsKICAgICAgcmV0dXJuICIjIiArIGhleCQzKHRoaXMucikgKyBoZXgkMyh0aGlzLmcpICsgaGV4JDModGhpcy5iKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JfZm9ybWF0UmdiJDMoKSB7CiAgICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgICByZXR1cm4gKGEgPT09IDEgPyAicmdiKCIgOiAicmdiYSgiKQogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5yKSB8fCAwKSkgKyAiLCAiCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmcpIHx8IDApKSArICIsICIKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuYikgfHwgMCkpCiAgICAgICAgICArIChhID09PSAxID8gIikiIDogIiwgIiArIGEgKyAiKSIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhleCQzKHZhbHVlKSB7CiAgICAgIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgICAgIHJldHVybiAodmFsdWUgPCAxNiA/ICIwIiA6ICIiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xhJDQoaCwgcywgbCwgYSkgewogICAgICBpZiAoYSA8PSAwKSBoID0gcyA9IGwgPSBOYU47CiAgICAgIGVsc2UgaWYgKGwgPD0gMCB8fCBsID49IDEpIGggPSBzID0gTmFOOwogICAgICBlbHNlIGlmIChzIDw9IDApIGggPSBOYU47CiAgICAgIHJldHVybiBuZXcgSHNsJDQoaCwgcywgbCwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsQ29udmVydCQ0KG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wkNCkgcmV0dXJuIG5ldyBIc2wkNChvLmgsIG8ucywgby5sLCBvLm9wYWNpdHkpOwogICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IkNCkpIG8gPSBjb2xvciQ0KG8pOwogICAgICBpZiAoIW8pIHJldHVybiBuZXcgSHNsJDQ7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgSHNsJDQpIHJldHVybiBvOwogICAgICBvID0gby5yZ2IoKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksCiAgICAgICAgICBoID0gTmFOLAogICAgICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7CiAgICAgIGlmIChzKSB7CiAgICAgICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICAgICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyOwogICAgICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDsKICAgICAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgICAgIGggKj0gNjA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBIc2wkNChoLCBzLCBsLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhzbCQ4KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBoc2xDb252ZXJ0JDQoaCkgOiBuZXcgSHNsJDQoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIEhzbCQ0KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5oID0gK2g7CiAgICAgIHRoaXMucyA9ICtzOwogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDQoSHNsJDQsIGhzbCQ4LCBleHRlbmQkNChDb2xvciQ0LCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyJDQgOiBNYXRoLnBvdyhicmlnaHRlciQ0LCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCQ0KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gZGFya2VyJDQgOiBNYXRoLnBvdyhkYXJrZXIkNCwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBIc2wkNCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaCA9IHRoaXMuaCAlIDM2MCArICh0aGlzLmggPCAwKSAqIDM2MCwKICAgICAgICAgICAgcyA9IGlzTmFOKGgpIHx8IGlzTmFOKHRoaXMucykgPyAwIDogdGhpcy5zLAogICAgICAgICAgICBsID0gdGhpcy5sLAogICAgICAgICAgICBtMiA9IGwgKyAobCA8IDAuNSA/IGwgOiAxIC0gbCkgKiBzLAogICAgICAgICAgICBtMSA9IDIgKiBsIC0gbTI7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkNCgKICAgICAgICAgIGhzbDJyZ2IkNChoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYiQ0KGgsIG0xLCBtMiksCiAgICAgICAgICBoc2wycmdiJDQoaCA8IDEyMCA/IGggKyAyNDAgOiBoIC0gMTIwLCBtMSwgbTIpLAogICAgICAgICAgdGhpcy5vcGFjaXR5CiAgICAgICAgKTsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoMCA8PSB0aGlzLnMgJiYgdGhpcy5zIDw9IDEgfHwgaXNOYU4odGhpcy5zKSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5sICYmIHRoaXMubCA8PSAxKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9LAogICAgICBmb3JtYXRIc2w6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBhID0gdGhpcy5vcGFjaXR5OyBhID0gaXNOYU4oYSkgPyAxIDogTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgYSkpOwogICAgICAgIHJldHVybiAoYSA9PT0gMSA/ICJoc2woIiA6ICJoc2xhKCIpCiAgICAgICAgICAgICsgKHRoaXMuaCB8fCAwKSArICIsICIKICAgICAgICAgICAgKyAodGhpcy5zIHx8IDApICogMTAwICsgIiUsICIKICAgICAgICAgICAgKyAodGhpcy5sIHx8IDApICogMTAwICsgIiUiCiAgICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICAgIH0KICAgIH0pKTsKCiAgICAvKiBGcm9tIEZ2RCAxMy4zNywgQ1NTIENvbG9yIE1vZHVsZSBMZXZlbCAzICovCiAgICBmdW5jdGlvbiBoc2wycmdiJDQoaCwgbTEsIG0yKSB7CiAgICAgIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjAKICAgICAgICAgIDogaCA8IDE4MCA/IG0yCiAgICAgICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwCiAgICAgICAgICA6IG0xKSAqIDI1NTsKICAgIH0KCiAgICB2YXIgZGVnMnJhZCQzID0gTWF0aC5QSSAvIDE4MDsKICAgIHZhciByYWQyZGVnJDMgPSAxODAgLyBNYXRoLlBJOwoKICAgIHZhciBBJDMgPSAtMC4xNDg2MSwKICAgICAgICBCJDMgPSArMS43ODI3NywKICAgICAgICBDJDMgPSAtMC4yOTIyNywKICAgICAgICBEJDMgPSAtMC45MDY0OSwKICAgICAgICBFJDMgPSArMS45NzI5NCwKICAgICAgICBFRCQzID0gRSQzICogRCQzLAogICAgICAgIEVCJDMgPSBFJDMgKiBCJDMsCiAgICAgICAgQkNfREEkMyA9IEIkMyAqIEMkMyAtIEQkMyAqIEEkMzsKCiAgICBmdW5jdGlvbiBjdWJlaGVsaXhDb252ZXJ0JDMobykgewogICAgICBpZiAobyBpbnN0YW5jZW9mIEN1YmVoZWxpeCQzKSByZXR1cm4gbmV3IEN1YmVoZWxpeCQzKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBSZ2IkNCkpIG8gPSByZ2JDb252ZXJ0JDQobyk7CiAgICAgIHZhciByID0gby5yIC8gMjU1LAogICAgICAgICAgZyA9IG8uZyAvIDI1NSwKICAgICAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgICAgICBsID0gKEJDX0RBJDMgKiBiICsgRUQkMyAqIHIgLSBFQiQzICogZykgLyAoQkNfREEkMyArIEVEJDMgLSBFQiQzKSwKICAgICAgICAgIGJsID0gYiAtIGwsCiAgICAgICAgICBrID0gKEUkMyAqIChnIC0gbCkgLSBDJDMgKiBibCkgLyBEJDMsCiAgICAgICAgICBzID0gTWF0aC5zcXJ0KGsgKiBrICsgYmwgKiBibCkgLyAoRSQzICogbCAqICgxIC0gbCkpLCAvLyBOYU4gaWYgbD0wIG9yIGw9MQogICAgICAgICAgaCA9IHMgPyBNYXRoLmF0YW4yKGssIGJsKSAqIHJhZDJkZWckMyAtIDEyMCA6IE5hTjsKICAgICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgkMyhoIDwgMCA/IGggKyAzNjAgOiBoLCBzLCBsLCBvLm9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1YmVoZWxpeCQ4KGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyBjdWJlaGVsaXhDb252ZXJ0JDMoaCkgOiBuZXcgQ3ViZWhlbGl4JDMoaCwgcywgbCwgb3BhY2l0eSA9PSBudWxsID8gMSA6IG9wYWNpdHkpOwogICAgfQoKICAgIGZ1bmN0aW9uIEN1YmVoZWxpeCQzKGgsIHMsIGwsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5oID0gK2g7CiAgICAgIHRoaXMucyA9ICtzOwogICAgICB0aGlzLmwgPSArbDsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lJDQoQ3ViZWhlbGl4JDMsIGN1YmVoZWxpeCQ4LCBleHRlbmQkNChDb2xvciQ0LCB7CiAgICAgIGJyaWdodGVyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGJyaWdodGVyJDQgOiBNYXRoLnBvdyhicmlnaHRlciQ0LCBrKTsKICAgICAgICByZXR1cm4gbmV3IEN1YmVoZWxpeCQzKHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gZGFya2VyJDQgOiBNYXRoLnBvdyhkYXJrZXIkNCwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBDdWJlaGVsaXgkMyh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgaCA9IGlzTmFOKHRoaXMuaCkgPyAwIDogKHRoaXMuaCArIDEyMCkgKiBkZWcycmFkJDMsCiAgICAgICAgICAgIGwgPSArdGhpcy5sLAogICAgICAgICAgICBhID0gaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMgKiBsICogKDEgLSBsKSwKICAgICAgICAgICAgY29zaCA9IE1hdGguY29zKGgpLAogICAgICAgICAgICBzaW5oID0gTWF0aC5zaW4oaCk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkNCgKICAgICAgICAgIDI1NSAqIChsICsgYSAqIChBJDMgKiBjb3NoICsgQiQzICogc2luaCkpLAogICAgICAgICAgMjU1ICogKGwgKyBhICogKEMkMyAqIGNvc2ggKyBEJDMgKiBzaW5oKSksCiAgICAgICAgICAyNTUgKiAobCArIGEgKiAoRSQzICogY29zaCkpLAogICAgICAgICAgdGhpcy5vcGFjaXR5CiAgICAgICAgKTsKICAgICAgfQogICAgfSkpOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JHAoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyJDYoYSwgZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb25lbnRpYWwkNShhLCBiLCB5KSB7CiAgICAgIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGh1ZSQzKGEsIGIpIHsKICAgICAgdmFyIGQgPSBiIC0gYTsKICAgICAgcmV0dXJuIGQgPyBsaW5lYXIkNihhLCBkID4gMTgwIHx8IGQgPCAtMTgwID8gZCAtIDM2MCAqIE1hdGgucm91bmQoZCAvIDM2MCkgOiBkKSA6IGNvbnN0YW50JHAoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2FtbWEkMyh5KSB7CiAgICAgIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEkMyA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbCQ1KGEsIGIsIHkpIDogY29uc3RhbnQkcChpc05hTihhKSA/IGIgOiBhKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2dhbW1hJDMoYSwgYikgewogICAgICB2YXIgZCA9IGIgLSBhOwogICAgICByZXR1cm4gZCA/IGxpbmVhciQ2KGEsIGQpIDogY29uc3RhbnQkcChpc05hTihhKSA/IGIgOiBhKTsKICAgIH0KCiAgICB2YXIgcmdiJDYgPSAoZnVuY3Rpb24gcmdiR2FtbWEoeSkgewogICAgICB2YXIgY29sb3IgPSBnYW1tYSQzKHkpOwoKICAgICAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHsKICAgICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYiQ1KHN0YXJ0KSkuciwgKGVuZCA9IHJnYiQ1KGVuZCkpLnIpLAogICAgICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLAogICAgICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYSQzKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgICBzdGFydC5nID0gZyh0KTsKICAgICAgICAgIHN0YXJ0LmIgPSBiKHQpOwogICAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgICB9OwogICAgICB9CgogICAgICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTsKCiAgICAgIHJldHVybiByZ2I7CiAgICB9KSgxKTsKCiAgICBmdW5jdGlvbiBudW1iZXJBcnJheSQyKGEsIGIpIHsKICAgICAgaWYgKCFiKSBiID0gW107CiAgICAgIHZhciBuID0gYSA/IE1hdGgubWluKGIubGVuZ3RoLCBhLmxlbmd0aCkgOiAwLAogICAgICAgICAgYyA9IGIuc2xpY2UoKSwKICAgICAgICAgIGk7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgY1tpXSA9IGFbaV0gKiAoMSAtIHQpICsgYltpXSAqIHQ7CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaXNOdW1iZXJBcnJheSQyKHgpIHsKICAgICAgcmV0dXJuIEFycmF5QnVmZmVyLmlzVmlldyh4KSAmJiAhKHggaW5zdGFuY2VvZiBEYXRhVmlldyk7CiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJpY0FycmF5JDIoYSwgYikgewogICAgICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLAogICAgICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsCiAgICAgICAgICB4ID0gbmV3IEFycmF5KG5hKSwKICAgICAgICAgIGMgPSBuZXcgQXJyYXkobmIpLAogICAgICAgICAgaTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gaW50ZXJwb2xhdGVWYWx1ZSQxKGFbaV0sIGJbaV0pOwogICAgICBmb3IgKDsgaSA8IG5iOyArK2kpIGNbaV0gPSBiW2ldOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmE7ICsraSkgY1tpXSA9IHhbaV0odCk7CiAgICAgICAgcmV0dXJuIGM7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGF0ZSQ0KGEsIGIpIHsKICAgICAgdmFyIGQgPSBuZXcgRGF0ZTsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGQuc2V0VGltZShhICogKDEgLSB0KSArIGIgKiB0KSwgZDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiByZWludGVycG9sYXRlKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb2JqZWN0JDUoYSwgYikgewogICAgICB2YXIgaSA9IHt9LAogICAgICAgICAgYyA9IHt9LAogICAgICAgICAgazsKCiAgICAgIGlmIChhID09PSBudWxsIHx8IHR5cGVvZiBhICE9PSAib2JqZWN0IikgYSA9IHt9OwogICAgICBpZiAoYiA9PT0gbnVsbCB8fCB0eXBlb2YgYiAhPT0gIm9iamVjdCIpIGIgPSB7fTsKCiAgICAgIGZvciAoayBpbiBiKSB7CiAgICAgICAgaWYgKGsgaW4gYSkgewogICAgICAgICAgaVtrXSA9IGludGVycG9sYXRlVmFsdWUkMShhW2tdLCBiW2tdKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY1trXSA9IGJba107CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIGZvciAoayBpbiBpKSBjW2tdID0gaVtrXSh0KTsKICAgICAgICByZXR1cm4gYzsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgcmVBJDMgPSAvWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csCiAgICAgICAgcmVCJDMgPSBuZXcgUmVnRXhwKHJlQSQzLnNvdXJjZSwgImciKTsKCiAgICBmdW5jdGlvbiB6ZXJvJDMoYikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb25lJDMoYikgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBiKHQpICsgIiI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3RyaW5nJDEoYSwgYikgewogICAgICB2YXIgYmkgPSByZUEkMy5sYXN0SW5kZXggPSByZUIkMy5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhCiAgICAgICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiCiAgICAgICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gcwogICAgICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAgIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4KICAgICAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsKCiAgICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICAgIHdoaWxlICgoYW0gPSByZUEkMy5leGVjKGEpKQogICAgICAgICAgJiYgKGJtID0gcmVCJDMuZXhlYyhiKSkpIHsKICAgICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGIKICAgICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgICAgIH0KICAgICAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJtOwogICAgICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzCiAgICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgICAgcS5wdXNoKHtpOiBpLCB4OiByZWludGVycG9sYXRlKGFtLCBibSl9KTsKICAgICAgICB9CiAgICAgICAgYmkgPSByZUIkMy5sYXN0SW5kZXg7CiAgICAgIH0KCiAgICAgIC8vIEFkZCByZW1haW5zIG9mIGIuCiAgICAgIGlmIChiaSA8IGIubGVuZ3RoKSB7CiAgICAgICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgICB9CgogICAgICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC4KICAgICAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy4KICAgICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdCiAgICAgICAgICA/IG9uZSQzKHFbMF0ueCkKICAgICAgICAgIDogemVybyQzKGIpKQogICAgICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgICAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVWYWx1ZSQxKGEsIGIpIHsKICAgICAgdmFyIHQgPSB0eXBlb2YgYiwgYzsKICAgICAgcmV0dXJuIGIgPT0gbnVsbCB8fCB0ID09PSAiYm9vbGVhbiIgPyBjb25zdGFudCRwKGIpCiAgICAgICAgICA6ICh0ID09PSAibnVtYmVyIiA/IHJlaW50ZXJwb2xhdGUKICAgICAgICAgIDogdCA9PT0gInN0cmluZyIgPyAoKGMgPSBjb2xvciQ0KGIpKSA/IChiID0gYywgcmdiJDYpIDogc3RyaW5nJDEpCiAgICAgICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciQ0ID8gcmdiJDYKICAgICAgICAgIDogYiBpbnN0YW5jZW9mIERhdGUgPyBkYXRlJDQKICAgICAgICAgIDogaXNOdW1iZXJBcnJheSQyKGIpID8gbnVtYmVyQXJyYXkkMgogICAgICAgICAgOiBBcnJheS5pc0FycmF5KGIpID8gZ2VuZXJpY0FycmF5JDIKICAgICAgICAgIDogdHlwZW9mIGIudmFsdWVPZiAhPT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgYi50b1N0cmluZyAhPT0gImZ1bmN0aW9uIiB8fCBpc05hTihiKSA/IG9iamVjdCQ1CiAgICAgICAgICA6IHJlaW50ZXJwb2xhdGUpKGEsIGIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlUm91bmQkMShhLCBiKSB7CiAgICAgIHJldHVybiBhID0gK2EsIGIgPSArYiwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBNYXRoLnJvdW5kKGEgKiAoMSAtIHQpICsgYiAqIHQpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGN1YmVoZWxpeCQ5KGh1ZSkgewogICAgICByZXR1cm4gKGZ1bmN0aW9uIGN1YmVoZWxpeEdhbW1hKHkpIHsKICAgICAgICB5ID0gK3k7CgogICAgICAgIGZ1bmN0aW9uIGN1YmVoZWxpeChzdGFydCwgZW5kKSB7CiAgICAgICAgICB2YXIgaCA9IGh1ZSgoc3RhcnQgPSBjdWJlaGVsaXgkOChzdGFydCkpLmgsIChlbmQgPSBjdWJlaGVsaXgkOChlbmQpKS5oKSwKICAgICAgICAgICAgICBzID0gbm9nYW1tYSQzKHN0YXJ0LnMsIGVuZC5zKSwKICAgICAgICAgICAgICBsID0gbm9nYW1tYSQzKHN0YXJ0LmwsIGVuZC5sKSwKICAgICAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYSQzKHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgIHN0YXJ0LmggPSBoKHQpOwogICAgICAgICAgICBzdGFydC5zID0gcyh0KTsKICAgICAgICAgICAgc3RhcnQubCA9IGwoTWF0aC5wb3codCwgeSkpOwogICAgICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgIiI7CiAgICAgICAgICB9OwogICAgICAgIH0KCiAgICAgICAgY3ViZWhlbGl4LmdhbW1hID0gY3ViZWhlbGl4R2FtbWE7CgogICAgICAgIHJldHVybiBjdWJlaGVsaXg7CiAgICAgIH0pKDEpOwogICAgfQoKICAgIGN1YmVoZWxpeCQ5KGh1ZSQzKTsKICAgIHZhciBjdWJlaGVsaXhMb25nJDIgPSBjdWJlaGVsaXgkOShub2dhbW1hJDMpOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JHEoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbnVtYmVyJDgoeCkgewogICAgICByZXR1cm4gK3g7CiAgICB9CgogICAgdmFyIHVuaXQkMSA9IFswLCAxXTsKCiAgICBmdW5jdGlvbiBkZWludGVycG9sYXRlTGluZWFyKGEsIGIpIHsKICAgICAgcmV0dXJuIChiIC09IChhID0gK2EpKQogICAgICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiAoeCAtIGEpIC8gYjsgfQogICAgICAgICAgOiBjb25zdGFudCRxKGIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlaW50ZXJwb2xhdGVDbGFtcChkZWludGVycG9sYXRlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdmFyIGQgPSBkZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oeCkgeyByZXR1cm4geCA8PSBhID8gMCA6IHggPj0gYiA/IDEgOiBkKHgpOyB9OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHJlaW50ZXJwb2xhdGVDbGFtcChyZWludGVycG9sYXRlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdmFyIHIgPSByZWludGVycG9sYXRlKGEgPSArYSwgYiA9ICtiKTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgeyByZXR1cm4gdCA8PSAwID8gYSA6IHQgPj0gMSA/IGIgOiByKHQpOyB9OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGJpbWFwJDEoZG9tYWluLCByYW5nZSwgZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkgewogICAgICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdOwogICAgICBpZiAoZDEgPCBkMCkgZDAgPSBkZWludGVycG9sYXRlKGQxLCBkMCksIHIwID0gcmVpbnRlcnBvbGF0ZShyMSwgcjApOwogICAgICBlbHNlIGQwID0gZGVpbnRlcnBvbGF0ZShkMCwgZDEpLCByMCA9IHJlaW50ZXJwb2xhdGUocjAsIHIxKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2x5bWFwJDEoZG9tYWluLCByYW5nZSwgZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSkgewogICAgICB2YXIgaiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgLSAxLAogICAgICAgICAgZCA9IG5ldyBBcnJheShqKSwKICAgICAgICAgIHIgPSBuZXcgQXJyYXkoaiksCiAgICAgICAgICBpID0gLTE7CgogICAgICAvLyBSZXZlcnNlIGRlc2NlbmRpbmcgZG9tYWlucy4KICAgICAgaWYgKGRvbWFpbltqXSA8IGRvbWFpblswXSkgewogICAgICAgIGRvbWFpbiA9IGRvbWFpbi5zbGljZSgpLnJldmVyc2UoKTsKICAgICAgICByYW5nZSA9IHJhbmdlLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgICB9CgogICAgICB3aGlsZSAoKytpIDwgaikgewogICAgICAgIGRbaV0gPSBkZWludGVycG9sYXRlKGRvbWFpbltpXSwgZG9tYWluW2kgKyAxXSk7CiAgICAgICAgcltpXSA9IHJlaW50ZXJwb2xhdGUocmFuZ2VbaV0sIHJhbmdlW2kgKyAxXSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7CiAgICAgICAgdmFyIGkgPSBiaXNlY3RSaWdodCQyKGRvbWFpbiwgeCwgMSwgaikgLSAxOwogICAgICAgIHJldHVybiByW2ldKGRbaV0oeCkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkkMihzb3VyY2UsIHRhcmdldCkgewogICAgICByZXR1cm4gdGFyZ2V0CiAgICAgICAgICAuZG9tYWluKHNvdXJjZS5kb21haW4oKSkKICAgICAgICAgIC5yYW5nZShzb3VyY2UucmFuZ2UoKSkKICAgICAgICAgIC5pbnRlcnBvbGF0ZShzb3VyY2UuaW50ZXJwb2xhdGUoKSkKICAgICAgICAgIC5jbGFtcChzb3VyY2UuY2xhbXAoKSk7CiAgICB9CgogICAgLy8gZGVpbnRlcnBvbGF0ZShhLCBiKSh4KSB0YWtlcyBhIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHBhcmFtZXRlciB0IGluIFswLDFdLgogICAgLy8gcmVpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGRvbWFpbiB2YWx1ZSB4IGluIFthLGJdLgogICAgZnVuY3Rpb24gY29udGludW91cyQxKGRlaW50ZXJwb2xhdGUsIHJlaW50ZXJwb2xhdGUpIHsKICAgICAgdmFyIGRvbWFpbiA9IHVuaXQkMSwKICAgICAgICAgIHJhbmdlID0gdW5pdCQxLAogICAgICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVZhbHVlJDEsCiAgICAgICAgICBjbGFtcCA9IGZhbHNlLAogICAgICAgICAgcGllY2V3aXNlLAogICAgICAgICAgb3V0cHV0LAogICAgICAgICAgaW5wdXQ7CgogICAgICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgICAgIHBpZWNld2lzZSA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCkgPiAyID8gcG9seW1hcCQxIDogYmltYXAkMTsKICAgICAgICBvdXRwdXQgPSBpbnB1dCA9IG51bGw7CiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgcmV0dXJuIChvdXRwdXQgfHwgKG91dHB1dCA9IHBpZWNld2lzZShkb21haW4sIHJhbmdlLCBjbGFtcCA/IGRlaW50ZXJwb2xhdGVDbGFtcChkZWludGVycG9sYXRlKSA6IGRlaW50ZXJwb2xhdGUsIGludGVycG9sYXRlKSkpKCt4KTsKICAgICAgfQoKICAgICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgICAgIHJldHVybiAoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4sIGRlaW50ZXJwb2xhdGVMaW5lYXIsIGNsYW1wID8gcmVpbnRlcnBvbGF0ZUNsYW1wKHJlaW50ZXJwb2xhdGUpIDogcmVpbnRlcnBvbGF0ZSkpKSgreSk7CiAgICAgIH07CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDguY2FsbChfLCBudW1iZXIkOCksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UkYy5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIHJhbmdlID0gc2xpY2UkYy5jYWxsKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQkMSwgcmVzY2FsZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUuY2xhbXAgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY2xhbXAgPSAhIV8sIHJlc2NhbGUoKSkgOiBjbGFtcDsKICAgICAgfTsKCiAgICAgIHNjYWxlLmludGVycG9sYXRlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGludGVycG9sYXRlID0gXywgcmVzY2FsZSgpKSA6IGludGVycG9sYXRlOwogICAgICB9OwoKICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgIH0KCiAgICAvLyBDb21wdXRlcyB0aGUgZGVjaW1hbCBjb2VmZmljaWVudCBhbmQgZXhwb25lbnQgb2YgdGhlIHNwZWNpZmllZCBudW1iZXIgeCB3aXRoCiAgICAvLyBzaWduaWZpY2FudCBkaWdpdHMgcCwgd2hlcmUgeCBpcyBwb3NpdGl2ZSBhbmQgcCBpcyBpbiBbMSwgMjFdIG9yIHVuZGVmaW5lZC4KICAgIC8vIEZvciBleGFtcGxlLCBmb3JtYXREZWNpbWFsKDEuMjMpIHJldHVybnMgWyIxMjMiLCAwXS4KICAgIGZ1bmN0aW9uIGZvcm1hdERlY2ltYWwkMih4LCBwKSB7CiAgICAgIGlmICgoaSA9ICh4ID0gcCA/IHgudG9FeHBvbmVudGlhbChwIC0gMSkgOiB4LnRvRXhwb25lbnRpYWwoKSkuaW5kZXhPZigiZSIpKSA8IDApIHJldHVybiBudWxsOyAvLyBOYU4sIMKxSW5maW5pdHkKICAgICAgdmFyIGksIGNvZWZmaWNpZW50ID0geC5zbGljZSgwLCBpKTsKCiAgICAgIC8vIFRoZSBzdHJpbmcgcmV0dXJuZWQgYnkgdG9FeHBvbmVudGlhbCBlaXRoZXIgaGFzIHRoZSBmb3JtIFxkXC5cZCtlWy0rXVxkKwogICAgICAvLyAoZS5nLiwgMS4yZSszKSBvciB0aGUgZm9ybSBcZGVbLStdXGQrIChlLmcuLCAxZSszKS4KICAgICAgcmV0dXJuIFsKICAgICAgICBjb2VmZmljaWVudC5sZW5ndGggPiAxID8gY29lZmZpY2llbnRbMF0gKyBjb2VmZmljaWVudC5zbGljZSgyKSA6IGNvZWZmaWNpZW50LAogICAgICAgICt4LnNsaWNlKGkgKyAxKQogICAgICBdOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cG9uZW50JDQoeCkgewogICAgICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWwkMihNYXRoLmFicyh4KSksIHggPyB4WzFdIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEdyb3VwJDIoZ3JvdXBpbmcsIHRob3VzYW5kcykgewogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUsIHdpZHRoKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5sZW5ndGgsCiAgICAgICAgICAgIHQgPSBbXSwKICAgICAgICAgICAgaiA9IDAsCiAgICAgICAgICAgIGcgPSBncm91cGluZ1swXSwKICAgICAgICAgICAgbGVuZ3RoID0gMDsKCiAgICAgICAgd2hpbGUgKGkgPiAwICYmIGcgPiAwKSB7CiAgICAgICAgICBpZiAobGVuZ3RoICsgZyArIDEgPiB3aWR0aCkgZyA9IE1hdGgubWF4KDEsIHdpZHRoIC0gbGVuZ3RoKTsKICAgICAgICAgIHQucHVzaCh2YWx1ZS5zdWJzdHJpbmcoaSAtPSBnLCBpICsgZykpOwogICAgICAgICAgaWYgKChsZW5ndGggKz0gZyArIDEpID4gd2lkdGgpIGJyZWFrOwogICAgICAgICAgZyA9IGdyb3VwaW5nW2ogPSAoaiArIDEpICUgZ3JvdXBpbmcubGVuZ3RoXTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0LnJldmVyc2UoKS5qb2luKHRob3VzYW5kcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TnVtZXJhbHMkMihudW1lcmFscykgewogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkgewogICAgICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTsKICAgICAgICB9KTsKICAgICAgfTsKICAgIH0KCiAgICAvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdCiAgICB2YXIgcmUkMiA9IC9eKD86KC4pPyhbPD49Xl0pKT8oWytcLSggXSk/KFskI10pPygwKT8oXGQrKT8oLCk/KFwuXGQrKT8ofik/KFthLXolXSk/JC9pOwoKICAgIGZ1bmN0aW9uIGZvcm1hdFNwZWNpZmllciQyKHNwZWNpZmllcikgewogICAgICBpZiAoIShtYXRjaCA9IHJlJDIuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIiArIHNwZWNpZmllcik7CiAgICAgIHZhciBtYXRjaDsKICAgICAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIkMih7CiAgICAgICAgZmlsbDogbWF0Y2hbMV0sCiAgICAgICAgYWxpZ246IG1hdGNoWzJdLAogICAgICAgIHNpZ246IG1hdGNoWzNdLAogICAgICAgIHN5bWJvbDogbWF0Y2hbNF0sCiAgICAgICAgemVybzogbWF0Y2hbNV0sCiAgICAgICAgd2lkdGg6IG1hdGNoWzZdLAogICAgICAgIGNvbW1hOiBtYXRjaFs3XSwKICAgICAgICBwcmVjaXNpb246IG1hdGNoWzhdICYmIG1hdGNoWzhdLnNsaWNlKDEpLAogICAgICAgIHRyaW06IG1hdGNoWzldLAogICAgICAgIHR5cGU6IG1hdGNoWzEwXQogICAgICB9KTsKICAgIH0KCiAgICBmb3JtYXRTcGVjaWZpZXIkMi5wcm90b3R5cGUgPSBGb3JtYXRTcGVjaWZpZXIkMi5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2YKCiAgICBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIkMihzcGVjaWZpZXIpIHsKICAgICAgdGhpcy5maWxsID0gc3BlY2lmaWVyLmZpbGwgPT09IHVuZGVmaW5lZCA/ICIgIiA6IHNwZWNpZmllci5maWxsICsgIiI7CiAgICAgIHRoaXMuYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24gPT09IHVuZGVmaW5lZCA/ICI+IiA6IHNwZWNpZmllci5hbGlnbiArICIiOwogICAgICB0aGlzLnNpZ24gPSBzcGVjaWZpZXIuc2lnbiA9PT0gdW5kZWZpbmVkID8gIi0iIDogc3BlY2lmaWVyLnNpZ24gKyAiIjsKICAgICAgdGhpcy5zeW1ib2wgPSBzcGVjaWZpZXIuc3ltYm9sID09PSB1bmRlZmluZWQgPyAiIiA6IHNwZWNpZmllci5zeW1ib2wgKyAiIjsKICAgICAgdGhpcy56ZXJvID0gISFzcGVjaWZpZXIuemVybzsKICAgICAgdGhpcy53aWR0aCA9IHNwZWNpZmllci53aWR0aCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogK3NwZWNpZmllci53aWR0aDsKICAgICAgdGhpcy5jb21tYSA9ICEhc3BlY2lmaWVyLmNvbW1hOwogICAgICB0aGlzLnByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIucHJlY2lzaW9uOwogICAgICB0aGlzLnRyaW0gPSAhIXNwZWNpZmllci50cmltOwogICAgICB0aGlzLnR5cGUgPSBzcGVjaWZpZXIudHlwZSA9PT0gdW5kZWZpbmVkID8gIiIgOiBzcGVjaWZpZXIudHlwZSArICIiOwogICAgfQoKICAgIEZvcm1hdFNwZWNpZmllciQyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5maWxsCiAgICAgICAgICArIHRoaXMuYWxpZ24KICAgICAgICAgICsgdGhpcy5zaWduCiAgICAgICAgICArIHRoaXMuc3ltYm9sCiAgICAgICAgICArICh0aGlzLnplcm8gPyAiMCIgOiAiIikKICAgICAgICAgICsgKHRoaXMud2lkdGggPT09IHVuZGVmaW5lZCA/ICIiIDogTWF0aC5tYXgoMSwgdGhpcy53aWR0aCB8IDApKQogICAgICAgICAgKyAodGhpcy5jb21tYSA/ICIsIiA6ICIiKQogICAgICAgICAgKyAodGhpcy5wcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICIiIDogIi4iICsgTWF0aC5tYXgoMCwgdGhpcy5wcmVjaXNpb24gfCAwKSkKICAgICAgICAgICsgKHRoaXMudHJpbSA/ICJ+IiA6ICIiKQogICAgICAgICAgKyB0aGlzLnR5cGU7CiAgICB9OwoKICAgIC8vIFRyaW1zIGluc2lnbmlmaWNhbnQgemVyb3MsIGUuZy4sIHJlcGxhY2VzIDEuMjAwMGsgd2l0aCAxLjJrLgogICAgZnVuY3Rpb24gZm9ybWF0VHJpbSQxKHMpIHsKICAgICAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkgewogICAgICAgIHN3aXRjaCAoc1tpXSkgewogICAgICAgICAgY2FzZSAiLiI6IGkwID0gaTEgPSBpOyBicmVhazsKICAgICAgICAgIGNhc2UgIjAiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogczsKICAgIH0KCiAgICB2YXIgcHJlZml4RXhwb25lbnQkMjsKCiAgICBmdW5jdGlvbiBmb3JtYXRQcmVmaXhBdXRvJDIoeCwgcCkgewogICAgICB2YXIgZCA9IGZvcm1hdERlY2ltYWwkMih4LCBwKTsKICAgICAgaWYgKCFkKSByZXR1cm4geCArICIiOwogICAgICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLAogICAgICAgICAgZXhwb25lbnQgPSBkWzFdLAogICAgICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50JDIgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCAvIDMpKSkgKiAzKSArIDEsCiAgICAgICAgICBuID0gY29lZmZpY2llbnQubGVuZ3RoOwogICAgICByZXR1cm4gaSA9PT0gbiA/IGNvZWZmaWNpZW50CiAgICAgICAgICA6IGkgPiBuID8gY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoaSAtIG4gKyAxKS5qb2luKCIwIikKICAgICAgICAgIDogaSA+IDAgPyBjb2VmZmljaWVudC5zbGljZSgwLCBpKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGkpCiAgICAgICAgICA6ICIwLiIgKyBuZXcgQXJyYXkoMSAtIGkpLmpvaW4oIjAiKSArIGZvcm1hdERlY2ltYWwkMih4LCBNYXRoLm1heCgwLCBwICsgaSAtIDEpKVswXTsgLy8gbGVzcyB0aGFuIDF5IQogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFJvdW5kZWQkMih4LCBwKSB7CiAgICAgIHZhciBkID0gZm9ybWF0RGVjaW1hbCQyKHgsIHApOwogICAgICBpZiAoIWQpIHJldHVybiB4ICsgIiI7CiAgICAgIHZhciBjb2VmZmljaWVudCA9IGRbMF0sCiAgICAgICAgICBleHBvbmVudCA9IGRbMV07CiAgICAgIHJldHVybiBleHBvbmVudCA8IDAgPyAiMC4iICsgbmV3IEFycmF5KC1leHBvbmVudCkuam9pbigiMCIpICsgY29lZmZpY2llbnQKICAgICAgICAgIDogY29lZmZpY2llbnQubGVuZ3RoID4gZXhwb25lbnQgKyAxID8gY29lZmZpY2llbnQuc2xpY2UoMCwgZXhwb25lbnQgKyAxKSArICIuIiArIGNvZWZmaWNpZW50LnNsaWNlKGV4cG9uZW50ICsgMSkKICAgICAgICAgIDogY29lZmZpY2llbnQgKyBuZXcgQXJyYXkoZXhwb25lbnQgLSBjb2VmZmljaWVudC5sZW5ndGggKyAyKS5qb2luKCIwIik7CiAgICB9CgogICAgdmFyIGZvcm1hdFR5cGVzJDIgPSB7CiAgICAgICIlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gKHggKiAxMDApLnRvRml4ZWQocCk7IH0sCiAgICAgICJiIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygyKTsgfSwKICAgICAgImMiOiBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgIiI7IH0sCiAgICAgICJkIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxMCk7IH0sCiAgICAgICJlIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0V4cG9uZW50aWFsKHApOyB9LAogICAgICAiZiI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9GaXhlZChwKTsgfSwKICAgICAgImciOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvUHJlY2lzaW9uKHApOyB9LAogICAgICAibyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoOCk7IH0sCiAgICAgICJwIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4gZm9ybWF0Um91bmRlZCQyKHggKiAxMDAsIHApOyB9LAogICAgICAiciI6IGZvcm1hdFJvdW5kZWQkMiwKICAgICAgInMiOiBmb3JtYXRQcmVmaXhBdXRvJDIsCiAgICAgICJYIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTsgfSwKICAgICAgIngiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KTsgfQogICAgfTsKCiAgICBmdW5jdGlvbiBpZGVudGl0eSRoKHgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgdmFyIG1hcCQ5ID0gQXJyYXkucHJvdG90eXBlLm1hcCwKICAgICAgICBwcmVmaXhlcyQyID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdOwoKICAgIGZ1bmN0aW9uIGZvcm1hdExvY2FsZSQzKGxvY2FsZSkgewogICAgICB2YXIgZ3JvdXAgPSBsb2NhbGUuZ3JvdXBpbmcgPT09IHVuZGVmaW5lZCB8fCBsb2NhbGUudGhvdXNhbmRzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSRoIDogZm9ybWF0R3JvdXAkMihtYXAkOS5jYWxsKGxvY2FsZS5ncm91cGluZywgTnVtYmVyKSwgbG9jYWxlLnRob3VzYW5kcyArICIiKSwKICAgICAgICAgIGN1cnJlbmN5UHJlZml4ID0gbG9jYWxlLmN1cnJlbmN5ID09PSB1bmRlZmluZWQgPyAiIiA6IGxvY2FsZS5jdXJyZW5jeVswXSArICIiLAogICAgICAgICAgY3VycmVuY3lTdWZmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/ICIiIDogbG9jYWxlLmN1cnJlbmN5WzFdICsgIiIsCiAgICAgICAgICBkZWNpbWFsID0gbG9jYWxlLmRlY2ltYWwgPT09IHVuZGVmaW5lZCA/ICIuIiA6IGxvY2FsZS5kZWNpbWFsICsgIiIsCiAgICAgICAgICBudW1lcmFscyA9IGxvY2FsZS5udW1lcmFscyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkkaCA6IGZvcm1hdE51bWVyYWxzJDIobWFwJDkuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLAogICAgICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyAiJSIgOiBsb2NhbGUucGVyY2VudCArICIiLAogICAgICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/ICItIiA6IGxvY2FsZS5taW51cyArICIiLAogICAgICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gIk5hTiIgOiBsb2NhbGUubmFuICsgIiI7CgogICAgICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7CiAgICAgICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyJDIoc3BlY2lmaWVyKTsKCiAgICAgICAgdmFyIGZpbGwgPSBzcGVjaWZpZXIuZmlsbCwKICAgICAgICAgICAgYWxpZ24gPSBzcGVjaWZpZXIuYWxpZ24sCiAgICAgICAgICAgIHNpZ24gPSBzcGVjaWZpZXIuc2lnbiwKICAgICAgICAgICAgc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCwKICAgICAgICAgICAgemVybyA9IHNwZWNpZmllci56ZXJvLAogICAgICAgICAgICB3aWR0aCA9IHNwZWNpZmllci53aWR0aCwKICAgICAgICAgICAgY29tbWEgPSBzcGVjaWZpZXIuY29tbWEsCiAgICAgICAgICAgIHByZWNpc2lvbiA9IHNwZWNpZmllci5wcmVjaXNpb24sCiAgICAgICAgICAgIHRyaW0gPSBzcGVjaWZpZXIudHJpbSwKICAgICAgICAgICAgdHlwZSA9IHNwZWNpZmllci50eXBlOwoKICAgICAgICAvLyBUaGUgIm4iIHR5cGUgaXMgYW4gYWxpYXMgZm9yICIsZyIuCiAgICAgICAgaWYgKHR5cGUgPT09ICJuIikgY29tbWEgPSB0cnVlLCB0eXBlID0gImciOwoKICAgICAgICAvLyBUaGUgIiIgdHlwZSwgYW5kIGFueSBpbnZhbGlkIHR5cGUsIGlzIGFuIGFsaWFzIGZvciAiLjEyfmciLgogICAgICAgIGVsc2UgaWYgKCFmb3JtYXRUeXBlcyQyW3R5cGVdKSBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCAmJiAocHJlY2lzaW9uID0gMTIpLCB0cmltID0gdHJ1ZSwgdHlwZSA9ICJnIjsKCiAgICAgICAgLy8gSWYgemVybyBmaWxsIGlzIHNwZWNpZmllZCwgcGFkZGluZyBnb2VzIGFmdGVyIHNpZ24gYW5kIGJlZm9yZSBkaWdpdHMuCiAgICAgICAgaWYgKHplcm8gfHwgKGZpbGwgPT09ICIwIiAmJiBhbGlnbiA9PT0gIj0iKSkgemVybyA9IHRydWUsIGZpbGwgPSAiMCIsIGFsaWduID0gIj0iOwoKICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4KICAgICAgICAvLyBGb3IgU0ktcHJlZml4LCB0aGUgc3VmZml4IGlzIGxhemlseSBjb21wdXRlZC4KICAgICAgICB2YXIgcHJlZml4ID0gc3ltYm9sID09PSAiJCIgPyBjdXJyZW5jeVByZWZpeCA6IHN5bWJvbCA9PT0gIiMiICYmIC9bYm94WF0vLnRlc3QodHlwZSkgPyAiMCIgKyB0eXBlLnRvTG93ZXJDYXNlKCkgOiAiIiwKICAgICAgICAgICAgc3VmZml4ID0gc3ltYm9sID09PSAiJCIgPyBjdXJyZW5jeVN1ZmZpeCA6IC9bJXBdLy50ZXN0KHR5cGUpID8gcGVyY2VudCA6ICIiOwoKICAgICAgICAvLyBXaGF0IGZvcm1hdCBmdW5jdGlvbiBzaG91bGQgd2UgdXNlPwogICAgICAgIC8vIElzIHRoaXMgYW4gaW50ZWdlciB0eXBlPwogICAgICAgIC8vIENhbiB0aGlzIHR5cGUgZ2VuZXJhdGUgZXhwb25lbnRpYWwgbm90YXRpb24/CiAgICAgICAgdmFyIGZvcm1hdFR5cGUgPSBmb3JtYXRUeXBlcyQyW3R5cGVdLAogICAgICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpOwoKICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsCiAgICAgICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS4KICAgICAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uCiAgICAgICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLgogICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNgogICAgICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSkKICAgICAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7CgogICAgICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkgewogICAgICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LAogICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LAogICAgICAgICAgICAgIGksIG4sIGM7CgogICAgICAgICAgaWYgKHR5cGUgPT09ICJjIikgewogICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7CiAgICAgICAgICAgIHZhbHVlID0gIiI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKCiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIQogICAgICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwOwoKICAgICAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLgogICAgICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pOwoKICAgICAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLgogICAgICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltJDEodmFsdWUpOwoKICAgICAgICAgICAgLy8gSWYgYSBuZWdhdGl2ZSB2YWx1ZSByb3VuZHMgdG8gemVybyBhZnRlciBmb3JtYXR0aW5nLCBhbmQgbm8gZXhwbGljaXQgcG9zaXRpdmUgc2lnbiBpcyByZXF1ZXN0ZWQsIGhpZGUgdGhlIHNpZ24uCiAgICAgICAgICAgIGlmICh2YWx1ZU5lZ2F0aXZlICYmICt2YWx1ZSA9PT0gMCAmJiBzaWduICE9PSAiKyIpIHZhbHVlTmVnYXRpdmUgPSBmYWxzZTsKCiAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAgICAgICAgICB2YWx1ZVByZWZpeCA9ICh2YWx1ZU5lZ2F0aXZlID8gKHNpZ24gPT09ICIoIiA/IHNpZ24gOiBtaW51cykgOiBzaWduID09PSAiLSIgfHwgc2lnbiA9PT0gIigiID8gIiIgOiBzaWduKSArIHZhbHVlUHJlZml4OwogICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9ICh0eXBlID09PSAicyIgPyBwcmVmaXhlcyQyWzggKyBwcmVmaXhFeHBvbmVudCQyIC8gM10gOiAiIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09ICIoIiA/ICIpIiA6ICIiKTsKCiAgICAgICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlCiAgICAgICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LgogICAgICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHsKICAgICAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1NykgewogICAgICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuCiAgICAgICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTsKCiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLgogICAgICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCwKICAgICAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogIiI7CgogICAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLgogICAgICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gIiI7CgogICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuCiAgICAgICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgICAgIGNhc2UgIjwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrOwogICAgICAgICAgICBjYXNlICI9IjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsKICAgICAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHNwZWNpZmllciArICIiOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBmb3JtYXQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7CiAgICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllciQyKHNwZWNpZmllciksIHNwZWNpZmllci50eXBlID0gImYiLCBzcGVjaWZpZXIpKSwKICAgICAgICAgICAgZSA9IE1hdGgubWF4KC04LCBNYXRoLm1pbig4LCBNYXRoLmZsb29yKGV4cG9uZW50JDQodmFsdWUpIC8gMykpKSAqIDMsCiAgICAgICAgICAgIGsgPSBNYXRoLnBvdygxMCwgLWUpLAogICAgICAgICAgICBwcmVmaXggPSBwcmVmaXhlcyQyWzggKyBlIC8gM107CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4OwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZm9ybWF0OiBuZXdGb3JtYXQsCiAgICAgICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXgKICAgICAgfTsKICAgIH0KCiAgICB2YXIgbG9jYWxlJDM7CiAgICB2YXIgZm9ybWF0JDI7CiAgICB2YXIgZm9ybWF0UHJlZml4JDI7CgogICAgZGVmYXVsdExvY2FsZSQzKHsKICAgICAgZGVjaW1hbDogIi4iLAogICAgICB0aG91c2FuZHM6ICIsIiwKICAgICAgZ3JvdXBpbmc6IFszXSwKICAgICAgY3VycmVuY3k6IFsiJCIsICIiXSwKICAgICAgbWludXM6ICItIgogICAgfSk7CgogICAgZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQzKGRlZmluaXRpb24pIHsKICAgICAgbG9jYWxlJDMgPSBmb3JtYXRMb2NhbGUkMyhkZWZpbml0aW9uKTsKICAgICAgZm9ybWF0JDIgPSBsb2NhbGUkMy5mb3JtYXQ7CiAgICAgIGZvcm1hdFByZWZpeCQyID0gbG9jYWxlJDMuZm9ybWF0UHJlZml4OwogICAgICByZXR1cm4gbG9jYWxlJDM7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlY2lzaW9uRml4ZWQkMihzdGVwKSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCAtZXhwb25lbnQkNChNYXRoLmFicyhzdGVwKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWNpc2lvblByZWZpeCQyKHN0ZXAsIHZhbHVlKSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCQ0KHZhbHVlKSAvIDMpKSkgKiAzIC0gZXhwb25lbnQkNChNYXRoLmFicyhzdGVwKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHByZWNpc2lvblJvdW5kJDIoc3RlcCwgbWF4KSB7CiAgICAgIHN0ZXAgPSBNYXRoLmFicyhzdGVwKSwgbWF4ID0gTWF0aC5hYnMobWF4KSAtIHN0ZXA7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudCQ0KG1heCkgLSBleHBvbmVudCQ0KHN0ZXApKSArIDE7CiAgICB9CgogICAgZnVuY3Rpb24gdGlja0Zvcm1hdCQxKGRvbWFpbiwgY291bnQsIHNwZWNpZmllcikgewogICAgICB2YXIgc3RhcnQgPSBkb21haW5bMF0sCiAgICAgICAgICBzdG9wID0gZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXSwKICAgICAgICAgIHN0ZXAgPSB0aWNrU3RlcCQyKHN0YXJ0LCBzdG9wLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCksCiAgICAgICAgICBwcmVjaXNpb247CiAgICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllciQyKHNwZWNpZmllciA9PSBudWxsID8gIixmIiA6IHNwZWNpZmllcik7CiAgICAgIHN3aXRjaCAoc3BlY2lmaWVyLnR5cGUpIHsKICAgICAgICBjYXNlICJzIjogewogICAgICAgICAgdmFyIHZhbHVlID0gTWF0aC5tYXgoTWF0aC5hYnMoc3RhcnQpLCBNYXRoLmFicyhzdG9wKSk7CiAgICAgICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25QcmVmaXgkMihzdGVwLCB2YWx1ZSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uOwogICAgICAgICAgcmV0dXJuIGZvcm1hdFByZWZpeCQyKHNwZWNpZmllciwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBjYXNlICIiOgogICAgICAgIGNhc2UgImUiOgogICAgICAgIGNhc2UgImciOgogICAgICAgIGNhc2UgInAiOgogICAgICAgIGNhc2UgInIiOiB7CiAgICAgICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25Sb3VuZCQyKHN0ZXAsIE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICJlIik7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgY2FzZSAiZiI6CiAgICAgICAgY2FzZSAiJSI6IHsKICAgICAgICAgIGlmIChzcGVjaWZpZXIucHJlY2lzaW9uID09IG51bGwgJiYgIWlzTmFOKHByZWNpc2lvbiA9IHByZWNpc2lvbkZpeGVkJDIoc3RlcCkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSAiJSIpICogMjsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gZm9ybWF0JDIoc3BlY2lmaWVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lYXJpc2gkMShzY2FsZSkgewogICAgICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluOwoKICAgICAgc2NhbGUudGlja3MgPSBmdW5jdGlvbihjb3VudCkgewogICAgICAgIHZhciBkID0gZG9tYWluKCk7CiAgICAgICAgcmV0dXJuIHRpY2tzJDIoZFswXSwgZFtkLmxlbmd0aCAtIDFdLCBjb3VudCA9PSBudWxsID8gMTAgOiBjb3VudCk7CiAgICAgIH07CgogICAgICBzY2FsZS50aWNrRm9ybWF0ID0gZnVuY3Rpb24oY291bnQsIHNwZWNpZmllcikgewogICAgICAgIHJldHVybiB0aWNrRm9ybWF0JDEoZG9tYWluKCksIGNvdW50LCBzcGVjaWZpZXIpOwogICAgICB9OwoKICAgICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNvdW50KSB7CiAgICAgICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7CgogICAgICAgIHZhciBkID0gZG9tYWluKCksCiAgICAgICAgICAgIGkwID0gMCwKICAgICAgICAgICAgaTEgPSBkLmxlbmd0aCAtIDEsCiAgICAgICAgICAgIHN0YXJ0ID0gZFtpMF0sCiAgICAgICAgICAgIHN0b3AgPSBkW2kxXSwKICAgICAgICAgICAgc3RlcDsKCiAgICAgICAgaWYgKHN0b3AgPCBzdGFydCkgewogICAgICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwOwogICAgICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7CiAgICAgICAgfQoKICAgICAgICBzdGVwID0gdGlja0luY3JlbWVudCQyKHN0YXJ0LCBzdG9wLCBjb3VudCk7CgogICAgICAgIGlmIChzdGVwID4gMCkgewogICAgICAgICAgc3RhcnQgPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgc3RvcCA9IE1hdGguY2VpbChzdG9wIC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQkMihzdGFydCwgc3RvcCwgY291bnQpOwogICAgICAgIH0gZWxzZSBpZiAoc3RlcCA8IDApIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0ICogc3RlcCkgLyBzdGVwOwogICAgICAgICAgc3RvcCA9IE1hdGguZmxvb3Ioc3RvcCAqIHN0ZXApIC8gc3RlcDsKICAgICAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50JDIoc3RhcnQsIHN0b3AsIGNvdW50KTsKICAgICAgICB9CgogICAgICAgIGlmIChzdGVwID4gMCkgewogICAgICAgICAgZFtpMF0gPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgZFtpMV0gPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgICAgIGRvbWFpbihkKTsKICAgICAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7CiAgICAgICAgICBkW2kwXSA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXApIC8gc3RlcDsKICAgICAgICAgIGRbaTFdID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOwogICAgICAgICAgZG9tYWluKGQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9OwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVhciQ3KCkgewogICAgICB2YXIgc2NhbGUgPSBjb250aW51b3VzJDEoZGVpbnRlcnBvbGF0ZUxpbmVhciwgcmVpbnRlcnBvbGF0ZSk7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGNvcHkkMihzY2FsZSwgbGluZWFyJDcoKSk7CiAgICAgIH07CgogICAgICByZXR1cm4gbGluZWFyaXNoJDEoc2NhbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JGkoKSB7CiAgICAgIHZhciBkb21haW4gPSBbMCwgMV07CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgcmV0dXJuICt4OwogICAgICB9CgogICAgICBzY2FsZS5pbnZlcnQgPSBzY2FsZTsKCiAgICAgIHNjYWxlLmRvbWFpbiA9IHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRvbWFpbiA9IG1hcCQ4LmNhbGwoXywgbnVtYmVyJDgpLCBzY2FsZSkgOiBkb21haW4uc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gaWRlbnRpdHkkaSgpLmRvbWFpbihkb21haW4pOwogICAgICB9OwoKICAgICAgcmV0dXJuIGxpbmVhcmlzaCQxKHNjYWxlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBuaWNlJDEoZG9tYWluLCBpbnRlcnZhbCkgewogICAgICBkb21haW4gPSBkb21haW4uc2xpY2UoKTsKCiAgICAgIHZhciBpMCA9IDAsCiAgICAgICAgICBpMSA9IGRvbWFpbi5sZW5ndGggLSAxLAogICAgICAgICAgeDAgPSBkb21haW5baTBdLAogICAgICAgICAgeDEgPSBkb21haW5baTFdLAogICAgICAgICAgdDsKCiAgICAgIGlmICh4MSA8IHgwKSB7CiAgICAgICAgdCA9IGkwLCBpMCA9IGkxLCBpMSA9IHQ7CiAgICAgICAgdCA9IHgwLCB4MCA9IHgxLCB4MSA9IHQ7CiAgICAgIH0KCiAgICAgIGRvbWFpbltpMF0gPSBpbnRlcnZhbC5mbG9vcih4MCk7CiAgICAgIGRvbWFpbltpMV0gPSBpbnRlcnZhbC5jZWlsKHgxKTsKICAgICAgcmV0dXJuIGRvbWFpbjsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWludGVycG9sYXRlKGEsIGIpIHsKICAgICAgcmV0dXJuIChiID0gTWF0aC5sb2coYiAvIGEpKQogICAgICAgICAgPyBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLmxvZyh4IC8gYSkgLyBiOyB9CiAgICAgICAgICA6IGNvbnN0YW50JHEoYik7CiAgICB9CgogICAgZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZSQxKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPCAwCiAgICAgICAgICA/IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIC1NYXRoLnBvdygtYiwgdCkgKiBNYXRoLnBvdygtYSwgMSAtIHQpOyB9CiAgICAgICAgICA6IGZ1bmN0aW9uKHQpIHsgcmV0dXJuIE1hdGgucG93KGIsIHQpICogTWF0aC5wb3coYSwgMSAtIHQpOyB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvdzEwJDEoeCkgewogICAgICByZXR1cm4gaXNGaW5pdGUoeCkgPyArKCIxZSIgKyB4KSA6IHggPCAwID8gMCA6IHg7CiAgICB9CgogICAgZnVuY3Rpb24gcG93cCQxKGJhc2UpIHsKICAgICAgcmV0dXJuIGJhc2UgPT09IDEwID8gcG93MTAkMQogICAgICAgICAgOiBiYXNlID09PSBNYXRoLkUgPyBNYXRoLmV4cAogICAgICAgICAgOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnBvdyhiYXNlLCB4KTsgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb2dwJDEoYmFzZSkgewogICAgICByZXR1cm4gYmFzZSA9PT0gTWF0aC5FID8gTWF0aC5sb2cKICAgICAgICAgIDogYmFzZSA9PT0gMTAgJiYgTWF0aC5sb2cxMAogICAgICAgICAgfHwgYmFzZSA9PT0gMiAmJiBNYXRoLmxvZzIKICAgICAgICAgIHx8IChiYXNlID0gTWF0aC5sb2coYmFzZSksIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgubG9nKHgpIC8gYmFzZTsgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVmbGVjdCQxKGYpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gLWYoLXgpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGxvZyQzKCkgewogICAgICB2YXIgc2NhbGUgPSBjb250aW51b3VzJDEoZGVpbnRlcnBvbGF0ZSwgcmVpbnRlcnBvbGF0ZSQxKS5kb21haW4oWzEsIDEwXSksCiAgICAgICAgICBkb21haW4gPSBzY2FsZS5kb21haW4sCiAgICAgICAgICBiYXNlID0gMTAsCiAgICAgICAgICBsb2dzID0gbG9ncCQxKDEwKSwKICAgICAgICAgIHBvd3MgPSBwb3dwJDEoMTApOwoKICAgICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgICBsb2dzID0gbG9ncCQxKGJhc2UpLCBwb3dzID0gcG93cCQxKGJhc2UpOwogICAgICAgIGlmIChkb21haW4oKVswXSA8IDApIGxvZ3MgPSByZWZsZWN0JDEobG9ncyksIHBvd3MgPSByZWZsZWN0JDEocG93cyk7CiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9CgogICAgICBzY2FsZS5iYXNlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGJhc2UgPSArXywgcmVzY2FsZSgpKSA6IGJhc2U7CiAgICAgIH07CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgICAgIH07CgogICAgICBzY2FsZS50aWNrcyA9IGZ1bmN0aW9uKGNvdW50KSB7CiAgICAgICAgdmFyIGQgPSBkb21haW4oKSwKICAgICAgICAgICAgdSA9IGRbMF0sCiAgICAgICAgICAgIHYgPSBkW2QubGVuZ3RoIC0gMV0sCiAgICAgICAgICAgIHI7CgogICAgICAgIGlmIChyID0gdiA8IHUpIGkgPSB1LCB1ID0gdiwgdiA9IGk7CgogICAgICAgIHZhciBpID0gbG9ncyh1KSwKICAgICAgICAgICAgaiA9IGxvZ3ModiksCiAgICAgICAgICAgIHAsCiAgICAgICAgICAgIGssCiAgICAgICAgICAgIHQsCiAgICAgICAgICAgIG4gPSBjb3VudCA9PSBudWxsID8gMTAgOiArY291bnQsCiAgICAgICAgICAgIHogPSBbXTsKCiAgICAgICAgaWYgKCEoYmFzZSAlIDEpICYmIGogLSBpIDwgbikgewogICAgICAgICAgaSA9IE1hdGgucm91bmQoaSkgLSAxLCBqID0gTWF0aC5yb3VuZChqKSArIDE7CiAgICAgICAgICBpZiAodSA+IDApIGZvciAoOyBpIDwgajsgKytpKSB7CiAgICAgICAgICAgIGZvciAoayA9IDEsIHAgPSBwb3dzKGkpOyBrIDwgYmFzZTsgKytrKSB7CiAgICAgICAgICAgICAgdCA9IHAgKiBrOwogICAgICAgICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgICAgICB6LnB1c2godCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBmb3IgKDsgaSA8IGo7ICsraSkgewogICAgICAgICAgICBmb3IgKGsgPSBiYXNlIC0gMSwgcCA9IHBvd3MoaSk7IGsgPj0gMTsgLS1rKSB7CiAgICAgICAgICAgICAgdCA9IHAgKiBrOwogICAgICAgICAgICAgIGlmICh0IDwgdSkgY29udGludWU7CiAgICAgICAgICAgICAgaWYgKHQgPiB2KSBicmVhazsKICAgICAgICAgICAgICB6LnB1c2godCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgeiA9IHRpY2tzJDIoaSwgaiwgTWF0aC5taW4oaiAtIGksIG4pKS5tYXAocG93cyk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gciA/IHoucmV2ZXJzZSgpIDogejsKICAgICAgfTsKCiAgICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7CiAgICAgICAgaWYgKHNwZWNpZmllciA9PSBudWxsKSBzcGVjaWZpZXIgPSBiYXNlID09PSAxMCA/ICIuMGUiIDogIiwiOwogICAgICAgIGlmICh0eXBlb2Ygc3BlY2lmaWVyICE9PSAiZnVuY3Rpb24iKSBzcGVjaWZpZXIgPSBmb3JtYXQkMihzcGVjaWZpZXIpOwogICAgICAgIGlmIChjb3VudCA9PT0gSW5maW5pdHkpIHJldHVybiBzcGVjaWZpZXI7CiAgICAgICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7CiAgICAgICAgdmFyIGsgPSBNYXRoLm1heCgxLCBiYXNlICogY291bnQgLyBzY2FsZS50aWNrcygpLmxlbmd0aCk7IC8vIFRPRE8gZmFzdCBlc3RpbWF0ZT8KICAgICAgICByZXR1cm4gZnVuY3Rpb24oZCkgewogICAgICAgICAgdmFyIGkgPSBkIC8gcG93cyhNYXRoLnJvdW5kKGxvZ3MoZCkpKTsKICAgICAgICAgIGlmIChpICogYmFzZSA8IGJhc2UgLSAwLjUpIGkgKj0gYmFzZTsKICAgICAgICAgIHJldHVybiBpIDw9IGsgPyBzcGVjaWZpZXIoZCkgOiAiIjsKICAgICAgICB9OwogICAgICB9OwoKICAgICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkb21haW4obmljZSQxKGRvbWFpbigpLCB7CiAgICAgICAgICBmbG9vcjogZnVuY3Rpb24oeCkgeyByZXR1cm4gcG93cyhNYXRoLmZsb29yKGxvZ3MoeCkpKTsgfSwKICAgICAgICAgIGNlaWw6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHBvd3MoTWF0aC5jZWlsKGxvZ3MoeCkpKTsgfQogICAgICAgIH0pKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gY29weSQyKHNjYWxlLCBsb2ckMygpLmJhc2UoYmFzZSkpOwogICAgICB9OwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhaXNlJDMoeCwgZXhwb25lbnQpIHsKICAgICAgcmV0dXJuIHggPCAwID8gLU1hdGgucG93KC14LCBleHBvbmVudCkgOiBNYXRoLnBvdyh4LCBleHBvbmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gcG93JDMoKSB7CiAgICAgIHZhciBleHBvbmVudCA9IDEsCiAgICAgICAgICBzY2FsZSA9IGNvbnRpbnVvdXMkMShkZWludGVycG9sYXRlLCByZWludGVycG9sYXRlKSwKICAgICAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgICAgIGZ1bmN0aW9uIGRlaW50ZXJwb2xhdGUoYSwgYikgewogICAgICAgIHJldHVybiAoYiA9IHJhaXNlJDMoYiwgZXhwb25lbnQpIC0gKGEgPSByYWlzZSQzKGEsIGV4cG9uZW50KSkpCiAgICAgICAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHJhaXNlJDMoeCwgZXhwb25lbnQpIC0gYSkgLyBiOyB9CiAgICAgICAgICAgIDogY29uc3RhbnQkcShiKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcmVpbnRlcnBvbGF0ZShhLCBiKSB7CiAgICAgICAgYiA9IHJhaXNlJDMoYiwgZXhwb25lbnQpIC0gKGEgPSByYWlzZSQzKGEsIGV4cG9uZW50KSk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsgcmV0dXJuIHJhaXNlJDMoYSArIGIgKiB0LCAxIC8gZXhwb25lbnQpOyB9OwogICAgICB9CgogICAgICBzY2FsZS5leHBvbmVudCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChleHBvbmVudCA9ICtfLCBkb21haW4oZG9tYWluKCkpKSA6IGV4cG9uZW50OwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5JDIoc2NhbGUsIHBvdyQzKCkuZXhwb25lbnQoZXhwb25lbnQpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBsaW5lYXJpc2gkMShzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3FydCQ0KCkgewogICAgICByZXR1cm4gcG93JDMoKS5leHBvbmVudCgwLjUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YW50aWxlJDIoKSB7CiAgICAgIHZhciBkb21haW4gPSBbXSwKICAgICAgICAgIHJhbmdlID0gW10sCiAgICAgICAgICB0aHJlc2hvbGRzID0gW107CgogICAgICBmdW5jdGlvbiByZXNjYWxlKCkgewogICAgICAgIHZhciBpID0gMCwgbiA9IE1hdGgubWF4KDEsIHJhbmdlLmxlbmd0aCk7CiAgICAgICAgdGhyZXNob2xkcyA9IG5ldyBBcnJheShuIC0gMSk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHRocmVzaG9sZHNbaSAtIDFdID0gdGhyZXNob2xkJDIoZG9tYWluLCBpIC8gbik7CiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgaWYgKCFpc05hTih4ID0gK3gpKSByZXR1cm4gcmFuZ2VbYmlzZWN0UmlnaHQkMih0aHJlc2hvbGRzLCB4KV07CiAgICAgIH0KCiAgICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgICAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7CiAgICAgICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXSA6IFsKICAgICAgICAgIGkgPiAwID8gdGhyZXNob2xkc1tpIC0gMV0gOiBkb21haW5bMF0sCiAgICAgICAgICBpIDwgdGhyZXNob2xkcy5sZW5ndGggPyB0aHJlc2hvbGRzW2ldIDogZG9tYWluW2RvbWFpbi5sZW5ndGggLSAxXQogICAgICAgIF07CiAgICAgIH07CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgaWYgKCFhcmd1bWVudHMubGVuZ3RoKSByZXR1cm4gZG9tYWluLnNsaWNlKCk7CiAgICAgICAgZG9tYWluID0gW107CiAgICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBfLmxlbmd0aCwgZDsgaSA8IG47ICsraSkgaWYgKGQgPSBfW2ldLCBkICE9IG51bGwgJiYgIWlzTmFOKGQgPSArZCkpIGRvbWFpbi5wdXNoKGQpOwogICAgICAgIGRvbWFpbi5zb3J0KGFzY2VuZGluZyQ5KTsKICAgICAgICByZXR1cm4gcmVzY2FsZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUucmFuZ2UgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAocmFuZ2UgPSBzbGljZSRjLmNhbGwoXyksIHJlc2NhbGUoKSkgOiByYW5nZS5zbGljZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUucXVhbnRpbGVzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRocmVzaG9sZHMuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNvcHkgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gcXVhbnRpbGUkMigpCiAgICAgICAgICAgIC5kb21haW4oZG9tYWluKQogICAgICAgICAgICAucmFuZ2UocmFuZ2UpOwogICAgICB9OwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHF1YW50aXplJDMoKSB7CiAgICAgIHZhciB4MCA9IDAsCiAgICAgICAgICB4MSA9IDEsCiAgICAgICAgICBuID0gMSwKICAgICAgICAgIGRvbWFpbiA9IFswLjVdLAogICAgICAgICAgcmFuZ2UgPSBbMCwgMV07CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlW2Jpc2VjdFJpZ2h0JDIoZG9tYWluLCB4LCAwLCBuKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgICAgdmFyIGkgPSAtMTsKICAgICAgICBkb21haW4gPSBuZXcgQXJyYXkobik7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGRvbWFpbltpXSA9ICgoaSArIDEpICogeDEgLSAoaSAtIG4pICogeDApIC8gKG4gKyAxKTsKICAgICAgICByZXR1cm4gc2NhbGU7CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCByZXNjYWxlKCkpIDogW3gwLCB4MV07CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChuID0gKHJhbmdlID0gc2xpY2UkYy5jYWxsKF8pKS5sZW5ndGggLSAxLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmludmVydEV4dGVudCA9IGZ1bmN0aW9uKHkpIHsKICAgICAgICB2YXIgaSA9IHJhbmdlLmluZGV4T2YoeSk7CiAgICAgICAgcmV0dXJuIGkgPCAwID8gW05hTiwgTmFOXQogICAgICAgICAgICA6IGkgPCAxID8gW3gwLCBkb21haW5bMF1dCiAgICAgICAgICAgIDogaSA+PSBuID8gW2RvbWFpbltuIC0gMV0sIHgxXQogICAgICAgICAgICA6IFtkb21haW5baSAtIDFdLCBkb21haW5baV1dOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBxdWFudGl6ZSQzKCkKICAgICAgICAgICAgLmRvbWFpbihbeDAsIHgxXSkKICAgICAgICAgICAgLnJhbmdlKHJhbmdlKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBsaW5lYXJpc2gkMShzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGhyZXNob2xkJDMoKSB7CiAgICAgIHZhciBkb21haW4gPSBbMC41XSwKICAgICAgICAgIHJhbmdlID0gWzAsIDFdLAogICAgICAgICAgbiA9IDE7CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgaWYgKHggPD0geCkgcmV0dXJuIHJhbmdlW2Jpc2VjdFJpZ2h0JDIoZG9tYWluLCB4LCAwLCBuKV07CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkb21haW4gPSBzbGljZSRjLmNhbGwoXyksIG4gPSBNYXRoLm1pbihkb21haW4ubGVuZ3RoLCByYW5nZS5sZW5ndGggLSAxKSwgc2NhbGUpIDogZG9tYWluLnNsaWNlKCk7CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJGMuY2FsbChfKSwgbiA9IE1hdGgubWluKGRvbWFpbi5sZW5ndGgsIHJhbmdlLmxlbmd0aCAtIDEpLCBzY2FsZSkgOiByYW5nZS5zbGljZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUuaW52ZXJ0RXh0ZW50ID0gZnVuY3Rpb24oeSkgewogICAgICAgIHZhciBpID0gcmFuZ2UuaW5kZXhPZih5KTsKICAgICAgICByZXR1cm4gW2RvbWFpbltpIC0gMV0sIGRvbWFpbltpXV07CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRocmVzaG9sZCQzKCkKICAgICAgICAgICAgLmRvbWFpbihkb21haW4pCiAgICAgICAgICAgIC5yYW5nZShyYW5nZSk7CiAgICAgIH07CgogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CgogICAgdmFyIHQwJDQgPSBuZXcgRGF0ZSwKICAgICAgICB0MSQ0ID0gbmV3IERhdGU7CgogICAgZnVuY3Rpb24gbmV3SW50ZXJ2YWwkMShmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkgewoKICAgICAgZnVuY3Rpb24gaW50ZXJ2YWwoZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgPyBuZXcgRGF0ZSA6IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7CiAgICAgIH0KCiAgICAgIGludGVydmFsLmZsb29yID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTsKICAgICAgfTsKCiAgICAgIGludGVydmFsLnJvdW5kID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHZhciBkMCA9IGludGVydmFsKGRhdGUpLAogICAgICAgICAgICBkMSA9IGludGVydmFsLmNlaWwoZGF0ZSk7CiAgICAgICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgcmV0dXJuIG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCkpLCBkYXRlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgICAgIHZhciByYW5nZSA9IFtdLCBwcmV2aW91czsKICAgICAgICBzdGFydCA9IGludGVydmFsLmNlaWwoc3RhcnQpOwogICAgICAgIHN0ZXAgPSBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKTsKICAgICAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSByZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUKICAgICAgICBkbyByYW5nZS5wdXNoKHByZXZpb3VzID0gbmV3IERhdGUoK3N0YXJ0KSksIG9mZnNldGkoc3RhcnQsIHN0ZXApLCBmbG9vcmkoc3RhcnQpOwogICAgICAgIHdoaWxlIChwcmV2aW91cyA8IHN0YXJ0ICYmIHN0YXJ0IDwgc3RvcCk7CiAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwuZmlsdGVyID0gZnVuY3Rpb24odGVzdCkgewogICAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOwogICAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHsKICAgICAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIGlmIChjb3VudCkgewogICAgICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgICAgdDAkNC5zZXRUaW1lKCtzdGFydCksIHQxJDQuc2V0VGltZSgrZW5kKTsKICAgICAgICAgIGZsb29yaSh0MCQ0KSwgZmxvb3JpKHQxJDQpOwogICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAkNCwgdDEkNCkpOwogICAgICAgIH07CgogICAgICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgewogICAgICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICAgICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbAogICAgICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbAogICAgICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkCiAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9CiAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gaW50ZXJ2YWw7CiAgICB9CgogICAgdmFyIG1pbGxpc2Vjb25kJDEgPSBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKCkgewogICAgICAvLyBub29wCiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kIC0gc3RhcnQ7CiAgICB9KTsKCiAgICAvLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCiAgICBtaWxsaXNlY29uZCQxLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogICAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgICAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7CiAgICAgIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kJDE7CiAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcihkYXRlIC8gaykgKiBrKTsKICAgICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBrKTsKICAgICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gazsKICAgICAgfSk7CiAgICB9OwoKICAgIHZhciBkdXJhdGlvblNlY29uZCQyID0gMWUzOwogICAgdmFyIGR1cmF0aW9uTWludXRlJDIgPSA2ZTQ7CiAgICB2YXIgZHVyYXRpb25Ib3VyJDIgPSAzNmU1OwogICAgdmFyIGR1cmF0aW9uRGF5JDIgPSA4NjRlNTsKICAgIHZhciBkdXJhdGlvbldlZWskMiA9IDYwNDhlNTsKCiAgICB2YXIgc2Vjb25kJDEgPSBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRUaW1lKGRhdGUgLSBkYXRlLmdldE1pbGxpc2Vjb25kcygpKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uU2Vjb25kJDIpOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uU2Vjb25kJDI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ1NlY29uZHMoKTsKICAgIH0pOwoKICAgIHZhciBtaW51dGUkMSA9IG5ld0ludGVydmFsJDEoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kJDIpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUkMik7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGUkMjsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOwogICAgfSk7CgogICAgdmFyIGhvdXIkMSA9IG5ld0ludGVydmFsJDEoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFRpbWUoZGF0ZSAtIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkgLSBkYXRlLmdldFNlY29uZHMoKSAqIGR1cmF0aW9uU2Vjb25kJDIgLSBkYXRlLmdldE1pbnV0ZXMoKSAqIGR1cmF0aW9uTWludXRlJDIpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyJDIpOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91ciQyOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOwogICAgfSk7CgogICAgdmFyIGRheSQxID0gbmV3SW50ZXJ2YWwkMShmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSQyKSAvIGR1cmF0aW9uRGF5JDI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKSAtIDE7CiAgICB9KTsKCiAgICBmdW5jdGlvbiB3ZWVrZGF5JDEoaSkgewogICAgICByZXR1cm4gbmV3SW50ZXJ2YWwkMShmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpIC0gKGRhdGUuZ2V0RGF5KCkgKyA3IC0gaSkgJSA3KTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCAqIDcpOwogICAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25NaW51dGUkMikgLyBkdXJhdGlvbldlZWskMjsKICAgICAgfSk7CiAgICB9CgogICAgdmFyIHN1bmRheSQxID0gd2Vla2RheSQxKDApOwogICAgdmFyIG1vbmRheSQxID0gd2Vla2RheSQxKDEpOwogICAgdmFyIHR1ZXNkYXkkMSA9IHdlZWtkYXkkMSgyKTsKICAgIHZhciB3ZWRuZXNkYXkkMSA9IHdlZWtkYXkkMSgzKTsKICAgIHZhciB0aHVyc2RheSQxID0gd2Vla2RheSQxKDQpOwogICAgdmFyIGZyaWRheSQxID0gd2Vla2RheSQxKDUpOwogICAgdmFyIHNhdHVyZGF5JDEgPSB3ZWVrZGF5JDEoNik7CgogICAgdmFyIG1vbnRoJDEgPSBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXREYXRlKDEpOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldE1vbnRoKGRhdGUuZ2V0TW9udGgoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kLmdldE1vbnRoKCkgLSBzdGFydC5nZXRNb250aCgpICsgKGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKSkgKiAxMjsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0TW9udGgoKTsKICAgIH0pOwoKICAgIHZhciB5ZWFyJDEgPSBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIH0pOwoKICAgIC8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KICAgIHllYXIkMS5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICAgICAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwkMShmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKSAvIGspICogayk7CiAgICAgICAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogayk7CiAgICAgIH0pOwogICAgfTsKCiAgICB2YXIgdXRjTWludXRlJDEgPSBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENTZWNvbmRzKDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUkMik7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGUkMjsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDTWludXRlcygpOwogICAgfSk7CgogICAgdmFyIHV0Y0hvdXIkMSA9IG5ld0ludGVydmFsJDEoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFVUQ01pbnV0ZXMoMCwgMCwgMCk7CiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBkdXJhdGlvbkhvdXIkMik7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25Ib3VyJDI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ0hvdXJzKCk7CiAgICB9KTsKCiAgICB2YXIgdXRjRGF5JDEgPSBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25EYXkkMjsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDRGF0ZSgpIC0gMTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHV0Y1dlZWtkYXkkMShpKSB7CiAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOwogICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7CiAgICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlayQyOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgdXRjU3VuZGF5JDEgPSB1dGNXZWVrZGF5JDEoMCk7CiAgICB2YXIgdXRjTW9uZGF5JDEgPSB1dGNXZWVrZGF5JDEoMSk7CiAgICB2YXIgdXRjVHVlc2RheSQxID0gdXRjV2Vla2RheSQxKDIpOwogICAgdmFyIHV0Y1dlZG5lc2RheSQxID0gdXRjV2Vla2RheSQxKDMpOwogICAgdmFyIHV0Y1RodXJzZGF5JDEgPSB1dGNXZWVrZGF5JDEoNCk7CiAgICB2YXIgdXRjRnJpZGF5JDEgPSB1dGNXZWVrZGF5JDEoNSk7CiAgICB2YXIgdXRjU2F0dXJkYXkkMSA9IHV0Y1dlZWtkYXkkMSg2KTsKCiAgICB2YXIgdXRjTW9udGgkMSA9IG5ld0ludGVydmFsJDEoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFVUQ0RhdGUoMSk7CiAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgIGRhdGUuc2V0VVRDTW9udGgoZGF0ZS5nZXRVVENNb250aCgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiBlbmQuZ2V0VVRDTW9udGgoKSAtIHN0YXJ0LmdldFVUQ01vbnRoKCkgKyAoZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpKSAqIDEyOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRVVENNb250aCgpOwogICAgfSk7CgogICAgdmFyIHV0Y1llYXIkMSA9IG5ld0ludGVydmFsJDEoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOwogICAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigpOwogICAgfSk7CgogICAgLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLgogICAgdXRjWWVhciQxLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogICAgICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbCQxKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC8gaykgKiBrKTsKICAgICAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOwogICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXAgKiBrKTsKICAgICAgfSk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIGxvY2FsRGF0ZSQxKGQpIHsKICAgICAgaWYgKDAgPD0gZC55ICYmIGQueSA8IDEwMCkgewogICAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoLTEsIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOwogICAgICAgIGRhdGUuc2V0RnVsbFllYXIoZC55KTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERhdGUoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKTsKICAgIH0KCiAgICBmdW5jdGlvbiB1dGNEYXRlJDEoZCkgewogICAgICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZShEYXRlLlVUQygtMSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCkpOwogICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZC55KTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERhdGUoRGF0ZS5VVEMoZC55LCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3RGF0ZSQxKHksIG0sIGQpIHsKICAgICAgcmV0dXJuIHt5OiB5LCBtOiBtLCBkOiBkLCBIOiAwLCBNOiAwLCBTOiAwLCBMOiAwfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRMb2NhbGUkNChsb2NhbGUpIHsKICAgICAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwKICAgICAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsCiAgICAgICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLAogICAgICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcywKICAgICAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLAogICAgICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLAogICAgICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsCiAgICAgICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7CgogICAgICB2YXIgcGVyaW9kUmUgPSBmb3JtYXRSZSQxKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgICAgIHBlcmlvZExvb2t1cCA9IGZvcm1hdExvb2t1cCQxKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlJDEobG9jYWxlX3dlZWtkYXlzKSwKICAgICAgICAgIHdlZWtkYXlMb29rdXAgPSBmb3JtYXRMb29rdXAkMShsb2NhbGVfd2Vla2RheXMpLAogICAgICAgICAgc2hvcnRXZWVrZGF5UmUgPSBmb3JtYXRSZSQxKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cCQxKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgICAgIG1vbnRoUmUgPSBmb3JtYXRSZSQxKGxvY2FsZV9tb250aHMpLAogICAgICAgICAgbW9udGhMb29rdXAgPSBmb3JtYXRMb29rdXAkMShsb2NhbGVfbW9udGhzKSwKICAgICAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlJDEobG9jYWxlX3Nob3J0TW9udGhzKSwKICAgICAgICAgIHNob3J0TW9udGhMb29rdXAgPSBmb3JtYXRMb29rdXAkMShsb2NhbGVfc2hvcnRNb250aHMpOwoKICAgICAgdmFyIGZvcm1hdHMgPSB7CiAgICAgICAgImEiOiBmb3JtYXRTaG9ydFdlZWtkYXksCiAgICAgICAgIkEiOiBmb3JtYXRXZWVrZGF5LAogICAgICAgICJiIjogZm9ybWF0U2hvcnRNb250aCwKICAgICAgICAiQiI6IGZvcm1hdE1vbnRoLAogICAgICAgICJjIjogbnVsbCwKICAgICAgICAiZCI6IGZvcm1hdERheU9mTW9udGgkMSwKICAgICAgICAiZSI6IGZvcm1hdERheU9mTW9udGgkMSwKICAgICAgICAiZiI6IGZvcm1hdE1pY3Jvc2Vjb25kcyQxLAogICAgICAgICJIIjogZm9ybWF0SG91cjI0JDEsCiAgICAgICAgIkkiOiBmb3JtYXRIb3VyMTIkMSwKICAgICAgICAiaiI6IGZvcm1hdERheU9mWWVhciQxLAogICAgICAgICJMIjogZm9ybWF0TWlsbGlzZWNvbmRzJDEsCiAgICAgICAgIm0iOiBmb3JtYXRNb250aE51bWJlciQxLAogICAgICAgICJNIjogZm9ybWF0TWludXRlcyQxLAogICAgICAgICJwIjogZm9ybWF0UGVyaW9kLAogICAgICAgICJxIjogZm9ybWF0UXVhcnRlciwKICAgICAgICAiUSI6IGZvcm1hdFVuaXhUaW1lc3RhbXAkMSwKICAgICAgICAicyI6IGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzJDEsCiAgICAgICAgIlMiOiBmb3JtYXRTZWNvbmRzJDEsCiAgICAgICAgInUiOiBmb3JtYXRXZWVrZGF5TnVtYmVyTW9uZGF5JDEsCiAgICAgICAgIlUiOiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5JDEsCiAgICAgICAgIlYiOiBmb3JtYXRXZWVrTnVtYmVySVNPJDEsCiAgICAgICAgInciOiBmb3JtYXRXZWVrZGF5TnVtYmVyU3VuZGF5JDEsCiAgICAgICAgIlciOiBmb3JtYXRXZWVrTnVtYmVyTW9uZGF5JDEsCiAgICAgICAgIngiOiBudWxsLAogICAgICAgICJYIjogbnVsbCwKICAgICAgICAieSI6IGZvcm1hdFllYXIkMiwKICAgICAgICAiWSI6IGZvcm1hdEZ1bGxZZWFyJDEsCiAgICAgICAgIloiOiBmb3JtYXRab25lJDEsCiAgICAgICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudCQxCiAgICAgIH07CgogICAgICB2YXIgdXRjRm9ybWF0cyA9IHsKICAgICAgICAiYSI6IGZvcm1hdFVUQ1Nob3J0V2Vla2RheSwKICAgICAgICAiQSI6IGZvcm1hdFVUQ1dlZWtkYXksCiAgICAgICAgImIiOiBmb3JtYXRVVENTaG9ydE1vbnRoLAogICAgICAgICJCIjogZm9ybWF0VVRDTW9udGgsCiAgICAgICAgImMiOiBudWxsLAogICAgICAgICJkIjogZm9ybWF0VVRDRGF5T2ZNb250aCQxLAogICAgICAgICJlIjogZm9ybWF0VVRDRGF5T2ZNb250aCQxLAogICAgICAgICJmIjogZm9ybWF0VVRDTWljcm9zZWNvbmRzJDEsCiAgICAgICAgIkgiOiBmb3JtYXRVVENIb3VyMjQkMSwKICAgICAgICAiSSI6IGZvcm1hdFVUQ0hvdXIxMiQxLAogICAgICAgICJqIjogZm9ybWF0VVRDRGF5T2ZZZWFyJDEsCiAgICAgICAgIkwiOiBmb3JtYXRVVENNaWxsaXNlY29uZHMkMSwKICAgICAgICAibSI6IGZvcm1hdFVUQ01vbnRoTnVtYmVyJDEsCiAgICAgICAgIk0iOiBmb3JtYXRVVENNaW51dGVzJDEsCiAgICAgICAgInAiOiBmb3JtYXRVVENQZXJpb2QsCiAgICAgICAgInEiOiBmb3JtYXRVVENRdWFydGVyLAogICAgICAgICJRIjogZm9ybWF0VW5peFRpbWVzdGFtcCQxLAogICAgICAgICJzIjogZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMkMSwKICAgICAgICAiUyI6IGZvcm1hdFVUQ1NlY29uZHMkMSwKICAgICAgICAidSI6IGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXJNb25kYXkkMSwKICAgICAgICAiVSI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJTdW5kYXkkMSwKICAgICAgICAiViI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJJU08kMSwKICAgICAgICAidyI6IGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXJTdW5kYXkkMSwKICAgICAgICAiVyI6IGZvcm1hdFVUQ1dlZWtOdW1iZXJNb25kYXkkMSwKICAgICAgICAieCI6IG51bGwsCiAgICAgICAgIlgiOiBudWxsLAogICAgICAgICJ5IjogZm9ybWF0VVRDWWVhciQxLAogICAgICAgICJZIjogZm9ybWF0VVRDRnVsbFllYXIkMSwKICAgICAgICAiWiI6IGZvcm1hdFVUQ1pvbmUkMSwKICAgICAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50JDEKICAgICAgfTsKCiAgICAgIHZhciBwYXJzZXMgPSB7CiAgICAgICAgImEiOiBwYXJzZVNob3J0V2Vla2RheSwKICAgICAgICAiQSI6IHBhcnNlV2Vla2RheSwKICAgICAgICAiYiI6IHBhcnNlU2hvcnRNb250aCwKICAgICAgICAiQiI6IHBhcnNlTW9udGgsCiAgICAgICAgImMiOiBwYXJzZUxvY2FsZURhdGVUaW1lLAogICAgICAgICJkIjogcGFyc2VEYXlPZk1vbnRoJDEsCiAgICAgICAgImUiOiBwYXJzZURheU9mTW9udGgkMSwKICAgICAgICAiZiI6IHBhcnNlTWljcm9zZWNvbmRzJDEsCiAgICAgICAgIkgiOiBwYXJzZUhvdXIyNCQxLAogICAgICAgICJJIjogcGFyc2VIb3VyMjQkMSwKICAgICAgICAiaiI6IHBhcnNlRGF5T2ZZZWFyJDEsCiAgICAgICAgIkwiOiBwYXJzZU1pbGxpc2Vjb25kcyQxLAogICAgICAgICJtIjogcGFyc2VNb250aE51bWJlciQxLAogICAgICAgICJNIjogcGFyc2VNaW51dGVzJDEsCiAgICAgICAgInAiOiBwYXJzZVBlcmlvZCwKICAgICAgICAicSI6IHBhcnNlUXVhcnRlciQxLAogICAgICAgICJRIjogcGFyc2VVbml4VGltZXN0YW1wJDEsCiAgICAgICAgInMiOiBwYXJzZVVuaXhUaW1lc3RhbXBTZWNvbmRzJDEsCiAgICAgICAgIlMiOiBwYXJzZVNlY29uZHMkMSwKICAgICAgICAidSI6IHBhcnNlV2Vla2RheU51bWJlck1vbmRheSQxLAogICAgICAgICJVIjogcGFyc2VXZWVrTnVtYmVyU3VuZGF5JDEsCiAgICAgICAgIlYiOiBwYXJzZVdlZWtOdW1iZXJJU08kMSwKICAgICAgICAidyI6IHBhcnNlV2Vla2RheU51bWJlclN1bmRheSQxLAogICAgICAgICJXIjogcGFyc2VXZWVrTnVtYmVyTW9uZGF5JDEsCiAgICAgICAgIngiOiBwYXJzZUxvY2FsZURhdGUsCiAgICAgICAgIlgiOiBwYXJzZUxvY2FsZVRpbWUsCiAgICAgICAgInkiOiBwYXJzZVllYXIkMSwKICAgICAgICAiWSI6IHBhcnNlRnVsbFllYXIkMSwKICAgICAgICAiWiI6IHBhcnNlWm9uZSQxLAogICAgICAgICIlIjogcGFyc2VMaXRlcmFsUGVyY2VudCQxCiAgICAgIH07CgogICAgICAvLyBUaGVzZSByZWN1cnNpdmUgZGlyZWN0aXZlIGRlZmluaXRpb25zIG11c3QgYmUgZGVmZXJyZWQuCiAgICAgIGZvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgZm9ybWF0cyk7CiAgICAgIGZvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgZm9ybWF0cyk7CiAgICAgIGZvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIGZvcm1hdHMpOwogICAgICB1dGNGb3JtYXRzLnggPSBuZXdGb3JtYXQobG9jYWxlX2RhdGUsIHV0Y0Zvcm1hdHMpOwogICAgICB1dGNGb3JtYXRzLlggPSBuZXdGb3JtYXQobG9jYWxlX3RpbWUsIHV0Y0Zvcm1hdHMpOwogICAgICB1dGNGb3JtYXRzLmMgPSBuZXdGb3JtYXQobG9jYWxlX2RhdGVUaW1lLCB1dGNGb3JtYXRzKTsKCiAgICAgIGZ1bmN0aW9uIG5ld0Zvcm1hdChzcGVjaWZpZXIsIGZvcm1hdHMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgICAgdmFyIHN0cmluZyA9IFtdLAogICAgICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgICAgICBqID0gMCwKICAgICAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCwKICAgICAgICAgICAgICBjLAogICAgICAgICAgICAgIHBhZCwKICAgICAgICAgICAgICBmb3JtYXQ7CgogICAgICAgICAgaWYgKCEoZGF0ZSBpbnN0YW5jZW9mIERhdGUpKSBkYXRlID0gbmV3IERhdGUoK2RhdGUpOwoKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICAgIGlmIChzcGVjaWZpZXIuY2hhckNvZGVBdChpKSA9PT0gMzcpIHsKICAgICAgICAgICAgICBzdHJpbmcucHVzaChzcGVjaWZpZXIuc2xpY2UoaiwgaSkpOwogICAgICAgICAgICAgIGlmICgocGFkID0gcGFkcyQxW2MgPSBzcGVjaWZpZXIuY2hhckF0KCsraSldKSAhPSBudWxsKSBjID0gc3BlY2lmaWVyLmNoYXJBdCgrK2kpOwogICAgICAgICAgICAgIGVsc2UgcGFkID0gYyA9PT0gImUiID8gIiAiIDogIjAiOwogICAgICAgICAgICAgIGlmIChmb3JtYXQgPSBmb3JtYXRzW2NdKSBjID0gZm9ybWF0KGRhdGUsIHBhZCk7CiAgICAgICAgICAgICAgc3RyaW5nLnB1c2goYyk7CiAgICAgICAgICAgICAgaiA9IGkgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgc3RyaW5nLnB1c2goc3BlY2lmaWVyLnNsaWNlKGosIGkpKTsKICAgICAgICAgIHJldHVybiBzdHJpbmcuam9pbigiIik7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gbmV3UGFyc2Uoc3BlY2lmaWVyLCBaKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0cmluZykgewogICAgICAgICAgdmFyIGQgPSBuZXdEYXRlJDEoMTkwMCwgdW5kZWZpbmVkLCAxKSwKICAgICAgICAgICAgICBpID0gcGFyc2VTcGVjaWZpZXIoZCwgc3BlY2lmaWVyLCBzdHJpbmcgKz0gIiIsIDApLAogICAgICAgICAgICAgIHdlZWssIGRheTsKICAgICAgICAgIGlmIChpICE9IHN0cmluZy5sZW5ndGgpIHJldHVybiBudWxsOwoKICAgICAgICAgIC8vIElmIGEgVU5JWCB0aW1lc3RhbXAgaXMgc3BlY2lmaWVkLCByZXR1cm4gaXQuCiAgICAgICAgICBpZiAoIlEiIGluIGQpIHJldHVybiBuZXcgRGF0ZShkLlEpOwogICAgICAgICAgaWYgKCJzIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5zICogMTAwMCArICgiTCIgaW4gZCA/IGQuTCA6IDApKTsKCiAgICAgICAgICAvLyBJZiB0aGlzIGlzIHV0Y1BhcnNlLCBuZXZlciB1c2UgdGhlIGxvY2FsIHRpbWV6b25lLgogICAgICAgICAgaWYgKFogJiYgISgiWiIgaW4gZCkpIGQuWiA9IDA7CgogICAgICAgICAgLy8gVGhlIGFtLXBtIGZsYWcgaXMgMCBmb3IgQU0sIGFuZCAxIGZvciBQTS4KICAgICAgICAgIGlmICgicCIgaW4gZCkgZC5IID0gZC5IICUgMTIgKyBkLnAgKiAxMjsKCiAgICAgICAgICAvLyBJZiB0aGUgbW9udGggd2FzIG5vdCBzcGVjaWZpZWQsIGluaGVyaXQgZnJvbSB0aGUgcXVhcnRlci4KICAgICAgICAgIGlmIChkLm0gPT09IHVuZGVmaW5lZCkgZC5tID0gInEiIGluIGQgPyBkLnEgOiAwOwoKICAgICAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci4KICAgICAgICAgIGlmICgiViIgaW4gZCkgewogICAgICAgICAgICBpZiAoZC5WIDwgMSB8fCBkLlYgPiA1MykgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGlmICghKCJ3IiBpbiBkKSkgZC53ID0gMTsKICAgICAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICAgICAgd2VlayA9IHV0Y0RhdGUkMShuZXdEYXRlJDEoZC55LCAwLCAxKSksIGRheSA9IHdlZWsuZ2V0VVRDRGF5KCk7CiAgICAgICAgICAgICAgd2VlayA9IGRheSA+IDQgfHwgZGF5ID09PSAwID8gdXRjTW9uZGF5JDEuY2VpbCh3ZWVrKSA6IHV0Y01vbmRheSQxKHdlZWspOwogICAgICAgICAgICAgIHdlZWsgPSB1dGNEYXkkMS5vZmZzZXQod2VlaywgKGQuViAtIDEpICogNyk7CiAgICAgICAgICAgICAgZC55ID0gd2Vlay5nZXRVVENGdWxsWWVhcigpOwogICAgICAgICAgICAgIGQubSA9IHdlZWsuZ2V0VVRDTW9udGgoKTsKICAgICAgICAgICAgICBkLmQgPSB3ZWVrLmdldFVUQ0RhdGUoKSArIChkLncgKyA2KSAlIDc7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgd2VlayA9IGxvY2FsRGF0ZSQxKG5ld0RhdGUkMShkLnksIDAsIDEpKSwgZGF5ID0gd2Vlay5nZXREYXkoKTsKICAgICAgICAgICAgICB3ZWVrID0gZGF5ID4gNCB8fCBkYXkgPT09IDAgPyBtb25kYXkkMS5jZWlsKHdlZWspIDogbW9uZGF5JDEod2Vlayk7CiAgICAgICAgICAgICAgd2VlayA9IGRheSQxLm9mZnNldCh3ZWVrLCAoZC5WIC0gMSkgKiA3KTsKICAgICAgICAgICAgICBkLnkgPSB3ZWVrLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgICAgICAgZC5tID0gd2Vlay5nZXRNb250aCgpOwogICAgICAgICAgICAgIGQuZCA9IHdlZWsuZ2V0RGF0ZSgpICsgKGQudyArIDYpICUgNzsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmICgiVyIgaW4gZCB8fCAiVSIgaW4gZCkgewogICAgICAgICAgICBpZiAoISgidyIgaW4gZCkpIGQudyA9ICJ1IiBpbiBkID8gZC51ICUgNyA6ICJXIiBpbiBkID8gMSA6IDA7CiAgICAgICAgICAgIGRheSA9ICJaIiBpbiBkID8gdXRjRGF0ZSQxKG5ld0RhdGUkMShkLnksIDAsIDEpKS5nZXRVVENEYXkoKSA6IGxvY2FsRGF0ZSQxKG5ld0RhdGUkMShkLnksIDAsIDEpKS5nZXREYXkoKTsKICAgICAgICAgICAgZC5tID0gMDsKICAgICAgICAgICAgZC5kID0gIlciIGluIGQgPyAoZC53ICsgNikgJSA3ICsgZC5XICogNyAtIChkYXkgKyA1KSAlIDcgOiBkLncgKyBkLlUgKiA3IC0gKGRheSArIDYpICUgNzsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBJZiBhIHRpbWUgem9uZSBpcyBzcGVjaWZpZWQsIGFsbCBmaWVsZHMgYXJlIGludGVycHJldGVkIGFzIFVUQyBhbmQgdGhlbgogICAgICAgICAgLy8gb2Zmc2V0IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHRpbWUgem9uZS4KICAgICAgICAgIGlmICgiWiIgaW4gZCkgewogICAgICAgICAgICBkLkggKz0gZC5aIC8gMTAwIHwgMDsKICAgICAgICAgICAgZC5NICs9IGQuWiAlIDEwMDsKICAgICAgICAgICAgcmV0dXJuIHV0Y0RhdGUkMShkKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBPdGhlcndpc2UsIGFsbCBmaWVsZHMgYXJlIGluIGxvY2FsIHRpbWUuCiAgICAgICAgICByZXR1cm4gbG9jYWxEYXRlJDEoZCk7CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VTcGVjaWZpZXIoZCwgc3BlY2lmaWVyLCBzdHJpbmcsIGopIHsKICAgICAgICB2YXIgaSA9IDAsCiAgICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLAogICAgICAgICAgICBtID0gc3RyaW5nLmxlbmd0aCwKICAgICAgICAgICAgYywKICAgICAgICAgICAgcGFyc2U7CgogICAgICAgIHdoaWxlIChpIDwgbikgewogICAgICAgICAgaWYgKGogPj0gbSkgcmV0dXJuIC0xOwogICAgICAgICAgYyA9IHNwZWNpZmllci5jaGFyQ29kZUF0KGkrKyk7CiAgICAgICAgICBpZiAoYyA9PT0gMzcpIHsKICAgICAgICAgICAgYyA9IHNwZWNpZmllci5jaGFyQXQoaSsrKTsKICAgICAgICAgICAgcGFyc2UgPSBwYXJzZXNbYyBpbiBwYWRzJDEgPyBzcGVjaWZpZXIuY2hhckF0KGkrKykgOiBjXTsKICAgICAgICAgICAgaWYgKCFwYXJzZSB8fCAoKGogPSBwYXJzZShkLCBzdHJpbmcsIGopKSA8IDApKSByZXR1cm4gLTE7CiAgICAgICAgICB9IGVsc2UgaWYgKGMgIT0gc3RyaW5nLmNoYXJDb2RlQXQoaisrKSkgewogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gajsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VQZXJpb2QoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgdmFyIG4gPSBwZXJpb2RSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgICAgcmV0dXJuIG4gPyAoZC5wID0gcGVyaW9kTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VTaG9ydFdlZWtkYXkoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgdmFyIG4gPSBzaG9ydFdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgICAgcmV0dXJuIG4gPyAoZC53ID0gc2hvcnRXZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgICAgIHZhciBuID0gd2Vla2RheVJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgICByZXR1cm4gbiA/IChkLncgPSB3ZWVrZGF5TG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VTaG9ydE1vbnRoKGQsIHN0cmluZywgaSkgewogICAgICAgIHZhciBuID0gc2hvcnRNb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgICByZXR1cm4gbiA/IChkLm0gPSBzaG9ydE1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VNb250aChkLCBzdHJpbmcsIGkpIHsKICAgICAgICB2YXIgbiA9IG1vbnRoUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICAgIHJldHVybiBuID8gKGQubSA9IG1vbnRoTG9va3VwW25bMF0udG9Mb3dlckNhc2UoKV0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlVGltZShkLCBzdHJpbmcsIGkpIHsKICAgICAgICByZXR1cm4gcGFyc2VTcGVjaWZpZXIoZCwgbG9jYWxlX2RhdGVUaW1lLCBzdHJpbmcsIGkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZUxvY2FsZURhdGUoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlLCBzdHJpbmcsIGkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBwYXJzZUxvY2FsZVRpbWUoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV90aW1lLCBzdHJpbmcsIGkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRTaG9ydFdlZWtkYXkoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRXZWVrZGF5c1tkLmdldERheSgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0V2Vla2RheShkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV93ZWVrZGF5c1tkLmdldERheSgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0U2hvcnRNb250aChkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9zaG9ydE1vbnRoc1tkLmdldE1vbnRoKCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRNb250aChkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9tb250aHNbZC5nZXRNb250aCgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0UGVyaW9kKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3BlcmlvZHNbKyhkLmdldEhvdXJzKCkgPj0gMTIpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0UXVhcnRlcihkKSB7CiAgICAgICAgcmV0dXJuIDEgKyB+fihkLmdldE1vbnRoKCkgLyAzKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0VVRDU2hvcnRXZWVrZGF5KGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXRVVENEYXkoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXkoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXRVVENEYXkoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0TW9udGgoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRVVENNb250aCgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0VVRDTW9udGgoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0VVRDTW9udGgoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1BlcmlvZChkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRVVENIb3VycygpID49IDEyKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1F1YXJ0ZXIoZCkgewogICAgICAgIHJldHVybiAxICsgfn4oZC5nZXRVVENNb250aCgpIC8gMyk7CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZm9ybWF0OiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgICAgIHZhciBmID0gbmV3Rm9ybWF0KHNwZWNpZmllciArPSAiIiwgZm9ybWF0cyk7CiAgICAgICAgICBmLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgICAgICByZXR1cm4gZjsKICAgICAgICB9LAogICAgICAgIHBhcnNlOiBmdW5jdGlvbihzcGVjaWZpZXIpIHsKICAgICAgICAgIHZhciBwID0gbmV3UGFyc2Uoc3BlY2lmaWVyICs9ICIiLCBmYWxzZSk7CiAgICAgICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9LAogICAgICAgIHV0Y0Zvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIHV0Y0Zvcm1hdHMpOwogICAgICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9OwogICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgfSwKICAgICAgICB1dGNQYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciArPSAiIiwgdHJ1ZSk7CiAgICAgICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgdmFyIHBhZHMkMSA9IHsiLSI6ICIiLCAiXyI6ICIgIiwgIjAiOiAiMCJ9LAogICAgICAgIG51bWJlclJlJDEgPSAvXlxzKlxkKy8sIC8vIG5vdGU6IGlnbm9yZXMgbmV4dCBkaXJlY3RpdmUKICAgICAgICBwZXJjZW50UmUkMSA9IC9eJS8sCiAgICAgICAgcmVxdW90ZVJlJDEgPSAvW1xcXiQqKz98W1xdKCkue31dL2c7CgogICAgZnVuY3Rpb24gcGFkJDIodmFsdWUsIGZpbGwsIHdpZHRoKSB7CiAgICAgIHZhciBzaWduID0gdmFsdWUgPCAwID8gIi0iIDogIiIsCiAgICAgICAgICBzdHJpbmcgPSAoc2lnbiA/IC12YWx1ZSA6IHZhbHVlKSArICIiLAogICAgICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgICAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXF1b3RlJDEocykgewogICAgICByZXR1cm4gcy5yZXBsYWNlKHJlcXVvdGVSZSQxLCAiXFwkJiIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFJlJDEobmFtZXMpIHsKICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUkMSkuam9pbigifCIpICsgIikiLCAiaSIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdExvb2t1cCQxKG5hbWVzKSB7CiAgICAgIHZhciBtYXAgPSB7fSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgbWFwW25hbWVzW2ldLnRvTG93ZXJDYXNlKCldID0gaTsKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXJTdW5kYXkkMShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQxLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7CiAgICAgIHJldHVybiBuID8gKGQudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5JDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgICByZXR1cm4gbiA/IChkLnUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheSQxKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDEuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5VID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJJU08kMShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQxLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICAgIHJldHVybiBuID8gKGQuViA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVyTW9uZGF5JDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLlcgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRnVsbFllYXIkMShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQxLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA0KSk7CiAgICAgIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VZZWFyJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLnkgPSArblswXSArICgrblswXSA+IDY4ID8gMTkwMCA6IDIwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2Vab25lJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gL14oWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8vLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7CiAgICAgIHJldHVybiBuID8gKGQuWiA9IG5bMV0gPyAwIDogLShuWzJdICsgKG5bM10gfHwgIjAwIikpLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VRdWFydGVyJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgICByZXR1cm4gbiA/IChkLnEgPSBuWzBdICogMyAtIDMsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU1vbnRoTnVtYmVyJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLm0gPSBuWzBdIC0gMSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRGF5T2ZNb250aCQxKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDEuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZURheU9mWWVhciQxKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDEuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5tID0gMCwgZC5kID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZUhvdXIyNCQxKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDEuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5IID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU1pbnV0ZXMkMShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQxLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICAgIHJldHVybiBuID8gKGQuTSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VTZWNvbmRzJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLlMgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlTWlsbGlzZWNvbmRzJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMykpOwogICAgICByZXR1cm4gbiA/IChkLkwgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlTWljcm9zZWNvbmRzJDEoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgNikpOwogICAgICByZXR1cm4gbiA/IChkLkwgPSBNYXRoLmZsb29yKG5bMF0gLyAxMDAwKSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlTGl0ZXJhbFBlcmNlbnQkMShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBwZXJjZW50UmUkMS5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgICByZXR1cm4gbiA/IGkgKyBuWzBdLmxlbmd0aCA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcCQxKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDEuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICByZXR1cm4gbiA/IChkLlEgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVW5peFRpbWVzdGFtcFNlY29uZHMkMShkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQxLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5zID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXREYXlPZk1vbnRoJDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoZC5nZXREYXRlKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEhvdXIyNCQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0SG91cnMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0SG91cjEyJDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoZC5nZXRIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdERheU9mWWVhciQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKDEgKyBkYXkkMS5jb3VudCh5ZWFyJDEoZCksIGQpLCBwLCAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRNaWxsaXNlY29uZHMkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMihkLmdldE1pbGxpc2Vjb25kcygpLCBwLCAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRNaWNyb3NlY29uZHMkMShkLCBwKSB7CiAgICAgIHJldHVybiBmb3JtYXRNaWxsaXNlY29uZHMkMShkLCBwKSArICIwMDAiOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE1vbnRoTnVtYmVyJDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoZC5nZXRNb250aCgpICsgMSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TWludXRlcyQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0TWludXRlcygpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRTZWNvbmRzJDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoZC5nZXRTZWNvbmRzKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXkkMShkKSB7CiAgICAgIHZhciBkYXkgPSBkLmdldERheSgpOwogICAgICByZXR1cm4gZGF5ID09PSAwID8gNyA6IGRheTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRXZWVrTnVtYmVyU3VuZGF5JDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoc3VuZGF5JDEuY291bnQoeWVhciQxKGQpIC0gMSwgZCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJJU08kMShkLCBwKSB7CiAgICAgIHZhciBkYXkgPSBkLmdldERheSgpOwogICAgICBkID0gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB0aHVyc2RheSQxKGQpIDogdGh1cnNkYXkkMS5jZWlsKGQpOwogICAgICByZXR1cm4gcGFkJDIodGh1cnNkYXkkMS5jb3VudCh5ZWFyJDEoZCksIGQpICsgKHllYXIkMShkKS5nZXREYXkoKSA9PT0gNCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkkMShkKSB7CiAgICAgIHJldHVybiBkLmdldERheSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJNb25kYXkkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMihtb25kYXkkMS5jb3VudCh5ZWFyJDEoZCkgLSAxLCBkKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0WWVhciQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0RnVsbFllYXIoKSAlIDEwMCwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0RnVsbFllYXIkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMihkLmdldEZ1bGxZZWFyKCkgJSAxMDAwMCwgcCwgNCk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0Wm9uZSQxKGQpIHsKICAgICAgdmFyIHogPSBkLmdldFRpbWV6b25lT2Zmc2V0KCk7CiAgICAgIHJldHVybiAoeiA+IDAgPyAiLSIgOiAoeiAqPSAtMSwgIisiKSkKICAgICAgICAgICsgcGFkJDIoeiAvIDYwIHwgMCwgIjAiLCAyKQogICAgICAgICAgKyBwYWQkMih6ICUgNjAsICIwIiwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDRGF5T2ZNb250aCQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0VVRDRGF0ZSgpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENIb3VyMjQkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMihkLmdldFVUQ0hvdXJzKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIxMiQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0VVRDSG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENEYXlPZlllYXIkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMigxICsgdXRjRGF5JDEuY291bnQodXRjWWVhciQxKGQpLCBkKSwgcCwgMyk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDTWlsbGlzZWNvbmRzJDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoZC5nZXRVVENNaWxsaXNlY29uZHMoKSwgcCwgMyk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDTWljcm9zZWNvbmRzJDEoZCwgcCkgewogICAgICByZXR1cm4gZm9ybWF0VVRDTWlsbGlzZWNvbmRzJDEoZCwgcCkgKyAiMDAwIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENNb250aE51bWJlciQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0VVRDTW9udGgoKSArIDEsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ01pbnV0ZXMkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMihkLmdldFVUQ01pbnV0ZXMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDU2Vjb25kcyQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKGQuZ2V0VVRDU2Vjb25kcygpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5JDEoZCkgewogICAgICB2YXIgZG93ID0gZC5nZXRVVENEYXkoKTsKICAgICAgcmV0dXJuIGRvdyA9PT0gMCA/IDcgOiBkb3c7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlclN1bmRheSQxKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQyKHV0Y1N1bmRheSQxLmNvdW50KHV0Y1llYXIkMShkKSAtIDEsIGQpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVySVNPJDEoZCwgcCkgewogICAgICB2YXIgZGF5ID0gZC5nZXRVVENEYXkoKTsKICAgICAgZCA9IChkYXkgPj0gNCB8fCBkYXkgPT09IDApID8gdXRjVGh1cnNkYXkkMShkKSA6IHV0Y1RodXJzZGF5JDEuY2VpbChkKTsKICAgICAgcmV0dXJuIHBhZCQyKHV0Y1RodXJzZGF5JDEuY291bnQodXRjWWVhciQxKGQpLCBkKSArICh1dGNZZWFyJDEoZCkuZ2V0VVRDRGF5KCkgPT09IDQpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyU3VuZGF5JDEoZCkgewogICAgICByZXR1cm4gZC5nZXRVVENEYXkoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5JDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIodXRjTW9uZGF5JDEuY291bnQodXRjWWVhciQxKGQpIC0gMSwgZCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1llYXIkMShkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMihkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyJDEoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDIoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1pvbmUkMSgpIHsKICAgICAgcmV0dXJuICIrMDAwMCI7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQkMSgpIHsKICAgICAgcmV0dXJuICIlIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wJDEoZCkgewogICAgICByZXR1cm4gK2Q7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMkMShkKSB7CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCtkIC8gMTAwMCk7CiAgICB9CgogICAgdmFyIGxvY2FsZSQ0OwogICAgdmFyIHRpbWVGb3JtYXQkMTsKICAgIHZhciB0aW1lUGFyc2UkMTsKICAgIHZhciB1dGNGb3JtYXQkMTsKICAgIHZhciB1dGNQYXJzZSQxOwoKICAgIGRlZmF1bHRMb2NhbGUkNCh7CiAgICAgIGRhdGVUaW1lOiAiJXgsICVYIiwKICAgICAgZGF0ZTogIiUtbS8lLWQvJVkiLAogICAgICB0aW1lOiAiJS1JOiVNOiVTICVwIiwKICAgICAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogICAgICBkYXlzOiBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sCiAgICAgIHNob3J0RGF5czogWyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwKICAgICAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICAgICAgc2hvcnRNb250aHM6IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXQogICAgfSk7CgogICAgZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQ0KGRlZmluaXRpb24pIHsKICAgICAgbG9jYWxlJDQgPSBmb3JtYXRMb2NhbGUkNChkZWZpbml0aW9uKTsKICAgICAgdGltZUZvcm1hdCQxID0gbG9jYWxlJDQuZm9ybWF0OwogICAgICB0aW1lUGFyc2UkMSA9IGxvY2FsZSQ0LnBhcnNlOwogICAgICB1dGNGb3JtYXQkMSA9IGxvY2FsZSQ0LnV0Y0Zvcm1hdDsKICAgICAgdXRjUGFyc2UkMSA9IGxvY2FsZSQ0LnV0Y1BhcnNlOwogICAgICByZXR1cm4gbG9jYWxlJDQ7CiAgICB9CgogICAgdmFyIGR1cmF0aW9uU2Vjb25kJDMgPSAxMDAwLAogICAgICAgIGR1cmF0aW9uTWludXRlJDMgPSBkdXJhdGlvblNlY29uZCQzICogNjAsCiAgICAgICAgZHVyYXRpb25Ib3VyJDMgPSBkdXJhdGlvbk1pbnV0ZSQzICogNjAsCiAgICAgICAgZHVyYXRpb25EYXkkMyA9IGR1cmF0aW9uSG91ciQzICogMjQsCiAgICAgICAgZHVyYXRpb25XZWVrJDMgPSBkdXJhdGlvbkRheSQzICogNywKICAgICAgICBkdXJhdGlvbk1vbnRoJDEgPSBkdXJhdGlvbkRheSQzICogMzAsCiAgICAgICAgZHVyYXRpb25ZZWFyJDEgPSBkdXJhdGlvbkRheSQzICogMzY1OwoKICAgIGZ1bmN0aW9uIGRhdGUkNSh0KSB7CiAgICAgIHJldHVybiBuZXcgRGF0ZSh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBudW1iZXIkOSh0KSB7CiAgICAgIHJldHVybiB0IGluc3RhbmNlb2YgRGF0ZSA/ICt0IDogK25ldyBEYXRlKCt0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYWxlbmRhciQxKHllYXIsIG1vbnRoLCB3ZWVrLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBtaWxsaXNlY29uZCwgZm9ybWF0KSB7CiAgICAgIHZhciBzY2FsZSA9IGNvbnRpbnVvdXMkMShkZWludGVycG9sYXRlTGluZWFyLCByZWludGVycG9sYXRlKSwKICAgICAgICAgIGludmVydCA9IHNjYWxlLmludmVydCwKICAgICAgICAgIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgICAgIHZhciBmb3JtYXRNaWxsaXNlY29uZCA9IGZvcm1hdCgiLiVMIiksCiAgICAgICAgICBmb3JtYXRTZWNvbmQgPSBmb3JtYXQoIjolUyIpLAogICAgICAgICAgZm9ybWF0TWludXRlID0gZm9ybWF0KCIlSTolTSIpLAogICAgICAgICAgZm9ybWF0SG91ciA9IGZvcm1hdCgiJUkgJXAiKSwKICAgICAgICAgIGZvcm1hdERheSA9IGZvcm1hdCgiJWEgJWQiKSwKICAgICAgICAgIGZvcm1hdFdlZWsgPSBmb3JtYXQoIiViICVkIiksCiAgICAgICAgICBmb3JtYXRNb250aCA9IGZvcm1hdCgiJUIiKSwKICAgICAgICAgIGZvcm1hdFllYXIgPSBmb3JtYXQoIiVZIik7CgogICAgICB2YXIgdGlja0ludGVydmFscyA9IFsKICAgICAgICBbc2Vjb25kLCAgMSwgICAgICBkdXJhdGlvblNlY29uZCQzXSwKICAgICAgICBbc2Vjb25kLCAgNSwgIDUgKiBkdXJhdGlvblNlY29uZCQzXSwKICAgICAgICBbc2Vjb25kLCAxNSwgMTUgKiBkdXJhdGlvblNlY29uZCQzXSwKICAgICAgICBbc2Vjb25kLCAzMCwgMzAgKiBkdXJhdGlvblNlY29uZCQzXSwKICAgICAgICBbbWludXRlLCAgMSwgICAgICBkdXJhdGlvbk1pbnV0ZSQzXSwKICAgICAgICBbbWludXRlLCAgNSwgIDUgKiBkdXJhdGlvbk1pbnV0ZSQzXSwKICAgICAgICBbbWludXRlLCAxNSwgMTUgKiBkdXJhdGlvbk1pbnV0ZSQzXSwKICAgICAgICBbbWludXRlLCAzMCwgMzAgKiBkdXJhdGlvbk1pbnV0ZSQzXSwKICAgICAgICBbICBob3VyLCAgMSwgICAgICBkdXJhdGlvbkhvdXIkMyAgXSwKICAgICAgICBbICBob3VyLCAgMywgIDMgKiBkdXJhdGlvbkhvdXIkMyAgXSwKICAgICAgICBbICBob3VyLCAgNiwgIDYgKiBkdXJhdGlvbkhvdXIkMyAgXSwKICAgICAgICBbICBob3VyLCAxMiwgMTIgKiBkdXJhdGlvbkhvdXIkMyAgXSwKICAgICAgICBbICAgZGF5LCAgMSwgICAgICBkdXJhdGlvbkRheSQzICAgXSwKICAgICAgICBbICAgZGF5LCAgMiwgIDIgKiBkdXJhdGlvbkRheSQzICAgXSwKICAgICAgICBbICB3ZWVrLCAgMSwgICAgICBkdXJhdGlvbldlZWskMyAgXSwKICAgICAgICBbIG1vbnRoLCAgMSwgICAgICBkdXJhdGlvbk1vbnRoJDEgXSwKICAgICAgICBbIG1vbnRoLCAgMywgIDMgKiBkdXJhdGlvbk1vbnRoJDEgXSwKICAgICAgICBbICB5ZWFyLCAgMSwgICAgICBkdXJhdGlvblllYXIkMSAgXQogICAgICBdOwoKICAgICAgZnVuY3Rpb24gdGlja0Zvcm1hdChkYXRlKSB7CiAgICAgICAgcmV0dXJuIChzZWNvbmQoZGF0ZSkgPCBkYXRlID8gZm9ybWF0TWlsbGlzZWNvbmQKICAgICAgICAgICAgOiBtaW51dGUoZGF0ZSkgPCBkYXRlID8gZm9ybWF0U2Vjb25kCiAgICAgICAgICAgIDogaG91cihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNaW51dGUKICAgICAgICAgICAgOiBkYXkoZGF0ZSkgPCBkYXRlID8gZm9ybWF0SG91cgogICAgICAgICAgICA6IG1vbnRoKGRhdGUpIDwgZGF0ZSA/ICh3ZWVrKGRhdGUpIDwgZGF0ZSA/IGZvcm1hdERheSA6IGZvcm1hdFdlZWspCiAgICAgICAgICAgIDogeWVhcihkYXRlKSA8IGRhdGUgPyBmb3JtYXRNb250aAogICAgICAgICAgICA6IGZvcm1hdFllYXIpKGRhdGUpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0aWNrSW50ZXJ2YWwoaW50ZXJ2YWwsIHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICAgICAgaWYgKGludGVydmFsID09IG51bGwpIGludGVydmFsID0gMTA7CgogICAgICAgIC8vIElmIGEgZGVzaXJlZCB0aWNrIGNvdW50IGlzIHNwZWNpZmllZCwgcGljayBhIHJlYXNvbmFibGUgdGljayBpbnRlcnZhbAogICAgICAgIC8vIGJhc2VkIG9uIHRoZSBleHRlbnQgb2YgdGhlIGRvbWFpbiBhbmQgYSByb3VnaCBlc3RpbWF0ZSBvZiB0aWNrIHNpemUuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgaW50ZXJ2YWwgaXMgYWxyZWFkeSBhIHRpbWUgaW50ZXJ2YWwgYW5kIHVzZSBpdC4KICAgICAgICBpZiAodHlwZW9mIGludGVydmFsID09PSAibnVtYmVyIikgewogICAgICAgICAgdmFyIHRhcmdldCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBpbnRlcnZhbCwKICAgICAgICAgICAgICBpID0gYmlzZWN0b3IkNChmdW5jdGlvbihpKSB7IHJldHVybiBpWzJdOyB9KS5yaWdodCh0aWNrSW50ZXJ2YWxzLCB0YXJnZXQpOwogICAgICAgICAgaWYgKGkgPT09IHRpY2tJbnRlcnZhbHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0ZXAgPSB0aWNrU3RlcCQyKHN0YXJ0IC8gZHVyYXRpb25ZZWFyJDEsIHN0b3AgLyBkdXJhdGlvblllYXIkMSwgaW50ZXJ2YWwpOwogICAgICAgICAgICBpbnRlcnZhbCA9IHllYXI7CiAgICAgICAgICB9IGVsc2UgaWYgKGkpIHsKICAgICAgICAgICAgaSA9IHRpY2tJbnRlcnZhbHNbdGFyZ2V0IC8gdGlja0ludGVydmFsc1tpIC0gMV1bMl0gPCB0aWNrSW50ZXJ2YWxzW2ldWzJdIC8gdGFyZ2V0ID8gaSAtIDEgOiBpXTsKICAgICAgICAgICAgc3RlcCA9IGlbMV07CiAgICAgICAgICAgIGludGVydmFsID0gaVswXTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHN0ZXAgPSBNYXRoLm1heCh0aWNrU3RlcCQyKHN0YXJ0LCBzdG9wLCBpbnRlcnZhbCksIDEpOwogICAgICAgICAgICBpbnRlcnZhbCA9IG1pbGxpc2Vjb25kOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHN0ZXAgPT0gbnVsbCA/IGludGVydmFsIDogaW50ZXJ2YWwuZXZlcnkoc3RlcCk7CiAgICAgIH0KCiAgICAgIHNjYWxlLmludmVydCA9IGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4gbmV3IERhdGUoaW52ZXJ0KHkpKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGRvbWFpbihtYXAkOC5jYWxsKF8sIG51bWJlciQ5KSkgOiBkb21haW4oKS5tYXAoZGF0ZSQ1KTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oaW50ZXJ2YWwsIHN0ZXApIHsKICAgICAgICB2YXIgZCA9IGRvbWFpbigpLAogICAgICAgICAgICB0MCA9IGRbMF0sCiAgICAgICAgICAgIHQxID0gZFtkLmxlbmd0aCAtIDFdLAogICAgICAgICAgICByID0gdDEgPCB0MCwKICAgICAgICAgICAgdDsKICAgICAgICBpZiAocikgdCA9IHQwLCB0MCA9IHQxLCB0MSA9IHQ7CiAgICAgICAgdCA9IHRpY2tJbnRlcnZhbChpbnRlcnZhbCwgdDAsIHQxLCBzdGVwKTsKICAgICAgICB0ID0gdCA/IHQucmFuZ2UodDAsIHQxICsgMSkgOiBbXTsgLy8gaW5jbHVzaXZlIHN0b3AKICAgICAgICByZXR1cm4gciA/IHQucmV2ZXJzZSgpIDogdDsKICAgICAgfTsKCiAgICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7CiAgICAgICAgcmV0dXJuIHNwZWNpZmllciA9PSBudWxsID8gdGlja0Zvcm1hdCA6IGZvcm1hdChzcGVjaWZpZXIpOwogICAgICB9OwoKICAgICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGludGVydmFsLCBzdGVwKSB7CiAgICAgICAgdmFyIGQgPSBkb21haW4oKTsKICAgICAgICByZXR1cm4gKGludGVydmFsID0gdGlja0ludGVydmFsKGludGVydmFsLCBkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIHN0ZXApKQogICAgICAgICAgICA/IGRvbWFpbihuaWNlJDEoZCwgaW50ZXJ2YWwpKQogICAgICAgICAgICA6IHNjYWxlOwogICAgICB9OwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5JDIoc2NhbGUsIGNhbGVuZGFyJDEoeWVhciwgbW9udGgsIHdlZWssIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIG1pbGxpc2Vjb25kLCBmb3JtYXQpKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBzY2FsZTsKICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lJDEoKSB7CiAgICAgIHJldHVybiBjYWxlbmRhciQxKHllYXIkMSwgbW9udGgkMSwgc3VuZGF5JDEsIGRheSQxLCBob3VyJDEsIG1pbnV0ZSQxLCBzZWNvbmQkMSwgbWlsbGlzZWNvbmQkMSwgdGltZUZvcm1hdCQxKS5kb21haW4oW25ldyBEYXRlKDIwMDAsIDAsIDEpLCBuZXcgRGF0ZSgyMDAwLCAwLCAyKV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHV0Y1RpbWUkMSgpIHsKICAgICAgcmV0dXJuIGNhbGVuZGFyJDEodXRjWWVhciQxLCB1dGNNb250aCQxLCB1dGNTdW5kYXkkMSwgdXRjRGF5JDEsIHV0Y0hvdXIkMSwgdXRjTWludXRlJDEsIHNlY29uZCQxLCBtaWxsaXNlY29uZCQxLCB1dGNGb3JtYXQkMSkuZG9tYWluKFtEYXRlLlVUQygyMDAwLCAwLCAxKSwgRGF0ZS5VVEMoMjAwMCwgMCwgMildKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvcnMkMShzKSB7CiAgICAgIHJldHVybiBzLm1hdGNoKC8uezZ9L2cpLm1hcChmdW5jdGlvbih4KSB7CiAgICAgICAgcmV0dXJuICIjIiArIHg7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBjYXRlZ29yeTEwJDEgPSBjb2xvcnMkMSgiMWY3N2I0ZmY3ZjBlMmNhMDJjZDYyNzI4OTQ2N2JkOGM1NjRiZTM3N2MyN2Y3ZjdmYmNiZDIyMTdiZWNmIik7CgogICAgdmFyIGNhdGVnb3J5MjBiID0gY29sb3JzJDEoIjM5M2I3OTUyNTRhMzZiNmVjZjljOWVkZTYzNzkzOThjYTI1MmI1Y2Y2YmNlZGI5YzhjNmQzMWJkOWUzOWU3YmE1MmU3Y2I5NDg0M2MzOWFkNDk0YWQ2NjE2YmU3OTY5YzdiNDE3M2E1NTE5NGNlNmRiZGRlOWVkNiIpOwoKICAgIHZhciBjYXRlZ29yeTIwYyA9IGNvbG9ycyQxKCIzMTgyYmQ2YmFlZDY5ZWNhZTFjNmRiZWZlNjU1MGRmZDhkM2NmZGFlNmJmZGQwYTIzMWEzNTQ3NGM0NzZhMWQ5OWJjN2U5YzA3NTZiYjE5ZTlhYzhiY2JkZGNkYWRhZWI2MzYzNjM5Njk2OTZiZGJkYmRkOWQ5ZDkiKTsKCiAgICB2YXIgY2F0ZWdvcnkyMCA9IGNvbG9ycyQxKCIxZjc3YjRhZWM3ZThmZjdmMGVmZmJiNzgyY2EwMmM5OGRmOGFkNjI3MjhmZjk4OTY5NDY3YmRjNWIwZDU4YzU2NGJjNDljOTRlMzc3YzJmN2I2ZDI3ZjdmN2ZjN2M3YzdiY2JkMjJkYmRiOGQxN2JlY2Y5ZWRhZTUiKTsKCiAgICB2YXIgY3ViZWhlbGl4JGEgPSBjdWJlaGVsaXhMb25nJDIoY3ViZWhlbGl4JDgoMzAwLCAwLjUsIDAuMCksIGN1YmVoZWxpeCQ4KC0yNDAsIDAuNSwgMS4wKSk7CgogICAgdmFyIHdhcm0kMSA9IGN1YmVoZWxpeExvbmckMihjdWJlaGVsaXgkOCgtMTAwLCAwLjc1LCAwLjM1KSwgY3ViZWhlbGl4JDgoODAsIDEuNTAsIDAuOCkpOwoKICAgIHZhciBjb29sJDEgPSBjdWJlaGVsaXhMb25nJDIoY3ViZWhlbGl4JDgoMjYwLCAwLjc1LCAwLjM1KSwgY3ViZWhlbGl4JDgoODAsIDEuNTAsIDAuOCkpOwoKICAgIHZhciByYWluYm93JDEgPSBjdWJlaGVsaXgkOCgpOwoKICAgIGZ1bmN0aW9uIHJhaW5ib3ckMih0KSB7CiAgICAgIGlmICh0IDwgMCB8fCB0ID4gMSkgdCAtPSBNYXRoLmZsb29yKHQpOwogICAgICB2YXIgdHMgPSBNYXRoLmFicyh0IC0gMC41KTsKICAgICAgcmFpbmJvdyQxLmggPSAzNjAgKiB0IC0gMTAwOwogICAgICByYWluYm93JDEucyA9IDEuNSAtIDEuNSAqIHRzOwogICAgICByYWluYm93JDEubCA9IDAuOCAtIDAuOSAqIHRzOwogICAgICByZXR1cm4gcmFpbmJvdyQxICsgIiI7CiAgICB9CgogICAgZnVuY3Rpb24gcmFtcCQyKHJhbmdlKSB7CiAgICAgIHZhciBuID0gcmFuZ2UubGVuZ3RoOwogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiByYW5nZVtNYXRoLm1heCgwLCBNYXRoLm1pbihuIC0gMSwgTWF0aC5mbG9vcih0ICogbikpKV07CiAgICAgIH07CiAgICB9CgogICAgdmFyIHZpcmlkaXMkMSA9IHJhbXAkMihjb2xvcnMkMSgiNDQwMTU0NDQwMjU2NDUwNDU3NDUwNTU5NDYwNzVhNDYwODVjNDYwYTVkNDYwYjVlNDcwZDYwNDcwZTYxNDcxMDYzNDcxMTY0NDcxMzY1NDgxNDY3NDgxNjY4NDgxNzY5NDgxODZhNDgxYTZjNDgxYjZkNDgxYzZlNDgxZDZmNDgxZjcwNDgyMDcxNDgyMTczNDgyMzc0NDgyNDc1NDgyNTc2NDgyNjc3NDgyODc4NDgyOTc5NDcyYTdhNDcyYzdhNDcyZDdiNDcyZTdjNDcyZjdkNDYzMDdlNDYzMjdlNDYzMzdmNDYzNDgwNDUzNTgxNDUzNzgxNDUzODgyNDQzOTgzNDQzYTgzNDQzYjg0NDMzZDg0NDMzZTg1NDIzZjg1NDI0MDg2NDI0MTg2NDE0Mjg3NDE0NDg3NDA0NTg4NDA0Njg4M2Y0Nzg4M2Y0ODg5M2U0OTg5M2U0YTg5M2U0YzhhM2Q0ZDhhM2Q0ZThhM2M0ZjhhM2M1MDhiM2I1MThiM2I1MjhiM2E1MzhiM2E1NDhjMzk1NThjMzk1NjhjMzg1ODhjMzg1OThjMzc1YThjMzc1YjhkMzY1YzhkMzY1ZDhkMzU1ZThkMzU1ZjhkMzQ2MDhkMzQ2MThkMzM2MjhkMzM2MzhkMzI2NDhlMzI2NThlMzE2NjhlMzE2NzhlMzE2ODhlMzA2OThlMzA2YThlMmY2YjhlMmY2YzhlMmU2ZDhlMmU2ZThlMmU2ZjhlMmQ3MDhlMmQ3MThlMmM3MThlMmM3MjhlMmM3MzhlMmI3NDhlMmI3NThlMmE3NjhlMmE3NzhlMmE3ODhlMjk3OThlMjk3YThlMjk3YjhlMjg3YzhlMjg3ZDhlMjc3ZThlMjc3ZjhlMjc4MDhlMjY4MThlMjY4MjhlMjY4MjhlMjU4MzhlMjU4NDhlMjU4NThlMjQ4NjhlMjQ4NzhlMjM4ODhlMjM4OThlMjM4YThkMjI4YjhkMjI4YzhkMjI4ZDhkMjE4ZThkMjE4ZjhkMjE5MDhkMjE5MThjMjA5MjhjMjA5MjhjMjA5MzhjMWY5NDhjMWY5NThiMWY5NjhiMWY5NzhiMWY5ODhiMWY5OThhMWY5YThhMWU5YjhhMWU5Yzg5MWU5ZDg5MWY5ZTg5MWY5Zjg4MWZhMDg4MWZhMTg4MWZhMTg3MWZhMjg3MjBhMzg2MjBhNDg2MjFhNTg1MjFhNjg1MjJhNzg1MjJhODg0MjNhOTgzMjRhYTgzMjVhYjgyMjVhYzgyMjZhZDgxMjdhZDgxMjhhZTgwMjlhZjdmMmFiMDdmMmNiMTdlMmRiMjdkMmViMzdjMmZiNDdjMzFiNTdiMzJiNjdhMzRiNjc5MzViNzc5MzdiODc4MzhiOTc3M2FiYTc2M2JiYjc1M2RiYzc0M2ZiYzczNDBiZDcyNDJiZTcxNDRiZjcwNDZjMDZmNDhjMTZlNGFjMTZkNGNjMjZjNGVjMzZiNTBjNDZhNTJjNTY5NTRjNTY4NTZjNjY3NThjNzY1NWFjODY0NWNjODYzNWVjOTYyNjBjYTYwNjNjYjVmNjVjYjVlNjdjYzVjNjljZDViNmNjZDVhNmVjZTU4NzBjZjU3NzNkMDU2NzVkMDU0NzdkMTUzN2FkMTUxN2NkMjUwN2ZkMzRlODFkMzRkODRkNDRiODZkNTQ5ODlkNTQ4OGJkNjQ2OGVkNjQ1OTBkNzQzOTNkNzQxOTVkODQwOThkODNlOWJkOTNjOWRkOTNiYTBkYTM5YTJkYTM3YTVkYjM2YThkYjM0YWFkYzMyYWRkYzMwYjBkZDJmYjJkZDJkYjVkZTJiYjhkZTI5YmFkZTI4YmRkZjI2YzBkZjI1YzJkZjIzYzVlMDIxYzhlMDIwY2FlMTFmY2RlMTFkZDBlMTFjZDJlMjFiZDVlMjFhZDhlMjE5ZGFlMzE5ZGRlMzE4ZGZlMzE4ZTJlNDE4ZTVlNDE5ZTdlNDE5ZWFlNTFhZWNlNTFiZWZlNTFjZjFlNTFkZjRlNjFlZjZlNjIwZjhlNjIxZmJlNzIzZmRlNzI1IikpOwoKICAgIHZhciBtYWdtYSQxID0gcmFtcCQyKGNvbG9ycyQxKCIwMDAwMDQwMTAwMDUwMTAxMDYwMTAxMDgwMjAxMDkwMjAyMGIwMjAyMGQwMzAzMGYwMzAzMTIwNDA0MTQwNTA0MTYwNjA1MTgwNjA1MWEwNzA2MWMwODA3MWUwOTA3MjAwYTA4MjIwYjA5MjQwYzA5MjYwZDBhMjkwZTBiMmIxMDBiMmQxMTBjMmYxMjBkMzExMzBkMzQxNDBlMzYxNTBlMzgxNjBmM2IxODBmM2QxOTEwM2YxYTEwNDIxYzEwNDQxZDExNDcxZTExNDkyMDExNGIyMTExNGUyMjExNTAyNDEyNTMyNTEyNTUyNzEyNTgyOTExNWEyYTExNWMyYzExNWYyZDExNjEyZjExNjMzMTExNjUzMzEwNjczNDEwNjkzNjEwNmIzODEwNmMzOTBmNmUzYjBmNzAzZDBmNzEzZjBmNzI0MDBmNzQ0MjBmNzU0NDBmNzY0NTEwNzc0NzEwNzg0OTEwNzg0YTEwNzk0YzExN2E0ZTExN2I0ZjEyN2I1MTEyN2M1MjEzN2M1NDEzN2Q1NjE0N2Q1NzE1N2U1OTE1N2U1YTE2N2U1YzE2N2Y1ZDE3N2Y1ZjE4N2Y2MDE4ODA2MjE5ODA2NDFhODA2NTFhODA2NzFiODA2ODFjODE2YTFjODE2YjFkODE2ZDFkODE2ZTFlODE3MDFmODE3MjFmODE3MzIwODE3NTIxODE3NjIxODE3ODIyODE3OTIyODI3YjIzODI3YzIzODI3ZTI0ODI4MDI1ODI4MTI1ODE4MzI2ODE4NDI2ODE4NjI3ODE4ODI3ODE4OTI4ODE4YjI5ODE4YzI5ODE4ZTJhODE5MDJhODE5MTJiODE5MzJiODA5NDJjODA5NjJjODA5ODJkODA5OTJkODA5YjJlN2Y5YzJlN2Y5ZTJmN2ZhMDJmN2ZhMTMwN2VhMzMwN2VhNTMxN2VhNjMxN2RhODMyN2RhYTMzN2RhYjMzN2NhZDM0N2NhZTM0N2JiMDM1N2JiMjM1N2JiMzM2N2FiNTM2N2FiNzM3NzliODM3NzliYTM4NzhiYzM5NzhiZDM5NzdiZjNhNzdjMDNhNzZjMjNiNzVjNDNjNzVjNTNjNzRjNzNkNzNjODNlNzNjYTNlNzJjYzNmNzFjZDQwNzFjZjQwNzBkMDQxNmZkMjQyNmZkMzQzNmVkNTQ0NmRkNjQ1NmNkODQ1NmNkOTQ2NmJkYjQ3NmFkYzQ4NjlkZTQ5NjhkZjRhNjhlMDRjNjdlMjRkNjZlMzRlNjVlNDRmNjRlNTUwNjRlNzUyNjNlODUzNjJlOTU0NjJlYTU2NjFlYjU3NjBlYzU4NjBlZDVhNWZlZTViNWVlZjVkNWVmMDVmNWVmMTYwNWRmMjYyNWRmMjY0NWNmMzY1NWNmNDY3NWNmNDY5NWNmNTZiNWNmNjZjNWNmNjZlNWNmNzcwNWNmNzcyNWNmODc0NWNmODc2NWNmOTc4NWRmOTc5NWRmOTdiNWRmYTdkNWVmYTdmNWVmYTgxNWZmYjgzNWZmYjg1NjBmYjg3NjFmYzg5NjFmYzhhNjJmYzhjNjNmYzhlNjRmYzkwNjVmZDkyNjZmZDk0NjdmZDk2NjhmZDk4NjlmZDlhNmFmZDliNmJmZTlkNmNmZTlmNmRmZWExNmVmZWEzNmZmZWE1NzFmZWE3NzJmZWE5NzNmZWFhNzRmZWFjNzZmZWFlNzdmZWIwNzhmZWIyN2FmZWI0N2JmZWI2N2NmZWI3N2VmZWI5N2ZmZWJiODFmZWJkODJmZWJmODRmZWMxODVmZWMyODdmZWM0ODhmZWM2OGFmZWM4OGNmZWNhOGRmZWNjOGZmZWNkOTBmZWNmOTJmZWQxOTRmZWQzOTVmZWQ1OTdmZWQ3OTlmZWQ4OWFmZGRhOWNmZGRjOWVmZGRlYTBmZGUwYTFmZGUyYTNmZGUzYTVmZGU1YTdmZGU3YTlmZGU5YWFmZGViYWNmY2VjYWVmY2VlYjBmY2YwYjJmY2YyYjRmY2Y0YjZmY2Y2YjhmY2Y3YjlmY2Y5YmJmY2ZiYmRmY2ZkYmYiKSk7CgogICAgdmFyIGluZmVybm8kMSA9IHJhbXAkMihjb2xvcnMkMSgiMDAwMDA0MDEwMDA1MDEwMTA2MDEwMTA4MDIwMTBhMDIwMjBjMDIwMjBlMDMwMjEwMDQwMzEyMDQwMzE0MDUwNDE3MDYwNDE5MDcwNTFiMDgwNTFkMDkwNjFmMGEwNzIyMGIwNzI0MGMwODI2MGQwODI5MGUwOTJiMTAwOTJkMTEwYTMwMTIwYTMyMTQwYjM0MTUwYjM3MTYwYjM5MTgwYzNjMTkwYzNlMWIwYzQxMWMwYzQzMWUwYzQ1MWYwYzQ4MjEwYzRhMjMwYzRjMjQwYzRmMjYwYzUxMjgwYjUzMjkwYjU1MmIwYjU3MmQwYjU5MmYwYTViMzEwYTVjMzIwYTVlMzQwYTVmMzYwOTYxMzgwOTYyMzkwOTYzM2IwOTY0M2QwOTY1M2UwOTY2NDAwYTY3NDIwYTY4NDQwYTY4NDUwYTY5NDcwYjZhNDkwYjZhNGEwYzZiNGMwYzZiNGQwZDZjNGYwZDZjNTEwZTZjNTIwZTZkNTQwZjZkNTUwZjZkNTcxMDZlNTkxMDZlNWExMTZlNWMxMjZlNWQxMjZlNWYxMzZlNjExMzZlNjIxNDZlNjQxNTZlNjUxNTZlNjcxNjZlNjkxNjZlNmExNzZlNmMxODZlNmQxODZlNmYxOTZlNzExOTZlNzIxYTZlNzQxYTZlNzUxYjZlNzcxYzZkNzgxYzZkN2ExZDZkN2MxZDZkN2QxZTZkN2YxZTZjODAxZjZjODIyMDZjODQyMDZiODUyMTZiODcyMTZiODgyMjZhOGEyMjZhOGMyMzY5OGQyMzY5OGYyNDY5OTAyNTY4OTIyNTY4OTMyNjY3OTUyNjY3OTcyNzY2OTgyNzY2OWEyODY1OWIyOTY0OWQyOTY0OWYyYTYzYTAyYTYzYTIyYjYyYTMyYzYxYTUyYzYwYTYyZDYwYTgyZTVmYTkyZTVlYWIyZjVlYWQzMDVkYWUzMDVjYjAzMTViYjEzMjVhYjMzMjVhYjQzMzU5YjYzNDU4YjczNTU3YjkzNTU2YmEzNjU1YmMzNzU0YmQzODUzYmYzOTUyYzAzYTUxYzEzYTUwYzMzYjRmYzQzYzRlYzYzZDRkYzczZTRjYzgzZjRiY2E0MDRhY2I0MTQ5Y2M0MjQ4Y2U0MzQ3Y2Y0NDQ2ZDA0NTQ1ZDI0NjQ0ZDM0NzQzZDQ0ODQyZDU0YTQxZDc0YjNmZDg0YzNlZDk0ZDNkZGE0ZTNjZGI1MDNiZGQ1MTNhZGU1MjM4ZGY1MzM3ZTA1NTM2ZTE1NjM1ZTI1NzM0ZTM1OTMzZTQ1YTMxZTU1YzMwZTY1ZDJmZTc1ZTJlZTg2MDJkZTk2MTJiZWE2MzJhZWI2NDI5ZWI2NjI4ZWM2NzI2ZWQ2OTI1ZWU2YTI0ZWY2YzIzZWY2ZTIxZjA2ZjIwZjE3MTFmZjE3MzFkZjI3NDFjZjM3NjFiZjM3ODE5ZjQ3OTE4ZjU3YjE3ZjU3ZDE1ZjY3ZTE0ZjY4MDEzZjc4MjEyZjc4NDEwZjg4NTBmZjg4NzBlZjg4OTBjZjk4YjBiZjk4YzBhZjk4ZTA5ZmE5MDA4ZmE5MjA3ZmE5NDA3ZmI5NjA2ZmI5NzA2ZmI5OTA2ZmI5YjA2ZmI5ZDA3ZmM5ZjA3ZmNhMTA4ZmNhMzA5ZmNhNTBhZmNhNjBjZmNhODBkZmNhYTBmZmNhYzExZmNhZTEyZmNiMDE0ZmNiMjE2ZmNiNDE4ZmJiNjFhZmJiODFkZmJiYTFmZmJiYzIxZmJiZTIzZmFjMDI2ZmFjMjI4ZmFjNDJhZmFjNjJkZjljNzJmZjljOTMyZjljYjM1ZjhjZDM3ZjhjZjNhZjdkMTNkZjdkMzQwZjZkNTQzZjZkNzQ2ZjVkOTQ5ZjVkYjRjZjRkZDRmZjRkZjUzZjRlMTU2ZjNlMzVhZjNlNTVkZjJlNjYxZjJlODY1ZjJlYTY5ZjFlYzZkZjFlZDcxZjFlZjc1ZjFmMTc5ZjJmMjdkZjJmNDgyZjNmNTg2ZjNmNjhhZjRmODhlZjVmOTkyZjZmYTk2ZjhmYjlhZjlmYzlkZmFmZGExZmNmZmE0IikpOwoKICAgIHZhciBwbGFzbWEkMSA9IHJhbXAkMihjb2xvcnMkMSgiMGQwODg3MTAwNzg4MTMwNzg5MTYwNzhhMTkwNjhjMWIwNjhkMWQwNjhlMjAwNjhmMjIwNjkwMjQwNjkxMjYwNTkxMjgwNTkyMmEwNTkzMmMwNTk0MmUwNTk1MmYwNTk2MzEwNTk3MzMwNTk3MzUwNDk4MzcwNDk5MzgwNDlhM2EwNDlhM2MwNDliM2UwNDljM2YwNDljNDEwNDlkNDMwMzllNDQwMzllNDYwMzlmNDgwMzlmNDkwM2EwNGIwM2ExNGMwMmExNGUwMmEyNTAwMmEyNTEwMmEzNTMwMmEzNTUwMmE0NTYwMWE0NTgwMWE0NTkwMWE1NWIwMWE1NWMwMWE2NWUwMWE2NjAwMWE2NjEwMGE3NjMwMGE3NjQwMGE3NjYwMGE3NjcwMGE4NjkwMGE4NmEwMGE4NmMwMGE4NmUwMGE4NmYwMGE4NzEwMGE4NzIwMWE4NzQwMWE4NzUwMWE4NzcwMWE4NzgwMWE4N2EwMmE4N2IwMmE4N2QwM2E4N2UwM2E4ODAwNGE4ODEwNGE3ODMwNWE3ODQwNWE3ODYwNmE2ODcwN2E2ODgwOGE2OGEwOWE1OGIwYWE1OGQwYmE1OGUwY2E0OGYwZGE0OTEwZWEzOTIwZmEzOTQxMGEyOTUxMWExOTYxM2ExOTgxNGEwOTkxNTlmOWExNjlmOWMxNzllOWQxODlkOWUxOTlkYTAxYTljYTExYjliYTIxZDlhYTMxZTlhYTUxZjk5YTYyMDk4YTcyMTk3YTgyMjk2YWEyMzk1YWIyNDk0YWMyNjk0YWQyNzkzYWUyODkyYjAyOTkxYjEyYTkwYjIyYjhmYjMyYzhlYjQyZThkYjUyZjhjYjYzMDhiYjczMThhYjgzMjg5YmEzMzg4YmIzNDg4YmMzNTg3YmQzNzg2YmUzODg1YmYzOTg0YzAzYTgzYzEzYjgyYzIzYzgxYzMzZDgwYzQzZTdmYzU0MDdlYzY0MTdkYzc0MjdjYzg0MzdiYzk0NDdhY2E0NTdhY2I0Njc5Y2M0Nzc4Y2M0OTc3Y2Q0YTc2Y2U0Yjc1Y2Y0Yzc0ZDA0ZDczZDE0ZTcyZDI0ZjcxZDM1MTcxZDQ1MjcwZDU1MzZmZDU1NDZlZDY1NTZkZDc1NjZjZDg1NzZiZDk1ODZhZGE1YTZhZGE1YjY5ZGI1YzY4ZGM1ZDY3ZGQ1ZTY2ZGU1ZjY1ZGU2MTY0ZGY2MjYzZTA2MzYzZTE2NDYyZTI2NTYxZTI2NjYwZTM2ODVmZTQ2OTVlZTU2YTVkZTU2YjVkZTY2YzVjZTc2ZTViZTc2ZjVhZTg3MDU5ZTk3MTU4ZTk3MjU3ZWE3NDU3ZWI3NTU2ZWI3NjU1ZWM3NzU0ZWQ3OTUzZWQ3YTUyZWU3YjUxZWY3YzUxZWY3ZTUwZjA3ZjRmZjA4MDRlZjE4MTRkZjE4MzRjZjI4NDRiZjM4NTRiZjM4NzRhZjQ4ODQ5ZjQ4OTQ4ZjU4YjQ3ZjU4YzQ2ZjY4ZDQ1ZjY4ZjQ0Zjc5MDQ0Zjc5MTQzZjc5MzQyZjg5NDQxZjg5NTQwZjk5NzNmZjk5ODNlZjk5YTNlZmE5YjNkZmE5YzNjZmE5ZTNiZmI5ZjNhZmJhMTM5ZmJhMjM4ZmNhMzM4ZmNhNTM3ZmNhNjM2ZmNhODM1ZmNhOTM0ZmRhYjMzZmRhYzMzZmRhZTMyZmRhZjMxZmRiMTMwZmRiMjJmZmRiNDJmZmRiNTJlZmViNzJkZmViODJjZmViYTJjZmViYjJiZmViZDJhZmViZTJhZmVjMDI5ZmRjMjI5ZmRjMzI4ZmRjNTI3ZmRjNjI3ZmRjODI3ZmRjYTI2ZmRjYjI2ZmNjZDI1ZmNjZTI1ZmNkMDI1ZmNkMjI1ZmJkMzI0ZmJkNTI0ZmJkNzI0ZmFkODI0ZmFkYTI0ZjlkYzI0ZjlkZDI1ZjhkZjI1ZjhlMTI1ZjdlMjI1ZjdlNDI1ZjZlNjI2ZjZlODI2ZjVlOTI2ZjVlYjI3ZjRlZDI3ZjNlZTI3ZjNmMDI3ZjJmMjI3ZjFmNDI2ZjFmNTI1ZjBmNzI0ZjBmOTIxIikpOwoKICAgIGZ1bmN0aW9uIHNlcXVlbnRpYWwkMShpbnRlcnBvbGF0b3IpIHsKICAgICAgdmFyIHgwID0gMCwKICAgICAgICAgIHgxID0gMSwKICAgICAgICAgIGNsYW1wID0gZmFsc2U7CgogICAgICBmdW5jdGlvbiBzY2FsZSh4KSB7CiAgICAgICAgdmFyIHQgPSAoeCAtIHgwKSAvICh4MSAtIHgwKTsKICAgICAgICByZXR1cm4gaW50ZXJwb2xhdG9yKGNsYW1wID8gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpIDogdCk7CiAgICAgIH0KCiAgICAgIHNjYWxlLmRvbWFpbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9ICtfWzBdLCB4MSA9ICtfWzFdLCBzY2FsZSkgOiBbeDAsIHgxXTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gISFfLCBzY2FsZSkgOiBjbGFtcDsKICAgICAgfTsKCiAgICAgIHNjYWxlLmludGVycG9sYXRvciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0b3IgPSBfLCBzY2FsZSkgOiBpbnRlcnBvbGF0b3I7CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHNlcXVlbnRpYWwkMShpbnRlcnBvbGF0b3IpLmRvbWFpbihbeDAsIHgxXSkuY2xhbXAoY2xhbXApOwogICAgICB9OwoKICAgICAgcmV0dXJuIGxpbmVhcmlzaCQxKHNjYWxlKTsKICAgIH0KCiAgICB2YXIgeGh0bWwkMyA9ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIjsKCiAgICB2YXIgbmFtZXNwYWNlcyQzID0gewogICAgICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAgIHhodG1sOiB4aHRtbCQzLAogICAgICB4bGluazogImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiLAogICAgICB4bWw6ICJodHRwOi8vd3d3LnczLm9yZy9YTUwvMTk5OC9uYW1lc3BhY2UiLAogICAgICB4bWxuczogImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIgogICAgfTsKCiAgICBmdW5jdGlvbiBuYW1lc3BhY2UkMyhuYW1lKSB7CiAgICAgIHZhciBwcmVmaXggPSBuYW1lICs9ICIiLCBpID0gcHJlZml4LmluZGV4T2YoIjoiKTsKICAgICAgaWYgKGkgPj0gMCAmJiAocHJlZml4ID0gbmFtZS5zbGljZSgwLCBpKSkgIT09ICJ4bWxucyIpIG5hbWUgPSBuYW1lLnNsaWNlKGkgKyAxKTsKICAgICAgcmV0dXJuIG5hbWVzcGFjZXMkMy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzJDNbcHJlZml4XSwgbG9jYWw6IG5hbWV9IDogbmFtZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdG9ySW5oZXJpdCQzKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBkb2N1bWVudCA9IHRoaXMub3duZXJEb2N1bWVudCwKICAgICAgICAgICAgdXJpID0gdGhpcy5uYW1lc3BhY2VVUkk7CiAgICAgICAgcmV0dXJuIHVyaSA9PT0geGh0bWwkMyAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbCQzCiAgICAgICAgICAgID8gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKQogICAgICAgICAgICA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyh1cmksIG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3JGaXhlZCQzKGZ1bGxuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3IkMyhuYW1lKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQzKG5hbWUpOwogICAgICByZXR1cm4gKGZ1bGxuYW1lLmxvY2FsCiAgICAgICAgICA/IGNyZWF0b3JGaXhlZCQzCiAgICAgICAgICA6IGNyZWF0b3JJbmhlcml0JDMpKGZ1bGxuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub25lJDUoKSB7fQoKICAgIGZ1bmN0aW9uIHNlbGVjdG9yJDMoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBub25lJDUgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0JDMoc2VsZWN0KSB7CiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvciQzKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNShzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVtcHR5JDUoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RvckFsbCQzKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiBzZWxlY3RvciA9PSBudWxsID8gZW1wdHkkNSA6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3RBbGwkMyhzZWxlY3QpIHsKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsJDMoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDUoc3ViZ3JvdXBzLCBwYXJlbnRzKTsKICAgIH0KCiAgICB2YXIgbWF0Y2hlciQzID0gZnVuY3Rpb24oc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm1hdGNoZXMoc2VsZWN0b3IpOwogICAgICB9OwogICAgfTsKCiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICB2YXIgZWxlbWVudCQzID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICBpZiAoIWVsZW1lbnQkMy5tYXRjaGVzKSB7CiAgICAgICAgdmFyIHZlbmRvck1hdGNoZXMgPSBlbGVtZW50JDMud2Via2l0TWF0Y2hlc1NlbGVjdG9yCiAgICAgICAgICAgIHx8IGVsZW1lbnQkMy5tc01hdGNoZXNTZWxlY3RvcgogICAgICAgICAgICB8fCBlbGVtZW50JDMubW96TWF0Y2hlc1NlbGVjdG9yCiAgICAgICAgICAgIHx8IGVsZW1lbnQkMy5vTWF0Y2hlc1NlbGVjdG9yOwogICAgICAgIG1hdGNoZXIkMyA9IGZ1bmN0aW9uKHNlbGVjdG9yKSB7CiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB2ZW5kb3JNYXRjaGVzLmNhbGwodGhpcywgc2VsZWN0b3IpOwogICAgICAgICAgfTsKICAgICAgICB9OwogICAgICB9CiAgICB9CgogICAgdmFyIG1hdGNoZXIkNCA9IG1hdGNoZXIkMzsKCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZmlsdGVyJDMobWF0Y2gpIHsKICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyJDQobWF0Y2gpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ1KHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc3BhcnNlJDModXBkYXRlKSB7CiAgICAgIHJldHVybiBuZXcgQXJyYXkodXBkYXRlLmxlbmd0aCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VudGVyJDMoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDUodGhpcy5fZW50ZXIgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UkMyksIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIEVudGVyTm9kZSQzKHBhcmVudCwgZGF0dW0pIHsKICAgICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsKICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOwogICAgfQoKICAgIEVudGVyTm9kZSQzLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IEVudGVyTm9kZSQzLAogICAgICBhcHBlbmRDaGlsZDogZnVuY3Rpb24oY2hpbGQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIHRoaXMuX25leHQpOyB9LAogICAgICBpbnNlcnRCZWZvcmU6IGZ1bmN0aW9uKGNoaWxkLCBuZXh0KSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCBuZXh0KTsgfSwKICAgICAgcXVlcnlTZWxlY3RvcjogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsgfSwKICAgICAgcXVlcnlTZWxlY3RvckFsbDogZnVuY3Rpb24oc2VsZWN0b3IpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjb25zdGFudCRyKHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIHZhciBrZXlQcmVmaXgkNSA9ICIkIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uCgogICAgZnVuY3Rpb24gYmluZEluZGV4JDMocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSkgewogICAgICB2YXIgaSA9IDAsCiAgICAgICAgICBub2RlLAogICAgICAgICAgZ3JvdXBMZW5ndGggPSBncm91cC5sZW5ndGgsCiAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGg7CgogICAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZml0IGludG8gdXBkYXRlLgogICAgICAvLyBQdXQgYW55IG51bGwgbm9kZXMgaW50byBlbnRlci4KICAgICAgLy8gUHV0IGFueSByZW1haW5pbmcgZGF0YSBpbnRvIGVudGVyLgogICAgICBmb3IgKDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlJDMocGFyZW50LCBkYXRhW2ldKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIFB1dCBhbnkgbm9uLW51bGwgbm9kZXMgdGhhdCBkb27igJl0IGZpdCBpbnRvIGV4aXQuCiAgICAgIGZvciAoOyBpIDwgZ3JvdXBMZW5ndGg7ICsraSkgewogICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGJpbmRLZXkkMyhwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsKICAgICAgdmFyIGksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwKICAgICAgICAgIGtleVZhbHVlOwoKICAgICAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuCiAgICAgIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleVByZWZpeCQ1ICsga2V5LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOwogICAgICAgICAgaWYgKGtleVZhbHVlIGluIG5vZGVCeUtleVZhbHVlKSB7CiAgICAgICAgICAgIGV4aXRbaV0gPSBub2RlOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBkYXR1bS4KICAgICAgLy8gSWYgdGhlcmUgYSBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGtleSwgam9pbiBhbmQgYWRkIGl0IHRvIHVwZGF0ZS4KICAgICAgLy8gSWYgdGhlcmUgaXMgbm90IChvciB0aGUga2V5IGlzIGEgZHVwbGljYXRlKSwgYWRkIGl0IHRvIGVudGVyLgogICAgICBmb3IgKGkgPSAwOyBpIDwgZGF0YUxlbmd0aDsgKytpKSB7CiAgICAgICAga2V5VmFsdWUgPSBrZXlQcmVmaXgkNSArIGtleS5jYWxsKHBhcmVudCwgZGF0YVtpXSwgaSwgZGF0YSk7CiAgICAgICAgaWYgKG5vZGUgPSBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0pIHsKICAgICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG51bGw7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZSQzKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7CiAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSQzKHZhbHVlLCBrZXkpIHsKICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgIGRhdGEgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBqID0gLTE7CiAgICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKGQpIHsgZGF0YVsrK2pdID0gZDsgfSk7CiAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgIH0KCiAgICAgIHZhciBiaW5kID0ga2V5ID8gYmluZEtleSQzIDogYmluZEluZGV4JDMsCiAgICAgICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cywKICAgICAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwczsKCiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQkcih2YWx1ZSk7CgogICAgICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSwKICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sCiAgICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgICBkYXRhID0gdmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpLAogICAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwKICAgICAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksCiAgICAgICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdAogICAgICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHsKICAgICAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTsKICAgICAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uJDUodXBkYXRlLCBwYXJlbnRzKTsKICAgICAgdXBkYXRlLl9lbnRlciA9IGVudGVyOwogICAgICB1cGRhdGUuX2V4aXQgPSBleGl0OwogICAgICByZXR1cm4gdXBkYXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9leGl0JDMoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDUodGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSQzKSwgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX21lcmdlJDMoc2VsZWN0aW9uKSB7CgogICAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgewogICAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ1KG1lcmdlcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX29yZGVyJDMoKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAtMSwgbSA9IGdyb3Vwcy5sZW5ndGg7ICsraiA8IG07KSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIGkgPSBncm91cC5sZW5ndGggLSAxLCBuZXh0ID0gZ3JvdXBbaV0sIG5vZGU7IC0taSA+PSAwOykgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBpZiAobmV4dCAmJiBuZXh0ICE9PSBub2RlLm5leHRTaWJsaW5nKSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAgICAgICBuZXh0ID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zb3J0JDMoY29tcGFyZSkgewogICAgICBpZiAoIWNvbXBhcmUpIGNvbXBhcmUgPSBhc2NlbmRpbmckYTsKCiAgICAgIGZ1bmN0aW9uIGNvbXBhcmVOb2RlKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSAmJiBiID8gY29tcGFyZShhLl9fZGF0YV9fLCBiLl9fZGF0YV9fKSA6ICFhIC0gIWI7CiAgICAgIH0KCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHNvcnRncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHNvcnRncm91cCA9IHNvcnRncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHNvcnRncm91cFtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNvcnRncm91cC5zb3J0KGNvbXBhcmVOb2RlKTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNShzb3J0Z3JvdXBzLCB0aGlzLl9wYXJlbnRzKS5vcmRlcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzY2VuZGluZyRhKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiBhID4gYiA/IDEgOiBhID49IGIgPyAwIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jYWxsJDMoKSB7CiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsKICAgICAgYXJndW1lbnRzWzBdID0gdGhpczsKICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzJDMoKSB7CiAgICAgIHZhciBub2RlcyA9IG5ldyBBcnJheSh0aGlzLnNpemUoKSksIGkgPSAtMTsKICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyBub2Rlc1srK2ldID0gdGhpczsgfSk7CiAgICAgIHJldHVybiBub2RlczsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbm9kZSQzKCkgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHZhciBub2RlID0gZ3JvdXBbaV07CiAgICAgICAgICBpZiAobm9kZSkgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2l6ZSQzKCkgewogICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTsKICAgICAgcmV0dXJuIHNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VtcHR5JDMoKSB7CiAgICAgIHJldHVybiAhdGhpcy5ub2RlKCk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VhY2gkMyhjYWxsYmFjaykgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gMCwgbSA9IGdyb3Vwcy5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IDAsIG4gPSBncm91cC5sZW5ndGgsIG5vZGU7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIGNhbGxiYWNrLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZSQ1KG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmVOUyQ1KGZ1bGxuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50JDUobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHZhbHVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnROUyQ1KGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24kNShuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgIGVsc2UgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMkNShmdWxsbmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2F0dHIkMyhuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UkMyhuYW1lKTsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBub2RlID0gdGhpcy5ub2RlKCk7CiAgICAgICAgcmV0dXJuIGZ1bGxuYW1lLmxvY2FsCiAgICAgICAgICAgID8gbm9kZS5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpCiAgICAgICAgICAgIDogbm9kZS5nZXRBdHRyaWJ1dGUoZnVsbG5hbWUpOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICA/IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJSZW1vdmVOUyQ1IDogYXR0clJlbW92ZSQ1KSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkNSA6IGF0dHJGdW5jdGlvbiQ1KQogICAgICAgICAgOiAoZnVsbG5hbWUubG9jYWwgPyBhdHRyQ29uc3RhbnROUyQ1IDogYXR0ckNvbnN0YW50JDUpKSkoZnVsbG5hbWUsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFZpZXckMyhub2RlKSB7CiAgICAgIHJldHVybiAobm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldykgLy8gbm9kZSBpcyBhIE5vZGUKICAgICAgICAgIHx8IChub2RlLmRvY3VtZW50ICYmIG5vZGUpIC8vIG5vZGUgaXMgYSBXaW5kb3cKICAgICAgICAgIHx8IG5vZGUuZGVmYXVsdFZpZXc7IC8vIG5vZGUgaXMgYSBEb2N1bWVudAogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDUobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDUobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHZhbHVlLCBwcmlvcml0eSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbiQ1KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICAgICAgZWxzZSB0aGlzLnN0eWxlLnNldFByb3BlcnR5KG5hbWUsIHYsIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc3R5bGUkMyhuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSQ1IDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgICA/IHN0eWxlRnVuY3Rpb24kNQogICAgICAgICAgICAgICAgOiBzdHlsZUNvbnN0YW50JDUpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAgICAgICA6IHN0eWxlVmFsdWUkMyh0aGlzLm5vZGUoKSwgbmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVWYWx1ZSQzKG5vZGUsIG5hbWUpIHsKICAgICAgcmV0dXJuIG5vZGUuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKQogICAgICAgICAgfHwgZGVmYXVsdFZpZXckMyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUkMyhuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9wZXJ0eUNvbnN0YW50JDMobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXNbbmFtZV0gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9wZXJ0eUZ1bmN0aW9uJDMobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9wcm9wZXJ0eSQzKG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMQogICAgICAgICAgPyB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IHByb3BlcnR5UmVtb3ZlJDMgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IHByb3BlcnR5RnVuY3Rpb24kMwogICAgICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCQzKShuYW1lLCB2YWx1ZSkpCiAgICAgICAgICA6IHRoaXMubm9kZSgpW25hbWVdOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzQXJyYXkkMyhzdHJpbmcpIHsKICAgICAgcmV0dXJuIHN0cmluZy50cmltKCkuc3BsaXQoL158XHMrLyk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NMaXN0JDMobm9kZSkgewogICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdCQzKG5vZGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIENsYXNzTGlzdCQzKG5vZGUpIHsKICAgICAgdGhpcy5fbm9kZSA9IG5vZGU7CiAgICAgIHRoaXMuX25hbWVzID0gY2xhc3NBcnJheSQzKG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICAgIH0KCiAgICBDbGFzc0xpc3QkMy5wcm90b3R5cGUgPSB7CiAgICAgIGFkZDogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgICBpZiAoaSA8IDApIHsKICAgICAgICAgIHRoaXMuX25hbWVzLnB1c2gobmFtZSk7CiAgICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICAgIGlmIChpID49IDApIHsKICAgICAgICAgIHRoaXMuX25hbWVzLnNwbGljZShpLCAxKTsKICAgICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBjb250YWluczogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHJldHVybiB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpID49IDA7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY2xhc3NlZEFkZCQzKG5vZGUsIG5hbWVzKSB7CiAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0JDMobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlJDMobm9kZSwgbmFtZXMpIHsKICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QkMyhub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgbGlzdC5yZW1vdmUobmFtZXNbaV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRUcnVlJDMobmFtZXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGNsYXNzZWRBZGQkMyh0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZEZhbHNlJDMobmFtZXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGNsYXNzZWRSZW1vdmUkMyh0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uJDMobmFtZXMsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICAodmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKSA/IGNsYXNzZWRBZGQkMyA6IGNsYXNzZWRSZW1vdmUkMykodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbGFzc2VkJDMobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIG5hbWVzID0gY2xhc3NBcnJheSQzKG5hbWUgKyAiIik7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCQzKHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBjbGFzc2VkRnVuY3Rpb24kMyA6IHZhbHVlCiAgICAgICAgICA/IGNsYXNzZWRUcnVlJDMKICAgICAgICAgIDogY2xhc3NlZEZhbHNlJDMpKG5hbWVzLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRSZW1vdmUkMygpIHsKICAgICAgdGhpcy50ZXh0Q29udGVudCA9ICIiOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRDb25zdGFudCQ1KHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dEZ1bmN0aW9uJDUodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0JDModmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IHRleHRSZW1vdmUkMyA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IHRleHRGdW5jdGlvbiQ1CiAgICAgICAgICAgICAgOiB0ZXh0Q29uc3RhbnQkNSkodmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS50ZXh0Q29udGVudDsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sUmVtb3ZlJDMoKSB7CiAgICAgIHRoaXMuaW5uZXJIVE1MID0gIiI7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbENvbnN0YW50JDModmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbEZ1bmN0aW9uJDModmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLmlubmVySFRNTCA9IHYgPT0gbnVsbCA/ICIiIDogdjsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faHRtbCQzKHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyBodG1sUmVtb3ZlJDMgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBodG1sRnVuY3Rpb24kMwogICAgICAgICAgICAgIDogaHRtbENvbnN0YW50JDMpKHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkuaW5uZXJIVE1MOwogICAgfQoKICAgIGZ1bmN0aW9uIHJhaXNlJDQoKSB7CiAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3JhaXNlJDMoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gocmFpc2UkNCk7CiAgICB9CgogICAgZnVuY3Rpb24gbG93ZXIkMygpIHsKICAgICAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbG93ZXIkMygpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChsb3dlciQzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fYXBwZW5kJDMobmFtZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvciQzKG5hbWUpOwogICAgICByZXR1cm4gdGhpcy5zZWxlY3QoZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuYXBwZW5kQ2hpbGQoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25zdGFudE51bGwkMygpIHsKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2luc2VydCQzKG5hbWUsIGJlZm9yZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvciQzKG5hbWUpLAogICAgICAgICAgc2VsZWN0ID0gYmVmb3JlID09IG51bGwgPyBjb25zdGFudE51bGwkMyA6IHR5cGVvZiBiZWZvcmUgPT09ICJmdW5jdGlvbiIgPyBiZWZvcmUgOiBzZWxlY3RvciQzKGJlZm9yZSk7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmUkMygpIHsKICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUkMygpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChyZW1vdmUkMyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Nsb25lU2hhbGxvdyQzKCkgewogICAgICByZXR1cm4gdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSh0aGlzLmNsb25lTm9kZShmYWxzZSksIHRoaXMubmV4dFNpYmxpbmcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZURlZXAkMygpIHsKICAgICAgcmV0dXJuIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcy5jbG9uZU5vZGUodHJ1ZSksIHRoaXMubmV4dFNpYmxpbmcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSQzKGRlZXApIHsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwJDMgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93JDMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kYXR1bSQzKHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpCiAgICAgICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fOwogICAgfQoKICAgIHZhciBmaWx0ZXJFdmVudHMkMyA9IHt9OwoKICAgIHZhciBldmVudCQzID0gbnVsbDsKCiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICB2YXIgZWxlbWVudCQ0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICBpZiAoISgib25tb3VzZWVudGVyIiBpbiBlbGVtZW50JDQpKSB7CiAgICAgICAgZmlsdGVyRXZlbnRzJDMgPSB7bW91c2VlbnRlcjogIm1vdXNlb3ZlciIsIG1vdXNlbGVhdmU6ICJtb3VzZW91dCJ9OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyQ29udGV4dExpc3RlbmVyJDMobGlzdGVuZXIsIGluZGV4LCBncm91cCkgewogICAgICBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lciQzKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApOwogICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CiAgICAgICAgaWYgKCFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0aGlzICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSAmIDgpKSkgewogICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lciQzKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkgewogICAgICAgIHZhciBldmVudDAgPSBldmVudCQzOyAvLyBFdmVudHMgY2FuIGJlIHJlZW50cmFudCAoZS5nLiwgZm9jdXMpLgogICAgICAgIGV2ZW50JDMgPSBldmVudDE7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgZXZlbnQkMyA9IGV2ZW50MDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXMkOCh0eXBlbmFtZXMpIHsKICAgICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBvblJlbW92ZSQzKHR5cGVuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb24gPSB0aGlzLl9fb247CiAgICAgICAgaWYgKCFvbikgcmV0dXJuOwogICAgICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb25bKytpXSA9IG87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7CiAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5fX29uOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uQWRkJDModHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7CiAgICAgIHZhciB3cmFwID0gZmlsdGVyRXZlbnRzJDMuaGFzT3duUHJvcGVydHkodHlwZW5hbWUudHlwZSkgPyBmaWx0ZXJDb250ZXh0TGlzdGVuZXIkMyA6IGNvbnRleHRMaXN0ZW5lciQzOwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsKICAgICAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApOwogICAgICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8uY2FwdHVyZSA9IGNhcHR1cmUpOwogICAgICAgICAgICBvLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTsKICAgICAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBjYXB0dXJlOiBjYXB0dXJlfTsKICAgICAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107CiAgICAgICAgZWxzZSBvbi5wdXNoKG8pOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vbiQzKHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgewogICAgICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXMkOCh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICAgIHJldHVybiBvLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgb24gPSB2YWx1ZSA/IG9uQWRkJDMgOiBvblJlbW92ZSQzOwogICAgICBpZiAoY2FwdHVyZSA9PSBudWxsKSBjYXB0dXJlID0gZmFsc2U7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBjYXB0dXJlKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1c3RvbUV2ZW50JDMoZXZlbnQxLCBsaXN0ZW5lciwgdGhhdCwgYXJncykgewogICAgICB2YXIgZXZlbnQwID0gZXZlbnQkMzsKICAgICAgZXZlbnQxLnNvdXJjZUV2ZW50ID0gZXZlbnQkMzsKICAgICAgZXZlbnQkMyA9IGV2ZW50MTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZXZlbnQkMyA9IGV2ZW50MDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQkMyhub2RlLCB0eXBlLCBwYXJhbXMpIHsKICAgICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3JDMobm9kZSksCiAgICAgICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKCiAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsOwogICAgICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0KCiAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCQzKHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQkMyh0aGlzLCB0eXBlLCBwYXJhbXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24kMyh0eXBlLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50JDModGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kaXNwYXRjaCQzKHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGRpc3BhdGNoRnVuY3Rpb24kMwogICAgICAgICAgOiBkaXNwYXRjaENvbnN0YW50JDMpKHR5cGUsIHBhcmFtcykpOwogICAgfQoKICAgIHZhciByb290JDUgPSBbbnVsbF07CgogICAgZnVuY3Rpb24gU2VsZWN0aW9uJDUoZ3JvdXBzLCBwYXJlbnRzKSB7CiAgICAgIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICAgICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uJDMoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDUoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCQ1KTsKICAgIH0KCiAgICBTZWxlY3Rpb24kNS5wcm90b3R5cGUgPSBzZWxlY3Rpb24kMy5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24kNSwKICAgICAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0JDMsCiAgICAgIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCQzLAogICAgICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIkMywKICAgICAgZGF0YTogc2VsZWN0aW9uX2RhdGEkMywKICAgICAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlciQzLAogICAgICBleGl0OiBzZWxlY3Rpb25fZXhpdCQzLAogICAgICBtZXJnZTogc2VsZWN0aW9uX21lcmdlJDMsCiAgICAgIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIkMywKICAgICAgc29ydDogc2VsZWN0aW9uX3NvcnQkMywKICAgICAgY2FsbDogc2VsZWN0aW9uX2NhbGwkMywKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyQzLAogICAgICBub2RlOiBzZWxlY3Rpb25fbm9kZSQzLAogICAgICBzaXplOiBzZWxlY3Rpb25fc2l6ZSQzLAogICAgICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5JDMsCiAgICAgIGVhY2g6IHNlbGVjdGlvbl9lYWNoJDMsCiAgICAgIGF0dHI6IHNlbGVjdGlvbl9hdHRyJDMsCiAgICAgIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUkMywKICAgICAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSQzLAogICAgICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCQzLAogICAgICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCQzLAogICAgICBodG1sOiBzZWxlY3Rpb25faHRtbCQzLAogICAgICByYWlzZTogc2VsZWN0aW9uX3JhaXNlJDMsCiAgICAgIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIkMywKICAgICAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kJDMsCiAgICAgIGluc2VydDogc2VsZWN0aW9uX2luc2VydCQzLAogICAgICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUkMywKICAgICAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSQzLAogICAgICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtJDMsCiAgICAgIG9uOiBzZWxlY3Rpb25fb24kMywKICAgICAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCQzCiAgICB9OwoKICAgIGZ1bmN0aW9uIHNlbGVjdCQzKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCiAgICAgICAgICA/IG5ldyBTZWxlY3Rpb24kNShbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQogICAgICAgICAgOiBuZXcgU2VsZWN0aW9uJDUoW1tzZWxlY3Rvcl1dLCByb290JDUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZSQzKG5hbWUpIHsKICAgICAgcmV0dXJuIHNlbGVjdCQzKGNyZWF0b3IkMyhuYW1lKS5jYWxsKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpOwogICAgfQoKICAgIHZhciBuZXh0SWQkMSA9IDA7CgogICAgZnVuY3Rpb24gbG9jYWwkMygpIHsKICAgICAgcmV0dXJuIG5ldyBMb2NhbCQxOwogICAgfQoKICAgIGZ1bmN0aW9uIExvY2FsJDEoKSB7CiAgICAgIHRoaXMuXyA9ICJAIiArICgrK25leHRJZCQxKS50b1N0cmluZygzNik7CiAgICB9CgogICAgTG9jYWwkMS5wcm90b3R5cGUgPSBsb2NhbCQzLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IExvY2FsJDEsCiAgICAgIGdldDogZnVuY3Rpb24obm9kZSkgewogICAgICAgIHZhciBpZCA9IHRoaXMuXzsKICAgICAgICB3aGlsZSAoIShpZCBpbiBub2RlKSkgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHJldHVybjsKICAgICAgICByZXR1cm4gbm9kZVtpZF07CiAgICAgIH0sCiAgICAgIHNldDogZnVuY3Rpb24obm9kZSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gbm9kZVt0aGlzLl9dID0gdmFsdWU7CiAgICAgIH0sCiAgICAgIHJlbW92ZTogZnVuY3Rpb24obm9kZSkgewogICAgICAgIHJldHVybiB0aGlzLl8gaW4gbm9kZSAmJiBkZWxldGUgbm9kZVt0aGlzLl9dOwogICAgICB9LAogICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXzsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBzb3VyY2VFdmVudCQzKCkgewogICAgICB2YXIgY3VycmVudCA9IGV2ZW50JDMsIHNvdXJjZTsKICAgICAgd2hpbGUgKHNvdXJjZSA9IGN1cnJlbnQuc291cmNlRXZlbnQpIGN1cnJlbnQgPSBzb3VyY2U7CiAgICAgIHJldHVybiBjdXJyZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50JDkobm9kZSwgZXZlbnQpIHsKICAgICAgdmFyIHN2ZyA9IG5vZGUub3duZXJTVkdFbGVtZW50IHx8IG5vZGU7CgogICAgICBpZiAoc3ZnLmNyZWF0ZVNWR1BvaW50KSB7CiAgICAgICAgdmFyIHBvaW50ID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICAgICAgcG9pbnQueCA9IGV2ZW50LmNsaWVudFgsIHBvaW50LnkgPSBldmVudC5jbGllbnRZOwogICAgICAgIHBvaW50ID0gcG9pbnQubWF0cml4VHJhbnNmb3JtKG5vZGUuZ2V0U2NyZWVuQ1RNKCkuaW52ZXJzZSgpKTsKICAgICAgICByZXR1cm4gW3BvaW50LngsIHBvaW50LnldOwogICAgICB9CgogICAgICB2YXIgcmVjdCA9IG5vZGUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgIHJldHVybiBbZXZlbnQuY2xpZW50WCAtIHJlY3QubGVmdCAtIG5vZGUuY2xpZW50TGVmdCwgZXZlbnQuY2xpZW50WSAtIHJlY3QudG9wIC0gbm9kZS5jbGllbnRUb3BdOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vdXNlJDMobm9kZSkgewogICAgICB2YXIgZXZlbnQgPSBzb3VyY2VFdmVudCQzKCk7CiAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgcmV0dXJuIHBvaW50JDkobm9kZSwgZXZlbnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdEFsbCQxKHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCiAgICAgICAgICA/IG5ldyBTZWxlY3Rpb24kNShbZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3RvcildLCBbZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50XSkKICAgICAgICAgIDogbmV3IFNlbGVjdGlvbiQ1KFtzZWxlY3RvciA9PSBudWxsID8gW10gOiBzZWxlY3Rvcl0sIHJvb3QkNSk7CiAgICB9CgogICAgZnVuY3Rpb24gdG91Y2gkMihub2RlLCB0b3VjaGVzLCBpZGVudGlmaWVyKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgaWRlbnRpZmllciA9IHRvdWNoZXMsIHRvdWNoZXMgPSBzb3VyY2VFdmVudCQzKCkuY2hhbmdlZFRvdWNoZXM7CgogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHRvdWNoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHsKICAgICAgICAgIHJldHVybiBwb2ludCQ5KG5vZGUsIHRvdWNoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvdWNoZXMkMShub2RlLCB0b3VjaGVzKSB7CiAgICAgIGlmICh0b3VjaGVzID09IG51bGwpIHRvdWNoZXMgPSBzb3VyY2VFdmVudCQzKCkudG91Y2hlczsKCiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdG91Y2hlcyA/IHRvdWNoZXMubGVuZ3RoIDogMCwgcG9pbnRzID0gbmV3IEFycmF5KG4pOyBpIDwgbjsgKytpKSB7CiAgICAgICAgcG9pbnRzW2ldID0gcG9pbnQkOShub2RlLCB0b3VjaGVzW2ldKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHBvaW50czsKICAgIH0KCiAgICB2YXIgcGkkYSA9IE1hdGguUEksCiAgICAgICAgdGF1JGEgPSAyICogcGkkYSwKICAgICAgICBlcHNpbG9uJDkgPSAxZS02LAogICAgICAgIHRhdUVwc2lsb24kMyA9IHRhdSRhIC0gZXBzaWxvbiQ5OwoKICAgIGZ1bmN0aW9uIFBhdGgkMygpIHsKICAgICAgdGhpcy5feDAgPSB0aGlzLl95MCA9IC8vIHN0YXJ0IG9mIGN1cnJlbnQgc3VicGF0aAogICAgICB0aGlzLl94MSA9IHRoaXMuX3kxID0gbnVsbDsgLy8gZW5kIG9mIGN1cnJlbnQgc3VicGF0aAogICAgICB0aGlzLl8gPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXRoJDMoKSB7CiAgICAgIHJldHVybiBuZXcgUGF0aCQzOwogICAgfQoKICAgIFBhdGgkMy5wcm90b3R5cGUgPSBwYXRoJDMucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogUGF0aCQzLAogICAgICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7CiAgICAgICAgICB0aGlzLl8gKz0gIloiOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJMIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJRIiArICgreDEpICsgIiwiICsgKCt5MSkgKyAiLCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7CiAgICAgIH0sCiAgICAgIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJDIiArICgreDEpICsgIiwiICsgKCt5MSkgKyAiLCIgKyAoK3gyKSArICIsIiArICgreTIpICsgIiwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogICAgICB9LAogICAgICBhcmNUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHIpIHsKICAgICAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyOwogICAgICAgIHZhciB4MCA9IHRoaXMuX3gxLAogICAgICAgICAgICB5MCA9IHRoaXMuX3kxLAogICAgICAgICAgICB4MjEgPSB4MiAtIHgxLAogICAgICAgICAgICB5MjEgPSB5MiAtIHkxLAogICAgICAgICAgICB4MDEgPSB4MCAtIHgxLAogICAgICAgICAgICB5MDEgPSB5MCAtIHkxLAogICAgICAgICAgICBsMDFfMiA9IHgwMSAqIHgwMSArIHkwMSAqIHkwMTsKCiAgICAgICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICAgICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOwoKICAgICAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS4KICAgICAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDEgPSB4MSkgKyAiLCIgKyAodGhpcy5feTEgPSB5MSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy4KICAgICAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbiQ5KSk7CgogICAgICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/CiAgICAgICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpPwogICAgICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4KICAgICAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uJDkpIHx8ICFyKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgICAgIH0KCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyEKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciB4MjAgPSB4MiAtIHgwLAogICAgICAgICAgICAgIHkyMCA9IHkyIC0geTAsCiAgICAgICAgICAgICAgbDIxXzIgPSB4MjEgKiB4MjEgKyB5MjEgKiB5MjEsCiAgICAgICAgICAgICAgbDIwXzIgPSB4MjAgKiB4MjAgKyB5MjAgKiB5MjAsCiAgICAgICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSwKICAgICAgICAgICAgICBsMDEgPSBNYXRoLnNxcnQobDAxXzIpLAogICAgICAgICAgICAgIGwgPSByICogTWF0aC50YW4oKHBpJGEgLSBNYXRoLmFjb3MoKGwyMV8yICsgbDAxXzIgLSBsMjBfMikgLyAoMiAqIGwyMSAqIGwwMSkpKSAvIDIpLAogICAgICAgICAgICAgIHQwMSA9IGwgLyBsMDEsCiAgICAgICAgICAgICAgdDIxID0gbCAvIGwyMTsKCiAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgdGFuZ2VudCBpcyBub3QgY29pbmNpZGVudCB3aXRoICh4MCx5MCksIGxpbmUgdG8uCiAgICAgICAgICBpZiAoTWF0aC5hYnModDAxIC0gMSkgPiBlcHNpbG9uJDkpIHsKICAgICAgICAgICAgdGhpcy5fICs9ICJMIiArICh4MSArIHQwMSAqIHgwMSkgKyAiLCIgKyAoeTEgKyB0MDEgKiB5MDEpOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwwLCIgKyAoKyh5MDEgKiB4MjAgPiB4MDEgKiB5MjApKSArICIsIiArICh0aGlzLl94MSA9IHgxICsgdDIxICogeDIxKSArICIsIiArICh0aGlzLl95MSA9IHkxICsgdDIxICogeTIxKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGFyYzogZnVuY3Rpb24oeCwgeSwgciwgYTAsIGExLCBjY3cpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreSwgciA9ICtyLCBjY3cgPSAhIWNjdzsKICAgICAgICB2YXIgZHggPSByICogTWF0aC5jb3MoYTApLAogICAgICAgICAgICBkeSA9IHIgKiBNYXRoLnNpbihhMCksCiAgICAgICAgICAgIHgwID0geCArIGR4LAogICAgICAgICAgICB5MCA9IHkgKyBkeSwKICAgICAgICAgICAgY3cgPSAxIF4gY2N3LAogICAgICAgICAgICBkYSA9IGNjdyA/IGEwIC0gYTEgOiBhMSAtIGEwOwoKICAgICAgICAvLyBJcyB0aGUgcmFkaXVzIG5lZ2F0aXZlPyBFcnJvci4KICAgICAgICBpZiAociA8IDApIHRocm93IG5ldyBFcnJvcigibmVnYXRpdmUgcmFkaXVzOiAiICsgcik7CgogICAgICAgIC8vIElzIHRoaXMgcGF0aCBlbXB0eT8gTW92ZSB0byAoeDAseTApLgogICAgICAgIGlmICh0aGlzLl94MSA9PT0gbnVsbCkgewogICAgICAgICAgdGhpcy5fICs9ICJNIiArIHgwICsgIiwiICsgeTA7CiAgICAgICAgfQoKICAgICAgICAvLyBPciwgaXMgKHgwLHkwKSBub3QgY29pbmNpZGVudCB3aXRoIHRoZSBwcmV2aW91cyBwb2ludD8gTGluZSB0byAoeDAseTApLgogICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKHRoaXMuX3gxIC0geDApID4gZXBzaWxvbiQ5IHx8IE1hdGguYWJzKHRoaXMuX3kxIC0geTApID4gZXBzaWxvbiQ5KSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkwiICsgeDAgKyAiLCIgKyB5MDsKICAgICAgICB9CgogICAgICAgIC8vIElzIHRoaXMgYXJjIGVtcHR5PyBXZeKAmXJlIGRvbmUuCiAgICAgICAgaWYgKCFyKSByZXR1cm47CgogICAgICAgIC8vIERvZXMgdGhlIGFuZ2xlIGdvIHRoZSB3cm9uZyB3YXk/IEZsaXAgdGhlIGRpcmVjdGlvbi4KICAgICAgICBpZiAoZGEgPCAwKSBkYSA9IGRhICUgdGF1JGEgKyB0YXUkYTsKCiAgICAgICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLgogICAgICAgIGlmIChkYSA+IHRhdUVwc2lsb24kMykgewogICAgICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLDEsIiArIGN3ICsgIiwiICsgKHggLSBkeCkgKyAiLCIgKyAoeSAtIGR5KSArICJBIiArIHIgKyAiLCIgKyByICsgIiwwLDEsIiArIGN3ICsgIiwiICsgKHRoaXMuX3gxID0geDApICsgIiwiICsgKHRoaXMuX3kxID0geTApOwogICAgICAgIH0KCiAgICAgICAgLy8gSXMgdGhpcyBhcmMgbm9uLWVtcHR5PyBEcmF3IGFuIGFyYyEKICAgICAgICBlbHNlIGlmIChkYSA+IGVwc2lsb24kOSkgewogICAgICAgICAgdGhpcy5fICs9ICJBIiArIHIgKyAiLCIgKyByICsgIiwwLCIgKyAoKyhkYSA+PSBwaSRhKSkgKyAiLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHggKyByICogTWF0aC5jb3MoYTEpKSArICIsIiArICh0aGlzLl95MSA9IHkgKyByICogTWF0aC5zaW4oYTEpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlY3Q6IGZ1bmN0aW9uKHgsIHksIHcsIGgpIHsKICAgICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KSArICJoIiArICgrdykgKyAidiIgKyAoK2gpICsgImgiICsgKC13KSArICJaIjsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl87CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gY29uc3RhbnQkcyh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbiBjb25zdGFudCgpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgYWJzJDMgPSBNYXRoLmFiczsKICAgIHZhciBhdGFuMiQzID0gTWF0aC5hdGFuMjsKICAgIHZhciBjb3MkNSA9IE1hdGguY29zOwogICAgdmFyIG1heCQ1ID0gTWF0aC5tYXg7CiAgICB2YXIgbWluJDMgPSBNYXRoLm1pbjsKICAgIHZhciBzaW4kNSA9IE1hdGguc2luOwogICAgdmFyIHNxcnQkNSA9IE1hdGguc3FydDsKCiAgICB2YXIgZXBzaWxvbiRhID0gMWUtMTI7CiAgICB2YXIgcGkkYiA9IE1hdGguUEk7CiAgICB2YXIgaGFsZlBpJDcgPSBwaSRiIC8gMjsKICAgIHZhciB0YXUkYiA9IDIgKiBwaSRiOwoKICAgIGZ1bmN0aW9uIGFjb3MkMyh4KSB7CiAgICAgIHJldHVybiB4ID4gMSA/IDAgOiB4IDwgLTEgPyBwaSRiIDogTWF0aC5hY29zKHgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzaW4kMyh4KSB7CiAgICAgIHJldHVybiB4ID49IDEgPyBoYWxmUGkkNyA6IHggPD0gLTEgPyAtaGFsZlBpJDcgOiBNYXRoLmFzaW4oeCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXJjSW5uZXJSYWRpdXMkMShkKSB7CiAgICAgIHJldHVybiBkLmlubmVyUmFkaXVzOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyY091dGVyUmFkaXVzJDEoZCkgewogICAgICByZXR1cm4gZC5vdXRlclJhZGl1czsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmNTdGFydEFuZ2xlJDEoZCkgewogICAgICByZXR1cm4gZC5zdGFydEFuZ2xlOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyY0VuZEFuZ2xlJDEoZCkgewogICAgICByZXR1cm4gZC5lbmRBbmdsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmNQYWRBbmdsZSQxKGQpIHsKICAgICAgcmV0dXJuIGQgJiYgZC5wYWRBbmdsZTsgLy8gTm90ZTogb3B0aW9uYWwhCiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJzZWN0JDEoeDAsIHkwLCB4MSwgeTEsIHgyLCB5MiwgeDMsIHkzKSB7CiAgICAgIHZhciB4MTAgPSB4MSAtIHgwLCB5MTAgPSB5MSAtIHkwLAogICAgICAgICAgeDMyID0geDMgLSB4MiwgeTMyID0geTMgLSB5MiwKICAgICAgICAgIHQgPSAoeDMyICogKHkwIC0geTIpIC0geTMyICogKHgwIC0geDIpKSAvICh5MzIgKiB4MTAgLSB4MzIgKiB5MTApOwogICAgICByZXR1cm4gW3gwICsgdCAqIHgxMCwgeTAgKyB0ICogeTEwXTsKICAgIH0KCiAgICAvLyBDb21wdXRlIHBlcnBlbmRpY3VsYXIgb2Zmc2V0IGxpbmUgb2YgbGVuZ3RoIHJjLgogICAgLy8gaHR0cDovL21hdGh3b3JsZC53b2xmcmFtLmNvbS9DaXJjbGUtTGluZUludGVyc2VjdGlvbi5odG1sCiAgICBmdW5jdGlvbiBjb3JuZXJUYW5nZW50cyQxKHgwLCB5MCwgeDEsIHkxLCByMSwgcmMsIGN3KSB7CiAgICAgIHZhciB4MDEgPSB4MCAtIHgxLAogICAgICAgICAgeTAxID0geTAgLSB5MSwKICAgICAgICAgIGxvID0gKGN3ID8gcmMgOiAtcmMpIC8gc3FydCQ1KHgwMSAqIHgwMSArIHkwMSAqIHkwMSksCiAgICAgICAgICBveCA9IGxvICogeTAxLAogICAgICAgICAgb3kgPSAtbG8gKiB4MDEsCiAgICAgICAgICB4MTEgPSB4MCArIG94LAogICAgICAgICAgeTExID0geTAgKyBveSwKICAgICAgICAgIHgxMCA9IHgxICsgb3gsCiAgICAgICAgICB5MTAgPSB5MSArIG95LAogICAgICAgICAgeDAwID0gKHgxMSArIHgxMCkgLyAyLAogICAgICAgICAgeTAwID0gKHkxMSArIHkxMCkgLyAyLAogICAgICAgICAgZHggPSB4MTAgLSB4MTEsCiAgICAgICAgICBkeSA9IHkxMCAtIHkxMSwKICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksCiAgICAgICAgICByID0gcjEgLSByYywKICAgICAgICAgIEQgPSB4MTEgKiB5MTAgLSB4MTAgKiB5MTEsCiAgICAgICAgICBkID0gKGR5IDwgMCA/IC0xIDogMSkgKiBzcXJ0JDUobWF4JDUoMCwgciAqIHIgKiBkMiAtIEQgKiBEKSksCiAgICAgICAgICBjeDAgPSAoRCAqIGR5IC0gZHggKiBkKSAvIGQyLAogICAgICAgICAgY3kwID0gKC1EICogZHggLSBkeSAqIGQpIC8gZDIsCiAgICAgICAgICBjeDEgPSAoRCAqIGR5ICsgZHggKiBkKSAvIGQyLAogICAgICAgICAgY3kxID0gKC1EICogZHggKyBkeSAqIGQpIC8gZDIsCiAgICAgICAgICBkeDAgPSBjeDAgLSB4MDAsCiAgICAgICAgICBkeTAgPSBjeTAgLSB5MDAsCiAgICAgICAgICBkeDEgPSBjeDEgLSB4MDAsCiAgICAgICAgICBkeTEgPSBjeTEgLSB5MDA7CgogICAgICAvLyBQaWNrIHRoZSBjbG9zZXIgb2YgdGhlIHR3byBpbnRlcnNlY3Rpb24gcG9pbnRzLgogICAgICAvLyBUT0RPIElzIHRoZXJlIGEgZmFzdGVyIHdheSB0byBkZXRlcm1pbmUgd2hpY2ggaW50ZXJzZWN0aW9uIHRvIHVzZT8KICAgICAgaWYgKGR4MCAqIGR4MCArIGR5MCAqIGR5MCA+IGR4MSAqIGR4MSArIGR5MSAqIGR5MSkgY3gwID0gY3gxLCBjeTAgPSBjeTE7CgogICAgICByZXR1cm4gewogICAgICAgIGN4OiBjeDAsCiAgICAgICAgY3k6IGN5MCwKICAgICAgICB4MDE6IC1veCwKICAgICAgICB5MDE6IC1veSwKICAgICAgICB4MTE6IGN4MCAqIChyMSAvIHIgLSAxKSwKICAgICAgICB5MTE6IGN5MCAqIChyMSAvIHIgLSAxKQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFyYyQxKCkgewogICAgICB2YXIgaW5uZXJSYWRpdXMgPSBhcmNJbm5lclJhZGl1cyQxLAogICAgICAgICAgb3V0ZXJSYWRpdXMgPSBhcmNPdXRlclJhZGl1cyQxLAogICAgICAgICAgY29ybmVyUmFkaXVzID0gY29uc3RhbnQkcygwKSwKICAgICAgICAgIHBhZFJhZGl1cyA9IG51bGwsCiAgICAgICAgICBzdGFydEFuZ2xlID0gYXJjU3RhcnRBbmdsZSQxLAogICAgICAgICAgZW5kQW5nbGUgPSBhcmNFbmRBbmdsZSQxLAogICAgICAgICAgcGFkQW5nbGUgPSBhcmNQYWRBbmdsZSQxLAogICAgICAgICAgY29udGV4dCA9IG51bGw7CgogICAgICBmdW5jdGlvbiBhcmMoKSB7CiAgICAgICAgdmFyIGJ1ZmZlciwKICAgICAgICAgICAgciwKICAgICAgICAgICAgcjAgPSAraW5uZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgcjEgPSArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgYTAgPSBzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLSBoYWxmUGkkNywKICAgICAgICAgICAgYTEgPSBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gaGFsZlBpJDcsCiAgICAgICAgICAgIGRhID0gYWJzJDMoYTEgLSBhMCksCiAgICAgICAgICAgIGN3ID0gYTEgPiBhMDsKCiAgICAgICAgaWYgKCFjb250ZXh0KSBjb250ZXh0ID0gYnVmZmVyID0gcGF0aCQzKCk7CgogICAgICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBvdXRlciByYWRpdXMgaXMgYWx3YXlzIGxhcmdlciB0aGFuIHRoZSBpbm5lciByYWRpdXMuCiAgICAgICAgaWYgKHIxIDwgcjApIHIgPSByMSwgcjEgPSByMCwgcjAgPSByOwoKICAgICAgICAvLyBJcyBpdCBhIHBvaW50PwogICAgICAgIGlmICghKHIxID4gZXBzaWxvbiRhKSkgY29udGV4dC5tb3ZlVG8oMCwgMCk7CgogICAgICAgIC8vIE9yIGlzIGl0IGEgY2lyY2xlIG9yIGFubnVsdXM/CiAgICAgICAgZWxzZSBpZiAoZGEgPiB0YXUkYiAtIGVwc2lsb24kYSkgewogICAgICAgICAgY29udGV4dC5tb3ZlVG8ocjEgKiBjb3MkNShhMCksIHIxICogc2luJDUoYTApKTsKICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhMCwgYTEsICFjdyk7CiAgICAgICAgICBpZiAocjAgPiBlcHNpbG9uJGEpIHsKICAgICAgICAgICAgY29udGV4dC5tb3ZlVG8ocjAgKiBjb3MkNShhMSksIHIwICogc2luJDUoYTEpKTsKICAgICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjAsIGExLCBhMCwgY3cpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT3IgaXMgaXQgYSBjaXJjdWxhciBvciBhbm51bGFyIHNlY3Rvcj8KICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBhMDEgPSBhMCwKICAgICAgICAgICAgICBhMTEgPSBhMSwKICAgICAgICAgICAgICBhMDAgPSBhMCwKICAgICAgICAgICAgICBhMTAgPSBhMSwKICAgICAgICAgICAgICBkYTAgPSBkYSwKICAgICAgICAgICAgICBkYTEgPSBkYSwKICAgICAgICAgICAgICBhcCA9IHBhZEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgLyAyLAogICAgICAgICAgICAgIHJwID0gKGFwID4gZXBzaWxvbiRhKSAmJiAocGFkUmFkaXVzID8gK3BhZFJhZGl1cy5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogc3FydCQ1KHIwICogcjAgKyByMSAqIHIxKSksCiAgICAgICAgICAgICAgcmMgPSBtaW4kMyhhYnMkMyhyMSAtIHIwKSAvIDIsICtjb3JuZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSksCiAgICAgICAgICAgICAgcmMwID0gcmMsCiAgICAgICAgICAgICAgcmMxID0gcmMsCiAgICAgICAgICAgICAgdDAsCiAgICAgICAgICAgICAgdDE7CgogICAgICAgICAgLy8gQXBwbHkgcGFkZGluZz8gTm90ZSB0aGF0IHNpbmNlIHIxIOKJpSByMCwgZGExIOKJpSBkYTAuCiAgICAgICAgICBpZiAocnAgPiBlcHNpbG9uJGEpIHsKICAgICAgICAgICAgdmFyIHAwID0gYXNpbiQzKHJwIC8gcjAgKiBzaW4kNShhcCkpLAogICAgICAgICAgICAgICAgcDEgPSBhc2luJDMocnAgLyByMSAqIHNpbiQ1KGFwKSk7CiAgICAgICAgICAgIGlmICgoZGEwIC09IHAwICogMikgPiBlcHNpbG9uJGEpIHAwICo9IChjdyA/IDEgOiAtMSksIGEwMCArPSBwMCwgYTEwIC09IHAwOwogICAgICAgICAgICBlbHNlIGRhMCA9IDAsIGEwMCA9IGExMCA9IChhMCArIGExKSAvIDI7CiAgICAgICAgICAgIGlmICgoZGExIC09IHAxICogMikgPiBlcHNpbG9uJGEpIHAxICo9IChjdyA/IDEgOiAtMSksIGEwMSArPSBwMSwgYTExIC09IHAxOwogICAgICAgICAgICBlbHNlIGRhMSA9IDAsIGEwMSA9IGExMSA9IChhMCArIGExKSAvIDI7CiAgICAgICAgICB9CgogICAgICAgICAgdmFyIHgwMSA9IHIxICogY29zJDUoYTAxKSwKICAgICAgICAgICAgICB5MDEgPSByMSAqIHNpbiQ1KGEwMSksCiAgICAgICAgICAgICAgeDEwID0gcjAgKiBjb3MkNShhMTApLAogICAgICAgICAgICAgIHkxMCA9IHIwICogc2luJDUoYTEwKTsKCiAgICAgICAgICAvLyBBcHBseSByb3VuZGVkIGNvcm5lcnM/CiAgICAgICAgICBpZiAocmMgPiBlcHNpbG9uJGEpIHsKICAgICAgICAgICAgdmFyIHgxMSA9IHIxICogY29zJDUoYTExKSwKICAgICAgICAgICAgICAgIHkxMSA9IHIxICogc2luJDUoYTExKSwKICAgICAgICAgICAgICAgIHgwMCA9IHIwICogY29zJDUoYTAwKSwKICAgICAgICAgICAgICAgIHkwMCA9IHIwICogc2luJDUoYTAwKTsKCiAgICAgICAgICAgIC8vIFJlc3RyaWN0IHRoZSBjb3JuZXIgcmFkaXVzIGFjY29yZGluZyB0byB0aGUgc2VjdG9yIGFuZ2xlLgogICAgICAgICAgICBpZiAoZGEgPCBwaSRiKSB7CiAgICAgICAgICAgICAgdmFyIG9jID0gZGEwID4gZXBzaWxvbiRhID8gaW50ZXJzZWN0JDEoeDAxLCB5MDEsIHgwMCwgeTAwLCB4MTEsIHkxMSwgeDEwLCB5MTApIDogW3gxMCwgeTEwXSwKICAgICAgICAgICAgICAgICAgYXggPSB4MDEgLSBvY1swXSwKICAgICAgICAgICAgICAgICAgYXkgPSB5MDEgLSBvY1sxXSwKICAgICAgICAgICAgICAgICAgYnggPSB4MTEgLSBvY1swXSwKICAgICAgICAgICAgICAgICAgYnkgPSB5MTEgLSBvY1sxXSwKICAgICAgICAgICAgICAgICAga2MgPSAxIC8gc2luJDUoYWNvcyQzKChheCAqIGJ4ICsgYXkgKiBieSkgLyAoc3FydCQ1KGF4ICogYXggKyBheSAqIGF5KSAqIHNxcnQkNShieCAqIGJ4ICsgYnkgKiBieSkpKSAvIDIpLAogICAgICAgICAgICAgICAgICBsYyA9IHNxcnQkNShvY1swXSAqIG9jWzBdICsgb2NbMV0gKiBvY1sxXSk7CiAgICAgICAgICAgICAgcmMwID0gbWluJDMocmMsIChyMCAtIGxjKSAvIChrYyAtIDEpKTsKICAgICAgICAgICAgICByYzEgPSBtaW4kMyhyYywgKHIxIC0gbGMpIC8gKGtjICsgMSkpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSXMgdGhlIHNlY3RvciBjb2xsYXBzZWQgdG8gYSBsaW5lPwogICAgICAgICAgaWYgKCEoZGExID4gZXBzaWxvbiRhKSkgY29udGV4dC5tb3ZlVG8oeDAxLCB5MDEpOwoKICAgICAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgb3V0ZXIgcmluZyBoYXZlIHJvdW5kZWQgY29ybmVycz8KICAgICAgICAgIGVsc2UgaWYgKHJjMSA+IGVwc2lsb24kYSkgewogICAgICAgICAgICB0MCA9IGNvcm5lclRhbmdlbnRzJDEoeDAwLCB5MDAsIHgwMSwgeTAxLCByMSwgcmMxLCBjdyk7CiAgICAgICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMkMSh4MTEsIHkxMSwgeDEwLCB5MTAsIHIxLCByYzEsIGN3KTsKCiAgICAgICAgICAgIGNvbnRleHQubW92ZVRvKHQwLmN4ICsgdDAueDAxLCB0MC5jeSArIHQwLnkwMSk7CgogICAgICAgICAgICAvLyBIYXZlIHRoZSBjb3JuZXJzIG1lcmdlZD8KICAgICAgICAgICAgaWYgKHJjMSA8IHJjKSBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMSwgYXRhbjIkMyh0MC55MDEsIHQwLngwMSksIGF0YW4yJDModDEueTAxLCB0MS54MDEpLCAhY3cpOwoKICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IHRoZSB0d28gY29ybmVycyBhbmQgdGhlIHJpbmcuCiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgIGNvbnRleHQuYXJjKHQwLmN4LCB0MC5jeSwgcmMxLCBhdGFuMiQzKHQwLnkwMSwgdDAueDAxKSwgYXRhbjIkMyh0MC55MTEsIHQwLngxMSksICFjdyk7CiAgICAgICAgICAgICAgY29udGV4dC5hcmMoMCwgMCwgcjEsIGF0YW4yJDModDAuY3kgKyB0MC55MTEsIHQwLmN4ICsgdDAueDExKSwgYXRhbjIkMyh0MS5jeSArIHQxLnkxMSwgdDEuY3ggKyB0MS54MTEpLCAhY3cpOwogICAgICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMxLCBhdGFuMiQzKHQxLnkxMSwgdDEueDExKSwgYXRhbjIkMyh0MS55MDEsIHQxLngwMSksICFjdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBPciBpcyB0aGUgb3V0ZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjPwogICAgICAgICAgZWxzZSBjb250ZXh0Lm1vdmVUbyh4MDEsIHkwMSksIGNvbnRleHQuYXJjKDAsIDAsIHIxLCBhMDEsIGExMSwgIWN3KTsKCiAgICAgICAgICAvLyBJcyB0aGVyZSBubyBpbm5lciByaW5nLCBhbmQgaXTigJlzIGEgY2lyY3VsYXIgc2VjdG9yPwogICAgICAgICAgLy8gT3IgcGVyaGFwcyBpdOKAmXMgYW4gYW5udWxhciBzZWN0b3IgY29sbGFwc2VkIGR1ZSB0byBwYWRkaW5nPwogICAgICAgICAgaWYgKCEocjAgPiBlcHNpbG9uJGEpIHx8ICEoZGEwID4gZXBzaWxvbiRhKSkgY29udGV4dC5saW5lVG8oeDEwLCB5MTApOwoKICAgICAgICAgIC8vIERvZXMgdGhlIHNlY3RvcuKAmXMgaW5uZXIgcmluZyAob3IgcG9pbnQpIGhhdmUgcm91bmRlZCBjb3JuZXJzPwogICAgICAgICAgZWxzZSBpZiAocmMwID4gZXBzaWxvbiRhKSB7CiAgICAgICAgICAgIHQwID0gY29ybmVyVGFuZ2VudHMkMSh4MTAsIHkxMCwgeDExLCB5MTEsIHIwLCAtcmMwLCBjdyk7CiAgICAgICAgICAgIHQxID0gY29ybmVyVGFuZ2VudHMkMSh4MDEsIHkwMSwgeDAwLCB5MDAsIHIwLCAtcmMwLCBjdyk7CgogICAgICAgICAgICBjb250ZXh0LmxpbmVUbyh0MC5jeCArIHQwLngwMSwgdDAuY3kgKyB0MC55MDEpOwoKICAgICAgICAgICAgLy8gSGF2ZSB0aGUgY29ybmVycyBtZXJnZWQ/CiAgICAgICAgICAgIGlmIChyYzAgPCByYykgY29udGV4dC5hcmModDAuY3gsIHQwLmN5LCByYzAsIGF0YW4yJDModDAueTAxLCB0MC54MDEpLCBhdGFuMiQzKHQxLnkwMSwgdDEueDAxKSwgIWN3KTsKCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgZHJhdyB0aGUgdHdvIGNvcm5lcnMgYW5kIHRoZSByaW5nLgogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICBjb250ZXh0LmFyYyh0MC5jeCwgdDAuY3ksIHJjMCwgYXRhbjIkMyh0MC55MDEsIHQwLngwMSksIGF0YW4yJDModDAueTExLCB0MC54MTEpLCAhY3cpOwogICAgICAgICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIwLCBhdGFuMiQzKHQwLmN5ICsgdDAueTExLCB0MC5jeCArIHQwLngxMSksIGF0YW4yJDModDEuY3kgKyB0MS55MTEsIHQxLmN4ICsgdDEueDExKSwgY3cpOwogICAgICAgICAgICAgIGNvbnRleHQuYXJjKHQxLmN4LCB0MS5jeSwgcmMwLCBhdGFuMiQzKHQxLnkxMSwgdDEueDExKSwgYXRhbjIkMyh0MS55MDEsIHQxLngwMSksICFjdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICAvLyBPciBpcyB0aGUgaW5uZXIgcmluZyBqdXN0IGEgY2lyY3VsYXIgYXJjPwogICAgICAgICAgZWxzZSBjb250ZXh0LmFyYygwLCAwLCByMCwgYTEwLCBhMDAsIGN3KTsKICAgICAgICB9CgogICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CgogICAgICAgIGlmIChidWZmZXIpIHJldHVybiBjb250ZXh0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICAgICAgfQoKICAgICAgYXJjLmNlbnRyb2lkID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHIgPSAoK2lubmVyUmFkaXVzLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArb3V0ZXJSYWRpdXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyLAogICAgICAgICAgICBhID0gKCtzdGFydEFuZ2xlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgKyArZW5kQW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgLyAyIC0gcGkkYiAvIDI7CiAgICAgICAgcmV0dXJuIFtjb3MkNShhKSAqIHIsIHNpbiQ1KGEpICogcl07CiAgICAgIH07CgogICAgICBhcmMuaW5uZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW5uZXJSYWRpdXMgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgYXJjKSA6IGlubmVyUmFkaXVzOwogICAgICB9OwoKICAgICAgYXJjLm91dGVyUmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG91dGVyUmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIGFyYykgOiBvdXRlclJhZGl1czsKICAgICAgfTsKCiAgICAgIGFyYy5jb3JuZXJSYWRpdXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY29ybmVyUmFkaXVzID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIGFyYykgOiBjb3JuZXJSYWRpdXM7CiAgICAgIH07CgogICAgICBhcmMucGFkUmFkaXVzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZFJhZGl1cyA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgYXJjKSA6IHBhZFJhZGl1czsKICAgICAgfTsKCiAgICAgIGFyYy5zdGFydEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHN0YXJ0QW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgYXJjKSA6IHN0YXJ0QW5nbGU7CiAgICAgIH07CgogICAgICBhcmMuZW5kQW5nbGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZW5kQW5nbGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgYXJjKSA6IGVuZEFuZ2xlOwogICAgICB9OwoKICAgICAgYXJjLnBhZEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIGFyYykgOiBwYWRBbmdsZTsKICAgICAgfTsKCiAgICAgIGFyYy5jb250ZXh0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8pLCBhcmMpIDogY29udGV4dDsKICAgICAgfTsKCiAgICAgIHJldHVybiBhcmM7CiAgICB9CgogICAgZnVuY3Rpb24gTGluZWFyJDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBMaW5lYXIkMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2VlZAogICAgICAgICAgZGVmYXVsdDogdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjdXJ2ZUxpbmVhciQxKGNvbnRleHQpIHsKICAgICAgcmV0dXJuIG5ldyBMaW5lYXIkMShjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiB4JDgocCkgewogICAgICByZXR1cm4gcFswXTsKICAgIH0KCiAgICBmdW5jdGlvbiB5JDgocCkgewogICAgICByZXR1cm4gcFsxXTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lJDEoKSB7CiAgICAgIHZhciB4ID0geCQ4LAogICAgICAgICAgeSA9IHkkOCwKICAgICAgICAgIGRlZmluZWQgPSBjb25zdGFudCRzKHRydWUpLAogICAgICAgICAgY29udGV4dCA9IG51bGwsCiAgICAgICAgICBjdXJ2ZSA9IGN1cnZlTGluZWFyJDEsCiAgICAgICAgICBvdXRwdXQgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gbGluZShkYXRhKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgZCwKICAgICAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSwKICAgICAgICAgICAgYnVmZmVyOwoKICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoJDMoKSk7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbjsgKytpKSB7CiAgICAgICAgICBpZiAoIShpIDwgbiAmJiBkZWZpbmVkKGQgPSBkYXRhW2ldLCBpLCBkYXRhKSkgPT09IGRlZmluZWQwKSB7CiAgICAgICAgICAgIGlmIChkZWZpbmVkMCA9ICFkZWZpbmVkMCkgb3V0cHV0LmxpbmVTdGFydCgpOwogICAgICAgICAgICBlbHNlIG91dHB1dC5saW5lRW5kKCk7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoZGVmaW5lZDApIG91dHB1dC5wb2ludCgreChkLCBpLCBkYXRhKSwgK3koZCwgaSwgZGF0YSkpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGJ1ZmZlcikgcmV0dXJuIG91dHB1dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIGxpbmUueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIGxpbmUpIDogeDsKICAgICAgfTsKCiAgICAgIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIGxpbmUpIDogeTsKICAgICAgfTsKCiAgICAgIGxpbmUuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcyghIV8pLCBsaW5lKSA6IGRlZmluZWQ7CiAgICAgIH07CgogICAgICBsaW5lLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGxpbmUpIDogY3VydmU7CiAgICAgIH07CgogICAgICBsaW5lLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGxpbmUpIDogY29udGV4dDsKICAgICAgfTsKCiAgICAgIHJldHVybiBsaW5lOwogICAgfQoKICAgIGZ1bmN0aW9uIGFyZWEkNigpIHsKICAgICAgdmFyIHgwID0geCQ4LAogICAgICAgICAgeDEgPSBudWxsLAogICAgICAgICAgeTAgPSBjb25zdGFudCRzKDApLAogICAgICAgICAgeTEgPSB5JDgsCiAgICAgICAgICBkZWZpbmVkID0gY29uc3RhbnQkcyh0cnVlKSwKICAgICAgICAgIGNvbnRleHQgPSBudWxsLAogICAgICAgICAgY3VydmUgPSBjdXJ2ZUxpbmVhciQxLAogICAgICAgICAgb3V0cHV0ID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIGFyZWEoZGF0YSkgewogICAgICAgIHZhciBpLAogICAgICAgICAgICBqLAogICAgICAgICAgICBrLAogICAgICAgICAgICBuID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIGQsCiAgICAgICAgICAgIGRlZmluZWQwID0gZmFsc2UsCiAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgeDB6ID0gbmV3IEFycmF5KG4pLAogICAgICAgICAgICB5MHogPSBuZXcgQXJyYXkobik7CgogICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIG91dHB1dCA9IGN1cnZlKGJ1ZmZlciA9IHBhdGgkMygpKTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8PSBuOyArK2kpIHsKICAgICAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHsKICAgICAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSB7CiAgICAgICAgICAgICAgaiA9IGk7CiAgICAgICAgICAgICAgb3V0cHV0LmFyZWFTdGFydCgpOwogICAgICAgICAgICAgIG91dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgICAgIG91dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBmb3IgKGsgPSBpIC0gMTsgayA+PSBqOyAtLWspIHsKICAgICAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MHpba10sIHkweltrXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7CiAgICAgICAgICAgICAgb3V0cHV0LmFyZWFFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmluZWQwKSB7CiAgICAgICAgICAgIHgweltpXSA9ICt4MChkLCBpLCBkYXRhKSwgeTB6W2ldID0gK3kwKGQsIGksIGRhdGEpOwogICAgICAgICAgICBvdXRwdXQucG9pbnQoeDEgPyAreDEoZCwgaSwgZGF0YSkgOiB4MHpbaV0sIHkxID8gK3kxKGQsIGksIGRhdGEpIDogeTB6W2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOwogICAgICB9CgogICAgICBmdW5jdGlvbiBhcmVhbGluZSgpIHsKICAgICAgICByZXR1cm4gbGluZSQxKCkuZGVmaW5lZChkZWZpbmVkKS5jdXJ2ZShjdXJ2ZSkuY29udGV4dChjb250ZXh0KTsKICAgICAgfQoKICAgICAgYXJlYS54ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIHgxID0gbnVsbCwgYXJlYSkgOiB4MDsKICAgICAgfTsKCiAgICAgIGFyZWEueDAgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgYXJlYSkgOiB4MDsKICAgICAgfTsKCiAgICAgIGFyZWEueDEgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeDEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIGFyZWEpIDogeDE7CiAgICAgIH07CgogICAgICBhcmVhLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgeTEgPSBudWxsLCBhcmVhKSA6IHkwOwogICAgICB9OwoKICAgICAgYXJlYS55MCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHMoK18pLCBhcmVhKSA6IHkwOwogICAgICB9OwoKICAgICAgYXJlYS55MSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5MSA9IF8gPT0gbnVsbCA/IG51bGwgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgYXJlYSkgOiB5MTsKICAgICAgfTsKCiAgICAgIGFyZWEubGluZVgwID0KICAgICAgYXJlYS5saW5lWTAgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgwKS55KHkwKTsKICAgICAgfTsKCiAgICAgIGFyZWEubGluZVkxID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MSk7CiAgICAgIH07CgogICAgICBhcmVhLmxpbmVYMSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBhcmVhbGluZSgpLngoeDEpLnkoeTApOwogICAgICB9OwoKICAgICAgYXJlYS5kZWZpbmVkID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGRlZmluZWQgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCEhXyksIGFyZWEpIDogZGVmaW5lZDsKICAgICAgfTsKCiAgICAgIGFyZWEuY3VydmUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoY3VydmUgPSBfLCBjb250ZXh0ICE9IG51bGwgJiYgKG91dHB1dCA9IGN1cnZlKGNvbnRleHQpKSwgYXJlYSkgOiBjdXJ2ZTsKICAgICAgfTsKCiAgICAgIGFyZWEuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChfID09IG51bGwgPyBjb250ZXh0ID0gb3V0cHV0ID0gbnVsbCA6IG91dHB1dCA9IGN1cnZlKGNvbnRleHQgPSBfKSwgYXJlYSkgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIGFyZWE7CiAgICB9CgogICAgZnVuY3Rpb24gZGVzY2VuZGluZyQ0KGEsIGIpIHsKICAgICAgcmV0dXJuIGIgPCBhID8gLTEgOiBiID4gYSA/IDEgOiBiID49IGEgPyAwIDogTmFOOwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JGooZCkgewogICAgICByZXR1cm4gZDsKICAgIH0KCiAgICBmdW5jdGlvbiBwaWUkMSgpIHsKICAgICAgdmFyIHZhbHVlID0gaWRlbnRpdHkkaiwKICAgICAgICAgIHNvcnRWYWx1ZXMgPSBkZXNjZW5kaW5nJDQsCiAgICAgICAgICBzb3J0ID0gbnVsbCwKICAgICAgICAgIHN0YXJ0QW5nbGUgPSBjb25zdGFudCRzKDApLAogICAgICAgICAgZW5kQW5nbGUgPSBjb25zdGFudCRzKHRhdSRiKSwKICAgICAgICAgIHBhZEFuZ2xlID0gY29uc3RhbnQkcygwKTsKCiAgICAgIGZ1bmN0aW9uIHBpZShkYXRhKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgaiwKICAgICAgICAgICAgaywKICAgICAgICAgICAgc3VtID0gMCwKICAgICAgICAgICAgaW5kZXggPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGFyY3MgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGEwID0gK3N0YXJ0QW5nbGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgZGEgPSBNYXRoLm1pbih0YXUkYiwgTWF0aC5tYXgoLXRhdSRiLCBlbmRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIC0gYTApKSwKICAgICAgICAgICAgYTEsCiAgICAgICAgICAgIHAgPSBNYXRoLm1pbihNYXRoLmFicyhkYSkgLyBuLCBwYWRBbmdsZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSwKICAgICAgICAgICAgcGEgPSBwICogKGRhIDwgMCA/IC0xIDogMSksCiAgICAgICAgICAgIHY7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgodiA9IGFyY3NbaW5kZXhbaV0gPSBpXSA9ICt2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKSkgPiAwKSB7CiAgICAgICAgICAgIHN1bSArPSB2OwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gT3B0aW9uYWxseSBzb3J0IHRoZSBhcmNzIGJ5IHByZXZpb3VzbHktY29tcHV0ZWQgdmFsdWVzIG9yIGJ5IGRhdGEuCiAgICAgICAgaWYgKHNvcnRWYWx1ZXMgIT0gbnVsbCkgaW5kZXguc29ydChmdW5jdGlvbihpLCBqKSB7IHJldHVybiBzb3J0VmFsdWVzKGFyY3NbaV0sIGFyY3Nbal0pOyB9KTsKICAgICAgICBlbHNlIGlmIChzb3J0ICE9IG51bGwpIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gc29ydChkYXRhW2ldLCBkYXRhW2pdKTsgfSk7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIGFyY3MhIFRoZXkgYXJlIHN0b3JlZCBpbiB0aGUgb3JpZ2luYWwgZGF0YSdzIG9yZGVyLgogICAgICAgIGZvciAoaSA9IDAsIGsgPSBzdW0gPyAoZGEgLSBuICogcGEpIC8gc3VtIDogMDsgaSA8IG47ICsraSwgYTAgPSBhMSkgewogICAgICAgICAgaiA9IGluZGV4W2ldLCB2ID0gYXJjc1tqXSwgYTEgPSBhMCArICh2ID4gMCA/IHYgKiBrIDogMCkgKyBwYSwgYXJjc1tqXSA9IHsKICAgICAgICAgICAgZGF0YTogZGF0YVtqXSwKICAgICAgICAgICAgaW5kZXg6IGksCiAgICAgICAgICAgIHZhbHVlOiB2LAogICAgICAgICAgICBzdGFydEFuZ2xlOiBhMCwKICAgICAgICAgICAgZW5kQW5nbGU6IGExLAogICAgICAgICAgICBwYWRBbmdsZTogcAogICAgICAgICAgfTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBhcmNzOwogICAgICB9CgogICAgICBwaWUudmFsdWUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodmFsdWUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgcGllKSA6IHZhbHVlOwogICAgICB9OwoKICAgICAgcGllLnNvcnRWYWx1ZXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc29ydFZhbHVlcyA9IF8sIHNvcnQgPSBudWxsLCBwaWUpIDogc29ydFZhbHVlczsKICAgICAgfTsKCiAgICAgIHBpZS5zb3J0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvcnQgPSBfLCBzb3J0VmFsdWVzID0gbnVsbCwgcGllKSA6IHNvcnQ7CiAgICAgIH07CgogICAgICBwaWUuc3RhcnRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzdGFydEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIHBpZSkgOiBzdGFydEFuZ2xlOwogICAgICB9OwoKICAgICAgcGllLmVuZEFuZ2xlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGVuZEFuZ2xlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIHBpZSkgOiBlbmRBbmdsZTsKICAgICAgfTsKCiAgICAgIHBpZS5wYWRBbmdsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRBbmdsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHMoK18pLCBwaWUpIDogcGFkQW5nbGU7CiAgICAgIH07CgogICAgICByZXR1cm4gcGllOwogICAgfQoKICAgIHZhciBjdXJ2ZVJhZGlhbExpbmVhciQxID0gY3VydmVSYWRpYWwkMihjdXJ2ZUxpbmVhciQxKTsKCiAgICBmdW5jdGlvbiBSYWRpYWwkMShjdXJ2ZSkgewogICAgICB0aGlzLl9jdXJ2ZSA9IGN1cnZlOwogICAgfQoKICAgIFJhZGlhbCQxLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9jdXJ2ZS5hcmVhU3RhcnQoKTsKICAgICAgfSwKICAgICAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fY3VydmUuYXJlYUVuZCgpOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2N1cnZlLmxpbmVTdGFydCgpOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9jdXJ2ZS5saW5lRW5kKCk7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbihhLCByKSB7CiAgICAgICAgdGhpcy5fY3VydmUucG9pbnQociAqIE1hdGguc2luKGEpLCByICogLU1hdGguY29zKGEpKTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjdXJ2ZVJhZGlhbCQyKGN1cnZlKSB7CgogICAgICBmdW5jdGlvbiByYWRpYWwoY29udGV4dCkgewogICAgICAgIHJldHVybiBuZXcgUmFkaWFsJDEoY3VydmUoY29udGV4dCkpOwogICAgICB9CgogICAgICByYWRpYWwuX2N1cnZlID0gY3VydmU7CgogICAgICByZXR1cm4gcmFkaWFsOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVSYWRpYWwkMihsKSB7CiAgICAgIHZhciBjID0gbC5jdXJ2ZTsKCiAgICAgIGwuYW5nbGUgPSBsLngsIGRlbGV0ZSBsLng7CiAgICAgIGwucmFkaXVzID0gbC55LCBkZWxldGUgbC55OwoKICAgICAgbC5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGMoY3VydmVSYWRpYWwkMihfKSkgOiBjKCkuX2N1cnZlOwogICAgICB9OwoKICAgICAgcmV0dXJuIGw7CiAgICB9CgogICAgZnVuY3Rpb24gbGluZVJhZGlhbCQzKCkgewogICAgICByZXR1cm4gbGluZVJhZGlhbCQyKGxpbmUkMSgpLmN1cnZlKGN1cnZlUmFkaWFsTGluZWFyJDEpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhUmFkaWFsJDEoKSB7CiAgICAgIHZhciBhID0gYXJlYSQ2KCkuY3VydmUoY3VydmVSYWRpYWxMaW5lYXIkMSksCiAgICAgICAgICBjID0gYS5jdXJ2ZSwKICAgICAgICAgIHgwID0gYS5saW5lWDAsCiAgICAgICAgICB4MSA9IGEubGluZVgxLAogICAgICAgICAgeTAgPSBhLmxpbmVZMCwKICAgICAgICAgIHkxID0gYS5saW5lWTE7CgogICAgICBhLmFuZ2xlID0gYS54LCBkZWxldGUgYS54OwogICAgICBhLnN0YXJ0QW5nbGUgPSBhLngwLCBkZWxldGUgYS54MDsKICAgICAgYS5lbmRBbmdsZSA9IGEueDEsIGRlbGV0ZSBhLngxOwogICAgICBhLnJhZGl1cyA9IGEueSwgZGVsZXRlIGEueTsKICAgICAgYS5pbm5lclJhZGl1cyA9IGEueTAsIGRlbGV0ZSBhLnkwOwogICAgICBhLm91dGVyUmFkaXVzID0gYS55MSwgZGVsZXRlIGEueTE7CiAgICAgIGEubGluZVN0YXJ0QW5nbGUgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwkMih4MCgpKTsgfSwgZGVsZXRlIGEubGluZVgwOwogICAgICBhLmxpbmVFbmRBbmdsZSA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gbGluZVJhZGlhbCQyKHgxKCkpOyB9LCBkZWxldGUgYS5saW5lWDE7CiAgICAgIGEubGluZUlubmVyUmFkaXVzID0gZnVuY3Rpb24oKSB7IHJldHVybiBsaW5lUmFkaWFsJDIoeTAoKSk7IH0sIGRlbGV0ZSBhLmxpbmVZMDsKICAgICAgYS5saW5lT3V0ZXJSYWRpdXMgPSBmdW5jdGlvbigpIHsgcmV0dXJuIGxpbmVSYWRpYWwkMih5MSgpKTsgfSwgZGVsZXRlIGEubGluZVkxOwoKICAgICAgYS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IGMoY3VydmVSYWRpYWwkMihfKSkgOiBjKCkuX2N1cnZlOwogICAgICB9OwoKICAgICAgcmV0dXJuIGE7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnRSYWRpYWwkMSh4LCB5KSB7CiAgICAgIHJldHVybiBbKHkgPSAreSkgKiBNYXRoLmNvcyh4IC09IE1hdGguUEkgLyAyKSwgeSAqIE1hdGguc2luKHgpXTsKICAgIH0KCiAgICB2YXIgc2xpY2UkZCA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCiAgICBmdW5jdGlvbiBsaW5rU291cmNlJDEoZCkgewogICAgICByZXR1cm4gZC5zb3VyY2U7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua1RhcmdldCQxKGQpIHsKICAgICAgcmV0dXJuIGQudGFyZ2V0OwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmskNShjdXJ2ZSkgewogICAgICB2YXIgc291cmNlID0gbGlua1NvdXJjZSQxLAogICAgICAgICAgdGFyZ2V0ID0gbGlua1RhcmdldCQxLAogICAgICAgICAgeCA9IHgkOCwKICAgICAgICAgIHkgPSB5JDgsCiAgICAgICAgICBjb250ZXh0ID0gbnVsbDsKCiAgICAgIGZ1bmN0aW9uIGxpbmsoKSB7CiAgICAgICAgdmFyIGJ1ZmZlciwgYXJndiA9IHNsaWNlJGQuY2FsbChhcmd1bWVudHMpLCBzID0gc291cmNlLmFwcGx5KHRoaXMsIGFyZ3YpLCB0ID0gdGFyZ2V0LmFwcGx5KHRoaXMsIGFyZ3YpOwogICAgICAgIGlmICghY29udGV4dCkgY29udGV4dCA9IGJ1ZmZlciA9IHBhdGgkMygpOwogICAgICAgIGN1cnZlKGNvbnRleHQsICt4LmFwcGx5KHRoaXMsIChhcmd2WzBdID0gcywgYXJndikpLCAreS5hcHBseSh0aGlzLCBhcmd2KSwgK3guYXBwbHkodGhpcywgKGFyZ3ZbMF0gPSB0LCBhcmd2KSksICt5LmFwcGx5KHRoaXMsIGFyZ3YpKTsKICAgICAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIGxpbmsuc291cmNlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNvdXJjZSA9IF8sIGxpbmspIDogc291cmNlOwogICAgICB9OwoKICAgICAgbGluay50YXJnZXQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGFyZ2V0ID0gXywgbGluaykgOiB0YXJnZXQ7CiAgICAgIH07CgogICAgICBsaW5rLnggPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHMoK18pLCBsaW5rKSA6IHg7CiAgICAgIH07CgogICAgICBsaW5rLnkgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHMoK18pLCBsaW5rKSA6IHk7CiAgICAgIH07CgogICAgICBsaW5rLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoKGNvbnRleHQgPSBfID09IG51bGwgPyBudWxsIDogXyksIGxpbmspIDogY29udGV4dDsKICAgICAgfTsKCiAgICAgIHJldHVybiBsaW5rOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1cnZlSG9yaXpvbnRhbCQxKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7CiAgICAgIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCA9ICh4MCArIHgxKSAvIDIsIHkwLCB4MCwgeTEsIHgxLCB5MSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3VydmVWZXJ0aWNhbCQxKGNvbnRleHQsIHgwLCB5MCwgeDEsIHkxKSB7CiAgICAgIGNvbnRleHQubW92ZVRvKHgwLCB5MCk7CiAgICAgIGNvbnRleHQuYmV6aWVyQ3VydmVUbyh4MCwgeTAgPSAoeTAgKyB5MSkgLyAyLCB4MSwgeTAsIHgxLCB5MSk7CiAgICB9CgogICAgZnVuY3Rpb24gY3VydmVSYWRpYWwkMyhjb250ZXh0LCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgcDAgPSBwb2ludFJhZGlhbCQxKHgwLCB5MCksCiAgICAgICAgICBwMSA9IHBvaW50UmFkaWFsJDEoeDAsIHkwID0gKHkwICsgeTEpIC8gMiksCiAgICAgICAgICBwMiA9IHBvaW50UmFkaWFsJDEoeDEsIHkwKSwKICAgICAgICAgIHAzID0gcG9pbnRSYWRpYWwkMSh4MSwgeTEpOwogICAgICBjb250ZXh0Lm1vdmVUbyhwMFswXSwgcDBbMV0pOwogICAgICBjb250ZXh0LmJlemllckN1cnZlVG8ocDFbMF0sIHAxWzFdLCBwMlswXSwgcDJbMV0sIHAzWzBdLCBwM1sxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua0hvcml6b250YWwkMSgpIHsKICAgICAgcmV0dXJuIGxpbmskNShjdXJ2ZUhvcml6b250YWwkMSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGlua1ZlcnRpY2FsJDEoKSB7CiAgICAgIHJldHVybiBsaW5rJDUoY3VydmVWZXJ0aWNhbCQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5rUmFkaWFsJDEoKSB7CiAgICAgIHZhciBsID0gbGluayQ1KGN1cnZlUmFkaWFsJDMpOwogICAgICBsLmFuZ2xlID0gbC54LCBkZWxldGUgbC54OwogICAgICBsLnJhZGl1cyA9IGwueSwgZGVsZXRlIGwueTsKICAgICAgcmV0dXJuIGw7CiAgICB9CgogICAgdmFyIGNpcmNsZSQ1ID0gewogICAgICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAvIHBpJGIpOwogICAgICAgIGNvbnRleHQubW92ZVRvKHIsIDApOwogICAgICAgIGNvbnRleHQuYXJjKDAsIDAsIHIsIDAsIHRhdSRiKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgY3Jvc3MkNSA9IHsKICAgICAgZHJhdzogZnVuY3Rpb24oY29udGV4dCwgc2l6ZSkgewogICAgICAgIHZhciByID0gTWF0aC5zcXJ0KHNpemUgLyA1KSAvIDI7CiAgICAgICAgY29udGV4dC5tb3ZlVG8oLTMgKiByLCAtcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oLXIsIC1yKTsKICAgICAgICBjb250ZXh0LmxpbmVUbygtciwgLTMgKiByKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhyLCAtMyAqIHIpOwogICAgICAgIGNvbnRleHQubGluZVRvKHIsIC1yKTsKICAgICAgICBjb250ZXh0LmxpbmVUbygzICogciwgLXIpOwogICAgICAgIGNvbnRleHQubGluZVRvKDMgKiByLCByKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhyLCByKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhyLCAzICogcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oLXIsIDMgKiByKTsKICAgICAgICBjb250ZXh0LmxpbmVUbygtciwgcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oLTMgKiByLCByKTsKICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICB9CiAgICB9OwoKICAgIHZhciB0YW4zMCQxID0gTWF0aC5zcXJ0KDEgLyAzKSwKICAgICAgICB0YW4zMF8yJDEgPSB0YW4zMCQxICogMjsKCiAgICB2YXIgZGlhbW9uZCQxID0gewogICAgICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICAgICAgdmFyIHkgPSBNYXRoLnNxcnQoc2l6ZSAvIHRhbjMwXzIkMSksCiAgICAgICAgICAgIHggPSB5ICogdGFuMzAkMTsKICAgICAgICBjb250ZXh0Lm1vdmVUbygwLCAteSk7CiAgICAgICAgY29udGV4dC5saW5lVG8oeCwgMCk7CiAgICAgICAgY29udGV4dC5saW5lVG8oMCwgeSk7CiAgICAgICAgY29udGV4dC5saW5lVG8oLXgsIDApOwogICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGthJDEgPSAwLjg5MDgxMzA5MTUyOTI4NTIyODEwLAogICAgICAgIGtyJDEgPSBNYXRoLnNpbihwaSRiIC8gMTApIC8gTWF0aC5zaW4oNyAqIHBpJGIgLyAxMCksCiAgICAgICAga3gkMSA9IE1hdGguc2luKHRhdSRiIC8gMTApICoga3IkMSwKICAgICAgICBreSQxID0gLU1hdGguY29zKHRhdSRiIC8gMTApICoga3IkMTsKCiAgICB2YXIgc3RhciQxID0gewogICAgICBkcmF3OiBmdW5jdGlvbihjb250ZXh0LCBzaXplKSB7CiAgICAgICAgdmFyIHIgPSBNYXRoLnNxcnQoc2l6ZSAqIGthJDEpLAogICAgICAgICAgICB4ID0ga3gkMSAqIHIsCiAgICAgICAgICAgIHkgPSBreSQxICogcjsKICAgICAgICBjb250ZXh0Lm1vdmVUbygwLCAtcik7CiAgICAgICAgY29udGV4dC5saW5lVG8oeCwgeSk7CiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCA1OyArK2kpIHsKICAgICAgICAgIHZhciBhID0gdGF1JGIgKiBpIC8gNSwKICAgICAgICAgICAgICBjID0gTWF0aC5jb3MoYSksCiAgICAgICAgICAgICAgcyA9IE1hdGguc2luKGEpOwogICAgICAgICAgY29udGV4dC5saW5lVG8ocyAqIHIsIC1jICogcik7CiAgICAgICAgICBjb250ZXh0LmxpbmVUbyhjICogeCAtIHMgKiB5LCBzICogeCArIGMgKiB5KTsKICAgICAgICB9CiAgICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgc3F1YXJlJDEgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgdyA9IE1hdGguc3FydChzaXplKSwKICAgICAgICAgICAgeCA9IC13IC8gMjsKICAgICAgICBjb250ZXh0LnJlY3QoeCwgeCwgdywgdyk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIHNxcnQzJDEgPSBNYXRoLnNxcnQoMyk7CgogICAgdmFyIHRyaWFuZ2xlJDEgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgeSA9IC1NYXRoLnNxcnQoc2l6ZSAvIChzcXJ0MyQxICogMykpOwogICAgICAgIGNvbnRleHQubW92ZVRvKDAsIHkgKiAyKTsKICAgICAgICBjb250ZXh0LmxpbmVUbygtc3FydDMkMSAqIHksIC15KTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhzcXJ0MyQxICogeSwgLXkpOwogICAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGMkMyA9IC0wLjUsCiAgICAgICAgcyQxID0gTWF0aC5zcXJ0KDMpIC8gMiwKICAgICAgICBrJDEgPSAxIC8gTWF0aC5zcXJ0KDEyKSwKICAgICAgICBhJDEgPSAoayQxIC8gMiArIDEpICogMzsKCiAgICB2YXIgd3llJDEgPSB7CiAgICAgIGRyYXc6IGZ1bmN0aW9uKGNvbnRleHQsIHNpemUpIHsKICAgICAgICB2YXIgciA9IE1hdGguc3FydChzaXplIC8gYSQxKSwKICAgICAgICAgICAgeDAgPSByIC8gMiwKICAgICAgICAgICAgeTAgPSByICogayQxLAogICAgICAgICAgICB4MSA9IHgwLAogICAgICAgICAgICB5MSA9IHIgKiBrJDEgKyByLAogICAgICAgICAgICB4MiA9IC14MSwKICAgICAgICAgICAgeTIgPSB5MTsKICAgICAgICBjb250ZXh0Lm1vdmVUbyh4MCwgeTApOwogICAgICAgIGNvbnRleHQubGluZVRvKHgxLCB5MSk7CiAgICAgICAgY29udGV4dC5saW5lVG8oeDIsIHkyKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDMgKiB4MCAtIHMkMSAqIHkwLCBzJDEgKiB4MCArIGMkMyAqIHkwKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDMgKiB4MSAtIHMkMSAqIHkxLCBzJDEgKiB4MSArIGMkMyAqIHkxKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDMgKiB4MiAtIHMkMSAqIHkyLCBzJDEgKiB4MiArIGMkMyAqIHkyKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDMgKiB4MCArIHMkMSAqIHkwLCBjJDMgKiB5MCAtIHMkMSAqIHgwKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDMgKiB4MSArIHMkMSAqIHkxLCBjJDMgKiB5MSAtIHMkMSAqIHgxKTsKICAgICAgICBjb250ZXh0LmxpbmVUbyhjJDMgKiB4MiArIHMkMSAqIHkyLCBjJDMgKiB5MiAtIHMkMSAqIHgyKTsKICAgICAgICBjb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICB9CiAgICB9OwoKICAgIHZhciBzeW1ib2xzJDEgPSBbCiAgICAgIGNpcmNsZSQ1LAogICAgICBjcm9zcyQ1LAogICAgICBkaWFtb25kJDEsCiAgICAgIHNxdWFyZSQxLAogICAgICBzdGFyJDEsCiAgICAgIHRyaWFuZ2xlJDEsCiAgICAgIHd5ZSQxCiAgICBdOwoKICAgIGZ1bmN0aW9uIHN5bWJvbCQxKCkgewogICAgICB2YXIgdHlwZSA9IGNvbnN0YW50JHMoY2lyY2xlJDUpLAogICAgICAgICAgc2l6ZSA9IGNvbnN0YW50JHMoNjQpLAogICAgICAgICAgY29udGV4dCA9IG51bGw7CgogICAgICBmdW5jdGlvbiBzeW1ib2woKSB7CiAgICAgICAgdmFyIGJ1ZmZlcjsKICAgICAgICBpZiAoIWNvbnRleHQpIGNvbnRleHQgPSBidWZmZXIgPSBwYXRoJDMoKTsKICAgICAgICB0eXBlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykuZHJhdyhjb250ZXh0LCArc2l6ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICBpZiAoYnVmZmVyKSByZXR1cm4gY29udGV4dCA9IG51bGwsIGJ1ZmZlciArICIiIHx8IG51bGw7CiAgICAgIH0KCiAgICAgIHN5bWJvbC50eXBlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHR5cGUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKF8pLCBzeW1ib2wpIDogdHlwZTsKICAgICAgfTsKCiAgICAgIHN5bWJvbC5zaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHNpemUgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKCtfKSwgc3ltYm9sKSA6IHNpemU7CiAgICAgIH07CgogICAgICBzeW1ib2wuY29udGV4dCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjb250ZXh0ID0gXyA9PSBudWxsID8gbnVsbCA6IF8sIHN5bWJvbCkgOiBjb250ZXh0OwogICAgICB9OwoKICAgICAgcmV0dXJuIHN5bWJvbDsKICAgIH0KCiAgICBmdW5jdGlvbiBub29wJDkoKSB7fQoKICAgIGZ1bmN0aW9uIHBvaW50JGEodGhhdCwgeCwgeSkgewogICAgICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oCiAgICAgICAgKDIgKiB0aGF0Ll94MCArIHRoYXQuX3gxKSAvIDMsCiAgICAgICAgKDIgKiB0aGF0Ll95MCArIHRoYXQuX3kxKSAvIDMsCiAgICAgICAgKHRoYXQuX3gwICsgMiAqIHRoYXQuX3gxKSAvIDMsCiAgICAgICAgKHRoYXQuX3kwICsgMiAqIHRoYXQuX3kxKSAvIDMsCiAgICAgICAgKHRoYXQuX3gwICsgNCAqIHRoYXQuX3gxICsgeCkgLyA2LAogICAgICAgICh0aGF0Ll95MCArIDQgKiB0aGF0Ll95MSArIHkpIC8gNgogICAgICApOwogICAgfQoKICAgIGZ1bmN0aW9uIEJhc2lzJDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBCYXNpcyQxLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAzOiBwb2ludCRhKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IC8vIHByb2NlZWQKICAgICAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDEsIHRoaXMuX3kxKTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9jb250ZXh0LmxpbmVUbygoNSAqIHRoaXMuX3gwICsgdGhpcy5feDEpIC8gNiwgKDUgKiB0aGlzLl95MCArIHRoaXMuX3kxKSAvIDYpOyAvLyBwcm9jZWVkCiAgICAgICAgICBkZWZhdWx0OiBwb2ludCRhKHRoaXMsIHgsIHkpOyBicmVhazsKICAgICAgICB9CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB4OwogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0geTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBiYXNpcyQ1KGNvbnRleHQpIHsKICAgICAgcmV0dXJuIG5ldyBCYXNpcyQxKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIEJhc2lzQ2xvc2VkJDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBCYXNpc0Nsb3NlZCQxLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBub29wJDksCiAgICAgIGFyZWFFbmQ6IG5vb3AkOSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPSB0aGlzLl94MyA9IHRoaXMuX3g0ID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKCh0aGlzLl94MiArIDIgKiB0aGlzLl94MykgLyAzLCAodGhpcy5feTIgKyAyICogdGhpcy5feTMpIC8gMyk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKCh0aGlzLl94MyArIDIgKiB0aGlzLl94MikgLyAzLCAodGhpcy5feTMgKyAyICogdGhpcy5feTIpIC8gMyk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgIHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTsKICAgICAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5feDIgPSB4LCB0aGlzLl95MiA9IHk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IHRoaXMuX3gzID0geCwgdGhpcy5feTMgPSB5OyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NCA9IHgsIHRoaXMuX3k0ID0geTsgdGhpcy5fY29udGV4dC5tb3ZlVG8oKHRoaXMuX3gwICsgNCAqIHRoaXMuX3gxICsgeCkgLyA2LCAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDYpOyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JGEodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB5OwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGJhc2lzQ2xvc2VkJDMoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IEJhc2lzQ2xvc2VkJDEoY29udGV4dCk7CiAgICB9CgogICAgZnVuY3Rpb24gQmFzaXNPcGVuJDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBCYXNpc09wZW4kMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IE5hTjsKICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAzKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IHZhciB4MCA9ICh0aGlzLl94MCArIDQgKiB0aGlzLl94MSArIHgpIC8gNiwgeTAgPSAodGhpcy5feTAgKyA0ICogdGhpcy5feTEgKyB5KSAvIDY7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MCwgeTApIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeDAsIHkwKTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6IHRoaXMuX3BvaW50ID0gNDsgLy8gcHJvY2VlZAogICAgICAgICAgZGVmYXVsdDogcG9pbnQkYSh0aGlzLCB4LCB5KTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDsKICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gYmFzaXNPcGVuJDEoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IEJhc2lzT3BlbiQxKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIEJ1bmRsZSQxKGNvbnRleHQsIGJldGEpIHsKICAgICAgdGhpcy5fYmFzaXMgPSBuZXcgQmFzaXMkMShjb250ZXh0KTsKICAgICAgdGhpcy5fYmV0YSA9IGJldGE7CiAgICB9CgogICAgQnVuZGxlJDEucHJvdG90eXBlID0gewogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3ggPSBbXTsKICAgICAgICB0aGlzLl95ID0gW107CiAgICAgICAgdGhpcy5fYmFzaXMubGluZVN0YXJ0KCk7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB4ID0gdGhpcy5feCwKICAgICAgICAgICAgeSA9IHRoaXMuX3ksCiAgICAgICAgICAgIGogPSB4Lmxlbmd0aCAtIDE7CgogICAgICAgIGlmIChqID4gMCkgewogICAgICAgICAgdmFyIHgwID0geFswXSwKICAgICAgICAgICAgICB5MCA9IHlbMF0sCiAgICAgICAgICAgICAgZHggPSB4W2pdIC0geDAsCiAgICAgICAgICAgICAgZHkgPSB5W2pdIC0geTAsCiAgICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICAgIHQ7CgogICAgICAgICAgd2hpbGUgKCsraSA8PSBqKSB7CiAgICAgICAgICAgIHQgPSBpIC8gajsKICAgICAgICAgICAgdGhpcy5fYmFzaXMucG9pbnQoCiAgICAgICAgICAgICAgdGhpcy5fYmV0YSAqIHhbaV0gKyAoMSAtIHRoaXMuX2JldGEpICogKHgwICsgdCAqIGR4KSwKICAgICAgICAgICAgICB0aGlzLl9iZXRhICogeVtpXSArICgxIC0gdGhpcy5fYmV0YSkgKiAoeTAgKyB0ICogZHkpCiAgICAgICAgICAgICk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7CiAgICAgICAgdGhpcy5fYmFzaXMubGluZUVuZCgpOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHRoaXMuX3gucHVzaCgreCk7CiAgICAgICAgdGhpcy5feS5wdXNoKCt5KTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgYnVuZGxlJDEgPSAoZnVuY3Rpb24gY3VzdG9tKGJldGEpIHsKCiAgICAgIGZ1bmN0aW9uIGJ1bmRsZShjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIGJldGEgPT09IDEgPyBuZXcgQmFzaXMkMShjb250ZXh0KSA6IG5ldyBCdW5kbGUkMShjb250ZXh0LCBiZXRhKTsKICAgICAgfQoKICAgICAgYnVuZGxlLmJldGEgPSBmdW5jdGlvbihiZXRhKSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgrYmV0YSk7CiAgICAgIH07CgogICAgICByZXR1cm4gYnVuZGxlOwogICAgfSkoMC44NSk7CgogICAgZnVuY3Rpb24gcG9pbnQkYih0aGF0LCB4LCB5KSB7CiAgICAgIHRoYXQuX2NvbnRleHQuYmV6aWVyQ3VydmVUbygKICAgICAgICB0aGF0Ll94MSArIHRoYXQuX2sgKiAodGhhdC5feDIgLSB0aGF0Ll94MCksCiAgICAgICAgdGhhdC5feTEgKyB0aGF0Ll9rICogKHRoYXQuX3kyIC0gdGhhdC5feTApLAogICAgICAgIHRoYXQuX3gyICsgdGhhdC5fayAqICh0aGF0Ll94MSAtIHgpLAogICAgICAgIHRoYXQuX3kyICsgdGhhdC5fayAqICh0aGF0Ll95MSAtIHkpLAogICAgICAgIHRoYXQuX3gyLAogICAgICAgIHRoYXQuX3kyCiAgICAgICk7CiAgICB9CgogICAgZnVuY3Rpb24gQ2FyZGluYWwkMShjb250ZXh0LCB0ZW5zaW9uKSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7CiAgICB9CgogICAgQ2FyZGluYWwkMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgICAgY2FzZSAzOiBwb2ludCRiKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JGIodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXJkaW5hbCQxID0gKGZ1bmN0aW9uIGN1c3RvbSh0ZW5zaW9uKSB7CgogICAgICBmdW5jdGlvbiBjYXJkaW5hbChjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBDYXJkaW5hbCQxKGNvbnRleHQsIHRlbnNpb24pOwogICAgICB9CgogICAgICBjYXJkaW5hbC50ZW5zaW9uID0gZnVuY3Rpb24odGVuc2lvbikgewogICAgICAgIHJldHVybiBjdXN0b20oK3RlbnNpb24pOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNhcmRpbmFsOwogICAgfSkoMCk7CgogICAgZnVuY3Rpb24gQ2FyZGluYWxDbG9zZWQkMShjb250ZXh0LCB0ZW5zaW9uKSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl9rID0gKDEgLSB0ZW5zaW9uKSAvIDY7CiAgICB9CgogICAgQ2FyZGluYWxDbG9zZWQkMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogbm9vcCQ5LAogICAgICBhcmVhRW5kOiBub29wJDksCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDE6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDI6IHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjYXNlIDM6IHsKICAgICAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94MywgdGhpcy5feTMpOwogICAgICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g0LCB0aGlzLl95NCk7CiAgICAgICAgICAgIHRoaXMucG9pbnQodGhpcy5feDUsIHRoaXMuX3k1KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHkpOyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OiBwb2ludCRiKHRoaXMsIHgsIHkpOyBicmVhazsKICAgICAgICB9CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4OwogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgY2FyZGluYWxDbG9zZWQkMSA9IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikgewoKICAgICAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgewogICAgICAgIHJldHVybiBuZXcgQ2FyZGluYWxDbG9zZWQkMShjb250ZXh0LCB0ZW5zaW9uKTsKICAgICAgfQoKICAgICAgY2FyZGluYWwudGVuc2lvbiA9IGZ1bmN0aW9uKHRlbnNpb24pIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCt0ZW5zaW9uKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBjYXJkaW5hbDsKICAgIH0pKDApOwoKICAgIGZ1bmN0aW9uIENhcmRpbmFsT3BlbiQxKGNvbnRleHQsIHRlbnNpb24pIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsKICAgIH0KCiAgICBDYXJkaW5hbE9wZW4kMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMykpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgICAgY2FzZSAzOiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JGIodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXJkaW5hbE9wZW4kMSA9IChmdW5jdGlvbiBjdXN0b20odGVuc2lvbikgewoKICAgICAgZnVuY3Rpb24gY2FyZGluYWwoY29udGV4dCkgewogICAgICAgIHJldHVybiBuZXcgQ2FyZGluYWxPcGVuJDEoY29udGV4dCwgdGVuc2lvbik7CiAgICAgIH0KCiAgICAgIGNhcmRpbmFsLnRlbnNpb24gPSBmdW5jdGlvbih0ZW5zaW9uKSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgrdGVuc2lvbik7CiAgICAgIH07CgogICAgICByZXR1cm4gY2FyZGluYWw7CiAgICB9KSgwKTsKCiAgICBmdW5jdGlvbiBwb2ludCRjKHRoYXQsIHgsIHkpIHsKICAgICAgdmFyIHgxID0gdGhhdC5feDEsCiAgICAgICAgICB5MSA9IHRoYXQuX3kxLAogICAgICAgICAgeDIgPSB0aGF0Ll94MiwKICAgICAgICAgIHkyID0gdGhhdC5feTI7CgogICAgICBpZiAodGhhdC5fbDAxX2EgPiBlcHNpbG9uJGEpIHsKICAgICAgICB2YXIgYSA9IDIgKiB0aGF0Ll9sMDFfMmEgKyAzICogdGhhdC5fbDAxX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwKICAgICAgICAgICAgbiA9IDMgKiB0aGF0Ll9sMDFfYSAqICh0aGF0Ll9sMDFfYSArIHRoYXQuX2wxMl9hKTsKICAgICAgICB4MSA9ICh4MSAqIGEgLSB0aGF0Ll94MCAqIHRoYXQuX2wxMl8yYSArIHRoYXQuX3gyICogdGhhdC5fbDAxXzJhKSAvIG47CiAgICAgICAgeTEgPSAoeTEgKiBhIC0gdGhhdC5feTAgKiB0aGF0Ll9sMTJfMmEgKyB0aGF0Ll95MiAqIHRoYXQuX2wwMV8yYSkgLyBuOwogICAgICB9CgogICAgICBpZiAodGhhdC5fbDIzX2EgPiBlcHNpbG9uJGEpIHsKICAgICAgICB2YXIgYiA9IDIgKiB0aGF0Ll9sMjNfMmEgKyAzICogdGhhdC5fbDIzX2EgKiB0aGF0Ll9sMTJfYSArIHRoYXQuX2wxMl8yYSwKICAgICAgICAgICAgbSA9IDMgKiB0aGF0Ll9sMjNfYSAqICh0aGF0Ll9sMjNfYSArIHRoYXQuX2wxMl9hKTsKICAgICAgICB4MiA9ICh4MiAqIGIgKyB0aGF0Ll94MSAqIHRoYXQuX2wyM18yYSAtIHggKiB0aGF0Ll9sMTJfMmEpIC8gbTsKICAgICAgICB5MiA9ICh5MiAqIGIgKyB0aGF0Ll95MSAqIHRoYXQuX2wyM18yYSAtIHkgKiB0aGF0Ll9sMTJfMmEpIC8gbTsKICAgICAgfQoKICAgICAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgxLCB5MSwgeDIsIHkyLCB0aGF0Ll94MiwgdGhhdC5feTIpOwogICAgfQoKICAgIGZ1bmN0aW9uIENhdG11bGxSb20kMShjb250ZXh0LCBhbHBoYSkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgICAgdGhpcy5fYWxwaGEgPSBhbHBoYTsKICAgIH0KCiAgICBDYXRtdWxsUm9tJDEucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPSB0aGlzLl94MiA9CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSA9IHRoaXMuX3kyID0gTmFOOwogICAgICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYSA9CiAgICAgICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhID0gdGhpcy5fbDIzXzJhID0KICAgICAgICB0aGlzLl9wb2ludCA9IDA7CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDM6IHRoaXMucG9pbnQodGhpcy5feDIsIHRoaXMuX3kyKTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CgogICAgICAgIGlmICh0aGlzLl9wb2ludCkgewogICAgICAgICAgdmFyIHgyMyA9IHRoaXMuX3gyIC0geCwKICAgICAgICAgICAgICB5MjMgPSB0aGlzLl95MiAtIHk7CiAgICAgICAgICB0aGlzLl9sMjNfYSA9IE1hdGguc3FydCh0aGlzLl9sMjNfMmEgPSBNYXRoLnBvdyh4MjMgKiB4MjMgKyB5MjMgKiB5MjMsIHRoaXMuX2FscGhhKSk7CiAgICAgICAgfQoKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDA6IHRoaXMuX3BvaW50ID0gMTsgdGhpcy5fbGluZSA/IHRoaXMuX2NvbnRleHQubGluZVRvKHgsIHkpIDogdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7IGJyZWFrOwogICAgICAgICAgY2FzZSAxOiB0aGlzLl9wb2ludCA9IDI7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JGModGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsKICAgICAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXRtdWxsUm9tJDEgPSAoZnVuY3Rpb24gY3VzdG9tKGFscGhhKSB7CgogICAgICBmdW5jdGlvbiBjYXRtdWxsUm9tKGNvbnRleHQpIHsKICAgICAgICByZXR1cm4gYWxwaGEgPyBuZXcgQ2F0bXVsbFJvbSQxKGNvbnRleHQsIGFscGhhKSA6IG5ldyBDYXJkaW5hbCQxKGNvbnRleHQsIDApOwogICAgICB9CgogICAgICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7CiAgICAgIH07CgogICAgICByZXR1cm4gY2F0bXVsbFJvbTsKICAgIH0pKDAuNSk7CgogICAgZnVuY3Rpb24gQ2F0bXVsbFJvbUNsb3NlZCQxKGNvbnRleHQsIGFscGhhKSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl9hbHBoYSA9IGFscGhhOwogICAgfQoKICAgIENhdG11bGxSb21DbG9zZWQkMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogbm9vcCQ5LAogICAgICBhcmVhRW5kOiBub29wJDksCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0gdGhpcy5feDMgPSB0aGlzLl94NCA9IHRoaXMuX3g1ID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSB0aGlzLl95MyA9IHRoaXMuX3k0ID0gdGhpcy5feTUgPSBOYU47CiAgICAgICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0KICAgICAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAxOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAyOiB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gzLCB0aGlzLl95Myk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgICAgY2FzZSAzOiB7CiAgICAgICAgICAgIHRoaXMucG9pbnQodGhpcy5feDMsIHRoaXMuX3kzKTsKICAgICAgICAgICAgdGhpcy5wb2ludCh0aGlzLl94NCwgdGhpcy5feTQpOwogICAgICAgICAgICB0aGlzLnBvaW50KHRoaXMuX3g1LCB0aGlzLl95NSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKCiAgICAgICAgaWYgKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LAogICAgICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTsKICAgICAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl94MyA9IHgsIHRoaXMuX3kzID0geTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5fY29udGV4dC5tb3ZlVG8odGhpcy5feDQgPSB4LCB0aGlzLl95NCA9IHkpOyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl94NSA9IHgsIHRoaXMuX3k1ID0geTsgYnJlYWs7CiAgICAgICAgICBkZWZhdWx0OiBwb2ludCRjKHRoaXMsIHgsIHkpOyBicmVhazsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2E7CiAgICAgICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhLCB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmE7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4OwogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgY2F0bXVsbFJvbUNsb3NlZCQxID0gKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgewoKICAgICAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21DbG9zZWQkMShjb250ZXh0LCBhbHBoYSkgOiBuZXcgQ2FyZGluYWxDbG9zZWQkMShjb250ZXh0LCAwKTsKICAgICAgfQoKICAgICAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNhdG11bGxSb207CiAgICB9KSgwLjUpOwoKICAgIGZ1bmN0aW9uIENhdG11bGxSb21PcGVuJDEoY29udGV4dCwgYWxwaGEpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgIHRoaXMuX2FscGhhID0gYWxwaGE7CiAgICB9CgogICAgQ2F0bXVsbFJvbU9wZW4kMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47CiAgICAgICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSA9IHRoaXMuX2wyM19hID0KICAgICAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmEgPQogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgfHwgKHRoaXMuX2xpbmUgIT09IDAgJiYgdGhpcy5fcG9pbnQgPT09IDMpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICAgICAgfSwKICAgICAgcG9pbnQ6IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB4ID0gK3gsIHkgPSAreTsKCiAgICAgICAgaWYgKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICB2YXIgeDIzID0gdGhpcy5feDIgLSB4LAogICAgICAgICAgICAgIHkyMyA9IHRoaXMuX3kyIC0geTsKICAgICAgICAgIHRoaXMuX2wyM19hID0gTWF0aC5zcXJ0KHRoaXMuX2wyM18yYSA9IE1hdGgucG93KHgyMyAqIHgyMyArIHkyMyAqIHkyMywgdGhpcy5fYWxwaGEpKTsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8odGhpcy5feDIsIHRoaXMuX3kyKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgICAgY2FzZSAzOiB0aGlzLl9wb2ludCA9IDQ7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JGModGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fbDAxX2EgPSB0aGlzLl9sMTJfYSwgdGhpcy5fbDEyX2EgPSB0aGlzLl9sMjNfYTsKICAgICAgICB0aGlzLl9sMDFfMmEgPSB0aGlzLl9sMTJfMmEsIHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYTsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIHZhciBjYXRtdWxsUm9tT3BlbiQxID0gKGZ1bmN0aW9uIGN1c3RvbShhbHBoYSkgewoKICAgICAgZnVuY3Rpb24gY2F0bXVsbFJvbShjb250ZXh0KSB7CiAgICAgICAgcmV0dXJuIGFscGhhID8gbmV3IENhdG11bGxSb21PcGVuJDEoY29udGV4dCwgYWxwaGEpIDogbmV3IENhcmRpbmFsT3BlbiQxKGNvbnRleHQsIDApOwogICAgICB9CgogICAgICBjYXRtdWxsUm9tLmFscGhhID0gZnVuY3Rpb24oYWxwaGEpIHsKICAgICAgICByZXR1cm4gY3VzdG9tKCthbHBoYSk7CiAgICAgIH07CgogICAgICByZXR1cm4gY2F0bXVsbFJvbTsKICAgIH0pKDAuNSk7CgogICAgZnVuY3Rpb24gTGluZWFyQ2xvc2VkJDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBMaW5lYXJDbG9zZWQkMS5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogbm9vcCQ5LAogICAgICBhcmVhRW5kOiBub29wJDksCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fcG9pbnQpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgaWYgKHRoaXMuX3BvaW50KSB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgICAgICBlbHNlIHRoaXMuX3BvaW50ID0gMSwgdGhpcy5fY29udGV4dC5tb3ZlVG8oeCwgeSk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gbGluZWFyQ2xvc2VkJDEoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IExpbmVhckNsb3NlZCQxKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpZ24kMyh4KSB7CiAgICAgIHJldHVybiB4IDwgMCA/IC0xIDogMTsKICAgIH0KCiAgICAvLyBDYWxjdWxhdGUgdGhlIHNsb3BlcyBvZiB0aGUgdGFuZ2VudHMgKEhlcm1pdGUtdHlwZSBpbnRlcnBvbGF0aW9uKSBiYXNlZCBvbgogICAgLy8gdGhlIGZvbGxvd2luZyBwYXBlcjogU3RlZmZlbiwgTS4gMTk5MC4gQSBTaW1wbGUgTWV0aG9kIGZvciBNb25vdG9uaWMKICAgIC8vIEludGVycG9sYXRpb24gaW4gT25lIERpbWVuc2lvbi4gQXN0cm9ub215IGFuZCBBc3Ryb3BoeXNpY3MsIFZvbC4gMjM5LCBOTy4KICAgIC8vIE5PVihJSSksIFAuIDQ0MywgMTk5MC4KICAgIGZ1bmN0aW9uIHNsb3BlMyQxKHRoYXQsIHgyLCB5MikgewogICAgICB2YXIgaDAgPSB0aGF0Ll94MSAtIHRoYXQuX3gwLAogICAgICAgICAgaDEgPSB4MiAtIHRoYXQuX3gxLAogICAgICAgICAgczAgPSAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyAoaDAgfHwgaDEgPCAwICYmIC0wKSwKICAgICAgICAgIHMxID0gKHkyIC0gdGhhdC5feTEpIC8gKGgxIHx8IGgwIDwgMCAmJiAtMCksCiAgICAgICAgICBwID0gKHMwICogaDEgKyBzMSAqIGgwKSAvIChoMCArIGgxKTsKICAgICAgcmV0dXJuIChzaWduJDMoczApICsgc2lnbiQzKHMxKSkgKiBNYXRoLm1pbihNYXRoLmFicyhzMCksIE1hdGguYWJzKHMxKSwgMC41ICogTWF0aC5hYnMocCkpIHx8IDA7CiAgICB9CgogICAgLy8gQ2FsY3VsYXRlIGEgb25lLXNpZGVkIHNsb3BlLgogICAgZnVuY3Rpb24gc2xvcGUyJDEodGhhdCwgdCkgewogICAgICB2YXIgaCA9IHRoYXQuX3gxIC0gdGhhdC5feDA7CiAgICAgIHJldHVybiBoID8gKDMgKiAodGhhdC5feTEgLSB0aGF0Ll95MCkgLyBoIC0gdCkgLyAyIDogdDsKICAgIH0KCiAgICAvLyBBY2NvcmRpbmcgdG8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ3ViaWNfSGVybWl0ZV9zcGxpbmUjUmVwcmVzZW50YXRpb25zCiAgICAvLyAieW91IGNhbiBleHByZXNzIGN1YmljIEhlcm1pdGUgaW50ZXJwb2xhdGlvbiBpbiB0ZXJtcyBvZiBjdWJpYyBCw6l6aWVyIGN1cnZlcwogICAgLy8gd2l0aCByZXNwZWN0IHRvIHRoZSBmb3VyIHZhbHVlcyBwMCwgcDAgKyBtMCAvIDMsIHAxIC0gbTEgLyAzLCBwMSIuCiAgICBmdW5jdGlvbiBwb2ludCRkKHRoYXQsIHQwLCB0MSkgewogICAgICB2YXIgeDAgPSB0aGF0Ll94MCwKICAgICAgICAgIHkwID0gdGhhdC5feTAsCiAgICAgICAgICB4MSA9IHRoYXQuX3gxLAogICAgICAgICAgeTEgPSB0aGF0Ll95MSwKICAgICAgICAgIGR4ID0gKHgxIC0geDApIC8gMzsKICAgICAgdGhhdC5fY29udGV4dC5iZXppZXJDdXJ2ZVRvKHgwICsgZHgsIHkwICsgZHggKiB0MCwgeDEgLSBkeCwgeTEgLSBkeCAqIHQxLCB4MSwgeTEpOwogICAgfQoKICAgIGZ1bmN0aW9uIE1vbm90b25lWCQxKGNvbnRleHQpIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICB9CgogICAgTW9ub3RvbmVYJDEucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPQogICAgICAgIHRoaXMuX3QwID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAyOiB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94MSwgdGhpcy5feTEpOyBicmVhazsKICAgICAgICAgIGNhc2UgMzogcG9pbnQkZCh0aGlzLCB0aGlzLl90MCwgc2xvcGUyJDEodGhpcywgdGhpcy5fdDApKTsgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIHRoaXMuX3BvaW50ID09PSAxKSkgdGhpcy5fY29udGV4dC5jbG9zZVBhdGgoKTsKICAgICAgICB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdmFyIHQxID0gTmFOOwoKICAgICAgICB4ID0gK3gsIHkgPSAreTsKICAgICAgICBpZiAoeCA9PT0gdGhpcy5feDEgJiYgeSA9PT0gdGhpcy5feTEpIHJldHVybjsgLy8gSWdub3JlIGNvaW5jaWRlbnQgcG9pbnRzLgogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgYnJlYWs7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX3BvaW50ID0gMzsgcG9pbnQkZCh0aGlzLCBzbG9wZTIkMSh0aGlzLCB0MSA9IHNsb3BlMyQxKHRoaXMsIHgsIHkpKSwgdDEpOyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JGQodGhpcywgdGhpcy5fdDAsIHQxID0gc2xvcGUzJDEodGhpcywgeCwgeSkpOyBicmVhazsKICAgICAgICB9CgogICAgICAgIHRoaXMuX3gwID0gdGhpcy5feDEsIHRoaXMuX3gxID0geDsKICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxLCB0aGlzLl95MSA9IHk7CiAgICAgICAgdGhpcy5fdDAgPSB0MTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBNb25vdG9uZVkkMShjb250ZXh0KSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBuZXcgUmVmbGVjdENvbnRleHQkMShjb250ZXh0KTsKICAgIH0KCiAgICAoTW9ub3RvbmVZJDEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShNb25vdG9uZVgkMS5wcm90b3R5cGUpKS5wb2ludCA9IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgTW9ub3RvbmVYJDEucHJvdG90eXBlLnBvaW50LmNhbGwodGhpcywgeSwgeCk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIFJlZmxlY3RDb250ZXh0JDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBSZWZsZWN0Q29udGV4dCQxLnByb3RvdHlwZSA9IHsKICAgICAgbW92ZVRvOiBmdW5jdGlvbih4LCB5KSB7IHRoaXMuX2NvbnRleHQubW92ZVRvKHksIHgpOyB9LAogICAgICBjbG9zZVBhdGg6IGZ1bmN0aW9uKCkgeyB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOyB9LAogICAgICBsaW5lVG86IGZ1bmN0aW9uKHgsIHkpIHsgdGhpcy5fY29udGV4dC5saW5lVG8oeSwgeCk7IH0sCiAgICAgIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7IHRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyh5MSwgeDEsIHkyLCB4MiwgeSwgeCk7IH0KICAgIH07CgogICAgZnVuY3Rpb24gbW9ub3RvbmVYJDEoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IE1vbm90b25lWCQxKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1vbm90b25lWSQxKGNvbnRleHQpIHsKICAgICAgcmV0dXJuIG5ldyBNb25vdG9uZVkkMShjb250ZXh0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBOYXR1cmFsJDEoY29udGV4dCkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgIH0KCiAgICBOYXR1cmFsJDEucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3ggPSBbXTsKICAgICAgICB0aGlzLl95ID0gW107CiAgICAgIH0sCiAgICAgIGxpbmVFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB4ID0gdGhpcy5feCwKICAgICAgICAgICAgeSA9IHRoaXMuX3ksCiAgICAgICAgICAgIG4gPSB4Lmxlbmd0aDsKCiAgICAgICAgaWYgKG4pIHsKICAgICAgICAgIHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4WzBdLCB5WzBdKSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHhbMF0sIHlbMF0pOwogICAgICAgICAgaWYgKG4gPT09IDIpIHsKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5saW5lVG8oeFsxXSwgeVsxXSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YXIgcHggPSBjb250cm9sUG9pbnRzJDEoeCksCiAgICAgICAgICAgICAgICBweSA9IGNvbnRyb2xQb2ludHMkMSh5KTsKICAgICAgICAgICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDE7IGkxIDwgbjsgKytpMCwgKytpMSkgewogICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQuYmV6aWVyQ3VydmVUbyhweFswXVtpMF0sIHB5WzBdW2kwXSwgcHhbMV1baTBdLCBweVsxXVtpMF0sIHhbaTFdLCB5W2kxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLl9saW5lIHx8ICh0aGlzLl9saW5lICE9PSAwICYmIG4gPT09IDEpKSB0aGlzLl9jb250ZXh0LmNsb3NlUGF0aCgpOwogICAgICAgIHRoaXMuX2xpbmUgPSAxIC0gdGhpcy5fbGluZTsKICAgICAgICB0aGlzLl94ID0gdGhpcy5feSA9IG51bGw7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdGhpcy5feC5wdXNoKCt4KTsKICAgICAgICB0aGlzLl95LnB1c2goK3kpOwogICAgICB9CiAgICB9OwoKICAgIC8vIFNlZSBodHRwczovL3d3dy5wYXJ0aWNsZWluY2VsbC5jb20vMjAxMi9iZXppZXItc3BsaW5lcy8gZm9yIGRlcml2YXRpb24uCiAgICBmdW5jdGlvbiBjb250cm9sUG9pbnRzJDEoeCkgewogICAgICB2YXIgaSwKICAgICAgICAgIG4gPSB4Lmxlbmd0aCAtIDEsCiAgICAgICAgICBtLAogICAgICAgICAgYSA9IG5ldyBBcnJheShuKSwKICAgICAgICAgIGIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICByID0gbmV3IEFycmF5KG4pOwogICAgICBhWzBdID0gMCwgYlswXSA9IDIsIHJbMF0gPSB4WzBdICsgMiAqIHhbMV07CiAgICAgIGZvciAoaSA9IDE7IGkgPCBuIC0gMTsgKytpKSBhW2ldID0gMSwgYltpXSA9IDQsIHJbaV0gPSA0ICogeFtpXSArIDIgKiB4W2kgKyAxXTsKICAgICAgYVtuIC0gMV0gPSAyLCBiW24gLSAxXSA9IDcsIHJbbiAtIDFdID0gOCAqIHhbbiAtIDFdICsgeFtuXTsKICAgICAgZm9yIChpID0gMTsgaSA8IG47ICsraSkgbSA9IGFbaV0gLyBiW2kgLSAxXSwgYltpXSAtPSBtLCByW2ldIC09IG0gKiByW2kgLSAxXTsKICAgICAgYVtuIC0gMV0gPSByW24gLSAxXSAvIGJbbiAtIDFdOwogICAgICBmb3IgKGkgPSBuIC0gMjsgaSA+PSAwOyAtLWkpIGFbaV0gPSAocltpXSAtIGFbaSArIDFdKSAvIGJbaV07CiAgICAgIGJbbiAtIDFdID0gKHhbbl0gKyBhW24gLSAxXSkgLyAyOwogICAgICBmb3IgKGkgPSAwOyBpIDwgbiAtIDE7ICsraSkgYltpXSA9IDIgKiB4W2kgKyAxXSAtIGFbaSArIDFdOwogICAgICByZXR1cm4gW2EsIGJdOwogICAgfQoKICAgIGZ1bmN0aW9uIG5hdHVyYWwkMShjb250ZXh0KSB7CiAgICAgIHJldHVybiBuZXcgTmF0dXJhbCQxKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIFN0ZXAkMShjb250ZXh0LCB0KSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgICB0aGlzLl90ID0gdDsKICAgIH0KCiAgICBTdGVwJDEucHJvdG90eXBlID0gewogICAgICBhcmVhU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSAwOwogICAgICB9LAogICAgICBhcmVhRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gTmFOOwogICAgICB9LAogICAgICBsaW5lU3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX3ggPSB0aGlzLl95ID0gTmFOOwogICAgICAgIHRoaXMuX3BvaW50ID0gMDsKICAgICAgfSwKICAgICAgbGluZUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKDAgPCB0aGlzLl90ICYmIHRoaXMuX3QgPCAxICYmIHRoaXMuX3BvaW50ID09PSAyKSB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB0aGlzLl95KTsKICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgaWYgKHRoaXMuX2xpbmUgPj0gMCkgdGhpcy5fdCA9IDEgLSB0aGlzLl90LCB0aGlzLl9saW5lID0gMSAtIHRoaXMuX2xpbmU7CiAgICAgIH0sCiAgICAgIHBvaW50OiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3k7CiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyAvLyBwcm9jZWVkCiAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgIGlmICh0aGlzLl90IDw9IDApIHsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh0aGlzLl94LCB5KTsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICB2YXIgeDEgPSB0aGlzLl94ICogKDEgLSB0aGlzLl90KSArIHggKiB0aGlzLl90OwogICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQubGluZVRvKHgxLCB0aGlzLl95KTsKICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0LmxpbmVUbyh4MSwgeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ggPSB4LCB0aGlzLl95ID0geTsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBzdGVwJDEoY29udGV4dCkgewogICAgICByZXR1cm4gbmV3IFN0ZXAkMShjb250ZXh0LCAwLjUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXBCZWZvcmUkMShjb250ZXh0KSB7CiAgICAgIHJldHVybiBuZXcgU3RlcCQxKGNvbnRleHQsIDApOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0ZXBBZnRlciQxKGNvbnRleHQpIHsKICAgICAgcmV0dXJuIG5ldyBTdGVwJDEoY29udGV4dCwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9uZSQ2KHNlcmllcywgb3JkZXIpIHsKICAgICAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47CiAgICAgIGZvciAodmFyIGkgPSAxLCBqLCBzMCwgczEgPSBzZXJpZXNbb3JkZXJbMF1dLCBuLCBtID0gczEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgczAgPSBzMSwgczEgPSBzZXJpZXNbb3JkZXJbaV1dOwogICAgICAgIGZvciAoaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICAgIHMxW2pdWzFdICs9IHMxW2pdWzBdID0gaXNOYU4oczBbal1bMV0pID8gczBbal1bMF0gOiBzMFtqXVsxXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBub25lJDcoc2VyaWVzKSB7CiAgICAgIHZhciBuID0gc2VyaWVzLmxlbmd0aCwgbyA9IG5ldyBBcnJheShuKTsKICAgICAgd2hpbGUgKC0tbiA+PSAwKSBvW25dID0gbjsKICAgICAgcmV0dXJuIG87CiAgICB9CgogICAgZnVuY3Rpb24gc3RhY2tWYWx1ZSQxKGQsIGtleSkgewogICAgICByZXR1cm4gZFtrZXldOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0YWNrJDEoKSB7CiAgICAgIHZhciBrZXlzID0gY29uc3RhbnQkcyhbXSksCiAgICAgICAgICBvcmRlciA9IG5vbmUkNywKICAgICAgICAgIG9mZnNldCA9IG5vbmUkNiwKICAgICAgICAgIHZhbHVlID0gc3RhY2tWYWx1ZSQxOwoKICAgICAgZnVuY3Rpb24gc3RhY2soZGF0YSkgewogICAgICAgIHZhciBreiA9IGtleXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgaSwKICAgICAgICAgICAgbSA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICBuID0ga3oubGVuZ3RoLAogICAgICAgICAgICBzeiA9IG5ldyBBcnJheShuKSwKICAgICAgICAgICAgb3o7CgogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGZvciAodmFyIGtpID0ga3pbaV0sIHNpID0gc3pbaV0gPSBuZXcgQXJyYXkobSksIGogPSAwLCBzaWo7IGogPCBtOyArK2opIHsKICAgICAgICAgICAgc2lbal0gPSBzaWogPSBbMCwgK3ZhbHVlKGRhdGFbal0sIGtpLCBqLCBkYXRhKV07CiAgICAgICAgICAgIHNpai5kYXRhID0gZGF0YVtqXTsKICAgICAgICAgIH0KICAgICAgICAgIHNpLmtleSA9IGtpOwogICAgICAgIH0KCiAgICAgICAgZm9yIChpID0gMCwgb3ogPSBvcmRlcihzeik7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIHN6W296W2ldXS5pbmRleCA9IGk7CiAgICAgICAgfQoKICAgICAgICBvZmZzZXQoc3osIG96KTsKICAgICAgICByZXR1cm4gc3o7CiAgICAgIH0KCiAgICAgIHN0YWNrLmtleXMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoa2V5cyA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHMoc2xpY2UkZC5jYWxsKF8pKSwgc3RhY2spIDoga2V5czsKICAgICAgfTsKCiAgICAgIHN0YWNrLnZhbHVlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkcygrXyksIHN0YWNrKSA6IHZhbHVlOwogICAgICB9OwoKICAgICAgc3RhY2sub3JkZXIgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAob3JkZXIgPSBfID09IG51bGwgPyBub25lJDcgOiB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCRzKHNsaWNlJGQuY2FsbChfKSksIHN0YWNrKSA6IG9yZGVyOwogICAgICB9OwoKICAgICAgc3RhY2sub2Zmc2V0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKG9mZnNldCA9IF8gPT0gbnVsbCA/IG5vbmUkNiA6IF8sIHN0YWNrKSA6IG9mZnNldDsKICAgICAgfTsKCiAgICAgIHJldHVybiBzdGFjazsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBhbmQkMShzZXJpZXMsIG9yZGVyKSB7CiAgICAgIGlmICghKChuID0gc2VyaWVzLmxlbmd0aCkgPiAwKSkgcmV0dXJuOwogICAgICBmb3IgKHZhciBpLCBuLCBqID0gMCwgbSA9IHNlcmllc1swXS5sZW5ndGgsIHk7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHkgPSBpID0gMDsgaSA8IG47ICsraSkgeSArPSBzZXJpZXNbaV1bal1bMV0gfHwgMDsKICAgICAgICBpZiAoeSkgZm9yIChpID0gMDsgaSA8IG47ICsraSkgc2VyaWVzW2ldW2pdWzFdIC89IHk7CiAgICAgIH0KICAgICAgbm9uZSQ2KHNlcmllcywgb3JkZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpdmVyZ2luZyQyKHNlcmllcywgb3JkZXIpIHsKICAgICAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDEpKSByZXR1cm47CiAgICAgIGZvciAodmFyIGksIGogPSAwLCBkLCBkeSwgeXAsIHluLCBuLCBtID0gc2VyaWVzW29yZGVyWzBdXS5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHlwID0geW4gPSAwLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChkeSA9IChkID0gc2VyaWVzW29yZGVyW2ldXVtqXSlbMV0gLSBkWzBdKSA+PSAwKSB7CiAgICAgICAgICAgIGRbMF0gPSB5cCwgZFsxXSA9IHlwICs9IGR5OwogICAgICAgICAgfSBlbHNlIGlmIChkeSA8IDApIHsKICAgICAgICAgICAgZFsxXSA9IHluLCBkWzBdID0geW4gKz0gZHk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBkWzBdID0geXA7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2lsaG91ZXR0ZSQxKHNlcmllcywgb3JkZXIpIHsKICAgICAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApKSByZXR1cm47CiAgICAgIGZvciAodmFyIGogPSAwLCBzMCA9IHNlcmllc1tvcmRlclswXV0sIG4sIG0gPSBzMC5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBpID0gMCwgeSA9IDA7IGkgPCBuOyArK2kpIHkgKz0gc2VyaWVzW2ldW2pdWzFdIHx8IDA7CiAgICAgICAgczBbal1bMV0gKz0gczBbal1bMF0gPSAteSAvIDI7CiAgICAgIH0KICAgICAgbm9uZSQ2KHNlcmllcywgb3JkZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHdpZ2dsZSQxKHNlcmllcywgb3JkZXIpIHsKICAgICAgaWYgKCEoKG4gPSBzZXJpZXMubGVuZ3RoKSA+IDApIHx8ICEoKG0gPSAoczAgPSBzZXJpZXNbb3JkZXJbMF1dKS5sZW5ndGgpID4gMCkpIHJldHVybjsKICAgICAgZm9yICh2YXIgeSA9IDAsIGogPSAxLCBzMCwgbSwgbjsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBzMSA9IDAsIHMyID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIHNpID0gc2VyaWVzW29yZGVyW2ldXSwKICAgICAgICAgICAgICBzaWowID0gc2lbal1bMV0gfHwgMCwKICAgICAgICAgICAgICBzaWoxID0gc2lbaiAtIDFdWzFdIHx8IDAsCiAgICAgICAgICAgICAgczMgPSAoc2lqMCAtIHNpajEpIC8gMjsKICAgICAgICAgIGZvciAodmFyIGsgPSAwOyBrIDwgaTsgKytrKSB7CiAgICAgICAgICAgIHZhciBzayA9IHNlcmllc1tvcmRlcltrXV0sCiAgICAgICAgICAgICAgICBza2owID0gc2tbal1bMV0gfHwgMCwKICAgICAgICAgICAgICAgIHNrajEgPSBza1tqIC0gMV1bMV0gfHwgMDsKICAgICAgICAgICAgczMgKz0gc2tqMCAtIHNrajE7CiAgICAgICAgICB9CiAgICAgICAgICBzMSArPSBzaWowLCBzMiArPSBzMyAqIHNpajA7CiAgICAgICAgfQogICAgICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogICAgICAgIGlmIChzMSkgeSAtPSBzMiAvIHMxOwogICAgICB9CiAgICAgIHMwW2ogLSAxXVsxXSArPSBzMFtqIC0gMV1bMF0gPSB5OwogICAgICBub25lJDYoc2VyaWVzLCBvcmRlcik7CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nJGIoc2VyaWVzKSB7CiAgICAgIHZhciBzdW1zID0gc2VyaWVzLm1hcChzdW0kNSk7CiAgICAgIHJldHVybiBub25lJDcoc2VyaWVzKS5zb3J0KGZ1bmN0aW9uKGEsIGIpIHsgcmV0dXJuIHN1bXNbYV0gLSBzdW1zW2JdOyB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdW0kNShzZXJpZXMpIHsKICAgICAgdmFyIHMgPSAwLCBpID0gLTEsIG4gPSBzZXJpZXMubGVuZ3RoLCB2OwogICAgICB3aGlsZSAoKytpIDwgbikgaWYgKHYgPSArc2VyaWVzW2ldWzFdKSBzICs9IHY7CiAgICAgIHJldHVybiBzOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlc2NlbmRpbmckNShzZXJpZXMpIHsKICAgICAgcmV0dXJuIGFzY2VuZGluZyRiKHNlcmllcykucmV2ZXJzZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGluc2lkZU91dCQxKHNlcmllcykgewogICAgICB2YXIgbiA9IHNlcmllcy5sZW5ndGgsCiAgICAgICAgICBpLAogICAgICAgICAgaiwKICAgICAgICAgIHN1bXMgPSBzZXJpZXMubWFwKHN1bSQ1KSwKICAgICAgICAgIG9yZGVyID0gbm9uZSQ3KHNlcmllcykuc29ydChmdW5jdGlvbihhLCBiKSB7IHJldHVybiBzdW1zW2JdIC0gc3Vtc1thXTsgfSksCiAgICAgICAgICB0b3AgPSAwLAogICAgICAgICAgYm90dG9tID0gMCwKICAgICAgICAgIHRvcHMgPSBbXSwKICAgICAgICAgIGJvdHRvbXMgPSBbXTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICBqID0gb3JkZXJbaV07CiAgICAgICAgaWYgKHRvcCA8IGJvdHRvbSkgewogICAgICAgICAgdG9wICs9IHN1bXNbal07CiAgICAgICAgICB0b3BzLnB1c2goaik7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGJvdHRvbSArPSBzdW1zW2pdOwogICAgICAgICAgYm90dG9tcy5wdXNoKGopOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGJvdHRvbXMucmV2ZXJzZSgpLmNvbmNhdCh0b3BzKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXZlcnNlJDEoc2VyaWVzKSB7CiAgICAgIHJldHVybiBub25lJDcoc2VyaWVzKS5yZXZlcnNlKCk7CiAgICB9CgogICAgdmFyIHQwJDUgPSBuZXcgRGF0ZSwKICAgICAgICB0MSQ1ID0gbmV3IERhdGU7CgogICAgZnVuY3Rpb24gbmV3SW50ZXJ2YWwkMihmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkgewoKICAgICAgZnVuY3Rpb24gaW50ZXJ2YWwoZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7CiAgICAgIH0KCiAgICAgIGludGVydmFsLmZsb29yID0gaW50ZXJ2YWw7CgogICAgICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTsKICAgICAgfTsKCiAgICAgIGludGVydmFsLnJvdW5kID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHZhciBkMCA9IGludGVydmFsKGRhdGUpLAogICAgICAgICAgICBkMSA9IGludGVydmFsLmNlaWwoZGF0ZSk7CiAgICAgICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgcmV0dXJuIG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCkpLCBkYXRlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgICAgIHZhciByYW5nZSA9IFtdLCBwcmV2aW91czsKICAgICAgICBzdGFydCA9IGludGVydmFsLmNlaWwoc3RhcnQpOwogICAgICAgIHN0ZXAgPSBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKTsKICAgICAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSByZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUKICAgICAgICBkbyByYW5nZS5wdXNoKHByZXZpb3VzID0gbmV3IERhdGUoK3N0YXJ0KSksIG9mZnNldGkoc3RhcnQsIHN0ZXApLCBmbG9vcmkoc3RhcnQpOwogICAgICAgIHdoaWxlIChwcmV2aW91cyA8IHN0YXJ0ICYmIHN0YXJ0IDwgc3RvcCk7CiAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwuZmlsdGVyID0gZnVuY3Rpb24odGVzdCkgewogICAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOwogICAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHsKICAgICAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIGlmIChjb3VudCkgewogICAgICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgICAgdDAkNS5zZXRUaW1lKCtzdGFydCksIHQxJDUuc2V0VGltZSgrZW5kKTsKICAgICAgICAgIGZsb29yaSh0MCQ1KSwgZmxvb3JpKHQxJDUpOwogICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAkNSwgdDEkNSkpOwogICAgICAgIH07CgogICAgICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgewogICAgICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICAgICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbAogICAgICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbAogICAgICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkCiAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9CiAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gaW50ZXJ2YWw7CiAgICB9CgogICAgdmFyIG1pbGxpc2Vjb25kJDIgPSBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKCkgewogICAgICAvLyBub29wCiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kIC0gc3RhcnQ7CiAgICB9KTsKCiAgICAvLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCiAgICBtaWxsaXNlY29uZCQyLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogICAgICBrID0gTWF0aC5mbG9vcihrKTsKICAgICAgaWYgKCFpc0Zpbml0ZShrKSB8fCAhKGsgPiAwKSkgcmV0dXJuIG51bGw7CiAgICAgIGlmICghKGsgPiAxKSkgcmV0dXJuIG1pbGxpc2Vjb25kJDI7CiAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcihkYXRlIC8gaykgKiBrKTsKICAgICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICAgIGRhdGUuc2V0VGltZSgrZGF0ZSArIHN0ZXAgKiBrKTsKICAgICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gazsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIG1pbGxpc2Vjb25kcyQxID0gbWlsbGlzZWNvbmQkMi5yYW5nZTsKCiAgICB2YXIgZHVyYXRpb25TZWNvbmQkNCA9IDFlMzsKICAgIHZhciBkdXJhdGlvbk1pbnV0ZSQ0ID0gNmU0OwogICAgdmFyIGR1cmF0aW9uSG91ciQ0ID0gMzZlNTsKICAgIHZhciBkdXJhdGlvbkRheSQ0ID0gODY0ZTU7CiAgICB2YXIgZHVyYXRpb25XZWVrJDQgPSA2MDQ4ZTU7CgogICAgdmFyIHNlY29uZCQyID0gbmV3SW50ZXJ2YWwkMihmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvblNlY29uZCQ0KSAqIGR1cmF0aW9uU2Vjb25kJDQpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25TZWNvbmQkNCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25TZWNvbmQkNDsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDU2Vjb25kcygpOwogICAgfSk7CiAgICB2YXIgc2Vjb25kcyQxID0gc2Vjb25kJDIucmFuZ2U7CgogICAgdmFyIG1pbnV0ZSQyID0gbmV3SW50ZXJ2YWwkMihmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VGltZShNYXRoLmZsb29yKGRhdGUgLyBkdXJhdGlvbk1pbnV0ZSQ0KSAqIGR1cmF0aW9uTWludXRlJDQpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25NaW51dGUkNCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25NaW51dGUkNDsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0TWludXRlcygpOwogICAgfSk7CiAgICB2YXIgbWludXRlcyQxID0gbWludXRlJDIucmFuZ2U7CgogICAgdmFyIGhvdXIkMiA9IG5ld0ludGVydmFsJDIoZnVuY3Rpb24oZGF0ZSkgewogICAgICB2YXIgb2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpICogZHVyYXRpb25NaW51dGUkNCAlIGR1cmF0aW9uSG91ciQ0OwogICAgICBpZiAob2Zmc2V0IDwgMCkgb2Zmc2V0ICs9IGR1cmF0aW9uSG91ciQ0OwogICAgICBkYXRlLnNldFRpbWUoTWF0aC5mbG9vcigoK2RhdGUgLSBvZmZzZXQpIC8gZHVyYXRpb25Ib3VyJDQpICogZHVyYXRpb25Ib3VyJDQgKyBvZmZzZXQpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyJDQpOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91ciQ0OwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRIb3VycygpOwogICAgfSk7CiAgICB2YXIgaG91cnMkMSA9IGhvdXIkMi5yYW5nZTsKCiAgICB2YXIgZGF5JDIgPSBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXREYXRlKGRhdGUuZ2V0RGF0ZSgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlJDQpIC8gZHVyYXRpb25EYXkkNDsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF0ZSgpIC0gMTsKICAgIH0pOwogICAgdmFyIGRheXMkMSA9IGRheSQyLnJhbmdlOwoKICAgIGZ1bmN0aW9uIHdlZWtkYXkkMihpKSB7CiAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgLSAoZGF0ZS5nZXREYXkoKSArIDcgLSBpKSAlIDcpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwICogNyk7CiAgICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0IC0gKGVuZC5nZXRUaW1lem9uZU9mZnNldCgpIC0gc3RhcnQuZ2V0VGltZXpvbmVPZmZzZXQoKSkgKiBkdXJhdGlvbk1pbnV0ZSQ0KSAvIGR1cmF0aW9uV2VlayQ0OwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgc3VuZGF5JDIgPSB3ZWVrZGF5JDIoMCk7CiAgICB2YXIgbW9uZGF5JDIgPSB3ZWVrZGF5JDIoMSk7CiAgICB2YXIgdHVlc2RheSQyID0gd2Vla2RheSQyKDIpOwogICAgdmFyIHdlZG5lc2RheSQyID0gd2Vla2RheSQyKDMpOwogICAgdmFyIHRodXJzZGF5JDIgPSB3ZWVrZGF5JDIoNCk7CiAgICB2YXIgZnJpZGF5JDIgPSB3ZWVrZGF5JDIoNSk7CiAgICB2YXIgc2F0dXJkYXkkMiA9IHdlZWtkYXkkMig2KTsKCiAgICB2YXIgc3VuZGF5cyQxID0gc3VuZGF5JDIucmFuZ2U7CiAgICB2YXIgbW9uZGF5cyQxID0gbW9uZGF5JDIucmFuZ2U7CiAgICB2YXIgdHVlc2RheXMkMSA9IHR1ZXNkYXkkMi5yYW5nZTsKICAgIHZhciB3ZWRuZXNkYXlzJDEgPSB3ZWRuZXNkYXkkMi5yYW5nZTsKICAgIHZhciB0aHVyc2RheXMkMSA9IHRodXJzZGF5JDIucmFuZ2U7CiAgICB2YXIgZnJpZGF5cyQxID0gZnJpZGF5JDIucmFuZ2U7CiAgICB2YXIgc2F0dXJkYXlzJDEgPSBzYXR1cmRheSQyLnJhbmdlOwoKICAgIHZhciBtb250aCQyID0gbmV3SW50ZXJ2YWwkMihmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0RGF0ZSgxKTsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRNb250aChkYXRlLmdldE1vbnRoKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIGVuZC5nZXRNb250aCgpIC0gc3RhcnQuZ2V0TW9udGgoKSArIChlbmQuZ2V0RnVsbFllYXIoKSAtIHN0YXJ0LmdldEZ1bGxZZWFyKCkpICogMTI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCk7CiAgICB9KTsKICAgIHZhciBtb250aHMkMSA9IG1vbnRoJDIucmFuZ2U7CgogICAgdmFyIHllYXIkMiA9IG5ld0ludGVydmFsJDIoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldE1vbnRoKDAsIDEpOwogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kLmdldEZ1bGxZZWFyKCkgLSBzdGFydC5nZXRGdWxsWWVhcigpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRGdWxsWWVhcigpOwogICAgfSk7CgogICAgLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLgogICAgeWVhciQyLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogICAgICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRGdWxsWWVhcigpIC8gaykgKiBrKTsKICAgICAgICBkYXRlLnNldE1vbnRoKDAsIDEpOwogICAgICAgIGRhdGUuc2V0SG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldEZ1bGxZZWFyKGRhdGUuZ2V0RnVsbFllYXIoKSArIHN0ZXAgKiBrKTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIHllYXJzJDEgPSB5ZWFyJDIucmFuZ2U7CgogICAgdmFyIHV0Y01pbnV0ZSQyID0gbmV3SW50ZXJ2YWwkMihmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VVRDU2Vjb25kcygwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRUaW1lKCtkYXRlICsgc3RlcCAqIGR1cmF0aW9uTWludXRlJDQpOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uTWludXRlJDQ7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ01pbnV0ZXMoKTsKICAgIH0pOwogICAgdmFyIHV0Y01pbnV0ZXMkMSA9IHV0Y01pbnV0ZSQyLnJhbmdlOwoKICAgIHZhciB1dGNIb3VyJDIgPSBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENNaW51dGVzKDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFRpbWUoK2RhdGUgKyBzdGVwICogZHVyYXRpb25Ib3VyJDQpOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uSG91ciQ0OwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRVVENIb3VycygpOwogICAgfSk7CiAgICB2YXIgdXRjSG91cnMkMSA9IHV0Y0hvdXIkMi5yYW5nZTsKCiAgICB2YXIgdXRjRGF5JDIgPSBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25EYXkkNDsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDRGF0ZSgpIC0gMTsKICAgIH0pOwogICAgdmFyIHV0Y0RheXMkMSA9IHV0Y0RheSQyLnJhbmdlOwoKICAgIGZ1bmN0aW9uIHV0Y1dlZWtkYXkkMihpKSB7CiAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOwogICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7CiAgICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlayQ0OwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgdXRjU3VuZGF5JDIgPSB1dGNXZWVrZGF5JDIoMCk7CiAgICB2YXIgdXRjTW9uZGF5JDIgPSB1dGNXZWVrZGF5JDIoMSk7CiAgICB2YXIgdXRjVHVlc2RheSQyID0gdXRjV2Vla2RheSQyKDIpOwogICAgdmFyIHV0Y1dlZG5lc2RheSQyID0gdXRjV2Vla2RheSQyKDMpOwogICAgdmFyIHV0Y1RodXJzZGF5JDIgPSB1dGNXZWVrZGF5JDIoNCk7CiAgICB2YXIgdXRjRnJpZGF5JDIgPSB1dGNXZWVrZGF5JDIoNSk7CiAgICB2YXIgdXRjU2F0dXJkYXkkMiA9IHV0Y1dlZWtkYXkkMig2KTsKCiAgICB2YXIgdXRjU3VuZGF5cyQxID0gdXRjU3VuZGF5JDIucmFuZ2U7CiAgICB2YXIgdXRjTW9uZGF5cyQxID0gdXRjTW9uZGF5JDIucmFuZ2U7CiAgICB2YXIgdXRjVHVlc2RheXMkMSA9IHV0Y1R1ZXNkYXkkMi5yYW5nZTsKICAgIHZhciB1dGNXZWRuZXNkYXlzJDEgPSB1dGNXZWRuZXNkYXkkMi5yYW5nZTsKICAgIHZhciB1dGNUaHVyc2RheXMkMSA9IHV0Y1RodXJzZGF5JDIucmFuZ2U7CiAgICB2YXIgdXRjRnJpZGF5cyQxID0gdXRjRnJpZGF5JDIucmFuZ2U7CiAgICB2YXIgdXRjU2F0dXJkYXlzJDEgPSB1dGNTYXR1cmRheSQyLnJhbmdlOwoKICAgIHZhciB1dGNNb250aCQyID0gbmV3SW50ZXJ2YWwkMihmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VVRDRGF0ZSgxKTsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENNb250aChkYXRlLmdldFVUQ01vbnRoKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIGVuZC5nZXRVVENNb250aCgpIC0gc3RhcnQuZ2V0VVRDTW9udGgoKSArIChlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCkpICogMTI7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ01vbnRoKCk7CiAgICB9KTsKICAgIHZhciB1dGNNb250aHMkMSA9IHV0Y01vbnRoJDIucmFuZ2U7CgogICAgdmFyIHV0Y1llYXIkMiA9IG5ld0ludGVydmFsJDIoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOwogICAgICBkYXRlLnNldFVUQ0hvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXApOwogICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICByZXR1cm4gZW5kLmdldFVUQ0Z1bGxZZWFyKCkgLSBzdGFydC5nZXRVVENGdWxsWWVhcigpOwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXRVVENGdWxsWWVhcigpOwogICAgfSk7CgogICAgLy8gQW4gb3B0aW1pemVkIGltcGxlbWVudGF0aW9uIGZvciB0aGlzIHNpbXBsZSBjYXNlLgogICAgdXRjWWVhciQyLmV2ZXJ5ID0gZnVuY3Rpb24oaykgewogICAgICByZXR1cm4gIWlzRmluaXRlKGsgPSBNYXRoLmZsb29yKGspKSB8fCAhKGsgPiAwKSA/IG51bGwgOiBuZXdJbnRlcnZhbCQyKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKE1hdGguZmxvb3IoZGF0ZS5nZXRVVENGdWxsWWVhcigpIC8gaykgKiBrKTsKICAgICAgICBkYXRlLnNldFVUQ01vbnRoKDAsIDEpOwogICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldFVUQ0Z1bGxZZWFyKGRhdGUuZ2V0VVRDRnVsbFllYXIoKSArIHN0ZXAgKiBrKTsKICAgICAgfSk7CiAgICB9OwogICAgdmFyIHV0Y1llYXJzJDEgPSB1dGNZZWFyJDIucmFuZ2U7CgogICAgdmFyIHQwJDYgPSBuZXcgRGF0ZSwKICAgICAgICB0MSQ2ID0gbmV3IERhdGU7CgogICAgZnVuY3Rpb24gbmV3SW50ZXJ2YWwkMyhmbG9vcmksIG9mZnNldGksIGNvdW50LCBmaWVsZCkgewoKICAgICAgZnVuY3Rpb24gaW50ZXJ2YWwoZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IGFyZ3VtZW50cy5sZW5ndGggPT09IDAgPyBuZXcgRGF0ZSA6IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7CiAgICAgIH0KCiAgICAgIGludGVydmFsLmZsb29yID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSksIGRhdGU7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5jZWlsID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHJldHVybiBmbG9vcmkoZGF0ZSA9IG5ldyBEYXRlKGRhdGUgLSAxKSksIG9mZnNldGkoZGF0ZSwgMSksIGZsb29yaShkYXRlKSwgZGF0ZTsKICAgICAgfTsKCiAgICAgIGludGVydmFsLnJvdW5kID0gZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIHZhciBkMCA9IGludGVydmFsKGRhdGUpLAogICAgICAgICAgICBkMSA9IGludGVydmFsLmNlaWwoZGF0ZSk7CiAgICAgICAgcmV0dXJuIGRhdGUgLSBkMCA8IGQxIC0gZGF0ZSA/IGQwIDogZDE7CiAgICAgIH07CgogICAgICBpbnRlcnZhbC5vZmZzZXQgPSBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgcmV0dXJuIG9mZnNldGkoZGF0ZSA9IG5ldyBEYXRlKCtkYXRlKSwgc3RlcCA9PSBudWxsID8gMSA6IE1hdGguZmxvb3Ioc3RlcCkpLCBkYXRlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwucmFuZ2UgPSBmdW5jdGlvbihzdGFydCwgc3RvcCwgc3RlcCkgewogICAgICAgIHZhciByYW5nZSA9IFtdLCBwcmV2aW91czsKICAgICAgICBzdGFydCA9IGludGVydmFsLmNlaWwoc3RhcnQpOwogICAgICAgIHN0ZXAgPSBzdGVwID09IG51bGwgPyAxIDogTWF0aC5mbG9vcihzdGVwKTsKICAgICAgICBpZiAoIShzdGFydCA8IHN0b3ApIHx8ICEoc3RlcCA+IDApKSByZXR1cm4gcmFuZ2U7IC8vIGFsc28gaGFuZGxlcyBJbnZhbGlkIERhdGUKICAgICAgICBkbyByYW5nZS5wdXNoKHByZXZpb3VzID0gbmV3IERhdGUoK3N0YXJ0KSksIG9mZnNldGkoc3RhcnQsIHN0ZXApLCBmbG9vcmkoc3RhcnQpOwogICAgICAgIHdoaWxlIChwcmV2aW91cyA8IHN0YXJ0ICYmIHN0YXJ0IDwgc3RvcCk7CiAgICAgICAgcmV0dXJuIHJhbmdlOwogICAgICB9OwoKICAgICAgaW50ZXJ2YWwuZmlsdGVyID0gZnVuY3Rpb24odGVzdCkgewogICAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQzKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHdoaWxlIChmbG9vcmkoZGF0ZSksICF0ZXN0KGRhdGUpKSBkYXRlLnNldFRpbWUoZGF0ZSAtIDEpOwogICAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICAgIGlmIChkYXRlID49IGRhdGUpIHsKICAgICAgICAgICAgaWYgKHN0ZXAgPCAwKSB3aGlsZSAoKytzdGVwIDw9IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCAtMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0gZWxzZSB3aGlsZSAoLS1zdGVwID49IDApIHsKICAgICAgICAgICAgICB3aGlsZSAob2Zmc2V0aShkYXRlLCArMSksICF0ZXN0KGRhdGUpKSB7fSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWVtcHR5CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIGlmIChjb3VudCkgewogICAgICAgIGludGVydmFsLmNvdW50ID0gZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgICAgdDAkNi5zZXRUaW1lKCtzdGFydCksIHQxJDYuc2V0VGltZSgrZW5kKTsKICAgICAgICAgIGZsb29yaSh0MCQ2KSwgZmxvb3JpKHQxJDYpOwogICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IoY291bnQodDAkNiwgdDEkNikpOwogICAgICAgIH07CgogICAgICAgIGludGVydmFsLmV2ZXJ5ID0gZnVuY3Rpb24oc3RlcCkgewogICAgICAgICAgc3RlcCA9IE1hdGguZmxvb3Ioc3RlcCk7CiAgICAgICAgICByZXR1cm4gIWlzRmluaXRlKHN0ZXApIHx8ICEoc3RlcCA+IDApID8gbnVsbAogICAgICAgICAgICAgIDogIShzdGVwID4gMSkgPyBpbnRlcnZhbAogICAgICAgICAgICAgIDogaW50ZXJ2YWwuZmlsdGVyKGZpZWxkCiAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb24oZCkgeyByZXR1cm4gZmllbGQoZCkgJSBzdGVwID09PSAwOyB9CiAgICAgICAgICAgICAgICAgIDogZnVuY3Rpb24oZCkgeyByZXR1cm4gaW50ZXJ2YWwuY291bnQoMCwgZCkgJSBzdGVwID09PSAwOyB9KTsKICAgICAgICB9OwogICAgICB9CgogICAgICByZXR1cm4gaW50ZXJ2YWw7CiAgICB9CgogICAgdmFyIGR1cmF0aW9uTWludXRlJDUgPSA2ZTQ7CiAgICB2YXIgZHVyYXRpb25EYXkkNSA9IDg2NGU1OwogICAgdmFyIGR1cmF0aW9uV2VlayQ1ID0gNjA0OGU1OwoKICAgIHZhciBkYXkkMyA9IG5ld0ludGVydmFsJDMoZnVuY3Rpb24oZGF0ZSkgewogICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICBkYXRlLnNldERhdGUoZGF0ZS5nZXREYXRlKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIChlbmQgLSBzdGFydCAtIChlbmQuZ2V0VGltZXpvbmVPZmZzZXQoKSAtIHN0YXJ0LmdldFRpbWV6b25lT2Zmc2V0KCkpICogZHVyYXRpb25NaW51dGUkNSkgLyBkdXJhdGlvbkRheSQ1OwogICAgfSwgZnVuY3Rpb24oZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCkgLSAxOwogICAgfSk7CgogICAgZnVuY3Rpb24gd2Vla2RheSQzKGkpIHsKICAgICAgcmV0dXJuIG5ld0ludGVydmFsJDMoZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSAtIChkYXRlLmdldERheSgpICsgNyAtIGkpICUgNyk7CiAgICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICAgIGRhdGUuc2V0RGF0ZShkYXRlLmdldERhdGUoKSArIHN0ZXAgKiA3KTsKICAgICAgfSwgZnVuY3Rpb24oc3RhcnQsIGVuZCkgewogICAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQgLSAoZW5kLmdldFRpbWV6b25lT2Zmc2V0KCkgLSBzdGFydC5nZXRUaW1lem9uZU9mZnNldCgpKSAqIGR1cmF0aW9uTWludXRlJDUpIC8gZHVyYXRpb25XZWVrJDU7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBzdW5kYXkkMyA9IHdlZWtkYXkkMygwKTsKICAgIHZhciBtb25kYXkkMyA9IHdlZWtkYXkkMygxKTsKICAgIHZhciB0dWVzZGF5JDMgPSB3ZWVrZGF5JDMoMik7CiAgICB2YXIgd2VkbmVzZGF5JDMgPSB3ZWVrZGF5JDMoMyk7CiAgICB2YXIgdGh1cnNkYXkkMyA9IHdlZWtkYXkkMyg0KTsKICAgIHZhciBmcmlkYXkkMyA9IHdlZWtkYXkkMyg1KTsKICAgIHZhciBzYXR1cmRheSQzID0gd2Vla2RheSQzKDYpOwoKICAgIHZhciB5ZWFyJDMgPSBuZXdJbnRlcnZhbCQzKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICAgICAgZGF0ZS5zZXRIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwKTsKICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgcmV0dXJuIGVuZC5nZXRGdWxsWWVhcigpIC0gc3RhcnQuZ2V0RnVsbFllYXIoKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgIH0pOwoKICAgIC8vIEFuIG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhpcyBzaW1wbGUgY2FzZS4KICAgIHllYXIkMy5ldmVyeSA9IGZ1bmN0aW9uKGspIHsKICAgICAgcmV0dXJuICFpc0Zpbml0ZShrID0gTWF0aC5mbG9vcihrKSkgfHwgIShrID4gMCkgPyBudWxsIDogbmV3SW50ZXJ2YWwkMyhmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihNYXRoLmZsb29yKGRhdGUuZ2V0RnVsbFllYXIoKSAvIGspICogayk7CiAgICAgICAgZGF0ZS5zZXRNb250aCgwLCAxKTsKICAgICAgICBkYXRlLnNldEhvdXJzKDAsIDAsIDAsIDApOwogICAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkgKyBzdGVwICogayk7CiAgICAgIH0pOwogICAgfTsKCiAgICB2YXIgdXRjRGF5JDMgPSBuZXdJbnRlcnZhbCQzKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgZGF0ZS5zZXRVVENEYXRlKGRhdGUuZ2V0VVRDRGF0ZSgpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiAoZW5kIC0gc3RhcnQpIC8gZHVyYXRpb25EYXkkNTsKICAgIH0sIGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgcmV0dXJuIGRhdGUuZ2V0VVRDRGF0ZSgpIC0gMTsKICAgIH0pOwoKICAgIGZ1bmN0aW9uIHV0Y1dlZWtkYXkkMyhpKSB7CiAgICAgIHJldHVybiBuZXdJbnRlcnZhbCQzKGZ1bmN0aW9uKGRhdGUpIHsKICAgICAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgLSAoZGF0ZS5nZXRVVENEYXkoKSArIDcgLSBpKSAlIDcpOwogICAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICAgIH0sIGZ1bmN0aW9uKGRhdGUsIHN0ZXApIHsKICAgICAgICBkYXRlLnNldFVUQ0RhdGUoZGF0ZS5nZXRVVENEYXRlKCkgKyBzdGVwICogNyk7CiAgICAgIH0sIGZ1bmN0aW9uKHN0YXJ0LCBlbmQpIHsKICAgICAgICByZXR1cm4gKGVuZCAtIHN0YXJ0KSAvIGR1cmF0aW9uV2VlayQ1OwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgdXRjU3VuZGF5JDMgPSB1dGNXZWVrZGF5JDMoMCk7CiAgICB2YXIgdXRjTW9uZGF5JDMgPSB1dGNXZWVrZGF5JDMoMSk7CiAgICB2YXIgdXRjVHVlc2RheSQzID0gdXRjV2Vla2RheSQzKDIpOwogICAgdmFyIHV0Y1dlZG5lc2RheSQzID0gdXRjV2Vla2RheSQzKDMpOwogICAgdmFyIHV0Y1RodXJzZGF5JDMgPSB1dGNXZWVrZGF5JDMoNCk7CiAgICB2YXIgdXRjRnJpZGF5JDMgPSB1dGNXZWVrZGF5JDMoNSk7CiAgICB2YXIgdXRjU2F0dXJkYXkkMyA9IHV0Y1dlZWtkYXkkMyg2KTsKCiAgICB2YXIgdXRjWWVhciQzID0gbmV3SW50ZXJ2YWwkMyhmdW5jdGlvbihkYXRlKSB7CiAgICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7CiAgICAgIGRhdGUuc2V0VVRDSG91cnMoMCwgMCwgMCwgMCk7CiAgICB9LCBmdW5jdGlvbihkYXRlLCBzdGVwKSB7CiAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCk7CiAgICB9LCBmdW5jdGlvbihzdGFydCwgZW5kKSB7CiAgICAgIHJldHVybiBlbmQuZ2V0VVRDRnVsbFllYXIoKSAtIHN0YXJ0LmdldFVUQ0Z1bGxZZWFyKCk7CiAgICB9LCBmdW5jdGlvbihkYXRlKSB7CiAgICAgIHJldHVybiBkYXRlLmdldFVUQ0Z1bGxZZWFyKCk7CiAgICB9KTsKCiAgICAvLyBBbiBvcHRpbWl6ZWQgaW1wbGVtZW50YXRpb24gZm9yIHRoaXMgc2ltcGxlIGNhc2UuCiAgICB1dGNZZWFyJDMuZXZlcnkgPSBmdW5jdGlvbihrKSB7CiAgICAgIHJldHVybiAhaXNGaW5pdGUoayA9IE1hdGguZmxvb3IoaykpIHx8ICEoayA+IDApID8gbnVsbCA6IG5ld0ludGVydmFsJDMoZnVuY3Rpb24oZGF0ZSkgewogICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoTWF0aC5mbG9vcihkYXRlLmdldFVUQ0Z1bGxZZWFyKCkgLyBrKSAqIGspOwogICAgICAgIGRhdGUuc2V0VVRDTW9udGgoMCwgMSk7CiAgICAgICAgZGF0ZS5zZXRVVENIb3VycygwLCAwLCAwLCAwKTsKICAgICAgfSwgZnVuY3Rpb24oZGF0ZSwgc3RlcCkgewogICAgICAgIGRhdGUuc2V0VVRDRnVsbFllYXIoZGF0ZS5nZXRVVENGdWxsWWVhcigpICsgc3RlcCAqIGspOwogICAgICB9KTsKICAgIH07CgogICAgZnVuY3Rpb24gbG9jYWxEYXRlJDIoZCkgewogICAgICBpZiAoMCA8PSBkLnkgJiYgZC55IDwgMTAwKSB7CiAgICAgICAgdmFyIGRhdGUgPSBuZXcgRGF0ZSgtMSwgZC5tLCBkLmQsIGQuSCwgZC5NLCBkLlMsIGQuTCk7CiAgICAgICAgZGF0ZS5zZXRGdWxsWWVhcihkLnkpOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZShkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpOwogICAgfQoKICAgIGZ1bmN0aW9uIHV0Y0RhdGUkMihkKSB7CiAgICAgIGlmICgwIDw9IGQueSAmJiBkLnkgPCAxMDApIHsKICAgICAgICB2YXIgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKC0xLCBkLm0sIGQuZCwgZC5ILCBkLk0sIGQuUywgZC5MKSk7CiAgICAgICAgZGF0ZS5zZXRVVENGdWxsWWVhcihkLnkpOwogICAgICAgIHJldHVybiBkYXRlOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhkLnksIGQubSwgZC5kLCBkLkgsIGQuTSwgZC5TLCBkLkwpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXdZZWFyKHkpIHsKICAgICAgcmV0dXJuIHt5OiB5LCBtOiAwLCBkOiAxLCBIOiAwLCBNOiAwLCBTOiAwLCBMOiAwfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRMb2NhbGUkNShsb2NhbGUpIHsKICAgICAgdmFyIGxvY2FsZV9kYXRlVGltZSA9IGxvY2FsZS5kYXRlVGltZSwKICAgICAgICAgIGxvY2FsZV9kYXRlID0gbG9jYWxlLmRhdGUsCiAgICAgICAgICBsb2NhbGVfdGltZSA9IGxvY2FsZS50aW1lLAogICAgICAgICAgbG9jYWxlX3BlcmlvZHMgPSBsb2NhbGUucGVyaW9kcywKICAgICAgICAgIGxvY2FsZV93ZWVrZGF5cyA9IGxvY2FsZS5kYXlzLAogICAgICAgICAgbG9jYWxlX3Nob3J0V2Vla2RheXMgPSBsb2NhbGUuc2hvcnREYXlzLAogICAgICAgICAgbG9jYWxlX21vbnRocyA9IGxvY2FsZS5tb250aHMsCiAgICAgICAgICBsb2NhbGVfc2hvcnRNb250aHMgPSBsb2NhbGUuc2hvcnRNb250aHM7CgogICAgICB2YXIgcGVyaW9kUmUgPSBmb3JtYXRSZSQyKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgICAgIHBlcmlvZExvb2t1cCA9IGZvcm1hdExvb2t1cCQyKGxvY2FsZV9wZXJpb2RzKSwKICAgICAgICAgIHdlZWtkYXlSZSA9IGZvcm1hdFJlJDIobG9jYWxlX3dlZWtkYXlzKSwKICAgICAgICAgIHdlZWtkYXlMb29rdXAgPSBmb3JtYXRMb29rdXAkMihsb2NhbGVfd2Vla2RheXMpLAogICAgICAgICAgc2hvcnRXZWVrZGF5UmUgPSBmb3JtYXRSZSQyKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgICAgIHNob3J0V2Vla2RheUxvb2t1cCA9IGZvcm1hdExvb2t1cCQyKGxvY2FsZV9zaG9ydFdlZWtkYXlzKSwKICAgICAgICAgIG1vbnRoUmUgPSBmb3JtYXRSZSQyKGxvY2FsZV9tb250aHMpLAogICAgICAgICAgbW9udGhMb29rdXAgPSBmb3JtYXRMb29rdXAkMihsb2NhbGVfbW9udGhzKSwKICAgICAgICAgIHNob3J0TW9udGhSZSA9IGZvcm1hdFJlJDIobG9jYWxlX3Nob3J0TW9udGhzKSwKICAgICAgICAgIHNob3J0TW9udGhMb29rdXAgPSBmb3JtYXRMb29rdXAkMihsb2NhbGVfc2hvcnRNb250aHMpOwoKICAgICAgdmFyIGZvcm1hdHMgPSB7CiAgICAgICAgImEiOiBmb3JtYXRTaG9ydFdlZWtkYXksCiAgICAgICAgIkEiOiBmb3JtYXRXZWVrZGF5LAogICAgICAgICJiIjogZm9ybWF0U2hvcnRNb250aCwKICAgICAgICAiQiI6IGZvcm1hdE1vbnRoLAogICAgICAgICJjIjogbnVsbCwKICAgICAgICAiZCI6IGZvcm1hdERheU9mTW9udGgkMiwKICAgICAgICAiZSI6IGZvcm1hdERheU9mTW9udGgkMiwKICAgICAgICAiZiI6IGZvcm1hdE1pY3Jvc2Vjb25kcyQyLAogICAgICAgICJIIjogZm9ybWF0SG91cjI0JDIsCiAgICAgICAgIkkiOiBmb3JtYXRIb3VyMTIkMiwKICAgICAgICAiaiI6IGZvcm1hdERheU9mWWVhciQyLAogICAgICAgICJMIjogZm9ybWF0TWlsbGlzZWNvbmRzJDIsCiAgICAgICAgIm0iOiBmb3JtYXRNb250aE51bWJlciQyLAogICAgICAgICJNIjogZm9ybWF0TWludXRlcyQyLAogICAgICAgICJwIjogZm9ybWF0UGVyaW9kLAogICAgICAgICJRIjogZm9ybWF0VW5peFRpbWVzdGFtcCQyLAogICAgICAgICJzIjogZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMkMiwKICAgICAgICAiUyI6IGZvcm1hdFNlY29uZHMkMiwKICAgICAgICAidSI6IGZvcm1hdFdlZWtkYXlOdW1iZXJNb25kYXkkMiwKICAgICAgICAiVSI6IGZvcm1hdFdlZWtOdW1iZXJTdW5kYXkkMiwKICAgICAgICAiViI6IGZvcm1hdFdlZWtOdW1iZXJJU08kMiwKICAgICAgICAidyI6IGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkkMiwKICAgICAgICAiVyI6IGZvcm1hdFdlZWtOdW1iZXJNb25kYXkkMiwKICAgICAgICAieCI6IG51bGwsCiAgICAgICAgIlgiOiBudWxsLAogICAgICAgICJ5IjogZm9ybWF0WWVhciQzLAogICAgICAgICJZIjogZm9ybWF0RnVsbFllYXIkMiwKICAgICAgICAiWiI6IGZvcm1hdFpvbmUkMiwKICAgICAgICAiJSI6IGZvcm1hdExpdGVyYWxQZXJjZW50JDIKICAgICAgfTsKCiAgICAgIHZhciB1dGNGb3JtYXRzID0gewogICAgICAgICJhIjogZm9ybWF0VVRDU2hvcnRXZWVrZGF5LAogICAgICAgICJBIjogZm9ybWF0VVRDV2Vla2RheSwKICAgICAgICAiYiI6IGZvcm1hdFVUQ1Nob3J0TW9udGgsCiAgICAgICAgIkIiOiBmb3JtYXRVVENNb250aCwKICAgICAgICAiYyI6IG51bGwsCiAgICAgICAgImQiOiBmb3JtYXRVVENEYXlPZk1vbnRoJDIsCiAgICAgICAgImUiOiBmb3JtYXRVVENEYXlPZk1vbnRoJDIsCiAgICAgICAgImYiOiBmb3JtYXRVVENNaWNyb3NlY29uZHMkMiwKICAgICAgICAiSCI6IGZvcm1hdFVUQ0hvdXIyNCQyLAogICAgICAgICJJIjogZm9ybWF0VVRDSG91cjEyJDIsCiAgICAgICAgImoiOiBmb3JtYXRVVENEYXlPZlllYXIkMiwKICAgICAgICAiTCI6IGZvcm1hdFVUQ01pbGxpc2Vjb25kcyQyLAogICAgICAgICJtIjogZm9ybWF0VVRDTW9udGhOdW1iZXIkMiwKICAgICAgICAiTSI6IGZvcm1hdFVUQ01pbnV0ZXMkMiwKICAgICAgICAicCI6IGZvcm1hdFVUQ1BlcmlvZCwKICAgICAgICAiUSI6IGZvcm1hdFVuaXhUaW1lc3RhbXAkMiwKICAgICAgICAicyI6IGZvcm1hdFVuaXhUaW1lc3RhbXBTZWNvbmRzJDIsCiAgICAgICAgIlMiOiBmb3JtYXRVVENTZWNvbmRzJDIsCiAgICAgICAgInUiOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyTW9uZGF5JDIsCiAgICAgICAgIlUiOiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5JDIsCiAgICAgICAgIlYiOiBmb3JtYXRVVENXZWVrTnVtYmVySVNPJDIsCiAgICAgICAgInciOiBmb3JtYXRVVENXZWVrZGF5TnVtYmVyU3VuZGF5JDIsCiAgICAgICAgIlciOiBmb3JtYXRVVENXZWVrTnVtYmVyTW9uZGF5JDIsCiAgICAgICAgIngiOiBudWxsLAogICAgICAgICJYIjogbnVsbCwKICAgICAgICAieSI6IGZvcm1hdFVUQ1llYXIkMiwKICAgICAgICAiWSI6IGZvcm1hdFVUQ0Z1bGxZZWFyJDIsCiAgICAgICAgIloiOiBmb3JtYXRVVENab25lJDIsCiAgICAgICAgIiUiOiBmb3JtYXRMaXRlcmFsUGVyY2VudCQyCiAgICAgIH07CgogICAgICB2YXIgcGFyc2VzID0gewogICAgICAgICJhIjogcGFyc2VTaG9ydFdlZWtkYXksCiAgICAgICAgIkEiOiBwYXJzZVdlZWtkYXksCiAgICAgICAgImIiOiBwYXJzZVNob3J0TW9udGgsCiAgICAgICAgIkIiOiBwYXJzZU1vbnRoLAogICAgICAgICJjIjogcGFyc2VMb2NhbGVEYXRlVGltZSwKICAgICAgICAiZCI6IHBhcnNlRGF5T2ZNb250aCQyLAogICAgICAgICJlIjogcGFyc2VEYXlPZk1vbnRoJDIsCiAgICAgICAgImYiOiBwYXJzZU1pY3Jvc2Vjb25kcyQyLAogICAgICAgICJIIjogcGFyc2VIb3VyMjQkMiwKICAgICAgICAiSSI6IHBhcnNlSG91cjI0JDIsCiAgICAgICAgImoiOiBwYXJzZURheU9mWWVhciQyLAogICAgICAgICJMIjogcGFyc2VNaWxsaXNlY29uZHMkMiwKICAgICAgICAibSI6IHBhcnNlTW9udGhOdW1iZXIkMiwKICAgICAgICAiTSI6IHBhcnNlTWludXRlcyQyLAogICAgICAgICJwIjogcGFyc2VQZXJpb2QsCiAgICAgICAgIlEiOiBwYXJzZVVuaXhUaW1lc3RhbXAkMiwKICAgICAgICAicyI6IHBhcnNlVW5peFRpbWVzdGFtcFNlY29uZHMkMiwKICAgICAgICAiUyI6IHBhcnNlU2Vjb25kcyQyLAogICAgICAgICJ1IjogcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5JDIsCiAgICAgICAgIlUiOiBwYXJzZVdlZWtOdW1iZXJTdW5kYXkkMiwKICAgICAgICAiViI6IHBhcnNlV2Vla051bWJlcklTTyQyLAogICAgICAgICJ3IjogcGFyc2VXZWVrZGF5TnVtYmVyU3VuZGF5JDIsCiAgICAgICAgIlciOiBwYXJzZVdlZWtOdW1iZXJNb25kYXkkMiwKICAgICAgICAieCI6IHBhcnNlTG9jYWxlRGF0ZSwKICAgICAgICAiWCI6IHBhcnNlTG9jYWxlVGltZSwKICAgICAgICAieSI6IHBhcnNlWWVhciQyLAogICAgICAgICJZIjogcGFyc2VGdWxsWWVhciQyLAogICAgICAgICJaIjogcGFyc2Vab25lJDIsCiAgICAgICAgIiUiOiBwYXJzZUxpdGVyYWxQZXJjZW50JDIKICAgICAgfTsKCiAgICAgIC8vIFRoZXNlIHJlY3Vyc2l2ZSBkaXJlY3RpdmUgZGVmaW5pdGlvbnMgbXVzdCBiZSBkZWZlcnJlZC4KICAgICAgZm9ybWF0cy54ID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlLCBmb3JtYXRzKTsKICAgICAgZm9ybWF0cy5YID0gbmV3Rm9ybWF0KGxvY2FsZV90aW1lLCBmb3JtYXRzKTsKICAgICAgZm9ybWF0cy5jID0gbmV3Rm9ybWF0KGxvY2FsZV9kYXRlVGltZSwgZm9ybWF0cyk7CiAgICAgIHV0Y0Zvcm1hdHMueCA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZSwgdXRjRm9ybWF0cyk7CiAgICAgIHV0Y0Zvcm1hdHMuWCA9IG5ld0Zvcm1hdChsb2NhbGVfdGltZSwgdXRjRm9ybWF0cyk7CiAgICAgIHV0Y0Zvcm1hdHMuYyA9IG5ld0Zvcm1hdChsb2NhbGVfZGF0ZVRpbWUsIHV0Y0Zvcm1hdHMpOwoKICAgICAgZnVuY3Rpb24gbmV3Rm9ybWF0KHNwZWNpZmllciwgZm9ybWF0cykgewogICAgICAgIHJldHVybiBmdW5jdGlvbihkYXRlKSB7CiAgICAgICAgICB2YXIgc3RyaW5nID0gW10sCiAgICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICAgIGogPSAwLAogICAgICAgICAgICAgIG4gPSBzcGVjaWZpZXIubGVuZ3RoLAogICAgICAgICAgICAgIGMsCiAgICAgICAgICAgICAgcGFkLAogICAgICAgICAgICAgIGZvcm1hdDsKCiAgICAgICAgICBpZiAoIShkYXRlIGluc3RhbmNlb2YgRGF0ZSkpIGRhdGUgPSBuZXcgRGF0ZSgrZGF0ZSk7CgogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgICAgaWYgKHNwZWNpZmllci5jaGFyQ29kZUF0KGkpID09PSAzNykgewogICAgICAgICAgICAgIHN0cmluZy5wdXNoKHNwZWNpZmllci5zbGljZShqLCBpKSk7CiAgICAgICAgICAgICAgaWYgKChwYWQgPSBwYWRzJDJbYyA9IHNwZWNpZmllci5jaGFyQXQoKytpKV0pICE9IG51bGwpIGMgPSBzcGVjaWZpZXIuY2hhckF0KCsraSk7CiAgICAgICAgICAgICAgZWxzZSBwYWQgPSBjID09PSAiZSIgPyAiICIgOiAiMCI7CiAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9IGZvcm1hdHNbY10pIGMgPSBmb3JtYXQoZGF0ZSwgcGFkKTsKICAgICAgICAgICAgICBzdHJpbmcucHVzaChjKTsKICAgICAgICAgICAgICBqID0gaSArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KCiAgICAgICAgICBzdHJpbmcucHVzaChzcGVjaWZpZXIuc2xpY2UoaiwgaSkpOwogICAgICAgICAgcmV0dXJuIHN0cmluZy5qb2luKCIiKTsKICAgICAgICB9OwogICAgICB9CgogICAgICBmdW5jdGlvbiBuZXdQYXJzZShzcGVjaWZpZXIsIG5ld0RhdGUpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7CiAgICAgICAgICB2YXIgZCA9IG5ld1llYXIoMTkwMCksCiAgICAgICAgICAgICAgaSA9IHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nICs9ICIiLCAwKSwKICAgICAgICAgICAgICB3ZWVrLCBkYXk7CiAgICAgICAgICBpZiAoaSAhPSBzdHJpbmcubGVuZ3RoKSByZXR1cm4gbnVsbDsKCiAgICAgICAgICAvLyBJZiBhIFVOSVggdGltZXN0YW1wIGlzIHNwZWNpZmllZCwgcmV0dXJuIGl0LgogICAgICAgICAgaWYgKCJRIiBpbiBkKSByZXR1cm4gbmV3IERhdGUoZC5RKTsKCiAgICAgICAgICAvLyBUaGUgYW0tcG0gZmxhZyBpcyAwIGZvciBBTSwgYW5kIDEgZm9yIFBNLgogICAgICAgICAgaWYgKCJwIiBpbiBkKSBkLkggPSBkLkggJSAxMiArIGQucCAqIDEyOwoKICAgICAgICAgIC8vIENvbnZlcnQgZGF5LW9mLXdlZWsgYW5kIHdlZWstb2YteWVhciB0byBkYXktb2YteWVhci4KICAgICAgICAgIGlmICgiViIgaW4gZCkgewogICAgICAgICAgICBpZiAoZC5WIDwgMSB8fCBkLlYgPiA1MykgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGlmICghKCJ3IiBpbiBkKSkgZC53ID0gMTsKICAgICAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICAgICAgd2VlayA9IHV0Y0RhdGUkMihuZXdZZWFyKGQueSkpLCBkYXkgPSB3ZWVrLmdldFVUQ0RheSgpOwogICAgICAgICAgICAgIHdlZWsgPSBkYXkgPiA0IHx8IGRheSA9PT0gMCA/IHV0Y01vbmRheSQzLmNlaWwod2VlaykgOiB1dGNNb25kYXkkMyh3ZWVrKTsKICAgICAgICAgICAgICB3ZWVrID0gdXRjRGF5JDMub2Zmc2V0KHdlZWssIChkLlYgLSAxKSAqIDcpOwogICAgICAgICAgICAgIGQueSA9IHdlZWsuZ2V0VVRDRnVsbFllYXIoKTsKICAgICAgICAgICAgICBkLm0gPSB3ZWVrLmdldFVUQ01vbnRoKCk7CiAgICAgICAgICAgICAgZC5kID0gd2Vlay5nZXRVVENEYXRlKCkgKyAoZC53ICsgNikgJSA3OwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIHdlZWsgPSBuZXdEYXRlKG5ld1llYXIoZC55KSksIGRheSA9IHdlZWsuZ2V0RGF5KCk7CiAgICAgICAgICAgICAgd2VlayA9IGRheSA+IDQgfHwgZGF5ID09PSAwID8gbW9uZGF5JDMuY2VpbCh3ZWVrKSA6IG1vbmRheSQzKHdlZWspOwogICAgICAgICAgICAgIHdlZWsgPSBkYXkkMy5vZmZzZXQod2VlaywgKGQuViAtIDEpICogNyk7CiAgICAgICAgICAgICAgZC55ID0gd2Vlay5nZXRGdWxsWWVhcigpOwogICAgICAgICAgICAgIGQubSA9IHdlZWsuZ2V0TW9udGgoKTsKICAgICAgICAgICAgICBkLmQgPSB3ZWVrLmdldERhdGUoKSArIChkLncgKyA2KSAlIDc7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoIlciIGluIGQgfHwgIlUiIGluIGQpIHsKICAgICAgICAgICAgaWYgKCEoInciIGluIGQpKSBkLncgPSAidSIgaW4gZCA/IGQudSAlIDcgOiAiVyIgaW4gZCA/IDEgOiAwOwogICAgICAgICAgICBkYXkgPSAiWiIgaW4gZCA/IHV0Y0RhdGUkMihuZXdZZWFyKGQueSkpLmdldFVUQ0RheSgpIDogbmV3RGF0ZShuZXdZZWFyKGQueSkpLmdldERheSgpOwogICAgICAgICAgICBkLm0gPSAwOwogICAgICAgICAgICBkLmQgPSAiVyIgaW4gZCA/IChkLncgKyA2KSAlIDcgKyBkLlcgKiA3IC0gKGRheSArIDUpICUgNyA6IGQudyArIGQuVSAqIDcgLSAoZGF5ICsgNikgJSA3OwogICAgICAgICAgfQoKICAgICAgICAgIC8vIElmIGEgdGltZSB6b25lIGlzIHNwZWNpZmllZCwgYWxsIGZpZWxkcyBhcmUgaW50ZXJwcmV0ZWQgYXMgVVRDIGFuZCB0aGVuCiAgICAgICAgICAvLyBvZmZzZXQgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgdGltZSB6b25lLgogICAgICAgICAgaWYgKCJaIiBpbiBkKSB7CiAgICAgICAgICAgIGQuSCArPSBkLlogLyAxMDAgfCAwOwogICAgICAgICAgICBkLk0gKz0gZC5aICUgMTAwOwogICAgICAgICAgICByZXR1cm4gdXRjRGF0ZSQyKGQpOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIE90aGVyd2lzZSwgYWxsIGZpZWxkcyBhcmUgaW4gbG9jYWwgdGltZS4KICAgICAgICAgIHJldHVybiBuZXdEYXRlKGQpOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlU3BlY2lmaWVyKGQsIHNwZWNpZmllciwgc3RyaW5nLCBqKSB7CiAgICAgICAgdmFyIGkgPSAwLAogICAgICAgICAgICBuID0gc3BlY2lmaWVyLmxlbmd0aCwKICAgICAgICAgICAgbSA9IHN0cmluZy5sZW5ndGgsCiAgICAgICAgICAgIGMsCiAgICAgICAgICAgIHBhcnNlOwoKICAgICAgICB3aGlsZSAoaSA8IG4pIHsKICAgICAgICAgIGlmIChqID49IG0pIHJldHVybiAtMTsKICAgICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckNvZGVBdChpKyspOwogICAgICAgICAgaWYgKGMgPT09IDM3KSB7CiAgICAgICAgICAgIGMgPSBzcGVjaWZpZXIuY2hhckF0KGkrKyk7CiAgICAgICAgICAgIHBhcnNlID0gcGFyc2VzW2MgaW4gcGFkcyQyID8gc3BlY2lmaWVyLmNoYXJBdChpKyspIDogY107CiAgICAgICAgICAgIGlmICghcGFyc2UgfHwgKChqID0gcGFyc2UoZCwgc3RyaW5nLCBqKSkgPCAwKSkgcmV0dXJuIC0xOwogICAgICAgICAgfSBlbHNlIGlmIChjICE9IHN0cmluZy5jaGFyQ29kZUF0KGorKykpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGo7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlUGVyaW9kKGQsIHN0cmluZywgaSkgewogICAgICAgIHZhciBuID0gcGVyaW9kUmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICAgIHJldHVybiBuID8gKGQucCA9IHBlcmlvZExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlU2hvcnRXZWVrZGF5KGQsIHN0cmluZywgaSkgewogICAgICAgIHZhciBuID0gc2hvcnRXZWVrZGF5UmUuZXhlYyhzdHJpbmcuc2xpY2UoaSkpOwogICAgICAgIHJldHVybiBuID8gKGQudyA9IHNob3J0V2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlV2Vla2RheShkLCBzdHJpbmcsIGkpIHsKICAgICAgICB2YXIgbiA9IHdlZWtkYXlSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgICAgcmV0dXJuIG4gPyAoZC53ID0gd2Vla2RheUxvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlU2hvcnRNb250aChkLCBzdHJpbmcsIGkpIHsKICAgICAgICB2YXIgbiA9IHNob3J0TW9udGhSZS5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgICAgcmV0dXJuIG4gPyAoZC5tID0gc2hvcnRNb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlTW9udGgoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgdmFyIG4gPSBtb250aFJlLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgICByZXR1cm4gbiA/IChkLm0gPSBtb250aExvb2t1cFtuWzBdLnRvTG93ZXJDYXNlKCldLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHBhcnNlTG9jYWxlRGF0ZVRpbWUoZCwgc3RyaW5nLCBpKSB7CiAgICAgICAgcmV0dXJuIHBhcnNlU3BlY2lmaWVyKGQsIGxvY2FsZV9kYXRlVGltZSwgc3RyaW5nLCBpKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VMb2NhbGVEYXRlKGQsIHN0cmluZywgaSkgewogICAgICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfZGF0ZSwgc3RyaW5nLCBpKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gcGFyc2VMb2NhbGVUaW1lKGQsIHN0cmluZywgaSkgewogICAgICAgIHJldHVybiBwYXJzZVNwZWNpZmllcihkLCBsb2NhbGVfdGltZSwgc3RyaW5nLCBpKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0U2hvcnRXZWVrZGF5KGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0V2Vla2RheXNbZC5nZXREYXkoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXkoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfd2Vla2RheXNbZC5nZXREYXkoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFNob3J0TW9udGgoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfc2hvcnRNb250aHNbZC5nZXRNb250aCgpXTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gZm9ybWF0TW9udGgoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfbW9udGhzW2QuZ2V0TW9udGgoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFBlcmlvZChkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9wZXJpb2RzWysoZC5nZXRIb3VycygpID49IDEyKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1Nob3J0V2Vla2RheShkKSB7CiAgICAgICAgcmV0dXJuIGxvY2FsZV9zaG9ydFdlZWtkYXlzW2QuZ2V0VVRDRGF5KCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrZGF5KGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3dlZWtkYXlzW2QuZ2V0VVRDRGF5KCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRVVENTaG9ydE1vbnRoKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX3Nob3J0TW9udGhzW2QuZ2V0VVRDTW9udGgoKV07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ01vbnRoKGQpIHsKICAgICAgICByZXR1cm4gbG9jYWxlX21vbnRoc1tkLmdldFVUQ01vbnRoKCldOwogICAgICB9CgogICAgICBmdW5jdGlvbiBmb3JtYXRVVENQZXJpb2QoZCkgewogICAgICAgIHJldHVybiBsb2NhbGVfcGVyaW9kc1srKGQuZ2V0VVRDSG91cnMoKSA+PSAxMildOwogICAgICB9CgogICAgICByZXR1cm4gewogICAgICAgIGZvcm1hdDogZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgICAgICB2YXIgZiA9IG5ld0Zvcm1hdChzcGVjaWZpZXIgKz0gIiIsIGZvcm1hdHMpOwogICAgICAgICAgZi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9OwogICAgICAgICAgcmV0dXJuIGY7CiAgICAgICAgfSwKICAgICAgICBwYXJzZTogZnVuY3Rpb24oc3BlY2lmaWVyKSB7CiAgICAgICAgICB2YXIgcCA9IG5ld1BhcnNlKHNwZWNpZmllciArPSAiIiwgbG9jYWxEYXRlJDIpOwogICAgICAgICAgcC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gc3BlY2lmaWVyOyB9OwogICAgICAgICAgcmV0dXJuIHA7CiAgICAgICAgfSwKICAgICAgICB1dGNGb3JtYXQ6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoc3BlY2lmaWVyICs9ICIiLCB1dGNGb3JtYXRzKTsKICAgICAgICAgIGYudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHNwZWNpZmllcjsgfTsKICAgICAgICAgIHJldHVybiBmOwogICAgICAgIH0sCiAgICAgICAgdXRjUGFyc2U6IGZ1bmN0aW9uKHNwZWNpZmllcikgewogICAgICAgICAgdmFyIHAgPSBuZXdQYXJzZShzcGVjaWZpZXIsIHV0Y0RhdGUkMik7CiAgICAgICAgICBwLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7IHJldHVybiBzcGVjaWZpZXI7IH07CiAgICAgICAgICByZXR1cm4gcDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgdmFyIHBhZHMkMiA9IHsiLSI6ICIiLCAiXyI6ICIgIiwgIjAiOiAiMCJ9LAogICAgICAgIG51bWJlclJlJDIgPSAvXlxzKlxkKy8sIC8vIG5vdGU6IGlnbm9yZXMgbmV4dCBkaXJlY3RpdmUKICAgICAgICBwZXJjZW50UmUkMiA9IC9eJS8sCiAgICAgICAgcmVxdW90ZVJlJDIgPSAvW1xcXiQqKz98W1xdKCkue31dL2c7CgogICAgZnVuY3Rpb24gcGFkJDModmFsdWUsIGZpbGwsIHdpZHRoKSB7CiAgICAgIHZhciBzaWduID0gdmFsdWUgPCAwID8gIi0iIDogIiIsCiAgICAgICAgICBzdHJpbmcgPSAoc2lnbiA/IC12YWx1ZSA6IHZhbHVlKSArICIiLAogICAgICAgICAgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aDsKICAgICAgcmV0dXJuIHNpZ24gKyAobGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpICsgc3RyaW5nIDogc3RyaW5nKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXF1b3RlJDIocykgewogICAgICByZXR1cm4gcy5yZXBsYWNlKHJlcXVvdGVSZSQyLCAiXFwkJiIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFJlJDIobmFtZXMpIHsKICAgICAgcmV0dXJuIG5ldyBSZWdFeHAoIl4oPzoiICsgbmFtZXMubWFwKHJlcXVvdGUkMikuam9pbigifCIpICsgIikiLCAiaSIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdExvb2t1cCQyKG5hbWVzKSB7CiAgICAgIHZhciBtYXAgPSB7fSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgbWFwW25hbWVzW2ldLnRvTG93ZXJDYXNlKCldID0gaTsKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVdlZWtkYXlOdW1iZXJTdW5kYXkkMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAxKSk7CiAgICAgIHJldHVybiBuID8gKGQudyA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VXZWVrZGF5TnVtYmVyTW9uZGF5JDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMi5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMSkpOwogICAgICByZXR1cm4gbiA/IChkLnUgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlV2Vla051bWJlclN1bmRheSQyKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDIuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5VID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVdlZWtOdW1iZXJJU08kMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICAgIHJldHVybiBuID8gKGQuViA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VXZWVrTnVtYmVyTW9uZGF5JDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMi5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLlcgPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlRnVsbFllYXIkMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA0KSk7CiAgICAgIHJldHVybiBuID8gKGQueSA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VZZWFyJDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMi5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLnkgPSArblswXSArICgrblswXSA+IDY4ID8gMTkwMCA6IDIwMDApLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2Vab25lJDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gL14oWil8KFsrLV1cZFxkKSg/Ojo/KFxkXGQpKT8vLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyA2KSk7CiAgICAgIHJldHVybiBuID8gKGQuWiA9IG5bMV0gPyAwIDogLShuWzJdICsgKG5bM10gfHwgIjAwIikpLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VNb250aE51bWJlciQyKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDIuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5tID0gblswXSAtIDEsIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZURheU9mTW9udGgkMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICAgIHJldHVybiBuID8gKGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VEYXlPZlllYXIkMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAzKSk7CiAgICAgIHJldHVybiBuID8gKGQubSA9IDAsIGQuZCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VIb3VyMjQkMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGksIGkgKyAyKSk7CiAgICAgIHJldHVybiBuID8gKGQuSCA9ICtuWzBdLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VNaW51dGVzJDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMi5leGVjKHN0cmluZy5zbGljZShpLCBpICsgMikpOwogICAgICByZXR1cm4gbiA/IChkLk0gPSArblswXSwgaSArIG5bMF0ubGVuZ3RoKSA6IC0xOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlU2Vjb25kcyQyKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDIuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDIpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5TID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU1pbGxpc2Vjb25kcyQyKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDIuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDMpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5MID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZU1pY3Jvc2Vjb25kcyQyKGQsIHN0cmluZywgaSkgewogICAgICB2YXIgbiA9IG51bWJlclJlJDIuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDYpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5MID0gTWF0aC5mbG9vcihuWzBdIC8gMTAwMCksIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZUxpdGVyYWxQZXJjZW50JDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gcGVyY2VudFJlJDIuZXhlYyhzdHJpbmcuc2xpY2UoaSwgaSArIDEpKTsKICAgICAgcmV0dXJuIG4gPyBpICsgblswXS5sZW5ndGggOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVVuaXhUaW1lc3RhbXAkMihkLCBzdHJpbmcsIGkpIHsKICAgICAgdmFyIG4gPSBudW1iZXJSZSQyLmV4ZWMoc3RyaW5nLnNsaWNlKGkpKTsKICAgICAgcmV0dXJuIG4gPyAoZC5RID0gK25bMF0sIGkgKyBuWzBdLmxlbmd0aCkgOiAtMTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVVuaXhUaW1lc3RhbXBTZWNvbmRzJDIoZCwgc3RyaW5nLCBpKSB7CiAgICAgIHZhciBuID0gbnVtYmVyUmUkMi5leGVjKHN0cmluZy5zbGljZShpKSk7CiAgICAgIHJldHVybiBuID8gKGQuUSA9ICgrblswXSkgKiAxMDAwLCBpICsgblswXS5sZW5ndGgpIDogLTE7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0RGF5T2ZNb250aCQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0RGF0ZSgpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRIb3VyMjQkMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMyhkLmdldEhvdXJzKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdEhvdXIxMiQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0SG91cnMoKSAlIDEyIHx8IDEyLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXREYXlPZlllYXIkMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMygxICsgZGF5JDMuY291bnQoeWVhciQzKGQpLCBkKSwgcCwgMyk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TWlsbGlzZWNvbmRzJDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRNaWxsaXNlY29uZHMoKSwgcCwgMyk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TWljcm9zZWNvbmRzJDIoZCwgcCkgewogICAgICByZXR1cm4gZm9ybWF0TWlsbGlzZWNvbmRzJDIoZCwgcCkgKyAiMDAwIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRNb250aE51bWJlciQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0TW9udGgoKSArIDEsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdE1pbnV0ZXMkMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMyhkLmdldE1pbnV0ZXMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0U2Vjb25kcyQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0U2Vjb25kcygpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRXZWVrZGF5TnVtYmVyTW9uZGF5JDIoZCkgewogICAgICB2YXIgZGF5ID0gZC5nZXREYXkoKTsKICAgICAgcmV0dXJuIGRheSA9PT0gMCA/IDcgOiBkYXk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0V2Vla051bWJlclN1bmRheSQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKHN1bmRheSQzLmNvdW50KHllYXIkMyhkKSwgZCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJJU08kMihkLCBwKSB7CiAgICAgIHZhciBkYXkgPSBkLmdldERheSgpOwogICAgICBkID0gKGRheSA+PSA0IHx8IGRheSA9PT0gMCkgPyB0aHVyc2RheSQzKGQpIDogdGh1cnNkYXkkMy5jZWlsKGQpOwogICAgICByZXR1cm4gcGFkJDModGh1cnNkYXkkMy5jb3VudCh5ZWFyJDMoZCksIGQpICsgKHllYXIkMyhkKS5nZXREYXkoKSA9PT0gNCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtkYXlOdW1iZXJTdW5kYXkkMihkKSB7CiAgICAgIHJldHVybiBkLmdldERheSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFdlZWtOdW1iZXJNb25kYXkkMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMyhtb25kYXkkMy5jb3VudCh5ZWFyJDMoZCksIGQpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRZZWFyJDMoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRGdWxsWWVhcigpICUgMTAwLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRGdWxsWWVhciQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0RnVsbFllYXIoKSAlIDEwMDAwLCBwLCA0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRab25lJDIoZCkgewogICAgICB2YXIgeiA9IGQuZ2V0VGltZXpvbmVPZmZzZXQoKTsKICAgICAgcmV0dXJuICh6ID4gMCA/ICItIiA6ICh6ICo9IC0xLCAiKyIpKQogICAgICAgICAgKyBwYWQkMyh6IC8gNjAgfCAwLCAiMCIsIDIpCiAgICAgICAgICArIHBhZCQzKHogJSA2MCwgIjAiLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENEYXlPZk1vbnRoJDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRVVENEYXRlKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ0hvdXIyNCQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0VVRDSG91cnMoKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDSG91cjEyJDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRVVENIb3VycygpICUgMTIgfHwgMTIsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ0RheU9mWWVhciQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKDEgKyB1dGNEYXkkMy5jb3VudCh1dGNZZWFyJDMoZCksIGQpLCBwLCAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENNaWxsaXNlY29uZHMkMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMyhkLmdldFVUQ01pbGxpc2Vjb25kcygpLCBwLCAzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENNaWNyb3NlY29uZHMkMihkLCBwKSB7CiAgICAgIHJldHVybiBmb3JtYXRVVENNaWxsaXNlY29uZHMkMihkLCBwKSArICIwMDAiOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ01vbnRoTnVtYmVyJDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRVVENNb250aCgpICsgMSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDTWludXRlcyQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKGQuZ2V0VVRDTWludXRlcygpLCBwLCAyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENTZWNvbmRzJDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRVVENTZWNvbmRzKCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1dlZWtkYXlOdW1iZXJNb25kYXkkMihkKSB7CiAgICAgIHZhciBkb3cgPSBkLmdldFVUQ0RheSgpOwogICAgICByZXR1cm4gZG93ID09PSAwID8gNyA6IGRvdzsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVVENXZWVrTnVtYmVyU3VuZGF5JDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDModXRjU3VuZGF5JDMuY291bnQodXRjWWVhciQzKGQpLCBkKSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlcklTTyQyKGQsIHApIHsKICAgICAgdmFyIGRheSA9IGQuZ2V0VVRDRGF5KCk7CiAgICAgIGQgPSAoZGF5ID49IDQgfHwgZGF5ID09PSAwKSA/IHV0Y1RodXJzZGF5JDMoZCkgOiB1dGNUaHVyc2RheSQzLmNlaWwoZCk7CiAgICAgIHJldHVybiBwYWQkMyh1dGNUaHVyc2RheSQzLmNvdW50KHV0Y1llYXIkMyhkKSwgZCkgKyAodXRjWWVhciQzKGQpLmdldFVUQ0RheSgpID09PSA0KSwgcCwgMik7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla2RheU51bWJlclN1bmRheSQyKGQpIHsKICAgICAgcmV0dXJuIGQuZ2V0VVRDRGF5KCk7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VVRDV2Vla051bWJlck1vbmRheSQyKGQsIHApIHsKICAgICAgcmV0dXJuIHBhZCQzKHV0Y01vbmRheSQzLmNvdW50KHV0Y1llYXIkMyhkKSwgZCksIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1llYXIkMihkLCBwKSB7CiAgICAgIHJldHVybiBwYWQkMyhkLmdldFVUQ0Z1bGxZZWFyKCkgJSAxMDAsIHAsIDIpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ0Z1bGxZZWFyJDIoZCwgcCkgewogICAgICByZXR1cm4gcGFkJDMoZC5nZXRVVENGdWxsWWVhcigpICUgMTAwMDAsIHAsIDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZvcm1hdFVUQ1pvbmUkMigpIHsKICAgICAgcmV0dXJuICIrMDAwMCI7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0TGl0ZXJhbFBlcmNlbnQkMigpIHsKICAgICAgcmV0dXJuICIlIjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRVbml4VGltZXN0YW1wJDIoZCkgewogICAgICByZXR1cm4gK2Q7CiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0VW5peFRpbWVzdGFtcFNlY29uZHMkMihkKSB7CiAgICAgIHJldHVybiBNYXRoLmZsb29yKCtkIC8gMTAwMCk7CiAgICB9CgogICAgdmFyIGxvY2FsZSQ1OwogICAgdmFyIHRpbWVGb3JtYXQkMjsKICAgIHZhciB0aW1lUGFyc2UkMjsKICAgIHZhciB1dGNGb3JtYXQkMjsKICAgIHZhciB1dGNQYXJzZSQyOwoKICAgIGRlZmF1bHRMb2NhbGUkNSh7CiAgICAgIGRhdGVUaW1lOiAiJXgsICVYIiwKICAgICAgZGF0ZTogIiUtbS8lLWQvJVkiLAogICAgICB0aW1lOiAiJS1JOiVNOiVTICVwIiwKICAgICAgcGVyaW9kczogWyJBTSIsICJQTSJdLAogICAgICBkYXlzOiBbIlN1bmRheSIsICJNb25kYXkiLCAiVHVlc2RheSIsICJXZWRuZXNkYXkiLCAiVGh1cnNkYXkiLCAiRnJpZGF5IiwgIlNhdHVyZGF5Il0sCiAgICAgIHNob3J0RGF5czogWyJTdW4iLCAiTW9uIiwgIlR1ZSIsICJXZWQiLCAiVGh1IiwgIkZyaSIsICJTYXQiXSwKICAgICAgbW9udGhzOiBbIkphbnVhcnkiLCAiRmVicnVhcnkiLCAiTWFyY2giLCAiQXByaWwiLCAiTWF5IiwgIkp1bmUiLCAiSnVseSIsICJBdWd1c3QiLCAiU2VwdGVtYmVyIiwgIk9jdG9iZXIiLCAiTm92ZW1iZXIiLCAiRGVjZW1iZXIiXSwKICAgICAgc2hvcnRNb250aHM6IFsiSmFuIiwgIkZlYiIsICJNYXIiLCAiQXByIiwgIk1heSIsICJKdW4iLCAiSnVsIiwgIkF1ZyIsICJTZXAiLCAiT2N0IiwgIk5vdiIsICJEZWMiXQogICAgfSk7CgogICAgZnVuY3Rpb24gZGVmYXVsdExvY2FsZSQ1KGRlZmluaXRpb24pIHsKICAgICAgbG9jYWxlJDUgPSBmb3JtYXRMb2NhbGUkNShkZWZpbml0aW9uKTsKICAgICAgdGltZUZvcm1hdCQyID0gbG9jYWxlJDUuZm9ybWF0OwogICAgICB0aW1lUGFyc2UkMiA9IGxvY2FsZSQ1LnBhcnNlOwogICAgICB1dGNGb3JtYXQkMiA9IGxvY2FsZSQ1LnV0Y0Zvcm1hdDsKICAgICAgdXRjUGFyc2UkMiA9IGxvY2FsZSQ1LnV0Y1BhcnNlOwogICAgICByZXR1cm4gbG9jYWxlJDU7CiAgICB9CgogICAgdmFyIGlzb1NwZWNpZmllciQxID0gIiVZLSVtLSVkVCVIOiVNOiVTLiVMWiI7CgogICAgZnVuY3Rpb24gZm9ybWF0SXNvTmF0aXZlJDEoZGF0ZSkgewogICAgICByZXR1cm4gZGF0ZS50b0lTT1N0cmluZygpOwogICAgfQoKICAgIHZhciBmb3JtYXRJc28kMSA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nCiAgICAgICAgPyBmb3JtYXRJc29OYXRpdmUkMQogICAgICAgIDogdXRjRm9ybWF0JDIoaXNvU3BlY2lmaWVyJDEpOwoKICAgIGZ1bmN0aW9uIHBhcnNlSXNvTmF0aXZlJDEoc3RyaW5nKSB7CiAgICAgIHZhciBkYXRlID0gbmV3IERhdGUoc3RyaW5nKTsKICAgICAgcmV0dXJuIGlzTmFOKGRhdGUpID8gbnVsbCA6IGRhdGU7CiAgICB9CgogICAgdmFyIHBhcnNlSXNvJDEgPSArbmV3IERhdGUoIjIwMDAtMDEtMDFUMDA6MDA6MDAuMDAwWiIpCiAgICAgICAgPyBwYXJzZUlzb05hdGl2ZSQxCiAgICAgICAgOiB1dGNQYXJzZSQyKGlzb1NwZWNpZmllciQxKTsKCiAgICB2YXIgZnJhbWUkMyA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgICAgIHRpbWVvdXQkNSA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgICAgIGludGVydmFsJDQgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/CiAgICAgICAgcG9rZURlbGF5JDMgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tldwogICAgICAgIHRhc2tIZWFkJDMsCiAgICAgICAgdGFza1RhaWwkMywKICAgICAgICBjbG9ja0xhc3QkMyA9IDAsCiAgICAgICAgY2xvY2tOb3ckMyA9IDAsCiAgICAgICAgY2xvY2tTa2V3JDMgPSAwLAogICAgICAgIGNsb2NrJDMgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICJvYmplY3QiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSwKICAgICAgICBzZXRGcmFtZSQzID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTsKCiAgICBmdW5jdGlvbiBub3ckMygpIHsKICAgICAgcmV0dXJuIGNsb2NrTm93JDMgfHwgKHNldEZyYW1lJDMoY2xlYXJOb3ckMyksIGNsb2NrTm93JDMgPSBjbG9jayQzLm5vdygpICsgY2xvY2tTa2V3JDMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTm93JDMoKSB7CiAgICAgIGNsb2NrTm93JDMgPSAwOwogICAgfQoKICAgIGZ1bmN0aW9uIFRpbWVyJDMoKSB7CiAgICAgIHRoaXMuX2NhbGwgPQogICAgICB0aGlzLl90aW1lID0KICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICB9CgogICAgVGltZXIkMy5wcm90b3R5cGUgPSB0aW1lciQzLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRpbWVyJDMsCiAgICAgIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3ckMygpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTsKICAgICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwkMyAhPT0gdGhpcykgewogICAgICAgICAgaWYgKHRhc2tUYWlsJDMpIHRhc2tUYWlsJDMuX25leHQgPSB0aGlzOwogICAgICAgICAgZWxzZSB0YXNrSGVhZCQzID0gdGhpczsKICAgICAgICAgIHRhc2tUYWlsJDMgPSB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7CiAgICAgICAgdGhpcy5fdGltZSA9IHRpbWU7CiAgICAgICAgc2xlZXAkMygpOwogICAgICB9LAogICAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fY2FsbCkgewogICAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7CiAgICAgICAgICBzbGVlcCQzKCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHRpbWVyJDMoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIHZhciB0ID0gbmV3IFRpbWVyJDM7CiAgICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lckZsdXNoJDMoKSB7CiAgICAgIG5vdyQzKCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuCiAgICAgICsrZnJhbWUkMzsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuCiAgICAgIHZhciB0ID0gdGFza0hlYWQkMywgZTsKICAgICAgd2hpbGUgKHQpIHsKICAgICAgICBpZiAoKGUgPSBjbG9ja05vdyQzIC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpOwogICAgICAgIHQgPSB0Ll9uZXh0OwogICAgICB9CiAgICAgIC0tZnJhbWUkMzsKICAgIH0KCiAgICBmdW5jdGlvbiB3YWtlJDMoKSB7CiAgICAgIGNsb2NrTm93JDMgPSAoY2xvY2tMYXN0JDMgPSBjbG9jayQzLm5vdygpKSArIGNsb2NrU2tldyQzOwogICAgICBmcmFtZSQzID0gdGltZW91dCQ1ID0gMDsKICAgICAgdHJ5IHsKICAgICAgICB0aW1lckZsdXNoJDMoKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBmcmFtZSQzID0gMDsKICAgICAgICBuYXAkMygpOwogICAgICAgIGNsb2NrTm93JDMgPSAwOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9rZSQ0KCkgewogICAgICB2YXIgbm93ID0gY2xvY2skMy5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3QkMzsKICAgICAgaWYgKGRlbGF5ID4gcG9rZURlbGF5JDMpIGNsb2NrU2tldyQzIC09IGRlbGF5LCBjbG9ja0xhc3QkMyA9IG5vdzsKICAgIH0KCiAgICBmdW5jdGlvbiBuYXAkMygpIHsKICAgICAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkJDMsIHQyLCB0aW1lID0gSW5maW5pdHk7CiAgICAgIHdoaWxlICh0MSkgewogICAgICAgIGlmICh0MS5fY2FsbCkgewogICAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCQzID0gdDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRhc2tUYWlsJDMgPSB0MDsKICAgICAgc2xlZXAkMyh0aW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzbGVlcCQzKHRpbWUpIHsKICAgICAgaWYgKGZyYW1lJDMpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgICAgaWYgKHRpbWVvdXQkNSkgdGltZW91dCQ1ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQkNSk7CiAgICAgIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdyQzOyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgICAgaWYgKGRlbGF5ID4gMjQpIHsKICAgICAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0JDUgPSBzZXRUaW1lb3V0KHdha2UkMywgdGltZSAtIGNsb2NrJDMubm93KCkgLSBjbG9ja1NrZXckMyk7CiAgICAgICAgaWYgKGludGVydmFsJDQpIGludGVydmFsJDQgPSBjbGVhckludGVydmFsKGludGVydmFsJDQpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghaW50ZXJ2YWwkNCkgY2xvY2tMYXN0JDMgPSBjbG9jayQzLm5vdygpLCBpbnRlcnZhbCQ0ID0gc2V0SW50ZXJ2YWwocG9rZSQ0LCBwb2tlRGVsYXkkMyk7CiAgICAgICAgZnJhbWUkMyA9IDEsIHNldEZyYW1lJDMod2FrZSQzKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVvdXQkNihjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXIkMzsKICAgICAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTsKICAgICAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsKICAgICAgICB0LnN0b3AoKTsKICAgICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgICB9LCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVydmFsJDUoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIHZhciB0ID0gbmV3IFRpbWVyJDMsIHRvdGFsID0gZGVsYXk7CiAgICAgIGlmIChkZWxheSA9PSBudWxsKSByZXR1cm4gdC5yZXN0YXJ0KGNhbGxiYWNrLCBkZWxheSwgdGltZSksIHQ7CiAgICAgIGRlbGF5ID0gK2RlbGF5LCB0aW1lID0gdGltZSA9PSBudWxsID8gbm93JDMoKSA6ICt0aW1lOwogICAgICB0LnJlc3RhcnQoZnVuY3Rpb24gdGljayhlbGFwc2VkKSB7CiAgICAgICAgZWxhcHNlZCArPSB0b3RhbDsKICAgICAgICB0LnJlc3RhcnQodGljaywgdG90YWwgKz0gZGVsYXksIHRpbWUpOwogICAgICAgIGNhbGxiYWNrKGVsYXBzZWQpOwogICAgICB9LCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIHZhciB4aHRtbCQ0ID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwoKICAgIHZhciBuYW1lc3BhY2VzJDQgPSB7CiAgICAgIHN2ZzogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKICAgICAgeGh0bWw6IHhodG1sJDQsCiAgICAgIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICAgIHhtbG5zOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iCiAgICB9OwoKICAgIGZ1bmN0aW9uIG5hbWVzcGFjZSQ0KG5hbWUpIHsKICAgICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gInhtbG5zIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpOwogICAgICByZXR1cm4gbmFtZXNwYWNlcyQ0Lmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXMkNFtwcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0JDQobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LAogICAgICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgICByZXR1cm4gdXJpID09PSB4aHRtbCQ0ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sJDQKICAgICAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpCiAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvckZpeGVkJDQoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvciQ0KG5hbWUpIHsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlJDQobmFtZSk7CiAgICAgIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgICAgID8gY3JlYXRvckZpeGVkJDQKICAgICAgICAgIDogY3JlYXRvckluaGVyaXQkNCkoZnVsbG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vbmUkOCgpIHt9CgogICAgZnVuY3Rpb24gc2VsZWN0b3IkNChzZWxlY3RvcikgewogICAgICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUkOCA6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3QkNChzZWxlY3QpIHsKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yJDQoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ2KHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gZW1wdHkkNigpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdG9yQWxsJDQoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSQ2IDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdEFsbCQ0KHNlbGVjdCkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwkNChzZWxlY3QpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNihzdWJncm91cHMsIHBhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hdGNoZXIkNShzZWxlY3RvcikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2ZpbHRlciQ0KG1hdGNoKSB7CiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gbWF0Y2hlciQ1KG1hdGNoKTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkgewogICAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwYXJzZSQ0KHVwZGF0ZSkgewogICAgICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9lbnRlciQ0KCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ2KHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlJDQpLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBFbnRlck5vZGUkNChwYXJlbnQsIGRhdHVtKSB7CiAgICAgIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50OwogICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7CiAgICAgIHRoaXMuX25leHQgPSBudWxsOwogICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIHRoaXMuX19kYXRhX18gPSBkYXR1bTsKICAgIH0KCiAgICBFbnRlck5vZGUkNC5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUkNCwKICAgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwKICAgICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sCiAgICAgIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sCiAgICAgIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0KICAgIH07CgogICAgZnVuY3Rpb24gY29uc3RhbnQkdCh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIga2V5UHJlZml4JDYgPSAiJCI7IC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCdLgoKICAgIGZ1bmN0aW9uIGJpbmRJbmRleCQ0KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgICAgdmFyIGkgPSAwLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS4KICAgICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAgIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci4KICAgICAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZSQ0KHBhcmVudCwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LgogICAgICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kS2V5JDQocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgICAgIHZhciBpLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sCiAgICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwKICAgICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgICAgICBrZXlWYWx1ZTsKCiAgICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogICAgICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXgkNiArIGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsKICAgICAgICAgIGlmIChrZXlWYWx1ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uCiAgICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci4KICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICAgIGtleVZhbHVlID0ga2V5UHJlZml4JDYgKyBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpOwogICAgICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdKSB7CiAgICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUkNChwYXJlbnQsIGRhdGFbaV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZXNbaV1dID09PSBub2RlKSkgewogICAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2RhdGEkNCh2YWx1ZSwga2V5KSB7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICBkYXRhID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaiA9IC0xOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9CgogICAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkkNCA6IGJpbmRJbmRleCQ0LAogICAgICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsCiAgICAgICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CgogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50JHQodmFsdWUpOwoKICAgICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sCiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLAogICAgICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwKICAgICAgICAgICAgZGF0YSA9IHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSwKICAgICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksCiAgICAgICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTsKCiAgICAgICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpOwoKICAgICAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgICAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLAogICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLgogICAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkgewogICAgICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxOwogICAgICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbiQ2KHVwZGF0ZSwgcGFyZW50cyk7CiAgICAgIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjsKICAgICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgICAgcmV0dXJuIHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCQ0KCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ2KHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UkNCksIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luJDMob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkgewogICAgICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTsKICAgICAgZW50ZXIgPSB0eXBlb2Ygb25lbnRlciA9PT0gImZ1bmN0aW9uIiA/IG9uZW50ZXIoZW50ZXIpIDogZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyAiIik7CiAgICAgIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpOwogICAgICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpOwogICAgICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9tZXJnZSQ0KHNlbGVjdGlvbikgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsKICAgICAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yICg7IGogPCBtMDsgKytqKSB7CiAgICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNihtZXJnZXMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlciQ0KCkgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7CiAgICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NvcnQkNChjb21wYXJlKSB7CiAgICAgIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZyRjOwoKICAgICAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjsKICAgICAgfQoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ2KHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nJGMoYSwgYikgewogICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2NhbGwkNCgpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdOwogICAgICBhcmd1bWVudHNbMF0gPSB0aGlzOwogICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbm9kZXMkNCgpIHsKICAgICAgdmFyIG5vZGVzID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaSA9IC0xOwogICAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7IG5vZGVzWysraV0gPSB0aGlzOyB9KTsKICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9ub2RlJDQoKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zaXplJDQoKSB7CiAgICAgIHZhciBzaXplID0gMDsKICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyArK3NpemU7IH0pOwogICAgICByZXR1cm4gc2l6ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZW1wdHkkNCgpIHsKICAgICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZWFjaCQ0KGNhbGxiYWNrKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlJDYobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDYoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQkNihuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TJDYoZnVsbG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQ2KG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQ2KGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0ciQ0KG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQ0KG5hbWUpOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsKICAgICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWwKICAgICAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkKICAgICAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TJDYgOiBhdHRyUmVtb3ZlJDYpIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyQ2IDogYXR0ckZ1bmN0aW9uJDYpCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDYgOiBhdHRyQ29uc3RhbnQkNikpKShmdWxsbmFtZSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0VmlldyQ0KG5vZGUpIHsKICAgICAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZQogICAgICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVSZW1vdmUkNihuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQkNihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDYobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZSQ0KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEKICAgICAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgICA/IHN0eWxlUmVtb3ZlJDYgOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbiQ2CiAgICAgICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQkNikobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSkKICAgICAgICAgIDogc3R5bGVWYWx1ZSQ0KHRoaXMubm9kZSgpLCBuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVZhbHVlJDQobm9kZSwgbmFtZSkgewogICAgICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpCiAgICAgICAgICB8fCBkZWZhdWx0VmlldyQ0KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZSQ0KG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQkNChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24kNChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdOwogICAgICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3Byb3BlcnR5JDQobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUkNCA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvbiQ0CiAgICAgICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50JDQpKG5hbWUsIHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NBcnJheSQ0KHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0xpc3QkNChub2RlKSB7CiAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0JDQobm9kZSk7CiAgICB9CgogICAgZnVuY3Rpb24gQ2xhc3NMaXN0JDQobm9kZSkgewogICAgICB0aGlzLl9ub2RlID0gbm9kZTsKICAgICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5JDQobm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpOwogICAgfQoKICAgIENsYXNzTGlzdCQ0LnByb3RvdHlwZSA9IHsKICAgICAgYWRkOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICAgIGlmIChpIDwgMCkgewogICAgICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTsKICAgICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpOwogICAgICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjbGFzc2VkQWRkJDQobm9kZSwgbmFtZXMpIHsKICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QkNChub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUkNChub2RlLCBuYW1lcykgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCQ0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZFRydWUkNChuYW1lcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xhc3NlZEFkZCQ0KHRoaXMsIG5hbWVzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkRmFsc2UkNChuYW1lcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xhc3NlZFJlbW92ZSQ0KHRoaXMsIG5hbWVzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24kNChuYW1lcywgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCQ0IDogY2xhc3NlZFJlbW92ZSQ0KSh0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2NsYXNzZWQkNChuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5JDQobmFtZSArICIiKTsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0JDQodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGNsYXNzZWRGdW5jdGlvbiQ0IDogdmFsdWUKICAgICAgICAgID8gY2xhc3NlZFRydWUkNAogICAgICAgICAgOiBjbGFzc2VkRmFsc2UkNCkobmFtZXMsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dFJlbW92ZSQ0KCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gIiI7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dENvbnN0YW50JDYodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24kNih2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3RleHQkNCh2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgID8gdGV4dFJlbW92ZSQ0IDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gdGV4dEZ1bmN0aW9uJDYKICAgICAgICAgICAgICA6IHRleHRDb25zdGFudCQ2KSh2YWx1ZSkpCiAgICAgICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWxSZW1vdmUkNCgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sQ29uc3RhbnQkNCh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sRnVuY3Rpb24kNCh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9odG1sJDQodmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IGh0bWxSZW1vdmUkNCA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IGh0bWxGdW5jdGlvbiQ0CiAgICAgICAgICAgICAgOiBodG1sQ29uc3RhbnQkNCkodmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7CiAgICB9CgogICAgZnVuY3Rpb24gcmFpc2UkNSgpIHsKICAgICAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UkNCgpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSQ1KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb3dlciQ0KCkgewogICAgICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9sb3dlciQ0KCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyJDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQkNChuYW1lKSB7CiAgICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yJDQobmFtZSk7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50TnVsbCQ0KCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faW5zZXJ0JDQobmFtZSwgYmVmb3JlKSB7CiAgICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yJDQobmFtZSksCiAgICAgICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCQ0IDogdHlwZW9mIGJlZm9yZSA9PT0gImZ1bmN0aW9uIiA/IGJlZm9yZSA6IHNlbGVjdG9yJDQoYmVmb3JlKTsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZSQ0KCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3JlbW92ZSQ0KCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSQ0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93JDQoKSB7CiAgICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwJDQoKSB7CiAgICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSQ0KGRlZXApIHsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwJDQgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93JDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kYXR1bSQ0KHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpCiAgICAgICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fOwogICAgfQoKICAgIHZhciBmaWx0ZXJFdmVudHMkNCA9IHt9OwoKICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICJ1bmRlZmluZWQiKSB7CiAgICAgIHZhciBlbGVtZW50JDUgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICAgIGlmICghKCJvbm1vdXNlZW50ZXIiIGluIGVsZW1lbnQkNSkpIHsKICAgICAgICBmaWx0ZXJFdmVudHMkNCA9IHttb3VzZWVudGVyOiAibW91c2VvdmVyIiwgbW91c2VsZWF2ZTogIm1vdXNlb3V0In07CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmaWx0ZXJDb250ZXh0TGlzdGVuZXIkNChsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgICAgIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyJDQobGlzdGVuZXIsIGluZGV4LCBncm91cCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihldmVudCkgewogICAgICAgIHZhciByZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldDsKICAgICAgICBpZiAoIXJlbGF0ZWQgfHwgKHJlbGF0ZWQgIT09IHRoaXMgJiYgIShyZWxhdGVkLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHRoaXMpICYgOCkpKSB7CiAgICAgICAgICBsaXN0ZW5lci5jYWxsKHRoaXMsIGV2ZW50KTsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY29udGV4dExpc3RlbmVyJDQobGlzdGVuZXIsIGluZGV4LCBncm91cCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQxKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgIH0KICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVR5cGVuYW1lcyQ5KHR5cGVuYW1lcykgewogICAgICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCkgewogICAgICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uUmVtb3ZlJDQodHlwZW5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvbiA9IHRoaXMuX19vbjsKICAgICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvblsrK2ldID0gbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsKICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb25BZGQkNCh0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICAgICAgdmFyIHdyYXAgPSBmaWx0ZXJFdmVudHMkNC5oYXNPd25Qcm9wZXJ0eSh0eXBlbmFtZS50eXBlKSA/IGZpbHRlckNvbnRleHRMaXN0ZW5lciQ0IDogY29udGV4dExpc3RlbmVyJDQ7CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCBpLCBncm91cCkgewogICAgICAgIHZhciBvbiA9IHRoaXMuX19vbiwgbywgbGlzdGVuZXIgPSB3cmFwKHZhbHVlLCBpLCBncm91cCk7CiAgICAgICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKChvID0gb25bal0pLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIgPSBsaXN0ZW5lciwgby5jYXB0dXJlID0gY2FwdHVyZSk7CiAgICAgICAgICAgIG8udmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodHlwZW5hbWUudHlwZSwgbGlzdGVuZXIsIGNhcHR1cmUpOwogICAgICAgIG8gPSB7dHlwZTogdHlwZW5hbWUudHlwZSwgbmFtZTogdHlwZW5hbWUubmFtZSwgdmFsdWU6IHZhbHVlLCBsaXN0ZW5lcjogbGlzdGVuZXIsIGNhcHR1cmU6IGNhcHR1cmV9OwogICAgICAgIGlmICghb24pIHRoaXMuX19vbiA9IFtvXTsKICAgICAgICBlbHNlIG9uLnB1c2gobyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX29uJDQodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7CiAgICAgIHZhciB0eXBlbmFtZXMgPSBwYXJzZVR5cGVuYW1lcyQ5KHR5cGVuYW1lICsgIiIpLCBpLCBuID0gdHlwZW5hbWVzLmxlbmd0aCwgdDsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBvbiA9IHRoaXMubm9kZSgpLl9fb247CiAgICAgICAgaWYgKG9uKSBmb3IgKHZhciBqID0gMCwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICAgICAgZm9yIChpID0gMCwgbyA9IG9uW2pdOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGlmICgodCA9IHR5cGVuYW1lc1tpXSkudHlwZSA9PT0gby50eXBlICYmIHQubmFtZSA9PT0gby5uYW1lKSB7CiAgICAgICAgICAgICAgcmV0dXJuIG8udmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBvbiA9IHZhbHVlID8gb25BZGQkNCA6IG9uUmVtb3ZlJDQ7CiAgICAgIGlmIChjYXB0dXJlID09IG51bGwpIGNhcHR1cmUgPSBmYWxzZTsKICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgdGhpcy5lYWNoKG9uKHR5cGVuYW1lc1tpXSwgdmFsdWUsIGNhcHR1cmUpKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudCQ0KG5vZGUsIHR5cGUsIHBhcmFtcykgewogICAgICB2YXIgd2luZG93ID0gZGVmYXVsdFZpZXckNChub2RlKSwKICAgICAgICAgIGV2ZW50ID0gd2luZG93LkN1c3RvbUV2ZW50OwoKICAgICAgaWYgKHR5cGVvZiBldmVudCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgIGV2ZW50ID0gbmV3IGV2ZW50KHR5cGUsIHBhcmFtcyk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZXZlbnQgPSB3aW5kb3cuZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkV2ZW50Iik7CiAgICAgICAgaWYgKHBhcmFtcykgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIHBhcmFtcy5idWJibGVzLCBwYXJhbXMuY2FuY2VsYWJsZSksIGV2ZW50LmRldGFpbCA9IHBhcmFtcy5kZXRhaWw7CiAgICAgICAgZWxzZSBldmVudC5pbml0RXZlbnQodHlwZSwgZmFsc2UsIGZhbHNlKTsKICAgICAgfQoKICAgICAgbm9kZS5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkaXNwYXRjaENvbnN0YW50JDQodHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCQ0KHRoaXMsIHR5cGUsIHBhcmFtcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hGdW5jdGlvbiQ0KHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQkNCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoJDQodHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiBwYXJhbXMgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gZGlzcGF0Y2hGdW5jdGlvbiQ0CiAgICAgICAgICA6IGRpc3BhdGNoQ29uc3RhbnQkNCkodHlwZSwgcGFyYW1zKSk7CiAgICB9CgogICAgdmFyIHJvb3QkNiA9IFtudWxsXTsKCiAgICBmdW5jdGlvbiBTZWxlY3Rpb24kNihncm91cHMsIHBhcmVudHMpIHsKICAgICAgdGhpcy5fZ3JvdXBzID0gZ3JvdXBzOwogICAgICB0aGlzLl9wYXJlbnRzID0gcGFyZW50czsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb24kNCgpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kNihbW2RvY3VtZW50LmRvY3VtZW50RWxlbWVudF1dLCByb290JDYpOwogICAgfQoKICAgIFNlbGVjdGlvbiQ2LnByb3RvdHlwZSA9IHNlbGVjdGlvbiQ0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFNlbGVjdGlvbiQ2LAogICAgICBzZWxlY3Q6IHNlbGVjdGlvbl9zZWxlY3QkNCwKICAgICAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsJDQsCiAgICAgIGZpbHRlcjogc2VsZWN0aW9uX2ZpbHRlciQ0LAogICAgICBkYXRhOiBzZWxlY3Rpb25fZGF0YSQ0LAogICAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyJDQsCiAgICAgIGV4aXQ6IHNlbGVjdGlvbl9leGl0JDQsCiAgICAgIGpvaW46IHNlbGVjdGlvbl9qb2luJDMsCiAgICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UkNCwKICAgICAgb3JkZXI6IHNlbGVjdGlvbl9vcmRlciQ0LAogICAgICBzb3J0OiBzZWxlY3Rpb25fc29ydCQ0LAogICAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCQ0LAogICAgICBub2Rlczogc2VsZWN0aW9uX25vZGVzJDQsCiAgICAgIG5vZGU6IHNlbGVjdGlvbl9ub2RlJDQsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9zaXplJDQsCiAgICAgIGVtcHR5OiBzZWxlY3Rpb25fZW1wdHkkNCwKICAgICAgZWFjaDogc2VsZWN0aW9uX2VhY2gkNCwKICAgICAgYXR0cjogc2VsZWN0aW9uX2F0dHIkNCwKICAgICAgc3R5bGU6IHNlbGVjdGlvbl9zdHlsZSQ0LAogICAgICBwcm9wZXJ0eTogc2VsZWN0aW9uX3Byb3BlcnR5JDQsCiAgICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkJDQsCiAgICAgIHRleHQ6IHNlbGVjdGlvbl90ZXh0JDQsCiAgICAgIGh0bWw6IHNlbGVjdGlvbl9odG1sJDQsCiAgICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UkNCwKICAgICAgbG93ZXI6IHNlbGVjdGlvbl9sb3dlciQ0LAogICAgICBhcHBlbmQ6IHNlbGVjdGlvbl9hcHBlbmQkNCwKICAgICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0JDQsCiAgICAgIHJlbW92ZTogc2VsZWN0aW9uX3JlbW92ZSQ0LAogICAgICBjbG9uZTogc2VsZWN0aW9uX2Nsb25lJDQsCiAgICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0kNCwKICAgICAgb246IHNlbGVjdGlvbl9vbiQ0LAogICAgICBkaXNwYXRjaDogc2VsZWN0aW9uX2Rpc3BhdGNoJDQKICAgIH07CgogICAgdmFyIG5vb3AkYSA9IHt2YWx1ZTogZnVuY3Rpb24oKSB7fX07CgogICAgZnVuY3Rpb24gZGlzcGF0Y2gkNSgpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoLCBfID0ge30sIHQ7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoISh0ID0gYXJndW1lbnRzW2ldICsgIiIpIHx8ICh0IGluIF8pIHx8IC9bXHMuXS8udGVzdCh0KSkgdGhyb3cgbmV3IEVycm9yKCJpbGxlZ2FsIHR5cGU6ICIgKyB0KTsKICAgICAgICBfW3RdID0gW107CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaCQ1KF8pOwogICAgfQoKICAgIGZ1bmN0aW9uIERpc3BhdGNoJDUoXykgewogICAgICB0aGlzLl8gPSBfOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJGEodHlwZW5hbWVzLCB0eXBlcykgewogICAgICByZXR1cm4gdHlwZW5hbWVzLnRyaW0oKS5zcGxpdCgvXnxccysvKS5tYXAoZnVuY3Rpb24odCkgewogICAgICAgIHZhciBuYW1lID0gIiIsIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgICBpZiAoaSA+PSAwKSBuYW1lID0gdC5zbGljZShpICsgMSksIHQgPSB0LnNsaWNlKDAsIGkpOwogICAgICAgIGlmICh0ICYmICF0eXBlcy5oYXNPd25Qcm9wZXJ0eSh0KSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0KTsKICAgICAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogICAgICB9KTsKICAgIH0KCiAgICBEaXNwYXRjaCQ1LnByb3RvdHlwZSA9IGRpc3BhdGNoJDUucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogRGlzcGF0Y2gkNSwKICAgICAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIHZhciBfID0gdGhpcy5fLAogICAgICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXMkYSh0eXBlbmFtZSArICIiLCBfKSwKICAgICAgICAgICAgdCwKICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICBuID0gVC5sZW5ndGg7CgogICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJldHVybiB0aGUgY2FsbGJhY2sgb2YgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgaWYgKCh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgJiYgKHQgPSBnZXQkOChfW3RdLCB0eXBlbmFtZS5uYW1lKSkpIHJldHVybiB0OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgYSB0eXBlIHdhcyBzcGVjaWZpZWQsIHNldCB0aGUgY2FsbGJhY2sgZm9yIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLgogICAgICAgIC8vIE90aGVyd2lzZSwgaWYgYSBudWxsIGNhbGxiYWNrIHdhcyBzcGVjaWZpZWQsIHJlbW92ZSBjYWxsYmFja3Mgb2YgdGhlIGdpdmVuIG5hbWUuCiAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwgJiYgdHlwZW9mIGNhbGxiYWNrICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3IoImludmFsaWQgY2FsbGJhY2s6ICIgKyBjYWxsYmFjayk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIGlmICh0ID0gKHR5cGVuYW1lID0gVFtpXSkudHlwZSkgX1t0XSA9IHNldCRjKF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0JGMoX1t0XSwgdHlwZW5hbWUubmFtZSwgbnVsbCk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgY29weTogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGNvcHkgPSB7fSwgXyA9IHRoaXMuXzsKICAgICAgICBmb3IgKHZhciB0IGluIF8pIGNvcHlbdF0gPSBfW3RdLnNsaWNlKCk7CiAgICAgICAgcmV0dXJuIG5ldyBEaXNwYXRjaCQ1KGNvcHkpOwogICAgICB9LAogICAgICBjYWxsOiBmdW5jdGlvbih0eXBlLCB0aGF0KSB7CiAgICAgICAgaWYgKChuID0gYXJndW1lbnRzLmxlbmd0aCAtIDIpID4gMCkgZm9yICh2YXIgYXJncyA9IG5ldyBBcnJheShuKSwgaSA9IDAsIG4sIHQ7IGkgPCBuOyArK2kpIGFyZ3NbaV0gPSBhcmd1bWVudHNbaSArIDJdOwogICAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICAgIGZvciAodCA9IHRoaXMuX1t0eXBlXSwgaSA9IDAsIG4gPSB0Lmxlbmd0aDsgaSA8IG47ICsraSkgdFtpXS52YWx1ZS5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfSwKICAgICAgYXBwbHk6IGZ1bmN0aW9uKHR5cGUsIHRoYXQsIGFyZ3MpIHsKICAgICAgICBpZiAoIXRoaXMuXy5oYXNPd25Qcm9wZXJ0eSh0eXBlKSkgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIHR5cGU6ICIgKyB0eXBlKTsKICAgICAgICBmb3IgKHZhciB0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGdldCQ4KHR5cGUsIG5hbWUpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiBjLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldCRjKHR5cGUsIG5hbWUsIGNhbGxiYWNrKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHlwZS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAodHlwZVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICB0eXBlW2ldID0gbm9vcCRhLCB0eXBlID0gdHlwZS5zbGljZSgwLCBpKS5jb25jYXQodHlwZS5zbGljZShpICsgMSkpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB0eXBlLnB1c2goe25hbWU6IG5hbWUsIHZhbHVlOiBjYWxsYmFja30pOwogICAgICByZXR1cm4gdHlwZTsKICAgIH0KCiAgICB2YXIgZnJhbWUkNCA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgICAgIHRpbWVvdXQkNyA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgICAgIGludGVydmFsJDYgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/CiAgICAgICAgcG9rZURlbGF5JDQgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tldwogICAgICAgIHRhc2tIZWFkJDQsCiAgICAgICAgdGFza1RhaWwkNCwKICAgICAgICBjbG9ja0xhc3QkNCA9IDAsCiAgICAgICAgY2xvY2tOb3ckNCA9IDAsCiAgICAgICAgY2xvY2tTa2V3JDQgPSAwLAogICAgICAgIGNsb2NrJDQgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICJvYmplY3QiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSwKICAgICAgICBzZXRGcmFtZSQ0ID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTsKCiAgICBmdW5jdGlvbiBub3ckNCgpIHsKICAgICAgcmV0dXJuIGNsb2NrTm93JDQgfHwgKHNldEZyYW1lJDQoY2xlYXJOb3ckNCksIGNsb2NrTm93JDQgPSBjbG9jayQ0Lm5vdygpICsgY2xvY2tTa2V3JDQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTm93JDQoKSB7CiAgICAgIGNsb2NrTm93JDQgPSAwOwogICAgfQoKICAgIGZ1bmN0aW9uIFRpbWVyJDQoKSB7CiAgICAgIHRoaXMuX2NhbGwgPQogICAgICB0aGlzLl90aW1lID0KICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICB9CgogICAgVGltZXIkNC5wcm90b3R5cGUgPSB0aW1lciQ0LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRpbWVyJDQsCiAgICAgIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3ckNCgpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTsKICAgICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwkNCAhPT0gdGhpcykgewogICAgICAgICAgaWYgKHRhc2tUYWlsJDQpIHRhc2tUYWlsJDQuX25leHQgPSB0aGlzOwogICAgICAgICAgZWxzZSB0YXNrSGVhZCQ0ID0gdGhpczsKICAgICAgICAgIHRhc2tUYWlsJDQgPSB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7CiAgICAgICAgdGhpcy5fdGltZSA9IHRpbWU7CiAgICAgICAgc2xlZXAkNCgpOwogICAgICB9LAogICAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fY2FsbCkgewogICAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7CiAgICAgICAgICBzbGVlcCQ0KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHRpbWVyJDQoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIHZhciB0ID0gbmV3IFRpbWVyJDQ7CiAgICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lckZsdXNoJDQoKSB7CiAgICAgIG5vdyQ0KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuCiAgICAgICsrZnJhbWUkNDsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuCiAgICAgIHZhciB0ID0gdGFza0hlYWQkNCwgZTsKICAgICAgd2hpbGUgKHQpIHsKICAgICAgICBpZiAoKGUgPSBjbG9ja05vdyQ0IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpOwogICAgICAgIHQgPSB0Ll9uZXh0OwogICAgICB9CiAgICAgIC0tZnJhbWUkNDsKICAgIH0KCiAgICBmdW5jdGlvbiB3YWtlJDQoKSB7CiAgICAgIGNsb2NrTm93JDQgPSAoY2xvY2tMYXN0JDQgPSBjbG9jayQ0Lm5vdygpKSArIGNsb2NrU2tldyQ0OwogICAgICBmcmFtZSQ0ID0gdGltZW91dCQ3ID0gMDsKICAgICAgdHJ5IHsKICAgICAgICB0aW1lckZsdXNoJDQoKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBmcmFtZSQ0ID0gMDsKICAgICAgICBuYXAkNCgpOwogICAgICAgIGNsb2NrTm93JDQgPSAwOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9rZSQ1KCkgewogICAgICB2YXIgbm93ID0gY2xvY2skNC5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3QkNDsKICAgICAgaWYgKGRlbGF5ID4gcG9rZURlbGF5JDQpIGNsb2NrU2tldyQ0IC09IGRlbGF5LCBjbG9ja0xhc3QkNCA9IG5vdzsKICAgIH0KCiAgICBmdW5jdGlvbiBuYXAkNCgpIHsKICAgICAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkJDQsIHQyLCB0aW1lID0gSW5maW5pdHk7CiAgICAgIHdoaWxlICh0MSkgewogICAgICAgIGlmICh0MS5fY2FsbCkgewogICAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCQ0ID0gdDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRhc2tUYWlsJDQgPSB0MDsKICAgICAgc2xlZXAkNCh0aW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzbGVlcCQ0KHRpbWUpIHsKICAgICAgaWYgKGZyYW1lJDQpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgICAgaWYgKHRpbWVvdXQkNykgdGltZW91dCQ3ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQkNyk7CiAgICAgIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdyQ0OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgICAgaWYgKGRlbGF5ID4gMjQpIHsKICAgICAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0JDcgPSBzZXRUaW1lb3V0KHdha2UkNCwgdGltZSAtIGNsb2NrJDQubm93KCkgLSBjbG9ja1NrZXckNCk7CiAgICAgICAgaWYgKGludGVydmFsJDYpIGludGVydmFsJDYgPSBjbGVhckludGVydmFsKGludGVydmFsJDYpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghaW50ZXJ2YWwkNikgY2xvY2tMYXN0JDQgPSBjbG9jayQ0Lm5vdygpLCBpbnRlcnZhbCQ2ID0gc2V0SW50ZXJ2YWwocG9rZSQ1LCBwb2tlRGVsYXkkNCk7CiAgICAgICAgZnJhbWUkNCA9IDEsIHNldEZyYW1lJDQod2FrZSQ0KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVvdXQkOChjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXIkNDsKICAgICAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTsKICAgICAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsKICAgICAgICB0LnN0b3AoKTsKICAgICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgICB9LCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIHZhciBlbXB0eU9uJDIgPSBkaXNwYXRjaCQ1KCJzdGFydCIsICJlbmQiLCAiaW50ZXJydXB0Iik7CiAgICB2YXIgZW1wdHlUd2VlbiQyID0gW107CgogICAgdmFyIENSRUFURUQkMiA9IDA7CiAgICB2YXIgU0NIRURVTEVEJDIgPSAxOwogICAgdmFyIFNUQVJUSU5HJDIgPSAyOwogICAgdmFyIFNUQVJURUQkMiA9IDM7CiAgICB2YXIgUlVOTklORyQyID0gNDsKICAgIHZhciBFTkRJTkckMiA9IDU7CiAgICB2YXIgRU5ERUQkMiA9IDY7CgogICAgZnVuY3Rpb24gc2NoZWR1bGUkMyhub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTsKICAgICAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47CiAgICAgIGNyZWF0ZSQ0KG5vZGUsIGlkLCB7CiAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICBpbmRleDogaW5kZXgsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgICBncm91cDogZ3JvdXAsIC8vIEZvciBjb250ZXh0IGR1cmluZyBjYWxsYmFjay4KICAgICAgICBvbjogZW1wdHlPbiQyLAogICAgICAgIHR3ZWVuOiBlbXB0eVR3ZWVuJDIsCiAgICAgICAgdGltZTogdGltaW5nLnRpbWUsCiAgICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLAogICAgICAgIGVhc2U6IHRpbWluZy5lYXNlLAogICAgICAgIHRpbWVyOiBudWxsLAogICAgICAgIHN0YXRlOiBDUkVBVEVEJDIKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW5pdCQyKG5vZGUsIGlkKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IGdldCQ5KG5vZGUsIGlkKTsKICAgICAgaWYgKHNjaGVkdWxlLnN0YXRlID4gQ1JFQVRFRCQyKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgICByZXR1cm4gc2NoZWR1bGU7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0JGQobm9kZSwgaWQpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gZ2V0JDkobm9kZSwgaWQpOwogICAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyQyKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHN0YXJ0ZWQiKTsKICAgICAgcmV0dXJuIHNjaGVkdWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldCQ5KG5vZGUsIGlkKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7CiAgICAgIHJldHVybiBzY2hlZHVsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGUkNChub2RlLCBpZCwgc2VsZikgewogICAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgICAgICB0d2VlbjsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogICAgICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayEKICAgICAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7CiAgICAgIHNlbGYudGltZXIgPSB0aW1lciQ0KHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOwoKICAgICAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkgewogICAgICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQkMjsKICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7CgogICAgICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LgogICAgICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgewogICAgICAgIHZhciBpLCBqLCBuLCBvOwoKICAgICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuCiAgICAgICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCQyKSByZXR1cm4gc3RvcCgpOwoKICAgICAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTsKCiAgICAgICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLAogICAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IQogICAgICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQkMikgcmV0dXJuIHRpbWVvdXQkOChzdGFydCk7CgogICAgICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LgogICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGludGVycnVwdCBldmVudC4KICAgICAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HJDIpIHsKICAgICAgICAgICAgby5zdGF0ZSA9IEVOREVEJDI7CiAgICAgICAgICAgIG8udGltZXIuc3RvcCgpOwogICAgICAgICAgICBvLm9uLmNhbGwoImludGVycnVwdCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgICAgICAgfQoKICAgICAgICAgIC8vIENhbmNlbCBhbnkgcHJlLWVtcHRlZCB0cmFuc2l0aW9ucy4gTm8gaW50ZXJydXB0IGV2ZW50IGlzIGRpc3BhdGNoZWQKICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIGNhbmNlbGxlZCB0cmFuc2l0aW9ucyBuZXZlciBzdGFydGVkLiBOb3RlIHRoYXQgdGhpcyBhbHNvCiAgICAgICAgICAvLyByZW1vdmVzIHRoaXMgdHJhbnNpdGlvbiBmcm9tIHRoZSBwZW5kaW5nIGxpc3QhCiAgICAgICAgICBlbHNlIGlmICgraSA8IGlkKSB7CiAgICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRCQyOwogICAgICAgICAgICBvLnRpbWVyLnN0b3AoKTsKICAgICAgICAgICAgZGVsZXRlIHNjaGVkdWxlc1tpXTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIERlZmVyIHRoZSBmaXJzdCB0aWNrIHRvIGVuZCBvZiB0aGUgY3VycmVudCBmcmFtZTsgc2VlIGQzL2QzIzE1NzYuCiAgICAgICAgLy8gTm90ZSB0aGUgdHJhbnNpdGlvbiBtYXkgYmUgY2FuY2VsZWQgYWZ0ZXIgc3RhcnQgYW5kIGJlZm9yZSB0aGUgZmlyc3QgdGljayEKICAgICAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBzY2hlZHVsZWQgYmVmb3JlIHRoZSBzdGFydCBldmVudDsgc2VlIGQzL2QzLXRyYW5zaXRpb24jMTYhCiAgICAgICAgLy8gQXNzdW1pbmcgdGhpcyBpcyBzdWNjZXNzZnVsLCBzdWJzZXF1ZW50IGNhbGxiYWNrcyBnbyBzdHJhaWdodCB0byB0aWNrLgogICAgICAgIHRpbWVvdXQkOChmdW5jdGlvbigpIHsKICAgICAgICAgIGlmIChzZWxmLnN0YXRlID09PSBTVEFSVEVEJDIpIHsKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkckMjsKICAgICAgICAgICAgc2VsZi50aW1lci5yZXN0YXJ0KHRpY2ssIHNlbGYuZGVsYXksIHNlbGYudGltZSk7CiAgICAgICAgICAgIHRpY2soZWxhcHNlZCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIC8vIERpc3BhdGNoIHRoZSBzdGFydCBldmVudC4KICAgICAgICAvLyBOb3RlIHRoaXMgbXVzdCBiZSBkb25lIGJlZm9yZSB0aGUgdHdlZW4gYXJlIGluaXRpYWxpemVkLgogICAgICAgIHNlbGYuc3RhdGUgPSBTVEFSVElORyQyOwogICAgICAgIHNlbGYub24uY2FsbCgic3RhcnQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKTsKICAgICAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU1RBUlRJTkckMikgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEJDI7CgogICAgICAgIC8vIEluaXRpYWxpemUgdGhlIHR3ZWVuLCBkZWxldGluZyBudWxsIHR3ZWVuLgogICAgICAgIHR3ZWVuID0gbmV3IEFycmF5KG4gPSBzZWxmLnR3ZWVuLmxlbmd0aCk7CiAgICAgICAgZm9yIChpID0gMCwgaiA9IC0xOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobyA9IHNlbGYudHdlZW5baV0udmFsdWUuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBzZWxmLmluZGV4LCBzZWxmLmdyb3VwKSkgewogICAgICAgICAgICB0d2VlblsrK2pdID0gbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHdlZW4ubGVuZ3RoID0gaiArIDE7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRpY2soZWxhcHNlZCkgewogICAgICAgIHZhciB0ID0gZWxhcHNlZCA8IHNlbGYuZHVyYXRpb24gPyBzZWxmLmVhc2UuY2FsbChudWxsLCBlbGFwc2VkIC8gc2VsZi5kdXJhdGlvbikgOiAoc2VsZi50aW1lci5yZXN0YXJ0KHN0b3ApLCBzZWxmLnN0YXRlID0gRU5ESU5HJDIsIDEpLAogICAgICAgICAgICBpID0gLTEsCiAgICAgICAgICAgIG4gPSB0d2Vlbi5sZW5ndGg7CgogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7CiAgICAgICAgICB0d2VlbltpXS5jYWxsKG51bGwsIHQpOwogICAgICAgIH0KCiAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGVuZCBldmVudC4KICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gRU5ESU5HJDIpIHsKICAgICAgICAgIHNlbGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBzdG9wKCkgewogICAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRCQyOwogICAgICAgIHNlbGYudGltZXIuc3RvcCgpOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaWRdOwogICAgICAgIGZvciAodmFyIGkgaW4gc2NoZWR1bGVzKSByZXR1cm47IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnMKICAgICAgICBkZWxldGUgbm9kZS5fX3RyYW5zaXRpb247CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnJ1cHQkMihub2RlLCBuYW1lKSB7CiAgICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgICAgIHNjaGVkdWxlLAogICAgICAgICAgYWN0aXZlLAogICAgICAgICAgZW1wdHkgPSB0cnVlLAogICAgICAgICAgaTsKCiAgICAgIGlmICghc2NoZWR1bGVzKSByZXR1cm47CgogICAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKCiAgICAgIGZvciAoaSBpbiBzY2hlZHVsZXMpIHsKICAgICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5uYW1lICE9PSBuYW1lKSB7IGVtcHR5ID0gZmFsc2U7IGNvbnRpbnVlOyB9CiAgICAgICAgYWN0aXZlID0gc2NoZWR1bGUuc3RhdGUgPiBTVEFSVElORyQyICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HJDI7CiAgICAgICAgc2NoZWR1bGUuc3RhdGUgPSBFTkRFRCQyOwogICAgICAgIHNjaGVkdWxlLnRpbWVyLnN0b3AoKTsKICAgICAgICBpZiAoYWN0aXZlKSBzY2hlZHVsZS5vbi5jYWxsKCJpbnRlcnJ1cHQiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgIH0KCiAgICAgIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9pbnRlcnJ1cHQkMihuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgaW50ZXJydXB0JDIodGhpcywgbmFtZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmluZSQ1KGNvbnN0cnVjdG9yLCBmYWN0b3J5LCBwcm90b3R5cGUpIHsKICAgICAgY29uc3RydWN0b3IucHJvdG90eXBlID0gZmFjdG9yeS5wcm90b3R5cGUgPSBwcm90b3R5cGU7CiAgICAgIHByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGNvbnN0cnVjdG9yOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4dGVuZCQ1KHBhcmVudCwgZGVmaW5pdGlvbikgewogICAgICB2YXIgcHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZShwYXJlbnQucHJvdG90eXBlKTsKICAgICAgZm9yICh2YXIga2V5IGluIGRlZmluaXRpb24pIHByb3RvdHlwZVtrZXldID0gZGVmaW5pdGlvbltrZXldOwogICAgICByZXR1cm4gcHJvdG90eXBlOwogICAgfQoKICAgIGZ1bmN0aW9uIENvbG9yJDUoKSB7fQoKICAgIHZhciBkYXJrZXIkNSA9IDAuNzsKICAgIHZhciBicmlnaHRlciQ1ID0gMSAvIGRhcmtlciQ1OwoKICAgIHZhciByZUkkNSA9ICJcXHMqKFsrLV0/XFxkKylcXHMqIiwKICAgICAgICByZU4kNSA9ICJcXHMqKFsrLV0/XFxkKlxcLj9cXGQrKD86W2VFXVsrLV0/XFxkKyk/KVxccyoiLAogICAgICAgIHJlUCQ1ID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLAogICAgICAgIHJlSGV4JDQgPSAvXiMoWzAtOWEtZl17Myw4fSkkLywKICAgICAgICByZVJnYkludGVnZXIkNSA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlSSQ1LCByZUkkNSwgcmVJJDVdICsgIlxcKSQiKSwKICAgICAgICByZVJnYlBlcmNlbnQkNSA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlUCQ1LCByZVAkNSwgcmVQJDVdICsgIlxcKSQiKSwKICAgICAgICByZVJnYmFJbnRlZ2VyJDUgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVJJDUsIHJlSSQ1LCByZUkkNSwgcmVOJDVdICsgIlxcKSQiKSwKICAgICAgICByZVJnYmFQZXJjZW50JDUgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVQJDUsIHJlUCQ1LCByZVAkNSwgcmVOJDVdICsgIlxcKSQiKSwKICAgICAgICByZUhzbFBlcmNlbnQkNSA9IG5ldyBSZWdFeHAoIl5oc2xcXCgiICsgW3JlTiQ1LCByZVAkNSwgcmVQJDVdICsgIlxcKSQiKSwKICAgICAgICByZUhzbGFQZXJjZW50JDUgPSBuZXcgUmVnRXhwKCJeaHNsYVxcKCIgKyBbcmVOJDUsIHJlUCQ1LCByZVAkNSwgcmVOJDVdICsgIlxcKSQiKTsKCiAgICB2YXIgbmFtZWQkNSA9IHsKICAgICAgYWxpY2VibHVlOiAweGYwZjhmZiwKICAgICAgYW50aXF1ZXdoaXRlOiAweGZhZWJkNywKICAgICAgYXF1YTogMHgwMGZmZmYsCiAgICAgIGFxdWFtYXJpbmU6IDB4N2ZmZmQ0LAogICAgICBhenVyZTogMHhmMGZmZmYsCiAgICAgIGJlaWdlOiAweGY1ZjVkYywKICAgICAgYmlzcXVlOiAweGZmZTRjNCwKICAgICAgYmxhY2s6IDB4MDAwMDAwLAogICAgICBibGFuY2hlZGFsbW9uZDogMHhmZmViY2QsCiAgICAgIGJsdWU6IDB4MDAwMGZmLAogICAgICBibHVldmlvbGV0OiAweDhhMmJlMiwKICAgICAgYnJvd246IDB4YTUyYTJhLAogICAgICBidXJseXdvb2Q6IDB4ZGViODg3LAogICAgICBjYWRldGJsdWU6IDB4NWY5ZWEwLAogICAgICBjaGFydHJldXNlOiAweDdmZmYwMCwKICAgICAgY2hvY29sYXRlOiAweGQyNjkxZSwKICAgICAgY29yYWw6IDB4ZmY3ZjUwLAogICAgICBjb3JuZmxvd2VyYmx1ZTogMHg2NDk1ZWQsCiAgICAgIGNvcm5zaWxrOiAweGZmZjhkYywKICAgICAgY3JpbXNvbjogMHhkYzE0M2MsCiAgICAgIGN5YW46IDB4MDBmZmZmLAogICAgICBkYXJrYmx1ZTogMHgwMDAwOGIsCiAgICAgIGRhcmtjeWFuOiAweDAwOGI4YiwKICAgICAgZGFya2dvbGRlbnJvZDogMHhiODg2MGIsCiAgICAgIGRhcmtncmF5OiAweGE5YTlhOSwKICAgICAgZGFya2dyZWVuOiAweDAwNjQwMCwKICAgICAgZGFya2dyZXk6IDB4YTlhOWE5LAogICAgICBkYXJra2hha2k6IDB4YmRiNzZiLAogICAgICBkYXJrbWFnZW50YTogMHg4YjAwOGIsCiAgICAgIGRhcmtvbGl2ZWdyZWVuOiAweDU1NmIyZiwKICAgICAgZGFya29yYW5nZTogMHhmZjhjMDAsCiAgICAgIGRhcmtvcmNoaWQ6IDB4OTkzMmNjLAogICAgICBkYXJrcmVkOiAweDhiMDAwMCwKICAgICAgZGFya3NhbG1vbjogMHhlOTk2N2EsCiAgICAgIGRhcmtzZWFncmVlbjogMHg4ZmJjOGYsCiAgICAgIGRhcmtzbGF0ZWJsdWU6IDB4NDgzZDhiLAogICAgICBkYXJrc2xhdGVncmF5OiAweDJmNGY0ZiwKICAgICAgZGFya3NsYXRlZ3JleTogMHgyZjRmNGYsCiAgICAgIGRhcmt0dXJxdW9pc2U6IDB4MDBjZWQxLAogICAgICBkYXJrdmlvbGV0OiAweDk0MDBkMywKICAgICAgZGVlcHBpbms6IDB4ZmYxNDkzLAogICAgICBkZWVwc2t5Ymx1ZTogMHgwMGJmZmYsCiAgICAgIGRpbWdyYXk6IDB4Njk2OTY5LAogICAgICBkaW1ncmV5OiAweDY5Njk2OSwKICAgICAgZG9kZ2VyYmx1ZTogMHgxZTkwZmYsCiAgICAgIGZpcmVicmljazogMHhiMjIyMjIsCiAgICAgIGZsb3JhbHdoaXRlOiAweGZmZmFmMCwKICAgICAgZm9yZXN0Z3JlZW46IDB4MjI4YjIyLAogICAgICBmdWNoc2lhOiAweGZmMDBmZiwKICAgICAgZ2FpbnNib3JvOiAweGRjZGNkYywKICAgICAgZ2hvc3R3aGl0ZTogMHhmOGY4ZmYsCiAgICAgIGdvbGQ6IDB4ZmZkNzAwLAogICAgICBnb2xkZW5yb2Q6IDB4ZGFhNTIwLAogICAgICBncmF5OiAweDgwODA4MCwKICAgICAgZ3JlZW46IDB4MDA4MDAwLAogICAgICBncmVlbnllbGxvdzogMHhhZGZmMmYsCiAgICAgIGdyZXk6IDB4ODA4MDgwLAogICAgICBob25leWRldzogMHhmMGZmZjAsCiAgICAgIGhvdHBpbms6IDB4ZmY2OWI0LAogICAgICBpbmRpYW5yZWQ6IDB4Y2Q1YzVjLAogICAgICBpbmRpZ286IDB4NGIwMDgyLAogICAgICBpdm9yeTogMHhmZmZmZjAsCiAgICAgIGtoYWtpOiAweGYwZTY4YywKICAgICAgbGF2ZW5kZXI6IDB4ZTZlNmZhLAogICAgICBsYXZlbmRlcmJsdXNoOiAweGZmZjBmNSwKICAgICAgbGF3bmdyZWVuOiAweDdjZmMwMCwKICAgICAgbGVtb25jaGlmZm9uOiAweGZmZmFjZCwKICAgICAgbGlnaHRibHVlOiAweGFkZDhlNiwKICAgICAgbGlnaHRjb3JhbDogMHhmMDgwODAsCiAgICAgIGxpZ2h0Y3lhbjogMHhlMGZmZmYsCiAgICAgIGxpZ2h0Z29sZGVucm9keWVsbG93OiAweGZhZmFkMiwKICAgICAgbGlnaHRncmF5OiAweGQzZDNkMywKICAgICAgbGlnaHRncmVlbjogMHg5MGVlOTAsCiAgICAgIGxpZ2h0Z3JleTogMHhkM2QzZDMsCiAgICAgIGxpZ2h0cGluazogMHhmZmI2YzEsCiAgICAgIGxpZ2h0c2FsbW9uOiAweGZmYTA3YSwKICAgICAgbGlnaHRzZWFncmVlbjogMHgyMGIyYWEsCiAgICAgIGxpZ2h0c2t5Ymx1ZTogMHg4N2NlZmEsCiAgICAgIGxpZ2h0c2xhdGVncmF5OiAweDc3ODg5OSwKICAgICAgbGlnaHRzbGF0ZWdyZXk6IDB4Nzc4ODk5LAogICAgICBsaWdodHN0ZWVsYmx1ZTogMHhiMGM0ZGUsCiAgICAgIGxpZ2h0eWVsbG93OiAweGZmZmZlMCwKICAgICAgbGltZTogMHgwMGZmMDAsCiAgICAgIGxpbWVncmVlbjogMHgzMmNkMzIsCiAgICAgIGxpbmVuOiAweGZhZjBlNiwKICAgICAgbWFnZW50YTogMHhmZjAwZmYsCiAgICAgIG1hcm9vbjogMHg4MDAwMDAsCiAgICAgIG1lZGl1bWFxdWFtYXJpbmU6IDB4NjZjZGFhLAogICAgICBtZWRpdW1ibHVlOiAweDAwMDBjZCwKICAgICAgbWVkaXVtb3JjaGlkOiAweGJhNTVkMywKICAgICAgbWVkaXVtcHVycGxlOiAweDkzNzBkYiwKICAgICAgbWVkaXVtc2VhZ3JlZW46IDB4M2NiMzcxLAogICAgICBtZWRpdW1zbGF0ZWJsdWU6IDB4N2I2OGVlLAogICAgICBtZWRpdW1zcHJpbmdncmVlbjogMHgwMGZhOWEsCiAgICAgIG1lZGl1bXR1cnF1b2lzZTogMHg0OGQxY2MsCiAgICAgIG1lZGl1bXZpb2xldHJlZDogMHhjNzE1ODUsCiAgICAgIG1pZG5pZ2h0Ymx1ZTogMHgxOTE5NzAsCiAgICAgIG1pbnRjcmVhbTogMHhmNWZmZmEsCiAgICAgIG1pc3R5cm9zZTogMHhmZmU0ZTEsCiAgICAgIG1vY2Nhc2luOiAweGZmZTRiNSwKICAgICAgbmF2YWpvd2hpdGU6IDB4ZmZkZWFkLAogICAgICBuYXZ5OiAweDAwMDA4MCwKICAgICAgb2xkbGFjZTogMHhmZGY1ZTYsCiAgICAgIG9saXZlOiAweDgwODAwMCwKICAgICAgb2xpdmVkcmFiOiAweDZiOGUyMywKICAgICAgb3JhbmdlOiAweGZmYTUwMCwKICAgICAgb3JhbmdlcmVkOiAweGZmNDUwMCwKICAgICAgb3JjaGlkOiAweGRhNzBkNiwKICAgICAgcGFsZWdvbGRlbnJvZDogMHhlZWU4YWEsCiAgICAgIHBhbGVncmVlbjogMHg5OGZiOTgsCiAgICAgIHBhbGV0dXJxdW9pc2U6IDB4YWZlZWVlLAogICAgICBwYWxldmlvbGV0cmVkOiAweGRiNzA5MywKICAgICAgcGFwYXlhd2hpcDogMHhmZmVmZDUsCiAgICAgIHBlYWNocHVmZjogMHhmZmRhYjksCiAgICAgIHBlcnU6IDB4Y2Q4NTNmLAogICAgICBwaW5rOiAweGZmYzBjYiwKICAgICAgcGx1bTogMHhkZGEwZGQsCiAgICAgIHBvd2RlcmJsdWU6IDB4YjBlMGU2LAogICAgICBwdXJwbGU6IDB4ODAwMDgwLAogICAgICByZWJlY2NhcHVycGxlOiAweDY2MzM5OSwKICAgICAgcmVkOiAweGZmMDAwMCwKICAgICAgcm9zeWJyb3duOiAweGJjOGY4ZiwKICAgICAgcm95YWxibHVlOiAweDQxNjllMSwKICAgICAgc2FkZGxlYnJvd246IDB4OGI0NTEzLAogICAgICBzYWxtb246IDB4ZmE4MDcyLAogICAgICBzYW5keWJyb3duOiAweGY0YTQ2MCwKICAgICAgc2VhZ3JlZW46IDB4MmU4YjU3LAogICAgICBzZWFzaGVsbDogMHhmZmY1ZWUsCiAgICAgIHNpZW5uYTogMHhhMDUyMmQsCiAgICAgIHNpbHZlcjogMHhjMGMwYzAsCiAgICAgIHNreWJsdWU6IDB4ODdjZWViLAogICAgICBzbGF0ZWJsdWU6IDB4NmE1YWNkLAogICAgICBzbGF0ZWdyYXk6IDB4NzA4MDkwLAogICAgICBzbGF0ZWdyZXk6IDB4NzA4MDkwLAogICAgICBzbm93OiAweGZmZmFmYSwKICAgICAgc3ByaW5nZ3JlZW46IDB4MDBmZjdmLAogICAgICBzdGVlbGJsdWU6IDB4NDY4MmI0LAogICAgICB0YW46IDB4ZDJiNDhjLAogICAgICB0ZWFsOiAweDAwODA4MCwKICAgICAgdGhpc3RsZTogMHhkOGJmZDgsCiAgICAgIHRvbWF0bzogMHhmZjYzNDcsCiAgICAgIHR1cnF1b2lzZTogMHg0MGUwZDAsCiAgICAgIHZpb2xldDogMHhlZTgyZWUsCiAgICAgIHdoZWF0OiAweGY1ZGViMywKICAgICAgd2hpdGU6IDB4ZmZmZmZmLAogICAgICB3aGl0ZXNtb2tlOiAweGY1ZjVmNSwKICAgICAgeWVsbG93OiAweGZmZmYwMCwKICAgICAgeWVsbG93Z3JlZW46IDB4OWFjZDMyCiAgICB9OwoKICAgIGRlZmluZSQ1KENvbG9yJDUsIGNvbG9yJDUsIHsKICAgICAgY29weTogZnVuY3Rpb24oY2hhbm5lbHMpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgdGhpcy5jb25zdHJ1Y3RvciwgdGhpcywgY2hhbm5lbHMpOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZGlzcGxheWFibGUoKTsKICAgICAgfSwKICAgICAgaGV4OiBjb2xvcl9mb3JtYXRIZXgkNCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICAgICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgkNCwKICAgICAgZm9ybWF0SHNsOiBjb2xvcl9mb3JtYXRIc2wkNCwKICAgICAgZm9ybWF0UmdiOiBjb2xvcl9mb3JtYXRSZ2IkNCwKICAgICAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYiQ0CiAgICB9KTsKCiAgICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIZXgkNCgpIHsKICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0SGV4KCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SHNsJDQoKSB7CiAgICAgIHJldHVybiBoc2xDb252ZXJ0JDUodGhpcykuZm9ybWF0SHNsKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0UmdiJDQoKSB7CiAgICAgIHJldHVybiB0aGlzLnJnYigpLmZvcm1hdFJnYigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yJDUoZm9ybWF0KSB7CiAgICAgIHZhciBtLCBsOwogICAgICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gKG0gPSByZUhleCQ0LmV4ZWMoZm9ybWF0KSkgPyAobCA9IG1bMV0ubGVuZ3RoLCBtID0gcGFyc2VJbnQobVsxXSwgMTYpLCBsID09PSA2ID8gcmdibiQ1KG0pIC8vICNmZjAwMDAKICAgICAgICAgIDogbCA9PT0gMyA/IG5ldyBSZ2IkNSgobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwCiAgICAgICAgICA6IGwgPT09IDggPyByZ2JhJDUobSA+PiAyNCAmIDB4ZmYsIG0gPj4gMTYgJiAweGZmLCBtID4+IDggJiAweGZmLCAobSAmIDB4ZmYpIC8gMHhmZikgLy8gI2ZmMDAwMDAwCiAgICAgICAgICA6IGwgPT09IDQgPyByZ2JhJDUoKG0gPj4gMTIgJiAweGYpIHwgKG0gPj4gOCAmIDB4ZjApLCAobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKChtICYgMHhmKSA8PCA0KSB8IChtICYgMHhmKSkgLyAweGZmKSAvLyAjZjAwMAogICAgICAgICAgOiBudWxsKSAvLyBpbnZhbGlkIGhleAogICAgICAgICAgOiAobSA9IHJlUmdiSW50ZWdlciQ1LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiJDUobVsxXSwgbVsyXSwgbVszXSwgMSkgLy8gcmdiKDI1NSwgMCwgMCkKICAgICAgICAgIDogKG0gPSByZVJnYlBlcmNlbnQkNS5leGVjKGZvcm1hdCkpID8gbmV3IFJnYiQ1KG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpCiAgICAgICAgICA6IChtID0gcmVSZ2JhSW50ZWdlciQ1LmV4ZWMoZm9ybWF0KSkgPyByZ2JhJDUobVsxXSwgbVsyXSwgbVszXSwgbVs0XSkgLy8gcmdiYSgyNTUsIDAsIDAsIDEpCiAgICAgICAgICA6IChtID0gcmVSZ2JhUGVyY2VudCQ1LmV4ZWMoZm9ybWF0KSkgPyByZ2JhJDUobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgbVs0XSkgLy8gcmdiKDEwMCUsIDAlLCAwJSwgMSkKICAgICAgICAgIDogKG0gPSByZUhzbFBlcmNlbnQkNS5leGVjKGZvcm1hdCkpID8gaHNsYSQ1KG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKQogICAgICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQkNS5leGVjKGZvcm1hdCkpID8gaHNsYSQ1KG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIG1bNF0pIC8vIGhzbGEoMTIwLCA1MCUsIDUwJSwgMSkKICAgICAgICAgIDogbmFtZWQkNS5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibiQ1KG5hbWVkJDVbZm9ybWF0XSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wcm90b3R5cGUtYnVpbHRpbnMKICAgICAgICAgIDogZm9ybWF0ID09PSAidHJhbnNwYXJlbnQiID8gbmV3IFJnYiQ1KE5hTiwgTmFOLCBOYU4sIDApCiAgICAgICAgICA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcmdibiQ1KG4pIHsKICAgICAgcmV0dXJuIG5ldyBSZ2IkNShuID4+IDE2ICYgMHhmZiwgbiA+PiA4ICYgMHhmZiwgbiAmIDB4ZmYsIDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYmEkNShyLCBnLCBiLCBhKSB7CiAgICAgIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjsKICAgICAgcmV0dXJuIG5ldyBSZ2IkNShyLCBnLCBiLCBhKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JDb252ZXJ0JDUobykgewogICAgICBpZiAoIShvIGluc3RhbmNlb2YgQ29sb3IkNSkpIG8gPSBjb2xvciQ1KG8pOwogICAgICBpZiAoIW8pIHJldHVybiBuZXcgUmdiJDU7CiAgICAgIG8gPSBvLnJnYigpOwogICAgICByZXR1cm4gbmV3IFJnYiQ1KG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiJDcociwgZywgYiwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IHJnYkNvbnZlcnQkNShyKSA6IG5ldyBSZ2IkNShyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gUmdiJDUociwgZywgYiwgb3BhY2l0eSkgewogICAgICB0aGlzLnIgPSArcjsKICAgICAgdGhpcy5nID0gK2c7CiAgICAgIHRoaXMuYiA9ICtiOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUkNShSZ2IkNSwgcmdiJDcsIGV4dGVuZCQ1KENvbG9yJDUsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIkNSA6IE1hdGgucG93KGJyaWdodGVyJDUsIGspOwogICAgICAgIHJldHVybiBuZXcgUmdiJDUodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciQ1IDogTWF0aC5wb3coZGFya2VyJDUsIGspOwogICAgICAgIHJldHVybiBuZXcgUmdiJDUodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9LAogICAgICBoZXg6IHJnYl9mb3JtYXRIZXgkNCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICAgICAgZm9ybWF0SGV4OiByZ2JfZm9ybWF0SGV4JDQsCiAgICAgIGZvcm1hdFJnYjogcmdiX2Zvcm1hdFJnYiQ0LAogICAgICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYiQ0CiAgICB9KSk7CgogICAgZnVuY3Rpb24gcmdiX2Zvcm1hdEhleCQ0KCkgewogICAgICByZXR1cm4gIiMiICsgaGV4JDQodGhpcy5yKSArIGhleCQ0KHRoaXMuZykgKyBoZXgkNCh0aGlzLmIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYl9mb3JtYXRSZ2IkNCgpIHsKICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgIHJldHVybiAoYSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCIpCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSkKICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICB9CgogICAgZnVuY3Rpb24gaGV4JDQodmFsdWUpIHsKICAgICAgdmFsdWUgPSBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodmFsdWUpIHx8IDApKTsKICAgICAgcmV0dXJuICh2YWx1ZSA8IDE2ID8gIjAiIDogIiIpICsgdmFsdWUudG9TdHJpbmcoMTYpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhzbGEkNShoLCBzLCBsLCBhKSB7CiAgICAgIGlmIChhIDw9IDApIGggPSBzID0gbCA9IE5hTjsKICAgICAgZWxzZSBpZiAobCA8PSAwIHx8IGwgPj0gMSkgaCA9IHMgPSBOYU47CiAgICAgIGVsc2UgaWYgKHMgPD0gMCkgaCA9IE5hTjsKICAgICAgcmV0dXJuIG5ldyBIc2wkNShoLCBzLCBsLCBhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xDb252ZXJ0JDUobykgewogICAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCQ1KSByZXR1cm4gbmV3IEhzbCQ1KG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvciQ1KSkgbyA9IGNvbG9yJDUobyk7CiAgICAgIGlmICghbykgcmV0dXJuIG5ldyBIc2wkNTsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wkNSkgcmV0dXJuIG87CiAgICAgIG8gPSBvLnJnYigpOwogICAgICB2YXIgciA9IG8uciAvIDI1NSwKICAgICAgICAgIGcgPSBvLmcgLyAyNTUsCiAgICAgICAgICBiID0gby5iIC8gMjU1LAogICAgICAgICAgbWluID0gTWF0aC5taW4ociwgZywgYiksCiAgICAgICAgICBtYXggPSBNYXRoLm1heChyLCBnLCBiKSwKICAgICAgICAgIGggPSBOYU4sCiAgICAgICAgICBzID0gbWF4IC0gbWluLAogICAgICAgICAgbCA9IChtYXggKyBtaW4pIC8gMjsKICAgICAgaWYgKHMpIHsKICAgICAgICBpZiAociA9PT0gbWF4KSBoID0gKGcgLSBiKSAvIHMgKyAoZyA8IGIpICogNjsKICAgICAgICBlbHNlIGlmIChnID09PSBtYXgpIGggPSAoYiAtIHIpIC8gcyArIDI7CiAgICAgICAgZWxzZSBoID0gKHIgLSBnKSAvIHMgKyA0OwogICAgICAgIHMgLz0gbCA8IDAuNSA/IG1heCArIG1pbiA6IDIgLSBtYXggLSBtaW47CiAgICAgICAgaCAqPSA2MDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzID0gbCA+IDAgJiYgbCA8IDEgPyAwIDogaDsKICAgICAgfQogICAgICByZXR1cm4gbmV3IEhzbCQ1KGgsIHMsIGwsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsJDkoaCwgcywgbCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQkNShoKSA6IG5ldyBIc2wkNShoLCBzLCBsLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gSHNsJDUoaCwgcywgbCwgb3BhY2l0eSkgewogICAgICB0aGlzLmggPSAraDsKICAgICAgdGhpcy5zID0gK3M7CiAgICAgIHRoaXMubCA9ICtsOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUkNShIc2wkNSwgaHNsJDksIGV4dGVuZCQ1KENvbG9yJDUsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIkNSA6IE1hdGgucG93KGJyaWdodGVyJDUsIGspOwogICAgICAgIHJldHVybiBuZXcgSHNsJDUodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIGRhcmtlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBkYXJrZXIkNSA6IE1hdGgucG93KGRhcmtlciQ1LCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCQ1KHRoaXMuaCwgdGhpcy5zLCB0aGlzLmwgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBoID0gdGhpcy5oICUgMzYwICsgKHRoaXMuaCA8IDApICogMzYwLAogICAgICAgICAgICBzID0gaXNOYU4oaCkgfHwgaXNOYU4odGhpcy5zKSA/IDAgOiB0aGlzLnMsCiAgICAgICAgICAgIGwgPSB0aGlzLmwsCiAgICAgICAgICAgIG0yID0gbCArIChsIDwgMC41ID8gbCA6IDEgLSBsKSAqIHMsCiAgICAgICAgICAgIG0xID0gMiAqIGwgLSBtMjsKICAgICAgICByZXR1cm4gbmV3IFJnYiQ1KAogICAgICAgICAgaHNsMnJnYiQ1KGggPj0gMjQwID8gaCAtIDI0MCA6IGggKyAxMjAsIG0xLCBtMiksCiAgICAgICAgICBoc2wycmdiJDUoaCwgbTEsIG0yKSwKICAgICAgICAgIGhzbDJyZ2IkNShoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksCiAgICAgICAgICB0aGlzLm9wYWNpdHkKICAgICAgICApOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7CiAgICAgIH0sCiAgICAgIGZvcm1hdEhzbDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgICAgcmV0dXJuIChhID09PSAxID8gImhzbCgiIDogImhzbGEoIikKICAgICAgICAgICAgKyAodGhpcy5oIHx8IDApICsgIiwgIgogICAgICAgICAgICArICh0aGlzLnMgfHwgMCkgKiAxMDAgKyAiJSwgIgogICAgICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyAiJSIKICAgICAgICAgICAgKyAoYSA9PT0gMSA/ICIpIiA6ICIsICIgKyBhICsgIikiKTsKICAgICAgfQogICAgfSkpOwoKICAgIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICAgIGZ1bmN0aW9uIGhzbDJyZ2IkNShoLCBtMSwgbTIpIHsKICAgICAgcmV0dXJuIChoIDwgNjAgPyBtMSArIChtMiAtIG0xKSAqIGggLyA2MAogICAgICAgICAgOiBoIDwgMTgwID8gbTIKICAgICAgICAgIDogaCA8IDI0MCA/IG0xICsgKG0yIC0gbTEpICogKDI0MCAtIGgpIC8gNjAKICAgICAgICAgIDogbTEpICogMjU1OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JHUoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyJDgoYSwgZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBhICsgdCAqIGQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb25lbnRpYWwkNihhLCBiLCB5KSB7CiAgICAgIHJldHVybiBhID0gTWF0aC5wb3coYSwgeSksIGIgPSBNYXRoLnBvdyhiLCB5KSAtIGEsIHkgPSAxIC8geSwgZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBNYXRoLnBvdyhhICsgdCAqIGIsIHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGdhbW1hJDQoeSkgewogICAgICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hJDQgOiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgcmV0dXJuIGIgLSBhID8gZXhwb25lbnRpYWwkNihhLCBiLCB5KSA6IGNvbnN0YW50JHUoaXNOYU4oYSkgPyBiIDogYSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbm9nYW1tYSQ0KGEsIGIpIHsKICAgICAgdmFyIGQgPSBiIC0gYTsKICAgICAgcmV0dXJuIGQgPyBsaW5lYXIkOChhLCBkKSA6IGNvbnN0YW50JHUoaXNOYU4oYSkgPyBiIDogYSk7CiAgICB9CgogICAgdmFyIGludGVycG9sYXRlUmdiJDIgPSAoZnVuY3Rpb24gcmdiR2FtbWEoeSkgewogICAgICB2YXIgY29sb3IgPSBnYW1tYSQ0KHkpOwoKICAgICAgZnVuY3Rpb24gcmdiKHN0YXJ0LCBlbmQpIHsKICAgICAgICB2YXIgciA9IGNvbG9yKChzdGFydCA9IHJnYiQ3KHN0YXJ0KSkuciwgKGVuZCA9IHJnYiQ3KGVuZCkpLnIpLAogICAgICAgICAgICBnID0gY29sb3Ioc3RhcnQuZywgZW5kLmcpLAogICAgICAgICAgICBiID0gY29sb3Ioc3RhcnQuYiwgZW5kLmIpLAogICAgICAgICAgICBvcGFjaXR5ID0gbm9nYW1tYSQ0KHN0YXJ0Lm9wYWNpdHksIGVuZC5vcGFjaXR5KTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgc3RhcnQuciA9IHIodCk7CiAgICAgICAgICBzdGFydC5nID0gZyh0KTsKICAgICAgICAgIHN0YXJ0LmIgPSBiKHQpOwogICAgICAgICAgc3RhcnQub3BhY2l0eSA9IG9wYWNpdHkodCk7CiAgICAgICAgICByZXR1cm4gc3RhcnQgKyAiIjsKICAgICAgICB9OwogICAgICB9CgogICAgICByZ2IuZ2FtbWEgPSByZ2JHYW1tYTsKCiAgICAgIHJldHVybiByZ2I7CiAgICB9KSgxKTsKCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZU51bWJlciQyKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7CiAgICAgIH07CiAgICB9CgogICAgdmFyIHJlQSQ0ID0gL1stK10/KD86XGQrXC4/XGQqfFwuP1xkKykoPzpbZUVdWy0rXT9cZCspPy9nLAogICAgICAgIHJlQiQ0ID0gbmV3IFJlZ0V4cChyZUEkNC5zb3VyY2UsICJnIik7CgogICAgZnVuY3Rpb24gemVybyQ0KGIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uZSQ0KGIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gYih0KSArICIiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlU3RyaW5nJDIoYSwgYikgewogICAgICB2YXIgYmkgPSByZUEkNC5sYXN0SW5kZXggPSByZUIkNC5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhCiAgICAgICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiCiAgICAgICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gcwogICAgICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAgIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4KICAgICAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsKCiAgICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICAgIHdoaWxlICgoYW0gPSByZUEkNC5leGVjKGEpKQogICAgICAgICAgJiYgKGJtID0gcmVCJDQuZXhlYyhiKSkpIHsKICAgICAgICBpZiAoKGJzID0gYm0uaW5kZXgpID4gYmkpIHsgLy8gYSBzdHJpbmcgcHJlY2VkZXMgdGhlIG5leHQgbnVtYmVyIGluIGIKICAgICAgICAgIGJzID0gYi5zbGljZShiaSwgYnMpOwogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgICAgIH0KICAgICAgICBpZiAoKGFtID0gYW1bMF0pID09PSAoYm0gPSBibVswXSkpIHsgLy8gbnVtYmVycyBpbiBhICYgYiBtYXRjaAogICAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYm07IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgICBlbHNlIHNbKytpXSA9IGJtOwogICAgICAgIH0gZWxzZSB7IC8vIGludGVycG9sYXRlIG5vbi1tYXRjaGluZyBudW1iZXJzCiAgICAgICAgICBzWysraV0gPSBudWxsOwogICAgICAgICAgcS5wdXNoKHtpOiBpLCB4OiBpbnRlcnBvbGF0ZU51bWJlciQyKGFtLCBibSl9KTsKICAgICAgICB9CiAgICAgICAgYmkgPSByZUIkNC5sYXN0SW5kZXg7CiAgICAgIH0KCiAgICAgIC8vIEFkZCByZW1haW5zIG9mIGIuCiAgICAgIGlmIChiaSA8IGIubGVuZ3RoKSB7CiAgICAgICAgYnMgPSBiLnNsaWNlKGJpKTsKICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgICBlbHNlIHNbKytpXSA9IGJzOwogICAgICB9CgogICAgICAvLyBTcGVjaWFsIG9wdGltaXphdGlvbiBmb3Igb25seSBhIHNpbmdsZSBtYXRjaC4KICAgICAgLy8gT3RoZXJ3aXNlLCBpbnRlcnBvbGF0ZSBlYWNoIG9mIHRoZSBudW1iZXJzIGFuZCByZWpvaW4gdGhlIHN0cmluZy4KICAgICAgcmV0dXJuIHMubGVuZ3RoIDwgMiA/IChxWzBdCiAgICAgICAgICA/IG9uZSQ0KHFbMF0ueCkKICAgICAgICAgIDogemVybyQ0KGIpKQogICAgICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgICAgICAgICAgfSk7CiAgICB9CgogICAgdmFyIGRlZ3JlZXMkNSA9IDE4MCAvIE1hdGguUEk7CgogICAgdmFyIGlkZW50aXR5JGsgPSB7CiAgICAgIHRyYW5zbGF0ZVg6IDAsCiAgICAgIHRyYW5zbGF0ZVk6IDAsCiAgICAgIHJvdGF0ZTogMCwKICAgICAgc2tld1g6IDAsCiAgICAgIHNjYWxlWDogMSwKICAgICAgc2NhbGVZOiAxCiAgICB9OwoKICAgIGZ1bmN0aW9uIGRlY29tcG9zZSQzKGEsIGIsIGMsIGQsIGUsIGYpIHsKICAgICAgdmFyIHNjYWxlWCwgc2NhbGVZLCBza2V3WDsKICAgICAgaWYgKHNjYWxlWCA9IE1hdGguc3FydChhICogYSArIGIgKiBiKSkgYSAvPSBzY2FsZVgsIGIgLz0gc2NhbGVYOwogICAgICBpZiAoc2tld1ggPSBhICogYyArIGIgKiBkKSBjIC09IGEgKiBza2V3WCwgZCAtPSBiICogc2tld1g7CiAgICAgIGlmIChzY2FsZVkgPSBNYXRoLnNxcnQoYyAqIGMgKyBkICogZCkpIGMgLz0gc2NhbGVZLCBkIC89IHNjYWxlWSwgc2tld1ggLz0gc2NhbGVZOwogICAgICBpZiAoYSAqIGQgPCBiICogYykgYSA9IC1hLCBiID0gLWIsIHNrZXdYID0gLXNrZXdYLCBzY2FsZVggPSAtc2NhbGVYOwogICAgICByZXR1cm4gewogICAgICAgIHRyYW5zbGF0ZVg6IGUsCiAgICAgICAgdHJhbnNsYXRlWTogZiwKICAgICAgICByb3RhdGU6IE1hdGguYXRhbjIoYiwgYSkgKiBkZWdyZWVzJDUsCiAgICAgICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzJDUsCiAgICAgICAgc2NhbGVYOiBzY2FsZVgsCiAgICAgICAgc2NhbGVZOiBzY2FsZVkKICAgICAgfTsKICAgIH0KCiAgICB2YXIgY3NzTm9kZSQzLAogICAgICAgIGNzc1Jvb3QkMywKICAgICAgICBjc3NWaWV3JDMsCiAgICAgICAgc3ZnTm9kZSQzOwoKICAgIGZ1bmN0aW9uIHBhcnNlQ3NzJDQodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09PSAibm9uZSIpIHJldHVybiBpZGVudGl0eSRrOwogICAgICBpZiAoIWNzc05vZGUkMykgY3NzTm9kZSQzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiRElWIiksIGNzc1Jvb3QkMyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyQzID0gZG9jdW1lbnQuZGVmYXVsdFZpZXc7CiAgICAgIGNzc05vZGUkMy5zdHlsZS50cmFuc2Zvcm0gPSB2YWx1ZTsKICAgICAgdmFsdWUgPSBjc3NWaWV3JDMuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290JDMuYXBwZW5kQ2hpbGQoY3NzTm9kZSQzKSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZSgidHJhbnNmb3JtIik7CiAgICAgIGNzc1Jvb3QkMy5yZW1vdmVDaGlsZChjc3NOb2RlJDMpOwogICAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDcsIC0xKS5zcGxpdCgiLCIpOwogICAgICByZXR1cm4gZGVjb21wb3NlJDMoK3ZhbHVlWzBdLCArdmFsdWVbMV0sICt2YWx1ZVsyXSwgK3ZhbHVlWzNdLCArdmFsdWVbNF0sICt2YWx1ZVs1XSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VTdmckMyh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5JGs7CiAgICAgIGlmICghc3ZnTm9kZSQzKSBzdmdOb2RlJDMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgImciKTsKICAgICAgc3ZnTm9kZSQzLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgdmFsdWUpOwogICAgICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUkMy50cmFuc2Zvcm0uYmFzZVZhbC5jb25zb2xpZGF0ZSgpKSkgcmV0dXJuIGlkZW50aXR5JGs7CiAgICAgIHZhbHVlID0gdmFsdWUubWF0cml4OwogICAgICByZXR1cm4gZGVjb21wb3NlJDModmFsdWUuYSwgdmFsdWUuYiwgdmFsdWUuYywgdmFsdWUuZCwgdmFsdWUuZSwgdmFsdWUuZik7CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVUcmFuc2Zvcm0kMyhwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHsKCiAgICAgIGZ1bmN0aW9uIHBvcChzKSB7CiAgICAgICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyJDIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMih5YSwgeWIpfSk7CiAgICAgICAgfSBlbHNlIGlmICh4YiB8fCB5YikgewogICAgICAgICAgcy5wdXNoKCJ0cmFuc2xhdGUoIiArIHhiICsgcHhDb21tYSArIHliICsgcHhQYXJlbik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiByb3RhdGUoYSwgYiwgcywgcSkgewogICAgICAgIGlmIChhICE9PSBiKSB7CiAgICAgICAgICBpZiAoYSAtIGIgPiAxODApIGIgKz0gMzYwOyBlbHNlIGlmIChiIC0gYSA+IDE4MCkgYSArPSAzNjA7IC8vIHNob3J0ZXN0IHBhdGgKICAgICAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiwgbnVsbCwgZGVnUGFyZW4pIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMihhLCBiKX0pOwogICAgICAgIH0gZWxzZSBpZiAoYikgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICAgICAgaWYgKGEgIT09IGIpIHsKICAgICAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArICJza2V3WCgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlciQyKGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIgKyBiICsgZGVnUGFyZW4pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIsIG51bGwsICIsIiwgbnVsbCwgIikiKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyJDIoeGEsIHhiKX0sIHtpOiBpIC0gMiwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMih5YSwgeWIpfSk7CiAgICAgICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCiAgICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7CiAgICAgICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7CiAgICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpOwogICAgICAgIGEgPSBiID0gbnVsbDsgLy8gZ2MKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvOwogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICAgIH07CiAgICAgIH07CiAgICB9CgogICAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzJDMgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybSQzKHBhcnNlQ3NzJDQsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgICB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmckMyA9IGludGVycG9sYXRlVHJhbnNmb3JtJDMocGFyc2VTdmckMywgIiwgIiwgIikiLCAiKSIpOwoKICAgIGZ1bmN0aW9uIHR3ZWVuUmVtb3ZlJDIoaWQsIG5hbWUpIHsKICAgICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JGQodGhpcywgaWQpLAogICAgICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTsKICAgICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uJDIoaWQsIG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciB0d2VlbjAsIHR3ZWVuMTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JGQodGhpcywgaWQpLAogICAgICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7CiAgICAgICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICB0d2VlbjFbaV0gPSB0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7CiAgICAgICAgfQoKICAgICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3R3ZWVuJDIobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICBuYW1lICs9ICIiOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIHR3ZWVuID0gZ2V0JDkodGhpcy5ub2RlKCksIGlkKS50d2VlbjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHQudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUkMiA6IHR3ZWVuRnVuY3Rpb24kMikoaWQsIG5hbWUsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHdlZW5WYWx1ZSQyKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkOwoKICAgICAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCRkKHRoaXMsIGlkKTsKICAgICAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gZ2V0JDkobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlJDUoYSwgYikgewogICAgICB2YXIgYzsKICAgICAgcmV0dXJuICh0eXBlb2YgYiA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlciQyCiAgICAgICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciQ1ID8gaW50ZXJwb2xhdGVSZ2IkMgogICAgICAgICAgOiAoYyA9IGNvbG9yJDUoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYiQyKQogICAgICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZyQyKShhLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlJDcobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDcoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQkNyhuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7CiAgICAgIHZhciB2YWx1ZTAwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TJDcoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgICAgdmFyIHZhbHVlMDAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUwID0gdGhpcy5nZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQ3KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgICB2YXIgdmFsdWUwMCwKICAgICAgICAgIHZhbHVlMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUwLCB2YWx1ZTEgPSB2YWx1ZSh0aGlzKTsKICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHJldHVybiB2b2lkIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgJiYgdmFsdWUxID09PSB2YWx1ZTEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUodmFsdWUwMCA9IHZhbHVlMCwgdmFsdWUxMCA9IHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMkNyhmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICAgIHZhciB2YWx1ZTAwLAogICAgICAgICAgdmFsdWUxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2YWx1ZTAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpOwogICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICAgIHZhbHVlMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsCiAgICAgICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fYXR0ciQyKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQ0KG5hbWUpLCBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmckMyA6IGludGVycG9sYXRlJDU7CiAgICAgIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkNyA6IGF0dHJGdW5jdGlvbiQ3KShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSQyKHRoaXMsICJhdHRyLiIgKyBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkNyA6IGF0dHJSZW1vdmUkNykoZnVsbG5hbWUpCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDcgOiBhdHRyQ29uc3RhbnQkNykoZnVsbG5hbWUsIGksIHZhbHVlICsgIiIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyVHdlZW5OUyQyKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMsIGkgPSB2YWx1ZS5hcHBseShub2RlLCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiBpICYmIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpKHQpKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm4gdHdlZW47CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clR3ZWVuJDIobmFtZSwgdmFsdWUpIHsKICAgICAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLCBpID0gdmFsdWUuYXBwbHkobm9kZSwgYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gaSAmJiBmdW5jdGlvbih0KSB7CiAgICAgICAgICBub2RlLnNldEF0dHJpYnV0ZShuYW1lLCBpKHQpKTsKICAgICAgICB9OwogICAgICB9CiAgICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm4gdHdlZW47CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9hdHRyVHdlZW4kMihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQ0KG5hbWUpOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIChmdWxsbmFtZS5sb2NhbCA/IGF0dHJUd2Vlbk5TJDIgOiBhdHRyVHdlZW4kMikoZnVsbG5hbWUsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVsYXlGdW5jdGlvbiQyKGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgaW5pdCQyKHRoaXMsIGlkKS5kZWxheSA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRlbGF5Q29uc3RhbnQkMihpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsKICAgICAgICBpbml0JDIodGhpcywgaWQpLmRlbGF5ID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9kZWxheSQyKHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IGRlbGF5RnVuY3Rpb24kMgogICAgICAgICAgICAgIDogZGVsYXlDb25zdGFudCQyKShpZCwgdmFsdWUpKQogICAgICAgICAgOiBnZXQkOSh0aGlzLm5vZGUoKSwgaWQpLmRlbGF5OwogICAgfQoKICAgIGZ1bmN0aW9uIGR1cmF0aW9uRnVuY3Rpb24kMihpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHNldCRkKHRoaXMsIGlkKS5kdXJhdGlvbiA9ICt2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGR1cmF0aW9uQ29uc3RhbnQkMihpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsKICAgICAgICBzZXQkZCh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2R1cmF0aW9uJDIodmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gZHVyYXRpb25GdW5jdGlvbiQyCiAgICAgICAgICAgICAgOiBkdXJhdGlvbkNvbnN0YW50JDIpKGlkLCB2YWx1ZSkpCiAgICAgICAgICA6IGdldCQ5KHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247CiAgICB9CgogICAgZnVuY3Rpb24gZWFzZUNvbnN0YW50JDIoaWQsIHZhbHVlKSB7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHNldCRkKHRoaXMsIGlkKS5lYXNlID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9lYXNlJDIodmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2goZWFzZUNvbnN0YW50JDIoaWQsIHZhbHVlKSkKICAgICAgICAgIDogZ2V0JDkodGhpcy5ub2RlKCksIGlkKS5lYXNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZmlsdGVyJDIobWF0Y2gpIHsKICAgICAgaWYgKHR5cGVvZiBtYXRjaCAhPT0gImZ1bmN0aW9uIikgbWF0Y2ggPSBtYXRjaGVyJDUobWF0Y2gpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24kMihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlJDIodHJhbnNpdGlvbikgewogICAgICBpZiAodHJhbnNpdGlvbi5faWQgIT09IHRoaXMuX2lkKSB0aHJvdyBuZXcgRXJyb3I7CgogICAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gdHJhbnNpdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsKICAgICAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yICg7IGogPCBtMDsgKytqKSB7CiAgICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDIobWVyZ2VzLCB0aGlzLl9wYXJlbnRzLCB0aGlzLl9uYW1lLCB0aGlzLl9pZCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3RhcnQkMyhuYW1lKSB7CiAgICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCkgewogICAgICAgIHZhciBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgcmV0dXJuICF0IHx8IHQgPT09ICJzdGFydCI7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uRnVuY3Rpb24kMihpZCwgbmFtZSwgbGlzdGVuZXIpIHsKICAgICAgdmFyIG9uMCwgb24xLCBzaXQgPSBzdGFydCQzKG5hbWUpID8gaW5pdCQyIDogc2V0JGQ7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLAogICAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpOwoKICAgICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX29uJDIobmFtZSwgbGlzdGVuZXIpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA8IDIKICAgICAgICAgID8gZ2V0JDkodGhpcy5ub2RlKCksIGlkKS5vbi5vbihuYW1lKQogICAgICAgICAgOiB0aGlzLmVhY2gob25GdW5jdGlvbiQyKGlkLCBuYW1lLCBsaXN0ZW5lcikpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZUZ1bmN0aW9uJDIoaWQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuOwogICAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3JlbW92ZSQyKCkgewogICAgICByZXR1cm4gdGhpcy5vbigiZW5kLnJlbW92ZSIsIHJlbW92ZUZ1bmN0aW9uJDIodGhpcy5faWQpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3NlbGVjdCQyKHNlbGVjdCkgewogICAgICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsCiAgICAgICAgICBpZCA9IHRoaXMuX2lkOwoKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yJDQoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICAgIHNjaGVkdWxlJDMoc3ViZ3JvdXBbaV0sIG5hbWUsIGlkLCBpLCBzdWJncm91cCwgZ2V0JDkobm9kZSwgaWQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbiQyKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0QWxsJDIoc2VsZWN0KSB7CiAgICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgICAgIGlkID0gdGhpcy5faWQ7CgogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwkNChzZWxlY3QpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgZm9yICh2YXIgY2hpbGRyZW4gPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCksIGNoaWxkLCBpbmhlcml0ID0gZ2V0JDkobm9kZSwgaWQpLCBrID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgayA8IGw7ICsraykgewogICAgICAgICAgICAgIGlmIChjaGlsZCA9IGNoaWxkcmVuW2tdKSB7CiAgICAgICAgICAgICAgICBzY2hlZHVsZSQzKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbiQyKHN1Ymdyb3VwcywgcGFyZW50cywgbmFtZSwgaWQpOwogICAgfQoKICAgIHZhciBTZWxlY3Rpb24kNyA9IHNlbGVjdGlvbiQ0LnByb3RvdHlwZS5jb25zdHJ1Y3RvcjsKCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3NlbGVjdGlvbiQyKCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ3KHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVSZW1vdmUkNyhuYW1lLCBpbnRlcnBvbGF0ZSkgewogICAgICB2YXIgdmFsdWUwMCwKICAgICAgICAgIHZhbHVlMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUwID0gc3R5bGVWYWx1ZSQ0KHRoaXMsIG5hbWUpLAogICAgICAgICAgICB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSQ0KHRoaXMsIG5hbWUpKTsKICAgICAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsCiAgICAgICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlUmVtb3ZlRW5kKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVDb25zdGFudCQ3KG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgICAgdmFyIHZhbHVlMDAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUwID0gc3R5bGVWYWx1ZSQ0KHRoaXMsIG5hbWUpOwogICAgICAgIHJldHVybiB2YWx1ZTAgPT09IHZhbHVlMSA/IG51bGwKICAgICAgICAgICAgOiB2YWx1ZTAgPT09IHZhbHVlMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZSh2YWx1ZTAwID0gdmFsdWUwLCB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24kNyhuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHsKICAgICAgdmFyIHZhbHVlMDAsCiAgICAgICAgICB2YWx1ZTEwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlMCA9IHN0eWxlVmFsdWUkNCh0aGlzLCBuYW1lKSwKICAgICAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyk7CiAgICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSQ0KHRoaXMsIG5hbWUpKTsKICAgICAgICByZXR1cm4gdmFsdWUwID09PSB2YWx1ZTEgPyBudWxsCiAgICAgICAgICAgIDogdmFsdWUwID09PSB2YWx1ZTAwICYmIHZhbHVlMSA9PT0gdmFsdWUxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHZhbHVlMDAgPSB2YWx1ZTAsIHZhbHVlMTAgPSB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGUkMihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIGkgPSAobmFtZSArPSAiIikgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MkMyA6IGludGVycG9sYXRlJDU7CiAgICAgIHJldHVybiB2YWx1ZSA9PSBudWxsID8gdGhpcwogICAgICAgICAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlUmVtb3ZlJDcobmFtZSwgaSkpCiAgICAgICAgICAgICAgLm9uKCJlbmQuc3R5bGUuIiArIG5hbWUsIHN0eWxlUmVtb3ZlRW5kKG5hbWUpKQogICAgICAgICAgOiB0aGlzLnN0eWxlVHdlZW4obmFtZSwgdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uJDcobmFtZSwgaSwgdHdlZW5WYWx1ZSQyKHRoaXMsICJzdHlsZS4iICsgbmFtZSwgdmFsdWUpKQogICAgICAgICAgICAgIDogc3R5bGVDb25zdGFudCQ3KG5hbWUsIGksIHZhbHVlICsgIiIpLCBwcmlvcml0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVUd2VlbiQyKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMsIGkgPSB2YWx1ZS5hcHBseShub2RlLCBhcmd1bWVudHMpOwogICAgICAgIHJldHVybiBpICYmIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIG5vZGUuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgaSh0KSwgcHJpb3JpdHkpOwogICAgICAgIH07CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4kMihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIGtleSA9ICJzdHlsZS4iICsgKG5hbWUgKz0gIiIpOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4kMihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkNyh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRGdW5jdGlvbiQ3KHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0JDIodmFsdWUpIHsKICAgICAgcmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gdGV4dEZ1bmN0aW9uJDcodHdlZW5WYWx1ZSQyKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAgICAgICAgOiB0ZXh0Q29uc3RhbnQkNyh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl90cmFuc2l0aW9uJDIoKSB7CiAgICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgICAgIGlkMCA9IHRoaXMuX2lkLAogICAgICAgICAgaWQxID0gbmV3SWQkMigpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQkOShub2RlLCBpZDApOwogICAgICAgICAgICBzY2hlZHVsZSQzKG5vZGUsIG5hbWUsIGlkMSwgaSwgZ3JvdXAsIHsKICAgICAgICAgICAgICB0aW1lOiBpbmhlcml0LnRpbWUgKyBpbmhlcml0LmRlbGF5ICsgaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgICBkZWxheTogMCwKICAgICAgICAgICAgICBkdXJhdGlvbjogaW5oZXJpdC5kdXJhdGlvbiwKICAgICAgICAgICAgICBlYXNlOiBpbmhlcml0LmVhc2UKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24kMihncm91cHMsIHRoaXMuX3BhcmVudHMsIG5hbWUsIGlkMSk7CiAgICB9CgogICAgdmFyIGlkJDIgPSAwOwoKICAgIGZ1bmN0aW9uIFRyYW5zaXRpb24kMihncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKSB7CiAgICAgIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICAgICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgICB0aGlzLl9pZCA9IGlkOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb24kMihuYW1lKSB7CiAgICAgIHJldHVybiBzZWxlY3Rpb24kNCgpLnRyYW5zaXRpb24obmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gbmV3SWQkMigpIHsKICAgICAgcmV0dXJuICsraWQkMjsKICAgIH0KCiAgICB2YXIgc2VsZWN0aW9uX3Byb3RvdHlwZSQyID0gc2VsZWN0aW9uJDQucHJvdG90eXBlOwoKICAgIFRyYW5zaXRpb24kMi5wcm90b3R5cGUgPSB0cmFuc2l0aW9uJDIucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVHJhbnNpdGlvbiQyLAogICAgICBzZWxlY3Q6IHRyYW5zaXRpb25fc2VsZWN0JDIsCiAgICAgIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwkMiwKICAgICAgZmlsdGVyOiB0cmFuc2l0aW9uX2ZpbHRlciQyLAogICAgICBtZXJnZTogdHJhbnNpdGlvbl9tZXJnZSQyLAogICAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uJDIsCiAgICAgIHRyYW5zaXRpb246IHRyYW5zaXRpb25fdHJhbnNpdGlvbiQyLAogICAgICBjYWxsOiBzZWxlY3Rpb25fcHJvdG90eXBlJDIuY2FsbCwKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUkMi5ub2RlcywKICAgICAgbm9kZTogc2VsZWN0aW9uX3Byb3RvdHlwZSQyLm5vZGUsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9wcm90b3R5cGUkMi5zaXplLAogICAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZSQyLmVtcHR5LAogICAgICBlYWNoOiBzZWxlY3Rpb25fcHJvdG90eXBlJDIuZWFjaCwKICAgICAgb246IHRyYW5zaXRpb25fb24kMiwKICAgICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyJDIsCiAgICAgIGF0dHJUd2VlbjogdHJhbnNpdGlvbl9hdHRyVHdlZW4kMiwKICAgICAgc3R5bGU6IHRyYW5zaXRpb25fc3R5bGUkMiwKICAgICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuJDIsCiAgICAgIHRleHQ6IHRyYW5zaXRpb25fdGV4dCQyLAogICAgICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlJDIsCiAgICAgIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuJDIsCiAgICAgIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5JDIsCiAgICAgIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uJDIsCiAgICAgIGVhc2U6IHRyYW5zaXRpb25fZWFzZSQyCiAgICB9OwoKICAgIHZhciBkZWZhdWx0VGltaW5nJDIgPSB7CiAgICAgIHRpbWU6IG51bGwsIC8vIFNldCBvbiB1c2UuCiAgICAgIGRlbGF5OiAwLAogICAgICBkdXJhdGlvbjogMjUwLAogICAgICBlYXNlOiBjdWJpY0luT3V0CiAgICB9OwoKICAgIGZ1bmN0aW9uIGluaGVyaXQkMihub2RlLCBpZCkgewogICAgICB2YXIgdGltaW5nOwogICAgICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7CiAgICAgICAgICByZXR1cm4gZGVmYXVsdFRpbWluZyQyLnRpbWUgPSBub3ckNCgpLCBkZWZhdWx0VGltaW5nJDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aW1pbmc7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3RyYW5zaXRpb24kMihuYW1lKSB7CiAgICAgIHZhciBpZCwKICAgICAgICAgIHRpbWluZzsKCiAgICAgIGlmIChuYW1lIGluc3RhbmNlb2YgVHJhbnNpdGlvbiQyKSB7CiAgICAgICAgaWQgPSBuYW1lLl9pZCwgbmFtZSA9IG5hbWUuX25hbWU7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWQgPSBuZXdJZCQyKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nJDIpLnRpbWUgPSBub3ckNCgpLCBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgICAgfQoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgc2NoZWR1bGUkMyhub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0JDIobm9kZSwgaWQpKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbiQyKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpOwogICAgfQoKICAgIHNlbGVjdGlvbiQ0LnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0JDI7CiAgICBzZWxlY3Rpb24kNC5wcm90b3R5cGUudHJhbnNpdGlvbiA9IHNlbGVjdGlvbl90cmFuc2l0aW9uJDI7CgogICAgdmFyIHJvb3QkNyA9IFtudWxsXTsKCiAgICBmdW5jdGlvbiBhY3RpdmUkMShub2RlLCBuYW1lKSB7CiAgICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbiwKICAgICAgICAgIHNjaGVkdWxlLAogICAgICAgICAgaTsKCiAgICAgIGlmIChzY2hlZHVsZXMpIHsKICAgICAgICBuYW1lID0gbmFtZSA9PSBudWxsID8gbnVsbCA6IG5hbWUgKyAiIjsKICAgICAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgICAgICBpZiAoKHNjaGVkdWxlID0gc2NoZWR1bGVzW2ldKS5zdGF0ZSA+IFNDSEVEVUxFRCQyICYmIHNjaGVkdWxlLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDIoW1tub2RlXV0sIHJvb3QkNywgbmFtZSwgK2kpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkdih4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB4JDkoZCkgewogICAgICByZXR1cm4gZFswXTsKICAgIH0KCiAgICBmdW5jdGlvbiB5JDkoZCkgewogICAgICByZXR1cm4gZFsxXTsKICAgIH0KCiAgICBmdW5jdGlvbiBSZWRCbGFja1RyZWUkMSgpIHsKICAgICAgdGhpcy5fID0gbnVsbDsgLy8gcm9vdCBub2RlCiAgICB9CgogICAgZnVuY3Rpb24gUmVkQmxhY2tOb2RlJDEobm9kZSkgewogICAgICBub2RlLlUgPSAvLyBwYXJlbnQgbm9kZQogICAgICBub2RlLkMgPSAvLyBjb2xvciAtIHRydWUgZm9yIHJlZCwgZmFsc2UgZm9yIGJsYWNrCiAgICAgIG5vZGUuTCA9IC8vIGxlZnQgbm9kZQogICAgICBub2RlLlIgPSAvLyByaWdodCBub2RlCiAgICAgIG5vZGUuUCA9IC8vIHByZXZpb3VzIG5vZGUKICAgICAgbm9kZS5OID0gbnVsbDsgLy8gbmV4dCBub2RlCiAgICB9CgogICAgUmVkQmxhY2tUcmVlJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogUmVkQmxhY2tUcmVlJDEsCgogICAgICBpbnNlcnQ6IGZ1bmN0aW9uKGFmdGVyLCBub2RlKSB7CiAgICAgICAgdmFyIHBhcmVudCwgZ3JhbmRwYSwgdW5jbGU7CgogICAgICAgIGlmIChhZnRlcikgewogICAgICAgICAgbm9kZS5QID0gYWZ0ZXI7CiAgICAgICAgICBub2RlLk4gPSBhZnRlci5OOwogICAgICAgICAgaWYgKGFmdGVyLk4pIGFmdGVyLk4uUCA9IG5vZGU7CiAgICAgICAgICBhZnRlci5OID0gbm9kZTsKICAgICAgICAgIGlmIChhZnRlci5SKSB7CiAgICAgICAgICAgIGFmdGVyID0gYWZ0ZXIuUjsKICAgICAgICAgICAgd2hpbGUgKGFmdGVyLkwpIGFmdGVyID0gYWZ0ZXIuTDsKICAgICAgICAgICAgYWZ0ZXIuTCA9IG5vZGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBhZnRlci5SID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICAgIHBhcmVudCA9IGFmdGVyOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fKSB7CiAgICAgICAgICBhZnRlciA9IFJlZEJsYWNrRmlyc3QkMSh0aGlzLl8pOwogICAgICAgICAgbm9kZS5QID0gbnVsbDsKICAgICAgICAgIG5vZGUuTiA9IGFmdGVyOwogICAgICAgICAgYWZ0ZXIuUCA9IGFmdGVyLkwgPSBub2RlOwogICAgICAgICAgcGFyZW50ID0gYWZ0ZXI7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG5vZGUuUCA9IG5vZGUuTiA9IG51bGw7CiAgICAgICAgICB0aGlzLl8gPSBub2RlOwogICAgICAgICAgcGFyZW50ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgbm9kZS5MID0gbm9kZS5SID0gbnVsbDsKICAgICAgICBub2RlLlUgPSBwYXJlbnQ7CiAgICAgICAgbm9kZS5DID0gdHJ1ZTsKCiAgICAgICAgYWZ0ZXIgPSBub2RlOwogICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50LkMpIHsKICAgICAgICAgIGdyYW5kcGEgPSBwYXJlbnQuVTsKICAgICAgICAgIGlmIChwYXJlbnQgPT09IGdyYW5kcGEuTCkgewogICAgICAgICAgICB1bmNsZSA9IGdyYW5kcGEuUjsKICAgICAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHsKICAgICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5SKSB7CiAgICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQkMSh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgICAgICAgYWZ0ZXIgPSBwYXJlbnQ7CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBhZnRlci5VOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwYXJlbnQuQyA9IGZhbHNlOwogICAgICAgICAgICAgIGdyYW5kcGEuQyA9IHRydWU7CiAgICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVSaWdodCQxKHRoaXMsIGdyYW5kcGEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB1bmNsZSA9IGdyYW5kcGEuTDsKICAgICAgICAgICAgaWYgKHVuY2xlICYmIHVuY2xlLkMpIHsKICAgICAgICAgICAgICBwYXJlbnQuQyA9IHVuY2xlLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgICAgIGFmdGVyID0gZ3JhbmRwYTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBpZiAoYWZ0ZXIgPT09IHBhcmVudC5MKSB7CiAgICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0JDEodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICAgIGFmdGVyID0gcGFyZW50OwogICAgICAgICAgICAgICAgcGFyZW50ID0gYWZ0ZXIuVTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgcGFyZW50LkMgPSBmYWxzZTsKICAgICAgICAgICAgICBncmFuZHBhLkMgPSB0cnVlOwogICAgICAgICAgICAgIFJlZEJsYWNrUm90YXRlTGVmdCQxKHRoaXMsIGdyYW5kcGEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBwYXJlbnQgPSBhZnRlci5VOwogICAgICAgIH0KICAgICAgICB0aGlzLl8uQyA9IGZhbHNlOwogICAgICB9LAoKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihub2RlKSB7CiAgICAgICAgaWYgKG5vZGUuTikgbm9kZS5OLlAgPSBub2RlLlA7CiAgICAgICAgaWYgKG5vZGUuUCkgbm9kZS5QLk4gPSBub2RlLk47CiAgICAgICAgbm9kZS5OID0gbm9kZS5QID0gbnVsbDsKCiAgICAgICAgdmFyIHBhcmVudCA9IG5vZGUuVSwKICAgICAgICAgICAgc2libGluZywKICAgICAgICAgICAgbGVmdCA9IG5vZGUuTCwKICAgICAgICAgICAgcmlnaHQgPSBub2RlLlIsCiAgICAgICAgICAgIG5leHQsCiAgICAgICAgICAgIHJlZDsKCiAgICAgICAgaWYgKCFsZWZ0KSBuZXh0ID0gcmlnaHQ7CiAgICAgICAgZWxzZSBpZiAoIXJpZ2h0KSBuZXh0ID0gbGVmdDsKICAgICAgICBlbHNlIG5leHQgPSBSZWRCbGFja0ZpcnN0JDEocmlnaHQpOwoKICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICBpZiAocGFyZW50LkwgPT09IG5vZGUpIHBhcmVudC5MID0gbmV4dDsKICAgICAgICAgIGVsc2UgcGFyZW50LlIgPSBuZXh0OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLl8gPSBuZXh0OwogICAgICAgIH0KCiAgICAgICAgaWYgKGxlZnQgJiYgcmlnaHQpIHsKICAgICAgICAgIHJlZCA9IG5leHQuQzsKICAgICAgICAgIG5leHQuQyA9IG5vZGUuQzsKICAgICAgICAgIG5leHQuTCA9IGxlZnQ7CiAgICAgICAgICBsZWZ0LlUgPSBuZXh0OwogICAgICAgICAgaWYgKG5leHQgIT09IHJpZ2h0KSB7CiAgICAgICAgICAgIHBhcmVudCA9IG5leHQuVTsKICAgICAgICAgICAgbmV4dC5VID0gbm9kZS5VOwogICAgICAgICAgICBub2RlID0gbmV4dC5SOwogICAgICAgICAgICBwYXJlbnQuTCA9IG5vZGU7CiAgICAgICAgICAgIG5leHQuUiA9IHJpZ2h0OwogICAgICAgICAgICByaWdodC5VID0gbmV4dDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5leHQuVSA9IHBhcmVudDsKICAgICAgICAgICAgcGFyZW50ID0gbmV4dDsKICAgICAgICAgICAgbm9kZSA9IG5leHQuUjsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmVkID0gbm9kZS5DOwogICAgICAgICAgbm9kZSA9IG5leHQ7CiAgICAgICAgfQoKICAgICAgICBpZiAobm9kZSkgbm9kZS5VID0gcGFyZW50OwogICAgICAgIGlmIChyZWQpIHJldHVybjsKICAgICAgICBpZiAobm9kZSAmJiBub2RlLkMpIHsgbm9kZS5DID0gZmFsc2U7IHJldHVybjsgfQoKICAgICAgICBkbyB7CiAgICAgICAgICBpZiAobm9kZSA9PT0gdGhpcy5fKSBicmVhazsKICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQuTCkgewogICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICAgIGlmIChzaWJsaW5nLkMpIHsKICAgICAgICAgICAgICBzaWJsaW5nLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBwYXJlbnQuQyA9IHRydWU7CiAgICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0JDEodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAgICAgICAgICAgICB8fCAoc2libGluZy5SICYmIHNpYmxpbmcuUi5DKSkgewogICAgICAgICAgICAgIGlmICghc2libGluZy5SIHx8ICFzaWJsaW5nLlIuQykgewogICAgICAgICAgICAgICAgc2libGluZy5MLkMgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHNpYmxpbmcuQyA9IHRydWU7CiAgICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0JDEodGhpcywgc2libGluZyk7CiAgICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50LlI7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmcuQyA9IHBhcmVudC5DOwogICAgICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5SLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZUxlZnQkMSh0aGlzLCBwYXJlbnQpOwogICAgICAgICAgICAgIG5vZGUgPSB0aGlzLl87CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHNpYmxpbmcgPSBwYXJlbnQuTDsKICAgICAgICAgICAgaWYgKHNpYmxpbmcuQykgewogICAgICAgICAgICAgIHNpYmxpbmcuQyA9IGZhbHNlOwogICAgICAgICAgICAgIHBhcmVudC5DID0gdHJ1ZTsKICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0JDEodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKChzaWJsaW5nLkwgJiYgc2libGluZy5MLkMpCiAgICAgICAgICAgICAgfHwgKHNpYmxpbmcuUiAmJiBzaWJsaW5nLlIuQykpIHsKICAgICAgICAgICAgICBpZiAoIXNpYmxpbmcuTCB8fCAhc2libGluZy5MLkMpIHsKICAgICAgICAgICAgICAgIHNpYmxpbmcuUi5DID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlOwogICAgICAgICAgICAgICAgUmVkQmxhY2tSb3RhdGVMZWZ0JDEodGhpcywgc2libGluZyk7CiAgICAgICAgICAgICAgICBzaWJsaW5nID0gcGFyZW50Lkw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIHNpYmxpbmcuQyA9IHBhcmVudC5DOwogICAgICAgICAgICAgIHBhcmVudC5DID0gc2libGluZy5MLkMgPSBmYWxzZTsKICAgICAgICAgICAgICBSZWRCbGFja1JvdGF0ZVJpZ2h0JDEodGhpcywgcGFyZW50KTsKICAgICAgICAgICAgICBub2RlID0gdGhpcy5fOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBzaWJsaW5nLkMgPSB0cnVlOwogICAgICAgICAgbm9kZSA9IHBhcmVudDsKICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5VOwogICAgICAgIH0gd2hpbGUgKCFub2RlLkMpOwoKICAgICAgICBpZiAobm9kZSkgbm9kZS5DID0gZmFsc2U7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVMZWZ0JDEodHJlZSwgbm9kZSkgewogICAgICB2YXIgcCA9IG5vZGUsCiAgICAgICAgICBxID0gbm9kZS5SLAogICAgICAgICAgcGFyZW50ID0gcC5VOwoKICAgICAgaWYgKHBhcmVudCkgewogICAgICAgIGlmIChwYXJlbnQuTCA9PT0gcCkgcGFyZW50LkwgPSBxOwogICAgICAgIGVsc2UgcGFyZW50LlIgPSBxOwogICAgICB9IGVsc2UgewogICAgICAgIHRyZWUuXyA9IHE7CiAgICAgIH0KCiAgICAgIHEuVSA9IHBhcmVudDsKICAgICAgcC5VID0gcTsKICAgICAgcC5SID0gcS5MOwogICAgICBpZiAocC5SKSBwLlIuVSA9IHA7CiAgICAgIHEuTCA9IHA7CiAgICB9CgogICAgZnVuY3Rpb24gUmVkQmxhY2tSb3RhdGVSaWdodCQxKHRyZWUsIG5vZGUpIHsKICAgICAgdmFyIHAgPSBub2RlLAogICAgICAgICAgcSA9IG5vZGUuTCwKICAgICAgICAgIHBhcmVudCA9IHAuVTsKCiAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICBpZiAocGFyZW50LkwgPT09IHApIHBhcmVudC5MID0gcTsKICAgICAgICBlbHNlIHBhcmVudC5SID0gcTsKICAgICAgfSBlbHNlIHsKICAgICAgICB0cmVlLl8gPSBxOwogICAgICB9CgogICAgICBxLlUgPSBwYXJlbnQ7CiAgICAgIHAuVSA9IHE7CiAgICAgIHAuTCA9IHEuUjsKICAgICAgaWYgKHAuTCkgcC5MLlUgPSBwOwogICAgICBxLlIgPSBwOwogICAgfQoKICAgIGZ1bmN0aW9uIFJlZEJsYWNrRmlyc3QkMShub2RlKSB7CiAgICAgIHdoaWxlIChub2RlLkwpIG5vZGUgPSBub2RlLkw7CiAgICAgIHJldHVybiBub2RlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUVkZ2UkMShsZWZ0LCByaWdodCwgdjAsIHYxKSB7CiAgICAgIHZhciBlZGdlID0gW251bGwsIG51bGxdLAogICAgICAgICAgaW5kZXggPSBlZGdlcyQxLnB1c2goZWRnZSkgLSAxOwogICAgICBlZGdlLmxlZnQgPSBsZWZ0OwogICAgICBlZGdlLnJpZ2h0ID0gcmlnaHQ7CiAgICAgIGlmICh2MCkgc2V0RWRnZUVuZCQxKGVkZ2UsIGxlZnQsIHJpZ2h0LCB2MCk7CiAgICAgIGlmICh2MSkgc2V0RWRnZUVuZCQxKGVkZ2UsIHJpZ2h0LCBsZWZ0LCB2MSk7CiAgICAgIGNlbGxzJDFbbGVmdC5pbmRleF0uaGFsZmVkZ2VzLnB1c2goaW5kZXgpOwogICAgICBjZWxscyQxW3JpZ2h0LmluZGV4XS5oYWxmZWRnZXMucHVzaChpbmRleCk7CiAgICAgIHJldHVybiBlZGdlOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUJvcmRlckVkZ2UkMShsZWZ0LCB2MCwgdjEpIHsKICAgICAgdmFyIGVkZ2UgPSBbdjAsIHYxXTsKICAgICAgZWRnZS5sZWZ0ID0gbGVmdDsKICAgICAgcmV0dXJuIGVkZ2U7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0RWRnZUVuZCQxKGVkZ2UsIGxlZnQsIHJpZ2h0LCB2ZXJ0ZXgpIHsKICAgICAgaWYgKCFlZGdlWzBdICYmICFlZGdlWzFdKSB7CiAgICAgICAgZWRnZVswXSA9IHZlcnRleDsKICAgICAgICBlZGdlLmxlZnQgPSBsZWZ0OwogICAgICAgIGVkZ2UucmlnaHQgPSByaWdodDsKICAgICAgfSBlbHNlIGlmIChlZGdlLmxlZnQgPT09IHJpZ2h0KSB7CiAgICAgICAgZWRnZVsxXSA9IHZlcnRleDsKICAgICAgfSBlbHNlIHsKICAgICAgICBlZGdlWzBdID0gdmVydGV4OwogICAgICB9CiAgICB9CgogICAgLy8gTGlhbmfigJNCYXJza3kgbGluZSBjbGlwcGluZy4KICAgIGZ1bmN0aW9uIGNsaXBFZGdlJDEoZWRnZSwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgdmFyIGEgPSBlZGdlWzBdLAogICAgICAgICAgYiA9IGVkZ2VbMV0sCiAgICAgICAgICBheCA9IGFbMF0sCiAgICAgICAgICBheSA9IGFbMV0sCiAgICAgICAgICBieCA9IGJbMF0sCiAgICAgICAgICBieSA9IGJbMV0sCiAgICAgICAgICB0MCA9IDAsCiAgICAgICAgICB0MSA9IDEsCiAgICAgICAgICBkeCA9IGJ4IC0gYXgsCiAgICAgICAgICBkeSA9IGJ5IC0gYXksCiAgICAgICAgICByOwoKICAgICAgciA9IHgwIC0gYXg7CiAgICAgIGlmICghZHggJiYgciA+IDApIHJldHVybjsKICAgICAgciAvPSBkeDsKICAgICAgaWYgKGR4IDwgMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0gZWxzZSBpZiAoZHggPiAwKSB7CiAgICAgICAgaWYgKHIgPiB0MSkgcmV0dXJuOwogICAgICAgIGlmIChyID4gdDApIHQwID0gcjsKICAgICAgfQoKICAgICAgciA9IHgxIC0gYXg7CiAgICAgIGlmICghZHggJiYgciA8IDApIHJldHVybjsKICAgICAgciAvPSBkeDsKICAgICAgaWYgKGR4IDwgMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0gZWxzZSBpZiAoZHggPiAwKSB7CiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICAgICAgfQoKICAgICAgciA9IHkwIC0gYXk7CiAgICAgIGlmICghZHkgJiYgciA+IDApIHJldHVybjsKICAgICAgciAvPSBkeTsKICAgICAgaWYgKGR5IDwgMCkgewogICAgICAgIGlmIChyIDwgdDApIHJldHVybjsKICAgICAgICBpZiAociA8IHQxKSB0MSA9IHI7CiAgICAgIH0gZWxzZSBpZiAoZHkgPiAwKSB7CiAgICAgICAgaWYgKHIgPiB0MSkgcmV0dXJuOwogICAgICAgIGlmIChyID4gdDApIHQwID0gcjsKICAgICAgfQoKICAgICAgciA9IHkxIC0gYXk7CiAgICAgIGlmICghZHkgJiYgciA8IDApIHJldHVybjsKICAgICAgciAvPSBkeTsKICAgICAgaWYgKGR5IDwgMCkgewogICAgICAgIGlmIChyID4gdDEpIHJldHVybjsKICAgICAgICBpZiAociA+IHQwKSB0MCA9IHI7CiAgICAgIH0gZWxzZSBpZiAoZHkgPiAwKSB7CiAgICAgICAgaWYgKHIgPCB0MCkgcmV0dXJuOwogICAgICAgIGlmIChyIDwgdDEpIHQxID0gcjsKICAgICAgfQoKICAgICAgaWYgKCEodDAgPiAwKSAmJiAhKHQxIDwgMSkpIHJldHVybiB0cnVlOyAvLyBUT0RPIEJldHRlciBjaGVjaz8KCiAgICAgIGlmICh0MCA+IDApIGVkZ2VbMF0gPSBbYXggKyB0MCAqIGR4LCBheSArIHQwICogZHldOwogICAgICBpZiAodDEgPCAxKSBlZGdlWzFdID0gW2F4ICsgdDEgKiBkeCwgYXkgKyB0MSAqIGR5XTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gY29ubmVjdEVkZ2UkMShlZGdlLCB4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgdjEgPSBlZGdlWzFdOwogICAgICBpZiAodjEpIHJldHVybiB0cnVlOwoKICAgICAgdmFyIHYwID0gZWRnZVswXSwKICAgICAgICAgIGxlZnQgPSBlZGdlLmxlZnQsCiAgICAgICAgICByaWdodCA9IGVkZ2UucmlnaHQsCiAgICAgICAgICBseCA9IGxlZnRbMF0sCiAgICAgICAgICBseSA9IGxlZnRbMV0sCiAgICAgICAgICByeCA9IHJpZ2h0WzBdLAogICAgICAgICAgcnkgPSByaWdodFsxXSwKICAgICAgICAgIGZ4ID0gKGx4ICsgcngpIC8gMiwKICAgICAgICAgIGZ5ID0gKGx5ICsgcnkpIC8gMiwKICAgICAgICAgIGZtLAogICAgICAgICAgZmI7CgogICAgICBpZiAocnkgPT09IGx5KSB7CiAgICAgICAgaWYgKGZ4IDwgeDAgfHwgZnggPj0geDEpIHJldHVybjsKICAgICAgICBpZiAobHggPiByeCkgewogICAgICAgICAgaWYgKCF2MCkgdjAgPSBbZngsIHkwXTsKICAgICAgICAgIGVsc2UgaWYgKHYwWzFdID49IHkxKSByZXR1cm47CiAgICAgICAgICB2MSA9IFtmeCwgeTFdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIXYwKSB2MCA9IFtmeCwgeTFdOwogICAgICAgICAgZWxzZSBpZiAodjBbMV0gPCB5MCkgcmV0dXJuOwogICAgICAgICAgdjEgPSBbZngsIHkwXTsKICAgICAgICB9CiAgICAgIH0gZWxzZSB7CiAgICAgICAgZm0gPSAobHggLSByeCkgLyAocnkgLSBseSk7CiAgICAgICAgZmIgPSBmeSAtIGZtICogZng7CiAgICAgICAgaWYgKGZtIDwgLTEgfHwgZm0gPiAxKSB7CiAgICAgICAgICBpZiAobHggPiByeCkgewogICAgICAgICAgICBpZiAoIXYwKSB2MCA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICAgICAgICBlbHNlIGlmICh2MFsxXSA+PSB5MSkgcmV0dXJuOwogICAgICAgICAgICB2MSA9IFsoeTEgLSBmYikgLyBmbSwgeTFdOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKCF2MCkgdjAgPSBbKHkxIC0gZmIpIC8gZm0sIHkxXTsKICAgICAgICAgICAgZWxzZSBpZiAodjBbMV0gPCB5MCkgcmV0dXJuOwogICAgICAgICAgICB2MSA9IFsoeTAgLSBmYikgLyBmbSwgeTBdOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAobHkgPCByeSkgewogICAgICAgICAgICBpZiAoIXYwKSB2MCA9IFt4MCwgZm0gKiB4MCArIGZiXTsKICAgICAgICAgICAgZWxzZSBpZiAodjBbMF0gPj0geDEpIHJldHVybjsKICAgICAgICAgICAgdjEgPSBbeDEsIGZtICogeDEgKyBmYl07CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoIXYwKSB2MCA9IFt4MSwgZm0gKiB4MSArIGZiXTsKICAgICAgICAgICAgZWxzZSBpZiAodjBbMF0gPCB4MCkgcmV0dXJuOwogICAgICAgICAgICB2MSA9IFt4MCwgZm0gKiB4MCArIGZiXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGVkZ2VbMF0gPSB2MDsKICAgICAgZWRnZVsxXSA9IHYxOwogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwRWRnZXMkMSh4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgaSA9IGVkZ2VzJDEubGVuZ3RoLAogICAgICAgICAgZWRnZTsKCiAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICBpZiAoIWNvbm5lY3RFZGdlJDEoZWRnZSA9IGVkZ2VzJDFbaV0sIHgwLCB5MCwgeDEsIHkxKQogICAgICAgICAgICB8fCAhY2xpcEVkZ2UkMShlZGdlLCB4MCwgeTAsIHgxLCB5MSkKICAgICAgICAgICAgfHwgIShNYXRoLmFicyhlZGdlWzBdWzBdIC0gZWRnZVsxXVswXSkgPiBlcHNpbG9uJGIKICAgICAgICAgICAgICAgIHx8IE1hdGguYWJzKGVkZ2VbMF1bMV0gLSBlZGdlWzFdWzFdKSA+IGVwc2lsb24kYikpIHsKICAgICAgICAgIGRlbGV0ZSBlZGdlcyQxW2ldOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZUNlbGwkMShzaXRlKSB7CiAgICAgIHJldHVybiBjZWxscyQxW3NpdGUuaW5kZXhdID0gewogICAgICAgIHNpdGU6IHNpdGUsCiAgICAgICAgaGFsZmVkZ2VzOiBbXQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNlbGxIYWxmZWRnZUFuZ2xlJDEoY2VsbCwgZWRnZSkgewogICAgICB2YXIgc2l0ZSA9IGNlbGwuc2l0ZSwKICAgICAgICAgIHZhID0gZWRnZS5sZWZ0LAogICAgICAgICAgdmIgPSBlZGdlLnJpZ2h0OwogICAgICBpZiAoc2l0ZSA9PT0gdmIpIHZiID0gdmEsIHZhID0gc2l0ZTsKICAgICAgaWYgKHZiKSByZXR1cm4gTWF0aC5hdGFuMih2YlsxXSAtIHZhWzFdLCB2YlswXSAtIHZhWzBdKTsKICAgICAgaWYgKHNpdGUgPT09IHZhKSB2YSA9IGVkZ2VbMV0sIHZiID0gZWRnZVswXTsKICAgICAgZWxzZSB2YSA9IGVkZ2VbMF0sIHZiID0gZWRnZVsxXTsKICAgICAgcmV0dXJuIE1hdGguYXRhbjIodmFbMF0gLSB2YlswXSwgdmJbMV0gLSB2YVsxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2VsbEhhbGZlZGdlU3RhcnQkMShjZWxsLCBlZGdlKSB7CiAgICAgIHJldHVybiBlZGdlWysoZWRnZS5sZWZ0ICE9PSBjZWxsLnNpdGUpXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjZWxsSGFsZmVkZ2VFbmQkMShjZWxsLCBlZGdlKSB7CiAgICAgIHJldHVybiBlZGdlWysoZWRnZS5sZWZ0ID09PSBjZWxsLnNpdGUpXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzb3J0Q2VsbEhhbGZlZGdlcyQxKCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGNlbGxzJDEubGVuZ3RoLCBjZWxsLCBoYWxmZWRnZXMsIGosIG07IGkgPCBuOyArK2kpIHsKICAgICAgICBpZiAoKGNlbGwgPSBjZWxscyQxW2ldKSAmJiAobSA9IChoYWxmZWRnZXMgPSBjZWxsLmhhbGZlZGdlcykubGVuZ3RoKSkgewogICAgICAgICAgdmFyIGluZGV4ID0gbmV3IEFycmF5KG0pLAogICAgICAgICAgICAgIGFycmF5ID0gbmV3IEFycmF5KG0pOwogICAgICAgICAgZm9yIChqID0gMDsgaiA8IG07ICsraikgaW5kZXhbal0gPSBqLCBhcnJheVtqXSA9IGNlbGxIYWxmZWRnZUFuZ2xlJDEoY2VsbCwgZWRnZXMkMVtoYWxmZWRnZXNbal1dKTsKICAgICAgICAgIGluZGV4LnNvcnQoZnVuY3Rpb24oaSwgaikgeyByZXR1cm4gYXJyYXlbal0gLSBhcnJheVtpXTsgfSk7CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSBhcnJheVtqXSA9IGhhbGZlZGdlc1tpbmRleFtqXV07CiAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbTsgKytqKSBoYWxmZWRnZXNbal0gPSBhcnJheVtqXTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjbGlwQ2VsbHMkMSh4MCwgeTAsIHgxLCB5MSkgewogICAgICB2YXIgbkNlbGxzID0gY2VsbHMkMS5sZW5ndGgsCiAgICAgICAgICBpQ2VsbCwKICAgICAgICAgIGNlbGwsCiAgICAgICAgICBzaXRlLAogICAgICAgICAgaUhhbGZlZGdlLAogICAgICAgICAgaGFsZmVkZ2VzLAogICAgICAgICAgbkhhbGZlZGdlcywKICAgICAgICAgIHN0YXJ0LAogICAgICAgICAgc3RhcnRYLAogICAgICAgICAgc3RhcnRZLAogICAgICAgICAgZW5kLAogICAgICAgICAgZW5kWCwKICAgICAgICAgIGVuZFksCiAgICAgICAgICBjb3ZlciA9IHRydWU7CgogICAgICBmb3IgKGlDZWxsID0gMDsgaUNlbGwgPCBuQ2VsbHM7ICsraUNlbGwpIHsKICAgICAgICBpZiAoY2VsbCA9IGNlbGxzJDFbaUNlbGxdKSB7CiAgICAgICAgICBzaXRlID0gY2VsbC5zaXRlOwogICAgICAgICAgaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRnZXM7CiAgICAgICAgICBpSGFsZmVkZ2UgPSBoYWxmZWRnZXMubGVuZ3RoOwoKICAgICAgICAgIC8vIFJlbW92ZSBhbnkgZGFuZ2xpbmcgY2xpcHBlZCBlZGdlcy4KICAgICAgICAgIHdoaWxlIChpSGFsZmVkZ2UtLSkgewogICAgICAgICAgICBpZiAoIWVkZ2VzJDFbaGFsZmVkZ2VzW2lIYWxmZWRnZV1dKSB7CiAgICAgICAgICAgICAgaGFsZmVkZ2VzLnNwbGljZShpSGFsZmVkZ2UsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSW5zZXJ0IGFueSBib3JkZXIgZWRnZXMgYXMgbmVjZXNzYXJ5LgogICAgICAgICAgaUhhbGZlZGdlID0gMCwgbkhhbGZlZGdlcyA9IGhhbGZlZGdlcy5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAoaUhhbGZlZGdlIDwgbkhhbGZlZGdlcykgewogICAgICAgICAgICBlbmQgPSBjZWxsSGFsZmVkZ2VFbmQkMShjZWxsLCBlZGdlcyQxW2hhbGZlZGdlc1tpSGFsZmVkZ2VdXSksIGVuZFggPSBlbmRbMF0sIGVuZFkgPSBlbmRbMV07CiAgICAgICAgICAgIHN0YXJ0ID0gY2VsbEhhbGZlZGdlU3RhcnQkMShjZWxsLCBlZGdlcyQxW2hhbGZlZGdlc1srK2lIYWxmZWRnZSAlIG5IYWxmZWRnZXNdXSksIHN0YXJ0WCA9IHN0YXJ0WzBdLCBzdGFydFkgPSBzdGFydFsxXTsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKGVuZFggLSBzdGFydFgpID4gZXBzaWxvbiRiIHx8IE1hdGguYWJzKGVuZFkgLSBzdGFydFkpID4gZXBzaWxvbiRiKSB7CiAgICAgICAgICAgICAgaGFsZmVkZ2VzLnNwbGljZShpSGFsZmVkZ2UsIDAsIGVkZ2VzJDEucHVzaChjcmVhdGVCb3JkZXJFZGdlJDEoc2l0ZSwgZW5kLAogICAgICAgICAgICAgICAgICBNYXRoLmFicyhlbmRYIC0geDApIDwgZXBzaWxvbiRiICYmIHkxIC0gZW5kWSA+IGVwc2lsb24kYiA/IFt4MCwgTWF0aC5hYnMoc3RhcnRYIC0geDApIDwgZXBzaWxvbiRiID8gc3RhcnRZIDogeTFdCiAgICAgICAgICAgICAgICAgIDogTWF0aC5hYnMoZW5kWSAtIHkxKSA8IGVwc2lsb24kYiAmJiB4MSAtIGVuZFggPiBlcHNpbG9uJGIgPyBbTWF0aC5hYnMoc3RhcnRZIC0geTEpIDwgZXBzaWxvbiRiID8gc3RhcnRYIDogeDEsIHkxXQogICAgICAgICAgICAgICAgICA6IE1hdGguYWJzKGVuZFggLSB4MSkgPCBlcHNpbG9uJGIgJiYgZW5kWSAtIHkwID4gZXBzaWxvbiRiID8gW3gxLCBNYXRoLmFicyhzdGFydFggLSB4MSkgPCBlcHNpbG9uJGIgPyBzdGFydFkgOiB5MF0KICAgICAgICAgICAgICAgICAgOiBNYXRoLmFicyhlbmRZIC0geTApIDwgZXBzaWxvbiRiICYmIGVuZFggLSB4MCA+IGVwc2lsb24kYiA/IFtNYXRoLmFicyhzdGFydFkgLSB5MCkgPCBlcHNpbG9uJGIgPyBzdGFydFggOiB4MCwgeTBdCiAgICAgICAgICAgICAgICAgIDogbnVsbCkpIC0gMSk7CiAgICAgICAgICAgICAgKytuSGFsZmVkZ2VzOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKG5IYWxmZWRnZXMpIGNvdmVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBJZiB0aGVyZSB3ZXJlbuKAmXQgYW55IGVkZ2VzLCBoYXZlIHRoZSBjbG9zZXN0IHNpdGUgY292ZXIgdGhlIGV4dGVudC4KICAgICAgLy8gSXQgZG9lc27igJl0IG1hdHRlciB3aGljaCBjb3JuZXIgb2YgdGhlIGV4dGVudCB3ZSBtZWFzdXJlIQogICAgICBpZiAoY292ZXIpIHsKICAgICAgICB2YXIgZHgsIGR5LCBkMiwgZGMgPSBJbmZpbml0eTsKCiAgICAgICAgZm9yIChpQ2VsbCA9IDAsIGNvdmVyID0gbnVsbDsgaUNlbGwgPCBuQ2VsbHM7ICsraUNlbGwpIHsKICAgICAgICAgIGlmIChjZWxsID0gY2VsbHMkMVtpQ2VsbF0pIHsKICAgICAgICAgICAgc2l0ZSA9IGNlbGwuc2l0ZTsKICAgICAgICAgICAgZHggPSBzaXRlWzBdIC0geDA7CiAgICAgICAgICAgIGR5ID0gc2l0ZVsxXSAtIHkwOwogICAgICAgICAgICBkMiA9IGR4ICogZHggKyBkeSAqIGR5OwogICAgICAgICAgICBpZiAoZDIgPCBkYykgZGMgPSBkMiwgY292ZXIgPSBjZWxsOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgaWYgKGNvdmVyKSB7CiAgICAgICAgICB2YXIgdjAwID0gW3gwLCB5MF0sIHYwMSA9IFt4MCwgeTFdLCB2MTEgPSBbeDEsIHkxXSwgdjEwID0gW3gxLCB5MF07CiAgICAgICAgICBjb3Zlci5oYWxmZWRnZXMucHVzaCgKICAgICAgICAgICAgZWRnZXMkMS5wdXNoKGNyZWF0ZUJvcmRlckVkZ2UkMShzaXRlID0gY292ZXIuc2l0ZSwgdjAwLCB2MDEpKSAtIDEsCiAgICAgICAgICAgIGVkZ2VzJDEucHVzaChjcmVhdGVCb3JkZXJFZGdlJDEoc2l0ZSwgdjAxLCB2MTEpKSAtIDEsCiAgICAgICAgICAgIGVkZ2VzJDEucHVzaChjcmVhdGVCb3JkZXJFZGdlJDEoc2l0ZSwgdjExLCB2MTApKSAtIDEsCiAgICAgICAgICAgIGVkZ2VzJDEucHVzaChjcmVhdGVCb3JkZXJFZGdlJDEoc2l0ZSwgdjEwLCB2MDApKSAtIDEKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBMYXN0bHkgZGVsZXRlIGFueSBjZWxscyB3aXRoIG5vIGVkZ2VzOyB0aGVzZSB3ZXJlIGVudGlyZWx5IGNsaXBwZWQuCiAgICAgIGZvciAoaUNlbGwgPSAwOyBpQ2VsbCA8IG5DZWxsczsgKytpQ2VsbCkgewogICAgICAgIGlmIChjZWxsID0gY2VsbHMkMVtpQ2VsbF0pIHsKICAgICAgICAgIGlmICghY2VsbC5oYWxmZWRnZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIGRlbGV0ZSBjZWxscyQxW2lDZWxsXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICB2YXIgY2lyY2xlUG9vbCQxID0gW107CgogICAgdmFyIGZpcnN0Q2lyY2xlJDE7CgogICAgZnVuY3Rpb24gQ2lyY2xlJDEoKSB7CiAgICAgIFJlZEJsYWNrTm9kZSQxKHRoaXMpOwogICAgICB0aGlzLnggPQogICAgICB0aGlzLnkgPQogICAgICB0aGlzLmFyYyA9CiAgICAgIHRoaXMuc2l0ZSA9CiAgICAgIHRoaXMuY3kgPSBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dGFjaENpcmNsZSQxKGFyYykgewogICAgICB2YXIgbEFyYyA9IGFyYy5QLAogICAgICAgICAgckFyYyA9IGFyYy5OOwoKICAgICAgaWYgKCFsQXJjIHx8ICFyQXJjKSByZXR1cm47CgogICAgICB2YXIgbFNpdGUgPSBsQXJjLnNpdGUsCiAgICAgICAgICBjU2l0ZSA9IGFyYy5zaXRlLAogICAgICAgICAgclNpdGUgPSByQXJjLnNpdGU7CgogICAgICBpZiAobFNpdGUgPT09IHJTaXRlKSByZXR1cm47CgogICAgICB2YXIgYnggPSBjU2l0ZVswXSwKICAgICAgICAgIGJ5ID0gY1NpdGVbMV0sCiAgICAgICAgICBheCA9IGxTaXRlWzBdIC0gYngsCiAgICAgICAgICBheSA9IGxTaXRlWzFdIC0gYnksCiAgICAgICAgICBjeCA9IHJTaXRlWzBdIC0gYngsCiAgICAgICAgICBjeSA9IHJTaXRlWzFdIC0gYnk7CgogICAgICB2YXIgZCA9IDIgKiAoYXggKiBjeSAtIGF5ICogY3gpOwogICAgICBpZiAoZCA+PSAtZXBzaWxvbjIkNSkgcmV0dXJuOwoKICAgICAgdmFyIGhhID0gYXggKiBheCArIGF5ICogYXksCiAgICAgICAgICBoYyA9IGN4ICogY3ggKyBjeSAqIGN5LAogICAgICAgICAgeCA9IChjeSAqIGhhIC0gYXkgKiBoYykgLyBkLAogICAgICAgICAgeSA9IChheCAqIGhjIC0gY3ggKiBoYSkgLyBkOwoKICAgICAgdmFyIGNpcmNsZSA9IGNpcmNsZVBvb2wkMS5wb3AoKSB8fCBuZXcgQ2lyY2xlJDE7CiAgICAgIGNpcmNsZS5hcmMgPSBhcmM7CiAgICAgIGNpcmNsZS5zaXRlID0gY1NpdGU7CiAgICAgIGNpcmNsZS54ID0geCArIGJ4OwogICAgICBjaXJjbGUueSA9IChjaXJjbGUuY3kgPSB5ICsgYnkpICsgTWF0aC5zcXJ0KHggKiB4ICsgeSAqIHkpOyAvLyB5IGJvdHRvbQoKICAgICAgYXJjLmNpcmNsZSA9IGNpcmNsZTsKCiAgICAgIHZhciBiZWZvcmUgPSBudWxsLAogICAgICAgICAgbm9kZSA9IGNpcmNsZXMkMS5fOwoKICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBpZiAoY2lyY2xlLnkgPCBub2RlLnkgfHwgKGNpcmNsZS55ID09PSBub2RlLnkgJiYgY2lyY2xlLnggPD0gbm9kZS54KSkgewogICAgICAgICAgaWYgKG5vZGUuTCkgbm9kZSA9IG5vZGUuTDsKICAgICAgICAgIGVsc2UgeyBiZWZvcmUgPSBub2RlLlA7IGJyZWFrOyB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChub2RlLlIpIG5vZGUgPSBub2RlLlI7CiAgICAgICAgICBlbHNlIHsgYmVmb3JlID0gbm9kZTsgYnJlYWs7IH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGNpcmNsZXMkMS5pbnNlcnQoYmVmb3JlLCBjaXJjbGUpOwogICAgICBpZiAoIWJlZm9yZSkgZmlyc3RDaXJjbGUkMSA9IGNpcmNsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZXRhY2hDaXJjbGUkMShhcmMpIHsKICAgICAgdmFyIGNpcmNsZSA9IGFyYy5jaXJjbGU7CiAgICAgIGlmIChjaXJjbGUpIHsKICAgICAgICBpZiAoIWNpcmNsZS5QKSBmaXJzdENpcmNsZSQxID0gY2lyY2xlLk47CiAgICAgICAgY2lyY2xlcyQxLnJlbW92ZShjaXJjbGUpOwogICAgICAgIGNpcmNsZVBvb2wkMS5wdXNoKGNpcmNsZSk7CiAgICAgICAgUmVkQmxhY2tOb2RlJDEoY2lyY2xlKTsKICAgICAgICBhcmMuY2lyY2xlID0gbnVsbDsKICAgICAgfQogICAgfQoKICAgIHZhciBiZWFjaFBvb2wkMSA9IFtdOwoKICAgIGZ1bmN0aW9uIEJlYWNoJDEoKSB7CiAgICAgIFJlZEJsYWNrTm9kZSQxKHRoaXMpOwogICAgICB0aGlzLmVkZ2UgPQogICAgICB0aGlzLnNpdGUgPQogICAgICB0aGlzLmNpcmNsZSA9IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlQmVhY2gkMShzaXRlKSB7CiAgICAgIHZhciBiZWFjaCA9IGJlYWNoUG9vbCQxLnBvcCgpIHx8IG5ldyBCZWFjaCQxOwogICAgICBiZWFjaC5zaXRlID0gc2l0ZTsKICAgICAgcmV0dXJuIGJlYWNoOwogICAgfQoKICAgIGZ1bmN0aW9uIGRldGFjaEJlYWNoJDEoYmVhY2gpIHsKICAgICAgZGV0YWNoQ2lyY2xlJDEoYmVhY2gpOwogICAgICBiZWFjaGVzJDEucmVtb3ZlKGJlYWNoKTsKICAgICAgYmVhY2hQb29sJDEucHVzaChiZWFjaCk7CiAgICAgIFJlZEJsYWNrTm9kZSQxKGJlYWNoKTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVCZWFjaCQxKGJlYWNoKSB7CiAgICAgIHZhciBjaXJjbGUgPSBiZWFjaC5jaXJjbGUsCiAgICAgICAgICB4ID0gY2lyY2xlLngsCiAgICAgICAgICB5ID0gY2lyY2xlLmN5LAogICAgICAgICAgdmVydGV4ID0gW3gsIHldLAogICAgICAgICAgcHJldmlvdXMgPSBiZWFjaC5QLAogICAgICAgICAgbmV4dCA9IGJlYWNoLk4sCiAgICAgICAgICBkaXNhcHBlYXJpbmcgPSBbYmVhY2hdOwoKICAgICAgZGV0YWNoQmVhY2gkMShiZWFjaCk7CgogICAgICB2YXIgbEFyYyA9IHByZXZpb3VzOwogICAgICB3aGlsZSAobEFyYy5jaXJjbGUKICAgICAgICAgICYmIE1hdGguYWJzKHggLSBsQXJjLmNpcmNsZS54KSA8IGVwc2lsb24kYgogICAgICAgICAgJiYgTWF0aC5hYnMoeSAtIGxBcmMuY2lyY2xlLmN5KSA8IGVwc2lsb24kYikgewogICAgICAgIHByZXZpb3VzID0gbEFyYy5QOwogICAgICAgIGRpc2FwcGVhcmluZy51bnNoaWZ0KGxBcmMpOwogICAgICAgIGRldGFjaEJlYWNoJDEobEFyYyk7CiAgICAgICAgbEFyYyA9IHByZXZpb3VzOwogICAgICB9CgogICAgICBkaXNhcHBlYXJpbmcudW5zaGlmdChsQXJjKTsKICAgICAgZGV0YWNoQ2lyY2xlJDEobEFyYyk7CgogICAgICB2YXIgckFyYyA9IG5leHQ7CiAgICAgIHdoaWxlIChyQXJjLmNpcmNsZQogICAgICAgICAgJiYgTWF0aC5hYnMoeCAtIHJBcmMuY2lyY2xlLngpIDwgZXBzaWxvbiRiCiAgICAgICAgICAmJiBNYXRoLmFicyh5IC0gckFyYy5jaXJjbGUuY3kpIDwgZXBzaWxvbiRiKSB7CiAgICAgICAgbmV4dCA9IHJBcmMuTjsKICAgICAgICBkaXNhcHBlYXJpbmcucHVzaChyQXJjKTsKICAgICAgICBkZXRhY2hCZWFjaCQxKHJBcmMpOwogICAgICAgIHJBcmMgPSBuZXh0OwogICAgICB9CgogICAgICBkaXNhcHBlYXJpbmcucHVzaChyQXJjKTsKICAgICAgZGV0YWNoQ2lyY2xlJDEockFyYyk7CgogICAgICB2YXIgbkFyY3MgPSBkaXNhcHBlYXJpbmcubGVuZ3RoLAogICAgICAgICAgaUFyYzsKICAgICAgZm9yIChpQXJjID0gMTsgaUFyYyA8IG5BcmNzOyArK2lBcmMpIHsKICAgICAgICByQXJjID0gZGlzYXBwZWFyaW5nW2lBcmNdOwogICAgICAgIGxBcmMgPSBkaXNhcHBlYXJpbmdbaUFyYyAtIDFdOwogICAgICAgIHNldEVkZ2VFbmQkMShyQXJjLmVkZ2UsIGxBcmMuc2l0ZSwgckFyYy5zaXRlLCB2ZXJ0ZXgpOwogICAgICB9CgogICAgICBsQXJjID0gZGlzYXBwZWFyaW5nWzBdOwogICAgICByQXJjID0gZGlzYXBwZWFyaW5nW25BcmNzIC0gMV07CiAgICAgIHJBcmMuZWRnZSA9IGNyZWF0ZUVkZ2UkMShsQXJjLnNpdGUsIHJBcmMuc2l0ZSwgbnVsbCwgdmVydGV4KTsKCiAgICAgIGF0dGFjaENpcmNsZSQxKGxBcmMpOwogICAgICBhdHRhY2hDaXJjbGUkMShyQXJjKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRCZWFjaCQxKHNpdGUpIHsKICAgICAgdmFyIHggPSBzaXRlWzBdLAogICAgICAgICAgZGlyZWN0cml4ID0gc2l0ZVsxXSwKICAgICAgICAgIGxBcmMsCiAgICAgICAgICByQXJjLAogICAgICAgICAgZHhsLAogICAgICAgICAgZHhyLAogICAgICAgICAgbm9kZSA9IGJlYWNoZXMkMS5fOwoKICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICBkeGwgPSBsZWZ0QnJlYWtQb2ludCQxKG5vZGUsIGRpcmVjdHJpeCkgLSB4OwogICAgICAgIGlmIChkeGwgPiBlcHNpbG9uJGIpIG5vZGUgPSBub2RlLkw7IGVsc2UgewogICAgICAgICAgZHhyID0geCAtIHJpZ2h0QnJlYWtQb2ludCQxKG5vZGUsIGRpcmVjdHJpeCk7CiAgICAgICAgICBpZiAoZHhyID4gZXBzaWxvbiRiKSB7CiAgICAgICAgICAgIGlmICghbm9kZS5SKSB7CiAgICAgICAgICAgICAgbEFyYyA9IG5vZGU7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbm9kZSA9IG5vZGUuUjsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChkeGwgPiAtZXBzaWxvbiRiKSB7CiAgICAgICAgICAgICAgbEFyYyA9IG5vZGUuUDsKICAgICAgICAgICAgICByQXJjID0gbm9kZTsKICAgICAgICAgICAgfSBlbHNlIGlmIChkeHIgPiAtZXBzaWxvbiRiKSB7CiAgICAgICAgICAgICAgbEFyYyA9IG5vZGU7CiAgICAgICAgICAgICAgckFyYyA9IG5vZGUuTjsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBsQXJjID0gckFyYyA9IG5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBjcmVhdGVDZWxsJDEoc2l0ZSk7CiAgICAgIHZhciBuZXdBcmMgPSBjcmVhdGVCZWFjaCQxKHNpdGUpOwogICAgICBiZWFjaGVzJDEuaW5zZXJ0KGxBcmMsIG5ld0FyYyk7CgogICAgICBpZiAoIWxBcmMgJiYgIXJBcmMpIHJldHVybjsKCiAgICAgIGlmIChsQXJjID09PSByQXJjKSB7CiAgICAgICAgZGV0YWNoQ2lyY2xlJDEobEFyYyk7CiAgICAgICAgckFyYyA9IGNyZWF0ZUJlYWNoJDEobEFyYy5zaXRlKTsKICAgICAgICBiZWFjaGVzJDEuaW5zZXJ0KG5ld0FyYywgckFyYyk7CiAgICAgICAgbmV3QXJjLmVkZ2UgPSByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlJDEobEFyYy5zaXRlLCBuZXdBcmMuc2l0ZSk7CiAgICAgICAgYXR0YWNoQ2lyY2xlJDEobEFyYyk7CiAgICAgICAgYXR0YWNoQ2lyY2xlJDEockFyYyk7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoIXJBcmMpIHsgLy8gJiYgbEFyYwogICAgICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZSQxKGxBcmMuc2l0ZSwgbmV3QXJjLnNpdGUpOwogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgLy8gZWxzZSBsQXJjICE9PSByQXJjCiAgICAgIGRldGFjaENpcmNsZSQxKGxBcmMpOwogICAgICBkZXRhY2hDaXJjbGUkMShyQXJjKTsKCiAgICAgIHZhciBsU2l0ZSA9IGxBcmMuc2l0ZSwKICAgICAgICAgIGF4ID0gbFNpdGVbMF0sCiAgICAgICAgICBheSA9IGxTaXRlWzFdLAogICAgICAgICAgYnggPSBzaXRlWzBdIC0gYXgsCiAgICAgICAgICBieSA9IHNpdGVbMV0gLSBheSwKICAgICAgICAgIHJTaXRlID0gckFyYy5zaXRlLAogICAgICAgICAgY3ggPSByU2l0ZVswXSAtIGF4LAogICAgICAgICAgY3kgPSByU2l0ZVsxXSAtIGF5LAogICAgICAgICAgZCA9IDIgKiAoYnggKiBjeSAtIGJ5ICogY3gpLAogICAgICAgICAgaGIgPSBieCAqIGJ4ICsgYnkgKiBieSwKICAgICAgICAgIGhjID0gY3ggKiBjeCArIGN5ICogY3ksCiAgICAgICAgICB2ZXJ0ZXggPSBbKGN5ICogaGIgLSBieSAqIGhjKSAvIGQgKyBheCwgKGJ4ICogaGMgLSBjeCAqIGhiKSAvIGQgKyBheV07CgogICAgICBzZXRFZGdlRW5kJDEockFyYy5lZGdlLCBsU2l0ZSwgclNpdGUsIHZlcnRleCk7CiAgICAgIG5ld0FyYy5lZGdlID0gY3JlYXRlRWRnZSQxKGxTaXRlLCBzaXRlLCBudWxsLCB2ZXJ0ZXgpOwogICAgICByQXJjLmVkZ2UgPSBjcmVhdGVFZGdlJDEoc2l0ZSwgclNpdGUsIG51bGwsIHZlcnRleCk7CiAgICAgIGF0dGFjaENpcmNsZSQxKGxBcmMpOwogICAgICBhdHRhY2hDaXJjbGUkMShyQXJjKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsZWZ0QnJlYWtQb2ludCQxKGFyYywgZGlyZWN0cml4KSB7CiAgICAgIHZhciBzaXRlID0gYXJjLnNpdGUsCiAgICAgICAgICByZm9jeCA9IHNpdGVbMF0sCiAgICAgICAgICByZm9jeSA9IHNpdGVbMV0sCiAgICAgICAgICBwYnkyID0gcmZvY3kgLSBkaXJlY3RyaXg7CgogICAgICBpZiAoIXBieTIpIHJldHVybiByZm9jeDsKCiAgICAgIHZhciBsQXJjID0gYXJjLlA7CiAgICAgIGlmICghbEFyYykgcmV0dXJuIC1JbmZpbml0eTsKCiAgICAgIHNpdGUgPSBsQXJjLnNpdGU7CiAgICAgIHZhciBsZm9jeCA9IHNpdGVbMF0sCiAgICAgICAgICBsZm9jeSA9IHNpdGVbMV0sCiAgICAgICAgICBwbGJ5MiA9IGxmb2N5IC0gZGlyZWN0cml4OwoKICAgICAgaWYgKCFwbGJ5MikgcmV0dXJuIGxmb2N4OwoKICAgICAgdmFyIGhsID0gbGZvY3ggLSByZm9jeCwKICAgICAgICAgIGFieTIgPSAxIC8gcGJ5MiAtIDEgLyBwbGJ5MiwKICAgICAgICAgIGIgPSBobCAvIHBsYnkyOwoKICAgICAgaWYgKGFieTIpIHJldHVybiAoLWIgKyBNYXRoLnNxcnQoYiAqIGIgLSAyICogYWJ5MiAqIChobCAqIGhsIC8gKC0yICogcGxieTIpIC0gbGZvY3kgKyBwbGJ5MiAvIDIgKyByZm9jeSAtIHBieTIgLyAyKSkpIC8gYWJ5MiArIHJmb2N4OwoKICAgICAgcmV0dXJuIChyZm9jeCArIGxmb2N4KSAvIDI7CiAgICB9CgogICAgZnVuY3Rpb24gcmlnaHRCcmVha1BvaW50JDEoYXJjLCBkaXJlY3RyaXgpIHsKICAgICAgdmFyIHJBcmMgPSBhcmMuTjsKICAgICAgaWYgKHJBcmMpIHJldHVybiBsZWZ0QnJlYWtQb2ludCQxKHJBcmMsIGRpcmVjdHJpeCk7CiAgICAgIHZhciBzaXRlID0gYXJjLnNpdGU7CiAgICAgIHJldHVybiBzaXRlWzFdID09PSBkaXJlY3RyaXggPyBzaXRlWzBdIDogSW5maW5pdHk7CiAgICB9CgogICAgdmFyIGVwc2lsb24kYiA9IDFlLTY7CiAgICB2YXIgZXBzaWxvbjIkNSA9IDFlLTEyOwogICAgdmFyIGJlYWNoZXMkMTsKICAgIHZhciBjZWxscyQxOwogICAgdmFyIGNpcmNsZXMkMTsKICAgIHZhciBlZGdlcyQxOwoKICAgIGZ1bmN0aW9uIHRyaWFuZ2xlQXJlYSQxKGEsIGIsIGMpIHsKICAgICAgcmV0dXJuIChhWzBdIC0gY1swXSkgKiAoYlsxXSAtIGFbMV0pIC0gKGFbMF0gLSBiWzBdKSAqIChjWzFdIC0gYVsxXSk7CiAgICB9CgogICAgZnVuY3Rpb24gbGV4aWNvZ3JhcGhpYyQxKGEsIGIpIHsKICAgICAgcmV0dXJuIGJbMV0gLSBhWzFdCiAgICAgICAgICB8fCBiWzBdIC0gYVswXTsKICAgIH0KCiAgICBmdW5jdGlvbiBEaWFncmFtJDEoc2l0ZXMsIGV4dGVudCkgewogICAgICB2YXIgc2l0ZSA9IHNpdGVzLnNvcnQobGV4aWNvZ3JhcGhpYyQxKS5wb3AoKSwKICAgICAgICAgIHgsCiAgICAgICAgICB5LAogICAgICAgICAgY2lyY2xlOwoKICAgICAgZWRnZXMkMSA9IFtdOwogICAgICBjZWxscyQxID0gbmV3IEFycmF5KHNpdGVzLmxlbmd0aCk7CiAgICAgIGJlYWNoZXMkMSA9IG5ldyBSZWRCbGFja1RyZWUkMTsKICAgICAgY2lyY2xlcyQxID0gbmV3IFJlZEJsYWNrVHJlZSQxOwoKICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICBjaXJjbGUgPSBmaXJzdENpcmNsZSQxOwogICAgICAgIGlmIChzaXRlICYmICghY2lyY2xlIHx8IHNpdGVbMV0gPCBjaXJjbGUueSB8fCAoc2l0ZVsxXSA9PT0gY2lyY2xlLnkgJiYgc2l0ZVswXSA8IGNpcmNsZS54KSkpIHsKICAgICAgICAgIGlmIChzaXRlWzBdICE9PSB4IHx8IHNpdGVbMV0gIT09IHkpIHsKICAgICAgICAgICAgYWRkQmVhY2gkMShzaXRlKTsKICAgICAgICAgICAgeCA9IHNpdGVbMF0sIHkgPSBzaXRlWzFdOwogICAgICAgICAgfQogICAgICAgICAgc2l0ZSA9IHNpdGVzLnBvcCgpOwogICAgICAgIH0gZWxzZSBpZiAoY2lyY2xlKSB7CiAgICAgICAgICByZW1vdmVCZWFjaCQxKGNpcmNsZS5hcmMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHNvcnRDZWxsSGFsZmVkZ2VzJDEoKTsKCiAgICAgIGlmIChleHRlbnQpIHsKICAgICAgICB2YXIgeDAgPSArZXh0ZW50WzBdWzBdLAogICAgICAgICAgICB5MCA9ICtleHRlbnRbMF1bMV0sCiAgICAgICAgICAgIHgxID0gK2V4dGVudFsxXVswXSwKICAgICAgICAgICAgeTEgPSArZXh0ZW50WzFdWzFdOwogICAgICAgIGNsaXBFZGdlcyQxKHgwLCB5MCwgeDEsIHkxKTsKICAgICAgICBjbGlwQ2VsbHMkMSh4MCwgeTAsIHgxLCB5MSk7CiAgICAgIH0KCiAgICAgIHRoaXMuZWRnZXMgPSBlZGdlcyQxOwogICAgICB0aGlzLmNlbGxzID0gY2VsbHMkMTsKCiAgICAgIGJlYWNoZXMkMSA9CiAgICAgIGNpcmNsZXMkMSA9CiAgICAgIGVkZ2VzJDEgPQogICAgICBjZWxscyQxID0gbnVsbDsKICAgIH0KCiAgICBEaWFncmFtJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogRGlhZ3JhbSQxLAoKICAgICAgcG9seWdvbnM6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBlZGdlcyA9IHRoaXMuZWRnZXM7CgogICAgICAgIHJldHVybiB0aGlzLmNlbGxzLm1hcChmdW5jdGlvbihjZWxsKSB7CiAgICAgICAgICB2YXIgcG9seWdvbiA9IGNlbGwuaGFsZmVkZ2VzLm1hcChmdW5jdGlvbihpKSB7IHJldHVybiBjZWxsSGFsZmVkZ2VTdGFydCQxKGNlbGwsIGVkZ2VzW2ldKTsgfSk7CiAgICAgICAgICBwb2x5Z29uLmRhdGEgPSBjZWxsLnNpdGUuZGF0YTsKICAgICAgICAgIHJldHVybiBwb2x5Z29uOwogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgdHJpYW5nbGVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdHJpYW5nbGVzID0gW10sCiAgICAgICAgICAgIGVkZ2VzID0gdGhpcy5lZGdlczsKCiAgICAgICAgdGhpcy5jZWxscy5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwsIGkpIHsKICAgICAgICAgIGlmICghKG0gPSAoaGFsZmVkZ2VzID0gY2VsbC5oYWxmZWRnZXMpLmxlbmd0aCkpIHJldHVybjsKICAgICAgICAgIHZhciBzaXRlID0gY2VsbC5zaXRlLAogICAgICAgICAgICAgIGhhbGZlZGdlcywKICAgICAgICAgICAgICBqID0gLTEsCiAgICAgICAgICAgICAgbSwKICAgICAgICAgICAgICBzMCwKICAgICAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1ttIC0gMV1dLAogICAgICAgICAgICAgIHMxID0gZTEubGVmdCA9PT0gc2l0ZSA/IGUxLnJpZ2h0IDogZTEubGVmdDsKCiAgICAgICAgICB3aGlsZSAoKytqIDwgbSkgewogICAgICAgICAgICBzMCA9IHMxOwogICAgICAgICAgICBlMSA9IGVkZ2VzW2hhbGZlZGdlc1tqXV07CiAgICAgICAgICAgIHMxID0gZTEubGVmdCA9PT0gc2l0ZSA/IGUxLnJpZ2h0IDogZTEubGVmdDsKICAgICAgICAgICAgaWYgKHMwICYmIHMxICYmIGkgPCBzMC5pbmRleCAmJiBpIDwgczEuaW5kZXggJiYgdHJpYW5nbGVBcmVhJDEoc2l0ZSwgczAsIHMxKSA8IDApIHsKICAgICAgICAgICAgICB0cmlhbmdsZXMucHVzaChbc2l0ZS5kYXRhLCBzMC5kYXRhLCBzMS5kYXRhXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIHRyaWFuZ2xlczsKICAgICAgfSwKCiAgICAgIGxpbmtzOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5lZGdlcy5maWx0ZXIoZnVuY3Rpb24oZWRnZSkgewogICAgICAgICAgcmV0dXJuIGVkZ2UucmlnaHQ7CiAgICAgICAgfSkubWFwKGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNvdXJjZTogZWRnZS5sZWZ0LmRhdGEsCiAgICAgICAgICAgIHRhcmdldDogZWRnZS5yaWdodC5kYXRhCiAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICB9LAoKICAgICAgZmluZDogZnVuY3Rpb24oeCwgeSwgcmFkaXVzKSB7CiAgICAgICAgdmFyIHRoYXQgPSB0aGlzLCBpMCwgaTEgPSB0aGF0Ll9mb3VuZCB8fCAwLCBuID0gdGhhdC5jZWxscy5sZW5ndGgsIGNlbGw7CgogICAgICAgIC8vIFVzZSB0aGUgcHJldmlvdXNseS1mb3VuZCBjZWxsLCBvciBzdGFydCB3aXRoIGFuIGFyYml0cmFyeSBvbmUuCiAgICAgICAgd2hpbGUgKCEoY2VsbCA9IHRoYXQuY2VsbHNbaTFdKSkgaWYgKCsraTEgPj0gbikgcmV0dXJuIG51bGw7CiAgICAgICAgdmFyIGR4ID0geCAtIGNlbGwuc2l0ZVswXSwgZHkgPSB5IC0gY2VsbC5zaXRlWzFdLCBkMiA9IGR4ICogZHggKyBkeSAqIGR5OwoKICAgICAgICAvLyBUcmF2ZXJzZSB0aGUgaGFsZi1lZGdlcyB0byBmaW5kIGEgY2xvc2VyIGNlbGwsIGlmIGFueS4KICAgICAgICBkbyB7CiAgICAgICAgICBjZWxsID0gdGhhdC5jZWxsc1tpMCA9IGkxXSwgaTEgPSBudWxsOwogICAgICAgICAgY2VsbC5oYWxmZWRnZXMuZm9yRWFjaChmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciBlZGdlID0gdGhhdC5lZGdlc1tlXSwgdiA9IGVkZ2UubGVmdDsKICAgICAgICAgICAgaWYgKCh2ID09PSBjZWxsLnNpdGUgfHwgIXYpICYmICEodiA9IGVkZ2UucmlnaHQpKSByZXR1cm47CiAgICAgICAgICAgIHZhciB2eCA9IHggLSB2WzBdLCB2eSA9IHkgLSB2WzFdLCB2MiA9IHZ4ICogdnggKyB2eSAqIHZ5OwogICAgICAgICAgICBpZiAodjIgPCBkMikgZDIgPSB2MiwgaTEgPSB2LmluZGV4OwogICAgICAgICAgfSk7CiAgICAgICAgfSB3aGlsZSAoaTEgIT09IG51bGwpOwoKICAgICAgICB0aGF0Ll9mb3VuZCA9IGkwOwoKICAgICAgICByZXR1cm4gcmFkaXVzID09IG51bGwgfHwgZDIgPD0gcmFkaXVzICogcmFkaXVzID8gY2VsbC5zaXRlIDogbnVsbDsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiB2b3Jvbm9pJDEoKSB7CiAgICAgIHZhciB4ID0geCQ5LAogICAgICAgICAgeSA9IHkkOSwKICAgICAgICAgIGV4dGVudCA9IG51bGw7CgogICAgICBmdW5jdGlvbiB2b3Jvbm9pKGRhdGEpIHsKICAgICAgICByZXR1cm4gbmV3IERpYWdyYW0kMShkYXRhLm1hcChmdW5jdGlvbihkLCBpKSB7CiAgICAgICAgICB2YXIgcyA9IFtNYXRoLnJvdW5kKHgoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJGIpICogZXBzaWxvbiRiLCBNYXRoLnJvdW5kKHkoZCwgaSwgZGF0YSkgLyBlcHNpbG9uJGIpICogZXBzaWxvbiRiXTsKICAgICAgICAgIHMuaW5kZXggPSBpOwogICAgICAgICAgcy5kYXRhID0gZDsKICAgICAgICAgIHJldHVybiBzOwogICAgICAgIH0pLCBleHRlbnQpOwogICAgICB9CgogICAgICB2b3Jvbm9pLnBvbHlnb25zID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiB2b3Jvbm9pKGRhdGEpLnBvbHlnb25zKCk7CiAgICAgIH07CgogICAgICB2b3Jvbm9pLmxpbmtzID0gZnVuY3Rpb24oZGF0YSkgewogICAgICAgIHJldHVybiB2b3Jvbm9pKGRhdGEpLmxpbmtzKCk7CiAgICAgIH07CgogICAgICB2b3Jvbm9pLnRyaWFuZ2xlcyA9IGZ1bmN0aW9uKGRhdGEpIHsKICAgICAgICByZXR1cm4gdm9yb25vaShkYXRhKS50cmlhbmdsZXMoKTsKICAgICAgfTsKCiAgICAgIHZvcm9ub2kueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkdigrXyksIHZvcm9ub2kpIDogeDsKICAgICAgfTsKCiAgICAgIHZvcm9ub2kueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkdigrXyksIHZvcm9ub2kpIDogeTsKICAgICAgfTsKCiAgICAgIHZvcm9ub2kuZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IF8gPT0gbnVsbCA/IG51bGwgOiBbWytfWzBdWzBdLCArX1swXVsxXV0sIFsrX1sxXVswXSwgK19bMV1bMV1dXSwgdm9yb25vaSkgOiBleHRlbnQgJiYgW1tleHRlbnRbMF1bMF0sIGV4dGVudFswXVsxXV0sIFtleHRlbnRbMV1bMF0sIGV4dGVudFsxXVsxXV1dOwogICAgICB9OwoKICAgICAgdm9yb25vaS5zaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IF8gPT0gbnVsbCA/IG51bGwgOiBbWzAsIDBdLCBbK19bMF0sICtfWzFdXV0sIHZvcm9ub2kpIDogZXh0ZW50ICYmIFtleHRlbnRbMV1bMF0gLSBleHRlbnRbMF1bMF0sIGV4dGVudFsxXVsxXSAtIGV4dGVudFswXVsxXV07CiAgICAgIH07CgogICAgICByZXR1cm4gdm9yb25vaTsKICAgIH0KCiAgICB2YXIgbm9vcCRiID0ge3ZhbHVlOiBmdW5jdGlvbigpIHt9fTsKCiAgICBmdW5jdGlvbiBkaXNwYXRjaCQ2KCkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGgsIF8gPSB7fSwgdDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICghKHQgPSBhcmd1bWVudHNbaV0gKyAiIikgfHwgKHQgaW4gXykgfHwgL1tccy5dLy50ZXN0KHQpKSB0aHJvdyBuZXcgRXJyb3IoImlsbGVnYWwgdHlwZTogIiArIHQpOwogICAgICAgIF9bdF0gPSBbXTsKICAgICAgfQogICAgICByZXR1cm4gbmV3IERpc3BhdGNoJDYoXyk7CiAgICB9CgogICAgZnVuY3Rpb24gRGlzcGF0Y2gkNihfKSB7CiAgICAgIHRoaXMuXyA9IF87CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXMkYih0eXBlbmFtZXMsIHR5cGVzKSB7CiAgICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgaWYgKHQgJiYgIXR5cGVzLmhhc093blByb3BlcnR5KHQpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHQpOwogICAgICAgIHJldHVybiB7dHlwZTogdCwgbmFtZTogbmFtZX07CiAgICAgIH0pOwogICAgfQoKICAgIERpc3BhdGNoJDYucHJvdG90eXBlID0gZGlzcGF0Y2gkNi5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCQ2LAogICAgICBvbjogZnVuY3Rpb24odHlwZW5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgdmFyIF8gPSB0aGlzLl8sCiAgICAgICAgICAgIFQgPSBwYXJzZVR5cGVuYW1lcyRiKHR5cGVuYW1lICsgIiIsIF8pLAogICAgICAgICAgICB0LAogICAgICAgICAgICBpID0gLTEsCiAgICAgICAgICAgIG4gPSBULmxlbmd0aDsKCiAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmV0dXJuIHRoZSBjYWxsYmFjayBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgbmFtZS4KICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSAmJiAodCA9IGdldCRhKF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0JGUoX1t0XSwgdHlwZW5hbWUubmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgZWxzZSBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgZm9yICh0IGluIF8pIF9bdF0gPSBzZXQkZShfW3RdLCB0eXBlbmFtZS5uYW1lLCBudWxsKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICBjb3B5OiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgY29weSA9IHt9LCBfID0gdGhpcy5fOwogICAgICAgIGZvciAodmFyIHQgaW4gXykgY29weVt0XSA9IF9bdF0uc2xpY2UoKTsKICAgICAgICByZXR1cm4gbmV3IERpc3BhdGNoJDYoY29weSk7CiAgICAgIH0sCiAgICAgIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHsKICAgICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9LAogICAgICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykgewogICAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZ2V0JGEodHlwZSwgbmFtZSkgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoLCBjOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKChjID0gdHlwZVtpXSkubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgcmV0dXJuIGMudmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2V0JGUodHlwZSwgbmFtZSwgY2FsbGJhY2spIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICh0eXBlW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHR5cGVbaV0gPSBub29wJGIsIHR5cGUgPSB0eXBlLnNsaWNlKDAsIGkpLmNvbmNhdCh0eXBlLnNsaWNlKGkgKyAxKSk7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHR5cGUucHVzaCh7bmFtZTogbmFtZSwgdmFsdWU6IGNhbGxiYWNrfSk7CiAgICAgIHJldHVybiB0eXBlOwogICAgfQoKICAgIHZhciB4aHRtbCQ1ID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwoKICAgIHZhciBuYW1lc3BhY2VzJDUgPSB7CiAgICAgIHN2ZzogImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwKICAgICAgeGh0bWw6IHhodG1sJDUsCiAgICAgIHhsaW5rOiAiaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsCiAgICAgIHhtbDogImh0dHA6Ly93d3cudzMub3JnL1hNTC8xOTk4L25hbWVzcGFjZSIsCiAgICAgIHhtbG5zOiAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iCiAgICB9OwoKICAgIGZ1bmN0aW9uIG5hbWVzcGFjZSQ1KG5hbWUpIHsKICAgICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gInhtbG5zIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpOwogICAgICByZXR1cm4gbmFtZXNwYWNlcyQ1Lmhhc093blByb3BlcnR5KHByZWZpeCkgPyB7c3BhY2U6IG5hbWVzcGFjZXMkNVtwcmVmaXhdLCBsb2NhbDogbmFtZX0gOiBuYW1lOwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0b3JJbmhlcml0JDUobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LAogICAgICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgICByZXR1cm4gdXJpID09PSB4aHRtbCQ1ICYmIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5uYW1lc3BhY2VVUkkgPT09IHhodG1sJDUKICAgICAgICAgICAgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KG5hbWUpCiAgICAgICAgICAgIDogZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKHVyaSwgbmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvckZpeGVkJDUoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvciQ1KG5hbWUpIHsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlJDUobmFtZSk7CiAgICAgIHJldHVybiAoZnVsbG5hbWUubG9jYWwKICAgICAgICAgID8gY3JlYXRvckZpeGVkJDUKICAgICAgICAgIDogY3JlYXRvckluaGVyaXQkNSkoZnVsbG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vbmUkOSgpIHt9CgogICAgZnVuY3Rpb24gc2VsZWN0b3IkNShzZWxlY3RvcikgewogICAgICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUkOSA6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zZWxlY3QkNShzZWxlY3QpIHsKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yJDUoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ4KHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gZW1wdHkkNygpIHsKICAgICAgcmV0dXJuIFtdOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdG9yQWxsJDUoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHNlbGVjdG9yID09IG51bGwgPyBlbXB0eSQ3IDogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NlbGVjdEFsbCQ1KHNlbGVjdCkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwkNShzZWxlY3QpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gW10sIHBhcmVudHMgPSBbXSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgc3ViZ3JvdXBzLnB1c2goc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKTsKICAgICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kOChzdWJncm91cHMsIHBhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hdGNoZXIkNihzZWxlY3RvcikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2ZpbHRlciQ1KG1hdGNoKSB7CiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gbWF0Y2hlciQ2KG1hdGNoKTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBbXSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiBtYXRjaC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkgewogICAgICAgICAgICBzdWJncm91cC5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kOChzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwYXJzZSQ1KHVwZGF0ZSkgewogICAgICByZXR1cm4gbmV3IEFycmF5KHVwZGF0ZS5sZW5ndGgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9lbnRlciQ1KCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ4KHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlJDUpLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBFbnRlck5vZGUkNShwYXJlbnQsIGRhdHVtKSB7CiAgICAgIHRoaXMub3duZXJEb2N1bWVudCA9IHBhcmVudC5vd25lckRvY3VtZW50OwogICAgICB0aGlzLm5hbWVzcGFjZVVSSSA9IHBhcmVudC5uYW1lc3BhY2VVUkk7CiAgICAgIHRoaXMuX25leHQgPSBudWxsOwogICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgIHRoaXMuX19kYXRhX18gPSBkYXR1bTsKICAgIH0KCiAgICBFbnRlck5vZGUkNS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUkNSwKICAgICAgYXBwZW5kQ2hpbGQ6IGZ1bmN0aW9uKGNoaWxkKSB7IHJldHVybiB0aGlzLl9wYXJlbnQuaW5zZXJ0QmVmb3JlKGNoaWxkLCB0aGlzLl9uZXh0KTsgfSwKICAgICAgaW5zZXJ0QmVmb3JlOiBmdW5jdGlvbihjaGlsZCwgbmV4dCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgbmV4dCk7IH0sCiAgICAgIHF1ZXJ5U2VsZWN0b3I6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7IH0sCiAgICAgIHF1ZXJ5U2VsZWN0b3JBbGw6IGZ1bmN0aW9uKHNlbGVjdG9yKSB7IHJldHVybiB0aGlzLl9wYXJlbnQucXVlcnlTZWxlY3RvckFsbChzZWxlY3Rvcik7IH0KICAgIH07CgogICAgZnVuY3Rpb24gY29uc3RhbnQkdyh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIga2V5UHJlZml4JDcgPSAiJCI7IC8vIFByb3RlY3QgYWdhaW5zdCBrZXlzIGxpa2Ug4oCcX19wcm90b19f4oCdLgoKICAgIGZ1bmN0aW9uIGJpbmRJbmRleCQ1KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgICAgdmFyIGkgPSAwLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS4KICAgICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAgIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci4KICAgICAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZSQ1KHBhcmVudCwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBQdXQgYW55IG5vbi1udWxsIG5vZGVzIHRoYXQgZG9u4oCZdCBmaXQgaW50byBleGl0LgogICAgICBmb3IgKDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBiaW5kS2V5JDUocGFyZW50LCBncm91cCwgZW50ZXIsIHVwZGF0ZSwgZXhpdCwgZGF0YSwga2V5KSB7CiAgICAgIHZhciBpLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIG5vZGVCeUtleVZhbHVlID0ge30sCiAgICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwKICAgICAgICAgIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aCwKICAgICAgICAgIGtleVZhbHVlcyA9IG5ldyBBcnJheShncm91cExlbmd0aCksCiAgICAgICAgICBrZXlWYWx1ZTsKCiAgICAgIC8vIENvbXB1dGUgdGhlIGtleSBmb3IgZWFjaCBub2RlLgogICAgICAvLyBJZiBtdWx0aXBsZSBub2RlcyBoYXZlIHRoZSBzYW1lIGtleSwgdGhlIGR1cGxpY2F0ZXMgYXJlIGFkZGVkIHRvIGV4aXQuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAga2V5VmFsdWVzW2ldID0ga2V5VmFsdWUgPSBrZXlQcmVmaXgkNyArIGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsKICAgICAgICAgIGlmIChrZXlWYWx1ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uCiAgICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci4KICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICAgIGtleVZhbHVlID0ga2V5UHJlZml4JDcgKyBrZXkuY2FsbChwYXJlbnQsIGRhdGFbaV0sIGksIGRhdGEpOwogICAgICAgIGlmIChub2RlID0gbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdKSB7CiAgICAgICAgICB1cGRhdGVbaV0gPSBub2RlOwogICAgICAgICAgbm9kZS5fX2RhdGFfXyA9IGRhdGFbaV07CiAgICAgICAgICBub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZV0gPSBudWxsOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlbnRlcltpXSA9IG5ldyBFbnRlck5vZGUkNShwYXJlbnQsIGRhdGFbaV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gQWRkIGFueSByZW1haW5pbmcgbm9kZXMgdGhhdCB3ZXJlIG5vdCBib3VuZCB0byBkYXRhIHRvIGV4aXQuCiAgICAgIGZvciAoaSA9IDA7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChub2RlQnlLZXlWYWx1ZVtrZXlWYWx1ZXNbaV1dID09PSBub2RlKSkgewogICAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2RhdGEkNSh2YWx1ZSwga2V5KSB7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICBkYXRhID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaiA9IC0xOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9CgogICAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkkNSA6IGJpbmRJbmRleCQ1LAogICAgICAgICAgcGFyZW50cyA9IHRoaXMuX3BhcmVudHMsCiAgICAgICAgICBncm91cHMgPSB0aGlzLl9ncm91cHM7CgogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB2YWx1ZSA9IGNvbnN0YW50JHcodmFsdWUpOwoKICAgICAgZm9yICh2YXIgbSA9IGdyb3Vwcy5sZW5ndGgsIHVwZGF0ZSA9IG5ldyBBcnJheShtKSwgZW50ZXIgPSBuZXcgQXJyYXkobSksIGV4aXQgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IHBhcmVudHNbal0sCiAgICAgICAgICAgIGdyb3VwID0gZ3JvdXBzW2pdLAogICAgICAgICAgICBncm91cExlbmd0aCA9IGdyb3VwLmxlbmd0aCwKICAgICAgICAgICAgZGF0YSA9IHZhbHVlLmNhbGwocGFyZW50LCBwYXJlbnQgJiYgcGFyZW50Ll9fZGF0YV9fLCBqLCBwYXJlbnRzKSwKICAgICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAgICBlbnRlckdyb3VwID0gZW50ZXJbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksCiAgICAgICAgICAgIHVwZGF0ZUdyb3VwID0gdXBkYXRlW2pdID0gbmV3IEFycmF5KGRhdGFMZW5ndGgpLAogICAgICAgICAgICBleGl0R3JvdXAgPSBleGl0W2pdID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKTsKCiAgICAgICAgYmluZChwYXJlbnQsIGdyb3VwLCBlbnRlckdyb3VwLCB1cGRhdGVHcm91cCwgZXhpdEdyb3VwLCBkYXRhLCBrZXkpOwoKICAgICAgICAvLyBOb3cgY29ubmVjdCB0aGUgZW50ZXIgbm9kZXMgdG8gdGhlaXIgZm9sbG93aW5nIHVwZGF0ZSBub2RlLCBzdWNoIHRoYXQKICAgICAgICAvLyBhcHBlbmRDaGlsZCBjYW4gaW5zZXJ0IHRoZSBtYXRlcmlhbGl6ZWQgZW50ZXIgbm9kZSBiZWZvcmUgdGhpcyBub2RlLAogICAgICAgIC8vIHJhdGhlciB0aGFuIGF0IHRoZSBlbmQgb2YgdGhlIHBhcmVudCBub2RlLgogICAgICAgIGZvciAodmFyIGkwID0gMCwgaTEgPSAwLCBwcmV2aW91cywgbmV4dDsgaTAgPCBkYXRhTGVuZ3RoOyArK2kwKSB7CiAgICAgICAgICBpZiAocHJldmlvdXMgPSBlbnRlckdyb3VwW2kwXSkgewogICAgICAgICAgICBpZiAoaTAgPj0gaTEpIGkxID0gaTAgKyAxOwogICAgICAgICAgICB3aGlsZSAoIShuZXh0ID0gdXBkYXRlR3JvdXBbaTFdKSAmJiArK2kxIDwgZGF0YUxlbmd0aCk7CiAgICAgICAgICAgIHByZXZpb3VzLl9uZXh0ID0gbmV4dCB8fCBudWxsOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgdXBkYXRlID0gbmV3IFNlbGVjdGlvbiQ4KHVwZGF0ZSwgcGFyZW50cyk7CiAgICAgIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjsKICAgICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgICAgcmV0dXJuIHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCQ1KCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ4KHRoaXMuX2V4aXQgfHwgdGhpcy5fZ3JvdXBzLm1hcChzcGFyc2UkNSksIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luJDQob25lbnRlciwgb251cGRhdGUsIG9uZXhpdCkgewogICAgICB2YXIgZW50ZXIgPSB0aGlzLmVudGVyKCksIHVwZGF0ZSA9IHRoaXMsIGV4aXQgPSB0aGlzLmV4aXQoKTsKICAgICAgZW50ZXIgPSB0eXBlb2Ygb25lbnRlciA9PT0gImZ1bmN0aW9uIiA/IG9uZW50ZXIoZW50ZXIpIDogZW50ZXIuYXBwZW5kKG9uZW50ZXIgKyAiIik7CiAgICAgIGlmIChvbnVwZGF0ZSAhPSBudWxsKSB1cGRhdGUgPSBvbnVwZGF0ZSh1cGRhdGUpOwogICAgICBpZiAob25leGl0ID09IG51bGwpIGV4aXQucmVtb3ZlKCk7IGVsc2Ugb25leGl0KGV4aXQpOwogICAgICByZXR1cm4gZW50ZXIgJiYgdXBkYXRlID8gZW50ZXIubWVyZ2UodXBkYXRlKS5vcmRlcigpIDogdXBkYXRlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9tZXJnZSQ1KHNlbGVjdGlvbikgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHNlbGVjdGlvbi5fZ3JvdXBzLCBtMCA9IGdyb3VwczAubGVuZ3RoLCBtMSA9IGdyb3VwczEubGVuZ3RoLCBtID0gTWF0aC5taW4obTAsIG0xKSwgbWVyZ2VzID0gbmV3IEFycmF5KG0wKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cDAgPSBncm91cHMwW2pdLCBncm91cDEgPSBncm91cHMxW2pdLCBuID0gZ3JvdXAwLmxlbmd0aCwgbWVyZ2UgPSBtZXJnZXNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwMFtpXSB8fCBncm91cDFbaV0pIHsKICAgICAgICAgICAgbWVyZ2VbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZm9yICg7IGogPCBtMDsgKytqKSB7CiAgICAgICAgbWVyZ2VzW2pdID0gZ3JvdXBzMFtqXTsKICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24kOChtZXJnZXMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlciQ1KCkgewoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBqID0gLTEsIG0gPSBncm91cHMubGVuZ3RoOyArK2ogPCBtOykgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gZ3JvdXAubGVuZ3RoIC0gMSwgbmV4dCA9IGdyb3VwW2ldLCBub2RlOyAtLWkgPj0gMDspIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgaWYgKG5leHQgJiYgbm9kZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihuZXh0KSBeIDQpIG5leHQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobm9kZSwgbmV4dCk7CiAgICAgICAgICAgIG5leHQgPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3NvcnQkNShjb21wYXJlKSB7CiAgICAgIGlmICghY29tcGFyZSkgY29tcGFyZSA9IGFzY2VuZGluZyRkOwoKICAgICAgZnVuY3Rpb24gY29tcGFyZU5vZGUoYSwgYikgewogICAgICAgIHJldHVybiBhICYmIGIgPyBjb21wYXJlKGEuX19kYXRhX18sIGIuX19kYXRhX18pIDogIWEgLSAhYjsKICAgICAgfQoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc29ydGdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc29ydGdyb3VwID0gc29ydGdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgc29ydGdyb3VwW2ldID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc29ydGdyb3VwLnNvcnQoY29tcGFyZU5vZGUpOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQ4KHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nJGQoYSwgYikgewogICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2NhbGwkNSgpIHsKICAgICAgdmFyIGNhbGxiYWNrID0gYXJndW1lbnRzWzBdOwogICAgICBhcmd1bWVudHNbMF0gPSB0aGlzOwogICAgICBjYWxsYmFjay5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbm9kZXMkNSgpIHsKICAgICAgdmFyIG5vZGVzID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaSA9IC0xOwogICAgICB0aGlzLmVhY2goZnVuY3Rpb24oKSB7IG5vZGVzWysraV0gPSB0aGlzOyB9KTsKICAgICAgcmV0dXJuIG5vZGVzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9ub2RlJDUoKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zaXplJDUoKSB7CiAgICAgIHZhciBzaXplID0gMDsKICAgICAgdGhpcy5lYWNoKGZ1bmN0aW9uKCkgeyArK3NpemU7IH0pOwogICAgICByZXR1cm4gc2l6ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZW1wdHkkNSgpIHsKICAgICAgcmV0dXJuICF0aGlzLm5vZGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZWFjaCQ1KGNhbGxiYWNrKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlJDgobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDgoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQkOChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TJDgoZnVsbG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbiQ4KG5hbWUsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgZWxzZSB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCB2KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQ4KGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0ciQ1KG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQ1KG5hbWUpOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIG5vZGUgPSB0aGlzLm5vZGUoKTsKICAgICAgICByZXR1cm4gZnVsbG5hbWUubG9jYWwKICAgICAgICAgICAgPyBub2RlLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCkKICAgICAgICAgICAgOiBub2RlLmdldEF0dHJpYnV0ZShmdWxsbmFtZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHZhbHVlID09IG51bGwKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0clJlbW92ZU5TJDggOiBhdHRyUmVtb3ZlJDgpIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyQ4IDogYXR0ckZ1bmN0aW9uJDgpCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDggOiBhdHRyQ29uc3RhbnQkOCkpKShmdWxsbmFtZSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0VmlldyQ1KG5vZGUpIHsKICAgICAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZQogICAgICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVSZW1vdmUkOChuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQkOChuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdmFsdWUsIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUZ1bmN0aW9uJDgobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZSQ1KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEKICAgICAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgICA/IHN0eWxlUmVtb3ZlJDggOiB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICAgID8gc3R5bGVGdW5jdGlvbiQ4CiAgICAgICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQkOCkobmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSkKICAgICAgICAgIDogc3R5bGVWYWx1ZSQ1KHRoaXMubm9kZSgpLCBuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVZhbHVlJDUobm9kZSwgbmFtZSkgewogICAgICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpCiAgICAgICAgICB8fCBkZWZhdWx0VmlldyQ1KG5vZGUpLmdldENvbXB1dGVkU3R5bGUobm9kZSwgbnVsbCkuZ2V0UHJvcGVydHlWYWx1ZShuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwcm9wZXJ0eVJlbW92ZSQ1KG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGRlbGV0ZSB0aGlzW25hbWVdOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5Q29uc3RhbnQkNShuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24kNShuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIGRlbGV0ZSB0aGlzW25hbWVdOwogICAgICAgIGVsc2UgdGhpc1tuYW1lXSA9IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3Byb3BlcnR5JDUobmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgID8gcHJvcGVydHlSZW1vdmUkNSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvbiQ1CiAgICAgICAgICAgICAgOiBwcm9wZXJ0eUNvbnN0YW50JDUpKG5hbWUsIHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKClbbmFtZV07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NBcnJheSQ1KHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0xpc3QkNShub2RlKSB7CiAgICAgIHJldHVybiBub2RlLmNsYXNzTGlzdCB8fCBuZXcgQ2xhc3NMaXN0JDUobm9kZSk7CiAgICB9CgogICAgZnVuY3Rpb24gQ2xhc3NMaXN0JDUobm9kZSkgewogICAgICB0aGlzLl9ub2RlID0gbm9kZTsKICAgICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5JDUobm9kZS5nZXRBdHRyaWJ1dGUoImNsYXNzIikgfHwgIiIpOwogICAgfQoKICAgIENsYXNzTGlzdCQ1LnByb3RvdHlwZSA9IHsKICAgICAgYWRkOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgdmFyIGkgPSB0aGlzLl9uYW1lcy5pbmRleE9mKG5hbWUpOwogICAgICAgIGlmIChpIDwgMCkgewogICAgICAgICAgdGhpcy5fbmFtZXMucHVzaChuYW1lKTsKICAgICAgICAgIHRoaXMuX25vZGUuc2V0QXR0cmlidXRlKCJjbGFzcyIsIHRoaXMuX25hbWVzLmpvaW4oIiAiKSk7CiAgICAgICAgfQogICAgICB9LAogICAgICByZW1vdmU6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGkgPj0gMCkgewogICAgICAgICAgdGhpcy5fbmFtZXMuc3BsaWNlKGksIDEpOwogICAgICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIGNvbnRhaW5zOiBmdW5jdGlvbihuYW1lKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSkgPj0gMDsKICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjbGFzc2VkQWRkJDUobm9kZSwgbmFtZXMpIHsKICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3QkNShub2RlKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICB3aGlsZSAoKytpIDwgbikgbGlzdC5hZGQobmFtZXNbaV0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRSZW1vdmUkNShub2RlLCBuYW1lcykgewogICAgICB2YXIgbGlzdCA9IGNsYXNzTGlzdCQ1KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZFRydWUkNShuYW1lcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xhc3NlZEFkZCQ1KHRoaXMsIG5hbWVzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkRmFsc2UkNShuYW1lcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xhc3NlZFJlbW92ZSQ1KHRoaXMsIG5hbWVzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkRnVuY3Rpb24kNShuYW1lcywgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgICh2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpID8gY2xhc3NlZEFkZCQ1IDogY2xhc3NlZFJlbW92ZSQ1KSh0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2NsYXNzZWQkNShuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgbmFtZXMgPSBjbGFzc0FycmF5JDUobmFtZSArICIiKTsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0JDUodGhpcy5ub2RlKCkpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghbGlzdC5jb250YWlucyhuYW1lc1tpXSkpIHJldHVybiBmYWxzZTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGNsYXNzZWRGdW5jdGlvbiQ1IDogdmFsdWUKICAgICAgICAgID8gY2xhc3NlZFRydWUkNQogICAgICAgICAgOiBjbGFzc2VkRmFsc2UkNSkobmFtZXMsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dFJlbW92ZSQ1KCkgewogICAgICB0aGlzLnRleHRDb250ZW50ID0gIiI7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dENvbnN0YW50JDgodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24kOCh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3RleHQkNSh2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2godmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgID8gdGV4dFJlbW92ZSQ1IDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gdGV4dEZ1bmN0aW9uJDgKICAgICAgICAgICAgICA6IHRleHRDb25zdGFudCQ4KSh2YWx1ZSkpCiAgICAgICAgICA6IHRoaXMubm9kZSgpLnRleHRDb250ZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIGh0bWxSZW1vdmUkNSgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sQ29uc3RhbnQkNSh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5pbm5lckhUTUwgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sRnVuY3Rpb24kNSh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIHRoaXMuaW5uZXJIVE1MID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9odG1sJDUodmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IGh0bWxSZW1vdmUkNSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IGh0bWxGdW5jdGlvbiQ1CiAgICAgICAgICAgICAgOiBodG1sQ29uc3RhbnQkNSkodmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7CiAgICB9CgogICAgZnVuY3Rpb24gcmFpc2UkNigpIHsKICAgICAgaWYgKHRoaXMubmV4dFNpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5hcHBlbmRDaGlsZCh0aGlzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fcmFpc2UkNSgpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChyYWlzZSQ2KTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb3dlciQ1KCkgewogICAgICBpZiAodGhpcy5wcmV2aW91c1NpYmxpbmcpIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUodGhpcywgdGhpcy5wYXJlbnROb2RlLmZpcnN0Q2hpbGQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9sb3dlciQ1KCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKGxvd2VyJDUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQkNShuYW1lKSB7CiAgICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yJDUobmFtZSk7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5hcHBlbmRDaGlsZChjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50TnVsbCQ1KCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faW5zZXJ0JDUobmFtZSwgYmVmb3JlKSB7CiAgICAgIHZhciBjcmVhdGUgPSB0eXBlb2YgbmFtZSA9PT0gImZ1bmN0aW9uIiA/IG5hbWUgOiBjcmVhdG9yJDUobmFtZSksCiAgICAgICAgICBzZWxlY3QgPSBiZWZvcmUgPT0gbnVsbCA/IGNvbnN0YW50TnVsbCQ1IDogdHlwZW9mIGJlZm9yZSA9PT0gImZ1bmN0aW9uIiA/IGJlZm9yZSA6IHNlbGVjdG9yJDUoYmVmb3JlKTsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmluc2VydEJlZm9yZShjcmVhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgc2VsZWN0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgbnVsbCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZSQ1KCkgewogICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICBpZiAocGFyZW50KSBwYXJlbnQucmVtb3ZlQ2hpbGQodGhpcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3JlbW92ZSQ1KCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKHJlbW92ZSQ1KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93JDUoKSB7CiAgICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwJDUoKSB7CiAgICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKHRydWUpLCBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuaW5zZXJ0QmVmb3JlKGNsb25lLCB0aGlzLm5leHRTaWJsaW5nKSA6IGNsb25lOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZSQ1KGRlZXApIHsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGRlZXAgPyBzZWxlY3Rpb25fY2xvbmVEZWVwJDUgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93JDUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kYXR1bSQ1KHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMucHJvcGVydHkoIl9fZGF0YV9fIiwgdmFsdWUpCiAgICAgICAgICA6IHRoaXMubm9kZSgpLl9fZGF0YV9fOwogICAgfQoKICAgIHZhciBmaWx0ZXJFdmVudHMkNSA9IHt9OwoKICAgIHZhciBldmVudCQ0ID0gbnVsbDsKCiAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAidW5kZWZpbmVkIikgewogICAgICB2YXIgZWxlbWVudCQ2ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OwogICAgICBpZiAoISgib25tb3VzZWVudGVyIiBpbiBlbGVtZW50JDYpKSB7CiAgICAgICAgZmlsdGVyRXZlbnRzJDUgPSB7bW91c2VlbnRlcjogIm1vdXNlb3ZlciIsIG1vdXNlbGVhdmU6ICJtb3VzZW91dCJ9OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyQ29udGV4dExpc3RlbmVyJDUobGlzdGVuZXIsIGluZGV4LCBncm91cCkgewogICAgICBsaXN0ZW5lciA9IGNvbnRleHRMaXN0ZW5lciQ1KGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApOwogICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CiAgICAgICAgaWYgKCFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0aGlzICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSAmIDgpKSkgewogICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lciQ1KGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGV2ZW50MSkgewogICAgICAgIHZhciBldmVudDAgPSBldmVudCQ0OyAvLyBFdmVudHMgY2FuIGJlIHJlZW50cmFudCAoZS5nLiwgZm9jdXMpLgogICAgICAgIGV2ZW50JDQgPSBldmVudDE7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgZXZlbnQkNCA9IGV2ZW50MDsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VUeXBlbmFtZXMkYyh0eXBlbmFtZXMpIHsKICAgICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICByZXR1cm4ge3R5cGU6IHQsIG5hbWU6IG5hbWV9OwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBvblJlbW92ZSQ1KHR5cGVuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgb24gPSB0aGlzLl9fb247CiAgICAgICAgaWYgKCFvbikgcmV0dXJuOwogICAgICAgIGZvciAodmFyIGogPSAwLCBpID0gLTEsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICAgIGlmIChvID0gb25bal0sICghdHlwZW5hbWUudHlwZSB8fCBvLnR5cGUgPT09IHR5cGVuYW1lLnR5cGUpICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgb25bKytpXSA9IG87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICgrK2kpIG9uLmxlbmd0aCA9IGk7CiAgICAgICAgZWxzZSBkZWxldGUgdGhpcy5fX29uOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIG9uQWRkJDUodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7CiAgICAgIHZhciB3cmFwID0gZmlsdGVyRXZlbnRzJDUuaGFzT3duUHJvcGVydHkodHlwZW5hbWUudHlwZSkgPyBmaWx0ZXJDb250ZXh0TGlzdGVuZXIkNSA6IGNvbnRleHRMaXN0ZW5lciQ1OwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsKICAgICAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApOwogICAgICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8uY2FwdHVyZSA9IGNhcHR1cmUpOwogICAgICAgICAgICBvLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTsKICAgICAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBjYXB0dXJlOiBjYXB0dXJlfTsKICAgICAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107CiAgICAgICAgZWxzZSBvbi5wdXNoKG8pOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vbiQ1KHR5cGVuYW1lLCB2YWx1ZSwgY2FwdHVyZSkgewogICAgICB2YXIgdHlwZW5hbWVzID0gcGFyc2VUeXBlbmFtZXMkYyh0eXBlbmFtZSArICIiKSwgaSwgbiA9IHR5cGVuYW1lcy5sZW5ndGgsIHQ7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgb24gPSB0aGlzLm5vZGUoKS5fX29uOwogICAgICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGgsIG87IGogPCBtOyArK2opIHsKICAgICAgICAgIGZvciAoaSA9IDAsIG8gPSBvbltqXTsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAoKHQgPSB0eXBlbmFtZXNbaV0pLnR5cGUgPT09IG8udHlwZSAmJiB0Lm5hbWUgPT09IG8ubmFtZSkgewogICAgICAgICAgICAgIHJldHVybiBvLnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybjsKICAgICAgfQoKICAgICAgb24gPSB2YWx1ZSA/IG9uQWRkJDUgOiBvblJlbW92ZSQ1OwogICAgICBpZiAoY2FwdHVyZSA9PSBudWxsKSBjYXB0dXJlID0gZmFsc2U7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBjYXB0dXJlKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1c3RvbUV2ZW50JDQoZXZlbnQxLCBsaXN0ZW5lciwgdGhhdCwgYXJncykgewogICAgICB2YXIgZXZlbnQwID0gZXZlbnQkNDsKICAgICAgZXZlbnQxLnNvdXJjZUV2ZW50ID0gZXZlbnQkNDsKICAgICAgZXZlbnQkNCA9IGV2ZW50MTsKICAgICAgdHJ5IHsKICAgICAgICByZXR1cm4gbGlzdGVuZXIuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgZXZlbnQkNCA9IGV2ZW50MDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoRXZlbnQkNShub2RlLCB0eXBlLCBwYXJhbXMpIHsKICAgICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3JDUobm9kZSksCiAgICAgICAgICBldmVudCA9IHdpbmRvdy5DdXN0b21FdmVudDsKCiAgICAgIGlmICh0eXBlb2YgZXZlbnQgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgICBldmVudCA9IG5ldyBldmVudCh0eXBlLCBwYXJhbXMpOwogICAgICB9IGVsc2UgewogICAgICAgIGV2ZW50ID0gd2luZG93LmRvY3VtZW50LmNyZWF0ZUV2ZW50KCJFdmVudCIpOwogICAgICAgIGlmIChwYXJhbXMpIGV2ZW50LmluaXRFdmVudCh0eXBlLCBwYXJhbXMuYnViYmxlcywgcGFyYW1zLmNhbmNlbGFibGUpLCBldmVudC5kZXRhaWwgPSBwYXJhbXMuZGV0YWlsOwogICAgICAgIGVsc2UgZXZlbnQuaW5pdEV2ZW50KHR5cGUsIGZhbHNlLCBmYWxzZSk7CiAgICAgIH0KCiAgICAgIG5vZGUuZGlzcGF0Y2hFdmVudChldmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hDb25zdGFudCQ1KHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoRXZlbnQkNSh0aGlzLCB0eXBlLCBwYXJhbXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24kNSh0eXBlLCBwYXJhbXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBkaXNwYXRjaEV2ZW50JDUodGhpcywgdHlwZSwgcGFyYW1zLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9kaXNwYXRjaCQ1KHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGRpc3BhdGNoRnVuY3Rpb24kNQogICAgICAgICAgOiBkaXNwYXRjaENvbnN0YW50JDUpKHR5cGUsIHBhcmFtcykpOwogICAgfQoKICAgIHZhciByb290JDggPSBbbnVsbF07CgogICAgZnVuY3Rpb24gU2VsZWN0aW9uJDgoZ3JvdXBzLCBwYXJlbnRzKSB7CiAgICAgIHRoaXMuX2dyb3VwcyA9IGdyb3VwczsKICAgICAgdGhpcy5fcGFyZW50cyA9IHBhcmVudHM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uJDUoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDgoW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCQ4KTsKICAgIH0KCiAgICBTZWxlY3Rpb24kOC5wcm90b3R5cGUgPSBzZWxlY3Rpb24kNS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24kOCwKICAgICAgc2VsZWN0OiBzZWxlY3Rpb25fc2VsZWN0JDUsCiAgICAgIHNlbGVjdEFsbDogc2VsZWN0aW9uX3NlbGVjdEFsbCQ1LAogICAgICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIkNSwKICAgICAgZGF0YTogc2VsZWN0aW9uX2RhdGEkNSwKICAgICAgZW50ZXI6IHNlbGVjdGlvbl9lbnRlciQ1LAogICAgICBleGl0OiBzZWxlY3Rpb25fZXhpdCQ1LAogICAgICBqb2luOiBzZWxlY3Rpb25fam9pbiQ0LAogICAgICBtZXJnZTogc2VsZWN0aW9uX21lcmdlJDUsCiAgICAgIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIkNSwKICAgICAgc29ydDogc2VsZWN0aW9uX3NvcnQkNSwKICAgICAgY2FsbDogc2VsZWN0aW9uX2NhbGwkNSwKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcyQ1LAogICAgICBub2RlOiBzZWxlY3Rpb25fbm9kZSQ1LAogICAgICBzaXplOiBzZWxlY3Rpb25fc2l6ZSQ1LAogICAgICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5JDUsCiAgICAgIGVhY2g6IHNlbGVjdGlvbl9lYWNoJDUsCiAgICAgIGF0dHI6IHNlbGVjdGlvbl9hdHRyJDUsCiAgICAgIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUkNSwKICAgICAgcHJvcGVydHk6IHNlbGVjdGlvbl9wcm9wZXJ0eSQ1LAogICAgICBjbGFzc2VkOiBzZWxlY3Rpb25fY2xhc3NlZCQ1LAogICAgICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCQ1LAogICAgICBodG1sOiBzZWxlY3Rpb25faHRtbCQ1LAogICAgICByYWlzZTogc2VsZWN0aW9uX3JhaXNlJDUsCiAgICAgIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIkNSwKICAgICAgYXBwZW5kOiBzZWxlY3Rpb25fYXBwZW5kJDUsCiAgICAgIGluc2VydDogc2VsZWN0aW9uX2luc2VydCQ1LAogICAgICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUkNSwKICAgICAgY2xvbmU6IHNlbGVjdGlvbl9jbG9uZSQ1LAogICAgICBkYXR1bTogc2VsZWN0aW9uX2RhdHVtJDUsCiAgICAgIG9uOiBzZWxlY3Rpb25fb24kNSwKICAgICAgZGlzcGF0Y2g6IHNlbGVjdGlvbl9kaXNwYXRjaCQ1CiAgICB9OwoKICAgIGZ1bmN0aW9uIHNlbGVjdCQ0KHNlbGVjdG9yKSB7CiAgICAgIHJldHVybiB0eXBlb2Ygc2VsZWN0b3IgPT09ICJzdHJpbmciCiAgICAgICAgICA/IG5ldyBTZWxlY3Rpb24kOChbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQogICAgICAgICAgOiBuZXcgU2VsZWN0aW9uJDgoW1tzZWxlY3Rvcl1dLCByb290JDgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNvdXJjZUV2ZW50JDQoKSB7CiAgICAgIHZhciBjdXJyZW50ID0gZXZlbnQkNCwgc291cmNlOwogICAgICB3aGlsZSAoc291cmNlID0gY3VycmVudC5zb3VyY2VFdmVudCkgY3VycmVudCA9IHNvdXJjZTsKICAgICAgcmV0dXJuIGN1cnJlbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnQkZShub2RlLCBldmVudCkgewogICAgICB2YXIgc3ZnID0gbm9kZS5vd25lclNWR0VsZW1lbnQgfHwgbm9kZTsKCiAgICAgIGlmIChzdmcuY3JlYXRlU1ZHUG9pbnQpIHsKICAgICAgICB2YXIgcG9pbnQgPSBzdmcuY3JlYXRlU1ZHUG9pbnQoKTsKICAgICAgICBwb2ludC54ID0gZXZlbnQuY2xpZW50WCwgcG9pbnQueSA9IGV2ZW50LmNsaWVudFk7CiAgICAgICAgcG9pbnQgPSBwb2ludC5tYXRyaXhUcmFuc2Zvcm0obm9kZS5nZXRTY3JlZW5DVE0oKS5pbnZlcnNlKCkpOwogICAgICAgIHJldHVybiBbcG9pbnQueCwgcG9pbnQueV07CiAgICAgIH0KCiAgICAgIHZhciByZWN0ID0gbm9kZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgcmV0dXJuIFtldmVudC5jbGllbnRYIC0gcmVjdC5sZWZ0IC0gbm9kZS5jbGllbnRMZWZ0LCBldmVudC5jbGllbnRZIC0gcmVjdC50b3AgLSBub2RlLmNsaWVudFRvcF07CiAgICB9CgogICAgZnVuY3Rpb24gbW91c2UkNChub2RlKSB7CiAgICAgIHZhciBldmVudCA9IHNvdXJjZUV2ZW50JDQoKTsKICAgICAgaWYgKGV2ZW50LmNoYW5nZWRUb3VjaGVzKSBldmVudCA9IGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdOwogICAgICByZXR1cm4gcG9pbnQkZShub2RlLCBldmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gdG91Y2gkMyhub2RlLCB0b3VjaGVzLCBpZGVudGlmaWVyKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgaWRlbnRpZmllciA9IHRvdWNoZXMsIHRvdWNoZXMgPSBzb3VyY2VFdmVudCQ0KCkuY2hhbmdlZFRvdWNoZXM7CgogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHRvdWNoZXMgPyB0b3VjaGVzLmxlbmd0aCA6IDAsIHRvdWNoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCh0b3VjaCA9IHRvdWNoZXNbaV0pLmlkZW50aWZpZXIgPT09IGlkZW50aWZpZXIpIHsKICAgICAgICAgIHJldHVybiBwb2ludCRlKG5vZGUsIHRvdWNoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vZXZlbnQkNigpIHsKICAgICAgZXZlbnQkNC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICBldmVudCQ0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRyYWdEaXNhYmxlJDIodmlldykgewogICAgICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0JDQodmlldykub24oImRyYWdzdGFydC5kcmFnIiwgbm9ldmVudCQ2LCB0cnVlKTsKICAgICAgaWYgKCJvbnNlbGVjdHN0YXJ0IiBpbiByb290KSB7CiAgICAgICAgc2VsZWN0aW9uLm9uKCJzZWxlY3RzdGFydC5kcmFnIiwgbm9ldmVudCQ2LCB0cnVlKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByb290Ll9fbm9zZWxlY3QgPSByb290LnN0eWxlLk1velVzZXJTZWxlY3Q7CiAgICAgICAgcm9vdC5zdHlsZS5Nb3pVc2VyU2VsZWN0ID0gIm5vbmUiOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24geWVzZHJhZyQzKHZpZXcsIG5vY2xpY2spIHsKICAgICAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCQ0KHZpZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG51bGwpOwogICAgICBpZiAobm9jbGljaykgewogICAgICAgIHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG5vZXZlbnQkNiwgdHJ1ZSk7CiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpIHsgc2VsZWN0aW9uLm9uKCJjbGljay5kcmFnIiwgbnVsbCk7IH0sIDApOwogICAgICB9CiAgICAgIGlmICgib25zZWxlY3RzdGFydCIgaW4gcm9vdCkgewogICAgICAgIHNlbGVjdGlvbi5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG51bGwpOwogICAgICB9IGVsc2UgewogICAgICAgIHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdCA9IHJvb3QuX19ub3NlbGVjdDsKICAgICAgICBkZWxldGUgcm9vdC5fX25vc2VsZWN0OwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGVmaW5lJDYoY29uc3RydWN0b3IsIGZhY3RvcnksIHByb3RvdHlwZSkgewogICAgICBjb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBmYWN0b3J5LnByb3RvdHlwZSA9IHByb3RvdHlwZTsKICAgICAgcHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY29uc3RydWN0b3I7CiAgICB9CgogICAgZnVuY3Rpb24gZXh0ZW5kJDYocGFyZW50LCBkZWZpbml0aW9uKSB7CiAgICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07CiAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICB9CgogICAgZnVuY3Rpb24gQ29sb3IkNigpIHt9CgogICAgdmFyIGRhcmtlciQ2ID0gMC43OwogICAgdmFyIGJyaWdodGVyJDYgPSAxIC8gZGFya2VyJDY7CgogICAgdmFyIHJlSSQ2ID0gIlxccyooWystXT9cXGQrKVxccyoiLAogICAgICAgIHJlTiQ2ID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsCiAgICAgICAgcmVQJDYgPSAiXFxzKihbKy1dP1xcZCpcXC4/XFxkKyg/OltlRV1bKy1dP1xcZCspPyklXFxzKiIsCiAgICAgICAgcmVIZXgkNSA9IC9eIyhbMC05YS1mXXszLDh9KSQvLAogICAgICAgIHJlUmdiSW50ZWdlciQ2ID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVJJDYsIHJlSSQ2LCByZUkkNl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiUGVyY2VudCQ2ID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVQJDYsIHJlUCQ2LCByZVAkNl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiYUludGVnZXIkNiA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZUkkNiwgcmVJJDYsIHJlSSQ2LCByZU4kNl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiYVBlcmNlbnQkNiA9IG5ldyBSZWdFeHAoIl5yZ2JhXFwoIiArIFtyZVAkNiwgcmVQJDYsIHJlUCQ2LCByZU4kNl0gKyAiXFwpJCIpLAogICAgICAgIHJlSHNsUGVyY2VudCQ2ID0gbmV3IFJlZ0V4cCgiXmhzbFxcKCIgKyBbcmVOJDYsIHJlUCQ2LCByZVAkNl0gKyAiXFwpJCIpLAogICAgICAgIHJlSHNsYVBlcmNlbnQkNiA9IG5ldyBSZWdFeHAoIl5oc2xhXFwoIiArIFtyZU4kNiwgcmVQJDYsIHJlUCQ2LCByZU4kNl0gKyAiXFwpJCIpOwoKICAgIHZhciBuYW1lZCQ2ID0gewogICAgICBhbGljZWJsdWU6IDB4ZjBmOGZmLAogICAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgICBhcXVhOiAweDAwZmZmZiwKICAgICAgYXF1YW1hcmluZTogMHg3ZmZmZDQsCiAgICAgIGF6dXJlOiAweGYwZmZmZiwKICAgICAgYmVpZ2U6IDB4ZjVmNWRjLAogICAgICBiaXNxdWU6IDB4ZmZlNGM0LAogICAgICBibGFjazogMHgwMDAwMDAsCiAgICAgIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCwKICAgICAgYmx1ZTogMHgwMDAwZmYsCiAgICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgICBicm93bjogMHhhNTJhMmEsCiAgICAgIGJ1cmx5d29vZDogMHhkZWI4ODcsCiAgICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICAgIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLAogICAgICBjaG9jb2xhdGU6IDB4ZDI2OTFlLAogICAgICBjb3JhbDogMHhmZjdmNTAsCiAgICAgIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCwKICAgICAgY29ybnNpbGs6IDB4ZmZmOGRjLAogICAgICBjcmltc29uOiAweGRjMTQzYywKICAgICAgY3lhbjogMHgwMGZmZmYsCiAgICAgIGRhcmtibHVlOiAweDAwMDA4YiwKICAgICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYiwKICAgICAgZGFya2dyYXk6IDB4YTlhOWE5LAogICAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgICBkYXJrZ3JleTogMHhhOWE5YTksCiAgICAgIGRhcmtraGFraTogMHhiZGI3NmIsCiAgICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgICAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLAogICAgICBkYXJrb3JhbmdlOiAweGZmOGMwMCwKICAgICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICAgIGRhcmtyZWQ6IDB4OGIwMDAwLAogICAgICBkYXJrc2FsbW9uOiAweGU5OTY3YSwKICAgICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgICAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsCiAgICAgIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLAogICAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgICAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsCiAgICAgIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLAogICAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICAgIGRlZXBza3libHVlOiAweDAwYmZmZiwKICAgICAgZGltZ3JheTogMHg2OTY5NjksCiAgICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgICBkb2RnZXJibHVlOiAweDFlOTBmZiwKICAgICAgZmlyZWJyaWNrOiAweGIyMjIyMiwKICAgICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsCiAgICAgIGZ1Y2hzaWE6IDB4ZmYwMGZmLAogICAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgICBnaG9zdHdoaXRlOiAweGY4ZjhmZiwKICAgICAgZ29sZDogMHhmZmQ3MDAsCiAgICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICAgIGdyYXk6IDB4ODA4MDgwLAogICAgICBncmVlbjogMHgwMDgwMDAsCiAgICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgICAgZ3JleTogMHg4MDgwODAsCiAgICAgIGhvbmV5ZGV3OiAweGYwZmZmMCwKICAgICAgaG90cGluazogMHhmZjY5YjQsCiAgICAgIGluZGlhbnJlZDogMHhjZDVjNWMsCiAgICAgIGluZGlnbzogMHg0YjAwODIsCiAgICAgIGl2b3J5OiAweGZmZmZmMCwKICAgICAga2hha2k6IDB4ZjBlNjhjLAogICAgICBsYXZlbmRlcjogMHhlNmU2ZmEsCiAgICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgICBsYXduZ3JlZW46IDB4N2NmYzAwLAogICAgICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLAogICAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgICBsaWdodGNvcmFsOiAweGYwODA4MCwKICAgICAgbGlnaHRjeWFuOiAweGUwZmZmZiwKICAgICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgICBsaWdodGdyYXk6IDB4ZDNkM2QzLAogICAgICBsaWdodGdyZWVuOiAweDkwZWU5MCwKICAgICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgICAgbGlnaHRwaW5rOiAweGZmYjZjMSwKICAgICAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLAogICAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgICAgbGlnaHRza3libHVlOiAweDg3Y2VmYSwKICAgICAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LAogICAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICAgIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSwKICAgICAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLAogICAgICBsaW1lOiAweDAwZmYwMCwKICAgICAgbGltZWdyZWVuOiAweDMyY2QzMiwKICAgICAgbGluZW46IDB4ZmFmMGU2LAogICAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgICAgbWFyb29uOiAweDgwMDAwMCwKICAgICAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsCiAgICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLAogICAgICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLAogICAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICAgIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsCiAgICAgIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwKICAgICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgICAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSwKICAgICAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwKICAgICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgICAgbWlzdHlyb3NlOiAweGZmZTRlMSwKICAgICAgbW9jY2FzaW46IDB4ZmZlNGI1LAogICAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICAgIG5hdnk6IDB4MDAwMDgwLAogICAgICBvbGRsYWNlOiAweGZkZjVlNiwKICAgICAgb2xpdmU6IDB4ODA4MDAwLAogICAgICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLAogICAgICBvcmFuZ2U6IDB4ZmZhNTAwLAogICAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgICBvcmNoaWQ6IDB4ZGE3MGQ2LAogICAgICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwKICAgICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgICAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsCiAgICAgIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLAogICAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgICAgcGVhY2hwdWZmOiAweGZmZGFiOSwKICAgICAgcGVydTogMHhjZDg1M2YsCiAgICAgIHBpbms6IDB4ZmZjMGNiLAogICAgICBwbHVtOiAweGRkYTBkZCwKICAgICAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsCiAgICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICAgIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LAogICAgICByZWQ6IDB4ZmYwMDAwLAogICAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgICByb3lhbGJsdWU6IDB4NDE2OWUxLAogICAgICBzYWRkbGVicm93bjogMHg4YjQ1MTMsCiAgICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICAgIHNhbmR5YnJvd246IDB4ZjRhNDYwLAogICAgICBzZWFncmVlbjogMHgyZThiNTcsCiAgICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgICAgc2llbm5hOiAweGEwNTIyZCwKICAgICAgc2lsdmVyOiAweGMwYzBjMCwKICAgICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICAgIHNsYXRlYmx1ZTogMHg2YTVhY2QsCiAgICAgIHNsYXRlZ3JheTogMHg3MDgwOTAsCiAgICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICAgIHNub3c6IDB4ZmZmYWZhLAogICAgICBzcHJpbmdncmVlbjogMHgwMGZmN2YsCiAgICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICAgIHRhbjogMHhkMmI0OGMsCiAgICAgIHRlYWw6IDB4MDA4MDgwLAogICAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgICAgdG9tYXRvOiAweGZmNjM0NywKICAgICAgdHVycXVvaXNlOiAweDQwZTBkMCwKICAgICAgdmlvbGV0OiAweGVlODJlZSwKICAgICAgd2hlYXQ6IDB4ZjVkZWIzLAogICAgICB3aGl0ZTogMHhmZmZmZmYsCiAgICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgICB5ZWxsb3c6IDB4ZmZmZjAwLAogICAgICB5ZWxsb3dncmVlbjogMHg5YWNkMzIKICAgIH07CgogICAgZGVmaW5lJDYoQ29sb3IkNiwgY29sb3IkNiwgewogICAgICBjb3B5OiBmdW5jdGlvbihjaGFubmVscykgewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7CiAgICAgIH0sCiAgICAgIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpOwogICAgICB9LAogICAgICBoZXg6IGNvbG9yX2Zvcm1hdEhleCQ1LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LgogICAgICBmb3JtYXRIZXg6IGNvbG9yX2Zvcm1hdEhleCQ1LAogICAgICBmb3JtYXRIc2w6IGNvbG9yX2Zvcm1hdEhzbCQ1LAogICAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiQ1LAogICAgICB0b1N0cmluZzogY29sb3JfZm9ybWF0UmdiJDUKICAgIH0pOwoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdEhleCQ1KCkgewogICAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2wkNSgpIHsKICAgICAgcmV0dXJuIGhzbENvbnZlcnQkNih0aGlzKS5mb3JtYXRIc2woKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRSZ2IkNSgpIHsKICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3IkNihmb3JtYXQpIHsKICAgICAgdmFyIG0sIGw7CiAgICAgIGZvcm1hdCA9IChmb3JtYXQgKyAiIikudHJpbSgpLnRvTG93ZXJDYXNlKCk7CiAgICAgIHJldHVybiAobSA9IHJlSGV4JDUuZXhlYyhmb3JtYXQpKSA/IChsID0gbVsxXS5sZW5ndGgsIG0gPSBwYXJzZUludChtWzFdLCAxNiksIGwgPT09IDYgPyByZ2JuJDYobSkgLy8gI2ZmMDAwMAogICAgICAgICAgOiBsID09PSAzID8gbmV3IFJnYiQ2KChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgobSAmIDB4ZikgPDwgNCkgfCAobSAmIDB4ZiksIDEpIC8vICNmMDAKICAgICAgICAgIDogbCA9PT0gOCA/IHJnYmEkNihtID4+IDI0ICYgMHhmZiwgbSA+PiAxNiAmIDB4ZmYsIG0gPj4gOCAmIDB4ZmYsIChtICYgMHhmZikgLyAweGZmKSAvLyAjZmYwMDAwMDAKICAgICAgICAgIDogbCA9PT0gNCA/IHJnYmEkNigobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwCiAgICAgICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4CiAgICAgICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyJDYuZXhlYyhmb3JtYXQpKSA/IG5ldyBSZ2IkNihtWzFdLCBtWzJdLCBtWzNdLCAxKSAvLyByZ2IoMjU1LCAwLCAwKQogICAgICAgICAgOiAobSA9IHJlUmdiUGVyY2VudCQ2LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiJDYobVsxXSAqIDI1NSAvIDEwMCwgbVsyXSAqIDI1NSAvIDEwMCwgbVszXSAqIDI1NSAvIDEwMCwgMSkgLy8gcmdiKDEwMCUsIDAlLCAwJSkKICAgICAgICAgIDogKG0gPSByZVJnYmFJbnRlZ2VyJDYuZXhlYyhmb3JtYXQpKSA/IHJnYmEkNihtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSkKICAgICAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50JDYuZXhlYyhmb3JtYXQpKSA/IHJnYmEkNihtWzFdICogMjU1IC8gMTAwLCBtWzJdICogMjU1IC8gMTAwLCBtWzNdICogMjU1IC8gMTAwLCBtWzRdKSAvLyByZ2IoMTAwJSwgMCUsIDAlLCAxKQogICAgICAgICAgOiAobSA9IHJlSHNsUGVyY2VudCQ2LmV4ZWMoZm9ybWF0KSkgPyBoc2xhJDYobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgMSkgLy8gaHNsKDEyMCwgNTAlLCA1MCUpCiAgICAgICAgICA6IChtID0gcmVIc2xhUGVyY2VudCQ2LmV4ZWMoZm9ybWF0KSkgPyBoc2xhJDYobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKQogICAgICAgICAgOiBuYW1lZCQ2Lmhhc093blByb3BlcnR5KGZvcm1hdCkgPyByZ2JuJDYobmFtZWQkNltmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucwogICAgICAgICAgOiBmb3JtYXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiJDYoTmFOLCBOYU4sIE5hTiwgMCkKICAgICAgICAgIDogbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2JuJDYobikgewogICAgICByZXR1cm4gbmV3IFJnYiQ2KG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiYSQ2KHIsIGcsIGIsIGEpIHsKICAgICAgaWYgKGEgPD0gMCkgciA9IGcgPSBiID0gTmFOOwogICAgICByZXR1cm4gbmV3IFJnYiQ2KHIsIGcsIGIsIGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHJnYkNvbnZlcnQkNihvKSB7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvciQ2KSkgbyA9IGNvbG9yJDYobyk7CiAgICAgIGlmICghbykgcmV0dXJuIG5ldyBSZ2IkNjsKICAgICAgbyA9IG8ucmdiKCk7CiAgICAgIHJldHVybiBuZXcgUmdiJDYoby5yLCBvLmcsIG8uYiwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZ2IkOChyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gcmdiQ29udmVydCQ2KHIpIDogbmV3IFJnYiQ2KHIsIGcsIGIsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBSZ2IkNihyLCBnLCBiLCBvcGFjaXR5KSB7CiAgICAgIHRoaXMuciA9ICtyOwogICAgICB0aGlzLmcgPSArZzsKICAgICAgdGhpcy5iID0gK2I7CiAgICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogICAgfQoKICAgIGRlZmluZSQ2KFJnYiQ2LCByZ2IkOCwgZXh0ZW5kJDYoQ29sb3IkNiwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciQ2IDogTWF0aC5wb3coYnJpZ2h0ZXIkNiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkNih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICBkYXJrZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gZGFya2VyJDYgOiBNYXRoLnBvdyhkYXJrZXIkNiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IkNih0aGlzLnIgKiBrLCB0aGlzLmcgKiBrLCB0aGlzLmIgKiBrLCB0aGlzLm9wYWNpdHkpOwogICAgICB9LAogICAgICByZ2I6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgtMC41IDw9IHRoaXMuciAmJiB0aGlzLnIgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5nICYmIHRoaXMuZyA8IDI1NS41KQogICAgICAgICAgICAmJiAoLTAuNSA8PSB0aGlzLmIgJiYgdGhpcy5iIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7CiAgICAgIH0sCiAgICAgIGhleDogcmdiX2Zvcm1hdEhleCQ1LCAvLyBEZXByZWNhdGVkISBVc2UgY29sb3IuZm9ybWF0SGV4LgogICAgICBmb3JtYXRIZXg6IHJnYl9mb3JtYXRIZXgkNSwKICAgICAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiJDUsCiAgICAgIHRvU3RyaW5nOiByZ2JfZm9ybWF0UmdiJDUKICAgIH0pKTsKCiAgICBmdW5jdGlvbiByZ2JfZm9ybWF0SGV4JDUoKSB7CiAgICAgIHJldHVybiAiIyIgKyBoZXgkNSh0aGlzLnIpICsgaGV4JDUodGhpcy5nKSArIGhleCQ1KHRoaXMuYik7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYiQ1KCkgewogICAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsKICAgICAgcmV0dXJuIChhID09PSAxID8gInJnYigiIDogInJnYmEoIikKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMucikgfHwgMCkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5nKSB8fCAwKSkgKyAiLCAiCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLmIpIHx8IDApKQogICAgICAgICAgKyAoYSA9PT0gMSA/ICIpIiA6ICIsICIgKyBhICsgIikiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoZXgkNSh2YWx1ZSkgewogICAgICB2YWx1ZSA9IE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh2YWx1ZSkgfHwgMCkpOwogICAgICByZXR1cm4gKHZhbHVlIDwgMTYgPyAiMCIgOiAiIikgKyB2YWx1ZS50b1N0cmluZygxNik7CiAgICB9CgogICAgZnVuY3Rpb24gaHNsYSQ2KGgsIHMsIGwsIGEpIHsKICAgICAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOOwogICAgICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjsKICAgICAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOOwogICAgICByZXR1cm4gbmV3IEhzbCQ2KGgsIHMsIGwsIGEpOwogICAgfQoKICAgIGZ1bmN0aW9uIGhzbENvbnZlcnQkNihvKSB7CiAgICAgIGlmIChvIGluc3RhbmNlb2YgSHNsJDYpIHJldHVybiBuZXcgSHNsJDYoby5oLCBvLnMsIG8ubCwgby5vcGFjaXR5KTsKICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIENvbG9yJDYpKSBvID0gY29sb3IkNihvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbCQ2OwogICAgICBpZiAobyBpbnN0YW5jZW9mIEhzbCQ2KSByZXR1cm4gbzsKICAgICAgbyA9IG8ucmdiKCk7CiAgICAgIHZhciByID0gby5yIC8gMjU1LAogICAgICAgICAgZyA9IG8uZyAvIDI1NSwKICAgICAgICAgIGIgPSBvLmIgLyAyNTUsCiAgICAgICAgICBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKSwKICAgICAgICAgIG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLAogICAgICAgICAgaCA9IE5hTiwKICAgICAgICAgIHMgPSBtYXggLSBtaW4sCiAgICAgICAgICBsID0gKG1heCArIG1pbikgLyAyOwogICAgICBpZiAocykgewogICAgICAgIGlmIChyID09PSBtYXgpIGggPSAoZyAtIGIpIC8gcyArIChnIDwgYikgKiA2OwogICAgICAgIGVsc2UgaWYgKGcgPT09IG1heCkgaCA9IChiIC0gcikgLyBzICsgMjsKICAgICAgICBlbHNlIGggPSAociAtIGcpIC8gcyArIDQ7CiAgICAgICAgcyAvPSBsIDwgMC41ID8gbWF4ICsgbWluIDogMiAtIG1heCAtIG1pbjsKICAgICAgICBoICo9IDYwOwogICAgICB9IGVsc2UgewogICAgICAgIHMgPSBsID4gMCAmJiBsIDwgMSA/IDAgOiBoOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgSHNsJDYoaCwgcywgbCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2wkYShoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID09PSAxID8gaHNsQ29udmVydCQ2KGgpIDogbmV3IEhzbCQ2KGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBIc2wkNihoLCBzLCBsLCBvcGFjaXR5KSB7CiAgICAgIHRoaXMuaCA9ICtoOwogICAgICB0aGlzLnMgPSArczsKICAgICAgdGhpcy5sID0gK2w7CiAgICAgIHRoaXMub3BhY2l0eSA9ICtvcGFjaXR5OwogICAgfQoKICAgIGRlZmluZSQ2KEhzbCQ2LCBoc2wkYSwgZXh0ZW5kJDYoQ29sb3IkNiwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciQ2IDogTWF0aC5wb3coYnJpZ2h0ZXIkNiwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBIc2wkNih0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciQ2IDogTWF0aC5wb3coZGFya2VyJDYsIGspOwogICAgICAgIHJldHVybiBuZXcgSHNsJDYodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIHJnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsCiAgICAgICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICAgICAgbCA9IHRoaXMubCwKICAgICAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcywKICAgICAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICAgIHJldHVybiBuZXcgUmdiJDYoCiAgICAgICAgICBoc2wycmdiJDYoaCA+PSAyNDAgPyBoIC0gMjQwIDogaCArIDEyMCwgbTEsIG0yKSwKICAgICAgICAgIGhzbDJyZ2IkNihoLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYiQ2KGggPCAxMjAgPyBoICsgMjQwIDogaCAtIDEyMCwgbTEsIG0yKSwKICAgICAgICAgIHRoaXMub3BhY2l0eQogICAgICAgICk7CiAgICAgIH0sCiAgICAgIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gKDAgPD0gdGhpcy5zICYmIHRoaXMucyA8PSAxIHx8IGlzTmFOKHRoaXMucykpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMubCAmJiB0aGlzLmwgPD0gMSkKICAgICAgICAgICAgJiYgKDAgPD0gdGhpcy5vcGFjaXR5ICYmIHRoaXMub3BhY2l0eSA8PSAxKTsKICAgICAgfSwKICAgICAgZm9ybWF0SHNsOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYSA9IHRoaXMub3BhY2l0eTsgYSA9IGlzTmFOKGEpID8gMSA6IE1hdGgubWF4KDAsIE1hdGgubWluKDEsIGEpKTsKICAgICAgICByZXR1cm4gKGEgPT09IDEgPyAiaHNsKCIgOiAiaHNsYSgiKQogICAgICAgICAgICArICh0aGlzLmggfHwgMCkgKyAiLCAiCiAgICAgICAgICAgICsgKHRoaXMucyB8fCAwKSAqIDEwMCArICIlLCAiCiAgICAgICAgICAgICsgKHRoaXMubCB8fCAwKSAqIDEwMCArICIlIgogICAgICAgICAgICArIChhID09PSAxID8gIikiIDogIiwgIiArIGEgKyAiKSIpOwogICAgICB9CiAgICB9KSk7CgogICAgLyogRnJvbSBGdkQgMTMuMzcsIENTUyBDb2xvciBNb2R1bGUgTGV2ZWwgMyAqLwogICAgZnVuY3Rpb24gaHNsMnJnYiQ2KGgsIG0xLCBtMikgewogICAgICByZXR1cm4gKGggPCA2MCA/IG0xICsgKG0yIC0gbTEpICogaCAvIDYwCiAgICAgICAgICA6IGggPCAxODAgPyBtMgogICAgICAgICAgOiBoIDwgMjQwID8gbTEgKyAobTIgLSBtMSkgKiAoMjQwIC0gaCkgLyA2MAogICAgICAgICAgOiBtMSkgKiAyNTU7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnQkeCh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lYXIkOShhLCBkKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGEgKyB0ICogZDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBleHBvbmVudGlhbCQ3KGEsIGIsIHkpIHsKICAgICAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZ2FtbWEkNSh5KSB7CiAgICAgIHJldHVybiAoeSA9ICt5KSA9PT0gMSA/IG5vZ2FtbWEkNSA6IGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICByZXR1cm4gYiAtIGEgPyBleHBvbmVudGlhbCQ3KGEsIGIsIHkpIDogY29uc3RhbnQkeChpc05hTihhKSA/IGIgOiBhKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2dhbW1hJDUoYSwgYikgewogICAgICB2YXIgZCA9IGIgLSBhOwogICAgICByZXR1cm4gZCA/IGxpbmVhciQ5KGEsIGQpIDogY29uc3RhbnQkeChpc05hTihhKSA/IGIgOiBhKTsKICAgIH0KCiAgICB2YXIgaW50ZXJwb2xhdGVSZ2IkMyA9IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7CiAgICAgIHZhciBjb2xvciA9IGdhbW1hJDUoeSk7CgogICAgICBmdW5jdGlvbiByZ2Ioc3RhcnQsIGVuZCkgewogICAgICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gcmdiJDgoc3RhcnQpKS5yLCAoZW5kID0gcmdiJDgoZW5kKSkuciksCiAgICAgICAgICAgIGcgPSBjb2xvcihzdGFydC5nLCBlbmQuZyksCiAgICAgICAgICAgIGIgPSBjb2xvcihzdGFydC5iLCBlbmQuYiksCiAgICAgICAgICAgIG9wYWNpdHkgPSBub2dhbW1hJDUoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICBzdGFydC5yID0gcih0KTsKICAgICAgICAgIHN0YXJ0LmcgPSBnKHQpOwogICAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJnYi5nYW1tYSA9IHJnYkdhbW1hOwoKICAgICAgcmV0dXJuIHJnYjsKICAgIH0pKDEpOwoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyJDMoYSwgYikgewogICAgICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gYSAqICgxIC0gdCkgKyBiICogdDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgcmVBJDUgPSAvWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csCiAgICAgICAgcmVCJDUgPSBuZXcgUmVnRXhwKHJlQSQ1LnNvdXJjZSwgImciKTsKCiAgICBmdW5jdGlvbiB6ZXJvJDUoYikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb25lJDUoYikgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHJldHVybiBiKHQpICsgIiI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVTdHJpbmckMyhhLCBiKSB7CiAgICAgIHZhciBiaSA9IHJlQSQ1Lmxhc3RJbmRleCA9IHJlQiQ1Lmxhc3RJbmRleCA9IDAsIC8vIHNjYW4gaW5kZXggZm9yIG5leHQgbnVtYmVyIGluIGIKICAgICAgICAgIGFtLCAvLyBjdXJyZW50IG1hdGNoIGluIGEKICAgICAgICAgIGJtLCAvLyBjdXJyZW50IG1hdGNoIGluIGIKICAgICAgICAgIGJzLCAvLyBzdHJpbmcgcHJlY2VkaW5nIGN1cnJlbnQgbnVtYmVyIGluIGIsIGlmIGFueQogICAgICAgICAgaSA9IC0xLCAvLyBpbmRleCBpbiBzCiAgICAgICAgICBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgICAgcSA9IFtdOyAvLyBudW1iZXIgaW50ZXJwb2xhdG9ycwoKICAgICAgLy8gQ29lcmNlIGlucHV0cyB0byBzdHJpbmdzLgogICAgICBhID0gYSArICIiLCBiID0gYiArICIiOwoKICAgICAgLy8gSW50ZXJwb2xhdGUgcGFpcnMgb2YgbnVtYmVycyBpbiBhICYgYi4KICAgICAgd2hpbGUgKChhbSA9IHJlQSQ1LmV4ZWMoYSkpCiAgICAgICAgICAmJiAoYm0gPSByZUIkNS5leGVjKGIpKSkgewogICAgICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAgICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7CiAgICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgICAgfQogICAgICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoCiAgICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICAgICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgICAgIHNbKytpXSA9IG51bGw7CiAgICAgICAgICBxLnB1c2goe2k6IGksIHg6IGludGVycG9sYXRlTnVtYmVyJDMoYW0sIGJtKX0pOwogICAgICAgIH0KICAgICAgICBiaSA9IHJlQiQ1Lmxhc3RJbmRleDsKICAgICAgfQoKICAgICAgLy8gQWRkIHJlbWFpbnMgb2YgYi4KICAgICAgaWYgKGJpIDwgYi5sZW5ndGgpIHsKICAgICAgICBicyA9IGIuc2xpY2UoYmkpOwogICAgICAgIGlmIChzW2ldKSBzW2ldICs9IGJzOyAvLyBjb2FsZXNjZSB3aXRoIHByZXZpb3VzIHN0cmluZwogICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgIH0KCiAgICAgIC8vIFNwZWNpYWwgb3B0aW1pemF0aW9uIGZvciBvbmx5IGEgc2luZ2xlIG1hdGNoLgogICAgICAvLyBPdGhlcndpc2UsIGludGVycG9sYXRlIGVhY2ggb2YgdGhlIG51bWJlcnMgYW5kIHJlam9pbiB0aGUgc3RyaW5nLgogICAgICByZXR1cm4gcy5sZW5ndGggPCAyID8gKHFbMF0KICAgICAgICAgID8gb25lJDUocVswXS54KQogICAgICAgICAgOiB6ZXJvJDUoYikpCiAgICAgICAgICA6IChiID0gcS5sZW5ndGgsIGZ1bmN0aW9uKHQpIHsKICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbzsgaSA8IGI7ICsraSkgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICAgICAgICB9KTsKICAgIH0KCiAgICB2YXIgZGVncmVlcyQ2ID0gMTgwIC8gTWF0aC5QSTsKCiAgICB2YXIgaWRlbnRpdHkkbCA9IHsKICAgICAgdHJhbnNsYXRlWDogMCwKICAgICAgdHJhbnNsYXRlWTogMCwKICAgICAgcm90YXRlOiAwLAogICAgICBza2V3WDogMCwKICAgICAgc2NhbGVYOiAxLAogICAgICBzY2FsZVk6IDEKICAgIH07CgogICAgZnVuY3Rpb24gZGVjb21wb3NlJDQoYSwgYiwgYywgZCwgZSwgZikgewogICAgICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYOwogICAgICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgICAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7CiAgICAgIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHJhbnNsYXRlWDogZSwKICAgICAgICB0cmFuc2xhdGVZOiBmLAogICAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMkNiwKICAgICAgICBza2V3WDogTWF0aC5hdGFuKHNrZXdYKSAqIGRlZ3JlZXMkNiwKICAgICAgICBzY2FsZVg6IHNjYWxlWCwKICAgICAgICBzY2FsZVk6IHNjYWxlWQogICAgICB9OwogICAgfQoKICAgIHZhciBjc3NOb2RlJDQsCiAgICAgICAgY3NzUm9vdCQ0LAogICAgICAgIGNzc1ZpZXckNCwKICAgICAgICBzdmdOb2RlJDQ7CgogICAgZnVuY3Rpb24gcGFyc2VDc3MkNSh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT09ICJub25lIikgcmV0dXJuIGlkZW50aXR5JGw7CiAgICAgIGlmICghY3NzTm9kZSQ0KSBjc3NOb2RlJDQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCQ0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCBjc3NWaWV3JDQgPSBkb2N1bWVudC5kZWZhdWx0VmlldzsKICAgICAgY3NzTm9kZSQ0LnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IGNzc1ZpZXckNC5nZXRDb21wdXRlZFN0eWxlKGNzc1Jvb3QkNC5hcHBlbmRDaGlsZChjc3NOb2RlJDQpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsKICAgICAgY3NzUm9vdCQ0LnJlbW92ZUNoaWxkKGNzc05vZGUkNCk7CiAgICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoNywgLTEpLnNwbGl0KCIsIik7CiAgICAgIHJldHVybiBkZWNvbXBvc2UkNCgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVN2ZyQ0KHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gaWRlbnRpdHkkbDsKICAgICAgaWYgKCFzdmdOb2RlJDQpIHN2Z05vZGUkNCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgICBzdmdOb2RlJDQuc2V0QXR0cmlidXRlKCJ0cmFuc2Zvcm0iLCB2YWx1ZSk7CiAgICAgIGlmICghKHZhbHVlID0gc3ZnTm9kZSQ0LnRyYW5zZm9ybS5iYXNlVmFsLmNvbnNvbGlkYXRlKCkpKSByZXR1cm4gaWRlbnRpdHkkbDsKICAgICAgdmFsdWUgPSB2YWx1ZS5tYXRyaXg7CiAgICAgIHJldHVybiBkZWNvbXBvc2UkNCh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybSQ0KHBhcnNlLCBweENvbW1hLCBweFBhcmVuLCBkZWdQYXJlbikgewoKICAgICAgZnVuY3Rpb24gcG9wKHMpIHsKICAgICAgICByZXR1cm4gcy5sZW5ndGggPyBzLnBvcCgpICsgIiAiIDogIiI7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRyYW5zbGF0ZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgICAgICB2YXIgaSA9IHMucHVzaCgidHJhbnNsYXRlKCIsIG51bGwsIHB4Q29tbWEsIG51bGwsIHB4UGFyZW4pOwogICAgICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMyh4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlciQzKHlhLCB5Yil9KTsKICAgICAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7CiAgICAgICAgICBzLnB1c2goInRyYW5zbGF0ZSgiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7CiAgICAgICAgaWYgKGEgIT09IGIpIHsKICAgICAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aAogICAgICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlciQzKGEsIGIpfSk7CiAgICAgICAgfSBlbHNlIGlmIChiKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNrZXdYKGEsIGIsIHMsIHEpIHsKICAgICAgICBpZiAoYSAhPT0gYikgewogICAgICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInNrZXdYKCIsIG51bGwsIGRlZ1BhcmVuKSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyJDMoYSwgYil9KTsKICAgICAgICB9IGVsc2UgaWYgKGIpIHsKICAgICAgICAgIHMucHVzaChwb3AocykgKyAic2tld1goIiArIGIgKyBkZWdQYXJlbik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBzY2FsZSh4YSwgeWEsIHhiLCB5YiwgcywgcSkgewogICAgICAgIGlmICh4YSAhPT0geGIgfHwgeWEgIT09IHliKSB7CiAgICAgICAgICB2YXIgaSA9IHMucHVzaChwb3AocykgKyAic2NhbGUoIiwgbnVsbCwgIiwiLCBudWxsLCAiKSIpOwogICAgICAgICAgcS5wdXNoKHtpOiBpIC0gNCwgeDogaW50ZXJwb2xhdGVOdW1iZXIkMyh4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlciQzKHlhLCB5Yil9KTsKICAgICAgICB9IGVsc2UgaWYgKHhiICE9PSAxIHx8IHliICE9PSAxKSB7CiAgICAgICAgICBzLnB1c2gocG9wKHMpICsgInNjYWxlKCIgKyB4YiArICIsIiArIHliICsgIikiKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgdmFyIHMgPSBbXSwgLy8gc3RyaW5nIGNvbnN0YW50cyBhbmQgcGxhY2Vob2xkZXJzCiAgICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKICAgICAgICBhID0gcGFyc2UoYSksIGIgPSBwYXJzZShiKTsKICAgICAgICB0cmFuc2xhdGUoYS50cmFuc2xhdGVYLCBhLnRyYW5zbGF0ZVksIGIudHJhbnNsYXRlWCwgYi50cmFuc2xhdGVZLCBzLCBxKTsKICAgICAgICByb3RhdGUoYS5yb3RhdGUsIGIucm90YXRlLCBzLCBxKTsKICAgICAgICBza2V3WChhLnNrZXdYLCBiLnNrZXdYLCBzLCBxKTsKICAgICAgICBzY2FsZShhLnNjYWxlWCwgYS5zY2FsZVksIGIuc2NhbGVYLCBiLnNjYWxlWSwgcywgcSk7CiAgICAgICAgYSA9IGIgPSBudWxsOyAvLyBnYwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICB2YXIgaSA9IC0xLCBuID0gcS5sZW5ndGgsIG87CiAgICAgICAgICB3aGlsZSAoKytpIDwgbikgc1sobyA9IHFbaV0pLmldID0gby54KHQpOwogICAgICAgICAgcmV0dXJuIHMuam9pbigiIik7CiAgICAgICAgfTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MkNCA9IGludGVycG9sYXRlVHJhbnNmb3JtJDQocGFyc2VDc3MkNSwgInB4LCAiLCAicHgpIiwgImRlZykiKTsKICAgIHZhciBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZyQ0ID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0kNChwYXJzZVN2ZyQ0LCAiLCAiLCAiKSIsICIpIik7CgogICAgdmFyIHJobyQyID0gTWF0aC5TUVJUMiwKICAgICAgICByaG8yJDIgPSAyLAogICAgICAgIHJobzQkMiA9IDQsCiAgICAgICAgZXBzaWxvbjIkNiA9IDFlLTEyOwoKICAgIGZ1bmN0aW9uIGNvc2gkMih4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgKyAxIC8geCkgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHNpbmgkMih4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCh4KSkgLSAxIC8geCkgLyAyOwogICAgfQoKICAgIGZ1bmN0aW9uIHRhbmgkMih4KSB7CiAgICAgIHJldHVybiAoKHggPSBNYXRoLmV4cCgyICogeCkpIC0gMSkgLyAoeCArIDEpOwogICAgfQoKICAgIC8vIHAwID0gW3V4MCwgdXkwLCB3MF0KICAgIC8vIHAxID0gW3V4MSwgdXkxLCB3MV0KICAgIGZ1bmN0aW9uIGludGVycG9sYXRlWm9vbSQxKHAwLCBwMSkgewogICAgICB2YXIgdXgwID0gcDBbMF0sIHV5MCA9IHAwWzFdLCB3MCA9IHAwWzJdLAogICAgICAgICAgdXgxID0gcDFbMF0sIHV5MSA9IHAxWzFdLCB3MSA9IHAxWzJdLAogICAgICAgICAgZHggPSB1eDEgLSB1eDAsCiAgICAgICAgICBkeSA9IHV5MSAtIHV5MCwKICAgICAgICAgIGQyID0gZHggKiBkeCArIGR5ICogZHksCiAgICAgICAgICBpLAogICAgICAgICAgUzsKCiAgICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgdTAg4omFIHUxLgogICAgICBpZiAoZDIgPCBlcHNpbG9uMiQ2KSB7CiAgICAgICAgUyA9IE1hdGgubG9nKHcxIC8gdzApIC8gcmhvJDI7CiAgICAgICAgaSA9IGZ1bmN0aW9uKHQpIHsKICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHV4MCArIHQgKiBkeCwKICAgICAgICAgICAgdXkwICsgdCAqIGR5LAogICAgICAgICAgICB3MCAqIE1hdGguZXhwKHJobyQyICogdCAqIFMpCiAgICAgICAgICBdOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIC8vIEdlbmVyYWwgY2FzZS4KICAgICAgZWxzZSB7CiAgICAgICAgdmFyIGQxID0gTWF0aC5zcXJ0KGQyKSwKICAgICAgICAgICAgYjAgPSAodzEgKiB3MSAtIHcwICogdzAgKyByaG80JDIgKiBkMikgLyAoMiAqIHcwICogcmhvMiQyICogZDEpLAogICAgICAgICAgICBiMSA9ICh3MSAqIHcxIC0gdzAgKiB3MCAtIHJobzQkMiAqIGQyKSAvICgyICogdzEgKiByaG8yJDIgKiBkMSksCiAgICAgICAgICAgIHIwID0gTWF0aC5sb2coTWF0aC5zcXJ0KGIwICogYjAgKyAxKSAtIGIwKSwKICAgICAgICAgICAgcjEgPSBNYXRoLmxvZyhNYXRoLnNxcnQoYjEgKiBiMSArIDEpIC0gYjEpOwogICAgICAgIFMgPSAocjEgLSByMCkgLyByaG8kMjsKICAgICAgICBpID0gZnVuY3Rpb24odCkgewogICAgICAgICAgdmFyIHMgPSB0ICogUywKICAgICAgICAgICAgICBjb3NocjAgPSBjb3NoJDIocjApLAogICAgICAgICAgICAgIHUgPSB3MCAvIChyaG8yJDIgKiBkMSkgKiAoY29zaHIwICogdGFuaCQyKHJobyQyICogcyArIHIwKSAtIHNpbmgkMihyMCkpOwogICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgdXgwICsgdSAqIGR4LAogICAgICAgICAgICB1eTAgKyB1ICogZHksCiAgICAgICAgICAgIHcwICogY29zaHIwIC8gY29zaCQyKHJobyQyICogcyArIHIwKQogICAgICAgICAgXTsKICAgICAgICB9OwogICAgICB9CgogICAgICBpLmR1cmF0aW9uID0gUyAqIDEwMDA7CgogICAgICByZXR1cm4gaTsKICAgIH0KCiAgICB2YXIgZnJhbWUkNSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgICAgIHRpbWVvdXQkOSA9IDAsIC8vIGlzIGEgdGltZW91dCBwZW5kaW5nPwogICAgICAgIGludGVydmFsJDcgPSAwLCAvLyBhcmUgYW55IHRpbWVycyBhY3RpdmU/CiAgICAgICAgcG9rZURlbGF5JDUgPSAxMDAwLCAvLyBob3cgZnJlcXVlbnRseSB3ZSBjaGVjayBmb3IgY2xvY2sgc2tldwogICAgICAgIHRhc2tIZWFkJDUsCiAgICAgICAgdGFza1RhaWwkNSwKICAgICAgICBjbG9ja0xhc3QkNSA9IDAsCiAgICAgICAgY2xvY2tOb3ckNSA9IDAsCiAgICAgICAgY2xvY2tTa2V3JDUgPSAwLAogICAgICAgIGNsb2NrJDUgPSB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICJvYmplY3QiICYmIHBlcmZvcm1hbmNlLm5vdyA/IHBlcmZvcm1hbmNlIDogRGF0ZSwKICAgICAgICBzZXRGcmFtZSQ1ID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTsKCiAgICBmdW5jdGlvbiBub3ckNSgpIHsKICAgICAgcmV0dXJuIGNsb2NrTm93JDUgfHwgKHNldEZyYW1lJDUoY2xlYXJOb3ckNSksIGNsb2NrTm93JDUgPSBjbG9jayQ1Lm5vdygpICsgY2xvY2tTa2V3JDUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNsZWFyTm93JDUoKSB7CiAgICAgIGNsb2NrTm93JDUgPSAwOwogICAgfQoKICAgIGZ1bmN0aW9uIFRpbWVyJDUoKSB7CiAgICAgIHRoaXMuX2NhbGwgPQogICAgICB0aGlzLl90aW1lID0KICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICB9CgogICAgVGltZXIkNS5wcm90b3R5cGUgPSB0aW1lciQ1LnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRpbWVyJDUsCiAgICAgIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3ckNSgpIDogK3RpbWUpICsgKGRlbGF5ID09IG51bGwgPyAwIDogK2RlbGF5KTsKICAgICAgICBpZiAoIXRoaXMuX25leHQgJiYgdGFza1RhaWwkNSAhPT0gdGhpcykgewogICAgICAgICAgaWYgKHRhc2tUYWlsJDUpIHRhc2tUYWlsJDUuX25leHQgPSB0aGlzOwogICAgICAgICAgZWxzZSB0YXNrSGVhZCQ1ID0gdGhpczsKICAgICAgICAgIHRhc2tUYWlsJDUgPSB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7CiAgICAgICAgdGhpcy5fdGltZSA9IHRpbWU7CiAgICAgICAgc2xlZXAkNSgpOwogICAgICB9LAogICAgICBzdG9wOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fY2FsbCkgewogICAgICAgICAgdGhpcy5fY2FsbCA9IG51bGw7CiAgICAgICAgICB0aGlzLl90aW1lID0gSW5maW5pdHk7CiAgICAgICAgICBzbGVlcCQ1KCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHRpbWVyJDUoY2FsbGJhY2ssIGRlbGF5LCB0aW1lKSB7CiAgICAgIHZhciB0ID0gbmV3IFRpbWVyJDU7CiAgICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lckZsdXNoJDUoKSB7CiAgICAgIG5vdyQ1KCk7IC8vIEdldCB0aGUgY3VycmVudCB0aW1lLCBpZiBub3QgYWxyZWFkeSBzZXQuCiAgICAgICsrZnJhbWUkNTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuCiAgICAgIHZhciB0ID0gdGFza0hlYWQkNSwgZTsKICAgICAgd2hpbGUgKHQpIHsKICAgICAgICBpZiAoKGUgPSBjbG9ja05vdyQ1IC0gdC5fdGltZSkgPj0gMCkgdC5fY2FsbC5jYWxsKG51bGwsIGUpOwogICAgICAgIHQgPSB0Ll9uZXh0OwogICAgICB9CiAgICAgIC0tZnJhbWUkNTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YWtlJDUoKSB7CiAgICAgIGNsb2NrTm93JDUgPSAoY2xvY2tMYXN0JDUgPSBjbG9jayQ1Lm5vdygpKSArIGNsb2NrU2tldyQ1OwogICAgICBmcmFtZSQ1ID0gdGltZW91dCQ5ID0gMDsKICAgICAgdHJ5IHsKICAgICAgICB0aW1lckZsdXNoJDUoKTsKICAgICAgfSBmaW5hbGx5IHsKICAgICAgICBmcmFtZSQ1ID0gMDsKICAgICAgICBuYXAkNSgpOwogICAgICAgIGNsb2NrTm93JDUgPSAwOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcG9rZSQ2KCkgewogICAgICB2YXIgbm93ID0gY2xvY2skNS5ub3coKSwgZGVsYXkgPSBub3cgLSBjbG9ja0xhc3QkNTsKICAgICAgaWYgKGRlbGF5ID4gcG9rZURlbGF5JDUpIGNsb2NrU2tldyQ1IC09IGRlbGF5LCBjbG9ja0xhc3QkNSA9IG5vdzsKICAgIH0KCiAgICBmdW5jdGlvbiBuYXAkNSgpIHsKICAgICAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkJDUsIHQyLCB0aW1lID0gSW5maW5pdHk7CiAgICAgIHdoaWxlICh0MSkgewogICAgICAgIGlmICh0MS5fY2FsbCkgewogICAgICAgICAgaWYgKHRpbWUgPiB0MS5fdGltZSkgdGltZSA9IHQxLl90aW1lOwogICAgICAgICAgdDAgPSB0MSwgdDEgPSB0MS5fbmV4dDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdDIgPSB0MS5fbmV4dCwgdDEuX25leHQgPSBudWxsOwogICAgICAgICAgdDEgPSB0MCA/IHQwLl9uZXh0ID0gdDIgOiB0YXNrSGVhZCQ1ID0gdDI7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRhc2tUYWlsJDUgPSB0MDsKICAgICAgc2xlZXAkNSh0aW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzbGVlcCQ1KHRpbWUpIHsKICAgICAgaWYgKGZyYW1lJDUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgICAgaWYgKHRpbWVvdXQkOSkgdGltZW91dCQ5ID0gY2xlYXJUaW1lb3V0KHRpbWVvdXQkOSk7CiAgICAgIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdyQ1OyAvLyBTdHJpY3RseSBsZXNzIHRoYW4gaWYgd2UgcmVjb21wdXRlZCBjbG9ja05vdy4KICAgICAgaWYgKGRlbGF5ID4gMjQpIHsKICAgICAgICBpZiAodGltZSA8IEluZmluaXR5KSB0aW1lb3V0JDkgPSBzZXRUaW1lb3V0KHdha2UkNSwgdGltZSAtIGNsb2NrJDUubm93KCkgLSBjbG9ja1NrZXckNSk7CiAgICAgICAgaWYgKGludGVydmFsJDcpIGludGVydmFsJDcgPSBjbGVhckludGVydmFsKGludGVydmFsJDcpOwogICAgICB9IGVsc2UgewogICAgICAgIGlmICghaW50ZXJ2YWwkNykgY2xvY2tMYXN0JDUgPSBjbG9jayQ1Lm5vdygpLCBpbnRlcnZhbCQ3ID0gc2V0SW50ZXJ2YWwocG9rZSQ2LCBwb2tlRGVsYXkkNSk7CiAgICAgICAgZnJhbWUkNSA9IDEsIHNldEZyYW1lJDUod2FrZSQ1KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVvdXQkYShjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXIkNTsKICAgICAgZGVsYXkgPSBkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheTsKICAgICAgdC5yZXN0YXJ0KGZ1bmN0aW9uKGVsYXBzZWQpIHsKICAgICAgICB0LnN0b3AoKTsKICAgICAgICBjYWxsYmFjayhlbGFwc2VkICsgZGVsYXkpOwogICAgICB9LCBkZWxheSwgdGltZSk7CiAgICAgIHJldHVybiB0OwogICAgfQoKICAgIHZhciBlbXB0eU9uJDMgPSBkaXNwYXRjaCQ2KCJzdGFydCIsICJlbmQiLCAiY2FuY2VsIiwgImludGVycnVwdCIpOwogICAgdmFyIGVtcHR5VHdlZW4kMyA9IFtdOwoKICAgIHZhciBDUkVBVEVEJDMgPSAwOwogICAgdmFyIFNDSEVEVUxFRCQzID0gMTsKICAgIHZhciBTVEFSVElORyQzID0gMjsKICAgIHZhciBTVEFSVEVEJDMgPSAzOwogICAgdmFyIFJVTk5JTkckMyA9IDQ7CiAgICB2YXIgRU5ESU5HJDMgPSA1OwogICAgdmFyIEVOREVEJDMgPSA2OwoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlJDQobm9kZSwgbmFtZSwgaWQsIGluZGV4LCBncm91cCwgdGltaW5nKSB7CiAgICAgIHZhciBzY2hlZHVsZXMgPSBub2RlLl9fdHJhbnNpdGlvbjsKICAgICAgaWYgKCFzY2hlZHVsZXMpIG5vZGUuX190cmFuc2l0aW9uID0ge307CiAgICAgIGVsc2UgaWYgKGlkIGluIHNjaGVkdWxlcykgcmV0dXJuOwogICAgICBjcmVhdGUkNShub2RlLCBpZCwgewogICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suCiAgICAgICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suCiAgICAgICAgb246IGVtcHR5T24kMywKICAgICAgICB0d2VlbjogZW1wdHlUd2VlbiQzLAogICAgICAgIHRpbWU6IHRpbWluZy50aW1lLAogICAgICAgIGRlbGF5OiB0aW1pbmcuZGVsYXksCiAgICAgICAgZHVyYXRpb246IHRpbWluZy5kdXJhdGlvbiwKICAgICAgICBlYXNlOiB0aW1pbmcuZWFzZSwKICAgICAgICB0aW1lcjogbnVsbCwKICAgICAgICBzdGF0ZTogQ1JFQVRFRCQzCiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXQkMyhub2RlLCBpZCkgewogICAgICB2YXIgc2NoZWR1bGUgPSBnZXQkYihub2RlLCBpZCk7CiAgICAgIGlmIChzY2hlZHVsZS5zdGF0ZSA+IENSRUFURUQkMykgdGhyb3cgbmV3IEVycm9yKCJ0b28gbGF0ZTsgYWxyZWFkeSBzY2hlZHVsZWQiKTsKICAgICAgcmV0dXJuIHNjaGVkdWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIHNldCRmKG5vZGUsIGlkKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IGdldCRiKG5vZGUsIGlkKTsKICAgICAgaWYgKHNjaGVkdWxlLnN0YXRlID4gU1RBUlRFRCQzKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgICAgcmV0dXJuIHNjaGVkdWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldCRiKG5vZGUsIGlkKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7CiAgICAgIHJldHVybiBzY2hlZHVsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGUkNShub2RlLCBpZCwgc2VsZikgewogICAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgICAgICB0d2VlbjsKCiAgICAgIC8vIEluaXRpYWxpemUgdGhlIHNlbGYgdGltZXIgd2hlbiB0aGUgdHJhbnNpdGlvbiBpcyBjcmVhdGVkLgogICAgICAvLyBOb3RlIHRoZSBhY3R1YWwgZGVsYXkgaXMgbm90IGtub3duIHVudGlsIHRoZSBmaXJzdCBjYWxsYmFjayEKICAgICAgc2NoZWR1bGVzW2lkXSA9IHNlbGY7CiAgICAgIHNlbGYudGltZXIgPSB0aW1lciQ1KHNjaGVkdWxlLCAwLCBzZWxmLnRpbWUpOwoKICAgICAgZnVuY3Rpb24gc2NoZWR1bGUoZWxhcHNlZCkgewogICAgICAgIHNlbGYuc3RhdGUgPSBTQ0hFRFVMRUQkMzsKICAgICAgICBzZWxmLnRpbWVyLnJlc3RhcnQoc3RhcnQsIHNlbGYuZGVsYXksIHNlbGYudGltZSk7CgogICAgICAgIC8vIElmIHRoZSBlbGFwc2VkIGRlbGF5IGlzIGxlc3MgdGhhbiBvdXIgZmlyc3Qgc2xlZXAsIHN0YXJ0IGltbWVkaWF0ZWx5LgogICAgICAgIGlmIChzZWxmLmRlbGF5IDw9IGVsYXBzZWQpIHN0YXJ0KGVsYXBzZWQgLSBzZWxmLmRlbGF5KTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc3RhcnQoZWxhcHNlZCkgewogICAgICAgIHZhciBpLCBqLCBuLCBvOwoKICAgICAgICAvLyBJZiB0aGUgc3RhdGUgaXMgbm90IFNDSEVEVUxFRCwgdGhlbiB3ZSBwcmV2aW91c2x5IGVycm9yZWQgb24gc3RhcnQuCiAgICAgICAgaWYgKHNlbGYuc3RhdGUgIT09IFNDSEVEVUxFRCQzKSByZXR1cm4gc3RvcCgpOwoKICAgICAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTsKCiAgICAgICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLAogICAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IQogICAgICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQkMykgcmV0dXJuIHRpbWVvdXQkYShzdGFydCk7CgogICAgICAgICAgLy8gSW50ZXJydXB0IHRoZSBhY3RpdmUgdHJhbnNpdGlvbiwgaWYgYW55LgogICAgICAgICAgaWYgKG8uc3RhdGUgPT09IFJVTk5JTkckMykgewogICAgICAgICAgICBvLnN0YXRlID0gRU5ERUQkMzsKICAgICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICAgIG8ub24uY2FsbCgiaW50ZXJydXB0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7CiAgICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgICB9CgogICAgICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLgogICAgICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgICAgICBvLnN0YXRlID0gRU5ERUQkMzsKICAgICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICAgIG8ub24uY2FsbCgiY2FuY2VsIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7CiAgICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBEZWZlciB0aGUgZmlyc3QgdGljayB0byBlbmQgb2YgdGhlIGN1cnJlbnQgZnJhbWU7IHNlZSBkMy9kMyMxNTc2LgogICAgICAgIC8vIE5vdGUgdGhlIHRyYW5zaXRpb24gbWF5IGJlIGNhbmNlbGVkIGFmdGVyIHN0YXJ0IGFuZCBiZWZvcmUgdGhlIGZpcnN0IHRpY2shCiAgICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgc2NoZWR1bGVkIGJlZm9yZSB0aGUgc3RhcnQgZXZlbnQ7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzE2IQogICAgICAgIC8vIEFzc3VtaW5nIHRoaXMgaXMgc3VjY2Vzc2Z1bCwgc3Vic2VxdWVudCBjYWxsYmFja3MgZ28gc3RyYWlnaHQgdG8gdGljay4KICAgICAgICB0aW1lb3V0JGEoZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoc2VsZi5zdGF0ZSA9PT0gU1RBUlRFRCQzKSB7CiAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBSVU5OSU5HJDM7CiAgICAgICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwogICAgICAgICAgICB0aWNrKGVsYXBzZWQpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuCiAgICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgICAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkckMzsKICAgICAgICBzZWxmLm9uLmNhbGwoInN0YXJ0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgICAgaWYgKHNlbGYuc3RhdGUgIT09IFNUQVJUSU5HJDMpIHJldHVybjsgLy8gaW50ZXJydXB0ZWQKICAgICAgICBzZWxmLnN0YXRlID0gU1RBUlRFRCQzOwoKICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi4KICAgICAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHsKICAgICAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKICAgICAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORyQzLCAxKSwKICAgICAgICAgICAgaSA9IC0xLAogICAgICAgICAgICBuID0gdHdlZW4ubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgdHdlZW5baV0uY2FsbChub2RlLCB0KTsKICAgICAgICB9CgogICAgICAgIC8vIERpc3BhdGNoIHRoZSBlbmQgZXZlbnQuCiAgICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IEVORElORyQzKSB7CiAgICAgICAgICBzZWxmLm9uLmNhbGwoImVuZCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApOwogICAgICAgICAgc3RvcCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gc3RvcCgpIHsKICAgICAgICBzZWxmLnN0YXRlID0gRU5ERUQkMzsKICAgICAgICBzZWxmLnRpbWVyLnN0b3AoKTsKICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTsKICAgICAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJydXB0JDMobm9kZSwgbmFtZSkgewogICAgICB2YXIgc2NoZWR1bGVzID0gbm9kZS5fX3RyYW5zaXRpb24sCiAgICAgICAgICBzY2hlZHVsZSwKICAgICAgICAgIGFjdGl2ZSwKICAgICAgICAgIGVtcHR5ID0gdHJ1ZSwKICAgICAgICAgIGk7CgogICAgICBpZiAoIXNjaGVkdWxlcykgcmV0dXJuOwoKICAgICAgbmFtZSA9IG5hbWUgPT0gbnVsbCA/IG51bGwgOiBuYW1lICsgIiI7CgogICAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgICAgaWYgKChzY2hlZHVsZSA9IHNjaGVkdWxlc1tpXSkubmFtZSAhPT0gbmFtZSkgeyBlbXB0eSA9IGZhbHNlOyBjb250aW51ZTsgfQogICAgICAgIGFjdGl2ZSA9IHNjaGVkdWxlLnN0YXRlID4gU1RBUlRJTkckMyAmJiBzY2hlZHVsZS5zdGF0ZSA8IEVORElORyQzOwogICAgICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQkMzsKICAgICAgICBzY2hlZHVsZS50aW1lci5zdG9wKCk7CiAgICAgICAgc2NoZWR1bGUub24uY2FsbChhY3RpdmUgPyAiaW50ZXJydXB0IiA6ICJjYW5jZWwiLCBub2RlLCBub2RlLl9fZGF0YV9fLCBzY2hlZHVsZS5pbmRleCwgc2NoZWR1bGUuZ3JvdXApOwogICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgIH0KCiAgICAgIGlmIChlbXB0eSkgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9pbnRlcnJ1cHQkMyhuYW1lKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgaW50ZXJydXB0JDModGhpcywgbmFtZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHR3ZWVuUmVtb3ZlJDMoaWQsIG5hbWUpIHsKICAgICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JGYodGhpcywgaWQpLAogICAgICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgICB0d2VlbjEgPSB0d2VlbjAgPSB0d2VlbjsKICAgICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICB0d2VlbjEgPSB0d2VlbjEuc2xpY2UoKTsKICAgICAgICAgICAgICB0d2VlbjEuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0d2VlbkZ1bmN0aW9uJDMoaWQsIG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciB0d2VlbjAsIHR3ZWVuMTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JGYodGhpcywgaWQpLAogICAgICAgICAgICB0d2VlbiA9IHNjaGVkdWxlLnR3ZWVuOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIHR3ZWVuIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIHR3ZWVuIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmICh0d2VlbiAhPT0gdHdlZW4wKSB7CiAgICAgICAgICB0d2VlbjEgPSAodHdlZW4wID0gdHdlZW4pLnNsaWNlKCk7CiAgICAgICAgICBmb3IgKHZhciB0ID0ge25hbWU6IG5hbWUsIHZhbHVlOiB2YWx1ZX0sIGkgPSAwLCBuID0gdHdlZW4xLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgICBpZiAodHdlZW4xW2ldLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICB0d2VlbjFbaV0gPSB0OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaSA9PT0gbikgdHdlZW4xLnB1c2godCk7CiAgICAgICAgfQoKICAgICAgICBzY2hlZHVsZS50d2VlbiA9IHR3ZWVuMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3R3ZWVuJDMobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICBuYW1lICs9ICIiOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIHR3ZWVuID0gZ2V0JGIodGhpcy5ub2RlKCksIGlkKS50d2VlbjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHQudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUkMyA6IHR3ZWVuRnVuY3Rpb24kMykoaWQsIG5hbWUsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdHdlZW5WYWx1ZSQzKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkOwoKICAgICAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCRmKHRoaXMsIGlkKTsKICAgICAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gZ2V0JGIobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlJDYoYSwgYikgewogICAgICB2YXIgYzsKICAgICAgcmV0dXJuICh0eXBlb2YgYiA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlciQzCiAgICAgICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciQ2ID8gaW50ZXJwb2xhdGVSZ2IkMwogICAgICAgICAgOiAoYyA9IGNvbG9yJDYoYikpID8gKGIgPSBjLCBpbnRlcnBvbGF0ZVJnYiQzKQogICAgICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZyQzKShhLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlJDkobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZU5TJDkoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyQ29uc3RhbnQkOShuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIiwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50TlMkOShmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24kOShuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7CiAgICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICBzdHJpbmcwID0gdGhpcy5nZXRBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb25OUyQ5KGZ1bGxuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCwgdmFsdWUxID0gdmFsdWUodGhpcyksIHN0cmluZzE7CiAgICAgICAgaWYgKHZhbHVlMSA9PSBudWxsKSByZXR1cm4gdm9pZCB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiI7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fYXR0ciQzKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZSQ1KG5hbWUpLCBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmckNCA6IGludGVycG9sYXRlJDY7CiAgICAgIHJldHVybiB0aGlzLmF0dHJUd2VlbihuYW1lLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMkOSA6IGF0dHJGdW5jdGlvbiQ5KShmdWxsbmFtZSwgaSwgdHdlZW5WYWx1ZSQzKHRoaXMsICJhdHRyLiIgKyBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkOSA6IGF0dHJSZW1vdmUkOSkoZnVsbG5hbWUpCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDkgOiBhdHRyQ29uc3RhbnQkOSkoZnVsbG5hbWUsIGksIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlJDIobmFtZSwgaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIGkuY2FsbCh0aGlzLCB0KSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlTlMkMihmdWxsbmFtZSwgaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCBpLmNhbGwodGhpcywgdCkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJUd2Vlbk5TJDMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciB0MCwgaTA7CiAgICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMkMihmdWxsbmFtZSwgaSk7CiAgICAgICAgcmV0dXJuIHQwOwogICAgICB9CiAgICAgIHR3ZWVuLl92YWx1ZSA9IHZhbHVlOwogICAgICByZXR1cm4gdHdlZW47CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clR3ZWVuJDMobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIHQwLCBpMDsKICAgICAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiBhdHRySW50ZXJwb2xhdGUkMihuYW1lLCBpKTsKICAgICAgICByZXR1cm4gdDA7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2F0dHJUd2VlbiQzKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBrZXkgPSAiYXR0ci4iICsgbmFtZTsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSByZXR1cm4gKGtleSA9IHRoaXMudHdlZW4oa2V5KSkgJiYga2V5Ll92YWx1ZTsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgbnVsbCk7CiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcjsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlJDUobmFtZSk7CiAgICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgKGZ1bGxuYW1lLmxvY2FsID8gYXR0clR3ZWVuTlMkMyA6IGF0dHJUd2VlbiQzKShmdWxsbmFtZSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWxheUZ1bmN0aW9uJDMoaWQsIHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBpbml0JDModGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGVsYXlDb25zdGFudCQzKGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgewogICAgICAgIGluaXQkMyh0aGlzLCBpZCkuZGVsYXkgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2RlbGF5JDModmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gZGVsYXlGdW5jdGlvbiQzCiAgICAgICAgICAgICAgOiBkZWxheUNvbnN0YW50JDMpKGlkLCB2YWx1ZSkpCiAgICAgICAgICA6IGdldCRiKHRoaXMubm9kZSgpLCBpZCkuZGVsYXk7CiAgICB9CgogICAgZnVuY3Rpb24gZHVyYXRpb25GdW5jdGlvbiQzKGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0JGYodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudCQzKGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPSArdmFsdWUsIGZ1bmN0aW9uKCkgewogICAgICAgIHNldCRmKHRoaXMsIGlkKS5kdXJhdGlvbiA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZHVyYXRpb24kMyh2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCgodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBkdXJhdGlvbkZ1bmN0aW9uJDMKICAgICAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQkMykoaWQsIHZhbHVlKSkKICAgICAgICAgIDogZ2V0JGIodGhpcy5ub2RlKCksIGlkKS5kdXJhdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBlYXNlQ29uc3RhbnQkMyhpZCwgdmFsdWUpIHsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0JGYodGhpcywgaWQpLmVhc2UgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2Vhc2UkMyh2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQkMyhpZCwgdmFsdWUpKQogICAgICAgICAgOiBnZXQkYih0aGlzLm5vZGUoKSwgaWQpLmVhc2U7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9maWx0ZXIkMyhtYXRjaCkgewogICAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIkNihtYXRjaCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbiQzKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgdGhpcy5fbmFtZSwgdGhpcy5faWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fbWVyZ2UkMyh0cmFuc2l0aW9uKSB7CiAgICAgIGlmICh0cmFuc2l0aW9uLl9pZCAhPT0gdGhpcy5faWQpIHRocm93IG5ldyBFcnJvcjsKCiAgICAgIGZvciAodmFyIGdyb3VwczAgPSB0aGlzLl9ncm91cHMsIGdyb3VwczEgPSB0cmFuc2l0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgewogICAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24kMyhtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGFydCQ0KG5hbWUpIHsKICAgICAgcmV0dXJuIChuYW1lICsgIiIpLnRyaW0oKS5zcGxpdCgvXnxccysvKS5ldmVyeShmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIGkgPSB0LmluZGV4T2YoIi4iKTsKICAgICAgICBpZiAoaSA+PSAwKSB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICByZXR1cm4gIXQgfHwgdCA9PT0gInN0YXJ0IjsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25GdW5jdGlvbiQzKGlkLCBuYW1lLCBsaXN0ZW5lcikgewogICAgICB2YXIgb24wLCBvbjEsIHNpdCA9IHN0YXJ0JDQobmFtZSkgPyBpbml0JDMgOiBzZXQkZjsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNpdCh0aGlzLCBpZCksCiAgICAgICAgICAgIG9uID0gc2NoZWR1bGUub247CgogICAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgYSBkaXNwYXRjaCB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIQogICAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgICBpZiAob24gIT09IG9uMCkgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihuYW1lLCBsaXN0ZW5lcik7CgogICAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fb24kMyhuYW1lLCBsaXN0ZW5lcikgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoIDwgMgogICAgICAgICAgPyBnZXQkYih0aGlzLm5vZGUoKSwgaWQpLm9uLm9uKG5hbWUpCiAgICAgICAgICA6IHRoaXMuZWFjaChvbkZ1bmN0aW9uJDMoaWQsIG5hbWUsIGxpc3RlbmVyKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24kMyhpZCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgICBmb3IgKHZhciBpIGluIHRoaXMuX190cmFuc2l0aW9uKSBpZiAoK2kgIT09IGlkKSByZXR1cm47CiAgICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fcmVtb3ZlJDMoKSB7CiAgICAgIHJldHVybiB0aGlzLm9uKCJlbmQucmVtb3ZlIiwgcmVtb3ZlRnVuY3Rpb24kMyh0aGlzLl9pZCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0JDMoc2VsZWN0KSB7CiAgICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZSwKICAgICAgICAgIGlkID0gdGhpcy5faWQ7CgogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3IkNShzZWxlY3QpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgc3Vibm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmICgobm9kZSA9IGdyb3VwW2ldKSAmJiAoc3Vibm9kZSA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSkpIHsKICAgICAgICAgICAgaWYgKCJfX2RhdGFfXyIgaW4gbm9kZSkgc3Vibm9kZS5fX2RhdGFfXyA9IG5vZGUuX19kYXRhX187CiAgICAgICAgICAgIHN1Ymdyb3VwW2ldID0gc3Vibm9kZTsKICAgICAgICAgICAgc2NoZWR1bGUkNChzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQkYihub2RlLCBpZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDMoc3ViZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zZWxlY3RBbGwkMyhzZWxlY3QpIHsKICAgICAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICAgICAgaWQgPSB0aGlzLl9pZDsKCiAgICAgIGlmICh0eXBlb2Ygc2VsZWN0ICE9PSAiZnVuY3Rpb24iKSBzZWxlY3QgPSBzZWxlY3RvckFsbCQ1KHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQkYihub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7CiAgICAgICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgICAgIHNjaGVkdWxlJDQoY2hpbGQsIG5hbWUsIGlkLCBrLCBjaGlsZHJlbiwgaW5oZXJpdCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKGNoaWxkcmVuKTsKICAgICAgICAgICAgcGFyZW50cy5wdXNoKG5vZGUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDMoc3ViZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCk7CiAgICB9CgogICAgdmFyIFNlbGVjdGlvbiQ5ID0gc2VsZWN0aW9uJDUucHJvdG90eXBlLmNvbnN0cnVjdG9yOwoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0aW9uJDMoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uJDkodGhpcy5fZ3JvdXBzLCB0aGlzLl9wYXJlbnRzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZU51bGwkMihuYW1lLCBpbnRlcnBvbGF0ZSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSQ1KHRoaXMsIG5hbWUpLAogICAgICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUkNSh0aGlzLCBuYW1lKSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHN0cmluZzEwID0gc3RyaW5nMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVSZW1vdmUkOShuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnN0eWxlLnJlbW92ZVByb3BlcnR5KG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlQ29uc3RhbnQkOShuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUxKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIiwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSQ1KHRoaXMsIG5hbWUpOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24kOShuYW1lLCBpbnRlcnBvbGF0ZSwgdmFsdWUpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMTAsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCA9IHN0eWxlVmFsdWUkNSh0aGlzLCBuYW1lKSwKICAgICAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSQ1KHRoaXMsIG5hbWUpKTsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVNYXliZVJlbW92ZSQyKGlkLCBuYW1lKSB7CiAgICAgIHZhciBvbjAsIG9uMSwgbGlzdGVuZXIwLCBrZXkgPSAic3R5bGUuIiArIG5hbWUsIGV2ZW50ID0gImVuZC4iICsga2V5LCByZW1vdmU7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQkZih0aGlzLCBpZCksCiAgICAgICAgICAgIG9uID0gc2NoZWR1bGUub24sCiAgICAgICAgICAgIGxpc3RlbmVyID0gc2NoZWR1bGUudmFsdWVba2V5XSA9PSBudWxsID8gcmVtb3ZlIHx8IChyZW1vdmUgPSBzdHlsZVJlbW92ZSQ5KG5hbWUpKSA6IHVuZGVmaW5lZDsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgLy8ganVzdCBhc3NpZ24gdGhlIHVwZGF0ZWQgc2hhcmVkIGRpc3BhdGNoIGFuZCB3ZeKAmXJlIGRvbmUhCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgIGlmIChvbiAhPT0gb24wIHx8IGxpc3RlbmVyMCAhPT0gbGlzdGVuZXIpIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24oZXZlbnQsIGxpc3RlbmVyMCA9IGxpc3RlbmVyKTsKCiAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zdHlsZSQzKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICB2YXIgaSA9IChuYW1lICs9ICIiKSA9PT0gInRyYW5zZm9ybSIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyQ0IDogaW50ZXJwb2xhdGUkNjsKICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgPyB0aGlzCiAgICAgICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZU51bGwkMihuYW1lLCBpKSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBzdHlsZVJlbW92ZSQ5KG5hbWUpKQogICAgICAgIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcwogICAgICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbiQ5KG5hbWUsIGksIHR3ZWVuVmFsdWUkMyh0aGlzLCAic3R5bGUuIiArIG5hbWUsIHZhbHVlKSkpCiAgICAgICAgICAuZWFjaChzdHlsZU1heWJlUmVtb3ZlJDIodGhpcy5faWQsIG5hbWUpKQogICAgICAgIDogdGhpcwogICAgICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVDb25zdGFudCQ5KG5hbWUsIGksIHZhbHVlKSwgcHJpb3JpdHkpCiAgICAgICAgICAub24oImVuZC5zdHlsZS4iICsgbmFtZSwgbnVsbCk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVJbnRlcnBvbGF0ZSQyKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVR3ZWVuJDMobmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHZhciB0LCBpMDsKICAgICAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmIChpICE9PSBpMCkgdCA9IChpMCA9IGkpICYmIHN0eWxlSW50ZXJwb2xhdGUkMihuYW1lLCBpLCBwcmlvcml0eSk7CiAgICAgICAgcmV0dXJuIHQ7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3N0eWxlVHdlZW4kMyhuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIGtleSA9ICJzdHlsZS4iICsgKG5hbWUgKz0gIiIpOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4kMyhuYW1lLCB2YWx1ZSwgcHJpb3JpdHkgPT0gbnVsbCA/ICIiIDogcHJpb3JpdHkpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQkOSh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRGdW5jdGlvbiQ5KHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWUxID0gdmFsdWUodGhpcyk7CiAgICAgICAgdGhpcy50ZXh0Q29udGVudCA9IHZhbHVlMSA9PSBudWxsID8gIiIgOiB2YWx1ZTE7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl90ZXh0JDModmFsdWUpIHsKICAgICAgcmV0dXJuIHRoaXMudHdlZW4oInRleHQiLCB0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gdGV4dEZ1bmN0aW9uJDkodHdlZW5WYWx1ZSQzKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAgICAgICAgOiB0ZXh0Q29uc3RhbnQkOSh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dEludGVycG9sYXRlJDIoaSkgewogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSBpLmNhbGwodGhpcywgdCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dFR3ZWVuJDIodmFsdWUpIHsKICAgICAgdmFyIHQwLCBpMDsKICAgICAgZnVuY3Rpb24gdHdlZW4oKSB7CiAgICAgICAgdmFyIGkgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmIChpICE9PSBpMCkgdDAgPSAoaTAgPSBpKSAmJiB0ZXh0SW50ZXJwb2xhdGUkMihpKTsKICAgICAgICByZXR1cm4gdDA7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHRUd2VlbiQyKHZhbHVlKSB7CiAgICAgIHZhciBrZXkgPSAidGV4dCI7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMSkgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHJldHVybiB0aGlzLnR3ZWVuKGtleSwgdGV4dFR3ZWVuJDIodmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RyYW5zaXRpb24kMygpIHsKICAgICAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgICAgICBpZDEgPSBuZXdJZCQzKCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICB2YXIgaW5oZXJpdCA9IGdldCRiKG5vZGUsIGlkMCk7CiAgICAgICAgICAgIHNjaGVkdWxlJDQobm9kZSwgbmFtZSwgaWQxLCBpLCBncm91cCwgewogICAgICAgICAgICAgIHRpbWU6IGluaGVyaXQudGltZSArIGluaGVyaXQuZGVsYXkgKyBpbmhlcml0LmR1cmF0aW9uLAogICAgICAgICAgICAgIGRlbGF5OiAwLAogICAgICAgICAgICAgIGR1cmF0aW9uOiBpbmhlcml0LmR1cmF0aW9uLAogICAgICAgICAgICAgIGVhc2U6IGluaGVyaXQuZWFzZQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbiQzKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2VuZCQyKCkgewogICAgICB2YXIgb24wLCBvbjEsIHRoYXQgPSB0aGlzLCBpZCA9IHRoYXQuX2lkLCBzaXplID0gdGhhdC5zaXplKCk7CiAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHsKICAgICAgICB2YXIgY2FuY2VsID0ge3ZhbHVlOiByZWplY3R9LAogICAgICAgICAgICBlbmQgPSB7dmFsdWU6IGZ1bmN0aW9uKCkgeyBpZiAoLS1zaXplID09PSAwKSByZXNvbHZlKCk7IH19OwoKICAgICAgICB0aGF0LmVhY2goZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQkZih0aGlzLCBpZCksCiAgICAgICAgICAgICAgb24gPSBzY2hlZHVsZS5vbjsKCiAgICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCBkaXNwYXRjaCBhbmQgd2XigJlyZSBkb25lIQogICAgICAgICAgLy8gT3RoZXJ3aXNlLCBjb3B5LW9uLXdyaXRlLgogICAgICAgICAgaWYgKG9uICE9PSBvbjApIHsKICAgICAgICAgICAgb24xID0gKG9uMCA9IG9uKS5jb3B5KCk7CiAgICAgICAgICAgIG9uMS5fLmNhbmNlbC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICAgIG9uMS5fLmludGVycnVwdC5wdXNoKGNhbmNlbCk7CiAgICAgICAgICAgIG9uMS5fLmVuZC5wdXNoKGVuZCk7CiAgICAgICAgICB9CgogICAgICAgICAgc2NoZWR1bGUub24gPSBvbjE7CiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBpZCQzID0gMDsKCiAgICBmdW5jdGlvbiBUcmFuc2l0aW9uJDMoZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkgewogICAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICAgIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOwogICAgICB0aGlzLl9uYW1lID0gbmFtZTsKICAgICAgdGhpcy5faWQgPSBpZDsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uJDMobmFtZSkgewogICAgICByZXR1cm4gc2VsZWN0aW9uJDUoKS50cmFuc2l0aW9uKG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ld0lkJDMoKSB7CiAgICAgIHJldHVybiArK2lkJDM7CiAgICB9CgogICAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUkMyA9IHNlbGVjdGlvbiQ1LnByb3RvdHlwZTsKCiAgICBUcmFuc2l0aW9uJDMucHJvdG90eXBlID0gdHJhbnNpdGlvbiQzLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24kMywKICAgICAgc2VsZWN0OiB0cmFuc2l0aW9uX3NlbGVjdCQzLAogICAgICBzZWxlY3RBbGw6IHRyYW5zaXRpb25fc2VsZWN0QWxsJDMsCiAgICAgIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIkMywKICAgICAgbWVyZ2U6IHRyYW5zaXRpb25fbWVyZ2UkMywKICAgICAgc2VsZWN0aW9uOiB0cmFuc2l0aW9uX3NlbGVjdGlvbiQzLAogICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24kMywKICAgICAgY2FsbDogc2VsZWN0aW9uX3Byb3RvdHlwZSQzLmNhbGwsCiAgICAgIG5vZGVzOiBzZWxlY3Rpb25fcHJvdG90eXBlJDMubm9kZXMsCiAgICAgIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUkMy5ub2RlLAogICAgICBzaXplOiBzZWxlY3Rpb25fcHJvdG90eXBlJDMuc2l6ZSwKICAgICAgZW1wdHk6IHNlbGVjdGlvbl9wcm90b3R5cGUkMy5lbXB0eSwKICAgICAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZSQzLmVhY2gsCiAgICAgIG9uOiB0cmFuc2l0aW9uX29uJDMsCiAgICAgIGF0dHI6IHRyYW5zaXRpb25fYXR0ciQzLAogICAgICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuJDMsCiAgICAgIHN0eWxlOiB0cmFuc2l0aW9uX3N0eWxlJDMsCiAgICAgIHN0eWxlVHdlZW46IHRyYW5zaXRpb25fc3R5bGVUd2VlbiQzLAogICAgICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQkMywKICAgICAgdGV4dFR3ZWVuOiB0cmFuc2l0aW9uX3RleHRUd2VlbiQyLAogICAgICByZW1vdmU6IHRyYW5zaXRpb25fcmVtb3ZlJDMsCiAgICAgIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuJDMsCiAgICAgIGRlbGF5OiB0cmFuc2l0aW9uX2RlbGF5JDMsCiAgICAgIGR1cmF0aW9uOiB0cmFuc2l0aW9uX2R1cmF0aW9uJDMsCiAgICAgIGVhc2U6IHRyYW5zaXRpb25fZWFzZSQzLAogICAgICBlbmQ6IHRyYW5zaXRpb25fZW5kJDIKICAgIH07CgogICAgdmFyIGRlZmF1bHRUaW1pbmckMyA9IHsKICAgICAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS4KICAgICAgZGVsYXk6IDAsCiAgICAgIGR1cmF0aW9uOiAyNTAsCiAgICAgIGVhc2U6IGN1YmljSW5PdXQKICAgIH07CgogICAgZnVuY3Rpb24gaW5oZXJpdCQzKG5vZGUsIGlkKSB7CiAgICAgIHZhciB0aW1pbmc7CiAgICAgIHdoaWxlICghKHRpbWluZyA9IG5vZGUuX190cmFuc2l0aW9uKSB8fCAhKHRpbWluZyA9IHRpbWluZ1tpZF0pKSB7CiAgICAgICAgaWYgKCEobm9kZSA9IG5vZGUucGFyZW50Tm9kZSkpIHsKICAgICAgICAgIHJldHVybiBkZWZhdWx0VGltaW5nJDMudGltZSA9IG5vdyQ1KCksIGRlZmF1bHRUaW1pbmckMzsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHRpbWluZzsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fdHJhbnNpdGlvbiQzKG5hbWUpIHsKICAgICAgdmFyIGlkLAogICAgICAgICAgdGltaW5nOwoKICAgICAgaWYgKG5hbWUgaW5zdGFuY2VvZiBUcmFuc2l0aW9uJDMpIHsKICAgICAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZCA9IG5ld0lkJDMoKSwgKHRpbWluZyA9IGRlZmF1bHRUaW1pbmckMykudGltZSA9IG5vdyQ1KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArICIiOwogICAgICB9CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBzY2hlZHVsZSQ0KG5vZGUsIG5hbWUsIGlkLCBpLCBncm91cCwgdGltaW5nIHx8IGluaGVyaXQkMyhub2RlLCBpZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uJDMoZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7CiAgICB9CgogICAgc2VsZWN0aW9uJDUucHJvdG90eXBlLmludGVycnVwdCA9IHNlbGVjdGlvbl9pbnRlcnJ1cHQkMzsKICAgIHNlbGVjdGlvbiQ1LnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb24kMzsKCiAgICBmdW5jdGlvbiBjb25zdGFudCR5KHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIFpvb21FdmVudCQxKHRhcmdldCwgdHlwZSwgdHJhbnNmb3JtKSB7CiAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLnRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKICAgIH0KCiAgICBmdW5jdGlvbiBUcmFuc2Zvcm0kMShrLCB4LCB5KSB7CiAgICAgIHRoaXMuayA9IGs7CiAgICAgIHRoaXMueCA9IHg7CiAgICAgIHRoaXMueSA9IHk7CiAgICB9CgogICAgVHJhbnNmb3JtJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVHJhbnNmb3JtJDEsCiAgICAgIHNjYWxlOiBmdW5jdGlvbihrKSB7CiAgICAgICAgcmV0dXJuIGsgPT09IDEgPyB0aGlzIDogbmV3IFRyYW5zZm9ybSQxKHRoaXMuayAqIGssIHRoaXMueCwgdGhpcy55KTsKICAgICAgfSwKICAgICAgdHJhbnNsYXRlOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgcmV0dXJuIHggPT09IDAgJiB5ID09PSAwID8gdGhpcyA6IG5ldyBUcmFuc2Zvcm0kMSh0aGlzLmssIHRoaXMueCArIHRoaXMuayAqIHgsIHRoaXMueSArIHRoaXMuayAqIHkpOwogICAgICB9LAogICAgICBhcHBseTogZnVuY3Rpb24ocG9pbnQpIHsKICAgICAgICByZXR1cm4gW3BvaW50WzBdICogdGhpcy5rICsgdGhpcy54LCBwb2ludFsxXSAqIHRoaXMuayArIHRoaXMueV07CiAgICAgIH0sCiAgICAgIGFwcGx5WDogZnVuY3Rpb24oeCkgewogICAgICAgIHJldHVybiB4ICogdGhpcy5rICsgdGhpcy54OwogICAgICB9LAogICAgICBhcHBseVk6IGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4geSAqIHRoaXMuayArIHRoaXMueTsKICAgICAgfSwKICAgICAgaW52ZXJ0OiBmdW5jdGlvbihsb2NhdGlvbikgewogICAgICAgIHJldHVybiBbKGxvY2F0aW9uWzBdIC0gdGhpcy54KSAvIHRoaXMuaywgKGxvY2F0aW9uWzFdIC0gdGhpcy55KSAvIHRoaXMua107CiAgICAgIH0sCiAgICAgIGludmVydFg6IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gKHggLSB0aGlzLngpIC8gdGhpcy5rOwogICAgICB9LAogICAgICBpbnZlcnRZOiBmdW5jdGlvbih5KSB7CiAgICAgICAgcmV0dXJuICh5IC0gdGhpcy55KSAvIHRoaXMuazsKICAgICAgfSwKICAgICAgcmVzY2FsZVg6IGZ1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4geC5jb3B5KCkuZG9tYWluKHgucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRYLCB0aGlzKS5tYXAoeC5pbnZlcnQsIHgpKTsKICAgICAgfSwKICAgICAgcmVzY2FsZVk6IGZ1bmN0aW9uKHkpIHsKICAgICAgICByZXR1cm4geS5jb3B5KCkuZG9tYWluKHkucmFuZ2UoKS5tYXAodGhpcy5pbnZlcnRZLCB0aGlzKS5tYXAoeS5pbnZlcnQsIHkpKTsKICAgICAgfSwKICAgICAgdG9TdHJpbmc6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyB0aGlzLnggKyAiLCIgKyB0aGlzLnkgKyAiKSBzY2FsZSgiICsgdGhpcy5rICsgIikiOwogICAgICB9CiAgICB9OwoKICAgIHZhciBpZGVudGl0eSRtID0gbmV3IFRyYW5zZm9ybSQxKDEsIDAsIDApOwoKICAgIHRyYW5zZm9ybSQzLnByb3RvdHlwZSA9IFRyYW5zZm9ybSQxLnByb3RvdHlwZTsKCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm0kMyhub2RlKSB7CiAgICAgIHJldHVybiBub2RlLl9fem9vbSB8fCBpZGVudGl0eSRtOwogICAgfQoKICAgIGZ1bmN0aW9uIG5vcHJvcGFnYXRpb24kNSgpIHsKICAgICAgZXZlbnQkNC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2V2ZW50JDcoKSB7CiAgICAgIGV2ZW50JDQucHJldmVudERlZmF1bHQoKTsKICAgICAgZXZlbnQkNC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIH0KCiAgICAvLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS4KICAgIGZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIkNSgpIHsKICAgICAgcmV0dXJuICFldmVudCQ0LmJ1dHRvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0RXh0ZW50JDMoKSB7CiAgICAgIHZhciBlID0gdGhpcywgdywgaDsKICAgICAgaWYgKGUgaW5zdGFuY2VvZiBTVkdFbGVtZW50KSB7CiAgICAgICAgZSA9IGUub3duZXJTVkdFbGVtZW50IHx8IGU7CiAgICAgICAgdyA9IGUud2lkdGguYmFzZVZhbC52YWx1ZTsKICAgICAgICBoID0gZS5oZWlnaHQuYmFzZVZhbC52YWx1ZTsKICAgICAgfSBlbHNlIHsKICAgICAgICB3ID0gZS5jbGllbnRXaWR0aDsKICAgICAgICBoID0gZS5jbGllbnRIZWlnaHQ7CiAgICAgIH0KICAgICAgcmV0dXJuIFtbMCwgMF0sIFt3LCBoXV07CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFRyYW5zZm9ybSQxKCkgewogICAgICByZXR1cm4gdGhpcy5fX3pvb20gfHwgaWRlbnRpdHkkbTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0V2hlZWxEZWx0YSQxKCkgewogICAgICByZXR1cm4gLWV2ZW50JDQuZGVsdGFZICogKGV2ZW50JDQuZGVsdGFNb2RlID8gMTIwIDogMSkgLyA1MDA7CiAgICB9CgogICAgZnVuY3Rpb24gZGVmYXVsdFRvdWNoYWJsZSQ0KCkgewogICAgICByZXR1cm4gIm9udG91Y2hzdGFydCIgaW4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZhdWx0Q29uc3RyYWluJDEodHJhbnNmb3JtLCBleHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkgewogICAgICB2YXIgZHgwID0gdHJhbnNmb3JtLmludmVydFgoZXh0ZW50WzBdWzBdKSAtIHRyYW5zbGF0ZUV4dGVudFswXVswXSwKICAgICAgICAgIGR4MSA9IHRyYW5zZm9ybS5pbnZlcnRYKGV4dGVudFsxXVswXSkgLSB0cmFuc2xhdGVFeHRlbnRbMV1bMF0sCiAgICAgICAgICBkeTAgPSB0cmFuc2Zvcm0uaW52ZXJ0WShleHRlbnRbMF1bMV0pIC0gdHJhbnNsYXRlRXh0ZW50WzBdWzFdLAogICAgICAgICAgZHkxID0gdHJhbnNmb3JtLmludmVydFkoZXh0ZW50WzFdWzFdKSAtIHRyYW5zbGF0ZUV4dGVudFsxXVsxXTsKICAgICAgcmV0dXJuIHRyYW5zZm9ybS50cmFuc2xhdGUoCiAgICAgICAgZHgxID4gZHgwID8gKGR4MCArIGR4MSkgLyAyIDogTWF0aC5taW4oMCwgZHgwKSB8fCBNYXRoLm1heCgwLCBkeDEpLAogICAgICAgIGR5MSA+IGR5MCA/IChkeTAgKyBkeTEpIC8gMiA6IE1hdGgubWluKDAsIGR5MCkgfHwgTWF0aC5tYXgoMCwgZHkxKQogICAgICApOwogICAgfQoKICAgIGZ1bmN0aW9uIHpvb20kMigpIHsKICAgICAgdmFyIGZpbHRlciA9IGRlZmF1bHRGaWx0ZXIkNSwKICAgICAgICAgIGV4dGVudCA9IGRlZmF1bHRFeHRlbnQkMywKICAgICAgICAgIGNvbnN0cmFpbiA9IGRlZmF1bHRDb25zdHJhaW4kMSwKICAgICAgICAgIHdoZWVsRGVsdGEgPSBkZWZhdWx0V2hlZWxEZWx0YSQxLAogICAgICAgICAgdG91Y2hhYmxlID0gZGVmYXVsdFRvdWNoYWJsZSQ0LAogICAgICAgICAgc2NhbGVFeHRlbnQgPSBbMCwgSW5maW5pdHldLAogICAgICAgICAgdHJhbnNsYXRlRXh0ZW50ID0gW1stSW5maW5pdHksIC1JbmZpbml0eV0sIFtJbmZpbml0eSwgSW5maW5pdHldXSwKICAgICAgICAgIGR1cmF0aW9uID0gMjUwLAogICAgICAgICAgaW50ZXJwb2xhdGUgPSBpbnRlcnBvbGF0ZVpvb20kMSwKICAgICAgICAgIGdlc3R1cmVzID0gW10sCiAgICAgICAgICBsaXN0ZW5lcnMgPSBkaXNwYXRjaCQ2KCJzdGFydCIsICJ6b29tIiwgImVuZCIpLAogICAgICAgICAgdG91Y2hzdGFydGluZywKICAgICAgICAgIHRvdWNoZW5kaW5nLAogICAgICAgICAgdG91Y2hEZWxheSA9IDUwMCwKICAgICAgICAgIHdoZWVsRGVsYXkgPSAxNTAsCiAgICAgICAgICBjbGlja0Rpc3RhbmNlMiA9IDA7CgogICAgICBmdW5jdGlvbiB6b29tKHNlbGVjdGlvbikgewogICAgICAgIHNlbGVjdGlvbgogICAgICAgICAgICAucHJvcGVydHkoIl9fem9vbSIsIGRlZmF1bHRUcmFuc2Zvcm0kMSkKICAgICAgICAgICAgLm9uKCJ3aGVlbC56b29tIiwgd2hlZWxlZCkKICAgICAgICAgICAgLm9uKCJtb3VzZWRvd24uem9vbSIsIG1vdXNlZG93bmVkKQogICAgICAgICAgICAub24oImRibGNsaWNrLnpvb20iLCBkYmxjbGlja2VkKQogICAgICAgICAgLmZpbHRlcih0b3VjaGFibGUpCiAgICAgICAgICAgIC5vbigidG91Y2hzdGFydC56b29tIiwgdG91Y2hzdGFydGVkKQogICAgICAgICAgICAub24oInRvdWNobW92ZS56b29tIiwgdG91Y2htb3ZlZCkKICAgICAgICAgICAgLm9uKCJ0b3VjaGVuZC56b29tIHRvdWNoY2FuY2VsLnpvb20iLCB0b3VjaGVuZGVkKQogICAgICAgICAgICAuc3R5bGUoInRvdWNoLWFjdGlvbiIsICJub25lIikKICAgICAgICAgICAgLnN0eWxlKCItd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3IiLCAicmdiYSgwLDAsMCwwKSIpOwogICAgICB9CgogICAgICB6b29tLnRyYW5zZm9ybSA9IGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHRyYW5zZm9ybSkgewogICAgICAgIHZhciBzZWxlY3Rpb24gPSBjb2xsZWN0aW9uLnNlbGVjdGlvbiA/IGNvbGxlY3Rpb24uc2VsZWN0aW9uKCkgOiBjb2xsZWN0aW9uOwogICAgICAgIHNlbGVjdGlvbi5wcm9wZXJ0eSgiX196b29tIiwgZGVmYXVsdFRyYW5zZm9ybSQxKTsKICAgICAgICBpZiAoY29sbGVjdGlvbiAhPT0gc2VsZWN0aW9uKSB7CiAgICAgICAgICBzY2hlZHVsZShjb2xsZWN0aW9uLCB0cmFuc2Zvcm0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZWxlY3Rpb24uaW50ZXJydXB0KCkuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpCiAgICAgICAgICAgICAgICAuc3RhcnQoKQogICAgICAgICAgICAgICAgLnpvb20obnVsbCwgdHlwZW9mIHRyYW5zZm9ybSA9PT0gImZ1bmN0aW9uIiA/IHRyYW5zZm9ybS5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogdHJhbnNmb3JtKQogICAgICAgICAgICAgICAgLmVuZCgpOwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgem9vbS5zY2FsZUJ5ID0gZnVuY3Rpb24oc2VsZWN0aW9uLCBrKSB7CiAgICAgICAgem9vbS5zY2FsZVRvKHNlbGVjdGlvbiwgZnVuY3Rpb24oKSB7CiAgICAgICAgICB2YXIgazAgPSB0aGlzLl9fem9vbS5rLAogICAgICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09ICJmdW5jdGlvbiIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrOwogICAgICAgICAgcmV0dXJuIGswICogazE7CiAgICAgICAgfSk7CiAgICAgIH07CgogICAgICB6b29tLnNjYWxlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIGspIHsKICAgICAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgICB0MCA9IHRoaXMuX196b29tLAogICAgICAgICAgICAgIHAwID0gY2VudHJvaWQoZSksCiAgICAgICAgICAgICAgcDEgPSB0MC5pbnZlcnQocDApLAogICAgICAgICAgICAgIGsxID0gdHlwZW9mIGsgPT09ICJmdW5jdGlvbiIgPyBrLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBrOwogICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodDAsIGsxKSwgcDAsIHAxKSwgZSwgdHJhbnNsYXRlRXh0ZW50KTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIHpvb20udHJhbnNsYXRlQnkgPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHkpIHsKICAgICAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbih0aGlzLl9fem9vbS50cmFuc2xhdGUoCiAgICAgICAgICAgIHR5cGVvZiB4ID09PSAiZnVuY3Rpb24iID8geC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogeCwKICAgICAgICAgICAgdHlwZW9mIHkgPT09ICJmdW5jdGlvbiIgPyB5LmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiB5CiAgICAgICAgICApLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTsKICAgICAgICB9KTsKICAgICAgfTsKCiAgICAgIHpvb20udHJhbnNsYXRlVG8gPSBmdW5jdGlvbihzZWxlY3Rpb24sIHgsIHkpIHsKICAgICAgICB6b29tLnRyYW5zZm9ybShzZWxlY3Rpb24sIGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIGUgPSBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgICB0ID0gdGhpcy5fX3pvb20sCiAgICAgICAgICAgICAgcCA9IGNlbnRyb2lkKGUpOwogICAgICAgICAgcmV0dXJuIGNvbnN0cmFpbihpZGVudGl0eSRtLnRyYW5zbGF0ZShwWzBdLCBwWzFdKS5zY2FsZSh0LmspLnRyYW5zbGF0ZSgKICAgICAgICAgICAgdHlwZW9mIHggPT09ICJmdW5jdGlvbiIgPyAteC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIDogLXgsCiAgICAgICAgICAgIHR5cGVvZiB5ID09PSAiZnVuY3Rpb24iID8gLXkuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IC15CiAgICAgICAgICApLCBlLCB0cmFuc2xhdGVFeHRlbnQpOwogICAgICAgIH0pOwogICAgICB9OwoKICAgICAgZnVuY3Rpb24gc2NhbGUodHJhbnNmb3JtLCBrKSB7CiAgICAgICAgayA9IE1hdGgubWF4KHNjYWxlRXh0ZW50WzBdLCBNYXRoLm1pbihzY2FsZUV4dGVudFsxXSwgaykpOwogICAgICAgIHJldHVybiBrID09PSB0cmFuc2Zvcm0uayA/IHRyYW5zZm9ybSA6IG5ldyBUcmFuc2Zvcm0kMShrLCB0cmFuc2Zvcm0ueCwgdHJhbnNmb3JtLnkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2xhdGUodHJhbnNmb3JtLCBwMCwgcDEpIHsKICAgICAgICB2YXIgeCA9IHAwWzBdIC0gcDFbMF0gKiB0cmFuc2Zvcm0uaywgeSA9IHAwWzFdIC0gcDFbMV0gKiB0cmFuc2Zvcm0uazsKICAgICAgICByZXR1cm4geCA9PT0gdHJhbnNmb3JtLnggJiYgeSA9PT0gdHJhbnNmb3JtLnkgPyB0cmFuc2Zvcm0gOiBuZXcgVHJhbnNmb3JtJDEodHJhbnNmb3JtLmssIHgsIHkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBjZW50cm9pZChleHRlbnQpIHsKICAgICAgICByZXR1cm4gWygrZXh0ZW50WzBdWzBdICsgK2V4dGVudFsxXVswXSkgLyAyLCAoK2V4dGVudFswXVsxXSArICtleHRlbnRbMV1bMV0pIC8gMl07CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlKHRyYW5zaXRpb24sIHRyYW5zZm9ybSwgY2VudGVyKSB7CiAgICAgICAgdHJhbnNpdGlvbgogICAgICAgICAgICAub24oInN0YXJ0Lnpvb20iLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLnN0YXJ0KCk7IH0pCiAgICAgICAgICAgIC5vbigiaW50ZXJydXB0Lnpvb20gZW5kLnpvb20iLCBmdW5jdGlvbigpIHsgZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgICAudHdlZW4oInpvb20iLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgICAgICAgIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgICAgICAgIGcgPSBnZXN0dXJlKHRoYXQsIGFyZ3MpLAogICAgICAgICAgICAgICAgICBlID0gZXh0ZW50LmFwcGx5KHRoYXQsIGFyZ3MpLAogICAgICAgICAgICAgICAgICBwID0gY2VudGVyIHx8IGNlbnRyb2lkKGUpLAogICAgICAgICAgICAgICAgICB3ID0gTWF0aC5tYXgoZVsxXVswXSAtIGVbMF1bMF0sIGVbMV1bMV0gLSBlWzBdWzFdKSwKICAgICAgICAgICAgICAgICAgYSA9IHRoYXQuX196b29tLAogICAgICAgICAgICAgICAgICBiID0gdHlwZW9mIHRyYW5zZm9ybSA9PT0gImZ1bmN0aW9uIiA/IHRyYW5zZm9ybS5hcHBseSh0aGF0LCBhcmdzKSA6IHRyYW5zZm9ybSwKICAgICAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlKGEuaW52ZXJ0KHApLmNvbmNhdCh3IC8gYS5rKSwgYi5pbnZlcnQocCkuY29uY2F0KHcgLyBiLmspKTsKICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgICAgICAgaWYgKHQgPT09IDEpIHQgPSBiOyAvLyBBdm9pZCByb3VuZGluZyBlcnJvciBvbiBlbmQuCiAgICAgICAgICAgICAgICBlbHNlIHsgdmFyIGwgPSBpKHQpLCBrID0gdyAvIGxbMl07IHQgPSBuZXcgVHJhbnNmb3JtJDEoaywgcFswXSAtIGxbMF0gKiBrLCBwWzFdIC0gbFsxXSAqIGspOyB9CiAgICAgICAgICAgICAgICBnLnpvb20obnVsbCwgdCk7CiAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGdlc3R1cmUodGhhdCwgYXJncykgewogICAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gZ2VzdHVyZXMubGVuZ3RoLCBnOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKGcgPSBnZXN0dXJlc1tpXSkudGhhdCA9PT0gdGhhdCkgewogICAgICAgICAgICByZXR1cm4gZzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBHZXN0dXJlKHRoYXQsIGFyZ3MpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBHZXN0dXJlKHRoYXQsIGFyZ3MpIHsKICAgICAgICB0aGlzLnRoYXQgPSB0aGF0OwogICAgICAgIHRoaXMuYXJncyA9IGFyZ3M7CiAgICAgICAgdGhpcy5pbmRleCA9IC0xOwogICAgICAgIHRoaXMuYWN0aXZlID0gMDsKICAgICAgICB0aGlzLmV4dGVudCA9IGV4dGVudC5hcHBseSh0aGF0LCBhcmdzKTsKICAgICAgfQoKICAgICAgR2VzdHVyZS5wcm90b3R5cGUgPSB7CiAgICAgICAgc3RhcnQ6IGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKCsrdGhpcy5hY3RpdmUgPT09IDEpIHsKICAgICAgICAgICAgdGhpcy5pbmRleCA9IGdlc3R1cmVzLnB1c2godGhpcykgLSAxOwogICAgICAgICAgICB0aGlzLmVtaXQoInN0YXJ0Iik7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIHpvb206IGZ1bmN0aW9uKGtleSwgdHJhbnNmb3JtKSB7CiAgICAgICAgICBpZiAodGhpcy5tb3VzZSAmJiBrZXkgIT09ICJtb3VzZSIpIHRoaXMubW91c2VbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMubW91c2VbMF0pOwogICAgICAgICAgaWYgKHRoaXMudG91Y2gwICYmIGtleSAhPT0gInRvdWNoIikgdGhpcy50b3VjaDBbMV0gPSB0cmFuc2Zvcm0uaW52ZXJ0KHRoaXMudG91Y2gwWzBdKTsKICAgICAgICAgIGlmICh0aGlzLnRvdWNoMSAmJiBrZXkgIT09ICJ0b3VjaCIpIHRoaXMudG91Y2gxWzFdID0gdHJhbnNmb3JtLmludmVydCh0aGlzLnRvdWNoMVswXSk7CiAgICAgICAgICB0aGlzLnRoYXQuX196b29tID0gdHJhbnNmb3JtOwogICAgICAgICAgdGhpcy5lbWl0KCJ6b29tIik7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICBnZXN0dXJlcy5zcGxpY2UodGhpcy5pbmRleCwgMSk7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAtMTsKICAgICAgICAgICAgdGhpcy5lbWl0KCJlbmQiKTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCiAgICAgICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgY3VzdG9tRXZlbnQkNChuZXcgWm9vbUV2ZW50JDEoem9vbSwgdHlwZSwgdGhpcy50aGF0Ll9fem9vbSksIGxpc3RlbmVycy5hcHBseSwgbGlzdGVuZXJzLCBbdHlwZSwgdGhpcy50aGF0LCB0aGlzLmFyZ3NdKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBmdW5jdGlvbiB3aGVlbGVkKCkgewogICAgICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgdCA9IHRoaXMuX196b29tLAogICAgICAgICAgICBrID0gTWF0aC5tYXgoc2NhbGVFeHRlbnRbMF0sIE1hdGgubWluKHNjYWxlRXh0ZW50WzFdLCB0LmsgKiBNYXRoLnBvdygyLCB3aGVlbERlbHRhLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpKSksCiAgICAgICAgICAgIHAgPSBtb3VzZSQ0KHRoaXMpOwoKICAgICAgICAvLyBJZiB0aGUgbW91c2UgaXMgaW4gdGhlIHNhbWUgbG9jYXRpb24gYXMgYmVmb3JlLCByZXVzZSBpdC4KICAgICAgICAvLyBJZiB0aGVyZSB3ZXJlIHJlY2VudCB3aGVlbCBldmVudHMsIHJlc2V0IHRoZSB3aGVlbCBpZGxlIHRpbWVvdXQuCiAgICAgICAgaWYgKGcud2hlZWwpIHsKICAgICAgICAgIGlmIChnLm1vdXNlWzBdWzBdICE9PSBwWzBdIHx8IGcubW91c2VbMF1bMV0gIT09IHBbMV0pIHsKICAgICAgICAgICAgZy5tb3VzZVsxXSA9IHQuaW52ZXJ0KGcubW91c2VbMF0gPSBwKTsKICAgICAgICAgIH0KICAgICAgICAgIGNsZWFyVGltZW91dChnLndoZWVsKTsKICAgICAgICB9CgogICAgICAgIC8vIElmIHRoaXMgd2hlZWwgZXZlbnQgd29u4oCZdCB0cmlnZ2VyIGEgdHJhbnNmb3JtIGNoYW5nZSwgaWdub3JlIGl0LgogICAgICAgIGVsc2UgaWYgKHQuayA9PT0gaykgcmV0dXJuOwoKICAgICAgICAvLyBPdGhlcndpc2UsIGNhcHR1cmUgdGhlIG1vdXNlIHBvaW50IGFuZCBsb2NhdGlvbiBhdCB0aGUgc3RhcnQuCiAgICAgICAgZWxzZSB7CiAgICAgICAgICBnLm1vdXNlID0gW3AsIHQuaW52ZXJ0KHApXTsKICAgICAgICAgIGludGVycnVwdCQzKHRoaXMpOwogICAgICAgICAgZy5zdGFydCgpOwogICAgICAgIH0KCiAgICAgICAgbm9ldmVudCQ3KCk7CiAgICAgICAgZy53aGVlbCA9IHNldFRpbWVvdXQod2hlZWxpZGxlZCwgd2hlZWxEZWxheSk7CiAgICAgICAgZy56b29tKCJtb3VzZSIsIGNvbnN0cmFpbih0cmFuc2xhdGUoc2NhbGUodCwgayksIGcubW91c2VbMF0sIGcubW91c2VbMV0pLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7CgogICAgICAgIGZ1bmN0aW9uIHdoZWVsaWRsZWQoKSB7CiAgICAgICAgICBnLndoZWVsID0gbnVsbDsKICAgICAgICAgIGcuZW5kKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBtb3VzZWRvd25lZCgpIHsKICAgICAgICBpZiAodG91Y2hlbmRpbmcgfHwgIWZpbHRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpKSByZXR1cm47CiAgICAgICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIHYgPSBzZWxlY3QkNChldmVudCQ0LnZpZXcpLm9uKCJtb3VzZW1vdmUuem9vbSIsIG1vdXNlbW92ZWQsIHRydWUpLm9uKCJtb3VzZXVwLnpvb20iLCBtb3VzZXVwcGVkLCB0cnVlKSwKICAgICAgICAgICAgcCA9IG1vdXNlJDQodGhpcyksCiAgICAgICAgICAgIHgwID0gZXZlbnQkNC5jbGllbnRYLAogICAgICAgICAgICB5MCA9IGV2ZW50JDQuY2xpZW50WTsKCiAgICAgICAgZHJhZ0Rpc2FibGUkMihldmVudCQ0LnZpZXcpOwogICAgICAgIG5vcHJvcGFnYXRpb24kNSgpOwogICAgICAgIGcubW91c2UgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApXTsKICAgICAgICBpbnRlcnJ1cHQkMyh0aGlzKTsKICAgICAgICBnLnN0YXJ0KCk7CgogICAgICAgIGZ1bmN0aW9uIG1vdXNlbW92ZWQoKSB7CiAgICAgICAgICBub2V2ZW50JDcoKTsKICAgICAgICAgIGlmICghZy5tb3ZlZCkgewogICAgICAgICAgICB2YXIgZHggPSBldmVudCQ0LmNsaWVudFggLSB4MCwgZHkgPSBldmVudCQ0LmNsaWVudFkgLSB5MDsKICAgICAgICAgICAgZy5tb3ZlZCA9IGR4ICogZHggKyBkeSAqIGR5ID4gY2xpY2tEaXN0YW5jZTI7CiAgICAgICAgICB9CiAgICAgICAgICBnLnpvb20oIm1vdXNlIiwgY29uc3RyYWluKHRyYW5zbGF0ZShnLnRoYXQuX196b29tLCBnLm1vdXNlWzBdID0gbW91c2UkNChnLnRoYXQpLCBnLm1vdXNlWzFdKSwgZy5leHRlbnQsIHRyYW5zbGF0ZUV4dGVudCkpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW91c2V1cHBlZCgpIHsKICAgICAgICAgIHYub24oIm1vdXNlbW92ZS56b29tIG1vdXNldXAuem9vbSIsIG51bGwpOwogICAgICAgICAgeWVzZHJhZyQzKGV2ZW50JDQudmlldywgZy5tb3ZlZCk7CiAgICAgICAgICBub2V2ZW50JDcoKTsKICAgICAgICAgIGcuZW5kKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBkYmxjbGlja2VkKCkgewogICAgICAgIGlmICghZmlsdGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykpIHJldHVybjsKICAgICAgICB2YXIgdDAgPSB0aGlzLl9fem9vbSwKICAgICAgICAgICAgcDAgPSBtb3VzZSQ0KHRoaXMpLAogICAgICAgICAgICBwMSA9IHQwLmludmVydChwMCksCiAgICAgICAgICAgIGsxID0gdDAuayAqIChldmVudCQ0LnNoaWZ0S2V5ID8gMC41IDogMiksCiAgICAgICAgICAgIHQxID0gY29uc3RyYWluKHRyYW5zbGF0ZShzY2FsZSh0MCwgazEpLCBwMCwgcDEpLCBleHRlbnQuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdHJhbnNsYXRlRXh0ZW50KTsKCiAgICAgICAgbm9ldmVudCQ3KCk7CiAgICAgICAgaWYgKGR1cmF0aW9uID4gMCkgc2VsZWN0JDQodGhpcykudHJhbnNpdGlvbigpLmR1cmF0aW9uKGR1cmF0aW9uKS5jYWxsKHNjaGVkdWxlLCB0MSwgcDApOwogICAgICAgIGVsc2Ugc2VsZWN0JDQodGhpcykuY2FsbCh6b29tLnRyYW5zZm9ybSwgdDEpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaHN0YXJ0ZWQoKSB7CiAgICAgICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwogICAgICAgIHZhciBnID0gZ2VzdHVyZSh0aGlzLCBhcmd1bWVudHMpLAogICAgICAgICAgICB0b3VjaGVzID0gZXZlbnQkNC5jaGFuZ2VkVG91Y2hlcywKICAgICAgICAgICAgc3RhcnRlZCwKICAgICAgICAgICAgbiA9IHRvdWNoZXMubGVuZ3RoLCBpLCB0LCBwOwoKICAgICAgICBub3Byb3BhZ2F0aW9uJDUoKTsKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB0ID0gdG91Y2hlc1tpXSwgcCA9IHRvdWNoJDModGhpcywgdG91Y2hlcywgdC5pZGVudGlmaWVyKTsKICAgICAgICAgIHAgPSBbcCwgdGhpcy5fX3pvb20uaW52ZXJ0KHApLCB0LmlkZW50aWZpZXJdOwogICAgICAgICAgaWYgKCFnLnRvdWNoMCkgZy50b3VjaDAgPSBwLCBzdGFydGVkID0gdHJ1ZTsKICAgICAgICAgIGVsc2UgaWYgKCFnLnRvdWNoMSkgZy50b3VjaDEgPSBwOwogICAgICAgIH0KCiAgICAgICAgLy8gSWYgdGhpcyBpcyBhIGRibHRhcCwgcmVyb3V0ZSB0byB0aGUgKG9wdGlvbmFsKSBkYmxjbGljay56b29tIGhhbmRsZXIuCiAgICAgICAgaWYgKHRvdWNoc3RhcnRpbmcpIHsKICAgICAgICAgIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7CiAgICAgICAgICBpZiAoIWcudG91Y2gxKSB7CiAgICAgICAgICAgIGcuZW5kKCk7CiAgICAgICAgICAgIHAgPSBzZWxlY3QkNCh0aGlzKS5vbigiZGJsY2xpY2suem9vbSIpOwogICAgICAgICAgICBpZiAocCkgcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoc3RhcnRlZCkgewogICAgICAgICAgdG91Y2hzdGFydGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoc3RhcnRpbmcgPSBudWxsOyB9LCB0b3VjaERlbGF5KTsKICAgICAgICAgIGludGVycnVwdCQzKHRoaXMpOwogICAgICAgICAgZy5zdGFydCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gdG91Y2htb3ZlZCgpIHsKICAgICAgICB2YXIgZyA9IGdlc3R1cmUodGhpcywgYXJndW1lbnRzKSwKICAgICAgICAgICAgdG91Y2hlcyA9IGV2ZW50JDQuY2hhbmdlZFRvdWNoZXMsCiAgICAgICAgICAgIG4gPSB0b3VjaGVzLmxlbmd0aCwgaSwgdCwgcCwgbDsKCiAgICAgICAgbm9ldmVudCQ3KCk7CiAgICAgICAgaWYgKHRvdWNoc3RhcnRpbmcpIHRvdWNoc3RhcnRpbmcgPSBjbGVhclRpbWVvdXQodG91Y2hzdGFydGluZyk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdCA9IHRvdWNoZXNbaV0sIHAgPSB0b3VjaCQzKHRoaXMsIHRvdWNoZXMsIHQuaWRlbnRpZmllcik7CiAgICAgICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDBbMF0gPSBwOwogICAgICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZy50b3VjaDFbMF0gPSBwOwogICAgICAgIH0KICAgICAgICB0ID0gZy50aGF0Ll9fem9vbTsKICAgICAgICBpZiAoZy50b3VjaDEpIHsKICAgICAgICAgIHZhciBwMCA9IGcudG91Y2gwWzBdLCBsMCA9IGcudG91Y2gwWzFdLAogICAgICAgICAgICAgIHAxID0gZy50b3VjaDFbMF0sIGwxID0gZy50b3VjaDFbMV0sCiAgICAgICAgICAgICAgZHAgPSAoZHAgPSBwMVswXSAtIHAwWzBdKSAqIGRwICsgKGRwID0gcDFbMV0gLSBwMFsxXSkgKiBkcCwKICAgICAgICAgICAgICBkbCA9IChkbCA9IGwxWzBdIC0gbDBbMF0pICogZGwgKyAoZGwgPSBsMVsxXSAtIGwwWzFdKSAqIGRsOwogICAgICAgICAgdCA9IHNjYWxlKHQsIE1hdGguc3FydChkcCAvIGRsKSk7CiAgICAgICAgICBwID0gWyhwMFswXSArIHAxWzBdKSAvIDIsIChwMFsxXSArIHAxWzFdKSAvIDJdOwogICAgICAgICAgbCA9IFsobDBbMF0gKyBsMVswXSkgLyAyLCAobDBbMV0gKyBsMVsxXSkgLyAyXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZy50b3VjaDApIHAgPSBnLnRvdWNoMFswXSwgbCA9IGcudG91Y2gwWzFdOwogICAgICAgIGVsc2UgcmV0dXJuOwogICAgICAgIGcuem9vbSgidG91Y2giLCBjb25zdHJhaW4odHJhbnNsYXRlKHQsIHAsIGwpLCBnLmV4dGVudCwgdHJhbnNsYXRlRXh0ZW50KSk7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHRvdWNoZW5kZWQoKSB7CiAgICAgICAgdmFyIGcgPSBnZXN0dXJlKHRoaXMsIGFyZ3VtZW50cyksCiAgICAgICAgICAgIHRvdWNoZXMgPSBldmVudCQ0LmNoYW5nZWRUb3VjaGVzLAogICAgICAgICAgICBuID0gdG91Y2hlcy5sZW5ndGgsIGksIHQ7CgogICAgICAgIG5vcHJvcGFnYXRpb24kNSgpOwogICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTsKICAgICAgICB0b3VjaGVuZGluZyA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHRvdWNoZW5kaW5nID0gbnVsbDsgfSwgdG91Y2hEZWxheSk7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgdCA9IHRvdWNoZXNbaV07CiAgICAgICAgICBpZiAoZy50b3VjaDAgJiYgZy50b3VjaDBbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gwOwogICAgICAgICAgZWxzZSBpZiAoZy50b3VjaDEgJiYgZy50b3VjaDFbMl0gPT09IHQuaWRlbnRpZmllcikgZGVsZXRlIGcudG91Y2gxOwogICAgICAgIH0KICAgICAgICBpZiAoZy50b3VjaDEgJiYgIWcudG91Y2gwKSBnLnRvdWNoMCA9IGcudG91Y2gxLCBkZWxldGUgZy50b3VjaDE7CiAgICAgICAgaWYgKGcudG91Y2gwKSBnLnRvdWNoMFsxXSA9IHRoaXMuX196b29tLmludmVydChnLnRvdWNoMFswXSk7CiAgICAgICAgZWxzZSBnLmVuZCgpOwogICAgICB9CgogICAgICB6b29tLndoZWVsRGVsdGEgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAod2hlZWxEZWx0YSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHkoK18pLCB6b29tKSA6IHdoZWVsRGVsdGE7CiAgICAgIH07CgogICAgICB6b29tLmZpbHRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChmaWx0ZXIgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCR5KCEhXyksIHpvb20pIDogZmlsdGVyOwogICAgICB9OwoKICAgICAgem9vbS50b3VjaGFibGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodG91Y2hhYmxlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkeSghIV8pLCB6b29tKSA6IHRvdWNoYWJsZTsKICAgICAgfTsKCiAgICAgIHpvb20uZXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGV4dGVudCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JHkoW1srX1swXVswXSwgK19bMF1bMV1dLCBbK19bMV1bMF0sICtfWzFdWzFdXV0pLCB6b29tKSA6IGV4dGVudDsKICAgICAgfTsKCiAgICAgIHpvb20uc2NhbGVFeHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoc2NhbGVFeHRlbnRbMF0gPSArX1swXSwgc2NhbGVFeHRlbnRbMV0gPSArX1sxXSwgem9vbSkgOiBbc2NhbGVFeHRlbnRbMF0sIHNjYWxlRXh0ZW50WzFdXTsKICAgICAgfTsKCiAgICAgIHpvb20udHJhbnNsYXRlRXh0ZW50ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRyYW5zbGF0ZUV4dGVudFswXVswXSA9ICtfWzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMF0gPSArX1sxXVswXSwgdHJhbnNsYXRlRXh0ZW50WzBdWzFdID0gK19bMF1bMV0sIHRyYW5zbGF0ZUV4dGVudFsxXVsxXSA9ICtfWzFdWzFdLCB6b29tKSA6IFtbdHJhbnNsYXRlRXh0ZW50WzBdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMF1bMV1dLCBbdHJhbnNsYXRlRXh0ZW50WzFdWzBdLCB0cmFuc2xhdGVFeHRlbnRbMV1bMV1dXTsKICAgICAgfTsKCiAgICAgIHpvb20uY29uc3RyYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNvbnN0cmFpbiA9IF8sIHpvb20pIDogY29uc3RyYWluOwogICAgICB9OwoKICAgICAgem9vbS5kdXJhdGlvbiA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkdXJhdGlvbiA9ICtfLCB6b29tKSA6IGR1cmF0aW9uOwogICAgICB9OwoKICAgICAgem9vbS5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChpbnRlcnBvbGF0ZSA9IF8sIHpvb20pIDogaW50ZXJwb2xhdGU7CiAgICAgIH07CgogICAgICB6b29tLm9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IHpvb20gOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIHpvb20uY2xpY2tEaXN0YW5jZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjbGlja0Rpc3RhbmNlMiA9IChfID0gK18pICogXywgem9vbSkgOiBNYXRoLnNxcnQoY2xpY2tEaXN0YW5jZTIpOwogICAgICB9OwoKICAgICAgcmV0dXJuIHpvb207CiAgICB9CgogICAgdmFyIGQzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uJDIsCiAgICAgICAgYmlzZWN0OiBiaXNlY3RSaWdodCQxLAogICAgICAgIGJpc2VjdFJpZ2h0OiBiaXNlY3RSaWdodCQxLAogICAgICAgIGJpc2VjdExlZnQ6IGJpc2VjdExlZnQkMSwKICAgICAgICBhc2NlbmRpbmc6IGFzY2VuZGluZyQ0LAogICAgICAgIGJpc2VjdG9yOiBiaXNlY3RvciQxLAogICAgICAgIGNyb3NzOiBjcm9zcyQzLAogICAgICAgIGRlc2NlbmRpbmc6IGRlc2NlbmRpbmckMywKICAgICAgICBkZXZpYXRpb246IGRldmlhdGlvbiQxLAogICAgICAgIGV4dGVudDogZXh0ZW50JDIsCiAgICAgICAgaGlzdG9ncmFtOiBoaXN0b2dyYW0kMSwKICAgICAgICB0aHJlc2hvbGRGcmVlZG1hbkRpYWNvbmlzOiBmcmVlZG1hbkRpYWNvbmlzJDEsCiAgICAgICAgdGhyZXNob2xkU2NvdHQ6IHNjb3R0JDEsCiAgICAgICAgdGhyZXNob2xkU3R1cmdlczogc3R1cmdlcywKICAgICAgICBtYXg6IG1heCQzLAogICAgICAgIG1lYW46IG1lYW4kMSwKICAgICAgICBtZWRpYW46IG1lZGlhbiQxLAogICAgICAgIG1lcmdlOiBtZXJnZSQxLAogICAgICAgIG1pbjogbWluJDIsCiAgICAgICAgcGFpcnM6IHBhaXJzJDEsCiAgICAgICAgcGVybXV0ZTogcGVybXV0ZSQxLAogICAgICAgIHF1YW50aWxlOiBxdWFudGlsZSQxLAogICAgICAgIHJhbmdlOiByYW5nZSQxLAogICAgICAgIHNjYW46IHNjYW4kMSwKICAgICAgICBzaHVmZmxlOiBzaHVmZmxlJDIsCiAgICAgICAgc3VtOiBzdW0kMywKICAgICAgICB0aWNrczogdGlja3MkMSwKICAgICAgICB0aWNrSW5jcmVtZW50OiB0aWNrSW5jcmVtZW50JDEsCiAgICAgICAgdGlja1N0ZXA6IHRpY2tTdGVwJDEsCiAgICAgICAgdHJhbnNwb3NlOiB0cmFuc3Bvc2UkMSwKICAgICAgICB2YXJpYW5jZTogdmFyaWFuY2UkMSwKICAgICAgICB6aXA6IHppcCQxLAogICAgICAgIGF4aXNUb3A6IGF4aXNUb3AkMSwKICAgICAgICBheGlzUmlnaHQ6IGF4aXNSaWdodCQxLAogICAgICAgIGF4aXNCb3R0b206IGF4aXNCb3R0b20kMSwKICAgICAgICBheGlzTGVmdDogYXhpc0xlZnQkMSwKICAgICAgICBicnVzaDogYnJ1c2gkMiwKICAgICAgICBicnVzaFg6IGJydXNoWCQxLAogICAgICAgIGJydXNoWTogYnJ1c2hZJDEsCiAgICAgICAgYnJ1c2hTZWxlY3Rpb246IGJydXNoU2VsZWN0aW9uJDEsCiAgICAgICAgY2hvcmQ6IGNob3JkJDEsCiAgICAgICAgcmliYm9uOiByaWJib24kMSwKICAgICAgICBuZXN0OiBuZXN0JDEsCiAgICAgICAgc2V0OiBzZXQkNiwKICAgICAgICBtYXA6IG1hcCQ1LAogICAgICAgIGtleXM6IGtleXMkMSwKICAgICAgICB2YWx1ZXM6IHZhbHVlcyQxLAogICAgICAgIGVudHJpZXM6IGVudHJpZXMkMSwKICAgICAgICBjb2xvcjogY29sb3IkMiwKICAgICAgICByZ2I6IHJnYiQyLAogICAgICAgIGhzbDogaHNsJDQsCiAgICAgICAgbGFiOiBsYWIkMiwKICAgICAgICBoY2w6IGhjbCQzLAogICAgICAgIGN1YmVoZWxpeDogY3ViZWhlbGl4JDQsCiAgICAgICAgZGlzcGF0Y2g6IGRpc3BhdGNoJDIsCiAgICAgICAgZHJhZzogZHJhZyQxLAogICAgICAgIGRyYWdEaXNhYmxlOiBub2RyYWcsCiAgICAgICAgZHJhZ0VuYWJsZTogeWVzZHJhZyQyLAogICAgICAgIGRzdkZvcm1hdDogZHN2JDEsCiAgICAgICAgY3N2UGFyc2U6IGNzdlBhcnNlJDEsCiAgICAgICAgY3N2UGFyc2VSb3dzOiBjc3ZQYXJzZVJvd3MkMSwKICAgICAgICBjc3ZGb3JtYXQ6IGNzdkZvcm1hdCQxLAogICAgICAgIGNzdkZvcm1hdFJvd3M6IGNzdkZvcm1hdFJvd3MkMSwKICAgICAgICB0c3ZQYXJzZTogdHN2UGFyc2UkMSwKICAgICAgICB0c3ZQYXJzZVJvd3M6IHRzdlBhcnNlUm93cyQxLAogICAgICAgIHRzdkZvcm1hdDogdHN2Rm9ybWF0JDEsCiAgICAgICAgdHN2Rm9ybWF0Um93czogdHN2Rm9ybWF0Um93cyQxLAogICAgICAgIGVhc2VMaW5lYXI6IGxpbmVhciQ0LAogICAgICAgIGVhc2VRdWFkOiBxdWFkSW5PdXQkMSwKICAgICAgICBlYXNlUXVhZEluOiBxdWFkSW4kMSwKICAgICAgICBlYXNlUXVhZE91dDogcXVhZE91dCQxLAogICAgICAgIGVhc2VRdWFkSW5PdXQ6IHF1YWRJbk91dCQxLAogICAgICAgIGVhc2VDdWJpYzogY3ViaWNJbk91dCQxLAogICAgICAgIGVhc2VDdWJpY0luOiBjdWJpY0luJDEsCiAgICAgICAgZWFzZUN1YmljT3V0OiBjdWJpY091dCQxLAogICAgICAgIGVhc2VDdWJpY0luT3V0OiBjdWJpY0luT3V0JDEsCiAgICAgICAgZWFzZVBvbHk6IHBvbHlJbk91dCQxLAogICAgICAgIGVhc2VQb2x5SW46IHBvbHlJbiQxLAogICAgICAgIGVhc2VQb2x5T3V0OiBwb2x5T3V0JDEsCiAgICAgICAgZWFzZVBvbHlJbk91dDogcG9seUluT3V0JDEsCiAgICAgICAgZWFzZVNpbjogc2luSW5PdXQkMSwKICAgICAgICBlYXNlU2luSW46IHNpbkluJDEsCiAgICAgICAgZWFzZVNpbk91dDogc2luT3V0JDEsCiAgICAgICAgZWFzZVNpbkluT3V0OiBzaW5Jbk91dCQxLAogICAgICAgIGVhc2VFeHA6IGV4cEluT3V0JDEsCiAgICAgICAgZWFzZUV4cEluOiBleHBJbiQxLAogICAgICAgIGVhc2VFeHBPdXQ6IGV4cE91dCQxLAogICAgICAgIGVhc2VFeHBJbk91dDogZXhwSW5PdXQkMSwKICAgICAgICBlYXNlQ2lyY2xlOiBjaXJjbGVJbk91dCQxLAogICAgICAgIGVhc2VDaXJjbGVJbjogY2lyY2xlSW4kMSwKICAgICAgICBlYXNlQ2lyY2xlT3V0OiBjaXJjbGVPdXQkMSwKICAgICAgICBlYXNlQ2lyY2xlSW5PdXQ6IGNpcmNsZUluT3V0JDEsCiAgICAgICAgZWFzZUJvdW5jZTogYm91bmNlT3V0JDEsCiAgICAgICAgZWFzZUJvdW5jZUluOiBib3VuY2VJbiQxLAogICAgICAgIGVhc2VCb3VuY2VPdXQ6IGJvdW5jZU91dCQxLAogICAgICAgIGVhc2VCb3VuY2VJbk91dDogYm91bmNlSW5PdXQkMSwKICAgICAgICBlYXNlQmFjazogYmFja0luT3V0JDEsCiAgICAgICAgZWFzZUJhY2tJbjogYmFja0luJDEsCiAgICAgICAgZWFzZUJhY2tPdXQ6IGJhY2tPdXQkMSwKICAgICAgICBlYXNlQmFja0luT3V0OiBiYWNrSW5PdXQkMSwKICAgICAgICBlYXNlRWxhc3RpYzogZWxhc3RpY091dCQxLAogICAgICAgIGVhc2VFbGFzdGljSW46IGVsYXN0aWNJbiQxLAogICAgICAgIGVhc2VFbGFzdGljT3V0OiBlbGFzdGljT3V0JDEsCiAgICAgICAgZWFzZUVsYXN0aWNJbk91dDogZWxhc3RpY0luT3V0JDEsCiAgICAgICAgZm9yY2VDZW50ZXI6IGNlbnRlciQzLAogICAgICAgIGZvcmNlQ29sbGlkZTogY29sbGlkZSQxLAogICAgICAgIGZvcmNlTGluazogbGluayQzLAogICAgICAgIGZvcmNlTWFueUJvZHk6IG1hbnlCb2R5JDEsCiAgICAgICAgZm9yY2VSYWRpYWw6IHJhZGlhbCQxLAogICAgICAgIGZvcmNlU2ltdWxhdGlvbjogc2ltdWxhdGlvbiQxLAogICAgICAgIGZvcmNlWDogeCQ3LAogICAgICAgIGZvcmNlWTogeSQ3LAogICAgICAgIGZvcm1hdERlZmF1bHRMb2NhbGU6IGRlZmF1bHRMb2NhbGUkMiwKICAgICAgICBnZXQgZm9ybWF0ICgpIHsgcmV0dXJuIGZvcm1hdCQxOyB9LAogICAgICAgIGdldCBmb3JtYXRQcmVmaXggKCkgeyByZXR1cm4gZm9ybWF0UHJlZml4JDE7IH0sCiAgICAgICAgZm9ybWF0TG9jYWxlOiBmb3JtYXRMb2NhbGUkMiwKICAgICAgICBmb3JtYXRTcGVjaWZpZXI6IGZvcm1hdFNwZWNpZmllciQxLAogICAgICAgIHByZWNpc2lvbkZpeGVkOiBwcmVjaXNpb25GaXhlZCQxLAogICAgICAgIHByZWNpc2lvblByZWZpeDogcHJlY2lzaW9uUHJlZml4JDEsCiAgICAgICAgcHJlY2lzaW9uUm91bmQ6IHByZWNpc2lvblJvdW5kJDEsCiAgICAgICAgZ2VvQXJlYTogYXJlYSQ0LAogICAgICAgIGdlb0JvdW5kczogYm91bmRzJDEsCiAgICAgICAgZ2VvQ2VudHJvaWQ6IGNlbnRyb2lkJDIsCiAgICAgICAgZ2VvQ2lyY2xlOiBjaXJjbGUkMywKICAgICAgICBnZW9DbGlwQW50aW1lcmlkaWFuOiBjbGlwQW50aW1lcmlkaWFuJDEsCiAgICAgICAgZ2VvQ2xpcENpcmNsZTogY2xpcENpcmNsZSQxLAogICAgICAgIGdlb0NsaXBFeHRlbnQ6IGV4dGVudCQzLAogICAgICAgIGdlb0NsaXBSZWN0YW5nbGU6IGNsaXBSZWN0YW5nbGUkMSwKICAgICAgICBnZW9Db250YWluczogY29udGFpbnMkMywKICAgICAgICBnZW9EaXN0YW5jZTogZGlzdGFuY2UkMSwKICAgICAgICBnZW9HcmF0aWN1bGU6IGdyYXRpY3VsZSQxLAogICAgICAgIGdlb0dyYXRpY3VsZTEwOiBncmF0aWN1bGUxMCQxLAogICAgICAgIGdlb0ludGVycG9sYXRlOiBpbnRlcnBvbGF0ZSQ0LAogICAgICAgIGdlb0xlbmd0aDogbGVuZ3RoJDQsCiAgICAgICAgZ2VvUGF0aDogaW5kZXgkNSwKICAgICAgICBnZW9BbGJlcnM6IGFsYmVycyQxLAogICAgICAgIGdlb0FsYmVyc1VzYTogYWxiZXJzVXNhJDEsCiAgICAgICAgZ2VvQXppbXV0aGFsRXF1YWxBcmVhOiBhemltdXRoYWxFcXVhbEFyZWEkMSwKICAgICAgICBnZW9BemltdXRoYWxFcXVhbEFyZWFSYXc6IGF6aW11dGhhbEVxdWFsQXJlYVJhdyQxLAogICAgICAgIGdlb0F6aW11dGhhbEVxdWlkaXN0YW50OiBhemltdXRoYWxFcXVpZGlzdGFudCQxLAogICAgICAgIGdlb0F6aW11dGhhbEVxdWlkaXN0YW50UmF3OiBhemltdXRoYWxFcXVpZGlzdGFudFJhdyQxLAogICAgICAgIGdlb0NvbmljQ29uZm9ybWFsOiBjb25pY0NvbmZvcm1hbCQxLAogICAgICAgIGdlb0NvbmljQ29uZm9ybWFsUmF3OiBjb25pY0NvbmZvcm1hbFJhdyQxLAogICAgICAgIGdlb0NvbmljRXF1YWxBcmVhOiBjb25pY0VxdWFsQXJlYSQxLAogICAgICAgIGdlb0NvbmljRXF1YWxBcmVhUmF3OiBjb25pY0VxdWFsQXJlYVJhdyQxLAogICAgICAgIGdlb0NvbmljRXF1aWRpc3RhbnQ6IGNvbmljRXF1aWRpc3RhbnQkMSwKICAgICAgICBnZW9Db25pY0VxdWlkaXN0YW50UmF3OiBjb25pY0VxdWlkaXN0YW50UmF3JDEsCiAgICAgICAgZ2VvRXF1aXJlY3Rhbmd1bGFyOiBlcXVpcmVjdGFuZ3VsYXIkMSwKICAgICAgICBnZW9FcXVpcmVjdGFuZ3VsYXJSYXc6IGVxdWlyZWN0YW5ndWxhclJhdyQxLAogICAgICAgIGdlb0dub21vbmljOiBnbm9tb25pYyQxLAogICAgICAgIGdlb0dub21vbmljUmF3OiBnbm9tb25pY1JhdyQxLAogICAgICAgIGdlb0lkZW50aXR5OiBpZGVudGl0eSRmLAogICAgICAgIGdlb1Byb2plY3Rpb246IHByb2plY3Rpb24kMSwKICAgICAgICBnZW9Qcm9qZWN0aW9uTXV0YXRvcjogcHJvamVjdGlvbk11dGF0b3IkMSwKICAgICAgICBnZW9NZXJjYXRvcjogbWVyY2F0b3IkMSwKICAgICAgICBnZW9NZXJjYXRvclJhdzogbWVyY2F0b3JSYXckMSwKICAgICAgICBnZW9OYXR1cmFsRWFydGgxOiBuYXR1cmFsRWFydGgxJDEsCiAgICAgICAgZ2VvTmF0dXJhbEVhcnRoMVJhdzogbmF0dXJhbEVhcnRoMVJhdyQxLAogICAgICAgIGdlb09ydGhvZ3JhcGhpYzogb3J0aG9ncmFwaGljJDEsCiAgICAgICAgZ2VvT3J0aG9ncmFwaGljUmF3OiBvcnRob2dyYXBoaWNSYXckMSwKICAgICAgICBnZW9TdGVyZW9ncmFwaGljOiBzdGVyZW9ncmFwaGljJDEsCiAgICAgICAgZ2VvU3RlcmVvZ3JhcGhpY1Jhdzogc3RlcmVvZ3JhcGhpY1JhdyQxLAogICAgICAgIGdlb1RyYW5zdmVyc2VNZXJjYXRvcjogdHJhbnN2ZXJzZU1lcmNhdG9yJDEsCiAgICAgICAgZ2VvVHJhbnN2ZXJzZU1lcmNhdG9yUmF3OiB0cmFuc3ZlcnNlTWVyY2F0b3JSYXckMSwKICAgICAgICBnZW9Sb3RhdGlvbjogcm90YXRpb24kMSwKICAgICAgICBnZW9TdHJlYW06IGdlb1N0cmVhbSQxLAogICAgICAgIGdlb1RyYW5zZm9ybTogdHJhbnNmb3JtJDIsCiAgICAgICAgY2x1c3RlcjogY2x1c3RlciQxLAogICAgICAgIGhpZXJhcmNoeTogaGllcmFyY2h5JDEsCiAgICAgICAgcGFjazogaW5kZXgkNiwKICAgICAgICBwYWNrU2libGluZ3M6IHNpYmxpbmdzJDEsCiAgICAgICAgcGFja0VuY2xvc2U6IGVuY2xvc2UkMSwKICAgICAgICBwYXJ0aXRpb246IHBhcnRpdGlvbiQxLAogICAgICAgIHN0cmF0aWZ5OiBzdHJhdGlmeSQxLAogICAgICAgIHRyZWU6IHRyZWUkMSwKICAgICAgICB0cmVlbWFwOiBpbmRleCQ3LAogICAgICAgIHRyZWVtYXBCaW5hcnk6IGJpbmFyeSQxLAogICAgICAgIHRyZWVtYXBEaWNlOiB0cmVlbWFwRGljZSQxLAogICAgICAgIHRyZWVtYXBTbGljZTogdHJlZW1hcFNsaWNlJDEsCiAgICAgICAgdHJlZW1hcFNsaWNlRGljZTogc2xpY2VEaWNlJDEsCiAgICAgICAgdHJlZW1hcFNxdWFyaWZ5OiBzcXVhcmlmeSQxLAogICAgICAgIHRyZWVtYXBSZXNxdWFyaWZ5OiByZXNxdWFyaWZ5JDEsCiAgICAgICAgaW50ZXJwb2xhdGU6IHZhbHVlLAogICAgICAgIGludGVycG9sYXRlQXJyYXk6IGFycmF5JDUsCiAgICAgICAgaW50ZXJwb2xhdGVCYXNpczogYmFzaXMkNCwKICAgICAgICBpbnRlcnBvbGF0ZUJhc2lzQ2xvc2VkOiBiYXNpc0Nsb3NlZCQyLAogICAgICAgIGludGVycG9sYXRlRGF0ZTogZGF0ZSQzLAogICAgICAgIGludGVycG9sYXRlTnVtYmVyOiBudW1iZXIkNiwKICAgICAgICBpbnRlcnBvbGF0ZU9iamVjdDogb2JqZWN0JDQsCiAgICAgICAgaW50ZXJwb2xhdGVSb3VuZDogcm91bmQsCiAgICAgICAgaW50ZXJwb2xhdGVTdHJpbmc6IHN0cmluZywKICAgICAgICBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzczogaW50ZXJwb2xhdGVUcmFuc2Zvcm1Dc3MkMiwKICAgICAgICBpbnRlcnBvbGF0ZVRyYW5zZm9ybVN2ZzogaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmckMiwKICAgICAgICBpbnRlcnBvbGF0ZVpvb206IHpvb20kMSwKICAgICAgICBpbnRlcnBvbGF0ZVJnYjogcmdiJDQsCiAgICAgICAgaW50ZXJwb2xhdGVSZ2JCYXNpczogcmdiQmFzaXMkMSwKICAgICAgICBpbnRlcnBvbGF0ZVJnYkJhc2lzQ2xvc2VkOiByZ2JCYXNpc0Nsb3NlZCQxLAogICAgICAgIGludGVycG9sYXRlSHNsOiBoc2wkNywKICAgICAgICBpbnRlcnBvbGF0ZUhzbExvbmc6IGhzbExvbmckMSwKICAgICAgICBpbnRlcnBvbGF0ZUxhYjogbGFiJDQsCiAgICAgICAgaW50ZXJwb2xhdGVIY2w6IGhjbCQ2LAogICAgICAgIGludGVycG9sYXRlSGNsTG9uZzogaGNsTG9uZyQxLAogICAgICAgIGludGVycG9sYXRlQ3ViZWhlbGl4OiBjdWJlaGVsaXgkNywKICAgICAgICBpbnRlcnBvbGF0ZUN1YmVoZWxpeExvbmc6IGN1YmVoZWxpeExvbmckMSwKICAgICAgICBxdWFudGl6ZTogcXVhbnRpemUkMiwKICAgICAgICBwYXRoOiBwYXRoJDIsCiAgICAgICAgcG9seWdvbkFyZWE6IGFyZWEkNSwKICAgICAgICBwb2x5Z29uQ2VudHJvaWQ6IGNlbnRyb2lkJDMsCiAgICAgICAgcG9seWdvbkh1bGw6IGh1bGwkMSwKICAgICAgICBwb2x5Z29uQ29udGFpbnM6IGNvbnRhaW5zJDQsCiAgICAgICAgcG9seWdvbkxlbmd0aDogbGVuZ3RoJDUsCiAgICAgICAgcXVhZHRyZWU6IHF1YWR0cmVlJDIsCiAgICAgICAgcXVldWU6IHF1ZXVlLAogICAgICAgIHJhbmRvbVVuaWZvcm06IHVuaWZvcm0kMSwKICAgICAgICByYW5kb21Ob3JtYWw6IG5vcm1hbCQxLAogICAgICAgIHJhbmRvbUxvZ05vcm1hbDogbG9nTm9ybWFsJDEsCiAgICAgICAgcmFuZG9tQmF0ZXM6IGJhdGVzJDEsCiAgICAgICAgcmFuZG9tSXJ3aW5IYWxsOiBpcndpbkhhbGwkMSwKICAgICAgICByYW5kb21FeHBvbmVudGlhbDogZXhwb25lbnRpYWwkNCwKICAgICAgICByZXF1ZXN0OiByZXF1ZXN0LAogICAgICAgIGh0bWw6IGh0bWwkMiwKICAgICAgICBqc29uOiBqc29uJDEsCiAgICAgICAgdGV4dDogdGV4dCQxLAogICAgICAgIHhtbDogeG1sJDEsCiAgICAgICAgY3N2OiBjc3YkMywKICAgICAgICB0c3Y6IHRzdiQzLAogICAgICAgIHNjYWxlQmFuZDogYmFuZCQxLAogICAgICAgIHNjYWxlUG9pbnQ6IHBvaW50JDgsCiAgICAgICAgc2NhbGVJZGVudGl0eTogaWRlbnRpdHkkaSwKICAgICAgICBzY2FsZUxpbmVhcjogbGluZWFyJDcsCiAgICAgICAgc2NhbGVMb2c6IGxvZyQzLAogICAgICAgIHNjYWxlT3JkaW5hbDogb3JkaW5hbCQxLAogICAgICAgIHNjYWxlSW1wbGljaXQ6IGltcGxpY2l0JDEsCiAgICAgICAgc2NhbGVQb3c6IHBvdyQzLAogICAgICAgIHNjYWxlU3FydDogc3FydCQ0LAogICAgICAgIHNjYWxlUXVhbnRpbGU6IHF1YW50aWxlJDIsCiAgICAgICAgc2NhbGVRdWFudGl6ZTogcXVhbnRpemUkMywKICAgICAgICBzY2FsZVRocmVzaG9sZDogdGhyZXNob2xkJDMsCiAgICAgICAgc2NhbGVUaW1lOiB0aW1lJDEsCiAgICAgICAgc2NhbGVVdGM6IHV0Y1RpbWUkMSwKICAgICAgICBzY2hlbWVDYXRlZ29yeTEwOiBjYXRlZ29yeTEwJDEsCiAgICAgICAgc2NoZW1lQ2F0ZWdvcnkyMGI6IGNhdGVnb3J5MjBiLAogICAgICAgIHNjaGVtZUNhdGVnb3J5MjBjOiBjYXRlZ29yeTIwYywKICAgICAgICBzY2hlbWVDYXRlZ29yeTIwOiBjYXRlZ29yeTIwLAogICAgICAgIGludGVycG9sYXRlQ3ViZWhlbGl4RGVmYXVsdDogY3ViZWhlbGl4JGEsCiAgICAgICAgaW50ZXJwb2xhdGVSYWluYm93OiByYWluYm93JDIsCiAgICAgICAgaW50ZXJwb2xhdGVXYXJtOiB3YXJtJDEsCiAgICAgICAgaW50ZXJwb2xhdGVDb29sOiBjb29sJDEsCiAgICAgICAgaW50ZXJwb2xhdGVWaXJpZGlzOiB2aXJpZGlzJDEsCiAgICAgICAgaW50ZXJwb2xhdGVNYWdtYTogbWFnbWEkMSwKICAgICAgICBpbnRlcnBvbGF0ZUluZmVybm86IGluZmVybm8kMSwKICAgICAgICBpbnRlcnBvbGF0ZVBsYXNtYTogcGxhc21hJDEsCiAgICAgICAgc2NhbGVTZXF1ZW50aWFsOiBzZXF1ZW50aWFsJDEsCiAgICAgICAgY3JlYXRlOiBjcmVhdGUkMywKICAgICAgICBjcmVhdG9yOiBjcmVhdG9yJDMsCiAgICAgICAgbG9jYWw6IGxvY2FsJDMsCiAgICAgICAgbWF0Y2hlcjogbWF0Y2hlciQ0LAogICAgICAgIG1vdXNlOiBtb3VzZSQzLAogICAgICAgIG5hbWVzcGFjZTogbmFtZXNwYWNlJDMsCiAgICAgICAgbmFtZXNwYWNlczogbmFtZXNwYWNlcyQzLAogICAgICAgIGNsaWVudFBvaW50OiBwb2ludCQ5LAogICAgICAgIHNlbGVjdDogc2VsZWN0JDMsCiAgICAgICAgc2VsZWN0QWxsOiBzZWxlY3RBbGwkMSwKICAgICAgICBzZWxlY3Rpb246IHNlbGVjdGlvbiQzLAogICAgICAgIHNlbGVjdG9yOiBzZWxlY3RvciQzLAogICAgICAgIHNlbGVjdG9yQWxsOiBzZWxlY3RvckFsbCQzLAogICAgICAgIHN0eWxlOiBzdHlsZVZhbHVlJDMsCiAgICAgICAgdG91Y2g6IHRvdWNoJDIsCiAgICAgICAgdG91Y2hlczogdG91Y2hlcyQxLAogICAgICAgIHdpbmRvdzogZGVmYXVsdFZpZXckMywKICAgICAgICBnZXQgZXZlbnQgKCkgeyByZXR1cm4gZXZlbnQkMzsgfSwKICAgICAgICBjdXN0b21FdmVudDogY3VzdG9tRXZlbnQkMywKICAgICAgICBhcmM6IGFyYyQxLAogICAgICAgIGFyZWE6IGFyZWEkNiwKICAgICAgICBsaW5lOiBsaW5lJDEsCiAgICAgICAgcGllOiBwaWUkMSwKICAgICAgICBhcmVhUmFkaWFsOiBhcmVhUmFkaWFsJDEsCiAgICAgICAgcmFkaWFsQXJlYTogYXJlYVJhZGlhbCQxLAogICAgICAgIGxpbmVSYWRpYWw6IGxpbmVSYWRpYWwkMywKICAgICAgICByYWRpYWxMaW5lOiBsaW5lUmFkaWFsJDMsCiAgICAgICAgcG9pbnRSYWRpYWw6IHBvaW50UmFkaWFsJDEsCiAgICAgICAgbGlua0hvcml6b250YWw6IGxpbmtIb3Jpem9udGFsJDEsCiAgICAgICAgbGlua1ZlcnRpY2FsOiBsaW5rVmVydGljYWwkMSwKICAgICAgICBsaW5rUmFkaWFsOiBsaW5rUmFkaWFsJDEsCiAgICAgICAgc3ltYm9sOiBzeW1ib2wkMSwKICAgICAgICBzeW1ib2xzOiBzeW1ib2xzJDEsCiAgICAgICAgc3ltYm9sQ2lyY2xlOiBjaXJjbGUkNSwKICAgICAgICBzeW1ib2xDcm9zczogY3Jvc3MkNSwKICAgICAgICBzeW1ib2xEaWFtb25kOiBkaWFtb25kJDEsCiAgICAgICAgc3ltYm9sU3F1YXJlOiBzcXVhcmUkMSwKICAgICAgICBzeW1ib2xTdGFyOiBzdGFyJDEsCiAgICAgICAgc3ltYm9sVHJpYW5nbGU6IHRyaWFuZ2xlJDEsCiAgICAgICAgc3ltYm9sV3llOiB3eWUkMSwKICAgICAgICBjdXJ2ZUJhc2lzQ2xvc2VkOiBiYXNpc0Nsb3NlZCQzLAogICAgICAgIGN1cnZlQmFzaXNPcGVuOiBiYXNpc09wZW4kMSwKICAgICAgICBjdXJ2ZUJhc2lzOiBiYXNpcyQ1LAogICAgICAgIGN1cnZlQnVuZGxlOiBidW5kbGUkMSwKICAgICAgICBjdXJ2ZUNhcmRpbmFsQ2xvc2VkOiBjYXJkaW5hbENsb3NlZCQxLAogICAgICAgIGN1cnZlQ2FyZGluYWxPcGVuOiBjYXJkaW5hbE9wZW4kMSwKICAgICAgICBjdXJ2ZUNhcmRpbmFsOiBjYXJkaW5hbCQxLAogICAgICAgIGN1cnZlQ2F0bXVsbFJvbUNsb3NlZDogY2F0bXVsbFJvbUNsb3NlZCQxLAogICAgICAgIGN1cnZlQ2F0bXVsbFJvbU9wZW46IGNhdG11bGxSb21PcGVuJDEsCiAgICAgICAgY3VydmVDYXRtdWxsUm9tOiBjYXRtdWxsUm9tJDEsCiAgICAgICAgY3VydmVMaW5lYXJDbG9zZWQ6IGxpbmVhckNsb3NlZCQxLAogICAgICAgIGN1cnZlTGluZWFyOiBjdXJ2ZUxpbmVhciQxLAogICAgICAgIGN1cnZlTW9ub3RvbmVYOiBtb25vdG9uZVgkMSwKICAgICAgICBjdXJ2ZU1vbm90b25lWTogbW9ub3RvbmVZJDEsCiAgICAgICAgY3VydmVOYXR1cmFsOiBuYXR1cmFsJDEsCiAgICAgICAgY3VydmVTdGVwOiBzdGVwJDEsCiAgICAgICAgY3VydmVTdGVwQWZ0ZXI6IHN0ZXBBZnRlciQxLAogICAgICAgIGN1cnZlU3RlcEJlZm9yZTogc3RlcEJlZm9yZSQxLAogICAgICAgIHN0YWNrOiBzdGFjayQxLAogICAgICAgIHN0YWNrT2Zmc2V0RXhwYW5kOiBleHBhbmQkMSwKICAgICAgICBzdGFja09mZnNldERpdmVyZ2luZzogZGl2ZXJnaW5nJDIsCiAgICAgICAgc3RhY2tPZmZzZXROb25lOiBub25lJDYsCiAgICAgICAgc3RhY2tPZmZzZXRTaWxob3VldHRlOiBzaWxob3VldHRlJDEsCiAgICAgICAgc3RhY2tPZmZzZXRXaWdnbGU6IHdpZ2dsZSQxLAogICAgICAgIHN0YWNrT3JkZXJBc2NlbmRpbmc6IGFzY2VuZGluZyRiLAogICAgICAgIHN0YWNrT3JkZXJEZXNjZW5kaW5nOiBkZXNjZW5kaW5nJDUsCiAgICAgICAgc3RhY2tPcmRlckluc2lkZU91dDogaW5zaWRlT3V0JDEsCiAgICAgICAgc3RhY2tPcmRlck5vbmU6IG5vbmUkNywKICAgICAgICBzdGFja09yZGVyUmV2ZXJzZTogcmV2ZXJzZSQxLAogICAgICAgIHRpbWVJbnRlcnZhbDogbmV3SW50ZXJ2YWwkMiwKICAgICAgICB0aW1lTWlsbGlzZWNvbmQ6IG1pbGxpc2Vjb25kJDIsCiAgICAgICAgdGltZU1pbGxpc2Vjb25kczogbWlsbGlzZWNvbmRzJDEsCiAgICAgICAgdXRjTWlsbGlzZWNvbmQ6IG1pbGxpc2Vjb25kJDIsCiAgICAgICAgdXRjTWlsbGlzZWNvbmRzOiBtaWxsaXNlY29uZHMkMSwKICAgICAgICB0aW1lU2Vjb25kOiBzZWNvbmQkMiwKICAgICAgICB0aW1lU2Vjb25kczogc2Vjb25kcyQxLAogICAgICAgIHV0Y1NlY29uZDogc2Vjb25kJDIsCiAgICAgICAgdXRjU2Vjb25kczogc2Vjb25kcyQxLAogICAgICAgIHRpbWVNaW51dGU6IG1pbnV0ZSQyLAogICAgICAgIHRpbWVNaW51dGVzOiBtaW51dGVzJDEsCiAgICAgICAgdGltZUhvdXI6IGhvdXIkMiwKICAgICAgICB0aW1lSG91cnM6IGhvdXJzJDEsCiAgICAgICAgdGltZURheTogZGF5JDIsCiAgICAgICAgdGltZURheXM6IGRheXMkMSwKICAgICAgICB0aW1lV2Vlazogc3VuZGF5JDIsCiAgICAgICAgdGltZVdlZWtzOiBzdW5kYXlzJDEsCiAgICAgICAgdGltZVN1bmRheTogc3VuZGF5JDIsCiAgICAgICAgdGltZVN1bmRheXM6IHN1bmRheXMkMSwKICAgICAgICB0aW1lTW9uZGF5OiBtb25kYXkkMiwKICAgICAgICB0aW1lTW9uZGF5czogbW9uZGF5cyQxLAogICAgICAgIHRpbWVUdWVzZGF5OiB0dWVzZGF5JDIsCiAgICAgICAgdGltZVR1ZXNkYXlzOiB0dWVzZGF5cyQxLAogICAgICAgIHRpbWVXZWRuZXNkYXk6IHdlZG5lc2RheSQyLAogICAgICAgIHRpbWVXZWRuZXNkYXlzOiB3ZWRuZXNkYXlzJDEsCiAgICAgICAgdGltZVRodXJzZGF5OiB0aHVyc2RheSQyLAogICAgICAgIHRpbWVUaHVyc2RheXM6IHRodXJzZGF5cyQxLAogICAgICAgIHRpbWVGcmlkYXk6IGZyaWRheSQyLAogICAgICAgIHRpbWVGcmlkYXlzOiBmcmlkYXlzJDEsCiAgICAgICAgdGltZVNhdHVyZGF5OiBzYXR1cmRheSQyLAogICAgICAgIHRpbWVTYXR1cmRheXM6IHNhdHVyZGF5cyQxLAogICAgICAgIHRpbWVNb250aDogbW9udGgkMiwKICAgICAgICB0aW1lTW9udGhzOiBtb250aHMkMSwKICAgICAgICB0aW1lWWVhcjogeWVhciQyLAogICAgICAgIHRpbWVZZWFyczogeWVhcnMkMSwKICAgICAgICB1dGNNaW51dGU6IHV0Y01pbnV0ZSQyLAogICAgICAgIHV0Y01pbnV0ZXM6IHV0Y01pbnV0ZXMkMSwKICAgICAgICB1dGNIb3VyOiB1dGNIb3VyJDIsCiAgICAgICAgdXRjSG91cnM6IHV0Y0hvdXJzJDEsCiAgICAgICAgdXRjRGF5OiB1dGNEYXkkMiwKICAgICAgICB1dGNEYXlzOiB1dGNEYXlzJDEsCiAgICAgICAgdXRjV2VlazogdXRjU3VuZGF5JDIsCiAgICAgICAgdXRjV2Vla3M6IHV0Y1N1bmRheXMkMSwKICAgICAgICB1dGNTdW5kYXk6IHV0Y1N1bmRheSQyLAogICAgICAgIHV0Y1N1bmRheXM6IHV0Y1N1bmRheXMkMSwKICAgICAgICB1dGNNb25kYXk6IHV0Y01vbmRheSQyLAogICAgICAgIHV0Y01vbmRheXM6IHV0Y01vbmRheXMkMSwKICAgICAgICB1dGNUdWVzZGF5OiB1dGNUdWVzZGF5JDIsCiAgICAgICAgdXRjVHVlc2RheXM6IHV0Y1R1ZXNkYXlzJDEsCiAgICAgICAgdXRjV2VkbmVzZGF5OiB1dGNXZWRuZXNkYXkkMiwKICAgICAgICB1dGNXZWRuZXNkYXlzOiB1dGNXZWRuZXNkYXlzJDEsCiAgICAgICAgdXRjVGh1cnNkYXk6IHV0Y1RodXJzZGF5JDIsCiAgICAgICAgdXRjVGh1cnNkYXlzOiB1dGNUaHVyc2RheXMkMSwKICAgICAgICB1dGNGcmlkYXk6IHV0Y0ZyaWRheSQyLAogICAgICAgIHV0Y0ZyaWRheXM6IHV0Y0ZyaWRheXMkMSwKICAgICAgICB1dGNTYXR1cmRheTogdXRjU2F0dXJkYXkkMiwKICAgICAgICB1dGNTYXR1cmRheXM6IHV0Y1NhdHVyZGF5cyQxLAogICAgICAgIHV0Y01vbnRoOiB1dGNNb250aCQyLAogICAgICAgIHV0Y01vbnRoczogdXRjTW9udGhzJDEsCiAgICAgICAgdXRjWWVhcjogdXRjWWVhciQyLAogICAgICAgIHV0Y1llYXJzOiB1dGNZZWFycyQxLAogICAgICAgIHRpbWVGb3JtYXREZWZhdWx0TG9jYWxlOiBkZWZhdWx0TG9jYWxlJDUsCiAgICAgICAgZ2V0IHRpbWVGb3JtYXQgKCkgeyByZXR1cm4gdGltZUZvcm1hdCQyOyB9LAogICAgICAgIGdldCB0aW1lUGFyc2UgKCkgeyByZXR1cm4gdGltZVBhcnNlJDI7IH0sCiAgICAgICAgZ2V0IHV0Y0Zvcm1hdCAoKSB7IHJldHVybiB1dGNGb3JtYXQkMjsgfSwKICAgICAgICBnZXQgdXRjUGFyc2UgKCkgeyByZXR1cm4gdXRjUGFyc2UkMjsgfSwKICAgICAgICB0aW1lRm9ybWF0TG9jYWxlOiBmb3JtYXRMb2NhbGUkNSwKICAgICAgICBpc29Gb3JtYXQ6IGZvcm1hdElzbyQxLAogICAgICAgIGlzb1BhcnNlOiBwYXJzZUlzbyQxLAogICAgICAgIG5vdzogbm93JDMsCiAgICAgICAgdGltZXI6IHRpbWVyJDMsCiAgICAgICAgdGltZXJGbHVzaDogdGltZXJGbHVzaCQzLAogICAgICAgIHRpbWVvdXQ6IHRpbWVvdXQkNiwKICAgICAgICBpbnRlcnZhbDogaW50ZXJ2YWwkNSwKICAgICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uJDIsCiAgICAgICAgYWN0aXZlOiBhY3RpdmUkMSwKICAgICAgICBpbnRlcnJ1cHQ6IGludGVycnVwdCQyLAogICAgICAgIHZvcm9ub2k6IHZvcm9ub2kkMSwKICAgICAgICB6b29tOiB6b29tJDIsCiAgICAgICAgem9vbVRyYW5zZm9ybTogdHJhbnNmb3JtJDMsCiAgICAgICAgem9vbUlkZW50aXR5OiBpZGVudGl0eSRtCiAgICB9KTsKCiAgICB2YXIgYWRkRDNTZWxlY3Rpb25NdWx0aSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICoKICAgICAqIEBmaWxlb3ZlcnZpZXcgbWFudWFsbHkgYWRkIGQzLXNlbGVjdGlvbi1tdWx0aSB0byBkMyBkZWZhdWx0IGJ1bmRsZS4gTW9zdCBvZiB0aGlzIGNvZGUgaXMKICAgICAqIGNvcGllZCBmcm9tIGQzLXNlbGVjdGlvbi1tdWx0aUAxLjAuMC4KICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2VsZWN0aW9uLW11bHRpL2lzc3Vlcy8xMSBmb3Igd2h5IHdlIGhhdmUgdG8gZG8gdGhpcwogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHZhciBkM1NlbGVjdGlvbiA9IGQzOwogICAgdmFyIGQzVHJhbnNpdGlvbiA9IGQzOwogICAgZnVuY3Rpb24gYXR0cnNGdW5jdGlvbihzZWxlY3Rpb24sIG1hcCkgewogICAgICAgIHJldHVybiBzZWxlY3Rpb24uZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB4ID0gbWFwLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHMgPSBkM1NlbGVjdGlvbi5zZWxlY3QodGhpcyk7CiAgICAgICAgICAgIGZvciAodmFyIG5hbWVfMSBpbiB4KQogICAgICAgICAgICAgICAgcy5hdHRyKG5hbWVfMSwgeFtuYW1lXzFdKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHJzT2JqZWN0KHNlbGVjdGlvbiwgbWFwKSB7CiAgICAgICAgZm9yICh2YXIgbmFtZV8yIGluIG1hcCkKICAgICAgICAgICAgc2VsZWN0aW9uLmF0dHIobmFtZV8yLCBtYXBbbmFtZV8yXSk7CiAgICAgICAgcmV0dXJuIHNlbGVjdGlvbjsKICAgIH0KICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9hdHRycyhtYXApIHsKICAgICAgICByZXR1cm4gKHR5cGVvZiBtYXAgPT09ICJmdW5jdGlvbiIgPyBhdHRyc0Z1bmN0aW9uIDogYXR0cnNPYmplY3QpKHRoaXMsIG1hcCk7CiAgICB9CiAgICBmdW5jdGlvbiBzdHlsZXNGdW5jdGlvbihzZWxlY3Rpb24sIG1hcCwgcHJpb3JpdHkpIHsKICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgeCA9IG1hcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzID0gZDNTZWxlY3Rpb24uc2VsZWN0KHRoaXMpOwogICAgICAgICAgICBmb3IgKHZhciBuYW1lXzMgaW4geCkKICAgICAgICAgICAgICAgIHMuc3R5bGUobmFtZV8zLCB4W25hbWVfM10sIHByaW9yaXR5KTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlc09iamVjdChzZWxlY3Rpb24sIG1hcCwgcHJpb3JpdHkpIHsKICAgICAgICBmb3IgKHZhciBuYW1lXzQgaW4gbWFwKQogICAgICAgICAgICBzZWxlY3Rpb24uc3R5bGUobmFtZV80LCBtYXBbbmFtZV80XSwgcHJpb3JpdHkpOwogICAgICAgIHJldHVybiBzZWxlY3Rpb247CiAgICB9CiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc3R5bGVzKG1hcCwgcHJpb3JpdHkpIHsKICAgICAgICByZXR1cm4gKHR5cGVvZiBtYXAgPT09ICJmdW5jdGlvbiIgPyBzdHlsZXNGdW5jdGlvbiA6IHN0eWxlc09iamVjdCkodGhpcywgbWFwLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSk7CiAgICB9CiAgICBmdW5jdGlvbiBwcm9wZXJ0aWVzRnVuY3Rpb24oc2VsZWN0aW9uLCBtYXApIHsKICAgICAgICByZXR1cm4gc2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgeCA9IG1hcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCBzID0gZDNTZWxlY3Rpb24uc2VsZWN0KHRoaXMpOwogICAgICAgICAgICBmb3IgKHZhciBuYW1lXzUgaW4geCkKICAgICAgICAgICAgICAgIHMucHJvcGVydHkobmFtZV81LCB4W25hbWVfNV0pOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gcHJvcGVydGllc09iamVjdChzZWxlY3Rpb24sIG1hcCkgewogICAgICAgIGZvciAodmFyIG5hbWVfNiBpbiBtYXApCiAgICAgICAgICAgIHNlbGVjdGlvbi5wcm9wZXJ0eShuYW1lXzYsIG1hcFtuYW1lXzZdKTsKICAgICAgICByZXR1cm4gc2VsZWN0aW9uOwogICAgfQogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3Byb3BlcnRpZXMobWFwKSB7CiAgICAgICAgcmV0dXJuICh0eXBlb2YgbWFwID09PSAiZnVuY3Rpb24iID8gcHJvcGVydGllc0Z1bmN0aW9uIDogcHJvcGVydGllc09iamVjdCkodGhpcywgbWFwKTsKICAgIH0KICAgIGZ1bmN0aW9uIGF0dHJzRnVuY3Rpb24kMSh0cmFuc2l0aW9uLCBtYXApIHsKICAgICAgICByZXR1cm4gdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHggPSBtYXAuYXBwbHkodGhpcywgYXJndW1lbnRzKSwgdCA9IGQzU2VsZWN0aW9uLnNlbGVjdCh0aGlzKS50cmFuc2l0aW9uKHRyYW5zaXRpb24pOwogICAgICAgICAgICBmb3IgKHZhciBuYW1lXzcgaW4geCkKICAgICAgICAgICAgICAgIHQuYXR0cihuYW1lXzcsIHhbbmFtZV83XSk7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBhdHRyc09iamVjdCQxKHRyYW5zaXRpb24sIG1hcCkgewogICAgICAgIGZvciAodmFyIG5hbWVfOCBpbiBtYXApCiAgICAgICAgICAgIHRyYW5zaXRpb24uYXR0cihuYW1lXzgsIG1hcFtuYW1lXzhdKTsKICAgICAgICByZXR1cm4gdHJhbnNpdGlvbjsKICAgIH0KICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fYXR0cnMobWFwKSB7CiAgICAgICAgcmV0dXJuICh0eXBlb2YgbWFwID09PSAiZnVuY3Rpb24iID8gYXR0cnNGdW5jdGlvbiQxIDogYXR0cnNPYmplY3QkMSkodGhpcywgbWFwKTsKICAgIH0KICAgIGZ1bmN0aW9uIHN0eWxlc0Z1bmN0aW9uJDEodHJhbnNpdGlvbiwgbWFwLCBwcmlvcml0eSkgewogICAgICAgIHJldHVybiB0cmFuc2l0aW9uLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgeCA9IG1hcC5hcHBseSh0aGlzLCBhcmd1bWVudHMpLCB0ID0gZDNTZWxlY3Rpb24uc2VsZWN0KHRoaXMpLnRyYW5zaXRpb24odHJhbnNpdGlvbik7CiAgICAgICAgICAgIGZvciAodmFyIG5hbWVfOSBpbiB4KQogICAgICAgICAgICAgICAgdC5zdHlsZShuYW1lXzksIHhbbmFtZV85XSwgcHJpb3JpdHkpOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gc3R5bGVzT2JqZWN0JDEodHJhbnNpdGlvbiwgbWFwLCBwcmlvcml0eSkgewogICAgICAgIGZvciAodmFyIG5hbWVfMTAgaW4gbWFwKQogICAgICAgICAgICB0cmFuc2l0aW9uLnN0eWxlKG5hbWVfMTAsIG1hcFtuYW1lXzEwXSwgcHJpb3JpdHkpOwogICAgICAgIHJldHVybiB0cmFuc2l0aW9uOwogICAgfQogICAgZnVuY3Rpb24gdHJhbnNpdGlvbl9zdHlsZXMobWFwLCBwcmlvcml0eSkgewogICAgICAgIHJldHVybiAodHlwZW9mIG1hcCA9PT0gImZ1bmN0aW9uIiA/IHN0eWxlc0Z1bmN0aW9uJDEgOiBzdHlsZXNPYmplY3QkMSkodGhpcywgbWFwLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSk7CiAgICB9CiAgICBkM1NlbGVjdGlvbi5zZWxlY3Rpb24ucHJvdG90eXBlLmF0dHJzID0gc2VsZWN0aW9uX2F0dHJzOwogICAgZDNTZWxlY3Rpb24uc2VsZWN0aW9uLnByb3RvdHlwZS5zdHlsZXMgPSBzZWxlY3Rpb25fc3R5bGVzOwogICAgZDNTZWxlY3Rpb24uc2VsZWN0aW9uLnByb3RvdHlwZS5wcm9wZXJ0aWVzID0gc2VsZWN0aW9uX3Byb3BlcnRpZXM7CiAgICBkM1RyYW5zaXRpb24udHJhbnNpdGlvbi5wcm90b3R5cGUuYXR0cnMgPSB0cmFuc2l0aW9uX2F0dHJzOwogICAgZDNUcmFuc2l0aW9uLnRyYW5zaXRpb24ucHJvdG90eXBlLnN0eWxlcyA9IHRyYW5zaXRpb25fc3R5bGVzOwogICAgfSk7CgogICAgdmFyIGNvZXJjZUQzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICAvKioKICAgICAqIENvZXJjZSBwb3NzaWJseSBleHRlcm5hbCBkMyBpbnN0YW5jZSBpbnRvIG91ciBvd24gaW5zdGFuY2Ugb2YgZDMgc28gd2UgY2FuIHVzZSBkMy1zZWxlY3Rpb24tbXVsdGkuCiAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNlbGVjdGlvbi1tdWx0aS9pc3N1ZXMvMTEgZm9yIHdoeSB3ZSBoYXZlIHRvIGRvIHRoaXMuCiAgICAgKgogICAgICogQW55IHB1YmxpYyBmYWNpbmcgQVBJIHRoYXQgYWNjZXB0cyBhIGQzIHNlbGVjdGlvbiBzaG91bGQgZmlyc3QgcGFzcyB0aGF0IHVzZXItc3VwcGxpZWQgc2VsZWN0aW9uCiAgICAgKiB0aHJvdWdoIGhlcmUgLSB0aGlzIGVuc3VyZXMgYWxsIHNlbGVjdGlvbiBvYmplY3RzIHRoYXQgZ28gdGhyb3VnaCB0aGUgUGxvdHRhYmxlIGNvZGViYXNlIGFyZSAidmV0dGVkIi4KICAgICAqLwogICAgZnVuY3Rpb24gY29lcmNlRXh0ZXJuYWxEMyhleHRlcm5hbEQzU2VsZWN0aW9uKSB7CiAgICAgICAgLy8gaWYgLmF0dHJzIGlzbid0IGRlZmluZWQ7IGNvbnZlcnQgdGhlIHNlbGVjdGlvbgogICAgICAgIGlmIChleHRlcm5hbEQzU2VsZWN0aW9uLmF0dHJzID09IG51bGwpIHsKICAgICAgICAgICAgaWYgKGV4dGVybmFsRDNTZWxlY3Rpb24ubm9kZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gbm9kZXMgaXNuJ3QgZGVmaW5lZDsgdGhpcyBpcyBwcm9iYWJseSBhIGQzdjMgc2VsZWN0aW9uLiBoYW5kbGUgaXQgYWNjb3JkaW5nbHkKICAgICAgICAgICAgICAgIHZhciBub2Rlc18xID0gW107CiAgICAgICAgICAgICAgICBleHRlcm5hbEQzU2VsZWN0aW9uLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIG5vZGVzXzEucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGQzLnNlbGVjdEFsbChub2Rlc18xKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBkMy5zZWxlY3RBbGwoZXh0ZXJuYWxEM1NlbGVjdGlvbi5ub2RlcygpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGV4dGVybmFsRDNTZWxlY3Rpb247CiAgICAgICAgfQogICAgfQogICAgZXhwb3J0cy5jb2VyY2VFeHRlcm5hbEQzID0gY29lcmNlRXh0ZXJuYWxEMzsKICAgIH0pOwoKICAgIHZhciBtYWtlRW51bV8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBmdW5jdGlvbiBtYWtlRW51bSh2YWx1ZXMpIHsKICAgICAgICByZXR1cm4gdmFsdWVzLnJlZHVjZShmdW5jdGlvbiAob2JqLCB2KSB7CiAgICAgICAgICAgIG9ialt2XSA9IHY7CiAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfSwge30pOwogICAgfQogICAgZXhwb3J0cy5tYWtlRW51bSA9IG1ha2VFbnVtOwogICAgfSk7CgogICAgdmFyIGVhc2luZ0FuaW1hdG9yID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCiAgICB2YXIgRUFTRV9OQU1FX01BUFBJTkcgPSB7CiAgICAgICAgbGluZWFyOiBzcmMuZWFzZUxpbmVhciwKICAgICAgICBxdWFkOiBzcmMuZWFzZVF1YWQsCiAgICAgICAgcXVhZEluOiBzcmMuZWFzZVF1YWRJbiwKICAgICAgICBxdWFkT3V0OiBzcmMuZWFzZVF1YWRPdXQsCiAgICAgICAgcXVhZEluT3V0OiBzcmMuZWFzZVF1YWRJbk91dCwKICAgICAgICBjdWJpYzogc3JjLmVhc2VDdWJpYywKICAgICAgICBjdWJpY0luOiBzcmMuZWFzZUN1YmljSW4sCiAgICAgICAgY3ViaWNPdXQ6IHNyYy5lYXNlQ3ViaWNPdXQsCiAgICAgICAgY3ViaWNJbk91dDogc3JjLmVhc2VDdWJpY0luT3V0LAogICAgICAgIHBvbHk6IHNyYy5lYXNlUG9seSwKICAgICAgICBwb2x5SW46IHNyYy5lYXNlUG9seUluLAogICAgICAgIHBvbHlPdXQ6IHNyYy5lYXNlUG9seU91dCwKICAgICAgICBwb2x5SW5PdXQ6IHNyYy5lYXNlUG9seUluT3V0LAogICAgICAgIHNpbjogc3JjLmVhc2VTaW4sCiAgICAgICAgc2luSW46IHNyYy5lYXNlU2luSW4sCiAgICAgICAgc2luT3V0OiBzcmMuZWFzZVNpbk91dCwKICAgICAgICBzaW5Jbk91dDogc3JjLmVhc2VTaW5Jbk91dCwKICAgICAgICBleHA6IHNyYy5lYXNlRXhwLAogICAgICAgIGV4cEluOiBzcmMuZWFzZUV4cEluLAogICAgICAgIGV4cE91dDogc3JjLmVhc2VFeHBPdXQsCiAgICAgICAgZXhwSW5PdXQ6IHNyYy5lYXNlRXhwSW5PdXQsCiAgICAgICAgY2lyY2xlOiBzcmMuZWFzZUNpcmNsZSwKICAgICAgICBjaXJjbGVJbjogc3JjLmVhc2VDaXJjbGVJbiwKICAgICAgICBjaXJjbGVPdXQ6IHNyYy5lYXNlQ2lyY2xlT3V0LAogICAgICAgIGNpcmNsZUluT3V0OiBzcmMuZWFzZUNpcmNsZUluT3V0LAogICAgICAgIGJvdW5jZTogc3JjLmVhc2VCb3VuY2UsCiAgICAgICAgYm91bmNlSW46IHNyYy5lYXNlQm91bmNlSW4sCiAgICAgICAgYm91bmNlT3V0OiBzcmMuZWFzZUJvdW5jZU91dCwKICAgICAgICBib3VuY2VJbk91dDogc3JjLmVhc2VCb3VuY2VJbk91dCwKICAgICAgICBiYWNrOiBzcmMuZWFzZUJhY2ssCiAgICAgICAgYmFja0luOiBzcmMuZWFzZUJhY2tJbiwKICAgICAgICBiYWNrT3V0OiBzcmMuZWFzZUJhY2tPdXQsCiAgICAgICAgYmFja0luT3V0OiBzcmMuZWFzZUJhY2tJbk91dCwKICAgICAgICBlbGFzdGljOiBzcmMuZWFzZUVsYXN0aWMsCiAgICAgICAgZWxhc3RpY0luOiBzcmMuZWFzZUVsYXN0aWNJbiwKICAgICAgICBlbGFzdGljT3V0OiBzcmMuZWFzZUVsYXN0aWNPdXQsCiAgICAgICAgZWxhc3RpY0luT3V0OiBzcmMuZWFzZUVsYXN0aWNJbk91dCwKICAgIH07CiAgICBleHBvcnRzLkVhc2VOYW1lID0gbWFrZUVudW1fMS5tYWtlRW51bShbCiAgICAgICAgImxpbmVhciIsCiAgICAgICAgInF1YWQiLAogICAgICAgICJxdWFkSW4iLAogICAgICAgICJxdWFkT3V0IiwKICAgICAgICAicXVhZEluT3V0IiwKICAgICAgICAiY3ViaWMiLAogICAgICAgICJjdWJpY0luIiwKICAgICAgICAiY3ViaWNPdXQiLAogICAgICAgICJjdWJpY0luT3V0IiwKICAgICAgICAicG9seSIsCiAgICAgICAgInBvbHlJbiIsCiAgICAgICAgInBvbHlPdXQiLAogICAgICAgICJwb2x5SW5PdXQiLAogICAgICAgICJzaW4iLAogICAgICAgICJzaW5JbiIsCiAgICAgICAgInNpbk91dCIsCiAgICAgICAgInNpbkluT3V0IiwKICAgICAgICAiZXhwIiwKICAgICAgICAiZXhwSW4iLAogICAgICAgICJleHBPdXQiLAogICAgICAgICJleHBJbk91dCIsCiAgICAgICAgImNpcmNsZSIsCiAgICAgICAgImNpcmNsZUluIiwKICAgICAgICAiY2lyY2xlT3V0IiwKICAgICAgICAiY2lyY2xlSW5PdXQiLAogICAgICAgICJib3VuY2UiLAogICAgICAgICJib3VuY2VJbiIsCiAgICAgICAgImJvdW5jZU91dCIsCiAgICAgICAgImJvdW5jZUluT3V0IiwKICAgICAgICAiYmFjayIsCiAgICAgICAgImJhY2tJbiIsCiAgICAgICAgImJhY2tPdXQiLAogICAgICAgICJiYWNrSW5PdXQiLAogICAgICAgICJlbGFzdGljIiwKICAgICAgICAiZWxhc3RpY0luIiwKICAgICAgICAiZWxhc3RpY091dCIsCiAgICAgICAgImVsYXN0aWNJbk91dCIsCiAgICBdKTsKICAgIC8qKgogICAgICogQW4gQW5pbWF0b3Igd2l0aCBlYXNpbmcgYW5kIGNvbmZpZ3VyYWJsZSBkdXJhdGlvbnMgYW5kIGRlbGF5cy4KICAgICAqLwogICAgdmFyIEVhc2luZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIHRoZSBkZWZhdWx0IGFuaW1hdG9yCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBFYXNpbmcoKSB7CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0RGVsYXkgPSBFYXNpbmcuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTOwogICAgICAgICAgICB0aGlzLl9zdGVwRHVyYXRpb24gPSBFYXNpbmcuX0RFRkFVTFRfU1RFUF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7CiAgICAgICAgICAgIHRoaXMuX3N0ZXBEZWxheSA9IEVhc2luZy5fREVGQVVMVF9JVEVSQVRJVkVfREVMQVlfTUlMTElTRUNPTkRTOwogICAgICAgICAgICB0aGlzLl9tYXhUb3RhbER1cmF0aW9uID0gRWFzaW5nLl9ERUZBVUxUX01BWF9UT1RBTF9EVVJBVElPTl9NSUxMSVNFQ09ORFM7CiAgICAgICAgICAgIHRoaXMuX2Vhc2luZ01vZGUgPSBFYXNpbmcuX0RFRkFVTFRfRUFTSU5HX01PREU7CiAgICAgICAgfQogICAgICAgIEVhc2luZy5wcm90b3R5cGUudG90YWxUaW1lID0gZnVuY3Rpb24gKG51bWJlck9mU3RlcHMpIHsKICAgICAgICAgICAgdmFyIGFkanVzdGVkSXRlcmF0aXZlRGVsYXkgPSB0aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KG51bWJlck9mU3RlcHMpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydERlbGF5KCkgKyBhZGp1c3RlZEl0ZXJhdGl2ZURlbGF5ICogKE1hdGgubWF4KG51bWJlck9mU3RlcHMgLSAxLCAwKSkgKyB0aGlzLnN0ZXBEdXJhdGlvbigpOwogICAgICAgIH07CiAgICAgICAgRWFzaW5nLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgYXR0clRvQXBwbGllZFByb2plY3RvcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBzZWxlY3Rpb24gPSBjb2VyY2VEMy5jb2VyY2VFeHRlcm5hbEQzKHNlbGVjdGlvbik7CiAgICAgICAgICAgIHZhciBudW1iZXJPZlN0ZXBzID0gc2VsZWN0aW9uLnNpemUoKTsKICAgICAgICAgICAgdmFyIGFkanVzdGVkSXRlcmF0aXZlRGVsYXkgPSB0aGlzLl9nZXRBZGp1c3RlZEl0ZXJhdGl2ZURlbGF5KG51bWJlck9mU3RlcHMpOwogICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmVhc2UodGhpcy5fZ2V0RWFzZUZhY3RvcnkoKSkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbih0aGlzLnN0ZXBEdXJhdGlvbigpKQogICAgICAgICAgICAgICAgLmRlbGF5KGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBfdGhpcy5zdGFydERlbGF5KCkgKyBhZGp1c3RlZEl0ZXJhdGl2ZURlbGF5ICogaTsgfSkKICAgICAgICAgICAgICAgIC5hdHRycyhhdHRyVG9BcHBsaWVkUHJvamVjdG9yKTsKICAgICAgICB9OwogICAgICAgIEVhc2luZy5wcm90b3R5cGUuc3RhcnREZWxheSA9IGZ1bmN0aW9uIChzdGFydERlbGF5KSB7CiAgICAgICAgICAgIGlmIChzdGFydERlbGF5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFydERlbGF5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fc3RhcnREZWxheSA9IHN0YXJ0RGVsYXk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgRWFzaW5nLnByb3RvdHlwZS5zdGVwRHVyYXRpb24gPSBmdW5jdGlvbiAoc3RlcER1cmF0aW9uKSB7CiAgICAgICAgICAgIGlmIChzdGVwRHVyYXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuX3N0ZXBEdXJhdGlvbiwgdGhpcy5fbWF4VG90YWxEdXJhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdGVwRHVyYXRpb24gPSBzdGVwRHVyYXRpb247CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgRWFzaW5nLnByb3RvdHlwZS5zdGVwRGVsYXkgPSBmdW5jdGlvbiAoc3RlcERlbGF5KSB7CiAgICAgICAgICAgIGlmIChzdGVwRGVsYXkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0ZXBEZWxheTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N0ZXBEZWxheSA9IHN0ZXBEZWxheTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBFYXNpbmcucHJvdG90eXBlLm1heFRvdGFsRHVyYXRpb24gPSBmdW5jdGlvbiAobWF4VG90YWxEdXJhdGlvbikgewogICAgICAgICAgICBpZiAobWF4VG90YWxEdXJhdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWF4VG90YWxEdXJhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21heFRvdGFsRHVyYXRpb24gPSBtYXhUb3RhbER1cmF0aW9uOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEVhc2luZy5wcm90b3R5cGUuZWFzaW5nTW9kZSA9IGZ1bmN0aW9uIChlYXNpbmdNb2RlKSB7CiAgICAgICAgICAgIGlmIChlYXNpbmdNb2RlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lYXNpbmdNb2RlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZWFzaW5nTW9kZSA9IGVhc2luZ01vZGU7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgRWFzaW5nLnByb3RvdHlwZS5fZ2V0RWFzZUZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBlYXNlID0gdGhpcy5lYXNpbmdNb2RlKCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZWFzZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIHZhciBtYXliZUVhc2VGdW5jdGlvbiA9IEVBU0VfTkFNRV9NQVBQSU5HW2Vhc2VdOwogICAgICAgICAgICAgICAgaWYgKG1heWJlRWFzZUZ1bmN0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBvb3BzOyBuYW1lIGlzIHdyb25nIC0gZGVmYXVsdCB0byBsaW5lYXIgaW5zdGVhZAogICAgICAgICAgICAgICAgICAgIHJldHVybiBFQVNFX05BTUVfTUFQUElOR1sibGluZWFyIl07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF5YmVFYXNlRnVuY3Rpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZWFzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRqdXN0IHRoZSBpdGVyYXRpdmUgZGVsYXksIHN1Y2ggdGhhdCBpdCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIG1heFRvdGFsRHVyYXRpb24gY29uc3RyYWludAogICAgICAgICAqLwogICAgICAgIEVhc2luZy5wcm90b3R5cGUuX2dldEFkanVzdGVkSXRlcmF0aXZlRGVsYXkgPSBmdW5jdGlvbiAobnVtYmVyT2ZTdGVwcykgewogICAgICAgICAgICB2YXIgc3RlcFN0YXJ0VGltZUludGVydmFsID0gdGhpcy5tYXhUb3RhbER1cmF0aW9uKCkgLSB0aGlzLnN0ZXBEdXJhdGlvbigpOwogICAgICAgICAgICBzdGVwU3RhcnRUaW1lSW50ZXJ2YWwgPSBNYXRoLm1heChzdGVwU3RhcnRUaW1lSW50ZXJ2YWwsIDApOwogICAgICAgICAgICB2YXIgbWF4UG9zc2libGVJdGVyYXRpdmVEZWxheSA9IHN0ZXBTdGFydFRpbWVJbnRlcnZhbCAvIE1hdGgubWF4KG51bWJlck9mU3RlcHMgLSAxLCAxKTsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMuc3RlcERlbGF5KCksIG1heFBvc3NpYmxlSXRlcmF0aXZlRGVsYXkpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRlZmF1bHQgc3RhcnRpbmcgZGVsYXkgb2YgdGhlIGFuaW1hdGlvbiBpbiBtaWxsaXNlY29uZHMKICAgICAgICAgKi8KICAgICAgICBFYXNpbmcuX0RFRkFVTFRfU1RBUlRfREVMQVlfTUlMTElTRUNPTkRTID0gMDsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGVmYXVsdCBkdXJhdGlvbiBvZiBvbmUgYW5pbWF0aW9uIHN0ZXAgaW4gbWlsbGlzZWNvbmRzCiAgICAgICAgICovCiAgICAgICAgRWFzaW5nLl9ERUZBVUxUX1NURVBfRFVSQVRJT05fTUlMTElTRUNPTkRTID0gMzAwOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkZWZhdWx0IG1heGltdW0gc3RhcnQgZGVsYXkgYmV0d2VlbiBlYWNoIHN0ZXAgb2YgYW4gYW5pbWF0aW9uCiAgICAgICAgICovCiAgICAgICAgRWFzaW5nLl9ERUZBVUxUX0lURVJBVElWRV9ERUxBWV9NSUxMSVNFQ09ORFMgPSAxNTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgZGVmYXVsdCBtYXhpbXVtIHRvdGFsIGFuaW1hdGlvbiBkdXJhdGlvbgogICAgICAgICAqLwogICAgICAgIEVhc2luZy5fREVGQVVMVF9NQVhfVE9UQUxfRFVSQVRJT05fTUlMTElTRUNPTkRTID0gSW5maW5pdHk7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGRlZmF1bHQgZWFzaW5nIG9mIHRoZSBhbmltYXRpb24KICAgICAgICAgKi8KICAgICAgICBFYXNpbmcuX0RFRkFVTFRfRUFTSU5HX01PREUgPSAiZXhwT3V0IjsKICAgICAgICByZXR1cm4gRWFzaW5nOwogICAgfSgpKTsKICAgIGV4cG9ydHMuRWFzaW5nID0gRWFzaW5nOwogICAgfSk7CgogICAgdmFyIG51bGxBbmltYXRvciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIC8qKgogICAgICogQW4gYW5pbWF0b3IgaW1wbGVtZW50YXRpb24gd2l0aCBubyBhbmltYXRpb24uIFRoZSBhdHRyaWJ1dGVzIGFyZQogICAgICogaW1tZWRpYXRlbHkgc2V0IG9uIHRoZSBzZWxlY3Rpb24uCiAgICAgKi8KICAgIHZhciBOdWxsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIE51bGwoKSB7CiAgICAgICAgfQogICAgICAgIE51bGwucHJvdG90eXBlLnRvdGFsVGltZSA9IGZ1bmN0aW9uIChzZWxlY3Rpb24pIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfTsKICAgICAgICBOdWxsLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24gKHNlbGVjdGlvbiwgYXR0clRvQXBwbGllZFByb2plY3RvcikgewogICAgICAgICAgICBzZWxlY3Rpb24gPSBjb2VyY2VEMy5jb2VyY2VFeHRlcm5hbEQzKHNlbGVjdGlvbik7CiAgICAgICAgICAgIHJldHVybiBzZWxlY3Rpb24uYXR0cnMoYXR0clRvQXBwbGllZFByb2plY3Rvcik7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gTnVsbDsKICAgIH0oKSk7CiAgICBleHBvcnRzLk51bGwgPSBOdWxsOwogICAgfSk7CgogICAgdmFyIGFuaW1hdG9ycyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZWFzaW5nQW5pbWF0b3IsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihudWxsQW5pbWF0b3IsIGV4cG9ydHMpOwogICAgfSk7CgogICAgdmFyIGNhY2hlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgQ2FjaGUgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNvbXB1dGUgVGhlIGZ1bmN0aW9uIHdob3NlIHJlc3VsdHMgd2lsbCBiZSBjYWNoZWQuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQ2FjaGUoY29tcHV0ZSkgewogICAgICAgICAgICB0aGlzLmNhY2hlID0ge307CiAgICAgICAgICAgIHRoaXMuY29tcHV0ZSA9IGNvbXB1dGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGVtcHQgdG8gbG9vayB1cCBrIGluIHRoZSBjYWNoZSwgY29tcHV0aW5nIHRoZSByZXN1bHQgaWYgaXQgaXNuJ3QKICAgICAgICAgKiBmb3VuZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrIFRoZSBrZXkgdG8gbG9vayB1cCBpbiB0aGUgY2FjaGUuCiAgICAgICAgICogQHJldHVybiB7VH0gVGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBrOyB0aGUgcmVzdWx0IG9mIGNvbXB1dGUoaykuCiAgICAgICAgICovCiAgICAgICAgQ2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5jYWNoZS5oYXNPd25Qcm9wZXJ0eShrKSkgewogICAgICAgICAgICAgICAgdGhpcy5jYWNoZVtrXSA9IHRoaXMuY29tcHV0ZShrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZVtrXTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0IHRoZSBjYWNoZSBlbXB0eS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge0NhY2hlPFQ+fSBUaGUgY2FsbGluZyBDYWNoZS4KICAgICAgICAgKi8KICAgICAgICBDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuY2FjaGUgPSB7fTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQ2FjaGU7CiAgICB9KCkpOwogICAgZXhwb3J0cy5DYWNoZSA9IENhY2hlOwoKICAgIH0pOwoKICAgIHZhciBtZXRob2RzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgTWV0aG9kcyA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gTWV0aG9kcygpIHsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2sgaWYgdHdvIGFycmF5cyBhcmUgZXF1YWwgYnkgc3RyaWN0IGVxdWFsaXR5LgogICAgICAgICAqLwogICAgICAgIE1ldGhvZHMuYXJyYXlFcSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgIC8vIFRlY2huaWNhbGx5LCBudWxsIGFuZCB1bmRlZmluZWQgYXJlIGFycmF5cyB0b28KICAgICAgICAgICAgaWYgKGEgPT0gbnVsbCB8fCBiID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhID09PSBiOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhLmxlbmd0aCAhPT0gYi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChhW2ldICE9PSBiW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHthbnl9IGEgT2JqZWN0IHRvIGNoZWNrIGFnYWluc3QgYiBmb3IgZXF1YWxpdHkuCiAgICAgICAgICogQHBhcmFtIHthbnl9IGIgT2JqZWN0IHRvIGNoZWNrIGFnYWluc3QgYSBmb3IgZXF1YWxpdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gd2hldGhlciBvciBub3QgdHdvIG9iamVjdHMgc2hhcmUgdGhlIHNhbWUga2V5cywgYW5kCiAgICAgICAgICogICAgICAgICAgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCB0aG9zZSBrZXlzLiBWYWx1ZXMgd2lsbCBiZSBjb21wYXJlZAogICAgICAgICAqICAgICAgICAgIHdpdGggPT09LgogICAgICAgICAqLwogICAgICAgIE1ldGhvZHMub2JqRXEgPSBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGtleXNBID0gT2JqZWN0LmtleXMoYSkuc29ydCgpOwogICAgICAgICAgICB2YXIga2V5c0IgPSBPYmplY3Qua2V5cyhiKS5zb3J0KCk7CiAgICAgICAgICAgIHZhciB2YWx1ZXNBID0ga2V5c0EubWFwKGZ1bmN0aW9uIChrKSB7IHJldHVybiBhW2tdOyB9KTsKICAgICAgICAgICAgdmFyIHZhbHVlc0IgPSBrZXlzQi5tYXAoZnVuY3Rpb24gKGspIHsgcmV0dXJuIGJba107IH0pOwogICAgICAgICAgICByZXR1cm4gTWV0aG9kcy5hcnJheUVxKGtleXNBLCBrZXlzQikgJiYgTWV0aG9kcy5hcnJheUVxKHZhbHVlc0EsIHZhbHVlc0IpOwogICAgICAgIH07CiAgICAgICAgTWV0aG9kcy5zdHJpY3RFcSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBhID09PSBiOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogU2hpbSBmb3IgXy5kZWZhdWx0cwogICAgICAgICAqLwogICAgICAgIE1ldGhvZHMuZGVmYXVsdHMgPSBmdW5jdGlvbiAodGFyZ2V0KSB7CiAgICAgICAgICAgIHZhciBvYmplY3RzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICBvYmplY3RzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0YXJnZXQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJlc3VsdCA9IE9iamVjdCh0YXJnZXQpOwogICAgICAgICAgICBvYmplY3RzLmZvckVhY2goZnVuY3Rpb24gKG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iaiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIga2V5IGluIG9iaikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwga2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2tleV0gPSBvYmpba2V5XTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gTWV0aG9kczsKICAgIH0oKSk7CiAgICBleHBvcnRzLk1ldGhvZHMgPSBNZXRob2RzOwoKICAgIH0pOwoKICAgIHZhciBzdHJpbmdNZXRob2RzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgU3RyaW5nTWV0aG9kcyA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gU3RyaW5nTWV0aG9kcygpIHsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVHJlYXQgYWxsIHNlcXVlbmNlcyBvZiBjb25zZWN1dGl2ZSBzcGFjZXMgYXMgYSBzaW5nbGUgIiAiLgogICAgICAgICAqLwogICAgICAgIFN0cmluZ01ldGhvZHMuY29tYmluZVdoaXRlc3BhY2UgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBzdHIucmVwbGFjZSgvWyBcdF0rL2csICIgIik7CiAgICAgICAgfTsKICAgICAgICBTdHJpbmdNZXRob2RzLmlzTm90RW1wdHlTdHJpbmcgPSBmdW5jdGlvbiAoc3RyKSB7CiAgICAgICAgICAgIHJldHVybiBzdHIgJiYgc3RyLnRyaW0oKSAhPT0gIiI7CiAgICAgICAgfTsKICAgICAgICBTdHJpbmdNZXRob2RzLnRyaW1TdGFydCA9IGZ1bmN0aW9uIChzdHIsIHNwbGl0dGVyKSB7CiAgICAgICAgICAgIGlmICghc3RyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3RyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjaGFycyA9IHN0ci5zcGxpdCgiIik7CiAgICAgICAgICAgIHZhciByZWR1Y2VGdW5jdGlvbiA9IHNwbGl0dGVyID8gZnVuY3Rpb24gKHMpIHsgcmV0dXJuIHMuc3BsaXQoc3BsaXR0ZXIpLnNvbWUoU3RyaW5nTWV0aG9kcy5pc05vdEVtcHR5U3RyaW5nKTsgfQogICAgICAgICAgICAgICAgOiBTdHJpbmdNZXRob2RzLmlzTm90RW1wdHlTdHJpbmc7CiAgICAgICAgICAgIHJldHVybiBjaGFycy5yZWR1Y2UoZnVuY3Rpb24gKHMsIGMpIHsgcmV0dXJuIHJlZHVjZUZ1bmN0aW9uKHMgKyBjKSA/IHMgKyBjIDogczsgfSwgIiIpOwogICAgICAgIH07CiAgICAgICAgU3RyaW5nTWV0aG9kcy50cmltRW5kID0gZnVuY3Rpb24gKHN0ciwgYykgewogICAgICAgICAgICBpZiAoIXN0cikgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0cjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmV2ZXJzZWRDaGFycyA9IHN0ci5zcGxpdCgiIik7CiAgICAgICAgICAgIHJldmVyc2VkQ2hhcnMucmV2ZXJzZSgpOwogICAgICAgICAgICByZXZlcnNlZENoYXJzID0gU3RyaW5nTWV0aG9kcy50cmltU3RhcnQocmV2ZXJzZWRDaGFycy5qb2luKCIiKSwgYykuc3BsaXQoIiIpOwogICAgICAgICAgICByZXZlcnNlZENoYXJzLnJldmVyc2UoKTsKICAgICAgICAgICAgcmV0dXJuIHJldmVyc2VkQ2hhcnMuam9pbigiIik7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gU3RyaW5nTWV0aG9kczsKICAgIH0oKSk7CiAgICBleHBvcnRzLlN0cmluZ01ldGhvZHMgPSBTdHJpbmdNZXRob2RzOwoKICAgIH0pOwoKICAgIHZhciB0b2tlbml6ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCiAgICAgKiBsaWNlbnNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci90eXBlc2V0dGFibGUvYmxvYi9kZXZlbG9wL0xJQ0VOU0UKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBUb2tlbml6ZXIgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIFRva2VuaXplcigpIHsKICAgICAgICAgICAgdGhpcy5Xb3JkRGl2aWRlclJlZ0V4cCA9IG5ldyBSZWdFeHAoIlxcVyIpOwogICAgICAgICAgICB0aGlzLldoaXRlc3BhY2VSZWdFeHAgPSBuZXcgUmVnRXhwKCJcXHMiKTsKICAgICAgICB9CiAgICAgICAgVG9rZW5pemVyLnByb3RvdHlwZS50b2tlbml6ZSA9IGZ1bmN0aW9uIChsaW5lKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBsaW5lLnNwbGl0KCIiKS5yZWR1Y2UoZnVuY3Rpb24gKHRva2VucywgYykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vucy5zbGljZSgwLCAtMSkuY29uY2F0KF90aGlzLnNob3VsZENyZWF0ZU5ld1Rva2VuKHRva2Vuc1t0b2tlbnMubGVuZ3RoIC0gMV0sIGMpKTsKICAgICAgICAgICAgfSwgWyIiXSk7CiAgICAgICAgfTsKICAgICAgICBUb2tlbml6ZXIucHJvdG90eXBlLnNob3VsZENyZWF0ZU5ld1Rva2VuID0gZnVuY3Rpb24gKHRva2VuLCBuZXdDaGFyYWN0ZXIpIHsKICAgICAgICAgICAgaWYgKCF0b2tlbikgewogICAgICAgICAgICAgICAgcmV0dXJuIFtuZXdDaGFyYWN0ZXJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBsYXN0Q2hhcmFjdGVyID0gdG9rZW5bdG9rZW4ubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIGlmICh0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChsYXN0Q2hhcmFjdGVyKSAmJiB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChuZXdDaGFyYWN0ZXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW3Rva2VuICsgbmV3Q2hhcmFjdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChsYXN0Q2hhcmFjdGVyKSB8fCB0aGlzLldoaXRlc3BhY2VSZWdFeHAudGVzdChuZXdDaGFyYWN0ZXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW3Rva2VuLCBuZXdDaGFyYWN0ZXJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCEodGhpcy5Xb3JkRGl2aWRlclJlZ0V4cC50ZXN0KGxhc3RDaGFyYWN0ZXIpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFt0b2tlbiArIG5ld0NoYXJhY3Rlcl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobGFzdENoYXJhY3RlciA9PT0gbmV3Q2hhcmFjdGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW3Rva2VuICsgbmV3Q2hhcmFjdGVyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBbdG9rZW4sIG5ld0NoYXJhY3Rlcl07CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBUb2tlbml6ZXI7CiAgICB9KCkpOwogICAgZXhwb3J0cy5Ub2tlbml6ZXIgPSBUb2tlbml6ZXI7CgogICAgfSk7CgogICAgdmFyIHV0aWxzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9fZXhwb3J0KG0pIHsKICAgICAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgX19leHBvcnQoY2FjaGUpOwogICAgX19leHBvcnQobWV0aG9kcyk7CiAgICBfX2V4cG9ydChzdHJpbmdNZXRob2RzKTsKICAgIF9fZXhwb3J0KHRva2VuaXplcik7CgogICAgfSk7CgogICAgdmFyIHdyaXRlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAqIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3R5cGVzZXR0YWJsZS9ibG9iL2RldmVsb3AvTElDRU5TRQogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHZhciBERUZBVUxUX1dSSVRFX09QVElPTlMgPSB7CiAgICAgICAgdGV4dFJvdGF0aW9uOiAwLAogICAgICAgIHRleHRTaGVhcjogMCwKICAgICAgICB4QWxpZ246ICJsZWZ0IiwKICAgICAgICB5QWxpZ246ICJ0b3AiLAogICAgfTsKICAgIHZhciBXcml0ZXIgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIFdyaXRlcihfbWVhc3VyZXIsIF9wZW5GYWN0b3J5LCBfd3JhcHBlcikgewogICAgICAgICAgICB0aGlzLl9tZWFzdXJlciA9IF9tZWFzdXJlcjsKICAgICAgICAgICAgdGhpcy5fcGVuRmFjdG9yeSA9IF9wZW5GYWN0b3J5OwogICAgICAgICAgICB0aGlzLl93cmFwcGVyID0gX3dyYXBwZXI7CiAgICAgICAgfQogICAgICAgIFdyaXRlci5wcm90b3R5cGUubWVhc3VyZXIgPSBmdW5jdGlvbiAobmV3TWVhc3VyZXIpIHsKICAgICAgICAgICAgdGhpcy5fbWVhc3VyZXIgPSBuZXdNZWFzdXJlcjsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBXcml0ZXIucHJvdG90eXBlLndyYXBwZXIgPSBmdW5jdGlvbiAobmV3V3JhcHBlcikgewogICAgICAgICAgICB0aGlzLl93cmFwcGVyID0gbmV3V3JhcHBlcjsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBXcml0ZXIucHJvdG90eXBlLnBlbkZhY3RvcnkgPSBmdW5jdGlvbiAobmV3UGVuRmFjdG9yeSkgewogICAgICAgICAgICB0aGlzLl9wZW5GYWN0b3J5ID0gbmV3UGVuRmFjdG9yeTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBXcml0ZXMgdGhlIHRleHQgaW50byB0aGUgY29udGFpbmVyLiBJZiBubyBjb250YWluZXIgaXMgc3BlY2lmaWVkLCB0aGUgcGVuJ3MKICAgICAgICAgKiBkZWZhdWx0IGNvbnRhaW5lciB3aWxsIGJlIHVzZWQuCiAgICAgICAgICovCiAgICAgICAgV3JpdGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uICh0ZXh0LCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zLCBjb250YWluZXIpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMgPT09IHZvaWQgMCkgeyBvcHRpb25zID0ge307IH0KICAgICAgICAgICAgLy8gYXBwbHkgZGVmYXVsdCBvcHRpb25zCiAgICAgICAgICAgIG9wdGlvbnMgPSB1dGlscy5NZXRob2RzLmRlZmF1bHRzKHt9LCBERUZBVUxUX1dSSVRFX09QVElPTlMsIG9wdGlvbnMpOwogICAgICAgICAgICAvLyB2YWxpZGF0ZSBpbnB1dAogICAgICAgICAgICBpZiAoV3JpdGVyLlN1cHBvcnRlZFJvdGF0aW9uLmluZGV4T2Yob3B0aW9ucy50ZXh0Um90YXRpb24pID09PSAtMSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bnN1cHBvcnRlZCByb3RhdGlvbiAtICIgKyBvcHRpb25zLnRleHRSb3RhdGlvbiArCiAgICAgICAgICAgICAgICAgICAgIi4gU3VwcG9ydGVkIHJvdGF0aW9ucyBhcmUgIiArIFdyaXRlci5TdXBwb3J0ZWRSb3RhdGlvbi5qb2luKCIsICIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy50ZXh0U2hlYXIgIT0gbnVsbCAmJiBvcHRpb25zLnRleHRTaGVhciA8IC04MCB8fCBvcHRpb25zLnRleHRTaGVhciA+IDgwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInVuc3VwcG9ydGVkIHNoZWFyIGFuZ2xlIC0gIiArIG9wdGlvbnMudGV4dFNoZWFyICsgIi4gTXVzdCBiZSBiZXR3ZWVuIC04MCBhbmQgODAiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb3JpZW50SG9yaXpvbnRhbGx5ID0gTWF0aC5hYnMoTWF0aC5hYnMob3B0aW9ucy50ZXh0Um90YXRpb24pIC0gOTApID4gNDU7CiAgICAgICAgICAgIHZhciBwcmltYXJ5RGltZW5zaW9uID0gb3JpZW50SG9yaXpvbnRhbGx5ID8gd2lkdGggOiBoZWlnaHQ7CiAgICAgICAgICAgIHZhciBzZWNvbmRhcnlEaW1lbnNpb24gPSBvcmllbnRIb3Jpem9udGFsbHkgPyBoZWlnaHQgOiB3aWR0aDsKICAgICAgICAgICAgLy8gY29tcHV0ZSBzaGVhciBwYXJhbWV0ZXJzCiAgICAgICAgICAgIHZhciBzaGVhckRlZ3JlZXMgPSBvcHRpb25zLnRleHRTaGVhcjsKICAgICAgICAgICAgdmFyIHNoZWFyUmFkaWFucyA9IHNoZWFyRGVncmVlcyAqIE1hdGguUEkgLyAxODA7CiAgICAgICAgICAgIHZhciBsaW5lSGVpZ2h0ID0gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDsKICAgICAgICAgICAgdmFyIHNoZWFyU2hpZnQgPSBsaW5lSGVpZ2h0ICogTWF0aC50YW4oc2hlYXJSYWRpYW5zKTsKICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcHBseSB0ZXh0IHNoZWFyLCB0aGUgcHJpbWFyeSBheGlzIGdyb3dzIGFuZCB0aGUgc2Vjb25kYXJ5IGF4aXMKICAgICAgICAgICAgLy8gc2hyaW5rcywgZHVlIHRvIHRyaWdvbm9tZXRyeS4gVGhlIHRleHQgc2hlYXIgZmVhdHVyZSB1c2VzIHRoZSBub3JtYWwKICAgICAgICAgICAgLy8gd3JhcHBpbmcgbG9naWMgd2l0aCBhIHN1YnNpdHV0ZWQgYm91bmRpbmcgYm94IG9mIHRoZSBjb3JyZWN0ZWQgc2l6ZQogICAgICAgICAgICAvLyAoY29tcHV0ZWQgYmVsb3cpLiBXaGVuIHJlbmRlcmluZyB0aGUgd3JhcHBlZCBsaW5lcywgd2Ugcm90YXRlIHRoZSB0ZXh0CiAgICAgICAgICAgIC8vIGNvbnRhaW5lciBieSB0aGUgdGV4dCByb3RhdGlvbiBhbmdsZSBBTkQgdGhlIHNoZWFyIGFuZ2xlIHRoZW4gY2FyZWZ1bGx5CiAgICAgICAgICAgIC8vIG9mZnNldCBlYWNoIG9uZSBzbyB0aGF0IHRoZXkgYXJlIHN0aWxsIGFsaWduZWQgdG8gdGhlIHByaW1hcnkgYWxpZ25tZW50CiAgICAgICAgICAgIC8vIG9wdGlvbi4KICAgICAgICAgICAgdmFyIHNoZWFyQ29ycmVjdGVkUHJpbWFyeURpbWVuc2lvbiA9IHByaW1hcnlEaW1lbnNpb24gLyBNYXRoLmNvcyhzaGVhclJhZGlhbnMpIC0gTWF0aC5hYnMoc2hlYXJTaGlmdCk7CiAgICAgICAgICAgIHZhciBzaGVhckNvcnJlY3RlZFNlY29uZGFyeURpbWVuc2lvbiA9IHNlY29uZGFyeURpbWVuc2lvbiAqIE1hdGguY29zKHNoZWFyUmFkaWFucyk7CiAgICAgICAgICAgIC8vIG5vcm1hbGl6ZSBhbmQgd3JhcCB0ZXh0CiAgICAgICAgICAgIHZhciBub3JtYWxpemVkVGV4dCA9IHV0aWxzLlN0cmluZ01ldGhvZHMuY29tYmluZVdoaXRlc3BhY2UodGV4dCk7CiAgICAgICAgICAgIHZhciB3cmFwcGVkVGV4dCA9IHRoaXMuX3dyYXBwZXIgPwogICAgICAgICAgICAgICAgdGhpcy5fd3JhcHBlci53cmFwKG5vcm1hbGl6ZWRUZXh0LCB0aGlzLl9tZWFzdXJlciwgc2hlYXJDb3JyZWN0ZWRQcmltYXJ5RGltZW5zaW9uLCBzaGVhckNvcnJlY3RlZFNlY29uZGFyeURpbWVuc2lvbikud3JhcHBlZFRleHQgOiBub3JtYWxpemVkVGV4dDsKICAgICAgICAgICAgdmFyIGxpbmVzID0gd3JhcHBlZFRleHQuc3BsaXQoIlxuIik7CiAgICAgICAgICAgIC8vIGNvcnJlY3QgdGhlIGludGlhbCB4L3kgb2Zmc2V0IG9mIHRoZSB0ZXh0IGNvbnRhaW5lciBhY2NvdW50aW5nIHNoZWFyIGFuZCBhbGlnbm1lbnQKICAgICAgICAgICAgdmFyIHNoZWFyQ29ycmVjdGVkWE9mZnNldCA9IFdyaXRlci5YT2Zmc2V0RmFjdG9yW29wdGlvbnMueEFsaWduXSAqCiAgICAgICAgICAgICAgICBzaGVhckNvcnJlY3RlZFByaW1hcnlEaW1lbnNpb24gKiBNYXRoLnNpbihzaGVhclJhZGlhbnMpOwogICAgICAgICAgICB2YXIgc2hlYXJDb3JyZWN0ZWRZT2Zmc2V0ID0gV3JpdGVyLllPZmZzZXRGYWN0b3Jbb3B0aW9ucy55QWxpZ25dICoKICAgICAgICAgICAgICAgIChzaGVhckNvcnJlY3RlZFNlY29uZGFyeURpbWVuc2lvbiAtIGxpbmVzLmxlbmd0aCAqIGxpbmVIZWlnaHQpOwogICAgICAgICAgICB2YXIgc2hlYXJDb3JyZWN0aW9uID0gc2hlYXJDb3JyZWN0ZWRYT2Zmc2V0IC0gc2hlYXJDb3JyZWN0ZWRZT2Zmc2V0OwogICAgICAgICAgICAvLyBjb21wdXRlIHRyYW5zZm9ybQogICAgICAgICAgICB2YXIgdHJhbnNsYXRlID0gWzAsIDBdOwogICAgICAgICAgICB2YXIgcm90YXRlID0gb3B0aW9ucy50ZXh0Um90YXRpb24gKyBzaGVhckRlZ3JlZXM7CiAgICAgICAgICAgIHN3aXRjaCAob3B0aW9ucy50ZXh0Um90YXRpb24pIHsKICAgICAgICAgICAgICAgIGNhc2UgOTA6CiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlID0gW3dpZHRoICsgc2hlYXJDb3JyZWN0aW9uLCAwXTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgLTkwOgogICAgICAgICAgICAgICAgICAgIHRyYW5zbGF0ZSA9IFstc2hlYXJDb3JyZWN0aW9uLCBoZWlnaHRdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAxODA6CiAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlID0gW3dpZHRoLCBoZWlnaHQgKyBzaGVhckNvcnJlY3Rpb25dOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0cmFuc2xhdGUgPSBbMCwgLXNoZWFyQ29ycmVjdGlvbl07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHBlbiBhbmQgd3JpdGUgdGhlIGxpbmVzCiAgICAgICAgICAgIHZhciBsaW5lUGVuID0gdGhpcy5fcGVuRmFjdG9yeS5jcmVhdGVQZW4odGV4dCwgeyB0cmFuc2xhdGU6IHRyYW5zbGF0ZSwgcm90YXRlOiByb3RhdGUgfSwgY29udGFpbmVyKTsKICAgICAgICAgICAgdGhpcy53cml0ZUxpbmVzKGxpbmVzLCBsaW5lUGVuLCBzaGVhckNvcnJlY3RlZFByaW1hcnlEaW1lbnNpb24sIGxpbmVIZWlnaHQsIHNoZWFyU2hpZnQsIG9wdGlvbnMueEFsaWduKTsKICAgICAgICAgICAgaWYgKGxpbmVQZW4uZGVzdHJveSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBsaW5lUGVuLmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgV3JpdGVyLnByb3RvdHlwZS53cml0ZUxpbmVzID0gZnVuY3Rpb24gKGxpbmVzLCBsaW5lUGVuLCB3aWR0aCwgbGluZUhlaWdodCwgc2hlYXJTaGlmdCwgeEFsaWduKSB7CiAgICAgICAgICAgIGxpbmVzLmZvckVhY2goZnVuY3Rpb24gKGxpbmUsIGkpIHsKICAgICAgICAgICAgICAgIHZhciB4U2hlYXJPZmZzZXQgPSAoc2hlYXJTaGlmdCA+IDApID8gKGkgKyAxKSAqIHNoZWFyU2hpZnQgOiAoaSkgKiBzaGVhclNoaWZ0OwogICAgICAgICAgICAgICAgbGluZVBlbi53cml0ZShsaW5lLCB3aWR0aCwgeEFsaWduLCB4U2hlYXJPZmZzZXQsIChpICsgMSkgKiBsaW5lSGVpZ2h0KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gV3JpdGVyOwogICAgfSgpKTsKICAgIFdyaXRlci5YT2Zmc2V0RmFjdG9yID0gewogICAgICAgIGNlbnRlcjogMC41LAogICAgICAgIGxlZnQ6IDAsCiAgICAgICAgcmlnaHQ6IDEsCiAgICB9OwogICAgV3JpdGVyLllPZmZzZXRGYWN0b3IgPSB7CiAgICAgICAgYm90dG9tOiAxLAogICAgICAgIGNlbnRlcjogMC41LAogICAgICAgIHRvcDogMCwKICAgIH07CiAgICBXcml0ZXIuU3VwcG9ydGVkUm90YXRpb24gPSBbLTkwLCAwLCAxODAsIDkwXTsKICAgIGV4cG9ydHMuV3JpdGVyID0gV3JpdGVyOwoKICAgIH0pOwoKICAgIHZhciB3cml0ZXJzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9fZXhwb3J0KG0pIHsKICAgICAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgX19leHBvcnQod3JpdGVyKTsKCiAgICB9KTsKCiAgICB2YXIgaHRtbCQzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgSHRtbFV0aWxzID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBIdG1sVXRpbHMoKSB7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFwcGVuZHMgYW4gSFRNTCBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCB0YWcgbmFtZSB0byB0aGUgcHJvdmlkZWQgZWxlbWVudC4KICAgICAgICAgKiBUaGUgdmFyaWFkaWMgY2xhc3NuYW1lcyBhcmUgYWRkZWQgdG8gdGhlIG5ldyBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogUmV0dXJucyB0aGUgbmV3IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgSHRtbFV0aWxzLmFwcGVuZCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0YWdOYW1lKSB7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjaGlsZCA9IEh0bWxVdGlscy5jcmVhdGUuYXBwbHkoSHRtbFV0aWxzLCBbdGFnTmFtZV0uY29uY2F0KGNsYXNzTmFtZXMpKTsKICAgICAgICAgICAgZWxlbWVudC5hcHBlbmRDaGlsZChjaGlsZCk7CiAgICAgICAgICAgIHJldHVybiBjaGlsZDsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW5kIHJldHVybnMgYSBuZXcgSFRNTEVsZW1lbnQgd2l0aCB0aGUgYXR0YWNoZWQgY2xhc3NuYW1lcy4KICAgICAgICAgKi8KICAgICAgICBIdG1sVXRpbHMuY3JlYXRlID0gZnVuY3Rpb24gKHRhZ05hbWUpIHsKICAgICAgICAgICAgdmFyIGNsYXNzTmFtZXMgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICAgIGNsYXNzTmFtZXNbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KHRhZ05hbWUpOwogICAgICAgICAgICBIdG1sVXRpbHMuYWRkQ2xhc3Nlcy5hcHBseShIdG1sVXRpbHMsIFtlbGVtZW50XS5jb25jYXQoY2xhc3NOYW1lcykpOwogICAgICAgICAgICByZXR1cm4gZWxlbWVudDsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgdGhlIHZhcmlhZGljIGNsYXNzbmFtZXMgdG8gdGhlIEVsZW1lbnQKICAgICAgICAgKi8KICAgICAgICBIdG1sVXRpbHMuYWRkQ2xhc3NlcyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMTsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW19pIC0gMV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNsYXNzTmFtZXMgPSBjbGFzc05hbWVzLmZpbHRlcihmdW5jdGlvbiAoYykgeyByZXR1cm4gYyAhPSBudWxsOyB9KTsKICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNsYXNzTmFtZXMuZm9yRWFjaChmdW5jdGlvbiAoY2xhc3NOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIElFIDExIGRvZXMgbm90IHN1cHBvcnQgY2xhc3NMaXN0CiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCBjbGFzc05hbWVzLmpvaW4oIiAiKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHdpZHRoL2hlaWdodCBvZiBIVE1MRWxlbWVudCdzIGJvdW5kaW5nIGJveAogICAgICAgICAqLwogICAgICAgIEh0bWxVdGlscy5nZXREaW1lbnNpb25zID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gdXNpbmcgZmVhdHVyZSBkZXRlY3Rpb24sIHNhZmVseSByZXR1cm4gdGhlIGJvdW5kaW5nIGJveCBkaW1lbnNpb25zIG9mIHRoZQogICAgICAgICAgICAvLyBwcm92aWRlZCBodG1sIGVsZW1lbnQKICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHZhciBfYSA9IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIHdpZHRoID0gX2Eud2lkdGgsIGhlaWdodCA9IF9hLmhlaWdodDsKICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IHRvIHByZXZlbnQgTm9Nb2RpZmljYXRpb25BbGxvd2VkRXJyb3IKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc3dhbGxvdyBhbnkgZXJyb3JzIHRoYXQgb2NjdXIgKEZpcmVmb3ggTGludXgpCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgY2FuJ3QgZ2V0IHZhbGlkIGJib3gsIHJldHVybiAwLDAKICAgICAgICAgICAgcmV0dXJuIHsgaGVpZ2h0OiAwLCB3aWR0aDogMCB9OwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEh0bWxVdGlsczsKICAgIH0oKSk7CiAgICBleHBvcnRzLkh0bWxVdGlscyA9IEh0bWxVdGlsczsKICAgIC8qKgogICAgICogQSB0eXBlc2V0dGVyIGNvbnRleHQgZm9yIEhUTUwuCiAgICAgKi8KICAgIHZhciBIdG1sQ29udGV4dCA9IChmdW5jdGlvbiAoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIGVsZW1lbnQgLSBUaGUgQ1NTIGZvbnQgc3R5bGVzIGFwcGxpZWQgdG8gYGVsZW1lbnRgIHdpbGwgZGV0ZXJtaW5lIHRoZQogICAgICAgICAqIHNpemUgb2YgdGV4dCBtZWFzdXJlbWVudHMuIEFsc28gdGhlIGRlZmF1bHQgdGV4dCBibG9jayBjb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIGNsYXNzTmFtZSAtIGFkZGVkIHRvIG5ldyB0ZXh0IGJsb2NrcwogICAgICAgICAqIEBwYXJhbSBhZGRUaXRsZSAtIGVuYWJsZSB0aXRsZSBhdHRyaWJ1dGUgdG8gYmUgYWRkZWQgdG8gbmV3IHRleHQgYmxvY2tzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIEh0bWxDb250ZXh0KGVsZW1lbnQsIGNsYXNzTmFtZSwgYWRkVGl0bGUpIHsKICAgICAgICAgICAgaWYgKGFkZFRpdGxlID09PSB2b2lkIDApIHsgYWRkVGl0bGUgPSBmYWxzZTsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICAgICAgICAgdGhpcy5hZGRUaXRsZSA9IGFkZFRpdGxlOwogICAgICAgICAgICB0aGlzLmNyZWF0ZVJ1bGVyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRleHRFbGVtZW50ID0gSHRtbFV0aWxzLmFwcGVuZChfdGhpcy5lbGVtZW50LCAic3BhbiIsICJ0ZXh0LXRtcCIsIF90aGlzLmNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgdGV4dEVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogICAgICAgICAgICAgICAgICAgIHZhciBkaW1lbnNpb25zID0gSHRtbFV0aWxzLmdldERpbWVuc2lvbnModGV4dEVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmVsZW1lbnQucmVtb3ZlQ2hpbGQodGV4dEVsZW1lbnQpOyAvLyBlbGVtZW50LnJlbW92ZSgpIGRvZXNuJ3Qgd29yayBpbiBJRTExCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpbWVuc2lvbnM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmNyZWF0ZVBlbiA9IGZ1bmN0aW9uICh0ZXh0LCB0cmFuc2Zvcm0sIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gX3RoaXMuZWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0ZXh0QmxvY2sgPSBIdG1sVXRpbHMuYXBwZW5kKGVsZW1lbnQsICJkaXYiLCAidGV4dC1ibG9jayIsIF90aGlzLmNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICB0ZXh0QmxvY2suc3R5bGUucG9zaXRpb24gPSAicmVsYXRpdmUiOwogICAgICAgICAgICAgICAgdGV4dEJsb2NrLnN0eWxlLnRyYW5zZm9ybSA9CiAgICAgICAgICAgICAgICAgICAgInRyYW5zbGF0ZSgwLCAtMWVtKSAiICsKICAgICAgICAgICAgICAgICAgICAgICAgKCJ0cmFuc2xhdGUoIiArIHRyYW5zZm9ybS50cmFuc2xhdGVbMF0gKyAicHgsICIgKyB0cmFuc2Zvcm0udHJhbnNsYXRlWzFdICsgInB4KSAiKSArCiAgICAgICAgICAgICAgICAgICAgICAgICgicm90YXRlKCIgKyB0cmFuc2Zvcm0ucm90YXRlICsgImRlZykiKTsKICAgICAgICAgICAgICAgIC8vIFRoaXMgYXdrd2FyZCB0cmFuc2Zvcm0gb3JpZ2luIG1hdGNoZXMgdGhlIFNWRyBvcmlnaW4KICAgICAgICAgICAgICAgIHRleHRCbG9jay5zdHlsZS50cmFuc2Zvcm1PcmlnaW4gPSAiMCAxLjJlbSI7CiAgICAgICAgICAgICAgICAvLyBhdHRhY2ggb3B0aW9uYWwgdGl0bGUKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5hZGRUaXRsZSkgewogICAgICAgICAgICAgICAgICAgIHRleHRCbG9jay5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuY3JlYXRlSHRtbExpbmVQZW4odGV4dEJsb2NrKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgSHRtbENvbnRleHQucHJvdG90eXBlLnNldEFkZFRpdGxlID0gZnVuY3Rpb24gKGFkZFRpdGxlKSB7CiAgICAgICAgICAgIHRoaXMuYWRkVGl0bGUgPSBhZGRUaXRsZTsKICAgICAgICB9OwogICAgICAgIEh0bWxDb250ZXh0LnByb3RvdHlwZS5jcmVhdGVIdG1sTGluZVBlbiA9IGZ1bmN0aW9uICh0ZXh0QmxvY2spIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHdyaXRlOiBmdW5jdGlvbiAobGluZSwgd2lkdGgsIHhBbGlnbiwgeE9mZnNldCwgeU9mZnNldCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXh0TGluZSA9IEh0bWxVdGlscy5hcHBlbmQodGV4dEJsb2NrLCAiZGl2IiwgInRleHQtbGluZSIpOwogICAgICAgICAgICAgICAgICAgIHRleHRMaW5lLnRleHRDb250ZW50ID0gbGluZTsKICAgICAgICAgICAgICAgICAgICB0ZXh0TGluZS5zdHlsZS53aWR0aCA9IHdpZHRoICsgInB4IjsKICAgICAgICAgICAgICAgICAgICB0ZXh0TGluZS5zdHlsZS50ZXh0QWxpZ24gPSB4QWxpZ247CiAgICAgICAgICAgICAgICAgICAgdGV4dExpbmUuc3R5bGUucG9zaXRpb24gPSAiYWJzb2x1dGUiOwogICAgICAgICAgICAgICAgICAgIHRleHRMaW5lLnN0eWxlLndoaXRlU3BhY2UgPSAibm93cmFwIjsKICAgICAgICAgICAgICAgICAgICB0ZXh0TGluZS5zdHlsZS50b3AgPSB5T2Zmc2V0ICsgInB4IjsKICAgICAgICAgICAgICAgICAgICB0ZXh0TGluZS5zdHlsZS5sZWZ0ID0geE9mZnNldCArICJweCI7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEh0bWxDb250ZXh0OwogICAgfSgpKTsKICAgIGV4cG9ydHMuSHRtbENvbnRleHQgPSBIdG1sQ29udGV4dDsKCiAgICB9KTsKCiAgICB2YXIgc3ZnJDEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCiAgICAgKiBsaWNlbnNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci90eXBlc2V0dGFibGUvYmxvYi9kZXZlbG9wL0xJQ0VOU0UKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgdmFyIFN2Z1V0aWxzID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBTdmdVdGlscygpIHsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXBwZW5kcyBhbiBTVkcgZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQgdGFnIG5hbWUgdG8gdGhlIHByb3ZpZGVkIGVsZW1lbnQuCiAgICAgICAgICogVGhlIHZhcmlhZGljIGNsYXNzbmFtZXMgYXJlIGFkZGVkIHRvIHRoZSBuZXcgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIFJldHVybnMgdGhlIG5ldyBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIFN2Z1V0aWxzLmFwcGVuZCA9IGZ1bmN0aW9uIChlbGVtZW50LCB0YWdOYW1lKSB7CiAgICAgICAgICAgIHZhciBjbGFzc05hbWVzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICBjbGFzc05hbWVzW19pIC0gMl0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjaGlsZCA9IFN2Z1V0aWxzLmNyZWF0ZS5hcHBseShTdmdVdGlscywgW3RhZ05hbWVdLmNvbmNhdChjbGFzc05hbWVzKSk7CiAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoY2hpbGQpOwogICAgICAgICAgICByZXR1cm4gY2hpbGQ7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGFuZCByZXR1cm5zIGEgbmV3IFNWR0VsZW1lbnQgd2l0aCB0aGUgYXR0YWNoZWQgY2xhc3NuYW1lcy4KICAgICAgICAgKi8KICAgICAgICBTdmdVdGlscy5jcmVhdGUgPSBmdW5jdGlvbiAodGFnTmFtZSkgewogICAgICAgICAgICB2YXIgY2xhc3NOYW1lcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBfaSA9IDE7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgY2xhc3NOYW1lc1tfaSAtIDFdID0gYXJndW1lbnRzW19pXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTdmdVdGlscy5TVkdfTlMsIHRhZ05hbWUpOwogICAgICAgICAgICBodG1sJDMuSHRtbFV0aWxzLmFkZENsYXNzZXMuYXBwbHkoaHRtbCQzLkh0bWxVdGlscywgW2VsZW1lbnRdLmNvbmNhdChjbGFzc05hbWVzKSk7CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgd2lkdGgvaGVpZ2h0IG9mIHN2ZyBlbGVtZW50J3MgYm91bmRpbmcgYm94CiAgICAgICAgICovCiAgICAgICAgU3ZnVXRpbHMuZ2V0RGltZW5zaW9ucyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgIC8vIHVzaW5nIGZlYXR1cmUgZGV0ZWN0aW9uLCBzYWZlbHkgcmV0dXJuIHRoZSBib3VuZGluZyBib3ggZGltZW5zaW9ucyBvZiB0aGUKICAgICAgICAgICAgLy8gcHJvdmlkZWQgc3ZnIGVsZW1lbnQKICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QkJveCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2EgPSBlbGVtZW50LmdldEJCb3goKSwgd2lkdGggPSBfYS53aWR0aCwgaGVpZ2h0ID0gX2EuaGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgdG8gcHJldmVudCBOb01vZGlmaWNhdGlvbkFsbG93ZWRFcnJvcgogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzd2FsbG93IGFueSBlcnJvcnMgdGhhdCBvY2N1ciAoRmlyZWZveCBMaW51eCkKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpZiBjYW4ndCBnZXQgdmFsaWQgYmJveCwgcmV0dXJuIDAsMAogICAgICAgICAgICByZXR1cm4geyBoZWlnaHQ6IDAsIHdpZHRoOiAwIH07CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gU3ZnVXRpbHM7CiAgICB9KCkpOwogICAgU3ZnVXRpbHMuU1ZHX05TID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIjsKICAgIGV4cG9ydHMuU3ZnVXRpbHMgPSBTdmdVdGlsczsKICAgIC8qKgogICAgICogQSB0eXBlc2V0dGVyIGNvbnRleHQgZm9yIFNWRy4KICAgICAqCiAgICAgKiBAcGFyYW0gZWxlbWVudCAtIFRoZSBDU1MgZm9udCBzdHlsZXMgYXBwbGllZCB0byBgZWxlbWVudGAgd2lsbCBkZXRlcm1pbmUgdGhlCiAgICAgKiBzaXplIG9mIHRleHQgbWVhc3VyZW1lbnRzLiBBbHNvIHRoZSBkZWZhdWx0IHRleHQgYmxvY2sgY29udGFpbmVyLgogICAgICogQHBhcmFtIGNsYXNzTmFtZSAtIGFkZGVkIHRvIG5ldyB0ZXh0IGJsb2NrcwogICAgICogQHBhcmFtIGFkZFRpdGxlRWxlbWVudCAtIGVuYWJsZSB0aXRsZSB0YWdzIHRvIGJlIGFkZGVkIHRvIG5ldyB0ZXh0IGJsb2Nrcy4KICAgICAqLwogICAgdmFyIFN2Z0NvbnRleHQgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIFN2Z0NvbnRleHQoZWxlbWVudCwgY2xhc3NOYW1lLCBhZGRUaXRsZUVsZW1lbnQpIHsKICAgICAgICAgICAgaWYgKGFkZFRpdGxlRWxlbWVudCA9PT0gdm9pZCAwKSB7IGFkZFRpdGxlRWxlbWVudCA9IGZhbHNlOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9IGVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuY2xhc3NOYW1lID0gY2xhc3NOYW1lOwogICAgICAgICAgICB0aGlzLmFkZFRpdGxlRWxlbWVudCA9IGFkZFRpdGxlRWxlbWVudDsKICAgICAgICAgICAgdGhpcy5jcmVhdGVSdWxlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBfYSA9IF90aGlzLmdldFRleHRFbGVtZW50cyhfdGhpcy5lbGVtZW50KSwgcGFyZW50RWxlbWVudCA9IF9hLnBhcmVudEVsZW1lbnQsIGNvbnRhaW5lckVsZW1lbnQgPSBfYS5jb250YWluZXJFbGVtZW50LCB0ZXh0RWxlbWVudCA9IF9hLnRleHRFbGVtZW50OwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5hcHBlbmRDaGlsZChjb250YWluZXJFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB0ZXh0RWxlbWVudC50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRpbWVuc2lvbnMgPSBTdmdVdGlscy5nZXREaW1lbnNpb25zKHRleHRFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50LnJlbW92ZUNoaWxkKGNvbnRhaW5lckVsZW1lbnQpOyAvLyBlbGVtZW50LnJlbW92ZSgpIGRvZXNuJ3Qgd29yayBpbiBJRTExCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRpbWVuc2lvbnM7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmNyZWF0ZVBlbiA9IGZ1bmN0aW9uICh0ZXh0LCB0cmFuc2Zvcm0sIGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50ID0gX3RoaXMuZWxlbWVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB0ZXh0Q29udGFpbmVyID0gU3ZnVXRpbHMuYXBwZW5kKGVsZW1lbnQsICJnIiwgInRleHQtY29udGFpbmVyIiwgX3RoaXMuY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIC8vIGF0dGFjaCBvcHRpb25hbCB0aXRsZQogICAgICAgICAgICAgICAgaWYgKF90aGlzLmFkZFRpdGxlRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIFN2Z1V0aWxzLmFwcGVuZCh0ZXh0Q29udGFpbmVyLCAidGl0bGUiKS50ZXh0Q29udGVudCA9IHRleHQ7CiAgICAgICAgICAgICAgICAgICAgdGV4dENvbnRhaW5lci5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgdGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYW5kIHRyYW5zZm9ybSB0ZXh0IGJsb2NrIGdyb3VwCiAgICAgICAgICAgICAgICB2YXIgdGV4dEJsb2NrR3JvdXAgPSBTdmdVdGlscy5hcHBlbmQodGV4dENvbnRhaW5lciwgImciLCAidGV4dC1hcmVhIik7CiAgICAgICAgICAgICAgICB0ZXh0QmxvY2tHcm91cC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHRyYW5zZm9ybS50cmFuc2xhdGVbMF0gKyAiLCIgKyB0cmFuc2Zvcm0udHJhbnNsYXRlWzFdICsgIikiICsKICAgICAgICAgICAgICAgICAgICAoInJvdGF0ZSgiICsgdHJhbnNmb3JtLnJvdGF0ZSArICIpIikpOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmNyZWF0ZVN2Z0xpbmVQZW4odGV4dEJsb2NrR3JvdXApOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBTdmdDb250ZXh0LnByb3RvdHlwZS5zZXRBZGRUaXRsZUVsZW1lbnQgPSBmdW5jdGlvbiAoYWRkVGl0bGVFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuYWRkVGl0bGVFbGVtZW50ID0gYWRkVGl0bGVFbGVtZW50OwogICAgICAgIH07CiAgICAgICAgU3ZnQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlU3ZnTGluZVBlbiA9IGZ1bmN0aW9uICh0ZXh0QmxvY2tHcm91cCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIChsaW5lLCB3aWR0aCwgeEFsaWduLCB4T2Zmc2V0LCB5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgeE9mZnNldCArPSB3aWR0aCAqIHdyaXRlcnMuV3JpdGVyLlhPZmZzZXRGYWN0b3JbeEFsaWduXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IFN2Z1V0aWxzLmFwcGVuZCh0ZXh0QmxvY2tHcm91cCwgInRleHQiLCAidGV4dC1saW5lIik7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC50ZXh0Q29udGVudCA9IGxpbmU7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInRleHQtYW5jaG9yIiwgU3ZnQ29udGV4dC5BbmNob3JNYXBbeEFsaWduXSk7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHhPZmZzZXQgKyAiLCIgKyB5T2Zmc2V0ICsgIikiKTsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgieSIsICItMC4yNWVtIik7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgU3ZnQ29udGV4dC5wcm90b3R5cGUuZ2V0VGV4dEVsZW1lbnRzID0gZnVuY3Rpb24gKGVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gaWYgZWxlbWVudCBpcyBhbHJlYWR5IGEgdGV4dCBlbGVtZW50LCByZXR1cm4gaXQKICAgICAgICAgICAgaWYgKGVsZW1lbnQudGFnTmFtZSA9PT0gInRleHQiKSB7CiAgICAgICAgICAgICAgICB2YXIgcGFyZW50RWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gZWxlbWVudC5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gbXVzdCBiZSByZW1vdmVkIGZyb20gcGFyZW50IHNpbmNlIHdlIHJlLWFkZCBpdCBvbiBldmVyeSBtZWFzdXJlbWVudAogICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudC5yZW1vdmVDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWxlbWVudDogZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50OiBwYXJlbnRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIHRleHRFbGVtZW50OiBlbGVtZW50LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBpZiBlbGVtZW50IGhhcyBhIHRleHQgZWxlbWVudCBkZXNjZW5kZW50LCBzZWxlY3QgaXQgYW5kIHJldHVybiBpdAogICAgICAgICAgICB2YXIgc2VsZWN0ZWQgPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3IoInRleHQiKTsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBwYXJlbnRFbGVtZW50ID0gc2VsZWN0ZWQucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnRFbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50ID0gc2VsZWN0ZWQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIG11c3QgYmUgcmVtb3ZlZCBmcm9tIHBhcmVudCBzaW5jZSB3ZSByZS1hZGQgaXQgb24gZXZlcnkgbWVhc3VyZW1lbnQKICAgICAgICAgICAgICAgIHBhcmVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoc2VsZWN0ZWQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50OiBzZWxlY3RlZCwKICAgICAgICAgICAgICAgICAgICBwYXJlbnRFbGVtZW50OiBwYXJlbnRFbGVtZW50LAogICAgICAgICAgICAgICAgICAgIHRleHRFbGVtZW50OiBzZWxlY3RlZCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNyZWF0ZSBhIG5ldyB0ZXh0IGVsZW1lbnQKICAgICAgICAgICAgdmFyIGNyZWF0ZWQgPSBTdmdVdGlscy5jcmVhdGUoInRleHQiLCB0aGlzLmNsYXNzTmFtZSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjb250YWluZXJFbGVtZW50OiBjcmVhdGVkLAogICAgICAgICAgICAgICAgcGFyZW50RWxlbWVudDogZWxlbWVudCwKICAgICAgICAgICAgICAgIHRleHRFbGVtZW50OiBjcmVhdGVkLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFN2Z0NvbnRleHQ7CiAgICB9KCkpOwogICAgU3ZnQ29udGV4dC5BbmNob3JNYXAgPSB7CiAgICAgICAgY2VudGVyOiAibWlkZGxlIiwKICAgICAgICBsZWZ0OiAic3RhcnQiLAogICAgICAgIHJpZ2h0OiAiZW5kIiwKICAgIH07CiAgICBleHBvcnRzLlN2Z0NvbnRleHQgPSBTdmdDb250ZXh0OwoKICAgIH0pOwoKICAgIHZhciBjYW52YXMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCiAgICAgKiBsaWNlbnNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci90eXBlc2V0dGFibGUvYmxvYi9kZXZlbG9wL0xJQ0VOU0UKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB2YXIgREVGQVVMVF9GSUxMX0NPTE9SID0gIiM0NDQiOwogICAgLyoqCiAgICAgKiBBIHR5cGVzZXR0ZXIgY29udGV4dCBmb3IgSFRNTDUgQ2FudmFzLgogICAgICoKICAgICAqIER1ZSB0byB0aGUgQ2FudmFzIEFQSSwgeW91IG11c3QgZXhwbGljaXRseSBkZWZpbmUgdGhlIGxpbmUgaGVpZ2h0LCBhbmQgYW55CiAgICAgKiBzdHlsaW5nIGZvciB0aGUgZm9udCBtdXN0IGFsc28gYmUgZXhwbGljaXRseSBkZWZpbmVkIGluIHRoZSBvcHRpb25hbAogICAgICogYElDYW52YXNGb250U3R5bGVgIG9iamVjdC4KICAgICAqLwogICAgdmFyIENhbnZhc0NvbnRleHQgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIENhbnZhc0NvbnRleHQoY3R4LCBsaW5lSGVpZ2h0LCBzdHlsZSkgewogICAgICAgICAgICBpZiAobGluZUhlaWdodCA9PT0gdm9pZCAwKSB7IGxpbmVIZWlnaHQgPSAxMDsgfQogICAgICAgICAgICBpZiAoc3R5bGUgPT09IHZvaWQgMCkgeyBzdHlsZSA9IHt9OyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuY3R4ID0gY3R4OwogICAgICAgICAgICB0aGlzLmxpbmVIZWlnaHQgPSBsaW5lSGVpZ2h0OwogICAgICAgICAgICB0aGlzLnN0eWxlID0gc3R5bGU7CiAgICAgICAgICAgIHRoaXMuY3JlYXRlUnVsZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5jdHguZm9udCA9IF90aGlzLnN0eWxlLmZvbnQ7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gX3RoaXMuY3R4Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBfdGhpcy5saW5lSGVpZ2h0IH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmNyZWF0ZVBlbiA9IGZ1bmN0aW9uIChfdGV4dCwgdHJhbnNmb3JtLCBjdHgpIHsKICAgICAgICAgICAgICAgIGlmIChjdHggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGN0eCA9IF90aGlzLmN0eDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN0eC5zYXZlKCk7CiAgICAgICAgICAgICAgICBjdHgudHJhbnNsYXRlKHRyYW5zZm9ybS50cmFuc2xhdGVbMF0sIHRyYW5zZm9ybS50cmFuc2xhdGVbMV0pOwogICAgICAgICAgICAgICAgY3R4LnJvdGF0ZSh0cmFuc2Zvcm0ucm90YXRlICogTWF0aC5QSSAvIDE4MC4wKTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5jcmVhdGVDYW52YXNQZW4oY3R4KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuc3R5bGUuZmlsbCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0eWxlLmZpbGwgPSBERUZBVUxUX0ZJTExfQ09MT1I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgQ2FudmFzQ29udGV4dC5wcm90b3R5cGUuY3JlYXRlQ2FudmFzUGVuID0gZnVuY3Rpb24gKGN0eCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgZGVzdHJveTogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgd3JpdGU6IGZ1bmN0aW9uIChsaW5lLCB3aWR0aCwgeEFsaWduLCB4T2Zmc2V0LCB5T2Zmc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgeE9mZnNldCArPSB3aWR0aCAqIHdyaXRlcnMuV3JpdGVyLlhPZmZzZXRGYWN0b3JbeEFsaWduXTsKICAgICAgICAgICAgICAgICAgICBjdHgudGV4dEFsaWduID0geEFsaWduOwogICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zdHlsZS5mb250ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmZvbnQgPSBfdGhpcy5zdHlsZS5mb250OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuc3R5bGUuZmlsbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5maWxsU3R5bGUgPSBfdGhpcy5zdHlsZS5maWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjdHguZmlsbFRleHQobGluZSwgeE9mZnNldCwgeU9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5zdHlsZS5zdHJva2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBfdGhpcy5zdHlsZS5maWxsOwogICAgICAgICAgICAgICAgICAgICAgICBjdHguc3Ryb2tlVGV4dChsaW5lLCB4T2Zmc2V0LCB5T2Zmc2V0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIENhbnZhc0NvbnRleHQ7CiAgICB9KCkpOwogICAgZXhwb3J0cy5DYW52YXNDb250ZXh0ID0gQ2FudmFzQ29udGV4dDsKCiAgICB9KTsKCiAgICB2YXIgY29udGV4dHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCiAgICAgKiBsaWNlbnNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci90eXBlc2V0dGFibGUvYmxvYi9kZXZlbG9wL0xJQ0VOU0UKICAgICAqLwogICAgZnVuY3Rpb24gX19leHBvcnQobSkgewogICAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBfX2V4cG9ydChzdmckMSk7CiAgICBfX2V4cG9ydChjYW52YXMpOwogICAgX19leHBvcnQoaHRtbCQzKTsKCiAgICB9KTsKCiAgICB2YXIgYWJzdHJhY3RNZWFzdXJlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAqIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3R5cGVzZXR0YWJsZS9ibG9iL2RldmVsb3AvTElDRU5TRQogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIEFic3RyYWN0TWVhc3VyZXIgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIEFic3RyYWN0TWVhc3VyZXIocnVsZXIpIHsKICAgICAgICAgICAgaWYgKHJ1bGVyLmNyZWF0ZVJ1bGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMucnVsZXIgPSBydWxlci5jcmVhdGVSdWxlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5ydWxlciA9IHJ1bGVyOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIEFic3RyYWN0TWVhc3VyZXIucHJvdG90eXBlLm1lYXN1cmUgPSBmdW5jdGlvbiAodGV4dCkgewogICAgICAgICAgICBpZiAodGV4dCA9PT0gdm9pZCAwKSB7IHRleHQgPSBBYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUOyB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bGVyKHRleHQpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEFic3RyYWN0TWVhc3VyZXI7CiAgICB9KCkpOwogICAgLyoqCiAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGZ1bGwgYXNjZW5kZXIvZGVzY2VuZGVyIHJhbmdlIG9mIHlvdXIgdGV4dC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBpcyByZWFsbHkgb25seSBhcHBsaWNhYmxlIHRvIHdlc3Rlcm4gYWxwaGFiZXRzLiBJZiB5b3UgYXJlCiAgICAgKiB1c2luZyBhIGRpZmZlcmVudCBsb2NhbGUgbGFuZ3VhZ2Ugc3VjaCBhcyBhcmFiaWMgb3IgY2hpbmVzZSwgeW91IG1heSB3YW50CiAgICAgKiB0byBvdmVycmlkZSB0aGlzLgogICAgICovCiAgICBBYnN0cmFjdE1lYXN1cmVyLkhFSUdIVF9URVhUID0gImJkcHFsIjsKICAgIGV4cG9ydHMuQWJzdHJhY3RNZWFzdXJlciA9IEFic3RyYWN0TWVhc3VyZXI7CgogICAgfSk7CgogICAgdmFyIG1lYXN1cmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIHZhciBfX2V4dGVuZHMgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHwKICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CiAgICAgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQogICAgICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CiAgICAgICAgfTsKICAgIH0pKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHZhciBNZWFzdXJlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgX19leHRlbmRzKE1lYXN1cmVyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIE1lYXN1cmVyKHJ1bGVyLCB1c2VHdWFyZHMpIHsKICAgICAgICAgICAgaWYgKHVzZUd1YXJkcyA9PT0gdm9pZCAwKSB7IHVzZUd1YXJkcyA9IGZhbHNlOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJ1bGVyKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy51c2VHdWFyZHMgPSB1c2VHdWFyZHM7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgLy8gR3VhcmRzIGFzc3VyZXMgc2FtZSBsaW5lIGhlaWdodCBhbmQgd2lkdGggb2Ygd2hpdGVzcGFjZXMgb24gYm90aCBlbmRzLgogICAgICAgIE1lYXN1cmVyLnByb3RvdHlwZS5fYWRkR3VhcmRzID0gZnVuY3Rpb24gKHRleHQpIHsKICAgICAgICAgICAgcmV0dXJuIGFic3RyYWN0TWVhc3VyZXIuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVCArIHRleHQgKyBhYnN0cmFjdE1lYXN1cmVyLkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQ7CiAgICAgICAgfTsKICAgICAgICBNZWFzdXJlci5wcm90b3R5cGUuX21lYXN1cmVMaW5lID0gZnVuY3Rpb24gKGxpbmUsIGZvcmNlR3VhcmRzKSB7CiAgICAgICAgICAgIGlmIChmb3JjZUd1YXJkcyA9PT0gdm9pZCAwKSB7IGZvcmNlR3VhcmRzID0gZmFsc2U7IH0KICAgICAgICAgICAgdmFyIHVzZUd1YXJkcyA9IHRoaXMudXNlR3VhcmRzIHx8IGZvcmNlR3VhcmRzIHx8IC9eW1x0IF0kLy50ZXN0KGxpbmUpOwogICAgICAgICAgICB2YXIgbWVhc3VyZWRMaW5lID0gdXNlR3VhcmRzID8gdGhpcy5fYWRkR3VhcmRzKGxpbmUpIDogbGluZTsKICAgICAgICAgICAgdmFyIG1lYXN1cmVkTGluZURpbWVuc2lvbnMgPSBfc3VwZXIucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLCBtZWFzdXJlZExpbmUpOwogICAgICAgICAgICBtZWFzdXJlZExpbmVEaW1lbnNpb25zLndpZHRoIC09IHVzZUd1YXJkcyA/ICgyICogdGhpcy5nZXRHdWFyZFdpZHRoKCkpIDogMDsKICAgICAgICAgICAgcmV0dXJuIG1lYXN1cmVkTGluZURpbWVuc2lvbnM7CiAgICAgICAgfTsKICAgICAgICBNZWFzdXJlci5wcm90b3R5cGUubWVhc3VyZSA9IGZ1bmN0aW9uICh0ZXh0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0ZXh0ID09PSB2b2lkIDApIHsgdGV4dCA9IGFic3RyYWN0TWVhc3VyZXIuQWJzdHJhY3RNZWFzdXJlci5IRUlHSFRfVEVYVDsgfQogICAgICAgICAgICBpZiAodGV4dC50cmltKCkgPT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxpbmVzRGltZW5zaW9ucyA9IHRleHQudHJpbSgpLnNwbGl0KCJcbiIpLm1hcChmdW5jdGlvbiAobGluZSkgeyByZXR1cm4gX3RoaXMuX21lYXN1cmVMaW5lKGxpbmUpOyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhlaWdodDogbGluZXNEaW1lbnNpb25zLnJlZHVjZShmdW5jdGlvbiAoYWNjLCBkaW0pIHsgcmV0dXJuIGFjYyArIGRpbS5oZWlnaHQ7IH0sIDApLAogICAgICAgICAgICAgICAgd2lkdGg6IGxpbmVzRGltZW5zaW9ucy5yZWR1Y2UoZnVuY3Rpb24gKGFjYywgZGltKSB7IHJldHVybiBNYXRoLm1heChhY2MsIGRpbS53aWR0aCk7IH0sIDApLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgTWVhc3VyZXIucHJvdG90eXBlLmdldEd1YXJkV2lkdGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmd1YXJkV2lkdGggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5ndWFyZFdpZHRoID0gX3N1cGVyLnByb3RvdHlwZS5tZWFzdXJlLmNhbGwodGhpcykud2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ3VhcmRXaWR0aDsKICAgICAgICB9OwogICAgICAgIHJldHVybiBNZWFzdXJlcjsKICAgIH0oYWJzdHJhY3RNZWFzdXJlci5BYnN0cmFjdE1lYXN1cmVyKSk7CiAgICBleHBvcnRzLk1lYXN1cmVyID0gTWVhc3VyZXI7CgogICAgfSk7CgogICAgdmFyIGNoYXJhY3Rlck1lYXN1cmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICB2YXIgX19leHRlbmRzID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAogICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9OwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewogICAgICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH0KICAgICAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwogICAgICAgIH07CiAgICB9KSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB2YXIgQ2hhcmFjdGVyTWVhc3VyZXIgPSAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIF9fZXh0ZW5kcyhDaGFyYWN0ZXJNZWFzdXJlciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBDaGFyYWN0ZXJNZWFzdXJlcigpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICBDaGFyYWN0ZXJNZWFzdXJlci5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIgPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fbWVhc3VyZUxpbmUuY2FsbCh0aGlzLCBjKTsKICAgICAgICB9OwogICAgICAgIENoYXJhY3Rlck1lYXN1cmVyLnByb3RvdHlwZS5fbWVhc3VyZUxpbmUgPSBmdW5jdGlvbiAobGluZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgY2hhcmFjdGVyc0RpbWVuc2lvbnMgPSBsaW5lLnNwbGl0KCIiKS5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIF90aGlzLl9tZWFzdXJlQ2hhcmFjdGVyKGMpOyB9KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhlaWdodDogY2hhcmFjdGVyc0RpbWVuc2lvbnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGRpbSkgeyByZXR1cm4gTWF0aC5tYXgoYWNjLCBkaW0uaGVpZ2h0KTsgfSwgMCksCiAgICAgICAgICAgICAgICB3aWR0aDogY2hhcmFjdGVyc0RpbWVuc2lvbnMucmVkdWNlKGZ1bmN0aW9uIChhY2MsIGRpbSkgeyByZXR1cm4gYWNjICsgZGltLndpZHRoOyB9LCAwKSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBDaGFyYWN0ZXJNZWFzdXJlcjsKICAgIH0obWVhc3VyZXIuTWVhc3VyZXIpKTsKICAgIGV4cG9ydHMuQ2hhcmFjdGVyTWVhc3VyZXIgPSBDaGFyYWN0ZXJNZWFzdXJlcjsKCiAgICB9KTsKCiAgICB2YXIgY2FjaGVDaGFyYWN0ZXJNZWFzdXJlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAqIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3R5cGVzZXR0YWJsZS9ibG9iL2RldmVsb3AvTElDRU5TRQogICAgICovCiAgICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLwogICAgdmFyIF9fZXh0ZW5kcyA9IChjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5fX2V4dGVuZHMpIHx8IChmdW5jdGlvbiAoKSB7CiAgICAgICAgdmFyIGV4dGVuZFN0YXRpY3MgPSBPYmplY3Quc2V0UHJvdG90eXBlT2YgfHwKICAgICAgICAgICAgKHsgX19wcm90b19fOiBbXSB9IGluc3RhbmNlb2YgQXJyYXkgJiYgZnVuY3Rpb24gKGQsIGIpIHsgZC5fX3Byb3RvX18gPSBiOyB9KSB8fAogICAgICAgICAgICBmdW5jdGlvbiAoZCwgYikgeyBmb3IgKHZhciBwIGluIGIpIGlmIChiLmhhc093blByb3BlcnR5KHApKSBkW3BdID0gYltwXTsgfTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGQsIGIpIHsKICAgICAgICAgICAgZXh0ZW5kU3RhdGljcyhkLCBiKTsKICAgICAgICAgICAgZnVuY3Rpb24gX18oKSB7IHRoaXMuY29uc3RydWN0b3IgPSBkOyB9CiAgICAgICAgICAgIGQucHJvdG90eXBlID0gYiA9PT0gbnVsbCA/IE9iamVjdC5jcmVhdGUoYikgOiAoX18ucHJvdG90eXBlID0gYi5wcm90b3R5cGUsIG5ldyBfXygpKTsKICAgICAgICB9OwogICAgfSkoKTsKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKICAgIHZhciBDYWNoZUNoYXJhY3Rlck1lYXN1cmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICBfX2V4dGVuZHMoQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBDYWNoZUNoYXJhY3Rlck1lYXN1cmVyKHJ1bGVyLCB1c2VHdWFyZHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgcnVsZXIsIHVzZUd1YXJkcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuY2FjaGUgPSBuZXcgdXRpbHMuQ2FjaGUoZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fbWVhc3VyZUNoYXJhY3Rlck5vdEZyb21DYWNoZShjKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlci5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXJOb3RGcm9tQ2FjaGUgPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fbWVhc3VyZUNoYXJhY3Rlci5jYWxsKHRoaXMsIGMpOwogICAgICAgIH07CiAgICAgICAgQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlci5wcm90b3R5cGUuX21lYXN1cmVDaGFyYWN0ZXIgPSBmdW5jdGlvbiAoYykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jYWNoZS5nZXQoYyk7CiAgICAgICAgfTsKICAgICAgICBDYWNoZUNoYXJhY3Rlck1lYXN1cmVyLnByb3RvdHlwZS5yZXNldCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5jYWNoZS5jbGVhcigpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIENhY2hlQ2hhcmFjdGVyTWVhc3VyZXI7CiAgICB9KGNoYXJhY3Rlck1lYXN1cmVyLkNoYXJhY3Rlck1lYXN1cmVyKSk7CiAgICBleHBvcnRzLkNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIgPSBDYWNoZUNoYXJhY3Rlck1lYXN1cmVyOwoKICAgIH0pOwoKICAgIHZhciBjYWNoZU1lYXN1cmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICB2YXIgX19leHRlbmRzID0gKGNvbW1vbmpzR2xvYmFsICYmIGNvbW1vbmpzR2xvYmFsLl9fZXh0ZW5kcykgfHwgKGZ1bmN0aW9uICgpIHsKICAgICAgICB2YXIgZXh0ZW5kU3RhdGljcyA9IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fAogICAgICAgICAgICAoeyBfX3Byb3RvX186IFtdIH0gaW5zdGFuY2VvZiBBcnJheSAmJiBmdW5jdGlvbiAoZCwgYikgeyBkLl9fcHJvdG9fXyA9IGI7IH0pIHx8CiAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBiKSB7IGZvciAodmFyIHAgaW4gYikgaWYgKGIuaGFzT3duUHJvcGVydHkocCkpIGRbcF0gPSBiW3BdOyB9OwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgYikgewogICAgICAgICAgICBleHRlbmRTdGF0aWNzKGQsIGIpOwogICAgICAgICAgICBmdW5jdGlvbiBfXygpIHsgdGhpcy5jb25zdHJ1Y3RvciA9IGQ7IH0KICAgICAgICAgICAgZC5wcm90b3R5cGUgPSBiID09PSBudWxsID8gT2JqZWN0LmNyZWF0ZShiKSA6IChfXy5wcm90b3R5cGUgPSBiLnByb3RvdHlwZSwgbmV3IF9fKCkpOwogICAgICAgIH07CiAgICB9KSgpOwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKICAgIHZhciBDYWNoZU1lYXN1cmVyID0gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICBfX2V4dGVuZHMoQ2FjaGVNZWFzdXJlciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBDYWNoZU1lYXN1cmVyKHJ1bGVyKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIHJ1bGVyKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5kaW1DYWNoZSA9IG5ldyB1dGlscy5DYWNoZShmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9tZWFzdXJlTm90RnJvbUNhY2hlKHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBDYWNoZU1lYXN1cmVyLnByb3RvdHlwZS5fbWVhc3VyZU5vdEZyb21DYWNoZSA9IGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLm1lYXN1cmUuY2FsbCh0aGlzLCBzKTsKICAgICAgICB9OwogICAgICAgIENhY2hlTWVhc3VyZXIucHJvdG90eXBlLm1lYXN1cmUgPSBmdW5jdGlvbiAocykgewogICAgICAgICAgICBpZiAocyA9PT0gdm9pZCAwKSB7IHMgPSBhYnN0cmFjdE1lYXN1cmVyLkFic3RyYWN0TWVhc3VyZXIuSEVJR0hUX1RFWFQ7IH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGltQ2FjaGUuZ2V0KHMpOwogICAgICAgIH07CiAgICAgICAgQ2FjaGVNZWFzdXJlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuZGltQ2FjaGUuY2xlYXIoKTsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZXNldC5jYWxsKHRoaXMpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIENhY2hlTWVhc3VyZXI7CiAgICB9KGNhY2hlQ2hhcmFjdGVyTWVhc3VyZXIuQ2FjaGVDaGFyYWN0ZXJNZWFzdXJlcikpOwogICAgZXhwb3J0cy5DYWNoZU1lYXN1cmVyID0gQ2FjaGVNZWFzdXJlcjsKCiAgICB9KTsKCiAgICB2YXIgbWVhc3VyZXJzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9fZXhwb3J0KG0pIHsKICAgICAgICBmb3IgKHZhciBwIGluIG0pIGlmICghZXhwb3J0cy5oYXNPd25Qcm9wZXJ0eShwKSkgZXhwb3J0c1twXSA9IG1bcF07CiAgICB9CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgX19leHBvcnQoYWJzdHJhY3RNZWFzdXJlcik7CiAgICBfX2V4cG9ydChjYWNoZUNoYXJhY3Rlck1lYXN1cmVyKTsKICAgIF9fZXhwb3J0KGNhY2hlTWVhc3VyZXIpOwogICAgX19leHBvcnQoY2hhcmFjdGVyTWVhc3VyZXIpOwogICAgX19leHBvcnQobWVhc3VyZXIpOwoKICAgIH0pOwoKICAgIHZhciB3cmFwcGVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgogICAgdmFyIFdyYXBwZXIgPSAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIFdyYXBwZXIoKSB7CiAgICAgICAgICAgIHRoaXMubWF4TGluZXMoSW5maW5pdHkpOwogICAgICAgICAgICB0aGlzLnRleHRUcmltbWluZygiZWxsaXBzaXMiKTsKICAgICAgICAgICAgdGhpcy5hbGxvd0JyZWFraW5nV29yZHMoZmFsc2UpOwogICAgICAgICAgICB0aGlzLl90b2tlbml6ZXIgPSBuZXcgdXRpbHMuVG9rZW5pemVyKCk7CiAgICAgICAgICAgIHRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyID0gIi0iOwogICAgICAgIH0KICAgICAgICBXcmFwcGVyLnByb3RvdHlwZS5tYXhMaW5lcyA9IGZ1bmN0aW9uIChub0xpbmVzKSB7CiAgICAgICAgICAgIGlmIChub0xpbmVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhMaW5lczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21heExpbmVzID0gbm9MaW5lczsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBXcmFwcGVyLnByb3RvdHlwZS50ZXh0VHJpbW1pbmcgPSBmdW5jdGlvbiAob3B0aW9uKSB7CiAgICAgICAgICAgIGlmIChvcHRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RleHRUcmltbWluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb24gIT09ICJlbGxpcHNpcyIgJiYgb3B0aW9uICE9PSAibm9uZSIpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3Iob3B0aW9uICsgIiAtIHVuc3VwcG9ydGVkIHRleHQgdHJpbW1pbmcgb3B0aW9uLiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fdGV4dFRyaW1taW5nID0gb3B0aW9uOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFdyYXBwZXIucHJvdG90eXBlLmFsbG93QnJlYWtpbmdXb3JkcyA9IGZ1bmN0aW9uIChhbGxvdykgewogICAgICAgICAgICBpZiAoYWxsb3cgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FsbG93QnJlYWtpbmdXb3JkczsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FsbG93QnJlYWtpbmdXb3JkcyA9IGFsbG93OwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFdyYXBwZXIucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAodGV4dCwgbWVhc3VyZXIsIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKGhlaWdodCA9PT0gdm9pZCAwKSB7IGhlaWdodCA9IEluZmluaXR5OyB9CiAgICAgICAgICAgIHZhciBpbml0aWFsV3JhcHBpbmdSZXN1bHQgPSB7CiAgICAgICAgICAgICAgICBub0Jyb2tlV29yZHM6IDAsCiAgICAgICAgICAgICAgICBub0xpbmVzOiAwLAogICAgICAgICAgICAgICAgb3JpZ2luYWxUZXh0OiB0ZXh0LAogICAgICAgICAgICAgICAgdHJ1bmNhdGVkVGV4dDogIiIsCiAgICAgICAgICAgICAgICB3cmFwcGVkVGV4dDogIiIsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBzdGF0ZSA9IHsKICAgICAgICAgICAgICAgIGF2YWlsYWJsZUxpbmVzOiBNYXRoLm1pbihNYXRoLmZsb29yKGhlaWdodCAvIG1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQpLCB0aGlzLl9tYXhMaW5lcyksCiAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aDogd2lkdGgsCiAgICAgICAgICAgICAgICBjYW5GaXRUZXh0OiB0cnVlLAogICAgICAgICAgICAgICAgY3VycmVudExpbmU6ICIiLAogICAgICAgICAgICAgICAgd3JhcHBpbmc6IGluaXRpYWxXcmFwcGluZ1Jlc3VsdCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGxpbmVzID0gdGV4dC5zcGxpdCgiXG4iKTsKICAgICAgICAgICAgcmV0dXJuIGxpbmVzLnJlZHVjZShmdW5jdGlvbiAocywgbGluZSwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLmJyZWFrTGluZVRvRml0V2lkdGgocywgbGluZSwgaSAhPT0gbGluZXMubGVuZ3RoIC0gMSwgbWVhc3VyZXIpOwogICAgICAgICAgICB9LCBzdGF0ZSkud3JhcHBpbmc7CiAgICAgICAgfTsKICAgICAgICBXcmFwcGVyLnByb3RvdHlwZS5icmVha0xpbmVUb0ZpdFdpZHRoID0gZnVuY3Rpb24gKHN0YXRlLCBsaW5lLCBoYXNOZXh0TGluZSwgbWVhc3VyZXIpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKCFzdGF0ZS5jYW5GaXRUZXh0ICYmIHN0YXRlLndyYXBwaW5nLnRydW5jYXRlZFRleHQgIT09ICIiKSB7CiAgICAgICAgICAgICAgICBzdGF0ZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0ICs9ICJcbiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRva2VucyA9IHRoaXMuX3Rva2VuaXplci50b2tlbml6ZShsaW5lKTsKICAgICAgICAgICAgc3RhdGUgPSB0b2tlbnMucmVkdWNlKGZ1bmN0aW9uIChzLCB0b2tlbikgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLndyYXBOZXh0VG9rZW4odG9rZW4sIHMsIG1lYXN1cmVyKTsKICAgICAgICAgICAgfSwgc3RhdGUpOwogICAgICAgICAgICB2YXIgd3JhcHBlZFRleHQgPSB1dGlscy5TdHJpbmdNZXRob2RzLnRyaW1FbmQoc3RhdGUuY3VycmVudExpbmUpOwogICAgICAgICAgICBzdGF0ZS53cmFwcGluZy5ub0xpbmVzICs9ICsod3JhcHBlZFRleHQgIT09ICIiKTsKICAgICAgICAgICAgaWYgKHN0YXRlLndyYXBwaW5nLm5vTGluZXMgPT09IHN0YXRlLmF2YWlsYWJsZUxpbmVzICYmIHRoaXMuX3RleHRUcmltbWluZyAhPT0gIm5vbmUiICYmIGhhc05leHRMaW5lKSB7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiBubyBuZWVkIHRvIGFkZCBtb3JlIGVsbGlwc2VzLCB0aGV5IHdlcmUgYWRkZWQgaW4gYHdyYXBOZXh0VG9rZW5gCiAgICAgICAgICAgICAgICBzdGF0ZS5jYW5GaXRUZXh0ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0ZS53cmFwcGluZy53cmFwcGVkVGV4dCArPSB3cmFwcGVkVGV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5jdXJyZW50TGluZSA9ICJcbiI7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9OwogICAgICAgIFdyYXBwZXIucHJvdG90eXBlLmNhbkZpdFRva2VuID0gZnVuY3Rpb24gKHRva2VuLCB3aWR0aCwgbWVhc3VyZXIpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHBvc3NpYmxlQnJlYWtzID0gdG9rZW4uc3BsaXQoIiIpLm1hcChmdW5jdGlvbiAoYywgaSkgeyByZXR1cm4gKGkgIT09IHRva2VuLmxlbmd0aCAtIDEpID8gYyArIF90aGlzLl9icmVha2luZ0NoYXJhY3RlciA6IGM7IH0pOwogICAgICAgICAgICByZXR1cm4gKG1lYXN1cmVyLm1lYXN1cmUodG9rZW4pLndpZHRoIDw9IHdpZHRoKSB8fCBwb3NzaWJsZUJyZWFrcy5ldmVyeShmdW5jdGlvbiAoYykgeyByZXR1cm4gbWVhc3VyZXIubWVhc3VyZShjKS53aWR0aCA8PSB3aWR0aDsgfSk7CiAgICAgICAgfTsKICAgICAgICBXcmFwcGVyLnByb3RvdHlwZS5hZGRFbGxpcHNpcyA9IGZ1bmN0aW9uIChsaW5lLCB3aWR0aCwgbWVhc3VyZXIpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3RleHRUcmltbWluZyA9PT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1Rva2VuOiAiIiwKICAgICAgICAgICAgICAgICAgICB3cmFwcGVkVG9rZW46IGxpbmUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0cnVuY2F0ZWRMaW5lID0gbGluZS5zdWJzdHJpbmcoMCkudHJpbSgpOwogICAgICAgICAgICB2YXIgbGluZVdpZHRoID0gbWVhc3VyZXIubWVhc3VyZSh0cnVuY2F0ZWRMaW5lKS53aWR0aDsKICAgICAgICAgICAgdmFyIGVsbGlwc2VzV2lkdGggPSBtZWFzdXJlci5tZWFzdXJlKCIuLi4iKS53aWR0aDsKICAgICAgICAgICAgdmFyIHByZWZpeCA9IChsaW5lLmxlbmd0aCA+IDAgJiYgbGluZVswXSA9PT0gIlxuIikgPyAiXG4iIDogIiI7CiAgICAgICAgICAgIGlmICh3aWR0aCA8PSBlbGxpcHNlc1dpZHRoKSB7CiAgICAgICAgICAgICAgICB2YXIgcGVyaW9kV2lkdGggPSBlbGxpcHNlc1dpZHRoIC8gMzsKICAgICAgICAgICAgICAgIHZhciBudW1QZXJpb2RzVGhhdEZpdCA9IE1hdGguZmxvb3Iod2lkdGggLyBwZXJpb2RXaWR0aCk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZ1Rva2VuOiBsaW5lLAogICAgICAgICAgICAgICAgICAgIHdyYXBwZWRUb2tlbjogcHJlZml4ICsgIi4uLiIuc3Vic3RyKDAsIG51bVBlcmlvZHNUaGF0Rml0KSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKGxpbmVXaWR0aCArIGVsbGlwc2VzV2lkdGggPiB3aWR0aCkgewogICAgICAgICAgICAgICAgdHJ1bmNhdGVkTGluZSA9IHV0aWxzLlN0cmluZ01ldGhvZHMudHJpbUVuZCh0cnVuY2F0ZWRMaW5lLnN1YnN0cigwLCB0cnVuY2F0ZWRMaW5lLmxlbmd0aCAtIDEpKTsKICAgICAgICAgICAgICAgIGxpbmVXaWR0aCA9IG1lYXN1cmVyLm1lYXN1cmUodHJ1bmNhdGVkTGluZSkud2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJlbWFpbmluZ1Rva2VuOiB1dGlscy5TdHJpbmdNZXRob2RzLnRyaW1FbmQobGluZS5zdWJzdHJpbmcodHJ1bmNhdGVkTGluZS5sZW5ndGgpLCAiLSIpLnRyaW0oKSwKICAgICAgICAgICAgICAgIHdyYXBwZWRUb2tlbjogcHJlZml4ICsgdHJ1bmNhdGVkTGluZSArICIuLi4iLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgV3JhcHBlci5wcm90b3R5cGUud3JhcE5leHRUb2tlbiA9IGZ1bmN0aW9uICh0b2tlbiwgc3RhdGUsIG1lYXN1cmVyKSB7CiAgICAgICAgICAgIGlmICghc3RhdGUuY2FuRml0VGV4dCB8fAogICAgICAgICAgICAgICAgc3RhdGUuYXZhaWxhYmxlTGluZXMgPT09IHN0YXRlLndyYXBwaW5nLm5vTGluZXMgfHwKICAgICAgICAgICAgICAgICF0aGlzLmNhbkZpdFRva2VuKHRva2VuLCBzdGF0ZS5hdmFpbGFibGVXaWR0aCwgbWVhc3VyZXIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5pc2hXcmFwcGluZyh0b2tlbiwgc3RhdGUsIG1lYXN1cmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVtYWluaW5nVG9rZW4gPSB0b2tlbjsKICAgICAgICAgICAgd2hpbGUgKHJlbWFpbmluZ1Rva2VuKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5icmVha1Rva2VuVG9GaXRJbldpZHRoKHJlbWFpbmluZ1Rva2VuLCBzdGF0ZS5jdXJyZW50TGluZSwgc3RhdGUuYXZhaWxhYmxlV2lkdGgsIG1lYXN1cmVyKTsKICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRMaW5lID0gcmVzdWx0LmxpbmU7CiAgICAgICAgICAgICAgICByZW1haW5pbmdUb2tlbiA9IHJlc3VsdC5yZW1haW5pbmdUb2tlbjsKICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmdUb2tlbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUud3JhcHBpbmcubm9Ccm9rZVdvcmRzICs9ICtyZXN1bHQuYnJlYWtXb3JkOwogICAgICAgICAgICAgICAgICAgICsrc3RhdGUud3JhcHBpbmcubm9MaW5lczsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdGUuYXZhaWxhYmxlTGluZXMgPT09IHN0YXRlLndyYXBwaW5nLm5vTGluZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsbGlwc2lzUmVzdWx0ID0gdGhpcy5hZGRFbGxpcHNpcyhzdGF0ZS5jdXJyZW50TGluZSwgc3RhdGUuYXZhaWxhYmxlV2lkdGgsIG1lYXN1cmVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUud3JhcHBpbmcud3JhcHBlZFRleHQgKz0gZWxsaXBzaXNSZXN1bHQud3JhcHBlZFRva2VuOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0ICs9IGVsbGlwc2lzUmVzdWx0LnJlbWFpbmluZ1Rva2VuICsgcmVtYWluaW5nVG9rZW47CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRMaW5lID0gIlxuIjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUud3JhcHBpbmcud3JhcHBlZFRleHQgKz0gdXRpbHMuU3RyaW5nTWV0aG9kcy50cmltRW5kKHN0YXRlLmN1cnJlbnRMaW5lKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuY3VycmVudExpbmUgPSAiXG4iOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfTsKICAgICAgICBXcmFwcGVyLnByb3RvdHlwZS5maW5pc2hXcmFwcGluZyA9IGZ1bmN0aW9uICh0b2tlbiwgc3RhdGUsIG1lYXN1cmVyKSB7CiAgICAgICAgICAgIC8vIFRva2VuIGlzIHJlYWxseSBsb25nLCBidXQgd2UgaGF2ZSBhIHNwYWNlIHRvIHB1dCBwYXJ0IG9mIHRoZSB3b3JkLgogICAgICAgICAgICBpZiAoc3RhdGUuY2FuRml0VGV4dCAmJgogICAgICAgICAgICAgICAgc3RhdGUuYXZhaWxhYmxlTGluZXMgIT09IHN0YXRlLndyYXBwaW5nLm5vTGluZXMgJiYKICAgICAgICAgICAgICAgIHRoaXMuX3RleHRUcmltbWluZyAhPT0gIm5vbmUiKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVzID0gdGhpcy5hZGRFbGxpcHNpcyhzdGF0ZS5jdXJyZW50TGluZSArIHRva2VuLCBzdGF0ZS5hdmFpbGFibGVXaWR0aCwgbWVhc3VyZXIpOwogICAgICAgICAgICAgICAgc3RhdGUud3JhcHBpbmcud3JhcHBlZFRleHQgKz0gcmVzLndyYXBwZWRUb2tlbjsKICAgICAgICAgICAgICAgIHN0YXRlLndyYXBwaW5nLnRydW5jYXRlZFRleHQgKz0gcmVzLnJlbWFpbmluZ1Rva2VuOwogICAgICAgICAgICAgICAgc3RhdGUud3JhcHBpbmcubm9Ccm9rZVdvcmRzICs9ICsocmVzLnJlbWFpbmluZ1Rva2VuLmxlbmd0aCA8IHRva2VuLmxlbmd0aCk7CiAgICAgICAgICAgICAgICBzdGF0ZS53cmFwcGluZy5ub0xpbmVzICs9ICsocmVzLndyYXBwZWRUb2tlbi5sZW5ndGggPiAwKTsKICAgICAgICAgICAgICAgIHN0YXRlLmN1cnJlbnRMaW5lID0gIiI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdGF0ZS53cmFwcGluZy50cnVuY2F0ZWRUZXh0ICs9IHRva2VuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YXRlLmNhbkZpdFRleHQgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQnJlYWtzIHNpbmdsZSB0b2tlbiB0byBmaXQgY3VycmVudCBsaW5lLgogICAgICAgICAqIElmIHRva2VuIGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZXMgdGhlbiB0aGV5IHdpbGwgbm90IGJlIHBvcHVsYXRlZCB0byBuZXh0IGxpbmUuCiAgICAgICAgICovCiAgICAgICAgV3JhcHBlci5wcm90b3R5cGUuYnJlYWtUb2tlblRvRml0SW5XaWR0aCA9IGZ1bmN0aW9uICh0b2tlbiwgbGluZSwgYXZhaWxhYmxlV2lkdGgsIG1lYXN1cmVyLCBicmVha2luZ0NoYXJhY3RlcikgewogICAgICAgICAgICBpZiAoYnJlYWtpbmdDaGFyYWN0ZXIgPT09IHZvaWQgMCkgeyBicmVha2luZ0NoYXJhY3RlciA9IHRoaXMuX2JyZWFraW5nQ2hhcmFjdGVyOyB9CiAgICAgICAgICAgIGlmIChtZWFzdXJlci5tZWFzdXJlKGxpbmUgKyB0b2tlbikud2lkdGggPD0gYXZhaWxhYmxlV2lkdGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWtXb3JkOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICBsaW5lOiBsaW5lICsgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nVG9rZW46IG51bGwsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b2tlbi50cmltKCkgPT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGJyZWFrV29yZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbGluZTogbGluZSwKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdUb2tlbjogIiIsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGlmIHdlIGRvbid0IGFsbG93IGJyZWFraW5nIHdvcmRzIEFORCB0aGUgdG9rZW4gaXNuJ3QgdGhlIG9ubHkgdGhpbmcgb24gdGhlIGN1cnJlbnQgbGluZS4KICAgICAgICAgICAgaWYgKCF0aGlzLl9hbGxvd0JyZWFraW5nV29yZHMgJiYgbGluZS50cmltKCkgIT09ICIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGJyZWFrV29yZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgbGluZTogbGluZSwKICAgICAgICAgICAgICAgICAgICByZW1haW5pbmdUb2tlbjogdG9rZW4sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaXRUb2tlbkxlbmd0aCA9IDA7CiAgICAgICAgICAgIHdoaWxlIChmaXRUb2tlbkxlbmd0aCA8IHRva2VuLmxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKG1lYXN1cmVyLm1lYXN1cmUobGluZSArIHRva2VuLnN1YnN0cmluZygwLCBmaXRUb2tlbkxlbmd0aCArIDEpICsgYnJlYWtpbmdDaGFyYWN0ZXIpLndpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgKytmaXRUb2tlbkxlbmd0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdWZmaXggPSAiIjsKICAgICAgICAgICAgaWYgKGZpdFRva2VuTGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgc3VmZml4ID0gYnJlYWtpbmdDaGFyYWN0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGJyZWFrV29yZDogZml0VG9rZW5MZW5ndGggPiAwLAogICAgICAgICAgICAgICAgbGluZTogbGluZSArIHRva2VuLnN1YnN0cmluZygwLCBmaXRUb2tlbkxlbmd0aCkgKyBzdWZmaXgsCiAgICAgICAgICAgICAgICByZW1haW5pbmdUb2tlbjogdG9rZW4uc3Vic3RyaW5nKGZpdFRva2VuTGVuZ3RoKSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBXcmFwcGVyOwogICAgfSgpKTsKICAgIGV4cG9ydHMuV3JhcHBlciA9IFdyYXBwZXI7CgogICAgfSk7CgogICAgdmFyIHNpbmdsZUxpbmVXcmFwcGVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcywgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZQogICAgICogbGljZW5zZSBhdCBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvdHlwZXNldHRhYmxlL2Jsb2IvZGV2ZWxvcC9MSUNFTlNFCiAgICAgKi8KICAgIHZhciBfX2V4dGVuZHMgPSAoY29tbW9uanNHbG9iYWwgJiYgY29tbW9uanNHbG9iYWwuX19leHRlbmRzKSB8fCAoZnVuY3Rpb24gKCkgewogICAgICAgIHZhciBleHRlbmRTdGF0aWNzID0gT2JqZWN0LnNldFByb3RvdHlwZU9mIHx8CiAgICAgICAgICAgICh7IF9fcHJvdG9fXzogW10gfSBpbnN0YW5jZW9mIEFycmF5ICYmIGZ1bmN0aW9uIChkLCBiKSB7IGQuX19wcm90b19fID0gYjsgfSkgfHwKICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGIpIHsgZm9yICh2YXIgcCBpbiBiKSBpZiAoYi5oYXNPd25Qcm9wZXJ0eShwKSkgZFtwXSA9IGJbcF07IH07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBiKSB7CiAgICAgICAgICAgIGV4dGVuZFN0YXRpY3MoZCwgYik7CiAgICAgICAgICAgIGZ1bmN0aW9uIF9fKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gZDsgfQogICAgICAgICAgICBkLnByb3RvdHlwZSA9IGIgPT09IG51bGwgPyBPYmplY3QuY3JlYXRlKGIpIDogKF9fLnByb3RvdHlwZSA9IGIucHJvdG90eXBlLCBuZXcgX18oKSk7CiAgICAgICAgfTsKICAgIH0pKCk7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHZhciBTaW5nbGVMaW5lV3JhcHBlciA9IChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgX19leHRlbmRzKFNpbmdsZUxpbmVXcmFwcGVyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIFNpbmdsZUxpbmVXcmFwcGVyKCkgewogICAgICAgICAgICByZXR1cm4gX3N1cGVyICE9PSBudWxsICYmIF9zdXBlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIFNpbmdsZUxpbmVXcmFwcGVyLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHRleHQsIG1lYXN1cmVyLCB3aWR0aCwgaGVpZ2h0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmIChoZWlnaHQgPT09IHZvaWQgMCkgeyBoZWlnaHQgPSBJbmZpbml0eTsgfQogICAgICAgICAgICB2YXIgbGluZXMgPSB0ZXh0LnNwbGl0KCJcbiIpOwogICAgICAgICAgICBpZiAobGluZXMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTaW5nbGVMaW5lV3JhcHBlciBpcyBkZXNpZ25lZCB0byB3b3JrIG9ubHkgb24gc2luZ2xlIGxpbmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcEZOID0gZnVuY3Rpb24gKHcpIHsgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUud3JhcC5jYWxsKF90aGlzLCB0ZXh0LCBtZWFzdXJlciwgdywgaGVpZ2h0KTsgfTsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHdyYXBGTih3aWR0aCk7CiAgICAgICAgICAgIGlmIChyZXN1bHQubm9MaW5lcyA8IDIpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxlZnQgPSAwOwogICAgICAgICAgICB2YXIgcmlnaHQgPSB3aWR0aDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBTaW5nbGVMaW5lV3JhcHBlci5OT19XUkFQX0lURVJBVElPTlMgJiYgcmlnaHQgPiBsZWZ0OyArK2kpIHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50V2lkdGggPSAocmlnaHQgKyBsZWZ0KSAvIDI7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudFJlc3VsdCA9IHdyYXBGTihjdXJyZW50V2lkdGgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuYXJlU2FtZVJlc3VsdHMocmVzdWx0LCBjdXJyZW50UmVzdWx0KSkgewogICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gY3VycmVudFdpZHRoOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGN1cnJlbnRSZXN1bHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gY3VycmVudFdpZHRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgICAgICBTaW5nbGVMaW5lV3JhcHBlci5wcm90b3R5cGUuYXJlU2FtZVJlc3VsdHMgPSBmdW5jdGlvbiAob25lLCB0d28pIHsKICAgICAgICAgICAgcmV0dXJuIG9uZS5ub0xpbmVzID09PSB0d28ubm9MaW5lcyAmJiBvbmUudHJ1bmNhdGVkVGV4dCA9PT0gdHdvLnRydW5jYXRlZFRleHQ7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gU2luZ2xlTGluZVdyYXBwZXI7CiAgICB9KHdyYXBwZXIuV3JhcHBlcikpOwogICAgU2luZ2xlTGluZVdyYXBwZXIuTk9fV1JBUF9JVEVSQVRJT05TID0gNTsKICAgIGV4cG9ydHMuU2luZ2xlTGluZVdyYXBwZXIgPSBTaW5nbGVMaW5lV3JhcHBlcjsKCiAgICB9KTsKCiAgICB2YXIgd3JhcHBlcnMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzLCBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAgICAgKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlCiAgICAgKiBsaWNlbnNlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci90eXBlc2V0dGFibGUvYmxvYi9kZXZlbG9wL0xJQ0VOU0UKICAgICAqLwogICAgZnVuY3Rpb24gX19leHBvcnQobSkgewogICAgICAgIGZvciAodmFyIHAgaW4gbSkgaWYgKCFleHBvcnRzLmhhc093blByb3BlcnR5KHApKSBleHBvcnRzW3BdID0gbVtwXTsKICAgIH0KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICBfX2V4cG9ydChzaW5nbGVMaW5lV3JhcHBlcik7CiAgICBfX2V4cG9ydCh3cmFwcGVyKTsKCiAgICB9KTsKCiAgICB2YXIgdHlwZXNldHRlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAqIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3R5cGVzZXR0YWJsZS9ibG9iL2RldmVsb3AvTElDRU5TRQogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIC8qKgogICAgICogVGhpcyBpcyBhIGNvbnZlbmllbmNlIGludGVyZmFjZSBmb3IgdHlwZXNldHRpbmcgc3RyaW5ncyB1c2luZyB0aGUgZGVmYXVsdAogICAgICogbWVhc3VyZXIvd3JhcHBlci93cml0ZXIgc2V0dXAuCiAgICAgKi8KICAgIHZhciBUeXBlc2V0dGVyID0gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBUeXBlc2V0dGVyKGNvbnRleHQpIHsKICAgICAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDsKICAgICAgICAgICAgdGhpcy5tZWFzdXJlciA9IG5ldyBtZWFzdXJlcnMuQ2FjaGVNZWFzdXJlcih0aGlzLmNvbnRleHQpOwogICAgICAgICAgICB0aGlzLndyYXBwZXIgPSBuZXcgd3JhcHBlcnMuV3JhcHBlcigpOwogICAgICAgICAgICB0aGlzLndyaXRlciA9IG5ldyB3cml0ZXJzLldyaXRlcih0aGlzLm1lYXN1cmVyLCB0aGlzLmNvbnRleHQsIHRoaXMud3JhcHBlcik7CiAgICAgICAgfQogICAgICAgIFR5cGVzZXR0ZXIuc3ZnID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNsYXNzTmFtZSwgYWRkVGl0bGVFbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgVHlwZXNldHRlcihuZXcgY29udGV4dHMuU3ZnQ29udGV4dChlbGVtZW50LCBjbGFzc05hbWUsIGFkZFRpdGxlRWxlbWVudCkpOwogICAgICAgIH07CiAgICAgICAgVHlwZXNldHRlci5jYW52YXMgPSBmdW5jdGlvbiAoY3R4LCBsaW5lSGVpZ2h0LCBzdHlsZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFR5cGVzZXR0ZXIobmV3IGNvbnRleHRzLkNhbnZhc0NvbnRleHQoY3R4LCBsaW5lSGVpZ2h0LCBzdHlsZSkpOwogICAgICAgIH07CiAgICAgICAgVHlwZXNldHRlci5odG1sID0gZnVuY3Rpb24gKGVsZW1lbnQsIGNsYXNzTmFtZSwgYWRkVGl0bGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlc2V0dGVyKG5ldyBjb250ZXh0cy5IdG1sQ29udGV4dChlbGVtZW50LCBjbGFzc05hbWUsIGFkZFRpdGxlKSk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBXcmFwcyB0aGUgZ2l2ZW4gc3RyaW5nIGludG8gdGhlIHdpZHRoL2hlaWdodCBhbmQgd3JpdGVzIGl0IGludG8gdGhlCiAgICAgICAgICogY2FudmFzIG9yIFNWRyAoZGVwZW5kaW5nIG9uIGNvbnRleHQpLgogICAgICAgICAqCiAgICAgICAgICogRGVsZWdhdGVzIHRvIGBXcml0ZXIud3JpdGVgIHVzaW5nIHRoZSBpbnRlcm5hbCBgSVR5cGVzZXR0ZXJDb250ZXh0YC4KICAgICAgICAgKi8KICAgICAgICBUeXBlc2V0dGVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uICh0ZXh0LCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zLCBpbnRvKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVyLndyaXRlKHRleHQsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMsIGludG8pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXJzIHRoZSBgTWVhc3VyZXJgJ3MgQ2FjaGVNZWFzdXJlci4KICAgICAgICAgKgogICAgICAgICAqIENhbGwgdGhpcyBpZiB5b3VyIGZvbnQgc3R5bGUgY2hhbmdlZSBpbiBTVkcuCiAgICAgICAgICovCiAgICAgICAgVHlwZXNldHRlci5wcm90b3R5cGUuY2xlYXJNZWFzdXJlckNhY2hlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLm1lYXN1cmVyLnJlc2V0KCk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gVHlwZXNldHRlcjsKICAgIH0oKSk7CiAgICBleHBvcnRzLlR5cGVzZXR0ZXIgPSBUeXBlc2V0dGVyOwoKICAgIH0pOwoKICAgIHZhciBzcmMkMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMsIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZSAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUKICAgICAqIGxpY2Vuc2UgYXQgaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3R5cGVzZXR0YWJsZS9ibG9iL2RldmVsb3AvTElDRU5TRQogICAgICovCiAgICBmdW5jdGlvbiBfX2V4cG9ydChtKSB7CiAgICAgICAgZm9yICh2YXIgcCBpbiBtKSBpZiAoIWV4cG9ydHMuaGFzT3duUHJvcGVydHkocCkpIGV4cG9ydHNbcF0gPSBtW3BdOwogICAgfQogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIF9fZXhwb3J0KGNvbnRleHRzKTsKICAgIF9fZXhwb3J0KG1lYXN1cmVycyk7CiAgICBfX2V4cG9ydCh0eXBlc2V0dGVyKTsKICAgIF9fZXhwb3J0KHV0aWxzKTsKICAgIF9fZXhwb3J0KHdyYXBwZXJzKTsKICAgIF9fZXhwb3J0KHdyaXRlcnMpOwoKICAgIH0pOwoKICAgIHZhciBhcnJheVV0aWxzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgogICAgdmFyIG5hdGl2ZUFycmF5ID0gd2luZG93LkFycmF5OwogICAgLyoqCiAgICAgKiBUYWtlcyB0d28gYXJyYXlzIG9mIG51bWJlcnMgYW5kIGFkZHMgdGhlbSB0b2dldGhlcgogICAgICoKICAgICAqIEBwYXJhbSB7bnVtYmVyW119IGFMaXN0IFRoZSBmaXJzdCBhcnJheSBvZiBudW1iZXJzCiAgICAgKiBAcGFyYW0ge251bWJlcltdfSBiTGlzdCBUaGUgc2Vjb25kIGFycmF5IG9mIG51bWJlcnMKICAgICAqIEByZXR1cm4ge251bWJlcltdfSBBbiBhcnJheSBvZiBudW1iZXJzIHdoZXJlIHhbaV0gPSBhTGlzdFtpXSArIGJMaXN0W2ldCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZChhTGlzdCwgYkxpc3QpIHsKICAgICAgICBpZiAoYUxpc3QubGVuZ3RoICE9PSBiTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJhdHRlbXB0ZWQgdG8gYWRkIGFycmF5cyBvZiB1bmVxdWFsIGxlbmd0aCIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYUxpc3QubWFwKGZ1bmN0aW9uIChfLCBpKSB7IHJldHVybiBhTGlzdFtpXSArIGJMaXN0W2ldOyB9KTsKICAgIH0KICAgIGV4cG9ydHMuYWRkID0gYWRkOwogICAgLyoqCiAgICAgKiBUYWtlIGFuIGFycmF5IG9mIHZhbHVlcywgYW5kIHJldHVybiB0aGUgdW5pcXVlIHZhbHVlcy4KICAgICAqIFdpbGwgd29yayBpZmYg4oiAIGEsIGIsIGEudG9TdHJpbmcoKSA9PSBiLnRvU3RyaW5nKCkgPT4gYSA9PSBiOyB3aWxsIGJyZWFrIG9uIE9iamVjdCBpbnB1dHMKICAgICAqCiAgICAgKiBAcGFyYW0ge1RbXX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gZmluZCB1bmlxdWVuZXNzIGZvcgogICAgICogQHJldHVybiB7VFtdfSBUaGUgdW5pcXVlIHZhbHVlcwogICAgICovCiAgICBmdW5jdGlvbiB1bmlxKGFycikgewogICAgICAgIHZhciBzZWVuID0gZDMuc2V0KCk7CiAgICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICAgIGFyci5mb3JFYWNoKGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgIGlmICghc2Vlbi5oYXMoU3RyaW5nKHgpKSkgewogICAgICAgICAgICAgICAgc2Vlbi5hZGQoU3RyaW5nKHgpKTsKICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHgpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIGV4cG9ydHMudW5pcSA9IHVuaXE7CiAgICAvKioKICAgICAqIEBwYXJhbSB7VFtdW119IGEgVGhlIDJEIGFycmF5IHRoYXQgd2lsbCBoYXZlIGl0cyBlbGVtZW50cyBqb2luZWQgdG9nZXRoZXIuCiAgICAgKiBAcmV0dXJuIHtUW119IEV2ZXJ5IGFycmF5IGluIGEsIGNvbmNhdGVuYXRlZCB0b2dldGhlciBpbiB0aGUgb3JkZXIgdGhleSBhcHBlYXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYSkgewogICAgICAgIHJldHVybiBuYXRpdmVBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBhKTsKICAgIH0KICAgIGV4cG9ydHMuZmxhdHRlbiA9IGZsYXR0ZW47CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgbGVuZ3RoIGBjb3VudGAsIGZpbGxlZCB3aXRoIHZhbHVlIG9yIChpZiB2YWx1ZSBpcyBhIGZ1bmN0aW9uKSwgdmFsdWUoKQogICAgICoKICAgICAqIEBwYXJhbSB7VCB8ICgoaW5kZXg/OiBudW1iZXIpID0+IFQpfSB2YWx1ZSBUaGUgdmFsdWUgdG8gZmlsbCB0aGUgYXJyYXkgd2l0aCBvciBhIHZhbHVlIGdlbmVyYXRvciAoY2FsbGVkIHdpdGggaW5kZXggYXMgYXJnKQogICAgICogQHBhcmFtIHtudW1iZXJ9IGNvdW50IFRoZSBsZW5ndGggb2YgdGhlIGFycmF5IHRvIGdlbmVyYXRlCiAgICAgKiBAcmV0dXJuIHthbnlbXX0KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlRmlsbGVkQXJyYXkodmFsdWUsIGNvdW50KSB7CiAgICAgICAgdmFyIG91dCA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewogICAgICAgICAgICBvdXRbaV0gPSB0eXBlb2YgKHZhbHVlKSA9PT0gImZ1bmN0aW9uIiA/IHZhbHVlKGkpIDogdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvdXQ7CiAgICB9CiAgICBleHBvcnRzLmNyZWF0ZUZpbGxlZEFycmF5ID0gY3JlYXRlRmlsbGVkQXJyYXk7CiAgICB9KTsKCiAgICB2YXIgY29sb3JVdGlscyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHZhciBuYXRpdmVNYXRoID0gd2luZG93Lk1hdGg7CiAgICAvKioKICAgICAqIFJldHVybiBjb250cmFzdCByYXRpbyBiZXR3ZWVuIHR3byBjb2xvcnMKICAgICAqIEJhc2VkIG9uIGltcGxlbWVudGF0aW9uIGZyb20gY2hyb21hLmpzIGJ5IEdyZWdvciBBaXNjaCAoZ2thKSAobGljZW5zZWQgdW5kZXIgQlNEKQogICAgICogY2hyb21hLmpzIG1heSBiZSBmb3VuZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vZ2thL2Nocm9tYS5qcwogICAgICogTGljZW5zZSBtYXkgYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2drYS9jaHJvbWEuanMvYmxvYi9tYXN0ZXIvTElDRU5TRQogICAgICogc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDgvUkVDLVdDQUcyMC0yMDA4MTIxMS8jY29udHJhc3QtcmF0aW9kZWYKICAgICAqLwogICAgZnVuY3Rpb24gY29udHJhc3QoYSwgYikgewogICAgICAgIHZhciBsMSA9IGx1bWluYW5jZShhKSArIDAuMDU7CiAgICAgICAgdmFyIGwyID0gbHVtaW5hbmNlKGIpICsgMC4wNTsKICAgICAgICByZXR1cm4gbDEgPiBsMiA/IGwxIC8gbDIgOiBsMiAvIGwxOwogICAgfQogICAgZXhwb3J0cy5jb250cmFzdCA9IGNvbnRyYXN0OwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgYnJpZ2h0ZXIgY29weSBvZiB0aGlzIGNvbG9yLiBFYWNoIGNoYW5uZWwgaXMgbXVsdGlwbGllZCBieSAwLjcgXiAtZmFjdG9yLgogICAgICogQ2hhbm5lbCB2YWx1ZXMgYXJlIGNhcHBlZCBhdCB0aGUgbWF4aW11bSB2YWx1ZSBvZiAyNTUsIGFuZCB0aGUgbWluaW11bSB2YWx1ZSBvZiAzMC4KICAgICAqLwogICAgZnVuY3Rpb24gbGlnaHRlbkNvbG9yKGNvbG9yLCBmYWN0b3IpIHsKICAgICAgICB2YXIgYnJpZ2h0ZW5lZCA9IGQzLmNvbG9yKGNvbG9yKS5icmlnaHRlcihmYWN0b3IpOwogICAgICAgIHJldHVybiBicmlnaHRlbmVkLnJnYigpLnRvU3RyaW5nKCk7CiAgICB9CiAgICBleHBvcnRzLmxpZ2h0ZW5Db2xvciA9IGxpZ2h0ZW5Db2xvcjsKICAgIC8qKgogICAgICogR2V0cyB0aGUgSGV4IENvZGUgb2YgdGhlIGNvbG9yIHJlc3VsdGluZyBieSBhcHBseWluZyB0aGUgY2xhc3NOYW1lIENTUyBjbGFzcyB0byB0aGUKICAgICAqIGNvbG9yVGVzdGVyIHNlbGVjdGlvbi4gUmV0dXJucyBudWxsIGlmIHRoZSB0ZXN0ZXIgaXMgdHJhbnNwYXJlbnQuCiAgICAgKgogICAgICogQHBhcmFtIHtkMy5TZWxlY3Rpb248dm9pZD59IGNvbG9yVGVzdGVyIFRoZSBkMyBzZWxlY3Rpb24gdG8gYXBwbHkgdGhlIENTUyBjbGFzcyB0bwogICAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXNzTmFtZSBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgdG8gYmUgYXBwbGllZAogICAgICogQHJldHVybiB7c3RyaW5nfSBUaGUgaGV4IGNvZGUgb2YgdGhlIGNvbXB1dGVkIGNvbG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbG9yVGVzdChjb2xvclRlc3RlciwgY2xhc3NOYW1lKSB7CiAgICAgICAgY29sb3JUZXN0ZXIuY2xhc3NlZChjbGFzc05hbWUsIHRydWUpOwogICAgICAgIC8vIFVzZSByZWdleCB0byBnZXQgdGhlIHRleHQgaW5zaWRlIHRoZSByZ2IgcGFyZW50aGVzZXMKICAgICAgICB2YXIgY29sb3JTdHlsZSA9IGNvbG9yVGVzdGVyLnN0eWxlKCJiYWNrZ3JvdW5kLWNvbG9yIik7CiAgICAgICAgaWYgKGNvbG9yU3R5bGUgPT09ICJ0cmFuc3BhcmVudCIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHZhciBtYXRjaCA9IC9cKCguKylcKS8uZXhlYyhjb2xvclN0eWxlKTsKICAgICAgICBpZiAoIW1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgcmdiID0gbWF0Y2hbMV0KICAgICAgICAgICAgLnNwbGl0KCIsIikKICAgICAgICAgICAgLm1hcChmdW5jdGlvbiAoY29sb3JWYWx1ZSkgewogICAgICAgICAgICB2YXIgY29sb3JOdW1iZXIgPSArY29sb3JWYWx1ZTsKICAgICAgICAgICAgdmFyIGhleFZhbHVlID0gY29sb3JOdW1iZXIudG9TdHJpbmcoMTYpOwogICAgICAgICAgICByZXR1cm4gY29sb3JOdW1iZXIgPCAxNiA/ICIwIiArIGhleFZhbHVlIDogaGV4VmFsdWU7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHJnYi5sZW5ndGggPT09IDQgJiYgcmdiWzNdID09PSAiMDAiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgaGV4Q29kZSA9ICIjIiArIHJnYi5qb2luKCIiKTsKICAgICAgICBjb2xvclRlc3Rlci5jbGFzc2VkKGNsYXNzTmFtZSwgZmFsc2UpOwogICAgICAgIHJldHVybiBoZXhDb2RlOwogICAgfQogICAgZXhwb3J0cy5jb2xvclRlc3QgPSBjb2xvclRlc3Q7CiAgICAvKioKICAgICAqIFJldHVybiByZWxhdGl2ZSBsdW1pbmFuY2UgKGRlZmluZWQgaGVyZTogaHR0cDovL3d3dy53My5vcmcvVFIvMjAwOC9SRUMtV0NBRzIwLTIwMDgxMjExLyNyZWxhdGl2ZWx1bWluYW5jZWRlZikKICAgICAqIEJhc2VkIG9uIGltcGxlbWVudGF0aW9uIGZyb20gY2hyb21hLmpzIGJ5IEdyZWdvciBBaXNjaCAoZ2thKSAobGljZW5zZWQgdW5kZXIgQlNEKQogICAgICogY2hyb21hLmpzIG1heSBiZSBmb3VuZCBoZXJlOiBodHRwczovL2dpdGh1Yi5jb20vZ2thL2Nocm9tYS5qcwogICAgICogTGljZW5zZSBtYXkgYmUgZm91bmQgaGVyZTogaHR0cHM6Ly9naXRodWIuY29tL2drYS9jaHJvbWEuanMvYmxvYi9tYXN0ZXIvTElDRU5TRQogICAgICovCiAgICBmdW5jdGlvbiBsdW1pbmFuY2UoY29sb3IpIHsKICAgICAgICB2YXIgcmdiID0gZDMucmdiKGNvbG9yKTsKICAgICAgICB2YXIgbHVtID0gZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgeCA9IHggLyAyNTU7CiAgICAgICAgICAgIHJldHVybiB4IDw9IDAuMDM5MjggPyB4IC8gMTIuOTIgOiBuYXRpdmVNYXRoLnBvdygoeCArIDAuMDU1KSAvIDEuMDU1LCAyLjQpOwogICAgICAgIH07CiAgICAgICAgdmFyIHIgPSBsdW0ocmdiLnIpOwogICAgICAgIHZhciBnID0gbHVtKHJnYi5nKTsKICAgICAgICB2YXIgYiA9IGx1bShyZ2IuYik7CiAgICAgICAgcmV0dXJuIDAuMjEyNiAqIHIgKyAwLjcxNTIgKiBnICsgMC4wNzIyICogYjsKICAgIH0KICAgIH0pOwoKICAgIHZhciBkb21VdGlscyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHZhciBuYXRpdmVNYXRoID0gd2luZG93Lk1hdGg7CiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgY2hpbGQgaXMgaW4gZmFjdCBhIGNoaWxkIG9mIHRoZSBwYXJlbnQKICAgICAqLwogICAgZnVuY3Rpb24gY29udGFpbnMocGFyZW50LCBjaGlsZCkgewogICAgICAgIHZhciBtYXliZVBhcmVudCA9IGNoaWxkOwogICAgICAgIHdoaWxlIChtYXliZVBhcmVudCAhPSBudWxsICYmIG1heWJlUGFyZW50ICE9PSBwYXJlbnQpIHsKICAgICAgICAgICAgbWF5YmVQYXJlbnQgPSBtYXliZVBhcmVudC5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWF5YmVQYXJlbnQgPT09IHBhcmVudDsKICAgIH0KICAgIGV4cG9ydHMuY29udGFpbnMgPSBjb250YWluczsKICAgIC8qKgogICAgICogR2V0cyB0aGUgYm91bmRpbmcgYm94IG9mIGFuIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge2QzLlNlbGVjdGlvbn0gZWxlbWVudAogICAgICogQHJldHVybnMge1NWR1JlZH0gVGhlIGJvdW5kaW5nIGJveC4KICAgICAqLwogICAgZnVuY3Rpb24gZWxlbWVudEJCb3goZWxlbWVudCkgewogICAgICAgIHZhciBiYm94OwogICAgICAgIC8vIEhBQ0tIQUNLOiBGaXJlZm94IHdvbid0IGNvcnJlY3RseSBtZWFzdXJlIG5vZGVzIHdpdGggc3R5bGUgImRpc3BsYXk6IG5vbmUiIG9yIHRoZWlyIGRlc2NlbmRlbnRzIChGRiBCdWcgNjEyMTE4KS4KICAgICAgICB0cnkgewogICAgICAgICAgICBiYm94ID0gZWxlbWVudC5ub2RlKCkuZ2V0QkJveCgpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgIGJib3ggPSB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGJib3g7CiAgICB9CiAgICBleHBvcnRzLmVsZW1lbnRCQm94ID0gZWxlbWVudEJCb3g7CiAgICBmdW5jdGlvbiBlbnRpdHlCb3VuZHMoZWxlbWVudCkgewogICAgICAgIGlmIChlbGVtZW50IGluc3RhbmNlb2YgU1ZHRWxlbWVudCkgewogICAgICAgICAgICByZXR1cm4gZWxlbWVudEJCb3goZDMuc2VsZWN0KGVsZW1lbnQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAgICAgICAgIHZhciByZWN0ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgcmV0dXJuIHsgeDogcmVjdC5sZWZ0LCB5OiByZWN0LnRvcCwgd2lkdGg6IHJlY3Qud2lkdGgsIGhlaWdodDogcmVjdC5oZWlnaHQgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB7IHg6IDAsIHk6IDAsIHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICB9CiAgICB9CiAgICBleHBvcnRzLmVudGl0eUJvdW5kcyA9IGVudGl0eUJvdW5kczsKICAgIC8qKgogICAgICogU2NyZWVuIHJlZnJlc2ggcmF0ZSB3aGljaCBpcyBhc3N1bWVkIHRvIGJlIDYwZnBzCiAgICAgKi8KICAgIGV4cG9ydHMuU0NSRUVOX1JFRlJFU0hfUkFURV9NSUxMSVNFQ09ORFMgPSAxMDAwIC8gNjA7CiAgICAvKioKICAgICAqIFBvbHlmaWxsIGZvciBgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZWAuCiAgICAgKiBJZiB0aGUgZnVuY3Rpb24gZXhpc3RzLCB0aGVuIHdlIHVzZSB0aGUgZnVuY3Rpb24gZGlyZWN0bHkuCiAgICAgKiBPdGhlcndpc2UsIHdlIHNldCBhIHRpbWVvdXQgb24gYFNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTYCBhbmQgdGhlbiBwZXJmb3JtIHRoZSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0geygpID0+IHZvaWR9IGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBjYWxsIGluIHRoZSBuZXh0IGFuaW1hdGlvbiBmcmFtZQogICAgICovCiAgICBmdW5jdGlvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChjYWxsYmFjaykgewogICAgICAgIGlmICh3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9IG51bGwpIHsKICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShjYWxsYmFjayk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzZXRUaW1lb3V0KGNhbGxiYWNrLCBleHBvcnRzLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTKTsKICAgICAgICB9CiAgICB9CiAgICBleHBvcnRzLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsID0gcmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGw7CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIHdpZHRoIG9mIHRoZSBlbGVtZW50LgogICAgICogVGhlIHdpZHRoIGluY2x1ZGVzIHRoZSBwYWRkaW5nIGFuZCB0aGUgYm9yZGVyIG9uIHRoZSBlbGVtZW50J3MgbGVmdCBhbmQgcmlnaHQgc2lkZXMuCiAgICAgKgogICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHF1ZXJ5CiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgd2lkdGggb2YgdGhlIGVsZW1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVsZW1lbnRXaWR0aChlbGVtZW50T3JTZWxlY3Rpb24pIHsKICAgICAgICB2YXIgZWxlbWVudCA9IGVsZW1lbnRPclNlbGVjdGlvbiBpbnN0YW5jZW9mIGQzLnNlbGVjdGlvbgogICAgICAgICAgICA/IGVsZW1lbnRPclNlbGVjdGlvbi5ub2RlKCkKICAgICAgICAgICAgOiBlbGVtZW50T3JTZWxlY3Rpb247CiAgICAgICAgdmFyIHN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCk7CiAgICAgICAgcmV0dXJuIF9wYXJzZVN0eWxlVmFsdWUoc3R5bGUsICJ3aWR0aCIpCiAgICAgICAgICAgICsgX3BhcnNlU3R5bGVWYWx1ZShzdHlsZSwgInBhZGRpbmctbGVmdCIpCiAgICAgICAgICAgICsgX3BhcnNlU3R5bGVWYWx1ZShzdHlsZSwgInBhZGRpbmctcmlnaHQiKQogICAgICAgICAgICArIF9wYXJzZVN0eWxlVmFsdWUoc3R5bGUsICJib3JkZXItbGVmdC13aWR0aCIpCiAgICAgICAgICAgICsgX3BhcnNlU3R5bGVWYWx1ZShzdHlsZSwgImJvcmRlci1yaWdodC13aWR0aCIpOwogICAgfQogICAgZXhwb3J0cy5lbGVtZW50V2lkdGggPSBlbGVtZW50V2lkdGg7CiAgICAvKioKICAgICAqIENhbGN1bGF0ZXMgdGhlIGhlaWdodCBvZiB0aGUgZWxlbWVudC4KICAgICAqIFRoZSBoZWlnaHQgaW5jbHVkZXMgdGhlIHBhZGRpbmcgdGhlIGFuZCB0aGUgYm9yZGVyIG9uIHRoZSBlbGVtZW50J3MgdG9wIGFuZCBib3R0b20gc2lkZXMuCiAgICAgKgogICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHF1ZXJ5CiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBUaGUgaGVpZ2h0IG9mIHRoZSBlbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIGVsZW1lbnRIZWlnaHQoZWxlbWVudE9yU2VsZWN0aW9uKSB7CiAgICAgICAgdmFyIGVsZW1lbnQgPSBlbGVtZW50T3JTZWxlY3Rpb24gaW5zdGFuY2VvZiBkMy5zZWxlY3Rpb24KICAgICAgICAgICAgPyBlbGVtZW50T3JTZWxlY3Rpb24ubm9kZSgpCiAgICAgICAgICAgIDogZWxlbWVudE9yU2VsZWN0aW9uOwogICAgICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpOwogICAgICAgIHJldHVybiBfcGFyc2VTdHlsZVZhbHVlKHN0eWxlLCAiaGVpZ2h0IikKICAgICAgICAgICAgKyBfcGFyc2VTdHlsZVZhbHVlKHN0eWxlLCAicGFkZGluZy10b3AiKQogICAgICAgICAgICArIF9wYXJzZVN0eWxlVmFsdWUoc3R5bGUsICJwYWRkaW5nLWJvdHRvbSIpCiAgICAgICAgICAgICsgX3BhcnNlU3R5bGVWYWx1ZShzdHlsZSwgImJvcmRlci10b3Atd2lkdGgiKQogICAgICAgICAgICArIF9wYXJzZVN0eWxlVmFsdWUoc3R5bGUsICJib3JkZXItYm90dG9tLXdpZHRoIik7CiAgICB9CiAgICBleHBvcnRzLmVsZW1lbnRIZWlnaHQgPSBlbGVtZW50SGVpZ2h0OwogICAgLy8gdGFrZW4gZnJvbSB0aGUgQk5GIGF0IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9TVkcvY29vcmRzLmh0bWwKICAgIHZhciBXU1AgPSAiXFxzIjsKICAgIHZhciBOVU1CRVIgPSAiKD86Wy0rXT9bMC05XSpcXC4/WzAtOV0rKSI7CiAgICB2YXIgQ09NTUFfV1NQID0gIig/Oig/OiIgKyBXU1AgKyAiKyw/IiArIFdTUCArICIqKXwoPzosIiArIFdTUCArICIqKSkiOwogICAgdmFyIFRSQU5TTEFURV9SRUdFWCA9IG5ldyBSZWdFeHAoInRyYW5zbGF0ZSIgKyBXU1AgKyAiKlxcKCIgKyBXU1AgKyAiKigiICsgTlVNQkVSICsgIikoPzoiICsgQ09NTUFfV1NQICsgIigiICsgTlVNQkVSICsgIikpPyIgKyBXU1AgKyAiKlxcKSIpOwogICAgdmFyIFJPVEFURV9SRUdFWCA9IG5ldyBSZWdFeHAoInJvdGF0ZSIgKyBXU1AgKyAiKlxcKCIgKyBXU1AgKyAiKigiICsgTlVNQkVSICsgIikiICsgV1NQICsgIipcXCkiKTsKICAgIHZhciBTQ0FMRV9SRUdFWCA9IG5ldyBSZWdFeHAoInNjYWxlIiArIFdTUCArICIqXFwoIiArIFdTUCArICIqKCIgKyBOVU1CRVIgKyAiKSg/OiIgKyBDT01NQV9XU1AgKyAiKCIgKyBOVU1CRVIgKyAiKSk/IiArIFdTUCArICIqXFwpIik7CiAgICAvKioKICAgICAqIEFjY2VwdHMgc2VsZWN0aW9ucyB3aG9zZSAudHJhbnNmb3JtIGNvbnRhaW4gYSAidHJhbnNsYXRlKGEsIGIpIiBhbmQgZXh0cmFjdHMgdGhlIGEgYW5kIGIKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VHJhbnNsYXRlVmFsdWVzKGVsKSB7CiAgICAgICAgdmFyIG1hdGNoID0gVFJBTlNMQVRFX1JFR0VYLmV4ZWMoZWwuYXR0cigidHJhbnNmb3JtIikpOwogICAgICAgIGlmIChtYXRjaCAhPSBudWxsKSB7CiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVYID0gbWF0Y2hbMV0sIF9hID0gbWF0Y2hbMl0sIHRyYW5zbGF0ZVkgPSBfYSA9PT0gdm9pZCAwID8gMCA6IF9hOwogICAgICAgICAgICByZXR1cm4gWyt0cmFuc2xhdGVYLCArdHJhbnNsYXRlWV07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gWzAsIDBdOwogICAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMuZ2V0VHJhbnNsYXRlVmFsdWVzID0gZ2V0VHJhbnNsYXRlVmFsdWVzOwogICAgLyoqCiAgICAgKiBBY2NlcHRzIHNlbGVjdGlvbnMgd2hvc2UgLnRyYW5zZm9ybSBjb250YWluIGEgInJvdGF0ZShhbmdsZSkiIGFuZCByZXR1cm5zIHRoZSBhbmdsZQogICAgICovCiAgICBmdW5jdGlvbiBnZXRSb3RhdGUoZWwpIHsKICAgICAgICB2YXIgbWF0Y2ggPSBST1RBVEVfUkVHRVguZXhlYyhlbC5hdHRyKCJ0cmFuc2Zvcm0iKSk7CiAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKICAgICAgICAgICAgdmFyIHJvdGF0aW9uID0gbWF0Y2hbMV07CiAgICAgICAgICAgIHJldHVybiArcm90YXRpb247CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICB9CiAgICBleHBvcnRzLmdldFJvdGF0ZSA9IGdldFJvdGF0ZTsKICAgIGZ1bmN0aW9uIGdldFNjYWxlVmFsdWVzKGVsKSB7CiAgICAgICAgdmFyIG1hdGNoID0gU0NBTEVfUkVHRVguZXhlYyhlbC5hdHRyKCJ0cmFuc2Zvcm0iKSk7CiAgICAgICAgaWYgKG1hdGNoICE9IG51bGwpIHsKICAgICAgICAgICAgdmFyIHNjYWxlWCA9IG1hdGNoWzFdLCBzY2FsZVkgPSBtYXRjaFsyXTsKICAgICAgICAgICAgcmV0dXJuIFsrc2NhbGVYLCBzY2FsZVkgPT0gbnVsbCA/ICtzY2FsZVggOiArc2NhbGVZXTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBbMCwgMF07CiAgICAgICAgfQogICAgfQogICAgZXhwb3J0cy5nZXRTY2FsZVZhbHVlcyA9IGdldFNjYWxlVmFsdWVzOwogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgdGhlIGZpcnN0IENsaWVudFJlY3Qgb3ZlcmxhcHMgdGhlIHNlY29uZC4KICAgICAqCiAgICAgKiBAcGFyYW0ge0NsaWVudFJlY3R9IGNsaWVudFJlY3RBIFRoZSBmaXJzdCBDbGllbnRSZWN0CiAgICAgKiBAcGFyYW0ge0NsaWVudFJlY3R9IGNsaWVudFJlY3RCIFRoZSBzZWNvbmQgQ2xpZW50UmVjdAogICAgICogQHJldHVybnMge2Jvb2xlYW59IElmIHRoZSBDbGllbnRSZWN0cyBvdmVybGFwIGVhY2ggb3RoZXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsaWVudFJlY3RzT3ZlcmxhcChjbGllbnRSZWN0QSwgY2xpZW50UmVjdEIpIHsKICAgICAgICBpZiAobmF0aXZlTWF0aC5mbG9vcihjbGllbnRSZWN0QS5yaWdodCkgPD0gbmF0aXZlTWF0aC5jZWlsKGNsaWVudFJlY3RCLmxlZnQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgaWYgKG5hdGl2ZU1hdGguY2VpbChjbGllbnRSZWN0QS5sZWZ0KSA+PSBuYXRpdmVNYXRoLmZsb29yKGNsaWVudFJlY3RCLnJpZ2h0KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGlmIChuYXRpdmVNYXRoLmZsb29yKGNsaWVudFJlY3RBLmJvdHRvbSkgPD0gbmF0aXZlTWF0aC5jZWlsKGNsaWVudFJlY3RCLnRvcCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBpZiAobmF0aXZlTWF0aC5jZWlsKGNsaWVudFJlY3RBLnRvcCkgPj0gbmF0aXZlTWF0aC5mbG9vcihjbGllbnRSZWN0Qi5ib3R0b20pKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICBleHBvcnRzLmNsaWVudFJlY3RzT3ZlcmxhcCA9IGNsaWVudFJlY3RzT3ZlcmxhcDsKICAgIC8qKgogICAgICogUmV0dXJuIGEgbmV3IENsaWVudFJlY3QgdGhhdCBpcyB0aGUgb2xkIENsaWVudFJlY3QgZXhwYW5kZWQgYnkgYW1vdW50IGluIGFsbCBkaXJlY3Rpb25zLgogICAgICogQHBhcmFtIHJlY3QKICAgICAqIEBwYXJhbSBhbW91bnQKICAgICAqLwogICAgZnVuY3Rpb24gZXhwYW5kUmVjdChyZWN0LCBhbW91bnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZWZ0OiByZWN0LmxlZnQgLSBhbW91bnQsCiAgICAgICAgICAgIHRvcDogcmVjdC50b3AgLSBhbW91bnQsCiAgICAgICAgICAgIHJpZ2h0OiByZWN0LnJpZ2h0ICsgYW1vdW50LAogICAgICAgICAgICBib3R0b206IHJlY3QuYm90dG9tICsgYW1vdW50LAogICAgICAgICAgICB3aWR0aDogcmVjdC53aWR0aCArIGFtb3VudCAqIDIsCiAgICAgICAgICAgIGhlaWdodDogcmVjdC5oZWlnaHQgKyBhbW91bnQgKiAyLAogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLmV4cGFuZFJlY3QgPSBleHBhbmRSZWN0OwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgaW5uZXJDbGllbnRSZWN0IGlzIGluc2lkZSBvdXRlckNsaWVudFJlY3QuCiAgICAgKgogICAgICogQHBhcmFtIHtDbGllbnRSZWN0fSBpbm5lckNsaWVudFJlY3QgVGhlIGZpcnN0IENsaWVudFJlY3QKICAgICAqIEBwYXJhbSB7Q2xpZW50UmVjdH0gb3V0ZXJDbGllbnRSZWN0IFRoZSBzZWNvbmQgQ2xpZW50UmVjdAogICAgICogQHJldHVybnMge2Jvb2xlYW59IElmIGFuZCBvbmx5IGlmIHRoZSBpbm5lckNsaWVudFJlY3QgaXMgaW5zaWRlIG91dGVyQ2xpZW50UmVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gY2xpZW50UmVjdEluc2lkZShpbm5lckNsaWVudFJlY3QsIG91dGVyQ2xpZW50UmVjdCkgewogICAgICAgIHJldHVybiAobmF0aXZlTWF0aC5mbG9vcihvdXRlckNsaWVudFJlY3QubGVmdCkgPD0gbmF0aXZlTWF0aC5jZWlsKGlubmVyQ2xpZW50UmVjdC5sZWZ0KSAmJgogICAgICAgICAgICBuYXRpdmVNYXRoLmZsb29yKG91dGVyQ2xpZW50UmVjdC50b3ApIDw9IG5hdGl2ZU1hdGguY2VpbChpbm5lckNsaWVudFJlY3QudG9wKSAmJgogICAgICAgICAgICBuYXRpdmVNYXRoLmZsb29yKGlubmVyQ2xpZW50UmVjdC5yaWdodCkgPD0gbmF0aXZlTWF0aC5jZWlsKG91dGVyQ2xpZW50UmVjdC5yaWdodCkgJiYKICAgICAgICAgICAgbmF0aXZlTWF0aC5mbG9vcihpbm5lckNsaWVudFJlY3QuYm90dG9tKSA8PSBuYXRpdmVNYXRoLmNlaWwob3V0ZXJDbGllbnRSZWN0LmJvdHRvbSkpOwogICAgfQogICAgZXhwb3J0cy5jbGllbnRSZWN0SW5zaWRlID0gY2xpZW50UmVjdEluc2lkZTsKICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdXBwbGllZCBjb29yZGluYXRlcyBvciBSYW5nZXMgaW50ZXJzZWN0IG9yIGFyZSBjb250YWluZWQgYnkgYmJveC4KICAgICAqCiAgICAgKiBAcGFyYW0ge251bWJlciB8IFJhbmdlfSB4VmFsT3JSYW5nZSBUaGUgeCBjb29yZGluYXRlIG9yIFJhbmdlIHRvIHRlc3QKICAgICAqIEBwYXJhbSB7bnVtYmVyIHwgUmFuZ2V9IHlWYWxPclJhbmdlIFRoZSB5IGNvb3JkaW5hdGUgb3IgUmFuZ2UgdG8gdGVzdAogICAgICogQHBhcmFtIHtTVkdSZWN0fSBiYm94IFRoZSBiYm94CiAgICAgKiBAcGFyYW0ge251bWJlcn0gdG9sZXJhbmNlIEFtb3VudCBieSB3aGljaCB0byBleHBhbmQgYmJveCwgaW4gZWFjaCBkaW1lbnNpb24sIGJlZm9yZQogICAgICogdGVzdGluZyBpbnRlcnNlY3Rpb24KICAgICAqCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3VwcGxpZWQgY29vcmRpbmF0ZXMgb3IgUmFuZ2VzIGludGVyc2VjdCBvciBhcmUKICAgICAqIGNvbnRhaW5lZCBieSBiYm94LCBmYWxzZSBvdGhlcndpc2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVyc2VjdHNCQm94KHhWYWxPclJhbmdlLCB5VmFsT3JSYW5nZSwgYmJveCwgdG9sZXJhbmNlKSB7CiAgICAgICAgaWYgKHRvbGVyYW5jZSA9PT0gdm9pZCAwKSB7IHRvbGVyYW5jZSA9IDAuNTsgfQogICAgICAgIHZhciB4UmFuZ2UgPSBfcGFyc2VSYW5nZSh4VmFsT3JSYW5nZSk7CiAgICAgICAgdmFyIHlSYW5nZSA9IF9wYXJzZVJhbmdlKHlWYWxPclJhbmdlKTsKICAgICAgICAvLyBTVkdSZWN0cyBhcmUgcG9zaXRpb25lZCB3aXRoIHN1Yi1waXhlbCBhY2N1cmFjeSAodGhlIGRlZmF1bHQgdW5pdAogICAgICAgIC8vIGZvciB0aGUgeCwgeSwgaGVpZ2h0ICYgd2lkdGggYXR0cmlidXRlcyksIGJ1dCB1c2VyIHNlbGVjdGlvbnMgKGUuZy4gdmlhCiAgICAgICAgLy8gbW91c2UgZXZlbnRzKSB1c3VhbGx5IGhhdmUgcGl4ZWwgYWNjdXJhY3kuIEEgdG9sZXJhbmNlIG9mIGhhbGYtYS1waXhlbAogICAgICAgIC8vIHNlZW1zIGFwcHJvcHJpYXRlLgogICAgICAgIHJldHVybiBiYm94LnggKyBiYm94LndpZHRoID49IHhSYW5nZS5taW4gLSB0b2xlcmFuY2UgJiYKICAgICAgICAgICAgYmJveC54IDw9IHhSYW5nZS5tYXggKyB0b2xlcmFuY2UgJiYKICAgICAgICAgICAgYmJveC55ICsgYmJveC5oZWlnaHQgPj0geVJhbmdlLm1pbiAtIHRvbGVyYW5jZSAmJgogICAgICAgICAgICBiYm94LnkgPD0geVJhbmdlLm1heCArIHRvbGVyYW5jZTsKICAgIH0KICAgIGV4cG9ydHMuaW50ZXJzZWN0c0JCb3ggPSBpbnRlcnNlY3RzQkJveDsKICAgIC8qKgogICAgICogQ3JlYXRlIGEgUmFuZ2UgZnJvbSBhIG51bWJlciBvciBhbiBvYmplY3Qgd2l0aCAibWluIiBhbmQgIm1heCIgZGVmaW5lZC4KICAgICAqCiAgICAgKiBAcGFyYW0ge2FueX0gaW5wdXQgVGhlIG9iamVjdCB0byBwYXJzZQogICAgICoKICAgICAqIEByZXR1cm5zIHtSYW5nZX0gVGhlIGdlbmVyYXRlZCBSYW5nZQogICAgICovCiAgICBmdW5jdGlvbiBfcGFyc2VSYW5nZShpbnB1dCkgewogICAgICAgIGlmICh0eXBlb2YgKGlucHV0KSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgdmFyIHZhbHVlID0gaW5wdXQ7CiAgICAgICAgICAgIHJldHVybiB7IG1pbjogdmFsdWUsIG1heDogdmFsdWUgfTsKICAgICAgICB9CiAgICAgICAgdmFyIHJhbmdlID0gaW5wdXQ7CiAgICAgICAgaWYgKHJhbmdlIGluc3RhbmNlb2YgT2JqZWN0ICYmICJtaW4iIGluIHJhbmdlICYmICJtYXgiIGluIHJhbmdlKSB7CiAgICAgICAgICAgIHJldHVybiByYW5nZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnB1dCAnIiArIGlucHV0ICsgIicgY2FuJ3QgYmUgcGFyc2VkIGFzIGFuIFJhbmdlIik7CiAgICB9CiAgICBmdW5jdGlvbiBfcGFyc2VTdHlsZVZhbHVlKHN0eWxlLCBwcm9wZXJ0eSkgewogICAgICAgIHZhciB2YWx1ZSA9IHN0eWxlLmdldFByb3BlcnR5VmFsdWUocHJvcGVydHkpOwogICAgICAgIHZhciBwYXJzZWRWYWx1ZSA9IHBhcnNlRmxvYXQodmFsdWUpOwogICAgICAgIHJldHVybiBwYXJzZWRWYWx1ZSB8fCAwOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGFuY2VzdG9yIGBIVE1MRWxlbWVudGBzLCBzdGFydGluZyBhdCB0aGUKICAgICAqIHByb3ZpZGVkIGVsZW1lbnQgYW5kIHVzdWFsbHkgZW5kaW5nIHdpdGggdGhlIGA8Ym9keT5gIGVsZW1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEh0bWxFbGVtZW50QW5jZXN0b3JzKGVsZW0pIHsKICAgICAgICB2YXIgZWxlbXMgPSBbXTsKICAgICAgICB3aGlsZSAoZWxlbSAmJiBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpIHsKICAgICAgICAgICAgZWxlbXMucHVzaChlbGVtKTsKICAgICAgICAgICAgZWxlbSA9IGVsZW0ucGFyZW50RWxlbWVudDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVsZW1zOwogICAgfQogICAgZXhwb3J0cy5nZXRIdG1sRWxlbWVudEFuY2VzdG9ycyA9IGdldEh0bWxFbGVtZW50QW5jZXN0b3JzOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgSUNzc1RyYW5zZm9ybU1hdHJpeGAgb2YgYW4gZWxlbWVudCwgaWYgZGVmaW5lZCBpbiBpdHMgY29tcHV0ZWQKICAgICAqIHN0eWxlLiBSZXR1cm5zIGBudWxsYCBpZiB0aGVyZSBpcyBubyB0cmFuc2Zvcm0gb24gdGhlIGVsZW1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEVsZW1lbnRUcmFuc2Zvcm0oZWxlbSkgewogICAgICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW0sIG51bGwpOwogICAgICAgIHZhciB0cmFuc2Zvcm0gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCItd2Via2l0LXRyYW5zZm9ybSIpIHx8CiAgICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoIi1tb3otdHJhbnNmb3JtIikgfHwKICAgICAgICAgICAgc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgiLW1zLXRyYW5zZm9ybSIpIHx8CiAgICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoIi1vLXRyYW5zZm9ybSIpIHx8CiAgICAgICAgICAgIHN0eWxlLmdldFByb3BlcnR5VmFsdWUoInRyYW5zZm9ybSIpOwogICAgICAgIHJldHVybiBwYXJzZVRyYW5zZm9ybU1hdHJpeCh0cmFuc2Zvcm0pOwogICAgfQogICAgZXhwb3J0cy5nZXRFbGVtZW50VHJhbnNmb3JtID0gZ2V0RWxlbWVudFRyYW5zZm9ybTsKICAgIHZhciBfTUFUUklYX1JFR0VYID0gL15tYXRyaXhcKChbXildKylcKSQvOwogICAgdmFyIF9TUExJVF9SRUdFWCA9IC9bLCBdKy87CiAgICAvKioKICAgICAqIEF0dGVtcHRzIHRvIHBhcnNlIGEgc3RyaW5nIHN1Y2ggYXMgYCJtYXRyaXgoMSwgMCwgMSwgMSwgMTAwLCAwKSJgIGludG8gYW4KICAgICAqIGFycmF5IHN1Y2ggYXMgYFsxLCAwLCAxLCAxLCAxMDAsIDBdYC4KICAgICAqCiAgICAgKiBJZiB1bmFibGUgdG8gZG8gc28sIGBudWxsYCBpcyByZXR1cm5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VUcmFuc2Zvcm1NYXRyaXgodHJhbnNmb3JtKSB7CiAgICAgICAgaWYgKHRyYW5zZm9ybSA9PSBudWxsIHx8IHRyYW5zZm9ybSA9PT0gIm5vbmUiKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICB2YXIgbWF0cml4U3RyaW5ncyA9IHRyYW5zZm9ybS5tYXRjaChfTUFUUklYX1JFR0VYKTsKICAgICAgICBpZiAobWF0cml4U3RyaW5ncyA9PSBudWxsIHx8IG1hdHJpeFN0cmluZ3MubGVuZ3RoIDwgMikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgdmFyIG1hdHJpeCA9IG1hdHJpeFN0cmluZ3NbMV0uc3BsaXQoX1NQTElUX1JFR0VYKS5tYXAoZnVuY3Rpb24gKHYpIHsgcmV0dXJuIHBhcnNlRmxvYXQodik7IH0pOwogICAgICAgIGlmIChtYXRyaXgubGVuZ3RoICE9IDYpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRyaXg7CiAgICB9CiAgICB9KTsKCiAgICB2YXIgbWF0aFV0aWxzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKICAgIHZhciBuYXRpdmVNYXRoID0gd2luZG93Lk1hdGg7CiAgICB2YXIgX0lERU5USVRZX1RSQU5TRk9STSA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIHggaXMgYmV0d2VlbiBhIGFuZCBiLgogICAgICoKICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4IFRoZSB2YWx1ZSB0byB0ZXN0IGlmIGluIHJhbmdlCiAgICAgKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgYmVnaW5uaW5nIG9mIHRoZSAoaW5jbHVzaXZlKSByYW5nZQogICAgICogQHBhcmFtIHtudW1iZXJ9IGIgVGhlIGVuZGluZyBvZiB0aGUgKGluY2x1c2l2ZSkgcmFuZ2UKICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IFdoZXRoZXIgeCBpcyBpbiBbYSwgYl0KICAgICAqLwogICAgZnVuY3Rpb24gaW5SYW5nZSh4LCBhLCBiKSB7CiAgICAgICAgcmV0dXJuIChuYXRpdmVNYXRoLm1pbihhLCBiKSA8PSB4ICYmIHggPD0gbmF0aXZlTWF0aC5tYXgoYSwgYikpOwogICAgfQogICAgZXhwb3J0cy5pblJhbmdlID0gaW5SYW5nZTsKICAgIC8qKgogICAgICogQ2xhbXBzIHggdG8gdGhlIHJhbmdlIFttaW4sIG1heF0uCiAgICAgKgogICAgICogQHBhcmFtIHtudW1iZXJ9IHggVGhlIHZhbHVlIHRvIGJlIGNsYW1wZWQuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gbWluIFRoZSBtaW5pbXVtIHZhbHVlLgogICAgICogQHBhcmFtIHtudW1iZXJ9IG1heCBUaGUgbWF4aW11bSB2YWx1ZS4KICAgICAqIEByZXR1cm4ge251bWJlcn0gQSBjbGFtcGVkIHZhbHVlIGluIHRoZSByYW5nZSBbbWluLCBtYXhdLgogICAgICovCiAgICBmdW5jdGlvbiBjbGFtcCh4LCBtaW4sIG1heCkgewogICAgICAgIHJldHVybiBuYXRpdmVNYXRoLm1pbihuYXRpdmVNYXRoLm1heChtaW4sIHgpLCBtYXgpOwogICAgfQogICAgZXhwb3J0cy5jbGFtcCA9IGNsYW1wOwogICAgZnVuY3Rpb24gbWF4KGFycmF5LCBmaXJzdEFyZywgc2Vjb25kQXJnKSB7CiAgICAgICAgdmFyIGFjY2Vzc29yID0gdHlwZW9mIChmaXJzdEFyZykgPT09ICJmdW5jdGlvbiIgPyBmaXJzdEFyZyA6IG51bGw7CiAgICAgICAgdmFyIGRlZmF1bHRWYWx1ZSA9IGFjY2Vzc29yID09IG51bGwgPyBmaXJzdEFyZyA6IHNlY29uZEFyZzsKICAgICAgICB2YXIgbWF4VmFsdWUgPSBhY2Nlc3NvciA9PSBudWxsID8gZDMubWF4KGFycmF5KSA6IGQzLm1heChhcnJheSwgYWNjZXNzb3IpOwogICAgICAgIHJldHVybiBtYXhWYWx1ZSAhPT0gdW5kZWZpbmVkID8gbWF4VmFsdWUgOiBkZWZhdWx0VmFsdWU7CiAgICB9CiAgICBleHBvcnRzLm1heCA9IG1heDsKICAgIGZ1bmN0aW9uIG1pbihhcnJheSwgZmlyc3RBcmcsIHNlY29uZEFyZykgewogICAgICAgIHZhciBhY2Nlc3NvciA9IHR5cGVvZiAoZmlyc3RBcmcpID09PSAiZnVuY3Rpb24iID8gZmlyc3RBcmcgOiBudWxsOwogICAgICAgIHZhciBkZWZhdWx0VmFsdWUgPSBhY2Nlc3NvciA9PSBudWxsID8gZmlyc3RBcmcgOiBzZWNvbmRBcmc7CiAgICAgICAgdmFyIG1pblZhbHVlID0gYWNjZXNzb3IgPT0gbnVsbCA/IGQzLm1pbihhcnJheSkgOiBkMy5taW4oYXJyYXksIGFjY2Vzc29yKTsKICAgICAgICByZXR1cm4gbWluVmFsdWUgIT09IHVuZGVmaW5lZCA/IG1pblZhbHVlIDogZGVmYXVsdFZhbHVlOwogICAgfQogICAgZXhwb3J0cy5taW4gPSBtaW47CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSAqKm9ubHkqKiBpZiB4IGlzIE5hTgogICAgICovCiAgICBmdW5jdGlvbiBpc05hTihuKSB7CiAgICAgICAgcmV0dXJuIG4gIT09IG47CiAgICB9CiAgICBleHBvcnRzLmlzTmFOID0gaXNOYU47CiAgICAvKioKICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBudW1iZXIsIHdoaWNoIGlzIG5vdCBOYU4KICAgICAqIE51bWJlcnMgcmVwcmVzZW50ZWQgYXMgc3RyaW5ncyBkbyBub3QgcGFzcyB0aGlzIGZ1bmN0aW9uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzVmFsaWROdW1iZXIobikgewogICAgICAgIHJldHVybiB0eXBlb2YgbiA9PT0gIm51bWJlciIgJiYgbiAtIG4gPCAxOwogICAgfQogICAgZXhwb3J0cy5pc1ZhbGlkTnVtYmVyID0gaXNWYWxpZE51bWJlcjsKICAgIC8qKgogICAgICogR2VuZXJhdGVzIGFuIGFycmF5IG9mIGNvbnNlY3V0aXZlLCBzdHJpY3RseSBpbmNyZWFzaW5nIG51bWJlcnMKICAgICAqIGluIHRoZSByYW5nZSBbc3RhcnQsIHN0b3ApIHNlcGFyZXRlZCBieSBzdGVwCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJhbmdlKHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICAgICAgaWYgKHN0ZXAgPT09IHZvaWQgMCkgeyBzdGVwID0gMTsgfQogICAgICAgIGlmIChzdGVwID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic3RlcCBjYW5ub3QgYmUgMCIpOwogICAgICAgIH0KICAgICAgICB2YXIgbGVuZ3RoID0gbmF0aXZlTWF0aC5tYXgobmF0aXZlTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCksIDApOwogICAgICAgIHZhciByYW5nZSA9IFtdOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgcmFuZ2VbaV0gPSBzdGFydCArIHN0ZXAgKiBpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmFuZ2U7CiAgICB9CiAgICBleHBvcnRzLnJhbmdlID0gcmFuZ2U7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNxdWFyZSBvZiB0aGUgZGlzdGFuY2UgYmV0d2VlbiB0d28gcG9pbnRzCiAgICAgKgogICAgICogQHBhcmFtIHtQb2ludH0gcDEKICAgICAqIEBwYXJhbSB7UG9pbnR9IHAyCiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGRpc3QocDEsIHAyKV4yCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3RhbmNlU3F1YXJlZChwMSwgcDIpIHsKICAgICAgICByZXR1cm4gbmF0aXZlTWF0aC5wb3cocDIueSAtIHAxLnksIDIpICsgbmF0aXZlTWF0aC5wb3cocDIueCAtIHAxLngsIDIpOwogICAgfQogICAgZXhwb3J0cy5kaXN0YW5jZVNxdWFyZWQgPSBkaXN0YW5jZVNxdWFyZWQ7CiAgICBmdW5jdGlvbiBkZWdyZWVzVG9SYWRpYW5zKGRlZ3JlZSkgewogICAgICAgIHJldHVybiBkZWdyZWUgLyAzNjAgKiBuYXRpdmVNYXRoLlBJICogMjsKICAgIH0KICAgIGV4cG9ydHMuZGVncmVlc1RvUmFkaWFucyA9IGRlZ3JlZXNUb1JhZGlhbnM7CiAgICAvKioKICAgICAqIFJldHVybnMgaWYgdGhlIHBvaW50IGlzIHdpdGhpbiB0aGUgYm91bmRzLiBQb2ludHMgYWxvbmcKICAgICAqIHRoZSBib3VuZHMgYXJlIGNvbnNpZGVyZWQgIndpdGhpbiIgYXMgd2VsbC4KICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgUG9pbnQgaW4gY29uc2lkZXJhdGlvbnMuCiAgICAgKiBAcGFyYW0ge0JvdW5kc30gYm91bmRzIEJvdW5kcyB3aXRoaW4gd2hpY2ggdG8gY2hlY2sgZm9yIGluY2x1c2lvbi4KICAgICAqLwogICAgZnVuY3Rpb24gd2l0aGluKHAsIGJvdW5kcykgewogICAgICAgIHJldHVybiBib3VuZHMudG9wTGVmdC54IDw9IHAueAogICAgICAgICAgICAmJiBib3VuZHMuYm90dG9tUmlnaHQueCA+PSBwLngKICAgICAgICAgICAgJiYgYm91bmRzLnRvcExlZnQueSA8PSBwLnkKICAgICAgICAgICAgJiYgYm91bmRzLmJvdHRvbVJpZ2h0LnkgPj0gcC55OwogICAgfQogICAgZXhwb3J0cy53aXRoaW4gPSB3aXRoaW47CiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZmlyc3QgYm91bmRzIGludGVyc2VjdHMgdGhlIHNlY29uZCBib3VuZHMuCiAgICAgKiBQYXNzIHByaW1pdGl2ZSBudW1iZXJzIGRpcmVjdGx5IGZvciBwZXJmb3JtYW5jZS4KICAgICAqCiAgICAgKiBBc3N1bWVzIHdpZHRoIGFuZCBoZWlnaHRzIGFyZSBwb3NpdGl2ZS4KICAgICAqLwogICAgZnVuY3Rpb24gYm91bmRzSW50ZXJzZWN0cyhhWCwgYVksIGFXaWR0aCwgYUhlaWdodCwgYlgsIGJZLCBiV2lkdGgsIGJIZWlnaHQpIHsKICAgICAgICByZXR1cm4gYVggPD0gYlggKyBiV2lkdGggJiYKICAgICAgICAgICAgYlggPD0gYVggKyBhV2lkdGggJiYKICAgICAgICAgICAgYVkgPD0gYlkgKyBiSGVpZ2h0ICYmCiAgICAgICAgICAgIGJZIDw9IGFZICsgYUhlaWdodDsKICAgIH0KICAgIGV4cG9ydHMuYm91bmRzSW50ZXJzZWN0cyA9IGJvdW5kc0ludGVyc2VjdHM7CiAgICAvKioKICAgICAqIFJldHVybnMgYSBgSUNzc1RyYW5zZm9ybU1hdHJpeGAgcmVwcmVzZW50aW5nIHRoZSBjdW11bGF0aXZlIHRyYW5zZm9ybWF0aW9uIG9mCiAgICAgKiB0aGUgZWxlbWVudCBhbmQgYWxsIGl0cyBwYXJlbnRzLiBUaGlzIHRyYW5zZm9ybSBjb252ZXJ0cyBmcm9tIHRvcC1sZXZlbAogICAgICogY2xpZW50WC9jbGllbnRZIGNvb3JkaW5hdGVzIChzdWNoIGFzIGRvY3VtZW50IG1vdXNlIGV2ZW50cykgdG8gaW50ZXJuYWwKICAgICAqIGNvbXBvbmVudCBvZmZzZXRYL29mZnNldFkgY29vcmRpbmF0ZXMuCiAgICAgKgogICAgICogVXNlIGBhcHBseVRyYW5zZm9ybWAgdG8gY29udmVydCBmcm9tIGNsaWVudCBjb29yZGluYXRlcyB0byBlbGVtZW50CiAgICAgKiBjb29yZGluYXRlcywgYWNjb3VudGluZyBmb3IgYWxsIENTUyB0cmFuc2Zvcm1zIGFwcGxpZWQgdG8gdGhhdCBlbGVtZW50LgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGlzIGhhbmRsZXMgY3NzIGB0cmFuc2Zvcm1gIGJ1dCBkb2VzIG5vdCBoYW5kbGUgY3NzCiAgICAgKiBgdHJhbnNmb3JtLW9yaWdpbmAgdmFsdWVzIG90aGVyIHRoYW4gZGVmYXVsdCAoIjUwJSA1MCUiKS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybShlbGVtZW50KSB7CiAgICAgICAgdmFyIGVsZW1zID0gZG9tVXRpbHMuZ2V0SHRtbEVsZW1lbnRBbmNlc3RvcnMoZWxlbWVudCk7CiAgICAgICAgdmFyIHRyYW5zZm9ybSA9IF9JREVOVElUWV9UUkFOU0ZPUk07CiAgICAgICAgdmFyIG9mZnNldFBhcmVudCA9IG51bGw7CiAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBlbGVtc18xID0gZWxlbXM7IF9pIDwgZWxlbXNfMS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgdmFyIGVsZW0gPSBlbGVtc18xW19pXTsKICAgICAgICAgICAgLy8gYXBwbHkgY3NzIHRyYW5zZm9ybSBmcm9tIGFueSBhbmNlc3RvciBlbGVtZW50CiAgICAgICAgICAgIHZhciBlbGVtZW50VHJhbnNmb3JtID0gZG9tVXRpbHMuZ2V0RWxlbWVudFRyYW5zZm9ybShlbGVtKTsKICAgICAgICAgICAgaWYgKGVsZW1lbnRUcmFuc2Zvcm0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIG1pZFggPSBlbGVtLmNsaWVudFdpZHRoIC8gMjsKICAgICAgICAgICAgICAgIHZhciBtaWRZID0gZWxlbS5jbGllbnRIZWlnaHQgLyAyOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gbXVsdGlwbHlUcmFuc2xhdGUodHJhbnNmb3JtLCBbbWlkWCwgbWlkWV0pOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gbXVsdGlwbHlNYXRyaXgodHJhbnNmb3JtLCBpbnZlcnRNYXRyaXgoZWxlbWVudFRyYW5zZm9ybSkpOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gbXVsdGlwbHlUcmFuc2xhdGUodHJhbnNmb3JtLCBbLW1pZFgsIC1taWRZXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gYXBwbHkgc2Nyb2xsIG9mZnNldHMgZnJvbSBhbnkgYW5jZXN0b3IgZWxlbWVudAogICAgICAgICAgICB2YXIgb2Zmc2V0WCA9IGVsZW0uc2Nyb2xsTGVmdDsKICAgICAgICAgICAgdmFyIG9mZnNldFkgPSBlbGVtLnNjcm9sbFRvcDsKICAgICAgICAgICAgLy8gYXBwbHkgY2xpZW50K29mZnNldCBmcm9tIG9ubHkgYWNlbnN0b3IgIm9mZnNldFBhcmVudCIKICAgICAgICAgICAgaWYgKG9mZnNldFBhcmVudCA9PT0gbnVsbCB8fCBlbGVtID09PSBvZmZzZXRQYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9mZnNldFggLT0gZWxlbS5vZmZzZXRMZWZ0ICsgZWxlbS5jbGllbnRMZWZ0OwogICAgICAgICAgICAgICAgb2Zmc2V0WSAtPSBlbGVtLm9mZnNldFRvcCArIGVsZW0uY2xpZW50VG9wOwogICAgICAgICAgICAgICAgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJhbnNmb3JtID0gbXVsdGlwbHlUcmFuc2xhdGUodHJhbnNmb3JtLCBbb2Zmc2V0WCwgb2Zmc2V0WV0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJhbnNmb3JtOwogICAgfQogICAgZXhwb3J0cy5nZXRDdW11bGF0aXZlVHJhbnNmb3JtID0gZ2V0Q3VtdWxhdGl2ZVRyYW5zZm9ybTsKICAgIC8qKgogICAgICogU3RyYWlnaHRmb3J3YXJkIG1hdHJpeCBtdWx0aXBsaWNhdGlvbiBvZiBob21vZ2VuaXplZCBjc3MgdHJhbnNmb3JtIG1hdHJpY2VzLgogICAgICovCiAgICBmdW5jdGlvbiBtdWx0aXBseU1hdHJpeChhLCBiKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgYVswXSAqIGJbMF0gKyBhWzJdICogYlsxXSwKICAgICAgICAgICAgYVsxXSAqIGJbMF0gKyBhWzNdICogYlsxXSwKICAgICAgICAgICAgYVswXSAqIGJbMl0gKyBhWzJdICogYlszXSwKICAgICAgICAgICAgYVsxXSAqIGJbMl0gKyBhWzNdICogYlszXSwKICAgICAgICAgICAgYVswXSAqIGJbNF0gKyBhWzJdICogYls1XSArIGFbNF0sCiAgICAgICAgICAgIGFbMV0gKiBiWzRdICsgYVszXSAqIGJbNV0gKyBhWzVdLAogICAgICAgIF07CiAgICB9CiAgICBleHBvcnRzLm11bHRpcGx5TWF0cml4ID0gbXVsdGlwbHlNYXRyaXg7CiAgICAvKioKICAgICAqIFByZXBlbmRzIHRyYW5zbGF0aW9uIHRvIHRyYW5zZm9ybWF0aW9uIG1hdHJpeC4KICAgICAqCiAgICAgKiBFcXVpdmFsZW50IHRvIGBtdWx0aXBseU1hdHJpeChbMSwgMCwgMCwgMSwgLi4udl0sIGIpYAogICAgICovCiAgICBmdW5jdGlvbiBwcmVtdWx0aXBseVRyYW5zbGF0ZSh2LCBiKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgYlswXSwgYlsxXSwgYlsyXSwgYlszXSwKICAgICAgICAgICAgYls0XSArIHZbMF0sCiAgICAgICAgICAgIGJbNV0gKyB2WzFdLAogICAgICAgIF07CiAgICB9CiAgICBleHBvcnRzLnByZW11bHRpcGx5VHJhbnNsYXRlID0gcHJlbXVsdGlwbHlUcmFuc2xhdGU7CiAgICAvKioKICAgICAqIEFwcGVuZHMgdHJhbnNsYXRpb24gdG8gdHJhbnNmb3JtYXRpb24gbWF0cml4LgogICAgICoKICAgICAqIEVxdWl2YWxlbnQgdG8gYG11bHRpcGx5TWF0cml4KGEsIFsxLCAwLCAwLCAxLCAuLi52XSlgCiAgICAgKi8KICAgIGZ1bmN0aW9uIG11bHRpcGx5VHJhbnNsYXRlKGEsIHYpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgICBhWzBdLCBhWzFdLCBhWzJdLCBhWzNdLAogICAgICAgICAgICBhWzBdICogdlswXSArIGFbMl0gKiB2WzFdICsgYVs0XSwKICAgICAgICAgICAgYVsxXSAqIHZbMF0gKyBhWzNdICogdlsxXSArIGFbNV0sCiAgICAgICAgXTsKICAgIH0KICAgIGV4cG9ydHMubXVsdGlwbHlUcmFuc2xhdGUgPSBtdWx0aXBseVRyYW5zbGF0ZTsKICAgIC8qKgogICAgICogQW5hbHl0aWNhbCBpbnZlcnNlIG9mIGEgYElDc3NUcmFuc2Zvcm1NYXRyaXhgIGFuYWxvZ291cyB0byBhIG5vbi1zaW5ndWxhcgogICAgICogaG9tb2dlbm91cyAzeDMgbWF0cml4LgogICAgICoKICAgICAqIGh0dHA6Ly9tYXRod29ybGQud29sZnJhbS5jb20vTWF0cml4SW52ZXJzZS5odG1sCiAgICAgKiBodHRwczovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8yNjI0NDIyL2VmZmljaWVudC00eDQtbWF0cml4LWludmVyc2UtYWZmaW5lLXRyYW5zZm9ybQogICAgICovCiAgICBmdW5jdGlvbiBpbnZlcnRNYXRyaXgoYSkgewogICAgICAgIHZhciBkZXRlcm1pbmFudCA9IGFbMF0gKiBhWzNdIC0gYVsxXSAqIGFbMl07CiAgICAgICAgaWYgKGRldGVybWluYW50ID09PSAwKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigic2luZ3VsYXIgbWF0cml4Iik7CiAgICAgICAgfQogICAgICAgIHZhciBpbnZlcnNlRGV0ZXJtaW5hbnQgPSAxIC8gZGV0ZXJtaW5hbnQ7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgaW52ZXJzZURldGVybWluYW50ICogYVszXSwKICAgICAgICAgICAgaW52ZXJzZURldGVybWluYW50ICogLWFbMV0sCiAgICAgICAgICAgIGludmVyc2VEZXRlcm1pbmFudCAqIC1hWzJdLAogICAgICAgICAgICBpbnZlcnNlRGV0ZXJtaW5hbnQgKiBhWzBdLAogICAgICAgICAgICBpbnZlcnNlRGV0ZXJtaW5hbnQgKiAoLWFbM10gKiBhWzRdICsgYVsyXSAqIGFbNV0pLAogICAgICAgICAgICBpbnZlcnNlRGV0ZXJtaW5hbnQgKiAoYVsxXSAqIGFbNF0gKyAtYVswXSAqIGFbNV0pLAogICAgICAgIF07CiAgICB9CiAgICBleHBvcnRzLmludmVydE1hdHJpeCA9IGludmVydE1hdHJpeDsKICAgIC8qKgogICAgICogQXBwbGllcyB0aGUgYElDc3NUcmFuc2Zvcm1NYXRyaXhgIHRvIHRoZSBgUG9pbnRgLgogICAgICoKICAgICAqIFJldHVybnMgYSBuZXcgYFBvaW50YC4KICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlUcmFuc2Zvcm0oYSwgcCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHg6IGFbMF0gKiBwLnggKyBhWzJdICogcC55ICsgYVs0XSwKICAgICAgICAgICAgeTogYVsxXSAqIHAueCArIGFbM10gKiBwLnkgKyBhWzVdLAogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLmFwcGx5VHJhbnNmb3JtID0gYXBwbHlUcmFuc2Zvcm07CiAgICB9KTsKCiAgICB2YXIgclRyZWVTcGxpdFN0cmF0ZWdpZXMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIHZhciBTcGxpdFN0cmF0ZWd5VHJpdmlhbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBTcGxpdFN0cmF0ZWd5VHJpdmlhbCgpIHsKICAgICAgICB9CiAgICAgICAgU3BsaXRTdHJhdGVneVRyaXZpYWwucHJvdG90eXBlLnNwbGl0ID0gZnVuY3Rpb24gKGVudHJpZXMsIG5vZGVzKSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBzaW1wbGUgbWlkZGxlIHNwbGl0CiAgICAgICAgICAgIHZhciBtaWQgPSBNYXRoLmNlaWwoZW50cmllcy5sZW5ndGggLyAyKTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBtaWQ7IGkrKykgewogICAgICAgICAgICAgICAgbm9kZXNbMF0uaW5zZXJ0KGVudHJpZXNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBtaWQ7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBub2Rlc1sxXS5pbnNlcnQoZW50cmllc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBTcGxpdFN0cmF0ZWd5VHJpdmlhbDsKICAgIH0oKSk7CiAgICBleHBvcnRzLlNwbGl0U3RyYXRlZ3lUcml2aWFsID0gU3BsaXRTdHJhdGVneVRyaXZpYWw7CiAgICAvLyBMaW5lYXIgc3BsaXQgbWV0aG9kIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vaW1iY21kdGgvUlRyZWUvYmxvYi9tYXN0ZXIvc3JjL3J0cmVlLmpzCiAgICB2YXIgU3BsaXRTdHJhdGVneUxpbmVhciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBTcGxpdFN0cmF0ZWd5TGluZWFyKCkgewogICAgICAgIH0KICAgICAgICBTcGxpdFN0cmF0ZWd5TGluZWFyLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIChlbnRyaWVzLCBub2RlcykgewogICAgICAgICAgICAvLyBjb3B5IGVudHJpZXMgYmVmb3JlIHdlIG11dGF0ZSBpdAogICAgICAgICAgICBlbnRyaWVzID0gZW50cmllcy5zbGljZSgpOwogICAgICAgICAgICB0aGlzLmNob29zZUZpcnN0U3BsaXQoZW50cmllcywgbm9kZXMpOwogICAgICAgICAgICB3aGlsZSAoZW50cmllcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZE5leHQoZW50cmllcywgbm9kZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDaG9vc2UgdGhlIHR3byBmYXJ0aGVzdC1hcGFydCBlbnRyaWVzIHRvIGJlZ2luIHRoZSBzcGxpdC4KICAgICAgICAgKi8KICAgICAgICBTcGxpdFN0cmF0ZWd5TGluZWFyLnByb3RvdHlwZS5jaG9vc2VGaXJzdFNwbGl0ID0gZnVuY3Rpb24gKGVudHJpZXMsIG5vZGVzKSB7CiAgICAgICAgICAgIC8vIERldGVybWluZSBlbnRyeSBpbmRpY2VzIHRoYXQgaGF2ZSBtaW4vbWF4IHgveSBjb29yZGluYXRlcwogICAgICAgICAgICB2YXIgbWluWEggPSAwOwogICAgICAgICAgICB2YXIgbWluWUggPSAwOwogICAgICAgICAgICB2YXIgbWF4WEwgPSBlbnRyaWVzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIHZhciBtYXhZTCA9IGVudHJpZXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBlbnRyaWVzLmxlbmd0aCAtIDE7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpXTsKICAgICAgICAgICAgICAgIGlmIChlbnRyeS5ib3VuZHMueGwgPiBlbnRyaWVzW21heFhMXS5ib3VuZHMueGwpIHsKICAgICAgICAgICAgICAgICAgICBtYXhYTCA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChlbnRyeS5ib3VuZHMueGggPCBlbnRyaWVzW21pblhIXS5ib3VuZHMueGgpIHsKICAgICAgICAgICAgICAgICAgICBtaW5YSCA9IGk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZW50cnkuYm91bmRzLnlsID4gZW50cmllc1ttYXhZTF0uYm91bmRzLnlsKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4WUwgPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW50cnkuYm91bmRzLnloIDwgZW50cmllc1ttaW5ZSF0uYm91bmRzLnloKSB7CiAgICAgICAgICAgICAgICAgICAgbWluWUggPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENob29zZSB0byBzcGxpdCB4IG9yIHkgYmFzZWQgb24gZ3JlYXRlc3QgZGlmZmVyZW5jZQogICAgICAgICAgICB2YXIgZHggPSBNYXRoLmFicyhlbnRyaWVzW21pblhIXS5ib3VuZHMueGggLSBlbnRyaWVzW21heFhMXS5ib3VuZHMueGwpOwogICAgICAgICAgICB2YXIgZHkgPSBNYXRoLmFicyhlbnRyaWVzW21pbllIXS5ib3VuZHMueWggLSBlbnRyaWVzW21heFlMXS5ib3VuZHMueWwpOwogICAgICAgICAgICB2YXIgX2EgPSBkeCA+IGR5ID8gW21pblhILCBtYXhYTF0gOiBbbWluWUgsIG1heFlMXSwgaTAgPSBfYVswXSwgaTEgPSBfYVsxXTsKICAgICAgICAgICAgLy8gaWYgbm8gZGV0ZWN0YWJsZSBzcGxpdCwganVzdCB1c2UgZmlyc3QvbGFzdCBlbnRyaWVzCiAgICAgICAgICAgIGlmIChpMCA9PT0gaTEpIHsKICAgICAgICAgICAgICAgIGkwID0gMDsKICAgICAgICAgICAgICAgIGkxID0gZW50cmllcy5sZW5ndGggLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNwbGl0IG9mZiBub2Rlcy4gV2Ugc3BsaWNlIHdpdGggdGhlIG1heCBpbmRleCBmaXJzdCB0byBtYWtlIHN1cmUgd2UKICAgICAgICAgICAgLy8gZG9uJ3QgY2hhbmdlIHRoZSBpbmRleCBvZiB0aGUgc2Vjb25kIHNwbGljZSBjYWxsCiAgICAgICAgICAgIG5vZGVzWzBdLmluc2VydChlbnRyaWVzLnNwbGljZShNYXRoLm1heChpMCwgaTEpLCAxKVswXSk7CiAgICAgICAgICAgIG5vZGVzWzFdLmluc2VydChlbnRyaWVzLnNwbGljZShNYXRoLm1pbihpMCwgaTEpLCAxKVswXSk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBTcGxpdCB0aGUgbmV4dCBlbnRyeS4gQ2hvb3NlIHRoZSBlbnRyeSB0aGF0IGV4cGFuZHMgaXRzIHBhcmVudCBub2RlJ3MKICAgICAgICAgKiBhcmVhIHRoZSBsZWFzdC4KICAgICAgICAgKi8KICAgICAgICBTcGxpdFN0cmF0ZWd5TGluZWFyLnByb3RvdHlwZS5hZGROZXh0ID0gZnVuY3Rpb24gKGVudHJpZXMsIG5vZGVzKSB7CiAgICAgICAgICAgIHZhciBpbmRleCA9IG51bGw7CiAgICAgICAgICAgIHZhciBtaW5EaWZmID0gbnVsbDsKICAgICAgICAgICAgdmFyIG1pbkRpZmZOb2RlID0gbnVsbDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2ldOwogICAgICAgICAgICAgICAgdmFyIGFyZWFEaWZmMCA9IG5vZGVzWzBdLnVuaW9uQXJlYURpZmZlcmVuY2UoZW50cnkuYm91bmRzKTsKICAgICAgICAgICAgICAgIHZhciBhcmVhRGlmZjEgPSBub2Rlc1sxXS51bmlvbkFyZWFEaWZmZXJlbmNlKGVudHJ5LmJvdW5kcyk7CiAgICAgICAgICAgICAgICBpZiAoYXJlYURpZmYwIDwgbWluRGlmZiB8fCBpbmRleCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgIG1pbkRpZmYgPSBhcmVhRGlmZjA7CiAgICAgICAgICAgICAgICAgICAgbWluRGlmZk5vZGUgPSBub2Rlc1swXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhcmVhRGlmZjEgPCBtaW5EaWZmKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgIG1pbkRpZmYgPSBhcmVhRGlmZjE7CiAgICAgICAgICAgICAgICAgICAgbWluRGlmZk5vZGUgPSBub2Rlc1sxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBtaW5EaWZmTm9kZS5pbnNlcnQoZW50cmllcy5zcGxpY2UoaW5kZXgsIDEpWzBdKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBTcGxpdFN0cmF0ZWd5TGluZWFyOwogICAgfSgpKTsKICAgIGV4cG9ydHMuU3BsaXRTdHJhdGVneUxpbmVhciA9IFNwbGl0U3RyYXRlZ3lMaW5lYXI7CiAgICB9KTsKCiAgICB2YXIgclRyZWUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICAvKioKICAgICAqIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjaGlsZHJlbiBpbiBhbiByLXRyZWUgbm9kZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byBzcGxpdC4KICAgICAqIFRoaXMgbXVzdCBiZSA+PSAyLgogICAgICovCiAgICB2YXIgREVGQVVMVF9NQVhfTk9ERV9DSElMRFJFTiA9IDU7CiAgICAvKioKICAgICAqIFRoZXJlIGFyZSBzZXZlcmFsIHN0cmF0ZWdpZXMgZm9yIHNwbGl0dGluZyBub2RlcyB0aGF0IGNvbnRhaW4gb3ZlcmxhcHBpbmcKICAgICAqIHJlZ2lvbnMuIEJ5IGRlZmF1bHQgd2UgdXNlIGBTcGxpdFN0cmF0ZWd5TGluZWFyYCB3aGljaCBtaW5pbWl6ZXMgdGhlIGNoYW5nZQogICAgICogaW4gbm9kZSBib3VuZGluZyBib3ggYXJlYS4KICAgICAqLwogICAgdmFyIERFRkFVTFRfU1BMSVRfU1RSQVRFR1kgPSBuZXcgclRyZWVTcGxpdFN0cmF0ZWdpZXMuU3BsaXRTdHJhdGVneUxpbmVhcigpOwogICAgLyoqCiAgICAgKiBUaGUgcmV0dXJuIHJlc3VsdCBvZiBwcmVkaWNhdGVzIHVzZWQgd2l0aCBgUlRyZWUucXVlcnlOb2Rlc2AuCiAgICAgKgogICAgICogVGhlIGBQQVNTX0FORF9PVkVSV1JJVEVgIHZhbHVlIHdpbGwgb3ZlcndyaXRlIHByZXZpb3VzIHJlc3VsdHMKICAgICAqIHdoZW4gdGhlIHByZWRpY2F0ZSBmaW5kcyBhIG1vcmUgb3B0aW1hbCByZXN1bHQuCiAgICAgKi8KICAgIHZhciBRdWVyeVByZWRpY2F0ZVJlc3VsdDsKICAgIChmdW5jdGlvbiAoUXVlcnlQcmVkaWNhdGVSZXN1bHQpIHsKICAgICAgICBRdWVyeVByZWRpY2F0ZVJlc3VsdFtRdWVyeVByZWRpY2F0ZVJlc3VsdFsiUEFTUyJdID0gMF0gPSAiUEFTUyI7CiAgICAgICAgUXVlcnlQcmVkaWNhdGVSZXN1bHRbUXVlcnlQcmVkaWNhdGVSZXN1bHRbIkZBSUwiXSA9IDFdID0gIkZBSUwiOwogICAgICAgIFF1ZXJ5UHJlZGljYXRlUmVzdWx0W1F1ZXJ5UHJlZGljYXRlUmVzdWx0WyJQQVNTX0FORF9PVkVSV1JJVEUiXSA9IDJdID0gIlBBU1NfQU5EX09WRVJXUklURSI7CiAgICB9KShRdWVyeVByZWRpY2F0ZVJlc3VsdCA9IGV4cG9ydHMuUXVlcnlQcmVkaWNhdGVSZXN1bHQgfHwgKGV4cG9ydHMuUXVlcnlQcmVkaWNhdGVSZXN1bHQgPSB7fSkpOwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgbm9kZSBwcmVkaWNhdGUgZm9yIHVzZSB3aXRoIGBSVHJlZS5xdWVyeU5vZGVzYAogICAgICoKICAgICAqIEBwYXJhbSBwb2ludCAtIHRoZSBxdWVyeSBwb2ludAogICAgICogQHBhcmFtIG5lYXJGbiAtIGFuIGBJRGlzdGFuY2VGdW5jdGlvbmAgZnJvbSB0aGUgcXVlcnkgcG9pbnQgdG8gdGhlIG5lYXJlc3QKICAgICAqIHBvaW50IG9uIHRoZSBub2RlIGJvdW5kcwogICAgICogQHBhcmFtIGZhckZuIC0gYW4gYElEaXN0YW5jZUZ1bmN0aW9uYCBmcm9tIHRoZSBxdWVyeSBwb2ludCB0byB0aGUgZmFydGhlc3QKICAgICAqIHBvaW50IG9uIHRoZSBub2RlIGJvdW5kcwogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVNaW5pbWl6aW5nTm9kZVByZWRpY2F0ZShwb2ludCwgbmVhckZuLCBmYXJGbikgewogICAgICAgIHZhciBuZWFyZXN0TGVhZkRpc3RhbmNlID0gSW5maW5pdHk7CiAgICAgICAgdmFyIGZhcnRoZXN0QnJhbmNoRGlzdGFuY2UgPSBJbmZpbml0eTsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgdmFyIG5lYXIgPSBuZWFyRm4obm9kZS5ib3VuZHMsIHBvaW50KTsKICAgICAgICAgICAgdmFyIGZhciA9IGZhckZuKG5vZGUuYm91bmRzLCBwb2ludCk7CiAgICAgICAgICAgIC8vIGFzc3VtcHRpb246IG5vZGUudmFsdWUgaW5kaWNhdGVzIHRoYXQgcGFyZW50IGlzIGEgbGVhZgogICAgICAgICAgICBpZiAobm9kZS52YWx1ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBpZiAobmVhciA8IG5lYXJlc3RMZWFmRGlzdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICBuZWFyZXN0TGVhZkRpc3RhbmNlID0gbmVhcjsKICAgICAgICAgICAgICAgICAgICBmYXJ0aGVzdEJyYW5jaERpc3RhbmNlID0gZmFyOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBRdWVyeVByZWRpY2F0ZVJlc3VsdC5QQVNTX0FORF9PVkVSV1JJVEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChuZWFyID09PSBuZWFyZXN0TGVhZkRpc3RhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFF1ZXJ5UHJlZGljYXRlUmVzdWx0LlBBU1M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUXVlcnlQcmVkaWNhdGVSZXN1bHQuRkFJTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChuZWFyID4gZmFydGhlc3RCcmFuY2hEaXN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBRdWVyeVByZWRpY2F0ZVJlc3VsdC5GQUlMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZmFydGhlc3RCcmFuY2hEaXN0YW5jZSA9IE1hdGgubWF4KGZhciwgZmFydGhlc3RCcmFuY2hEaXN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFF1ZXJ5UHJlZGljYXRlUmVzdWx0LlBBU1M7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgZXhwb3J0cy5jcmVhdGVNaW5pbWl6aW5nTm9kZVByZWRpY2F0ZSA9IGNyZWF0ZU1pbmltaXppbmdOb2RlUHJlZGljYXRlOwogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBgQXJyYXkuc29ydGAgZnVuY3Rpb24gZnJvbSBhIHF1ZXJ5IHBvaW50IGFuZCBhIGRpc3RhbmNlIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVOb2RlU29ydChwb2ludCwgZGlzdGFuY2VGbikgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICByZXR1cm4gZGlzdGFuY2VGbihiLmJvdW5kcywgcG9pbnQpIC0gZGlzdGFuY2VGbihhLmJvdW5kcywgcG9pbnQpOwogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLmNyZWF0ZU5vZGVTb3J0ID0gY3JlYXRlTm9kZVNvcnQ7CiAgICAvKioKICAgICAqIFItVHJlZSBpcyBhIG11bHRpZGltZW5zaW9uYWwgc3BhdGlhbCByZWdpb24gdHJlZS4gSXQgc3RvcmVzIGVudHJpZXMgdGhhdCBoYXZlCiAgICAgKiBhcmJpdHJhcmlseSBvdmVybGFwcGluZyBib3VuZGluZyBib3hlcyBhbmQgc3VwcG9ydHMgZWZmaWNpZW50IHBvaW50IGFuZAogICAgICogYm91bmRpbmcgYm94IG92ZXJsYXAgcXVlcmllcy4KICAgICAqCiAgICAgKiBBdmVyYWdlIHNlYXJjaCB0aW1lIGNvbXBsZXhpdHkgaXMgTyhsb2dfTShOKSkgd2hlcmUgTSA9IG1heCBjaGlsZHJlbiBwZXIgbm9kZQogICAgICogYW5kIE4gaXMgbnVtYmVyIG9mIHZhbHVlcyBzdG9yZWQgaW4gdHJlZS4KICAgICAqCiAgICAgKiBJdCBpcyBzaW1pbGFyIGluIHB1cnBvc2UgdG8gYSBxdWFkdHJlZSBleGNlcHQgcXVhZHRyZWVzIGNhbiBvbmx5IHN0b3JlIGEKICAgICAqIHNpbmdsZSBwb2ludCBwZXIgZW50cnkuIEFsc28sIHRoZSBzcGFjZS1wYXJ0aXRpb25pbmcgc3RydWN0dXJlIG9mIHF1YWR0cmVlcwogICAgICogcHJvdmlkZXMgZ3VhcmFudGVlcyB0aGF0IGFueSBnaXZlbiB2YWx1ZSBoYXMgbm8gbmVpZ2hib3JzIGNsb3NlciB0aGFuIGl0cwogICAgICogbm9kZSdzIGJvdW5kcywgd2hlcmVhcyByLXRyZWVzIHByb3ZpZGUgbm8gc3VjaCBndWFyYW50ZWVzLgogICAgICovCiAgICB2YXIgUlRyZWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gUlRyZWUobWF4Tm9kZUNoaWxkcmVuLCBzcGxpdFN0cmF0ZWd5KSB7CiAgICAgICAgICAgIGlmIChtYXhOb2RlQ2hpbGRyZW4gPT09IHZvaWQgMCkgeyBtYXhOb2RlQ2hpbGRyZW4gPSBERUZBVUxUX01BWF9OT0RFX0NISUxEUkVOOyB9CiAgICAgICAgICAgIGlmIChzcGxpdFN0cmF0ZWd5ID09PSB2b2lkIDApIHsgc3BsaXRTdHJhdGVneSA9IERFRkFVTFRfU1BMSVRfU1RSQVRFR1k7IH0KICAgICAgICAgICAgdGhpcy5tYXhOb2RlQ2hpbGRyZW4gPSBtYXhOb2RlQ2hpbGRyZW47CiAgICAgICAgICAgIHRoaXMuc3BsaXRTdHJhdGVneSA9IHNwbGl0U3RyYXRlZ3k7CiAgICAgICAgICAgIHRoaXMucm9vdCA9IG5ldyBSVHJlZU5vZGUodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDA7CiAgICAgICAgfQogICAgICAgIFJUcmVlLnByb3RvdHlwZS5nZXRSb290ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yb290OwogICAgICAgIH07CiAgICAgICAgUlRyZWUucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLnJvb3QgPSBuZXcgUlRyZWVOb2RlKHRydWUpOwogICAgICAgICAgICB0aGlzLnNpemUgPSAwOwogICAgICAgIH07CiAgICAgICAgUlRyZWUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChib3VuZHMsIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5yb290OwogICAgICAgICAgICAvLyBDaG9vc2Ugc3VidHJlZSB1bnRpbCB3ZSBmaW5kIGEgbGVhZgogICAgICAgICAgICB3aGlsZSAoIW5vZGUubGVhZikgewogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUuc3VidHJlZShib3VuZHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEluc2VydCBuZXcgdmFsdWUgbm9kZSBpbnRvIGxlYWYgbm9kZQogICAgICAgICAgICB2YXIgdmFsdWVOb2RlID0gUlRyZWVOb2RlLnZhbHVlTm9kZShib3VuZHMsIHZhbHVlKTsKICAgICAgICAgICAgbm9kZS5pbnNlcnQodmFsdWVOb2RlKTsKICAgICAgICAgICAgdGhpcy5zaXplICs9IDE7CiAgICAgICAgICAgIC8vIFdoaWxlIG5vZGUgb3ZlcmZsb3dzLCBzcGxpdCBhbmQgd2FsayB1cAogICAgICAgICAgICB3aGlsZSAobm9kZS5vdmVyZmxvdyh0aGlzLm1heE5vZGVDaGlsZHJlbikpIHsKICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnNwbGl0KHRoaXMuc3BsaXRTdHJhdGVneSk7CiAgICAgICAgICAgICAgICBpZiAobm9kZS5wYXJlbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucm9vdCA9IG5vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlTm9kZTsKICAgICAgICB9OwogICAgICAgIFJUcmVlLnByb3RvdHlwZS5sb2NhdGUgPSBmdW5jdGlvbiAoeHkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVlcnkoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIGIuY29udGFpbnMoeHkpOyB9KTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYFRgIHZhbHVlcyB0aGF0IGFyZSB0aGUgIm5lYXJlc3QiIHRvIHRoZSBxdWVyeSBwb2ludC4KICAgICAgICAgKgogICAgICAgICAqIE5lYXJuZXNzIGlzIG1lYXN1cmVkIGFzIHRoZSBhYnNvbHV0ZSBkaXN0YW5jZSBmcm9tIHRoZSBxdWVyeSBwb2ludCB0byB0aGUKICAgICAgICAgKiBuZWFyZXN0IGVkZ2Ugb2YgdGhlIG5vZGUgYm91bmRzLiBJZiB0aGUgbm9kZSBib3VuZHMgY29udGFpbnMgdGhlIHF1ZXJ5CiAgICAgICAgICogcG9pbnQsIHRoZSBkaXN0YW5jZSBpcyAwLgogICAgICAgICAqLwogICAgICAgIFJUcmVlLnByb3RvdHlwZS5sb2NhdGVOZWFyZXN0ID0gZnVuY3Rpb24gKHh5KSB7CiAgICAgICAgICAgIHZhciBwcmVkaWNhdGUgPSBjcmVhdGVNaW5pbWl6aW5nTm9kZVByZWRpY2F0ZSh4eSwgUlRyZWVCb3VuZHMuZGlzdGFuY2VTcXVhcmVkVG9OZWFyRWRnZSwgUlRyZWVCb3VuZHMuZGlzdGFuY2VTcXVhcmVkVG9GYXJFZGdlKTsKICAgICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5xdWVyeU5vZGVzKHByZWRpY2F0ZSk7CiAgICAgICAgICAgIHJldHVybiBub2Rlcy5tYXAoZnVuY3Rpb24gKG5vZGUpIHsgcmV0dXJuIG5vZGUudmFsdWU7IH0pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSBvZiBgVGAgdmFsdWVzIHRoYXQgYXJlIHRoZSAibmVhcmVzdCIgdG8gdGhlIHF1ZXJ5IHBvaW50LgogICAgICAgICAqCiAgICAgICAgICogTmVhcm5lc3MgaXMgbWVhc3VyZWQgYXMgdGhlIDEtZGltZW5zaW9uYWwgYWJzb2x1dGUgZGlzdGFuY2UgZnJvbSB0aGUKICAgICAgICAgKiBxdWVyeSdzIHggcG9pbnQgdG8gdGhlIG5lYXJlc3QgZWRnZSBvZiB0aGUgbm9kZSBib3VuZHMuIElmIHRoZSBub2RlCiAgICAgICAgICogYm91bmRzIGNvbnRhaW5zIHRoZSBxdWVyeSBwb2ludCwgdGhlIGRpc3RhbmNlIGlzIDAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcmVzdWx0cyBhcmUgc29ydGVkIGJ5IHktY29vcmRpbmF0ZSBuZWFybmVzcy4KICAgICAgICAgKi8KICAgICAgICBSVHJlZS5wcm90b3R5cGUubG9jYXRlTmVhcmVzdFggPSBmdW5jdGlvbiAoeHkpIHsKICAgICAgICAgICAgdmFyIHByZWRpY2F0ZSA9IGNyZWF0ZU1pbmltaXppbmdOb2RlUHJlZGljYXRlKHh5LCBSVHJlZUJvdW5kcy5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVgsIFJUcmVlQm91bmRzLmFic29sdXRlRGlzdGFuY2VUb0ZhckVkZ2VYKTsKICAgICAgICAgICAgdmFyIG5vZGVzID0gdGhpcy5xdWVyeU5vZGVzKHByZWRpY2F0ZSk7CiAgICAgICAgICAgIG5vZGVzLnNvcnQoY3JlYXRlTm9kZVNvcnQoeHksIFJUcmVlQm91bmRzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWSkpOwogICAgICAgICAgICByZXR1cm4gbm9kZXMubWFwKGZ1bmN0aW9uIChub2RlKSB7IHJldHVybiBub2RlLnZhbHVlOyB9KTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gYXJyYXkgb2YgYFRgIHZhbHVlcyB0aGF0IGFyZSB0aGUgIm5lYXJlc3QiIHRvIHRoZSBxdWVyeSBwb2ludC4KICAgICAgICAgKgogICAgICAgICAqIE5lYXJuZXNzIGlzIG1lYXN1cmVkIGFzIHRoZSAxLWRpbWVuc2lvbmFsIGFic29sdXRlIGRpc3RhbmNlIGZyb20gdGhlCiAgICAgICAgICogcXVlcnkncyB5IHBvaW50IHRvIHRoZSBuZWFyZXN0IGVkZ2Ugb2YgdGhlIG5vZGUgYm91bmRzLiBJZiB0aGUgbm9kZQogICAgICAgICAqIGJvdW5kcyBjb250YWlucyB0aGUgcXVlcnkgcG9pbnQsIHRoZSBkaXN0YW5jZSBpcyAwLgogICAgICAgICAqCiAgICAgICAgICogVGhlIHJlc3VsdHMgYXJlIHNvcnRlZCBieSB4LWNvb3JkaW5hdGUgbmVhcm5lc3MuCiAgICAgICAgICovCiAgICAgICAgUlRyZWUucHJvdG90eXBlLmxvY2F0ZU5lYXJlc3RZID0gZnVuY3Rpb24gKHh5KSB7CiAgICAgICAgICAgIHZhciBwcmVkaWNhdGUgPSBjcmVhdGVNaW5pbWl6aW5nTm9kZVByZWRpY2F0ZSh4eSwgUlRyZWVCb3VuZHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZLCBSVHJlZUJvdW5kcy5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWSk7CiAgICAgICAgICAgIHZhciBub2RlcyA9IHRoaXMucXVlcnlOb2RlcyhwcmVkaWNhdGUpOwogICAgICAgICAgICBub2Rlcy5zb3J0KGNyZWF0ZU5vZGVTb3J0KHh5LCBSVHJlZUJvdW5kcy5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVgpKTsKICAgICAgICAgICAgcmV0dXJuIG5vZGVzLm1hcChmdW5jdGlvbiAobm9kZSkgeyByZXR1cm4gbm9kZS52YWx1ZTsgfSk7CiAgICAgICAgfTsKICAgICAgICBSVHJlZS5wcm90b3R5cGUuaW50ZXJzZWN0ID0gZnVuY3Rpb24gKGJvdW5kcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyeShmdW5jdGlvbiAoYikgeyByZXR1cm4gUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwQm91bmRzKGIsIGJvdW5kcyk7IH0pOwogICAgICAgIH07CiAgICAgICAgUlRyZWUucHJvdG90eXBlLmludGVyc2VjdFggPSBmdW5jdGlvbiAoYm91bmRzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uIChiKSB7IHJldHVybiBSVHJlZUJvdW5kcy5pc0JvdW5kc092ZXJsYXBYKGIsIGJvdW5kcyk7IH0pOwogICAgICAgIH07CiAgICAgICAgUlRyZWUucHJvdG90eXBlLmludGVyc2VjdFkgPSBmdW5jdGlvbiAoYm91bmRzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXJ5KGZ1bmN0aW9uIChiKSB7IHJldHVybiBSVHJlZUJvdW5kcy5pc0JvdW5kc092ZXJsYXBZKGIsIGJvdW5kcyk7IH0pOwogICAgICAgIH07CiAgICAgICAgUlRyZWUucHJvdG90eXBlLnF1ZXJ5ID0gZnVuY3Rpb24gKHByZWRpY2F0ZSkgewogICAgICAgICAgICB2YXIgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBpZiAodGhpcy5yb290LmJvdW5kcyAhPSBudWxsICYmICFwcmVkaWNhdGUodGhpcy5yb290LmJvdW5kcykpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjYW5kaWRhdGVzID0gW3RoaXMucm9vdF07CiAgICAgICAgICAgIHdoaWxlIChjYW5kaWRhdGVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGUgPSBjYW5kaWRhdGVzLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbmRpZGF0ZS5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudHJ5ID0gY2FuZGlkYXRlLmVudHJpZXNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZWRpY2F0ZShlbnRyeS5ib3VuZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGUubGVhZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKGVudHJ5LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXMucHVzaChlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfTsKICAgICAgICBSVHJlZS5wcm90b3R5cGUucXVlcnlOb2RlcyA9IGZ1bmN0aW9uIChwcmVkaWNhdGUpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMucm9vdC5ib3VuZHMgIT0gbnVsbCAmJiBwcmVkaWNhdGUodGhpcy5yb290KSA9PT0gUXVlcnlQcmVkaWNhdGVSZXN1bHQuRkFJTCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZXMgPSBbdGhpcy5yb290XTsKICAgICAgICAgICAgd2hpbGUgKGNhbmRpZGF0ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdmFyIGNhbmRpZGF0ZSA9IGNhbmRpZGF0ZXMuc2hpZnQoKTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgY2FuZGlkYXRlLmVudHJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSBjYW5kaWRhdGUuZW50cmllc1tpXTsKICAgICAgICAgICAgICAgICAgICB2YXIgcCA9IHByZWRpY2F0ZShlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IFF1ZXJ5UHJlZGljYXRlUmVzdWx0LlBBU1NfQU5EX09WRVJXUklURSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChwID09PSBRdWVyeVByZWRpY2F0ZVJlc3VsdC5QQVNTIHx8IHAgPT09IFF1ZXJ5UHJlZGljYXRlUmVzdWx0LlBBU1NfQU5EX09WRVJXUklURSkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FuZGlkYXRlLmxlYWYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5kaWRhdGVzLnB1c2goZW50cnkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFJUcmVlOwogICAgfSgpKTsKICAgIGV4cG9ydHMuUlRyZWUgPSBSVHJlZTsKICAgIHZhciBSVHJlZU5vZGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gUlRyZWVOb2RlKGxlYWYpIHsKICAgICAgICAgICAgdGhpcy5sZWFmID0gbGVhZjsKICAgICAgICAgICAgdGhpcy5ib3VuZHMgPSBudWxsOwogICAgICAgICAgICB0aGlzLmVudHJpZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBudWxsOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgUlRyZWVOb2RlLnZhbHVlTm9kZSA9IGZ1bmN0aW9uIChib3VuZHMsIHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBub2RlID0gbmV3IFJUcmVlTm9kZSh0cnVlKTsKICAgICAgICAgICAgbm9kZS5ib3VuZHMgPSBib3VuZHM7CiAgICAgICAgICAgIG5vZGUudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZmYgdGhpcyBub2RlIGhhcyBtb3JlIGNoaWxkcmVuIHRoYW4gdGhlIGBtYXhOb2RlQ2hpbGRyZW5gCiAgICAgICAgICogcGFyYW1ldGVyLgogICAgICAgICAqLwogICAgICAgIFJUcmVlTm9kZS5wcm90b3R5cGUub3ZlcmZsb3cgPSBmdW5jdGlvbiAobWF4Tm9kZUNoaWxkcmVuKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMubGVuZ3RoID4gbWF4Tm9kZUNoaWxkcmVuOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIGNoaWxkIG5vZGUgYW5kIHVwZGF0ZXMgdGhlIGFuY2VzdHJ5IGJvdW5kcy4KICAgICAgICAgKi8KICAgICAgICBSVHJlZU5vZGUucHJvdG90eXBlLmluc2VydCA9IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHRoaXMuZW50cmllcy5wdXNoKG5vZGUpOwogICAgICAgICAgICBub2RlLnBhcmVudCA9IHRoaXM7CiAgICAgICAgICAgIC8vIFVwZGF0ZSBhbmNlc3RvciBib3VuZHMKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpczsKICAgICAgICAgICAgd2hpbGUgKGFuY2VzdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGFuY2VzdG9yLmJvdW5kcyA9IFJUcmVlQm91bmRzLnVuaW9uQWxsKFthbmNlc3Rvci5ib3VuZHMsIG5vZGUuYm91bmRzXSk7CiAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjaGlsZCBub2RlIGFuZCB1cGRhdGVzIHRoZSBhbmNlc3RyeSBib3VuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgbm9kZSBhcmd1bWVudCBpcyBub3QgYSBjaGlsZCwgZG8gbm90aGluZy4KICAgICAgICAgKi8KICAgICAgICBSVHJlZU5vZGUucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgIHZhciBpID0gdGhpcy5lbnRyaWVzLmluZGV4T2Yobm9kZSk7CiAgICAgICAgICAgIGlmIChpID49IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuZW50cmllcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYW5jZXN0b3IgYm91bmRzCiAgICAgICAgICAgICAgICB2YXIgYW5jZXN0b3IgPSB0aGlzOwogICAgICAgICAgICAgICAgd2hpbGUgKGFuY2VzdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBhbmNlc3Rvci5ib3VuZHMgPSBSVHJlZUJvdW5kcy51bmlvbkFsbChhbmNlc3Rvci5lbnRyaWVzLm1hcChmdW5jdGlvbiAoZSkgeyByZXR1cm4gZS5ib3VuZHM7IH0pKTsKICAgICAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENob29zZXMgYW4gbm9kZSBmcm9tIHRoZW4gZW50cmllcyB0aGF0IG1pbmltaXplcyB0aGUgYXJlYSBkaWZmZXJlbmNlIHRoYXQKICAgICAgICAgKiBhZGRpbmcgdGhlIGJvdW5kcyB0aGUgZWFjaCBlbnRyeSB3b3VsZCBjYXVzZS4KICAgICAgICAgKi8KICAgICAgICBSVHJlZU5vZGUucHJvdG90eXBlLnN1YnRyZWUgPSBmdW5jdGlvbiAoYm91bmRzKSB7CiAgICAgICAgICAgIHZhciBtaW5EaWZmID0gSW5maW5pdHk7CiAgICAgICAgICAgIHZhciBtaW5FbnRyeSA9IG51bGw7CiAgICAgICAgICAgIC8vIGNob29zZSBlbnRyeSBmb3Igd2hpY2ggdGhlIGFkZGl0aW9uIGxlYXN0IGluY3JlYXNlcyB0aGUgZW50cnkncyBhcmVhCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5lbnRyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZW50cnkgPSB0aGlzLmVudHJpZXNbaV07CiAgICAgICAgICAgICAgICB2YXIgZGlmZkFyZWEgPSBlbnRyeS51bmlvbkFyZWFEaWZmZXJlbmNlKGJvdW5kcyk7CiAgICAgICAgICAgICAgICBpZiAoZGlmZkFyZWEgPCBtaW5EaWZmIHx8ICgKICAgICAgICAgICAgICAgIC8vIGJyZWFrIHRpZXMgdG8gbm9kZSB3aXRoIGZld2VzdCBjaGlsZHJlbgogICAgICAgICAgICAgICAgZGlmZkFyZWEgPT09IG1pbkRpZmYgJiYKICAgICAgICAgICAgICAgICAgICBtaW5FbnRyeSAhPSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgZW50cnkuZW50cmllcy5sZW5ndGggPCBtaW5FbnRyeS5lbnRyaWVzLmxlbmd0aCkpIHsKICAgICAgICAgICAgICAgICAgICBtaW5FbnRyeSA9IGVudHJ5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtaW5FbnRyeTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFNwbGl0cyB0aGlzIG5vZGUgYnkgY3JlYXRpbmcgdHdvIG5ldyBub2RlcyBhbmQgZGl2aWRpbmcgdGhlIHRoaXMgbm9kZSdzCiAgICAgICAgICogY2hpbGRyZW4gYmV0d2VlbiB0aGVtLiBUaGlzIG5vZGUgaXMgcmVtb3ZlZCBmcm9tIGl0cyBwYXJlbnQgYW5kIHRoZSB0d28KICAgICAgICAgKiBuZXcgbm9kZXMgYXJlIGFkZGVkLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhpcyBub2RlIGlzIHRoZSByb290LCBhIG5ldyBwYXJlbnQgbm9kZSBpcyBjcmVhdGVkLgogICAgICAgICAqCiAgICAgICAgICogUmV0dXJucyB0aGUgcGFyZW50IG5vZGUuCiAgICAgICAgICovCiAgICAgICAgUlRyZWVOb2RlLnByb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIChzdHJhdGVneSkgewogICAgICAgICAgICAvLyBSZW1vdmUgc2VsZiBmcm9tIHBhcmVudC4KICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50LnJlbW92ZSh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDcmVhdGUgY2hpbGRyZW4gZnJvbSBzcGxpdAogICAgICAgICAgICB2YXIgY2hpbGRyZW4gPSBbCiAgICAgICAgICAgICAgICBuZXcgUlRyZWVOb2RlKHRoaXMubGVhZiksCiAgICAgICAgICAgICAgICBuZXcgUlRyZWVOb2RlKHRoaXMubGVhZiksCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIHN0cmF0ZWd5LnNwbGl0KHRoaXMuZW50cmllcywgY2hpbGRyZW4pOwogICAgICAgICAgICAvLyBBZGQgbmV3IG5vZGVzIHRvIHBhcmVudAogICAgICAgICAgICAvLyBJZiByb290LCBjcmVhdGUgbmV3IG5vbi1sZWFmIG5vZGUgYXMgcGFyZW50LgogICAgICAgICAgICB2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQgIT0gbnVsbCA/IHRoaXMucGFyZW50IDogbmV3IFJUcmVlTm9kZShmYWxzZSk7CiAgICAgICAgICAgIHBhcmVudC5pbnNlcnQoY2hpbGRyZW5bMF0pOwogICAgICAgICAgICBwYXJlbnQuaW5zZXJ0KGNoaWxkcmVuWzFdKTsKICAgICAgICAgICAgLy8gQWx3YXlzIG1ha2UgdGhlIHBhcmVudCBhIG5vbi1sZWFmIGFmdGVyIHNwbGl0CiAgICAgICAgICAgIHBhcmVudC5sZWFmID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBkaWZmZXJlbmNlIGluIGFyZWEgdGhhdCBhZGRpbmcgYW4gZW50cnkgYGJvdW5kc2AgdG8gdGhlIG5vZGUKICAgICAgICAgKiB3b3VsZCBjYXVzZS4KICAgICAgICAgKi8KICAgICAgICBSVHJlZU5vZGUucHJvdG90eXBlLnVuaW9uQXJlYURpZmZlcmVuY2UgPSBmdW5jdGlvbiAoYm91bmRzKSB7CiAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyhSVHJlZUJvdW5kcy51bmlvbih0aGlzLmJvdW5kcywgYm91bmRzKS5hcmVhKCkgLSB0aGlzLmJvdW5kcy5hcmVhKCkpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgZGVwdGggZnJvbSB0aGlzIG5vZGUgdG8gdGhlIGRlZXBlc3QgbGVhZiBkZXNjZW5kYW50LgogICAgICAgICAqLwogICAgICAgIFJUcmVlTm9kZS5wcm90b3R5cGUubWF4RGVwdGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmxlYWYpCiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgcmV0dXJuIDEgKyB0aGlzLmVudHJpZXMubWFwKGZ1bmN0aW9uIChlKSB7IHJldHVybiBlLm1heERlcHRoKCk7IH0pLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gTWF0aC5tYXgoYSwgYik7IH0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFJUcmVlTm9kZTsKICAgIH0oKSk7CiAgICBleHBvcnRzLlJUcmVlTm9kZSA9IFJUcmVlTm9kZTsKICAgIHZhciBSVHJlZUJvdW5kcyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBSVHJlZUJvdW5kcyh4bCwgeWwsIHhoLCB5aCkgewogICAgICAgICAgICB0aGlzLnhsID0geGw7CiAgICAgICAgICAgIHRoaXMueWwgPSB5bDsKICAgICAgICAgICAgdGhpcy54aCA9IHhoOwogICAgICAgICAgICB0aGlzLnloID0geWg7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnhoIC0gdGhpcy54bDsKICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLnloIC0gdGhpcy55bDsKICAgICAgICB9CiAgICAgICAgUlRyZWVCb3VuZHMueHl3aCA9IGZ1bmN0aW9uICh4LCB5LCB3LCBoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUlRyZWVCb3VuZHMoeCwgeSwgeCArIHcsIHkgKyBoKTsKICAgICAgICB9OwogICAgICAgIFJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyA9IGZ1bmN0aW9uIChib3VuZHMpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSVHJlZUJvdW5kcyhib3VuZHMueCwgYm91bmRzLnksIGJvdW5kcy54ICsgYm91bmRzLndpZHRoLCBib3VuZHMueSArIGJvdW5kcy5oZWlnaHQpOwogICAgICAgIH07CiAgICAgICAgUlRyZWVCb3VuZHMuYm91bmRzID0gZnVuY3Rpb24gKGJvdW5kcykgewogICAgICAgICAgICByZXR1cm4gUlRyZWVCb3VuZHMucG9pbnRQYWlyKGJvdW5kcy50b3BMZWZ0LCBib3VuZHMuYm90dG9tUmlnaHQpOwogICAgICAgIH07CiAgICAgICAgUlRyZWVCb3VuZHMucG9pbnRQYWlyID0gZnVuY3Rpb24gKHAwLCBwMSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFJUcmVlQm91bmRzKE1hdGgubWluKHAwLngsIHAxLngpLCBNYXRoLm1pbihwMC55LCBwMS55KSwgTWF0aC5tYXgocDAueCwgcDEueCksIE1hdGgubWF4KHAwLnksIHAxLnkpKTsKICAgICAgICB9OwogICAgICAgIFJUcmVlQm91bmRzLnBvaW50cyA9IGZ1bmN0aW9uIChwb2ludHMpIHsKICAgICAgICAgICAgaWYgKHBvaW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIm5lZWQgYXQgbGVhc3QgMiBwb2ludHMgdG8gY3JlYXRlIGJvdW5kcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB4cyA9IHBvaW50cy5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAueDsgfSk7CiAgICAgICAgICAgIHZhciB5cyA9IHBvaW50cy5tYXAoZnVuY3Rpb24gKHApIHsgcmV0dXJuIHAueTsgfSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgUlRyZWVCb3VuZHMoeHMucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBNYXRoLm1pbihhLCBiKTsgfSksIHlzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gTWF0aC5taW4oYSwgYik7IH0pLCB4cy5yZWR1Y2UoZnVuY3Rpb24gKGEsIGIpIHsgcmV0dXJuIE1hdGgubWF4KGEsIGIpOyB9KSwgeXMucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBNYXRoLm1heChhLCBiKTsgfSkpOwogICAgICAgIH07CiAgICAgICAgUlRyZWVCb3VuZHMudW5pb24gPSBmdW5jdGlvbiAoYjAsIGIxKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUlRyZWVCb3VuZHMoTWF0aC5taW4oYjAueGwsIGIxLnhsKSwgTWF0aC5taW4oYjAueWwsIGIxLnlsKSwgTWF0aC5tYXgoYjAueGgsIGIxLnhoKSwgTWF0aC5tYXgoYjAueWgsIGIxLnloKSk7CiAgICAgICAgfTsKICAgICAgICBSVHJlZUJvdW5kcy51bmlvbkFsbCA9IGZ1bmN0aW9uIChib3VuZHMpIHsKICAgICAgICAgICAgYm91bmRzID0gYm91bmRzLmZpbHRlcihmdW5jdGlvbiAoYikgeyByZXR1cm4gYiAhPSBudWxsOyB9KTsKICAgICAgICAgICAgaWYgKGJvdW5kcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBib3VuZHMucmVkdWNlKGZ1bmN0aW9uIChiMCwgYjEpIHsgcmV0dXJuIFJUcmVlQm91bmRzLnVuaW9uKGIwLCBiMSk7IH0pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGBhYCBvdmVybGFwcyBgYmAgaW4gdGhlIHggYW5kIHkgYXhlcy4KICAgICAgICAgKgogICAgICAgICAqIFRvdWNoaW5nIGNvdW50cyBhcyBvdmVybGFwLgogICAgICAgICAqLwogICAgICAgIFJUcmVlQm91bmRzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBSVHJlZUJvdW5kcy5pc0JvdW5kc092ZXJsYXBYKGEsIGIpICYmIFJUcmVlQm91bmRzLmlzQm91bmRzT3ZlcmxhcFkoYSwgYik7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgYGFgIG92ZXJsYXBzIGBiYCBpbiB0aGUgeCBheGlzIG9ubHkuCiAgICAgICAgICoKICAgICAgICAgKiBUb3VjaGluZyBjb3VudHMgYXMgb3ZlcmxhcC4KICAgICAgICAgKi8KICAgICAgICBSVHJlZUJvdW5kcy5pc0JvdW5kc092ZXJsYXBYID0gZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuICEoYS54aCA8IGIueGwpICYmICEoYS54bCA+IGIueGgpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIGBhYCBvdmVybGFwcyBgYmAgaW4gdGhlIHkgYXhpcyBvbmx5LgogICAgICAgICAqCiAgICAgICAgICogVG91Y2hpbmcgY291bnRzIGFzIG92ZXJsYXAuCiAgICAgICAgICovCiAgICAgICAgUlRyZWVCb3VuZHMuaXNCb3VuZHNPdmVybGFwWSA9IGZ1bmN0aW9uIChhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiAhKGEueWggPCBiLnlsKSAmJiAhKGEueWwgPiBiLnloKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG9ydGhvZ29uYWwgYWJzb2x1dGUgZGlzdGFuY2UgaW4gdGhlIHgtZGltZW5zaW9uIGZyb20gcG9pbnQKICAgICAgICAgKiBgcGAgdG8gdGhlIG5lYXJlc3QgZWRnZSBvZiBgYm91bmRzYC4KICAgICAgICAgKgogICAgICAgICAqIElmIGBwLnhgIGlzIGluc2lkZSB0aGUgYm91bmRzIHJldHVybnMgYDBgLgogICAgICAgICAqLwogICAgICAgIFJUcmVlQm91bmRzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWCA9IGZ1bmN0aW9uIChib3VuZHMsIHApIHsKICAgICAgICAgICAgdmFyIGhhbGYgPSBib3VuZHMud2lkdGggLyAyOwogICAgICAgICAgICB2YXIgbWlkID0gYm91bmRzLnhsICsgaGFsZjsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGguYWJzKHAueCAtIG1pZCkgLSBoYWxmLCAwKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIG9ydGhvZ29uYWwgYWJzb2x1dGUgZGlzdGFuY2UgaW4gdGhlIHktZGltZW5zaW9uIGZyb20gcG9pbnQKICAgICAgICAgKiBgcGAgdG8gdGhlIG5lYXJlc3QgZWRnZSBvZiBgYm91bmRzYC4KICAgICAgICAgKgogICAgICAgICAqIElmIGBwLnlgIGlzIGluc2lkZSB0aGUgYm91bmRzIHJldHVybnMgYDBgLgogICAgICAgICAqLwogICAgICAgIFJUcmVlQm91bmRzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWSA9IGZ1bmN0aW9uIChib3VuZHMsIHApIHsKICAgICAgICAgICAgdmFyIGhhbGYgPSBib3VuZHMuaGVpZ2h0IC8gMjsKICAgICAgICAgICAgdmFyIG1pZCA9IGJvdW5kcy55bCArIGhhbGY7CiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLmFicyhwLnkgLSBtaWQpIC0gaGFsZiwgMCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBvcnRob2dvbmFsIGFic29sdXRlIGRpc3RhbmNlIGluIHRoZSB4LWRpbWVuc2lvbiBmcm9tIHBvaW50CiAgICAgICAgICogYHBgIHRvIHRoZSBmYXJ0aGVzdCBlZGdlIG9mIGBib3VuZHNgLgogICAgICAgICAqCiAgICAgICAgICogSWYgYHAueGAgaXMgaW5zaWRlIHRoZSBib3VuZHMgcmV0dXJucyBgMGAuCiAgICAgICAgICovCiAgICAgICAgUlRyZWVCb3VuZHMuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVggPSBmdW5jdGlvbiAoYm91bmRzLCBwKSB7CiAgICAgICAgICAgIHZhciBuZWFyID0gUlRyZWVCb3VuZHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VYKGJvdW5kcywgcCk7CiAgICAgICAgICAgIHJldHVybiBuZWFyID09PSAwID8gMCA6IG5lYXIgKyBib3VuZHMud2lkdGg7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBvcnRob2dvbmFsIGFic29sdXRlIGRpc3RhbmNlIGluIHRoZSB5LWRpbWVuc2lvbiBmcm9tIHBvaW50CiAgICAgICAgICogYHBgIHRvIHRoZSBmYXJ0aGVzdCBlZGdlIG9mIGBib3VuZHNgLgogICAgICAgICAqCiAgICAgICAgICogSWYgYHAueWAgaXMgaW5zaWRlIHRoZSBib3VuZHMgcmV0dXJucyBgMGAuCiAgICAgICAgICovCiAgICAgICAgUlRyZWVCb3VuZHMuYWJzb2x1dGVEaXN0YW5jZVRvRmFyRWRnZVkgPSBmdW5jdGlvbiAoYm91bmRzLCBwKSB7CiAgICAgICAgICAgIHZhciBuZWFyID0gUlRyZWVCb3VuZHMuYWJzb2x1dGVEaXN0YW5jZVRvTmVhckVkZ2VZKGJvdW5kcywgcCk7CiAgICAgICAgICAgIHJldHVybiBuZWFyID09PSAwID8gMCA6IG5lYXIgKyBib3VuZHMuaGVpZ2h0OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgZGlzdGFuY2Ugc3F1YXJlZCBmcm9tIGBwYCB0byB0aGUgbmVhcmVzdCBlZGdlIG9mIGBib3VuZHNgLiBJZgogICAgICAgICAqIHRoZSBwb2ludCB0b3VjaGVzIG9yIGlzIGluc2lkZSB0aGUgYm91bmRzLCByZXR1cm5zIGAwYDsKICAgICAgICAgKgogICAgICAgICAqIGh0dHBzOi8vZ2FtZWRldi5zdGFja2V4Y2hhbmdlLmNvbS9xdWVzdGlvbnMvNDQ0ODMvaG93LWRvLWktY2FsY3VsYXRlLWRpc3RhbmNlLWJldHdlZW4tYS1wb2ludC1hbmQtYW4tYXhpcy1hbGlnbmVkLXJlY3RhbmdsZQogICAgICAgICAqLwogICAgICAgIFJUcmVlQm91bmRzLmRpc3RhbmNlU3F1YXJlZFRvTmVhckVkZ2UgPSBmdW5jdGlvbiAoYm91bmRzLCBwKSB7CiAgICAgICAgICAgIHZhciBkeCA9IFJUcmVlQm91bmRzLmFic29sdXRlRGlzdGFuY2VUb05lYXJFZGdlWChib3VuZHMsIHApOwogICAgICAgICAgICB2YXIgZHkgPSBSVHJlZUJvdW5kcy5hYnNvbHV0ZURpc3RhbmNlVG9OZWFyRWRnZVkoYm91bmRzLCBwKTsKICAgICAgICAgICAgcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwogICAgICAgIH07CiAgICAgICAgUlRyZWVCb3VuZHMuZGlzdGFuY2VTcXVhcmVkVG9GYXJFZGdlID0gZnVuY3Rpb24gKGJvdW5kcywgcCkgewogICAgICAgICAgICB2YXIgZHggPSBSVHJlZUJvdW5kcy5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWChib3VuZHMsIHApOwogICAgICAgICAgICB2YXIgZHkgPSBSVHJlZUJvdW5kcy5hYnNvbHV0ZURpc3RhbmNlVG9GYXJFZGdlWShib3VuZHMsIHApOwogICAgICAgICAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7CiAgICAgICAgfTsKICAgICAgICBSVHJlZUJvdW5kcy5wcm90b3R5cGUuYXJlYSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuYXJlYUNhY2hlZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFyZWFDYWNoZWQgPSAodGhpcy54aCAtIHRoaXMueGwpICogKHRoaXMueWggLSB0aGlzLnlsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5hcmVhQ2FjaGVkOwogICAgICAgIH07CiAgICAgICAgUlRyZWVCb3VuZHMucHJvdG90eXBlLmNvbnRhaW5zID0gZnVuY3Rpb24gKHh5KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnhsIDw9IHh5LnggJiYgdGhpcy54aCA+PSB4eS54ICYmIHRoaXMueWwgPD0geHkueSAmJiB0aGlzLnloID49IHh5Lnk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gUlRyZWVCb3VuZHM7CiAgICB9KCkpOwogICAgZXhwb3J0cy5SVHJlZUJvdW5kcyA9IFJUcmVlQm91bmRzOwogICAgfSk7CgogICAgdmFyIHN0YWNraW5nVXRpbHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCiAgICAvKioKICAgICAqIE9wdGlvbiB0eXBlIGZvciBzdGFja2luZyBkaXJlY3Rpb24uIEJ5IGRlZmF1bHQsIHN0YWNrZWQgYmFyIGFuZCBhcmVhIGNoYXJ0cwogICAgICogcHV0IHRoZSBmaXJzdCBkYXRhIHNlcmllcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBheGlzICgiYm90dG9tdXAiKSwgYnV0IHRoaXMKICAgICAqIGNhbiBiZSByZXZlcnNlZCB3aXRoIHRoZSAidG9wZG93biIgb3B0aW9uLCB3aGljaCBwcm9kdWNlcyBhIHN0YWNraW5nIG9yZGVyCiAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIG9yZGVyIG9mIHNlcmllcyBpbiB0aGUgbGVnZW5kLgogICAgICovCiAgICBleHBvcnRzLklTdGFja2luZ09yZGVyID0gbWFrZUVudW1fMS5tYWtlRW51bShbInRvcGRvd24iLCAiYm90dG9tdXAiXSk7CiAgICB2YXIgbmF0aXZlTWF0aCA9IHdpbmRvdy5NYXRoOwogICAgLyoqCiAgICAgKiBDb21wdXRlcyB0aGUgU3RhY2tpbmdSZXN1bHQgKHZhbHVlIGFuZCBvZmZzZXQpIGZvciBlYWNoIGRhdGEgcG9pbnQgaW4gZWFjaCBEYXRhc2V0LgogICAgICoKICAgICAqIEBwYXJhbSB7RGF0YXNldFtdfSBkYXRhc2V0cyBUaGUgRGF0YXNldHMgdG8gYmUgc3RhY2tlZCBvbiB0b3Agb2YgZWFjaCBvdGhlciBpbiB0aGUgb3JkZXIgb2Ygc3RhY2tpbmcKICAgICAqIEBwYXJhbSB7QWNjZXNzb3I8YW55Pn0ga2V5QWNjZXNzb3IgQWNjZXNzb3IgZm9yIHRoZSBrZXkgb2YgdGhlIGRhdGEKICAgICAqIEBwYXJhbSB7QWNjZXNzb3I8bnVtYmVyPn0gdmFsdWVBY2Nlc3NvciBBY2Nlc3NvciBmb3IgdGhlIHZhbHVlIG9mIHRoZSBkYXRhCiAgICAgKiBAcGFyYW0ge0lTdGFja2luZ09yZGVyfSBzdGFja2luZ09yZGVyIFRoZSBvcmRlciBvZiBzdGFja2luZyAoZGVmYXVsdCAiYm90dG9tdXAiKQogICAgICogQHJldHVybiB7U3RhY2tpbmdSZXN1bHR9IHZhbHVlIGFuZCBvZmZzZXQgZm9yIGVhY2ggZGF0YXBvaW50IGluIGVhY2ggRGF0YXNldAogICAgICovCiAgICBmdW5jdGlvbiBzdGFjayhkYXRhc2V0cywga2V5QWNjZXNzb3IsIHZhbHVlQWNjZXNzb3IsIHN0YWNraW5nT3JkZXIpIHsKICAgICAgICBpZiAoc3RhY2tpbmdPcmRlciA9PT0gdm9pZCAwKSB7IHN0YWNraW5nT3JkZXIgPSAiYm90dG9tdXAiOyB9CiAgICAgICAgdmFyIHBvc2l0aXZlT2Zmc2V0cyA9IGQzLm1hcCgpOwogICAgICAgIHZhciBuZWdhdGl2ZU9mZnNldHMgPSBkMy5tYXAoKTsKICAgICAgICB2YXIgZGF0YXNldFRvS2V5VG9TdGFja2VkRGF0dW0gPSBuZXcgdXRpbHMkMS5NYXAoKTsKICAgICAgICBpZiAoc3RhY2tpbmdPcmRlciA9PT0gInRvcGRvd24iKSB7CiAgICAgICAgICAgIGRhdGFzZXRzID0gZGF0YXNldHMuc2xpY2UoKTsKICAgICAgICAgICAgZGF0YXNldHMucmV2ZXJzZSgpOwogICAgICAgIH0KICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGRhdGFzZXRzXzEgPSBkYXRhc2V0czsgX2kgPCBkYXRhc2V0c18xLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgZGF0YXNldCA9IGRhdGFzZXRzXzFbX2ldOwogICAgICAgICAgICB2YXIga2V5VG9TdGFja2VkRGF0dW0gPSBuZXcgdXRpbHMkMS5NYXAoKTsKICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEoKTsKICAgICAgICAgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFMZW47IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IGRhdGFbaW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIGFjY2Vzc2VkS2V5ID0ga2V5QWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBleHBvcnRzLm5vcm1hbGl6ZUtleShhY2Nlc3NlZEtleSk7CiAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSArdmFsdWVBY2Nlc3NvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIG9mZnNldCA9IHZvaWQgMDsKICAgICAgICAgICAgICAgIHZhciBvZmZzZXRNYXAgPSAodmFsdWUgPj0gMCkgPyBwb3NpdGl2ZU9mZnNldHMgOiBuZWdhdGl2ZU9mZnNldHM7CiAgICAgICAgICAgICAgICBpZiAob2Zmc2V0TWFwLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0TWFwLmdldChrZXkpOwogICAgICAgICAgICAgICAgICAgIG9mZnNldE1hcC5zZXQoa2V5LCBvZmZzZXQgKyB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgICAgIG9mZnNldE1hcC5zZXQoa2V5LCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBrZXlUb1N0YWNrZWREYXR1bS5zZXQoa2V5LCB7CiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgIGF4aXNWYWx1ZTogYWNjZXNzZWRLZXksCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEYXR1bTogZGF0dW0sCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEYXRhc2V0OiBkYXRhc2V0LAogICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsSW5kZXg6IGluZGV4LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YXNldFRvS2V5VG9TdGFja2VkRGF0dW0uc2V0KGRhdGFzZXQsIGtleVRvU3RhY2tlZERhdHVtKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRhdGFzZXRUb0tleVRvU3RhY2tlZERhdHVtOwogICAgfQogICAgZXhwb3J0cy5zdGFjayA9IHN0YWNrOwogICAgLyoqCiAgICAgKiBDb21wdXRlcyB0aGUgbWF4aW11bSBhbmQgbWluaW11bSBleHRlbnRzIG9mIGVhY2ggc3RhY2sgaW5kaXZpZHVhbGx5LgogICAgICoKICAgICAqIEBwYXJhbSB7R2VuZXJpY1N0YWNraW5nUmVzdWx0fSBzdGFja2luZ1Jlc3VsdCBUaGUgdmFsdWUgYW5kIG9mZnNldCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBkYXRhcG9pbnQgaW4gZWFjaCBkYXRhc2V0CiAgICAgKiBAcmV0dXJuIHsgeyBtYXhpbXVtRXh0ZW50czogVXRpbHMuTWFwPEQsIG51bWJlcj4sIG1pbmltdW1FeHRlbnRzOiBVdGlscy5NYXA8RCwgbnVtYmVyPiB9IH0gVGhlIG1heGltdW0gYW5kIG1pbmltdW0gZXh0ZW50cwogICAgICogb2YgZWFjaCBpbmRpdmlkdWFsIHN0YWNrLgogICAgICovCiAgICBmdW5jdGlvbiBzdGFja2VkRXh0ZW50cyhzdGFja2luZ1Jlc3VsdCkgewogICAgICAgIHZhciBtYXhpbXVtRXh0ZW50cyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgIHZhciBtaW5pbXVtRXh0ZW50cyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgIHN0YWNraW5nUmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHN0YWNrKSB7CiAgICAgICAgICAgIHN0YWNrLmZvckVhY2goZnVuY3Rpb24gKGRhdHVtLCBrZXkpIHsKICAgICAgICAgICAgICAgIC8vIGNvcnJlY3RseSBoYW5kbGUgbmVnYXRpdmUgYmFyIHN0YWNrcwogICAgICAgICAgICAgICAgdmFyIG9mZnNldFZhbHVlID0gZGF0dW0ub2Zmc2V0ICsgZGF0dW0udmFsdWU7CiAgICAgICAgICAgICAgICB2YXIgbWF4aW1hbFZhbHVlID0gdXRpbHMkMS5NYXRoLm1heChbb2Zmc2V0VmFsdWUsIGRhdHVtLm9mZnNldF0sIGRhdHVtLm9mZnNldCk7CiAgICAgICAgICAgICAgICB2YXIgbWluaW1hbFZhbHVlID0gdXRpbHMkMS5NYXRoLm1pbihbb2Zmc2V0VmFsdWUsIGRhdHVtLm9mZnNldF0sIGRhdHVtLm9mZnNldCk7CiAgICAgICAgICAgICAgICB2YXIgYXhpc1ZhbHVlID0gZGF0dW0uYXhpc1ZhbHVlOwogICAgICAgICAgICAgICAgaWYgKCFtYXhpbXVtRXh0ZW50cy5oYXMoa2V5KSkgewogICAgICAgICAgICAgICAgICAgIG1heGltdW1FeHRlbnRzLnNldChrZXksIHsgZXh0ZW50OiBtYXhpbWFsVmFsdWUsIGF4aXNWYWx1ZTogYXhpc1ZhbHVlLCBzdGFja2VkRGF0dW06IGRhdHVtIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobWF4aW11bUV4dGVudHMuZ2V0KGtleSkuZXh0ZW50IDwgbWF4aW1hbFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgbWF4aW11bUV4dGVudHMuc2V0KGtleSwgeyBleHRlbnQ6IG1heGltYWxWYWx1ZSwgYXhpc1ZhbHVlOiBheGlzVmFsdWUsIHN0YWNrZWREYXR1bTogZGF0dW0gfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIW1pbmltdW1FeHRlbnRzLmhhcyhrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgbWluaW11bUV4dGVudHMuc2V0KGtleSwgeyBleHRlbnQ6IG1pbmltYWxWYWx1ZSwgYXhpc1ZhbHVlOiBheGlzVmFsdWUsIHN0YWNrZWREYXR1bTogZGF0dW0gfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChtaW5pbXVtRXh0ZW50cy5nZXQoa2V5KS5leHRlbnQgPiAobWluaW1hbFZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIG1pbmltdW1FeHRlbnRzLnNldChrZXksIHsgZXh0ZW50OiBtaW5pbWFsVmFsdWUsIGF4aXNWYWx1ZTogYXhpc1ZhbHVlLCBzdGFja2VkRGF0dW06IGRhdHVtIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4geyBtYXhpbXVtRXh0ZW50czogbWF4aW11bUV4dGVudHMsIG1pbmltdW1FeHRlbnRzOiBtaW5pbXVtRXh0ZW50cyB9OwogICAgfQogICAgZXhwb3J0cy5zdGFja2VkRXh0ZW50cyA9IHN0YWNrZWRFeHRlbnRzOwogICAgLyoqCiAgICAgKiBDb21wdXRlcyB0aGUgdG90YWwgZXh0ZW50IG92ZXIgYWxsIGRhdGEgcG9pbnRzIGluIGFsbCBEYXRhc2V0cywgdGFraW5nIHN0YWNraW5nIGludG8gY29uc2lkZXJhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge1N0YWNraW5nUmVzdWx0fSBzdGFja2luZ1Jlc3VsdCBUaGUgdmFsdWUgYW5kIG9mZnNldCBpbmZvcm1hdGlvbiBmb3IgZWFjaCBkYXRhcG9pbnQgaW4gZWFjaCBkYXRhc2V0CiAgICAgKiBAcGFyYW0ge0FjY2Vzc29yPGFueT59IGtleUFjY2Vzc29yIEFjY2Vzc29yIGZvciB0aGUga2V5IG9mIHRoZSBkYXRhIGV4aXN0ZW50IGluIHRoZSBzdGFja2luZ1Jlc3VsdAogICAgICogQHBhcmFtIHtBY2Nlc3Nvcjxib29sZWFuPn0gZmlsdGVyIEEgZmlsdGVyIGZvciBkYXRhIHRvIGJlIGNvbnNpZGVyZWQgd2hlbiBjb21wdXRpbmcgdGhlIHRvdGFsIGV4dGVudAogICAgICogQHJldHVybiB7W251bWJlciwgbnVtYmVyXX0gVGhlIHRvdGFsIGV4dGVudAogICAgICovCiAgICBmdW5jdGlvbiBzdGFja2VkRXh0ZW50KHN0YWNraW5nUmVzdWx0LCBrZXlBY2Nlc3NvciwgZmlsdGVyKSB7CiAgICAgICAgdmFyIGV4dGVudHMgPSBbXTsKICAgICAgICBzdGFja2luZ1Jlc3VsdC5mb3JFYWNoKGZ1bmN0aW9uIChzdGFja2VkRGF0dW1NYXAsIGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEoKTsKICAgICAgICAgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFMZW47IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IGRhdGFbaW5kZXhdOwogICAgICAgICAgICAgICAgaWYgKGZpbHRlciAhPSBudWxsICYmICFmaWx0ZXIoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHN0YWNrZWREYXR1bSA9IHN0YWNrZWREYXR1bU1hcC5nZXQoZXhwb3J0cy5ub3JtYWxpemVLZXkoa2V5QWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSkpOwogICAgICAgICAgICAgICAgZXh0ZW50cy5wdXNoKHN0YWNrZWREYXR1bS52YWx1ZSArIHN0YWNrZWREYXR1bS5vZmZzZXQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgdmFyIG1heFN0YWNrRXh0ZW50ID0gdXRpbHMkMS5NYXRoLm1heChleHRlbnRzLCAwKTsKICAgICAgICB2YXIgbWluU3RhY2tFeHRlbnQgPSB1dGlscyQxLk1hdGgubWluKGV4dGVudHMsIDApOwogICAgICAgIHJldHVybiBbbmF0aXZlTWF0aC5taW4obWluU3RhY2tFeHRlbnQsIDApLCBuYXRpdmVNYXRoLm1heCgwLCBtYXhTdGFja0V4dGVudCldOwogICAgfQogICAgZXhwb3J0cy5zdGFja2VkRXh0ZW50ID0gc3RhY2tlZEV4dGVudDsKICAgIC8qKgogICAgICogTm9ybWFsaXplcyBhIGtleSB1c2VkIGZvciBzdGFja2luZwogICAgICoKICAgICAqIEBwYXJhbSB7YW55fSBrZXkgVGhlIGtleSB0byBiZSBub3JtYWxpemVkCiAgICAgKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBzdHJpbmdpZmllZCBrZXkKICAgICAqLwogICAgZXhwb3J0cy5ub3JtYWxpemVLZXkgPSBsb2Rhc2gubWVtb2l6ZShmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgcmV0dXJuIFN0cmluZyhrZXkpOwogICAgfSk7CiAgICB9KTsKCiAgICB2YXIgY29uZmlnJDEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIC8qKgogICAgICogU3BlY2lmaWVzIGlmIFBsb3R0YWJsZSBzaG91bGQgc2hvdyB3YXJuaW5ncy4KICAgICAqLwogICAgZXhwb3J0cy5TSE9XX1dBUk5JTkdTID0gdHJ1ZTsKICAgIC8qKgogICAgICogU3BlY2lmaWVzIGlmIFBsb3R0YWJsZSBzaG91bGQgYWRkIDx0aXRsZT4gZWxlbWVudHMgdG8gdGV4dC4KICAgICAqLwogICAgZXhwb3J0cy5BRERfVElUTEVfRUxFTUVOVFMgPSB0cnVlOwogICAgfSk7CgogICAgdmFyIHdpbmRvd1V0aWxzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgogICAgLyoqCiAgICAgKiBQcmludCBhIHdhcm5pbmcgbWVzc2FnZSB0byB0aGUgY29uc29sZSwgaWYgaXQgaXMgYXZhaWxhYmxlLgogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBUaGUgd2FybmluZ3MgdG8gcHJpbnQKICAgICAqLwogICAgZnVuY3Rpb24gd2Fybih3YXJuaW5nKSB7CiAgICAgICAgaWYgKCFjb25maWckMS5TSE9XX1dBUk5JTkdTKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWNvbnNvbGUKICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7CiAgICB9CiAgICBleHBvcnRzLndhcm4gPSB3YXJuOwogICAgLyoqCiAgICAgKiBJcyBsaWtlIHNldFRpbWVvdXQsIGJ1dCBhY3RpdmF0ZXMgc3luY2hyb25vdXNseSBpZiB0aW1lPTAKICAgICAqIFdlIHNwZWNpYWwgY2FzZSAwIGJlY2F1c2Ugb2YgYW4gb2JzZXJ2ZWQgaXNzdWUgd2hlcmUgY2FsbGluZyBzZXRUaW1lb3V0IGNhdXNlcyB2aXNpYmxlIGZsaWNrZXJpbmcuCiAgICAgKiBXZSBiZWxpZXZlIHRoaXMgaXMgYmVjYXVzZSB3aGVuIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxscyBpbnRvIHRoZSBwYWludCBmdW5jdGlvbiwgYXMgc29vbiBhcyB0aGF0IGZ1bmN0aW9uIGZpbmlzaGVzCiAgICAgKiBldmFsdWF0aW5nLCB0aGUgcmVzdWx0cyBhcmUgcGFpbnRlZCB0byB0aGUgc2NyZWVuLiBBcyBhIHJlc3VsdCwgaWYgd2Ugd2FudCBzb21ldGhpbmcgdG8gb2NjdXIgaW1tZWRpYXRlbHkgYnV0IGNhbGwgc2V0VGltZW91dAogICAgICogd2l0aCB0aW1lPTAsIHRoZW4gaXQgaXMgcHVzaGVkIHRvIHRoZSBjYWxsIHN0YWNrIGFuZCByZW5kZXJlZCBpbiB0aGUgbmV4dCBmcmFtZSwgc28gdGhlIGNvbXBvbmVudCB0aGF0IHdhcyByZW5kZXJlZCB2aWEKICAgICAqIHNldFRpbWVvdXQgYXBwZWFycyBvdXQtb2Ytc3luYyB3aXRoIHRoZSByZXN0IG9mIHRoZSBwbG90LgogICAgICovCiAgICBmdW5jdGlvbiBzZXRUaW1lb3V0KGYsIHRpbWUpIHsKICAgICAgICB2YXIgYXJncyA9IFtdOwogICAgICAgIGZvciAodmFyIF9pID0gMjsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgIGFyZ3NbX2kgLSAyXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIGlmICh0aW1lID09PSAwKSB7CiAgICAgICAgICAgIGYoYXJncyk7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuc2V0VGltZW91dChmLCB0aW1lLCBhcmdzKTsKICAgICAgICB9CiAgICB9CiAgICBleHBvcnRzLnNldFRpbWVvdXQgPSBzZXRUaW1lb3V0OwogICAgLyoqCiAgICAgKiBEZWJvdW5jZXMgdGhlIHN1cHBsaWVkIGNhbGxiYWNrIGFuZCByZXR1cm5zIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2FtZQogICAgICogYXJndW1lbnRzLgogICAgICoKICAgICAqIFRoZSBjYWxsYmFjayBpcyBzY2hlZHVsZSBmb3IgaW52b2NhdGlvbiBldmVyeSB0aW1lIHRoZSByZXR1cm5lZCBmdW5jdGlvbiBpcwogICAgICogaW52b2tlZC4gSWYgdGhlIHJldHVybmVkIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoaW4gdGhlIGRlYm91bmNlIHRpbWUsIHRoZQogICAgICogcHJldmlvdXNseSBzY2hlZHVsZWQgY2FsbCBpcyBjYW5jZWxlZCBhbmQgdGhlIGNhbGxiYWNrIGlzIHNjaGVkdWxlIGFnYWluLgogICAgICoKICAgICAqIElmIGRlYm91bmNlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIHdpdGggdGhlIG1vc3QgcmVjZW50IGFyZ3VtZW50cy4KICAgICAqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gbXNlYyAtIHRoZSBkZWJvdW5jZSB0aW1lIGluIG1pbGxpc2Vjb25kcwogICAgICogQHBhcmFtIHtUfSBjYWxsYmFjayAtIHRoZSBjYWxsYmFjayBpbnZva2VkIGFmdGVyIHRoZSBkZWJvdW5jZSB0aW1lCiAgICAgKiBAcGFyYW0ge2FueX0gY29udGV4dCAgLSB0aGUgYHRoaXNgIGFyZ3VtZW50IHVzZWQgdG8gaW52b2tlIHRoZSBjYWxsYmFjawogICAgICovCiAgICBmdW5jdGlvbiBkZWJvdW5jZShtc2VjLCBjYWxsYmFjaywgY29udGV4dCkgewogICAgICAgIHZhciB0aW1lb3V0VG9rZW4gPSBudWxsOwogICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgdmFyIGRlZmVycmVkQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGNhbGxiYWNrLmFwcGx5KGNvbnRleHQsIGFyZ3MpOwogICAgICAgIH07CiAgICAgICAgLy8gY29lcmNlIHRvIFQKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBhcmdzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRUb2tlbik7CiAgICAgICAgICAgIHRpbWVvdXRUb2tlbiA9IHNldFRpbWVvdXQoZGVmZXJyZWRDYWxsYmFjaywgbXNlYyk7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuZGVib3VuY2UgPSBkZWJvdW5jZTsKICAgIC8qKgogICAgICogU2VuZHMgYSBkZXByZWNhdGlvbiB3YXJuaW5nIHRvIHRoZSBjb25zb2xlLiBUaGUgd2FybmluZyBpbmNsdWRlcyB0aGUgbmFtZSBvZiB0aGUgZGVwcmVjYXRlZCBtZXRob2QsCiAgICAgKiB2ZXJzaW9uIG51bWJlciBvZiB0aGUgZGVwcmVjYXRpb24sIGFuZCBhbiBvcHRpb25hbCBtZXNzYWdlLgogICAgICoKICAgICAqIFRvIGJlIHVzZWQgaW4gdGhlIGZpcnN0IGxpbmUgb2YgYSBkZXByZWNhdGVkIG1ldGhvZC4KICAgICAqCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gY2FsbGluZ01ldGhvZCBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGRlcHJlY2F0ZWQKICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2ZXJzaW9uIFRoZSB2ZXJzaW9uIHdoZW4gdGhlIHRhZ2dlZCBtZXRob2QgYmVjYW1lIG9ic29sZXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZz99IG1lc3NhZ2UgT3B0aW9uYWwgbWVzc2FnZSB0byBiZSBzaG93biB3aXRoIHRoZSB3YXJuaW5nCiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoY2FsbGluZ01ldGhvZCwgdmVyc2lvbiwgbWVzc2FnZSkgewogICAgICAgIGlmIChtZXNzYWdlID09PSB2b2lkIDApIHsgbWVzc2FnZSA9ICIiOyB9CiAgICAgICAgd2FybigiTWV0aG9kICIgKyBjYWxsaW5nTWV0aG9kICsgIiBoYXMgYmVlbiBkZXByZWNhdGVkIGluIHZlcnNpb24gIiArIHZlcnNpb24gKwogICAgICAgICAgICAiLiBQbGVhc2UgcmVmZXIgdG8gdGhlIHJlbGVhc2Ugbm90ZXMuICIgKyBtZXNzYWdlKTsKICAgIH0KICAgIGV4cG9ydHMuZGVwcmVjYXRlZCA9IGRlcHJlY2F0ZWQ7CiAgICB9KTsKCiAgICB2YXIgYnVja2V0ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNy1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICAvKioKICAgICAqIFRoaXMgY2xhc3Mga2VlcHMgdHJhY2sgb2YgYnVja2V0aW5nIHN0YXRlIHdoaWxlIGNvbGxhcHNpbmcgZGVuc2UgbGluZQogICAgICogZ2VvbWV0cnkgaW4gYSBsaW5lIGFuZCBhcmVhIHBsb3RzLgogICAgICovCiAgICB2YXIgQnVja2V0ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIEJ1Y2tldChpbmRleCwgeFZhbHVlLCB5VmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5lbnRyeUluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMuZXhpdEluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMubWluSW5kZXggPSBpbmRleDsKICAgICAgICAgICAgdGhpcy5tYXhJbmRleCA9IGluZGV4OwogICAgICAgICAgICB0aGlzLmJ1Y2tldFZhbHVlID0geFZhbHVlOwogICAgICAgICAgICB0aGlzLm1pblZhbHVlID0geVZhbHVlOwogICAgICAgICAgICB0aGlzLm1heFZhbHVlID0geVZhbHVlOwogICAgICAgIH0KICAgICAgICBCdWNrZXQucHJvdG90eXBlLmlzSW5CdWNrZXQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IHRoaXMuYnVja2V0VmFsdWU7CiAgICAgICAgfTsKICAgICAgICBCdWNrZXQucHJvdG90eXBlLmFkZFRvQnVja2V0ID0gZnVuY3Rpb24gKHZhbHVlLCBpbmRleCkgewogICAgICAgICAgICBpZiAodmFsdWUgPCB0aGlzLm1pblZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1pblZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLm1pbkluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZhbHVlID4gdGhpcy5tYXhWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5tYXhJbmRleCA9IGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZXhpdEluZGV4ID0gaW5kZXg7CiAgICAgICAgfTsKICAgICAgICBCdWNrZXQucHJvdG90eXBlLmdldFVuaXF1ZUluZGljZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBpZHhzID0gW3RoaXMuZW50cnlJbmRleCwgdGhpcy5tYXhJbmRleCwgdGhpcy5taW5JbmRleCwgdGhpcy5leGl0SW5kZXhdOwogICAgICAgICAgICByZXR1cm4gaWR4cy5maWx0ZXIoZnVuY3Rpb24gKGlkeCwgaSkgeyByZXR1cm4gaSA9PSAwIHx8IGlkeCAhPSBpZHhzW2kgLSAxXTsgfSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQnVja2V0OwogICAgfSgpKTsKICAgIGV4cG9ydHMuQnVja2V0ID0gQnVja2V0OwogICAgfSk7CgogICAgdmFyIHNldCRnID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICAvKioKICAgICAqIFNoaW0gZm9yIEVTNiBzZXQuCiAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9TZXQKICAgICAqLwogICAgdmFyIFNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBTZXQoKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93LlNldCA9PT0gImZ1bmN0aW9uIikgewogICAgICAgICAgICAgICAgdGhpcy5fZXM2U2V0ID0gbmV3IHdpbmRvdy5TZXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IDA7CiAgICAgICAgfQogICAgICAgIFNldC5wcm90b3R5cGUuYWRkID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9lczZTZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fZXM2U2V0LmFkZCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLnNpemUgPSB0aGlzLl9lczZTZXQuc2l6ZTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5oYXModmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZXMucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLnNpemUgPSB0aGlzLl92YWx1ZXMubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgU2V0LnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2VzNlNldCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgZGVsZXRlZCA9IHRoaXMuX2VzNlNldC5kZWxldGUodmFsdWUpOwogICAgICAgICAgICAgICAgdGhpcy5zaXplID0gdGhpcy5fZXM2U2V0LnNpemU7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVsZXRlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl92YWx1ZXMuaW5kZXhPZih2YWx1ZSk7CiAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlcy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgdGhpcy5zaXplID0gdGhpcy5fdmFsdWVzLmxlbmd0aDsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIFNldC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9lczZTZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VzNlNldC5oYXModmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZXMuaW5kZXhPZih2YWx1ZSkgIT09IC0xOwogICAgICAgIH07CiAgICAgICAgU2V0LnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrLCB0aGlzQXJnKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmICh0aGlzLl9lczZTZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIGNhbGxiYWNrV3JhcHBlciA9IGZ1bmN0aW9uICh2YWx1ZSwgdmFsdWUyKSB7IHJldHVybiBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCB2YWx1ZTIsIF90aGlzKTsgfTsKICAgICAgICAgICAgICAgIHRoaXMuX2VzNlNldC5mb3JFYWNoKGNhbGxiYWNrV3JhcHBlciwgdGhpc0FyZyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdmFsdWVzLmZvckVhY2goZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5jYWxsKHRoaXNBcmcsIHZhbHVlLCB2YWx1ZSwgX3RoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBTZXQ7CiAgICB9KCkpOwogICAgZXhwb3J0cy5TZXQgPSBTZXQ7CiAgICB9KTsKCiAgICB2YXIgY2FsbGJhY2tTZXQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgLyoqCiAgICAgKiBBIHNldCBvZiBjYWxsYmFja3Mgd2hpY2ggY2FuIGJlIGFsbCBpbnZva2VkIGF0IG9uY2UuCiAgICAgKiBFYWNoIGNhbGxiYWNrIGV4aXN0cyBhdCBtb3N0IG9uY2UgaW4gdGhlIHNldCAoYmFzZWQgb24gcmVmZXJlbmNlIGVxdWFsaXR5KS4KICAgICAqIEFsbCBjYWxsYmFja3Mgc2hvdWxkIGhhdmUgdGhlIHNhbWUgc2lnbmF0dXJlLgogICAgICovCiAgICB2YXIgQ2FsbGJhY2tTZXQgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhDYWxsYmFja1NldCwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBDYWxsYmFja1NldCgpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICBDYWxsYmFja1NldC5wcm90b3R5cGUuY2FsbENhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICAgIGFyZ3NbX2ldID0gYXJndW1lbnRzW19pXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShfdGhpcywgYXJncyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHJldHVybiBDYWxsYmFja1NldDsKICAgIH0oc2V0JGcuU2V0KSk7CiAgICBleHBvcnRzLkNhbGxiYWNrU2V0ID0gQ2FsbGJhY2tTZXQ7CiAgICB9KTsKCiAgICB2YXIgZW50aXR5U3RvcmUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICAvKioKICAgICAqIEltcGxlbWVudGF0aW9uIG9mIHtJRW50aXR5U3RvcmV9IHRoYXQgdXNlcyBhbiBhcnJheSBmb3IgZWFzeSBpdGVyYXRpb24gYXMKICAgICAqIHdlbGwgYXMgYSBxdWFkIHRyZWUgZm9yIGZhc3QgbmVhcmVzdC1wb2ludCBxdWVyaWVzLgogICAgICoKICAgICAqIE5vdGUgdGhhdCBpZiB0aGUgcG9zaXRpb24gb2YgeW91ciBlbnRpdGllcyBjaGFuZ2VzLCB5b3UgTVVTVCByZWJ1aWxkIHRoZQogICAgICogZW50aXR5IHN0b3JlIGZvciB0aGUgYGVudGl0eU5lYXJlc3RgIG1ldGhvZCB0byB3b3JrIHNpbmNlIHRoZSBxdWFkdHJlZSBkb2VzCiAgICAgKiBub3Qga25vdyB0aGF0IGl0cyBub2RlcyBoYXZlIG1vdmVkLgogICAgICovCiAgICB2YXIgRW50aXR5U3RvcmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gRW50aXR5U3RvcmUoKSB7CiAgICAgICAgICAgIHRoaXMuX2VudGl0aWVzID0gW107CiAgICAgICAgICAgIHRoaXMuX3J0cmVlID0gbmV3IHJUcmVlLlJUcmVlKCk7CiAgICAgICAgfQogICAgICAgIEVudGl0eVN0b3JlLnByb3RvdHlwZS5hZGRBbGwgPSBmdW5jdGlvbiAoZW50aXRpZXMsIGVudGl0eUJvdW5kc0ZhY3RvcnksIGJvdW5kcykgewogICAgICAgICAgICB0aGlzLl9lbnRpdGllcyA9IHRoaXMuX2VudGl0aWVzLmNvbmNhdChlbnRpdGllcyk7CiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgb2YgYm91bmRzIGVudGl0aWVzIGlmIGJvdW5kcyBpcyBkZWZpbmVkCiAgICAgICAgICAgIGlmIChib3VuZHMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdmFyIGZpbHRlckJvdW5kcyA9IHJUcmVlLlJUcmVlQm91bmRzLmJvdW5kcyhib3VuZHMpOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBlbnRpdGllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHkgPSBlbnRpdGllc1tpXTsKICAgICAgICAgICAgICAgICAgICB2YXIgZW50aXR5Qm91bmRzID0gclRyZWUuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKGVudGl0eUJvdW5kc0ZhY3RvcnkoZW50aXR5KSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJUcmVlLlJUcmVlQm91bmRzLmlzQm91bmRzT3ZlcmxhcEJvdW5kcyhmaWx0ZXJCb3VuZHMsIGVudGl0eUJvdW5kcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcnRyZWUuaW5zZXJ0KGVudGl0eUJvdW5kcywgZW50aXR5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudGl0aWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2ldOwogICAgICAgICAgICAgICAgICAgIHZhciBlbnRpdHlCb3VuZHMgPSByVHJlZS5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMoZW50aXR5Qm91bmRzRmFjdG9yeShlbnRpdHkpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ydHJlZS5pbnNlcnQoZW50aXR5Qm91bmRzLCBlbnRpdHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBFbnRpdHlTdG9yZS5wcm90b3R5cGUuZW50aXR5TmVhcmVzdCA9IGZ1bmN0aW9uIChxdWVyeVBvaW50KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ydHJlZS5sb2NhdGVOZWFyZXN0KHF1ZXJ5UG9pbnQpLnBvcCgpOwogICAgICAgIH07CiAgICAgICAgRW50aXR5U3RvcmUucHJvdG90eXBlLmVudGl0eU5lYXJlc3RYID0gZnVuY3Rpb24gKHF1ZXJ5UG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3J0cmVlLmxvY2F0ZU5lYXJlc3RYKHF1ZXJ5UG9pbnQpLnBvcCgpOwogICAgICAgIH07CiAgICAgICAgRW50aXR5U3RvcmUucHJvdG90eXBlLmVudGl0eU5lYXJlc3RZID0gZnVuY3Rpb24gKHF1ZXJ5UG9pbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3J0cmVlLmxvY2F0ZU5lYXJlc3RZKHF1ZXJ5UG9pbnQpLnBvcCgpOwogICAgICAgIH07CiAgICAgICAgRW50aXR5U3RvcmUucHJvdG90eXBlLmVudGl0aWVzSW5Cb3VuZHMgPSBmdW5jdGlvbiAoYm91bmRzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3QoclRyZWUuUlRyZWVCb3VuZHMuZW50aXR5Qm91bmRzKGJvdW5kcykpOwogICAgICAgIH07CiAgICAgICAgRW50aXR5U3RvcmUucHJvdG90eXBlLmVudGl0aWVzSW5YQm91bmRzID0gZnVuY3Rpb24gKGJvdW5kcykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcnRyZWUuaW50ZXJzZWN0WChyVHJlZS5SVHJlZUJvdW5kcy5lbnRpdHlCb3VuZHMoYm91bmRzKSk7CiAgICAgICAgfTsKICAgICAgICBFbnRpdHlTdG9yZS5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHMgPSBmdW5jdGlvbiAoYm91bmRzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9ydHJlZS5pbnRlcnNlY3RZKHJUcmVlLlJUcmVlQm91bmRzLmVudGl0eUJvdW5kcyhib3VuZHMpKTsKICAgICAgICB9OwogICAgICAgIEVudGl0eVN0b3JlLnByb3RvdHlwZS5lbnRpdGllcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VudGl0aWVzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEVudGl0eVN0b3JlOwogICAgfSgpKTsKICAgIGV4cG9ydHMuRW50aXR5U3RvcmUgPSBFbnRpdHlTdG9yZTsKICAgIH0pOwoKICAgIHZhciBtYXAkYSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIC8qKgogICAgICogU2hpbSBmb3IgRVM2IG1hcC4KICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL01hcAogICAgICovCiAgICB2YXIgTWFwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIE1hcCgpIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cuTWFwID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lczZNYXAgPSBuZXcgd2luZG93Lk1hcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fa2V5VmFsdWVQYWlycyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIE1hcC5wcm90b3R5cGUuc2V0ID0gZnVuY3Rpb24gKGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKG1hdGhVdGlscy5pc05hTihrZXkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5hTiBtYXkgbm90IGJlIHVzZWQgYXMgYSBrZXkgdG8gdGhlIE1hcCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9lczZNYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fZXM2TWFwLnNldChrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2tleVZhbHVlUGFpcnNbaV0ua2V5ID09PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlWYWx1ZVBhaXJzW2ldLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fa2V5VmFsdWVQYWlycy5wdXNoKHsga2V5OiBrZXksIHZhbHVlOiB2YWx1ZSB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2VzNk1hcCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXM2TWFwLmdldChrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fa2V5VmFsdWVQYWlycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2tleVZhbHVlUGFpcnNbaV0ua2V5ID09PSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5VmFsdWVQYWlyc1tpXS52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH07CiAgICAgICAgTWFwLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9lczZNYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VzNk1hcC5oYXMoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9rZXlWYWx1ZVBhaXJzW2ldLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgICAgTWFwLnByb3RvdHlwZS5mb3JFYWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrRm4sIHRoaXNBcmcpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuX2VzNk1hcCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgY2FsbGJhY2tXcmFwcGVyID0gZnVuY3Rpb24gKHZhbHVlLCBrZXkpIHsgcmV0dXJuIGNhbGxiYWNrRm4uY2FsbCh0aGlzQXJnLCB2YWx1ZSwga2V5LCBfdGhpcyk7IH07CiAgICAgICAgICAgICAgICB0aGlzLl9lczZNYXAuZm9yRWFjaChjYWxsYmFja1dyYXBwZXIsIHRoaXNBcmcpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlUGFpcnMuZm9yRWFjaChmdW5jdGlvbiAoa2V5VmFsdWVQYWlyKSB7CiAgICAgICAgICAgICAgICBjYWxsYmFja0ZuLmNhbGwodGhpc0FyZywga2V5VmFsdWVQYWlyLnZhbHVlLCBrZXlWYWx1ZVBhaXIua2V5LCBfdGhpcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgTWFwLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9lczZNYXAgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VzNk1hcC5kZWxldGUoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX2tleVZhbHVlUGFpcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9rZXlWYWx1ZVBhaXJzW2ldLmtleSA9PT0ga2V5KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5VmFsdWVQYWlycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIE1hcDsKICAgIH0oKSk7CiAgICBleHBvcnRzLk1hcCA9IE1hcDsKICAgIH0pOwoKICAgIHZhciBvYmplY3RVdGlscyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgLyoqCiAgICAgKiBQb2x5ZmlsbCBmb3IgT2JqZWN0LmFzc2lnbgogICAgICovCiAgICBmdW5jdGlvbiBhc3NpZ24oKSB7CiAgICAgICAgdmFyIG9ianMgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICBvYmpzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgfQogICAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgICBmb3IgKHZhciBfYSA9IDAsIG9ianNfMSA9IG9ianM7IF9hIDwgb2Jqc18xLmxlbmd0aDsgX2ErKykgewogICAgICAgICAgICB2YXIgb2JqID0gb2Jqc18xW19hXTsKICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhvYmopOwogICAgICAgICAgICBmb3IgKHZhciBfYiA9IDAsIGtleXNfMSA9IGtleXM7IF9iIDwga2V5c18xLmxlbmd0aDsgX2IrKykgewogICAgICAgICAgICAgICAgdmFyIGtleSA9IGtleXNfMVtfYl07CiAgICAgICAgICAgICAgICByZXN1bHRba2V5XSA9IG9ialtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBleHBvcnRzLmFzc2lnbiA9IGFzc2lnbjsKICAgIH0pOwoKICAgIHZhciB0cmFuc2Zvcm1Bd2FyZVRyYW5zbGF0b3IgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB2YXIgX1RSQU5TTEFUT1JfS0VZID0gIl9fUGxvdHRhYmxlX0NsaWVudFRyYW5zbGF0b3IiOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgc2luZ2xldG9uLWl6ZWQgYFRyYW5zbGF0b3JgIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29tcG9uZW50LgogICAgICovCiAgICBmdW5jdGlvbiBnZXRUcmFuc2xhdG9yKGNvbXBvbmVudCkgewogICAgICAgIHZhciByb290RWxlbWVudCA9IGNvbXBvbmVudC5yb290KCkucm9vdEVsZW1lbnQoKS5ub2RlKCk7CiAgICAgICAgdmFyIHRyYW5zbGF0b3IgPSByb290RWxlbWVudFtfVFJBTlNMQVRPUl9LRVldOwogICAgICAgIGlmICh0cmFuc2xhdG9yID09IG51bGwpIHsKICAgICAgICAgICAgdHJhbnNsYXRvciA9IG5ldyBUcmFuc2xhdG9yKHJvb3RFbGVtZW50KTsKICAgICAgICAgICAgcm9vdEVsZW1lbnRbX1RSQU5TTEFUT1JfS0VZXSA9IHRyYW5zbGF0b3I7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cmFuc2xhdG9yOwogICAgfQogICAgZXhwb3J0cy5nZXRUcmFuc2xhdG9yID0gZ2V0VHJhbnNsYXRvcjsKICAgIC8qKgogICAgICogVGhlIHRyYW5zbGF0b3IgaW1wbGVtZW50cyBDU1MgdHJhbnNmb3JtIGF3YXJlIHBvc2l0aW9uIG1lYXN1cmluZy4gV2UgbWFudWFsbHkKICAgICAqIGNvbXB1dGUgYSBjdW11bGF0aXZlIENTUzMgb2YgdGhlIHJvb3QgZWxlbWVudCBhbmNlc3RvcnMgdXAgdG8gYDxib2R5PmAuCiAgICAgKi8KICAgIHZhciBUcmFuc2xhdG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIFRyYW5zbGF0b3IoX3Jvb3RFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50ID0gX3Jvb3RFbGVtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBgZG9jdW1lbnRgIGNsaWVudCBjb29yZGluYXRlcywgY29tcHV0ZXMgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZQogICAgICAgICAqIGBDb21wb25lbnRgJ3Mgcm9vdCBlbGVtZW50LCB0YWtpbmcgaW50byBhY2NvdW50IHRoZSBjdW11bGF0aXZlIENTUzMKICAgICAgICAgKiB0cmFuc2Zvcm1zIG9mIHRoZSByb290IGVsZW1lbnQgYW5jZXN0b3JzIHVwIHRvIGA8Ym9keT5gLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyB0cmlnZ2VycyBhIGxheW91dCBidXQgZG9lc24ndCBmdXJ0aGVyIG1vZGlmeSB0aGUgRE9NLCBzbyBjYXVzZXMgYQogICAgICAgICAqIG1heGltdW0gb2Ygb25lIGxheW91dCBwZXIgZnJhbWUuCiAgICAgICAgICoKICAgICAgICAgKiBEb2VzIG5vdCBzdXBwb3J0IGB0cmFuc2Zvcm0tb3JpZ2luYCBDU1MgcHJvcGVydHkgb3RoZXIgdGhhbiB0aGUgZGVmYXVsdC4KICAgICAgICAgKi8KICAgICAgICBUcmFuc2xhdG9yLnByb3RvdHlwZS5jb21wdXRlUG9zaXRpb24gPSBmdW5jdGlvbiAoY2xpZW50WCwgY2xpZW50WSkgewogICAgICAgICAgICB2YXIgY2xpZW50UG9zaXRpb24gPSB7CiAgICAgICAgICAgICAgICB4OiBjbGllbnRYLAogICAgICAgICAgICAgICAgeTogY2xpZW50WSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHRyYW5zZm9ybSA9IHV0aWxzJDEuTWF0aC5nZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTsKICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50UG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRyYW5zZm9ybWVkID0gdXRpbHMkMS5NYXRoLmFwcGx5VHJhbnNmb3JtKHRyYW5zZm9ybSwgY2xpZW50UG9zaXRpb24pOwogICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBJcyB0aGUgZXZlbnQncyB0YXJnZXQgcGFydCBvZiB0aGUgZ2l2ZW4gY29tcG9uZW50J3MgRE9NIHRyZWU/CiAgICAgICAgICovCiAgICAgICAgVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgZSkgewogICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5ET00uY29udGFpbnMoY29tcG9uZW50LnJvb3QoKS5yb290RWxlbWVudCgpLm5vZGUoKSwgZS50YXJnZXQpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFRyYW5zbGF0b3I7CiAgICB9KCkpOwogICAgZXhwb3J0cy5UcmFuc2xhdG9yID0gVHJhbnNsYXRvcjsKICAgIH0pOwoKICAgIHZhciB1dGlscyQxID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKICAgIGV4cG9ydHMuQXJyYXkgPSBhcnJheVV0aWxzOwoKICAgIGV4cG9ydHMuQ29sb3IgPSBjb2xvclV0aWxzOwoKICAgIGV4cG9ydHMuRE9NID0gZG9tVXRpbHM7CgogICAgZXhwb3J0cy5NYXRoID0gbWF0aFV0aWxzOwoKICAgIGV4cG9ydHMuUlRyZWUgPSByVHJlZTsKCiAgICBleHBvcnRzLlN0YWNraW5nID0gc3RhY2tpbmdVdGlsczsKCiAgICBleHBvcnRzLldpbmRvdyA9IHdpbmRvd1V0aWxzOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihidWNrZXQsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihjYWxsYmFja1NldCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGNvZXJjZUQzLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZW50aXR5U3RvcmUsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihtYXAkYSwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKG9iamVjdFV0aWxzLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoc2V0JGcsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3Rhcih0cmFuc2Zvcm1Bd2FyZVRyYW5zbGF0b3IsIGV4cG9ydHMpOwogICAgfSk7CgogICAgdmFyIHJlbmRlclBvbGljeSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCiAgICAvKioKICAgICAqIFJlbmRlcnMgQ29tcG9uZW50cyBpbW1lZGlhdGVseSBhZnRlciB0aGV5IGFyZSBlbnF1ZXVlZC4KICAgICAqIFVzZWZ1bCBmb3IgZGVidWdnaW5nLCBob3JyaWJsZSBmb3IgcGVyZm9ybWFuY2UuCiAgICAgKi8KICAgIHZhciBJbW1lZGlhdGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gSW1tZWRpYXRlKCkgewogICAgICAgIH0KICAgICAgICBJbW1lZGlhdGUucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmVuZGVyQ29udHJvbGxlci5mbHVzaCgpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEltbWVkaWF0ZTsKICAgIH0oKSk7CiAgICBleHBvcnRzLkltbWVkaWF0ZSA9IEltbWVkaWF0ZTsKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgd2F5IHRvIHJlbmRlciwgd2hpY2ggb25seSB0cmllcyB0byByZW5kZXIgZXZlcnkgZnJhbWUKICAgICAqICh1c3VhbGx5LCAxLzYwdGggb2YgYSBzZWNvbmQpLgogICAgICovCiAgICB2YXIgQW5pbWF0aW9uRnJhbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gQW5pbWF0aW9uRnJhbWUoKSB7CiAgICAgICAgfQogICAgICAgIEFuaW1hdGlvbkZyYW1lLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHV0aWxzJDEuRE9NLnJlcXVlc3RBbmltYXRpb25GcmFtZVBvbHlmaWxsKHJlbmRlckNvbnRyb2xsZXIuZmx1c2gpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEFuaW1hdGlvbkZyYW1lOwogICAgfSgpKTsKICAgIGV4cG9ydHMuQW5pbWF0aW9uRnJhbWUgPSBBbmltYXRpb25GcmFtZTsKICAgIC8qKgogICAgICogUmVuZGVycyB3aXRoIGBzZXRUaW1lb3V0KClgLgogICAgICogR2VuZXJhbGx5IGFuIGluZmVyaW9yIHdheSB0byByZW5kZXIgY29tcGFyZWQgdG8gYHJlcXVlc3RBbmltYXRpb25GcmFtZWAsCiAgICAgKiBidXQgdXNlZnVsIGZvciBicm93c2VycyB0aGF0IGRvbid0IHN1cHBvb3J0IGByZXF1ZXN0QW5pbWF0aW9uRnJhbWVgLgogICAgICovCiAgICB2YXIgVGltZW91dCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBUaW1lb3V0KCkgewogICAgICAgICAgICB0aGlzLl90aW1lb3V0TXNlYyA9IHV0aWxzJDEuRE9NLlNDUkVFTl9SRUZSRVNIX1JBVEVfTUlMTElTRUNPTkRTOwogICAgICAgIH0KICAgICAgICBUaW1lb3V0LnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHNldFRpbWVvdXQocmVuZGVyQ29udHJvbGxlci5mbHVzaCwgdGhpcy5fdGltZW91dE1zZWMpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFRpbWVvdXQ7CiAgICB9KCkpOwogICAgZXhwb3J0cy5UaW1lb3V0ID0gVGltZW91dDsKICAgIH0pOwoKICAgIHZhciByZW5kZXJDb250cm9sbGVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCiAgICAvKioKICAgICAqIFRoZSBSZW5kZXJDb250cm9sbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnF1ZXVlaW5nIGFuZCBzeW5jaHJvbml6aW5nCiAgICAgKiBsYXlvdXQgYW5kIHJlbmRlciBjYWxscyBmb3IgQ29tcG9uZW50cy4KICAgICAqCiAgICAgKiBMYXlvdXQgYW5kIHJlbmRlciBjYWxscyBvY2N1ciBpbnNpZGUgYW4gYW5pbWF0aW9uIGNhbGxiYWNrCiAgICAgKiAod2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSBpZiBhdmFpbGFibGUpLgogICAgICoKICAgICAqIFJlbmRlckNvbnRyb2xsZXIuZmx1c2goKSBpbW1lZGlhdGVseSBsYXlzIG91dCBhbmQgcmVuZGVycyBhbGwgQ29tcG9uZW50cyBjdXJyZW50bHkgZW5xdWV1ZWQuCiAgICAgKgogICAgICogVG8gYWx3YXlzIGhhdmUgaW1tZWRpYXRlIHJlbmRlcmluZyAodXNlZnVsIGZvciBkZWJ1Z2dpbmcpLCBjYWxsCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBQbG90dGFibGUuUmVuZGVyQ29udHJvbGxlci5zZXRSZW5kZXJQb2xpY3koCiAgICAgKiAgIG5ldyBQbG90dGFibGUuUmVuZGVyUG9saWNpZXMuSW1tZWRpYXRlKCkKICAgICAqICk7CiAgICAgKiBgYGAKICAgICAqLwogICAgdmFyIF9jb21wb25lbnRzTmVlZGluZ1JlbmRlciA9IG5ldyB1dGlscyQxLlNldCgpOwogICAgdmFyIF9jb21wb25lbnRzTmVlZGluZ0NvbXB1dGVMYXlvdXQgPSBuZXcgdXRpbHMkMS5TZXQoKTsKICAgIHZhciBfYW5pbWF0aW9uUmVxdWVzdGVkID0gZmFsc2U7CiAgICB2YXIgX2lzQ3VycmVudGx5Rmx1c2hpbmcgPSBmYWxzZTsKICAgIGV4cG9ydHMuUG9saWN5ID0gbWFrZUVudW1fMS5tYWtlRW51bShbImltbWVkaWF0ZSIsICJhbmltYXRpb25GcmFtZSIsICJ0aW1lb3V0Il0pOwogICAgdmFyIF9yZW5kZXJQb2xpY3kgPSBuZXcgcmVuZGVyUG9saWN5LkFuaW1hdGlvbkZyYW1lKCk7CiAgICBmdW5jdGlvbiByZW5kZXJQb2xpY3kkMShyZW5kZXJQb2xpY3kkMSkgewogICAgICAgIGlmIChyZW5kZXJQb2xpY3kkMSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBfcmVuZGVyUG9saWN5OwogICAgICAgIH0KICAgICAgICBzd2l0Y2ggKHJlbmRlclBvbGljeSQxKSB7CiAgICAgICAgICAgIGNhc2UgZXhwb3J0cy5Qb2xpY3kuaW1tZWRpYXRlOgogICAgICAgICAgICAgICAgX3JlbmRlclBvbGljeSA9IG5ldyByZW5kZXJQb2xpY3kuSW1tZWRpYXRlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBleHBvcnRzLlBvbGljeS5hbmltYXRpb25GcmFtZToKICAgICAgICAgICAgICAgIF9yZW5kZXJQb2xpY3kgPSBuZXcgcmVuZGVyUG9saWN5LkFuaW1hdGlvbkZyYW1lKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSBleHBvcnRzLlBvbGljeS50aW1lb3V0OgogICAgICAgICAgICAgICAgX3JlbmRlclBvbGljeSA9IG5ldyByZW5kZXJQb2xpY3kuVGltZW91dCgpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB1dGlscyQxLldpbmRvdy53YXJuKCJVbnJlY29nbml6ZWQgcmVuZGVyUG9saWN5OiAiICsgcmVuZGVyUG9saWN5JDEpOwogICAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMucmVuZGVyUG9saWN5ID0gcmVuZGVyUG9saWN5JDE7CiAgICAvKioKICAgICAqIEVucXVldWVzIHRoZSBDb21wb25lbnQgZm9yIHJlbmRlcmluZy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyVG9SZW5kZXIoY29tcG9uZW50KSB7CiAgICAgICAgaWYgKF9pc0N1cnJlbnRseUZsdXNoaW5nKSB7CiAgICAgICAgICAgIHV0aWxzJDEuV2luZG93Lndhcm4oIlJlZ2lzdGVyZWQgdG8gcmVuZGVyIHdoaWxlIG90aGVyIGNvbXBvbmVudHMgYXJlIGZsdXNoaW5nOiByZXF1ZXN0IG1heSBiZSBpZ25vcmVkIik7CiAgICAgICAgfQogICAgICAgIF9jb21wb25lbnRzTmVlZGluZ1JlbmRlci5hZGQoY29tcG9uZW50KTsKICAgICAgICByZXF1ZXN0UmVuZGVyKCk7CiAgICB9CiAgICBleHBvcnRzLnJlZ2lzdGVyVG9SZW5kZXIgPSByZWdpc3RlclRvUmVuZGVyOwogICAgLyoqCiAgICAgKiBFbnF1ZXVlcyB0aGUgQ29tcG9uZW50IGZvciBsYXlvdXQgYW5kIHJlbmRlcmluZy4KICAgICAqCiAgICAgKiBAcGFyYW0ge0NvbXBvbmVudH0gY29tcG9uZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKGNvbXBvbmVudCkgewogICAgICAgIF9jb21wb25lbnRzTmVlZGluZ0NvbXB1dGVMYXlvdXQuYWRkKGNvbXBvbmVudCk7CiAgICAgICAgX2NvbXBvbmVudHNOZWVkaW5nUmVuZGVyLmFkZChjb21wb25lbnQpOwogICAgICAgIHJlcXVlc3RSZW5kZXIoKTsKICAgIH0KICAgIGV4cG9ydHMucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIgPSByZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcjsKICAgIC8qKgogICAgICogRW5xdWV1ZXMgdGhlIENvbXBvbmVudCBmb3IgbGF5b3V0IGFuZCByZW5kZXJpbmcuCiAgICAgKgogICAgICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudAogICAgICogQGRlcHJlY2F0ZWQgVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVuYW1lZCB0byBgUmVuZGVyQ29udHJvbGxlci5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcigpYC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXQoY29tcG9uZW50KSB7CiAgICAgICAgcmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXRBbmRSZW5kZXIoY29tcG9uZW50KTsKICAgIH0KICAgIGV4cG9ydHMucmVnaXN0ZXJUb0NvbXB1dGVMYXlvdXQgPSByZWdpc3RlclRvQ29tcHV0ZUxheW91dDsKICAgIGZ1bmN0aW9uIHJlcXVlc3RSZW5kZXIoKSB7CiAgICAgICAgLy8gT25seSBydW4gb3IgZW5xdWV1ZSBmbHVzaCBvbiBmaXJzdCByZXF1ZXN0LgogICAgICAgIGlmICghX2FuaW1hdGlvblJlcXVlc3RlZCkgewogICAgICAgICAgICBfYW5pbWF0aW9uUmVxdWVzdGVkID0gdHJ1ZTsKICAgICAgICAgICAgX3JlbmRlclBvbGljeS5yZW5kZXIoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbmRlcnMgYWxsIENvbXBvbmVudHMgd2FpdGluZyB0byBiZSByZW5kZXJlZCBpbW1lZGlhdGVseQogICAgICogaW5zdGVhZCBvZiB3YWl0aW5nIHVudGlsIHRoZSBuZXh0IGZyYW1lLiBGbHVzaCBpcyBpZGVtcG90ZW50IChnaXZlbiB0aGVyZSBhcmUgbm8gaW50ZXJtZWRpYXRlIHJlZ2lzdHJhdGlvbnMpLgogICAgICoKICAgICAqIFVzZWZ1bCB0byBjYWxsIHdoZW4gZGVidWdnaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBmbHVzaCgpIHsKICAgICAgICBpZiAoX2FuaW1hdGlvblJlcXVlc3RlZCkgewogICAgICAgICAgICAvLyBMYXlvdXQKICAgICAgICAgICAgX2NvbXBvbmVudHNOZWVkaW5nQ29tcHV0ZUxheW91dC5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQpIHsgcmV0dXJuIGNvbXBvbmVudC5jb21wdXRlTGF5b3V0KCk7IH0pOwogICAgICAgICAgICAvLyBUb3AgbGV2ZWwgcmVuZGVyOyBDb250YWluZXJzIHdpbGwgcHV0IHRoZWlyIGNoaWxkcmVuIGluIHRoZSB0b1JlbmRlciBxdWV1ZQogICAgICAgICAgICBfY29tcG9uZW50c05lZWRpbmdSZW5kZXIuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7IHJldHVybiBjb21wb25lbnQucmVuZGVyKCk7IH0pOwogICAgICAgICAgICBfaXNDdXJyZW50bHlGbHVzaGluZyA9IHRydWU7CiAgICAgICAgICAgIHZhciBmYWlsZWRfMSA9IG5ldyB1dGlscyQxLlNldCgpOwogICAgICAgICAgICBfY29tcG9uZW50c05lZWRpbmdSZW5kZXIuZm9yRWFjaChmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC5yZW5kZXJJbW1lZGlhdGVseSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIC8vIHRocm93IGVycm9yIHdpdGggdGltZW91dCB0byBhdm9pZCBpbnRlcnJ1cHRpbmcgZnVydGhlciByZW5kZXJzCiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgICAgICAgICAgZmFpbGVkXzEuYWRkKGNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBfY29tcG9uZW50c05lZWRpbmdDb21wdXRlTGF5b3V0ID0gbmV3IHV0aWxzJDEuU2V0KCk7CiAgICAgICAgICAgIF9jb21wb25lbnRzTmVlZGluZ1JlbmRlciA9IGZhaWxlZF8xOwogICAgICAgICAgICBfYW5pbWF0aW9uUmVxdWVzdGVkID0gZmFsc2U7CiAgICAgICAgICAgIF9pc0N1cnJlbnRseUZsdXNoaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgZXhwb3J0cy5mbHVzaCA9IGZsdXNoOwogICAgfSk7CgogICAgdmFyIGNvbXBvbmVudCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgogICAgZXhwb3J0cy5YQWxpZ25tZW50ID0gbWFrZUVudW1fMS5tYWtlRW51bShbImxlZnQiLCAiY2VudGVyIiwgInJpZ2h0Il0pOwogICAgZXhwb3J0cy5ZQWxpZ25tZW50ID0gbWFrZUVudW1fMS5tYWtlRW51bShbInRvcCIsICJjZW50ZXIiLCAiYm90dG9tIl0pOwogICAgLyoqCiAgICAgKiBDb21wb25lbnRzIGFyZSB0aGUgY29yZSBsb2dpY2FsIHVuaXRzIHRoYXQgYnVpbGQgUGxvdHRhYmxlIHZpc3VhbGl6YXRpb25zLgogICAgICoKICAgICAqIFRoaXMgY2xhc3MgZGVhbHMgd2l0aCBDb21wb25lbnQgbGlmZWN5Y2xlIChhbmNob3JpbmcsIGdldHRpbmcgYSBzaXplLCBhbmQgcmVuZGVyaW5nCiAgICAgKiBpbmZyYXN0cnVjdHVyZSksIGFzIHdlbGwgYXMgYnVpbGRpbmcgdGhlIGZyYW1ld29yayBvZiBET00gZWxlbWVudHMgZm9yIGFsbCBDb21wb25lbnRzLgogICAgICovCiAgICB2YXIgQ29tcG9uZW50ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIENvbXBvbmVudCgpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YmNsYXNzZXMgc2hvdWxkIHNldCB0aGlzIHRvIHRydWUgaW4gdGhlaXIgY29uc3RydWN0b3IgdG8gcHJldmVudCBjb250ZW50IGZyb20gb3ZlcmZsb3dpbmcuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vdmVyZmxvd0hpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogT3JpZ2luIG9mIHRoaXMgQ29tcG9uZW50IHJlbGF0aXZlIHRvIGl0cyBwYXJlbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vcmlnaW4gPSB7IHg6IDAsIHk6IDAgfTsKICAgICAgICAgICAgdGhpcy5feEFsaWdubWVudCA9ICJsZWZ0IjsKICAgICAgICAgICAgdGhpcy5feUFsaWdubWVudCA9ICJ0b3AiOwogICAgICAgICAgICB0aGlzLl9pc1NldHVwID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2lzQW5jaG9yZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY3NzQ2xhc3NlcyA9IG5ldyB1dGlscyQxLlNldCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSWYgLmRlc3Ryb3koKSBoYXMgYmVlbiBjYWxsZWQgb24gdGhpcyBDb21wb25lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fb25BbmNob3JDYWxsYmFja3MgPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICB0aGlzLl9vbkRldGFjaENhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIHRoaXMuX2Nzc0NsYXNzZXMuYWRkKCJjb21wb25lbnQiKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhlIENvbXBvbmVudCBhcyBhIGNoaWxkIG9mIGEgZ2l2ZW4gZDMgU2VsZWN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtkMy5TZWxlY3Rpb259IHNlbGVjdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7Q29tcG9uZW50fSBUaGUgY2FsbGluZyBDb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5hbmNob3IgPSBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbiA9IGNvZXJjZUQzLmNvZXJjZUV4dGVybmFsRDMoc2VsZWN0aW9uKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW4ndCByZXVzZSBkZXN0cm95KCktZWQgQ29tcG9uZW50cyEiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5pc1Jvb3QoKSkgewogICAgICAgICAgICAgICAgdGhpcy5fcm9vdEVsZW1lbnQgPSBzZWxlY3Rpb247CiAgICAgICAgICAgICAgICAvLyByb290RWxlbWVudCBnZXRzIHRoZSAicGxvdHRhYmxlIiBDU1MgY2xhc3MKICAgICAgICAgICAgICAgIHRoaXMuX3Jvb3RFbGVtZW50LmNsYXNzZWQoInBsb3R0YWJsZSIsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIHJlYXR0YWNoIGV4aXN0aW5nIGVsZW1lbnQKICAgICAgICAgICAgICAgIHNlbGVjdGlvbi5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fZWxlbWVudC5ub2RlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IHNlbGVjdGlvbi5hcHBlbmQoImRpdiIpOwogICAgICAgICAgICAgICAgdGhpcy5fc2V0dXAoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9pc0FuY2hvcmVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fb25BbmNob3JDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIG9uIGFuY2hvcmluZyB0aGUgQ29tcG9uZW50IHRvIHRoZSBET00uCiAgICAgICAgICogSWYgdGhlIENvbXBvbmVudCBpcyBhbHJlYWR5IGFuY2hvcmVkLCB0aGUgY2FsbGJhY2sgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDb21wb25lbnRDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtDb21wb25lbnR9CiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5vbkFuY2hvciA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICBpZiAodGhpcy5faXNBbmNob3JlZCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fb25BbmNob3JDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgb24gYW5jaG9yaW5nIHRoZSBDb21wb25lbnQgdG8gdGhlIERPTS4KICAgICAgICAgKiBUaGUgY2FsbGJhY2sgaXMgaWRlbnRpZmllZCBieSByZWZlcmVuY2UgZXF1YWxpdHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0NvbXBvbmVudENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0NvbXBvbmVudH0KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLm9mZkFuY2hvciA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9vbkFuY2hvckNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYWRkaXRpb25hbCBlbGVtZW50cyBhcyBuZWNlc3NhcnkgZm9yIHRoZSBDb21wb25lbnQgdG8gZnVuY3Rpb24uCiAgICAgICAgICogQ2FsbGVkIGR1cmluZyBhbmNob3IoKSBpZiB0aGUgQ29tcG9uZW50J3MgZWxlbWVudCBoYXMgbm90IGJlZW4gY3JlYXRlZCB5ZXQuCiAgICAgICAgICogT3ZlcnJpZGUgaW4gc3ViY2xhc3NlcyB0byBwcm92aWRlIGFkZGl0aW9uYWwgZnVuY3Rpb25hbGl0eS4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLl9zZXR1cCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2V0dXApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jc3NDbGFzc2VzLmZvckVhY2goZnVuY3Rpb24gKGNzc0NsYXNzKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5fZWxlbWVudC5jbGFzc2VkKGNzc0NsYXNzLCB0cnVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX2Nzc0NsYXNzZXMgPSBuZXcgdXRpbHMkMS5TZXQoKTsKICAgICAgICAgICAgdGhpcy5fYmFja2dyb3VuZENvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJiYWNrZ3JvdW5kLWNvbnRhaW5lciIsIHRydWUpOwogICAgICAgICAgICB0aGlzLl9jb250ZW50ID0gdGhpcy5fZWxlbWVudC5hcHBlbmQoInN2ZyIpLmNsYXNzZWQoImNvbnRlbnQiLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5fZm9yZWdyb3VuZENvbnRhaW5lciA9IHRoaXMuX2VsZW1lbnQuYXBwZW5kKCJzdmciKS5jbGFzc2VkKCJmb3JlZ3JvdW5kLWNvbnRhaW5lciIsIHRydWUpOwogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmZsb3dIaWRkZW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRlbnQuY2xhc3NlZCgiY29tcG9uZW50LW92ZXJmbG93LWhpZGRlbiIsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fY29udGVudC5jbGFzc2VkKCJjb21wb25lbnQtb3ZlcmZsb3ctdmlzaWJsZSIsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2lzU2V0dXAgPSB0cnVlOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gYXZhaWxhYmxlIHNwYWNlIGluIHBpeGVscywgcmV0dXJucyB0aGUgbWluaW11bSB3aWR0aCBhbmQgaGVpZ2h0IHRoaXMgQ29tcG9uZW50IHdpbGwgbmVlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdmFpbGFibGVXaWR0aAogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBhdmFpbGFibGVIZWlnaHQKICAgICAgICAgKiBAcmV0dXJucyB7U3BhY2VSZXF1ZXN0fQogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2UgPSBmdW5jdGlvbiAoYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWluV2lkdGg6IDAsCiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IDAsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyBhbmQgc2V0cyB0aGUgc2l6ZSwgcG9zaXRpb24sIGFuZCBhbGlnbm1lbnQgb2YgdGhlIENvbXBvbmVudCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgogICAgICAgICAqIElmIG5vIHBhcmFtZXRlcnMgYXJlIHN1cHBsaWVkIGFuZCB0aGUgQ29tcG9uZW50IGlzIGEgcm9vdCBub2RlLAogICAgICAgICAqIHRoZXkgYXJlIGluZmVycmVkIGZyb20gdGhlIHNpemUgb2YgdGhlIENvbXBvbmVudCdzIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50fSBbb3JpZ2luXSBPcmlnaW4gb2YgdGhlIHNwYWNlIG9mZmVyZWQgdG8gdGhlIENvbXBvbmVudC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2F2YWlsYWJsZVdpZHRoXSBBdmFpbGFibGUgd2lkdGggaW4gcGl4ZWxzLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYXZhaWxhYmxlSGVpZ2h0XSBBdmFpbGFibGUgaGVpZ2h0IGluIHBpeGVscy4KICAgICAgICAgKiBAcmV0dXJucyB7Q29tcG9uZW50fSBUaGUgY2FsbGluZyBDb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICBpZiAob3JpZ2luID09IG51bGwgfHwgYXZhaWxhYmxlV2lkdGggPT0gbnVsbCB8fCBhdmFpbGFibGVIZWlnaHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiYW5jaG9yKCkgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGNvbXB1dGVMYXlvdXQoKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fcm9vdEVsZW1lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIHJldHJpZXZlIGhlaWdodC93aWR0aCBmcm9tIHJvb3RFbGVtZW50CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luID0geyB4OiAwLCB5OiAwIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSB0aGlzLl9yb290RWxlbWVudC5ub2RlKCk7CiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlV2lkdGggPSB1dGlscyQxLkRPTS5lbGVtZW50V2lkdGgoZWxlbSk7CiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSGVpZ2h0ID0gdXRpbHMkMS5ET00uZWxlbWVudEhlaWdodChlbGVtKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigibnVsbCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCB0byBjb21wdXRlTGF5b3V0KCkgb24gYSBub24tcm9vdCwgdW5hbmNob3JlZCBub2RlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fc2l6ZUZyb21PZmZlcihhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSwgaGVpZ2h0ID0gX2EuaGVpZ2h0LCB3aWR0aCA9IF9hLndpZHRoOwogICAgICAgICAgICB2YXIgeEFsaWduUHJvcG9ydGlvbiA9IENvbXBvbmVudC5feEFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3hBbGlnbm1lbnRdOwogICAgICAgICAgICB2YXIgeUFsaWduUHJvcG9ydGlvbiA9IENvbXBvbmVudC5feUFsaWduVG9Qcm9wb3J0aW9uW3RoaXMuX3lBbGlnbm1lbnRdOwogICAgICAgICAgICB2YXIgb3JpZ2luWCA9IG9yaWdpbi54ICsgKGF2YWlsYWJsZVdpZHRoIC0gd2lkdGgpICogeEFsaWduUHJvcG9ydGlvbjsKICAgICAgICAgICAgdmFyIG9yaWdpblkgPSBvcmlnaW4ueSArIChhdmFpbGFibGVIZWlnaHQgLSBoZWlnaHQpICogeUFsaWduUHJvcG9ydGlvbjsKICAgICAgICAgICAgdGhpcy5zZXRCb3VuZHMod2lkdGgsIGhlaWdodCwgb3JpZ2luWCwgb3JpZ2luWSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogRGlyZWN0bHkgc2V0cyBjb21wb25lbnQgc2l6ZSBhbmQsIG9wdGlvbmFsbHksIGl0cyBvcmlnaW4uCiAgICAgICAgICoKICAgICAgICAgKiBQcmVmZXJhYmx5LCBsYXlvdXQgaXMgYWNjb21wbGlzaGVkIGJ5IHBsYWNpbmcgY29tcG9uZW50cyBpbiBhIHRhYmxlLgogICAgICAgICAqIEhvd2V2ZXIsIGlmIHlvdSBuZWVkIHRvIGRpcmVjdGx5IG92ZXJyaWRlIHRoZSBjb21wb25lbnQgc2l6ZSwgeW91IG1heSBjYWxsCiAgICAgICAgICogdGhpcyBtZXRob2QuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZXRob2Qgc3R5bGVzIHRoZSBhbmNob3JlZCBlbGVtZW50LCBzbyB0aGlzIGlzIHVzdWFsbHkgb25seQogICAgICAgICAqIHVzZWZ1bCBhZnRlciB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGFuY2hvcmVkLiBJZiB0aGUgY29tcG9uZW50IGhhcyBub3QgYmVlbgogICAgICAgICAqIGFuY2hvcmVkIHRvIGFuIGVsZW1lbnQsIHRoZSBpbnRlcm5hbCBwcm9wZXJ0aWVzIHdpbGwgYmUgc2V0IGJ1dCBubyBzdHlsZXMKICAgICAgICAgKiB3aWxsIGJlIGFwcGxpZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW3dpZHRoXSB3aWR0aCBpbiBwaXhlbHMKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2hlaWdodF0gaGVpZ2h0IGluIHBpeGVscwogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbb3JpZ2luWF0gbGVmdCBvZmZzZXQgaW4gcGl4ZWxzCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IFtvcmlnaW5ZXSB0b3Agb2Zmc2V0IGluIHBpeGVscwogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuc2V0Qm91bmRzID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIG9yaWdpblgsIG9yaWdpblkpIHsKICAgICAgICAgICAgaWYgKG9yaWdpblggPT09IHZvaWQgMCkgeyBvcmlnaW5YID0gMDsgfQogICAgICAgICAgICBpZiAob3JpZ2luWSA9PT0gdm9pZCAwKSB7IG9yaWdpblkgPSAwOyB9CiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gd2lkdGg7CiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9IGhlaWdodDsKICAgICAgICAgICAgdGhpcy5fb3JpZ2luID0gewogICAgICAgICAgICAgICAgeDogb3JpZ2luWCwKICAgICAgICAgICAgICAgIHk6IG9yaWdpblksCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQuc3R5bGVzKHsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiBvcmlnaW5YICsgInB4IiwKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCArICJweCIsCiAgICAgICAgICAgICAgICAgICAgdG9wOiBvcmlnaW5ZICsgInB4IiwKICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGggKyAicHgiLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3Jlc2l6ZUhhbmRsZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplSGFuZGxlcih7IHdpZHRoOiB3aWR0aCwgaGVpZ2h0OiBoZWlnaHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyID0gZnVuY3Rpb24gKGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpIHsKICAgICAgICAgICAgdmFyIHJlcXVlc3RlZFNwYWNlID0gdGhpcy5yZXF1ZXN0ZWRTcGFjZShhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLmZpeGVkV2lkdGgoKSA/IE1hdGgubWluKGF2YWlsYWJsZVdpZHRoLCByZXF1ZXN0ZWRTcGFjZS5taW5XaWR0aCkgOiBhdmFpbGFibGVXaWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5maXhlZEhlaWdodCgpID8gTWF0aC5taW4oYXZhaWxhYmxlSGVpZ2h0LCByZXF1ZXN0ZWRTcGFjZS5taW5IZWlnaHQpIDogYXZhaWxhYmxlSGVpZ2h0LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUXVldWVzIHRoZSBDb21wb25lbnQgZm9yIHJlbmRlcmluZy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtDb21wb25lbnR9IFRoZSBjYWxsaW5nIENvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzQW5jaG9yZWQgJiYgdGhpcy5faXNTZXR1cCAmJiB0aGlzLndpZHRoKCkgPj0gMCAmJiB0aGlzLmhlaWdodCgpID49IDApIHsKICAgICAgICAgICAgICAgIHJlbmRlckNvbnRyb2xsZXIucmVnaXN0ZXJUb1JlbmRlcih0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUucmVuZGVyTG93UHJpb3JpdHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlbmRlcigpOwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5fc2NoZWR1bGVDb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5faXNBbmNob3JlZCAmJiB0aGlzLl9pc1NldHVwKSB7CiAgICAgICAgICAgICAgICByZW5kZXJDb250cm9sbGVyLnJlZ2lzdGVyVG9Db21wdXRlTGF5b3V0QW5kUmVuZGVyKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdGhhdCBnZXRzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgcmVzaXplcy4gVGhlIHNpemUgY2hhbmdlCiAgICAgICAgICogaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgcmVmbGVjdGVkIGJ5IHRoZSBET00gYXQgdGhlIHRpbWUgdGhlIGNhbGxiYWNrIGlzIGZpcmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtJUmVzaXplSGFuZGxlcn0gW3Jlc2l6ZUhhbmRsZXJdIENhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGNvbXBvbmVudCByZXNpemVzCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5vblJlc2l6ZSA9IGZ1bmN0aW9uIChyZXNpemVIYW5kbGVyKSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZUhhbmRsZXIgPSByZXNpemVIYW5kbGVyOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgdGhlIENvbXBvbmVudCB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBuZXh0IGZyYW1lLiBUaGlzIG1ldGhvZCBpcyBhIG5vLW9wIG9uCiAgICAgICAgICogQ29tcG9uZW50LCBUYWJsZSwgYW5kIEdyb3VwOyByZW5kZXIgdGhlbSBpbW1lZGlhdGVseSB3aXRoIC5yZW5kZXJUbygpIGluc3RlYWQuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDYXVzZXMgdGhlIENvbXBvbmVudCB0byByZS1sYXlvdXQgYW5kIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtDb21wb25lbnR9IFRoZSBjYWxsaW5nIENvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLnJlZHJhdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzQW5jaG9yZWQgJiYgdGhpcy5faXNTZXR1cCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNSb290KCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZUNvbXB1dGVMYXlvdXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFyZW50KCkucmVkcmF3KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUZWxsIHRoaXMgY29tcG9uZW50IHRvIGludmFsaWRhdGUgYW55IGNhY2hpbmcuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlCiAgICAgICAgICogY2FsbGVkIHdoZW4gYSBDU1MgY2hhbmdlIGhhcyBvY2N1cnJlZCB0aGF0IGNvdWxkIGluZmx1ZW5jZSB0aGUgbGF5b3V0CiAgICAgICAgICogb2YgdGhlIENvbXBvbmVudCwgc3VjaCBhcyBjaGFuZ2luZyB0aGUgZm9udCBzaXplLgogICAgICAgICAqCiAgICAgICAgICogU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIENvcmUgY29tcG9uZW50IGhhcyBubyBjYWNoaW5nLgogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgQ29tcG9uZW50IHRvIGEgZ2l2ZW4gSFRNTCBFbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTdHJpbmd8ZDMuU2VsZWN0aW9ufSBlbGVtZW50IFRoZSBlbGVtZW50LCBhIHNlbGVjdG9yIHN0cmluZyBmb3IgdGhlIGVsZW1lbnQsIG9yIGEgZDMuU2VsZWN0aW9uIGZvciB0aGUgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJucyB7Q29tcG9uZW50fSBUaGUgY2FsbGluZyBDb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5yZW5kZXJUbyA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuZGV0YWNoKCk7CiAgICAgICAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3Rpb24gPSB2b2lkIDA7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIChlbGVtZW50KSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gPSBkMy5zZWxlY3QoZWxlbWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChsb2Rhc2guaXNFbGVtZW50KGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gZDMuc2VsZWN0KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uID0gY29lcmNlRDMuY29lcmNlRXh0ZXJuYWxEMyhlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2VsZWN0aW9uLm5vZGUoKSB8fCBzZWxlY3Rpb24ubm9kZSgpLm5vZGVOYW1lID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlBsb3R0YWJsZSByZXF1aXJlcyBhIHZhbGlkIEVsZW1lbnQgdG8gcmVuZGVyVG8iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxlY3Rpb24ubm9kZSgpLm5vZGVOYW1lID09PSAic3ZnIikgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGxvdHRhYmxlIDMueCBhbmQgbGF0ZXIgY2FuIG9ubHkgcmVuZGVyVG8gYW4gSFRNTCBjb21wb25lbnQ7IHBhc3MgYSBkaXYgaW5zdGVhZCEiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yKHNlbGVjdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJZiBhIENvbXBvbmVudCBoYXMgbmV2ZXIgYmVlbiByZW5kZXJlZCBiZWZvcmUsIHRoZW4gcmVuZGVyVG8gbXVzdCBiZSBnaXZlbiBhIG5vZGUgdG8gcmVuZGVyIHRvLCAiICsKICAgICAgICAgICAgICAgICAgICAib3IgYSBkMy5TZWxlY3Rpb24sIG9yIGEgc2VsZWN0b3Igc3RyaW5nIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVuZGVyQ29udHJvbGxlci5yZWdpc3RlclRvQ29tcHV0ZUxheW91dEFuZFJlbmRlcih0aGlzKTsKICAgICAgICAgICAgLy8gZmx1c2ggc28gdGhhdCBjb25zdW1lcnMgY2FuIGltbWVkaWF0ZWx5IGF0dGFjaCB0byBzdHVmZiB3ZSBjcmVhdGUgaW4gdGhlIERPTQogICAgICAgICAgICByZW5kZXJDb250cm9sbGVyLmZsdXNoKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS54QWxpZ25tZW50ID0gZnVuY3Rpb24gKHhBbGlnbm1lbnQpIHsKICAgICAgICAgICAgaWYgKHhBbGlnbm1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3hBbGlnbm1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeEFsaWdubWVudCA9IHhBbGlnbm1lbnQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKENvbXBvbmVudC5feEFsaWduVG9Qcm9wb3J0aW9uW3hBbGlnbm1lbnRdID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiICsgeEFsaWdubWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5feEFsaWdubWVudCA9IHhBbGlnbm1lbnQ7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS55QWxpZ25tZW50ID0gZnVuY3Rpb24gKHlBbGlnbm1lbnQpIHsKICAgICAgICAgICAgaWYgKHlBbGlnbm1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3lBbGlnbm1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeUFsaWdubWVudCA9IHlBbGlnbm1lbnQudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKENvbXBvbmVudC5feUFsaWduVG9Qcm9wb3J0aW9uW3lBbGlnbm1lbnRdID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgYWxpZ25tZW50OiAiICsgeUFsaWdubWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5feUFsaWdubWVudCA9IHlBbGlnbm1lbnQ7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGlmIHRoZSBDb21wb25lbnQgaGFzIGEgZ2l2ZW4gQ1NTIGNsYXNzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc0NsYXNzIFRoZSBDU1MgY2xhc3MgdG8gY2hlY2sgZm9yLgogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuaGFzQ2xhc3MgPSBmdW5jdGlvbiAoY3NzQ2xhc3MpIHsKICAgICAgICAgICAgaWYgKGNzc0NsYXNzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY3NzQ2xhc3Nlcy5oYXMoY3NzQ2xhc3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnQuY2xhc3NlZChjc3NDbGFzcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBnaXZlbiBDU1MgY2xhc3MgdG8gdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjc3NDbGFzcyBUaGUgQ1NTIGNsYXNzIHRvIGFkZC4KICAgICAgICAgKiBAcmV0dXJucyB7Q29tcG9uZW50fSBUaGUgY2FsbGluZyBDb21wb25lbnQuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5hZGRDbGFzcyA9IGZ1bmN0aW9uIChjc3NDbGFzcykgewogICAgICAgICAgICBpZiAoY3NzQ2xhc3MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fY3NzQ2xhc3Nlcy5hZGQoY3NzQ2xhc3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5jbGFzc2VkKGNzc0NsYXNzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBnaXZlbiBDU1MgY2xhc3MgZnJvbSB0aGUgQ29tcG9uZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IGNzc0NsYXNzIFRoZSBDU1MgY2xhc3MgdG8gcmVtb3ZlLgogICAgICAgICAqIEByZXR1cm5zIHtDb21wb25lbnR9IFRoZSBjYWxsaW5nIENvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLnJlbW92ZUNsYXNzID0gZnVuY3Rpb24gKGNzc0NsYXNzKSB7CiAgICAgICAgICAgIGlmIChjc3NDbGFzcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jc3NDbGFzc2VzLmRlbGV0ZShjc3NDbGFzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50LmNsYXNzZWQoY3NzQ2xhc3MsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiB0aGUgQ29tcG9uZW50IGhhcyBhIGZpeGVkIHdpZHRoIG9yIGlmIGl0IGdyb3dzIHRvIGZpbGwgYXZhaWxhYmxlIHNwYWNlLgogICAgICAgICAqIFJldHVybnMgZmFsc2UgYnkgZGVmYXVsdCBvbiB0aGUgYmFzZSBDb21wb25lbnQgY2xhc3MuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5maXhlZFdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdGhlIENvbXBvbmVudCBoYXMgYSBmaXhlZCBoZWlnaHQgb3IgaWYgaXQgZ3Jvd3MgdG8gZmlsbCBhdmFpbGFibGUgc3BhY2UuCiAgICAgICAgICogUmV0dXJucyBmYWxzZSBieSBkZWZhdWx0IG9uIHRoZSBiYXNlIENvbXBvbmVudCBjbGFzcy4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmZpeGVkSGVpZ2h0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyBhIENvbXBvbmVudCBmcm9tIHRoZSBET00uIFRoZSBDb21wb25lbnQgY2FuIGJlIHJldXNlZC4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgcGxhbiBvbiByZXVzaW5nIHRoZSBjYWxsaW5nIENvbXBvbmVudC4gT3RoZXJ3aXNlLCB1c2UgZGVzdHJveSgpLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMgVGhlIGNhbGxpbmcgQ29tcG9uZW50LgogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLnBhcmVudChudWxsKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzQW5jaG9yZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNBbmNob3JlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRoaXMpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgQ29tcG9uZW50IGlzIGRldGFjaCgpLWVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDb21wb25lbnRDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjYWxsaW5nIENvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLm9uRGV0YWNoID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX29uRGV0YWNoQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBDb21wb25lbnQgaXMgZGV0YWNoKCktZWQuCiAgICAgICAgICogVGhlIGNhbGxiYWNrIGlzIGlkZW50aWZpZWQgYnkgcmVmZXJlbmNlIGVxdWFsaXR5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDb21wb25lbnRDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtDb21wb25lbnR9IFRoZSBjYWxsaW5nIENvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLm9mZkRldGFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9vbkRldGFjaENhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUucGFyZW50ID0gZnVuY3Rpb24gKHBhcmVudCkgewogICAgICAgICAgICBpZiAocGFyZW50ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmVudCAhPT0gbnVsbCAmJiAhcGFyZW50Lmhhcyh0aGlzKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJQYXNzZWQgaW52YWxpZCBwYXJlbnQiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybnMge0JvdW5kc30gZm9yIHRoZSBjb21wb25lbnQgaW4gcGl4ZWwgc3BhY2UsIHdoZXJlIHRoZSB0b3BMZWZ0CiAgICAgICAgICogcmVwcmVzZW50cyB0aGUgY29tcG9uZW50J3MgbWluaW11bSB4IGFuZCB5IHZhbHVlcyBhbmQgdGhlIGJvdHRvbVJpZ2h0IHJlcHJlc2VudHMKICAgICAgICAgKiB0aGUgY29tcG9uZW50J3MgbWF4aW11bSB4IGFuZCB5IHZhbHVlcy4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmJvdW5kcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHRvcExlZnQgPSB0aGlzLm9yaWdpbigpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdG9wTGVmdDogdG9wTGVmdCwKICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdG9wTGVmdC54ICsgdGhpcy53aWR0aCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHRvcExlZnQueSArIHRoaXMuaGVpZ2h0KCksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIENvbXBvbmVudCBmcm9tIHRoZSBET00gYW5kIGRpc2Nvbm5lY3RzIGFsbCBsaXN0ZW5lcnMuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmRldGFjaCgpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIENvbXBvbmVudCBpbiBwaXhlbHMuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS53aWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3dpZHRoOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBDb21wb25lbnQgaW4gcGl4ZWxzLgogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuaGVpZ2h0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGVpZ2h0OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgb3JpZ2luIG9mIHRoZSBDb21wb25lbnQgcmVsYXRpdmUgdG8gaXRzIHBhcmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1BvaW50fQogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUub3JpZ2luID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogdGhpcy5fb3JpZ2luLngsCiAgICAgICAgICAgICAgICB5OiB0aGlzLl9vcmlnaW4ueSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG9yaWdpbiBvZiB0aGUgQ29tcG9uZW50IHJlbGF0aXZlIHRvIHRoZSByb290IENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge1BvaW50fQogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUub3JpZ2luVG9Sb290ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW4oKTsKICAgICAgICAgICAgdmFyIGFuY2VzdG9yID0gdGhpcy5wYXJlbnQoKTsKICAgICAgICAgICAgd2hpbGUgKGFuY2VzdG9yICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBhbmNlc3Rvck9yaWdpbiA9IGFuY2VzdG9yLm9yaWdpbigpOwogICAgICAgICAgICAgICAgb3JpZ2luLnggKz0gYW5jZXN0b3JPcmlnaW4ueDsKICAgICAgICAgICAgICAgIG9yaWdpbi55ICs9IGFuY2VzdG9yT3JpZ2luLnk7CiAgICAgICAgICAgICAgICBhbmNlc3RvciA9IGFuY2VzdG9yLnBhcmVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvcmlnaW47CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSByb290IGNvbXBvbmVudCBvZiB0aGUgaGllcmFyY2h5LiBJZiB0aGUgcHJvdmlkZWQKICAgICAgICAgKiBjb21wb25lbnQgaXMgdGhlIHJvb3QsIHRoYXQgY29tcG9uZW50IHdpbGwgYmUgcmV0dXJuZWQuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5yb290ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY29tcG9uZW50ID0gdGhpczsKICAgICAgICAgICAgd2hpbGUgKCFjb21wb25lbnQuaXNSb290KCkpIHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC5wYXJlbnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29tcG9uZW50OwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5pc1Jvb3QgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudCgpID09IG51bGw7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBTZWxlY3Rpb24gY29udGFpbmluZyB0aGUgPGc+IGluIGZyb250IG9mIHRoZSB2aXN1YWwgZWxlbWVudHMgb2YgdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIFdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgQ29tcG9uZW50IGhhcyBub3QgYmVlbiBhbmNob3JlZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2QzLlNlbGVjdGlvbn0KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmZvcmVncm91bmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb3JlZ3JvdW5kQ29udGFpbmVyOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgU1ZHIHRoYXQgaG9sZHMgdGhlIHZpc3VhbCBlbGVtZW50cyBvZiB0aGUgQ29tcG9uZW50LgogICAgICAgICAqCiAgICAgICAgICogV2lsbCByZXR1cm4gdW5kZWZpbmVkIGlmIHRoZSBDb21wb25lbnQgaGFzIG5vdCBiZWVuIGFuY2hvcmVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7ZDMuU2VsZWN0aW9ufSBjb250ZW50IHNlbGVjdGlvbiBmb3IgdGhlIENvbXBvbmVudAogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudC5wcm90b3R5cGUuY29udGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBIVE1MIEVsZW1lbnQgYXQgdGhlIHJvb3Qgb2YgdGhpcyBjb21wb25lbnQncyBET00gdHJlZS4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdG9wLWxldmVsIHVzZXIgc3VwcGxpZWQgZWxlbWVudCB0aGF0IHJvb3RzIHRoZSB0cmVlIHRoYXQgdGhpcyBDb21wb25lbnQgbGl2ZXMgaW4uCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50LnByb3RvdHlwZS5yb290RWxlbWVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucm9vdCgpLl9yb290RWxlbWVudDsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIFNlbGVjdGlvbiBjb250YWluaW5nIHRoZSA8Zz4gYmVoaW5kIHRoZSB2aXN1YWwgZWxlbWVudHMgb2YgdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIFdpbGwgcmV0dXJuIHVuZGVmaW5lZCBpZiB0aGUgQ29tcG9uZW50IGhhcyBub3QgYmVlbiBhbmNob3JlZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2QzLlNlbGVjdGlvbn0gYmFja2dyb3VuZCBzZWxlY3Rpb24gZm9yIHRoZSBDb21wb25lbnQKICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnQucHJvdG90eXBlLmJhY2tncm91bmQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29udGFpbmVyOwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50Ll94QWxpZ25Ub1Byb3BvcnRpb24gPSB7CiAgICAgICAgICAgIGxlZnQ6IDAsCiAgICAgICAgICAgIGNlbnRlcjogMC41LAogICAgICAgICAgICByaWdodDogMSwKICAgICAgICB9OwogICAgICAgIENvbXBvbmVudC5feUFsaWduVG9Qcm9wb3J0aW9uID0gewogICAgICAgICAgICB0b3A6IDAsCiAgICAgICAgICAgIGNlbnRlcjogMC41LAogICAgICAgICAgICBib3R0b206IDEsCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQ29tcG9uZW50OwogICAgfSgpKTsKICAgIGV4cG9ydHMuQ29tcG9uZW50ID0gQ29tcG9uZW50OwogICAgfSk7CgogICAgdmFyIGZvcm1hdHRlcnMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICAvLyBEbyBub3QgdXNlIHV0YyBieSBkZWZhdWx0CiAgICB2YXIgREVGQVVMVF9VU0VfVVRDID0gZmFsc2U7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmb3JtYXR0ZXIgZm9yIGN1cnJlbmN5IHZhbHVlcy4KICAgICAqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbl0gVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byBzaG93IChkZWZhdWx0IDIpLgogICAgICogQHBhcmFtIHtzdHJpbmd9IFtzeW1ib2xdIFRoZSBjdXJyZW5jeSBzeW1ib2wgdG8gdXNlIChkZWZhdWx0ICIkIikuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVmaXhdIFdoZXRoZXIgdG8gcHJlcGVuZCBvciBhcHBlbmQgdGhlIGN1cnJlbmN5IHN5bWJvbCAoZGVmYXVsdCB0cnVlKS4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7Rm9ybWF0dGVyfSBBIGZvcm1hdHRlciBmb3IgY3VycmVuY3kgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBjdXJyZW5jeShwcmVjaXNpb24sIHN5bWJvbCwgcHJlZml4KSB7CiAgICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdm9pZCAwKSB7IHByZWNpc2lvbiA9IDI7IH0KICAgICAgICBpZiAoc3ltYm9sID09PSB2b2lkIDApIHsgc3ltYm9sID0gIiQiOyB9CiAgICAgICAgaWYgKHByZWZpeCA9PT0gdm9pZCAwKSB7IHByZWZpeCA9IHRydWU7IH0KICAgICAgICB2YXIgZml4ZWRGb3JtYXR0ZXIgPSBmaXhlZChwcmVjaXNpb24pOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgZm9ybWF0dGVkVmFsdWUgPSBmaXhlZEZvcm1hdHRlcihNYXRoLmFicyhkKSk7CiAgICAgICAgICAgIGlmIChmb3JtYXR0ZWRWYWx1ZSAhPT0gIiIpIHsKICAgICAgICAgICAgICAgIGlmIChwcmVmaXgpIHsKICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRWYWx1ZSA9IHN5bWJvbCArIGZvcm1hdHRlZFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgKz0gc3ltYm9sOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGQgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkVmFsdWUgPSAiLSIgKyBmb3JtYXR0ZWRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm9ybWF0dGVkVmFsdWU7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuY3VycmVuY3kgPSBjdXJyZW5jeTsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZvcm1hdHRlciB0aGF0IGRpc3BsYXlzIGV4YWN0bHkgW3ByZWNpc2lvbl0gZGVjaW1hbCBwbGFjZXMuCiAgICAgKgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb25dIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gc2hvdyAoZGVmYXVsdCAzKS4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7Rm9ybWF0dGVyfSBBIGZvcm1hdHRlciB0aGF0IGRpc3BsYXlzIGV4YWN0bHkgW3ByZWNpc2lvbl0gZGVjaW1hbCBwbGFjZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpeGVkKHByZWNpc2lvbikgewogICAgICAgIGlmIChwcmVjaXNpb24gPT09IHZvaWQgMCkgeyBwcmVjaXNpb24gPSAzOyB9CiAgICAgICAgdmVyaWZ5UHJlY2lzaW9uKHByZWNpc2lvbik7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLnRvRml4ZWQocHJlY2lzaW9uKTsgfTsKICAgIH0KICAgIGV4cG9ydHMuZml4ZWQgPSBmaXhlZDsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZvcm1hdHRlciB0aGF0IGZvcm1hdHMgbnVtYmVycyB0byBzaG93IG5vIG1vcmUgdGhhbgogICAgICogW21heE51bWJlck9mRGVjaW1hbFBsYWNlc10gZGVjaW1hbCBwbGFjZXMuIEFsbCBvdGhlciB2YWx1ZXMgYXJlIHN0cmluZ2lmaWVkLgogICAgICoKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbbWF4TnVtYmVyT2ZEZWNpbWFsUGxhY2VzXSBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHNob3cgKGRlZmF1bHQgMykuCiAgICAgKgogICAgICogQHJldHVybnMge0Zvcm1hdHRlcn0gQSBmb3JtYXR0ZXIgZm9yIGdlbmVyYWwgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBnZW5lcmFsKG1heE51bWJlck9mRGVjaW1hbFBsYWNlcykgewogICAgICAgIGlmIChtYXhOdW1iZXJPZkRlY2ltYWxQbGFjZXMgPT09IHZvaWQgMCkgeyBtYXhOdW1iZXJPZkRlY2ltYWxQbGFjZXMgPSAzOyB9CiAgICAgICAgdmVyaWZ5UHJlY2lzaW9uKG1heE51bWJlck9mRGVjaW1hbFBsYWNlcyk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZCA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIHZhciBtdWx0aXBsaWVyID0gTWF0aC5wb3coMTAsIG1heE51bWJlck9mRGVjaW1hbFBsYWNlcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKE1hdGgucm91bmQoZCAqIG11bHRpcGxpZXIpIC8gbXVsdGlwbGllcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nKGQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuZ2VuZXJhbCA9IGdlbmVyYWw7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmb3JtYXR0ZXIgdGhhdCBzdHJpbmdpZmllcyBpdHMgaW5wdXQuCiAgICAgKgogICAgICogQHJldHVybnMge0Zvcm1hdHRlcn0gQSBmb3JtYXR0ZXIgdGhhdCBzdHJpbmdpZmllcyBpdHMgaW5wdXQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlkZW50aXR5KCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gU3RyaW5nKGQpOyB9OwogICAgfQogICAgZXhwb3J0cy5pZGVudGl0eSA9IGlkZW50aXR5OwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZm9ybWF0dGVyIGZvciBwZXJjZW50YWdlIHZhbHVlcy4KICAgICAqIE11bHRpcGxpZXMgdGhlIGlucHV0IGJ5IDEwMCBhbmQgYXBwZW5kcyAiJSIuCiAgICAgKgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtwcmVjaXNpb25dIFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gc2hvdyAoZGVmYXVsdCAwKS4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7Rm9ybWF0dGVyfSBBIGZvcm1hdHRlciBmb3IgcGVyY2VudGFnZSB2YWx1ZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBlcmNlbnRhZ2UocHJlY2lzaW9uKSB7CiAgICAgICAgaWYgKHByZWNpc2lvbiA9PT0gdm9pZCAwKSB7IHByZWNpc2lvbiA9IDA7IH0KICAgICAgICB2YXIgZml4ZWRGb3JtYXR0ZXIgPSBmaXhlZChwcmVjaXNpb24pOwogICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICB2YXIgdmFsVG9Gb3JtYXQgPSBkICogMTAwOwogICAgICAgICAgICAvLyBBY2NvdW50IGZvciBmbG9hdCBpbXByZWNpc2lvbgogICAgICAgICAgICB2YXIgdmFsU3RyaW5nID0gZC50b1N0cmluZygpOwogICAgICAgICAgICB2YXIgaW50ZWdlclBvd2VyVGVuID0gTWF0aC5wb3coMTAsIHZhbFN0cmluZy5sZW5ndGggLSAodmFsU3RyaW5nLmluZGV4T2YoIi4iKSArIDEpKTsKICAgICAgICAgICAgdmFsVG9Gb3JtYXQgPSBwYXJzZUludCgodmFsVG9Gb3JtYXQgKiBpbnRlZ2VyUG93ZXJUZW4pLnRvU3RyaW5nKCksIDEwKSAvIGludGVnZXJQb3dlclRlbjsKICAgICAgICAgICAgcmV0dXJuIGZpeGVkRm9ybWF0dGVyKHZhbFRvRm9ybWF0KSArICIlIjsKICAgICAgICB9OwogICAgfQogICAgZXhwb3J0cy5wZXJjZW50YWdlID0gcGVyY2VudGFnZTsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZvcm1hdHRlciBmb3IgdmFsdWVzIHRoYXQgZGlzcGxheXMgW251bWJlck9mU2lnbmlmaWNhbnRGaWd1cmVzXSBzaWduaWZpY2FudCBmaWd1cmVzCiAgICAgKiBhbmQgcHV0cyBTSSBub3RhdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW251bWJlck9mU2lnbmlmaWNhbnRGaWd1cmVzXSBUaGUgbnVtYmVyIG9mIHNpZ25pZmljYW50IGZpZ3VyZXMgdG8gc2hvdyAoZGVmYXVsdCAzKS4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7Rm9ybWF0dGVyfSBBIGZvcm1hdHRlciBmb3IgU0kgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBzaVN1ZmZpeChudW1iZXJPZlNpZ25pZmljYW50RmlndXJlcykgewogICAgICAgIGlmIChudW1iZXJPZlNpZ25pZmljYW50RmlndXJlcyA9PT0gdm9pZCAwKSB7IG51bWJlck9mU2lnbmlmaWNhbnRGaWd1cmVzID0gMzsgfQogICAgICAgIHZlcmlmeVByZWNpc2lvbihudW1iZXJPZlNpZ25pZmljYW50RmlndXJlcyk7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7IHJldHVybiBkMy5mb3JtYXQoIi4iICsgbnVtYmVyT2ZTaWduaWZpY2FudEZpZ3VyZXMgKyAicyIpKGQpOyB9OwogICAgfQogICAgZXhwb3J0cy5zaVN1ZmZpeCA9IHNpU3VmZml4OwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZm9ybWF0dGVyIGZvciB2YWx1ZXMgdGhhdCBkaXNwbGF5cyBhYmJyZXZpYXRlZCB2YWx1ZXMKICAgICAqIGFuZCB1c2VzIHN0YW5kYXJkIHNob3J0IHNjYWxlIHN1ZmZpeGVzCiAgICAgKiAtIEsgLSB0aG91c2FuZHMgLSAxMCBeIDMKICAgICAqIC0gTSAtIG1pbGxpb25zIC0gMTAgXiA2CiAgICAgKiAtIEIgLSBiaWxsaW9ucyAtIDEwIF4gOQogICAgICogLSBUIC0gdHJpbGxpb25zIC0gMTAgXiAxMgogICAgICogLSBRIC0gcXVhZHJpbGxpb25zIC0gMTAgXiAxNQogICAgICoKICAgICAqIE51bWJlcnMgd2l0aCBhIG1hZ25pdHVkZSBvdXRzaWRlIG9mICgxMCBeICgtcHJlY2lzaW9uKSwgMTAgXiAxNSkgYXJlIHNob3duIHVzaW5nCiAgICAgKiBzY2llbnRpZmljIG5vdGF0aW9uIHRvIGF2b2lkIGNyZWF0aW5nIGV4dHJlbWVseSBsb25nIGRlY2ltYWwgc3RyaW5ncy4KICAgICAqCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3ByZWNpc2lvbl0gdGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byBzaG93IChkZWZhdWx0IDMpCiAgICAgKiBAcmV0dXJucyB7Rm9ybWF0dGVyfSBBIGZvcm1hdHRlciB3aXRoIHNob3J0IHNjYWxlIGZvcm1hdHRpbmcKICAgICAqLwogICAgZnVuY3Rpb24gc2hvcnRTY2FsZShwcmVjaXNpb24pIHsKICAgICAgICBpZiAocHJlY2lzaW9uID09PSB2b2lkIDApIHsgcHJlY2lzaW9uID0gMzsgfQogICAgICAgIHZlcmlmeVByZWNpc2lvbihwcmVjaXNpb24pOwogICAgICAgIHZhciBzdWZmaXhlcyA9ICJLTUJUUSI7CiAgICAgICAgdmFyIGV4cG9uZW50Rm9ybWF0dGVyID0gZDMuZm9ybWF0KCIuIiArIHByZWNpc2lvbiArICJlIik7CiAgICAgICAgdmFyIGZpeGVkRm9ybWF0dGVyID0gZDMuZm9ybWF0KCIuIiArIHByZWNpc2lvbiArICJmIik7CiAgICAgICAgdmFyIG1heCA9IE1hdGgucG93KDEwLCAoMyAqIChzdWZmaXhlcy5sZW5ndGggKyAxKSkpOwogICAgICAgIHZhciBtaW4gPSBNYXRoLnBvdygxMCwgLXByZWNpc2lvbik7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChudW0pIHsKICAgICAgICAgICAgdmFyIGFic051bSA9IE1hdGguYWJzKG51bSk7CiAgICAgICAgICAgIGlmICgoYWJzTnVtIDwgbWluIHx8IGFic051bSA+PSBtYXgpICYmIGFic051bSAhPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGV4cG9uZW50Rm9ybWF0dGVyKG51bSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlkeCA9IC0xOwogICAgICAgICAgICB3aGlsZSAoYWJzTnVtID49IE1hdGgucG93KDEwMDAsIGlkeCArIDIpICYmIGlkeCA8IChzdWZmaXhlcy5sZW5ndGggLSAxKSkgewogICAgICAgICAgICAgICAgaWR4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG91dHB1dCA9ICIiOwogICAgICAgICAgICBpZiAoaWR4ID09PSAtMSkgewogICAgICAgICAgICAgICAgb3V0cHV0ID0gZml4ZWRGb3JtYXR0ZXIobnVtKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG91dHB1dCA9IGZpeGVkRm9ybWF0dGVyKG51bSAvIE1hdGgucG93KDEwMDAsIGlkeCArIDEpKSArIHN1ZmZpeGVzW2lkeF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY2F0Y2ggcm91bmRpbmcgYnkgdGhlIHVuZGVybHlpbmcgZDMgZm9ybWF0dGVyCiAgICAgICAgICAgIGlmICgobnVtID4gMCAmJiBvdXRwdXQuc3Vic3RyKDAsIDQpID09PSAiMTAwMCIpIHx8IChudW0gPCAwICYmIG91dHB1dC5zdWJzdHIoMCwgNSkgPT09ICItMTAwMCIpKSB7CiAgICAgICAgICAgICAgICBpZiAoaWR4IDwgc3VmZml4ZXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgICAgICAgICAgIGlkeCsrOwogICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IGZpeGVkRm9ybWF0dGVyKG51bSAvIE1hdGgucG93KDEwMDAsIGlkeCArIDEpKSArIHN1ZmZpeGVzW2lkeF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBleHBvbmVudEZvcm1hdHRlcihudW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuc2hvcnRTY2FsZSA9IHNob3J0U2NhbGU7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBtdWx0aSB0aW1lIGZvcm1hdHRlciB0aGF0IGRpc3BsYXlzIGRhdGVzLgogICAgICoKICAgICAqIEByZXR1cm5zIHtGb3JtYXR0ZXJ9IEEgZm9ybWF0dGVyIGZvciB0aW1lL2RhdGUgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBtdWx0aVRpbWUoKSB7CiAgICAgICAgLy8gRm9ybWF0dGVyIHRpZXJzIGdvaW5nIGZyb20gc2hvcnRlc3QgdGltZSBzY2FsZSB0byBsYXJnZXN0IC0gdGhlc2Ugd2VyZSB0YWtlbiBmcm9tIGQzCiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvVGltZS1Gb3JtYXR0aW5nI2Zvcm1hdF9tdWx0aQogICAgICAgIHZhciBjYW5kaWRhdGVGb3JtYXRzID0gWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcGVjaWZpZXI6ICIuJUwiLAogICAgICAgICAgICAgICAgcHJlZGljYXRlOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5nZXRNaWxsaXNlY29uZHMoKSAhPT0gMDsgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3BlY2lmaWVyOiAiOiVTIiwKICAgICAgICAgICAgICAgIHByZWRpY2F0ZTogZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQuZ2V0U2Vjb25kcygpICE9PSAwOyB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcGVjaWZpZXI6ICIlSTolTSIsCiAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldE1pbnV0ZXMoKSAhPT0gMDsgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3BlY2lmaWVyOiAiJUkgJXAiLAogICAgICAgICAgICAgICAgcHJlZGljYXRlOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5nZXRIb3VycygpICE9PSAwOyB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcGVjaWZpZXI6ICIlYSAlZCIsCiAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldERheSgpICE9PSAwICYmIGQuZ2V0RGF0ZSgpICE9PSAxOyB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzcGVjaWZpZXI6ICIlYiAlZCIsCiAgICAgICAgICAgICAgICBwcmVkaWNhdGU6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBkLmdldERhdGUoKSAhPT0gMTsgfSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgc3BlY2lmaWVyOiAiJWIiLAogICAgICAgICAgICAgICAgcHJlZGljYXRlOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5nZXRNb250aCgpICE9PSAwOyB9LAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHZhciBhY2NlcHRhYmxlRm9ybWF0cyA9IGNhbmRpZGF0ZUZvcm1hdHMuZmlsdGVyKGZ1bmN0aW9uIChjYW5kaWRhdGUpIHsgcmV0dXJuIGNhbmRpZGF0ZS5wcmVkaWNhdGUoZCk7IH0pOwogICAgICAgICAgICB2YXIgc3BlY2lmaWVyID0gYWNjZXB0YWJsZUZvcm1hdHMubGVuZ3RoID4gMAogICAgICAgICAgICAgICAgPyBhY2NlcHRhYmxlRm9ybWF0c1swXS5zcGVjaWZpZXIKICAgICAgICAgICAgICAgIDogIiVZIjsKICAgICAgICAgICAgcmV0dXJuIGQzLnRpbWVGb3JtYXQoc3BlY2lmaWVyKShkKTsKICAgICAgICB9OwogICAgfQogICAgZXhwb3J0cy5tdWx0aVRpbWUgPSBtdWx0aVRpbWU7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSB0aW1lIGZvcm1hdHRlciB0aGF0IGRpc3BsYXlzIHRpbWUvZGF0ZSB1c2luZyBnaXZlbiBzcGVjaWZpZXIuCiAgICAgKgogICAgICogTGlzdCBvZiBkaXJlY3RpdmVzIGNhbiBiZSBmb3VuZCBvbjogaHR0cHM6Ly9naXRodWIuY29tL21ib3N0b2NrL2QzL3dpa2kvVGltZS1Gb3JtYXR0aW5nI2Zvcm1hdAogICAgICoKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbc3BlY2lmaWVyXSBUaGUgc3BlY2lmaWVyIGZvciB0aGUgZm9ybWF0dGVyLgogICAgICogQHBhcmFtIHtib29sZWFufSBbdXNlVVRDXSBEaXNwbGF5cyB0aW1lIGluIFVUQyBpZiB0cnVlLCBsb2NhbCB0aW1lIGlmIGZhbHNlLiBEZWZhdWx0cyB0byBmYWxzZS4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7Rm9ybWF0dGVyfSBBIGZvcm1hdHRlciBmb3IgdGltZS9kYXRlIHZhbHVlcy4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZShzcGVjaWZpZXIsIHVzZVVUQykgewogICAgICAgIGlmICh1c2VVVEMgPT09IHZvaWQgMCkgeyB1c2VVVEMgPSBERUZBVUxUX1VTRV9VVEM7IH0KICAgICAgICBpZiAodXNlVVRDKSB7CiAgICAgICAgICAgIHJldHVybiBkMy51dGNGb3JtYXQoc3BlY2lmaWVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGQzLnRpbWVGb3JtYXQoc3BlY2lmaWVyKTsKICAgIH0KICAgIGV4cG9ydHMudGltZSA9IHRpbWU7CiAgICBmdW5jdGlvbiB2ZXJpZnlQcmVjaXNpb24ocHJlY2lzaW9uKSB7CiAgICAgICAgaWYgKHByZWNpc2lvbiA8IDAgfHwgcHJlY2lzaW9uID4gMjApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoIkZvcm1hdHRlciBwcmVjaXNpb24gbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwIik7CiAgICAgICAgfQogICAgICAgIGlmIChwcmVjaXNpb24gIT09IE1hdGguZmxvb3IocHJlY2lzaW9uKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigiRm9ybWF0dGVyIHByZWNpc2lvbiBtdXN0IGJlIGFuIGludGVnZXIiKTsKICAgICAgICB9CiAgICB9CiAgICB9KTsKCiAgICB2YXIgYXhpcyQyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgoKCgogICAgZXhwb3J0cy5BeGlzT3JpZW50YXRpb24gPSBtYWtlRW51bV8xLm1ha2VFbnVtKFsiYm90dG9tIiwgImxlZnQiLCAicmlnaHQiLCAidG9wIl0pOwogICAgdmFyIEF4aXMgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhBeGlzLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW4gQXhpcy4KICAgICAgICAgKiBBbiBBeGlzIGlzIGEgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgU2NhbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlfSBzY2FsZQogICAgICAgICAqIEBwYXJhbSB7QXhpc09yaWVudGF0aW9ufSBvcmllbnRhdGlvbiBPcmllbnRhdGlvbiBvZiB0aGlzIEF4aXMuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQXhpcyhzY2FsZSwgb3JpZW50YXRpb24pIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX2VuZFRpY2tMZW5ndGggPSA1OwogICAgICAgICAgICBfdGhpcy5faW5uZXJUaWNrTGVuZ3RoID0gNTsKICAgICAgICAgICAgX3RoaXMuX3RpY2tMYWJlbFBhZGRpbmcgPSAxMDsKICAgICAgICAgICAgX3RoaXMuX21hcmdpbiA9IDE1OwogICAgICAgICAgICBfdGhpcy5fc2hvd0VuZFRpY2tMYWJlbHMgPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuX2Fubm90YXRpb25zRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudCA9IDE7CiAgICAgICAgICAgIGlmIChzY2FsZSA9PSBudWxsIHx8IG9yaWVudGF0aW9uID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQXhpcyByZXF1aXJlcyBhIHNjYWxlIGFuZCBvcmllbnRhdGlvbiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF90aGlzLl9zY2FsZSA9IHNjYWxlOwogICAgICAgICAgICBfdGhpcy5vcmllbnRhdGlvbihvcmllbnRhdGlvbik7CiAgICAgICAgICAgIF90aGlzLl9zZXREZWZhdWx0QWxpZ25tZW50KCk7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJheGlzIik7CiAgICAgICAgICAgIGlmIChfdGhpcy5pc0hvcml6b250YWwoKSkgewogICAgICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoIngtYXhpcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoInktYXhpcyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF90aGlzLmZvcm1hdHRlcihmb3JtYXR0ZXJzLmlkZW50aXR5KCkpOwogICAgICAgICAgICBfdGhpcy5fcmVzY2FsZUNhbGxiYWNrID0gZnVuY3Rpb24gKG5ld1NjYWxlKSB7IHJldHVybiBfdGhpcy5fcmVzY2FsZSgpOyB9OwogICAgICAgICAgICBfdGhpcy5fc2NhbGUub25VcGRhdGUoX3RoaXMuX3Jlc2NhbGVDYWxsYmFjayk7CiAgICAgICAgICAgIF90aGlzLl9hbm5vdGF0ZWRUaWNrcyA9IFtdOwogICAgICAgICAgICBfdGhpcy5fYW5ub3RhdGlvbkZvcm1hdHRlciA9IGZvcm1hdHRlcnMuaWRlbnRpdHkoKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBBeGlzLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fc2NhbGUub2ZmVXBkYXRlKHRoaXMuX3Jlc2NhbGVDYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB0aWNrIGxhYmVsIGRhdGEgb24gYSBlbGVtZW50LiBFbGVtZW50IGluIGFyZ3VtZW50IG11c3QgYmUgYSBkZXNjZW5kZW50IG9mIGEgdGljayBsYWJlbCBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgQXhpcy5wcm90b3R5cGUudGlja0xhYmVsRGF0YU9uRWxlbWVudCA9IGZ1bmN0aW9uIChlbGVtZW50KSB7CiAgICAgICAgICAgIGlmIChlbGVtZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRpY2tMYWJlbDsKICAgICAgICAgICAgLy8gZ28gdXAgRE9NIHRyZWUgdG8gZmluZCB0aWNrIGxhYmVsIGVsZW1lbnQgaW4gYW5jZXN0b3IgZWxlbWVudHMKICAgICAgICAgICAgd2hpbGUgKChlbGVtZW50ICE9IG51bGwpICYmIChlbGVtZW50LmNsYXNzTGlzdCkgJiYgKHRpY2tMYWJlbCA9PT0gdW5kZWZpbmVkKSkgewogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2xhc3NMaXN0LmNvbnRhaW5zKEF4aXMuVElDS19MQUJFTF9DTEFTUykpIHsKICAgICAgICAgICAgICAgICAgICB0aWNrTGFiZWwgPSBlbGVtZW50OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZWxlbWVudCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogZDMuc2VsZWN0KGVsZW1lbnQpLmRhdHVtKCk7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5fY29tcHV0ZVdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzIGxvZ2ljCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTsKICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzIGxvZ2ljCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTsKICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLnJlcXVlc3RlZFNwYWNlID0gZnVuY3Rpb24gKG9mZmVyZWRXaWR0aCwgb2ZmZXJlZEhlaWdodCkgewogICAgICAgICAgICB2YXIgcmVxdWVzdGVkV2lkdGggPSAwOwogICAgICAgICAgICB2YXIgcmVxdWVzdGVkSGVpZ2h0ID0gMDsKICAgICAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RlZEhlaWdodCA9IHRoaXMuX2NvbXB1dGVIZWlnaHQoKSArIHRoaXMuX21hcmdpbjsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRpZXJIZWlnaHQgPSB0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCArIDIgKiBBeGlzLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSGVpZ2h0ICs9IHRpZXJIZWlnaHQgKiB0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlcXVlc3RlZFdpZHRoID0gdGhpcy5fY29tcHV0ZVdpZHRoKCkgKyB0aGlzLl9tYXJnaW47CiAgICAgICAgICAgICAgICBpZiAodGhpcy5hbm5vdGF0aW9uc0VuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgICAgIHZhciB0aWVySGVpZ2h0ID0gdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQgKyAyICogQXhpcy5fQU5OT1RBVElPTl9MQUJFTF9QQURESU5HOwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFdpZHRoICs9IHRpZXJIZWlnaHQgKiB0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWluV2lkdGg6IHJlcXVlc3RlZFdpZHRoLAogICAgICAgICAgICAgICAgbWluSGVpZ2h0OiByZXF1ZXN0ZWRIZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5maXhlZEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNIb3Jpem9udGFsKCk7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5maXhlZFdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuaXNIb3Jpem9udGFsKCk7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5fcmVzY2FsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbjsgc3ViY2xhc3NlcyBtYXkgY2FsbCByZWRyYXcoKSBoZXJlCiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLCBvcmlnaW4sIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2NhbGUucmFuZ2UoWzAsIHRoaXMud2lkdGgoKV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fc2NhbGUucmFuZ2UoW3RoaXMuaGVpZ2h0KCksIDBdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyID0gZnVuY3Rpb24gKGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpIHsKICAgICAgICAgICAgdmFyIHJlcXVlc3RlZFNwYWNlID0gdGhpcy5yZXF1ZXN0ZWRTcGFjZShhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KTsKICAgICAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVdpZHRoLAogICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBrZWVwIHRoZSBoZWlnaHQgdG8gYmUgd2hhdCB3ZSByZXF1ZXN0OyBBeGVzIHRlbGwgdGhlIG91dHNpZGUgd2hhdCBoZWlnaHQgdGhleSBhcmUuCiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBhbGxvd3MgYmx1ZXByaW50LWNoYXJ0IHRvIHB1dCB0aGUgQXhpcyBpbiBkb2N1bWVudCBmbG93IGJ5IHJlbW92aW5nIGFic29sdXRlIHBvc2l0aW9uaW5nCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByZXF1ZXN0ZWRTcGFjZS5taW5IZWlnaHQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGF2YWlsYWJsZUhlaWdodCwKICAgICAgICAgICAgICAgICAgICB3aWR0aDogcmVxdWVzdGVkU3BhY2UubWluV2lkdGgsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3RpY2tNYXJrQ29udGFpbmVyID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikKICAgICAgICAgICAgICAgIC5jbGFzc2VkKEF4aXMuVElDS19NQVJLX0NMQVNTICsgIi1jb250YWluZXIiLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikKICAgICAgICAgICAgICAgIC5jbGFzc2VkKEF4aXMuVElDS19MQUJFTF9DTEFTUyArICItY29udGFpbmVyIiwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX2Jhc2VsaW5lID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lciA9IHRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgiYW5ub3RhdGlvbi1jb250YWluZXIiLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxpbmUtY29udGFpbmVyIiwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1jaXJjbGUtY29udGFpbmVyIiwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZCgiYW5ub3RhdGlvbi1yZWN0LWNvbnRhaW5lciIsIHRydWUpOwogICAgICAgICAgICB2YXIgYW5ub3RhdGlvbkxhYmVsQ29udGFpbmVyID0gdGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5hcHBlbmQoImciKS5jbGFzc2VkKCJhbm5vdGF0aW9uLWxhYmVsLWNvbnRhaW5lciIsIHRydWUpOwogICAgICAgICAgICB2YXIgdHlwZXNldHRlckNvbnRleHQgPSBuZXcgc3JjJDEuU3ZnQ29udGV4dChhbm5vdGF0aW9uTGFiZWxDb250YWluZXIubm9kZSgpKTsKICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGlvbk1lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIodHlwZXNldHRlckNvbnRleHQpOwogICAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uV3JpdGVyID0gbmV3IHNyYyQxLldyaXRlcih0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIsIHR5cGVzZXR0ZXJDb250ZXh0KTsKICAgICAgICB9OwogICAgICAgIC8qCiAgICAgICAgICogRnVuY3Rpb24gZm9yIGdlbmVyYXRpbmcgdGljayB2YWx1ZXMgaW4gZGF0YS1zcGFjZSAoYXMgb3Bwb3NlZCB0byBwaXhlbCB2YWx1ZXMpLgogICAgICAgICAqIFRvIGJlIGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzZXMuCiAgICAgICAgICovCiAgICAgICAgQXhpcy5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlciB0aWNrIG1hcmtzLCBiYXNlbGluZSwgYW5kIGFubm90YXRpb25zLiBTaG91bGQgYmUgc3VwZXIgY2FsbGVkIGJ5IHN1YmNsYXNzZXMgYW5kIHRoZW4gb3ZlcnJpZGRlbiB0byBkcmF3CiAgICAgICAgICogb3RoZXIgcmVsZXZhbnQgYXNwZWN0cyBvZiB0aGlzIEF4aXMuCiAgICAgICAgICovCiAgICAgICAgQXhpcy5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB0aWNrTWFya1ZhbHVlcyA9IHRoaXMuX2dldFRpY2tWYWx1ZXMoKTsKICAgICAgICAgICAgdmFyIHRpY2tNYXJrc1VwZGF0ZSA9IHRoaXMuX3RpY2tNYXJrQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIgKyBBeGlzLlRJQ0tfTUFSS19DTEFTUykuZGF0YSh0aWNrTWFya1ZhbHVlcyk7CiAgICAgICAgICAgIHZhciB0aWNrTWFya3MgPSB0aWNrTWFya3NVcGRhdGUKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCJsaW5lIikKICAgICAgICAgICAgICAgIC5jbGFzc2VkKEF4aXMuVElDS19NQVJLX0NMQVNTLCB0cnVlKQogICAgICAgICAgICAgICAgLm1lcmdlKHRpY2tNYXJrc1VwZGF0ZSk7CiAgICAgICAgICAgIHRpY2tNYXJrcy5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKSk7CiAgICAgICAgICAgIGQzLnNlbGVjdCh0aWNrTWFya3Mubm9kZXMoKVswXSkuY2xhc3NlZChBeGlzLkVORF9USUNLX01BUktfQ0xBU1MsIHRydWUpCiAgICAgICAgICAgICAgICAuYXR0cnModGhpcy5fZ2VuZXJhdGVUaWNrTWFya0F0dHJIYXNoKHRydWUpKTsKICAgICAgICAgICAgZDMuc2VsZWN0KHRpY2tNYXJrcy5ub2RlcygpW3RpY2tNYXJrVmFsdWVzLmxlbmd0aCAtIDFdKS5jbGFzc2VkKEF4aXMuRU5EX1RJQ0tfTUFSS19DTEFTUywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5hdHRycyh0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2godHJ1ZSkpOwogICAgICAgICAgICB0aWNrTWFya3NVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl9iYXNlbGluZS5hdHRycyh0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKSk7CiAgICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFubm90YXRpb25zKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5hbm5vdGF0ZWRUaWNrcyA9IGZ1bmN0aW9uIChhbm5vdGF0ZWRUaWNrcykgewogICAgICAgICAgICBpZiAoYW5ub3RhdGVkVGlja3MgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRlZFRpY2tzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRlZFRpY2tzID0gYW5ub3RhdGVkVGlja3M7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuYW5ub3RhdGlvbkZvcm1hdHRlciA9IGZ1bmN0aW9uIChhbm5vdGF0aW9uRm9ybWF0dGVyKSB7CiAgICAgICAgICAgIGlmIChhbm5vdGF0aW9uRm9ybWF0dGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9uRm9ybWF0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25Gb3JtYXR0ZXIgPSBhbm5vdGF0aW9uRm9ybWF0dGVyOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLmFubm90YXRpb25zRW5hYmxlZCA9IGZ1bmN0aW9uIChhbm5vdGF0aW9uc0VuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKGFubm90YXRpb25zRW5hYmxlZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnNFbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25zRW5hYmxlZCA9IGFubm90YXRpb25zRW5hYmxlZDsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5hbm5vdGF0aW9uVGllckNvdW50ID0gZnVuY3Rpb24gKGFubm90YXRpb25UaWVyQ291bnQpIHsKICAgICAgICAgICAgaWYgKGFubm90YXRpb25UaWVyQ291bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25UaWVyQ291bnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFubm90YXRpb25UaWVyQ291bnQgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImFubm90YXRpb25UaWVyQ291bnQgY2Fubm90IGJlIG5lZ2F0aXZlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGlvblRpZXJDb3VudCA9IGFubm90YXRpb25UaWVyQ291bnQ7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuX2RyYXdBbm5vdGF0aW9ucyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGxhYmVsUGFkZGluZyA9IEF4aXMuX0FOTk9UQVRJT05fTEFCRUxfUEFERElORzsKICAgICAgICAgICAgdmFyIG1lYXN1cmVtZW50cyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgICAgICB2YXIgYW5ub3RhdGVkVGlja3MgPSB0aGlzLl9hbm5vdGF0ZWRUaWNrc1RvUmVuZGVyKCk7CiAgICAgICAgICAgIGFubm90YXRlZFRpY2tzLmZvckVhY2goZnVuY3Rpb24gKGFubm90YXRlZFRpY2spIHsKICAgICAgICAgICAgICAgIHZhciBtZWFzdXJlbWVudCA9IF90aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZShfdGhpcy5hbm5vdGF0aW9uRm9ybWF0dGVyKCkoYW5ub3RhdGVkVGljaykpOwogICAgICAgICAgICAgICAgdmFyIHBhZGRlZE1lYXN1cmVtZW50ID0gewogICAgICAgICAgICAgICAgICAgIHdpZHRoOiBtZWFzdXJlbWVudC53aWR0aCArIDIgKiBsYWJlbFBhZGRpbmcsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBtZWFzdXJlbWVudC5oZWlnaHQgKyAyICogbGFiZWxQYWRkaW5nLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIG1lYXN1cmVtZW50cy5zZXQoYW5ub3RhdGVkVGljaywgcGFkZGVkTWVhc3VyZW1lbnQpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHRpZXJIZWlnaHQgPSB0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCArIDIgKiBsYWJlbFBhZGRpbmc7CiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uVG9UaWVyID0gdGhpcy5fYW5ub3RhdGlvblRvVGllcihtZWFzdXJlbWVudHMpOwogICAgICAgICAgICB2YXIgaGlkZGVuQW5ub3RhdGlvbnMgPSBuZXcgdXRpbHMkMS5TZXQoKTsKICAgICAgICAgICAgdmFyIGF4aXNIZWlnaHQgPSB0aGlzLmlzSG9yaXpvbnRhbCgpID8gdGhpcy5oZWlnaHQoKSA6IHRoaXMud2lkdGgoKTsKICAgICAgICAgICAgdmFyIGF4aXNIZWlnaHRXaXRob3V0TWFyZ2luQW5kQW5ub3RhdGlvbnMgPSB0aGlzLl9jb3JlU2l6ZSgpOwogICAgICAgICAgICB2YXIgbnVtVGllcnMgPSBNYXRoLm1pbih0aGlzLmFubm90YXRpb25UaWVyQ291bnQoKSwgTWF0aC5mbG9vcigoYXhpc0hlaWdodCAtIGF4aXNIZWlnaHRXaXRob3V0TWFyZ2luQW5kQW5ub3RhdGlvbnMpIC8gdGllckhlaWdodCkpOwogICAgICAgICAgICBhbm5vdGF0aW9uVG9UaWVyLmZvckVhY2goZnVuY3Rpb24gKHRpZXIsIGFubm90YXRpb24pIHsKICAgICAgICAgICAgICAgIGlmICh0aWVyID09PSAtMSB8fCB0aWVyID49IG51bVRpZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgaGlkZGVuQW5ub3RhdGlvbnMuYWRkKGFubm90YXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGJpbmRFbGVtZW50cyA9IGZ1bmN0aW9uIChzZWxlY3Rpb24sIGVsZW1lbnROYW1lLCBjbGFzc05hbWUpIHsKICAgICAgICAgICAgICAgIHZhciBlbGVtZW50c1VwZGF0ZSA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoIi4iICsgY2xhc3NOYW1lKS5kYXRhKGFubm90YXRlZFRpY2tzKTsKICAgICAgICAgICAgICAgIHZhciBlbGVtZW50cyA9IGVsZW1lbnRzVXBkYXRlCiAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGVsZW1lbnROYW1lKQogICAgICAgICAgICAgICAgICAgIC5jbGFzc2VkKGNsYXNzTmFtZSwgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAubWVyZ2UoZWxlbWVudHNVcGRhdGUpOwogICAgICAgICAgICAgICAgZWxlbWVudHNVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnRzOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgb2Zmc2V0RiA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKF90aGlzLm9yaWVudGF0aW9uKCkpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICAgICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25Ub1RpZXIuZ2V0KGQpICogdGllckhlaWdodCArIGF4aXNIZWlnaHRXaXRob3V0TWFyZ2luQW5kQW5ub3RhdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgICAgICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF4aXNIZWlnaHQgLSBheGlzSGVpZ2h0V2l0aG91dE1hcmdpbkFuZEFubm90YXRpb25zIC0gYW5ub3RhdGlvblRvVGllci5nZXQoZCkgKiB0aWVySGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcG9zaXRpb25GID0gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIF90aGlzLl9zY2FsZS5zY2FsZShkKTsgfTsKICAgICAgICAgICAgdmFyIHZpc2liaWxpdHlGID0gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGhpZGRlbkFubm90YXRpb25zLmhhcyhkKSA/ICJoaWRkZW4iIDogInZpc2libGUiOyB9OwogICAgICAgICAgICB2YXIgc2Vjb25kYXJ5UG9zaXRpb247CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5vcmllbnRhdGlvbigpKSB7CiAgICAgICAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5UG9zaXRpb24gPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5UG9zaXRpb24gPSB0aGlzLndpZHRoKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlzSG9yaXpvbnRhbCA9IHRoaXMuaXNIb3Jpem9udGFsKCk7CiAgICAgICAgICAgIGJpbmRFbGVtZW50cyh0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdCgiLmFubm90YXRpb24tbGluZS1jb250YWluZXIiKSwgImxpbmUiLCBBeGlzLkFOTk9UQVRJT05fTElORV9DTEFTUykKICAgICAgICAgICAgICAgIC5hdHRycyh7CiAgICAgICAgICAgICAgICB4MTogaXNIb3Jpem9udGFsID8gcG9zaXRpb25GIDogc2Vjb25kYXJ5UG9zaXRpb24sCiAgICAgICAgICAgICAgICB4MjogaXNIb3Jpem9udGFsID8gcG9zaXRpb25GIDogb2Zmc2V0RiwKICAgICAgICAgICAgICAgIHkxOiBpc0hvcml6b250YWwgPyBzZWNvbmRhcnlQb3NpdGlvbiA6IHBvc2l0aW9uRiwKICAgICAgICAgICAgICAgIHkyOiBpc0hvcml6b250YWwgPyBvZmZzZXRGIDogcG9zaXRpb25GLAogICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eUYsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBiaW5kRWxlbWVudHModGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLWNpcmNsZS1jb250YWluZXIiKSwgImNpcmNsZSIsIEF4aXMuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1MpCiAgICAgICAgICAgICAgICAuYXR0cnMoewogICAgICAgICAgICAgICAgY3g6IGlzSG9yaXpvbnRhbCA/IHBvc2l0aW9uRiA6IHNlY29uZGFyeVBvc2l0aW9uLAogICAgICAgICAgICAgICAgY3k6IGlzSG9yaXpvbnRhbCA/IHNlY29uZGFyeVBvc2l0aW9uIDogcG9zaXRpb25GLAogICAgICAgICAgICAgICAgcjogMywKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciByZWN0YW5nbGVPZmZzZXRGID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAoX3RoaXMub3JpZW50YXRpb24oKSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICAgICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0RihkKTsKICAgICAgICAgICAgICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgICAgICAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2Zmc2V0RihkKSAtIG1lYXN1cmVtZW50cy5nZXQoZCkuaGVpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBiaW5kRWxlbWVudHModGhpcy5fYW5ub3RhdGlvbkNvbnRhaW5lci5zZWxlY3QoIi5hbm5vdGF0aW9uLXJlY3QtY29udGFpbmVyIiksICJyZWN0IiwgQXhpcy5BTk5PVEFUSU9OX1JFQ1RfQ0xBU1MpCiAgICAgICAgICAgICAgICAuYXR0cnMoewogICAgICAgICAgICAgICAgeDogaXNIb3Jpem9udGFsID8gcG9zaXRpb25GIDogcmVjdGFuZ2xlT2Zmc2V0RiwKICAgICAgICAgICAgICAgIHk6IGlzSG9yaXpvbnRhbCA/IHJlY3RhbmdsZU9mZnNldEYgOiBwb3NpdGlvbkYsCiAgICAgICAgICAgICAgICB3aWR0aDogaXNIb3Jpem9udGFsID8gZnVuY3Rpb24gKGQpIHsgcmV0dXJuIG1lYXN1cmVtZW50cy5nZXQoZCkud2lkdGg7IH0gOiBmdW5jdGlvbiAoZCkgeyByZXR1cm4gbWVhc3VyZW1lbnRzLmdldChkKS5oZWlnaHQ7IH0sCiAgICAgICAgICAgICAgICBoZWlnaHQ6IGlzSG9yaXpvbnRhbCA/IGZ1bmN0aW9uIChkKSB7IHJldHVybiBtZWFzdXJlbWVudHMuZ2V0KGQpLmhlaWdodDsgfSA6IGZ1bmN0aW9uIChkKSB7IHJldHVybiBtZWFzdXJlbWVudHMuZ2V0KGQpLndpZHRoOyB9LAogICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogdmlzaWJpbGl0eUYsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgYW5ub3RhdGlvbldyaXRlciA9IHRoaXMuX2Fubm90YXRpb25Xcml0ZXI7CiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uRm9ybWF0dGVyID0gdGhpcy5hbm5vdGF0aW9uRm9ybWF0dGVyKCk7CiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uTGFiZWxzID0gYmluZEVsZW1lbnRzKHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0KCIuYW5ub3RhdGlvbi1sYWJlbC1jb250YWluZXIiKSwgImciLCBBeGlzLkFOTk9UQVRJT05fTEFCRUxfQ0xBU1MpOwogICAgICAgICAgICBhbm5vdGF0aW9uTGFiZWxzLnNlbGVjdEFsbCgiLnRleHQtY29udGFpbmVyIikucmVtb3ZlKCk7CiAgICAgICAgICAgIGFubm90YXRpb25MYWJlbHMuYXR0cnMoewogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHZhciB4VHJhbnNsYXRlID0gaXNIb3Jpem9udGFsID8gcG9zaXRpb25GKGQpIDogcmVjdGFuZ2xlT2Zmc2V0RihkKTsKICAgICAgICAgICAgICAgICAgICB2YXIgeVRyYW5zbGF0ZSA9IGlzSG9yaXpvbnRhbCA/IHJlY3RhbmdsZU9mZnNldEYoZCkgOiBwb3NpdGlvbkYoZCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoIiArIHhUcmFuc2xhdGUgKyAiLCIgKyB5VHJhbnNsYXRlICsgIikiOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIHZpc2liaWxpdHk6IHZpc2liaWxpdHlGLAogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGFubm90YXRpb25MYWJlbCkgewogICAgICAgICAgICAgICAgYW5ub3RhdGlvbldyaXRlci53cml0ZShhbm5vdGF0aW9uRm9ybWF0dGVyKGFubm90YXRpb25MYWJlbCksIGlzSG9yaXpvbnRhbCA/IG1lYXN1cmVtZW50cy5nZXQoYW5ub3RhdGlvbkxhYmVsKS53aWR0aCA6IG1lYXN1cmVtZW50cy5nZXQoYW5ub3RhdGlvbkxhYmVsKS5oZWlnaHQsIGlzSG9yaXpvbnRhbCA/IG1lYXN1cmVtZW50cy5nZXQoYW5ub3RhdGlvbkxhYmVsKS5oZWlnaHQgOiBtZWFzdXJlbWVudHMuZ2V0KGFubm90YXRpb25MYWJlbCkud2lkdGgsIHsKICAgICAgICAgICAgICAgICAgICB4QWxpZ246ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAgIHlBbGlnbjogImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgdGV4dFJvdGF0aW9uOiBpc0hvcml6b250YWwgPyAwIDogOTAsCiAgICAgICAgICAgICAgICB9LCBkMy5zZWxlY3QodGhpcykubm9kZSgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5fYW5ub3RhdGVkVGlja3NUb1JlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHNjYWxlUmFuZ2UgPSB0aGlzLl9zY2FsZS5yYW5nZSgpOwogICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5BcnJheS51bmlxKHRoaXMuYW5ub3RhdGVkVGlja3MoKS5maWx0ZXIoZnVuY3Rpb24gKHRpY2spIHsKICAgICAgICAgICAgICAgIGlmICh0aWNrID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5NYXRoLmluUmFuZ2UoX3RoaXMuX3NjYWxlLnNjYWxlKHRpY2spLCBzY2FsZVJhbmdlWzBdLCBzY2FsZVJhbmdlWzFdKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBzaXplIG9mIHRoZSBjb3JlIHBpZWNlcy4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBjb3JlIHBpZWNlcyBpbmNsdWRlIHRoZSBsYWJlbHMsIHRoZSBlbmQgdGljayBtYXJrcywgdGhlIGlubmVyIHRpY2sgbWFya3MsIGFuZCB0aGUgdGljayBsYWJlbCBwYWRkaW5nLgogICAgICAgICAqLwogICAgICAgIEF4aXMucHJvdG90eXBlLl9jb3JlU2l6ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHJlbGV2YW50RGltZW5zaW9uID0gdGhpcy5pc0hvcml6b250YWwoKSA/IHRoaXMuaGVpZ2h0KCkgOiB0aGlzLndpZHRoKCk7CiAgICAgICAgICAgIHZhciBheGlzSGVpZ2h0V2l0aG91dE1hcmdpbiA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLl9jb21wdXRlSGVpZ2h0KCkgOiB0aGlzLl9jb21wdXRlV2lkdGgoKTsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKGF4aXNIZWlnaHRXaXRob3V0TWFyZ2luLCByZWxldmFudERpbWVuc2lvbik7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5fYW5ub3RhdGlvblRpZXJIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodCArIDIgKiBBeGlzLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkc7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5fYW5ub3RhdGlvblRvVGllciA9IGZ1bmN0aW9uIChtZWFzdXJlbWVudHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGFubm90YXRpb25UaWVycyA9IFtbXV07CiAgICAgICAgICAgIHZhciBhbm5vdGF0aW9uVG9UaWVyID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHZhciBkaW1lbnNpb24gPSB0aGlzLmlzSG9yaXpvbnRhbCgpID8gdGhpcy53aWR0aCgpIDogdGhpcy5oZWlnaHQoKTsKICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGVkVGlja3NUb1JlbmRlcigpLmZvckVhY2goZnVuY3Rpb24gKGFubm90YXRlZFRpY2spIHsKICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvbiA9IF90aGlzLl9zY2FsZS5zY2FsZShhbm5vdGF0ZWRUaWNrKTsKICAgICAgICAgICAgICAgIHZhciBsZW5ndGggPSBtZWFzdXJlbWVudHMuZ2V0KGFubm90YXRlZFRpY2spLndpZHRoOwogICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgMCB8fCBwb3NpdGlvbiArIGxlbmd0aCA+IGRpbWVuc2lvbikgewogICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25Ub1RpZXIuc2V0KGFubm90YXRlZFRpY2ssIC0xKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdGllckhhc0NvbGxpc2lvbiA9IGZ1bmN0aW9uICh0ZXN0VGllcikgeyByZXR1cm4gYW5ub3RhdGlvblRpZXJzW3Rlc3RUaWVyXS5zb21lKGZ1bmN0aW9uICh0ZXN0VGljaykgewogICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0UG9zaXRpb24gPSBfdGhpcy5fc2NhbGUuc2NhbGUodGVzdFRpY2spOwogICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0TGVuZ3RoID0gbWVhc3VyZW1lbnRzLmdldCh0ZXN0VGljaykud2lkdGg7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uICsgbGVuZ3RoID49IHRlc3RQb3NpdGlvbiAmJiBwb3NpdGlvbiA8PSB0ZXN0UG9zaXRpb24gKyB0ZXN0TGVuZ3RoOwogICAgICAgICAgICAgICAgfSk7IH07CiAgICAgICAgICAgICAgICB2YXIgdGllciA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAodGllckhhc0NvbGxpc2lvbih0aWVyKSkgewogICAgICAgICAgICAgICAgICAgIHRpZXIrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvblRpZXJzLmxlbmd0aCA9PT0gdGllcikgewogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVGllcnMucHVzaChbXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYW5ub3RhdGlvblRpZXJzW3RpZXJdLnB1c2goYW5ub3RhdGVkVGljayk7CiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVG9UaWVyLnNldChhbm5vdGF0ZWRUaWNrLCB0aWVyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uVG9UaWVyOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuX3JlbW92ZUFubm90YXRpb25zID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tbGluZSIpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uQ29udGFpbmVyLnNlbGVjdEFsbCgiLmFubm90YXRpb24tY2lyY2xlIikucmVtb3ZlKCk7CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1yZWN0IikucmVtb3ZlKCk7CiAgICAgICAgICAgIHRoaXMuX2Fubm90YXRpb25Db250YWluZXIuc2VsZWN0QWxsKCIuYW5ub3RhdGlvbi1sYWJlbCIpLnJlbW92ZSgpOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuX2dlbmVyYXRlQmFzZWxpbmVBdHRySGFzaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGJhc2VsaW5lQXR0ckhhc2ggPSB7CiAgICAgICAgICAgICAgICB4MTogMCwKICAgICAgICAgICAgICAgIHkxOiAwLAogICAgICAgICAgICAgICAgeDI6IDAsCiAgICAgICAgICAgICAgICB5MjogMCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgc3dpdGNoICh0aGlzLl9vcmllbnRhdGlvbikgewogICAgICAgICAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgICAgICAgICAgICBiYXNlbGluZUF0dHJIYXNoWyJ4MiJdID0gdGhpcy53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgICAgICAgICAgICBiYXNlbGluZUF0dHJIYXNoWyJ4MiJdID0gdGhpcy53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lQXR0ckhhc2hbInkxIl0gPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lQXR0ckhhc2hbInkyIl0gPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICAgICAgICAgICAgYmFzZWxpbmVBdHRySGFzaFsieDEiXSA9IHRoaXMud2lkdGgoKTsKICAgICAgICAgICAgICAgICAgICBiYXNlbGluZUF0dHJIYXNoWyJ4MiJdID0gdGhpcy53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lQXR0ckhhc2hbInkyIl0gPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgICAgICAgICAgIGJhc2VsaW5lQXR0ckhhc2hbInkyIl0gPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBiYXNlbGluZUF0dHJIYXNoOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCA9IGZ1bmN0aW9uIChpc0VuZFRpY2tNYXJrKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmIChpc0VuZFRpY2tNYXJrID09PSB2b2lkIDApIHsgaXNFbmRUaWNrTWFyayA9IGZhbHNlOyB9CiAgICAgICAgICAgIHZhciB0aWNrTWFya0F0dHJIYXNoID0gewogICAgICAgICAgICAgICAgeDE6IDAsCiAgICAgICAgICAgICAgICB5MTogMCwKICAgICAgICAgICAgICAgIHgyOiAwLAogICAgICAgICAgICAgICAgeTI6IDAsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBzY2FsaW5nRnVuY3Rpb24gPSBmdW5jdGlvbiAoZCkgeyByZXR1cm4gX3RoaXMuX3NjYWxlLnNjYWxlKGQpOyB9OwogICAgICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkgewogICAgICAgICAgICAgICAgdGlja01hcmtBdHRySGFzaFsieDEiXSA9IHNjYWxpbmdGdW5jdGlvbjsKICAgICAgICAgICAgICAgIHRpY2tNYXJrQXR0ckhhc2hbIngyIl0gPSBzY2FsaW5nRnVuY3Rpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aWNrTWFya0F0dHJIYXNoWyJ5MSJdID0gc2NhbGluZ0Z1bmN0aW9uOwogICAgICAgICAgICAgICAgdGlja01hcmtBdHRySGFzaFsieTIiXSA9IHNjYWxpbmdGdW5jdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGlja0xlbmd0aCA9IGlzRW5kVGlja01hcmsgPyB0aGlzLl9lbmRUaWNrTGVuZ3RoIDogdGhpcy5faW5uZXJUaWNrTGVuZ3RoOwogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX29yaWVudGF0aW9uKSB7CiAgICAgICAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICAgICAgICAgIHRpY2tNYXJrQXR0ckhhc2hbInkyIl0gPSB0aWNrTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAidG9wIjoKICAgICAgICAgICAgICAgICAgICB0aWNrTWFya0F0dHJIYXNoWyJ5MSJdID0gdGhpcy5oZWlnaHQoKTsKICAgICAgICAgICAgICAgICAgICB0aWNrTWFya0F0dHJIYXNoWyJ5MiJdID0gdGhpcy5oZWlnaHQoKSAtIHRpY2tMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJsZWZ0IjoKICAgICAgICAgICAgICAgICAgICB0aWNrTWFya0F0dHJIYXNoWyJ4MSJdID0gdGhpcy53aWR0aCgpOwogICAgICAgICAgICAgICAgICAgIHRpY2tNYXJrQXR0ckhhc2hbIngyIl0gPSB0aGlzLndpZHRoKCkgLSB0aWNrTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgICAgICAgICAgIHRpY2tNYXJrQXR0ckhhc2hbIngyIl0gPSB0aWNrTGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aWNrTWFya0F0dHJIYXNoOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuX3NldERlZmF1bHRBbGlnbm1lbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fb3JpZW50YXRpb24pIHsKICAgICAgICAgICAgICAgIGNhc2UgImJvdHRvbSI6CiAgICAgICAgICAgICAgICAgICAgdGhpcy55QWxpZ25tZW50KCJ0b3AiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgICAgICAgICAgICAgdGhpcy55QWxpZ25tZW50KCJib3R0b20iKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgICAgICAgICAgIHRoaXMueEFsaWdubWVudCgicmlnaHQiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICAgICAgICAgICAgICB0aGlzLnhBbGlnbm1lbnQoImxlZnQiKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHdoZXRoZXIgdGhpcyBheGlzIGlzIGhvcml6b250YWwgKG9yaWVudGF0aW9uIGlzICJ0b3AiIG9yICJib3R0b20iKSBvciB2ZXJ0aWNhbC4KICAgICAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSB0cnVlIGZvciBob3Jpem9udGFsLCBmYWxzZSBmb3IgdmVydGljYWwuCiAgICAgICAgICovCiAgICAgICAgQXhpcy5wcm90b3R5cGUuaXNIb3Jpem9udGFsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb24gPT09ICJ0b3AiIHx8IHRoaXMuX29yaWVudGF0aW9uID09PSAiYm90dG9tIjsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldCB0aGUgc2NhbGUgdGhhdCB0aGlzIGF4aXMgaXMgYXNzb2NpYXRlZCB3aXRoLgogICAgICAgICAqIEByZXR1cm5zIHtTY2FsZTxELCBudW1iZXI+fQogICAgICAgICAqLwogICAgICAgIEF4aXMucHJvdG90eXBlLmdldFNjYWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2NhbGU7CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5mb3JtYXR0ZXIgPSBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7CiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Zvcm1hdHRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXI7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuaW5uZXJUaWNrTGVuZ3RoID0gZnVuY3Rpb24gKGxlbmd0aCkgewogICAgICAgICAgICBpZiAobGVuZ3RoID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbm5lclRpY2tMZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoIDwgMCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaW5uZXIgdGljayBsZW5ndGggbXVzdCBiZSBwb3NpdGl2ZSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5faW5uZXJUaWNrTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5lbmRUaWNrTGVuZ3RoID0gZnVuY3Rpb24gKGxlbmd0aCkgewogICAgICAgICAgICBpZiAobGVuZ3RoID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmRUaWNrTGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8IDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImVuZCB0aWNrIGxlbmd0aCBtdXN0IGJlIHBvc2l0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9lbmRUaWNrTGVuZ3RoID0gbGVuZ3RoOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIHBpeGVsIGxlbmd0aCBvdmVyIGFsbCB0aWNrcyBvbiB0aGlzIGF4aXMuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0KICAgICAgICAgKi8KICAgICAgICBBeGlzLnByb3RvdHlwZS5fbWF4TGFiZWxUaWNrTGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5zaG93RW5kVGlja0xhYmVscygpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5pbm5lclRpY2tMZW5ndGgoKSwgdGhpcy5lbmRUaWNrTGVuZ3RoKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5uZXJUaWNrTGVuZ3RoKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLnRpY2tMYWJlbFBhZGRpbmcgPSBmdW5jdGlvbiAocGFkZGluZykgewogICAgICAgICAgICBpZiAocGFkZGluZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGlja0xhYmVsUGFkZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChwYWRkaW5nIDwgMCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidGljayBsYWJlbCBwYWRkaW5nIG11c3QgYmUgcG9zaXRpdmUiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tMYWJlbFBhZGRpbmcgPSBwYWRkaW5nOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5tYXJnaW4gPSBmdW5jdGlvbiAoc2l6ZSkgewogICAgICAgICAgICBpZiAoc2l6ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFyZ2luOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHNpemUgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXJnaW4gc2l6ZSBtdXN0IGJlIHBvc2l0aXZlIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9tYXJnaW4gPSBzaXplOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBBeGlzLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uIChvcmllbnRhdGlvbikgewogICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gZW5zdXJlIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBvbGRlciB2ZXJzaW9ucyB0aGF0IHN1cHBseSBvcmllbnRhdGlvbiBpbiBkaWZmZXJlbnQgY2FzZXMKICAgICAgICAgICAgICAgIHZhciBuZXdPcmllbnRhdGlvbkxDID0gb3JpZW50YXRpb24udG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgIGlmIChuZXdPcmllbnRhdGlvbkxDICE9PSAidG9wIiAmJgogICAgICAgICAgICAgICAgICAgIG5ld09yaWVudGF0aW9uTEMgIT09ICJib3R0b20iICYmCiAgICAgICAgICAgICAgICAgICAgbmV3T3JpZW50YXRpb25MQyAhPT0gImxlZnQiICYmCiAgICAgICAgICAgICAgICAgICAgbmV3T3JpZW50YXRpb25MQyAhPT0gInJpZ2h0IikgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigidW5zdXBwb3J0ZWQgb3JpZW50YXRpb24iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gbmV3T3JpZW50YXRpb25MQzsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuc2hvd0VuZFRpY2tMYWJlbHMgPSBmdW5jdGlvbiAoc2hvdykgewogICAgICAgICAgICBpZiAoc2hvdyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2hvd0VuZFRpY2tMYWJlbHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc2hvd0VuZFRpY2tMYWJlbHMgPSBzaG93OwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLl9zaG93QWxsVGlja01hcmtzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iICsgQXhpcy5USUNLX01BUktfQ0xBU1MpCiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIEF4aXMucHJvdG90eXBlLl9zaG93QWxsVGlja0xhYmVscyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIgKyBBeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpCiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlc3BvbnNpYmxlIGZvciBoaWRpbmcgYW55IHRpY2sgbGFiZWxzIHRoYXQgYnJlYWsgb3V0IG9mIHRoZSBib3VuZGluZwogICAgICAgICAqIGNvbnRhaW5lci4KICAgICAgICAgKi8KICAgICAgICBBeGlzLnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGlja0xhYmVscyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gdGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB2YXIgdGlja0xhYmVscyA9IHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5zZWxlY3RBbGwoIi4iICsgQXhpcy5USUNLX0xBQkVMX0NMQVNTKTsKICAgICAgICAgICAgaWYgKHRpY2tMYWJlbHMuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRpY2tMYWJlbHMuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgaWYgKCF1dGlscyQxLkRPTS5jbGllbnRSZWN0SW5zaWRlKHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGJvdW5kaW5nQm94KSkgewogICAgICAgICAgICAgICAgICAgIGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgVGljayBNYXJrcyB3aGljaCBoYXZlIG5vIGNvcnJlc3BvbmRpbmcgVGljayBMYWJlbHMKICAgICAgICAgKi8KICAgICAgICBBeGlzLnByb3RvdHlwZS5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHZpc2libGVUaWNrTWFya3MgPSB0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iICsgQXhpcy5USUNLX01BUktfQ0xBU1MpOwogICAgICAgICAgICB2YXIgdmlzaWJsZVRpY2tMYWJlbHMgPSB0aGlzLl90aWNrTGFiZWxDb250YWluZXIKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoIi4iICsgQXhpcy5USUNLX0xBQkVMX0NMQVNTKQogICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgdmFyIHZpc2liaWxpdHkgPSBkMy5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTsKICAgICAgICAgICAgICAgIHJldHVybiAodmlzaWJpbGl0eSA9PT0gImluaGVyaXQiKSB8fCAodmlzaWJpbGl0eSA9PT0gInZpc2libGUiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBsYWJlbE51bWJlcnNTaG93biA9IHZpc2libGVUaWNrTGFiZWxzLmRhdGEoKTsKICAgICAgICAgICAgdmlzaWJsZVRpY2tNYXJrcy5lYWNoKGZ1bmN0aW9uIChlLCBpKSB7CiAgICAgICAgICAgICAgICBpZiAobGFiZWxOdW1iZXJzU2hvd24uaW5kZXhPZihlKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBkMy5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgQXhpcy5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uTWVhc3VyZXIucmVzZXQoKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjc3MgY2xhc3MgYXBwbGllZCB0byBlYWNoIGVuZCB0aWNrIG1hcmsgKHRoZSBsaW5lIG9uIHRoZSBlbmQgdGljaykuCiAgICAgICAgICovCiAgICAgICAgQXhpcy5FTkRfVElDS19NQVJLX0NMQVNTID0gImVuZC10aWNrLW1hcmsiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjc3MgY2xhc3MgYXBwbGllZCB0byBlYWNoIHRpY2sgbWFyayAodGhlIGxpbmUgb24gdGhlIHRpY2spLgogICAgICAgICAqLwogICAgICAgIEF4aXMuVElDS19NQVJLX0NMQVNTID0gInRpY2stbWFyayI7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNzcyBjbGFzcyBhcHBsaWVkIHRvIGVhY2ggdGljayBsYWJlbCAodGhlIHRleHQgYXNzb2NpYXRlZCB3aXRoIHRoZSB0aWNrKS4KICAgICAgICAgKi8KICAgICAgICBBeGlzLlRJQ0tfTEFCRUxfQ0xBU1MgPSAidGljay1sYWJlbCI7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNzcyBjbGFzcyBhcHBsaWVkIHRvIGVhY2ggYW5ub3RhdGlvbiBsaW5lLCB3aGljaCBleHRlbmRzIGZyb20gdGhlIGF4aXMgdG8gdGhlIHJlY3QuCiAgICAgICAgICovCiAgICAgICAgQXhpcy5BTk5PVEFUSU9OX0xJTkVfQ0xBU1MgPSAiYW5ub3RhdGlvbi1saW5lIjsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3NzIGNsYXNzIGFwcGxpZWQgdG8gZWFjaCBhbm5vdGF0aW9uIHJlY3QsIHdoaWNoIHN1cnJvdW5kcyB0aGUgYW5ub3RhdGlvbiBsYWJlbC4KICAgICAgICAgKi8KICAgICAgICBBeGlzLkFOTk9UQVRJT05fUkVDVF9DTEFTUyA9ICJhbm5vdGF0aW9uLXJlY3QiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjc3MgY2xhc3MgYXBwbGllZCB0byBlYWNoIGFubm90YXRpb24gY2lyY2xlLCB3aGljaCBkZW5vdGVzIHdoaWNoIHRpY2sgaXMgYmVpbmcgYW5ub3RhdGVkLgogICAgICAgICAqLwogICAgICAgIEF4aXMuQU5OT1RBVElPTl9DSVJDTEVfQ0xBU1MgPSAiYW5ub3RhdGlvbi1jaXJjbGUiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjc3MgY2xhc3MgYXBwbGllZCB0byBlYWNoIGFubm90YXRpb24gbGFiZWwsIHdoaWNoIHNob3dzIHRoZSBmb3JtYXR0ZWQgYW5ub3RhdGlvbiB0ZXh0LgogICAgICAgICAqLwogICAgICAgIEF4aXMuQU5OT1RBVElPTl9MQUJFTF9DTEFTUyA9ICJhbm5vdGF0aW9uLWxhYmVsIjsKICAgICAgICBBeGlzLl9BTk5PVEFUSU9OX0xBQkVMX1BBRERJTkcgPSA0OwogICAgICAgIHJldHVybiBBeGlzOwogICAgfShjb21wb25lbnQuQ29tcG9uZW50KSk7CiAgICBleHBvcnRzLkF4aXMgPSBBeGlzOwogICAgfSk7CgogICAgdmFyIGNhdGVnb3J5QXhpcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgogICAgdmFyIENhdGVnb3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoQ2F0ZWdvcnksIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIENhdGVnb3J5IEF4aXMuCiAgICAgICAgICoKICAgICAgICAgKiBBIENhdGVnb3J5IEF4aXMgaXMgYSB2aXN1YWwgcmVwcmVzZW50YXRpb24gb2YgYSBDYXRlZ29yeSBTY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7U2NhbGVzLkNhdGVnb3J5fSBzY2FsZQogICAgICAgICAqIEBwYXJhbSB7QXhpc09yaWVudGF0aW9ufSBbb3JpZW50YXRpb249ImJvdHRvbSJdIE9yaWVudGF0aW9uIG9mIHRoaXMgQ2F0ZWdvcnkgQXhpcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBDYXRlZ29yeShzY2FsZSwgb3JpZW50YXRpb24pIHsKICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSB2b2lkIDApIHsgb3JpZW50YXRpb24gPSAiYm90dG9tIjsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2FsZSwgb3JpZW50YXRpb24pIHx8IHRoaXM7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgcm90YXRpb24gYW5nbGUgb2YgdGljayBsYWJlbCB0ZXh0LiBPbmx5IDAsIDkwLCAtOTAgYXJlIHN1cHBvcnRlZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3RoaXMuX3RpY2tMYWJlbEFuZ2xlID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBzaGVhciBhbmdsZSBvZiB0aGUgdGljayBsYWJlbCB0ZXh0LiBPbmx5IHZhbHVlcyAtODAgPD0geCA8PSA4MCBhcmUgc3VwcG9ydGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZSA9IDA7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJjYXRlZ29yeS1heGlzIik7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KENhdGVnb3J5LnByb3RvdHlwZSwgIl93cmFwcGVyIiwgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBXcmFwcGVyIGNvbmZpZ3VyZWQgYWNjb3JkaW5nIHRvIHRoZSBvdGhlciBwcm9wZXJ0aWVzIG9uIHRoaXMgYXhpcy4KICAgICAgICAgICAgICogQHJldHVybnMge1R5cGVzZXR0YWJsZS5XcmFwcGVyfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgd3JhcHBlciA9IG5ldyBzcmMkMS5XcmFwcGVyKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGlja0xhYmVsTWF4TGluZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHdyYXBwZXIubWF4TGluZXModGhpcy5fdGlja0xhYmVsTWF4TGluZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHdyYXBwZXI7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShDYXRlZ29yeS5wcm90b3R5cGUsICJfd3JpdGVyIiwgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBXcml0ZXIgYXR0YWNoZWQgdG8gdGhpcyBtZWFzdXJlciBhbmQgd3JhcHBlci4KICAgICAgICAgICAgICogQHJldHVybnMge1R5cGVzZXR0YWJsZS5Xcml0ZXJ9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgc3JjJDEuV3JpdGVyKHRoaXMuX21lYXN1cmVyLCB0aGlzLl90eXBlc2V0dGVyQ29udGV4dCwgdGhpcy5fd3JhcHBlcik7CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgIH0pOwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3R5cGVzZXR0ZXJDb250ZXh0ID0gbmV3IHNyYyQxLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIodGhpcy5fdHlwZXNldHRlckNvbnRleHQpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLl9yZXNjYWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWRyYXcoKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGUgc3BhY2UgcmVxdWlyZW1lbnRzIGZvciB0aGlzIENhdGVnb3J5IEF4aXMuIENhdGVnb3J5IEF4ZXMgaGF2ZSB0d28gcHJpbWFyeSBzcGFjZSByZXF1aXJlbWVudHM6CiAgICAgICAgICoKICAgICAgICAgKiAxKSB3aWR0aC9oZWlnaHQgbmVlZGVkIGJ5IHRoZSB0aWNrIGxpbmVzIChpbmNsdWRpbmcgYW5ub3RhdGlvbnMsIHBhZGRpbmcsIGFuZCBtYXJnaW5zKS4KICAgICAgICAgKiAyKSB3aWR0aC9oZWlnaHQgbmVlZGVkIGJ5IHRoZSB0aWNrIHRleHQuCiAgICAgICAgICoKICAgICAgICAgKiBXZSByZXF1ZXN0ZWQgc3BhY2UgaXMgdGhlIHN1bSBvZiB0aGUgbGluZXMgYW5kIHRleHQuCiAgICAgICAgICogQHBhcmFtIG9mZmVyZWRXaWR0aAogICAgICAgICAqIEBwYXJhbSBvZmZlcmVkSGVpZ2h0CiAgICAgICAgICogQHJldHVybnMge2FueX0KICAgICAgICAgKi8KICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2UgPSBmdW5jdGlvbiAob2ZmZXJlZFdpZHRoLCBvZmZlcmVkSGVpZ2h0KSB7CiAgICAgICAgICAgIHZhciB3aWR0aFJlcXVpcmVkQnlUaWNrcyA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPyAwIDogdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSArIHRoaXMubWFyZ2luKCk7CiAgICAgICAgICAgIHZhciBoZWlnaHRSZXF1aXJlZEJ5VGlja3MgPSB0aGlzLmlzSG9yaXpvbnRhbCgpID8gdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSArIHRoaXMubWFyZ2luKCkgOiAwOwogICAgICAgICAgICBpZiAodGhpcy5fc2NhbGUuZG9tYWluKCkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiAwLAogICAgICAgICAgICAgICAgICAgIG1pbkhlaWdodDogMCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYW5ub3RhdGlvbnNFbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgIHZhciB0aWVyVG90YWxIZWlnaHQgPSB0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpICogdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSkgewogICAgICAgICAgICAgICAgICAgIGhlaWdodFJlcXVpcmVkQnlUaWNrcyArPSB0aWVyVG90YWxIZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB3aWR0aFJlcXVpcmVkQnlUaWNrcyArPSB0aWVyVG90YWxIZWlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG1lYXN1cmVSZXN1bHQgPSB0aGlzLl9tZWFzdXJlVGlja0xhYmVscyhvZmZlcmVkV2lkdGgsIG9mZmVyZWRIZWlnaHQpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWluV2lkdGg6IG1lYXN1cmVSZXN1bHQudXNlZFdpZHRoICsgd2lkdGhSZXF1aXJlZEJ5VGlja3MsCiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IG1lYXN1cmVSZXN1bHQudXNlZEhlaWdodCArIGhlaWdodFJlcXVpcmVkQnlUaWNrcywKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fY29yZVNpemUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciByZWxldmFudERpbWVuc2lvbiA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPyB0aGlzLmhlaWdodCgpIDogdGhpcy53aWR0aCgpOwogICAgICAgICAgICB2YXIgcmVsZXZhbnRSZXF1ZXN0ZWRTcGFjZURpbWVuc2lvbiA9IHRoaXMuaXNIb3Jpem9udGFsKCkgPwogICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0ZWRTcGFjZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpLm1pbkhlaWdodCA6CiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RlZFNwYWNlKHRoaXMud2lkdGgoKSwgdGhpcy5oZWlnaHQoKSkubWluV2lkdGg7CiAgICAgICAgICAgIHZhciBtYXJnaW5BbmRBbm5vdGF0aW9uU2l6ZSA9IHRoaXMubWFyZ2luKCkgKyB0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpOwogICAgICAgICAgICB2YXIgYXhpc0hlaWdodFdpdGhvdXRNYXJnaW4gPSByZWxldmFudFJlcXVlc3RlZFNwYWNlRGltZW5zaW9uIC0gbWFyZ2luQW5kQW5ub3RhdGlvblNpemU7CiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihheGlzSGVpZ2h0V2l0aG91dE1hcmdpbiwgcmVsZXZhbnREaW1lbnNpb24pOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREb3duc2FtcGxlSW5mbygpLmRvbWFpbjsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlciA9IGZ1bmN0aW9uIChhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSB7CiAgICAgICAgICAgIC8vIGhhY2s6IGNvbnRpbnVlIHVzaW5nIENvbXBvbmVudC5fc2l6ZUZyb21PZmZlciB0byBwcmV2ZW50IGFuZ2xlZCBheGlzIHRpY2tzCiAgICAgICAgICAgIC8vIGZyb20gb3ZlcmZsb3dpbmcgdGhlaXIgY29udGFpbmVyCiAgICAgICAgICAgIHJldHVybiBjb21wb25lbnQuQ29tcG9uZW50LnByb3RvdHlwZS5fc2l6ZUZyb21PZmZlci5jYWxsKHRoaXMsIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogVGFrZSB0aGUgc2NhbGUgYW5kIGRyb3AgdGlja3MgYXQgcmVndWxhciBpbnRlcnZhbHMgc3VjaCB0aGF0IHRoZSByZXN1bHRhbnQgdGlja3MgYXJlIGFsbCBhIHJlYXNvbmFibGUgbWluaW11bQogICAgICAgICAqIGRpc3RhbmNlIGFwYXJ0LiBSZXR1cm4gdGhlIHJlc3VsdGFudCB0aWNrcyB0byByZW5kZXIsIGFzIHdlbGwgYXMgdGhlIG5ldyBzdGVwV2lkdGggYmV0d2VlbiB0aGVtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTY2FsZXMuQ2F0ZWdvcnl9IHNjYWxlIC0gVGhlIHNjYWxlIGJlaW5nIGRvd25zYW1wbGVkLiBEZWZhdWx0cyB0byB0aGlzIEF4aXMnIHNjYWxlLgogICAgICAgICAqIEByZXR1cm4ge0Rvd25zYW1wbGVJbmZvfSBhbiBvYmplY3QgaG9sZGluZyB0aGUgcmVzdWx0YW50IGRvbWFpbiBhbmQgbmV3IHN0ZXBXaWR0aC4KICAgICAgICAgKi8KICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuZ2V0RG93bnNhbXBsZUluZm8gPSBmdW5jdGlvbiAoc2NhbGUsIGRvbWFpbikgewogICAgICAgICAgICBpZiAoc2NhbGUgPT09IHZvaWQgMCkgeyBzY2FsZSA9IHRoaXMuX3NjYWxlOyB9CiAgICAgICAgICAgIGlmIChkb21haW4gPT09IHZvaWQgMCkgeyBkb21haW4gPSBzY2FsZS5pbnZlcnRSYW5nZSgpOyB9CiAgICAgICAgICAgIC8vIGFjY291bnQgZm9yIGhvdyBzaGVhcmluZyB0aWdodGVucyB0aGUgc3BhY2UgYmV0d2VlbiB2ZXJ0aWNhbGx5IG9yaWVudGVkIHRpY2tzCiAgICAgICAgICAgIHZhciBzaGVhckZhY3RvciA9IHRoaXMuX3RpY2tMYWJlbEFuZ2xlID09PSAwID8gMSA6IDEgLyBNYXRoLmNvcyh0aGlzLl90aWNrTGFiZWxTaGVhckFuZ2xlIC8gMTgwICogTWF0aC5QSSk7CiAgICAgICAgICAgIHZhciBzaGVhcmVkTWluaW11bVdpZHRoID0gQ2F0ZWdvcnkuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYICogc2hlYXJGYWN0b3I7CiAgICAgICAgICAgIHZhciBkb3duc2FtcGxlUmF0aW8gPSBNYXRoLmNlaWwoc2hlYXJlZE1pbmltdW1XaWR0aCAvIHNjYWxlLnN0ZXBXaWR0aCgpKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGRvbWFpbjogZG9tYWluLmZpbHRlcihmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gaSAlIGRvd25zYW1wbGVSYXRpbyA9PT0gMDsgfSksCiAgICAgICAgICAgICAgICBzdGVwV2lkdGg6IGRvd25zYW1wbGVSYXRpbyAqIHNjYWxlLnN0ZXBXaWR0aCgpLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLnRpY2tMYWJlbEFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7CiAgICAgICAgICAgIGlmIChhbmdsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdGlja0xhYmVsQW5nbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFuZ2xlICE9PSAwICYmIGFuZ2xlICE9PSA5MCAmJiBhbmdsZSAhPT0gLTkwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkFuZ2xlICIgKyBhbmdsZSArICIgbm90IHN1cHBvcnRlZDsgb25seSAwLCA5MCwgYW5kIC05MCBhcmUgdmFsaWQgdmFsdWVzIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGlja0xhYmVsQW5nbGUgPSBhbmdsZTsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUudGlja0xhYmVsU2hlYXJBbmdsZSA9IGZ1bmN0aW9uIChhbmdsZSkgewogICAgICAgICAgICBpZiAoYW5nbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFNoZWFyQW5nbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFuZ2xlIDwgLTgwIHx8IGFuZ2xlID4gODApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiQW5nbGUgIiArIGFuZ2xlICsgIiBub3Qgc3VwcG9ydGVkOyBNdXN0IGJlIGJldHdlZW4gWy04MCwgODBdIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdGlja0xhYmVsU2hlYXJBbmdsZSA9IGFuZ2xlOwogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS50aWNrTGFiZWxNYXhXaWR0aCA9IGZ1bmN0aW9uIChtYXhXaWR0aCkgewogICAgICAgICAgICAvLyBhbGxvdyB1c2VyIHRvIHVuLXNldCB0aWNrTGFiZWxNYXhXaWR0aCBieSBwYXNzaW5nIGluIG51bGwgb3IgdW5kZWZpbmVkIGV4cGxpY2l0bHkKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCA9IG1heFdpZHRoOwogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS50aWNrTGFiZWxNYXhMaW5lcyA9IGZ1bmN0aW9uIChtYXhMaW5lcykgewogICAgICAgICAgICAvLyBhbGxvdyB1c2VyIHRvIHVuLXNldCB0aWNrTGFiZWxNYXhMaW5lcyBieSBwYXNzaW5nIGluIG51bGwgb3IgdW5kZWZpbmVkIGV4cGxpY2l0bHkKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWNrTGFiZWxNYXhMaW5lczsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90aWNrTGFiZWxNYXhMaW5lcyA9IG1heExpbmVzOwogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiB0aGUgc3BhY2UgcmVxdWlyZWQgYnkgdGhlIHRpY2tzLCBwYWRkaW5nIGluY2x1ZGVkLgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLl90aWNrU3BhY2VSZXF1aXJlZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpICsgdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBXcml0ZSB0aWNrcyB0byB0aGUgRE9NLgogICAgICAgICAqIEBwYXJhbSB7UGxvdHRhYmxlLlNjYWxlcy5DYXRlZ29yeX0gc2NhbGUgVGhlIHNjYWxlIHRoaXMgYXhpcyBpcyByZXByZXNlbnRpbmcuCiAgICAgICAgICogQHBhcmFtIHtkMy5TZWxlY3Rpb259IHRpY2tzIFRoZSB0aWNrIGVsZW1lbnRzIHRvIHdyaXRlLgogICAgICAgICAqLwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fZHJhd1RpY2tzID0gZnVuY3Rpb24gKHN0ZXBXaWR0aCwgdGlja3MpIHsKICAgICAgICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICAgICAgICB2YXIgeEFsaWduOwogICAgICAgICAgICB2YXIgeUFsaWduOwogICAgICAgICAgICBzd2l0Y2ggKHRoaXMudGlja0xhYmVsQW5nbGUoKSkgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIHhBbGlnbiA9IHsgbGVmdDogInJpZ2h0IiwgcmlnaHQ6ICJsZWZ0IiwgdG9wOiAiY2VudGVyIiwgYm90dG9tOiAiY2VudGVyIiB9OwogICAgICAgICAgICAgICAgICAgIHlBbGlnbiA9IHsgbGVmdDogImNlbnRlciIsIHJpZ2h0OiAiY2VudGVyIiwgdG9wOiAiYm90dG9tIiwgYm90dG9tOiAidG9wIiB9OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA5MDoKICAgICAgICAgICAgICAgICAgICB4QWxpZ24gPSB7IGxlZnQ6ICJjZW50ZXIiLCByaWdodDogImNlbnRlciIsIHRvcDogInJpZ2h0IiwgYm90dG9tOiAibGVmdCIgfTsKICAgICAgICAgICAgICAgICAgICB5QWxpZ24gPSB7IGxlZnQ6ICJ0b3AiLCByaWdodDogImJvdHRvbSIsIHRvcDogImNlbnRlciIsIGJvdHRvbTogImNlbnRlciIgfTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgLTkwOgogICAgICAgICAgICAgICAgICAgIHhBbGlnbiA9IHsgbGVmdDogImNlbnRlciIsIHJpZ2h0OiAiY2VudGVyIiwgdG9wOiAibGVmdCIsIGJvdHRvbTogInJpZ2h0IiB9OwogICAgICAgICAgICAgICAgICAgIHlBbGlnbiA9IHsgbGVmdDogImJvdHRvbSIsIHJpZ2h0OiAidG9wIiwgdG9wOiAiY2VudGVyIiwgYm90dG9tOiAiY2VudGVyIiB9OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRpY2tzLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHZhciBjb250YWluZXIgPSBkMy5zZWxlY3QodGhpcyk7CiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBzZWxmLmlzSG9yaXpvbnRhbCgpID8gc3RlcFdpZHRoIDogc2VsZi53aWR0aCgpIC0gc2VsZi5fdGlja1NwYWNlUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBzZWxmLmlzSG9yaXpvbnRhbCgpID8gc2VsZi5oZWlnaHQoKSAtIHNlbGYuX3RpY2tTcGFjZVJlcXVpcmVkKCkgOiBzdGVwV2lkdGg7CiAgICAgICAgICAgICAgICB2YXIgd3JpdGVPcHRpb25zID0gewogICAgICAgICAgICAgICAgICAgIHhBbGlnbjogeEFsaWduW3NlbGYub3JpZW50YXRpb24oKV0sCiAgICAgICAgICAgICAgICAgICAgeUFsaWduOiB5QWxpZ25bc2VsZi5vcmllbnRhdGlvbigpXSwKICAgICAgICAgICAgICAgICAgICB0ZXh0Um90YXRpb246IHNlbGYudGlja0xhYmVsQW5nbGUoKSwKICAgICAgICAgICAgICAgICAgICB0ZXh0U2hlYXI6IHNlbGYudGlja0xhYmVsU2hlYXJBbmdsZSgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChzZWxmLl90aWNrTGFiZWxNYXhXaWR0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGxlZnQtb3JpZW50ZWQgYXhlcywgd2UgbXVzdCBtb3ZlIHRoZSB0aWNrcyBieSB0aGUgYW1vdW50IHdlJ3ZlIGN1dCBvZmYgaW4gb3JkZXIgdG8ga2VlcCB0aGUgdGV4dAogICAgICAgICAgICAgICAgICAgIC8vIGFsaWduZWQgd2l0aCB0aGUgc2lkZSBvZiB0aGUgdGlja3MKICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZi5vcmllbnRhdGlvbigpID09PSAibGVmdCIgJiYgd2lkdGggPiBzZWxmLl90aWNrTGFiZWxNYXhXaWR0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY3V0T2ZmV2lkdGggPSB3aWR0aCAtIHNlbGYuX3RpY2tMYWJlbE1heFdpZHRoOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmV3VHJhbnNmb3JtID0gY29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIpICsgIiB0cmFuc2xhdGUoIiArIGN1dE9mZldpZHRoICsgIiwgMCkiOwogICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXIuYXR0cigidHJhbnNmb3JtIiwgbmV3VHJhbnNmb3JtKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgd2lkdGggPSBNYXRoLm1pbih3aWR0aCwgc2VsZi5fdGlja0xhYmVsTWF4V2lkdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZi5fd3JpdGVyLndyaXRlKHNlbGYuZm9ybWF0dGVyKCkoZCksIHdpZHRoLCBoZWlnaHQsIHdyaXRlT3B0aW9ucywgY29udGFpbmVyLm5vZGUoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogTWVhc3VyZXMgdGhlIHNpemUgb2YgdGhlIHRpY2sgbGFiZWxzIHdpdGhvdXQgbWFraW5nIGFueSAocGVybWFuZW50KSBET00gY2hhbmdlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBheGlzV2lkdGggV2lkdGggYXZhaWxhYmxlIGZvciB0aGlzIGF4aXMuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGF4aXNIZWlnaHQgSGVpZ2h0IGF2YWlsYWJsZSBmb3IgdGhpcyBheGlzLgogICAgICAgICAqIEBwYXJhbSB7UGxvdHRhYmxlLlNjYWxlcy5DYXRlZ29yeX0gc2NhbGUgVGhlIHNjYWxlIHRoaXMgYXhpcyBpcyByZXByZXNlbnRpbmcuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmdbXX0gdGlja3MgVGhlIHN0cmluZ3MgdGhhdCB3aWxsIGJlIHByaW50ZWQgb24gdGhlIHRpY2tzLgogICAgICAgICAqLwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fbWVhc3VyZVRpY2tMYWJlbHMgPSBmdW5jdGlvbiAoYXhpc1dpZHRoLCBheGlzSGVpZ2h0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciB0aGlzU2NhbGUgPSB0aGlzLl9zY2FsZTsKICAgICAgICAgICAgLy8gc2V0IHVwIGEgdGVzdCBzY2FsZSB0byBzaW11bGF0ZSByZW5kZXJpbmcgdGlja3Mgd2l0aCB0aGUgZ2l2ZW4gd2lkdGggYW5kIGhlaWdodC4KICAgICAgICAgICAgdmFyIHNjYWxlID0gdGhpc1NjYWxlLmNsb25lV2l0aG91dFByb3ZpZGVycygpCiAgICAgICAgICAgICAgICAucmFuZ2UoWzAsIHRoaXMuaXNIb3Jpem9udGFsKCkgPyBheGlzV2lkdGggOiBheGlzSGVpZ2h0XSk7CiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oc2NhbGUpLCBkb21haW4gPSBfYS5kb21haW4sIHN0ZXBXaWR0aCA9IF9hLnN0ZXBXaWR0aDsKICAgICAgICAgICAgLy8gSEFDS0hBQ0s6IGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9zdmctdHlwZXdyaXRlci9pc3N1ZXMvMjUKICAgICAgICAgICAgLy8gdGhlIHdpZHRoICh4LWF4aXMgc3BlY2lmaWMpIGF2YWlsYWJsZSB0byBhIHNpbmdsZSB0aWNrIGxhYmVsLgogICAgICAgICAgICB2YXIgd2lkdGggPSBheGlzV2lkdGggLSB0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOyAvLyBkZWZhdWx0IGZvciBsZWZ0L3JpZ2h0CiAgICAgICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7CiAgICAgICAgICAgICAgICB3aWR0aCA9IHN0ZXBXaWR0aDsgLy8gZGVmYXVsdHMgdG8gdGhlIGJhbmQgd2lkdGgKICAgICAgICAgICAgICAgIGlmICh0aGlzLl90aWNrTGFiZWxBbmdsZSAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHdpZHRoID0gYXhpc0hlaWdodCAtIHRoaXMuX3RpY2tTcGFjZVJlcXVpcmVkKCk7IC8vIHVzZSB0aGUgYXhpcyBoZWlnaHQKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEhBQ0tIQUNLOiBXcmFwcGVyIGZhaWxzIHVuZGVyIG5lZ2F0aXZlIGNpcmN1bXN0YW5jZXMKICAgICAgICAgICAgICAgIHdpZHRoID0gTWF0aC5tYXgod2lkdGgsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhBQ0tIQUNLOiBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvc3ZnLXR5cGV3cml0ZXIvaXNzdWVzLzI1CiAgICAgICAgICAgIC8vIHRoZSBoZWlnaHQgKHktYXhpcyBzcGVjaWZpYykgYXZhaWxhYmxlIHRvIGEgc2luZ2xlIHRpY2sgbGFiZWwuCiAgICAgICAgICAgIHZhciBoZWlnaHQgPSBzdGVwV2lkdGg7IC8vIGRlZmF1bHQgZm9yIGxlZnQvcmlnaHQKICAgICAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHsKICAgICAgICAgICAgICAgIGhlaWdodCA9IGF4aXNIZWlnaHQgLSB0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpY2tMYWJlbEFuZ2xlICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gYXhpc1dpZHRoIC0gdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEhBQ0tIQUNLOiBXcmFwcGVyIGZhaWxzIHVuZGVyIG5lZ2F0aXZlIGNpcmN1bXN0YW5jZXMKICAgICAgICAgICAgICAgIGhlaWdodCA9IE1hdGgubWF4KGhlaWdodCwgMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHdpZHRoID0gTWF0aC5taW4od2lkdGgsIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcHBpbmdSZXN1bHRzID0gZG9tYWluLm1hcChmdW5jdGlvbiAocykgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl93cmFwcGVyLndyYXAoX3RoaXMuZm9ybWF0dGVyKCkocyksIF90aGlzLl9tZWFzdXJlciwgd2lkdGgsIGhlaWdodCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBIQUNLSEFDSzogaHR0cHM6Ly9naXRodWIuY29tL3BhbGFudGlyL3N2Zy10eXBld3JpdGVyL2lzc3Vlcy8yNQogICAgICAgICAgICB2YXIgd2lkdGhGbiA9ICh0aGlzLmlzSG9yaXpvbnRhbCgpICYmIHRoaXMuX3RpY2tMYWJlbEFuZ2xlID09PSAwKSA/IGQzLnN1bSA6IHV0aWxzJDEuTWF0aC5tYXg7CiAgICAgICAgICAgIHZhciBoZWlnaHRGbiA9ICh0aGlzLmlzSG9yaXpvbnRhbCgpICYmIHRoaXMuX3RpY2tMYWJlbEFuZ2xlID09PSAwKSA/IHV0aWxzJDEuTWF0aC5tYXggOiBkMy5zdW07CiAgICAgICAgICAgIHZhciB1c2VkV2lkdGggPSB3aWR0aEZuKHdyYXBwaW5nUmVzdWx0cywgZnVuY3Rpb24gKHQpIHsgcmV0dXJuIF90aGlzLl9tZWFzdXJlci5tZWFzdXJlKHQud3JhcHBlZFRleHQpLndpZHRoOyB9LCAwKTsKICAgICAgICAgICAgdmFyIHVzZWRIZWlnaHQgPSBoZWlnaHRGbih3cmFwcGluZ1Jlc3VsdHMsIGZ1bmN0aW9uICh0KSB7IHJldHVybiBfdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0LndyYXBwZWRUZXh0KS5oZWlnaHQ7IH0sIDApOwogICAgICAgICAgICAvLyBJZiB0aGUgdGljayBsYWJlbHMgYXJlIHJvdGF0ZWQsIHJldmVyc2UgdXNlZFdpZHRoIGFuZCB1c2VkSGVpZ2h0CiAgICAgICAgICAgIC8vIEhBQ0tIQUNLOiBodHRwczovL2dpdGh1Yi5jb20vcGFsYW50aXIvc3ZnLXR5cGV3cml0ZXIvaXNzdWVzLzI1CiAgICAgICAgICAgIGlmICh0aGlzLl90aWNrTGFiZWxBbmdsZSAhPT0gMCkgewogICAgICAgICAgICAgICAgX2IgPSBbdXNlZEhlaWdodCwgdXNlZFdpZHRoXSwgdXNlZFdpZHRoID0gX2JbMF0sIHVzZWRIZWlnaHQgPSBfYlsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdXNlZFdpZHRoOiB1c2VkV2lkdGgsCiAgICAgICAgICAgICAgICB1c2VkSGVpZ2h0OiB1c2VkSGVpZ2h0LAogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2I7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdmFyIGNhdFNjYWxlID0gdGhpcy5fc2NhbGU7CiAgICAgICAgICAgIHZhciBfYSA9IHRoaXMuZ2V0RG93bnNhbXBsZUluZm8oY2F0U2NhbGUpLCBkb21haW4gPSBfYS5kb21haW4sIHN0ZXBXaWR0aCA9IF9hLnN0ZXBXaWR0aDsKICAgICAgICAgICAgLy8gR2l2ZSBlYWNoIHRpY2sgYSBzdGVwV2lkdGggb2Ygc3BhY2Ugd2hpY2ggd2lsbCBwYXJ0aXRpb24gdGhlIGVudGlyZSBheGlzIGV2ZW5seQogICAgICAgICAgICB2YXIgYXZhaWxhYmxlVGV4dFNwYWNlID0gc3RlcFdpZHRoOwogICAgICAgICAgICBpZiAodGhpcy5pc0hvcml6b250YWwoKSAmJiB0aGlzLl90aWNrTGFiZWxNYXhXaWR0aCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBhdmFpbGFibGVUZXh0U3BhY2UgPSBNYXRoLm1pbihhdmFpbGFibGVUZXh0U3BhY2UsIHRoaXMuX3RpY2tMYWJlbE1heFdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZ2V0VGlja0xhYmVsVHJhbnNmb3JtID0gZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgIC8vIHNjYWxlKGQpIHdpbGwgZ2l2ZSB0aGUgY2VudGVyIG9mIHRoZSBiYW5kLCBzbyBzdWJ0cmFjdCBoYWxmIG9mIHRoZSB0ZXh0IHdpZHRoIHRvIGdldCB0aGUgbGVmdCAodG9wLW1vc3QpCiAgICAgICAgICAgICAgICAvLyBjb29yZGluYXRlIHRoYXQgdGhlIHRpY2sgbGFiZWwgc2hvdWxkIGJlIHRyYW5zZm9ybWVkIHRvLgogICAgICAgICAgICAgICAgdmFyIHRpY2tMYWJlbEVkZ2UgPSBjYXRTY2FsZS5zY2FsZShkKSAtIGF2YWlsYWJsZVRleHRTcGFjZSAvIDI7CiAgICAgICAgICAgICAgICB2YXIgeCA9IF90aGlzLmlzSG9yaXpvbnRhbCgpID8gdGlja0xhYmVsRWRnZSA6IDA7CiAgICAgICAgICAgICAgICB2YXIgeSA9IF90aGlzLmlzSG9yaXpvbnRhbCgpID8gMCA6IHRpY2tMYWJlbEVkZ2U7CiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgeCArICIsIiArIHkgKyAiKSI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0aWNrTGFiZWxzVXBkYXRlID0gdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIgKyBheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKGRvbWFpbik7CiAgICAgICAgICAgIHZhciB0aWNrTGFiZWxzID0gdGlja0xhYmVsc1VwZGF0ZQogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoYXhpcyQyLkF4aXMuVElDS19MQUJFTF9DTEFTUywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5tZXJnZSh0aWNrTGFiZWxzVXBkYXRlKTsKICAgICAgICAgICAgdGlja0xhYmVsc1VwZGF0ZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIHRpY2tMYWJlbHMuYXR0cigidHJhbnNmb3JtIiwgZ2V0VGlja0xhYmVsVHJhbnNmb3JtKTsKICAgICAgICAgICAgLy8gZXJhc2UgYWxsIHRleHQgZmlyc3QsIHRoZW4gcmV3cml0ZQogICAgICAgICAgICB0aWNrTGFiZWxzLnRleHQoIiIpOwogICAgICAgICAgICB0aGlzLl9kcmF3VGlja3Moc3RlcFdpZHRoLCB0aWNrTGFiZWxzKTsKICAgICAgICAgICAgdmFyIHhUcmFuc2xhdGUgPSB0aGlzLm9yaWVudGF0aW9uKCkgPT09ICJyaWdodCIgPyB0aGlzLl90aWNrU3BhY2VSZXF1aXJlZCgpIDogMDsKICAgICAgICAgICAgdmFyIHlUcmFuc2xhdGUgPSB0aGlzLm9yaWVudGF0aW9uKCkgPT09ICJib3R0b20iID8gdGhpcy5fdGlja1NwYWNlUmVxdWlyZWQoKSA6IDA7CiAgICAgICAgICAgIHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4VHJhbnNsYXRlICsgIiwiICsgeVRyYW5zbGF0ZSArICIpIik7CiAgICAgICAgICAgIC8vIGhpZGUgdGlja3MgYW5kIGxhYmVscyB0aGF0IG92ZXJmbG93IHRoZSBheGlzCiAgICAgICAgICAgIHRoaXMuX3Nob3dBbGxUaWNrTWFya3MoKTsKICAgICAgICAgICAgdGhpcy5fc2hvd0FsbFRpY2tMYWJlbHMoKTsKICAgICAgICAgICAgdGhpcy5faGlkZVRpY2tNYXJrc1dpdGhvdXRMYWJlbCgpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLCBvcmlnaW4sIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICBpZiAoIXRoaXMuaXNIb3Jpem9udGFsKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NjYWxlLnJhbmdlKFswLCB0aGlzLmhlaWdodCgpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9tZWFzdXJlci5yZXNldCgpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogSG93IG1hbnkgcGl4ZWxzIHRvIGdpdmUgbGFiZWxzIGF0IG1pbmltdW0gYmVmb3JlIGRvd25zYW1wbGluZyB0YWtlcyBlZmZlY3QuCiAgICAgICAgICovCiAgICAgICAgQ2F0ZWdvcnkuX01JTklNVU1fV0lEVEhfUEVSX0xBQkVMX1BYID0gMTU7CiAgICAgICAgcmV0dXJuIENhdGVnb3J5OwogICAgfShheGlzJDIuQXhpcykpOwogICAgZXhwb3J0cy5DYXRlZ29yeSA9IENhdGVnb3J5OwogICAgfSk7CgogICAgdmFyIG51bWVyaWNBeGlzID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgoKCiAgICB2YXIgTnVtZXJpYyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKE51bWVyaWMsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIE51bWVyaWMgQXhpcy4KICAgICAgICAgKgogICAgICAgICAqIEEgTnVtZXJpYyBBeGlzIGlzIGEgdmlzdWFsIHJlcHJlc2VudGF0aW9uIG9mIGEgUXVhbnRpdGF0aXZlU2NhbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge1F1YW50aXRhdGl2ZVNjYWxlfSBzY2FsZQogICAgICAgICAqIEBwYXJhbSB7QXhpc09yaWVudGF0aW9ufSBvcmllbnRhdGlvbiBPcmllbnRhdGlvbiBvZiB0aGlzIE51bWVyaWMgQXhpcy4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBOdW1lcmljKHNjYWxlLCBvcmllbnRhdGlvbikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBzY2FsZSwgb3JpZW50YXRpb24pIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyA9ICJjZW50ZXIiOwogICAgICAgICAgICBfdGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuZm9ybWF0dGVyKGZvcm1hdHRlcnMuZ2VuZXJhbCgpKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBOdW1lcmljLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbmV3IHNyYyQxLlN2Z0NvbnRleHQodGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLm5vZGUoKSwgYXhpcyQyLkF4aXMuVElDS19MQUJFTF9DTEFTUyk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIoY29udGV4dCk7CiAgICAgICAgICAgIHRoaXMuX3dyYXBwZXIgPSBuZXcgc3JjJDEuV3JhcHBlcigpLm1heExpbmVzKDEpOwogICAgICAgIH07CiAgICAgICAgTnVtZXJpYy5wcm90b3R5cGUuX2NvbXB1dGVXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIG1heFRleHRXaWR0aCA9IHRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uID8gdGhpcy5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoKCkgOiB0aGlzLl9jb21wdXRlRXhhY3RUZXh0V2lkdGgoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nID09PSAiY2VudGVyIikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21heExhYmVsVGlja0xlbmd0aCgpICsgdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkgKyBtYXhUZXh0V2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgodGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCksIHRoaXMudGlja0xhYmVsUGFkZGluZygpICsgbWF4VGV4dFdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTnVtZXJpYy5wcm90b3R5cGUuX2NvbXB1dGVFeGFjdFRleHRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHRpY2tWYWx1ZXMgPSB0aGlzLl9nZXRUaWNrVmFsdWVzKCk7CiAgICAgICAgICAgIHZhciB0ZXh0TGVuZ3RocyA9IHRpY2tWYWx1ZXMubWFwKGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICB2YXIgZm9ybWF0dGVkVmFsdWUgPSBfdGhpcy5mb3JtYXR0ZXIoKSh2KTsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fbWVhc3VyZXIubWVhc3VyZShmb3JtYXR0ZWRWYWx1ZSkud2lkdGg7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5NYXRoLm1heCh0ZXh0TGVuZ3RocywgMCk7CiAgICAgICAgfTsKICAgICAgICBOdW1lcmljLnByb3RvdHlwZS5fY29tcHV0ZUFwcHJveGltYXRlVGV4dFdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgdGlja1ZhbHVlcyA9IHRoaXMuX2dldFRpY2tWYWx1ZXMoKTsKICAgICAgICAgICAgdmFyIG1XaWR0aCA9IHRoaXMuX21lYXN1cmVyLm1lYXN1cmUoIk0iKS53aWR0aDsKICAgICAgICAgICAgdmFyIHRleHRMZW5ndGhzID0gdGlja1ZhbHVlcy5tYXAoZnVuY3Rpb24gKHYpIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRWYWx1ZSA9IF90aGlzLmZvcm1hdHRlcigpKHYpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFZhbHVlLmxlbmd0aCAqIG1XaWR0aDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB1dGlscyQxLk1hdGgubWF4KHRleHRMZW5ndGhzLCAwKTsKICAgICAgICB9OwogICAgICAgIE51bWVyaWMucHJvdG90eXBlLl9jb21wdXRlSGVpZ2h0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdGV4dEhlaWdodCA9IHRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7CiAgICAgICAgICAgIGlmICh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZyA9PT0gImNlbnRlciIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSArIHRoaXMudGlja0xhYmVsUGFkZGluZygpICsgdGV4dEhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSwgdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkgKyB0ZXh0SGVpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTnVtZXJpYy5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzY2FsZSA9IHRoaXMuX3NjYWxlOwogICAgICAgICAgICB2YXIgZG9tYWluID0gc2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIHZhciBtaW4gPSBkb21haW5bMF0gPD0gZG9tYWluWzFdID8gZG9tYWluWzBdIDogZG9tYWluWzFdOwogICAgICAgICAgICB2YXIgbWF4ID0gZG9tYWluWzBdID49IGRvbWFpblsxXSA/IGRvbWFpblswXSA6IGRvbWFpblsxXTsKICAgICAgICAgICAgcmV0dXJuIHNjYWxlLnRpY2tzKCkuZmlsdGVyKGZ1bmN0aW9uIChpKSB7IHJldHVybiBpID49IG1pbiAmJiBpIDw9IG1heDsgfSk7CiAgICAgICAgfTsKICAgICAgICBOdW1lcmljLnByb3RvdHlwZS5fcmVzY2FsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1NldHVwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLmlzSG9yaXpvbnRhbCgpKSB7CiAgICAgICAgICAgICAgICB2YXIgcmVDb21wdXRlZFdpZHRoID0gdGhpcy5fY29tcHV0ZVdpZHRoKCk7CiAgICAgICAgICAgICAgICBpZiAocmVDb21wdXRlZFdpZHRoID4gdGhpcy53aWR0aCgpIHx8IHJlQ29tcHV0ZWRXaWR0aCA8ICh0aGlzLndpZHRoKCkgLSB0aGlzLm1hcmdpbigpKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgfTsKICAgICAgICBOdW1lcmljLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgdGlja0xhYmVsQXR0ckhhc2ggPSB7CiAgICAgICAgICAgICAgICB4OiAwLAogICAgICAgICAgICAgICAgeTogMCwKICAgICAgICAgICAgICAgIGR4OiAiMGVtIiwKICAgICAgICAgICAgICAgIGR5OiAiMC4zZW0iLAogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgdGlja01hcmtMZW5ndGggPSB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKTsKICAgICAgICAgICAgdmFyIHRpY2tMYWJlbFBhZGRpbmcgPSB0aGlzLnRpY2tMYWJlbFBhZGRpbmcoKTsKICAgICAgICAgICAgdmFyIHRpY2tMYWJlbFRleHRBbmNob3IgPSAibWlkZGxlIjsKICAgICAgICAgICAgdmFyIGxhYmVsR3JvdXBUcmFuc2Zvcm1YID0gMDsKICAgICAgICAgICAgdmFyIGxhYmVsR3JvdXBUcmFuc2Zvcm1ZID0gMDsKICAgICAgICAgICAgdmFyIGxhYmVsR3JvdXBTaGlmdFggPSAwOwogICAgICAgICAgICB2YXIgbGFiZWxHcm91cFNoaWZ0WSA9IDA7CiAgICAgICAgICAgIGlmICh0aGlzLmlzSG9yaXpvbnRhbCgpKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAibGVmdCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbFRleHRBbmNob3IgPSAiZW5kIjsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxHcm91cFRyYW5zZm9ybVggPSAtdGlja0xhYmVsUGFkZGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxHcm91cFNoaWZ0WSA9IHRpY2tMYWJlbFBhZGRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgImNlbnRlciI6CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsR3JvdXBTaGlmdFkgPSB0aWNrTWFya0xlbmd0aCArIHRpY2tMYWJlbFBhZGRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgInJpZ2h0IjoKICAgICAgICAgICAgICAgICAgICAgICAgdGlja0xhYmVsVGV4dEFuY2hvciA9ICJzdGFydCI7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsR3JvdXBUcmFuc2Zvcm1YID0gdGlja0xhYmVsUGFkZGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxHcm91cFNoaWZ0WSA9IHRpY2tMYWJlbFBhZGRpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoICh0aGlzLl90aWNrTGFiZWxQb3NpdGlvbmluZykgewogICAgICAgICAgICAgICAgICAgIGNhc2UgInRvcCI6CiAgICAgICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbEF0dHJIYXNoWyJkeSJdID0gIi0wLjNlbSI7CiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsR3JvdXBTaGlmdFggPSB0aWNrTGFiZWxQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEdyb3VwVHJhbnNmb3JtWSA9IC10aWNrTGFiZWxQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJjZW50ZXIiOgogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEdyb3VwU2hpZnRYID0gdGlja01hcmtMZW5ndGggKyB0aWNrTGFiZWxQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlICJib3R0b20iOgogICAgICAgICAgICAgICAgICAgICAgICB0aWNrTGFiZWxBdHRySGFzaFsiZHkiXSA9ICIxZW0iOwogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbEdyb3VwU2hpZnRYID0gdGlja0xhYmVsUGFkZGluZzsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxHcm91cFRyYW5zZm9ybVkgPSB0aWNrTGFiZWxQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGlja01hcmtBdHRySGFzaCA9IHRoaXMuX2dlbmVyYXRlVGlja01hcmtBdHRySGFzaCgpOwogICAgICAgICAgICBzd2l0Y2ggKHRoaXMub3JpZW50YXRpb24oKSkgewogICAgICAgICAgICAgICAgY2FzZSAiYm90dG9tIjoKICAgICAgICAgICAgICAgICAgICB0aWNrTGFiZWxBdHRySGFzaFsieCJdID0gdGlja01hcmtBdHRySGFzaFsieDEiXTsKICAgICAgICAgICAgICAgICAgICB0aWNrTGFiZWxBdHRySGFzaFsiZHkiXSA9ICIwLjk1ZW0iOwogICAgICAgICAgICAgICAgICAgIGxhYmVsR3JvdXBUcmFuc2Zvcm1ZID0gdGlja01hcmtBdHRySGFzaFsieTEiXSArIGxhYmVsR3JvdXBTaGlmdFk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJ0b3AiOgogICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbEF0dHJIYXNoWyJ4Il0gPSB0aWNrTWFya0F0dHJIYXNoWyJ4MSJdOwogICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbEF0dHJIYXNoWyJkeSJdID0gIi0uMjVlbSI7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxHcm91cFRyYW5zZm9ybVkgPSB0aWNrTWFya0F0dHJIYXNoWyJ5MSJdIC0gbGFiZWxHcm91cFNoaWZ0WTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgImxlZnQiOgogICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbFRleHRBbmNob3IgPSAiZW5kIjsKICAgICAgICAgICAgICAgICAgICBsYWJlbEdyb3VwVHJhbnNmb3JtWCA9IHRpY2tNYXJrQXR0ckhhc2hbIngxIl0gLSBsYWJlbEdyb3VwU2hpZnRYOwogICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbEF0dHJIYXNoWyJ5Il0gPSB0aWNrTWFya0F0dHJIYXNoWyJ5MSJdOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAicmlnaHQiOgogICAgICAgICAgICAgICAgICAgIHRpY2tMYWJlbFRleHRBbmNob3IgPSAic3RhcnQiOwogICAgICAgICAgICAgICAgICAgIGxhYmVsR3JvdXBUcmFuc2Zvcm1YID0gdGlja01hcmtBdHRySGFzaFsieDEiXSArIGxhYmVsR3JvdXBTaGlmdFg7CiAgICAgICAgICAgICAgICAgICAgdGlja0xhYmVsQXR0ckhhc2hbInkiXSA9IHRpY2tNYXJrQXR0ckhhc2hbInkxIl07CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRpY2tMYWJlbFZhbHVlcyA9IHRoaXMuX2dldFRpY2tWYWx1ZXMoKTsKICAgICAgICAgICAgdmFyIHRpY2tMYWJlbHNVcGRhdGUgPSB0aGlzLl90aWNrTGFiZWxDb250YWluZXIuc2VsZWN0QWxsKCIuIiArIGF4aXMkMi5BeGlzLlRJQ0tfTEFCRUxfQ0xBU1MpLmRhdGEodGlja0xhYmVsVmFsdWVzKTsKICAgICAgICAgICAgdGlja0xhYmVsc1VwZGF0ZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIHZhciB0aWNrTGFiZWxzID0gdGlja0xhYmVsc1VwZGF0ZQogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoInRleHQiKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoYXhpcyQyLkF4aXMuVElDS19MQUJFTF9DTEFTUywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5tZXJnZSh0aWNrTGFiZWxzVXBkYXRlKTsKICAgICAgICAgICAgdGlja0xhYmVscy5zdHlsZSgidGV4dC1hbmNob3IiLCB0aWNrTGFiZWxUZXh0QW5jaG9yKQogICAgICAgICAgICAgICAgLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImluaGVyaXQiKQogICAgICAgICAgICAgICAgLmF0dHJzKHRpY2tMYWJlbEF0dHJIYXNoKQogICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKHMpIHsgcmV0dXJuIF90aGlzLmZvcm1hdHRlcigpKHMpOyB9KTsKICAgICAgICAgICAgdmFyIGxhYmVsR3JvdXBUcmFuc2Zvcm0gPSAidHJhbnNsYXRlKCIgKyBsYWJlbEdyb3VwVHJhbnNmb3JtWCArICIsICIgKyBsYWJlbEdyb3VwVHJhbnNmb3JtWSArICIpIjsKICAgICAgICAgICAgdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsIGxhYmVsR3JvdXBUcmFuc2Zvcm0pOwogICAgICAgICAgICB0aGlzLl9zaG93QWxsVGlja01hcmtzKCk7CiAgICAgICAgICAgIGlmICghdGhpcy5zaG93RW5kVGlja0xhYmVscygpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlRW5kVGlja0xhYmVscygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hpZGVPdmVyZmxvd2luZ1RpY2tMYWJlbHMoKTsKICAgICAgICAgICAgdGhpcy5faGlkZU92ZXJsYXBwaW5nVGlja0xhYmVscygpOwogICAgICAgICAgICBpZiAodGhpcy5fdGlja0xhYmVsUG9zaXRpb25pbmcgIT09ICJjZW50ZXIiKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlVGlja01hcmtzV2l0aG91dExhYmVsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBOdW1lcmljLnByb3RvdHlwZS50aWNrTGFiZWxQb3NpdGlvbiA9IGZ1bmN0aW9uIChwb3NpdGlvbikgewogICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uTEMgPSBwb3NpdGlvbi50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNIb3Jpem9udGFsKCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIShwb3NpdGlvbkxDID09PSAibGVmdCIgfHwgcG9zaXRpb25MQyA9PT0gImNlbnRlciIgfHwgcG9zaXRpb25MQyA9PT0gInJpZ2h0IikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKHBvc2l0aW9uTEMgKyAiIGlzIG5vdCBhIHZhbGlkIHRpY2sgbGFiZWwgcG9zaXRpb24gZm9yIGEgaG9yaXpvbnRhbCBOdW1lcmljQXhpcyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmICghKHBvc2l0aW9uTEMgPT09ICJ0b3AiIHx8IHBvc2l0aW9uTEMgPT09ICJjZW50ZXIiIHx8IHBvc2l0aW9uTEMgPT09ICJib3R0b20iKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocG9zaXRpb25MQyArICIgaXMgbm90IGEgdmFsaWQgdGljayBsYWJlbCBwb3NpdGlvbiBmb3IgYSB2ZXJ0aWNhbCBOdW1lcmljQXhpcyIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nID0gcG9zaXRpb25MQzsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTnVtZXJpYy5wcm90b3R5cGUudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24gPSBmdW5jdGlvbiAoZW5hYmxlKSB7CiAgICAgICAgICAgIGlmIChlbmFibGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VzZXNUZXh0V2lkdGhBcHByb3hpbWF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24gPSBlbmFibGU7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTnVtZXJpYy5wcm90b3R5cGUuX2hpZGVFbmRUaWNrTGFiZWxzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgYm91bmRpbmdCb3ggPSB0aGlzLmVsZW1lbnQoKS5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIHZhciB0aWNrTGFiZWxzID0gdGhpcy5fdGlja0xhYmVsQ29udGFpbmVyLnNlbGVjdEFsbCgiLiIgKyBheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTKTsKICAgICAgICAgICAgaWYgKHRpY2tMYWJlbHMuc2l6ZSgpID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGZpcnN0VGlja0xhYmVsID0gdGlja0xhYmVscy5ub2RlcygpWzBdOwogICAgICAgICAgICBpZiAoIXV0aWxzJDEuRE9NLmNsaWVudFJlY3RJbnNpZGUoZmlyc3RUaWNrTGFiZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCksIGJvdW5kaW5nQm94KSkgewogICAgICAgICAgICAgICAgZDMuc2VsZWN0KGZpcnN0VGlja0xhYmVsKS5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbGFzdFRpY2tMYWJlbCA9IHRpY2tMYWJlbHMubm9kZXMoKVt0aWNrTGFiZWxzLnNpemUoKSAtIDFdOwogICAgICAgICAgICBpZiAoIXV0aWxzJDEuRE9NLmNsaWVudFJlY3RJbnNpZGUobGFzdFRpY2tMYWJlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSwgYm91bmRpbmdCb3gpKSB7CiAgICAgICAgICAgICAgICBkMy5zZWxlY3QobGFzdFRpY2tMYWJlbCkuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIE51bWVyaWMucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdUaWNrTGFiZWxzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgdmlzaWJsZVRpY2tMYWJlbHMgPSB0aGlzLl90aWNrTGFiZWxDb250YWluZXIKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoIi4iICsgYXhpcyQyLkF4aXMuVElDS19MQUJFTF9DTEFTUykKICAgICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgIHZhciB2aXNpYmlsaXR5ID0gZDMuc2VsZWN0KHRoaXMpLnN0eWxlKCJ2aXNpYmlsaXR5Iik7CiAgICAgICAgICAgICAgICByZXR1cm4gKHZpc2liaWxpdHkgPT09ICJpbmhlcml0IikgfHwgKHZpc2liaWxpdHkgPT09ICJ2aXNpYmxlIik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgdmlzaWJsZVRpY2tMYWJlbFJlY3RzID0gdmlzaWJsZVRpY2tMYWJlbHMubm9kZXMoKS5tYXAoZnVuY3Rpb24gKGxhYmVsKSB7IHJldHVybiBsYWJlbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsgfSk7CiAgICAgICAgICAgIHZhciBpbnRlcnZhbCA9IDE7CiAgICAgICAgICAgIHdoaWxlICghdGhpcy5faGFzT3ZlcmxhcFdpdGhJbnRlcnZhbChpbnRlcnZhbCwgdmlzaWJsZVRpY2tMYWJlbFJlY3RzKSAmJiBpbnRlcnZhbCA8IHZpc2libGVUaWNrTGFiZWxSZWN0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGludGVydmFsICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmlzaWJsZVRpY2tMYWJlbHMuZWFjaChmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgdmFyIHRpY2tMYWJlbCA9IGQzLnNlbGVjdCh0aGlzKTsKICAgICAgICAgICAgICAgIGlmIChpICUgaW50ZXJ2YWwgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aWNrTGFiZWwuc3R5bGUoInZpc2liaWxpdHkiLCAiaGlkZGVuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgZXZlbmx5IHNwYWNpbmcgdGhlIGxhYmVscyBvbiB0aGUgYXhpcy4KICAgICAgICAgKiBAcmV0dXJuIHRlc3QgdG8gc2VlIGlmIHRha2luZyBldmVyeSBgaW50ZXJ2YWxgIHJlY3JhbmdsZSBmcm9tIGByZWN0c2AKICAgICAgICAgKiAgICAgICAgIHdpbGwgcmVzdWx0IGluIGxhYmVscyBub3Qgb3ZlcmxhcHBpbmcKICAgICAgICAgKgogICAgICAgICAqIEZvciB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQgcG9zaXRpb25pbmcgb2YgdGhlIHRoaWNrcywgd2Ugd2FudCB0aGUgcGFkZGluZwogICAgICAgICAqIGJldHdlZW4gdGhlIGxhYmVscyB0byBiZSAzeCwgc3VjaCB0aGF0IHRoZSBsYWJlbCB3aWxsIGJlICBgcGFkZGluZ2AgZGlzdGFuY2UKICAgICAgICAgKiBmcm9tIHRoZSB0aWNrIGFuZCAyICogYHBhZGRpbmdgIGRpc3RhbmNlIChvciBtb3JlKSBmcm9tIHRoZSBuZXh0IHRpY2s6CiAgICAgICAgICogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvcHVsbC8xODEyCiAgICAgICAgICovCiAgICAgICAgTnVtZXJpYy5wcm90b3R5cGUuX2hhc092ZXJsYXBXaXRoSW50ZXJ2YWwgPSBmdW5jdGlvbiAoaW50ZXJ2YWwsIHJlY3RzKSB7CiAgICAgICAgICAgIHZhciBwYWRkaW5nID0gKHRoaXMuX3RpY2tMYWJlbFBvc2l0aW9uaW5nID09PSAiY2VudGVyIikKICAgICAgICAgICAgICAgID8gdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkKICAgICAgICAgICAgICAgIDogdGhpcy50aWNrTGFiZWxQYWRkaW5nKCkgKiAzOwogICAgICAgICAgICB2YXIgcmVjdHNXaXRoUGFkZGluZyA9IHJlY3RzLm1hcChmdW5jdGlvbiAocmVjdCkgeyByZXR1cm4gdXRpbHMkMS5ET00uZXhwYW5kUmVjdChyZWN0LCBwYWRkaW5nKTsgfSk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVjdHNXaXRoUGFkZGluZy5sZW5ndGggLSBpbnRlcnZhbDsgaSArPSBpbnRlcnZhbCkgewogICAgICAgICAgICAgICAgdmFyIGN1cnJSZWN0ID0gcmVjdHNXaXRoUGFkZGluZ1tpXTsKICAgICAgICAgICAgICAgIHZhciBuZXh0UmVjdCA9IHJlY3RzV2l0aFBhZGRpbmdbaSArIGludGVydmFsXTsKICAgICAgICAgICAgICAgIGlmICh1dGlscyQxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoY3VyclJlY3QsIG5leHRSZWN0KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgICAgIE51bWVyaWMucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fbWVhc3VyZXIucmVzZXQoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBOdW1lcmljOwogICAgfShheGlzJDIuQXhpcykpOwogICAgZXhwb3J0cy5OdW1lcmljID0gTnVtZXJpYzsKICAgIH0pOwoKICAgIHZhciB0aWNrR2VuZXJhdG9ycyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIFRpY2tHZW5lcmF0b3IgdXNpbmcgdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4KICAgICAqCiAgICAgKiBHZW5lcmF0ZXMgdGlja3MgYXQgbXVsdGlwbGVzIG9mIHRoZSBpbnRlcnZhbCB3aGlsZSBhbHNvIGluY2x1ZGluZyB0aGUgZG9tYWluIGJvdW5kYXJpZXMuCiAgICAgKgogICAgICogQHBhcmFtIHtudW1iZXJ9IGludGVydmFsCiAgICAgKiBAcmV0dXJucyB7VGlja0dlbmVyYXRvcn0KICAgICAqLwogICAgZnVuY3Rpb24gaW50ZXJ2YWxUaWNrR2VuZXJhdG9yKGludGVydmFsKSB7CiAgICAgICAgaWYgKGludGVydmFsIDw9IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJpbnRlcnZhbCBtdXN0IGJlIHBvc2l0aXZlIG51bWJlciIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHMpIHsKICAgICAgICAgICAgdmFyIGRvbWFpbiA9IHMuZG9tYWluKCk7CiAgICAgICAgICAgIHZhciBsb3cgPSBNYXRoLm1pbihkb21haW5bMF0sIGRvbWFpblsxXSk7CiAgICAgICAgICAgIHZhciBoaWdoID0gTWF0aC5tYXgoZG9tYWluWzBdLCBkb21haW5bMV0pOwogICAgICAgICAgICB2YXIgZmlyc3RUaWNrID0gTWF0aC5jZWlsKGxvdyAvIGludGVydmFsKSAqIGludGVydmFsOwogICAgICAgICAgICB2YXIgbnVtVGlja3MgPSBNYXRoLmZsb29yKChoaWdoIC0gZmlyc3RUaWNrKSAvIGludGVydmFsKSArIDE7CiAgICAgICAgICAgIHZhciBsb3dUaWNrcyA9IGxvdyAlIGludGVydmFsID09PSAwID8gW10gOiBbbG93XTsKICAgICAgICAgICAgdmFyIG1pZGRsZVRpY2tzID0gdXRpbHMkMS5NYXRoLnJhbmdlKDAsIG51bVRpY2tzKS5tYXAoZnVuY3Rpb24gKHQpIHsgcmV0dXJuIGZpcnN0VGljayArIHQgKiBpbnRlcnZhbDsgfSk7CiAgICAgICAgICAgIHZhciBoaWdoVGlja3MgPSBoaWdoICUgaW50ZXJ2YWwgPT09IDAgPyBbXSA6IFtoaWdoXTsKICAgICAgICAgICAgcmV0dXJuIGxvd1RpY2tzLmNvbmNhdChtaWRkbGVUaWNrcykuY29uY2F0KGhpZ2hUaWNrcyk7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuaW50ZXJ2YWxUaWNrR2VuZXJhdG9yID0gaW50ZXJ2YWxUaWNrR2VuZXJhdG9yOwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgVGlja0dlbmVyYXRvciByZXR1cm5zIG9ubHkgaW50ZWdlciB0aWNrIHZhbHVlcy4KICAgICAqCiAgICAgKiBAcmV0dXJucyB7VGlja0dlbmVyYXRvcn0KICAgICAqLwogICAgZnVuY3Rpb24gaW50ZWdlclRpY2tHZW5lcmF0b3IoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzKSB7CiAgICAgICAgICAgIHZhciBkZWZhdWx0VGlja3MgPSBzLmRlZmF1bHRUaWNrcygpOwogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFRpY2tzLmZpbHRlcihmdW5jdGlvbiAodGljaywgaSkgeyByZXR1cm4gKHRpY2sgJSAxID09PSAwKSB8fCAoaSA9PT0gMCkgfHwgKGkgPT09IGRlZmF1bHRUaWNrcy5sZW5ndGggLSAxKTsgfSk7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuaW50ZWdlclRpY2tHZW5lcmF0b3IgPSBpbnRlZ2VyVGlja0dlbmVyYXRvcjsKICAgIH0pOwoKICAgIHZhciBwYW5ab29tQ29uc3RyYWludHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIC8qKgogICAgICogUmV0dXJuIGB2YWx1ZWAgaWYgaXRzIGRpc3RhbmNlIHRvIGBjZW50ZXJgIHdhcyBzY2FsZWQgYnkgYHpvb21gLgogICAgICoKICAgICAqIGUuZy4gem9vbU91dCgxMDAsIDIsIDUwKSAtPiAxNTAKICAgICAqIGUuZy4gem9vbU91dCgwLCAyLCA1MCkgLT4gLTUwCiAgICAgKiBlLmcuIHpvb21PdXQoMTAwLCAwLjUsIDUwKSAtPiA3NQogICAgICogZS5nLiB6b29tT3V0KDAsIDAuNSwgNTApIC0+IDI1CiAgICAgKi8KICAgIGZ1bmN0aW9uIHpvb21PdXQodmFsdWUsIHpvb20sIGNlbnRlcikgewogICAgICAgIHJldHVybiBjZW50ZXIgLSAoY2VudGVyIC0gdmFsdWUpICogem9vbTsKICAgIH0KICAgIGV4cG9ydHMuem9vbU91dCA9IHpvb21PdXQ7CiAgICAvKioKICAgICAqIFRoaXMgaXMgdGhlIHpvb21PdXQgbWV0aG9kIGFsZ2VicmEtZWQgdG8gc29sdmUgZm9yIHRoZSBgY2VudGVyYCB2YWx1ZQogICAgICogZ2l2ZW4gdGhlIG90aGVyIHRocmVlLiBUaGUgInRhcmdldCIgaXMgdGhlIHJldHVybiB2YWx1ZSBvZiB6b29tT3V0LgogICAgICovCiAgICBmdW5jdGlvbiBnZXRab29tT3V0Q2VudGVyKHZhbHVlLCB6b29tLCB0YXJnZXQpIHsKICAgICAgICByZXR1cm4gKHZhbHVlICogem9vbSAtIHRhcmdldCkgLyAoem9vbSAtIDEpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm4gcG9zc2libHkgZGlmZmVyZW50IHpvb21BbW91bnQgYW5kIGNlbnRlclBvaW50IHZhbHVlcyBzdWNoIHRoYXQgYXBwbHlpbmcgdGhlIHpvb20KICAgICAqIHRvIHRoZSBzY2FsZSByZXNwZWN0cyB0aGUgZ2l2ZW4gbWluL21heCBleHRlbnRzIGFuZCB2YWx1ZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnN0cmFpbmVkWm9vbShzY2FsZSwgem9vbUFtb3VudCwgY2VudGVyUG9pbnQsIG1pbkRvbWFpbkV4dGVudCwgbWF4RG9tYWluRXh0ZW50LCBtaW5Eb21haW5WYWx1ZSwgbWF4RG9tYWluVmFsdWUpIHsKICAgICAgICB6b29tQW1vdW50ID0gY29uc3RyYWluWm9vbUV4dGVudHMoc2NhbGUsIHpvb21BbW91bnQsIG1pbkRvbWFpbkV4dGVudCwgbWF4RG9tYWluRXh0ZW50KTsKICAgICAgICByZXR1cm4gY29uc3RyYWluWm9vbVZhbHVlcyhzY2FsZSwgem9vbUFtb3VudCwgY2VudGVyUG9pbnQsIG1pbkRvbWFpblZhbHVlLCBtYXhEb21haW5WYWx1ZSk7CiAgICB9CiAgICBleHBvcnRzLmNvbnN0cmFpbmVkWm9vbSA9IGNvbnN0cmFpbmVkWm9vbTsKICAgIGZ1bmN0aW9uIGNvbnN0cmFpblpvb21FeHRlbnRzKHNjYWxlLCB6b29tQW1vdW50LCBtaW5Eb21haW5FeHRlbnQsIG1heERvbWFpbkV4dGVudCkgewogICAgICAgIHZhciBleHRlbnRJbmNyZWFzaW5nID0gem9vbUFtb3VudCA+IDE7CiAgICAgICAgdmFyIGJvdW5kaW5nRG9tYWluRXh0ZW50ID0gZXh0ZW50SW5jcmVhc2luZyA/IG1heERvbWFpbkV4dGVudCA6IG1pbkRvbWFpbkV4dGVudDsKICAgICAgICBpZiAoYm91bmRpbmdEb21haW5FeHRlbnQgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gem9vbUFtb3VudDsKICAgICAgICB9CiAgICAgICAgdmFyIF9hID0gc2NhbGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSwgc2NhbGVEb21haW5NaW4gPSBfYVswXSwgc2NhbGVEb21haW5NYXggPSBfYVsxXTsKICAgICAgICB2YXIgZG9tYWluRXh0ZW50ID0gTWF0aC5hYnMoc2NhbGVEb21haW5NYXggLSBzY2FsZURvbWFpbk1pbik7CiAgICAgICAgdmFyIGNvbXBhcmVGID0gZXh0ZW50SW5jcmVhc2luZyA/IE1hdGgubWluIDogTWF0aC5tYXg7CiAgICAgICAgcmV0dXJuIGNvbXBhcmVGKHpvb21BbW91bnQsIGJvdW5kaW5nRG9tYWluRXh0ZW50IC8gZG9tYWluRXh0ZW50KTsKICAgIH0KICAgIGV4cG9ydHMuY29uc3RyYWluWm9vbUV4dGVudHMgPSBjb25zdHJhaW5ab29tRXh0ZW50czsKICAgIC8qKgogICAgICogTW9kaWZ5IHpvb21BbW91bnQgYW5kIGNlbnRlclBvaW50IHN1Y2ggdGhhdCBhIHBhbnpvb20gd2lsbCBzdGF5IGluc2lkZQogICAgICogdGhlIGJvdW5kcyBkZWZpbmVkIGJ5IG1pbkRvbWFpblZhbHVlIGFuZCBtYXhEb21haW5WYWx1ZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29uc3RyYWluWm9vbVZhbHVlcyhzY2FsZSwgem9vbUFtb3VudCwgY2VudGVyUG9pbnQsIG1pbkRvbWFpblZhbHVlLCBtYXhEb21haW5WYWx1ZSkgewogICAgICAgIC8vIHdoZW4gem9vbWluZyBpbiwgd2UgZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBvdmVyZmxvd2luZyBkb21haW4KICAgICAgICBpZiAoem9vbUFtb3VudCA8PSAxKSB7CiAgICAgICAgICAgIHJldHVybiB7IGNlbnRlclBvaW50OiBjZW50ZXJQb2ludCwgem9vbUFtb3VudDogem9vbUFtb3VudCB9OwogICAgICAgIH0KICAgICAgICAvLyBpZiBubyBjb25zdHJhaW50cyBzZXQsIHdlJ3JlIGRvbmUKICAgICAgICBpZiAobWluRG9tYWluVmFsdWUgPT0gbnVsbCAmJiBtYXhEb21haW5WYWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiB7IGNlbnRlclBvaW50OiBjZW50ZXJQb2ludCwgem9vbUFtb3VudDogem9vbUFtb3VudCB9OwogICAgICAgIH0KICAgICAgICB2YXIgcmFuZ2VSZXZlcnNlZCA9IGlzUmFuZ2VSZXZlcnNlZChzY2FsZSk7CiAgICAgICAgdmFyIGRvbWFpblJldmVyc2VkID0gaXNEb21haW5SZXZlcnNlZChzY2FsZSk7CiAgICAgICAgdmFyIGRlZmF1bHREb21haW5NaW4gPSBkb21haW5SZXZlcnNlZCA/IEluZmluaXR5IDogLUluZmluaXR5OwogICAgICAgIHZhciBkZWZhdWx0RG9tYWluTWF4ID0gZG9tYWluUmV2ZXJzZWQgPyAtSW5maW5pdHkgOiBJbmZpbml0eTsKICAgICAgICBtaW5Eb21haW5WYWx1ZSA9IG1pbkRvbWFpblZhbHVlID09IG51bGwgPyBkZWZhdWx0RG9tYWluTWluIDogbWluRG9tYWluVmFsdWU7CiAgICAgICAgbWF4RG9tYWluVmFsdWUgPSBtYXhEb21haW5WYWx1ZSA9PSBudWxsID8gZGVmYXVsdERvbWFpbk1heCA6IG1heERvbWFpblZhbHVlOwogICAgICAgIHZhciBfYSA9IHNjYWxlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksIHNjYWxlRG9tYWluTWluID0gX2FbMF0sIHNjYWxlRG9tYWluTWF4ID0gX2FbMV07CiAgICAgICAgdmFyIG1heFJhbmdlID0gc2NhbGUuc2NhbGVUcmFuc2Zvcm1hdGlvbihtYXhEb21haW5WYWx1ZSk7CiAgICAgICAgdmFyIGN1cnJlbnRNYXhSYW5nZSA9IHNjYWxlLnNjYWxlVHJhbnNmb3JtYXRpb24oc2NhbGVEb21haW5NYXgpOwogICAgICAgIHZhciBuZXdNYXhSYW5nZSA9IHpvb21PdXQoY3VycmVudE1heFJhbmdlLCB6b29tQW1vdW50LCBjZW50ZXJQb2ludCk7CiAgICAgICAgdmFyIG1pblJhbmdlID0gc2NhbGUuc2NhbGVUcmFuc2Zvcm1hdGlvbihtaW5Eb21haW5WYWx1ZSk7CiAgICAgICAgdmFyIGN1cnJlbnRNaW5SYW5nZSA9IHNjYWxlLnNjYWxlVHJhbnNmb3JtYXRpb24oc2NhbGVEb21haW5NaW4pOwogICAgICAgIHZhciBuZXdNaW5SYW5nZSA9IHpvb21PdXQoY3VycmVudE1pblJhbmdlLCB6b29tQW1vdW50LCBjZW50ZXJQb2ludCk7CiAgICAgICAgdmFyIG1pbk1heExlbmd0aCA9IE1hdGguYWJzKG1heFJhbmdlIC0gbWluUmFuZ2UpOwogICAgICAgIHZhciBuZXdSYW5nZUxlbmd0aCA9IE1hdGguYWJzKG5ld01heFJhbmdlIC0gbmV3TWluUmFuZ2UpOwogICAgICAgIGlmIChuZXdSYW5nZUxlbmd0aCA+IG1pbk1heExlbmd0aCkgewogICAgICAgICAgICAvLyBUaGUgbmV3IHpvb20gc2ltcGx5IHdvbid0IGZpdC4gSW5zdGVhZCBqdXN0IHNldCB0aGUgem9vbSBhbW91bnQgdG8gYSBmdWxsIHpvb20gb3V0LgogICAgICAgICAgICB2YXIgd2FudGVkWm9vbUFtb3VudCA9IChtYXhSYW5nZSAtIG1pblJhbmdlKSAvIChjdXJyZW50TWF4UmFuZ2UgLSBjdXJyZW50TWluUmFuZ2UpOwogICAgICAgICAgICBpZiAod2FudGVkWm9vbUFtb3VudCAhPT0gMSkgewogICAgICAgICAgICAgICAgLy8gb25seSBzb2x2ZSBmb3IgY2VudGVyUG9pbnQgaWYgd2FudGVkWm9vbUFtb3VudCBpc24ndCAxIHRvIHByZXZlbnQgTmFOLgogICAgICAgICAgICAgICAgdmFyIHdhbnRlZENlbnRlclBvaW50ID0gZ2V0Wm9vbU91dENlbnRlcihjdXJyZW50TWF4UmFuZ2UsIHdhbnRlZFpvb21BbW91bnQsIG1heFJhbmdlKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyUG9pbnQ6IHdhbnRlZENlbnRlclBvaW50LAogICAgICAgICAgICAgICAgICAgIHpvb21BbW91bnQ6IHdhbnRlZFpvb21BbW91bnQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gdGhlIGNlbnRlclBvaW50IGRvZXNuJ3QgbWF0dGVyIGF0IGFsbCBoZXJlIGJ1dCB3ZSBtdXN0IGluY2x1ZGUgaXQKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyUG9pbnQ6IGNlbnRlclBvaW50LAogICAgICAgICAgICAgICAgICAgIHpvb21BbW91bnQ6IHdhbnRlZFpvb21BbW91bnQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyB0aGUgem9vbSBkb2VzIGZpdCwgYnV0IG9uZSBlbmQgaXMgb3V0c2lkZS4gSW4gdGhpcyBjYXNlIGp1c3QgbnVkZ2UgdGhlIGVkZ2UgaW4KICAgICAgICAgICAgaWYgKG5ld01heFJhbmdlID4gbWF4UmFuZ2UgIT0gcmFuZ2VSZXZlcnNlZCkgewogICAgICAgICAgICAgICAgLy8gcHJldmVudCBvdXQgb2YgYm91bmRzIG9uIG1heCBlZGdlLgogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBjZW50ZXJQb2ludDogZ2V0Wm9vbU91dENlbnRlcihjdXJyZW50TWF4UmFuZ2UsIHpvb21BbW91bnQsIG1heFJhbmdlKSwKICAgICAgICAgICAgICAgICAgICB6b29tQW1vdW50OiB6b29tQW1vdW50LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChuZXdNaW5SYW5nZSA8IG1pblJhbmdlICE9IHJhbmdlUmV2ZXJzZWQpIHsKICAgICAgICAgICAgICAgIC8vIHByZXZlbnQgb3V0IG9mIGJvdW5kcyBvbiBtaW4gZWRnZS4KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgY2VudGVyUG9pbnQ6IGdldFpvb21PdXRDZW50ZXIoY3VycmVudE1pblJhbmdlLCB6b29tQW1vdW50LCBtaW5SYW5nZSksCiAgICAgICAgICAgICAgICAgICAgem9vbUFtb3VudDogem9vbUFtb3VudCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBjZW50ZXJQb2ludDogY2VudGVyUG9pbnQsIHpvb21BbW91bnQ6IHpvb21BbW91bnQgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGV4cG9ydHMuY29uc3RyYWluWm9vbVZhbHVlcyA9IGNvbnN0cmFpblpvb21WYWx1ZXM7CiAgICAvKioKICAgICAqIFJldHVybnMgYSBuZXcgdHJhbnNsYXRpb24gdmFsdWUgdGhhdCByZXNwZWN0cyBkb21haW4gbWluL21heCB2YWx1ZQogICAgICogY29uc3RyYWludHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnN0cmFpbmVkVHJhbnNsYXRpb24oc2NhbGUsIHRyYW5zbGF0aW9uLCBtaW5Eb21haW5WYWx1ZSwgbWF4RG9tYWluVmFsdWUpIHsKICAgICAgICB2YXIgX2EgPSBzY2FsZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpLCBzY2FsZURvbWFpbk1pbiA9IF9hWzBdLCBzY2FsZURvbWFpbk1heCA9IF9hWzFdOwogICAgICAgIHZhciByZXZlcnNlZCA9IGlzUmFuZ2VSZXZlcnNlZChzY2FsZSk7CiAgICAgICAgaWYgKHRyYW5zbGF0aW9uID4gMCAhPT0gcmV2ZXJzZWQpIHsKICAgICAgICAgICAgdmFyIGJvdW5kID0gbWF4RG9tYWluVmFsdWU7CiAgICAgICAgICAgIGlmIChib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudE1heFJhbmdlID0gc2NhbGUuc2NhbGVUcmFuc2Zvcm1hdGlvbihzY2FsZURvbWFpbk1heCk7CiAgICAgICAgICAgICAgICB2YXIgbWF4UmFuZ2UgPSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKGJvdW5kKTsKICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gKHJldmVyc2VkID8gTWF0aC5tYXggOiBNYXRoLm1pbikoY3VycmVudE1heFJhbmdlICsgdHJhbnNsYXRpb24sIG1heFJhbmdlKSAtIGN1cnJlbnRNYXhSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIGJvdW5kID0gbWluRG9tYWluVmFsdWU7CiAgICAgICAgICAgIGlmIChib3VuZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudE1pblJhbmdlID0gc2NhbGUuc2NhbGVUcmFuc2Zvcm1hdGlvbihzY2FsZURvbWFpbk1pbik7CiAgICAgICAgICAgICAgICB2YXIgbWluUmFuZ2UgPSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKGJvdW5kKTsKICAgICAgICAgICAgICAgIHRyYW5zbGF0aW9uID0gKHJldmVyc2VkID8gTWF0aC5taW4gOiBNYXRoLm1heCkoY3VycmVudE1pblJhbmdlICsgdHJhbnNsYXRpb24sIG1pblJhbmdlKSAtIGN1cnJlbnRNaW5SYW5nZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJhbnNsYXRpb247CiAgICB9CiAgICBleHBvcnRzLmNvbnN0cmFpbmVkVHJhbnNsYXRpb24gPSBjb25zdHJhaW5lZFRyYW5zbGF0aW9uOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWZmIHRoZSBzY2FsZS5yYW5nZVsxXSA8IHNjYWxlLnJhbmdlWzBdLgogICAgICovCiAgICBmdW5jdGlvbiBpc1JhbmdlUmV2ZXJzZWQoc2NhbGUpIHsKICAgICAgICB2YXIgcmFuZ2UgPSBzY2FsZS5yYW5nZSgpOwogICAgICAgIHJldHVybiByYW5nZVsxXSA8IHJhbmdlWzBdOwogICAgfQogICAgZnVuY3Rpb24gaXNEb21haW5SZXZlcnNlZChzY2FsZSkgewogICAgICAgIHZhciBkb21haW4gPSBzY2FsZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpOwogICAgICAgIHJldHVybiBkb21haW5bMV0gPCBkb21haW5bMF07CiAgICB9CiAgICB9KTsKCiAgICB2YXIgc2NhbGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB2YXIgU2NhbGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBTY2FsZSBpcyBhIGZ1bmN0aW9uIChpbiB0aGUgbWF0aGVtYXRpY2FsIHNlbnNlKSB0aGF0IG1hcHMgdmFsdWVzIGZyb20gYSBkb21haW4gdG8gYSByYW5nZS4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFNjYWxlKCkgewogICAgICAgICAgICB0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlSWQgPSAwOwogICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICB0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVycyA9IG5ldyB1dGlscyQxLlNldCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhbiBhcnJheSBvZiBwb3RlbnRpYWwgZG9tYWluIHZhbHVlcywgY29tcHV0ZXMgdGhlIGV4dGVudCBvZiB0aG9zZSB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RbXX0gdmFsdWVzCiAgICAgICAgICogQHJldHVybnMge0RbXX0gVGhlIGV4dGVudCBvZiB0aGUgaW5wdXQgdmFsdWVzLgogICAgICAgICAqLwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOyAvLyB0aGlzIHNob3VsZCBiZSBvdmVyd3JpdHRlbgogICAgICAgIH07CiAgICAgICAgU2NhbGUucHJvdG90eXBlLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyA9IGZ1bmN0aW9uIChpZ25vcmVBdHRhY2hTdGF0ZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAoaWdub3JlQXR0YWNoU3RhdGUgPT09IHZvaWQgMCkgeyBpZ25vcmVBdHRhY2hTdGF0ZSA9IGZhbHNlOyB9CiAgICAgICAgICAgIHZhciBwcm92aWRlckFycmF5ID0gW107CiAgICAgICAgICAgIHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmZvckVhY2goZnVuY3Rpb24gKHByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICB2YXIgZXh0ZW50cyA9IHByb3ZpZGVyKF90aGlzLCBpZ25vcmVBdHRhY2hTdGF0ZSk7CiAgICAgICAgICAgICAgICBwcm92aWRlckFycmF5ID0gcHJvdmlkZXJBcnJheS5jb25jYXQoZXh0ZW50cyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gcHJvdmlkZXJBcnJheTsKICAgICAgICB9OwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5fZ2V0RXh0ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gW107IC8vIHRoaXMgc2hvdWxkIGJlIG92ZXJ3cml0dGVuCiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIFNjYWxlIHVwZGF0ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlQ2FsbGJhY2t9IGNhbGxiYWNrLgogICAgICAgICAqIEByZXR1cm5zIHtTY2FsZX0gVGhlIGNhbGxpbmcgU2NhbGUuCiAgICAgICAgICovCiAgICAgICAgU2NhbGUucHJvdG90eXBlLm9uVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBTY2FsZSB1cGRhdGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTY2FsZUNhbGxiYWNrfSBjYWxsYmFjay4KICAgICAgICAgKiBAcmV0dXJucyB7U2NhbGV9IFRoZSBjYWxsaW5nIFNjYWxlLgogICAgICAgICAqLwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5vZmZVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgU2NhbGUucHJvdG90eXBlLl9kaXNwYXRjaFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlSWQrKzsKICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBTY2FsZSdzIGRvbWFpbiBzbyB0aGF0IGl0IHNwYW5zIHRoZSBFeHRlbnRzIG9mIGFsbCBpdHMgRXh0ZW50c1Byb3ZpZGVycy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtTY2FsZX0gVGhlIGNhbGxpbmcgU2NhbGUuCiAgICAgICAgICovCiAgICAgICAgU2NhbGUucHJvdG90eXBlLmF1dG9Eb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fc2V0RG9tYWluKHRoaXMuX2dldEV4dGVudCgpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyBgLmF1dG9Eb21haW4oKWAgaWYgdGhlIGRvbWFpbiBpcyBub3QgZXhwbGljaXRseSBzZXQuCiAgICAgICAgICovCiAgICAgICAgU2NhbGUucHJvdG90eXBlLmF1dG9Eb21haW5JZkF1dG9tYXRpY01vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvRG9tYWluQXV0b21hdGljYWxseSkgewogICAgICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIHRoZSByYW5nZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4gZG9tYWluIHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEfSB2YWx1ZQogICAgICAgICAqIEByZXR1cm5zIHtSfSBUaGUgcmFuZ2UgdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgc3VwcGxpZWQgZG9tYWluIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNjYWxlIik7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFuIGFycmF5IG9mIHRpY2sgdmFsdWVzIHNwYW5uaW5nIHRoZSBkb21haW4uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJucyB7RFtdfQogICAgICAgICAqLwogICAgICAgIFNjYWxlLnByb3RvdHlwZS50aWNrcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZG9tYWluKCk7CiAgICAgICAgfTsKICAgICAgICBTY2FsZS5wcm90b3R5cGUuZG9tYWluID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXREb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9Eb21haW5BdXRvbWF0aWNhbGx5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXREb21haW4odmFsdWVzKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBTY2FsZS5wcm90b3R5cGUuX2dldERvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0RG9tYWluIik7CiAgICAgICAgfTsKICAgICAgICBTY2FsZS5wcm90b3R5cGUuX3NldERvbWFpbiA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kb21haW5Nb2RpZmljYXRpb25JblByb2dyZXNzID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbih2YWx1ZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2RvbWFpbk1vZGlmaWNhdGlvbkluUHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgU2NhbGUucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2JhY2tpbmdEb21haW4iKTsKICAgICAgICB9OwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5yYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0UmFuZ2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NldFJhbmdlKHZhbHVlcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgU2NhbGUucHJvdG90eXBlLl9nZXRSYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBfZ2V0UmFuZ2UiKTsKICAgICAgICB9OwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5fc2V0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX3NldFJhbmdlIik7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGFuIEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIgdG8gdGhlIFNjYWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTY2FsZXMuSW5jbHVkZWRWYWx1ZXNQcm92aWRlcn0gcHJvdmlkZXIKICAgICAgICAgKiBAcmV0dXJucyB7U2NhbGV9IFRoZSBjYWxsaW5nIFNjYWxlLgogICAgICAgICAqLwogICAgICAgIFNjYWxlLnByb3RvdHlwZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7CiAgICAgICAgICAgIHRoaXMuX2luY2x1ZGVkVmFsdWVzUHJvdmlkZXJzLmFkZChwcm92aWRlcik7CiAgICAgICAgICAgIHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgdGhlIEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIgZnJvbSB0aGUgU2NhbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlcy5JbmNsdWRlZFZhbHVlc1Byb3ZpZGVyfSBwcm92aWRlcgogICAgICAgICAqIEByZXR1cm5zIHtTY2FsZX0gVGhlIGNhbGxpbmcgU2NhbGUuCiAgICAgICAgICovCiAgICAgICAgU2NhbGUucHJvdG90eXBlLnJlbW92ZUluY2x1ZGVkVmFsdWVzUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHsKICAgICAgICAgICAgdGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcnMuZGVsZXRlKHByb3ZpZGVyKTsKICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgU2NhbGUucHJvdG90eXBlLnVwZGF0ZUlkID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlSWQ7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gU2NhbGU7CiAgICB9KCkpOwogICAgZXhwb3J0cy5TY2FsZSA9IFNjYWxlOwogICAgfSk7CgogICAgdmFyIGNhdGVnb3J5U2NhbGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgogICAgdmFyIFRSQU5TRk9STUFUSU9OX1NQQUNFID0gWzAsIDFdOwogICAgdmFyIENhdGVnb3J5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoQ2F0ZWdvcnksIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBDYXRlZ29yeSBTY2FsZSBtYXBzIHN0cmluZ3MgdG8gbnVtYmVycy4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIENhdGVnb3J5KCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fcmFuZ2UgPSBbMCwgMV07CiAgICAgICAgICAgIF90aGlzLl9kM1NjYWxlID0gZDMuc2NhbGVCYW5kKCk7CiAgICAgICAgICAgIF90aGlzLl9kM1NjYWxlLnJhbmdlKFRSQU5TRk9STUFUSU9OX1NQQUNFKTsKICAgICAgICAgICAgX3RoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSA9IGQzLnNjYWxlTGluZWFyKCk7CiAgICAgICAgICAgIF90aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKFRSQU5TRk9STUFUSU9OX1NQQUNFKTsKICAgICAgICAgICAgdmFyIGQzSW5uZXJQYWRkaW5nID0gMC4zOwogICAgICAgICAgICBfdGhpcy5faW5uZXJQYWRkaW5nID0gQ2F0ZWdvcnkuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZyhkM0lubmVyUGFkZGluZyk7CiAgICAgICAgICAgIF90aGlzLl9vdXRlclBhZGRpbmcgPSBDYXRlZ29yeS5fY29udmVydFRvUGxvdHRhYmxlT3V0ZXJQYWRkaW5nKDAuNSwgZDNJbm5lclBhZGRpbmcpOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBhIGNsb25lIG9mIHRoaXMgY2F0ZWdvcnkgc2NhbGUgdGhhdCBob2xkcyB0aGUgc2FtZSBwYW4vem9vbSwgcGFkZGluZywgZG9tYWluIGFuZCByYW5nZSwgYnV0CiAgICAgICAgICogd2l0aG91dCBhbnkgaW5jbHVkZWQgdmFsdWVzIHByb3ZpZGVycy4KICAgICAgICAgKi8KICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuY2xvbmVXaXRob3V0UHJvdmlkZXJzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2NhbGUgPSBuZXcgQ2F0ZWdvcnkoKQogICAgICAgICAgICAgICAgLmRvbWFpbih0aGlzLmRvbWFpbigpKQogICAgICAgICAgICAgICAgLnJhbmdlKHRoaXMucmFuZ2UoKSkKICAgICAgICAgICAgICAgIC5pbm5lclBhZGRpbmcodGhpcy5pbm5lclBhZGRpbmcoKSkKICAgICAgICAgICAgICAgIC5vdXRlclBhZGRpbmcodGhpcy5vdXRlclBhZGRpbmcoKSk7CiAgICAgICAgICAgIHNjYWxlLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oKSk7CiAgICAgICAgICAgIHJldHVybiBzY2FsZTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuQXJyYXkudW5pcSh2YWx1ZXMpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLl9nZXRFeHRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB1dGlscyQxLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSk7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuZG9tYWluID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5kb21haW4uY2FsbCh0aGlzLCB2YWx1ZXMpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBkb21haW4gdmFsdWVzIHRoYXQgbGllIGluc2lkZSB0aGUgZ2l2ZW4gcmFuZ2UuCiAgICAgICAgICogQHBhcmFtIHJhbmdlCiAgICAgICAgICogQHJldHVybnMge3N0cmluZ1tdfQogICAgICAgICAqLwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5pbnZlcnRSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAocmFuZ2UgPT09IHZvaWQgMCkgeyByYW5nZSA9IHRoaXMucmFuZ2UoKTsgfQogICAgICAgICAgICB2YXIgcmFuZ2VCYW5kID0gdGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKTsKICAgICAgICAgICAgdmFyIGRvbWFpblN0YXJ0Tm9ybWFsaXplZCA9IHRoaXMuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbihyYW5nZVswXSk7CiAgICAgICAgICAgIHZhciBkb21haW5FbmROb3JtYWxpemVkID0gdGhpcy5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uKHJhbmdlWzFdKTsKICAgICAgICAgICAgdmFyIGRvbWFpbiA9IHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIC8vIG1hcCBbImEiLCAiYiIsICJjIl0gdG8gdGhlIG5vcm1hbGl6ZWQgY2VudGVyIHBvc2l0aW9uIChlLmcuIFswLjI1LCAuNSwgMC43NV0pLiBXZSBhZGQKICAgICAgICAgICAgLy8gaGFsZiB0aGUgcmFuZ2VCYW5kIHRvIGNvbnNpZGVyIHRoZSBjZW50ZXIgb2YgdGhlIGJhcnMKICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWREb21haW4gPSBkb21haW4ubWFwKGZ1bmN0aW9uIChkKSB7IHJldHVybiBfdGhpcy5fZDNTY2FsZShkKSArIHJhbmdlQmFuZCAvIDI7IH0pOwogICAgICAgICAgICB2YXIgZG9tYWluU3RhcnQgPSBkMy5iaXNlY3Qobm9ybWFsaXplZERvbWFpbiwgZG9tYWluU3RhcnROb3JtYWxpemVkKTsKICAgICAgICAgICAgdmFyIGRvbWFpbkVuZCA9IGQzLmJpc2VjdChub3JtYWxpemVkRG9tYWluLCBkb21haW5FbmROb3JtYWxpemVkKTsKICAgICAgICAgICAgcmV0dXJuIGRvbWFpbi5zbGljZShkb21haW5TdGFydCwgZG9tYWluRW5kKTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5yYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmFuZ2UuY2FsbCh0aGlzLCB2YWx1ZXMpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkuX2NvbnZlcnRUb1Bsb3R0YWJsZUlubmVyUGFkZGluZyA9IGZ1bmN0aW9uIChkM0lubmVyUGFkZGluZykgewogICAgICAgICAgICByZXR1cm4gMSAvICgxIC0gZDNJbm5lclBhZGRpbmcpIC0gMTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5Ll9jb252ZXJ0VG9QbG90dGFibGVPdXRlclBhZGRpbmcgPSBmdW5jdGlvbiAoZDNPdXRlclBhZGRpbmcsIGQzSW5uZXJQYWRkaW5nKSB7CiAgICAgICAgICAgIHJldHVybiBkM091dGVyUGFkZGluZyAvICgxIC0gZDNJbm5lclBhZGRpbmcpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLl9zZXRCYW5kcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGQzSW5uZXJQYWRkaW5nID0gMSAtIDEgLyAoMSArIHRoaXMuaW5uZXJQYWRkaW5nKCkpOwogICAgICAgICAgICB2YXIgZDNPdXRlclBhZGRpbmcgPSB0aGlzLm91dGVyUGFkZGluZygpIC8gKDEgKyB0aGlzLmlubmVyUGFkZGluZygpKTsKICAgICAgICAgICAgdGhpcy5fZDNTY2FsZS5wYWRkaW5nSW5uZXIoZDNJbm5lclBhZGRpbmcpOwogICAgICAgICAgICB0aGlzLl9kM1NjYWxlLnBhZGRpbmdPdXRlcihkM091dGVyUGFkZGluZyk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB3aWR0aCBvZiB0aGUgcmFuZ2UgYmFuZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSByYW5nZSBiYW5kIHdpZHRoCiAgICAgICAgICovCiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLnJhbmdlQmFuZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc2NhbGVCYW5kKHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgc3RlcCB3aWR0aCBvZiB0aGUgc2NhbGUuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgc3RlcCB3aWR0aCBpcyB0aGUgcGl4ZWwgZGlzdGFuY2UgYmV0d2VlbiBhZGphY2VudCB2YWx1ZXMgaW4gdGhlIGRvbWFpbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9CiAgICAgICAgICovCiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLnN0ZXBXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gdG9kbyBjb25zaWRlciByZXBsYWNpbmcgdGhpcyB3aXRoIF9kM1NjYWxlLnN0ZXAoKQogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzY2FsZUJhbmQodGhpcy5fZDNTY2FsZS5iYW5kd2lkdGgoKSAqICgxICsgdGhpcy5pbm5lclBhZGRpbmcoKSkpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLnRpY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kb21haW4oKTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5pbm5lclBhZGRpbmcgPSBmdW5jdGlvbiAoaW5uZXJQYWRkaW5nKSB7CiAgICAgICAgICAgIGlmIChpbm5lclBhZGRpbmcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lubmVyUGFkZGluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9pbm5lclBhZGRpbmcgPSBpbm5lclBhZGRpbmc7CiAgICAgICAgICAgIHRoaXMucmFuZ2UodGhpcy5yYW5nZSgpKTsKICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUub3V0ZXJQYWRkaW5nID0gZnVuY3Rpb24gKG91dGVyUGFkZGluZykgewogICAgICAgICAgICBpZiAob3V0ZXJQYWRkaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdXRlclBhZGRpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fb3V0ZXJQYWRkaW5nID0gb3V0ZXJQYWRkaW5nOwogICAgICAgICAgICB0aGlzLnJhbmdlKHRoaXMucmFuZ2UoKSk7CiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgbWlkZGxlIG9mIHRoZSByYW5nZSBiYW5kIGZvciB0aGUgdmFsdWUKICAgICAgICAgICAgdmFyIHVudHJhbnNmb3JtZWQgPSB0aGlzLl9kM1NjYWxlKHZhbHVlKSArIHRoaXMuX2QzU2NhbGUuYmFuZHdpZHRoKCkgLyAyOwogICAgICAgICAgICAvLyBDb252ZXJ0IHRvIHNjcmVlbiBzcGFjZQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlKHVudHJhbnNmb3JtZWQpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLnpvb20gPSBmdW5jdGlvbiAobWFnbmlmeUFtb3VudCwgY2VudGVyVmFsdWUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIG1hZ25pZnlUcmFuc2Zvcm0gPSBmdW5jdGlvbiAocmFuZ2VWYWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuaW52ZXJ0KHBhblpvb21Db25zdHJhaW50cy56b29tT3V0KHJhbmdlVmFsdWUsIG1hZ25pZnlBbW91bnQsIGNlbnRlclZhbHVlKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4odGhpcy5fZDNUcmFuc2Zvcm1hdGlvblNjYWxlLnJhbmdlKCkubWFwKG1hZ25pZnlUcmFuc2Zvcm0pKTsKICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5wYW4gPSBmdW5jdGlvbiAodHJhbnNsYXRlQW1vdW50KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVUcmFuc2Zvcm0gPSBmdW5jdGlvbiAocmFuZ2VWYWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuaW52ZXJ0KHJhbmdlVmFsdWUgKyB0cmFuc2xhdGVBbW91bnQpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5yYW5nZSgpLm1hcCh0cmFuc2xhdGVUcmFuc2Zvcm0pKTsKICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUodmFsdWUpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5pbnZlcnQodmFsdWUpOwogICAgICAgIH07CiAgICAgICAgQ2F0ZWdvcnkucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gVFJBTlNGT1JNQVRJT05fU1BBQ0U7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUuZG9tYWluKCk7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW4gPSBmdW5jdGlvbiAoZG9tYWluKSB7CiAgICAgICAgICAgIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZS5kb21haW4oZG9tYWluKTsKICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fZ2V0RG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCk7CiAgICAgICAgfTsKICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbiA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2QzU2NhbGUuZG9tYWluKHZhbHVlcyk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRCYW5kcygpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fZ2V0UmFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yYW5nZTsKICAgICAgICB9OwogICAgICAgIENhdGVnb3J5LnByb3RvdHlwZS5fc2V0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMuX3JhbmdlID0gdmFsdWVzOwogICAgICAgICAgICB0aGlzLl9kM1RyYW5zZm9ybWF0aW9uU2NhbGUucmFuZ2UodmFsdWVzKTsKICAgICAgICAgICAgdGhpcy5fc2V0QmFuZHMoKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENvbnZlcnRzIGEgd2lkdGggb3IgaGVpZ2h0IGluICpUcmFuc2Zvcm1hdGlvbiBTcGFjZSogaW50byAqU2NyZWVuIFNwYWNlKi4KICAgICAgICAgKi8KICAgICAgICBDYXRlZ29yeS5wcm90b3R5cGUuX3Jlc2NhbGVCYW5kID0gZnVuY3Rpb24gKGJhbmQpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZShiYW5kKSAtIHRoaXMuX2QzVHJhbnNmb3JtYXRpb25TY2FsZSgwKSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQ2F0ZWdvcnk7CiAgICB9KHNjYWxlLlNjYWxlKSk7CiAgICBleHBvcnRzLkNhdGVnb3J5ID0gQ2F0ZWdvcnk7CiAgICB9KTsKCiAgICB2YXIgY29sb3JTY2FsZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIC8qKgogICAgICogV29ya2Fyb3VuZCBmb3IgYmFkIGQzIGJlaGF2aW9yLgogICAgICoKICAgICAqIGQzJ3MgY29sb3Igc2NhbGVzLCB3aGljaCBhcmUgb3JpZGluYWwgc2NhbGVzLCBoYXZlIHNpZGUtZWZmZWN0cyB3aGVuIGludm9rZWQuCiAgICAgKiBXaGVuIHlvdSBjYWxsIHRoZSBgc2NhbGUodmFsdWUpYCBhcyBhIGZ1bmN0aW9uLCBpdCB3aWxsIGltcGxpY2l0bHkgYWRkIG5ldwogICAgICogdmFsdWVzIHRvIHRoZSBkb21haW4uCiAgICAgKgogICAgICogVGhlc2Ugc2lkZS1lZmZlY3RzIGNhdXNlIHVzIHRvIHJlbHkgb24gbG9va2luZyB1cCB0aGUgY3VycmVudCBzY2FsZSBzdGF0ZQogICAgICogd2l0aCB0aGUgYC5kb21haW4oKWAgYW5kIGAucmFuZ2UoKWAgbWV0aG9kcy4gSG93ZXZlciwgdGhlc2UgbWV0aG9kcyBoYXZlIHBvb3IKICAgICAqIHBlcmZvcm1hbmNlIGltcGxpY2F0aW9ucyBzaW5jZSB0aGV5IHdpbGwgYWx3YXlzIHNsaWNlIHRoZWlyIGludGVybmFsIHZhbHVlcwogICAgICogYmVmb3JlIHJldHVybmluZy4gSW5zaWRlIHRoZSBpbm5lciByZW5kZXIgbG9vcCBvZiBjb2xvciBzY2F0dGVyIHBsb3QgcG9pbnRzLAogICAgICogdGhlc2Ugc2xpY2VzIGFkZCB1cC4KICAgICAqLwogICAgdmFyIEltcGxpY2l0U2VyaWVzVHJhY2tlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBJbXBsaWNpdFNlcmllc1RyYWNrZXIoKSB7CiAgICAgICAgICAgIHRoaXMuY291bnQgPSAwOwogICAgICAgICAgICB0aGlzLnRyYWNrZXIgPSB7fTsKICAgICAgICB9CiAgICAgICAgSW1wbGljaXRTZXJpZXNUcmFja2VyLnByb3RvdHlwZS5nZXRJbmRleCA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICBpZiAodGhpcy50cmFja2VyW3ZhbHVlXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50cmFja2VyW3ZhbHVlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBpZHggPSB0aGlzLmNvdW50OwogICAgICAgICAgICAgICAgdGhpcy50cmFja2VyW3ZhbHVlXSA9IGlkeDsKICAgICAgICAgICAgICAgIHRoaXMuY291bnQgKz0gMTsKICAgICAgICAgICAgICAgIHJldHVybiBpZHg7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEltcGxpY2l0U2VyaWVzVHJhY2tlci5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuY291bnQgPSAwOwogICAgICAgICAgICB0aGlzLnRyYWNrZXIgPSB7fTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBJbXBsaWNpdFNlcmllc1RyYWNrZXI7CiAgICB9KCkpOwogICAgdmFyIENvbG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoQ29sb3IsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBDb2xvciBTY2FsZSBtYXBzIHN0cmluZyB2YWx1ZXMgdG8gY29sb3IgaGV4IHZhbHVlcyBleHByZXNzZWQgYXMgYSBzdHJpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW3NjYWxlVHlwZV0gT25lIG9mICJDYXRlZ29yeTEwIi8iQ2F0ZWdvcnkyMCIvIkNhdGVnb3J5MjBiIi8iQ2F0ZWdvcnkyMGMiLgogICAgICAgICAqICAgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWJvc3RvY2svZDMvd2lraS9PcmRpbmFsLVNjYWxlcyNjYXRlZ29yaWNhbC1jb2xvcnMpCiAgICAgICAgICogICBJZiBub3Qgc3VwcGxpZWQsIHJlYWRzIHRoZSBjb2xvcnMgZGVmaW5lZCB1c2luZyBDU1MgLS0gc2VlIHBsb3R0YWJsZS5jc3MuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQ29sb3Ioc2NhbGVUeXBlKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIC8vIENhY2hlIHRoZSBudW1iZXIgb2YgcmFuZ2UgdmFsdWUgdG8gYXZvaWQgY2FsbGluZyBgc2NhbGUucmFuZ2UoKS5sZW5ndGhgCiAgICAgICAgICAgIF90aGlzLl9yYW5nZUxlbmd0aCA9IDE7CiAgICAgICAgICAgIF90aGlzLl90cmFja2VyID0gbmV3IEltcGxpY2l0U2VyaWVzVHJhY2tlcigpOwogICAgICAgICAgICB2YXIgc2NhbGU7CiAgICAgICAgICAgIHN3aXRjaCAoc2NhbGVUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIG51bGw6CiAgICAgICAgICAgICAgICBjYXNlIHVuZGVmaW5lZDoKICAgICAgICAgICAgICAgICAgICBpZiAoQ29sb3IuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBDb2xvci5fcGxvdHRhYmxlQ29sb3JDYWNoZSA9IENvbG9yLl9nZXRQbG90dGFibGVDb2xvcnMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBkMy5zY2FsZU9yZGluYWwoKS5yYW5nZShDb2xvci5fcGxvdHRhYmxlQ29sb3JDYWNoZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJDYXRlZ29yeTEwIjoKICAgICAgICAgICAgICAgIGNhc2UgImNhdGVnb3J5MTAiOgogICAgICAgICAgICAgICAgY2FzZSAiMTAiOgogICAgICAgICAgICAgICAgICAgIHNjYWxlID0gZDMuc2NhbGVPcmRpbmFsKGQzLnNjaGVtZUNhdGVnb3J5MTApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiQ2F0ZWdvcnkyMCI6CiAgICAgICAgICAgICAgICBjYXNlICJjYXRlZ29yeTIwIjoKICAgICAgICAgICAgICAgIGNhc2UgIjIwIjoKICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTIwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgIkNhdGVnb3J5MjBiIjoKICAgICAgICAgICAgICAgIGNhc2UgImNhdGVnb3J5MjBiIjoKICAgICAgICAgICAgICAgIGNhc2UgIjIwYiI6CiAgICAgICAgICAgICAgICAgICAgc2NhbGUgPSBkMy5zY2FsZU9yZGluYWwoZDMuc2NoZW1lQ2F0ZWdvcnkyMGIpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAiQ2F0ZWdvcnkyMGMiOgogICAgICAgICAgICAgICAgY2FzZSAiY2F0ZWdvcnkyMGMiOgogICAgICAgICAgICAgICAgY2FzZSAiMjBjIjoKICAgICAgICAgICAgICAgICAgICBzY2FsZSA9IGQzLnNjYWxlT3JkaW5hbChkMy5zY2hlbWVDYXRlZ29yeTIwYyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiVW5zdXBwb3J0ZWQgQ29sb3JTY2FsZSB0eXBlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3RoaXMuX2QzU2NhbGUgPSBzY2FsZTsKICAgICAgICAgICAgX3RoaXMuX3JhbmdlTGVuZ3RoID0gX3RoaXMuX2QzU2NhbGUucmFuZ2UoKS5sZW5ndGg7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgQ29sb3IucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5BcnJheS51bmlxKHZhbHVlcyk7CiAgICAgICAgfTsKICAgICAgICAvLyBEdXBsaWNhdGVkIGZyb20gT3JkaW5hbFNjYWxlLl9nZXRFeHRlbnQgLSBzaG91bGQgYmUgcmVtb3ZlZCBpbiAjMzg4CiAgICAgICAgQ29sb3IucHJvdG90eXBlLl9nZXRFeHRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB1dGlscyQxLkFycmF5LnVuaXEodGhpcy5fZ2V0QWxsSW5jbHVkZWRWYWx1ZXMoKSk7CiAgICAgICAgfTsKICAgICAgICBDb2xvci5pbnZhbGlkYXRlQ29sb3JDYWNoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgQ29sb3IuX3Bsb3R0YWJsZUNvbG9yQ2FjaGUgPSBudWxsOwogICAgICAgIH07CiAgICAgICAgQ29sb3IuX2dldFBsb3R0YWJsZUNvbG9ycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHBsb3R0YWJsZURlZmF1bHRDb2xvcnMgPSBbXTsKICAgICAgICAgICAgdmFyIGNvbG9yVGVzdGVyID0gZDMuc2VsZWN0KCJib2R5IikuYXBwZW5kKCJwbG90dGFibGUtY29sb3ItdGVzdGVyIik7CiAgICAgICAgICAgIHZhciBkZWZhdWx0Q29sb3JIZXggPSB1dGlscyQxLkNvbG9yLmNvbG9yVGVzdChjb2xvclRlc3RlciwgIiIpOwogICAgICAgICAgICB2YXIgaSA9IDA7CiAgICAgICAgICAgIHZhciBjb2xvckhleCA9IHV0aWxzJDEuQ29sb3IuY29sb3JUZXN0KGNvbG9yVGVzdGVyLCAicGxvdHRhYmxlLWNvbG9ycy0wIik7CiAgICAgICAgICAgIHdoaWxlIChjb2xvckhleCAhPSBudWxsICYmIGkgPCB0aGlzLl9NQVhJTVVNX0NPTE9SU19GUk9NX0NTUykgewogICAgICAgICAgICAgICAgaWYgKGNvbG9ySGV4ID09PSBkZWZhdWx0Q29sb3JIZXggJiYgY29sb3JIZXggPT09IHBsb3R0YWJsZURlZmF1bHRDb2xvcnNbcGxvdHRhYmxlRGVmYXVsdENvbG9ycy5sZW5ndGggLSAxXSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGxvdHRhYmxlRGVmYXVsdENvbG9ycy5wdXNoKGNvbG9ySGV4KTsKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIGNvbG9ySGV4ID0gdXRpbHMkMS5Db2xvci5jb2xvclRlc3QoY29sb3JUZXN0ZXIsICJwbG90dGFibGUtY29sb3JzLSIgKyBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb2xvclRlc3Rlci5yZW1vdmUoKTsKICAgICAgICAgICAgcmV0dXJuIHBsb3R0YWJsZURlZmF1bHRDb2xvcnM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjb2xvci1zdHJpbmcgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmluZy4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoZXJlIGFyZSBub3QgZW5vdWdoIGNvbG9ycyBpbiB0aGUgcmFuZ2UoKSwgYSBsaWdodGVuZWQgdmVyc2lvbiBvZiBhbgogICAgICAgICAqIGV4aXN0aW5nIGNvbG9yIHdpbGwgYmUgdXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZQogICAgICAgICAqIEByZXR1cm5zIHtzdHJpbmd9CiAgICAgICAgICovCiAgICAgICAgQ29sb3IucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHZhciBjb2xvciA9IHRoaXMuX2QzU2NhbGUodmFsdWUpOwogICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl90cmFja2VyLmdldEluZGV4KHZhbHVlKTsKICAgICAgICAgICAgdmFyIG51bUxvb3BlZCA9IE1hdGguZmxvb3IoaW5kZXggLyB0aGlzLl9yYW5nZUxlbmd0aCk7CiAgICAgICAgICAgIGlmIChudW1Mb29wZWQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbW9kaWZ5RmFjdG9yID0gTWF0aC5sb2cobnVtTG9vcGVkICogQ29sb3IuX0xPT1BfTElHSFRFTl9GQUNUT1IgKyAxKTsKICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuQ29sb3IubGlnaHRlbkNvbG9yKGNvbG9yLCBtb2RpZnlGYWN0b3IpOwogICAgICAgIH07CiAgICAgICAgQ29sb3IucHJvdG90eXBlLl9nZXREb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKTsKICAgICAgICB9OwogICAgICAgIENvbG9yLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZDNTY2FsZS5kb21haW4odmFsdWVzKTsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYWNrZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBDb2xvci5wcm90b3R5cGUuX2dldFJhbmdlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS5yYW5nZSgpOwogICAgICAgIH07CiAgICAgICAgQ29sb3IucHJvdG90eXBlLl9zZXRSYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgdGhpcy5fZDNTY2FsZS5yYW5nZSh2YWx1ZXMpOwogICAgICAgICAgICB0aGlzLl9yYW5nZUxlbmd0aCA9IHZhbHVlcy5sZW5ndGg7CiAgICAgICAgfTsKICAgICAgICBDb2xvci5fTE9PUF9MSUdIVEVOX0ZBQ1RPUiA9IDEuNjsKICAgICAgICAvLyBUaGUgbWF4aW11bSBudW1iZXIgb2YgY29sb3JzIHdlIGFyZSBnZXR0aW5nIGZyb20gQ1NTIHN0eWxlc2hlZXRzCiAgICAgICAgQ29sb3IuX01BWElNVU1fQ09MT1JTX0ZST01fQ1NTID0gMjU2OwogICAgICAgIHJldHVybiBDb2xvcjsKICAgIH0oc2NhbGUuU2NhbGUpKTsKICAgIGV4cG9ydHMuQ29sb3IgPSBDb2xvcjsKICAgIH0pOwoKICAgIHZhciBpbnRlcnBvbGF0ZWRDb2xvclNjYWxlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgogICAgdmFyIEludGVycG9sYXRlZENvbG9yID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoSW50ZXJwb2xhdGVkQ29sb3IsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQW4gSW50ZXJwb2xhdGVkQ29sb3IgU2NhbGUgbWFwcyBudW1iZXJzIHRvIGNvbG9yIGhleCB2YWx1ZXMsIGV4cHJlc3NlZCBhcyBzdHJpbmdzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtzY2FsZVR5cGU9ImxpbmVhciJdIE9uZSBvZiAibGluZWFyIi8ibG9nIi8ic3FydCIvInBvdyIuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gSW50ZXJwb2xhdGVkQ29sb3Ioc2NhbGVUeXBlKSB7CiAgICAgICAgICAgIGlmIChzY2FsZVR5cGUgPT09IHZvaWQgMCkgeyBzY2FsZVR5cGUgPSAibGluZWFyIjsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBzd2l0Y2ggKHNjYWxlVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAibGluZWFyIjoKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY29sb3JTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJsb2ciOgogICAgICAgICAgICAgICAgICAgIF90aGlzLl9jb2xvclNjYWxlID0gZDMuc2NhbGVMb2coKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInNxcnQiOgogICAgICAgICAgICAgICAgICAgIF90aGlzLl9jb2xvclNjYWxlID0gZDMuc2NhbGVTcXJ0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICJwb3ciOgogICAgICAgICAgICAgICAgICAgIF90aGlzLl9jb2xvclNjYWxlID0gZDMuc2NhbGVQb3coKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoX3RoaXMuX2NvbG9yU2NhbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJ1bmtub3duIFF1YW50aXRhdGl2ZVNjYWxlIHNjYWxlIHR5cGUgIiArIHNjYWxlVHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3RoaXMucmFuZ2UoSW50ZXJwb2xhdGVkQ29sb3IuUkVEUyk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3IucHJvdG90eXBlLmV4dGVudE9mVmFsdWVzID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KHZhbHVlcyk7CiAgICAgICAgICAgIGlmIChleHRlbnRbMF0gPT0gbnVsbCB8fCBleHRlbnRbMV0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVudDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIHRoZSBjb252ZXJ0ZWQgUXVhbnRpdGF0aXZlU2NhbGUuCiAgICAgICAgICovCiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3IucHJvdG90eXBlLl9kM0ludGVycG9sYXRlZFNjYWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5yYW5nZShbMCwgMV0pLmludGVycG9sYXRlKHRoaXMuX2ludGVycG9sYXRlQ29sb3JzKCkpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIHRoZSBkMyBpbnRlcnBvbGF0b3IgZm9yIGNvbG9ycy4KICAgICAgICAgKi8KICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvci5wcm90b3R5cGUuX2ludGVycG9sYXRlQ29sb3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgY29sb3JzID0gdGhpcy5fY29sb3JSYW5nZTsKICAgICAgICAgICAgaWYgKGNvbG9ycy5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIHNjYWxlIGFycmF5cyBtdXN0IGhhdmUgYXQgbGVhc3QgdHdvIGVsZW1lbnRzLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh0KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2xhbXAgdCBwYXJhbWV0ZXIgdG8gWzAsMV0KICAgICAgICAgICAgICAgICAgICB0ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgdCkpOwogICAgICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpbmRpY2VzIGZvciBjb2xvcnMKICAgICAgICAgICAgICAgICAgICB2YXIgdFNjYWxlZCA9IHQgKiAoY29sb3JzLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgIHZhciBpMCA9IE1hdGguZmxvb3IodFNjYWxlZCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGkxID0gTWF0aC5jZWlsKHRTY2FsZWQpOwogICAgICAgICAgICAgICAgICAgIHZhciBmcmFjID0gKHRTY2FsZWQgLSBpMCk7CiAgICAgICAgICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUgaW4gdGhlIEwqYSpiIGNvbG9yIHNwYWNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQzLmludGVycG9sYXRlTGFiKGNvbG9yc1tpMF0sIGNvbG9yc1tpMV0pKGZyYWMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yLnByb3RvdHlwZS5fcmVzZXRTY2FsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fZDNTY2FsZSA9IHRoaXMuX2QzSW50ZXJwb2xhdGVkU2NhbGUoKTsKICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoVXBkYXRlKCk7CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvci5wcm90b3R5cGUuYXV0b0RvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGVkQ29sb3JTY2FsZXMgZG8gbm90IHBhZAogICAgICAgICAgICB2YXIgaW5jbHVkZWRWYWx1ZXMgPSB0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcygpOwogICAgICAgICAgICBpZiAoaW5jbHVkZWRWYWx1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2V0RG9tYWluKFt1dGlscyQxLk1hdGgubWluKGluY2x1ZGVkVmFsdWVzLCAwKSwgdXRpbHMkMS5NYXRoLm1heChpbmNsdWRlZFZhbHVlcywgMCldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZSh2YWx1ZSk7CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvci5wcm90b3R5cGUuX2dldERvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpOwogICAgICAgIH07CiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3IucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kM1NjYWxlLmRvbWFpbih2YWx1ZXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yLnByb3RvdHlwZS5fZ2V0UmFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2xvclJhbmdlOwogICAgICAgIH07CiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3IucHJvdG90eXBlLl9zZXRSYW5nZSA9IGZ1bmN0aW9uIChyYW5nZSkgewogICAgICAgICAgICB0aGlzLl9jb2xvclJhbmdlID0gcmFuZ2U7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2NhbGUoKTsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yLlJFRFMgPSBbCiAgICAgICAgICAgICIjRkZGRkZGIiwKICAgICAgICAgICAgIiNGRkY2RTEiLAogICAgICAgICAgICAiI0ZFRjRDMCIsCiAgICAgICAgICAgICIjRkVEOTc2IiwKICAgICAgICAgICAgIiNGRUIyNEMiLAogICAgICAgICAgICAiI0ZEOEQzQyIsCiAgICAgICAgICAgICIjRkM0RTJBIiwKICAgICAgICAgICAgIiNFMzFBMUMiLAogICAgICAgICAgICAiI0IxMDAyNiIsCiAgICAgICAgXTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvci5CTFVFUyA9IFsKICAgICAgICAgICAgIiNGRkZGRkYiLAogICAgICAgICAgICAiI0NDRkZGRiIsCiAgICAgICAgICAgICIjQTVGRkZEIiwKICAgICAgICAgICAgIiM4NUY3RkIiLAogICAgICAgICAgICAiIzZFRDNFRiIsCiAgICAgICAgICAgICIjNTVBN0UwIiwKICAgICAgICAgICAgIiM0MTdGRDAiLAogICAgICAgICAgICAiIzI1NDVEMyIsCiAgICAgICAgICAgICIjMEIwMkUxIiwKICAgICAgICBdOwogICAgICAgIEludGVycG9sYXRlZENvbG9yLlBPU05FRyA9IFsKICAgICAgICAgICAgIiMwQjAyRTEiLAogICAgICAgICAgICAiIzI1NDVEMyIsCiAgICAgICAgICAgICIjNDE3RkQwIiwKICAgICAgICAgICAgIiM1NUE3RTAiLAogICAgICAgICAgICAiIzZFRDNFRiIsCiAgICAgICAgICAgICIjODVGN0ZCIiwKICAgICAgICAgICAgIiNBNUZGRkQiLAogICAgICAgICAgICAiI0NDRkZGRiIsCiAgICAgICAgICAgICIjRkZGRkZGIiwKICAgICAgICAgICAgIiNGRkY2RTEiLAogICAgICAgICAgICAiI0ZFRjRDMCIsCiAgICAgICAgICAgICIjRkVEOTc2IiwKICAgICAgICAgICAgIiNGRUIyNEMiLAogICAgICAgICAgICAiI0ZEOEQzQyIsCiAgICAgICAgICAgICIjRkM0RTJBIiwKICAgICAgICAgICAgIiNFMzFBMUMiLAogICAgICAgICAgICAiI0IxMDAyNiIsCiAgICAgICAgXTsKICAgICAgICByZXR1cm4gSW50ZXJwb2xhdGVkQ29sb3I7CiAgICB9KHNjYWxlLlNjYWxlKSk7CiAgICBleHBvcnRzLkludGVycG9sYXRlZENvbG9yID0gSW50ZXJwb2xhdGVkQ29sb3I7CiAgICB9KTsKCiAgICB2YXIgcXVhbnRpdGF0aXZlU2NhbGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgogICAgdmFyIFF1YW50aXRhdGl2ZVNjYWxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUXVhbnRpdGF0aXZlU2NhbGUsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBRdWFudGl0YXRpdmVTY2FsZSBpcyBhIFNjYWxlIHRoYXQgbWFwcyBudW1iZXItbGlrZSB2YWx1ZXMgdG8gbnVtYmVycy4KICAgICAgICAgKiBJdCBpcyBpbnZlcnRpYmxlIGFuZCBjb250aW51b3VzLgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gUXVhbnRpdGF0aXZlU2NhbGUoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl90aWNrR2VuZXJhdG9yID0gZnVuY3Rpb24gKHNjYWxlKSB7IHJldHVybiBzY2FsZS5kZWZhdWx0VGlja3MoKTsgfTsKICAgICAgICAgICAgX3RoaXMuX3BhZFByb3BvcnRpb24gPSAwLjA1OwogICAgICAgICAgICBfdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzID0gbmV3IHV0aWxzJDEuU2V0KCk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLmF1dG9Eb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX2RvbWFpbk1pbiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2RvbWFpbk1heCA9IG51bGw7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuYXV0b0RvbWFpbi5jYWxsKHRoaXMpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5fZG9tYWluTWluICE9IG51bGwgJiYgdGhpcy5fZG9tYWluTWF4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NldERvbWFpbihbdGhpcy5fZG9tYWluTWluLCB0aGlzLl9kb21haW5NYXhdKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29tcHV0ZWRFeHRlbnQgPSB0aGlzLl9nZXRFeHRlbnQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2RvbWFpbk1pbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgbWF4VmFsdWUgPSBjb21wdXRlZEV4dGVudFsxXTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kb21haW5NaW4gPj0gbWF4VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZSA9IHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NaW4sIHRoaXMuX2RvbWFpbk1pbl0pWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fc2V0RG9tYWluKFt0aGlzLl9kb21haW5NaW4sIG1heFZhbHVlXSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2RvbWFpbk1heCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgbWluVmFsdWUgPSBjb21wdXRlZEV4dGVudFswXTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kb21haW5NYXggPD0gbWluVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IHRoaXMuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluKFt0aGlzLl9kb21haW5NYXgsIHRoaXMuX2RvbWFpbk1heF0pWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fc2V0RG9tYWluKFttaW5WYWx1ZSwgdGhpcy5fZG9tYWluTWF4XSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlLmNhbGwodGhpcyk7CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuX2dldFVuYm91bmRlZEV4dGVudCA9IGZ1bmN0aW9uIChpZ25vcmVBdHRhY2hTdGF0ZSkgewogICAgICAgICAgICBpZiAoaWdub3JlQXR0YWNoU3RhdGUgPT09IHZvaWQgMCkgeyBpZ25vcmVBdHRhY2hTdGF0ZSA9IGZhbHNlOyB9CiAgICAgICAgICAgIHZhciBpbmNsdWRlZFZhbHVlcyA9IHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGlnbm9yZUF0dGFjaFN0YXRlKTsKICAgICAgICAgICAgdmFyIGV4dGVudCA9IHRoaXMuX2RlZmF1bHRFeHRlbnQoKTsKICAgICAgICAgICAgaWYgKGluY2x1ZGVkVmFsdWVzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICAgICAgdmFyIGNvbWJpbmVkRXh0ZW50ID0gWwogICAgICAgICAgICAgICAgICAgIHV0aWxzJDEuTWF0aC5taW4oaW5jbHVkZWRWYWx1ZXMsIGV4dGVudFswXSksCiAgICAgICAgICAgICAgICAgICAgdXRpbHMkMS5NYXRoLm1heChpbmNsdWRlZFZhbHVlcywgZXh0ZW50WzFdKSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICBleHRlbnQgPSB0aGlzLl9wYWREb21haW4oY29tYmluZWRFeHRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBleHRlbnQ7CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuX2dldEV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGV4dGVudCA9IHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCgpOwogICAgICAgICAgICBpZiAodGhpcy5fZG9tYWluTWluICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4dGVudFswXSA9IHRoaXMuX2RvbWFpbk1pbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZG9tYWluTWF4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4dGVudFsxXSA9IHRoaXMuX2RvbWFpbk1heDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZXh0ZW50OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIHBhZGRpbmcgZXhjZXB0aW9uIHByb3ZpZGVyLgogICAgICAgICAqIElmIG9uZSBlbmQgb2YgdGhlIGRvbWFpbiBpcyBzZXQgdG8gYW4gZXhjZXB0ZWQgdmFsdWUgYXMgYSByZXN1bHQgb2YgYXV0b0RvbWFpbigpLWluZywKICAgICAgICAgKiB0aGF0IGVuZCBvZiB0aGUgZG9tYWluIHdpbGwgbm90IGJlIHBhZGRlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7U2NhbGVzLlBhZGRpbmdFeGNlcHRpb25Qcm92aWRlcjxEPn0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIGZ1bmN0aW9uLgogICAgICAgICAqIEByZXR1cm5zIHtRdWFudGl0YXRpdmVTY2FsZX0gVGhlIGNhbGxpbmcgUXVhbnRpdGF0aXZlU2NhbGUuCiAgICAgICAgICovCiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIgPSBmdW5jdGlvbiAocHJvdmlkZXIpIHsKICAgICAgICAgICAgdGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuYWRkKHByb3ZpZGVyKTsKICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgcGFkZGluZyBleGNlcHRpb24gcHJvdmlkZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlcy5QYWRkaW5nRXhjZXB0aW9uUHJvdmlkZXI8RD59IHByb3ZpZGVyIFRoZSBwcm92aWRlciBmdW5jdGlvbi4KICAgICAgICAgKiBAcmV0dXJucyB7UXVhbnRpdGF0aXZlU2NhbGV9IFRoZSBjYWxsaW5nIFF1YW50aXRhdGl2ZVNjYWxlLgogICAgICAgICAqLwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyID0gZnVuY3Rpb24gKHByb3ZpZGVyKSB7CiAgICAgICAgICAgIHRoaXMuX3BhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXJzLmRlbGV0ZShwcm92aWRlcik7CiAgICAgICAgICAgIHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5wYWRQcm9wb3J0aW9uID0gZnVuY3Rpb24gKHBhZFByb3BvcnRpb24pIHsKICAgICAgICAgICAgaWYgKHBhZFByb3BvcnRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZFByb3BvcnRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhZFByb3BvcnRpb24gPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInBhZFByb3BvcnRpb24gbXVzdCBiZSBub24tbmVnYXRpdmUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wYWRQcm9wb3J0aW9uID0gcGFkUHJvcG9ydGlvbjsKICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLl9wYWREb21haW4gPSBmdW5jdGlvbiAoZG9tYWluKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmIChkb21haW5bMF0udmFsdWVPZigpID09PSBkb21haW5bMV0udmFsdWVPZigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4oZG9tYWluKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcGFkUHJvcG9ydGlvbiA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvbWFpbjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcCA9IHRoaXMuX3BhZFByb3BvcnRpb24gLyAyOwogICAgICAgICAgICB2YXIgbWluID0gZG9tYWluWzBdOwogICAgICAgICAgICB2YXIgbWF4ID0gZG9tYWluWzFdOwogICAgICAgICAgICB2YXIgbWluRXhpc3RzSW5FeGNlcHRpb25zID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBtYXhFeGlzdHNJbkV4Y2VwdGlvbnMgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fcGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcnMuZm9yRWFjaChmdW5jdGlvbiAocHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZXMgPSBwcm92aWRlcihfdGhpcyk7CiAgICAgICAgICAgICAgICB2YWx1ZXMuZm9yRWFjaChmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUudmFsdWVPZigpID09PSBtaW4udmFsdWVPZigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pbkV4aXN0c0luRXhjZXB0aW9ucyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS52YWx1ZU9mKCkgPT09IG1heC52YWx1ZU9mKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhpc3RzSW5FeGNlcHRpb25zID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBvcmlnaW5hbERvbWFpbiA9IHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpOwogICAgICAgICAgICB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oZG9tYWluKTsKICAgICAgICAgICAgdmFyIG5ld01pbiA9IG1pbkV4aXN0c0luRXhjZXB0aW9ucyA/IG1pbiA6IHRoaXMuaW52ZXJ0KHRoaXMuc2NhbGUobWluKSAtICh0aGlzLnNjYWxlKG1heCkgLSB0aGlzLnNjYWxlKG1pbikpICogcCk7CiAgICAgICAgICAgIHZhciBuZXdNYXggPSBtYXhFeGlzdHNJbkV4Y2VwdGlvbnMgPyBtYXggOiB0aGlzLmludmVydCh0aGlzLnNjYWxlKG1heCkgKyAodGhpcy5zY2FsZShtYXgpIC0gdGhpcy5zY2FsZShtaW4pKSAqIHApOwogICAgICAgICAgICB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4ob3JpZ2luYWxEb21haW4pOwogICAgICAgICAgICBpZiAodGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbmljZURvbWFpbihbbmV3TWluLCBuZXdNYXhdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKFtuZXdNaW4sIG5ld01heF0pOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCA9IGZ1bmN0aW9uIChzbmFwcGluZ0RvbWFpbkVuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKHNuYXBwaW5nRG9tYWluRW5hYmxlZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc25hcHBpbmdEb21haW5FbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NuYXBwaW5nRG9tYWluRW5hYmxlZCA9IHNuYXBwaW5nRG9tYWluRW5hYmxlZDsKICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLl9leHBhbmRTaW5nbGVWYWx1ZURvbWFpbiA9IGZ1bmN0aW9uIChzaW5nbGVWYWx1ZURvbWFpbikgewogICAgICAgICAgICByZXR1cm4gc2luZ2xlVmFsdWVEb21haW47CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgZG9tYWluIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBzdXBwbGllZCByYW5nZSB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZTogQSB2YWx1ZSBmcm9tIHRoZSBTY2FsZSdzIHJhbmdlLgogICAgICAgICAqIEByZXR1cm5zIHtEfSBUaGUgZG9tYWluIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN1cHBsaWVkIHJhbmdlIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBpbnZlcnQiKTsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5kb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZXMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fZG9tYWluTWluID0gdmFsdWVzWzBdOwogICAgICAgICAgICAgICAgdGhpcy5fZG9tYWluTWF4ID0gdmFsdWVzWzFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmRvbWFpbi5jYWxsKHRoaXMsIHZhbHVlcyk7CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuZG9tYWluTWluID0gZnVuY3Rpb24gKGRvbWFpbk1pbikgewogICAgICAgICAgICBpZiAoZG9tYWluTWluID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbigpWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2RvbWFpbk1pbiA9IGRvbWFpbk1pbjsKICAgICAgICAgICAgdGhpcy5hdXRvRG9tYWluSWZBdXRvbWF0aWNNb2RlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLmRvbWFpbk1heCA9IGZ1bmN0aW9uIChkb21haW5NYXgpIHsKICAgICAgICAgICAgaWYgKGRvbWFpbk1heCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb21haW4oKVsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kb21haW5NYXggPSBkb21haW5NYXg7CiAgICAgICAgICAgIHRoaXMuYXV0b0RvbWFpbklmQXV0b21hdGljTW9kZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5leHRlbnRPZlZhbHVlcyA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgLy8gSEFDS0hBQ0s6IFRTMS40IGRvZXNuJ3QgY29uc2lkZXIgbnVtYmVycyB0byBiZSBOdW1iZXItbGlrZSAodmFsdWVPZigpIHJldHVybmluZyBudW1iZXIpLCBzbyBEIGNhbid0IGJlIHR5cGVkIGNvcnJlY3RseQogICAgICAgICAgICB2YXIgZXh0ZW50ID0gZDMuZXh0ZW50KHZhbHVlcy5maWx0ZXIoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiB1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcigrdmFsdWUpOyB9KSk7CiAgICAgICAgICAgIGlmIChleHRlbnRbMF0gPT0gbnVsbCB8fCBleHRlbnRbMV0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVudDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLnpvb20gPSBmdW5jdGlvbiAobWFnbmlmeUFtb3VudCwgY2VudGVyVmFsdWUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIG1hZ25pZnlUcmFuc2Zvcm0gPSBmdW5jdGlvbiAocmFuZ2VWYWx1ZSkgeyByZXR1cm4gX3RoaXMuaW52ZXJ0KHBhblpvb21Db25zdHJhaW50cy56b29tT3V0KHJhbmdlVmFsdWUsIG1hZ25pZnlBbW91bnQsIGNlbnRlclZhbHVlKSk7IH07CiAgICAgICAgICAgIHRoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAobWFnbmlmeVRyYW5zZm9ybSkpOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLnBhbiA9IGZ1bmN0aW9uICh0cmFuc2xhdGVBbW91bnQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZVRyYW5zZm9ybSA9IGZ1bmN0aW9uIChyYW5nZVZhbHVlKSB7IHJldHVybiBfdGhpcy5pbnZlcnQocmFuZ2VWYWx1ZSArIHRyYW5zbGF0ZUFtb3VudCk7IH07CiAgICAgICAgICAgIHRoaXMuZG9tYWluKHRoaXMucmFuZ2UoKS5tYXAodHJhbnNsYXRlVHJhbnNmb3JtKSk7CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIHNjYWxlVHJhbnNmb3JtYXRpb24iKTsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbiIpOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRXh0ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIGdldFRyYW5zZm9ybWF0aW9uRXh0ZW50Iik7CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4iKTsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiA9IGZ1bmN0aW9uIChkb21haW4pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiIpOwogICAgICAgIH07CiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLl9zZXREb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHZhciBpc05hTk9ySW5maW5pdHkgPSBmdW5jdGlvbiAoeCkgeyByZXR1cm4gdXRpbHMkMS5NYXRoLmlzTmFOKHgpIHx8IHggPT09IEluZmluaXR5IHx8IHggPT09IC1JbmZpbml0eTsgfTsKICAgICAgICAgICAgaWYgKGlzTmFOT3JJbmZpbml0eSh2YWx1ZXNbMF0pIHx8IGlzTmFOT3JJbmZpbml0eSh2YWx1ZXNbMV0pKSB7CiAgICAgICAgICAgICAgICB1dGlscyQxLldpbmRvdy53YXJuKCJXYXJuaW5nOiBRdWFudGl0YXRpdmVTY2FsZXMgY2Fubm90IHRha2UgTmFOIG9yIEluZmluaXR5IGFzIGEgZG9tYWluIHZhbHVlLiBJZ25vcmluZy4iKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLCB2YWx1ZXMpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgYXJyYXkgb2YgdGljayB2YWx1ZXMgZ2VuZXJhdGVkIGJ5IHRoZSBkZWZhdWx0IGFsZ29yaXRobS4KICAgICAgICAgKi8KICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9nZXREZWZhdWx0VGlja3MiKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gYXJyYXkgb2YgdGljayB2YWx1ZXMgc3Bhbm5pbmcgdGhlIGRvbWFpbi4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtEW119CiAgICAgICAgICovCiAgICAgICAgUXVhbnRpdGF0aXZlU2NhbGUucHJvdG90eXBlLnRpY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdGlja0dlbmVyYXRvcih0aGlzKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGEgZG9tYWluLCBleHBhbmRzIGl0cyBkb21haW4gb250byAibmljZSIgdmFsdWVzLCBlLmcuIHdob2xlCiAgICAgICAgICogbnVtYmVycy4KICAgICAgICAgKi8KICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuX25pY2VEb21haW4gPSBmdW5jdGlvbiAoZG9tYWluLCBjb3VudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlN1YmNsYXNzZXMgc2hvdWxkIG92ZXJyaWRlIF9uaWNlRG9tYWluIik7CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU3ViY2xhc3NlcyBzaG91bGQgb3ZlcnJpZGUgX2RlZmF1bHRFeHRlbnQiKTsKICAgICAgICB9OwogICAgICAgIFF1YW50aXRhdGl2ZVNjYWxlLnByb3RvdHlwZS50aWNrR2VuZXJhdG9yID0gZnVuY3Rpb24gKGdlbmVyYXRvcikgewogICAgICAgICAgICBpZiAoZ2VuZXJhdG9yID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWNrR2VuZXJhdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdGlja0dlbmVyYXRvciA9IGdlbmVyYXRvcjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBRdWFudGl0YXRpdmVTY2FsZS5fREVGQVVMVF9OVU1fVElDS1MgPSAxMDsKICAgICAgICByZXR1cm4gUXVhbnRpdGF0aXZlU2NhbGU7CiAgICB9KHNjYWxlLlNjYWxlKSk7CiAgICBleHBvcnRzLlF1YW50aXRhdGl2ZVNjYWxlID0gUXVhbnRpdGF0aXZlU2NhbGU7CiAgICB9KTsKCiAgICB2YXIgbGluZWFyU2NhbGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKICAgIHZhciBMaW5lYXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhMaW5lYXIsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gTGluZWFyKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fZDNTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIFswLCAxXTsKICAgICAgICB9OwogICAgICAgIExpbmVhci5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluID0gZnVuY3Rpb24gKHNpbmdsZVZhbHVlRG9tYWluKSB7CiAgICAgICAgICAgIGlmIChzaW5nbGVWYWx1ZURvbWFpblswXSA9PT0gc2luZ2xlVmFsdWVEb21haW5bMV0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBbc2luZ2xlVmFsdWVEb21haW5bMF0gLSAxLCBzaW5nbGVWYWx1ZURvbWFpblsxXSArIDFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzaW5nbGVWYWx1ZURvbWFpbjsKICAgICAgICB9OwogICAgICAgIExpbmVhci5wcm90b3R5cGUuc2NhbGUgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUodmFsdWUpOwogICAgICAgIH07CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxlKHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIExpbmVhci5wcm90b3R5cGUuaW52ZXJ0ZWRUcmFuc2Zvcm1hdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbnZlcnQodmFsdWUpOwogICAgICAgIH07CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCh0cnVlKTsKICAgICAgICB9OwogICAgICAgIExpbmVhci5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbigpOwogICAgICAgIH07CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5zZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbiA9IGZ1bmN0aW9uIChkb21haW4pIHsKICAgICAgICAgICAgdGhpcy5kb21haW4oZG9tYWluKTsKICAgICAgICB9OwogICAgICAgIExpbmVhci5wcm90b3R5cGUuX2dldERvbWFpbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JhY2tpbmdTY2FsZURvbWFpbigpOwogICAgICAgIH07CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZDNTY2FsZS5kb21haW4odmFsdWVzKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMaW5lYXIucHJvdG90eXBlLl9nZXRSYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKTsKICAgICAgICB9OwogICAgICAgIExpbmVhci5wcm90b3R5cGUuX3NldFJhbmdlID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICB0aGlzLl9kM1NjYWxlLnJhbmdlKHZhbHVlcyk7CiAgICAgICAgfTsKICAgICAgICBMaW5lYXIucHJvdG90eXBlLmludmVydCA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQodmFsdWUpOwogICAgICAgIH07CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5kZWZhdWx0VGlja3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKExpbmVhci5fREVGQVVMVF9OVU1fVElDS1MpOwogICAgICAgIH07CiAgICAgICAgTGluZWFyLnByb3RvdHlwZS5fbmljZURvbWFpbiA9IGZ1bmN0aW9uIChkb21haW4sIGNvdW50KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLmNvcHkoKS5kb21haW4oZG9tYWluKS5uaWNlKGNvdW50KS5kb21haW4oKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBMaW5lYXI7CiAgICB9KHF1YW50aXRhdGl2ZVNjYWxlLlF1YW50aXRhdGl2ZVNjYWxlKSk7CiAgICBleHBvcnRzLkxpbmVhciA9IExpbmVhcjsKICAgIH0pOwoKICAgIHZhciBsb2dTY2FsZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIExvZyA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKExvZywgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBMb2coYmFzZSkgewogICAgICAgICAgICBpZiAoYmFzZSA9PT0gdm9pZCAwKSB7IGJhc2UgPSAxMDsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fZDNTY2FsZSA9IGQzLnNjYWxlTG9nKCkuYmFzZShiYXNlKTsKICAgICAgICAgICAgX3RoaXMuX3NldERvbWFpbihfdGhpcy5fZGVmYXVsdEV4dGVudCgpKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBMb2cucHJvdG90eXBlLl9kZWZhdWx0RXh0ZW50ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gWzEsIHRoaXMuX2QzU2NhbGUuYmFzZSgpXTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuX2V4cGFuZFNpbmdsZVZhbHVlRG9tYWluID0gZnVuY3Rpb24gKHNpbmdsZVZhbHVlRG9tYWluKSB7CiAgICAgICAgICAgIGlmIChzaW5nbGVWYWx1ZURvbWFpblswXSA9PT0gc2luZ2xlVmFsdWVEb21haW5bMV0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBbc2luZ2xlVmFsdWVEb21haW5bMF0gLyB0aGlzLl9kM1NjYWxlLmJhc2UoKSwKICAgICAgICAgICAgICAgICAgICBzaW5nbGVWYWx1ZURvbWFpblsxXSAqIHRoaXMuX2QzU2NhbGUuYmFzZSgpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2luZ2xlVmFsdWVEb21haW47CiAgICAgICAgfTsKICAgICAgICBMb2cucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlKHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuc2NhbGVUcmFuc2Zvcm1hdGlvbiA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSh2YWx1ZSk7CiAgICAgICAgfTsKICAgICAgICBMb2cucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0KHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQodHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICBMb2cucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kb21haW4oKTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuc2V0VHJhbnNmb3JtYXRpb25Eb21haW4gPSBmdW5jdGlvbiAoZG9tYWluKSB7CiAgICAgICAgICAgIHRoaXMuZG9tYWluKGRvbWFpbik7CiAgICAgICAgfTsKICAgICAgICBMb2cucHJvdG90eXBlLl9nZXREb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYWNraW5nU2NhbGVEb21haW4oKTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuX2JhY2tpbmdTY2FsZURvbWFpbiA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS5kb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2QzU2NhbGUuZG9tYWluKHZhbHVlcyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTG9nLnByb3RvdHlwZS5fZ2V0UmFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCk7CiAgICAgICAgfTsKICAgICAgICBMb2cucHJvdG90eXBlLl9zZXRSYW5nZSA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsKICAgICAgICAgICAgdGhpcy5fZDNTY2FsZS5yYW5nZSh2YWx1ZXMpOwogICAgICAgIH07CiAgICAgICAgTG9nLnByb3RvdHlwZS5pbnZlcnQgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuZGVmYXVsdFRpY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcyhMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKTsKICAgICAgICB9OwogICAgICAgIExvZy5wcm90b3R5cGUuX25pY2VEb21haW4gPSBmdW5jdGlvbiAoZG9tYWluLCBjb3VudCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS5jb3B5KCkuZG9tYWluKGRvbWFpbikubmljZSgpLmRvbWFpbigpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIExvZzsKICAgIH0ocXVhbnRpdGF0aXZlU2NhbGUuUXVhbnRpdGF0aXZlU2NhbGUpKTsKICAgIGV4cG9ydHMuTG9nID0gTG9nOwogICAgfSk7CgogICAgdmFyIG1vZGlmaWVkTG9nU2NhbGUgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgogICAgdmFyIE1vZGlmaWVkTG9nID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoTW9kaWZpZWRMb2csIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBNb2RpZmllZExvZyBTY2FsZSBhY3RzIGFzIGEgcmVndWxhciBsb2cgc2NhbGUgZm9yIGxhcmdlIG51bWJlcnMuCiAgICAgICAgICogQXMgaXQgYXBwcm9hY2hlcyAwLCBpdCBncmFkdWFsbHkgYmVjb21lcyBsaW5lYXIuCiAgICAgICAgICogQ29uc2VxdWVudGx5LCBhIE1vZGlmaWVkTG9nIFNjYWxlIGNhbiBwcm9jZXNzIDAgYW5kIG5lZ2F0aXZlIG51bWJlcnMuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgeCA+PSBiYXNlLCBzY2FsZSh4KSA9IGxvZyh4KS4KICAgICAgICAgKgogICAgICAgICAqIEZvciAwIDwgeCA8IGJhc2UsIHNjYWxlKHgpIHdpbGwgYmVjb21lIG1vcmUgYW5kIG1vcmUKICAgICAgICAgKiBsaW5lYXIgYXMgaXQgYXBwcm9hY2hlcyAwLgogICAgICAgICAqCiAgICAgICAgICogQXQgeCA9PSAwLCBzY2FsZSh4KSA9PSAwLgogICAgICAgICAqCiAgICAgICAgICogRm9yIG5lZ2F0aXZlIHZhbHVlcywgc2NhbGUoLXgpID0gLXNjYWxlKHgpLgogICAgICAgICAqCiAgICAgICAgICogVGhlIHJhbmdlIGFuZCBkb21haW4gZm9yIHRoZSBzY2FsZSBzaG91bGQgYWxzbyBiZSBzZXQsIHVzaW5nIHRoZQogICAgICAgICAqIHJhbmdlKCkgYW5kIGRvbWFpbigpIGFjY2Vzc29ycywgcmVzcGVjdGl2ZWx5LgogICAgICAgICAqCiAgICAgICAgICogRm9yIGByYW5nZWAsIHByb3ZpZGUgYSB0d28tZWxlbWVudCBhcnJheSBnaXZpbmcgdGhlIG1pbmltdW0gYW5kCiAgICAgICAgICogbWF4aW11bSBvZiB2YWx1ZXMgcHJvZHVjZWQgd2hlbiBzY2FsaW5nLgogICAgICAgICAqCiAgICAgICAgICogRm9yIGBkb21haW5gIHByb3ZpZGUgYSB0d28tZWxlbWVudCBhcnJheSBnaXZpbmcgdGhlIG1pbmltdW0gYW5kCiAgICAgICAgICogbWF4aW11bSBvZiB0aGUgdmFsdWVzIHRoYXQgd2lsbCBiZSBzY2FsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Jhc2U9MTBdCiAgICAgICAgICogICAgICAgIFRoZSBiYXNlIG9mIHRoZSBsb2cuIE11c3QgYmUgPiAxLgogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gTW9kaWZpZWRMb2coYmFzZSkgewogICAgICAgICAgICBpZiAoYmFzZSA9PT0gdm9pZCAwKSB7IGJhc2UgPSAxMDsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fbG9nVGlja0dlbmVyYXRvciA9IGZ1bmN0aW9uIChzY2FsZSkgewogICAgICAgICAgICAgICAgLy8gU2F5IHlvdXIgZG9tYWluIGlzIFstMTAwLCAxMDBdIGFuZCB5b3VyIHBpdm90IGlzIDEwLgogICAgICAgICAgICAgICAgLy8gdGhlbiB3ZSdyZSBnb2luZyB0byBkcmF3IG5lZ2F0aXZlIGxvZyB0aWNrcyBmcm9tIC0xMDAgdG8gLTEwLAogICAgICAgICAgICAgICAgLy8gbGluZWFyIHRpY2tzIGZyb20gLTEwIHRvIDEwLCBhbmQgcG9zaXRpdmUgbG9nIHRpY2tzIGZyb20gMTAgdG8gMTAwLgogICAgICAgICAgICAgICAgdmFyIG1pZGRsZSA9IGZ1bmN0aW9uICh4LCB5LCB6KSB7IHJldHVybiBbeCwgeSwgel0uc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pWzFdOyB9OwogICAgICAgICAgICAgICAgdmFyIG1pbiA9IHV0aWxzJDEuTWF0aC5taW4oX3RoaXMuX3VudHJhbnNmb3JtZWREb21haW4sIDApOwogICAgICAgICAgICAgICAgdmFyIG1heCA9IHV0aWxzJDEuTWF0aC5tYXgoX3RoaXMuX3VudHJhbnNmb3JtZWREb21haW4sIDApOwogICAgICAgICAgICAgICAgdmFyIG5lZ2F0aXZlTG93ZXIgPSBtaW47CiAgICAgICAgICAgICAgICB2YXIgbmVnYXRpdmVVcHBlciA9IG1pZGRsZShtaW4sIG1heCwgLV90aGlzLl9waXZvdCk7CiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpdmVMb3dlciA9IG1pZGRsZShtaW4sIG1heCwgX3RoaXMuX3Bpdm90KTsKICAgICAgICAgICAgICAgIHZhciBwb3NpdGl2ZVVwcGVyID0gbWF4OwogICAgICAgICAgICAgICAgdmFyIG5lZ2F0aXZlTG9nVGlja3MgPSBfdGhpcy5fbG9nVGlja3MoLW5lZ2F0aXZlVXBwZXIsIC1uZWdhdGl2ZUxvd2VyKS5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIC14OyB9KS5yZXZlcnNlKCk7CiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpdmVMb2dUaWNrcyA9IF90aGlzLl9sb2dUaWNrcyhwb3NpdGl2ZUxvd2VyLCBwb3NpdGl2ZVVwcGVyKTsKICAgICAgICAgICAgICAgIHZhciBsaW5lYXJNaW4gPSBNYXRoLm1heChtaW4sIC1fdGhpcy5fcGl2b3QpOwogICAgICAgICAgICAgICAgdmFyIGxpbmVhck1heCA9IE1hdGgubWluKG1heCwgX3RoaXMuX3Bpdm90KTsKICAgICAgICAgICAgICAgIHZhciBsaW5lYXJUaWNrcyA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFtsaW5lYXJNaW4sIGxpbmVhck1heF0pLnRpY2tzKF90aGlzLl9ob3dNYW55VGlja3MobGluZWFyTWluLCBsaW5lYXJNYXgpKTsKICAgICAgICAgICAgICAgIHZhciB0aWNrcyA9IG5lZ2F0aXZlTG9nVGlja3MuY29uY2F0KGxpbmVhclRpY2tzKS5jb25jYXQocG9zaXRpdmVMb2dUaWNrcyk7CiAgICAgICAgICAgICAgICAvLyBJZiB5b3Ugb25seSBoYXZlIDEgdGljaywgeW91IGNhbid0IHRlbGwgaG93IGJpZyB0aGUgc2NhbGUgaXMuCiAgICAgICAgICAgICAgICBpZiAodGlja3MubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgICAgICB0aWNrcyA9IGQzLnNjYWxlTGluZWFyKCkuZG9tYWluKFttaW4sIG1heF0pLnRpY2tzKHNjYWxlcy5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRpY2tzOwogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpcy5fZDNTY2FsZSA9IGQzLnNjYWxlTGluZWFyKCk7CiAgICAgICAgICAgIF90aGlzLl9iYXNlID0gYmFzZTsKICAgICAgICAgICAgX3RoaXMuX3Bpdm90ID0gX3RoaXMuX2Jhc2U7CiAgICAgICAgICAgIF90aGlzLl9zZXREb21haW4oX3RoaXMuX2RlZmF1bHRFeHRlbnQoKSk7CiAgICAgICAgICAgIF90aGlzLnRpY2tHZW5lcmF0b3IoX3RoaXMuX2xvZ1RpY2tHZW5lcmF0b3IpOwogICAgICAgICAgICBpZiAoYmFzZSA8PSAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk1vZGlmaWVkTG9nU2NhbGU6IFRoZSBiYXNlIG11c3QgYmUgPiAxIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFkanVzdGVkIGxvZzEwIHZhbHVlIGZvciBncmFwaGluZyBwdXJwb3Nlcy4gIFRoZSBmaXJzdAogICAgICAgICAqIGFkanVzdG1lbnQgaXMgdGhhdCBuZWdhdGl2ZSB2YWx1ZXMgYXJlIGNoYW5nZWQgdG8gcG9zaXRpdmUgZHVyaW5nCiAgICAgICAgICogdGhlIGNhbGN1bGF0aW9ucywgYW5kIHRoZW4gdGhlIGFuc3dlciBpcyBuZWdhdGVkIGF0IHRoZSBlbmQuICBUaGUKICAgICAgICAgKiBzZWNvbmQgaXMgdGhhdCwgZm9yIHZhbHVlcyBsZXNzIHRoYW4gMTAsIGFuIGluY3JlYXNpbmdseSBsYXJnZQogICAgICAgICAqICgwIHRvIDEpIHNjYWxpbmcgZmFjdG9yIGlzIGFkZGVkIHN1Y2ggdGhhdCBhdCAwIHRoZSB2YWx1ZSBpcwogICAgICAgICAqIGFkanVzdGVkIHRvIDEsIHJlc3VsdGluZyBpbiBhIHJldHVybmVkIHJlc3VsdCBvZiAwLgogICAgICAgICAqLwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5fYWRqdXN0ZWRMb2cgPSBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICB2YXIgbmVnYXRpb25GYWN0b3IgPSB4IDwgMCA/IC0xIDogMTsKICAgICAgICAgICAgeCAqPSBuZWdhdGlvbkZhY3RvcjsKICAgICAgICAgICAgaWYgKHggPCB0aGlzLl9waXZvdCkgewogICAgICAgICAgICAgICAgeCArPSAodGhpcy5fcGl2b3QgLSB4KSAvIHRoaXMuX3Bpdm90OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHggPSBNYXRoLmxvZyh4KSAvIE1hdGgubG9nKHRoaXMuX2Jhc2UpOwogICAgICAgICAgICB4ICo9IG5lZ2F0aW9uRmFjdG9yOwogICAgICAgICAgICByZXR1cm4geDsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5faW52ZXJ0ZWRBZGp1c3RlZExvZyA9IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgIHZhciBuZWdhdGlvbkZhY3RvciA9IHggPCAwID8gLTEgOiAxOwogICAgICAgICAgICB4ICo9IG5lZ2F0aW9uRmFjdG9yOwogICAgICAgICAgICB4ID0gTWF0aC5wb3codGhpcy5fYmFzZSwgeCk7CiAgICAgICAgICAgIGlmICh4IDwgdGhpcy5fcGl2b3QpIHsKICAgICAgICAgICAgICAgIHggPSAodGhpcy5fcGl2b3QgKiAoeCAtIDEpKSAvICh0aGlzLl9waXZvdCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHggKj0gbmVnYXRpb25GYWN0b3I7CiAgICAgICAgICAgIHJldHVybiB4OwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUodGhpcy5fYWRqdXN0ZWRMb2coeCkpOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLmludmVydCA9IGZ1bmN0aW9uICh4KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZlcnRlZEFkanVzdGVkTG9nKHRoaXMuX2QzU2NhbGUuaW52ZXJ0KHgpKTsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5zY2FsZVRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNjYWxlKHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5pbnZlcnRlZFRyYW5zZm9ybWF0aW9uID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmludmVydCh2YWx1ZSk7CiAgICAgICAgfTsKICAgICAgICBNb2RpZmllZExvZy5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQodHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICBNb2RpZmllZExvZy5wcm90b3R5cGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbigpOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluID0gZnVuY3Rpb24gKGRvbWFpbikgewogICAgICAgICAgICB0aGlzLmRvbWFpbihkb21haW4pOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLl9nZXREb21haW4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLl9zZXREb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMuX3VudHJhbnNmb3JtZWREb21haW4gPSB2YWx1ZXM7CiAgICAgICAgICAgIHZhciB0cmFuc2Zvcm1lZERvbWFpbiA9IFt0aGlzLl9hZGp1c3RlZExvZyh2YWx1ZXNbMF0pLCB0aGlzLl9hZGp1c3RlZExvZyh2YWx1ZXNbMV0pXTsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2V0RG9tYWluLmNhbGwodGhpcywgdHJhbnNmb3JtZWREb21haW4pOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLl9iYWNraW5nU2NhbGVEb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kM1NjYWxlLmRvbWFpbih2YWx1ZXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBudW1iZXIgb2YgdGlja3MgZnJvbSBsb3dlciB0byB1cHBlci4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgd2lsbCBmaXJzdCB0cnkgdG8gZml0IGFzIG1hbnkgcG93ZXJzIG9mIHRoaXMuYmFzZSBhcyBpdCBjYW4gZnJvbQogICAgICAgICAqIGxvd2VyIHRvIHVwcGVyLgogICAgICAgICAqCiAgICAgICAgICogSWYgaXQgc3RpbGwgaGFzIHRpY2tzIGFmdGVyIHRoYXQsIGl0IHdpbGwgZ2VuZXJhdGUgdGlja3MgaW4gImNsdXN0ZXJzIiwKICAgICAgICAgKiBlLmcuIFsyMCwgMzAsIC4uLiA5MCwgMTAwXSB3b3VsZCBiZSBhIGNsdXN0ZXIsIFsyMDAsIDMwMCwgLi4uIDkwMCwgMTAwMF0KICAgICAgICAgKiB3b3VsZCBiZSBhbm90aGVyIGNsdXN0ZXIuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZ2VuZXJhdGUgY2x1c3RlcnMgYXMgbGFyZ2UgYXMgaXQgY2FuIHdoaWxlIG5vdAogICAgICAgICAqIGRyYXN0aWNhbGx5IGV4Y2VlZGluZyBpdHMgbnVtYmVyIG9mIHRpY2tzLgogICAgICAgICAqLwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5fbG9nVGlja3MgPSBmdW5jdGlvbiAobG93ZXIsIHVwcGVyKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBuVGlja3MgPSB0aGlzLl9ob3dNYW55VGlja3MobG93ZXIsIHVwcGVyKTsKICAgICAgICAgICAgaWYgKG5UaWNrcyA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzdGFydExvZ2dlZCA9IE1hdGguZmxvb3IoTWF0aC5sb2cobG93ZXIpIC8gTWF0aC5sb2codGhpcy5fYmFzZSkpOwogICAgICAgICAgICB2YXIgZW5kTG9nZ2VkID0gTWF0aC5jZWlsKE1hdGgubG9nKHVwcGVyKSAvIE1hdGgubG9nKHRoaXMuX2Jhc2UpKTsKICAgICAgICAgICAgdmFyIGJhc2VzID0gZDMucmFuZ2UoZW5kTG9nZ2VkLCBzdGFydExvZ2dlZCwgLU1hdGguY2VpbCgoZW5kTG9nZ2VkIC0gc3RhcnRMb2dnZWQpIC8gblRpY2tzKSk7CiAgICAgICAgICAgIHZhciBtdWx0aXBsZXMgPSBkMy5yYW5nZSh0aGlzLl9iYXNlLCAxLCAtKHRoaXMuX2Jhc2UgLSAxKSkubWFwKE1hdGguZmxvb3IpOwogICAgICAgICAgICB2YXIgdW5pcU11bHRpcGxlcyA9IHV0aWxzJDEuQXJyYXkudW5pcShtdWx0aXBsZXMpOwogICAgICAgICAgICB2YXIgY2x1c3RlcnMgPSBiYXNlcy5tYXAoZnVuY3Rpb24gKGIpIHsgcmV0dXJuIHVuaXFNdWx0aXBsZXMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiBNYXRoLnBvdyhfdGhpcy5fYmFzZSwgYiAtIDEpICogeDsgfSk7IH0pOwogICAgICAgICAgICB2YXIgZmxhdHRlbmVkID0gdXRpbHMkMS5BcnJheS5mbGF0dGVuKGNsdXN0ZXJzKTsKICAgICAgICAgICAgdmFyIGZpbHRlcmVkID0gZmxhdHRlbmVkLmZpbHRlcihmdW5jdGlvbiAoeCkgeyByZXR1cm4gbG93ZXIgPD0geCAmJiB4IDw9IHVwcGVyOyB9KTsKICAgICAgICAgICAgdmFyIHNvcnRlZCA9IGZpbHRlcmVkLnNvcnQoZnVuY3Rpb24gKHgsIHkpIHsgcmV0dXJuIHggLSB5OyB9KTsKICAgICAgICAgICAgcmV0dXJuIHNvcnRlZDsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEhvdyBtYW55IHRpY2tzIGRvZXMgdGhlIHJhbmdlIFtsb3dlciwgdXBwZXJdIGRlc2VydmU/CiAgICAgICAgICoKICAgICAgICAgKiBlLmcuIGlmIHlvdXIgZG9tYWluIHdhcyBbMTAsIDEwMDBdIGFuZCBJIGFza2VkIF9ob3dNYW55VGlja3MoMTAsIDEwMCksCiAgICAgICAgICogSSB3b3VsZCBnZXQgMS8yIG9mIHRoZSB0aWNrcy4gVGhlIHJhbmdlIDEwLCAxMDAgdGFrZXMgdXAgMS8yIG9mIHRoZQogICAgICAgICAqIGRpc3RhbmNlIHdoZW4gcGxvdHRlZC4KICAgICAgICAgKi8KICAgICAgICBNb2RpZmllZExvZy5wcm90b3R5cGUuX2hvd01hbnlUaWNrcyA9IGZ1bmN0aW9uIChsb3dlciwgdXBwZXIpIHsKICAgICAgICAgICAgdmFyIGFkanVzdGVkTWluID0gdGhpcy5fYWRqdXN0ZWRMb2codXRpbHMkMS5NYXRoLm1pbih0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluLCAwKSk7CiAgICAgICAgICAgIHZhciBhZGp1c3RlZE1heCA9IHRoaXMuX2FkanVzdGVkTG9nKHV0aWxzJDEuTWF0aC5tYXgodGhpcy5fdW50cmFuc2Zvcm1lZERvbWFpbiwgMCkpOwogICAgICAgICAgICB2YXIgYWRqdXN0ZWRMb3dlciA9IHRoaXMuX2FkanVzdGVkTG9nKGxvd2VyKTsKICAgICAgICAgICAgdmFyIGFkanVzdGVkVXBwZXIgPSB0aGlzLl9hZGp1c3RlZExvZyh1cHBlcik7CiAgICAgICAgICAgIHZhciBwcm9wb3J0aW9uID0gKGFkanVzdGVkVXBwZXIgLSBhZGp1c3RlZExvd2VyKSAvIChhZGp1c3RlZE1heCAtIGFkanVzdGVkTWluKTsKICAgICAgICAgICAgdmFyIHRpY2tzID0gTWF0aC5jZWlsKHByb3BvcnRpb24gKiBzY2FsZXMuTW9kaWZpZWRMb2cuX0RFRkFVTFRfTlVNX1RJQ0tTKTsKICAgICAgICAgICAgcmV0dXJuIHRpY2tzOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLl9uaWNlRG9tYWluID0gZnVuY3Rpb24gKGRvbWFpbiwgY291bnQpIHsKICAgICAgICAgICAgcmV0dXJuIGRvbWFpbjsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5fZGVmYXVsdEV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIFswLCB0aGlzLl9iYXNlXTsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4gPSBmdW5jdGlvbiAoc2luZ2xlVmFsdWVEb21haW4pIHsKICAgICAgICAgICAgaWYgKHNpbmdsZVZhbHVlRG9tYWluWzBdID09PSBzaW5nbGVWYWx1ZURvbWFpblsxXSkgewogICAgICAgICAgICAgICAgdmFyIHNpbmdsZVZhbHVlID0gc2luZ2xlVmFsdWVEb21haW5bMF07CiAgICAgICAgICAgICAgICBpZiAoc2luZ2xlVmFsdWUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzaW5nbGVWYWx1ZSAvIHRoaXMuX2Jhc2UsIHNpbmdsZVZhbHVlICogdGhpcy5fYmFzZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChzaW5nbGVWYWx1ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbLXRoaXMuX2Jhc2UsIHRoaXMuX2Jhc2VdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtzaW5nbGVWYWx1ZSAqIHRoaXMuX2Jhc2UsIHNpbmdsZVZhbHVlIC8gdGhpcy5fYmFzZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNpbmdsZVZhbHVlRG9tYWluOwogICAgICAgIH07CiAgICAgICAgTW9kaWZpZWRMb2cucHJvdG90eXBlLl9nZXRSYW5nZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUucmFuZ2UoKTsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5fc2V0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMuX2QzU2NhbGUucmFuZ2UodmFsdWVzKTsKICAgICAgICB9OwogICAgICAgIE1vZGlmaWVkTG9nLnByb3RvdHlwZS5kZWZhdWx0VGlja3MgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLnRpY2tzKHNjYWxlcy5Nb2RpZmllZExvZy5fREVGQVVMVF9OVU1fVElDS1MpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIE1vZGlmaWVkTG9nOwogICAgfShxdWFudGl0YXRpdmVTY2FsZS5RdWFudGl0YXRpdmVTY2FsZSkpOwogICAgZXhwb3J0cy5Nb2RpZmllZExvZyA9IE1vZGlmaWVkTG9nOwogICAgfSk7CgogICAgdmFyIHRpbWVTY2FsZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIHZhciBUaW1lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoVGltZSwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBBIFRpbWUgU2NhbGUgbWFwcyBEYXRlIG9iamVjdHMgdG8gbnVtYmVycy4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFRpbWUoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9kM1NjYWxlID0gZDMuc2NhbGVUaW1lKCk7CiAgICAgICAgICAgIF90aGlzLmF1dG9Eb21haW4oKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IG9mIHRpY2tzIHZhbHVlcyBzZXBhcmF0ZWQgYnkgdGhlIHNwZWNpZmllZCBpbnRlcnZhbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBpbnRlcnZhbCBBIHN0cmluZyBzcGVjaWZ5aW5nIHRoZSBpbnRlcnZhbCB1bml0LgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyP30gW3N0ZXBdIFRoZSBudW1iZXIgb2YgbXVsdGlwbGVzIG9mIHRoZSBpbnRlcnZhbCBiZXR3ZWVuIGNvbnNlY3V0aXZlIHRpY2tzLgogICAgICAgICAqIEByZXR1cm4ge0RhdGVbXX0KICAgICAgICAgKi8KICAgICAgICBUaW1lLnByb3RvdHlwZS50aWNrSW50ZXJ2YWwgPSBmdW5jdGlvbiAoaW50ZXJ2YWwsIHN0ZXAsIHVzZVVUQykgewogICAgICAgICAgICBpZiAoc3RlcCA9PT0gdm9pZCAwKSB7IHN0ZXAgPSAxOyB9CiAgICAgICAgICAgIGlmICh1c2VVVEMgPT09IHZvaWQgMCkgeyB1c2VVVEMgPSBmYWxzZTsgfQogICAgICAgICAgICAvLyB0ZW1wb3JhcmlseSBjcmVhdHMgYSB0aW1lIHNjYWxlIGZyb20gb3VyIGxpbmVhciBzY2FsZSBpbnRvIGEgdGltZSBzY2FsZSBzbyB3ZSBjYW4gZ2V0IGFjY2VzcyB0byBpdHMgYXBpCiAgICAgICAgICAgIHZhciB0ZW1wU2NhbGUgPSBkMy5zY2FsZVRpbWUoKTsKICAgICAgICAgICAgdmFyIGQzSW50ZXJ2YWwgPSBUaW1lLnRpbWVJbnRlcnZhbFRvRDNUaW1lKGludGVydmFsLCB1c2VVVEMpLmV2ZXJ5KHN0ZXApOwogICAgICAgICAgICB0ZW1wU2NhbGUuZG9tYWluKHRoaXMuZG9tYWluKCkpOwogICAgICAgICAgICB0ZW1wU2NhbGUucmFuZ2UodGhpcy5yYW5nZSgpKTsKICAgICAgICAgICAgcmV0dXJuIHRlbXBTY2FsZS50aWNrcyhkM0ludGVydmFsKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9zZXREb21haW4gPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZXNbMV0gPCB2YWx1ZXNbMF0pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiU2NhbGUuVGltZSBkb21haW4gdmFsdWVzIG11c3QgYmUgaW4gY2hyb25vbG9naWNhbCBvcmRlciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9zZXREb21haW4uY2FsbCh0aGlzLCB2YWx1ZXMpOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX2RlZmF1bHRFeHRlbnQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBbbmV3IERhdGUoIjE5NzAtMDEtMDEiKSwgbmV3IERhdGUoIjE5NzAtMDEtMDIiKV07CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fZXhwYW5kU2luZ2xlVmFsdWVEb21haW4gPSBmdW5jdGlvbiAoc2luZ2xlVmFsdWVEb21haW4pIHsKICAgICAgICAgICAgdmFyIHN0YXJ0VGltZSA9IHNpbmdsZVZhbHVlRG9tYWluWzBdLmdldFRpbWUoKTsKICAgICAgICAgICAgdmFyIGVuZFRpbWUgPSBzaW5nbGVWYWx1ZURvbWFpblsxXS5nZXRUaW1lKCk7CiAgICAgICAgICAgIGlmIChzdGFydFRpbWUgPT09IGVuZFRpbWUpIHsKICAgICAgICAgICAgICAgIHZhciBzdGFydERhdGUgPSBuZXcgRGF0ZShzdGFydFRpbWUpOwogICAgICAgICAgICAgICAgc3RhcnREYXRlLnNldERhdGUoc3RhcnREYXRlLmdldERhdGUoKSAtIDEpOwogICAgICAgICAgICAgICAgdmFyIGVuZERhdGUgPSBuZXcgRGF0ZShlbmRUaW1lKTsKICAgICAgICAgICAgICAgIGVuZERhdGUuc2V0RGF0ZShlbmREYXRlLmdldERhdGUoKSArIDEpOwogICAgICAgICAgICAgICAgcmV0dXJuIFtzdGFydERhdGUsIGVuZERhdGVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzaW5nbGVWYWx1ZURvbWFpbjsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLnNjYWxlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlKHZhbHVlKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLnNjYWxlVHJhbnNmb3JtYXRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2NhbGUobmV3IERhdGUodmFsdWUpKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLmludmVydGVkVHJhbnNmb3JtYXRpb24gPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0KHZhbHVlKS5nZXRUaW1lKCk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5nZXRUcmFuc2Zvcm1hdGlvbkV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGV4dGVudCA9IHRoaXMuX2dldFVuYm91bmRlZEV4dGVudCh0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIFtleHRlbnRbMF0udmFsdWVPZigpLCBleHRlbnRbMV0udmFsdWVPZigpXTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZGF0ZXMgPSB0aGlzLmRvbWFpbigpOwogICAgICAgICAgICByZXR1cm4gW2RhdGVzWzBdLnZhbHVlT2YoKSwgZGF0ZXNbMV0udmFsdWVPZigpXTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLnNldFRyYW5zZm9ybWF0aW9uRG9tYWluID0gZnVuY3Rpb24gKF9hKSB7CiAgICAgICAgICAgIHZhciBkb21haW5NaW4gPSBfYVswXSwgZG9tYWluTWF4ID0gX2FbMV07CiAgICAgICAgICAgIHRoaXMuZG9tYWluKFtuZXcgRGF0ZShkb21haW5NaW4pLCBuZXcgRGF0ZShkb21haW5NYXgpXSk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fZ2V0RG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFja2luZ1NjYWxlRG9tYWluKCk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fYmFja2luZ1NjYWxlRG9tYWluID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLmRvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZDNTY2FsZS5kb21haW4odmFsdWVzKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fZ2V0UmFuZ2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM1NjYWxlLnJhbmdlKCk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fc2V0UmFuZ2UgPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMuX2QzU2NhbGUucmFuZ2UodmFsdWVzKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLmludmVydCA9IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS5pbnZlcnQodmFsdWUpOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuZGVmYXVsdFRpY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNTY2FsZS50aWNrcyhUaW1lLl9ERUZBVUxUX05VTV9USUNLUyk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fbmljZURvbWFpbiA9IGZ1bmN0aW9uIChkb21haW4pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzU2NhbGUuY29weSgpLmRvbWFpbihkb21haW4pLm5pY2UoKS5kb21haW4oKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFRyYW5zZm9ybXMgdGhlIFBsb3R0YWJsZSBUaW1lSW50ZXJ2YWwgc3RyaW5nIGludG8gYSBkMyB0aW1lIGludGVydmFsIGVxdWl2YWxlbnQuCiAgICAgICAgICogSWYgdGhlIHByb3ZpZGVkIFRpbWVJbnRlcnZhbCBpcyBpbmNvcnJlY3QsIHRoZSBkZWZhdWx0IGlzIGQzLnRpbWVZZWFyCiAgICAgICAgICovCiAgICAgICAgVGltZS50aW1lSW50ZXJ2YWxUb0QzVGltZSA9IGZ1bmN0aW9uICh0aW1lSW50ZXJ2YWwsIHVzZVVUQykgewogICAgICAgICAgICBzd2l0Y2ggKHRpbWVJbnRlcnZhbCkgewogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwuc2Vjb25kOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VVVEMgPyBkMy51dGNTZWNvbmQgOiBkMy50aW1lU2Vjb25kOwogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwubWludXRlOgogICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VVVEMgPyBkMy51dGNNaW51dGUgOiBkMy50aW1lTWludXRlOwogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwuaG91cjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlVVRDID8gZDMudXRjSG91ciA6IGQzLnRpbWVIb3VyOwogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwuZGF5OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB1c2VVVEMgPyBkMy51dGNEYXkgOiBkMy50aW1lRGF5OwogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwud2VlazoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlVVRDID8gZDMudXRjV2VlayA6IGQzLnRpbWVXZWVrOwogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwubW9udGg6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVzZVVUQyA/IGQzLnV0Y01vbnRoIDogZDMudGltZU1vbnRoOwogICAgICAgICAgICAgICAgY2FzZSB0aW1lQXhpcy5UaW1lSW50ZXJ2YWwueWVhcjoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdXNlVVRDID8gZDMudXRjWWVhciA6IGQzLnRpbWVZZWFyOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigiVGltZUludGVydmFsIHNwZWNpZmllZCBkb2VzIG5vdCBleGlzdDogIiArIHRpbWVJbnRlcnZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBUaW1lOwogICAgfShxdWFudGl0YXRpdmVTY2FsZS5RdWFudGl0YXRpdmVTY2FsZSkpOwogICAgZXhwb3J0cy5UaW1lID0gVGltZTsKICAgIH0pOwoKICAgIHZhciBzY2FsZXMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgZXhwb3J0cy5UaWNrR2VuZXJhdG9ycyA9IHRpY2tHZW5lcmF0b3JzOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihjYXRlZ29yeVNjYWxlLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoY29sb3JTY2FsZSwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGludGVycG9sYXRlZENvbG9yU2NhbGUsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihsaW5lYXJTY2FsZSwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGxvZ1NjYWxlLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIobW9kaWZpZWRMb2dTY2FsZSwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHRpbWVTY2FsZSwgZXhwb3J0cyk7CiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIHZhciBjYXRlZ29yeVNjYWxlXzEgPSBjYXRlZ29yeVNjYWxlOwoKICAgIC8qKgogICAgICogVHlwZSBndWFyZGVkIGZ1bmN0aW9uIHRvIGNoZWNrIGlmIHRoZSBzY2FsZSBpbXBsZW1lbnRzIHRoZQogICAgICogYFRyYW5zZm9ybWFibGVTY2FsZWAgaW50ZXJmYWNlLiBVbmZvcnR1bmF0ZWx5LCB0aGVyZSBpcyBubyB3YXkgdG8gZG8KICAgICAqIHJ1bnRpbWUgaW50ZXJmYWNlIHR5cGVjaGVja2luZywgc28gd2UgaGF2ZSB0byBleHBsaWNpdGx5IGxpc3QgYWxsIGNsYXNzZXMKICAgICAqIHRoYXQgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzVHJhbnNmb3JtYWJsZShzY2FsZSkgewogICAgICAgIHJldHVybiAoc2NhbGUgaW5zdGFuY2VvZiBxdWFudGl0YXRpdmVTY2FsZS5RdWFudGl0YXRpdmVTY2FsZSB8fAogICAgICAgICAgICBzY2FsZSBpbnN0YW5jZW9mIGNhdGVnb3J5U2NhbGVfMS5DYXRlZ29yeSk7CiAgICB9CiAgICBleHBvcnRzLmlzVHJhbnNmb3JtYWJsZSA9IGlzVHJhbnNmb3JtYWJsZTsKICAgIH0pOwoKICAgIHZhciB0aW1lQXhpcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgoKCiAgICBleHBvcnRzLlRpbWVJbnRlcnZhbCA9IG1ha2VFbnVtXzEubWFrZUVudW0oWwogICAgICAgICJzZWNvbmQiLAogICAgICAgICJtaW51dGUiLAogICAgICAgICJob3VyIiwKICAgICAgICAiZGF5IiwKICAgICAgICAid2VlayIsCiAgICAgICAgIm1vbnRoIiwKICAgICAgICAieWVhciIsCiAgICBdKTsKICAgIC8qKgogICAgICogUG9zc2libGUgb3JpZW50YXRpb25zIGZvciBhIFRpbWUgQXhpcy4KICAgICAqLwogICAgZXhwb3J0cy5UaW1lQXhpc09yaWVudGF0aW9uID0gbWFrZUVudW1fMS5tYWtlRW51bShbInRvcCIsICJib3R0b20iXSk7CiAgICBleHBvcnRzLlRpZXJMYWJlbFBvc2l0aW9uID0gbWFrZUVudW1fMS5tYWtlRW51bShbImJldHdlZW4iLCAiY2VudGVyIl0pOwogICAgdmFyIFRpbWUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhUaW1lLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYSBUaW1lIEF4aXMuCiAgICAgICAgICoKICAgICAgICAgKiBBIFRpbWUgQXhpcyBpcyBhIHZpc3VhbCByZXByZXNlbnRhdGlvbiBvZiBhIFRpbWUgU2NhbGUuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlcy5UaW1lfSBzY2FsZQogICAgICAgICAqIEBwYXJhbSB7QXhpc09yaWVudGF0aW9ufSBvcmllbnRhdGlvbiBPcmllbnRhdGlvbiBvZiB0aGlzIFRpbWUgQXhpcy4gVGltZSBBeGVzIGNhbiBvbmx5IGhhdmUgInRvcCIgb3IgImJvdHRvbSIKICAgICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IHVzZVVUQyBEaXNwbGF5cyBkYXRlIG9iamVjdCBpbiBVVEMgaWYgdHJ1ZSwgbG9jYWwgdGltZSBpZiBmYWxzZS4gRGVmYXVsdHMgdG8gZmFsc2UuCiAgICAgICAgICogb3JpZW50YXRpb25zLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFRpbWUoc2NhbGUsIG9yaWVudGF0aW9uLCB1c2VVVEMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgc2NhbGUsIG9yaWVudGF0aW9uKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uID0gbnVsbDsKICAgICAgICAgICAgX3RoaXMuX3RpZXJMYWJlbFBvc2l0aW9ucyA9IFtdOwogICAgICAgICAgICBfdGhpcy5fdXNlVVRDID0gdXNlVVRDOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygidGltZS1heGlzIik7CiAgICAgICAgICAgIF90aGlzLnRpY2tMYWJlbFBhZGRpbmcoNSk7CiAgICAgICAgICAgIF90aGlzLmF4aXNDb25maWd1cmF0aW9ucyhUaW1lLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyhfdGhpcy5fdXNlVVRDKSk7CiAgICAgICAgICAgIF90aGlzLmFubm90YXRpb25Gb3JtYXR0ZXIoZm9ybWF0dGVycy50aW1lKCIlYSAlYiAlZCwgJVkiLCBfdGhpcy5fdXNlVVRDKSk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgVGltZS5wcm90b3R5cGUudGllckxhYmVsUG9zaXRpb25zID0gZnVuY3Rpb24gKG5ld1Bvc2l0aW9ucykgewogICAgICAgICAgICBpZiAobmV3UG9zaXRpb25zID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIW5ld1Bvc2l0aW9ucy5ldmVyeShmdW5jdGlvbiAocG9zKSB7IHJldHVybiBwb3MudG9Mb3dlckNhc2UoKSA9PT0gImJldHdlZW4iIHx8IHBvcy50b0xvd2VyQ2FzZSgpID09PSAiY2VudGVyIjsgfSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIlVuc3VwcG9ydGVkIHBvc2l0aW9uIGZvciB0aWVyIGxhYmVscyIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fdGllckxhYmVsUG9zaXRpb25zID0gbmV3UG9zaXRpb25zOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5tYXhUaW1lSW50ZXJ2YWxQcmVjaXNpb24gPSBmdW5jdGlvbiAobmV3UHJlY2lzaW9uKSB7CiAgICAgICAgICAgIGlmIChuZXdQcmVjaXNpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbiA9IG5ld1ByZWNpc2lvbjsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCBgVGltZUF4aXNDb25maWd1cmF0aW9uYCB1c2VkIHRvIHJlbmRlciB0aGUgYXhlcy4KICAgICAgICAgKgogICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgdGhlIGF4aXMgaGFkIGJlZW4gcmVuZGVyZWQgYW5kIHRoZQogICAgICAgICAqIG1vc3QgcHJlY2lzZSB2YWxpZCBjb25maWd1cmF0aW9uIGlzIGRldGVybWluZWQgZnJvbSB0aGUgYXZhaWxhYmxlIHNwYWNlCiAgICAgICAgICogYW5kIG1heGltdW0gcHJlY2lzaW9uIGNvbnN0cmFpbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge1RpbWVBeGlzQ29uZmlndXJhdGlvbn0gVGhlIGN1cnJlbnRseSB1c2VkIGBUaW1lQXhpc0NvbmZpZ3VyYXRpb25gIG9yIGB1bmRlZmluZWRgLgogICAgICAgICAqLwogICAgICAgIFRpbWUucHJvdG90eXBlLmN1cnJlbnRBeGlzQ29uZmlndXJhdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uc1t0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4XTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLmF4aXNDb25maWd1cmF0aW9ucyA9IGZ1bmN0aW9uIChjb25maWd1cmF0aW9ucykgewogICAgICAgICAgICBpZiAoY29uZmlndXJhdGlvbnMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9uczsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnMgPSBjb25maWd1cmF0aW9uczsKICAgICAgICAgICAgdGhpcy5fbnVtVGllcnMgPSB1dGlscyQxLk1hdGgubWF4KHRoaXMuX3Bvc3NpYmxlVGltZUF4aXNDb25maWd1cmF0aW9ucy5tYXAoZnVuY3Rpb24gKGNvbmZpZykgeyByZXR1cm4gY29uZmlnLmxlbmd0aDsgfSksIDApOwogICAgICAgICAgICBpZiAodGhpcy5faXNBbmNob3JlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2V0dXBEb21FbGVtZW50cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBvbGRMYWJlbFBvc2l0aW9ucyA9IHRoaXMudGllckxhYmVsUG9zaXRpb25zKCk7CiAgICAgICAgICAgIHZhciBuZXdMYWJlbFBvc2l0aW9ucyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX251bVRpZXJzOyBpKyspIHsKICAgICAgICAgICAgICAgIG5ld0xhYmVsUG9zaXRpb25zLnB1c2gob2xkTGFiZWxQb3NpdGlvbnNbaV0gfHwgImJldHdlZW4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnRpZXJMYWJlbFBvc2l0aW9ucyhuZXdMYWJlbFBvc2l0aW9ucyk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIG1vc3QgcHJlY2lzZSBUaW1lQXhpc0NvbmZpZ3VyYXRpb24gdGhhdCB3aWxsIGZpdCBpbiB0aGUgY3VycmVudCB3aWR0aC4KICAgICAgICAgKi8KICAgICAgICBUaW1lLnByb3RvdHlwZS5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBtb3N0UHJlY2lzZUluZGV4ID0gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmZvckVhY2goZnVuY3Rpb24gKGludGVydmFsLCBpbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgbW9zdFByZWNpc2VJbmRleCAmJiBpbnRlcnZhbC5ldmVyeShmdW5jdGlvbiAodGllcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uKHRpZXIpOwogICAgICAgICAgICAgICAgfSkpIHsKICAgICAgICAgICAgICAgICAgICBtb3N0UHJlY2lzZUluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAobW9zdFByZWNpc2VJbmRleCA9PT0gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cud2Fybigiem9vbWVkIG91dCB0b28gZmFyOiBjb3VsZCBub3QgZmluZCBzdWl0YWJsZSBpbnRlcnZhbCB0byBkaXNwbGF5IGxhYmVscyIpOwogICAgICAgICAgICAgICAgLS1tb3N0UHJlY2lzZUluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb3N0UHJlY2lzZUluZGV4OwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUub3JpZW50YXRpb24gPSBmdW5jdGlvbiAob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICYmIChvcmllbnRhdGlvbi50b0xvd2VyQ2FzZSgpID09PSAicmlnaHQiIHx8IG9yaWVudGF0aW9uLnRvTG93ZXJDYXNlKCkgPT09ICJsZWZ0IikpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvcmllbnRhdGlvbiArICIgaXMgbm90IGEgc3VwcG9ydGVkIG9yaWVudGF0aW9uIGZvciBUaW1lQXhpcyAtIG9ubHkgaG9yaXpvbnRhbCBvcmllbnRhdGlvbnMgYXJlIHN1cHBvcnRlZCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLm9yaWVudGF0aW9uLmNhbGwodGhpcywgb3JpZW50YXRpb24pOyAvLyBtYWludGFpbnMgZ2V0dGVyLXNldHRlciBmdW5jdGlvbmFsaXR5CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fY29tcHV0ZUhlaWdodCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0OwogICAgICAgICAgICB0aGlzLl90aWVySGVpZ2h0cyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX251bVRpZXJzOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJIZWlnaHRzLnB1c2godGV4dEhlaWdodCArIHRoaXMudGlja0xhYmVsUGFkZGluZygpICsKICAgICAgICAgICAgICAgICAgICAoKHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpXSkgPT09ICJiZXR3ZWVuIiA/IDAgOiB0aGlzLl9tYXhMYWJlbFRpY2tMZW5ndGgoKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkMy5zdW0odGhpcy5fdGllckhlaWdodHMpOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX2dldEludGVydmFsTGVuZ3RoID0gZnVuY3Rpb24gKGNvbmZpZykgewogICAgICAgICAgICB2YXIgc3RhcnREYXRlID0gdGhpcy5fc2NhbGUuZG9tYWluKClbMF07CiAgICAgICAgICAgIHZhciBkM0ludGVydmFsID0gc2NhbGVzLlRpbWUudGltZUludGVydmFsVG9EM1RpbWUoY29uZmlnLmludGVydmFsLCB0aGlzLl91c2VVVEMpOwogICAgICAgICAgICB2YXIgZW5kRGF0ZSA9IGQzSW50ZXJ2YWwub2Zmc2V0KHN0YXJ0RGF0ZSwgY29uZmlnLnN0ZXApOwogICAgICAgICAgICBpZiAoZW5kRGF0ZSA+IHRoaXMuX3NjYWxlLmRvbWFpbigpWzFdKSB7CiAgICAgICAgICAgICAgICAvLyB0aGlzIG9mZnNldCBpcyB0b28gbGFyZ2UsIHNvIGp1c3QgcmV0dXJuIGF2YWlsYWJsZSB3aWR0aAogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMud2lkdGgoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBtZWFzdXJlIGhvdyBtdWNoIHNwYWNlIG9uZSBkYXRlIGNhbiBnZXQKICAgICAgICAgICAgdmFyIHN0ZXBMZW5ndGggPSBNYXRoLmFicyh0aGlzLl9zY2FsZS5zY2FsZShlbmREYXRlKSAtIHRoaXMuX3NjYWxlLnNjYWxlKHN0YXJ0RGF0ZSkpOwogICAgICAgICAgICByZXR1cm4gc3RlcExlbmd0aDsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9tYXhXaWR0aEZvckludGVydmFsID0gZnVuY3Rpb24gKGNvbmZpZykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbWVhc3VyZXIubWVhc3VyZShjb25maWcuZm9ybWF0dGVyKFRpbWUuX0xPTkdfREFURSkpLndpZHRoOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2sgaWYgdGllciBjb25maWd1cmF0aW9uIGZpdHMgaW4gdGhlIGN1cnJlbnQgd2lkdGggYW5kIHNhdGlzZmllZCB0aGUKICAgICAgICAgKiBtYXggVGltZUludGVydmFsIHByZWNpc2lvbiBsaW1pdC4KICAgICAgICAgKi8KICAgICAgICBUaW1lLnByb3RvdHlwZS5fY2hlY2tUaW1lQXhpc1RpZXJDb25maWd1cmF0aW9uID0gZnVuY3Rpb24gKGNvbmZpZykgewogICAgICAgICAgICAvLyBVc2UgdGhlIHNvcnRlZCBpbmRleCB0byBkZXRlcm1pbmUgaWYgdGhlIHRlaXIgY29uZmlndXJhdGlvbiBjb250YWlucyBhCiAgICAgICAgICAgIC8vIHRpbWUgaW50ZXJ2YWwgdGhhdCBpcyB0b28gcHJlY2lzZSBmb3IgdGhlIG1heFRpbWVJbnRlcnZhbFByZWNpc2lvbgogICAgICAgICAgICAvLyBzZXR0aW5nIChpZiBzZXQpLgogICAgICAgICAgICBpZiAodGhpcy5fbWF4VGltZUludGVydmFsUHJlY2lzaW9uICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHZhciBwcmVjaXNpb25MaW1pdCA9IFRpbWUuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYW3RoaXMuX21heFRpbWVJbnRlcnZhbFByZWNpc2lvbl07CiAgICAgICAgICAgICAgICB2YXIgY29uZmlnUHJlY2lzaW9uID0gVGltZS5fU09SVEVEX1RJTUVfSU5URVJWQUxfSU5ERVhbY29uZmlnLmludGVydmFsXTsKICAgICAgICAgICAgICAgIGlmIChwcmVjaXNpb25MaW1pdCAhPSBudWxsICYmIGNvbmZpZ1ByZWNpc2lvbiAhPSBudWxsICYmIGNvbmZpZ1ByZWNpc2lvbiA8IHByZWNpc2lvbkxpbWl0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB3b3JzdFdpZHRoID0gdGhpcy5fbWF4V2lkdGhGb3JJbnRlcnZhbChjb25maWcpICsgMiAqIHRoaXMudGlja0xhYmVsUGFkZGluZygpOwogICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5fZ2V0SW50ZXJ2YWxMZW5ndGgoY29uZmlnKSwgdGhpcy53aWR0aCgpKSA+PSB3b3JzdFdpZHRoOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIgPSBmdW5jdGlvbiAoYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICAvLyBNYWtlcyBzdXJlIHRoYXQgdGhlIHNpemUgaXQgcmVxdWlyZXMgaXMgYSBtdWx0aXBsZSBvZiB0aWVyIHNpemVzLCBzdWNoIHRoYXQKICAgICAgICAgICAgLy8gd2UgaGF2ZSBubyBsZWZ0b3ZlciB0aWVycwogICAgICAgICAgICB2YXIgc2l6ZSA9IF9zdXBlci5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIuY2FsbCh0aGlzLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KTsKICAgICAgICAgICAgdmFyIHRpZXJIZWlnaHRzID0gdGhpcy5fdGllckhlaWdodHMucmVkdWNlKGZ1bmN0aW9uIChwcmV2VmFsdWUsIGN1cnJWYWx1ZSwgaW5kZXgsIGFycikgewogICAgICAgICAgICAgICAgcmV0dXJuIChwcmV2VmFsdWUgKyBjdXJyVmFsdWUgPiBzaXplLmhlaWdodCkgPyBwcmV2VmFsdWUgOiAocHJldlZhbHVlICsgY3VyclZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBub25Db3JlSGVpZ2h0ID0gdGhpcy5tYXJnaW4oKSArICh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpID8gdGhpcy5hbm5vdGF0aW9uVGllckNvdW50KCkgKiB0aGlzLl9hbm5vdGF0aW9uVGllckhlaWdodCgpIDogMCk7CiAgICAgICAgICAgIHNpemUuaGVpZ2h0ID0gTWF0aC5taW4oc2l6ZS5oZWlnaHQsIHRpZXJIZWlnaHRzICsgbm9uQ29yZUhlaWdodCk7CiAgICAgICAgICAgIHJldHVybiBzaXplOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX3NldHVwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9zZXR1cERvbUVsZW1lbnRzKCk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fc2V0dXBEb21FbGVtZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIiArIFRpbWUuVElNRV9BWElTX1RJRVJfQ0xBU1MpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl90aWVyTGFiZWxDb250YWluZXJzID0gW107CiAgICAgICAgICAgIHRoaXMuX3RpZXJNYXJrQ29udGFpbmVycyA9IFtdOwogICAgICAgICAgICB0aGlzLl90aWVyQmFzZWxpbmVzID0gW107CiAgICAgICAgICAgIHRoaXMuX3RpY2tMYWJlbENvbnRhaW5lci5yZW1vdmUoKTsKICAgICAgICAgICAgdGhpcy5fYmFzZWxpbmUucmVtb3ZlKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5fbnVtVGllcnM7ICsraSkgewogICAgICAgICAgICAgICAgdmFyIHRpZXJDb250YWluZXIgPSB0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKFRpbWUuVElNRV9BWElTX1RJRVJfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICAgICAgdGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5wdXNoKHRpZXJDb250YWluZXIuYXBwZW5kKCJnIikuY2xhc3NlZChheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTICsgIi1jb250YWluZXIiLCB0cnVlKSk7CiAgICAgICAgICAgICAgICB0aGlzLl90aWVyTWFya0NvbnRhaW5lcnMucHVzaCh0aWVyQ29udGFpbmVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoYXhpcyQyLkF4aXMuVElDS19NQVJLX0NMQVNTICsgIi1jb250YWluZXIiLCB0cnVlKSk7CiAgICAgICAgICAgICAgICB0aGlzLl90aWVyQmFzZWxpbmVzLnB1c2godGllckNvbnRhaW5lci5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJiYXNlbGluZSIsIHRydWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBzcmMkMS5TdmdDb250ZXh0KHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbMF0ubm9kZSgpKTsKICAgICAgICAgICAgdGhpcy5fbWVhc3VyZXIgPSBuZXcgc3JjJDEuQ2FjaGVNZWFzdXJlcihjb250ZXh0KTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMgPSBmdW5jdGlvbiAoY29uZmlnKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY2FsZS50aWNrSW50ZXJ2YWwoY29uZmlnLmludGVydmFsLCBjb25maWcuc3RlcCwgdGhpcy5fdXNlVVRDKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9nZXRUaWNrVmFsdWVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdLnJlZHVjZShmdW5jdGlvbiAodGlja3MsIGNvbmZpZykgeyByZXR1cm4gdGlja3MuY29uY2F0KF90aGlzLl9nZXRUaWNrSW50ZXJ2YWxWYWx1ZXMoY29uZmlnKSk7IH0sIFtdKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9jbGVhblRpZXJzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgdGhpcy5fdGllckxhYmVsQ29udGFpbmVycy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJMYWJlbENvbnRhaW5lcnNbaW5kZXhdLnNlbGVjdEFsbCgiLiIgKyBheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5yZW1vdmUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJNYXJrQ29udGFpbmVyc1tpbmRleF0uc2VsZWN0QWxsKCIuIiArIGF4aXMkMi5BeGlzLlRJQ0tfTUFSS19DTEFTUykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl90aWVyQmFzZWxpbmVzW2luZGV4XS5zdHlsZSgidmlzaWJpbGl0eSIsICJoaWRkZW4iKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uID0gZnVuY3Rpb24gKGNvbmZpZykgewogICAgICAgICAgICB2YXIgdGlja1BvcyA9IHRoaXMuX3NjYWxlLnRpY2tJbnRlcnZhbChjb25maWcuaW50ZXJ2YWwsIGNvbmZpZy5zdGVwLCB0aGlzLl91c2VVVEMpOwogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fc2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIHZhciB0aWNrUG9zVmFsdWVzID0gdGlja1Bvcy5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQudmFsdWVPZigpOyB9KTsgLy8gY2FuJ3QgaW5kZXhPZiB3aXRoIG9iamVjdHMKICAgICAgICAgICAgaWYgKHRpY2tQb3NWYWx1ZXMuaW5kZXhPZihkb21haW5bMF0udmFsdWVPZigpKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHRpY2tQb3MudW5zaGlmdChkb21haW5bMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aWNrUG9zVmFsdWVzLmluZGV4T2YoZG9tYWluWzFdLnZhbHVlT2YoKSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICB0aWNrUG9zLnB1c2goZG9tYWluWzFdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGlja1BvczsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9yZW5kZXJUaWVyTGFiZWxzID0gZnVuY3Rpb24gKGNvbnRhaW5lciwgY29uZmlnLCBpbmRleCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgdGlja1BvcyA9IHRoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKGNvbmZpZyk7CiAgICAgICAgICAgIHZhciBsYWJlbFBvcyA9IFtdOwogICAgICAgICAgICBpZiAodGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2luZGV4XSA9PT0gImJldHdlZW4iICYmIGNvbmZpZy5zdGVwID09PSAxKSB7CiAgICAgICAgICAgICAgICB0aWNrUG9zLm1hcChmdW5jdGlvbiAoZGF0dW0sIGkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaSArIDEgPj0gdGlja1Bvcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsYWJlbFBvcy5wdXNoKG5ldyBEYXRlKCh0aWNrUG9zW2kgKyAxXS52YWx1ZU9mKCkgLSB0aWNrUG9zW2ldLnZhbHVlT2YoKSkgLyAyICsgdGlja1Bvc1tpXS52YWx1ZU9mKCkpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGFiZWxQb3MgPSB0aWNrUG9zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0aWNrTGFiZWxzVXBkYXRlID0gY29udGFpbmVyLnNlbGVjdEFsbCgiLiIgKyBheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTKS5kYXRhKGxhYmVsUG9zLCBmdW5jdGlvbiAoZCkgeyByZXR1cm4gU3RyaW5nKGQudmFsdWVPZigpKTsgfSk7CiAgICAgICAgICAgIHZhciB0aWNrTGFiZWxzRW50ZXIgPSB0aWNrTGFiZWxzVXBkYXRlCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgiZyIpCiAgICAgICAgICAgICAgICAuY2xhc3NlZChheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTLCB0cnVlKTsKICAgICAgICAgICAgdGlja0xhYmVsc0VudGVyLmFwcGVuZCgidGV4dCIpOwogICAgICAgICAgICB2YXIgeFRyYW5zbGF0ZSA9ICh0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbaW5kZXhdID09PSAiY2VudGVyIiB8fCBjb25maWcuc3RlcCA9PT0gMSkgPyAwIDogdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7CiAgICAgICAgICAgIHZhciB5VHJhbnNsYXRlOwogICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbigpID09PSAiYm90dG9tIikgewogICAgICAgICAgICAgICAgeVRyYW5zbGF0ZSA9IGQzLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLCBpbmRleCArIDEpKSAtIHRoaXMudGlja0xhYmVsUGFkZGluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpbmRleF0gPT09ICJjZW50ZXIiKSB7CiAgICAgICAgICAgICAgICAgICAgeVRyYW5zbGF0ZSA9IHRoaXMuaGVpZ2h0KCkgLSBkMy5zdW0odGhpcy5fdGllckhlaWdodHMuc2xpY2UoMCwgaW5kZXgpKSAtIHRoaXMudGlja0xhYmVsUGFkZGluZygpIC0gdGhpcy5fbWF4TGFiZWxUaWNrTGVuZ3RoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB5VHJhbnNsYXRlID0gdGhpcy5oZWlnaHQoKSAtIGQzLnN1bSh0aGlzLl90aWVySGVpZ2h0cy5zbGljZSgwLCBpbmRleCkpIC0gdGhpcy50aWNrTGFiZWxQYWRkaW5nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRpY2tMYWJlbHMgPSB0aWNrTGFiZWxzVXBkYXRlLm1lcmdlKHRpY2tMYWJlbHNFbnRlcik7CiAgICAgICAgICAgIHZhciB0ZXh0U2VsZWN0aW9uID0gdGlja0xhYmVscy5zZWxlY3RBbGwoInRleHQiKTsKICAgICAgICAgICAgaWYgKHRleHRTZWxlY3Rpb24uc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgdGV4dFNlbGVjdGlvbi5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4VHJhbnNsYXRlICsgIiwiICsgeVRyYW5zbGF0ZSArICIpIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGlja0xhYmVsc1VwZGF0ZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIHRpY2tMYWJlbHMuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24gKGQpIHsgcmV0dXJuICJ0cmFuc2xhdGUoIiArIF90aGlzLl9zY2FsZS5zY2FsZShkKSArICIsMCkiOyB9KTsKICAgICAgICAgICAgdmFyIGFuY2hvciA9ICh0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbaW5kZXhdID09PSAiY2VudGVyIiB8fCBjb25maWcuc3RlcCA9PT0gMSkgPyAibWlkZGxlIiA6ICJzdGFydCI7CiAgICAgICAgICAgIHRpY2tMYWJlbHMuc2VsZWN0QWxsKCJ0ZXh0IikudGV4dChjb25maWcuZm9ybWF0dGVyKS5zdHlsZSgidGV4dC1hbmNob3IiLCBhbmNob3IpOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX3JlbmRlclRpY2tNYXJrcyA9IGZ1bmN0aW9uICh0aWNrVmFsdWVzLCBpbmRleCkgewogICAgICAgICAgICB2YXIgdGlja01hcmtzVXBkYXRlID0gdGhpcy5fdGllck1hcmtDb250YWluZXJzW2luZGV4XS5zZWxlY3RBbGwoIi4iICsgYXhpcyQyLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHRpY2tWYWx1ZXMpOwogICAgICAgICAgICB2YXIgdGlja01hcmtzID0gdGlja01hcmtzVXBkYXRlCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgibGluZSIpCiAgICAgICAgICAgICAgICAuY2xhc3NlZChheGlzJDIuQXhpcy5USUNLX01BUktfQ0xBU1MsIHRydWUpCiAgICAgICAgICAgICAgICAubWVyZ2UodGlja01hcmtzVXBkYXRlKTsKICAgICAgICAgICAgdmFyIGF0dHIgPSB0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTsKICAgICAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMuX3RpZXJIZWlnaHRzLnNsaWNlKDAsIGluZGV4KS5yZWR1Y2UoZnVuY3Rpb24gKHRyYW5zbGF0ZSwgaGVpZ2h0KSB7IHJldHVybiB0cmFuc2xhdGUgKyBoZWlnaHQ7IH0sIDApOwogICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbigpID09PSAiYm90dG9tIikgewogICAgICAgICAgICAgICAgYXR0clsieTEiXSA9IG9mZnNldDsKICAgICAgICAgICAgICAgIGF0dHJbInkyIl0gPSBvZmZzZXQgKyAodGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2luZGV4XSA9PT0gImNlbnRlciIgPyB0aGlzLmlubmVyVGlja0xlbmd0aCgpIDogdGhpcy5fdGllckhlaWdodHNbaW5kZXhdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGF0dHJbInkxIl0gPSB0aGlzLmhlaWdodCgpIC0gb2Zmc2V0OwogICAgICAgICAgICAgICAgYXR0clsieTIiXSA9IHRoaXMuaGVpZ2h0KCkgLSAob2Zmc2V0ICsgKHRoaXMuX3RpZXJMYWJlbFBvc2l0aW9uc1tpbmRleF0gPT09ICJjZW50ZXIiID8KICAgICAgICAgICAgICAgICAgICB0aGlzLmlubmVyVGlja0xlbmd0aCgpIDogdGhpcy5fdGllckhlaWdodHNbaW5kZXhdKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGlja01hcmtzLmF0dHJzKGF0dHIpOwogICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbigpID09PSAiYm90dG9tIikgewogICAgICAgICAgICAgICAgYXR0clsieTEiXSA9IG9mZnNldDsKICAgICAgICAgICAgICAgIGF0dHJbInkyIl0gPSBvZmZzZXQgKyAodGhpcy5fdGllckxhYmVsUG9zaXRpb25zW2luZGV4XSA9PT0gImNlbnRlciIgPyB0aGlzLmVuZFRpY2tMZW5ndGgoKSA6IHRoaXMuX3RpZXJIZWlnaHRzW2luZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhdHRyWyJ5MSJdID0gdGhpcy5oZWlnaHQoKSAtIG9mZnNldDsKICAgICAgICAgICAgICAgIGF0dHJbInkyIl0gPSB0aGlzLmhlaWdodCgpIC0gKG9mZnNldCArICh0aGlzLl90aWVyTGFiZWxQb3NpdGlvbnNbaW5kZXhdID09PSAiY2VudGVyIiA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRUaWNrTGVuZ3RoKCkgOiB0aGlzLl90aWVySGVpZ2h0c1tpbmRleF0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkMy5zZWxlY3QodGlja01hcmtzLm5vZGVzKClbMF0pLmF0dHJzKGF0dHIpOwogICAgICAgICAgICBkMy5zZWxlY3QodGlja01hcmtzLm5vZGVzKClbdGlja01hcmtzLnNpemUoKSAtIDFdKS5hdHRycyhhdHRyKTsKICAgICAgICAgICAgLy8gQWRkIGVuZC10aWNrIGNsYXNzZXMgdG8gZmlyc3QgYW5kIGxhc3QgdGljayBmb3IgQ1NTIGN1c3RvbWl6YXRpb24gcHVycG9zZXMKICAgICAgICAgICAgZDMuc2VsZWN0KHRpY2tNYXJrcy5ub2RlcygpWzBdKS5jbGFzc2VkKGF4aXMkMi5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICBkMy5zZWxlY3QodGlja01hcmtzLm5vZGVzKClbdGlja01hcmtzLnNpemUoKSAtIDFdKS5jbGFzc2VkKGF4aXMkMi5BeGlzLkVORF9USUNLX01BUktfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICB0aWNrTWFya3NVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH07CiAgICAgICAgVGltZS5wcm90b3R5cGUuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcyA9IGZ1bmN0aW9uICh0aWNrVmFsdWVzKSB7CiAgICAgICAgICAgIHZhciB0aWNrTWFya3NVcGRhdGUgPSB0aGlzLl90aWNrTWFya0NvbnRhaW5lci5zZWxlY3RBbGwoIi4iICsgYXhpcyQyLkF4aXMuVElDS19NQVJLX0NMQVNTKS5kYXRhKHRpY2tWYWx1ZXMpOwogICAgICAgICAgICB2YXIgdGlja01hcmtzID0gdGlja01hcmtzVXBkYXRlCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgibGluZSIpCiAgICAgICAgICAgICAgICAuY2xhc3NlZChheGlzJDIuQXhpcy5USUNLX01BUktfQ0xBU1MsIHRydWUpCiAgICAgICAgICAgICAgICAubWVyZ2UodGlja01hcmtzVXBkYXRlKTsKICAgICAgICAgICAgdmFyIGF0dHIgPSB0aGlzLl9nZW5lcmF0ZVRpY2tNYXJrQXR0ckhhc2goKTsKICAgICAgICAgICAgYXR0clsieTIiXSA9ICh0aGlzLm9yaWVudGF0aW9uKCkgPT09ICJib3R0b20iKSA/IHRoaXMudGlja0xhYmVsUGFkZGluZygpIDogdGhpcy5oZWlnaHQoKSAtIHRoaXMudGlja0xhYmVsUGFkZGluZygpOwogICAgICAgICAgICB0aWNrTWFya3MuYXR0cnMoYXR0cik7CiAgICAgICAgICAgIHRpY2tNYXJrc1VwZGF0ZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXggPCAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRpY2tJbnRlcnZhbFZhbHVlcyh0aGlzLl9wb3NzaWJsZVRpbWVBeGlzQ29uZmlndXJhdGlvbnNbdGhpcy5fbW9zdFByZWNpc2VDb25maWdJbmRleCAtIDFdWzBdKTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLl9tb3N0UHJlY2lzZUNvbmZpZ0luZGV4ID0gdGhpcy5fZ2V0TW9zdFByZWNpc2VDb25maWd1cmF0aW9uSW5kZXgoKTsKICAgICAgICAgICAgdmFyIHRpZXJDb25maWdzID0gdGhpcy5fcG9zc2libGVUaW1lQXhpc0NvbmZpZ3VyYXRpb25zW3RoaXMuX21vc3RQcmVjaXNlQ29uZmlnSW5kZXhdOwogICAgICAgICAgICB0aGlzLl9jbGVhblRpZXJzKCk7CiAgICAgICAgICAgIHRpZXJDb25maWdzLmZvckVhY2goZnVuY3Rpb24gKGNvbmZpZywgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9yZW5kZXJUaWVyTGFiZWxzKF90aGlzLl90aWVyTGFiZWxDb250YWluZXJzW2ldLCBjb25maWcsIGkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHRpZXJUaWNrcyA9IHRpZXJDb25maWdzLm1hcChmdW5jdGlvbiAoY29uZmlnLCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2dldFRpY2tWYWx1ZXNGb3JDb25maWd1cmF0aW9uKGNvbmZpZyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgYmFzZWxpbmVPZmZzZXQgPSAwOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IE1hdGgubWF4KHRpZXJDb25maWdzLmxlbmd0aCwgMSk7ICsraSkgewogICAgICAgICAgICAgICAgdmFyIGF0dHIgPSB0aGlzLl9nZW5lcmF0ZUJhc2VsaW5lQXR0ckhhc2goKTsKICAgICAgICAgICAgICAgIGF0dHJbInkxIl0gKz0gKHRoaXMub3JpZW50YXRpb24oKSA9PT0gImJvdHRvbSIpID8gYmFzZWxpbmVPZmZzZXQgOiAtYmFzZWxpbmVPZmZzZXQ7CiAgICAgICAgICAgICAgICBhdHRyWyJ5MiJdID0gYXR0clsieTEiXTsKICAgICAgICAgICAgICAgIHRoaXMuX3RpZXJCYXNlbGluZXNbaV0uYXR0cnMoYXR0cikuc3R5bGUoInZpc2liaWxpdHkiLCAiaW5oZXJpdCIpOwogICAgICAgICAgICAgICAgYmFzZWxpbmVPZmZzZXQgKz0gdGhpcy5fdGllckhlaWdodHNbaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxhYmVsTGVzc1RpY2tzID0gW107CiAgICAgICAgICAgIHZhciBkb21haW4gPSB0aGlzLl9zY2FsZS5kb21haW4oKTsKICAgICAgICAgICAgdmFyIHRvdGFsTGVuZ3RoID0gdGhpcy5fc2NhbGUuc2NhbGUoZG9tYWluWzFdKSAtIHRoaXMuX3NjYWxlLnNjYWxlKGRvbWFpblswXSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRJbnRlcnZhbExlbmd0aCh0aWVyQ29uZmlnc1swXSkgKiAxLjUgPj0gdG90YWxMZW5ndGgpIHsKICAgICAgICAgICAgICAgIGxhYmVsTGVzc1RpY2tzID0gdGhpcy5fZ2VuZXJhdGVMYWJlbGxlc3NUaWNrcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckxhYmVsbGVzc1RpY2tNYXJrcyhsYWJlbExlc3NUaWNrcyk7CiAgICAgICAgICAgIHRoaXMuX2hpZGVPdmVyZmxvd2luZ1RpZXJzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGllckNvbmZpZ3MubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlclRpY2tNYXJrcyh0aWVyVGlja3NbaV0sIGkpOwogICAgICAgICAgICAgICAgdGhpcy5faGlkZU92ZXJsYXBwaW5nQW5kQ3V0T2ZmTGFiZWxzKGkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmFubm90YXRpb25zRW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmF3QW5ub3RhdGlvbnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZUFubm90YXRpb25zKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5faGlkZU92ZXJmbG93aW5nVGllcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBhdmFpbGFibGVIZWlnaHQgPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICB2YXIgdXNlZEhlaWdodCA9IDA7CiAgICAgICAgICAgIHRoaXMuY29udGVudCgpCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCIuIiArIFRpbWUuVElNRV9BWElTX1RJRVJfQ0xBU1MpCiAgICAgICAgICAgICAgICAuYXR0cigidmlzaWJpbGl0eSIsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICB1c2VkSGVpZ2h0ICs9IF90aGlzLl90aWVySGVpZ2h0c1tpXTsKICAgICAgICAgICAgICAgIHJldHVybiB1c2VkSGVpZ2h0IDw9IGF2YWlsYWJsZUhlaWdodCA/ICJpbmhlcml0IiA6ICJoaWRkZW4iOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIFRpbWUucHJvdG90eXBlLl9oaWRlT3ZlcmxhcHBpbmdBbmRDdXRPZmZMYWJlbHMgPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGJvdW5kaW5nQm94ID0gdGhpcy5lbGVtZW50KCkubm9kZSgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB2YXIgaXNJbnNpZGVCQm94ID0gZnVuY3Rpb24gKHRpY2tCb3gpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoTWF0aC5mbG9vcihib3VuZGluZ0JveC5sZWZ0KSA8PSBNYXRoLmNlaWwodGlja0JveC5sZWZ0KSAmJgogICAgICAgICAgICAgICAgICAgIE1hdGguZmxvb3IoYm91bmRpbmdCb3gudG9wKSA8PSBNYXRoLmNlaWwodGlja0JveC50b3ApICYmCiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aWNrQm94LnJpZ2h0KSA8PSBNYXRoLmNlaWwoYm91bmRpbmdCb3gubGVmdCArIF90aGlzLndpZHRoKCkpICYmCiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcih0aWNrQm94LmJvdHRvbSkgPD0gTWF0aC5jZWlsKGJvdW5kaW5nQm94LnRvcCArIF90aGlzLmhlaWdodCgpKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB2aXNpYmxlVGlja01hcmtzID0gdGhpcy5fdGllck1hcmtDb250YWluZXJzW2luZGV4XQogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgiLiIgKyBheGlzJDIuQXhpcy5USUNLX01BUktfQ0xBU1MpCiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICB2YXIgdmlzaWJpbGl0eSA9IGQzLnNlbGVjdCh0aGlzKS5zdHlsZSgidmlzaWJpbGl0eSIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHZpc2liaWxpdHkgPT09ICJ2aXNpYmxlIiB8fCB2aXNpYmlsaXR5ID09PSAiaW5oZXJpdCI7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBXZSB1c2UgdGhlIENsaWVudFJlY3RzIGJlY2F1c2UgeDEveDIgYXR0cmlidXRlcyBhcmUgbm90IGNvbXBhcmFibGUgdG8gQ2xpZW50UmVjdHMgb2YgbGFiZWxzCiAgICAgICAgICAgIHZhciB2aXNpYmxlVGlja01hcmtSZWN0cyA9IHZpc2libGVUaWNrTWFya3Mubm9kZXMoKS5tYXAoZnVuY3Rpb24gKG1hcmspIHsgcmV0dXJuIG1hcmsuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7IH0pOwogICAgICAgICAgICB2YXIgdmlzaWJsZVRpY2tMYWJlbHMgPSB0aGlzLl90aWVyTGFiZWxDb250YWluZXJzW2luZGV4XQogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgiLiIgKyBheGlzJDIuQXhpcy5USUNLX0xBQkVMX0NMQVNTKQogICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgdmFyIHZpc2liaWxpdHkgPSBkMy5zZWxlY3QodGhpcykuc3R5bGUoInZpc2liaWxpdHkiKTsKICAgICAgICAgICAgICAgIHJldHVybiB2aXNpYmlsaXR5ID09PSAidmlzaWJsZSIgfHwgdmlzaWJpbGl0eSA9PT0gImluaGVyaXQiOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGxhc3RMYWJlbENsaWVudFJlY3Q7CiAgICAgICAgICAgIHZpc2libGVUaWNrTGFiZWxzLmVhY2goZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgIHZhciBjbGllbnRSZWN0ID0gdGhpcy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgIHZhciB0aWNrTGFiZWwgPSBkMy5zZWxlY3QodGhpcyk7CiAgICAgICAgICAgICAgICB2YXIgbGVhZGluZ1RpY2tNYXJrID0gdmlzaWJsZVRpY2tNYXJrUmVjdHNbaV07CiAgICAgICAgICAgICAgICB2YXIgdHJhaWxpbmdUaWNrTWFyayA9IHZpc2libGVUaWNrTWFya1JlY3RzW2kgKyAxXTsKICAgICAgICAgICAgICAgIHZhciBpc092ZXJsYXBwaW5nTGFzdExhYmVsID0gKGxhc3RMYWJlbENsaWVudFJlY3QgIT0gbnVsbCAmJiB1dGlscyQxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoY2xpZW50UmVjdCwgbGFzdExhYmVsQ2xpZW50UmVjdCkpOwogICAgICAgICAgICAgICAgdmFyIGlzT3ZlcmxhcHBpbmdMZWFkaW5nVGlja01hcmsgPSAobGVhZGluZ1RpY2tNYXJrICE9IG51bGwgJiYgdXRpbHMkMS5ET00uY2xpZW50UmVjdHNPdmVybGFwKGNsaWVudFJlY3QsIGxlYWRpbmdUaWNrTWFyaykpOwogICAgICAgICAgICAgICAgdmFyIGlzT3ZlcmxhcHBpbmdUcmFpbGluZ1RpY2tNYXJrID0gKHRyYWlsaW5nVGlja01hcmsgIT0gbnVsbCAmJiB1dGlscyQxLkRPTS5jbGllbnRSZWN0c092ZXJsYXAoY2xpZW50UmVjdCwgdHJhaWxpbmdUaWNrTWFyaykpOwogICAgICAgICAgICAgICAgaWYgKCFpc0luc2lkZUJCb3goY2xpZW50UmVjdCkgfHwgaXNPdmVybGFwcGluZ0xhc3RMYWJlbCB8fCBpc092ZXJsYXBwaW5nTGVhZGluZ1RpY2tNYXJrIHx8IGlzT3ZlcmxhcHBpbmdUcmFpbGluZ1RpY2tNYXJrKSB7CiAgICAgICAgICAgICAgICAgICAgdGlja0xhYmVsLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImhpZGRlbiIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbGFzdExhYmVsQ2xpZW50UmVjdCA9IGNsaWVudFJlY3Q7CiAgICAgICAgICAgICAgICAgICAgdGlja0xhYmVsLnN0eWxlKCJ2aXNpYmlsaXR5IiwgImluaGVyaXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBUaW1lLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyLnJlc2V0KCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgQ1NTIGNsYXNzIGFwcGxpZWQgdG8gZWFjaCBUaW1lIEF4aXMgdGllcgogICAgICAgICAqLwogICAgICAgIFRpbWUuVElNRV9BWElTX1RJRVJfQ0xBU1MgPSAidGltZS1heGlzLXRpZXIiOwogICAgICAgIFRpbWUuX1NPUlRFRF9USU1FX0lOVEVSVkFMX0lOREVYID0gKF9hID0ge30sCiAgICAgICAgICAgIF9hW2V4cG9ydHMuVGltZUludGVydmFsLnNlY29uZF0gPSAwLAogICAgICAgICAgICBfYVtleHBvcnRzLlRpbWVJbnRlcnZhbC5taW51dGVdID0gMSwKICAgICAgICAgICAgX2FbZXhwb3J0cy5UaW1lSW50ZXJ2YWwuaG91cl0gPSAyLAogICAgICAgICAgICBfYVtleHBvcnRzLlRpbWVJbnRlcnZhbC5kYXldID0gMywKICAgICAgICAgICAgX2FbZXhwb3J0cy5UaW1lSW50ZXJ2YWwud2Vla10gPSA0LAogICAgICAgICAgICBfYVtleHBvcnRzLlRpbWVJbnRlcnZhbC5tb250aF0gPSA1LAogICAgICAgICAgICBfYVtleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyXSA9IDYsCiAgICAgICAgICAgIF9hKTsKICAgICAgICBUaW1lLl9ERUZBVUxUX1RJTUVfQVhJU19DT05GSUdVUkFUSU9OUyA9IGZ1bmN0aW9uICh1c2VVVEMpIHsKICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IGZ1bmN0aW9uIChzcGVjaWZpZXIpIHsgcmV0dXJuIGZvcm1hdHRlcnMudGltZShzcGVjaWZpZXIsIHVzZVVUQyk7IH07CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuc2Vjb25kLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUk6JU06JVMgJXAiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVlLCAlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLnNlY29uZCwgc3RlcDogNSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVJOiVNOiVTICVwIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5kYXksIHN0ZXA6IDEsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlQiAlZSwgJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5zZWNvbmQsIHN0ZXA6IDEwLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUk6JU06JVMgJXAiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVlLCAlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLnNlY29uZCwgc3RlcDogMTUsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlSTolTTolUyAlcCIpIH0sCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuZGF5LCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUIgJWUsICVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuc2Vjb25kLCBzdGVwOiAzMCwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVJOiVNOiVTICVwIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5kYXksIHN0ZXA6IDEsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlQiAlZSwgJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5taW51dGUsIHN0ZXA6IDEsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlSTolTSAlcCIpIH0sCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuZGF5LCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUIgJWUsICVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwubWludXRlLCBzdGVwOiA1LCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUk6JU0gJXAiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVlLCAlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLm1pbnV0ZSwgc3RlcDogMTAsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlSTolTSAlcCIpIH0sCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuZGF5LCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUIgJWUsICVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwubWludXRlLCBzdGVwOiAxNSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVJOiVNICVwIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5kYXksIHN0ZXA6IDEsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlQiAlZSwgJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5taW51dGUsIHN0ZXA6IDMwLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUk6JU0gJXAiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVlLCAlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmhvdXIsIHN0ZXA6IDEsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlSSAlcCIpIH0sCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuZGF5LCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUIgJWUsICVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuaG91ciwgc3RlcDogMywgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVJICVwIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5kYXksIHN0ZXA6IDEsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlQiAlZSwgJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5ob3VyLCBzdGVwOiA2LCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUkgJXAiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVlLCAlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmhvdXIsIHN0ZXA6IDEyLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUkgJXAiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVlLCAlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLmRheSwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVhICVlIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5tb250aCwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCICVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwuZGF5LCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJWUiKSB9LAogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLm1vbnRoLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJUIgJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5tb250aCwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVCIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5tb250aCwgc3RlcDogMSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiViIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5tb250aCwgc3RlcDogMywgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiViIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC5tb250aCwgc3RlcDogNiwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiViIikgfSwKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAxLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJXkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiA1LCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiAyNSwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwueWVhciwgc3RlcDogNTAsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLnllYXIsIHN0ZXA6IDEwMCwgZm9ybWF0dGVyOiBmb3JtYXR0ZXIoIiVZIikgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAgICAgeyBpbnRlcnZhbDogZXhwb3J0cy5UaW1lSW50ZXJ2YWwueWVhciwgc3RlcDogMjAwLCBmb3JtYXR0ZXI6IGZvcm1hdHRlcigiJVkiKSB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICB7IGludGVydmFsOiBleHBvcnRzLlRpbWVJbnRlcnZhbC55ZWFyLCBzdGVwOiA1MDAsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgICAgIHsgaW50ZXJ2YWw6IGV4cG9ydHMuVGltZUludGVydmFsLnllYXIsIHN0ZXA6IDEwMDAsIGZvcm1hdHRlcjogZm9ybWF0dGVyKCIlWSIpIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICBdOwogICAgICAgIH07CiAgICAgICAgVGltZS5fTE9OR19EQVRFID0gbmV3IERhdGUoOTk5OSwgOCwgMjksIDEyLCA1OSwgOTk5OSk7CiAgICAgICAgcmV0dXJuIFRpbWU7CiAgICB9KGF4aXMkMi5BeGlzKSk7CiAgICBleHBvcnRzLlRpbWUgPSBUaW1lOwogICAgdmFyIF9hOwogICAgfSk7CgogICAgdmFyIGF4ZXMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGNhdGVnb3J5QXhpcywgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKG51bWVyaWNBeGlzLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIodGltZUF4aXMsIGV4cG9ydHMpOwogICAgfSk7CgogICAgdmFyIGRpc3BhdGNoZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB2YXIgRGlzcGF0Y2hlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBEaXNwYXRjaGVyKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3ViY2xhc3NlcyBzZXQgdGhlc2UgaW4gY29uc3RydWN0b3IuIFRoZW4sIHRoZXNlIGdldCBhdHRhY2hlZCB0byB0aGUgZXZlbnQKICAgICAgICAgICAgICogdGFyZ2V0IGluIF9jb25uZWN0CiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIGV2ZW50bmFtZSBpcyBhIERPTSBldmVudCBuYW1lIGxpa2UgIm1vdXNldXAiLCAidG91Y2hzdGFydCIsIGV0Yy4gVGhlCiAgICAgICAgICAgICAqIGNhbGxiYWNrIGlzIHNpbXBseSByZWdpc3RlcmVkIHRvIHRoZSBldmVudCBjYWxsYmFjayB3aXRoIGJ1YmJsaW5nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbiA9IHt9OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQWxsIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZCB0byB0aGlzIGBFdmVudFRhcmdldGAgYW5kIGV2ZW50cyBhcmUgdGhlbgogICAgICAgICAgICAgKiBkaXNwYXRjaGVkIHRvIGNhbGxiYWNrcyBmcm9tIGBfZXZlbnROYW1lVG9DYWxsYmFja1NldGAgbWFudWFsbHkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFN1YmNsYXNzZXMgc2V0IHRoZWlyIG93biBldmVudCB0YXJnZXQgaW5zdGVhZCBvZiBgZG9jdW1lbnRgLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQgPSBkb2N1bWVudDsKICAgICAgICAgICAgdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldCA9IHt9OwogICAgICAgICAgICB0aGlzLl9jb25uZWN0ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgRGlzcGF0Y2hlci5wcm90b3R5cGUuX2hhc05vQ2FsbGJhY2tzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZXZlbnROYW1lcyA9IE9iamVjdC5rZXlzKHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXQpOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2V2ZW50TmFtZXNbaV1dLnNpemUgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBEaXNwYXRjaGVyLnByb3RvdHlwZS5fY29ubmVjdCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuX2Nvbm5lY3RlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb24pLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICB2YXIgcHJvY2Vzc2luZ0Z1bmN0aW9uID0gX3RoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bZXZlbnRdOwogICAgICAgICAgICAgICAgLy8gQWRkIGB7IHBhc3NpdmU6IGZhbHNlIH1gIG9wdGlvbiBiZWNhdXNlIENocm9tZSA3MyBicm9rZSB0aGlzLgogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBldmVudCA9PT0gIndoZWVsIiA/IHsgcGFzc2l2ZTogZmFsc2UgfSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIF90aGlzLl9ldmVudFRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBwcm9jZXNzaW5nRnVuY3Rpb24sIG9wdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gdHJ1ZTsKICAgICAgICB9OwogICAgICAgIERpc3BhdGNoZXIucHJvdG90eXBlLl9kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy5fY29ubmVjdGVkICYmIHRoaXMuX2hhc05vQ2FsbGJhY2tzKCkpIHsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb24pLmZvckVhY2goZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb2Nlc3NpbmdGdW5jdGlvbiA9IF90aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW2V2ZW50XTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZXZlbnRUYXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgcHJvY2Vzc2luZ0Z1bmN0aW9uKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIERpc3BhdGNoZXIucHJvdG90eXBlLl9hZGRDYWxsYmFja0ZvckV2ZW50ID0gZnVuY3Rpb24gKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbZXZlbnROYW1lXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2V2ZW50TmFtZV0gPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2V2ZW50TmFtZVRvQ2FsbGJhY2tTZXRbZXZlbnROYW1lXS5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7CiAgICAgICAgfTsKICAgICAgICBEaXNwYXRjaGVyLnByb3RvdHlwZS5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9ldmVudE5hbWVUb0NhbGxiYWNrU2V0W2V2ZW50TmFtZV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtldmVudE5hbWVdLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdCgpOwogICAgICAgIH07CiAgICAgICAgRGlzcGF0Y2hlci5wcm90b3R5cGUuX2NhbGxDYWxsYmFja3NGb3JFdmVudCA9IGZ1bmN0aW9uIChldmVudE5hbWUpIHsKICAgICAgICAgICAgdmFyIGFyZ3MgPSBbXTsKICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAxOyBfaSA8IGFyZ3VtZW50cy5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICAgIGFyZ3NbX2kgLSAxXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGNhbGxiYWNrU2V0ID0gdGhpcy5fZXZlbnROYW1lVG9DYWxsYmFja1NldFtldmVudE5hbWVdOwogICAgICAgICAgICBpZiAoY2FsbGJhY2tTZXQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgY2FsbGJhY2tTZXQuY2FsbENhbGxiYWNrcy5hcHBseShjYWxsYmFja1NldCwgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBEaXNwYXRjaGVyOwogICAgfSgpKTsKICAgIGV4cG9ydHMuRGlzcGF0Y2hlciA9IERpc3BhdGNoZXI7CiAgICB9KTsKCiAgICB2YXIga2V5RGlzcGF0Y2hlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCiAgICB2YXIgS2V5ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoS2V5LCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5vdCBiZSBpbnZva2VkIGRpcmVjdGx5LgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gS2V5KCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltLZXkuX0tFWURPV05fRVZFTlRfTkFNRV0gPSBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMuX3Byb2Nlc3NLZXlkb3duKGUpOyB9OwogICAgICAgICAgICBfdGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltLZXkuX0tFWVVQX0VWRU5UX05BTUVdID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF90aGlzLl9wcm9jZXNzS2V5dXAoZSk7IH07CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhIEtleSBEaXNwYXRjaGVyLiBJZiBvbmUgYWxyZWFkeSBleGlzdHMgaXQgd2lsbCBiZSByZXR1cm5lZDsKICAgICAgICAgKiBvdGhlcndpc2UsIGEgbmV3IG9uZSB3aWxsIGJlIGNyZWF0ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHtEaXNwYXRjaGVycy5LZXl9CiAgICAgICAgICovCiAgICAgICAgS2V5LmdldERpc3BhdGNoZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBkaXNwYXRjaGVyID0gZG9jdW1lbnRbS2V5Ll9ESVNQQVRDSEVSX0tFWV07CiAgICAgICAgICAgIGlmIChkaXNwYXRjaGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGRpc3BhdGNoZXIgPSBuZXcgS2V5KCk7CiAgICAgICAgICAgICAgICBkb2N1bWVudFtLZXkuX0RJU1BBVENIRVJfS0VZXSA9IGRpc3BhdGNoZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXI7CiAgICAgICAgfTsKICAgICAgICBLZXkucHJvdG90eXBlLl9wcm9jZXNzS2V5ZG93biA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICB0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoS2V5Ll9LRVlET1dOX0VWRU5UX05BTUUsIGV2ZW50LmtleUNvZGUsIGV2ZW50KTsKICAgICAgICB9OwogICAgICAgIEtleS5wcm90b3R5cGUuX3Byb2Nlc3NLZXl1cCA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICB0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoS2V5Ll9LRVlVUF9FVkVOVF9OQU1FLCBldmVudC5rZXlDb2RlLCBldmVudCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbmV2ZXIgYSBrZXkgaXMgcHJlc3NlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7S2V5Q2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuS2V5fSBUaGUgY2FsbGluZyBLZXkgRGlzcGF0Y2hlci4KICAgICAgICAgKi8KICAgICAgICBLZXkucHJvdG90eXBlLm9uS2V5RG93biA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KEtleS5fS0VZRE9XTl9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEga2V5IGlzIHByZXNzZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0tleUNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLktleX0gVGhlIGNhbGxpbmcgS2V5IERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgS2V5LnByb3RvdHlwZS5vZmZLZXlEb3duID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoS2V5Ll9LRVlET1dOX0VWRU5UX05BTUUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKiogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW5ldmVyIGEga2V5IGlzIHJlbGVhc2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtLZXlDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtEaXNwYXRjaGVycy5LZXl9IFRoZSBjYWxsaW5nIEtleSBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIEtleS5wcm90b3R5cGUub25LZXlVcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KEtleS5fS0VZVVBfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgdGhlIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuZXZlciBhIGtleSBpcyByZWxlYXNlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7S2V5Q2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuS2V5fSBUaGUgY2FsbGluZyBLZXkgRGlzcGF0Y2hlci4KICAgICAgICAgKi8KICAgICAgICBLZXkucHJvdG90eXBlLm9mZktleVVwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoS2V5Ll9LRVlVUF9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgS2V5Ll9ESVNQQVRDSEVSX0tFWSA9ICJfX1Bsb3R0YWJsZV9EaXNwYXRjaGVyX0tleSI7CiAgICAgICAgS2V5Ll9LRVlET1dOX0VWRU5UX05BTUUgPSAia2V5ZG93biI7CiAgICAgICAgS2V5Ll9LRVlVUF9FVkVOVF9OQU1FID0gImtleXVwIjsKICAgICAgICByZXR1cm4gS2V5OwogICAgfShkaXNwYXRjaGVyLkRpc3BhdGNoZXIpKTsKICAgIGV4cG9ydHMuS2V5ID0gS2V5OwogICAgfSk7CgogICAgdmFyIG1vdXNlRGlzcGF0Y2hlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIE1vdXNlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoTW91c2UsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBub3QgYmUgaW52b2tlZCBkaXJlY3RseS4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIE1vdXNlKGNvbXBvbmVudCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fbGFzdE1vdXNlUG9zaXRpb24gPSB7IHg6IC0xLCB5OiAtMSB9OwogICAgICAgICAgICBfdGhpcy5fdHJhbnNsYXRvciA9IHV0aWxzJDEuZ2V0VHJhbnNsYXRvcihjb21wb25lbnQpOwogICAgICAgICAgICB2YXIgcHJvY2Vzc01vdmVDYWxsYmFjayA9IGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5fbWVhc3VyZUFuZERpc3BhdGNoKGNvbXBvbmVudCwgZSwgTW91c2UuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCAicGFnZSIpOyB9OwogICAgICAgICAgICBfdGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltNb3VzZS5fTU9VU0VPVkVSX0VWRU5UX05BTUVdID0gcHJvY2Vzc01vdmVDYWxsYmFjazsKICAgICAgICAgICAgX3RoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bTW91c2UuX01PVVNFTU9WRV9FVkVOVF9OQU1FXSA9IHByb2Nlc3NNb3ZlQ2FsbGJhY2s7CiAgICAgICAgICAgIF90aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW01vdXNlLl9NT1VTRU9VVF9FVkVOVF9OQU1FXSA9IHByb2Nlc3NNb3ZlQ2FsbGJhY2s7CiAgICAgICAgICAgIF90aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW01vdXNlLl9NT1VTRURPV05fRVZFTlRfTkFNRV0gPQogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGUpIHsgcmV0dXJuIF90aGlzLl9tZWFzdXJlQW5kRGlzcGF0Y2goY29tcG9uZW50LCBlLCBNb3VzZS5fTU9VU0VET1dOX0VWRU5UX05BTUUpOyB9OwogICAgICAgICAgICBfdGhpcy5fZXZlbnRUb1Byb2Nlc3NpbmdGdW5jdGlvbltNb3VzZS5fTU9VU0VVUF9FVkVOVF9OQU1FXSA9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMuX21lYXN1cmVBbmREaXNwYXRjaChjb21wb25lbnQsIGUsIE1vdXNlLl9NT1VTRVVQX0VWRU5UX05BTUUsICJwYWdlIik7IH07CiAgICAgICAgICAgIF90aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW01vdXNlLl9XSEVFTF9FVkVOVF9OQU1FXSA9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMuX21lYXN1cmVBbmREaXNwYXRjaChjb21wb25lbnQsIGUsIE1vdXNlLl9XSEVFTF9FVkVOVF9OQU1FKTsgfTsKICAgICAgICAgICAgX3RoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bTW91c2UuX0RCTENMSUNLX0VWRU5UX05BTUVdID0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5fbWVhc3VyZUFuZERpc3BhdGNoKGNvbXBvbmVudCwgZSwgTW91c2UuX0RCTENMSUNLX0VWRU5UX05BTUUpOyB9OwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBhIE1vdXNlIERpc3BhdGNoZXIgZm9yIHRoZSBjb21wb25lbnQgdHJlZS4KICAgICAgICAgKiBJZiBvbmUgYWxyZWFkeSBleGlzdHMgb24gdGhhdCA8c3ZnPiwgaXQgd2lsbCBiZSByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhIG5ldyBvbmUgd2lsbCBiZSBjcmVhdGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtTVkdFbGVtZW50fSBlbGVtCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuTW91c2V9CiAgICAgICAgICovCiAgICAgICAgTW91c2UuZ2V0RGlzcGF0Y2hlciA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsKICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCk7CiAgICAgICAgICAgIHZhciBkaXNwYXRjaGVyID0gZWxlbWVudFtNb3VzZS5fRElTUEFUQ0hFUl9LRVldOwogICAgICAgICAgICBpZiAoZGlzcGF0Y2hlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyID0gbmV3IE1vdXNlKGNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICBlbGVtZW50W01vdXNlLl9ESVNQQVRDSEVSX0tFWV0gPSBkaXNwYXRjaGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkaXNwYXRjaGVyOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIHBvc2l0aW9uIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge01vdXNlQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuTW91c2V9IFRoZSBjYWxsaW5nIE1vdXNlIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgTW91c2UucHJvdG90eXBlLm9uTW91c2VNb3ZlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoTW91c2UuX01PVVNFTU9WRV9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gdGhlIG1vdXNlIHBvc2l0aW9uIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge01vdXNlQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuTW91c2V9IFRoZSBjYWxsaW5nIE1vdXNlIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgTW91c2UucHJvdG90eXBlLm9mZk1vdXNlTW92ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KE1vdXNlLl9NT1VTRU1PVkVfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbW91c2Vkb3duIG9jY3Vycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TW91c2VDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtEaXNwYXRjaGVycy5Nb3VzZX0gVGhlIGNhbGxpbmcgTW91c2UgRGlzcGF0Y2hlci4KICAgICAgICAgKi8KICAgICAgICBNb3VzZS5wcm90b3R5cGUub25Nb3VzZURvd24gPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChNb3VzZS5fTU9VU0VET1dOX0VWRU5UX05BTUUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiBhIG1vdXNlZG93biBvY2N1cnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge01vdXNlQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuTW91c2V9IFRoZSBjYWxsaW5nIE1vdXNlIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgTW91c2UucHJvdG90eXBlLm9mZk1vdXNlRG93biA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KE1vdXNlLl9NT1VTRURPV05fRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgbW91c2V1cCBvY2N1cnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge01vdXNlQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuTW91c2V9IFRoZSBjYWxsaW5nIE1vdXNlIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgTW91c2UucHJvdG90eXBlLm9uTW91c2VVcCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KE1vdXNlLl9NT1VTRVVQX0VWRU5UX05BTUUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiBhIG1vdXNldXAgb2NjdXJzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtNb3VzZUNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLk1vdXNlfSBUaGUgY2FsbGluZyBNb3VzZSBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIE1vdXNlLnByb3RvdHlwZS5vZmZNb3VzZVVwID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92ZUNhbGxiYWNrRm9yRXZlbnQoTW91c2UuX01PVVNFVVBfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgd2hlZWwgZXZlbnQgb2NjdXJzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtNb3VzZUNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLk1vdXNlfSBUaGUgY2FsbGluZyBNb3VzZSBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIE1vdXNlLnByb3RvdHlwZS5vbldoZWVsID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoTW91c2UuX1dIRUVMX0VWRU5UX05BTUUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiBhIHdoZWVsIGV2ZW50IG9jY3Vycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TW91c2VDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtEaXNwYXRjaGVycy5Nb3VzZX0gVGhlIGNhbGxpbmcgTW91c2UgRGlzcGF0Y2hlci4KICAgICAgICAgKi8KICAgICAgICBNb3VzZS5wcm90b3R5cGUub2ZmV2hlZWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChNb3VzZS5fV0hFRUxfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgZGJsQ2xpY2sgb2NjdXJzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtNb3VzZUNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLk1vdXNlfSBUaGUgY2FsbGluZyBNb3VzZSBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIE1vdXNlLnByb3RvdHlwZS5vbkRibENsaWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoTW91c2UuX0RCTENMSUNLX0VWRU5UX05BTUUsIGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiBhIGRibENsaWNrIG9jY3Vycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7TW91c2VDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtEaXNwYXRjaGVycy5Nb3VzZX0gVGhlIGNhbGxpbmcgTW91c2UgRGlzcGF0Y2hlci4KICAgICAgICAgKi8KICAgICAgICBNb3VzZS5wcm90b3R5cGUub2ZmRGJsQ2xpY2sgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChNb3VzZS5fREJMQ0xJQ0tfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIHRoZSBtb3VzZSBwb3NpdGlvbiBmcm9tIHRoZSBnaXZlbiBldmVudCwgYW5kIGlmIHN1Y2Nlc3NmdWwKICAgICAgICAgKiBjYWxscyBhbGwgdGhlIGNhbGxiYWNrcyBpbiB0aGUgcHJvdmlkZWQgY2FsbGJhY2tTZXQuCiAgICAgICAgICovCiAgICAgICAgTW91c2UucHJvdG90eXBlLl9tZWFzdXJlQW5kRGlzcGF0Y2ggPSBmdW5jdGlvbiAoY29tcG9uZW50LCBldmVudCwgZXZlbnROYW1lLCBzY29wZSkgewogICAgICAgICAgICBpZiAoc2NvcGUgPT09IHZvaWQgMCkgeyBzY29wZSA9ICJlbGVtZW50IjsgfQogICAgICAgICAgICBpZiAoc2NvcGUgIT09ICJwYWdlIiAmJiBzY29wZSAhPT0gImVsZW1lbnQiKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgc2NvcGUgJyIgKyBzY29wZSArICInLCBtdXN0IGJlICdlbGVtZW50JyBvciAncGFnZSciKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2NvcGUgPT09ICJwYWdlIiB8fCB0aGlzLmV2ZW50SW5zaWRlKGNvbXBvbmVudCwgZXZlbnQpKSB7CiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb24gPSB0aGlzLl90cmFuc2xhdG9yLmNvbXB1dGVQb3NpdGlvbihldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RNb3VzZVBvc2l0aW9uID0gcG9zaXRpb247CiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoZXZlbnROYW1lLCB0aGlzLmxhc3RNb3VzZVBvc2l0aW9uKCksIGV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTW91c2UucHJvdG90eXBlLmV2ZW50SW5zaWRlID0gZnVuY3Rpb24gKGNvbXBvbmVudCwgZXZlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuVHJhbnNsYXRvci5pc0V2ZW50SW5zaWRlKGNvbXBvbmVudCwgZXZlbnQpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgbGFzdCBjb21wdXRlZCBtb3VzZSBwb3NpdGlvbiBpbiA8c3ZnPiBjb29yZGluYXRlIHNwYWNlLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7UG9pbnR9CiAgICAgICAgICovCiAgICAgICAgTW91c2UucHJvdG90eXBlLmxhc3RNb3VzZVBvc2l0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFzdE1vdXNlUG9zaXRpb247CiAgICAgICAgfTsKICAgICAgICBNb3VzZS5fRElTUEFUQ0hFUl9LRVkgPSAiX19QbG90dGFibGVfRGlzcGF0Y2hlcl9Nb3VzZSI7CiAgICAgICAgTW91c2UuX01PVVNFT1ZFUl9FVkVOVF9OQU1FID0gIm1vdXNlb3ZlciI7CiAgICAgICAgTW91c2UuX01PVVNFTU9WRV9FVkVOVF9OQU1FID0gIm1vdXNlbW92ZSI7CiAgICAgICAgTW91c2UuX01PVVNFT1VUX0VWRU5UX05BTUUgPSAibW91c2VvdXQiOwogICAgICAgIE1vdXNlLl9NT1VTRURPV05fRVZFTlRfTkFNRSA9ICJtb3VzZWRvd24iOwogICAgICAgIE1vdXNlLl9NT1VTRVVQX0VWRU5UX05BTUUgPSAibW91c2V1cCI7CiAgICAgICAgTW91c2UuX1dIRUVMX0VWRU5UX05BTUUgPSAid2hlZWwiOwogICAgICAgIE1vdXNlLl9EQkxDTElDS19FVkVOVF9OQU1FID0gImRibGNsaWNrIjsKICAgICAgICByZXR1cm4gTW91c2U7CiAgICB9KGRpc3BhdGNoZXIuRGlzcGF0Y2hlcikpOwogICAgZXhwb3J0cy5Nb3VzZSA9IE1vdXNlOwogICAgfSk7CgogICAgdmFyIHRvdWNoRGlzcGF0Y2hlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIFRvdWNoID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoVG91Y2gsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIGludm9rZWQgZGlyZWN0bHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1NWR0VsZW1lbnR9IHN2ZyBUaGUgcm9vdCA8c3ZnPiB0byBhdHRhY2ggdG8uCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gVG91Y2goY29tcG9uZW50KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl90cmFuc2xhdG9yID0gdXRpbHMkMS5nZXRUcmFuc2xhdG9yKGNvbXBvbmVudCk7CiAgICAgICAgICAgIF90aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW1RvdWNoLl9UT1VDSFNUQVJUX0VWRU5UX05BTUVdID0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5fbWVhc3VyZUFuZERpc3BhdGNoKGNvbXBvbmVudCwgZSwgVG91Y2guX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSwgInBhZ2UiKTsgfTsKICAgICAgICAgICAgX3RoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bVG91Y2guX1RPVUNITU9WRV9FVkVOVF9OQU1FXSA9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMuX21lYXN1cmVBbmREaXNwYXRjaChjb21wb25lbnQsIGUsIFRvdWNoLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwgInBhZ2UiKTsgfTsKICAgICAgICAgICAgX3RoaXMuX2V2ZW50VG9Qcm9jZXNzaW5nRnVuY3Rpb25bVG91Y2guX1RPVUNIRU5EX0VWRU5UX05BTUVdID0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlKSB7IHJldHVybiBfdGhpcy5fbWVhc3VyZUFuZERpc3BhdGNoKGNvbXBvbmVudCwgZSwgVG91Y2guX1RPVUNIRU5EX0VWRU5UX05BTUUsICJwYWdlIik7IH07CiAgICAgICAgICAgIF90aGlzLl9ldmVudFRvUHJvY2Vzc2luZ0Z1bmN0aW9uW1RvdWNoLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FXSA9CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSkgeyByZXR1cm4gX3RoaXMuX21lYXN1cmVBbmREaXNwYXRjaChjb21wb25lbnQsIGUsIFRvdWNoLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLCAicGFnZSIpOyB9OwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYSBUb3VjaCBEaXNwYXRjaGVyIGZvciB0aGUgY29tcG9uZW50LgogICAgICAgICAqIElmIG9uZSBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhIG5ldyBvbmUgd2lsbCBiZSBjcmVhdGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNvbXBvbmVudAogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLlRvdWNofQogICAgICAgICAqLwogICAgICAgIFRvdWNoLmdldERpc3BhdGNoZXIgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIHZhciBzdmcgPSBjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCk7CiAgICAgICAgICAgIHZhciBkaXNwYXRjaGVyID0gc3ZnW1RvdWNoLl9ESVNQQVRDSEVSX0tFWV07CiAgICAgICAgICAgIGlmIChkaXNwYXRjaGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGRpc3BhdGNoZXIgPSBuZXcgVG91Y2goY29tcG9uZW50KTsKICAgICAgICAgICAgICAgIHN2Z1tUb3VjaC5fRElTUEFUQ0hFUl9LRVldID0gZGlzcGF0Y2hlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGlzcGF0Y2hlcjsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgdG91Y2ggc3RhcnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtUb3VjaENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLlRvdWNofSBUaGUgY2FsbGluZyBUb3VjaCBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIFRvdWNoLnByb3RvdHlwZS5vblRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChUb3VjaC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gYSB0b3VjaCBzdGFydHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1RvdWNoQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuVG91Y2h9IFRoZSBjYWxsaW5nIFRvdWNoIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgVG91Y2gucHJvdG90eXBlLm9mZlRvdWNoU3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ2FsbGJhY2tGb3JFdmVudChUb3VjaC5fVE9VQ0hTVEFSVF9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIHRvdWNoIHBvc2l0aW9uIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1RvdWNoQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuVG91Y2h9IFRoZSBjYWxsaW5nIFRvdWNoIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgVG91Y2gucHJvdG90eXBlLm9uVG91Y2hNb3ZlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZENhbGxiYWNrRm9yRXZlbnQoVG91Y2guX1RPVUNITU9WRV9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHRvdWNoIHBvc2l0aW9uIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1RvdWNoQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuVG91Y2h9IFRoZSBjYWxsaW5nIFRvdWNoIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgVG91Y2gucHJvdG90eXBlLm9mZlRvdWNoTW92ZSA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KFRvdWNoLl9UT1VDSE1PVkVfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGEgdG91Y2ggZW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7VG91Y2hDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtEaXNwYXRjaGVycy5Ub3VjaH0gVGhlIGNhbGxpbmcgVG91Y2ggRGlzcGF0Y2hlci4KICAgICAgICAgKi8KICAgICAgICBUb3VjaC5wcm90b3R5cGUub25Ub3VjaEVuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9hZGRDYWxsYmFja0ZvckV2ZW50KFRvdWNoLl9UT1VDSEVORF9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gYSB0b3VjaCBlbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtUb3VjaENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLlRvdWNofSBUaGUgY2FsbGluZyBUb3VjaCBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIFRvdWNoLnByb3RvdHlwZS5vZmZUb3VjaEVuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KFRvdWNoLl9UT1VDSEVORF9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYSB0b3VjaCBpcyBjYW5jZWxsZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1RvdWNoQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7RGlzcGF0Y2hlcnMuVG91Y2h9IFRoZSBjYWxsaW5nIFRvdWNoIERpc3BhdGNoZXIuCiAgICAgICAgICovCiAgICAgICAgVG91Y2gucHJvdG90eXBlLm9uVG91Y2hDYW5jZWwgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fYWRkQ2FsbGJhY2tGb3JFdmVudChUb3VjaC5fVE9VQ0hDQU5DRUxfRVZFTlRfTkFNRSwgY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIGEgdG91Y2ggaXMgY2FuY2VsbGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtUb3VjaENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0Rpc3BhdGNoZXJzLlRvdWNofSBUaGUgY2FsbGluZyBUb3VjaCBEaXNwYXRjaGVyLgogICAgICAgICAqLwogICAgICAgIFRvdWNoLnByb3RvdHlwZS5vZmZUb3VjaENhbmNlbCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVDYWxsYmFja0ZvckV2ZW50KFRvdWNoLl9UT1VDSENBTkNFTF9FVkVOVF9OQU1FLCBjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcHV0ZXMgdGhlIFRvdWNoIHBvc2l0aW9uIGZyb20gdGhlIGdpdmVuIGV2ZW50LCBhbmQgaWYgc3VjY2Vzc2Z1bAogICAgICAgICAqIGNhbGxzIGFsbCB0aGUgY2FsbGJhY2tzIGluIHRoZSBwcm92aWRlZCBjYWxsYmFja1NldC4KICAgICAgICAgKi8KICAgICAgICBUb3VjaC5wcm90b3R5cGUuX21lYXN1cmVBbmREaXNwYXRjaCA9IGZ1bmN0aW9uIChjb21wb25lbnQsIGV2ZW50LCBldmVudE5hbWUsIHNjb3BlKSB7CiAgICAgICAgICAgIGlmIChzY29wZSA9PT0gdm9pZCAwKSB7IHNjb3BlID0gImVsZW1lbnQiOyB9CiAgICAgICAgICAgIGlmIChzY29wZSAhPT0gInBhZ2UiICYmIHNjb3BlICE9PSAiZWxlbWVudCIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBzY29wZSAnIiArIHNjb3BlICsgIicsIG11c3QgYmUgJ2VsZW1lbnQnIG9yICdwYWdlJyIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzY29wZSA9PT0gImVsZW1lbnQiICYmICF0aGlzLmV2ZW50SW5zaWRlKGNvbXBvbmVudCwgZXZlbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlczsKICAgICAgICAgICAgdmFyIHRvdWNoUG9zaXRpb25zID0ge307CiAgICAgICAgICAgIHZhciB0b3VjaElkZW50aWZpZXJzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRvdWNoID0gdG91Y2hlc1tpXTsKICAgICAgICAgICAgICAgIHZhciB0b3VjaElEID0gdG91Y2guaWRlbnRpZmllcjsKICAgICAgICAgICAgICAgIHZhciBuZXdUb3VjaFBvc2l0aW9uID0gdGhpcy5fdHJhbnNsYXRvci5jb21wdXRlUG9zaXRpb24odG91Y2guY2xpZW50WCwgdG91Y2guY2xpZW50WSk7CiAgICAgICAgICAgICAgICBpZiAobmV3VG91Y2hQb3NpdGlvbiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdG91Y2hQb3NpdGlvbnNbdG91Y2hJRF0gPSBuZXdUb3VjaFBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIHRvdWNoSWRlbnRpZmllcnMucHVzaCh0b3VjaElEKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG91Y2hJZGVudGlmaWVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jYWxsQ2FsbGJhY2tzRm9yRXZlbnQoZXZlbnROYW1lLCB0b3VjaElkZW50aWZpZXJzLCB0b3VjaFBvc2l0aW9ucywgZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBUb3VjaC5wcm90b3R5cGUuZXZlbnRJbnNpZGUgPSBmdW5jdGlvbiAoY29tcG9uZW50LCBldmVudCkgewogICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5UcmFuc2xhdG9yLmlzRXZlbnRJbnNpZGUoY29tcG9uZW50LCBldmVudCk7CiAgICAgICAgfTsKICAgICAgICBUb3VjaC5fRElTUEFUQ0hFUl9LRVkgPSAiX19QbG90dGFibGVfRGlzcGF0Y2hlcl9Ub3VjaCI7CiAgICAgICAgVG91Y2guX1RPVUNIU1RBUlRfRVZFTlRfTkFNRSA9ICJ0b3VjaHN0YXJ0IjsKICAgICAgICBUb3VjaC5fVE9VQ0hNT1ZFX0VWRU5UX05BTUUgPSAidG91Y2htb3ZlIjsKICAgICAgICBUb3VjaC5fVE9VQ0hFTkRfRVZFTlRfTkFNRSA9ICJ0b3VjaGVuZCI7CiAgICAgICAgVG91Y2guX1RPVUNIQ0FOQ0VMX0VWRU5UX05BTUUgPSAidG91Y2hjYW5jZWwiOwogICAgICAgIHJldHVybiBUb3VjaDsKICAgIH0oZGlzcGF0Y2hlci5EaXNwYXRjaGVyKSk7CiAgICBleHBvcnRzLlRvdWNoID0gVG91Y2g7CiAgICB9KTsKCiAgICB2YXIgZGlzcGF0Y2hlcnMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGtleURpc3BhdGNoZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3Rhcihtb3VzZURpc3BhdGNoZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3Rhcih0b3VjaERpc3BhdGNoZXIsIGV4cG9ydHMpOwogICAgfSk7CgogICAgdmFyIGludGVyYWN0aW9uID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgSW50ZXJhY3Rpb24gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gSW50ZXJhY3Rpb24oKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX2FuY2hvckNhbGxiYWNrID0gZnVuY3Rpb24gKGNvbXBvbmVudCkgeyByZXR1cm4gX3RoaXMuX2FuY2hvcihjb21wb25lbnQpOyB9OwogICAgICAgICAgICB0aGlzLl9lbmFibGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhpcyBJbnRlcmFjdGlvbiB0byBhIENvbXBvbmVudC4KICAgICAgICAgKiBJZiB0aGUgSW50ZXJhY3Rpb24gd2FzIGFscmVhZHkgYXR0YWNoZWQgdG8gYSBDb21wb25lbnQsIGl0IGZpcnN0IGRldGFjaGVzIGl0c2VsZiBmcm9tIHRoZSBvbGQgQ29tcG9uZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDb21wb25lbnR9IGNvbXBvbmVudAogICAgICAgICAqIEByZXR1cm5zIHtJbnRlcmFjdGlvbn0gVGhlIGNhbGxpbmcgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgSW50ZXJhY3Rpb24ucHJvdG90eXBlLmF0dGFjaFRvID0gZnVuY3Rpb24gKGNvbXBvbmVudCkgewogICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8gPSBjb21wb25lbnQ7CiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3QoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCByZW5hbWVkIHRvIC5kZXRhY2goKS4KICAgICAgICAgKi8KICAgICAgICBJbnRlcmFjdGlvbi5wcm90b3R5cGUuZGV0YWNoRnJvbSA9IGZ1bmN0aW9uIChfY29tcG9uZW50KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRldGFjaCgpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0YWNoZXMgdGhpcyBJbnRlcmFjdGlvbiBmcm9tIHdoYXRldmVyIGNvbXBvbmVudCBpdCB3YXMgYXR0YWNoZWQgdG8uCiAgICAgICAgICogVGhpcyBJbnRlcmFjdGlvbiBjYW4gYmUgcmV1c2VkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybnMge0ludGVyYWN0aW9ufSBUaGUgY2FsbGluZyBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBJbnRlcmFjdGlvbi5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8gPSBudWxsOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEludGVyYWN0aW9uLnByb3RvdHlwZS5lbmFibGVkID0gZnVuY3Rpb24gKGVuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb25uZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNjb25uZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBJbnRlcmFjdGlvbi5wcm90b3R5cGUuX2FuY2hvciA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsKICAgICAgICAgICAgdGhpcy5faXNBbmNob3JlZCA9IHRydWU7CiAgICAgICAgfTsKICAgICAgICBJbnRlcmFjdGlvbi5wcm90b3R5cGUuX3VuYW5jaG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9pc0FuY2hvcmVkID0gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUcmFuc2xhdGVzIGFuIDxzdmc+LWNvb3JkaW5hdGUtc3BhY2UgcG9pbnQgdG8gQ29tcG9uZW50LXNwYWNlIGNvb3JkaW5hdGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQb2ludH0gcCBBIFBvaW50IGluIDxzdmc+LXNwYWNlIGNvb3JkaW5hdGVzLgogICAgICAgICAqIEByZXR1cm4ge1BvaW50fSBUaGUgc2FtZSBsb2NhdGlvbiBpbiBDb21wb25lbnQtc3BhY2UgY29vcmRpbmF0ZXMuCiAgICAgICAgICovCiAgICAgICAgSW50ZXJhY3Rpb24ucHJvdG90eXBlLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgdmFyIG9yaWdpbiA9IHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ub3JpZ2luVG9Sb290KCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiBwLnggLSBvcmlnaW4ueCwKICAgICAgICAgICAgICAgIHk6IHAueSAtIG9yaWdpbi55LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBDb21wb25lbnQtY29vcmRpbmF0ZS1zcGFjZSBQb2ludCBpcyBpbnNpZGUgdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UG9pbnR9IHAgQSBQb2ludCBpbiBDb21wb2VubnQtc3BhY2UgY29vcmRpbmF0ZXMuCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciBvciBub3QgdGhlIHBvaW50IGlzIGluc2lkZSB0aGUgQ29tcG9uZW50LgogICAgICAgICAqLwogICAgICAgIEludGVyYWN0aW9uLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQgPSBmdW5jdGlvbiAocCkgewogICAgICAgICAgICByZXR1cm4gMCA8PSBwLnggJiYgMCA8PSBwLnkKICAgICAgICAgICAgICAgICYmIHAueCA8PSB0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkKICAgICAgICAgICAgICAgICYmIHAueSA8PSB0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpOwogICAgICAgIH07CiAgICAgICAgSW50ZXJhY3Rpb24ucHJvdG90eXBlLl9jb25uZWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5lbmFibGVkKCkgJiYgdGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyAhPSBudWxsICYmICF0aGlzLl9pc0FuY2hvcmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9uQW5jaG9yKHRoaXMuX2FuY2hvckNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgSW50ZXJhY3Rpb24ucHJvdG90eXBlLl9kaXNjb25uZWN0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5faXNBbmNob3JlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fdW5hbmNob3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLm9mZkFuY2hvcih0aGlzLl9hbmNob3JDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBJbnRlcmFjdGlvbjsKICAgIH0oKSk7CiAgICBleHBvcnRzLkludGVyYWN0aW9uID0gSW50ZXJhY3Rpb247CiAgICB9KTsKCiAgICB2YXIgY2xpY2tJbnRlcmFjdGlvbiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIHZhciBDbGljayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKENsaWNrLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIENsaWNrKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX2NsaWNrZWREb3duID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLl9kb3VibGVDbGlja2luZyA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5fb25DbGlja0NhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9vbkRvdWJsZUNsaWNrQ2FsbGJhY2tzID0gbmV3IHV0aWxzJDEuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5vdGU6IHdlIGJpbmQgdG8gbW91c2Vkb3duLCBtb3VzZXVwLCB0b3VjaHN0YXJ0IGFuZCB0b3VjaGVuZCBiZWNhdXNlIGJyb3dzZXJzCiAgICAgICAgICAgICAqIGhhdmUgYSAzMDBtcyBkZWxheSBiZXR3ZWVuIHRvdWNoc3RhcnQgYW5kIGNsaWNrIHRvIGFsbG93IGZvciBzY3JvbGxpbmcgY2FuY2VsbGluZyBldGMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfdGhpcy5fbW91c2VEb3duQ2FsbGJhY2sgPSBmdW5jdGlvbiAocCwgZXZlbnQpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVDbGlja0Rvd24ocCwgZXZlbnQpOyB9OwogICAgICAgICAgICBfdGhpcy5fbW91c2VVcENhbGxiYWNrID0gZnVuY3Rpb24gKHAsIGV2ZW50KSB7IHJldHVybiBfdGhpcy5faGFuZGxlQ2xpY2tVcChwLCBldmVudCk7IH07CiAgICAgICAgICAgIF90aGlzLl9kYmxDbGlja0NhbGxiYWNrID0gZnVuY3Rpb24gKHAsIGV2ZW50KSB7IHJldHVybiBfdGhpcy5faGFuZGxlRGJsQ2xpY2socCwgZXZlbnQpOyB9OwogICAgICAgICAgICBfdGhpcy5fdG91Y2hTdGFydENhbGxiYWNrID0gZnVuY3Rpb24gKGlkcywgaWRUb1BvaW50LCBldmVudCkgeyByZXR1cm4gX3RoaXMuX2hhbmRsZUNsaWNrRG93bihpZFRvUG9pbnRbaWRzWzBdXSwgZXZlbnQpOyB9OwogICAgICAgICAgICBfdGhpcy5fdG91Y2hFbmRDYWxsYmFjayA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZXZlbnQpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVDbGlja1VwKGlkVG9Qb2ludFtpZHNbMF1dLCBldmVudCk7IH07CiAgICAgICAgICAgIF90aGlzLl90b3VjaENhbmNlbENhbGxiYWNrID0gZnVuY3Rpb24gKGlkcywgaWRUb1BvaW50KSB7IHJldHVybiBfdGhpcy5fY2xpY2tlZERvd24gPSBmYWxzZTsgfTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBDbGljay5wcm90b3R5cGUuX2FuY2hvciA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcywgY29tcG9uZW50KTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcihjb21wb25lbnQpOwogICAgICAgICAgICB0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZURvd24odGhpcy5fbW91c2VEb3duQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9tb3VzZURpc3BhdGNoZXIub25Nb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbkRibENsaWNrKHRoaXMuX2RibENsaWNrQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIgPSBkaXNwYXRjaGVycy5Ub3VjaC5nZXREaXNwYXRjaGVyKGNvbXBvbmVudCk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgQ2xpY2sucHJvdG90eXBlLl91bmFuY2hvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlRG93bih0aGlzLl9tb3VzZURvd25DYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZEYmxDbGljayh0aGlzLl9kYmxDbGlja0NhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlciA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBDbGljay5wcm90b3R5cGUuX2hhbmRsZUNsaWNrRG93biA9IGZ1bmN0aW9uIChwLCBldmVudCkgewogICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFAgPSB0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHApOwogICAgICAgICAgICBpZiAodGhpcy5faXNJbnNpZGVDb21wb25lbnQodHJhbnNsYXRlZFApKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja2VkRG93biA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9jbGlja2VkUG9pbnQgPSB0cmFuc2xhdGVkUDsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgQ2xpY2sucHJvdG90eXBlLl9oYW5kbGVDbGlja1VwID0gZnVuY3Rpb24gKHAsIGV2ZW50KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUCA9IHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UocCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9jbGlja2VkRG93biAmJiBDbGljay5fcG9pbnRzRXF1YWwodHJhbnNsYXRlZFAsIHRoaXMuX2NsaWNrZWRQb2ludCkpIHsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX2RvdWJsZUNsaWNraW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModHJhbnNsYXRlZFAsIGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jbGlja2VkRG93biA9IGZhbHNlOwogICAgICAgIH07CiAgICAgICAgQ2xpY2sucHJvdG90eXBlLl9oYW5kbGVEYmxDbGljayA9IGZ1bmN0aW9uIChwLCBldmVudCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgdHJhbnNsYXRlZFAgPSB0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKHApOwogICAgICAgICAgICB0aGlzLl9kb3VibGVDbGlja2luZyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0cmFuc2xhdGVkUCwgZXZlbnQpOwogICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9kb3VibGVDbGlja2luZyA9IGZhbHNlOyB9LCAwKTsKICAgICAgICB9OwogICAgICAgIENsaWNrLl9wb2ludHNFcXVhbCA9IGZ1bmN0aW9uIChwMSwgcDIpIHsKICAgICAgICAgICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgQ29tcG9uZW50IGlzIGNsaWNrZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0NsaWNrQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7SW50ZXJhY3Rpb25zLkNsaWNrfSBUaGUgY2FsbGluZyBDbGljayBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBDbGljay5wcm90b3R5cGUub25DbGljayA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9vbkNsaWNrQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gdGhlIENvbXBvbmVudCBpcyBjbGlja2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDbGlja0NhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0ludGVyYWN0aW9ucy5DbGlja30gVGhlIGNhbGxpbmcgQ2xpY2sgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgQ2xpY2sucHJvdG90eXBlLm9mZkNsaWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX29uQ2xpY2tDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIENvbXBvbmVudCBpcyBkb3VibGUtY2xpY2tlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q2xpY2tDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtJbnRlcmFjdGlvbnMuQ2xpY2t9IFRoZSBjYWxsaW5nIENsaWNrIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIENsaWNrLnByb3RvdHlwZS5vbkRvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgQ29tcG9uZW50IGlzIGRvdWJsZS1jbGlja2VkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtDbGlja0NhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0ludGVyYWN0aW9ucy5DbGlja30gVGhlIGNhbGxpbmcgQ2xpY2sgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgQ2xpY2sucHJvdG90eXBlLm9mZkRvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX29uRG91YmxlQ2xpY2tDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQ2xpY2s7CiAgICB9KGludGVyYWN0aW9uLkludGVyYWN0aW9uKSk7CiAgICBleHBvcnRzLkNsaWNrID0gQ2xpY2s7CiAgICB9KTsKCiAgICB2YXIgZHJhZ0ludGVyYWN0aW9uID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgogICAgdmFyIERyYWcgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhEcmFnLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIERyYWcobW91c2VCdXR0b24pIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX2RyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50ID0gdHJ1ZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE9ubHkgZW1pdCBldmVudHMgd2hlbiB0aGUgbW91c2VGaWx0ZXIgaXMgdHJ1ZSBmb3IgdGhlIHNvdXJjZSBtb3VzZQogICAgICAgICAgICAgKiBldmVudHMuIFVzZSB0aGlzIHRvIGRlZmluZSBjdXN0b20gZmlsdGVycyAoZS5nLiBvbmx5IHJpZ2h0IGNsaWNrLAogICAgICAgICAgICAgKiByZXF1aXJlIHNoaWZ0IHRvIGJlIGhlbGQgZG93biwgZXRjLikKICAgICAgICAgICAgICovCiAgICAgICAgICAgIF90aGlzLl9tb3VzZUZpbHRlciA9IERyYWcuX0RFRkFVTFRfTU9VU0VfRklMVEVSOwogICAgICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzID0gbmV3IHV0aWxzJDEuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgX3RoaXMuX2RyYWdDYWxsYmFja3MgPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICBfdGhpcy5fZHJhZ0VuZENhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9tb3VzZURvd25DYWxsYmFjayA9IGZ1bmN0aW9uIChwLCBlKSB7IHJldHVybiBfdGhpcy5fc3RhcnREcmFnKHAsIGUpOyB9OwogICAgICAgICAgICBfdGhpcy5fbW91c2VNb3ZlQ2FsbGJhY2sgPSBmdW5jdGlvbiAocCwgZSkgeyByZXR1cm4gX3RoaXMuX2RvRHJhZyhwLCBlKTsgfTsKICAgICAgICAgICAgX3RoaXMuX21vdXNlVXBDYWxsYmFjayA9IGZ1bmN0aW9uIChwLCBlKSB7IHJldHVybiBfdGhpcy5fZW5kRHJhZyhwLCBlKTsgfTsKICAgICAgICAgICAgX3RoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgeyByZXR1cm4gX3RoaXMuX3N0YXJ0RHJhZyhpZFRvUG9pbnRbaWRzWzBdXSwgZSk7IH07CiAgICAgICAgICAgIF90aGlzLl90b3VjaE1vdmVDYWxsYmFjayA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgeyByZXR1cm4gX3RoaXMuX2RvRHJhZyhpZFRvUG9pbnRbaWRzWzBdXSwgZSk7IH07CiAgICAgICAgICAgIF90aGlzLl90b3VjaEVuZENhbGxiYWNrID0gZnVuY3Rpb24gKGlkcywgaWRUb1BvaW50LCBlKSB7IHJldHVybiBfdGhpcy5fZW5kRHJhZyhpZFRvUG9pbnRbaWRzWzBdXSwgZSk7IH07CiAgICAgICAgICAgIF90aGlzLl9tb3VzZUJ1dHRvbiA9IG1vdXNlQnV0dG9uICE9PSB1bmRlZmluZWQgPyBtb3VzZUJ1dHRvbiA6IDA7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgRHJhZy5wcm90b3R5cGUuX2FuY2hvciA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fYW5jaG9yLmNhbGwodGhpcywgY29tcG9uZW50KTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKHRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VVcCh0aGlzLl9tb3VzZVVwQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIgPSBkaXNwYXRjaGVycy5Ub3VjaC5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoRW5kKHRoaXMuX3RvdWNoRW5kQ2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgRHJhZy5wcm90b3R5cGUuX3VuYW5jaG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl91bmFuY2hvci5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9tb3VzZURpc3BhdGNoZXIub2ZmTW91c2VEb3duKHRoaXMuX21vdXNlRG93bkNhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZNb3VzZVVwKHRoaXMuX21vdXNlVXBDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIub2ZmVG91Y2hFbmQodGhpcy5fdG91Y2hFbmRDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlciA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBEcmFnLnByb3RvdHlwZS5fdHJhbnNsYXRlQW5kQ29uc3RyYWluID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZWRQID0gdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShwKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlZFA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6IHV0aWxzJDEuTWF0aC5jbGFtcCh0cmFuc2xhdGVkUC54LCAwLCB0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLndpZHRoKCkpLAogICAgICAgICAgICAgICAgeTogdXRpbHMkMS5NYXRoLmNsYW1wKHRyYW5zbGF0ZWRQLnksIDAsIHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8uaGVpZ2h0KCkpLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgRHJhZy5wcm90b3R5cGUuX3N0YXJ0RHJhZyA9IGZ1bmN0aW9uIChwb2ludCwgZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgTW91c2VFdmVudCAmJiAhdGhpcy5fbW91c2VGaWx0ZXIoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZWRQID0gdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShwb2ludCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0cmFuc2xhdGVkUCkpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnT3JpZ2luID0gdHJhbnNsYXRlZFA7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuY2FsbENhbGxiYWNrcyh0aGlzLl9kcmFnT3JpZ2luKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgRHJhZy5wcm90b3R5cGUuX2RvRHJhZyA9IGZ1bmN0aW9uIChwb2ludCwgZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2RyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbiwgdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKHBvaW50KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIERyYWcucHJvdG90eXBlLl9lbmREcmFnID0gZnVuY3Rpb24gKHBvaW50LCBldmVudCkgewogICAgICAgICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBNb3VzZUV2ZW50ICYmIGV2ZW50LmJ1dHRvbiAhPT0gdGhpcy5fbW91c2VCdXR0b24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZHJhZ2dpbmcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcy5fZHJhZ09yaWdpbiwgdGhpcy5fdHJhbnNsYXRlQW5kQ29uc3RyYWluKHBvaW50KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIERyYWcucHJvdG90eXBlLmNvbnN0cmFpbmVkVG9Db21wb25lbnQgPSBmdW5jdGlvbiAoY29uc3RyYWluZWRUb0NvbXBvbmVudCkgewogICAgICAgICAgICBpZiAoY29uc3RyYWluZWRUb0NvbXBvbmVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29uc3RyYWluZWRUb0NvbXBvbmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jb25zdHJhaW5lZFRvQ29tcG9uZW50ID0gY29uc3RyYWluZWRUb0NvbXBvbmVudDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBEcmFnLnByb3RvdHlwZS5tb3VzZUZpbHRlciA9IGZ1bmN0aW9uIChmaWx0ZXIpIHsKICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tb3VzZUZpbHRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tb3VzZUZpbHRlciA9IGZpbHRlcjsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0RyYWd9IFRoZSBjYWxsaW5nIERyYWcgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgRHJhZy5wcm90b3R5cGUub25EcmFnU3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0RyYWd9IFRoZSBjYWxsaW5nIERyYWcgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgRHJhZy5wcm90b3R5cGUub2ZmRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgZHVyaW5nIGRyYWdnaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0RyYWd9IFRoZSBjYWxsaW5nIERyYWcgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgRHJhZy5wcm90b3R5cGUub25EcmFnID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgZHVyaW5nIGRyYWdnaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0RyYWd9IFRoZSBjYWxsaW5nIERyYWcgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgRHJhZy5wcm90b3R5cGUub2ZmRHJhZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGVuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RyYWdDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RHJhZ30gVGhlIGNhbGxpbmcgRHJhZyBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBEcmFnLnByb3RvdHlwZS5vbkRyYWdFbmQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGVuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RyYWdDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RHJhZ30gVGhlIGNhbGxpbmcgRHJhZyBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBEcmFnLnByb3RvdHlwZS5vZmZEcmFnRW5kID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBEcmFnLl9ERUZBVUxUX01PVVNFX0ZJTFRFUiA9IGZ1bmN0aW9uIChldmVudCkgeyByZXR1cm4gZXZlbnQuYnV0dG9uID09PSAwOyB9OwogICAgICAgIHJldHVybiBEcmFnOwogICAgfShpbnRlcmFjdGlvbi5JbnRlcmFjdGlvbikpOwogICAgZXhwb3J0cy5EcmFnID0gRHJhZzsKICAgIH0pOwoKICAgIHZhciBrZXlJbnRlcmFjdGlvbiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIHZhciBLZXkgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhLZXksIF9zdXBlcik7CiAgICAgICAgZnVuY3Rpb24gS2V5KCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX2tleVByZXNzQ2FsbGJhY2tzID0ge307CiAgICAgICAgICAgIF90aGlzLl9rZXlSZWxlYXNlQ2FsbGJhY2tzID0ge307CiAgICAgICAgICAgIF90aGlzLl9tb3VzZU1vdmVDYWxsYmFjayA9IGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4gZmFsc2U7IH07IC8vIEhBQ0tIQUNLOiByZWdpc3RlcmluZyBhIGxpc3RlbmVyCiAgICAgICAgICAgIF90aGlzLl9kb3duZWRLZXlzID0gbmV3IHV0aWxzJDEuU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9rZXlEb3duQ2FsbGJhY2sgPSBmdW5jdGlvbiAoa2V5Q29kZSwgZXZlbnQpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVLZXlEb3duRXZlbnQoa2V5Q29kZSwgZXZlbnQpOyB9OwogICAgICAgICAgICBfdGhpcy5fa2V5VXBDYWxsYmFjayA9IGZ1bmN0aW9uIChrZXlDb2RlKSB7IHJldHVybiBfdGhpcy5faGFuZGxlS2V5VXBFdmVudChrZXlDb2RlKTsgfTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBLZXkucHJvdG90eXBlLl9hbmNob3IgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsIGNvbXBvbmVudCk7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJzLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX2tleURpc3BhdGNoZXIgPSBkaXNwYXRjaGVycy5LZXkuZ2V0RGlzcGF0Y2hlcigpOwogICAgICAgICAgICB0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9rZXlEaXNwYXRjaGVyLm9uS2V5VXAodGhpcy5fa2V5VXBDYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICBLZXkucHJvdG90eXBlLl91bmFuY2hvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uRGlzcGF0Y2hlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2tleURpc3BhdGNoZXIub2ZmS2V5RG93bih0aGlzLl9rZXlEb3duQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9rZXlEaXNwYXRjaGVyLm9mZktleVVwKHRoaXMuX2tleVVwQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9rZXlEaXNwYXRjaGVyID0gbnVsbDsKICAgICAgICB9OwogICAgICAgIEtleS5wcm90b3R5cGUuX2hhbmRsZUtleURvd25FdmVudCA9IGZ1bmN0aW9uIChrZXlDb2RlLCBldmVudCkgewogICAgICAgICAgICB2YXIgcCA9IHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UodGhpcy5fcG9zaXRpb25EaXNwYXRjaGVyLmxhc3RNb3VzZVBvc2l0aW9uKCkpOwogICAgICAgICAgICBpZiAodGhpcy5faXNJbnNpZGVDb21wb25lbnQocCkgJiYgIWV2ZW50LnJlcGVhdCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW2tleUNvZGVdKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nba2V5Q29kZV0uY2FsbENhbGxiYWNrcyhrZXlDb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2Rvd25lZEtleXMuYWRkKGtleUNvZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBLZXkucHJvdG90eXBlLl9oYW5kbGVLZXlVcEV2ZW50ID0gZnVuY3Rpb24gKGtleUNvZGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2Rvd25lZEtleXMuaGFzKGtleUNvZGUpICYmIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nba2V5Q29kZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2tleVJlbGVhc2VDYWxsYmFja3Nba2V5Q29kZV0uY2FsbENhbGxiYWNrcyhrZXlDb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kb3duZWRLZXlzLmRlbGV0ZShrZXlDb2RlKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUga2V5IHdpdGggdGhlIGdpdmVuIGtleUNvZGUgaXMKICAgICAgICAgKiBwcmVzc2VkIGFuZCB0aGUgdXNlciBpcyBtb3VzZWQgb3ZlciB0aGUgQ29tcG9uZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGtleUNvZGUKICAgICAgICAgKiBAcGFyYW0ge0tleUNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtJbnRlcmFjdGlvbnMuS2V5fSBUaGUgY2FsbGluZyBLZXkgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgS2V5LnByb3RvdHlwZS5vbktleVByZXNzID0gZnVuY3Rpb24gKGtleUNvZGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nba2V5Q29kZV0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW2tleUNvZGVdID0gbmV3IHV0aWxzJDEuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1trZXlDb2RlXS5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBrZXkgd2l0aCB0aGUgZ2l2ZW4ga2V5Q29kZSBpcwogICAgICAgICAqIHByZXNzZWQgYW5kIHRoZSB1c2VyIGlzIG1vdXNlZCBvdmVyIHRoZSBDb21wb25lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5Q29kZQogICAgICAgICAqIEBwYXJhbSB7S2V5Q2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0ludGVyYWN0aW9ucy5LZXl9IFRoZSBjYWxsaW5nIEtleSBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBLZXkucHJvdG90eXBlLm9mZktleVByZXNzID0gZnVuY3Rpb24gKGtleUNvZGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2tleVByZXNzQ2FsbGJhY2tzW2tleUNvZGVdLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIGlmICh0aGlzLl9rZXlQcmVzc0NhbGxiYWNrc1trZXlDb2RlXS5zaXplID09PSAwKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fa2V5UHJlc3NDYWxsYmFja3Nba2V5Q29kZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGtleSB3aXRoIHRoZSBnaXZlbiBrZXlDb2RlIGlzCiAgICAgICAgICogcmVsZWFzZWQgaWYgdGhlIGtleSB3YXMgcHJlc3NlZCB3aXRoIHRoZSBtb3VzZSBpbnNpZGUgb2YgdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBrZXlDb2RlCiAgICAgICAgICogQHBhcmFtIHtLZXlDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7SW50ZXJhY3Rpb25zLktleX0gVGhlIGNhbGxpbmcgS2V5IEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIEtleS5wcm90b3R5cGUub25LZXlSZWxlYXNlID0gZnVuY3Rpb24gKGtleUNvZGUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1trZXlDb2RlXSkgewogICAgICAgICAgICAgICAgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1trZXlDb2RlXSA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1trZXlDb2RlXS5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBrZXkgd2l0aCB0aGUgZ2l2ZW4ga2V5Q29kZSBpcwogICAgICAgICAqIHJlbGVhc2VkIGlmIHRoZSBrZXkgd2FzIHByZXNzZWQgd2l0aCB0aGUgbW91c2UgaW5zaWRlIG9mIHRoZSBDb21wb25lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0ga2V5Q29kZQogICAgICAgICAqIEBwYXJhbSB7S2V5Q2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0ludGVyYWN0aW9ucy5LZXl9IFRoZSBjYWxsaW5nIEtleSBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBLZXkucHJvdG90eXBlLm9mZktleVJlbGVhc2UgPSBmdW5jdGlvbiAoa2V5Q29kZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1trZXlDb2RlXS5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICBpZiAodGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1trZXlDb2RlXS5zaXplID09PSAwKSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fa2V5UmVsZWFzZUNhbGxiYWNrc1trZXlDb2RlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHJldHVybiBLZXk7CiAgICB9KGludGVyYWN0aW9uLkludGVyYWN0aW9uKSk7CiAgICBleHBvcnRzLktleSA9IEtleTsKICAgIH0pOwoKICAgIHZhciBwYW5ab29tSW50ZXJhY3Rpb24gPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgoKCgogICAgdmFyIFBhblpvb20gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhQYW5ab29tLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEEgUGFuWm9vbSBJbnRlcmFjdGlvbiB1cGRhdGVzIHRoZSBkb21haW5zIG9mIGFuIHgtc2NhbGUgYW5kL29yIGEgeS1zY2FsZQogICAgICAgICAqIGluIHJlc3BvbnNlIHRvIHRoZSB1c2VyIHBhbm5pbmcgb3Igem9vbWluZy4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7VHJhbnNmb3JtYWJsZVNjYWxlfSBbeFNjYWxlXSBUaGUgeC1zY2FsZSB0byB1cGRhdGUgb24gcGFubmluZy96b29taW5nLgogICAgICAgICAqIEBwYXJhbSB7VHJhbnNmb3JtYWJsZVNjYWxlfSBbeVNjYWxlXSBUaGUgeS1zY2FsZSB0byB1cGRhdGUgb24gcGFubmluZy96b29taW5nLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFBhblpvb20oeFNjYWxlLCB5U2NhbGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX3doZWVsRmlsdGVyID0gZnVuY3Rpb24gKGUpIHsgcmV0dXJuIHRydWU7IH07CiAgICAgICAgICAgIF90aGlzLl93aGVlbENhbGxiYWNrID0gZnVuY3Rpb24gKHAsIGUpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVXaGVlbEV2ZW50KHAsIGUpOyB9OwogICAgICAgICAgICBfdGhpcy5fdG91Y2hTdGFydENhbGxiYWNrID0gZnVuY3Rpb24gKGlkcywgaWRUb1BvaW50LCBlKSB7IHJldHVybiBfdGhpcy5faGFuZGxlVG91Y2hTdGFydChpZHMsIGlkVG9Qb2ludCwgZSk7IH07CiAgICAgICAgICAgIF90aGlzLl90b3VjaE1vdmVDYWxsYmFjayA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgeyByZXR1cm4gX3RoaXMuX2hhbmRsZVBpbmNoKGlkcywgaWRUb1BvaW50LCBlKTsgfTsKICAgICAgICAgICAgX3RoaXMuX3RvdWNoRW5kQ2FsbGJhY2sgPSBmdW5jdGlvbiAoaWRzLCBpZFRvUG9pbnQsIGUpIHsgcmV0dXJuIF90aGlzLl9oYW5kbGVUb3VjaEVuZChpZHMsIGlkVG9Qb2ludCwgZSk7IH07CiAgICAgICAgICAgIF90aGlzLl90b3VjaENhbmNlbENhbGxiYWNrID0gZnVuY3Rpb24gKGlkcywgaWRUb1BvaW50LCBlKSB7IHJldHVybiBfdGhpcy5faGFuZGxlVG91Y2hFbmQoaWRzLCBpZFRvUG9pbnQsIGUpOyB9OwogICAgICAgICAgICBfdGhpcy5fcGFuRW5kQ2FsbGJhY2tzID0gbmV3IHV0aWxzJDEuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgX3RoaXMuX3pvb21FbmRDYWxsYmFja3MgPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICBfdGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl94U2NhbGVzID0gbmV3IHV0aWxzJDEuU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl95U2NhbGVzID0gbmV3IHV0aWxzJDEuU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9kcmFnSW50ZXJhY3Rpb24gPSBuZXcgaW50ZXJhY3Rpb25zLkRyYWcoKTsKICAgICAgICAgICAgX3RoaXMuX3NldHVwRHJhZ0ludGVyYWN0aW9uKCk7CiAgICAgICAgICAgIF90aGlzLl90b3VjaElkcyA9IGQzLm1hcCgpOwogICAgICAgICAgICBfdGhpcy5fbWluRG9tYWluRXh0ZW50cyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgICAgICBfdGhpcy5fbWF4RG9tYWluRXh0ZW50cyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgICAgICBfdGhpcy5fbWluRG9tYWluVmFsdWVzID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIF90aGlzLl9tYXhEb21haW5WYWx1ZXMgPSBuZXcgdXRpbHMkMS5NYXAoKTsKICAgICAgICAgICAgaWYgKHhTY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5hZGRYU2NhbGUoeFNjYWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoeVNjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIF90aGlzLmFkZFlTY2FsZSh5U2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBiYWNraW5nIGRyYWcgaW50ZXJhY3Rpb24uIFVzZWZ1bCB0byBjdXN0b21pemUgdGhlIHBhbnpvb20gaW50ZXJhY3Rpb24uCiAgICAgICAgICogQHJldHVybnMge0RyYWd9CiAgICAgICAgICovCiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uOwogICAgICAgIH07CiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUud2hlZWxGaWx0ZXIgPSBmdW5jdGlvbiAoZmlsdGVyKSB7CiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fd2hlZWxGaWx0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fd2hlZWxGaWx0ZXIgPSBmaWx0ZXI7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUGFucyB0aGUgY2hhcnQgYnkgYSBzcGVjaWZpZWQgYW1vdW50CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1Bsb3R0YWJsZS5Qb2ludH0gW3RyYW5zbGF0ZUFtb3VudF0gVGhlIGFtb3VudCBieSB3aGljaCB0byB0cmFuc2xhdGUgdGhlIHggYW5kIHkgc2NhbGVzLgogICAgICAgICAqLwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLnBhbiA9IGZ1bmN0aW9uICh0cmFuc2xhdGVBbW91bnQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoeFNjYWxlKSB7CiAgICAgICAgICAgICAgICB4U2NhbGUucGFuKF90aGlzLl9jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHhTY2FsZSwgdHJhbnNsYXRlQW1vdW50LngpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24gKHlTY2FsZSkgewogICAgICAgICAgICAgICAgeVNjYWxlLnBhbihfdGhpcy5fY29uc3RyYWluZWRUcmFuc2xhdGlvbih5U2NhbGUsIHRyYW5zbGF0ZUFtb3VudC55KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9wYW5ab29tVXBkYXRlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFpvb21zIHRoZSBjaGFydCBieSBhIHNwZWNpZmllZCBhbW91bnQgYXJvdW5kIGEgc3BlY2lmaWMgcG9pbnQKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbem9vbUFtb3VudF0gVGhlIHBlcmNlbnRhZ2UgYnkgd2hpY2ggdG8gem9vbSB0aGUgeCBhbmQgeSBzY2FsZS4KICAgICAgICAgKiBBIHZhbHVlIG9mIDAuOSB6b29tcyBpbiBieSAxMCUuIEEgdmFsdWUgb2YgMS4xIHpvb21zIG91dCBieSAxMCUuIEEgdmFsdWUgb2YgMSBoYXMKICAgICAgICAgKiBubyBlZmZlY3QuCiAgICAgICAgICogQHBhcmFtIHtQbG90dGFibGUuUG9pbnR9IFtjZW50ZXJWYWx1ZV0gVGhlIGNlbnRlciBpbiBwaXhlbHMgYXJvdW5kIHdoaWNoIHRvIHpvb20uCiAgICAgICAgICogQnkgZGVmYXVsdCwgYGNlbnRlclZhbHVlYCBpcyB0aGUgY2VudGVyIG9mIHRoZSB4IGFuZCB5IHJhbmdlIG9mIGVhY2ggc2NhbGUuCiAgICAgICAgICogQHBhcmFtIHtib29sZWFufSBbY29uc3RyYWluZWRdIFdoZXRoZXIgdG8gcmVzcGVjdCB0aGUgem9vbSBleHRlbnRzIGFuZCBtaW4vbWF4CiAgICAgICAgICogdmFsdWVzLiBEZWZhdWx0IHRydWUuCiAgICAgICAgICovCiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUuem9vbSA9IGZ1bmN0aW9uICh6b29tQW1vdW50LCBjZW50ZXJWYWx1ZSwgY29uc3RyYWluZWQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKGNvbnN0cmFpbmVkID09PSB2b2lkIDApIHsgY29uc3RyYWluZWQgPSB0cnVlOyB9CiAgICAgICAgICAgIHZhciBjZW50ZXJYOwogICAgICAgICAgICB2YXIgY2VudGVyWTsKICAgICAgICAgICAgaWYgKGNlbnRlclZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGNlbnRlclggPSBjZW50ZXJWYWx1ZS54OwogICAgICAgICAgICAgICAgY2VudGVyWSA9IGNlbnRlclZhbHVlLnk7CiAgICAgICAgICAgICAgICBpZiAoY29uc3RyYWluZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnhTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uICh4U2NhbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnN0cmFpbmVkID0gX3RoaXMuX2NvbnN0cmFpbmVkWm9vbSh4U2NhbGUsIHpvb21BbW91bnQsIGNlbnRlclgpOwogICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJYID0gY29uc3RyYWluZWQuY2VudGVyUG9pbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHpvb21BbW91bnQgPSBjb25zdHJhaW5lZC56b29tQW1vdW50OwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMueVNjYWxlcygpLmZvckVhY2goZnVuY3Rpb24gKHlTY2FsZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29uc3RyYWluZWQgPSBfdGhpcy5fY29uc3RyYWluZWRab29tKHlTY2FsZSwgem9vbUFtb3VudCwgY2VudGVyWSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclkgPSBjb25zdHJhaW5lZC5jZW50ZXJQb2ludDsKICAgICAgICAgICAgICAgICAgICAgICAgem9vbUFtb3VudCA9IGNvbnN0cmFpbmVkLnpvb21BbW91bnQ7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy54U2NhbGVzKCkuZm9yRWFjaChmdW5jdGlvbiAoeFNjYWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgcmFuZ2UgPSB4U2NhbGUucmFuZ2UoKTsKICAgICAgICAgICAgICAgIHZhciB4Q2VudGVyID0gY2VudGVyWCA9PSBudWxsCiAgICAgICAgICAgICAgICAgICAgPyAocmFuZ2VbMV0gKyByYW5nZVswXSkgLyAyCiAgICAgICAgICAgICAgICAgICAgOiBjZW50ZXJYOwogICAgICAgICAgICAgICAgeFNjYWxlLnpvb20oem9vbUFtb3VudCwgeENlbnRlcik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnlTY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uICh5U2NhbGUpIHsKICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHlTY2FsZS5yYW5nZSgpOwogICAgICAgICAgICAgICAgdmFyIHlDZW50ZXIgPSBjZW50ZXJZID09IG51bGwKICAgICAgICAgICAgICAgICAgICA/IChyYW5nZVsxXSArIHJhbmdlWzBdKSAvIDIKICAgICAgICAgICAgICAgICAgICA6IGNlbnRlclk7CiAgICAgICAgICAgICAgICB5U2NhbGUuem9vbSh6b29tQW1vdW50LCB5Q2VudGVyKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpOwogICAgICAgICAgICByZXR1cm4geyB6b29tQW1vdW50OiB6b29tQW1vdW50LCBjZW50ZXJWYWx1ZTogeyBjZW50ZXJYOiBjZW50ZXJYLCBjZW50ZXJZOiBjZW50ZXJZIH0gfTsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9hbmNob3IgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsIGNvbXBvbmVudCk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhjb21wb25lbnQpOwogICAgICAgICAgICB0aGlzLl9tb3VzZURpc3BhdGNoZXIgPSBkaXNwYXRjaGVycy5Nb3VzZS5nZXREaXNwYXRjaGVyKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8pOwogICAgICAgICAgICB0aGlzLl9tb3VzZURpc3BhdGNoZXIub25XaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyID0gZGlzcGF0Y2hlcnMuVG91Y2guZ2V0RGlzcGF0Y2hlcih0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hTdGFydCh0aGlzLl90b3VjaFN0YXJ0Q2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaE1vdmUodGhpcy5fdG91Y2hNb3ZlQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIub25Ub3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9uVG91Y2hDYW5jZWwodGhpcy5fdG91Y2hDYW5jZWxDYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5fdW5hbmNob3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3VuYW5jaG9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbCh0aGlzLl93aGVlbENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoTW92ZSh0aGlzLl90b3VjaE1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaEVuZCh0aGlzLl90b3VjaEVuZENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fdG91Y2hEaXNwYXRjaGVyLm9mZlRvdWNoQ2FuY2VsKHRoaXMuX3RvdWNoQ2FuY2VsQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl90b3VjaERpc3BhdGNoZXIgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7CiAgICAgICAgfTsKICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5faGFuZGxlVG91Y2hTdGFydCA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgewogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGlkcy5sZW5ndGggJiYgdGhpcy5fdG91Y2hJZHMuc2l6ZSgpIDwgMjsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgaWQgPSBpZHNbaV07CiAgICAgICAgICAgICAgICB0aGlzLl90b3VjaElkcy5zZXQoaWQudG9TdHJpbmcoKSwgdGhpcy5fdHJhbnNsYXRlVG9Db21wb25lbnRTcGFjZShpZFRvUG9pbnRbaWRdKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9oYW5kbGVQaW5jaCA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy5fdG91Y2hJZHMuc2l6ZSgpIDwgMikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBvbGRQb2ludHMgPSB0aGlzLl90b3VjaElkcy52YWx1ZXMoKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG9sZFBvaW50c1swXSkpIHx8ICF0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKG9sZFBvaW50c1sxXSkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIG9sZENvcm5lckRpc3RhbmNlID0gUGFuWm9vbS5fcG9pbnREaXN0YW5jZShvbGRQb2ludHNbMF0sIG9sZFBvaW50c1sxXSk7CiAgICAgICAgICAgIGlmIChvbGRDb3JuZXJEaXN0YW5jZSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlkcy5mb3JFYWNoKGZ1bmN0aW9uIChpZCkgewogICAgICAgICAgICAgICAgaWYgKF90aGlzLl90b3VjaElkcy5oYXMoaWQudG9TdHJpbmcoKSkpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fdG91Y2hJZHMuc2V0KGlkLnRvU3RyaW5nKCksIF90aGlzLl90cmFuc2xhdGVUb0NvbXBvbmVudFNwYWNlKGlkVG9Qb2ludFtpZF0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBwb2ludHMgPSB0aGlzLl90b3VjaElkcy52YWx1ZXMoKTsKICAgICAgICAgICAgdmFyIG5ld0Nvcm5lckRpc3RhbmNlID0gUGFuWm9vbS5fcG9pbnREaXN0YW5jZShwb2ludHNbMF0sIHBvaW50c1sxXSk7CiAgICAgICAgICAgIGlmIChuZXdDb3JuZXJEaXN0YW5jZSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpbml0TWFnbmlmeUFtb3VudCA9IG9sZENvcm5lckRpc3RhbmNlIC8gbmV3Q29ybmVyRGlzdGFuY2U7CiAgICAgICAgICAgIHZhciBub3JtYWxpemVkUG9pbnREaWZmcyA9IHBvaW50cy5tYXAoZnVuY3Rpb24gKHBvaW50LCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHg6IChwb2ludC54IC0gb2xkUG9pbnRzW2ldLngpIC8gaW5pdE1hZ25pZnlBbW91bnQsCiAgICAgICAgICAgICAgICAgICAgeTogKHBvaW50LnkgLSBvbGRQb2ludHNbaV0ueSkgLyBpbml0TWFnbmlmeUFtb3VudCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgb2xkQ2VudGVyUG9pbnQgPSBQYW5ab29tLmNlbnRlclBvaW50KG9sZFBvaW50c1swXSwgb2xkUG9pbnRzWzFdKTsKICAgICAgICAgICAgdmFyIF9hID0gdGhpcy56b29tKGluaXRNYWduaWZ5QW1vdW50LCBvbGRDZW50ZXJQb2ludCksIGNlbnRlclZhbHVlID0gX2EuY2VudGVyVmFsdWUsIHpvb21BbW91bnQgPSBfYS56b29tQW1vdW50OwogICAgICAgICAgICB2YXIgY2VudGVyWCA9IGNlbnRlclZhbHVlLmNlbnRlclgsIGNlbnRlclkgPSBjZW50ZXJWYWx1ZS5jZW50ZXJZOwogICAgICAgICAgICB2YXIgY29uc3RyYWluZWRQb2ludHMgPSBvbGRQb2ludHMubWFwKGZ1bmN0aW9uIChvbGRQb2ludCwgaSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB4OiBub3JtYWxpemVkUG9pbnREaWZmc1tpXS54ICogem9vbUFtb3VudCArIG9sZFBvaW50LngsCiAgICAgICAgICAgICAgICAgICAgeTogbm9ybWFsaXplZFBvaW50RGlmZnNbaV0ueSAqIHpvb21BbW91bnQgKyBvbGRQb2ludC55LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVBbW91bnQgPSB7CiAgICAgICAgICAgICAgICB4OiBjZW50ZXJYIC0gKChjb25zdHJhaW5lZFBvaW50c1swXS54ICsgY29uc3RyYWluZWRQb2ludHNbMV0ueCkgLyAyKSwKICAgICAgICAgICAgICAgIHk6IGNlbnRlclkgLSAoKGNvbnN0cmFpbmVkUG9pbnRzWzBdLnkgKyBjb25zdHJhaW5lZFBvaW50c1sxXS55KSAvIDIpLAogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnBhbih0cmFuc2xhdGVBbW91bnQpOwogICAgICAgIH07CiAgICAgICAgUGFuWm9vbS5jZW50ZXJQb2ludCA9IGZ1bmN0aW9uIChwb2ludDEsIHBvaW50MikgewogICAgICAgICAgICB2YXIgbGVmdFggPSBNYXRoLm1pbihwb2ludDEueCwgcG9pbnQyLngpOwogICAgICAgICAgICB2YXIgcmlnaHRYID0gTWF0aC5tYXgocG9pbnQxLngsIHBvaW50Mi54KTsKICAgICAgICAgICAgdmFyIHRvcFkgPSBNYXRoLm1pbihwb2ludDEueSwgcG9pbnQyLnkpOwogICAgICAgICAgICB2YXIgYm90dG9tWSA9IE1hdGgubWF4KHBvaW50MS55LCBwb2ludDIueSk7CiAgICAgICAgICAgIHJldHVybiB7IHg6IChsZWZ0WCArIHJpZ2h0WCkgLyAyLCB5OiAoYm90dG9tWSArIHRvcFkpIC8gMiB9OwogICAgICAgIH07CiAgICAgICAgUGFuWm9vbS5fcG9pbnREaXN0YW5jZSA9IGZ1bmN0aW9uIChwb2ludDEsIHBvaW50MikgewogICAgICAgICAgICB2YXIgbGVmdFggPSBNYXRoLm1pbihwb2ludDEueCwgcG9pbnQyLngpOwogICAgICAgICAgICB2YXIgcmlnaHRYID0gTWF0aC5tYXgocG9pbnQxLngsIHBvaW50Mi54KTsKICAgICAgICAgICAgdmFyIHRvcFkgPSBNYXRoLm1pbihwb2ludDEueSwgcG9pbnQyLnkpOwogICAgICAgICAgICB2YXIgYm90dG9tWSA9IE1hdGgubWF4KHBvaW50MS55LCBwb2ludDIueSk7CiAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoTWF0aC5wb3cocmlnaHRYIC0gbGVmdFgsIDIpICsgTWF0aC5wb3coYm90dG9tWSAtIHRvcFksIDIpKTsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9oYW5kbGVUb3VjaEVuZCA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZHMuZm9yRWFjaChmdW5jdGlvbiAoaWQpIHsKICAgICAgICAgICAgICAgIF90aGlzLl90b3VjaElkcy5yZW1vdmUoaWQudG9TdHJpbmcoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodGhpcy5fdG91Y2hJZHMuc2l6ZSgpID4gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9oYW5kbGVXaGVlbEV2ZW50ID0gZnVuY3Rpb24gKHAsIGUpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl93aGVlbEZpbHRlcihlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUCA9IHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UocCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0luc2lkZUNvbXBvbmVudCh0cmFuc2xhdGVkUCkpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIC8vIGluIGNhc2VzIHdoZXJlIG9ubHkgaG9yaXpvbnRhbCBzY3JvbGwgaXMgcHJlc2VudCwgdXNlIHRoYXQgaW4gbGlldSBvZiBub3RoaW5nLgogICAgICAgICAgICAgICAgdmFyIGRlbHRhQW1vdW50ID0gZS5kZWx0YVkgIT09IDAgPyBlLmRlbHRhWSA6IGUuZGVsdGFYOwogICAgICAgICAgICAgICAgdmFyIGRlbHRhUGl4ZWxBbW91bnQgPSBkZWx0YUFtb3VudCAqIChlLmRlbHRhTW9kZSA/IFBhblpvb20uX1BJWEVMU19QRVJfTElORSA6IDEpOwogICAgICAgICAgICAgICAgdmFyIHpvb21BbW91bnQgPSBNYXRoLnBvdygyLCBkZWx0YVBpeGVsQW1vdW50ICogLjAwMik7CiAgICAgICAgICAgICAgICB0aGlzLnpvb20oem9vbUFtb3VudCwgdHJhbnNsYXRlZFApOwogICAgICAgICAgICAgICAgdGhpcy5fem9vbUVuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9jb25zdHJhaW5lZFpvb20gPSBmdW5jdGlvbiAoc2NhbGUsIHpvb21BbW91bnQsIGNlbnRlclBvaW50KSB7CiAgICAgICAgICAgIHJldHVybiBwYW5ab29tQ29uc3RyYWludHMuY29uc3RyYWluZWRab29tKHNjYWxlLCB6b29tQW1vdW50LCBjZW50ZXJQb2ludCwgdGhpcy5taW5Eb21haW5FeHRlbnQoc2NhbGUpLCB0aGlzLm1heERvbWFpbkV4dGVudChzY2FsZSksIHRoaXMubWluRG9tYWluVmFsdWUoc2NhbGUpLCB0aGlzLm1heERvbWFpblZhbHVlKHNjYWxlKSk7CiAgICAgICAgfTsKICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5fY29uc3RyYWluZWRUcmFuc2xhdGlvbiA9IGZ1bmN0aW9uIChzY2FsZSwgdHJhbnNsYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHBhblpvb21Db25zdHJhaW50cy5jb25zdHJhaW5lZFRyYW5zbGF0aW9uKHNjYWxlLCB0cmFuc2xhdGlvbiwgdGhpcy5taW5Eb21haW5WYWx1ZShzY2FsZSksIHRoaXMubWF4RG9tYWluVmFsdWUoc2NhbGUpKTsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9zZXR1cERyYWdJbnRlcmFjdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmNvbnN0cmFpbmVkVG9Db21wb25lbnQoZmFsc2UpOwogICAgICAgICAgICB2YXIgbGFzdERyYWdQb2ludDsKICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIGxhc3REcmFnUG9pbnQgPSBudWxsOyB9KTsKICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZyhmdW5jdGlvbiAoc3RhcnRQb2ludCwgZW5kUG9pbnQpIHsKICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fdG91Y2hJZHMuc2l6ZSgpID49IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdHJhbnNsYXRlQW1vdW50ID0gewogICAgICAgICAgICAgICAgICAgIHg6IChsYXN0RHJhZ1BvaW50ID09IG51bGwgPyBzdGFydFBvaW50LnggOiBsYXN0RHJhZ1BvaW50LngpIC0gZW5kUG9pbnQueCwKICAgICAgICAgICAgICAgICAgICB5OiAobGFzdERyYWdQb2ludCA9PSBudWxsID8gc3RhcnRQb2ludC55IDogbGFzdERyYWdQb2ludC55KSAtIGVuZFBvaW50LnksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgX3RoaXMucGFuKHRyYW5zbGF0ZUFtb3VudCk7CiAgICAgICAgICAgICAgICBsYXN0RHJhZ1BvaW50ID0gZW5kUG9pbnQ7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9wYW5FbmRDYWxsYmFja3MuY2FsbENhbGxiYWNrcygpOyB9KTsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzID0gZnVuY3Rpb24gKHNjYWxlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm1pbkRvbWFpbkV4dGVudChzY2FsZSkgIT0gbnVsbCAmJiB0aGlzLm1heERvbWFpbkV4dGVudChzY2FsZSkgIT0gbnVsbCAmJiAhKHNjYWxlIGluc3RhbmNlb2Ygc2NhbGVzLkxpbmVhcikgJiYgIShzY2FsZSBpbnN0YW5jZW9mIHNjYWxlcy5UaW1lKTsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLnhTY2FsZXMgPSBmdW5jdGlvbiAoeFNjYWxlcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAoeFNjYWxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGVzXzEgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuX3hTY2FsZXMuZm9yRWFjaChmdW5jdGlvbiAoeFNjYWxlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NhbGVzXzEucHVzaCh4U2NhbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGVzXzE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5feFNjYWxlcyA9IG5ldyB1dGlscyQxLlNldCgpOwogICAgICAgICAgICB4U2NhbGVzLmZvckVhY2goZnVuY3Rpb24gKHhTY2FsZSkgewogICAgICAgICAgICAgICAgX3RoaXMuYWRkWFNjYWxlKHhTY2FsZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLnlTY2FsZXMgPSBmdW5jdGlvbiAoeVNjYWxlcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAoeVNjYWxlcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGVzXzIgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuX3lTY2FsZXMuZm9yRWFjaChmdW5jdGlvbiAoeVNjYWxlKSB7CiAgICAgICAgICAgICAgICAgICAgc2NhbGVzXzIucHVzaCh5U2NhbGUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NhbGVzXzI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5feVNjYWxlcyA9IG5ldyB1dGlscyQxLlNldCgpOwogICAgICAgICAgICB5U2NhbGVzLmZvckVhY2goZnVuY3Rpb24gKHlTY2FsZSkgewogICAgICAgICAgICAgICAgX3RoaXMuYWRkWVNjYWxlKHlTY2FsZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYW4geCBzY2FsZSB0byB0aGlzIFBhblpvb20gSW50ZXJhY3Rpb24KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7VHJhbnNmb3JtYWJsZVNjYWxlfSBBbiB4IHNjYWxlIHRvIGFkZAogICAgICAgICAqIEByZXR1cm5zIHtJbnRlcmFjdGlvbnMuUGFuWm9vbX0gVGhlIGNhbGxpbmcgUGFuWm9vbSBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5hZGRYU2NhbGUgPSBmdW5jdGlvbiAoeFNjYWxlKSB7CiAgICAgICAgICAgIHRoaXMuX3hTY2FsZXMuYWRkKHhTY2FsZSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbiB4IHNjYWxlIGZyb20gdGhpcyBQYW5ab29tIEludGVyYWN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1RyYW5zZm9ybWFibGVTY2FsZX0gQW4geCBzY2FsZSB0byByZW1vdmUKICAgICAgICAgKiBAcmV0dXJucyB7SW50ZXJhY3Rpb25zLlBhblpvb219IFRoZSBjYWxsaW5nIFBhblpvb20gSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUucmVtb3ZlWFNjYWxlID0gZnVuY3Rpb24gKHhTY2FsZSkgewogICAgICAgICAgICB0aGlzLl94U2NhbGVzLmRlbGV0ZSh4U2NhbGUpOwogICAgICAgICAgICB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZSh4U2NhbGUpOwogICAgICAgICAgICB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZSh4U2NhbGUpOwogICAgICAgICAgICB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKHhTY2FsZSk7CiAgICAgICAgICAgIHRoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoeFNjYWxlKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgeSBzY2FsZSB0byB0aGlzIFBhblpvb20gSW50ZXJhY3Rpb24KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7VHJhbnNmb3JtYWJsZVNjYWxlfSBBIHkgc2NhbGUgdG8gYWRkCiAgICAgICAgICogQHJldHVybnMge0ludGVyYWN0aW9ucy5QYW5ab29tfSBUaGUgY2FsbGluZyBQYW5ab29tIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLmFkZFlTY2FsZSA9IGZ1bmN0aW9uICh5U2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5feVNjYWxlcy5hZGQoeVNjYWxlKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgeSBzY2FsZSBmcm9tIHRoaXMgUGFuWm9vbSBJbnRlcmFjdGlvbgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtUcmFuc2Zvcm1hYmxlU2NhbGV9IEEgeSBzY2FsZSB0byByZW1vdmUKICAgICAgICAgKiBAcmV0dXJucyB7SW50ZXJhY3Rpb25zLlBhblpvb219IFRoZSBjYWxsaW5nIFBhblpvb20gSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUucmVtb3ZlWVNjYWxlID0gZnVuY3Rpb24gKHlTY2FsZSkgewogICAgICAgICAgICB0aGlzLl95U2NhbGVzLmRlbGV0ZSh5U2NhbGUpOwogICAgICAgICAgICB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmRlbGV0ZSh5U2NhbGUpOwogICAgICAgICAgICB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmRlbGV0ZSh5U2NhbGUpOwogICAgICAgICAgICB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKHlTY2FsZSk7CiAgICAgICAgICAgIHRoaXMuX21heERvbWFpblZhbHVlcy5kZWxldGUoeVNjYWxlKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5taW5Eb21haW5FeHRlbnQgPSBmdW5jdGlvbiAoc2NhbGUsIG1pbkRvbWFpbkV4dGVudCkgewogICAgICAgICAgICBpZiAobWluRG9tYWluRXh0ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9taW5Eb21haW5FeHRlbnRzLmdldChzY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1pbkRvbWFpbkV4dGVudC52YWx1ZU9mKCkgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImV4dGVudCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtYXhFeHRlbnRGb3JTY2FsZSA9IHRoaXMubWF4RG9tYWluRXh0ZW50KHNjYWxlKTsKICAgICAgICAgICAgaWYgKG1heEV4dGVudEZvclNjYWxlICE9IG51bGwgJiYgbWF4RXh0ZW50Rm9yU2NhbGUudmFsdWVPZigpIDwgbWluRG9tYWluRXh0ZW50LnZhbHVlT2YoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtaW5Eb21haW5FeHRlbnQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gbWF4RG9tYWluRXh0ZW50IGZvciB0aGUgc2FtZSBTY2FsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9ub25MaW5lYXJTY2FsZVdpdGhFeHRlbnRzKHNjYWxlKSkgewogICAgICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cud2FybigiUGFubmluZyBhbmQgem9vbWluZyB3aXRoIGV4dGVudHMgb24gYSBub25saW5lYXIgc2NhbGUgbWF5IGhhdmUgdW5pbnRlbmRlZCBiZWhhdmlvci4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9taW5Eb21haW5FeHRlbnRzLnNldChzY2FsZSwgbWluRG9tYWluRXh0ZW50KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5tYXhEb21haW5FeHRlbnQgPSBmdW5jdGlvbiAoc2NhbGUsIG1heERvbWFpbkV4dGVudCkgewogICAgICAgICAgICBpZiAobWF4RG9tYWluRXh0ZW50ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhEb21haW5FeHRlbnRzLmdldChzY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1heERvbWFpbkV4dGVudC52YWx1ZU9mKCkgPD0gMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJleHRlbnQgbXVzdCBiZSBwb3NpdGl2ZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBtaW5FeHRlbnRGb3JTY2FsZSA9IHRoaXMubWluRG9tYWluRXh0ZW50KHNjYWxlKTsKICAgICAgICAgICAgaWYgKG1pbkV4dGVudEZvclNjYWxlICE9IG51bGwgJiYgbWF4RG9tYWluRXh0ZW50LnZhbHVlT2YoKSA8IG1pbkV4dGVudEZvclNjYWxlLnZhbHVlT2YoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJtYXhEb21haW5FeHRlbnQgbXVzdCBiZSBsYXJnZXIgdGhhbiBtaW5Eb21haW5FeHRlbnQgZm9yIHRoZSBzYW1lIFNjYWxlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX25vbkxpbmVhclNjYWxlV2l0aEV4dGVudHMoc2NhbGUpKSB7CiAgICAgICAgICAgICAgICB1dGlscyQxLldpbmRvdy53YXJuKCJQYW5uaW5nIGFuZCB6b29taW5nIHdpdGggZXh0ZW50cyBvbiBhIG5vbmxpbmVhciBzY2FsZSBtYXkgaGF2ZSB1bmludGVuZGVkIGJlaGF2aW9yLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21heERvbWFpbkV4dGVudHMuc2V0KHNjYWxlLCBtYXhEb21haW5FeHRlbnQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLm1pbkRvbWFpblZhbHVlID0gZnVuY3Rpb24gKHNjYWxlLCBtaW5Eb21haW5WYWx1ZSkgewogICAgICAgICAgICBpZiAobWluRG9tYWluVmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21pbkRvbWFpblZhbHVlcy5nZXQoc2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21pbkRvbWFpblZhbHVlcy5zZXQoc2NhbGUsIG1pbkRvbWFpblZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5tYXhEb21haW5WYWx1ZSA9IGZ1bmN0aW9uIChzY2FsZSwgbWF4RG9tYWluVmFsdWUpIHsKICAgICAgICAgICAgaWYgKG1heERvbWFpblZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXhEb21haW5WYWx1ZXMuZ2V0KHNjYWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tYXhEb21haW5WYWx1ZXMuc2V0KHNjYWxlLCBtYXhEb21haW5WYWx1ZSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlcyB0aGUgY3VycmVudCBkb21haW4gb2YgdGhlIHNjYWxlIHRvIGFwcGx5IGEgbWluaW11bSBhbmQgbWF4aW11bQogICAgICAgICAqIGRvbWFpbiB2YWx1ZSBmb3IgdGhhdCBzY2FsZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgY29uc3RyYWlucyB0aGUgcGFuL3pvb20gaW50ZXJhY3Rpb24gdG8gc2hvdyBubyBtb3JlIHRoYW4gdGhlIGRvbWFpbgogICAgICAgICAqIG9mIHRoZSBzY2FsZS4KICAgICAgICAgKi8KICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5zZXRNaW5NYXhEb21haW5WYWx1ZXNUbyA9IGZ1bmN0aW9uIChzY2FsZSkgewogICAgICAgICAgICB0aGlzLl9taW5Eb21haW5WYWx1ZXMuZGVsZXRlKHNjYWxlKTsKICAgICAgICAgICAgdGhpcy5fbWF4RG9tYWluVmFsdWVzLmRlbGV0ZShzY2FsZSk7CiAgICAgICAgICAgIHZhciBfYSA9IHNjYWxlLmdldFRyYW5zZm9ybWF0aW9uRG9tYWluKCksIGRvbWFpbk1pbiA9IF9hWzBdLCBkb21haW5NYXggPSBfYVsxXTsKICAgICAgICAgICAgdGhpcy5taW5Eb21haW5WYWx1ZShzY2FsZSwgZG9tYWluTWluKTsKICAgICAgICAgICAgdGhpcy5tYXhEb21haW5WYWx1ZShzY2FsZSwgZG9tYWluTWF4KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gcGFubmluZyBlbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQYW5DYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7dGhpc30gVGhlIGNhbGxpbmcgUGFuWm9vbSBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5vblBhbkVuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9wYW5FbmRDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiBwYW5uaW5nIGVuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BhbkNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHt0aGlzfSBUaGUgY2FsbGluZyBQYW5ab29tIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLm9mZlBhbkVuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9wYW5FbmRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gem9vbWluZyBlbmRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtab29tQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge3RoaXN9IFRoZSBjYWxsaW5nIFBhblpvb20gSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUub25ab29tRW5kID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3pvb21FbmRDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiB6b29taW5nIGVuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1pvb21DYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7dGhpc30gVGhlIGNhbGxpbmcgUGFuWm9vbSBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBQYW5ab29tLnByb3RvdHlwZS5vZmZab29tRW5kID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3pvb21FbmRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gYW55IHBhbiBvciB6b29tIHVwZGF0ZSBvY2N1cnMuIFRoaXMgaXMKICAgICAgICAgKiBjYWxsZWQgb24gZXZlcnkgZnJhbWUsIHNvIGJlIHN1cmUgeW91ciBjYWxsYmFjayBpcyBmYXN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQYW5ab29tVXBkYXRlQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge3RoaXN9IFRoZSBjYWxsaW5nIFBhblpvb20gSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgUGFuWm9vbS5wcm90b3R5cGUub25QYW5ab29tVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3Bhblpvb21VcGRhdGVDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiBhbnkgcGFuIG9yIHpvb20gdXBkYXRlIG9jY3Vycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UGFuWm9vbVVwZGF0ZUNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHt0aGlzfSBUaGUgY2FsbGluZyBQYW5ab29tIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBhblpvb20ucHJvdG90eXBlLm9mZlBhblpvb21VcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fcGFuWm9vbVVwZGF0ZUNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBudW1iZXIgb2YgcGl4ZWxzIG9jY3VwaWVkIGluIGEgbGluZS4KICAgICAgICAgKi8KICAgICAgICBQYW5ab29tLl9QSVhFTFNfUEVSX0xJTkUgPSAxMjA7CiAgICAgICAgcmV0dXJuIFBhblpvb207CiAgICB9KGludGVyYWN0aW9uLkludGVyYWN0aW9uKSk7CiAgICBleHBvcnRzLlBhblpvb20gPSBQYW5ab29tOwogICAgfSk7CgogICAgdmFyIHBvaW50ZXJJbnRlcmFjdGlvbiA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIHZhciBQb2ludGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUG9pbnRlciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBQb2ludGVyKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX292ZXJDb21wb25lbnQgPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9wb2ludGVyTW92ZUNhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9wb2ludGVyRXhpdENhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9tb3VzZU1vdmVDYWxsYmFjayA9IGZ1bmN0aW9uIChwLCBlKSB7IHJldHVybiBfdGhpcy5faGFuZGxlTW91c2VFdmVudChwLCBlKTsgfTsKICAgICAgICAgICAgX3RoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayA9IGZ1bmN0aW9uIChpZHMsIGlkVG9Qb2ludCwgZSkgeyByZXR1cm4gX3RoaXMuX2hhbmRsZVRvdWNoRXZlbnQoaWRUb1BvaW50W2lkc1swXV0sIGUpOyB9OwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLl9hbmNob3IgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2FuY2hvci5jYWxsKHRoaXMsIGNvbXBvbmVudCk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJzLk1vdXNlLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlciA9IGRpc3BhdGNoZXJzLlRvdWNoLmdldERpc3BhdGNoZXIodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQodGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTsKICAgICAgICB9OwogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLl91bmFuY2hvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fdW5hbmNob3IuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyLm9mZk1vdXNlTW92ZSh0aGlzLl9tb3VzZU1vdmVDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vZmZUb3VjaFN0YXJ0KHRoaXMuX3RvdWNoU3RhcnRDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX3RvdWNoRGlzcGF0Y2hlciA9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBQb2ludGVyLnByb3RvdHlwZS5faGFuZGxlTW91c2VFdmVudCA9IGZ1bmN0aW9uIChwLCBlKSB7CiAgICAgICAgICAgIHZhciBpbnNpZGVTVkcgPSB0aGlzLl9tb3VzZURpc3BhdGNoZXIuZXZlbnRJbnNpZGUodGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbywgZSk7CiAgICAgICAgICAgIHRoaXMuX2hhbmRsZVBvaW50ZXJFdmVudChwLCBpbnNpZGVTVkcpOwogICAgICAgIH07CiAgICAgICAgUG9pbnRlci5wcm90b3R5cGUuX2hhbmRsZVRvdWNoRXZlbnQgPSBmdW5jdGlvbiAocCwgZSkgewogICAgICAgICAgICB2YXIgaW5zaWRlU1ZHID0gdGhpcy5fdG91Y2hEaXNwYXRjaGVyLmV2ZW50SW5zaWRlKHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8sIGUpOwogICAgICAgICAgICB0aGlzLl9oYW5kbGVQb2ludGVyRXZlbnQocCwgaW5zaWRlU1ZHKTsKICAgICAgICB9OwogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLl9oYW5kbGVQb2ludGVyRXZlbnQgPSBmdW5jdGlvbiAocCwgaW5zaWRlU1ZHKSB7CiAgICAgICAgICAgIHZhciB0cmFuc2xhdGVkUCA9IHRoaXMuX3RyYW5zbGF0ZVRvQ29tcG9uZW50U3BhY2UocCk7CiAgICAgICAgICAgIHZhciBvdmVyQ29tcG9uZW50ID0gdGhpcy5faXNJbnNpZGVDb21wb25lbnQodHJhbnNsYXRlZFApOwogICAgICAgICAgICBpZiAob3ZlckNvbXBvbmVudCAmJiBpbnNpZGVTVkcpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fb3ZlckNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKHRyYW5zbGF0ZWRQKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModHJhbnNsYXRlZFApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX292ZXJDb21wb25lbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModHJhbnNsYXRlZFApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX292ZXJDb21wb25lbnQgPSBvdmVyQ29tcG9uZW50ICYmIGluc2lkZVNWRzsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcG9pbnRlciBlbnRlcnMgdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UG9pbnRlckNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0ludGVyYWN0aW9ucy5Qb2ludGVyfSBUaGUgY2FsbGluZyBQb2ludGVyIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLm9uUG9pbnRlckVudGVyID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBwb2ludGVyIGVudGVycyB0aGUgQ29tcG9uZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQb2ludGVyQ2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7SW50ZXJhY3Rpb25zLlBvaW50ZXJ9IFRoZSBjYWxsaW5nIFBvaW50ZXIgSW50ZXJhY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgUG9pbnRlci5wcm90b3R5cGUub2ZmUG9pbnRlckVudGVyID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFbnRlckNhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcG9pbnRlciBtb3ZlcyB3aXRoaW4gdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UG9pbnRlckNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0ludGVyYWN0aW9ucy5Qb2ludGVyfSBUaGUgY2FsbGluZyBQb2ludGVyIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLm9uUG9pbnRlck1vdmUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fcG9pbnRlck1vdmVDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgcG9pbnRlciBtb3ZlcyB3aXRoaW4gdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UG9pbnRlckNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0ludGVyYWN0aW9ucy5Qb2ludGVyfSBUaGUgY2FsbGluZyBQb2ludGVyIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLm9mZlBvaW50ZXJNb3ZlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJNb3ZlQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSBwb2ludGVyIGV4aXRzIHRoZSBDb21wb25lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50ZXJDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHtJbnRlcmFjdGlvbnMuUG9pbnRlcn0gVGhlIGNhbGxpbmcgUG9pbnRlciBJbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBQb2ludGVyLnByb3RvdHlwZS5vblBvaW50ZXJFeGl0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHBvaW50ZXIgZXhpdHMgdGhlIENvbXBvbmVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UG9pbnRlckNhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4ge0ludGVyYWN0aW9ucy5Qb2ludGVyfSBUaGUgY2FsbGluZyBQb2ludGVyIEludGVyYWN0aW9uLgogICAgICAgICAqLwogICAgICAgIFBvaW50ZXIucHJvdG90eXBlLm9mZlBvaW50ZXJFeGl0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJFeGl0Q2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFBvaW50ZXI7CiAgICB9KGludGVyYWN0aW9uLkludGVyYWN0aW9uKSk7CiAgICBleHBvcnRzLlBvaW50ZXIgPSBQb2ludGVyOwogICAgfSk7CgogICAgdmFyIGludGVyYWN0aW9ucyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoY2xpY2tJbnRlcmFjdGlvbiwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGRyYWdJbnRlcmFjdGlvbiwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGtleUludGVyYWN0aW9uLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIocGFuWm9vbUludGVyYWN0aW9uLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIocG9pbnRlckludGVyYWN0aW9uLCBleHBvcnRzKTsKCiAgICBleHBvcnRzLnpvb21PdXQgPSBwYW5ab29tQ29uc3RyYWludHMuem9vbU91dDsKICAgIH0pOwoKICAgIHZhciBzZWxlY3Rpb25Cb3hMYXllciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIFByb3BlcnR5TW9kZTsKICAgIChmdW5jdGlvbiAoUHJvcGVydHlNb2RlKSB7CiAgICAgICAgUHJvcGVydHlNb2RlW1Byb3BlcnR5TW9kZVsiVkFMVUUiXSA9IDBdID0gIlZBTFVFIjsKICAgICAgICBQcm9wZXJ0eU1vZGVbUHJvcGVydHlNb2RlWyJQSVhFTCJdID0gMV0gPSAiUElYRUwiOwogICAgfSkoUHJvcGVydHlNb2RlID0gZXhwb3J0cy5Qcm9wZXJ0eU1vZGUgfHwgKGV4cG9ydHMuUHJvcGVydHlNb2RlID0ge30pKTsKICAgIHZhciBTZWxlY3Rpb25Cb3hMYXllciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFNlbGVjdGlvbkJveExheWVyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIFNlbGVjdGlvbkJveExheWVyKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fYm94VmlzaWJsZSA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5fYm94Qm91bmRzID0gewogICAgICAgICAgICAgICAgdG9wTGVmdDogeyB4OiAwLCB5OiAwIH0sCiAgICAgICAgICAgICAgICBib3R0b21SaWdodDogeyB4OiAwLCB5OiAwIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIF90aGlzLl94Qm91bmRzTW9kZSA9IFByb3BlcnR5TW9kZS5QSVhFTDsKICAgICAgICAgICAgX3RoaXMuX3lCb3VuZHNNb2RlID0gUHJvcGVydHlNb2RlLlBJWEVMOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygic2VsZWN0aW9uLWJveC1sYXllciIpOwogICAgICAgICAgICBfdGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgX3RoaXMuX292ZXJmbG93SGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXMuX3hFeHRlbnQgPSBbdW5kZWZpbmVkLCB1bmRlZmluZWRdOwogICAgICAgICAgICBfdGhpcy5feUV4dGVudCA9IFt1bmRlZmluZWQsIHVuZGVmaW5lZF07CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgU2VsZWN0aW9uQm94TGF5ZXIucHJvdG90eXBlLl9zZXR1cCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fYm94ID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgic2VsZWN0aW9uLWJveCIsIHRydWUpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl9ib3hBcmVhID0gdGhpcy5fYm94LmFwcGVuZCgicmVjdCIpLmNsYXNzZWQoInNlbGVjdGlvbi1hcmVhIiwgdHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIgPSBmdW5jdGlvbiAoYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVdpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVIZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUuYm91bmRzID0gZnVuY3Rpb24gKG5ld0JvdW5kcykgewogICAgICAgICAgICBpZiAobmV3Qm91bmRzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRCb3VuZHMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zZXRCb3VuZHMobmV3Qm91bmRzKTsKICAgICAgICAgICAgdGhpcy5feEJvdW5kc01vZGUgPSBQcm9wZXJ0eU1vZGUuUElYRUw7CiAgICAgICAgICAgIHRoaXMuX3lCb3VuZHNNb2RlID0gUHJvcGVydHlNb2RlLlBJWEVMOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFNlbGVjdGlvbkJveExheWVyLnByb3RvdHlwZS5fc2V0Qm91bmRzID0gZnVuY3Rpb24gKG5ld0JvdW5kcykgewogICAgICAgICAgICB2YXIgdG9wTGVmdCA9IHsKICAgICAgICAgICAgICAgIHg6IE1hdGgubWluKG5ld0JvdW5kcy50b3BMZWZ0LngsIG5ld0JvdW5kcy5ib3R0b21SaWdodC54KSwKICAgICAgICAgICAgICAgIHk6IE1hdGgubWluKG5ld0JvdW5kcy50b3BMZWZ0LnksIG5ld0JvdW5kcy5ib3R0b21SaWdodC55KSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGJvdHRvbVJpZ2h0ID0gewogICAgICAgICAgICAgICAgeDogTWF0aC5tYXgobmV3Qm91bmRzLnRvcExlZnQueCwgbmV3Qm91bmRzLmJvdHRvbVJpZ2h0LngpLAogICAgICAgICAgICAgICAgeTogTWF0aC5tYXgobmV3Qm91bmRzLnRvcExlZnQueSwgbmV3Qm91bmRzLmJvdHRvbVJpZ2h0LnkpLAogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9ib3hCb3VuZHMgPSB7CiAgICAgICAgICAgICAgICB0b3BMZWZ0OiB0b3BMZWZ0LAogICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6IGJvdHRvbVJpZ2h0LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgU2VsZWN0aW9uQm94TGF5ZXIucHJvdG90eXBlLl9nZXRCb3VuZHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0b3BMZWZ0OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdGhpcy5feEJvdW5kc01vZGUgPT09IFByb3BlcnR5TW9kZS5QSVhFTCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JveEJvdW5kcy50b3BMZWZ0LnggOgogICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5feFNjYWxlID09IG51bGwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbih0aGlzLnhTY2FsZSgpLnNjYWxlKHRoaXMueEV4dGVudCgpWzBdKSwgdGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVsxXSkpKSwKICAgICAgICAgICAgICAgICAgICB5OiB0aGlzLl95Qm91bmRzTW9kZSA9PT0gUHJvcGVydHlNb2RlLlBJWEVMID8KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYm94Qm91bmRzLnRvcExlZnQueSA6CiAgICAgICAgICAgICAgICAgICAgICAgICh0aGlzLl95U2NhbGUgPT0gbnVsbCA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMF0pLCB0aGlzLnlTY2FsZSgpLnNjYWxlKHRoaXMueUV4dGVudCgpWzFdKSkpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiB7CiAgICAgICAgICAgICAgICAgICAgeDogdGhpcy5feEJvdW5kc01vZGUgPT09IFByb3BlcnR5TW9kZS5QSVhFTCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC54IDoKICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3hTY2FsZSA9PSBudWxsID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy54U2NhbGUoKS5zY2FsZSh0aGlzLnhFeHRlbnQoKVswXSksIHRoaXMueFNjYWxlKCkuc2NhbGUodGhpcy54RXh0ZW50KClbMV0pKSksCiAgICAgICAgICAgICAgICAgICAgeTogdGhpcy5feUJvdW5kc01vZGUgPT09IFByb3BlcnR5TW9kZS5QSVhFTCA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JveEJvdW5kcy5ib3R0b21SaWdodC55IDoKICAgICAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3lTY2FsZSA9PSBudWxsID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy55U2NhbGUoKS5zY2FsZSh0aGlzLnlFeHRlbnQoKVswXSksIHRoaXMueVNjYWxlKCkuc2NhbGUodGhpcy55RXh0ZW50KClbMV0pKSksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgU2VsZWN0aW9uQm94TGF5ZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7CiAgICAgICAgICAgIGlmICh0aGlzLl9ib3hWaXNpYmxlKSB7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5ib3VuZHMoKTsKICAgICAgICAgICAgICAgIHZhciB0ID0gYm91bmRzLnRvcExlZnQueTsKICAgICAgICAgICAgICAgIHZhciBiID0gYm91bmRzLmJvdHRvbVJpZ2h0Lnk7CiAgICAgICAgICAgICAgICB2YXIgbCA9IGJvdW5kcy50b3BMZWZ0Lng7CiAgICAgICAgICAgICAgICB2YXIgciA9IGJvdW5kcy5ib3R0b21SaWdodC54OwogICAgICAgICAgICAgICAgaWYgKCEodXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIodCkgJiYKICAgICAgICAgICAgICAgICAgICB1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihiKSAmJgogICAgICAgICAgICAgICAgICAgIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKGwpICYmCiAgICAgICAgICAgICAgICAgICAgdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIocikpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJib3VuZHMgaGF2ZSBub3QgYmVlbiBwcm9wZXJseSBzZXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2JveEFyZWEuYXR0cnMoewogICAgICAgICAgICAgICAgICAgIHg6IGwsIHk6IHQsIHdpZHRoOiByIC0gbCwgaGVpZ2h0OiBiIC0gdCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5jb250ZW50KCkubm9kZSgpLmFwcGVuZENoaWxkKHRoaXMuX2JveC5ub2RlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fYm94LnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgU2VsZWN0aW9uQm94TGF5ZXIucHJvdG90eXBlLmJveFZpc2libGUgPSBmdW5jdGlvbiAoc2hvdykgewogICAgICAgICAgICBpZiAoc2hvdyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYm94VmlzaWJsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9ib3hWaXNpYmxlID0gc2hvdzsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUuZml4ZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUuZml4ZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgU2VsZWN0aW9uQm94TGF5ZXIucHJvdG90eXBlLnhTY2FsZSA9IGZ1bmN0aW9uICh4U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHhTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5feFNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl94U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5feFNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5feFNjYWxlID0geFNjYWxlOwogICAgICAgICAgICB0aGlzLl94Qm91bmRzTW9kZSA9IFByb3BlcnR5TW9kZS5WQUxVRTsKICAgICAgICAgICAgdGhpcy5feFNjYWxlLm9uVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUueVNjYWxlID0gZnVuY3Rpb24gKHlTY2FsZSkgewogICAgICAgICAgICBpZiAoeVNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl95U2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3lTY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl95U2NhbGUub2ZmVXBkYXRlKHRoaXMuX2FkanVzdEJvdW5kc0NhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl95U2NhbGUgPSB5U2NhbGU7CiAgICAgICAgICAgIHRoaXMuX3lCb3VuZHNNb2RlID0gUHJvcGVydHlNb2RlLlZBTFVFOwogICAgICAgICAgICB0aGlzLl95U2NhbGUub25VcGRhdGUodGhpcy5fYWRqdXN0Qm91bmRzQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFNlbGVjdGlvbkJveExheWVyLnByb3RvdHlwZS54RXh0ZW50ID0gZnVuY3Rpb24gKHhFeHRlbnQpIHsKICAgICAgICAgICAgLy8gRXhwbGljaXQgdHlwaW5nIGZvciBUeXBlc2NyaXB0IDEuNAogICAgICAgICAgICBpZiAoeEV4dGVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0WEV4dGVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NldFhFeHRlbnQoeEV4dGVudCk7CiAgICAgICAgICAgIHRoaXMuX3hCb3VuZHNNb2RlID0gUHJvcGVydHlNb2RlLlZBTFVFOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFNlbGVjdGlvbkJveExheWVyLnByb3RvdHlwZS5fZ2V0WEV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3hCb3VuZHNNb2RlID09PSBQcm9wZXJ0eU1vZGUuVkFMVUUgPwogICAgICAgICAgICAgICAgdGhpcy5feEV4dGVudCA6CiAgICAgICAgICAgICAgICAodGhpcy5feFNjYWxlID09IG51bGwgPwogICAgICAgICAgICAgICAgICAgIFt1bmRlZmluZWQsIHVuZGVmaW5lZF0gOgogICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC54KSwKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feFNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueCksCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUuX3NldFhFeHRlbnQgPSBmdW5jdGlvbiAoeEV4dGVudCkgewogICAgICAgICAgICB0aGlzLl94RXh0ZW50ID0geEV4dGVudDsKICAgICAgICB9OwogICAgICAgIFNlbGVjdGlvbkJveExheWVyLnByb3RvdHlwZS55RXh0ZW50ID0gZnVuY3Rpb24gKHlFeHRlbnQpIHsKICAgICAgICAgICAgLy8gRXhwbGljaXQgdHlwaW5nIGZvciBUeXBlc2NyaXB0IDEuNAogICAgICAgICAgICBpZiAoeUV4dGVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0WUV4dGVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NldFlFeHRlbnQoeUV4dGVudCk7CiAgICAgICAgICAgIHRoaXMuX3lCb3VuZHNNb2RlID0gUHJvcGVydHlNb2RlLlZBTFVFOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFNlbGVjdGlvbkJveExheWVyLnByb3RvdHlwZS5fZ2V0WUV4dGVudCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3lCb3VuZHNNb2RlID09PSBQcm9wZXJ0eU1vZGUuVkFMVUUgPwogICAgICAgICAgICAgICAgdGhpcy5feUV4dGVudCA6CiAgICAgICAgICAgICAgICAodGhpcy5feVNjYWxlID09IG51bGwgPwogICAgICAgICAgICAgICAgICAgIFt1bmRlZmluZWQsIHVuZGVmaW5lZF0gOgogICAgICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMudG9wTGVmdC55KSwKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5feVNjYWxlLmludmVydCh0aGlzLl9ib3hCb3VuZHMuYm90dG9tUmlnaHQueSksCiAgICAgICAgICAgICAgICAgICAgXSk7CiAgICAgICAgfTsKICAgICAgICBTZWxlY3Rpb25Cb3hMYXllci5wcm90b3R5cGUuX3NldFlFeHRlbnQgPSBmdW5jdGlvbiAoeUV4dGVudCkgewogICAgICAgICAgICB0aGlzLl95RXh0ZW50ID0geUV4dGVudDsKICAgICAgICB9OwogICAgICAgIFNlbGVjdGlvbkJveExheWVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3hTY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnhTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3lTY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnlTY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RCb3VuZHNDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBTZWxlY3Rpb25Cb3hMYXllcjsKICAgIH0oY29tcG9uZW50LkNvbXBvbmVudCkpOwogICAgZXhwb3J0cy5TZWxlY3Rpb25Cb3hMYXllciA9IFNlbGVjdGlvbkJveExheWVyOwogICAgfSk7CgogICAgdmFyIGRyYWdCb3hMYXllciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgogICAgdmFyIERyYWdCb3hMYXllciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKERyYWdCb3hMYXllciwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgRHJhZ0JveExheWVyLgogICAgICAgICAqCiAgICAgICAgICogQSBEcmFnQm94TGF5ZXIgaXMgYSBTZWxlY3Rpb25Cb3hMYXllciB3aXRoIGEgYnVpbHQtaW4gRHJhZyBJbnRlcmFjdGlvbi4KICAgICAgICAgKiBBIGRyYWcgZ2VzdHVyZSB3aWxsIHNldCB0aGUgQm91bmRzIG9mIHRoZSBib3guCiAgICAgICAgICogSWYgcmVzaXppbmcgaXMgZW5hYmxlZCB1c2luZyByZXNpemFibGUodHJ1ZSksIHRoZSBlZGdlcyBvZiBib3ggY2FuIGJlIHJlcG9zaXRpb25lZC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIERyYWdCb3hMYXllcigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX2RldGVjdGlvblJhZGl1cyA9IDM7CiAgICAgICAgICAgIF90aGlzLl9yZXNpemFibGUgPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuX21vdmFibGUgPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuX2hhc0Nvcm5lcnMgPSB0cnVlOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygiZHJhZy1ib3gtbGF5ZXIiKTsKICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbiA9IG5ldyBpbnRlcmFjdGlvbnMuRHJhZygpOwogICAgICAgICAgICBfdGhpcy5fc2V0VXBDYWxsYmFja3MoKTsKICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhfdGhpcyk7CiAgICAgICAgICAgIF90aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MgPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICBfdGhpcy5fZHJhZ0NhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9kcmFnRW5kQ2FsbGJhY2tzID0gbmV3IHV0aWxzJDEuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLl9zZXRVcENhbGxiYWNrcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHJlc2l6aW5nRWRnZXM7CiAgICAgICAgICAgIHZhciB0b3BMZWZ0OwogICAgICAgICAgICB2YXIgYm90dG9tUmlnaHQ7CiAgICAgICAgICAgIHZhciBsYXN0RW5kUG9pbnQ7CiAgICAgICAgICAgIHZhciBEUkFHX01PREVTID0gewogICAgICAgICAgICAgICAgbmV3Qm94OiAwLAogICAgICAgICAgICAgICAgcmVzaXplOiAxLAogICAgICAgICAgICAgICAgbW92ZTogMiwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG1vZGUgPSBEUkFHX01PREVTLm5ld0JveDsKICAgICAgICAgICAgdmFyIG9uRHJhZ1N0YXJ0Q2FsbGJhY2sgPSBmdW5jdGlvbiAoc3RhcnRQb2ludCkgewogICAgICAgICAgICAgICAgcmVzaXppbmdFZGdlcyA9IF90aGlzLl9nZXRSZXNpemluZ0VkZ2VzKHN0YXJ0UG9pbnQpOwogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IF90aGlzLmJvdW5kcygpOwogICAgICAgICAgICAgICAgdmFyIGlzSW5zaWRlQm94ID0gYm91bmRzLnRvcExlZnQueCA8PSBzdGFydFBvaW50LnggJiYgc3RhcnRQb2ludC54IDw9IGJvdW5kcy5ib3R0b21SaWdodC54ICYmCiAgICAgICAgICAgICAgICAgICAgYm91bmRzLnRvcExlZnQueSA8PSBzdGFydFBvaW50LnkgJiYgc3RhcnRQb2ludC55IDw9IGJvdW5kcy5ib3R0b21SaWdodC55OwogICAgICAgICAgICAgICAgaWYgKF90aGlzLmJveFZpc2libGUoKSAmJiAocmVzaXppbmdFZGdlcy50b3AgfHwgcmVzaXppbmdFZGdlcy5ib3R0b20gfHwgcmVzaXppbmdFZGdlcy5sZWZ0IHx8IHJlc2l6aW5nRWRnZXMucmlnaHQpKSB7CiAgICAgICAgICAgICAgICAgICAgbW9kZSA9IERSQUdfTU9ERVMucmVzaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoX3RoaXMuYm94VmlzaWJsZSgpICYmIF90aGlzLm1vdmFibGUoKSAmJiBpc0luc2lkZUJveCkgewogICAgICAgICAgICAgICAgICAgIG1vZGUgPSBEUkFHX01PREVTLm1vdmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBtb2RlID0gRFJBR19NT0RFUy5uZXdCb3g7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldEJvdW5kcyh7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQ6IHN0YXJ0UG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiBzdGFydFBvaW50LAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChfdGhpcy5feEJvdW5kc01vZGUgPT09IGNvbXBvbmVudHMuUHJvcGVydHlNb2RlLlZBTFVFICYmIF90aGlzLnhTY2FsZSgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldFhFeHRlbnQoW190aGlzLnhTY2FsZSgpLmludmVydChzdGFydFBvaW50LngpLCBfdGhpcy54U2NhbGUoKS5pbnZlcnQoc3RhcnRQb2ludC54KV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3lCb3VuZHNNb2RlID09PSBjb21wb25lbnRzLlByb3BlcnR5TW9kZS5WQUxVRSAmJiBfdGhpcy55U2NhbGUoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZXRZRXh0ZW50KFtfdGhpcy55U2NhbGUoKS5pbnZlcnQoc3RhcnRQb2ludC55KSwgX3RoaXMueVNjYWxlKCkuaW52ZXJ0KHN0YXJ0UG9pbnQueSldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX3RoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfdGhpcy5ib3hWaXNpYmxlKHRydWUpOwogICAgICAgICAgICAgICAgYm91bmRzID0gX3RoaXMuYm91bmRzKCk7CiAgICAgICAgICAgICAgICAvLyBjb3B5IHBvaW50cyBzbyBjaGFuZ2VzIHRvIHRvcExlZnQgYW5kIGJvdHRvbVJpZ2h0IGRvbid0IG11dGF0ZSBib3VuZHMKICAgICAgICAgICAgICAgIHRvcExlZnQgPSB7IHg6IGJvdW5kcy50b3BMZWZ0LngsIHk6IGJvdW5kcy50b3BMZWZ0LnkgfTsKICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0ID0geyB4OiBib3VuZHMuYm90dG9tUmlnaHQueCwgeTogYm91bmRzLmJvdHRvbVJpZ2h0LnkgfTsKICAgICAgICAgICAgICAgIGxhc3RFbmRQb2ludCA9IHN0YXJ0UG9pbnQ7CiAgICAgICAgICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoYm91bmRzKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIG9uRHJhZ0NhbGxiYWNrID0gZnVuY3Rpb24gKHN0YXJ0UG9pbnQsIGVuZFBvaW50KSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1vZGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIERSQUdfTU9ERVMubmV3Qm94OgogICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodC54ID0gZW5kUG9pbnQueDsKICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQueSA9IGVuZFBvaW50Lnk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgRFJBR19NT0RFUy5yZXNpemU6CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXNpemluZ0VkZ2VzLmJvdHRvbSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQueSA9IGVuZFBvaW50Lnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocmVzaXppbmdFZGdlcy50b3ApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQueSA9IGVuZFBvaW50Lnk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc2l6aW5nRWRnZXMucmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0LnggPSBlbmRQb2ludC54OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHJlc2l6aW5nRWRnZXMubGVmdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdC54ID0gZW5kUG9pbnQueDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIERSQUdfTU9ERVMubW92ZToKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGR4ID0gZW5kUG9pbnQueCAtIGxhc3RFbmRQb2ludC54OwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZHkgPSBlbmRQb2ludC55IC0gbGFzdEVuZFBvaW50Lnk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcExlZnQueCArPSBkeDsKICAgICAgICAgICAgICAgICAgICAgICAgdG9wTGVmdC55ICs9IGR5OwogICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodC54ICs9IGR4OwogICAgICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodC55ICs9IGR5OwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW5kUG9pbnQgPSBlbmRQb2ludDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBfdGhpcy5fc2V0Qm91bmRzKHsKICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0OiB0b3BMZWZ0LAogICAgICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiBib3R0b21SaWdodCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKF90aGlzLl94Qm91bmRzTW9kZSA9PT0gY29tcG9uZW50cy5Qcm9wZXJ0eU1vZGUuVkFMVUUgJiYgX3RoaXMueFNjYWxlKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLl9zZXRYRXh0ZW50KFtfdGhpcy54U2NhbGUoKS5pbnZlcnQodG9wTGVmdC54KSwgX3RoaXMueFNjYWxlKCkuaW52ZXJ0KGJvdHRvbVJpZ2h0LngpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3lCb3VuZHNNb2RlID09PSBjb21wb25lbnRzLlByb3BlcnR5TW9kZS5WQUxVRSAmJiBfdGhpcy55U2NhbGUoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldFlFeHRlbnQoW190aGlzLnlTY2FsZSgpLmludmVydCh0b3BMZWZ0LnkpLCBfdGhpcy55U2NhbGUoKS5pbnZlcnQoYm90dG9tUmlnaHQueSldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgX3RoaXMuX2RyYWdDYWxsYmFja3MuY2FsbENhbGxiYWNrcyhfdGhpcy5ib3VuZHMoKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBvbkRyYWdFbmRDYWxsYmFjayA9IGZ1bmN0aW9uIChzdGFydFBvaW50LCBlbmRQb2ludCkgewogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IERSQUdfTU9ERVMubmV3Qm94ICYmIHN0YXJ0UG9pbnQueCA9PT0gZW5kUG9pbnQueCAmJiBzdGFydFBvaW50LnkgPT09IGVuZFBvaW50LnkpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5ib3hWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoX3RoaXMuYm91bmRzKCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnU3RhcnQob25EcmFnU3RhcnRDYWxsYmFjayk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcob25EcmFnQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKG9uRHJhZ0VuZENhbGxiYWNrKTsKICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQob25EcmFnU3RhcnRDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBfdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcob25EcmFnQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKG9uRHJhZ0VuZENhbGxiYWNrKTsKICAgICAgICAgICAgICAgIF90aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLl9zZXR1cCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdmFyIGNyZWF0ZUxpbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYm94LmFwcGVuZCgibGluZSIpLnN0eWxlcyh7CiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLAogICAgICAgICAgICAgICAgc3Ryb2tlOiAicGluayIsCiAgICAgICAgICAgICAgICAicG9pbnRlci1ldmVudHMiOiAidmlzaWJsZVN0cm9rZSIsCiAgICAgICAgICAgIH0pOyB9OwogICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25FZGdlVCA9IGNyZWF0ZUxpbmUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtdGIiLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5fZGV0ZWN0aW9uRWRnZUIgPSBjcmVhdGVMaW5lKCkuY2xhc3NlZCgiZHJhZy1lZGdlLXRiIiwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbkVkZ2VMID0gY3JlYXRlTGluZSgpLmNsYXNzZWQoImRyYWctZWRnZS1sciIsIHRydWUpOwogICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25FZGdlUiA9IGNyZWF0ZUxpbmUoKS5jbGFzc2VkKCJkcmFnLWVkZ2UtbHIiLCB0cnVlKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgIHZhciBjcmVhdGVDb3JuZXIgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYm94LmFwcGVuZCgiY2lyY2xlIikKICAgICAgICAgICAgICAgICAgICAuc3R5bGVzKHsKICAgICAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLAogICAgICAgICAgICAgICAgICAgIGZpbGw6ICJwaW5rIiwKICAgICAgICAgICAgICAgICAgICAicG9pbnRlci1ldmVudHMiOiAidmlzaWJsZUZpbGwiLAogICAgICAgICAgICAgICAgfSk7IH07CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTCA9IGNyZWF0ZUNvcm5lcigpLmNsYXNzZWQoImRyYWctY29ybmVyLXRsIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25Db3JuZXJUUiA9IGNyZWF0ZUNvcm5lcigpLmNsYXNzZWQoImRyYWctY29ybmVyLXRyIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25Db3JuZXJCTCA9IGNyZWF0ZUNvcm5lcigpLmNsYXNzZWQoImRyYWctY29ybmVyLWJsIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUiA9IGNyZWF0ZUNvcm5lcigpLmNsYXNzZWQoImRyYWctY29ybmVyLWJyIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIERyYWdCb3hMYXllci5wcm90b3R5cGUuX2dldFJlc2l6aW5nRWRnZXMgPSBmdW5jdGlvbiAocCkgewogICAgICAgICAgICB2YXIgZWRnZXMgPSB7CiAgICAgICAgICAgICAgICB0b3A6IGZhbHNlLAogICAgICAgICAgICAgICAgYm90dG9tOiBmYWxzZSwKICAgICAgICAgICAgICAgIGxlZnQ6IGZhbHNlLAogICAgICAgICAgICAgICAgcmlnaHQ6IGZhbHNlLAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoIXRoaXMucmVzaXphYmxlKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlZGdlczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYm91bmRzID0gdGhpcy5ib3VuZHMoKTsKICAgICAgICAgICAgdmFyIHQgPSBib3VuZHMudG9wTGVmdC55OwogICAgICAgICAgICB2YXIgYiA9IGJvdW5kcy5ib3R0b21SaWdodC55OwogICAgICAgICAgICB2YXIgbCA9IGJvdW5kcy50b3BMZWZ0Lng7CiAgICAgICAgICAgIHZhciByID0gYm91bmRzLmJvdHRvbVJpZ2h0Lng7CiAgICAgICAgICAgIHZhciByYWQgPSB0aGlzLl9kZXRlY3Rpb25SYWRpdXM7CiAgICAgICAgICAgIGlmIChsIC0gcmFkIDw9IHAueCAmJiBwLnggPD0gciArIHJhZCkgewogICAgICAgICAgICAgICAgZWRnZXMudG9wID0gKHQgLSByYWQgPD0gcC55ICYmIHAueSA8PSB0ICsgcmFkKTsKICAgICAgICAgICAgICAgIGVkZ2VzLmJvdHRvbSA9IChiIC0gcmFkIDw9IHAueSAmJiBwLnkgPD0gYiArIHJhZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHQgLSByYWQgPD0gcC55ICYmIHAueSA8PSBiICsgcmFkKSB7CiAgICAgICAgICAgICAgICBlZGdlcy5sZWZ0ID0gKGwgLSByYWQgPD0gcC54ICYmIHAueCA8PSBsICsgcmFkKTsKICAgICAgICAgICAgICAgIGVkZ2VzLnJpZ2h0ID0gKHIgLSByYWQgPD0gcC54ICYmIHAueCA8PSByICsgcmFkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZWRnZXM7CiAgICAgICAgfTsKICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7CiAgICAgICAgICAgIGlmICh0aGlzLmJveFZpc2libGUoKSkgewogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IHRoaXMuYm91bmRzKCk7CiAgICAgICAgICAgICAgICB2YXIgdCA9IGJvdW5kcy50b3BMZWZ0Lnk7CiAgICAgICAgICAgICAgICB2YXIgYiA9IGJvdW5kcy5ib3R0b21SaWdodC55OwogICAgICAgICAgICAgICAgdmFyIGwgPSBib3VuZHMudG9wTGVmdC54OwogICAgICAgICAgICAgICAgdmFyIHIgPSBib3VuZHMuYm90dG9tUmlnaHQueDsKICAgICAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbkVkZ2VULmF0dHJzKHsKICAgICAgICAgICAgICAgICAgICB4MTogbCwgeTE6IHQsIHgyOiByLCB5MjogdCwKICAgICAgICAgICAgICAgICAgICAic3Ryb2tlLXdpZHRoIjogdGhpcy5fZGV0ZWN0aW9uUmFkaXVzICogMiwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fZGV0ZWN0aW9uRWRnZUIuYXR0cnMoewogICAgICAgICAgICAgICAgICAgIHgxOiBsLCB5MTogYiwgeDI6IHIsIHkyOiBiLAogICAgICAgICAgICAgICAgICAgICJzdHJva2Utd2lkdGgiOiB0aGlzLl9kZXRlY3Rpb25SYWRpdXMgKiAyLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25FZGdlTC5hdHRycyh7CiAgICAgICAgICAgICAgICAgICAgeDE6IGwsIHkxOiB0LCB4MjogbCwgeTI6IGIsCiAgICAgICAgICAgICAgICAgICAgInN0cm9rZS13aWR0aCI6IHRoaXMuX2RldGVjdGlvblJhZGl1cyAqIDIsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbkVkZ2VSLmF0dHJzKHsKICAgICAgICAgICAgICAgICAgICB4MTogciwgeTE6IHQsIHgyOiByLCB5MjogYiwKICAgICAgICAgICAgICAgICAgICAic3Ryb2tlLXdpZHRoIjogdGhpcy5fZGV0ZWN0aW9uUmFkaXVzICogMiwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0Nvcm5lcnMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25Db3JuZXJUTC5hdHRycyh7IGN4OiBsLCBjeTogdCwgcjogdGhpcy5fZGV0ZWN0aW9uUmFkaXVzIH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbkNvcm5lclRSLmF0dHJzKHsgY3g6IHIsIGN5OiB0LCByOiB0aGlzLl9kZXRlY3Rpb25SYWRpdXMgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGV0ZWN0aW9uQ29ybmVyQkwuYXR0cnMoeyBjeDogbCwgY3k6IGIsIHI6IHRoaXMuX2RldGVjdGlvblJhZGl1cyB9KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25Db3JuZXJCUi5hdHRycyh7IGN4OiByLCBjeTogYiwgcjogdGhpcy5fZGV0ZWN0aW9uUmFkaXVzIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5kZXRlY3Rpb25SYWRpdXMgPSBmdW5jdGlvbiAocikgewogICAgICAgICAgICBpZiAociA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyIDwgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkZXRlY3Rpb24gcmFkaXVzIGNhbm5vdCBiZSBuZWdhdGl2ZS4iKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kZXRlY3Rpb25SYWRpdXMgPSByOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIERyYWdCb3hMYXllci5wcm90b3R5cGUucmVzaXphYmxlID0gZnVuY3Rpb24gKGNhblJlc2l6ZSkgewogICAgICAgICAgICBpZiAoY2FuUmVzaXplID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXNpemFibGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVzaXphYmxlID0gY2FuUmVzaXplOwogICAgICAgICAgICB0aGlzLl9zZXRSZXNpemFibGVDbGFzc2VzKGNhblJlc2l6ZSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLy8gU2V0cyByZXNpemFibGUgY2xhc3Nlcy4gT3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzIHRoYXQgb25seSByZXNpemUgaW4gb25lIGRpbWVuc2lvbi4KICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzID0gZnVuY3Rpb24gKGNhblJlc2l6ZSkgewogICAgICAgICAgICBpZiAoY2FuUmVzaXplICYmIHRoaXMuZW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOwogICAgICAgICAgICAgICAgdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoIngtcmVzaXphYmxlIik7CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCJ5LXJlc2l6YWJsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLm1vdmFibGUgPSBmdW5jdGlvbiAobW92YWJsZSkgewogICAgICAgICAgICBpZiAobW92YWJsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbW92YWJsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tb3ZhYmxlID0gbW92YWJsZTsKICAgICAgICAgICAgdGhpcy5fc2V0TW92YWJsZUNsYXNzKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5fc2V0TW92YWJsZUNsYXNzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5tb3ZhYmxlKCkgJiYgdGhpcy5lbmFibGVkKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkQ2xhc3MoIm1vdmFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoIm1vdmFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnQm94Q2FsbGJhY2t9IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0RyYWdCb3hMYXllcn0gVGhlIGNhbGxpbmcgRHJhZ0JveExheWVyLgogICAgICAgICAqLwogICAgICAgIERyYWdCb3hMYXllci5wcm90b3R5cGUub25EcmFnU3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RHJhZ0JveENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtEcmFnQm94TGF5ZXJ9IFRoZSBjYWxsaW5nIERyYWdCb3hMYXllci4KICAgICAgICAgKi8KICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLm9mZkRyYWdTdGFydCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIGR1cmluZyBkcmFnZ2luZy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RHJhZ0JveENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtEcmFnQm94TGF5ZXJ9IFRoZSBjYWxsaW5nIERyYWdCb3hMYXllci4KICAgICAgICAgKi8KICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLm9uRHJhZyA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9kcmFnQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBkdXJpbmcgZHJhZ2dpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RyYWdCb3hDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RHJhZ0JveExheWVyfSBUaGUgY2FsbGluZyBEcmFnQm94TGF5ZXIuCiAgICAgICAgICovCiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5vZmZEcmFnID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgZW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RHJhZ0JveENhbGxiYWNrfSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtEcmFnQm94TGF5ZXJ9IFRoZSBjYWxsaW5nIERyYWdCb3hMYXllci4KICAgICAgICAgKi8KICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLm9uRHJhZ0VuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCB3aGVuIGRyYWdnaW5nIGVuZHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RyYWdCb3hDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RHJhZ0JveExheWVyfSBUaGUgY2FsbGluZyBEcmFnQm94TGF5ZXIuCiAgICAgICAgICovCiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5vZmZEcmFnRW5kID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBpbnRlcm5hbCBJbnRlcmFjdGlvbnMuRHJhZyBvZiB0aGUgRHJhZ0JveExheWVyLgogICAgICAgICAqLwogICAgICAgIERyYWdCb3hMYXllci5wcm90b3R5cGUuZHJhZ0ludGVyYWN0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJhZ0ludGVyYWN0aW9uOwogICAgICAgIH07CiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5lbmFibGVkID0gZnVuY3Rpb24gKGVuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5lbmFibGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoZW5hYmxlZCk7CiAgICAgICAgICAgIHRoaXMuX3NldFJlc2l6YWJsZUNsYXNzZXModGhpcy5yZXNpemFibGUoKSk7CiAgICAgICAgICAgIHRoaXMuX3NldE1vdmFibGVDbGFzcygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIERyYWdCb3hMYXllci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykgeyByZXR1cm4gX3RoaXMuX2RyYWdDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsgfSk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdDYWxsYmFja3MuZm9yRWFjaChmdW5jdGlvbiAoY2FsbGJhY2spIHsgcmV0dXJuIF90aGlzLl9kcmFnQ2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7IH0pOwogICAgICAgICAgICB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7IHJldHVybiBfdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOyB9KTsKICAgICAgICAgICAgdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uKCk7CiAgICAgICAgfTsKICAgICAgICBEcmFnQm94TGF5ZXIucHJvdG90eXBlLmRldGFjaCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fcmVzZXRTdGF0ZSgpOwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGV0YWNoLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5hbmNob3IgPSBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbiA9IGNvZXJjZUQzLmNvZXJjZUV4dGVybmFsRDMoc2VsZWN0aW9uKTsKICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpOwogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmFuY2hvci5jYWxsKHRoaXMsIHNlbGVjdGlvbik7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRHJhZ0JveExheWVyLnByb3RvdHlwZS5fcmVzZXRTdGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5ib3VuZHMoewogICAgICAgICAgICAgICAgdG9wTGVmdDogeyB4OiAwLCB5OiAwIH0sCiAgICAgICAgICAgICAgICBib3R0b21SaWdodDogeyB4OiAwLCB5OiAwIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIERyYWdCb3hMYXllcjsKICAgIH0oc2VsZWN0aW9uQm94TGF5ZXIuU2VsZWN0aW9uQm94TGF5ZXIpKTsKICAgIGV4cG9ydHMuRHJhZ0JveExheWVyID0gRHJhZ0JveExheWVyOwogICAgfSk7CgogICAgdmFyIGd1aWRlTGluZUxheWVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCiAgICB2YXIgUHJvcGVydHlNb2RlOwogICAgKGZ1bmN0aW9uIChQcm9wZXJ0eU1vZGUpIHsKICAgICAgICBQcm9wZXJ0eU1vZGVbUHJvcGVydHlNb2RlWyJWQUxVRSJdID0gMF0gPSAiVkFMVUUiOwogICAgICAgIFByb3BlcnR5TW9kZVtQcm9wZXJ0eU1vZGVbIlBJWEVMIl0gPSAxXSA9ICJQSVhFTCI7CiAgICB9KShQcm9wZXJ0eU1vZGUgfHwgKFByb3BlcnR5TW9kZSA9IHt9KSk7CiAgICB2YXIgR3VpZGVMaW5lTGF5ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhHdWlkZUxpbmVMYXllciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBHdWlkZUxpbmVMYXllcihvcmllbnRhdGlvbikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fbW9kZSA9IFByb3BlcnR5TW9kZS5WQUxVRTsKICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9PSBHdWlkZUxpbmVMYXllci5PUklFTlRBVElPTl9WRVJUSUNBTCAmJiBvcmllbnRhdGlvbiAhPT0gR3VpZGVMaW5lTGF5ZXIuT1JJRU5UQVRJT05fSE9SSVpPTlRBTCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG9yaWVudGF0aW9uICsgIiBpcyBub3QgYSB2YWxpZCBvcmllbnRhdGlvbiBmb3IgR3VpZGVMaW5lTGF5ZXIiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfdGhpcy5fb3JpZW50YXRpb24gPSBvcmllbnRhdGlvbjsKICAgICAgICAgICAgX3RoaXMuX292ZXJmbG93SGlkZGVuID0gdHJ1ZTsKICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoImd1aWRlLWxpbmUtbGF5ZXIiKTsKICAgICAgICAgICAgaWYgKF90aGlzLl9pc1ZlcnRpY2FsKCkpIHsKICAgICAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJ2ZXJ0aWNhbCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoImhvcml6b250YWwiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfdGhpcy5fc2NhbGVVcGRhdGVDYWxsYmFjayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIF90aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7CiAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuX3NldHVwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9ndWlkZUxpbmUgPSB0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5jbGFzc2VkKCJndWlkZS1saW5lIiwgdHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuX3NpemVGcm9tT2ZmZXIgPSBmdW5jdGlvbiAoYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgd2lkdGg6IGF2YWlsYWJsZVdpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBhdmFpbGFibGVIZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuX2lzVmVydGljYWwgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbiA9PT0gR3VpZGVMaW5lTGF5ZXIuT1JJRU5UQVRJT05fVkVSVElDQUw7CiAgICAgICAgfTsKICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuZml4ZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuZml4ZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgR3VpZGVMaW5lTGF5ZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQgPSBmdW5jdGlvbiAob3JpZ2luLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsIG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7CiAgICAgICAgICAgIGlmICh0aGlzLnNjYWxlKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwoKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2NhbGUoKS5yYW5nZShbMCwgdGhpcy53aWR0aCgpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYWxlKCkucmFuZ2UoW3RoaXMuaGVpZ2h0KCksIDBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEd1aWRlTGluZUxheWVyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMuX2d1aWRlTGluZS5hdHRycyh7CiAgICAgICAgICAgICAgICB4MTogdGhpcy5faXNWZXJ0aWNhbCgpID8gdGhpcy5waXhlbFBvc2l0aW9uKCkgOiAwLAogICAgICAgICAgICAgICAgeTE6IHRoaXMuX2lzVmVydGljYWwoKSA/IDAgOiB0aGlzLnBpeGVsUG9zaXRpb24oKSwKICAgICAgICAgICAgICAgIHgyOiB0aGlzLl9pc1ZlcnRpY2FsKCkgPyB0aGlzLnBpeGVsUG9zaXRpb24oKSA6IHRoaXMud2lkdGgoKSwKICAgICAgICAgICAgICAgIHkyOiB0aGlzLl9pc1ZlcnRpY2FsKCkgPyB0aGlzLmhlaWdodCgpIDogdGhpcy5waXhlbFBvc2l0aW9uKCksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8vIHNldHMgcGl4ZWxQb3NpdGlvbigpIG9yIHZhbHVlKCkgYmFzZWQgb24gdGhlIG90aGVyLCBkZXBlbmRpbmcgb24gd2hpY2ggd2FzIHRoZSBsYXN0IG9uZSBzZXQKICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjYWxlKCkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9tb2RlID09PSBQcm9wZXJ0eU1vZGUuVkFMVUUgJiYgdGhpcy52YWx1ZSgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BpeGVsUG9zaXRpb24gPSB0aGlzLnNjYWxlKCkuc2NhbGUodGhpcy52YWx1ZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9tb2RlID09PSBQcm9wZXJ0eU1vZGUuUElYRUwgJiYgdGhpcy5waXhlbFBvc2l0aW9uKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB0aGlzLnNjYWxlKCkuaW52ZXJ0KHRoaXMucGl4ZWxQb3NpdGlvbigpKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgR3VpZGVMaW5lTGF5ZXIucHJvdG90eXBlLl9zZXRQaXhlbFBvc2l0aW9uV2l0aG91dENoYW5naW5nTW9kZSA9IGZ1bmN0aW9uIChwaXhlbFBvc2l0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3BpeGVsUG9zaXRpb24gPSBwaXhlbFBvc2l0aW9uOwogICAgICAgICAgICBpZiAodGhpcy5zY2FsZSgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdGhpcy5zY2FsZSgpLmludmVydCh0aGlzLnBpeGVsUG9zaXRpb24oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICB9OwogICAgICAgIEd1aWRlTGluZUxheWVyLnByb3RvdHlwZS5zY2FsZSA9IGZ1bmN0aW9uIChzY2FsZSkgewogICAgICAgICAgICBpZiAoc2NhbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBwcmV2aW91c1NjYWxlID0gdGhpcy5fc2NhbGU7CiAgICAgICAgICAgIGlmIChwcmV2aW91c1NjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHByZXZpb3VzU2NhbGUub2ZmVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NjYWxlID0gc2NhbGU7CiAgICAgICAgICAgIHRoaXMuX3NjYWxlLm9uVXBkYXRlKHRoaXMuX3NjYWxlVXBkYXRlQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9zeW5jUGl4ZWxQb3NpdGlvbkFuZFZhbHVlKCk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgR3VpZGVMaW5lTGF5ZXIucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24gKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fbW9kZSA9IFByb3BlcnR5TW9kZS5WQUxVRTsKICAgICAgICAgICAgdGhpcy5fc3luY1BpeGVsUG9zaXRpb25BbmRWYWx1ZSgpOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEd1aWRlTGluZUxheWVyLnByb3RvdHlwZS5waXhlbFBvc2l0aW9uID0gZnVuY3Rpb24gKHBpeGVsUG9zaXRpb24pIHsKICAgICAgICAgICAgaWYgKHBpeGVsUG9zaXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BpeGVsUG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihwaXhlbFBvc2l0aW9uKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJwaXhlbFBvc2l0aW9uIG11c3QgYmUgYSBmaW5pdGUgbnVtYmVyIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGl4ZWxQb3NpdGlvbiA9IHBpeGVsUG9zaXRpb247CiAgICAgICAgICAgIHRoaXMuX21vZGUgPSBQcm9wZXJ0eU1vZGUuUElYRUw7CiAgICAgICAgICAgIHRoaXMuX3N5bmNQaXhlbFBvc2l0aW9uQW5kVmFsdWUoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBHdWlkZUxpbmVMYXllci5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7CiAgICAgICAgICAgIGlmICh0aGlzLnNjYWxlKCkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5zY2FsZSgpLm9mZlVwZGF0ZSh0aGlzLl9zY2FsZVVwZGF0ZUNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgR3VpZGVMaW5lTGF5ZXIuT1JJRU5UQVRJT05fVkVSVElDQUwgPSAidmVydGljYWwiOwogICAgICAgIEd1aWRlTGluZUxheWVyLk9SSUVOVEFUSU9OX0hPUklaT05UQUwgPSAiaG9yaXpvbnRhbCI7CiAgICAgICAgcmV0dXJuIEd1aWRlTGluZUxheWVyOwogICAgfShjb21wb25lbnQuQ29tcG9uZW50KSk7CiAgICBleHBvcnRzLkd1aWRlTGluZUxheWVyID0gR3VpZGVMaW5lTGF5ZXI7CiAgICB9KTsKCiAgICB2YXIgZHJhZ0xpbmVMYXllciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKICAgIHZhciBEcmFnTGluZUxheWVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoRHJhZ0xpbmVMYXllciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBEcmFnTGluZUxheWVyKG9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG9yaWVudGF0aW9uKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fZGV0ZWN0aW9uUmFkaXVzID0gMzsKICAgICAgICAgICAgX3RoaXMuX2VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygiZHJhZy1saW5lLWxheWVyIik7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJlbmFibGVkIik7CiAgICAgICAgICAgIF90aGlzLl9kcmFnSW50ZXJhY3Rpb24gPSBuZXcgaW50ZXJhY3Rpb25zLkRyYWcoKTsKICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5hdHRhY2hUbyhfdGhpcyk7CiAgICAgICAgICAgIHZhciBvbkxpbmUgPSBmdW5jdGlvbiAocCkgewogICAgICAgICAgICAgICAgcmV0dXJuIChfdGhpcy5faXNWZXJ0aWNhbCgpICYmCiAgICAgICAgICAgICAgICAgICAgX3RoaXMucGl4ZWxQb3NpdGlvbigpIC0gX3RoaXMuZGV0ZWN0aW9uUmFkaXVzKCkgPD0gcC54ICYmCiAgICAgICAgICAgICAgICAgICAgcC54IDw9IF90aGlzLnBpeGVsUG9zaXRpb24oKSArIF90aGlzLmRldGVjdGlvblJhZGl1cygpKSB8fAogICAgICAgICAgICAgICAgICAgICghX3RoaXMuX2lzVmVydGljYWwoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5waXhlbFBvc2l0aW9uKCkgLSBfdGhpcy5kZXRlY3Rpb25SYWRpdXMoKSA8PSBwLnkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgcC55IDw9IF90aGlzLnBpeGVsUG9zaXRpb24oKSArIF90aGlzLmRldGVjdGlvblJhZGl1cygpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGRyYWdnaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBpbnRlcmFjdGlvbkRyYWdTdGFydENhbGxiYWNrID0gZnVuY3Rpb24gKHN0YXJ0KSB7CiAgICAgICAgICAgICAgICBpZiAob25MaW5lKHN0YXJ0KSkgewogICAgICAgICAgICAgICAgICAgIGRyYWdnaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmNhbGxDYWxsYmFja3MoX3RoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KGludGVyYWN0aW9uRHJhZ1N0YXJ0Q2FsbGJhY2spOwogICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25EcmFnQ2FsbGJhY2sgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkgewogICAgICAgICAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX3NldFBpeGVsUG9zaXRpb25XaXRob3V0Q2hhbmdpbmdNb2RlKF90aGlzLl9pc1ZlcnRpY2FsKCkgPyBlbmQueCA6IGVuZC55KTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZHJhZ0NhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKF90aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWcoaW50ZXJhY3Rpb25EcmFnQ2FsbGJhY2spOwogICAgICAgICAgICB2YXIgaW50ZXJhY3Rpb25EcmFnRW5kQ2FsbGJhY2sgPSBmdW5jdGlvbiAoc3RhcnQsIGVuZCkgewogICAgICAgICAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5jYWxsQ2FsbGJhY2tzKF90aGlzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vbkRyYWdFbmQoaW50ZXJhY3Rpb25EcmFnRW5kQ2FsbGJhY2spOwogICAgICAgICAgICBfdGhpcy5fZGlzY29ubmVjdEludGVyYWN0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnU3RhcnQoaW50ZXJhY3Rpb25EcmFnU3RhcnRDYWxsYmFjayk7CiAgICAgICAgICAgICAgICBfdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9mZkRyYWcoaW50ZXJhY3Rpb25EcmFnQ2FsbGJhY2spOwogICAgICAgICAgICAgICAgX3RoaXMuX2RyYWdJbnRlcmFjdGlvbi5vZmZEcmFnRW5kKGludGVyYWN0aW9uRHJhZ0VuZENhbGxiYWNrKTsKICAgICAgICAgICAgICAgIF90aGlzLl9kcmFnSW50ZXJhY3Rpb24uZGV0YWNoKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIF90aGlzLl9kcmFnU3RhcnRDYWxsYmFja3MgPSBuZXcgdXRpbHMkMS5DYWxsYmFja1NldCgpOwogICAgICAgICAgICBfdGhpcy5fZHJhZ0NhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIF90aGlzLl9kcmFnRW5kQ2FsbGJhY2tzID0gbmV3IHV0aWxzJDEuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBEcmFnTGluZUxheWVyLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbkVkZ2UgPSB0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImxpbmUiKS5zdHlsZXMoewogICAgICAgICAgICAgICAgb3BhY2l0eTogMCwKICAgICAgICAgICAgICAgIHN0cm9rZTogInBpbmsiLAogICAgICAgICAgICAgICAgInBvaW50ZXItZXZlbnRzIjogInZpc2libGVTdHJva2UiLAogICAgICAgICAgICB9KS5jbGFzc2VkKCJkcmFnLWVkZ2UiLCB0cnVlKTsKICAgICAgICB9OwogICAgICAgIERyYWdMaW5lTGF5ZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbkVkZ2UuYXR0cnMoewogICAgICAgICAgICAgICAgeDE6IHRoaXMuX2lzVmVydGljYWwoKSA/IHRoaXMucGl4ZWxQb3NpdGlvbigpIDogMCwKICAgICAgICAgICAgICAgIHkxOiB0aGlzLl9pc1ZlcnRpY2FsKCkgPyAwIDogdGhpcy5waXhlbFBvc2l0aW9uKCksCiAgICAgICAgICAgICAgICB4MjogdGhpcy5faXNWZXJ0aWNhbCgpID8gdGhpcy5waXhlbFBvc2l0aW9uKCkgOiB0aGlzLndpZHRoKCksCiAgICAgICAgICAgICAgICB5MjogdGhpcy5faXNWZXJ0aWNhbCgpID8gdGhpcy5oZWlnaHQoKSA6IHRoaXMucGl4ZWxQb3NpdGlvbigpLAogICAgICAgICAgICAgICAgInN0cm9rZS13aWR0aCI6IHRoaXMuX2RldGVjdGlvblJhZGl1cyAqIDIsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIERyYWdMaW5lTGF5ZXIucHJvdG90eXBlLmRldGVjdGlvblJhZGl1cyA9IGZ1bmN0aW9uIChkZXRlY3Rpb25SYWRpdXMpIHsKICAgICAgICAgICAgaWYgKGRldGVjdGlvblJhZGl1cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZGV0ZWN0aW9uUmFkaXVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkZXRlY3Rpb25SYWRpdXMgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoImRldGVjdGlvbiByYWRpdXMgY2Fubm90IGJlIG5lZ2F0aXZlLiIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvblJhZGl1cyA9IGRldGVjdGlvblJhZGl1czsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBEcmFnTGluZUxheWVyLnByb3RvdHlwZS5lbmFibGVkID0gZnVuY3Rpb24gKGVuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICAgICAgIGlmIChlbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZENsYXNzKCJlbmFibGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZUNsYXNzKCJlbmFibGVkIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoZW5hYmxlZCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgY2FsbGJhY2sgdG8gYmUgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgc3RhcnRzLgogICAgICAgICAqIFRoZSBjYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgY2FsbGluZyBEcmFnTGluZUxheWVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnTGluZUNhbGxiYWNrPEQ+fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtEcmFnTGluZUxheWVyPEQ+fSBUaGUgY2FsbGluZyBEcmFnTGluZUxheWVyLgogICAgICAgICAqLwogICAgICAgIERyYWdMaW5lTGF5ZXIucHJvdG90eXBlLm9uRHJhZ1N0YXJ0ID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdTdGFydENhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIGRyYWdnaW5nIHN0YXJ0cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RHJhZ0xpbmVDYWxsYmFjazxEPn0gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RHJhZ0xpbmVMYXllcjxEPn0gVGhlIGNhbGxpbmcgRHJhZ0xpbmVMYXllci4KICAgICAgICAgKi8KICAgICAgICBEcmFnTGluZUxheWVyLnByb3RvdHlwZS5vZmZEcmFnU3RhcnQgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBkdXJpbmcgZHJhZ2dpbmcuCiAgICAgICAgICogVGhlIGNhbGxiYWNrIHdpbGwgYmUgcGFzc2VkIHRoZSBjYWxsaW5nIERyYWdMaW5lTGF5ZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RyYWdMaW5lQ2FsbGJhY2s8RD59IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybnMge0RyYWdMaW5lTGF5ZXI8RD59IFRoZSBjYWxsaW5nIERyYWdMaW5lTGF5ZXIuCiAgICAgICAgICovCiAgICAgICAgRHJhZ0xpbmVMYXllci5wcm90b3R5cGUub25EcmFnID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdDYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgY2FsbGJhY2sgdGhhdCB3b3VsZCBiZSBjYWxsZWQgZHVyaW5nIGRyYWdnaW5nLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnTGluZUNhbGxiYWNrPEQ+fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtEcmFnTGluZUxheWVyPEQ+fSBUaGUgY2FsbGluZyBEcmFnTGluZUxheWVyLgogICAgICAgICAqLwogICAgICAgIERyYWdMaW5lTGF5ZXIucHJvdG90eXBlLm9mZkRyYWcgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiBkcmFnZ2luZyBlbmRzLgogICAgICAgICAqIFRoZSBjYWxsYmFjayB3aWxsIGJlIHBhc3NlZCB0aGUgY2FsbGluZyBEcmFnTGluZUxheWVyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEcmFnTGluZUNhbGxiYWNrPEQ+fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm5zIHtEcmFnTGluZUxheWVyPEQ+fSBUaGUgY2FsbGluZyBEcmFnTGluZUxheWVyLgogICAgICAgICAqLwogICAgICAgIERyYWdMaW5lTGF5ZXIucHJvdG90eXBlLm9uRHJhZ0VuZCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLl9kcmFnRW5kQ2FsbGJhY2tzLmFkZChjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNhbGxiYWNrIHRoYXQgd291bGQgYmUgY2FsbGVkIHdoZW4gZHJhZ2dpbmcgZW5kcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RHJhZ0xpbmVDYWxsYmFjazxEPn0gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RHJhZ0xpbmVMYXllcjxEPn0gVGhlIGNhbGxpbmcgRHJhZ0xpbmVMYXllci4KICAgICAgICAgKi8KICAgICAgICBEcmFnTGluZUxheWVyLnByb3RvdHlwZS5vZmZEcmFnRW5kID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBEcmFnTGluZUxheWVyLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRlc3Ryb3kuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7IHJldHVybiBfdGhpcy5fZHJhZ1N0YXJ0Q2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7IH0pOwogICAgICAgICAgICB0aGlzLl9kcmFnQ2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7IHJldHVybiBfdGhpcy5fZHJhZ0NhbGxiYWNrcy5kZWxldGUoY2FsbGJhY2spOyB9KTsKICAgICAgICAgICAgdGhpcy5fZHJhZ0VuZENhbGxiYWNrcy5mb3JFYWNoKGZ1bmN0aW9uIChjYWxsYmFjaykgeyByZXR1cm4gX3RoaXMuX2RyYWdFbmRDYWxsYmFja3MuZGVsZXRlKGNhbGxiYWNrKTsgfSk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2Nvbm5lY3RJbnRlcmFjdGlvbigpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIERyYWdMaW5lTGF5ZXI7CiAgICB9KGd1aWRlTGluZUxheWVyLkd1aWRlTGluZUxheWVyKSk7CiAgICBleHBvcnRzLkRyYWdMaW5lTGF5ZXIgPSBEcmFnTGluZUxheWVyOwogICAgfSk7CgogICAgdmFyIGdyaWRsaW5lcyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCiAgICAvKioKICAgICAqIFJldHVybnMgbmV4dCBncmlkIHBvc2l0aW9uIGJhc2VkIG9uIHRpY2sgdmFsdWUKICAgICAqCiAgICAgKiBAcGFyYW0gc2NhbGUgU2NhbGUgdXNlZCBieSB0aGUgZ3JpZAogICAgICogQHBhcmFtIGJldHdlZW4gVmFsdWUgZGVub3Rpbmcgd2hldGhlciB0aGUgZ3JpZCByZW5kZXJzIGJldHdlZW4gdGlja3Mgb3Igb24gdGlja3MKICAgICAqIEBwYXJhbSBvcmRlcmVkVGlja3MgQWxsIHRpY2tzIGluIG9yZGVyLiBvbmx5IG5lZWRlZCB3aGVuIHJlbmRlcmluZyBsaW5lcyBiZXR3ZWVuIHRpY2tzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdyaWRQb3NpdGlvbkZhY3Rvcnkoc2NhbGUsIGJldHdlZW4sIG9yZGVyZWRUaWNrcykgewogICAgICAgIHZhciBwcmV2aW91c1RpY2sgPSB7fTsKICAgICAgICBpZiAob3JkZXJlZFRpY2tzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvcmRlcmVkVGlja3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBwcmV2aW91cyA9IG9yZGVyZWRUaWNrc1tpIC0gMV07CiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9IG9yZGVyZWRUaWNrc1tpXTsKICAgICAgICAgICAgICAgIHByZXZpb3VzVGlja1tjdXJyZW50XSA9IHByZXZpb3VzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmdW5jdGlvbiAodGlja1ZhbCkgewogICAgICAgICAgICB2YXIgcG9zaXRpb24gPSBzY2FsZS5zY2FsZSh0aWNrVmFsKTsKICAgICAgICAgICAgaWYgKCFiZXR3ZWVuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGdyaWRQb3NpdGlvbjsKICAgICAgICAgICAgdmFyIHByZXZpb3VzUG9zaXRpb24gPSBwcmV2aW91c1RpY2tbdGlja1ZhbF0gPT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgPyB1bmRlZmluZWQKICAgICAgICAgICAgICAgIDogc2NhbGUuc2NhbGUocHJldmlvdXNUaWNrW3RpY2tWYWxdKTsKICAgICAgICAgICAgaWYgKHByZXZpb3VzUG9zaXRpb24gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZ3JpZFBvc2l0aW9uID0gcHJldmlvdXNQb3NpdGlvbiArIChwb3NpdGlvbiAtIHByZXZpb3VzUG9zaXRpb24pIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZ3JpZFBvc2l0aW9uOwogICAgICAgIH07CiAgICB9CiAgICB2YXIgR3JpZGxpbmVzID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoR3JpZGxpbmVzLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7U2NhbGV9IHhTY2FsZSBUaGUgc2NhbGUgdG8gYmFzZSB0aGUgeCBncmlkbGluZXMgb24uIFBhc3MgbnVsbCBpZiBubyBncmlkbGluZXMgYXJlIGRlc2lyZWQuCiAgICAgICAgICogQHBhcmFtIHtTY2FsZX0geVNjYWxlIFRoZSBzY2FsZSB0byBiYXNlIHRoZSB5IGdyaWRsaW5lcyBvbi4gUGFzcyBudWxsIGlmIG5vIGdyaWRsaW5lcyBhcmUgZGVzaXJlZC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBHcmlkbGluZXMoeFNjYWxlLCB5U2NhbGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoImdyaWRsaW5lcyIpOwogICAgICAgICAgICBfdGhpcy5feFNjYWxlID0geFNjYWxlOwogICAgICAgICAgICBfdGhpcy5feVNjYWxlID0geVNjYWxlOwogICAgICAgICAgICBfdGhpcy5fcmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoc2NhbGUpIHsgcmV0dXJuIF90aGlzLnJlbmRlcigpOyB9OwogICAgICAgICAgICBpZiAoX3RoaXMuX3hTY2FsZSkgewogICAgICAgICAgICAgICAgX3RoaXMuX3hTY2FsZS5vblVwZGF0ZShfdGhpcy5fcmVuZGVyQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChfdGhpcy5feVNjYWxlKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5feVNjYWxlLm9uVXBkYXRlKF90aGlzLl9yZW5kZXJDYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBHcmlkbGluZXMucHJvdG90eXBlLmJldHdlZW5YID0gZnVuY3Rpb24gKF9iZXR3ZWVuWCkgewogICAgICAgICAgICBpZiAoX2JldHdlZW5YID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9iZXR3ZWVuWDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoX2JldHdlZW5YICE9PSB0aGlzLl9iZXR3ZWVuWCkgewogICAgICAgICAgICAgICAgdGhpcy5fYmV0d2VlblggPSBfYmV0d2Vlblg7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgR3JpZGxpbmVzLnByb3RvdHlwZS5iZXR3ZWVuWSA9IGZ1bmN0aW9uIChfYmV0d2VlblkpIHsKICAgICAgICAgICAgaWYgKF9iZXR3ZWVuWSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmV0d2Vlblk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKF9iZXR3ZWVuWSAhPT0gdGhpcy5fYmV0d2VlblkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2JldHdlZW5ZID0gX2JldHdlZW5ZOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEdyaWRsaW5lcy5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7CiAgICAgICAgICAgIGlmICh0aGlzLl94U2NhbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3hTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl95U2NhbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3lTY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgR3JpZGxpbmVzLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3hMaW5lc0NvbnRhaW5lciA9IHRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoIngtZ3JpZGxpbmVzIiwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3lMaW5lc0NvbnRhaW5lciA9IHRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoInktZ3JpZGxpbmVzIiwgdHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICBHcmlkbGluZXMucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3JlZHJhd1hMaW5lcygpOwogICAgICAgICAgICB0aGlzLl9yZWRyYXdZTGluZXMoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBHcmlkbGluZXMucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQgPSBmdW5jdGlvbiAob3JpZ2luLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsIG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7CiAgICAgICAgICAgIGlmICh0aGlzLl94U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5feFNjYWxlLnJhbmdlKFswLCB0aGlzLndpZHRoKCldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5feVNjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3lTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwgMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgR3JpZGxpbmVzLnByb3RvdHlwZS5fcmVkcmF3WExpbmVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5feFNjYWxlKSB7CiAgICAgICAgICAgICAgICB2YXIgYmV0d2VlbiA9IHRoaXMuYmV0d2VlblgoKTsKICAgICAgICAgICAgICAgIHZhciB4VGlja3MgPSB0aGlzLl94U2NhbGUudGlja3MoKS5zbGljZShiZXR3ZWVuID8gMSA6IDApOwogICAgICAgICAgICAgICAgdmFyIHhMaW5lc1VwZGF0ZSA9IHRoaXMuX3hMaW5lc0NvbnRhaW5lci5zZWxlY3RBbGwoImxpbmUiKS5kYXRhKHhUaWNrcyk7CiAgICAgICAgICAgICAgICB2YXIgeExpbmVzID0geExpbmVzVXBkYXRlLmVudGVyKCkuYXBwZW5kKCJsaW5lIikubWVyZ2UoeExpbmVzVXBkYXRlKTsKICAgICAgICAgICAgICAgIHhMaW5lcy5hdHRyKCJ4MSIsIGdyaWRQb3NpdGlvbkZhY3RvcnkodGhpcy5feFNjYWxlLCBiZXR3ZWVuLCB0aGlzLl94U2NhbGUudGlja3MoKSkpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoInkxIiwgMCkKICAgICAgICAgICAgICAgICAgICAuYXR0cigieDIiLCBncmlkUG9zaXRpb25GYWN0b3J5KHRoaXMuX3hTY2FsZSwgYmV0d2VlbiwgdGhpcy5feFNjYWxlLnRpY2tzKCkpKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ5MiIsIHRoaXMuaGVpZ2h0KCkpCiAgICAgICAgICAgICAgICAgICAgLmNsYXNzZWQoImJldHdlZW5saW5lIiwgYmV0d2VlbikKICAgICAgICAgICAgICAgICAgICAuY2xhc3NlZCgiemVyb2xpbmUiLCBmdW5jdGlvbiAodCkgeyByZXR1cm4gdCA9PT0gMDsgfSk7CiAgICAgICAgICAgICAgICB4TGluZXNVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBHcmlkbGluZXMucHJvdG90eXBlLl9yZWRyYXdZTGluZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl95U2NhbGUpIHsKICAgICAgICAgICAgICAgIHZhciBiZXR3ZWVuID0gdGhpcy5iZXR3ZWVuWSgpOwogICAgICAgICAgICAgICAgdmFyIHlUaWNrcyA9IHRoaXMuX3lTY2FsZS50aWNrcygpLnNsaWNlKGJldHdlZW4gPyAxIDogMCk7CiAgICAgICAgICAgICAgICB2YXIgeUxpbmVzVXBkYXRlID0gdGhpcy5feUxpbmVzQ29udGFpbmVyLnNlbGVjdEFsbCgibGluZSIpLmRhdGEoeVRpY2tzKTsKICAgICAgICAgICAgICAgIHZhciB5TGluZXMgPSB5TGluZXNVcGRhdGUuZW50ZXIoKS5hcHBlbmQoImxpbmUiKS5tZXJnZSh5TGluZXNVcGRhdGUpOwogICAgICAgICAgICAgICAgeUxpbmVzLmF0dHIoIngxIiwgMCkKICAgICAgICAgICAgICAgICAgICAuYXR0cigieTEiLCBncmlkUG9zaXRpb25GYWN0b3J5KHRoaXMuX3lTY2FsZSwgYmV0d2VlbiwgdGhpcy5feVNjYWxlLnRpY2tzKCkpKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4MiIsIHRoaXMud2lkdGgoKSkKICAgICAgICAgICAgICAgICAgICAuYXR0cigieTIiLCBncmlkUG9zaXRpb25GYWN0b3J5KHRoaXMuX3lTY2FsZSwgYmV0d2VlbiwgdGhpcy5feVNjYWxlLnRpY2tzKCkpKQogICAgICAgICAgICAgICAgICAgIC5jbGFzc2VkKCJiZXR3ZWVubGluZSIsIGJldHdlZW4pCiAgICAgICAgICAgICAgICAgICAgLmNsYXNzZWQoInplcm9saW5lIiwgZnVuY3Rpb24gKHQpIHsgcmV0dXJuIHQgPT09IDA7IH0pOwogICAgICAgICAgICAgICAgeUxpbmVzVXBkYXRlLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEdyaWRsaW5lczsKICAgIH0oY29tcG9uZW50LkNvbXBvbmVudCkpOwogICAgZXhwb3J0cy5HcmlkbGluZXMgPSBHcmlkbGluZXM7CiAgICB9KTsKCiAgICB2YXIgY29tcG9uZW50Q29udGFpbmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCiAgICAvKgogICAgICogQ29tcG9uZW50Q29udGFpbmVyIGNsYXNzIGVuY2Fwc3VsYXRlcyBUYWJsZSBhbmQgQ29tcG9uZW50R3JvdXAncyBzaGFyZWQgZnVuY3Rpb25hbGl0eS4KICAgICAqIEl0IHdpbGwgbm90IGRvIGFueXRoaW5nIGlmIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KICAgICAqLwogICAgdmFyIENvbXBvbmVudENvbnRhaW5lciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKENvbXBvbmVudENvbnRhaW5lciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBDb21wb25lbnRDb250YWluZXIoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9kZXRhY2hDYWxsYmFjayA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsgcmV0dXJuIF90aGlzLnJlbW92ZShjb21wb25lbnQpOyB9OwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIENvbXBvbmVudENvbnRhaW5lci5wcm90b3R5cGUuYW5jaG9yID0gZnVuY3Rpb24gKHNlbGVjdGlvbikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBzZWxlY3Rpb24gPSBjb2VyY2VEMy5jb2VyY2VFeHRlcm5hbEQzKHNlbGVjdGlvbik7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuYW5jaG9yLmNhbGwodGhpcywgc2VsZWN0aW9uKTsKICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5hbmNob3IoX3RoaXMuZWxlbWVudCgpKTsgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50Q29udGFpbmVyLnByb3RvdHlwZS5yZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMucmVuZGVyKCk7IH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ29tcG9uZW50IGlzIGluIHRoZSBDb21wb25lbnRDb250YWluZXIuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50Q29udGFpbmVyLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiaGFzKCkgaXMgbm90IGltcGxlbWVudGVkIG9uIENvbXBvbmVudENvbnRhaW5lciIpOwogICAgICAgIH07CiAgICAgICAgQ29tcG9uZW50Q29udGFpbmVyLnByb3RvdHlwZS5fYWRvcHRBbmRBbmNob3IgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIGNvbXBvbmVudC5wYXJlbnQodGhpcyk7CiAgICAgICAgICAgIGNvbXBvbmVudC5vbkRldGFjaCh0aGlzLl9kZXRhY2hDYWxsYmFjayk7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0FuY2hvcmVkKSB7CiAgICAgICAgICAgICAgICBjb21wb25lbnQuYW5jaG9yKHRoaXMuZWxlbWVudCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgc3BlY2lmaWVkIENvbXBvbmVudCBmcm9tIHRoZSBDb21wb25lbnRDb250YWluZXIuCiAgICAgICAgICovCiAgICAgICAgQ29tcG9uZW50Q29udGFpbmVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhhcyhjb21wb25lbnQpKSB7CiAgICAgICAgICAgICAgICBjb21wb25lbnQub2ZmRGV0YWNoKHRoaXMuX2RldGFjaENhbGxiYWNrKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZShjb21wb25lbnQpOwogICAgICAgICAgICAgICAgY29tcG9uZW50LmRldGFjaCgpOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENhcnJ5IG91dCB0aGUgYWN0dWFsIHJlbW92YWwgb2YgYSBDb21wb25lbnQuCiAgICAgICAgICogSW1wbGVtZW50YXRpb24gZGVwZW5kZW50IG9uIHRoZSB0eXBlIG9mIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIENvbXBvbmVudCB3YXMgc3VjY2Vzc2Z1bGx5IHJlbW92ZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnRDb250YWluZXIucHJvdG90eXBlLl9yZW1vdmUgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEludm9rZXMgYSBjYWxsYmFjayBvbiBlYWNoIENvbXBvbmVudCBpbiB0aGUgQ29tcG9uZW50Q29udGFpbmVyLgogICAgICAgICAqLwogICAgICAgIENvbXBvbmVudENvbnRhaW5lci5wcm90b3R5cGUuX2ZvckVhY2ggPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJfZm9yRWFjaCgpIGlzIG5vdCBpbXBsZW1lbnRlZCBvbiBDb21wb25lbnRDb250YWluZXIiKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIERlc3Ryb3lzIHRoZSBDb21wb25lbnRDb250YWluZXIgYW5kIGFsbCBDb21wb25lbnRzIHdpdGhpbiBpdC4KICAgICAgICAgKi8KICAgICAgICBDb21wb25lbnRDb250YWluZXIucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLmRlc3Ryb3koKTsgfSk7CiAgICAgICAgfTsKICAgICAgICBDb21wb25lbnRDb250YWluZXIucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fZm9yRWFjaChmdW5jdGlvbiAoYykgeyByZXR1cm4gYy5pbnZhbGlkYXRlQ2FjaGUoKTsgfSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQ29tcG9uZW50Q29udGFpbmVyOwogICAgfShjb21wb25lbnQuQ29tcG9uZW50KSk7CiAgICBleHBvcnRzLkNvbXBvbmVudENvbnRhaW5lciA9IENvbXBvbmVudENvbnRhaW5lcjsKICAgIH0pOwoKICAgIHZhciBncm91cCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIEdyb3VwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoR3JvdXAsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIEdyb3VwLgogICAgICAgICAqCiAgICAgICAgICogQSBHcm91cCBjb250YWlucyBDb21wb25lbnRzIHRoYXQgd2lsbCBiZSByZW5kZXJlZCBvbiB0b3Agb2YgZWFjaCBvdGhlci4KICAgICAgICAgKiBDb21wb25lbnRzIGFkZGVkIGxhdGVyIHdpbGwgYmUgcmVuZGVyZWQgYWJvdmUgQ29tcG9uZW50cyBhbHJlYWR5IGluIHRoZSBHcm91cC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7Q29tcG9uZW50W119IFtjb21wb25lbnRzPVtdXSBDb21wb25lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZSBHcm91cC4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBHcm91cChjb21wb25lbnRzKSB7CiAgICAgICAgICAgIGlmIChjb21wb25lbnRzID09PSB2b2lkIDApIHsgY29tcG9uZW50cyA9IFtdOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9jb21wb25lbnRzID0gW107CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJjb21wb25lbnQtZ3JvdXAiKTsKICAgICAgICAgICAgY29tcG9uZW50cy5mb3JFYWNoKGZ1bmN0aW9uIChjKSB7IHJldHVybiBfdGhpcy5hcHBlbmQoYyk7IH0pOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIEdyb3VwLnByb3RvdHlwZS5fZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMoKS5mb3JFYWNoKGNhbGxiYWNrKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgQ29tcG9uZW50IGlzIGluIHRoZSBHcm91cC4KICAgICAgICAgKi8KICAgICAgICBHcm91cC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGNvbXBvbmVudCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29tcG9uZW50cy5pbmRleE9mKGNvbXBvbmVudCkgPj0gMDsKICAgICAgICB9OwogICAgICAgIEdyb3VwLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZSA9IGZ1bmN0aW9uIChvZmZlcmVkV2lkdGgsIG9mZmVyZWRIZWlnaHQpIHsKICAgICAgICAgICAgdmFyIHJlcXVlc3RzID0gdGhpcy5fY29tcG9uZW50cy5tYXAoZnVuY3Rpb24gKGMpIHsgcmV0dXJuIGMucmVxdWVzdGVkU3BhY2Uob2ZmZXJlZFdpZHRoLCBvZmZlcmVkSGVpZ2h0KTsgfSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBtaW5XaWR0aDogdXRpbHMkMS5NYXRoLm1heChyZXF1ZXN0cywgZnVuY3Rpb24gKHJlcXVlc3QpIHsgcmV0dXJuIHJlcXVlc3QubWluV2lkdGg7IH0sIDApLAogICAgICAgICAgICAgICAgbWluSGVpZ2h0OiB1dGlscyQxLk1hdGgubWF4KHJlcXVlc3RzLCBmdW5jdGlvbiAocmVxdWVzdCkgeyByZXR1cm4gcmVxdWVzdC5taW5IZWlnaHQ7IH0sIDApLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgR3JvdXAucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQgPSBmdW5jdGlvbiAob3JpZ2luLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsIG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7CiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgY29tcG9uZW50LmNvbXB1dGVMYXlvdXQoeyB4OiAwLCB5OiAwIH0sIF90aGlzLndpZHRoKCksIF90aGlzLmhlaWdodCgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgR3JvdXAucHJvdG90eXBlLl9zaXplRnJvbU9mZmVyID0gZnVuY3Rpb24gKGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHdpZHRoOiBhdmFpbGFibGVXaWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodDogYXZhaWxhYmxlSGVpZ2h0LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgR3JvdXAucHJvdG90eXBlLmZpeGVkV2lkdGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLmZpeGVkV2lkdGgoKTsgfSk7CiAgICAgICAgfTsKICAgICAgICBHcm91cC5wcm90b3R5cGUuZml4ZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzLmV2ZXJ5KGZ1bmN0aW9uIChjKSB7IHJldHVybiBjLmZpeGVkSGVpZ2h0KCk7IH0pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7Q29tcG9uZW50W119IFRoZSBDb21wb25lbnRzIGluIHRoaXMgR3JvdXAuCiAgICAgICAgICovCiAgICAgICAgR3JvdXAucHJvdG90eXBlLmNvbXBvbmVudHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21wb25lbnRzLnNsaWNlKCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgQ29tcG9uZW50IHRvIHRoaXMgR3JvdXAuCiAgICAgICAgICogVGhlIGFkZGVkIENvbXBvbmVudCB3aWxsIGJlIHJlbmRlcmVkIGFib3ZlIENvbXBvbmVudHMgYWxyZWFkeSBpbiB0aGUgR3JvdXAuCiAgICAgICAgICovCiAgICAgICAgR3JvdXAucHJvdG90eXBlLmFwcGVuZCA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsICYmICF0aGlzLmhhcyhjb21wb25lbnQpKSB7CiAgICAgICAgICAgICAgICBjb21wb25lbnQuZGV0YWNoKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb25lbnRzLnB1c2goY29tcG9uZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuX2Fkb3B0QW5kQW5jaG9yKGNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgR3JvdXAucHJvdG90eXBlLl9yZW1vdmUgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIHZhciByZW1vdmVJbmRleCA9IHRoaXMuX2NvbXBvbmVudHMuaW5kZXhPZihjb21wb25lbnQpOwogICAgICAgICAgICBpZiAocmVtb3ZlSW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50cy5zcGxpY2UocmVtb3ZlSW5kZXgsIDEpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEdyb3VwOwogICAgfShjb21wb25lbnRDb250YWluZXIuQ29tcG9uZW50Q29udGFpbmVyKSk7CiAgICBleHBvcnRzLkdyb3VwID0gR3JvdXA7CiAgICB9KTsKCiAgICB2YXIgaW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgoKICAgIHZhciBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKEludGVycG9sYXRlZENvbG9yTGVnZW5kLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQgY29uc2lzdHMgb2YgYSBzZXF1ZW5jZSBvZiBzd2F0Y2hlcyB0aGF0IHNob3cgdGhlCiAgICAgICAgICogYXNzb2NpYXRlZCBJbnRlcnBvbGF0ZWRDb2xvciBTY2FsZSBzYW1wbGVkIGF0IHZhcmlvdXMgcG9pbnRzLgogICAgICAgICAqIFR3byBsYWJlbHMgc2hvdyB0aGUgbWF4aW11bSBhbmQgbWluaW11bSB2YWx1ZXMgb2YgdGhlIEludGVycG9sYXRlZENvbG9yIFNjYWxlLgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtTY2FsZXMuSW50ZXJwb2xhdGVkQ29sb3J9IGludGVycG9sYXRlZENvbG9yU2NhbGUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZChpbnRlcnBvbGF0ZWRDb2xvclNjYWxlKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl90ZXh0UGFkZGluZyA9IDU7CiAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0ZWRDb2xvclNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQgcmVxdWlyZXMgYSBpbnRlcnBvbGF0ZWRDb2xvclNjYWxlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX3RoaXMuX3NjYWxlID0gaW50ZXJwb2xhdGVkQ29sb3JTY2FsZTsKICAgICAgICAgICAgX3RoaXMuX3JlZHJhd0NhbGxiYWNrID0gZnVuY3Rpb24gKHNjYWxlKSB7IHJldHVybiBfdGhpcy5yZWRyYXcoKTsgfTsKICAgICAgICAgICAgX3RoaXMuX3NjYWxlLm9uVXBkYXRlKF90aGlzLl9yZWRyYXdDYWxsYmFjayk7CiAgICAgICAgICAgIF90aGlzLl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzLmdlbmVyYWwoKTsKICAgICAgICAgICAgX3RoaXMuX29yaWVudGF0aW9uID0gImhvcml6b250YWwiOwogICAgICAgICAgICBfdGhpcy5fZXhwYW5kcyA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygibGVnZW5kIik7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJpbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIik7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9zY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spOwogICAgICAgIH07CiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQucHJvdG90eXBlLmZvcm1hdHRlciA9IGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdHRlciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdHRlciA9IGZvcm1hdHRlcjsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5wcm90b3R5cGUuZXhwYW5kcyA9IGZ1bmN0aW9uIChleHBhbmRzKSB7CiAgICAgICAgICAgIGlmIChleHBhbmRzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHBhbmRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2V4cGFuZHMgPSBleHBhbmRzOwogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yTGVnZW5kLl9lbnN1cmVPcmllbnRhdGlvbiA9IGZ1bmN0aW9uIChvcmllbnRhdGlvbikgewogICAgICAgICAgICBvcmllbnRhdGlvbiA9IG9yaWVudGF0aW9uLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiIHx8IG9yaWVudGF0aW9uID09PSAibGVmdCIgfHwgb3JpZW50YXRpb24gPT09ICJyaWdodCIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcmllbnRhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiXCIiICsgb3JpZW50YXRpb24gKyAiXCIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIEludGVycG9sYXRlZENvbG9yTGVnZW5kIik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yTGVnZW5kLnByb3RvdHlwZS5vcmllbnRhdGlvbiA9IGZ1bmN0aW9uIChvcmllbnRhdGlvbikgewogICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29yaWVudGF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fb3JpZW50YXRpb24gPSBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5fZW5zdXJlT3JpZW50YXRpb24ob3JpZW50YXRpb24pOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5wcm90b3R5cGUuZml4ZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmV4cGFuZHMoKSB8fCB0aGlzLl9pc1ZlcnRpY2FsKCk7CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5wcm90b3R5cGUuZml4ZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5leHBhbmRzKCkgfHwgIXRoaXMuX2lzVmVydGljYWwoKTsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yTGVnZW5kLnByb3RvdHlwZS5fZ2VuZXJhdGVUaWNrcyA9IGZ1bmN0aW9uIChudW1Td2F0Y2hlcykgewogICAgICAgICAgICBpZiAobnVtU3dhdGNoZXMgPT09IHZvaWQgMCkgeyBudW1Td2F0Y2hlcyA9IEludGVycG9sYXRlZENvbG9yTGVnZW5kLl9ERUZBVUxUX05VTV9TV0FUQ0hFUzsgfQogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fc2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIGlmIChudW1Td2F0Y2hlcyA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtkb21haW5bMF1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzbG9wZSA9IChkb21haW5bMV0gLSBkb21haW5bMF0pIC8gKG51bVN3YXRjaGVzIC0gMSk7CiAgICAgICAgICAgIHZhciB0aWNrcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG51bVN3YXRjaGVzOyBpKyspIHsKICAgICAgICAgICAgICAgIHRpY2tzLnB1c2goZG9tYWluWzBdICsgc2xvcGUgKiBpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGlja3M7CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5wcm90b3R5cGUuX3NldHVwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9zd2F0Y2hDb250YWluZXIgPSB0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKS5jbGFzc2VkKCJzd2F0Y2gtY29udGFpbmVyIiwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3N3YXRjaEJvdW5kaW5nQm94ID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJyZWN0IikuY2xhc3NlZCgic3dhdGNoLWJvdW5kaW5nLWJveCIsIHRydWUpOwogICAgICAgICAgICB0aGlzLl9sb3dlckxhYmVsID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5MRUdFTkRfTEFCRUxfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICB0aGlzLl91cHBlckxhYmVsID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZChJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5MRUdFTkRfTEFCRUxfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBzcmMkMS5TdmdDb250ZXh0KHRoaXMuY29udGVudCgpLm5vZGUoKSk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyID0gbmV3IHNyYyQxLk1lYXN1cmVyKGNvbnRleHQpOwogICAgICAgICAgICB0aGlzLl93cmFwcGVyID0gbmV3IHNyYyQxLldyYXBwZXIoKTsKICAgICAgICAgICAgdGhpcy5fd3JpdGVyID0gbmV3IHNyYyQxLldyaXRlcih0aGlzLl9tZWFzdXJlciwgY29udGV4dCwgdGhpcy5fd3JhcHBlcik7CiAgICAgICAgfTsKICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2UgPSBmdW5jdGlvbiAob2ZmZXJlZFdpZHRoLCBvZmZlcmVkSGVpZ2h0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciB0ZXh0SGVpZ2h0ID0gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSgpLmhlaWdodDsKICAgICAgICAgICAgdmFyIHBhZGRpbmcgPSB0ZXh0SGVpZ2h0OwogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fc2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIHZhciBsYWJlbFdpZHRocyA9IGRvbWFpbi5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIF90aGlzLl9tZWFzdXJlci5tZWFzdXJlKF90aGlzLl9mb3JtYXR0ZXIoZCkpLndpZHRoOyB9KTsKICAgICAgICAgICAgdmFyIGRlc2lyZWRIZWlnaHQ7CiAgICAgICAgICAgIHZhciBkZXNpcmVkV2lkdGg7CiAgICAgICAgICAgIHZhciBudW1Td2F0Y2hlcyA9IEludGVycG9sYXRlZENvbG9yTGVnZW5kLl9ERUZBVUxUX05VTV9TV0FUQ0hFUzsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwoKSkgewogICAgICAgICAgICAgICAgdmFyIGxvbmdlc3RXaWR0aCA9IHV0aWxzJDEuTWF0aC5tYXgobGFiZWxXaWR0aHMsIDApOwogICAgICAgICAgICAgICAgZGVzaXJlZFdpZHRoID0gcGFkZGluZyArIHRleHRIZWlnaHQgKyB0aGlzLl90ZXh0UGFkZGluZyArIGxvbmdlc3RXaWR0aCArIHRoaXMuX3RleHRQYWRkaW5nOwogICAgICAgICAgICAgICAgZGVzaXJlZEhlaWdodCA9IG51bVN3YXRjaGVzICogdGV4dEhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRlc2lyZWRIZWlnaHQgPSBwYWRkaW5nICsgdGV4dEhlaWdodCArIHBhZGRpbmc7CiAgICAgICAgICAgICAgICBkZXNpcmVkV2lkdGggPSB0aGlzLl90ZXh0UGFkZGluZyArIGxhYmVsV2lkdGhzWzBdICsgbnVtU3dhdGNoZXMgKiB0ZXh0SGVpZ2h0CiAgICAgICAgICAgICAgICAgICAgKyBsYWJlbFdpZHRoc1sxXSArIHRoaXMuX3RleHRQYWRkaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBtaW5XaWR0aDogZGVzaXJlZFdpZHRoLAogICAgICAgICAgICAgICAgbWluSGVpZ2h0OiBkZXNpcmVkSGVpZ2h0LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQucHJvdG90eXBlLl9pc1ZlcnRpY2FsID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3JpZW50YXRpb24gIT09ICJob3Jpem9udGFsIjsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yTGVnZW5kLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgZG9tYWluID0gdGhpcy5fc2NhbGUuZG9tYWluKCk7CiAgICAgICAgICAgIHZhciB0ZXh0MCA9IHRoaXMuX2Zvcm1hdHRlcihkb21haW5bMF0pOwogICAgICAgICAgICB2YXIgdGV4dDBXaWR0aCA9IHRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGV4dDApLndpZHRoOwogICAgICAgICAgICB2YXIgdGV4dDEgPSB0aGlzLl9mb3JtYXR0ZXIoZG9tYWluWzFdKTsKICAgICAgICAgICAgdmFyIHRleHQxV2lkdGggPSB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRleHQxKS53aWR0aDsKICAgICAgICAgICAgdmFyIHRleHRIZWlnaHQgPSB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKCkuaGVpZ2h0OwogICAgICAgICAgICB2YXIgdGV4dFBhZGRpbmcgPSB0aGlzLl90ZXh0UGFkZGluZzsKICAgICAgICAgICAgdmFyIHVwcGVyTGFiZWxTaGlmdCA9IHsgeDogMCwgeTogMCB9OwogICAgICAgICAgICB2YXIgbG93ZXJMYWJlbFNoaWZ0ID0geyB4OiAwLCB5OiAwIH07CiAgICAgICAgICAgIHZhciBsb3dlcldyaXRlT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgIHhBbGlnbjogImNlbnRlciIsCiAgICAgICAgICAgICAgICB5QWxpZ246ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgdGV4dFJvdGF0aW9uOiAwLAogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgdXBwZXJXcml0ZU9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICB4QWxpZ246ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgeUFsaWduOiAiY2VudGVyIiwKICAgICAgICAgICAgICAgIHRleHRSb3RhdGlvbjogMCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHN3YXRjaFdpZHRoOwogICAgICAgICAgICB2YXIgc3dhdGNoSGVpZ2h0OwogICAgICAgICAgICB2YXIgc3dhdGNoWDsKICAgICAgICAgICAgdmFyIHN3YXRjaFk7CiAgICAgICAgICAgIHZhciBib3VuZGluZ0JveEF0dHIgPSB7CiAgICAgICAgICAgICAgICB4OiAwLAogICAgICAgICAgICAgICAgeTogMCwKICAgICAgICAgICAgICAgIHdpZHRoOiAwLAogICAgICAgICAgICAgICAgaGVpZ2h0OiAwLAogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgcGFkZGluZzsKICAgICAgICAgICAgdmFyIG51bVN3YXRjaGVzOwogICAgICAgICAgICBpZiAodGhpcy5faXNWZXJ0aWNhbCgpKSB7CiAgICAgICAgICAgICAgICBudW1Td2F0Y2hlcyA9IE1hdGguZmxvb3IodGhpcy5oZWlnaHQoKSk7CiAgICAgICAgICAgICAgICB2YXIgbG9uZ2VzdFRleHRXaWR0aF8xID0gTWF0aC5tYXgodGV4dDBXaWR0aCwgdGV4dDFXaWR0aCk7CiAgICAgICAgICAgICAgICBwYWRkaW5nID0gKHRoaXMud2lkdGgoKSAtIGxvbmdlc3RUZXh0V2lkdGhfMSAtIDIgKiB0aGlzLl90ZXh0UGFkZGluZykgLyAyOwogICAgICAgICAgICAgICAgc3dhdGNoV2lkdGggPSBNYXRoLm1heCh0aGlzLndpZHRoKCkgLSBwYWRkaW5nIC0gMiAqIHRleHRQYWRkaW5nIC0gbG9uZ2VzdFRleHRXaWR0aF8xLCAwKTsKICAgICAgICAgICAgICAgIHN3YXRjaEhlaWdodCA9IDE7CiAgICAgICAgICAgICAgICBzd2F0Y2hZID0gZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIF90aGlzLmhlaWdodCgpIC0gKGkgKyAxKTsgfTsKICAgICAgICAgICAgICAgIHVwcGVyV3JpdGVPcHRpb25zLnlBbGlnbiA9ICJ0b3AiOwogICAgICAgICAgICAgICAgdXBwZXJMYWJlbFNoaWZ0LnkgPSAwOwogICAgICAgICAgICAgICAgbG93ZXJXcml0ZU9wdGlvbnMueUFsaWduID0gImJvdHRvbSI7CiAgICAgICAgICAgICAgICBsb3dlckxhYmVsU2hpZnQueSA9IDA7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb3JpZW50YXRpb24gPT09ICJsZWZ0IikgewogICAgICAgICAgICAgICAgICAgIHN3YXRjaFggPSBmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gdGV4dFBhZGRpbmcgKyBsb25nZXN0VGV4dFdpZHRoXzEgKyB0ZXh0UGFkZGluZzsgfTsKICAgICAgICAgICAgICAgICAgICB1cHBlcldyaXRlT3B0aW9ucy54QWxpZ24gPSAicmlnaHQiOwogICAgICAgICAgICAgICAgICAgIHVwcGVyTGFiZWxTaGlmdC54ID0gLShwYWRkaW5nICsgc3dhdGNoV2lkdGggKyB0ZXh0UGFkZGluZyk7CiAgICAgICAgICAgICAgICAgICAgbG93ZXJXcml0ZU9wdGlvbnMueEFsaWduID0gInJpZ2h0IjsKICAgICAgICAgICAgICAgICAgICBsb3dlckxhYmVsU2hpZnQueCA9IC0ocGFkZGluZyArIHN3YXRjaFdpZHRoICsgdGV4dFBhZGRpbmcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc3dhdGNoWCA9IGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBwYWRkaW5nOyB9OwogICAgICAgICAgICAgICAgICAgIHVwcGVyV3JpdGVPcHRpb25zLnhBbGlnbiA9ICJsZWZ0IjsKICAgICAgICAgICAgICAgICAgICB1cHBlckxhYmVsU2hpZnQueCA9IHBhZGRpbmcgKyBzd2F0Y2hXaWR0aCArIHRleHRQYWRkaW5nOwogICAgICAgICAgICAgICAgICAgIGxvd2VyV3JpdGVPcHRpb25zLnhBbGlnbiA9ICJsZWZ0IjsKICAgICAgICAgICAgICAgICAgICBsb3dlckxhYmVsU2hpZnQueCA9IHBhZGRpbmcgKyBzd2F0Y2hXaWR0aCArIHRleHRQYWRkaW5nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYm91bmRpbmdCb3hBdHRyWyJ3aWR0aCJdID0gc3dhdGNoV2lkdGg7CiAgICAgICAgICAgICAgICBib3VuZGluZ0JveEF0dHJbImhlaWdodCJdID0gbnVtU3dhdGNoZXMgKiBzd2F0Y2hIZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwYWRkaW5nID0gTWF0aC5tYXgodGV4dFBhZGRpbmcsICh0aGlzLmhlaWdodCgpIC0gdGV4dEhlaWdodCkgLyAyKTsKICAgICAgICAgICAgICAgIG51bVN3YXRjaGVzID0gTWF0aC5tYXgoTWF0aC5mbG9vcih0aGlzLndpZHRoKCkgLSB0ZXh0UGFkZGluZyAqIDQgLSB0ZXh0MFdpZHRoIC0gdGV4dDFXaWR0aCksIDApOwogICAgICAgICAgICAgICAgc3dhdGNoV2lkdGggPSAxOwogICAgICAgICAgICAgICAgc3dhdGNoSGVpZ2h0ID0gTWF0aC5tYXgoKHRoaXMuaGVpZ2h0KCkgLSAyICogcGFkZGluZyksIDApOwogICAgICAgICAgICAgICAgc3dhdGNoWCA9IGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBNYXRoLmZsb29yKHRleHQwV2lkdGggKyAyICogdGV4dFBhZGRpbmcpICsgaTsgfTsKICAgICAgICAgICAgICAgIHN3YXRjaFkgPSBmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gcGFkZGluZzsgfTsKICAgICAgICAgICAgICAgIHVwcGVyV3JpdGVPcHRpb25zLnhBbGlnbiA9ICJyaWdodCI7CiAgICAgICAgICAgICAgICB1cHBlckxhYmVsU2hpZnQueCA9IC10ZXh0UGFkZGluZzsKICAgICAgICAgICAgICAgIGxvd2VyV3JpdGVPcHRpb25zLnhBbGlnbiA9ICJsZWZ0IjsKICAgICAgICAgICAgICAgIGxvd2VyTGFiZWxTaGlmdC54ID0gdGV4dFBhZGRpbmc7CiAgICAgICAgICAgICAgICBib3VuZGluZ0JveEF0dHJbInkiXSA9IHBhZGRpbmc7CiAgICAgICAgICAgICAgICBib3VuZGluZ0JveEF0dHJbIndpZHRoIl0gPSBudW1Td2F0Y2hlcyAqIHN3YXRjaFdpZHRoOwogICAgICAgICAgICAgICAgYm91bmRpbmdCb3hBdHRyWyJoZWlnaHQiXSA9IHN3YXRjaEhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBib3VuZGluZ0JveEF0dHJbIngiXSA9IHN3YXRjaFgobnVsbCwgMCk7IC8vIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBzd2F0Y2gKICAgICAgICAgICAgdGhpcy5fdXBwZXJMYWJlbC50ZXh0KCIiKTsgLy8gY2xlYXIgdGhlIHVwcGVyIGxhYmVsCiAgICAgICAgICAgIHRoaXMuX3dyaXRlci53cml0ZSh0ZXh0MSwgdGhpcy53aWR0aCgpLCB0aGlzLmhlaWdodCgpLCB1cHBlcldyaXRlT3B0aW9ucywgdGhpcy5fdXBwZXJMYWJlbC5ub2RlKCkpOwogICAgICAgICAgICB2YXIgdXBwZXJUcmFuc2xhdGVTdHJpbmcgPSAidHJhbnNsYXRlKCIgKyB1cHBlckxhYmVsU2hpZnQueCArICIsICIgKyB1cHBlckxhYmVsU2hpZnQueSArICIpIjsKICAgICAgICAgICAgdGhpcy5fdXBwZXJMYWJlbC5hdHRyKCJ0cmFuc2Zvcm0iLCB1cHBlclRyYW5zbGF0ZVN0cmluZyk7CiAgICAgICAgICAgIHRoaXMuX2xvd2VyTGFiZWwudGV4dCgiIik7IC8vIGNsZWFyIHRoZSBsb3dlciBsYWJlbAogICAgICAgICAgICB0aGlzLl93cml0ZXIud3JpdGUodGV4dDAsIHRoaXMud2lkdGgoKSwgdGhpcy5oZWlnaHQoKSwgbG93ZXJXcml0ZU9wdGlvbnMsIHRoaXMuX2xvd2VyTGFiZWwubm9kZSgpKTsKICAgICAgICAgICAgdmFyIGxvd2VyVHJhbnNsYXRlU3RyaW5nID0gInRyYW5zbGF0ZSgiICsgbG93ZXJMYWJlbFNoaWZ0LnggKyAiLCAiICsgbG93ZXJMYWJlbFNoaWZ0LnkgKyAiKSI7CiAgICAgICAgICAgIHRoaXMuX2xvd2VyTGFiZWwuYXR0cigidHJhbnNmb3JtIiwgbG93ZXJUcmFuc2xhdGVTdHJpbmcpOwogICAgICAgICAgICB0aGlzLl9zd2F0Y2hCb3VuZGluZ0JveC5hdHRycyhib3VuZGluZ0JveEF0dHIpOwogICAgICAgICAgICB2YXIgdGlja3MgPSB0aGlzLl9nZW5lcmF0ZVRpY2tzKG51bVN3YXRjaGVzKTsKICAgICAgICAgICAgdmFyIHN3YXRjaGVzVXBkYXRlID0gdGhpcy5fc3dhdGNoQ29udGFpbmVyLnNlbGVjdEFsbCgicmVjdC5zd2F0Y2giKS5kYXRhKHRpY2tzKTsKICAgICAgICAgICAgdmFyIHJlY3RzID0gc3dhdGNoZXNVcGRhdGUuZW50ZXIoKS5hcHBlbmQoInJlY3QiKS5jbGFzc2VkKCJzd2F0Y2giLCB0cnVlKTsKICAgICAgICAgICAgdmFyIHN3YXRjaGVzID0gc3dhdGNoZXNVcGRhdGUubWVyZ2UocmVjdHMpOwogICAgICAgICAgICBzd2F0Y2hlc1VwZGF0ZS5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIHN3YXRjaGVzLmF0dHJzKHsKICAgICAgICAgICAgICAgIGZpbGw6IGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBfdGhpcy5fc2NhbGUuc2NhbGUoZCk7IH0sCiAgICAgICAgICAgICAgICB3aWR0aDogc3dhdGNoV2lkdGgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IHN3YXRjaEhlaWdodCwKICAgICAgICAgICAgICAgIHg6IHN3YXRjaFgsCiAgICAgICAgICAgICAgICB5OiBzd2F0Y2hZLAogICAgICAgICAgICAgICAgInNoYXBlLXJlbmRlcmluZyI6ICJjcmlzcEVkZ2VzIiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChjb25maWckMS5BRERfVElUTEVfRUxFTUVOVFMpIHsKICAgICAgICAgICAgICAgIHJlY3RzLmFwcGVuZCgidGl0bGUiKS50ZXh0KGZ1bmN0aW9uIChkKSB7IHJldHVybiBfdGhpcy5fZm9ybWF0dGVyKGQpOyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEludGVycG9sYXRlZENvbG9yTGVnZW5kLl9ERUZBVUxUX05VTV9TV0FUQ0hFUyA9IDExOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjc3MgY2xhc3MgYXBwbGllZCB0byB0aGUgbGVnZW5kIGxhYmVscy4KICAgICAgICAgKi8KICAgICAgICBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZC5MRUdFTkRfTEFCRUxfQ0xBU1MgPSAibGVnZW5kLWxhYmVsIjsKICAgICAgICByZXR1cm4gSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQ7CiAgICB9KGNvbXBvbmVudC5Db21wb25lbnQpKTsKICAgIGV4cG9ydHMuSW50ZXJwb2xhdGVkQ29sb3JMZWdlbmQgPSBJbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZDsKICAgIH0pOwoKICAgIHZhciBsYWJlbCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIExhYmVsID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoTGFiZWwsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBMYWJlbCBpcyBhIENvbXBvbmVudCB0aGF0IGRpc3BsYXlzIGEgc2luZ2xlIGxpbmUgb2YgdGV4dC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbZGlzcGxheVRleHQ9IiJdIFRoZSB0ZXh0IG9mIHRoZSBMYWJlbC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gW2FuZ2xlPTBdIFRoZSBhbmdsZSBvZiB0aGUgTGFiZWwgaW4gZGVncmVlcyAoLTkwLzAvOTApLiAwIGlzIGhvcml6b250YWwuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gTGFiZWwoZGlzcGxheVRleHQsIGFuZ2xlKSB7CiAgICAgICAgICAgIGlmIChkaXNwbGF5VGV4dCA9PT0gdm9pZCAwKSB7IGRpc3BsYXlUZXh0ID0gIiI7IH0KICAgICAgICAgICAgaWYgKGFuZ2xlID09PSB2b2lkIDApIHsgYW5nbGUgPSAwOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJsYWJlbCIpOwogICAgICAgICAgICBfdGhpcy50ZXh0KGRpc3BsYXlUZXh0KTsKICAgICAgICAgICAgX3RoaXMuYW5nbGUoYW5nbGUpOwogICAgICAgICAgICBfdGhpcy54QWxpZ25tZW50KCJjZW50ZXIiKS55QWxpZ25tZW50KCJjZW50ZXIiKTsKICAgICAgICAgICAgX3RoaXMuX3BhZGRpbmcgPSAwOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIExhYmVsLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZSA9IGZ1bmN0aW9uIChvZmZlcmVkV2lkdGgsIG9mZmVyZWRIZWlnaHQpIHsKICAgICAgICAgICAgdmFyIGRlc2lyZWRXSCA9IHRoaXMuX21lYXN1cmVyLm1lYXN1cmUodGhpcy5fdGV4dCk7CiAgICAgICAgICAgIHZhciBkZXNpcmVkV2lkdGggPSAodGhpcy5hbmdsZSgpID09PSAwID8gZGVzaXJlZFdILndpZHRoIDogZGVzaXJlZFdILmhlaWdodCkgKyAyICogdGhpcy5wYWRkaW5nKCk7CiAgICAgICAgICAgIHZhciBkZXNpcmVkSGVpZ2h0ID0gKHRoaXMuYW5nbGUoKSA9PT0gMCA/IGRlc2lyZWRXSC5oZWlnaHQgOiBkZXNpcmVkV0gud2lkdGgpICsgMiAqIHRoaXMucGFkZGluZygpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWluV2lkdGg6IGRlc2lyZWRXaWR0aCwKICAgICAgICAgICAgICAgIG1pbkhlaWdodDogZGVzaXJlZEhlaWdodCwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIExhYmVsLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3RleHRDb250YWluZXIgPSB0aGlzLmNvbnRlbnQoKS5hcHBlbmQoImciKTsKICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgc3JjJDEuU3ZnQ29udGV4dCh0aGlzLl90ZXh0Q29udGFpbmVyLm5vZGUoKSk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIoY29udGV4dCk7CiAgICAgICAgICAgIHRoaXMuX3dyYXBwZXIgPSBuZXcgc3JjJDEuV3JhcHBlcigpOwogICAgICAgICAgICB0aGlzLl93cml0ZXIgPSBuZXcgc3JjJDEuV3JpdGVyKHRoaXMuX21lYXN1cmVyLCBjb250ZXh0LCB0aGlzLl93cmFwcGVyKTsKICAgICAgICAgICAgdGhpcy50ZXh0KHRoaXMuX3RleHQpOwogICAgICAgIH07CiAgICAgICAgTGFiZWwucHJvdG90eXBlLnRleHQgPSBmdW5jdGlvbiAoZGlzcGxheVRleHQpIHsKICAgICAgICAgICAgaWYgKGRpc3BsYXlUZXh0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkaXNwbGF5VGV4dCAhPT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxhYmVsLnRleHQoKSBvbmx5IHRha2VzIHN0cmluZ3MgYXMgaW5wdXQiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3RleHQgPSBkaXNwbGF5VGV4dDsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTGFiZWwucHJvdG90eXBlLmFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7CiAgICAgICAgICAgIGlmIChhbmdsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5nbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhbmdsZSAlPSAzNjA7CiAgICAgICAgICAgICAgICBpZiAoYW5nbGUgPiAxODApIHsKICAgICAgICAgICAgICAgICAgICBhbmdsZSAtPSAzNjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChhbmdsZSA8IC0xODApIHsKICAgICAgICAgICAgICAgICAgICBhbmdsZSArPSAzNjA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYW5nbGUgPT09IC05MCB8fCBhbmdsZSA9PT0gMCB8fCBhbmdsZSA9PT0gOTApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hbmdsZSA9IGFuZ2xlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGFuZ2xlICsgIiBpcyBub3QgYSB2YWxpZCBhbmdsZSBmb3IgTGFiZWwiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTGFiZWwucHJvdG90eXBlLnBhZGRpbmcgPSBmdW5jdGlvbiAocGFkQW1vdW50KSB7CiAgICAgICAgICAgIGlmIChwYWRBbW91bnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhZGRpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwYWRBbW91bnQgPSArcGFkQW1vdW50OwogICAgICAgICAgICAgICAgaWYgKHBhZEFtb3VudCA8IDApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IocGFkQW1vdW50ICsgIiBpcyBub3QgYSB2YWxpZCBwYWRkaW5nIHZhbHVlLiBDYW5ub3QgYmUgbGVzcyB0aGFuIDAuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9wYWRkaW5nID0gcGFkQW1vdW50OwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMYWJlbC5wcm90b3R5cGUuZml4ZWRXaWR0aCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBMYWJlbC5wcm90b3R5cGUuZml4ZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgTGFiZWwucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7CiAgICAgICAgICAgIC8vIEhBQ0tIQUNLIFR5cGVzZXR0YWJsZS5yZW1vdmUgZXhpc3RpbmcgY29udGVudCAtICMyMSBvbiBUeXBlc2V0dGFibGUuCiAgICAgICAgICAgIHRoaXMuX3RleHRDb250YWluZXIuc2VsZWN0QWxsKCJnIikucmVtb3ZlKCk7CiAgICAgICAgICAgIHZhciB0ZXh0TWVhc3VyZW1lbnQgPSB0aGlzLl9tZWFzdXJlci5tZWFzdXJlKHRoaXMuX3RleHQpOwogICAgICAgICAgICB2YXIgaGVpZ2h0UGFkZGluZyA9IE1hdGgubWF4KE1hdGgubWluKCh0aGlzLmhlaWdodCgpIC0gdGV4dE1lYXN1cmVtZW50LmhlaWdodCkgLyAyLCB0aGlzLnBhZGRpbmcoKSksIDApOwogICAgICAgICAgICB2YXIgd2lkdGhQYWRkaW5nID0gTWF0aC5tYXgoTWF0aC5taW4oKHRoaXMud2lkdGgoKSAtIHRleHRNZWFzdXJlbWVudC53aWR0aCkgLyAyLCB0aGlzLnBhZGRpbmcoKSksIDApOwogICAgICAgICAgICB0aGlzLl90ZXh0Q29udGFpbmVyLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHdpZHRoUGFkZGluZyArICIsIiArIGhlaWdodFBhZGRpbmcgKyAiKSIpOwogICAgICAgICAgICB2YXIgd3JpdGVXaWR0aCA9IHRoaXMud2lkdGgoKSAtIDIgKiB3aWR0aFBhZGRpbmc7CiAgICAgICAgICAgIHZhciB3cml0ZUhlaWdodCA9IHRoaXMuaGVpZ2h0KCkgLSAyICogaGVpZ2h0UGFkZGluZzsKICAgICAgICAgICAgdmFyIHdyaXRlT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgIHhBbGlnbjogdGhpcy54QWxpZ25tZW50KCksCiAgICAgICAgICAgICAgICB5QWxpZ246IHRoaXMueUFsaWdubWVudCgpLAogICAgICAgICAgICAgICAgdGV4dFJvdGF0aW9uOiB0aGlzLmFuZ2xlKCksCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3dyaXRlci53cml0ZSh0aGlzLl90ZXh0LCB3cml0ZVdpZHRoLCB3cml0ZUhlaWdodCwgd3JpdGVPcHRpb25zKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBMYWJlbC5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9tZWFzdXJlci5yZXNldCgpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIExhYmVsOwogICAgfShjb21wb25lbnQuQ29tcG9uZW50KSk7CiAgICBleHBvcnRzLkxhYmVsID0gTGFiZWw7CiAgICB2YXIgVGl0bGVMYWJlbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFRpdGxlTGFiZWwsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYW5nbGVdIE9uZSBvZiAtOTAvMC85MC4gMCBpcyBob3Jpem9udGFsLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFRpdGxlTGFiZWwodGV4dCwgYW5nbGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcywgdGV4dCwgYW5nbGUpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKFRpdGxlTGFiZWwuVElUTEVfTEFCRUxfQ0xBU1MpOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIFRpdGxlTGFiZWwuVElUTEVfTEFCRUxfQ0xBU1MgPSAidGl0bGUtbGFiZWwiOwogICAgICAgIHJldHVybiBUaXRsZUxhYmVsOwogICAgfShMYWJlbCkpOwogICAgZXhwb3J0cy5UaXRsZUxhYmVsID0gVGl0bGVMYWJlbDsKICAgIHZhciBBeGlzTGFiZWwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhBeGlzTGFiZWwsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFt0ZXh0XQogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbYW5nbGVdIE9uZSBvZiAtOTAvMC85MC4gMCBpcyBob3Jpem9udGFsLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIEF4aXNMYWJlbCh0ZXh0LCBhbmdsZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCB0ZXh0LCBhbmdsZSkgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoQXhpc0xhYmVsLkFYSVNfTEFCRUxfQ0xBU1MpOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIEF4aXNMYWJlbC5BWElTX0xBQkVMX0NMQVNTID0gImF4aXMtbGFiZWwiOwogICAgICAgIHJldHVybiBBeGlzTGFiZWw7CiAgICB9KExhYmVsKSk7CiAgICBleHBvcnRzLkF4aXNMYWJlbCA9IEF4aXNMYWJlbDsKICAgIH0pOwoKICAgIHZhciBzeW1ib2xGYWN0b3JpZXMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICBmdW5jdGlvbiBjaXJjbGUoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzeW1ib2xTaXplKSB7CiAgICAgICAgICAgIHJldHVybiBkMy5zeW1ib2woKS50eXBlKGQzLnN5bWJvbENpcmNsZSkuc2l6ZShNYXRoLlBJICogTWF0aC5wb3coc3ltYm9sU2l6ZSAvIDIsIDIpKTsKICAgICAgICB9OwogICAgfQogICAgZXhwb3J0cy5jaXJjbGUgPSBjaXJjbGU7CiAgICBmdW5jdGlvbiBzcXVhcmUoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzeW1ib2xTaXplKSB7CiAgICAgICAgICAgIHJldHVybiBkMy5zeW1ib2woKS50eXBlKGQzLnN5bWJvbFNxdWFyZSkuc2l6ZShNYXRoLnBvdyhzeW1ib2xTaXplLCAyKSk7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuc3F1YXJlID0gc3F1YXJlOwogICAgZnVuY3Rpb24gY3Jvc3MoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzeW1ib2xTaXplKSB7CiAgICAgICAgICAgIHJldHVybiBkMy5zeW1ib2woKS50eXBlKGQzLnN5bWJvbENyb3NzKS5zaXplKCg1IC8gOSkgKiBNYXRoLnBvdyhzeW1ib2xTaXplLCAyKSk7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMuY3Jvc3MgPSBjcm9zczsKICAgIGZ1bmN0aW9uIGRpYW1vbmQoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzeW1ib2xTaXplKSB7CiAgICAgICAgICAgIHJldHVybiBkMy5zeW1ib2woKS50eXBlKGQzLnN5bWJvbERpYW1vbmQpLnNpemUoTWF0aC50YW4oTWF0aC5QSSAvIDYpICogTWF0aC5wb3coc3ltYm9sU2l6ZSwgMikgLyAyKTsKICAgICAgICB9OwogICAgfQogICAgZXhwb3J0cy5kaWFtb25kID0gZGlhbW9uZDsKICAgIGZ1bmN0aW9uIHRyaWFuZ2xlKCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiAoc3ltYm9sU2l6ZSkgewogICAgICAgICAgICByZXR1cm4gZDMuc3ltYm9sKCkudHlwZShkMy5zeW1ib2xUcmlhbmdsZSkuc2l6ZShNYXRoLnNxcnQoMykgKiBNYXRoLnBvdyhzeW1ib2xTaXplIC8gMiwgMikpOwogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLnRyaWFuZ2xlID0gdHJpYW5nbGU7CiAgICAvLyBjb3BpZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZDMvZDMtc2hhcGUvYmxvYi9lMmU1NzcyMjAwNGFjYmE3NTRlZDllZGZmMDIwMjgyNjgyNDUwYzVjL3NyYy9zeW1ib2wvc3Rhci5qcyNMMwogICAgdmFyIGthID0gMC44OTA4MTMwOTE1MjkyODUyMjgxMDsKICAgIGZ1bmN0aW9uIHN0YXIoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzeW1ib2xTaXplKSB7CiAgICAgICAgICAgIHJldHVybiBkMy5zeW1ib2woKS50eXBlKGQzLnN5bWJvbFN0YXIpLnNpemUoa2EgKiBNYXRoLnBvdyhzeW1ib2xTaXplIC8gMiwgMikpOwogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLnN0YXIgPSBzdGFyOwogICAgLy8gY29waWVkIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNoYXBlL2Jsb2IvYzM1YjIzMDNlYjQ4MzZhYmEzMTcxNjQyZjAxYzI2NTNlNDIyOGI5Yy9zcmMvc3ltYm9sL3d5ZS5qcyNMMgogICAgdmFyIGEgPSAoKDEgLyBNYXRoLnNxcnQoMTIpKSAvIDIgKyAxKSAqIDM7CiAgICBmdW5jdGlvbiB3eWUoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzeW1ib2xTaXplKSB7CiAgICAgICAgICAgIHJldHVybiBkMy5zeW1ib2woKS50eXBlKGQzLnN5bWJvbFd5ZSkuc2l6ZShhICogTWF0aC5wb3coc3ltYm9sU2l6ZSAvIDIuNCwgMikpOwogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLnd5ZSA9IHd5ZTsKICAgIH0pOwoKICAgIHZhciBsZWdlbmQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgoKCgogICAgLyoqCiAgICAgKiBUaGUgTGVnZW5kJ3Mgcm93IHJlcHJlc2VudGF0aW9ucy4gU3RvcmVzIHBvc2l0aW9uaW5nIGluZm9ybWF0aW9uCiAgICAgKiBhbmQgY29sdW1uIGRhdGEuCiAgICAgKi8KICAgIHZhciBMZWdlbmRSb3cgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gTGVnZW5kUm93KAogICAgICAgIC8qKgogICAgICAgICAqIENvbHVtbnMgd2l0aGluIHRoZSByb3cKICAgICAgICAgKiBAcGFyYW0ge0xlZ2VuZENvbHVtbjxhbnk+W119IGNvbHVtbnMKICAgICAgICAgKi8KICAgICAgICBjb2x1bW5zLCAKICAgICAgICAvKioKICAgICAgICAgKiBQYWRkaW5nIGFwcGxpZWQgYmVsb3cgdGhlIHJvdy4gQWZmZWN0cyB0aGUgc3BhY2luZyBiZXR3ZWVuIHJvd3MuIERlZmF1bHRzIHRvIDAuCiAgICAgICAgICogQHBhcmFtIHtib3R0b21QYWRkaW5nfSBudW1iZXIKICAgICAgICAgKi8KICAgICAgICBib3R0b21QYWRkaW5nLCAKICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBtYXhpbXVtIGFsbG93YWJsZSB3aWR0aCBvZiB0aGlzIGNvbHVtbi4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gbWF4V2lkdGgKICAgICAgICAgKi8KICAgICAgICBtYXhXaWR0aCkgewogICAgICAgICAgICBpZiAoY29sdW1ucyA9PT0gdm9pZCAwKSB7IGNvbHVtbnMgPSBbXTsgfQogICAgICAgICAgICBpZiAoYm90dG9tUGFkZGluZyA9PT0gdm9pZCAwKSB7IGJvdHRvbVBhZGRpbmcgPSAwOyB9CiAgICAgICAgICAgIGlmIChtYXhXaWR0aCA9PT0gdm9pZCAwKSB7IG1heFdpZHRoID0gSW5maW5pdHk7IH0KICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gY29sdW1uczsKICAgICAgICAgICAgdGhpcy5ib3R0b21QYWRkaW5nID0gYm90dG9tUGFkZGluZzsKICAgICAgICAgICAgdGhpcy5tYXhXaWR0aCA9IG1heFdpZHRoOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY29sdW1uIHRvIHRoZSBsaXN0IG9mIGNvbHVtbnMgd2l0aGluIHRoZSByb3cuIE1heSByZWFkanVzdCB0aGUgc2l6ZSBvZiB0aGUKICAgICAgICAgKiBjb2x1bW4gdG8gZml0IHdpdGhpbiB0aGUgcm93CiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0xlZ2VuZENvbHVtbjxhbnk+fSBjb2x1bW4KICAgICAgICAgKi8KICAgICAgICBMZWdlbmRSb3cucHJvdG90eXBlLmFkZENvbHVtbiA9IGZ1bmN0aW9uIChjb2x1bW4pIHsKICAgICAgICAgICAgdmFyIGRlc2lyZWRDb2x1bW5XaWR0aCA9IGNvbHVtbi53aWR0aDsKICAgICAgICAgICAgLy8gY2hvb3NlIHRoZSBzbWFsbGVyIG9mIDEpIHJlbWFpbmluZyBzcGFjZSwgMikgZGVzaXJlZCB3aWR0aAogICAgICAgICAgICB2YXIgd2lkdGhSZW1haW5pbmcgPSB0aGlzLmdldFdpZHRoQXZhaWxhYmxlKCk7CiAgICAgICAgICAgIGNvbHVtbi53aWR0aCA9IE1hdGgubWluKHdpZHRoUmVtYWluaW5nLCBkZXNpcmVkQ29sdW1uV2lkdGgpOwogICAgICAgICAgICB0aGlzLmNvbHVtbnMucHVzaChjb2x1bW4pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgYm91bmRzIHRoZSBjb2x1bW4sIHJlbGF0aXZlIHRvIHRoZSByb3cuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbHVtbkluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29sdW1uIGluIHF1ZXN0aW9uCiAgICAgICAgICogQHJldHVybnMge0JvdW5kc30gYm91bmRzCiAgICAgICAgICovCiAgICAgICAgTGVnZW5kUm93LnByb3RvdHlwZS5nZXRCb3VuZHMgPSBmdW5jdGlvbiAoY29sdW1uSW5kZXgpIHsKICAgICAgICAgICAgdmFyIGNvbHVtbiA9IHRoaXMuY29sdW1uc1tjb2x1bW5JbmRleF07CiAgICAgICAgICAgIHZhciBjb2x1bW5YT2Zmc2V0ID0gMDsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb2x1bW5JbmRleDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb2x1bW5YT2Zmc2V0ICs9IHRoaXMuY29sdW1uc1tpXS53aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdG9wTGVmdDogeyB4OiBjb2x1bW5YT2Zmc2V0LCB5OiAwIH0sCiAgICAgICAgICAgICAgICBib3R0b21SaWdodDogewogICAgICAgICAgICAgICAgICAgIHg6IGNvbHVtblhPZmZzZXQgKyBjb2x1bW4ud2lkdGgsCiAgICAgICAgICAgICAgICAgICAgeTogY29sdW1uLmhlaWdodCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHJvdywgaW5jbHVkaW5nIHRoZSBib3R0b21QYWRkaW5nLgogICAgICAgICAqIEByZXR1cm4ge251bWJlcn0gaGVpZ2h0CiAgICAgICAgICovCiAgICAgICAgTGVnZW5kUm93LnByb3RvdHlwZS5nZXRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB1dGlscyQxLk1hdGgubWF4KHRoaXMuY29sdW1ucy5tYXAoZnVuY3Rpb24gKF9hKSB7CiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gX2EuaGVpZ2h0OwogICAgICAgICAgICAgICAgcmV0dXJuIGhlaWdodDsKICAgICAgICAgICAgfSksIDApICsgdGhpcy5ib3R0b21QYWRkaW5nOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgY3VycmVudCB3aWR0aCBvZiB0aGUgcm93IGNvbnN0cmFpbmVkIGJ5IG1heFdpZHRoLCBpZiBzZXQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gd2lkdGgKICAgICAgICAgKi8KICAgICAgICBMZWdlbmRSb3cucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odGhpcy5jb2x1bW5zLnJlZHVjZShmdW5jdGlvbiAoc3VtLCBfYSkgewogICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gX2Eud2lkdGg7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VtICsgd2lkdGg7CiAgICAgICAgICAgIH0sIDApLCB0aGlzLm1heFdpZHRoKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHJlbWFpbmluZyB3aWR0aCBhdmFpbGFibGUgaW4gdGhlIHJvdyBiYXNlZCBvbiB0aGUgbWF4aW11bQogICAgICAgICAqIHdpZHRoIG9mIHRoaXMgcm93LgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHdpZHRoUmVtYWluaW5nCiAgICAgICAgICovCiAgICAgICAgTGVnZW5kUm93LnByb3RvdHlwZS5nZXRXaWR0aEF2YWlsYWJsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHdpZHRoQ29uc3VtZWQgPSB0aGlzLmdldFdpZHRoKCk7CiAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLm1heFdpZHRoIC0gd2lkdGhDb25zdW1lZCwgMCk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gTGVnZW5kUm93OwogICAgfSgpKTsKICAgIC8qKgogICAgICogU3RvcmVzIExlZ2VuZFJvd3MuIFVzZWZ1bCBmb3IgY2FsY3VsYXRpbmcgYW5kIG1haW50YWluaW5nCiAgICAgKiBwb3NpdGlvbmluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgTGVnZW5kLgogICAgICovCiAgICB2YXIgTGVnZW5kVGFibGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gTGVnZW5kVGFibGUobWF4V2lkdGgsIG1heEhlaWdodCwgcGFkZGluZywgcm93cykgewogICAgICAgICAgICBpZiAobWF4V2lkdGggPT09IHZvaWQgMCkgeyBtYXhXaWR0aCA9IEluZmluaXR5OyB9CiAgICAgICAgICAgIGlmIChtYXhIZWlnaHQgPT09IHZvaWQgMCkgeyBtYXhIZWlnaHQgPSBJbmZpbml0eTsgfQogICAgICAgICAgICBpZiAocGFkZGluZyA9PT0gdm9pZCAwKSB7IHBhZGRpbmcgPSAwOyB9CiAgICAgICAgICAgIGlmIChyb3dzID09PSB2b2lkIDApIHsgcm93cyA9IFtdOyB9CiAgICAgICAgICAgIHRoaXMubWF4V2lkdGggPSBtYXhXaWR0aDsKICAgICAgICAgICAgdGhpcy5tYXhIZWlnaHQgPSBtYXhIZWlnaHQ7CiAgICAgICAgICAgIHRoaXMucGFkZGluZyA9IHBhZGRpbmc7CiAgICAgICAgICAgIHRoaXMucm93cyA9IHJvd3M7CiAgICAgICAgfQogICAgICAgIExlZ2VuZFRhYmxlLnByb3RvdHlwZS5hZGRSb3cgPSBmdW5jdGlvbiAocm93KSB7CiAgICAgICAgICAgIHJvdy5tYXhXaWR0aCA9IHRoaXMubWF4V2lkdGggLSB0aGlzLnBhZGRpbmcgKiAyOwogICAgICAgICAgICB0aGlzLnJvd3MucHVzaChyb3cpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgYm91bmRzIG9mIHRoZSBjb2x1bW4gcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBhbmQgc2libGluZ3Mgb2YgdGhlCiAgICAgICAgICogY29sdW1uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd0luZGV4IFRoZSBwYXJlbnQgcm93IGNvbnRhaW5pbmcgdGhlIGRlc2lyZWQgY29sdW1uLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleCBUaGUgY29sdW1uIHRvIGNhbGN1bGF0ZSBib3VuZHMuCiAgICAgICAgICogQHJldHVybnMge0JvdW5kc30KICAgICAgICAgKi8KICAgICAgICBMZWdlbmRUYWJsZS5wcm90b3R5cGUuZ2V0Q29sdW1uQm91bmRzID0gZnVuY3Rpb24gKHJvd0luZGV4LCBjb2x1bW5JbmRleCkgewogICAgICAgICAgICB2YXIgcm93Qm91bmRzID0gdGhpcy5nZXRSb3dCb3VuZHMocm93SW5kZXgpOwogICAgICAgICAgICB2YXIgY29sdW1uQm91bmRzID0gdGhpcy5yb3dzW3Jvd0luZGV4XS5nZXRCb3VuZHMoY29sdW1uSW5kZXgpOwogICAgICAgICAgICBjb2x1bW5Cb3VuZHMudG9wTGVmdC54ICs9IHJvd0JvdW5kcy50b3BMZWZ0Lng7CiAgICAgICAgICAgIGNvbHVtbkJvdW5kcy5ib3R0b21SaWdodC54ICs9IHJvd0JvdW5kcy50b3BMZWZ0Lng7CiAgICAgICAgICAgIGNvbHVtbkJvdW5kcy50b3BMZWZ0LnkgKz0gcm93Qm91bmRzLnRvcExlZnQueTsKICAgICAgICAgICAgY29sdW1uQm91bmRzLmJvdHRvbVJpZ2h0LnkgKz0gcm93Qm91bmRzLnRvcExlZnQueTsKICAgICAgICAgICAgcmV0dXJuIGNvbHVtbkJvdW5kczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgcGFyZW50IGFuZCBzaWJsaW5ncyBvZiB0aGUgcm93LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHJvd0luZGV4IFRoZSByb3cgdG8gY2FsY3VsYXRlIGJvdW5kcwogICAgICAgICAqIEByZXR1cm5zIHtCb3VuZHN9CiAgICAgICAgICovCiAgICAgICAgTGVnZW5kVGFibGUucHJvdG90eXBlLmdldFJvd0JvdW5kcyA9IGZ1bmN0aW9uIChyb3dJbmRleCkgewogICAgICAgICAgICB2YXIgcm93WE9mZnNldCA9IHRoaXMucGFkZGluZzsKICAgICAgICAgICAgdmFyIHJvd1lPZmZzZXQgPSB0aGlzLnBhZGRpbmc7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93SW5kZXg7IGkrKykgewogICAgICAgICAgICAgICAgcm93WU9mZnNldCArPSB0aGlzLnJvd3NbaV0uZ2V0SGVpZ2h0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHJvd0JvdW5kcyA9IHsKICAgICAgICAgICAgICAgIHRvcExlZnQ6IHsgeDogcm93WE9mZnNldCwgeTogcm93WU9mZnNldCB9LAogICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6IHsKICAgICAgICAgICAgICAgICAgICB4OiByb3dYT2Zmc2V0ICsgdGhpcy5yb3dzW3Jvd0luZGV4XS5nZXRXaWR0aCgpLAogICAgICAgICAgICAgICAgICAgIHk6IHJvd1lPZmZzZXQgKyB0aGlzLnJvd3Nbcm93SW5kZXhdLmdldEhlaWdodCgpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHJvd0JvdW5kczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiB0aGUgVGFibGUsIGNvbnN0cmFpbmVkIGJ5IGEgbWF4aW11bSBoZWlnaHQsIGlmIHNldC4KICAgICAgICAgKiBUaGUgaGVpZ2h0IGluY2x1ZGVzIHRoZSBwYWRkaW5nLCBpZiBzZXQuCiAgICAgICAgICogQHJldHVybnMge251bWJlcn0gaGVpZ2h0CiAgICAgICAgICovCiAgICAgICAgTGVnZW5kVGFibGUucHJvdG90eXBlLmdldEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKHRoaXMucm93cy5yZWR1Y2UoZnVuY3Rpb24gKHN1bSwgcm93KSB7IHJldHVybiBzdW0gKyByb3cuZ2V0SGVpZ2h0KCk7IH0sIDApICsgdGhpcy5wYWRkaW5nICogMiwgdGhpcy5tYXhIZWlnaHQpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgd2lkdGggb2YgdGhlIHRhYmxlLCBjb25zdHJhaW5lZCBieSB0aGUgbWF4aW11bSB3aWR0aCwgaWYgc2V0LgogICAgICAgICAqIFRoZSB3aWR0aCBpbmNsdWRlcyB0aGUgcGFkZGluZywgaWYgc2V0LgogICAgICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IHdpZHRoCiAgICAgICAgICovCiAgICAgICAgTGVnZW5kVGFibGUucHJvdG90eXBlLmdldFdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5taW4odXRpbHMkMS5NYXRoLm1heCh0aGlzLnJvd3MubWFwKGZ1bmN0aW9uIChyb3cpIHsgcmV0dXJuIHJvdy5nZXRXaWR0aCgpOyB9KSwgMCkgKyB0aGlzLnBhZGRpbmcgKiAyLCB0aGlzLm1heFdpZHRoKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBMZWdlbmRUYWJsZTsKICAgIH0oKSk7CiAgICB2YXIgTGVnZW5kID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoTGVnZW5kLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBMZWdlbmQgY29uc2lzdHMgb2YgYSBzZXJpZXMgb2YgZW50cmllcywgZWFjaCB3aXRoIGEgY29sb3IgYW5kIGxhYmVsIHRha2VuIGZyb20gdGhlIENvbG9yIFNjYWxlLgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtTY2FsZS5Db2xvcn0gc2NhbGUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBMZWdlbmQoY29sb3JTY2FsZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fcGFkZGluZyA9IDU7CiAgICAgICAgICAgIF90aGlzLl9yb3dCb3R0b21QYWRkaW5nID0gMzsKICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoImxlZ2VuZCIpOwogICAgICAgICAgICBfdGhpcy5tYXhFbnRyaWVzUGVyUm93KDEpOwogICAgICAgICAgICBpZiAoY29sb3JTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIkxlZ2VuZCByZXF1aXJlcyBhIGNvbG9yU2NhbGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfdGhpcy5fY29sb3JTY2FsZSA9IGNvbG9yU2NhbGU7CiAgICAgICAgICAgIF90aGlzLl9yZWRyYXdDYWxsYmFjayA9IGZ1bmN0aW9uIChzY2FsZSkgeyByZXR1cm4gX3RoaXMucmVkcmF3KCk7IH07CiAgICAgICAgICAgIF90aGlzLl9jb2xvclNjYWxlLm9uVXBkYXRlKF90aGlzLl9yZWRyYXdDYWxsYmFjayk7CiAgICAgICAgICAgIF90aGlzLl9mb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzLmlkZW50aXR5KCk7CiAgICAgICAgICAgIF90aGlzLm1heExpbmVzUGVyRW50cnkoMSk7CiAgICAgICAgICAgIF90aGlzLnhBbGlnbm1lbnQoInJpZ2h0IikueUFsaWdubWVudCgidG9wIik7CiAgICAgICAgICAgIF90aGlzLmNvbXBhcmF0b3IoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgIHZhciBmb3JtYXR0ZWRUZXh0ID0gX3RoaXMuX2NvbG9yU2NhbGUuZG9tYWluKCkuc2xpY2UoKS5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIF90aGlzLl9mb3JtYXR0ZXIoZCk7IH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdHRlZFRleHQuaW5kZXhPZihhKSAtIGZvcm1hdHRlZFRleHQuaW5kZXhPZihiKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIF90aGlzLl9zeW1ib2xGYWN0b3J5QWNjZXNzb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBzeW1ib2xGYWN0b3JpZXMuY2lyY2xlKCk7IH07CiAgICAgICAgICAgIF90aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3IgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAxOyB9OwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIExlZ2VuZC5wcm90b3R5cGUuX3NldHVwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgZmFrZUxlZ2VuZFJvdyA9IHRoaXMuY29udGVudCgpLmFwcGVuZCgiZyIpLmNsYXNzZWQoTGVnZW5kLkxFR0VORF9ST1dfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICB2YXIgZmFrZUxlZ2VuZEVudHJ5ID0gZmFrZUxlZ2VuZFJvdy5hcHBlbmQoImciKS5jbGFzc2VkKExlZ2VuZC5MRUdFTkRfRU5UUllfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICBmYWtlTGVnZW5kRW50cnkuYXBwZW5kKCJ0ZXh0Iik7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbmV3IHNyYyQxLlN2Z0NvbnRleHQoZmFrZUxlZ2VuZFJvdy5ub2RlKCksIG51bGwsIGNvbmZpZyQxLkFERF9USVRMRV9FTEVNRU5UUyk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIoY29udGV4dCk7CiAgICAgICAgICAgIHRoaXMuX3dyYXBwZXIgPSBuZXcgc3JjJDEuV3JhcHBlcigpLm1heExpbmVzKHRoaXMubWF4TGluZXNQZXJFbnRyeSgpKTsKICAgICAgICAgICAgdGhpcy5fd3JpdGVyID0gbmV3IHNyYyQxLldyaXRlcih0aGlzLl9tZWFzdXJlciwgY29udGV4dCwgdGhpcy5fd3JhcHBlcik7CiAgICAgICAgfTsKICAgICAgICBMZWdlbmQucHJvdG90eXBlLmZvcm1hdHRlciA9IGZ1bmN0aW9uIChmb3JtYXR0ZXIpIHsKICAgICAgICAgICAgaWYgKGZvcm1hdHRlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybWF0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Zvcm1hdHRlciA9IGZvcm1hdHRlcjsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBMZWdlbmQucHJvdG90eXBlLm1heEVudHJpZXNQZXJSb3cgPSBmdW5jdGlvbiAobWF4RW50cmllc1BlclJvdykgewogICAgICAgICAgICBpZiAobWF4RW50cmllc1BlclJvdyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWF4RW50cmllc1BlclJvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21heEVudHJpZXNQZXJSb3cgPSBtYXhFbnRyaWVzUGVyUm93OwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMZWdlbmQucHJvdG90eXBlLm1heExpbmVzUGVyRW50cnkgPSBmdW5jdGlvbiAobWF4TGluZXNQZXJFbnRyeSkgewogICAgICAgICAgICBpZiAobWF4TGluZXNQZXJFbnRyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWF4TGluZXNQZXJFbnRyeTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21heExpbmVzUGVyRW50cnkgPSBtYXhMaW5lc1BlckVudHJ5OwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMZWdlbmQucHJvdG90eXBlLm1heFdpZHRoID0gZnVuY3Rpb24gKG1heFdpZHRoKSB7CiAgICAgICAgICAgIGlmIChtYXhXaWR0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWF4V2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXhXaWR0aCA9IG1heFdpZHRoOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMZWdlbmQucHJvdG90eXBlLmNvbXBhcmF0b3IgPSBmdW5jdGlvbiAoY29tcGFyYXRvcikgewogICAgICAgICAgICBpZiAoY29tcGFyYXRvciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29tcGFyYXRvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbXBhcmF0b3IgPSBjb21wYXJhdG9yOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMZWdlbmQucHJvdG90eXBlLmNvbG9yU2NhbGUgPSBmdW5jdGlvbiAoY29sb3JTY2FsZSkgewogICAgICAgICAgICBpZiAoY29sb3JTY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb2xvclNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9yZWRyYXdDYWxsYmFjayk7CiAgICAgICAgICAgICAgICB0aGlzLl9jb2xvclNjYWxlID0gY29sb3JTY2FsZTsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbG9yU2NhbGUub25VcGRhdGUodGhpcy5fcmVkcmF3Q2FsbGJhY2spOwogICAgICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yU2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIExlZ2VuZC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5kZXN0cm95LmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2NvbG9yU2NhbGUub2ZmVXBkYXRlKHRoaXMuX3JlZHJhd0NhbGxiYWNrKTsKICAgICAgICB9OwogICAgICAgIExlZ2VuZC5wcm90b3R5cGUuX2J1aWxkTGVnZW5kVGFibGUgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgdGV4dEhlaWdodCA9IHRoaXMuX21lYXN1cmVyLm1lYXN1cmUoKS5oZWlnaHQ7CiAgICAgICAgICAgIHZhciB0YWJsZSA9IG5ldyBMZWdlbmRUYWJsZSh3aWR0aCwgaGVpZ2h0LCB0aGlzLl9wYWRkaW5nKTsKICAgICAgICAgICAgdmFyIGVudHJ5TmFtZXMgPSB0aGlzLl9jb2xvclNjYWxlLmRvbWFpbigpLnNsaWNlKCkuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gX3RoaXMuX2NvbXBhcmF0b3IoX3RoaXMuX2Zvcm1hdHRlcihhKSwgX3RoaXMuX2Zvcm1hdHRlcihiKSk7IH0pOwogICAgICAgICAgICB2YXIgcm93ID0gbmV3IExlZ2VuZFJvdygpOwogICAgICAgICAgICB0YWJsZS5hZGRSb3cocm93KTsKICAgICAgICAgICAgcm93LmJvdHRvbVBhZGRpbmcgPSB0aGlzLl9yb3dCb3R0b21QYWRkaW5nOwogICAgICAgICAgICBlbnRyeU5hbWVzLmZvckVhY2goZnVuY3Rpb24gKG5hbWUsIGluZGV4KSB7CiAgICAgICAgICAgICAgICBpZiAocm93LmNvbHVtbnMubGVuZ3RoIC8gMiA9PT0gX3RoaXMubWF4RW50cmllc1BlclJvdygpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgYWRkIHR3byBjb2x1bW5zIHBlciBlbnRyeSwgYSBzeW1ib2wgY29sdW1uIGFuZCBhIG5hbWUgY29sdW1uCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGN1cnJlbnQgcm93IGlzIGZ1bGwsIGFjY29yZGluZyB0byB0aGUgbnVtYmVyIG9mIGVudHJpZXMKICAgICAgICAgICAgICAgICAgICAvLyB3ZSdyZSBhbGxvd2VkIHRvIGhhdmUgcGVyIHJvdywgd2UgbmVlZCB0byBhbGxvY2F0ZSBuZXcgc3BhY2UKICAgICAgICAgICAgICAgICAgICByb3cgPSBuZXcgTGVnZW5kUm93KCk7CiAgICAgICAgICAgICAgICAgICAgcm93LmJvdHRvbVBhZGRpbmcgPSBfdGhpcy5fcm93Qm90dG9tUGFkZGluZzsKICAgICAgICAgICAgICAgICAgICB0YWJsZS5hZGRSb3cocm93KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBhdmFpbGFibGVXaWR0aCA9IHJvdy5nZXRXaWR0aEF2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgdmFyIGZvcm1hdHRlZE5hbWUgPSBfdGhpcy5fZm9ybWF0dGVyKG5hbWUpOwogICAgICAgICAgICAgICAgLy8gdGhpcyBpcyB0aGUgd2lkdGggb2YgdGhlIHNlcmllcyBuYW1lIHdpdGhvdXQgYW55IGxpbmUgd3JhcHBpbmcKICAgICAgICAgICAgICAgIC8vIGl0IGlzIHRoZSBtb3N0IG9wdGltYWwgcHJlc2VudGF0aW9uIG9mIHRoZSBuYW1lCiAgICAgICAgICAgICAgICB2YXIgdW53cmFwcGVkTmFtZVdpZHRoID0gX3RoaXMuX21lYXN1cmVyLm1lYXN1cmUoZm9ybWF0dGVkTmFtZSkud2lkdGg7CiAgICAgICAgICAgICAgICB2YXIgd2lsbEJlU3F1aXNoZWQgPSAoYXZhaWxhYmxlV2lkdGggLSB0ZXh0SGVpZ2h0IC0gdW53cmFwcGVkTmFtZVdpZHRoKSA8IDA7CiAgICAgICAgICAgICAgICBpZiAod2lsbEJlU3F1aXNoZWQgJiYgcm93LmNvbHVtbnMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgICAgIC8vIGFkZGluZyB0aGUgZW50cnkgdG8gdGhpcyByb3cgd2lsbCBzcXVpc2ggdGhpcwogICAgICAgICAgICAgICAgICAgIC8vIGVudHJ5LiBUaGUgcm93IGFscmVhZHkgY29udGFpbnMgZW50cmllcyBzbyBjcmVhdGUKICAgICAgICAgICAgICAgICAgICAvLyBhIG5ldyByb3cgdG8gYWRkIHRoaXMgZW50cnkgdG8gZm9yIG9wdGltYWwgZGlzcGxheQogICAgICAgICAgICAgICAgICAgIHJvdyA9IG5ldyBMZWdlbmRSb3coKTsKICAgICAgICAgICAgICAgICAgICByb3cuYm90dG9tUGFkZGluZyA9IF90aGlzLl9yb3dCb3R0b21QYWRkaW5nOwogICAgICAgICAgICAgICAgICAgIHRhYmxlLmFkZFJvdyhyb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHN5bWJvbENvbHVtbiA9IHsgd2lkdGg6IHRleHRIZWlnaHQsIGhlaWdodDogdGV4dEhlaWdodCwgZGF0YTogeyBuYW1lOiBuYW1lLCB0eXBlOiAic3ltYm9sIiB9IH07CiAgICAgICAgICAgICAgICByb3cuYWRkQ29sdW1uKHN5bWJvbENvbHVtbik7CiAgICAgICAgICAgICAgICAvLyB0aGUgc3BhY2UgY29uc3VtZWQgYnkgdGhlIG5hbWUgZmllbGQgaXMgdGhlIG1pbmltdW0gb2YgdGhlIHNwYWNlIGF2YWlsYWJsZSBpbiB0aGUgdGFibGUKICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgYWN0dWFsIHdpZHRoIGNvbnN1bWVkIGJ5IHRoZSBuYW1lCiAgICAgICAgICAgICAgICBhdmFpbGFibGVXaWR0aCA9IHJvdy5nZXRXaWR0aEF2YWlsYWJsZSgpOwogICAgICAgICAgICAgICAgdmFyIHVzZWROYW1lV2lkdGggPSBNYXRoLm1pbihhdmFpbGFibGVXaWR0aCwgdW53cmFwcGVkTmFtZVdpZHRoKTsKICAgICAgICAgICAgICAgIF90aGlzLl93cmFwcGVyLm1heExpbmVzKF90aGlzLm1heExpbmVzUGVyRW50cnkoKSk7CiAgICAgICAgICAgICAgICB2YXIgbnVtYmVyT2ZSb3dzID0gX3RoaXMuX3dyYXBwZXIud3JhcChmb3JtYXR0ZWROYW1lLCBfdGhpcy5fbWVhc3VyZXIsIHVzZWROYW1lV2lkdGgpLm5vTGluZXM7CiAgICAgICAgICAgICAgICB2YXIgbmFtZUNvbHVtbkhlaWdodCA9IG51bWJlck9mUm93cyAqIHRleHRIZWlnaHQ7CiAgICAgICAgICAgICAgICB2YXIgbmFtZUNvbHVtbiA9IHsgd2lkdGg6IHVzZWROYW1lV2lkdGgsIGhlaWdodDogbmFtZUNvbHVtbkhlaWdodCwgZGF0YTogeyBuYW1lOiBuYW1lLCB0eXBlOiAidGV4dCIgfSB9OwogICAgICAgICAgICAgICAgcm93LmFkZENvbHVtbihuYW1lQ29sdW1uKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0YWJsZTsKICAgICAgICB9OwogICAgICAgIExlZ2VuZC5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2UgPSBmdW5jdGlvbiAob2ZmZXJlZFdpZHRoLCBvZmZlcmVkSGVpZ2h0KSB7CiAgICAgICAgICAgIC8vIGlmIG1heCB3aWR0aCBpcyBzZXQsIHRoZSB0YWJsZSBpcyBndWFyYW50ZWVkIHRvIGJlIGF0IG1vc3QgbWF4V2lkdGggd2lkZS4KICAgICAgICAgICAgLy8gaWYgbWF4IHdpZHRoIGlzIG5vdCBzZXQsIHRoZSB0YWJsZSB3aWxsIGJlIGFzIHdpZGUgYXMgdGhlIGxvbmdlc3QgdW50cnVuY2F0ZWQgcm93CiAgICAgICAgICAgIHZhciB0YWJsZSA9IHRoaXMuX2J1aWxkTGVnZW5kVGFibGUodXRpbHMkMS5NYXRoLm1pbihbdGhpcy5tYXhXaWR0aCgpLCBvZmZlcmVkV2lkdGhdLCBvZmZlcmVkV2lkdGgpLCBvZmZlcmVkSGVpZ2h0KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG1pbkhlaWdodDogdGFibGUuZ2V0SGVpZ2h0KCksCiAgICAgICAgICAgICAgICBtaW5XaWR0aDogdGFibGUuZ2V0V2lkdGgoKSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIEVudGl0aWVzIChyZXByZXNlbnRpbmcgTGVnZW5kIGVudHJpZXMpIGF0IGEgcGFydGljdWxhciBwb2ludC4KICAgICAgICAgKiBSZXR1cm5zIGFuIGVtcHR5IGFycmF5IGlmIG5vIEVudGl0aWVzIGFyZSBwcmVzZW50IGF0IHRoYXQgbG9jYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50fSBwCiAgICAgICAgICogQHJldHVybnMge0VudGl0eTxMZWdlbmQ+W119CiAgICAgICAgICovCiAgICAgICAgTGVnZW5kLnByb3RvdHlwZS5lbnRpdGllc0F0ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1NldHVwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRhYmxlID0gdGhpcy5fYnVpbGRMZWdlbmRUYWJsZSh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCkpOwogICAgICAgICAgICByZXR1cm4gdGFibGUucm93cy5yZWR1Y2UoZnVuY3Rpb24gKGVudGl0eSwgcm93LCByb3dJbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGVudGl0eS5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBhbHJlYWR5IGZvdW5kIHRoZSBuZWFyZXN0IGVudGl0eTsganVzdCByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciByb3dCb3VuZHMgPSB0YWJsZS5nZXRSb3dCb3VuZHMocm93SW5kZXgpOwogICAgICAgICAgICAgICAgdmFyIHdpdGhpblJvdyA9IHV0aWxzJDEuTWF0aC53aXRoaW4ocCwgcm93Qm91bmRzKTsKICAgICAgICAgICAgICAgIGlmICghd2l0aGluUm93KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG5lYXJlc3QgZW50aXR5IGlzbid0IHdpdGhpbiB0aGlzIHJvdywgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudGl0eTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByb3cuY29sdW1ucy5yZWR1Y2UoZnVuY3Rpb24gKGVudGl0eSwgY29sdW1uLCBjb2x1bW5JbmRleCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5Cb3VuZHMgPSB0YWJsZS5nZXRDb2x1bW5Cb3VuZHMocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICAgICB2YXIgd2l0aGluQ29sdW1uID0gdXRpbHMkMS5NYXRoLndpdGhpbihwLCBjb2x1bW5Cb3VuZHMpOwogICAgICAgICAgICAgICAgICAgIGlmICh3aXRoaW5Db2x1bW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0VsZW1lbnQgPSBfdGhpcy5jb250ZW50KCkuc2VsZWN0QWxsKCIuIiArIExlZ2VuZC5MRUdFTkRfUk9XX0NMQVNTKS5ub2RlcygpW3Jvd0luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSEFDS0hBQ0sgVGhlIDIueCBBUEkgY2hvb3NlcyB0aGUgc3ltYm9sIGVsZW1lbnQgYXMgdGhlICJzZWxlY3Rpb24iIHRvIHJldHVybiwgcmVnYXJkbGVzcyBvZiB3aGF0CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhcyBhY3R1YWxseSBzZWxlY3RlZAogICAgICAgICAgICAgICAgICAgICAgICB2YXIgZW50cnlFbGVtZW50ID0gZDMuc2VsZWN0KHJvd0VsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCIuIiArIExlZ2VuZC5MRUdFTkRfRU5UUllfQ0xBU1MpLm5vZGVzKClbTWF0aC5mbG9vcihjb2x1bW5JbmRleCAvIDIpXTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbEVsZW1lbnQgPSBkMy5zZWxlY3QoZW50cnlFbGVtZW50KS5zZWxlY3QoIi4iICsgTGVnZW5kLkxFR0VORF9TWU1CT0xfQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBIQUNLSEFDSyBUaGUgMi54IEFQSSByZXR1cm5zIHRoZSBjZW50ZXIge3gsIHl9IG9mIHRoZSBzeW1ib2wgYXMgdGhlIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcm93VHJhbnNsYXRlID0gdXRpbHMkMS5ET00uZ2V0VHJhbnNsYXRlVmFsdWVzKGQzLnNlbGVjdChyb3dFbGVtZW50KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xUcmFuc2xhdGUgPSB1dGlscyQxLkRPTS5nZXRUcmFuc2xhdGVWYWx1ZXMoc3ltYm9sRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kczogdXRpbHMkMS5ET00uZWxlbWVudEJCb3goZDMuc2VsZWN0KHJvd0VsZW1lbnQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXR1bTogY29sdW1uLmRhdGEubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiByb3dUcmFuc2xhdGVbMF0gKyBzeW1ib2xUcmFuc2xhdGVbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHJvd1RyYW5zbGF0ZVsxXSArIHN5bWJvbFRyYW5zbGF0ZVsxXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjogZDMuc2VsZWN0KGVudHJ5RWxlbWVudCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50OiBfdGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1dOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50aXR5OwogICAgICAgICAgICAgICAgfSwgZW50aXR5KTsKICAgICAgICAgICAgfSwgW10pOwogICAgICAgIH07CiAgICAgICAgTGVnZW5kLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseS5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgdGFibGUgPSB0aGlzLl9idWlsZExlZ2VuZFRhYmxlKHRoaXMud2lkdGgoKSwgdGhpcy5oZWlnaHQoKSk7CiAgICAgICAgICAgIC8vIGNsZWFyIGNvbnRlbnQgZnJvbSBwcmV2aW91cyByZW5kZXJzCiAgICAgICAgICAgIHRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiKiIpLnJlbW92ZSgpOwogICAgICAgICAgICB2YXIgcm93c1VwZGF0ZSA9IHRoaXMuY29udGVudCgpLnNlbGVjdEFsbCgiZy4iICsgTGVnZW5kLkxFR0VORF9ST1dfQ0xBU1MpLmRhdGEodGFibGUucm93cyk7CiAgICAgICAgICAgIHZhciByb3dzID0gcm93c1VwZGF0ZQogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoTGVnZW5kLkxFR0VORF9ST1dfQ0xBU1MsIHRydWUpCiAgICAgICAgICAgICAgICAubWVyZ2Uocm93c1VwZGF0ZSk7CiAgICAgICAgICAgIHJvd3NVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICByb3dzLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uIChyb3csIHJvd0luZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgcm93Qm91bmRzID0gdGFibGUuZ2V0Um93Qm91bmRzKHJvd0luZGV4KTsKICAgICAgICAgICAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyByb3dCb3VuZHMudG9wTGVmdC54ICsgIiwgIiArIHJvd0JvdW5kcy50b3BMZWZ0LnkgKyAiKSI7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIHJvd3MuZWFjaChmdW5jdGlvbiAocm93LCByb3dJbmRleCkgewogICAgICAgICAgICAgICAgdmFyIHN5bWJvbEVudHJ5UGFpcnMgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcm93LmNvbHVtbnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICBzeW1ib2xFbnRyeVBhaXJzLnB1c2goW3Jvdy5jb2x1bW5zW2ldLCByb3cuY29sdW1uc1tpICsgMV1dKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBlbnRyaWVzVXBkYXRlID0gZDMuc2VsZWN0KHRoaXMpLnNlbGVjdEFsbCgiZy4iICsgTGVnZW5kLkxFR0VORF9FTlRSWV9DTEFTUykuZGF0YShzeW1ib2xFbnRyeVBhaXJzKTsKICAgICAgICAgICAgICAgIHZhciBlbnRyaWVzRW50ZXIgPSBlbnRyaWVzVXBkYXRlCiAgICAgICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCJnIikKICAgICAgICAgICAgICAgICAgICAuY2xhc3NlZChMZWdlbmQuTEVHRU5EX0VOVFJZX0NMQVNTLCB0cnVlKQogICAgICAgICAgICAgICAgICAgIC5tZXJnZShlbnRyaWVzVXBkYXRlKTsKICAgICAgICAgICAgICAgIGVudHJpZXNFbnRlci5hcHBlbmQoInBhdGgiKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJkIiwgZnVuY3Rpb24gKHN5bWJvbEVudHJ5UGFpciwgY29sdW1uSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sRW50cnlQYWlyWzBdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxmLnN5bWJvbCgpKHN5bWJvbC5kYXRhLm5hbWUsIHJvd0luZGV4KShzeW1ib2wuaGVpZ2h0ICogMC42KShudWxsKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uIChzeW1ib2xFbnRyeVBhaXIsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sID0gc3ltYm9sRW50cnlQYWlyWzBdOwogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5JbmRleCA9IHRhYmxlLnJvd3Nbcm93SW5kZXhdLmNvbHVtbnMuaW5kZXhPZihzeW1ib2wpOwogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5Cb3VuZHMgPSB0YWJsZS5nZXRDb2x1bW5Cb3VuZHMocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgKGNvbHVtbkJvdW5kcy50b3BMZWZ0LnggKyBzeW1ib2wud2lkdGggLyAyKSArICIsICIgKyBzeW1ib2wuaGVpZ2h0IC8gMiArICIpIjsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoImZpbGwiLCBmdW5jdGlvbiAoc3ltYm9sRW50cnlQYWlyKSB7IHJldHVybiBzZWxmLl9jb2xvclNjYWxlLnNjYWxlKHN5bWJvbEVudHJ5UGFpclswXS5kYXRhLm5hbWUpOyB9KQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZnVuY3Rpb24gKHN5bWJvbEVudHJ5UGFpciwgX2NvbHVtbkluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuc3ltYm9sT3BhY2l0eSgpKHN5bWJvbEVudHJ5UGFpclswXS5kYXRhLm5hbWUsIHJvd0luZGV4KTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmNsYXNzZWQoTGVnZW5kLkxFR0VORF9TWU1CT0xfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICAgICAgZW50cmllc0VudGVyLmFwcGVuZCgiZyIpLmNsYXNzZWQoInRleHQtY29udGFpbmVyIiwgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24gKHN5bWJvbEVudHJ5UGFpciwgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBlbnRyeSA9IHN5bWJvbEVudHJ5UGFpclsxXTsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uSW5kZXggPSB0YWJsZS5yb3dzW3Jvd0luZGV4XS5jb2x1bW5zLmluZGV4T2YoZW50cnkpOwogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5Cb3VuZHMgPSB0YWJsZS5nZXRDb2x1bW5Cb3VuZHMocm93SW5kZXgsIGNvbHVtbkluZGV4KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgY29sdW1uQm91bmRzLnRvcExlZnQueCArICIsIDApIjsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKHN5bWJvbEVudHJ5UGFpciwgaSwgcm93SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dENvbnRhaW5lciA9IGQzLnNlbGVjdCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY29sdW1uID0gc3ltYm9sRW50cnlQYWlyWzFdOwogICAgICAgICAgICAgICAgICAgIHZhciB3cml0ZU9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhBbGlnbjogImxlZnQiLAogICAgICAgICAgICAgICAgICAgICAgICB5QWxpZ246ICJ0b3AiLAogICAgICAgICAgICAgICAgICAgICAgICB0ZXh0Um90YXRpb246IDAsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBzZWxmLl93cml0ZXIud3JpdGUoc2VsZi5fZm9ybWF0dGVyKGNvbHVtbi5kYXRhLm5hbWUpLCBjb2x1bW4ud2lkdGgsIHNlbGYuaGVpZ2h0KCksIHdyaXRlT3B0aW9ucywgdGV4dENvbnRhaW5lci5ub2RlKCkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBlbnRyaWVzVXBkYXRlLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgTGVnZW5kLnByb3RvdHlwZS5zeW1ib2wgPSBmdW5jdGlvbiAoc3ltYm9sKSB7CiAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N5bWJvbEZhY3RvcnlBY2Nlc3NvciA9IHN5bWJvbDsKICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTGVnZW5kLnByb3RvdHlwZS5zeW1ib2xPcGFjaXR5ID0gZnVuY3Rpb24gKHN5bWJvbE9wYWNpdHkpIHsKICAgICAgICAgICAgaWYgKHN5bWJvbE9wYWNpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3NvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3ltYm9sT3BhY2l0eSA9PT0gIm51bWJlciIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N5bWJvbE9wYWNpdHlBY2Nlc3NvciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHN5bWJvbE9wYWNpdHk7IH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zeW1ib2xPcGFjaXR5QWNjZXNzb3IgPSBzeW1ib2xPcGFjaXR5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgTGVnZW5kLnByb3RvdHlwZS5maXhlZFdpZHRoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9OwogICAgICAgIExlZ2VuZC5wcm90b3R5cGUuZml4ZWRIZWlnaHQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgTGVnZW5kLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyLnJlc2V0KCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3NzIGNsYXNzIGFwcGxpZWQgdG8gZWFjaCBsZWdlbmQgcm93CiAgICAgICAgICovCiAgICAgICAgTGVnZW5kLkxFR0VORF9ST1dfQ0xBU1MgPSAibGVnZW5kLXJvdyI7CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGNzcyBjbGFzcyBhcHBsaWVkIHRvIGVhY2ggbGVnZW5kIGVudHJ5CiAgICAgICAgICovCiAgICAgICAgTGVnZW5kLkxFR0VORF9FTlRSWV9DTEFTUyA9ICJsZWdlbmQtZW50cnkiOwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjc3MgY2xhc3MgYXBwbGllZCB0byBlYWNoIGxlZ2VuZCBzeW1ib2wKICAgICAgICAgKi8KICAgICAgICBMZWdlbmQuTEVHRU5EX1NZTUJPTF9DTEFTUyA9ICJsZWdlbmQtc3ltYm9sIjsKICAgICAgICByZXR1cm4gTGVnZW5kOwogICAgfShjb21wb25lbnQuQ29tcG9uZW50KSk7CiAgICBleHBvcnRzLkxlZ2VuZCA9IExlZ2VuZDsKICAgIH0pOwoKICAgIHZhciBjb21tb25zID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CiAgICB2YXIgQW5pbWF0b3I7CiAgICAoZnVuY3Rpb24gKEFuaW1hdG9yKSB7CiAgICAgICAgQW5pbWF0b3IuTUFJTiA9ICJtYWluIjsKICAgICAgICBBbmltYXRvci5SRVNFVCA9ICJyZXNldCI7CiAgICB9KShBbmltYXRvciA9IGV4cG9ydHMuQW5pbWF0b3IgfHwgKGV4cG9ydHMuQW5pbWF0b3IgPSB7fSkpOwogICAgfSk7CgogICAgLyohCiAgICAgKiBpc29iamVjdCA8aHR0cHM6Ly9naXRodWIuY29tL2pvbnNjaGxpbmtlcnQvaXNvYmplY3Q+CiAgICAgKgogICAgICogQ29weXJpZ2h0IChjKSAyMDE0LTIwMTcsIEpvbiBTY2hsaW5rZXJ0LgogICAgICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgogICAgICovCgogICAgdmFyIGlzb2JqZWN0ID0gZnVuY3Rpb24gaXNPYmplY3QodmFsKSB7CiAgICAgIHJldHVybiB2YWwgIT0gbnVsbCAmJiB0eXBlb2YgdmFsID09PSAnb2JqZWN0JyAmJiBBcnJheS5pc0FycmF5KHZhbCkgPT09IGZhbHNlOwogICAgfTsKCiAgICBmdW5jdGlvbiBpc09iamVjdE9iamVjdChvKSB7CiAgICAgIHJldHVybiBpc29iamVjdChvKSA9PT0gdHJ1ZQogICAgICAgICYmIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgT2JqZWN0XSc7CiAgICB9CgogICAgdmFyIGlzUGxhaW5PYmplY3QgPSBmdW5jdGlvbiBpc1BsYWluT2JqZWN0KG8pIHsKICAgICAgdmFyIGN0b3IscHJvdDsKCiAgICAgIGlmIChpc09iamVjdE9iamVjdChvKSA9PT0gZmFsc2UpIHJldHVybiBmYWxzZTsKCiAgICAgIC8vIElmIGhhcyBtb2RpZmllZCBjb25zdHJ1Y3RvcgogICAgICBjdG9yID0gby5jb25zdHJ1Y3RvcjsKICAgICAgaWYgKHR5cGVvZiBjdG9yICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7CgogICAgICAvLyBJZiBoYXMgbW9kaWZpZWQgcHJvdG90eXBlCiAgICAgIHByb3QgPSBjdG9yLnByb3RvdHlwZTsKICAgICAgaWYgKGlzT2JqZWN0T2JqZWN0KHByb3QpID09PSBmYWxzZSkgcmV0dXJuIGZhbHNlOwoKICAgICAgLy8gSWYgY29uc3RydWN0b3IgZG9lcyBub3QgaGF2ZSBhbiBPYmplY3Qtc3BlY2lmaWMgbWV0aG9kCiAgICAgIGlmIChwcm90Lmhhc093blByb3BlcnR5KCdpc1Byb3RvdHlwZU9mJykgPT09IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICAvLyBNb3N0IGxpa2VseSBhIHBsYWluIE9iamVjdAogICAgICByZXR1cm4gdHJ1ZTsKICAgIH07CgogICAgdmFyIGRhdGFzZXQgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB2YXIgVVBEQVRFX01PTk9UT05JQyA9IDA7CiAgICB2YXIgRGF0YXNldCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBBIERhdGFzZXQgY29udGFpbnMgYW4gYXJyYXkgb2YgZGF0YSBhbmQgc29tZSBtZXRhZGF0YS4KICAgICAgICAgKiBDaGFuZ2VzIHRvIHRoZSBkYXRhIG9yIG1ldGFkYXRhIHdpbGwgY2F1c2UgYW55dGhpbmcgc3Vic2NyaWJlZCB0byB0aGUgRGF0YXNldCB0byB1cGRhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge2FueVtdfSBbZGF0YT1bXV0gVGhlIGRhdGEgZm9yIHRoaXMgRGF0YXNldC4KICAgICAgICAgKiBAcGFyYW0ge2FueX0gW21ldGFkYXRhPXt9XSBBbiBvYmplY3QgY29udGFpbmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIERhdGFzZXQoZGF0YSwgbWV0YWRhdGEpIHsKICAgICAgICAgICAgaWYgKGRhdGEgPT09IHZvaWQgMCkgeyBkYXRhID0gW107IH0KICAgICAgICAgICAgaWYgKG1ldGFkYXRhID09PSB2b2lkIDApIHsgbWV0YWRhdGEgPSB7fTsgfQogICAgICAgICAgICB0aGlzLl91cGRhdGVJZCA9IFVQREFURV9NT05PVE9OSUMrKzsKICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgIHRoaXMuX21ldGFkYXRhID0gbWV0YWRhdGE7CiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IG5ldyB1dGlscyQxLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBjYWxsYmFjayB0byBiZSBjYWxsZWQgd2hlbiB0aGUgRGF0YXNldCB1cGRhdGVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEYXRhc2V0Q2FsbGJhY2t9IGNhbGxiYWNrLgogICAgICAgICAqIEByZXR1cm5zIHtEYXRhc2V0fSBUaGUgY2FsbGluZyBEYXRhc2V0LgogICAgICAgICAqLwogICAgICAgIERhdGFzZXQucHJvdG90eXBlLm9uVXBkYXRlID0gZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQoY2FsbGJhY2spOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjYWxsYmFjayB0aGF0IHdvdWxkIGJlIGNhbGxlZCB3aGVuIHRoZSBEYXRhc2V0IHVwZGF0ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RhdGFzZXRDYWxsYmFja30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJucyB7RGF0YXNldH0gVGhlIGNhbGxpbmcgRGF0YXNldC4KICAgICAgICAgKi8KICAgICAgICBEYXRhc2V0LnByb3RvdHlwZS5vZmZVcGRhdGUgPSBmdW5jdGlvbiAoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmRlbGV0ZShjYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgRGF0YXNldC5wcm90b3R5cGUuZGF0YSA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIGlmIChkYXRhID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGE7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaFVwZGF0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIERhdGFzZXQucHJvdG90eXBlLm1ldGFkYXRhID0gZnVuY3Rpb24gKG1ldGFkYXRhKSB7CiAgICAgICAgICAgIGlmIChtZXRhZGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWV0YWRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hVcGRhdGUoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBEYXRhc2V0LnByb3RvdHlwZS51cGRhdGVJZCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3VwZGF0ZUlkOwogICAgICAgIH07CiAgICAgICAgRGF0YXNldC5wcm90b3R5cGUuX2Rpc3BhdGNoVXBkYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVJZCA9IFVQREFURV9NT05PVE9OSUMrKzsKICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmNhbGxDYWxsYmFja3ModGhpcyk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gRGF0YXNldDsKICAgIH0oKSk7CiAgICBleHBvcnRzLkRhdGFzZXQgPSBEYXRhc2V0OwogICAgfSk7CgogICAgdmFyIHNpZ25hdHVyZSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIHRoZSBTaWduYXR1cmUgQVBJIHRvIGhlbHAgaW4gY29tcGFyaW5nIHdoZW4gdHdvCiAgICAgKiBQbG90dGFibGUgb2JqZWN0cyBoYXZlICJjaGFuZ2VkIi4KICAgICAqCiAgICAgKiBNZW1vaXphdGlvbiBpbiBQbG90dGFibGUgaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBzY2FsZXMgYW5kIGRhdGFzZXRzLiBXZSBjYW5ub3Qgc2ltcGx5CiAgICAgKiByZWZlcmVuY2UgY29tcGFyZSB0d28gZS5nLiBzY2FsZXMgc2luY2UgaXQgbWF5IGhhdmUgaW50ZXJuYWxseSBtdXRhdGVkLiBUbyByZXNvbHZlIHRoaXMsCiAgICAgKiB3ZSB3cml0ZSBhIHJlY3Vyc2l2ZSBTaWduYXR1cmUgaW50ZXJmYWNlIHRoYXQgaG9sZHMgYW4gaW1tdXRhYmxlIHNuYXBzaG90IG9mIHdoYXRldmVyCiAgICAgKiBzdGF0ZSB0aGUgc2NhbGUvZGF0YSB3YXMgaW4gYXQgdGhlIHRpbWUuIFRoZW4gb24gbWVtb2l6ZWQgZnVuY3Rpb24gaW52b2NhdGlvbiB3ZSBzaWduIHRoZQogICAgICogbmV3IGlucHV0cyBhbmQgY29tcGFyZSB0aGUgc2lnbmF0dXJlcyB0byBkZWNpZGUgaWYgd2Ugc2hvdWxkIHJlY29tcHV0ZS4KICAgICAqCiAgICAgKiBXZSBtdXN0IGhhbmQtd3JpdGUgYSBzaWduYXR1cmUgZm9yIGVhY2ggY3VzdG9tIGNsYXNzIHdlIHdpc2ggdG8gc3VwcG9ydC4KICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCiAgICAvKioKICAgICAqIEdlbmVyaWMgc2lnbmF0dXJlIGZhY3RvcnkgLSBwYXNzIGFueSB2YWx1ZSBhbmQgZ2V0IGEgc2lnbmF0dXJlIGZvciBpdC4KICAgICAqCiAgICAgKiBEYXRhc2V0cyBhbmQgU2NhbGVzIGFyZSBoYW5kbGVkIHNwZWNpYWxseSAtIHNlZSB0aGVpciByZXNwZWN0aXZlIHNpZ25pbmcgbWV0aG9kcy4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5wdXQgaXMgYWxyZWFkeSBhIHNpZ25hdHVyZSwgc2ltcGx5IHJldHVybiBpdC4KICAgICAqCiAgICAgKiBAcGFyYW0gYQogICAgICogQHJldHVybnMge1NpZ25hdHVyZX0KICAgICAqLwogICAgZnVuY3Rpb24gc2lnbihhKSB7CiAgICAgICAgaWYgKGEgaW5zdGFuY2VvZiBTaWduYXR1cmUpIHsKICAgICAgICAgICAgcmV0dXJuIGE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBEYXRlKSB7CiAgICAgICAgICAgIHJldHVybiBzaWduUmVmKGEudmFsdWVPZigpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoYSBpbnN0YW5jZW9mIHNjYWxlLlNjYWxlKSB7CiAgICAgICAgICAgIHJldHVybiBzaWduU2NhbGUoYSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGEgaW5zdGFuY2VvZiBkYXRhc2V0LkRhdGFzZXQpIHsKICAgICAgICAgICAgcmV0dXJuIHNpZ25EYXRhc2V0KGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc1BsYWluT2JqZWN0KGEpKSB7CiAgICAgICAgICAgIHJldHVybiBzaWduT2JqKGEpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGEpKSB7CiAgICAgICAgICAgIHJldHVybiBzaWduQXJyYXkoYSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gc2lnblJlZihhKTsKICAgICAgICB9CiAgICB9CiAgICBleHBvcnRzLnNpZ24gPSBzaWduOwogICAgZnVuY3Rpb24gc2lnblNjYWxlKHNjYWxlKSB7CiAgICAgICAgdmFyIHNjYWxlT2JqID0gewogICAgICAgICAgICAvLyByZXF1aXJlZCBpbiBjYXNlIHRoZSBkb21haW4gaGFzIGNoYW5nZWQgd2l0aG91dCB0aGUgdXBkYXRlSWQgY2hhbmdpbmcKICAgICAgICAgICAgZG9tYWluOiBzY2FsZS5kb21haW4oKSwKICAgICAgICAgICAgLy8gcmVxdWlyZWQgaW4gY2FzZSB0aGUgcmFuZ2UgaGFzIGNoYW5nZWQgd2l0aG91dCB0aGUgdXBkYXRlSWQgY2hhbmdpbmcKICAgICAgICAgICAgcmFuZ2U6IHNjYWxlLnJhbmdlKCksCiAgICAgICAgICAgIC8vIGdlbmVyaWMgY2F0Y2gtYWxsIGZvciBzY2FsZSB1cGRhdGVzIChleGlzdGluZyBjb2RlIGRvZXNuJ3QgZnVsbHkgY2F0Y2ggYWxsCiAgICAgICAgICAgIC8vIHVwZGF0ZXMsIGJ1dCBpdCdzIGdvb2QgZm9yIHNvbWV0aGluZykKICAgICAgICAgICAgdXBkYXRlSWQ6IHNjYWxlLnVwZGF0ZUlkKCksCiAgICAgICAgICAgIC8vIGtlZXAgYSByZWYgdG8gdGhlIHNjYWxlIGluIGNhc2UgdGhlIHJlZiBjaGFuZ2VzCiAgICAgICAgICAgIHJlZjogc2lnblJlZihzY2FsZSksCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gc2lnbk9iaihzY2FsZU9iaik7CiAgICB9CiAgICBleHBvcnRzLnNpZ25TY2FsZSA9IHNpZ25TY2FsZTsKICAgIGZ1bmN0aW9uIHNpZ25EYXRhc2V0KGRhdGFzZXQpIHsKICAgICAgICB2YXIgZGF0YXNldE9iaiA9IHsKICAgICAgICAgICAgcmVmOiBzaWduUmVmKGRhdGFzZXQpLAogICAgICAgICAgICAvLyBvbmx5IHNpZ24gdXBkYXRlSWQgc2luY2Ugb25seSBkYXRhKCkgYW5kIG1ldGFkYXRhKCkgZXhpc3QgYXMgcHJvcGVydGllcwogICAgICAgICAgICAvLyBhbmQgYm90aCB1cGRhdGUgdXBkYXRlSWQKICAgICAgICAgICAgdXBkYXRlSWQ6IGRhdGFzZXQudXBkYXRlSWQoKSwKICAgICAgICB9OwogICAgICAgIHJldHVybiBzaWduT2JqKGRhdGFzZXRPYmopOwogICAgfQogICAgZXhwb3J0cy5zaWduRGF0YXNldCA9IHNpZ25EYXRhc2V0OwogICAgZnVuY3Rpb24gc2lnblJlZihhKSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWZlcmVuY2VTaWduYXR1cmUoYSk7CiAgICB9CiAgICBleHBvcnRzLnNpZ25SZWYgPSBzaWduUmVmOwogICAgZnVuY3Rpb24gc2lnbkFycmF5KGEpIHsKICAgICAgICByZXR1cm4gbmV3IEFycmF5U2lnbmF0dXJlKGEubWFwKGZ1bmN0aW9uIChlbGVtZW50KSB7IHJldHVybiBzaWduKGVsZW1lbnQpOyB9KSk7CiAgICB9CiAgICBleHBvcnRzLnNpZ25BcnJheSA9IHNpZ25BcnJheTsKICAgIGZ1bmN0aW9uIHNpZ25PYmoob2JqKSB7CiAgICAgICAgdmFyIHNpZ25hdHVyZVJlY29yZCA9IHt9OwogICAgICAgIGZvciAodmFyIGtleSBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICBzaWduYXR1cmVSZWNvcmRba2V5XSA9IHNpZ24ob2JqW2tleV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgT2JqZWN0U2lnbmF0dXJlKHNpZ25hdHVyZVJlY29yZCk7CiAgICB9CiAgICBleHBvcnRzLnNpZ25PYmogPSBzaWduT2JqOwogICAgLyoqCiAgICAgKiBCYXNlIHNpZ25hdHVyZS4gU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IGlzU2lnbmF0dXJlRGlmZmVyZW50LiBBbGwgY2xhc3NlcwogICAgICogc2hvdWxkIGJlIGltbXV0YWJsZS4KICAgICAqCiAgICAgKiBVc2VycyBzaG91bGQgb25seSBjYWxsIGBpc0RpZmZlcmVudGAsIG5vdCBgaXNTaWduYXR1cmVEaWZmZXJlbnRgLgogICAgICovCiAgICB2YXIgU2lnbmF0dXJlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIGZ1bmN0aW9uIFNpZ25hdHVyZSgpIHsKICAgICAgICB9CiAgICAgICAgU2lnbmF0dXJlLnByb3RvdHlwZS5pc0RpZmZlcmVudCA9IGZ1bmN0aW9uIChvdGhlcikgewogICAgICAgICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiB0aGlzLmNvbnN0cnVjdG9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pc1NpZ25hdHVyZURpZmZlcmVudChvdGhlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFNpZ25hdHVyZTsKICAgIH0oKSk7CiAgICBleHBvcnRzLlNpZ25hdHVyZSA9IFNpZ25hdHVyZTsKICAgIC8qKgogICAgICogQSBzaWduYXR1cmUgZm9yIGFuIGFycmF5LgogICAgICovCiAgICB2YXIgQXJyYXlTaWduYXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhBcnJheVNpZ25hdHVyZSwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBBcnJheVNpZ25hdHVyZShhcnJheSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5hcnJheSA9IGFycmF5OwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFuIGFycmF5IG9mIHNpZ25hdHVyZXMgaXMgZGlmZmVyZW50IGlmIGFueSBvZiB0aGUgZWxlbWVudHMgaXNEaWZmZXJlbnQuCiAgICAgICAgICovCiAgICAgICAgQXJyYXlTaWduYXR1cmUucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50ID0gZnVuY3Rpb24gKG90aGVyKSB7CiAgICAgICAgICAgIGlmIChvdGhlci5hcnJheS5sZW5ndGggIT09IHRoaXMuYXJyYXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5hcnJheS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmFycmF5W2ldLmlzRGlmZmVyZW50KG90aGVyLmFycmF5W2ldKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIHJldHVybiBBcnJheVNpZ25hdHVyZTsKICAgIH0oU2lnbmF0dXJlKSk7CiAgICBleHBvcnRzLkFycmF5U2lnbmF0dXJlID0gQXJyYXlTaWduYXR1cmU7CiAgICB2YXIgUmVmZXJlbmNlU2lnbmF0dXJlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUmVmZXJlbmNlU2lnbmF0dXJlLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIFJlZmVyZW5jZVNpZ25hdHVyZShyZWYpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMucmVmID0gcmVmOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIFJlZmVyZW5jZVNpZ25hdHVyZS5wcm90b3R5cGUuaXNTaWduYXR1cmVEaWZmZXJlbnQgPSBmdW5jdGlvbiAob3RoZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmICE9PSBvdGhlci5yZWY7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gUmVmZXJlbmNlU2lnbmF0dXJlOwogICAgfShTaWduYXR1cmUpKTsKICAgIGV4cG9ydHMuUmVmZXJlbmNlU2lnbmF0dXJlID0gUmVmZXJlbmNlU2lnbmF0dXJlOwogICAgLyoqCiAgICAgKiBBIHNpZ25hdHVyZSBmb3IgYSBwbGFpbiBqcyBvYmplY3QuCiAgICAgKi8KICAgIHZhciBPYmplY3RTaWduYXR1cmUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhPYmplY3RTaWduYXR1cmUsIF9zdXBlcik7CiAgICAgICAgZnVuY3Rpb24gT2JqZWN0U2lnbmF0dXJlKG9iaikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5vYmogPSBvYmo7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQW4gb2JqZWN0IHNpZ25hdHVyZSBpcyBkaWZmZXJlbnQgaWYgYW55IG9mIHRoZSBlbGVtZW50cyBpc0RpZmZlcmVudC4KICAgICAgICAgKi8KICAgICAgICBPYmplY3RTaWduYXR1cmUucHJvdG90eXBlLmlzU2lnbmF0dXJlRGlmZmVyZW50ID0gZnVuY3Rpb24gKG90aGVyKSB7CiAgICAgICAgICAgIHZhciBteUtleXMgPSBPYmplY3Qua2V5cyh0aGlzLm9iaik7CiAgICAgICAgICAgIHZhciBvdGhlcktleXMgPSBPYmplY3Qua2V5cyhvdGhlci5vYmopOwogICAgICAgICAgICBpZiAobXlLZXlzLmxlbmd0aCAhPT0gb3RoZXJLZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCBteUtleXNfMSA9IG15S2V5czsgX2kgPCBteUtleXNfMS5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICAgIHZhciBrZXkgPSBteUtleXNfMVtfaV07CiAgICAgICAgICAgICAgICBpZiAoIW90aGVyLm9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vYmpba2V5XS5pc0RpZmZlcmVudChvdGhlci5vYmpba2V5XSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gT2JqZWN0U2lnbmF0dXJlOwogICAgfShTaWduYXR1cmUpKTsKICAgIGV4cG9ydHMuT2JqZWN0U2lnbmF0dXJlID0gT2JqZWN0U2lnbmF0dXJlOwogICAgfSk7CgogICAgdmFyIG1lbW9pemVfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgZnVuY3Rpb24gbWVtb2l6ZXIgdXNpbmcgdGhlIFNpZ25hdHVyZSBBUEkuCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgogICAgLyoqCiAgICAgKiBSZXR1cm4gYSBtZW1vaXplZCB2ZXJzaW9uIG9mIHRoZSBpbnB1dCBmdW5jdGlvbi4gVGhlIG1lbW9pemVkIGZ1bmN0aW9uCiAgICAgKiByZWR1Y2VzIHVubmVjZXNzYXJ5IGludm9jYXRpb25zIG9mIHRoZSBpbnB1dCBieSBrZWVwaW5nIGEgY2FjaGUgb2YgdGhlCiAgICAgKiByZXR1cm4gdmFsdWUgb2YgY29tcHV0ZToKICAgICAqCiAgICAgKiA8cHJlPgogICAgICogZnVuY3Rpb24gY29tcHV0ZShhLCBiKSB7IHJldHVybiBhICsgYiB9CiAgICAgKiBjb25zdCBtZW1vaXplZENvbXB1dGUgPSBtZW1vaXplKGNvbXB1dGUpOwogICAgICoKICAgICAqIGNvbXB1dGUoMywgNykgPT0gMTAKICAgICAqIGNvbXB1dGUoMywgNykgPT0gMTAgLy8gY2FjaGUgaGl0CiAgICAgKiA8L3ByZT4KICAgICAqCiAgICAgKiBDYWNoZSBpbnZhbGlkYXRpb24gaXMgY29tcGxpY2F0ZWQgYnkgbXV0YWJsZSBjbGFzc2VzIChTY2FsZXMgYW5kIERhdGFzZXRzKS4KICAgICAqIFRoZSBTaWduYXR1cmUgQVBJIGlzIGJ1aWx0IHRvIHNvbHZlIHRoaXMgaXNzdWUgYnkgY29uc3RydWN0aW5nIGFuIGltbXV0YWJsZQogICAgICogc25hcHNob3Qgb2YgU2NhbGVzL0RhdGFzZXRzIG9uIG1lbW9pemVkIGZ1bmN0aW9uIGludm9jYXRpb24sIHdoaWNoIGlzIGl0c2VsZgogICAgICogYSBwZXJmb3JtYW5jZSBoaXQuIFRodXMgd2UgaW50cm9kdWNlIGEgImRvTG9ja2VkIiBtZXRob2QgdGhhdCBtb21lbnRhcmlseQogICAgICogYnlwYXNzZXMgc2lnbi9jb21wYXJpc29uIGxvZ2ljIGFuZCBzaW1wbHkgcmV0dXJucyB0aGUgY2FjaGVkIHZhbHVlLgogICAgICoKICAgICAqIFNlZSB0aGUgU2lnbmF0dXJlIEFQSSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0ge0Z9IGNvbXB1dGUKICAgICAqIEByZXR1cm5zIHtNZW1vaXplZEZ1bmN0aW9uPEYgZXh0ZW5kcyBGdW5jdGlvbj59CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lbW9pemUoY29tcHV0ZSkgewogICAgICAgIHZhciBsYXN0U2lnbmF0dXJlID0gdW5kZWZpbmVkOwogICAgICAgIHZhciBsYXN0VmFsdWU7CiAgICAgICAgdmFyIGxvY2tlZCA9IGZhbHNlOwogICAgICAgIHZhciBsb2dQZXJmb3JtYW5jZSA9IGZhbHNlOwogICAgICAgIHZhciBtZW1vaXplRm4gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBhcmdzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIF9pID0gMDsgX2kgPCBhcmd1bWVudHMubGVuZ3RoOyBfaSsrKSB7CiAgICAgICAgICAgICAgICBhcmdzW19pXSA9IGFyZ3VtZW50c1tfaV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxhc3RWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgaW5wdXRTaWduYXR1cmUgPSBzaWduYXR1cmUuc2lnbkFycmF5KGFyZ3MpOwogICAgICAgICAgICBpZiAobGFzdFNpZ25hdHVyZSA9PT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICB8fCBsYXN0U2lnbmF0dXJlLmlzRGlmZmVyZW50KGlucHV0U2lnbmF0dXJlKSkgewogICAgICAgICAgICAgICAgaWYgKGxvZ1BlcmZvcm1hbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCJjYWNoZSBtaXNzISBjb21wdXRpbmciKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhc3RTaWduYXR1cmUgPSBpbnB1dFNpZ25hdHVyZTsKICAgICAgICAgICAgICAgIGxhc3RWYWx1ZSA9IGNvbXB1dGUuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobG9nUGVyZm9ybWFuY2UpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oImNhY2hlIGhpdCEiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGFzdFZhbHVlOwogICAgICAgIH07CiAgICAgICAgbWVtb2l6ZUZuLmRvTG9ja2VkID0gZnVuY3Rpb24gKGNiKSB7CiAgICAgICAgICAgIGlmIChsb2NrZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTG9ja2luZyBhbiBhbHJlYWR5IGxvY2tlZCBtZW1vaXplIGZ1bmN0aW9uISIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvY2tlZCA9IHRydWU7CiAgICAgICAgICAgIHZhciByZXRWYWwgPSBjYi5hcHBseSh0aGlzKTsKICAgICAgICAgICAgbG9ja2VkID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiByZXRWYWw7CiAgICAgICAgfTsKICAgICAgICBtZW1vaXplRm4ubG9nUGVyZm9ybWFuY2UgPSBmdW5jdGlvbiAobG9nKSB7CiAgICAgICAgICAgIGlmIChsb2cgPT09IHZvaWQgMCkgeyBsb2cgPSB0cnVlOyB9CiAgICAgICAgICAgIGxvZ1BlcmZvcm1hbmNlID0gbG9nOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIHJldHVybiBtZW1vaXplRm47CiAgICB9CiAgICBleHBvcnRzLm1lbW9pemUgPSBtZW1vaXplOwogICAgfSk7CgogICAgdmFyIG1lbW9pemVQcm9qZWN0b3JzXzEgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIC8qKgogICAgICogQW4gaW5kZXggdGhhdCBzdG9yZXMgdmFsdWVzIGJ5IG51bWVyaWMga2V5LgogICAgICoKICAgICAqIEludGVybmFsbHkgdGhpcyB1c2VzIHByb3RvdHlwZS1sZXNzIG9iamVjdHMgYXMga2V5IGxvb2t1cHMgYXJlIG1hcmdpbmFsbHkKICAgICAqIGZhc3RlciB0aGFuIGB7fWBzLgogICAgICovCiAgICB2YXIgSW5kZXhNYXAgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gSW5kZXhNYXAoKSB7CiAgICAgICAgICAgIHRoaXMubWFwID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICAgICAgdGhpcy5leGlzdHMgPSBPYmplY3QuY3JlYXRlKG51bGwpOwogICAgICAgIH0KICAgICAgICBJbmRleE1hcC5wcm90b3R5cGUuZGVsZXRlID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICBkZWxldGUgdGhpcy5tYXBba2V5XTsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuZXhpc3RzW2tleV07CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH07CiAgICAgICAgSW5kZXhNYXAucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwW2tleV07CiAgICAgICAgfTsKICAgICAgICBJbmRleE1hcC5wcm90b3R5cGUuaGFzID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICByZXR1cm4gISF0aGlzLmV4aXN0c1trZXldOwogICAgICAgIH07CiAgICAgICAgSW5kZXhNYXAucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMubWFwW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5leGlzdHNba2V5XSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEluZGV4TWFwOwogICAgfSgpKTsKICAgIC8qKgogICAgICogQSBsb2Rhc2gtc3R5bGUgYE1hcENhY2hlYCB0aGF0IHV0aWxpemVzIGEgW251bWJlciwgbnVtYmVyXSBrZXkgdG8gY3JlYXRlIGEKICAgICAqIGZhc3QtbG9va3VwIDJEIGluZGV4LiBUaGlzIGlzIG11Y2ggZmFzdGVyIHRoYW4gc3RyaW5naWZ5aW5nIHRoZSBrZXkuCiAgICAgKi8KICAgIHZhciBEYXRhc2V0SW5kZXhDYWNoZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBEYXRhc2V0SW5kZXhDYWNoZSgpIHsKICAgICAgICAgICAgdGhpcy5tYXAgPSBuZXcgSW5kZXhNYXAoKTsKICAgICAgICB9CiAgICAgICAgRGF0YXNldEluZGV4Q2FjaGUucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwLmdldChrZXlbMF0pLmdldChrZXlbMV0pOwogICAgICAgIH07CiAgICAgICAgRGF0YXNldEluZGV4Q2FjaGUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFwLmhhcyhrZXlbMF0pICYmIHRoaXMubWFwLmdldChrZXlbMF0pLmhhcyhrZXlbMV0pOwogICAgICAgIH07CiAgICAgICAgRGF0YXNldEluZGV4Q2FjaGUucHJvdG90eXBlLnNldCA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMubWFwLmhhcyhrZXlbMF0pIHx8IHRoaXMubWFwLnNldChrZXlbMF0sIG5ldyBJbmRleE1hcCgpKTsKICAgICAgICAgICAgdGhpcy5tYXAuZ2V0KGtleVswXSkuc2V0KGtleVsxXSwgdmFsdWUpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIERhdGFzZXRJbmRleENhY2hlLnByb3RvdHlwZS5kZWxldGUgPSBmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgIC8vIE5PVEU6IHRoaXMgY2FuIHBvdGVudGlhbGx5IGxlYXZlIGRhbmdsaW5nIGBJbmRleE1hcGBzIGlmIHdlIGRlbGV0ZQogICAgICAgICAgICAvLyBhbGwgdGhlIGtleXMgZnJvbSB0aGUgaW5kZXggaW5zdGVhZCBvZiB1c2luZyBgY2xlYXJgLiBUaGUgb3ZlcmhlYWQgaXMKICAgICAgICAgICAgLy8gbWluaW1hbCwgc28gdGhpcyBpcyBmaW5lLgogICAgICAgICAgICB0aGlzLm1hcC5oYXMoa2V5WzBdKSAmJiB0aGlzLm1hcC5nZXQoa2V5WzBdKS5kZWxldGUoa2V5WzFdKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfTsKICAgICAgICBEYXRhc2V0SW5kZXhDYWNoZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMubWFwID0gbmV3IEluZGV4TWFwKCk7CiAgICAgICAgfTsKICAgICAgICBEYXRhc2V0SW5kZXhDYWNoZS5yZXNvbHZlciA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7IHJldHVybiBbZGF0YXNldC51cGRhdGVJZCgpLCBpXTsgfTsKICAgICAgICByZXR1cm4gRGF0YXNldEluZGV4Q2FjaGU7CiAgICB9KCkpOwogICAgZnVuY3Rpb24gbWVtb2l6ZVByb2plY3Rvcihwcm9qZWN0b3IpIHsKICAgICAgICB2YXIgbWVtbyA9IGxvZGFzaC5tZW1vaXplKHByb2plY3RvciwgRGF0YXNldEluZGV4Q2FjaGUucmVzb2x2ZXIpOwogICAgICAgIG1lbW8uY2FjaGUgPSBuZXcgRGF0YXNldEluZGV4Q2FjaGUoKTsKICAgICAgICByZXR1cm4gbWVtbzsKICAgIH0KICAgIGV4cG9ydHMubWVtb2l6ZVByb2plY3RvciA9IG1lbW9pemVQcm9qZWN0b3I7CiAgICBmdW5jdGlvbiBtZW1vaXplUHJvamVjdG9ycyhhdHRyVG9Qcm9qZWN0b3IpIHsKICAgICAgICBPYmplY3Qua2V5cyhhdHRyVG9Qcm9qZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3Jba2V5XSA9IG1lbW9pemVQcm9qZWN0b3IoYXR0clRvUHJvamVjdG9yW2tleV0pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBhdHRyVG9Qcm9qZWN0b3I7CiAgICB9CiAgICBleHBvcnRzLm1lbW9pemVQcm9qZWN0b3JzID0gbWVtb2l6ZVByb2plY3RvcnM7CiAgICB9KTsKCiAgICB2YXIgbWVtVGh1bmtfMSA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICogQGZpbGVvdmVydmlldyBJbXBsZW1lbnRzIGEgY29udmVuaWVudCB0aHVuayBmdW5jdGlvbiB0byBoYW5kbGUgdGhlIGNvbW1vbiBjYXNlCiAgICAgKiBvZiBjcmVhdGluZyBhIG1lbW9pemVkIGZ1bmN0aW9uIHRoYXQgdGFrZXMgaXRzIGlucHV0cyBmcm9tIG11dGFibGUgY2xhc3MgcHJvcGVydGllcy4KICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICAvKioKICAgICAqIEZpcnN0IHBhc3MgYXJndW1lbnQgdGh1bmtzIHRoYXQgd2lsbCBiZSBldmFsdWF0ZWQgd2hlbmV2ZXIgdGhlIG1lbVRodW5rCiAgICAgKiBpcyBhY2Nlc3NlZC4gVGhpcyBzaG91bGQgYmUgZmFzdCBhbmQgc2ltcGxlLgogICAgICoKICAgICAqIFRoZW4gcGFzcyBhIHB1cmUgZnVuY3Rpb24gdGhhdCwgd2hlbiBnaXZlbiB0aGUgYXJndW1lbnQgdGh1bmtzJyB2YWx1ZXMsCiAgICAgKiB3aWxsIG91dHB1dCBzb21lIGNvbXB1dGVkIHZhbHVlLiBJdCBzaG91bGQgbm90IHVzZSBgdGhpc2AgaW4gdGhlIGJvZHkuCiAgICAgKgogICAgICogV2UgbWVtb2l6ZSBhbmQgcmV0dXJuIHRoaXMgcHVyZSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIHdheSwgbWVtVGh1bmsgbGV0cyB5b3UgaW1wbGVtZW50IGEgcGVyZm9ybWFudCwgYWx3YXlzLXVwLXRvLWRhdGUgImNvbXB1dGVkIgogICAgICogdmFsdWUgZ2V0dGVyLgogICAgICovCiAgICBmdW5jdGlvbiBtZW1UaHVuaygpIHsKICAgICAgICB2YXIgYXJnc0FuZENvbXB1dGUgPSBbXTsKICAgICAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgYXJndW1lbnRzLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICBhcmdzQW5kQ29tcHV0ZVtfaV0gPSBhcmd1bWVudHNbX2ldOwogICAgICAgIH0KICAgICAgICB2YXIgaW5wdXRzID0gYXJnc0FuZENvbXB1dGUuc2xpY2UoMCwgLTEpOwogICAgICAgIHZhciBjb21wdXRlID0gYXJnc0FuZENvbXB1dGVbYXJnc0FuZENvbXB1dGUubGVuZ3RoIC0gMV07CiAgICAgICAgdmFyIG1lbW9pemVkQ29tcHV0ZSA9IG1lbW9pemUubWVtb2l6ZShjb21wdXRlKTsKICAgICAgICB2YXIgbWVtb2l6ZWRUaHVuayA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGlucHV0RXZhbCA9IGlucHV0cy5tYXAoZnVuY3Rpb24gKGlucHV0Rm4pIHsgcmV0dXJuIGlucHV0Rm4uYXBwbHkoX3RoaXMpOyB9KTsKICAgICAgICAgICAgcmV0dXJuIG1lbW9pemVkQ29tcHV0ZS5hcHBseSh1bmRlZmluZWQsIGlucHV0RXZhbCk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbWVtb2l6ZWRUaHVuazsKICAgIH0KICAgIGV4cG9ydHMubWVtVGh1bmsgPSBtZW1UaHVuazsKICAgIH0pOwoKICAgIHZhciBtZW1vaXplID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihtZW1vaXplXzEsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihtZW1vaXplUHJvamVjdG9yc18xLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIobWVtVGh1bmtfMSwgZXhwb3J0cyk7CgogICAgZXhwb3J0cy5zaWduID0gc2lnbmF0dXJlLnNpZ247CiAgICB9KTsKCiAgICB2YXIgY2FudmFzRHJhd2VyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgogICAgLyoqCiAgICAgKiBBIENhbnZhc0RyYXdlciBkcmF3cyBkYXRhIG9udG8gYSBzdXBwbGllZCBDYW52YXMgQ29udGV4dC4KICAgICAqCiAgICAgKiBUaGlzIGNsYXNzIGlzIGltbXV0YWJsZSAoYnV0IGhhcyBpbnRlcm5hbCBzdGF0ZSkgYW5kIHNob3VsZG4ndCBiZSBleHRlbmRlZC4KICAgICAqLwogICAgdmFyIENhbnZhc0RyYXdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gX2NvbnRleHQgVGhlIGNvbnRleHQgZm9yIGEgY2FudmFzIHRoYXQgdGhpcyBkcmF3ZXIgd2lsbCBkcmF3IHRvLgogICAgICAgICAqIEBwYXJhbSBfZHJhd1N0ZXAgVGhlIGRyYXcgc3RlcCBsb2dpYyB0aGF0IGFjdHVhbGx5IGRyYXdzLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIENhbnZhc0RyYXdlcihfY29udGV4dCwgX2RyYXdTdGVwKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQgPSBfY29udGV4dDsKICAgICAgICAgICAgdGhpcy5fZHJhd1N0ZXAgPSBfZHJhd1N0ZXA7CiAgICAgICAgfQogICAgICAgIC8vIHB1YmxpYyBmb3IgdGVzdGluZwogICAgICAgIENhbnZhc0RyYXdlci5wcm90b3R5cGUuZ2V0RHJhd1N0ZXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmF3U3RlcDsKICAgICAgICB9OwogICAgICAgIENhbnZhc0RyYXdlci5wcm90b3R5cGUuZHJhdyA9IGZ1bmN0aW9uIChkYXRhLCBhcHBsaWVkRHJhd1N0ZXBzKSB7CiAgICAgICAgICAgIHZhciBwcm9qZWN0b3IgPSBhcHBsaWVkRHJhd1N0ZXBzW2FwcGxpZWREcmF3U3RlcHMubGVuZ3RoIC0gMV0uYXR0clRvQXBwbGllZFByb2plY3RvcjsKICAgICAgICAgICAgLy8gZG9uJ3Qgc3VwcG9ydCBhbmltYXRpb25zIGZvciBub3c7IGp1c3QgZHJhdyB0aGUgbGFzdCBkcmF3IHN0ZXAgaW1tZWRpYXRlbHkKICAgICAgICAgICAgdGhpcy5fY29udGV4dC5zYXZlKCk7CiAgICAgICAgICAgIHRoaXMuX2RyYXdTdGVwKHRoaXMuX2NvbnRleHQsIGRhdGEsIHByb2plY3Rvcik7CiAgICAgICAgICAgIHRoaXMuX2NvbnRleHQucmVzdG9yZSgpOwogICAgICAgIH07CiAgICAgICAgQ2FudmFzRHJhd2VyLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgfTsKICAgICAgICBDYW52YXNEcmF3ZXIucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfTsKICAgICAgICBDYW52YXNEcmF3ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gTk8gb3AgLSBjYW52YXMgZWxlbWVudCBvd25zIHRoZSBjYW52YXM7IGNvbnRleHQgaXMgZnJlZQogICAgICAgIH07CiAgICAgICAgcmV0dXJuIENhbnZhc0RyYXdlcjsKICAgIH0oKSk7CiAgICBleHBvcnRzLkNhbnZhc0RyYXdlciA9IENhbnZhc0RyYXdlcjsKICAgIGV4cG9ydHMuQ29udGV4dFN0eWxlQXR0cnMgPSBbCiAgICAgICAgImZpbGwtb3BhY2l0eSIsCiAgICAgICAgImZpbGwiLAogICAgICAgICJvcGFjaXR5IiwKICAgICAgICAic3Ryb2tlLW9wYWNpdHkiLAogICAgICAgICJzdHJva2Utd2lkdGgiLAogICAgICAgICJzdHJva2UiLAogICAgICAgICJzdHJva2UtZGFzaGFycmF5IiwKICAgIF07CiAgICAvKioKICAgICAqIERFUFJFQ0FURUQuIFByZWNvbXB1dGUgdGhlIGNvbmNhdHRlZCBhcnJheSBhbmQgdXNlIGByZXNvbHZlQXR0cmlidXRlc2AKICAgICAqIGluc3RlYWQgb2YgdXNpbmcgdGhpcyBpbiB0aGUgaW5uZXIgbG9vcC4KICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZUF0dHJpYnV0ZXNTdWJzZXRXaXRoU3R5bGVzKHByb2plY3RvciwgZXh0cmFLZXlzLCBkYXR1bSwgaW5kZXgpIHsKICAgICAgICB2YXIgYXR0cktleXMgPSBleHBvcnRzLkNvbnRleHRTdHlsZUF0dHJzLmNvbmNhdChleHRyYUtleXMpOwogICAgICAgIHJldHVybiByZXNvbHZlQXR0cmlidXRlcyhwcm9qZWN0b3IsIGF0dHJLZXlzLCBkYXR1bSwgaW5kZXgpOwogICAgfQogICAgZXhwb3J0cy5yZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXMgPSByZXNvbHZlQXR0cmlidXRlc1N1YnNldFdpdGhTdHlsZXM7CiAgICBmdW5jdGlvbiByZXNvbHZlQXR0cmlidXRlcyhwcm9qZWN0b3IsIGF0dHJLZXlzLCBkYXR1bSwgaW5kZXgpIHsKICAgICAgICB2YXIgYXR0cnMgPSB7fTsKICAgICAgICBmb3IgKHZhciBfaSA9IDAsIGF0dHJLZXlzXzEgPSBhdHRyS2V5czsgX2kgPCBhdHRyS2V5c18xLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICB2YXIgYXR0cktleSA9IGF0dHJLZXlzXzFbX2ldOwogICAgICAgICAgICBpZiAocHJvamVjdG9yLmhhc093blByb3BlcnR5KGF0dHJLZXkpKSB7CiAgICAgICAgICAgICAgICBhdHRyc1thdHRyS2V5XSA9IHByb2plY3RvclthdHRyS2V5XShkYXR1bSwgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhdHRyczsKICAgIH0KICAgIGV4cG9ydHMucmVzb2x2ZUF0dHJpYnV0ZXMgPSByZXNvbHZlQXR0cmlidXRlczsKICAgIGZ1bmN0aW9uIGdldFN0cm9rZU9wYWNpdHkoc3R5bGUpIHsKICAgICAgICB2YXIgYmFzZU9wYWNpdHkgPSBzdHlsZVsib3BhY2l0eSJdICE9IG51bGwgPyBwYXJzZUZsb2F0KHN0eWxlWyJvcGFjaXR5Il0pIDogMTsKICAgICAgICB2YXIgc3Ryb2tlT3BhY2l0eSA9IHN0eWxlWyJzdHJva2Utb3BhY2l0eSJdICE9IG51bGwgPyBwYXJzZUZsb2F0KHN0eWxlWyJzdHJva2Utb3BhY2l0eSJdKSA6IDE7CiAgICAgICAgcmV0dXJuIHN0cm9rZU9wYWNpdHkgKiBiYXNlT3BhY2l0eTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldEZpbGxPcGFjaXR5KHN0eWxlKSB7CiAgICAgICAgdmFyIGJhc2VPcGFjaXR5ID0gc3R5bGVbIm9wYWNpdHkiXSAhPSBudWxsID8gcGFyc2VGbG9hdChzdHlsZVsib3BhY2l0eSJdKSA6IDE7CiAgICAgICAgdmFyIGZpbGxPcGFjaXR5ID0gc3R5bGVbImZpbGwtb3BhY2l0eSJdICE9IG51bGwgPyBwYXJzZUZsb2F0KHN0eWxlWyJmaWxsLW9wYWNpdHkiXSkgOiAxOwogICAgICAgIHJldHVybiBmaWxsT3BhY2l0eSAqIGJhc2VPcGFjaXR5OwogICAgfQogICAgZnVuY3Rpb24gZ2V0U3Ryb2tlV2lkdGgoc3R5bGUpIHsKICAgICAgICByZXR1cm4gc3R5bGVbInN0cm9rZS13aWR0aCJdICE9IG51bGwgPyBwYXJzZUZsb2F0KHN0eWxlWyJzdHJva2Utd2lkdGgiXSkgOiAxOwogICAgfQogICAgZXhwb3J0cy5nZXRTdHJva2VXaWR0aCA9IGdldFN0cm9rZVdpZHRoOwogICAgZnVuY3Rpb24gZ2V0U3Ryb2tlRGFzaEFycmF5KHN0eWxlKSB7CiAgICAgICAgdmFyIHJhd1ZhbHVlID0gc3R5bGVbInN0cm9rZS1kYXNoYXJyYXkiXTsKICAgICAgICBpZiAocmF3VmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJhd1ZhbHVlLnNwbGl0KC9bICxdKy8pLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4gcGFyc2VJbnQoeCwgMTApOyB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcigiZ2V0U3Ryb2tlRGFzaEFycmF5IGZhaWxlZCB3aXRoOiAiICsgZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIFtdOwogICAgfQogICAgZXhwb3J0cy5nZXRTdHJva2VEYXNoQXJyYXkgPSBnZXRTdHJva2VEYXNoQXJyYXk7CiAgICBmdW5jdGlvbiByZW5kZXJBcmVhKGNvbnRleHQsIGQzQXJlYSwgZGF0YSwgc3R5bGUpIHsKICAgICAgICBjb250ZXh0LnNhdmUoKTsKICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpOwogICAgICAgIGQzQXJlYS5jb250ZXh0KGNvbnRleHQpOwogICAgICAgIGQzQXJlYShkYXRhKTsKICAgICAgICBjb250ZXh0LmxpbmVKb2luID0gInJvdW5kIjsKICAgICAgICByZW5kZXJQYXRoV2l0aFN0eWxlKGNvbnRleHQsIHN0eWxlKTsKICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTsKICAgIH0KICAgIGV4cG9ydHMucmVuZGVyQXJlYSA9IHJlbmRlckFyZWE7CiAgICBmdW5jdGlvbiByZW5kZXJMaW5lKGNvbnRleHQsIGQzTGluZSwgZGF0YSwgc3R5bGUpIHsKICAgICAgICBjb250ZXh0LnNhdmUoKTsKICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpOwogICAgICAgIGQzTGluZS5jb250ZXh0KGNvbnRleHQpOwogICAgICAgIGQzTGluZShkYXRhKTsKICAgICAgICBjb250ZXh0LmxpbmVKb2luID0gInJvdW5kIjsKICAgICAgICByZW5kZXJQYXRoV2l0aFN0eWxlKGNvbnRleHQsIHN0eWxlKTsKICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTsKICAgIH0KICAgIGV4cG9ydHMucmVuZGVyTGluZSA9IHJlbmRlckxpbmU7CiAgICBmdW5jdGlvbiByZW5kZXJQYXRoV2l0aFN0eWxlKGNvbnRleHQsIHN0eWxlKSB7CiAgICAgICAgaWYgKHN0eWxlWyJzdHJva2UiXSkgewogICAgICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGdldFN0cm9rZVdpZHRoKHN0eWxlKTsKICAgICAgICAgICAgdmFyIHN0cm9rZUNvbG9yID0gZDMuY29sb3Ioc3R5bGVbInN0cm9rZSJdKTsKICAgICAgICAgICAgdmFyIHN0cm9rZURhc2hBcnJheSA9IGdldFN0cm9rZURhc2hBcnJheShzdHlsZSk7CiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goc3Ryb2tlRGFzaEFycmF5KTsKICAgICAgICAgICAgc3Ryb2tlQ29sb3Iub3BhY2l0eSAqPSBnZXRTdHJva2VPcGFjaXR5KHN0eWxlKTsKICAgICAgICAgICAgY29udGV4dC5zdHJva2VTdHlsZSA9IHN0cm9rZUNvbG9yLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7CiAgICAgICAgfQogICAgICAgIGlmIChzdHlsZVsiZmlsbCJdKSB7CiAgICAgICAgICAgIHZhciBmaWxsQ29sb3IgPSBkMy5jb2xvcihzdHlsZVsiZmlsbCJdKTsKICAgICAgICAgICAgZmlsbENvbG9yLm9wYWNpdHkgKj0gZ2V0RmlsbE9wYWNpdHkoc3R5bGUpOwogICAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IGZpbGxDb2xvci50b1N0cmluZygpOwogICAgICAgICAgICBjb250ZXh0LmZpbGwoKTsKICAgICAgICB9CiAgICB9CiAgICBleHBvcnRzLnJlbmRlclBhdGhXaXRoU3R5bGUgPSByZW5kZXJQYXRoV2l0aFN0eWxlOwogICAgfSk7CgogICAgdmFyIGRyYXdlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgLyoqCiAgICAgKiBBIERyYXdlciBpcyBhIHN0YXRlZnVsIGNsYXNzIHRoYXQgaG9sZHMgb25lIFNWR0RyYXdlciBhbmQgb25lIENhbnZhc0RyYXdlciwgYW5kIGNhbiBzd2l0Y2ggYmV0d2VlbgogICAgICogdGhlIHR3by4KICAgICAqLwogICAgdmFyIFByb3h5RHJhd2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgIC8qKgogICAgICAgICAqIEEgRHJhd2VyIGRyYXdzIHN2ZyBlbGVtZW50cyBiYXNlZCBvbiB0aGUgaW5wdXQgRGF0YXNldC4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSBfc3ZnRHJhd2VyRmFjdG9yeSBBIGZhY3RvcnkgdGhhdCB3aWxsIGJlIGludm9rZWQgdG8gY3JlYXRlIGFuIFNWR0RyYXdlciB3aGVuZXZlciB1c2VTVkcgaXMgY2FsbGVkCiAgICAgICAgICogQHBhcmFtIF9jYW52YXNEcmF3U3RlcCBUaGUgRHJhd1N0ZXAgdG8gYmUgZmVkIGludG8gYSBuZXcgQ2FudmFzRHJhd2VyIHdoZW5ldmVyIHVzZUNhbnZhcyBpcyBjYWxsZWQKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBQcm94eURyYXdlcihfc3ZnRHJhd2VyRmFjdG9yeSwgX2NhbnZhc0RyYXdlckZhY3RvcnkpIHsKICAgICAgICAgICAgdGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSA9IF9zdmdEcmF3ZXJGYWN0b3J5OwogICAgICAgICAgICB0aGlzLl9jYW52YXNEcmF3ZXJGYWN0b3J5ID0gX2NhbnZhc0RyYXdlckZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZSB0aGUgb2xkIGRyYXdlciBhbmQgdXNlIFNWRyByZW5kZXJpbmcgZnJvbSBub3cgb24uCiAgICAgICAgICovCiAgICAgICAgUHJveHlEcmF3ZXIucHJvdG90eXBlLnVzZVNWRyA9IGZ1bmN0aW9uIChwYXJlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnREcmF3ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3ZnRHJhd2VyID0gdGhpcy5fc3ZnRHJhd2VyRmFjdG9yeSgpOwogICAgICAgICAgICBzdmdEcmF3ZXIuYXR0YWNoVG8ocGFyZW50KTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudERyYXdlciA9IHN2Z0RyYXdlcjsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZSB0aGUgb2xkIGRyYXdlciBhbmQgdXNlIENhbnZhcyByZW5kZXJpbmcgZnJvbSBub3cgb24uCiAgICAgICAgICovCiAgICAgICAgUHJveHlEcmF3ZXIucHJvdG90eXBlLnVzZUNhbnZhcyA9IGZ1bmN0aW9uIChjYW52YXMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnREcmF3ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudERyYXdlci5yZW1vdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jdXJyZW50RHJhd2VyID0gdGhpcy5fY2FudmFzRHJhd2VyRmFjdG9yeShjYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIikpOwogICAgICAgIH07CiAgICAgICAgLy8gcHVibGljIGZvciB0ZXN0aW5nCiAgICAgICAgUHJveHlEcmF3ZXIucHJvdG90eXBlLmdldERyYXdlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2N1cnJlbnREcmF3ZXI7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIHRoaXMgRHJhd2VyJ3MgcmVuZGVyQXJlYQogICAgICAgICAqLwogICAgICAgIFByb3h5RHJhd2VyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50RHJhd2VyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnREcmF3ZXIucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFByb3h5RHJhd2VyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGRhdGEsIGRyYXdTdGVwcykgewogICAgICAgICAgICB0aGlzLl9jdXJyZW50RHJhd2VyLmRyYXcoZGF0YSwgZHJhd1N0ZXBzKTsKICAgICAgICB9OwogICAgICAgIFByb3h5RHJhd2VyLnByb3RvdHlwZS5nZXRWaXN1YWxQcmltaXRpdmVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVzKCk7CiAgICAgICAgfTsKICAgICAgICBQcm94eURyYXdlci5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3VycmVudERyYXdlci5nZXRWaXN1YWxQcmltaXRpdmVBdEluZGV4KGluZGV4KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBQcm94eURyYXdlcjsKICAgIH0oKSk7CiAgICBleHBvcnRzLlByb3h5RHJhd2VyID0gUHJveHlEcmF3ZXI7CiAgICB9KTsKCiAgICB2YXIgc3ZnRHJhd2VyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKICAgIC8qKgogICAgICogQW4gU1ZHRHJhd2VyIGRyYXdzIGRhdGEgYnkgY3JlYXRpbmcgRE9NIGVsZW1lbnRzIGFuZCBzZXR0aW5nIHNwZWNpZmljIGF0dHJpYnV0ZXMgb24gdGhlbQogICAgICogdG8gYWNjdXJhdGVseSByZWZsZWN0IHRoZSBkYXRhIGJlaW5nIHBhc3NlZCBpbi4KICAgICAqCiAgICAgKiBUaGlzIGNsYXNzIGlzIGltbXV0YWJsZSAoYnV0IGhhcyBpbnRlcm5hbCBzdGF0ZSkuCiAgICAgKi8KICAgIHZhciBTVkdEcmF3ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHN2Z0VsZW1lbnROYW1lIGFuIEhUTUwvU1ZHIHRhZyBuYW1lIHRvIGJlIGNyZWF0ZWQsIG9uZSBwZXIgZGF0dW0uCiAgICAgICAgICogQHBhcmFtIGNsYXNzTmFtZSBDU1MgY2xhc3NlcyB0byBiZSBhcHBsaWVkIHRvIHRoZSBkcmF3biBwcmltaXRpdmVzLgogICAgICAgICAqIEBwYXJhbSBhcHBseURlZmF1bHRBdHRyaWJ1dGVzCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gU1ZHRHJhd2VyKHN2Z0VsZW1lbnROYW1lLCBjbGFzc05hbWUpIHsKICAgICAgICAgICAgdGhpcy5fcm9vdCA9IGQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiwgImciKSk7CiAgICAgICAgICAgIHRoaXMuX2NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKICAgICAgICAgICAgdGhpcy5fc3ZnRWxlbWVudE5hbWUgPSBzdmdFbGVtZW50TmFtZTsKICAgICAgICB9CiAgICAgICAgU1ZHRHJhd2VyLnByb3RvdHlwZS5kcmF3ID0gZnVuY3Rpb24gKGRhdGEsIGFwcGxpZWREcmF3U3RlcHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgLyoKICAgICAgICAgICAgICogRHJhdyB0byB0aGUgRE9NIGJ5IGNsZWFyaW5nIG9sZCBET00gZWxlbWVudHMsIGFkZGluZyBuZXcgRE9NIGVsZW1lbnRzLAogICAgICAgICAgICAgKiBhbmQgdGhlbiBwYXNzaW5nIHRob3NlIERPTSBlbGVtZW50cyB0byB0aGUgYW5pbWF0b3IsIHdoaWNoIHdpbGwgc2V0IHRoZQogICAgICAgICAgICAgKiBhcHByb3ByaWF0ZSBhdHRyaWJ1dGVzIG9uIHRoZSBET00uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jcmVhdGVBbmREZXN0cm95RE9NRWxlbWVudHMoZGF0YSk7CiAgICAgICAgICAgIHZhciBkZWxheSA9IDA7CiAgICAgICAgICAgIHZhciBkcmF3TGVuZ3RoID0gYXBwbGllZERyYXdTdGVwcy5sZW5ndGg7CiAgICAgICAgICAgIHZhciBfbG9vcF8xID0gZnVuY3Rpb24gKGkpIHsKICAgICAgICAgICAgICAgIHZhciBkcmF3U3RlcCA9IGFwcGxpZWREcmF3U3RlcHNbaV07CiAgICAgICAgICAgICAgICB1dGlscyQxLldpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9kcmF3U3RlcChkcmF3U3RlcCk7IH0sIGRlbGF5KTsKICAgICAgICAgICAgICAgIGRlbGF5ICs9IGRyYXdTdGVwLmFuaW1hdG9yLnRvdGFsVGltZShkYXRhLmxlbmd0aCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZHJhd0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBfbG9vcF8xKGkpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBTVkdEcmF3ZXIucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZXMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZXMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzID0gdGhpcy5fc2VsZWN0aW9uLm5vZGVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlczsKICAgICAgICB9OwogICAgICAgIFNWR0RyYXdlci5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleCA9IGZ1bmN0aW9uIChpbmRleCkgewogICAgICAgICAgICBpZiAodGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVNYXAgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhY2hlZFZpc3VhbFByaW1pdGl2ZXNOb2RlTWFwLmdldChpbmRleCk7CiAgICAgICAgfTsKICAgICAgICBTVkdEcmF3ZXIucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fcm9vdC5yZW1vdmUoKTsKICAgICAgICB9OwogICAgICAgIFNWR0RyYXdlci5wcm90b3R5cGUuYXR0YWNoVG8gPSBmdW5jdGlvbiAocGFyZW50KSB7CiAgICAgICAgICAgIHBhcmVudC5ub2RlKCkuYXBwZW5kQ2hpbGQodGhpcy5fcm9vdC5ub2RlKCkpOwogICAgICAgIH07CiAgICAgICAgLy8gcHVibGljIGZvciB0ZXN0aW5nCiAgICAgICAgU1ZHRHJhd2VyLnByb3RvdHlwZS5nZXRSb290ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcm9vdDsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIENTUyBzZWxlY3RvciBmb3IgdGhpcyBEcmF3ZXIncyB2aXN1YWwgZWxlbWVudHMuCiAgICAgICAgICovCiAgICAgICAgU1ZHRHJhd2VyLnByb3RvdHlwZS5zZWxlY3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N2Z0VsZW1lbnROYW1lOwogICAgICAgIH07CiAgICAgICAgU1ZHRHJhd2VyLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChzZWxlY3Rpb24pIHsKICAgICAgICAgICAgLy8gc3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUKICAgICAgICB9OwogICAgICAgIFNWR0RyYXdlci5wcm90b3R5cGUuX2NyZWF0ZUFuZERlc3Ryb3lET01FbGVtZW50cyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgIC8vIGZpcnN0IHN0b3JlIHNvdXJjZSBkYXRhIGluZGV4IGJlZm9yZSBhbnkgZmlsdGVyaW5nIHRha2VzIHBsYWNlCiAgICAgICAgICAgIHZhciBtYXBwZWREYXRhID0gZGF0YS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIGQgIT0gbnVsbCA/IHsgZDogZCwgaTogaSB9IDogbnVsbDsgfSk7CiAgICAgICAgICAgIC8vIFdoZXJlYXMgY2FudmFzIHJlbmRlcnMgY2FuIGNvcGUgd2l0aCBudWxsIGRhdGEgdmFsdWVzLCBzdmcgcmVuZGVyZXIKICAgICAgICAgICAgLy8gYXR0cmlidXRlIGFjY2Vzc29ycyBhc3N1bWUgbm9uLW51bGwgZGF0YSB2YWx1ZXMsIHNvIHdlIG11c3QgZmlsdGVyIHRoZW0KICAgICAgICAgICAgLy8gb3V0LiBVbmZvcnR1bmF0ZWx5LCB0aGlzIG1lYW5zIHRoZSBpbmRleCBwYXNzZWQgdG8gZWFjaCBhY2Nlc3NvciB3aWxsCiAgICAgICAgICAgIC8vIG5vdCBuZWNlc3NhcmlseSBtYXRjaCB0aGUgaW5kZXggb2YgdGhlIGRhdHVtIGluIHRoZSBkYXRhc2V0LgogICAgICAgICAgICB2YXIgZmlsdGVyZWREYXRhID0gbWFwcGVkRGF0YS5maWx0ZXIoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQgIT0gbnVsbDsgfSk7CiAgICAgICAgICAgIHZhciBkYXRhRWxlbWVudHNVcGRhdGUgPSB0aGlzLl9yb290LnNlbGVjdEFsbCh0aGlzLnNlbGVjdG9yKCkpLmRhdGEoZmlsdGVyZWREYXRhKTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uID0gZGF0YUVsZW1lbnRzVXBkYXRlCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCh0aGlzLl9zdmdFbGVtZW50TmFtZSkKICAgICAgICAgICAgICAgIC5tZXJnZShkYXRhRWxlbWVudHNVcGRhdGUpOwogICAgICAgICAgICBkYXRhRWxlbWVudHNVcGRhdGUuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICAvLyBidWlsZCBtYXAgb2Ygc291cmNlIGRhdGEgaW5kZXggdG8gRWxlbWVudAogICAgICAgICAgICB2YXIgbmV3TWFwID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbi5lYWNoKGZ1bmN0aW9uIChkYXRhQW5kSW5kZXgpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8gb3B0aW9uYWxseSBhdHRhY2ggZGF0YSBhdHRyaWJ1dGVzIHRvIEVsZW1lbnQKICAgICAgICAgICAgICAgIC8vIHRoaXMuc2V0QXR0cmlidXRlKCJkYXRhLXNvdXJjZS1kYXRhIiwgZGF0YUFuZEluZGV4LmQpOwogICAgICAgICAgICAgICAgLy8gdGhpcy5zZXRBdHRyaWJ1dGUoImRhdGEtc291cmNlLWluZGV4IiwgZGF0YUFuZEluZGV4LmkpOwogICAgICAgICAgICAgICAgbmV3TWFwLnNldChkYXRhQW5kSW5kZXguaSwgdGhpcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9jYWNoZWRWaXN1YWxQcmltaXRpdmVzTm9kZU1hcCA9IG5ld01hcDsKICAgICAgICAgICAgdGhpcy5fY2FjaGVkVmlzdWFsUHJpbWl0aXZlc05vZGVzID0gbnVsbDsKICAgICAgICAgICAgLy8gdW53cmFwIGRhdGEgbm93IHRoYXQgZWxlbWVudHMgbWF0Y2ggdGhlaXIgb3JpZ2luYWwgZGF0YSBpbmRleAogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24uZGF0YSh0aGlzLl9zZWxlY3Rpb24uZGF0YSgpLm1hcChmdW5jdGlvbiAoX2EpIHsKICAgICAgICAgICAgICAgIHZhciBkID0gX2EuZDsKICAgICAgICAgICAgICAgIHJldHVybiBkOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9jbGFzc05hbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uLmNsYXNzZWQodGhpcy5fY2xhc3NOYW1lLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzKHRoaXMuX3NlbGVjdGlvbik7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBEcmF3cyBkYXRhIHVzaW5nIG9uZSBzdGVwCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW17QXBwbGllZERyYXdTdGVwfSBzdGVwIFRoZSBzdGVwLCBob3cgZGF0YSBzaG91bGQgYmUgZHJhd24uCiAgICAgICAgICovCiAgICAgICAgU1ZHRHJhd2VyLnByb3RvdHlwZS5fZHJhd1N0ZXAgPSBmdW5jdGlvbiAoc3RlcCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgY29sb3JBdHRyaWJ1dGVzID0gWyJmaWxsIiwgInN0cm9rZSJdOwogICAgICAgICAgICBjb2xvckF0dHJpYnV0ZXMuZm9yRWFjaChmdW5jdGlvbiAoY29sb3JBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgIGlmIChzdGVwLmF0dHJUb0FwcGxpZWRQcm9qZWN0b3JbY29sb3JBdHRyaWJ1dGVdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2VsZWN0aW9uLmF0dHIoY29sb3JBdHRyaWJ1dGUsIHN0ZXAuYXR0clRvQXBwbGllZFByb2plY3Rvcltjb2xvckF0dHJpYnV0ZV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgc3RlcC5hbmltYXRvci5hbmltYXRlKHRoaXMuX3NlbGVjdGlvbiwgc3RlcC5hdHRyVG9BcHBsaWVkUHJvamVjdG9yKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2NsYXNzTmFtZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24uY2xhc3NlZCh0aGlzLl9jbGFzc05hbWUsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gU1ZHRHJhd2VyOwogICAgfSgpKTsKICAgIGV4cG9ydHMuU1ZHRHJhd2VyID0gU1ZHRHJhd2VyOwogICAgfSk7CgogICAgdmFyIGRlZmVycmVkUmVuZGVyZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE3LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKICAgIC8qKgogICAgICogU3RvcmVzIHRoZSBkZWZlcnJlZCB0cmFuc2Zvcm1hdGlvbiBzdGF0ZSBmb3IgYSBzaW5nbGUgc2NhbGUuCiAgICAgKi8KICAgIHZhciBEb21haW5UcmFuc2Zvcm0gPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoKSB7CiAgICAgICAgZnVuY3Rpb24gRG9tYWluVHJhbnNmb3JtKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLnNjYWxlID0gMDsKICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUgPSAwOwogICAgICAgICAgICB0aGlzLmNhY2hlZERvbWFpbiA9IFtudWxsLCBudWxsXTsKICAgICAgICAgICAgdGhpcy5sYXN0U2VlbkRvbWFpbiA9IFtudWxsLCBudWxsXTsKICAgICAgICAgICAgdGhpcy51cGRhdGVEb21haW4gPSBmdW5jdGlvbiAoc2NhbGUpIHsKICAgICAgICAgICAgICAgIF90aGlzLmxhc3RTZWVuRG9tYWluID0gc2NhbGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKICAgICAgICAgICAgICAgIHZhciBjYWNoZWRMZW5ndGggPSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKF90aGlzLmNhY2hlZERvbWFpblsxXSkgLSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKF90aGlzLmNhY2hlZERvbWFpblswXSk7CiAgICAgICAgICAgICAgICB2YXIgbGFzdFNlZW5MZW5ndGggPSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKF90aGlzLmxhc3RTZWVuRG9tYWluWzFdKSAtIHNjYWxlLnNjYWxlVHJhbnNmb3JtYXRpb24oX3RoaXMubGFzdFNlZW5Eb21haW5bMF0pOwogICAgICAgICAgICAgICAgX3RoaXMuc2NhbGUgPSAoY2FjaGVkTGVuZ3RoIC8gbGFzdFNlZW5MZW5ndGgpIHx8IDE7CiAgICAgICAgICAgICAgICBfdGhpcy50cmFuc2xhdGUgPSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKF90aGlzLmNhY2hlZERvbWFpblswXSkgLSBzY2FsZS5zY2FsZVRyYW5zZm9ybWF0aW9uKF90aGlzLmxhc3RTZWVuRG9tYWluWzBdKSAqIF90aGlzLnNjYWxlIHx8IDA7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIERvbWFpblRyYW5zZm9ybS5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuc2NhbGUgPSAxOwogICAgICAgICAgICB0aGlzLnRyYW5zbGF0ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuY2FjaGVkRG9tYWluID0gdGhpcy5sYXN0U2VlbkRvbWFpbjsKICAgICAgICB9OwogICAgICAgIERvbWFpblRyYW5zZm9ybS5wcm90b3R5cGUuc2V0RG9tYWluID0gZnVuY3Rpb24gKHNjYWxlKSB7CiAgICAgICAgICAgIHRoaXMuY2FjaGVkRG9tYWluID0gc2NhbGUuZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBEb21haW5UcmFuc2Zvcm07CiAgICB9KCkpOwogICAgLyoqCiAgICAgKiBNYW5hZ2VzIGRlZmVycmVkIHJlbmRlcmluZyBjYWxsYmFja3MuCiAgICAgKgogICAgICogQ2FsbCBgc2V0RG9tYWluc2Agd2hlbiBkZWZlcnJlZCByZW5kZXJpbmcgaXMgaW5pdGlhbGx5IGVuYWJsZWQgdG8gZml4IHRoZQogICAgICogY3VycmVudCBkb21haW4gdmFsdWVzLgogICAgICoKICAgICAqIENhbGwgYHVwZGF0ZURvbWFpbnNgIHdoZW4gc2NhbGUgZG9tYWlucyBjaGFuZ2UsIHdoaWNoIHVzZXMgdGhlIGRvbWFpbiB0bwogICAgICogY29tcHV0ZSBDU1MtdHlsZSB0cmFuc2Zvcm0gcGFyYW1ldGVycyBwYXNzZWQgdG8gYGFwcGx5VHJhbnNmb3JtQ2FsbGJhY2tgLAogICAgICogbWltaWNraW5nIHRoZSByZXN1bHQgb2YgYSBmdWxsIHJlLXJlbmRlci4gQWZ0ZXIgYSBkZWZlcnJlZCB0aW1lb3V0LCBpbnZva2UKICAgICAqIGBhcHBseVRyYW5zZm9ybUNhbGxiYWNrYCBhZ2FpbiB3aXRoIGFuIGlkZW50aXR5IHRyYW5zZm9ybSBhbmQgZmluYWxseSBpbnZva2UKICAgICAqIGByZW5kZXJDYWxsYmFja2AsIHdoaWNoIHNob3VsZCBhY3R1YWxseSByZWRyYXcgdGhlIHBsb3QuCiAgICAgKgogICAgICogQ2FsbCBgcmVzZXRUcmFuc2Zvcm1zYCBqdXN0IHByaW9yIHRvIHJlLXJlbmRlcmluZyBpbnRvIHRoZSBjYW52YXMuIFRoaXMKICAgICAqIGVuc3VyZXMgdGhhdCB0aGUgY2FudmFzIGlzIGF0IDE6MSBzY2FsaW5nLgogICAgICovCiAgICB2YXIgRGVmZXJyZWRSZW5kZXJlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBEZWZlcnJlZFJlbmRlcmVyKHJlbmRlckNhbGxiYWNrLCBhcHBseVRyYW5zZm9ybUNhbGxiYWNrKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMucmVuZGVyQ2FsbGJhY2sgPSByZW5kZXJDYWxsYmFjazsKICAgICAgICAgICAgdGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrID0gYXBwbHlUcmFuc2Zvcm1DYWxsYmFjazsKICAgICAgICAgICAgdGhpcy5kb21haW5UcmFuc2Zvcm1YID0gbmV3IERvbWFpblRyYW5zZm9ybSgpOwogICAgICAgICAgICB0aGlzLmRvbWFpblRyYW5zZm9ybVkgPSBuZXcgRG9tYWluVHJhbnNmb3JtKCk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyRGVmZXJyZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5hcHBseVRyYW5zZm9ybSgpOwogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KF90aGlzLnRpbWVvdXRUb2tlbik7CiAgICAgICAgICAgICAgICBfdGhpcy50aW1lb3V0VG9rZW4gPSBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5yZW5kZXJDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgfSwgRGVmZXJyZWRSZW5kZXJlci5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVkpOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBEZWZlcnJlZFJlbmRlcmVyLnByb3RvdHlwZS5zZXREb21haW5zID0gZnVuY3Rpb24gKHNjYWxlWCwgc2NhbGVZKSB7CiAgICAgICAgICAgIGlmIChzY2FsZVgpIHsKICAgICAgICAgICAgICAgIHRoaXMuZG9tYWluVHJhbnNmb3JtWC5zZXREb21haW4oc2NhbGVYKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2NhbGVZKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRvbWFpblRyYW5zZm9ybVkuc2V0RG9tYWluKHNjYWxlWSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW5kZXJEZWZlcnJlZCgpOwogICAgICAgIH07CiAgICAgICAgRGVmZXJyZWRSZW5kZXJlci5wcm90b3R5cGUudXBkYXRlRG9tYWlucyA9IGZ1bmN0aW9uIChzY2FsZVgsIHNjYWxlWSkgewogICAgICAgICAgICBpZiAoc2NhbGVYKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRvbWFpblRyYW5zZm9ybVgudXBkYXRlRG9tYWluKHNjYWxlWCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjYWxlWSkgewogICAgICAgICAgICAgICAgdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnVwZGF0ZURvbWFpbihzY2FsZVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVuZGVyRGVmZXJyZWQoKTsKICAgICAgICB9OwogICAgICAgIERlZmVycmVkUmVuZGVyZXIucHJvdG90eXBlLnJlc2V0VHJhbnNmb3JtcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5kb21haW5UcmFuc2Zvcm1YLnJlc2V0KCk7CiAgICAgICAgICAgIHRoaXMuZG9tYWluVHJhbnNmb3JtWS5yZXNldCgpOwogICAgICAgICAgICB0aGlzLmFwcGx5VHJhbnNmb3JtKCk7CiAgICAgICAgfTsKICAgICAgICBEZWZlcnJlZFJlbmRlcmVyLnByb3RvdHlwZS5hcHBseVRyYW5zZm9ybSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5hcHBseVRyYW5zZm9ybUNhbGxiYWNrKHRoaXMuZG9tYWluVHJhbnNmb3JtWC50cmFuc2xhdGUsIHRoaXMuZG9tYWluVHJhbnNmb3JtWS50cmFuc2xhdGUsIHRoaXMuZG9tYWluVHJhbnNmb3JtWC5zY2FsZSwgdGhpcy5kb21haW5UcmFuc2Zvcm1ZLnNjYWxlKTsKICAgICAgICB9OwogICAgICAgIERlZmVycmVkUmVuZGVyZXIuREVGRVJSRURfUkVOREVSSU5HX0RFTEFZID0gMjAwOwogICAgICAgIHJldHVybiBEZWZlcnJlZFJlbmRlcmVyOwogICAgfSgpKTsKICAgIGV4cG9ydHMuRGVmZXJyZWRSZW5kZXJlciA9IERlZmVycmVkUmVuZGVyZXI7CiAgICB9KTsKCiAgICB2YXIgcGxvdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgoKCgoKCgoKICAgIGV4cG9ydHMuUmVuZGVyZXIgPSBtYWtlRW51bV8xLm1ha2VFbnVtKFsic3ZnIiwgImNhbnZhcyJdKTsKICAgIHZhciBQbG90ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUGxvdCwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBBIFBsb3QgZHJhd3Mgc29tZSB2aXN1YWxpemF0aW9uIG9mIHRoZSBpbnB1dHRlZCBEYXRhc2V0cy4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFBsb3QoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBiYWNraW5nIGRhdGFzZXRzIGhhdmUgY2hhbmdlZCBzaW5jZSB0aGlzIHBsb3QncyBsYXN0IHJlbmRlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF90aGlzLl9kYXRhQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTWFwcGluZyBmcm9tIGF0dHJpYnV0ZSBuYW1lcyB0byB0aGUgZXh0ZW50cyAoW21pbiwgbWF4XSkgdmFsdWVzIHRoYXQgdGhhdCBhdHRyaWJ1dGUgdGFrZXMgb24uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfdGhpcy5fYXR0ckV4dGVudHMgPSB7fTsKICAgICAgICAgICAgX3RoaXMuX2FuaW1hdGUgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBBbmltYXRvcnMgZm9yIHRoaXMgcGxvdC4gRWFjaCBwbG90IGV4cG9zZXMgYSBzZXQgb2YgImFuaW1hdG9yIGtleSIgc3RyaW5ncyB0aGF0CiAgICAgICAgICAgICAqIGRlZmluZSBob3cgZGlmZmVyZW50IHBhcnRzIG9mIHRoYXQgcGFydGljdWxhciBQbG90IGFuaW1hdGVzLiBGb3IgaW5zdGFuY2UsIFJlY3RhbmdsZQogICAgICAgICAgICAgKiBQbG90cyBoYXZlIGEgInJlY3RhbmdsZXMiIGFuaW1hdG9yIGtleSB3aGljaCBjb250cm9scyBob3cgdGhlIDxyZWN0PnMgYXJlIGFuaW1hdGVkLgogICAgICAgICAgICAgKiBAc2VlIGFuaW1hdG9yKCkKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVGhlcmUgYXJlIHR3byBjb21tb24gYW5pbWF0b3JzIHRoYXQgbW9zdCBQbG90cyByZXNwZWN0OiAibWFpbiIgYW5kICJyZXNldCIuIEluIGdlbmVyYWwsCiAgICAgICAgICAgICAqIFBsb3RzIGRyYXcgaW4gdHdvIHN0ZXBzOiBmaXJzdCB0aGV5ICJyZXNldCIgdGhlaXIgdmlzdWFsIGVsZW1lbnRzIChlLmcuIHNjYXR0ZXIgcGxvdHMgc2V0CiAgICAgICAgICAgICAqIGFsbCB0aGUgZG90cyB0byBzaXplIDApLCBhbmQgdGhlbiB0aGV5IGRvIHRoZSAibWFpbiIgYW5pbWF0aW9uIGludG8gdGhlIGNvcnJlY3QgdmlzdWFsaXphdGlvbgogICAgICAgICAgICAgKiAoZS5nLiBzY2F0dGVyIHBsb3QgZG90cyBncm93IHRvIHRoZWlyIHNwZWNpZmllZCBzaXplKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF90aGlzLl9hbmltYXRvcnMgPSB7fTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1hcHBpbmcgZnJvbSBwcm9wZXJ0eSBuYW1lcyB0byB0aGUgZXh0ZW50cyAoW21pbiwgbWF4XSkgdmFsdWVzIHRoYXQgdGhhdAogICAgICAgICAgICAgKiBwcm9wZXJ0eSB0YWtlcyBvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF90aGlzLl9wcm9wZXJ0eUV4dGVudHMgPSB7fTsKICAgICAgICAgICAgX3RoaXMuX3Jlc2V0RW50aXR5U3RvcmUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBfdGhpcy5fY2FjaGVkRW50aXR5U3RvcmUgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIF90aGlzLl9vdmVyZmxvd0hpZGRlbiA9IHRydWU7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJwbG90Iik7CiAgICAgICAgICAgIF90aGlzLl9kYXRhc2V0VG9EcmF3ZXIgPSBuZXcgdXRpbHMkMS5NYXAoKTsKICAgICAgICAgICAgX3RoaXMuX2F0dHJCaW5kaW5ncyA9IGQzLm1hcCgpOwogICAgICAgICAgICBfdGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlciA9IGZ1bmN0aW9uIChzY2FsZSwgaWdub3JlQW5jaG9yU3RhdGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZShzY2FsZSwgaWdub3JlQW5jaG9yU3RhdGUpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpcy5fcmVuZGVyQ2FsbGJhY2sgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5yZW5kZXIoKTsgfTsKICAgICAgICAgICAgX3RoaXMuX29uRGF0YXNldFVwZGF0ZUNhbGxiYWNrID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX29uRGF0YXNldFVwZGF0ZSgpOyB9OwogICAgICAgICAgICBfdGhpcy5fcHJvcGVydHlCaW5kaW5ncyA9IGQzLm1hcCgpOwogICAgICAgICAgICB2YXIgbWFpbkFuaW1hdG9yID0gbmV3IGFuaW1hdG9ycy5FYXNpbmcoKS5tYXhUb3RhbER1cmF0aW9uKFBsb3QuX0FOSU1BVElPTl9NQVhfRFVSQVRJT04pOwogICAgICAgICAgICBfdGhpcy5hbmltYXRvcihjb21tb25zLkFuaW1hdG9yLk1BSU4sIG1haW5BbmltYXRvcik7CiAgICAgICAgICAgIF90aGlzLmFuaW1hdG9yKGNvbW1vbnMuQW5pbWF0b3IuUkVTRVQsIG5ldyBhbmltYXRvcnMuTnVsbCgpKTsKICAgICAgICAgICAgX3RoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSA9IHV0aWxzJDEuV2luZG93LmRlYm91bmNlKGRlZmVycmVkUmVuZGVyZXIuRGVmZXJyZWRSZW5kZXJlci5ERUZFUlJFRF9SRU5ERVJJTkdfREVMQVksIF90aGlzLl9yZXNldEVudGl0eVN0b3JlKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBQbG90LmdldFRvdGFsRHJhd1RpbWUgPSBmdW5jdGlvbiAoZGF0YSwgZHJhd1N0ZXBzKSB7CiAgICAgICAgICAgIHJldHVybiBkcmF3U3RlcHMucmVkdWNlKGZ1bmN0aW9uICh0aW1lLCBkcmF3U3RlcCkgeyByZXR1cm4gdGltZSArIGRyYXdTdGVwLmFuaW1hdG9yLnRvdGFsVGltZShkYXRhLmxlbmd0aCk7IH0sIDApOwogICAgICAgIH07CiAgICAgICAgUGxvdC5hcHBseURyYXdTdGVwcyA9IGZ1bmN0aW9uIChkcmF3U3RlcHMsIGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIGFwcGxpZWREcmF3U3RlcHMgPSBkcmF3U3RlcHMubWFwKGZ1bmN0aW9uIChkcmF3U3RlcCkgewogICAgICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IGRyYXdTdGVwLmF0dHJUb1Byb2plY3RvcjsKICAgICAgICAgICAgICAgIHZhciBhdHRyVG9BcHBsaWVkUHJvamVjdG9yID0ge307CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhhdHRyVG9Qcm9qZWN0b3IpLmZvckVhY2goZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgICAgICAgICBhdHRyVG9BcHBsaWVkUHJvamVjdG9yW2F0dHJdID0KICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKGRhdHVtLCBpbmRleCkgeyByZXR1cm4gYXR0clRvUHJvamVjdG9yW2F0dHJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7IH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgYXR0clRvQXBwbGllZFByb2plY3RvcjogYXR0clRvQXBwbGllZFByb2plY3RvciwKICAgICAgICAgICAgICAgICAgICBhbmltYXRvcjogZHJhd1N0ZXAuYW5pbWF0b3IsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGFwcGxpZWREcmF3U3RlcHM7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5hbmNob3IgPSBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbiA9IGNvZXJjZUQzLmNvZXJjZUV4dGVybmFsRDMoc2VsZWN0aW9uKTsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5hbmNob3IuY2FsbCh0aGlzLCBzZWxlY3Rpb24pOwogICAgICAgICAgICB0aGlzLl9kYXRhQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0RW50aXR5U3RvcmUoKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlRXh0ZW50cygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9zZXR1cCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2V0dXApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwogICAgICAgICAgICBpZiAodGhpcy5fY2FudmFzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZENhbnZhc05vZGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9yZW5kZXJBcmVhID0gdGhpcy5jb250ZW50KCkuYXBwZW5kKCJnIikuY2xhc3NlZCgicmVuZGVyLWFyZWEiLCB0cnVlKTsKICAgICAgICAgICAgdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoZGF0YXNldCk7IH0pOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2FwcGVuZENhbnZhc05vZGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjYW52YXNDb250YWluZXIgPSB0aGlzLmVsZW1lbnQoKS5zZWxlY3QoIi5wbG90LWNhbnZhcy1jb250YWluZXIiKTsKICAgICAgICAgICAgaWYgKGNhbnZhc0NvbnRhaW5lci5lbXB0eSgpKSB7CiAgICAgICAgICAgICAgICBjYW52YXNDb250YWluZXIgPSB0aGlzLmVsZW1lbnQoKS5hcHBlbmQoImRpdiIpLmNsYXNzZWQoInBsb3QtY2FudmFzLWNvbnRhaW5lciIsIHRydWUpOwogICAgICAgICAgICAgICAgY2FudmFzQ29udGFpbmVyLm5vZGUoKS5hcHBlbmRDaGlsZCh0aGlzLl9jYW52YXMubm9kZSgpKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuc2V0Qm91bmRzID0gZnVuY3Rpb24gKHdpZHRoLCBoZWlnaHQsIG9yaWdpblgsIG9yaWdpblkpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5zZXRCb3VuZHMuY2FsbCh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBvcmlnaW5YLCBvcmlnaW5ZKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlRXh0ZW50cygpOwogICAgICAgICAgICBpZiAodGhpcy5fY2FudmFzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9idWZmZXJDYW52YXMgJiYgIXRoaXMuX2J1ZmZlckNhbnZhc1ZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY29weSBjdXJyZW50IGNhbnZhcyB0byBidWZmZXIgMToxCiAgICAgICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgICAgICAvLyBXaHkgdXNlIGEgYnVmZmVyIGNhbnZhcz8KICAgICAgICAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHdlIGNoYW5nZSB0aGUgc2l6ZSBvZiBhIGNhbnZhcyB3aXRoIGNzcyBvciBhdHRyaWJ1dGVzLCBpdAogICAgICAgICAgICAgICAgICAgIC8vIGNsZWFycyB0aGUgY29udGVudHMuIFdpdGhvdXQgYSBidWZmZXIgY2FudmFzLCB0aGlzIHJlcXVpcmVzCiAgICAgICAgICAgICAgICAgICAgLy8gZHJhZy1yZXNpemFibGUgY2hhcnRzIHRvIGltbWVkaWF0ZWx5IGRvIGEgZnVsbCByZWRyYXcgd2hpbGUgeW91CiAgICAgICAgICAgICAgICAgICAgLy8gZHJhZy1yZXNpemUsIHdoaWNoIGNhbiBjYXVzZSBqYW5rLiBUbyBhdm9pZCB0aGF0LCB0aGlzIGJ1ZmZlciBjYW52YXMKICAgICAgICAgICAgICAgICAgICAvLyBzdG9yZXMgdGhlIGN1cnJlbnQgY2FudmFzIGNvbnRlbnRzIHdoZW4gdGhlIHJlc2l6ZSBzdGFydHMgYW5kIHJlZHJhd3MKICAgICAgICAgICAgICAgICAgICAvLyBpdCBpbnRvIHRoZSByZXNpemVkIGNhbnZhcy4gRXZlbnR1YWxseSwgdGhlIGRlZmVycmVkIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHdpbGwgdHJpZ2dlciBhbmQgZG8gYSBmdWxsLXJleiByZWRyYXcuIElmIGRlZmVycmVkIHJlbmRlcmluZwogICAgICAgICAgICAgICAgICAgIC8vIGlzIGRpc2FibGVkLCB0aGUgYnVmZmVyIGNvcHkgd2lsbCBiZSBvdmVyd3JpdHRlbiBpbW1lZGlhdGVseSBieSBhCiAgICAgICAgICAgICAgICAgICAgLy8gZnVsbCByZWRyYXcuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyQ2FudmFzLmF0dHIoIndpZHRoIiwgdGhpcy5fY2FudmFzLmF0dHIoIndpZHRoIikpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlckNhbnZhcy5hdHRyKCJoZWlnaHQiLCB0aGlzLl9jYW52YXMuYXR0cigiaGVpZ2h0IikpOwogICAgICAgICAgICAgICAgICAgIHZhciBidHggPSB0aGlzLl9idWZmZXJDYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGhlYWRsZXNzIHRlc3QgY29tcGF0IChqZXN0KQogICAgICAgICAgICAgICAgICAgIGlmIChidHgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsQ2FudmFzID0gdGhpcy5fY2FudmFzLm5vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9yaWdpbmFsQ2FudmFzLndpZHRoID4gMCAmJiBvcmlnaW5hbENhbnZhcy5oZWlnaHQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnR4LmNhbnZhcy53aWR0aCA+IDAgJiYgYnR4LmNhbnZhcy5oZWlnaHQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnR4LmRyYXdJbWFnZShvcmlnaW5hbENhbnZhcywgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oIkZhaWxlZCB0byBmaWxsIGJ1ZmZlciBjYW52YXMgd2l0aCB3aXRoIDB4MCBjYW52YXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9idWZmZXJDYW52YXNWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyB1cGRhdGUgY2FudmFzIHNpemUKICAgICAgICAgICAgICAgIHZhciByYXRpbyA9ICh3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbyAhPSBudWxsKSA/IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIDogMTsKICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW52YXMgd2lkdGgvaGVpZ2h0IHRha2luZyBpbnRvIGFjY291bnQgcmV0aW5hIGRpc3BsYXlzLgogICAgICAgICAgICAgICAgLy8gVGhpcyB3aWxsIGFsc28gY2xlYXIgdGhlIGNhbnZhcyBvZiBhbnkgZHJhd24gZWxlbWVudHMgc28gd2Ugc2hvdWxkCiAgICAgICAgICAgICAgICAvLyBiZSBzdXJlIG5vdCB0byBjb21wdXRlTGF5b3V0KCkgd2l0aG91dCBhIHJlbmRlcigpIGluIHRoZSBmdXR1cmUuCiAgICAgICAgICAgICAgICB0aGlzLl9jYW52YXMuYXR0cigid2lkdGgiLCB3aWR0aCAqIHJhdGlvKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbnZhcy5hdHRyKCJoZWlnaHQiLCBoZWlnaHQgKiByYXRpbyk7CiAgICAgICAgICAgICAgICAvLyByZXNldCB0aGUgdHJhbnNmb3JtIHRoZW4gc2V0IHRoZSBzY2FsZSBmYWN0b3IKICAgICAgICAgICAgICAgIHZhciBjdHggPSB0aGlzLl9jYW52YXMubm9kZSgpLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgICAgICAvLyBudWxsIGNoZWNrIGZvciBoZWFkbGVzcyB0ZXN0IGNvbXBhdCAoamVzdCkKICAgICAgICAgICAgICAgIGlmIChjdHgpIHsKICAgICAgICAgICAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtKHJhdGlvLCAwLCAwLCByYXRpbywgMCwgMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2J1ZmZlckNhbnZhcykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyQ2FudmFzID0gdGhpcy5fYnVmZmVyQ2FudmFzLm5vZGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckNhbnZhcy53aWR0aCA+IDAgJiYgYnVmZmVyQ2FudmFzLmhlaWdodCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdHguY2FudmFzLndpZHRoID4gMCAmJiBjdHguY2FudmFzLmhlaWdodCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IGJ1ZmZlciB0byBjdXJyZW50IGNhbnZhcyBhdCBuZXcgc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UoYnVmZmVyQ2FudmFzLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybigiRmFpbGVkIHRvIGZpbGwgY2FudmFzIHdpdGggMHgwIGJ1ZmZlciBjYW52YXMiKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChzY2FsZSkgeyByZXR1cm4gc2NhbGUub2ZmVXBkYXRlKF90aGlzLl9yZW5kZXJDYWxsYmFjayk7IH0pOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKFtdKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFNldHVwIHRoZSBET00gbm9kZXMgZm9yIHRoZSBnaXZlbiBkYXRhc2V0LiBUaGlzIGlzIGEgc2VwYXJhdGUKICAgICAgICAgKiBzdGVwIGZyb20gImNyZWF0aW5nIHRoZSBEcmF3ZXIiIHNpbmNlIHRoZSBlbGVtZW50IG1heSBub3QgYmUgc2V0dXAgeWV0CiAgICAgICAgICogKGluIHdoaWNoIGNhc2UgdGhlIF9yZW5kZXJBcmVhIGlzIG51bGwgYmVjYXVzZSB0aGUgLmVsZW1lbnQoKSBhbmQgLmNvbnRlbnQoKQogICAgICAgICAqIGFyZSBudWxsKS4gQWxzbyBiZWNhdXNlIHN1YmNsYXNzZXMgbWF5IGRvIG1vcmUgdGhhbiBqdXN0IGNvbmZpZ3VyZSBvbmUKICAgICAgICAgKiBzaW5nbGUgZHJhd2VyIChlLmcuIGFkZGluZyB0ZXh0IGRyYXdpbmcgY2FwYWJpbGl0aWVzKS4KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0ID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIGRyYXdlciA9IHRoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoZGF0YXNldCk7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcmVyKCkgPT09ICJzdmciKSB7CiAgICAgICAgICAgICAgICBkcmF3ZXIudXNlU1ZHKHRoaXMuX3JlbmRlckFyZWEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZHJhd2VyLnVzZUNhbnZhcyh0aGlzLl9jYW52YXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkcmF3ZXI7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgYSBuZXcgRHJhd2VyLiBTdWJjbGFzc2VzIHNob3VsZCBvdmVycmlkZSB0aGlzIHRvIHJldHVybgogICAgICAgICAqIGEgRHJhd2VyIHRoYXQgZHJhd3MgdGhlIGNvcnJlY3Qgc2hhcGVzIGZvciB0aGlzIHBsb3QuCiAgICAgICAgICovCiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlciA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgZHJhd2VyLlByb3h5RHJhd2VyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBzdmdEcmF3ZXIuU1ZHRHJhd2VyKCJwYXRoIiwgIiIpOyB9LCBmdW5jdGlvbiAoY3R4KSB7IHJldHVybiBuZXcgY2FudmFzRHJhd2VyLkNhbnZhc0RyYXdlcihjdHgsIGZ1bmN0aW9uICgpIHsgfSk7IH0pOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2dldEFuaW1hdG9yID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICBpZiAodGhpcy5fYW5pbWF0ZU9uTmV4dFJlbmRlcigpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0b3JzW2tleV0gfHwgbmV3IGFuaW1hdG9ycy5OdWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGFuaW1hdG9ycy5OdWxsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4dGVudHMoKTsKICAgICAgICAgICAgdGhpcy5fZGF0YUNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9yZXNldEVudGl0eVN0b3JlKCk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyTG93UHJpb3JpdHkoKTsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLmF0dHIgPSBmdW5jdGlvbiAoYXR0ciwgYXR0clZhbHVlLCBzY2FsZSkgewogICAgICAgICAgICBpZiAoYXR0clZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdHRyQmluZGluZ3MuZ2V0KGF0dHIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JpbmRBdHRyKGF0dHIsIGF0dHJWYWx1ZSwgc2NhbGUpOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOyAvLyBxdWV1ZSBhIHJlLXJlbmRlciB1cG9uIGNoYW5naW5nIHByb2plY3RvcgogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9iaW5kUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHksIHZhbHVlT3JGbiwgc2NhbGUsIHBvc3RTY2FsZSkgewogICAgICAgICAgICB2YXIgYmluZGluZyA9IHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHByb3BlcnR5KTsKICAgICAgICAgICAgdmFyIG9sZFNjYWxlID0gYmluZGluZyAhPSBudWxsID8gYmluZGluZy5zY2FsZSA6IG51bGw7CiAgICAgICAgICAgIHZhciBhY2Nlc3NvciA9IHR5cGVvZiB2YWx1ZU9yRm4gPT09ICJmdW5jdGlvbiIgPyB2YWx1ZU9yRm4gOiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZU9yRm47IH07CiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KHByb3BlcnR5LCB7IGFjY2Vzc29yOiBhY2Nlc3Nvciwgc2NhbGU6IHNjYWxlLCBwb3N0U2NhbGU6IHBvc3RTY2FsZSB9KTsKICAgICAgICAgICAgaWYgKG9sZFNjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KG9sZFNjYWxlLCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luc3RhbGxTY2FsZUZvcktleShzY2FsZSwgcHJvcGVydHkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NsZWFyQXR0clRvUHJvamVjdG9yQ2FjaGUoKTsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9iaW5kQXR0ciA9IGZ1bmN0aW9uIChhdHRyLCB2YWx1ZU9yRm4sIHNjYWxlKSB7CiAgICAgICAgICAgIHZhciBiaW5kaW5nID0gdGhpcy5fYXR0ckJpbmRpbmdzLmdldChhdHRyKTsKICAgICAgICAgICAgdmFyIG9sZFNjYWxlID0gYmluZGluZyAhPSBudWxsID8gYmluZGluZy5zY2FsZSA6IG51bGw7CiAgICAgICAgICAgIHZhciBhY2Nlc3NvciA9IHR5cGVvZiB2YWx1ZU9yRm4gPT09ICJmdW5jdGlvbiIgPyB2YWx1ZU9yRm4gOiBmdW5jdGlvbiAoKSB7IHJldHVybiB2YWx1ZU9yRm47IH07CiAgICAgICAgICAgIHRoaXMuX2F0dHJCaW5kaW5ncy5zZXQoYXR0ciwgeyBhY2Nlc3NvcjogYWNjZXNzb3IsIHNjYWxlOiBzY2FsZSB9KTsKICAgICAgICAgICAgaWYgKG9sZFNjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VuaW5zdGFsbFNjYWxlRm9yS2V5KG9sZFNjYWxlLCBhdHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5zdGFsbFNjYWxlRm9yS2V5KHNjYWxlLCBhdHRyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCk7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvcjsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9nZXRBdHRyVG9Qcm9qZWN0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHByb2plY3RvcnMgPSB0aGlzLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICAgICAgaWYgKFBsb3QuT1BUSU1JWkVfTUVNT0laRV9QUk9KRUNUT1JTKSB7CiAgICAgICAgICAgICAgICAgICAgcHJvamVjdG9ycyA9IG1lbW9pemUubWVtb2l6ZVByb2plY3RvcnMocHJvamVjdG9ycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3IgPSBwcm9qZWN0b3JzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHJldHVybiBzaGFsbG93IGNsb25lIG9mIGNhY2hlZCBwcm9qZWN0b3IKICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuYXNzaWduKHt9LCB0aGlzLl9jYWNoZWRBdHRyVG9Qcm9qZWN0b3IpOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgaCA9IHt9OwogICAgICAgICAgICB0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbiAoYmluZGluZywgYXR0cikgewogICAgICAgICAgICAgICAgaFthdHRyXSA9IFBsb3QuX3NjYWxlZEFjY2Vzc29yKGJpbmRpbmcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHByb3BlcnR5UHJvamVjdG9ycyA9IHRoaXMuX3Byb3BlcnR5UHJvamVjdG9ycygpOwogICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wZXJ0eVByb2plY3RvcnMpLmZvckVhY2goZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgaWYgKGhba2V5XSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaFtrZXldID0gcHJvcGVydHlQcm9qZWN0b3JzW2tleV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaDsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnJlbmRlckltbWVkaWF0ZWx5LmNhbGwodGhpcyk7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0FuY2hvcmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYWludCgpOwogICAgICAgICAgICAgICAgdGhpcy5fZGF0YUNoYW5nZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLnJlbmRlckxvd1ByaW9yaXR5ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJDYWxsYmFjaygpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLmFuaW1hdGVkID0gZnVuY3Rpb24gKHdpbGxBbmltYXRlKSB7CiAgICAgICAgICAgIGlmICh3aWxsQW5pbWF0ZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9hbmltYXRlID0gd2lsbEFuaW1hdGU7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuZGV0YWNoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmRldGFjaC5jYWxsKHRoaXMpOwogICAgICAgICAgICAvLyBtYWtlIHRoZSBkb21haW4gcmVzaXplCiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4dGVudHMoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJucyB7U2NhbGVbXX0gQSB1bmlxdWUgYXJyYXkgb2YgYWxsIHNjYWxlcyBjdXJyZW50bHkgdXNlZCBieSB0aGUgUGxvdC4KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5fc2NhbGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgc2NhbGVzID0gW107CiAgICAgICAgICAgIHRoaXMuX2F0dHJCaW5kaW5ncy5lYWNoKGZ1bmN0aW9uIChiaW5kaW5nLCBhdHRyKSB7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGUgPSBiaW5kaW5nLnNjYWxlOwogICAgICAgICAgICAgICAgaWYgKHNjYWxlICE9IG51bGwgJiYgc2NhbGVzLmluZGV4T2Yoc2NhbGUpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHNjYWxlcy5wdXNoKHNjYWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZWFjaChmdW5jdGlvbiAoYmluZGluZywgcHJvcGVydHkpIHsKICAgICAgICAgICAgICAgIHZhciBzY2FsZSA9IGJpbmRpbmcuc2NhbGU7CiAgICAgICAgICAgICAgICBpZiAoc2NhbGUgIT0gbnVsbCAmJiBzY2FsZXMuaW5kZXhPZihzY2FsZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgc2NhbGVzLnB1c2goc2NhbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHNjYWxlczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGV4dGVudHMgYXNzb2NpYXRlZCB3aXRoIGVhY2ggYXR0cmlidXRlLCB0aGVuIGF1dG9kb21haW5zIGFsbCBzY2FsZXMgdGhlIFBsb3QgdXNlcy4KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5fdXBkYXRlRXh0ZW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fcmVzZXRFbnRpdHlTdG9yZSgpOwogICAgICAgICAgICB0aGlzLl9zY2FsZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChzY2FsZSkgeyByZXR1cm4gc2NhbGUuYWRkSW5jbHVkZWRWYWx1ZXNQcm92aWRlcihfdGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcik7IH0pOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvckF0dHIgPSBmdW5jdGlvbiAoYXR0cikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy5fYXR0ckV4dGVudHNbYXR0cl0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHRodW5rID0gbWVtb2l6ZS5tZW1UaHVuayhmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5kYXRhc2V0cygpOyB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYXR0ckJpbmRpbmdzLmdldChhdHRyKTsgfSwgZnVuY3Rpb24gKGRhdGFzZXRzLCBhY2NTY2FsZUJpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNjU2NhbGVCaW5kaW5nID09IG51bGwgfHwgYWNjU2NhbGVCaW5kaW5nLmFjY2Vzc29yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhc2V0cy5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIGNvbXB1dGVFeHRlbnQoZGF0YXNldCwgYWNjU2NhbGVCaW5kaW5nLCBudWxsKTsgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX2F0dHJFeHRlbnRzW2F0dHJdID0gdGh1bms7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dHJFeHRlbnRzW2F0dHJdKCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZSBpbiBzdWJjbGFzcyB0byBhZGQgc3BlY2lhbCBleHRlbnRzLCBzdWNoIGFzIGluY2x1ZGVkIHZhbHVlcwogICAgICAgICAqLwogICAgICAgIFBsb3QucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy5fcHJvcGVydHlFeHRlbnRzW3Byb3BlcnR5XSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgdGh1bmsgPSBtZW1vaXplLm1lbVRodW5rKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLmRhdGFzZXRzKCk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChwcm9wZXJ0eSk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9maWx0ZXJGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7IH0sIGZ1bmN0aW9uIChkYXRhc2V0cywgYWNjU2NhbGVCaW5kaW5nLCBmaWx0ZXIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYWNjU2NhbGVCaW5kaW5nID09IG51bGwgfHwgYWNjU2NhbGVCaW5kaW5nLmFjY2Vzc29yID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhc2V0cy5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIGNvbXB1dGVFeHRlbnQoZGF0YXNldCwgYWNjU2NhbGVCaW5kaW5nLCBmaWx0ZXIpOyB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydHlFeHRlbnRzW3Byb3BlcnR5XSA9IHRodW5rOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUV4dGVudHNbcHJvcGVydHldKCk7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5faW5jbHVkZWRWYWx1ZXNGb3JTY2FsZSA9IGZ1bmN0aW9uIChzY2FsZSwgaWdub3JlQXR0YWNoU3RhdGUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0FuY2hvcmVkICYmICFpZ25vcmVBdHRhY2hTdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpbmNsdWRlZFZhbHVlcyA9IFtdOwogICAgICAgICAgICB0aGlzLl9hdHRyQmluZGluZ3MuZWFjaChmdW5jdGlvbiAoYmluZGluZywgYXR0cikgewogICAgICAgICAgICAgICAgaWYgKGJpbmRpbmcuc2NhbGUgPT09IHNjYWxlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4dGVudHMgPSBfdGhpcy5nZXRFeHRlbnRzRm9yQXR0cihhdHRyKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXh0ZW50cyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVkVmFsdWVzID0gaW5jbHVkZWRWYWx1ZXMuY29uY2F0KGQzLm1lcmdlKGV4dGVudHMpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmVhY2goZnVuY3Rpb24gKGJpbmRpbmcsIHByb3BlcnR5KSB7CiAgICAgICAgICAgICAgICBpZiAoYmluZGluZy5zY2FsZSA9PT0gc2NhbGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZXh0ZW50cyA9IF90aGlzLmdldEV4dGVudHNGb3JQcm9wZXJ0eShwcm9wZXJ0eSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4dGVudHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlZFZhbHVlcyA9IGluY2x1ZGVkVmFsdWVzLmNvbmNhdChkMy5tZXJnZShleHRlbnRzKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGluY2x1ZGVkVmFsdWVzOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuYW5pbWF0b3IgPSBmdW5jdGlvbiAoYW5pbWF0b3JLZXksIGFuaW1hdG9yKSB7CiAgICAgICAgICAgIGlmIChhbmltYXRvciA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5pbWF0b3JzW2FuaW1hdG9yS2V5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdG9yc1thbmltYXRvcktleV0gPSBhbmltYXRvcjsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5yZW5kZXJlciA9IGZ1bmN0aW9uIChyZW5kZXJlcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBpZiAocmVuZGVyZXIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbnZhcyA9PSBudWxsID8gInN2ZyIgOiAiY2FudmFzIjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYW52YXMgPT0gbnVsbCAmJiByZW5kZXJlciA9PT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3QgdGhlIGNhbnZhcywgcmVtb3ZlIGRyYXdlcidzIHJlbmRlckFyZWFzLCBzZXQgZHJhd2VyJ3MgY2FudmFzCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FudmFzID0gZDMuc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpKS5jbGFzc2VkKCJwbG90LWNhbnZhcyIsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2J1ZmZlckNhbnZhcyA9IGQzLnNlbGVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJjYW52YXMiKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kQ2FudmFzTm9kZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbiAoZHJhd2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdlci51c2VDYW52YXMoX3RoaXMuX2NhbnZhcyk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2NhbnZhcyAhPSBudWxsICYmIHJlbmRlcmVyID09ICJzdmciKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FudmFzLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbnZhcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyQ2FudmFzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbiAoZHJhd2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdlci51c2VTVkcoX3RoaXMuX3JlbmRlckFyZWEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIERhdGFzZXQgdG8gdGhlIFBsb3QuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RhdGFzZXR9IGRhdGFzZXQKICAgICAgICAgKiBAcmV0dXJucyB7UGxvdH0gVGhlIGNhbGxpbmcgUGxvdC4KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5hZGREYXRhc2V0ID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgdGhpcy5fYWRkRGF0YXNldChkYXRhc2V0KTsKICAgICAgICAgICAgdGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2FkZERhdGFzZXQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVEYXRhc2V0KGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgZHJhd2VyID0gdGhpcy5fY3JlYXRlRHJhd2VyKGRhdGFzZXQpOwogICAgICAgICAgICB0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuc2V0KGRhdGFzZXQsIGRyYXdlcik7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc1NldHVwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQoZGF0YXNldCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGF0YXNldC5vblVwZGF0ZSh0aGlzLl9vbkRhdGFzZXRVcGRhdGVDYWxsYmFjayk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIERhdGFzZXQgZnJvbSB0aGUgUGxvdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RGF0YXNldH0gZGF0YXNldAogICAgICAgICAqIEByZXR1cm5zIHtQbG90fSBUaGUgY2FsbGluZyBQbG90LgogICAgICAgICAqLwogICAgICAgIFBsb3QucHJvdG90eXBlLnJlbW92ZURhdGFzZXQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVEYXRhc2V0KGRhdGFzZXQpOwogICAgICAgICAgICB0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzZXRzKCkuaW5kZXhPZihkYXRhc2V0KSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3JlbW92ZURhdGFzZXROb2RlcyhkYXRhc2V0KTsKICAgICAgICAgICAgZGF0YXNldC5vZmZVcGRhdGUodGhpcy5fb25EYXRhc2V0VXBkYXRlQ2FsbGJhY2spOwogICAgICAgICAgICB0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZGVsZXRlKGRhdGFzZXQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICB2YXIgZHJhd2VyID0gdGhpcy5fZGF0YXNldFRvRHJhd2VyLmdldChkYXRhc2V0KTsKICAgICAgICAgICAgZHJhd2VyLnJlbW92ZSgpOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuZGF0YXNldHMgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGN1cnJlbnREYXRhc2V0cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZm9yRWFjaChmdW5jdGlvbiAoZHJhd2VyLCBkYXRhc2V0KSB7IHJldHVybiBjdXJyZW50RGF0YXNldHMucHVzaChkYXRhc2V0KTsgfSk7CiAgICAgICAgICAgIGlmIChkYXRhc2V0cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudERhdGFzZXRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnJlbnREYXRhc2V0cy5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhc2V0KSB7IHJldHVybiBfdGhpcy5fcmVtb3ZlRGF0YXNldChkYXRhc2V0KTsgfSk7CiAgICAgICAgICAgIGRhdGFzZXRzLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9hZGREYXRhc2V0KGRhdGFzZXQpOyB9KTsKICAgICAgICAgICAgdGhpcy5fb25EYXRhc2V0VXBkYXRlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gW3sgYXR0clRvUHJvamVjdG9yOiB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSwgYW5pbWF0b3I6IG5ldyBhbmltYXRvcnMuTnVsbCgpIH1dOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludCA9IGZ1bmN0aW9uICh0aW1lKSB7CiAgICAgICAgICAgIC8vIG5vLW9wCiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBfYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyBjb25zdHVjdHMge0xpZ2h0d2VpZ2h0UGxvdEVudGl0eVtdfSBmcm9tCiAgICAgICAgICogYWxsIHRoZSBlbnRpdGllcyBpbiB0aGUgcGxvdAogICAgICAgICAqIEBwYXJhbSB7RGF0YXNldFtdfSBbZGF0YXNldHNdIC0gZGF0YXNldHMgY29tcHJpc2luZyB0aGlzIHBsb3QKICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcyA9IGZ1bmN0aW9uIChkYXRhc2V0cykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgbGlnaHR3ZWlnaHRQbG90RW50aXRpZXMgPSBbXTsKICAgICAgICAgICAgZGF0YXNldHMuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCwgZGF0YXNldEluZGV4KSB7CiAgICAgICAgICAgICAgICB2YXIgZHJhd2VyID0gX3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgdmFsaWREYXR1bUluZGV4ID0gMDsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YXNldC5kYXRhKCk7CiAgICAgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IGRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoZGF0dW1JbmRleCkgewogICAgICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IGRhdGFbZGF0dW1JbmRleF07CiAgICAgICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uID0gX3RoaXMuX3BpeGVsUG9pbnQoZGF0dW0sIGRhdHVtSW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgICAgIGlmICh1dGlscyQxLk1hdGguaXNOYU4ocG9zaXRpb24ueCkgfHwgdXRpbHMkMS5NYXRoLmlzTmFOKHBvc2l0aW9uLnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGludWUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgcGxvdCA9IF90aGlzOwogICAgICAgICAgICAgICAgICAgIGxpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBkYXR1bTogZGF0dW0sCiAgICAgICAgICAgICAgICAgICAgICAgIGdldCBwb3NpdGlvbigpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgY2FsY3VsYXRlIHBvc2l0aW9uIHdoZW4gbmVlZGluZyB0byBpbXByb3ZlIHBhbiB6b29tIHBlcmZvcm1hbmNlICMzMTU5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGxvdC5fcGl4ZWxQb2ludC5jYWxsKHBsb3QsIGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXg6IGRhdHVtSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXQ6IGRhdGFzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFzZXRJbmRleDogZGF0YXNldEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQ6IF90aGlzLAogICAgICAgICAgICAgICAgICAgICAgICBkcmF3ZXI6IGRyYXdlciwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWREYXR1bUluZGV4OiB2YWxpZERhdHVtSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgdmFsaWREYXR1bUluZGV4Kys7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgZGF0dW1JbmRleCA9IDA7IGRhdHVtSW5kZXggPCBkYXRhTGVuOyBkYXR1bUluZGV4KyspIHsKICAgICAgICAgICAgICAgICAgICBfbG9vcF8xKGRhdHVtSW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGxpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzOwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBkYXRhVG9EcmF3ID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhc2V0KSB7IHJldHVybiBkYXRhVG9EcmF3LnNldChkYXRhc2V0LCBkYXRhc2V0LmRhdGEoKSk7IH0pOwogICAgICAgICAgICByZXR1cm4gZGF0YVRvRHJhdzsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9wYWludCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX2NhY2hlZEF0dHJUb1Byb2plY3RvcjsKICAgICAgICAgICAgdmFyIGRyYXdTdGVwcyA9IHRoaXMuX2dlbmVyYXRlRHJhd1N0ZXBzKCk7CiAgICAgICAgICAgIHZhciBkYXRhVG9EcmF3ID0gdGhpcy5fZ2V0RGF0YVRvRHJhdygpOwogICAgICAgICAgICB2YXIgZHJhd2VycyA9IHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9kYXRhc2V0VG9EcmF3ZXIuZ2V0KGRhdGFzZXQpOyB9KTsKICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIoKSA9PT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgIHZhciBjYW52YXMgPSB0aGlzLl9jYW52YXMubm9kZSgpOwogICAgICAgICAgICAgICAgdmFyIGNvbnRleHRfMSA9IGNhbnZhcy5nZXRDb250ZXh0KCIyZCIpOwogICAgICAgICAgICAgICAgY29udGV4dF8xLmNsZWFyUmVjdCgwLCAwLCBjYW52YXMuY2xpZW50V2lkdGgsIGNhbnZhcy5jbGllbnRIZWlnaHQpOwogICAgICAgICAgICAgICAgdGhpcy5fYnVmZmVyQ2FudmFzVmFsaWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZHMsIGkpIHsKICAgICAgICAgICAgICAgIHZhciBhcHBsaWVkRHJhd1N0ZXBzID0gUGxvdC5hcHBseURyYXdTdGVwcyhkcmF3U3RlcHMsIGRzKTsKICAgICAgICAgICAgICAgIGRyYXdlcnNbaV0uZHJhdyhkYXRhVG9EcmF3LmdldChkcyksIGFwcGxpZWREcmF3U3RlcHMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHRpbWVzID0gdGhpcy5kYXRhc2V0cygpLm1hcChmdW5jdGlvbiAoZHMsIGkpIHsgcmV0dXJuIFBsb3QuZ2V0VG90YWxEcmF3VGltZShkYXRhVG9EcmF3LmdldChkcyksIGRyYXdTdGVwcyk7IH0pOwogICAgICAgICAgICB2YXIgbWF4VGltZSA9IHV0aWxzJDEuTWF0aC5tYXgodGltZXMsIDApOwogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbmFsUGFpbnQobWF4VGltZSk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGRyYXduIHZpc3VhbCBlbGVtZW50cyBmb3IgdGhlIHNwZWNpZmllZCBEYXRhc2V0cyBhcyBhIGQzIFNlbGVjdGlvbi4KICAgICAgICAgKiBOb3Qgc3VwcG9ydGVkIG9uIGNhbnZhcyByZW5kZXJlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7RGF0YXNldFtdfSBbZGF0YXNldHNdIFRoZSBEYXRhc2V0cyB0byByZXRyaWV2ZSB0aGUgU2VsZWN0aW9ucyBmb3IuCiAgICAgICAgICogICBJZiBub3QgcHJvdmlkZWQsIFNlbGVjdGlvbnMgd2lsbCBiZSByZXRyaWV2ZWQgZm9yIGFsbCBEYXRhc2V0cyBvbiB0aGUgUGxvdC4KICAgICAgICAgKiBAcmV0dXJucyB7ZDMuU2VsZWN0aW9ufQogICAgICAgICAqLwogICAgICAgIFBsb3QucHJvdG90eXBlLnNlbGVjdGlvbnMgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKGRhdGFzZXRzID09PSB2b2lkIDApIHsgZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzKCk7IH0KICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIoKSA9PT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgIC8vIHJldHVybiBlbXB0eSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgIHJldHVybiBkMy5zZWxlY3RBbGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBzZWxlY3Rpb25zXzEgPSBbXTsKICAgICAgICAgICAgICAgIGRhdGFzZXRzLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZHJhd2VyID0gX3RoaXMuX2RhdGFzZXRUb0RyYXdlci5nZXQoZGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRyYXdlciA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIHZpc3VhbFByaW1pdGl2ZXMgPSBkcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbnNfMS5wdXNoLmFwcGx5KHNlbGVjdGlvbnNfMSwgdmlzdWFsUHJpbWl0aXZlcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBkMy5zZWxlY3RBbGwoc2VsZWN0aW9uc18xKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgRW50aXRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgRGF0YXNldHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge0RhdGFzZXRbXX0gZGF0YXNldHMgVGhlIERhdGFzZXRzIHRvIHJldHJpZXZlIHRoZSBFbnRpdGllcyBmb3IuCiAgICAgICAgICogICBJZiBub3QgcHJvdmlkZWQsIHJldHVybnMgZGVmYXVsdHMgdG8gYWxsIERhdGFzZXRzIG9uIHRoZSBQbG90LgogICAgICAgICAqIEByZXR1cm4ge1Bsb3RzLlBsb3RFbnRpdHlbXX0KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5lbnRpdGllcyA9IGZ1bmN0aW9uIChkYXRhc2V0cykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0RW50aXR5U3RvcmUoZGF0YXNldHMpLmVudGl0aWVzKCkubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIF90aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZW50aXR5KTsgfSk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBgUGxvdHMuUGxvdEVudGl0eWBzIGluIHRoZSBwbG90LCB3aGVyZWJ5IHRoZQogICAgICAgICAqIGBQbG90cy5JTGlnaHR3ZWlnaHRQbG90RW50aXR5YHMgYXJlIGZpbHRlcmVkIGJ5IHRoZSBwcm92aWRlZCBwcmVkaWNhdGUuCiAgICAgICAgICogU2luY2UgYF9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHlgIGNhbiBiZSBleHBlbnNpdmUsIHRoaXMgbWV0aG9kCiAgICAgICAgICogY2FuIGJlIHVzZWZ1bCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHdoZXJlIEEgZmlsdGVyIHByZWRpY2F0ZSB0aGF0IGlzIGFwcGxpZWQgdG8gbGlnaHR3ZWlnaHQgZW50aXRpZXMKICAgICAgICAgKiBiZWZvcmUgdXBjb252ZXJ0aW5nIHRoZW0gdG8gZnVsbCBwbG90IGVudGl0aWVzCiAgICAgICAgICogQHJldHVybiB7UGxvdHMuUGxvdEVudGl0eVtdfQogICAgICAgICAqLwogICAgICAgIFBsb3QucHJvdG90eXBlLmZpbHRlckVudGl0aWVzID0gZnVuY3Rpb24gKHdoZXJlKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRFbnRpdHlTdG9yZSgpCiAgICAgICAgICAgICAgICAuZW50aXRpZXMoKQogICAgICAgICAgICAgICAgLmZpbHRlcih3aGVyZSkKICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gX3RoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlbnRpdHkpOyB9KTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIF9nZXRFbnRpdHlTdG9yZSByZXR1cm5zIHRoZSBzdG9yZSBvZiBhbGwgRW50aXRpZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgZGF0YXNldAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEYXRhc2V0W119IFtkYXRhc2V0c10gLSBUaGUgZGF0YXNldHMgd2l0aCB3aGljaCB0byBjb25zdHJ1Y3QgdGhlIHN0b3JlLiBJZiBubyBkYXRhc2V0cwogICAgICAgICAqIGFyZSBzcGVjaWZpZWQgYWxsIGRhdGFzZXRzIHdpbGwgYmUgdXNlZC4KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5fZ2V0RW50aXR5U3RvcmUgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGVudGl0eUJvdW5kc0ZhY3RvcnkgPSBmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiBfdGhpcy5fZW50aXR5Qm91bmRzKGVudGl0eSk7IH07CiAgICAgICAgICAgIGlmIChkYXRhc2V0cyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW50aXR5U3RvcmUgPSBuZXcgdXRpbHMkMS5FbnRpdHlTdG9yZSgpOwogICAgICAgICAgICAgICAgZW50aXR5U3RvcmUuYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMoZGF0YXNldHMpLCBlbnRpdHlCb3VuZHNGYWN0b3J5LCB0aGlzLl9sb2NhbE9yaWdpbkJvdW5kcygpKTsKICAgICAgICAgICAgICAgIHJldHVybiBlbnRpdHlTdG9yZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB2YXIgZW50aXR5U3RvcmUgPSBuZXcgdXRpbHMkMS5FbnRpdHlTdG9yZSgpOwogICAgICAgICAgICAgICAgZW50aXR5U3RvcmUuYWRkQWxsKHRoaXMuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXModGhpcy5kYXRhc2V0cygpKSwgZW50aXR5Qm91bmRzRmFjdG9yeSwgdGhpcy5fbG9jYWxPcmlnaW5Cb3VuZHMoKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZSA9IGVudGl0eVN0b3JlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWNoZWRFbnRpdHlTdG9yZTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIF9sb2NhbE9yaWdpbkJvdW5kcyByZXR1cm5zIGJvdW5kcyBvZiB0aGUgcGxvdCBmcm9tIGl0cyBvd24gb3JpZ2luLCByYXRoZXIgdGhhbiBmcm9tIHBhcmVudCBvcmlnaW4gKGFzIHByb3ZpZGVkIGJ5IGB0aGlzLmJvdW5kcygpYCkKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4ge0JvdW5kc30KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5fbG9jYWxPcmlnaW5Cb3VuZHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0b3BMZWZ0OiB7IHg6IDAsIHk6IDAgfSwKICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiB7IHg6IHRoaXMud2lkdGgoKSwgeTogdGhpcy5oZWlnaHQoKSB9LAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2VudGl0eUJvdW5kcyA9IGZ1bmN0aW9uIChlbnRpdHkpIHsKICAgICAgICAgICAgdmFyIGRhdHVtID0gZW50aXR5LmRhdHVtLCBpbmRleCA9IGVudGl0eS5pbmRleCwgZGF0YXNldCA9IGVudGl0eS5kYXRhc2V0OwogICAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9waXhlbFBvaW50KGRhdHVtLCBpbmRleCwgZGF0YXNldCksIHggPSBfYS54LCB5ID0gX2EueTsKICAgICAgICAgICAgcmV0dXJuIHsgeDogeCwgeTogeSwgd2lkdGg6IDAsIGhlaWdodDogMCB9OwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eSA9IGZ1bmN0aW9uIChlbnRpdHkpIHsKICAgICAgICAgICAgdmFyIHBsb3RFbnRpdHkgPSB7CiAgICAgICAgICAgICAgICBib3VuZHM6IHRoaXMuX2VudGl0eUJvdW5kcyhlbnRpdHkpLAogICAgICAgICAgICAgICAgY29tcG9uZW50OiBlbnRpdHkuY29tcG9uZW50LAogICAgICAgICAgICAgICAgZGF0YXNldDogZW50aXR5LmRhdGFzZXQsCiAgICAgICAgICAgICAgICBkYXRhc2V0SW5kZXg6IGVudGl0eS5kYXRhc2V0SW5kZXgsCiAgICAgICAgICAgICAgICBkYXR1bTogZW50aXR5LmRhdHVtLAogICAgICAgICAgICAgICAgaW5kZXg6IGVudGl0eS5pbmRleCwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBlbnRpdHkucG9zaXRpb24sCiAgICAgICAgICAgICAgICBzZWxlY3Rpb246IGQzLnNlbGVjdChlbnRpdHkuZHJhd2VyLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXgoZW50aXR5LnZhbGlkRGF0dW1JbmRleCkpLAogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gcGxvdEVudGl0eTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIFBsb3RFbnRpdGllcyBhdCBhIHBhcnRpY3VsYXIgUG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBFYWNoIHBsb3QgdHlwZSBkZXRlcm1pbmVzIGhvdyB0byBsb2NhdGUgZW50aXRpZXMgYXQgb3IgbmVhciB0aGUgcXVlcnkKICAgICAgICAgKiBwb2ludC4gRm9yIGV4YW1wbGUsIGxpbmUgYW5kIGFyZWEgY2hhcnRzIHdpbGwgcmV0dXJuIHRoZSBuZWFyZXN0IGVudGl0eSwKICAgICAgICAgKiBidXQgYmFyIGNoYXJ0cyB3aWxsIG9ubHkgcmV0dXJuIHRoZSBlbnRpdGllcyB0aGF0IGZ1bGx5IGNvbnRhaW4gdGhlIHF1ZXJ5CiAgICAgICAgICogcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50fSBwb2ludCBUaGUgcG9pbnQgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybnMge1Bsb3RFbnRpdHlbXX0gVGhlIFBsb3RFbnRpdGllcyBhdCB0aGUgcGFydGljdWxhciBwb2ludAogICAgICAgICAqLwogICAgICAgIFBsb3QucHJvdG90eXBlLmVudGl0aWVzQXQgPSBmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJwbG90cyBtdXN0IGltcGxlbWVudCBlbnRpdGllc0F0Iik7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB7UGxvdHMuUGxvdEVudGl0eX0gbmVhcmVzdCB0byB0aGUgcXVlcnkgcG9pbnQsCiAgICAgICAgICogb3IgdW5kZWZpbmVkIGlmIG5vIHtQbG90cy5QbG90RW50aXR5fSBjYW4gYmUgZm91bmQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50fSBxdWVyeVBvaW50CiAgICAgICAgICogQHJldHVybnMge1Bsb3RzLlBsb3RFbnRpdHl9IFRoZSBuZWFyZXN0IFBsb3RFbnRpdHksIG9yIHVuZGVmaW5lZCBpZiBubyB7UGxvdHMuUGxvdEVudGl0eX0gY2FuIGJlIGZvdW5kLgogICAgICAgICAqLwogICAgICAgIFBsb3QucHJvdG90eXBlLmVudGl0eU5lYXJlc3QgPSBmdW5jdGlvbiAocXVlcnlQb2ludCkgewogICAgICAgICAgICB2YXIgbmVhcmVzdCA9IHRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdChxdWVyeVBvaW50KTsKICAgICAgICAgICAgcmV0dXJuIG5lYXJlc3QgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHRoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShuZWFyZXN0KTsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLmVudGl0aWVzSW4gPSBmdW5jdGlvbiAoeFJhbmdlT3JCb3VuZHMsIHlSYW5nZSkgewogICAgICAgICAgICB2YXIgcXVlcnlCb3VuZHM7CiAgICAgICAgICAgIGlmICh5UmFuZ2UgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIGJvdW5kcyA9IHhSYW5nZU9yQm91bmRzOwogICAgICAgICAgICAgICAgcXVlcnlCb3VuZHMgPSB7CiAgICAgICAgICAgICAgICAgICAgeDogYm91bmRzLnRvcExlZnQueCwKICAgICAgICAgICAgICAgICAgICB5OiBib3VuZHMudG9wTGVmdC55LAogICAgICAgICAgICAgICAgICAgIHdpZHRoOiBib3VuZHMuYm90dG9tUmlnaHQueCAtIGJvdW5kcy50b3BMZWZ0LngsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBib3VuZHMuYm90dG9tUmlnaHQueSAtIGJvdW5kcy50b3BMZWZ0LnksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdmFyIHhSYW5nZSA9IHhSYW5nZU9yQm91bmRzOwogICAgICAgICAgICAgICAgcXVlcnlCb3VuZHMgPSB7CiAgICAgICAgICAgICAgICAgICAgeDogeFJhbmdlLm1pbiwKICAgICAgICAgICAgICAgICAgICB5OiB5UmFuZ2UubWluLAogICAgICAgICAgICAgICAgICAgIHdpZHRoOiB4UmFuZ2UubWF4IC0geFJhbmdlLm1pbiwKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IHlSYW5nZS5tYXggLSB5UmFuZ2UubWluLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5lbnRpdGllc0luQm91bmRzKHF1ZXJ5Qm91bmRzKTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGVudGl0ZXMgd2hvc2UgYm91bmRpbmcgYm94ZXMgb3ZlcmxhcCB0aGUgcGFyYW1ldGVyLgogICAgICAgICAqCiAgICAgICAgICogYHF1ZXJ5Qm91bmRzYCBhcmUgaW4gcGl4ZWwgc3BhY2UsIG1lYXN1cmVkIGZyb20gdGhlIG9yaWdpbiBvZiB0aGlzIHBsb3QuCiAgICAgICAgICovCiAgICAgICAgUGxvdC5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcyA9IGZ1bmN0aW9uIChxdWVyeUJvdW5kcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgZm91bmQgPSB0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5Cb3VuZHMocXVlcnlCb3VuZHMpOwogICAgICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmb3VuZC5tYXAoZnVuY3Rpb24gKGVudGl0eSkgeyByZXR1cm4gX3RoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShlbnRpdHkpOyB9KTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGVudGl0ZXMgd2hvc2UgYm91bmRpbmcgYm94ZXMgb3ZlcmxhcCB0aGUgYHF1ZXJ5Qm91bmRzYAogICAgICAgICAqIHBhcmFtZXRlciBvbiB0aGUgeC1heGlzLgogICAgICAgICAqCiAgICAgICAgICogYHF1ZXJ5Qm91bmRzYCBhcmUgaW4gcGl4ZWwgc3BhY2UsIG1lYXN1cmVkIGZyb20gdGhlIG9yaWdpbiBvZiB0aGlzIHBsb3QuCiAgICAgICAgICovCiAgICAgICAgUGxvdC5wcm90b3R5cGUuZW50aXRpZXNJblhCb3VuZHMgPSBmdW5jdGlvbiAocXVlcnlCb3VuZHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGZvdW5kID0gdGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdGllc0luWEJvdW5kcyhxdWVyeUJvdW5kcyk7CiAgICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZvdW5kLm1hcChmdW5jdGlvbiAoZW50aXR5KSB7IHJldHVybiBfdGhpcy5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KGVudGl0eSk7IH0pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgZW50aXRlcyB3aG9zZSBib3VuZGluZyBib3hlcyBvdmVybGFwIHRoZSBgcXVlcnlCb3VuZHNgCiAgICAgICAgICogcGFyYW1ldGVyIG9uIHRoZSB5LWF4aXMuCiAgICAgICAgICoKICAgICAgICAgKiBgcXVlcnlCb3VuZHNgIGFyZSBpbiBwaXhlbCBzcGFjZSwgbWVhc3VyZWQgZnJvbSB0aGUgb3JpZ2luIG9mIHRoaXMgcGxvdC4KICAgICAgICAgKi8KICAgICAgICBQbG90LnByb3RvdHlwZS5lbnRpdGllc0luWUJvdW5kcyA9IGZ1bmN0aW9uIChxdWVyeUJvdW5kcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgZm91bmQgPSB0aGlzLl9nZXRFbnRpdHlTdG9yZSgpLmVudGl0aWVzSW5ZQm91bmRzKHF1ZXJ5Qm91bmRzKTsKICAgICAgICAgICAgaWYgKCFmb3VuZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZm91bmQubWFwKGZ1bmN0aW9uIChlbnRpdHkpIHsgcmV0dXJuIF90aGlzLl9saWdodHdlaWdodFBsb3RFbnRpdHlUb1Bsb3RFbnRpdHkoZW50aXR5KTsgfSk7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkgPSBmdW5jdGlvbiAoc2NhbGUsIGtleSkgewogICAgICAgICAgICBzY2FsZS5vZmZVcGRhdGUodGhpcy5fcmVuZGVyQ2FsbGJhY2spOwogICAgICAgICAgICBzY2FsZS5vZmZVcGRhdGUodGhpcy5fZGVmZXJyZWRSZXNldEVudGl0eVN0b3JlKTsKICAgICAgICAgICAgc2NhbGUucmVtb3ZlSW5jbHVkZWRWYWx1ZXNQcm92aWRlcih0aGlzLl9pbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKTsKICAgICAgICB9OwogICAgICAgIFBsb3QucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXkgPSBmdW5jdGlvbiAoc2NhbGUsIGtleSkgewogICAgICAgICAgICBzY2FsZS5vblVwZGF0ZSh0aGlzLl9yZW5kZXJDYWxsYmFjayk7CiAgICAgICAgICAgIHNjYWxlLm9uVXBkYXRlKHRoaXMuX2RlZmVycmVkUmVzZXRFbnRpdHlTdG9yZSk7CiAgICAgICAgICAgIHNjYWxlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5faW5jbHVkZWRWYWx1ZXNQcm92aWRlcik7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgfTsKICAgICAgICBQbG90Ll9zY2FsZWRBY2Nlc3NvciA9IGZ1bmN0aW9uIChiaW5kaW5nKSB7CiAgICAgICAgICAgIHZhciBzY2FsZSA9IGJpbmRpbmcuc2NhbGUsIGFjY2Vzc29yID0gYmluZGluZy5hY2Nlc3NvciwgcG9zdFNjYWxlID0gYmluZGluZy5wb3N0U2NhbGU7CiAgICAgICAgICAgIC8vIGlmIHByb3ZpZGVkLCBhcHBseSBzY2FsZQogICAgICAgICAgICB2YXIgc2NhbGVkQWNjZXNvciA9IHNjYWxlID09IG51bGwgPyBhY2Nlc3NvciA6CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZCwgaSwgZHMpIHsgcmV0dXJuIHNjYWxlLnNjYWxlKGFjY2Vzc29yKGQsIGksIGRzKSk7IH07CiAgICAgICAgICAgIC8vIGlmIHByb3ZpZGVkLCBhcHBseSBwb3N0IHNjYWxlCiAgICAgICAgICAgIHZhciBwb3N0U2NhbGVkQWNjZXNvciA9IHBvc3RTY2FsZSA9PSBudWxsID8gc2NhbGVkQWNjZXNvciA6CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZCwgaSwgZHMpIHsgcmV0dXJuIHBvc3RTY2FsZShzY2FsZWRBY2Nlc29yKGQsIGksIGRzKSwgZCwgaSwgZHMpOyB9OwogICAgICAgICAgICByZXR1cm4gcG9zdFNjYWxlZEFjY2Vzb3I7CiAgICAgICAgfTsKICAgICAgICBQbG90LnByb3RvdHlwZS5fcGl4ZWxQb2ludCA9IGZ1bmN0aW9uIChkYXR1bSwgaW5kZXgsIGRhdGFzZXQpIHsKICAgICAgICAgICAgcmV0dXJuIHsgeDogMCwgeTogMCB9OwogICAgICAgIH07CiAgICAgICAgUGxvdC5wcm90b3R5cGUuX2FuaW1hdGVPbk5leHRSZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbmltYXRlICYmIHRoaXMuX2RhdGFDaGFuZ2VkOwogICAgICAgIH07CiAgICAgICAgUGxvdC5PUFRJTUlaRV9NRU1PSVpFX1BST0pFQ1RPUlMgPSBmYWxzZTsKICAgICAgICBQbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OID0gNjAwOwogICAgICAgIHJldHVybiBQbG90OwogICAgfShjb21wb25lbnQuQ29tcG9uZW50KSk7CiAgICBleHBvcnRzLlBsb3QgPSBQbG90OwogICAgZnVuY3Rpb24gY29tcHV0ZUV4dGVudChkYXRhc2V0LCBhY2NTY2FsZUJpbmRpbmcsIGZpbHRlcikgewogICAgICAgIHZhciBhY2Nlc3NvciA9IGFjY1NjYWxlQmluZGluZy5hY2Nlc3NvcjsKICAgICAgICB2YXIgc2NhbGUgPSBhY2NTY2FsZUJpbmRpbmcuc2NhbGU7CiAgICAgICAgaWYgKHNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICB2YXIgZGF0YSA9IGRhdGFzZXQuZGF0YSgpOwogICAgICAgIGlmIChmaWx0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICBkYXRhID0gZGF0YS5maWx0ZXIoZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIGZpbHRlcihkLCBpLCBkYXRhc2V0KTsgfSk7CiAgICAgICAgfQogICAgICAgIHZhciBhcHBsaWVkQWNjZXNzb3IgPSBmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gYWNjZXNzb3IoZCwgaSwgZGF0YXNldCk7IH07CiAgICAgICAgdmFyIG1hcHBlZERhdGEgPSBkYXRhLm1hcChhcHBsaWVkQWNjZXNzb3IpOwogICAgICAgIHJldHVybiBzY2FsZS5leHRlbnRPZlZhbHVlcyhtYXBwZWREYXRhKTsKICAgIH0KICAgIH0pOwoKICAgIHZhciBwbG90R3JvdXAgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCiAgICB2YXIgUGxvdEdyb3VwID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUGxvdEdyb3VwLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIFBsb3RHcm91cCgpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlciAhPT0gbnVsbCAmJiBfc3VwZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICBQbG90R3JvdXAucHJvdG90eXBlLmVudGl0eU5lYXJlc3QgPSBmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgICAgICAgdmFyIGNsb3Nlc3RQbG90RW50aXR5OwogICAgICAgICAgICB2YXIgbWluRGlzdFNxdWFyZWQgPSBJbmZpbml0eTsKICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzKCkuZm9yRWFjaChmdW5jdGlvbiAocGxvdENvbXBvbmVudCkgewogICAgICAgICAgICAgICAgLy8gd2Uga25vdyBpdCdzIGEgUGxvdCBzaW5jZSAuYXBwZW5kKCkgdGhyb3dzIGEgcnVudGltZSBlcnJvciBvdGhlcndpc2UKICAgICAgICAgICAgICAgIHZhciBwbG90ID0gcGxvdENvbXBvbmVudDsKICAgICAgICAgICAgICAgIHZhciBjYW5kaWRhdGVQbG90RW50aXR5ID0gcGxvdC5lbnRpdHlOZWFyZXN0KHBvaW50KTsKICAgICAgICAgICAgICAgIGlmIChjYW5kaWRhdGVQbG90RW50aXR5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZGlzdFNxdWFyZWQgPSB1dGlscyQxLk1hdGguZGlzdGFuY2VTcXVhcmVkKGNhbmRpZGF0ZVBsb3RFbnRpdHkucG9zaXRpb24sIHBvaW50KTsKICAgICAgICAgICAgICAgIGlmIChkaXN0U3F1YXJlZCA8PSBtaW5EaXN0U3F1YXJlZCkgewogICAgICAgICAgICAgICAgICAgIG1pbkRpc3RTcXVhcmVkID0gZGlzdFNxdWFyZWQ7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdFBsb3RFbnRpdHkgPSBjYW5kaWRhdGVQbG90RW50aXR5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3RQbG90RW50aXR5OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIFBsb3QgdG8gdGhpcyBQbG90IEdyb3VwLgogICAgICAgICAqIFRoZSBhZGRlZCBQbG90IHdpbGwgYmUgcmVuZGVyZWQgYWJvdmUgUGxvdHMgYWxyZWFkeSBpbiB0aGUgR3JvdXAuCiAgICAgICAgICovCiAgICAgICAgUGxvdEdyb3VwLnByb3RvdHlwZS5hcHBlbmQgPSBmdW5jdGlvbiAocGxvdCQxKSB7CiAgICAgICAgICAgIGlmIChwbG90JDEgIT0gbnVsbCAmJiAhKHBsb3QkMSBpbnN0YW5jZW9mIHBsb3QuUGxvdCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiUGxvdCBHcm91cCBvbmx5IGFjY2VwdHMgcGxvdHMiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmFwcGVuZC5jYWxsKHRoaXMsIHBsb3QkMSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFBsb3RHcm91cDsKICAgIH0oZ3JvdXAuR3JvdXApKTsKICAgIGV4cG9ydHMuUGxvdEdyb3VwID0gUGxvdEdyb3VwOwogICAgfSk7CgogICAgdmFyIHRhYmxlID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgogICAgdmFyIFRhYmxlID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoVGFibGUsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBUYWJsZSBjb21iaW5lcyBDb21wb25lbnRzIGluIHRoZSBmb3JtIG9mIGEgZ3JpZC4gQQogICAgICAgICAqIGNvbW1vbiBjYXNlIGlzIGNvbWJpbmluZyBhIHktYXhpcywgeC1heGlzLCBhbmQgdGhlIHBsb3R0ZWQgZGF0YSB2aWEKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogbmV3IFRhYmxlKFtbeUF4aXMsIHBsb3RdLAogICAgICAgICAqICAgICAgICAgICAgW251bGwsICB4QXhpc11dKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqIEBwYXJhbSB7KENvbXBvbmVudHxudWxsfHVuZGVmaW5lZClbXVtdfSBbcm93cz1bXV0gQSAyLUQgYXJyYXkgb2YgQ29tcG9uZW50cyB0byBiZSBhZGRlZCB0byB0aGUgVGFibGUuCiAgICAgICAgICogICBudWxsIGNhbiBiZSB1c2VkIGlmIGEgY2VsbCBpcyBlbXB0eS4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBUYWJsZShyb3dzKSB7CiAgICAgICAgICAgIGlmIChyb3dzID09PSB2b2lkIDApIHsgcm93cyA9IFtdOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9yb3dQYWRkaW5nID0gMDsKICAgICAgICAgICAgX3RoaXMuX2NvbHVtblBhZGRpbmcgPSAwOwogICAgICAgICAgICBfdGhpcy5fcm93cyA9IFtdOwogICAgICAgICAgICBfdGhpcy5fcm93V2VpZ2h0cyA9IFtdOwogICAgICAgICAgICBfdGhpcy5fY29sdW1uV2VpZ2h0cyA9IFtdOwogICAgICAgICAgICBfdGhpcy5fblJvd3MgPSAwOwogICAgICAgICAgICBfdGhpcy5fbkNvbHMgPSAwOwogICAgICAgICAgICBfdGhpcy5fY2FsY3VsYXRlZExheW91dCA9IG51bGw7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJ0YWJsZSIpOwogICAgICAgICAgICByb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdywgcm93SW5kZXgpIHsKICAgICAgICAgICAgICAgIHJvdy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGNvbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF90aGlzLmFkZChjb21wb25lbnQsIHJvd0luZGV4LCBjb2xJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIFRhYmxlLnByb3RvdHlwZS5fZm9yRWFjaCA9IGZ1bmN0aW9uIChjYWxsYmFjaykgewogICAgICAgICAgICBmb3IgKHZhciByID0gMDsgciA8IHRoaXMuX25Sb3dzOyByKyspIHsKICAgICAgICAgICAgICAgIGZvciAodmFyIGMgPSAwOyBjIDwgdGhpcy5fbkNvbHM7IGMrKykgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yb3dzW3JdW2NdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sodGhpcy5fcm93c1tyXVtjXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIENvbXBvbmVudCBpcyBpbiB0aGUgVGFibGUuCiAgICAgICAgICovCiAgICAgICAgVGFibGUucHJvdG90eXBlLmhhcyA9IGZ1bmN0aW9uIChjb21wb25lbnQpIHsKICAgICAgICAgICAgZm9yICh2YXIgciA9IDA7IHIgPCB0aGlzLl9uUm93czsgcisrKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBjID0gMDsgYyA8IHRoaXMuX25Db2xzOyBjKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcm93c1tyXVtjXSA9PT0gY29tcG9uZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBDb21wb25lbnQgYXQgdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiBpbmRleC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSByb3dJbmRleAogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBjb2x1bW5JbmRleAogICAgICAgICAqIEByZXR1cm5zIHtDb21wb25lbnR9IFRoZSBDb21wb25lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiwgb3IgbnVsbCBpZiBubyBDb21wb25lbnQgaXMgdGhlcmUuCiAgICAgICAgICovCiAgICAgICAgVGFibGUucHJvdG90eXBlLmNvbXBvbmVudEF0ID0gZnVuY3Rpb24gKHJvd0luZGV4LCBjb2x1bW5JbmRleCkgewogICAgICAgICAgICBpZiAocm93SW5kZXggPCAwIHx8IHJvd0luZGV4ID49IHRoaXMuX25Sb3dzIHx8IGNvbHVtbkluZGV4IDwgMCB8fCBjb2x1bW5JbmRleCA+PSB0aGlzLl9uQ29scykgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd3Nbcm93SW5kZXhdW2NvbHVtbkluZGV4XTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSBDb21wb25lbnQgaW4gdGhlIHNwZWNpZmllZCByb3cgYW5kIGNvbHVtbiBwb3NpdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEZvciBleGFtcGxlLCBpbnN0ZWFkIG9mIGNhbGxpbmcgYG5ldyBUYWJsZShbW2EsIGJdLCBbbnVsbCwgY11dKWAsIHlvdQogICAgICAgICAqIGNvdWxkIGNhbGwKICAgICAgICAgKiB2YXIgdGFibGUgPSBuZXcgUGxvdHRhYmxlLkNvbXBvbmVudHMuVGFibGUoKTsKICAgICAgICAgKiB0YWJsZS5hZGQoYSwgMCwgMCk7CiAgICAgICAgICogdGFibGUuYWRkKGIsIDAsIDEpOwogICAgICAgICAqIHRhYmxlLmFkZChjLCAxLCAxKTsKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Q29tcG9uZW50fSBjb21wb25lbnQgVGhlIENvbXBvbmVudCB0byBiZSBhZGRlZC4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gcm93CiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGNvbAogICAgICAgICAqIEByZXR1cm5zIHtUYWJsZX0gVGhlIGNhbGxpbmcgVGFibGUuCiAgICAgICAgICovCiAgICAgICAgVGFibGUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uIChjb21wb25lbnQsIHJvdywgY29sKSB7CiAgICAgICAgICAgIGlmIChjb21wb25lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoIkNhbm5vdCBhZGQgbnVsbCB0byBhIHRhYmxlIGNlbGwiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuaGFzKGNvbXBvbmVudCkpIHsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50Q29tcG9uZW50ID0gdGhpcy5fcm93c1tyb3ddICYmIHRoaXMuX3Jvd3Nbcm93XVtjb2xdOwogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRDb21wb25lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiY2VsbCBpcyBvY2N1cGllZCIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcG9uZW50LmRldGFjaCgpOwogICAgICAgICAgICAgICAgdGhpcy5fblJvd3MgPSBNYXRoLm1heChyb3cgKyAxLCB0aGlzLl9uUm93cyk7CiAgICAgICAgICAgICAgICB0aGlzLl9uQ29scyA9IE1hdGgubWF4KGNvbCArIDEsIHRoaXMuX25Db2xzKTsKICAgICAgICAgICAgICAgIHRoaXMuX3BhZFRhYmxlVG9TaXplKHRoaXMuX25Sb3dzLCB0aGlzLl9uQ29scyk7CiAgICAgICAgICAgICAgICB0aGlzLl9yb3dzW3Jvd11bY29sXSA9IGNvbXBvbmVudDsKICAgICAgICAgICAgICAgIHRoaXMuX2Fkb3B0QW5kQW5jaG9yKGNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgVGFibGUucHJvdG90eXBlLl9yZW1vdmUgPSBmdW5jdGlvbiAoY29tcG9uZW50KSB7CiAgICAgICAgICAgIGZvciAodmFyIHIgPSAwOyByIDwgdGhpcy5fblJvd3M7IHIrKykgewogICAgICAgICAgICAgICAgZm9yICh2YXIgYyA9IDA7IGMgPCB0aGlzLl9uQ29sczsgYysrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd3Nbcl1bY10gPT09IGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3dzW3JdW2NdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9OwogICAgICAgIFRhYmxlLnByb3RvdHlwZS5faXRlcmF0ZUxheW91dCA9IGZ1bmN0aW9uIChhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0LCBpc0ZpbmFsT2ZmZXIpIHsKICAgICAgICAgICAgaWYgKGlzRmluYWxPZmZlciA9PT0gdm9pZCAwKSB7IGlzRmluYWxPZmZlciA9IGZhbHNlOyB9CiAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAqIEdpdmVuIGF2YWlsYWJsZVdpZHRoIGFuZCBhdmFpbGFibGVIZWlnaHQsIGZpZ3VyZSBvdXQgaG93IHRvIGFsbG9jYXRlIGl0IGJldHdlZW4gcm93cyBhbmQgY29sdW1ucyB1c2luZyBhbiBpdGVyYXRpdmUgYWxnb3JpdGhtLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBGb3IgYm90aCBkaW1lbnNpb25zLCBrZWVwcyB0cmFjayBvZiAiZ3VhcmFudGVlZFNwYWNlIiwgd2hpY2ggdGhlIGZpeGVkLXNpemUgY29tcG9uZW50cyBoYXZlIHJlcXVlc3RlZCwgYW5kCiAgICAgICAgICAgICAqICJwcm9wb3J0aW9uYWxTcGFjZSIsIHdoaWNoIGlzIGJlaW5nIGdpdmVuIHRvIHByb3BvcnRpb25hbGx5LWdyb3dpbmcgY29tcG9uZW50cyBhY2NvcmRpbmcgdG8gdGhlIHdlaWdodHMgb24gdGhlIHRhYmxlLgogICAgICAgICAgICAgKiBIZXJlIGlzIGhvdyBpdCB3b3JrcyAoZXhhbXBsZSB1c2VzIHdpZHRoIGJ1dCBpdCBpcyB0aGUgc2FtZSBmb3IgaGVpZ2h0KS4gRmlyc3QsIGNvbHVtbnMgYXJlIGd1YXJhbnRlZWQgbm8gd2lkdGgsIGFuZAogICAgICAgICAgICAgKiB0aGUgZnJlZSB3aWR0aCBpcyBhbGxvY2F0ZWQgdG8gY29sdW1ucyBiYXNlZCBvbiB0aGVpciBjb2xXZWlnaHRzLiBUaGVuLCBpbiBkZXRlcm1pbmVHdWFyYW50ZWVzLCBldmVyeSBjb21wb25lbnQgaXMKICAgICAgICAgICAgICogb2ZmZXJlZCBpdHMgY29sdW1uJ3Mgd2lkdGggYW5kIG1heSByZXF1ZXN0IHNvbWUgYW1vdW50IG9mIGl0LCB3aGljaCBpbmNyZWFzZXMgdGhhdCBjb2x1bW4ncyBndWFyYW50ZWVkCiAgICAgICAgICAgICAqIHdpZHRoLiBJZiB0aGVyZSBhcmUgc29tZSBjb21wb25lbnRzIHRoYXQgd2VyZSBub3Qgc2F0aXNmaWVkIHdpdGggdGhlIHdpZHRoIHRoZXkgd2VyZSBvZmZlcmVkLCBhbmQgdGhlcmUgaXMgZnJlZQogICAgICAgICAgICAgKiB3aWR0aCB0aGF0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGd1YXJhbnRlZWQsIHRoZW4gdGhlIHJlbWFpbmluZyB3aWR0aCBpcyBhbGxvY2F0ZWQgdG8gdGhlIHVuc2F0aXNmaWVkIGNvbHVtbnMgYW5kIHRoZQogICAgICAgICAgICAgKiBhbGdvcml0aG0gcnVucyBhZ2Fpbi4gSWYgYWxsIGNvbXBvbmVudHMgYXJlIHNhdGlzZmllZCwgdGhlbiB0aGUgcmVtYWluaW5nIHdpZHRoIGlzIGFsbG9jYXRlZCBhcyBwcm9wb3J0aW9uYWwgc3BhY2UKICAgICAgICAgICAgICogYWNjb3JkaW5nIHRvIHRoZSBjb2xXZWlnaHRzLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBUaGUgZ3VhcmFudGVlZCB3aWR0aCBmb3IgZWFjaCBjb2x1bW4gaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIGFzIHRoZSBhbGdvcml0aG0gaXRlcmF0ZXMuIFNpbmNlIGl0IGlzIGRldGVybWluaXN0aWMKICAgICAgICAgICAgICogYW5kIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZywgaWYgdGhlIGZyZWVXaWR0aCBkb2VzIG5vdCBjaGFuZ2UgZHVyaW5nIGFuIGl0ZXJhdGlvbiBpdCBpbXBsaWVzIHRoYXQgbm8gZnVydGhlciBwcm9ncmVzcwogICAgICAgICAgICAgKiBpcyBwb3NzaWJsZSwgc28gdGhlIGFsZ29yaXRobSB3aWxsIG5vdCBjb250aW51ZSBpdGVyYXRpbmcgb24gdGhhdCBkaW1lbnNpb24ncyBhY2NvdW50LgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJZiB0aGUgYWxnb3JpdGhtIHJ1bnMgbW9yZSB0aGFuIDUgdGltZXMsIHdlIHN0b3AgYW5kIGp1c3QgdXNlIHdoYXRldmVyIHdlIGFycml2ZWQgYXQuIEl0J3Mgbm90IGNsZWFyIHVuZGVyIHdoYXQKICAgICAgICAgICAgICogY2lyY3Vtc3RhbmNlcyB0aGlzIHdpbGwgaGFwcGVuIG9yIGlmIGl0IHdpbGwgaGFwcGVuIGF0IGFsbC4gQSBtZXNzYWdlIHdpbGwgYmUgcHJpbnRlZCB0byB0aGUgY29uc29sZSBpZiB0aGlzIG9jY3Vycy4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhciByb3dzID0gdGhpcy5fcm93czsKICAgICAgICAgICAgdmFyIGNvbHMgPSBkMy50cmFuc3Bvc2UodGhpcy5fcm93cyk7CiAgICAgICAgICAgIHZhciBhdmFpbGFibGVXaWR0aEFmdGVyUGFkZGluZyA9IGF2YWlsYWJsZVdpZHRoIC0gdGhpcy5fY29sdW1uUGFkZGluZyAqICh0aGlzLl9uQ29scyAtIDEpOwogICAgICAgICAgICB2YXIgYXZhaWxhYmxlSGVpZ2h0QWZ0ZXJQYWRkaW5nID0gYXZhaWxhYmxlSGVpZ2h0IC0gdGhpcy5fcm93UGFkZGluZyAqICh0aGlzLl9uUm93cyAtIDEpOwogICAgICAgICAgICB2YXIgcm93V2VpZ2h0cyA9IFRhYmxlLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyh0aGlzLl9yb3dXZWlnaHRzLCByb3dzLCBmdW5jdGlvbiAoYykgeyByZXR1cm4gKGMgPT0gbnVsbCkgfHwgYy5maXhlZEhlaWdodCgpOyB9KTsKICAgICAgICAgICAgdmFyIGNvbFdlaWdodHMgPSBUYWJsZS5fY2FsY0NvbXBvbmVudFdlaWdodHModGhpcy5fY29sdW1uV2VpZ2h0cywgY29scywgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjID09IG51bGwpIHx8IGMuZml4ZWRXaWR0aCgpOyB9KTsKICAgICAgICAgICAgLy8gVG8gZ2l2ZSB0aGUgdGFibGUgYSBnb29kIHN0YXJ0aW5nIHBvc2l0aW9uIHRvIGl0ZXJhdGUgZnJvbSwgd2UgZ2l2ZSB0aGUgZml4ZWQtd2lkdGggY29tcG9uZW50cyBoYWxmLXdlaWdodAogICAgICAgICAgICAvLyBzbyB0aGF0IHRoZXkgd2lsbCBnZXQgc29tZSBpbml0aWFsIHNwYWNlIGFsbG9jYXRlZCB0byB3b3JrIHdpdGgKICAgICAgICAgICAgdmFyIGhldXJpc3RpY0NvbFdlaWdodHMgPSBjb2xXZWlnaHRzLm1hcChmdW5jdGlvbiAoYykgeyByZXR1cm4gYyA9PT0gMCA/IDAuNSA6IGM7IH0pOwogICAgICAgICAgICB2YXIgaGV1cmlzdGljUm93V2VpZ2h0cyA9IHJvd1dlaWdodHMubWFwKGZ1bmN0aW9uIChjKSB7IHJldHVybiBjID09PSAwID8gMC41IDogYzsgfSk7CiAgICAgICAgICAgIHZhciBjb2xQcm9wb3J0aW9uYWxTcGFjZSA9IFRhYmxlLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2UoaGV1cmlzdGljQ29sV2VpZ2h0cywgYXZhaWxhYmxlV2lkdGhBZnRlclBhZGRpbmcpOwogICAgICAgICAgICB2YXIgcm93UHJvcG9ydGlvbmFsU3BhY2UgPSBUYWJsZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKGhldXJpc3RpY1Jvd1dlaWdodHMsIGF2YWlsYWJsZUhlaWdodEFmdGVyUGFkZGluZyk7CiAgICAgICAgICAgIHZhciBndWFyYW50ZWVkV2lkdGhzID0gdXRpbHMkMS5BcnJheS5jcmVhdGVGaWxsZWRBcnJheSgwLCB0aGlzLl9uQ29scyk7CiAgICAgICAgICAgIHZhciBndWFyYW50ZWVkSGVpZ2h0cyA9IHV0aWxzJDEuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCwgdGhpcy5fblJvd3MpOwogICAgICAgICAgICB2YXIgZnJlZVdpZHRoOwogICAgICAgICAgICB2YXIgZnJlZUhlaWdodDsKICAgICAgICAgICAgdmFyIG5JdGVyYXRpb25zID0gMDsKICAgICAgICAgICAgdmFyIGd1YXJhbnRlZXM7CiAgICAgICAgICAgIHZhciB3YW50c1dpZHRoOwogICAgICAgICAgICB2YXIgd2FudHNIZWlnaHQ7CiAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICB2YXIgb2ZmZXJlZEhlaWdodHMgPSB1dGlscyQxLkFycmF5LmFkZChndWFyYW50ZWVkSGVpZ2h0cywgcm93UHJvcG9ydGlvbmFsU3BhY2UpOwogICAgICAgICAgICAgICAgdmFyIG9mZmVyZWRXaWR0aHMgPSB1dGlscyQxLkFycmF5LmFkZChndWFyYW50ZWVkV2lkdGhzLCBjb2xQcm9wb3J0aW9uYWxTcGFjZSk7CiAgICAgICAgICAgICAgICBndWFyYW50ZWVzID0gdGhpcy5fZGV0ZXJtaW5lR3VhcmFudGVlcyhvZmZlcmVkV2lkdGhzLCBvZmZlcmVkSGVpZ2h0cywgaXNGaW5hbE9mZmVyKTsKICAgICAgICAgICAgICAgIGd1YXJhbnRlZWRXaWR0aHMgPSBndWFyYW50ZWVzLmd1YXJhbnRlZWRXaWR0aHM7CiAgICAgICAgICAgICAgICBndWFyYW50ZWVkSGVpZ2h0cyA9IGd1YXJhbnRlZXMuZ3VhcmFudGVlZEhlaWdodHM7CiAgICAgICAgICAgICAgICB3YW50c1dpZHRoID0gZ3VhcmFudGVlcy53YW50c1dpZHRoQXJyLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH0pOwogICAgICAgICAgICAgICAgd2FudHNIZWlnaHQgPSBndWFyYW50ZWVzLndhbnRzSGVpZ2h0QXJyLnNvbWUoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHg7IH0pOwogICAgICAgICAgICAgICAgdmFyIGxhc3RGcmVlV2lkdGggPSBmcmVlV2lkdGg7CiAgICAgICAgICAgICAgICB2YXIgbGFzdEZyZWVIZWlnaHQgPSBmcmVlSGVpZ2h0OwogICAgICAgICAgICAgICAgZnJlZVdpZHRoID0gYXZhaWxhYmxlV2lkdGhBZnRlclBhZGRpbmcgLSBkMy5zdW0oZ3VhcmFudGVlcy5ndWFyYW50ZWVkV2lkdGhzKTsKICAgICAgICAgICAgICAgIGZyZWVIZWlnaHQgPSBhdmFpbGFibGVIZWlnaHRBZnRlclBhZGRpbmcgLSBkMy5zdW0oZ3VhcmFudGVlcy5ndWFyYW50ZWVkSGVpZ2h0cyk7CiAgICAgICAgICAgICAgICB2YXIgeFdlaWdodHMgPSB2b2lkIDA7CiAgICAgICAgICAgICAgICBpZiAod2FudHNXaWR0aCkgewogICAgICAgICAgICAgICAgICAgIHhXZWlnaHRzID0gZ3VhcmFudGVlcy53YW50c1dpZHRoQXJyLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA/IDAuMSA6IDA7IH0pOwogICAgICAgICAgICAgICAgICAgIHhXZWlnaHRzID0gdXRpbHMkMS5BcnJheS5hZGQoeFdlaWdodHMsIGNvbFdlaWdodHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgeFdlaWdodHMgPSBjb2xXZWlnaHRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHlXZWlnaHRzID0gdm9pZCAwOwogICAgICAgICAgICAgICAgaWYgKHdhbnRzSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgeVdlaWdodHMgPSBndWFyYW50ZWVzLndhbnRzSGVpZ2h0QXJyLm1hcChmdW5jdGlvbiAoeCkgeyByZXR1cm4geCA/IDAuMSA6IDA7IH0pOwogICAgICAgICAgICAgICAgICAgIHlXZWlnaHRzID0gdXRpbHMkMS5BcnJheS5hZGQoeVdlaWdodHMsIHJvd1dlaWdodHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgeVdlaWdodHMgPSByb3dXZWlnaHRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29sUHJvcG9ydGlvbmFsU3BhY2UgPSBUYWJsZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHhXZWlnaHRzLCBmcmVlV2lkdGgpOwogICAgICAgICAgICAgICAgcm93UHJvcG9ydGlvbmFsU3BhY2UgPSBUYWJsZS5fY2FsY1Byb3BvcnRpb25hbFNwYWNlKHlXZWlnaHRzLCBmcmVlSGVpZ2h0KTsKICAgICAgICAgICAgICAgIG5JdGVyYXRpb25zKys7CiAgICAgICAgICAgICAgICB2YXIgY2FuSW1wcm92ZVdpZHRoQWxsb2NhdGlvbiA9IGZyZWVXaWR0aCA+IDAgJiYgZnJlZVdpZHRoICE9PSBsYXN0RnJlZVdpZHRoOwogICAgICAgICAgICAgICAgdmFyIGNhbkltcHJvdmVIZWlnaHRBbGxvY2F0aW9uID0gZnJlZUhlaWdodCA+IDAgJiYgZnJlZUhlaWdodCAhPT0gbGFzdEZyZWVIZWlnaHQ7CiAgICAgICAgICAgICAgICBpZiAoIShjYW5JbXByb3ZlV2lkdGhBbGxvY2F0aW9uIHx8IGNhbkltcHJvdmVIZWlnaHRBbGxvY2F0aW9uKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5JdGVyYXRpb25zID4gNSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlZG8gdGhlIHByb3BvcnRpb25hbCBzcGFjZSBvbmUgbGFzdCB0aW1lLCB0byBlbnN1cmUgd2UgdXNlIHRoZSByZWFsIHdlaWdodHMgbm90IHRoZSB3YW50c1dpZHRoL0hlaWdodCB3ZWlnaHRzCiAgICAgICAgICAgIGZyZWVXaWR0aCA9IGF2YWlsYWJsZVdpZHRoQWZ0ZXJQYWRkaW5nIC0gZDMuc3VtKGd1YXJhbnRlZXMuZ3VhcmFudGVlZFdpZHRocyk7CiAgICAgICAgICAgIGZyZWVIZWlnaHQgPSBhdmFpbGFibGVIZWlnaHRBZnRlclBhZGRpbmcgLSBkMy5zdW0oZ3VhcmFudGVlcy5ndWFyYW50ZWVkSGVpZ2h0cyk7CiAgICAgICAgICAgIGNvbFByb3BvcnRpb25hbFNwYWNlID0gVGFibGUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZShjb2xXZWlnaHRzLCBmcmVlV2lkdGgpOwogICAgICAgICAgICByb3dQcm9wb3J0aW9uYWxTcGFjZSA9IFRhYmxlLl9jYWxjUHJvcG9ydGlvbmFsU3BhY2Uocm93V2VpZ2h0cywgZnJlZUhlaWdodCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjb2xQcm9wb3J0aW9uYWxTcGFjZTogY29sUHJvcG9ydGlvbmFsU3BhY2UsCiAgICAgICAgICAgICAgICByb3dQcm9wb3J0aW9uYWxTcGFjZTogcm93UHJvcG9ydGlvbmFsU3BhY2UsCiAgICAgICAgICAgICAgICBndWFyYW50ZWVkV2lkdGhzOiBndWFyYW50ZWVzLmd1YXJhbnRlZWRXaWR0aHMsCiAgICAgICAgICAgICAgICBndWFyYW50ZWVkSGVpZ2h0czogZ3VhcmFudGVlcy5ndWFyYW50ZWVkSGVpZ2h0cywKICAgICAgICAgICAgICAgIHdhbnRzV2lkdGg6IHdhbnRzV2lkdGgsCiAgICAgICAgICAgICAgICB3YW50c0hlaWdodDogd2FudHNIZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBUYWJsZS5wcm90b3R5cGUuX2RldGVybWluZUd1YXJhbnRlZXMgPSBmdW5jdGlvbiAob2ZmZXJlZFdpZHRocywgb2ZmZXJlZEhlaWdodHMsIGlzRmluYWxPZmZlcikgewogICAgICAgICAgICBpZiAoaXNGaW5hbE9mZmVyID09PSB2b2lkIDApIHsgaXNGaW5hbE9mZmVyID0gZmFsc2U7IH0KICAgICAgICAgICAgdmFyIHJlcXVlc3RlZFdpZHRocyA9IHV0aWxzJDEuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCwgdGhpcy5fbkNvbHMpOwogICAgICAgICAgICB2YXIgcmVxdWVzdGVkSGVpZ2h0cyA9IHV0aWxzJDEuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCwgdGhpcy5fblJvd3MpOwogICAgICAgICAgICB2YXIgY29sdW1uTmVlZHNXaWR0aCA9IHV0aWxzJDEuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoZmFsc2UsIHRoaXMuX25Db2xzKTsKICAgICAgICAgICAgdmFyIHJvd05lZWRzSGVpZ2h0ID0gdXRpbHMkMS5BcnJheS5jcmVhdGVGaWxsZWRBcnJheShmYWxzZSwgdGhpcy5fblJvd3MpOwogICAgICAgICAgICB0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdywgcm93SW5kZXgpIHsKICAgICAgICAgICAgICAgIHJvdy5mb3JFYWNoKGZ1bmN0aW9uIChjb21wb25lbnQsIGNvbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHNwYWNlUmVxdWVzdDsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VSZXF1ZXN0ID0gY29tcG9uZW50LnJlcXVlc3RlZFNwYWNlKG9mZmVyZWRXaWR0aHNbY29sSW5kZXhdLCBvZmZlcmVkSGVpZ2h0c1tyb3dJbmRleF0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VSZXF1ZXN0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluV2lkdGg6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjb2x1bW5XaWR0aCA9IGlzRmluYWxPZmZlciA/IE1hdGgubWluKHNwYWNlUmVxdWVzdC5taW5XaWR0aCwgb2ZmZXJlZFdpZHRoc1tjb2xJbmRleF0pIDogc3BhY2VSZXF1ZXN0Lm1pbldpZHRoOwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFdpZHRoc1tjb2xJbmRleF0gPSBNYXRoLm1heChyZXF1ZXN0ZWRXaWR0aHNbY29sSW5kZXhdLCBjb2x1bW5XaWR0aCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJvd0hlaWdodCA9IGlzRmluYWxPZmZlciA/IE1hdGgubWluKHNwYWNlUmVxdWVzdC5taW5IZWlnaHQsIG9mZmVyZWRIZWlnaHRzW3Jvd0luZGV4XSkgOiBzcGFjZVJlcXVlc3QubWluSGVpZ2h0OwogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZEhlaWdodHNbcm93SW5kZXhdID0gTWF0aC5tYXgocmVxdWVzdGVkSGVpZ2h0c1tyb3dJbmRleF0sIHJvd0hlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudE5lZWRzV2lkdGggPSBzcGFjZVJlcXVlc3QubWluV2lkdGggPiBvZmZlcmVkV2lkdGhzW2NvbEluZGV4XTsKICAgICAgICAgICAgICAgICAgICBjb2x1bW5OZWVkc1dpZHRoW2NvbEluZGV4XSA9IGNvbHVtbk5lZWRzV2lkdGhbY29sSW5kZXhdIHx8IGNvbXBvbmVudE5lZWRzV2lkdGg7CiAgICAgICAgICAgICAgICAgICAgdmFyIGNvbXBvbmVudE5lZWRzSGVpZ2h0ID0gc3BhY2VSZXF1ZXN0Lm1pbkhlaWdodCA+IG9mZmVyZWRIZWlnaHRzW3Jvd0luZGV4XTsKICAgICAgICAgICAgICAgICAgICByb3dOZWVkc0hlaWdodFtyb3dJbmRleF0gPSByb3dOZWVkc0hlaWdodFtyb3dJbmRleF0gfHwgY29tcG9uZW50TmVlZHNIZWlnaHQ7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBndWFyYW50ZWVkV2lkdGhzOiByZXF1ZXN0ZWRXaWR0aHMsCiAgICAgICAgICAgICAgICBndWFyYW50ZWVkSGVpZ2h0czogcmVxdWVzdGVkSGVpZ2h0cywKICAgICAgICAgICAgICAgIHdhbnRzV2lkdGhBcnI6IGNvbHVtbk5lZWRzV2lkdGgsCiAgICAgICAgICAgICAgICB3YW50c0hlaWdodEFycjogcm93TmVlZHNIZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBUYWJsZS5wcm90b3R5cGUucmVxdWVzdGVkU3BhY2UgPSBmdW5jdGlvbiAob2ZmZXJlZFdpZHRoLCBvZmZlcmVkSGVpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQgPSB0aGlzLl9pdGVyYXRlTGF5b3V0KG9mZmVyZWRXaWR0aCwgb2ZmZXJlZEhlaWdodCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBtaW5XaWR0aDogZDMuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyksCiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IGQzLnN1bSh0aGlzLl9jYWxjdWxhdGVkTGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIFRhYmxlLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLCBvcmlnaW4sIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICB2YXIgbGFzdExheW91dFdpZHRoID0gZDMuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZFdpZHRocyk7CiAgICAgICAgICAgIHZhciBsYXN0TGF5b3V0SGVpZ2h0ID0gZDMuc3VtKHRoaXMuX2NhbGN1bGF0ZWRMYXlvdXQuZ3VhcmFudGVlZEhlaWdodHMpOwogICAgICAgICAgICB2YXIgbGF5b3V0ID0gdGhpcy5fY2FsY3VsYXRlZExheW91dDsKICAgICAgICAgICAgaWYgKGxhc3RMYXlvdXRXaWR0aCA+IHRoaXMud2lkdGgoKSB8fCBsYXN0TGF5b3V0SGVpZ2h0ID4gdGhpcy5oZWlnaHQoKSkgewogICAgICAgICAgICAgICAgbGF5b3V0ID0gdGhpcy5faXRlcmF0ZUxheW91dCh0aGlzLndpZHRoKCksIHRoaXMuaGVpZ2h0KCksIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjaGlsZFlPcmlnaW4gPSAwOwogICAgICAgICAgICB2YXIgcm93SGVpZ2h0cyA9IHV0aWxzJDEuQXJyYXkuYWRkKGxheW91dC5yb3dQcm9wb3J0aW9uYWxTcGFjZSwgbGF5b3V0Lmd1YXJhbnRlZWRIZWlnaHRzKTsKICAgICAgICAgICAgdmFyIGNvbFdpZHRocyA9IHV0aWxzJDEuQXJyYXkuYWRkKGxheW91dC5jb2xQcm9wb3J0aW9uYWxTcGFjZSwgbGF5b3V0Lmd1YXJhbnRlZWRXaWR0aHMpOwogICAgICAgICAgICB0aGlzLl9yb3dzLmZvckVhY2goZnVuY3Rpb24gKHJvdywgcm93SW5kZXgpIHsKICAgICAgICAgICAgICAgIHZhciBjaGlsZFhPcmlnaW4gPSAwOwogICAgICAgICAgICAgICAgcm93LmZvckVhY2goZnVuY3Rpb24gKGNvbXBvbmVudCwgY29sSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAvLyByZWN1cnNpdmVseSBjb21wdXRlIGxheW91dAogICAgICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQuY29tcHV0ZUxheW91dCh7IHg6IGNoaWxkWE9yaWdpbiwgeTogY2hpbGRZT3JpZ2luIH0sIGNvbFdpZHRoc1tjb2xJbmRleF0sIHJvd0hlaWdodHNbcm93SW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2hpbGRYT3JpZ2luICs9IGNvbFdpZHRoc1tjb2xJbmRleF0gKyBfdGhpcy5fY29sdW1uUGFkZGluZzsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgY2hpbGRZT3JpZ2luICs9IHJvd0hlaWdodHNbcm93SW5kZXhdICsgX3RoaXMuX3Jvd1BhZGRpbmc7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFRhYmxlLnByb3RvdHlwZS5yb3dQYWRkaW5nID0gZnVuY3Rpb24gKHJvd1BhZGRpbmcpIHsKICAgICAgICAgICAgaWYgKHJvd1BhZGRpbmcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1BhZGRpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihyb3dQYWRkaW5nKSB8fCByb3dQYWRkaW5nIDwgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoInJvd1BhZGRpbmcgbXVzdCBiZSBhIG5vbi1uZWdhdGl2ZSBmaW5pdGUgdmFsdWUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9yb3dQYWRkaW5nID0gcm93UGFkZGluZzsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBUYWJsZS5wcm90b3R5cGUuY29sdW1uUGFkZGluZyA9IGZ1bmN0aW9uIChjb2x1bW5QYWRkaW5nKSB7CiAgICAgICAgICAgIGlmIChjb2x1bW5QYWRkaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb2x1bW5QYWRkaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIoY29sdW1uUGFkZGluZykgfHwgY29sdW1uUGFkZGluZyA8IDApIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCJjb2x1bW5QYWRkaW5nIG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY29sdW1uUGFkZGluZyA9IGNvbHVtblBhZGRpbmc7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgVGFibGUucHJvdG90eXBlLnJvd1dlaWdodCA9IGZ1bmN0aW9uIChpbmRleCwgd2VpZ2h0KSB7CiAgICAgICAgICAgIGlmICh3ZWlnaHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jvd1dlaWdodHNbaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigicm93V2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcm93V2VpZ2h0c1tpbmRleF0gPSB3ZWlnaHQ7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgVGFibGUucHJvdG90eXBlLmNvbHVtbldlaWdodCA9IGZ1bmN0aW9uIChpbmRleCwgd2VpZ2h0KSB7CiAgICAgICAgICAgIGlmICh3ZWlnaHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbldlaWdodHNbaW5kZXhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIod2VpZ2h0KSB8fCB3ZWlnaHQgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigiY29sdW1uV2VpZ2h0IG11c3QgYmUgYSBub24tbmVnYXRpdmUgZmluaXRlIHZhbHVlIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY29sdW1uV2VpZ2h0c1tpbmRleF0gPSB3ZWlnaHQ7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgVGFibGUucHJvdG90eXBlLmZpeGVkV2lkdGggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjb2xzID0gZDMudHJhbnNwb3NlKHRoaXMuX3Jvd3MpOwogICAgICAgICAgICByZXR1cm4gVGFibGUuX2ZpeGVkU3BhY2UoY29scywgZnVuY3Rpb24gKGMpIHsgcmV0dXJuIChjID09IG51bGwpIHx8IGMuZml4ZWRXaWR0aCgpOyB9KTsKICAgICAgICB9OwogICAgICAgIFRhYmxlLnByb3RvdHlwZS5maXhlZEhlaWdodCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIFRhYmxlLl9maXhlZFNwYWNlKHRoaXMuX3Jvd3MsIGZ1bmN0aW9uIChjKSB7IHJldHVybiAoYyA9PSBudWxsKSB8fCBjLmZpeGVkSGVpZ2h0KCk7IH0pOwogICAgICAgIH07CiAgICAgICAgVGFibGUucHJvdG90eXBlLl9wYWRUYWJsZVRvU2l6ZSA9IGZ1bmN0aW9uIChuUm93cywgbkNvbHMpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBuUm93czsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcm93c1tpXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm93c1tpXSA9IFtdOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Jvd1dlaWdodHNbaV0gPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ29sczsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Jvd3NbaV1bal0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yb3dzW2ldW2pdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBuQ29sczsgaisrKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29sdW1uV2VpZ2h0c1tqXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29sdW1uV2VpZ2h0c1tqXSA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFRhYmxlLl9jYWxjQ29tcG9uZW50V2VpZ2h0cyA9IGZ1bmN0aW9uIChzZXRXZWlnaHRzLCBjb21wb25lbnRHcm91cHMsIGZpeGl0eUFjY2Vzc29yKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSByb3cvY29sIHdlaWdodCB3YXMgZXhwbGljaXRseSBzZXQsIHRoZW4gcmV0dXJuIGl0IG91dHJpZ2h0CiAgICAgICAgICAgIC8vIElmIHRoZSB3ZWlnaHQgd2FzIG5vdCBleHBsaWNpdGx5IHNldCwgdGhlbiBndWVzcyBpdCB1c2luZyB0aGUgaGV1cmlzdGljIHRoYXQgaWYgYWxsIGNvbXBvbmVudHMgYXJlIGZpeGVkLXNwYWNlCiAgICAgICAgICAgIC8vIHRoZW4gd2VpZ2h0IGlzIDAsIG90aGVyd2lzZSB3ZWlnaHQgaXMgMQogICAgICAgICAgICByZXR1cm4gc2V0V2VpZ2h0cy5tYXAoZnVuY3Rpb24gKHcsIGkpIHsKICAgICAgICAgICAgICAgIGlmICh3ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBmaXhpdGllcyA9IGNvbXBvbmVudEdyb3Vwc1tpXS5tYXAoZml4aXR5QWNjZXNzb3IpOwogICAgICAgICAgICAgICAgdmFyIGFsbEZpeGVkID0gZml4aXRpZXMucmVkdWNlKGZ1bmN0aW9uIChhLCBiKSB7IHJldHVybiBhICYmIGI7IH0sIHRydWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFsbEZpeGVkID8gMCA6IDE7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgVGFibGUuX2NhbGNQcm9wb3J0aW9uYWxTcGFjZSA9IGZ1bmN0aW9uICh3ZWlnaHRzLCBmcmVlU3BhY2UpIHsKICAgICAgICAgICAgdmFyIHdlaWdodFN1bSA9IGQzLnN1bSh3ZWlnaHRzKTsKICAgICAgICAgICAgaWYgKHdlaWdodFN1bSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuQXJyYXkuY3JlYXRlRmlsbGVkQXJyYXkoMCwgd2VpZ2h0cy5sZW5ndGgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHdlaWdodHMubWFwKGZ1bmN0aW9uICh3KSB7IHJldHVybiBmcmVlU3BhY2UgKiB3IC8gd2VpZ2h0U3VtOyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgVGFibGUuX2ZpeGVkU3BhY2UgPSBmdW5jdGlvbiAoY29tcG9uZW50R3JvdXAsIGZpeGl0eUFjY2Vzc29yKSB7CiAgICAgICAgICAgIHZhciBhbGwgPSBmdW5jdGlvbiAoYm9vbHMpIHsgcmV0dXJuIGJvb2xzLnJlZHVjZShmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAmJiBiOyB9LCB0cnVlKTsgfTsKICAgICAgICAgICAgdmFyIGdyb3VwSXNGaXhlZCA9IGZ1bmN0aW9uIChjb21wb25lbnRzKSB7IHJldHVybiBhbGwoY29tcG9uZW50cy5tYXAoZml4aXR5QWNjZXNzb3IpKTsgfTsKICAgICAgICAgICAgcmV0dXJuIGFsbChjb21wb25lbnRHcm91cC5tYXAoZ3JvdXBJc0ZpeGVkKSk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gVGFibGU7CiAgICB9KGNvbXBvbmVudENvbnRhaW5lci5Db21wb25lbnRDb250YWluZXIpKTsKICAgIGV4cG9ydHMuVGFibGUgPSBUYWJsZTsKICAgIH0pOwoKICAgIHZhciB3cmFwcGVkTGFiZWwgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgdmFyIERFRkFVTFRfTUFYX0xJTkVTID0gMjsKICAgIHZhciBXcmFwcGVkTGFiZWwgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhXcmFwcGVkTGFiZWwsIF9zdXBlcik7CiAgICAgICAgZnVuY3Rpb24gV3JhcHBlZExhYmVsKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIgIT09IG51bGwgJiYgX3N1cGVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX21heExpbmVzID0gREVGQVVMVF9NQVhfTElORVM7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgV3JhcHBlZExhYmVsLnByb3RvdHlwZS5yZXF1ZXN0ZWRTcGFjZSA9IGZ1bmN0aW9uIChvZmZlcmVkV2lkdGgsIG9mZmVyZWRIZWlnaHQpIHsKICAgICAgICAgICAgdGhpcy5fd3JhcHBlci5tYXhMaW5lcyh0aGlzLl9tYXhMaW5lcyk7CiAgICAgICAgICAgIHZhciBvZmZlcmVkTGluZUxlbmd0aCA9IHRoaXMuYW5nbGUoKSA9PT0gMCA/IG9mZmVyZWRXaWR0aCA6IG9mZmVyZWRIZWlnaHQ7CiAgICAgICAgICAgIGlmIChvZmZlcmVkTGluZUxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgb2ZmZXJlZExpbmVMZW5ndGggPSBJbmZpbml0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgd3JhcHBlZCA9IHRoaXMuX3dyYXBwZXIud3JhcCh0aGlzLl90ZXh0LCB0aGlzLl9tZWFzdXJlciwgb2ZmZXJlZExpbmVMZW5ndGgpOwogICAgICAgICAgICB2YXIgbWVhc3VyZWRXcmFwID0gdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh3cmFwcGVkLndyYXBwZWRUZXh0KTsKICAgICAgICAgICAgdmFyIG1pbldpZHRoID0gKHRoaXMuYW5nbGUoKSA9PT0gMCA/IG1lYXN1cmVkV3JhcC53aWR0aCA6IG1lYXN1cmVkV3JhcC5oZWlnaHQpICsgMiAqIHRoaXMucGFkZGluZygpOwogICAgICAgICAgICB2YXIgbWluSGVpZ2h0ID0gKHRoaXMuYW5nbGUoKSA9PT0gMCA/IG1lYXN1cmVkV3JhcC5oZWlnaHQgOiBtZWFzdXJlZFdyYXAud2lkdGgpICsgMiAqIHRoaXMucGFkZGluZygpOwogICAgICAgICAgICByZXR1cm4geyBtaW5XaWR0aDogbWluV2lkdGgsIG1pbkhlaWdodDogbWluSGVpZ2h0IH07CiAgICAgICAgfTsKICAgICAgICBXcmFwcGVkTGFiZWwucHJvdG90eXBlLm1heExpbmVzID0gZnVuY3Rpb24gKG1heExpbmVzKSB7CiAgICAgICAgICAgIC8vIGFsbG93IHVzZXIgdG8gdW4tc2V0IGJ5IHBhc3NpbmcgaW4gbnVsbCBvciB1bmRlZmluZWQgZXhwbGljaXRseQogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21heExpbmVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21heExpbmVzID0gbWF4TGluZXM7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFdyYXBwZWRMYWJlbDsKICAgIH0obGFiZWwuTGFiZWwpKTsKICAgIGV4cG9ydHMuV3JhcHBlZExhYmVsID0gV3JhcHBlZExhYmVsOwogICAgfSk7CgogICAgdmFyIHhEcmFnQm94TGF5ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgdmFyIFhEcmFnQm94TGF5ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhYRHJhZ0JveExheWVyLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEFuIFhEcmFnQm94TGF5ZXIgaXMgYSBEcmFnQm94TGF5ZXIgd2hvc2Ugc2l6ZSBjYW4gb25seSBiZSBzZXQgaW4gdGhlIFgtZGlyZWN0aW9uLgogICAgICAgICAqIFRoZSB5LXZhbHVlcyBvZiB0aGUgYm91bmRzKCkgYXJlIGFsd2F5cyBzZXQgdG8gMCBhbmQgdGhlIGhlaWdodCgpIG9mIHRoZSBYRHJhZ0JveExheWVyLgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gWERyYWdCb3hMYXllcigpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoIngtZHJhZy1ib3gtbGF5ZXIiKTsKICAgICAgICAgICAgX3RoaXMuX2hhc0Nvcm5lcnMgPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBYRHJhZ0JveExheWVyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLCBvcmlnaW4sIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICAvLyBzZXQgY29ycmVjdCBib3VuZHMgd2hlbiB3aWR0aC9oZWlnaHQgY2hhbmdlcwogICAgICAgICAgICB0aGlzLl9zZXRCb3VuZHModGhpcy5ib3VuZHMoKSk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgWERyYWdCb3hMYXllci5wcm90b3R5cGUuX3NldEJvdW5kcyA9IGZ1bmN0aW9uIChuZXdCb3VuZHMpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2V0Qm91bmRzLmNhbGwodGhpcywgewogICAgICAgICAgICAgICAgdG9wTGVmdDogeyB4OiBuZXdCb3VuZHMudG9wTGVmdC54LCB5OiAwIH0sCiAgICAgICAgICAgICAgICBib3R0b21SaWdodDogeyB4OiBuZXdCb3VuZHMuYm90dG9tUmlnaHQueCwgeTogdGhpcy5oZWlnaHQoKSB9LAogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIFhEcmFnQm94TGF5ZXIucHJvdG90eXBlLl9zZXRSZXNpemFibGVDbGFzc2VzID0gZnVuY3Rpb24gKGNhblJlc2l6ZSkgewogICAgICAgICAgICBpZiAoY2FuUmVzaXplICYmIHRoaXMuZW5hYmxlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZENsYXNzKCJ4LXJlc2l6YWJsZSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVDbGFzcygieC1yZXNpemFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgWERyYWdCb3hMYXllci5wcm90b3R5cGUueVNjYWxlID0gZnVuY3Rpb24gKHlTY2FsZSkgewogICAgICAgICAgICBpZiAoeVNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnlTY2FsZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigieVNjYWxlcyBjYW5ub3QgYmUgc2V0IG9uIGFuIFhEcmFnQm94TGF5ZXIiKTsKICAgICAgICB9OwogICAgICAgIFhEcmFnQm94TGF5ZXIucHJvdG90eXBlLnlFeHRlbnQgPSBmdW5jdGlvbiAoeUV4dGVudCkgewogICAgICAgICAgICBpZiAoeUV4dGVudCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS55RXh0ZW50LmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJYRHJhZ0JveExheWVyIGhhcyBubyB5RXh0ZW50Iik7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gWERyYWdCb3hMYXllcjsKICAgIH0oZHJhZ0JveExheWVyLkRyYWdCb3hMYXllcikpOwogICAgZXhwb3J0cy5YRHJhZ0JveExheWVyID0gWERyYWdCb3hMYXllcjsKICAgIH0pOwoKICAgIHZhciB5RHJhZ0JveExheWVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKICAgIHZhciBZRHJhZ0JveExheWVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoWURyYWdCb3hMYXllciwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBBIFlEcmFnQm94TGF5ZXIgaXMgYSBEcmFnQm94TGF5ZXIgd2hvc2Ugc2l6ZSBjYW4gb25seSBiZSBzZXQgaW4gdGhlIFktZGlyZWN0aW9uLgogICAgICAgICAqIFRoZSB4LXZhbHVlcyBvZiB0aGUgYm91bmRzKCkgYXJlIGFsd2F5cyBzZXQgdG8gMCBhbmQgdGhlIHdpZHRoKCkgb2YgdGhlIFlEcmFnQm94TGF5ZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBZRHJhZ0JveExheWVyKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygieS1kcmFnLWJveC1sYXllciIpOwogICAgICAgICAgICBfdGhpcy5faGFzQ29ybmVycyA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIFlEcmFnQm94TGF5ZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQgPSBmdW5jdGlvbiAob3JpZ2luLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsIG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7CiAgICAgICAgICAgIC8vIHNldCBjb3JyZWN0IGJvdW5kcyB3aGVuIHdpZHRoL2hlaWdodCBjaGFuZ2VzCiAgICAgICAgICAgIHRoaXMuX3NldEJvdW5kcyh0aGlzLmJvdW5kcygpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBZRHJhZ0JveExheWVyLnByb3RvdHlwZS5fc2V0Qm91bmRzID0gZnVuY3Rpb24gKG5ld0JvdW5kcykgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXRCb3VuZHMuY2FsbCh0aGlzLCB7CiAgICAgICAgICAgICAgICB0b3BMZWZ0OiB7IHg6IDAsIHk6IG5ld0JvdW5kcy50b3BMZWZ0LnkgfSwKICAgICAgICAgICAgICAgIGJvdHRvbVJpZ2h0OiB7IHg6IHRoaXMud2lkdGgoKSwgeTogbmV3Qm91bmRzLmJvdHRvbVJpZ2h0LnkgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBZRHJhZ0JveExheWVyLnByb3RvdHlwZS5fc2V0UmVzaXphYmxlQ2xhc3NlcyA9IGZ1bmN0aW9uIChjYW5SZXNpemUpIHsKICAgICAgICAgICAgaWYgKGNhblJlc2l6ZSAmJiB0aGlzLmVuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgdGhpcy5hZGRDbGFzcygieS1yZXNpemFibGUiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlQ2xhc3MoInktcmVzaXphYmxlIik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFlEcmFnQm94TGF5ZXIucHJvdG90eXBlLnhTY2FsZSA9IGZ1bmN0aW9uICh4U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHhTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS54U2NhbGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoInhTY2FsZXMgY2Fubm90IGJlIHNldCBvbiBhbiBZRHJhZ0JveExheWVyIik7CiAgICAgICAgfTsKICAgICAgICBZRHJhZ0JveExheWVyLnByb3RvdHlwZS54RXh0ZW50ID0gZnVuY3Rpb24gKHhFeHRlbnQpIHsKICAgICAgICAgICAgaWYgKHhFeHRlbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUueEV4dGVudC5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiWURyYWdCb3hMYXllciBoYXMgbm8geEV4dGVudCIpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIFlEcmFnQm94TGF5ZXI7CiAgICB9KGRyYWdCb3hMYXllci5EcmFnQm94TGF5ZXIpKTsKICAgIGV4cG9ydHMuWURyYWdCb3hMYXllciA9IFlEcmFnQm94TGF5ZXI7CiAgICB9KTsKCiAgICB2YXIgY29tcG9uZW50cyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZHJhZ0JveExheWVyLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZHJhZ0xpbmVMYXllciwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGdyaWRsaW5lcywgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGdyb3VwLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZ3VpZGVMaW5lTGF5ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihpbnRlcnBvbGF0ZWRDb2xvckxlZ2VuZCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGxhYmVsLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIobGVnZW5kLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIocGxvdEdyb3VwLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoc2VsZWN0aW9uQm94TGF5ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3Rhcih0YWJsZSwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHdyYXBwZWRMYWJlbCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHhEcmFnQm94TGF5ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3Rhcih5RHJhZ0JveExheWVyLCBleHBvcnRzKTsKICAgIH0pOwoKICAgIHZhciBhcmNEcmF3ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgdmFyIEFyY1NWR0RyYXdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKEFyY1NWR0RyYXdlciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBBcmNTVkdEcmF3ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAicGF0aCIsICJhcmMgZmlsbCIpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIEFyY1NWR0RyYXdlci5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbi5zdHlsZSgic3Ryb2tlIiwgIm5vbmUiKTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBBcmNTVkdEcmF3ZXI7CiAgICB9KHN2Z0RyYXdlci5TVkdEcmF3ZXIpKTsKICAgIGV4cG9ydHMuQXJjU1ZHRHJhd2VyID0gQXJjU1ZHRHJhd2VyOwogICAgfSk7CgogICAgdmFyIGFyY091dGxpbmVEcmF3ZXIgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgogICAgdmFyIEFyY091dGxpbmVTVkdEcmF3ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhBcmNPdXRsaW5lU1ZHRHJhd2VyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIEFyY091dGxpbmVTVkdEcmF3ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAicGF0aCIsICJhcmMgb3V0bGluZSIpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIEFyY091dGxpbmVTVkdEcmF3ZXIucHJvdG90eXBlLl9hcHBseURlZmF1bHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKHNlbGVjdGlvbikgewogICAgICAgICAgICBzZWxlY3Rpb24uc3R5bGUoImZpbGwiLCAibm9uZSIpOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEFyY091dGxpbmVTVkdEcmF3ZXI7CiAgICB9KHN2Z0RyYXdlci5TVkdEcmF3ZXIpKTsKICAgIGV4cG9ydHMuQXJjT3V0bGluZVNWR0RyYXdlciA9IEFyY091dGxpbmVTVkdEcmF3ZXI7CiAgICB9KTsKCiAgICB2YXIgYXJlYURyYXdlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgogICAgdmFyIEFyZWFTVkdEcmF3ZXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhBcmVhU1ZHRHJhd2VyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIEFyZWFTVkdEcmF3ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAicGF0aCIsICJhcmVhIikgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgQXJlYVNWR0RyYXdlci5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdEF0dHJpYnV0ZXMgPSBmdW5jdGlvbiAoc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbi5zdHlsZSgic3Ryb2tlIiwgIm5vbmUiKTsKICAgICAgICB9OwogICAgICAgIEFyZWFTVkdEcmF3ZXIucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgLy8gYXJlYXMgYXJlIHJlcHJlc2VudGVkIGJ5IG9uZSBzaW5nbGUgZWxlbWVudDsgYWx3YXlzIGdldCB0aGF0IGVsZW1lbnQKICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiB0aGUgZGF0YSBpbmRleC4KICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsIDApOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIEFyZWFTVkdEcmF3ZXI7CiAgICB9KHN2Z0RyYXdlci5TVkdEcmF3ZXIpKTsKICAgIGV4cG9ydHMuQXJlYVNWR0RyYXdlciA9IEFyZWFTVkdEcmF3ZXI7CiAgICB2YXIgQVJFQV9GSUxMX0FUVFJTID0gWyJvcGFjaXR5IiwgImZpbGwiLCAiZmlsbC1vcGFjaXR5Il07CiAgICB2YXIgQVJFQV9TVFJPS0VfQVRUUlMgPSBbIm9wYWNpdHkiLCAic3Ryb2tlIiwgInN0cm9rZS13aWR0aCJdOwogICAgZnVuY3Rpb24gbWFrZUFyZWFDYW52YXNEcmF3U3RlcChkM0FyZWFGYWN0b3J5LCBkM0xpbmVGYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBkYXRhLCBwcm9qZWN0b3IpIHsKICAgICAgICAgICAgdmFyIGZpbGxBdHRycyA9IGNhbnZhc0RyYXdlci5yZXNvbHZlQXR0cmlidXRlcyhwcm9qZWN0b3IsIEFSRUFfRklMTF9BVFRSUywgZGF0YVswXSwgMCk7CiAgICAgICAgICAgIGNhbnZhc0RyYXdlci5yZW5kZXJBcmVhKGNvbnRleHQsIGQzQXJlYUZhY3RvcnkoKSwgZGF0YVswXSwgZmlsbEF0dHJzKTsKICAgICAgICAgICAgdmFyIHN0cm9rZUF0dHJzID0gY2FudmFzRHJhd2VyLnJlc29sdmVBdHRyaWJ1dGVzKHByb2plY3RvciwgQVJFQV9TVFJPS0VfQVRUUlMsIGRhdGFbMF0sIDApOwogICAgICAgICAgICBjYW52YXNEcmF3ZXIucmVuZGVyTGluZShjb250ZXh0LCBkM0xpbmVGYWN0b3J5KCksIGRhdGFbMF0sIHN0cm9rZUF0dHJzKTsKICAgICAgICB9OwogICAgfQogICAgZXhwb3J0cy5tYWtlQXJlYUNhbnZhc0RyYXdTdGVwID0gbWFrZUFyZWFDYW52YXNEcmF3U3RlcDsKICAgIH0pOwoKICAgIHZhciBsaW5lRHJhd2VyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCiAgICB2YXIgTGluZVNWR0RyYXdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKExpbmVTVkdEcmF3ZXIsIF9zdXBlcik7CiAgICAgICAgZnVuY3Rpb24gTGluZVNWR0RyYXdlcigpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsICJwYXRoIiwgImxpbmUiKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICBMaW5lU1ZHRHJhd2VyLnByb3RvdHlwZS5fYXBwbHlEZWZhdWx0QXR0cmlidXRlcyA9IGZ1bmN0aW9uIChzZWxlY3Rpb24pIHsKICAgICAgICAgICAgc2VsZWN0aW9uLnN0eWxlKCJmaWxsIiwgIm5vbmUiKTsKICAgICAgICB9OwogICAgICAgIExpbmVTVkdEcmF3ZXIucHJvdG90eXBlLmdldFZpc3VhbFByaW1pdGl2ZUF0SW5kZXggPSBmdW5jdGlvbiAoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleC5jYWxsKHRoaXMsIDApOwogICAgICAgIH07CiAgICAgICAgcmV0dXJuIExpbmVTVkdEcmF3ZXI7CiAgICB9KHN2Z0RyYXdlci5TVkdEcmF3ZXIpKTsKICAgIGV4cG9ydHMuTGluZVNWR0RyYXdlciA9IExpbmVTVkdEcmF3ZXI7CiAgICB2YXIgTElORV9BVFRSSUJVVEVTID0gWwogICAgICAgICJvcGFjaXR5IiwKICAgICAgICAic3Ryb2tlLW9wYWNpdHkiLAogICAgICAgICJzdHJva2Utd2lkdGgiLAogICAgICAgICJzdHJva2UiLAogICAgICAgICJzdHJva2UtZGFzaGFycmF5IiwKICAgIF07CiAgICAvKioKICAgICAqIEBwYXJhbSBkM0xpbmVGYWN0b3J5IEEgY2FsbGJhY2sgdGhhdCBnaXZlcyB0aGlzIExpbmUgRHJhd2VyIGEgZDMuTGluZSBvYmplY3Qgd2hpY2ggd2lsbCBiZQogICAgICogdXNlZCB0byBkcmF3IHdpdGguCiAgICAgKgogICAgICogVE9ETyBwdXQgdGhlIGQzLkxpbmUgaW50byB0aGUgYXR0clRvQXBwbGllZFByb2plY3RvciBkaXJlY3RseQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlTGluZUNhbnZhc0RyYXdTdGVwKGQzTGluZUZhY3RvcnkpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGNvbnRleHQsIGRhdGEsIGF0dHJUb0FwcGxpZWRQcm9qZWN0b3IpIHsKICAgICAgICAgICAgdmFyIGxpbmVTdHlsZSA9IGNhbnZhc0RyYXdlci5yZXNvbHZlQXR0cmlidXRlcyhhdHRyVG9BcHBsaWVkUHJvamVjdG9yLCBMSU5FX0FUVFJJQlVURVMsIGRhdGFbMF0sIDApOwogICAgICAgICAgICBjYW52YXNEcmF3ZXIucmVuZGVyTGluZShjb250ZXh0LCBkM0xpbmVGYWN0b3J5KCksIGRhdGFbMF0sIGxpbmVTdHlsZSk7CiAgICAgICAgfTsKICAgIH0KICAgIGV4cG9ydHMubWFrZUxpbmVDYW52YXNEcmF3U3RlcCA9IG1ha2VMaW5lQ2FudmFzRHJhd1N0ZXA7CiAgICB9KTsKCiAgICB2YXIgcmVjdGFuZ2xlRHJhd2VyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCiAgICB2YXIgUmVjdGFuZ2xlU1ZHRHJhd2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUmVjdGFuZ2xlU1ZHRHJhd2VyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIFJlY3RhbmdsZVNWR0RyYXdlcihfcm9vdENsYXNzTmFtZSkgewogICAgICAgICAgICBpZiAoX3Jvb3RDbGFzc05hbWUgPT09IHZvaWQgMCkgeyBfcm9vdENsYXNzTmFtZSA9ICIiOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsICJyZWN0IiwgIiIpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9yb290Q2xhc3NOYW1lID0gX3Jvb3RDbGFzc05hbWU7CiAgICAgICAgICAgIF90aGlzLl9yb290LmNsYXNzZWQoX3RoaXMuX3Jvb3RDbGFzc05hbWUsIHRydWUpOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBSZWN0YW5nbGVTVkdEcmF3ZXI7CiAgICB9KHN2Z0RyYXdlci5TVkdEcmF3ZXIpKTsKICAgIGV4cG9ydHMuUmVjdGFuZ2xlU1ZHRHJhd2VyID0gUmVjdGFuZ2xlU1ZHRHJhd2VyOwogICAgdmFyIFJFQ1RfQVRUUlMgPSBjYW52YXNEcmF3ZXIuQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KFsieCIsICJ5IiwgIndpZHRoIiwgImhlaWdodCJdKTsKICAgIGV4cG9ydHMuUmVjdGFuZ2xlQ2FudmFzRHJhd1N0ZXAgPSBmdW5jdGlvbiAoY29udGV4dCwgZGF0YSwgcHJvamVjdG9yKSB7CiAgICAgICAgY29udGV4dC5zYXZlKCk7CiAgICAgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZGF0YUxlbjsgaW5kZXgrKykgewogICAgICAgICAgICB2YXIgZGF0dW0gPSBkYXRhW2luZGV4XTsKICAgICAgICAgICAgaWYgKGRhdHVtID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBhdHRycyA9IGNhbnZhc0RyYXdlci5yZXNvbHZlQXR0cmlidXRlcyhwcm9qZWN0b3IsIFJFQ1RfQVRUUlMsIGRhdHVtLCBpbmRleCk7CiAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7CiAgICAgICAgICAgIGNvbnRleHQucmVjdChhdHRyc1sieCJdLCBhdHRyc1sieSJdLCBhdHRyc1sid2lkdGgiXSwgYXR0cnNbImhlaWdodCJdKTsKICAgICAgICAgICAgY2FudmFzRHJhd2VyLnJlbmRlclBhdGhXaXRoU3R5bGUoY29udGV4dCwgYXR0cnMpOwogICAgICAgIH0KICAgICAgICBjb250ZXh0LnJlc3RvcmUoKTsKICAgIH07CiAgICB2YXIgUmVjdGFuZ2xlQ2FudmFzRHJhd2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoUmVjdGFuZ2xlQ2FudmFzRHJhd2VyLCBfc3VwZXIpOwogICAgICAgIGZ1bmN0aW9uIFJlY3RhbmdsZUNhbnZhc0RyYXdlcihjdHgpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsIGN0eCwgZXhwb3J0cy5SZWN0YW5nbGVDYW52YXNEcmF3U3RlcCkgfHwgdGhpczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIFJlY3RhbmdsZUNhbnZhc0RyYXdlcjsKICAgIH0oY2FudmFzRHJhd2VyLkNhbnZhc0RyYXdlcikpOwogICAgZXhwb3J0cy5SZWN0YW5nbGVDYW52YXNEcmF3ZXIgPSBSZWN0YW5nbGVDYW52YXNEcmF3ZXI7CiAgICB9KTsKCiAgICB2YXIgc2VnbWVudERyYXdlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCiAgICB2YXIgU2VnbWVudFNWR0RyYXdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFNlZ21lbnRTVkdEcmF3ZXIsIF9zdXBlcik7CiAgICAgICAgZnVuY3Rpb24gU2VnbWVudFNWR0RyYXdlcigpIHsKICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5jYWxsKHRoaXMsICJsaW5lIiwgIiIpIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBTZWdtZW50U1ZHRHJhd2VyOwogICAgfShzdmdEcmF3ZXIuU1ZHRHJhd2VyKSk7CiAgICBleHBvcnRzLlNlZ21lbnRTVkdEcmF3ZXIgPSBTZWdtZW50U1ZHRHJhd2VyOwogICAgfSk7CgogICAgdmFyIGNhbnZhc0J1ZmZlciA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTctcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgdmFyIENhbnZhc0J1ZmZlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICBmdW5jdGlvbiBDYW52YXNCdWZmZXIoc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCwgZGV2aWNlUGl4ZWxSYXRpbykgewogICAgICAgICAgICBpZiAoZGV2aWNlUGl4ZWxSYXRpbyA9PT0gdm9pZCAwKSB7IGRldmljZVBpeGVsUmF0aW8gPSB3aW5kb3cuZGV2aWNlUGl4ZWxSYXRpbzsgfQogICAgICAgICAgICB0aGlzLnNjcmVlbldpZHRoID0gc2NyZWVuV2lkdGg7CiAgICAgICAgICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0OwogICAgICAgICAgICB0aGlzLmRldmljZVBpeGVsUmF0aW8gPSBkZXZpY2VQaXhlbFJhdGlvOwogICAgICAgICAgICB0aGlzLnBpeGVsV2lkdGggPSBzY3JlZW5XaWR0aCAqIGRldmljZVBpeGVsUmF0aW87CiAgICAgICAgICAgIHRoaXMucGl4ZWxIZWlnaHQgPSBzY3JlZW5IZWlnaHQgKiBkZXZpY2VQaXhlbFJhdGlvOwogICAgICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImNhbnZhcyIpOwogICAgICAgICAgICB0aGlzLmN0eCA9IHRoaXMuY2FudmFzLmdldENvbnRleHQoIjJkIik7CiAgICAgICAgICAgIENhbnZhc0J1ZmZlci5zaXplUGl4ZWxzKHRoaXMuY3R4LCBzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0LCBkZXZpY2VQaXhlbFJhdGlvKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzaXplcyB0aGUgY2FudmFzJyBpbnRlcm5hbCBwaXhlbCBidWZmZXIgdG8gbWF0Y2ggdGhlIGRldmljZVBpeGVsUmF0aW8KICAgICAgICAgKi8KICAgICAgICBDYW52YXNCdWZmZXIuc2l6ZVBpeGVscyA9IGZ1bmN0aW9uIChjdHgsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQsIGRldmljZVBpeGVsUmF0aW8pIHsKICAgICAgICAgICAgdmFyIGNhbnZhcyA9IGN0eC5jYW52YXM7CiAgICAgICAgICAgIGNhbnZhcy53aWR0aCA9IHNjcmVlbldpZHRoICogZGV2aWNlUGl4ZWxSYXRpbzsKICAgICAgICAgICAgY2FudmFzLmhlaWdodCA9IHNjcmVlbkhlaWdodCAqIGRldmljZVBpeGVsUmF0aW87CiAgICAgICAgICAgIGNhbnZhcy5zdHlsZS53aWR0aCA9IHNjcmVlbldpZHRoICsgInB4IjsKICAgICAgICAgICAgY2FudmFzLnN0eWxlLmhlaWdodCA9IHNjcmVlbkhlaWdodCArICJweCI7CiAgICAgICAgICAgIGN0eC5zZXRUcmFuc2Zvcm0oMSwgMCwgMCwgMSwgMCwgMCk7CiAgICAgICAgICAgIGN0eC5zY2FsZShkZXZpY2VQaXhlbFJhdGlvLCBkZXZpY2VQaXhlbFJhdGlvKTsKICAgICAgICB9OwogICAgICAgIENhbnZhc0J1ZmZlci5wcm90b3R5cGUuYmxpdCA9IGZ1bmN0aW9uIChjdHgsIHgsIHkpIHsKICAgICAgICAgICAgaWYgKHggPT09IHZvaWQgMCkgeyB4ID0gMDsgfQogICAgICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSAwOyB9CiAgICAgICAgICAgIGN0eC5kcmF3SW1hZ2UodGhpcy5jYW52YXMsIHgsIHksIHRoaXMuc2NyZWVuV2lkdGgsIHRoaXMuc2NyZWVuSGVpZ2h0KTsKICAgICAgICB9OwogICAgICAgIENhbnZhc0J1ZmZlci5wcm90b3R5cGUuYmxpdENlbnRlciA9IGZ1bmN0aW9uIChjdHgsIHgsIHkpIHsKICAgICAgICAgICAgaWYgKHggPT09IHZvaWQgMCkgeyB4ID0gMDsgfQogICAgICAgICAgICBpZiAoeSA9PT0gdm9pZCAwKSB7IHkgPSAwOyB9CiAgICAgICAgICAgIHRoaXMuYmxpdChjdHgsIE1hdGguZmxvb3IoeCAtIHRoaXMuc2NyZWVuV2lkdGggLyAyKSwgTWF0aC5mbG9vcih5IC0gdGhpcy5zY3JlZW5IZWlnaHQgLyAyKSk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBDaGFuZ2VzIHRoZSBzaXplIG9mIHRoZSB1bmRlcmx5aW5nIGNhbnZhcyBpbiBzY3JlZW4gc3BhY2UsIHJlc3BlY3RpbmcgdGhlCiAgICAgICAgICogY3VycmVudCBkZXZpY2VQaXhlbFJhdGlvLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGNlbnRlciAtIG9wdGlvbmFsbHkgZW5hYmxlIGEgdHJhbnNsYXRlIHRyYW5zZm9ybWF0aW9uIG1vdmluZyB0aGUKICAgICAgICAgKiAgICAgICAgICAgICAgICAgb3JpZ2luIHRvIHRoZSBjZW50ZXIgb2YgdGhlIGNhbnZhcy4KICAgICAgICAgKi8KICAgICAgICBDYW52YXNCdWZmZXIucHJvdG90eXBlLnJlc2l6ZSA9IGZ1bmN0aW9uIChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0LCBjZW50ZXIpIHsKICAgICAgICAgICAgaWYgKGNlbnRlciA9PT0gdm9pZCAwKSB7IGNlbnRlciA9IGZhbHNlOyB9CiAgICAgICAgICAgIHZhciBkZXZpY2VQaXhlbFJhdGlvID0gdGhpcy5kZXZpY2VQaXhlbFJhdGlvOwogICAgICAgICAgICB0aGlzLnNjcmVlbldpZHRoID0gc2NyZWVuV2lkdGg7CiAgICAgICAgICAgIHRoaXMuc2NyZWVuSGVpZ2h0ID0gc2NyZWVuSGVpZ2h0OwogICAgICAgICAgICB0aGlzLnBpeGVsV2lkdGggPSBzY3JlZW5XaWR0aCAqIGRldmljZVBpeGVsUmF0aW87CiAgICAgICAgICAgIHRoaXMucGl4ZWxIZWlnaHQgPSBzY3JlZW5IZWlnaHQgKiBkZXZpY2VQaXhlbFJhdGlvOwogICAgICAgICAgICBDYW52YXNCdWZmZXIuc2l6ZVBpeGVscyh0aGlzLmN0eCwgc2NyZWVuV2lkdGgsIHNjcmVlbkhlaWdodCwgZGV2aWNlUGl4ZWxSYXRpbyk7CiAgICAgICAgICAgIGlmIChjZW50ZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuY3R4LnRyYW5zbGF0ZShzY3JlZW5XaWR0aCAvIDIsIHNjcmVlbldpZHRoIC8gMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUZW1wb3JhcmlseSByZXNldHMgdGhlIGN1cnJlbnQgY29udGV4dCB0cmFuc2Zvcm1hdGlvbiBhbmQgZmlsbHMgdGhlCiAgICAgICAgICogZW50aXJlIGNhbnZhcyB3aXRoIHRoZSBwcm92aWRlZCBjb2xvci4gSWYgbm8gY29sb3IgaXMgcHJvdmlkZWQsIHRoZQogICAgICAgICAqIGNhbnZhcyBpcyBjbGVhcmVkIGluc3RlYWQuCiAgICAgICAgICovCiAgICAgICAgQ2FudmFzQnVmZmVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uIChjb2xvcikgewogICAgICAgICAgICB2YXIgX2EgPSB0aGlzLCBwaXhlbFdpZHRoID0gX2EucGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQgPSBfYS5waXhlbEhlaWdodCwgY3R4ID0gX2EuY3R4OwogICAgICAgICAgICBjdHguc2F2ZSgpOwogICAgICAgICAgICBjdHguc2V0VHJhbnNmb3JtKDEsIDAsIDAsIDEsIDAsIDApOwogICAgICAgICAgICBpZiAoY29sb3IgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgY3R4LmNsZWFyUmVjdCgwLCAwLCBwaXhlbFdpZHRoLCBwaXhlbEhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjdHguZmlsbFN0eWxlID0gY29sb3I7CiAgICAgICAgICAgICAgICBjdHguZmlsbFJlY3QoMCwgMCwgcGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN0eC5yZXN0b3JlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQ2FudmFzQnVmZmVyLnByb3RvdHlwZS5nZXRJbWFnZURhdGEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmN0eC5nZXRJbWFnZURhdGEoMCwgMCwgdGhpcy5waXhlbFdpZHRoLCB0aGlzLnBpeGVsSGVpZ2h0KTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBDYW52YXNCdWZmZXI7CiAgICB9KCkpOwogICAgZXhwb3J0cy5DYW52YXNCdWZmZXIgPSBDYW52YXNCdWZmZXI7CiAgICB9KTsKCiAgICB2YXIgc3ltYm9sRHJhd2VyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgogICAgdmFyIFN5bWJvbFNWR0RyYXdlciA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFN5bWJvbFNWR0RyYXdlciwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBTeW1ib2xTVkdEcmF3ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIuY2FsbCh0aGlzLCAicGF0aCIsICJzeW1ib2wiKSB8fCB0aGlzOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU3ltYm9sU1ZHRHJhd2VyOwogICAgfShzdmdEcmF3ZXIuU1ZHRHJhd2VyKSk7CiAgICBleHBvcnRzLlN5bWJvbFNWR0RyYXdlciA9IFN5bWJvbFNWR0RyYXdlcjsKICAgIHZhciBTWU1CT0xfQVRUUlMgPSBjYW52YXNEcmF3ZXIuQ29udGV4dFN0eWxlQXR0cnMuY29uY2F0KFsieCIsICJ5Il0pOwogICAgZnVuY3Rpb24gbWFrZVN5bWJvbENhbnZhc0RyYXdTdGVwKGRhdGFzZXQsIHN5bWJvbFByb2plY3Rvciwgc2l6ZVByb2plY3Rvciwgc3RlcEJ1ZmZlcikgewogICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChjb250ZXh0LCBkYXRhLCBhdHRyVG9BcHBsaWVkUHJvamVjdG9yKSB7CiAgICAgICAgICAgIHZhciBfYSA9IGNvbnRleHQuY2FudmFzLCBjbGllbnRXaWR0aCA9IF9hLmNsaWVudFdpZHRoLCBjbGllbnRIZWlnaHQgPSBfYS5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIHZhciBidWZmZXIgPSAoc3RlcEJ1ZmZlciA9PT0gdW5kZWZpbmVkKSA/IG5ldyBjYW52YXNCdWZmZXIuQ2FudmFzQnVmZmVyKDAsIDApIDogc3RlcEJ1ZmZlcjsKICAgICAgICAgICAgdmFyIHN5bWJvbEFjY2Vzc29yID0gc3ltYm9sUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHZhciBzaXplQWNjZXNzb3IgPSBzaXplUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHZhciBwcmV2QXR0cnMgPSBudWxsOwogICAgICAgICAgICB2YXIgcHJldlN5bWJvbEdlbmVyYXRvciA9IG51bGw7CiAgICAgICAgICAgIHZhciBwcmV2U3ltYm9sU2l6ZSA9IG51bGw7CiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBkYXRhLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgdmFyIGRhdHVtID0gZGF0YVtpbmRleF07CiAgICAgICAgICAgICAgICBpZiAoZGF0dW0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gY2hlY2sgc3ltYm9sIGlzIGluIHZpZXdwb3J0CiAgICAgICAgICAgICAgICB2YXIgYXR0cnMgPSBjYW52YXNEcmF3ZXIucmVzb2x2ZUF0dHJpYnV0ZXMoYXR0clRvQXBwbGllZFByb2plY3RvciwgU1lNQk9MX0FUVFJTLCBkYXR1bSwgaW5kZXgpOwogICAgICAgICAgICAgICAgdmFyIHN5bWJvbFNpemUgPSBzaXplQWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmICghc3F1YXJlT3ZlcmxhcHNCb3VuZHMoY2xpZW50V2lkdGgsIGNsaWVudEhlaWdodCwgYXR0cnNbIngiXSwgYXR0cnNbInkiXSwgc3ltYm9sU2l6ZSkpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGNoZWNrIGF0dHJpYnV0ZXMgYW5kIHN5bWJvbCB0eXBlCiAgICAgICAgICAgICAgICB2YXIgYXR0cnNTYW1lID0gaXNBdHRyaWJ1dGVWYWx1ZXNFcXVhbChwcmV2QXR0cnMsIGF0dHJzLCBjYW52YXNEcmF3ZXIuQ29udGV4dFN0eWxlQXR0cnMpOwogICAgICAgICAgICAgICAgdmFyIHN5bWJvbEdlbmVyYXRvciA9IHN5bWJvbEFjY2Vzc29yKGRhdHVtLCBpbmRleCwgX3RoaXMuX2RhdGFzZXQpOwogICAgICAgICAgICAgICAgaWYgKGF0dHJzU2FtZSAmJiBwcmV2U3ltYm9sU2l6ZSA9PSBzeW1ib2xTaXplICYmIHByZXZTeW1ib2xHZW5lcmF0b3IgPT0gc3ltYm9sR2VuZXJhdG9yKSA7CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHJvb20gZm9yIGJpZ2dlciBzeW1ib2wgaWYgbmVlZGVkCiAgICAgICAgICAgICAgICAgICAgdmFyIHN0cm9rZVdpZHRoID0gY2FudmFzRHJhd2VyLmdldFN0cm9rZVdpZHRoKGF0dHJzKTsKICAgICAgICAgICAgICAgICAgICAvLyArMSB0byBhY2NvdW50IGZvciBzdWJwaXhlbCBhbGlhc2luZwogICAgICAgICAgICAgICAgICAgIHZhciB3YW50ZWRCdWZmZXJTaXplID0gc3ltYm9sU2l6ZSArIHN0cm9rZVdpZHRoICsgMTsKICAgICAgICAgICAgICAgICAgICBpZiAod2FudGVkQnVmZmVyU2l6ZSA+IGJ1ZmZlci5zY3JlZW5XaWR0aCB8fCB3YW50ZWRCdWZmZXJTaXplID4gYnVmZmVyLnNjcmVlbkhlaWdodCkgewogICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIucmVzaXplKHdhbnRlZEJ1ZmZlclNpemUsIHdhbnRlZEJ1ZmZlclNpemUsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBkcmF3IGFjdHVhbCBzeW1ib2wgaW50byBidWZmZXIKICAgICAgICAgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICB2YXIgYnVmZmVyQ3R4ID0gYnVmZmVyLmN0eDsKICAgICAgICAgICAgICAgICAgICBidWZmZXJDdHguYmVnaW5QYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgc3ltYm9sR2VuZXJhdG9yKHN5bWJvbFNpemUpLmNvbnRleHQoYnVmZmVyQ3R4KShudWxsKTsKICAgICAgICAgICAgICAgICAgICBidWZmZXJDdHguY2xvc2VQYXRoKCk7CiAgICAgICAgICAgICAgICAgICAgY2FudmFzRHJhd2VyLnJlbmRlclBhdGhXaXRoU3R5bGUoYnVmZmVyQ3R4LCBhdHRycyk7CiAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSB0aGUgdmFsdWVzIHRoYXQgYXJlIGluIHRoZSBidWZmZXIKICAgICAgICAgICAgICAgICAgICBwcmV2U3ltYm9sR2VuZXJhdG9yID0gc3ltYm9sR2VuZXJhdG9yOwogICAgICAgICAgICAgICAgICAgIHByZXZTeW1ib2xTaXplID0gc3ltYm9sU2l6ZTsKICAgICAgICAgICAgICAgICAgICBwcmV2QXR0cnMgPSBhdHRyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGJsaXQgdGhlIGJ1ZmZlciB0byB0aGUgY2FudmFzCiAgICAgICAgICAgICAgICBidWZmZXIuYmxpdENlbnRlcihjb250ZXh0LCBhdHRyc1sieCJdLCBhdHRyc1sieSJdKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICBleHBvcnRzLm1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcCA9IG1ha2VTeW1ib2xDYW52YXNEcmF3U3RlcDsKICAgIGZ1bmN0aW9uIHNxdWFyZU92ZXJsYXBzQm91bmRzKHdpZHRoLCBoZWlnaHQsIHgsIHksIHNpemUpIHsKICAgICAgICByZXR1cm4gKHggKyBzaXplID49IDAgJiYgeCAtIHNpemUgPD0gd2lkdGggJiYKICAgICAgICAgICAgeSArIHNpemUgPj0gMCAmJiB5IC0gc2l6ZSA8PSBoZWlnaHQpOwogICAgfQogICAgZnVuY3Rpb24gaXNBdHRyaWJ1dGVWYWx1ZXNFcXVhbChwcmV2QXR0cnMsIGF0dHJzLCBhdHRyS2V5cykgewogICAgICAgIGlmIChwcmV2QXR0cnMgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXR0cktleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgdmFyIGF0dHJLZXkgPSBhdHRyS2V5c1tpXTsKICAgICAgICAgICAgaWYgKHByZXZBdHRyc1thdHRyS2V5XSAhPSBhdHRyc1thdHRyS2V5XSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgfSk7CgogICAgdmFyIGRyYXdlcnMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGFyY0RyYXdlciwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGFyY091dGxpbmVEcmF3ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihhcmVhRHJhd2VyLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoY2FudmFzRHJhd2VyLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZHJhd2VyLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIobGluZURyYXdlciwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHJlY3RhbmdsZURyYXdlciwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHNlZ21lbnREcmF3ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihzdmdEcmF3ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihzeW1ib2xEcmF3ZXIsIGV4cG9ydHMpOwogICAgfSk7CgogICAgdmFyIHh5UGxvdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCiAgICB2YXIgWFlQbG90ID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoWFlQbG90LCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEFuIFhZUGxvdCBpcyBhIFBsb3QgdGhhdCBkaXNwbGF5cyBkYXRhIGFsb25nIHR3byBwcmltYXJ5IGRpcmVjdGlvbnMsIFggYW5kIFkuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlfSB4U2NhbGUgVGhlIHggc2NhbGUgdG8gdXNlLgogICAgICAgICAqIEBwYXJhbSB7U2NhbGV9IHlTY2FsZSBUaGUgeSBzY2FsZSB0byB1c2UuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gWFlQbG90KCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbiA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmcgPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuX2FwcGx5RGVmZXJyZWRSZW5kZXJpbmdUcmFuc2Zvcm0gPSBmdW5jdGlvbiAodHgsIHR5LCBzeCwgc3kpIHsKICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX2lzQW5jaG9yZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuX3JlbmRlckFyZWEgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIF90aGlzLl9yZW5kZXJBcmVhLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHR4ICsgIiwgIiArIHR5ICsgIikgc2NhbGUoIiArIHN4ICsgIiwgIiArIHN5ICsgIikiKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fY2FudmFzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fY2FudmFzLnN0eWxlKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB0eCArICJweCwgIiArIHR5ICsgInB4KSBzY2FsZSgiICsgc3ggKyAiLCAiICsgc3kgKyAiKSIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygieHktcGxvdCIpOwogICAgICAgICAgICBfdGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjayA9IGZ1bmN0aW9uIChzY2FsZSkgeyByZXR1cm4gX3RoaXMuX2FkanVzdFlEb21haW5PbkNoYW5nZUZyb21YKCk7IH07CiAgICAgICAgICAgIF90aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrID0gZnVuY3Rpb24gKHNjYWxlKSB7IHJldHVybiBfdGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTsgfTsKICAgICAgICAgICAgX3RoaXMuX3JlbmRlckNhbGxiYWNrID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKF90aGlzLmRlZmVycmVkUmVuZGVyaW5nKCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGVYID0gX3RoaXMueCgpICYmIF90aGlzLngoKS5zY2FsZTsKICAgICAgICAgICAgICAgICAgICB2YXIgc2NhbGVZID0gX3RoaXMueSgpICYmIF90aGlzLnkoKS5zY2FsZTsKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZGVmZXJyZWRSZW5kZXJlci51cGRhdGVEb21haW5zKHNjYWxlWCwgc2NhbGVZKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIF90aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBfdGhpcy5fZGVmZXJyZWRSZW5kZXJlciA9IG5ldyBkZWZlcnJlZFJlbmRlcmVyLkRlZmVycmVkUmVuZGVyZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucmVuZGVyKCk7IH0sIF90aGlzLl9hcHBseURlZmVycmVkUmVuZGVyaW5nVHJhbnNmb3JtKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBYWVBsb3QucHJvdG90eXBlLnJlbmRlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGVmZXJyZWRSZW5kZXJpbmcoKSkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRSZW5kZXJlci5yZXNldFRyYW5zZm9ybXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5yZW5kZXIuY2FsbCh0aGlzKTsKICAgICAgICB9OwogICAgICAgIFhZUGxvdC5wcm90b3R5cGUuZGVmZXJyZWRSZW5kZXJpbmcgPSBmdW5jdGlvbiAoZGVmZXJyZWRSZW5kZXJpbmcpIHsKICAgICAgICAgICAgaWYgKGRlZmVycmVkUmVuZGVyaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZlcnJlZFJlbmRlcmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGVmZXJyZWRSZW5kZXJpbmcpIHsKICAgICAgICAgICAgICAgIHZhciBzY2FsZVggPSB0aGlzLngoKSAmJiB0aGlzLngoKS5zY2FsZTsKICAgICAgICAgICAgICAgIHZhciBzY2FsZVkgPSB0aGlzLnkoKSAmJiB0aGlzLnkoKS5zY2FsZTsKICAgICAgICAgICAgICAgIHRoaXMuX2RlZmVycmVkUmVuZGVyZXIuc2V0RG9tYWlucyhzY2FsZVgsIHNjYWxlWSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGVmZXJyZWRSZW5kZXJpbmcgPSBkZWZlcnJlZFJlbmRlcmluZzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLnggPSBmdW5jdGlvbiAoeCwgeFNjYWxlLCBwb3N0U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFhZUGxvdC5fWF9LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShYWVBsb3QuX1hfS0VZLCB4LCB4U2NhbGUsIHBvc3RTY2FsZSk7CiAgICAgICAgICAgIHZhciB3aWR0aCA9IHRoaXMud2lkdGgoKTsKICAgICAgICAgICAgaWYgKHhTY2FsZSAhPSBudWxsICYmIHdpZHRoICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHhTY2FsZS5yYW5nZShbMCwgd2lkdGhdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbikgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLnkgPSBmdW5jdGlvbiAoeSwgeVNjYWxlLCBwb3N0U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFhZUGxvdC5fWV9LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShYWVBsb3QuX1lfS0VZLCB5LCB5U2NhbGUsIHBvc3RTY2FsZSk7CiAgICAgICAgICAgIHZhciBoZWlnaHQgPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICBpZiAoeVNjYWxlICE9IG51bGwgJiYgaGVpZ2h0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh5U2NhbGUgaW5zdGFuY2VvZiBzY2FsZXMuQ2F0ZWdvcnkpIHsKICAgICAgICAgICAgICAgICAgICB5U2NhbGUucmFuZ2UoWzAsIGhlaWdodF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgeVNjYWxlLnJhbmdlKFtoZWlnaHQsIDBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbikgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkgewogICAgICAgICAgICBpZiAocHJvcGVydHkgPT09ICJ4IiAmJiB0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZUZpbHRlckJ5UHJvcGVydHkoInkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICgocHJvcGVydHkgPT09ICJ5IiB8fCBwcm9wZXJ0eSA9PT0gInkwIikgJiYgdGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VGaWx0ZXJCeVByb3BlcnR5KCJ4Iik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLl9tYWtlRmlsdGVyQnlQcm9wZXJ0eSA9IGZ1bmN0aW9uIChwcm9wZXJ0eSkgewogICAgICAgICAgICB2YXIgYmluZGluZyA9IHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KHByb3BlcnR5KTsKICAgICAgICAgICAgaWYgKGJpbmRpbmcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIGFjY2Vzc29yXzEgPSBiaW5kaW5nLmFjY2Vzc29yOwogICAgICAgICAgICAgICAgdmFyIHNjYWxlXzEgPSBiaW5kaW5nLnNjYWxlOwogICAgICAgICAgICAgICAgaWYgKHNjYWxlXzEgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciByYW5nZSA9IHNjYWxlXzEucmFuZ2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuTWF0aC5pblJhbmdlKHNjYWxlXzEuc2NhbGUoYWNjZXNzb3JfMShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpKSwgcmFuZ2VbMF0sIHJhbmdlWzFdKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH07CiAgICAgICAgWFlQbG90LnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkgPSBmdW5jdGlvbiAoc2NhbGUsIGtleSkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl91bmluc3RhbGxTY2FsZUZvcktleS5jYWxsKHRoaXMsIHNjYWxlLCBrZXkpOwogICAgICAgICAgICB2YXIgYWRqdXN0Q2FsbGJhY2sgPSBrZXkgPT09IFhZUGxvdC5fWF9LRVkgPyB0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrCiAgICAgICAgICAgICAgICA6IHRoaXMuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZQ2FsbGJhY2s7CiAgICAgICAgICAgIHNjYWxlLm9mZlVwZGF0ZShhZGp1c3RDYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXkgPSBmdW5jdGlvbiAoc2NhbGUsIGtleSkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLCBzY2FsZSwga2V5KTsKICAgICAgICAgICAgdmFyIGFkanVzdENhbGxiYWNrID0ga2V5ID09PSBYWVBsb3QuX1hfS0VZID8gdGhpcy5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVhDYWxsYmFjawogICAgICAgICAgICAgICAgOiB0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrOwogICAgICAgICAgICBzY2FsZS5vblVwZGF0ZShhZGp1c3RDYWxsYmFjayk7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGVzdHJveS5jYWxsKHRoaXMpOwogICAgICAgICAgICBpZiAodGhpcy54KCkuc2NhbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMueCgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWENhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy55KCkuc2NhbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMueSgpLnNjYWxlLm9mZlVwZGF0ZSh0aGlzLl9hZGp1c3RYRG9tYWluT25DaGFuZ2VGcm9tWUNhbGxiYWNrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFhZUGxvdC5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZSA9IGZ1bmN0aW9uIChhdXRvcmFuZ2VNb2RlKSB7CiAgICAgICAgICAgIGlmIChhdXRvcmFuZ2VNb2RlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ4IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ5IjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAibm9uZSI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoIChhdXRvcmFuZ2VNb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlICJ4IjoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvQWRqdXN0WFNjYWxlRG9tYWluID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRqdXN0WERvbWFpbk9uQ2hhbmdlRnJvbVkoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgInkiOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hdXRvQWRqdXN0WVNjYWxlRG9tYWluID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGp1c3RZRG9tYWluT25DaGFuZ2VGcm9tWCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAibm9uZSI6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXV0b0FkanVzdFhTY2FsZURvbWFpbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2F1dG9BZGp1c3RZU2NhbGVEb21haW4gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIHNjYWxlIG5hbWUgJyIgKyBhdXRvcmFuZ2VNb2RlICsgIicsIG11c3QgYmUgJ3gnLCAneScgb3IgJ25vbmUnIik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQgPSBmdW5jdGlvbiAob3JpZ2luLCBhdmFpbGFibGVXaWR0aCwgYXZhaWxhYmxlSGVpZ2h0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuY29tcHV0ZUxheW91dC5jYWxsKHRoaXMsIG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCk7CiAgICAgICAgICAgIHZhciB4QmluZGluZyA9IHRoaXMueCgpOwogICAgICAgICAgICB2YXIgeFNjYWxlID0geEJpbmRpbmcgJiYgeEJpbmRpbmcuc2NhbGU7CiAgICAgICAgICAgIGlmICh4U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgeFNjYWxlLnJhbmdlKFswLCB0aGlzLndpZHRoKCldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgeUJpbmRpbmcgPSB0aGlzLnkoKTsKICAgICAgICAgICAgdmFyIHlTY2FsZSA9IHlCaW5kaW5nICYmIHlCaW5kaW5nLnNjYWxlOwogICAgICAgICAgICBpZiAoeVNjYWxlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh5U2NhbGUgaW5zdGFuY2VvZiBzY2FsZXMuQ2F0ZWdvcnkpIHsKICAgICAgICAgICAgICAgICAgICB5U2NhbGUucmFuZ2UoWzAsIHRoaXMuaGVpZ2h0KCldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHlTY2FsZS5yYW5nZShbdGhpcy5oZWlnaHQoKSwgMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgWFlQbG90LnByb3RvdHlwZS5fdXBkYXRlWEV4dGVudHNBbmRBdXRvZG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgeFNjYWxlID0gdGhpcy54KCkuc2NhbGU7CiAgICAgICAgICAgIGlmICh4U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgeFNjYWxlLmF1dG9Eb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgWFlQbG90LnByb3RvdHlwZS5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgeVNjYWxlID0gdGhpcy55KCkuc2NhbGU7CiAgICAgICAgICAgIGlmICh5U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgeVNjYWxlLmF1dG9Eb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogQWRqdXN0cyB0aGUgZG9tYWlucyBvZiBib3RoIFggYW5kIFkgc2NhbGVzIHRvIHNob3cgYWxsIGRhdGEuCiAgICAgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IG92ZXJyaWRlIHRoZSBhdXRvcmFuZ2UoKSBiZWhhdmlvci4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm5zIHtYWVBsb3R9IFRoZSBjYWxsaW5nIFhZUGxvdC4KICAgICAgICAgKi8KICAgICAgICBYWVBsb3QucHJvdG90eXBlLnNob3dBbGxEYXRhID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVYRXh0ZW50c0FuZEF1dG9kb21haW4oKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgWFlQbG90LnByb3RvdHlwZS5fYWRqdXN0WURvbWFpbk9uQ2hhbmdlRnJvbVggPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fYXV0b0FkanVzdFlTY2FsZURvbWFpbikgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlWUV4dGVudHNBbmRBdXRvZG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFhZUGxvdC5wcm90b3R5cGUuX2FkanVzdFhEb21haW5PbkNoYW5nZUZyb21ZID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2F1dG9BZGp1c3RYU2NhbGVEb21haW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVhFeHRlbnRzQW5kQXV0b2RvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLl9wcm9qZWN0b3JzUmVhZHkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciB4QmluZGluZyA9IHRoaXMueCgpOwogICAgICAgICAgICB2YXIgeUJpbmRpbmcgPSB0aGlzLnkoKTsKICAgICAgICAgICAgcmV0dXJuIHhCaW5kaW5nICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIHhCaW5kaW5nLmFjY2Vzc29yICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIHlCaW5kaW5nICE9IG51bGwgJiYKICAgICAgICAgICAgICAgIHlCaW5kaW5nLmFjY2Vzc29yICE9IG51bGw7CiAgICAgICAgfTsKICAgICAgICBYWVBsb3QucHJvdG90eXBlLl9waXhlbFBvaW50ID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICB2YXIgeFByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpOwogICAgICAgICAgICB2YXIgeVByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwogICAgICAgICAgICByZXR1cm4geyB4OiB4UHJvamVjdG9yKGRhdHVtLCBpbmRleCwgZGF0YXNldCksIHk6IHlQcm9qZWN0b3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB9OwogICAgICAgIH07CiAgICAgICAgWFlQbG90LnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGRhdGFUb0RyYXcgPSBfc3VwZXIucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CiAgICAgICAgICAgIHZhciBkZWZpbmVkQXR0ciA9IHRoaXMuYXR0cigiZGVmaW5lZCIpOwogICAgICAgICAgICB2YXIgZGVmaW5lZEZ1bmN0aW9uID0gZnVuY3Rpb24gKGQsIGksIGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvblggPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKF90aGlzLngoKSkoZCwgaSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb25ZID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihfdGhpcy55KCkpKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgaWYgKGRlZmluZWRBdHRyICYmIGRlZmluZWRBdHRyLmFjY2Vzc29yKGQsIGksIGRhdGFzZXQpID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihwb3NpdGlvblgpICYmCiAgICAgICAgICAgICAgICAgICAgdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIocG9zaXRpb25ZKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgIGRhdGFUb0RyYXcuc2V0KGRhdGFzZXQsIGRhdGFUb0RyYXcuZ2V0KGRhdGFzZXQpLmZpbHRlcihmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gZGVmaW5lZEZ1bmN0aW9uKGQsIGksIGRhdGFzZXQpOyB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZGF0YVRvRHJhdzsKICAgICAgICB9OwogICAgICAgIFhZUGxvdC5fWF9LRVkgPSAieCI7CiAgICAgICAgWFlQbG90Ll9ZX0tFWSA9ICJ5IjsKICAgICAgICByZXR1cm4gWFlQbG90OwogICAgfShwbG90LlBsb3QpKTsKICAgIGV4cG9ydHMuWFlQbG90ID0gWFlQbG90OwogICAgfSk7CgogICAgdmFyIGxpbmVQbG90ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgoKCgoKCgoKCgogICAgdmFyIENVUlZFX05BTUVfTUFQUElORyA9IHsKICAgICAgICBsaW5lYXI6IGQzLmN1cnZlTGluZWFyLAogICAgICAgIGxpbmVhckNsb3NlZDogZDMuY3VydmVMaW5lYXJDbG9zZWQsCiAgICAgICAgc3RlcDogZDMuY3VydmVTdGVwLAogICAgICAgIHN0ZXBCZWZvcmU6IGQzLmN1cnZlU3RlcEJlZm9yZSwKICAgICAgICBzdGVwQWZ0ZXI6IGQzLmN1cnZlU3RlcEFmdGVyLAogICAgICAgIGJhc2lzOiBkMy5jdXJ2ZUJhc2lzLAogICAgICAgIGJhc2lzT3BlbjogZDMuY3VydmVCYXNpc09wZW4sCiAgICAgICAgYmFzaXNDbG9zZWQ6IGQzLmN1cnZlQmFzaXNDbG9zZWQsCiAgICAgICAgYnVuZGxlOiBkMy5jdXJ2ZUJ1bmRsZSwKICAgICAgICBjYXJkaW5hbDogZDMuY3VydmVDYXJkaW5hbCwKICAgICAgICBjYXJkaW5hbE9wZW46IGQzLmN1cnZlQ2FyZGluYWxPcGVuLAogICAgICAgIGNhcmRpbmFsQ2xvc2VkOiBkMy5jdXJ2ZUNhcmRpbmFsQ2xvc2VkLAogICAgICAgIG1vbm90b25lOiBkMy5jdXJ2ZU1vbm90b25lWCwKICAgIH07CiAgICAvKioKICAgICAqIEtub3duIGN1cnZlIHR5cGVzIHRoYXQgbGluZSBhbmQgYXJlYSBwbG90J3MgLmN1cnZlKCkgbWV0aG9kcyB1bmRlcnN0YW5kCiAgICAgKi8KICAgIGV4cG9ydHMuQ3VydmVOYW1lID0gbWFrZUVudW1fMS5tYWtlRW51bShbCiAgICAgICAgImxpbmVhciIsCiAgICAgICAgImxpbmVhckNsb3NlZCIsCiAgICAgICAgInN0ZXAiLAogICAgICAgICJzdGVwQmVmb3JlIiwKICAgICAgICAic3RlcEFmdGVyIiwKICAgICAgICAiYmFzaXMiLAogICAgICAgICJiYXNpc09wZW4iLAogICAgICAgICJiYXNpc0Nsb3NlZCIsCiAgICAgICAgImJ1bmRsZSIsCiAgICAgICAgImNhcmRpbmFsIiwKICAgICAgICAiY2FyZGluYWxPcGVuIiwKICAgICAgICAiY2FyZGluYWxDbG9zZWQiLAogICAgICAgICJtb25vdG9uZSIsCiAgICBdKTsKICAgIHZhciBMaW5lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoTGluZSwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBBIExpbmUgUGxvdCBkcmF3cyBsaW5lIHNlZ21lbnRzIHN0YXJ0aW5nIGZyb20gdGhlIGZpcnN0IGRhdGEgcG9pbnQgdG8gdGhlIG5leHQuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBMaW5lKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fY3VydmUgPSAibGluZWFyIjsKICAgICAgICAgICAgX3RoaXMuX2F1dG9yYW5nZVNtb290aCA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5fY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICBfdGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLl9kb3duc2FtcGxpbmdFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJsaW5lLXBsb3QiKTsKICAgICAgICAgICAgdmFyIGFuaW1hdG9yID0gbmV3IGFuaW1hdG9ycy5FYXNpbmcoKTsKICAgICAgICAgICAgYW5pbWF0b3Iuc3RlcER1cmF0aW9uKHBsb3QuUGxvdC5fQU5JTUFUSU9OX01BWF9EVVJBVElPTik7CiAgICAgICAgICAgIGFuaW1hdG9yLmVhc2luZ01vZGUoImV4cEluT3V0Iik7CiAgICAgICAgICAgIGFuaW1hdG9yLm1heFRvdGFsRHVyYXRpb24ocGxvdC5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTsKICAgICAgICAgICAgX3RoaXMuYW5pbWF0b3IocGxvdHMuQW5pbWF0b3IuTUFJTiwgYW5pbWF0b3IpOwogICAgICAgICAgICBfdGhpcy5hdHRyKCJzdHJva2UiLCBuZXcgc2NhbGVzLkNvbG9yKCkucmFuZ2UoKVswXSk7CiAgICAgICAgICAgIF90aGlzLmF0dHIoInN0cm9rZS13aWR0aCIsICIycHgiKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBMaW5lLnByb3RvdHlwZS54ID0gZnVuY3Rpb24gKHgsIHhTY2FsZSwgcG9zdFNjYWxlKSB7CiAgICAgICAgICAgIGlmICh4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnguY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueC5jYWxsKHRoaXMsIHgsIHhTY2FsZSwgcG9zdFNjYWxlKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NldFNjYWxlU25hcHBpbmcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS55ID0gZnVuY3Rpb24gKHksIHlTY2FsZSwgcG9zdFNjYWxlKSB7CiAgICAgICAgICAgIGlmICh5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnkuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueS5jYWxsKHRoaXMsIHksIHlTY2FsZSwgcG9zdFNjYWxlKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NldFNjYWxlU25hcHBpbmcoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5hdXRvcmFuZ2VNb2RlID0gZnVuY3Rpb24gKGF1dG9yYW5nZU1vZGUpIHsKICAgICAgICAgICAgaWYgKGF1dG9yYW5nZU1vZGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuYXV0b3JhbmdlTW9kZS5jYWxsKHRoaXMsIGF1dG9yYW5nZU1vZGUpOwogICAgICAgICAgICB0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuYXV0b3JhbmdlU21vb3RoID0gZnVuY3Rpb24gKGF1dG9yYW5nZVNtb290aCkgewogICAgICAgICAgICBpZiAoYXV0b3JhbmdlU21vb3RoID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9hdXRvcmFuZ2VTbW9vdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYXV0b3JhbmdlU21vb3RoID0gYXV0b3JhbmdlU21vb3RoOwogICAgICAgICAgICB0aGlzLl9zZXRTY2FsZVNuYXBwaW5nKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuX3NldFNjYWxlU25hcHBpbmcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9yYW5nZU1vZGUoKSA9PT0gIngiICYmIHRoaXMueCgpICYmIHRoaXMueCgpLnNjYWxlICYmIHRoaXMueCgpLnNjYWxlIGluc3RhbmNlb2YgcXVhbnRpdGF0aXZlU2NhbGUuUXVhbnRpdGF0aXZlU2NhbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMueCgpLnNjYWxlLnNuYXBwaW5nRG9tYWluRW5hYmxlZCghdGhpcy5hdXRvcmFuZ2VTbW9vdGgoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYXV0b3JhbmdlTW9kZSgpID09PSAieSIgJiYgdGhpcy55KCkgJiYgdGhpcy55KCkuc2NhbGUgJiYgdGhpcy55KCkuc2NhbGUgaW5zdGFuY2VvZiBxdWFudGl0YXRpdmVTY2FsZS5RdWFudGl0YXRpdmVTY2FsZSkgewogICAgICAgICAgICAgICAgdGhpcy55KCkuc2NhbGUuc25hcHBpbmdEb21haW5FbmFibGVkKCF0aGlzLmF1dG9yYW5nZVNtb290aCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuY3VydmUgPSBmdW5jdGlvbiAoY3VydmUpIHsKICAgICAgICAgICAgaWYgKGN1cnZlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXJ2ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jdXJ2ZSA9IGN1cnZlOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIExpbmUucHJvdG90eXBlLmRvd25zYW1wbGluZ0VuYWJsZWQgPSBmdW5jdGlvbiAoZG93bnNhbXBsaW5nKSB7CiAgICAgICAgICAgIGlmIChkb3duc2FtcGxpbmcgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25zYW1wbGluZ0VuYWJsZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZCA9IGRvd25zYW1wbGluZzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCA9IGZ1bmN0aW9uIChjcm9wcGVkUmVuZGVyaW5nKSB7CiAgICAgICAgICAgIGlmIChjcm9wcGVkUmVuZGVyaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCA9IGNyb3BwZWRSZW5kZXJpbmc7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuY29sbGFwc2VEZW5zZUxpbmVzRW5hYmxlZCA9IGZ1bmN0aW9uIChjb2xsYXBzZURlbnNlTGluZXMpIHsKICAgICAgICAgICAgaWYgKGNvbGxhcHNlRGVuc2VMaW5lcyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sbGFwc2VEZW5zZVZlcnRpY2FsTGluZXNFbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NvbGxhcHNlRGVuc2VWZXJ0aWNhbExpbmVzRW5hYmxlZCA9IGNvbGxhcHNlRGVuc2VMaW5lczsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIG5ldyBkcmF3ZXIuUHJveHlEcmF3ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IGxpbmVEcmF3ZXIuTGluZVNWR0RyYXdlcigpOyB9LCBmdW5jdGlvbiAoY3R4KSB7IHJldHVybiBuZXcgZHJhd2Vycy5DYW52YXNEcmF3ZXIoY3R4LCBsaW5lRHJhd2VyLm1ha2VMaW5lQ2FudmFzRHJhd1N0ZXAoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2QzTGluZUZhY3RvcnkoZGF0YXNldCk7IH0pKTsgfSk7CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHsKICAgICAgICAgICAgdmFyIGV4dGVudHMgPSBfc3VwZXIucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9hdXRvcmFuZ2VTbW9vdGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9yYW5nZU1vZGUoKSAhPT0gcHJvcGVydHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9yYW5nZU1vZGUoKSAhPT0gIngiICYmIHRoaXMuYXV0b3JhbmdlTW9kZSgpICE9PSAieSIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlZGdlSW50ZXJzZWN0aW9uUG9pbnRzID0gdGhpcy5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cygpOwogICAgICAgICAgICB2YXIgaW5jbHVkZWRWYWx1ZXM7CiAgICAgICAgICAgIGlmICh0aGlzLmF1dG9yYW5nZU1vZGUoKSA9PT0gInkiKSB7CiAgICAgICAgICAgICAgICBpbmNsdWRlZFZhbHVlcyA9IGVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMubGVmdC5jb25jYXQoZWRnZUludGVyc2VjdGlvblBvaW50cy5yaWdodCkubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4gcG9pbnQueTsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpbmNsdWRlZFZhbHVlcyA9IGVkZ2VJbnRlcnNlY3Rpb25Qb2ludHMudG9wLmNvbmNhdChlZGdlSW50ZXJzZWN0aW9uUG9pbnRzLmJvdHRvbSkubWFwKGZ1bmN0aW9uIChwb2ludCkgeyByZXR1cm4gcG9pbnQueDsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGV4dGVudHMubWFwKGZ1bmN0aW9uIChleHRlbnQpIHsgcmV0dXJuIGQzLmV4dGVudChkMy5tZXJnZShbZXh0ZW50LCBpbmNsdWRlZFZhbHVlc10pKTsgfSk7CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5fZ2V0RWRnZUludGVyc2VjdGlvblBvaW50cyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKCEodGhpcy55KCkuc2NhbGUgaW5zdGFuY2VvZiBxdWFudGl0YXRpdmVTY2FsZS5RdWFudGl0YXRpdmVTY2FsZSAmJiB0aGlzLngoKS5zY2FsZSBpbnN0YW5jZW9mIHF1YW50aXRhdGl2ZVNjYWxlLlF1YW50aXRhdGl2ZVNjYWxlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBsZWZ0OiBbXSwKICAgICAgICAgICAgICAgICAgICByaWdodDogW10sCiAgICAgICAgICAgICAgICAgICAgdG9wOiBbXSwKICAgICAgICAgICAgICAgICAgICBib3R0b206IFtdLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgeVNjYWxlID0gdGhpcy55KCkuc2NhbGU7CiAgICAgICAgICAgIHZhciB4U2NhbGUgPSB0aGlzLngoKS5zY2FsZTsKICAgICAgICAgICAgdmFyIGludGVyc2VjdGlvblBvaW50cyA9IHsKICAgICAgICAgICAgICAgIGxlZnQ6IFtdLAogICAgICAgICAgICAgICAgcmlnaHQ6IFtdLAogICAgICAgICAgICAgICAgdG9wOiBbXSwKICAgICAgICAgICAgICAgIGJvdHRvbTogW10sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsZWZ0WCA9IHhTY2FsZS5zY2FsZSh4U2NhbGUuZG9tYWluKClbMF0pOwogICAgICAgICAgICB2YXIgcmlnaHRYID0geFNjYWxlLnNjYWxlKHhTY2FsZS5kb21haW4oKVsxXSk7CiAgICAgICAgICAgIHZhciBib3R0b21ZID0geVNjYWxlLnNjYWxlKHlTY2FsZS5kb21haW4oKVswXSk7CiAgICAgICAgICAgIHZhciB0b3BZID0geVNjYWxlLnNjYWxlKHlTY2FsZS5kb21haW4oKVsxXSk7CiAgICAgICAgICAgIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IGRhdGFzZXQuZGF0YSgpOwogICAgICAgICAgICAgICAgdmFyIHgxLCB4MiwgeTEsIHkyOwogICAgICAgICAgICAgICAgdmFyIHByZXZYLCBwcmV2WSwgY3VyclgsIGN1cnJZOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldlggPSBjdXJyWCB8fCB4U2NhbGUuc2NhbGUoX3RoaXMueCgpLmFjY2Vzc29yKGRhdGFbaSAtIDFdLCBpIC0gMSwgZGF0YXNldCkpOwogICAgICAgICAgICAgICAgICAgIHByZXZZID0gY3VyclkgfHwgeVNjYWxlLnNjYWxlKF90aGlzLnkoKS5hY2Nlc3NvcihkYXRhW2kgLSAxXSwgaSAtIDEsIGRhdGFzZXQpKTsKICAgICAgICAgICAgICAgICAgICBjdXJyWCA9IHhTY2FsZS5zY2FsZShfdGhpcy54KCkuYWNjZXNzb3IoZGF0YVtpXSwgaSwgZGF0YXNldCkpOwogICAgICAgICAgICAgICAgICAgIGN1cnJZID0geVNjYWxlLnNjYWxlKF90aGlzLnkoKS5hY2Nlc3NvcihkYXRhW2ldLCBpLCBkYXRhc2V0KSk7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWVzIGNyb3NzZWQgbGVmdCBlZGdlCiAgICAgICAgICAgICAgICAgICAgaWYgKChwcmV2WCA8IGxlZnRYKSA9PT0gKGxlZnRYIDw9IGN1cnJYKSkgewogICAgICAgICAgICAgICAgICAgICAgICB4MSA9IGxlZnRYIC0gcHJldlg7CiAgICAgICAgICAgICAgICAgICAgICAgIHgyID0gY3VyclggLSBwcmV2WDsKICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSBjdXJyWSAtIHByZXZZOwogICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHgxICogeTIgLyB4MjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLmxlZnQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBsZWZ0WCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHlTY2FsZS5pbnZlcnQocHJldlkgKyB5MSksCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZXMgY3Jvc3NlZCByaWdodCBlZGdlCiAgICAgICAgICAgICAgICAgICAgaWYgKChwcmV2WCA8IHJpZ2h0WCkgPT09IChyaWdodFggPD0gY3VyclgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHgxID0gcmlnaHRYIC0gcHJldlg7CiAgICAgICAgICAgICAgICAgICAgICAgIHgyID0gY3VyclggLSBwcmV2WDsKICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSBjdXJyWSAtIHByZXZZOwogICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHgxICogeTIgLyB4MjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLnJpZ2h0LnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogcmlnaHRYLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgeTogeVNjYWxlLmludmVydChwcmV2WSArIHkxKSwKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlcyBjcm9zc2VkIHVwcGVyIGVkZ2UKICAgICAgICAgICAgICAgICAgICBpZiAoKHByZXZZIDwgdG9wWSkgPT09ICh0b3BZIDw9IGN1cnJZKSkgewogICAgICAgICAgICAgICAgICAgICAgICB4MiA9IGN1cnJYIC0gcHJldlg7CiAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdG9wWSAtIHByZXZZOwogICAgICAgICAgICAgICAgICAgICAgICB5MiA9IGN1cnJZIC0gcHJldlk7CiAgICAgICAgICAgICAgICAgICAgICAgIHgxID0geTEgKiB4MiAvIHkyOwogICAgICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3Rpb25Qb2ludHMudG9wLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICAgICAgeDogeFNjYWxlLmludmVydChwcmV2WCArIHgxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHRvcFksCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJZiB2YWx1ZXMgY3Jvc3NlZCBsb3dlciBlZGdlCiAgICAgICAgICAgICAgICAgICAgaWYgKChwcmV2WSA8IGJvdHRvbVkpID09PSAoYm90dG9tWSA8PSBjdXJyWSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgeDIgPSBjdXJyWCAtIHByZXZYOwogICAgICAgICAgICAgICAgICAgICAgICB5MSA9IGJvdHRvbVkgLSBwcmV2WTsKICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSBjdXJyWSAtIHByZXZZOwogICAgICAgICAgICAgICAgICAgICAgICB4MSA9IHkxICogeDIgLyB5MjsKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0aW9uUG9pbnRzLmJvdHRvbS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHhTY2FsZS5pbnZlcnQocHJldlggKyB4MSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBib3R0b21ZLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9uUG9pbnRzOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuX2dldFJlc2V0WUZ1bmN0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyBnZXRzIHRoZSB5LXZhbHVlIGdlbmVyYXRvciBmb3IgdGhlIGFuaW1hdGlvbiBzdGFydCBwb2ludAogICAgICAgICAgICB2YXIgeURvbWFpbiA9IHRoaXMueSgpLnNjYWxlLmRvbWFpbigpOwogICAgICAgICAgICB2YXIgZG9tYWluTWF4ID0gTWF0aC5tYXgoeURvbWFpblswXSwgeURvbWFpblsxXSk7CiAgICAgICAgICAgIHZhciBkb21haW5NaW4gPSBNYXRoLm1pbih5RG9tYWluWzBdLCB5RG9tYWluWzFdKTsKICAgICAgICAgICAgLy8gc3RhcnQgZnJvbSB6ZXJvLCBvciB0aGUgY2xvc2VzdCBkb21haW4gdmFsdWUgdG8gemVybwogICAgICAgICAgICAvLyBhdm9pZHMgbGluZXMgem9vbWluZyBvbiBmcm9tIG9mZnNjcmVlbi4KICAgICAgICAgICAgdmFyIHN0YXJ0VmFsdWUgPSAoZG9tYWluTWF4IDwgMCAmJiBkb21haW5NYXgpIHx8IChkb21haW5NaW4gPiAwICYmIGRvbWFpbk1pbikgfHwgMDsKICAgICAgICAgICAgdmFyIHNjYWxlZFN0YXJ0VmFsdWUgPSB0aGlzLnkoKS5zY2FsZS5zY2FsZShzdGFydFZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7IHJldHVybiBzY2FsZWRTdGFydFZhbHVlOyB9OwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZHJhd1N0ZXBzID0gW107CiAgICAgICAgICAgIGlmICh0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpIHsKICAgICAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsiZCJdID0gdGhpcy5fY29uc3RydWN0TGluZVByb2plY3RvcihwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwgdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSk7CiAgICAgICAgICAgICAgICBkcmF3U3RlcHMucHVzaCh7IGF0dHJUb1Byb2plY3RvcjogYXR0clRvUHJvamVjdG9yLCBhbmltYXRvcjogdGhpcy5fZ2V0QW5pbWF0b3IocGxvdHMuQW5pbWF0b3IuUkVTRVQpIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRyYXdTdGVwcy5wdXNoKHsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvcjogdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCksCiAgICAgICAgICAgICAgICBhbmltYXRvcjogdGhpcy5fZ2V0QW5pbWF0b3IocGxvdHMuQW5pbWF0b3IuTUFJTiksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZHJhd1N0ZXBzOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gX3N1cGVyLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTsKICAgICAgICAgICAgT2JqZWN0LmtleXMoYXR0clRvUHJvamVjdG9yKS5mb3JFYWNoKGZ1bmN0aW9uIChhdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUgPT09ICJkIikgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm9qZWN0b3IgPSBhdHRyVG9Qcm9qZWN0b3JbYXR0cmlidXRlXTsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclthdHRyaWJ1dGVdID0gZnVuY3Rpb24gKGRhdGEsIGksIGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YS5sZW5ndGggPiAwID8gcHJvamVjdG9yKGRhdGFbMF0sIGksIGRhdGFzZXQpIDogbnVsbDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gYXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuZW50aXRpZXNBdCA9IGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICB2YXIgZW50aXR5ID0gdGhpcy5lbnRpdHlOZWFyZXN0QnlYVGhlblkocG9pbnQpOwogICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbZW50aXR5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgUGxvdEVudGl0eSBuZWFyZXN0IHRvIHRoZSBxdWVyeSBwb2ludCBieSBYIHRoZW4gYnkgWSwgb3IgdW5kZWZpbmVkIGlmIG5vIFBsb3RFbnRpdHkgY2FuIGJlIGZvdW5kLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQb2ludH0gcXVlcnlQb2ludAogICAgICAgICAqIEByZXR1cm5zIHtQbG90RW50aXR5fSBUaGUgbmVhcmVzdCBQbG90RW50aXR5LCBvciB1bmRlZmluZWQgaWYgbm8gUGxvdEVudGl0eSBjYW4gYmUgZm91bmQuCiAgICAgICAgICovCiAgICAgICAgTGluZS5wcm90b3R5cGUuZW50aXR5TmVhcmVzdEJ5WFRoZW5ZID0gZnVuY3Rpb24gKHF1ZXJ5UG9pbnQpIHsKICAgICAgICAgICAgdmFyIG1pblhEaXN0ID0gSW5maW5pdHk7CiAgICAgICAgICAgIHZhciBtaW5ZRGlzdCA9IEluZmluaXR5OwogICAgICAgICAgICB2YXIgY2xvc2VzdDsKICAgICAgICAgICAgdmFyIGNoYXJ0Qm91bmRzID0gdGhpcy5ib3VuZHMoKTsKICAgICAgICAgICAgdmFyIGVudGl0aWVzID0gdGhpcy5lbnRpdGllcygpOwogICAgICAgICAgICB2YXIgZW50aXR5TGVuID0gZW50aXRpZXMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudGl0eUxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZW50aXR5ID0gZW50aXRpZXNbaV07CiAgICAgICAgICAgICAgICBpZiAoIXV0aWxzJDEuTWF0aC53aXRoaW4oZW50aXR5LnBvc2l0aW9uLCBjaGFydEJvdW5kcykpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB4RGlzdCA9IE1hdGguYWJzKHF1ZXJ5UG9pbnQueCAtIGVudGl0eS5wb3NpdGlvbi54KTsKICAgICAgICAgICAgICAgIHZhciB5RGlzdCA9IE1hdGguYWJzKHF1ZXJ5UG9pbnQueSAtIGVudGl0eS5wb3NpdGlvbi55KTsKICAgICAgICAgICAgICAgIGlmICh4RGlzdCA8IG1pblhEaXN0IHx8IHhEaXN0ID09PSBtaW5YRGlzdCAmJiB5RGlzdCA8IG1pbllEaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdCA9IGVudGl0eTsKICAgICAgICAgICAgICAgICAgICBtaW5YRGlzdCA9IHhEaXN0OwogICAgICAgICAgICAgICAgICAgIG1pbllEaXN0ID0geURpc3Q7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNsb3Nlc3Q7CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydHlUb1Byb2plY3RvcnMgPSBfc3VwZXIucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgcHJvcGVydHlUb1Byb2plY3RvcnNbImQiXSA9IHRoaXMuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IocGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksIHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpKTsKICAgICAgICAgICAgcmV0dXJuIHByb3BlcnR5VG9Qcm9qZWN0b3JzOwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuX2NvbnN0cnVjdExpbmVQcm9qZWN0b3IgPSBmdW5jdGlvbiAoeFByb2plY3RvciwgeVByb2plY3RvcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9kM0xpbmVGYWN0b3J5KGRhdGFzZXQsIHhQcm9qZWN0b3IsIHlQcm9qZWN0b3IpKGRhdHVtKTsKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBhIGQzLkxpbmUgd2hvc2UgLngsIC55LCBhbmQgLmRlZmluZWQgYWNjZXNzb3JzIGFyZSBob29rZWQgdXAgdG8gdGhlIHhQcm9qZWN0b3IgYW5kIHlQcm9qZWN0b3IKICAgICAgICAgKiBhZnRlciB0aGV5J3ZlIGJlZW4gZmVkIHRoZSBkYXRhc2V0LCBhbmQgd2hvc2UgY3VydmUgaXMgY29uZmlndXJlZCB0byB0aGlzIHBsb3QncyBjdXJ2ZS4KICAgICAgICAgKiBAcGFyYW0gZGF0YXNldAogICAgICAgICAqIEBwYXJhbSB4UHJvamVjdG9yCiAgICAgICAgICogQHBhcmFtIHlQcm9qZWN0b3IKICAgICAgICAgKiBAcmV0dXJucyB7TGluZTxbbnVtYmVyLG51bWJlcl0+fQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgTGluZS5wcm90b3R5cGUuX2QzTGluZUZhY3RvcnkgPSBmdW5jdGlvbiAoZGF0YXNldCwgeFByb2plY3RvciwgeVByb2plY3RvcikgewogICAgICAgICAgICBpZiAoeFByb2plY3RvciA9PT0gdm9pZCAwKSB7IHhQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTsgfQogICAgICAgICAgICBpZiAoeVByb2plY3RvciA9PT0gdm9pZCAwKSB7IHlQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsgfQogICAgICAgICAgICB2YXIgZGVmaW5lZFByb2plY3RvciA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb25YID0geFByb2plY3RvcihkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBwb3NpdGlvblkgPSB5UHJvamVjdG9yKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKHBvc2l0aW9uWCkgJiYgdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIocG9zaXRpb25ZKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGQzLmxpbmUoKQogICAgICAgICAgICAgICAgLngoZnVuY3Rpb24gKGlubmVyRGF0dW0sIGlubmVySW5kZXgpIHsgcmV0dXJuIHhQcm9qZWN0b3IoaW5uZXJEYXR1bSwgaW5uZXJJbmRleCwgZGF0YXNldCk7IH0pCiAgICAgICAgICAgICAgICAueShmdW5jdGlvbiAoaW5uZXJEYXR1bSwgaW5uZXJJbmRleCkgeyByZXR1cm4geVByb2plY3Rvcihpbm5lckRhdHVtLCBpbm5lckluZGV4LCBkYXRhc2V0KTsgfSkKICAgICAgICAgICAgICAgIC5jdXJ2ZSh0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKSkKICAgICAgICAgICAgICAgIC5kZWZpbmVkKGZ1bmN0aW9uIChpbm5lckRhdHVtLCBpbm5lckluZGV4KSB7IHJldHVybiBkZWZpbmVkUHJvamVjdG9yKGlubmVyRGF0dW0sIGlubmVySW5kZXgsIGRhdGFzZXQpOyB9KTsKICAgICAgICB9OwogICAgICAgIExpbmUucHJvdG90eXBlLl9nZXRDdXJ2ZUZhY3RvcnkgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBjdXJ2ZSA9IHRoaXMuY3VydmUoKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXJ2ZSA9PT0gInN0cmluZyIpIHsKICAgICAgICAgICAgICAgIHZhciBtYXliZUN1cnZlRnVuY3Rpb24gPSBDVVJWRV9OQU1FX01BUFBJTkdbY3VydmVdOwogICAgICAgICAgICAgICAgaWYgKG1heWJlQ3VydmVGdW5jdGlvbiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gb29wczsgbmFtZSBpcyB3cm9uZyAtIGRlZmF1bHQgdG8gbGluZWFyIGluc3RlYWQKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ1VSVkVfTkFNRV9NQVBQSU5HWyJsaW5lYXIiXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXliZUN1cnZlRnVuY3Rpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY3VydmU7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIExpbmUgcGxvdHMgcmVwcmVzZW50IGVhY2ggZGF0YXNldCB3aXRoIGEgc2luZ2xlIDxwYXRoPiBlbGVtZW50LCBzbyB3ZSB3cmFwIHRoZSBkYXRhc2V0IGRhdGEgaW4gYSBzaW5nbGUgZWxlbWVudCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJucyB7TWFwPERhdGFzZXQsIGFueVtdPn0KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIExpbmUucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgZGF0YVRvRHJhdyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEoKTsKICAgICAgICAgICAgICAgIGlmICghX3RoaXMuX2Nyb3BwZWRSZW5kZXJpbmdFbmFibGVkICYmICFfdGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIGRhdGFUb0RyYXcuc2V0KGRhdGFzZXQsIFtkYXRhXSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGZpbHRlcmVkRGF0YUluZGljZXMgPSBbXTsKICAgICAgICAgICAgICAgIHZhciBkYXRhTGVuID0gZGF0YS5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGRhdGFMZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YUluZGljZXNbaV0gPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKF90aGlzLl9jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YUluZGljZXMgPSBfdGhpcy5fZmlsdGVyQ3JvcHBlZFJlbmRlcmluZyhkYXRhc2V0LCBmaWx0ZXJlZERhdGFJbmRpY2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChfdGhpcy5fZG93bnNhbXBsaW5nRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRGF0YUluZGljZXMgPSBfdGhpcy5fZmlsdGVyRG93bnNhbXBsaW5nKGRhdGFzZXQsIGZpbHRlcmVkRGF0YUluZGljZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKF90aGlzLl9jb2xsYXBzZURlbnNlVmVydGljYWxMaW5lc0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGFJbmRpY2VzID0gX3RoaXMuX2ZpbHRlckRlbnNlTGluZXMoZGF0YXNldCwgZmlsdGVyZWREYXRhSW5kaWNlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyZWREYXRhID0gW107CiAgICAgICAgICAgICAgICB2YXIgZmlsdGVyZWRJbmRpY2VzTGVuID0gZmlsdGVyZWREYXRhSW5kaWNlcy5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbHRlcmVkSW5kaWNlc0xlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZmlsdGVyZWREYXRhSW5kaWNlc1tpXTsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGFbaV0gPSBkYXRhW2luZGV4XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGFUb0RyYXcuc2V0KGRhdGFzZXQsIFtmaWx0ZXJlZERhdGFdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkYXRhVG9EcmF3OwogICAgICAgIH07CiAgICAgICAgTGluZS5wcm90b3R5cGUuX2ZpbHRlckNyb3BwZWRSZW5kZXJpbmcgPSBmdW5jdGlvbiAoZGF0YXNldCwgaW5kaWNlcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgeFByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpOwogICAgICAgICAgICB2YXIgeVByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwogICAgICAgICAgICB2YXIgZGF0YSA9IGRhdGFzZXQuZGF0YSgpOwogICAgICAgICAgICB2YXIgZmlsdGVyZWREYXRhSW5kaWNlcyA9IFtdOwogICAgICAgICAgICB2YXIgcG9pbnRJblZpZXdwb3J0ID0gZnVuY3Rpb24gKHgsIHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLk1hdGguaW5SYW5nZSh4LCAwLCBfdGhpcy53aWR0aCgpKSAmJgogICAgICAgICAgICAgICAgICAgIHV0aWxzJDEuTWF0aC5pblJhbmdlKHksIDAsIF90aGlzLmhlaWdodCgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbmRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgY3VyclhQb2ludCA9IHhQcm9qZWN0b3IoZGF0YVtpbmRpY2VzW2ldXSwgaW5kaWNlc1tpXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgY3VycllQb2ludCA9IHlQcm9qZWN0b3IoZGF0YVtpbmRpY2VzW2ldXSwgaW5kaWNlc1tpXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgc2hvdWxkU2hvdyA9IHBvaW50SW5WaWV3cG9ydChjdXJyWFBvaW50LCBjdXJyWVBvaW50KTsKICAgICAgICAgICAgICAgIGlmICghc2hvdWxkU2hvdyAmJiBpbmRpY2VzW2kgLSAxXSAhPSBudWxsICYmIGRhdGFbaW5kaWNlc1tpIC0gMV1dICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJldlhQb2ludCA9IHhQcm9qZWN0b3IoZGF0YVtpbmRpY2VzW2kgLSAxXV0sIGluZGljZXNbaSAtIDFdLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJldllQb2ludCA9IHlQcm9qZWN0b3IoZGF0YVtpbmRpY2VzW2kgLSAxXV0sIGluZGljZXNbaSAtIDFdLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgICAgICBzaG91bGRTaG93ID0gc2hvdWxkU2hvdyB8fCBwb2ludEluVmlld3BvcnQocHJldlhQb2ludCwgcHJldllQb2ludCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNob3cgJiYgaW5kaWNlc1tpICsgMV0gIT0gbnVsbCAmJiBkYXRhW2luZGljZXNbaSArIDFdXSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRYUG9pbnQgPSB4UHJvamVjdG9yKGRhdGFbaW5kaWNlc1tpICsgMV1dLCBpbmRpY2VzW2kgKyAxXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5leHRZUG9pbnQgPSB5UHJvamVjdG9yKGRhdGFbaW5kaWNlc1tpICsgMV1dLCBpbmRpY2VzW2kgKyAxXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgc2hvdWxkU2hvdyA9IHNob3VsZFNob3cgfHwgcG9pbnRJblZpZXdwb3J0KG5leHRYUG9pbnQsIG5leHRZUG9pbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3VsZFNob3cpIHsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZERhdGFJbmRpY2VzLnB1c2goaW5kaWNlc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkRGF0YUluZGljZXM7CiAgICAgICAgfTsKICAgICAgICBMaW5lLnByb3RvdHlwZS5fZmlsdGVyRG93bnNhbXBsaW5nID0gZnVuY3Rpb24gKGRhdGFzZXQsIGluZGljZXMpIHsKICAgICAgICAgICAgaWYgKGluZGljZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEoKTsKICAgICAgICAgICAgdmFyIHNjYWxlZFhBY2Nlc3NvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpOwogICAgICAgICAgICB2YXIgc2NhbGVkWUFjY2Vzc29yID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CiAgICAgICAgICAgIHZhciBmaWx0ZXJlZEluZGljZXMgPSBbaW5kaWNlc1swXV07CiAgICAgICAgICAgIHZhciBpbmRleE9uQ3VycmVudFNsb3BlID0gZnVuY3Rpb24gKGksIGN1cnJlbnRTbG9wZSkgewogICAgICAgICAgICAgICAgdmFyIHAxeCA9IHNjYWxlZFhBY2Nlc3NvcihkYXRhW2luZGljZXNbaV1dLCBpbmRpY2VzW2ldLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBwMXkgPSBzY2FsZWRZQWNjZXNzb3IoZGF0YVtpbmRpY2VzW2ldXSwgaW5kaWNlc1tpXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgcDJ4ID0gc2NhbGVkWEFjY2Vzc29yKGRhdGFbaW5kaWNlc1tpICsgMV1dLCBpbmRpY2VzW2kgKyAxXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgcDJ5ID0gc2NhbGVkWUFjY2Vzc29yKGRhdGFbaW5kaWNlc1tpICsgMV1dLCBpbmRpY2VzW2kgKyAxXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFNsb3BlID09PSBJbmZpbml0eSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHAxeCkgPT09IE1hdGguZmxvb3IocDJ4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHZhciBleHBlY3RlZFAyeSA9IHAxeSArIChwMnggLSBwMXgpICogY3VycmVudFNsb3BlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHAyeSkgPT09IE1hdGguZmxvb3IoZXhwZWN0ZWRQMnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoIC0gMTspIHsKICAgICAgICAgICAgICAgIHZhciBpbmRleEZpcnN0ID0gaW5kaWNlc1tpXTsKICAgICAgICAgICAgICAgIHZhciBwMXggPSBzY2FsZWRYQWNjZXNzb3IoZGF0YVtpbmRpY2VzW2ldXSwgaW5kaWNlc1tpXSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgcDF5ID0gc2NhbGVkWUFjY2Vzc29yKGRhdGFbaW5kaWNlc1tpXV0sIGluZGljZXNbaV0sIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIHAyeCA9IHNjYWxlZFhBY2Nlc3NvcihkYXRhW2luZGljZXNbaSArIDFdXSwgaW5kaWNlc1tpICsgMV0sIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIHAyeSA9IHNjYWxlZFlBY2Nlc3NvcihkYXRhW2luZGljZXNbaSArIDFdXSwgaW5kaWNlc1tpICsgMV0sIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIGN1cnJlbnRTbG9wZSA9IChNYXRoLmZsb29yKHAxeCkgPT09IE1hdGguZmxvb3IocDJ4KSkgPyBJbmZpbml0eSA6IChwMnkgLSBwMXkpIC8gKHAyeCAtIHAxeCk7CiAgICAgICAgICAgICAgICB2YXIgaW5kZXhNaW4gPSBpbmRpY2VzW2ldOwogICAgICAgICAgICAgICAgdmFyIG1pblNjYWxlZFZhbHVlID0gKGN1cnJlbnRTbG9wZSA9PT0gSW5maW5pdHkpID8gcDF5IDogcDF4OwogICAgICAgICAgICAgICAgdmFyIGluZGV4TWF4ID0gaW5kZXhNaW47CiAgICAgICAgICAgICAgICB2YXIgbWF4U2NhbGVkVmFsdWUgPSBtaW5TY2FsZWRWYWx1ZTsKICAgICAgICAgICAgICAgIHZhciBmaXJzdEluZGV4T25DdXJyZW50U2xvcGUgPSB0cnVlOwogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBpbmRpY2VzLmxlbmd0aCAtIDEgJiYgKGZpcnN0SW5kZXhPbkN1cnJlbnRTbG9wZSB8fCBpbmRleE9uQ3VycmVudFNsb3BlKGksIGN1cnJlbnRTbG9wZSkpKSB7CiAgICAgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgICAgICAgIGZpcnN0SW5kZXhPbkN1cnJlbnRTbG9wZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyU2NhbGVkVmFsdWUgPSBjdXJyZW50U2xvcGUgPT09IEluZmluaXR5ID8gc2NhbGVkWUFjY2Vzc29yKGRhdGFbaW5kaWNlc1tpXV0sIGluZGljZXNbaV0sIGRhdGFzZXQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVkWEFjY2Vzc29yKGRhdGFbaW5kaWNlc1tpXV0sIGluZGljZXNbaV0sIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyU2NhbGVkVmFsdWUgPiBtYXhTY2FsZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBtYXhTY2FsZWRWYWx1ZSA9IGN1cnJTY2FsZWRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXhNYXggPSBpbmRpY2VzW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VyclNjYWxlZFZhbHVlIDwgbWluU2NhbGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluU2NhbGVkVmFsdWUgPSBjdXJyU2NhbGVkVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4TWluID0gaW5kaWNlc1tpXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaW5kZXhMYXN0ID0gaW5kaWNlc1tpXTsKICAgICAgICAgICAgICAgIGlmIChpbmRleE1pbiAhPT0gaW5kZXhGaXJzdCkgewogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5kaWNlcy5wdXNoKGluZGV4TWluKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpbmRleE1heCAhPT0gaW5kZXhNaW4gJiYgaW5kZXhNYXggIT09IGluZGV4Rmlyc3QpIHsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluZGljZXMucHVzaChpbmRleE1heCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaW5kZXhMYXN0ICE9PSBpbmRleEZpcnN0ICYmIGluZGV4TGFzdCAhPT0gaW5kZXhNaW4gJiYgaW5kZXhMYXN0ICE9PSBpbmRleE1heCkgewogICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5kaWNlcy5wdXNoKGluZGV4TGFzdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkSW5kaWNlczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIENvbGxhcHNlIGxpbmUgZ2VvbWV0cnkKICAgICAgICAgKgogICAgICAgICAqIEFzc3VtaW5nIHRoYXQgdGhlcmUgYXJlIG1hbnkgcG9pbnRzIHRoYXQgYXJlIGRyYXduIG9uIHRoZSBzYW1lIGNvb3JkaW5hdGUsCiAgICAgICAgICogd2UgY2FuIHNhdmUgYSBsb3Qgb2YgcmVuZGVyIHRpbWUgYnkganVzdCBkcmF3aW5nIG9uZSBsaW5lIGZyb20gdGhlIG1pbiB0bwogICAgICAgICAqIG1heCB5LWNvb3JkaW5hdGUgb2YgYWxsIHRob3NlIHBvaW50cy4KICAgICAgICAgKi8KICAgICAgICBMaW5lLnByb3RvdHlwZS5fZmlsdGVyRGVuc2VMaW5lcyA9IGZ1bmN0aW9uIChkYXRhc2V0LCBpbmRpY2VzKSB7CiAgICAgICAgICAgIGlmIChpbmRpY2VzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YXNldC5kYXRhKCk7CiAgICAgICAgICAgIHZhciBzY2FsZWRYQWNjZXNzb3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTsKICAgICAgICAgICAgdmFyIHNjYWxlZFlBY2Nlc3NvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55KCkpOwogICAgICAgICAgICB2YXIgeEZuID0gZnVuY3Rpb24gKGkpIHsgcmV0dXJuIHNjYWxlZFhBY2Nlc3NvcihkYXRhW2ldLCBpLCBkYXRhc2V0KTsgfTsKICAgICAgICAgICAgdmFyIHlGbiA9IGZ1bmN0aW9uIChpKSB7IHJldHVybiBzY2FsZWRZQWNjZXNzb3IoZGF0YVtpXSwgaSwgZGF0YXNldCk7IH07CiAgICAgICAgICAgIC8vIFRPRE8gZGV0ZXJtaW5lIGlmIHdlIHNob3VsZCBjb2xsYXBzZSB4IG9yIHkgb3Igbm90IGNvbGxhcHNlIGF0IGFsbC4KICAgICAgICAgICAgLy8gRm9yIG5vdywgd2UgYXNzdW1lIGxpbmUgY2hhcnRzIGFyZSBhbHdheXMgYSBmdW5jdGlvbiBvZiB4CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9idWNrZXRCeVgoZGF0YXNldCwgaW5kaWNlcywgeEZuLCB5Rm4pOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogSXRlcmF0ZXMgb3ZlciB0aGUgbGluZSBwb2ludHMgY29sbGFwc2luZyBwb2ludHMgdGhhdCBmYWxsIG9uIHRoZSBzYW1lCiAgICAgICAgICogZmxvb3JlZCB4IGNvb3JkaW5hdGUuCiAgICAgICAgICoKICAgICAgICAgKiBPbmNlIGFsbCB0aGUgcG9pbnRzIHdpdGggdGhlIHNhbWUgeCBjb29yZGluYXRlIGFyZSBkZXRlY3RlZCwgd2UgZHJhdyBhCiAgICAgICAgICogc2luZ2xlIGxpbmUgZnJvbSB0aGUgbWluIHRvIG1heCB5IGNvb3JpbmRhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgImVudHJhbmNlIiBhbmQgImV4aXQiIGxpbmVzIHRvL2Zyb20gdGhpcyBjb2xsYXBzZWQgdmVydGljYWwgbGluZSBhcmUKICAgICAgICAgKiBhbHNvIGRyYXduLiBUaGlzIGFsbG93cyBsaW5lcyB3aXRoIG5vIGNvbGxhcHNlZCBzZWdtZW50cyB0byByZW5kZXIKICAgICAgICAgKiBjb3JyZWN0bHkuCiAgICAgICAgICovCiAgICAgICAgTGluZS5wcm90b3R5cGUuX2J1Y2tldEJ5WCA9IGZ1bmN0aW9uIChkYXRhc2V0LCBpbmRpY2VzLCB4Rm4sIHlGbikgewogICAgICAgICAgICB2YXIgZmlsdGVyZWRJbmRpY2VzID0gW107CiAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YXNldC5kYXRhKCk7CiAgICAgICAgICAgIHZhciBidWNrZXQgPSBudWxsOwogICAgICAgICAgICB2YXIgaW5kaWNlc0xlbmd0aCA9IGluZGljZXMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKHZhciBpaSA9IDA7IGlpIDw9IGluZGljZXNMZW5ndGg7ICsraWkpIHsKICAgICAgICAgICAgICAgIHZhciBpID0gaW5kaWNlc1tpaV07CiAgICAgICAgICAgICAgICBpZiAoZGF0YVtpXSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgeCA9IE1hdGguZmxvb3IoeEZuKGkpKTsKICAgICAgICAgICAgICAgIHZhciB5ID0geUZuKGkpOwogICAgICAgICAgICAgICAgaWYgKGJ1Y2tldCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgYnVja2V0ID0gbmV3IHV0aWxzJDEuQnVja2V0KGksIHgsIHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYnVja2V0LmlzSW5CdWNrZXQoeCkpIHsKICAgICAgICAgICAgICAgICAgICBidWNrZXQuYWRkVG9CdWNrZXQoeSwgaSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZEluZGljZXMucHVzaC5hcHBseShmaWx0ZXJlZEluZGljZXMsIGJ1Y2tldC5nZXRVbmlxdWVJbmRpY2VzKCkpOwogICAgICAgICAgICAgICAgICAgIGJ1Y2tldCA9IG5ldyB1dGlscyQxLkJ1Y2tldChpLCB4LCB5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoYnVja2V0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGZpbHRlcmVkSW5kaWNlcy5wdXNoLmFwcGx5KGZpbHRlcmVkSW5kaWNlcywgYnVja2V0LmdldFVuaXF1ZUluZGljZXMoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkSW5kaWNlczsKICAgICAgICB9OwogICAgICAgIHJldHVybiBMaW5lOwogICAgfSh4eVBsb3QuWFlQbG90KSk7CiAgICBleHBvcnRzLkxpbmUgPSBMaW5lOwogICAgfSk7CgogICAgdmFyIGFyZWFQbG90ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgoKCgoKCgoKICAgIHZhciBBcmVhID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoQXJlYSwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBBbiBBcmVhIFBsb3QgZHJhd3MgYSBmaWxsZWQgcmVnaW9uIChhcmVhKSBiZXR3ZWVuIFkgYW5kIFkwLgogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQXJlYSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuYWRkQ2xhc3MoImFyZWEtcGxvdCIpOwogICAgICAgICAgICBfdGhpcy55MCgwKTsgLy8gZGVmYXVsdAogICAgICAgICAgICBfdGhpcy5hdHRyKCJmaWxsLW9wYWNpdHkiLCAwLjI1KTsKICAgICAgICAgICAgX3RoaXMuYXR0cigiZmlsbCIsIG5ldyBzY2FsZXMuQ29sb3IoKS5yYW5nZSgpWzBdKTsKICAgICAgICAgICAgX3RoaXMuX2xpbmVEcmF3ZXJzID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgQXJlYS5wcm90b3R5cGUueSA9IGZ1bmN0aW9uICh5LCB5U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUueS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh5U2NhbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS55LmNhbGwodGhpcywgeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnkuY2FsbCh0aGlzLCB5LCB5U2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh5U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHkwID0gdGhpcy55MCgpLmFjY2Vzc29yOwogICAgICAgICAgICAgICAgaWYgKHkwICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9iaW5kUHJvcGVydHkoQXJlYS5fWTBfS0VZLCB5MCwgeVNjYWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVlTY2FsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUueTAgPSBmdW5jdGlvbiAoeTApIHsKICAgICAgICAgICAgaWYgKHkwID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChBcmVhLl9ZMF9LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB5QmluZGluZyA9IHRoaXMueSgpOwogICAgICAgICAgICB2YXIgeVNjYWxlID0geUJpbmRpbmcgJiYgeUJpbmRpbmcuc2NhbGU7CiAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShBcmVhLl9ZMF9LRVksIHkwLCB5U2NhbGUpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVZU2NhbGUoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBBcmVhLnByb3RvdHlwZS5fb25EYXRhc2V0VXBkYXRlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlWVNjYWxlKCk7CiAgICAgICAgfTsKICAgICAgICBBcmVhLnByb3RvdHlwZS5fYWRkRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX2xpbmVEcmF3ZXJzLnNldChkYXRhc2V0LCBuZXcgZHJhd2Vycy5Qcm94eURyYXdlcihmdW5jdGlvbiAoKSB7IHJldHVybiBuZXcgbGluZURyYXdlci5MaW5lU1ZHRHJhd2VyKCk7IH0sIGZ1bmN0aW9uIChjdHgpIHsgcmV0dXJuIG5ldyBkcmF3ZXJzLkNhbnZhc0RyYXdlcihjdHgsIGxpbmVEcmF3ZXIubWFrZUxpbmVDYW52YXNEcmF3U3RlcChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgeFByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IoX3RoaXMueCgpKTsKICAgICAgICAgICAgICAgIHZhciB5UHJvamVjdG9yID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihfdGhpcy55KCkpOwogICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9kM0xpbmVGYWN0b3J5KGRhdGFzZXQsIHhQcm9qZWN0b3IsIHlQcm9qZWN0b3IpOwogICAgICAgICAgICB9KSk7IH0pKTsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fYWRkRGF0YXNldC5jYWxsKHRoaXMsIGRhdGFzZXQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEFyZWEucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGRyYXdlciA9IHRoaXMuX2xpbmVEcmF3ZXJzLmdldChkYXRhc2V0KTsKICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIoKSA9PT0gInN2ZyIpIHsKICAgICAgICAgICAgICAgIGRyYXdlci51c2VTVkcodGhpcy5fcmVuZGVyQXJlYSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkcmF3ZXIudXNlQ2FudmFzKHRoaXMuX2NhbnZhcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjsKICAgICAgICB9OwogICAgICAgIEFyZWEucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgdGhpcy5fbGluZURyYXdlcnMuZ2V0KGRhdGFzZXQpLnJlbW92ZSgpOwogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGRyYXdTdGVwcyA9IHRoaXMuX2dlbmVyYXRlTGluZURyYXdTdGVwcygpOwogICAgICAgICAgICB2YXIgZGF0YVRvRHJhdyA9IHRoaXMuX2dldERhdGFUb0RyYXcoKTsKICAgICAgICAgICAgdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgIHZhciBhcHBsaWVkRHJhd1N0ZXBzID0gcGxvdC5QbG90LmFwcGx5RHJhd1N0ZXBzKGRyYXdTdGVwcywgZGF0YXNldCk7CiAgICAgICAgICAgICAgICBfdGhpcy5fbGluZURyYXdlcnMuZ2V0KGRhdGFzZXQpLmRyYXcoZGF0YVRvRHJhdy5nZXQoZGF0YXNldCksIGFwcGxpZWREcmF3U3RlcHMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIEFyZWEucHJvdG90eXBlLl9nZW5lcmF0ZUxpbmVEcmF3U3RlcHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBkcmF3U3RlcHMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSkgewogICAgICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dlbmVyYXRlTGluZUF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJkIl0gPSB0aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLCB0aGlzLl9nZXRSZXNldFlGdW5jdGlvbigpKTsKICAgICAgICAgICAgICAgIGRyYXdTdGVwcy5wdXNoKHsgYXR0clRvUHJvamVjdG9yOiBhdHRyVG9Qcm9qZWN0b3IsIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5SRVNFVCkgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHJhd1N0ZXBzLnB1c2goewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yOiB0aGlzLl9nZW5lcmF0ZUxpbmVBdHRyVG9Qcm9qZWN0b3IoKSwKICAgICAgICAgICAgICAgIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5NQUlOKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkcmF3U3RlcHM7CiAgICAgICAgfTsKICAgICAgICBBcmVhLnByb3RvdHlwZS5fZ2VuZXJhdGVMaW5lQXR0clRvUHJvamVjdG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgbGluZUF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICBsaW5lQXR0clRvUHJvamVjdG9yWyJkIl0gPSB0aGlzLl9jb25zdHJ1Y3RMaW5lUHJvamVjdG9yKHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpLCBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSk7CiAgICAgICAgICAgIHJldHVybiBsaW5lQXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlciA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBuZXcgZHJhd2VyLlByb3h5RHJhd2VyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyBhcmVhRHJhd2VyLkFyZWFTVkdEcmF3ZXIoKTsgfSwgZnVuY3Rpb24gKGN0eCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBkcmF3ZXJzLkNhbnZhc0RyYXdlcihjdHgsIGFyZWFEcmF3ZXIubWFrZUFyZWFDYW52YXNEcmF3U3RlcChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hID0gX3RoaXMuX2Nvb3JkaW5hdGVQcm9qZWN0b3JzKCksIHhQcm9qZWN0b3IgPSBfYVswXSwgeVByb2plY3RvciA9IF9hWzFdLCB5MFByb2plY3RvciA9IF9hWzJdOwogICAgICAgICAgICAgICAgICAgIHZhciBkZWZpbmVkUHJvamVjdG9yID0gX3RoaXMuX2NyZWF0ZURlZmluZWRQcm9qZWN0b3IoeFByb2plY3RvciwgeVByb2plY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF90aGlzLl9jcmVhdGVBcmVhR2VuZXJhdG9yKHhQcm9qZWN0b3IsIHlQcm9qZWN0b3IsIHkwUHJvamVjdG9yLCBkZWZpbmVkUHJvamVjdG9yLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgX2EgPSBfdGhpcy5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSwgeFByb2plY3RvciA9IF9hWzBdLCB5UHJvamVjdG9yID0gX2FbMV07CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlZmluZWRQcm9qZWN0b3IgPSBfdGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3Rvcih4UHJvamVjdG9yLCB5UHJvamVjdG9yKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2NyZWF0ZVRvcExpbmVHZW5lcmF0b3IoeFByb2plY3RvciwgeVByb2plY3RvciwgZGVmaW5lZFByb2plY3RvciwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUuX2dlbmVyYXRlRHJhd1N0ZXBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZHJhd1N0ZXBzID0gW107CiAgICAgICAgICAgIGlmICh0aGlzLl9hbmltYXRlT25OZXh0UmVuZGVyKCkpIHsKICAgICAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsiZCJdID0gdGhpcy5fY29uc3RydWN0QXJlYVByb2plY3RvcihwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwgdGhpcy5fZ2V0UmVzZXRZRnVuY3Rpb24oKSwgcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpKTsKICAgICAgICAgICAgICAgIGRyYXdTdGVwcy5wdXNoKHsgYXR0clRvUHJvamVjdG9yOiBhdHRyVG9Qcm9qZWN0b3IsIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5SRVNFVCkgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHJhd1N0ZXBzLnB1c2goewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yOiB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSwKICAgICAgICAgICAgICAgIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5NQUlOKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkcmF3U3RlcHM7CiAgICAgICAgfTsKICAgICAgICBBcmVhLnByb3RvdHlwZS5fdXBkYXRlWVNjYWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgZXh0ZW50cyA9IHRoaXMuZ2V0RXh0ZW50c0ZvclByb3BlcnR5KCJ5MCIpOwogICAgICAgICAgICB2YXIgZXh0ZW50ID0gdXRpbHMkMS5BcnJheS5mbGF0dGVuKGV4dGVudHMpOwogICAgICAgICAgICB2YXIgdW5pcUV4dGVudFZhbHMgPSB1dGlscyQxLkFycmF5LnVuaXEoZXh0ZW50KTsKICAgICAgICAgICAgdmFyIGNvbnN0YW50QmFzZWxpbmUgPSB1bmlxRXh0ZW50VmFscy5sZW5ndGggPT09IDEgPyB1bmlxRXh0ZW50VmFsc1swXSA6IG51bGw7CiAgICAgICAgICAgIHZhciB5QmluZGluZyA9IHRoaXMueSgpOwogICAgICAgICAgICB2YXIgeVNjYWxlID0gKHlCaW5kaW5nICYmIHlCaW5kaW5nLnNjYWxlKTsKICAgICAgICAgICAgaWYgKHlTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHlTY2FsZS5yZW1vdmVQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uc3RhbnRCYXNlbGluZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb25zdGFudEJhc2VsaW5lVmFsdWVQcm92aWRlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtjb25zdGFudEJhc2VsaW5lXTsgfTsKICAgICAgICAgICAgICAgIHlTY2FsZS5hZGRQYWRkaW5nRXhjZXB0aW9uc1Byb3ZpZGVyKHRoaXMuX2NvbnN0YW50QmFzZWxpbmVWYWx1ZVByb3ZpZGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUuX2dldFJlc2V0WUZ1bmN0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkwKCkpOwogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUuX2Nvb3JkaW5hdGVQcm9qZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSksCiAgICAgICAgICAgICAgICBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSwKICAgICAgICAgICAgICAgIHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MCgpKSwKICAgICAgICAgICAgXTsKICAgICAgICB9OwogICAgICAgIEFyZWEucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBwcm9wZXJ0eVRvUHJvamVjdG9ycyA9IF9zdXBlci5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9jb29yZGluYXRlUHJvamVjdG9ycygpLCB4UHJvamVjdCA9IF9hWzBdLCB5UHJvamVjdG9yID0gX2FbMV0sIHkwUHJvamVjdG9yID0gX2FbMl07CiAgICAgICAgICAgIHByb3BlcnR5VG9Qcm9qZWN0b3JzWyJkIl0gPSB0aGlzLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yKHhQcm9qZWN0LCB5UHJvamVjdG9yLCB5MFByb2plY3Rvcik7CiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVRvUHJvamVjdG9yczsKICAgICAgICB9OwogICAgICAgIEFyZWEucHJvdG90eXBlLnNlbGVjdGlvbnMgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKGRhdGFzZXRzID09PSB2b2lkIDApIHsgZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzKCk7IH0KICAgICAgICAgICAgaWYgKHRoaXMucmVuZGVyZXIoKSA9PT0gImNhbnZhcyIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkMy5zZWxlY3RBbGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYWxsU2VsZWN0aW9ucyA9IF9zdXBlci5wcm90b3R5cGUuc2VsZWN0aW9ucy5jYWxsKHRoaXMsIGRhdGFzZXRzKS5ub2RlcygpOwogICAgICAgICAgICB2YXIgbGluZURyYXdlcnMgPSBkYXRhc2V0cy5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9saW5lRHJhd2Vycy5nZXQoZGF0YXNldCk7IH0pCiAgICAgICAgICAgICAgICAuZmlsdGVyKGZ1bmN0aW9uIChkcmF3ZXIpIHsgcmV0dXJuIGRyYXdlciAhPSBudWxsOyB9KTsKICAgICAgICAgICAgbGluZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbiAobGQpIHsgcmV0dXJuIGFsbFNlbGVjdGlvbnMucHVzaC5hcHBseShhbGxTZWxlY3Rpb25zLCBsZC5nZXRWaXN1YWxQcmltaXRpdmVzKCkpOyB9KTsKICAgICAgICAgICAgcmV0dXJuIGQzLnNlbGVjdEFsbChhbGxTZWxlY3Rpb25zKTsKICAgICAgICB9OwogICAgICAgIEFyZWEucHJvdG90eXBlLl9jb25zdHJ1Y3RBcmVhUHJvamVjdG9yID0gZnVuY3Rpb24gKHhQcm9qZWN0b3IsIHlQcm9qZWN0b3IsIHkwUHJvamVjdG9yKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkZWZpbmVkUHJvamVjdG9yID0gdGhpcy5fY3JlYXRlRGVmaW5lZFByb2plY3RvcihwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSwgcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIGFyZWFHZW5lcmF0b3IgPSBfdGhpcy5fY3JlYXRlQXJlYUdlbmVyYXRvcih4UHJvamVjdG9yLCB5UHJvamVjdG9yLCB5MFByb2plY3RvciwgZGVmaW5lZFByb2plY3RvciwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJlYUdlbmVyYXRvcihkYXR1bSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBBcmVhLnByb3RvdHlwZS5fY3JlYXRlRGVmaW5lZFByb2plY3RvciA9IGZ1bmN0aW9uICh4UHJvamVjdG9yLCB5UHJvamVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIHBvc2l0aW9uWCA9IHhQcm9qZWN0b3IoZCwgaSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgcG9zaXRpb25ZID0geVByb2plY3RvcihkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihwb3NpdGlvblgpICYmIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKHBvc2l0aW9uWSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBBcmVhLnByb3RvdHlwZS5fY3JlYXRlQXJlYUdlbmVyYXRvciA9IGZ1bmN0aW9uICh4UHJvamVjdG9yLCB5UHJvamVjdG9yLCB5MFByb2plY3RvciwgZGVmaW5lZFByb2plY3RvciwgZGF0YXNldCkgewogICAgICAgICAgICAvLyBqdXN0IHJ1bnRpbWUgZXJyb3IgaWYgdXNlciBwYXNzZXMgY3VydmVCdW5kbGUgdG8gYXJlYSBwbG90CiAgICAgICAgICAgIHZhciBjdXJ2ZUZhY3RvcnkgPSB0aGlzLl9nZXRDdXJ2ZUZhY3RvcnkoKTsKICAgICAgICAgICAgdmFyIGFyZWFHZW5lcmF0b3IgPSBkMy5hcmVhKCkKICAgICAgICAgICAgICAgIC54KGZ1bmN0aW9uIChpbm5lckRhdHVtLCBpbm5lckluZGV4KSB7IHJldHVybiB4UHJvamVjdG9yKGlubmVyRGF0dW0sIGlubmVySW5kZXgsIGRhdGFzZXQpOyB9KQogICAgICAgICAgICAgICAgLnkxKGZ1bmN0aW9uIChpbm5lckRhdHVtLCBpbm5lckluZGV4KSB7IHJldHVybiB5UHJvamVjdG9yKGlubmVyRGF0dW0sIGlubmVySW5kZXgsIGRhdGFzZXQpOyB9KQogICAgICAgICAgICAgICAgLnkwKGZ1bmN0aW9uIChpbm5lckRhdHVtLCBpbm5lckluZGV4KSB7IHJldHVybiB5MFByb2plY3Rvcihpbm5lckRhdHVtLCBpbm5lckluZGV4LCBkYXRhc2V0KTsgfSkKICAgICAgICAgICAgICAgIC5jdXJ2ZShjdXJ2ZUZhY3RvcnkpCiAgICAgICAgICAgICAgICAuZGVmaW5lZChmdW5jdGlvbiAoaW5uZXJEYXR1bSwgaW5uZXJJbmRleCkgeyByZXR1cm4gZGVmaW5lZFByb2plY3Rvcihpbm5lckRhdHVtLCBpbm5lckluZGV4LCBkYXRhc2V0KTsgfSk7CiAgICAgICAgICAgIHJldHVybiBhcmVhR2VuZXJhdG9yOwogICAgICAgIH07CiAgICAgICAgQXJlYS5wcm90b3R5cGUuX2NyZWF0ZVRvcExpbmVHZW5lcmF0b3IgPSBmdW5jdGlvbiAoeFByb2plY3RvciwgeVByb2plY3RvciwgZGVmaW5lZFByb2plY3RvciwgZGF0YXNldCkgewogICAgICAgICAgICB2YXIgY3VydmVGYWN0b3J5ID0gdGhpcy5fZ2V0Q3VydmVGYWN0b3J5KCk7CiAgICAgICAgICAgIHZhciBhcmVhR2VuZXJhdG9yID0gZDMubGluZSgpCiAgICAgICAgICAgICAgICAueChmdW5jdGlvbiAoaW5uZXJEYXR1bSwgaW5uZXJJbmRleCkgeyByZXR1cm4geFByb2plY3Rvcihpbm5lckRhdHVtLCBpbm5lckluZGV4LCBkYXRhc2V0KTsgfSkKICAgICAgICAgICAgICAgIC55KGZ1bmN0aW9uIChpbm5lckRhdHVtLCBpbm5lckluZGV4KSB7IHJldHVybiB5UHJvamVjdG9yKGlubmVyRGF0dW0sIGlubmVySW5kZXgsIGRhdGFzZXQpOyB9KQogICAgICAgICAgICAgICAgLmN1cnZlKGN1cnZlRmFjdG9yeSkKICAgICAgICAgICAgICAgIC5kZWZpbmVkKGZ1bmN0aW9uIChpbm5lckRhdHVtLCBpbm5lckluZGV4KSB7IHJldHVybiBkZWZpbmVkUHJvamVjdG9yKGlubmVyRGF0dW0sIGlubmVySW5kZXgsIGRhdGFzZXQpOyB9KTsKICAgICAgICAgICAgcmV0dXJuIGFyZWFHZW5lcmF0b3I7CiAgICAgICAgfTsKICAgICAgICBBcmVhLl9ZMF9LRVkgPSAieTAiOwogICAgICAgIHJldHVybiBBcmVhOwogICAgfShsaW5lUGxvdC5MaW5lKSk7CiAgICBleHBvcnRzLkFyZWEgPSBBcmVhOwogICAgfSk7CgogICAgdmFyIGJhclBsb3QgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgoKCgoKCgoKCgoKCiAgICBleHBvcnRzLkJhck9yaWVudGF0aW9uID0gbWFrZUVudW1fMS5tYWtlRW51bShbInZlcnRpY2FsIiwgImhvcml6b250YWwiXSk7CiAgICBleHBvcnRzLkxhYmVsc1Bvc2l0aW9uID0gbWFrZUVudW1fMS5tYWtlRW51bShbInN0YXJ0IiwgIm1pZGRsZSIsICJlbmQiLCAib3V0c2lkZSJdKTsKICAgIGV4cG9ydHMuQmFyQWxpZ25tZW50ID0gbWFrZUVudW1fMS5tYWtlRW51bShbInN0YXJ0IiwgIm1pZGRsZSIsICJlbmQiXSk7CiAgICB2YXIgQmFyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoQmFyLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEEgQmFyIFBsb3QgZHJhd3MgYmFycyBncm93aW5nIG91dCBmcm9tIGEgYmFzZWxpbmUgdG8gc29tZSB2YWx1ZQogICAgICAgICAqCiAgICAgICAgICogQGNvbnN0cnVjdG9yCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IFtvcmllbnRhdGlvbj0idmVydGljYWwiXSBPbmUgb2YgInZlcnRpY2FsIi8iaG9yaXpvbnRhbCIuCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gQmFyKG9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gdm9pZCAwKSB7IG9yaWVudGF0aW9uID0gInZlcnRpY2FsIjsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fbGFiZWxGb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzLmlkZW50aXR5KCk7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbHNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbHNQb3NpdGlvbiA9IGV4cG9ydHMuTGFiZWxzUG9zaXRpb24uZW5kOwogICAgICAgICAgICBfdGhpcy5faGlkZUJhcnNJZkFueUFyZVRvb1dpZGUgPSB0cnVlOwogICAgICAgICAgICBfdGhpcy5fYmFyQWxpZ25tZW50ID0gIm1pZGRsZSI7CiAgICAgICAgICAgIF90aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MgPSBtZW1vaXplLm1lbW9pemUoY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgYWxsIHRoZSBiYXJzIGluIHRoaXMgYmFyUGxvdCBoYXZlIHRoZSBzYW1lIHBpeGVsIHRoaWNrbmVzcy4KICAgICAgICAgICAgICogSWYgc28sIHVzZSB0aGUgX2JhclBpeGVsVGhpY2tuZXNzIHByb3BlcnR5IHRvIGFjY2VzcyB0aGUgdGhpY2tuZXNzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgX3RoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3MgPSB0cnVlOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygiYmFyLXBsb3QiKTsKICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uICE9PSAidmVydGljYWwiICYmIG9yaWVudGF0aW9uICE9PSAiaG9yaXpvbnRhbCIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihvcmllbnRhdGlvbiArICIgaXMgbm90IGEgdmFsaWQgb3JpZW50YXRpb24gZm9yIFBsb3RzLkJhciIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF90aGlzLl9pc1ZlcnRpY2FsID0gb3JpZW50YXRpb24gPT09ICJ2ZXJ0aWNhbCI7CiAgICAgICAgICAgIF90aGlzLmFuaW1hdG9yKCJiYXNlbGluZSIsIG5ldyBhbmltYXRvcnMuTnVsbCgpKTsKICAgICAgICAgICAgX3RoaXMuYXR0cigiZmlsbCIsIG5ldyBzY2FsZXMuQ29sb3IoKS5yYW5nZSgpWzBdKTsKICAgICAgICAgICAgX3RoaXMuYXR0cihCYXIuX0JBUl9USElDS05FU1NfS0VZLCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTsgfSk7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbENvbmZpZyA9IG5ldyB1dGlscyQxLk1hcCgpOwogICAgICAgICAgICBfdGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW190aGlzLmJhc2VsaW5lVmFsdWUoKV07IH07CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgQmFyLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLCBvcmlnaW4sIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVFeHRlbnRzKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS54ID0gZnVuY3Rpb24gKHgsIHhTY2FsZSkgewogICAgICAgICAgICBpZiAoeCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS54LmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHhTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnguY2FsbCh0aGlzLCB4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueC5jYWxsKHRoaXMsIHgsIHhTY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGhpY2tuZXNzQXR0cigpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVMZW5ndGhTY2FsZSgpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUueSA9IGZ1bmN0aW9uICh5LCB5U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUueS5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh5U2NhbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS55LmNhbGwodGhpcywgeSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnkuY2FsbCh0aGlzLCB5LCB5U2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUxlbmd0aFNjYWxlKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGJpbmRpbmcgYXNzb2NpYXRlZCB3aXRoIGJhciBsZW5ndGguIExlbmd0aCBpcyB0aGUgY291bnQgb3IgdmFsdWUgdGhlIGJhciBpcyB0cnlpbmcgdG8gc2hvdy4KICAgICAgICAgKiBUaGlzIGlzIHRoZSAueSgpIGZvciBhIHZlcnRpY2FsIHBsb3QgYW5kIC54KCkgZm9yIGEgaG9yaXpvbnRhbCBwbG90LgogICAgICAgICAqLwogICAgICAgIEJhci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faXNWZXJ0aWNhbCA/IHRoaXMueSgpIDogdGhpcy54KCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYmluZGluZyBhc3NvY2lhdGVkIHdpdGggYmFyIHBvc2l0aW9uLiBQb3NpdGlvbiBzZXBhcmF0ZXMgdGhlIGRpZmZlcmVudCBiYXIgY2F0ZWdvcmllcy4KICAgICAgICAgKiBUaGlzIGlzIHRoZSAueCgpIGZvciBhIHZlcnRpY2FsIHBsb3QgYW5kIC55KCkgZm9yIGEgaG9yaXpvbnRhbCBwbG90LgogICAgICAgICAqLwogICAgICAgIEJhci5wcm90b3R5cGUucG9zaXRpb24gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc1ZlcnRpY2FsID8gdGhpcy54KCkgOiB0aGlzLnkoKTsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuYmFyRW5kID0gZnVuY3Rpb24gKGVuZCkgewogICAgICAgICAgICBpZiAoZW5kID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChCYXIuX0JBUl9FTkRfS0VZKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYmluZGluZyA9IHRoaXMucG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIHNjYWxlID0gYmluZGluZyAmJiBiaW5kaW5nLnNjYWxlOwogICAgICAgICAgICB0aGlzLl9iaW5kUHJvcGVydHkoQmFyLl9CQVJfRU5EX0tFWSwgZW5kLCBzY2FsZSk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRoaWNrbmVzc0F0dHIoKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLmJhckFsaWdubWVudCA9IGZ1bmN0aW9uIChhbGlnbikgewogICAgICAgICAgICBpZiAoYWxpZ24gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JhckFsaWdubWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9iYXJBbGlnbm1lbnQgPSBhbGlnbjsKICAgICAgICAgICAgdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwbG90CiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuICJ2ZXJ0aWNhbCIgfCAiaG9yaXpvbnRhbCIKICAgICAgICAgKi8KICAgICAgICBCYXIucHJvdG90eXBlLm9yaWVudGF0aW9uID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faXNWZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCI7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgZHJhd2VyLlByb3h5RHJhd2VyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyByZWN0YW5nbGVEcmF3ZXIuUmVjdGFuZ2xlU1ZHRHJhd2VyKEJhci5fQkFSX0FSRUFfQ0xBU1MpOyB9LCBmdW5jdGlvbiAoY3R4KSB7IHJldHVybiBuZXcgZHJhd2Vycy5SZWN0YW5nbGVDYW52YXNEcmF3ZXIoY3R4KTsgfSk7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLl9zZXR1cCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fc2V0dXAuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fYmFzZWxpbmUgPSB0aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgibGluZSIpLmNsYXNzZWQoImJhc2VsaW5lIiwgdHJ1ZSk7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLmJhc2VsaW5lVmFsdWUgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYXNlbGluZVZhbHVlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFzZWxpbmVWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fcHJvamVjdG9yc1JlYWR5KCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsZW5ndGhTY2FsZSA9IHRoaXMubGVuZ3RoKCkuc2NhbGU7CiAgICAgICAgICAgICAgICBpZiAoIWxlbmd0aFNjYWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoU2NhbGUgaW5zdGFuY2VvZiBzY2FsZXMuVGltZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSgwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Jhc2VsaW5lVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGVuZ3RoU2NhbGUoKTsKICAgICAgICAgICAgdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuYWRkRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuYWRkRGF0YXNldC5jYWxsKHRoaXMsIGRhdGFzZXQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX2FkZERhdGFzZXQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9hZGREYXRhc2V0LmNhbGwodGhpcywgZGF0YXNldCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0ID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5yZW1vdmVEYXRhc2V0LmNhbGwodGhpcywgZGF0YXNldCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fcmVtb3ZlRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLmRhdGFzZXRzID0gZnVuY3Rpb24gKGRhdGFzZXRzKSB7CiAgICAgICAgICAgIGlmIChkYXRhc2V0cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5kYXRhc2V0cy5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuZGF0YXNldHMuY2FsbCh0aGlzLCBkYXRhc2V0cyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5sYWJlbHNFbmFibGVkID0gZnVuY3Rpb24gKGVuYWJsZWQsIGxhYmVsc1Bvc2l0aW9uKSB7CiAgICAgICAgICAgIGlmIChlbmFibGVkID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxzRW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICAgICAgICAgICBpZiAobGFiZWxzUG9zaXRpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsc1Bvc2l0aW9uID0gbGFiZWxzUG9zaXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7CiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxGb3JtYXR0ZXIgPSBmb3JtYXR0ZXI7CiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhckF0dHJUb1Byb2plY3RvckNhY2hlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIHZhciBkcmF3ZXIgPSBfc3VwZXIucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGxhYmVsQXJlYSA9IHRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChCYXIuX0xBQkVMX0FSRUFfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBzcmMkMS5TdmdDb250ZXh0KGxhYmVsQXJlYS5ub2RlKCkpOwogICAgICAgICAgICB2YXIgbWVhc3VyZXIgPSBuZXcgc3JjJDEuQ2FjaGVNZWFzdXJlcihjb250ZXh0KTsKICAgICAgICAgICAgdmFyIHdyaXRlciA9IG5ldyBzcmMkMS5Xcml0ZXIobWVhc3VyZXIsIGNvbnRleHQpOwogICAgICAgICAgICB0aGlzLl9sYWJlbENvbmZpZy5zZXQoZGF0YXNldCwgeyBsYWJlbEFyZWE6IGxhYmVsQXJlYSwgbWVhc3VyZXI6IG1lYXN1cmVyLCB3cml0ZXI6IHdyaXRlciB9KTsKICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2RlcyA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgbGFiZWxDb25maWcgPSB0aGlzLl9sYWJlbENvbmZpZy5nZXQoZGF0YXNldCk7CiAgICAgICAgICAgIGlmIChsYWJlbENvbmZpZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBsYWJlbENvbmZpZy5sYWJlbEFyZWEucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9sYWJlbENvbmZpZy5kZWxldGUoZGF0YXNldCk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIFBsb3RFbnRpdHkgbmVhcmVzdCB0byB0aGUgcXVlcnkgcG9pbnQgYWNjb3JkaW5nIHRvIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtOgogICAgICAgICAqICAgLSBJZiB0aGUgcXVlcnkgcG9pbnQgaXMgaW5zaWRlIGEgYmFyLCByZXR1cm5zIHRoZSBQbG90RW50aXR5IGZvciB0aGF0IGJhci4KICAgICAgICAgKiAgIC0gT3RoZXJ3aXNlLCBnZXRzIHRoZSBuZWFyZXN0IFBsb3RFbnRpdHkgYnkgdGhlIHBvc2l0aW9uYWwgZGlyZWN0aW9uIChYIGZvciB2ZXJ0aWNhbCwgWSBmb3IgaG9yaXpvbnRhbCksCiAgICAgICAgICogICAgIGJyZWFraW5nIHRpZXMgd2l0aCB0aGUgc2Vjb25kYXJ5IGRpcmVjdGlvbi4KICAgICAgICAgKiBSZXR1cm5zIHVuZGVmaW5lZCBpZiBubyBQbG90RW50aXR5IGNhbiBiZSBmb3VuZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7UG9pbnR9IHF1ZXJ5UG9pbnQKICAgICAgICAgKiBAcmV0dXJucyB7UGxvdEVudGl0eX0gVGhlIG5lYXJlc3QgUGxvdEVudGl0eSwgb3IgdW5kZWZpbmVkIGlmIG5vIFBsb3RFbnRpdHkgY2FuIGJlIGZvdW5kLgogICAgICAgICAqLwogICAgICAgIEJhci5wcm90b3R5cGUuZW50aXR5TmVhcmVzdCA9IGZ1bmN0aW9uIChxdWVyeVBvaW50KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciB3b3JrZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgbmVhcmVzdCA9IF90aGlzLl9pc1ZlcnRpY2FsID8KICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZ2V0RW50aXR5U3RvcmUoKS5lbnRpdHlOZWFyZXN0WChxdWVyeVBvaW50KSA6CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXR5TmVhcmVzdFkocXVlcnlQb2ludCk7CiAgICAgICAgICAgICAgICByZXR1cm4gbmVhcmVzdCA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogX3RoaXMuX2xpZ2h0d2VpZ2h0UGxvdEVudGl0eVRvUGxvdEVudGl0eShuZWFyZXN0KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3MgPyB0aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQod29ya2VyKSA6IHdvcmtlcigpOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgRW50aXRpZXMgYXQgYSBwYXJ0aWN1bGFyIFBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQb2ludH0gcAogICAgICAgICAqIEByZXR1cm5zIHtQbG90RW50aXR5W119CiAgICAgICAgICovCiAgICAgICAgQmFyLnByb3RvdHlwZS5lbnRpdGllc0F0ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHdvcmtlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9lbnRpdGllc0ludGVyc2VjdGluZyhwLngsIHAueSk7IH07CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzID8gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKHdvcmtlcikgOiB3b3JrZXIoKTsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuZW50aXRpZXNJbkJvdW5kcyA9IGZ1bmN0aW9uIChxdWVyeUJvdW5kcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgd29ya2VyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5lbnRpdGllc0luQm91bmRzLmNhbGwoX3RoaXMsIHF1ZXJ5Qm91bmRzKTsgfTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3MgPyB0aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3MuZG9Mb2NrZWQod29ya2VyKSA6IHdvcmtlcigpOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcyA9IGZ1bmN0aW9uIChxdWVyeUJvdW5kcykgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgd29ya2VyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5lbnRpdGllc0luWEJvdW5kcy5jYWxsKF90aGlzLCBxdWVyeUJvdW5kcyk7IH07CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzID8gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKHdvcmtlcikgOiB3b3JrZXIoKTsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHMgPSBmdW5jdGlvbiAocXVlcnlCb3VuZHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHdvcmtlciA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuZW50aXRpZXNJbllCb3VuZHMuY2FsbChfdGhpcywgcXVlcnlCb3VuZHMpOyB9OwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcyA/IHRoaXMuX2NvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcy5kb0xvY2tlZCh3b3JrZXIpIDogd29ya2VyKCk7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLl9lbnRpdGllc0ludGVyc2VjdGluZyA9IGZ1bmN0aW9uICh4VmFsT3JSYW5nZSwgeVZhbE9yUmFuZ2UpIHsKICAgICAgICAgICAgdmFyIGludGVyc2VjdGVkID0gW107CiAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IHRoaXMuX2dldEVudGl0eVN0b3JlKCkuZW50aXRpZXMoKTsKICAgICAgICAgICAgdmFyIGVudGl0aWVzTGVuID0gZW50aXRpZXMubGVuZ3RoOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGVudGl0aWVzTGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBlbnRpdHkgPSBlbnRpdGllc1tpXTsKICAgICAgICAgICAgICAgIGlmICh1dGlscyQxLkRPTS5pbnRlcnNlY3RzQkJveCh4VmFsT3JSYW5nZSwgeVZhbE9yUmFuZ2UsIHRoaXMuX2VudGl0eUJvdW5kcyhlbnRpdHkpKSkgewogICAgICAgICAgICAgICAgICAgIGludGVyc2VjdGVkLnB1c2godGhpcy5fbGlnaHR3ZWlnaHRQbG90RW50aXR5VG9QbG90RW50aXR5KGVudGl0eSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbnRlcnNlY3RlZDsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX3VwZGF0ZUxlbmd0aFNjYWxlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGxlbmd0aFNjYWxlID0gdGhpcy5sZW5ndGgoKS5zY2FsZTsKICAgICAgICAgICAgaWYgKGxlbmd0aFNjYWxlIGluc3RhbmNlb2YgcXVhbnRpdGF0aXZlU2NhbGUuUXVhbnRpdGF0aXZlU2NhbGUpIHsKICAgICAgICAgICAgICAgIGxlbmd0aFNjYWxlLmFkZFBhZGRpbmdFeGNlcHRpb25zUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKTsKICAgICAgICAgICAgICAgIGxlbmd0aFNjYWxlLmFkZEluY2x1ZGVkVmFsdWVzUHJvdmlkZXIodGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5yZW5kZXJJbW1lZGlhdGVseSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgLy8gSEFDSyB1cGRhdGUgYmFyIHBpeGVsIHRoaWNrbmVzcwogICAgICAgICAgICB0aGlzLl9iYXJQaXhlbFRoaWNrbmVzcygpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29tcHV0ZUJhclBpeGVsVGhpY2tuZXNzLmRvTG9ja2VkKGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUucmVuZGVySW1tZWRpYXRlbHkuY2FsbChfdGhpcyk7IH0pOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50ID0gZnVuY3Rpb24gKHRpbWUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGxlbmd0aFNjYWxlID0gdGhpcy5sZW5ndGgoKS5zY2FsZTsKICAgICAgICAgICAgdmFyIHNjYWxlZEJhc2VsaW5lID0gbGVuZ3RoU2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpOwogICAgICAgICAgICB2YXIgYmFzZWxpbmVBdHRyID0gewogICAgICAgICAgICAgICAgeDE6IHRoaXMuX2lzVmVydGljYWwgPyAwIDogc2NhbGVkQmFzZWxpbmUsCiAgICAgICAgICAgICAgICB5MTogdGhpcy5faXNWZXJ0aWNhbCA/IHNjYWxlZEJhc2VsaW5lIDogMCwKICAgICAgICAgICAgICAgIHgyOiB0aGlzLl9pc1ZlcnRpY2FsID8gdGhpcy53aWR0aCgpIDogc2NhbGVkQmFzZWxpbmUsCiAgICAgICAgICAgICAgICB5MjogdGhpcy5faXNWZXJ0aWNhbCA/IHNjYWxlZEJhc2VsaW5lIDogdGhpcy5oZWlnaHQoKSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fZ2V0QW5pbWF0b3IoImJhc2VsaW5lIikuYW5pbWF0ZSh0aGlzLl9iYXNlbGluZSwgYmFzZWxpbmVBdHRyKTsKICAgICAgICAgICAgdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9sYWJlbENvbmZpZy5nZXQoZGF0YXNldCkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOyB9KTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhYmVsc0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHV0aWxzJDEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2RyYXdMYWJlbHMoKTsgfSwgdGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIE1ha2VzIHN1cmUgdGhlIGV4dGVudCB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHdpZHRocyBvZiB0aGUgYmFycwogICAgICAgICAqLwogICAgICAgIEJhci5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBleHRlbnRzID0gX3N1cGVyLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLCBwcm9wZXJ0eSk7CiAgICAgICAgICAgIHZhciBhY2NTY2FsZUJpbmRpbmc7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gIngiICYmIHRoaXMuX2lzVmVydGljYWwpIHsKICAgICAgICAgICAgICAgIGFjY1NjYWxlQmluZGluZyA9IHRoaXMueCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09PSAieSIgJiYgIXRoaXMuX2lzVmVydGljYWwpIHsKICAgICAgICAgICAgICAgIGFjY1NjYWxlQmluZGluZyA9IHRoaXMueSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGV4dGVudHM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCEoYWNjU2NhbGVCaW5kaW5nICYmIGFjY1NjYWxlQmluZGluZy5zY2FsZSAmJiBhY2NTY2FsZUJpbmRpbmcuc2NhbGUgaW5zdGFuY2VvZiBxdWFudGl0YXRpdmVTY2FsZS5RdWFudGl0YXRpdmVTY2FsZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzY2FsZSA9IGFjY1NjYWxlQmluZGluZy5zY2FsZTsKICAgICAgICAgICAgdmFyIHdpZHRoID0gdGhpcy5fYmFyUGl4ZWxUaGlja25lc3MoKTsKICAgICAgICAgICAgLy8gVG8gYWNjb3VudCBmb3IgaW52ZXJ0ZWQgZG9tYWlucwogICAgICAgICAgICBleHRlbnRzID0gZXh0ZW50cy5tYXAoZnVuY3Rpb24gKGV4dGVudCkgeyByZXR1cm4gZDMuZXh0ZW50KFsKICAgICAgICAgICAgICAgIHNjYWxlLmludmVydChfdGhpcy5fZ2V0UG9zaXRpb25BdHRyKHNjYWxlLnNjYWxlKGV4dGVudFswXSksIHdpZHRoKSksCiAgICAgICAgICAgICAgICBzY2FsZS5pbnZlcnQoX3RoaXMuX2dldFBvc2l0aW9uQXR0cihzY2FsZS5zY2FsZShleHRlbnRbMF0pLCB3aWR0aCkgKyB3aWR0aCksCiAgICAgICAgICAgICAgICBzY2FsZS5pbnZlcnQoX3RoaXMuX2dldFBvc2l0aW9uQXR0cihzY2FsZS5zY2FsZShleHRlbnRbMV0pLCB3aWR0aCkpLAogICAgICAgICAgICAgICAgc2NhbGUuaW52ZXJ0KF90aGlzLl9nZXRQb3NpdGlvbkF0dHIoc2NhbGUuc2NhbGUoZXh0ZW50WzFdKSwgd2lkdGgpICsgd2lkdGgpLAogICAgICAgICAgICBdKTsgfSk7CiAgICAgICAgICAgIHJldHVybiBleHRlbnRzOwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJuIHRoZSA8cmVjdD4ncyB4IG9yIHkgYXR0ciB2YWx1ZSBnaXZlbiB0aGUgcG9zaXRpb24gYW5kIHRoaWNrbmVzcyBvZgogICAgICAgICAqIHRoYXQgYmFyLiBUaGlzIG1ldGhvZCBpcyByZXNwb25zaWJsZSBmb3IgYWNjb3VudCBmb3IgYmFyQWxpZ25tZW50LCBpbiBwYXJ0aWN1bGFyLgogICAgICAgICAqLwogICAgICAgIEJhci5wcm90b3R5cGUuX2dldFBvc2l0aW9uQXR0ciA9IGZ1bmN0aW9uIChwb3NpdGlvbiwgdGhpY2tuZXNzKSB7CiAgICAgICAgICAgIC8vIGFjY291bnQgZm9yIGZsaXBwZWQgdmVydGljYWwgYXhpcwogICAgICAgICAgICBpZiAoIXRoaXMuX2lzVmVydGljYWwpIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uIC09IHRoaWNrbmVzczsKICAgICAgICAgICAgICAgIHRoaWNrbmVzcyAqPSAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHRoaXMuX2JhckFsaWdubWVudCkgewogICAgICAgICAgICAgICAgY2FzZSAic3RhcnQiOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKICAgICAgICAgICAgICAgIGNhc2UgImVuZCI6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uIC0gdGhpY2tuZXNzOwogICAgICAgICAgICAgICAgY2FzZSAibWlkZGxlIjoKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uIC0gdGhpY2tuZXNzIC8gMjsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fZHJhd0xhYmVscyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGRhdGFUb0RyYXcgPSB0aGlzLl9nZXREYXRhVG9EcmF3KCk7CiAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKICAgICAgICAgICAgdmFyIGFueUxhYmVsVG9vV2lkZSA9IHRoaXMuZGF0YXNldHMoKS5zb21lKGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVRvRHJhdy5nZXQoZGF0YXNldCkuc29tZShmdW5jdGlvbiAoZGF0dW0sIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdHVtID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2RyYXdMYWJlbChkYXR1bSwgaW5kZXgsIGRhdGFzZXQsIGF0dHJUb1Byb2plY3Rvcik7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9oaWRlQmFyc0lmQW55QXJlVG9vV2lkZSAmJiBhbnlMYWJlbFRvb1dpZGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhc2V0KSB7IHJldHVybiBfdGhpcy5fbGFiZWxDb25maWcuZ2V0KGRhdGFzZXQpLmxhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX2RyYXdMYWJlbCA9IGZ1bmN0aW9uIChkYXR1bSwgaW5kZXgsIGRhdGFzZXQsIGF0dHJUb1Byb2plY3RvcikgewogICAgICAgICAgICB2YXIgX2EgPSB0aGlzLl9sYWJlbENvbmZpZy5nZXQoZGF0YXNldCksIGxhYmVsQXJlYSA9IF9hLmxhYmVsQXJlYSwgbWVhc3VyZXIgPSBfYS5tZWFzdXJlciwgd3JpdGVyID0gX2Eud3JpdGVyOwogICAgICAgICAgICB2YXIgbGVuZ3RoQWNjZXNzb3IgPSB0aGlzLmxlbmd0aCgpLmFjY2Vzc29yOwogICAgICAgICAgICB2YXIgbGVuZ3RoID0gbGVuZ3RoQWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGxlbmd0aFNjYWxlID0gdGhpcy5sZW5ndGgoKS5zY2FsZTsKICAgICAgICAgICAgdmFyIHNjYWxlZExlbmd0aCA9IGxlbmd0aFNjYWxlICE9IG51bGwgPyBsZW5ndGhTY2FsZS5zY2FsZShsZW5ndGgpIDogbGVuZ3RoOwogICAgICAgICAgICB2YXIgc2NhbGVkQmFzZWxpbmUgPSBsZW5ndGhTY2FsZSAhPSBudWxsID8gbGVuZ3RoU2NhbGUuc2NhbGUodGhpcy5iYXNlbGluZVZhbHVlKCkpIDogdGhpcy5iYXNlbGluZVZhbHVlKCk7CiAgICAgICAgICAgIHZhciBiYXJDb29yZGluYXRlcyA9IHsgeDogYXR0clRvUHJvamVjdG9yWyJ4Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSwgeTogYXR0clRvUHJvamVjdG9yWyJ5Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB9OwogICAgICAgICAgICB2YXIgYmFyRGltZW5zaW9ucyA9IHsgd2lkdGg6IGF0dHJUb1Byb2plY3Rvclsid2lkdGgiXShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpLCBoZWlnaHQ6IGF0dHJUb1Byb2plY3RvclsiaGVpZ2h0Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB9OwogICAgICAgICAgICB2YXIgdGV4dCA9IHRoaXMuX2xhYmVsRm9ybWF0dGVyKGxlbmd0aCwgZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIG1lYXN1cmVtZW50ID0gbWVhc3VyZXIubWVhc3VyZSh0ZXh0KTsKICAgICAgICAgICAgdmFyIHNob3dMYWJlbE9uQmFyID0gdGhpcy5fc2hvdWxkU2hvd0xhYmVsT25CYXIoYmFyQ29vcmRpbmF0ZXMsIGJhckRpbWVuc2lvbnMsIG1lYXN1cmVtZW50KTsKICAgICAgICAgICAgLy8gc2hvdyBsYWJlbCBvbiByaWdodCB3aGVuIHZhbHVlID09PSBiYXNlbGluZSBmb3IgaG9yaXpvbnRhbCBwbG90cwogICAgICAgICAgICB2YXIgYWJvdmVPckxlZnRPZkJhc2VsaW5lID0gdGhpcy5faXNWZXJ0aWNhbCA/IHNjYWxlZExlbmd0aCA8PSBzY2FsZWRCYXNlbGluZSA6IHNjYWxlZExlbmd0aCA8IHNjYWxlZEJhc2VsaW5lOwogICAgICAgICAgICB2YXIgX2IgPSB0aGlzLl9jYWxjdWxhdGVMYWJlbFByb3BlcnRpZXMoYmFyQ29vcmRpbmF0ZXMsIGJhckRpbWVuc2lvbnMsIG1lYXN1cmVtZW50LCBzaG93TGFiZWxPbkJhciwgYWJvdmVPckxlZnRPZkJhc2VsaW5lKSwgY29udGFpbmVyRGltZW5zaW9ucyA9IF9iLmNvbnRhaW5lckRpbWVuc2lvbnMsIGxhYmVsQ29udGFpbmVyT3JpZ2luID0gX2IubGFiZWxDb250YWluZXJPcmlnaW4sIGxhYmVsT3JpZ2luID0gX2IubGFiZWxPcmlnaW4sIGFsaWdubWVudCA9IF9iLmFsaWdubWVudDsKICAgICAgICAgICAgdmFyIGNvbG9yID0gYXR0clRvUHJvamVjdG9yWyJmaWxsIl0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGxhYmVsQ29udGFpbmVyID0gdGhpcy5fY3JlYXRlTGFiZWxDb250YWluZXIobGFiZWxBcmVhLCBsYWJlbENvbnRhaW5lck9yaWdpbiwgbGFiZWxPcmlnaW4sIG1lYXN1cmVtZW50LCBzaG93TGFiZWxPbkJhciwgY29sb3IpOwogICAgICAgICAgICB2YXIgd3JpdGVPcHRpb25zID0geyB4QWxpZ246IGFsaWdubWVudC54LCB5QWxpZ246IGFsaWdubWVudC55IH07CiAgICAgICAgICAgIHdyaXRlci53cml0ZSh0ZXh0LCBjb250YWluZXJEaW1lbnNpb25zLndpZHRoLCBjb250YWluZXJEaW1lbnNpb25zLmhlaWdodCwgd3JpdGVPcHRpb25zLCBsYWJlbENvbnRhaW5lci5ub2RlKCkpOwogICAgICAgICAgICB2YXIgdG9vV2lkZSA9IHRoaXMuX2lzVmVydGljYWwKICAgICAgICAgICAgICAgID8gYmFyRGltZW5zaW9ucy53aWR0aCA8IChtZWFzdXJlbWVudC53aWR0aCkKICAgICAgICAgICAgICAgIDogYmFyRGltZW5zaW9ucy5oZWlnaHQgPCAobWVhc3VyZW1lbnQuaGVpZ2h0KTsKICAgICAgICAgICAgcmV0dXJuIHRvb1dpZGU7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBMYWJlbHMgYXJlICJvbi1iYXIiIGJ5IGRlZmF1bHQsIGJ1dCBpZiB0aGUgYmFyIGlzIG5vdCBsb25nIGVub3VnaCB0byBmaXQgdGhlIHRleHQsCiAgICAgICAgICogd2UgY2FuIHRyeSBwdXR0aW5nIHRoZSBsYWJlbCAib2ZmLWJhciIsIGlmIHRoZXJlJ3MgZW5vdWdoIHNwYWNlIG91dHNpZGUgb2YgdGhlIGJhcgogICAgICAgICAqIHRvIGZpdCBpdC4KICAgICAgICAgKi8KICAgICAgICBCYXIucHJvdG90eXBlLl9zaG91bGRTaG93TGFiZWxPbkJhciA9IGZ1bmN0aW9uIChiYXJDb29yZGluYXRlcywgYmFyRGltZW5zaW9ucywgbGFiZWxEaW1lbnNpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9sYWJlbHNQb3NpdGlvbiA9PT0gZXhwb3J0cy5MYWJlbHNQb3NpdGlvbi5vdXRzaWRlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGJhclN0YXJ0ID0gdGhpcy5faXNWZXJ0aWNhbCA/IGJhckNvb3JkaW5hdGVzLnkgOiBiYXJDb29yZGluYXRlcy54OwogICAgICAgICAgICB2YXIgYmFyTGVuZ3RoID0gdGhpcy5faXNWZXJ0aWNhbCA/IGJhckRpbWVuc2lvbnMuaGVpZ2h0IDogYmFyRGltZW5zaW9ucy53aWR0aDsKICAgICAgICAgICAgdmFyIHRvdGFsTGVuZ3RoID0gdGhpcy5faXNWZXJ0aWNhbCA/IHRoaXMuaGVpZ2h0KCkgOiB0aGlzLndpZHRoKCk7CiAgICAgICAgICAgIHZhciBsYWJlbExlbmd0aCA9IHRoaXMuX2lzVmVydGljYWwgPyBsYWJlbERpbWVuc2lvbnMuaGVpZ2h0IDogbGFiZWxEaW1lbnNpb25zLndpZHRoOwogICAgICAgICAgICB2YXIgYmFyRW5kID0gYmFyU3RhcnQgKyBiYXJMZW5ndGg7CiAgICAgICAgICAgIHZhciBiYXJMZW5ndGhWaXNpYmxlT25TY3JlZW4gPSBiYXJMZW5ndGg7CiAgICAgICAgICAgIGlmIChiYXJFbmQgPiB0b3RhbExlbmd0aCkgewogICAgICAgICAgICAgICAgYmFyTGVuZ3RoVmlzaWJsZU9uU2NyZWVuID0gdG90YWxMZW5ndGggLSBiYXJTdGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChiYXJTdGFydCA8IDApIHsKICAgICAgICAgICAgICAgIGJhckxlbmd0aFZpc2libGVPblNjcmVlbiA9IGJhckVuZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKGxhYmVsTGVuZ3RoICsgQmFyLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUiA8PSBiYXJMZW5ndGhWaXNpYmxlT25TY3JlZW4pOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKGJhckNvb3JkaW5hdGVzLCBiYXJEaW1lbnNpb25zLCBtZWFzdXJlbWVudCwgc2hvd0xhYmVsT25CYXIsIGFib3ZlT3JMZWZ0T2ZCYXNlbGluZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgYmFyQ29vcmRpbmF0ZSA9IHRoaXMuX2lzVmVydGljYWwgPyBiYXJDb29yZGluYXRlcy55IDogYmFyQ29vcmRpbmF0ZXMueDsKICAgICAgICAgICAgdmFyIGJhckRpbWVuc2lvbiA9IHRoaXMuX2lzVmVydGljYWwgPyBiYXJEaW1lbnNpb25zLmhlaWdodCA6IGJhckRpbWVuc2lvbnMud2lkdGg7CiAgICAgICAgICAgIHZhciBtZWFzdXJlbWVudERpbWVuc2lvbiA9IHRoaXMuX2lzVmVydGljYWwgPyBtZWFzdXJlbWVudC5oZWlnaHQgOiBtZWFzdXJlbWVudC53aWR0aDsKICAgICAgICAgICAgdmFyIGFsaWdubWVudERpbWVuc2lvbiA9ICJjZW50ZXIiOwogICAgICAgICAgICB2YXIgY29udGFpbmVyRGltZW5zaW9uID0gYmFyRGltZW5zaW9uOwogICAgICAgICAgICB2YXIgbGFiZWxDb250YWluZXJPcmlnaW5Db29yZGluYXRlID0gYmFyQ29vcmRpbmF0ZTsKICAgICAgICAgICAgdmFyIGxhYmVsT3JpZ2luQ29vcmRpbmF0ZSA9IGJhckNvb3JkaW5hdGU7CiAgICAgICAgICAgIHZhciB1cGRhdGVDb29yZGluYXRlcyA9IGZ1bmN0aW9uIChwb3NpdGlvbikgewogICAgICAgICAgICAgICAgc3dpdGNoIChwb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGNhc2UgInRvcExlZnQiOgogICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnREaW1lbnNpb24gPSBfdGhpcy5faXNWZXJ0aWNhbCA/ICJ0b3AiIDogImxlZnQiOwogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENvbnRhaW5lck9yaWdpbkNvb3JkaW5hdGUgKz0gQmFyLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPcmlnaW5Db29yZGluYXRlICs9IEJhci5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYXNlICJjZW50ZXIiOgogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbE9yaWdpbkNvb3JkaW5hdGUgKz0gKGJhckRpbWVuc2lvbiArIG1lYXN1cmVtZW50RGltZW5zaW9uKSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICBjYXNlICJib3R0b21SaWdodCI6CiAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdubWVudERpbWVuc2lvbiA9IF90aGlzLl9pc1ZlcnRpY2FsID8gImJvdHRvbSIgOiAicmlnaHQiOwogICAgICAgICAgICAgICAgICAgICAgICBsYWJlbENvbnRhaW5lck9yaWdpbkNvb3JkaW5hdGUgLT0gQmFyLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUjsKICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxPcmlnaW5Db29yZGluYXRlICs9IGNvbnRhaW5lckRpbWVuc2lvbiAtIEJhci5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIgLSBtZWFzdXJlbWVudERpbWVuc2lvbjsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc2hvd0xhYmVsT25CYXIpIHsKICAgICAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fbGFiZWxzUG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIGV4cG9ydHMuTGFiZWxzUG9zaXRpb24uc3RhcnQ6CiAgICAgICAgICAgICAgICAgICAgICAgIGFib3ZlT3JMZWZ0T2ZCYXNlbGluZSA/IHVwZGF0ZUNvb3JkaW5hdGVzKCJib3R0b21SaWdodCIpIDogdXBkYXRlQ29vcmRpbmF0ZXMoInRvcExlZnQiKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBleHBvcnRzLkxhYmVsc1Bvc2l0aW9uLm1pZGRsZToKICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ29vcmRpbmF0ZXMoImNlbnRlciIpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIGV4cG9ydHMuTGFiZWxzUG9zaXRpb24uZW5kOgogICAgICAgICAgICAgICAgICAgICAgICBhYm92ZU9yTGVmdE9mQmFzZWxpbmUgPyB1cGRhdGVDb29yZGluYXRlcygidG9wTGVmdCIpIDogdXBkYXRlQ29vcmRpbmF0ZXMoImJvdHRvbVJpZ2h0Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGFib3ZlT3JMZWZ0T2ZCYXNlbGluZSkgewogICAgICAgICAgICAgICAgICAgIGFsaWdubWVudERpbWVuc2lvbiA9IHRoaXMuX2lzVmVydGljYWwgPyAidG9wIiA6ICJsZWZ0IjsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXJEaW1lbnNpb24gPSBiYXJEaW1lbnNpb24gKyBCYXIuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSICsgbWVhc3VyZW1lbnREaW1lbnNpb247CiAgICAgICAgICAgICAgICAgICAgbGFiZWxDb250YWluZXJPcmlnaW5Db29yZGluYXRlIC09IEJhci5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVIgKyBtZWFzdXJlbWVudERpbWVuc2lvbjsKICAgICAgICAgICAgICAgICAgICBsYWJlbE9yaWdpbkNvb3JkaW5hdGUgLT0gQmFyLl9MQUJFTF9NQVJHSU5fSU5TSURFX0JBUiArIG1lYXN1cmVtZW50RGltZW5zaW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYWxpZ25tZW50RGltZW5zaW9uID0gdGhpcy5faXNWZXJ0aWNhbCA/ICJib3R0b20iIDogInJpZ2h0IjsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXJEaW1lbnNpb24gPSBiYXJEaW1lbnNpb24gKyBCYXIuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSICsgbWVhc3VyZW1lbnREaW1lbnNpb247CiAgICAgICAgICAgICAgICAgICAgbGFiZWxPcmlnaW5Db29yZGluYXRlICs9IGJhckRpbWVuc2lvbiArIEJhci5fTEFCRUxfTUFSR0lOX0lOU0lERV9CQVI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGNvbnRhaW5lckRpbWVuc2lvbnM6IHsKICAgICAgICAgICAgICAgICAgICB3aWR0aDogdGhpcy5faXNWZXJ0aWNhbCA/IGJhckRpbWVuc2lvbnMud2lkdGggOiBjb250YWluZXJEaW1lbnNpb24sCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiB0aGlzLl9pc1ZlcnRpY2FsID8gY29udGFpbmVyRGltZW5zaW9uIDogYmFyRGltZW5zaW9ucy5oZWlnaHQsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgbGFiZWxDb250YWluZXJPcmlnaW46IHsKICAgICAgICAgICAgICAgICAgICB4OiB0aGlzLl9pc1ZlcnRpY2FsID8gYmFyQ29vcmRpbmF0ZXMueCA6IGxhYmVsQ29udGFpbmVyT3JpZ2luQ29vcmRpbmF0ZSwKICAgICAgICAgICAgICAgICAgICB5OiB0aGlzLl9pc1ZlcnRpY2FsID8gbGFiZWxDb250YWluZXJPcmlnaW5Db29yZGluYXRlIDogYmFyQ29vcmRpbmF0ZXMueSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBsYWJlbE9yaWdpbjogewogICAgICAgICAgICAgICAgICAgIHg6IHRoaXMuX2lzVmVydGljYWwgPyAoYmFyQ29vcmRpbmF0ZXMueCArIGJhckRpbWVuc2lvbnMud2lkdGggLyAyIC0gbWVhc3VyZW1lbnQud2lkdGggLyAyKSA6IGxhYmVsT3JpZ2luQ29vcmRpbmF0ZSwKICAgICAgICAgICAgICAgICAgICB5OiB0aGlzLl9pc1ZlcnRpY2FsID8gbGFiZWxPcmlnaW5Db29yZGluYXRlIDogKGJhckNvb3JkaW5hdGVzLnkgKyBiYXJEaW1lbnNpb25zLmhlaWdodCAvIDIgLSBtZWFzdXJlbWVudC5oZWlnaHQgLyAyKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IHsKICAgICAgICAgICAgICAgICAgICB4OiB0aGlzLl9pc1ZlcnRpY2FsID8gImNlbnRlciIgOiBhbGlnbm1lbnREaW1lbnNpb24sCiAgICAgICAgICAgICAgICAgICAgeTogdGhpcy5faXNWZXJ0aWNhbCA/IGFsaWdubWVudERpbWVuc2lvbiA6ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX2NyZWF0ZUxhYmVsQ29udGFpbmVyID0gZnVuY3Rpb24gKGxhYmVsQXJlYSwgbGFiZWxDb250YWluZXJPcmlnaW4sIGxhYmVsT3JpZ2luLCBtZWFzdXJlbWVudCwgc2hvd0xhYmVsT25CYXIsIGNvbG9yKSB7CiAgICAgICAgICAgIHZhciBsYWJlbENvbnRhaW5lciA9IGxhYmVsQXJlYS5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyBsYWJlbENvbnRhaW5lck9yaWdpbi54ICsgIiwgIiArIGxhYmVsQ29udGFpbmVyT3JpZ2luLnkgKyAiKSIpOwogICAgICAgICAgICBpZiAoc2hvd0xhYmVsT25CYXIpIHsKICAgICAgICAgICAgICAgIGxhYmVsQ29udGFpbmVyLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsIHRydWUpOwogICAgICAgICAgICAgICAgdmFyIGRhcmsgPSB1dGlscyQxLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsIGNvbG9yKSAqIDEuNiA8IHV0aWxzJDEuQ29sb3IuY29udHJhc3QoImJsYWNrIiwgY29sb3IpOwogICAgICAgICAgICAgICAgbGFiZWxDb250YWluZXIuY2xhc3NlZChkYXJrID8gImRhcmstbGFiZWwiIDogImxpZ2h0LWxhYmVsIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsYWJlbENvbnRhaW5lci5jbGFzc2VkKCJvZmYtYmFyLWxhYmVsIiwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxhYmVsQ29udGFpbmVyOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBkcmF3U3RlcHMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSkgewogICAgICAgICAgICAgICAgdmFyIHJlc2V0QXR0clRvUHJvamVjdG9yID0gdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoU2NhbGUgPSB0aGlzLmxlbmd0aCgpLnNjYWxlOwogICAgICAgICAgICAgICAgdmFyIHNjYWxlZEJhc2VsaW5lXzEgPSBsZW5ndGhTY2FsZS5zY2FsZSh0aGlzLmJhc2VsaW5lVmFsdWUoKSk7CiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoQXR0ciA9IHRoaXMuX2lzVmVydGljYWwgPyAieSIgOiAieCI7CiAgICAgICAgICAgICAgICB2YXIgdGhpY2tuZXNzQXR0ciA9IHRoaXMuX2lzVmVydGljYWwgPyAiaGVpZ2h0IiA6ICJ3aWR0aCI7CiAgICAgICAgICAgICAgICByZXNldEF0dHJUb1Byb2plY3RvcltsZW5ndGhBdHRyXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNjYWxlZEJhc2VsaW5lXzE7IH07CiAgICAgICAgICAgICAgICByZXNldEF0dHJUb1Byb2plY3Rvclt0aGlja25lc3NBdHRyXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDA7IH07CiAgICAgICAgICAgICAgICBkcmF3U3RlcHMucHVzaCh7IGF0dHJUb1Byb2plY3RvcjogcmVzZXRBdHRyVG9Qcm9qZWN0b3IsIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5SRVNFVCkgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHJhd1N0ZXBzLnB1c2goewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yOiB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSwKICAgICAgICAgICAgICAgIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5NQUlOKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkcmF3U3RlcHM7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IF9zdXBlci5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHZhciBsZW5ndGhTY2FsZSA9IHRoaXMubGVuZ3RoKCkuc2NhbGU7CiAgICAgICAgICAgIHZhciBzY2FsZWRCYXNlbGluZSA9IGxlbmd0aFNjYWxlLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTsKICAgICAgICAgICAgdmFyIGxlbmd0aEF0dHIgPSB0aGlzLl9pc1ZlcnRpY2FsID8gInkiIDogIngiOwogICAgICAgICAgICB2YXIgcG9zaXRpb25BdHRyID0gdGhpcy5faXNWZXJ0aWNhbCA/ICJ4IiA6ICJ5IjsKICAgICAgICAgICAgdmFyIHBvc2l0aW9uRiA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5wb3NpdGlvbigpKTsKICAgICAgICAgICAgdmFyIG9yaWdpbmFsTGVuZ3RoRm4gPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMubGVuZ3RoKCkpOwogICAgICAgICAgICB2YXIgbGVuZ3RoRm4gPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHNjYWxlZEJhc2VsaW5lIC0gb3JpZ2luYWxMZW5ndGhGbihkLCBpLCBkYXRhc2V0KSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0aGlja25lc3NGID0gYXR0clRvUHJvamVjdG9yW0Jhci5fQkFSX1RISUNLTkVTU19LRVldOwogICAgICAgICAgICB2YXIgZ2FwRiA9IGF0dHJUb1Byb2plY3RvclsiZ2FwIl07CiAgICAgICAgICAgIHZhciB0aGlja25lc3NNaW51c0dhcCA9IGdhcEYgPT0gbnVsbCA/IHRoaWNrbmVzc0YgOiBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIHRoaWNrID0gdGhpY2tuZXNzRihkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIC8vIG9ubHkgc3VidHJhY3QgZ2FwIGlmIGJhcnMgYXJlIGF0IGxlYXN0IDIgcGl4ZWxzIHdpZGUsIG90aGVyd2lzZSBjYW52YXMKICAgICAgICAgICAgICAgIC8vIGludGVycG9sYXRpb24gY2FuIGNhdXNlIGJhcnMgdG8gYmVjb21lIGludmlzaWJsZSBkdWUgdG8gc3VicGl4ZWwKICAgICAgICAgICAgICAgIC8vIHNhbXBsaW5nCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpY2sgPCBCYXIuX0JBUl9HQVBMRVNTX1RIUkVTSE9MRF9QWCA/IHRoaWNrIDogdGhpY2sgLSBnYXBGKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyByZS1pbnRlcnByZXQgIndpZHRoIiBhdHRyIGZyb20gcmVwcmVzZW50aW5nICJ0aGlja25lc3MiIHRvIGFjdHVhbGx5IG1lYW5pbmcKICAgICAgICAgICAgLy8gd2lkdGggKHRoYXQgaXMsIHgtZGlyZWN0aW9uIHNwZWNpZmljKSBhZ2FpbgogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbIndpZHRoIl0gPSB0aGlzLl9pc1ZlcnRpY2FsID8gdGhpY2tuZXNzTWludXNHYXAgOiBsZW5ndGhGbjsKICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXSA9IHRoaXMuX2lzVmVydGljYWwgPyBsZW5ndGhGbiA6IHRoaWNrbmVzc01pbnVzR2FwOwogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbbGVuZ3RoQXR0cl0gPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsTGVuZ3RoID0gb3JpZ2luYWxMZW5ndGhGbihkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIHBhc3QgdGhlIGJhc2VsaW5lLCBpdCBzaG91bGQgc3RhcnQgYXQgdGhlIGJhc2VsaW5lIHRoZW4gd2lkdGgvaGVpZ2h0CiAgICAgICAgICAgICAgICAvLyBjYXJyaWVzIGl0IG92ZXIuIElmIGl0J3Mgbm90IHBhc3QgdGhlIGJhc2VsaW5lLCBsZWF2ZSBpdCBhdCBvcmlnaW5hbCBwb3NpdGlvbiBhbmQKICAgICAgICAgICAgICAgIC8vIHRoZW4gd2lkdGgvaGVpZ2h0IGNhcnJpZXMgaXQgdG8gYmFzZWxpbmUKICAgICAgICAgICAgICAgIHJldHVybiAob3JpZ2luYWxMZW5ndGggPiBzY2FsZWRCYXNlbGluZSkgPyBzY2FsZWRCYXNlbGluZSA6IG9yaWdpbmFsTGVuZ3RoOwogICAgICAgICAgICB9OwogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbcG9zaXRpb25BdHRyXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2dldFBvc2l0aW9uQXR0cihwb3NpdGlvbkYoZCwgaSwgZGF0YXNldCksIHRoaWNrbmVzc0YoZCwgaSwgZGF0YXNldCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gYXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fdXBkYXRlVGhpY2tuZXNzQXR0ciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHN0YXJ0UHJvaiA9IHRoaXMucG9zaXRpb24oKTsKICAgICAgICAgICAgdmFyIGVuZFByb2ogPSB0aGlzLmJhckVuZCgpOwogICAgICAgICAgICBpZiAoc3RhcnRQcm9qICE9IG51bGwgJiYgZW5kUHJvaiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9maXhlZEJhclBpeGVsVGhpY2tuZXNzID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHIoQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSwgZnVuY3Rpb24gKGQsIGksIGRhdGEpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdjEgPSBzdGFydFByb2ouYWNjZXNzb3IoZCwgaSwgZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHYyID0gZW5kUHJvai5hY2Nlc3NvcihkLCBpLCBkYXRhKTsKICAgICAgICAgICAgICAgICAgICB2MSA9IHN0YXJ0UHJvai5zY2FsZSA/IHN0YXJ0UHJvai5zY2FsZS5zY2FsZSh2MSkgOiB2MTsKICAgICAgICAgICAgICAgICAgICB2MiA9IGVuZFByb2ouc2NhbGUgPyBlbmRQcm9qLnNjYWxlLnNjYWxlKHYyKSA6IHYyOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyh2MiAtIHYxKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZml4ZWRCYXJQaXhlbFRoaWNrbmVzcyA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmF0dHIoQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2JhclBpeGVsVGhpY2tuZXNzKCk7IH0pOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLl9iYXJQaXhlbFRoaWNrbmVzcyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZpeGVkQmFyUGl4ZWxUaGlja25lc3MpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb21wdXRlQmFyUGl4ZWxUaGlja25lc3ModGhpcy5wb3NpdGlvbigpLCB0aGlzLmRhdGFzZXRzKCksIHRoaXMuX2lzVmVydGljYWwgPyB0aGlzLndpZHRoKCkgOiB0aGlzLmhlaWdodCgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuZW50aXRpZXMgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgaWYgKGRhdGFzZXRzID09PSB2b2lkIDApIHsgZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzKCk7IH0KICAgICAgICAgICAgaWYgKCF0aGlzLl9wcm9qZWN0b3JzUmVhZHkoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IF9zdXBlci5wcm90b3R5cGUuZW50aXRpZXMuY2FsbCh0aGlzLCBkYXRhc2V0cyk7CiAgICAgICAgICAgIHJldHVybiBlbnRpdGllczsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX2VudGl0eUJvdW5kcyA9IGZ1bmN0aW9uIChlbnRpdHkpIHsKICAgICAgICAgICAgdmFyIGRhdHVtID0gZW50aXR5LmRhdHVtLCBpbmRleCA9IGVudGl0eS5pbmRleCwgZGF0YXNldCA9IGVudGl0eS5kYXRhc2V0OwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGl4ZWxCb3VuZHMoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIFRoZSByZWN0YW5ndWxhciBib3VuZHMgb2YgYSBiYXIuIE5vdGUgdGhhdCB0aGUgeC95IGNvb3JkaW5hdGVzIGFyZSBub3QgdGhlCiAgICAgICAgICogc2FtZSBhcyB0aGUgInBpeGVsIHBvaW50IiBiZWNhdXNlIHRoZXkgYXJlIGFsd2F5cyBhdCB0aGUgdG9wL2xlZnQgb2YgdGhlCiAgICAgICAgICogYmFyLgogICAgICAgICAqLwogICAgICAgIEJhci5wcm90b3R5cGUuX3BpeGVsQm91bmRzID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB4OiBhdHRyVG9Qcm9qZWN0b3JbIngiXShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpLAogICAgICAgICAgICAgICAgeTogYXR0clRvUHJvamVjdG9yWyJ5Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSwKICAgICAgICAgICAgICAgIHdpZHRoOiBhdHRyVG9Qcm9qZWN0b3JbIndpZHRoIl0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSwKICAgICAgICAgICAgICAgIGhlaWdodDogYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlICJwaXhlbCBwb2ludCIgb2YgYSBiYXIgaXMgdGhlIGZhcnRoZXN0IHBvaW50IGZyb20gdGhlIGJhc2VsaW5lLgogICAgICAgICAqCiAgICAgICAgICogRm9yIGV4YW1wbGUsIGluIGEgdmVydGljYWwgYmFyIGNoYXJ0IHdpdGggcG9zaXRpdmUgYmFyIHZhbHVlcywgdGhlIHBpeGVsCiAgICAgICAgICogcG9pbnQgd2lsbCBiZSBhdCB0aGUgdG9wIG9mIHRoZSBiYXIuIEZvciBuZWdhdGl2ZSBiYXIgdmFsdWVzLCB0aGUgcGl4ZWwKICAgICAgICAgKiBwb2ludCB3aWxsIGJlIGF0IHRoZSBib3R0b20gb2YgdGhlIGJhci4KICAgICAgICAgKi8KICAgICAgICBCYXIucHJvdG90eXBlLl9waXhlbFBvaW50ID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICB2YXIgcmVjdCA9IHRoaXMuX3BpeGVsQm91bmRzKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgIHZhciBvcmlnaW5hbFBvc2l0aW9uID0gKHRoaXMuX2lzVmVydGljYWwgPyBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKSA6IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54KCkpKShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgc2NhbGVkQmFzZWxpbmUgPSAodGhpcy5faXNWZXJ0aWNhbCA/IHRoaXMueSgpLnNjYWxlIDogdGhpcy54KCkuc2NhbGUpLnNjYWxlKHRoaXMuYmFzZWxpbmVWYWx1ZSgpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BpeGVsUG9pbnRCYXIob3JpZ2luYWxQb3NpdGlvbiwgc2NhbGVkQmFzZWxpbmUsIHJlY3QpOwogICAgICAgIH07CiAgICAgICAgQmFyLnByb3RvdHlwZS5fcGl4ZWxQb2ludEJhciA9IGZ1bmN0aW9uIChvcmlnaW5hbFBvc2l0aW9uLCBzY2FsZWRCYXNlbGluZSwgcmVjdCkgewogICAgICAgICAgICB2YXIgeCwgeTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzVmVydGljYWwpIHsKICAgICAgICAgICAgICAgIHggPSByZWN0LnggKyByZWN0LndpZHRoIC8gMjsKICAgICAgICAgICAgICAgIHkgPSBvcmlnaW5hbFBvc2l0aW9uIDw9IHNjYWxlZEJhc2VsaW5lID8gcmVjdC55IDogcmVjdC55ICsgcmVjdC5oZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB4ID0gb3JpZ2luYWxQb3NpdGlvbiA+PSBzY2FsZWRCYXNlbGluZSA/IHJlY3QueCArIHJlY3Qud2lkdGggOiByZWN0Lng7CiAgICAgICAgICAgICAgICB5ID0gcmVjdC55ICsgcmVjdC5oZWlnaHQgLyAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHg6IHgsIHk6IHkgfTsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX3VuaW5zdGFsbFNjYWxlRm9yS2V5ID0gZnVuY3Rpb24gKHNjYWxlLCBrZXkpIHsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5fdW5pbnN0YWxsU2NhbGVGb3JLZXkuY2FsbCh0aGlzLCBzY2FsZSwga2V5KTsKICAgICAgICB9OwogICAgICAgIEJhci5wcm90b3R5cGUuX2dldERhdGFUb0RyYXcgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkYXRhVG9EcmF3ID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKICAgICAgICAgICAgdmFyIHBsb3RXaWR0aCA9IHRoaXMud2lkdGgoKTsKICAgICAgICAgICAgdmFyIHBsb3RIZWlnaHQgPSB0aGlzLmhlaWdodCgpOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEoKS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNWYWxpZCA9IF90aGlzLl9pc0RhdHVtT25TY3JlZW4oYXR0clRvUHJvamVjdG9yLCBwbG90V2lkdGgsIHBsb3RIZWlnaHQsIGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkID8gZCA6IG51bGw7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRhdGFUb0RyYXcuc2V0KGRhdGFzZXQsIGRhdGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGRhdGFUb0RyYXc7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLl9pc0RhdHVtT25TY3JlZW4gPSBmdW5jdGlvbiAoYXR0clRvUHJvamVjdG9yLCBwbG90V2lkdGgsIHBsb3RIZWlnaHQsIGQsIGksIGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIHBpeGVsWCA9IGF0dHJUb1Byb2plY3RvclsieCJdKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgcGl4ZWxZID0gYXR0clRvUHJvamVjdG9yWyJ5Il0oZCwgaSwgZGF0YXNldCk7CiAgICAgICAgICAgIHZhciBwaXhlbFdpZHRoID0gYXR0clRvUHJvamVjdG9yWyJ3aWR0aCJdKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgcGl4ZWxIZWlnaHQgPSBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgaXNWYWxpZCA9IHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKHBpeGVsWCkgJiYKICAgICAgICAgICAgICAgIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKHBpeGVsWSkgJiYKICAgICAgICAgICAgICAgIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKHBpeGVsV2lkdGgpICYmCiAgICAgICAgICAgICAgICB1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihwaXhlbEhlaWdodCk7CiAgICAgICAgICAgIGlmICghaXNWYWxpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1dGlscyQxLk1hdGguYm91bmRzSW50ZXJzZWN0cyhwaXhlbFgsIHBpeGVsWSwgcGl4ZWxXaWR0aCwgcGl4ZWxIZWlnaHQsIDAsIDAsIHBsb3RXaWR0aCwgcGxvdEhlaWdodCk7CiAgICAgICAgfTsKICAgICAgICBCYXIucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS5pbnZhbGlkYXRlQ2FjaGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9sYWJlbENvbmZpZy5nZXQoZGF0YXNldCkubWVhc3VyZXIucmVzZXQoKTsgfSk7CiAgICAgICAgfTsKICAgICAgICBCYXIuX0JBUl9USElDS05FU1NfUkFUSU8gPSAwLjk1OwogICAgICAgIEJhci5fQkFSX0dBUExFU1NfVEhSRVNIT0xEX1BYID0gMzsKICAgICAgICBCYXIuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPID0gMC40OwogICAgICAgIEJhci5fQkFSX0FSRUFfQ0xBU1MgPSAiYmFyLWFyZWEiOwogICAgICAgIEJhci5fQkFSX0VORF9LRVkgPSAiYmFyRW5kIjsKICAgICAgICAvLyB3ZSBzcGVjaWFsIGNhc2UgdGhlICJ3aWR0aCIgcHJvcGVydHkgdG8gcmVwcmVzZW50IHRoZSBiYXIgdGhpY2tuZXNzCiAgICAgICAgLy8gKGFrYSB0aGUgZGlzdGFuY2UgYmV0d2VlbiBhZGphY2VudCBiYXIgcG9zaXRpb25zKTsgaW4gX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yCiAgICAgICAgLy8gd2UgcmUtYXNzaWduICJ3aWR0aCIgdG8gc3BlY2lmaWNhbGx5IHJlZmVyIHRvIDxyZWN0PidzIHdpZHRoIGF0dHJpYnV0ZQogICAgICAgIEJhci5fQkFSX1RISUNLTkVTU19LRVkgPSAid2lkdGgiOwogICAgICAgIEJhci5fTEFCRUxfQVJFQV9DTEFTUyA9ICJiYXItbGFiZWwtdGV4dC1hcmVhIjsKICAgICAgICAvKioKICAgICAgICAgKiBJbiB0aGUgY2FzZSBvZiAic3RhcnQiIG9yICJlbmQiIExhYmVsUG9zaXRpb25zLCBwdXQgdGhlIGxhYmVsIHRoaXMgbWFueSBweCBhd2F5CiAgICAgICAgICogZnJvbSB0aGUgYmFyJ3MgbGVuZ3RoIGRpc3RhbmNlIGVkZ2UKICAgICAgICAgKi8KICAgICAgICBCYXIuX0xBQkVMX01BUkdJTl9JTlNJREVfQkFSID0gMTA7CiAgICAgICAgcmV0dXJuIEJhcjsKICAgIH0oeHlQbG90LlhZUGxvdCkpOwogICAgZXhwb3J0cy5CYXIgPSBCYXI7CiAgICAvKioKICAgICAqIENvbXB1dGVzIHRoZSBiYXJQaXhlbFRoaWNrbmVzcyBvZiBhbGwgdGhlIGJhcnMgaW4gdGhlIHBsb3QuCiAgICAgKgogICAgICogSWYgdGhlIHBvc2l0aW9uIHNjYWxlIG9mIHRoZSBwbG90IGlzIGEgQ2F0ZWdvcnlTY2FsZSBhbmQgaW4gYmFuZHMgbW9kZSwgdGhlbiB0aGUgcmFuZ2VCYW5kcyBmdW5jdGlvbiB3aWxsIGJlIHVzZWQuCiAgICAgKiBJZiB0aGUgcG9zaXRpb24gc2NhbGUgb2YgdGhlIHBsb3QgaXMgYSBRdWFudGl0YXRpdmVTY2FsZSwgdGhlbiB0aGUgYmFyIHRoaWNrbmVzcyBpcyBlcXVhbCB0byB0aGUgc21hbGxlc3QgZGlzdGFuY2UgYmV0d2VlbgogICAgICogdHdvIGFkamFjZW50IGRhdGEgcG9pbnRzLCBwYWRkZWQgZm9yIHZpc3VhbGlzYXRpb24uCiAgICAgKgogICAgICogVGhpcyBpcyBpZ25vcmVkIHdoZW4gZXhwbGljaXRseSBzZXR0aW5nIHRoZSBiYXJFbmQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXB1dGVCYXJQaXhlbFRoaWNrbmVzcyhwb3NpdGlvbkJpbmRpbmcsIGRhdGFzZXRzLCBwbG90UG9zaXRpb25EaW1lbnNpb25MZW5ndGgpIHsKICAgICAgICB2YXIgYmFyUGl4ZWxUaGlja25lc3M7CiAgICAgICAgdmFyIHBvc2l0aW9uU2NhbGUgPSBwb3NpdGlvbkJpbmRpbmcuc2NhbGU7CiAgICAgICAgaWYgKHBvc2l0aW9uU2NhbGUgaW5zdGFuY2VvZiBzY2FsZXMuQ2F0ZWdvcnkpIHsKICAgICAgICAgICAgYmFyUGl4ZWxUaGlja25lc3MgPSBwb3NpdGlvblNjYWxlLnJhbmdlQmFuZCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFyIHBvc2l0aW9uQWNjZXNzb3JfMSA9IHBvc2l0aW9uQmluZGluZy5hY2Nlc3NvcjsKICAgICAgICAgICAgdmFyIG51bWJlckJhckFjY2Vzc29yRGF0YSA9IGQzLnNldCh1dGlscyQxLkFycmF5LmZsYXR0ZW4oZGF0YXNldHMubWFwKGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YXNldC5kYXRhKCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBwb3NpdGlvbkFjY2Vzc29yXzEoZCwgaSwgZGF0YXNldCk7IH0pCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihmdW5jdGlvbiAoZCkgeyByZXR1cm4gZCAhPSBudWxsOyB9KQogICAgICAgICAgICAgICAgICAgIC5tYXAoZnVuY3Rpb24gKGQpIHsgcmV0dXJuIGQudmFsdWVPZigpOyB9KTsKICAgICAgICAgICAgfSkpKS52YWx1ZXMoKS5tYXAoZnVuY3Rpb24gKHZhbHVlKSB7IHJldHVybiArdmFsdWU7IH0pOwogICAgICAgICAgICBudW1iZXJCYXJBY2Nlc3NvckRhdGEuc29ydChmdW5jdGlvbiAoYSwgYikgeyByZXR1cm4gYSAtIGI7IH0pOwogICAgICAgICAgICB2YXIgc2NhbGVkRGF0YSA9IG51bWJlckJhckFjY2Vzc29yRGF0YS5tYXAoZnVuY3Rpb24gKGRhdHVtKSB7IHJldHVybiBwb3NpdGlvblNjYWxlLnNjYWxlKGRhdHVtKTsgfSk7CiAgICAgICAgICAgIHZhciBiYXJBY2Nlc3NvckRhdGFQYWlycyA9IGQzLnBhaXJzKHNjYWxlZERhdGEpOwogICAgICAgICAgICBiYXJQaXhlbFRoaWNrbmVzcyA9IHV0aWxzJDEuTWF0aC5taW4oYmFyQWNjZXNzb3JEYXRhUGFpcnMsIGZ1bmN0aW9uIChwYWlyLCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMocGFpclsxXSAtIHBhaXJbMF0pOwogICAgICAgICAgICB9LCBwbG90UG9zaXRpb25EaW1lbnNpb25MZW5ndGggKiBCYXIuX1NJTkdMRV9CQVJfRElNRU5TSU9OX1JBVElPKTsKICAgICAgICAgICAgYmFyUGl4ZWxUaGlja25lc3MgKj0gQmFyLl9CQVJfVEhJQ0tORVNTX1JBVElPOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYmFyUGl4ZWxUaGlja25lc3M7CiAgICB9CiAgICB9KTsKCiAgICB2YXIgY2x1c3RlcmVkQmFyUGxvdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCiAgICB2YXIgQ2x1c3RlcmVkQmFyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoQ2x1c3RlcmVkQmFyLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEEgQ2x1c3RlcmVkQmFyIFBsb3QgZ3JvdXBzIGJhcnMgYWNyb3NzIERhdGFzZXRzIGJhc2VkIG9uIHRoZSBwcmltYXJ5IHZhbHVlIG9mIHRoZSBiYXJzLgogICAgICAgICAqICAgT24gYSB2ZXJ0aWNhbCBDbHVzdGVyZWRCYXIgUGxvdCwgdGhlIGJhcnMgd2l0aCB0aGUgc2FtZSBYIHZhbHVlIGFyZSBncm91cGVkLgogICAgICAgICAqICAgT24gYSBob3Jpem9udGFsIENsdXN0ZXJlZEJhciBQbG90LCB0aGUgYmFycyB3aXRoIHRoZSBzYW1lIFkgdmFsdWUgYXJlIGdyb3VwZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29yaWVudGF0aW9uPSJ2ZXJ0aWNhbCJdIE9uZSBvZiAidmVydGljYWwiLyJob3Jpem9udGFsIi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBDbHVzdGVyZWRCYXIob3JpZW50YXRpb24pIHsKICAgICAgICAgICAgaWYgKG9yaWVudGF0aW9uID09PSB2b2lkIDApIHsgb3JpZW50YXRpb24gPSAidmVydGljYWwiOyB9CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMsIG9yaWVudGF0aW9uKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fY2x1c3Rlck9mZnNldHMgPSBuZXcgdXRpbHMkMS5NYXAoKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBDbHVzdGVyZWRCYXIucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IF9zdXBlci5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIC8vIHRoZSB3aWR0aCBpcyBjb25zdGFudCwgc28gc2V0IHRoZSBpbm5lciBzY2FsZSByYW5nZSB0byB0aGF0CiAgICAgICAgICAgIHZhciBpbm5lclNjYWxlID0gdGhpcy5fbWFrZUlubmVyU2NhbGUoKTsKICAgICAgICAgICAgdmFyIGlubmVyV2lkdGhGID0gZnVuY3Rpb24gKGQsIGkpIHsgcmV0dXJuIGlubmVyU2NhbGUucmFuZ2VCYW5kKCk7IH07CiAgICAgICAgICAgIGF0dHJUb1Byb2plY3Rvclsid2lkdGgiXSA9IHRoaXMuX2lzVmVydGljYWwgPyBpbm5lcldpZHRoRiA6IGF0dHJUb1Byb2plY3Rvclsid2lkdGgiXTsKICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXSA9ICF0aGlzLl9pc1ZlcnRpY2FsID8gaW5uZXJXaWR0aEYgOiBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdOwogICAgICAgICAgICB2YXIgeEF0dHIgPSBhdHRyVG9Qcm9qZWN0b3JbIngiXTsKICAgICAgICAgICAgdmFyIHlBdHRyID0gYXR0clRvUHJvamVjdG9yWyJ5Il07CiAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsieCJdID0gdGhpcy5faXNWZXJ0aWNhbCA/CiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZCwgaSwgZHMpIHsgcmV0dXJuIHhBdHRyKGQsIGksIGRzKSArIF90aGlzLl9jbHVzdGVyT2Zmc2V0cy5nZXQoZHMpOyB9IDoKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkLCBpLCBkcykgeyByZXR1cm4geEF0dHIoZCwgaSwgZHMpOyB9OwogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbInkiXSA9IHRoaXMuX2lzVmVydGljYWwgPwogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGksIGRzKSB7IHJldHVybiB5QXR0cihkLCBpLCBkcyk7IH0gOgogICAgICAgICAgICAgICAgZnVuY3Rpb24gKGQsIGksIGRzKSB7IHJldHVybiB5QXR0cihkLCBpLCBkcykgKyBfdGhpcy5fY2x1c3Rlck9mZnNldHMuZ2V0KGRzKTsgfTsKICAgICAgICAgICAgcmV0dXJuIGF0dHJUb1Byb2plY3RvcjsKICAgICAgICB9OwogICAgICAgIENsdXN0ZXJlZEJhci5wcm90b3R5cGUuX3VwZGF0ZUNsdXN0ZXJQb3NpdGlvbiA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGlubmVyU2NhbGUgPSB0aGlzLl9tYWtlSW5uZXJTY2FsZSgpOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZCwgaSkgeyByZXR1cm4gX3RoaXMuX2NsdXN0ZXJPZmZzZXRzLnNldChkLCBpbm5lclNjYWxlLnNjYWxlKFN0cmluZyhpKSkgLSBpbm5lclNjYWxlLnJhbmdlQmFuZCgpIC8gMik7IH0pOwogICAgICAgIH07CiAgICAgICAgQ2x1c3RlcmVkQmFyLnByb3RvdHlwZS5fbWFrZUlubmVyU2NhbGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBpbm5lclNjYWxlID0gbmV3IHNjYWxlcy5DYXRlZ29yeSgpOwogICAgICAgICAgICBpbm5lclNjYWxlLmRvbWFpbih0aGlzLmRhdGFzZXRzKCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBTdHJpbmcoaSk7IH0pKTsKICAgICAgICAgICAgdmFyIHdpZHRoUHJvamVjdG9yID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLmF0dHIoYmFyUGxvdC5CYXIuX0JBUl9USElDS05FU1NfS0VZKSk7CiAgICAgICAgICAgIGlubmVyU2NhbGUucmFuZ2UoWzAsIHdpZHRoUHJvamVjdG9yKG51bGwsIDAsIG51bGwpXSk7CiAgICAgICAgICAgIHJldHVybiBpbm5lclNjYWxlOwogICAgICAgIH07CiAgICAgICAgQ2x1c3RlcmVkQmFyLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2x1c3RlclBvc2l0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CiAgICAgICAgfTsKICAgICAgICByZXR1cm4gQ2x1c3RlcmVkQmFyOwogICAgfShiYXJQbG90LkJhcikpOwogICAgZXhwb3J0cy5DbHVzdGVyZWRCYXIgPSBDbHVzdGVyZWRCYXI7CiAgICB9KTsKCiAgICB2YXIgcGllUGxvdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgoKCgoKCgogICAgdmFyIFBpZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFBpZSwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBQaWUoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9zdGFydEFuZ2xlID0gMDsKICAgICAgICAgICAgX3RoaXMuX2VuZEFuZ2xlID0gMiAqIE1hdGguUEk7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbEZvcm1hdHRlciA9IGZvcm1hdHRlcnMuaWRlbnRpdHkoKTsKICAgICAgICAgICAgX3RoaXMuX2xhYmVsc0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgX3RoaXMuaW5uZXJSYWRpdXMoMCk7CiAgICAgICAgICAgIF90aGlzLm91dGVyUmFkaXVzKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBwaWVDZW50ZXIgPSBfdGhpcy5fcGllQ2VudGVyKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoX3RoaXMud2lkdGgoKSAtIHBpZUNlbnRlci54LCBwaWVDZW50ZXIueCksIE1hdGgubWF4KF90aGlzLmhlaWdodCgpIC0gcGllQ2VudGVyLnksIHBpZUNlbnRlci55KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygicGllLXBsb3QiKTsKICAgICAgICAgICAgX3RoaXMuYXR0cigiZmlsbCIsIGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBTdHJpbmcoaSk7IH0sIG5ldyBzY2FsZXMuQ29sb3IoKSk7CiAgICAgICAgICAgIF90aGlzLl9zdHJva2VEcmF3ZXJzID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgUGllLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX3N0cm9rZURyYXdlcnMuZm9yRWFjaChmdW5jdGlvbiAoZCkgeyByZXR1cm4gZC5hdHRhY2hUbyhfdGhpcy5fcmVuZGVyQXJlYSk7IH0pOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5jb21wdXRlTGF5b3V0ID0gZnVuY3Rpb24gKG9yaWdpbiwgYXZhaWxhYmxlV2lkdGgsIGF2YWlsYWJsZUhlaWdodCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmNvbXB1dGVMYXlvdXQuY2FsbCh0aGlzLCBvcmlnaW4sIGF2YWlsYWJsZVdpZHRoLCBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICB2YXIgcGllQ2VudGVyID0gdGhpcy5fcGllQ2VudGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckFyZWEuYXR0cigidHJhbnNmb3JtIiwgInRyYW5zbGF0ZSgiICsgcGllQ2VudGVyLnggKyAiLCIgKyBwaWVDZW50ZXIueSArICIpIik7CiAgICAgICAgICAgIHZhciByYWRpdXNMaW1pdCA9IE1hdGgubWluKE1hdGgubWF4KHRoaXMud2lkdGgoKSAtIHBpZUNlbnRlci54LCBwaWVDZW50ZXIueCksIE1hdGgubWF4KHRoaXMuaGVpZ2h0KCkgLSBwaWVDZW50ZXIueSwgcGllQ2VudGVyLnkpKTsKICAgICAgICAgICAgaWYgKHRoaXMuaW5uZXJSYWRpdXMoKS5zY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlubmVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsIHJhZGl1c0xpbWl0XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMub3V0ZXJSYWRpdXMoKS5zY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLm91dGVyUmFkaXVzKCkuc2NhbGUucmFuZ2UoWzAsIHJhZGl1c0xpbWl0XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLmFkZERhdGFzZXQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmFkZERhdGFzZXQuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLl9hZGREYXRhc2V0ID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YXNldHMoKS5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIHV0aWxzJDEuV2luZG93Lndhcm4oIk9ubHkgb25lIGRhdGFzZXQgaXMgc3VwcG9ydGVkIGluIFBpZSBwbG90cyIpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2FkZERhdGFzZXQuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIHN0cm9rZURyYXdlciA9IG5ldyBhcmNPdXRsaW5lRHJhd2VyLkFyY091dGxpbmVTVkdEcmF3ZXIoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2V0dXApIHsKICAgICAgICAgICAgICAgIHN0cm9rZURyYXdlci5hdHRhY2hUbyh0aGlzLl9yZW5kZXJBcmVhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdHJva2VEcmF3ZXJzLnNldChkYXRhc2V0LCBzdHJva2VEcmF3ZXIpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUucmVtb3ZlRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUucmVtb3ZlRGF0YXNldC5jYWxsKHRoaXMsIGRhdGFzZXQpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2RlcyA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXROb2Rlcy5jYWxsKHRoaXMsIGRhdGFzZXQpOwogICAgICAgICAgICB0aGlzLl9zdHJva2VEcmF3ZXJzLmdldChkYXRhc2V0KS5yZW1vdmUoKTsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUuX3JlbW92ZURhdGFzZXQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0LmNhbGwodGhpcywgZGF0YXNldCk7CiAgICAgICAgICAgIHRoaXMuX3N0cm9rZURyYXdlcnMuZGVsZXRlKGRhdGFzZXQpOwogICAgICAgICAgICB0aGlzLl9zdGFydEFuZ2xlcyA9IFtdOwogICAgICAgICAgICB0aGlzLl9lbmRBbmdsZXMgPSBbXTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLnNlbGVjdGlvbnMgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgaWYgKGRhdGFzZXRzID09PSB2b2lkIDApIHsgZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzKCk7IH0KICAgICAgICAgICAgdmFyIGFsbFNlbGVjdGlvbnMgPSBfc3VwZXIucHJvdG90eXBlLnNlbGVjdGlvbnMuY2FsbCh0aGlzLCBkYXRhc2V0cykubm9kZXMoKTsKICAgICAgICAgICAgZGF0YXNldHMuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIGRyYXdlciA9IF90aGlzLl9zdHJva2VEcmF3ZXJzLmdldChkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmIChkcmF3ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFsbFNlbGVjdGlvbnMucHVzaC5hcHBseShhbGxTZWxlY3Rpb25zLCBkcmF3ZXIuZ2V0VmlzdWFsUHJpbWl0aXZlcygpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkMy5zZWxlY3RBbGwoYWxsU2VsZWN0aW9ucyk7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVQaWVBbmdsZXMoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUuX2NyZWF0ZURyYXdlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBkcmF3ZXIuUHJveHlEcmF3ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IGFyY0RyYXdlci5BcmNTVkdEcmF3ZXIoKTsgfSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgd2luZG93VXRpbHMud2FybigiY2FudmFzIHJlbmRlcmVyIGlzIG5vdCBzdXBwb3J0ZWQgb24gUGllIFBsb3QhIik7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLmVudGl0aWVzID0gZnVuY3Rpb24gKGRhdGFzZXRzKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmIChkYXRhc2V0cyA9PT0gdm9pZCAwKSB7IGRhdGFzZXRzID0gdGhpcy5kYXRhc2V0cygpOyB9CiAgICAgICAgICAgIHZhciBlbnRpdGllcyA9IF9zdXBlci5wcm90b3R5cGUuZW50aXRpZXMuY2FsbCh0aGlzLCBkYXRhc2V0cyk7CiAgICAgICAgICAgIHJldHVybiBlbnRpdGllcy5tYXAoZnVuY3Rpb24gKGVudGl0eSkgewogICAgICAgICAgICAgICAgZW50aXR5LnBvc2l0aW9uLnggKz0gX3RoaXMud2lkdGgoKSAvIDI7CiAgICAgICAgICAgICAgICBlbnRpdHkucG9zaXRpb24ueSArPSBfdGhpcy5oZWlnaHQoKSAvIDI7CiAgICAgICAgICAgICAgICB2YXIgc3Ryb2tlID0gZDMuc2VsZWN0KF90aGlzLl9zdHJva2VEcmF3ZXJzLmdldChlbnRpdHkuZGF0YXNldCkuZ2V0VmlzdWFsUHJpbWl0aXZlQXRJbmRleChlbnRpdHkuaW5kZXgpKTsKICAgICAgICAgICAgICAgIHZhciBwaWVQbG90RW50aXR5ID0gZW50aXR5OwogICAgICAgICAgICAgICAgcGllUGxvdEVudGl0eS5zdHJva2VTZWxlY3Rpb24gPSBzdHJva2U7CiAgICAgICAgICAgICAgICByZXR1cm4gcGllUGxvdEVudGl0eTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLnNlY3RvclZhbHVlID0gZnVuY3Rpb24gKHNlY3RvclZhbHVlLCBzY2FsZSkgewogICAgICAgICAgICBpZiAoc2VjdG9yVmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFBpZS5fU0VDVE9SX1ZBTFVFX0tFWSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYmluZFByb3BlcnR5KFBpZS5fU0VDVE9SX1ZBTFVFX0tFWSwgc2VjdG9yVmFsdWUsIHNjYWxlKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5pbm5lclJhZGl1cyA9IGZ1bmN0aW9uIChpbm5lclJhZGl1cywgc2NhbGUpIHsKICAgICAgICAgICAgaWYgKGlubmVyUmFkaXVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChQaWUuX0lOTkVSX1JBRElVU19LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShQaWUuX0lOTkVSX1JBRElVU19LRVksIGlubmVyUmFkaXVzLCBzY2FsZSk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5vdXRlclJhZGl1cyA9IGZ1bmN0aW9uIChvdXRlclJhZGl1cywgc2NhbGUpIHsKICAgICAgICAgICAgaWYgKG91dGVyUmFkaXVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChQaWUuX09VVEVSX1JBRElVU19LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShQaWUuX09VVEVSX1JBRElVU19LRVksIG91dGVyUmFkaXVzLCBzY2FsZSk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5zdGFydEFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7CiAgICAgICAgICAgIGlmIChhbmdsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRBbmdsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0QW5nbGUgPSBhbmdsZTsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVBpZUFuZ2xlcygpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLmVuZEFuZ2xlID0gZnVuY3Rpb24gKGFuZ2xlKSB7CiAgICAgICAgICAgIGlmIChhbmdsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5kQW5nbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmRBbmdsZSA9IGFuZ2xlOwogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUGllQW5nbGVzKCk7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUubGFiZWxzRW5hYmxlZCA9IGZ1bmN0aW9uIChlbmFibGVkKSB7CiAgICAgICAgICAgIGlmIChlbmFibGVkID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxzRW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUubGFiZWxGb3JtYXR0ZXIgPSBmdW5jdGlvbiAoZm9ybWF0dGVyKSB7CiAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhYmVsRm9ybWF0dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxGb3JtYXR0ZXIgPSBmb3JtYXR0ZXI7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qCiAgICAgICAgICogR2V0cyB0aGUgRW50aXRpZXMgYXQgYSBwYXJ0aWN1bGFyIFBvaW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtQb2ludH0gcAogICAgICAgICAqIEBwYXJhbSB7UGxvdEVudGl0eVtdfQogICAgICAgICAqLwogICAgICAgIFBpZS5wcm90b3R5cGUuZW50aXRpZXNBdCA9IGZ1bmN0aW9uIChxdWVyeVBvaW50KSB7CiAgICAgICAgICAgIHZhciBjZW50ZXIgPSB7IHg6IHRoaXMud2lkdGgoKSAvIDIsIHk6IHRoaXMuaGVpZ2h0KCkgLyAyIH07CiAgICAgICAgICAgIHZhciBhZGp1c3RlZFF1ZXJ5UG9pbnQgPSB7IHg6IHF1ZXJ5UG9pbnQueCAtIGNlbnRlci54LCB5OiBxdWVyeVBvaW50LnkgLSBjZW50ZXIueSB9OwogICAgICAgICAgICB2YXIgaW5kZXggPSB0aGlzLl9zbGljZUluZGV4Rm9yUG9pbnQoYWRqdXN0ZWRRdWVyeVBvaW50KTsKICAgICAgICAgICAgcmV0dXJuIGluZGV4ID09IG51bGwgPyBbXSA6IFt0aGlzLmVudGl0aWVzKClbaW5kZXhdXTsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IF9zdXBlci5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgaW5uZXJSYWRpdXNBY2Nlc3NvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKTsKICAgICAgICAgICAgdmFyIG91dGVyUmFkaXVzQWNjZXNzb3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSk7CiAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsiZCJdID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkMy5hcmMoKS5pbm5lclJhZGl1cyhpbm5lclJhZGl1c0FjY2Vzc29yKGRhdHVtLCBpbmRleCwgZHMpKQogICAgICAgICAgICAgICAgICAgIC5vdXRlclJhZGl1cyhvdXRlclJhZGl1c0FjY2Vzc29yKGRhdHVtLCBpbmRleCwgZHMpKQogICAgICAgICAgICAgICAgICAgIC5zdGFydEFuZ2xlKF90aGlzLl9zdGFydEFuZ2xlc1tpbmRleF0pCiAgICAgICAgICAgICAgICAgICAgLmVuZEFuZ2xlKF90aGlzLl9lbmRBbmdsZXNbaW5kZXhdKShkYXR1bSwgaW5kZXgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gYXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5fdXBkYXRlUGllQW5nbGVzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAodGhpcy5zZWN0b3JWYWx1ZSgpID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5kYXRhc2V0cygpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzZWN0b3JWYWx1ZUFjY2Vzc29yID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnNlY3RvclZhbHVlKCkpOwogICAgICAgICAgICB2YXIgZGF0YXNldCA9IHRoaXMuZGF0YXNldHMoKVswXTsKICAgICAgICAgICAgdmFyIGRhdGEgPSB0aGlzLl9nZXREYXRhVG9EcmF3KCkuZ2V0KGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgcGllID0gZDMucGllKCkuc29ydChudWxsKS5zdGFydEFuZ2xlKHRoaXMuX3N0YXJ0QW5nbGUpLmVuZEFuZ2xlKHRoaXMuX2VuZEFuZ2xlKQogICAgICAgICAgICAgICAgLnZhbHVlKGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBzZWN0b3JWYWx1ZUFjY2Vzc29yKGQsIGksIGRhdGFzZXQpOyB9KShkYXRhKTsKICAgICAgICAgICAgdGhpcy5fc3RhcnRBbmdsZXMgPSBwaWUubWFwKGZ1bmN0aW9uIChzbGljZSkgeyByZXR1cm4gc2xpY2Uuc3RhcnRBbmdsZTsgfSk7CiAgICAgICAgICAgIHRoaXMuX2VuZEFuZ2xlcyA9IHBpZS5tYXAoZnVuY3Rpb24gKHNsaWNlKSB7IHJldHVybiBzbGljZS5lbmRBbmdsZTsgfSk7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLl9waWVDZW50ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBhID0gdGhpcy5fc3RhcnRBbmdsZSA8IHRoaXMuX2VuZEFuZ2xlID8gdGhpcy5fc3RhcnRBbmdsZSA6IHRoaXMuX2VuZEFuZ2xlOwogICAgICAgICAgICB2YXIgYiA9IHRoaXMuX3N0YXJ0QW5nbGUgPCB0aGlzLl9lbmRBbmdsZSA/IHRoaXMuX2VuZEFuZ2xlIDogdGhpcy5fc3RhcnRBbmdsZTsKICAgICAgICAgICAgdmFyIHNpbkEgPSBNYXRoLnNpbihhKTsKICAgICAgICAgICAgdmFyIGNvc0EgPSBNYXRoLmNvcyhhKTsKICAgICAgICAgICAgdmFyIHNpbkIgPSBNYXRoLnNpbihiKTsKICAgICAgICAgICAgdmFyIGNvc0IgPSBNYXRoLmNvcyhiKTsKICAgICAgICAgICAgdmFyIGhUb3A7CiAgICAgICAgICAgIHZhciBoQm90dG9tOwogICAgICAgICAgICB2YXIgd1JpZ2h0OwogICAgICAgICAgICB2YXIgd0xlZnQ7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiAgVGhlIGNlbnRlciBvZiB0aGUgcGllIGlzIGNvbXB1dGVkIHVzaW5nIHRoZSBzaW5lIGFuZCBjb3NpbmUgb2YgdGhlIHN0YXJ0IGFuZ2xlIGFuZCB0aGUgZW5kIGFuZ2xlCiAgICAgICAgICAgICAqICBUaGUgc2luZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RhcnQgYW5kIGVuZCBmYWxsIG9uIHRoZSByaWdodCBoYWxmIG9yIHRoZSBsZWZ0IGhhbGYgb2YgdGhlIHBpZQogICAgICAgICAgICAgKiAgVGhlIGNvc2luZSBpbmRpY2F0ZXMgd2hldGhlciB0aGUgc3RhcnQgYW5kIGVuZCBmYWxsIG9uIHRoZSB0b3Agb3IgdGhlIGJvdHRvbSBoYWxmIG9mIHRoZSBwaWUKICAgICAgICAgICAgICogIERpZmZlcmVudCBjb21iaW5hdGlvbnMgcHJvdmlkZSB0aGUgZGlmZmVyZW50IGhlaWdodHMgYW5kIHdpZHRocyB0aGUgcGllIG5lZWRzIGZyb20gdGhlIGNlbnRlciB0byB0aGUgc2lkZXMKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGlmIChzaW5BID49IDAgJiYgc2luQiA+PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoY29zQSA+PSAwICYmIGNvc0IgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGhUb3AgPSBjb3NBOwogICAgICAgICAgICAgICAgICAgIGhCb3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgIHdMZWZ0ID0gMDsKICAgICAgICAgICAgICAgICAgICB3UmlnaHQgPSBzaW5COwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29zQSA8IDAgJiYgY29zQiA8IDApIHsKICAgICAgICAgICAgICAgICAgICBoVG9wID0gMDsKICAgICAgICAgICAgICAgICAgICBoQm90dG9tID0gLWNvc0I7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAwOwogICAgICAgICAgICAgICAgICAgIHdSaWdodCA9IHNpbkE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3NBID49IDAgJiYgY29zQiA8IDApIHsKICAgICAgICAgICAgICAgICAgICBoVG9wID0gY29zQTsKICAgICAgICAgICAgICAgICAgICBoQm90dG9tID0gLWNvc0I7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAwOwogICAgICAgICAgICAgICAgICAgIHdSaWdodCA9IHNpbkE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3NBIDwgMCAmJiBjb3NCID49IDApIHsKICAgICAgICAgICAgICAgICAgICBoVG9wID0gMTsKICAgICAgICAgICAgICAgICAgICBoQm90dG9tID0gMTsKICAgICAgICAgICAgICAgICAgICB3TGVmdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgd1JpZ2h0ID0gTWF0aC5tYXgoc2luQSwgc2luQik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2luQSA+PSAwICYmIHNpbkIgPCAwKSB7CiAgICAgICAgICAgICAgICBpZiAoY29zQSA+PSAwICYmIGNvc0IgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGhUb3AgPSBNYXRoLm1heChjb3NBLCBjb3NCKTsKICAgICAgICAgICAgICAgICAgICBoQm90dG9tID0gMTsKICAgICAgICAgICAgICAgICAgICB3TGVmdCA9IDE7CiAgICAgICAgICAgICAgICAgICAgd1JpZ2h0ID0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvc0EgPCAwICYmIGNvc0IgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgaFRvcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaEJvdHRvbSA9IDE7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAtc2luQjsKICAgICAgICAgICAgICAgICAgICB3UmlnaHQgPSBzaW5BOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29zQSA+PSAwICYmIGNvc0IgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgaFRvcCA9IGNvc0E7CiAgICAgICAgICAgICAgICAgICAgaEJvdHRvbSA9IDE7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAtc2luQjsKICAgICAgICAgICAgICAgICAgICB3UmlnaHQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29zQSA8IDAgJiYgY29zQiA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaFRvcCA9IGNvc0I7CiAgICAgICAgICAgICAgICAgICAgaEJvdHRvbSA9IDE7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAxOwogICAgICAgICAgICAgICAgICAgIHdSaWdodCA9IHNpbkE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc2luQSA8IDAgJiYgc2luQiA+PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAoY29zQSA+PSAwICYmIGNvc0IgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGhUb3AgPSAxOwogICAgICAgICAgICAgICAgICAgIGhCb3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgIHdMZWZ0ID0gLXNpbkE7CiAgICAgICAgICAgICAgICAgICAgd1JpZ2h0ID0gc2luQjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvc0EgPCAwICYmIGNvc0IgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgaFRvcCA9IDE7CiAgICAgICAgICAgICAgICAgICAgaEJvdHRvbSA9IE1hdGgubWF4KC1jb3NBLCAtY29zQik7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAxOwogICAgICAgICAgICAgICAgICAgIHdSaWdodCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3NBID49IDAgJiYgY29zQiA8IDApIHsKICAgICAgICAgICAgICAgICAgICBoVG9wID0gMTsKICAgICAgICAgICAgICAgICAgICBoQm90dG9tID0gLWNvc0I7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAtc2luQTsKICAgICAgICAgICAgICAgICAgICB3UmlnaHQgPSAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY29zQSA8IDAgJiYgY29zQiA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaFRvcCA9IDE7CiAgICAgICAgICAgICAgICAgICAgaEJvdHRvbSA9IC1jb3NBOwogICAgICAgICAgICAgICAgICAgIHdMZWZ0ID0gMTsKICAgICAgICAgICAgICAgICAgICB3UmlnaHQgPSBzaW5COwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHNpbkEgPCAwICYmIHNpbkIgPCAwKSB7CiAgICAgICAgICAgICAgICBpZiAoY29zQSA+PSAwICYmIGNvc0IgPj0gMCkgewogICAgICAgICAgICAgICAgICAgIGhUb3AgPSBjb3NCOwogICAgICAgICAgICAgICAgICAgIGhCb3R0b20gPSAwOwogICAgICAgICAgICAgICAgICAgIHdMZWZ0ID0gLXNpbkE7CiAgICAgICAgICAgICAgICAgICAgd1JpZ2h0ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvc0EgPCAwICYmIGNvc0IgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgaFRvcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaEJvdHRvbSA9IC1jb3NBOwogICAgICAgICAgICAgICAgICAgIHdMZWZ0ID0gLXNpbkI7CiAgICAgICAgICAgICAgICAgICAgd1JpZ2h0ID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNvc0EgPj0gMCAmJiBjb3NCIDwgMCkgewogICAgICAgICAgICAgICAgICAgIGhUb3AgPSAxOwogICAgICAgICAgICAgICAgICAgIGhCb3R0b20gPSAxOwogICAgICAgICAgICAgICAgICAgIHdMZWZ0ID0gTWF0aC5tYXgoY29zQSwgLWNvc0IpOwogICAgICAgICAgICAgICAgICAgIHdSaWdodCA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3NBIDwgMCAmJiBjb3NCID49IDApIHsKICAgICAgICAgICAgICAgICAgICBoVG9wID0gY29zQjsKICAgICAgICAgICAgICAgICAgICBoQm90dG9tID0gLWNvc0E7CiAgICAgICAgICAgICAgICAgICAgd0xlZnQgPSAxOwogICAgICAgICAgICAgICAgICAgIHdSaWdodCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6IHdMZWZ0ICsgd1JpZ2h0ID09IDAgPyAwIDogKHdMZWZ0IC8gKHdMZWZ0ICsgd1JpZ2h0KSkgKiB0aGlzLndpZHRoKCksCiAgICAgICAgICAgICAgICB5OiBoVG9wICsgaEJvdHRvbSA9PSAwID8gMCA6IChoVG9wIC8gKGhUb3AgKyBoQm90dG9tKSkgKiB0aGlzLmhlaWdodCgpLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGRhdGFUb0RyYXcgPSBfc3VwZXIucHJvdG90eXBlLl9nZXREYXRhVG9EcmF3LmNhbGwodGhpcyk7CiAgICAgICAgICAgIGlmICh0aGlzLmRhdGFzZXRzKCkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVRvRHJhdzsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc2VjdG9yVmFsdWVBY2Nlc3NvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zZWN0b3JWYWx1ZSgpKTsKICAgICAgICAgICAgdmFyIGRzID0gdGhpcy5kYXRhc2V0cygpWzBdOwogICAgICAgICAgICB2YXIgZGF0YSA9IGRhdGFUb0RyYXcuZ2V0KGRzKTsKICAgICAgICAgICAgdmFyIGZpbHRlcmVkRGF0YSA9IGRhdGEuZmlsdGVyKGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBQaWUuX2lzVmFsaWREYXRhKHNlY3RvclZhbHVlQWNjZXNzb3IoZCwgaSwgZHMpKTsgfSk7CiAgICAgICAgICAgIGRhdGFUb0RyYXcuc2V0KGRzLCBmaWx0ZXJlZERhdGEpOwogICAgICAgICAgICByZXR1cm4gZGF0YVRvRHJhdzsKICAgICAgICB9OwogICAgICAgIFBpZS5faXNWYWxpZERhdGEgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKHZhbHVlKSAmJiB2YWx1ZSA+PSAwOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5fcGl4ZWxQb2ludCA9IGZ1bmN0aW9uIChkYXR1bSwgaW5kZXgsIGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIHNjYWxlZFZhbHVlQWNjZXNzb3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2VjdG9yVmFsdWUoKSk7CiAgICAgICAgICAgIGlmICghUGllLl9pc1ZhbGlkRGF0YShzY2FsZWRWYWx1ZUFjY2Vzc29yKGRhdHVtLCBpbmRleCwgZGF0YXNldCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyB4OiBOYU4sIHk6IE5hTiB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBpbm5lclJhZGl1cyA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5pbm5lclJhZGl1cygpKShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgb3V0ZXJSYWRpdXMgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMub3V0ZXJSYWRpdXMoKSkoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGF2Z1JhZGl1cyA9IChpbm5lclJhZGl1cyArIG91dGVyUmFkaXVzKSAvIDI7CiAgICAgICAgICAgIHZhciBwaWUgPSBkMy5waWUoKQogICAgICAgICAgICAgICAgLnNvcnQobnVsbCkKICAgICAgICAgICAgICAgIC52YWx1ZShmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gc2NhbGVkVmFsdWVBY2Nlc3NvcihkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHJldHVybiBQaWUuX2lzVmFsaWREYXRhKHZhbHVlKSA/IHZhbHVlIDogMDsKICAgICAgICAgICAgfSkuc3RhcnRBbmdsZSh0aGlzLl9zdGFydEFuZ2xlKS5lbmRBbmdsZSh0aGlzLl9lbmRBbmdsZSkoZGF0YXNldC5kYXRhKCkpOwogICAgICAgICAgICB2YXIgc3RhcnRBbmdsZSA9IHBpZVtpbmRleF0uc3RhcnRBbmdsZTsKICAgICAgICAgICAgdmFyIGVuZEFuZ2xlID0gcGllW2luZGV4XS5lbmRBbmdsZTsKICAgICAgICAgICAgdmFyIGF2Z0FuZ2xlID0gKHN0YXJ0QW5nbGUgKyBlbmRBbmdsZSkgLyAyOwogICAgICAgICAgICByZXR1cm4geyB4OiBhdmdSYWRpdXMgKiBNYXRoLnNpbihhdmdBbmdsZSksIHk6IC1hdmdSYWRpdXMgKiBNYXRoLmNvcyhhdmdBbmdsZSkgfTsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludCA9IGZ1bmN0aW9uICh0aW1lKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlckFyZWEuc2VsZWN0KCIubGFiZWwtYXJlYSIpLnJlbW92ZSgpOwogICAgICAgICAgICBpZiAodGhpcy5fbGFiZWxzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZHJhd0xhYmVscygpOyB9LCB0aW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZHJhd1N0ZXBzID0gdGhpcy5fZ2VuZXJhdGVTdHJva2VEcmF3U3RlcHMoKTsKICAgICAgICAgICAgdmFyIGRhdGFUb0RyYXcgPSB0aGlzLl9nZXREYXRhVG9EcmF3KCk7CiAgICAgICAgICAgIHRoaXMuZGF0YXNldHMoKS5mb3JFYWNoKGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICB2YXIgYXBwbGllZERyYXdTdGVwcyA9IHBsb3QuUGxvdC5hcHBseURyYXdTdGVwcyhkcmF3U3RlcHMsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgX3RoaXMuX3N0cm9rZURyYXdlcnMuZ2V0KGRhdGFzZXQpLmRyYXcoZGF0YVRvRHJhdy5nZXQoZGF0YXNldCksIGFwcGxpZWREcmF3U3RlcHMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIFBpZS5wcm90b3R5cGUuX2dlbmVyYXRlU3Ryb2tlRHJhd1N0ZXBzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHJldHVybiBbeyBhdHRyVG9Qcm9qZWN0b3I6IGF0dHJUb1Byb2plY3RvciwgYW5pbWF0b3I6IG5ldyBhbmltYXRvcnMuTnVsbCgpIH1dOwogICAgICAgIH07CiAgICAgICAgUGllLnByb3RvdHlwZS5fc2xpY2VJbmRleEZvclBvaW50ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgdmFyIHBvaW50UmFkaXVzID0gTWF0aC5zcXJ0KE1hdGgucG93KHAueCwgMikgKyBNYXRoLnBvdyhwLnksIDIpKTsKICAgICAgICAgICAgdmFyIHBvaW50QW5nbGUgPSBNYXRoLmFjb3MoLXAueSAvIHBvaW50UmFkaXVzKTsKICAgICAgICAgICAgaWYgKHAueCA8IDApIHsKICAgICAgICAgICAgICAgIHBvaW50QW5nbGUgPSBNYXRoLlBJICogMiAtIHBvaW50QW5nbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGluZGV4OwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRoaXMuX3N0YXJ0QW5nbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhcnRBbmdsZXNbaV0gPCBwb2ludEFuZ2xlICYmIHRoaXMuX2VuZEFuZ2xlc1tpXSA+IHBvaW50QW5nbGUpIHsKICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluZGV4ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0cygpWzBdOwogICAgICAgICAgICAgICAgdmFyIGRhdHVtID0gZGF0YXNldC5kYXRhKClbaW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIGlubmVyUmFkaXVzID0gdGhpcy5pbm5lclJhZGl1cygpLmFjY2Vzc29yKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgb3V0ZXJSYWRpdXMgPSB0aGlzLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmIChwb2ludFJhZGl1cyA+IGlubmVyUmFkaXVzICYmIHBvaW50UmFkaXVzIDwgb3V0ZXJSYWRpdXMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfTsKICAgICAgICBQaWUucHJvdG90eXBlLl9kcmF3TGFiZWxzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHZhciBsYWJlbEFyZWEgPSB0aGlzLl9yZW5kZXJBcmVhLmFwcGVuZCgiZyIpLmNsYXNzZWQoImxhYmVsLWFyZWEiLCB0cnVlKTsKICAgICAgICAgICAgdmFyIGNvbnRleHQgPSBuZXcgc3JjJDEuU3ZnQ29udGV4dChsYWJlbEFyZWEubm9kZSgpKTsKICAgICAgICAgICAgdmFyIG1lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIoY29udGV4dCk7CiAgICAgICAgICAgIHZhciB3cml0ZXIgPSBuZXcgc3JjJDEuV3JpdGVyKG1lYXN1cmVyLCBjb250ZXh0KTsKICAgICAgICAgICAgdmFyIGRhdGFzZXQgPSB0aGlzLmRhdGFzZXRzKClbMF07CiAgICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5fZ2V0RGF0YVRvRHJhdygpLmdldChkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGRhdGFMZW4gPSBkYXRhLmxlbmd0aDsKICAgICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoZGF0dW1JbmRleCkgewogICAgICAgICAgICAgICAgdmFyIGRhdHVtID0gZGF0YVtkYXR1bUluZGV4XTsKICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IHRoaXNfMS5zZWN0b3JWYWx1ZSgpLmFjY2Vzc29yKGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmICghdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJjb250aW51ZSI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YWx1ZSA9IHRoaXNfMS5fbGFiZWxGb3JtYXR0ZXIodmFsdWUsIGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVyLm1lYXN1cmUodmFsdWUpOwogICAgICAgICAgICAgICAgdmFyIHRoZXRhID0gKHRoaXNfMS5fZW5kQW5nbGVzW2RhdHVtSW5kZXhdICsgdGhpc18xLl9zdGFydEFuZ2xlc1tkYXR1bUluZGV4XSkgLyAyOwogICAgICAgICAgICAgICAgdmFyIG91dGVyUmFkaXVzID0gdGhpc18xLm91dGVyUmFkaXVzKCkuYWNjZXNzb3IoZGF0dW0sIGRhdHVtSW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgaWYgKHRoaXNfMS5vdXRlclJhZGl1cygpLnNjYWxlKSB7CiAgICAgICAgICAgICAgICAgICAgb3V0ZXJSYWRpdXMgPSB0aGlzXzEub3V0ZXJSYWRpdXMoKS5zY2FsZS5zY2FsZShvdXRlclJhZGl1cyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgaW5uZXJSYWRpdXMgPSB0aGlzXzEuaW5uZXJSYWRpdXMoKS5hY2Nlc3NvcihkYXR1bSwgZGF0dW1JbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICBpZiAodGhpc18xLmlubmVyUmFkaXVzKCkuc2NhbGUpIHsKICAgICAgICAgICAgICAgICAgICBpbm5lclJhZGl1cyA9IHRoaXNfMS5pbm5lclJhZGl1cygpLnNjYWxlLnNjYWxlKGlubmVyUmFkaXVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsYWJlbFJhZGl1cyA9IChvdXRlclJhZGl1cyArIGlubmVyUmFkaXVzKSAvIDI7CiAgICAgICAgICAgICAgICB2YXIgeCA9IE1hdGguc2luKHRoZXRhKSAqIGxhYmVsUmFkaXVzIC0gbWVhc3VyZW1lbnQud2lkdGggLyAyOwogICAgICAgICAgICAgICAgdmFyIHkgPSAtTWF0aC5jb3ModGhldGEpICogbGFiZWxSYWRpdXMgLSBtZWFzdXJlbWVudC5oZWlnaHQgLyAyOwogICAgICAgICAgICAgICAgdmFyIGNvcm5lcnMgPSBbCiAgICAgICAgICAgICAgICAgICAgeyB4OiB4LCB5OiB5IH0sCiAgICAgICAgICAgICAgICAgICAgeyB4OiB4LCB5OiB5ICsgbWVhc3VyZW1lbnQuaGVpZ2h0IH0sCiAgICAgICAgICAgICAgICAgICAgeyB4OiB4ICsgbWVhc3VyZW1lbnQud2lkdGgsIHk6IHkgfSwKICAgICAgICAgICAgICAgICAgICB7IHg6IHggKyBtZWFzdXJlbWVudC53aWR0aCwgeTogeSArIG1lYXN1cmVtZW50LmhlaWdodCB9LAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIHZhciBzaG93TGFiZWwgPSBjb3JuZXJzLmV2ZXJ5KGZ1bmN0aW9uIChjb3JuZXIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5hYnMoY29ybmVyLngpIDw9IF90aGlzLndpZHRoKCkgLyAyICYmIE1hdGguYWJzKGNvcm5lci55KSA8PSBfdGhpcy5oZWlnaHQoKSAvIDI7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChzaG93TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgc2xpY2VJbmRpY2VzID0gY29ybmVycy5tYXAoZnVuY3Rpb24gKGNvcm5lcikgeyByZXR1cm4gX3RoaXMuX3NsaWNlSW5kZXhGb3JQb2ludChjb3JuZXIpOyB9KTsKICAgICAgICAgICAgICAgICAgICBzaG93TGFiZWwgPSBzbGljZUluZGljZXMuZXZlcnkoZnVuY3Rpb24gKGluZGV4KSB7IHJldHVybiBpbmRleCA9PT0gZGF0dW1JbmRleDsgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBhdHRyVG9Qcm9qZWN0b3JbImZpbGwiXShkYXR1bSwgZGF0dW1JbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgZGFyayA9IHV0aWxzJDEuQ29sb3IuY29udHJhc3QoIndoaXRlIiwgY29sb3IpICogMS42IDwgdXRpbHMkMS5Db2xvci5jb250cmFzdCgiYmxhY2siLCBjb2xvcik7CiAgICAgICAgICAgICAgICB2YXIgZyA9IGxhYmVsQXJlYS5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4ICsgIiwiICsgeSArICIpIik7CiAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gZGFyayA/ICJkYXJrLWxhYmVsIiA6ICJsaWdodC1sYWJlbCI7CiAgICAgICAgICAgICAgICBnLmNsYXNzZWQoY2xhc3NOYW1lLCB0cnVlKTsKICAgICAgICAgICAgICAgIGcuc3R5bGUoInZpc2liaWxpdHkiLCBzaG93TGFiZWwgPyAiaW5oZXJpdCIgOiAiaGlkZGVuIik7CiAgICAgICAgICAgICAgICB3cml0ZXIud3JpdGUodmFsdWUsIG1lYXN1cmVtZW50LndpZHRoLCBtZWFzdXJlbWVudC5oZWlnaHQsIHsKICAgICAgICAgICAgICAgICAgICB4QWxpZ246ICJjZW50ZXIiLAogICAgICAgICAgICAgICAgICAgIHlBbGlnbjogImNlbnRlciIsCiAgICAgICAgICAgICAgICB9LCBnLm5vZGUoKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0aGlzXzEgPSB0aGlzOwogICAgICAgICAgICBmb3IgKHZhciBkYXR1bUluZGV4ID0gMDsgZGF0dW1JbmRleCA8IGRhdGFMZW47IGRhdHVtSW5kZXgrKykgewogICAgICAgICAgICAgICAgX2xvb3BfMShkYXR1bUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgUGllLl9JTk5FUl9SQURJVVNfS0VZID0gImlubmVyLXJhZGl1cyI7CiAgICAgICAgUGllLl9PVVRFUl9SQURJVVNfS0VZID0gIm91dGVyLXJhZGl1cyI7CiAgICAgICAgUGllLl9TRUNUT1JfVkFMVUVfS0VZID0gInNlY3Rvci12YWx1ZSI7CiAgICAgICAgcmV0dXJuIFBpZTsKICAgIH0ocGxvdC5QbG90KSk7CiAgICBleHBvcnRzLlBpZSA9IFBpZTsKICAgIH0pOwoKICAgIHZhciByZWN0YW5nbGVQbG90ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgoKCgoKCgoKICAgIHZhciBSZWN0YW5nbGUgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhSZWN0YW5nbGUsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBSZWN0YW5nbGUgUGxvdCBkaXNwbGF5cyByZWN0YW5nbGVzIGJhc2VkIG9uIHRoZSBkYXRhLgogICAgICAgICAqIFRoZSBsZWZ0IGFuZCByaWdodCBlZGdlcyBvZiBlYWNoIHJlY3RhbmdsZSBjYW4gYmUgc2V0IHdpdGggeCgpIGFuZCB4MigpLgogICAgICAgICAqICAgSWYgb25seSB4KCkgaXMgc2V0IHRoZSBSZWN0YW5nbGUgUGxvdCB3aWxsIGF0dGVtcHQgdG8gY29tcHV0ZSB0aGUgY29ycmVjdCBsZWZ0IGFuZCByaWdodCBlZGdlIHBvc2l0aW9ucy4KICAgICAgICAgKiBUaGUgdG9wIGFuZCBib3R0b20gZWRnZXMgb2YgZWFjaCByZWN0YW5nbGUgY2FuIGJlIHNldCB3aXRoIHkoKSBhbmQgeTIoKS4KICAgICAgICAgKiAgIElmIG9ubHkgeSgpIGlzIHNldCB0aGUgUmVjdGFuZ2xlIFBsb3Qgd2lsbCBhdHRlbXB0IHRvIGNvbXB1dGUgdGhlIGNvcnJlY3QgdG9wIGFuZCBib3R0b20gZWRnZSBwb3NpdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlLlNjYWxlfSB4U2NhbGUKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlLlNjYWxlfSB5U2NhbGUKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBSZWN0YW5nbGUoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbHNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbCA9IG51bGw7CiAgICAgICAgICAgIF90aGlzLmFuaW1hdG9yKCJyZWN0YW5nbGVzIiwgbmV3IGFuaW1hdG9ycy5OdWxsKCkpOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygicmVjdGFuZ2xlLXBsb3QiKTsKICAgICAgICAgICAgX3RoaXMuYXR0cigiZmlsbCIsIG5ldyBzY2FsZXMuQ29sb3IoKS5yYW5nZSgpWzBdKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLl9jcmVhdGVEcmF3ZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgZHJhd2VyLlByb3h5RHJhd2VyKGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5ldyByZWN0YW5nbGVEcmF3ZXIuUmVjdGFuZ2xlU1ZHRHJhd2VyKCk7IH0sIGZ1bmN0aW9uIChjdHgpIHsgcmV0dXJuIG5ldyBkcmF3ZXJzLlJlY3RhbmdsZUNhbnZhc0RyYXdlcihjdHgpOyB9KTsKICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gX3N1cGVyLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IuY2FsbCh0aGlzKTsKICAgICAgICAgICAgLy8gQ29weSBlYWNoIG9mIHRoZSBkaWZmZXJlbnQgcHJvamVjdG9ycy4KICAgICAgICAgICAgdmFyIHhBdHRyID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLngoKSk7CiAgICAgICAgICAgIHZhciB4MkF0dHIgPSBhdHRyVG9Qcm9qZWN0b3JbUmVjdGFuZ2xlLl9YMl9LRVldOwogICAgICAgICAgICB2YXIgeUF0dHIgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKICAgICAgICAgICAgdmFyIHkyQXR0ciA9IGF0dHJUb1Byb2plY3RvcltSZWN0YW5nbGUuX1kyX0tFWV07CiAgICAgICAgICAgIHZhciB4U2NhbGUgPSB0aGlzLngoKS5zY2FsZTsKICAgICAgICAgICAgdmFyIHlTY2FsZSA9IHRoaXMueSgpLnNjYWxlOwogICAgICAgICAgICBpZiAoeDJBdHRyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3Rvclsid2lkdGgiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7IHJldHVybiBNYXRoLmFicyh4MkF0dHIoZCwgaSwgZGF0YXNldCkgLSB4QXR0cihkLCBpLCBkYXRhc2V0KSk7IH07CiAgICAgICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbIngiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7IHJldHVybiBNYXRoLm1pbih4MkF0dHIoZCwgaSwgZGF0YXNldCksIHhBdHRyKGQsIGksIGRhdGFzZXQpKTsgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3Rvclsid2lkdGgiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7IHJldHVybiBfdGhpcy5fcmVjdGFuZ2xlV2lkdGgoeFNjYWxlKTsgfTsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsieCJdID0gZnVuY3Rpb24gKGQsIGksIGRhdGFzZXQpIHsgcmV0dXJuIHhBdHRyKGQsIGksIGRhdGFzZXQpIC0gMC41ICogYXR0clRvUHJvamVjdG9yWyJ3aWR0aCJdKGQsIGksIGRhdGFzZXQpOyB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh5MkF0dHIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7IHJldHVybiBNYXRoLmFicyh5MkF0dHIoZCwgaSwgZGF0YXNldCkgLSB5QXR0cihkLCBpLCBkYXRhc2V0KSk7IH07CiAgICAgICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbInkiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KHkyQXR0cihkLCBpLCBkYXRhc2V0KSwgeUF0dHIoZCwgaSwgZGF0YXNldCkpIC0gYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXShkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdID0gZnVuY3Rpb24gKGQsIGksIGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9yZWN0YW5nbGVXaWR0aCh5U2NhbGUpOyB9OwogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJ5Il0gPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgeyByZXR1cm4geUF0dHIoZCwgaSwgZGF0YXNldCkgLSAwLjUgKiBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdKGQsIGksIGRhdGFzZXQpOyB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBhdHRyaWJ1dGVzIHByb2plY3RlZCBvbnRvIHRoZSBTVkcgZWxlbWVudHMKICAgICAgICAgICAgZGVsZXRlIGF0dHJUb1Byb2plY3RvcltSZWN0YW5nbGUuX1gyX0tFWV07CiAgICAgICAgICAgIGRlbGV0ZSBhdHRyVG9Qcm9qZWN0b3JbUmVjdGFuZ2xlLl9ZMl9LRVldOwogICAgICAgICAgICByZXR1cm4gYXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBbeyBhdHRyVG9Qcm9qZWN0b3I6IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLCBhbmltYXRvcjogdGhpcy5fZ2V0QW5pbWF0b3IoInJlY3RhbmdsZXMiKSB9XTsKICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5ID0gZnVuY3Rpb24gKHByb3BlcnR5KSB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PT0gIngyIikgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywgIngiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eSA9PT0gInkyIikgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuX2ZpbHRlckZvclByb3BlcnR5LmNhbGwodGhpcywgInkiKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCBwcm9wZXJ0eSk7CiAgICAgICAgfTsKICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLnggPSBmdW5jdGlvbiAoeCwgeFNjYWxlLCBwb3N0U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUueC5jYWxsKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh4U2NhbGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS54LmNhbGwodGhpcywgeCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnguY2FsbCh0aGlzLCB4LCB4U2NhbGUsIHBvc3RTY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHhTY2FsZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgeDJCaW5kaW5nID0gdGhpcy54MigpOwogICAgICAgICAgICAgICAgdmFyIHgyID0geDJCaW5kaW5nICYmIHgyQmluZGluZy5hY2Nlc3NvcjsKICAgICAgICAgICAgICAgIGlmICh4MiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZFByb3BlcnR5KFJlY3RhbmdsZS5fWDJfS0VZLCB4MiwgeFNjYWxlLCB4MkJpbmRpbmcucG9zdFNjYWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgeCBhbmQgeSBzY2FsZXMgc2hvdWxkIHJlbmRlciBpbiBiYW5kcyB3aXRoIG5vIHBhZGRpbmcgZm9yIGNhdGVnb3J5IHNjYWxlcwogICAgICAgICAgICBpZiAoeFNjYWxlIGluc3RhbmNlb2Ygc2NhbGVzLkNhdGVnb3J5KSB7CiAgICAgICAgICAgICAgICB4U2NhbGUuaW5uZXJQYWRkaW5nKDApLm91dGVyUGFkZGluZygwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUueDIgPSBmdW5jdGlvbiAoeDIsIHBvc3RTY2FsZSkgewogICAgICAgICAgICBpZiAoeDIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFJlY3RhbmdsZS5fWDJfS0VZKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgeEJpbmRpbmcgPSB0aGlzLngoKTsKICAgICAgICAgICAgdmFyIHhTY2FsZSA9IHhCaW5kaW5nICYmIHhCaW5kaW5nLnNjYWxlOwogICAgICAgICAgICB0aGlzLl9iaW5kUHJvcGVydHkoUmVjdGFuZ2xlLl9YMl9LRVksIHgyLCB4U2NhbGUsIHBvc3RTY2FsZSk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS55ID0gZnVuY3Rpb24gKHksIHlTY2FsZSwgcG9zdFNjYWxlKSB7CiAgICAgICAgICAgIGlmICh5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnkuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoeVNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueS5jYWxsKHRoaXMsIHkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS55LmNhbGwodGhpcywgeSwgeVNjYWxlLCBwb3N0U2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh5U2NhbGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdmFyIHkyQmluZGluZyA9IHRoaXMueTIoKTsKICAgICAgICAgICAgICAgIHZhciB5MiA9IHkyQmluZGluZyAmJiB5MkJpbmRpbmcuYWNjZXNzb3I7CiAgICAgICAgICAgICAgICBpZiAoeTIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShSZWN0YW5nbGUuX1kyX0tFWSwgeTIsIHlTY2FsZSwgeTJCaW5kaW5nLnBvc3RTY2FsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIHggYW5kIHkgc2NhbGVzIHNob3VsZCByZW5kZXIgaW4gYmFuZHMgd2l0aCBubyBwYWRkaW5nIGZvciBjYXRlZ29yeSBzY2FsZXMKICAgICAgICAgICAgaWYgKHlTY2FsZSBpbnN0YW5jZW9mIHNjYWxlcy5DYXRlZ29yeSkgewogICAgICAgICAgICAgICAgeVNjYWxlLmlubmVyUGFkZGluZygwKS5vdXRlclBhZGRpbmcoMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLnkyID0gZnVuY3Rpb24gKHkyLCBwb3N0U2NhbGUpIHsKICAgICAgICAgICAgaWYgKHkyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzLmdldChSZWN0YW5nbGUuX1kyX0tFWSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHlCaW5kaW5nID0gdGhpcy55KCk7CiAgICAgICAgICAgIHZhciB5U2NhbGUgPSB5QmluZGluZyAmJiB5QmluZGluZy5zY2FsZTsKICAgICAgICAgICAgdGhpcy5fYmluZFByb3BlcnR5KFJlY3RhbmdsZS5fWTJfS0VZLCB5MiwgeVNjYWxlLCBwb3N0U2NhbGUpOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIFBsb3RFbnRpdGllcyBhdCBhIHBhcnRpY3VsYXIgUG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50fSBwb2ludCBUaGUgcG9pbnQgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybnMge1Bsb3RFbnRpdHlbXX0gVGhlIFBsb3RFbnRpdGllcyBhdCB0aGUgcGFydGljdWxhciBwb2ludAogICAgICAgICAqLwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuZW50aXRpZXNBdCA9IGZ1bmN0aW9uIChwb2ludCkgewogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVudGl0aWVzKCkuZmlsdGVyKGZ1bmN0aW9uIChlbnRpdHkpIHsKICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IGVudGl0eS5kYXR1bTsKICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGVudGl0eS5pbmRleDsKICAgICAgICAgICAgICAgIHZhciBkYXRhc2V0ID0gZW50aXR5LmRhdGFzZXQ7CiAgICAgICAgICAgICAgICB2YXIgeCA9IGF0dHJUb1Byb2plY3RvclsieCJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgeSA9IGF0dHJUb1Byb2plY3RvclsieSJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBhdHRyVG9Qcm9qZWN0b3JbIndpZHRoIl0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICByZXR1cm4geCA8PSBwb2ludC54ICYmIHBvaW50LnggPD0geCArIHdpZHRoICYmIHkgPD0gcG9pbnQueSAmJiBwb2ludC55IDw9IHkgKyBoZWlnaHQ7CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzID0gZnVuY3Rpb24gKGVudGl0eSkgewogICAgICAgICAgICB2YXIgZGF0dW0gPSBlbnRpdHkuZGF0dW0sIGluZGV4ID0gZW50aXR5LmluZGV4LCBkYXRhc2V0ID0gZW50aXR5LmRhdGFzZXQ7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbnRpdHlCQm94KGRhdHVtLCBpbmRleCwgZGF0YXNldCwgdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCkpOwogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5fZW50aXR5QkJveCA9IGZ1bmN0aW9uIChkYXR1bSwgaW5kZXgsIGRhdGFzZXQsIGF0dHJUb1Byb2plY3RvcikgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogYXR0clRvUHJvamVjdG9yWyJ4Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSwKICAgICAgICAgICAgICAgIHk6IGF0dHJUb1Byb2plY3RvclsieSJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCksCiAgICAgICAgICAgICAgICB3aWR0aDogYXR0clRvUHJvamVjdG9yWyJ3aWR0aCJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCksCiAgICAgICAgICAgICAgICBoZWlnaHQ6IGF0dHJUb1Byb2plY3RvclsiaGVpZ2h0Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSwKICAgICAgICAgICAgfTsKICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUubGFiZWwgPSBmdW5jdGlvbiAobGFiZWwpIHsKICAgICAgICAgICAgaWYgKGxhYmVsID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYWJlbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsOwogICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUubGFiZWxzRW5hYmxlZCA9IGZ1bmN0aW9uIChlbmFibGVkKSB7CiAgICAgICAgICAgIGlmIChlbmFibGVkID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9sYWJlbHNFbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxzRW5hYmxlZCA9IGVuYWJsZWQ7CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IF9zdXBlci5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwogICAgICAgICAgICBpZiAodGhpcy54MigpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsieDIiXSA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54MigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy55MigpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsieTIiXSA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy55MigpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5fcGl4ZWxQb2ludCA9IGZ1bmN0aW9uIChkYXR1bSwgaW5kZXgsIGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICB2YXIgcmVjdFggPSBhdHRyVG9Qcm9qZWN0b3JbIngiXShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgcmVjdFkgPSBhdHRyVG9Qcm9qZWN0b3JbInkiXShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgcmVjdFdpZHRoID0gYXR0clRvUHJvamVjdG9yWyJ3aWR0aCJdKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgIHZhciByZWN0SGVpZ2h0ID0gYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXShkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgeCA9IHJlY3RYICsgcmVjdFdpZHRoIC8gMjsKICAgICAgICAgICAgdmFyIHkgPSByZWN0WSArIHJlY3RIZWlnaHQgLyAyOwogICAgICAgICAgICByZXR1cm4geyB4OiB4LCB5OiB5IH07CiAgICAgICAgfTsKICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLl9yZWN0YW5nbGVXaWR0aCA9IGZ1bmN0aW9uIChzY2FsZSkgewogICAgICAgICAgICBpZiAoc2NhbGUgaW5zdGFuY2VvZiBzY2FsZXMuQ2F0ZWdvcnkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzY2FsZS5yYW5nZUJhbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHZhciBhY2Nlc3Nvcl8xID0gc2NhbGUgPT09IHRoaXMueCgpLnNjYWxlID8gdGhpcy54KCkuYWNjZXNzb3IgOiB0aGlzLnkoKS5hY2Nlc3NvcjsKICAgICAgICAgICAgICAgIHZhciBhY2Nlc3NvckRhdGEgPSBkMy5zZXQodXRpbHMkMS5BcnJheS5mbGF0dGVuKHRoaXMuZGF0YXNldHMoKS5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGF0YXNldC5kYXRhKCkubWFwKGZ1bmN0aW9uIChkLCBpKSB7IHJldHVybiBhY2Nlc3Nvcl8xKGQsIGksIGRhdGFzZXQpLnZhbHVlT2YoKTsgfSk7CiAgICAgICAgICAgICAgICB9KSkpLnZhbHVlcygpLm1hcChmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICt2YWx1ZTsgfSk7CiAgICAgICAgICAgICAgICAvLyBHZXQgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiBtaW4gYW5kIG1heAogICAgICAgICAgICAgICAgdmFyIG1pbiA9IHV0aWxzJDEuTWF0aC5taW4oYWNjZXNzb3JEYXRhLCAwKTsKICAgICAgICAgICAgICAgIHZhciBtYXggPSB1dGlscyQxLk1hdGgubWF4KGFjY2Vzc29yRGF0YSwgMCk7CiAgICAgICAgICAgICAgICB2YXIgc2NhbGVkTWluID0gc2NhbGUuc2NhbGUobWluKTsKICAgICAgICAgICAgICAgIHZhciBzY2FsZWRNYXggPSBzY2FsZS5zY2FsZShtYXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIChzY2FsZWRNYXggLSBzY2FsZWRNaW4pIC8gTWF0aC5hYnMobWF4IC0gbWluKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLnByb3RvdHlwZS5fZ2V0RGF0YVRvRHJhdyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGRhdGFUb0RyYXcgPSBuZXcgdXRpbHMkMS5NYXAoKTsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhc2V0LmRhdGEoKS5tYXAoZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgaXNWYWxpZCA9ICh1dGlscyQxLk1hdGguaXNWYWxpZE51bWJlcihhdHRyVG9Qcm9qZWN0b3JbIngiXShkLCBpLCBkYXRhc2V0KSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIoYXR0clRvUHJvamVjdG9yWyJ5Il0oZCwgaSwgZGF0YXNldCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzJDEuTWF0aC5pc1ZhbGlkTnVtYmVyKGF0dHJUb1Byb2plY3Rvclsid2lkdGgiXShkLCBpLCBkYXRhc2V0KSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHMkMS5NYXRoLmlzVmFsaWROdW1iZXIoYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXShkLCBpLCBkYXRhc2V0KSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc1ZhbGlkID8gZCA6IG51bGw7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGRhdGFUb0RyYXcuc2V0KGRhdGFzZXQsIGRhdGEpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGRhdGFUb0RyYXc7CiAgICAgICAgfTsKICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLl9hZGRpdGlvbmFsUGFpbnQgPSBmdW5jdGlvbiAodGltZSkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJBcmVhLnNlbGVjdEFsbCgiLmxhYmVsLWFyZWEiKS5yZW1vdmUoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhYmVsc0VuYWJsZWQgJiYgdGhpcy5sYWJlbCgpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHV0aWxzJDEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2RyYXdMYWJlbHMoKTsgfSwgdGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFJlY3RhbmdsZS5wcm90b3R5cGUuX2RyYXdMYWJlbHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBkYXRhVG9EcmF3ID0gdGhpcy5fZ2V0RGF0YVRvRHJhdygpOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCwgaSkgeyByZXR1cm4gX3RoaXMuX2RyYXdMYWJlbChkYXRhVG9EcmF3LCBkYXRhc2V0LCBpKTsgfSk7CiAgICAgICAgfTsKICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLl9kcmF3TGFiZWwgPSBmdW5jdGlvbiAoZGF0YVRvRHJhdywgZGF0YXNldCwgZGF0YXNldEluZGV4KSB7CiAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKICAgICAgICAgICAgdmFyIGxhYmVsQXJlYSA9IHRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZCgibGFiZWwtYXJlYSIsIHRydWUpOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBzcmMkMS5TdmdDb250ZXh0KGxhYmVsQXJlYS5ub2RlKCkpOwogICAgICAgICAgICB2YXIgbWVhc3VyZXIgPSBuZXcgc3JjJDEuQ2FjaGVNZWFzdXJlcihjb250ZXh0KTsKICAgICAgICAgICAgdmFyIHdyaXRlciA9IG5ldyBzcmMkMS5Xcml0ZXIobWVhc3VyZXIsIGNvbnRleHQpOwogICAgICAgICAgICB2YXIgeFJhbmdlID0gdGhpcy54KCkuc2NhbGUucmFuZ2UoKTsKICAgICAgICAgICAgdmFyIHlSYW5nZSA9IHRoaXMueSgpLnNjYWxlLnJhbmdlKCk7CiAgICAgICAgICAgIHZhciB4TWluID0gTWF0aC5taW4uYXBwbHkobnVsbCwgeFJhbmdlKTsKICAgICAgICAgICAgdmFyIHhNYXggPSBNYXRoLm1heC5hcHBseShudWxsLCB4UmFuZ2UpOwogICAgICAgICAgICB2YXIgeU1pbiA9IE1hdGgubWluLmFwcGx5KG51bGwsIHlSYW5nZSk7CiAgICAgICAgICAgIHZhciB5TWF4ID0gTWF0aC5tYXguYXBwbHkobnVsbCwgeVJhbmdlKTsKICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhVG9EcmF3LmdldChkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGRhdGFMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgICAgICAgICAgZm9yICh2YXIgZGF0dW1JbmRleCA9IDA7IGRhdHVtSW5kZXggPCBkYXRhTGVuZ3RoOyBkYXR1bUluZGV4KyspIHsKICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IGRhdGFbZGF0dW1JbmRleF07CiAgICAgICAgICAgICAgICBpZiAoZGF0dW0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGxhYmVsID0gIiIgKyB0aGlzLmxhYmVsKCkoZGF0dW0sIGRhdHVtSW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIG1lYXN1cmVtZW50ID0gbWVhc3VyZXIubWVhc3VyZShsYWJlbCk7CiAgICAgICAgICAgICAgICB2YXIgeCA9IGF0dHJUb1Byb2plY3RvclsieCJdKGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciB5ID0gYXR0clRvUHJvamVjdG9yWyJ5Il0oZGF0dW0sIGRhdHVtSW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIHdpZHRoID0gYXR0clRvUHJvamVjdG9yWyJ3aWR0aCJdKGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBoZWlnaHQgPSBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdKGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmIChtZWFzdXJlbWVudC5oZWlnaHQgPD0gaGVpZ2h0ICYmIG1lYXN1cmVtZW50LndpZHRoIDw9IHdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhvcml6b250YWxPZmZzZXQgPSAod2lkdGggLSBtZWFzdXJlbWVudC53aWR0aCkgLyAyOwogICAgICAgICAgICAgICAgICAgIHZhciB2ZXJ0aWNhbE9mZnNldCA9IChoZWlnaHQgLSBtZWFzdXJlbWVudC5oZWlnaHQpIC8gMjsKICAgICAgICAgICAgICAgICAgICB4ICs9IGhvcml6b250YWxPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgeSArPSB2ZXJ0aWNhbE9mZnNldDsKICAgICAgICAgICAgICAgICAgICB2YXIgeExhYmVsUmFuZ2UgPSB7IG1pbjogeCwgbWF4OiB4ICsgbWVhc3VyZW1lbnQud2lkdGggfTsKICAgICAgICAgICAgICAgICAgICB2YXIgeUxhYmVsUmFuZ2UgPSB7IG1pbjogeSwgbWF4OiB5ICsgbWVhc3VyZW1lbnQuaGVpZ2h0IH07CiAgICAgICAgICAgICAgICAgICAgaWYgKHhMYWJlbFJhbmdlLm1pbiA8IHhNaW4gfHwgeExhYmVsUmFuZ2UubWF4ID4geE1heCB8fCB5TGFiZWxSYW5nZS5taW4gPCB5TWluIHx8IHlMYWJlbFJhbmdlLm1heCA+IHlNYXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5TGFiZWwoeExhYmVsUmFuZ2UsIHlMYWJlbFJhbmdlLCBkYXR1bUluZGV4LCBkYXRhc2V0SW5kZXgsIGRhdGFUb0RyYXcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgY29sb3IgPSBhdHRyVG9Qcm9qZWN0b3JbImZpbGwiXShkYXR1bSwgZGF0dW1JbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhcmsgPSB1dGlscyQxLkNvbG9yLmNvbnRyYXN0KCJ3aGl0ZSIsIGNvbG9yKSAqIDEuNiA8IHV0aWxzJDEuQ29sb3IuY29udHJhc3QoImJsYWNrIiwgY29sb3IpOwogICAgICAgICAgICAgICAgICAgIHZhciBnID0gbGFiZWxBcmVhLmFwcGVuZCgiZyIpLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIHggKyAiLCIgKyB5ICsgIikiKTsKICAgICAgICAgICAgICAgICAgICB2YXIgY2xhc3NOYW1lID0gZGFyayA/ICJkYXJrLWxhYmVsIiA6ICJsaWdodC1sYWJlbCI7CiAgICAgICAgICAgICAgICAgICAgZy5jbGFzc2VkKGNsYXNzTmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVyLndyaXRlKGxhYmVsLCBtZWFzdXJlbWVudC53aWR0aCwgbWVhc3VyZW1lbnQuaGVpZ2h0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHhBbGlnbjogImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgICAgIHlBbGlnbjogImNlbnRlciIsCiAgICAgICAgICAgICAgICAgICAgfSwgZy5ub2RlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBSZWN0YW5nbGUucHJvdG90eXBlLl9vdmVybGF5TGFiZWwgPSBmdW5jdGlvbiAobGFiZWxYUmFuZ2UsIGxhYmVsWVJhbmdlLCBkYXR1bUluZGV4LCBkYXRhc2V0SW5kZXgsIGRhdGFUb0RyYXcpIHsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICB2YXIgZGF0YXNldHMgPSB0aGlzLmRhdGFzZXRzKCk7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSBkYXRhc2V0SW5kZXg7IGkgPCBkYXRhc2V0cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGRhdGFzZXQgPSBkYXRhc2V0c1tpXTsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YVRvRHJhdy5nZXQoZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IGRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IChpID09PSBkYXRhc2V0SW5kZXggPyBkYXR1bUluZGV4ICsgMSA6IDApOyBqIDwgZGF0YUxlbjsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHV0aWxzJDEuRE9NLmludGVyc2VjdHNCQm94KGxhYmVsWFJhbmdlLCBsYWJlbFlSYW5nZSwgdGhpcy5fZW50aXR5QkJveChkYXRhW2pdLCBqLCBkYXRhc2V0LCBhdHRyVG9Qcm9qZWN0b3IpKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH07CiAgICAgICAgUmVjdGFuZ2xlLl9YMl9LRVkgPSAieDIiOwogICAgICAgIFJlY3RhbmdsZS5fWTJfS0VZID0gInkyIjsKICAgICAgICByZXR1cm4gUmVjdGFuZ2xlOwogICAgfSh4eVBsb3QuWFlQbG90KSk7CiAgICBleHBvcnRzLlJlY3RhbmdsZSA9IFJlY3RhbmdsZTsKICAgIH0pOwoKICAgIHZhciBzY2F0dGVyUGxvdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgoKCgoKCgoKICAgIHZhciBTY2F0dGVyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKF9zdXBlcikgewogICAgICAgIHRzbGliX2VzNi5fX2V4dGVuZHMoU2NhdHRlciwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBBIFNjYXR0ZXIgUGxvdCBkcmF3cyBhIHN5bWJvbCBhdCBlYWNoIGRhdGEgcG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBTY2F0dGVyKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzKSB8fCB0aGlzOwogICAgICAgICAgICBfdGhpcy5fbGFiZWxGb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzLmlkZW50aXR5KCk7CiAgICAgICAgICAgIF90aGlzLl9sYWJlbHNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJzY2F0dGVyLXBsb3QiKTsKICAgICAgICAgICAgdmFyIGFuaW1hdG9yID0gbmV3IGFuaW1hdG9ycy5FYXNpbmcoKTsKICAgICAgICAgICAgYW5pbWF0b3Iuc3RhcnREZWxheSg1KTsKICAgICAgICAgICAgYW5pbWF0b3Iuc3RlcER1cmF0aW9uKDI1MCk7CiAgICAgICAgICAgIGFuaW1hdG9yLm1heFRvdGFsRHVyYXRpb24ocGxvdC5QbG90Ll9BTklNQVRJT05fTUFYX0RVUkFUSU9OKTsKICAgICAgICAgICAgX3RoaXMuYW5pbWF0b3IocGxvdHMuQW5pbWF0b3IuTUFJTiwgYW5pbWF0b3IpOwogICAgICAgICAgICBfdGhpcy5hdHRyKCJvcGFjaXR5IiwgMC42KTsKICAgICAgICAgICAgX3RoaXMuYXR0cigiZmlsbCIsIG5ldyBzY2FsZXMuQ29sb3IoKS5yYW5nZSgpWzBdKTsKICAgICAgICAgICAgX3RoaXMuc2l6ZSg2KTsKICAgICAgICAgICAgdmFyIGNpcmNsZVN5bWJvbEZhY3RvcnkgPSBzeW1ib2xGYWN0b3JpZXMuY2lyY2xlKCk7CiAgICAgICAgICAgIF90aGlzLnN5bWJvbChmdW5jdGlvbiAoKSB7IHJldHVybiBjaXJjbGVTeW1ib2xGYWN0b3J5OyB9KTsKICAgICAgICAgICAgX3RoaXMuX2xhYmVsQ29uZmlnID0gbmV3IHV0aWxzJDEuTWFwKCk7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgU2NhdHRlci5wcm90b3R5cGUuX2J1aWxkTGlnaHR3ZWlnaHRQbG90RW50aXRpZXMgPSBmdW5jdGlvbiAoZGF0YXNldHMpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGxpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzID0gX3N1cGVyLnByb3RvdHlwZS5fYnVpbGRMaWdodHdlaWdodFBsb3RFbnRpdGllcy5jYWxsKHRoaXMsIGRhdGFzZXRzKTsKICAgICAgICAgICAgcmV0dXJuIGxpZ2h0d2VpZ2h0UGxvdEVudGl0aWVzLm1hcChmdW5jdGlvbiAobGlnaHR3ZWlnaHRQbG90RW50aXR5KSB7CiAgICAgICAgICAgICAgICB2YXIgZGlhbWV0ZXIgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKF90aGlzLnNpemUoKSkobGlnaHR3ZWlnaHRQbG90RW50aXR5LmRhdHVtLCBsaWdodHdlaWdodFBsb3RFbnRpdHkuaW5kZXgsIGxpZ2h0d2VpZ2h0UGxvdEVudGl0eS5kYXRhc2V0KTsKICAgICAgICAgICAgICAgIGxpZ2h0d2VpZ2h0UGxvdEVudGl0eS5kaWFtZXRlciA9IGRpYW1ldGVyOwogICAgICAgICAgICAgICAgcmV0dXJuIGxpZ2h0d2VpZ2h0UGxvdEVudGl0eTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fY3JlYXRlRHJhd2VyID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIG5ldyBkcmF3ZXIuUHJveHlEcmF3ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IHN5bWJvbERyYXdlci5TeW1ib2xTVkdEcmF3ZXIoKTsgfSwgZnVuY3Rpb24gKGN0eCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBkcmF3ZXJzLkNhbnZhc0RyYXdlcihjdHgsIHN5bWJvbERyYXdlci5tYWtlU3ltYm9sQ2FudmFzRHJhd1N0ZXAoZGF0YXNldCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihfdGhpcy5zeW1ib2woKSk7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IoX3RoaXMuc2l6ZSgpKTsgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIFNjYXR0ZXIucHJvdG90eXBlLnNpemUgPSBmdW5jdGlvbiAoc2l6ZSwgc2NhbGUpIHsKICAgICAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFNjYXR0ZXIuX1NJWkVfS0VZKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9iaW5kUHJvcGVydHkoU2NhdHRlci5fU0laRV9LRVksIHNpemUsIHNjYWxlKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5zeW1ib2wgPSBmdW5jdGlvbiAoc3ltYm9sKSB7CiAgICAgICAgICAgIGlmIChzeW1ib2wgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFNjYXR0ZXIuX1NZTUJPTF9LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Byb3BlcnR5QmluZGluZ3Muc2V0KFNjYXR0ZXIuX1NZTUJPTF9LRVksIHsgYWNjZXNzb3I6IHN5bWJvbCB9KTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBkcmF3U3RlcHMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGVPbk5leHRSZW5kZXIoKSkgewogICAgICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICAgICAgdmFyIHN5bWJvbFByb2plY3Rvcl8xID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnN5bWJvbCgpKTsKICAgICAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsiZCJdID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgeyByZXR1cm4gc3ltYm9sUHJvamVjdG9yXzEoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSgwKShudWxsKTsgfTsKICAgICAgICAgICAgICAgIGRyYXdTdGVwcy5wdXNoKHsgYXR0clRvUHJvamVjdG9yOiBhdHRyVG9Qcm9qZWN0b3IsIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5SRVNFVCkgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZHJhd1N0ZXBzLnB1c2goewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yOiB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKSwKICAgICAgICAgICAgICAgIGFuaW1hdG9yOiB0aGlzLl9nZXRBbmltYXRvcihwbG90cy5BbmltYXRvci5NQUlOKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkcmF3U3RlcHM7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydHlUb1Byb2plY3RvcnMgPSBfc3VwZXIucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdmFyIHhQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTsKICAgICAgICAgICAgdmFyIHlQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKICAgICAgICAgICAgcHJvcGVydHlUb1Byb2plY3RvcnNbIngiXSA9IHhQcm9qZWN0b3I7CiAgICAgICAgICAgIHByb3BlcnR5VG9Qcm9qZWN0b3JzWyJ5Il0gPSB5UHJvamVjdG9yOwogICAgICAgICAgICBwcm9wZXJ0eVRvUHJvamVjdG9yc1sidHJhbnNmb3JtIl0gPSBmdW5jdGlvbiAoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gInRyYW5zbGF0ZSgiICsgeFByb2plY3RvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpICsgIiwiICsgeVByb2plY3RvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpICsgIikiOwogICAgICAgICAgICB9OwogICAgICAgICAgICBwcm9wZXJ0eVRvUHJvamVjdG9yc1siZCJdID0gdGhpcy5fY29uc3RydWN0U3ltYm9sR2VuZXJhdG9yKCk7CiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0eVRvUHJvamVjdG9yczsKICAgICAgICB9OwogICAgICAgIFNjYXR0ZXIucHJvdG90eXBlLl9jb25zdHJ1Y3RTeW1ib2xHZW5lcmF0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBzeW1ib2xQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc3ltYm9sKCkpOwogICAgICAgICAgICB2YXIgc2l6ZVByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpOwogICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN5bWJvbFByb2plY3RvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpKHNpemVQcm9qZWN0b3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSkobnVsbCk7CiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fZW50aXR5Qm91bmRzID0gZnVuY3Rpb24gKGVudGl0eSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogZW50aXR5LnBvc2l0aW9uLnggLSBlbnRpdHkuZGlhbWV0ZXIgLyAyLAogICAgICAgICAgICAgICAgeTogZW50aXR5LnBvc2l0aW9uLnkgLSBlbnRpdHkuZGlhbWV0ZXIgLyAyLAogICAgICAgICAgICAgICAgd2lkdGg6IGVudGl0eS5kaWFtZXRlciwKICAgICAgICAgICAgICAgIGhlaWdodDogZW50aXR5LmRpYW1ldGVyLAogICAgICAgICAgICB9OwogICAgICAgIH07CiAgICAgICAgU2NhdHRlci5wcm90b3R5cGUuX2VudGl0eVZpc2libGVPblBsb3QgPSBmdW5jdGlvbiAoZW50aXR5LCBib3VuZHMpIHsKICAgICAgICAgICAgdmFyIHhSYW5nZSA9IHsgbWluOiBib3VuZHMudG9wTGVmdC54LCBtYXg6IGJvdW5kcy5ib3R0b21SaWdodC54IH07CiAgICAgICAgICAgIHZhciB5UmFuZ2UgPSB7IG1pbjogYm91bmRzLnRvcExlZnQueSwgbWF4OiBib3VuZHMuYm90dG9tUmlnaHQueSB9OwogICAgICAgICAgICB2YXIgdHJhbnNsYXRlZEJib3ggPSB0aGlzLl9lbnRpdHlCb3VuZHMoZW50aXR5KTsKICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuRE9NLmludGVyc2VjdHNCQm94KHhSYW5nZSwgeVJhbmdlLCB0cmFuc2xhdGVkQmJveCk7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBFbnRpdGllcyBhdCBhIHBhcnRpY3VsYXIgUG9pbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0ge1BvaW50fSBwCiAgICAgICAgICogQHJldHVybnMge1Bsb3RFbnRpdHlbXX0KICAgICAgICAgKi8KICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5lbnRpdGllc0F0ID0gZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgdmFyIHhQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTsKICAgICAgICAgICAgdmFyIHlQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueSgpKTsKICAgICAgICAgICAgdmFyIHNpemVQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMuc2l6ZSgpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW50aXRpZXMoKS5maWx0ZXIoZnVuY3Rpb24gKGVudGl0eSkgewogICAgICAgICAgICAgICAgdmFyIGRhdHVtID0gZW50aXR5LmRhdHVtOwogICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gZW50aXR5LmluZGV4OwogICAgICAgICAgICAgICAgdmFyIGRhdGFzZXQgPSBlbnRpdHkuZGF0YXNldDsKICAgICAgICAgICAgICAgIHZhciB4ID0geFByb2plY3RvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIHkgPSB5UHJvamVjdG9yKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgc2l6ZSA9IHNpemVQcm9qZWN0b3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHJldHVybiB4IC0gc2l6ZSAvIDIgPD0gcC54ICYmIHAueCA8PSB4ICsgc2l6ZSAvIDIgJiYgeSAtIHNpemUgLyAyIDw9IHAueSAmJiBwLnkgPD0geSArIHNpemUgLyAyOwogICAgICAgICAgICB9KTsKICAgICAgICB9OwogICAgICAgIFNjYXR0ZXIucHJvdG90eXBlLmxhYmVsc0VuYWJsZWQgPSBmdW5jdGlvbiAoZW5hYmxlZCkgewogICAgICAgICAgICBpZiAoZW5hYmxlZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWxzRW5hYmxlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xhYmVsc0VuYWJsZWQgPSBlbmFibGVkOwogICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJBdHRyVG9Qcm9qZWN0b3JDYWNoZSgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fY3JlYXRlTm9kZXNGb3JEYXRhc2V0ID0gZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgdmFyIGRyYXdlciA9IF9zdXBlci5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldC5jYWxsKHRoaXMsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgbGFiZWxBcmVhID0gdGhpcy5fcmVuZGVyQXJlYS5hcHBlbmQoImciKS5jbGFzc2VkKFNjYXR0ZXIuX0xBQkVMX0FSRUFfQ0xBU1MsIHRydWUpOwogICAgICAgICAgICB2YXIgY29udGV4dCA9IG5ldyBzcmMkMS5TdmdDb250ZXh0KGxhYmVsQXJlYS5ub2RlKCkpOwogICAgICAgICAgICB2YXIgbWVhc3VyZXIgPSBuZXcgc3JjJDEuQ2FjaGVNZWFzdXJlcihjb250ZXh0KTsKICAgICAgICAgICAgdmFyIHdyaXRlciA9IG5ldyBzcmMkMS5Xcml0ZXIobWVhc3VyZXIsIGNvbnRleHQpOwogICAgICAgICAgICB0aGlzLl9sYWJlbENvbmZpZy5zZXQoZGF0YXNldCwgeyBsYWJlbEFyZWE6IGxhYmVsQXJlYSwgbWVhc3VyZXI6IG1lYXN1cmVyLCB3cml0ZXI6IHdyaXRlciB9KTsKICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjsKICAgICAgICB9OwogICAgICAgIFNjYXR0ZXIucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9yZW1vdmVEYXRhc2V0Tm9kZXMuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIGxhYmVsQ29uZmlnID0gdGhpcy5fbGFiZWxDb25maWcuZ2V0KGRhdGFzZXQpOwogICAgICAgICAgICBpZiAobGFiZWxDb25maWcgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgbGFiZWxDb25maWcubGFiZWxBcmVhLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxDb25maWcuZGVsZXRlKGRhdGFzZXQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fYWRkaXRpb25hbFBhaW50ID0gZnVuY3Rpb24gKHRpbWUpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdGhpcy5kYXRhc2V0cygpLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsgcmV0dXJuIF90aGlzLl9sYWJlbENvbmZpZy5nZXQoZGF0YXNldCkubGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOyB9KTsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhYmVsc0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHV0aWxzJDEuV2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2RyYXdMYWJlbHMoKTsgfSwgdGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFNjYXR0ZXIucHJvdG90eXBlLl9kcmF3TGFiZWxzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgZGF0YVRvRHJhdyA9IHRoaXMuX2dldERhdGFUb0RyYXcoKTsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzKCkuZm9yRWFjaChmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICAgICAgdmFyIGRhdGEgPSBkYXRhVG9EcmF3LmdldChkYXRhc2V0KTsKICAgICAgICAgICAgICAgIHZhciBkYXRhTGVuID0gZGF0YS5sZW5ndGg7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgZGF0YUxlbjsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgICAgIHZhciBkYXR1bSA9IGRhdGFbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGlmIChkYXR1bSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBfdGhpcy5fZHJhd0xhYmVsKGRhdHVtLCBpbmRleCwgZGF0YXNldCwgYXR0clRvUHJvamVjdG9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fZHJhd0xhYmVsID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCwgYXR0clRvUHJvamVjdG9yKSB7CiAgICAgICAgICAgIGlmIChkYXR1bS5sYWJlbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fbGFiZWxDb25maWcuZ2V0KGRhdGFzZXQpLCBsYWJlbEFyZWEgPSBfYS5sYWJlbEFyZWEsIG1lYXN1cmVyID0gX2EubWVhc3VyZXIsIHdyaXRlciA9IF9hLndyaXRlcjsKICAgICAgICAgICAgdmFyIHNjYXR0ZXJDb29yZGluYXRlcyA9IHsgeDogYXR0clRvUHJvamVjdG9yWyJ4Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSwgeTogYXR0clRvUHJvamVjdG9yWyJ5Il0oZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB9OwogICAgICAgICAgICB2YXIgc2l6ZVByb2plY3RvciA9IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy5zaXplKCkpOwogICAgICAgICAgICB2YXIgZGlhbWV0ZXIgPSBzaXplUHJvamVjdG9yKGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgIHZhciBsYWJlbCA9IHRoaXMuX2xhYmVsRm9ybWF0dGVyKGRhdHVtLmxhYmVsLCBkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgbWVhc3VyZW1lbnQgPSBtZWFzdXJlci5tZWFzdXJlKGxhYmVsKTsKICAgICAgICAgICAgdmFyIF9iID0gdGhpcy5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzKHNjYXR0ZXJDb29yZGluYXRlcywgZGlhbWV0ZXIsIG1lYXN1cmVtZW50KSwgY29udGFpbmVyRGltZW5zaW9ucyA9IF9iLmNvbnRhaW5lckRpbWVuc2lvbnMsIGxhYmVsQ29udGFpbmVyT3JpZ2luID0gX2IubGFiZWxDb250YWluZXJPcmlnaW4sIGxhYmVsT3JpZ2luID0gX2IubGFiZWxPcmlnaW4sIGFsaWdubWVudCA9IF9iLmFsaWdubWVudDsKICAgICAgICAgICAgdmFyIGxhYmVsQ29udGFpbmVyID0gdGhpcy5fY3JlYXRlTGFiZWxDb250YWluZXIobGFiZWxBcmVhLCBsYWJlbENvbnRhaW5lck9yaWdpbiwgbGFiZWxPcmlnaW4sIG1lYXN1cmVtZW50KTsKICAgICAgICAgICAgdmFyIHdyaXRlT3B0aW9ucyA9IHsgeEFsaWduOiBhbGlnbm1lbnQueCwgeUFsaWduOiBhbGlnbm1lbnQueSB9OwogICAgICAgICAgICB3cml0ZXIud3JpdGUobGFiZWwsIGNvbnRhaW5lckRpbWVuc2lvbnMud2lkdGgsIGNvbnRhaW5lckRpbWVuc2lvbnMuaGVpZ2h0LCB3cml0ZU9wdGlvbnMsIGxhYmVsQ29udGFpbmVyLm5vZGUoKSk7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fY2FsY3VsYXRlTGFiZWxQcm9wZXJ0aWVzID0gZnVuY3Rpb24gKHBvaW50Q29vcmRpbmF0ZXMsIGRpYW1ldGVyLCBtZWFzdXJlbWVudCkgewogICAgICAgICAgICAvLyBJZiBkaWFtZXRlciBpcyBzbWFsbGVyIHRoYW4gZm9udCBzaXplLCBwdXQgbGFiZWwgYWJvdmUKICAgICAgICAgICAgdmFyIGxhYmVsU2hpZnQgPSBkaWFtZXRlciA8IG1lYXN1cmVtZW50LmhlaWdodCA/IGRpYW1ldGVyIC8gMiArIFNjYXR0ZXIuX0xBQkVMX01BUkdJTl9GUk9NX0JVQkJMRSA6IDA7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjb250YWluZXJEaW1lbnNpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IG1lYXN1cmVtZW50LndpZHRoLAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogbWVhc3VyZW1lbnQuaGVpZ2h0LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxhYmVsQ29udGFpbmVyT3JpZ2luOiB7CiAgICAgICAgICAgICAgICAgICAgeDogcG9pbnRDb29yZGluYXRlcy54IC0gbWVhc3VyZW1lbnQud2lkdGggLyAyLAogICAgICAgICAgICAgICAgICAgIHk6IHBvaW50Q29vcmRpbmF0ZXMueSAtIG1lYXN1cmVtZW50LmhlaWdodCAvIDIgKyBsYWJlbFNoaWZ0LAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGxhYmVsT3JpZ2luOiB7CiAgICAgICAgICAgICAgICAgICAgeDogcG9pbnRDb29yZGluYXRlcy54LAogICAgICAgICAgICAgICAgICAgIHk6IHBvaW50Q29vcmRpbmF0ZXMueSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBhbGlnbm1lbnQ6IHsKICAgICAgICAgICAgICAgICAgICB4OiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICB5OiAiY2VudGVyIiwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLnByb3RvdHlwZS5fY3JlYXRlTGFiZWxDb250YWluZXIgPSBmdW5jdGlvbiAobGFiZWxBcmVhLCBsYWJlbENvbnRhaW5lck9yaWdpbiwgbGFiZWxPcmlnaW4sIG1lYXN1cmVtZW50KSB7CiAgICAgICAgICAgIHZhciBsYWJlbENvbnRhaW5lciA9IGxhYmVsQXJlYS5hcHBlbmQoImciKQogICAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsICJ0cmFuc2xhdGUoIiArIGxhYmVsQ29udGFpbmVyT3JpZ2luLnggKyAiLCAiICsgbGFiZWxDb250YWluZXJPcmlnaW4ueSArICIpIik7CiAgICAgICAgICAgIGxhYmVsQ29udGFpbmVyLmNsYXNzZWQoIm9uLWJhci1sYWJlbCIsIHRydWUpOwogICAgICAgICAgICByZXR1cm4gbGFiZWxDb250YWluZXI7CiAgICAgICAgfTsKICAgICAgICBTY2F0dGVyLl9TSVpFX0tFWSA9ICJzaXplIjsKICAgICAgICBTY2F0dGVyLl9TWU1CT0xfS0VZID0gInN5bWJvbCI7CiAgICAgICAgLy8gbGFiZWwgc3R1ZmYKICAgICAgICBTY2F0dGVyLl9MQUJFTF9BUkVBX0NMQVNTID0gInNjYXR0ZXItbGFiZWwtdGV4dC1hcmVhIjsKICAgICAgICBTY2F0dGVyLl9MQUJFTF9NQVJHSU5fRlJPTV9CVUJCTEUgPSAxNTsKICAgICAgICByZXR1cm4gU2NhdHRlcjsKICAgIH0oeHlQbG90LlhZUGxvdCkpOwogICAgZXhwb3J0cy5TY2F0dGVyID0gU2NhdHRlcjsKICAgIH0pOwoKICAgIHZhciBzZWdtZW50UGxvdCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwoKCgoKCgoKCiAgICB2YXIgU2VnbWVudCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFNlZ21lbnQsIF9zdXBlcik7CiAgICAgICAgLyoqCiAgICAgICAgICogQSBTZWdtZW50IFBsb3QgZGlzcGxheXMgbGluZSBzZWdtZW50cyBiYXNlZCBvbiB0aGUgZGF0YS4KICAgICAgICAgKgogICAgICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIFNlZ21lbnQoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJzZWdtZW50LXBsb3QiKTsKICAgICAgICAgICAgX3RoaXMuYXR0cigic3Ryb2tlIiwgbmV3IHNjYWxlcy5Db2xvcigpLnJhbmdlKClbMF0pOwogICAgICAgICAgICBfdGhpcy5hdHRyKCJzdHJva2Utd2lkdGgiLCAiMnB4Iik7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgU2VnbWVudC5wcm90b3R5cGUuX2NyZWF0ZURyYXdlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBkcmF3ZXIuUHJveHlEcmF3ZXIoZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IHNlZ21lbnREcmF3ZXIuU2VnbWVudFNWR0RyYXdlcigpOyB9LCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB3aW5kb3dVdGlscy53YXJuKCJjYW52YXMgcmVuZGVyZXIgaXMgbm90IHN1cHBvcnRlZCBvbiBTZWdtZW50IFBsb3QhIik7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgICAgICBTZWdtZW50LnByb3RvdHlwZS5fZ2VuZXJhdGVEcmF3U3RlcHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiBbeyBhdHRyVG9Qcm9qZWN0b3I6IHRoaXMuX2dldEF0dHJUb1Byb2plY3RvcigpLCBhbmltYXRvcjogbmV3IGFuaW1hdG9ycy5OdWxsKCkgfV07CiAgICAgICAgfTsKICAgICAgICBTZWdtZW50LnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkgPSBmdW5jdGlvbiAocHJvcGVydHkpIHsKICAgICAgICAgICAgaWYgKHByb3BlcnR5ID09PSAieDIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCAieCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHByb3BlcnR5ID09PSAieTIiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5fZmlsdGVyRm9yUHJvcGVydHkuY2FsbCh0aGlzLCAieSIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLl9maWx0ZXJGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsIHByb3BlcnR5KTsKICAgICAgICB9OwogICAgICAgIFNlZ21lbnQucHJvdG90eXBlLnggPSBmdW5jdGlvbiAoeCwgeFNjYWxlKSB7CiAgICAgICAgICAgIGlmICh4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnguY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoeFNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueC5jYWxsKHRoaXMsIHgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS54LmNhbGwodGhpcywgeCwgeFNjYWxlKTsKICAgICAgICAgICAgICAgIHZhciB4MkJpbmRpbmcgPSB0aGlzLngyKCk7CiAgICAgICAgICAgICAgICB2YXIgeDIgPSB4MkJpbmRpbmcgJiYgeDJCaW5kaW5nLmFjY2Vzc29yOwogICAgICAgICAgICAgICAgaWYgKHgyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9iaW5kUHJvcGVydHkoU2VnbWVudC5fWDJfS0VZLCB4MiwgeFNjYWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFNlZ21lbnQucHJvdG90eXBlLngyID0gZnVuY3Rpb24gKHgyKSB7CiAgICAgICAgICAgIGlmICh4MiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoU2VnbWVudC5fWDJfS0VZKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgeEJpbmRpbmcgPSB0aGlzLngoKTsKICAgICAgICAgICAgdmFyIHhTY2FsZSA9IHhCaW5kaW5nICYmIHhCaW5kaW5nLnNjYWxlOwogICAgICAgICAgICB0aGlzLl9iaW5kUHJvcGVydHkoU2VnbWVudC5fWDJfS0VZLCB4MiwgeFNjYWxlKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTZWdtZW50LnByb3RvdHlwZS55ID0gZnVuY3Rpb24gKHksIHlTY2FsZSkgewogICAgICAgICAgICBpZiAoeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS55LmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHlTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnkuY2FsbCh0aGlzLCB5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueS5jYWxsKHRoaXMsIHksIHlTY2FsZSk7CiAgICAgICAgICAgICAgICB2YXIgeTJCaW5kaW5nID0gdGhpcy55MigpOwogICAgICAgICAgICAgICAgdmFyIHkyID0geTJCaW5kaW5nICYmIHkyQmluZGluZy5hY2Nlc3NvcjsKICAgICAgICAgICAgICAgIGlmICh5MiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYmluZFByb3BlcnR5KFNlZ21lbnQuX1kyX0tFWSwgeTIsIHlTY2FsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTZWdtZW50LnByb3RvdHlwZS55MiA9IGZ1bmN0aW9uICh5MikgewogICAgICAgICAgICBpZiAoeTIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3BlcnR5QmluZGluZ3MuZ2V0KFNlZ21lbnQuX1kyX0tFWSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHlCaW5kaW5nID0gdGhpcy55KCk7CiAgICAgICAgICAgIHZhciB5U2NhbGUgPSB5QmluZGluZyAmJiB5QmluZGluZy5zY2FsZTsKICAgICAgICAgICAgdGhpcy5fYmluZFByb3BlcnR5KFNlZ21lbnQuX1kyX0tFWSwgeTIsIHlTY2FsZSk7CiAgICAgICAgICAgIHRoaXMucmVuZGVyKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgU2VnbWVudC5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IF9zdXBlci5wcm90b3R5cGUuX3Byb3BlcnR5UHJvamVjdG9ycy5jYWxsKHRoaXMpOwogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbIngxIl0gPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTsKICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJ4MiJdID0gdGhpcy54MigpID09IG51bGwgPyBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKSA6IHBsb3QuUGxvdC5fc2NhbGVkQWNjZXNzb3IodGhpcy54MigpKTsKICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJ5MSJdID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSk7CiAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsieTIiXSA9IHRoaXMueTIoKSA9PSBudWxsID8gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3Nvcih0aGlzLnkoKSkgOiBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueTIoKSk7CiAgICAgICAgICAgIHJldHVybiBhdHRyVG9Qcm9qZWN0b3I7CiAgICAgICAgfTsKICAgICAgICBTZWdtZW50LnByb3RvdHlwZS5lbnRpdGllc0F0ID0gZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgICAgIHZhciBlbnRpdHkgPSB0aGlzLmVudGl0eU5lYXJlc3QocG9pbnQpOwogICAgICAgICAgICBpZiAoZW50aXR5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbZW50aXR5XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgU2VnbWVudC5wcm90b3R5cGUuZW50aXRpZXNJbiA9IGZ1bmN0aW9uICh4UmFuZ2VPckJvdW5kcywgeVJhbmdlKSB7CiAgICAgICAgICAgIHZhciBkYXRhWFJhbmdlOwogICAgICAgICAgICB2YXIgZGF0YVlSYW5nZTsKICAgICAgICAgICAgaWYgKHlSYW5nZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB2YXIgYm91bmRzID0geFJhbmdlT3JCb3VuZHM7CiAgICAgICAgICAgICAgICBkYXRhWFJhbmdlID0geyBtaW46IGJvdW5kcy50b3BMZWZ0LngsIG1heDogYm91bmRzLmJvdHRvbVJpZ2h0LnggfTsKICAgICAgICAgICAgICAgIGRhdGFZUmFuZ2UgPSB7IG1pbjogYm91bmRzLnRvcExlZnQueSwgbWF4OiBib3VuZHMuYm90dG9tUmlnaHQueSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGF0YVhSYW5nZSA9IHhSYW5nZU9yQm91bmRzOwogICAgICAgICAgICAgICAgZGF0YVlSYW5nZSA9IHlSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZW50aXRpZXNJbnRlcnNlY3RpbmcoZGF0YVhSYW5nZSwgZGF0YVlSYW5nZSk7CiAgICAgICAgfTsKICAgICAgICBTZWdtZW50LnByb3RvdHlwZS5fZW50aXRpZXNJbnRlcnNlY3RpbmcgPSBmdW5jdGlvbiAoeFJhbmdlLCB5UmFuZ2UpIHsKICAgICAgICAgICAgdmFyIGludGVyc2VjdGVkID0gW107CiAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSB0aGlzLl9nZXRBdHRyVG9Qcm9qZWN0b3IoKTsKICAgICAgICAgICAgdmFyIGVudGl0aWVzID0gdGhpcy5lbnRpdGllcygpOwogICAgICAgICAgICB2YXIgZW50aXRpZXNMZW4gPSBlbnRpdGllcy5sZW5ndGg7CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZW50aXRpZXNMZW47IGkrKykgewogICAgICAgICAgICAgICAgdmFyIGVudGl0eSA9IGVudGl0aWVzW2ldOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xpbmVJbnRlcnNlY3RzQm94KGVudGl0eSwgeFJhbmdlLCB5UmFuZ2UsIGF0dHJUb1Byb2plY3RvcikpIHsKICAgICAgICAgICAgICAgICAgICBpbnRlcnNlY3RlZC5wdXNoKGVudGl0eSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGludGVyc2VjdGVkOwogICAgICAgIH07CiAgICAgICAgU2VnbWVudC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzQm94ID0gZnVuY3Rpb24gKGVudGl0eSwgeFJhbmdlLCB5UmFuZ2UsIGF0dHJUb1Byb2plY3RvcikgewogICAgICAgICAgICB2YXIgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB2YXIgeDEgPSBhdHRyVG9Qcm9qZWN0b3JbIngxIl0oZW50aXR5LmRhdHVtLCBlbnRpdHkuaW5kZXgsIGVudGl0eS5kYXRhc2V0KTsKICAgICAgICAgICAgdmFyIHgyID0gYXR0clRvUHJvamVjdG9yWyJ4MiJdKGVudGl0eS5kYXR1bSwgZW50aXR5LmluZGV4LCBlbnRpdHkuZGF0YXNldCk7CiAgICAgICAgICAgIHZhciB5MSA9IGF0dHJUb1Byb2plY3RvclsieTEiXShlbnRpdHkuZGF0dW0sIGVudGl0eS5pbmRleCwgZW50aXR5LmRhdGFzZXQpOwogICAgICAgICAgICB2YXIgeTIgPSBhdHRyVG9Qcm9qZWN0b3JbInkyIl0oZW50aXR5LmRhdHVtLCBlbnRpdHkuaW5kZXgsIGVudGl0eS5kYXRhc2V0KTsKICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG9mIGVuZCBwb2ludHMgb2YgdGhlIHNlZ21lbnQgaXMgaW5zaWRlIHRoZSBib3gKICAgICAgICAgICAgaWYgKCh4UmFuZ2UubWluIDw9IHgxICYmIHgxIDw9IHhSYW5nZS5tYXggJiYgeVJhbmdlLm1pbiA8PSB5MSAmJiB5MSA8PSB5UmFuZ2UubWF4KSB8fAogICAgICAgICAgICAgICAgKHhSYW5nZS5taW4gPD0geDIgJiYgeDIgPD0geFJhbmdlLm1heCAmJiB5UmFuZ2UubWluIDw9IHkyICYmIHkyIDw9IHlSYW5nZS5tYXgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3RhcnRQb2ludCA9IHsgeDogeDEsIHk6IHkxIH07CiAgICAgICAgICAgIHZhciBlbmRQb2ludCA9IHsgeDogeDIsIHk6IHkyIH07CiAgICAgICAgICAgIHZhciBjb3JuZXJzID0gWwogICAgICAgICAgICAgICAgeyB4OiB4UmFuZ2UubWluLCB5OiB5UmFuZ2UubWluIH0sCiAgICAgICAgICAgICAgICB7IHg6IHhSYW5nZS5taW4sIHk6IHlSYW5nZS5tYXggfSwKICAgICAgICAgICAgICAgIHsgeDogeFJhbmdlLm1heCwgeTogeVJhbmdlLm1heCB9LAogICAgICAgICAgICAgICAgeyB4OiB4UmFuZ2UubWF4LCB5OiB5UmFuZ2UubWluIH0sCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIHZhciBpbnRlcnNlY3Rpb25zID0gY29ybmVycy5maWx0ZXIoZnVuY3Rpb24gKHBvaW50LCBpbmRleCkgewogICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRydWUgaWYgYm9yZGVyIGZvcm1lZCBieSBjb25lY3RpbmcgY3VycmVudCBjb3JuZXIgYW5kIHByZXZpb3VzIGNvcm5lciBpbnRlcnNlY3RzIHdpdGggdGhlIHNlZ21lbnQKICAgICAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChzdGFydFBvaW50LCBlbmRQb2ludCwgcG9pbnQsIGNvcm5lcnNbaW5kZXggLSAxXSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2xpbmVJbnRlcnNlY3RzU2VnbWVudChwb2ludCwgY29ybmVyc1tpbmRleCAtIDFdLCBzdGFydFBvaW50LCBlbmRQb2ludCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwOwogICAgICAgIH07CiAgICAgICAgU2VnbWVudC5wcm90b3R5cGUuX2xpbmVJbnRlcnNlY3RzU2VnbWVudCA9IGZ1bmN0aW9uIChwb2ludDEsIHBvaW50MiwgcG9pbnQzLCBwb2ludDQpIHsKICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXNoYWRvd2VkLXZhcmlhYmxlCiAgICAgICAgICAgIHZhciBjYWxjT3JpZW50YXRpb24gPSBmdW5jdGlvbiAocG9pbnQxLCBwb2ludDIsIHBvaW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHBvaW50Mi54IC0gcG9pbnQxLngpICogKHBvaW50LnkgLSBwb2ludDIueSkgLSAocG9pbnQyLnkgLSBwb2ludDEueSkgKiAocG9pbnQueCAtIHBvaW50Mi54KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gcG9pbnQzIGFuZCBwb2ludDQgYXJlIG9uIGRpZmZlcmVudCBzaWRlcyBvZiBsaW5lIGZvcm1lZCBieSBwb2ludDEgYW5kIHBvaW50MgogICAgICAgICAgICByZXR1cm4gY2FsY09yaWVudGF0aW9uKHBvaW50MSwgcG9pbnQyLCBwb2ludDMpICogY2FsY09yaWVudGF0aW9uKHBvaW50MSwgcG9pbnQyLCBwb2ludDQpIDwgMDsKICAgICAgICB9OwogICAgICAgIFNlZ21lbnQuX1gyX0tFWSA9ICJ4MiI7CiAgICAgICAgU2VnbWVudC5fWTJfS0VZID0gInkyIjsKICAgICAgICByZXR1cm4gU2VnbWVudDsKICAgIH0oeHlQbG90LlhZUGxvdCkpOwogICAgZXhwb3J0cy5TZWdtZW50ID0gU2VnbWVudDsKICAgIH0pOwoKICAgIHZhciBzdGFja2VkQXJlYVBsb3QgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCgoKCgoKCiAgICB2YXIgU3RhY2tlZEFyZWEgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhTdGFja2VkQXJlYSwgX3N1cGVyKTsKICAgICAgICAvKioKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBTdGFja2VkQXJlYSgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gX3N1cGVyLmNhbGwodGhpcykgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX3N0YWNraW5nUmVzdWx0ID0gbWVtb2l6ZS5tZW1UaHVuayhmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5kYXRhc2V0cygpOyB9LCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy54KCkuYWNjZXNzb3I7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLnkoKS5hY2Nlc3NvcjsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX3N0YWNraW5nT3JkZXI7IH0sIGZ1bmN0aW9uIChkYXRhc2V0cywga2V5QWNjZXNzb3IsIHZhbHVlQWNjZXNzb3IsIHN0YWNraW5nT3JkZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLlN0YWNraW5nLnN0YWNrKGRhdGFzZXRzLCBrZXlBY2Nlc3NvciwgdmFsdWVBY2Nlc3Nvciwgc3RhY2tpbmdPcmRlcik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBfdGhpcy5fc3RhY2tlZEV4dGVudCA9IG1lbW9pemUubWVtVGh1bmsoX3RoaXMuX3N0YWNraW5nUmVzdWx0LCBmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy54KCkuYWNjZXNzb3I7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9maWx0ZXJGb3JQcm9wZXJ0eSgieSIpOyB9LCBmdW5jdGlvbiAoc3RhY2tpbmdSZXN1bHQsIGtleUFjY2Vzc29yLCBmaWx0ZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLlN0YWNraW5nLnN0YWNrZWRFeHRlbnQoc3RhY2tpbmdSZXN1bHQsIGtleUFjY2Vzc29yLCBmaWx0ZXIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgX3RoaXMuX2Jhc2VsaW5lVmFsdWUgPSAwOwogICAgICAgICAgICBfdGhpcy5fc3RhY2tpbmdPcmRlciA9ICJib3R0b211cCI7CiAgICAgICAgICAgIF90aGlzLmFkZENsYXNzKCJzdGFja2VkLWFyZWEtcGxvdCIpOwogICAgICAgICAgICBfdGhpcy5fYmFzZWxpbmVWYWx1ZVByb3ZpZGVyID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gW190aGlzLl9iYXNlbGluZVZhbHVlXTsgfTsKICAgICAgICAgICAgX3RoaXMuY3JvcHBlZFJlbmRlcmluZ0VuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICByZXR1cm4gX3RoaXM7CiAgICAgICAgfQogICAgICAgIFN0YWNrZWRBcmVhLnByb3RvdHlwZS5jcm9wcGVkUmVuZGVyaW5nRW5hYmxlZCA9IGZ1bmN0aW9uIChjcm9wcGVkUmVuZGVyaW5nKSB7CiAgICAgICAgICAgIGlmIChjcm9wcGVkUmVuZGVyaW5nID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNyb3BwZWRSZW5kZXJpbmcpIHsKICAgICAgICAgICAgICAgIC8vIEhBQ0tIQUNLICMzMDMyOiBjcm9wcGVkIHJlbmRlcmluZyBkb2Vzbid0IGN1cnJlbnRseSB3b3JrIGNvcnJlY3RseSBvbiBTdGFja2VkQXJlYQogICAgICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBjcm9wcGVkIHJlbmRlcmluZy4iKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmNyb3BwZWRSZW5kZXJpbmdFbmFibGVkLmNhbGwodGhpcywgY3JvcHBlZFJlbmRlcmluZyk7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuX2dldEFuaW1hdG9yID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICByZXR1cm4gbmV3IGFuaW1hdG9ycy5OdWxsKCk7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuX3NldHVwID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9zZXR1cC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9iYXNlbGluZSA9IHRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZCgiYmFzZWxpbmUiLCB0cnVlKTsKICAgICAgICB9OwogICAgICAgIFN0YWNrZWRBcmVhLnByb3RvdHlwZS54ID0gZnVuY3Rpb24gKHgsIHhTY2FsZSkgewogICAgICAgICAgICBpZiAoeCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS54LmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHhTY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLnguY2FsbCh0aGlzLCB4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueC5jYWxsKHRoaXMsIHgsIHhTY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH07CiAgICAgICAgU3RhY2tlZEFyZWEucHJvdG90eXBlLnkgPSBmdW5jdGlvbiAoeSwgeVNjYWxlKSB7CiAgICAgICAgICAgIGlmICh5ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLnkuY2FsbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoeVNjYWxlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUueS5jYWxsKHRoaXMsIHkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgX3N1cGVyLnByb3RvdHlwZS55LmNhbGwodGhpcywgeSwgeVNjYWxlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jaGVja1NhbWVEb21haW4oKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIHkgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhbiB4IHZhbHVlIG9mIGEgZ2l2ZW4gZGF0YXNldC4gVGhpcyBhbGxvd3Mgb3RoZXIgcGxvdHMgdG8gcGxvdAogICAgICAgICAqIHBvaW50cyBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIHN0YWNrZWQgdmFsdWUgaW4gdGhlIGdyYXBoLgogICAgICAgICAqIEBwYXJhbSBkYXRhc2V0IFRoZSBkYXRhc2V0IGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdGhlIHkgdmFsdWUgb2Zmc2V0CiAgICAgICAgICogQHBhcmFtIHggVGhlIHggdmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGUgeS12YWx1ZSBvZiBpbnRlcmVzdC4KICAgICAgICAgKi8KICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUueU9mZnNldCA9IGZ1bmN0aW9uIChkYXRhc2V0LCB4KSB7CiAgICAgICAgICAgIHZhciBzdGFja2luZ1Jlc3VsdCA9IHRoaXMuX3N0YWNraW5nUmVzdWx0KCk7CiAgICAgICAgICAgIGlmIChzdGFja2luZ1Jlc3VsdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkYXRhc2V0U3RhY2tpbmdSZXN1bHQgPSBzdGFja2luZ1Jlc3VsdC5nZXQoZGF0YXNldCk7CiAgICAgICAgICAgIGlmIChkYXRhc2V0U3RhY2tpbmdSZXN1bHQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgcmVzdWx0ID0gZGF0YXNldFN0YWNraW5nUmVzdWx0LmdldChTdHJpbmcoeCkpOwogICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5vZmZzZXQ7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuc3RhY2tpbmdPcmRlciA9IGZ1bmN0aW9uIChzdGFja2luZ09yZGVyKSB7CiAgICAgICAgICAgIGlmIChzdGFja2luZ09yZGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFja2luZ09yZGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N0YWNraW5nT3JkZXIgPSBzdGFja2luZ09yZGVyOwogICAgICAgICAgICB0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuZG93bnNhbXBsaW5nRW5hYmxlZCA9IGZ1bmN0aW9uIChkb3duc2FtcGxpbmcpIHsKICAgICAgICAgICAgaWYgKGRvd25zYW1wbGluZyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5kb3duc2FtcGxpbmdFbmFibGVkLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cud2FybigiV2FybmluZzogU3RhY2tlZCBBcmVhIFBsb3QgZG9lcyBub3Qgc3VwcG9ydCBkb3duc2FtcGxpbmciKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludCA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHNjYWxlZEJhc2VsaW5lID0gdGhpcy55KCkuc2NhbGUuc2NhbGUodGhpcy5fYmFzZWxpbmVWYWx1ZSk7CiAgICAgICAgICAgIHZhciBiYXNlbGluZUF0dHIgPSB7CiAgICAgICAgICAgICAgICB4MTogMCwKICAgICAgICAgICAgICAgIHkxOiBzY2FsZWRCYXNlbGluZSwKICAgICAgICAgICAgICAgIHgyOiB0aGlzLndpZHRoKCksCiAgICAgICAgICAgICAgICB5Mjogc2NhbGVkQmFzZWxpbmUsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2dldEFuaW1hdG9yKCJiYXNlbGluZSIpLmFuaW1hdGUodGhpcy5fYmFzZWxpbmUsIGJhc2VsaW5lQXR0cik7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuX3VwZGF0ZVlTY2FsZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIHlCaW5kaW5nID0gdGhpcy55KCk7CiAgICAgICAgICAgIHZhciBzY2FsZSA9ICh5QmluZGluZyAmJiB5QmluZGluZy5zY2FsZSk7CiAgICAgICAgICAgIGlmIChzY2FsZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2NhbGUuYWRkUGFkZGluZ0V4Y2VwdGlvbnNQcm92aWRlcih0aGlzLl9iYXNlbGluZVZhbHVlUHJvdmlkZXIpOwogICAgICAgICAgICBzY2FsZS5hZGRJbmNsdWRlZFZhbHVlc1Byb3ZpZGVyKHRoaXMuX2Jhc2VsaW5lVmFsdWVQcm92aWRlcik7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdGhpcy5fY2hlY2tTYW1lRG9tYWluKCk7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX29uRGF0YXNldFVwZGF0ZS5jYWxsKHRoaXMpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFN0YWNrZWRBcmVhLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkgPSBmdW5jdGlvbiAoYXR0cikgewogICAgICAgICAgICB2YXIgcHJpbWFyeUF0dHIgPSAieSI7CiAgICAgICAgICAgIGlmIChhdHRyID09PSBwcmltYXJ5QXR0cikgewogICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLl9zdGFja2VkRXh0ZW50KCldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIF9zdXBlci5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5LmNhbGwodGhpcywgYXR0cik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFN0YWNrZWRBcmVhLnByb3RvdHlwZS5fY2hlY2tTYW1lRG9tYWluID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Byb2plY3RvcnNSZWFkeSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRhdGFzZXRzID0gdGhpcy5kYXRhc2V0cygpOwogICAgICAgICAgICB2YXIga2V5QWNjZXNzb3IgPSB0aGlzLngoKS5hY2Nlc3NvcjsKICAgICAgICAgICAgdmFyIGtleVNldHMgPSBkYXRhc2V0cy5tYXAoZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkMy5zZXQoZGF0YXNldC5kYXRhKCkubWFwKGZ1bmN0aW9uIChkYXR1bSwgaSkgeyByZXR1cm4gdXRpbHMkMS5TdGFja2luZy5ub3JtYWxpemVLZXkoa2V5QWNjZXNzb3IoZGF0dW0sIGksIGRhdGFzZXQpKTsgfSkpLnZhbHVlcygpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGRvbWFpbktleXMgPSBTdGFja2VkQXJlYS5fZG9tYWluS2V5cyhkYXRhc2V0cywga2V5QWNjZXNzb3IpOwogICAgICAgICAgICBpZiAoa2V5U2V0cy5zb21lKGZ1bmN0aW9uIChrZXlTZXQpIHsgcmV0dXJuIGtleVNldC5sZW5ndGggIT09IGRvbWFpbktleXMubGVuZ3RoOyB9KSkgewogICAgICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cud2FybigidGhlIGRvbWFpbnMgYWNyb3NzIHRoZSBkYXRhc2V0cyBhcmUgbm90IHRoZSBzYW1lLiBQbG90IG1heSBwcm9kdWNlIHVuaW50ZW5kZWQgYmVoYXZpb3IuIik7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEdpdmVuIGFuIGFycmF5IG9mIERhdGFzZXRzIGFuZCB0aGUgYWNjZXNzb3IgZnVuY3Rpb24gZm9yIHRoZSBrZXksIGNvbXB1dGVzIHRoZQogICAgICAgICAqIHNldCByZXVuaW9uIChubyBkdXBsaWNhdGVzKSBvZiB0aGUgZG9tYWluIG9mIGVhY2ggRGF0YXNldC4gVGhlIGtleXMgYXJlIHN0cmluZ2lmaWVkCiAgICAgICAgICogYmVmb3JlIGJlaW5nIHJldHVybmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHtEYXRhc2V0W119IGRhdGFzZXRzIFRoZSBEYXRhc2V0cyBmb3Igd2hpY2ggd2UgZXh0cmFjdCB0aGUgZG9tYWluIGtleXMKICAgICAgICAgKiBAcGFyYW0ge0FjY2Vzc29yPGFueT59IGtleUFjY2Vzc29yIFRoZSBhY2Nlc3NvciBmb3IgdGhlIGtleSBvZiB0aGUgZGF0YQogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ1tdfSBBbiBhcnJheSBvZiBzdHJpbmdpZmllZCBrZXlzCiAgICAgICAgICovCiAgICAgICAgU3RhY2tlZEFyZWEuX2RvbWFpbktleXMgPSBmdW5jdGlvbiAoZGF0YXNldHMsIGtleUFjY2Vzc29yKSB7CiAgICAgICAgICAgIHZhciBkb21haW5LZXlzID0gZDMuc2V0KCk7CiAgICAgICAgICAgIGRhdGFzZXRzLmZvckVhY2goZnVuY3Rpb24gKGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YXNldC5kYXRhKCk7CiAgICAgICAgICAgICAgICB2YXIgZGF0YUxlbiA9IGRhdGEubGVuZ3RoOwogICAgICAgICAgICAgICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGRhdGFMZW47IGluZGV4KyspIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZGF0dW0gPSBkYXRhW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICBkb21haW5LZXlzLmFkZChrZXlBY2Nlc3NvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBkb21haW5LZXlzLnZhbHVlcygpOwogICAgICAgIH07CiAgICAgICAgU3RhY2tlZEFyZWEucHJvdG90eXBlLl9jb29yZGluYXRlUHJvamVjdG9ycyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIHhQcm9qZWN0b3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMueCgpKTsKICAgICAgICAgICAgdmFyIHlBY2Nlc3NvciA9IHRoaXMueSgpLmFjY2Vzc29yOwogICAgICAgICAgICB2YXIgeEFjY2Vzc29yID0gdGhpcy54KCkuYWNjZXNzb3I7CiAgICAgICAgICAgIHZhciBub3JtYWxpemVkWEFjY2Vzc29yID0gZnVuY3Rpb24gKGRhdHVtLCBpbmRleCwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHV0aWxzJDEuU3RhY2tpbmcubm9ybWFsaXplS2V5KHhBY2Nlc3NvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHN0YWNraW5nUmVzdWx0ID0gdGhpcy5fc3RhY2tpbmdSZXN1bHQoKTsKICAgICAgICAgICAgdmFyIHN0YWNrWVByb2plY3RvciA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICB2YXIgeSA9ICt5QWNjZXNzb3IoZCwgaSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc3RhY2tpbmdSZXN1bHQuZ2V0KGRhdGFzZXQpLmdldChub3JtYWxpemVkWEFjY2Vzc29yKGQsIGksIGRhdGFzZXQpKS5vZmZzZXQ7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMueSgpLnNjYWxlLnNjYWxlKHkgKyBvZmZzZXQpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc3RhY2tZMFByb2plY3RvciA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gc3RhY2tpbmdSZXN1bHQuZ2V0KGRhdGFzZXQpLmdldChub3JtYWxpemVkWEFjY2Vzc29yKGQsIGksIGRhdGFzZXQpKS5vZmZzZXQ7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMueSgpLnNjYWxlLnNjYWxlKG9mZnNldCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICB4UHJvamVjdG9yLAogICAgICAgICAgICAgICAgc3RhY2tZUHJvamVjdG9yLAogICAgICAgICAgICAgICAgc3RhY2tZMFByb2plY3RvciwKICAgICAgICAgICAgXTsKICAgICAgICB9OwogICAgICAgIFN0YWNrZWRBcmVhLnByb3RvdHlwZS5fcHJvcGVydHlQcm9qZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgcHJvcGVydHlUb1Byb2plY3RvcnMgPSBfc3VwZXIucHJvdG90eXBlLl9wcm9wZXJ0eVByb2plY3RvcnMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdmFyIF9hID0gdGhpcy5fY29vcmRpbmF0ZVByb2plY3RvcnMoKSwgeFByb2plY3RvciA9IF9hWzBdLCBzdGFja1lQcm9qZWN0b3IgPSBfYVsxXSwgc3RhY2tZMFByb2plY3RvciA9IF9hWzJdOwogICAgICAgICAgICBwcm9wZXJ0eVRvUHJvamVjdG9yc1siZCJdID0gdGhpcy5fY29uc3RydWN0QXJlYVByb2plY3Rvcih4UHJvamVjdG9yLCBzdGFja1lQcm9qZWN0b3IsIHN0YWNrWTBQcm9qZWN0b3IpOwogICAgICAgICAgICByZXR1cm4gcHJvcGVydHlUb1Byb2plY3RvcnM7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQXJlYS5wcm90b3R5cGUuX3BpeGVsUG9pbnQgPSBmdW5jdGlvbiAoZGF0dW0sIGluZGV4LCBkYXRhc2V0KSB7CiAgICAgICAgICAgIHZhciBwaXhlbFBvaW50ID0gX3N1cGVyLnByb3RvdHlwZS5fcGl4ZWxQb2ludC5jYWxsKHRoaXMsIGRhdHVtLCBpbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgIHZhciB4VmFsdWUgPSB0aGlzLngoKS5hY2Nlc3NvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICB2YXIgeVZhbHVlID0gdGhpcy55KCkuYWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgdmFyIHNjYWxlZFlWYWx1ZSA9IHRoaXMueSgpLnNjYWxlLnNjYWxlKCt5VmFsdWUgKyB0aGlzLl9zdGFja2luZ1Jlc3VsdCgpLmdldChkYXRhc2V0KS5nZXQodXRpbHMkMS5TdGFja2luZy5ub3JtYWxpemVLZXkoeFZhbHVlKSkub2Zmc2V0KTsKICAgICAgICAgICAgcmV0dXJuIHsgeDogcGl4ZWxQb2ludC54LCB5OiBzY2FsZWRZVmFsdWUgfTsKICAgICAgICB9OwogICAgICAgIHJldHVybiBTdGFja2VkQXJlYTsKICAgIH0oYXJlYVBsb3QuQXJlYSkpOwogICAgZXhwb3J0cy5TdGFja2VkQXJlYSA9IFN0YWNrZWRBcmVhOwogICAgfSk7CgogICAgdmFyIHN0YWNrZWRCYXJQbG90ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgoKCgogICAgdmFyIFN0YWNrZWRCYXIgPSAvKiogQGNsYXNzICovIChmdW5jdGlvbiAoX3N1cGVyKSB7CiAgICAgICAgdHNsaWJfZXM2Ll9fZXh0ZW5kcyhTdGFja2VkQmFyLCBfc3VwZXIpOwogICAgICAgIC8qKgogICAgICAgICAqIEEgU3RhY2tlZEJhciBQbG90IHN0YWNrcyBiYXJzIGFjcm9zcyBEYXRhc2V0cyBiYXNlZCBvbiB0aGUgcHJpbWFyeSB2YWx1ZSBvZiB0aGUgYmFycy4KICAgICAgICAgKiAgIE9uIGEgdmVydGljYWwgU3RhY2tlZEJhciBQbG90LCB0aGUgYmFycyB3aXRoIHRoZSBzYW1lIFggdmFsdWUgYXJlIHN0YWNrZWQuCiAgICAgICAgICogICBPbiBhIGhvcml6b250YWwgU3RhY2tlZEJhciBQbG90LCB0aGUgYmFycyB3aXRoIHRoZSBzYW1lIFkgdmFsdWUgYXJlIHN0YWNrZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAY29uc3RydWN0b3IKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlfSB4U2NhbGUKICAgICAgICAgKiBAcGFyYW0ge1NjYWxlfSB5U2NhbGUKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gW29yaWVudGF0aW9uPSJ2ZXJ0aWNhbCJdIE9uZSBvZiAidmVydGljYWwiLyJob3Jpem9udGFsIi4KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBTdGFja2VkQmFyKG9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgIGlmIChvcmllbnRhdGlvbiA9PT0gdm9pZCAwKSB7IG9yaWVudGF0aW9uID0gInZlcnRpY2FsIjsgfQogICAgICAgICAgICB2YXIgX3RoaXMgPSBfc3VwZXIuY2FsbCh0aGlzLCBvcmllbnRhdGlvbikgfHwgdGhpczsKICAgICAgICAgICAgX3RoaXMuX2V4dHJlbWFGb3JtYXR0ZXIgPSBmb3JtYXR0ZXJzLmlkZW50aXR5KCk7CiAgICAgICAgICAgIF90aGlzLl9zdGFja2luZ1Jlc3VsdCA9IG1lbW9pemUubWVtVGh1bmsoZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuZGF0YXNldHMoKTsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucG9zaXRpb24oKS5hY2Nlc3NvcjsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMubGVuZ3RoKCkuYWNjZXNzb3I7IH0sIGZ1bmN0aW9uICgpIHsgcmV0dXJuIF90aGlzLl9zdGFja2luZ09yZGVyOyB9LCBmdW5jdGlvbiAoZGF0YXNldHMsIHBvc2l0aW9uQWNjZXNzb3IsIGxlbmd0aEFjY2Vzc29yLCBzdGFja2luZ09yZGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdXRpbHMkMS5TdGFja2luZy5zdGFjayhkYXRhc2V0cywgcG9zaXRpb25BY2Nlc3NvciwgbGVuZ3RoQWNjZXNzb3IsIHN0YWNraW5nT3JkZXIpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgX3RoaXMuX3N0YWNrZWRFeHRlbnQgPSBtZW1vaXplLm1lbVRodW5rKF90aGlzLl9zdGFja2luZ1Jlc3VsdCwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMucG9zaXRpb24oKS5hY2Nlc3NvcjsgfSwgZnVuY3Rpb24gKCkgeyByZXR1cm4gX3RoaXMuX2ZpbHRlckZvclByb3BlcnR5KF90aGlzLl9pc1ZlcnRpY2FsID8gInkiIDogIngiKTsgfSwgZnVuY3Rpb24gKHN0YWNraW5nUmVzdWx0LCBwb3NpdGlvbkFjY2Vzc29yLCBmaWx0ZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLlN0YWNraW5nLnN0YWNrZWRFeHRlbnQoc3RhY2tpbmdSZXN1bHQsIHBvc2l0aW9uQWNjZXNzb3IsIGZpbHRlcik7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygic3RhY2tlZC1iYXItcGxvdCIpOwogICAgICAgICAgICBfdGhpcy5fc3RhY2tpbmdPcmRlciA9ICJib3R0b211cCI7CiAgICAgICAgICAgIHJldHVybiBfdGhpczsKICAgICAgICB9CiAgICAgICAgU3RhY2tlZEJhci5wcm90b3R5cGUuc3RhY2tpbmdPcmRlciA9IGZ1bmN0aW9uIChzdGFja2luZ09yZGVyKSB7CiAgICAgICAgICAgIGlmIChzdGFja2luZ09yZGVyID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFja2luZ09yZGVyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3N0YWNraW5nT3JkZXIgPSBzdGFja2luZ09yZGVyOwogICAgICAgICAgICB0aGlzLl9vbkRhdGFzZXRVcGRhdGUoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQmFyLnByb3RvdHlwZS5leHRyZW1hRm9ybWF0dGVyID0gZnVuY3Rpb24gKGZvcm1hdHRlcikgewogICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2V4dHJlbWFGb3JtYXR0ZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9leHRyZW1hRm9ybWF0dGVyID0gZm9ybWF0dGVyOwogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQmFyLnByb3RvdHlwZS5fc2V0dXAgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX3NldHVwLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2xhYmVsQXJlYSA9IHRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChiYXJQbG90LkJhci5fTEFCRUxfQVJFQV9DTEFTUywgdHJ1ZSk7CiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gbmV3IHNyYyQxLlN2Z0NvbnRleHQodGhpcy5fbGFiZWxBcmVhLm5vZGUoKSk7CiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVyID0gbmV3IHNyYyQxLkNhY2hlTWVhc3VyZXIoY29udGV4dCk7CiAgICAgICAgICAgIHRoaXMuX3dyaXRlciA9IG5ldyBzcmMkMS5Xcml0ZXIodGhpcy5fbWVhc3VyZXIsIGNvbnRleHQpOwogICAgICAgIH07CiAgICAgICAgU3RhY2tlZEJhci5wcm90b3R5cGUuX2RyYXdMYWJlbHMgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIF9zdXBlci5wcm90b3R5cGUuX2RyYXdMYWJlbHMuY2FsbCh0aGlzKTsKICAgICAgICAgICAgLy8gcmVtb3ZlIGFsbCBjdXJyZW50IGxhYmVscyBiZWZvcmUgcmVkcmF3aW5nCiAgICAgICAgICAgIHRoaXMuX2xhYmVsQXJlYS5zZWxlY3RBbGwoImciKS5yZW1vdmUoKTsKICAgICAgICAgICAgdmFyIGJhc2VsaW5lVmFsdWUgPSArdGhpcy5iYXNlbGluZVZhbHVlKCk7CiAgICAgICAgICAgIHZhciBwb3NpdGlvblNjYWxlID0gdGhpcy5wb3NpdGlvbigpLnNjYWxlOwogICAgICAgICAgICB2YXIgbGVuZ3RoU2NhbGUgPSB0aGlzLmxlbmd0aCgpLnNjYWxlOwogICAgICAgICAgICB2YXIgX2EgPSB1dGlscyQxLlN0YWNraW5nLnN0YWNrZWRFeHRlbnRzKHRoaXMuX3N0YWNraW5nUmVzdWx0KCkpLCBtYXhpbXVtRXh0ZW50cyA9IF9hLm1heGltdW1FeHRlbnRzLCBtaW5pbXVtRXh0ZW50cyA9IF9hLm1pbmltdW1FeHRlbnRzOwogICAgICAgICAgICB2YXIgYW55VG9vV2lkZSA9IFtdOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVHJ5IGRyYXdpbmcgdGhlIHRleHQgYXQgdGhlIGNlbnRlciBvZiB0aGUgYm91bmRzLiBUaGlzIG1ldGhvZCBkb2VzIG5vdCBkcmF3CiAgICAgICAgICAgICAqIHRoZSB0ZXh0IGlmIHRoZSB0ZXh0IHdvdWxkIG92ZXJmbG93IG91dHNpZGUgb2YgdGhlIHBsb3QuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBwYXJhbSB0ZXh0CiAgICAgICAgICAgICAqIEBwYXJhbSBib3VuZHMKICAgICAgICAgICAgICogQHJldHVybnMge2Jvb2xlYW59CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXIgbWF5YmVEcmF3TGFiZWwgPSBmdW5jdGlvbiAodGV4dCwgYm91bmRzLCBiYXJUaGlja25lc3MpIHsKICAgICAgICAgICAgICAgIHZhciBfYSA9IGJvdW5kcy50b3BMZWZ0LCB4ID0gX2EueCwgeSA9IF9hLnk7CiAgICAgICAgICAgICAgICB2YXIgd2lkdGggPSBib3VuZHMuYm90dG9tUmlnaHQueCAtIGJvdW5kcy50b3BMZWZ0Lng7CiAgICAgICAgICAgICAgICB2YXIgaGVpZ2h0ID0gYm91bmRzLmJvdHRvbVJpZ2h0LnkgLSBib3VuZHMudG9wTGVmdC55OwogICAgICAgICAgICAgICAgdmFyIHRleHRUb29Mb25nID0gX3RoaXMuX2lzVmVydGljYWwKICAgICAgICAgICAgICAgICAgICA/IHdpZHRoID4gYmFyVGhpY2tuZXNzCiAgICAgICAgICAgICAgICAgICAgOiBoZWlnaHQgPiBiYXJUaGlja25lc3M7CiAgICAgICAgICAgICAgICBpZiAoIXRleHRUb29Mb25nKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGxhYmVsQ29udGFpbmVyID0gX3RoaXMuX2xhYmVsQXJlYS5hcHBlbmQoImciKS5hdHRyKCJ0cmFuc2Zvcm0iLCAidHJhbnNsYXRlKCIgKyB4ICsgIiwgIiArIHkgKyAiKSIpOwogICAgICAgICAgICAgICAgICAgIGxhYmVsQ29udGFpbmVyLmNsYXNzZWQoInN0YWNrZWQtYmFyLWxhYmVsIiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdyaXRlT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgeEFsaWduOiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgeUFsaWduOiAiY2VudGVyIiwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIF90aGlzLl93cml0ZXIud3JpdGUodGV4dCwgd2lkdGgsIGhlaWdodCwgd3JpdGVPcHRpb25zLCBsYWJlbENvbnRhaW5lci5ub2RlKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRleHRUb29Mb25nOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgZHJhd0xhYmVsc0ZvckV4dGVudHMgPSBmdW5jdGlvbiAoc3RhY2tzLCBjb21wdXRlTGFiZWxUb3BMZWZ0KSB7CiAgICAgICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gX3RoaXMuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgICAgICB2YXIgcGxvdFdpZHRoID0gX3RoaXMud2lkdGgoKTsKICAgICAgICAgICAgICAgIHZhciBwbG90SGVpZ2h0ID0gX3RoaXMuaGVpZ2h0KCk7CiAgICAgICAgICAgICAgICBzdGFja3MuZm9yRWFjaChmdW5jdGlvbiAoc3RhY2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RhY2suZXh0ZW50ICE9PSBiYXNlbGluZVZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgZHJhdyBzdW1zIGZvciB2YWx1ZXMgbm90IGF0IHRoZSBiYXNlbGluZQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dCA9IF90aGlzLmV4dHJlbWFGb3JtYXR0ZXIoKShzdGFjay5leHRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGV4dERpbWVuc2lvbnMgPSBfdGhpcy5fbWVhc3VyZXIubWVhc3VyZSh0ZXh0KTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YWNrZWREYXR1bSA9IHN0YWNrLnN0YWNrZWREYXR1bTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsRGF0dW0gPSBzdGFja2VkRGF0dW0ub3JpZ2luYWxEYXR1bSwgb3JpZ2luYWxJbmRleCA9IHN0YWNrZWREYXR1bS5vcmlnaW5hbEluZGV4LCBvcmlnaW5hbERhdGFzZXQgPSBzdGFja2VkRGF0dW0ub3JpZ2luYWxEYXRhc2V0OwogICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNvbnNpZGVyIHN0YWNrIGV4dGVudHMgdGhhdCBhcmUgb24gdGhlIHNjcmVlbgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIV90aGlzLl9pc0RhdHVtT25TY3JlZW4oYXR0clRvUHJvamVjdG9yLCBwbG90V2lkdGgsIHBsb3RIZWlnaHQsIG9yaWdpbmFsRGF0dW0sIG9yaWdpbmFsSW5kZXgsIG9yaWdpbmFsRGF0YXNldCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgYmFyVGhpY2tuZXNzID0gcGxvdC5QbG90Ll9zY2FsZWRBY2Nlc3NvcihfdGhpcy5hdHRyKGJhclBsb3QuQmFyLl9CQVJfVEhJQ0tORVNTX0tFWSkpKG9yaWdpbmFsRGF0dW0sIG9yaWdpbmFsSW5kZXgsIG9yaWdpbmFsRGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qCiAgICAgICAgICAgICAgICAgICAgICAgICAqIFRoZSBzdGFja0VkZ2UgaXMgYWxpZ25lZCBhdCB0aGUgZWRnZSBvZiB0aGUgc3RhY2sgaW4gdGhlIGxlbmd0aCBkaW1lbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAqIGFuZCBpbiB0aGUgY2VudGVyIG9mIHRoZSBzdGFjayBpbiB0aGUgdGhpY2tuZXNzIGRpbWVuc2lvbi4KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzdGFja0VkZ2VMZW5ndGggPSBsZW5ndGhTY2FsZS5zY2FsZShzdGFjay5leHRlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhY2tDZW50ZXJQb3NpdGlvbiA9IF90aGlzLl9nZXRQb3NpdGlvbkF0dHIocG9zaXRpb25TY2FsZS5zY2FsZShzdGFjay5heGlzVmFsdWUpLCBiYXJUaGlja25lc3MpICsgYmFyVGhpY2tuZXNzIC8gMjsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YWNrRWRnZSA9IF90aGlzLl9pc1ZlcnRpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiBzdGFja0NlbnRlclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHk6IHN0YWNrRWRnZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHg6IHN0YWNrRWRnZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiBzdGFja0NlbnRlclBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRvcExlZnQgPSBjb21wdXRlTGFiZWxUb3BMZWZ0KHN0YWNrRWRnZSwgdGV4dERpbWVuc2lvbnMsIGJhclRoaWNrbmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc1Rvb1dpZGUgPSBtYXliZURyYXdMYWJlbCh0ZXh0LCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b3BMZWZ0OiB0b3BMZWZ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm90dG9tUmlnaHQ6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4OiB0b3BMZWZ0LnggKyB0ZXh0RGltZW5zaW9ucy53aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5OiB0b3BMZWZ0LnkgKyB0ZXh0RGltZW5zaW9ucy5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9LCBiYXJUaGlja25lc3MpOwogICAgICAgICAgICAgICAgICAgICAgICBhbnlUb29XaWRlLnB1c2goaXNUb29XaWRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgZHJhd0xhYmVsc0ZvckV4dGVudHMobWF4aW11bUV4dGVudHMsIGZ1bmN0aW9uIChzdGFja0VkZ2UsIG1lYXN1cmVtZW50LCB0aGlja25lc3MpIHsKICAgICAgICAgICAgICAgIHZhciBwcmltYXJ5VGV4dE1lYXN1cmVtZW50ID0gX3RoaXMuX2lzVmVydGljYWwgPyBtZWFzdXJlbWVudC53aWR0aCA6IG1lYXN1cmVtZW50LmhlaWdodDsKICAgICAgICAgICAgICAgIHZhciBzZWNvbmRhcnlUZXh0TWVhc3VyZW1lbnQgPSBfdGhpcy5faXNWZXJ0aWNhbCA/IG1lYXN1cmVtZW50LmhlaWdodCA6IG1lYXN1cmVtZW50LndpZHRoOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICB4OiBfdGhpcy5faXNWZXJ0aWNhbAogICAgICAgICAgICAgICAgICAgICAgICA/IHN0YWNrRWRnZS54IC0gcHJpbWFyeVRleHRNZWFzdXJlbWVudCAvIDIKICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGFja0VkZ2UueCArIFN0YWNrZWRCYXIuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSLAogICAgICAgICAgICAgICAgICAgIHk6IF90aGlzLl9pc1ZlcnRpY2FsCiAgICAgICAgICAgICAgICAgICAgICAgID8gc3RhY2tFZGdlLnkgLSBzZWNvbmRhcnlUZXh0TWVhc3VyZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgOiBzdGFja0VkZ2UueSAtIHByaW1hcnlUZXh0TWVhc3VyZW1lbnQgLyAyLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGRyYXdMYWJlbHNGb3JFeHRlbnRzKG1pbmltdW1FeHRlbnRzLCBmdW5jdGlvbiAoc3RhY2tFZGdlLCBtZWFzdXJlbWVudCwgdGhpY2tuZXNzKSB7CiAgICAgICAgICAgICAgICB2YXIgcHJpbWFyeVRleHRNZWFzdXJlbWVudCA9IF90aGlzLl9pc1ZlcnRpY2FsID8gbWVhc3VyZW1lbnQud2lkdGggOiBtZWFzdXJlbWVudC5oZWlnaHQ7CiAgICAgICAgICAgICAgICB2YXIgc2Vjb25kYXJ5VGV4dE1lYXN1cmVtZW50ID0gX3RoaXMuX2lzVmVydGljYWwgPyBtZWFzdXJlbWVudC5oZWlnaHQgOiBtZWFzdXJlbWVudC53aWR0aDsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgeDogX3RoaXMuX2lzVmVydGljYWwKICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGFja0VkZ2UueCAtIHByaW1hcnlUZXh0TWVhc3VyZW1lbnQgLyAyCiAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhY2tFZGdlLnggLSBzZWNvbmRhcnlUZXh0TWVhc3VyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgeTogX3RoaXMuX2lzVmVydGljYWwKICAgICAgICAgICAgICAgICAgICAgICAgPyBzdGFja0VkZ2UueSArIFN0YWNrZWRCYXIuX0VYVFJFTUFfTEFCRUxfTUFSR0lOX0ZST01fQkFSCiAgICAgICAgICAgICAgICAgICAgICAgIDogc3RhY2tFZGdlLnkgLSBwcmltYXJ5VGV4dE1lYXN1cmVtZW50IC8gMiwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoYW55VG9vV2lkZS5zb21lKGZ1bmN0aW9uIChkKSB7IHJldHVybiBkOyB9KSkgewogICAgICAgICAgICAgICAgdGhpcy5fbGFiZWxBcmVhLnNlbGVjdEFsbCgiZyIpLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBTdGFja2VkQmFyLnByb3RvdHlwZS5fZ2VuZXJhdGVBdHRyVG9Qcm9qZWN0b3IgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHZhciBhdHRyVG9Qcm9qZWN0b3IgPSBfc3VwZXIucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3Rvci5jYWxsKHRoaXMpOwogICAgICAgICAgICB2YXIgdmFsdWVBdHRyID0gdGhpcy5faXNWZXJ0aWNhbCA/ICJ5IiA6ICJ4IjsKICAgICAgICAgICAgdmFyIGxlbmd0aFNjYWxlID0gdGhpcy5sZW5ndGgoKS5zY2FsZTsKICAgICAgICAgICAgdmFyIGxlbmd0aEFjY2Vzc29yID0gdGhpcy5sZW5ndGgoKS5hY2Nlc3NvcjsKICAgICAgICAgICAgdmFyIHBvc2l0aW9uQWNjZXNzb3IgPSB0aGlzLnBvc2l0aW9uKCkuYWNjZXNzb3I7CiAgICAgICAgICAgIHZhciBub3JtYWxpemVkUG9zaXRpb25BY2Nlc3NvciA9IGZ1bmN0aW9uIChkYXR1bSwgaW5kZXgsIGRhdGFzZXQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB1dGlscyQxLlN0YWNraW5nLm5vcm1hbGl6ZUtleShwb3NpdGlvbkFjY2Vzc29yKGRhdHVtLCBpbmRleCwgZGF0YXNldCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgc3RhY2tpbmdSZXN1bHQgPSB0aGlzLl9zdGFja2luZ1Jlc3VsdCgpOwogICAgICAgICAgICB2YXIgZ2V0U3RhcnQgPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aFNjYWxlLnNjYWxlKHN0YWNraW5nUmVzdWx0LmdldChkYXRhc2V0KS5nZXQobm9ybWFsaXplZFBvc2l0aW9uQWNjZXNzb3IoZCwgaSwgZGF0YXNldCkpLm9mZnNldCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBnZXRFbmQgPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGxlbmd0aFNjYWxlLnNjYWxlKCtsZW5ndGhBY2Nlc3NvcihkLCBpLCBkYXRhc2V0KSArCiAgICAgICAgICAgICAgICAgICAgc3RhY2tpbmdSZXN1bHQuZ2V0KGRhdGFzZXQpLmdldChub3JtYWxpemVkUG9zaXRpb25BY2Nlc3NvcihkLCBpLCBkYXRhc2V0KSkub2Zmc2V0KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIGhlaWdodEYgPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKGdldEVuZChkLCBpLCBkYXRhc2V0KSAtIGdldFN0YXJ0KGQsIGksIGRhdGFzZXQpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yW3RoaXMuX2lzVmVydGljYWwgPyAiaGVpZ2h0IiA6ICJ3aWR0aCJdID0gaGVpZ2h0RjsKICAgICAgICAgICAgdmFyIGF0dHJGdW5jdGlvbiA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gK2xlbmd0aEFjY2Vzc29yKGQsIGksIGRhdGFzZXQpIDwgMCA/IGdldFN0YXJ0KGQsIGksIGRhdGFzZXQpIDogZ2V0RW5kKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBhdHRyVG9Qcm9qZWN0b3JbdmFsdWVBdHRyXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3RoaXMuX2lzVmVydGljYWwgPyBhdHRyRnVuY3Rpb24oZCwgaSwgZGF0YXNldCkgOiBhdHRyRnVuY3Rpb24oZCwgaSwgZGF0YXNldCkgLSBoZWlnaHRGKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICB9OwogICAgICAgICAgICByZXR1cm4gYXR0clRvUHJvamVjdG9yOwogICAgICAgIH07CiAgICAgICAgU3RhY2tlZEJhci5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5ID0gZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgdmFyIHByaW1hcnlBdHRyID0gdGhpcy5faXNWZXJ0aWNhbCA/ICJ5IiA6ICJ4IjsKICAgICAgICAgICAgaWYgKGF0dHIgPT09IHByaW1hcnlBdHRyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW3RoaXMuX3N0YWNrZWRFeHRlbnQoKV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX3N1cGVyLnByb3RvdHlwZS5nZXRFeHRlbnRzRm9yUHJvcGVydHkuY2FsbCh0aGlzLCBhdHRyKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgU3RhY2tlZEJhci5wcm90b3R5cGUuaW52YWxpZGF0ZUNhY2hlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLmludmFsaWRhdGVDYWNoZS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9tZWFzdXJlci5yZXNldCgpOwogICAgICAgIH07CiAgICAgICAgU3RhY2tlZEJhci5fRVhUUkVNQV9MQUJFTF9NQVJHSU5fRlJPTV9CQVIgPSA1OwogICAgICAgIHJldHVybiBTdGFja2VkQmFyOwogICAgfShiYXJQbG90LkJhcikpOwogICAgZXhwb3J0cy5TdGFja2VkQmFyID0gU3RhY2tlZEJhcjsKICAgIH0pOwoKICAgIHZhciB3YXRlcmZhbGxQbG90ID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqCiAgICAgKiBDb3B5cmlnaHQgMjAxNC1wcmVzZW50IFBhbGFudGlyIFRlY2hub2xvZ2llcwogICAgICogQGxpY2Vuc2UgTUlUCiAgICAgKi8KICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAiX19lc01vZHVsZSIsIHsgdmFsdWU6IHRydWUgfSk7CgoKCgogICAgdmFyIFdhdGVyZmFsbCA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uIChfc3VwZXIpIHsKICAgICAgICB0c2xpYl9lczYuX19leHRlbmRzKFdhdGVyZmFsbCwgX3N1cGVyKTsKICAgICAgICBmdW5jdGlvbiBXYXRlcmZhbGwoKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IF9zdXBlci5jYWxsKHRoaXMpIHx8IHRoaXM7CiAgICAgICAgICAgIF90aGlzLl9jb25uZWN0b3JzRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICBfdGhpcy5hZGRDbGFzcygid2F0ZXJmYWxsLXBsb3QiKTsKICAgICAgICAgICAgcmV0dXJuIF90aGlzOwogICAgICAgIH0KICAgICAgICBXYXRlcmZhbGwucHJvdG90eXBlLmNvbm5lY3RvcnNFbmFibGVkID0gZnVuY3Rpb24gKGVuYWJsZWQpIHsKICAgICAgICAgICAgaWYgKGVuYWJsZWQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RvcnNFbmFibGVkID0gZW5hYmxlZDsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBXYXRlcmZhbGwucHJvdG90eXBlLnRvdGFsID0gZnVuY3Rpb24gKHRvdGFsKSB7CiAgICAgICAgICAgIGlmICh0b3RhbCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJvcGVydHlCaW5kaW5ncy5nZXQoV2F0ZXJmYWxsLl9UT1RBTF9LRVkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JpbmRQcm9wZXJ0eShXYXRlcmZhbGwuX1RPVEFMX0tFWSwgdG90YWwsIG51bGwpOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9OwogICAgICAgIFdhdGVyZmFsbC5wcm90b3R5cGUuX2FkZGl0aW9uYWxQYWludCA9IGZ1bmN0aW9uICh0aW1lKSB7CiAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RvckFyZWEuc2VsZWN0QWxsKCJsaW5lIikucmVtb3ZlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9jb25uZWN0b3JzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgdXRpbHMkMS5XaW5kb3cuc2V0VGltZW91dChmdW5jdGlvbiAoKSB7IHJldHVybiBfdGhpcy5fZHJhd0Nvbm5lY3RvcnMoKTsgfSwgdGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFdhdGVyZmFsbC5wcm90b3R5cGUuX2NyZWF0ZU5vZGVzRm9yRGF0YXNldCA9IGZ1bmN0aW9uIChkYXRhc2V0KSB7CiAgICAgICAgICAgIHZhciBkcmF3ZXIgPSBfc3VwZXIucHJvdG90eXBlLl9jcmVhdGVOb2Rlc0ZvckRhdGFzZXQuY2FsbCh0aGlzLCBkYXRhc2V0KTsKICAgICAgICAgICAgdGhpcy5fY29ubmVjdG9yQXJlYSA9IHRoaXMuX3JlbmRlckFyZWEuYXBwZW5kKCJnIikuY2xhc3NlZChXYXRlcmZhbGwuX0NPTk5FQ1RPUl9BUkVBX0NMQVNTLCB0cnVlKTsKICAgICAgICAgICAgcmV0dXJuIGRyYXdlcjsKICAgICAgICB9OwogICAgICAgIFdhdGVyZmFsbC5wcm90b3R5cGUuZ2V0RXh0ZW50c0ZvclByb3BlcnR5ID0gZnVuY3Rpb24gKGF0dHIpIHsKICAgICAgICAgICAgdmFyIHByaW1hcnlBdHRyID0gInkiOwogICAgICAgICAgICBpZiAoYXR0ciA9PT0gcHJpbWFyeUF0dHIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy5fZXh0ZW50XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBfc3VwZXIucHJvdG90eXBlLmdldEV4dGVudHNGb3JQcm9wZXJ0eS5jYWxsKHRoaXMsIGF0dHIpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBXYXRlcmZhbGwucHJvdG90eXBlLl9nZW5lcmF0ZUF0dHJUb1Byb2plY3RvciA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIF90aGlzID0gdGhpczsKICAgICAgICAgICAgdmFyIGF0dHJUb1Byb2plY3RvciA9IF9zdXBlci5wcm90b3R5cGUuX2dlbmVyYXRlQXR0clRvUHJvamVjdG9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHZhciB5U2NhbGUgPSB0aGlzLnkoKS5zY2FsZTsKICAgICAgICAgICAgdmFyIHRvdGFsQWNjZXNzb3IgPSBwbG90LlBsb3QuX3NjYWxlZEFjY2Vzc29yKHRoaXMudG90YWwoKSk7CiAgICAgICAgICAgIHZhciB5QXR0ciA9IHRoaXMuYXR0cigieSIpOwogICAgICAgICAgICBpZiAoeUF0dHIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJ5Il0gPSBmdW5jdGlvbiAoZCwgaSwgZGF0YXNldCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBfdGhpcy55KCkuYWNjZXNzb3IoZCwgaSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVG90YWwgPSB0b3RhbEFjY2Vzc29yKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc1RvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih5U2NhbGUuc2NhbGUoY3VycmVudFZhbHVlKSwgeVNjYWxlLnNjYWxlKDApKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3VidG90YWwgPSBfdGhpcy5fc3VidG90YWxzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRWYWx1ZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geVNjYWxlLnNjYWxlKGN1cnJlbnRTdWJ0b3RhbCAtIGN1cnJlbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geVNjYWxlLnNjYWxlKGN1cnJlbnRTdWJ0b3RhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByaW9yU3VidG90YWwgPSBfdGhpcy5fc3VidG90YWxzW2kgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRTdWJ0b3RhbCA+IHByaW9yU3VidG90YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5U2NhbGUuc2NhbGUoY3VycmVudFN1YnRvdGFsKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB5U2NhbGUuc2NhbGUocHJpb3JTdWJ0b3RhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBoZWlnaHRBdHRyID0gdGhpcy5hdHRyKCJoZWlnaHQiKTsKICAgICAgICAgICAgaWYgKGhlaWdodEF0dHIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXR0clRvUHJvamVjdG9yWyJoZWlnaHQiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGlzVG90YWwgPSB0b3RhbEFjY2Vzc29yKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSBfdGhpcy55KCkuYWNjZXNzb3IoZCwgaSwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVG90YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHlTY2FsZS5zY2FsZShjdXJyZW50VmFsdWUpIC0geVNjYWxlLnNjYWxlKDApKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50U3VidG90YWwgPSBfdGhpcy5fc3VidG90YWxzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1hdGguYWJzKHlTY2FsZS5zY2FsZShjdXJyZW50U3VidG90YWwpIC0geVNjYWxlLnNjYWxlKGN1cnJlbnRTdWJ0b3RhbCAtIGN1cnJlbnRWYWx1ZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByaW9yU3VidG90YWwgPSBfdGhpcy5fc3VidG90YWxzW2kgLSAxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLmFicyh5U2NhbGUuc2NhbGUoY3VycmVudFN1YnRvdGFsKSAtIHlTY2FsZS5zY2FsZShwcmlvclN1YnRvdGFsKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF0dHJUb1Byb2plY3RvclsiY2xhc3MiXSA9IGZ1bmN0aW9uIChkLCBpLCBkYXRhc2V0KSB7CiAgICAgICAgICAgICAgICB2YXIgYmFzZUNsYXNzID0gIiI7CiAgICAgICAgICAgICAgICBpZiAoX3RoaXMuYXR0cigiY2xhc3MiKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgYmFzZUNsYXNzID0gX3RoaXMuYXR0cigiY2xhc3MiKS5hY2Nlc3NvcihkLCBpLCBkYXRhc2V0KSArICIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBpc1RvdGFsID0gdG90YWxBY2Nlc3NvcihkLCBpLCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmIChpc1RvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJhc2VDbGFzcyArIFdhdGVyZmFsbC5fQkFSX1RPVEFMX0NMQVNTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbHRhID0gX3RoaXMueSgpLmFjY2Vzc29yKGQsIGksIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBiYXNlQ2xhc3MgKyAoZGVsdGEgPiAwID8gV2F0ZXJmYWxsLl9CQVJfR1JPV1RIX0NMQVNTIDogV2F0ZXJmYWxsLl9CQVJfREVDTElORV9DTEFTUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBhdHRyVG9Qcm9qZWN0b3I7CiAgICAgICAgfTsKICAgICAgICBXYXRlcmZhbGwucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVN1YnRvdGFscygpOwogICAgICAgICAgICBfc3VwZXIucHJvdG90eXBlLl9vbkRhdGFzZXRVcGRhdGUuY2FsbCh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfTsKICAgICAgICBXYXRlcmZhbGwucHJvdG90eXBlLl9jYWxjdWxhdGVTdWJ0b3RhbHNBbmRFeHRlbnQgPSBmdW5jdGlvbiAoZGF0YXNldCkgewogICAgICAgICAgICB2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgICAgICAgICAgdmFyIG1heCA9IE51bWJlci5NSU5fVkFMVUU7CiAgICAgICAgICAgIHZhciB0b3RhbCA9IDA7CiAgICAgICAgICAgIHZhciBoYXNTdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBkYXRhID0gZGF0YXNldC5kYXRhKCk7CiAgICAgICAgICAgIHZhciBkYXRhTGVuID0gZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBkYXRhTGVuOyBpbmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0dW0gPSBkYXRhW2luZGV4XTsKICAgICAgICAgICAgICAgIHZhciBjdXJyZW50VmFsdWUgPSB0aGlzLnkoKS5hY2Nlc3NvcihkYXR1bSwgaW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIGlzVG90YWwgPSB0aGlzLnRvdGFsKCkuYWNjZXNzb3IoZGF0dW0sIGluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIGlmICghaXNUb3RhbCB8fCBpbmRleCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IGN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3N1YnRvdGFscy5wdXNoKHRvdGFsKTsKICAgICAgICAgICAgICAgIGlmICh0b3RhbCA8IG1pbikgewogICAgICAgICAgICAgICAgICAgIG1pbiA9IHRvdGFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRvdGFsID4gbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgbWF4ID0gdG90YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNUb3RhbCkgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWUgPCBtaW4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluID0gY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlID4gbWF4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1heCA9IGN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIWhhc1N0YXJ0ZWQgJiYgaXNUb3RhbCkgewogICAgICAgICAgICAgICAgICAgIHZhciBzdGFydFRvdGFsID0gY3VycmVudFZhbHVlIC0gdG90YWw7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9zdWJ0b3RhbHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3VidG90YWxzW2ldICs9IHN0YXJ0VG90YWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGhhc1N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRvdGFsICs9IHN0YXJ0VG90YWw7CiAgICAgICAgICAgICAgICAgICAgbWluICs9IHN0YXJ0VG90YWw7CiAgICAgICAgICAgICAgICAgICAgbWF4ICs9IHN0YXJ0VG90YWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZXh0ZW50ID0gW21pbiwgbWF4XTsKICAgICAgICB9OwogICAgICAgIFdhdGVyZmFsbC5wcm90b3R5cGUuX2RyYXdDb25uZWN0b3JzID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICB2YXIgYXR0clRvUHJvamVjdG9yID0gdGhpcy5fZ2V0QXR0clRvUHJvamVjdG9yKCk7CiAgICAgICAgICAgIHZhciBkYXRhc2V0ID0gdGhpcy5kYXRhc2V0cygpWzBdOwogICAgICAgICAgICBmb3IgKHZhciBkYXR1bUluZGV4ID0gMTsgZGF0dW1JbmRleCA8IGRhdGFzZXQuZGF0YSgpLmxlbmd0aDsgZGF0dW1JbmRleCsrKSB7CiAgICAgICAgICAgICAgICB2YXIgcHJldkluZGV4ID0gZGF0dW1JbmRleCAtIDE7CiAgICAgICAgICAgICAgICB2YXIgZGF0dW0gPSBkYXRhc2V0LmRhdGEoKVtkYXR1bUluZGV4XTsKICAgICAgICAgICAgICAgIHZhciBwcmV2RGF0dW0gPSBkYXRhc2V0LmRhdGEoKVtwcmV2SW5kZXhdOwogICAgICAgICAgICAgICAgdmFyIHggPSBhdHRyVG9Qcm9qZWN0b3JbIngiXShwcmV2RGF0dW0sIHByZXZJbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICB2YXIgeDIgPSBhdHRyVG9Qcm9qZWN0b3JbIngiXShkYXR1bSwgZGF0dW1JbmRleCwgZGF0YXNldCkgKyBhdHRyVG9Qcm9qZWN0b3JbIndpZHRoIl0oZGF0dW0sIGRhdHVtSW5kZXgsIGRhdGFzZXQpOwogICAgICAgICAgICAgICAgdmFyIHkgPSBhdHRyVG9Qcm9qZWN0b3JbInkiXShkYXR1bSwgZGF0dW1JbmRleCwgZGF0YXNldCk7CiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX3N1YnRvdGFsc1tkYXR1bUluZGV4XSA+IDAgJiYgdGhpcy5fc3VidG90YWxzW2RhdHVtSW5kZXhdID4gdGhpcy5fc3VidG90YWxzW3ByZXZJbmRleF0pIHx8CiAgICAgICAgICAgICAgICAgICAgKHRoaXMuX3N1YnRvdGFsc1tkYXR1bUluZGV4XSA8IDAgJiYgdGhpcy5fc3VidG90YWxzW2RhdHVtSW5kZXhdID49IHRoaXMuX3N1YnRvdGFsc1twcmV2SW5kZXhdKSkgewogICAgICAgICAgICAgICAgICAgIHkgPSBhdHRyVG9Qcm9qZWN0b3JbInkiXShkYXR1bSwgZGF0dW1JbmRleCwgZGF0YXNldCkgKyBhdHRyVG9Qcm9qZWN0b3JbImhlaWdodCJdKGRhdHVtLCBkYXR1bUluZGV4LCBkYXRhc2V0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2Nvbm5lY3RvckFyZWEuYXBwZW5kKCJsaW5lIikuY2xhc3NlZChXYXRlcmZhbGwuX0NPTk5FQ1RPUl9DTEFTUywgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAuYXR0cigieDEiLCB4KS5hdHRyKCJ4MiIsIHgyKS5hdHRyKCJ5MSIsIHkpLmF0dHIoInkyIiwgeSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgICAgIFdhdGVyZmFsbC5wcm90b3R5cGUuX3VwZGF0ZVN1YnRvdGFscyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgdmFyIGRhdGFzZXRzID0gdGhpcy5kYXRhc2V0cygpOwogICAgICAgICAgICBpZiAoZGF0YXNldHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgdmFyIGRhdGFzZXQgPSBkYXRhc2V0c1tkYXRhc2V0cy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YnRvdGFscyA9IG5ldyBBcnJheSgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlU3VidG90YWxzQW5kRXh0ZW50KGRhdGFzZXQpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgICBXYXRlcmZhbGwuX0JBUl9ERUNMSU5FX0NMQVNTID0gIndhdGVyZmFsbC1kZWNsaW5lIjsKICAgICAgICBXYXRlcmZhbGwuX0JBUl9HUk9XVEhfQ0xBU1MgPSAid2F0ZXJmYWxsLWdyb3d0aCI7CiAgICAgICAgV2F0ZXJmYWxsLl9CQVJfVE9UQUxfQ0xBU1MgPSAid2F0ZXJmYWxsLXRvdGFsIjsKICAgICAgICBXYXRlcmZhbGwuX0NPTk5FQ1RPUl9DTEFTUyA9ICJjb25uZWN0b3IiOwogICAgICAgIFdhdGVyZmFsbC5fQ09OTkVDVE9SX0FSRUFfQ0xBU1MgPSAiY29ubmVjdG9yLWFyZWEiOwogICAgICAgIFdhdGVyZmFsbC5fVE9UQUxfS0VZID0gInRvdGFsIjsKICAgICAgICByZXR1cm4gV2F0ZXJmYWxsOwogICAgfShiYXJQbG90LkJhcikpOwogICAgZXhwb3J0cy5XYXRlcmZhbGwgPSBXYXRlcmZhbGw7CiAgICB9KTsKCiAgICB2YXIgcGxvdHMgPSBjcmVhdGVDb21tb25qc01vZHVsZShmdW5jdGlvbiAobW9kdWxlLCBleHBvcnRzKSB7CiAgICAvKioKICAgICAqIENvcHlyaWdodCAyMDE0LXByZXNlbnQgUGFsYW50aXIgVGVjaG5vbG9naWVzCiAgICAgKiBAbGljZW5zZSBNSVQKICAgICAqLwogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGFyZWFQbG90LCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoYmFyUGxvdCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGNvbW1vbnMsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihjbHVzdGVyZWRCYXJQbG90LCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIobGluZVBsb3QsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihwaWVQbG90LCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIocmVjdGFuZ2xlUGxvdCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHNjYXR0ZXJQbG90LCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoc2VnbWVudFBsb3QsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihzdGFja2VkQXJlYVBsb3QsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihzdGFja2VkQmFyUGxvdCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHdhdGVyZmFsbFBsb3QsIGV4cG9ydHMpOwogICAgfSk7CgogICAgdmFyIHZlcnNpb24kMyA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKgogICAgICogQ29weXJpZ2h0IDIwMTQtcHJlc2VudCBQYWxhbnRpciBUZWNobm9sb2dpZXMKICAgICAqIEBsaWNlbnNlIE1JVAogICAgICovCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgIl9fZXNNb2R1bGUiLCB7IHZhbHVlOiB0cnVlIH0pOwogICAgLyoKICAgICAqIFdBUk5JTkc6IFRoZSBqcyBvdXRwdXQgb2YgdGhpcyBleHByZXNzaW9uIGlzIHNlYXJjaGVkIGJ5IHN0cmluZyAoeWVzLCBJIGtub3cpIGFuZCByZXBsYWNlZCB3aXRoIGEKICAgICAqIHJlYWwgdmVyc2lvbiBudW1iZXIgZHVyaW5nIHRoZSBkaXN0IHBoYXNlIGZvciBmb3IgbnBtIG1vZHVsZSBwdWJsaXNoaW5nLiBNb2RpZnlpbmcgdGhpcyBsaW5lIHNob3VsZAogICAgICogYmUgYWNjb21wYW5pZWQgYnkgbW9kaWZ5aW5nIHRoZSAic2VkLXZlcnNpb24iIHRhc2sgaW4gcGFja2FnZS5qc29uIGFjY29yZGluZ2x5LgogICAgICovCiAgICBleHBvcnRzLnZlcnNpb24gPSAiMy45LjAiOwogICAgfSk7CgogICAgdmFyIHNyYyQyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsICJfX2VzTW9kdWxlIiwgeyB2YWx1ZTogdHJ1ZSB9KTsKCiAgICAvLyBIQUNLSEFDSyBkMy1zZWxlY3Rpb24tbXVsdGkgZG9lc24ndCBwbGF5IHdlbGwgd2l0aCBkZWZhdWx0ICJkMyIgcGFja2FnZSBpbiBhCiAgICAvLyBidW5kbGVyIGVudmlyb25tZW50IChlLmcuIHdlYnBhY2spIC0gc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zZWxlY3Rpb24tbXVsdGkvaXNzdWVzLzExCiAgICAvLyB3ZSBhZGQgaXQgbWFudWFsbHkgdG8gdGhlIGRlZmF1bHQgImQzIiBidW5kbGUKCgogICAgZXhwb3J0cy5BbmltYXRvcnMgPSBhbmltYXRvcnM7CgogICAgZXhwb3J0cy5BeGVzID0gYXhlczsKCiAgICBleHBvcnRzLkNvbXBvbmVudHMgPSBjb21wb25lbnRzOwoKICAgIGV4cG9ydHMuQ29uZmlncyA9IGNvbmZpZyQxOwoKICAgIGV4cG9ydHMuRm9ybWF0dGVycyA9IGZvcm1hdHRlcnM7CgogICAgZXhwb3J0cy5SZW5kZXJDb250cm9sbGVyID0gcmVuZGVyQ29udHJvbGxlcjsKCiAgICBleHBvcnRzLlJlbmRlclBvbGljaWVzID0gcmVuZGVyUG9saWN5OwoKICAgIGV4cG9ydHMuU3ltYm9sRmFjdG9yaWVzID0gc3ltYm9sRmFjdG9yaWVzOwoKICAgIGV4cG9ydHMuRGlzcGF0Y2hlcnMgPSBkaXNwYXRjaGVyczsKCiAgICBleHBvcnRzLkRyYXdlcnMgPSBkcmF3ZXJzOwoKICAgIGV4cG9ydHMuSW50ZXJhY3Rpb25zID0gaW50ZXJhY3Rpb25zOwoKICAgIGV4cG9ydHMuUGxvdHMgPSBwbG90czsKCiAgICBleHBvcnRzLlNjYWxlcyA9IHNjYWxlczsKCiAgICBleHBvcnRzLlV0aWxzID0gdXRpbHMkMTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoYXhpcyQyLCBleHBvcnRzKTsKCiAgICBleHBvcnRzLlRpbWVJbnRlcnZhbCA9IHRpbWVBeGlzLlRpbWVJbnRlcnZhbDsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoY29tcG9uZW50LCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoY29tcG9uZW50Q29udGFpbmVyLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoZGF0YXNldCwgZXhwb3J0cyk7CgogICAgZXhwb3J0cy52ZXJzaW9uID0gdmVyc2lvbiQzLnZlcnNpb247CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGRpc3BhdGNoZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihkcmF3ZXIsIGV4cG9ydHMpOwogICAgdHNsaWJfZXM2Ll9fZXhwb3J0U3RhcihpbnRlcmFjdGlvbiwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKGtleUludGVyYWN0aW9uLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoeHlQbG90LCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIocGxvdCwgZXhwb3J0cyk7CiAgICB0c2xpYl9lczYuX19leHBvcnRTdGFyKHF1YW50aXRhdGl2ZVNjYWxlLCBleHBvcnRzKTsKICAgIHRzbGliX2VzNi5fX2V4cG9ydFN0YXIoc2NhbGUsIGV4cG9ydHMpOwogICAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMTUgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEEgbGlzdCBvZiBzeW1ib2xzIHRoYXQgbGluZSBjaGFydHMgY2FuIGN5Y2xlIHRocm91Z2ggcGVyIGRhdGEgc2VyaWVzLgogICAgICovCiAgICBjb25zdCBTWU1CT0xTX0xJU1QgPSBbCiAgICAgICAgewogICAgICAgICAgICBjaGFyYWN0ZXI6ICdcdTI1RkMnLAogICAgICAgICAgICBtZXRob2Q6IHNyYyQyLlN5bWJvbEZhY3Rvcmllcy5zcXVhcmUsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGNoYXJhY3RlcjogJ1x1MjVDNicsCiAgICAgICAgICAgIG1ldGhvZDogc3JjJDIuU3ltYm9sRmFjdG9yaWVzLmRpYW1vbmQsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGNoYXJhY3RlcjogJ1x1MjVCMicsCiAgICAgICAgICAgIG1ldGhvZDogc3JjJDIuU3ltYm9sRmFjdG9yaWVzLnRyaWFuZ2xlLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBjaGFyYWN0ZXI6ICdcdTI2MDUnLAogICAgICAgICAgICBtZXRob2Q6IHNyYyQyLlN5bWJvbEZhY3Rvcmllcy5zdGFyLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBjaGFyYWN0ZXI6ICdcdTI3MUEnLAogICAgICAgICAgICBtZXRob2Q6IHNyYyQyLlN5bWJvbEZhY3Rvcmllcy5jcm9zcywKICAgICAgICB9LAogICAgXTsKICAgIC8qKiBYIGF4aXMgY2hvaWNlcyBmb3IgVGVuc29yQm9hcmQgY2hhcnRzLiAqLwogICAgdmFyIFhUeXBlOwogICAgKGZ1bmN0aW9uIChYVHlwZSkgewogICAgICAgIC8qKiBMaW5lYXIgc2NhbGUgdXNpbmcgdGhlICJzdGVwIiBwcm9wZXJ0eSBvZiB0aGUgZGF0dW0uICovCiAgICAgICAgWFR5cGVbIlNURVAiXSA9ICJzdGVwIjsKICAgICAgICAvKiogVGVtcG9yYWwgc2NhbGUgdXNpbmcgdGhlICJ3YWxsX3RpbWUiIHByb3BlcnR5IG9mIHRoZSBkYXR1bS4gKi8KICAgICAgICBYVHlwZVsiUkVMQVRJVkUiXSA9ICJyZWxhdGl2ZSI7CiAgICAgICAgLyoqCiAgICAgICAgICogVGVtcG9yYWwgc2NhbGUgdXNpbmcgdGhlICJyZWxhdGl2ZSIgcHJvcGVydHkgb2YgdGhlIGRhdHVtIGlmIGl0IGlzIHByZXNlbnQKICAgICAgICAgKiBvciBjYWxjdWxhdGluZyBmcm9tICJ3YWxsX3RpbWUiIGlmIGl0IGlzbid0LgogICAgICAgICAqLwogICAgICAgIFhUeXBlWyJXQUxMX1RJTUUiXSA9ICJ3YWxsX3RpbWUiOwogICAgfSkoWFR5cGUgfHwgKFhUeXBlID0ge30pKTsKICAgIGxldCBZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTiA9IDQ7CiAgICBsZXQgU1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OID0gNDsKICAgIGxldCBZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTiA9IDM7CiAgICBsZXQgVE9PTFRJUF9ZX1BJWEVMX09GRlNFVCA9IDIwOwogICAgbGV0IFRPT0xUSVBfQ0lSQ0xFX1NJWkUgPSA0OwogICAgbGV0IE5BTl9TWU1CT0xfU0laRSA9IDY7CiAgICAvKiBDcmVhdGUgYSBmb3JtYXR0ZXIgZnVuY3Rpb24gdGhhdCB3aWxsIHN3aXRjaCBiZXR3ZWVuIGV4cG9uZW50aWFsIGFuZAogICAgICogcmVndWxhciBkaXNwbGF5IGRlcGVuZGluZyBvbiB0aGUgc2NhbGUgb2YgdGhlIG51bWJlciBiZWluZyBmb3JtYXR0ZWQsCiAgICAgKiBhbmQgc2hvdyBgZGlnaXRzYCBzaWduaWZpY2FudCBkaWdpdHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG11bHRpc2NhbGVGb3JtYXR0ZXIoZGlnaXRzKSB7CiAgICAgICAgcmV0dXJuICh2KSA9PiB7CiAgICAgICAgICAgIGxldCBhYnN2ID0gTWF0aC5hYnModik7CiAgICAgICAgICAgIGlmIChhYnN2IDwgMWUtMTUpIHsKICAgICAgICAgICAgICAgIC8vIFNvbWV0aW1lcyB6ZXJvLWxpa2UgdmFsdWVzIGdldCBhbiBhbm5veWluZyByZXByZXNlbnRhdGlvbgogICAgICAgICAgICAgICAgYWJzdiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGY7CiAgICAgICAgICAgIGlmIChhYnN2ID49IDEwMDAwKSB7CiAgICAgICAgICAgICAgICBmID0gZm9ybWF0KCcuJyArIGRpZ2l0cyArICd+ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGFic3YgPiAwICYmIGFic3YgPCAwLjAxKSB7CiAgICAgICAgICAgICAgICBmID0gZm9ybWF0KCcuJyArIGRpZ2l0cyArICd+ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZiA9IGZvcm1hdCgnLicgKyBkaWdpdHMgKyAnfmcnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZih2KTsKICAgICAgICB9OwogICAgfQogICAgY29uc3Qgc3RlcEZvcm1hdHRlciA9IGZvcm1hdChgLiR7U1RFUF9GT1JNQVRURVJfUFJFQ0lTSU9OfX5zYCk7CiAgICBmdW5jdGlvbiBzdGVwWCgpIHsKICAgICAgICBsZXQgc2NhbGUgPSBuZXcgc3JjJDIuU2NhbGVzLkxpbmVhcigpOwogICAgICAgIHNjYWxlLnRpY2tHZW5lcmF0b3Ioc3JjJDIuU2NhbGVzLlRpY2tHZW5lcmF0b3JzLmludGVnZXJUaWNrR2VuZXJhdG9yKCkpOwogICAgICAgIGxldCBheGlzID0gbmV3IHNyYyQyLkF4ZXMuTnVtZXJpYyhzY2FsZSwgJ2JvdHRvbScpOwogICAgICAgIGF4aXMuZm9ybWF0dGVyKHN0ZXBGb3JtYXR0ZXIpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNjYWxlOiBzY2FsZSwKICAgICAgICAgICAgYXhpczogYXhpcywKICAgICAgICAgICAgYWNjZXNzb3I6IChkKSA9PiBkLnN0ZXAsCiAgICAgICAgfTsKICAgIH0KICAgIGxldCB0aW1lRm9ybWF0dGVyID0gc3JjJDIuRm9ybWF0dGVycy50aW1lKCclYSAlYiAlZSwgJUg6JU06JVMnKTsKICAgIGZ1bmN0aW9uIHdhbGxYKCkgewogICAgICAgIGxldCBzY2FsZSA9IG5ldyBzcmMkMi5TY2FsZXMuVGltZSgpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHNjYWxlOiBzY2FsZSwKICAgICAgICAgICAgYXhpczogbmV3IHNyYyQyLkF4ZXMuVGltZShzY2FsZSwgJ2JvdHRvbScpLAogICAgICAgICAgICBhY2Nlc3NvcjogKGQpID0+IGQud2FsbF90aW1lLAogICAgICAgIH07CiAgICB9CiAgICBsZXQgcmVsYXRpdmVBY2Nlc3NvciA9IAogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWFueSBiZSBxdWlldCB0c2MKICAgIChkLCBpbmRleCwgZGF0YXNldCkgPT4gewogICAgICAgIC8vIFdlIG1heSBiZSByZW5kZXJpbmcgdGhlIGZpbmFsLXBvaW50IGRhdHVtIGZvciBzY2F0dGVycGxvdC4KICAgICAgICAvLyBJZiBzbywgd2Ugd2lsbCBoYXZlIGFscmVhZHkgcHJvdmlkZWQgdGhlICdyZWxhdGl2ZScgcHJvcGVydHkKICAgICAgICBpZiAoZC5yZWxhdGl2ZSAhPSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBkLnJlbGF0aXZlOwogICAgICAgIH0KICAgICAgICBsZXQgZGF0YSA9IGRhdGFzZXQuZGF0YSgpOwogICAgICAgIC8vIEkgY2FuJ3QgaW1hZ2luZSBob3cgdGhpcyBmdW5jdGlvbiB3b3VsZCBiZSBjYWxsZWQgd2hlbiB0aGUgZGF0YSBpcwogICAgICAgIC8vIGVtcHR5IChhZnRlciBhbGwsIGl0IGl0ZXJhdGVzIG92ZXIgdGhlIGRhdGEpLCBidXQgbGV0cyBndWFyZCBqdXN0CiAgICAgICAgLy8gdG8gYmUgc2FmZS4KICAgICAgICBsZXQgZmlyc3QgPSBkYXRhLmxlbmd0aCA+IDAgPyArZGF0YVswXS53YWxsX3RpbWUgOiAwOwogICAgICAgIHJldHVybiAoK2Qud2FsbF90aW1lIC0gZmlyc3QpIC8gKDYwICogNjAgKiAxMDAwKTsgLy8gbXMgdG8gaG91cnMKICAgIH07CiAgICBsZXQgcmVsYXRpdmVGb3JtYXR0ZXIgPSAobikgPT4gewogICAgICAgIC8vIHdlIHdpbGwgYWx3YXlzIHNob3cgMiB1bml0cyBvZiBwcmVjaXNpb24sIGUuZyBkYXlzIGFuZCBob3Vycywgb3IKICAgICAgICAvLyBtaW51dGVzIGFuZCBzZWNvbmRzLCBidXQgbm90IGhvdXJzIGFuZCBtaW51dGVzIGFuZCBzZWNvbmRzCiAgICAgICAgbGV0IHJldCA9ICcnOwogICAgICAgIGxldCBkYXlzID0gTWF0aC5mbG9vcihuIC8gMjQpOwogICAgICAgIG4gLT0gZGF5cyAqIDI0OwogICAgICAgIGlmIChkYXlzKSB7CiAgICAgICAgICAgIHJldCArPSBkYXlzICsgJ2QgJzsKICAgICAgICB9CiAgICAgICAgbGV0IGhvdXJzID0gTWF0aC5mbG9vcihuKTsKICAgICAgICBuIC09IGhvdXJzOwogICAgICAgIG4gKj0gNjA7CiAgICAgICAgaWYgKGhvdXJzIHx8IGRheXMpIHsKICAgICAgICAgICAgcmV0ICs9IGhvdXJzICsgJ2ggJzsKICAgICAgICB9CiAgICAgICAgbGV0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKG4pOwogICAgICAgIG4gLT0gbWludXRlczsKICAgICAgICBuICo9IDYwOwogICAgICAgIGlmIChtaW51dGVzIHx8IGhvdXJzIHx8IGRheXMpIHsKICAgICAgICAgICAgcmV0ICs9IG1pbnV0ZXMgKyAnbSAnOwogICAgICAgIH0KICAgICAgICBsZXQgc2Vjb25kcyA9IE1hdGguZmxvb3Iobik7CiAgICAgICAgcmV0dXJuIHJldCArIHNlY29uZHMgKyAncyc7CiAgICB9OwogICAgZnVuY3Rpb24gcmVsYXRpdmVYKCkgewogICAgICAgIGxldCBzY2FsZSA9IG5ldyBzcmMkMi5TY2FsZXMuTGluZWFyKCk7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgc2NhbGU6IHNjYWxlLAogICAgICAgICAgICBheGlzOiBuZXcgc3JjJDIuQXhlcy5OdW1lcmljKHNjYWxlLCAnYm90dG9tJyksCiAgICAgICAgICAgIGFjY2Vzc29yOiByZWxhdGl2ZUFjY2Vzc29yLAogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBnZXRYQ29tcG9uZW50cyh4VHlwZSkgewogICAgICAgIHN3aXRjaCAoeFR5cGUpIHsKICAgICAgICAgICAgY2FzZSBYVHlwZS5TVEVQOgogICAgICAgICAgICAgICAgcmV0dXJuIHN0ZXBYKCk7CiAgICAgICAgICAgIGNhc2UgWFR5cGUuV0FMTF9USU1FOgogICAgICAgICAgICAgICAgcmV0dXJuIHdhbGxYKCk7CiAgICAgICAgICAgIGNhc2UgWFR5cGUuUkVMQVRJVkU6CiAgICAgICAgICAgICAgICByZXR1cm4gcmVsYXRpdmVYKCk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgeFR5cGU6ICcgKyB4VHlwZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8vIE5PVF9MT0FERUQgaXMgaW1wbGljaXQKICAgIHZhciBMb2FkU3RhdGU7CiAgICAoZnVuY3Rpb24gKExvYWRTdGF0ZSkgewogICAgICAgIExvYWRTdGF0ZVtMb2FkU3RhdGVbIkxPQURJTkciXSA9IDBdID0gIkxPQURJTkciOwogICAgICAgIExvYWRTdGF0ZVtMb2FkU3RhdGVbIkxPQURFRCJdID0gMV0gPSAiTE9BREVEIjsKICAgIH0pKExvYWRTdGF0ZSB8fCAoTG9hZFN0YXRlID0ge30pKTsKICAgIGZ1bmN0aW9uIERhdGFMb2FkZXJCZWhhdmlvcihzdXBlckNsYXNzKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzIERhdGFMb2FkZXJCZWhhdmlvckltcGwgZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBBIHVuaXF1ZSBpZGVudGlmaWFibGUgc3RyaW5nLiBXaGVuIGNoYW5nZXMsIGl0IGV4cHVuZ2VzIHRoZSBkYXRhCiAgICAgICAgICAgICAgICAgKiBjYWNoZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdGhpcy5sb2FkS2V5ID0gJyc7CiAgICAgICAgICAgICAgICAvLyBMaXN0IG9mIGl0ZW1zIHRvIGJlIGxvYWRlZC4gQnkgZGVmYXVsdCwgaXRlbXMgYXJlIHBhc3NlZCB0bwogICAgICAgICAgICAgICAgLy8gYHJlcXVlc3REYXRhYCB0byBmZXRjaCBkYXRhLiBXaGVuIHRoZSByZXF1ZXN0IHJlc29sdmVzLCBpbnZva2VzCiAgICAgICAgICAgICAgICAvLyBgbG9hZERhdGFDYWxsYmFja2Agd2l0aCB0aGUgZGF0dW0gYW5kIGl0cyByZXNwb25zZS4KICAgICAgICAgICAgICAgIHRoaXMuZGF0YVRvTG9hZCA9IFtdOwogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYW4gaXRlbSBhcyBhbiBpbnB1dCBhbmQgcmV0dXJucyBhIHVuaXF1ZQogICAgICAgICAgICAgICAgICogaWRlbnRpZmlhYmxlIHN0cmluZy4gVXNlZCBmb3IgY2FjaGluZyBwdXJwb3Nlcy4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdGhpcy5nZXREYXRhTG9hZE5hbWUgPSAoaXRlbSkgPT4gU3RyaW5nKGl0ZW0pOwogICAgICAgICAgICAgICAgdGhpcy5kYXRhTG9hZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgLy8gVGhlIHN0YW5kYXJkIE5vZGUuaXNDb25uZWN0ZWQgZG9lc24ndCBzZWVtIHRvIGJlIHNldCByZWxpYWJseSwgc28gd2UKICAgICAgICAgICAgICAgIC8vIHdpcmUgdXAgb3VyIG93biBwcm9wZXJ0eSBtYW51YWxseS4KICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvKgogICAgICAgICAgICAgICAgICogQSBtYXAgb2YgYSBjYWNoZSBrZXkgdG8gTG9hZFN0YXRlLiBJZiBhIGNhY2hlS2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZQogICAgICAgICAgICAgICAgICogbWFwLCBpdCBpcyBjb25zaWRlcmVkIE5PVF9MT0FERUQuCiAgICAgICAgICAgICAgICAgKiBJbnZva2luZyBgcmVsb2FkYCBvciBhIGNoYW5nZSBpbiBgbG9hZEtleWAgY2xlYXJzIHRoZSBjYWNoZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdGhpcy5fZGF0YUxvYWRTdGF0ZSA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbGxlciA9IG5ldyBDYW5jZWxsZXIoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWREYXRhQXN5bmMgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5fbG9hZERhdGEgPSBsb2Rhc2gudGhyb3R0bGUodGhpcy5fbG9hZERhdGFJbXBsLCAxMDAsIHsKICAgICAgICAgICAgICAgICAgICBsZWFkaW5nOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHRyYWlsaW5nOiB0cnVlLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgICAgICAgICAgdGhpcy5faXNDb25uZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgICAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIHRoaXMuX2lzQ29ubmVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBhY3RpdmU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfbG9hZERhdGFJZkFjdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBfaXNDb25uZWN0ZWQ6IHsgdHlwZTogQm9vbGVhbiB9LAogICAgICAgICAgICAgICAgICAgIGxvYWRLZXk6IHsgdHlwZTogU3RyaW5nIH0sCiAgICAgICAgICAgICAgICAgICAgZGF0YVRvTG9hZDogeyB0eXBlOiBBcnJheSB9LAogICAgICAgICAgICAgICAgICAgIGdldERhdGFMb2FkTmFtZTogeyB0eXBlOiBPYmplY3QgfSwKICAgICAgICAgICAgICAgICAgICBsb2FkRGF0YUNhbGxiYWNrOiB7IHR5cGU6IE9iamVjdCB9LAogICAgICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhOiB7IHR5cGU6IE9iamVjdCB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbJ19kYXRhVG9Mb2FkQ2hhbmdlZChfaXNDb25uZWN0ZWQsIGRhdGFUb0xvYWQuKiknXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvbkxvYWRGaW5pc2goKSB7CiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSB0byBkbyBzb21ldGhpbmcgdXNlZnVsLgogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWREYXRhKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzZXQoKSB7CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9pc3N1ZXMvMTQ5OQogICAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSB0aGUgb2JzZXJ2ZXIgdG8gb2JzZXJ2ZSBgbG9hZEtleWAgY2hhbmdlcyBkaXJlY3RseS4KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sb2FkRGF0YUFzeW5jICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9hZERhdGFBc3luYyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZERhdGFBc3luYyA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FuY2VsbGVyKQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbGxlci5jYW5jZWxBbGwoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhTG9hZFN0YXRlKQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFMb2FkU3RhdGUuY2xlYXIoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0Nvbm5lY3RlZCkKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkRGF0YSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9kYXRhVG9Mb2FkQ2hhbmdlZCgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0Nvbm5lY3RlZCkKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkRGF0YSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgICAgICAgLy8gTm90ZTogQ2Fubm90IGNhbGwgY2FuY2VsbGVyLmNhbmNlbEFsbCBzaW5jZSBpdCB3aWxsIHBvaXNvbiB0aGUgY2FjaGUuCiAgICAgICAgICAgICAgICAvLyBkZXRhY2hlZCBnZXRzIGNhbGxlZCB3aGVuIGEgY29tcG9uZW50IGdldHMgdW5tb3VudGVkIGZyb20gdGhlIGRvY3VtZW50CiAgICAgICAgICAgICAgICAvLyBidXQgaXQgY2FuIGJlIHJlLW1vdW50ZWQuIFdoZW4gcmVtb3VudGVkLCBwb2lzb25lZCBjYWNoZSB3aWxsIG1hbmlmZXN0LgogICAgICAgICAgICAgICAgLy8gdD0wOiBkYXRhTG9hZFN0YXRlOiAnYScgPSBsb2FkaW5nCiAgICAgICAgICAgICAgICAvLyB0PTEwOiB1bm1vdW50CiAgICAgICAgICAgICAgICAvLyB0PTIwOiByZXF1ZXN0IGZvciAnYScgcmVzb2x2ZXMgYnV0IHdlIGRvIG5vdCBjaGFuZ2UgdGhlIGxvYWRTdGF0ZQogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBkbyBub3Qgd2FudCB0byBzZXQgb25lIGlmLCBpbnN0ZWFkLCBpdCB3YXMgcmVzZXR0ZWQgYXQgdD0xMC4KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sb2FkRGF0YUFzeW5jICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fbG9hZERhdGFBc3luYyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbG9hZERhdGFBc3luYyA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2xvYWREYXRhSWZBY3RpdmUoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkRGF0YSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIF9sb2FkRGF0YUltcGwoKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuYWN0aXZlKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sb2FkRGF0YUFzeW5jICE9PSBudWxsKQogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9sb2FkRGF0YUFzeW5jKTsKICAgICAgICAgICAgICAgIHRoaXMuX2xvYWREYXRhQXN5bmMgPSBzZXRUaW1lb3V0KHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgocmVzdWx0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmRhdGFMb2FkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJ0eUl0ZW1zID0gdGhpcy5kYXRhVG9Mb2FkLmZpbHRlcigoZGF0dW0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FjaGVLZXkgPSB0aGlzLmdldERhdGFMb2FkTmFtZShkYXR1bSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAhdGhpcy5fZGF0YUxvYWRTdGF0ZS5oYXMoY2FjaGVLZXkpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgaXRlbSBvZiBkaXJ0eUl0ZW1zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXREYXRhTG9hZE5hbWUoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGNhY2hlS2V5LCBMb2FkU3RhdGUuTE9BRElORyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uTG9hZCA9IHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgocmVzdWx0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBpdGVtLCBkYXRhIH0gPSByZXN1bHQudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlS2V5ID0gdGhpcy5nZXREYXRhTG9hZE5hbWUoaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFMb2FkU3RhdGUuc2V0KGNhY2hlS2V5LCBMb2FkU3RhdGUuTE9BREVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkRGF0YUNhbGxiYWNrKHRoaXMsIGl0ZW0sIGRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9uRmluaXNoID0gdGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKChyZXN1bHQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBub3RpZnkgb2YgZGF0YSBsb2FkIGlmIHRoZSBsb2FkIHdhcyBub3QgY2FuY2VsbGVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdC5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleXNGZXRjaGVkID0gcmVzdWx0LnZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hlZCA9IG5ldyBTZXQoZGlydHlJdGVtcy5tYXAoKGl0ZW0pID0+IHRoaXMuZ2V0RGF0YUxvYWROYW1lKGl0ZW0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGROb3RpZnkgPSB0aGlzLmRhdGFUb0xvYWQuc29tZSgoZGF0dW0pID0+IGZldGNoZWQuaGFzKHRoaXMuZ2V0RGF0YUxvYWROYW1lKGRhdHVtKSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNob3VsZE5vdGlmeSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Mb2FkRmluaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9sb2FkRGF0YUFzeW5jID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0RhdGFGZXRjaFBlbmRpbmcgPSBBcnJheS5mcm9tKHRoaXMuX2RhdGFMb2FkU3RhdGUudmFsdWVzKCkpLmluY2x1ZGVzKExvYWRTdGF0ZS5MT0FESU5HKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc0RhdGFGZXRjaFBlbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMucmVxdWVzdERhdGEoZGlydHlJdGVtcywgb25Mb2FkLCAoKSA9PiBvbkZpbmlzaCh1bmRlZmluZWQpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICByZWdpc3RlclN0eWxlRG9tTW9kdWxlKHsKICAgICAgICBtb2R1bGVOYW1lOiAncGxvdHRhYmxlLXN0eWxlJywKICAgICAgICBzdHlsZUNvbnRlbnQ6IGAKICAgIAoucGxvdHRhYmxlLWNvbG9ycy0wIHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjNTI3OWM3OyAvKiBJTkRJR08gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMSB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZkMzczZTsgLyogQ09SQUxfUkVEICovCn0KCi5wbG90dGFibGUtY29sb3JzLTIgewogIGJhY2tncm91bmQtY29sb3I6ICM2M2MyNjE7IC8qIEZFUk4gKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtMyB7CiAgYmFja2dyb3VuZC1jb2xvcjogI2ZhZDQxOTsgLyogQlJJR0hUX1NVTiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy00IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMmMyYjZmOyAvKiBKQUNBUlRBICovCn0KCi5wbG90dGFibGUtY29sb3JzLTUgewogIGJhY2tncm91bmQtY29sb3I6ICNmZjc5Mzk7IC8qIEJVUk5JTkdfT1JBTkdFICovCn0KCi5wbG90dGFibGUtY29sb3JzLTYgewogIGJhY2tncm91bmQtY29sb3I6ICNkYjJlNjU7IC8qIENFUklTRV9SRUQgKi8KfQoKLnBsb3R0YWJsZS1jb2xvcnMtNyB7CiAgYmFja2dyb3VuZC1jb2xvcjogIzk5Y2U1MDsgLyogQ09OSUZFUiAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy04IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjOTYyNTY1OyAvKiBST1lBTF9IRUFUSCAqLwp9CgoucGxvdHRhYmxlLWNvbG9ycy05IHsKICBiYWNrZ3JvdW5kLWNvbG9yOiAjMDZjY2NjOyAvKiBST0JJTlNfRUdHX0JMVUUgKi8KfQoKLyoqCiAqIFVzZXItc3VwcGxpZWQgcmVuZGVyVG8gZWxlbWVudC4KICovCi5wbG90dGFibGUgewogIGRpc3BsYXk6IGJsb2NrOyAvKiBtdXN0IGJlIGJsb2NrIGVsZW1lbnRzIGZvciB3aWR0aC9oZWlnaHQgY2FsY3VsYXRpb25zIHRvIHdvcmsgaW4gRmlyZWZveC4gKi8KICBwb2ludGVyLWV2ZW50czogdmlzaWJsZUZpbGw7CiAgcG9zaXRpb246IHJlbGF0aXZlOwogIC8qKgogICAqIFByZSAzLjAsIHVzZXJzIGNvdWxkIHNldCB0aGUgZGltZW5zaW9uIG9mIHRoZSByb290IGVsZW1lbnQgaW4gdHdvIHdheXM6IGVpdGhlciB1c2luZyBDU1MKICAgKiAoaW5saW5lIG9yIHRocm91Z2ggYSBzdHlsZXNoZWV0KSwgb3IgdXNpbmcgdGhlIFNWRyB3aWR0aC9oZWlnaHQgYXR0cmlidXRlcy4gQnkgZGVmYXVsdCwgd2UKICAgKiBzZXQgdGhlIFNWRyB3aWR0aC9oZWlnaHQgYXR0cmlidXRlcyB0byAxMDAlLgogICAqCiAgICogUG9zdCAzLjAgdGhlIHJvb3QgZWxlbWVudCBpcyBhbHdheXMgYSBub3JtYWwgZGl2IGFuZCB0aGUgb25seSB3YXkgdG8gc2V0IHRoZSBkaW1lbnNpb25zIGlzCiAgICogdG8gdXNlIENTUy4gVG8gcmVwbGljYXRlIHRoZSAiMTAwJS1ieS1kZWZhdWx0IiBiZWhhdmlvciwgd2UgYXBwbHkgd2lkdGgvaGVpZ2h0IDEwMCUuCiAgICovCiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwp9CgovKioKICogVGhlIF9lbGVtZW50IHRoYXQgcm9vdHMgZWFjaCBDb21wb25lbnQncyBET00uCiAqLwoucGxvdHRhYmxlIC5jb21wb25lbnQgewogIC8qIEFsbG93IGNvbXBvbmVudHMgdG8gYmUgcG9zaXRpb25lZCB3aXRoIGV4cGxpY2l0IGxlZnQvdG9wL3dpZHRoL2hlaWdodCBzdHlsZXMgKi8KICBwb3NpdGlvbjogYWJzb2x1dGU7Cn0KCi5wbG90dGFibGUgLmJhY2tncm91bmQtY29udGFpbmVyLAoucGxvdHRhYmxlIC5jb250ZW50LAoucGxvdHRhYmxlIC5mb3JlZ3JvdW5kLWNvbnRhaW5lciB7CiAgcG9zaXRpb246IGFic29sdXRlOwogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKfQoKLyoqCiAqIERvbid0IGFsbG93IHN2ZyBlbGVtZW50cyBhYm92ZSB0aGUgY29udGVudCB0byBzdGVhbCBldmVudHMKICovCi5wbG90dGFibGUgLmZvcmVncm91bmQtY29udGFpbmVyIHsKICBwb2ludGVyLWV2ZW50czogbm9uZTsKfQoKLnBsb3R0YWJsZSAuY29tcG9uZW50LW92ZXJmbG93LWhpZGRlbiB7CiAgb3ZlcmZsb3c6IGhpZGRlbjsKfQoKLnBsb3R0YWJsZSAuY29tcG9uZW50LW92ZXJmbG93LXZpc2libGUgewogIG92ZXJmbG93OiB2aXNpYmxlOwp9CgoucGxvdHRhYmxlIC5wbG90LWNhbnZhcy1jb250YWluZXIgewogIHdpZHRoOiAxMDAlOwogIGhlaWdodDogMTAwJTsKICBvdmVyZmxvdzogaGlkZGVuOwp9CgoucGxvdHRhYmxlIC5wbG90LWNhbnZhcyB7CiAgd2lkdGg6IDEwMCU7CiAgaGVpZ2h0OiAxMDAlOwogIC8qKgogICAqIFBsYXkgd2VsbCB3aXRoIGRlZmVycmVkIHJlbmRlcmluZy4KICAgKi8KICB0cmFuc2Zvcm0tb3JpZ2luOiAwcHggMHB4IDBweDsKfQoKLnBsb3R0YWJsZSB0ZXh0IHsKICB0ZXh0LXJlbmRlcmluZzogZ2VvbWV0cmljUHJlY2lzaW9uOwp9CgoucGxvdHRhYmxlIC5sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5iYXItbGFiZWwtdGV4dC1hcmVhIHRleHQsCi5wbG90dGFibGUgLnNjYXR0ZXItbGFiZWwtdGV4dC1hcmVhIHRleHQgewogIGZvbnQtc2l6ZTogMTJweDsKfQoKLnBsb3R0YWJsZSAubGFiZWwtYXJlYSB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtc2l6ZTogMTRweDsKfQoKLnBsb3R0YWJsZSAubGlnaHQtbGFiZWwgdGV4dCB7CiAgZmlsbDogd2hpdGU7Cn0KCi5wbG90dGFibGUgLmRhcmstbGFiZWwgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKfQoKLnBsb3R0YWJsZSAub2ZmLWJhci1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwp9CgoucGxvdHRhYmxlIC5zdGFja2VkLWJhci1sYWJlbCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtc3R5bGU6IG5vcm1hbDsKfQoKLnBsb3R0YWJsZSAuc3RhY2tlZC1iYXItcGxvdCAub2ZmLWJhci1sYWJlbCB7CiAgLyogSEFDS0hBQ0sgIzI3OTU6IGNvcnJlY3Qgb2ZmLWJhciBsYWJlbCBsb2dpYyB0byBiZSBpbXBsZW1lbnRlZCBvbiBTdGFja2VkQmFyICovCiAgdmlzaWJpbGl0eTogaGlkZGVuICFpbXBvcnRhbnQ7Cn0KCi5wbG90dGFibGUgLmF4aXMtbGFiZWwgdGV4dCB7CiAgZm9udC1zaXplOiAxMHB4OwogIGZvbnQtd2VpZ2h0OiBib2xkOwogIGxldHRlci1zcGFjaW5nOiAxcHg7CiAgbGluZS1oZWlnaHQ6IG5vcm1hbDsKICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwp9CgoucGxvdHRhYmxlIC50aXRsZS1sYWJlbCB0ZXh0IHsKICBmb250LXNpemU6IDIwcHg7CiAgZm9udC13ZWlnaHQ6IGJvbGQ7Cn0KCi5wbG90dGFibGUgLmF4aXMgbGluZS5iYXNlbGluZSB7CiAgc3Ryb2tlOiAjQ0NDOwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5heGlzIGxpbmUudGljay1tYXJrIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmF4aXMgdGV4dCB7CiAgZmlsbDogIzMyMzEzRjsKICBmb250LXNpemU6IDEycHg7CiAgZm9udC13ZWlnaHQ6IDIwMDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLWNpcmNsZSB7CiAgZmlsbDogd2hpdGU7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgc3Ryb2tlOiAjQ0NDOwp9CgoucGxvdHRhYmxlIC5heGlzIC5hbm5vdGF0aW9uLWxpbmUgewogIHN0cm9rZTogI0NDQzsKICBzdHJva2Utd2lkdGg6IDFweDsKfQoKLnBsb3R0YWJsZSAuYXhpcyAuYW5ub3RhdGlvbi1yZWN0IHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgZmlsbDogd2hpdGU7Cn0KCi5wbG90dGFibGUgLmJhci1wbG90IC5iYXNlbGluZSB7CiAgc3Ryb2tlOiAjOTk5Owp9CgoucGxvdHRhYmxlIC5ncmlkbGluZXMgbGluZSB7CiAgc3Ryb2tlOiAjM0MzQzNDOyAvKiBoYWNraGFjazogZ3JpZGxpbmVzIHNob3VsZCBiZSBzb2xpZDsgc2VlICM4MjAgKi8KICBvcGFjaXR5OiAwLjI1OwogIHN0cm9rZS13aWR0aDogMXB4Owp9CgoucGxvdHRhYmxlIC5zZWxlY3Rpb24tYm94LWxheWVyIC5zZWxlY3Rpb24tYXJlYSB7CiAgZmlsbDogYmxhY2s7CiAgZmlsbC1vcGFjaXR5OiAwLjAzOwogIHN0cm9rZTogI0NDQzsKfQovKiBEcmFnQm94TGF5ZXIgKi8KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUgLmRyYWctZWRnZS1sciB7CiAgY3Vyc29yOiBldy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueS1yZXNpemFibGUgLmRyYWctZWRnZS10YiB7CiAgY3Vyc29yOiBucy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci10bCB7CiAgY3Vyc29yOiBud3NlLXJlc2l6ZTsKfQoucGxvdHRhYmxlIC5kcmFnLWJveC1sYXllci54LXJlc2l6YWJsZS55LXJlc2l6YWJsZSAuZHJhZy1jb3JuZXItdHIgewogIGN1cnNvcjogbmVzdy1yZXNpemU7Cn0KLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIueC1yZXNpemFibGUueS1yZXNpemFibGUgLmRyYWctY29ybmVyLWJsIHsKICBjdXJzb3I6IG5lc3ctcmVzaXplOwp9Ci5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLngtcmVzaXphYmxlLnktcmVzaXphYmxlIC5kcmFnLWNvcm5lci1iciB7CiAgY3Vyc29yOiBud3NlLXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1ib3gtbGF5ZXIubW92YWJsZSAuc2VsZWN0aW9uLWFyZWEgewogIGN1cnNvcjogbW92ZTsgLyogSUUgZmFsbGJhY2sgKi8KICBjdXJzb3I6IC1tb3otZ3JhYjsKICBjdXJzb3I6IC13ZWJraXQtZ3JhYjsKICBjdXJzb3I6IGdyYWI7Cn0KCi5wbG90dGFibGUgLmRyYWctYm94LWxheWVyLm1vdmFibGUgLnNlbGVjdGlvbi1hcmVhOmFjdGl2ZSB7CiAgY3Vyc29yOiAtbW96LWdyYWJiaW5nOwogIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICBjdXJzb3I6IGdyYWJiaW5nOwp9Ci8qIC9EcmFnQm94TGF5ZXIgKi8KCi5wbG90dGFibGUgLmd1aWRlLWxpbmUtbGF5ZXIgbGluZS5ndWlkZS1saW5lIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLmRyYWctbGluZS1sYXllci5lbmFibGVkLnZlcnRpY2FsIGxpbmUuZHJhZy1lZGdlIHsKICBjdXJzb3I6IGV3LXJlc2l6ZTsKfQoKLnBsb3R0YWJsZSAuZHJhZy1saW5lLWxheWVyLmVuYWJsZWQuaG9yaXpvbnRhbCBsaW5lLmRyYWctZWRnZSB7CiAgY3Vyc29yOiBucy1yZXNpemU7Cn0KCi5wbG90dGFibGUgLmxlZ2VuZCB0ZXh0IHsKICBmaWxsOiAjMzIzMTNGOwogIGZvbnQtc2l6ZTogMTJweDsKICBmb250LXdlaWdodDogYm9sZDsKICBsaW5lLWhlaWdodDogbm9ybWFsOwp9CgoucGxvdHRhYmxlIC5pbnRlcnBvbGF0ZWQtY29sb3ItbGVnZW5kIHJlY3Quc3dhdGNoLWJvdW5kaW5nLWJveCB7CiAgZmlsbDogbm9uZTsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgcG9pbnRlci1ldmVudHM6IG5vbmU7Cn0KCi5wbG90dGFibGUgLndhdGVyZmFsbC1wbG90IGxpbmUuY29ubmVjdG9yIHsKICBzdHJva2U6ICNDQ0M7CiAgc3Ryb2tlLXdpZHRoOiAxcHg7Cn0KCi5wbG90dGFibGUgLnBpZS1wbG90IC5hcmMub3V0bGluZSB7CiAgc3Ryb2tlLWxpbmVqb2luOiByb3VuZDsKfQoKYCwKICAgIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgZnVuY3Rpb24gZ2V0SHRtbEVsZW1lbnRBbmNlc3RvcnMoZWxlbSkgewogICAgICAgIGNvbnN0IGVsZW1zID0gW107CiAgICAgICAgd2hpbGUgKGVsZW0gJiYgZWxlbSBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSB7CiAgICAgICAgICAgIGVsZW1zLnB1c2goZWxlbSk7CiAgICAgICAgICAgIGlmIChlbGVtLmFzc2lnbmVkU2xvdCkgewogICAgICAgICAgICAgICAgZWxlbSA9IGVsZW0uYXNzaWduZWRTbG90OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCFlbGVtLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudE5vZGUgPSBlbGVtLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQpIHsKICAgICAgICAgICAgICAgICAgICBlbGVtID0gcGFyZW50Tm9kZS5ob3N0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gPGh0bWw+LnBhcmVudE5vZGUgPT0gPGh0bWw+CiAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHBhcmVudE5vZGUgIT09IGVsZW0gPyBwYXJlbnROb2RlIDogbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVsZW0gPSBlbGVtLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGVsZW1zOwogICAgfQogICAgY29uc3QgX0lERU5USVRZX1RSQU5TRk9STSA9IFsxLCAwLCAwLCAxLCAwLCAwXTsKICAgIC8vIEZvcmtlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9wYWxhbnRpci9wbG90dGFibGUvYmxvYi9iNmUzNmZiZDRkOGQ3Y2JhNTc5ZDg1M2I5ZjM1Y2MyNjBkMTI0M2JmL3NyYy91dGlscy9tYXRoVXRpbHMudHMjTDE3My1MMjAyCiAgICAvLyBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ2V0SHRtbEVsZW1lbnRBbmNlc3RvcnMuCiAgICBmdW5jdGlvbiBnZXRDdW11bGF0aXZlVHJhbnNmb3JtKGVsZW1lbnQpIHsKICAgICAgICBjb25zdCBlbGVtcyA9IGdldEh0bWxFbGVtZW50QW5jZXN0b3JzKGVsZW1lbnQpOwogICAgICAgIGxldCB0cmFuc2Zvcm0gPSBfSURFTlRJVFlfVFJBTlNGT1JNOwogICAgICAgIGxldCBvZmZzZXRQYXJlbnQgPSBudWxsOwogICAgICAgIGZvciAoY29uc3QgZWxlbSBvZiBlbGVtcykgewogICAgICAgICAgICAvLyBhcHBseSBjc3MgdHJhbnNmb3JtIGZyb20gYW55IGFuY2VzdG9yIGVsZW1lbnQKICAgICAgICAgICAgY29uc3QgZWxlbWVudFRyYW5zZm9ybSA9IHNyYyQyLlV0aWxzLkRPTS5nZXRFbGVtZW50VHJhbnNmb3JtKGVsZW0pOwogICAgICAgICAgICBpZiAoZWxlbWVudFRyYW5zZm9ybSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtaWRYID0gZWxlbS5jbGllbnRXaWR0aCAvIDI7CiAgICAgICAgICAgICAgICBjb25zdCBtaWRZID0gZWxlbS5jbGllbnRIZWlnaHQgLyAyOwogICAgICAgICAgICAgICAgdHJhbnNmb3JtID0gc3JjJDIuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZSh0cmFuc2Zvcm0sIFsKICAgICAgICAgICAgICAgICAgICBtaWRYLAogICAgICAgICAgICAgICAgICAgIG1pZFksCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybSA9IHNyYyQyLlV0aWxzLk1hdGgubXVsdGlwbHlNYXRyaXgodHJhbnNmb3JtLCBzcmMkMi5VdGlscy5NYXRoLmludmVydE1hdHJpeChlbGVtZW50VHJhbnNmb3JtKSk7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBzcmMkMi5VdGlscy5NYXRoLm11bHRpcGx5VHJhbnNsYXRlKHRyYW5zZm9ybSwgWwogICAgICAgICAgICAgICAgICAgIC1taWRYLAogICAgICAgICAgICAgICAgICAgIC1taWRZLAogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gYXBwbHkgc2Nyb2xsIG9mZnNldHMgZnJvbSBhbnkgYW5jZXN0b3IgZWxlbWVudAogICAgICAgICAgICBsZXQgb2Zmc2V0WCA9IGVsZW0uc2Nyb2xsTGVmdDsKICAgICAgICAgICAgbGV0IG9mZnNldFkgPSBlbGVtLnNjcm9sbFRvcDsKICAgICAgICAgICAgLy8gYXBwbHkgY2xpZW50K29mZnNldCBmcm9tIG9ubHkgYWNlbnN0b3IgIm9mZnNldFBhcmVudCIKICAgICAgICAgICAgaWYgKG9mZnNldFBhcmVudCA9PT0gbnVsbCB8fCBlbGVtID09PSBvZmZzZXRQYXJlbnQpIHsKICAgICAgICAgICAgICAgIG9mZnNldFggLT0gZWxlbS5vZmZzZXRMZWZ0ICsgZWxlbS5jbGllbnRMZWZ0OwogICAgICAgICAgICAgICAgb2Zmc2V0WSAtPSBlbGVtLm9mZnNldFRvcCArIGVsZW0uY2xpZW50VG9wOwogICAgICAgICAgICAgICAgb2Zmc2V0UGFyZW50ID0gZWxlbS5vZmZzZXRQYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJhbnNmb3JtID0gc3JjJDIuVXRpbHMuTWF0aC5tdWx0aXBseVRyYW5zbGF0ZSh0cmFuc2Zvcm0sIFsKICAgICAgICAgICAgICAgIG9mZnNldFgsCiAgICAgICAgICAgICAgICBvZmZzZXRZLAogICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybTsKICAgIH0KICAgIGNsYXNzIEN1c3RvbVRyYW5zbGF0b3IgZXh0ZW5kcyBzcmMkMi5VdGlscy5UcmFuc2xhdG9yIHsKICAgICAgICBjb21wdXRlUG9zaXRpb24oY2xpZW50WCwgY2xpZW50WSkgewogICAgICAgICAgICBjb25zdCBjbGllbnRQb3NpdGlvbiA9IHsKICAgICAgICAgICAgICAgIHg6IGNsaWVudFgsCiAgICAgICAgICAgICAgICB5OiBjbGllbnRZLAogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSBnZXRDdW11bGF0aXZlVHJhbnNmb3JtKHRoaXMuX3Jvb3RFbGVtZW50KTsKICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50UG9zaXRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdHJhbnNmb3JtZWQgPSBzcmMkMi5VdGlscy5NYXRoLmFwcGx5VHJhbnNmb3JtKHRyYW5zZm9ybSwgY2xpZW50UG9zaXRpb24pOwogICAgICAgICAgICByZXR1cm4gdHJhbnNmb3JtZWQ7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTW91c2VEaXNwYXRjaGVyIGV4dGVuZHMgc3JjJDIuRGlzcGF0Y2hlcnMuTW91c2UgewogICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkgewogICAgICAgICAgICBzdXBlcihjb21wb25lbnQpOwogICAgICAgICAgICAvLyBldmVudFRhcmdldCBpcyBgZG9jdW1lbnRgIGJ5IGRlZmF1bHQuIENoYW5nZSBpdCB0byB0aGUgcm9vdCBvZiBjaGFydC4KICAgICAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQgPSBjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpOwogICAgICAgICAgICAvLyBSZXF1aXJlcyBjdXN0b20gdHJhbnNsYXRvciB0aGF0IHVzZXMgY29ycmVjdCBET00gdHJhdmVyc2FsICh3aXRoCiAgICAgICAgICAgIC8vIFdlYkNvbXBvbmVudHMpIHRvIGNoYW5nZSBwb2ludGVyIHBvc2l0aW9uIHRvIHJlbGF0aXZlIHRvIHRoZSByb290IG5vZGUuCiAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0b3IgPSBuZXcgQ3VzdG9tVHJhbnNsYXRvcihjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGdldERpc3BhdGNoZXIoY29tcG9uZW50KSB7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCk7CiAgICAgICAgICAgIGxldCBkaXNwYXRjaGVyID0gZWxlbWVudFtNb3VzZURpc3BhdGNoZXIuX0RJU1BBVENIRVJfS0VZXTsKICAgICAgICAgICAgaWYgKCFkaXNwYXRjaGVyKSB7CiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyID0gbmV3IE1vdXNlRGlzcGF0Y2hlcihjb21wb25lbnQpOwogICAgICAgICAgICAgICAgZWxlbWVudFtNb3VzZURpc3BhdGNoZXIuX0RJU1BBVENIRVJfS0VZXSA9IGRpc3BhdGNoZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgVG91Y2hEaXNwYXRjaGVyIGV4dGVuZHMgc3JjJDIuRGlzcGF0Y2hlcnMuVG91Y2ggewogICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudCkgewogICAgICAgICAgICBzdXBlcihjb21wb25lbnQpOwogICAgICAgICAgICAvLyBldmVudFRhcmdldCBpcyBgZG9jdW1lbnRgIGJ5IGRlZmF1bHQuIENoYW5nZSBpdCB0byB0aGUgcm9vdCBvZiBjaGFydC4KICAgICAgICAgICAgdGhpcy5fZXZlbnRUYXJnZXQgPSBjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpOwogICAgICAgICAgICAvLyBSZXF1aXJlcyBjdXN0b20gdHJhbnNsYXRvciB0aGF0IHVzZXMgY29ycmVjdCBET00gdHJhdmVyc2FsICh3aXRoCiAgICAgICAgICAgIC8vIFdlYkNvbXBvbmVudHMpIHRvIGNoYW5nZSBwb2ludGVyIHBvc2l0aW9uIHRvIHJlbGF0aXZlIHRvIHRoZSByb290IG5vZGUuCiAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0b3IgPSBuZXcgQ3VzdG9tVHJhbnNsYXRvcihjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCkubm9kZSgpKTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGdldERpc3BhdGNoZXIoY29tcG9uZW50KSB7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb21wb25lbnQucm9vdCgpLnJvb3RFbGVtZW50KCk7CiAgICAgICAgICAgIGxldCBkaXNwYXRjaGVyID0gZWxlbWVudFtUb3VjaERpc3BhdGNoZXIuX0RJU1BBVENIRVJfS0VZXTsKICAgICAgICAgICAgaWYgKCFkaXNwYXRjaGVyKSB7CiAgICAgICAgICAgICAgICBkaXNwYXRjaGVyID0gbmV3IFRvdWNoRGlzcGF0Y2hlcihjb21wb25lbnQpOwogICAgICAgICAgICAgICAgZWxlbWVudFtUb3VjaERpc3BhdGNoZXIuX0RJU1BBVENIRVJfS0VZXSA9IGRpc3BhdGNoZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXI7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGaXhlcyAjMzI4Mi4KICAgICAqCiAgICAgKiBSZXBybzogd2hlbiB0b29sdGlwIGlzIHNob3duLCBzbG93bHkgbW92ZSB0aGUgbW91c2UgdG8gYW4gZWRnZSBvZiBhIGNoYXJ0LgogICAgICogV2UgZXhwZWN0IHRoZSB0b29sdGlwIHRoZSBkaXNhcHBlYXIgd2hlbiB0aGUgY3Vyc29yIGlzIG9uIHRoZSBlZGdlIG9mIHRoZQogICAgICogY2hhcnQuCiAgICAgKgogICAgICogQ2F1c2U6CiAgICAgKiAxLiBGb3IgUG9seW1lciAyIGFuZCBpdHMgU2hhZG93IERPTSBjb21wYXRpYmlsaXR5LCBUZW5zb3JCb2FyZCBvcHRlZCBvdXQgb2YKICAgICAqIHRoZSBldmVudCBkZWxlZ2F0aW9uIG9mIFBsb3R0YWJsZS4gUGxvdHRhYmxlLCBieSBkZWZhdWx0LCBhdHRhY2hlcyBhIHNldCBvZgogICAgICogZXZlbnQgbGlzdGVuZXJzIG9uIGRvY3VtZW50LmJvZHkgYW5kIGludm9rZXMgYXBwcm9wcmlhdGUgY2FsbGJhY2tzCiAgICAgKiBkZXBlbmRpbmcgb24gdGhlIGNpcmN1bXN0YW5jZXMuIEhvd2V2ZXIsIHdpdGggdGhlIFNoYWRvdyBET00sIHRoZSBldmVudAogICAgICogcmUtdGFyZ2V0dGluZyBicm9rZSAoaGFyZGVyIHRvIGlkZW50aWZ5IGBldmVudC50YXJnZXRgKSwgc28gVGVuc29yQm9hcmQsCiAgICAgKiBpbnN0ZWFkLCBhdHRhY2hlcyB0aGUgZXZlbnQgbGlzdGVuZXJzIG9uIGV2ZXJ5IFBsb3R0YWJsZSBjb250YWluZXIsIFNWR3MuCiAgICAgKgogICAgICogMi4gV2hlbiBtb3VzZSBsZWF2ZXMgKG1vdXNlb3V0KSB0aGUgY29udGFpbmVyLCBQbG90dGFibGUgcmVtYXBzIHRoZSBldmVudAogICAgICogYXMgbW91c2UgbW92ZSBhbmQgY2FsY3VsYXRlIHdoZXRoZXIgdGhlIGN1cnNvciBpcyBpbnNpZGUgYSBjb21wb25lbnQKICAgICAqIChJbnRlcmFjdGlvbi5wcm90b3R5cGUuX2lzSW5zaWRlQ29tcG9uZW50LCBzcGVjaWZpY2FsbHkpIHRvIHRyaWdnZXIKICAgICAqIGFwcHJvcHJpYXRlIGNhbGxiYWNrLiBUaGUgbWV0aG9kLCBob3dldmVyIGlzIGZsYXdlZCBzaW5jZSBpdCByZXR1cm5zLCBmb3IgYQogICAgICogY29tcG9uZW50IHRoYXQgaXMsIGZvciBpbnN0YW5jZSwgYXQgPDAsIDA+IHdpdGggc2l6ZSBvZiA8MTAwLCAxMDA+LCB0cnVlCiAgICAgKiB3aGVuIHBvaW50ZXIgaXMgYXQgPDEwMCwgMTAwPi4gSXQgc2hvdWxkIG9ubHkgcmV0dXJuIHRydWUgZm9yIFswLCAxMDApIGZvcgogICAgICogYSBnaXZlbiBkaW1lbnNpb24sIGluc3RlYWQuICBBcyBhIHJlc3VsdCwgdGhlIG1vdXNlb3V0IGV2ZW50IG9jY3VycmVkIGF0CiAgICAgKiA8MTAwLCAxMDA+IHdhcyB0cmVhdGVkIGFzIGFuIGV2ZW50IGluc2lkZSB0aGUgY29tcG9uZW50IGJ1dCBhbGwgdGhlCiAgICAgKiBzdWJzZXF1ZW50IG1vdXNlIG1vdmVtZW50cyBhcmUgbm90IGNhcHR1cmVkIHNpbmNlIHRoZXkgYXJlIGV2ZW50cyB0aGF0CiAgICAgKiBvY2N1cnJlZCBvdXRzaWRlIG9mIHRoZSBldmVudCB0YXJnZXQuIEluIHZhbmlsbGEgUGxvdHRhYmxlLCB0aGlzIGJ1ZyBkbyBub3QKICAgICAqIG1hbmlmZXN0IHNpbmNlIGV2ZW50IGRlbGVnYXRpb24gb24gdGhlIGVudGlyZSBkb2N1bWVudCB3aWxsIGV2ZW50dWFsbHkKICAgICAqIHRyaWdnZXIgbW91c2Ugb3V0IHdoZW4gY3Vyc29yIGlzIGF0LCBmb3IgaW5zdGFuY2UsIDwxMDEsIDEwMD4uCiAgICAgKi8KICAgIHNyYyQyLkludGVyYWN0aW9uLnByb3RvdHlwZS5faXNJbnNpZGVDb21wb25lbnQgPSBmdW5jdGlvbiAocCkgewogICAgICAgIHJldHVybiAoMCA8PSBwLnggJiYKICAgICAgICAgICAgMCA8PSBwLnkgJiYKICAgICAgICAgICAgLy8gRGVsdGE6IGA8YCBpbnN0ZWFkIG9mIGA8PWAgaGVyZSBhbmQgYmVsb3cuCiAgICAgICAgICAgIHAueCA8IHRoaXMuX2NvbXBvbmVudEF0dGFjaGVkVG8ud2lkdGgoKSAmJgogICAgICAgICAgICBwLnkgPCB0aGlzLl9jb21wb25lbnRBdHRhY2hlZFRvLmhlaWdodCgpKTsKICAgIH07CiAgICBjbGFzcyBQb2ludGVySW50ZXJhY3Rpb24gZXh0ZW5kcyBzcmMkMi5JbnRlcmFjdGlvbnMuUG9pbnRlciB7CiAgICAgICAgX2FuY2hvcihjb21wb25lbnQpIHsKICAgICAgICAgICAgY29uc3QgYW55VGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGFueVRoaXMuX2lzQW5jaG9yZWQgPSB0cnVlOwogICAgICAgICAgICBhbnlUaGlzLl9tb3VzZURpc3BhdGNoZXIgPSBNb3VzZURpc3BhdGNoZXIuZ2V0RGlzcGF0Y2hlcihhbnlUaGlzLl9jb21wb25lbnRBdHRhY2hlZFRvKTsKICAgICAgICAgICAgYW55VGhpcy5fbW91c2VEaXNwYXRjaGVyLm9uTW91c2VNb3ZlKGFueVRoaXMuX21vdXNlTW92ZUNhbGxiYWNrKTsKICAgICAgICAgICAgYW55VGhpcy5fdG91Y2hEaXNwYXRjaGVyID0gVG91Y2hEaXNwYXRjaGVyLmdldERpc3BhdGNoZXIoYW55VGhpcy5fY29tcG9uZW50QXR0YWNoZWRUbyk7CiAgICAgICAgICAgIGFueVRoaXMuX3RvdWNoRGlzcGF0Y2hlci5vblRvdWNoU3RhcnQoYW55VGhpcy5fdG91Y2hTdGFydENhbGxiYWNrKTsKICAgICAgICB9CiAgICB9CgogICAgdmFyIFRvb2x0aXBQb3NpdGlvbjsKICAgIChmdW5jdGlvbiAoVG9vbHRpcFBvc2l0aW9uKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogUG9zaXRpb25zIHRoZSB0b29sdGlwIHRvIHRoZSBib3R0b20gb2YgdGhlIGNoYXJ0IGluIG1vc3QgY2FzZS4gUG9zaXRpb25zCiAgICAgICAgICogdGhlIHRvb2x0aXAgYWJvdmUgdGhlIGNoYXJ0IGlmIHRoZXJlIGlzbid0IHN1ZmZpY2llbnQgc3BhY2UgYmVsb3cuCiAgICAgICAgICovCiAgICAgICAgVG9vbHRpcFBvc2l0aW9uWyJBVVRPIl0gPSAiYXV0byI7CiAgICAgICAgLyoqCiAgICAgICAgICogUG9zaXRpb24gdGhlIHRvb2x0aXAgb24gdGhlIGJvdHRvbSBvZiB0aGUgY2hhcnQuCiAgICAgICAgICovCiAgICAgICAgVG9vbHRpcFBvc2l0aW9uWyJCT1RUT00iXSA9ICJib3R0b20iOwogICAgICAgIC8qKgogICAgICAgICAqIFBvc2l0aW9ucyB0aGUgdG9vbHRpcCB0byB0aGUgcmlnaHQgb2YgdGhlIGNoYXJ0LgogICAgICAgICAqLwogICAgICAgIFRvb2x0aXBQb3NpdGlvblsiUklHSFQiXSA9ICJyaWdodCI7CiAgICB9KShUb29sdGlwUG9zaXRpb24gfHwgKFRvb2x0aXBQb3NpdGlvbiA9IHt9KSk7CiAgICBjb25zdCBERUZBVUxUX1RPT0xUSVBfU1RZTEUgPSB7CiAgICAgICAgYm94U2hhZG93OiAnMCAxcHggNHB4IHJnYmEoMCwgMCwgMCwgLjMpJywKICAgICAgICBvcGFjaXR5OiAwLAogICAgICAgIHBvc2l0aW9uOiAnZml4ZWQnLAogICAgICAgIHdpbGxDaGFuZ2U6ICd0cmFuc2Zvcm0nLAogICAgICAgIHpJbmRleDogNSwKICAgIH07CiAgICBsZXQgVnpDaGFydFRvb2x0aXAgPSBjbGFzcyBWekNoYXJ0VG9vbHRpcCBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gVG9vbHRpcFBvc2l0aW9uLkFVVE87CiAgICAgICAgICAgIHRoaXMubWluRGlzdEZyb21FZGdlID0gMTU7CiAgICAgICAgICAgIHRoaXMuX3N0eWxlQ2FjaGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9yYWYgPSBudWxsOwogICAgICAgICAgICB0aGlzLl90dW5uZWwgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgdGhpcy5fc3R5bGVDYWNoZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3JhZiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3R1bm5lbCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGF0dGFjaGVkKCkgewogICAgICAgICAgICB0aGlzLl90dW5uZWwgPSB0aGlzLl9jcmVhdGVUdW5uZWwoKTsKICAgICAgICAgICAgdGhpcy5faGlkZU9uQmx1ciA9ICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudC5oaWRkZW4pCiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5faGlkZU9uQmx1cik7CiAgICAgICAgfQogICAgICAgIGRldGFjaGVkKCkgewogICAgICAgICAgICB0aGlzLmhpZGUoKTsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlVHVubmVsKHRoaXMuX3R1bm5lbCk7CiAgICAgICAgICAgIHRoaXMuX3R1bm5lbCA9IG51bGw7CiAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5faGlkZU9uQmx1cik7CiAgICAgICAgfQogICAgICAgIGNvbnRlbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90dW5uZWwuc2hhZG93Um9vdDsKICAgICAgICB9CiAgICAgICAgaGlkZSgpIHsKICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7CiAgICAgICAgICAgIHRoaXMuX3N0eWxlQ2FjaGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl90dW5uZWwuc3R5bGUub3BhY2l0eSA9IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENTUyBTY29wZXMgdGhlIG5ld2x5IGFkZGVkIERPTSAoaW4gbW9zdCB0b29sdGlwIHdoZXJlIGNvbHVtbnMgYXJlCiAgICAgICAgICogaW52YXJpYWJsZSwgb25seSBuZXdseSBhZGRlZCByb3dzIGFyZSBuZWNlc3NhcnkgdG8gYmUgc2NvcGVkKSBhbmQgcG9zaXRpb25zCiAgICAgICAgICogdGhlIHRvb2x0aXAgd2l0aCByZXNwZWN0IHRvIHRoZSBhbmNob3JOb2RlLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUFuZFBvc2l0aW9uKGFuY2hvck5vZGUpIHsKICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3JhZik7CiAgICAgICAgICAgIHRoaXMuX3JhZiA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdGhpcy5fcmVwb3NpdGlvbkltcGwoYW5jaG9yTm9kZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfcmVwb3NpdGlvbkltcGwoYW5jaG9yTm9kZSkgewogICAgICAgICAgICBjb25zdCB0b29sdGlwQ29udGVudCA9IHRoaXMuX3R1bm5lbDsKICAgICAgICAgICAgY29uc3Qgbm9kZVJlY3QgPSBhbmNob3JOb2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBjb25zdCB0b29sdGlwUmVjdCA9IHRvb2x0aXBDb250ZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBjb25zdCB2aWV3cG9ydEhlaWdodCA9IHdpbmRvdy5pbm5lckhlaWdodDsKICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRXaWR0aCA9IGRvY3VtZW50LmJvZHkuY2xpZW50V2lkdGg7CiAgICAgICAgICAgIGNvbnN0IGFuY2hvclRvcCA9IG5vZGVSZWN0LnRvcDsKICAgICAgICAgICAgY29uc3QgYW5jaG9yQm90dG9tID0gYW5jaG9yVG9wICsgbm9kZVJlY3QuaGVpZ2h0OwogICAgICAgICAgICBjb25zdCBlZmZlY3RpdmVUb29sdGlwSGVpZ2h0ID0gdG9vbHRpcFJlY3QuaGVpZ2h0ICsgVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDsKICAgICAgICAgICAgbGV0IGJvdHRvbSA9IG51bGw7CiAgICAgICAgICAgIGxldCBsZWZ0ID0gTWF0aC5tYXgodGhpcy5taW5EaXN0RnJvbUVkZ2UsIG5vZGVSZWN0LmxlZnQpOwogICAgICAgICAgICBsZXQgcmlnaHQgPSBudWxsOwogICAgICAgICAgICBsZXQgdG9wID0gYW5jaG9yVG9wOwogICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBUb29sdGlwUG9zaXRpb24uUklHSFQpIHsKICAgICAgICAgICAgICAgIGxlZnQgPSBub2RlUmVjdC5yaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRvcCA9IGFuY2hvckJvdHRvbSArIFRPT0xUSVBfWV9QSVhFTF9PRkZTRVQ7CiAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IGl0IGZyb20gZmFsbGluZyBvZmYgdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIHNjcmVlbi4KICAgICAgICAgICAgICAgIGlmIChkb2N1bWVudFdpZHRoIDwgbGVmdCArIHRvb2x0aXBSZWN0LndpZHRoICsgdGhpcy5taW5EaXN0RnJvbUVkZ2UpIHsKICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICByaWdodCA9IHRoaXMubWluRGlzdEZyb21FZGdlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UgdG8gcmVuZGVyIHRvb2x0aXAgYmVsb3cgdGhlIGFuY2hvck5vZGUgaW4KICAgICAgICAgICAgLy8gdGhlIHZpZXdwb3J0IGFuZCB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgYWJvdmUsIHBsYWNlIGl0IGFib3ZlIHRoZQogICAgICAgICAgICAvLyBhbmNob3JOb2RlLgogICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PSBUb29sdGlwUG9zaXRpb24uQVVUTyAmJgogICAgICAgICAgICAgICAgbm9kZVJlY3QudG9wIC0gZWZmZWN0aXZlVG9vbHRpcEhlaWdodCA+IDAgJiYKICAgICAgICAgICAgICAgIHZpZXdwb3J0SGVpZ2h0IDwgbm9kZVJlY3QudG9wICsgbm9kZVJlY3QuaGVpZ2h0ICsgZWZmZWN0aXZlVG9vbHRpcEhlaWdodCkgewogICAgICAgICAgICAgICAgdG9wID0gbnVsbDsKICAgICAgICAgICAgICAgIGJvdHRvbSA9IHZpZXdwb3J0SGVpZ2h0IC0gYW5jaG9yVG9wICsgVE9PTFRJUF9ZX1BJWEVMX09GRlNFVDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuZXdTdHlsZSA9IHsKICAgICAgICAgICAgICAgIGNvbnRhaW46ICdjb250ZW50JywKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEsCiAgICAgICAgICAgICAgICBsZWZ0OiBsZWZ0ID8gYCR7bGVmdH1weGAgOiBudWxsLAogICAgICAgICAgICAgICAgcmlnaHQ6IHJpZ2h0ID8gYCR7cmlnaHR9cHhgIDogbnVsbCwKICAgICAgICAgICAgICAgIHRvcDogdG9wID8gYCR7dG9wfXB4YCA6IG51bGwsCiAgICAgICAgICAgICAgICBib3R0b206IGJvdHRvbSA/IGAke2JvdHRvbX1weGAgOiBudWxsLAogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSBzdHlsZSAod2hpY2ggY2FuIGNhdXNlIHJlLWxheW91dCkgaWYgaXQgaGFzIG5vdAogICAgICAgICAgICAvLyBjaGFuZ2VkLgogICAgICAgICAgICBpZiAoIWxvZGFzaC5pc0VxdWFsKHRoaXMuX3N0eWxlQ2FjaGUsIG5ld1N0eWxlKSkgewogICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih0b29sdGlwQ29udGVudC5zdHlsZSwgbmV3U3R5bGUpOwogICAgICAgICAgICAgICAgdGhpcy5fc3R5bGVDYWNoZSA9IG5ld1N0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVUdW5uZWwoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1JlcXVpcmUgYGNvbnRlbnRDb21wb25lbnROYW1lYCB0byBiZSBhIG5hbWUgb2YgYSBQb2x5bWVyIGNvbXBvbmVudCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHR1bm5lbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQodGhpcy5jb250ZW50Q29tcG9uZW50TmFtZSk7CiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24odHVubmVsLnN0eWxlLCBERUZBVUxUX1RPT0xUSVBfU1RZTEUpOwogICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHR1bm5lbCk7CiAgICAgICAgICAgIHJldHVybiB0dW5uZWw7CiAgICAgICAgfQogICAgICAgIF9yZW1vdmVUdW5uZWwodHVubmVsKSB7CiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodHVubmVsKTsKICAgICAgICB9CiAgICB9OwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBWekNoYXJ0VG9vbHRpcC5wcm90b3R5cGUsICJjb250ZW50Q29tcG9uZW50TmFtZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFZ6Q2hhcnRUb29sdGlwLnByb3RvdHlwZSwgInBvc2l0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVnpDaGFydFRvb2x0aXAucHJvdG90eXBlLCAibWluRGlzdEZyb21FZGdlIiwgdm9pZCAwKTsKICAgIFZ6Q2hhcnRUb29sdGlwID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndnotY2hhcnQtdG9vbHRpcCcpCiAgICBdLCBWekNoYXJ0VG9vbHRpcCk7CgogICAgLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBMaW5lYXJTY2FsZSBleHRlbmRzIHNyYyQyLlNjYWxlcy5MaW5lYXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9pZ25vcmVPdXRsaWVyID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMucGFkUHJvcG9ydGlvbigwLjIpOwogICAgICAgIH0KICAgICAgICBzZXRWYWx1ZVByb3ZpZGVyRm9yRG9tYWluKHByb3ZpZGVyKSB7CiAgICAgICAgICAgIHRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4gPSBwcm92aWRlcjsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRPRE8obmlja2ZlbHQpOiBFeGFtaW5lIHdoZXRoZXIgd2UgdHJ1bHkgcmVxdWlyZSBgY2AuCiAgICAgICAgICogQWRkcyBzb21lIHBhZGRpbmcgdG8gYSBnaXZlbiBkb21haW4uIFNwZWNpZmljYWxseSwgaXQ6CiAgICAgICAgICogLSByZXR1cm5zIGFib3V0IFstMC4xYSAtIGMsIDIuMWEgKyBjXSB3aGVuIGEgPSBiIGFuZCBhID49IDAuCiAgICAgICAgICogLSByZXR1cm5zIGFib3V0IFstMi4xfGF8IC0gYywgLTAuMXxhfCArIGNdIHdoZW4gYSA9IGIgYW5kIGEgPCAwLgogICAgICAgICAqIC0gcmV0dXJucyBbLTAuMWIsIGIgKyBwYWRQcm9wb3J0aW9uICogKGItYSldIGlmIGIgPiAyYSBhbmQgYSA+IDAKICAgICAgICAgKiAtIGVsc2UsIHBhZHMgYnkgYHBhZFByb3BvcnRpb25gCiAgICAgICAgICogTm90ZSB0aGF0IGBjYCBpcyBhIGNvbnN0YW50IG9mZnNldCB3aGljaCBzcGVjaWZpY2FsbHkgaXMgMS4xLiBQbGVhc2UgcmVmZXIKICAgICAgICAgKiB0byBbMV0gZm9yIGl0cyByYXRpb25hbGUuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX25pY2VEb21haW4oZG9tYWluLCBjb3VudCkgewogICAgICAgICAgICBjb25zdCBbYSwgYl0gPSBkb21haW47CiAgICAgICAgICAgIGxldCBwYWRkaW5nOwogICAgICAgICAgICBjb25zdCBzcGFuID0gYiAtIGE7CiAgICAgICAgICAgIGlmIChzcGFuID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBJZiBiPT09YSwgd2Ugd291bGQgY3JlYXRlIGFuIGVtcHR5IHJhbmdlLiBXZSBpbnN0ZWFkIHNlbGVjdCB0aGUgcmFuZ2UKICAgICAgICAgICAgICAgIC8vIFswLCAyKmFdIGlmIGEgPiAwLCBvciBbLTIqYSwgMF0gaWYgYSA8IDAsIHBsdXMgYSBsaXR0bGUgYml0IG9mCiAgICAgICAgICAgICAgICAvLyBleHRyYSBwYWRkaW5nIG9uIHRoZSB0b3AgYW5kIGJvdHRvbSBvZiB0aGUgcGxvdC4KICAgICAgICAgICAgICAgIHBhZGRpbmcgPSBNYXRoLmFicyhhKSAqIDEuMSArIDEuMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBhZGRpbmcgPSBzcGFuICogdGhpcy5wYWRQcm9wb3J0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGxvd2VyOwogICAgICAgICAgICBpZiAoYSA+PSAwICYmIGEgPCBzcGFuKSB7CiAgICAgICAgICAgICAgICAvLyBbMV06IFdlIGluY2x1ZGUgdGhlIGludGVyY2VwdCAoeSA9IDApIGlmIGRvaW5nIHNvIGxlc3MgdGhhbiBkb3VibGVzIHRoZQogICAgICAgICAgICAgICAgLy8gc3BhbiBvZiB0aGUgeS1heGlzLiAoV2UgYWN0dWFsbHkgc2VsZWN0IGEgbG93ZXIgYm91bmQgdGhhdCdzIHNsaWdodGx5CiAgICAgICAgICAgICAgICAvLyBsZXNzIHRoYW4gMCBzbyB0aGF0IDAuMDAgd2lsbCBjbGVhcmx5IGJlIHdyaXR0ZW4gb24gdGhlIGxvd2VyIGVkZ2Ugb2YKICAgICAgICAgICAgICAgIC8vIHRoZSBjaGFydC4gVGhlIGxhYmVsIG9uIHRoZSBsb3dlc3QgdGljayBpcyBvZnRlbiBmaWx0ZXJlZCBvdXQuKQogICAgICAgICAgICAgICAgbG93ZXIgPSAtMC4xICogYjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxvd2VyID0gYSAtIHBhZGRpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1cGVyLl9uaWNlRG9tYWluKFtsb3dlciwgYiArIHBhZGRpbmddLCBjb3VudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZSB0byByZW1vdmUgZGVmYXVsdCBwYWRkaW5nIGxvZ2ljLgogICAgICAgICAqLwogICAgICAgIF9nZXRVbmJvdW5kZWRFeHRlbnQoaWdub3JlQXR0YWNoU3RhdGUpIHsKICAgICAgICAgICAgY29uc3QgaW5jbHVkZWRWYWx1ZXMgPSB0aGlzLl9nZXRBbGxJbmNsdWRlZFZhbHVlcyhpZ25vcmVBdHRhY2hTdGF0ZSk7CiAgICAgICAgICAgIGxldCBleHRlbnQgPSB0aGlzLl9kZWZhdWx0RXh0ZW50KCk7CiAgICAgICAgICAgIGlmIChpbmNsdWRlZFZhbHVlcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkRXh0ZW50ID0gWwogICAgICAgICAgICAgICAgICAgIHNyYyQyLlV0aWxzLk1hdGgubWluKGluY2x1ZGVkVmFsdWVzLCBleHRlbnRbMF0pLAogICAgICAgICAgICAgICAgICAgIHNyYyQyLlV0aWxzLk1hdGgubWF4KGluY2x1ZGVkVmFsdWVzLCBleHRlbnRbMV0pLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIGV4dGVudCA9IHRoaXMuX25pY2VEb21haW4oY29tYmluZWRFeHRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBleHRlbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBvdmVycmlkZQogICAgICAgICAqLwogICAgICAgIF9nZXRBbGxJbmNsdWRlZFZhbHVlcyhpZ25vcmVBdHRhY2hTdGF0ZSA9IGZhbHNlKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IHRoaXMuX3ZhbHVlUHJvdmlkZXJGb3JEb21haW4KICAgICAgICAgICAgICAgID8gdGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbigpCiAgICAgICAgICAgICAgICA6IFtdOwogICAgICAgICAgICByZXR1cm4gdGhpcy5leHRlbnRPZlZhbHVlcyh2YWx1ZXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAb3ZlcnJpZGUgdG8gYXBwbHkgdGhlIG91dGxpZXIgbG9naWMuCiAgICAgICAgICovCiAgICAgICAgZXh0ZW50T2ZWYWx1ZXModmFsdWVzKSB7CiAgICAgICAgICAgIGNvbnN0IGxlZ2FsVmFsdWVzID0gdmFsdWVzLmZpbHRlcigoeCkgPT4gc3JjJDIuVXRpbHMuTWF0aC5pc1ZhbGlkTnVtYmVyKHgpKTsKICAgICAgICAgICAgbGV0IGZpbHRlcmVkVmFsdWVzID0gbGVnYWxWYWx1ZXM7CiAgICAgICAgICAgIGlmICh0aGlzLmlnbm9yZU91dGxpZXIoKSkgewogICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkVmFsdWVzID0gbGVnYWxWYWx1ZXMuc29ydCgoYSwgYikgPT4gYSAtIGIpOwogICAgICAgICAgICAgICAgY29uc3QgYSA9IHRocmVzaG9sZChzb3J0ZWRWYWx1ZXMsIDAuMDUpOwogICAgICAgICAgICAgICAgY29uc3QgYiA9IHRocmVzaG9sZChzb3J0ZWRWYWx1ZXMsIDAuOTUpOwogICAgICAgICAgICAgICAgZmlsdGVyZWRWYWx1ZXMgPSBsZWdhbFZhbHVlcy5maWx0ZXIoKHgpID0+IHggPj0gYSAmJiB4IDw9IGIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGV4dGVudCQxID0gZXh0ZW50KGZpbHRlcmVkVmFsdWVzKTsKICAgICAgICAgICAgcmV0dXJuIGV4dGVudCQxWzBdID09IG51bGwgfHwgZXh0ZW50JDFbMV0gPT0gbnVsbCA/IFtdIDogZXh0ZW50JDE7CiAgICAgICAgfQogICAgICAgIGlnbm9yZU91dGxpZXIoaWdub3JlKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgaWdub3JlID09ICdib29sZWFuJykgewogICAgICAgICAgICAgICAgdGhpcy5faWdub3JlT3V0bGllciA9IGlnbm9yZTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pZ25vcmVPdXRsaWVyOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIFRmU2NhbGUgZXh0ZW5kcyBzcmMkMi5RdWFudGl0YXRpdmVTY2FsZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX2lnbm9yZU91dGxpZXIgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbihwcm92aWRlcikgewogICAgICAgICAgICB0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluID0gcHJvdmlkZXI7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBpZ25vcmVPdXRsaWVyKGlnbm9yZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIGlnbm9yZSA9PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2lnbm9yZU91dGxpZXIgPSBpZ25vcmU7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5faWdub3JlT3V0bGllcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBwb3NzaWJsZSBgZXh0ZW50YHMgZm9yIGEgZGF0YXNldC4gTm90ZSB0aGF0IGEgZGF0YXNldCBjYW4gY29udGFpbgogICAgICAgICAqIG11bHRpcGxlIHNlcmllcy4gVW5saWtlIHRoZSBtZXRob2QgbmFtZSBzdWdnZXN0cywgaXQgdXNlcyB2YWx1ZXMgZnJvbSBlYWNoCiAgICAgICAgICogc2VyaWVzIHRvIHJldHVybiBgZXh0ZW50YHMuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgX2dldEFsbEluY2x1ZGVkVmFsdWVzKGlnbm9yZUF0dGFjaFN0YXRlID0gZmFsc2UpIHsKICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gdGhpcy5fdmFsdWVQcm92aWRlckZvckRvbWFpbgogICAgICAgICAgICAgICAgPyB0aGlzLl92YWx1ZVByb3ZpZGVyRm9yRG9tYWluKCkKICAgICAgICAgICAgICAgIDogW107CiAgICAgICAgICAgIHJldHVybiB0aGlzLmV4dGVudE9mVmFsdWVzKHZhbHVlcyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLy8gU21hbGxlc3QgcG9zaXRpdmUgbm9uLXplcm8gdmFsdWUgcmVwcmVzZW50ZWQgYnkgSUVFRSA3NTQgYmluYXJ5ICg2NCBiaXQpCWltcG9ydCAqIGFzIGQzIGZyb20gJ2QzJzsKICAgIC8vIGZsb2F0aW5nLXBvaW50IG51bWJlci4KICAgIC8vIGh0dHBzOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNS4xLyNzZWMtOC41CiAgICBjb25zdCBNSU5fUE9TSVRJVkVfVkFMVUUgPSBNYXRoLnBvdygyLCAtMTA3NCk7CiAgICBmdW5jdGlvbiBsb2ckNCh4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgubG9nMTAoeCk7CiAgICB9CiAgICBmdW5jdGlvbiBwb3ckNCh4KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucG93KDEwLCB4KTsKICAgIH0KICAgIC8qKgogICAgICogQSBsb2dhcml0aG1pYyBzY2FsZSB0aGF0IHJldHVybnMgTmFOIGZvciBhbGwgbm9uLXBvc2l0aXZlIHZhbHVlcyBhcyBpdAogICAgICogbWF0aGVtYXRpY2FsbHkgaXMgc3VwcG9zZWQgdG8gYmUgLUluZmluaXR5LiBBbHNvLCBkdWUgdG8gdGhlIGZsb2F0aW5nIHBvaW50CiAgICAgKiBwcmVjaXNpb24gaXNzdWUsIGl0IHRyZWF0cyBhbGwgdmFsdWVzIHNtYWxsZXIgdGhhbiBNSU5fUE9TSVRJVkVfVkFMVUUgYXMKICAgICAqIG5vbi1wb3NpdGl2ZS4gTGFzdGx5LCBpZiB1c2luZyBhdXRvRG9tYWluIGZlYXR1cmUgYW5kIGlmIGFsbCB2YWx1ZXMgYXJlIHRoZQogICAgICogc2FtZSB2YWx1ZSwgaXQgcGFkcyAxMCUgb2YgdGhlIHZhbHVlLgogICAgICovCiAgICBjbGFzcyBMb2dTY2FsZSBleHRlbmRzIFRmU2NhbGUgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9kM0xvZ1NjYWxlID0gbG9nJDEoKTsKICAgICAgICAgICAgdGhpcy5wYWRQcm9wb3J0aW9uKDAuMik7CiAgICAgICAgfQogICAgICAgIHNjYWxlKHgpIHsKICAgICAgICAgICAgLy8gUmV0dXJuaW5nIE5hTiBtYWtlcyBzdXJlIGxpbmUgcGxvdCBkb2VzIG5vdCBwbG90IGlsbGVnYWwgdmFsdWVzLgogICAgICAgICAgICBpZiAoeCA8PSAwKQogICAgICAgICAgICAgICAgcmV0dXJuIE5hTjsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUoeCk7CiAgICAgICAgfQogICAgICAgIGludmVydCh4KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmludmVydCh4KTsKICAgICAgICB9CiAgICAgICAgc2NhbGVUcmFuc2Zvcm1hdGlvbih2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGludmVydGVkVHJhbnNmb3JtYXRpb24odmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW52ZXJ0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZ2V0VHJhbnNmb3JtYXRpb25Eb21haW4oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRvbWFpbigpOwogICAgICAgIH0KICAgICAgICBzZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbihkb21haW4pIHsKICAgICAgICAgICAgdGhpcy5kb21haW4oZG9tYWluKTsKICAgICAgICB9CiAgICAgICAgZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRVbmJvdW5kZWRFeHRlbnQodHJ1ZSk7CiAgICAgICAgfQogICAgICAgIF9nZXREb21haW4oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluOwogICAgICAgIH0KICAgICAgICBfc2V0RG9tYWluKHZhbHVlcykgewogICAgICAgICAgICB0aGlzLl91bnRyYW5zZm9ybWVkRG9tYWluID0gdmFsdWVzOwogICAgICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gdmFsdWVzOwogICAgICAgICAgICBzdXBlci5fc2V0RG9tYWluKFtNYXRoLm1heChNSU5fUE9TSVRJVkVfVkFMVUUsIG1pbiksIG1heF0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiBhIGRvbWFpbiwgcGFkIGl0IGFuZCBjbGlwIHRoZSBsb3dlciBib3VuZCB0byBNSU5fUE9TSVRJVkVfVkFMVUUuCiAgICAgICAgICovCiAgICAgICAgX25pY2VEb21haW4oZG9tYWluLCBjb3VudCkgewogICAgICAgICAgICBjb25zdCBbbG93LCBoaWdoXSA9IGRvbWFpbjsKICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRMb2dMb3cgPSBNYXRoLm1heChsb2ckNChNSU5fUE9TSVRJVkVfVkFMVUUpLCBsb2ckNChsb3cpKTsKICAgICAgICAgICAgY29uc3QgbG9nSGlnaCA9IGxvZyQ0KGhpZ2gpOwogICAgICAgICAgICBjb25zdCBzcHJlYWQgPSBsb2dIaWdoIC0gYWRqdXN0ZWRMb2dMb3c7CiAgICAgICAgICAgIGNvbnN0IHBhZCA9IHNwcmVhZCA/IHNwcmVhZCAqIHRoaXMucGFkUHJvcG9ydGlvbigpIDogMTsKICAgICAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgICAgIHBvdyQ0KE1hdGgubWF4KGxvZyQ0KE1JTl9QT1NJVElWRV9WQUxVRSksIGFkanVzdGVkTG9nTG93IC0gcGFkKSksCiAgICAgICAgICAgICAgICBwb3ckNChsb2dIaWdoICsgcGFkKSwKICAgICAgICAgICAgXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGEgcG9zc2libGUgZXh0ZW50IGJhc2VkIG9uIGRhdGEgZnJvbSBhbGwgcGxvdHMgdGhlIHNjYWxlIGlzCiAgICAgICAgICogY29ubmVjdGVkIHRvIGJ5IHRha2luZyB0aGUgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZXMgb2YgYWxsIGV4dGVudHMgZm9yCiAgICAgICAgICogbG93ZXIgYW5kIHVwcGVyIGJvdW5kLCByZXNwZWN0aXZlbHkuCiAgICAgICAgICogQG92ZXJyaWRlIHRvIHJlbW92ZSBkZWZhdWx0IHBhZGRpbmcgbG9naWMuCiAgICAgICAgICovCiAgICAgICAgX2dldFVuYm91bmRlZEV4dGVudChpZ25vcmVBdHRhY2hTdGF0ZSkgewogICAgICAgICAgICBjb25zdCBpbmNsdWRlZFZhbHVlcyA9IHRoaXMuX2dldEFsbEluY2x1ZGVkVmFsdWVzKGlnbm9yZUF0dGFjaFN0YXRlKTsKICAgICAgICAgICAgbGV0IGV4dGVudCA9IHRoaXMuX2RlZmF1bHRFeHRlbnQoKTsKICAgICAgICAgICAgaWYgKGluY2x1ZGVkVmFsdWVzLmxlbmd0aCAhPT0gMCkgewogICAgICAgICAgICAgICAgY29uc3QgY29tYmluZWRFeHRlbnQgPSBbCiAgICAgICAgICAgICAgICAgICAgc3JjJDIuVXRpbHMuTWF0aC5taW4oaW5jbHVkZWRWYWx1ZXMsIGV4dGVudFswXSksCiAgICAgICAgICAgICAgICAgICAgc3JjJDIuVXRpbHMuTWF0aC5tYXgoaW5jbHVkZWRWYWx1ZXMsIGV4dGVudFsxXSksCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgZXh0ZW50ID0gdGhpcy5fbmljZURvbWFpbihjb21iaW5lZEV4dGVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGV4dGVudDsKICAgICAgICB9CiAgICAgICAgX2dldEFsbEluY2x1ZGVkVmFsdWVzKGlnbm9yZUF0dGFjaFN0YXRlID0gZmFsc2UpIHsKICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gc3VwZXIuX2dldEFsbEluY2x1ZGVkVmFsdWVzKCk7CiAgICAgICAgICAgIC8vIEZvciBsb2cgc2NhbGUsIHRoZSB2YWx1ZSBjYW5ub3QgYmUgc21hbGxlciBvciBlcXVhbCB0byAwLiBUaGV5IGFyZQogICAgICAgICAgICAvLyBuZWdhdGl2ZSBpbmZpbml0eS4KICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5tYXAoKHgpID0+ICh4ID4gMCA/IHggOiBNSU5fUE9TSVRJVkVfVkFMVUUpKTsKICAgICAgICB9CiAgICAgICAgX2RlZmF1bHRFeHRlbnQoKSB7CiAgICAgICAgICAgIHJldHVybiBbMSwgMTBdOwogICAgICAgIH0KICAgICAgICBfYmFja2luZ1NjYWxlRG9tYWluKHZhbHVlcykgewogICAgICAgICAgICBpZiAodmFsdWVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9kM0xvZ1NjYWxlLmRvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZDNMb2dTY2FsZS5kb21haW4odmFsdWVzKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9nZXRSYW5nZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUucmFuZ2UoKTsKICAgICAgICB9CiAgICAgICAgX3NldFJhbmdlKHZhbHVlcykgewogICAgICAgICAgICB0aGlzLl9kM0xvZ1NjYWxlLnJhbmdlKHZhbHVlcyk7CiAgICAgICAgfQogICAgICAgIGRlZmF1bHRUaWNrcygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzTG9nU2NhbGUudGlja3MoMSk7CiAgICAgICAgfQogICAgICAgIHRpY2tzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZDNMb2dTY2FsZS50aWNrcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIGBleHRlbnRgIGZvciBhIGRhdGEgc2VyaWVzLiBJbiBsb2ctc2NhbGUsIHdlIG11c3Qgb21pdCBhbGwKICAgICAgICAgKiBub24tcG9zaXRpdmUgdmFsdWVzIHdoZW4gY29tcHV0aW5nIGEgYGRvbWFpbmAuCiAgICAgICAgICogQG92ZXJyaWRlCiAgICAgICAgICovCiAgICAgICAgZXh0ZW50T2ZWYWx1ZXModmFsdWVzKSB7CiAgICAgICAgICAgIC8vIExvZyBjYW4gb25seSB0YWtlIHBvc2l0aXZlIHZhbHVlcy4KICAgICAgICAgICAgY29uc3QgbGVnYWxWYWx1ZXMgPSB2YWx1ZXMuZmlsdGVyKCh4KSA9PiBzcmMkMi5VdGlscy5NYXRoLmlzVmFsaWROdW1iZXIoeCkgJiYgeCA+IDApOwogICAgICAgICAgICBsZXQgZmlsdGVyZWRWYWx1ZXMgPSBsZWdhbFZhbHVlczsKICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlT3V0bGllcigpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBsb2dWYWx1ZXMgPSBsZWdhbFZhbHVlcy5tYXAobG9nJDQpOwogICAgICAgICAgICAgICAgY29uc3Qgc29ydGVkTG9nVmFsdWVzID0gbG9nVmFsdWVzLnNvcnQoKGEsIGIpID0+IGEgLSBiKTsKICAgICAgICAgICAgICAgIGNvbnN0IGEgPSB0aHJlc2hvbGQoc29ydGVkTG9nVmFsdWVzLCAwLjA1KTsKICAgICAgICAgICAgICAgIGNvbnN0IGIgPSB0aHJlc2hvbGQoc29ydGVkTG9nVmFsdWVzLCAwLjk1KTsKICAgICAgICAgICAgICAgIGZpbHRlcmVkVmFsdWVzID0gc29ydGVkTG9nVmFsdWVzLmZpbHRlcigoeCkgPT4geCA+PSBhICYmIHggPD0gYikubWFwKHBvdyQ0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHRlbnQkMSA9IGV4dGVudChmaWx0ZXJlZFZhbHVlcyk7CiAgICAgICAgICAgIHJldHVybiBleHRlbnQkMVswXSA9PSBudWxsIHx8IGV4dGVudCQxWzFdID09IG51bGwgPyBbXSA6IGV4dGVudCQxOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIERyYWdab29tTGF5ZXIgZXh0ZW5kcyBzcmMkMi5Db21wb25lbnRzLlNlbGVjdGlvbkJveExheWVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgU2VsZWN0aW9uQm94TGF5ZXIgd2l0aCBhbiBhdHRhY2hlZCBEcmFnSW50ZXJhY3Rpb24gYW5kCiAgICAgICAgICogQ2xpY2tJbnRlcmFjdGlvbi4gT24gZHJhZywgaXQgdHJpZ2dlcnMgYW4gYW5pbWF0ZWQgem9vbSBpbnRvIHRoZSBib3gKICAgICAgICAgKiB0aGF0IHdhcyBkcmFnZ2VkLiBPbiBkb3VibGUgY2xpY2ssIGl0IHpvb21zIGJhY2sgb3V0IHRvIHRoZSBvcmlnaW5hbAogICAgICAgICAqIHZpZXcsIGJlZm9yZSBhbnkgem9vbWluZy4KICAgICAgICAgKiBUaGUgem9vbSBhbmltYXRpb24gdXNlcyBhbiBlYXNpbmcgZnVuY3Rpb24gKGRlZmF1bHQKICAgICAgICAgKiBkMy5lYXNlKCdjdWJpYy1pbi1vdXQnKSkgYW5kIGlzIGN1c3RvbWl6YWJsZS4KICAgICAgICAgKiBVc2FnZTogQ29uc3RydWN0IHRoZSBzZWxlY3Rpb24gYm94IGxheWVyIGFuZCBhdHRhY2ggeCBhbmQgeSBzY2FsZXMsCiAgICAgICAgICogYW5kIHRoZW4gYWRkIHRoZSBsYXllciBvdmVyIHRoZSBwbG90IHlvdSBhcmUgem9vbWluZyBvbiB1c2luZyBhCiAgICAgICAgICogQ29tcG9uZW50IEdyb3VwLgogICAgICAgICAqIFRPRE8oQGRlY2VudHJhbGlvbikgLSBtZXJnZSB0aGlzIGludG8gUGxvdHRhYmxlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoeFNjYWxlLCB5U2NhbGUsIHVuem9vbU1ldGhvZCkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLmVhc2VGbiA9IGN1YmljSW5PdXQ7CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblRpbWUgPSA3NTA7CiAgICAgICAgICAgIHRoaXMueFNjYWxlKHhTY2FsZSk7CiAgICAgICAgICAgIHRoaXMueVNjYWxlKHlTY2FsZSk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdJbnRlcmFjdGlvbiA9IG5ldyBzcmMkMi5JbnRlcmFjdGlvbnMuRHJhZygpOwogICAgICAgICAgICB0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uID0gbmV3IHNyYyQyLkludGVyYWN0aW9ucy5DbGljaygpOwogICAgICAgICAgICB0aGlzLnNldHVwQ2FsbGJhY2tzKCk7CiAgICAgICAgICAgIHRoaXMudW56b29tTWV0aG9kID0gdW56b29tTWV0aG9kOwogICAgICAgICAgICAvLyBBY3RpdmF0ZSBpbnRlcmFjdGlvbiBvbmx5IHdoZW4gdGhlIGNvbXBvbmVudCBpcyBtb3VudGVkIG9udG8gRE9NLgogICAgICAgICAgICB0aGlzLm9uRGV0YWNoKCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZGV0YWNoRnJvbSh0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuX2RyYWdJbnRlcmFjdGlvbi5kZXRhY2hGcm9tKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5vbkFuY2hvcigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9kb3VibGVDbGlja0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmF0dGFjaFRvKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXIgYSBtZXRob2QgdGhhdCBjYWxscyB3aGVuIHRoZSBEcmFnWm9vbSBpbnRlcmFjdGlvbiBzdGFydHMuCiAgICAgICAgICovCiAgICAgICAgaW50ZXJhY3Rpb25TdGFydChjYikgewogICAgICAgICAgICB0aGlzLm9uU3RhcnQgPSBjYjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXIgYSBtZXRob2QgdGhhdCBjYWxscyB3aGVuIHRoZSBEcmFnWm9vbSBpbnRlcmFjdGlvbiBlbmRzLgogICAgICAgICAqLwogICAgICAgIGludGVyYWN0aW9uRW5kKGNiKSB7CiAgICAgICAgICAgIHRoaXMub25FbmQgPSBjYjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBiYWNraW5nIGRyYWcgaW50ZXJhY3Rpb24uIFVzZWZ1bCBmb3IgY3VzdG9taXphdGlvbiB0byB0aGUKICAgICAgICAgKiBpbnRlcmFjdGlvbi4KICAgICAgICAgKi8KICAgICAgICBkcmFnSW50ZXJhY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kcmFnSW50ZXJhY3Rpb247CiAgICAgICAgfQogICAgICAgIHNldHVwQ2FsbGJhY2tzKCkgewogICAgICAgICAgICBsZXQgZHJhZ2dpbmcgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLm9uRHJhZ1N0YXJ0KChzdGFydFBvaW50KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmJvdW5kcyh7CiAgICAgICAgICAgICAgICAgICAgdG9wTGVmdDogc3RhcnRQb2ludCwKICAgICAgICAgICAgICAgICAgICBib3R0b21SaWdodDogc3RhcnRQb2ludCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5vblN0YXJ0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnKChzdGFydFBvaW50LCBlbmRQb2ludCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5ib3VuZHMoeyB0b3BMZWZ0OiBzdGFydFBvaW50LCBib3R0b21SaWdodDogZW5kUG9pbnQgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmJveFZpc2libGUodHJ1ZSk7CiAgICAgICAgICAgICAgICBkcmFnZ2luZyA9IHRydWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kcmFnSW50ZXJhY3Rpb24ub25EcmFnRW5kKChzdGFydFBvaW50LCBlbmRQb2ludCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5ib3hWaXNpYmxlKGZhbHNlKTsKICAgICAgICAgICAgICAgIHRoaXMuYm91bmRzKHsgdG9wTGVmdDogc3RhcnRQb2ludCwgYm90dG9tUmlnaHQ6IGVuZFBvaW50IH0pOwogICAgICAgICAgICAgICAgaWYgKGRyYWdnaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uRW5kKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkcmFnZ2luZyA9IGZhbHNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fZG91YmxlQ2xpY2tJbnRlcmFjdGlvbi5vbkRvdWJsZUNsaWNrKHRoaXMudW56b29tLmJpbmQodGhpcykpOwogICAgICAgIH0KICAgICAgICBhbmltYXRpb25UaW1lKGFuaW1hdGlvblRpbWUpIHsKICAgICAgICAgICAgaWYgKGFuaW1hdGlvblRpbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FuaW1hdGlvblRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGFuaW1hdGlvblRpbWUgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2FuaW1hdGlvblRpbWUgY2Fubm90IGJlIG5lZ2F0aXZlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uVGltZSA9IGFuaW1hdGlvblRpbWU7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdGhlIGVhc2luZyBmdW5jdGlvbiwgd2hpY2ggZGV0ZXJtaW5lcyBob3cgdGhlIHpvb20gaW50ZXJwb2xhdGVzCiAgICAgICAgICogb3ZlciB0aW1lLgogICAgICAgICAqLwogICAgICAgIGVhc2UoZm4pIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlYXNlIGZ1bmN0aW9uIG11c3QgYmUgYSBmdW5jdGlvbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmbigwKSAhPT0gMCB8fCBmbigxKSAhPT0gMSkgewogICAgICAgICAgICAgICAgc3JjJDIuVXRpbHMuV2luZG93Lndhcm4oJ0Vhc2luZyBmdW5jdGlvbiBkb2VzIG5vdCBtYWludGFpbiBpbnZhcmlhbnQgJyArCiAgICAgICAgICAgICAgICAgICAgJ2YoMCk9PTAgJiYgZigxKT09MS4gQmFkIGJlaGF2aW9yIG1heSByZXN1bHQuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lYXNlRm4gPSBmbjsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIC8vIFpvb20gaW50byBleHRlbnQgb2YgdGhlIHNlbGVjdGlvbiBib3ggYm91bmRzCiAgICAgICAgem9vbSgpIHsKICAgICAgICAgICAgbGV0IHgwID0gdGhpcy54RXh0ZW50KClbMF0udmFsdWVPZigpOwogICAgICAgICAgICBsZXQgeDEgPSB0aGlzLnhFeHRlbnQoKVsxXS52YWx1ZU9mKCk7CiAgICAgICAgICAgIGxldCB5MCA9IHRoaXMueUV4dGVudCgpWzFdLnZhbHVlT2YoKTsKICAgICAgICAgICAgbGV0IHkxID0gdGhpcy55RXh0ZW50KClbMF0udmFsdWVPZigpOwogICAgICAgICAgICBpZiAoeDAgPT09IHgxIHx8IHkwID09PSB5MSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaW50ZXJwb2xhdGVab29tKHgwLCB4MSwgeTAsIHkxKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVzdG9yZSB0aGUgc2NhbGVzIHRvIHRoZWlyIHN0YXRlIGJlZm9yZSBhbnkgem9vbQogICAgICAgIHVuem9vbSgpIHsKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZXNldCB0aGUgem9vbSBkb21haW4gdW5jb25kaXRpb25hbGx5LCBhcyB0aGUgZGF0YSBvciB0aGUKICAgICAgICAgICAgLy8gc21vb3RoaW5nIG1heSBoYXZlIHVwZGF0ZWQsIHN1Y2ggdGhhdCB3ZSBhcmUgbm90IGxvbmdlciBmdWxseSB6b29tZWQgb3V0LgogICAgICAgICAgICBsZXQgeFNjYWxlID0gdGhpcy54U2NhbGUoKTsKICAgICAgICAgICAgeFNjYWxlLl9kb21haW5NaW4gPSBudWxsOwogICAgICAgICAgICB4U2NhbGUuX2RvbWFpbk1heCA9IG51bGw7CiAgICAgICAgICAgIGxldCB4RG9tYWluID0geFNjYWxlLl9nZXRFeHRlbnQoKTsKICAgICAgICAgICAgdGhpcy54U2NhbGUoKS5kb21haW4oeERvbWFpbik7CiAgICAgICAgICAgIHRoaXMudW56b29tTWV0aG9kKCk7CiAgICAgICAgfQogICAgICAgIC8vIElmIHdlIGFyZSB6b29taW5nLCBkaXNhYmxlIGludGVyYWN0aW9ucywgdG8gYXZvaWQgY29udGVudGlvbgogICAgICAgIGlzWm9vbWluZyhpc1pvb21pbmcpIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ0ludGVyYWN0aW9uLmVuYWJsZWQoIWlzWm9vbWluZyk7CiAgICAgICAgICAgIHRoaXMuX2RvdWJsZUNsaWNrSW50ZXJhY3Rpb24uZW5hYmxlZCghaXNab29taW5nKTsKICAgICAgICB9CiAgICAgICAgaW50ZXJwb2xhdGVab29tKHgwZiwgeDFmLCB5MGYsIHkxZikgewogICAgICAgICAgICBsZXQgeDBzID0gdGhpcy54U2NhbGUoKS5kb21haW4oKVswXS52YWx1ZU9mKCk7CiAgICAgICAgICAgIGxldCB4MXMgPSB0aGlzLnhTY2FsZSgpLmRvbWFpbigpWzFdLnZhbHVlT2YoKTsKICAgICAgICAgICAgbGV0IHkwcyA9IHRoaXMueVNjYWxlKCkuZG9tYWluKClbMF0udmFsdWVPZigpOwogICAgICAgICAgICBsZXQgeTFzID0gdGhpcy55U2NhbGUoKS5kb21haW4oKVsxXS52YWx1ZU9mKCk7CiAgICAgICAgICAgIC8vIENvcHkgYSByZWYgdG8gdGhlIGVhc2UgZm4sIHNvIHRoYXQgY2hhbmdpbmcgZWFzZSB3b250IGFmZmVjdCB6b29tcyBpbgogICAgICAgICAgICAvLyBwcm9ncmVzcy4KICAgICAgICAgICAgbGV0IGVhc2UgPSB0aGlzLmVhc2VGbjsKICAgICAgICAgICAgbGV0IGludGVycG9sYXRvciA9IChhLCBiLCBwKSA9PiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKShlYXNlKHApKTsKICAgICAgICAgICAgdGhpcy5pc1pvb21pbmcodHJ1ZSk7CiAgICAgICAgICAgIGxldCBzdGFydCA9IERhdGUubm93KCk7CiAgICAgICAgICAgIGxldCBkcmF3ID0gKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IG5vdyA9IERhdGUubm93KCk7CiAgICAgICAgICAgICAgICBsZXQgcGFzc2VkID0gbm93IC0gc3RhcnQ7CiAgICAgICAgICAgICAgICBsZXQgcCA9IHRoaXMuX2FuaW1hdGlvblRpbWUgPT09IDAKICAgICAgICAgICAgICAgICAgICA/IDEKICAgICAgICAgICAgICAgICAgICA6IE1hdGgubWluKDEsIHBhc3NlZCAvIHRoaXMuX2FuaW1hdGlvblRpbWUpOwogICAgICAgICAgICAgICAgbGV0IHgwID0gaW50ZXJwb2xhdG9yKHgwcywgeDBmLCBwKTsKICAgICAgICAgICAgICAgIGxldCB4MSA9IGludGVycG9sYXRvcih4MXMsIHgxZiwgcCk7CiAgICAgICAgICAgICAgICBsZXQgeTAgPSBpbnRlcnBvbGF0b3IoeTBzLCB5MGYsIHApOwogICAgICAgICAgICAgICAgbGV0IHkxID0gaW50ZXJwb2xhdG9yKHkxcywgeTFmLCBwKTsKICAgICAgICAgICAgICAgIHRoaXMueFNjYWxlKCkuZG9tYWluKFt4MCwgeDFdKTsKICAgICAgICAgICAgICAgIHRoaXMueVNjYWxlKCkuZG9tYWluKFt5MCwgeTFdKTsKICAgICAgICAgICAgICAgIGlmIChwIDwgMSkgewogICAgICAgICAgICAgICAgICAgIHNyYyQyLlV0aWxzLkRPTS5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbChkcmF3KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMub25FbmQoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmlzWm9vbWluZyhmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRyYXcoKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTggVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICB2YXIgU3RhdGU7CiAgICAoZnVuY3Rpb24gKFN0YXRlKSB7CiAgICAgICAgU3RhdGVbU3RhdGVbIk5PTkUiXSA9IDBdID0gIk5PTkUiOwogICAgICAgIFN0YXRlW1N0YXRlWyJEUkFHX1pPT01JTkciXSA9IDFdID0gIkRSQUdfWk9PTUlORyI7CiAgICAgICAgU3RhdGVbU3RhdGVbIlBBTk5JTkciXSA9IDJdID0gIlBBTk5JTkciOwogICAgfSkoU3RhdGUgfHwgKFN0YXRlID0ge30pKTsKICAgIGNsYXNzIFBhblpvb21EcmFnTGF5ZXIgZXh0ZW5kcyBzcmMkMi5Db21wb25lbnRzLkdyb3VwIHsKICAgICAgICAvKioKICAgICAgICAgKiBBIFBsb3R0YWJsZSBjb21wb25lbnQvbGF5ZXIgd2l0aCBhIGNvbXBsZXggaW50ZXJhY3Rpb24gZm9yIHRoZSBsaW5lIGNoYXJ0LgogICAgICAgICAqIFdoZW4gbm90IHByZXNzaW5nIGFsdC1rZXksIGl0IGJlaGF2ZXMgbGlrZSBEcmFnWm9vbUxheWVyIC0tIGRyYWdnaW5nIGEKICAgICAgICAgKiByZWdpb24gem9vbXMgdGhlIGFyZWEgdW5kZXIgdGhlIGdyYXkgYm94IGFuZCBkb3VibGUgY2xpY2tpbmcgcmVzZXRzIHRoZQogICAgICAgICAqIHpvb20uIFdoZW4gcHJlc3NpbmcgYWx0LWtleSwgaXQgbGV0cyB1c2VyIHBhbiBhcm91bmQgd2hpbGUgaGF2aW5nIG1vdXNlZG93bgogICAgICAgICAqIG9uIHRoZSBjaGFydCBhbmQgbGV0IHVzZXIgem9vbS1pbi9vdXQgb2YgY3Vyc29yIHdoZW4gc2Nyb2xsIHdpdGggYWx0IGtleQogICAgICAgICAqIHByZXNzZWQuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoeFNjYWxlLCB5U2NhbGUsIHVuem9vbU1ldGhvZCkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnN0YXRlID0gU3RhdGUuTk9ORTsKICAgICAgICAgICAgdGhpcy5wYW5TdGFydENhbGxiYWNrID0gbmV3IHNyYyQyLlV0aWxzLkNhbGxiYWNrU2V0KCk7CiAgICAgICAgICAgIHRoaXMucGFuRW5kQ2FsbGJhY2sgPSBuZXcgc3JjJDIuVXRpbHMuQ2FsbGJhY2tTZXQoKTsKICAgICAgICAgICAgdGhpcy5wYW5ab29tID0gbmV3IHNyYyQyLkludGVyYWN0aW9ucy5QYW5ab29tKHhTY2FsZSwgeVNjYWxlKTsKICAgICAgICAgICAgdGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKChldmVudCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIFBhblpvb21EcmFnTGF5ZXIuaXNQYW5LZXkoZXZlbnQpICYmIGV2ZW50LmJ1dHRvbiA9PT0gMDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMucGFuWm9vbS53aGVlbEZpbHRlcih0aGlzLmNhblNjcm9sbFpvb20pOwogICAgICAgICAgICB0aGlzLmRyYWdab29tTGF5ZXIgPSBuZXcgRHJhZ1pvb21MYXllcih4U2NhbGUsIHlTY2FsZSwgdW56b29tTWV0aG9kKTsKICAgICAgICAgICAgdGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm1vdXNlRmlsdGVyKChldmVudCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuICFQYW5ab29tRHJhZ0xheWVyLmlzUGFuS2V5KGV2ZW50KSAmJiBldmVudC5idXR0b24gPT09IDA7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmFwcGVuZCh0aGlzLmRyYWdab29tTGF5ZXIpOwogICAgICAgICAgICBjb25zdCBvbldoZWVsID0gdGhpcy5vbldoZWVsLmJpbmQodGhpcyk7CiAgICAgICAgICAgIHRoaXMub25BbmNob3IoKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbW91c2VEaXNwYXRjaGVyID0gc3JjJDIuRGlzcGF0Y2hlcnMuTW91c2UuZ2V0RGlzcGF0Y2hlcih0aGlzKTsKICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vbldoZWVsKG9uV2hlZWwpOwogICAgICAgICAgICAgICAgdGhpcy5wYW5ab29tLmF0dGFjaFRvKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5vbkRldGFjaCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnBhblpvb20uZGV0YWNoRnJvbSh0aGlzKTsKICAgICAgICAgICAgICAgIC8vIG9uRGV0YWNoIGNhbiBiZSBpbnZva2VkIGJlZm9yZSBvbkFuY2hvcgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX21vdXNlRGlzcGF0Y2hlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX21vdXNlRGlzcGF0Y2hlci5vZmZXaGVlbChvbldoZWVsKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb3VzZURpc3BhdGNoZXIgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5wYW5ab29tLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlID09IFN0YXRlLk5PTkUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShTdGF0ZS5QQU5OSU5HKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMucGFuWm9vbS5kcmFnSW50ZXJhY3Rpb24oKS5vbkRyYWdFbmQoKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gU3RhdGUuUEFOTklORykKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFN0YXRlKFN0YXRlLk5PTkUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ1N0YXJ0KCgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlID09IFN0YXRlLk5PTkUpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShTdGF0ZS5EUkFHX1pPT01JTkcpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5kcmFnWm9vbUxheWVyLmRyYWdJbnRlcmFjdGlvbigpLm9uRHJhZ0VuZCgoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PSBTdGF0ZS5EUkFHX1pPT01JTkcpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRTdGF0ZShTdGF0ZS5OT05FKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uV2hlZWwoXywgZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY2FuU2Nyb2xsWm9vbShldmVudCkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGhlbHBDb250YWluZXIgPSB0aGlzLmVsZW1lbnQoKTsKICAgICAgICAgICAgaWYgKCFoZWxwQ29udGFpbmVyLnNlbGVjdCgnLmhlbHAnKS5lbXB0eSgpKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBoZWxwID0gaGVscENvbnRhaW5lci5hcHBlbmQoJ2RpdicpLmNsYXNzZWQoJ2hlbHAnLCB0cnVlKTsKICAgICAgICAgICAgaGVscC5hcHBlbmQoJ3NwYW4nKS50ZXh0KCdBbHQgKyBTY3JvbGwgdG8gWm9vbScpOwogICAgICAgICAgICAvLyBQbGVhc2Ugc2VlIHZ6LXBhbi16b29tLXN0eWxlIGZvciB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgYW5pbWF0aW9uLgogICAgICAgICAgICBoZWxwLm9uKCdhbmltYXRpb25lbmQnLCAoKSA9PiB2b2lkIGhlbHAucmVtb3ZlKCkpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgaXNQYW5LZXkoZXZlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oZXZlbnQuYWx0S2V5KSB8fCBCb29sZWFuKGV2ZW50LnNoaWZ0S2V5KTsKICAgICAgICB9CiAgICAgICAgY2FuU2Nyb2xsWm9vbShldmVudCkgewogICAgICAgICAgICByZXR1cm4gZXZlbnQuYWx0S2V5OwogICAgICAgIH0KICAgICAgICBzZXRTdGF0ZShuZXh0U3RhdGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT0gbmV4dFN0YXRlKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBjb25zdCBwcmV2U3RhdGUgPSB0aGlzLnN0YXRlOwogICAgICAgICAgICB0aGlzLnN0YXRlID0gbmV4dFN0YXRlOwogICAgICAgICAgICB0aGlzLnJvb3QoKS5yZW1vdmVDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKHByZXZTdGF0ZSkpOwogICAgICAgICAgICB0aGlzLnJvb3QoKS5hZGRDbGFzcyh0aGlzLnN0YXRlQ2xhc3NOYW1lKG5leHRTdGF0ZSkpOwogICAgICAgICAgICBpZiAocHJldlN0YXRlID09IFN0YXRlLlBBTk5JTkcpIHsKICAgICAgICAgICAgICAgIHRoaXMucGFuRW5kQ2FsbGJhY2suY2FsbENhbGxiYWNrcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0U3RhdGUgPT0gU3RhdGUuUEFOTklORykgewogICAgICAgICAgICAgICAgdGhpcy5wYW5TdGFydENhbGxiYWNrLmNhbGxDYWxsYmFja3MoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzdGF0ZUNsYXNzTmFtZShzdGF0ZSkgewogICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFN0YXRlLlBBTk5JTkc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdwYW5uaW5nJzsKICAgICAgICAgICAgICAgIGNhc2UgU3RhdGUuRFJBR19aT09NSU5HOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZHJhZy16b29taW5nJzsKICAgICAgICAgICAgICAgIGNhc2UgU3RhdGUuTk9ORToKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9uUGFuU3RhcnQoY2IpIHsKICAgICAgICAgICAgdGhpcy5wYW5TdGFydENhbGxiYWNrLmFkZChjYik7CiAgICAgICAgfQogICAgICAgIG9uUGFuRW5kKGNiKSB7CiAgICAgICAgICAgIHRoaXMucGFuRW5kQ2FsbGJhY2suYWRkKGNiKTsKICAgICAgICB9CiAgICAgICAgb25TY3JvbGxab29tKGNiKSB7CiAgICAgICAgICAgIHRoaXMucGFuWm9vbS5vblpvb21FbmQoY2IpOwogICAgICAgIH0KICAgICAgICBvbkRyYWdab29tU3RhcnQoY2IpIHsKICAgICAgICAgICAgdGhpcy5kcmFnWm9vbUxheWVyLmludGVyYWN0aW9uU3RhcnQoY2IpOwogICAgICAgIH0KICAgICAgICBvbkRyYWdab29tRW5kKGNiKSB7CiAgICAgICAgICAgIHRoaXMuZHJhZ1pvb21MYXllci5pbnRlcmFjdGlvbkVuZChjYik7CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE4IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgdmFyIFRvb2x0aXBDb2x1bW5FdmFsVHlwZTsKICAgIChmdW5jdGlvbiAoVG9vbHRpcENvbHVtbkV2YWxUeXBlKSB7CiAgICAgICAgVG9vbHRpcENvbHVtbkV2YWxUeXBlW1Rvb2x0aXBDb2x1bW5FdmFsVHlwZVsiVEVYVCJdID0gMF0gPSAiVEVYVCI7CiAgICAgICAgVG9vbHRpcENvbHVtbkV2YWxUeXBlW1Rvb2x0aXBDb2x1bW5FdmFsVHlwZVsiRE9NIl0gPSAxXSA9ICJET00iOwogICAgfSkoVG9vbHRpcENvbHVtbkV2YWxUeXBlIHx8IChUb29sdGlwQ29sdW1uRXZhbFR5cGUgPSB7fSkpOwogICAgdmFyIFlTY2FsZVR5cGU7CiAgICAoZnVuY3Rpb24gKFlTY2FsZVR5cGUpIHsKICAgICAgICBZU2NhbGVUeXBlWyJMT0ciXSA9ICJsb2ciOwogICAgICAgIFlTY2FsZVR5cGVbIkxJTkVBUiJdID0gImxpbmVhciI7CiAgICB9KShZU2NhbGVUeXBlIHx8IChZU2NhbGVUeXBlID0ge30pKTsKICAgIC8qKgogICAgICogVGhlIG1heGltdW0gbnVtYmVyIG9mIG1hcmtlciBzeW1ib2xzIHdpdGhpbiBhbnkgbGluZSBmb3IgYSBkYXRhIHNlcmllcy4gVG9vCiAgICAgKiBtYW55IG1hcmtlcnMgY2x1dHRlciB0aGUgY2hhcnQuCiAgICAgKi8KICAgIGNvbnN0IF9NQVhfTUFSS0VSUyA9IDIwOwogICAgY2xhc3MgTGluZUNoYXJ0IHsKICAgICAgICBjb25zdHJ1Y3Rvcih4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kLCB5VmFsdWVBY2Nlc3NvciwgeVNjYWxlVHlwZSwgY29sb3JTY2FsZSwgdG9vbHRpcCwgLy8gVnpDaGFydFRvb2x0aXAKICAgICAgICB0b29sdGlwQ29sdW1ucywgZmlsbEFyZWEsIGRlZmF1bHRYUmFuZ2UsIGRlZmF1bHRZUmFuZ2UsIHN5bWJvbEZ1bmN0aW9uLCB4QXhpc0Zvcm1hdHRlcikgewogICAgICAgICAgICB0aGlzLmRpcnR5RGF0YXNldHMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIHRoaXMuc2VyaWVzTmFtZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5uYW1lMmRhdGFzZXRzID0ge307CiAgICAgICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IGNvbG9yU2NhbGU7CiAgICAgICAgICAgIHRoaXMudG9vbHRpcCA9IHRvb2x0aXA7CiAgICAgICAgICAgIHRoaXMuZGF0YXNldHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5faWdub3JlWU91dGxpZXJzID0gZmFsc2U7CiAgICAgICAgICAgIC8vIGxhc3RQb2ludERhdGFzZXQgaXMgYSBkYXRhc2V0IHRoYXQgY29udGFpbnMganVzdCB0aGUgbGFzdCBwb2ludCBvZgogICAgICAgICAgICAvLyBldmVyeSBkYXRhc2V0IHdlJ3JlIGN1cnJlbnRseSBkcmF3aW5nLgogICAgICAgICAgICB0aGlzLmxhc3RQb2ludHNEYXRhc2V0ID0gbmV3IHNyYyQyLkRhdGFzZXQoKTsKICAgICAgICAgICAgdGhpcy5uYW5EYXRhc2V0ID0gbmV3IHNyYyQyLkRhdGFzZXQoKTsKICAgICAgICAgICAgdGhpcy55VmFsdWVBY2Nlc3NvciA9IHlWYWx1ZUFjY2Vzc29yOwogICAgICAgICAgICAvLyBUaGUgc3ltYm9sIGZ1bmN0aW9uIG1hcHMgc2VyaWVzIHRvIG1hcmtlci4gSXQgdXNlcyBhIHNwZWNpYWwgZGF0YXNldCB0aGF0CiAgICAgICAgICAgIC8vIHZhcmllcyBiYXNlZCBvbiB3aGV0aGVyIHNtb290aGluZyBpcyBlbmFibGVkLgogICAgICAgICAgICB0aGlzLnN5bWJvbEZ1bmN0aW9uID0gc3ltYm9sRnVuY3Rpb247CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRYUmFuZ2UgPSBkZWZhdWx0WFJhbmdlOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0WVJhbmdlID0gZGVmYXVsdFlSYW5nZTsKICAgICAgICAgICAgdGhpcy50b29sdGlwQ29sdW1ucyA9IHRvb2x0aXBDb2x1bW5zOwogICAgICAgICAgICB0aGlzLmJ1aWxkQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeVZhbHVlQWNjZXNzb3IsIHlTY2FsZVR5cGUsIGZpbGxBcmVhLCB4QXhpc0Zvcm1hdHRlcik7CiAgICAgICAgfQogICAgICAgIGJ1aWxkQ2hhcnQoeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCwgeVZhbHVlQWNjZXNzb3IsIHlTY2FsZVR5cGUsIGZpbGxBcmVhLCB4QXhpc0Zvcm1hdHRlcikgewogICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTsKICAgICAgICAgICAgY29uc3QgeENvbXBvbmVudHMgPSB4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kKCk7CiAgICAgICAgICAgIHRoaXMueEFjY2Vzc29yID0geENvbXBvbmVudHMuYWNjZXNzb3I7CiAgICAgICAgICAgIHRoaXMueFNjYWxlID0geENvbXBvbmVudHMuc2NhbGU7CiAgICAgICAgICAgIHRoaXMueEF4aXMgPSB4Q29tcG9uZW50cy5heGlzOwogICAgICAgICAgICB0aGlzLnhBeGlzLm1hcmdpbigwKS50aWNrTGFiZWxQYWRkaW5nKDMpOwogICAgICAgICAgICBpZiAoeEF4aXNGb3JtYXR0ZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMueEF4aXMuZm9ybWF0dGVyKHhBeGlzRm9ybWF0dGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnlTY2FsZSA9IExpbmVDaGFydC5nZXRZU2NhbGVGcm9tVHlwZSh5U2NhbGVUeXBlKTsKICAgICAgICAgICAgdGhpcy55U2NhbGUuc2V0VmFsdWVQcm92aWRlckZvckRvbWFpbigoKSA9PiB0aGlzLmdldFZhbHVlc0ZvcllBeGlzRG9tYWluQ29tcHV0ZSgpKTsKICAgICAgICAgICAgdGhpcy55QXhpcyA9IG5ldyBzcmMkMi5BeGVzLk51bWVyaWModGhpcy55U2NhbGUsICdsZWZ0Jyk7CiAgICAgICAgICAgIGxldCB5Rm9ybWF0dGVyID0gbXVsdGlzY2FsZUZvcm1hdHRlcihZX0FYSVNfRk9STUFUVEVSX1BSRUNJU0lPTik7CiAgICAgICAgICAgIHRoaXMueUF4aXMubWFyZ2luKDApCiAgICAgICAgICAgICAgICAudGlja0xhYmVsUGFkZGluZyg1KQogICAgICAgICAgICAgICAgLmZvcm1hdHRlcih5Rm9ybWF0dGVyKTsKICAgICAgICAgICAgdGhpcy55QXhpcy51c2VzVGV4dFdpZHRoQXBwcm94aW1hdGlvbih0cnVlKTsKICAgICAgICAgICAgdGhpcy5maWxsQXJlYSA9IGZpbGxBcmVhOwogICAgICAgICAgICBjb25zdCBwYW5ab29tTGF5ZXIgPSBuZXcgUGFuWm9vbURyYWdMYXllcih0aGlzLnhTY2FsZSwgdGhpcy55U2NhbGUsICgpID0+IHRoaXMucmVzZXREb21haW4oKSk7CiAgICAgICAgICAgIHRoaXMudG9vbHRpcEludGVyYWN0aW9uID0gdGhpcy5jcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24ocGFuWm9vbUxheWVyKTsKICAgICAgICAgICAgdGhpcy50b29sdGlwUG9pbnRzQ29tcG9uZW50ID0gbmV3IHNyYyQyLkNvbXBvbmVudCgpOwogICAgICAgICAgICBjb25zdCBwbG90ID0gdGhpcy5idWlsZFBsb3QodGhpcy54U2NhbGUsIHRoaXMueVNjYWxlLCBmaWxsQXJlYSk7CiAgICAgICAgICAgIHRoaXMuZ3JpZGxpbmVzID0gbmV3IHNyYyQyLkNvbXBvbmVudHMuR3JpZGxpbmVzKHRoaXMueFNjYWxlLCB0aGlzLnlTY2FsZSk7CiAgICAgICAgICAgIGxldCB4WmVyb0xpbmUgPSBudWxsOwogICAgICAgICAgICBpZiAoeVNjYWxlVHlwZSAhPT0gWVNjYWxlVHlwZS5MT0cpIHsKICAgICAgICAgICAgICAgIHhaZXJvTGluZSA9IG5ldyBzcmMkMi5Db21wb25lbnRzLkd1aWRlTGluZUxheWVyKCdob3Jpem9udGFsJyk7CiAgICAgICAgICAgICAgICB4WmVyb0xpbmUuc2NhbGUodGhpcy55U2NhbGUpLnZhbHVlKDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB5WmVyb0xpbmUgPSBuZXcgc3JjJDIuQ29tcG9uZW50cy5HdWlkZUxpbmVMYXllcigndmVydGljYWwnKTsKICAgICAgICAgICAgeVplcm9MaW5lLnNjYWxlKHRoaXMueFNjYWxlKS52YWx1ZSgwKTsKICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSBuZXcgc3JjJDIuQ29tcG9uZW50cy5Hcm91cChbCiAgICAgICAgICAgICAgICB0aGlzLmdyaWRsaW5lcywKICAgICAgICAgICAgICAgIHhaZXJvTGluZSwKICAgICAgICAgICAgICAgIHlaZXJvTGluZSwKICAgICAgICAgICAgICAgIHBsb3QsCiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBQb2ludHNDb21wb25lbnQsCiAgICAgICAgICAgICAgICBwYW5ab29tTGF5ZXIsCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aGlzLmNlbnRlci5hZGRDbGFzcygnbWFpbicpOwogICAgICAgICAgICB0aGlzLm91dGVyID0gbmV3IHNyYyQyLkNvbXBvbmVudHMuVGFibGUoWwogICAgICAgICAgICAgICAgW3RoaXMueUF4aXMsIHRoaXMuY2VudGVyXSwKICAgICAgICAgICAgICAgIFtudWxsLCB0aGlzLnhBeGlzXSwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgIGJ1aWxkUGxvdCh4U2NhbGUsIHlTY2FsZSwgZmlsbEFyZWEpIHsKICAgICAgICAgICAgaWYgKGZpbGxBcmVhKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkFyZWFQbG90ID0gbmV3IHNyYyQyLlBsb3RzLkFyZWEoKTsKICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luQXJlYVBsb3QueCh0aGlzLnhBY2Nlc3NvciwgeFNjYWxlKTsKICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luQXJlYVBsb3QueShmaWxsQXJlYS5oaWdoZXJBY2Nlc3NvciwgeVNjYWxlKTsKICAgICAgICAgICAgICAgIHRoaXMubWFyZ2luQXJlYVBsb3QueTAoZmlsbEFyZWEubG93ZXJBY2Nlc3Nvcik7CiAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoJ2ZpbGwnLCAoZCwgaSwgZGF0YXNldCkgPT4gdGhpcy5jb2xvclNjYWxlLnNjYWxlKGRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7CiAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoJ2ZpbGwtb3BhY2l0eScsIDAuMyk7CiAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkFyZWFQbG90LmF0dHIoJ3N0cm9rZS13aWR0aCcsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc21vb3RoZWRBY2Nlc3NvciA9IChkKSA9PiBkLnNtb290aGVkOwogICAgICAgICAgICBsZXQgbGluZVBsb3QgPSBuZXcgc3JjJDIuUGxvdHMuTGluZSgpOwogICAgICAgICAgICBsaW5lUGxvdC54KHRoaXMueEFjY2Vzc29yLCB4U2NhbGUpOwogICAgICAgICAgICBsaW5lUGxvdC55KHRoaXMueVZhbHVlQWNjZXNzb3IsIHlTY2FsZSk7CiAgICAgICAgICAgIGxpbmVQbG90LmF0dHIoJ3N0cm9rZScsIChkLCBpLCBkYXRhc2V0KSA9PiB0aGlzLmNvbG9yU2NhbGUuc2NhbGUoZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUpKTsKICAgICAgICAgICAgdGhpcy5saW5lUGxvdCA9IGxpbmVQbG90OwogICAgICAgICAgICB0aGlzLnNldHVwVG9vbHRpcHMobGluZVBsb3QpOwogICAgICAgICAgICBsZXQgc21vb3RoTGluZVBsb3QgPSBuZXcgc3JjJDIuUGxvdHMuTGluZSgpOwogICAgICAgICAgICBzbW9vdGhMaW5lUGxvdC54KHRoaXMueEFjY2Vzc29yLCB4U2NhbGUpOwogICAgICAgICAgICBzbW9vdGhMaW5lUGxvdC55KHRoaXMuc21vb3RoZWRBY2Nlc3NvciwgeVNjYWxlKTsKICAgICAgICAgICAgc21vb3RoTGluZVBsb3QuYXR0cignc3Ryb2tlJywgKGQsIGksIGRhdGFzZXQpID0+IHRoaXMuY29sb3JTY2FsZS5zY2FsZShkYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwogICAgICAgICAgICB0aGlzLnNtb290aExpbmVQbG90ID0gc21vb3RoTGluZVBsb3Q7CiAgICAgICAgICAgIGlmICh0aGlzLnN5bWJvbEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJzU2NhdHRlclBsb3QgPSBuZXcgc3JjJDIuUGxvdHMuU2NhdHRlcigpOwogICAgICAgICAgICAgICAgbWFya2Vyc1NjYXR0ZXJQbG90LngodGhpcy54QWNjZXNzb3IsIHhTY2FsZSk7CiAgICAgICAgICAgICAgICBtYXJrZXJzU2NhdHRlclBsb3QueSh0aGlzLnlWYWx1ZUFjY2Vzc29yLCB5U2NhbGUpOwogICAgICAgICAgICAgICAgbWFya2Vyc1NjYXR0ZXJQbG90LmF0dHIoJ2ZpbGwnLCAoZCwgaSwgZGF0YXNldCkgPT4gdGhpcy5jb2xvclNjYWxlLnNjYWxlKGRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7CiAgICAgICAgICAgICAgICBtYXJrZXJzU2NhdHRlclBsb3QuYXR0cignb3BhY2l0eScsIDEpOwogICAgICAgICAgICAgICAgbWFya2Vyc1NjYXR0ZXJQbG90LnNpemUoVE9PTFRJUF9DSVJDTEVfU0laRSAqIDIpOwogICAgICAgICAgICAgICAgbWFya2Vyc1NjYXR0ZXJQbG90LnN5bWJvbCgoZCwgaSwgZGF0YXNldCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN5bWJvbEZ1bmN0aW9uKGRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gVXNlIGEgc3BlY2lhbCBkYXRhc2V0IGJlY2F1c2UgdGhpcyBzY2F0dGVyIHBsb3Qgc2hvdWxkIHVzZSB0aGUgYWNjZXNvcgogICAgICAgICAgICAgICAgLy8gdGhhdCBkZXBlbmRzIG9uIHdoZXRoZXIgc21vb3RoaW5nIGlzIGVuYWJsZWQuCiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCA9IG1hcmtlcnNTY2F0dGVyUGxvdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgc2NhdHRlclBsb3Qgd2lsbCBkaXNwbGF5IHRoZSBsYXN0IHBvaW50IGZvciBlYWNoIGRhdGFzZXQuCiAgICAgICAgICAgIC8vIFRoaXMgd2F5LCBpZiB0aGVyZSBpcyBvbmx5IG9uZSBkYXR1bSBmb3IgdGhlIHNlcmllcywgaXQgaXMgc3RpbGwKICAgICAgICAgICAgLy8gdmlzaWJsZS4gV2UgaGlkZSBpdCB3aGVuIHRvb2x0aXBzIGFyZSBhY3RpdmUgdG8ga2VlcCB0aGluZ3MgY2xlYW4uCiAgICAgICAgICAgIGxldCBzY2F0dGVyUGxvdCA9IG5ldyBzcmMkMi5QbG90cy5TY2F0dGVyKCk7CiAgICAgICAgICAgIHNjYXR0ZXJQbG90LngodGhpcy54QWNjZXNzb3IsIHhTY2FsZSk7CiAgICAgICAgICAgIHNjYXR0ZXJQbG90LnkodGhpcy55VmFsdWVBY2Nlc3NvciwgeVNjYWxlKTsKICAgICAgICAgICAgc2NhdHRlclBsb3QuYXR0cignZmlsbCcsIChkKSA9PiB0aGlzLmNvbG9yU2NhbGUuc2NhbGUoZC5uYW1lKSk7CiAgICAgICAgICAgIHNjYXR0ZXJQbG90LmF0dHIoJ29wYWNpdHknLCAxKTsKICAgICAgICAgICAgc2NhdHRlclBsb3Quc2l6ZShUT09MVElQX0NJUkNMRV9TSVpFICogMik7CiAgICAgICAgICAgIHNjYXR0ZXJQbG90LmRhdGFzZXRzKFt0aGlzLmxhc3RQb2ludHNEYXRhc2V0XSk7CiAgICAgICAgICAgIHRoaXMuc2NhdHRlclBsb3QgPSBzY2F0dGVyUGxvdDsKICAgICAgICAgICAgbGV0IG5hbkRpc3BsYXkgPSBuZXcgc3JjJDIuUGxvdHMuU2NhdHRlcigpOwogICAgICAgICAgICBuYW5EaXNwbGF5LngodGhpcy54QWNjZXNzb3IsIHhTY2FsZSk7CiAgICAgICAgICAgIG5hbkRpc3BsYXkueSgoeCkgPT4geC5kaXNwbGF5WSwgeVNjYWxlKTsKICAgICAgICAgICAgbmFuRGlzcGxheS5hdHRyKCdmaWxsJywgKGQpID0+IHRoaXMuY29sb3JTY2FsZS5zY2FsZShkLm5hbWUpKTsKICAgICAgICAgICAgbmFuRGlzcGxheS5hdHRyKCdvcGFjaXR5JywgMSk7CiAgICAgICAgICAgIG5hbkRpc3BsYXkuc2l6ZShOQU5fU1lNQk9MX1NJWkUgKiAyKTsKICAgICAgICAgICAgbmFuRGlzcGxheS5kYXRhc2V0cyhbdGhpcy5uYW5EYXRhc2V0XSk7CiAgICAgICAgICAgIG5hbkRpc3BsYXkuc3ltYm9sKHNyYyQyLlN5bWJvbEZhY3Rvcmllcy50cmlhbmdsZSk7CiAgICAgICAgICAgIHRoaXMubmFuRGlzcGxheSA9IG5hbkRpc3BsYXk7CiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IFtuYW5EaXNwbGF5LCBzY2F0dGVyUGxvdCwgc21vb3RoTGluZVBsb3QsIGxpbmVQbG90XTsKICAgICAgICAgICAgaWYgKHRoaXMubWFyZ2luQXJlYVBsb3QpIHsKICAgICAgICAgICAgICAgIGdyb3Vwcy5wdXNoKHRoaXMubWFyZ2luQXJlYVBsb3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdCkgewogICAgICAgICAgICAgICAgZ3JvdXBzLnB1c2godGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgc3JjJDIuQ29tcG9uZW50cy5Hcm91cChncm91cHMpOwogICAgICAgIH0KICAgICAgICBpZ25vcmVZT3V0bGllcnMoaWdub3JlWU91dGxpZXJzKSB7CiAgICAgICAgICAgIGlmIChpZ25vcmVZT3V0bGllcnMgIT09IHRoaXMuX2lnbm9yZVlPdXRsaWVycykgewogICAgICAgICAgICAgICAgdGhpcy5faWdub3JlWU91dGxpZXJzID0gaWdub3JlWU91dGxpZXJzOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKTsKICAgICAgICAgICAgICAgIHRoaXMueVNjYWxlLmlnbm9yZU91dGxpZXIoaWdub3JlWU91dGxpZXJzKTsKICAgICAgICAgICAgICAgIHRoaXMucmVzZXRZRG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2V0VmFsdWVzRm9yWUF4aXNEb21haW5Db21wdXRlKCkgewogICAgICAgICAgICBjb25zdCBhY2Nlc3NvcnMgPSB0aGlzLmdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpOwogICAgICAgICAgICBsZXQgZGF0YXNldFRvVmFsdWVzID0gKGQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBhY2Nlc3NvcnMubWFwKChhY2Nlc3NvcikgPT4gZC5kYXRhKCkubWFwKCh4KSA9PiBhY2Nlc3Nvcih4LCAtMSwgZCkpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGxvZGFzaC5mbGF0dGVuRGVlcCh0aGlzLmRhdGFzZXRzLm1hcChkYXRhc2V0VG9WYWx1ZXMpKS5maWx0ZXIoaXNGaW5pdGUpOwogICAgICAgIH0KICAgICAgICAvKiogQ29uc3RydWN0cyBzcGVjaWFsIGRhdGFzZXRzLiBFYWNoIHNwZWNpYWwgZGF0YXNldCBjb250YWlucyBleGNlcHRpb25hbAogICAgICAgICAqIHZhbHVlcyBmcm9tIGFsbCBvZiB0aGUgcmVndWxhciBkYXRhc2V0cywgZS5nLiBsYXN0IHBvaW50cyBpbiBzZXJpZXMsIG9yCiAgICAgICAgICogTmFOIHZhbHVlcy4gVGhvc2UgcG9pbnRzIHdpbGwgaGF2ZSBhIGBuYW1lYCBhbmQgYHJlbGF0aXZlYCBwcm9wZXJ0eSBhZGRlZAogICAgICAgICAqIChzaW5jZSB1c3VhbGx5IHRob3NlIGFyZSBjb250ZXh0IGluIHRoZSBzdXJyb3VuZGluZyBkYXRhc2V0KS4KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVTcGVjaWFsRGF0YXNldHMoKSB7CiAgICAgICAgICAgIGNvbnN0IGFjY2Vzc29yID0gdGhpcy5nZXRZQXhpc0FjY2Vzc29yKCk7CiAgICAgICAgICAgIGxldCBsYXN0UG9pbnRzRGF0YSA9IHRoaXMuZGF0YXNldHMKICAgICAgICAgICAgICAgIC5tYXAoKGQpID0+IHsKICAgICAgICAgICAgICAgIGxldCBkYXR1bSA9IG51bGw7CiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IE5hTnMgdG8gZW5zdXJlIGxhc3QgcG9pbnQgaXMgYSBjbGVhbiBvbmUKICAgICAgICAgICAgICAgIGxldCBub25OYW5EYXRhID0gZC5kYXRhKCkuZmlsdGVyKCh4KSA9PiAhaXNOYU4oYWNjZXNzb3IoeCwgLTEsIGQpKSk7CiAgICAgICAgICAgICAgICBpZiAobm9uTmFuRGF0YS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGlkeCA9IG5vbk5hbkRhdGEubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgICAgICBkYXR1bSA9IG5vbk5hbkRhdGFbaWR4XTsKICAgICAgICAgICAgICAgICAgICBkYXR1bS5uYW1lID0gZC5tZXRhZGF0YSgpLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgZGF0dW0ucmVsYXRpdmUgPSByZWxhdGl2ZUFjY2Vzc29yKGRhdHVtLCAtMSwgZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0dW07CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuZmlsdGVyKCh4KSA9PiB4ICE9IG51bGwpOwogICAgICAgICAgICB0aGlzLmxhc3RQb2ludHNEYXRhc2V0LmRhdGEobGFzdFBvaW50c0RhdGEpOwogICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpIHsKICAgICAgICAgICAgICAgIHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90LmRhdGFzZXRzKHRoaXMuZGF0YXNldHMubWFwKHRoaXMuY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGFrZSBhIGRhdGFzZXQsIHJldHVybiBhbiBhcnJheSBvZiBOYU4gZGF0YSBwb2ludHMKICAgICAgICAgICAgLy8gdGhlIE5hTiBwb2ludHMgd2lsbCBoYXZlIGEgImRpc3BsYXlZIiBwcm9wZXJ0eSB3aGljaCBpcyB0aGUKICAgICAgICAgICAgLy8geS12YWx1ZSBvZiBhIG5lYXJieSBwb2ludCB0aGF0IHdhcyBub3QgTmFOICgwIGlmIGFsbCBwb2ludHMgYXJlIE5hTikKICAgICAgICAgICAgbGV0IGRhdGFzZXRUb05hTkRhdGEgPSAoZCkgPT4gewogICAgICAgICAgICAgICAgbGV0IGRpc3BsYXlZID0gbnVsbDsKICAgICAgICAgICAgICAgIGxldCBkYXRhID0gZC5kYXRhKCk7CiAgICAgICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgICAgICB3aGlsZSAoaSA8IGRhdGEubGVuZ3RoICYmIGRpc3BsYXlZID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzTmFOKGFjY2Vzc29yKGRhdGFbaV0sIC0xLCBkKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheVkgPSBhY2Nlc3NvcihkYXRhW2ldLCAtMSwgZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5WSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVkgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IG5hbkRhdGEgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc05hTihhY2Nlc3NvcihkYXRhW2ldLCAtMSwgZCkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRpc3BsYXlZID0gYWNjZXNzb3IoZGF0YVtpXSwgLTEsIGQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5uYW1lID0gZC5tZXRhZGF0YSgpLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaV0uZGlzcGxheVkgPSBkaXNwbGF5WTsKICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVtpXS5yZWxhdGl2ZSA9IHJlbGF0aXZlQWNjZXNzb3IoZGF0YVtpXSwgLTEsIGQpOwogICAgICAgICAgICAgICAgICAgICAgICBuYW5EYXRhLnB1c2goZGF0YVtpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5hbkRhdGE7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGxldCBuYW5EYXRhID0gbG9kYXNoLmZsYXR0ZW4odGhpcy5kYXRhc2V0cy5tYXAoZGF0YXNldFRvTmFORGF0YSkpOwogICAgICAgICAgICB0aGlzLm5hbkRhdGFzZXQuZGF0YShuYW5EYXRhKTsKICAgICAgICB9CiAgICAgICAgcmVzZXREb21haW4oKSB7CiAgICAgICAgICAgIHRoaXMucmVzZXRYRG9tYWluKCk7CiAgICAgICAgICAgIHRoaXMucmVzZXRZRG9tYWluKCk7CiAgICAgICAgfQogICAgICAgIHJlc2V0WERvbWFpbigpIHsKICAgICAgICAgICAgbGV0IHhEb21haW47CiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZhdWx0WFJhbmdlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIuCiAgICAgICAgICAgICAgICB4RG9tYWluID0gdGhpcy5fZGVmYXVsdFhSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIChDb3BpZWQgZnJvbSB2el9saW5lX2NoYXJ0LkRyYWdab29tTGF5ZXIudW56b29tLikKICAgICAgICAgICAgICAgIGNvbnN0IHhTY2FsZSA9IHRoaXMueFNjYWxlOwogICAgICAgICAgICAgICAgeFNjYWxlLl9kb21haW5NaW4gPSBudWxsOwogICAgICAgICAgICAgICAgeFNjYWxlLl9kb21haW5NYXggPSBudWxsOwogICAgICAgICAgICAgICAgeERvbWFpbiA9IHhTY2FsZS5fZ2V0RXh0ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy54U2NhbGUuZG9tYWluKHhEb21haW4pOwogICAgICAgIH0KICAgICAgICByZXNldFlEb21haW4oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZhdWx0WVJhbmdlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgcmFuZ2Ugc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIuCiAgICAgICAgICAgICAgICB0aGlzLnlTY2FsZS5kb21haW4odGhpcy5fZGVmYXVsdFlSYW5nZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUZlNjYWxlIGhhcyBhbGwgdGhlIGxvZ2ljcyBmb3Igc2NhbGluZyBhbmQgd2UgbWFudWFsbHkgdHJpZ2dlciBpdCB3aXRoCiAgICAgICAgICAgICAgICAvLyBgYXV0b0RvbWFpbmAuIEhvd2V2ZXIsIHRoaXMgZW5hYmxlcyB0aGUgYXV0b0RvbWFpbiBtb2RlIHdoaWNoIHVwZGF0ZXMKICAgICAgICAgICAgICAgIC8vIHRoZSBkb21haW4gb24gYW55IGRhdGFzZXQgY2hhbmdlIGFuZCB0aGlzIGlzIG5vdCBkZXNpcmFibHkgZXNwZWNpYWxseQogICAgICAgICAgICAgICAgLy8gd2hlbiBhIHJ1biBpcyBub3QgZmluaXNoZWQgeWV0OyB3ZSBkb24ndCB3YW50IHRoZSBncmFwaCB0byBjaGFuZ2UgaW4KICAgICAgICAgICAgICAgIC8vIHNjYWxlIHdoaWxlIHVzZXIgaXMgaW5zcGVjdGluZyB0aGUgZ3JhcGguIEJ5IHNldHRpbmcgdGhlIGBkb21haW5gCiAgICAgICAgICAgICAgICAvLyBleHBsaWNpdGx5LCB3ZSBjYW4gdHVybiB0aGUgZmVhdHVyZSBvZmYuCiAgICAgICAgICAgICAgICB0aGlzLnlTY2FsZS5hdXRvRG9tYWluKCk7CiAgICAgICAgICAgICAgICB0aGlzLnlTY2FsZS5kb21haW4odGhpcy55U2NhbGUuZG9tYWluKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldEFjY2Vzc29yc0ZvckNvbXB1dGluZ1lSYW5nZSgpIHsKICAgICAgICAgICAgY29uc3QgYWNjZXNzb3JzID0gW3RoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpXTsKICAgICAgICAgICAgaWYgKHRoaXMuZmlsbEFyZWEpIHsKICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIFkgZG9tYWluIHRha2UgbWFyZ2lucyBpbnRvIGFjY291bnQuCiAgICAgICAgICAgICAgICBhY2Nlc3NvcnMucHVzaCh0aGlzLmZpbGxBcmVhLmxvd2VyQWNjZXNzb3IsIHRoaXMuZmlsbEFyZWEuaGlnaGVyQWNjZXNzb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhY2Nlc3NvcnM7CiAgICAgICAgfQogICAgICAgIGdldFlBeGlzQWNjZXNzb3IoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNtb290aGluZ0VuYWJsZWQgPyB0aGlzLnNtb290aGVkQWNjZXNzb3IgOiB0aGlzLnlWYWx1ZUFjY2Vzc29yOwogICAgICAgIH0KICAgICAgICBjcmVhdGVUb29sdGlwSW50ZXJhY3Rpb24ocHpkbCkgewogICAgICAgICAgICBjb25zdCBwaSA9IG5ldyBQb2ludGVySW50ZXJhY3Rpb24oKTsKICAgICAgICAgICAgLy8gRGlzYWJsZSBpbnRlcmFjdGlvbiB3aGlsZSBkcmFnIHpvb21pbmcuCiAgICAgICAgICAgIGNvbnN0IGRpc2FibGVUb29sdGlwVXBkYXRlID0gKCkgPT4gewogICAgICAgICAgICAgICAgcGkuZW5hYmxlZChmYWxzZSk7CiAgICAgICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwcygpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBjb25zdCBlbmFibGVUb29sdGlwVXBkYXRlID0gKCkgPT4gcGkuZW5hYmxlZCh0cnVlKTsKICAgICAgICAgICAgcHpkbC5vblBhblN0YXJ0KGRpc2FibGVUb29sdGlwVXBkYXRlKTsKICAgICAgICAgICAgcHpkbC5vbkRyYWdab29tU3RhcnQoZGlzYWJsZVRvb2x0aXBVcGRhdGUpOwogICAgICAgICAgICBwemRsLm9uUGFuRW5kKGVuYWJsZVRvb2x0aXBVcGRhdGUpOwogICAgICAgICAgICBwemRsLm9uRHJhZ1pvb21FbmQoZW5hYmxlVG9vbHRpcFVwZGF0ZSk7CiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgd2hlZWwsIGN1cnNvciBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UuIFJlZHJhdyB0aGUgdG9vbHRpcAogICAgICAgICAgICAvLyB1c2luZyB0aGUgbGFzdCBrbm93biBtb3VzZSBwb3NpdGlvbi4KICAgICAgICAgICAgcHpkbC5vblNjcm9sbFpvb20oKCkgPT4gdGhpcy51cGRhdGVUb29sdGlwQ29udGVudCh0aGlzLl9sYXN0TW91c2VQb3NpdGlvbikpOwogICAgICAgICAgICBwaS5vblBvaW50ZXJNb3ZlKChwKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0TW91c2VQb3NpdGlvbiA9IHA7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVRvb2x0aXBDb250ZW50KHApOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGkub25Qb2ludGVyRXhpdCgoKSA9PiB0aGlzLmhpZGVUb29sdGlwcygpKTsKICAgICAgICAgICAgcmV0dXJuIHBpOwogICAgICAgIH0KICAgICAgICB1cGRhdGVUb29sdGlwQ29udGVudChwKSB7CiAgICAgICAgICAgIC8vIExpbmUgcGxvdCBtdXN0IGJlIGluaXRpYWxpemVkIHRvIGRyYXcuCiAgICAgICAgICAgIGlmICghdGhpcy5saW5lUGxvdCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSk7CiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBVcGRhdGVBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHRhcmdldCA9IHsKICAgICAgICAgICAgICAgICAgICB4OiBwLngsCiAgICAgICAgICAgICAgICAgICAgeTogcC55LAogICAgICAgICAgICAgICAgICAgIGRhdHVtOiBudWxsLAogICAgICAgICAgICAgICAgICAgIGRhdGFzZXQ6IG51bGwsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgbGV0IGJib3ggPSB0aGlzLmdyaWRsaW5lcy5jb250ZW50KCkubm9kZSgpLmdldEJCb3goKTsKICAgICAgICAgICAgICAgIC8vIHB0cyBpcyB0aGUgY2xvc2V0cyBwb2ludCB0byB0aGUgdG9vbHRpcCBmb3IgZWFjaCBkYXRhc2V0CiAgICAgICAgICAgICAgICBsZXQgcHRzID0gdGhpcy5saW5lUGxvdAogICAgICAgICAgICAgICAgICAgIC5kYXRhc2V0cygpCiAgICAgICAgICAgICAgICAgICAgLm1hcCgoZGF0YXNldCkgPT4gdGhpcy5maW5kQ2xvc2VzdFBvaW50KHRhcmdldCwgZGF0YXNldCkpCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKTsKICAgICAgICAgICAgICAgIGxldCBpbnRlcnNlY3RzQkJveCA9IHNyYyQyLlV0aWxzLkRPTS5pbnRlcnNlY3RzQkJveDsKICAgICAgICAgICAgICAgIC8vIFdlIGRyYXcgdG9vbHRpcHMgZm9yIHBvaW50cyB0aGF0IGFyZSBOYU4sIG9yIGFyZSBjdXJyZW50bHkgdmlzaWJsZQogICAgICAgICAgICAgICAgbGV0IHB0c0ZvclRvb2x0aXBzID0gcHRzLmZpbHRlcigocCkgPT4gaW50ZXJzZWN0c0JCb3gocC54LCBwLnksIGJib3gpIHx8CiAgICAgICAgICAgICAgICAgICAgaXNOYU4odGhpcy55VmFsdWVBY2Nlc3NvcihwLmRhdHVtLCAwLCBwLmRhdGFzZXQpKSk7CiAgICAgICAgICAgICAgICAvLyBPbmx5IGRyYXcgbGl0dGxlIGluZGljYXRvciBjaXJjbGVzIGZvciB0aGUgbm9uLU5hTiBwb2ludHMKICAgICAgICAgICAgICAgIGxldCBwdHNUb0NpcmNsZSA9IHB0c0ZvclRvb2x0aXBzLmZpbHRlcigocCkgPT4gIWlzTmFOKHRoaXMueVZhbHVlQWNjZXNzb3IocC5kYXR1bSwgMCwgcC5kYXRhc2V0KSkpOwogICAgICAgICAgICAgICAgaWYgKHB0cy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNjYXR0ZXJQbG90LmF0dHIoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHB0c1NlbGVjdGlvbiA9IHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudAogICAgICAgICAgICAgICAgICAgICAgICAuY29udGVudCgpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy5wb2ludCcpCiAgICAgICAgICAgICAgICAgICAgICAgIC5kYXRhKHB0c1RvQ2lyY2xlLCAocCkgPT4gcC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgcHRzU2VsZWN0aW9uLmVudGVyKCkuYXBwZW5kKCdjaXJjbGUnKS5jbGFzc2VkKCdwb2ludCcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIHB0c1NlbGVjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cigncicsIFRPT0xUSVBfQ0lSQ0xFX1NJWkUpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeCcsIChwKSA9PiBwLngpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIChwKSA9PiBwLnkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgJ25vbmUnKQogICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsIChwKSA9PiB0aGlzLmNvbG9yU2NhbGUuc2NhbGUocC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwogICAgICAgICAgICAgICAgICAgIHB0c1NlbGVjdGlvbi5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VG9vbHRpcHMocHRzRm9yVG9vbHRpcHMsIHRhcmdldCwgdGhpcy50b29sdGlwQ29sdW1ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVUb29sdGlwcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgaGlkZVRvb2x0aXBzKCkgewogICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fdG9vbHRpcFVwZGF0ZUFuaW1hdGlvbkZyYW1lKTsKICAgICAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTsKICAgICAgICAgICAgdGhpcy5zY2F0dGVyUGxvdC5hdHRyKCdkaXNwbGF5JywgJ2Jsb2NrJyk7CiAgICAgICAgICAgIHRoaXMudG9vbHRpcFBvaW50c0NvbXBvbmVudC5jb250ZW50KCkuc2VsZWN0QWxsKCcucG9pbnQnKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgc2V0dXBUb29sdGlwcyhwbG90KSB7CiAgICAgICAgICAgIHBsb3Qub25EZXRhY2goKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwSW50ZXJhY3Rpb24uZGV0YWNoRnJvbShwbG90KTsKICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQoZmFsc2UpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcGxvdC5vbkFuY2hvcigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnRvb2x0aXBJbnRlcmFjdGlvbi5hdHRhY2hUbyhwbG90KTsKICAgICAgICAgICAgICAgIHRoaXMudG9vbHRpcEludGVyYWN0aW9uLmVuYWJsZWQodHJ1ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBkcmF3VG9vbHRpcHMocG9pbnRzLCB0YXJnZXQsIHRvb2x0aXBDb2x1bW5zKSB7CiAgICAgICAgICAgIGlmICghcG9pbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhpcy50b29sdGlwLmhpZGUoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB7IGNvbG9yU2NhbGUgfSA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IHN3YXRjaENvbCA9IHsKICAgICAgICAgICAgICAgIHRpdGxlOiAnJywKICAgICAgICAgICAgICAgIHN0YXRpYzogZmFsc2UsCiAgICAgICAgICAgICAgICBldmFsVHlwZTogVG9vbHRpcENvbHVtbkV2YWxUeXBlLkRPTSwKICAgICAgICAgICAgICAgIGV2YWx1YXRlKGQpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnc3BhbicpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnYmFja2dyb3VuZC1jb2xvcicsICgpID0+IGNvbG9yU2NhbGUuc2NhbGUoZC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBlbnRlcihkKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3NwYW4nKQogICAgICAgICAgICAgICAgICAgICAgICAuY2xhc3NlZCgnc3dhdGNoJywgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdiYWNrZ3JvdW5kLWNvbG9yJywgKCkgPT4gY29sb3JTY2FsZS5zY2FsZShkLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lKSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgICAgICB0b29sdGlwQ29sdW1ucyA9IFtzd2F0Y2hDb2wsIC4uLnRvb2x0aXBDb2x1bW5zXTsKICAgICAgICAgICAgY29uc3QgZGlzdCA9IChwKSA9PiBNYXRoLnBvdyhwLnggLSB0YXJnZXQueCwgMikgKyBNYXRoLnBvdyhwLnkgLSB0YXJnZXQueSwgMik7CiAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3REaXN0ID0gbG9kYXNoLm1pbihwb2ludHMubWFwKGRpc3QpKTsKICAgICAgICAgICAgY29uc3QgdmFsdWVTb3J0TWV0aG9kID0gdGhpcy5zbW9vdGhpbmdFbmFibGVkCiAgICAgICAgICAgICAgICA/IHRoaXMuc21vb3RoZWRBY2Nlc3NvcgogICAgICAgICAgICAgICAgOiB0aGlzLnlWYWx1ZUFjY2Vzc29yOwogICAgICAgICAgICBpZiAodGhpcy50b29sdGlwU29ydGluZ01ldGhvZCA9PT0gJ2FzY2VuZGluZycpIHsKICAgICAgICAgICAgICAgIHBvaW50cyA9IGxvZGFzaC5zb3J0QnkocG9pbnRzLCAoZCkgPT4gdmFsdWVTb3J0TWV0aG9kKGQuZGF0dW0sIC0xLCBkLmRhdGFzZXQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kID09PSAnZGVzY2VuZGluZycpIHsKICAgICAgICAgICAgICAgIHBvaW50cyA9IGxvZGFzaC5zb3J0QnkocG9pbnRzLCAoZCkgPT4gdmFsdWVTb3J0TWV0aG9kKGQuZGF0dW0sIC0xLCBkLmRhdGFzZXQpKS5yZXZlcnNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy50b29sdGlwU29ydGluZ01ldGhvZCA9PT0gJ25lYXJlc3QnKSB7CiAgICAgICAgICAgICAgICBwb2ludHMgPSBsb2Rhc2guc29ydEJ5KHBvaW50cywgZGlzdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgJ2RlZmF1bHQnIHNvcnRpbmcgbWV0aG9kIG1haW50YWlucyB0aGUgb3JkZXIgb2YgbmFtZXMgcGFzc2VkIHRvCiAgICAgICAgICAgICAgICAvLyBzZXRWaXNpYmxlU2VyaWVzKCkuIEhvd2V2ZXIgd2UgcmV2ZXJzZSB0aGF0IG9yZGVyIHdoZW4gZGVmaW5pbmcgdGhlCiAgICAgICAgICAgICAgICAvLyBkYXRhc2V0cy4gU28gd2UgbXVzdCBjYWxsIHJldmVyc2UgYWdhaW4gdG8gcmVzdG9yZSB0aGUgb3JkZXIuCiAgICAgICAgICAgICAgICBwb2ludHMgPSBwb2ludHMuc2xpY2UoMCkucmV2ZXJzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSB0aGlzOwogICAgICAgICAgICBjb25zdCB0YWJsZSA9IHNlbGVjdCh0aGlzLnRvb2x0aXAuY29udGVudCgpKS5zZWxlY3QoJ3RhYmxlJyk7CiAgICAgICAgICAgIGNvbnN0IGhlYWRlciA9IHRhYmxlCiAgICAgICAgICAgICAgICAuc2VsZWN0KCd0aGVhZCcpCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0aCcpCiAgICAgICAgICAgICAgICAuZGF0YSh0b29sdGlwQ29sdW1ucywgKGNvbHVtbiwgXywgX18pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4udGl0bGU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBoZWFkZXIKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0aCcpCiAgICAgICAgICAgICAgICAudGV4dCgoY29sKSA9PiBjb2wudGl0bGUpCiAgICAgICAgICAgICAgICAubm9kZXMoKTsKICAgICAgICAgICAgaGVhZGVyLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgY29uc3Qgcm93cyA9IHRhYmxlCiAgICAgICAgICAgICAgICAuc2VsZWN0KCd0Ym9keScpCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCd0cicpCiAgICAgICAgICAgICAgICAuZGF0YShwb2ludHMsIChwdCwgXywgX18pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBwdC5kYXRhc2V0Lm1ldGFkYXRhKCkubmFtZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJvd3MKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdkaXN0YW50JywgKGQpID0+IHsKICAgICAgICAgICAgICAgIC8vIEdyZXkgb3V0IHRoZSBwb2ludCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBhcmUgdHJ1ZToKICAgICAgICAgICAgICAgIC8vIC0gVGhlIGN1cnNvciBpcyBvdXRzaWRlIG9mIHRoZSB4LWV4dGVudCBvZiB0aGUgZGF0YXNldAogICAgICAgICAgICAgICAgLy8gLSBUaGUgcG9pbnQncyB5IHZhbHVlIGlzIE5hTgogICAgICAgICAgICAgICAgbGV0IGZpcnN0UG9pbnQgPSBkLmRhdGFzZXQuZGF0YSgpWzBdOwogICAgICAgICAgICAgICAgbGV0IGxhc3RQb2ludCA9IGxvZGFzaC5sYXN0KGQuZGF0YXNldC5kYXRhKCkpOwogICAgICAgICAgICAgICAgbGV0IGZpcnN0WCA9IHRoaXMueFNjYWxlLnNjYWxlKHRoaXMueEFjY2Vzc29yKGZpcnN0UG9pbnQsIDAsIGQuZGF0YXNldCkpOwogICAgICAgICAgICAgICAgbGV0IGxhc3RYID0gdGhpcy54U2NhbGUuc2NhbGUodGhpcy54QWNjZXNzb3IobGFzdFBvaW50LCAwLCBkLmRhdGFzZXQpKTsKICAgICAgICAgICAgICAgIGxldCBzID0gdGhpcy5zbW9vdGhpbmdFbmFibGVkCiAgICAgICAgICAgICAgICAgICAgPyBkLmRhdHVtLnNtb290aGVkCiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnlWYWx1ZUFjY2Vzc29yKGQuZGF0dW0sIDAsIGQuZGF0YXNldCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnggPCBmaXJzdFggfHwgdGFyZ2V0LnggPiBsYXN0WCB8fCBpc05hTihzKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdjbG9zZXN0JywgKHApID0+IGRpc3QocCkgPT09IGNsb3Nlc3REaXN0KQogICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgICAgICAgICBzZWxmLmRyYXdUb29sdGlwUm93KHRoaXMsIHRvb2x0aXBDb2x1bW5zLCBwb2ludCk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAvLyByZW9yZGVycyBET00gdG8gbWF0Y2ggdGhlIG9yZGVyaW5nIG9mIHRoZSBgZGF0YWAuCiAgICAgICAgICAgICAgICAub3JkZXIoKTsKICAgICAgICAgICAgcm93cy5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIHJvd3MKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0cicpCiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAocG9pbnQpIHsKICAgICAgICAgICAgICAgIHNlbGYuZHJhd1Rvb2x0aXBSb3codGhpcywgdG9vbHRpcENvbHVtbnMsIHBvaW50KTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5ub2RlcygpOwogICAgICAgICAgICB0aGlzLnRvb2x0aXAudXBkYXRlQW5kUG9zaXRpb24odGhpcy50YXJnZXRTVkcubm9kZSgpKTsKICAgICAgICB9CiAgICAgICAgZHJhd1Rvb2x0aXBSb3cocm93LCB0b29sdGlwQ29sdW1ucywgcG9pbnQpIHsKICAgICAgICAgICAgY29uc3Qgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBzZWxlY3Qocm93KS5zZWxlY3RBbGwoJ3RkJykuZGF0YSh0b29sdGlwQ29sdW1ucyk7CiAgICAgICAgICAgIGNvbHVtbnMuZWFjaChmdW5jdGlvbiAoY29sKSB7CiAgICAgICAgICAgICAgICAvLyBTa2lwIGNvbHVtbiB2YWx1ZSB1cGRhdGUgd2hlbiB0aGUgY29sdW1uIGlzIHN0YXRpYy4KICAgICAgICAgICAgICAgIGlmIChjb2wuc3RhdGljKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIHNlbGYuZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChzZWxmLCB0aGlzLCBjb2wsIHBvaW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbHVtbnMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICBjb2x1bW5zCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgndGQnKQogICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGNvbCkgewogICAgICAgICAgICAgICAgaWYgKCdlbnRlcicgaW4gY29sICYmIGNvbC5lbnRlcikgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbVRvb2x0aXAgPSBjb2w7CiAgICAgICAgICAgICAgICAgICAgY3VzdG9tVG9vbHRpcC5lbnRlci5jYWxsKHRoaXMsIHBvaW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGYuZHJhd1Rvb2x0aXBDb2x1bW4uY2FsbChzZWxmLCB0aGlzLCBjb2wsIHBvaW50KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGRyYXdUb29sdGlwQ29sdW1uKGNvbHVtbiwgdG9vbHRpcENvbCwgcG9pbnQpIHsKICAgICAgICAgICAgY29uc3QgeyBzbW9vdGhpbmdFbmFibGVkIH0gPSB0aGlzOwogICAgICAgICAgICBpZiAoJ2V2YWxUeXBlJyBpbiB0b29sdGlwQ29sICYmCiAgICAgICAgICAgICAgICB0b29sdGlwQ29sLmV2YWxUeXBlID09IFRvb2x0aXBDb2x1bW5FdmFsVHlwZS5ET00pIHsKICAgICAgICAgICAgICAgIHRvb2x0aXBDb2wuZXZhbHVhdGUuY2FsbChjb2x1bW4sIHBvaW50LCB7IHNtb290aGluZ0VuYWJsZWQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzZWxlY3QoY29sdW1uKS50ZXh0KHRvb2x0aXBDb2wuZXZhbHVhdGUuY2FsbChjb2x1bW4sIHBvaW50LCB7IHNtb290aGluZ0VuYWJsZWQgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmRDbG9zZXN0UG9pbnQodGFyZ2V0LCBkYXRhc2V0KSB7CiAgICAgICAgICAgIGNvbnN0IHhQb2ludHMgPSBkYXRhc2V0CiAgICAgICAgICAgICAgICAuZGF0YSgpCiAgICAgICAgICAgICAgICAubWFwKChkLCBpKSA9PiB0aGlzLnhTY2FsZS5zY2FsZSh0aGlzLnhBY2Nlc3NvcihkLCBpLCBkYXRhc2V0KSkpOwogICAgICAgICAgICBsZXQgaWR4ID0gbG9kYXNoLnNvcnRlZEluZGV4KHhQb2ludHMsIHRhcmdldC54KTsKICAgICAgICAgICAgaWYgKHhQb2ludHMubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgaWYgKGlkeCA9PT0geFBvaW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGlkeCA9IGlkeCAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaWR4ICE9PSAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwcmV2RGlzdCA9IE1hdGguYWJzKHhQb2ludHNbaWR4IC0gMV0gLSB0YXJnZXQueCk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0RGlzdCA9IE1hdGguYWJzKHhQb2ludHNbaWR4XSAtIHRhcmdldC54KTsKICAgICAgICAgICAgICAgIGlkeCA9IHByZXZEaXN0IDwgbmV4dERpc3QgPyBpZHggLSAxIDogaWR4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGRhdHVtID0gZGF0YXNldC5kYXRhKClbaWR4XTsKICAgICAgICAgICAgY29uc3QgeSA9IHRoaXMuc21vb3RoaW5nRW5hYmxlZAogICAgICAgICAgICAgICAgPyB0aGlzLnNtb290aGVkQWNjZXNzb3IoZGF0dW0sIGlkeCwgZGF0YXNldCkKICAgICAgICAgICAgICAgIDogdGhpcy55VmFsdWVBY2Nlc3NvcihkYXR1bSwgaWR4LCBkYXRhc2V0KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6IHhQb2ludHNbaWR4XSwKICAgICAgICAgICAgICAgIHk6IHRoaXMueVNjYWxlLnNjYWxlKHkpLAogICAgICAgICAgICAgICAgZGF0dW0sCiAgICAgICAgICAgICAgICBkYXRhc2V0LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICByZXNtb290aERhdGFzZXQoZGF0YXNldCkgewogICAgICAgICAgICBsZXQgZGF0YSA9IGRhdGFzZXQuZGF0YSgpOwogICAgICAgICAgICBjb25zdCBzbW9vdGhpbmdXZWlnaHQgPSB0aGlzLnNtb290aGluZ1dlaWdodDsKICAgICAgICAgICAgLy8gMXN0LW9yZGVyIElJUiBsb3ctcGFzcyBmaWx0ZXIgdG8gYXR0ZW51YXRlIHRoZSBoaWdoZXItCiAgICAgICAgICAgIC8vIGZyZXF1ZW5jeSBjb21wb25lbnRzIG9mIHRoZSB0aW1lLXNlcmllcy4KICAgICAgICAgICAgbGV0IGxhc3QgPSBkYXRhLmxlbmd0aCA+IDAgPyAwIDogTmFOOwogICAgICAgICAgICBsZXQgbnVtQWNjdW0gPSAwOwogICAgICAgICAgICBjb25zdCB5VmFsdWVzID0gZGF0YS5tYXAoKGQsIGkpID0+IHRoaXMueVZhbHVlQWNjZXNzb3IoZCwgaSwgZGF0YXNldCkpOwogICAgICAgICAgICAvLyBTZWUgIzc4Ni4KICAgICAgICAgICAgY29uc3QgaXNDb25zdGFudCA9IHlWYWx1ZXMuZXZlcnkoKHYpID0+IHYgPT0geVZhbHVlc1swXSk7CiAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoZCwgaSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbmV4dFZhbCA9IHlWYWx1ZXNbaV07CiAgICAgICAgICAgICAgICBpZiAoaXNDb25zdGFudCB8fCAhTnVtYmVyLmlzRmluaXRlKG5leHRWYWwpKSB7CiAgICAgICAgICAgICAgICAgICAgZC5zbW9vdGhlZCA9IG5leHRWYWw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsYXN0ID0gbGFzdCAqIHNtb290aGluZ1dlaWdodCArICgxIC0gc21vb3RoaW5nV2VpZ2h0KSAqIG5leHRWYWw7CiAgICAgICAgICAgICAgICAgICAgbnVtQWNjdW0rKzsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdW5jb3JyZWN0ZWQgbW92aW5nIGF2ZXJhZ2UgaXMgYmlhc2VkIHRvd2FyZHMgdGhlIGluaXRpYWwgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIGluaXRpYWxpemVkIHdpdGggYDBgLCB3aXRoIHNtb290aGluZ1dlaWdodCBgc2AsIHdoZXJlCiAgICAgICAgICAgICAgICAgICAgLy8gZXZlcnkgZGF0YSBwb2ludCBpcyBgY2AsIGFmdGVyIGB0YCBzdGVwcyB0aGUgbW92aW5nIGF2ZXJhZ2UgaXMKICAgICAgICAgICAgICAgICAgICAvLyBgYGAKICAgICAgICAgICAgICAgICAgICAvLyAgIEVNQSA9IDAqc14odCkgKyBjKigxIC0gcykqc14odC0xKSArIGMqKDEgLSBzKSpzXih0LTIpICsgLi4uCiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgPSBjKigxIC0gc150KQogICAgICAgICAgICAgICAgICAgIC8vIGBgYAogICAgICAgICAgICAgICAgICAgIC8vIElmIGluaXRpYWxpemVkIHdpdGggYDBgLCBkaXZpZGluZyBieSAoMSAtIHNedCkgaXMgZW5vdWdoIHRvIGRlYmlhcwogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBtb3ZpbmcgYXZlcmFnZS4gV2UgY291bnQgdGhlIG51bWJlciBvZiBmaW5pdGUgZGF0YSBwb2ludHMgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gZGl2aWRlIGFwcHJvcHJpYXRlbHkgYmVmb3JlIHN0b3JpbmcgdGhlIGRhdGEuCiAgICAgICAgICAgICAgICAgICAgbGV0IGRlYmlhc1dlaWdodCA9IDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNtb290aGluZ1dlaWdodCAhPT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWJpYXNXZWlnaHQgPSAxIC0gTWF0aC5wb3coc21vb3RoaW5nV2VpZ2h0LCBudW1BY2N1bSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGQuc21vb3RoZWQgPSBsYXN0IC8gZGViaWFzV2VpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZ2V0RGF0YXNldChuYW1lKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUyZGF0YXNldHNbbmFtZV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lMmRhdGFzZXRzW25hbWVdID0gbmV3IHNyYyQyLkRhdGFzZXQoW10sIHsKICAgICAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgICAgIG1ldGE6IG51bGwsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5uYW1lMmRhdGFzZXRzW25hbWVdOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgZ2V0WVNjYWxlRnJvbVR5cGUoeVNjYWxlVHlwZSkgewogICAgICAgICAgICBpZiAoeVNjYWxlVHlwZSA9PT0gWVNjYWxlVHlwZS5MT0cpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9nU2NhbGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh5U2NhbGVUeXBlID09PSBZU2NhbGVUeXBlLkxJTkVBUikgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBMaW5lYXJTY2FsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbnJlY29nbml6ZWQgeVNjYWxlIHR5cGUgJyArIHlTY2FsZVR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN0YWdlcyB1cGRhdGUgb2YgdmlzaWJsZSBzZXJpZXMgb24gdGhlIGNoYXJ0LgogICAgICAgICAqCiAgICAgICAgICogUGxlYXNlIGNhbGwgYGNvbW1pdENoYW5nZXNgIGZvciB0aGUgY2hhbmdlcyB0byBiZSByZWZsZWN0ZWQgb24gdGhlIGNoYXJ0CiAgICAgICAgICogYWZ0ZXIgbWFraW5nIGFsbCB0aGUgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICBzZXRWaXNpYmxlU2VyaWVzKG5hbWVzKSB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNoYW5nZXMoKTsKICAgICAgICAgICAgbmFtZXMgPSBuYW1lcy5zb3J0KCk7CiAgICAgICAgICAgIG5hbWVzLnJldmVyc2UoKTsgLy8gZHJhdyBmaXJzdCBzZXJpZXMgb24gdG9wCiAgICAgICAgICAgIHRoaXMuc2VyaWVzTmFtZXMgPSBuYW1lczsKICAgICAgICB9CiAgICAgICAgZGlzYWJsZUNoYW5nZXMoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5kaXJ0eURhdGFzZXRzLnNpemUpIHsKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgcGxvdHMgZnJvbSByZWFjdGluZyB0byB0aGUgZGF0YXNldCBjaGFuZ2VzLgogICAgICAgICAgICAgICAgdGhpcy5saW5lUGxvdC5kYXRhc2V0cyhbXSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zbW9vdGhMaW5lUGxvdCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc21vb3RoTGluZVBsb3QuZGF0YXNldHMoW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMubWFyZ2luQXJlYVBsb3QpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmdpbkFyZWFQbG90LmRhdGFzZXRzKFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb21taXRDaGFuZ2VzKCkgewogICAgICAgICAgICB0aGlzLmRhdGFzZXRzID0gdGhpcy5zZXJpZXNOYW1lcy5tYXAoKHIpID0+IHRoaXMuZ2V0RGF0YXNldChyKSk7CiAgICAgICAgICAgIFsuLi50aGlzLmRpcnR5RGF0YXNldHNdLmZvckVhY2goKGQpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnNtb290aGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc21vb3RoRGF0YXNldCh0aGlzLmdldERhdGFzZXQoZCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy51cGRhdGVTcGVjaWFsRGF0YXNldHMoKTsKICAgICAgICAgICAgdGhpcy5saW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKICAgICAgICAgICAgaWYgKHRoaXMuc21vb3RoaW5nRW5hYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5tYXJnaW5BcmVhUGxvdCkgewogICAgICAgICAgICAgICAgdGhpcy5tYXJnaW5BcmVhUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKTsKICAgICAgICAgICAgdGhpcy5kaXJ0eURhdGFzZXRzLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNhbXBsZXMgYSBkYXRhc2V0IHNvIHRoYXQgaXQgY29udGFpbnMgbm8gbW9yZSB0aGFuIF9NQVhfTUFSS0VSUyBudW1iZXIgb2YKICAgICAgICAgKiBkYXRhIHBvaW50cy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBvcmlnaW5hbCBkYXRhc2V0IGlmIGl0IGRvZXMgbm90CiAgICAgICAgICogZXhjZWVkIHRoYXQgbWFueSBwb2ludHMuCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlU2FtcGxlZERhdGFzZXRGb3JNYXJrZXJzKG9yaWdpbmFsKSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRGF0YSA9IG9yaWdpbmFsLmRhdGEoKTsKICAgICAgICAgICAgaWYgKG9yaWdpbmFsRGF0YS5sZW5ndGggPD0gX01BWF9NQVJLRVJTKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGRhdGFzZXQgaXMgc21hbGwgZW5vdWdoLiBEbyBub3Qgc2FtcGxlLgogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvd25zYW1wbGUgdGhlIGRhdGEuIE90aGVyd2lzZSwgdG9vIG1hbnkgbWFya2VycyBjbHV0dGVyIHRoZSBjaGFydC4KICAgICAgICAgICAgY29uc3Qgc2tpcExlbmd0aCA9IE1hdGguY2VpbChvcmlnaW5hbERhdGEubGVuZ3RoIC8gX01BWF9NQVJLRVJTKTsKICAgICAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBBcnJheShNYXRoLmZsb29yKG9yaWdpbmFsRGF0YS5sZW5ndGggLyBza2lwTGVuZ3RoKSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBqID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyssIGogKz0gc2tpcExlbmd0aCkgewogICAgICAgICAgICAgICAgZGF0YVtpXSA9IG9yaWdpbmFsRGF0YVtqXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IHNyYyQyLkRhdGFzZXQoZGF0YSwgb3JpZ2luYWwubWV0YWRhdGEoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN0YWdlcyBhIGRhdGEgY2hhbmdlIG9mIGEgc2VyaWVzIG9uIHRoZSBjaGFydC4KICAgICAgICAgKgogICAgICAgICAqIFBsZWFzZSBjYWxsIGBjb21taXRDaGFuZ2VzYCBmb3IgdGhlIGNoYW5nZXMgdG8gYmUgcmVmbGVjdGVkIG9uIHRoZSBjaGFydAogICAgICAgICAqIGFmdGVyIG1ha2luZyBhbGwgdGhlIGNoYW5nZXMuCiAgICAgICAgICovCiAgICAgICAgc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNoYW5nZXMoKTsKICAgICAgICAgICAgdGhpcy5nZXREYXRhc2V0KG5hbWUpLmRhdGEoZGF0YSk7CiAgICAgICAgICAgIHRoaXMuZGlydHlEYXRhc2V0cy5hZGQobmFtZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYSBtZXRhZGF0YSBjaGFuZ2Ugb2YgYSBzZXJpZXMgb24gdGhlIGNoYXJ0LgogICAgICAgICAqCiAgICAgICAgICogUGxlYXNlIGNhbGwgYGNvbW1pdENoYW5nZXNgIGZvciB0aGUgY2hhbmdlcyB0byBiZSByZWZsZWN0ZWQgb24gdGhlIGNoYXJ0CiAgICAgICAgICogYWZ0ZXIgbWFraW5nIGFsbCB0aGUgY2hhbmdlcy4KICAgICAgICAgKi8KICAgICAgICBzZXRTZXJpZXNNZXRhZGF0YShuYW1lLCBtZXRhKSB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZUNoYW5nZXMoKTsKICAgICAgICAgICAgdGhpcy5nZXREYXRhc2V0KG5hbWUpLm1ldGFkYXRhKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5nZXREYXRhc2V0KG5hbWUpLm1ldGFkYXRhKCkpLCB7IG1ldGEgfSkpOwogICAgICAgICAgICB0aGlzLmRpcnR5RGF0YXNldHMuYWRkKG5hbWUpOwogICAgICAgIH0KICAgICAgICBzbW9vdGhpbmdVcGRhdGUod2VpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMuc21vb3RoaW5nV2VpZ2h0ID0gd2VpZ2h0OwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzLmZvckVhY2goKGQpID0+IHRoaXMucmVzbW9vdGhEYXRhc2V0KGQpKTsKICAgICAgICAgICAgaWYgKCF0aGlzLnNtb290aGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMubGluZVBsb3QuYWRkQ2xhc3MoJ2dob3N0Jyk7CiAgICAgICAgICAgICAgICB0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy5zbW9vdGhlZEFjY2Vzc29yLCB0aGlzLnlTY2FsZSk7CiAgICAgICAgICAgICAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyh0aGlzLmRhdGFzZXRzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5tYXJrZXJzU2NhdHRlclBsb3QpIHsKICAgICAgICAgICAgICAgIC8vIFVzZSB0aGUgY29ycmVjdCBhY2Nlc3NvciBmb3IgbWFya2VyIHBvc2l0aW9uaW5nLgogICAgICAgICAgICAgICAgdGhpcy5tYXJrZXJzU2NhdHRlclBsb3QueSh0aGlzLmdldFlBeGlzQWNjZXNzb3IoKSwgdGhpcy55U2NhbGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCk7CiAgICAgICAgfQogICAgICAgIHNtb290aGluZ0Rpc2FibGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNtb290aGluZ0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMubGluZVBsb3QucmVtb3ZlQ2xhc3MoJ2dob3N0Jyk7CiAgICAgICAgICAgICAgICB0aGlzLnNjYXR0ZXJQbG90LnkodGhpcy55VmFsdWVBY2Nlc3NvciwgdGhpcy55U2NhbGUpOwogICAgICAgICAgICAgICAgdGhpcy5zbW9vdGhMaW5lUGxvdC5kYXRhc2V0cyhbXSk7CiAgICAgICAgICAgICAgICB0aGlzLnNtb290aGluZ0VuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3BlY2lhbERhdGFzZXRzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubWFya2Vyc1NjYXR0ZXJQbG90KSB7CiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGNvcnJlY3QgYWNjZXNzb3IgKHdoaWNoIGRlcGVuZHMgb24gd2hldGhlciBzbW9vdGhpbmcgaXMKICAgICAgICAgICAgICAgIC8vIGVuYWJsZWQpIGZvciBtYXJrZXIgcG9zaXRpb25pbmcuCiAgICAgICAgICAgICAgICB0aGlzLm1hcmtlcnNTY2F0dGVyUGxvdC55KHRoaXMuZ2V0WUF4aXNBY2Nlc3NvcigpLCB0aGlzLnlTY2FsZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKSB7CiAgICAgICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IGNvbG9yU2NhbGU7CiAgICAgICAgfQogICAgICAgIHNldFRvb2x0aXBDb2x1bW5zKHRvb2x0aXBDb2x1bW5zKSB7CiAgICAgICAgICAgIHRoaXMudG9vbHRpcENvbHVtbnMgPSB0b29sdGlwQ29sdW1uczsKICAgICAgICB9CiAgICAgICAgc2V0VG9vbHRpcFNvcnRpbmdNZXRob2QobWV0aG9kKSB7CiAgICAgICAgICAgIHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QgPSBtZXRob2Q7CiAgICAgICAgfQogICAgICAgIHJlbmRlclRvKHRhcmdldFNWRykgewogICAgICAgICAgICB0aGlzLnRhcmdldFNWRyA9IHRhcmdldFNWRzsKICAgICAgICAgICAgdGhpcy5vdXRlci5yZW5kZXJUbyh0YXJnZXRTVkcpOwogICAgICAgICAgICBpZiAodGhpcy5fZGVmYXVsdFhSYW5nZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBBIGhpZ2hlci1sZXZlbCBjb21wb25lbnQgcHJvdmlkZWQgYSBkZWZhdWx0IHJhbmdlIGZvciB0aGUgWCBheGlzLgogICAgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCB0aGF0IHJhbmdlLgogICAgICAgICAgICAgICAgdGhpcy5yZXNldFhEb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZGVmYXVsdFlSYW5nZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBBIGhpZ2hlci1sZXZlbCBjb21wb25lbnQgcHJvdmlkZWQgYSBkZWZhdWx0IHJhbmdlIGZvciB0aGUgWSBheGlzLgogICAgICAgICAgICAgICAgLy8gU3RhcnQgd2l0aCB0aGF0IHJhbmdlLgogICAgICAgICAgICAgICAgdGhpcy5yZXNldFlEb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0SW5SYWYoKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTsKICAgICAgICAgICAgdGhpcy5fcmVkcmF3UmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCk7CiAgICAgICAgICAgICAgICB0aGlzLm91dGVyLnJlZHJhdygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgbWVhc3VyZUJCb3hBbmRNYXliZUludmFsaWRhdGVMYXlvdXRJblJhZigpIHsKICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHRoaXMuX2ludmFsaWRhdGVMYXlvdXRSYWYpOwogICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlTGF5b3V0UmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLm1lYXN1cmVCQm94QW5kTWF5YmVJbnZhbGlkYXRlTGF5b3V0KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNZWFzdXJlcyBib3VuZGluZyBib3ggb2YgdGhlIGFuY2hvciBub2RlIGFuZCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGxheW91dAogICAgICAgICAqIG5lZWRzIHRvIGJlIHJlLWRvbmUgd2l0aCBtZWFzdXJlbWVudCBjYWNoZSBpbnZhbGlkYXRlZC4gUGxvdHRhYmxlIGltcHJvdmVkCiAgICAgICAgICogcGVyZm9ybWFuY2Ugb2YgcmVuZGVyaW5nIGJ5IGNhY2hpbmcgZXhwZW5zaXZlIERPTSBtZWFzdXJlbWVudCBidXQgdGhpcwogICAgICAgICAqIGNhY2hlIGNhbiBiZSBwb2lzb25lZCBpbiBjYXNlIHRoZSBhbmNob3Igbm9kZSBpcyBpbiBhIHdyb25nIHN0YXRlIC0tIG5hbWVseQogICAgICAgICAqIGBkaXNwbGF5OiBub25lYCB3aGVyZSBhbGwgZGltZW5zaW9ucyBhcmUgMC4KICAgICAgICAgKi8KICAgICAgICBtZWFzdXJlQkJveEFuZE1heWJlSW52YWxpZGF0ZUxheW91dCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3REcmF3QkJveCkgewogICAgICAgICAgICAgICAgY29uc3QgeyB3aWR0aDogcHJldldpZHRoIH0gPSB0aGlzLl9sYXN0RHJhd0JCb3g7CiAgICAgICAgICAgICAgICBjb25zdCB7IHdpZHRoIH0gPSB0aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICBpZiAocHJldldpZHRoID09IDAgJiYgcHJldldpZHRoIDwgd2lkdGgpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdXRlci5pbnZhbGlkYXRlQ2FjaGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9sYXN0RHJhd0JCb3ggPSB0aGlzLnRhcmdldFNWRy5ub2RlKCkuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgfQogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIC8vIERlc3Ryb3lpbmcgb3V0ZXIgZGVzdHJveXMgYWxsIHN1YmNvbXBvbmVudHMgcmVjdXJzaXZlbHkuCiAgICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpOwogICAgICAgICAgICB3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5faW52YWxpZGF0ZUxheW91dFJhZik7CiAgICAgICAgICAgIGlmICh0aGlzLm91dGVyKQogICAgICAgICAgICAgICAgdGhpcy5vdXRlci5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICAgIG9uQW5jaG9yKGZuKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm91dGVyKQogICAgICAgICAgICAgICAgdGhpcy5vdXRlci5vbkFuY2hvcihmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZXh0ZW50IG9mIHJlbmRlcmVkIGRhdGEgdmFsdWVzIGZpdHMgdGhlIGN1cnJlbnQKICAgICAgICAgKiBjaGFydCB2aWV3cG9ydCBkb21haW4gKGluY2x1ZGVzIHNtb290aGluZyBhbmQgb3V0bGllciBkZXRlY3Rpb24pLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyB0cnVlIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSwgYW5kIGZhbHNlIHdoZW4gdGhlIGRvbWFpbiBoYXMgYmVlbgogICAgICAgICAqIHRyYW5zZm9ybWVkIGZyb20gdGhlIGV4dGVudCB2aWEgdHJhbnNmb3JtYXRpb25zIChwYW4sIHpvb20pLgogICAgICAgICAqLwogICAgICAgIGlzRGF0YUZpdFRvRG9tYWluKCkgewogICAgICAgICAgICByZXR1cm4gKGlzRGF0YUZpdFRvRG9tYWluKHRoaXMueEF4aXMuZ2V0U2NhbGUoKSkgJiYKICAgICAgICAgICAgICAgIGlzRGF0YUZpdFRvRG9tYWluKHRoaXMueUF4aXMuZ2V0U2NhbGUoKSkpOwogICAgICAgICAgICBmdW5jdGlvbiBpc0RhdGFGaXRUb0RvbWFpbihzY2FsZSkgewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBEb21haW4gcmVwcmVzZW50cyB0aGUgY3VycmVudGx5IGRpc3BsYXllZCByZWdpb24sIHBvc3NpYmx5IGEgem9vbWVkCiAgICAgICAgICAgICAgICAgKiBpbiBvciB6b29tZWQgb3V0IHZpZXcgb2YgdGhlIGRhdGEuCiAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICogRXh0ZW50IHJlcHJlc2VudHMgdGhlIGV4dGVudCBvZiB0aGUgZGF0YSwgdGhlIHJhbmdlIG9mIGFsbCBwcm92aWRlZAogICAgICAgICAgICAgICAgICogZGF0dW0gdmFsdWVzLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjb25zdCBkb21haW4gPSBzY2FsZS5nZXRUcmFuc2Zvcm1hdGlvbkRvbWFpbigpOwogICAgICAgICAgICAgICAgY29uc3QgZXh0ZW50ID0gc2NhbGUuZ2V0VHJhbnNmb3JtYXRpb25FeHRlbnQoKTsKICAgICAgICAgICAgICAgIHJldHVybiBleHRlbnRbMF0gPT09IGRvbWFpblswXSAmJiBleHRlbnRbMV0gPT09IGRvbWFpblsxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxOCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHZhciBOb2RlTmFtZTsKICAgIChmdW5jdGlvbiAoTm9kZU5hbWUpIHsKICAgICAgICBOb2RlTmFtZVsiR1JPVVAiXSA9ICJHIjsKICAgICAgICBOb2RlTmFtZVsiRElWIl0gPSAiRElWIjsKICAgICAgICBOb2RlTmFtZVsiU1ZHIl0gPSAiU1ZHIjsKICAgICAgICBOb2RlTmFtZVsiVEVYVCJdID0gIlRFWFQiOwogICAgfSkoTm9kZU5hbWUgfHwgKE5vZGVOYW1lID0ge30pKTsKICAgIGNsYXNzIFBsb3R0YWJsZUV4cG9ydGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcihyb290RWwpIHsKICAgICAgICAgICAgdGhpcy51bmlxdWVJZCA9IDA7CiAgICAgICAgICAgIHRoaXMucm9vdCA9IHJvb3RFbDsKICAgICAgICB9CiAgICAgICAgZXhwb3J0QXNTdHJpbmcoKSB7CiAgICAgICAgICAgIGNvbnN0IGNvbnZlcnRlZE5vZGVzID0gdGhpcy5jb252ZXJ0KHRoaXMucm9vdCk7CiAgICAgICAgICAgIGlmICghY29udmVydGVkTm9kZXMpCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IHRoaXMuY3JlYXRlUm9vdFN2ZygpOwogICAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoY29udmVydGVkTm9kZXMpOwogICAgICAgICAgICByZXR1cm4gc3ZnLm91dGVySFRNTDsKICAgICAgICB9CiAgICAgICAgY3JlYXRlVW5pcXVlSWQocHJlZml4KSB7CiAgICAgICAgICAgIHJldHVybiBgJHtwcmVmaXh9XyR7dGhpcy51bmlxdWVJZCsrfWA7CiAgICAgICAgfQogICAgICAgIGdldFNpemUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJvb3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgfQogICAgICAgIGNyZWF0ZVJvb3RTdmcoKSB7CiAgICAgICAgICAgIGNvbnN0IHN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3N2ZycpOwogICAgICAgICAgICBjb25zdCByZWN0ID0gdGhpcy5nZXRTaXplKCk7CiAgICAgICAgICAgIC8vIGNhc2Ugb24gYHZpZXdCb3hgIGlzIHNlbnNpdGl2ZS4KICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZU5TKCdzdmcnLCAndmlld0JveCcsIGAwIDAgJHtyZWN0LndpZHRofSAke3JlY3QuaGVpZ2h0fWApOwogICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCd4bWxucycsICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZycpOwogICAgICAgICAgICByZXR1cm4gc3ZnOwogICAgICAgIH0KICAgICAgICBjb252ZXJ0KG5vZGUpIHsKICAgICAgICAgICAgbGV0IG5ld05vZGUgPSBudWxsOwogICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgPT0gTm9kZS5FTEVNRU5UX05PREUgJiYKICAgICAgICAgICAgICAgIChub2RlTmFtZSA9PSBOb2RlTmFtZS5ESVYgfHwgbm9kZU5hbWUgPT0gTm9kZU5hbWUuU1ZHKSkgewogICAgICAgICAgICAgICAgbmV3Tm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoTm9kZU5hbWUuR1JPVVApOwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShub2RlKTsKICAgICAgICAgICAgICAgIGNvbnN0IGxlZnQgPSBwYXJzZUludChzdHlsZS5sZWZ0LCAxMCk7CiAgICAgICAgICAgICAgICBjb25zdCB0b3AgPSBwYXJzZUludChzdHlsZS50b3AsIDEwKTsKICAgICAgICAgICAgICAgIGlmIChsZWZ0IHx8IHRvcCkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBJZCA9IHRoaXMuY3JlYXRlVW5pcXVlSWQoJ2NsaXAnKTsKICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLnNldEF0dHJpYnV0ZSgndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke2xlZnR9LCAke3RvcH0pYCk7CiAgICAgICAgICAgICAgICAgICAgbmV3Tm9kZS5zZXRBdHRyaWJ1dGUoJ2NsaXAtcGF0aCcsIGB1cmwoIyR7Y2xpcElkfSlgKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3aWR0aCA9IHBhcnNlSW50KHN0eWxlLndpZHRoLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gcGFyc2VJbnQoc3R5bGUuaGVpZ2h0LCAxMCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3JlY3QnKTsKICAgICAgICAgICAgICAgICAgICByZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBTdHJpbmcod2lkdGgpKTsKICAgICAgICAgICAgICAgICAgICByZWN0LnNldEF0dHJpYnV0ZSgnaGVpZ2h0JywgU3RyaW5nKGhlaWdodCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsaXBQYXRoID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCdzdmcnLCAnY2xpcFBhdGgnKTsKICAgICAgICAgICAgICAgICAgICBjbGlwUGF0aC5pZCA9IGNsaXBJZDsKICAgICAgICAgICAgICAgICAgICBjbGlwUGF0aC5hcHBlbmRDaGlsZChyZWN0KTsKICAgICAgICAgICAgICAgICAgICBuZXdOb2RlLmFwcGVuZENoaWxkKGNsaXBQYXRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld05vZGUgPSBub2RlLmNsb25lTm9kZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIEFycmF5LmZyb20obm9kZS5jaGlsZE5vZGVzKQogICAgICAgICAgICAgICAgLm1hcCgobm9kZSkgPT4gdGhpcy5jb252ZXJ0KG5vZGUpKQogICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKQogICAgICAgICAgICAgICAgLmZvckVhY2goKGVsKSA9PiBuZXdOb2RlLmFwcGVuZENoaWxkKGVsKSk7CiAgICAgICAgICAgIC8vIFJlbW92ZSBlbXB0eSBncm91cGluZy4gVGhleSBhZGQgdG9vIG11Y2ggbm9pc2UuCiAgICAgICAgICAgIGNvbnN0IHNob3VsZE9taXQgPSAobmV3Tm9kZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpID09IE5vZGVOYW1lLkdST1VQICYmCiAgICAgICAgICAgICAgICAhbmV3Tm9kZS5oYXNDaGlsZE5vZGVzKCkpIHx8CiAgICAgICAgICAgICAgICB0aGlzLnNob3VsZE9taXROb2RlKG5vZGUpOwogICAgICAgICAgICBpZiAoc2hvdWxkT21pdCkKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJpcENsYXNzKHRoaXMudHJhbnNmZXJTdHlsZShub2RlLCBuZXdOb2RlKSk7CiAgICAgICAgfQogICAgICAgIHN0cmlwQ2xhc3Mobm9kZSkgewogICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUoJ2NsYXNzJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICAgIHRyYW5zZmVyU3R5bGUob3JpZ05vZGUsIG5vZGUpIHsKICAgICAgICAgICAgaWYgKG5vZGUubm9kZVR5cGUgIT0gTm9kZS5FTEVNRU5UX05PREUpCiAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgICAgY29uc3QgZWwgPSBub2RlOwogICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IG5vZGUubm9kZU5hbWUudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShvcmlnTm9kZSk7CiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PSBOb2RlTmFtZS5URVhUKSB7CiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGVsLnN0eWxlLCB7CiAgICAgICAgICAgICAgICAgICAgZm9udEZhbWlseTogc3R5bGUuZm9udEZhbWlseSwKICAgICAgICAgICAgICAgICAgICBmb250U2l6ZTogc3R5bGUuZm9udFNpemUsCiAgICAgICAgICAgICAgICAgICAgZm9udFdlaWdodDogc3R5bGUuZm9udFdlaWdodCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub2RlTmFtZSAhPSBOb2RlTmFtZS5HUk9VUCkgewogICAgICAgICAgICAgICAgZWwuc2V0QXR0cmlidXRlKCdmaWxsJywgc3R5bGUuZmlsbCk7CiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZScsIHN0eWxlLnN0cm9rZSk7CiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ3N0cm9rZS13aWR0aCcsIHN0eWxlLnN0cm9rZVdpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3R5bGUub3BhY2l0eSAhPSAnMScpCiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUoJ29wYWNpdHknLCBzdHlsZS5vcGFjaXR5KTsKICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgfQogICAgICAgIHNob3VsZE9taXROb2RlKG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIExpbmVDaGFydEV4cG9ydGVyIGV4dGVuZHMgUGxvdHRhYmxlRXhwb3J0ZXIgewogICAgICAgIHNob3VsZE9taXROb2RlKG5vZGUpIHsKICAgICAgICAgICAgLy8gU2NhdHRlciBwbG90IGlzIHVzZWZ1bCBmb3IgdG9vbHRpcC4gVG9vbHRpcCBpcyBtZWFuaW5nbGVzcyBpbiB0aGUKICAgICAgICAgICAgLy8gZXhwb3J0ZWQgc3ZnLgogICAgICAgICAgICBpZiAobm9kZS5ub2RlVHlwZSA9PSBOb2RlLkVMRU1FTlRfTk9ERSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdzY2F0dGVyLXBsb3QnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE2IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgcmVnaXN0ZXJTdHlsZURvbU1vZHVsZSh7CiAgICAgICAgbW9kdWxlTmFtZTogJ3Z6LXBhbi16b29tLXN0eWxlJywKICAgICAgICBzdHlsZUNvbnRlbnQ6IGAKICAgIC5oZWxwIHsKICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgYW5pbWF0aW9uLWRlbGF5OiAxczsKICAgICAgYW5pbWF0aW9uLWR1cmF0aW9uOiAxczsKICAgICAgYW5pbWF0aW9uLW5hbWU6IGZhZGUtb3V0OwogICAgICBiYWNrZ3JvdW5kOiByZ2JhKDMwLCAzMCwgMzAsIDAuNik7CiAgICAgIGJvdHRvbTogMDsKICAgICAgY29sb3I6ICNmZmY7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICBsZWZ0OiAwOwogICAgICBvcGFjaXR5OiAxOwogICAgICBwYWRkaW5nOiAyMHB4OwogICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICByaWdodDogMDsKICAgICAgdG9wOiAwOwogICAgfQoKICAgIC5oZWxwID4gc3BhbiB7CiAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICB9CgogICAgQGtleWZyYW1lcyBmYWRlLW91dCB7CiAgICAgIDAlIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAxMDAlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CiAgICB9CiAgYCwKICAgIH0pOwoKICAgIGNvbnN0IHZhbHVlRm9ybWF0dGVyID0gbXVsdGlzY2FsZUZvcm1hdHRlcihZX1RPT0xUSVBfRk9STUFUVEVSX1BSRUNJU0lPTik7CiAgICBjb25zdCBmb3JtYXRWYWx1ZU9yTmFOID0gKHgpID0+IChpc05hTih4KSA/ICdOYU4nIDogdmFsdWVGb3JtYXR0ZXIoeCkpOwogICAgY29uc3QgREVGQVVMVF9UT09MVElQX0NPTFVNTlMgPSBbCiAgICAgICAgewogICAgICAgICAgICB0aXRsZTogJ05hbWUnLAogICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IGQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHRpdGxlOiAnU21vb3RoZWQnLAogICAgICAgICAgICBldmFsdWF0ZShkLCBzdGF0dXNPYmplY3QpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgc21vb3RoaW5nRW5hYmxlZCB9ID0gc3RhdHVzT2JqZWN0OwogICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlT3JOYU4oc21vb3RoaW5nRW5hYmxlZCA/IGQuZGF0dW0uc21vb3RoZWQgOiBkLmRhdHVtLnNjYWxhcik7CiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHRpdGxlOiAnVmFsdWUnLAogICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IGZvcm1hdFZhbHVlT3JOYU4oZC5kYXR1bS5zY2FsYXIpLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICB0aXRsZTogJ1N0ZXAnLAogICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IHN0ZXBGb3JtYXR0ZXIoZC5kYXR1bS5zdGVwKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgdGl0bGU6ICdUaW1lJywKICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiB0aW1lRm9ybWF0dGVyKGQuZGF0dW0ud2FsbF90aW1lKSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgdGl0bGU6ICdSZWxhdGl2ZScsCiAgICAgICAgICAgIGV2YWx1YXRlOiAoZCkgPT4gcmVsYXRpdmVGb3JtYXR0ZXIocmVsYXRpdmVBY2Nlc3NvcihkLmRhdHVtLCAtMSwgZC5kYXRhc2V0KSksCiAgICAgICAgfSwKICAgIF07CiAgICBsZXQgVnpMaW5lQ2hhcnQyID0gY2xhc3MgVnpMaW5lQ2hhcnQyIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTY2FsZSB0aGF0IG1hcHMgc2VyaWVzIG5hbWVzIHRvIGNvbG9ycy4gVGhlIGRlZmF1bHQgY29sb3JzIGFyZSBmcm9tCiAgICAgICAgICAgICAqIGQzLnNjaGVtZUNhdGVnb3J5MTAuIFVzZSB0aGlzIHByb3BlcnR5IHRvIHJlcGxhY2UgdGhlIGRlZmF1bHQgbGluZQogICAgICAgICAgICAgKiBjb2xvcnMgd2l0aCBjb2xvcnMgb2YgeW91ciBvd24gY2hvaWNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gbmV3IHNyYyQyLlNjYWxlcy5Db2xvcigpLnJhbmdlKGNhdGVnb3J5MTAuc2xpY2UoMCkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBzbW9vdGhpbmcgaXMgZW5hYmxlZCBvciBub3QuIElmIHRydWUsIHNtb290aGVkIGxpbmVzIHdpbGwgYmUKICAgICAgICAgICAgICogcGxvdHRlZCBpbiB0aGUgY2hhcnQgd2hpbGUgdGhlIHVuc21vb3RoZWQgbGluZXMgd2lsbCBiZSBnaG9zdGVkIGluCiAgICAgICAgICAgICAqIHRoZSBiYWNrZ3JvdW5kLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5zbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXZWlnaHQgKGJldHdlZW4gMC4wIGFuZCAxLjApIG9mIHRoZSBzbW9vdGhpbmcuIEEgdmFsdWUgb2YgMC4wCiAgICAgICAgICAgICAqIG1lYW5zIHZlcnkgbGl0dGxlIHNtb290aGluZywgcG9zc2libHkgbm8gc21vb3RoaW5nIGF0IGFsbC4gQQogICAgICAgICAgICAgKiB2YWx1ZSBvZiAxLjAgbWVhbnMgYSB3aG9sZSBsb3Qgb2Ygc21vb3RoaW5nLCBwb3NzaWJseSBzbyBtdWNoIGFzCiAgICAgICAgICAgICAqIHRvIG1ha2UgdGhlIHdob2xlIHBsb3QgYXBwZWFyIGFzIGEgY29uc3RhbnQgZnVuY3Rpb24uCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEhhcyBubyBlZmZlY3Qgd2hlbiBgc21vb3RoaW5nRW5hYmxlZGAgaXMgYGZhbHNlYC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc21vb3RoaW5nV2VpZ2h0ID0gMC42OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhpcyBpcyBhIGhlbHBlciBmaWVsZCBmb3IgYXV0b21hdGljYWxseSBnZW5lcmF0aW5nIGNvbW1vbmx5IHVzZWQKICAgICAgICAgICAgICogZnVuY3Rpb25zIGZvciB4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kLiBWYWxpZCB2YWx1ZXMgYXJlIHdoYXQgY2FuCiAgICAgICAgICAgICAqIGJlIHByb2Nlc3NlZCBieSB2el9jaGFydF9oZWxwZXJzLmdldFhDb21wb25lbnRzKCkgYW5kIGluY2x1ZGUKICAgICAgICAgICAgICogInN0ZXAiLCAid2FsbF90aW1lIiwgYW5kICJyZWxhdGl2ZSIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnhUeXBlID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdlIGFjY2VwdCBhIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBhbiBYQ29tcG9uZW50cyBvYmplY3QgaW5zdGVhZCBvZiBzdWNoCiAgICAgICAgICAgICAqIGFuIG9iamVjdCBpdHNlbGYgYmVjYXVzZSB0aGUgQXhpcyBtdXN0IGJlIG1hZGUgcmlnaHQgd2hlbiB3ZSBtYWtlIHRoZQogICAgICAgICAgICAgKiBMaW5lQ2hhcnQgb2JqZWN0LCBsZXN0IHdlIHVzZSBhIHByZXZpb3VzbHkgZGVzdHJveWVkIEF4aXMuIFNlZSB0aGUgYXN5bmMKICAgICAgICAgICAgICogbG9naWMgYmVsb3cgdGhhdCB1c2VzIHRoaXMgcHJvcGVydHkuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYSBmdW5jdGlvbiBiZWNhdXNlIHBvbHltZXIgY2FsbHMgdGhlCiAgICAgICAgICAgICAqIG91dGVyIGZ1bmN0aW9uIHRvIGNvbXB1dGUgdGhlIHZhbHVlLiBXZSBhY3R1YWxseSB3YW50IHRoZSB2YWx1ZSBvZiB0aGlzCiAgICAgICAgICAgICAqIHByb3BlcnR5IHRvIGJlIHRoZSBpbm5lciBmdW5jdGlvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMueENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIG1ldGhvZCB0aGF0IGltcGxlbWVudHMgdGhlIFBsb3R0YWJsZS5JQWNjZXNzb3I8bnVtYmVyPiBpbnRlcmZhY2UuIFVzZWQKICAgICAgICAgICAgICogZm9yIGFjY2Vzc2luZyB0aGUgeSB2YWx1ZSBmcm9tIGEgZGF0YSBwb2ludC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uIGJlY2F1c2UgcG9seW1lciBjYWxscyB0aGUKICAgICAgICAgICAgICogb3V0ZXIgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgdmFsdWUuIFdlIGFjdHVhbGx5IHdhbnQgdGhlIHZhbHVlIG9mIHRoaXMKICAgICAgICAgICAgICogcHJvcGVydHkgdG8gYmUgdGhlIGlubmVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy55VmFsdWVBY2Nlc3NvciA9IChkKSA9PiBkLnNjYWxhcjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFuIGFycmF5IG9mIENoYXJ0SGVscGVyLlRvb2x0aXBDb2x1bW4gb2JqZWN0cy4gVXNlZCB0byBwb3B1bGF0ZSB0aGUgdGFibGUKICAgICAgICAgICAgICogd2l0aGluIHRoZSB0b29sdGlwLiBUaGUgdGFibGUgY29udGFpbnMgMSByb3cgcGVyIHJ1bi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogTm90ZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGZ1bmN0aW9uIGJlY2F1c2UgcG9seW1lciBjYWxscyB0aGUKICAgICAgICAgICAgICogb3V0ZXIgZnVuY3Rpb24gdG8gY29tcHV0ZSB0aGUgdmFsdWUuIFdlIGFjdHVhbGx5IHdhbnQgdGhlIHZhbHVlIG9mIHRoaXMKICAgICAgICAgICAgICogcHJvcGVydHkgdG8gYmUgdGhlIGlubmVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy50b29sdGlwQ29sdW1ucyA9IERFRkFVTFRfVE9PTFRJUF9DT0xVTU5TOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIHNjYWxlIGZvciB0aGUgeS1heGlzLiBBbGxvd3M6CiAgICAgICAgICAgICAqIC0gImxpbmVhciIgLSBsaW5lYXIgc2NhbGUgKFBsb3R0YWJsZS5TY2FsZXMuTGluZWFyKQogICAgICAgICAgICAgKiAtICJsb2ciIC0gbW9kaWZpZWQtbG9nIHNjYWxlIChQbG90dGFibGUuU2NhbGVzLk1vZGlmaWVkTG9nKQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy55U2NhbGVUeXBlID0gWVNjYWxlVHlwZS5MSU5FQVI7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRvIGlnbm9yZSBvdXRsaWVyIGRhdGEgd2hlbiBjb21wdXRpbmcgdGhlIHlTY2FsZSBkb21haW4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlnbm9yZVlPdXRsaWVycyA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2hhbmdlIGhvdyB0aGUgdG9vbHRpcCBpcyBzb3J0ZWQuIEFsbG93czoKICAgICAgICAgICAgICogLSAiZGVmYXVsdCIgLSBTb3J0IHRoZSB0b29sdGlwIGJ5IGlucHV0IG9yZGVyLgogICAgICAgICAgICAgKiAtICJhc2NlbmRpbmciIC0gU29ydCB0aGUgdG9vbHRpcCBieSBhc2NlbmRpbmcgdmFsdWUuCiAgICAgICAgICAgICAqIC0gImRlc2NlbmRpbmciIC0gU29ydCB0aGUgdG9vbHRpcCBieSBkZXNjZW5kaW5nIHZhbHVlLgogICAgICAgICAgICAgKiAtICJuZWFyZXN0IiAtIFNvcnQgdGhlIHRvb2x0aXAgYnkgY2xvc2VzdCB0byBjdXJzb3IuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kID0gJ2RlZmF1bHQnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2hhbmdlcyBob3cgdGhlIHRvb2x0aXAgaXMgcG9zaXRpb25lZC4gQWxsb3dzOgogICAgICAgICAgICAgKiAtICJib3R0b20iIC0gUG9zaXRpb24gdGhlIHRvb2x0aXAgb24gdGhlIGJvdHRvbSBvZiB0aGUgY2hhcnQuCiAgICAgICAgICAgICAqIC0gInJpZ2h0IiAtIFBvc2l0aW9uIHRoZSB0b29sdGlwIHRvIHRoZSByaWdodCBvZiB0aGUgY2hhcnQuCiAgICAgICAgICAgICAqIC0gImF1dG8iIC0gUG9zaXRpb24gdGhlIHRvb2x0aXAgdG8gdGhlIGJvdHRvbSBvZiB0aGUgY2hhcnQgaW4gbW9zdCBjYXNlLgogICAgICAgICAgICAgKiAgICAgICAgICAgIFBvc2l0aW9uIHRoZSB0b29sdGlwIGFib3ZlIHRoZSBjaGFydCBpZiB0aGVyZSBpc24ndCBzdWZmaWNpZW50CiAgICAgICAgICAgICAqICAgICAgICAgICAgc3BhY2UgYmVsb3cuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnRvb2x0aXBQb3NpdGlvbiA9IFRvb2x0aXBQb3NpdGlvbi5CT1RUT007CiAgICAgICAgICAgIHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXJpZXNEYXRhQ2FjaGUgPSB7fTsKICAgICAgICAgICAgdGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZSA9IHt9OwogICAgICAgICAgICB0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQgPSBudWxsOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgdGhpcy5zY29wZVN1YnRyZWUodGhpcy4kLmNoYXJ0ZGl2LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIC8vIGBjYXB0dXJlYCBlbnN1cmVzIHRoYXQgbm8gaGFuZGxlciBjYW4gc3RvcCBwcm9wYWdhdGlvbiBhbmQgYnJlYWsgdGhlCiAgICAgICAgICAgIC8vIGhhbmRsZXIuIGBwYXNzaXZlYCBlbnN1cmVzIHRoYXQgYnJvd3NlciBkb2VzIG5vdCB3YWl0IHJlbmRlcmVyIHRocmVhZAogICAgICAgICAgICAvLyBvbiBKUyBoYW5kbGVyICh3aGljaCBjYW4gcHJldmVudCBkZWZhdWx0IGFuZCBpbXBhY3QgcmVuZGVyaW5nKS4KICAgICAgICAgICAgY29uc3Qgb3B0aW9uID0geyBjYXB0dXJlOiB0cnVlLCBwYXNzaXZlOiB0cnVlIH07CiAgICAgICAgICAgIHRoaXMuX2xpc3Rlbih0aGlzLCAnbW91c2Vkb3duJywgdGhpcy5fb25Nb3VzZURvd24uYmluZCh0aGlzKSwgb3B0aW9uKTsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuKHRoaXMsICdtb3VzZXVwJywgdGhpcy5fb25Nb3VzZVVwLmJpbmQodGhpcyksIG9wdGlvbik7CiAgICAgICAgICAgIHRoaXMuX2xpc3Rlbih3aW5kb3csICdrZXlkb3duJywgdGhpcy5fb25LZXlEb3duLmJpbmQodGhpcyksIG9wdGlvbik7CiAgICAgICAgICAgIHRoaXMuX2xpc3Rlbih3aW5kb3csICdrZXl1cCcsIHRoaXMuX29uS2V5VXAuYmluZCh0aGlzKSwgb3B0aW9uKTsKICAgICAgICB9CiAgICAgICAgZGV0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuY2FuY2VsQXN5bmModGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fbGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuZm9yRWFjaCgoeyBub2RlLCBldmVudE5hbWUsIGZ1bmMsIG9wdGlvbiB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgZnVuYywgb3B0aW9uKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2xpc3Rlbihub2RlLCBldmVudE5hbWUsIGZ1bmMsIG9wdGlvbiA9IHt9KSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fbGlzdGVuZXJzKQogICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gbmV3IFNldCgpOwogICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMuYWRkKHsgbm9kZSwgZXZlbnROYW1lLCBmdW5jLCBvcHRpb24gfSk7CiAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmMsIG9wdGlvbik7CiAgICAgICAgfQogICAgICAgIF9vbktleURvd24oZXZlbnQpIHsKICAgICAgICAgICAgdGhpcy50b2dnbGVDbGFzcygncGFua2V5JywgUGFuWm9vbURyYWdMYXllci5pc1BhbktleShldmVudCkpOwogICAgICAgIH0KICAgICAgICBfb25LZXlVcChldmVudCkgewogICAgICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdwYW5rZXknLCBQYW5ab29tRHJhZ0xheWVyLmlzUGFuS2V5KGV2ZW50KSk7CiAgICAgICAgfQogICAgICAgIF9vbk1vdXNlRG93bihldmVudCkgewogICAgICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdtb3VzZWRvd24nLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgX29uTW91c2VVcChldmVudCkgewogICAgICAgICAgICB0aGlzLnRvZ2dsZUNsYXNzKCdtb3VzZWRvd24nLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgZXh0ZW50IG9mIHJlbmRlcmVkIGRhdGEgdmFsdWVzIGZpdHMgdGhlIGN1cnJlbnQKICAgICAgICAgKiBjaGFydCB2aWV3cG9ydCBkb21haW4gKGluY2x1ZGVzIHNtb290aGluZyBhbmQgb3V0bGllciBkZXRlY3Rpb24pLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyB0cnVlIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSwgYW5kIGZhbHNlIHdoZW4gdGhlIGRvbWFpbiBoYXMgYmVlbgogICAgICAgICAqIHRyYW5zZm9ybWVkIGZyb20gdGhlIGV4dGVudCB2aWEgdHJhbnNmb3JtYXRpb25zIChwYW4sIHpvb20pLgogICAgICAgICAqLwogICAgICAgIGlzRGF0YUZpdFRvRG9tYWluKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hhcnQgPyB0aGlzLl9jaGFydC5pc0RhdGFGaXRUb0RvbWFpbigpIDogdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgc2VyaWVzIHRoYXQgdGhlIGNoYXJ0IGRpc3BsYXlzLiBTZXJpZXMgd2l0aCBvdGhlciBuYW1lcyB3aWxsCiAgICAgICAgICogbm90IGJlIGRpc3BsYXllZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7QXJyYXk8U3RyaW5nPn0gbmFtZXMgQXJyYXkgd2l0aCB0aGUgbmFtZXMgb2YgdGhlIHNlcmllcyB0bwogICAgICAgICAqIGRpc3BsYXkuCiAgICAgICAgICovCiAgICAgICAgc2V0VmlzaWJsZVNlcmllcyhuYW1lcykgewogICAgICAgICAgICBpZiAobG9kYXNoLmlzRXF1YWwodGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLCBuYW1lcykpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSA9IG5hbWVzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkYXRhIG9mIG9uZSBvZiB0aGUgc2VyaWVzLiBOb3RlIHRoYXQgdG8gZGlzcGxheSB0aGlzIHNlcmllcwogICAgICAgICAqIGl0cyBuYW1lIG11c3QgYmUgaW4gdGhlIHNldFZpc2libGVTZXJpZXMoKSBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHNlcmllcy4KICAgICAgICAgKiBAcGFyYW0ge0FycmF5PCF2el9jaGFydF9oZWxwZXJzLlNjYWxhckRhdHVtPn0gZGF0YSBEYXRhIG9mIHRoZSBzZXJpZXMuCiAgICAgICAgICogVGhpcyBpcyBhbiBhcnJheSBvZiBvYmplY3RzIHdpdGggYXQgbGVhc3QgdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgogICAgICAgICAqIC0gc3RlcDogKE51bWJlcikgLSBpbmRleCBvZiB0aGUgZGF0dW0uCiAgICAgICAgICogLSB3YWxsX3RpbWU6IChEYXRlKSAtIERhdGUgb2JqZWN0IHdpdGggdGhlIGRhdHVtJ3MgdGltZS4KICAgICAgICAgKiAtIHNjYWxhcjogKE51bWJlcikgLSBWYWx1ZSBvZiB0aGUgZGF0dW0uCiAgICAgICAgICovCiAgICAgICAgc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtuYW1lXSA9IGRhdGE7CiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFydCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBtZXRhZGF0YSBvZiBvbmUgb2YgdGhlIHNlcmllcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHNlcmllcy4KICAgICAgICAgKiBAcGFyYW0geyp9IG1ldGEgTWV0YWRhdGEgb2YgdGhlIGRhdGFzZXQgdXNlZCBmb3IgbGF0ZXIKICAgICAgICAgKi8KICAgICAgICBzZXRTZXJpZXNNZXRhZGF0YShuYW1lLCBtZXRhKSB7CiAgICAgICAgICAgIHRoaXMuX3Nlcmllc01ldGFkYXRhQ2FjaGVbbmFtZV0gPSBtZXRhOwogICAgICAgICAgICBpZiAodGhpcy5fY2hhcnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNldFNlcmllc01ldGFkYXRhKG5hbWUsIG1ldGEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbW1pdENoYW5nZXMoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fY2hhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LmNvbW1pdENoYW5nZXMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzZXQgdGhlIGNoYXJ0IGRvbWFpbi4gSWYgdGhlIGNoYXJ0IGhhcyBub3QgcmVuZGVyZWQgeWV0LCBhIGNhbGwgdG8gdGhpcwogICAgICAgICAqIG1ldGhvZCBuby1vcHMuCiAgICAgICAgICovCiAgICAgICAgcmVzZXREb21haW4oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFydCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hhcnQucmVzZXREb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZS1yZW5kZXJzIHRoZSBjaGFydC4gVXNlZnVsIGlmIGUuZy4gdGhlIGNvbnRhaW5lciBzaXplIGNoYW5nZWQuCiAgICAgICAgICovCiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICBpZiAodGhpcy5fY2hhcnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnJlZHJhdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBjaGFydCwgYW5kIGFzeW5jaHJvbm91c2x5IHJlbmRlcnMgaXQuIEZpcmVzIGEgY2hhcnQtcmVuZGVyZWQKICAgICAgICAgKiBldmVudCBhZnRlciB0aGUgY2hhcnQgaXMgcmVuZGVyZWQuCiAgICAgICAgICovCiAgICAgICAgX21ha2VDaGFydCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5jYW5jZWxBc3luYyh0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQpOwogICAgICAgICAgICAgICAgdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQgPSB0aGlzLmFzeW5jKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCA9IG51bGw7CiAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSBhY3R1YWwgeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZC4KICAgICAgICAgICAgICAgIGxldCBub3JtYWxYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kID0gdGhpcy54Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLnhUeXBlICYmICFub3JtYWxYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kKSB7CiAgICAgICAgICAgICAgICAgICAgbm9ybWFsWENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCA9IHN0ZXBYOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodGhpcy54VHlwZSkgewogICAgICAgICAgICAgICAgICAgIG5vcm1hbFhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QgPSAoKSA9PiBnZXRYQ29tcG9uZW50cyh0aGlzLnhUeXBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghbm9ybWFsWENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCB8fAogICAgICAgICAgICAgICAgICAgICF0aGlzLnlWYWx1ZUFjY2Vzc29yIHx8CiAgICAgICAgICAgICAgICAgICAgIXRoaXMudG9vbHRpcENvbHVtbnMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBXZSBkaXJlY3RseSByZWZlcmVuY2UgcHJvcGVydGllcyBvZiBgdGhpc2AgYmVjYXVzZSB0aGlzIGNhbGwgaXMKICAgICAgICAgICAgICAgIC8vIGFzeW5jaHJvbm91cywgYW5kIHZhbHVlcyBtYXkgaGF2ZSBjaGFuZ2VkIGluIGJldHdlZW4gdGhlIGNhbGwgYmVpbmcKICAgICAgICAgICAgICAgIC8vIGluaXRpYXRlZCBhbmQgYWN0dWFsbHkgYmVpbmcgcnVuLgogICAgICAgICAgICAgICAgdmFyIGNoYXJ0ID0gbmV3IExpbmVDaGFydChub3JtYWxYQ29tcG9uZW50c0NyZWF0aW9uTWV0aG9kLCB0aGlzLnlWYWx1ZUFjY2Vzc29yLCB0aGlzLnlTY2FsZVR5cGUsIHRoaXMuY29sb3JTY2FsZSwgdGhpcy4kLnRvb2x0aXAsIHRoaXMudG9vbHRpcENvbHVtbnMsIHRoaXMuZmlsbEFyZWEsIHRoaXMuZGVmYXVsdFhSYW5nZSwgdGhpcy5kZWZhdWx0WVJhbmdlLCB0aGlzLnN5bWJvbEZ1bmN0aW9uLCB0aGlzLnhBeGlzRm9ybWF0dGVyKTsKICAgICAgICAgICAgICAgIHZhciBkaXYgPSBzZWxlY3QodGhpcy4kLmNoYXJ0ZGl2KTsKICAgICAgICAgICAgICAgIGNoYXJ0LnJlbmRlclRvKGRpdik7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2hhcnQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydCA9IGNoYXJ0OwogICAgICAgICAgICAgICAgdGhpcy5fY2hhcnQub25BbmNob3IoKCkgPT4gdGhpcy5maXJlKCdjaGFydC1hdHRhY2hlZCcpKTsKICAgICAgICAgICAgfSwgMzUwKTsKICAgICAgICB9CiAgICAgICAgX3JlbG9hZEZyb21DYWNoZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlLmZvckVhY2goKG5hbWUpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEobmFtZSwgdGhpcy5fc2VyaWVzRGF0YUNhY2hlW25hbWVdIHx8IFtdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZQogICAgICAgICAgICAgICAgLmZpbHRlcigobmFtZSkgPT4gdGhpcy5fc2VyaWVzTWV0YWRhdGFDYWNoZVtuYW1lXSkKICAgICAgICAgICAgICAgIC5mb3JFYWNoKChuYW1lKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5zZXRTZXJpZXNNZXRhZGF0YShuYW1lLCB0aGlzLl9zZXJpZXNNZXRhZGF0YUNhY2hlW25hbWVdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNldFZpc2libGVTZXJpZXModGhpcy5fdmlzaWJsZVNlcmllc0NhY2hlKTsKICAgICAgICAgICAgdGhpcy5fY2hhcnQuY29tbWl0Q2hhbmdlcygpOwogICAgICAgIH0KICAgICAgICBfc21vb3RoaW5nQ2hhbmdlZCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9jaGFydCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKHRoaXMuc21vb3RoaW5nRW5hYmxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hhcnQuc21vb3RoaW5nVXBkYXRlKHRoaXMuc21vb3RoaW5nV2VpZ2h0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNtb290aGluZ0Rpc2FibGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfb3V0bGllcnNDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2NoYXJ0KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9jaGFydC5pZ25vcmVZT3V0bGllcnModGhpcy5pZ25vcmVZT3V0bGllcnMpOwogICAgICAgIH0KICAgICAgICBfY29sb3JTY2FsZUNoYW5nZWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fY2hhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNldENvbG9yU2NhbGUodGhpcy5jb2xvclNjYWxlKTsKICAgICAgICAgICAgdGhpcy5fY2hhcnQucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIF90b29sdGlwQ29sdW1uc0NoYW5nZWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fY2hhcnQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNldFRvb2x0aXBDb2x1bW5zKHRoaXMudG9vbHRpcENvbHVtbnMpOwogICAgICAgIH0KICAgICAgICBfdG9vbHRpcFNvcnRpbmdNZXRob2RDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2NoYXJ0KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9jaGFydC5zZXRUb29sdGlwU29ydGluZ01ldGhvZCh0aGlzLnRvb2x0aXBTb3J0aW5nTWV0aG9kKTsKICAgICAgICB9CiAgICAgICAgZ2V0RXhwb3J0ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTGluZUNoYXJ0RXhwb3J0ZXIodGhpcy4kLmNoYXJ0ZGl2KTsKICAgICAgICB9CiAgICB9OwogICAgVnpMaW5lQ2hhcnQyLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGlkPSJjaGFydGRpdiI+PC9kaXY+CiAgICA8dnotY2hhcnQtdG9vbHRpcAogICAgICBpZD0idG9vbHRpcCIKICAgICAgcG9zaXRpb249IltbdG9vbHRpcFBvc2l0aW9uXV0iCiAgICAgIGNvbnRlbnQtY29tcG9uZW50LW5hbWU9InZ6LWxpbmUtY2hhcnQtdG9vbHRpcCIKICAgID48L3Z6LWNoYXJ0LXRvb2x0aXA+CiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlIGluY2x1ZGU9InZ6LXBhbi16b29tLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgICBkaXYgewogICAgICAgIC13ZWJraXQtdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1vei11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgIH0KCiAgICAgICNjaGFydGRpdiAubWFpbiB7CiAgICAgICAgY29udGFpbjogc3RyaWN0OwogICAgICAgIGN1cnNvcjogY3Jvc3NoYWlyOwogICAgICB9CgogICAgICA6aG9zdCgucGFua2V5KSAjY2hhcnRkaXYgOm5vdCguZHJhZy16b29taW5nKSAubWFpbiB7CiAgICAgICAgY3Vyc29yOiAtd2Via2l0LWdyYWI7CiAgICAgICAgY3Vyc29yOiBncmFiOwogICAgICB9CgogICAgICA6aG9zdCgubW91c2Vkb3duKSAjY2hhcnRkaXYgLnBhbm5pbmcgLm1haW4gewogICAgICAgIGN1cnNvcjogLXdlYmtpdC1ncmFiYmluZzsKICAgICAgICBjdXJzb3I6IGdyYWJiaW5nOwogICAgICB9CgogICAgICAjY2hhcnRkaXYgewogICAgICAgIGNvbnRhaW46IHN0cmljdDsKICAgICAgfQoKICAgICAgI2NoYXJ0ZGl2IGxpbmUuZ3VpZGUtbGluZSB7CiAgICAgICAgc3Ryb2tlOiAjOTk5OwogICAgICAgIHN0cm9rZS13aWR0aDogMS41cHg7CiAgICAgIH0KICAgICAgI2NoYXJ0ZGl2OmhvdmVyIC5tYWluIHsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBzcmMkMi5TY2FsZXMuQ29sb3IpCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiY29sb3JTY2FsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgInN5bWJvbEZ1bmN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJzbW9vdGhpbmdFbmFibGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgInNtb290aGluZ1dlaWdodCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJ4VHlwZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbikKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJ4QXhpc0Zvcm1hdHRlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgInlWYWx1ZUFjY2Vzc29yIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJ0b29sdGlwQ29sdW1ucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJmaWxsQXJlYSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiZGVmYXVsdFhSYW5nZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiZGVmYXVsdFlSYW5nZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJ5U2NhbGVUeXBlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiaWdub3JlWU91dGxpZXJzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgInRvb2x0aXBTb3J0aW5nTWV0aG9kIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgInRvb2x0aXBQb3NpdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJfY2hhcnQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgIl92aXNpYmxlU2VyaWVzQ2FjaGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiX3Nlcmllc0RhdGFDYWNoZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJfc2VyaWVzTWV0YWRhdGFDYWNoZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJfbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2QnLCAneFR5cGUnLCAneVZhbHVlQWNjZXNzb3InLCAneVNjYWxlVHlwZScsICdpc0F0dGFjaGVkJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiX21ha2VDaGFydCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX2NoYXJ0JywgJ192aXNpYmxlU2VyaWVzQ2FjaGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJfcmVsb2FkRnJvbUNhY2hlIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdzbW9vdGhpbmdFbmFibGVkJywgJ3Ntb290aGluZ1dlaWdodCcsICdfY2hhcnQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJfc21vb3RoaW5nQ2hhbmdlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnaWdub3JlWU91dGxpZXJzJywgJ19jaGFydCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVnpMaW5lQ2hhcnQyLnByb3RvdHlwZSwgIl9vdXRsaWVyc0NoYW5nZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ2NvbG9yU2NhbGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFZ6TGluZUNoYXJ0Mi5wcm90b3R5cGUsICJfY29sb3JTY2FsZUNoYW5nZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3Rvb2x0aXBDb2x1bW5zJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiX3Rvb2x0aXBDb2x1bW5zQ2hhbmdlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgndG9vbHRpcFNvcnRpbmdNZXRob2QnLCAnX2NoYXJ0JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBWekxpbmVDaGFydDIucHJvdG90eXBlLCAiX3Rvb2x0aXBTb3J0aW5nTWV0aG9kQ2hhbmdlZCIsIG51bGwpOwogICAgVnpMaW5lQ2hhcnQyID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndnotbGluZS1jaGFydDInKQogICAgXSwgVnpMaW5lQ2hhcnQyKTsKICAgIGxldCBWekxpbmVDaGFydFRvb2x0aXAgPSBjbGFzcyBWekxpbmVDaGFydFRvb2x0aXAgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICB9OwogICAgVnpMaW5lQ2hhcnRUb29sdGlwLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGNsYXNzPSJjb250ZW50Ij4KICAgICAgPHRhYmxlPgogICAgICAgIDx0aGVhZD48L3RoZWFkPgogICAgICAgIDx0Ym9keT48L3Rib2R5PgogICAgICA8L3RhYmxlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgLmNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6IHJnYmEoMCwgMCwgMCwgMC44KTsKICAgICAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgdGFibGUgewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBsaW5lLWhlaWdodDogMS40ZW07CiAgICAgICAgbWFyZ2luLXRvcDogMTBweDsKICAgICAgICBwYWRkaW5nOiA4cHg7CiAgICAgIH0KCiAgICAgIHRoZWFkIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIH0KCiAgICAgIHRib2R5IHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIxcHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQoKICAgICAgdGQgewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICB9CgogICAgICAuc3dhdGNoIHsKICAgICAgICBib3JkZXItcmFkaXVzOiA1MCU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxOHB4OwogICAgICAgIHdpZHRoOiAxOHB4OwogICAgICB9CgogICAgICAuY2xvc2VzdCAuc3dhdGNoIHsKICAgICAgICBib3gtc2hhZG93OiBpbnNldCAwIDAgMCAycHggI2ZmZjsKICAgICAgfQoKICAgICAgdGggewogICAgICAgIHBhZGRpbmc6IDAgNXB4OwogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5kaXN0YW50IHRkOm5vdCguc3dhdGNoKSB7CiAgICAgICAgb3BhY2l0eTogMC44OwogICAgICB9CgogICAgICAuZ2hvc3QgewogICAgICAgIG9wYWNpdHk6IDAuMjsKICAgICAgICBzdHJva2Utd2lkdGg6IDFweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgVnpMaW5lQ2hhcnRUb29sdGlwID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndnotbGluZS1jaGFydC10b29sdGlwJykKICAgIF0sIFZ6TGluZUNoYXJ0VG9vbHRpcCk7CgogICAgLy8gVGhlIGNoYXJ0IGNhbiBzb21ldGltZXMgZ2V0IGluIGEgYmFkIHN0YXRlLCB3aGVuIGl0IHJlZHJhd3Mgd2hpbGUKICAgIC8vIGl0IGlzIGRpc3BsYXk6IG5vbmUgZHVlIHRvIHRoZSB1c2VyIGhhdmluZyBzd2l0Y2hlZCB0byBhIGRpZmZlcmVudAogICAgLy8gcGFnZS4gVGhpcyBjb2RlIGltcGxlbWVudHMgYSBjYXNjYWRpbmcgcXVldWUgdG8gcmVkcmF3IHRoZSBiYWQgY2hhcnRzCiAgICAvLyBvbmUtYnktb25lIG9uY2UgdGhleSBhcmUgYWN0aXZlIGFnYWluLgogICAgLy8gV2UgdXNlIGEgY2FzY2FkaW5nIHF1ZXVlIGJlY3Vhc2Ugd2UgZG9uJ3Qgd2FudCB0byBibG9jayB0aGUgVUkgLyBtYWtlIHRoZQogICAgLy8gcmlwcGxlcyB2ZXJ5IHNsb3cgd2hpbGUgZXZlcnl0aGluZyBzeW5jaHJvbm91c2x5IHJlZHJhd3MuCiAgICBjb25zdCByZWRyYXdRdWV1ZSA9IFtdOwogICAgbGV0IHJlZHJhd1JhZiA9IDA7CiAgICBjb25zdCBjYXNjYWRpbmdSZWRyYXcgPSBsb2Rhc2gudGhyb3R0bGUoZnVuY3Rpb24gaW50ZXJuYWxSZWRyYXcoKSB7CiAgICAgICAgaWYgKHJlZHJhd1F1ZXVlLmxlbmd0aCA9PSAwKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgeCA9IHJlZHJhd1F1ZXVlLnNoaWZ0KCk7CiAgICAgICAgaWYgKHggJiYgeC5hY3RpdmUpIHsKICAgICAgICAgICAgeC5yZWRyYXcoKTsKICAgICAgICAgICAgeC5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lKHJlZHJhd1JhZik7CiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZShpbnRlcm5hbFJlZHJhdyk7CiAgICB9LCAxMDApOwogICAgLy8gQSBjb21wb25lbnQgdGhhdCBmZXRjaGVzIGRhdGEgZnJvbSB0aGUgVGVuc29yQm9hcmQgc2VydmVyIGFuZCByZW5kZXJzIGl0IGludG8KICAgIC8vIGEgdnotbGluZS1jaGFydC4KICAgIGxldCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyID0gY2xhc3MgX1RmTGluZUNoYXJ0RGF0YUxvYWRlciBleHRlbmRzIERhdGFMb2FkZXJCZWhhdmlvcihMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpKSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3JlZHJhd1JhZiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMubG9nU2NhbGVBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jb2xvclNjYWxlID0geyBzY2FsZTogcnVuc0NvbG9yU2NhbGUgfTsKICAgICAgICAgICAgdGhpcy5fcmVzZXREb21haW5Pbk5leHRMb2FkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fbWF5YmVSZW5kZXJlZEluQmFkU3RhdGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgb25Mb2FkRmluaXNoKCkgewogICAgICAgICAgICB0aGlzLmNvbW1pdENoYW5nZXMoKTsKICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVRvTG9hZC5sZW5ndGggPiAwICYmIHRoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZCkgewogICAgICAgICAgICAgICAgLy8gKERvbid0IHVuc2V0IF9yZXNldERvbWFpbk9uTmV4dExvYWQgd2hlbiB3ZSBkaWRuJ3QKICAgICAgICAgICAgICAgIC8vIGxvYWQgYW55IHJ1bnM6IHRoaXMgaGFzIHRoZSBlZmZlY3QgdGhhdCBpZiBhbGwgb3VyCiAgICAgICAgICAgICAgICAvLyBydW5zIGFyZSBkZXNlbGVjdGVkLCB0aGVuIHdlIHRvZ2dsZSB0aGVtIGFsbCBvbiwgd2UKICAgICAgICAgICAgICAgIC8vIHByb3Blcmx5IHNpemUgdGhlIGRvbWFpbiBvbmNlIGFsbCB0aGUgZGF0YSBpcyBsb2FkZWQKICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YganVzdCB3aGVuIHdlJ3JlIGZpcnN0IHJlbmRlcmVkLikKICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0RG9tYWluT25OZXh0TG9hZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5nZXRDaGFydCgpLnJlc2V0RG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9yZWRyYXdSYWYgIT09IG51bGwpCiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9yZWRyYXdSYWYpOwogICAgICAgIH0KICAgICAgICBleHBvcnRBc1N2Z1N0cmluZygpIHsKICAgICAgICAgICAgY29uc3QgZXhwb3J0ZXIgPSB0aGlzLmdldENoYXJ0KCkuZ2V0RXhwb3J0ZXIoKTsKICAgICAgICAgICAgcmV0dXJuIGV4cG9ydGVyLmV4cG9ydEFzU3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIGdldENoYXJ0KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy4kLmNoYXJ0OwogICAgICAgIH0KICAgICAgICByZXNldERvbWFpbigpIHsKICAgICAgICAgICAgdGhpcy5nZXRDaGFydCgpLnJlc2V0RG9tYWluKCk7CiAgICAgICAgfQogICAgICAgIHNldFNlcmllc0RhdGEobmFtZSwgZGF0YSkgewogICAgICAgICAgICB0aGlzLmdldENoYXJ0KCkuc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKTsKICAgICAgICB9CiAgICAgICAgc2V0U2VyaWVzTWV0YWRhdGEobmFtZSwgbWV0YWRhdGEpIHsKICAgICAgICAgICAgdGhpcy5nZXRDaGFydCgpLnNldFNlcmllc01ldGFkYXRhKG5hbWUsIG1ldGFkYXRhKTsKICAgICAgICB9CiAgICAgICAgY29tbWl0Q2hhbmdlcygpIHsKICAgICAgICAgICAgdGhpcy5nZXRDaGFydCgpLmNvbW1pdENoYW5nZXMoKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICBpZiAodGhpcy5fcmVkcmF3UmFmICE9PSBudWxsKQogICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fcmVkcmF3UmFmKTsKICAgICAgICAgICAgdGhpcy5fcmVkcmF3UmFmID0gd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmdldENoYXJ0KCkucmVkcmF3KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcG9pbnQgd2hlcmUgd2Ugc2hvdWxkIHJlbmRlciB3aGlsZSB0aGUgcGFnZQogICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vdCBhY3RpdmUsIHdlJ3ZlIGdvdHRlbiBpbnRvIGEgYmFkIHN0YXRlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9sb2FkS2V5Q2hhbmdlZCgpIHsKICAgICAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgICAgICB0aGlzLl9yZXNldERvbWFpbk9uTmV4dExvYWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBfZGF0YVNlcmllc0NoYW5nZWQoKSB7CiAgICAgICAgICAgIC8vIFNldHRpbmcgdmlzaWJsZSBzZXJpZXMgcmVkcmF3cyB0aGUgY2hhcnQuCiAgICAgICAgICAgIHRoaXMuZ2V0Q2hhcnQoKS5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuZGF0YVNlcmllcyk7CiAgICAgICAgfQogICAgICAgIF9sb2dTY2FsZUNoYW5nZWQobG9nU2NhbGVBY3RpdmUpIHsKICAgICAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLmdldENoYXJ0KCk7CiAgICAgICAgICAgIGNoYXJ0LnlTY2FsZVR5cGUgPSBsb2dTY2FsZUFjdGl2ZSA/IFlTY2FsZVR5cGUuTE9HIDogWVNjYWxlVHlwZS5MSU5FQVI7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIF9maXhCYWRTdGF0ZVdoZW5BY3RpdmUoKSB7CiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNoYXJ0IGVudGVycyBhIHBvdGVudGlhbGx5IGJhZCBzdGF0ZSAoYmVjYXVzZSBpdCBzaG91bGQKICAgICAgICAgICAgLy8gcmVkcmF3LCBidXQgdGhlIHBhZ2UgaXMgbm90IGN1cnJlbnRseSBhY3RpdmUpLCB3ZSBzZXQgdGhlCiAgICAgICAgICAgIC8vIF9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSBmbGFnLiBXaGVuZXZlciB0aGUgY2hhcnQgYmVjb21lcyBhY3RpdmUsCiAgICAgICAgICAgIC8vIHdlIHRlc3QgdGhpcyBhbmQgc2NoZWR1bGUgYSByZWRyYXcgb2YgdGhlIGJhZCBjaGFydHMuCiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSAmJiB0aGlzLl9tYXliZVJlbmRlcmVkSW5CYWRTdGF0ZSkgewogICAgICAgICAgICAgICAgcmVkcmF3UXVldWUucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIGNhc2NhZGluZ1JlZHJhdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9vbkNoYXJ0QXR0YWNoZWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5hY3RpdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGlkPSJjaGFydC1hbmQtc3Bpbm5lci1jb250YWluZXIiPgogICAgICA8dnotbGluZS1jaGFydDIKICAgICAgICBpZD0iY2hhcnQiCiAgICAgICAgZGF0YS1sb2FkaW5nJD0iW1tkYXRhTG9hZGluZ11dIgogICAgICAgIGNvbG9yLXNjYWxlPSJbW2NvbG9yU2NhbGVdXSIKICAgICAgICBkZWZhdWx0LXgtcmFuZ2U9IltbZGVmYXVsdFhSYW5nZV1dIgogICAgICAgIGRlZmF1bHQteS1yYW5nZT0iW1tkZWZhdWx0WVJhbmdlXV0iCiAgICAgICAgZmlsbC1hcmVhPSJbW2ZpbGxBcmVhXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgb24tY2hhcnQtYXR0YWNoZWQ9Il9vbkNoYXJ0QXR0YWNoZWQiCiAgICAgICAgc21vb3RoaW5nLWVuYWJsZWQ9Iltbc21vb3RoaW5nRW5hYmxlZF1dIgogICAgICAgIHNtb290aGluZy13ZWlnaHQ9Iltbc21vb3RoaW5nV2VpZ2h0XV0iCiAgICAgICAgc3ltYm9sLWZ1bmN0aW9uPSJbW3N5bWJvbEZ1bmN0aW9uXV0iCiAgICAgICAgdG9vbHRpcC1jb2x1bW5zPSJbW3Rvb2x0aXBDb2x1bW5zXV0iCiAgICAgICAgdG9vbHRpcC1wb3NpdGlvbj0iW1t0b29sdGlwUG9zaXRpb25dXSIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC1jb21wb25lbnRzLWNyZWF0aW9uLW1ldGhvZD0iW1t4Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgICAgeS12YWx1ZS1hY2Nlc3Nvcj0iW1t5VmFsdWVBY2Nlc3Nvcl1dIgogICAgICA+PC92ei1saW5lLWNoYXJ0Mj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2RhdGFMb2FkaW5nXV0iPgogICAgICAgIDxkaXYgaWQ9ImxvYWRpbmctc3Bpbm5lci1jb250YWluZXIiPgogICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmU9IiI+PC9wYXBlci1zcGlubmVyLWxpdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtfbWF5YmUtcmVuZGVyZWQtaW4tYmFkLXN0YXRlXSkgdnotbGluZS1jaGFydCB7CiAgICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICB9CgogICAgICAjY2hhcnQtYW5kLXNwaW5uZXItY29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNsb2FkaW5nLXNwaW5uZXItY29udGFpbmVyIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7CiAgICAgICAgbGVmdDogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgcmlnaHQ6IDA7CiAgICAgICAgdG9wOiAwOwogICAgICB9CgogICAgICB2ei1saW5lLWNoYXJ0MiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICB9CgogICAgICB2ei1saW5lLWNoYXJ0MltkYXRhLWxvYWRpbmddIHsKICAgICAgICBvcGFjaXR5OiAwLjM7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfZml4QmFkU3RhdGVXaGVuQWN0aXZlJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnByb3RvdHlwZSwgImFjdGl2ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnByb3RvdHlwZSwgImRhdGFTZXJpZXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBSZXF1ZXN0TWFuYWdlcikKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAicmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBvYnNlcnZlcjogJ19sb2dTY2FsZUNoYW5nZWQnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAibG9nU2NhbGVBY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnByb3RvdHlwZSwgInhDb21wb25lbnRzQ3JlYXRpb25NZXRob2QiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnByb3RvdHlwZSwgInhUeXBlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnByb3RvdHlwZSwgInlWYWx1ZUFjY2Vzc29yIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJmaWxsQXJlYSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJzbW9vdGhpbmdFbmFibGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJzbW9vdGhpbmdXZWlnaHQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJ0b29sdGlwQ29sdW1ucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAidG9vbHRpcFNvcnRpbmdNZXRob2QiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyLnByb3RvdHlwZSwgInRvb2x0aXBQb3NpdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJpZ25vcmVZT3V0bGllcnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJkZWZhdWx0WFJhbmdlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAiZGVmYXVsdFlSYW5nZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJzeW1ib2xGdW5jdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAiY29sb3JTY2FsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgX1RmTGluZUNoYXJ0RGF0YUxvYWRlci5wcm90b3R5cGUsICJfcmVzZXREb21haW5Pbk5leHRMb2FkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAiX21heWJlUmVuZGVyZWRJbkJhZFN0YXRlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ2xvYWRLZXknKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAiX2xvYWRLZXlDaGFuZ2VkIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdkYXRhU2VyaWVzLionKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIF9UZkxpbmVDaGFydERhdGFMb2FkZXIucHJvdG90eXBlLCAiX2RhdGFTZXJpZXNDaGFuZ2VkIiwgbnVsbCk7CiAgICBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcicpCiAgICBdLCBfVGZMaW5lQ2hhcnREYXRhTG9hZGVyKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHJlZ2lzdGVyU3R5bGVEb21Nb2R1bGUoewogICAgICAgIG1vZHVsZU5hbWU6ICd0Zi1jdXN0b20tc2NhbGFyLWNhcmQtc3R5bGUnLAogICAgICAgIHN0eWxlQ29udGVudDogYAogICAgOmhvc3QgewogICAgICBtYXJnaW46IDVweCAxMHB4OwogICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIHdpZHRoOiAzMzBweDsKICAgICAgdmVydGljYWwtYWxpZ246IHRleHQtdG9wOwogICAgfQoKICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICBoZWlnaHQ6IDQwMHB4OwogICAgfQoKICAgIGgxIHsKICAgICAgZm9udC1zaXplOiAxOXB4OwogICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgfQoKICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgIGhlaWdodDogMjAwcHg7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgICNidXR0b25zIHsKICAgICAgZGlzcGxheTogZmxleDsKICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgIH0KCiAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICB3aWR0aDogMzJweDsKICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICBwYWRkaW5nOiA0cHg7CiAgICB9CgogICAgcGFwZXItaWNvbi1idXR0b25bc2VsZWN0ZWRdIHsKICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgIH0KCiAgICAuZG93bmxvYWQtbGlua3MgewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICBoZWlnaHQ6IDMycHg7CiAgICB9CgogICAgLmRvd25sb2FkLWxpbmtzIGEgewogICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgIGFsaWduLXNlbGY6IGNlbnRlcjsKICAgICAgbWFyZ2luOiAycHg7CiAgICB9CgogICAgLmRvd25sb2FkLWxpbmtzIHBhcGVyLWRyb3Bkb3duLW1lbnUgewogICAgICB3aWR0aDogMTAwcHg7CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICB9CiAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICB9CiAgICB9CiAgYCwKICAgIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDE3IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIGRhdGEgc2VyaWVzIGZvciBhIGN1c3RvbSBzY2FsYXJzIGNoYXJ0LgogICAgICovCiAgICBjbGFzcyBEYXRhU2VyaWVzIHsKICAgICAgICBjb25zdHJ1Y3RvcihydW4sIHRhZywgbmFtZSwgc2NhbGFyRGF0YSwgc3ltYm9sKSB7CiAgICAgICAgICAgIHRoaXMucnVuID0gcnVuOwogICAgICAgICAgICB0aGlzLnRhZyA9IHRhZzsKICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKICAgICAgICAgICAgdGhpcy5zY2FsYXJEYXRhID0gc2NhbGFyRGF0YTsKICAgICAgICAgICAgdGhpcy5zeW1ib2wgPSBzeW1ib2w7CiAgICAgICAgfQogICAgICAgIGdldE5hbWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5hbWU7CiAgICAgICAgfQogICAgICAgIHNldERhdGEoc2NhbGFyRGF0YSkgewogICAgICAgICAgICB0aGlzLnNjYWxhckRhdGEgPSBzY2FsYXJEYXRhOwogICAgICAgIH0KICAgICAgICBnZXREYXRhKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zY2FsYXJEYXRhOwogICAgICAgIH0KICAgICAgICBnZXRSdW4oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJ1bjsKICAgICAgICB9CiAgICAgICAgZ2V0VGFnKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy50YWc7CiAgICAgICAgfQogICAgICAgIGdldFN5bWJvbCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3ltYm9sOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGdlbmVyYXRlRGF0YVNlcmllc05hbWUocnVuLCB0YWcpIHsKICAgICAgICByZXR1cm4gYCR7dGFnfSAoJHtydW59KWA7CiAgICB9CiAgICAvKioKICAgICAqIEEgY29sb3Igc2NhbGUgdGhhdCB3cmFwcyB0aGUgdXN1YWwgY29sb3Igc2NhbGUgdGhhdCByZWxpZXMgb24gcnVucy4gVGhpcwogICAgICogcGFydGljdWxhciBjb2xvciBzY2FsZSBwYXJzZXMgdGhlIHJ1biBmcm9tIGEgc2VyaWVzIG5hbWUgYW5kIGRlZmVycyB0byB0aGF0CiAgICAgKiBmb3JtZXIgY29sb3Igc2NhbGUuCiAgICAgKi8KICAgIGNsYXNzIERhdGFTZXJpZXNDb2xvclNjYWxlIHsKICAgICAgICBjb25zdHJ1Y3RvcihydW5CYXNlZENvbG9yU2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5ydW5CYXNlZENvbG9yU2NhbGUgPSBydW5CYXNlZENvbG9yU2NhbGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE9idGFpbnMgdGhlIGNvcnJlY3QgY29sb3IgYmFzZWQgb24gdGhlIHJ1bi4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGF0YVNlcmllcwogICAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGNvbG9yLgogICAgICAgICAqLwogICAgICAgIHNjYWxlKGRhdGFTZXJpZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucnVuQmFzZWRDb2xvclNjYWxlLnNjYWxlKHRoaXMucGFyc2VSdW5OYW1lKGRhdGFTZXJpZXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUGFyc2VzIHRoZSBydW4gbmFtZSBmcm9tIGEgZGF0YSBzZXJpZXMgc3RyaW5nLiBSZXR1cm5zIHRoZSBlbXB0eSBzdHJpbmcgaWYKICAgICAgICAgKiBwYXJzaW5nIGZhaWxzLgogICAgICAgICAqLwogICAgICAgIHBhcnNlUnVuTmFtZShkYXRhU2VyaWVzKSB7CiAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gZGF0YVNlcmllcy5tYXRjaCgvXCgoLiopXCkkLyk7CiAgICAgICAgICAgIGlmICghbWF0Y2gpIHsKICAgICAgICAgICAgICAgIC8vIE5vIG1hdGNoIGZvdW5kLgogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtYXRjaFsxXTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkID0gY2xhc3MgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fY29sb3JTY2FsZSA9IG5ldyBEYXRhU2VyaWVzQ29sb3JTY2FsZSh7CiAgICAgICAgICAgICAgICBzY2FsZTogcnVuc0NvbG9yU2NhbGUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9uYW1lVG9EYXRhU2VyaWVzID0ge307CiAgICAgICAgICAgIHRoaXMuX2V4cGFuZGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3REYXRhID0gKGl0ZW1zLCBvbkxvYWQsIG9uRmluaXNoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXIgPSBnZXRSb3V0ZXIoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSByb3V0ZXIucGx1Z2luUm91dGUoJ2N1c3RvbV9zY2FsYXJzJywgJy9zY2FsYXJzJyk7CiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChpdGVtcy5tYXAoKGl0ZW0pID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSBpdGVtOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMuX3RhZ0ZpbHRlcjsKICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBhZGRQYXJhbXMoYmFzZVVybCwgeyB0YWcsIHJ1biB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCh1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB2b2lkIG9uTG9hZCh7IGl0ZW0sIGRhdGEgfSkpOwogICAgICAgICAgICAgICAgfSkpLmZpbmFsbHkoKCkgPT4gdm9pZCBvbkZpbmlzaCgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXggPSB7fTsKICAgICAgICAgICAgdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZmlsbEFyZWEgPSB7CiAgICAgICAgICAgICAgICBsb3dlckFjY2Vzc29yOiAoZCkgPT4gZC5sb3dlciwKICAgICAgICAgICAgICAgIGhpZ2hlckFjY2Vzc29yOiAoZCkgPT4gZC51cHBlciwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fdG9vbHRpcENvbHVtbnMgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgdmFsdWVGb3JtYXR0ZXIgPSBtdWx0aXNjYWxlRm9ybWF0dGVyKFlfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKTsKICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdFZhbHVlT3JOYU4gPSAoeCkgPT4gKGlzTmFOKHgpID8gJ05hTicgOiB2YWx1ZUZvcm1hdHRlcih4KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdOYW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBkLmRhdGFzZXQubWV0YWRhdGEoKS5uYW1lLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1ZhbHVlJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBmb3JtYXRWYWx1ZU9yTmFOKGQuZGF0dW0uc2NhbGFyKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdMb3dlciBNYXJnaW4nLAogICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IGZvcm1hdFZhbHVlT3JOYU4oZC5kYXR1bS5sb3dlciksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnVXBwZXIgTWFyZ2luJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBmb3JtYXRWYWx1ZU9yTmFOKGQuZGF0dW0udXBwZXIpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1N0ZXAnLAogICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IHN0ZXBGb3JtYXR0ZXIoZC5kYXR1bS5zdGVwKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdUaW1lJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiB0aW1lRm9ybWF0dGVyKGQuZGF0dW0ud2FsbF90aW1lKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdSZWxhdGl2ZScsCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlOiAoZCkgPT4gcmVsYXRpdmVGb3JtYXR0ZXIocmVsYXRpdmVBY2Nlc3NvcihkLmRhdHVtLCAtMSwgZC5kYXRhc2V0KSksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIHRoaXMuX21pc3NpbmdUYWdzID0gW107CiAgICAgICAgICAgIHRoaXMuX21pc3NpbmdUYWdzQ29sbGFwc2libGVPcGVuZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmVsb2FkKCkgewogICAgICAgICAgICB0aGlzLiQubG9hZGVyLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICByZWRyYXcoKSB7CiAgICAgICAgICAgIHRoaXMuJC5sb2FkZXIucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIF90b2dnbGVFeHBhbmRlZChlKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfZXhwYW5kZWQnLCAhdGhpcy5fZXhwYW5kZWQpOwogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlTG9nU2NhbGUoKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfbG9nU2NhbGVBY3RpdmUnLCAhdGhpcy5fbG9nU2NhbGVBY3RpdmUpOwogICAgICAgIH0KICAgICAgICBfcmVzZXREb21haW4oKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXJ0ID0gdGhpcy4kLmxvYWRlcjsKICAgICAgICAgICAgaWYgKGNoYXJ0KSB7CiAgICAgICAgICAgICAgICBjaGFydC5yZXNldERvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jc3ZVcmwoX25hbWVUb0RhdGFTZXJpZXMsIGRhdGFTZXJpZXNOYW1lKSB7CiAgICAgICAgICAgIGlmICghZGF0YVNlcmllc05hbWUpCiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSB0aGlzLl9kb3dubG9hZERhdGFVcmwoX25hbWVUb0RhdGFTZXJpZXMsIGRhdGFTZXJpZXNOYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGFkZFBhcmFtcyhiYXNlVXJsLCB7IGZvcm1hdDogJ2NzdicgfSk7CiAgICAgICAgfQogICAgICAgIF9qc29uVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBkYXRhU2VyaWVzTmFtZSkgewogICAgICAgICAgICBpZiAoIWRhdGFTZXJpZXNOYW1lKQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gdGhpcy5fZG93bmxvYWREYXRhVXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBkYXRhU2VyaWVzTmFtZSk7CiAgICAgICAgICAgIHJldHVybiBhZGRQYXJhbXMoYmFzZVVybCwgeyBmb3JtYXQ6ICdqc29uJyB9KTsKICAgICAgICB9CiAgICAgICAgX2Rvd25sb2FkRGF0YVVybChfbmFtZVRvRGF0YVNlcmllcywgZGF0YVNlcmllc05hbWUpIHsKICAgICAgICAgICAgY29uc3QgZGF0YVNlcmllcyA9IF9uYW1lVG9EYXRhU2VyaWVzW2RhdGFTZXJpZXNOYW1lXTsKICAgICAgICAgICAgY29uc3QgZ2V0VmFycyA9IHsKICAgICAgICAgICAgICAgIHRhZzogZGF0YVNlcmllcy5nZXRUYWcoKSwKICAgICAgICAgICAgICAgIHJ1bjogZGF0YVNlcmllcy5nZXRSdW4oKSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgcmV0dXJuIGFkZFBhcmFtcyhnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnY3VzdG9tX3NjYWxhcnMnLCAnL2Rvd25sb2FkX2RhdGEnKSwgZ2V0VmFycyk7CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKG1hcmdpbkNoYXJ0U2VyaWVzKSB7CiAgICAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gZGF0YSBpcyByZWNlaXZlZCBmcm9tIHRoZSBiYWNrZW5kLgogICAgICAgICAgICByZXR1cm4gKHNjYWxhckNoYXJ0LCBydW4sIGRhdGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICghZGF0YS5yZWdleF92YWxpZCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgY29uc3RydWN0ZWQgZnJvbSBmcm9udGVuZCBsb2dpYyB0aGF0CiAgICAgICAgICAgICAgICAgICAgLy8gcGllY2VzIHRvZ2V0aGVyIGRpZmZlcmVudCB0YWdzLiBIZW5jZSwgdGhpcyBjYXNlIHNob3VsZCBuZXZlciBiZQogICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoZWQgaWYgdGhlIGRhc2hib2FyZCBiZWhhdmVzIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3RhZ0ZpbHRlckludmFsaWQnLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUaGUgdXNlcidzIHJlZ3VsYXIgZXhwcmVzc2lvbiB3YXMgdmFsaWQuCiAgICAgICAgICAgICAgICAvLyBJbmNvcnBvcmF0ZSB0aGVzZSBuZXdseSBsb2FkZWQgdmFsdWVzLgogICAgICAgICAgICAgICAgY29uc3QgbmV3TWFwcGluZyA9IGxvZGFzaC5jbG9uZSh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKTsKICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NOb3RGb3VuZCA9IFtdOwogICAgICAgICAgICAgICAgbG9kYXNoLmZvckVhY2gobWFyZ2luQ2hhcnRTZXJpZXMsICh0YWdzT2JqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRhZ05vdEZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NhbGFyRXZlbnRzID0gZGF0YS50YWdfdG9fZXZlbnRzW3RhZ3NPYmplY3QudmFsdWVdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQm91bmRzID0gZGF0YS50YWdfdG9fZXZlbnRzW3RhZ3NPYmplY3QubG93ZXJdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwcGVyQm91bmRzID0gZGF0YS50YWdfdG9fZXZlbnRzW3RhZ3NPYmplY3QudXBwZXJdOwogICAgICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGRhdGEgaXMgZm91bmQgZm9yIGVhY2ggb2YgdGhlIHRhZ3MuCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvZGFzaC5pc1VuZGVmaW5lZChzY2FsYXJFdmVudHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NOb3RGb3VuZC5wdXNoKHRhZ3NPYmplY3QudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0YWdOb3RGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNVbmRlZmluZWQobG93ZXJCb3VuZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NOb3RGb3VuZC5wdXNoKHRhZ3NPYmplY3QubG93ZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0YWdOb3RGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNVbmRlZmluZWQodXBwZXJCb3VuZHMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ3NOb3RGb3VuZC5wdXNoKHRhZ3NPYmplY3QudXBwZXIpOwogICAgICAgICAgICAgICAgICAgICAgICB0YWdOb3RGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IG9uZSBvZiB0aGUgdGFncyBsYWNrcyBkYXRhLiBXZSB0ZXJtaW5hdGUgZWFybHkgYmVjYXVzZQogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsaW5lIGNoYXJ0IHJlcXVpcmVzIGFsbCAzIHBpZWNlcyBvZiBkYXRhICh2YWx1ZSwgbG93ZXIgYm91bmQsCiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVwcGVyIGJvdW5kKS4KICAgICAgICAgICAgICAgICAgICBpZiAodGFnTm90Rm91bmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCBzdGVwcyBmb3IgYWxsIHRoZSBsaXN0cyBjb3JyZXNwb25kIHdpdGggZWFjaAogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyLiBPdGhlcndpc2UsIGRpc3BsYXkgYW4gZXJyb3IgbWVzc2FnZS4KICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnRhaW5TdGVwID0gKGRhdHVtKSA9PiBkYXR1bVsxXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwc01pc21hdGNoID0gdGhpcy5fZmluZFN0ZXBNaXNtYXRjaCh0YWdzT2JqZWN0LCBzY2FsYXJFdmVudHMubWFwKG9idGFpblN0ZXApLCBsb3dlckJvdW5kcy5tYXAob2J0YWluU3RlcCksIHVwcGVyQm91bmRzLm1hcChvYnRhaW5TdGVwKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0ZXBzTWlzbWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19zdGVwc01pc21hdGNoJywgc3RlcHNNaXNtYXRjaCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGRhdGEgcG9pbnRzIHRoYXQgdGhlIGxpbmUgY2hhcnQgY2FuIHBhcnNlLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9idGFpbk51bWJlciA9IChkYXR1bSkgPT4gZGF0dW1bMl07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVBvaW50cyA9IHNjYWxhckV2ZW50cy5tYXAoKGRhdHVtLCBpKSA9PiAoewogICAgICAgICAgICAgICAgICAgICAgICB3YWxsX3RpbWU6IG5ldyBEYXRlKGRhdHVtWzBdICogMTAwMCksCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZXA6IG9idGFpblN0ZXAoZGF0dW0pLAogICAgICAgICAgICAgICAgICAgICAgICBzY2FsYXI6IG9idGFpbk51bWJlcihkYXR1bSksCiAgICAgICAgICAgICAgICAgICAgICAgIGxvd2VyOiBvYnRhaW5OdW1iZXIobG93ZXJCb3VuZHNbaV0pLAogICAgICAgICAgICAgICAgICAgICAgICB1cHBlcjogb2J0YWluTnVtYmVyKHVwcGVyQm91bmRzW2ldKSwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc2VyaWVzIG5hbWUsIHdoaWNoIGlzIGJhc2VkIG9uIGJvdGggdGhlIHJ1biBhbmQgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gdGFnIG9mIHRoZSB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpZXNOYW1lID0gZ2VuZXJhdGVEYXRhU2VyaWVzTmFtZShydW4sIHRhZ3NPYmplY3QudmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmllcyA9IG5ld01hcHBpbmdbc2VyaWVzTmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmllcykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHNlcmllcyBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWVzLnNldERhdGEoZGF0YVBvaW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXJpZXMgPSB0aGlzLl9jcmVhdGVOZXdEYXRhU2VyaWVzKHJ1biwgdGFnc09iamVjdC52YWx1ZSwgc2VyaWVzTmFtZSwgZGF0YVBvaW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld01hcHBpbmdbc2VyaWVzTmFtZV0gPSBzZXJpZXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX25hbWVUb0RhdGFTZXJpZXMnLCBuZXdNYXBwaW5nKTsKICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5SW5kZXggPSBsb2Rhc2guZmluZEluZGV4KHRoaXMuX21pc3NpbmdUYWdzLCAoZW50cnkpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkucnVuID09PSBydW47CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmICh0YWdzTm90Rm91bmQubGVuZ3RoICYmIHRhZ3NOb3RGb3VuZC5sZW5ndGggIT0gMykgewogICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgYnV0IG5vdCBhbGwgdGFncyB3ZXJlIGZvdW5kLiBTaG93IGEgd2FybmluZyBtZXNzYWdlLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gewogICAgICAgICAgICAgICAgICAgICAgICBydW46IHJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgdGFnczogdGFnc05vdEZvdW5kLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgaWYgKGVudHJ5SW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHByZXZpb3VzIGVudHJ5LiBJbnNlcnQgdGhlIG5ldyBvbmUuCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdfbWlzc2luZ1RhZ3MnLCBlbnRyeUluZGV4LCAxLCBlbnRyeSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnNlcnQgYSBuZXcgZW50cnkuCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucHVzaCgnX21pc3NpbmdUYWdzJywgZW50cnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVudHJ5SW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcHJldmlvdXMgZW50cnkgaWYgaXQgZXhpc3RzLgogICAgICAgICAgICAgICAgICAgIHRoaXMuc3BsaWNlKCdfbWlzc2luZ1RhZ3MnLCBlbnRyeUluZGV4LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgX2ZpbmRTdGVwTWlzbWF0Y2godGFnc09iamVjdCwgdmFsdWVTdGVwcywgbG93ZXJTdGVwcywgdXBwZXJTdGVwcykgewogICAgICAgICAgICBpZiAobG9kYXNoLmlzRXF1YWwobG93ZXJTdGVwcywgdmFsdWVTdGVwcykgJiYKICAgICAgICAgICAgICAgIGxvZGFzaC5pc0VxdWFsKHVwcGVyU3RlcHMsIHZhbHVlU3RlcHMpKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBtaXNtYXRjaC4KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzZXJpZXNPYmplY3Q6IHRhZ3NPYmplY3QsCiAgICAgICAgICAgICAgICB2YWx1ZVN0ZXBzOiB2YWx1ZVN0ZXBzLAogICAgICAgICAgICAgICAgbG93ZXJTdGVwczogbG93ZXJTdGVwcywKICAgICAgICAgICAgICAgIHVwcGVyU3RlcHM6IHVwcGVyU3RlcHMsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVOZXdEYXRhU2VyaWVzKHJ1biwgdGFnLCBzZXJpZXNOYW1lLCBkYXRhUG9pbnRzKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBydW4gaGFzIG5vdCBiZWVuIHNlZW4gYmVmb3JlLCBkZWZpbmUgdGhlIG5leHQKICAgICAgICAgICAgLy8gYXZhaWxhYmxlIG1hcmtlciBpbmRleC4KICAgICAgICAgICAgdGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbcnVuXSB8PSAwOwogICAgICAgICAgICAvLyBFdmVyeSBkYXRhIHNlcmllcyB3aXRoaW4gYSBydW4gaGFzIGEgdW5pcXVlIHN5bWJvbC4KICAgICAgICAgICAgY29uc3QgbGluZUNoYXJ0U3ltYm9sID0gU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W3J1bl1dOwogICAgICAgICAgICAvLyBDcmVhdGUgYSBzZXJpZXMgd2l0aCB0aGlzIG5hbWUuCiAgICAgICAgICAgIGNvbnN0IHNlcmllcyA9IG5ldyBEYXRhU2VyaWVzKHJ1biwgdGFnLCBzZXJpZXNOYW1lLCBkYXRhUG9pbnRzLCBsaW5lQ2hhcnRTeW1ib2wpOwogICAgICAgICAgICAvLyBMb29wIGJhY2sgdG8gdGhlIGJlZ2lubmluZyBpZiB3ZSBhcmUgb3V0IG9mIHN5bWJvbHMuCiAgICAgICAgICAgIGNvbnN0IG51bVN5bWJvbHMgPSBTWU1CT0xTX0xJU1QubGVuZ3RoOwogICAgICAgICAgICB0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtydW5dID0KICAgICAgICAgICAgICAgICh0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtydW5dICsgMSkgJSBudW1TeW1ib2xzOwogICAgICAgICAgICByZXR1cm4gc2VyaWVzOwogICAgICAgIH0KICAgICAgICBfdXBkYXRlQ2hhcnQoKSB7CiAgICAgICAgICAgIHZhciBfbmFtZVRvRGF0YVNlcmllcyA9IHRoaXMuX25hbWVUb0RhdGFTZXJpZXM7CiAgICAgICAgICAgIC8vIEFkZCBuZXcgZGF0YSBzZXJpZXMuCiAgICAgICAgICAgIGxvZGFzaC5mb3JPd24oX25hbWVUb0RhdGFTZXJpZXMsIChkYXRhU2VyaWVzKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLiQubG9hZGVyLnNldFNlcmllc0RhdGEoZGF0YVNlcmllcy5nZXROYW1lKCksIGRhdGFTZXJpZXMuZ2V0RGF0YSgpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuJC5sb2FkZXIuY29tbWl0Q2hhbmdlcygpOwogICAgICAgIH0KICAgICAgICBnZXQgX3Nlcmllc05hbWVzKCkgewogICAgICAgICAgICBjb25zdCBydW5Mb29rdXAgPSBuZXcgU2V0KHRoaXMucnVucyk7CiAgICAgICAgICAgIHJldHVybiBPYmplY3QuZW50cmllcyh0aGlzLl9uYW1lVG9EYXRhU2VyaWVzKQogICAgICAgICAgICAgICAgLmZpbHRlcigoW18sIHNlcmllc10pID0+IHJ1bkxvb2t1cC5oYXMoc2VyaWVzLnJ1bikpCiAgICAgICAgICAgICAgICAubWFwKChbbmFtZV0pID0+IG5hbWUpOwogICAgICAgIH0KICAgICAgICBfZGV0ZXJtaW5lQ29sb3IoY29sb3JTY2FsZSwgc2VyaWVzTmFtZSkgewogICAgICAgICAgICByZXR1cm4gY29sb3JTY2FsZS5zY2FsZShzZXJpZXNOYW1lKTsKICAgICAgICB9CiAgICAgICAgX3JlZnJlc2hEYXRhU2VyaWVzKCkgewogICAgICAgICAgICB2YXIgX3RhZ0ZpbHRlciA9IHRoaXMuX3RhZ0ZpbHRlcjsKICAgICAgICAgICAgdGhpcy5zZXQoJ19uYW1lVG9EYXRhU2VyaWVzJywge30pOwogICAgICAgIH0KICAgICAgICBfY3JlYXRlU3ltYm9sRnVuY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAoc2VyaWVzTmFtZSkgPT4gdGhpcy5fbmFtZVRvRGF0YVNlcmllc1tzZXJpZXNOYW1lXS5nZXRTeW1ib2woKS5tZXRob2QoKTsKICAgICAgICB9CiAgICAgICAgX2RldGVybWluZVN5bWJvbChfbmFtZVRvRGF0YVNlcmllcywgc2VyaWVzTmFtZSkgewogICAgICAgICAgICByZXR1cm4gX25hbWVUb0RhdGFTZXJpZXNbc2VyaWVzTmFtZV0uZ2V0U3ltYm9sKCkuY2hhcmFjdGVyOwogICAgICAgIH0KICAgICAgICBnZXQgX3RhZ0ZpbHRlcigpIHsKICAgICAgICAgICAgdmFyIG1hcmdpbkNoYXJ0U2VyaWVzID0gdGhpcy5tYXJnaW5DaGFydFNlcmllczsKICAgICAgICAgICAgY29uc3QgdGFncyA9IGxvZGFzaC5mbGF0dGVuKG1hcmdpbkNoYXJ0U2VyaWVzLm1hcCgoc2VyaWVzKSA9PiBbCiAgICAgICAgICAgICAgICBzZXJpZXMudmFsdWUsCiAgICAgICAgICAgICAgICBzZXJpZXMubG93ZXIsCiAgICAgICAgICAgICAgICBzZXJpZXMudXBwZXIsCiAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgY29uc3QgZXNjYXBlZFRhZ3MgPSB0YWdzLm1hcCgocikgPT4gJygnICsgdGhpcy5fZXNjYXBlUmVnZXhDaGFyYWN0ZXJzKHIpICsgJyknKTsKICAgICAgICAgICAgLy8gQ29tYmluZSB0aGUgZGlmZmVyZW50IHJlZ2V4ZXMgaW50byBhIHNpbmdsZSByZWdleC4KICAgICAgICAgICAgcmV0dXJuIGVzY2FwZWRUYWdzLmpvaW4oJ3wnKTsKICAgICAgICB9CiAgICAgICAgX2VzY2FwZVJlZ2V4Q2hhcmFjdGVycyhzdHJpbmdWYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5nVmFsdWUucmVwbGFjZSgvWy4qKz9eJHt9KCl8W1xdXFxdL2csICdcXCQmJyk7CiAgICAgICAgfQogICAgICAgIF9nZXRUb2dnbGVDb2xsYXBzaWJsZUljb24obGlzdE9wZW5lZCkgewogICAgICAgICAgICByZXR1cm4gbGlzdE9wZW5lZCA/ICdleHBhbmQtbGVzcycgOiAnZXhwYW5kLW1vcmUnOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlTWF0Y2hlc09wZW4oKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfbWF0Y2hlc0xpc3RPcGVuZWQnLCAhdGhpcy5fbWF0Y2hlc0xpc3RPcGVuZWQpOwogICAgICAgIH0KICAgICAgICBnZXQgX3RpdGxlRGlzcGxheVN0cmluZygpIHsKICAgICAgICAgICAgdmFyIHRpdGxlID0gdGhpcy50aXRsZTsKICAgICAgICAgICAgLy8gSWYgbm8gdGl0bGUgaXMgcHJvdmlkZWQsIHVzZSB0aGUgdGFnIGZpbHRlciwgd2hpY2ggaXMgYSBjb21iaW5hdGlvbgogICAgICAgICAgICAvLyBvZiB0aGUgdGFncyBmb3IgdGhlIHZhbHVlLCBsb3dlciwgYW5kIHVwcGVyIGZpZWxkcyBvZiBlYWNoIHNlcmllcy4KICAgICAgICAgICAgcmV0dXJuIHRpdGxlIHx8ICd1bnRpdGxlZCc7CiAgICAgICAgfQogICAgICAgIF9zZXBhcmF0ZVdpdGhDb21tYXMobnVtYmVycykgewogICAgICAgICAgICByZXR1cm4gbnVtYmVycy5qb2luKCcsICcpOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4oKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCcsICF0aGlzLl9taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkKTsKICAgICAgICB9CiAgICAgICAgX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKCkgewogICAgICAgICAgICBjb25zdCBkb21SZXBlYXQgPSB0aGlzLiQkKCcjbWF0Y2gtbGlzdC1yZXBlYXQnKTsKICAgICAgICAgICAgaWYgKCFkb21SZXBlYXQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnJvb3QKICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCcubWF0Y2gtbGlzdC1lbnRyeScpCiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoZW50cnlFbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBzZXJpZXNOYW1lID0gZG9tUmVwZWF0Lml0ZW1Gb3JFbGVtZW50KGVudHJ5RWxlbWVudCk7CiAgICAgICAgICAgICAgICBlbnRyeUVsZW1lbnQuc3R5bGUuY29sb3IgPSB0aGlzLl9kZXRlcm1pbmVDb2xvcih0aGlzLl9jb2xvclNjYWxlLCBzZXJpZXNOYW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZyBkaXNwbGF5LW5hbWU9IltbX3RpdGxlRGlzcGxheVN0cmluZ11dIj48L3RmLWNhcmQtaGVhZGluZz4KICAgIDxkaXYgaWQ9InRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXItY29udGFpbmVyIj4KICAgICAgPHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIKICAgICAgICBpZD0ibG9hZGVyIgogICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZV1dIgogICAgICAgIGRhdGEtc2VyaWVzPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgIGZpbGwtYXJlYT0iW1tfZmlsbEFyZWFdXSIKICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICBsb2FkLWtleT0iW1tfdGFnRmlsdGVyXV0iCiAgICAgICAgZGF0YS10by1sb2FkPSJbW3J1bnNdXSIKICAgICAgICByZXF1ZXN0LWRhdGE9IltbX3JlcXVlc3REYXRhXV0iCiAgICAgICAgbG9nLXNjYWxlLWFjdGl2ZT0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2NyZWF0ZVByb2Nlc3NEYXRhRnVuY3Rpb24obWFyZ2luQ2hhcnRTZXJpZXMpXV0iCiAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgc3ltYm9sLWZ1bmN0aW9uPSJbW19jcmVhdGVTeW1ib2xGdW5jdGlvbigpXV0iCiAgICAgICAgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIgogICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIKICAgICAgICB4LXR5cGU9IltbeFR5cGVdXSIKICAgICAgPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iCiAgICAgICAgaWNvbj0iZnVsbHNjcmVlbiIKICAgICAgICBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICBpY29uPSJsaW5lLXdlaWdodCIKICAgICAgICBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIKICAgICAgICB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIKICAgICAgICBvbi10YXA9Il9yZXNldERvbWFpbiIKICAgICAgICB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgbm8tbGFiZWwtZmxvYXQ9InRydWUiCiAgICAgICAgICAgIGxhYmVsPSJzZXJpZXMgdG8gZG93bmxvYWQiCiAgICAgICAgICAgIHNlbGVjdGVkLWl0ZW0tbGFiZWw9Int7X2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZH19IgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveCBjbGFzcz0iZHJvcGRvd24tY29udGVudCIgc2xvdD0iZHJvcGRvd24tY29udGVudCI+CiAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgICAgICAgICAgYXM9ImRhdGFTZXJpZXNOYW1lIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICAgICAgICA+W1tkYXRhU2VyaWVzTmFtZV1dPC9wYXBlci1pdGVtCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmNzdiIKICAgICAgICAgICAgaHJlZj0iW1tfY3N2VXJsKF9uYW1lVG9EYXRhU2VyaWVzLCBfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkKV1dIgogICAgICAgICAgICA+Q1NWPC9hCiAgICAgICAgICA+CiAgICAgICAgICA8YQogICAgICAgICAgICBkb3dubG9hZD0iW1tfZGF0YVNlcmllc05hbWVUb0Rvd25sb2FkXV0uanNvbiIKICAgICAgICAgICAgaHJlZj0iW1tfanNvblVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkpTT048L2EKICAgICAgICAgID4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvZGl2PgoKICAgIDwhLS0gaGVyZSAtLT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfbWlzc2luZ1RhZ3MubGVuZ3RoXV0iPgogICAgICA8ZGl2IGNsYXNzPSJjb2xsYXBzaWJsZS1saXN0LXRpdGxlIj4KICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCldXSIKICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW4iCiAgICAgICAgICBjbGFzcz0idG9nZ2xlLWNvbGxhcHNpYmxlLWJ1dHRvbiIKICAgICAgICA+CiAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY29sbGFwc2libGUtdGl0bGUtdGV4dCI+CiAgICAgICAgICA8aXJvbi1pY29uIGljb249Imljb25zOmVycm9yIj48L2lyb24taWNvbj4gTWlzc2luZyBUYWdzCiAgICAgICAgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19taXNzaW5nVGFnc0NvbGxhcHNpYmxlT3BlbmVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImVycm9yLWNvbnRlbnQiPgogICAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWlzc2luZ1RhZ3NdXSIgYXM9Im1pc3NpbmdFbnRyeSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9Im1pc3NpbmctdGFncy1mb3ItcnVuLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgUnVuICJbW21pc3NpbmdFbnRyeS5ydW5dXSIgbGFja3MgZGF0YSBmb3IgdGFncwogICAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICAgICAgaXRlbXM9IltbbWlzc2luZ0VudHJ5LnRhZ3NdXSIKICAgICAgICAgICAgICAgICAgYXM9InRhZyIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPGxpPltbdGFnXV08L2xpPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgIDwvdGVtcGxhdGU+CgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW190YWdGaWx0ZXJJbnZhbGlkXV0iPgogICAgICA8ZGl2IGNsYXNzPSJlcnJvci1jb250ZW50Ij4KICAgICAgICA8aXJvbi1pY29uIGNsYXNzPSJlcnJvci1pY29uIiBpY29uPSJpY29uczplcnJvciI+PC9pcm9uLWljb24+CiAgICAgICAgVGhpcyByZWd1bGFyIGV4cHJlc2lvbiBpcyBpbnZhbGlkOjxiciAvPgogICAgICAgIDxzcGFuIGNsYXNzPSJpbnZhbGlkLXJlZ2V4Ij5bW190YWdGaWx0ZXJdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgoKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc3RlcHNNaXNtYXRjaF1dIj4KICAgICAgPGRpdiBjbGFzcz0iZXJyb3ItY29udGVudCI+CiAgICAgICAgPGlyb24taWNvbiBjbGFzcz0iZXJyb3ItaWNvbiIgaWNvbj0iaWNvbnM6ZXJyb3IiPjwvaXJvbi1pY29uPgogICAgICAgIFRoZSBzdGVwcyBmb3IgdmFsdWUsIGxvd2VyLCBhbmQgdXBwZXIgdGFncyBkbyBub3QgbWF0Y2g6CiAgICAgICAgPHVsPgogICAgICAgICAgPGxpPgogICAgICAgICAgICA8c3BhbiBjbGFzcz0idGFnLW5hbWUiPltbX3N0ZXBzTWlzbWF0Y2guc2VyaWVzT2JqZWN0LnZhbHVlXV08L3NwYW4+OgogICAgICAgICAgICBbW19zZXBhcmF0ZVdpdGhDb21tYXMoX3N0ZXBzTWlzbWF0Y2gudmFsdWVTdGVwcyldXQogICAgICAgICAgPC9saT4KICAgICAgICAgIDxsaT4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9InRhZy1uYW1lIj5bW19zdGVwc01pc21hdGNoLnNlcmllc09iamVjdC5sb3dlcl1dPC9zcGFuPjoKICAgICAgICAgICAgW1tfc2VwYXJhdGVXaXRoQ29tbWFzKF9zdGVwc01pc21hdGNoLmxvd2VyU3RlcHMpXV0KICAgICAgICAgIDwvbGk+CiAgICAgICAgICA8bGk+CiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJ0YWctbmFtZSI+W1tfc3RlcHNNaXNtYXRjaC5zZXJpZXNPYmplY3QudXBwZXJdXTwvc3Bhbj46CiAgICAgICAgICAgIFtbX3NlcGFyYXRlV2l0aENvbW1hcyhfc3RlcHNNaXNtYXRjaC51cHBlclN0ZXBzKV1dCiAgICAgICAgICA8L2xpPgogICAgICAgIDwvdWw+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KCiAgICA8ZGl2IGlkPSJtYXRjaGVzLWNvbnRhaW5lciI+CiAgICAgIDxkaXYgY2xhc3M9ImNvbGxhcHNpYmxlLWxpc3QtdGl0bGUiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgICAgIGljb249IltbX2dldFRvZ2dsZUNvbGxhcHNpYmxlSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJjb2xsYXBzaWJsZS10aXRsZS10ZXh0Ij4KICAgICAgICAgIE1hdGNoZXMgKFtbX3Nlcmllc05hbWVzLmxlbmd0aF1dKQogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2VyaWVzTmFtZXMubGVuZ3RoXV0iPgogICAgICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0iW1tfbWF0Y2hlc0xpc3RPcGVuZWRdXSI+CiAgICAgICAgICA8ZGl2IGlkPSJtYXRjaGVzLWxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICBhcz0ic2VyaWVzTmFtZSIKICAgICAgICAgICAgICBpZD0ibWF0Y2gtbGlzdC1yZXBlYXQiCiAgICAgICAgICAgICAgb24tZG9tLWNoYW5nZT0iX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibWF0Y2gtbGlzdC1lbnRyeSI+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibWF0Y2gtZW50cnktc3ltYm9sIj4KICAgICAgICAgICAgICAgICAgW1tfZGV0ZXJtaW5lU3ltYm9sKF9uYW1lVG9EYXRhU2VyaWVzLCBzZXJpZXNOYW1lKV1dCiAgICAgICAgICAgICAgICA8L3NwYW4+CiAgICAgICAgICAgICAgICBbW3Nlcmllc05hbWVdXQogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWN1c3RvbS1zY2FsYXItY2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLmVycm9yLWNvbnRlbnQgewogICAgICAgIGJhY2tncm91bmQ6ICNmMDA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNXB4OwogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIG1hcmdpbjogMTBweCAwIDAgMDsKICAgICAgICBwYWRkaW5nOiAxMHB4OwogICAgICB9CgogICAgICAuZXJyb3ItaWNvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZmlsbDogI2ZmZjsKICAgICAgICBtYXJnaW46IDAgYXV0byA1cHggYXV0bzsKICAgICAgfQoKICAgICAgLmludmFsaWQtcmVnZXggewogICAgICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgICB9CgogICAgICAuZXJyb3ItY29udGVudCB1bCB7CiAgICAgICAgbWFyZ2luOiAxcHggMCAwIDA7CiAgICAgICAgcGFkZGluZzogMCAwIDAgMTlweDsKICAgICAgfQoKICAgICAgLnRhZy1uYW1lIHsKICAgICAgICBmb250LXdlaWdodDogYm9sZDsKICAgICAgfQoKICAgICAgLmNvbGxhcHNpYmxlLWxpc3QtdGl0bGUgewogICAgICAgIG1hcmdpbjogMTBweCAwIDVweCAwOwogICAgICB9CgogICAgICAuY29sbGFwc2libGUtdGl0bGUtdGV4dCB7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWlzc2luZy10YWdzLWZvci1ydW4tY29udGFpbmVyIHsKICAgICAgICBtYXJnaW46IDhweCAwIDAgMDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgInJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAieFR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJhY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAidGl0bGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIm1hcmdpbkNoYXJ0U2VyaWVzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAiaWdub3JlWU91dGxpZXJzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVxdWVzdE1hbmFnZXIpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAicmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJzaG93RG93bmxvYWRMaW5rcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJ0YWdNZXRhZGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJ0b29sdGlwU29ydGluZ01ldGhvZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfY29sb3JTY2FsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXJJbnZhbGlkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl9uYW1lVG9EYXRhU2VyaWVzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfZXhwYW5kZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfbG9nU2NhbGVBY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfcmVxdWVzdERhdGEiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAiX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAiX21hdGNoZXNMaXN0T3BlbmVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl9maWxsQXJlYSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNYXJnaW5DaGFydENhcmQucHJvdG90eXBlLCAiX3Rvb2x0aXBDb2x1bW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfbWlzc2luZ1RhZ3MiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfbWlzc2luZ1RhZ3NDb2xsYXBzaWJsZU9wZW5lZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfc3RlcHNNaXNtYXRjaCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdfbmFtZVRvRGF0YVNlcmllcycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl91cGRhdGVDaGFydCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19uYW1lVG9EYXRhU2VyaWVzJywgJ3J1bnMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfc2VyaWVzTmFtZXMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ190YWdGaWx0ZXInKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfcmVmcmVzaERhdGFTZXJpZXMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdtYXJnaW5DaGFydFNlcmllcycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXIiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCd0aXRsZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl90aXRsZURpc3BsYXlTdHJpbmciLCBudWxsKTsKICAgIF9UZkN1c3RvbVNjYWxhck1hcmdpbkNoYXJ0Q2FyZCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWN1c3RvbS1zY2FsYXItbWFyZ2luLWNoYXJ0LWNhcmQnKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTWFyZ2luQ2hhcnRDYXJkKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KCiAgICB2YXIgdGZfYmFja2VuZCA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgVFlQRVM6IFRZUEVTJDEsCiAgICAgICAgZ2V0UnVuc05hbWVkOiBnZXRSdW5zTmFtZWQsCiAgICAgICAgZ2V0VGFnczogZ2V0VGFncywKICAgICAgICBmaWx0ZXJUYWdzOiBmaWx0ZXJUYWdzLAogICAgICAgIExpc3RlbktleTogTGlzdGVuS2V5JDEsCiAgICAgICAgQmFzZVN0b3JlOiBCYXNlU3RvcmUsCiAgICAgICAgQ2FuY2VsbGVyOiBDYW5jZWxsZXIsCiAgICAgICAgRW52aXJvbm1lbnRTdG9yZTogRW52aXJvbm1lbnRTdG9yZSwKICAgICAgICBlbnZpcm9ubWVudFN0b3JlOiBlbnZpcm9ubWVudFN0b3JlLAogICAgICAgIEV4cGVyaW1lbnRzU3RvcmU6IEV4cGVyaW1lbnRzU3RvcmUsCiAgICAgICAgZXhwZXJpbWVudHNTdG9yZTogZXhwZXJpbWVudHNTdG9yZSwKICAgICAgICBSZXF1ZXN0Q2FuY2VsbGF0aW9uRXJyb3I6IFJlcXVlc3RDYW5jZWxsYXRpb25FcnJvciwKICAgICAgICBJbnZhbGlkUmVxdWVzdE9wdGlvbnNFcnJvcjogSW52YWxpZFJlcXVlc3RPcHRpb25zRXJyb3IsCiAgICAgICAgUmVxdWVzdE5ldHdvcmtFcnJvcjogUmVxdWVzdE5ldHdvcmtFcnJvciwKICAgICAgICBnZXQgSHR0cE1ldGhvZFR5cGUgKCkgeyByZXR1cm4gSHR0cE1ldGhvZFR5cGU7IH0sCiAgICAgICAgUmVxdWVzdE9wdGlvbnM6IFJlcXVlc3RPcHRpb25zLAogICAgICAgIFJlcXVlc3RNYW5hZ2VyOiBSZXF1ZXN0TWFuYWdlciwKICAgICAgICBjcmVhdGVSb3V0ZXI6IGNyZWF0ZVJvdXRlciwKICAgICAgICBnZXRSb3V0ZXI6IGdldFJvdXRlciwKICAgICAgICBzZXRSb3V0ZXI6IHNldFJvdXRlciwKICAgICAgICBjcmVhdGVTZWFyY2hQYXJhbTogY3JlYXRlU2VhcmNoUGFyYW0sCiAgICAgICAgUnVuc1N0b3JlOiBSdW5zU3RvcmUsCiAgICAgICAgcnVuc1N0b3JlOiBydW5zU3RvcmUsCiAgICAgICAgYWRkUGFyYW1zOiBhZGRQYXJhbXMKICAgIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZCA9IGNsYXNzIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZCBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2NvbG9yU2NhbGUgPSBuZXcgRGF0YVNlcmllc0NvbG9yU2NhbGUoewogICAgICAgICAgICAgICAgc2NhbGU6IHJ1bnNDb2xvclNjYWxlLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fbmFtZVRvRGF0YVNlcmllcyA9IHt9OwogICAgICAgICAgICB0aGlzLl9leHBhbmRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9yZXF1ZXN0RGF0YSA9IChpdGVtcywgb25Mb2FkLCBvbkZpbmlzaCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgcm91dGVyID0gZ2V0Um91dGVyKCk7CiAgICAgICAgICAgICAgICBjb25zdCBiYXNlVXJsID0gcm91dGVyLnBsdWdpblJvdXRlKCdjdXN0b21fc2NhbGFycycsICcvc2NhbGFycycpOwogICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcnVuID0gaXRlbTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWcgPSB0aGlzLl90YWdGaWx0ZXI7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYWRkUGFyYW1zKGJhc2VVcmwsIHsgdGFnLCBydW4gfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QodXJsKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4gdm9pZCBvbkxvYWQoeyBpdGVtLCBkYXRhIH0pKTsKICAgICAgICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHZvaWQgb25GaW5pc2goKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4ID0ge307CiAgICAgICAgICAgIHRoaXMuX21hdGNoZXNMaXN0T3BlbmVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgdGhpcy4kLmxvYWRlci5yZWxvYWQoKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLiQubG9hZGVyLnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlRXhwYW5kZWQoZSkgewogICAgICAgICAgICB0aGlzLnNldCgnX2V4cGFuZGVkJywgIXRoaXMuX2V4cGFuZGVkKTsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUxvZ1NjYWxlKCkgewogICAgICAgICAgICB0aGlzLnNldCgnX2xvZ1NjYWxlQWN0aXZlJywgIXRoaXMuX2xvZ1NjYWxlQWN0aXZlKTsKICAgICAgICB9CiAgICAgICAgX3Jlc2V0RG9tYWluKCkgewogICAgICAgICAgICBjb25zdCBjaGFydCA9IHRoaXMuJC5sb2FkZXI7CiAgICAgICAgICAgIGlmIChjaGFydCkgewogICAgICAgICAgICAgICAgY2hhcnQucmVzZXREb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfY3N2VXJsKG5hbWVUb1NlcmllcywgZGF0YVNlcmllc05hbWUpIHsKICAgICAgICAgICAgaWYgKCFkYXRhU2VyaWVzTmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuX2Rvd25sb2FkRGF0YVVybChuYW1lVG9TZXJpZXMsIGRhdGFTZXJpZXNOYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGFkZFBhcmFtcyhiYXNlVXJsLCB7IGZvcm1hdDogJ2NzdicgfSk7CiAgICAgICAgfQogICAgICAgIF9qc29uVXJsKG5hbWVUb1NlcmllcywgZGF0YVNlcmllc05hbWUpIHsKICAgICAgICAgICAgaWYgKCFkYXRhU2VyaWVzTmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHRoaXMuX2Rvd25sb2FkRGF0YVVybChuYW1lVG9TZXJpZXMsIGRhdGFTZXJpZXNOYW1lKTsKICAgICAgICAgICAgcmV0dXJuIGFkZFBhcmFtcyhiYXNlVXJsLCB7IGZvcm1hdDogJ2pzb24nIH0pOwogICAgICAgIH0KICAgICAgICBfZG93bmxvYWREYXRhVXJsKG5hbWVUb1NlcmllcywgZGF0YVNlcmllc05hbWUpIHsKICAgICAgICAgICAgY29uc3QgZGF0YVNlcmllcyA9IG5hbWVUb1Nlcmllc1tkYXRhU2VyaWVzTmFtZV07CiAgICAgICAgICAgIGNvbnN0IGdldFZhcnMgPSB7CiAgICAgICAgICAgICAgICB0YWc6IGRhdGFTZXJpZXMuZ2V0VGFnKCksCiAgICAgICAgICAgICAgICBydW46IGRhdGFTZXJpZXMuZ2V0UnVuKCksCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHJldHVybiBhZGRQYXJhbXMoZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ2N1c3RvbV9zY2FsYXJzJywgJy9kb3dubG9hZF9kYXRhJyksIGdldFZhcnMpOwogICAgICAgIH0KICAgICAgICBfY3JlYXRlUHJvY2Vzc0RhdGFGdW5jdGlvbigpIHsKICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBkYXRhIGlzIHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQuCiAgICAgICAgICAgIHJldHVybiAoc2NhbGFyQ2hhcnQsIHJ1biwgZGF0YSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGRhdGEucmVnZXhfdmFsaWQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdXNlcidzIHJlZ3VsYXIgZXhwcmVzc2lvbiB3YXMgdmFsaWQuCiAgICAgICAgICAgICAgICAgICAgLy8gSW5jb3Jwb3JhdGUgdGhlc2UgbmV3bHkgbG9hZGVkIHZhbHVlcy4KICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdNYXBwaW5nID0gbG9kYXNoLmNsb25lKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpOwogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5mb3JPd24oZGF0YS50YWdfdG9fZXZlbnRzLCAoc2NhbGFyRXZlbnRzLCB0YWcpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHNjYWxhckV2ZW50cy5tYXAoKGRhdHVtKSA9PiAoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2FsbF90aW1lOiBuZXcgRGF0ZShkYXR1bVswXSAqIDEwMDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RlcDogZGF0dW1bMV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2FsYXI6IGRhdHVtWzJdLAogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmllc05hbWUgPSBnZW5lcmF0ZURhdGFTZXJpZXNOYW1lKHJ1biwgdGFnKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0dW0gPSBuZXdNYXBwaW5nW3Nlcmllc05hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0dW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2VyaWVzIGFscmVhZHkgZXhpc3RzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0dW0uc2V0RGF0YShkYXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNVbmRlZmluZWQodGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbcnVuXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcnVuIGhhcyBub3QgYmVlbiBzZWVuIGJlZm9yZS4gRGVmaW5lIHRoZSBuZXh0IGF2YWlsYWJsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hcmtlciBpbmRleC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtydW5dID0gMDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZXJ5IGRhdGEgc2VyaWVzIHdpdGhpbiBhIHJ1biBoYXMgYSB1bmlxdWUgc3ltYm9sLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbGluZUNoYXJ0U3ltYm9sID0gU1lNQk9MU19MSVNUW3RoaXMuX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4W3J1bl1dOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgc2VyaWVzIHdpdGggdGhpcyBuYW1lLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzID0gbmV3IERhdGFTZXJpZXMocnVuLCB0YWcsIHNlcmllc05hbWUsIGRhdGEsIGxpbmVDaGFydFN5bWJvbCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdNYXBwaW5nW3Nlcmllc05hbWVdID0gc2VyaWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTG9vcCBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgaWYgd2UgYXJlIG91dCBvZiBzeW1ib2xzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtU3ltYm9scyA9IFNZTUJPTFNfTElTVC5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ydW5Ub05leHRBdmFpbGFibGVTeW1ib2xJbmRleFtydW5dID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGhpcy5fcnVuVG9OZXh0QXZhaWxhYmxlU3ltYm9sSW5kZXhbcnVuXSArIDEpICUgbnVtU3ltYm9sczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfbmFtZVRvRGF0YVNlcmllcycsIG5ld01hcHBpbmcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBfdXBkYXRlQ2hhcnQoKSB7CiAgICAgICAgICAgIHZhciBfbmFtZVRvRGF0YVNlcmllcyA9IHRoaXMuX25hbWVUb0RhdGFTZXJpZXM7CiAgICAgICAgICAgIC8vIEFkZCBuZXcgZGF0YSBzZXJpZXMuCiAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKF9uYW1lVG9EYXRhU2VyaWVzKS5mb3JFYWNoKChbbmFtZSwgc2VyaWVzXSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy4kLmxvYWRlci5zZXRTZXJpZXNEYXRhKG5hbWUsIHNlcmllcy5nZXREYXRhKCkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy4kLmxvYWRlci5jb21taXRDaGFuZ2VzKCk7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlU2VsZWN0ZWRSdW5zU2V0KHJ1bnMpIHsKICAgICAgICAgICAgY29uc3QgbWFwcGluZyA9IHt9OwogICAgICAgICAgICBsb2Rhc2guZm9yRWFjaChydW5zLCAocnVuKSA9PiB7CiAgICAgICAgICAgICAgICBtYXBwaW5nW3J1bl0gPSAxOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIG1hcHBpbmc7CiAgICAgICAgfQogICAgICAgIGdldCBfc2VyaWVzTmFtZXMoKSB7CiAgICAgICAgICAgIGNvbnN0IHJ1bkxvb2t1cCA9IG5ldyBTZXQodGhpcy5ydW5zKTsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKHRoaXMuX25hbWVUb0RhdGFTZXJpZXMpCiAgICAgICAgICAgICAgICAuZmlsdGVyKChbXywgc2VyaWVzXSkgPT4gcnVuTG9va3VwLmhhcyhzZXJpZXMucnVuKSkKICAgICAgICAgICAgICAgIC5tYXAoKFtuYW1lXSkgPT4gbmFtZSk7CiAgICAgICAgfQogICAgICAgIF9kZXRlcm1pbmVDb2xvcihjb2xvclNjYWxlLCBzZXJpZXNOYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBjb2xvclNjYWxlLnNjYWxlKHNlcmllc05hbWUpOwogICAgICAgIH0KICAgICAgICBfcmVmcmVzaERhdGFTZXJpZXMoKSB7CiAgICAgICAgICAgIHZhciBfdGFnRmlsdGVyID0gdGhpcy5fdGFnRmlsdGVyOwogICAgICAgICAgICB0aGlzLnNldCgnX25hbWVUb0RhdGFTZXJpZXMnLCB7fSk7CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVTeW1ib2xGdW5jdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIChzZXJpZXNOYW1lKSA9PiB0aGlzLl9uYW1lVG9EYXRhU2VyaWVzW3Nlcmllc05hbWVdLmdldFN5bWJvbCgpLm1ldGhvZCgpOwogICAgICAgIH0KICAgICAgICBfZGV0ZXJtaW5lU3ltYm9sKG5hbWVUb1Nlcmllcywgc2VyaWVzTmFtZSkgewogICAgICAgICAgICByZXR1cm4gbmFtZVRvU2VyaWVzW3Nlcmllc05hbWVdLmdldFN5bWJvbCgpLmNoYXJhY3RlcjsKICAgICAgICB9CiAgICAgICAgZ2V0IF90YWdGaWx0ZXIoKSB7CiAgICAgICAgICAgIHZhciB0YWdSZWdleGVzID0gdGhpcy50YWdSZWdleGVzOwogICAgICAgICAgICBpZiAodGFnUmVnZXhlcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0YWdSZWdleGVzWzBdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENvbWJpbmUgdGhlIGRpZmZlcmVudCByZWdleGVzIGludG8gYSBzaW5nbGUgcmVnZXguCiAgICAgICAgICAgIHJldHVybiB0YWdSZWdleGVzLm1hcCgocikgPT4gJygnICsgciArICcpJykuam9pbignfCcpOwogICAgICAgIH0KICAgICAgICBfZ2V0VG9nZ2xlTWF0Y2hlc0ljb24obWF0Y2hlc0xpc3RPcGVuZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoZXNMaXN0T3BlbmVkID8gJ2V4cGFuZC1sZXNzJyA6ICdleHBhbmQtbW9yZSc7CiAgICAgICAgfQogICAgICAgIF90b2dnbGVNYXRjaGVzT3BlbigpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19tYXRjaGVzTGlzdE9wZW5lZCcsICF0aGlzLl9tYXRjaGVzTGlzdE9wZW5lZCk7CiAgICAgICAgfQogICAgICAgIGdldCBfdGl0bGVEaXNwbGF5U3RyaW5nKCkgewogICAgICAgICAgICB2YXIgdGl0bGUgPSB0aGlzLnRpdGxlOwogICAgICAgICAgICAvLyBJZiBubyB0aXRsZSBpcyBwcm92aWRlZCwgdXNlIGEgcGxhY2Vob2xkZXIgc3RyaW5nLgogICAgICAgICAgICByZXR1cm4gdGl0bGUgfHwgJ3VudGl0bGVkJzsKICAgICAgICB9CiAgICAgICAgX21hdGNoTGlzdEVudHJ5Q29sb3JVcGRhdGVkKGV2ZW50KSB7CiAgICAgICAgICAgIGNvbnN0IGRvbVJlcGVhdCA9IHRoaXMuJCQoJyNtYXRjaC1saXN0LXJlcGVhdCcpOwogICAgICAgICAgICBpZiAoIWRvbVJlcGVhdCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucm9vdAogICAgICAgICAgICAgICAgLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXRjaC1saXN0LWVudHJ5JykKICAgICAgICAgICAgICAgIC5mb3JFYWNoKChlbnRyeUVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHNlcmllc05hbWUgPSBkb21SZXBlYXQuaXRlbUZvckVsZW1lbnQoZW50cnlFbGVtZW50KTsKICAgICAgICAgICAgICAgIGVudHJ5RWxlbWVudC5zdHlsZS5jb2xvciA9IHRoaXMuX2RldGVybWluZUNvbG9yKHRoaXMuX2NvbG9yU2NhbGUsIHNlcmllc05hbWUpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwogICAgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGYtY2FyZC1oZWFkaW5nIGRpc3BsYXktbmFtZT0iW1tfdGl0bGVEaXNwbGF5U3RyaW5nXV0iPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcgogICAgICAgIGlkPSJsb2FkZXIiCiAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICAgICAgZGF0YS1zZXJpZXM9IltbX3Nlcmllc05hbWVzXV0iCiAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbaWdub3JlWU91dGxpZXJzXV0iCiAgICAgICAgbG9hZC1rZXk9IltbX3RhZ0ZpbHRlcl1dIgogICAgICAgIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iCiAgICAgICAgcmVxdWVzdC1kYXRhPSJbW19yZXF1ZXN0RGF0YV1dIgogICAgICAgIGxvZy1zY2FsZS1hY3RpdmU9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIKICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tzbW9vdGhpbmdFbmFibGVkXV0iCiAgICAgICAgc21vb3RoaW5nLXdlaWdodD0iW1tzbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICBzeW1ib2wtZnVuY3Rpb249IltbX2NyZWF0ZVN5bWJvbEZ1bmN0aW9uKCldXSIKICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgeC10eXBlPSJbW3hUeXBlXV0iCiAgICAgID4KICAgICAgPC90Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyPgogICAgPC9kaXY+CiAgICA8ZGl2IGlkPSJidXR0b25zIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2xvZ1NjYWxlQWN0aXZlXV0iCiAgICAgICAgaWNvbj0ibGluZS13ZWlnaHQiCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlTG9nU2NhbGUiCiAgICAgICAgdGl0bGU9IlRvZ2dsZSB5LWF4aXMgbG9nIHNjYWxlIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IkZpdCBkb21haW4gdG8gZGF0YSIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxzcGFuIHN0eWxlPSJmbGV4LWdyb3c6IDEiPjwvc3Bhbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImRvd25sb2FkLWxpbmtzIj4KICAgICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIgogICAgICAgICAgICBsYWJlbD0ic2VyaWVzIHRvIGRvd25sb2FkIgogICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWR9fSIKICAgICAgICAgID4KICAgICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfc2VyaWVzTmFtZXNdXSIKICAgICAgICAgICAgICAgIGFzPSJkYXRhU2VyaWVzTmFtZSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItaXRlbSBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPltbZGF0YVNlcmllc05hbWVdXTwvcGFwZXItaXRlbQogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgIDxhCiAgICAgICAgICAgIGRvd25sb2FkPSJbW19kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWRdXS5jc3YiCiAgICAgICAgICAgIGhyZWY9IltbX2NzdlVybChfbmFtZVRvRGF0YVNlcmllcywgX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZCldXSIKICAgICAgICAgICAgPkNTVjwvYQogICAgICAgICAgPgogICAgICAgICAgPGEKICAgICAgICAgICAgZG93bmxvYWQ9IltbX2RhdGFTZXJpZXNOYW1lVG9Eb3dubG9hZF1dLmpzb24iCiAgICAgICAgICAgIGhyZWY9IltbX2pzb25VcmwoX25hbWVUb0RhdGFTZXJpZXMsIF9kYXRhU2VyaWVzTmFtZVRvRG93bmxvYWQpXV0iCiAgICAgICAgICAgID5KU09OPC9hCiAgICAgICAgICA+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9Im1hdGNoZXMtY29udGFpbmVyIj4KICAgICAgPGRpdiBpZD0ibWF0Y2hlcy1saXN0LXRpdGxlIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3Nlcmllc05hbWVzLmxlbmd0aF1dIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJbW19nZXRUb2dnbGVNYXRjaGVzSWNvbihfbWF0Y2hlc0xpc3RPcGVuZWQpXV0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTWF0Y2hlc09wZW4iCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtbWF0Y2hlcy1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaGVzLXRleHQiPiBNYXRjaGVzIChbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSkgPC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zZXJpZXNOYW1lcy5sZW5ndGhdXSI+CiAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19tYXRjaGVzTGlzdE9wZW5lZF1dIj4KICAgICAgICAgIDxkaXYgaWQ9Im1hdGNoZXMtbGlzdCI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19zZXJpZXNOYW1lc11dIgogICAgICAgICAgICAgIGFzPSJzZXJpZXNOYW1lIgogICAgICAgICAgICAgIGlkPSJtYXRjaC1saXN0LXJlcGVhdCIKICAgICAgICAgICAgICBvbi1kb20tY2hhbmdlPSJfbWF0Y2hMaXN0RW50cnlDb2xvclVwZGF0ZWQiCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJtYXRjaC1saXN0LWVudHJ5Ij4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJtYXRjaC1lbnRyeS1zeW1ib2wiPgogICAgICAgICAgICAgICAgICBbW19kZXRlcm1pbmVTeW1ib2woX25hbWVUb0RhdGFTZXJpZXMsIHNlcmllc05hbWUpXV0KICAgICAgICAgICAgICAgIDwvc3Bhbj4KICAgICAgICAgICAgICAgIFtbc2VyaWVzTmFtZV1dCiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2lyb24tY29sbGFwc2U+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGUgaW5jbHVkZT0idGYtY3VzdG9tLXNjYWxhci1jYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjbWF0Y2hlcy1saXN0LXRpdGxlIHsKICAgICAgICBtYXJnaW46IDEwcHggMCA1cHggMDsKICAgICAgfQoKICAgICAgI21hdGNoZXMtbGlzdCB7CiAgICAgICAgbWF4LWhlaWdodDogMjAwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgLm1hdGNoLWxpc3QtZW50cnkgewogICAgICAgIG1hcmdpbjogMCAwIDVweCAwOwogICAgICB9CgogICAgICAubWF0Y2gtZW50cnktc3ltYm9sIHsKICAgICAgICBmb250LWZhbWlseTogYXJpYWwsIHNhbnMtc2VyaWY7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAxMHB4OwogICAgICB9CgogICAgICAubWF0Y2hlcy10ZXh0IHsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQucHJvdG90eXBlLCAicnVucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJ4VHlwZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgImFjdGl2ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJ0aXRsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQucHJvdG90eXBlLCAidGFnUmVnZXhlcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgImlnbm9yZVlPdXRsaWVycyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgInJlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQucHJvdG90eXBlLCAic2hvd0Rvd25sb2FkTGlua3MiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJzbW9vdGhpbmdFbmFibGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgInNtb290aGluZ1dlaWdodCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJ0YWdNZXRhZGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJ0b29sdGlwU29ydGluZ01ldGhvZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIERhdGFTZXJpZXNDb2xvclNjYWxlKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl9jb2xvclNjYWxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl9uYW1lVG9EYXRhU2VyaWVzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfZXhwYW5kZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfbG9nU2NhbGVBY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbikKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfcmVxdWVzdERhdGEiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQucHJvdG90eXBlLCAiX3J1blRvTmV4dEF2YWlsYWJsZVN5bWJvbEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQucHJvdG90eXBlLCAiX21hdGNoZXNMaXN0T3BlbmVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19uYW1lVG9EYXRhU2VyaWVzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQucHJvdG90eXBlLCAiX3VwZGF0ZUNoYXJ0IiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX25hbWVUb0RhdGFTZXJpZXMnLCAncnVucycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl9zZXJpZXNOYW1lcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX3RhZ0ZpbHRlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgX1RmQ3VzdG9tU2NhbGFyTXVsdGlMaW5lQ2hhcnRDYXJkLnByb3RvdHlwZSwgIl9yZWZyZXNoRGF0YVNlcmllcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ3RhZ1JlZ2V4ZXMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfdGFnRmlsdGVyIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgndGl0bGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIF9UZkN1c3RvbVNjYWxhck11bHRpTGluZUNoYXJ0Q2FyZC5wcm90b3R5cGUsICJfdGl0bGVEaXNwbGF5U3RyaW5nIiwgbnVsbCk7CiAgICBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCcpCiAgICBdLCBfVGZDdXN0b21TY2FsYXJNdWx0aUxpbmVDaGFydENhcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkID0gY2xhc3MgVGZDdXN0b21TY2FsYXJEYXNoYm9hcmQgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKDUwKTsKICAgICAgICAgICAgdGhpcy5fY2FuY2VsbGVyID0gbmV3IENhbmNlbGxlcigpOwogICAgICAgICAgICB0aGlzLl9zaG93RG93bmxvYWRMaW5rcyA9IGdldEJvb2xlYW5Jbml0aWFsaXplcignX3Nob3dEb3dubG9hZExpbmtzJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHVzZUxvY2FsU3RvcmFnZTogdHJ1ZSwKICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fc21vb3RoaW5nV2VpZ2h0ID0gZ2V0TnVtYmVySW5pdGlhbGl6ZXIoJ19zbW9vdGhpbmdXZWlnaHQnLCB7CiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAuNiwKICAgICAgICAgICAgfSkuY2FsbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5faWdub3JlWU91dGxpZXJzID0gZ2V0Qm9vbGVhbkluaXRpYWxpemVyKCdfaWdub3JlWU91dGxpZXJzJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLAogICAgICAgICAgICAgICAgdXNlTG9jYWxTdG9yYWdlOiB0cnVlLAogICAgICAgICAgICB9KS5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl94VHlwZSA9ICdzdGVwJzsKICAgICAgICAgICAgdGhpcy5fYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5yZWxvYWRPblJlYWR5ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciA9IGdldEJvb2xlYW5PYnNlcnZlcignX3Nob3dEb3dubG9hZExpbmtzJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHVzZUxvY2FsU3RvcmFnZTogdHJ1ZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX3Ntb290aGluZ1dlaWdodE9ic2VydmVyID0gZ2V0TnVtYmVyT2JzZXJ2ZXIoJ19zbW9vdGhpbmdXZWlnaHQnLCB7CiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAuNiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyID0gZ2V0Qm9vbGVhbk9ic2VydmVyKCdfaWdub3JlWU91dGxpZXJzJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLAogICAgICAgICAgICAgICAgdXNlTG9jYWxTdG9yYWdlOiB0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbG9hZE9uUmVhZHkpCiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICByZWxvYWQoKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLnBsdWdpbnNMaXN0aW5nKCk7CiAgICAgICAgICAgIGNvbnN0IGhhbmRsZVBsdWdpbnNMaXN0aW5nUmVzcG9uc2UgPSB0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2RhdGFOb3RGb3VuZCcsICFyZXN1bHQudmFsdWVbJ2N1c3RvbV9zY2FsYXJzJ10pOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2RhdGFOb3RGb3VuZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3JldHJpZXZlTGF5b3V0QW5kRGF0YSgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwpLnRoZW4oaGFuZGxlUGx1Z2luc0xpc3RpbmdSZXNwb25zZSk7CiAgICAgICAgfQogICAgICAgIF9yZWxvYWRDaGFydHMoKSB7CiAgICAgICAgICAgIGNvbnN0IGNoYXJ0cyA9IHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCd0Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkLCAnICsKICAgICAgICAgICAgICAgICd0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZCcpOwogICAgICAgICAgICBjaGFydHMuZm9yRWFjaCgoY2hhcnQpID0+IHsKICAgICAgICAgICAgICAgIGNoYXJ0LnJlbG9hZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3JldHJpZXZlTGF5b3V0QW5kRGF0YSgpIHsKICAgICAgICAgICAgY29uc3QgdXJsID0gZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ2N1c3RvbV9zY2FsYXJzJywgJy9sYXlvdXQnKTsKICAgICAgICAgICAgY29uc3QgdXBkYXRlID0gdGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKChyZXN1bHQpID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhpcyBwbHVnaW4gaXMgb25seSBhY3RpdmUgaWYgZGF0YSBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2xheW91dCcsIHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RhdGFOb3RGb3VuZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZENoYXJ0cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwpLnRoZW4odXBkYXRlKTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9zbW9vdGhpbmdFbmFibGVkKCkgewogICAgICAgICAgICB2YXIgX3Ntb290aGluZ1dlaWdodCA9IHRoaXMuX3Ntb290aGluZ1dlaWdodDsKICAgICAgICAgICAgcmV0dXJuIF9zbW9vdGhpbmdXZWlnaHQgPiAwOwogICAgICAgIH0KICAgICAgICBnZXQgX2NhdGVnb3JpZXMoKSB7CiAgICAgICAgICAgIHZhciBsYXlvdXQgPSB0aGlzLl9sYXlvdXQ7CiAgICAgICAgICAgIGlmICghbGF5b3V0LmNhdGVnb3J5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IGZpcnN0VGltZUxvYWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9vcGVuZWRDYXRlZ29yaWVzKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHRoZSB1c2VyIGxvYWRzIHRoZSBjYXRlZ29yaWVzLiBTdGFydCBzdG9yaW5nCiAgICAgICAgICAgICAgICAvLyB3aGljaCBjYXRlZ29yaWVzIGFyZSBvcGVuLgogICAgICAgICAgICAgICAgZmlyc3RUaW1lTG9hZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWRDYXRlZ29yaWVzID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgY2F0ZWdvcmllcyA9IGxheW91dC5jYXRlZ29yeS5tYXAoKGNhdGVnb3J5KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RUaW1lTG9hZCAmJiAhY2F0ZWdvcnkgLyogPz8/ICovLmNsb3NlZCkgewogICAgICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHdoZXRoZXIgdGhpcyBjYXRlZ29yeSBpcyBjdXJyZW50bHkgb3Blbi4KICAgICAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWRDYXRlZ29yaWVzW2NhdGVnb3J5LnRpdGxlXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIG5hbWU6IGNhdGVnb3J5LnRpdGxlLAogICAgICAgICAgICAgICAgICAgIGl0ZW1zOiBjYXRlZ29yeS5jaGFydCwKICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YTogewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBDYXRlZ29yeVR5cGUuUFJFRklYX0dST1VQLAogICAgICAgICAgICAgICAgICAgICAgICBvcGVuZWQ6ICEhdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1tjYXRlZ29yeS50aXRsZV0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gY2F0ZWdvcmllczsKICAgICAgICB9CiAgICAgICAgX2NhdGVnb3J5T3BlbmVkVG9nZ2xlZChldmVudCkgewogICAgICAgICAgICBjb25zdCBwYW5lID0gZXZlbnQudGFyZ2V0OwogICAgICAgICAgICBpZiAocGFuZS5vcGVuZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZENhdGVnb3JpZXNbcGFuZS5jYXRlZ29yeS5uYW1lXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fb3BlbmVkQ2F0ZWdvcmllc1twYW5lLmNhdGVnb3J5Lm5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSIKICAgICAgICAgICAgICAgID5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tfaWdub3JlWU91dGxpZXJzfX0iCiAgICAgICAgICAgICAgICA+SWdub3JlIG91dGxpZXJzIGluIGNoYXJ0IHNjYWxpbmc8L3BhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0idG9vbHRpcC1zb3J0aW5nIj4KICAgICAgICAgICAgICA8ZGl2IGlkPSJ0b29sdGlwLXNvcnRpbmctbGFiZWwiPlRvb2x0aXAgc29ydGluZyBtZXRob2Q6PC9kaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0PSIiCiAgICAgICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e190b29sdGlwU29ydGluZ01ldGhvZH19IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICAgICAgICBzZWxlY3RlZD0iMCIKICAgICAgICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVmYXVsdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5uZWFyZXN0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1zbW9vdGhpbmctaW5wdXQKICAgICAgICAgICAgICB3ZWlnaHQ9Int7X3Ntb290aGluZ1dlaWdodH19IgogICAgICAgICAgICAgIHN0ZXA9IjAuMDAxIgogICAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgICBtYXg9IjEiCiAgICAgICAgICAgID48L3RmLXNtb290aGluZy1pbnB1dD4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJ4LXR5cGUtc2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iSG9yaXpvbnRhbCBBeGlzIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPjwhLS0KICAgICAgICAgICAgLS0+PHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+PCEtLQogICAgICAgICAgICAtLT48cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciIgaWQ9ImNhdGVnb3JpZXMtY29udGFpbmVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5UaGUgY3VzdG9tIHNjYWxhcnMgZGFzaGJvYXJkIGlzIGluYWN0aXZlLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDxvbD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVuJ3QgbGFpZCBvdXQgdGhlIGRhc2hib2FyZC48L2xpPgogICAgICAgICAgICAgIDxsaT5Zb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IHNjYWxhciBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC9vbD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIFRvIGxheSBvdXQgdGhlIGRhc2hib2FyZCwgcGFzcyBhIDxjb2RlPkxheW91dDwvY29kZT4gcHJvdG9idWZmZXIKICAgICAgICAgICAgICB0byB0aGUgPGNvZGU+c2V0X2xheW91dDwvY29kZT4gbWV0aG9kLiBGb3IgZXhhbXBsZSwKICAgICAgICAgICAgPC9wPgogICAgICAgICAgICA8cHJlPgpmcm9tIHRlbnNvcmJvYXJkIGltcG9ydCBzdW1tYXJ5CmZyb20gdGVuc29yYm9hcmQucGx1Z2lucy5jdXN0b21fc2NhbGFyIGltcG9ydCBsYXlvdXRfcGIyCi4uLgojIFRoaXMgYWN0aW9uIGRvZXMgbm90IGhhdmUgdG8gYmUgcGVyZm9ybWVkIGF0IGV2ZXJ5IHN0ZXAsIHNvIHRoZSBhY3Rpb24gaXMgbm90CiMgdGFrZW4gY2FyZSBvZiBieSBhbiBvcCBpbiB0aGUgZ3JhcGguIFdlIG9ubHkgbmVlZCB0byBzcGVjaWZ5IHRoZSBsYXlvdXQgb25jZQojIChpbnN0ZWFkIG9mIHBlciBzdGVwKS4KbGF5b3V0X3N1bW1hcnkgPSBzdW1tYXJ5X2xpYi5jdXN0b21fc2NhbGFyX3BiKGxheW91dF9wYjIuTGF5b3V0KAogIGNhdGVnb3J5PVsKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICBjaGFydD1bCiAgICAgICAgICBsYXlvdXRfcGIyLkNoYXJ0KAogICAgICAgICAgICAgIHRpdGxlPSdsb3NzZXMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcidsb3NzLionXSwKICAgICAgICAgICAgICApKSwKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J2JheicsCiAgICAgICAgICAgICAgbWFyZ2luPWxheW91dF9wYjIuTWFyZ2luQ2hhcnRDb250ZW50KAogICAgICAgICAgICAgICAgc2VyaWVzPVsKICAgICAgICAgICAgICAgICAgbGF5b3V0X3BiMi5NYXJnaW5DaGFydENvbnRlbnQuU2VyaWVzKAogICAgICAgICAgICAgICAgICAgIHZhbHVlPSdsb3NzL2Jhei9zY2FsYXJfc3VtbWFyeScsCiAgICAgICAgICAgICAgICAgICAgbG93ZXI9J2Jhel9sb3dlci9iYXovc2NhbGFyX3N1bW1hcnknLAogICAgICAgICAgICAgICAgICAgIHVwcGVyPSdiYXpfdXBwZXIvYmF6L3NjYWxhcl9zdW1tYXJ5JyksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICkpLAogICAgICBdKSwKICAgIGxheW91dF9wYjIuQ2F0ZWdvcnkoCiAgICAgIHRpdGxlPSd0cmlnIGZ1bmN0aW9ucycsCiAgICAgIGNoYXJ0PVsKICAgICAgICAgIGxheW91dF9wYjIuQ2hhcnQoCiAgICAgICAgICAgICAgdGl0bGU9J3dhdmUgdHJpZyBmdW5jdGlvbnMnLAogICAgICAgICAgICAgIG11bHRpbGluZT1sYXlvdXRfcGIyLk11bHRpbGluZUNoYXJ0Q29udGVudCgKICAgICAgICAgICAgICAgIHRhZz1bcid0cmlnRnVuY3Rpb25zL2Nvc2luZScsIHIndHJpZ0Z1bmN0aW9ucy9zaW5lJ10sCiAgICAgICAgICAgICAgKSksCiAgICAgICAgICAjIFRoZSByYW5nZSBvZiB0YW5nZW50IGlzIGRpZmZlcmVudC4gTGV0J3MgZ2l2ZSBpdCBpdHMgb3duIGNoYXJ0LgogICAgICAgICAgbGF5b3V0X3BiMi5DaGFydCgKICAgICAgICAgICAgICB0aXRsZT0ndGFuJywKICAgICAgICAgICAgICBtdWx0aWxpbmU9bGF5b3V0X3BiMi5NdWx0aWxpbmVDaGFydENvbnRlbnQoCiAgICAgICAgICAgICAgICB0YWc9W3IndHJpZ0Z1bmN0aW9ucy90YW5nZW50J10sCiAgICAgICAgICAgICAgKSksCiAgICAgIF0sCiAgICAgICMgVGhpcyBjYXRlZ29yeSB3ZSBjYXJlIGxlc3MgYWJvdXQuIExldCdzIG1ha2UgaXQgaW5pdGlhbGx5IGNsb3NlZC4KICAgICAgY2xvc2VkPVRydWUpLAogIF0pKQp3cml0ZXIuYWRkX3N1bW1hcnkobGF5b3V0X3N1bW1hcnkpCjwvcHJlCiAgICAgICAgICAgID4KICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBhcz0iY2hhcnQiCiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBkaXNhYmxlLXBhZ2luYXRpb24KICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tjYXRlZ29yeS5tZXRhZGF0YS5vcGVuZWRdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tjaGFydC5tdWx0aWxpbmVdXSI+CiAgICAgICAgICAgICAgICAgIDx0Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZAogICAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICAgICAgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9IltbY2hhcnQudGl0bGVdXSIKICAgICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgICAgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICAgICAgICAgICAgICBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICAgICAgICAgICAgICB0b29sdGlwLXNvcnRpbmctbWV0aG9kPSJbW3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgICAgICAgICAgICAgaWdub3JlLXktb3V0bGllcnM9IltbX2lnbm9yZVlPdXRsaWVyc11dIgogICAgICAgICAgICAgICAgICAgIHNob3ctZG93bmxvYWQtbGlua3M9IltbX3Nob3dEb3dubG9hZExpbmtzXV0iCiAgICAgICAgICAgICAgICAgICAgdGFnLXJlZ2V4ZXM9IltbY2hhcnQubXVsdGlsaW5lLnRhZ11dIgogICAgICAgICAgICAgICAgICA+PC90Zi1jdXN0b20tc2NhbGFyLW11bHRpLWxpbmUtY2hhcnQtY2FyZD4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbY2hhcnQubWFyZ2luXV0iPgogICAgICAgICAgICAgICAgICA8dGYtY3VzdG9tLXNjYWxhci1tYXJnaW4tY2hhcnQtY2FyZAogICAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICAgICAgcnVucz0iW1tfc2VsZWN0ZWRSdW5zXV0iCiAgICAgICAgICAgICAgICAgICAgdGl0bGU9IltbY2hhcnQudGl0bGVdXSIKICAgICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcC1zb3J0aW5nLW1ldGhvZD0iW1t0b29sdGlwU29ydGluZ01ldGhvZF1dIgogICAgICAgICAgICAgICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICAgICAgICAgICAgICBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIgogICAgICAgICAgICAgICAgICAgIG1hcmdpbi1jaGFydC1zZXJpZXM9IltbY2hhcnQubWFyZ2luLnNlcmllc11dIgogICAgICAgICAgICAgICAgICA+PC90Zi1jdXN0b20tc2NhbGFyLW1hcmdpbi1jaGFydC1jYXJkPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L3RmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvdGYtZGFzaGJvYXJkLWxheW91dD4KCiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAjdG9vbHRpcC1zb3J0aW5nIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CiAgICAgIC5saW5lLWl0ZW0gewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHBhZGRpbmctdG9wOiA1cHg7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVxdWVzdE1hbmFnZXIpCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfcmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBDYW5jZWxsZXIpCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfY2FuY2VsbGVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9zZWxlY3RlZFJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXInLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9zaG93RG93bmxvYWRMaW5rcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ19zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcicsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfc21vb3RoaW5nV2VpZ2h0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXInLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9pZ25vcmVZT3V0bGllcnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfeFR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfbGF5b3V0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfZGF0YU5vdEZvdW5kIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZDdXN0b21TY2FsYXJEYXNoYm9hcmQucHJvdG90eXBlLCAiX29wZW5lZENhdGVnb3JpZXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9hY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgInJlbG9hZE9uUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19zbW9vdGhpbmdXZWlnaHQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkN1c3RvbVNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfc21vb3RoaW5nRW5hYmxlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19sYXlvdXQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZDdXN0b21TY2FsYXJEYXNoYm9hcmQucHJvdG90eXBlLCAiX2NhdGVnb3JpZXMiLCBudWxsKTsKICAgIFRmQ3VzdG9tU2NhbGFyRGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtY3VzdG9tLXNjYWxhci1kYXNoYm9hcmQnKQogICAgXSwgVGZDdXN0b21TY2FsYXJEYXNoYm9hcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDE2IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgRGlzdHJpYnV0aW9uQ2hhcnQgewogICAgICAgIGNvbnN0cnVjdG9yKHhUeXBlLCBjb2xvclNjYWxlKSB7CiAgICAgICAgICAgIHRoaXMucnVuMmRhdGFzZXRzID0ge307CiAgICAgICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IGNvbG9yU2NhbGU7CiAgICAgICAgICAgIHRoaXMuYnVpbGRDaGFydCh4VHlwZSk7CiAgICAgICAgfQogICAgICAgIGdldERhdGFzZXQocnVuKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJ1bjJkYXRhc2V0c1tydW5dID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMucnVuMmRhdGFzZXRzW3J1bl0gPSBuZXcgc3JjJDIuRGF0YXNldChbXSwgeyBydW46IHJ1biB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5ydW4yZGF0YXNldHNbcnVuXTsKICAgICAgICB9CiAgICAgICAgYnVpbGRDaGFydCh4VHlwZSkgewogICAgICAgICAgICBpZiAodGhpcy5vdXRlcikgewogICAgICAgICAgICAgICAgdGhpcy5vdXRlci5kZXN0cm95KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHhDb21wb25lbnRzID0gZ2V0WENvbXBvbmVudHMoeFR5cGUpOwogICAgICAgICAgICB0aGlzLnhBY2Nlc3NvciA9IHhDb21wb25lbnRzLmFjY2Vzc29yOwogICAgICAgICAgICB0aGlzLnhTY2FsZSA9IHhDb21wb25lbnRzLnNjYWxlOwogICAgICAgICAgICB0aGlzLnhBeGlzID0geENvbXBvbmVudHMuYXhpczsKICAgICAgICAgICAgdGhpcy54QXhpcy5tYXJnaW4oMCk7CiAgICAgICAgICAgIHRoaXMueEF4aXMudGlja0xhYmVsUGFkZGluZygzKTsKICAgICAgICAgICAgdGhpcy55U2NhbGUgPSBuZXcgc3JjJDIuU2NhbGVzLkxpbmVhcigpOwogICAgICAgICAgICB0aGlzLnlBeGlzID0gbmV3IHNyYyQyLkF4ZXMuTnVtZXJpYyh0aGlzLnlTY2FsZSwgJ2xlZnQnKTsKICAgICAgICAgICAgbGV0IHlGb3JtYXR0ZXIgPSBtdWx0aXNjYWxlRm9ybWF0dGVyKFlfQVhJU19GT1JNQVRURVJfUFJFQ0lTSU9OKTsKICAgICAgICAgICAgdGhpcy55QXhpcy5tYXJnaW4oMCkudGlja0xhYmVsUGFkZGluZyg1KS5mb3JtYXR0ZXIoeUZvcm1hdHRlcik7CiAgICAgICAgICAgIHRoaXMueUF4aXMudXNlc1RleHRXaWR0aEFwcHJveGltYXRpb24odHJ1ZSk7CiAgICAgICAgICAgIGxldCBjZW50ZXIgPSB0aGlzLmJ1aWxkUGxvdCh0aGlzLnhBY2Nlc3NvciwgdGhpcy54U2NhbGUsIHRoaXMueVNjYWxlKTsKICAgICAgICAgICAgdGhpcy5ncmlkbGluZXMgPSBuZXcgc3JjJDIuQ29tcG9uZW50cy5HcmlkbGluZXModGhpcy54U2NhbGUsIHRoaXMueVNjYWxlKTsKICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSBuZXcgc3JjJDIuQ29tcG9uZW50cy5Hcm91cChbdGhpcy5ncmlkbGluZXMsIGNlbnRlcl0pOwogICAgICAgICAgICB0aGlzLm91dGVyID0gbmV3IHNyYyQyLkNvbXBvbmVudHMuVGFibGUoWwogICAgICAgICAgICAgICAgW3RoaXMueUF4aXMsIHRoaXMuY2VudGVyXSwKICAgICAgICAgICAgICAgIFtudWxsLCB0aGlzLnhBeGlzXSwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgIGJ1aWxkUGxvdCh4QWNjZXNzb3IsIHhTY2FsZSwgeVNjYWxlKSB7CiAgICAgICAgICAgIGxldCBwZXJjZW50cyA9IFswLCAyMjgsIDE1ODcsIDMwODUsIDUwMDAsIDY5MTUsIDg0MTMsIDk3NzIsIDEwMDAwXTsKICAgICAgICAgICAgbGV0IG9wYWNpdGllcyA9IGxvZGFzaC5yYW5nZShwZXJjZW50cy5sZW5ndGggLSAxKS5tYXAoKGkpID0+IChwZXJjZW50c1tpICsgMV0gLSBwZXJjZW50c1tpXSkgLyAyNTAwKTsKICAgICAgICAgICAgbGV0IGFjY2Vzc29ycyA9IHBlcmNlbnRzLm1hcCgocCwgaSkgPT4gKGRhdHVtKSA9PiBkYXR1bVtpXVsxXSk7CiAgICAgICAgICAgIGxldCBtZWRpYW4gPSA0OwogICAgICAgICAgICBsZXQgbWVkaWFuQWNjZXNzb3IgPSBhY2Nlc3NvcnNbbWVkaWFuXTsKICAgICAgICAgICAgbGV0IHBsb3RzID0gbG9kYXNoLnJhbmdlKGFjY2Vzc29ycy5sZW5ndGggLSAxKS5tYXAoKGkpID0+IHsKICAgICAgICAgICAgICAgIGxldCBwID0gbmV3IHNyYyQyLlBsb3RzLkFyZWEoKTsKICAgICAgICAgICAgICAgIHAueCh4QWNjZXNzb3IsIHhTY2FsZSk7CiAgICAgICAgICAgICAgICBsZXQgeTAgPSBpID4gbWVkaWFuID8gYWNjZXNzb3JzW2ldIDogYWNjZXNzb3JzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGxldCB5ID0gaSA+IG1lZGlhbiA/IGFjY2Vzc29yc1tpICsgMV0gOiBhY2Nlc3NvcnNbaV07CiAgICAgICAgICAgICAgICBwLnkoeSwgeVNjYWxlKTsKICAgICAgICAgICAgICAgIHAueTAoeTApOwogICAgICAgICAgICAgICAgcC5hdHRyKCdmaWxsJywgKGQsIGksIGRhdGFzZXQpID0+IHRoaXMuY29sb3JTY2FsZS5zY2FsZShkYXRhc2V0Lm1ldGFkYXRhKCkucnVuKSk7CiAgICAgICAgICAgICAgICBwLmF0dHIoJ3N0cm9rZScsIChkLCBpLCBkYXRhc2V0KSA9PiB0aGlzLmNvbG9yU2NhbGUuc2NhbGUoZGF0YXNldC5tZXRhZGF0YSgpLnJ1bikpOwogICAgICAgICAgICAgICAgcC5hdHRyKCdzdHJva2Utd2VpZ2h0JywgKGQsIGksIG0pID0+ICcwLjVweCcpOwogICAgICAgICAgICAgICAgcC5hdHRyKCdzdHJva2Utb3BhY2l0eScsICgpID0+IG9wYWNpdGllc1tpXSk7CiAgICAgICAgICAgICAgICBwLmF0dHIoJ2ZpbGwtb3BhY2l0eScsICgpID0+IG9wYWNpdGllc1tpXSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGxldCBtZWRpYW5QbG90ID0gbmV3IHNyYyQyLlBsb3RzLkxpbmUoKTsKICAgICAgICAgICAgbWVkaWFuUGxvdC54KHhBY2Nlc3NvciwgeFNjYWxlKTsKICAgICAgICAgICAgbWVkaWFuUGxvdC55KG1lZGlhbkFjY2Vzc29yLCB5U2NhbGUpOwogICAgICAgICAgICBtZWRpYW5QbG90LmF0dHIoJ3N0cm9rZScsIChkLCBpLCBtKSA9PiB0aGlzLmNvbG9yU2NhbGUuc2NhbGUobS5ydW4pKTsKICAgICAgICAgICAgdGhpcy5wbG90cyA9IHBsb3RzOwogICAgICAgICAgICByZXR1cm4gbmV3IHNyYyQyLkNvbXBvbmVudHMuR3JvdXAocGxvdHMpOwogICAgICAgIH0KICAgICAgICBzZXRWaXNpYmxlU2VyaWVzKHJ1bnMpIHsKICAgICAgICAgICAgdGhpcy5ydW5zID0gcnVuczsKICAgICAgICAgICAgbGV0IGRhdGFzZXRzID0gcnVucy5tYXAoKHIpID0+IHRoaXMuZ2V0RGF0YXNldChyKSk7CiAgICAgICAgICAgIHRoaXMucGxvdHMuZm9yRWFjaCgocCkgPT4gcC5kYXRhc2V0cyhkYXRhc2V0cykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXQgdGhlIGRhdGEgb2YgYSBzZXJpZXMgb24gdGhlIGNoYXJ0LgogICAgICAgICAqLwogICAgICAgIHNldFNlcmllc0RhdGEobmFtZSwgZGF0YSkgewogICAgICAgICAgICB0aGlzLmdldERhdGFzZXQobmFtZSkuZGF0YShkYXRhKTsKICAgICAgICB9CiAgICAgICAgcmVuZGVyVG8odGFyZ2V0U1ZHKSB7CiAgICAgICAgICAgIHRoaXMudGFyZ2V0U1ZHID0gdGFyZ2V0U1ZHOwogICAgICAgICAgICB0aGlzLm91dGVyLnJlbmRlclRvKHRhcmdldFNWRyk7CiAgICAgICAgfQogICAgICAgIHJlZHJhdygpIHsKICAgICAgICAgICAgdGhpcy5vdXRlci5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5vdXRlci5kZXN0cm95KCk7CiAgICAgICAgfQogICAgfQogICAgbGV0IF9WekRpc3RyaWJ1dGlvbkNoYXJ0ID0gY2xhc3MgX1Z6RGlzdHJpYnV0aW9uQ2hhcnQgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gbmV3IHNyYyQyLlNjYWxlcy5Db2xvcigpLnJhbmdlKGNhdGVnb3J5MTAuc2xpY2UoKSk7CiAgICAgICAgICAgIHRoaXMueFR5cGUgPSAnc3RlcCc7CiAgICAgICAgICAgIHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSA9IFtdOwogICAgICAgICAgICB0aGlzLl9zZXJpZXNEYXRhQ2FjaGUgPSB7fTsKICAgICAgICAgICAgdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgc2V0VmlzaWJsZVNlcmllcyhuYW1lcykgewogICAgICAgICAgICB0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUgPSBuYW1lczsKICAgICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKG5hbWVzKTsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuX3Nlcmllc0RhdGFDYWNoZVtuYW1lXSA9IGRhdGE7CiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFydCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hhcnQuc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWRyYXcoKSB7CiAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICBfbWFrZUNoYXJ0KCkgewogICAgICAgICAgICB2YXIgeFR5cGUgPSB0aGlzLnhUeXBlOwogICAgICAgICAgICB2YXIgY29sb3JTY2FsZSA9IHRoaXMuY29sb3JTY2FsZTsKICAgICAgICAgICAgdmFyIF9hdHRhY2hlZCA9IHRoaXMuX2F0dGFjaGVkOwogICAgICAgICAgICBpZiAodGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEFzeW5jKHRoaXMuX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbWFrZUNoYXJ0QXN5bmNDYWxsYmFja0lkID0gdGhpcy5hc3luYyhmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tYWtlQ2hhcnRBc3luY0NhbGxiYWNrSWQgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKCFfYXR0YWNoZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0KQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0LmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIHZhciBjaGFydCA9IG5ldyBEaXN0cmlidXRpb25DaGFydCh4VHlwZSwgY29sb3JTY2FsZSk7CiAgICAgICAgICAgICAgICB2YXIgc3ZnID0gc2VsZWN0KHRoaXMuJC5jaGFydGRpdik7CiAgICAgICAgICAgICAgICBjaGFydC5yZW5kZXJUbyhzdmcpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhcnQgPSBjaGFydDsKICAgICAgICAgICAgfSwgMzUwKTsKICAgICAgICB9CiAgICAgICAgX3JlbG9hZEZyb21DYWNoZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NoYXJ0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFydC5zZXRWaXNpYmxlU2VyaWVzKHRoaXMuX3Zpc2libGVTZXJpZXNDYWNoZSk7CiAgICAgICAgICAgICAgICB0aGlzLl92aXNpYmxlU2VyaWVzQ2FjaGUuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYXJ0LnNldFNlcmllc0RhdGEobmFtZSwgdGhpcy5fc2VyaWVzRGF0YUNhY2hlW25hbWVdIHx8IFtdKTsKICAgICAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZGV0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgfTsKICAgIF9WekRpc3RyaWJ1dGlvbkNoYXJ0LnRlbXBsYXRlID0gaHRtbCBgCiAgICA8c3R5bGUgaW5jbHVkZT0icGxvdHRhYmxlLXN0eWxlIj48L3N0eWxlPgogICAgPGRpdiBpZD0iY2hhcnRkaXYiPjwvZGl2PgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CiAgICAgICNjaGFydGRpdiB7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGZsZXgtZ3JvdzogMTsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBzcmMkMi5TY2FsZXMuQ29sb3IpCiAgICBdLCBfVnpEaXN0cmlidXRpb25DaGFydC5wcm90b3R5cGUsICJjb2xvclNjYWxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgX1Z6RGlzdHJpYnV0aW9uQ2hhcnQucHJvdG90eXBlLCAieFR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9WekRpc3RyaWJ1dGlvbkNoYXJ0LnByb3RvdHlwZSwgIl9hdHRhY2hlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIERpc3RyaWJ1dGlvbkNoYXJ0KQogICAgXSwgX1Z6RGlzdHJpYnV0aW9uQ2hhcnQucHJvdG90eXBlLCAiX2NoYXJ0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIF9WekRpc3RyaWJ1dGlvbkNoYXJ0LnByb3RvdHlwZSwgIl92aXNpYmxlU2VyaWVzQ2FjaGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVnpEaXN0cmlidXRpb25DaGFydC5wcm90b3R5cGUsICJfc2VyaWVzRGF0YUNhY2hlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgX1Z6RGlzdHJpYnV0aW9uQ2hhcnQucHJvdG90eXBlLCAiX21ha2VDaGFydEFzeW5jQ2FsbGJhY2tJZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCd4VHlwZScsICdjb2xvclNjYWxlJywgJ19hdHRhY2hlZCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgX1Z6RGlzdHJpYnV0aW9uQ2hhcnQucHJvdG90eXBlLCAiX21ha2VDaGFydCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX2NoYXJ0JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBfVnpEaXN0cmlidXRpb25DaGFydC5wcm90b3R5cGUsICJfcmVsb2FkRnJvbUNhY2hlIiwgbnVsbCk7CiAgICBfVnpEaXN0cmlidXRpb25DaGFydCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3Z6LWRpc3RyaWJ1dGlvbi1jaGFydCcpCiAgICBdLCBfVnpEaXN0cmlidXRpb25DaGFydCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAgdGYtZGlzdHJpYnV0aW9uLWxvYWRlciBsb2FkcyBhbiBpbmRpdmlkdWFsIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZQogICAgICBUZW5zb3JCb2FyZCBiYWNrZW5kLCBhbmQgcmVuZGVycyBpdCBpbnRvIGEgdnotZGlzdHJpYnV0aW9uLWNoYXJ0LgogICAgKi8KICAgIGxldCBfVGZEaXN0cmlidXRpb25Mb2FkZXIgPSBjbGFzcyBfVGZEaXN0cmlidXRpb25Mb2FkZXIgZXh0ZW5kcyBEYXRhTG9hZGVyQmVoYXZpb3IoTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLmdldERhdGFMb2FkTmFtZSA9ICh7IHJ1biB9KSA9PiBydW47CiAgICAgICAgICAgIHRoaXMucmVxdWVzdERhdGEgPSAoaXRlbXMsIG9uTG9hZCwgb25GaW5pc2gpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGdldFJvdXRlcigpOwogICAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHJvdXRlci5wbHVnaW5Sb3V0ZSgnZGlzdHJpYnV0aW9ucycsICcvZGlzdHJpYnV0aW9ucycpOwogICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYWRkUGFyYW1zKGJhc2VVcmwsIHsgdGFnOiBpdGVtLnRhZywgcnVuOiBpdGVtLnJ1biB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCh1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB2b2lkIG9uTG9hZCh7IGl0ZW0sIGRhdGEgfSkpOwogICAgICAgICAgICAgICAgfSkpLmZpbmFsbHkoKCkgPT4gdm9pZCBvbkZpbmlzaCgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5sb2FkRGF0YUNhbGxiYWNrID0gKF8sIGRhdHVtLCBiYWNrZW5kRGF0YSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IGJhY2tlbmREYXRhLm1hcCgoZGF0dW0pID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBgdnotZGlzdHJpYnV0aW9uLWNoYXJ0YCB3YW50cyBlYWNoIGRhdHVtIGFzIGFuIGFycmF5IHdpdGgKICAgICAgICAgICAgICAgICAgICAvLyBleHRyYSBgd2FsbF90aW1lYCBhbmQgYHN0ZXBgIHByb3BlcnRpZXMuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgW3dhbGxfdGltZSwgc3RlcCwgYmluc10gPSBkYXR1bTsKICAgICAgICAgICAgICAgICAgICBiaW5zLndhbGxfdGltZSA9IG5ldyBEYXRlKHdhbGxfdGltZSAqIDEwMDApOwogICAgICAgICAgICAgICAgICAgIGJpbnMuc3RlcCA9IHN0ZXA7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbnM7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERhdGFMb2FkTmFtZShkYXR1bSk7CiAgICAgICAgICAgICAgICB0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKTsKICAgICAgICAgICAgICAgIHRoaXMuJC5jaGFydC5zZXRWaXNpYmxlU2VyaWVzKFtuYW1lXSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2NvbG9yU2NhbGUgPSB7IHNjYWxlOiBydW5zQ29sb3JTY2FsZSB9OwogICAgICAgICAgICB0aGlzLl9leHBhbmRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9jYW5jZWxsZXIgPSBuZXcgQ2FuY2VsbGVyKCk7CiAgICAgICAgfQogICAgICAgIF9yZWxvYWRPblJ1blRhZ0NoYW5nZSgpIHsKICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZURhdGFUb0xvYWQoKSB7CiAgICAgICAgICAgIHZhciBydW4gPSB0aGlzLnJ1bjsKICAgICAgICAgICAgdmFyIHRhZyA9IHRoaXMudGFnOwogICAgICAgICAgICB0aGlzLmRhdGFUb0xvYWQgPSBbeyBydW4sIHRhZyB9XTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9ydW5Db2xvcigpIHsKICAgICAgICAgICAgdmFyIHJ1biA9IHRoaXMucnVuOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29sb3JTY2FsZS5zY2FsZShydW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBc2sgdGhlIGRpc3RyaWJ1dGlvbiBjaGFydCB0byByZWRyYXcgaXRzZWxmLiBUaGlzIHNob3VsZCBiZQogICAgICAgICAqIGNhbGxlZCB3aGVuZXZlciB0aGUgZGltZW5zaW9ucyBvZiB0aGUgdmlldyBjaGFuZ2UgKGUuZy4sIHdoZW4KICAgICAgICAgKiB0aGUgY2FyZCBpcyBleHBhbmRlZCksIGFzIHRoZSBkaXN0cmlidXRpb24gY2hhcnQgd2lsbCBuZWVkIHRvCiAgICAgICAgICogcmVjYWxjdWxhdGUgaXRzIGxheW91dC4KICAgICAgICAgKi8KICAgICAgICByZWRyYXcoKSB7CiAgICAgICAgICAgIHRoaXMuJC5jaGFydC5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUV4cGFuZGVkKGUpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19leHBhbmRlZCcsICF0aGlzLl9leHBhbmRlZCk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgfTsKICAgIF9UZkRpc3RyaWJ1dGlvbkxvYWRlci50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIHJ1bj0iW1tydW5dXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICAgIGNvbG9yPSJbW19ydW5Db2xvcl1dIgogICAgPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPCEtLQogICAgICBUaGUgbWFpbiBkaXN0cmlidXRpb24gdGhhdCB3ZSByZW5kZXIuIERhdGEgaXMgc2V0IGRpcmVjdGx5IHdpdGgKICAgICAgXGBzZXRTZXJpZXNEYXRhXGAsIG5vdCB3aXRoIGEgYm91bmQgcHJvcGVydHkuCiAgICAtLT4KICAgIDx2ei1kaXN0cmlidXRpb24tY2hhcnQKICAgICAgaWQ9ImNoYXJ0IgogICAgICB4LXR5cGU9IltbeFR5cGVdXSIKICAgICAgY29sb3Itc2NhbGU9IltbX2NvbG9yU2NhbGVdXSIKICAgID48L3Z6LWRpc3RyaWJ1dGlvbi1jaGFydD4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAicnVuIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgX1RmRGlzdHJpYnV0aW9uTG9hZGVyLnByb3RvdHlwZSwgInRhZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkRpc3RyaWJ1dGlvbkxvYWRlci5wcm90b3R5cGUsICJ0YWdNZXRhZGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9UZkRpc3RyaWJ1dGlvbkxvYWRlci5wcm90b3R5cGUsICJ4VHlwZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkRpc3RyaWJ1dGlvbkxvYWRlci5wcm90b3R5cGUsICJnZXREYXRhTG9hZE5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAibG9hZERhdGFDYWxsYmFjayIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIF9UZkRpc3RyaWJ1dGlvbkxvYWRlci5wcm90b3R5cGUsICJfY29sb3JTY2FsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAiX2V4cGFuZGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVxdWVzdE1hbmFnZXIpCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAicmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBDYW5jZWxsZXIpCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAiX2NhbmNlbGxlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdydW4nLCAndGFnJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAiX3JlbG9hZE9uUnVuVGFnQ2hhbmdlIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdydW4nLCAndGFnJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBfVGZEaXN0cmlidXRpb25Mb2FkZXIucHJvdG90eXBlLCAiX3VwZGF0ZURhdGFUb0xvYWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdydW4nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIF9UZkRpc3RyaWJ1dGlvbkxvYWRlci5wcm90b3R5cGUsICJfcnVuQ29sb3IiLCBudWxsKTsKICAgIF9UZkRpc3RyaWJ1dGlvbkxvYWRlciA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXInKQogICAgXSwgX1RmRGlzdHJpYnV0aW9uTG9hZGVyKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICBBIGZyb250ZW5kIHRoYXQgZGlzcGxheXMgYSBzZXQgb2YgdGYtZGlzdHJpYnV0aW9uLWxvYWRlcnMsIGVhY2ggb2YKICAgICAgd2hpY2ggZGlzcGxheXMgdGhlIGRpc3RyaWJ1dGlvbiBmb3IgYSBzaW5nbGUgdGFnIG9uIGEgc2luZ2xlIHJ1bi4gVGhpcwogICAgICBkYXNoYm9hcmQgcHJvdmlkZXMgYSBjYXRlZ29yaXplciBhbmQgYWJjaXNzYSBzZWxldG9yIChzdGVwLCByZWxhdGl2ZSwKICAgICAgb3Igd2FsbCB0aW1lKS4KICAgICovCiAgICBsZXQgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQgPSBjbGFzcyBUZkRpc3RyaWJ1dGlvbkRhc2hib2FyZCBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLnJlbG9hZE9uUmVhZHkgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl94VHlwZSA9ICdzdGVwJzsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIgPSBuZXcgUmVxdWVzdE1hbmFnZXIoKTsKICAgICAgICB9CiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbG9hZE9uUmVhZHkpCiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICByZWxvYWQoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZldGNoVGFncygpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkRGlzdHJpYnV0aW9ucygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2ZldGNoVGFncygpIHsKICAgICAgICAgICAgY29uc3QgdXJsID0gZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ2Rpc3RyaWJ1dGlvbnMnLCAnL3RhZ3MnKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKChydW5Ub1RhZ0luZm8pID0+IHsKICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNFcXVhbChydW5Ub1RhZ0luZm8sIHRoaXMuX3J1blRvVGFnSW5mbykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHVwZGF0ZSBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcy4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBydW5Ub1RhZyA9IGxvZGFzaC5tYXBWYWx1ZXMocnVuVG9UYWdJbmZvLCAoeCkgPT4gT2JqZWN0LmtleXMoeCkpOwogICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IGdldFRhZ3MocnVuVG9UYWcpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19kYXRhTm90Rm91bmQnLCB0YWdzLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3J1blRvVGFnJywgcnVuVG9UYWcpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19ydW5Ub1RhZ0luZm8nLCBydW5Ub1RhZ0luZm8pOwogICAgICAgICAgICAgICAgdGhpcy5hc3luYygoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50IGFib3ZlIGBfY2F0ZWdvcmllc0RvbVJlYWR5YC4KICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2NhdGVnb3JpZXNEb21SZWFkeScsIHRydWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfcmVsb2FkRGlzdHJpYnV0aW9ucygpIHsKICAgICAgICAgICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXInKS5mb3JFYWNoKChsb2FkZXIpID0+IHsKICAgICAgICAgICAgICAgIGxvYWRlci5yZWxvYWQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9zaG91bGRPcGVuKGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiBpbmRleCA8PSAyOwogICAgICAgIH0KICAgICAgICBnZXQgX2NhdGVnb3JpZXMoKSB7CiAgICAgICAgICAgIHZhciBydW5Ub1RhZyA9IHRoaXMuX3J1blRvVGFnOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRSdW5zID0gdGhpcy5fc2VsZWN0ZWRSdW5zOwogICAgICAgICAgICB2YXIgdGFnRmlsdGVyID0gdGhpcy5fdGFnRmlsdGVyOwogICAgICAgICAgICB2YXIgY2F0ZWdvcmllc0RvbVJlYWR5ID0gdGhpcy5fY2F0ZWdvcmllc0RvbVJlYWR5OwogICAgICAgICAgICByZXR1cm4gY2F0ZWdvcml6ZVJ1blRhZ0NvbWJpbmF0aW9ucyhydW5Ub1RhZywgc2VsZWN0ZWRSdW5zLCB0YWdGaWx0ZXIpOwogICAgICAgIH0KICAgICAgICBfdGFnTWV0YWRhdGEocnVuVG9UYWdJbmZvLCBydW4sIHRhZykgewogICAgICAgICAgICByZXR1cm4gcnVuVG9UYWdJbmZvW3J1bl1bdGFnXTsKICAgICAgICB9CiAgICB9OwogICAgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQudGVtcGxhdGUgPSBodG1sIGAKICAgIDx0Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyIiBzbG90PSJzaWRlYmFyIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8dGYtb3B0aW9uLXNlbGVjdG9yCiAgICAgICAgICAgICAgaWQ9InhUeXBlU2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iSG9yaXpvbnRhbCBheGlzIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e194VHlwZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9IndhbGxfdGltZSI+d2FsbDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CgogICAgICA8ZGl2IGNsYXNzPSJjZW50ZXIiIHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gZGlzdHJpYnV0aW9uIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgICAoSGlzdG9ncmFtcyBhbmQgZGlzdHJpYnV0aW9ucyBib3RoIHVzZSB0aGUgaGlzdG9ncmFtIHN1bW1hcnkKICAgICAgICAgICAgICAgIG9wZXJhdGlvbi4pCiAgICAgICAgICAgICAgPC9saT4KCiAgICAgICAgICAgICAgPGxpPlRlbnNvckJvYXJkIGNhbuKAmXQgZmluZCB5b3VyIGV2ZW50IGZpbGVzLjwvbGk+CiAgICAgICAgICAgIDwvdWw+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLWRpc3RyaWJ1dGlvbi1sb2FkZXIKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfdGFnTWV0YWRhdGEoX3J1blRvVGFnSW5mbywgaXRlbS5ydW4sIGl0ZW0udGFnKV1dIgogICAgICAgICAgICAgICAgICB4LXR5cGU9IltbX3hUeXBlXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgID48L3RmLWRpc3RyaWJ1dGlvbi1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkRpc3RyaWJ1dGlvbkRhc2hib2FyZC5wcm90b3R5cGUsICJyZWxvYWRPblJlYWR5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQucHJvdG90eXBlLCAiX3hUeXBlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmRGlzdHJpYnV0aW9uRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9zZWxlY3RlZFJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkRpc3RyaWJ1dGlvbkRhc2hib2FyZC5wcm90b3R5cGUsICJfcnVuVG9UYWciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkRpc3RyaWJ1dGlvbkRhc2hib2FyZC5wcm90b3R5cGUsICJfcnVuVG9UYWdJbmZvIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkRpc3RyaWJ1dGlvbkRhc2hib2FyZC5wcm90b3R5cGUsICJfZGF0YU5vdEZvdW5kIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQucHJvdG90eXBlLCAiX3RhZ0ZpbHRlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQucHJvdG90eXBlLCAiX2NhdGVnb3JpZXNEb21SZWFkeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfcnVuVG9UYWcnLCAnX3NlbGVjdGVkUnVucycsICdfdGFnRmlsdGVyJywgJ19jYXRlZ29yaWVzRG9tUmVhZHknKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZEaXN0cmlidXRpb25EYXNoYm9hcmQucHJvdG90eXBlLCAiX2NhdGVnb3JpZXMiLCBudWxsKTsKICAgIFRmRGlzdHJpYnV0aW9uRGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZGlzdHJpYnV0aW9uLWRhc2hib2FyZCcpCiAgICBdLCBUZkRpc3RyaWJ1dGlvbkRhc2hib2FyZCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCgogICAgdmFyIHRmX3N0b3JhZ2UgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIExpc3RlbktleTogTGlzdGVuS2V5LAogICAgICAgIGFkZEhhc2hMaXN0ZW5lcjogYWRkSGFzaExpc3RlbmVyLAogICAgICAgIGFkZFN0b3JhZ2VMaXN0ZW5lcjogYWRkU3RvcmFnZUxpc3RlbmVyLAogICAgICAgIGZpcmVTdG9yYWdlQ2hhbmdlZDogZmlyZVN0b3JhZ2VDaGFuZ2VkLAogICAgICAgIHJlbW92ZUhhc2hMaXN0ZW5lckJ5S2V5OiByZW1vdmVIYXNoTGlzdGVuZXJCeUtleSwKICAgICAgICByZW1vdmVTdG9yYWdlTGlzdGVuZXJCeUtleTogcmVtb3ZlU3RvcmFnZUxpc3RlbmVyQnlLZXksCiAgICAgICAgVEFCOiBUQUIsCiAgICAgICAgRElTQU1CSUdVQVRPUjogRElTQU1CSUdVQVRPUiwKICAgICAgICBnZXRVcmxEaWN0OiBnZXRVcmxEaWN0LAogICAgICAgIGdldFN0cmluZzogZ2V0U3RyaW5nLAogICAgICAgIHNldFN0cmluZzogc2V0U3RyaW5nLAogICAgICAgIGdldFN0cmluZ0luaXRpYWxpemVyOiBnZXRTdHJpbmdJbml0aWFsaXplciwKICAgICAgICBnZXRTdHJpbmdPYnNlcnZlcjogZ2V0U3RyaW5nT2JzZXJ2ZXIsCiAgICAgICAgZGlzcG9zZVN0cmluZ0JpbmRpbmc6IGRpc3Bvc2VTdHJpbmdCaW5kaW5nLAogICAgICAgIGdldEJvb2xlYW46IGdldEJvb2xlYW4sCiAgICAgICAgc2V0Qm9vbGVhbjogc2V0Qm9vbGVhbiwKICAgICAgICBnZXRCb29sZWFuSW5pdGlhbGl6ZXI6IGdldEJvb2xlYW5Jbml0aWFsaXplciwKICAgICAgICBnZXRCb29sZWFuT2JzZXJ2ZXI6IGdldEJvb2xlYW5PYnNlcnZlciwKICAgICAgICBkaXNwb3NlQm9vbGVhbkJpbmRpbmc6IGRpc3Bvc2VCb29sZWFuQmluZGluZywKICAgICAgICBnZXROdW1iZXI6IGdldE51bWJlciwKICAgICAgICBzZXROdW1iZXI6IHNldE51bWJlciwKICAgICAgICBnZXROdW1iZXJJbml0aWFsaXplcjogZ2V0TnVtYmVySW5pdGlhbGl6ZXIsCiAgICAgICAgZ2V0TnVtYmVyT2JzZXJ2ZXI6IGdldE51bWJlck9ic2VydmVyLAogICAgICAgIGRpc3Bvc2VOdW1iZXJCaW5kaW5nOiBkaXNwb3NlTnVtYmVyQmluZGluZywKICAgICAgICBnZXRPYmplY3Q6IGdldE9iamVjdCwKICAgICAgICBzZXRPYmplY3Q6IHNldE9iamVjdCwKICAgICAgICBnZXRPYmplY3RJbml0aWFsaXplcjogZ2V0T2JqZWN0SW5pdGlhbGl6ZXIsCiAgICAgICAgZ2V0T2JqZWN0T2JzZXJ2ZXI6IGdldE9iamVjdE9ic2VydmVyLAogICAgICAgIGRpc3Bvc2VPYmplY3RCaW5kaW5nOiBkaXNwb3NlT2JqZWN0QmluZGluZywKICAgICAgICBtYWtlQmluZGluZ3M6IG1ha2VCaW5kaW5ncywKICAgICAgICBtaWdyYXRlTGVnYWN5VVJMU2NoZW1lOiBtaWdyYXRlTGVnYWN5VVJMU2NoZW1lCiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8vIE5vdGUgdGhhdCB0Zi1ncmFwaC1jb250cm9sIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mIHRoZSBlbnVtLgogICAgLy8gUG9seW1lciBkb2VzIG5vdCBsZXQgb25lIHVzZSBKUyB2YXJpYWJsZSBhcyBhIHByb3AuCiAgICB2YXIgU2VsZWN0aW9uVHlwZTsKICAgIChmdW5jdGlvbiAoU2VsZWN0aW9uVHlwZSkgewogICAgICAgIFNlbGVjdGlvblR5cGVbIk9QX0dSQVBIIl0gPSAib3BfZ3JhcGgiOwogICAgICAgIFNlbGVjdGlvblR5cGVbIkNPTkNFUFRVQUxfR1JBUEgiXSA9ICJjb25jZXB0dWFsX2dyYXBoIjsKICAgICAgICBTZWxlY3Rpb25UeXBlWyJQUk9GSUxFIl0gPSAicHJvZmlsZSI7CiAgICB9KShTZWxlY3Rpb25UeXBlIHx8IChTZWxlY3Rpb25UeXBlID0ge30pKTsKICAgIC8qKiBFbnVtcyBlbGVtZW50IGNsYXNzIG9mIG9iamVjdHMgaW4gdGhlIHNjZW5lICovCiAgICBsZXQgQ2xhc3MkMSA9IHsKICAgICAgICBOb2RlOiB7CiAgICAgICAgICAgIC8vIDxnPiBlbGVtZW50IHRoYXQgY29udGFpbnMgbm9kZXMuCiAgICAgICAgICAgIENPTlRBSU5FUjogJ25vZGVzJywKICAgICAgICAgICAgLy8gPGc+IGVsZW1lbnQgdGhhdCBjb250YWlucyBkZXRhaWwgYWJvdXQgYSBub2RlLgogICAgICAgICAgICBHUk9VUDogJ25vZGUnLAogICAgICAgICAgICAvLyA8Zz4gZWxlbWVudCB0aGF0IGNvbnRhaW5zIHZpc3VhbCBlbGVtZW50cyAobGlrZSByZWN0LCBlbGxpcHNlKS4KICAgICAgICAgICAgU0hBUEU6ICdub2Rlc2hhcGUnLAogICAgICAgICAgICAvLyA8Kj4gZWxlbWVudChzKSB1bmRlciBTSEFQRSB0aGF0IHNob3VsZCByZWNlaXZlIGNvbG9yIHVwZGF0ZXMuCiAgICAgICAgICAgIENPTE9SX1RBUkdFVDogJ25vZGVjb2xvcnRhcmdldCcsCiAgICAgICAgICAgIC8vIDx0ZXh0PiBlbGVtZW50IHNob3dpbmcgdGhlIG5vZGUncyBsYWJlbC4KICAgICAgICAgICAgTEFCRUw6ICdub2RlbGFiZWwnLAogICAgICAgICAgICAvLyA8Zz4gZWxlbWVudCB0aGF0IGNvbnRhaW5zIGFsbCB2aXN1YWxzIGZvciB0aGUgZXhwYW5kL2NvbGxhcHNlCiAgICAgICAgICAgIC8vIGJ1dHRvbiBmb3IgZXhwYW5kYWJsZSBncm91cCBub2Rlcy4KICAgICAgICAgICAgQlVUVE9OX0NPTlRBSU5FUjogJ2J1dHRvbmNvbnRhaW5lcicsCiAgICAgICAgICAgIC8vIDxjaXJjbGU+IGVsZW1lbnQgdGhhdCBzdXJyb3VuZHMgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbnMuCiAgICAgICAgICAgIEJVVFRPTl9DSVJDTEU6ICdidXR0b25jaXJjbGUnLAogICAgICAgICAgICAvLyA8cGF0aD4gZWxlbWVudCBvZiB0aGUgZXhwYW5kIGJ1dHRvbi4KICAgICAgICAgICAgRVhQQU5EX0JVVFRPTjogJ2V4cGFuZGJ1dHRvbicsCiAgICAgICAgICAgIC8vIDxwYXRoPiBlbGVtZW50IG9mIHRoZSBjb2xsYXBzZSBidXR0b24uCiAgICAgICAgICAgIENPTExBUFNFX0JVVFRPTjogJ2NvbGxhcHNlYnV0dG9uJywKICAgICAgICB9LAogICAgICAgIEVkZ2U6IHsKICAgICAgICAgICAgQ09OVEFJTkVSOiAnZWRnZXMnLAogICAgICAgICAgICBHUk9VUDogJ2VkZ2UnLAogICAgICAgICAgICBMSU5FOiAnZWRnZWxpbmUnLAogICAgICAgICAgICBSRUZFUkVOQ0VfRURHRTogJ3JlZmVyZW5jZWVkZ2UnLAogICAgICAgICAgICBSRUZfTElORTogJ3JlZmxpbmUnLAogICAgICAgICAgICBTRUxFQ1RBQkxFOiAnc2VsZWN0YWJsZWVkZ2UnLAogICAgICAgICAgICBTRUxFQ1RFRDogJ3NlbGVjdGVkZWRnZScsCiAgICAgICAgICAgIFNUUlVDVFVSQUw6ICdzdHJ1Y3R1cmFsJywKICAgICAgICB9LAogICAgICAgIEFubm90YXRpb246IHsKICAgICAgICAgICAgT1VUQk9YOiAnb3V0LWFubm90YXRpb25zJywKICAgICAgICAgICAgSU5CT1g6ICdpbi1hbm5vdGF0aW9ucycsCiAgICAgICAgICAgIEdST1VQOiAnYW5ub3RhdGlvbicsCiAgICAgICAgICAgIE5PREU6ICdhbm5vdGF0aW9uLW5vZGUnLAogICAgICAgICAgICBFREdFOiAnYW5ub3RhdGlvbi1lZGdlJywKICAgICAgICAgICAgQ09OVFJPTF9FREdFOiAnYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UnLAogICAgICAgICAgICBMQUJFTDogJ2Fubm90YXRpb24tbGFiZWwnLAogICAgICAgICAgICBFTExJUFNJUzogJ2Fubm90YXRpb24tZWxsaXBzaXMnLAogICAgICAgIH0sCiAgICAgICAgU2NlbmU6IHsKICAgICAgICAgICAgR1JPVVA6ICdzY2VuZScsCiAgICAgICAgICAgIENPUkU6ICdjb3JlJywKICAgICAgICAgICAgRlVOQ1RJT05fTElCUkFSWTogJ2Z1bmN0aW9uLWxpYnJhcnknLAogICAgICAgICAgICBJTkVYVFJBQ1Q6ICdpbi1leHRyYWN0JywKICAgICAgICAgICAgT1VURVhUUkFDVDogJ291dC1leHRyYWN0JywKICAgICAgICB9LAogICAgICAgIFN1YnNjZW5lOiB7IEdST1VQOiAnc3Vic2NlbmUnIH0sCiAgICAgICAgT1BOT0RFOiAnb3AnLAogICAgICAgIE1FVEFOT0RFOiAnbWV0YScsCiAgICAgICAgU0VSSUVTTk9ERTogJ3NlcmllcycsCiAgICAgICAgQlJJREdFTk9ERTogJ2JyaWRnZScsCiAgICAgICAgRUxMSVBTSVNOT0RFOiAnZWxsaXBzaXMnLAogICAgfTsKICAgIGNvbnN0IFNWR19OQU1FU1BBQ0UgPSAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnOwogICAgLyoqCiAgICAgKiBHaXZlbiBhIGNvbnRhaW5lciBkMyBzZWxlY3Rpb24sIHNlbGVjdCBhIGNoaWxkIGVsZW1lbnQgb2YgYSBnaXZlbiB0YWcgYW5kCiAgICAgKiBjbGFzcy4gSWYgbXVsdGlwbGUgY2hpbGRyZW4gbWF0Y2hlcyB0aGUgdGFnIGFuZCBjbGFzcyBuYW1lLCByZXR1cm5zIG9ubHkKICAgICAqIHRoZSBmaXJzdCBvbmUuCiAgICAgKgogICAgICogQHBhcmFtIGNvbnRhaW5lcgogICAgICogQHBhcmFtIHRhZ05hbWUgdGFnIG5hbWUuCiAgICAgKiBAcGFyYW0gY2xhc3NOYW1lIChvcHRpb25hbCkgQ2xhc3MgbmFtZSBvciBsaXN0IG9mIGNsYXNzIG5hbWVzLgogICAgICogQHJldHVybiBzZWxlY3Rpb24gb2YgdGhlIGVsZW1lbnQsIG9yIGFuIGVtcHR5IHNlbGVjdGlvbgogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RDaGlsZChjb250YWluZXIsIHRhZ05hbWUsIGNsYXNzTmFtZSkgewogICAgICAgIGxldCBjaGlsZHJlbiA9IGNvbnRhaW5lci5ub2RlKCkuY2hpbGROb2RlczsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCBjaGlsZCA9IGNoaWxkcmVuW2ldOwogICAgICAgICAgICBpZiAoY2hpbGQudGFnTmFtZSA9PT0gdGFnTmFtZSkgewogICAgICAgICAgICAgICAgaWYgKGNsYXNzTmFtZSBpbnN0YW5jZW9mIEFycmF5KSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGhhc0FsbENsYXNzZXMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgY2xhc3NOYW1lLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0FsbENsYXNzZXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzQWxsQ2xhc3NlcyAmJiBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lW2pdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0FsbENsYXNzZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdChjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIWNsYXNzTmFtZSB8fCBjaGlsZC5jbGFzc0xpc3QuY29udGFpbnMoY2xhc3NOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzZWxlY3QoY2hpbGQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBzZWxlY3QobnVsbCk7CiAgICB9CiAgICAvKioKICAgICAqIEdpdmVuIGEgY29udGFpbmVyIGQzIHNlbGVjdGlvbiwgc2VsZWN0IGEgY2hpbGQgc3ZnIGVsZW1lbnQgb2YgYSBnaXZlbiB0YWcKICAgICAqIGFuZCBjbGFzcyBpZiBleGlzdHMgb3IgYXBwZW5kIC8gaW5zZXJ0IG9uZSBvdGhlcndpc2UuICBJZiBtdWx0aXBsZSBjaGlsZHJlbgogICAgICogbWF0Y2hlcyB0aGUgdGFnIGFuZCBjbGFzcyBuYW1lLCByZXR1cm5zIG9ubHkgdGhlIGZpcnN0IG9uZS4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyCiAgICAgKiBAcGFyYW0gdGFnTmFtZSB0YWcgbmFtZS4KICAgICAqIEBwYXJhbSBjbGFzc05hbWUgKG9wdGlvbmFsKSBDbGFzcyBuYW1lIG9yIGEgbGlzdCBvZiBjbGFzcyBuYW1lcy4KICAgICAqIEBwYXJhbSBiZWZvcmUgKG9wdGlvbmFsKSByZWZlcmVuY2UgRE9NIG5vZGUgZm9yIGluc2VydGlvbi4KICAgICAqIEByZXR1cm4gc2VsZWN0aW9uIG9mIHRoZSBlbGVtZW50CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoY29udGFpbmVyLCB0YWdOYW1lLCBjbGFzc05hbWUsIGJlZm9yZSkgewogICAgICAgIGxldCBjaGlsZCA9IHNlbGVjdENoaWxkKGNvbnRhaW5lciwgdGFnTmFtZSwgY2xhc3NOYW1lKTsKICAgICAgICBpZiAoIWNoaWxkLmVtcHR5KCkpIHsKICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgIH0KICAgICAgICBsZXQgbmV3RWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCB0YWdOYW1lKTsKICAgICAgICBpZiAoY2xhc3NOYW1lIGluc3RhbmNlb2YgQXJyYXkpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGFzc05hbWUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIG5ld0VsZW1lbnQuY2xhc3NMaXN0LmFkZChjbGFzc05hbWVbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZXdFbGVtZW50LmNsYXNzTGlzdC5hZGQoY2xhc3NOYW1lKTsKICAgICAgICB9CiAgICAgICAgaWYgKGJlZm9yZSkgewogICAgICAgICAgICAvLyBpZiBiZWZvcmUgZXhpc3RzLCBpbnNlcnQKICAgICAgICAgICAgY29udGFpbmVyLm5vZGUoKS5pbnNlcnRCZWZvcmUobmV3RWxlbWVudCwgYmVmb3JlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgYXBwZW5kCiAgICAgICAgICAgIGNvbnRhaW5lci5ub2RlKCkuYXBwZW5kQ2hpbGQobmV3RWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoc2VsZWN0KG5ld0VsZW1lbnQpCiAgICAgICAgICAgIC8vIG5lZWQgdG8gYmluZCBkYXRhIHRvIGVtdWxhdGUgZDNfc2VsZWN0aW9uLmFwcGVuZAogICAgICAgICAgICAuZGF0dW0oY29udGFpbmVyLmRhdHVtKCkpKTsKICAgIH0KICAgIC8qKgogICAgICogRXhlY3V0aW9uIHN0YXRzIGZvciB0aGUgbm9kZS4KICAgICAqLwogICAgY2xhc3MgTm9kZVN0YXRzIHsKICAgICAgICBjb25zdHJ1Y3RvcihvdXRwdXRTaXplKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgdXNlZCBmb3IgdGhlIG5vZGUuIFN1bSBvZiBhbGwgY2hpbGRyZW4KICAgICAgICAgICAgICogaWYgaXQgaXMgYSBHcm91cCBub2RlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy50b3RhbEJ5dGVzID0gMDsKICAgICAgICAgICAgdGhpcy5vdXRwdXRTaXplID0gb3V0cHV0U2l6ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIHRoZSBzdGFydCBhbmQgZW5kIHRpbWUgZm9yIGEgcGFydGljdWxhciBrZXJuZWwgZXhlY3V0aW9uIG9mIHRoaXMgb3AuCiAgICAgICAgICogT3BzIGNhbiBoYXZlIG11bHRpcGxlIGtlcm5lbCBleGVjdXRpb25zIHdpdGhpbiB0aGUgc2FtZSBzZXNzaW9uIHJ1bi4KICAgICAgICAgKi8KICAgICAgICBhZGRFeGVjdXRpb25UaW1lKHN0YXJ0VGltZSwgZW5kVGltZSkgewogICAgICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5zdGFydFRpbWUgPSBNYXRoLm1pbih0aGlzLnN0YXJ0VGltZSwgc3RhcnRUaW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lID0gc3RhcnRUaW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmVuZFRpbWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5lbmRUaW1lID0gTWF0aC5tYXgodGhpcy5lbmRUaW1lLCBlbmRUaW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZW5kVGltZSA9IGVuZFRpbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIHRoZSBieXRlcyBhbGxvY2F0ZWQgZm9yIGEgcGFydGljdWxhciBrZXJuZWwgZXhlY3V0aW9uIG9mIHRoaXMgb3AuCiAgICAgICAgICogT3BzIGNhbiBoYXZlIG11bHRpcGxlIGtlcm5lbCBleGVjdXRpb25zIHdpdGhpbiB0aGUgc2FtZSBzZXNzaW9uIHJ1bi4KICAgICAgICAgKi8KICAgICAgICBhZGRCeXRlc0FsbG9jYXRpb24odG90YWxCeXRlcykgewogICAgICAgICAgICBpZiAodGhpcy50b3RhbEJ5dGVzICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMudG90YWxCeXRlcyA9IE1hdGgubWF4KHRoaXMudG90YWxCeXRlcywgdG90YWxCeXRlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsQnl0ZXMgPSB0b3RhbEJ5dGVzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbWJpbmVzIHRoZSBzcGVjaWZpZWQgc3RhdHMgd2l0aCB0aGUgY3VycmVudCBzdGF0cy4KICAgICAgICAgKiBNb2RpZmllcyB0aGUgY3VycmVudCBvYmplY3QuIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8KICAgICAgICAgKiBjb21wdXRlIGFnZ3JlZ2F0ZSBzdGF0cyBmb3IgZ3JvdXAgbm9kZXMuCiAgICAgICAgICovCiAgICAgICAgY29tYmluZShzdGF0cykgewogICAgICAgICAgICBpZiAoc3RhdHMudG90YWxCeXRlcyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRvdGFsQnl0ZXMgKz0gc3RhdHMudG90YWxCeXRlczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZEV4ZWN1dGlvblRpbWUoc3RhdHMuc3RhcnRUaW1lLCBzdGF0cy5lbmRUaW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUb3RhbCBudW1iZXIgb2YgY29tcHV0ZSB0aW1lIGluIG1pY3Jvc2Vjb25kcyB1c2VkIGZvciB0aGUgbm9kZS4KICAgICAgICAgKiBTdW0gb2YgYWxsIGNoaWxkcmVuIGlmIGl0IGlzIGEgR3JvdXAgbm9kZS4gTnVsbCBpZiBpdCBpcyB1bmtub3duLgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNhbiBub3QgYmUgc2NhZmZvbGRlZCB1bmRlciBhIGdldHRlciBhdHRyaWJ1dGUgYmVjYXVzZQogICAgICAgICAqIEVDTUFTY3JpcHQgNSBkb2VzIG5vdCBzdXBwb3J0IGdldHRlciBhdHRyaWJ1dGVzLgogICAgICAgICAqLwogICAgICAgIGdldFRvdGFsTWljcm9zKCkgewogICAgICAgICAgICBpZiAodGhpcy5zdGFydFRpbWUgPT0gbnVsbCB8fCB0aGlzLmVuZFRpbWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZW5kVGltZSAtIHRoaXMuc3RhcnRUaW1lOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBUaGUgbWluaW11bSBzdHJva2Ugd2lkdGggb2YgYW4gZWRnZS4gKi8KICAgIGNvbnN0IE1JTl9FREdFX1dJRFRIID0gMC43NTsKICAgIC8qKiBUaGUgbWF4aW11bSBzdHJva2Ugd2lkdGggb2YgYW4gZWRnZS4gKi8KICAgIGNvbnN0IE1BWF9FREdFX1dJRFRIID0gMTI7CiAgICAvKiogVGhlIGV4cG9uZW50IHVzZWQgaW4gdGhlIHBvd2VyIHNjYWxlIGZvciBlZGdlIHRoaWNrbmVzcy4gKi8KICAgIGNvbnN0IEVER0VfV0lEVEhfU0NBTEVfRVhQT05FTlQgPSAwLjM7CiAgICAvKiogVGhlIGRvbWFpbiAobWluIGFuZCBtYXggdmFsdWUpIGZvciB0aGUgZWRnZSB3aWR0aC4gKi8KICAgIGNvbnN0IERPTUFJTl9FREdFX1dJRFRIX1NDQUxFID0gWzEsIDUwMDAwMDBdOwogICAgY29uc3QgRURHRV9XSURUSF9TSVpFX0JBU0VEX1NDQUxFID0gcG93JDEoKQogICAgICAgIC5leHBvbmVudChFREdFX1dJRFRIX1NDQUxFX0VYUE9ORU5UKQogICAgICAgIC5kb21haW4oRE9NQUlOX0VER0VfV0lEVEhfU0NBTEUpCiAgICAgICAgLnJhbmdlKFtNSU5fRURHRV9XSURUSCwgTUFYX0VER0VfV0lEVEhdKQogICAgICAgIC5jbGFtcCh0cnVlKTsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGxpc3QgY2FjaGUuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGNsZWFyCiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxpc3RDYWNoZUNsZWFyKCkgewogICAgICB0aGlzLl9fZGF0YV9fID0gW107CiAgICAgIHRoaXMuc2l6ZSA9IDA7CiAgICB9CgogICAgdmFyIF9saXN0Q2FjaGVDbGVhciA9IGxpc3RDYWNoZUNsZWFyOwoKICAgIC8qKgogICAgICogUGVyZm9ybXMgYQogICAgICogW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybykKICAgICAqIGNvbXBhcmlzb24gYmV0d2VlbiB0d28gdmFsdWVzIHRvIGRldGVybWluZSBpZiB0aGV5IGFyZSBlcXVpdmFsZW50LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgNC4wLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHsqfSBvdGhlciBUaGUgb3RoZXIgdmFsdWUgdG8gY29tcGFyZS4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSB9OwogICAgICogdmFyIG90aGVyID0geyAnYSc6IDEgfTsKICAgICAqCiAgICAgKiBfLmVxKG9iamVjdCwgb2JqZWN0KTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmVxKG9iamVjdCwgb3RoZXIpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmVxKCdhJywgJ2EnKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmVxKCdhJywgT2JqZWN0KCdhJykpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmVxKE5hTiwgTmFOKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gZXEodmFsdWUsIG90aGVyKSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gb3RoZXIgfHwgKHZhbHVlICE9PSB2YWx1ZSAmJiBvdGhlciAhPT0gb3RoZXIpOwogICAgfQoKICAgIHZhciBlcV8xID0gZXE7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBpbmRleCBhdCB3aGljaCB0aGUgYGtleWAgaXMgZm91bmQgaW4gYGFycmF5YCBvZiBrZXktdmFsdWUgcGFpcnMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICogQHBhcmFtIHsqfSBrZXkgVGhlIGtleSB0byBzZWFyY2ggZm9yLgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KICAgICAqLwogICAgZnVuY3Rpb24gYXNzb2NJbmRleE9mKGFycmF5LCBrZXkpIHsKICAgICAgdmFyIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDsKICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgaWYgKGVxXzEoYXJyYXlbbGVuZ3RoXVswXSwga2V5KSkgewogICAgICAgICAgcmV0dXJuIGxlbmd0aDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHZhciBfYXNzb2NJbmRleE9mID0gYXNzb2NJbmRleE9mOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBhcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlOwoKICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqLwogICAgdmFyIHNwbGljZSA9IGFycmF5UHJvdG8uc3BsaWNlOwoKICAgIC8qKgogICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGxpc3QgY2FjaGUuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGRlbGV0ZQogICAgICogQG1lbWJlck9mIExpc3RDYWNoZQogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxpc3RDYWNoZURlbGV0ZShrZXkpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fLAogICAgICAgICAgaW5kZXggPSBfYXNzb2NJbmRleE9mKGRhdGEsIGtleSk7CgogICAgICBpZiAoaW5kZXggPCAwKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBsYXN0SW5kZXggPSBkYXRhLmxlbmd0aCAtIDE7CiAgICAgIGlmIChpbmRleCA9PSBsYXN0SW5kZXgpIHsKICAgICAgICBkYXRhLnBvcCgpOwogICAgICB9IGVsc2UgewogICAgICAgIHNwbGljZS5jYWxsKGRhdGEsIGluZGV4LCAxKTsKICAgICAgfQogICAgICAtLXRoaXMuc2l6ZTsKICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgdmFyIF9saXN0Q2FjaGVEZWxldGUgPSBsaXN0Q2FjaGVEZWxldGU7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBsaXN0IGNhY2hlIHZhbHVlIGZvciBga2V5YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgZ2V0CiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIGdldC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBlbnRyeSB2YWx1ZS4KICAgICAqLwogICAgZnVuY3Rpb24gbGlzdENhY2hlR2V0KGtleSkgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sCiAgICAgICAgICBpbmRleCA9IF9hc3NvY0luZGV4T2YoZGF0YSwga2V5KTsKCiAgICAgIHJldHVybiBpbmRleCA8IDAgPyB1bmRlZmluZWQgOiBkYXRhW2luZGV4XVsxXTsKICAgIH0KCiAgICB2YXIgX2xpc3RDYWNoZUdldCA9IGxpc3RDYWNoZUdldDsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBhIGxpc3QgY2FjaGUgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgaGFzCiAgICAgKiBAbWVtYmVyT2YgTGlzdENhY2hlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gbGlzdENhY2hlSGFzKGtleSkgewogICAgICByZXR1cm4gX2Fzc29jSW5kZXhPZih0aGlzLl9fZGF0YV9fLCBrZXkpID4gLTE7CiAgICB9CgogICAgdmFyIF9saXN0Q2FjaGVIYXMgPSBsaXN0Q2FjaGVIYXM7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBsaXN0IGNhY2hlIGBrZXlgIHRvIGB2YWx1ZWAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIHNldAogICAgICogQG1lbWJlck9mIExpc3RDYWNoZQogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBsaXN0IGNhY2hlIGluc3RhbmNlLgogICAgICovCiAgICBmdW5jdGlvbiBsaXN0Q2FjaGVTZXQoa2V5LCB2YWx1ZSkgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sCiAgICAgICAgICBpbmRleCA9IF9hc3NvY0luZGV4T2YoZGF0YSwga2V5KTsKCiAgICAgIGlmIChpbmRleCA8IDApIHsKICAgICAgICArK3RoaXMuc2l6ZTsKICAgICAgICBkYXRhLnB1c2goW2tleSwgdmFsdWVdKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBkYXRhW2luZGV4XVsxXSA9IHZhbHVlOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHZhciBfbGlzdENhY2hlU2V0ID0gbGlzdENhY2hlU2V0OwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBsaXN0IGNhY2hlIG9iamVjdC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbZW50cmllc10gVGhlIGtleS12YWx1ZSBwYWlycyB0byBjYWNoZS4KICAgICAqLwogICAgZnVuY3Rpb24gTGlzdENhY2hlKGVudHJpZXMpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBlbnRyaWVzID09IG51bGwgPyAwIDogZW50cmllcy5sZW5ndGg7CgogICAgICB0aGlzLmNsZWFyKCk7CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGVudHJ5ID0gZW50cmllc1tpbmRleF07CiAgICAgICAgdGhpcy5zZXQoZW50cnlbMF0sIGVudHJ5WzFdKTsKICAgICAgfQogICAgfQoKICAgIC8vIEFkZCBtZXRob2RzIHRvIGBMaXN0Q2FjaGVgLgogICAgTGlzdENhY2hlLnByb3RvdHlwZS5jbGVhciA9IF9saXN0Q2FjaGVDbGVhcjsKICAgIExpc3RDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gX2xpc3RDYWNoZURlbGV0ZTsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuZ2V0ID0gX2xpc3RDYWNoZUdldDsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuaGFzID0gX2xpc3RDYWNoZUhhczsKICAgIExpc3RDYWNoZS5wcm90b3R5cGUuc2V0ID0gX2xpc3RDYWNoZVNldDsKCiAgICB2YXIgX0xpc3RDYWNoZSA9IExpc3RDYWNoZTsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIHN0YWNrLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBjbGVhcgogICAgICogQG1lbWJlck9mIFN0YWNrCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0YWNrQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBuZXcgX0xpc3RDYWNoZTsKICAgICAgdGhpcy5zaXplID0gMDsKICAgIH0KCiAgICB2YXIgX3N0YWNrQ2xlYXIgPSBzdGFja0NsZWFyOwoKICAgIC8qKgogICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIHN0YWNrLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBkZWxldGUKICAgICAqIEBtZW1iZXJPZiBTdGFjawogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byByZW1vdmUuCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGVudHJ5IHdhcyByZW1vdmVkLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0YWNrRGVsZXRlKGtleSkgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX18sCiAgICAgICAgICByZXN1bHQgPSBkYXRhWydkZWxldGUnXShrZXkpOwoKICAgICAgdGhpcy5zaXplID0gZGF0YS5zaXplOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfc3RhY2tEZWxldGUgPSBzdGFja0RlbGV0ZTsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIHN0YWNrIHZhbHVlIGZvciBga2V5YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgZ2V0CiAgICAgKiBAbWVtYmVyT2YgU3RhY2sKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiBzdGFja0dldChrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uZ2V0KGtleSk7CiAgICB9CgogICAgdmFyIF9zdGFja0dldCA9IHN0YWNrR2V0OwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGEgc3RhY2sgdmFsdWUgZm9yIGBrZXlgIGV4aXN0cy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgaGFzCiAgICAgKiBAbWVtYmVyT2YgU3RhY2sKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBzdGFja0hhcyhrZXkpIHsKICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKGtleSk7CiAgICB9CgogICAgdmFyIF9zdGFja0hhcyA9IHN0YWNrSGFzOwoKICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZ2xvYmFsYCBmcm9tIE5vZGUuanMuICovCiAgICB2YXIgZnJlZUdsb2JhbCA9IHR5cGVvZiBjb21tb25qc0dsb2JhbCA9PSAnb2JqZWN0JyAmJiBjb21tb25qc0dsb2JhbCAmJiBjb21tb25qc0dsb2JhbC5PYmplY3QgPT09IE9iamVjdCAmJiBjb21tb25qc0dsb2JhbDsKCiAgICB2YXIgX2ZyZWVHbG9iYWwgPSBmcmVlR2xvYmFsOwoKICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgc2VsZmAuICovCiAgICB2YXIgZnJlZVNlbGYgPSB0eXBlb2Ygc2VsZiA9PSAnb2JqZWN0JyAmJiBzZWxmICYmIHNlbGYuT2JqZWN0ID09PSBPYmplY3QgJiYgc2VsZjsKCiAgICAvKiogVXNlZCBhcyBhIHJlZmVyZW5jZSB0byB0aGUgZ2xvYmFsIG9iamVjdC4gKi8KICAgIHZhciByb290JDkgPSBfZnJlZUdsb2JhbCB8fCBmcmVlU2VsZiB8fCBGdW5jdGlvbigncmV0dXJuIHRoaXMnKSgpOwoKICAgIHZhciBfcm9vdCA9IHJvb3QkOTsKCiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBTeW1ib2wkMSA9IF9yb290LlN5bWJvbDsKCiAgICB2YXIgX1N5bWJvbCA9IFN5bWJvbCQxOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7CgogICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCiAgICB2YXIgaGFzT3duUHJvcGVydHkgPSBvYmplY3RQcm90by5oYXNPd25Qcm9wZXJ0eTsKCiAgICAvKioKICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUKICAgICAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQogICAgICogb2YgdmFsdWVzLgogICAgICovCiAgICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmcgPSBvYmplY3RQcm90by50b1N0cmluZzsKCiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBzeW1Ub1N0cmluZ1RhZyA9IF9TeW1ib2wgPyBfU3ltYm9sLnRvU3RyaW5nVGFnIDogdW5kZWZpbmVkOwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlR2V0VGFnYCB3aGljaCBpZ25vcmVzIGBTeW1ib2wudG9TdHJpbmdUYWdgIHZhbHVlcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSByYXcgYHRvU3RyaW5nVGFnYC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UmF3VGFnKHZhbHVlKSB7CiAgICAgIHZhciBpc093biA9IGhhc093blByb3BlcnR5LmNhbGwodmFsdWUsIHN5bVRvU3RyaW5nVGFnKSwKICAgICAgICAgIHRhZyA9IHZhbHVlW3N5bVRvU3RyaW5nVGFnXTsKCiAgICAgIHRyeSB7CiAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdW5kZWZpbmVkOwogICAgICAgIHZhciB1bm1hc2tlZCA9IHRydWU7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CgogICAgICB2YXIgcmVzdWx0ID0gbmF0aXZlT2JqZWN0VG9TdHJpbmcuY2FsbCh2YWx1ZSk7CiAgICAgIGlmICh1bm1hc2tlZCkgewogICAgICAgIGlmIChpc093bikgewogICAgICAgICAgdmFsdWVbc3ltVG9TdHJpbmdUYWddID0gdGFnOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkZWxldGUgdmFsdWVbc3ltVG9TdHJpbmdUYWddOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfZ2V0UmF3VGFnID0gZ2V0UmF3VGFnOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RQcm90byQxID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKioKICAgICAqIFVzZWQgdG8gcmVzb2x2ZSB0aGUKICAgICAqIFtgdG9TdHJpbmdUYWdgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3QucHJvdG90eXBlLnRvc3RyaW5nKQogICAgICogb2YgdmFsdWVzLgogICAgICovCiAgICB2YXIgbmF0aXZlT2JqZWN0VG9TdHJpbmckMSA9IG9iamVjdFByb3RvJDEudG9TdHJpbmc7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIHVzaW5nIGBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBzdHJpbmcuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKHZhbHVlKSB7CiAgICAgIHJldHVybiBuYXRpdmVPYmplY3RUb1N0cmluZyQxLmNhbGwodmFsdWUpOwogICAgfQoKICAgIHZhciBfb2JqZWN0VG9TdHJpbmcgPSBvYmplY3RUb1N0cmluZzsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgbnVsbFRhZyA9ICdbb2JqZWN0IE51bGxdJywKICAgICAgICB1bmRlZmluZWRUYWcgPSAnW29iamVjdCBVbmRlZmluZWRdJzsKCiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBzeW1Ub1N0cmluZ1RhZyQxID0gX1N5bWJvbCA/IF9TeW1ib2wudG9TdHJpbmdUYWcgOiB1bmRlZmluZWQ7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgZ2V0VGFnYCB3aXRob3V0IGZhbGxiYWNrcyBmb3IgYnVnZ3kgZW52aXJvbm1lbnRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBxdWVyeS4KICAgICAqIEByZXR1cm5zIHtzdHJpbmd9IFJldHVybnMgdGhlIGB0b1N0cmluZ1RhZ2AuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VHZXRUYWcodmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKICAgICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZFRhZyA6IG51bGxUYWc7CiAgICAgIH0KICAgICAgcmV0dXJuIChzeW1Ub1N0cmluZ1RhZyQxICYmIHN5bVRvU3RyaW5nVGFnJDEgaW4gT2JqZWN0KHZhbHVlKSkKICAgICAgICA/IF9nZXRSYXdUYWcodmFsdWUpCiAgICAgICAgOiBfb2JqZWN0VG9TdHJpbmcodmFsdWUpOwogICAgfQoKICAgIHZhciBfYmFzZUdldFRhZyA9IGJhc2VHZXRUYWc7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyB0aGUKICAgICAqIFtsYW5ndWFnZSB0eXBlXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtZWNtYXNjcmlwdC1sYW5ndWFnZS10eXBlcykKICAgICAqIG9mIGBPYmplY3RgLiAoZS5nLiBhcnJheXMsIGZ1bmN0aW9ucywgb2JqZWN0cywgcmVnZXhlcywgYG5ldyBOdW1iZXIoMClgLCBhbmQgYG5ldyBTdHJpbmcoJycpYCkKICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBvYmplY3QsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc09iamVjdCh7fSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc09iamVjdChbMSwgMiwgM10pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNPYmplY3QoXy5ub29wKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzT2JqZWN0KG51bGwpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gaXNPYmplY3QodmFsdWUpIHsKICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmICh0eXBlID09ICdvYmplY3QnIHx8IHR5cGUgPT0gJ2Z1bmN0aW9uJyk7CiAgICB9CgogICAgdmFyIGlzT2JqZWN0XzEgPSBpc09iamVjdDsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgYXN5bmNUYWcgPSAnW29iamVjdCBBc3luY0Z1bmN0aW9uXScsCiAgICAgICAgZnVuY1RhZyA9ICdbb2JqZWN0IEZ1bmN0aW9uXScsCiAgICAgICAgZ2VuVGFnID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJywKICAgICAgICBwcm94eVRhZyA9ICdbb2JqZWN0IFByb3h5XSc7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYEZ1bmN0aW9uYCBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBmdW5jdGlvbiwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmlzRnVuY3Rpb24oXyk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc0Z1bmN0aW9uKC9hYmMvKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRnVuY3Rpb24odmFsdWUpIHsKICAgICAgaWYgKCFpc09iamVjdF8xKHZhbHVlKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICAvLyBUaGUgdXNlIG9mIGBPYmplY3QjdG9TdHJpbmdgIGF2b2lkcyBpc3N1ZXMgd2l0aCB0aGUgYHR5cGVvZmAgb3BlcmF0b3IKICAgICAgLy8gaW4gU2FmYXJpIDkgd2hpY2ggcmV0dXJucyAnb2JqZWN0JyBmb3IgdHlwZWQgYXJyYXlzIGFuZCBvdGhlciBjb25zdHJ1Y3RvcnMuCiAgICAgIHZhciB0YWcgPSBfYmFzZUdldFRhZyh2YWx1ZSk7CiAgICAgIHJldHVybiB0YWcgPT0gZnVuY1RhZyB8fCB0YWcgPT0gZ2VuVGFnIHx8IHRhZyA9PSBhc3luY1RhZyB8fCB0YWcgPT0gcHJveHlUYWc7CiAgICB9CgogICAgdmFyIGlzRnVuY3Rpb25fMSA9IGlzRnVuY3Rpb247CgogICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG92ZXJyZWFjaGluZyBjb3JlLWpzIHNoaW1zLiAqLwogICAgdmFyIGNvcmVKc0RhdGEgPSBfcm9vdFsnX19jb3JlLWpzX3NoYXJlZF9fJ107CgogICAgdmFyIF9jb3JlSnNEYXRhID0gY29yZUpzRGF0YTsKCiAgICAvKiogVXNlZCB0byBkZXRlY3QgbWV0aG9kcyBtYXNxdWVyYWRpbmcgYXMgbmF0aXZlLiAqLwogICAgdmFyIG1hc2tTcmNLZXkgPSAoZnVuY3Rpb24oKSB7CiAgICAgIHZhciB1aWQgPSAvW14uXSskLy5leGVjKF9jb3JlSnNEYXRhICYmIF9jb3JlSnNEYXRhLmtleXMgJiYgX2NvcmVKc0RhdGEua2V5cy5JRV9QUk9UTyB8fCAnJyk7CiAgICAgIHJldHVybiB1aWQgPyAoJ1N5bWJvbChzcmMpXzEuJyArIHVpZCkgOiAnJzsKICAgIH0oKSk7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYGZ1bmNgIGhhcyBpdHMgc291cmNlIG1hc2tlZC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGZ1bmNgIGlzIG1hc2tlZCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBpc01hc2tlZChmdW5jKSB7CiAgICAgIHJldHVybiAhIW1hc2tTcmNLZXkgJiYgKG1hc2tTcmNLZXkgaW4gZnVuYyk7CiAgICB9CgogICAgdmFyIF9pc01hc2tlZCA9IGlzTWFza2VkOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBmdW5jUHJvdG8gPSBGdW5jdGlvbi5wcm90b3R5cGU7CgogICAgLyoqIFVzZWQgdG8gcmVzb2x2ZSB0aGUgZGVjb21waWxlZCBzb3VyY2Ugb2YgZnVuY3Rpb25zLiAqLwogICAgdmFyIGZ1bmNUb1N0cmluZyA9IGZ1bmNQcm90by50b1N0cmluZzsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGBmdW5jYCB0byBpdHMgc291cmNlIGNvZGUuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNvbnZlcnQuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBzb3VyY2UgY29kZS4KICAgICAqLwogICAgZnVuY3Rpb24gdG9Tb3VyY2UoZnVuYykgewogICAgICBpZiAoZnVuYyAhPSBudWxsKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIHJldHVybiBmdW5jVG9TdHJpbmcuY2FsbChmdW5jKTsKICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgIHRyeSB7CiAgICAgICAgICByZXR1cm4gKGZ1bmMgKyAnJyk7CiAgICAgICAgfSBjYXRjaCAoZSkge30KICAgICAgfQogICAgICByZXR1cm4gJyc7CiAgICB9CgogICAgdmFyIF90b1NvdXJjZSA9IHRvU291cmNlOwoKICAgIC8qKgogICAgICogVXNlZCB0byBtYXRjaCBgUmVnRXhwYAogICAgICogW3N5bnRheCBjaGFyYWN0ZXJzXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1wYXR0ZXJucykuCiAgICAgKi8KICAgIHZhciByZVJlZ0V4cENoYXIgPSAvW1xcXiQuKis/KClbXF17fXxdL2c7CgogICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvc3QgY29uc3RydWN0b3JzIChTYWZhcmkpLiAqLwogICAgdmFyIHJlSXNIb3N0Q3RvciA9IC9eXFtvYmplY3QgLis/Q29uc3RydWN0b3JcXSQvOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBmdW5jUHJvdG8kMSA9IEZ1bmN0aW9uLnByb3RvdHlwZSwKICAgICAgICBvYmplY3RQcm90byQyID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovCiAgICB2YXIgZnVuY1RvU3RyaW5nJDEgPSBmdW5jUHJvdG8kMS50b1N0cmluZzsKCiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSQxID0gb2JqZWN0UHJvdG8kMi5oYXNPd25Qcm9wZXJ0eTsKCiAgICAvKiogVXNlZCB0byBkZXRlY3QgaWYgYSBtZXRob2QgaXMgbmF0aXZlLiAqLwogICAgdmFyIHJlSXNOYXRpdmUgPSBSZWdFeHAoJ14nICsKICAgICAgZnVuY1RvU3RyaW5nJDEuY2FsbChoYXNPd25Qcm9wZXJ0eSQxKS5yZXBsYWNlKHJlUmVnRXhwQ2hhciwgJ1xcJCYnKQogICAgICAucmVwbGFjZSgvaGFzT3duUHJvcGVydHl8KGZ1bmN0aW9uKS4qPyg/PVxcXCgpfCBmb3IgLis/KD89XFxcXSkvZywgJyQxLio/JykgKyAnJCcKICAgICk7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hdGl2ZWAgd2l0aG91dCBiYWQgc2hpbSBjaGVja3MuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBuYXRpdmUgZnVuY3Rpb24sCiAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlSXNOYXRpdmUodmFsdWUpIHsKICAgICAgaWYgKCFpc09iamVjdF8xKHZhbHVlKSB8fCBfaXNNYXNrZWQodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBwYXR0ZXJuID0gaXNGdW5jdGlvbl8xKHZhbHVlKSA/IHJlSXNOYXRpdmUgOiByZUlzSG9zdEN0b3I7CiAgICAgIHJldHVybiBwYXR0ZXJuLnRlc3QoX3RvU291cmNlKHZhbHVlKSk7CiAgICB9CgogICAgdmFyIF9iYXNlSXNOYXRpdmUgPSBiYXNlSXNOYXRpdmU7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCBvZiBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBwcm9wZXJ0eSB2YWx1ZS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VmFsdWUob2JqZWN0LCBrZXkpIHsKICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07CiAgICB9CgogICAgdmFyIF9nZXRWYWx1ZSA9IGdldFZhbHVlOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbmF0aXZlIGZ1bmN0aW9uIGF0IGBrZXlgIG9mIGBvYmplY3RgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIG1ldGhvZCB0byBnZXQuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZnVuY3Rpb24gaWYgaXQncyBuYXRpdmUsIGVsc2UgYHVuZGVmaW5lZGAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE5hdGl2ZShvYmplY3QsIGtleSkgewogICAgICB2YXIgdmFsdWUgPSBfZ2V0VmFsdWUob2JqZWN0LCBrZXkpOwogICAgICByZXR1cm4gX2Jhc2VJc05hdGl2ZSh2YWx1ZSkgPyB2YWx1ZSA6IHVuZGVmaW5lZDsKICAgIH0KCiAgICB2YXIgX2dldE5hdGl2ZSA9IGdldE5hdGl2ZTsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovCiAgICB2YXIgTWFwJDUgPSBfZ2V0TmF0aXZlKF9yb290LCAnTWFwJyk7CgogICAgdmFyIF9NYXAgPSBNYXAkNTsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovCiAgICB2YXIgbmF0aXZlQ3JlYXRlID0gX2dldE5hdGl2ZShPYmplY3QsICdjcmVhdGUnKTsKCiAgICB2YXIgX25hdGl2ZUNyZWF0ZSA9IG5hdGl2ZUNyZWF0ZTsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIGhhc2guCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGNsZWFyCiAgICAgKiBAbWVtYmVyT2YgSGFzaAogICAgICovCiAgICBmdW5jdGlvbiBoYXNoQ2xlYXIoKSB7CiAgICAgIHRoaXMuX19kYXRhX18gPSBfbmF0aXZlQ3JlYXRlID8gX25hdGl2ZUNyZWF0ZShudWxsKSA6IHt9OwogICAgICB0aGlzLnNpemUgPSAwOwogICAgfQoKICAgIHZhciBfaGFzaENsZWFyID0gaGFzaENsZWFyOwoKICAgIC8qKgogICAgICogUmVtb3ZlcyBga2V5YCBhbmQgaXRzIHZhbHVlIGZyb20gdGhlIGhhc2guCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGRlbGV0ZQogICAgICogQG1lbWJlck9mIEhhc2gKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBoYXNoIFRoZSBoYXNoIHRvIG1vZGlmeS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gcmVtb3ZlLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBlbnRyeSB3YXMgcmVtb3ZlZCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBoYXNoRGVsZXRlKGtleSkgewogICAgICB2YXIgcmVzdWx0ID0gdGhpcy5oYXMoa2V5KSAmJiBkZWxldGUgdGhpcy5fX2RhdGFfX1trZXldOwogICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9oYXNoRGVsZXRlID0gaGFzaERlbGV0ZTsKCiAgICAvKiogVXNlZCB0byBzdGFuZC1pbiBmb3IgYHVuZGVmaW5lZGAgaGFzaCB2YWx1ZXMuICovCiAgICB2YXIgSEFTSF9VTkRFRklORUQgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJDMgPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JDIgPSBvYmplY3RQcm90byQzLmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgaGFzaCB2YWx1ZSBmb3IgYGtleWAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGdldAogICAgICogQG1lbWJlck9mIEhhc2gKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiBoYXNoR2V0KGtleSkgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgIGlmIChfbmF0aXZlQ3JlYXRlKSB7CiAgICAgICAgdmFyIHJlc3VsdCA9IGRhdGFba2V5XTsKICAgICAgICByZXR1cm4gcmVzdWx0ID09PSBIQVNIX1VOREVGSU5FRCA/IHVuZGVmaW5lZCA6IHJlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gaGFzT3duUHJvcGVydHkkMi5jYWxsKGRhdGEsIGtleSkgPyBkYXRhW2tleV0gOiB1bmRlZmluZWQ7CiAgICB9CgogICAgdmFyIF9oYXNoR2V0ID0gaGFzaEdldDsKCiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovCiAgICB2YXIgb2JqZWN0UHJvdG8kNCA9IE9iamVjdC5wcm90b3R5cGU7CgogICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCiAgICB2YXIgaGFzT3duUHJvcGVydHkkMyA9IG9iamVjdFByb3RvJDQuaGFzT3duUHJvcGVydHk7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYSBoYXNoIHZhbHVlIGZvciBga2V5YCBleGlzdHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGhhcwogICAgICogQG1lbWJlck9mIEhhc2gKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgZW50cnkgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYW4gZW50cnkgZm9yIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBoYXNoSGFzKGtleSkgewogICAgICB2YXIgZGF0YSA9IHRoaXMuX19kYXRhX187CiAgICAgIHJldHVybiBfbmF0aXZlQ3JlYXRlID8gKGRhdGFba2V5XSAhPT0gdW5kZWZpbmVkKSA6IGhhc093blByb3BlcnR5JDMuY2FsbChkYXRhLCBrZXkpOwogICAgfQoKICAgIHZhciBfaGFzaEhhcyA9IGhhc2hIYXM7CgogICAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqLwogICAgdmFyIEhBU0hfVU5ERUZJTkVEJDEgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7CgogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBoYXNoIGBrZXlgIHRvIGB2YWx1ZWAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIHNldAogICAgICogQG1lbWJlck9mIEhhc2gKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaGFzaCBpbnN0YW5jZS4KICAgICAqLwogICAgZnVuY3Rpb24gaGFzaFNldChrZXksIHZhbHVlKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXzsKICAgICAgdGhpcy5zaXplICs9IHRoaXMuaGFzKGtleSkgPyAwIDogMTsKICAgICAgZGF0YVtrZXldID0gKF9uYXRpdmVDcmVhdGUgJiYgdmFsdWUgPT09IHVuZGVmaW5lZCkgPyBIQVNIX1VOREVGSU5FRCQxIDogdmFsdWU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHZhciBfaGFzaFNldCA9IGhhc2hTZXQ7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgaGFzaCBvYmplY3QuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBjb25zdHJ1Y3RvcgogICAgICogQHBhcmFtIHtBcnJheX0gW2VudHJpZXNdIFRoZSBrZXktdmFsdWUgcGFpcnMgdG8gY2FjaGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIEhhc2goZW50cmllcykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGVudHJpZXMgPT0gbnVsbCA/IDAgOiBlbnRyaWVzLmxlbmd0aDsKCiAgICAgIHRoaXMuY2xlYXIoKTsKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIgZW50cnkgPSBlbnRyaWVzW2luZGV4XTsKICAgICAgICB0aGlzLnNldChlbnRyeVswXSwgZW50cnlbMV0pOwogICAgICB9CiAgICB9CgogICAgLy8gQWRkIG1ldGhvZHMgdG8gYEhhc2hgLgogICAgSGFzaC5wcm90b3R5cGUuY2xlYXIgPSBfaGFzaENsZWFyOwogICAgSGFzaC5wcm90b3R5cGVbJ2RlbGV0ZSddID0gX2hhc2hEZWxldGU7CiAgICBIYXNoLnByb3RvdHlwZS5nZXQgPSBfaGFzaEdldDsKICAgIEhhc2gucHJvdG90eXBlLmhhcyA9IF9oYXNoSGFzOwogICAgSGFzaC5wcm90b3R5cGUuc2V0ID0gX2hhc2hTZXQ7CgogICAgdmFyIF9IYXNoID0gSGFzaDsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYWxsIGtleS12YWx1ZSBlbnRyaWVzIGZyb20gdGhlIG1hcC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgY2xlYXIKICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZQogICAgICovCiAgICBmdW5jdGlvbiBtYXBDYWNoZUNsZWFyKCkgewogICAgICB0aGlzLnNpemUgPSAwOwogICAgICB0aGlzLl9fZGF0YV9fID0gewogICAgICAgICdoYXNoJzogbmV3IF9IYXNoLAogICAgICAgICdtYXAnOiBuZXcgKF9NYXAgfHwgX0xpc3RDYWNoZSksCiAgICAgICAgJ3N0cmluZyc6IG5ldyBfSGFzaAogICAgICB9OwogICAgfQoKICAgIHZhciBfbWFwQ2FjaGVDbGVhciA9IG1hcENhY2hlQ2xlYXI7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaXF1ZSBvYmplY3Qga2V5LgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIHN1aXRhYmxlLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzS2V5YWJsZSh2YWx1ZSkgewogICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWx1ZTsKICAgICAgcmV0dXJuICh0eXBlID09ICdzdHJpbmcnIHx8IHR5cGUgPT0gJ251bWJlcicgfHwgdHlwZSA9PSAnc3ltYm9sJyB8fCB0eXBlID09ICdib29sZWFuJykKICAgICAgICA/ICh2YWx1ZSAhPT0gJ19fcHJvdG9fXycpCiAgICAgICAgOiAodmFsdWUgPT09IG51bGwpOwogICAgfQoKICAgIHZhciBfaXNLZXlhYmxlID0gaXNLZXlhYmxlOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgZGF0YSBmb3IgYG1hcGAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBtYXAgVGhlIG1hcCB0byBxdWVyeS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIHJlZmVyZW5jZSBrZXkuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWFwIGRhdGEuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE1hcERhdGEobWFwLCBrZXkpIHsKICAgICAgdmFyIGRhdGEgPSBtYXAuX19kYXRhX187CiAgICAgIHJldHVybiBfaXNLZXlhYmxlKGtleSkKICAgICAgICA/IGRhdGFbdHlwZW9mIGtleSA9PSAnc3RyaW5nJyA/ICdzdHJpbmcnIDogJ2hhc2gnXQogICAgICAgIDogZGF0YS5tYXA7CiAgICB9CgogICAgdmFyIF9nZXRNYXBEYXRhID0gZ2V0TWFwRGF0YTsKCiAgICAvKioKICAgICAqIFJlbW92ZXMgYGtleWAgYW5kIGl0cyB2YWx1ZSBmcm9tIHRoZSBtYXAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGRlbGV0ZQogICAgICogQG1lbWJlck9mIE1hcENhY2hlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHZhbHVlIHRvIHJlbW92ZS4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgZW50cnkgd2FzIHJlbW92ZWQsIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gbWFwQ2FjaGVEZWxldGUoa2V5KSB7CiAgICAgIHZhciByZXN1bHQgPSBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpWydkZWxldGUnXShrZXkpOwogICAgICB0aGlzLnNpemUgLT0gcmVzdWx0ID8gMSA6IDA7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9tYXBDYWNoZURlbGV0ZSA9IG1hcENhY2hlRGVsZXRlOwoKICAgIC8qKgogICAgICogR2V0cyB0aGUgbWFwIHZhbHVlIGZvciBga2V5YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgZ2V0CiAgICAgKiBAbWVtYmVyT2YgTWFwQ2FjaGUKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0LgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGVudHJ5IHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiBtYXBDYWNoZUdldChrZXkpIHsKICAgICAgcmV0dXJuIF9nZXRNYXBEYXRhKHRoaXMsIGtleSkuZ2V0KGtleSk7CiAgICB9CgogICAgdmFyIF9tYXBDYWNoZUdldCA9IG1hcENhY2hlR2V0OwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGEgbWFwIHZhbHVlIGZvciBga2V5YCBleGlzdHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBuYW1lIGhhcwogICAgICogQG1lbWJlck9mIE1hcENhY2hlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIGVudHJ5IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGFuIGVudHJ5IGZvciBga2V5YCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gbWFwQ2FjaGVIYXMoa2V5KSB7CiAgICAgIHJldHVybiBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLmhhcyhrZXkpOwogICAgfQoKICAgIHZhciBfbWFwQ2FjaGVIYXMgPSBtYXBDYWNoZUhhczsKCiAgICAvKioKICAgICAqIFNldHMgdGhlIG1hcCBga2V5YCB0byBgdmFsdWVgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBzZXQKICAgICAqIEBtZW1iZXJPZiBNYXBDYWNoZQogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBzZXQuCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBtYXAgY2FjaGUgaW5zdGFuY2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcENhY2hlU2V0KGtleSwgdmFsdWUpIHsKICAgICAgdmFyIGRhdGEgPSBfZ2V0TWFwRGF0YSh0aGlzLCBrZXkpLAogICAgICAgICAgc2l6ZSA9IGRhdGEuc2l6ZTsKCiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpOwogICAgICB0aGlzLnNpemUgKz0gZGF0YS5zaXplID09IHNpemUgPyAwIDogMTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIF9tYXBDYWNoZVNldCA9IG1hcENhY2hlU2V0OwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG1hcCBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLgogICAgICovCiAgICBmdW5jdGlvbiBNYXBDYWNoZShlbnRyaWVzKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gZW50cmllcyA9PSBudWxsID8gMCA6IGVudHJpZXMubGVuZ3RoOwoKICAgICAgdGhpcy5jbGVhcigpOwogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciBlbnRyeSA9IGVudHJpZXNbaW5kZXhdOwogICAgICAgIHRoaXMuc2V0KGVudHJ5WzBdLCBlbnRyeVsxXSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgbWV0aG9kcyB0byBgTWFwQ2FjaGVgLgogICAgTWFwQ2FjaGUucHJvdG90eXBlLmNsZWFyID0gX21hcENhY2hlQ2xlYXI7CiAgICBNYXBDYWNoZS5wcm90b3R5cGVbJ2RlbGV0ZSddID0gX21hcENhY2hlRGVsZXRlOwogICAgTWFwQ2FjaGUucHJvdG90eXBlLmdldCA9IF9tYXBDYWNoZUdldDsKICAgIE1hcENhY2hlLnByb3RvdHlwZS5oYXMgPSBfbWFwQ2FjaGVIYXM7CiAgICBNYXBDYWNoZS5wcm90b3R5cGUuc2V0ID0gX21hcENhY2hlU2V0OwoKICAgIHZhciBfTWFwQ2FjaGUgPSBNYXBDYWNoZTsKCiAgICAvKiogVXNlZCBhcyB0aGUgc2l6ZSB0byBlbmFibGUgbGFyZ2UgYXJyYXkgb3B0aW1pemF0aW9ucy4gKi8KICAgIHZhciBMQVJHRV9BUlJBWV9TSVpFID0gMjAwOwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgc3RhY2sgYGtleWAgdG8gYHZhbHVlYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQG5hbWUgc2V0CiAgICAgKiBAbWVtYmVyT2YgU3RhY2sKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gc2V0LgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgc3RhY2sgY2FjaGUgaW5zdGFuY2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0YWNrU2V0KGtleSwgdmFsdWUpIHsKICAgICAgdmFyIGRhdGEgPSB0aGlzLl9fZGF0YV9fOwogICAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIF9MaXN0Q2FjaGUpIHsKICAgICAgICB2YXIgcGFpcnMgPSBkYXRhLl9fZGF0YV9fOwogICAgICAgIGlmICghX01hcCB8fCAocGFpcnMubGVuZ3RoIDwgTEFSR0VfQVJSQVlfU0laRSAtIDEpKSB7CiAgICAgICAgICBwYWlycy5wdXNoKFtrZXksIHZhbHVlXSk7CiAgICAgICAgICB0aGlzLnNpemUgPSArK2RhdGEuc2l6ZTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBfTWFwQ2FjaGUocGFpcnMpOwogICAgICB9CiAgICAgIGRhdGEuc2V0KGtleSwgdmFsdWUpOwogICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIHZhciBfc3RhY2tTZXQgPSBzdGFja1NldDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBzdGFjayBjYWNoZSBvYmplY3QgdG8gc3RvcmUga2V5LXZhbHVlIHBhaXJzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAY29uc3RydWN0b3IKICAgICAqIEBwYXJhbSB7QXJyYXl9IFtlbnRyaWVzXSBUaGUga2V5LXZhbHVlIHBhaXJzIHRvIGNhY2hlLgogICAgICovCiAgICBmdW5jdGlvbiBTdGFjayhlbnRyaWVzKSB7CiAgICAgIHZhciBkYXRhID0gdGhpcy5fX2RhdGFfXyA9IG5ldyBfTGlzdENhY2hlKGVudHJpZXMpOwogICAgICB0aGlzLnNpemUgPSBkYXRhLnNpemU7CiAgICB9CgogICAgLy8gQWRkIG1ldGhvZHMgdG8gYFN0YWNrYC4KICAgIFN0YWNrLnByb3RvdHlwZS5jbGVhciA9IF9zdGFja0NsZWFyOwogICAgU3RhY2sucHJvdG90eXBlWydkZWxldGUnXSA9IF9zdGFja0RlbGV0ZTsKICAgIFN0YWNrLnByb3RvdHlwZS5nZXQgPSBfc3RhY2tHZXQ7CiAgICBTdGFjay5wcm90b3R5cGUuaGFzID0gX3N0YWNrSGFzOwogICAgU3RhY2sucHJvdG90eXBlLnNldCA9IF9zdGFja1NldDsKCiAgICB2YXIgX1N0YWNrID0gU3RhY2s7CgogICAgLyoqCiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZm9yRWFjaGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yCiAgICAgKiBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFycmF5RWFjaChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgaWYgKGl0ZXJhdGVlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSA9PT0gZmFsc2UpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CgogICAgdmFyIF9hcnJheUVhY2ggPSBhcnJheUVhY2g7CgogICAgdmFyIGRlZmluZVByb3BlcnR5ID0gKGZ1bmN0aW9uKCkgewogICAgICB0cnkgewogICAgICAgIHZhciBmdW5jID0gX2dldE5hdGl2ZShPYmplY3QsICdkZWZpbmVQcm9wZXJ0eScpOwogICAgICAgIGZ1bmMoe30sICcnLCB7fSk7CiAgICAgICAgcmV0dXJuIGZ1bmM7CiAgICAgIH0gY2F0Y2ggKGUpIHt9CiAgICB9KCkpOwoKICAgIHZhciBfZGVmaW5lUHJvcGVydHkgPSBkZWZpbmVQcm9wZXJ0eTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBhc3NpZ25WYWx1ZWAgYW5kIGBhc3NpZ25NZXJnZVZhbHVlYCB3aXRob3V0CiAgICAgKiB2YWx1ZSBjaGVja3MuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGFzc2lnbi4KICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGFzc2lnbi4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSkgewogICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nICYmIF9kZWZpbmVQcm9wZXJ0eSkgewogICAgICAgIF9kZWZpbmVQcm9wZXJ0eShvYmplY3QsIGtleSwgewogICAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsCiAgICAgICAgICAnZW51bWVyYWJsZSc6IHRydWUsCiAgICAgICAgICAndmFsdWUnOiB2YWx1ZSwKICAgICAgICAgICd3cml0YWJsZSc6IHRydWUKICAgICAgICB9KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBvYmplY3Rba2V5XSA9IHZhbHVlOwogICAgICB9CiAgICB9CgogICAgdmFyIF9iYXNlQXNzaWduVmFsdWUgPSBiYXNlQXNzaWduVmFsdWU7CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJDUgPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JDQgPSBvYmplY3RQcm90byQ1Lmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogQXNzaWducyBgdmFsdWVgIHRvIGBrZXlgIG9mIGBvYmplY3RgIGlmIHRoZSBleGlzdGluZyB2YWx1ZSBpcyBub3QgZXF1aXZhbGVudAogICAgICogdXNpbmcgW2BTYW1lVmFsdWVaZXJvYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtc2FtZXZhbHVlemVybykKICAgICAqIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIG1vZGlmeS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gYXNzaWduLgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gYXNzaWduLgogICAgICovCiAgICBmdW5jdGlvbiBhc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgdmFsdWUpIHsKICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV07CiAgICAgIGlmICghKGhhc093blByb3BlcnR5JDQuY2FsbChvYmplY3QsIGtleSkgJiYgZXFfMShvYmpWYWx1ZSwgdmFsdWUpKSB8fAogICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHsKICAgICAgICBfYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgX2Fzc2lnblZhbHVlID0gYXNzaWduVmFsdWU7CgogICAgLyoqCiAgICAgKiBDb3BpZXMgcHJvcGVydGllcyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgcHJvcGVydGllcyBmcm9tLgogICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzIHRvIGNvcHkuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdD17fV0gVGhlIG9iamVjdCB0byBjb3B5IHByb3BlcnRpZXMgdG8uCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb3BpZWQgdmFsdWVzLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAqLwogICAgZnVuY3Rpb24gY29weU9iamVjdChzb3VyY2UsIHByb3BzLCBvYmplY3QsIGN1c3RvbWl6ZXIpIHsKICAgICAgdmFyIGlzTmV3ID0gIW9iamVjdDsKICAgICAgb2JqZWN0IHx8IChvYmplY3QgPSB7fSk7CgogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aDsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGtleSA9IHByb3BzW2luZGV4XTsKCiAgICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplcgogICAgICAgICAgPyBjdXN0b21pemVyKG9iamVjdFtrZXldLCBzb3VyY2Vba2V5XSwga2V5LCBvYmplY3QsIHNvdXJjZSkKICAgICAgICAgIDogdW5kZWZpbmVkOwoKICAgICAgICBpZiAobmV3VmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgbmV3VmFsdWUgPSBzb3VyY2Vba2V5XTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzTmV3KSB7CiAgICAgICAgICBfYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIF9hc3NpZ25WYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQoKICAgIHZhciBfY29weU9iamVjdCA9IGNvcHlPYmplY3Q7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50aW1lc2Agd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzCiAgICAgKiBvciBtYXggYXJyYXkgbGVuZ3RoIGNoZWNrcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtudW1iZXJ9IG4gVGhlIG51bWJlciBvZiB0aW1lcyB0byBpbnZva2UgYGl0ZXJhdGVlYC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHJlc3VsdHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VUaW1lcyhuLCBpdGVyYXRlZSkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG4pOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBuKSB7CiAgICAgICAgcmVzdWx0W2luZGV4XSA9IGl0ZXJhdGVlKGluZGV4KTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfYmFzZVRpbWVzID0gYmFzZVRpbWVzOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgb2JqZWN0LWxpa2UuIEEgdmFsdWUgaXMgb2JqZWN0LWxpa2UgaWYgaXQncyBub3QgYG51bGxgCiAgICAgKiBhbmQgaGFzIGEgYHR5cGVvZmAgcmVzdWx0IG9mICJvYmplY3QiLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgNC4wLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIG9iamVjdC1saWtlLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNPYmplY3RMaWtlKHt9KTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzT2JqZWN0TGlrZShbMSwgMiwgM10pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNPYmplY3RMaWtlKF8ubm9vcCk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIF8uaXNPYmplY3RMaWtlKG51bGwpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gaXNPYmplY3RMaWtlKHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JzsKICAgIH0KCiAgICB2YXIgaXNPYmplY3RMaWtlXzEgPSBpc09iamVjdExpa2U7CgogICAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqLwogICAgdmFyIGFyZ3NUYWcgPSAnW29iamVjdCBBcmd1bWVudHNdJzsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzQXJndW1lbnRzYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBgYXJndW1lbnRzYCBvYmplY3QsCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJc0FyZ3VtZW50cyh2YWx1ZSkgewogICAgICByZXR1cm4gaXNPYmplY3RMaWtlXzEodmFsdWUpICYmIF9iYXNlR2V0VGFnKHZhbHVlKSA9PSBhcmdzVGFnOwogICAgfQoKICAgIHZhciBfYmFzZUlzQXJndW1lbnRzID0gYmFzZUlzQXJndW1lbnRzOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RQcm90byQ2ID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSQ1ID0gb2JqZWN0UHJvdG8kNi5oYXNPd25Qcm9wZXJ0eTsKCiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSA9IG9iamVjdFByb3RvJDYucHJvcGVydHlJc0VudW1lcmFibGU7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYW4gYGFyZ3VtZW50c2Agb2JqZWN0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGFuIGBhcmd1bWVudHNgIG9iamVjdCwKICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNBcmd1bWVudHMoZnVuY3Rpb24oKSB7IHJldHVybiBhcmd1bWVudHM7IH0oKSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc0FyZ3VtZW50cyhbMSwgMiwgM10pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgdmFyIGlzQXJndW1lbnRzID0gX2Jhc2VJc0FyZ3VtZW50cyhmdW5jdGlvbigpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA/IF9iYXNlSXNBcmd1bWVudHMgOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICByZXR1cm4gaXNPYmplY3RMaWtlXzEodmFsdWUpICYmIGhhc093blByb3BlcnR5JDUuY2FsbCh2YWx1ZSwgJ2NhbGxlZScpICYmCiAgICAgICAgIXByb3BlcnR5SXNFbnVtZXJhYmxlLmNhbGwodmFsdWUsICdjYWxsZWUnKTsKICAgIH07CgogICAgdmFyIGlzQXJndW1lbnRzXzEgPSBpc0FyZ3VtZW50czsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYW4gYEFycmF5YCBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYW4gYXJyYXksIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc0FycmF5KFsxLCAyLCAzXSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc0FycmF5KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmlzQXJyYXkoJ2FiYycpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmlzQXJyYXkoXy5ub29wKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIHZhciBpc0FycmF5ID0gQXJyYXkuaXNBcnJheTsKCiAgICB2YXIgaXNBcnJheV8xID0gaXNBcnJheTsKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDQuMTMuMAogICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udGltZXMoMiwgXy5zdHViRmFsc2UpOwogICAgICogLy8gPT4gW2ZhbHNlLCBmYWxzZV0KICAgICAqLwogICAgZnVuY3Rpb24gc3R1YkZhbHNlKCkgewogICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgdmFyIHN0dWJGYWxzZV8xID0gc3R1YkZhbHNlOwoKICAgIHZhciBpc0J1ZmZlcl8xID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi8KICAgIHZhciBmcmVlRXhwb3J0cyA9ICBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CgogICAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqLwogICAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiAnb2JqZWN0JyA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7CgogICAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi8KICAgIHZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzOwoKICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqLwogICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBfcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQ7CgogICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwogICAgdmFyIG5hdGl2ZUlzQnVmZmVyID0gQnVmZmVyID8gQnVmZmVyLmlzQnVmZmVyIDogdW5kZWZpbmVkOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSA0LjMuMAogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBidWZmZXIsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc0J1ZmZlcihuZXcgQnVmZmVyKDIpKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzQnVmZmVyKG5ldyBVaW50OEFycmF5KDIpKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIHZhciBpc0J1ZmZlciA9IG5hdGl2ZUlzQnVmZmVyIHx8IHN0dWJGYWxzZV8xOwoKICAgIG1vZHVsZS5leHBvcnRzID0gaXNCdWZmZXI7CiAgICB9KTsKCiAgICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi8KICAgIHZhciBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTsKCiAgICAvKiogVXNlZCB0byBkZXRlY3QgdW5zaWduZWQgaW50ZWdlciB2YWx1ZXMuICovCiAgICB2YXIgcmVJc1VpbnQgPSAvXig/OjB8WzEtOV1cZCopJC87CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgaW5kZXguCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtsZW5ndGg9TUFYX1NBRkVfSU5URUdFUl0gVGhlIHVwcGVyIGJvdW5kcyBvZiBhIHZhbGlkIGluZGV4LgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSB2YWxpZCBpbmRleCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBpc0luZGV4KHZhbHVlLCBsZW5ndGgpIHsKICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICAgIGxlbmd0aCA9IGxlbmd0aCA9PSBudWxsID8gTUFYX1NBRkVfSU5URUdFUiA6IGxlbmd0aDsKCiAgICAgIHJldHVybiAhIWxlbmd0aCAmJgogICAgICAgICh0eXBlID09ICdudW1iZXInIHx8CiAgICAgICAgICAodHlwZSAhPSAnc3ltYm9sJyAmJiByZUlzVWludC50ZXN0KHZhbHVlKSkpICYmCiAgICAgICAgICAgICh2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDwgbGVuZ3RoKTsKICAgIH0KCiAgICB2YXIgX2lzSW5kZXggPSBpc0luZGV4OwoKICAgIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqLwogICAgdmFyIE1BWF9TQUZFX0lOVEVHRVIkMSA9IDkwMDcxOTkyNTQ3NDA5OTE7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhIHZhbGlkIGFycmF5LWxpa2UgbGVuZ3RoLgogICAgICoKICAgICAqICoqTm90ZToqKiBUaGlzIG1ldGhvZCBpcyBsb29zZWx5IGJhc2VkIG9uCiAgICAgKiBbYFRvTGVuZ3RoYF0oaHR0cDovL2VjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9sZW5ndGgpLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgNC4wLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdmFsaWQgbGVuZ3RoLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNMZW5ndGgoMyk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc0xlbmd0aChOdW1iZXIuTUlOX1ZBTFVFKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5pc0xlbmd0aChJbmZpbml0eSk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICoKICAgICAqIF8uaXNMZW5ndGgoJzMnKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTGVuZ3RoKHZhbHVlKSB7CiAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT0gJ251bWJlcicgJiYKICAgICAgICB2YWx1ZSA+IC0xICYmIHZhbHVlICUgMSA9PSAwICYmIHZhbHVlIDw9IE1BWF9TQUZFX0lOVEVHRVIkMTsKICAgIH0KCiAgICB2YXIgaXNMZW5ndGhfMSA9IGlzTGVuZ3RoOwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBhcmdzVGFnJDEgPSAnW29iamVjdCBBcmd1bWVudHNdJywKICAgICAgICBhcnJheVRhZyA9ICdbb2JqZWN0IEFycmF5XScsCiAgICAgICAgYm9vbFRhZyA9ICdbb2JqZWN0IEJvb2xlYW5dJywKICAgICAgICBkYXRlVGFnID0gJ1tvYmplY3QgRGF0ZV0nLAogICAgICAgIGVycm9yVGFnID0gJ1tvYmplY3QgRXJyb3JdJywKICAgICAgICBmdW5jVGFnJDEgPSAnW29iamVjdCBGdW5jdGlvbl0nLAogICAgICAgIG1hcFRhZyA9ICdbb2JqZWN0IE1hcF0nLAogICAgICAgIG51bWJlclRhZyA9ICdbb2JqZWN0IE51bWJlcl0nLAogICAgICAgIG9iamVjdFRhZyA9ICdbb2JqZWN0IE9iamVjdF0nLAogICAgICAgIHJlZ2V4cFRhZyA9ICdbb2JqZWN0IFJlZ0V4cF0nLAogICAgICAgIHNldFRhZyA9ICdbb2JqZWN0IFNldF0nLAogICAgICAgIHN0cmluZ1RhZyA9ICdbb2JqZWN0IFN0cmluZ10nLAogICAgICAgIHdlYWtNYXBUYWcgPSAnW29iamVjdCBXZWFrTWFwXSc7CgogICAgdmFyIGFycmF5QnVmZmVyVGFnID0gJ1tvYmplY3QgQXJyYXlCdWZmZXJdJywKICAgICAgICBkYXRhVmlld1RhZyA9ICdbb2JqZWN0IERhdGFWaWV3XScsCiAgICAgICAgZmxvYXQzMlRhZyA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLAogICAgICAgIGZsb2F0NjRUYWcgPSAnW29iamVjdCBGbG9hdDY0QXJyYXldJywKICAgICAgICBpbnQ4VGFnID0gJ1tvYmplY3QgSW50OEFycmF5XScsCiAgICAgICAgaW50MTZUYWcgPSAnW29iamVjdCBJbnQxNkFycmF5XScsCiAgICAgICAgaW50MzJUYWcgPSAnW29iamVjdCBJbnQzMkFycmF5XScsCiAgICAgICAgdWludDhUYWcgPSAnW29iamVjdCBVaW50OEFycmF5XScsCiAgICAgICAgdWludDhDbGFtcGVkVGFnID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKICAgICAgICB1aW50MTZUYWcgPSAnW29iamVjdCBVaW50MTZBcnJheV0nLAogICAgICAgIHVpbnQzMlRhZyA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7CgogICAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgb2YgdHlwZWQgYXJyYXlzLiAqLwogICAgdmFyIHR5cGVkQXJyYXlUYWdzID0ge307CiAgICB0eXBlZEFycmF5VGFnc1tmbG9hdDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW2Zsb2F0NjRUYWddID0KICAgIHR5cGVkQXJyYXlUYWdzW2ludDhUYWddID0gdHlwZWRBcnJheVRhZ3NbaW50MTZUYWddID0KICAgIHR5cGVkQXJyYXlUYWdzW2ludDMyVGFnXSA9IHR5cGVkQXJyYXlUYWdzW3VpbnQ4VGFnXSA9CiAgICB0eXBlZEFycmF5VGFnc1t1aW50OENsYW1wZWRUYWddID0gdHlwZWRBcnJheVRhZ3NbdWludDE2VGFnXSA9CiAgICB0eXBlZEFycmF5VGFnc1t1aW50MzJUYWddID0gdHJ1ZTsKICAgIHR5cGVkQXJyYXlUYWdzW2FyZ3NUYWckMV0gPSB0eXBlZEFycmF5VGFnc1thcnJheVRhZ10gPQogICAgdHlwZWRBcnJheVRhZ3NbYXJyYXlCdWZmZXJUYWddID0gdHlwZWRBcnJheVRhZ3NbYm9vbFRhZ10gPQogICAgdHlwZWRBcnJheVRhZ3NbZGF0YVZpZXdUYWddID0gdHlwZWRBcnJheVRhZ3NbZGF0ZVRhZ10gPQogICAgdHlwZWRBcnJheVRhZ3NbZXJyb3JUYWddID0gdHlwZWRBcnJheVRhZ3NbZnVuY1RhZyQxXSA9CiAgICB0eXBlZEFycmF5VGFnc1ttYXBUYWddID0gdHlwZWRBcnJheVRhZ3NbbnVtYmVyVGFnXSA9CiAgICB0eXBlZEFycmF5VGFnc1tvYmplY3RUYWddID0gdHlwZWRBcnJheVRhZ3NbcmVnZXhwVGFnXSA9CiAgICB0eXBlZEFycmF5VGFnc1tzZXRUYWddID0gdHlwZWRBcnJheVRhZ3Nbc3RyaW5nVGFnXSA9CiAgICB0eXBlZEFycmF5VGFnc1t3ZWFrTWFwVGFnXSA9IGZhbHNlOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNUeXBlZEFycmF5YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHR5cGVkIGFycmF5LCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJc1R5cGVkQXJyYXkodmFsdWUpIHsKICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZV8xKHZhbHVlKSAmJgogICAgICAgIGlzTGVuZ3RoXzEodmFsdWUubGVuZ3RoKSAmJiAhIXR5cGVkQXJyYXlUYWdzW19iYXNlR2V0VGFnKHZhbHVlKV07CiAgICB9CgogICAgdmFyIF9iYXNlSXNUeXBlZEFycmF5ID0gYmFzZUlzVHlwZWRBcnJheTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuYXJ5YCB3aXRob3V0IHN1cHBvcnQgZm9yIHN0b3JpbmcgbWV0YWRhdGEuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGNhcCBhcmd1bWVudHMgZm9yLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY2FwcGVkIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlVW5hcnkoZnVuYykgewogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gZnVuYyh2YWx1ZSk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9iYXNlVW5hcnkgPSBiYXNlVW5hcnk7CgogICAgdmFyIF9ub2RlVXRpbCA9IGNyZWF0ZUNvbW1vbmpzTW9kdWxlKGZ1bmN0aW9uIChtb2R1bGUsIGV4cG9ydHMpIHsKICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgZXhwb3J0c2AuICovCiAgICB2YXIgZnJlZUV4cG9ydHMgPSAgZXhwb3J0cyAmJiAhZXhwb3J0cy5ub2RlVHlwZSAmJiBleHBvcnRzOwoKICAgIC8qKiBEZXRlY3QgZnJlZSB2YXJpYWJsZSBgbW9kdWxlYC4gKi8KICAgIHZhciBmcmVlTW9kdWxlID0gZnJlZUV4cG9ydHMgJiYgJ29iamVjdCcgPT0gJ29iamVjdCcgJiYgbW9kdWxlICYmICFtb2R1bGUubm9kZVR5cGUgJiYgbW9kdWxlOwoKICAgIC8qKiBEZXRlY3QgdGhlIHBvcHVsYXIgQ29tbW9uSlMgZXh0ZW5zaW9uIGBtb2R1bGUuZXhwb3J0c2AuICovCiAgICB2YXIgbW9kdWxlRXhwb3J0cyA9IGZyZWVNb2R1bGUgJiYgZnJlZU1vZHVsZS5leHBvcnRzID09PSBmcmVlRXhwb3J0czsKCiAgICAvKiogRGV0ZWN0IGZyZWUgdmFyaWFibGUgYHByb2Nlc3NgIGZyb20gTm9kZS5qcy4gKi8KICAgIHZhciBmcmVlUHJvY2VzcyA9IG1vZHVsZUV4cG9ydHMgJiYgX2ZyZWVHbG9iYWwucHJvY2VzczsKCiAgICAvKiogVXNlZCB0byBhY2Nlc3MgZmFzdGVyIE5vZGUuanMgaGVscGVycy4gKi8KICAgIHZhciBub2RlVXRpbCA9IChmdW5jdGlvbigpIHsKICAgICAgdHJ5IHsKICAgICAgICAvLyBVc2UgYHV0aWwudHlwZXNgIGZvciBOb2RlLmpzIDEwKy4KICAgICAgICB2YXIgdHlwZXMgPSBmcmVlTW9kdWxlICYmIGZyZWVNb2R1bGUucmVxdWlyZSAmJiBmcmVlTW9kdWxlLnJlcXVpcmUoJ3V0aWwnKS50eXBlczsKCiAgICAgICAgaWYgKHR5cGVzKSB7CiAgICAgICAgICByZXR1cm4gdHlwZXM7CiAgICAgICAgfQoKICAgICAgICAvLyBMZWdhY3kgYHByb2Nlc3MuYmluZGluZygndXRpbCcpYCBmb3IgTm9kZS5qcyA8IDEwLgogICAgICAgIHJldHVybiBmcmVlUHJvY2VzcyAmJiBmcmVlUHJvY2Vzcy5iaW5kaW5nICYmIGZyZWVQcm9jZXNzLmJpbmRpbmcoJ3V0aWwnKTsKICAgICAgfSBjYXRjaCAoZSkge30KICAgIH0oKSk7CgogICAgbW9kdWxlLmV4cG9ydHMgPSBub2RlVXRpbDsKICAgIH0pOwoKICAgIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovCiAgICB2YXIgbm9kZUlzVHlwZWRBcnJheSA9IF9ub2RlVXRpbCAmJiBfbm9kZVV0aWwuaXNUeXBlZEFycmF5OwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIHR5cGVkIGFycmF5LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMy4wLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgdHlwZWQgYXJyYXksIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc1R5cGVkQXJyYXkobmV3IFVpbnQ4QXJyYXkpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNUeXBlZEFycmF5KFtdKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIHZhciBpc1R5cGVkQXJyYXkgPSBub2RlSXNUeXBlZEFycmF5ID8gX2Jhc2VVbmFyeShub2RlSXNUeXBlZEFycmF5KSA6IF9iYXNlSXNUeXBlZEFycmF5OwoKICAgIHZhciBpc1R5cGVkQXJyYXlfMSA9IGlzVHlwZWRBcnJheTsKCiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovCiAgICB2YXIgb2JqZWN0UHJvdG8kNyA9IE9iamVjdC5wcm90b3R5cGU7CgogICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCiAgICB2YXIgaGFzT3duUHJvcGVydHkkNiA9IG9iamVjdFByb3RvJDcuaGFzT3duUHJvcGVydHk7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBlbnVtZXJhYmxlIHByb3BlcnR5IG5hbWVzIG9mIHRoZSBhcnJheS1saWtlIGB2YWx1ZWAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtib29sZWFufSBpbmhlcml0ZWQgU3BlY2lmeSByZXR1cm5pbmcgaW5oZXJpdGVkIHByb3BlcnR5IG5hbWVzLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy4KICAgICAqLwogICAgZnVuY3Rpb24gYXJyYXlMaWtlS2V5cyh2YWx1ZSwgaW5oZXJpdGVkKSB7CiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXlfMSh2YWx1ZSksCiAgICAgICAgICBpc0FyZyA9ICFpc0FyciAmJiBpc0FyZ3VtZW50c18xKHZhbHVlKSwKICAgICAgICAgIGlzQnVmZiA9ICFpc0FyciAmJiAhaXNBcmcgJiYgaXNCdWZmZXJfMSh2YWx1ZSksCiAgICAgICAgICBpc1R5cGUgPSAhaXNBcnIgJiYgIWlzQXJnICYmICFpc0J1ZmYgJiYgaXNUeXBlZEFycmF5XzEodmFsdWUpLAogICAgICAgICAgc2tpcEluZGV4ZXMgPSBpc0FyciB8fCBpc0FyZyB8fCBpc0J1ZmYgfHwgaXNUeXBlLAogICAgICAgICAgcmVzdWx0ID0gc2tpcEluZGV4ZXMgPyBfYmFzZVRpbWVzKHZhbHVlLmxlbmd0aCwgU3RyaW5nKSA6IFtdLAogICAgICAgICAgbGVuZ3RoID0gcmVzdWx0Lmxlbmd0aDsKCiAgICAgIGZvciAodmFyIGtleSBpbiB2YWx1ZSkgewogICAgICAgIGlmICgoaW5oZXJpdGVkIHx8IGhhc093blByb3BlcnR5JDYuY2FsbCh2YWx1ZSwga2V5KSkgJiYKICAgICAgICAgICAgIShza2lwSW5kZXhlcyAmJiAoCiAgICAgICAgICAgICAgIC8vIFNhZmFyaSA5IGhhcyBlbnVtZXJhYmxlIGBhcmd1bWVudHMubGVuZ3RoYCBpbiBzdHJpY3QgbW9kZS4KICAgICAgICAgICAgICAga2V5ID09ICdsZW5ndGgnIHx8CiAgICAgICAgICAgICAgIC8vIE5vZGUuanMgMC4xMCBoYXMgZW51bWVyYWJsZSBub24taW5kZXggcHJvcGVydGllcyBvbiBidWZmZXJzLgogICAgICAgICAgICAgICAoaXNCdWZmICYmIChrZXkgPT0gJ29mZnNldCcgfHwga2V5ID09ICdwYXJlbnQnKSkgfHwKICAgICAgICAgICAgICAgLy8gUGhhbnRvbUpTIDIgaGFzIGVudW1lcmFibGUgbm9uLWluZGV4IHByb3BlcnRpZXMgb24gdHlwZWQgYXJyYXlzLgogICAgICAgICAgICAgICAoaXNUeXBlICYmIChrZXkgPT0gJ2J1ZmZlcicgfHwga2V5ID09ICdieXRlTGVuZ3RoJyB8fCBrZXkgPT0gJ2J5dGVPZmZzZXQnKSkgfHwKICAgICAgICAgICAgICAgLy8gU2tpcCBpbmRleCBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICBfaXNJbmRleChrZXksIGxlbmd0aCkKICAgICAgICAgICAgKSkpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9hcnJheUxpa2VLZXlzID0gYXJyYXlMaWtlS2V5czsKCiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovCiAgICB2YXIgb2JqZWN0UHJvdG8kOCA9IE9iamVjdC5wcm90b3R5cGU7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBsaWtlbHkgYSBwcm90b3R5cGUgb2JqZWN0LgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgcHJvdG90eXBlLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzUHJvdG90eXBlKHZhbHVlKSB7CiAgICAgIHZhciBDdG9yID0gdmFsdWUgJiYgdmFsdWUuY29uc3RydWN0b3IsCiAgICAgICAgICBwcm90byA9ICh0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IucHJvdG90eXBlKSB8fCBvYmplY3RQcm90byQ4OwoKICAgICAgcmV0dXJuIHZhbHVlID09PSBwcm90bzsKICAgIH0KCiAgICB2YXIgX2lzUHJvdG90eXBlID0gaXNQcm90b3R5cGU7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgdW5hcnkgZnVuY3Rpb24gdGhhdCBpbnZva2VzIGBmdW5jYCB3aXRoIGl0cyBhcmd1bWVudCB0cmFuc2Zvcm1lZC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gd3JhcC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHRyYW5zZm9ybSBUaGUgYXJndW1lbnQgdHJhbnNmb3JtLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIG92ZXJBcmcoZnVuYywgdHJhbnNmb3JtKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihhcmcpIHsKICAgICAgICByZXR1cm4gZnVuYyh0cmFuc2Zvcm0oYXJnKSk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9vdmVyQXJnID0gb3ZlckFyZzsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCiAgICB2YXIgbmF0aXZlS2V5cyA9IF9vdmVyQXJnKE9iamVjdC5rZXlzLCBPYmplY3QpOwoKICAgIHZhciBfbmF0aXZlS2V5cyA9IG5hdGl2ZUtleXM7CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJDkgPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JDcgPSBvYmplY3RQcm90byQ5Lmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c2Agd2hpY2ggZG9lc24ndCB0cmVhdCBzcGFyc2UgYXJyYXlzIGFzIGRlbnNlLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlS2V5cyhvYmplY3QpIHsKICAgICAgaWYgKCFfaXNQcm90b3R5cGUob2JqZWN0KSkgewogICAgICAgIHJldHVybiBfbmF0aXZlS2V5cyhvYmplY3QpOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgZm9yICh2YXIga2V5IGluIE9iamVjdChvYmplY3QpKSB7CiAgICAgICAgaWYgKGhhc093blByb3BlcnR5JDcuY2FsbChvYmplY3QsIGtleSkgJiYga2V5ICE9ICdjb25zdHJ1Y3RvcicpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9iYXNlS2V5cyA9IGJhc2VLZXlzOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYXJyYXktbGlrZS4gQSB2YWx1ZSBpcyBjb25zaWRlcmVkIGFycmF5LWxpa2UgaWYgaXQncwogICAgICogbm90IGEgZnVuY3Rpb24gYW5kIGhhcyBhIGB2YWx1ZS5sZW5ndGhgIHRoYXQncyBhbiBpbnRlZ2VyIGdyZWF0ZXIgdGhhbiBvcgogICAgICogZXF1YWwgdG8gYDBgIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYE51bWJlci5NQVhfU0FGRV9JTlRFR0VSYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDQuMC4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhcnJheS1saWtlLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNBcnJheUxpa2UoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzQXJyYXlMaWtlKGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNBcnJheUxpa2UoJ2FiYycpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNBcnJheUxpa2UoXy5ub29wKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQXJyYXlMaWtlKHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZSAhPSBudWxsICYmIGlzTGVuZ3RoXzEodmFsdWUubGVuZ3RoKSAmJiAhaXNGdW5jdGlvbl8xKHZhbHVlKTsKICAgIH0KCiAgICB2YXIgaXNBcnJheUxpa2VfMSA9IGlzQXJyYXlMaWtlOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYG9iamVjdGAuCiAgICAgKgogICAgICogKipOb3RlOioqIE5vbi1vYmplY3QgdmFsdWVzIGFyZSBjb2VyY2VkIHRvIG9iamVjdHMuIFNlZSB0aGUKICAgICAqIFtFUyBzcGVjXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cykKICAgICAqIGZvciBtb3JlIGRldGFpbHMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICogICB0aGlzLmEgPSAxOwogICAgICogICB0aGlzLmIgPSAyOwogICAgICogfQogICAgICoKICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgKgogICAgICogXy5rZXlzKG5ldyBGb28pOwogICAgICogLy8gPT4gWydhJywgJ2InXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICoKICAgICAqIF8ua2V5cygnaGknKTsKICAgICAqIC8vID0+IFsnMCcsICcxJ10KICAgICAqLwogICAgZnVuY3Rpb24ga2V5cyQyKG9iamVjdCkgewogICAgICByZXR1cm4gaXNBcnJheUxpa2VfMShvYmplY3QpID8gX2FycmF5TGlrZUtleXMob2JqZWN0KSA6IF9iYXNlS2V5cyhvYmplY3QpOwogICAgfQoKICAgIHZhciBrZXlzXzEgPSBrZXlzJDI7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5hc3NpZ25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcwogICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ24ob2JqZWN0LCBzb3VyY2UpIHsKICAgICAgcmV0dXJuIG9iamVjdCAmJiBfY29weU9iamVjdChzb3VyY2UsIGtleXNfMShzb3VyY2UpLCBvYmplY3QpOwogICAgfQoKICAgIHZhciBfYmFzZUFzc2lnbiA9IGJhc2VBc3NpZ247CgogICAgLyoqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UKICAgICAqIFtgT2JqZWN0LmtleXNgXShodHRwOi8vZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi83LjAvI3NlYy1vYmplY3Qua2V5cykKICAgICAqIGV4Y2VwdCB0aGF0IGl0IGluY2x1ZGVzIGluaGVyaXRlZCBlbnVtZXJhYmxlIHByb3BlcnRpZXMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5hdGl2ZUtleXNJbihvYmplY3QpIHsKICAgICAgdmFyIHJlc3VsdCA9IFtdOwogICAgICBpZiAob2JqZWN0ICE9IG51bGwpIHsKICAgICAgICBmb3IgKHZhciBrZXkgaW4gT2JqZWN0KG9iamVjdCkpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKGtleSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9uYXRpdmVLZXlzSW4gPSBuYXRpdmVLZXlzSW47CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJGEgPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JDggPSBvYmplY3RQcm90byRhLmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ua2V5c0luYCB3aGljaCBkb2Vzbid0IHRyZWF0IHNwYXJzZSBhcnJheXMgYXMgZGVuc2UuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VLZXlzSW4ob2JqZWN0KSB7CiAgICAgIGlmICghaXNPYmplY3RfMShvYmplY3QpKSB7CiAgICAgICAgcmV0dXJuIF9uYXRpdmVLZXlzSW4ob2JqZWN0KTsKICAgICAgfQogICAgICB2YXIgaXNQcm90byA9IF9pc1Byb3RvdHlwZShvYmplY3QpLAogICAgICAgICAgcmVzdWx0ID0gW107CgogICAgICBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSB7CiAgICAgICAgaWYgKCEoa2V5ID09ICdjb25zdHJ1Y3RvcicgJiYgKGlzUHJvdG8gfHwgIWhhc093blByb3BlcnR5JDguY2FsbChvYmplY3QsIGtleSkpKSkgewogICAgICAgICAgcmVzdWx0LnB1c2goa2V5KTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2Jhc2VLZXlzSW4gPSBiYXNlS2V5c0luOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGFuZCBpbmhlcml0ZWQgZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBvZiBgb2JqZWN0YC4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDMuMC4wCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBmdW5jdGlvbiBGb28oKSB7CiAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgKiAgIHRoaXMuYiA9IDI7CiAgICAgKiB9CiAgICAgKgogICAgICogRm9vLnByb3RvdHlwZS5jID0gMzsKICAgICAqCiAgICAgKiBfLmtleXNJbihuZXcgRm9vKTsKICAgICAqIC8vID0+IFsnYScsICdiJywgJ2MnXSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICovCiAgICBmdW5jdGlvbiBrZXlzSW4kMShvYmplY3QpIHsKICAgICAgcmV0dXJuIGlzQXJyYXlMaWtlXzEob2JqZWN0KSA/IF9hcnJheUxpa2VLZXlzKG9iamVjdCwgdHJ1ZSkgOiBfYmFzZUtleXNJbihvYmplY3QpOwogICAgfQoKICAgIHZhciBrZXlzSW5fMSA9IGtleXNJbiQxOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uYXNzaWduSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgbXVsdGlwbGUgc291cmNlcwogICAgICogb3IgYGN1c3RvbWl6ZXJgIGZ1bmN0aW9ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgZGVzdGluYXRpb24gb2JqZWN0LgogICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgc291cmNlIG9iamVjdC4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VBc3NpZ25JbihvYmplY3QsIHNvdXJjZSkgewogICAgICByZXR1cm4gb2JqZWN0ICYmIF9jb3B5T2JqZWN0KHNvdXJjZSwga2V5c0luXzEoc291cmNlKSwgb2JqZWN0KTsKICAgIH0KCiAgICB2YXIgX2Jhc2VBc3NpZ25JbiA9IGJhc2VBc3NpZ25JbjsKCiAgICB2YXIgX2Nsb25lQnVmZmVyID0gY3JlYXRlQ29tbW9uanNNb2R1bGUoZnVuY3Rpb24gKG1vZHVsZSwgZXhwb3J0cykgewogICAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBleHBvcnRzYC4gKi8KICAgIHZhciBmcmVlRXhwb3J0cyA9ICBleHBvcnRzICYmICFleHBvcnRzLm5vZGVUeXBlICYmIGV4cG9ydHM7CgogICAgLyoqIERldGVjdCBmcmVlIHZhcmlhYmxlIGBtb2R1bGVgLiAqLwogICAgdmFyIGZyZWVNb2R1bGUgPSBmcmVlRXhwb3J0cyAmJiAnb2JqZWN0JyA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiYgIW1vZHVsZS5ub2RlVHlwZSAmJiBtb2R1bGU7CgogICAgLyoqIERldGVjdCB0aGUgcG9wdWxhciBDb21tb25KUyBleHRlbnNpb24gYG1vZHVsZS5leHBvcnRzYC4gKi8KICAgIHZhciBtb2R1bGVFeHBvcnRzID0gZnJlZU1vZHVsZSAmJiBmcmVlTW9kdWxlLmV4cG9ydHMgPT09IGZyZWVFeHBvcnRzOwoKICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqLwogICAgdmFyIEJ1ZmZlciA9IG1vZHVsZUV4cG9ydHMgPyBfcm9vdC5CdWZmZXIgOiB1bmRlZmluZWQsCiAgICAgICAgYWxsb2NVbnNhZmUgPSBCdWZmZXIgPyBCdWZmZXIuYWxsb2NVbnNhZmUgOiB1bmRlZmluZWQ7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgIGBidWZmZXJgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0J1ZmZlcn0gYnVmZmVyIFRoZSBidWZmZXIgdG8gY2xvbmUuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLgogICAgICogQHJldHVybnMge0J1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGJ1ZmZlci4KICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmVCdWZmZXIoYnVmZmVyLCBpc0RlZXApIHsKICAgICAgaWYgKGlzRGVlcCkgewogICAgICAgIHJldHVybiBidWZmZXIuc2xpY2UoKTsKICAgICAgfQogICAgICB2YXIgbGVuZ3RoID0gYnVmZmVyLmxlbmd0aCwKICAgICAgICAgIHJlc3VsdCA9IGFsbG9jVW5zYWZlID8gYWxsb2NVbnNhZmUobGVuZ3RoKSA6IG5ldyBidWZmZXIuY29uc3RydWN0b3IobGVuZ3RoKTsKCiAgICAgIGJ1ZmZlci5jb3B5KHJlc3VsdCk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgbW9kdWxlLmV4cG9ydHMgPSBjbG9uZUJ1ZmZlcjsKICAgIH0pOwoKICAgIC8qKgogICAgICogQ29waWVzIHRoZSB2YWx1ZXMgb2YgYHNvdXJjZWAgdG8gYGFycmF5YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gc291cmNlIFRoZSBhcnJheSB0byBjb3B5IHZhbHVlcyBmcm9tLgogICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5PVtdXSBUaGUgYXJyYXkgdG8gY29weSB2YWx1ZXMgdG8uCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgYGFycmF5YC4KICAgICAqLwogICAgZnVuY3Rpb24gY29weUFycmF5KHNvdXJjZSwgYXJyYXkpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBzb3VyY2UubGVuZ3RoOwoKICAgICAgYXJyYXkgfHwgKGFycmF5ID0gQXJyYXkobGVuZ3RoKSk7CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgYXJyYXlbaW5kZXhdID0gc291cmNlW2luZGV4XTsKICAgICAgfQogICAgICByZXR1cm4gYXJyYXk7CiAgICB9CgogICAgdmFyIF9jb3B5QXJyYXkgPSBjb3B5QXJyYXk7CgogICAgLyoqCiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uZmlsdGVyYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IKICAgICAqIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgZmlsdGVyZWQgYXJyYXkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFycmF5RmlsdGVyKGFycmF5LCBwcmVkaWNhdGUpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCwKICAgICAgICAgIHJlc0luZGV4ID0gMCwKICAgICAgICAgIHJlc3VsdCA9IFtdOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF07CiAgICAgICAgaWYgKHByZWRpY2F0ZSh2YWx1ZSwgaW5kZXgsIGFycmF5KSkgewogICAgICAgICAgcmVzdWx0W3Jlc0luZGV4KytdID0gdmFsdWU7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9hcnJheUZpbHRlciA9IGFycmF5RmlsdGVyOwoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgcmV0dXJucyBhIG5ldyBlbXB0eSBhcnJheS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDQuMTMuMAogICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGVtcHR5IGFycmF5LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgYXJyYXlzID0gXy50aW1lcygyLCBfLnN0dWJBcnJheSk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coYXJyYXlzKTsKICAgICAqIC8vID0+IFtbXSwgW11dCiAgICAgKgogICAgICogY29uc29sZS5sb2coYXJyYXlzWzBdID09PSBhcnJheXNbMV0pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gc3R1YkFycmF5KCkgewogICAgICByZXR1cm4gW107CiAgICB9CgogICAgdmFyIHN0dWJBcnJheV8xID0gc3R1YkFycmF5OwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RQcm90byRiID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKiogQnVpbHQtaW4gdmFsdWUgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBwcm9wZXJ0eUlzRW51bWVyYWJsZSQxID0gb2JqZWN0UHJvdG8kYi5wcm9wZXJ0eUlzRW51bWVyYWJsZTsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCiAgICB2YXIgbmF0aXZlR2V0U3ltYm9scyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHM7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHRoZSBvd24gZW51bWVyYWJsZSBzeW1ib2xzIG9mIGBvYmplY3RgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHN5bWJvbHMuCiAgICAgKi8KICAgIHZhciBnZXRTeW1ib2xzID0gIW5hdGl2ZUdldFN5bWJvbHMgPyBzdHViQXJyYXlfMSA6IGZ1bmN0aW9uKG9iamVjdCkgewogICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgb2JqZWN0ID0gT2JqZWN0KG9iamVjdCk7CiAgICAgIHJldHVybiBfYXJyYXlGaWx0ZXIobmF0aXZlR2V0U3ltYm9scyhvYmplY3QpLCBmdW5jdGlvbihzeW1ib2wpIHsKICAgICAgICByZXR1cm4gcHJvcGVydHlJc0VudW1lcmFibGUkMS5jYWxsKG9iamVjdCwgc3ltYm9sKTsKICAgICAgfSk7CiAgICB9OwoKICAgIHZhciBfZ2V0U3ltYm9scyA9IGdldFN5bWJvbHM7CgogICAgLyoqCiAgICAgKiBDb3BpZXMgb3duIHN5bWJvbHMgb2YgYHNvdXJjZWAgdG8gYG9iamVjdGAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzb3VyY2UgVGhlIG9iamVjdCB0byBjb3B5IHN5bWJvbHMgZnJvbS4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0PXt9XSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyB0by4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvcHlTeW1ib2xzKHNvdXJjZSwgb2JqZWN0KSB7CiAgICAgIHJldHVybiBfY29weU9iamVjdChzb3VyY2UsIF9nZXRTeW1ib2xzKHNvdXJjZSksIG9iamVjdCk7CiAgICB9CgogICAgdmFyIF9jb3B5U3ltYm9scyA9IGNvcHlTeW1ib2xzOwoKICAgIC8qKgogICAgICogQXBwZW5kcyB0aGUgZWxlbWVudHMgb2YgYHZhbHVlc2AgdG8gYGFycmF5YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIG1vZGlmeS4KICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgdmFsdWVzIHRvIGFwcGVuZC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyBgYXJyYXlgLgogICAgICovCiAgICBmdW5jdGlvbiBhcnJheVB1c2goYXJyYXksIHZhbHVlcykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IHZhbHVlcy5sZW5ndGgsCiAgICAgICAgICBvZmZzZXQgPSBhcnJheS5sZW5ndGg7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIGFycmF5W29mZnNldCArIGluZGV4XSA9IHZhbHVlc1tpbmRleF07CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQoKICAgIHZhciBfYXJyYXlQdXNoID0gYXJyYXlQdXNoOwoKICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqLwogICAgdmFyIGdldFByb3RvdHlwZSA9IF9vdmVyQXJnKE9iamVjdC5nZXRQcm90b3R5cGVPZiwgT2JqZWN0KTsKCiAgICB2YXIgX2dldFByb3RvdHlwZSA9IGdldFByb3RvdHlwZTsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCiAgICB2YXIgbmF0aXZlR2V0U3ltYm9scyQxID0gT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sczsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgdGhlIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgc3ltYm9scyBvZiBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBzeW1ib2xzLgogICAgICovCiAgICB2YXIgZ2V0U3ltYm9sc0luID0gIW5hdGl2ZUdldFN5bWJvbHMkMSA/IHN0dWJBcnJheV8xIDogZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSBbXTsKICAgICAgd2hpbGUgKG9iamVjdCkgewogICAgICAgIF9hcnJheVB1c2gocmVzdWx0LCBfZ2V0U3ltYm9scyhvYmplY3QpKTsKICAgICAgICBvYmplY3QgPSBfZ2V0UHJvdG90eXBlKG9iamVjdCk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH07CgogICAgdmFyIF9nZXRTeW1ib2xzSW4gPSBnZXRTeW1ib2xzSW47CgogICAgLyoqCiAgICAgKiBDb3BpZXMgb3duIGFuZCBpbmhlcml0ZWQgc3ltYm9scyBvZiBgc291cmNlYCB0byBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IHRvIGNvcHkgc3ltYm9scyBmcm9tLgogICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3Q9e31dIFRoZSBvYmplY3QgdG8gY29weSBzeW1ib2xzIHRvLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAqLwogICAgZnVuY3Rpb24gY29weVN5bWJvbHNJbihzb3VyY2UsIG9iamVjdCkgewogICAgICByZXR1cm4gX2NvcHlPYmplY3Qoc291cmNlLCBfZ2V0U3ltYm9sc0luKHNvdXJjZSksIG9iamVjdCk7CiAgICB9CgogICAgdmFyIF9jb3B5U3ltYm9sc0luID0gY29weVN5bWJvbHNJbjsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBnZXRBbGxLZXlzYCBhbmQgYGdldEFsbEtleXNJbmAgd2hpY2ggdXNlcwogICAgICogYGtleXNGdW5jYCBhbmQgYHN5bWJvbHNGdW5jYCB0byBnZXQgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kCiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3ltYm9sc0Z1bmMgVGhlIGZ1bmN0aW9uIHRvIGdldCB0aGUgc3ltYm9scyBvZiBgb2JqZWN0YC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgbmFtZXMgYW5kIHN5bWJvbHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VHZXRBbGxLZXlzKG9iamVjdCwga2V5c0Z1bmMsIHN5bWJvbHNGdW5jKSB7CiAgICAgIHZhciByZXN1bHQgPSBrZXlzRnVuYyhvYmplY3QpOwogICAgICByZXR1cm4gaXNBcnJheV8xKG9iamVjdCkgPyByZXN1bHQgOiBfYXJyYXlQdXNoKHJlc3VsdCwgc3ltYm9sc0Z1bmMob2JqZWN0KSk7CiAgICB9CgogICAgdmFyIF9iYXNlR2V0QWxsS2V5cyA9IGJhc2VHZXRBbGxLZXlzOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBvd24gZW51bWVyYWJsZSBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scyBvZiBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBhbmQgc3ltYm9scy4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QWxsS2V5cyhvYmplY3QpIHsKICAgICAgcmV0dXJuIF9iYXNlR2V0QWxsS2V5cyhvYmplY3QsIGtleXNfMSwgX2dldFN5bWJvbHMpOwogICAgfQoKICAgIHZhciBfZ2V0QWxsS2V5cyA9IGdldEFsbEtleXM7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIG93biBhbmQgaW5oZXJpdGVkIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgYW5kCiAgICAgKiBzeW1ib2xzIG9mIGBvYmplY3RgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIGFuZCBzeW1ib2xzLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRBbGxLZXlzSW4ob2JqZWN0KSB7CiAgICAgIHJldHVybiBfYmFzZUdldEFsbEtleXMob2JqZWN0LCBrZXlzSW5fMSwgX2dldFN5bWJvbHNJbik7CiAgICB9CgogICAgdmFyIF9nZXRBbGxLZXlzSW4gPSBnZXRBbGxLZXlzSW47CgogICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqLwogICAgdmFyIERhdGFWaWV3JDEgPSBfZ2V0TmF0aXZlKF9yb290LCAnRGF0YVZpZXcnKTsKCiAgICB2YXIgX0RhdGFWaWV3ID0gRGF0YVZpZXckMTsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyB0aGF0IGFyZSB2ZXJpZmllZCB0byBiZSBuYXRpdmUuICovCiAgICB2YXIgUHJvbWlzZSQxID0gX2dldE5hdGl2ZShfcm9vdCwgJ1Byb21pc2UnKTsKCiAgICB2YXIgX1Byb21pc2UgPSBQcm9taXNlJDE7CgogICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqLwogICAgdmFyIFNldCQ1ID0gX2dldE5hdGl2ZShfcm9vdCwgJ1NldCcpOwoKICAgIHZhciBfU2V0ID0gU2V0JDU7CgogICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgdGhhdCBhcmUgdmVyaWZpZWQgdG8gYmUgbmF0aXZlLiAqLwogICAgdmFyIFdlYWtNYXAkMSA9IF9nZXROYXRpdmUoX3Jvb3QsICdXZWFrTWFwJyk7CgogICAgdmFyIF9XZWFrTWFwID0gV2Vha01hcCQxOwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBtYXBUYWckMSA9ICdbb2JqZWN0IE1hcF0nLAogICAgICAgIG9iamVjdFRhZyQxID0gJ1tvYmplY3QgT2JqZWN0XScsCiAgICAgICAgcHJvbWlzZVRhZyA9ICdbb2JqZWN0IFByb21pc2VdJywKICAgICAgICBzZXRUYWckMSA9ICdbb2JqZWN0IFNldF0nLAogICAgICAgIHdlYWtNYXBUYWckMSA9ICdbb2JqZWN0IFdlYWtNYXBdJzsKCiAgICB2YXIgZGF0YVZpZXdUYWckMSA9ICdbb2JqZWN0IERhdGFWaWV3XSc7CgogICAgLyoqIFVzZWQgdG8gZGV0ZWN0IG1hcHMsIHNldHMsIGFuZCB3ZWFrbWFwcy4gKi8KICAgIHZhciBkYXRhVmlld0N0b3JTdHJpbmcgPSBfdG9Tb3VyY2UoX0RhdGFWaWV3KSwKICAgICAgICBtYXBDdG9yU3RyaW5nID0gX3RvU291cmNlKF9NYXApLAogICAgICAgIHByb21pc2VDdG9yU3RyaW5nID0gX3RvU291cmNlKF9Qcm9taXNlKSwKICAgICAgICBzZXRDdG9yU3RyaW5nID0gX3RvU291cmNlKF9TZXQpLAogICAgICAgIHdlYWtNYXBDdG9yU3RyaW5nID0gX3RvU291cmNlKF9XZWFrTWFwKTsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIGB0b1N0cmluZ1RhZ2Agb2YgYHZhbHVlYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfSBSZXR1cm5zIHRoZSBgdG9TdHJpbmdUYWdgLgogICAgICovCiAgICB2YXIgZ2V0VGFnID0gX2Jhc2VHZXRUYWc7CgogICAgLy8gRmFsbGJhY2sgZm9yIGRhdGEgdmlld3MsIG1hcHMsIHNldHMsIGFuZCB3ZWFrIG1hcHMgaW4gSUUgMTEgYW5kIHByb21pc2VzIGluIE5vZGUuanMgPCA2LgogICAgaWYgKChfRGF0YVZpZXcgJiYgZ2V0VGFnKG5ldyBfRGF0YVZpZXcobmV3IEFycmF5QnVmZmVyKDEpKSkgIT0gZGF0YVZpZXdUYWckMSkgfHwKICAgICAgICAoX01hcCAmJiBnZXRUYWcobmV3IF9NYXApICE9IG1hcFRhZyQxKSB8fAogICAgICAgIChfUHJvbWlzZSAmJiBnZXRUYWcoX1Byb21pc2UucmVzb2x2ZSgpKSAhPSBwcm9taXNlVGFnKSB8fAogICAgICAgIChfU2V0ICYmIGdldFRhZyhuZXcgX1NldCkgIT0gc2V0VGFnJDEpIHx8CiAgICAgICAgKF9XZWFrTWFwICYmIGdldFRhZyhuZXcgX1dlYWtNYXApICE9IHdlYWtNYXBUYWckMSkpIHsKICAgICAgZ2V0VGFnID0gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gX2Jhc2VHZXRUYWcodmFsdWUpLAogICAgICAgICAgICBDdG9yID0gcmVzdWx0ID09IG9iamVjdFRhZyQxID8gdmFsdWUuY29uc3RydWN0b3IgOiB1bmRlZmluZWQsCiAgICAgICAgICAgIGN0b3JTdHJpbmcgPSBDdG9yID8gX3RvU291cmNlKEN0b3IpIDogJyc7CgogICAgICAgIGlmIChjdG9yU3RyaW5nKSB7CiAgICAgICAgICBzd2l0Y2ggKGN0b3JTdHJpbmcpIHsKICAgICAgICAgICAgY2FzZSBkYXRhVmlld0N0b3JTdHJpbmc6IHJldHVybiBkYXRhVmlld1RhZyQxOwogICAgICAgICAgICBjYXNlIG1hcEN0b3JTdHJpbmc6IHJldHVybiBtYXBUYWckMTsKICAgICAgICAgICAgY2FzZSBwcm9taXNlQ3RvclN0cmluZzogcmV0dXJuIHByb21pc2VUYWc7CiAgICAgICAgICAgIGNhc2Ugc2V0Q3RvclN0cmluZzogcmV0dXJuIHNldFRhZyQxOwogICAgICAgICAgICBjYXNlIHdlYWtNYXBDdG9yU3RyaW5nOiByZXR1cm4gd2Vha01hcFRhZyQxOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9OwogICAgfQoKICAgIHZhciBfZ2V0VGFnID0gZ2V0VGFnOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RQcm90byRjID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSQ5ID0gb2JqZWN0UHJvdG8kYy5oYXNPd25Qcm9wZXJ0eTsKCiAgICAvKioKICAgICAqIEluaXRpYWxpemVzIGFuIGFycmF5IGNsb25lLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gY2xvbmUuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLgogICAgICovCiAgICBmdW5jdGlvbiBpbml0Q2xvbmVBcnJheShhcnJheSkgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgcmVzdWx0ID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKGxlbmd0aCk7CgogICAgICAvLyBBZGQgcHJvcGVydGllcyBhc3NpZ25lZCBieSBgUmVnRXhwI2V4ZWNgLgogICAgICBpZiAobGVuZ3RoICYmIHR5cGVvZiBhcnJheVswXSA9PSAnc3RyaW5nJyAmJiBoYXNPd25Qcm9wZXJ0eSQ5LmNhbGwoYXJyYXksICdpbmRleCcpKSB7CiAgICAgICAgcmVzdWx0LmluZGV4ID0gYXJyYXkuaW5kZXg7CiAgICAgICAgcmVzdWx0LmlucHV0ID0gYXJyYXkuaW5wdXQ7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2luaXRDbG9uZUFycmF5ID0gaW5pdENsb25lQXJyYXk7CgogICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovCiAgICB2YXIgVWludDhBcnJheSQxID0gX3Jvb3QuVWludDhBcnJheTsKCiAgICB2YXIgX1VpbnQ4QXJyYXkgPSBVaW50OEFycmF5JDE7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYGFycmF5QnVmZmVyYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheUJ1ZmZlcn0gYXJyYXlCdWZmZXIgVGhlIGFycmF5IGJ1ZmZlciB0byBjbG9uZS4KICAgICAqIEByZXR1cm5zIHtBcnJheUJ1ZmZlcn0gUmV0dXJucyB0aGUgY2xvbmVkIGFycmF5IGJ1ZmZlci4KICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmVBcnJheUJ1ZmZlcihhcnJheUJ1ZmZlcikgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IGFycmF5QnVmZmVyLmNvbnN0cnVjdG9yKGFycmF5QnVmZmVyLmJ5dGVMZW5ndGgpOwogICAgICBuZXcgX1VpbnQ4QXJyYXkocmVzdWx0KS5zZXQobmV3IF9VaW50OEFycmF5KGFycmF5QnVmZmVyKSk7CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9jbG9uZUFycmF5QnVmZmVyID0gY2xvbmVBcnJheUJ1ZmZlcjsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgZGF0YVZpZXdgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YVZpZXcgVGhlIGRhdGEgdmlldyB0byBjbG9uZS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgZGF0YSB2aWV3LgogICAgICovCiAgICBmdW5jdGlvbiBjbG9uZURhdGFWaWV3KGRhdGFWaWV3LCBpc0RlZXApIHsKICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IF9jbG9uZUFycmF5QnVmZmVyKGRhdGFWaWV3LmJ1ZmZlcikgOiBkYXRhVmlldy5idWZmZXI7CiAgICAgIHJldHVybiBuZXcgZGF0YVZpZXcuY29uc3RydWN0b3IoYnVmZmVyLCBkYXRhVmlldy5ieXRlT2Zmc2V0LCBkYXRhVmlldy5ieXRlTGVuZ3RoKTsKICAgIH0KCiAgICB2YXIgX2Nsb25lRGF0YVZpZXcgPSBjbG9uZURhdGFWaWV3OwoKICAgIC8qKiBVc2VkIHRvIG1hdGNoIGBSZWdFeHBgIGZsYWdzIGZyb20gdGhlaXIgY29lcmNlZCBzdHJpbmcgdmFsdWVzLiAqLwogICAgdmFyIHJlRmxhZ3MgPSAvXHcqJC87CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgY2xvbmUgb2YgYHJlZ2V4cGAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSByZWdleHAgVGhlIHJlZ2V4cCB0byBjbG9uZS4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGNsb25lZCByZWdleHAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsb25lUmVnRXhwKHJlZ2V4cCkgewogICAgICB2YXIgcmVzdWx0ID0gbmV3IHJlZ2V4cC5jb25zdHJ1Y3RvcihyZWdleHAuc291cmNlLCByZUZsYWdzLmV4ZWMocmVnZXhwKSk7CiAgICAgIHJlc3VsdC5sYXN0SW5kZXggPSByZWdleHAubGFzdEluZGV4OwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfY2xvbmVSZWdFeHAgPSBjbG9uZVJlZ0V4cDsKCiAgICAvKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi8KICAgIHZhciBzeW1ib2xQcm90byA9IF9TeW1ib2wgPyBfU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCwKICAgICAgICBzeW1ib2xWYWx1ZU9mID0gc3ltYm9sUHJvdG8gPyBzeW1ib2xQcm90by52YWx1ZU9mIDogdW5kZWZpbmVkOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGNsb25lIG9mIHRoZSBgc3ltYm9sYCBvYmplY3QuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzeW1ib2wgVGhlIHN5bWJvbCBvYmplY3QgdG8gY2xvbmUuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgc3ltYm9sIG9iamVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmVTeW1ib2woc3ltYm9sKSB7CiAgICAgIHJldHVybiBzeW1ib2xWYWx1ZU9mID8gT2JqZWN0KHN5bWJvbFZhbHVlT2YuY2FsbChzeW1ib2wpKSA6IHt9OwogICAgfQoKICAgIHZhciBfY2xvbmVTeW1ib2wgPSBjbG9uZVN5bWJvbDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBjbG9uZSBvZiBgdHlwZWRBcnJheWAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSB0eXBlZEFycmF5IFRoZSB0eXBlZCBhcnJheSB0byBjbG9uZS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzRGVlcF0gU3BlY2lmeSBhIGRlZXAgY2xvbmUuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBjbG9uZWQgdHlwZWQgYXJyYXkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsb25lVHlwZWRBcnJheSh0eXBlZEFycmF5LCBpc0RlZXApIHsKICAgICAgdmFyIGJ1ZmZlciA9IGlzRGVlcCA/IF9jbG9uZUFycmF5QnVmZmVyKHR5cGVkQXJyYXkuYnVmZmVyKSA6IHR5cGVkQXJyYXkuYnVmZmVyOwogICAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkuY29uc3RydWN0b3IoYnVmZmVyLCB0eXBlZEFycmF5LmJ5dGVPZmZzZXQsIHR5cGVkQXJyYXkubGVuZ3RoKTsKICAgIH0KCiAgICB2YXIgX2Nsb25lVHlwZWRBcnJheSA9IGNsb25lVHlwZWRBcnJheTsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgYm9vbFRhZyQxID0gJ1tvYmplY3QgQm9vbGVhbl0nLAogICAgICAgIGRhdGVUYWckMSA9ICdbb2JqZWN0IERhdGVdJywKICAgICAgICBtYXBUYWckMiA9ICdbb2JqZWN0IE1hcF0nLAogICAgICAgIG51bWJlclRhZyQxID0gJ1tvYmplY3QgTnVtYmVyXScsCiAgICAgICAgcmVnZXhwVGFnJDEgPSAnW29iamVjdCBSZWdFeHBdJywKICAgICAgICBzZXRUYWckMiA9ICdbb2JqZWN0IFNldF0nLAogICAgICAgIHN0cmluZ1RhZyQxID0gJ1tvYmplY3QgU3RyaW5nXScsCiAgICAgICAgc3ltYm9sVGFnID0gJ1tvYmplY3QgU3ltYm9sXSc7CgogICAgdmFyIGFycmF5QnVmZmVyVGFnJDEgPSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nLAogICAgICAgIGRhdGFWaWV3VGFnJDIgPSAnW29iamVjdCBEYXRhVmlld10nLAogICAgICAgIGZsb2F0MzJUYWckMSA9ICdbb2JqZWN0IEZsb2F0MzJBcnJheV0nLAogICAgICAgIGZsb2F0NjRUYWckMSA9ICdbb2JqZWN0IEZsb2F0NjRBcnJheV0nLAogICAgICAgIGludDhUYWckMSA9ICdbb2JqZWN0IEludDhBcnJheV0nLAogICAgICAgIGludDE2VGFnJDEgPSAnW29iamVjdCBJbnQxNkFycmF5XScsCiAgICAgICAgaW50MzJUYWckMSA9ICdbb2JqZWN0IEludDMyQXJyYXldJywKICAgICAgICB1aW50OFRhZyQxID0gJ1tvYmplY3QgVWludDhBcnJheV0nLAogICAgICAgIHVpbnQ4Q2xhbXBlZFRhZyQxID0gJ1tvYmplY3QgVWludDhDbGFtcGVkQXJyYXldJywKICAgICAgICB1aW50MTZUYWckMSA9ICdbb2JqZWN0IFVpbnQxNkFycmF5XScsCiAgICAgICAgdWludDMyVGFnJDEgPSAnW29iamVjdCBVaW50MzJBcnJheV0nOwoKICAgIC8qKgogICAgICogSW5pdGlhbGl6ZXMgYW4gb2JqZWN0IGNsb25lIGJhc2VkIG9uIGl0cyBgdG9TdHJpbmdUYWdgLgogICAgICoKICAgICAqICoqTm90ZToqKiBUaGlzIGZ1bmN0aW9uIG9ubHkgc3VwcG9ydHMgY2xvbmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mCiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE1hcGAsIGBOdW1iZXJgLCBgUmVnRXhwYCwgYFNldGAsIG9yIGBTdHJpbmdgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gY2xvbmUuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIFRoZSBgdG9TdHJpbmdUYWdgIG9mIHRoZSBvYmplY3QgdG8gY2xvbmUuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtpc0RlZXBdIFNwZWNpZnkgYSBkZWVwIGNsb25lLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgaW5pdGlhbGl6ZWQgY2xvbmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGluaXRDbG9uZUJ5VGFnKG9iamVjdCwgdGFnLCBpc0RlZXApIHsKICAgICAgdmFyIEN0b3IgPSBvYmplY3QuY29uc3RydWN0b3I7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSBhcnJheUJ1ZmZlclRhZyQxOgogICAgICAgICAgcmV0dXJuIF9jbG9uZUFycmF5QnVmZmVyKG9iamVjdCk7CgogICAgICAgIGNhc2UgYm9vbFRhZyQxOgogICAgICAgIGNhc2UgZGF0ZVRhZyQxOgogICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKCtvYmplY3QpOwoKICAgICAgICBjYXNlIGRhdGFWaWV3VGFnJDI6CiAgICAgICAgICByZXR1cm4gX2Nsb25lRGF0YVZpZXcob2JqZWN0LCBpc0RlZXApOwoKICAgICAgICBjYXNlIGZsb2F0MzJUYWckMTogY2FzZSBmbG9hdDY0VGFnJDE6CiAgICAgICAgY2FzZSBpbnQ4VGFnJDE6IGNhc2UgaW50MTZUYWckMTogY2FzZSBpbnQzMlRhZyQxOgogICAgICAgIGNhc2UgdWludDhUYWckMTogY2FzZSB1aW50OENsYW1wZWRUYWckMTogY2FzZSB1aW50MTZUYWckMTogY2FzZSB1aW50MzJUYWckMToKICAgICAgICAgIHJldHVybiBfY2xvbmVUeXBlZEFycmF5KG9iamVjdCwgaXNEZWVwKTsKCiAgICAgICAgY2FzZSBtYXBUYWckMjoKICAgICAgICAgIHJldHVybiBuZXcgQ3RvcjsKCiAgICAgICAgY2FzZSBudW1iZXJUYWckMToKICAgICAgICBjYXNlIHN0cmluZ1RhZyQxOgogICAgICAgICAgcmV0dXJuIG5ldyBDdG9yKG9iamVjdCk7CgogICAgICAgIGNhc2UgcmVnZXhwVGFnJDE6CiAgICAgICAgICByZXR1cm4gX2Nsb25lUmVnRXhwKG9iamVjdCk7CgogICAgICAgIGNhc2Ugc2V0VGFnJDI6CiAgICAgICAgICByZXR1cm4gbmV3IEN0b3I7CgogICAgICAgIGNhc2Ugc3ltYm9sVGFnOgogICAgICAgICAgcmV0dXJuIF9jbG9uZVN5bWJvbChvYmplY3QpOwogICAgICB9CiAgICB9CgogICAgdmFyIF9pbml0Q2xvbmVCeVRhZyA9IGluaXRDbG9uZUJ5VGFnOwoKICAgIC8qKiBCdWlsdC1pbiB2YWx1ZSByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdENyZWF0ZSA9IE9iamVjdC5jcmVhdGU7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5jcmVhdGVgIHdpdGhvdXQgc3VwcG9ydCBmb3IgYXNzaWduaW5nCiAgICAgKiBwcm9wZXJ0aWVzIHRvIHRoZSBjcmVhdGVkIG9iamVjdC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IHByb3RvIFRoZSBvYmplY3QgdG8gaW5oZXJpdCBmcm9tLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgbmV3IG9iamVjdC4KICAgICAqLwogICAgdmFyIGJhc2VDcmVhdGUgPSAoZnVuY3Rpb24oKSB7CiAgICAgIGZ1bmN0aW9uIG9iamVjdCgpIHt9CiAgICAgIHJldHVybiBmdW5jdGlvbihwcm90bykgewogICAgICAgIGlmICghaXNPYmplY3RfMShwcm90bykpIHsKICAgICAgICAgIHJldHVybiB7fTsKICAgICAgICB9CiAgICAgICAgaWYgKG9iamVjdENyZWF0ZSkgewogICAgICAgICAgcmV0dXJuIG9iamVjdENyZWF0ZShwcm90byk7CiAgICAgICAgfQogICAgICAgIG9iamVjdC5wcm90b3R5cGUgPSBwcm90bzsKICAgICAgICB2YXIgcmVzdWx0ID0gbmV3IG9iamVjdDsKICAgICAgICBvYmplY3QucHJvdG90eXBlID0gdW5kZWZpbmVkOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH07CiAgICB9KCkpOwoKICAgIHZhciBfYmFzZUNyZWF0ZSA9IGJhc2VDcmVhdGU7CgogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBhbiBvYmplY3QgY2xvbmUuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjbG9uZS4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIGluaXRpYWxpemVkIGNsb25lLgogICAgICovCiAgICBmdW5jdGlvbiBpbml0Q2xvbmVPYmplY3Qob2JqZWN0KSB7CiAgICAgIHJldHVybiAodHlwZW9mIG9iamVjdC5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmICFfaXNQcm90b3R5cGUob2JqZWN0KSkKICAgICAgICA/IF9iYXNlQ3JlYXRlKF9nZXRQcm90b3R5cGUob2JqZWN0KSkKICAgICAgICA6IHt9OwogICAgfQoKICAgIHZhciBfaW5pdENsb25lT2JqZWN0ID0gaW5pdENsb25lT2JqZWN0OwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBtYXBUYWckMyA9ICdbb2JqZWN0IE1hcF0nOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNNYXBgIHdpdGhvdXQgTm9kZS5qcyBvcHRpbWl6YXRpb25zLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgbWFwLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJc01hcCh2YWx1ZSkgewogICAgICByZXR1cm4gaXNPYmplY3RMaWtlXzEodmFsdWUpICYmIF9nZXRUYWcodmFsdWUpID09IG1hcFRhZyQzOwogICAgfQoKICAgIHZhciBfYmFzZUlzTWFwID0gYmFzZUlzTWFwOwoKICAgIC8qIE5vZGUuanMgaGVscGVyIHJlZmVyZW5jZXMuICovCiAgICB2YXIgbm9kZUlzTWFwID0gX25vZGVVdGlsICYmIF9ub2RlVXRpbC5pc01hcDsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgTWFwYCBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSA0LjMuMAogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBtYXAsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc01hcChuZXcgTWFwKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzTWFwKG5ldyBXZWFrTWFwKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKi8KICAgIHZhciBpc01hcCA9IG5vZGVJc01hcCA/IF9iYXNlVW5hcnkobm9kZUlzTWFwKSA6IF9iYXNlSXNNYXA7CgogICAgdmFyIGlzTWFwXzEgPSBpc01hcDsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgc2V0VGFnJDMgPSAnW29iamVjdCBTZXRdJzsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmlzU2V0YCB3aXRob3V0IE5vZGUuanMgb3B0aW1pemF0aW9ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHNldCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlSXNTZXQodmFsdWUpIHsKICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZV8xKHZhbHVlKSAmJiBfZ2V0VGFnKHZhbHVlKSA9PSBzZXRUYWckMzsKICAgIH0KCiAgICB2YXIgX2Jhc2VJc1NldCA9IGJhc2VJc1NldDsKCiAgICAvKiBOb2RlLmpzIGhlbHBlciByZWZlcmVuY2VzLiAqLwogICAgdmFyIG5vZGVJc1NldCA9IF9ub2RlVXRpbCAmJiBfbm9kZVV0aWwuaXNTZXQ7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBjbGFzc2lmaWVkIGFzIGEgYFNldGAgb2JqZWN0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgNC4zLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc2V0LCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNTZXQobmV3IFNldCk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc1NldChuZXcgV2Vha1NldCk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICB2YXIgaXNTZXQgPSBub2RlSXNTZXQgPyBfYmFzZVVuYXJ5KG5vZGVJc1NldCkgOiBfYmFzZUlzU2V0OwoKICAgIHZhciBpc1NldF8xID0gaXNTZXQ7CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgY2xvbmluZy4gKi8KICAgIHZhciBDTE9ORV9ERUVQX0ZMQUcgPSAxLAogICAgICAgIENMT05FX0ZMQVRfRkxBRyA9IDIsCiAgICAgICAgQ0xPTkVfU1lNQk9MU19GTEFHID0gNDsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgYXJnc1RhZyQyID0gJ1tvYmplY3QgQXJndW1lbnRzXScsCiAgICAgICAgYXJyYXlUYWckMSA9ICdbb2JqZWN0IEFycmF5XScsCiAgICAgICAgYm9vbFRhZyQyID0gJ1tvYmplY3QgQm9vbGVhbl0nLAogICAgICAgIGRhdGVUYWckMiA9ICdbb2JqZWN0IERhdGVdJywKICAgICAgICBlcnJvclRhZyQxID0gJ1tvYmplY3QgRXJyb3JdJywKICAgICAgICBmdW5jVGFnJDIgPSAnW29iamVjdCBGdW5jdGlvbl0nLAogICAgICAgIGdlblRhZyQxID0gJ1tvYmplY3QgR2VuZXJhdG9yRnVuY3Rpb25dJywKICAgICAgICBtYXBUYWckNCA9ICdbb2JqZWN0IE1hcF0nLAogICAgICAgIG51bWJlclRhZyQyID0gJ1tvYmplY3QgTnVtYmVyXScsCiAgICAgICAgb2JqZWN0VGFnJDIgPSAnW29iamVjdCBPYmplY3RdJywKICAgICAgICByZWdleHBUYWckMiA9ICdbb2JqZWN0IFJlZ0V4cF0nLAogICAgICAgIHNldFRhZyQ0ID0gJ1tvYmplY3QgU2V0XScsCiAgICAgICAgc3RyaW5nVGFnJDIgPSAnW29iamVjdCBTdHJpbmddJywKICAgICAgICBzeW1ib2xUYWckMSA9ICdbb2JqZWN0IFN5bWJvbF0nLAogICAgICAgIHdlYWtNYXBUYWckMiA9ICdbb2JqZWN0IFdlYWtNYXBdJzsKCiAgICB2YXIgYXJyYXlCdWZmZXJUYWckMiA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsCiAgICAgICAgZGF0YVZpZXdUYWckMyA9ICdbb2JqZWN0IERhdGFWaWV3XScsCiAgICAgICAgZmxvYXQzMlRhZyQyID0gJ1tvYmplY3QgRmxvYXQzMkFycmF5XScsCiAgICAgICAgZmxvYXQ2NFRhZyQyID0gJ1tvYmplY3QgRmxvYXQ2NEFycmF5XScsCiAgICAgICAgaW50OFRhZyQyID0gJ1tvYmplY3QgSW50OEFycmF5XScsCiAgICAgICAgaW50MTZUYWckMiA9ICdbb2JqZWN0IEludDE2QXJyYXldJywKICAgICAgICBpbnQzMlRhZyQyID0gJ1tvYmplY3QgSW50MzJBcnJheV0nLAogICAgICAgIHVpbnQ4VGFnJDIgPSAnW29iamVjdCBVaW50OEFycmF5XScsCiAgICAgICAgdWludDhDbGFtcGVkVGFnJDIgPSAnW29iamVjdCBVaW50OENsYW1wZWRBcnJheV0nLAogICAgICAgIHVpbnQxNlRhZyQyID0gJ1tvYmplY3QgVWludDE2QXJyYXldJywKICAgICAgICB1aW50MzJUYWckMiA9ICdbb2JqZWN0IFVpbnQzMkFycmF5XSc7CgogICAgLyoqIFVzZWQgdG8gaWRlbnRpZnkgYHRvU3RyaW5nVGFnYCB2YWx1ZXMgc3VwcG9ydGVkIGJ5IGBfLmNsb25lYC4gKi8KICAgIHZhciBjbG9uZWFibGVUYWdzID0ge307CiAgICBjbG9uZWFibGVUYWdzW2FyZ3NUYWckMl0gPSBjbG9uZWFibGVUYWdzW2FycmF5VGFnJDFdID0KICAgIGNsb25lYWJsZVRhZ3NbYXJyYXlCdWZmZXJUYWckMl0gPSBjbG9uZWFibGVUYWdzW2RhdGFWaWV3VGFnJDNdID0KICAgIGNsb25lYWJsZVRhZ3NbYm9vbFRhZyQyXSA9IGNsb25lYWJsZVRhZ3NbZGF0ZVRhZyQyXSA9CiAgICBjbG9uZWFibGVUYWdzW2Zsb2F0MzJUYWckMl0gPSBjbG9uZWFibGVUYWdzW2Zsb2F0NjRUYWckMl0gPQogICAgY2xvbmVhYmxlVGFnc1tpbnQ4VGFnJDJdID0gY2xvbmVhYmxlVGFnc1tpbnQxNlRhZyQyXSA9CiAgICBjbG9uZWFibGVUYWdzW2ludDMyVGFnJDJdID0gY2xvbmVhYmxlVGFnc1ttYXBUYWckNF0gPQogICAgY2xvbmVhYmxlVGFnc1tudW1iZXJUYWckMl0gPSBjbG9uZWFibGVUYWdzW29iamVjdFRhZyQyXSA9CiAgICBjbG9uZWFibGVUYWdzW3JlZ2V4cFRhZyQyXSA9IGNsb25lYWJsZVRhZ3Nbc2V0VGFnJDRdID0KICAgIGNsb25lYWJsZVRhZ3Nbc3RyaW5nVGFnJDJdID0gY2xvbmVhYmxlVGFnc1tzeW1ib2xUYWckMV0gPQogICAgY2xvbmVhYmxlVGFnc1t1aW50OFRhZyQyXSA9IGNsb25lYWJsZVRhZ3NbdWludDhDbGFtcGVkVGFnJDJdID0KICAgIGNsb25lYWJsZVRhZ3NbdWludDE2VGFnJDJdID0gY2xvbmVhYmxlVGFnc1t1aW50MzJUYWckMl0gPSB0cnVlOwogICAgY2xvbmVhYmxlVGFnc1tlcnJvclRhZyQxXSA9IGNsb25lYWJsZVRhZ3NbZnVuY1RhZyQyXSA9CiAgICBjbG9uZWFibGVUYWdzW3dlYWtNYXBUYWckMl0gPSBmYWxzZTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmNsb25lYCBhbmQgYF8uY2xvbmVEZWVwYCB3aGljaCB0cmFja3MKICAgICAqIHRyYXZlcnNlZCBvYmplY3RzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjbG9uZS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4KICAgICAqICAxIC0gRGVlcCBjbG9uZQogICAgICogIDIgLSBGbGF0dGVuIGluaGVyaXRlZCBwcm9wZXJ0aWVzCiAgICAgKiAgNCAtIENsb25lIHN5bWJvbHMKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNsb25pbmcuCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gW2tleV0gVGhlIGtleSBvZiBgdmFsdWVgLgogICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBwYXJlbnQgb2JqZWN0IG9mIGB2YWx1ZWAuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIG9iamVjdHMgYW5kIHRoZWlyIGNsb25lIGNvdW50ZXJwYXJ0cy4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBjbG9uZWQgdmFsdWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VDbG9uZSh2YWx1ZSwgYml0bWFzaywgY3VzdG9taXplciwga2V5LCBvYmplY3QsIHN0YWNrKSB7CiAgICAgIHZhciByZXN1bHQsCiAgICAgICAgICBpc0RlZXAgPSBiaXRtYXNrICYgQ0xPTkVfREVFUF9GTEFHLAogICAgICAgICAgaXNGbGF0ID0gYml0bWFzayAmIENMT05FX0ZMQVRfRkxBRywKICAgICAgICAgIGlzRnVsbCA9IGJpdG1hc2sgJiBDTE9ORV9TWU1CT0xTX0ZMQUc7CgogICAgICBpZiAoY3VzdG9taXplcikgewogICAgICAgIHJlc3VsdCA9IG9iamVjdCA/IGN1c3RvbWl6ZXIodmFsdWUsIGtleSwgb2JqZWN0LCBzdGFjaykgOiBjdXN0b21pemVyKHZhbHVlKTsKICAgICAgfQogICAgICBpZiAocmVzdWx0ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CiAgICAgIGlmICghaXNPYmplY3RfMSh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH0KICAgICAgdmFyIGlzQXJyID0gaXNBcnJheV8xKHZhbHVlKTsKICAgICAgaWYgKGlzQXJyKSB7CiAgICAgICAgcmVzdWx0ID0gX2luaXRDbG9uZUFycmF5KHZhbHVlKTsKICAgICAgICBpZiAoIWlzRGVlcCkgewogICAgICAgICAgcmV0dXJuIF9jb3B5QXJyYXkodmFsdWUsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICB9IGVsc2UgewogICAgICAgIHZhciB0YWcgPSBfZ2V0VGFnKHZhbHVlKSwKICAgICAgICAgICAgaXNGdW5jID0gdGFnID09IGZ1bmNUYWckMiB8fCB0YWcgPT0gZ2VuVGFnJDE7CgogICAgICAgIGlmIChpc0J1ZmZlcl8xKHZhbHVlKSkgewogICAgICAgICAgcmV0dXJuIF9jbG9uZUJ1ZmZlcih2YWx1ZSwgaXNEZWVwKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRhZyA9PSBvYmplY3RUYWckMiB8fCB0YWcgPT0gYXJnc1RhZyQyIHx8IChpc0Z1bmMgJiYgIW9iamVjdCkpIHsKICAgICAgICAgIHJlc3VsdCA9IChpc0ZsYXQgfHwgaXNGdW5jKSA/IHt9IDogX2luaXRDbG9uZU9iamVjdCh2YWx1ZSk7CiAgICAgICAgICBpZiAoIWlzRGVlcCkgewogICAgICAgICAgICByZXR1cm4gaXNGbGF0CiAgICAgICAgICAgICAgPyBfY29weVN5bWJvbHNJbih2YWx1ZSwgX2Jhc2VBc3NpZ25JbihyZXN1bHQsIHZhbHVlKSkKICAgICAgICAgICAgICA6IF9jb3B5U3ltYm9scyh2YWx1ZSwgX2Jhc2VBc3NpZ24ocmVzdWx0LCB2YWx1ZSkpOwogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAoIWNsb25lYWJsZVRhZ3NbdGFnXSkgewogICAgICAgICAgICByZXR1cm4gb2JqZWN0ID8gdmFsdWUgOiB7fTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdCA9IF9pbml0Q2xvbmVCeVRhZyh2YWx1ZSwgdGFnLCBpc0RlZXApOwogICAgICAgIH0KICAgICAgfQogICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgcmVmZXJlbmNlcyBhbmQgcmV0dXJuIGl0cyBjb3JyZXNwb25kaW5nIGNsb25lLgogICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgX1N0YWNrKTsKICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQodmFsdWUpOwogICAgICBpZiAoc3RhY2tlZCkgewogICAgICAgIHJldHVybiBzdGFja2VkOwogICAgICB9CiAgICAgIHN0YWNrLnNldCh2YWx1ZSwgcmVzdWx0KTsKCiAgICAgIGlmIChpc1NldF8xKHZhbHVlKSkgewogICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24oc3ViVmFsdWUpIHsKICAgICAgICAgIHJlc3VsdC5hZGQoYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdWJWYWx1ZSwgdmFsdWUsIHN0YWNrKSk7CiAgICAgICAgfSk7CiAgICAgIH0gZWxzZSBpZiAoaXNNYXBfMSh2YWx1ZSkpIHsKICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHsKICAgICAgICAgIHJlc3VsdC5zZXQoa2V5LCBiYXNlQ2xvbmUoc3ViVmFsdWUsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGtleSwgdmFsdWUsIHN0YWNrKSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHZhciBrZXlzRnVuYyA9IGlzRnVsbAogICAgICAgID8gKGlzRmxhdCA/IF9nZXRBbGxLZXlzSW4gOiBfZ2V0QWxsS2V5cykKICAgICAgICA6IChpc0ZsYXQgPyBrZXlzSW4gOiBrZXlzXzEpOwoKICAgICAgdmFyIHByb3BzID0gaXNBcnIgPyB1bmRlZmluZWQgOiBrZXlzRnVuYyh2YWx1ZSk7CiAgICAgIF9hcnJheUVhY2gocHJvcHMgfHwgdmFsdWUsIGZ1bmN0aW9uKHN1YlZhbHVlLCBrZXkpIHsKICAgICAgICBpZiAocHJvcHMpIHsKICAgICAgICAgIGtleSA9IHN1YlZhbHVlOwogICAgICAgICAgc3ViVmFsdWUgPSB2YWx1ZVtrZXldOwogICAgICAgIH0KICAgICAgICAvLyBSZWN1cnNpdmVseSBwb3B1bGF0ZSBjbG9uZSAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLgogICAgICAgIF9hc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgYmFzZUNsb25lKHN1YlZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBrZXksIHZhbHVlLCBzdGFjaykpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2Jhc2VDbG9uZSA9IGJhc2VDbG9uZTsKCiAgICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqLwogICAgdmFyIENMT05FX1NZTUJPTFNfRkxBRyQxID0gNDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBzaGFsbG93IGNsb25lIG9mIGB2YWx1ZWAuCiAgICAgKgogICAgICogKipOb3RlOioqIFRoaXMgbWV0aG9kIGlzIGxvb3NlbHkgYmFzZWQgb24gdGhlCiAgICAgKiBbc3RydWN0dXJlZCBjbG9uZSBhbGdvcml0aG1dKGh0dHBzOi8vbWRuLmlvL1N0cnVjdHVyZWRfY2xvbmVfYWxnb3JpdGhtKQogICAgICogYW5kIHN1cHBvcnRzIGNsb25pbmcgYXJyYXlzLCBhcnJheSBidWZmZXJzLCBib29sZWFucywgZGF0ZSBvYmplY3RzLCBtYXBzLAogICAgICogbnVtYmVycywgYE9iamVjdGAgb2JqZWN0cywgcmVnZXhlcywgc2V0cywgc3RyaW5ncywgc3ltYm9scywgYW5kIHR5cGVkCiAgICAgKiBhcnJheXMuIFRoZSBvd24gZW51bWVyYWJsZSBwcm9wZXJ0aWVzIG9mIGBhcmd1bWVudHNgIG9iamVjdHMgYXJlIGNsb25lZAogICAgICogYXMgcGxhaW4gb2JqZWN0cy4gQW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkIGZvciB1bmNsb25lYWJsZSB2YWx1ZXMgc3VjaAogICAgICogYXMgZXJyb3Igb2JqZWN0cywgZnVuY3Rpb25zLCBET00gbm9kZXMsIGFuZCBXZWFrTWFwcy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2xvbmUuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgY2xvbmVkIHZhbHVlLgogICAgICogQHNlZSBfLmNsb25lRGVlcAogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICdhJzogMSB9LCB7ICdiJzogMiB9XTsKICAgICAqCiAgICAgKiB2YXIgc2hhbGxvdyA9IF8uY2xvbmUob2JqZWN0cyk7CiAgICAgKiBjb25zb2xlLmxvZyhzaGFsbG93WzBdID09PSBvYmplY3RzWzBdKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmUodmFsdWUpIHsKICAgICAgcmV0dXJuIF9iYXNlQ2xvbmUodmFsdWUsIENMT05FX1NZTUJPTFNfRkxBRyQxKTsKICAgIH0KCiAgICB2YXIgY2xvbmVfMSA9IGNsb25lOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBgdmFsdWVgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMi40LjAKICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gZnJvbSB0aGUgbmV3IGZ1bmN0aW9uLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgY29uc3RhbnQgZnVuY3Rpb24uCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3RzID0gXy50aW1lcygyLCBfLmNvbnN0YW50KHsgJ2EnOiAxIH0pKTsKICAgICAqCiAgICAgKiBjb25zb2xlLmxvZyhvYmplY3RzKTsKICAgICAqIC8vID0+IFt7ICdhJzogMSB9LCB7ICdhJzogMSB9XQogICAgICoKICAgICAqIGNvbnNvbGUubG9nKG9iamVjdHNbMF0gPT09IG9iamVjdHNbMV0pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBjb25zdGFudCR6KHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGNvbnN0YW50XzEgPSBjb25zdGFudCR6OwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIGJhc2UgZnVuY3Rpb24gZm9yIG1ldGhvZHMgbGlrZSBgXy5mb3JJbmAgYW5kIGBfLmZvck93bmAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgYmFzZSBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlQmFzZUZvcihmcm9tUmlnaHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCwgaXRlcmF0ZWUsIGtleXNGdW5jKSB7CiAgICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGl0ZXJhYmxlID0gT2JqZWN0KG9iamVjdCksCiAgICAgICAgICAgIHByb3BzID0ga2V5c0Z1bmMob2JqZWN0KSwKICAgICAgICAgICAgbGVuZ3RoID0gcHJvcHMubGVuZ3RoOwoKICAgICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1tmcm9tUmlnaHQgPyBsZW5ndGggOiArK2luZGV4XTsKICAgICAgICAgIGlmIChpdGVyYXRlZShpdGVyYWJsZVtrZXldLCBrZXksIGl0ZXJhYmxlKSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9jcmVhdGVCYXNlRm9yID0gY3JlYXRlQmFzZUZvcjsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBiYXNlRm9yT3duYCB3aGljaCBpdGVyYXRlcyBvdmVyIGBvYmplY3RgCiAgICAgKiBwcm9wZXJ0aWVzIHJldHVybmVkIGJ5IGBrZXlzRnVuY2AgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4KICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBrZXlzRnVuYyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXlzIG9mIGBvYmplY3RgLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyBgb2JqZWN0YC4KICAgICAqLwogICAgdmFyIGJhc2VGb3IgPSBfY3JlYXRlQmFzZUZvcigpOwoKICAgIHZhciBfYmFzZUZvciA9IGJhc2VGb3I7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5mb3JPd25gIHdpdGhvdXQgc3VwcG9ydCBmb3IgaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlRm9yT3duKG9iamVjdCwgaXRlcmF0ZWUpIHsKICAgICAgcmV0dXJuIG9iamVjdCAmJiBfYmFzZUZvcihvYmplY3QsIGl0ZXJhdGVlLCBrZXlzXzEpOwogICAgfQoKICAgIHZhciBfYmFzZUZvck93biA9IGJhc2VGb3JPd247CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYGJhc2VFYWNoYCBvciBgYmFzZUVhY2hSaWdodGAgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVhY2hGdW5jIFRoZSBmdW5jdGlvbiB0byBpdGVyYXRlIG92ZXIgYSBjb2xsZWN0aW9uLgogICAgICogQHBhcmFtIHtib29sZWFufSBbZnJvbVJpZ2h0XSBTcGVjaWZ5IGl0ZXJhdGluZyBmcm9tIHJpZ2h0IHRvIGxlZnQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBiYXNlIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVCYXNlRWFjaChlYWNoRnVuYywgZnJvbVJpZ2h0KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xsZWN0aW9uLCBpdGVyYXRlZSkgewogICAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKICAgICAgICAgIHJldHVybiBjb2xsZWN0aW9uOwogICAgICAgIH0KICAgICAgICBpZiAoIWlzQXJyYXlMaWtlXzEoY29sbGVjdGlvbikpIHsKICAgICAgICAgIHJldHVybiBlYWNoRnVuYyhjb2xsZWN0aW9uLCBpdGVyYXRlZSk7CiAgICAgICAgfQogICAgICAgIHZhciBsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aCwKICAgICAgICAgICAgaW5kZXggPSBmcm9tUmlnaHQgPyBsZW5ndGggOiAtMSwKICAgICAgICAgICAgaXRlcmFibGUgPSBPYmplY3QoY29sbGVjdGlvbik7CgogICAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7CiAgICAgICAgICBpZiAoaXRlcmF0ZWUoaXRlcmFibGVbaW5kZXhdLCBpbmRleCwgaXRlcmFibGUpID09PSBmYWxzZSkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb247CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9jcmVhdGVCYXNlRWFjaCA9IGNyZWF0ZUJhc2VFYWNoOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZm9yRWFjaGAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuCiAgICAgKi8KICAgIHZhciBiYXNlRWFjaCA9IF9jcmVhdGVCYXNlRWFjaChfYmFzZUZvck93bik7CgogICAgdmFyIF9iYXNlRWFjaCA9IGJhc2VFYWNoOwoKICAgIC8qKgogICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQgaXQgcmVjZWl2ZXMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgQW55IHZhbHVlLgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgYHZhbHVlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxIH07CiAgICAgKgogICAgICogY29uc29sZS5sb2coXy5pZGVudGl0eShvYmplY3QpID09PSBvYmplY3QpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpZGVudGl0eSRuKHZhbHVlKSB7CiAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICB2YXIgaWRlbnRpdHlfMSA9IGlkZW50aXR5JG47CgogICAgLyoqCiAgICAgKiBDYXN0cyBgdmFsdWVgIHRvIGBpZGVudGl0eWAgaWYgaXQncyBub3QgYSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBjYXN0IGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjYXN0RnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nID8gdmFsdWUgOiBpZGVudGl0eV8xOwogICAgfQoKICAgIHZhciBfY2FzdEZ1bmN0aW9uID0gY2FzdEZ1bmN0aW9uOwoKICAgIC8qKgogICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBlbGVtZW50LgogICAgICogVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQgd2l0aCB0aHJlZSBhcmd1bWVudHM6ICh2YWx1ZSwgaW5kZXh8a2V5LCBjb2xsZWN0aW9uKS4KICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogQXMgd2l0aCBvdGhlciAiQ29sbGVjdGlvbnMiIG1ldGhvZHMsIG9iamVjdHMgd2l0aCBhICJsZW5ndGgiCiAgICAgKiBwcm9wZXJ0eSBhcmUgaXRlcmF0ZWQgbGlrZSBhcnJheXMuIFRvIGF2b2lkIHRoaXMgYmVoYXZpb3IgdXNlIGBfLmZvckluYAogICAgICogb3IgYF8uZm9yT3duYCBmb3Igb2JqZWN0IGl0ZXJhdGlvbi4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAYWxpYXMgZWFjaAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHJldHVybnMge0FycmF5fE9iamVjdH0gUmV0dXJucyBgY29sbGVjdGlvbmAuCiAgICAgKiBAc2VlIF8uZm9yRWFjaFJpZ2h0CiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZm9yRWFjaChbMSwgMl0sIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgKiAgIGNvbnNvbGUubG9nKHZhbHVlKTsKICAgICAqIH0pOwogICAgICogLy8gPT4gTG9ncyBgMWAgdGhlbiBgMmAuCiAgICAgKgogICAgICogXy5mb3JFYWNoKHsgJ2EnOiAxLCAnYic6IDIgfSwgZnVuY3Rpb24odmFsdWUsIGtleSkgewogICAgICogICBjb25zb2xlLmxvZyhrZXkpOwogICAgICogfSk7CiAgICAgKiAvLyA9PiBMb2dzICdhJyB0aGVuICdiJyAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKS4KICAgICAqLwogICAgZnVuY3Rpb24gZm9yRWFjaChjb2xsZWN0aW9uLCBpdGVyYXRlZSkgewogICAgICB2YXIgZnVuYyA9IGlzQXJyYXlfMShjb2xsZWN0aW9uKSA/IF9hcnJheUVhY2ggOiBfYmFzZUVhY2g7CiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIF9jYXN0RnVuY3Rpb24oaXRlcmF0ZWUpKTsKICAgIH0KCiAgICB2YXIgZm9yRWFjaF8xID0gZm9yRWFjaDsKCiAgICB2YXIgZWFjaCA9IGZvckVhY2hfMTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbHRlcmAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZpbHRlcmVkIGFycmF5LgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlRmlsdGVyKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSkgewogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIF9iYXNlRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHsKICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikpIHsKICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfYmFzZUZpbHRlciA9IGJhc2VGaWx0ZXI7CgogICAgLyoqIFVzZWQgdG8gc3RhbmQtaW4gZm9yIGB1bmRlZmluZWRgIGhhc2ggdmFsdWVzLiAqLwogICAgdmFyIEhBU0hfVU5ERUZJTkVEJDIgPSAnX19sb2Rhc2hfaGFzaF91bmRlZmluZWRfXyc7CgogICAgLyoqCiAgICAgKiBBZGRzIGB2YWx1ZWAgdG8gdGhlIGFycmF5IGNhY2hlLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBhZGQKICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZQogICAgICogQGFsaWFzIHB1c2gKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNhY2hlLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY2FjaGUgaW5zdGFuY2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldENhY2hlQWRkKHZhbHVlKSB7CiAgICAgIHRoaXMuX19kYXRhX18uc2V0KHZhbHVlLCBIQVNIX1VOREVGSU5FRCQyKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIF9zZXRDYWNoZUFkZCA9IHNldENhY2hlQWRkOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgaW4gdGhlIGFycmF5IGNhY2hlLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAbmFtZSBoYXMKICAgICAqIEBtZW1iZXJPZiBTZXRDYWNoZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gc2V0Q2FjaGVIYXModmFsdWUpIHsKICAgICAgcmV0dXJuIHRoaXMuX19kYXRhX18uaGFzKHZhbHVlKTsKICAgIH0KCiAgICB2YXIgX3NldENhY2hlSGFzID0gc2V0Q2FjaGVIYXM7CgogICAgLyoqCiAgICAgKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBjYWNoZSBvYmplY3QgdG8gc3RvcmUgdW5pcXVlIHZhbHVlcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQGNvbnN0cnVjdG9yCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbdmFsdWVzXSBUaGUgdmFsdWVzIHRvIGNhY2hlLgogICAgICovCiAgICBmdW5jdGlvbiBTZXRDYWNoZSh2YWx1ZXMpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSB2YWx1ZXMgPT0gbnVsbCA/IDAgOiB2YWx1ZXMubGVuZ3RoOwoKICAgICAgdGhpcy5fX2RhdGFfXyA9IG5ldyBfTWFwQ2FjaGU7CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdGhpcy5hZGQodmFsdWVzW2luZGV4XSk7CiAgICAgIH0KICAgIH0KCiAgICAvLyBBZGQgbWV0aG9kcyB0byBgU2V0Q2FjaGVgLgogICAgU2V0Q2FjaGUucHJvdG90eXBlLmFkZCA9IFNldENhY2hlLnByb3RvdHlwZS5wdXNoID0gX3NldENhY2hlQWRkOwogICAgU2V0Q2FjaGUucHJvdG90eXBlLmhhcyA9IF9zZXRDYWNoZUhhczsKCiAgICB2YXIgX1NldENhY2hlID0gU2V0Q2FjaGU7CgogICAgLyoqCiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYF8uc29tZWAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlCiAgICAgKiBzaG9ydGhhbmRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBwcmVkaWNhdGUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbnkgZWxlbWVudCBwYXNzZXMgdGhlIHByZWRpY2F0ZSBjaGVjaywKICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFycmF5U29tZShhcnJheSwgcHJlZGljYXRlKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIGlmIChwcmVkaWNhdGUoYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBfYXJyYXlTb21lID0gYXJyYXlTb21lOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGEgYGNhY2hlYCB2YWx1ZSBmb3IgYGtleWAgZXhpc3RzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgVGhlIGNhY2hlIHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBlbnRyeSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhbiBlbnRyeSBmb3IgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNhY2hlSGFzKGNhY2hlLCBrZXkpIHsKICAgICAgcmV0dXJuIGNhY2hlLmhhcyhrZXkpOwogICAgfQoKICAgIHZhciBfY2FjaGVIYXMgPSBjYWNoZUhhczsKCiAgICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciB2YWx1ZSBjb21wYXJpc29ucy4gKi8KICAgIHZhciBDT01QQVJFX1BBUlRJQUxfRkxBRyA9IDEsCiAgICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyA9IDI7CgogICAgLyoqCiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VJc0VxdWFsRGVlcGAgZm9yIGFycmF5cyB3aXRoIHN1cHBvcnQgZm9yCiAgICAgKiBwYXJ0aWFsIGRlZXAgY29tcGFyaXNvbnMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtBcnJheX0gb3RoZXIgVGhlIG90aGVyIGFycmF5IHRvIGNvbXBhcmUuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gYml0bWFzayBUaGUgYml0bWFzayBmbGFncy4gU2VlIGBiYXNlSXNFcXVhbGAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGN1c3RvbWl6ZXIgVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGVxdWFsRnVuYyBUaGUgZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGVxdWl2YWxlbnRzIG9mIHZhbHVlcy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBzdGFjayBUcmFja3MgdHJhdmVyc2VkIGBhcnJheWAgYW5kIGBvdGhlcmAgb2JqZWN0cy4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYXJyYXlzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVxdWFsQXJyYXlzKGFycmF5LCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjaykgewogICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHLAogICAgICAgICAgYXJyTGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgb3RoTGVuZ3RoID0gb3RoZXIubGVuZ3RoOwoKICAgICAgaWYgKGFyckxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIShpc1BhcnRpYWwgJiYgb3RoTGVuZ3RoID4gYXJyTGVuZ3RoKSkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICAvLyBBc3N1bWUgY3ljbGljIHZhbHVlcyBhcmUgZXF1YWwuCiAgICAgIHZhciBzdGFja2VkID0gc3RhY2suZ2V0KGFycmF5KTsKICAgICAgaWYgKHN0YWNrZWQgJiYgc3RhY2suZ2V0KG90aGVyKSkgewogICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyOwogICAgICB9CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgcmVzdWx0ID0gdHJ1ZSwKICAgICAgICAgIHNlZW4gPSAoYml0bWFzayAmIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUcpID8gbmV3IF9TZXRDYWNoZSA6IHVuZGVmaW5lZDsKCiAgICAgIHN0YWNrLnNldChhcnJheSwgb3RoZXIpOwogICAgICBzdGFjay5zZXQob3RoZXIsIGFycmF5KTsKCiAgICAgIC8vIElnbm9yZSBub24taW5kZXggcHJvcGVydGllcy4KICAgICAgd2hpbGUgKCsraW5kZXggPCBhcnJMZW5ndGgpIHsKICAgICAgICB2YXIgYXJyVmFsdWUgPSBhcnJheVtpbmRleF0sCiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJbaW5kZXhdOwoKICAgICAgICBpZiAoY3VzdG9taXplcikgewogICAgICAgICAgdmFyIGNvbXBhcmVkID0gaXNQYXJ0aWFsCiAgICAgICAgICAgID8gY3VzdG9taXplcihvdGhWYWx1ZSwgYXJyVmFsdWUsIGluZGV4LCBvdGhlciwgYXJyYXksIHN0YWNrKQogICAgICAgICAgICA6IGN1c3RvbWl6ZXIoYXJyVmFsdWUsIG90aFZhbHVlLCBpbmRleCwgYXJyYXksIG90aGVyLCBzdGFjayk7CiAgICAgICAgfQogICAgICAgIGlmIChjb21wYXJlZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICBpZiAoY29tcGFyZWQpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBSZWN1cnNpdmVseSBjb21wYXJlIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLgogICAgICAgIGlmIChzZWVuKSB7CiAgICAgICAgICBpZiAoIV9hcnJheVNvbWUob3RoZXIsIGZ1bmN0aW9uKG90aFZhbHVlLCBvdGhJbmRleCkgewogICAgICAgICAgICAgICAgaWYgKCFfY2FjaGVIYXMoc2Vlbiwgb3RoSW5kZXgpICYmCiAgICAgICAgICAgICAgICAgICAgKGFyclZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpKSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBzZWVuLnB1c2gob3RoSW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0pKSB7CiAgICAgICAgICAgIHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgaWYgKCEoCiAgICAgICAgICAgICAgYXJyVmFsdWUgPT09IG90aFZhbHVlIHx8CiAgICAgICAgICAgICAgICBlcXVhbEZ1bmMoYXJyVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykKICAgICAgICAgICAgKSkgewogICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgc3RhY2tbJ2RlbGV0ZSddKGFycmF5KTsKICAgICAgc3RhY2tbJ2RlbGV0ZSddKG90aGVyKTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2VxdWFsQXJyYXlzID0gZXF1YWxBcnJheXM7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBgbWFwYCB0byBpdHMga2V5LXZhbHVlIHBhaXJzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gbWFwIFRoZSBtYXAgdG8gY29udmVydC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUga2V5LXZhbHVlIHBhaXJzLgogICAgICovCiAgICBmdW5jdGlvbiBtYXBUb0FycmF5KG1hcCkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KG1hcC5zaXplKTsKCiAgICAgIG1hcC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHsKICAgICAgICByZXN1bHRbKytpbmRleF0gPSBba2V5LCB2YWx1ZV07CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfbWFwVG9BcnJheSA9IG1hcFRvQXJyYXk7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBgc2V0YCB0byBhbiBhcnJheSBvZiBpdHMgdmFsdWVzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc2V0IFRoZSBzZXQgdG8gY29udmVydC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBzZXRUb0FycmF5KHNldCkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KHNldC5zaXplKTsKCiAgICAgIHNldC5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgcmVzdWx0WysraW5kZXhdID0gdmFsdWU7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfc2V0VG9BcnJheSA9IHNldFRvQXJyYXk7CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovCiAgICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUckMSA9IDEsCiAgICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyQxID0gMjsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgYm9vbFRhZyQzID0gJ1tvYmplY3QgQm9vbGVhbl0nLAogICAgICAgIGRhdGVUYWckMyA9ICdbb2JqZWN0IERhdGVdJywKICAgICAgICBlcnJvclRhZyQyID0gJ1tvYmplY3QgRXJyb3JdJywKICAgICAgICBtYXBUYWckNSA9ICdbb2JqZWN0IE1hcF0nLAogICAgICAgIG51bWJlclRhZyQzID0gJ1tvYmplY3QgTnVtYmVyXScsCiAgICAgICAgcmVnZXhwVGFnJDMgPSAnW29iamVjdCBSZWdFeHBdJywKICAgICAgICBzZXRUYWckNSA9ICdbb2JqZWN0IFNldF0nLAogICAgICAgIHN0cmluZ1RhZyQzID0gJ1tvYmplY3QgU3RyaW5nXScsCiAgICAgICAgc3ltYm9sVGFnJDIgPSAnW29iamVjdCBTeW1ib2xdJzsKCiAgICB2YXIgYXJyYXlCdWZmZXJUYWckMyA9ICdbb2JqZWN0IEFycmF5QnVmZmVyXScsCiAgICAgICAgZGF0YVZpZXdUYWckNCA9ICdbb2JqZWN0IERhdGFWaWV3XSc7CgogICAgLyoqIFVzZWQgdG8gY29udmVydCBzeW1ib2xzIHRvIHByaW1pdGl2ZXMgYW5kIHN0cmluZ3MuICovCiAgICB2YXIgc3ltYm9sUHJvdG8kMSA9IF9TeW1ib2wgPyBfU3ltYm9sLnByb3RvdHlwZSA6IHVuZGVmaW5lZCwKICAgICAgICBzeW1ib2xWYWx1ZU9mJDEgPSBzeW1ib2xQcm90byQxID8gc3ltYm9sUHJvdG8kMS52YWx1ZU9mIDogdW5kZWZpbmVkOwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBjb21wYXJpbmcgb2JqZWN0cyBvZgogICAgICogdGhlIHNhbWUgYHRvU3RyaW5nVGFnYC4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogVGhpcyBmdW5jdGlvbiBvbmx5IHN1cHBvcnRzIGNvbXBhcmluZyB2YWx1ZXMgd2l0aCB0YWdzIG9mCiAgICAgKiBgQm9vbGVhbmAsIGBEYXRlYCwgYEVycm9yYCwgYE51bWJlcmAsIGBSZWdFeHBgLCBvciBgU3RyaW5nYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBUaGUgYHRvU3RyaW5nVGFnYCBvZiB0aGUgb2JqZWN0cyB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVxdWFsQnlUYWcob2JqZWN0LCBvdGhlciwgdGFnLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7CiAgICAgIHN3aXRjaCAodGFnKSB7CiAgICAgICAgY2FzZSBkYXRhVmlld1RhZyQ0OgogICAgICAgICAgaWYgKChvYmplY3QuYnl0ZUxlbmd0aCAhPSBvdGhlci5ieXRlTGVuZ3RoKSB8fAogICAgICAgICAgICAgIChvYmplY3QuYnl0ZU9mZnNldCAhPSBvdGhlci5ieXRlT2Zmc2V0KSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICBvYmplY3QgPSBvYmplY3QuYnVmZmVyOwogICAgICAgICAgb3RoZXIgPSBvdGhlci5idWZmZXI7CgogICAgICAgIGNhc2UgYXJyYXlCdWZmZXJUYWckMzoKICAgICAgICAgIGlmICgob2JqZWN0LmJ5dGVMZW5ndGggIT0gb3RoZXIuYnl0ZUxlbmd0aCkgfHwKICAgICAgICAgICAgICAhZXF1YWxGdW5jKG5ldyBfVWludDhBcnJheShvYmplY3QpLCBuZXcgX1VpbnQ4QXJyYXkob3RoZXIpKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKCiAgICAgICAgY2FzZSBib29sVGFnJDM6CiAgICAgICAgY2FzZSBkYXRlVGFnJDM6CiAgICAgICAgY2FzZSBudW1iZXJUYWckMzoKICAgICAgICAgIC8vIENvZXJjZSBib29sZWFucyB0byBgMWAgb3IgYDBgIGFuZCBkYXRlcyB0byBtaWxsaXNlY29uZHMuCiAgICAgICAgICAvLyBJbnZhbGlkIGRhdGVzIGFyZSBjb2VyY2VkIHRvIGBOYU5gLgogICAgICAgICAgcmV0dXJuIGVxXzEoK29iamVjdCwgK290aGVyKTsKCiAgICAgICAgY2FzZSBlcnJvclRhZyQyOgogICAgICAgICAgcmV0dXJuIG9iamVjdC5uYW1lID09IG90aGVyLm5hbWUgJiYgb2JqZWN0Lm1lc3NhZ2UgPT0gb3RoZXIubWVzc2FnZTsKCiAgICAgICAgY2FzZSByZWdleHBUYWckMzoKICAgICAgICBjYXNlIHN0cmluZ1RhZyQzOgogICAgICAgICAgLy8gQ29lcmNlIHJlZ2V4ZXMgdG8gc3RyaW5ncyBhbmQgdHJlYXQgc3RyaW5ncywgcHJpbWl0aXZlcyBhbmQgb2JqZWN0cywKICAgICAgICAgIC8vIGFzIGVxdWFsLiBTZWUgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXJlZ2V4cC5wcm90b3R5cGUudG9zdHJpbmcKICAgICAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuCiAgICAgICAgICByZXR1cm4gb2JqZWN0ID09IChvdGhlciArICcnKTsKCiAgICAgICAgY2FzZSBtYXBUYWckNToKICAgICAgICAgIHZhciBjb252ZXJ0ID0gX21hcFRvQXJyYXk7CgogICAgICAgIGNhc2Ugc2V0VGFnJDU6CiAgICAgICAgICB2YXIgaXNQYXJ0aWFsID0gYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHJDE7CiAgICAgICAgICBjb252ZXJ0IHx8IChjb252ZXJ0ID0gX3NldFRvQXJyYXkpOwoKICAgICAgICAgIGlmIChvYmplY3Quc2l6ZSAhPSBvdGhlci5zaXplICYmICFpc1BhcnRpYWwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgICAgLy8gQXNzdW1lIGN5Y2xpYyB2YWx1ZXMgYXJlIGVxdWFsLgogICAgICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTsKICAgICAgICAgIGlmIChzdGFja2VkKSB7CiAgICAgICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyOwogICAgICAgICAgfQogICAgICAgICAgYml0bWFzayB8PSBDT01QQVJFX1VOT1JERVJFRF9GTEFHJDE7CgogICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCiAgICAgICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gX2VxdWFsQXJyYXlzKGNvbnZlcnQob2JqZWN0KSwgY29udmVydChvdGhlciksIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spOwogICAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKG9iamVjdCk7CiAgICAgICAgICByZXR1cm4gcmVzdWx0OwoKICAgICAgICBjYXNlIHN5bWJvbFRhZyQyOgogICAgICAgICAgaWYgKHN5bWJvbFZhbHVlT2YkMSkgewogICAgICAgICAgICByZXR1cm4gc3ltYm9sVmFsdWVPZiQxLmNhbGwob2JqZWN0KSA9PSBzeW1ib2xWYWx1ZU9mJDEuY2FsbChvdGhlcik7CiAgICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBfZXF1YWxCeVRhZyA9IGVxdWFsQnlUYWc7CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovCiAgICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUckMiA9IDE7CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJGQgPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JGEgPSBvYmplY3RQcm90byRkLmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBiYXNlSXNFcXVhbERlZXBgIGZvciBvYmplY3RzIHdpdGggc3VwcG9ydCBmb3IKICAgICAqIHBhcnRpYWwgZGVlcCBjb21wYXJpc29ucy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIGNvbXBhcmUuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3RoZXIgVGhlIG90aGVyIG9iamVjdCB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtudW1iZXJ9IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuIFNlZSBgYmFzZUlzRXF1YWxgIGZvciBtb3JlIGRldGFpbHMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjdXN0b21pemVyIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBlcXVhbEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGRldGVybWluZSBlcXVpdmFsZW50cyBvZiB2YWx1ZXMuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc3RhY2sgVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVxdWFsT2JqZWN0cyhvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7CiAgICAgIHZhciBpc1BhcnRpYWwgPSBiaXRtYXNrICYgQ09NUEFSRV9QQVJUSUFMX0ZMQUckMiwKICAgICAgICAgIG9ialByb3BzID0gX2dldEFsbEtleXMob2JqZWN0KSwKICAgICAgICAgIG9iakxlbmd0aCA9IG9ialByb3BzLmxlbmd0aCwKICAgICAgICAgIG90aFByb3BzID0gX2dldEFsbEtleXMob3RoZXIpLAogICAgICAgICAgb3RoTGVuZ3RoID0gb3RoUHJvcHMubGVuZ3RoOwoKICAgICAgaWYgKG9iakxlbmd0aCAhPSBvdGhMZW5ndGggJiYgIWlzUGFydGlhbCkgewogICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgfQogICAgICB2YXIgaW5kZXggPSBvYmpMZW5ndGg7CiAgICAgIHdoaWxlIChpbmRleC0tKSB7CiAgICAgICAgdmFyIGtleSA9IG9ialByb3BzW2luZGV4XTsKICAgICAgICBpZiAoIShpc1BhcnRpYWwgPyBrZXkgaW4gb3RoZXIgOiBoYXNPd25Qcm9wZXJ0eSRhLmNhbGwob3RoZXIsIGtleSkpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEFzc3VtZSBjeWNsaWMgdmFsdWVzIGFyZSBlcXVhbC4KICAgICAgdmFyIHN0YWNrZWQgPSBzdGFjay5nZXQob2JqZWN0KTsKICAgICAgaWYgKHN0YWNrZWQgJiYgc3RhY2suZ2V0KG90aGVyKSkgewogICAgICAgIHJldHVybiBzdGFja2VkID09IG90aGVyOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSB0cnVlOwogICAgICBzdGFjay5zZXQob2JqZWN0LCBvdGhlcik7CiAgICAgIHN0YWNrLnNldChvdGhlciwgb2JqZWN0KTsKCiAgICAgIHZhciBza2lwQ3RvciA9IGlzUGFydGlhbDsKICAgICAgd2hpbGUgKCsraW5kZXggPCBvYmpMZW5ndGgpIHsKICAgICAgICBrZXkgPSBvYmpQcm9wc1tpbmRleF07CiAgICAgICAgdmFyIG9ialZhbHVlID0gb2JqZWN0W2tleV0sCiAgICAgICAgICAgIG90aFZhbHVlID0gb3RoZXJba2V5XTsKCiAgICAgICAgaWYgKGN1c3RvbWl6ZXIpIHsKICAgICAgICAgIHZhciBjb21wYXJlZCA9IGlzUGFydGlhbAogICAgICAgICAgICA/IGN1c3RvbWl6ZXIob3RoVmFsdWUsIG9ialZhbHVlLCBrZXksIG90aGVyLCBvYmplY3QsIHN0YWNrKQogICAgICAgICAgICA6IGN1c3RvbWl6ZXIob2JqVmFsdWUsIG90aFZhbHVlLCBrZXksIG9iamVjdCwgb3RoZXIsIHN0YWNrKTsKICAgICAgICB9CiAgICAgICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCiAgICAgICAgaWYgKCEoY29tcGFyZWQgPT09IHVuZGVmaW5lZAogICAgICAgICAgICAgID8gKG9ialZhbHVlID09PSBvdGhWYWx1ZSB8fCBlcXVhbEZ1bmMob2JqVmFsdWUsIG90aFZhbHVlLCBiaXRtYXNrLCBjdXN0b21pemVyLCBzdGFjaykpCiAgICAgICAgICAgICAgOiBjb21wYXJlZAogICAgICAgICAgICApKSB7CiAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICBza2lwQ3RvciB8fCAoc2tpcEN0b3IgPSBrZXkgPT0gJ2NvbnN0cnVjdG9yJyk7CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdCAmJiAhc2tpcEN0b3IpIHsKICAgICAgICB2YXIgb2JqQ3RvciA9IG9iamVjdC5jb25zdHJ1Y3RvciwKICAgICAgICAgICAgb3RoQ3RvciA9IG90aGVyLmNvbnN0cnVjdG9yOwoKICAgICAgICAvLyBOb24gYE9iamVjdGAgb2JqZWN0IGluc3RhbmNlcyB3aXRoIGRpZmZlcmVudCBjb25zdHJ1Y3RvcnMgYXJlIG5vdCBlcXVhbC4KICAgICAgICBpZiAob2JqQ3RvciAhPSBvdGhDdG9yICYmCiAgICAgICAgICAgICgnY29uc3RydWN0b3InIGluIG9iamVjdCAmJiAnY29uc3RydWN0b3InIGluIG90aGVyKSAmJgogICAgICAgICAgICAhKHR5cGVvZiBvYmpDdG9yID09ICdmdW5jdGlvbicgJiYgb2JqQ3RvciBpbnN0YW5jZW9mIG9iakN0b3IgJiYKICAgICAgICAgICAgICB0eXBlb2Ygb3RoQ3RvciA9PSAnZnVuY3Rpb24nICYmIG90aEN0b3IgaW5zdGFuY2VvZiBvdGhDdG9yKSkgewogICAgICAgICAgcmVzdWx0ID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHN0YWNrWydkZWxldGUnXShvYmplY3QpOwogICAgICBzdGFja1snZGVsZXRlJ10ob3RoZXIpOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfZXF1YWxPYmplY3RzID0gZXF1YWxPYmplY3RzOwoKICAgIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqLwogICAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHJDMgPSAxOwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBhcmdzVGFnJDMgPSAnW29iamVjdCBBcmd1bWVudHNdJywKICAgICAgICBhcnJheVRhZyQyID0gJ1tvYmplY3QgQXJyYXldJywKICAgICAgICBvYmplY3RUYWckMyA9ICdbb2JqZWN0IE9iamVjdF0nOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RQcm90byRlID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSRiID0gb2JqZWN0UHJvdG8kZS5oYXNPd25Qcm9wZXJ0eTsKCiAgICAvKioKICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZUlzRXF1YWxgIGZvciBhcnJheXMgYW5kIG9iamVjdHMgd2hpY2ggcGVyZm9ybXMKICAgICAqIGRlZXAgY29tcGFyaXNvbnMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXIKICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgY29tcGFyZWQuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBiaXRtYXNrIFRoZSBiaXRtYXNrIGZsYWdzLiBTZWUgYGJhc2VJc0VxdWFsYCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY3VzdG9taXplciBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGNvbXBhcmlzb25zLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZXF1YWxGdW5jIFRoZSBmdW5jdGlvbiB0byBkZXRlcm1pbmUgZXF1aXZhbGVudHMgb2YgdmFsdWVzLgogICAgICogQHBhcmFtIHtPYmplY3R9IFtzdGFja10gVHJhY2tzIHRyYXZlcnNlZCBgb2JqZWN0YCBhbmQgYG90aGVyYCBvYmplY3RzLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIHRoZSBvYmplY3RzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsRGVlcChvYmplY3QsIG90aGVyLCBiaXRtYXNrLCBjdXN0b21pemVyLCBlcXVhbEZ1bmMsIHN0YWNrKSB7CiAgICAgIHZhciBvYmpJc0FyciA9IGlzQXJyYXlfMShvYmplY3QpLAogICAgICAgICAgb3RoSXNBcnIgPSBpc0FycmF5XzEob3RoZXIpLAogICAgICAgICAgb2JqVGFnID0gb2JqSXNBcnIgPyBhcnJheVRhZyQyIDogX2dldFRhZyhvYmplY3QpLAogICAgICAgICAgb3RoVGFnID0gb3RoSXNBcnIgPyBhcnJheVRhZyQyIDogX2dldFRhZyhvdGhlcik7CgogICAgICBvYmpUYWcgPSBvYmpUYWcgPT0gYXJnc1RhZyQzID8gb2JqZWN0VGFnJDMgOiBvYmpUYWc7CiAgICAgIG90aFRhZyA9IG90aFRhZyA9PSBhcmdzVGFnJDMgPyBvYmplY3RUYWckMyA6IG90aFRhZzsKCiAgICAgIHZhciBvYmpJc09iaiA9IG9ialRhZyA9PSBvYmplY3RUYWckMywKICAgICAgICAgIG90aElzT2JqID0gb3RoVGFnID09IG9iamVjdFRhZyQzLAogICAgICAgICAgaXNTYW1lVGFnID0gb2JqVGFnID09IG90aFRhZzsKCiAgICAgIGlmIChpc1NhbWVUYWcgJiYgaXNCdWZmZXJfMShvYmplY3QpKSB7CiAgICAgICAgaWYgKCFpc0J1ZmZlcl8xKG90aGVyKSkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBvYmpJc0FyciA9IHRydWU7CiAgICAgICAgb2JqSXNPYmogPSBmYWxzZTsKICAgICAgfQogICAgICBpZiAoaXNTYW1lVGFnICYmICFvYmpJc09iaikgewogICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBfU3RhY2spOwogICAgICAgIHJldHVybiAob2JqSXNBcnIgfHwgaXNUeXBlZEFycmF5XzEob2JqZWN0KSkKICAgICAgICAgID8gX2VxdWFsQXJyYXlzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spCiAgICAgICAgICA6IF9lcXVhbEJ5VGFnKG9iamVjdCwgb3RoZXIsIG9ialRhZywgYml0bWFzaywgY3VzdG9taXplciwgZXF1YWxGdW5jLCBzdGFjayk7CiAgICAgIH0KICAgICAgaWYgKCEoYml0bWFzayAmIENPTVBBUkVfUEFSVElBTF9GTEFHJDMpKSB7CiAgICAgICAgdmFyIG9iaklzV3JhcHBlZCA9IG9iaklzT2JqICYmIGhhc093blByb3BlcnR5JGIuY2FsbChvYmplY3QsICdfX3dyYXBwZWRfXycpLAogICAgICAgICAgICBvdGhJc1dyYXBwZWQgPSBvdGhJc09iaiAmJiBoYXNPd25Qcm9wZXJ0eSRiLmNhbGwob3RoZXIsICdfX3dyYXBwZWRfXycpOwoKICAgICAgICBpZiAob2JqSXNXcmFwcGVkIHx8IG90aElzV3JhcHBlZCkgewogICAgICAgICAgdmFyIG9ialVud3JhcHBlZCA9IG9iaklzV3JhcHBlZCA/IG9iamVjdC52YWx1ZSgpIDogb2JqZWN0LAogICAgICAgICAgICAgIG90aFVud3JhcHBlZCA9IG90aElzV3JhcHBlZCA/IG90aGVyLnZhbHVlKCkgOiBvdGhlcjsKCiAgICAgICAgICBzdGFjayB8fCAoc3RhY2sgPSBuZXcgX1N0YWNrKTsKICAgICAgICAgIHJldHVybiBlcXVhbEZ1bmMob2JqVW53cmFwcGVkLCBvdGhVbndyYXBwZWQsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIHN0YWNrKTsKICAgICAgICB9CiAgICAgIH0KICAgICAgaWYgKCFpc1NhbWVUYWcpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgc3RhY2sgfHwgKHN0YWNrID0gbmV3IF9TdGFjayk7CiAgICAgIHJldHVybiBfZXF1YWxPYmplY3RzKG9iamVjdCwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGVxdWFsRnVuYywgc3RhY2spOwogICAgfQoKICAgIHZhciBfYmFzZUlzRXF1YWxEZWVwID0gYmFzZUlzRXF1YWxEZWVwOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaXNFcXVhbGAgd2hpY2ggc3VwcG9ydHMgcGFydGlhbCBjb21wYXJpc29ucwogICAgICogYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGJpdG1hc2sgVGhlIGJpdG1hc2sgZmxhZ3MuCiAgICAgKiAgMSAtIFVub3JkZXJlZCBjb21wYXJpc29uCiAgICAgKiAgMiAtIFBhcnRpYWwgY29tcGFyaXNvbgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgY29tcGFyaXNvbnMuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIGB2YWx1ZWAgYW5kIGBvdGhlcmAgb2JqZWN0cy4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgdmFsdWVzIGFyZSBlcXVpdmFsZW50LCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJc0VxdWFsKHZhbHVlLCBvdGhlciwgYml0bWFzaywgY3VzdG9taXplciwgc3RhY2spIHsKICAgICAgaWYgKHZhbHVlID09PSBvdGhlcikgewogICAgICAgIHJldHVybiB0cnVlOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsIHx8IG90aGVyID09IG51bGwgfHwgKCFpc09iamVjdExpa2VfMSh2YWx1ZSkgJiYgIWlzT2JqZWN0TGlrZV8xKG90aGVyKSkpIHsKICAgICAgICByZXR1cm4gdmFsdWUgIT09IHZhbHVlICYmIG90aGVyICE9PSBvdGhlcjsKICAgICAgfQogICAgICByZXR1cm4gX2Jhc2VJc0VxdWFsRGVlcCh2YWx1ZSwgb3RoZXIsIGJpdG1hc2ssIGN1c3RvbWl6ZXIsIGJhc2VJc0VxdWFsLCBzdGFjayk7CiAgICB9CgogICAgdmFyIF9iYXNlSXNFcXVhbCA9IGJhc2VJc0VxdWFsOwoKICAgIC8qKiBVc2VkIHRvIGNvbXBvc2UgYml0bWFza3MgZm9yIHZhbHVlIGNvbXBhcmlzb25zLiAqLwogICAgdmFyIENPTVBBUkVfUEFSVElBTF9GTEFHJDQgPSAxLAogICAgICAgIENPTVBBUkVfVU5PUkRFUkVEX0ZMQUckMiA9IDI7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc01hdGNoYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpbnNwZWN0LgogICAgICogQHBhcmFtIHtPYmplY3R9IHNvdXJjZSBUaGUgb2JqZWN0IG9mIHByb3BlcnR5IHZhbHVlcyB0byBtYXRjaC4KICAgICAqIEBwYXJhbSB7QXJyYXl9IG1hdGNoRGF0YSBUaGUgcHJvcGVydHkgbmFtZXMsIHZhbHVlcywgYW5kIGNvbXBhcmUgZmxhZ3MgdG8gbWF0Y2guCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY3VzdG9taXplcl0gVGhlIGZ1bmN0aW9uIHRvIGN1c3RvbWl6ZSBjb21wYXJpc29ucy4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgb2JqZWN0YCBpcyBhIG1hdGNoLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJc01hdGNoKG9iamVjdCwgc291cmNlLCBtYXRjaERhdGEsIGN1c3RvbWl6ZXIpIHsKICAgICAgdmFyIGluZGV4ID0gbWF0Y2hEYXRhLmxlbmd0aCwKICAgICAgICAgIGxlbmd0aCA9IGluZGV4LAogICAgICAgICAgbm9DdXN0b21pemVyID0gIWN1c3RvbWl6ZXI7CgogICAgICBpZiAob2JqZWN0ID09IG51bGwpIHsKICAgICAgICByZXR1cm4gIWxlbmd0aDsKICAgICAgfQogICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTsKICAgICAgd2hpbGUgKGluZGV4LS0pIHsKICAgICAgICB2YXIgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07CiAgICAgICAgaWYgKChub0N1c3RvbWl6ZXIgJiYgZGF0YVsyXSkKICAgICAgICAgICAgICA/IGRhdGFbMV0gIT09IG9iamVjdFtkYXRhWzBdXQogICAgICAgICAgICAgIDogIShkYXRhWzBdIGluIG9iamVjdCkKICAgICAgICAgICAgKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgZGF0YSA9IG1hdGNoRGF0YVtpbmRleF07CiAgICAgICAgdmFyIGtleSA9IGRhdGFbMF0sCiAgICAgICAgICAgIG9ialZhbHVlID0gb2JqZWN0W2tleV0sCiAgICAgICAgICAgIHNyY1ZhbHVlID0gZGF0YVsxXTsKCiAgICAgICAgaWYgKG5vQ3VzdG9taXplciAmJiBkYXRhWzJdKSB7CiAgICAgICAgICBpZiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiAhKGtleSBpbiBvYmplY3QpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHN0YWNrID0gbmV3IF9TdGFjazsKICAgICAgICAgIGlmIChjdXN0b21pemVyKSB7CiAgICAgICAgICAgIHZhciByZXN1bHQgPSBjdXN0b21pemVyKG9ialZhbHVlLCBzcmNWYWx1ZSwga2V5LCBvYmplY3QsIHNvdXJjZSwgc3RhY2spOwogICAgICAgICAgfQogICAgICAgICAgaWYgKCEocmVzdWx0ID09PSB1bmRlZmluZWQKICAgICAgICAgICAgICAgID8gX2Jhc2VJc0VxdWFsKHNyY1ZhbHVlLCBvYmpWYWx1ZSwgQ09NUEFSRV9QQVJUSUFMX0ZMQUckNCB8IENPTVBBUkVfVU5PUkRFUkVEX0ZMQUckMiwgY3VzdG9taXplciwgc3RhY2spCiAgICAgICAgICAgICAgICA6IHJlc3VsdAogICAgICAgICAgICAgICkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB2YXIgX2Jhc2VJc01hdGNoID0gYmFzZUlzTWF0Y2g7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBzdWl0YWJsZSBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlmIHN1aXRhYmxlIGZvciBzdHJpY3QKICAgICAqICBlcXVhbGl0eSBjb21wYXJpc29ucywgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBpc1N0cmljdENvbXBhcmFibGUodmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlID09PSB2YWx1ZSAmJiAhaXNPYmplY3RfMSh2YWx1ZSk7CiAgICB9CgogICAgdmFyIF9pc1N0cmljdENvbXBhcmFibGUgPSBpc1N0cmljdENvbXBhcmFibGU7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBwcm9wZXJ0eSBuYW1lcywgdmFsdWVzLCBhbmQgY29tcGFyZSBmbGFncyBvZiBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBtYXRjaCBkYXRhIG9mIGBvYmplY3RgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRNYXRjaERhdGEob2JqZWN0KSB7CiAgICAgIHZhciByZXN1bHQgPSBrZXlzXzEob2JqZWN0KSwKICAgICAgICAgIGxlbmd0aCA9IHJlc3VsdC5sZW5ndGg7CgogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICB2YXIga2V5ID0gcmVzdWx0W2xlbmd0aF0sCiAgICAgICAgICAgIHZhbHVlID0gb2JqZWN0W2tleV07CgogICAgICAgIHJlc3VsdFtsZW5ndGhdID0gW2tleSwgdmFsdWUsIF9pc1N0cmljdENvbXBhcmFibGUodmFsdWUpXTsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfZ2V0TWF0Y2hEYXRhID0gZ2V0TWF0Y2hEYXRhOwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBtYXRjaGVzUHJvcGVydHlgIGZvciBzb3VyY2UgdmFsdWVzIHN1aXRhYmxlCiAgICAgKiBmb3Igc3RyaWN0IGVxdWFsaXR5IGNvbXBhcmlzb25zLCBpLmUuIGA9PT1gLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30ga2V5IFRoZSBrZXkgb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAqIEBwYXJhbSB7Kn0gc3JjVmFsdWUgVGhlIHZhbHVlIHRvIG1hdGNoLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gbWF0Y2hlc1N0cmljdENvbXBhcmFibGUoa2V5LCBzcmNWYWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHJldHVybiBvYmplY3Rba2V5XSA9PT0gc3JjVmFsdWUgJiYKICAgICAgICAgIChzcmNWYWx1ZSAhPT0gdW5kZWZpbmVkIHx8IChrZXkgaW4gT2JqZWN0KG9iamVjdCkpKTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlID0gbWF0Y2hlc1N0cmljdENvbXBhcmFibGU7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tYXRjaGVzYCB3aGljaCBkb2Vzbid0IGNsb25lIGBzb3VyY2VgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBvYmplY3Qgb2YgcHJvcGVydHkgdmFsdWVzIHRvIG1hdGNoLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc3BlYyBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZU1hdGNoZXMoc291cmNlKSB7CiAgICAgIHZhciBtYXRjaERhdGEgPSBfZ2V0TWF0Y2hEYXRhKHNvdXJjZSk7CiAgICAgIGlmIChtYXRjaERhdGEubGVuZ3RoID09IDEgJiYgbWF0Y2hEYXRhWzBdWzJdKSB7CiAgICAgICAgcmV0dXJuIF9tYXRjaGVzU3RyaWN0Q29tcGFyYWJsZShtYXRjaERhdGFbMF1bMF0sIG1hdGNoRGF0YVswXVsxXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIHJldHVybiBvYmplY3QgPT09IHNvdXJjZSB8fCBfYmFzZUlzTWF0Y2gob2JqZWN0LCBzb3VyY2UsIG1hdGNoRGF0YSk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9iYXNlTWF0Y2hlcyA9IGJhc2VNYXRjaGVzOwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBzeW1ib2xUYWckMyA9ICdbb2JqZWN0IFN5bWJvbF0nOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgY2xhc3NpZmllZCBhcyBhIGBTeW1ib2xgIHByaW1pdGl2ZSBvciBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSA0LjAuMAogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBzeW1ib2wsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc1N5bWJvbChTeW1ib2wuaXRlcmF0b3IpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNTeW1ib2woJ2FiYycpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gaXNTeW1ib2wodmFsdWUpIHsKICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PSAnc3ltYm9sJyB8fAogICAgICAgIChpc09iamVjdExpa2VfMSh2YWx1ZSkgJiYgX2Jhc2VHZXRUYWcodmFsdWUpID09IHN5bWJvbFRhZyQzKTsKICAgIH0KCiAgICB2YXIgaXNTeW1ib2xfMSA9IGlzU3ltYm9sOwoKICAgIC8qKiBVc2VkIHRvIG1hdGNoIHByb3BlcnR5IG5hbWVzIHdpdGhpbiBwcm9wZXJ0eSBwYXRocy4gKi8KICAgIHZhciByZUlzRGVlcFByb3AgPSAvXC58XFsoPzpbXltcXV0qfChbIiddKSg/Oig/IVwxKVteXFxdfFxcLikqP1wxKVxdLywKICAgICAgICByZUlzUGxhaW5Qcm9wID0gL15cdyokLzsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcHJvcGVydHkgbmFtZSBhbmQgbm90IGEgcHJvcGVydHkgcGF0aC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW29iamVjdF0gVGhlIG9iamVjdCB0byBxdWVyeSBrZXlzIG9uLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYSBwcm9wZXJ0eSBuYW1lLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzS2V5KHZhbHVlLCBvYmplY3QpIHsKICAgICAgaWYgKGlzQXJyYXlfMSh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7CiAgICAgIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N5bWJvbCcgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHwKICAgICAgICAgIHZhbHVlID09IG51bGwgfHwgaXNTeW1ib2xfMSh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gcmVJc1BsYWluUHJvcC50ZXN0KHZhbHVlKSB8fCAhcmVJc0RlZXBQcm9wLnRlc3QodmFsdWUpIHx8CiAgICAgICAgKG9iamVjdCAhPSBudWxsICYmIHZhbHVlIGluIE9iamVjdChvYmplY3QpKTsKICAgIH0KCiAgICB2YXIgX2lzS2V5ID0gaXNLZXk7CgogICAgLyoqIEVycm9yIG1lc3NhZ2UgY29uc3RhbnRzLiAqLwogICAgdmFyIEZVTkNfRVJST1JfVEVYVCA9ICdFeHBlY3RlZCBhIGZ1bmN0aW9uJzsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0IG1lbW9pemVzIHRoZSByZXN1bHQgb2YgYGZ1bmNgLiBJZiBgcmVzb2x2ZXJgIGlzCiAgICAgKiBwcm92aWRlZCwgaXQgZGV0ZXJtaW5lcyB0aGUgY2FjaGUga2V5IGZvciBzdG9yaW5nIHRoZSByZXN1bHQgYmFzZWQgb24gdGhlCiAgICAgKiBhcmd1bWVudHMgcHJvdmlkZWQgdG8gdGhlIG1lbW9pemVkIGZ1bmN0aW9uLiBCeSBkZWZhdWx0LCB0aGUgZmlyc3QgYXJndW1lbnQKICAgICAqIHByb3ZpZGVkIHRvIHRoZSBtZW1vaXplZCBmdW5jdGlvbiBpcyB1c2VkIGFzIHRoZSBtYXAgY2FjaGUga2V5LiBUaGUgYGZ1bmNgCiAgICAgKiBpcyBpbnZva2VkIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIHRoZSBtZW1vaXplZCBmdW5jdGlvbi4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogVGhlIGNhY2hlIGlzIGV4cG9zZWQgYXMgdGhlIGBjYWNoZWAgcHJvcGVydHkgb24gdGhlIG1lbW9pemVkCiAgICAgKiBmdW5jdGlvbi4gSXRzIGNyZWF0aW9uIG1heSBiZSBjdXN0b21pemVkIGJ5IHJlcGxhY2luZyB0aGUgYF8ubWVtb2l6ZS5DYWNoZWAKICAgICAqIGNvbnN0cnVjdG9yIHdpdGggb25lIHdob3NlIGluc3RhbmNlcyBpbXBsZW1lbnQgdGhlCiAgICAgKiBbYE1hcGBdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXByb3BlcnRpZXMtb2YtdGhlLW1hcC1wcm90b3R5cGUtb2JqZWN0KQogICAgICogbWV0aG9kIGludGVyZmFjZSBvZiBgY2xlYXJgLCBgZGVsZXRlYCwgYGdldGAsIGBoYXNgLCBhbmQgYHNldGAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IEZ1bmN0aW9uCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBoYXZlIGl0cyBvdXRwdXQgbWVtb2l6ZWQuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcmVzb2x2ZXJdIFRoZSBmdW5jdGlvbiB0byByZXNvbHZlIHRoZSBjYWNoZSBrZXkuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBtZW1vaXplZCBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiAxLCAnYic6IDIgfTsKICAgICAqIHZhciBvdGhlciA9IHsgJ2MnOiAzLCAnZCc6IDQgfTsKICAgICAqCiAgICAgKiB2YXIgdmFsdWVzID0gXy5tZW1vaXplKF8udmFsdWVzKTsKICAgICAqIHZhbHVlcyhvYmplY3QpOwogICAgICogLy8gPT4gWzEsIDJdCiAgICAgKgogICAgICogdmFsdWVzKG90aGVyKTsKICAgICAqIC8vID0+IFszLCA0XQogICAgICoKICAgICAqIG9iamVjdC5hID0gMjsKICAgICAqIHZhbHVlcyhvYmplY3QpOwogICAgICogLy8gPT4gWzEsIDJdCiAgICAgKgogICAgICogLy8gTW9kaWZ5IHRoZSByZXN1bHQgY2FjaGUuCiAgICAgKiB2YWx1ZXMuY2FjaGUuc2V0KG9iamVjdCwgWydhJywgJ2InXSk7CiAgICAgKiB2YWx1ZXMob2JqZWN0KTsKICAgICAqIC8vID0+IFsnYScsICdiJ10KICAgICAqCiAgICAgKiAvLyBSZXBsYWNlIGBfLm1lbW9pemUuQ2FjaGVgLgogICAgICogXy5tZW1vaXplLkNhY2hlID0gV2Vha01hcDsKICAgICAqLwogICAgZnVuY3Rpb24gbWVtb2l6ZSQxKGZ1bmMsIHJlc29sdmVyKSB7CiAgICAgIGlmICh0eXBlb2YgZnVuYyAhPSAnZnVuY3Rpb24nIHx8IChyZXNvbHZlciAhPSBudWxsICYmIHR5cGVvZiByZXNvbHZlciAhPSAnZnVuY3Rpb24nKSkgewogICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoRlVOQ19FUlJPUl9URVhUKTsKICAgICAgfQogICAgICB2YXIgbWVtb2l6ZWQgPSBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywKICAgICAgICAgICAga2V5ID0gcmVzb2x2ZXIgPyByZXNvbHZlci5hcHBseSh0aGlzLCBhcmdzKSA6IGFyZ3NbMF0sCiAgICAgICAgICAgIGNhY2hlID0gbWVtb2l6ZWQuY2FjaGU7CgogICAgICAgIGlmIChjYWNoZS5oYXMoa2V5KSkgewogICAgICAgICAgcmV0dXJuIGNhY2hlLmdldChrZXkpOwogICAgICAgIH0KICAgICAgICB2YXIgcmVzdWx0ID0gZnVuYy5hcHBseSh0aGlzLCBhcmdzKTsKICAgICAgICBtZW1vaXplZC5jYWNoZSA9IGNhY2hlLnNldChrZXksIHJlc3VsdCkgfHwgY2FjaGU7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgfTsKICAgICAgbWVtb2l6ZWQuY2FjaGUgPSBuZXcgKG1lbW9pemUkMS5DYWNoZSB8fCBfTWFwQ2FjaGUpOwogICAgICByZXR1cm4gbWVtb2l6ZWQ7CiAgICB9CgogICAgLy8gRXhwb3NlIGBNYXBDYWNoZWAuCiAgICBtZW1vaXplJDEuQ2FjaGUgPSBfTWFwQ2FjaGU7CgogICAgdmFyIG1lbW9pemVfMSQxID0gbWVtb2l6ZSQxOwoKICAgIC8qKiBVc2VkIGFzIHRoZSBtYXhpbXVtIG1lbW9pemUgY2FjaGUgc2l6ZS4gKi8KICAgIHZhciBNQVhfTUVNT0laRV9TSVpFID0gNTAwOwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1lbW9pemVgIHdoaWNoIGNsZWFycyB0aGUgbWVtb2l6ZWQgZnVuY3Rpb24ncwogICAgICogY2FjaGUgd2hlbiBpdCBleGNlZWRzIGBNQVhfTUVNT0laRV9TSVpFYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gaGF2ZSBpdHMgb3V0cHV0IG1lbW9pemVkLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgbWVtb2l6ZWQgZnVuY3Rpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lbW9pemVDYXBwZWQoZnVuYykgewogICAgICB2YXIgcmVzdWx0ID0gbWVtb2l6ZV8xJDEoZnVuYywgZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgaWYgKGNhY2hlLnNpemUgPT09IE1BWF9NRU1PSVpFX1NJWkUpIHsKICAgICAgICAgIGNhY2hlLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBrZXk7CiAgICAgIH0pOwoKICAgICAgdmFyIGNhY2hlID0gcmVzdWx0LmNhY2hlOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfbWVtb2l6ZUNhcHBlZCA9IG1lbW9pemVDYXBwZWQ7CgogICAgLyoqIFVzZWQgdG8gbWF0Y2ggcHJvcGVydHkgbmFtZXMgd2l0aGluIHByb3BlcnR5IHBhdGhzLiAqLwogICAgdmFyIHJlUHJvcE5hbWUgPSAvW14uW1xdXSt8XFsoPzooLT9cZCsoPzpcLlxkKyk/KXwoWyInXSkoKD86KD8hXDIpW15cXF18XFwuKSo/KVwyKVxdfCg/PSg/OlwufFxbXF0pKD86XC58XFtcXXwkKSkvZzsKCiAgICAvKiogVXNlZCB0byBtYXRjaCBiYWNrc2xhc2hlcyBpbiBwcm9wZXJ0eSBwYXRocy4gKi8KICAgIHZhciByZUVzY2FwZUNoYXIgPSAvXFwoXFwpPy9nOwoKICAgIC8qKgogICAgICogQ29udmVydHMgYHN0cmluZ2AgdG8gYSBwcm9wZXJ0eSBwYXRoIGFycmF5LgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gY29udmVydC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgcHJvcGVydHkgcGF0aCBhcnJheS4KICAgICAqLwogICAgdmFyIHN0cmluZ1RvUGF0aCA9IF9tZW1vaXplQ2FwcGVkKGZ1bmN0aW9uKHN0cmluZykgewogICAgICB2YXIgcmVzdWx0ID0gW107CiAgICAgIGlmIChzdHJpbmcuY2hhckNvZGVBdCgwKSA9PT0gNDYgLyogLiAqLykgewogICAgICAgIHJlc3VsdC5wdXNoKCcnKTsKICAgICAgfQogICAgICBzdHJpbmcucmVwbGFjZShyZVByb3BOYW1lLCBmdW5jdGlvbihtYXRjaCwgbnVtYmVyLCBxdW90ZSwgc3ViU3RyaW5nKSB7CiAgICAgICAgcmVzdWx0LnB1c2gocXVvdGUgPyBzdWJTdHJpbmcucmVwbGFjZShyZUVzY2FwZUNoYXIsICckMScpIDogKG51bWJlciB8fCBtYXRjaCkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0pOwoKICAgIHZhciBfc3RyaW5nVG9QYXRoID0gc3RyaW5nVG9QYXRoOwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLm1hcGAgZm9yIGFycmF5cyB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlCiAgICAgKiBzaG9ydGhhbmRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LgogICAgICovCiAgICBmdW5jdGlvbiBhcnJheU1hcChhcnJheSwgaXRlcmF0ZWUpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aCwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHJlc3VsdFtpbmRleF0gPSBpdGVyYXRlZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSk7CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2FycmF5TWFwID0gYXJyYXlNYXA7CgogICAgLyoqIFVzZWQgYXMgcmVmZXJlbmNlcyBmb3IgdmFyaW91cyBgTnVtYmVyYCBjb25zdGFudHMuICovCiAgICB2YXIgSU5GSU5JVFkgPSAxIC8gMDsKCiAgICAvKiogVXNlZCB0byBjb252ZXJ0IHN5bWJvbHMgdG8gcHJpbWl0aXZlcyBhbmQgc3RyaW5ncy4gKi8KICAgIHZhciBzeW1ib2xQcm90byQyID0gX1N5bWJvbCA/IF9TeW1ib2wucHJvdG90eXBlIDogdW5kZWZpbmVkLAogICAgICAgIHN5bWJvbFRvU3RyaW5nID0gc3ltYm9sUHJvdG8kMiA/IHN5bWJvbFByb3RvJDIudG9TdHJpbmcgOiB1bmRlZmluZWQ7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy50b1N0cmluZ2Agd2hpY2ggZG9lc24ndCBjb252ZXJ0IG51bGxpc2gKICAgICAqIHZhbHVlcyB0byBlbXB0eSBzdHJpbmdzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBwcm9jZXNzLgogICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlVG9TdHJpbmcodmFsdWUpIHsKICAgICAgLy8gRXhpdCBlYXJseSBmb3Igc3RyaW5ncyB0byBhdm9pZCBhIHBlcmZvcm1hbmNlIGhpdCBpbiBzb21lIGVudmlyb25tZW50cy4KICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBpZiAoaXNBcnJheV8xKHZhbHVlKSkgewogICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGNvbnZlcnQgdmFsdWVzIChzdXNjZXB0aWJsZSB0byBjYWxsIHN0YWNrIGxpbWl0cykuCiAgICAgICAgcmV0dXJuIF9hcnJheU1hcCh2YWx1ZSwgYmFzZVRvU3RyaW5nKSArICcnOwogICAgICB9CiAgICAgIGlmIChpc1N5bWJvbF8xKHZhbHVlKSkgewogICAgICAgIHJldHVybiBzeW1ib2xUb1N0cmluZyA/IHN5bWJvbFRvU3RyaW5nLmNhbGwodmFsdWUpIDogJyc7CiAgICAgIH0KICAgICAgdmFyIHJlc3VsdCA9ICh2YWx1ZSArICcnKTsKICAgICAgcmV0dXJuIChyZXN1bHQgPT0gJzAnICYmICgxIC8gdmFsdWUpID09IC1JTkZJTklUWSkgPyAnLTAnIDogcmVzdWx0OwogICAgfQoKICAgIHZhciBfYmFzZVRvU3RyaW5nID0gYmFzZVRvU3RyaW5nOwoKICAgIC8qKgogICAgICogQ29udmVydHMgYHZhbHVlYCB0byBhIHN0cmluZy4gQW4gZW1wdHkgc3RyaW5nIGlzIHJldHVybmVkIGZvciBgbnVsbGAKICAgICAqIGFuZCBgdW5kZWZpbmVkYCB2YWx1ZXMuIFRoZSBzaWduIG9mIGAtMGAgaXMgcHJlc2VydmVkLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgNC4wLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LgogICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgY29udmVydGVkIHN0cmluZy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy50b1N0cmluZyhudWxsKTsKICAgICAqIC8vID0+ICcnCiAgICAgKgogICAgICogXy50b1N0cmluZygtMCk7CiAgICAgKiAvLyA9PiAnLTAnCiAgICAgKgogICAgICogXy50b1N0cmluZyhbMSwgMiwgM10pOwogICAgICogLy8gPT4gJzEsMiwzJwogICAgICovCiAgICBmdW5jdGlvbiB0b1N0cmluZyh2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/ICcnIDogX2Jhc2VUb1N0cmluZyh2YWx1ZSk7CiAgICB9CgogICAgdmFyIHRvU3RyaW5nXzEgPSB0b1N0cmluZzsKCiAgICAvKioKICAgICAqIENhc3RzIGB2YWx1ZWAgdG8gYSBwYXRoIGFycmF5IGlmIGl0J3Mgbm90IG9uZS4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gaW5zcGVjdC4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5IGtleXMgb24uCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGNhc3QgcHJvcGVydHkgcGF0aCBhcnJheS4KICAgICAqLwogICAgZnVuY3Rpb24gY2FzdFBhdGgodmFsdWUsIG9iamVjdCkgewogICAgICBpZiAoaXNBcnJheV8xKHZhbHVlKSkgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICByZXR1cm4gX2lzS2V5KHZhbHVlLCBvYmplY3QpID8gW3ZhbHVlXSA6IF9zdHJpbmdUb1BhdGgodG9TdHJpbmdfMSh2YWx1ZSkpOwogICAgfQoKICAgIHZhciBfY2FzdFBhdGggPSBjYXN0UGF0aDsKCiAgICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi8KICAgIHZhciBJTkZJTklUWSQxID0gMSAvIDA7CgogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBgdmFsdWVgIHRvIGEgc3RyaW5nIGtleSBpZiBpdCdzIG5vdCBhIHN0cmluZyBvciBzeW1ib2wuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7c3RyaW5nfHN5bWJvbH0gUmV0dXJucyB0aGUga2V5LgogICAgICovCiAgICBmdW5jdGlvbiB0b0tleSh2YWx1ZSkgewogICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8IGlzU3ltYm9sXzEodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIHZhciByZXN1bHQgPSAodmFsdWUgKyAnJyk7CiAgICAgIHJldHVybiAocmVzdWx0ID09ICcwJyAmJiAoMSAvIHZhbHVlKSA9PSAtSU5GSU5JVFkkMSkgPyAnLTAnIDogcmVzdWx0OwogICAgfQoKICAgIHZhciBfdG9LZXkgPSB0b0tleTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmdldGAgd2l0aG91dCBzdXBwb3J0IGZvciBkZWZhdWx0IHZhbHVlcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXNvbHZlZCB2YWx1ZS4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUdldChvYmplY3QsIHBhdGgpIHsKICAgICAgcGF0aCA9IF9jYXN0UGF0aChwYXRoLCBvYmplY3QpOwoKICAgICAgdmFyIGluZGV4ID0gMCwKICAgICAgICAgIGxlbmd0aCA9IHBhdGgubGVuZ3RoOwoKICAgICAgd2hpbGUgKG9iamVjdCAhPSBudWxsICYmIGluZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W190b0tleShwYXRoW2luZGV4KytdKV07CiAgICAgIH0KICAgICAgcmV0dXJuIChpbmRleCAmJiBpbmRleCA9PSBsZW5ndGgpID8gb2JqZWN0IDogdW5kZWZpbmVkOwogICAgfQoKICAgIHZhciBfYmFzZUdldCA9IGJhc2VHZXQ7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYG9iamVjdGAuIElmIHRoZSByZXNvbHZlZCB2YWx1ZSBpcwogICAgICogYHVuZGVmaW5lZGAsIHRoZSBgZGVmYXVsdFZhbHVlYCBpcyByZXR1cm5lZCBpbiBpdHMgcGxhY2UuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAzLjcuMAogICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAqIEBwYXJhbSB7Kn0gW2RlZmF1bHRWYWx1ZV0gVGhlIHZhbHVlIHJldHVybmVkIGZvciBgdW5kZWZpbmVkYCByZXNvbHZlZCB2YWx1ZXMuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgcmVzb2x2ZWQgdmFsdWUuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogW3sgJ2InOiB7ICdjJzogMyB9IH1dIH07CiAgICAgKgogICAgICogXy5nZXQob2JqZWN0LCAnYVswXS5iLmMnKTsKICAgICAqIC8vID0+IDMKICAgICAqCiAgICAgKiBfLmdldChvYmplY3QsIFsnYScsICcwJywgJ2InLCAnYyddKTsKICAgICAqIC8vID0+IDMKICAgICAqCiAgICAgKiBfLmdldChvYmplY3QsICdhLmIuYycsICdkZWZhdWx0Jyk7CiAgICAgKiAvLyA9PiAnZGVmYXVsdCcKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0JGMob2JqZWN0LCBwYXRoLCBkZWZhdWx0VmFsdWUpIHsKICAgICAgdmFyIHJlc3VsdCA9IG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogX2Jhc2VHZXQob2JqZWN0LCBwYXRoKTsKICAgICAgcmV0dXJuIHJlc3VsdCA9PT0gdW5kZWZpbmVkID8gZGVmYXVsdFZhbHVlIDogcmVzdWx0OwogICAgfQoKICAgIHZhciBnZXRfMSA9IGdldCRjOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzSW5gIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IFtvYmplY3RdIFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30ga2V5IFRoZSBrZXkgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYGtleWAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VIYXNJbihvYmplY3QsIGtleSkgewogICAgICByZXR1cm4gb2JqZWN0ICE9IG51bGwgJiYga2V5IGluIE9iamVjdChvYmplY3QpOwogICAgfQoKICAgIHZhciBfYmFzZUhhc0luID0gYmFzZUhhc0luOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGBwYXRoYCBleGlzdHMgb24gYG9iamVjdGAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaGFzRnVuYyBUaGUgZnVuY3Rpb24gdG8gY2hlY2sgcHJvcGVydGllcy4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgcGF0aGAgZXhpc3RzLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc1BhdGgob2JqZWN0LCBwYXRoLCBoYXNGdW5jKSB7CiAgICAgIHBhdGggPSBfY2FzdFBhdGgocGF0aCwgb2JqZWN0KTsKCiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gcGF0aC5sZW5ndGgsCiAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKCiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIGtleSA9IF90b0tleShwYXRoW2luZGV4XSk7CiAgICAgICAgaWYgKCEocmVzdWx0ID0gb2JqZWN0ICE9IG51bGwgJiYgaGFzRnVuYyhvYmplY3QsIGtleSkpKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgb2JqZWN0ID0gb2JqZWN0W2tleV07CiAgICAgIH0KICAgICAgaWYgKHJlc3VsdCB8fCArK2luZGV4ICE9IGxlbmd0aCkgewogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KICAgICAgbGVuZ3RoID0gb2JqZWN0ID09IG51bGwgPyAwIDogb2JqZWN0Lmxlbmd0aDsKICAgICAgcmV0dXJuICEhbGVuZ3RoICYmIGlzTGVuZ3RoXzEobGVuZ3RoKSAmJiBfaXNJbmRleChrZXksIGxlbmd0aCkgJiYKICAgICAgICAoaXNBcnJheV8xKG9iamVjdCkgfHwgaXNBcmd1bWVudHNfMShvYmplY3QpKTsKICAgIH0KCiAgICB2YXIgX2hhc1BhdGggPSBoYXNQYXRoOwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGBwYXRoYCBpcyBhIGRpcmVjdCBvciBpbmhlcml0ZWQgcHJvcGVydHkgb2YgYG9iamVjdGAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSA0LjAuMAogICAgICogQGNhdGVnb3J5IE9iamVjdAogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHBhdGhgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0ID0gXy5jcmVhdGUoeyAnYSc6IF8uY3JlYXRlKHsgJ2InOiAyIH0pIH0pOwogICAgICoKICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYScpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYS5iJyk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5oYXNJbihvYmplY3QsIFsnYScsICdiJ10pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaGFzSW4ob2JqZWN0LCAnYicpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gaGFzSW4ob2JqZWN0LCBwYXRoKSB7CiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBfaGFzUGF0aChvYmplY3QsIHBhdGgsIF9iYXNlSGFzSW4pOwogICAgfQoKICAgIHZhciBoYXNJbl8xID0gaGFzSW47CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSBiaXRtYXNrcyBmb3IgdmFsdWUgY29tcGFyaXNvbnMuICovCiAgICB2YXIgQ09NUEFSRV9QQVJUSUFMX0ZMQUckNSA9IDEsCiAgICAgICAgQ09NUEFSRV9VTk9SREVSRURfRkxBRyQzID0gMjsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLm1hdGNoZXNQcm9wZXJ0eWAgd2hpY2ggZG9lc24ndCBjbG9uZSBgc3JjVmFsdWVgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgogICAgICogQHBhcmFtIHsqfSBzcmNWYWx1ZSBUaGUgdmFsdWUgdG8gbWF0Y2guCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBzcGVjIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlTWF0Y2hlc1Byb3BlcnR5KHBhdGgsIHNyY1ZhbHVlKSB7CiAgICAgIGlmIChfaXNLZXkocGF0aCkgJiYgX2lzU3RyaWN0Q29tcGFyYWJsZShzcmNWYWx1ZSkpIHsKICAgICAgICByZXR1cm4gX21hdGNoZXNTdHJpY3RDb21wYXJhYmxlKF90b0tleShwYXRoKSwgc3JjVmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBmdW5jdGlvbihvYmplY3QpIHsKICAgICAgICB2YXIgb2JqVmFsdWUgPSBnZXRfMShvYmplY3QsIHBhdGgpOwogICAgICAgIHJldHVybiAob2JqVmFsdWUgPT09IHVuZGVmaW5lZCAmJiBvYmpWYWx1ZSA9PT0gc3JjVmFsdWUpCiAgICAgICAgICA/IGhhc0luXzEob2JqZWN0LCBwYXRoKQogICAgICAgICAgOiBfYmFzZUlzRXF1YWwoc3JjVmFsdWUsIG9ialZhbHVlLCBDT01QQVJFX1BBUlRJQUxfRkxBRyQ1IHwgQ09NUEFSRV9VTk9SREVSRURfRkxBRyQzKTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgX2Jhc2VNYXRjaGVzUHJvcGVydHkgPSBiYXNlTWF0Y2hlc1Byb3BlcnR5OwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucHJvcGVydHlgIHdpdGhvdXQgc3VwcG9ydCBmb3IgZGVlcCBwYXRocy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZVByb3BlcnR5KGtleSkgewogICAgICByZXR1cm4gZnVuY3Rpb24ob2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8gdW5kZWZpbmVkIDogb2JqZWN0W2tleV07CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9iYXNlUHJvcGVydHkgPSBiYXNlUHJvcGVydHk7CgogICAgLyoqCiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VQcm9wZXJ0eWAgd2hpY2ggc3VwcG9ydHMgZGVlcCBwYXRocy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IHBhdGggVGhlIHBhdGggb2YgdGhlIHByb3BlcnR5IHRvIGdldC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFjY2Vzc29yIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlUHJvcGVydHlEZWVwKHBhdGgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG9iamVjdCkgewogICAgICAgIHJldHVybiBfYmFzZUdldChvYmplY3QsIHBhdGgpOwogICAgICB9OwogICAgfQoKICAgIHZhciBfYmFzZVByb3BlcnR5RGVlcCA9IGJhc2VQcm9wZXJ0eURlZXA7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB2YWx1ZSBhdCBgcGF0aGAgb2YgYSBnaXZlbiBvYmplY3QuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAyLjQuMAogICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIG9mIHRoZSBwcm9wZXJ0eSB0byBnZXQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBhY2Nlc3NvciBmdW5jdGlvbi4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIG9iamVjdHMgPSBbCiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMiB9IH0sCiAgICAgKiAgIHsgJ2EnOiB7ICdiJzogMSB9IH0KICAgICAqIF07CiAgICAgKgogICAgICogXy5tYXAob2JqZWN0cywgXy5wcm9wZXJ0eSgnYS5iJykpOwogICAgICogLy8gPT4gWzIsIDFdCiAgICAgKgogICAgICogXy5tYXAoXy5zb3J0Qnkob2JqZWN0cywgXy5wcm9wZXJ0eShbJ2EnLCAnYiddKSksICdhLmInKTsKICAgICAqIC8vID0+IFsxLCAyXQogICAgICovCiAgICBmdW5jdGlvbiBwcm9wZXJ0eSQxKHBhdGgpIHsKICAgICAgcmV0dXJuIF9pc0tleShwYXRoKSA/IF9iYXNlUHJvcGVydHkoX3RvS2V5KHBhdGgpKSA6IF9iYXNlUHJvcGVydHlEZWVwKHBhdGgpOwogICAgfQoKICAgIHZhciBwcm9wZXJ0eV8xID0gcHJvcGVydHkkMTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLml0ZXJhdGVlYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSBbdmFsdWU9Xy5pZGVudGl0eV0gVGhlIHZhbHVlIHRvIGNvbnZlcnQgdG8gYW4gaXRlcmF0ZWUuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIGl0ZXJhdGVlLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUpIHsKICAgICAgLy8gRG9uJ3Qgc3RvcmUgdGhlIGB0eXBlb2ZgIHJlc3VsdCBpbiBhIHZhcmlhYmxlIHRvIGF2b2lkIGEgSklUIGJ1ZyBpbiBTYWZhcmkgOS4KICAgICAgLy8gU2VlIGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTYwMzQgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICB9CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIGlkZW50aXR5XzE7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnb2JqZWN0JykgewogICAgICAgIHJldHVybiBpc0FycmF5XzEodmFsdWUpCiAgICAgICAgICA/IF9iYXNlTWF0Y2hlc1Byb3BlcnR5KHZhbHVlWzBdLCB2YWx1ZVsxXSkKICAgICAgICAgIDogX2Jhc2VNYXRjaGVzKHZhbHVlKTsKICAgICAgfQogICAgICByZXR1cm4gcHJvcGVydHlfMSh2YWx1ZSk7CiAgICB9CgogICAgdmFyIF9iYXNlSXRlcmF0ZWUgPSBiYXNlSXRlcmF0ZWU7CgogICAgLyoqCiAgICAgKiBJdGVyYXRlcyBvdmVyIGVsZW1lbnRzIG9mIGBjb2xsZWN0aW9uYCwgcmV0dXJuaW5nIGFuIGFycmF5IG9mIGFsbCBlbGVtZW50cwogICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZQogICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogKipOb3RlOioqIFVubGlrZSBgXy5yZW1vdmVgLCB0aGlzIG1ldGhvZCByZXR1cm5zIGEgbmV3IGFycmF5LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBmaWx0ZXJlZCBhcnJheS4KICAgICAqIEBzZWUgXy5yZWplY3QKICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIHVzZXJzID0gWwogICAgICogICB7ICd1c2VyJzogJ2Jhcm5leScsICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSwKICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAnYWdlJzogNDAsICdhY3RpdmUnOiBmYWxzZSB9CiAgICAgKiBdOwogICAgICoKICAgICAqIF8uZmlsdGVyKHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiAhby5hY3RpdmU7IH0pOwogICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ10KICAgICAqCiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc2AgaXRlcmF0ZWUgc2hvcnRoYW5kLgogICAgICogXy5maWx0ZXIodXNlcnMsIHsgJ2FnZSc6IDM2LCAnYWN0aXZlJzogdHJ1ZSB9KTsKICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFsnYmFybmV5J10KICAgICAqCiAgICAgKiAvLyBUaGUgYF8ubWF0Y2hlc1Byb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgKiBfLmZpbHRlcih1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICogLy8gPT4gb2JqZWN0cyBmb3IgWydmcmVkJ10KICAgICAqCiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8uZmlsdGVyKHVzZXJzLCAnYWN0aXZlJyk7CiAgICAgKiAvLyA9PiBvYmplY3RzIGZvciBbJ2Jhcm5leSddCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlcihjb2xsZWN0aW9uLCBwcmVkaWNhdGUpIHsKICAgICAgdmFyIGZ1bmMgPSBpc0FycmF5XzEoY29sbGVjdGlvbikgPyBfYXJyYXlGaWx0ZXIgOiBfYmFzZUZpbHRlcjsKICAgICAgcmV0dXJuIGZ1bmMoY29sbGVjdGlvbiwgX2Jhc2VJdGVyYXRlZShwcmVkaWNhdGUpKTsKICAgIH0KCiAgICB2YXIgZmlsdGVyXzEgPSBmaWx0ZXI7CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJGYgPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JGMgPSBvYmplY3RQcm90byRmLmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaGFzYCB3aXRob3V0IHN1cHBvcnQgZm9yIGRlZXAgcGF0aHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbb2JqZWN0XSBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtBcnJheXxzdHJpbmd9IGtleSBUaGUga2V5IHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBrZXlgIGV4aXN0cywgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlSGFzKG9iamVjdCwga2V5KSB7CiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBoYXNPd25Qcm9wZXJ0eSRjLmNhbGwob2JqZWN0LCBrZXkpOwogICAgfQoKICAgIHZhciBfYmFzZUhhcyA9IGJhc2VIYXM7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHBhdGhgIGlzIGEgZGlyZWN0IHByb3BlcnR5IG9mIGBvYmplY3RgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAqIEBwYXJhbSB7QXJyYXl8c3RyaW5nfSBwYXRoIFRoZSBwYXRoIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGBwYXRoYCBleGlzdHMsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIG9iamVjdCA9IHsgJ2EnOiB7ICdiJzogMiB9IH07CiAgICAgKiB2YXIgb3RoZXIgPSBfLmNyZWF0ZSh7ICdhJzogXy5jcmVhdGUoeyAnYic6IDIgfSkgfSk7CiAgICAgKgogICAgICogXy5oYXMob2JqZWN0LCAnYScpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaGFzKG9iamVjdCwgJ2EuYicpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaGFzKG9iamVjdCwgWydhJywgJ2InXSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5oYXMob3RoZXIsICdhJyk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBoYXMob2JqZWN0LCBwYXRoKSB7CiAgICAgIHJldHVybiBvYmplY3QgIT0gbnVsbCAmJiBfaGFzUGF0aChvYmplY3QsIHBhdGgsIF9iYXNlSGFzKTsKICAgIH0KCiAgICB2YXIgaGFzXzEgPSBoYXM7CgogICAgLyoqIGBPYmplY3QjdG9TdHJpbmdgIHJlc3VsdCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG1hcFRhZyQ2ID0gJ1tvYmplY3QgTWFwXScsCiAgICAgICAgc2V0VGFnJDYgPSAnW29iamVjdCBTZXRdJzsKCiAgICAvKiogVXNlZCBmb3IgYnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMuICovCiAgICB2YXIgb2JqZWN0UHJvdG8kZyA9IE9iamVjdC5wcm90b3R5cGU7CgogICAgLyoqIFVzZWQgdG8gY2hlY2sgb2JqZWN0cyBmb3Igb3duIHByb3BlcnRpZXMuICovCiAgICB2YXIgaGFzT3duUHJvcGVydHkkZCA9IG9iamVjdFByb3RvJGcuaGFzT3duUHJvcGVydHk7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHZhbHVlYCBpcyBhbiBlbXB0eSBvYmplY3QsIGNvbGxlY3Rpb24sIG1hcCwgb3Igc2V0LgogICAgICoKICAgICAqIE9iamVjdHMgYXJlIGNvbnNpZGVyZWQgZW1wdHkgaWYgdGhleSBoYXZlIG5vIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZAogICAgICogcHJvcGVydGllcy4KICAgICAqCiAgICAgKiBBcnJheS1saWtlIHZhbHVlcyBzdWNoIGFzIGBhcmd1bWVudHNgIG9iamVjdHMsIGFycmF5cywgYnVmZmVycywgc3RyaW5ncywgb3IKICAgICAqIGpRdWVyeS1saWtlIGNvbGxlY3Rpb25zIGFyZSBjb25zaWRlcmVkIGVtcHR5IGlmIHRoZXkgaGF2ZSBhIGBsZW5ndGhgIG9mIGAwYC4KICAgICAqIFNpbWlsYXJseSwgbWFwcyBhbmQgc2V0cyBhcmUgY29uc2lkZXJlZCBlbXB0eSBpZiB0aGV5IGhhdmUgYSBgc2l6ZWAgb2YgYDBgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGVtcHR5LCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNFbXB0eShudWxsKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzRW1wdHkodHJ1ZSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc0VtcHR5KDEpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNFbXB0eShbMSwgMiwgM10pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmlzRW1wdHkoeyAnYSc6IDEgfSk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBpc0VtcHR5KHZhbHVlKSB7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgaWYgKGlzQXJyYXlMaWtlXzEodmFsdWUpICYmCiAgICAgICAgICAoaXNBcnJheV8xKHZhbHVlKSB8fCB0eXBlb2YgdmFsdWUgPT0gJ3N0cmluZycgfHwgdHlwZW9mIHZhbHVlLnNwbGljZSA9PSAnZnVuY3Rpb24nIHx8CiAgICAgICAgICAgIGlzQnVmZmVyXzEodmFsdWUpIHx8IGlzVHlwZWRBcnJheV8xKHZhbHVlKSB8fCBpc0FyZ3VtZW50c18xKHZhbHVlKSkpIHsKICAgICAgICByZXR1cm4gIXZhbHVlLmxlbmd0aDsKICAgICAgfQogICAgICB2YXIgdGFnID0gX2dldFRhZyh2YWx1ZSk7CiAgICAgIGlmICh0YWcgPT0gbWFwVGFnJDYgfHwgdGFnID09IHNldFRhZyQ2KSB7CiAgICAgICAgcmV0dXJuICF2YWx1ZS5zaXplOwogICAgICB9CiAgICAgIGlmIChfaXNQcm90b3R5cGUodmFsdWUpKSB7CiAgICAgICAgcmV0dXJuICFfYmFzZUtleXModmFsdWUpLmxlbmd0aDsKICAgICAgfQogICAgICBmb3IgKHZhciBrZXkgaW4gdmFsdWUpIHsKICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkkZC5jYWxsKHZhbHVlLCBrZXkpKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIHZhciBpc0VtcHR5XzEgPSBpc0VtcHR5OwoKICAgIC8qKgogICAgICogQ2hlY2tzIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNoZWNrLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgYHVuZGVmaW5lZGAsIGVsc2UgYGZhbHNlYC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5pc1VuZGVmaW5lZCh2b2lkIDApOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNVbmRlZmluZWQobnVsbCk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh2YWx1ZSkgewogICAgICByZXR1cm4gdmFsdWUgPT09IHVuZGVmaW5lZDsKICAgIH0KCiAgICB2YXIgaXNVbmRlZmluZWRfMSA9IGlzVW5kZWZpbmVkOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ubWFwYCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgYXJyYXkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VNYXAoY29sbGVjdGlvbiwgaXRlcmF0ZWUpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICByZXN1bHQgPSBpc0FycmF5TGlrZV8xKGNvbGxlY3Rpb24pID8gQXJyYXkoY29sbGVjdGlvbi5sZW5ndGgpIDogW107CgogICAgICBfYmFzZUVhY2goY29sbGVjdGlvbiwgZnVuY3Rpb24odmFsdWUsIGtleSwgY29sbGVjdGlvbikgewogICAgICAgIHJlc3VsdFsrK2luZGV4XSA9IGl0ZXJhdGVlKHZhbHVlLCBrZXksIGNvbGxlY3Rpb24pOwogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2Jhc2VNYXAgPSBiYXNlTWFwOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB2YWx1ZXMgYnkgcnVubmluZyBlYWNoIGVsZW1lbnQgaW4gYGNvbGxlY3Rpb25gIHRocnUKICAgICAqIGBpdGVyYXRlZWAuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggdGhyZWUgYXJndW1lbnRzOgogICAgICogKHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgogICAgICoKICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZQogICAgICogYF8uZXZlcnlgLCBgXy5maWx0ZXJgLCBgXy5tYXBgLCBgXy5tYXBWYWx1ZXNgLCBgXy5yZWplY3RgLCBhbmQgYF8uc29tZWAuCiAgICAgKgogICAgICogVGhlIGd1YXJkZWQgbWV0aG9kcyBhcmU6CiAgICAgKiBgYXJ5YCwgYGNodW5rYCwgYGN1cnJ5YCwgYGN1cnJ5UmlnaHRgLCBgZHJvcGAsIGBkcm9wUmlnaHRgLCBgZXZlcnlgLAogICAgICogYGZpbGxgLCBgaW52ZXJ0YCwgYHBhcnNlSW50YCwgYHJhbmRvbWAsIGByYW5nZWAsIGByYW5nZVJpZ2h0YCwgYHJlcGVhdGAsCiAgICAgKiBgc2FtcGxlU2l6ZWAsIGBzbGljZWAsIGBzb21lYCwgYHNvcnRCeWAsIGBzcGxpdGAsIGB0YWtlYCwgYHRha2VSaWdodGAsCiAgICAgKiBgdGVtcGxhdGVgLCBgdHJpbWAsIGB0cmltRW5kYCwgYHRyaW1TdGFydGAsIGFuZCBgd29yZHNgCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgbWFwcGVkIGFycmF5LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBmdW5jdGlvbiBzcXVhcmUobikgewogICAgICogICByZXR1cm4gbiAqIG47CiAgICAgKiB9CiAgICAgKgogICAgICogXy5tYXAoWzQsIDhdLCBzcXVhcmUpOwogICAgICogLy8gPT4gWzE2LCA2NF0KICAgICAqCiAgICAgKiBfLm1hcCh7ICdhJzogNCwgJ2InOiA4IH0sIHNxdWFyZSk7CiAgICAgKiAvLyA9PiBbMTYsIDY0XSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICoKICAgICAqIHZhciB1c2VycyA9IFsKICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknIH0sCiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcgfQogICAgICogXTsKICAgICAqCiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8ubWFwKHVzZXJzLCAndXNlcicpOwogICAgICogLy8gPT4gWydiYXJuZXknLCAnZnJlZCddCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcCRiKGNvbGxlY3Rpb24sIGl0ZXJhdGVlKSB7CiAgICAgIHZhciBmdW5jID0gaXNBcnJheV8xKGNvbGxlY3Rpb24pID8gX2FycmF5TWFwIDogX2Jhc2VNYXA7CiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIF9iYXNlSXRlcmF0ZWUoaXRlcmF0ZWUpKTsKICAgIH0KCiAgICB2YXIgbWFwXzEgPSBtYXAkYjsKCiAgICAvKioKICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5yZWR1Y2VgIGZvciBhcnJheXMgd2l0aG91dCBzdXBwb3J0IGZvcgogICAgICogaXRlcmF0ZWUgc2hvcnRoYW5kcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gW2FycmF5XSBUaGUgYXJyYXkgdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gaXRlcmF0ZWUgVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7Kn0gW2FjY3VtdWxhdG9yXSBUaGUgaW5pdGlhbCB2YWx1ZS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2luaXRBY2N1bV0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3QgZWxlbWVudCBvZiBgYXJyYXlgIGFzCiAgICAgKiAgdGhlIGluaXRpYWwgdmFsdWUuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFycmF5UmVkdWNlKGFycmF5LCBpdGVyYXRlZSwgYWNjdW11bGF0b3IsIGluaXRBY2N1bSkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwoKICAgICAgaWYgKGluaXRBY2N1bSAmJiBsZW5ndGgpIHsKICAgICAgICBhY2N1bXVsYXRvciA9IGFycmF5WysraW5kZXhdOwogICAgICB9CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgYWNjdW11bGF0b3IgPSBpdGVyYXRlZShhY2N1bXVsYXRvciwgYXJyYXlbaW5kZXhdLCBpbmRleCwgYXJyYXkpOwogICAgICB9CiAgICAgIHJldHVybiBhY2N1bXVsYXRvcjsKICAgIH0KCiAgICB2YXIgX2FycmF5UmVkdWNlID0gYXJyYXlSZWR1Y2U7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZWR1Y2VgIGFuZCBgXy5yZWR1Y2VSaWdodGAsIHdpdGhvdXQgc3VwcG9ydAogICAgICogZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMsIHdoaWNoIGl0ZXJhdGVzIG92ZXIgYGNvbGxlY3Rpb25gIHVzaW5nIGBlYWNoRnVuY2AuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGl0ZXJhdGVlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IGFjY3VtdWxhdG9yIFRoZSBpbml0aWFsIHZhbHVlLgogICAgICogQHBhcmFtIHtib29sZWFufSBpbml0QWNjdW0gU3BlY2lmeSB1c2luZyB0aGUgZmlyc3Qgb3IgbGFzdCBlbGVtZW50IG9mCiAgICAgKiAgYGNvbGxlY3Rpb25gIGFzIHRoZSBpbml0aWFsIHZhbHVlLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZWFjaEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGl0ZXJhdGUgb3ZlciBgY29sbGVjdGlvbmAuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgYWNjdW11bGF0ZWQgdmFsdWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VSZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yLCBpbml0QWNjdW0sIGVhY2hGdW5jKSB7CiAgICAgIGVhY2hGdW5jKGNvbGxlY3Rpb24sIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgY29sbGVjdGlvbikgewogICAgICAgIGFjY3VtdWxhdG9yID0gaW5pdEFjY3VtCiAgICAgICAgICA/IChpbml0QWNjdW0gPSBmYWxzZSwgdmFsdWUpCiAgICAgICAgICA6IGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pOwogICAgICB9KTsKICAgICAgcmV0dXJuIGFjY3VtdWxhdG9yOwogICAgfQoKICAgIHZhciBfYmFzZVJlZHVjZSA9IGJhc2VSZWR1Y2U7CgogICAgLyoqCiAgICAgKiBSZWR1Y2VzIGBjb2xsZWN0aW9uYCB0byBhIHZhbHVlIHdoaWNoIGlzIHRoZSBhY2N1bXVsYXRlZCByZXN1bHQgb2YgcnVubmluZwogICAgICogZWFjaCBlbGVtZW50IGluIGBjb2xsZWN0aW9uYCB0aHJ1IGBpdGVyYXRlZWAsIHdoZXJlIGVhY2ggc3VjY2Vzc2l2ZQogICAgICogaW52b2NhdGlvbiBpcyBzdXBwbGllZCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBwcmV2aW91cy4gSWYgYGFjY3VtdWxhdG9yYAogICAgICogaXMgbm90IGdpdmVuLCB0aGUgZmlyc3QgZWxlbWVudCBvZiBgY29sbGVjdGlvbmAgaXMgdXNlZCBhcyB0aGUgaW5pdGlhbAogICAgICogdmFsdWUuIFRoZSBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6CiAgICAgKiAoYWNjdW11bGF0b3IsIHZhbHVlLCBpbmRleHxrZXksIGNvbGxlY3Rpb24pLgogICAgICoKICAgICAqIE1hbnkgbG9kYXNoIG1ldGhvZHMgYXJlIGd1YXJkZWQgdG8gd29yayBhcyBpdGVyYXRlZXMgZm9yIG1ldGhvZHMgbGlrZQogICAgICogYF8ucmVkdWNlYCwgYF8ucmVkdWNlUmlnaHRgLCBhbmQgYF8udHJhbnNmb3JtYC4KICAgICAqCiAgICAgKiBUaGUgZ3VhcmRlZCBtZXRob2RzIGFyZToKICAgICAqIGBhc3NpZ25gLCBgZGVmYXVsdHNgLCBgZGVmYXVsdHNEZWVwYCwgYGluY2x1ZGVzYCwgYG1lcmdlYCwgYG9yZGVyQnlgLAogICAgICogYW5kIGBzb3J0QnlgCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHBhcmFtIHsqfSBbYWNjdW11bGF0b3JdIFRoZSBpbml0aWFsIHZhbHVlLgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGFjY3VtdWxhdGVkIHZhbHVlLgogICAgICogQHNlZSBfLnJlZHVjZVJpZ2h0CiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8ucmVkdWNlKFsxLCAyXSwgZnVuY3Rpb24oc3VtLCBuKSB7CiAgICAgKiAgIHJldHVybiBzdW0gKyBuOwogICAgICogfSwgMCk7CiAgICAgKiAvLyA9PiAzCiAgICAgKgogICAgICogXy5yZWR1Y2UoeyAnYSc6IDEsICdiJzogMiwgJ2MnOiAxIH0sIGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkgewogICAgICogICAocmVzdWx0W3ZhbHVlXSB8fCAocmVzdWx0W3ZhbHVlXSA9IFtdKSkucHVzaChrZXkpOwogICAgICogICByZXR1cm4gcmVzdWx0OwogICAgICogfSwge30pOwogICAgICogLy8gPT4geyAnMSc6IFsnYScsICdjJ10sICcyJzogWydiJ10gfSAoaXRlcmF0aW9uIG9yZGVyIGlzIG5vdCBndWFyYW50ZWVkKQogICAgICovCiAgICBmdW5jdGlvbiByZWR1Y2UoY29sbGVjdGlvbiwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7CiAgICAgIHZhciBmdW5jID0gaXNBcnJheV8xKGNvbGxlY3Rpb24pID8gX2FycmF5UmVkdWNlIDogX2Jhc2VSZWR1Y2UsCiAgICAgICAgICBpbml0QWNjdW0gPSBhcmd1bWVudHMubGVuZ3RoIDwgMzsKCiAgICAgIHJldHVybiBmdW5jKGNvbGxlY3Rpb24sIF9iYXNlSXRlcmF0ZWUoaXRlcmF0ZWUpLCBhY2N1bXVsYXRvciwgaW5pdEFjY3VtLCBfYmFzZUVhY2gpOwogICAgfQoKICAgIHZhciByZWR1Y2VfMSA9IHJlZHVjZTsKCiAgICAvKiogYE9iamVjdCN0b1N0cmluZ2AgcmVzdWx0IHJlZmVyZW5jZXMuICovCiAgICB2YXIgc3RyaW5nVGFnJDQgPSAnW29iamVjdCBTdHJpbmddJzsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGNsYXNzaWZpZWQgYXMgYSBgU3RyaW5nYCBwcmltaXRpdmUgb3Igb2JqZWN0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGEgc3RyaW5nLCBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNTdHJpbmcoJ2FiYycpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNTdHJpbmcoMSk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBpc1N0cmluZyh2YWx1ZSkgewogICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09ICdzdHJpbmcnIHx8CiAgICAgICAgKCFpc0FycmF5XzEodmFsdWUpICYmIGlzT2JqZWN0TGlrZV8xKHZhbHVlKSAmJiBfYmFzZUdldFRhZyh2YWx1ZSkgPT0gc3RyaW5nVGFnJDQpOwogICAgfQoKICAgIHZhciBpc1N0cmluZ18xID0gaXNTdHJpbmc7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGFuIEFTQ0lJIGBzdHJpbmdgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgaW5zcGVjdC4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLgogICAgICovCiAgICB2YXIgYXNjaWlTaXplID0gX2Jhc2VQcm9wZXJ0eSgnbGVuZ3RoJyk7CgogICAgdmFyIF9hc2NpaVNpemUgPSBhc2NpaVNpemU7CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNoYXJhY3RlciBjbGFzc2VzLiAqLwogICAgdmFyIHJzQXN0cmFsUmFuZ2UgPSAnXFx1ZDgwMC1cXHVkZmZmJywKICAgICAgICByc0NvbWJvTWFya3NSYW5nZSA9ICdcXHUwMzAwLVxcdTAzNmYnLAogICAgICAgIHJlQ29tYm9IYWxmTWFya3NSYW5nZSA9ICdcXHVmZTIwLVxcdWZlMmYnLAogICAgICAgIHJzQ29tYm9TeW1ib2xzUmFuZ2UgPSAnXFx1MjBkMC1cXHUyMGZmJywKICAgICAgICByc0NvbWJvUmFuZ2UgPSByc0NvbWJvTWFya3NSYW5nZSArIHJlQ29tYm9IYWxmTWFya3NSYW5nZSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UsCiAgICAgICAgcnNWYXJSYW5nZSA9ICdcXHVmZTBlXFx1ZmUwZic7CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIGNhcHR1cmUgZ3JvdXBzLiAqLwogICAgdmFyIHJzWldKID0gJ1xcdTIwMGQnOwoKICAgIC8qKiBVc2VkIHRvIGRldGVjdCBzdHJpbmdzIHdpdGggW3plcm8td2lkdGggam9pbmVycyBvciBjb2RlIHBvaW50cyBmcm9tIHRoZSBhc3RyYWwgcGxhbmVzXShodHRwOi8vZWV2LmVlL2Jsb2cvMjAxNS8wOS8xMi9kYXJrLWNvcm5lcnMtb2YtdW5pY29kZS8pLiAqLwogICAgdmFyIHJlSGFzVW5pY29kZSA9IFJlZ0V4cCgnWycgKyByc1pXSiArIHJzQXN0cmFsUmFuZ2UgICsgcnNDb21ib1JhbmdlICsgcnNWYXJSYW5nZSArICddJyk7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgYHN0cmluZ2AgY29udGFpbnMgVW5pY29kZSBzeW1ib2xzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBhIHN5bWJvbCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBoYXNVbmljb2RlKHN0cmluZykgewogICAgICByZXR1cm4gcmVIYXNVbmljb2RlLnRlc3Qoc3RyaW5nKTsKICAgIH0KCiAgICB2YXIgX2hhc1VuaWNvZGUgPSBoYXNVbmljb2RlOwoKICAgIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjaGFyYWN0ZXIgY2xhc3Nlcy4gKi8KICAgIHZhciByc0FzdHJhbFJhbmdlJDEgPSAnXFx1ZDgwMC1cXHVkZmZmJywKICAgICAgICByc0NvbWJvTWFya3NSYW5nZSQxID0gJ1xcdTAzMDAtXFx1MDM2ZicsCiAgICAgICAgcmVDb21ib0hhbGZNYXJrc1JhbmdlJDEgPSAnXFx1ZmUyMC1cXHVmZTJmJywKICAgICAgICByc0NvbWJvU3ltYm9sc1JhbmdlJDEgPSAnXFx1MjBkMC1cXHUyMGZmJywKICAgICAgICByc0NvbWJvUmFuZ2UkMSA9IHJzQ29tYm9NYXJrc1JhbmdlJDEgKyByZUNvbWJvSGFsZk1hcmtzUmFuZ2UkMSArIHJzQ29tYm9TeW1ib2xzUmFuZ2UkMSwKICAgICAgICByc1ZhclJhbmdlJDEgPSAnXFx1ZmUwZVxcdWZlMGYnOwoKICAgIC8qKiBVc2VkIHRvIGNvbXBvc2UgdW5pY29kZSBjYXB0dXJlIGdyb3Vwcy4gKi8KICAgIHZhciByc0FzdHJhbCA9ICdbJyArIHJzQXN0cmFsUmFuZ2UkMSArICddJywKICAgICAgICByc0NvbWJvID0gJ1snICsgcnNDb21ib1JhbmdlJDEgKyAnXScsCiAgICAgICAgcnNGaXR6ID0gJ1xcdWQ4M2NbXFx1ZGZmYi1cXHVkZmZmXScsCiAgICAgICAgcnNNb2RpZmllciA9ICcoPzonICsgcnNDb21ibyArICd8JyArIHJzRml0eiArICcpJywKICAgICAgICByc05vbkFzdHJhbCA9ICdbXicgKyByc0FzdHJhbFJhbmdlJDEgKyAnXScsCiAgICAgICAgcnNSZWdpb25hbCA9ICcoPzpcXHVkODNjW1xcdWRkZTYtXFx1ZGRmZl0pezJ9JywKICAgICAgICByc1N1cnJQYWlyID0gJ1tcXHVkODAwLVxcdWRiZmZdW1xcdWRjMDAtXFx1ZGZmZl0nLAogICAgICAgIHJzWldKJDEgPSAnXFx1MjAwZCc7CgogICAgLyoqIFVzZWQgdG8gY29tcG9zZSB1bmljb2RlIHJlZ2V4ZXMuICovCiAgICB2YXIgcmVPcHRNb2QgPSByc01vZGlmaWVyICsgJz8nLAogICAgICAgIHJzT3B0VmFyID0gJ1snICsgcnNWYXJSYW5nZSQxICsgJ10/JywKICAgICAgICByc09wdEpvaW4gPSAnKD86JyArIHJzWldKJDEgKyAnKD86JyArIFtyc05vbkFzdHJhbCwgcnNSZWdpb25hbCwgcnNTdXJyUGFpcl0uam9pbignfCcpICsgJyknICsgcnNPcHRWYXIgKyByZU9wdE1vZCArICcpKicsCiAgICAgICAgcnNTZXEgPSByc09wdFZhciArIHJlT3B0TW9kICsgcnNPcHRKb2luLAogICAgICAgIHJzU3ltYm9sID0gJyg/OicgKyBbcnNOb25Bc3RyYWwgKyByc0NvbWJvICsgJz8nLCByc0NvbWJvLCByc1JlZ2lvbmFsLCByc1N1cnJQYWlyLCByc0FzdHJhbF0uam9pbignfCcpICsgJyknOwoKICAgIC8qKiBVc2VkIHRvIG1hdGNoIFtzdHJpbmcgc3ltYm9sc10oaHR0cHM6Ly9tYXRoaWFzYnluZW5zLmJlL25vdGVzL2phdmFzY3JpcHQtdW5pY29kZSkuICovCiAgICB2YXIgcmVVbmljb2RlID0gUmVnRXhwKHJzRml0eiArICcoPz0nICsgcnNGaXR6ICsgJyl8JyArIHJzU3ltYm9sICsgcnNTZXEsICdnJyk7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGEgVW5pY29kZSBgc3RyaW5nYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtzdHJpbmd9IHN0cmluZyBUaGUgc3RyaW5nIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzdHJpbmcgc2l6ZS4KICAgICAqLwogICAgZnVuY3Rpb24gdW5pY29kZVNpemUoc3RyaW5nKSB7CiAgICAgIHZhciByZXN1bHQgPSByZVVuaWNvZGUubGFzdEluZGV4ID0gMDsKICAgICAgd2hpbGUgKHJlVW5pY29kZS50ZXN0KHN0cmluZykpIHsKICAgICAgICArK3Jlc3VsdDsKICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfdW5pY29kZVNpemUgPSB1bmljb2RlU2l6ZTsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIG51bWJlciBvZiBzeW1ib2xzIGluIGBzdHJpbmdgLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gaW5zcGVjdC4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIHN0cmluZyBzaXplLgogICAgICovCiAgICBmdW5jdGlvbiBzdHJpbmdTaXplKHN0cmluZykgewogICAgICByZXR1cm4gX2hhc1VuaWNvZGUoc3RyaW5nKQogICAgICAgID8gX3VuaWNvZGVTaXplKHN0cmluZykKICAgICAgICA6IF9hc2NpaVNpemUoc3RyaW5nKTsKICAgIH0KCiAgICB2YXIgX3N0cmluZ1NpemUgPSBzdHJpbmdTaXplOwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBtYXBUYWckNyA9ICdbb2JqZWN0IE1hcF0nLAogICAgICAgIHNldFRhZyQ3ID0gJ1tvYmplY3QgU2V0XSc7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBzaXplIG9mIGBjb2xsZWN0aW9uYCBieSByZXR1cm5pbmcgaXRzIGxlbmd0aCBmb3IgYXJyYXktbGlrZQogICAgICogdmFsdWVzIG9yIHRoZSBudW1iZXIgb2Ygb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnRpZXMgZm9yIG9iamVjdHMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fHN0cmluZ30gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpbnNwZWN0LgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgY29sbGVjdGlvbiBzaXplLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLnNpemUoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IDMKICAgICAqCiAgICAgKiBfLnNpemUoeyAnYSc6IDEsICdiJzogMiB9KTsKICAgICAqIC8vID0+IDIKICAgICAqCiAgICAgKiBfLnNpemUoJ3BlYmJsZXMnKTsKICAgICAqIC8vID0+IDcKICAgICAqLwogICAgZnVuY3Rpb24gc2l6ZShjb2xsZWN0aW9uKSB7CiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKICAgICAgICByZXR1cm4gMDsKICAgICAgfQogICAgICBpZiAoaXNBcnJheUxpa2VfMShjb2xsZWN0aW9uKSkgewogICAgICAgIHJldHVybiBpc1N0cmluZ18xKGNvbGxlY3Rpb24pID8gX3N0cmluZ1NpemUoY29sbGVjdGlvbikgOiBjb2xsZWN0aW9uLmxlbmd0aDsKICAgICAgfQogICAgICB2YXIgdGFnID0gX2dldFRhZyhjb2xsZWN0aW9uKTsKICAgICAgaWYgKHRhZyA9PSBtYXBUYWckNyB8fCB0YWcgPT0gc2V0VGFnJDcpIHsKICAgICAgICByZXR1cm4gY29sbGVjdGlvbi5zaXplOwogICAgICB9CiAgICAgIHJldHVybiBfYmFzZUtleXMoY29sbGVjdGlvbikubGVuZ3RoOwogICAgfQoKICAgIHZhciBzaXplXzEgPSBzaXplOwoKICAgIC8qKgogICAgICogQW4gYWx0ZXJuYXRpdmUgdG8gYF8ucmVkdWNlYDsgdGhpcyBtZXRob2QgdHJhbnNmb3JtcyBgb2JqZWN0YCB0byBhIG5ldwogICAgICogYGFjY3VtdWxhdG9yYCBvYmplY3Qgd2hpY2ggaXMgdGhlIHJlc3VsdCBvZiBydW5uaW5nIGVhY2ggb2YgaXRzIG93bgogICAgICogZW51bWVyYWJsZSBzdHJpbmcga2V5ZWQgcHJvcGVydGllcyB0aHJ1IGBpdGVyYXRlZWAsIHdpdGggZWFjaCBpbnZvY2F0aW9uCiAgICAgKiBwb3RlbnRpYWxseSBtdXRhdGluZyB0aGUgYGFjY3VtdWxhdG9yYCBvYmplY3QuIElmIGBhY2N1bXVsYXRvcmAgaXMgbm90CiAgICAgKiBwcm92aWRlZCwgYSBuZXcgb2JqZWN0IHdpdGggdGhlIHNhbWUgYFtbUHJvdG90eXBlXV1gIHdpbGwgYmUgdXNlZC4gVGhlCiAgICAgKiBpdGVyYXRlZSBpcyBpbnZva2VkIHdpdGggZm91ciBhcmd1bWVudHM6IChhY2N1bXVsYXRvciwgdmFsdWUsIGtleSwgb2JqZWN0KS4KICAgICAqIEl0ZXJhdGVlIGZ1bmN0aW9ucyBtYXkgZXhpdCBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDEuMy4wCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0geyp9IFthY2N1bXVsYXRvcl0gVGhlIGN1c3RvbSBhY2N1bXVsYXRvciB2YWx1ZS4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBhY2N1bXVsYXRlZCB2YWx1ZS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy50cmFuc2Zvcm0oWzIsIDMsIDRdLCBmdW5jdGlvbihyZXN1bHQsIG4pIHsKICAgICAqICAgcmVzdWx0LnB1c2gobiAqPSBuKTsKICAgICAqICAgcmV0dXJuIG4gJSAyID09IDA7CiAgICAgKiB9LCBbXSk7CiAgICAgKiAvLyA9PiBbNCwgOV0KICAgICAqCiAgICAgKiBfLnRyYW5zZm9ybSh7ICdhJzogMSwgJ2InOiAyLCAnYyc6IDEgfSwgZnVuY3Rpb24ocmVzdWx0LCB2YWx1ZSwga2V5KSB7CiAgICAgKiAgIChyZXN1bHRbdmFsdWVdIHx8IChyZXN1bHRbdmFsdWVdID0gW10pKS5wdXNoKGtleSk7CiAgICAgKiB9LCB7fSk7CiAgICAgKiAvLyA9PiB7ICcxJzogWydhJywgJ2MnXSwgJzInOiBbJ2InXSB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRyYW5zZm9ybSQ0KG9iamVjdCwgaXRlcmF0ZWUsIGFjY3VtdWxhdG9yKSB7CiAgICAgIHZhciBpc0FyciA9IGlzQXJyYXlfMShvYmplY3QpLAogICAgICAgICAgaXNBcnJMaWtlID0gaXNBcnIgfHwgaXNCdWZmZXJfMShvYmplY3QpIHx8IGlzVHlwZWRBcnJheV8xKG9iamVjdCk7CgogICAgICBpdGVyYXRlZSA9IF9iYXNlSXRlcmF0ZWUoaXRlcmF0ZWUpOwogICAgICBpZiAoYWNjdW11bGF0b3IgPT0gbnVsbCkgewogICAgICAgIHZhciBDdG9yID0gb2JqZWN0ICYmIG9iamVjdC5jb25zdHJ1Y3RvcjsKICAgICAgICBpZiAoaXNBcnJMaWtlKSB7CiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzQXJyID8gbmV3IEN0b3IgOiBbXTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3RfMShvYmplY3QpKSB7CiAgICAgICAgICBhY2N1bXVsYXRvciA9IGlzRnVuY3Rpb25fMShDdG9yKSA/IF9iYXNlQ3JlYXRlKF9nZXRQcm90b3R5cGUob2JqZWN0KSkgOiB7fTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICBhY2N1bXVsYXRvciA9IHt9OwogICAgICAgIH0KICAgICAgfQogICAgICAoaXNBcnJMaWtlID8gX2FycmF5RWFjaCA6IF9iYXNlRm9yT3duKShvYmplY3QsIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCwgb2JqZWN0KSB7CiAgICAgICAgcmV0dXJuIGl0ZXJhdGVlKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIG9iamVjdCk7CiAgICAgIH0pOwogICAgICByZXR1cm4gYWNjdW11bGF0b3I7CiAgICB9CgogICAgdmFyIHRyYW5zZm9ybV8xID0gdHJhbnNmb3JtJDQ7CgogICAgLyoqIEJ1aWx0LWluIHZhbHVlIHJlZmVyZW5jZXMuICovCiAgICB2YXIgc3ByZWFkYWJsZVN5bWJvbCA9IF9TeW1ib2wgPyBfU3ltYm9sLmlzQ29uY2F0U3ByZWFkYWJsZSA6IHVuZGVmaW5lZDsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgZmxhdHRlbmFibGUgYGFyZ3VtZW50c2Agb2JqZWN0IG9yIGFycmF5LgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjaGVjay4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdmFsdWVgIGlzIGZsYXR0ZW5hYmxlLCBlbHNlIGBmYWxzZWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRmxhdHRlbmFibGUodmFsdWUpIHsKICAgICAgcmV0dXJuIGlzQXJyYXlfMSh2YWx1ZSkgfHwgaXNBcmd1bWVudHNfMSh2YWx1ZSkgfHwKICAgICAgICAhIShzcHJlYWRhYmxlU3ltYm9sICYmIHZhbHVlICYmIHZhbHVlW3NwcmVhZGFibGVTeW1ib2xdKTsKICAgIH0KCiAgICB2YXIgX2lzRmxhdHRlbmFibGUgPSBpc0ZsYXR0ZW5hYmxlOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uZmxhdHRlbmAgd2l0aCBzdXBwb3J0IGZvciByZXN0cmljdGluZyBmbGF0dGVuaW5nLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBkZXB0aCBUaGUgbWF4aW11bSByZWN1cnNpb24gZGVwdGguCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtwcmVkaWNhdGU9aXNGbGF0dGVuYWJsZV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2lzU3RyaWN0XSBSZXN0cmljdCB0byB2YWx1ZXMgdGhhdCBwYXNzIGBwcmVkaWNhdGVgIGNoZWNrcy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IFtyZXN1bHQ9W11dIFRoZSBpbml0aWFsIHJlc3VsdCB2YWx1ZS4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUZsYXR0ZW4oYXJyYXksIGRlcHRoLCBwcmVkaWNhdGUsIGlzU3RyaWN0LCByZXN1bHQpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICBwcmVkaWNhdGUgfHwgKHByZWRpY2F0ZSA9IF9pc0ZsYXR0ZW5hYmxlKTsKICAgICAgcmVzdWx0IHx8IChyZXN1bHQgPSBbXSk7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciB2YWx1ZSA9IGFycmF5W2luZGV4XTsKICAgICAgICBpZiAoZGVwdGggPiAwICYmIHByZWRpY2F0ZSh2YWx1ZSkpIHsKICAgICAgICAgIGlmIChkZXB0aCA+IDEpIHsKICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZmxhdHRlbiBhcnJheXMgKHN1c2NlcHRpYmxlIHRvIGNhbGwgc3RhY2sgbGltaXRzKS4KICAgICAgICAgICAgYmFzZUZsYXR0ZW4odmFsdWUsIGRlcHRoIC0gMSwgcHJlZGljYXRlLCBpc1N0cmljdCwgcmVzdWx0KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIF9hcnJheVB1c2gocmVzdWx0LCB2YWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmICghaXNTdHJpY3QpIHsKICAgICAgICAgIHJlc3VsdFtyZXN1bHQubGVuZ3RoXSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfYmFzZUZsYXR0ZW4gPSBiYXNlRmxhdHRlbjsKCiAgICAvKioKICAgICAqIEEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIGBGdW5jdGlvbiNhcHBseWAsIHRoaXMgZnVuY3Rpb24gaW52b2tlcyBgZnVuY2AKICAgICAqIHdpdGggdGhlIGB0aGlzYCBiaW5kaW5nIG9mIGB0aGlzQXJnYCBhbmQgdGhlIGFyZ3VtZW50cyBvZiBgYXJnc2AuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGludm9rZS4KICAgICAqIEBwYXJhbSB7Kn0gdGhpc0FyZyBUaGUgYHRoaXNgIGJpbmRpbmcgb2YgYGZ1bmNgLgogICAgICogQHBhcmFtIHtBcnJheX0gYXJncyBUaGUgYXJndW1lbnRzIHRvIGludm9rZSBgZnVuY2Agd2l0aC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSByZXN1bHQgb2YgYGZ1bmNgLgogICAgICovCiAgICBmdW5jdGlvbiBhcHBseShmdW5jLCB0aGlzQXJnLCBhcmdzKSB7CiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZyk7CiAgICAgICAgY2FzZSAxOiByZXR1cm4gZnVuYy5jYWxsKHRoaXNBcmcsIGFyZ3NbMF0pOwogICAgICAgIGNhc2UgMjogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzQXJnLCBhcmdzWzBdLCBhcmdzWzFdKTsKICAgICAgICBjYXNlIDM6IHJldHVybiBmdW5jLmNhbGwodGhpc0FyZywgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpc0FyZywgYXJncyk7CiAgICB9CgogICAgdmFyIF9hcHBseSA9IGFwcGx5OwoKICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KICAgIHZhciBuYXRpdmVNYXggPSBNYXRoLm1heDsKCiAgICAvKioKICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIHRyYW5zZm9ybXMgdGhlIHJlc3QgYXJyYXkuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB0cmFuc2Zvcm0gVGhlIHJlc3QgYXJyYXkgdHJhbnNmb3JtLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIG92ZXJSZXN0KGZ1bmMsIHN0YXJ0LCB0cmFuc2Zvcm0pIHsKICAgICAgc3RhcnQgPSBuYXRpdmVNYXgoc3RhcnQgPT09IHVuZGVmaW5lZCA/IChmdW5jLmxlbmd0aCAtIDEpIDogc3RhcnQsIDApOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHMsCiAgICAgICAgICAgIGluZGV4ID0gLTEsCiAgICAgICAgICAgIGxlbmd0aCA9IG5hdGl2ZU1heChhcmdzLmxlbmd0aCAtIHN0YXJ0LCAwKSwKICAgICAgICAgICAgYXJyYXkgPSBBcnJheShsZW5ndGgpOwoKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgYXJyYXlbaW5kZXhdID0gYXJnc1tzdGFydCArIGluZGV4XTsKICAgICAgICB9CiAgICAgICAgaW5kZXggPSAtMTsKICAgICAgICB2YXIgb3RoZXJBcmdzID0gQXJyYXkoc3RhcnQgKyAxKTsKICAgICAgICB3aGlsZSAoKytpbmRleCA8IHN0YXJ0KSB7CiAgICAgICAgICBvdGhlckFyZ3NbaW5kZXhdID0gYXJnc1tpbmRleF07CiAgICAgICAgfQogICAgICAgIG90aGVyQXJnc1tzdGFydF0gPSB0cmFuc2Zvcm0oYXJyYXkpOwogICAgICAgIHJldHVybiBfYXBwbHkoZnVuYywgdGhpcywgb3RoZXJBcmdzKTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgX292ZXJSZXN0ID0gb3ZlclJlc3Q7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgc2V0VG9TdHJpbmdgIHdpdGhvdXQgc3VwcG9ydCBmb3IgaG90IGxvb3Agc2hvcnRpbmcuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1vZGlmeS4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHN0cmluZyBUaGUgYHRvU3RyaW5nYCByZXN1bHQuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgYGZ1bmNgLgogICAgICovCiAgICB2YXIgYmFzZVNldFRvU3RyaW5nID0gIV9kZWZpbmVQcm9wZXJ0eSA/IGlkZW50aXR5XzEgOiBmdW5jdGlvbihmdW5jLCBzdHJpbmcpIHsKICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShmdW5jLCAndG9TdHJpbmcnLCB7CiAgICAgICAgJ2NvbmZpZ3VyYWJsZSc6IHRydWUsCiAgICAgICAgJ2VudW1lcmFibGUnOiBmYWxzZSwKICAgICAgICAndmFsdWUnOiBjb25zdGFudF8xKHN0cmluZyksCiAgICAgICAgJ3dyaXRhYmxlJzogdHJ1ZQogICAgICB9KTsKICAgIH07CgogICAgdmFyIF9iYXNlU2V0VG9TdHJpbmcgPSBiYXNlU2V0VG9TdHJpbmc7CgogICAgLyoqIFVzZWQgdG8gZGV0ZWN0IGhvdCBmdW5jdGlvbnMgYnkgbnVtYmVyIG9mIGNhbGxzIHdpdGhpbiBhIHNwYW4gb2YgbWlsbGlzZWNvbmRzLiAqLwogICAgdmFyIEhPVF9DT1VOVCA9IDgwMCwKICAgICAgICBIT1RfU1BBTiA9IDE2OwoKICAgIC8qIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIGZvciB0aG9zZSB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgb3RoZXIgYGxvZGFzaGAgbWV0aG9kcy4gKi8KICAgIHZhciBuYXRpdmVOb3cgPSBEYXRlLm5vdzsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0J2xsIHNob3J0IG91dCBhbmQgaW52b2tlIGBpZGVudGl0eWAgaW5zdGVhZAogICAgICogb2YgYGZ1bmNgIHdoZW4gaXQncyBjYWxsZWQgYEhPVF9DT1VOVGAgb3IgbW9yZSB0aW1lcyBpbiBgSE9UX1NQQU5gCiAgICAgKiBtaWxsaXNlY29uZHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIHJlc3RyaWN0LgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgc2hvcnRhYmxlIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBzaG9ydE91dChmdW5jKSB7CiAgICAgIHZhciBjb3VudCA9IDAsCiAgICAgICAgICBsYXN0Q2FsbGVkID0gMDsKCiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RhbXAgPSBuYXRpdmVOb3coKSwKICAgICAgICAgICAgcmVtYWluaW5nID0gSE9UX1NQQU4gLSAoc3RhbXAgLSBsYXN0Q2FsbGVkKTsKCiAgICAgICAgbGFzdENhbGxlZCA9IHN0YW1wOwogICAgICAgIGlmIChyZW1haW5pbmcgPiAwKSB7CiAgICAgICAgICBpZiAoKytjb3VudCA+PSBIT1RfQ09VTlQpIHsKICAgICAgICAgICAgcmV0dXJuIGFyZ3VtZW50c1swXTsKICAgICAgICAgIH0KICAgICAgICB9IGVsc2UgewogICAgICAgICAgY291bnQgPSAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZnVuYy5hcHBseSh1bmRlZmluZWQsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9zaG9ydE91dCA9IHNob3J0T3V0OwoKICAgIC8qKgogICAgICogU2V0cyB0aGUgYHRvU3RyaW5nYCBtZXRob2Qgb2YgYGZ1bmNgIHRvIHJldHVybiBgc3RyaW5nYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZnVuYyBUaGUgZnVuY3Rpb24gdG8gbW9kaWZ5LgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc3RyaW5nIFRoZSBgdG9TdHJpbmdgIHJlc3VsdC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyBgZnVuY2AuCiAgICAgKi8KICAgIHZhciBzZXRUb1N0cmluZyA9IF9zaG9ydE91dChfYmFzZVNldFRvU3RyaW5nKTsKCiAgICB2YXIgX3NldFRvU3RyaW5nID0gc2V0VG9TdHJpbmc7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5yZXN0YCB3aGljaCBkb2Vzbid0IHZhbGlkYXRlIG9yIGNvZXJjZSBhcmd1bWVudHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGFwcGx5IGEgcmVzdCBwYXJhbWV0ZXIgdG8uCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PWZ1bmMubGVuZ3RoLTFdIFRoZSBzdGFydCBwb3NpdGlvbiBvZiB0aGUgcmVzdCBwYXJhbWV0ZXIuCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZVJlc3QoZnVuYywgc3RhcnQpIHsKICAgICAgcmV0dXJuIF9zZXRUb1N0cmluZyhfb3ZlclJlc3QoZnVuYywgc3RhcnQsIGlkZW50aXR5XzEpLCBmdW5jICsgJycpOwogICAgfQoKICAgIHZhciBfYmFzZVJlc3QgPSBiYXNlUmVzdDsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgIHdpdGhvdXQKICAgICAqIHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gcHJlZGljYXRlIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICogQHJldHVybnMge251bWJlcn0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG1hdGNoZWQgdmFsdWUsIGVsc2UgYC0xYC4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZUZpbmRJbmRleChhcnJheSwgcHJlZGljYXRlLCBmcm9tSW5kZXgsIGZyb21SaWdodCkgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgaW5kZXggPSBmcm9tSW5kZXggKyAoZnJvbVJpZ2h0ID8gMSA6IC0xKTsKCiAgICAgIHdoaWxlICgoZnJvbVJpZ2h0ID8gaW5kZXgtLSA6ICsraW5kZXggPCBsZW5ndGgpKSB7CiAgICAgICAgaWYgKHByZWRpY2F0ZShhcnJheVtpbmRleF0sIGluZGV4LCBhcnJheSkpIHsKICAgICAgICAgIHJldHVybiBpbmRleDsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIC0xOwogICAgfQoKICAgIHZhciBfYmFzZUZpbmRJbmRleCA9IGJhc2VGaW5kSW5kZXg7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5pc05hTmAgd2l0aG91dCBzdXBwb3J0IGZvciBudW1iZXIgb2JqZWN0cy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBgTmFOYCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlSXNOYU4odmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlICE9PSB2YWx1ZTsKICAgIH0KCiAgICB2YXIgX2Jhc2VJc05hTiA9IGJhc2VJc05hTjsKCiAgICAvKioKICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgXy5pbmRleE9mYCB3aGljaCBwZXJmb3JtcyBzdHJpY3QgZXF1YWxpdHkKICAgICAqIGNvbXBhcmlzb25zIG9mIHZhbHVlcywgaS5lLiBgPT09YC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBzZWFyY2ggZm9yLgogICAgICogQHBhcmFtIHtudW1iZXJ9IGZyb21JbmRleCBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCB2YWx1ZSwgZWxzZSBgLTFgLgogICAgICovCiAgICBmdW5jdGlvbiBzdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CiAgICAgIHZhciBpbmRleCA9IGZyb21JbmRleCAtIDEsCiAgICAgICAgICBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIGlmIChhcnJheVtpbmRleF0gPT09IHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiAtMTsKICAgIH0KCiAgICB2YXIgX3N0cmljdEluZGV4T2YgPSBzdHJpY3RJbmRleE9mOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uaW5kZXhPZmAgd2l0aG91dCBgZnJvbUluZGV4YCBib3VuZHMgY2hlY2tzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gZnJvbUluZGV4IFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtYXRjaGVkIHZhbHVlLCBlbHNlIGAtMWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KSB7CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUKICAgICAgICA/IF9zdHJpY3RJbmRleE9mKGFycmF5LCB2YWx1ZSwgZnJvbUluZGV4KQogICAgICAgIDogX2Jhc2VGaW5kSW5kZXgoYXJyYXksIF9iYXNlSXNOYU4sIGZyb21JbmRleCk7CiAgICB9CgogICAgdmFyIF9iYXNlSW5kZXhPZiA9IGJhc2VJbmRleE9mOwoKICAgIC8qKgogICAgICogQSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIGBfLmluY2x1ZGVzYCBmb3IgYXJyYXlzIHdpdGhvdXQgc3VwcG9ydCBmb3IKICAgICAqIHNwZWNpZnlpbmcgYW4gaW5kZXggdG8gc2VhcmNoIGZyb20uCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IFthcnJheV0gVGhlIGFycmF5IHRvIGluc3BlY3QuCiAgICAgKiBAcGFyYW0geyp9IHRhcmdldCBUaGUgdmFsdWUgdG8gc2VhcmNoIGZvci4KICAgICAqIEByZXR1cm5zIHtib29sZWFufSBSZXR1cm5zIGB0cnVlYCBpZiBgdGFyZ2V0YCBpcyBmb3VuZCwgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBhcnJheUluY2x1ZGVzKGFycmF5LCB2YWx1ZSkgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgIHJldHVybiAhIWxlbmd0aCAmJiBfYmFzZUluZGV4T2YoYXJyYXksIHZhbHVlLCAwKSA+IC0xOwogICAgfQoKICAgIHZhciBfYXJyYXlJbmNsdWRlcyA9IGFycmF5SW5jbHVkZXM7CgogICAgLyoqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFycmF5SW5jbHVkZXNgIGV4Y2VwdCB0aGF0IGl0IGFjY2VwdHMgYSBjb21wYXJhdG9yLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBbYXJyYXldIFRoZSBhcnJheSB0byBpbnNwZWN0LgogICAgICogQHBhcmFtIHsqfSB0YXJnZXQgVGhlIHZhbHVlIHRvIHNlYXJjaCBmb3IuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb21wYXJhdG9yIFRoZSBjb21wYXJhdG9yIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHRhcmdldGAgaXMgZm91bmQsIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gYXJyYXlJbmNsdWRlc1dpdGgoYXJyYXksIHZhbHVlLCBjb21wYXJhdG9yKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIGlmIChjb21wYXJhdG9yKHZhbHVlLCBhcnJheVtpbmRleF0pKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIHZhciBfYXJyYXlJbmNsdWRlc1dpdGggPSBhcnJheUluY2x1ZGVzV2l0aDsKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgYHVuZGVmaW5lZGAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAyLjMuMAogICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy50aW1lcygyLCBfLm5vb3ApOwogICAgICogLy8gPT4gW3VuZGVmaW5lZCwgdW5kZWZpbmVkXQogICAgICovCiAgICBmdW5jdGlvbiBub29wJGMoKSB7CiAgICAgIC8vIE5vIG9wZXJhdGlvbiBwZXJmb3JtZWQuCiAgICB9CgogICAgdmFyIG5vb3BfMSA9IG5vb3AkYzsKCiAgICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi8KICAgIHZhciBJTkZJTklUWSQyID0gMSAvIDA7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgc2V0IG9iamVjdCBvZiBgdmFsdWVzYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheX0gdmFsdWVzIFRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoZSBzZXQuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgc2V0LgogICAgICovCiAgICB2YXIgY3JlYXRlU2V0ID0gIShfU2V0ICYmICgxIC8gX3NldFRvQXJyYXkobmV3IF9TZXQoWywtMF0pKVsxXSkgPT0gSU5GSU5JVFkkMikgPyBub29wXzEgOiBmdW5jdGlvbih2YWx1ZXMpIHsKICAgICAgcmV0dXJuIG5ldyBfU2V0KHZhbHVlcyk7CiAgICB9OwoKICAgIHZhciBfY3JlYXRlU2V0ID0gY3JlYXRlU2V0OwoKICAgIC8qKiBVc2VkIGFzIHRoZSBzaXplIHRvIGVuYWJsZSBsYXJnZSBhcnJheSBvcHRpbWl6YXRpb25zLiAqLwogICAgdmFyIExBUkdFX0FSUkFZX1NJWkUkMSA9IDIwMDsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnVuaXFCeWAgd2l0aG91dCBzdXBwb3J0IGZvciBpdGVyYXRlZSBzaG9ydGhhbmRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZV0gVGhlIGl0ZXJhdGVlIGludm9rZWQgcGVyIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbY29tcGFyYXRvcl0gVGhlIGNvbXBhcmF0b3IgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGR1cGxpY2F0ZSBmcmVlIGFycmF5LgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlVW5pcShhcnJheSwgaXRlcmF0ZWUsIGNvbXBhcmF0b3IpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBpbmNsdWRlcyA9IF9hcnJheUluY2x1ZGVzLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoLAogICAgICAgICAgaXNDb21tb24gPSB0cnVlLAogICAgICAgICAgcmVzdWx0ID0gW10sCiAgICAgICAgICBzZWVuID0gcmVzdWx0OwoKICAgICAgaWYgKGNvbXBhcmF0b3IpIHsKICAgICAgICBpc0NvbW1vbiA9IGZhbHNlOwogICAgICAgIGluY2x1ZGVzID0gX2FycmF5SW5jbHVkZXNXaXRoOwogICAgICB9CiAgICAgIGVsc2UgaWYgKGxlbmd0aCA+PSBMQVJHRV9BUlJBWV9TSVpFJDEpIHsKICAgICAgICB2YXIgc2V0ID0gaXRlcmF0ZWUgPyBudWxsIDogX2NyZWF0ZVNldChhcnJheSk7CiAgICAgICAgaWYgKHNldCkgewogICAgICAgICAgcmV0dXJuIF9zZXRUb0FycmF5KHNldCk7CiAgICAgICAgfQogICAgICAgIGlzQ29tbW9uID0gZmFsc2U7CiAgICAgICAgaW5jbHVkZXMgPSBfY2FjaGVIYXM7CiAgICAgICAgc2VlbiA9IG5ldyBfU2V0Q2FjaGU7CiAgICAgIH0KICAgICAgZWxzZSB7CiAgICAgICAgc2VlbiA9IGl0ZXJhdGVlID8gW10gOiByZXN1bHQ7CiAgICAgIH0KICAgICAgb3V0ZXI6CiAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuZ3RoKSB7CiAgICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaW5kZXhdLAogICAgICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlID8gaXRlcmF0ZWUodmFsdWUpIDogdmFsdWU7CgogICAgICAgIHZhbHVlID0gKGNvbXBhcmF0b3IgfHwgdmFsdWUgIT09IDApID8gdmFsdWUgOiAwOwogICAgICAgIGlmIChpc0NvbW1vbiAmJiBjb21wdXRlZCA9PT0gY29tcHV0ZWQpIHsKICAgICAgICAgIHZhciBzZWVuSW5kZXggPSBzZWVuLmxlbmd0aDsKICAgICAgICAgIHdoaWxlIChzZWVuSW5kZXgtLSkgewogICAgICAgICAgICBpZiAoc2VlbltzZWVuSW5kZXhdID09PSBjb21wdXRlZCkgewogICAgICAgICAgICAgIGNvbnRpbnVlIG91dGVyOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoaXRlcmF0ZWUpIHsKICAgICAgICAgICAgc2Vlbi5wdXNoKGNvbXB1dGVkKTsKICAgICAgICAgIH0KICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoIWluY2x1ZGVzKHNlZW4sIGNvbXB1dGVkLCBjb21wYXJhdG9yKSkgewogICAgICAgICAgaWYgKHNlZW4gIT09IHJlc3VsdCkgewogICAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpOwogICAgICAgICAgfQogICAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfYmFzZVVuaXEgPSBiYXNlVW5pcTsKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uaXNBcnJheUxpa2VgIGV4Y2VwdCB0aGF0IGl0IGFsc28gY2hlY2tzIGlmIGB2YWx1ZWAKICAgICAqIGlzIGFuIG9iamVjdC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDQuMC4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhbiBhcnJheS1saWtlIG9iamVjdCwKICAgICAqICBlbHNlIGBmYWxzZWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IHRydWUKICAgICAqCiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KGRvY3VtZW50LmJvZHkuY2hpbGRyZW4pOwogICAgICogLy8gPT4gdHJ1ZQogICAgICoKICAgICAqIF8uaXNBcnJheUxpa2VPYmplY3QoJ2FiYycpOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmlzQXJyYXlMaWtlT2JqZWN0KF8ubm9vcCk7CiAgICAgKiAvLyA9PiBmYWxzZQogICAgICovCiAgICBmdW5jdGlvbiBpc0FycmF5TGlrZU9iamVjdCh2YWx1ZSkgewogICAgICByZXR1cm4gaXNPYmplY3RMaWtlXzEodmFsdWUpICYmIGlzQXJyYXlMaWtlXzEodmFsdWUpOwogICAgfQoKICAgIHZhciBpc0FycmF5TGlrZU9iamVjdF8xID0gaXNBcnJheUxpa2VPYmplY3Q7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGFycmF5IG9mIHVuaXF1ZSB2YWx1ZXMsIGluIG9yZGVyLCBmcm9tIGFsbCBnaXZlbiBhcnJheXMgdXNpbmcKICAgICAqIFtgU2FtZVZhbHVlWmVyb2BdKGh0dHA6Ly9lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzcuMC8jc2VjLXNhbWV2YWx1ZXplcm8pCiAgICAgKiBmb3IgZXF1YWxpdHkgY29tcGFyaXNvbnMuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgKiBAcGFyYW0gey4uLkFycmF5fSBbYXJyYXlzXSBUaGUgYXJyYXlzIHRvIGluc3BlY3QuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIG5ldyBhcnJheSBvZiBjb21iaW5lZCB2YWx1ZXMuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udW5pb24oWzJdLCBbMSwgMl0pOwogICAgICogLy8gPT4gWzIsIDFdCiAgICAgKi8KICAgIHZhciB1bmlvbiA9IF9iYXNlUmVzdChmdW5jdGlvbihhcnJheXMpIHsKICAgICAgcmV0dXJuIF9iYXNlVW5pcShfYmFzZUZsYXR0ZW4oYXJyYXlzLCAxLCBpc0FycmF5TGlrZU9iamVjdF8xLCB0cnVlKSk7CiAgICB9KTsKCiAgICB2YXIgdW5pb25fMSA9IHVuaW9uOwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8udmFsdWVzYCBhbmQgYF8udmFsdWVzSW5gIHdoaWNoIGNyZWF0ZXMgYW4KICAgICAqIGFycmF5IG9mIGBvYmplY3RgIHByb3BlcnR5IHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9wZXJ0eSBuYW1lcwogICAgICogb2YgYHByb3BzYC4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtPYmplY3R9IG9iamVjdCBUaGUgb2JqZWN0IHRvIHF1ZXJ5LgogICAgICogQHBhcmFtIHtBcnJheX0gcHJvcHMgVGhlIHByb3BlcnR5IG5hbWVzIHRvIGdldCB2YWx1ZXMgZm9yLgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgYXJyYXkgb2YgcHJvcGVydHkgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlVmFsdWVzKG9iamVjdCwgcHJvcHMpIHsKICAgICAgcmV0dXJuIF9hcnJheU1hcChwcm9wcywgZnVuY3Rpb24oa2V5KSB7CiAgICAgICAgcmV0dXJuIG9iamVjdFtrZXldOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgX2Jhc2VWYWx1ZXMgPSBiYXNlVmFsdWVzOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiB0aGUgb3duIGVudW1lcmFibGUgc3RyaW5nIGtleWVkIHByb3BlcnR5IHZhbHVlcyBvZiBgb2JqZWN0YC4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogTm9uLW9iamVjdCB2YWx1ZXMgYXJlIGNvZXJjZWQgdG8gb2JqZWN0cy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gcXVlcnkuCiAgICAgKiBAcmV0dXJucyB7QXJyYXl9IFJldHVybnMgdGhlIGFycmF5IG9mIHByb3BlcnR5IHZhbHVlcy4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICogICB0aGlzLmEgPSAxOwogICAgICogICB0aGlzLmIgPSAyOwogICAgICogfQogICAgICoKICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgKgogICAgICogXy52YWx1ZXMobmV3IEZvbyk7CiAgICAgKiAvLyA9PiBbMSwgMl0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKICAgICAqCiAgICAgKiBfLnZhbHVlcygnaGknKTsKICAgICAqIC8vID0+IFsnaCcsICdpJ10KICAgICAqLwogICAgZnVuY3Rpb24gdmFsdWVzJDIob2JqZWN0KSB7CiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbCA/IFtdIDogX2Jhc2VWYWx1ZXMob2JqZWN0LCBrZXlzXzEob2JqZWN0KSk7CiAgICB9CgogICAgdmFyIHZhbHVlc18xID0gdmFsdWVzJDI7CgogICAgLyogZ2xvYmFsIHdpbmRvdyAqLwoKICAgIHZhciBsb2Rhc2gkMTsKCiAgICBpZiAodHlwZW9mIGNvbW1vbmpzUmVxdWlyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICB0cnkgewogICAgICAgIGxvZGFzaCQxID0gewogICAgICAgICAgY2xvbmU6IGNsb25lXzEsCiAgICAgICAgICBjb25zdGFudDogY29uc3RhbnRfMSwKICAgICAgICAgIGVhY2g6IGVhY2gsCiAgICAgICAgICBmaWx0ZXI6IGZpbHRlcl8xLAogICAgICAgICAgaGFzOiAgaGFzXzEsCiAgICAgICAgICBpc0FycmF5OiBpc0FycmF5XzEsCiAgICAgICAgICBpc0VtcHR5OiBpc0VtcHR5XzEsCiAgICAgICAgICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uXzEsCiAgICAgICAgICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWRfMSwKICAgICAgICAgIGtleXM6IGtleXNfMSwKICAgICAgICAgIG1hcDogbWFwXzEsCiAgICAgICAgICByZWR1Y2U6IHJlZHVjZV8xLAogICAgICAgICAgc2l6ZTogc2l6ZV8xLAogICAgICAgICAgdHJhbnNmb3JtOiB0cmFuc2Zvcm1fMSwKICAgICAgICAgIHVuaW9uOiB1bmlvbl8xLAogICAgICAgICAgdmFsdWVzOiB2YWx1ZXNfMQogICAgICAgIH07CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAvLyBjb250aW51ZSByZWdhcmRsZXNzIG9mIGVycm9yCiAgICAgIH0KICAgIH0KCiAgICBpZiAoIWxvZGFzaCQxKSB7CiAgICAgIGxvZGFzaCQxID0gd2luZG93Ll87CiAgICB9CgogICAgdmFyIGxvZGFzaF8xID0gbG9kYXNoJDE7CgogICAgdmFyIGdyYXBoID0gR3JhcGg7CgogICAgdmFyIERFRkFVTFRfRURHRV9OQU1FID0gIlx4MDAiOwogICAgdmFyIEdSQVBIX05PREUgPSAiXHgwMCI7CiAgICB2YXIgRURHRV9LRVlfREVMSU0gPSAiXHgwMSI7CgogICAgLy8gSW1wbGVtZW50YXRpb24gbm90ZXM6CiAgICAvLwogICAgLy8gICogTm9kZSBpZCBxdWVyeSBmdW5jdGlvbnMgc2hvdWxkIHJldHVybiBzdHJpbmcgaWRzIGZvciB0aGUgbm9kZXMKICAgIC8vICAqIEVkZ2UgaWQgcXVlcnkgZnVuY3Rpb25zIHNob3VsZCByZXR1cm4gYW4gImVkZ2VPYmoiLCBlZGdlIG9iamVjdCwgdGhhdCBpcwogICAgLy8gICAgY29tcG9zZWQgb2YgZW5vdWdoIGluZm9ybWF0aW9uIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IGFuIGVkZ2U6IHt2LCB3LCBuYW1lfS4KICAgIC8vICAqIEludGVybmFsbHkgd2UgdXNlIGFuICJlZGdlSWQiLCBhIHN0cmluZ2lmaWVkIGZvcm0gb2YgdGhlIGVkZ2VPYmosIHRvCiAgICAvLyAgICByZWZlcmVuY2UgZWRnZXMuIFRoaXMgaXMgYmVjYXVzZSB3ZSBuZWVkIGEgcGVyZm9ybWFudCB3YXkgdG8gbG9vayB0aGVzZQogICAgLy8gICAgZWRnZXMgdXAgYW5kLCBvYmplY3QgcHJvcGVydGllcywgd2hpY2ggaGF2ZSBzdHJpbmcga2V5cywgYXJlIHRoZSBjbG9zZXN0CiAgICAvLyAgICB3ZSdyZSBnb2luZyB0byBnZXQgdG8gYSBwZXJmb3JtYW50IGhhc2h0YWJsZSBpbiBKYXZhU2NyaXB0LgoKICAgIGZ1bmN0aW9uIEdyYXBoKG9wdHMpIHsKICAgICAgdGhpcy5faXNEaXJlY3RlZCA9IGxvZGFzaF8xLmhhcyhvcHRzLCAiZGlyZWN0ZWQiKSA/IG9wdHMuZGlyZWN0ZWQgOiB0cnVlOwogICAgICB0aGlzLl9pc011bHRpZ3JhcGggPSBsb2Rhc2hfMS5oYXMob3B0cywgIm11bHRpZ3JhcGgiKSA/IG9wdHMubXVsdGlncmFwaCA6IGZhbHNlOwogICAgICB0aGlzLl9pc0NvbXBvdW5kID0gbG9kYXNoXzEuaGFzKG9wdHMsICJjb21wb3VuZCIpID8gb3B0cy5jb21wb3VuZCA6IGZhbHNlOwoKICAgICAgLy8gTGFiZWwgZm9yIHRoZSBncmFwaCBpdHNlbGYKICAgICAgdGhpcy5fbGFiZWwgPSB1bmRlZmluZWQ7CgogICAgICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBub2RlCiAgICAgIHRoaXMuX2RlZmF1bHROb2RlTGFiZWxGbiA9IGxvZGFzaF8xLmNvbnN0YW50KHVuZGVmaW5lZCk7CgogICAgICAvLyBEZWZhdWx0cyB0byBiZSBzZXQgd2hlbiBjcmVhdGluZyBhIG5ldyBlZGdlCiAgICAgIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IGxvZGFzaF8xLmNvbnN0YW50KHVuZGVmaW5lZCk7CgogICAgICAvLyB2IC0+IGxhYmVsCiAgICAgIHRoaXMuX25vZGVzID0ge307CgogICAgICBpZiAodGhpcy5faXNDb21wb3VuZCkgewogICAgICAgIC8vIHYgLT4gcGFyZW50CiAgICAgICAgdGhpcy5fcGFyZW50ID0ge307CgogICAgICAgIC8vIHYgLT4gY2hpbGRyZW4KICAgICAgICB0aGlzLl9jaGlsZHJlbiA9IHt9OwogICAgICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdID0ge307CiAgICAgIH0KCiAgICAgIC8vIHYgLT4gZWRnZU9iagogICAgICB0aGlzLl9pbiA9IHt9OwoKICAgICAgLy8gdSAtPiB2IC0+IE51bWJlcgogICAgICB0aGlzLl9wcmVkcyA9IHt9OwoKICAgICAgLy8gdiAtPiBlZGdlT2JqCiAgICAgIHRoaXMuX291dCA9IHt9OwoKICAgICAgLy8gdiAtPiB3IC0+IE51bWJlcgogICAgICB0aGlzLl9zdWNzID0ge307CgogICAgICAvLyBlIC0+IGVkZ2VPYmoKICAgICAgdGhpcy5fZWRnZU9ianMgPSB7fTsKCiAgICAgIC8vIGUgLT4gbGFiZWwKICAgICAgdGhpcy5fZWRnZUxhYmVscyA9IHt9OwogICAgfQoKICAgIC8qIE51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqLwogICAgR3JhcGgucHJvdG90eXBlLl9ub2RlQ291bnQgPSAwOwoKICAgIC8qIE51bWJlciBvZiBlZGdlcyBpbiB0aGUgZ3JhcGguIFNob3VsZCBvbmx5IGJlIGNoYW5nZWQgYnkgdGhlIGltcGxlbWVudGF0aW9uLiAqLwogICAgR3JhcGgucHJvdG90eXBlLl9lZGdlQ291bnQgPSAwOwoKCiAgICAvKiA9PT0gR3JhcGggZnVuY3Rpb25zID09PT09PT09PSAqLwoKICAgIEdyYXBoLnByb3RvdHlwZS5pc0RpcmVjdGVkID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9pc0RpcmVjdGVkOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuaXNNdWx0aWdyYXBoID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9pc011bHRpZ3JhcGg7CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5pc0NvbXBvdW5kID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9pc0NvbXBvdW5kOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuc2V0R3JhcGggPSBmdW5jdGlvbihsYWJlbCkgewogICAgICB0aGlzLl9sYWJlbCA9IGxhYmVsOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLmdyYXBoID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9sYWJlbDsKICAgIH07CgoKICAgIC8qID09PSBOb2RlIGZ1bmN0aW9ucyA9PT09PT09PT09ICovCgogICAgR3JhcGgucHJvdG90eXBlLnNldERlZmF1bHROb2RlTGFiZWwgPSBmdW5jdGlvbihuZXdEZWZhdWx0KSB7CiAgICAgIGlmICghbG9kYXNoXzEuaXNGdW5jdGlvbihuZXdEZWZhdWx0KSkgewogICAgICAgIG5ld0RlZmF1bHQgPSBsb2Rhc2hfMS5jb25zdGFudChuZXdEZWZhdWx0KTsKICAgICAgfQogICAgICB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4gPSBuZXdEZWZhdWx0OwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLm5vZGVDb3VudCA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fbm9kZUNvdW50OwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUubm9kZXMgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xLmtleXModGhpcy5fbm9kZXMpOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuc291cmNlcyA9IGZ1bmN0aW9uKCkgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIHJldHVybiBsb2Rhc2hfMS5maWx0ZXIodGhpcy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgcmV0dXJuIGxvZGFzaF8xLmlzRW1wdHkoc2VsZi5faW5bdl0pOwogICAgICB9KTsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLnNpbmtzID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgcmV0dXJuIGxvZGFzaF8xLmZpbHRlcih0aGlzLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICByZXR1cm4gbG9kYXNoXzEuaXNFbXB0eShzZWxmLl9vdXRbdl0pOwogICAgICB9KTsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLnNldE5vZGVzID0gZnVuY3Rpb24odnMsIHZhbHVlKSB7CiAgICAgIHZhciBhcmdzID0gYXJndW1lbnRzOwogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIGxvZGFzaF8xLmVhY2godnMsIGZ1bmN0aW9uKHYpIHsKICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKSB7CiAgICAgICAgICBzZWxmLnNldE5vZGUodiwgdmFsdWUpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBzZWxmLnNldE5vZGUodik7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5zZXROb2RlID0gZnVuY3Rpb24odiwgdmFsdWUpIHsKICAgICAgaWYgKGxvZGFzaF8xLmhhcyh0aGlzLl9ub2RlcywgdikpIHsKICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgIHRoaXMuX25vZGVzW3ZdID0gdmFsdWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzOwogICAgICB9CgogICAgICB0aGlzLl9ub2Rlc1t2XSA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0Tm9kZUxhYmVsRm4odik7CiAgICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7CiAgICAgICAgdGhpcy5fcGFyZW50W3ZdID0gR1JBUEhfTk9ERTsKICAgICAgICB0aGlzLl9jaGlsZHJlblt2XSA9IHt9OwogICAgICAgIHRoaXMuX2NoaWxkcmVuW0dSQVBIX05PREVdW3ZdID0gdHJ1ZTsKICAgICAgfQogICAgICB0aGlzLl9pblt2XSA9IHt9OwogICAgICB0aGlzLl9wcmVkc1t2XSA9IHt9OwogICAgICB0aGlzLl9vdXRbdl0gPSB7fTsKICAgICAgdGhpcy5fc3Vjc1t2XSA9IHt9OwogICAgICArK3RoaXMuX25vZGVDb3VudDsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5ub2RlID0gZnVuY3Rpb24odikgewogICAgICByZXR1cm4gdGhpcy5fbm9kZXNbdl07CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5oYXNOb2RlID0gZnVuY3Rpb24odikgewogICAgICByZXR1cm4gbG9kYXNoXzEuaGFzKHRoaXMuX25vZGVzLCB2KTsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLnJlbW92ZU5vZGUgPSAgZnVuY3Rpb24odikgewogICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgIGlmIChsb2Rhc2hfMS5oYXModGhpcy5fbm9kZXMsIHYpKSB7CiAgICAgICAgdmFyIHJlbW92ZUVkZ2UgPSBmdW5jdGlvbihlKSB7IHNlbGYucmVtb3ZlRWRnZShzZWxmLl9lZGdlT2Jqc1tlXSk7IH07CiAgICAgICAgZGVsZXRlIHRoaXMuX25vZGVzW3ZdOwogICAgICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7CiAgICAgICAgICB0aGlzLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCh2KTsKICAgICAgICAgIGRlbGV0ZSB0aGlzLl9wYXJlbnRbdl07CiAgICAgICAgICBsb2Rhc2hfMS5lYWNoKHRoaXMuY2hpbGRyZW4odiksIGZ1bmN0aW9uKGNoaWxkKSB7CiAgICAgICAgICAgIHNlbGYuc2V0UGFyZW50KGNoaWxkKTsKICAgICAgICAgIH0pOwogICAgICAgICAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3ZdOwogICAgICAgIH0KICAgICAgICBsb2Rhc2hfMS5lYWNoKGxvZGFzaF8xLmtleXModGhpcy5faW5bdl0pLCByZW1vdmVFZGdlKTsKICAgICAgICBkZWxldGUgdGhpcy5faW5bdl07CiAgICAgICAgZGVsZXRlIHRoaXMuX3ByZWRzW3ZdOwogICAgICAgIGxvZGFzaF8xLmVhY2gobG9kYXNoXzEua2V5cyh0aGlzLl9vdXRbdl0pLCByZW1vdmVFZGdlKTsKICAgICAgICBkZWxldGUgdGhpcy5fb3V0W3ZdOwogICAgICAgIGRlbGV0ZSB0aGlzLl9zdWNzW3ZdOwogICAgICAgIC0tdGhpcy5fbm9kZUNvdW50OwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuc2V0UGFyZW50ID0gZnVuY3Rpb24odiwgcGFyZW50KSB7CiAgICAgIGlmICghdGhpcy5faXNDb21wb3VuZCkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiQ2Fubm90IHNldCBwYXJlbnQgaW4gYSBub24tY29tcG91bmQgZ3JhcGgiKTsKICAgICAgfQoKICAgICAgaWYgKGxvZGFzaF8xLmlzVW5kZWZpbmVkKHBhcmVudCkpIHsKICAgICAgICBwYXJlbnQgPSBHUkFQSF9OT0RFOwogICAgICB9IGVsc2UgewogICAgICAgIC8vIENvZXJjZSBwYXJlbnQgdG8gc3RyaW5nCiAgICAgICAgcGFyZW50ICs9ICIiOwogICAgICAgIGZvciAodmFyIGFuY2VzdG9yID0gcGFyZW50OwogICAgICAgICAgIWxvZGFzaF8xLmlzVW5kZWZpbmVkKGFuY2VzdG9yKTsKICAgICAgICAgIGFuY2VzdG9yID0gdGhpcy5wYXJlbnQoYW5jZXN0b3IpKSB7CiAgICAgICAgICBpZiAoYW5jZXN0b3IgPT09IHYpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJTZXR0aW5nICIgKyBwYXJlbnQrICIgYXMgcGFyZW50IG9mICIgKyB2ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgd291bGQgY3JlYXRlIGEgY3ljbGUiKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHRoaXMuc2V0Tm9kZShwYXJlbnQpOwogICAgICB9CgogICAgICB0aGlzLnNldE5vZGUodik7CiAgICAgIHRoaXMuX3JlbW92ZUZyb21QYXJlbnRzQ2hpbGRMaXN0KHYpOwogICAgICB0aGlzLl9wYXJlbnRbdl0gPSBwYXJlbnQ7CiAgICAgIHRoaXMuX2NoaWxkcmVuW3BhcmVudF1bdl0gPSB0cnVlOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLl9yZW1vdmVGcm9tUGFyZW50c0NoaWxkTGlzdCA9IGZ1bmN0aW9uKHYpIHsKICAgICAgZGVsZXRlIHRoaXMuX2NoaWxkcmVuW3RoaXMuX3BhcmVudFt2XV1bdl07CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5wYXJlbnQgPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7CiAgICAgICAgdmFyIHBhcmVudCA9IHRoaXMuX3BhcmVudFt2XTsKICAgICAgICBpZiAocGFyZW50ICE9PSBHUkFQSF9OT0RFKSB7CiAgICAgICAgICByZXR1cm4gcGFyZW50OwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuY2hpbGRyZW4gPSBmdW5jdGlvbih2KSB7CiAgICAgIGlmIChsb2Rhc2hfMS5pc1VuZGVmaW5lZCh2KSkgewogICAgICAgIHYgPSBHUkFQSF9OT0RFOwogICAgICB9CgogICAgICBpZiAodGhpcy5faXNDb21wb3VuZCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuX2NoaWxkcmVuW3ZdOwogICAgICAgIGlmIChjaGlsZHJlbikgewogICAgICAgICAgcmV0dXJuIGxvZGFzaF8xLmtleXMoY2hpbGRyZW4pOwogICAgICAgIH0KICAgICAgfSBlbHNlIGlmICh2ID09PSBHUkFQSF9OT0RFKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubm9kZXMoKTsKICAgICAgfSBlbHNlIGlmICh0aGlzLmhhc05vZGUodikpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLnByZWRlY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHsKICAgICAgdmFyIHByZWRzViA9IHRoaXMuX3ByZWRzW3ZdOwogICAgICBpZiAocHJlZHNWKSB7CiAgICAgICAgcmV0dXJuIGxvZGFzaF8xLmtleXMocHJlZHNWKTsKICAgICAgfQogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuc3VjY2Vzc29ycyA9IGZ1bmN0aW9uKHYpIHsKICAgICAgdmFyIHN1Y3NWID0gdGhpcy5fc3Vjc1t2XTsKICAgICAgaWYgKHN1Y3NWKSB7CiAgICAgICAgcmV0dXJuIGxvZGFzaF8xLmtleXMoc3Vjc1YpOwogICAgICB9CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5uZWlnaGJvcnMgPSBmdW5jdGlvbih2KSB7CiAgICAgIHZhciBwcmVkcyA9IHRoaXMucHJlZGVjZXNzb3JzKHYpOwogICAgICBpZiAocHJlZHMpIHsKICAgICAgICByZXR1cm4gbG9kYXNoXzEudW5pb24ocHJlZHMsIHRoaXMuc3VjY2Vzc29ycyh2KSk7CiAgICAgIH0KICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLmlzTGVhZiA9IGZ1bmN0aW9uICh2KSB7CiAgICAgIHZhciBuZWlnaGJvcnM7CiAgICAgIGlmICh0aGlzLmlzRGlyZWN0ZWQoKSkgewogICAgICAgIG5laWdoYm9ycyA9IHRoaXMuc3VjY2Vzc29ycyh2KTsKICAgICAgfSBlbHNlIHsKICAgICAgICBuZWlnaGJvcnMgPSB0aGlzLm5laWdoYm9ycyh2KTsKICAgICAgfQogICAgICByZXR1cm4gbmVpZ2hib3JzLmxlbmd0aCA9PT0gMDsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLmZpbHRlck5vZGVzID0gZnVuY3Rpb24oZmlsdGVyKSB7CiAgICAgIHZhciBjb3B5ID0gbmV3IHRoaXMuY29uc3RydWN0b3IoewogICAgICAgIGRpcmVjdGVkOiB0aGlzLl9pc0RpcmVjdGVkLAogICAgICAgIG11bHRpZ3JhcGg6IHRoaXMuX2lzTXVsdGlncmFwaCwKICAgICAgICBjb21wb3VuZDogdGhpcy5faXNDb21wb3VuZAogICAgICB9KTsKCiAgICAgIGNvcHkuc2V0R3JhcGgodGhpcy5ncmFwaCgpKTsKCiAgICAgIHZhciBzZWxmID0gdGhpczsKICAgICAgbG9kYXNoXzEuZWFjaCh0aGlzLl9ub2RlcywgZnVuY3Rpb24odmFsdWUsIHYpIHsKICAgICAgICBpZiAoZmlsdGVyKHYpKSB7CiAgICAgICAgICBjb3B5LnNldE5vZGUodiwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBsb2Rhc2hfMS5lYWNoKHRoaXMuX2VkZ2VPYmpzLCBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKGNvcHkuaGFzTm9kZShlLnYpICYmIGNvcHkuaGFzTm9kZShlLncpKSB7CiAgICAgICAgICBjb3B5LnNldEVkZ2UoZSwgc2VsZi5lZGdlKGUpKTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgdmFyIHBhcmVudHMgPSB7fTsKICAgICAgZnVuY3Rpb24gZmluZFBhcmVudCh2KSB7CiAgICAgICAgdmFyIHBhcmVudCA9IHNlbGYucGFyZW50KHYpOwogICAgICAgIGlmIChwYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBjb3B5Lmhhc05vZGUocGFyZW50KSkgewogICAgICAgICAgcGFyZW50c1t2XSA9IHBhcmVudDsKICAgICAgICAgIHJldHVybiBwYXJlbnQ7CiAgICAgICAgfSBlbHNlIGlmIChwYXJlbnQgaW4gcGFyZW50cykgewogICAgICAgICAgcmV0dXJuIHBhcmVudHNbcGFyZW50XTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGZpbmRQYXJlbnQocGFyZW50KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGlmICh0aGlzLl9pc0NvbXBvdW5kKSB7CiAgICAgICAgbG9kYXNoXzEuZWFjaChjb3B5Lm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIGNvcHkuc2V0UGFyZW50KHYsIGZpbmRQYXJlbnQodikpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICByZXR1cm4gY29weTsKICAgIH07CgogICAgLyogPT09IEVkZ2UgZnVuY3Rpb25zID09PT09PT09PT0gKi8KCiAgICBHcmFwaC5wcm90b3R5cGUuc2V0RGVmYXVsdEVkZ2VMYWJlbCA9IGZ1bmN0aW9uKG5ld0RlZmF1bHQpIHsKICAgICAgaWYgKCFsb2Rhc2hfMS5pc0Z1bmN0aW9uKG5ld0RlZmF1bHQpKSB7CiAgICAgICAgbmV3RGVmYXVsdCA9IGxvZGFzaF8xLmNvbnN0YW50KG5ld0RlZmF1bHQpOwogICAgICB9CiAgICAgIHRoaXMuX2RlZmF1bHRFZGdlTGFiZWxGbiA9IG5ld0RlZmF1bHQ7CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuZWRnZUNvdW50ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9lZGdlQ291bnQ7CiAgICB9OwoKICAgIEdyYXBoLnByb3RvdHlwZS5lZGdlcyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gbG9kYXNoXzEudmFsdWVzKHRoaXMuX2VkZ2VPYmpzKTsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLnNldFBhdGggPSBmdW5jdGlvbih2cywgdmFsdWUpIHsKICAgICAgdmFyIHNlbGYgPSB0aGlzOwogICAgICB2YXIgYXJncyA9IGFyZ3VtZW50czsKICAgICAgbG9kYXNoXzEucmVkdWNlKHZzLCBmdW5jdGlvbih2LCB3KSB7CiAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMSkgewogICAgICAgICAgc2VsZi5zZXRFZGdlKHYsIHcsIHZhbHVlKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgc2VsZi5zZXRFZGdlKHYsIHcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdzsKICAgICAgfSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICAvKgogICAgICogc2V0RWRnZSh2LCB3LCBbdmFsdWUsIFtuYW1lXV0pCiAgICAgKiBzZXRFZGdlKHsgdiwgdywgW25hbWVdIH0sIFt2YWx1ZV0pCiAgICAgKi8KICAgIEdyYXBoLnByb3RvdHlwZS5zZXRFZGdlID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciB2LCB3LCBuYW1lLCB2YWx1ZTsKICAgICAgdmFyIHZhbHVlU3BlY2lmaWVkID0gZmFsc2U7CiAgICAgIHZhciBhcmcwID0gYXJndW1lbnRzWzBdOwoKICAgICAgaWYgKHR5cGVvZiBhcmcwID09PSAib2JqZWN0IiAmJiBhcmcwICE9PSBudWxsICYmICJ2IiBpbiBhcmcwKSB7CiAgICAgICAgdiA9IGFyZzAudjsKICAgICAgICB3ID0gYXJnMC53OwogICAgICAgIG5hbWUgPSBhcmcwLm5hbWU7CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIpIHsKICAgICAgICAgIHZhbHVlID0gYXJndW1lbnRzWzFdOwogICAgICAgICAgdmFsdWVTcGVjaWZpZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgfSBlbHNlIHsKICAgICAgICB2ID0gYXJnMDsKICAgICAgICB3ID0gYXJndW1lbnRzWzFdOwogICAgICAgIG5hbWUgPSBhcmd1bWVudHNbM107CiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAyKSB7CiAgICAgICAgICB2YWx1ZSA9IGFyZ3VtZW50c1syXTsKICAgICAgICAgIHZhbHVlU3BlY2lmaWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHYgPSAiIiArIHY7CiAgICAgIHcgPSAiIiArIHc7CiAgICAgIGlmICghbG9kYXNoXzEuaXNVbmRlZmluZWQobmFtZSkpIHsKICAgICAgICBuYW1lID0gIiIgKyBuYW1lOwogICAgICB9CgogICAgICB2YXIgZSA9IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKTsKICAgICAgaWYgKGxvZGFzaF8xLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKSkgewogICAgICAgIGlmICh2YWx1ZVNwZWNpZmllZCkgewogICAgICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfQoKICAgICAgaWYgKCFsb2Rhc2hfMS5pc1VuZGVmaW5lZChuYW1lKSAmJiAhdGhpcy5faXNNdWx0aWdyYXBoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJDYW5ub3Qgc2V0IGEgbmFtZWQgZWRnZSB3aGVuIGlzTXVsdGlncmFwaCA9IGZhbHNlIik7CiAgICAgIH0KCiAgICAgIC8vIEl0IGRpZG4ndCBleGlzdCwgc28gd2UgbmVlZCB0byBjcmVhdGUgaXQuCiAgICAgIC8vIEZpcnN0IGVuc3VyZSB0aGUgbm9kZXMgZXhpc3QuCiAgICAgIHRoaXMuc2V0Tm9kZSh2KTsKICAgICAgdGhpcy5zZXROb2RlKHcpOwoKICAgICAgdGhpcy5fZWRnZUxhYmVsc1tlXSA9IHZhbHVlU3BlY2lmaWVkID8gdmFsdWUgOiB0aGlzLl9kZWZhdWx0RWRnZUxhYmVsRm4odiwgdywgbmFtZSk7CgogICAgICB2YXIgZWRnZU9iaiA9IGVkZ2VBcmdzVG9PYmoodGhpcy5faXNEaXJlY3RlZCwgdiwgdywgbmFtZSk7CiAgICAgIC8vIEVuc3VyZSB3ZSBhZGQgdW5kaXJlY3RlZCBlZGdlcyBpbiBhIGNvbnNpc3RlbnQgd2F5LgogICAgICB2ID0gZWRnZU9iai52OwogICAgICB3ID0gZWRnZU9iai53OwoKICAgICAgT2JqZWN0LmZyZWV6ZShlZGdlT2JqKTsKICAgICAgdGhpcy5fZWRnZU9ianNbZV0gPSBlZGdlT2JqOwogICAgICBpbmNyZW1lbnRPckluaXRFbnRyeSh0aGlzLl9wcmVkc1t3XSwgdik7CiAgICAgIGluY3JlbWVudE9ySW5pdEVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpOwogICAgICB0aGlzLl9pblt3XVtlXSA9IGVkZ2VPYmo7CiAgICAgIHRoaXMuX291dFt2XVtlXSA9IGVkZ2VPYmo7CiAgICAgIHRoaXMuX2VkZ2VDb3VudCsrOwogICAgICByZXR1cm4gdGhpczsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLmVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7CiAgICAgIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDEKICAgICAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSkKICAgICAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7CiAgICAgIHJldHVybiB0aGlzLl9lZGdlTGFiZWxzW2VdOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuaGFzRWRnZSA9IGZ1bmN0aW9uKHYsIHcsIG5hbWUpIHsKICAgICAgdmFyIGUgPSAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMQogICAgICAgID8gZWRnZU9ialRvSWQodGhpcy5faXNEaXJlY3RlZCwgYXJndW1lbnRzWzBdKQogICAgICAgIDogZWRnZUFyZ3NUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIHYsIHcsIG5hbWUpKTsKICAgICAgcmV0dXJuIGxvZGFzaF8xLmhhcyh0aGlzLl9lZGdlTGFiZWxzLCBlKTsKICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLnJlbW92ZUVkZ2UgPSBmdW5jdGlvbih2LCB3LCBuYW1lKSB7CiAgICAgIHZhciBlID0gKGFyZ3VtZW50cy5sZW5ndGggPT09IDEKICAgICAgICA/IGVkZ2VPYmpUb0lkKHRoaXMuX2lzRGlyZWN0ZWQsIGFyZ3VtZW50c1swXSkKICAgICAgICA6IGVkZ2VBcmdzVG9JZCh0aGlzLl9pc0RpcmVjdGVkLCB2LCB3LCBuYW1lKSk7CiAgICAgIHZhciBlZGdlID0gdGhpcy5fZWRnZU9ianNbZV07CiAgICAgIGlmIChlZGdlKSB7CiAgICAgICAgdiA9IGVkZ2UudjsKICAgICAgICB3ID0gZWRnZS53OwogICAgICAgIGRlbGV0ZSB0aGlzLl9lZGdlTGFiZWxzW2VdOwogICAgICAgIGRlbGV0ZSB0aGlzLl9lZGdlT2Jqc1tlXTsKICAgICAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3ByZWRzW3ddLCB2KTsKICAgICAgICBkZWNyZW1lbnRPclJlbW92ZUVudHJ5KHRoaXMuX3N1Y3Nbdl0sIHcpOwogICAgICAgIGRlbGV0ZSB0aGlzLl9pblt3XVtlXTsKICAgICAgICBkZWxldGUgdGhpcy5fb3V0W3ZdW2VdOwogICAgICAgIHRoaXMuX2VkZ2VDb3VudC0tOwogICAgICB9CiAgICAgIHJldHVybiB0aGlzOwogICAgfTsKCiAgICBHcmFwaC5wcm90b3R5cGUuaW5FZGdlcyA9IGZ1bmN0aW9uKHYsIHUpIHsKICAgICAgdmFyIGluViA9IHRoaXMuX2luW3ZdOwogICAgICBpZiAoaW5WKSB7CiAgICAgICAgdmFyIGVkZ2VzID0gbG9kYXNoXzEudmFsdWVzKGluVik7CiAgICAgICAgaWYgKCF1KSB7CiAgICAgICAgICByZXR1cm4gZWRnZXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsb2Rhc2hfMS5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudiA9PT0gdTsgfSk7CiAgICAgIH0KICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLm91dEVkZ2VzID0gZnVuY3Rpb24odiwgdykgewogICAgICB2YXIgb3V0ViA9IHRoaXMuX291dFt2XTsKICAgICAgaWYgKG91dFYpIHsKICAgICAgICB2YXIgZWRnZXMgPSBsb2Rhc2hfMS52YWx1ZXMob3V0Vik7CiAgICAgICAgaWYgKCF3KSB7CiAgICAgICAgICByZXR1cm4gZWRnZXM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsb2Rhc2hfMS5maWx0ZXIoZWRnZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIGVkZ2UudyA9PT0gdzsgfSk7CiAgICAgIH0KICAgIH07CgogICAgR3JhcGgucHJvdG90eXBlLm5vZGVFZGdlcyA9IGZ1bmN0aW9uKHYsIHcpIHsKICAgICAgdmFyIGluRWRnZXMgPSB0aGlzLmluRWRnZXModiwgdyk7CiAgICAgIGlmIChpbkVkZ2VzKSB7CiAgICAgICAgcmV0dXJuIGluRWRnZXMuY29uY2F0KHRoaXMub3V0RWRnZXModiwgdykpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGluY3JlbWVudE9ySW5pdEVudHJ5KG1hcCwgaykgewogICAgICBpZiAobWFwW2tdKSB7CiAgICAgICAgbWFwW2tdKys7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgbWFwW2tdID0gMTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlY3JlbWVudE9yUmVtb3ZlRW50cnkobWFwLCBrKSB7CiAgICAgIGlmICghLS1tYXBba10pIHsgZGVsZXRlIG1hcFtrXTsgfQogICAgfQoKICAgIGZ1bmN0aW9uIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCB2Xywgd18sIG5hbWUpIHsKICAgICAgdmFyIHYgPSAiIiArIHZfOwogICAgICB2YXIgdyA9ICIiICsgd187CiAgICAgIGlmICghaXNEaXJlY3RlZCAmJiB2ID4gdykgewogICAgICAgIHZhciB0bXAgPSB2OwogICAgICAgIHYgPSB3OwogICAgICAgIHcgPSB0bXA7CiAgICAgIH0KICAgICAgcmV0dXJuIHYgKyBFREdFX0tFWV9ERUxJTSArIHcgKyBFREdFX0tFWV9ERUxJTSArCiAgICAgICAgICAgICAgICAgKGxvZGFzaF8xLmlzVW5kZWZpbmVkKG5hbWUpID8gREVGQVVMVF9FREdFX05BTUUgOiBuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBlZGdlQXJnc1RvT2JqKGlzRGlyZWN0ZWQsIHZfLCB3XywgbmFtZSkgewogICAgICB2YXIgdiA9ICIiICsgdl87CiAgICAgIHZhciB3ID0gIiIgKyB3XzsKICAgICAgaWYgKCFpc0RpcmVjdGVkICYmIHYgPiB3KSB7CiAgICAgICAgdmFyIHRtcCA9IHY7CiAgICAgICAgdiA9IHc7CiAgICAgICAgdyA9IHRtcDsKICAgICAgfQogICAgICB2YXIgZWRnZU9iaiA9ICB7IHY6IHYsIHc6IHcgfTsKICAgICAgaWYgKG5hbWUpIHsKICAgICAgICBlZGdlT2JqLm5hbWUgPSBuYW1lOwogICAgICB9CiAgICAgIHJldHVybiBlZGdlT2JqOwogICAgfQoKICAgIGZ1bmN0aW9uIGVkZ2VPYmpUb0lkKGlzRGlyZWN0ZWQsIGVkZ2VPYmopIHsKICAgICAgcmV0dXJuIGVkZ2VBcmdzVG9JZChpc0RpcmVjdGVkLCBlZGdlT2JqLnYsIGVkZ2VPYmoudywgZWRnZU9iai5uYW1lKTsKICAgIH0KCiAgICB2YXIgdmVyc2lvbiQ0ID0gJzIuMS44JzsKCiAgICAvLyBJbmNsdWRlcyBvbmx5IHRoZSAiY29yZSIgb2YgZ3JhcGhsaWIKICAgIHZhciBsaWIgPSB7CiAgICAgIEdyYXBoOiBncmFwaCwKICAgICAgdmVyc2lvbjogdmVyc2lvbiQ0CiAgICB9OwoKICAgIHZhciBqc29uJDIgPSB7CiAgICAgIHdyaXRlOiB3cml0ZSwKICAgICAgcmVhZDogcmVhZAogICAgfTsKCiAgICBmdW5jdGlvbiB3cml0ZShnKSB7CiAgICAgIHZhciBqc29uID0gewogICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgIGRpcmVjdGVkOiBnLmlzRGlyZWN0ZWQoKSwKICAgICAgICAgIG11bHRpZ3JhcGg6IGcuaXNNdWx0aWdyYXBoKCksCiAgICAgICAgICBjb21wb3VuZDogZy5pc0NvbXBvdW5kKCkKICAgICAgICB9LAogICAgICAgIG5vZGVzOiB3cml0ZU5vZGVzKGcpLAogICAgICAgIGVkZ2VzOiB3cml0ZUVkZ2VzKGcpCiAgICAgIH07CiAgICAgIGlmICghbG9kYXNoXzEuaXNVbmRlZmluZWQoZy5ncmFwaCgpKSkgewogICAgICAgIGpzb24udmFsdWUgPSBsb2Rhc2hfMS5jbG9uZShnLmdyYXBoKCkpOwogICAgICB9CiAgICAgIHJldHVybiBqc29uOwogICAgfQoKICAgIGZ1bmN0aW9uIHdyaXRlTm9kZXMoZykgewogICAgICByZXR1cm4gbG9kYXNoXzEubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHZhciBub2RlVmFsdWUgPSBnLm5vZGUodik7CiAgICAgICAgdmFyIHBhcmVudCA9IGcucGFyZW50KHYpOwogICAgICAgIHZhciBub2RlID0geyB2OiB2IH07CiAgICAgICAgaWYgKCFsb2Rhc2hfMS5pc1VuZGVmaW5lZChub2RlVmFsdWUpKSB7CiAgICAgICAgICBub2RlLnZhbHVlID0gbm9kZVZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoIWxvZGFzaF8xLmlzVW5kZWZpbmVkKHBhcmVudCkpIHsKICAgICAgICAgIG5vZGUucGFyZW50ID0gcGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gd3JpdGVFZGdlcyhnKSB7CiAgICAgIHJldHVybiBsb2Rhc2hfMS5tYXAoZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGVkZ2VWYWx1ZSA9IGcuZWRnZShlKTsKICAgICAgICB2YXIgZWRnZSA9IHsgdjogZS52LCB3OiBlLncgfTsKICAgICAgICBpZiAoIWxvZGFzaF8xLmlzVW5kZWZpbmVkKGUubmFtZSkpIHsKICAgICAgICAgIGVkZ2UubmFtZSA9IGUubmFtZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFsb2Rhc2hfMS5pc1VuZGVmaW5lZChlZGdlVmFsdWUpKSB7CiAgICAgICAgICBlZGdlLnZhbHVlID0gZWRnZVZhbHVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZWRnZTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVhZChqc29uKSB7CiAgICAgIHZhciBnID0gbmV3IGdyYXBoKGpzb24ub3B0aW9ucykuc2V0R3JhcGgoanNvbi52YWx1ZSk7CiAgICAgIGxvZGFzaF8xLmVhY2goanNvbi5ub2RlcywgZnVuY3Rpb24oZW50cnkpIHsKICAgICAgICBnLnNldE5vZGUoZW50cnkudiwgZW50cnkudmFsdWUpOwogICAgICAgIGlmIChlbnRyeS5wYXJlbnQpIHsKICAgICAgICAgIGcuc2V0UGFyZW50KGVudHJ5LnYsIGVudHJ5LnBhcmVudCk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgbG9kYXNoXzEuZWFjaChqc29uLmVkZ2VzLCBmdW5jdGlvbihlbnRyeSkgewogICAgICAgIGcuc2V0RWRnZSh7IHY6IGVudHJ5LnYsIHc6IGVudHJ5LncsIG5hbWU6IGVudHJ5Lm5hbWUgfSwgZW50cnkudmFsdWUpOwogICAgICB9KTsKICAgICAgcmV0dXJuIGc7CiAgICB9CgogICAgdmFyIGNvbXBvbmVudHNfMSA9IGNvbXBvbmVudHMkMTsKCiAgICBmdW5jdGlvbiBjb21wb25lbnRzJDEoZykgewogICAgICB2YXIgdmlzaXRlZCA9IHt9OwogICAgICB2YXIgY21wdHMgPSBbXTsKICAgICAgdmFyIGNtcHQ7CgogICAgICBmdW5jdGlvbiBkZnModikgewogICAgICAgIGlmIChsb2Rhc2hfMS5oYXModmlzaXRlZCwgdikpIHJldHVybjsKICAgICAgICB2aXNpdGVkW3ZdID0gdHJ1ZTsKICAgICAgICBjbXB0LnB1c2godik7CiAgICAgICAgbG9kYXNoXzEuZWFjaChnLnN1Y2Nlc3NvcnModiksIGRmcyk7CiAgICAgICAgbG9kYXNoXzEuZWFjaChnLnByZWRlY2Vzc29ycyh2KSwgZGZzKTsKICAgICAgfQoKICAgICAgbG9kYXNoXzEuZWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICBjbXB0ID0gW107CiAgICAgICAgZGZzKHYpOwogICAgICAgIGlmIChjbXB0Lmxlbmd0aCkgewogICAgICAgICAgY21wdHMucHVzaChjbXB0KTsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGNtcHRzOwogICAgfQoKICAgIHZhciBwcmlvcml0eVF1ZXVlID0gUHJpb3JpdHlRdWV1ZTsKCiAgICAvKioKICAgICAqIEEgbWluLXByaW9yaXR5IHF1ZXVlIGRhdGEgc3RydWN0dXJlLiBUaGlzIGFsZ29yaXRobSBpcyBkZXJpdmVkIGZyb20gQ29ybWVuLAogICAgICogZXQgYWwuLCAiSW50cm9kdWN0aW9uIHRvIEFsZ29yaXRobXMiLiBUaGUgYmFzaWMgaWRlYSBvZiBhIG1pbi1wcmlvcml0eQogICAgICogcXVldWUgaXMgdGhhdCB5b3UgY2FuIGVmZmljaWVudGx5IChpbiBPKDEpIHRpbWUpIGdldCB0aGUgc21hbGxlc3Qga2V5IGluCiAgICAgKiB0aGUgcXVldWUuIEFkZGluZyBhbmQgcmVtb3ZpbmcgZWxlbWVudHMgdGFrZXMgTyhsb2cgbikgdGltZS4gQSBrZXkgY2FuCiAgICAgKiBoYXZlIGl0cyBwcmlvcml0eSBkZWNyZWFzZWQgaW4gTyhsb2cgbikgdGltZS4KICAgICAqLwogICAgZnVuY3Rpb24gUHJpb3JpdHlRdWV1ZSgpIHsKICAgICAgdGhpcy5fYXJyID0gW107CiAgICAgIHRoaXMuX2tleUluZGljZXMgPSB7fTsKICAgIH0KCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUuIFRha2VzIGBPKDEpYCB0aW1lLgogICAgICovCiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5zaXplID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLl9hcnIubGVuZ3RoOwogICAgfTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGtleXMgdGhhdCBhcmUgaW4gdGhlIHF1ZXVlLiBUYWtlcyBgTyhuKWAgdGltZS4KICAgICAqLwogICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUua2V5cyA9IGZ1bmN0aW9uKCkgewogICAgICByZXR1cm4gdGhpcy5fYXJyLm1hcChmdW5jdGlvbih4KSB7IHJldHVybiB4LmtleTsgfSk7CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyBgdHJ1ZWAgaWYgKiprZXkqKiBpcyBpbiB0aGUgcXVldWUgYW5kIGBmYWxzZWAgaWYgbm90LgogICAgICovCiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5oYXMgPSBmdW5jdGlvbihrZXkpIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xLmhhcyh0aGlzLl9rZXlJbmRpY2VzLCBrZXkpOwogICAgfTsKCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqLiBJZiAqKmtleSoqIGlzIG5vdCBwcmVzZW50IGluIHRoZSBxdWV1ZQogICAgICogdGhlbiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYHVuZGVmaW5lZGAuIFRha2VzIGBPKDEpYCB0aW1lLgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkKICAgICAqLwogICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUucHJpb3JpdHkgPSBmdW5jdGlvbihrZXkpIHsKICAgICAgdmFyIGluZGV4ID0gdGhpcy5fa2V5SW5kaWNlc1trZXldOwogICAgICBpZiAoaW5kZXggIT09IHVuZGVmaW5lZCkgewogICAgICAgIHJldHVybiB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5OwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUga2V5IGZvciB0aGUgbWluaW11bSBlbGVtZW50IGluIHRoaXMgcXVldWUuIElmIHRoZSBxdWV1ZSBpcwogICAgICogZW1wdHkgdGhpcyBmdW5jdGlvbiB0aHJvd3MgYW4gRXJyb3IuIFRha2VzIGBPKDEpYCB0aW1lLgogICAgICovCiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5taW4gPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHRoaXMuc2l6ZSgpID09PSAwKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJRdWV1ZSB1bmRlcmZsb3ciKTsKICAgICAgfQogICAgICByZXR1cm4gdGhpcy5fYXJyWzBdLmtleTsKICAgIH07CgogICAgLyoqCiAgICAgKiBJbnNlcnRzIGEgbmV3IGtleSBpbnRvIHRoZSBwcmlvcml0eSBxdWV1ZS4gSWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbgogICAgICogdGhlIHF1ZXVlIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBgZmFsc2VgOyBvdGhlcndpc2UgaXQgd2lsbCByZXR1cm4gYHRydWVgLgogICAgICogVGFrZXMgYE8obilgIHRpbWUuCiAgICAgKgogICAgICogQHBhcmFtIHtPYmplY3R9IGtleSB0aGUga2V5IHRvIGFkZAogICAgICogQHBhcmFtIHtOdW1iZXJ9IHByaW9yaXR5IHRoZSBpbml0aWFsIHByaW9yaXR5IGZvciB0aGUga2V5CiAgICAgKi8KICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGtleSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIGtleUluZGljZXMgPSB0aGlzLl9rZXlJbmRpY2VzOwogICAgICBrZXkgPSBTdHJpbmcoa2V5KTsKICAgICAgaWYgKCFsb2Rhc2hfMS5oYXMoa2V5SW5kaWNlcywga2V5KSkgewogICAgICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7CiAgICAgICAgdmFyIGluZGV4ID0gYXJyLmxlbmd0aDsKICAgICAgICBrZXlJbmRpY2VzW2tleV0gPSBpbmRleDsKICAgICAgICBhcnIucHVzaCh7a2V5OiBrZXksIHByaW9yaXR5OiBwcmlvcml0eX0pOwogICAgICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICByZXR1cm4gZmFsc2U7CiAgICB9OwoKICAgIC8qKgogICAgICogUmVtb3ZlcyBhbmQgcmV0dXJucyB0aGUgc21hbGxlc3Qga2V5IGluIHRoZSBxdWV1ZS4gVGFrZXMgYE8obG9nIG4pYCB0aW1lLgogICAgICovCiAgICBQcmlvcml0eVF1ZXVlLnByb3RvdHlwZS5yZW1vdmVNaW4gPSBmdW5jdGlvbigpIHsKICAgICAgdGhpcy5fc3dhcCgwLCB0aGlzLl9hcnIubGVuZ3RoIC0gMSk7CiAgICAgIHZhciBtaW4gPSB0aGlzLl9hcnIucG9wKCk7CiAgICAgIGRlbGV0ZSB0aGlzLl9rZXlJbmRpY2VzW21pbi5rZXldOwogICAgICB0aGlzLl9oZWFwaWZ5KDApOwogICAgICByZXR1cm4gbWluLmtleTsKICAgIH07CgogICAgLyoqCiAgICAgKiBEZWNyZWFzZXMgdGhlIHByaW9yaXR5IGZvciAqKmtleSoqIHRvICoqcHJpb3JpdHkqKi4gSWYgdGhlIG5ldyBwcmlvcml0eSBpcwogICAgICogZ3JlYXRlciB0aGFuIHRoZSBwcmV2aW91cyBwcmlvcml0eSwgdGhpcyBmdW5jdGlvbiB3aWxsIHRocm93IGFuIEVycm9yLgogICAgICoKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBrZXkgdGhlIGtleSBmb3Igd2hpY2ggdG8gcmFpc2UgcHJpb3JpdHkKICAgICAqIEBwYXJhbSB7TnVtYmVyfSBwcmlvcml0eSB0aGUgbmV3IHByaW9yaXR5IGZvciB0aGUga2V5CiAgICAgKi8KICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLmRlY3JlYXNlID0gZnVuY3Rpb24oa2V5LCBwcmlvcml0eSkgewogICAgICB2YXIgaW5kZXggPSB0aGlzLl9rZXlJbmRpY2VzW2tleV07CiAgICAgIGlmIChwcmlvcml0eSA+IHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkpIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5ldyBwcmlvcml0eSBpcyBncmVhdGVyIHRoYW4gY3VycmVudCBwcmlvcml0eS4gIiArCiAgICAgICAgICAgICJLZXk6ICIgKyBrZXkgKyAiIE9sZDogIiArIHRoaXMuX2FycltpbmRleF0ucHJpb3JpdHkgKyAiIE5ldzogIiArIHByaW9yaXR5KTsKICAgICAgfQogICAgICB0aGlzLl9hcnJbaW5kZXhdLnByaW9yaXR5ID0gcHJpb3JpdHk7CiAgICAgIHRoaXMuX2RlY3JlYXNlKGluZGV4KTsKICAgIH07CgogICAgUHJpb3JpdHlRdWV1ZS5wcm90b3R5cGUuX2hlYXBpZnkgPSBmdW5jdGlvbihpKSB7CiAgICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7CiAgICAgIHZhciBsID0gMiAqIGk7CiAgICAgIHZhciByID0gbCArIDE7CiAgICAgIHZhciBsYXJnZXN0ID0gaTsKICAgICAgaWYgKGwgPCBhcnIubGVuZ3RoKSB7CiAgICAgICAgbGFyZ2VzdCA9IGFycltsXS5wcmlvcml0eSA8IGFycltsYXJnZXN0XS5wcmlvcml0eSA/IGwgOiBsYXJnZXN0OwogICAgICAgIGlmIChyIDwgYXJyLmxlbmd0aCkgewogICAgICAgICAgbGFyZ2VzdCA9IGFycltyXS5wcmlvcml0eSA8IGFycltsYXJnZXN0XS5wcmlvcml0eSA/IHIgOiBsYXJnZXN0OwogICAgICAgIH0KICAgICAgICBpZiAobGFyZ2VzdCAhPT0gaSkgewogICAgICAgICAgdGhpcy5fc3dhcChpLCBsYXJnZXN0KTsKICAgICAgICAgIHRoaXMuX2hlYXBpZnkobGFyZ2VzdCk7CiAgICAgICAgfQogICAgICB9CiAgICB9OwoKICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLl9kZWNyZWFzZSA9IGZ1bmN0aW9uKGluZGV4KSB7CiAgICAgIHZhciBhcnIgPSB0aGlzLl9hcnI7CiAgICAgIHZhciBwcmlvcml0eSA9IGFycltpbmRleF0ucHJpb3JpdHk7CiAgICAgIHZhciBwYXJlbnQ7CiAgICAgIHdoaWxlIChpbmRleCAhPT0gMCkgewogICAgICAgIHBhcmVudCA9IGluZGV4ID4+IDE7CiAgICAgICAgaWYgKGFycltwYXJlbnRdLnByaW9yaXR5IDwgcHJpb3JpdHkpIHsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl9zd2FwKGluZGV4LCBwYXJlbnQpOwogICAgICAgIGluZGV4ID0gcGFyZW50OwogICAgICB9CiAgICB9OwoKICAgIFByaW9yaXR5UXVldWUucHJvdG90eXBlLl9zd2FwID0gZnVuY3Rpb24oaSwgaikgewogICAgICB2YXIgYXJyID0gdGhpcy5fYXJyOwogICAgICB2YXIga2V5SW5kaWNlcyA9IHRoaXMuX2tleUluZGljZXM7CiAgICAgIHZhciBvcmlnQXJySSA9IGFycltpXTsKICAgICAgdmFyIG9yaWdBcnJKID0gYXJyW2pdOwogICAgICBhcnJbaV0gPSBvcmlnQXJySjsKICAgICAgYXJyW2pdID0gb3JpZ0Fyckk7CiAgICAgIGtleUluZGljZXNbb3JpZ0Fyckoua2V5XSA9IGk7CiAgICAgIGtleUluZGljZXNbb3JpZ0Fyckkua2V5XSA9IGo7CiAgICB9OwoKICAgIHZhciBkaWprc3RyYV8xID0gZGlqa3N0cmE7CgogICAgdmFyIERFRkFVTFRfV0VJR0hUX0ZVTkMgPSBsb2Rhc2hfMS5jb25zdGFudCgxKTsKCiAgICBmdW5jdGlvbiBkaWprc3RyYShnLCBzb3VyY2UsIHdlaWdodEZuLCBlZGdlRm4pIHsKICAgICAgcmV0dXJuIHJ1bkRpamtzdHJhKGcsIFN0cmluZyhzb3VyY2UpLAogICAgICAgIHdlaWdodEZuIHx8IERFRkFVTFRfV0VJR0hUX0ZVTkMsCiAgICAgICAgZWRnZUZuIHx8IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcub3V0RWRnZXModik7IH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJ1bkRpamtzdHJhKGcsIHNvdXJjZSwgd2VpZ2h0Rm4sIGVkZ2VGbikgewogICAgICB2YXIgcmVzdWx0cyA9IHt9OwogICAgICB2YXIgcHEgPSBuZXcgcHJpb3JpdHlRdWV1ZSgpOwogICAgICB2YXIgdiwgdkVudHJ5OwoKICAgICAgdmFyIHVwZGF0ZU5laWdoYm9ycyA9IGZ1bmN0aW9uKGVkZ2UpIHsKICAgICAgICB2YXIgdyA9IGVkZ2UudiAhPT0gdiA/IGVkZ2UudiA6IGVkZ2UudzsKICAgICAgICB2YXIgd0VudHJ5ID0gcmVzdWx0c1t3XTsKICAgICAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZWRnZSk7CiAgICAgICAgdmFyIGRpc3RhbmNlID0gdkVudHJ5LmRpc3RhbmNlICsgd2VpZ2h0OwoKICAgICAgICBpZiAod2VpZ2h0IDwgMCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJkaWprc3RyYSBkb2VzIG5vdCBhbGxvdyBuZWdhdGl2ZSBlZGdlIHdlaWdodHMuICIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICJCYWQgZWRnZTogIiArIGVkZ2UgKyAiIFdlaWdodDogIiArIHdlaWdodCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGlzdGFuY2UgPCB3RW50cnkuZGlzdGFuY2UpIHsKICAgICAgICAgIHdFbnRyeS5kaXN0YW5jZSA9IGRpc3RhbmNlOwogICAgICAgICAgd0VudHJ5LnByZWRlY2Vzc29yID0gdjsKICAgICAgICAgIHBxLmRlY3JlYXNlKHcsIGRpc3RhbmNlKTsKICAgICAgICB9CiAgICAgIH07CgogICAgICBnLm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIGRpc3RhbmNlID0gdiA9PT0gc291cmNlID8gMCA6IE51bWJlci5QT1NJVElWRV9JTkZJTklUWTsKICAgICAgICByZXN1bHRzW3ZdID0geyBkaXN0YW5jZTogZGlzdGFuY2UgfTsKICAgICAgICBwcS5hZGQodiwgZGlzdGFuY2UpOwogICAgICB9KTsKCiAgICAgIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7CiAgICAgICAgdiA9IHBxLnJlbW92ZU1pbigpOwogICAgICAgIHZFbnRyeSA9IHJlc3VsdHNbdl07CiAgICAgICAgaWYgKHZFbnRyeS5kaXN0YW5jZSA9PT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGVkZ2VGbih2KS5mb3JFYWNoKHVwZGF0ZU5laWdoYm9ycyk7CiAgICAgIH0KCiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQoKICAgIHZhciBkaWprc3RyYUFsbF8xID0gZGlqa3N0cmFBbGw7CgogICAgZnVuY3Rpb24gZGlqa3N0cmFBbGwoZywgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xLnRyYW5zZm9ybShnLm5vZGVzKCksIGZ1bmN0aW9uKGFjYywgdikgewogICAgICAgIGFjY1t2XSA9IGRpamtzdHJhXzEoZywgdiwgd2VpZ2h0RnVuYywgZWRnZUZ1bmMpOwogICAgICB9LCB7fSk7CiAgICB9CgogICAgdmFyIHRhcmphbl8xID0gdGFyamFuOwoKICAgIGZ1bmN0aW9uIHRhcmphbihnKSB7CiAgICAgIHZhciBpbmRleCA9IDA7CiAgICAgIHZhciBzdGFjayA9IFtdOwogICAgICB2YXIgdmlzaXRlZCA9IHt9OyAvLyBub2RlIGlkIC0+IHsgb25TdGFjaywgbG93bGluaywgaW5kZXggfQogICAgICB2YXIgcmVzdWx0cyA9IFtdOwoKICAgICAgZnVuY3Rpb24gZGZzKHYpIHsKICAgICAgICB2YXIgZW50cnkgPSB2aXNpdGVkW3ZdID0gewogICAgICAgICAgb25TdGFjazogdHJ1ZSwKICAgICAgICAgIGxvd2xpbms6IGluZGV4LAogICAgICAgICAgaW5kZXg6IGluZGV4KysKICAgICAgICB9OwogICAgICAgIHN0YWNrLnB1c2godik7CgogICAgICAgIGcuc3VjY2Vzc29ycyh2KS5mb3JFYWNoKGZ1bmN0aW9uKHcpIHsKICAgICAgICAgIGlmICghbG9kYXNoXzEuaGFzKHZpc2l0ZWQsIHcpKSB7CiAgICAgICAgICAgIGRmcyh3KTsKICAgICAgICAgICAgZW50cnkubG93bGluayA9IE1hdGgubWluKGVudHJ5Lmxvd2xpbmssIHZpc2l0ZWRbd10ubG93bGluayk7CiAgICAgICAgICB9IGVsc2UgaWYgKHZpc2l0ZWRbd10ub25TdGFjaykgewogICAgICAgICAgICBlbnRyeS5sb3dsaW5rID0gTWF0aC5taW4oZW50cnkubG93bGluaywgdmlzaXRlZFt3XS5pbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGlmIChlbnRyeS5sb3dsaW5rID09PSBlbnRyeS5pbmRleCkgewogICAgICAgICAgdmFyIGNtcHQgPSBbXTsKICAgICAgICAgIHZhciB3OwogICAgICAgICAgZG8gewogICAgICAgICAgICB3ID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIHZpc2l0ZWRbd10ub25TdGFjayA9IGZhbHNlOwogICAgICAgICAgICBjbXB0LnB1c2godyk7CiAgICAgICAgICB9IHdoaWxlICh2ICE9PSB3KTsKICAgICAgICAgIHJlc3VsdHMucHVzaChjbXB0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGcubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsKICAgICAgICBpZiAoIWxvZGFzaF8xLmhhcyh2aXNpdGVkLCB2KSkgewogICAgICAgICAgZGZzKHYpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KCiAgICB2YXIgZmluZEN5Y2xlc18xID0gZmluZEN5Y2xlczsKCiAgICBmdW5jdGlvbiBmaW5kQ3ljbGVzKGcpIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xLmZpbHRlcih0YXJqYW5fMShnKSwgZnVuY3Rpb24oY21wdCkgewogICAgICAgIHJldHVybiBjbXB0Lmxlbmd0aCA+IDEgfHwgKGNtcHQubGVuZ3RoID09PSAxICYmIGcuaGFzRWRnZShjbXB0WzBdLCBjbXB0WzBdKSk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBmbG95ZFdhcnNoYWxsXzEgPSBmbG95ZFdhcnNoYWxsOwoKICAgIHZhciBERUZBVUxUX1dFSUdIVF9GVU5DJDEgPSBsb2Rhc2hfMS5jb25zdGFudCgxKTsKCiAgICBmdW5jdGlvbiBmbG95ZFdhcnNoYWxsKGcsIHdlaWdodEZuLCBlZGdlRm4pIHsKICAgICAgcmV0dXJuIHJ1bkZsb3lkV2Fyc2hhbGwoZywKICAgICAgICB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GVU5DJDEsCiAgICAgICAgZWRnZUZuIHx8IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcub3V0RWRnZXModik7IH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHJ1bkZsb3lkV2Fyc2hhbGwoZywgd2VpZ2h0Rm4sIGVkZ2VGbikgewogICAgICB2YXIgcmVzdWx0cyA9IHt9OwogICAgICB2YXIgbm9kZXMgPSBnLm5vZGVzKCk7CgogICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsKICAgICAgICByZXN1bHRzW3ZdID0ge307CiAgICAgICAgcmVzdWx0c1t2XVt2XSA9IHsgZGlzdGFuY2U6IDAgfTsKICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKHcpIHsKICAgICAgICAgIGlmICh2ICE9PSB3KSB7CiAgICAgICAgICAgIHJlc3VsdHNbdl1bd10gPSB7IGRpc3RhbmNlOiBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgfTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBlZGdlRm4odikuZm9yRWFjaChmdW5jdGlvbihlZGdlKSB7CiAgICAgICAgICB2YXIgdyA9IGVkZ2UudiA9PT0gdiA/IGVkZ2UudyA6IGVkZ2UudjsKICAgICAgICAgIHZhciBkID0gd2VpZ2h0Rm4oZWRnZSk7CiAgICAgICAgICByZXN1bHRzW3ZdW3ddID0geyBkaXN0YW5jZTogZCwgcHJlZGVjZXNzb3I6IHYgfTsKICAgICAgICB9KTsKICAgICAgfSk7CgogICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGspIHsKICAgICAgICB2YXIgcm93SyA9IHJlc3VsdHNba107CiAgICAgICAgbm9kZXMuZm9yRWFjaChmdW5jdGlvbihpKSB7CiAgICAgICAgICB2YXIgcm93SSA9IHJlc3VsdHNbaV07CiAgICAgICAgICBub2Rlcy5mb3JFYWNoKGZ1bmN0aW9uKGopIHsKICAgICAgICAgICAgdmFyIGlrID0gcm93SVtrXTsKICAgICAgICAgICAgdmFyIGtqID0gcm93S1tqXTsKICAgICAgICAgICAgdmFyIGlqID0gcm93SVtqXTsKICAgICAgICAgICAgdmFyIGFsdERpc3RhbmNlID0gaWsuZGlzdGFuY2UgKyBrai5kaXN0YW5jZTsKICAgICAgICAgICAgaWYgKGFsdERpc3RhbmNlIDwgaWouZGlzdGFuY2UpIHsKICAgICAgICAgICAgICBpai5kaXN0YW5jZSA9IGFsdERpc3RhbmNlOwogICAgICAgICAgICAgIGlqLnByZWRlY2Vzc29yID0ga2oucHJlZGVjZXNzb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQoKICAgIHZhciB0b3Bzb3J0XzEgPSB0b3Bzb3J0OwogICAgdG9wc29ydC5DeWNsZUV4Y2VwdGlvbiA9IEN5Y2xlRXhjZXB0aW9uOwoKICAgIGZ1bmN0aW9uIHRvcHNvcnQoZykgewogICAgICB2YXIgdmlzaXRlZCA9IHt9OwogICAgICB2YXIgc3RhY2sgPSB7fTsKICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKCiAgICAgIGZ1bmN0aW9uIHZpc2l0KG5vZGUpIHsKICAgICAgICBpZiAobG9kYXNoXzEuaGFzKHN0YWNrLCBub2RlKSkgewogICAgICAgICAgdGhyb3cgbmV3IEN5Y2xlRXhjZXB0aW9uKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWxvZGFzaF8xLmhhcyh2aXNpdGVkLCBub2RlKSkgewogICAgICAgICAgc3RhY2tbbm9kZV0gPSB0cnVlOwogICAgICAgICAgdmlzaXRlZFtub2RlXSA9IHRydWU7CiAgICAgICAgICBsb2Rhc2hfMS5lYWNoKGcucHJlZGVjZXNzb3JzKG5vZGUpLCB2aXNpdCk7CiAgICAgICAgICBkZWxldGUgc3RhY2tbbm9kZV07CiAgICAgICAgICByZXN1bHRzLnB1c2gobm9kZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBsb2Rhc2hfMS5lYWNoKGcuc2lua3MoKSwgdmlzaXQpOwoKICAgICAgaWYgKGxvZGFzaF8xLnNpemUodmlzaXRlZCkgIT09IGcubm9kZUNvdW50KCkpIHsKICAgICAgICB0aHJvdyBuZXcgQ3ljbGVFeGNlcHRpb24oKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CgogICAgZnVuY3Rpb24gQ3ljbGVFeGNlcHRpb24oKSB7fQogICAgQ3ljbGVFeGNlcHRpb24ucHJvdG90eXBlID0gbmV3IEVycm9yKCk7IC8vIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgRXJyb3IgdG8gcGFzcyB0ZXN0aW5nCgogICAgdmFyIGlzQWN5Y2xpY18xID0gaXNBY3ljbGljOwoKICAgIGZ1bmN0aW9uIGlzQWN5Y2xpYyhnKSB7CiAgICAgIHRyeSB7CiAgICAgICAgdG9wc29ydF8xKGcpOwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiB0b3Bzb3J0XzEuQ3ljbGVFeGNlcHRpb24pIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgZTsKICAgICAgfQogICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KCiAgICB2YXIgZGZzXzEgPSBkZnM7CgogICAgLyoKICAgICAqIEEgaGVscGVyIHRoYXQgcHJlZm9ybXMgYSBwcmUtIG9yIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9uIHRoZSBpbnB1dCBncmFwaAogICAgICogYW5kIHJldHVybnMgdGhlIG5vZGVzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgdmlzaXRlZC4gSWYgdGhlIGdyYXBoIGlzCiAgICAgKiB1bmRpcmVjdGVkIHRoZW4gdGhpcyBhbGdvcml0aG0gd2lsbCBuYXZpZ2F0ZSB1c2luZyBuZWlnaGJvcnMuIElmIHRoZSBncmFwaAogICAgICogaXMgZGlyZWN0ZWQgdGhlbiB0aGlzIGFsZ29yaXRobSB3aWxsIG5hdmlnYXRlIHVzaW5nIHN1Y2Nlc3NvcnMuCiAgICAgKgogICAgICogT3JkZXIgbXVzdCBiZSBvbmUgb2YgInByZSIgb3IgInBvc3QiLgogICAgICovCiAgICBmdW5jdGlvbiBkZnMoZywgdnMsIG9yZGVyKSB7CiAgICAgIGlmICghbG9kYXNoXzEuaXNBcnJheSh2cykpIHsKICAgICAgICB2cyA9IFt2c107CiAgICAgIH0KCiAgICAgIHZhciBuYXZpZ2F0aW9uID0gKGcuaXNEaXJlY3RlZCgpID8gZy5zdWNjZXNzb3JzIDogZy5uZWlnaGJvcnMpLmJpbmQoZyk7CgogICAgICB2YXIgYWNjID0gW107CiAgICAgIHZhciB2aXNpdGVkID0ge307CiAgICAgIGxvZGFzaF8xLmVhY2godnMsIGZ1bmN0aW9uKHYpIHsKICAgICAgICBpZiAoIWcuaGFzTm9kZSh2KSkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJHcmFwaCBkb2VzIG5vdCBoYXZlIG5vZGU6ICIgKyB2KTsKICAgICAgICB9CgogICAgICAgIGRvRGZzKGcsIHYsIG9yZGVyID09PSAicG9zdCIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7CiAgICAgIH0pOwogICAgICByZXR1cm4gYWNjOwogICAgfQoKICAgIGZ1bmN0aW9uIGRvRGZzKGcsIHYsIHBvc3RvcmRlciwgdmlzaXRlZCwgbmF2aWdhdGlvbiwgYWNjKSB7CiAgICAgIGlmICghbG9kYXNoXzEuaGFzKHZpc2l0ZWQsIHYpKSB7CiAgICAgICAgdmlzaXRlZFt2XSA9IHRydWU7CgogICAgICAgIGlmICghcG9zdG9yZGVyKSB7IGFjYy5wdXNoKHYpOyB9CiAgICAgICAgbG9kYXNoXzEuZWFjaChuYXZpZ2F0aW9uKHYpLCBmdW5jdGlvbih3KSB7CiAgICAgICAgICBkb0RmcyhnLCB3LCBwb3N0b3JkZXIsIHZpc2l0ZWQsIG5hdmlnYXRpb24sIGFjYyk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKHBvc3RvcmRlcikgeyBhY2MucHVzaCh2KTsgfQogICAgICB9CiAgICB9CgogICAgdmFyIHBvc3RvcmRlcl8xID0gcG9zdG9yZGVyOwoKICAgIGZ1bmN0aW9uIHBvc3RvcmRlcihnLCB2cykgewogICAgICByZXR1cm4gZGZzXzEoZywgdnMsICJwb3N0Iik7CiAgICB9CgogICAgdmFyIHByZW9yZGVyXzEgPSBwcmVvcmRlcjsKCiAgICBmdW5jdGlvbiBwcmVvcmRlcihnLCB2cykgewogICAgICByZXR1cm4gZGZzXzEoZywgdnMsICJwcmUiKTsKICAgIH0KCiAgICB2YXIgcHJpbV8xID0gcHJpbTsKCiAgICBmdW5jdGlvbiBwcmltKGcsIHdlaWdodEZ1bmMpIHsKICAgICAgdmFyIHJlc3VsdCA9IG5ldyBncmFwaCgpOwogICAgICB2YXIgcGFyZW50cyA9IHt9OwogICAgICB2YXIgcHEgPSBuZXcgcHJpb3JpdHlRdWV1ZSgpOwogICAgICB2YXIgdjsKCiAgICAgIGZ1bmN0aW9uIHVwZGF0ZU5laWdoYm9ycyhlZGdlKSB7CiAgICAgICAgdmFyIHcgPSBlZGdlLnYgPT09IHYgPyBlZGdlLncgOiBlZGdlLnY7CiAgICAgICAgdmFyIHByaSA9IHBxLnByaW9yaXR5KHcpOwogICAgICAgIGlmIChwcmkgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdmFyIGVkZ2VXZWlnaHQgPSB3ZWlnaHRGdW5jKGVkZ2UpOwogICAgICAgICAgaWYgKGVkZ2VXZWlnaHQgPCBwcmkpIHsKICAgICAgICAgICAgcGFyZW50c1t3XSA9IHY7CiAgICAgICAgICAgIHBxLmRlY3JlYXNlKHcsIGVkZ2VXZWlnaHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgaWYgKGcubm9kZUNvdW50KCkgPT09IDApIHsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICB9CgogICAgICBsb2Rhc2hfMS5lYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHBxLmFkZCh2LCBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpOwogICAgICAgIHJlc3VsdC5zZXROb2RlKHYpOwogICAgICB9KTsKCiAgICAgIC8vIFN0YXJ0IGZyb20gYW4gYXJiaXRyYXJ5IG5vZGUKICAgICAgcHEuZGVjcmVhc2UoZy5ub2RlcygpWzBdLCAwKTsKCiAgICAgIHZhciBpbml0ID0gZmFsc2U7CiAgICAgIHdoaWxlIChwcS5zaXplKCkgPiAwKSB7CiAgICAgICAgdiA9IHBxLnJlbW92ZU1pbigpOwogICAgICAgIGlmIChsb2Rhc2hfMS5oYXMocGFyZW50cywgdikpIHsKICAgICAgICAgIHJlc3VsdC5zZXRFZGdlKHYsIHBhcmVudHNbdl0pOwogICAgICAgIH0gZWxzZSBpZiAoaW5pdCkgewogICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJJbnB1dCBncmFwaCBpcyBub3QgY29ubmVjdGVkOiAiICsgZyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGluaXQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgZy5ub2RlRWRnZXModikuZm9yRWFjaCh1cGRhdGVOZWlnaGJvcnMpOwogICAgICB9CgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBhbGcgPSB7CiAgICAgIGNvbXBvbmVudHM6IGNvbXBvbmVudHNfMSwKICAgICAgZGlqa3N0cmE6IGRpamtzdHJhXzEsCiAgICAgIGRpamtzdHJhQWxsOiBkaWprc3RyYUFsbF8xLAogICAgICBmaW5kQ3ljbGVzOiBmaW5kQ3ljbGVzXzEsCiAgICAgIGZsb3lkV2Fyc2hhbGw6IGZsb3lkV2Fyc2hhbGxfMSwKICAgICAgaXNBY3ljbGljOiBpc0FjeWNsaWNfMSwKICAgICAgcG9zdG9yZGVyOiBwb3N0b3JkZXJfMSwKICAgICAgcHJlb3JkZXI6IHByZW9yZGVyXzEsCiAgICAgIHByaW06IHByaW1fMSwKICAgICAgdGFyamFuOiB0YXJqYW5fMSwKICAgICAgdG9wc29ydDogdG9wc29ydF8xCiAgICB9OwoKICAgIC8qKgogICAgICogQ29weXJpZ2h0IChjKSAyMDE0LCBDaHJpcyBQZXR0aXR0CiAgICAgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgogICAgICoKICAgICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogICAgICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSBtZXQ6CiAgICAgKgogICAgICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLCB0aGlzCiAgICAgKiBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KICAgICAqCiAgICAgKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCiAgICAgKiB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluIHRoZSBkb2N1bWVudGF0aW9uCiAgICAgKiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KICAgICAqCiAgICAgKiAzLiBOZWl0aGVyIHRoZSBuYW1lIG9mIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vciB0aGUgbmFtZXMgb2YgaXRzIGNvbnRyaWJ1dG9ycwogICAgICogbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIHdpdGhvdXQKICAgICAqIHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KICAgICAqCiAgICAgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTICJBUyBJUyIgQU5ECiAgICAgKiBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRAogICAgICogV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQogICAgICogRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVCBIT0xERVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRQogICAgICogRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwKICAgICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SCiAgICAgKiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUgogICAgICogQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKICAgICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCiAgICAgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgogICAgICovCgoKCiAgICB2YXIgZ3JhcGhsaWIgPSB7CiAgICAgIEdyYXBoOiBsaWIuR3JhcGgsCiAgICAgIGpzb246IGpzb24kMiwKICAgICAgYWxnOiBhbGcsCiAgICAgIHZlcnNpb246IGxpYi52ZXJzaW9uCiAgICB9OwoKICAgIC8qIGdsb2JhbCB3aW5kb3cgKi8KCiAgICB2YXIgZ3JhcGhsaWIkMTsKCiAgICBpZiAodHlwZW9mIGNvbW1vbmpzUmVxdWlyZSA9PT0gImZ1bmN0aW9uIikgewogICAgICB0cnkgewogICAgICAgIGdyYXBobGliJDEgPSBncmFwaGxpYjsKICAgICAgfSBjYXRjaCAoZSkgewogICAgICAgIC8vIGNvbnRpbnVlIHJlZ2FyZGxlc3Mgb2YgZXJyb3IKICAgICAgfQogICAgfQoKICAgIGlmICghZ3JhcGhsaWIkMSkgewogICAgICBncmFwaGxpYiQxID0gd2luZG93LmdyYXBobGliOwogICAgfQoKICAgIHZhciBncmFwaGxpYl8xID0gZ3JhcGhsaWIkMTsKCiAgICAvKiogVXNlZCB0byBjb21wb3NlIGJpdG1hc2tzIGZvciBjbG9uaW5nLiAqLwogICAgdmFyIENMT05FX0RFRVBfRkxBRyQxID0gMSwKICAgICAgICBDTE9ORV9TWU1CT0xTX0ZMQUckMiA9IDQ7CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmNsb25lYCBleGNlcHQgdGhhdCBpdCByZWN1cnNpdmVseSBjbG9uZXMgYHZhbHVlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDEuMC4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVjdXJzaXZlbHkgY2xvbmUuCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgZGVlcCBjbG9uZWQgdmFsdWUuCiAgICAgKiBAc2VlIF8uY2xvbmUKICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIG9iamVjdHMgPSBbeyAnYSc6IDEgfSwgeyAnYic6IDIgfV07CiAgICAgKgogICAgICogdmFyIGRlZXAgPSBfLmNsb25lRGVlcChvYmplY3RzKTsKICAgICAqIGNvbnNvbGUubG9nKGRlZXBbMF0gPT09IG9iamVjdHNbMF0pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmVEZWVwKHZhbHVlKSB7CiAgICAgIHJldHVybiBfYmFzZUNsb25lKHZhbHVlLCBDTE9ORV9ERUVQX0ZMQUckMSB8IENMT05FX1NZTUJPTFNfRkxBRyQyKTsKICAgIH0KCiAgICB2YXIgY2xvbmVEZWVwXzEgPSBjbG9uZURlZXA7CgogICAgLyoqCiAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgdmFsdWUgYXJndW1lbnQuCiAgICAgKiBAcGFyYW0geyp9IGluZGV4IFRoZSBwb3RlbnRpYWwgaXRlcmF0ZWUgaW5kZXggb3Iga2V5IGFyZ3VtZW50LgogICAgICogQHBhcmFtIHsqfSBvYmplY3QgVGhlIHBvdGVudGlhbCBpdGVyYXRlZSBvYmplY3QgYXJndW1lbnQuCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgdGhlIGFyZ3VtZW50cyBhcmUgZnJvbSBhbiBpdGVyYXRlZSBjYWxsLAogICAgICogIGVsc2UgYGZhbHNlYC4KICAgICAqLwogICAgZnVuY3Rpb24gaXNJdGVyYXRlZUNhbGwodmFsdWUsIGluZGV4LCBvYmplY3QpIHsKICAgICAgaWYgKCFpc09iamVjdF8xKG9iamVjdCkpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgICAgdmFyIHR5cGUgPSB0eXBlb2YgaW5kZXg7CiAgICAgIGlmICh0eXBlID09ICdudW1iZXInCiAgICAgICAgICAgID8gKGlzQXJyYXlMaWtlXzEob2JqZWN0KSAmJiBfaXNJbmRleChpbmRleCwgb2JqZWN0Lmxlbmd0aCkpCiAgICAgICAgICAgIDogKHR5cGUgPT0gJ3N0cmluZycgJiYgaW5kZXggaW4gb2JqZWN0KQogICAgICAgICAgKSB7CiAgICAgICAgcmV0dXJuIGVxXzEob2JqZWN0W2luZGV4XSwgdmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KCiAgICB2YXIgX2lzSXRlcmF0ZWVDYWxsID0gaXNJdGVyYXRlZUNhbGw7CgogICAgLyoqIFVzZWQgZm9yIGJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzLiAqLwogICAgdmFyIG9iamVjdFByb3RvJGggPSBPYmplY3QucHJvdG90eXBlOwoKICAgIC8qKiBVc2VkIHRvIGNoZWNrIG9iamVjdHMgZm9yIG93biBwcm9wZXJ0aWVzLiAqLwogICAgdmFyIGhhc093blByb3BlcnR5JGUgPSBvYmplY3RQcm90byRoLmhhc093blByb3BlcnR5OwoKICAgIC8qKgogICAgICogQXNzaWducyBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZQogICAgICogb2JqZWN0cyB0byB0aGUgZGVzdGluYXRpb24gb2JqZWN0IGZvciBhbGwgZGVzdGluYXRpb24gcHJvcGVydGllcyB0aGF0CiAgICAgKiByZXNvbHZlIHRvIGB1bmRlZmluZWRgLiBTb3VyY2Ugb2JqZWN0cyBhcmUgYXBwbGllZCBmcm9tIGxlZnQgdG8gcmlnaHQuCiAgICAgKiBPbmNlIGEgcHJvcGVydHkgaXMgc2V0LCBhZGRpdGlvbmFsIHZhbHVlcyBvZiB0aGUgc2FtZSBwcm9wZXJ0eSBhcmUgaWdub3JlZC4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKiBAc2VlIF8uZGVmYXVsdHNEZWVwCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZGVmYXVsdHMoeyAnYSc6IDEgfSwgeyAnYic6IDIgfSwgeyAnYSc6IDMgfSk7CiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAqLwogICAgdmFyIGRlZmF1bHRzID0gX2Jhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykgewogICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTsKCiAgICAgIHZhciBpbmRleCA9IC0xOwogICAgICB2YXIgbGVuZ3RoID0gc291cmNlcy5sZW5ndGg7CiAgICAgIHZhciBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkOwoKICAgICAgaWYgKGd1YXJkICYmIF9pc0l0ZXJhdGVlQ2FsbChzb3VyY2VzWzBdLCBzb3VyY2VzWzFdLCBndWFyZCkpIHsKICAgICAgICBsZW5ndGggPSAxOwogICAgICB9CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciBzb3VyY2UgPSBzb3VyY2VzW2luZGV4XTsKICAgICAgICB2YXIgcHJvcHMgPSBrZXlzSW5fMShzb3VyY2UpOwogICAgICAgIHZhciBwcm9wc0luZGV4ID0gLTE7CiAgICAgICAgdmFyIHByb3BzTGVuZ3RoID0gcHJvcHMubGVuZ3RoOwoKICAgICAgICB3aGlsZSAoKytwcm9wc0luZGV4IDwgcHJvcHNMZW5ndGgpIHsKICAgICAgICAgIHZhciBrZXkgPSBwcm9wc1twcm9wc0luZGV4XTsKICAgICAgICAgIHZhciB2YWx1ZSA9IG9iamVjdFtrZXldOwoKICAgICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgKGVxXzEodmFsdWUsIG9iamVjdFByb3RvJGhba2V5XSkgJiYgIWhhc093blByb3BlcnR5JGUuY2FsbChvYmplY3QsIGtleSkpKSB7CiAgICAgICAgICAgIG9iamVjdFtrZXldID0gc291cmNlW2tleV07CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gb2JqZWN0OwogICAgfSk7CgogICAgdmFyIGRlZmF1bHRzXzEgPSBkZWZhdWx0czsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBgXy5maW5kYCBvciBgXy5maW5kTGFzdGAgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGZpbmRJbmRleEZ1bmMgVGhlIGZ1bmN0aW9uIHRvIGZpbmQgdGhlIGNvbGxlY3Rpb24gaW5kZXguCiAgICAgKiBAcmV0dXJucyB7RnVuY3Rpb259IFJldHVybnMgdGhlIG5ldyBmaW5kIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVGaW5kKGZpbmRJbmRleEZ1bmMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGNvbGxlY3Rpb24sIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7CiAgICAgICAgdmFyIGl0ZXJhYmxlID0gT2JqZWN0KGNvbGxlY3Rpb24pOwogICAgICAgIGlmICghaXNBcnJheUxpa2VfMShjb2xsZWN0aW9uKSkgewogICAgICAgICAgdmFyIGl0ZXJhdGVlID0gX2Jhc2VJdGVyYXRlZShwcmVkaWNhdGUpOwogICAgICAgICAgY29sbGVjdGlvbiA9IGtleXNfMShjb2xsZWN0aW9uKTsKICAgICAgICAgIHByZWRpY2F0ZSA9IGZ1bmN0aW9uKGtleSkgeyByZXR1cm4gaXRlcmF0ZWUoaXRlcmFibGVba2V5XSwga2V5LCBpdGVyYWJsZSk7IH07CiAgICAgICAgfQogICAgICAgIHZhciBpbmRleCA9IGZpbmRJbmRleEZ1bmMoY29sbGVjdGlvbiwgcHJlZGljYXRlLCBmcm9tSW5kZXgpOwogICAgICAgIHJldHVybiBpbmRleCA+IC0xID8gaXRlcmFibGVbaXRlcmF0ZWUgPyBjb2xsZWN0aW9uW2luZGV4XSA6IGluZGV4XSA6IHVuZGVmaW5lZDsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgX2NyZWF0ZUZpbmQgPSBjcmVhdGVGaW5kOwoKICAgIC8qKiBVc2VkIGFzIHJlZmVyZW5jZXMgZm9yIHZhcmlvdXMgYE51bWJlcmAgY29uc3RhbnRzLiAqLwogICAgdmFyIE5BTiA9IDAgLyAwOwoKICAgIC8qKiBVc2VkIHRvIG1hdGNoIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaXRlc3BhY2UuICovCiAgICB2YXIgcmVUcmltID0gL15ccyt8XHMrJC9nOwoKICAgIC8qKiBVc2VkIHRvIGRldGVjdCBiYWQgc2lnbmVkIGhleGFkZWNpbWFsIHN0cmluZyB2YWx1ZXMuICovCiAgICB2YXIgcmVJc0JhZEhleCA9IC9eWy0rXTB4WzAtOWEtZl0rJC9pOwoKICAgIC8qKiBVc2VkIHRvIGRldGVjdCBiaW5hcnkgc3RyaW5nIHZhbHVlcy4gKi8KICAgIHZhciByZUlzQmluYXJ5ID0gL14wYlswMV0rJC9pOwoKICAgIC8qKiBVc2VkIHRvIGRldGVjdCBvY3RhbCBzdHJpbmcgdmFsdWVzLiAqLwogICAgdmFyIHJlSXNPY3RhbCA9IC9eMG9bMC03XSskL2k7CgogICAgLyoqIEJ1aWx0LWluIG1ldGhvZCByZWZlcmVuY2VzIHdpdGhvdXQgYSBkZXBlbmRlbmN5IG9uIGByb290YC4gKi8KICAgIHZhciBmcmVlUGFyc2VJbnQgPSBwYXJzZUludDsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBudW1iZXIuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSA0LjAuMAogICAgICogQGNhdGVnb3J5IExhbmcKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIHByb2Nlc3MuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBudW1iZXIuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udG9OdW1iZXIoMy4yKTsKICAgICAqIC8vID0+IDMuMgogICAgICoKICAgICAqIF8udG9OdW1iZXIoTnVtYmVyLk1JTl9WQUxVRSk7CiAgICAgKiAvLyA9PiA1ZS0zMjQKICAgICAqCiAgICAgKiBfLnRvTnVtYmVyKEluZmluaXR5KTsKICAgICAqIC8vID0+IEluZmluaXR5CiAgICAgKgogICAgICogXy50b051bWJlcignMy4yJyk7CiAgICAgKiAvLyA9PiAzLjIKICAgICAqLwogICAgZnVuY3Rpb24gdG9OdW1iZXIodmFsdWUpIHsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykgewogICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgfQogICAgICBpZiAoaXNTeW1ib2xfMSh2YWx1ZSkpIHsKICAgICAgICByZXR1cm4gTkFOOwogICAgICB9CiAgICAgIGlmIChpc09iamVjdF8xKHZhbHVlKSkgewogICAgICAgIHZhciBvdGhlciA9IHR5cGVvZiB2YWx1ZS52YWx1ZU9mID09ICdmdW5jdGlvbicgPyB2YWx1ZS52YWx1ZU9mKCkgOiB2YWx1ZTsKICAgICAgICB2YWx1ZSA9IGlzT2JqZWN0XzEob3RoZXIpID8gKG90aGVyICsgJycpIDogb3RoZXI7CiAgICAgIH0KICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPSAnc3RyaW5nJykgewogICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogK3ZhbHVlOwogICAgICB9CiAgICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZShyZVRyaW0sICcnKTsKICAgICAgdmFyIGlzQmluYXJ5ID0gcmVJc0JpbmFyeS50ZXN0KHZhbHVlKTsKICAgICAgcmV0dXJuIChpc0JpbmFyeSB8fCByZUlzT2N0YWwudGVzdCh2YWx1ZSkpCiAgICAgICAgPyBmcmVlUGFyc2VJbnQodmFsdWUuc2xpY2UoMiksIGlzQmluYXJ5ID8gMiA6IDgpCiAgICAgICAgOiAocmVJc0JhZEhleC50ZXN0KHZhbHVlKSA/IE5BTiA6ICt2YWx1ZSk7CiAgICB9CgogICAgdmFyIHRvTnVtYmVyXzEgPSB0b051bWJlcjsKCiAgICAvKiogVXNlZCBhcyByZWZlcmVuY2VzIGZvciB2YXJpb3VzIGBOdW1iZXJgIGNvbnN0YW50cy4gKi8KICAgIHZhciBJTkZJTklUWSQzID0gMSAvIDAsCiAgICAgICAgTUFYX0lOVEVHRVIgPSAxLjc5NzY5MzEzNDg2MjMxNTdlKzMwODsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBmaW5pdGUgbnVtYmVyLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgNC4xMi4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBudW1iZXIuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8udG9GaW5pdGUoMy4yKTsKICAgICAqIC8vID0+IDMuMgogICAgICoKICAgICAqIF8udG9GaW5pdGUoTnVtYmVyLk1JTl9WQUxVRSk7CiAgICAgKiAvLyA9PiA1ZS0zMjQKICAgICAqCiAgICAgKiBfLnRvRmluaXRlKEluZmluaXR5KTsKICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4CiAgICAgKgogICAgICogXy50b0Zpbml0ZSgnMy4yJyk7CiAgICAgKiAvLyA9PiAzLjIKICAgICAqLwogICAgZnVuY3Rpb24gdG9GaW5pdGUodmFsdWUpIHsKICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMCA/IHZhbHVlIDogMDsKICAgICAgfQogICAgICB2YWx1ZSA9IHRvTnVtYmVyXzEodmFsdWUpOwogICAgICBpZiAodmFsdWUgPT09IElORklOSVRZJDMgfHwgdmFsdWUgPT09IC1JTkZJTklUWSQzKSB7CiAgICAgICAgdmFyIHNpZ24gPSAodmFsdWUgPCAwID8gLTEgOiAxKTsKICAgICAgICByZXR1cm4gc2lnbiAqIE1BWF9JTlRFR0VSOwogICAgICB9CiAgICAgIHJldHVybiB2YWx1ZSA9PT0gdmFsdWUgPyB2YWx1ZSA6IDA7CiAgICB9CgogICAgdmFyIHRvRmluaXRlXzEgPSB0b0Zpbml0ZTsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYW4gaW50ZWdlci4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgaXMgbG9vc2VseSBiYXNlZCBvbgogICAgICogW2BUb0ludGVnZXJgXShodHRwOi8vd3d3LmVjbWEtaW50ZXJuYXRpb25hbC5vcmcvZWNtYS0yNjIvNy4wLyNzZWMtdG9pbnRlZ2VyKS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDQuMC4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29udmVydC4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGNvbnZlcnRlZCBpbnRlZ2VyLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLnRvSW50ZWdlcigzLjIpOwogICAgICogLy8gPT4gMwogICAgICoKICAgICAqIF8udG9JbnRlZ2VyKE51bWJlci5NSU5fVkFMVUUpOwogICAgICogLy8gPT4gMAogICAgICoKICAgICAqIF8udG9JbnRlZ2VyKEluZmluaXR5KTsKICAgICAqIC8vID0+IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4CiAgICAgKgogICAgICogXy50b0ludGVnZXIoJzMuMicpOwogICAgICogLy8gPT4gMwogICAgICovCiAgICBmdW5jdGlvbiB0b0ludGVnZXIodmFsdWUpIHsKICAgICAgdmFyIHJlc3VsdCA9IHRvRmluaXRlXzEodmFsdWUpLAogICAgICAgICAgcmVtYWluZGVyID0gcmVzdWx0ICUgMTsKCiAgICAgIHJldHVybiByZXN1bHQgPT09IHJlc3VsdCA/IChyZW1haW5kZXIgPyByZXN1bHQgLSByZW1haW5kZXIgOiByZXN1bHQpIDogMDsKICAgIH0KCiAgICB2YXIgdG9JbnRlZ2VyXzEgPSB0b0ludGVnZXI7CgogICAgLyogQnVpbHQtaW4gbWV0aG9kIHJlZmVyZW5jZXMgZm9yIHRob3NlIHdpdGggdGhlIHNhbWUgbmFtZSBhcyBvdGhlciBgbG9kYXNoYCBtZXRob2RzLiAqLwogICAgdmFyIG5hdGl2ZU1heCQxID0gTWF0aC5tYXg7CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmZpbmRgIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdAogICAgICogZWxlbWVudCBgcHJlZGljYXRlYCByZXR1cm5zIHRydXRoeSBmb3IgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBpdHNlbGYuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAxLjEuMAogICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gaW5zcGVjdC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtwcmVkaWNhdGU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBbZnJvbUluZGV4PTBdIFRoZSBpbmRleCB0byBzZWFyY2ggZnJvbS4KICAgICAqIEByZXR1cm5zIHtudW1iZXJ9IFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmb3VuZCBlbGVtZW50LCBlbHNlIGAtMWAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciB1c2VycyA9IFsKICAgICAqICAgeyAndXNlcic6ICdiYXJuZXknLCAgJ2FjdGl2ZSc6IGZhbHNlIH0sCiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhY3RpdmUnOiBmYWxzZSB9LAogICAgICogICB7ICd1c2VyJzogJ3BlYmJsZXMnLCAnYWN0aXZlJzogdHJ1ZSB9CiAgICAgKiBdOwogICAgICoKICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXIgPT0gJ2Jhcm5leSc7IH0pOwogICAgICogLy8gPT4gMAogICAgICoKICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzYCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgeyAndXNlcic6ICdmcmVkJywgJ2FjdGl2ZSc6IGZhbHNlIH0pOwogICAgICogLy8gPT4gMQogICAgICoKICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8uZmluZEluZGV4KHVzZXJzLCBbJ2FjdGl2ZScsIGZhbHNlXSk7CiAgICAgKiAvLyA9PiAwCiAgICAgKgogICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgKiBfLmZpbmRJbmRleCh1c2VycywgJ2FjdGl2ZScpOwogICAgICogLy8gPT4gMgogICAgICovCiAgICBmdW5jdGlvbiBmaW5kSW5kZXgoYXJyYXksIHByZWRpY2F0ZSwgZnJvbUluZGV4KSB7CiAgICAgIHZhciBsZW5ndGggPSBhcnJheSA9PSBudWxsID8gMCA6IGFycmF5Lmxlbmd0aDsKICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICByZXR1cm4gLTE7CiAgICAgIH0KICAgICAgdmFyIGluZGV4ID0gZnJvbUluZGV4ID09IG51bGwgPyAwIDogdG9JbnRlZ2VyXzEoZnJvbUluZGV4KTsKICAgICAgaWYgKGluZGV4IDwgMCkgewogICAgICAgIGluZGV4ID0gbmF0aXZlTWF4JDEobGVuZ3RoICsgaW5kZXgsIDApOwogICAgICB9CiAgICAgIHJldHVybiBfYmFzZUZpbmRJbmRleChhcnJheSwgX2Jhc2VJdGVyYXRlZShwcmVkaWNhdGUpLCBpbmRleCk7CiAgICB9CgogICAgdmFyIGZpbmRJbmRleF8xID0gZmluZEluZGV4OwoKICAgIC8qKgogICAgICogSXRlcmF0ZXMgb3ZlciBlbGVtZW50cyBvZiBgY29sbGVjdGlvbmAsIHJldHVybmluZyB0aGUgZmlyc3QgZWxlbWVudAogICAgICogYHByZWRpY2F0ZWAgcmV0dXJucyB0cnV0aHkgZm9yLiBUaGUgcHJlZGljYXRlIGlzIGludm9rZWQgd2l0aCB0aHJlZQogICAgICogYXJndW1lbnRzOiAodmFsdWUsIGluZGV4fGtleSwgY29sbGVjdGlvbikuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IENvbGxlY3Rpb24KICAgICAqIEBwYXJhbSB7QXJyYXl8T2JqZWN0fSBjb2xsZWN0aW9uIFRoZSBjb2xsZWN0aW9uIHRvIGluc3BlY3QuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbcHJlZGljYXRlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW2Zyb21JbmRleD0wXSBUaGUgaW5kZXggdG8gc2VhcmNoIGZyb20uCiAgICAgKiBAcmV0dXJucyB7Kn0gUmV0dXJucyB0aGUgbWF0Y2hlZCBlbGVtZW50LCBlbHNlIGB1bmRlZmluZWRgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgICdhZ2UnOiAzNiwgJ2FjdGl2ZSc6IHRydWUgfSwKICAgICAqICAgeyAndXNlcic6ICdmcmVkJywgICAgJ2FnZSc6IDQwLCAnYWN0aXZlJzogZmFsc2UgfSwKICAgICAqICAgeyAndXNlcic6ICdwZWJibGVzJywgJ2FnZSc6IDEsICAnYWN0aXZlJzogdHJ1ZSB9CiAgICAgKiBdOwogICAgICoKICAgICAqIF8uZmluZCh1c2VycywgZnVuY3Rpb24obykgeyByZXR1cm4gby5hZ2UgPCA0MDsgfSk7CiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdiYXJuZXknCiAgICAgKgogICAgICogLy8gVGhlIGBfLm1hdGNoZXNgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8uZmluZCh1c2VycywgeyAnYWdlJzogMSwgJ2FjdGl2ZSc6IHRydWUgfSk7CiAgICAgKiAvLyA9PiBvYmplY3QgZm9yICdwZWJibGVzJwogICAgICoKICAgICAqIC8vIFRoZSBgXy5tYXRjaGVzUHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8uZmluZCh1c2VycywgWydhY3RpdmUnLCBmYWxzZV0pOwogICAgICogLy8gPT4gb2JqZWN0IGZvciAnZnJlZCcKICAgICAqCiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8uZmluZCh1c2VycywgJ2FjdGl2ZScpOwogICAgICogLy8gPT4gb2JqZWN0IGZvciAnYmFybmV5JwogICAgICovCiAgICB2YXIgZmluZCQyID0gX2NyZWF0ZUZpbmQoZmluZEluZGV4XzEpOwoKICAgIHZhciBmaW5kXzEgPSBmaW5kJDI7CgogICAgLyoqCiAgICAgKiBGbGF0dGVucyBgYXJyYXlgIGEgc2luZ2xlIGxldmVsIGRlZXAuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQGNhdGVnb3J5IEFycmF5CiAgICAgKiBAcGFyYW0ge0FycmF5fSBhcnJheSBUaGUgYXJyYXkgdG8gZmxhdHRlbi4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IGZsYXR0ZW5lZCBhcnJheS4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogXy5mbGF0dGVuKFsxLCBbMiwgWzMsIFs0XV0sIDVdXSk7CiAgICAgKiAvLyA9PiBbMSwgMiwgWzMsIFs0XV0sIDVdCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZsYXR0ZW4oYXJyYXkpIHsKICAgICAgdmFyIGxlbmd0aCA9IGFycmF5ID09IG51bGwgPyAwIDogYXJyYXkubGVuZ3RoOwogICAgICByZXR1cm4gbGVuZ3RoID8gX2Jhc2VGbGF0dGVuKGFycmF5LCAxKSA6IFtdOwogICAgfQoKICAgIHZhciBmbGF0dGVuXzEgPSBmbGF0dGVuOwoKICAgIC8qKgogICAgICogSXRlcmF0ZXMgb3ZlciBvd24gYW5kIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIGFuCiAgICAgKiBvYmplY3QgYW5kIGludm9rZXMgYGl0ZXJhdGVlYCBmb3IgZWFjaCBwcm9wZXJ0eS4gVGhlIGl0ZXJhdGVlIGlzIGludm9rZWQKICAgICAqIHdpdGggdGhyZWUgYXJndW1lbnRzOiAodmFsdWUsIGtleSwgb2JqZWN0KS4gSXRlcmF0ZWUgZnVuY3Rpb25zIG1heSBleGl0CiAgICAgKiBpdGVyYXRpb24gZWFybHkgYnkgZXhwbGljaXRseSByZXR1cm5pbmcgYGZhbHNlYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuMy4wCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2l0ZXJhdGVlPV8uaWRlbnRpdHldIFRoZSBmdW5jdGlvbiBpbnZva2VkIHBlciBpdGVyYXRpb24uCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIGBvYmplY3RgLgogICAgICogQHNlZSBfLmZvckluUmlnaHQKICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICogICB0aGlzLmEgPSAxOwogICAgICogICB0aGlzLmIgPSAyOwogICAgICogfQogICAgICoKICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgKgogICAgICogXy5mb3JJbihuZXcgRm9vLCBmdW5jdGlvbih2YWx1ZSwga2V5KSB7CiAgICAgKiAgIGNvbnNvbGUubG9nKGtleSk7CiAgICAgKiB9KTsKICAgICAqIC8vID0+IExvZ3MgJ2EnLCAnYicsIHRoZW4gJ2MnIChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpLgogICAgICovCiAgICBmdW5jdGlvbiBmb3JJbihvYmplY3QsIGl0ZXJhdGVlKSB7CiAgICAgIHJldHVybiBvYmplY3QgPT0gbnVsbAogICAgICAgID8gb2JqZWN0CiAgICAgICAgOiBfYmFzZUZvcihvYmplY3QsIF9jYXN0RnVuY3Rpb24oaXRlcmF0ZWUpLCBrZXlzSW5fMSk7CiAgICB9CgogICAgdmFyIGZvckluXzEgPSBmb3JJbjsKCiAgICAvKioKICAgICAqIEdldHMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBjYXRlZ29yeSBBcnJheQogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIHF1ZXJ5LgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGxhc3QgZWxlbWVudCBvZiBgYXJyYXlgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLmxhc3QoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IDMKICAgICAqLwogICAgZnVuY3Rpb24gbGFzdChhcnJheSkgewogICAgICB2YXIgbGVuZ3RoID0gYXJyYXkgPT0gbnVsbCA/IDAgOiBhcnJheS5sZW5ndGg7CiAgICAgIHJldHVybiBsZW5ndGggPyBhcnJheVtsZW5ndGggLSAxXSA6IHVuZGVmaW5lZDsKICAgIH0KCiAgICB2YXIgbGFzdF8xID0gbGFzdDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IHdpdGggdGhlIHNhbWUga2V5cyBhcyBgb2JqZWN0YCBhbmQgdmFsdWVzIGdlbmVyYXRlZAogICAgICogYnkgcnVubmluZyBlYWNoIG93biBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0eSBvZiBgb2JqZWN0YCB0aHJ1CiAgICAgKiBgaXRlcmF0ZWVgLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIHRocmVlIGFyZ3VtZW50czoKICAgICAqICh2YWx1ZSwga2V5LCBvYmplY3QpLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMi40LjAKICAgICAqIEBjYXRlZ29yeSBPYmplY3QKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBbaXRlcmF0ZWU9Xy5pZGVudGl0eV0gVGhlIGZ1bmN0aW9uIGludm9rZWQgcGVyIGl0ZXJhdGlvbi4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBtYXBwZWQgb2JqZWN0LgogICAgICogQHNlZSBfLm1hcEtleXMKICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogdmFyIHVzZXJzID0gewogICAgICogICAnZnJlZCc6ICAgIHsgJ3VzZXInOiAnZnJlZCcsICAgICdhZ2UnOiA0MCB9LAogICAgICogICAncGViYmxlcyc6IHsgJ3VzZXInOiAncGViYmxlcycsICdhZ2UnOiAxIH0KICAgICAqIH07CiAgICAgKgogICAgICogXy5tYXBWYWx1ZXModXNlcnMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8uYWdlOyB9KTsKICAgICAqIC8vID0+IHsgJ2ZyZWQnOiA0MCwgJ3BlYmJsZXMnOiAxIH0gKGl0ZXJhdGlvbiBvcmRlciBpcyBub3QgZ3VhcmFudGVlZCkKICAgICAqCiAgICAgKiAvLyBUaGUgYF8ucHJvcGVydHlgIGl0ZXJhdGVlIHNob3J0aGFuZC4KICAgICAqIF8ubWFwVmFsdWVzKHVzZXJzLCAnYWdlJyk7CiAgICAgKiAvLyA9PiB7ICdmcmVkJzogNDAsICdwZWJibGVzJzogMSB9IChpdGVyYXRpb24gb3JkZXIgaXMgbm90IGd1YXJhbnRlZWQpCiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcFZhbHVlcyhvYmplY3QsIGl0ZXJhdGVlKSB7CiAgICAgIHZhciByZXN1bHQgPSB7fTsKICAgICAgaXRlcmF0ZWUgPSBfYmFzZUl0ZXJhdGVlKGl0ZXJhdGVlKTsKCiAgICAgIF9iYXNlRm9yT3duKG9iamVjdCwgZnVuY3Rpb24odmFsdWUsIGtleSwgb2JqZWN0KSB7CiAgICAgICAgX2Jhc2VBc3NpZ25WYWx1ZShyZXN1bHQsIGtleSwgaXRlcmF0ZWUodmFsdWUsIGtleSwgb2JqZWN0KSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBtYXBWYWx1ZXNfMSA9IG1hcFZhbHVlczsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIG1ldGhvZHMgbGlrZSBgXy5tYXhgIGFuZCBgXy5taW5gIHdoaWNoIGFjY2VwdHMgYQogICAgICogYGNvbXBhcmF0b3JgIHRvIGRldGVybWluZSB0aGUgZXh0cmVtdW0gdmFsdWUuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBpdGVyYXRlZSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgaXRlcmF0aW9uLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyYXRvciBUaGUgY29tcGFyYXRvciB1c2VkIHRvIGNvbXBhcmUgdmFsdWVzLgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIGV4dHJlbXVtIHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlRXh0cmVtdW0oYXJyYXksIGl0ZXJhdGVlLCBjb21wYXJhdG9yKSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gYXJyYXkubGVuZ3RoOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIgdmFsdWUgPSBhcnJheVtpbmRleF0sCiAgICAgICAgICAgIGN1cnJlbnQgPSBpdGVyYXRlZSh2YWx1ZSk7CgogICAgICAgIGlmIChjdXJyZW50ICE9IG51bGwgJiYgKGNvbXB1dGVkID09PSB1bmRlZmluZWQKICAgICAgICAgICAgICA/IChjdXJyZW50ID09PSBjdXJyZW50ICYmICFpc1N5bWJvbF8xKGN1cnJlbnQpKQogICAgICAgICAgICAgIDogY29tcGFyYXRvcihjdXJyZW50LCBjb21wdXRlZCkKICAgICAgICAgICAgKSkgewogICAgICAgICAgdmFyIGNvbXB1dGVkID0gY3VycmVudCwKICAgICAgICAgICAgICByZXN1bHQgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgX2Jhc2VFeHRyZW11bSA9IGJhc2VFeHRyZW11bTsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmd0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgZ3JlYXRlciB0aGFuIGBvdGhlcmAsCiAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlR3QodmFsdWUsIG90aGVyKSB7CiAgICAgIHJldHVybiB2YWx1ZSA+IG90aGVyOwogICAgfQoKICAgIHZhciBfYmFzZUd0ID0gYmFzZUd0OwoKICAgIC8qKgogICAgICogQ29tcHV0ZXMgdGhlIG1heGltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksCiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgTWF0aAogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtYXhpbXVtIHZhbHVlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLm1heChbNCwgMiwgOCwgNl0pOwogICAgICogLy8gPT4gOAogICAgICoKICAgICAqIF8ubWF4KFtdKTsKICAgICAqIC8vID0+IHVuZGVmaW5lZAogICAgICovCiAgICBmdW5jdGlvbiBtYXgkNihhcnJheSkgewogICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICA/IF9iYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5XzEsIF9iYXNlR3QpCiAgICAgICAgOiB1bmRlZmluZWQ7CiAgICB9CgogICAgdmFyIG1heF8xID0gbWF4JDY7CgogICAgLyoqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGxpa2UgYGFzc2lnblZhbHVlYCBleGNlcHQgdGhhdCBpdCBkb2Vzbid0IGFzc2lnbgogICAgICogYHVuZGVmaW5lZGAgdmFsdWVzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBvYmplY3QgdG8gbW9kaWZ5LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSBwcm9wZXJ0eSB0byBhc3NpZ24uCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBhc3NpZ24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFzc2lnbk1lcmdlVmFsdWUob2JqZWN0LCBrZXksIHZhbHVlKSB7CiAgICAgIGlmICgodmFsdWUgIT09IHVuZGVmaW5lZCAmJiAhZXFfMShvYmplY3Rba2V5XSwgdmFsdWUpKSB8fAogICAgICAgICAgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgIShrZXkgaW4gb2JqZWN0KSkpIHsKICAgICAgICBfYmFzZUFzc2lnblZhbHVlKG9iamVjdCwga2V5LCB2YWx1ZSk7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgX2Fzc2lnbk1lcmdlVmFsdWUgPSBhc3NpZ25NZXJnZVZhbHVlOwoKICAgIC8qKiBgT2JqZWN0I3RvU3RyaW5nYCByZXN1bHQgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBvYmplY3RUYWckNCA9ICdbb2JqZWN0IE9iamVjdF0nOwoKICAgIC8qKiBVc2VkIGZvciBidWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcy4gKi8KICAgIHZhciBmdW5jUHJvdG8kMiA9IEZ1bmN0aW9uLnByb3RvdHlwZSwKICAgICAgICBvYmplY3RQcm90byRpID0gT2JqZWN0LnByb3RvdHlwZTsKCiAgICAvKiogVXNlZCB0byByZXNvbHZlIHRoZSBkZWNvbXBpbGVkIHNvdXJjZSBvZiBmdW5jdGlvbnMuICovCiAgICB2YXIgZnVuY1RvU3RyaW5nJDIgPSBmdW5jUHJvdG8kMi50b1N0cmluZzsKCiAgICAvKiogVXNlZCB0byBjaGVjayBvYmplY3RzIGZvciBvd24gcHJvcGVydGllcy4gKi8KICAgIHZhciBoYXNPd25Qcm9wZXJ0eSRmID0gb2JqZWN0UHJvdG8kaS5oYXNPd25Qcm9wZXJ0eTsKCiAgICAvKiogVXNlZCB0byBpbmZlciB0aGUgYE9iamVjdGAgY29uc3RydWN0b3IuICovCiAgICB2YXIgb2JqZWN0Q3RvclN0cmluZyA9IGZ1bmNUb1N0cmluZyQyLmNhbGwoT2JqZWN0KTsKCiAgICAvKioKICAgICAqIENoZWNrcyBpZiBgdmFsdWVgIGlzIGEgcGxhaW4gb2JqZWN0LCB0aGF0IGlzLCBhbiBvYmplY3QgY3JlYXRlZCBieSB0aGUKICAgICAqIGBPYmplY3RgIGNvbnN0cnVjdG9yIG9yIG9uZSB3aXRoIGEgYFtbUHJvdG90eXBlXV1gIG9mIGBudWxsYC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuOC4wCiAgICAgKiBAY2F0ZWdvcnkgTGFuZwogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY2hlY2suCiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn0gUmV0dXJucyBgdHJ1ZWAgaWYgYHZhbHVlYCBpcyBhIHBsYWluIG9iamVjdCwgZWxzZSBgZmFsc2VgLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBmdW5jdGlvbiBGb28oKSB7CiAgICAgKiAgIHRoaXMuYSA9IDE7CiAgICAgKiB9CiAgICAgKgogICAgICogXy5pc1BsYWluT2JqZWN0KG5ldyBGb28pOwogICAgICogLy8gPT4gZmFsc2UKICAgICAqCiAgICAgKiBfLmlzUGxhaW5PYmplY3QoWzEsIDIsIDNdKTsKICAgICAqIC8vID0+IGZhbHNlCiAgICAgKgogICAgICogXy5pc1BsYWluT2JqZWN0KHsgJ3gnOiAwLCAneSc6IDAgfSk7CiAgICAgKiAvLyA9PiB0cnVlCiAgICAgKgogICAgICogXy5pc1BsYWluT2JqZWN0KE9iamVjdC5jcmVhdGUobnVsbCkpOwogICAgICogLy8gPT4gdHJ1ZQogICAgICovCiAgICBmdW5jdGlvbiBpc1BsYWluT2JqZWN0JDEodmFsdWUpIHsKICAgICAgaWYgKCFpc09iamVjdExpa2VfMSh2YWx1ZSkgfHwgX2Jhc2VHZXRUYWcodmFsdWUpICE9IG9iamVjdFRhZyQ0KSB7CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CiAgICAgIHZhciBwcm90byA9IF9nZXRQcm90b3R5cGUodmFsdWUpOwogICAgICBpZiAocHJvdG8gPT09IG51bGwpIHsKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQogICAgICB2YXIgQ3RvciA9IGhhc093blByb3BlcnR5JGYuY2FsbChwcm90bywgJ2NvbnN0cnVjdG9yJykgJiYgcHJvdG8uY29uc3RydWN0b3I7CiAgICAgIHJldHVybiB0eXBlb2YgQ3RvciA9PSAnZnVuY3Rpb24nICYmIEN0b3IgaW5zdGFuY2VvZiBDdG9yICYmCiAgICAgICAgZnVuY1RvU3RyaW5nJDIuY2FsbChDdG9yKSA9PSBvYmplY3RDdG9yU3RyaW5nOwogICAgfQoKICAgIHZhciBpc1BsYWluT2JqZWN0XzEgPSBpc1BsYWluT2JqZWN0JDE7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSB2YWx1ZSBhdCBga2V5YCwgdW5sZXNzIGBrZXlgIGlzICJfX3Byb3RvX18iIG9yICJjb25zdHJ1Y3RvciIuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBxdWVyeS4KICAgICAqIEBwYXJhbSB7c3RyaW5nfSBrZXkgVGhlIGtleSBvZiB0aGUgcHJvcGVydHkgdG8gZ2V0LgogICAgICogQHJldHVybnMgeyp9IFJldHVybnMgdGhlIHByb3BlcnR5IHZhbHVlLgogICAgICovCiAgICBmdW5jdGlvbiBzYWZlR2V0KG9iamVjdCwga2V5KSB7CiAgICAgIGlmIChrZXkgPT09ICdjb25zdHJ1Y3RvcicgJiYgdHlwZW9mIG9iamVjdFtrZXldID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBpZiAoa2V5ID09ICdfX3Byb3RvX18nKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICByZXR1cm4gb2JqZWN0W2tleV07CiAgICB9CgogICAgdmFyIF9zYWZlR2V0ID0gc2FmZUdldDsKCiAgICAvKioKICAgICAqIENvbnZlcnRzIGB2YWx1ZWAgdG8gYSBwbGFpbiBvYmplY3QgZmxhdHRlbmluZyBpbmhlcml0ZWQgZW51bWVyYWJsZSBzdHJpbmcKICAgICAqIGtleWVkIHByb3BlcnRpZXMgb2YgYHZhbHVlYCB0byBvd24gcHJvcGVydGllcyBvZiB0aGUgcGxhaW4gb2JqZWN0LgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMy4wLjAKICAgICAqIEBjYXRlZ29yeSBMYW5nCiAgICAgKiBAcGFyYW0geyp9IHZhbHVlIFRoZSB2YWx1ZSB0byBjb252ZXJ0LgogICAgICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY29udmVydGVkIHBsYWluIG9iamVjdC4KICAgICAqIEBleGFtcGxlCiAgICAgKgogICAgICogZnVuY3Rpb24gRm9vKCkgewogICAgICogICB0aGlzLmIgPSAyOwogICAgICogfQogICAgICoKICAgICAqIEZvby5wcm90b3R5cGUuYyA9IDM7CiAgICAgKgogICAgICogXy5hc3NpZ24oeyAnYSc6IDEgfSwgbmV3IEZvbyk7CiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAqCiAgICAgKiBfLmFzc2lnbih7ICdhJzogMSB9LCBfLnRvUGxhaW5PYmplY3QobmV3IEZvbykpOwogICAgICogLy8gPT4geyAnYSc6IDEsICdiJzogMiwgJ2MnOiAzIH0KICAgICAqLwogICAgZnVuY3Rpb24gdG9QbGFpbk9iamVjdCh2YWx1ZSkgewogICAgICByZXR1cm4gX2NvcHlPYmplY3QodmFsdWUsIGtleXNJbl8xKHZhbHVlKSk7CiAgICB9CgogICAgdmFyIHRvUGxhaW5PYmplY3RfMSA9IHRvUGxhaW5PYmplY3Q7CgogICAgLyoqCiAgICAgKiBBIHNwZWNpYWxpemVkIHZlcnNpb24gb2YgYGJhc2VNZXJnZWAgZm9yIGFycmF5cyBhbmQgb2JqZWN0cyB3aGljaCBwZXJmb3JtcwogICAgICogZGVlcCBtZXJnZXMgYW5kIHRyYWNrcyB0cmF2ZXJzZWQgb2JqZWN0cyBlbmFibGluZyBvYmplY3RzIHdpdGggY2lyY3VsYXIKICAgICAqIHJlZmVyZW5jZXMgdG8gYmUgbWVyZ2VkLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICogQHBhcmFtIHtzdHJpbmd9IGtleSBUaGUga2V5IG9mIHRoZSB2YWx1ZSB0byBtZXJnZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzcmNJbmRleCBUaGUgaW5kZXggb2YgYHNvdXJjZWAuCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBtZXJnZUZ1bmMgVGhlIGZ1bmN0aW9uIHRvIG1lcmdlIHZhbHVlcy4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIGFzc2lnbmVkIHZhbHVlcy4KICAgICAqIEBwYXJhbSB7T2JqZWN0fSBbc3RhY2tdIFRyYWNrcyB0cmF2ZXJzZWQgc291cmNlIHZhbHVlcyBhbmQgdGhlaXIgbWVyZ2VkCiAgICAgKiAgY291bnRlcnBhcnRzLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlTWVyZ2VEZWVwKG9iamVjdCwgc291cmNlLCBrZXksIHNyY0luZGV4LCBtZXJnZUZ1bmMsIGN1c3RvbWl6ZXIsIHN0YWNrKSB7CiAgICAgIHZhciBvYmpWYWx1ZSA9IF9zYWZlR2V0KG9iamVjdCwga2V5KSwKICAgICAgICAgIHNyY1ZhbHVlID0gX3NhZmVHZXQoc291cmNlLCBrZXkpLAogICAgICAgICAgc3RhY2tlZCA9IHN0YWNrLmdldChzcmNWYWx1ZSk7CgogICAgICBpZiAoc3RhY2tlZCkgewogICAgICAgIF9hc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBzdGFja2VkKTsKICAgICAgICByZXR1cm47CiAgICAgIH0KICAgICAgdmFyIG5ld1ZhbHVlID0gY3VzdG9taXplcgogICAgICAgID8gY3VzdG9taXplcihvYmpWYWx1ZSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaykKICAgICAgICA6IHVuZGVmaW5lZDsKCiAgICAgIHZhciBpc0NvbW1vbiA9IG5ld1ZhbHVlID09PSB1bmRlZmluZWQ7CgogICAgICBpZiAoaXNDb21tb24pIHsKICAgICAgICB2YXIgaXNBcnIgPSBpc0FycmF5XzEoc3JjVmFsdWUpLAogICAgICAgICAgICBpc0J1ZmYgPSAhaXNBcnIgJiYgaXNCdWZmZXJfMShzcmNWYWx1ZSksCiAgICAgICAgICAgIGlzVHlwZWQgPSAhaXNBcnIgJiYgIWlzQnVmZiAmJiBpc1R5cGVkQXJyYXlfMShzcmNWYWx1ZSk7CgogICAgICAgIG5ld1ZhbHVlID0gc3JjVmFsdWU7CiAgICAgICAgaWYgKGlzQXJyIHx8IGlzQnVmZiB8fCBpc1R5cGVkKSB7CiAgICAgICAgICBpZiAoaXNBcnJheV8xKG9ialZhbHVlKSkgewogICAgICAgICAgICBuZXdWYWx1ZSA9IG9ialZhbHVlOwogICAgICAgICAgfQogICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2VPYmplY3RfMShvYmpWYWx1ZSkpIHsKICAgICAgICAgICAgbmV3VmFsdWUgPSBfY29weUFycmF5KG9ialZhbHVlKTsKICAgICAgICAgIH0KICAgICAgICAgIGVsc2UgaWYgKGlzQnVmZikgewogICAgICAgICAgICBpc0NvbW1vbiA9IGZhbHNlOwogICAgICAgICAgICBuZXdWYWx1ZSA9IF9jbG9uZUJ1ZmZlcihzcmNWYWx1ZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmIChpc1R5cGVkKSB7CiAgICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7CiAgICAgICAgICAgIG5ld1ZhbHVlID0gX2Nsb25lVHlwZWRBcnJheShzcmNWYWx1ZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmV3VmFsdWUgPSBbXTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNQbGFpbk9iamVjdF8xKHNyY1ZhbHVlKSB8fCBpc0FyZ3VtZW50c18xKHNyY1ZhbHVlKSkgewogICAgICAgICAgbmV3VmFsdWUgPSBvYmpWYWx1ZTsKICAgICAgICAgIGlmIChpc0FyZ3VtZW50c18xKG9ialZhbHVlKSkgewogICAgICAgICAgICBuZXdWYWx1ZSA9IHRvUGxhaW5PYmplY3RfMShvYmpWYWx1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICBlbHNlIGlmICghaXNPYmplY3RfMShvYmpWYWx1ZSkgfHwgaXNGdW5jdGlvbl8xKG9ialZhbHVlKSkgewogICAgICAgICAgICBuZXdWYWx1ZSA9IF9pbml0Q2xvbmVPYmplY3Qoc3JjVmFsdWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIGlzQ29tbW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICB9CiAgICAgIGlmIChpc0NvbW1vbikgewogICAgICAgIC8vIFJlY3Vyc2l2ZWx5IG1lcmdlIG9iamVjdHMgYW5kIGFycmF5cyAoc3VzY2VwdGlibGUgdG8gY2FsbCBzdGFjayBsaW1pdHMpLgogICAgICAgIHN0YWNrLnNldChzcmNWYWx1ZSwgbmV3VmFsdWUpOwogICAgICAgIG1lcmdlRnVuYyhuZXdWYWx1ZSwgc3JjVmFsdWUsIHNyY0luZGV4LCBjdXN0b21pemVyLCBzdGFjayk7CiAgICAgICAgc3RhY2tbJ2RlbGV0ZSddKHNyY1ZhbHVlKTsKICAgICAgfQogICAgICBfYXNzaWduTWVyZ2VWYWx1ZShvYmplY3QsIGtleSwgbmV3VmFsdWUpOwogICAgfQoKICAgIHZhciBfYmFzZU1lcmdlRGVlcCA9IGJhc2VNZXJnZURlZXA7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5tZXJnZWAgd2l0aG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSBzb3VyY2VzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gc291cmNlIFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICogQHBhcmFtIHtudW1iZXJ9IHNyY0luZGV4IFRoZSBpbmRleCBvZiBgc291cmNlYC4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtjdXN0b21pemVyXSBUaGUgZnVuY3Rpb24gdG8gY3VzdG9taXplIG1lcmdlZCB2YWx1ZXMuCiAgICAgKiBAcGFyYW0ge09iamVjdH0gW3N0YWNrXSBUcmFja3MgdHJhdmVyc2VkIHNvdXJjZSB2YWx1ZXMgYW5kIHRoZWlyIG1lcmdlZAogICAgICogIGNvdW50ZXJwYXJ0cy4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZU1lcmdlKG9iamVjdCwgc291cmNlLCBzcmNJbmRleCwgY3VzdG9taXplciwgc3RhY2spIHsKICAgICAgaWYgKG9iamVjdCA9PT0gc291cmNlKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CiAgICAgIF9iYXNlRm9yKHNvdXJjZSwgZnVuY3Rpb24oc3JjVmFsdWUsIGtleSkgewogICAgICAgIHN0YWNrIHx8IChzdGFjayA9IG5ldyBfU3RhY2spOwogICAgICAgIGlmIChpc09iamVjdF8xKHNyY1ZhbHVlKSkgewogICAgICAgICAgX2Jhc2VNZXJnZURlZXAob2JqZWN0LCBzb3VyY2UsIGtleSwgc3JjSW5kZXgsIGJhc2VNZXJnZSwgY3VzdG9taXplciwgc3RhY2spOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciBuZXdWYWx1ZSA9IGN1c3RvbWl6ZXIKICAgICAgICAgICAgPyBjdXN0b21pemVyKF9zYWZlR2V0KG9iamVjdCwga2V5KSwgc3JjVmFsdWUsIChrZXkgKyAnJyksIG9iamVjdCwgc291cmNlLCBzdGFjaykKICAgICAgICAgICAgOiB1bmRlZmluZWQ7CgogICAgICAgICAgaWYgKG5ld1ZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbmV3VmFsdWUgPSBzcmNWYWx1ZTsKICAgICAgICAgIH0KICAgICAgICAgIF9hc3NpZ25NZXJnZVZhbHVlKG9iamVjdCwga2V5LCBuZXdWYWx1ZSk7CiAgICAgICAgfQogICAgICB9LCBrZXlzSW5fMSk7CiAgICB9CgogICAgdmFyIF9iYXNlTWVyZ2UgPSBiYXNlTWVyZ2U7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZnVuY3Rpb24gbGlrZSBgXy5hc3NpZ25gLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBhc3NpZ25lciBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IGFzc2lnbmVyIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVBc3NpZ25lcihhc3NpZ25lcikgewogICAgICByZXR1cm4gX2Jhc2VSZXN0KGZ1bmN0aW9uKG9iamVjdCwgc291cmNlcykgewogICAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgICBsZW5ndGggPSBzb3VyY2VzLmxlbmd0aCwKICAgICAgICAgICAgY3VzdG9taXplciA9IGxlbmd0aCA+IDEgPyBzb3VyY2VzW2xlbmd0aCAtIDFdIDogdW5kZWZpbmVkLAogICAgICAgICAgICBndWFyZCA9IGxlbmd0aCA+IDIgPyBzb3VyY2VzWzJdIDogdW5kZWZpbmVkOwoKICAgICAgICBjdXN0b21pemVyID0gKGFzc2lnbmVyLmxlbmd0aCA+IDMgJiYgdHlwZW9mIGN1c3RvbWl6ZXIgPT0gJ2Z1bmN0aW9uJykKICAgICAgICAgID8gKGxlbmd0aC0tLCBjdXN0b21pemVyKQogICAgICAgICAgOiB1bmRlZmluZWQ7CgogICAgICAgIGlmIChndWFyZCAmJiBfaXNJdGVyYXRlZUNhbGwoc291cmNlc1swXSwgc291cmNlc1sxXSwgZ3VhcmQpKSB7CiAgICAgICAgICBjdXN0b21pemVyID0gbGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IGN1c3RvbWl6ZXI7CiAgICAgICAgICBsZW5ndGggPSAxOwogICAgICAgIH0KICAgICAgICBvYmplY3QgPSBPYmplY3Qob2JqZWN0KTsKICAgICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgICAgdmFyIHNvdXJjZSA9IHNvdXJjZXNbaW5kZXhdOwogICAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICBhc3NpZ25lcihvYmplY3QsIHNvdXJjZSwgaW5kZXgsIGN1c3RvbWl6ZXIpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JqZWN0OwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgX2NyZWF0ZUFzc2lnbmVyID0gY3JlYXRlQXNzaWduZXI7CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLmFzc2lnbmAgZXhjZXB0IHRoYXQgaXQgcmVjdXJzaXZlbHkgbWVyZ2VzIG93biBhbmQKICAgICAqIGluaGVyaXRlZCBlbnVtZXJhYmxlIHN0cmluZyBrZXllZCBwcm9wZXJ0aWVzIG9mIHNvdXJjZSBvYmplY3RzIGludG8gdGhlCiAgICAgKiBkZXN0aW5hdGlvbiBvYmplY3QuIFNvdXJjZSBwcm9wZXJ0aWVzIHRoYXQgcmVzb2x2ZSB0byBgdW5kZWZpbmVkYCBhcmUKICAgICAqIHNraXBwZWQgaWYgYSBkZXN0aW5hdGlvbiB2YWx1ZSBleGlzdHMuIEFycmF5IGFuZCBwbGFpbiBvYmplY3QgcHJvcGVydGllcwogICAgICogYXJlIG1lcmdlZCByZWN1cnNpdmVseS4gT3RoZXIgb2JqZWN0cyBhbmQgdmFsdWUgdHlwZXMgYXJlIG92ZXJyaWRkZW4gYnkKICAgICAqIGFzc2lnbm1lbnQuIFNvdXJjZSBvYmplY3RzIGFyZSBhcHBsaWVkIGZyb20gbGVmdCB0byByaWdodC4gU3Vic2VxdWVudAogICAgICogc291cmNlcyBvdmVyd3JpdGUgcHJvcGVydHkgYXNzaWdubWVudHMgb2YgcHJldmlvdXMgc291cmNlcy4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogVGhpcyBtZXRob2QgbXV0YXRlcyBgb2JqZWN0YC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuNS4wCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBkZXN0aW5hdGlvbiBvYmplY3QuCiAgICAgKiBAcGFyYW0gey4uLk9iamVjdH0gW3NvdXJjZXNdIFRoZSBzb3VyY2Ugb2JqZWN0cy4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3QgPSB7CiAgICAgKiAgICdhJzogW3sgJ2InOiAyIH0sIHsgJ2QnOiA0IH1dCiAgICAgKiB9OwogICAgICoKICAgICAqIHZhciBvdGhlciA9IHsKICAgICAqICAgJ2EnOiBbeyAnYyc6IDMgfSwgeyAnZSc6IDUgfV0KICAgICAqIH07CiAgICAgKgogICAgICogXy5tZXJnZShvYmplY3QsIG90aGVyKTsKICAgICAqIC8vID0+IHsgJ2EnOiBbeyAnYic6IDIsICdjJzogMyB9LCB7ICdkJzogNCwgJ2UnOiA1IH1dIH0KICAgICAqLwogICAgdmFyIG1lcmdlJDMgPSBfY3JlYXRlQXNzaWduZXIoZnVuY3Rpb24ob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KSB7CiAgICAgIF9iYXNlTWVyZ2Uob2JqZWN0LCBzb3VyY2UsIHNyY0luZGV4KTsKICAgIH0pOwoKICAgIHZhciBtZXJnZV8xID0gbWVyZ2UkMzsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLmx0YCB3aGljaCBkb2Vzbid0IGNvZXJjZSBhcmd1bWVudHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7Kn0gdmFsdWUgVGhlIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgKiBAcGFyYW0geyp9IG90aGVyIFRoZSBvdGhlciB2YWx1ZSB0byBjb21wYXJlLgogICAgICogQHJldHVybnMge2Jvb2xlYW59IFJldHVybnMgYHRydWVgIGlmIGB2YWx1ZWAgaXMgbGVzcyB0aGFuIGBvdGhlcmAsCiAgICAgKiAgZWxzZSBgZmFsc2VgLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlTHQodmFsdWUsIG90aGVyKSB7CiAgICAgIHJldHVybiB2YWx1ZSA8IG90aGVyOwogICAgfQoKICAgIHZhciBfYmFzZUx0ID0gYmFzZUx0OwoKICAgIC8qKgogICAgICogQ29tcHV0ZXMgdGhlIG1pbmltdW0gdmFsdWUgb2YgYGFycmF5YC4gSWYgYGFycmF5YCBpcyBlbXB0eSBvciBmYWxzZXksCiAgICAgKiBgdW5kZWZpbmVkYCBpcyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgTWF0aAogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLm1pbihbNCwgMiwgOCwgNl0pOwogICAgICogLy8gPT4gMgogICAgICoKICAgICAqIF8ubWluKFtdKTsKICAgICAqIC8vID0+IHVuZGVmaW5lZAogICAgICovCiAgICBmdW5jdGlvbiBtaW4kNChhcnJheSkgewogICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICA/IF9iYXNlRXh0cmVtdW0oYXJyYXksIGlkZW50aXR5XzEsIF9iYXNlTHQpCiAgICAgICAgOiB1bmRlZmluZWQ7CiAgICB9CgogICAgdmFyIG1pbl8xID0gbWluJDQ7CgogICAgLyoqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyBsaWtlIGBfLm1pbmAgZXhjZXB0IHRoYXQgaXQgYWNjZXB0cyBgaXRlcmF0ZWVgIHdoaWNoIGlzCiAgICAgKiBpbnZva2VkIGZvciBlYWNoIGVsZW1lbnQgaW4gYGFycmF5YCB0byBnZW5lcmF0ZSB0aGUgY3JpdGVyaW9uIGJ5IHdoaWNoCiAgICAgKiB0aGUgdmFsdWUgaXMgcmFua2VkLiBUaGUgaXRlcmF0ZWUgaXMgaW52b2tlZCB3aXRoIG9uZSBhcmd1bWVudDogKHZhbHVlKS4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDQuMC4wCiAgICAgKiBAY2F0ZWdvcnkgTWF0aAogICAgICogQHBhcmFtIHtBcnJheX0gYXJyYXkgVGhlIGFycmF5IHRvIGl0ZXJhdGUgb3Zlci4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IFtpdGVyYXRlZT1fLmlkZW50aXR5XSBUaGUgaXRlcmF0ZWUgaW52b2tlZCBwZXIgZWxlbWVudC4KICAgICAqIEByZXR1cm5zIHsqfSBSZXR1cm5zIHRoZSBtaW5pbXVtIHZhbHVlLgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgb2JqZWN0cyA9IFt7ICduJzogMSB9LCB7ICduJzogMiB9XTsKICAgICAqCiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsIGZ1bmN0aW9uKG8pIHsgcmV0dXJuIG8ubjsgfSk7CiAgICAgKiAvLyA9PiB7ICduJzogMSB9CiAgICAgKgogICAgICogLy8gVGhlIGBfLnByb3BlcnR5YCBpdGVyYXRlZSBzaG9ydGhhbmQuCiAgICAgKiBfLm1pbkJ5KG9iamVjdHMsICduJyk7CiAgICAgKiAvLyA9PiB7ICduJzogMSB9CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1pbkJ5KGFycmF5LCBpdGVyYXRlZSkgewogICAgICByZXR1cm4gKGFycmF5ICYmIGFycmF5Lmxlbmd0aCkKICAgICAgICA/IF9iYXNlRXh0cmVtdW0oYXJyYXksIF9iYXNlSXRlcmF0ZWUoaXRlcmF0ZWUpLCBfYmFzZUx0KQogICAgICAgIDogdW5kZWZpbmVkOwogICAgfQoKICAgIHZhciBtaW5CeV8xID0gbWluQnk7CgogICAgLyoqCiAgICAgKiBHZXRzIHRoZSB0aW1lc3RhbXAgb2YgdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdGhhdCBoYXZlIGVsYXBzZWQgc2luY2UKICAgICAqIHRoZSBVbml4IGVwb2NoICgxIEphbnVhcnkgMTk3MCAwMDowMDowMCBVVEMpLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMi40LjAKICAgICAqIEBjYXRlZ29yeSBEYXRlCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSB0aW1lc3RhbXAuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uZGVmZXIoZnVuY3Rpb24oc3RhbXApIHsKICAgICAqICAgY29uc29sZS5sb2coXy5ub3coKSAtIHN0YW1wKTsKICAgICAqIH0sIF8ubm93KCkpOwogICAgICogLy8gPT4gTG9ncyB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBpdCB0b29rIGZvciB0aGUgZGVmZXJyZWQgaW52b2NhdGlvbi4KICAgICAqLwogICAgdmFyIG5vdyQ2ID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiBfcm9vdC5EYXRlLm5vdygpOwogICAgfTsKCiAgICB2YXIgbm93XzEgPSBub3ckNjsKCiAgICAvKioKICAgICAqIFRoZSBiYXNlIGltcGxlbWVudGF0aW9uIG9mIGBfLnNldGAuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBtb2RpZnkuCiAgICAgKiBAcGFyYW0ge0FycmF5fHN0cmluZ30gcGF0aCBUaGUgcGF0aCBvZiB0aGUgcHJvcGVydHkgdG8gc2V0LgogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gc2V0LgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gW2N1c3RvbWl6ZXJdIFRoZSBmdW5jdGlvbiB0byBjdXN0b21pemUgcGF0aCBjcmVhdGlvbi4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgYG9iamVjdGAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VTZXQob2JqZWN0LCBwYXRoLCB2YWx1ZSwgY3VzdG9taXplcikgewogICAgICBpZiAoIWlzT2JqZWN0XzEob2JqZWN0KSkgewogICAgICAgIHJldHVybiBvYmplY3Q7CiAgICAgIH0KICAgICAgcGF0aCA9IF9jYXN0UGF0aChwYXRoLCBvYmplY3QpOwoKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBsZW5ndGggPSBwYXRoLmxlbmd0aCwKICAgICAgICAgIGxhc3RJbmRleCA9IGxlbmd0aCAtIDEsCiAgICAgICAgICBuZXN0ZWQgPSBvYmplY3Q7CgogICAgICB3aGlsZSAobmVzdGVkICE9IG51bGwgJiYgKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciBrZXkgPSBfdG9LZXkocGF0aFtpbmRleF0pLAogICAgICAgICAgICBuZXdWYWx1ZSA9IHZhbHVlOwoKICAgICAgICBpZiAoaW5kZXggIT0gbGFzdEluZGV4KSB7CiAgICAgICAgICB2YXIgb2JqVmFsdWUgPSBuZXN0ZWRba2V5XTsKICAgICAgICAgIG5ld1ZhbHVlID0gY3VzdG9taXplciA/IGN1c3RvbWl6ZXIob2JqVmFsdWUsIGtleSwgbmVzdGVkKSA6IHVuZGVmaW5lZDsKICAgICAgICAgIGlmIChuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5ld1ZhbHVlID0gaXNPYmplY3RfMShvYmpWYWx1ZSkKICAgICAgICAgICAgICA/IG9ialZhbHVlCiAgICAgICAgICAgICAgOiAoX2lzSW5kZXgocGF0aFtpbmRleCArIDFdKSA/IFtdIDoge30pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfYXNzaWduVmFsdWUobmVzdGVkLCBrZXksIG5ld1ZhbHVlKTsKICAgICAgICBuZXN0ZWQgPSBuZXN0ZWRba2V5XTsKICAgICAgfQogICAgICByZXR1cm4gb2JqZWN0OwogICAgfQoKICAgIHZhciBfYmFzZVNldCA9IGJhc2VTZXQ7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiAgYF8ucGlja0J5YCB3aXRob3V0IHN1cHBvcnQgZm9yIGl0ZXJhdGVlIHNob3J0aGFuZHMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIHNvdXJjZSBvYmplY3QuCiAgICAgKiBAcGFyYW0ge3N0cmluZ1tdfSBwYXRocyBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay4KICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHByZWRpY2F0ZSBUaGUgZnVuY3Rpb24gaW52b2tlZCBwZXIgcHJvcGVydHkuCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlUGlja0J5KG9iamVjdCwgcGF0aHMsIHByZWRpY2F0ZSkgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IHBhdGhzLmxlbmd0aCwKICAgICAgICAgIHJlc3VsdCA9IHt9OwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIgcGF0aCA9IHBhdGhzW2luZGV4XSwKICAgICAgICAgICAgdmFsdWUgPSBfYmFzZUdldChvYmplY3QsIHBhdGgpOwoKICAgICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBwYXRoKSkgewogICAgICAgICAgX2Jhc2VTZXQocmVzdWx0LCBfY2FzdFBhdGgocGF0aCwgb2JqZWN0KSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIHZhciBfYmFzZVBpY2tCeSA9IGJhc2VQaWNrQnk7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5waWNrYCB3aXRob3V0IHN1cHBvcnQgZm9yIGluZGl2aWR1YWwKICAgICAqIHByb3BlcnR5IGlkZW50aWZpZXJzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0gcGF0aHMgVGhlIHByb3BlcnR5IHBhdGhzIHRvIHBpY2suCiAgICAgKiBAcmV0dXJucyB7T2JqZWN0fSBSZXR1cm5zIHRoZSBuZXcgb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlUGljayhvYmplY3QsIHBhdGhzKSB7CiAgICAgIHJldHVybiBfYmFzZVBpY2tCeShvYmplY3QsIHBhdGhzLCBmdW5jdGlvbih2YWx1ZSwgcGF0aCkgewogICAgICAgIHJldHVybiBoYXNJbl8xKG9iamVjdCwgcGF0aCk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBfYmFzZVBpY2sgPSBiYXNlUGljazsKCiAgICAvKioKICAgICAqIEEgc3BlY2lhbGl6ZWQgdmVyc2lvbiBvZiBgYmFzZVJlc3RgIHdoaWNoIGZsYXR0ZW5zIHRoZSByZXN0IGFycmF5LgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jIFRoZSBmdW5jdGlvbiB0byBhcHBseSBhIHJlc3QgcGFyYW1ldGVyIHRvLgogICAgICogQHJldHVybnMge0Z1bmN0aW9ufSBSZXR1cm5zIHRoZSBuZXcgZnVuY3Rpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZsYXRSZXN0KGZ1bmMpIHsKICAgICAgcmV0dXJuIF9zZXRUb1N0cmluZyhfb3ZlclJlc3QoZnVuYywgdW5kZWZpbmVkLCBmbGF0dGVuXzEpLCBmdW5jICsgJycpOwogICAgfQoKICAgIHZhciBfZmxhdFJlc3QgPSBmbGF0UmVzdDsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gb2JqZWN0IGNvbXBvc2VkIG9mIHRoZSBwaWNrZWQgYG9iamVjdGAgcHJvcGVydGllcy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAY2F0ZWdvcnkgT2JqZWN0CiAgICAgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IFRoZSBzb3VyY2Ugb2JqZWN0LgogICAgICogQHBhcmFtIHsuLi4oc3RyaW5nfHN0cmluZ1tdKX0gW3BhdGhzXSBUaGUgcHJvcGVydHkgcGF0aHMgdG8gcGljay4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIHZhciBvYmplY3QgPSB7ICdhJzogMSwgJ2InOiAnMicsICdjJzogMyB9OwogICAgICoKICAgICAqIF8ucGljayhvYmplY3QsIFsnYScsICdjJ10pOwogICAgICogLy8gPT4geyAnYSc6IDEsICdjJzogMyB9CiAgICAgKi8KICAgIHZhciBwaWNrID0gX2ZsYXRSZXN0KGZ1bmN0aW9uKG9iamVjdCwgcGF0aHMpIHsKICAgICAgcmV0dXJuIG9iamVjdCA9PSBudWxsID8ge30gOiBfYmFzZVBpY2sob2JqZWN0LCBwYXRocyk7CiAgICB9KTsKCiAgICB2YXIgcGlja18xID0gcGljazsKCiAgICAvKiBCdWlsdC1pbiBtZXRob2QgcmVmZXJlbmNlcyBmb3IgdGhvc2Ugd2l0aCB0aGUgc2FtZSBuYW1lIGFzIG90aGVyIGBsb2Rhc2hgIG1ldGhvZHMuICovCiAgICB2YXIgbmF0aXZlQ2VpbCA9IE1hdGguY2VpbCwKICAgICAgICBuYXRpdmVNYXgkMiA9IE1hdGgubWF4OwoKICAgIC8qKgogICAgICogVGhlIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8ucmFuZ2VgIGFuZCBgXy5yYW5nZVJpZ2h0YCB3aGljaCBkb2Vzbid0CiAgICAgKiBjb2VyY2UgYXJndW1lbnRzLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0IG9mIHRoZSByYW5nZS4KICAgICAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gc3RlcCBUaGUgdmFsdWUgdG8gaW5jcmVtZW50IG9yIGRlY3JlbWVudCBieS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2Zyb21SaWdodF0gU3BlY2lmeSBpdGVyYXRpbmcgZnJvbSByaWdodCB0byBsZWZ0LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLgogICAgICovCiAgICBmdW5jdGlvbiBiYXNlUmFuZ2Uoc3RhcnQsIGVuZCwgc3RlcCwgZnJvbVJpZ2h0KSB7CiAgICAgIHZhciBpbmRleCA9IC0xLAogICAgICAgICAgbGVuZ3RoID0gbmF0aXZlTWF4JDIobmF0aXZlQ2VpbCgoZW5kIC0gc3RhcnQpIC8gKHN0ZXAgfHwgMSkpLCAwKSwKICAgICAgICAgIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7CgogICAgICB3aGlsZSAobGVuZ3RoLS0pIHsKICAgICAgICByZXN1bHRbZnJvbVJpZ2h0ID8gbGVuZ3RoIDogKytpbmRleF0gPSBzdGFydDsKICAgICAgICBzdGFydCArPSBzdGVwOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9iYXNlUmFuZ2UgPSBiYXNlUmFuZ2U7CgogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgYF8ucmFuZ2VgIG9yIGBfLnJhbmdlUmlnaHRgIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtmcm9tUmlnaHRdIFNwZWNpZnkgaXRlcmF0aW5nIGZyb20gcmlnaHQgdG8gbGVmdC4KICAgICAqIEByZXR1cm5zIHtGdW5jdGlvbn0gUmV0dXJucyB0aGUgbmV3IHJhbmdlIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVSYW5nZShmcm9tUmlnaHQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHN0YXJ0LCBlbmQsIHN0ZXApIHsKICAgICAgICBpZiAoc3RlcCAmJiB0eXBlb2Ygc3RlcCAhPSAnbnVtYmVyJyAmJiBfaXNJdGVyYXRlZUNhbGwoc3RhcnQsIGVuZCwgc3RlcCkpIHsKICAgICAgICAgIGVuZCA9IHN0ZXAgPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIC8vIEVuc3VyZSB0aGUgc2lnbiBvZiBgLTBgIGlzIHByZXNlcnZlZC4KICAgICAgICBzdGFydCA9IHRvRmluaXRlXzEoc3RhcnQpOwogICAgICAgIGlmIChlbmQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgZW5kID0gc3RhcnQ7CiAgICAgICAgICBzdGFydCA9IDA7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVuZCA9IHRvRmluaXRlXzEoZW5kKTsKICAgICAgICB9CiAgICAgICAgc3RlcCA9IHN0ZXAgPT09IHVuZGVmaW5lZCA/IChzdGFydCA8IGVuZCA/IDEgOiAtMSkgOiB0b0Zpbml0ZV8xKHN0ZXApOwogICAgICAgIHJldHVybiBfYmFzZVJhbmdlKHN0YXJ0LCBlbmQsIHN0ZXAsIGZyb21SaWdodCk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIF9jcmVhdGVSYW5nZSA9IGNyZWF0ZVJhbmdlOwoKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIChwb3NpdGl2ZSBhbmQvb3IgbmVnYXRpdmUpIHByb2dyZXNzaW5nIGZyb20KICAgICAqIGBzdGFydGAgdXAgdG8sIGJ1dCBub3QgaW5jbHVkaW5nLCBgZW5kYC4gQSBzdGVwIG9mIGAtMWAgaXMgdXNlZCBpZiBhIG5lZ2F0aXZlCiAgICAgKiBgc3RhcnRgIGlzIHNwZWNpZmllZCB3aXRob3V0IGFuIGBlbmRgIG9yIGBzdGVwYC4gSWYgYGVuZGAgaXMgbm90IHNwZWNpZmllZCwKICAgICAqIGl0J3Mgc2V0IHRvIGBzdGFydGAgd2l0aCBgc3RhcnRgIHRoZW4gc2V0IHRvIGAwYC4KICAgICAqCiAgICAgKiAqKk5vdGU6KiogSmF2YVNjcmlwdCBmb2xsb3dzIHRoZSBJRUVFLTc1NCBzdGFuZGFyZCBmb3IgcmVzb2x2aW5nCiAgICAgKiBmbG9hdGluZy1wb2ludCB2YWx1ZXMgd2hpY2ggY2FuIHByb2R1Y2UgdW5leHBlY3RlZCByZXN1bHRzLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBzaW5jZSAwLjEuMAogICAgICogQG1lbWJlck9mIF8KICAgICAqIEBjYXRlZ29yeSBVdGlsCiAgICAgKiBAcGFyYW0ge251bWJlcn0gW3N0YXJ0PTBdIFRoZSBzdGFydCBvZiB0aGUgcmFuZ2UuCiAgICAgKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlLgogICAgICogQHBhcmFtIHtudW1iZXJ9IFtzdGVwPTFdIFRoZSB2YWx1ZSB0byBpbmNyZW1lbnQgb3IgZGVjcmVtZW50IGJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSByYW5nZSBvZiBudW1iZXJzLgogICAgICogQHNlZSBfLmluUmFuZ2UsIF8ucmFuZ2VSaWdodAogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLnJhbmdlKDQpOwogICAgICogLy8gPT4gWzAsIDEsIDIsIDNdCiAgICAgKgogICAgICogXy5yYW5nZSgtNCk7CiAgICAgKiAvLyA9PiBbMCwgLTEsIC0yLCAtM10KICAgICAqCiAgICAgKiBfLnJhbmdlKDEsIDUpOwogICAgICogLy8gPT4gWzEsIDIsIDMsIDRdCiAgICAgKgogICAgICogXy5yYW5nZSgwLCAyMCwgNSk7CiAgICAgKiAvLyA9PiBbMCwgNSwgMTAsIDE1XQogICAgICoKICAgICAqIF8ucmFuZ2UoMCwgLTQsIC0xKTsKICAgICAqIC8vID0+IFswLCAtMSwgLTIsIC0zXQogICAgICoKICAgICAqIF8ucmFuZ2UoMSwgNCwgMCk7CiAgICAgKiAvLyA9PiBbMSwgMSwgMV0KICAgICAqCiAgICAgKiBfLnJhbmdlKDApOwogICAgICogLy8gPT4gW10KICAgICAqLwogICAgdmFyIHJhbmdlJDUgPSBfY3JlYXRlUmFuZ2UoKTsKCiAgICB2YXIgcmFuZ2VfMSA9IHJhbmdlJDU7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5zb3J0QnlgIHdoaWNoIHVzZXMgYGNvbXBhcmVyYCB0byBkZWZpbmUgdGhlCiAgICAgKiBzb3J0IG9yZGVyIG9mIGBhcnJheWAgYW5kIHJlcGxhY2VzIGNyaXRlcmlhIG9iamVjdHMgd2l0aCB0aGVpciBjb3JyZXNwb25kaW5nCiAgICAgKiB2YWx1ZXMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IGFycmF5IFRoZSBhcnJheSB0byBzb3J0LgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gY29tcGFyZXIgVGhlIGZ1bmN0aW9uIHRvIGRlZmluZSBzb3J0IG9yZGVyLgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIGBhcnJheWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VTb3J0QnkoYXJyYXksIGNvbXBhcmVyKSB7CiAgICAgIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7CgogICAgICBhcnJheS5zb3J0KGNvbXBhcmVyKTsKICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7CiAgICAgICAgYXJyYXlbbGVuZ3RoXSA9IGFycmF5W2xlbmd0aF0udmFsdWU7CiAgICAgIH0KICAgICAgcmV0dXJuIGFycmF5OwogICAgfQoKICAgIHZhciBfYmFzZVNvcnRCeSA9IGJhc2VTb3J0Qnk7CgogICAgLyoqCiAgICAgKiBDb21wYXJlcyB2YWx1ZXMgdG8gc29ydCB0aGVtIGluIGFzY2VuZGluZyBvcmRlci4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHsqfSB2YWx1ZSBUaGUgdmFsdWUgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7Kn0gb3RoZXIgVGhlIG90aGVyIHZhbHVlIHRvIGNvbXBhcmUuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYHZhbHVlYC4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGFyZUFzY2VuZGluZyh2YWx1ZSwgb3RoZXIpIHsKICAgICAgaWYgKHZhbHVlICE9PSBvdGhlcikgewogICAgICAgIHZhciB2YWxJc0RlZmluZWQgPSB2YWx1ZSAhPT0gdW5kZWZpbmVkLAogICAgICAgICAgICB2YWxJc051bGwgPSB2YWx1ZSA9PT0gbnVsbCwKICAgICAgICAgICAgdmFsSXNSZWZsZXhpdmUgPSB2YWx1ZSA9PT0gdmFsdWUsCiAgICAgICAgICAgIHZhbElzU3ltYm9sID0gaXNTeW1ib2xfMSh2YWx1ZSk7CgogICAgICAgIHZhciBvdGhJc0RlZmluZWQgPSBvdGhlciAhPT0gdW5kZWZpbmVkLAogICAgICAgICAgICBvdGhJc051bGwgPSBvdGhlciA9PT0gbnVsbCwKICAgICAgICAgICAgb3RoSXNSZWZsZXhpdmUgPSBvdGhlciA9PT0gb3RoZXIsCiAgICAgICAgICAgIG90aElzU3ltYm9sID0gaXNTeW1ib2xfMShvdGhlcik7CgogICAgICAgIGlmICgoIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wgJiYgIXZhbElzU3ltYm9sICYmIHZhbHVlID4gb3RoZXIpIHx8CiAgICAgICAgICAgICh2YWxJc1N5bWJvbCAmJiBvdGhJc0RlZmluZWQgJiYgb3RoSXNSZWZsZXhpdmUgJiYgIW90aElzTnVsbCAmJiAhb3RoSXNTeW1ib2wpIHx8CiAgICAgICAgICAgICh2YWxJc051bGwgJiYgb3RoSXNEZWZpbmVkICYmIG90aElzUmVmbGV4aXZlKSB8fAogICAgICAgICAgICAoIXZhbElzRGVmaW5lZCAmJiBvdGhJc1JlZmxleGl2ZSkgfHwKICAgICAgICAgICAgIXZhbElzUmVmbGV4aXZlKSB7CiAgICAgICAgICByZXR1cm4gMTsKICAgICAgICB9CiAgICAgICAgaWYgKCghdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCAmJiAhb3RoSXNTeW1ib2wgJiYgdmFsdWUgPCBvdGhlcikgfHwKICAgICAgICAgICAgKG90aElzU3ltYm9sICYmIHZhbElzRGVmaW5lZCAmJiB2YWxJc1JlZmxleGl2ZSAmJiAhdmFsSXNOdWxsICYmICF2YWxJc1N5bWJvbCkgfHwKICAgICAgICAgICAgKG90aElzTnVsbCAmJiB2YWxJc0RlZmluZWQgJiYgdmFsSXNSZWZsZXhpdmUpIHx8CiAgICAgICAgICAgICghb3RoSXNEZWZpbmVkICYmIHZhbElzUmVmbGV4aXZlKSB8fAogICAgICAgICAgICAhb3RoSXNSZWZsZXhpdmUpIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIDA7CiAgICB9CgogICAgdmFyIF9jb21wYXJlQXNjZW5kaW5nID0gY29tcGFyZUFzY2VuZGluZzsKCiAgICAvKioKICAgICAqIFVzZWQgYnkgYF8ub3JkZXJCeWAgdG8gY29tcGFyZSBtdWx0aXBsZSBwcm9wZXJ0aWVzIG9mIGEgdmFsdWUgdG8gYW5vdGhlcgogICAgICogYW5kIHN0YWJsZSBzb3J0IHRoZW0uCiAgICAgKgogICAgICogSWYgYG9yZGVyc2AgaXMgdW5zcGVjaWZpZWQsIGFsbCB2YWx1ZXMgYXJlIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIuIE90aGVyd2lzZSwKICAgICAqIHNwZWNpZnkgYW4gb3JkZXIgb2YgImRlc2MiIGZvciBkZXNjZW5kaW5nIG9yICJhc2MiIGZvciBhc2NlbmRpbmcgc29ydCBvcmRlcgogICAgICogb2YgY29ycmVzcG9uZGluZyB2YWx1ZXMuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvYmplY3QgVGhlIG9iamVjdCB0byBjb21wYXJlLgogICAgICogQHBhcmFtIHtPYmplY3R9IG90aGVyIFRoZSBvdGhlciBvYmplY3QgdG8gY29tcGFyZS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbltdfHN0cmluZ1tdfSBvcmRlcnMgVGhlIG9yZGVyIHRvIHNvcnQgYnkgZm9yIGVhY2ggcHJvcGVydHkuCiAgICAgKiBAcmV0dXJucyB7bnVtYmVyfSBSZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGluZGljYXRvciBmb3IgYG9iamVjdGAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXBhcmVNdWx0aXBsZShvYmplY3QsIG90aGVyLCBvcmRlcnMpIHsKICAgICAgdmFyIGluZGV4ID0gLTEsCiAgICAgICAgICBvYmpDcml0ZXJpYSA9IG9iamVjdC5jcml0ZXJpYSwKICAgICAgICAgIG90aENyaXRlcmlhID0gb3RoZXIuY3JpdGVyaWEsCiAgICAgICAgICBsZW5ndGggPSBvYmpDcml0ZXJpYS5sZW5ndGgsCiAgICAgICAgICBvcmRlcnNMZW5ndGggPSBvcmRlcnMubGVuZ3RoOwoKICAgICAgd2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHsKICAgICAgICB2YXIgcmVzdWx0ID0gX2NvbXBhcmVBc2NlbmRpbmcob2JqQ3JpdGVyaWFbaW5kZXhdLCBvdGhDcml0ZXJpYVtpbmRleF0pOwogICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgIGlmIChpbmRleCA+PSBvcmRlcnNMZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgIH0KICAgICAgICAgIHZhciBvcmRlciA9IG9yZGVyc1tpbmRleF07CiAgICAgICAgICByZXR1cm4gcmVzdWx0ICogKG9yZGVyID09ICdkZXNjJyA/IC0xIDogMSk7CiAgICAgICAgfQogICAgICB9CiAgICAgIC8vIEZpeGVzIGFuIGBBcnJheSNzb3J0YCBidWcgaW4gdGhlIEpTIGVuZ2luZSBlbWJlZGRlZCBpbiBBZG9iZSBhcHBsaWNhdGlvbnMKICAgICAgLy8gdGhhdCBjYXVzZXMgaXQsIHVuZGVyIGNlcnRhaW4gY2lyY3Vtc3RhbmNlcywgdG8gcHJvdmlkZSB0aGUgc2FtZSB2YWx1ZSBmb3IKICAgICAgLy8gYG9iamVjdGAgYW5kIGBvdGhlcmAuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vamFzaGtlbmFzL3VuZGVyc2NvcmUvcHVsbC8xMjQ3CiAgICAgIC8vIGZvciBtb3JlIGRldGFpbHMuCiAgICAgIC8vCiAgICAgIC8vIFRoaXMgYWxzbyBlbnN1cmVzIGEgc3RhYmxlIHNvcnQgaW4gVjggYW5kIG90aGVyIGVuZ2luZXMuCiAgICAgIC8vIFNlZSBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD05MCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICByZXR1cm4gb2JqZWN0LmluZGV4IC0gb3RoZXIuaW5kZXg7CiAgICB9CgogICAgdmFyIF9jb21wYXJlTXVsdGlwbGUgPSBjb21wYXJlTXVsdGlwbGU7CgogICAgLyoqCiAgICAgKiBUaGUgYmFzZSBpbXBsZW1lbnRhdGlvbiBvZiBgXy5vcmRlckJ5YCB3aXRob3V0IHBhcmFtIGd1YXJkcy4KICAgICAqCiAgICAgKiBAcHJpdmF0ZQogICAgICogQHBhcmFtIHtBcnJheXxPYmplY3R9IGNvbGxlY3Rpb24gVGhlIGNvbGxlY3Rpb24gdG8gaXRlcmF0ZSBvdmVyLgogICAgICogQHBhcmFtIHtGdW5jdGlvbltdfE9iamVjdFtdfHN0cmluZ1tdfSBpdGVyYXRlZXMgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LgogICAgICogQHBhcmFtIHtzdHJpbmdbXX0gb3JkZXJzIFRoZSBzb3J0IG9yZGVycyBvZiBgaXRlcmF0ZWVzYC4KICAgICAqIEByZXR1cm5zIHtBcnJheX0gUmV0dXJucyB0aGUgbmV3IHNvcnRlZCBhcnJheS4KICAgICAqLwogICAgZnVuY3Rpb24gYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgaXRlcmF0ZWVzLCBvcmRlcnMpIHsKICAgICAgdmFyIGluZGV4ID0gLTE7CiAgICAgIGl0ZXJhdGVlcyA9IF9hcnJheU1hcChpdGVyYXRlZXMubGVuZ3RoID8gaXRlcmF0ZWVzIDogW2lkZW50aXR5XzFdLCBfYmFzZVVuYXJ5KF9iYXNlSXRlcmF0ZWUpKTsKCiAgICAgIHZhciByZXN1bHQgPSBfYmFzZU1hcChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBjb2xsZWN0aW9uKSB7CiAgICAgICAgdmFyIGNyaXRlcmlhID0gX2FycmF5TWFwKGl0ZXJhdGVlcywgZnVuY3Rpb24oaXRlcmF0ZWUpIHsKICAgICAgICAgIHJldHVybiBpdGVyYXRlZSh2YWx1ZSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHsgJ2NyaXRlcmlhJzogY3JpdGVyaWEsICdpbmRleCc6ICsraW5kZXgsICd2YWx1ZSc6IHZhbHVlIH07CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIF9iYXNlU29ydEJ5KHJlc3VsdCwgZnVuY3Rpb24ob2JqZWN0LCBvdGhlcikgewogICAgICAgIHJldHVybiBfY29tcGFyZU11bHRpcGxlKG9iamVjdCwgb3RoZXIsIG9yZGVycyk7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBfYmFzZU9yZGVyQnkgPSBiYXNlT3JkZXJCeTsKCiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gYXJyYXkgb2YgZWxlbWVudHMsIHNvcnRlZCBpbiBhc2NlbmRpbmcgb3JkZXIgYnkgdGhlIHJlc3VsdHMgb2YKICAgICAqIHJ1bm5pbmcgZWFjaCBlbGVtZW50IGluIGEgY29sbGVjdGlvbiB0aHJ1IGVhY2ggaXRlcmF0ZWUuIFRoaXMgbWV0aG9kCiAgICAgKiBwZXJmb3JtcyBhIHN0YWJsZSBzb3J0LCB0aGF0IGlzLCBpdCBwcmVzZXJ2ZXMgdGhlIG9yaWdpbmFsIHNvcnQgb3JkZXIgb2YKICAgICAqIGVxdWFsIGVsZW1lbnRzLiBUaGUgaXRlcmF0ZWVzIGFyZSBpbnZva2VkIHdpdGggb25lIGFyZ3VtZW50OiAodmFsdWUpLgogICAgICoKICAgICAqIEBzdGF0aWMKICAgICAqIEBtZW1iZXJPZiBfCiAgICAgKiBAc2luY2UgMC4xLjAKICAgICAqIEBjYXRlZ29yeSBDb2xsZWN0aW9uCiAgICAgKiBAcGFyYW0ge0FycmF5fE9iamVjdH0gY29sbGVjdGlvbiBUaGUgY29sbGVjdGlvbiB0byBpdGVyYXRlIG92ZXIuCiAgICAgKiBAcGFyYW0gey4uLihGdW5jdGlvbnxGdW5jdGlvbltdKX0gW2l0ZXJhdGVlcz1bXy5pZGVudGl0eV1dCiAgICAgKiAgVGhlIGl0ZXJhdGVlcyB0byBzb3J0IGJ5LgogICAgICogQHJldHVybnMge0FycmF5fSBSZXR1cm5zIHRoZSBuZXcgc29ydGVkIGFycmF5LgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiB2YXIgdXNlcnMgPSBbCiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQ4IH0sCiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM2IH0sCiAgICAgKiAgIHsgJ3VzZXInOiAnZnJlZCcsICAgJ2FnZSc6IDQwIH0sCiAgICAgKiAgIHsgJ3VzZXInOiAnYmFybmV5JywgJ2FnZSc6IDM0IH0KICAgICAqIF07CiAgICAgKgogICAgICogXy5zb3J0QnkodXNlcnMsIFtmdW5jdGlvbihvKSB7IHJldHVybiBvLnVzZXI7IH1dKTsKICAgICAqIC8vID0+IG9iamVjdHMgZm9yIFtbJ2Jhcm5leScsIDM2XSwgWydiYXJuZXknLCAzNF0sIFsnZnJlZCcsIDQ4XSwgWydmcmVkJywgNDBdXQogICAgICoKICAgICAqIF8uc29ydEJ5KHVzZXJzLCBbJ3VzZXInLCAnYWdlJ10pOwogICAgICogLy8gPT4gb2JqZWN0cyBmb3IgW1snYmFybmV5JywgMzRdLCBbJ2Jhcm5leScsIDM2XSwgWydmcmVkJywgNDBdLCBbJ2ZyZWQnLCA0OF1dCiAgICAgKi8KICAgIHZhciBzb3J0QnkgPSBfYmFzZVJlc3QoZnVuY3Rpb24oY29sbGVjdGlvbiwgaXRlcmF0ZWVzKSB7CiAgICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgdmFyIGxlbmd0aCA9IGl0ZXJhdGVlcy5sZW5ndGg7CiAgICAgIGlmIChsZW5ndGggPiAxICYmIF9pc0l0ZXJhdGVlQ2FsbChjb2xsZWN0aW9uLCBpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSkpIHsKICAgICAgICBpdGVyYXRlZXMgPSBbXTsKICAgICAgfSBlbHNlIGlmIChsZW5ndGggPiAyICYmIF9pc0l0ZXJhdGVlQ2FsbChpdGVyYXRlZXNbMF0sIGl0ZXJhdGVlc1sxXSwgaXRlcmF0ZWVzWzJdKSkgewogICAgICAgIGl0ZXJhdGVlcyA9IFtpdGVyYXRlZXNbMF1dOwogICAgICB9CiAgICAgIHJldHVybiBfYmFzZU9yZGVyQnkoY29sbGVjdGlvbiwgX2Jhc2VGbGF0dGVuKGl0ZXJhdGVlcywgMSksIFtdKTsKICAgIH0pOwoKICAgIHZhciBzb3J0QnlfMSA9IHNvcnRCeTsKCiAgICAvKiogVXNlZCB0byBnZW5lcmF0ZSB1bmlxdWUgSURzLiAqLwogICAgdmFyIGlkQ291bnRlciA9IDA7CgogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgYSB1bmlxdWUgSUQuIElmIGBwcmVmaXhgIGlzIGdpdmVuLCB0aGUgSUQgaXMgYXBwZW5kZWQgdG8gaXQuCiAgICAgKgogICAgICogQHN0YXRpYwogICAgICogQHNpbmNlIDAuMS4wCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQGNhdGVnb3J5IFV0aWwKICAgICAqIEBwYXJhbSB7c3RyaW5nfSBbcHJlZml4PScnXSBUaGUgdmFsdWUgdG8gcHJlZml4IHRoZSBJRCB3aXRoLgogICAgICogQHJldHVybnMge3N0cmluZ30gUmV0dXJucyB0aGUgdW5pcXVlIElELgogICAgICogQGV4YW1wbGUKICAgICAqCiAgICAgKiBfLnVuaXF1ZUlkKCdjb250YWN0XycpOwogICAgICogLy8gPT4gJ2NvbnRhY3RfMTA0JwogICAgICoKICAgICAqIF8udW5pcXVlSWQoKTsKICAgICAqIC8vID0+ICcxMDUnCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaXF1ZUlkKHByZWZpeCkgewogICAgICB2YXIgaWQgPSArK2lkQ291bnRlcjsKICAgICAgcmV0dXJuIHRvU3RyaW5nXzEocHJlZml4KSArIGlkOwogICAgfQoKICAgIHZhciB1bmlxdWVJZF8xID0gdW5pcXVlSWQ7CgogICAgLyoqCiAgICAgKiBUaGlzIGJhc2UgaW1wbGVtZW50YXRpb24gb2YgYF8uemlwT2JqZWN0YCB3aGljaCBhc3NpZ25zIHZhbHVlcyB1c2luZyBgYXNzaWduRnVuY2AuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqIEBwYXJhbSB7QXJyYXl9IHByb3BzIFRoZSBwcm9wZXJ0eSBpZGVudGlmaWVycy4KICAgICAqIEBwYXJhbSB7QXJyYXl9IHZhbHVlcyBUaGUgcHJvcGVydHkgdmFsdWVzLgogICAgICogQHBhcmFtIHtGdW5jdGlvbn0gYXNzaWduRnVuYyBUaGUgZnVuY3Rpb24gdG8gYXNzaWduIHZhbHVlcy4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhc2VaaXBPYmplY3QocHJvcHMsIHZhbHVlcywgYXNzaWduRnVuYykgewogICAgICB2YXIgaW5kZXggPSAtMSwKICAgICAgICAgIGxlbmd0aCA9IHByb3BzLmxlbmd0aCwKICAgICAgICAgIHZhbHNMZW5ndGggPSB2YWx1ZXMubGVuZ3RoLAogICAgICAgICAgcmVzdWx0ID0ge307CgogICAgICB3aGlsZSAoKytpbmRleCA8IGxlbmd0aCkgewogICAgICAgIHZhciB2YWx1ZSA9IGluZGV4IDwgdmFsc0xlbmd0aCA/IHZhbHVlc1tpbmRleF0gOiB1bmRlZmluZWQ7CiAgICAgICAgYXNzaWduRnVuYyhyZXN1bHQsIHByb3BzW2luZGV4XSwgdmFsdWUpOwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIF9iYXNlWmlwT2JqZWN0ID0gYmFzZVppcE9iamVjdDsKCiAgICAvKioKICAgICAqIFRoaXMgbWV0aG9kIGlzIGxpa2UgYF8uZnJvbVBhaXJzYCBleGNlcHQgdGhhdCBpdCBhY2NlcHRzIHR3byBhcnJheXMsCiAgICAgKiBvbmUgb2YgcHJvcGVydHkgaWRlbnRpZmllcnMgYW5kIG9uZSBvZiBjb3JyZXNwb25kaW5nIHZhbHVlcy4KICAgICAqCiAgICAgKiBAc3RhdGljCiAgICAgKiBAbWVtYmVyT2YgXwogICAgICogQHNpbmNlIDAuNC4wCiAgICAgKiBAY2F0ZWdvcnkgQXJyYXkKICAgICAqIEBwYXJhbSB7QXJyYXl9IFtwcm9wcz1bXV0gVGhlIHByb3BlcnR5IGlkZW50aWZpZXJzLgogICAgICogQHBhcmFtIHtBcnJheX0gW3ZhbHVlcz1bXV0gVGhlIHByb3BlcnR5IHZhbHVlcy4KICAgICAqIEByZXR1cm5zIHtPYmplY3R9IFJldHVybnMgdGhlIG5ldyBvYmplY3QuCiAgICAgKiBAZXhhbXBsZQogICAgICoKICAgICAqIF8uemlwT2JqZWN0KFsnYScsICdiJ10sIFsxLCAyXSk7CiAgICAgKiAvLyA9PiB7ICdhJzogMSwgJ2InOiAyIH0KICAgICAqLwogICAgZnVuY3Rpb24gemlwT2JqZWN0KHByb3BzLCB2YWx1ZXMpIHsKICAgICAgcmV0dXJuIF9iYXNlWmlwT2JqZWN0KHByb3BzIHx8IFtdLCB2YWx1ZXMgfHwgW10sIF9hc3NpZ25WYWx1ZSk7CiAgICB9CgogICAgdmFyIHppcE9iamVjdF8xID0gemlwT2JqZWN0OwoKICAgIC8qIGdsb2JhbCB3aW5kb3cgKi8KCiAgICB2YXIgbG9kYXNoJDI7CgogICAgaWYgKHR5cGVvZiBjb21tb25qc1JlcXVpcmUgPT09ICJmdW5jdGlvbiIpIHsKICAgICAgdHJ5IHsKICAgICAgICBsb2Rhc2gkMiA9IHsKICAgICAgICAgIGNsb25lRGVlcDogY2xvbmVEZWVwXzEsCiAgICAgICAgICBjb25zdGFudDogY29uc3RhbnRfMSwKICAgICAgICAgIGRlZmF1bHRzOiBkZWZhdWx0c18xLAogICAgICAgICAgZWFjaDogZWFjaCwKICAgICAgICAgIGZpbHRlcjogZmlsdGVyXzEsCiAgICAgICAgICBmaW5kOiBmaW5kXzEsCiAgICAgICAgICBmbGF0dGVuOiBmbGF0dGVuXzEsCiAgICAgICAgICBmb3JFYWNoOiBmb3JFYWNoXzEsCiAgICAgICAgICBmb3JJbjogZm9ySW5fMSwKICAgICAgICAgIGhhczogIGhhc18xLAogICAgICAgICAgaXNVbmRlZmluZWQ6IGlzVW5kZWZpbmVkXzEsCiAgICAgICAgICBsYXN0OiBsYXN0XzEsCiAgICAgICAgICBtYXA6IG1hcF8xLAogICAgICAgICAgbWFwVmFsdWVzOiBtYXBWYWx1ZXNfMSwKICAgICAgICAgIG1heDogbWF4XzEsCiAgICAgICAgICBtZXJnZTogbWVyZ2VfMSwKICAgICAgICAgIG1pbjogbWluXzEsCiAgICAgICAgICBtaW5CeTogbWluQnlfMSwKICAgICAgICAgIG5vdzogbm93XzEsCiAgICAgICAgICBwaWNrOiBwaWNrXzEsCiAgICAgICAgICByYW5nZTogcmFuZ2VfMSwKICAgICAgICAgIHJlZHVjZTogcmVkdWNlXzEsCiAgICAgICAgICBzb3J0Qnk6IHNvcnRCeV8xLAogICAgICAgICAgdW5pcXVlSWQ6IHVuaXF1ZUlkXzEsCiAgICAgICAgICB2YWx1ZXM6IHZhbHVlc18xLAogICAgICAgICAgemlwT2JqZWN0OiB6aXBPYmplY3RfMSwKICAgICAgICB9OwogICAgICB9IGNhdGNoIChlKSB7CiAgICAgICAgLy8gY29udGludWUgcmVnYXJkbGVzcyBvZiBlcnJvcgogICAgICB9CiAgICB9CgogICAgaWYgKCFsb2Rhc2gkMikgewogICAgICBsb2Rhc2gkMiA9IHdpbmRvdy5fOwogICAgfQoKICAgIHZhciBsb2Rhc2hfMSQxID0gbG9kYXNoJDI7CgogICAgLyoKICAgICAqIFNpbXBsZSBkb3VibHkgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb24gZGVyaXZlZCBmcm9tIENvcm1lbiwgZXQgYWwuLAogICAgICogIkludHJvZHVjdGlvbiB0byBBbGdvcml0aG1zIi4KICAgICAqLwoKICAgIHZhciBsaXN0ID0gTGlzdDsKCiAgICBmdW5jdGlvbiBMaXN0KCkgewogICAgICB2YXIgc2VudGluZWwgPSB7fTsKICAgICAgc2VudGluZWwuX25leHQgPSBzZW50aW5lbC5fcHJldiA9IHNlbnRpbmVsOwogICAgICB0aGlzLl9zZW50aW5lbCA9IHNlbnRpbmVsOwogICAgfQoKICAgIExpc3QucHJvdG90eXBlLmRlcXVldWUgPSBmdW5jdGlvbigpIHsKICAgICAgdmFyIHNlbnRpbmVsID0gdGhpcy5fc2VudGluZWw7CiAgICAgIHZhciBlbnRyeSA9IHNlbnRpbmVsLl9wcmV2OwogICAgICBpZiAoZW50cnkgIT09IHNlbnRpbmVsKSB7CiAgICAgICAgdW5saW5rKGVudHJ5KTsKICAgICAgICByZXR1cm4gZW50cnk7CiAgICAgIH0KICAgIH07CgogICAgTGlzdC5wcm90b3R5cGUuZW5xdWV1ZSA9IGZ1bmN0aW9uKGVudHJ5KSB7CiAgICAgIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsOwogICAgICBpZiAoZW50cnkuX3ByZXYgJiYgZW50cnkuX25leHQpIHsKICAgICAgICB1bmxpbmsoZW50cnkpOwogICAgICB9CiAgICAgIGVudHJ5Ll9uZXh0ID0gc2VudGluZWwuX25leHQ7CiAgICAgIHNlbnRpbmVsLl9uZXh0Ll9wcmV2ID0gZW50cnk7CiAgICAgIHNlbnRpbmVsLl9uZXh0ID0gZW50cnk7CiAgICAgIGVudHJ5Ll9wcmV2ID0gc2VudGluZWw7CiAgICB9OwoKICAgIExpc3QucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHZhciBzdHJzID0gW107CiAgICAgIHZhciBzZW50aW5lbCA9IHRoaXMuX3NlbnRpbmVsOwogICAgICB2YXIgY3VyciA9IHNlbnRpbmVsLl9wcmV2OwogICAgICB3aGlsZSAoY3VyciAhPT0gc2VudGluZWwpIHsKICAgICAgICBzdHJzLnB1c2goSlNPTi5zdHJpbmdpZnkoY3VyciwgZmlsdGVyT3V0TGlua3MpKTsKICAgICAgICBjdXJyID0gY3Vyci5fcHJldjsKICAgICAgfQogICAgICByZXR1cm4gIlsiICsgc3Rycy5qb2luKCIsICIpICsgIl0iOwogICAgfTsKCiAgICBmdW5jdGlvbiB1bmxpbmsoZW50cnkpIHsKICAgICAgZW50cnkuX3ByZXYuX25leHQgPSBlbnRyeS5fbmV4dDsKICAgICAgZW50cnkuX25leHQuX3ByZXYgPSBlbnRyeS5fcHJldjsKICAgICAgZGVsZXRlIGVudHJ5Ll9uZXh0OwogICAgICBkZWxldGUgZW50cnkuX3ByZXY7CiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyT3V0TGlua3MoaywgdikgewogICAgICBpZiAoayAhPT0gIl9uZXh0IiAmJiBrICE9PSAiX3ByZXYiKSB7CiAgICAgICAgcmV0dXJuIHY7CiAgICAgIH0KICAgIH0KCiAgICB2YXIgR3JhcGgkMSA9IGdyYXBobGliXzEuR3JhcGg7CgoKICAgIC8qCiAgICAgKiBBIGdyZWVkeSBoZXVyaXN0aWMgZm9yIGZpbmRpbmcgYSBmZWVkYmFjayBhcmMgc2V0IGZvciBhIGdyYXBoLiBBIGZlZWRiYWNrCiAgICAgKiBhcmMgc2V0IGlzIGEgc2V0IG9mIGVkZ2VzIHRoYXQgY2FuIGJlIHJlbW92ZWQgdG8gbWFrZSBhIGdyYXBoIGFjeWNsaWMuCiAgICAgKiBUaGUgYWxnb3JpdGhtIGNvbWVzIGZyb206IFAuIEVhZGVzLCBYLiBMaW4sIGFuZCBXLiBGLiBTbXl0aCwgIkEgZmFzdCBhbmQKICAgICAqIGVmZmVjdGl2ZSBoZXVyaXN0aWMgZm9yIHRoZSBmZWVkYmFjayBhcmMgc2V0IHByb2JsZW0uIiBUaGlzIGltcGxlbWVudGF0aW9uCiAgICAgKiBhZGp1c3RzIHRoYXQgZnJvbSB0aGUgcGFwZXIgdG8gYWxsb3cgZm9yIHdlaWdodGVkIGVkZ2VzLgogICAgICovCiAgICB2YXIgZ3JlZWR5RmFzID0gZ3JlZWR5RkFTOwoKICAgIHZhciBERUZBVUxUX1dFSUdIVF9GTiA9IGxvZGFzaF8xJDEuY29uc3RhbnQoMSk7CgogICAgZnVuY3Rpb24gZ3JlZWR5RkFTKGcsIHdlaWdodEZuKSB7CiAgICAgIGlmIChnLm5vZGVDb3VudCgpIDw9IDEpIHsKICAgICAgICByZXR1cm4gW107CiAgICAgIH0KICAgICAgdmFyIHN0YXRlID0gYnVpbGRTdGF0ZShnLCB3ZWlnaHRGbiB8fCBERUZBVUxUX1dFSUdIVF9GTik7CiAgICAgIHZhciByZXN1bHRzID0gZG9HcmVlZHlGQVMoc3RhdGUuZ3JhcGgsIHN0YXRlLmJ1Y2tldHMsIHN0YXRlLnplcm9JZHgpOwoKICAgICAgLy8gRXhwYW5kIG11bHRpLWVkZ2VzCiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLmZsYXR0ZW4obG9kYXNoXzEkMS5tYXAocmVzdWx0cywgZnVuY3Rpb24oZSkgewogICAgICAgIHJldHVybiBnLm91dEVkZ2VzKGUudiwgZS53KTsKICAgICAgfSksIHRydWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRvR3JlZWR5RkFTKGcsIGJ1Y2tldHMsIHplcm9JZHgpIHsKICAgICAgdmFyIHJlc3VsdHMgPSBbXTsKICAgICAgdmFyIHNvdXJjZXMgPSBidWNrZXRzW2J1Y2tldHMubGVuZ3RoIC0gMV07CiAgICAgIHZhciBzaW5rcyA9IGJ1Y2tldHNbMF07CgogICAgICB2YXIgZW50cnk7CiAgICAgIHdoaWxlIChnLm5vZGVDb3VudCgpKSB7CiAgICAgICAgd2hpbGUgKChlbnRyeSA9IHNpbmtzLmRlcXVldWUoKSkpICAgeyByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5KTsgfQogICAgICAgIHdoaWxlICgoZW50cnkgPSBzb3VyY2VzLmRlcXVldWUoKSkpIHsgcmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSk7IH0KICAgICAgICBpZiAoZy5ub2RlQ291bnQoKSkgewogICAgICAgICAgZm9yICh2YXIgaSA9IGJ1Y2tldHMubGVuZ3RoIC0gMjsgaSA+IDA7IC0taSkgewogICAgICAgICAgICBlbnRyeSA9IGJ1Y2tldHNbaV0uZGVxdWV1ZSgpOwogICAgICAgICAgICBpZiAoZW50cnkpIHsKICAgICAgICAgICAgICByZXN1bHRzID0gcmVzdWx0cy5jb25jYXQocmVtb3ZlTm9kZShnLCBidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSwgdHJ1ZSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVOb2RlKGcsIGJ1Y2tldHMsIHplcm9JZHgsIGVudHJ5LCBjb2xsZWN0UHJlZGVjZXNzb3JzKSB7CiAgICAgIHZhciByZXN1bHRzID0gY29sbGVjdFByZWRlY2Vzc29ycyA/IFtdIDogdW5kZWZpbmVkOwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuaW5FZGdlcyhlbnRyeS52KSwgZnVuY3Rpb24oZWRnZSkgewogICAgICAgIHZhciB3ZWlnaHQgPSBnLmVkZ2UoZWRnZSk7CiAgICAgICAgdmFyIHVFbnRyeSA9IGcubm9kZShlZGdlLnYpOwoKICAgICAgICBpZiAoY29sbGVjdFByZWRlY2Vzc29ycykgewogICAgICAgICAgcmVzdWx0cy5wdXNoKHsgdjogZWRnZS52LCB3OiBlZGdlLncgfSk7CiAgICAgICAgfQoKICAgICAgICB1RW50cnkub3V0IC09IHdlaWdodDsKICAgICAgICBhc3NpZ25CdWNrZXQoYnVja2V0cywgemVyb0lkeCwgdUVudHJ5KTsKICAgICAgfSk7CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5vdXRFZGdlcyhlbnRyeS52KSwgZnVuY3Rpb24oZWRnZSkgewogICAgICAgIHZhciB3ZWlnaHQgPSBnLmVkZ2UoZWRnZSk7CiAgICAgICAgdmFyIHcgPSBlZGdlLnc7CiAgICAgICAgdmFyIHdFbnRyeSA9IGcubm9kZSh3KTsKICAgICAgICB3RW50cnlbImluIl0gLT0gd2VpZ2h0OwogICAgICAgIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCB3RW50cnkpOwogICAgICB9KTsKCiAgICAgIGcucmVtb3ZlTm9kZShlbnRyeS52KTsKCiAgICAgIHJldHVybiByZXN1bHRzOwogICAgfQoKICAgIGZ1bmN0aW9uIGJ1aWxkU3RhdGUoZywgd2VpZ2h0Rm4pIHsKICAgICAgdmFyIGZhc0dyYXBoID0gbmV3IEdyYXBoJDEoKTsKICAgICAgdmFyIG1heEluID0gMDsKICAgICAgdmFyIG1heE91dCA9IDA7CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgZmFzR3JhcGguc2V0Tm9kZSh2LCB7IHY6IHYsICJpbiI6IDAsIG91dDogMCB9KTsKICAgICAgfSk7CgogICAgICAvLyBBZ2dyZWdhdGUgd2VpZ2h0cyBvbiBub2RlcywgYnV0IGFsc28gc3VtIHRoZSB3ZWlnaHRzIGFjcm9zcyBtdWx0aS1lZGdlcwogICAgICAvLyBpbnRvIGEgc2luZ2xlIGVkZ2UgZm9yIHRoZSBmYXNHcmFwaC4KICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBwcmV2V2VpZ2h0ID0gZmFzR3JhcGguZWRnZShlLnYsIGUudykgfHwgMDsKICAgICAgICB2YXIgd2VpZ2h0ID0gd2VpZ2h0Rm4oZSk7CiAgICAgICAgdmFyIGVkZ2VXZWlnaHQgPSBwcmV2V2VpZ2h0ICsgd2VpZ2h0OwogICAgICAgIGZhc0dyYXBoLnNldEVkZ2UoZS52LCBlLncsIGVkZ2VXZWlnaHQpOwogICAgICAgIG1heE91dCA9IE1hdGgubWF4KG1heE91dCwgZmFzR3JhcGgubm9kZShlLnYpLm91dCArPSB3ZWlnaHQpOwogICAgICAgIG1heEluICA9IE1hdGgubWF4KG1heEluLCAgZmFzR3JhcGgubm9kZShlLncpWyJpbiJdICArPSB3ZWlnaHQpOwogICAgICB9KTsKCiAgICAgIHZhciBidWNrZXRzID0gbG9kYXNoXzEkMS5yYW5nZShtYXhPdXQgKyBtYXhJbiArIDMpLm1hcChmdW5jdGlvbigpIHsgcmV0dXJuIG5ldyBsaXN0KCk7IH0pOwogICAgICB2YXIgemVyb0lkeCA9IG1heEluICsgMTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChmYXNHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgYXNzaWduQnVja2V0KGJ1Y2tldHMsIHplcm9JZHgsIGZhc0dyYXBoLm5vZGUodikpOwogICAgICB9KTsKCiAgICAgIHJldHVybiB7IGdyYXBoOiBmYXNHcmFwaCwgYnVja2V0czogYnVja2V0cywgemVyb0lkeDogemVyb0lkeCB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGFzc2lnbkJ1Y2tldChidWNrZXRzLCB6ZXJvSWR4LCBlbnRyeSkgewogICAgICBpZiAoIWVudHJ5Lm91dCkgewogICAgICAgIGJ1Y2tldHNbMF0uZW5xdWV1ZShlbnRyeSk7CiAgICAgIH0gZWxzZSBpZiAoIWVudHJ5WyJpbiJdKSB7CiAgICAgICAgYnVja2V0c1tidWNrZXRzLmxlbmd0aCAtIDFdLmVucXVldWUoZW50cnkpOwogICAgICB9IGVsc2UgewogICAgICAgIGJ1Y2tldHNbZW50cnkub3V0IC0gZW50cnlbImluIl0gKyB6ZXJvSWR4XS5lbnF1ZXVlKGVudHJ5KTsKICAgICAgfQogICAgfQoKICAgIHZhciBhY3ljbGljID0gewogICAgICBydW46IHJ1biwKICAgICAgdW5kbzogdW5kbwogICAgfTsKCiAgICBmdW5jdGlvbiBydW4oZykgewogICAgICB2YXIgZmFzID0gKGcuZ3JhcGgoKS5hY3ljbGljZXIgPT09ICJncmVlZHkiCiAgICAgICAgPyBncmVlZHlGYXMoZywgd2VpZ2h0Rm4oZykpCiAgICAgICAgOiBkZnNGQVMoZykpOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZmFzLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGxhYmVsID0gZy5lZGdlKGUpOwogICAgICAgIGcucmVtb3ZlRWRnZShlKTsKICAgICAgICBsYWJlbC5mb3J3YXJkTmFtZSA9IGUubmFtZTsKICAgICAgICBsYWJlbC5yZXZlcnNlZCA9IHRydWU7CiAgICAgICAgZy5zZXRFZGdlKGUudywgZS52LCBsYWJlbCwgbG9kYXNoXzEkMS51bmlxdWVJZCgicmV2IikpOwogICAgICB9KTsKCiAgICAgIGZ1bmN0aW9uIHdlaWdodEZuKGcpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24oZSkgewogICAgICAgICAgcmV0dXJuIGcuZWRnZShlKS53ZWlnaHQ7CiAgICAgICAgfTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRmc0ZBUyhnKSB7CiAgICAgIHZhciBmYXMgPSBbXTsKICAgICAgdmFyIHN0YWNrID0ge307CiAgICAgIHZhciB2aXNpdGVkID0ge307CgogICAgICBmdW5jdGlvbiBkZnModikgewogICAgICAgIGlmIChsb2Rhc2hfMSQxLmhhcyh2aXNpdGVkLCB2KSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkW3ZdID0gdHJ1ZTsKICAgICAgICBzdGFja1t2XSA9IHRydWU7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIGlmIChsb2Rhc2hfMSQxLmhhcyhzdGFjaywgZS53KSkgewogICAgICAgICAgICBmYXMucHVzaChlKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGRmcyhlLncpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIGRlbGV0ZSBzdGFja1t2XTsKICAgICAgfQoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZGZzKTsKICAgICAgcmV0dXJuIGZhczsKICAgIH0KCiAgICBmdW5jdGlvbiB1bmRvKGcpIHsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBsYWJlbCA9IGcuZWRnZShlKTsKICAgICAgICBpZiAobGFiZWwucmV2ZXJzZWQpIHsKICAgICAgICAgIGcucmVtb3ZlRWRnZShlKTsKCiAgICAgICAgICB2YXIgZm9yd2FyZE5hbWUgPSBsYWJlbC5mb3J3YXJkTmFtZTsKICAgICAgICAgIGRlbGV0ZSBsYWJlbC5yZXZlcnNlZDsKICAgICAgICAgIGRlbGV0ZSBsYWJlbC5mb3J3YXJkTmFtZTsKICAgICAgICAgIGcuc2V0RWRnZShlLncsIGUudiwgbGFiZWwsIGZvcndhcmROYW1lKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBHcmFwaCQyID0gZ3JhcGhsaWJfMS5HcmFwaDsKCiAgICB2YXIgdXRpbCA9IHsKICAgICAgYWRkRHVtbXlOb2RlOiBhZGREdW1teU5vZGUsCiAgICAgIHNpbXBsaWZ5OiBzaW1wbGlmeSwKICAgICAgYXNOb25Db21wb3VuZEdyYXBoOiBhc05vbkNvbXBvdW5kR3JhcGgsCiAgICAgIHN1Y2Nlc3NvcldlaWdodHM6IHN1Y2Nlc3NvcldlaWdodHMsCiAgICAgIHByZWRlY2Vzc29yV2VpZ2h0czogcHJlZGVjZXNzb3JXZWlnaHRzLAogICAgICBpbnRlcnNlY3RSZWN0OiBpbnRlcnNlY3RSZWN0LAogICAgICBidWlsZExheWVyTWF0cml4OiBidWlsZExheWVyTWF0cml4LAogICAgICBub3JtYWxpemVSYW5rczogbm9ybWFsaXplUmFua3MsCiAgICAgIHJlbW92ZUVtcHR5UmFua3M6IHJlbW92ZUVtcHR5UmFua3MsCiAgICAgIGFkZEJvcmRlck5vZGU6IGFkZEJvcmRlck5vZGUsCiAgICAgIG1heFJhbms6IG1heFJhbmssCiAgICAgIHBhcnRpdGlvbjogcGFydGl0aW9uJDIsCiAgICAgIHRpbWU6IHRpbWUkMiwKICAgICAgbm90aW1lOiBub3RpbWUKICAgIH07CgogICAgLyoKICAgICAqIEFkZHMgYSBkdW1teSBub2RlIHRvIHRoZSBncmFwaCBhbmQgcmV0dXJuIHYuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZER1bW15Tm9kZShnLCB0eXBlLCBhdHRycywgbmFtZSkgewogICAgICB2YXIgdjsKICAgICAgZG8gewogICAgICAgIHYgPSBsb2Rhc2hfMSQxLnVuaXF1ZUlkKG5hbWUpOwogICAgICB9IHdoaWxlIChnLmhhc05vZGUodikpOwoKICAgICAgYXR0cnMuZHVtbXkgPSB0eXBlOwogICAgICBnLnNldE5vZGUodiwgYXR0cnMpOwogICAgICByZXR1cm4gdjsKICAgIH0KCiAgICAvKgogICAgICogUmV0dXJucyBhIG5ldyBncmFwaCB3aXRoIG9ubHkgc2ltcGxlIGVkZ2VzLiBIYW5kbGVzIGFnZ3JlZ2F0aW9uIG9mIGRhdGEKICAgICAqIGFzc29jaWF0ZWQgd2l0aCBtdWx0aS1lZGdlcy4KICAgICAqLwogICAgZnVuY3Rpb24gc2ltcGxpZnkoZykgewogICAgICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCQyKCkuc2V0R3JhcGgoZy5ncmFwaCgpKTsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzaW1wbGlmaWVkLnNldE5vZGUodiwgZy5ub2RlKHYpKTsgfSk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgc2ltcGxlTGFiZWwgPSBzaW1wbGlmaWVkLmVkZ2UoZS52LCBlLncpIHx8IHsgd2VpZ2h0OiAwLCBtaW5sZW46IDEgfTsKICAgICAgICB2YXIgbGFiZWwgPSBnLmVkZ2UoZSk7CiAgICAgICAgc2ltcGxpZmllZC5zZXRFZGdlKGUudiwgZS53LCB7CiAgICAgICAgICB3ZWlnaHQ6IHNpbXBsZUxhYmVsLndlaWdodCArIGxhYmVsLndlaWdodCwKICAgICAgICAgIG1pbmxlbjogTWF0aC5tYXgoc2ltcGxlTGFiZWwubWlubGVuLCBsYWJlbC5taW5sZW4pCiAgICAgICAgfSk7CiAgICAgIH0pOwogICAgICByZXR1cm4gc2ltcGxpZmllZDsKICAgIH0KCiAgICBmdW5jdGlvbiBhc05vbkNvbXBvdW5kR3JhcGgoZykgewogICAgICB2YXIgc2ltcGxpZmllZCA9IG5ldyBHcmFwaCQyKHsgbXVsdGlncmFwaDogZy5pc011bHRpZ3JhcGgoKSB9KS5zZXRHcmFwaChnLmdyYXBoKCkpOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgaWYgKCFnLmNoaWxkcmVuKHYpLmxlbmd0aCkgewogICAgICAgICAgc2ltcGxpZmllZC5zZXROb2RlKHYsIGcubm9kZSh2KSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHNpbXBsaWZpZWQuc2V0RWRnZShlLCBnLmVkZ2UoZSkpOwogICAgICB9KTsKICAgICAgcmV0dXJuIHNpbXBsaWZpZWQ7CiAgICB9CgogICAgZnVuY3Rpb24gc3VjY2Vzc29yV2VpZ2h0cyhnKSB7CiAgICAgIHZhciB3ZWlnaHRNYXAgPSBsb2Rhc2hfMSQxLm1hcChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICB2YXIgc3VjcyA9IHt9OwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICBzdWNzW2Uud10gPSAoc3Vjc1tlLnddIHx8IDApICsgZy5lZGdlKGUpLndlaWdodDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc3VjczsKICAgICAgfSk7CiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLnppcE9iamVjdChnLm5vZGVzKCksIHdlaWdodE1hcCk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlZGVjZXNzb3JXZWlnaHRzKGcpIHsKICAgICAgdmFyIHdlaWdodE1hcCA9IGxvZGFzaF8xJDEubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHZhciBwcmVkcyA9IHt9OwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmluRWRnZXModiksIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIHByZWRzW2Uudl0gPSAocHJlZHNbZS52XSB8fCAwKSArIGcuZWRnZShlKS53ZWlnaHQ7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHByZWRzOwogICAgICB9KTsKICAgICAgcmV0dXJuIGxvZGFzaF8xJDEuemlwT2JqZWN0KGcubm9kZXMoKSwgd2VpZ2h0TWFwKTsKICAgIH0KCiAgICAvKgogICAgICogRmluZHMgd2hlcmUgYSBsaW5lIHN0YXJ0aW5nIGF0IHBvaW50ICh7eCwgeX0pIHdvdWxkIGludGVyc2VjdCBhIHJlY3RhbmdsZQogICAgICogKHt4LCB5LCB3aWR0aCwgaGVpZ2h0fSkgaWYgaXQgd2VyZSBwb2ludGluZyBhdCB0aGUgcmVjdGFuZ2xlJ3MgY2VudGVyLgogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcnNlY3RSZWN0KHJlY3QsIHBvaW50KSB7CiAgICAgIHZhciB4ID0gcmVjdC54OwogICAgICB2YXIgeSA9IHJlY3QueTsKCiAgICAgIC8vIFJlY3RhbmdsZSBpbnRlcnNlY3Rpb24gYWxnb3JpdGhtIGZyb206CiAgICAgIC8vIGh0dHA6Ly9tYXRoLnN0YWNrZXhjaGFuZ2UuY29tL3F1ZXN0aW9ucy8xMDgxMTMvZmluZC1lZGdlLWJldHdlZW4tdHdvLWJveGVzCiAgICAgIHZhciBkeCA9IHBvaW50LnggLSB4OwogICAgICB2YXIgZHkgPSBwb2ludC55IC0geTsKICAgICAgdmFyIHcgPSByZWN0LndpZHRoIC8gMjsKICAgICAgdmFyIGggPSByZWN0LmhlaWdodCAvIDI7CgogICAgICBpZiAoIWR4ICYmICFkeSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcigiTm90IHBvc3NpYmxlIHRvIGZpbmQgaW50ZXJzZWN0aW9uIGluc2lkZSBvZiB0aGUgcmVjdGFuZ2xlIik7CiAgICAgIH0KCiAgICAgIHZhciBzeCwgc3k7CiAgICAgIGlmIChNYXRoLmFicyhkeSkgKiB3ID4gTWF0aC5hYnMoZHgpICogaCkgewogICAgICAgIC8vIEludGVyc2VjdGlvbiBpcyB0b3Agb3IgYm90dG9tIG9mIHJlY3QuCiAgICAgICAgaWYgKGR5IDwgMCkgewogICAgICAgICAgaCA9IC1oOwogICAgICAgIH0KICAgICAgICBzeCA9IGggKiBkeCAvIGR5OwogICAgICAgIHN5ID0gaDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBJbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiByZWN0LgogICAgICAgIGlmIChkeCA8IDApIHsKICAgICAgICAgIHcgPSAtdzsKICAgICAgICB9CiAgICAgICAgc3ggPSB3OwogICAgICAgIHN5ID0gdyAqIGR5IC8gZHg7CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHg6IHggKyBzeCwgeTogeSArIHN5IH07CiAgICB9CgogICAgLyoKICAgICAqIEdpdmVuIGEgREFHIHdpdGggZWFjaCBub2RlIGFzc2lnbmVkICJyYW5rIiBhbmQgIm9yZGVyIiBwcm9wZXJ0aWVzLCB0aGlzCiAgICAgKiBmdW5jdGlvbiB3aWxsIHByb2R1Y2UgYSBtYXRyaXggd2l0aCB0aGUgaWRzIG9mIGVhY2ggbm9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gYnVpbGRMYXllck1hdHJpeChnKSB7CiAgICAgIHZhciBsYXllcmluZyA9IGxvZGFzaF8xJDEubWFwKGxvZGFzaF8xJDEucmFuZ2UobWF4UmFuayhnKSArIDEpLCBmdW5jdGlvbigpIHsgcmV0dXJuIFtdOyB9KTsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpOwogICAgICAgIHZhciByYW5rID0gbm9kZS5yYW5rOwogICAgICAgIGlmICghbG9kYXNoXzEkMS5pc1VuZGVmaW5lZChyYW5rKSkgewogICAgICAgICAgbGF5ZXJpbmdbcmFua11bbm9kZS5vcmRlcl0gPSB2OwogICAgICAgIH0KICAgICAgfSk7CiAgICAgIHJldHVybiBsYXllcmluZzsKICAgIH0KCiAgICAvKgogICAgICogQWRqdXN0cyB0aGUgcmFua3MgZm9yIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGggc3VjaCB0aGF0IGFsbCBub2RlcyB2IGhhdmUKICAgICAqIHJhbmsodikgPj0gMCBhbmQgYXQgbGVhc3Qgb25lIG5vZGUgdyBoYXMgcmFuayh3KSA9IDAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVJhbmtzKGcpIHsKICAgICAgdmFyIG1pbiA9IGxvZGFzaF8xJDEubWluKGxvZGFzaF8xJDEubWFwKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLnJhbms7IH0pKTsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpOwogICAgICAgIGlmIChsb2Rhc2hfMSQxLmhhcyhub2RlLCAicmFuayIpKSB7CiAgICAgICAgICBub2RlLnJhbmsgLT0gbWluOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRW1wdHlSYW5rcyhnKSB7CiAgICAgIC8vIFJhbmtzIG1heSBub3Qgc3RhcnQgYXQgMCwgc28gd2UgbmVlZCB0byBvZmZzZXQgdGhlbQogICAgICB2YXIgb2Zmc2V0ID0gbG9kYXNoXzEkMS5taW4obG9kYXNoXzEkMS5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSkpOwoKICAgICAgdmFyIGxheWVycyA9IFtdOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuayAtIG9mZnNldDsKICAgICAgICBpZiAoIWxheWVyc1tyYW5rXSkgewogICAgICAgICAgbGF5ZXJzW3JhbmtdID0gW107CiAgICAgICAgfQogICAgICAgIGxheWVyc1tyYW5rXS5wdXNoKHYpOwogICAgICB9KTsKCiAgICAgIHZhciBkZWx0YSA9IDA7CiAgICAgIHZhciBub2RlUmFua0ZhY3RvciA9IGcuZ3JhcGgoKS5ub2RlUmFua0ZhY3RvcjsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVycywgZnVuY3Rpb24odnMsIGkpIHsKICAgICAgICBpZiAobG9kYXNoXzEkMS5pc1VuZGVmaW5lZCh2cykgJiYgaSAlIG5vZGVSYW5rRmFjdG9yICE9PSAwKSB7CiAgICAgICAgICAtLWRlbHRhOwogICAgICAgIH0gZWxzZSBpZiAoZGVsdGEpIHsKICAgICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaCh2cywgZnVuY3Rpb24odikgeyBnLm5vZGUodikucmFuayArPSBkZWx0YTsgfSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRCb3JkZXJOb2RlKGcsIHByZWZpeCwgcmFuaywgb3JkZXIpIHsKICAgICAgdmFyIG5vZGUgPSB7CiAgICAgICAgd2lkdGg6IDAsCiAgICAgICAgaGVpZ2h0OiAwCiAgICAgIH07CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIHsKICAgICAgICBub2RlLnJhbmsgPSByYW5rOwogICAgICAgIG5vZGUub3JkZXIgPSBvcmRlcjsKICAgICAgfQogICAgICByZXR1cm4gYWRkRHVtbXlOb2RlKGcsICJib3JkZXIiLCBub2RlLCBwcmVmaXgpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1heFJhbmsoZykgewogICAgICByZXR1cm4gbG9kYXNoXzEkMS5tYXgobG9kYXNoXzEkMS5tYXAoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIHJhbmsgPSBnLm5vZGUodikucmFuazsKICAgICAgICBpZiAoIWxvZGFzaF8xJDEuaXNVbmRlZmluZWQocmFuaykpIHsKICAgICAgICAgIHJldHVybiByYW5rOwogICAgICAgIH0KICAgICAgfSkpOwogICAgfQoKICAgIC8qCiAgICAgKiBQYXJ0aXRpb24gYSBjb2xsZWN0aW9uIGludG8gdHdvIGdyb3VwczogYGxoc2AgYW5kIGByaHNgLiBJZiB0aGUgc3VwcGxpZWQKICAgICAqIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSBmb3IgYW4gZW50cnkgaXQgZ29lcyBpbnRvIGBsaHNgLiBPdGhlcndpc2UgaXQgZ29lcwogICAgICogaW50byBgcmhzLgogICAgICovCiAgICBmdW5jdGlvbiBwYXJ0aXRpb24kMihjb2xsZWN0aW9uLCBmbikgewogICAgICB2YXIgcmVzdWx0ID0geyBsaHM6IFtdLCByaHM6IFtdIH07CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChjb2xsZWN0aW9uLCBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIGlmIChmbih2YWx1ZSkpIHsKICAgICAgICAgIHJlc3VsdC5saHMucHVzaCh2YWx1ZSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJlc3VsdC5yaHMucHVzaCh2YWx1ZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKgogICAgICogUmV0dXJucyBhIG5ldyBmdW5jdGlvbiB0aGF0IHdyYXBzIGBmbmAgd2l0aCBhIHRpbWVyLiBUaGUgd3JhcHBlciBsb2dzIHRoZQogICAgICogdGltZSBpdCB0YWtlcyB0byBleGVjdXRlIHRoZSBmdW5jdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gdGltZSQyKG5hbWUsIGZuKSB7CiAgICAgIHZhciBzdGFydCA9IGxvZGFzaF8xJDEubm93KCk7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGZuKCk7CiAgICAgIH0gZmluYWxseSB7CiAgICAgICAgY29uc29sZS5sb2cobmFtZSArICIgdGltZTogIiArIChsb2Rhc2hfMSQxLm5vdygpIC0gc3RhcnQpICsgIm1zIik7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBub3RpbWUobmFtZSwgZm4pIHsKICAgICAgcmV0dXJuIGZuKCk7CiAgICB9CgogICAgdmFyIG5vcm1hbGl6ZSQyID0gewogICAgICBydW46IHJ1biQxLAogICAgICB1bmRvOiB1bmRvJDEKICAgIH07CgogICAgLyoKICAgICAqIEJyZWFrcyBhbnkgbG9uZyBlZGdlcyBpbiB0aGUgZ3JhcGggaW50byBzaG9ydCBzZWdtZW50cyB0aGF0IHNwYW4gMSBsYXllcgogICAgICogZWFjaC4gVGhpcyBvcGVyYXRpb24gaXMgdW5kb2FibGUgd2l0aCB0aGUgZGVub3JtYWxpemUgZnVuY3Rpb24uCiAgICAgKgogICAgICogUHJlLWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gVGhlIGlucHV0IGdyYXBoIGlzIGEgREFHLgogICAgICogICAgMi4gRWFjaCBub2RlIGluIHRoZSBncmFwaCBoYXMgYSAicmFuayIgcHJvcGVydHkuCiAgICAgKgogICAgICogUG9zdC1jb25kaXRpb246CiAgICAgKgogICAgICogICAgMS4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBoYXZlIGEgbGVuZ3RoIG9mIDEuCiAgICAgKiAgICAyLiBEdW1teSBub2RlcyBhcmUgYWRkZWQgd2hlcmUgZWRnZXMgaGF2ZSBiZWVuIHNwbGl0IGludG8gc2VnbWVudHMuCiAgICAgKiAgICAzLiBUaGUgZ3JhcGggaXMgYXVnbWVudGVkIHdpdGggYSAiZHVtbXlDaGFpbnMiIGF0dHJpYnV0ZSB3aGljaCBjb250YWlucwogICAgICogICAgICAgdGhlIGZpcnN0IGR1bW15IGluIGVhY2ggY2hhaW4gb2YgZHVtbXkgbm9kZXMgcHJvZHVjZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJ1biQxKGcpIHsKICAgICAgZy5ncmFwaCgpLmR1bW15Q2hhaW5zID0gW107CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGVkZ2UpIHsgbm9ybWFsaXplRWRnZShnLCBlZGdlKTsgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ybWFsaXplRWRnZShnLCBlKSB7CiAgICAgIHZhciB2ID0gZS52OwogICAgICB2YXIgdlJhbmsgPSBnLm5vZGUodikucmFuazsKICAgICAgdmFyIHcgPSBlLnc7CiAgICAgIHZhciB3UmFuayA9IGcubm9kZSh3KS5yYW5rOwogICAgICB2YXIgbmFtZSA9IGUubmFtZTsKICAgICAgdmFyIGVkZ2VMYWJlbCA9IGcuZWRnZShlKTsKICAgICAgdmFyIGxhYmVsUmFuayA9IGVkZ2VMYWJlbC5sYWJlbFJhbms7CgogICAgICBpZiAod1JhbmsgPT09IHZSYW5rICsgMSkgcmV0dXJuOwoKICAgICAgZy5yZW1vdmVFZGdlKGUpOwoKICAgICAgdmFyIGR1bW15LCBhdHRycywgaTsKICAgICAgZm9yIChpID0gMCwgKyt2UmFuazsgdlJhbmsgPCB3UmFuazsgKytpLCArK3ZSYW5rKSB7CiAgICAgICAgZWRnZUxhYmVsLnBvaW50cyA9IFtdOwogICAgICAgIGF0dHJzID0gewogICAgICAgICAgd2lkdGg6IDAsIGhlaWdodDogMCwKICAgICAgICAgIGVkZ2VMYWJlbDogZWRnZUxhYmVsLCBlZGdlT2JqOiBlLAogICAgICAgICAgcmFuazogdlJhbmsKICAgICAgICB9OwogICAgICAgIGR1bW15ID0gdXRpbC5hZGREdW1teU5vZGUoZywgImVkZ2UiLCBhdHRycywgIl9kIik7CiAgICAgICAgaWYgKHZSYW5rID09PSBsYWJlbFJhbmspIHsKICAgICAgICAgIGF0dHJzLndpZHRoID0gZWRnZUxhYmVsLndpZHRoOwogICAgICAgICAgYXR0cnMuaGVpZ2h0ID0gZWRnZUxhYmVsLmhlaWdodDsKICAgICAgICAgIGF0dHJzLmR1bW15ID0gImVkZ2UtbGFiZWwiOwogICAgICAgICAgYXR0cnMubGFiZWxwb3MgPSBlZGdlTGFiZWwubGFiZWxwb3M7CiAgICAgICAgfQogICAgICAgIGcuc2V0RWRnZSh2LCBkdW1teSwgeyB3ZWlnaHQ6IGVkZ2VMYWJlbC53ZWlnaHQgfSwgbmFtZSk7CiAgICAgICAgaWYgKGkgPT09IDApIHsKICAgICAgICAgIGcuZ3JhcGgoKS5kdW1teUNoYWlucy5wdXNoKGR1bW15KTsKICAgICAgICB9CiAgICAgICAgdiA9IGR1bW15OwogICAgICB9CgogICAgICBnLnNldEVkZ2UodiwgdywgeyB3ZWlnaHQ6IGVkZ2VMYWJlbC53ZWlnaHQgfSwgbmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gdW5kbyQxKGcpIHsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuZ3JhcGgoKS5kdW1teUNoYWlucywgZnVuY3Rpb24odikgewogICAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpOwogICAgICAgIHZhciBvcmlnTGFiZWwgPSBub2RlLmVkZ2VMYWJlbDsKICAgICAgICB2YXIgdzsKICAgICAgICBnLnNldEVkZ2Uobm9kZS5lZGdlT2JqLCBvcmlnTGFiZWwpOwogICAgICAgIHdoaWxlIChub2RlLmR1bW15KSB7CiAgICAgICAgICB3ID0gZy5zdWNjZXNzb3JzKHYpWzBdOwogICAgICAgICAgZy5yZW1vdmVOb2RlKHYpOwogICAgICAgICAgb3JpZ0xhYmVsLnBvaW50cy5wdXNoKHsgeDogbm9kZS54LCB5OiBub2RlLnkgfSk7CiAgICAgICAgICBpZiAobm9kZS5kdW1teSA9PT0gImVkZ2UtbGFiZWwiKSB7CiAgICAgICAgICAgIG9yaWdMYWJlbC54ID0gbm9kZS54OwogICAgICAgICAgICBvcmlnTGFiZWwueSA9IG5vZGUueTsKICAgICAgICAgICAgb3JpZ0xhYmVsLndpZHRoID0gbm9kZS53aWR0aDsKICAgICAgICAgICAgb3JpZ0xhYmVsLmhlaWdodCA9IG5vZGUuaGVpZ2h0OwogICAgICAgICAgfQogICAgICAgICAgdiA9IHc7CiAgICAgICAgICBub2RlID0gZy5ub2RlKHYpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgdmFyIHV0aWwkMSA9IHsKICAgICAgbG9uZ2VzdFBhdGg6IGxvbmdlc3RQYXRoLAogICAgICBzbGFjazogc2xhY2sKICAgIH07CgogICAgLyoKICAgICAqIEluaXRpYWxpemVzIHJhbmtzIGZvciB0aGUgaW5wdXQgZ3JhcGggdXNpbmcgdGhlIGxvbmdlc3QgcGF0aCBhbGdvcml0aG0uIFRoaXMKICAgICAqIGFsZ29yaXRobSBzY2FsZXMgd2VsbCBhbmQgaXMgZmFzdCBpbiBwcmFjdGljZSwgaXQgeWllbGRzIHJhdGhlciBwb29yCiAgICAgKiBzb2x1dGlvbnMuIE5vZGVzIGFyZSBwdXNoZWQgdG8gdGhlIGxvd2VzdCBsYXllciBwb3NzaWJsZSwgbGVhdmluZyB0aGUgYm90dG9tCiAgICAgKiByYW5rcyB3aWRlIGFuZCBsZWF2aW5nIGVkZ2VzIGxvbmdlciB0aGFuIG5lY2Vzc2FyeS4gSG93ZXZlciwgZHVlIHRvIGl0cwogICAgICogc3BlZWQsIHRoaXMgYWxnb3JpdGhtIGlzIGdvb2QgZm9yIGdldHRpbmcgYW4gaW5pdGlhbCByYW5raW5nIHRoYXQgY2FuIGJlIGZlZAogICAgICogaW50byBvdGhlciBhbGdvcml0aG1zLgogICAgICoKICAgICAqIFRoaXMgYWxnb3JpdGhtIGRvZXMgbm90IG5vcm1hbGl6ZSBsYXllcnMgYmVjYXVzZSBpdCB3aWxsIGJlIHVzZWQgYnkgb3RoZXIKICAgICAqIGFsZ29yaXRobXMgaW4gbW9zdCBjYXNlcy4gSWYgdXNpbmcgdGhpcyBhbGdvcml0aG0gZGlyZWN0bHksIGJlIHN1cmUgdG8KICAgICAqIHJ1biBub3JtYWxpemUgYXQgdGhlIGVuZC4KICAgICAqCiAgICAgKiBQcmUtY29uZGl0aW9uczoKICAgICAqCiAgICAgKiAgICAxLiBJbnB1dCBncmFwaCBpcyBhIERBRy4KICAgICAqICAgIDIuIElucHV0IGdyYXBoIG5vZGUgbGFiZWxzIGNhbiBiZSBhc3NpZ25lZCBwcm9wZXJ0aWVzLgogICAgICoKICAgICAqIFBvc3QtY29uZGl0aW9uczoKICAgICAqCiAgICAgKiAgICAxLiBFYWNoIG5vZGUgd2lsbCBiZSBhc3NpZ24gYW4gKHVubm9ybWFsaXplZCkgInJhbmsiIHByb3BlcnR5LgogICAgICovCiAgICBmdW5jdGlvbiBsb25nZXN0UGF0aChnKSB7CiAgICAgIHZhciB2aXNpdGVkID0ge307CgogICAgICBmdW5jdGlvbiBkZnModikgewogICAgICAgIHZhciBsYWJlbCA9IGcubm9kZSh2KTsKICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXModmlzaXRlZCwgdikpIHsKICAgICAgICAgIHJldHVybiBsYWJlbC5yYW5rOwogICAgICAgIH0KICAgICAgICB2aXNpdGVkW3ZdID0gdHJ1ZTsKCiAgICAgICAgdmFyIHJhbmsgPSBsb2Rhc2hfMSQxLm1pbihsb2Rhc2hfMSQxLm1hcChnLm91dEVkZ2VzKHYpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICByZXR1cm4gZGZzKGUudykgLSBnLmVkZ2UoZSkubWlubGVuOwogICAgICAgIH0pKTsKCiAgICAgICAgaWYgKHJhbmsgPT09IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSB8fCAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW10pIGZvciBMb2Rhc2ggMwogICAgICAgICAgICByYW5rID09PSB1bmRlZmluZWQgfHwgLy8gcmV0dXJuIHZhbHVlIG9mIF8ubWFwKFtdKSBmb3IgTG9kYXNoIDQKICAgICAgICAgICAgcmFuayA9PT0gbnVsbCkgeyAvLyByZXR1cm4gdmFsdWUgb2YgXy5tYXAoW251bGxdKQogICAgICAgICAgcmFuayA9IDA7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gKGxhYmVsLnJhbmsgPSByYW5rKTsKICAgICAgfQoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuc291cmNlcygpLCBkZnMpOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm5zIHRoZSBhbW91bnQgb2Ygc2xhY2sgZm9yIHRoZSBnaXZlbiBlZGdlLiBUaGUgc2xhY2sgaXMgZGVmaW5lZCBhcyB0aGUKICAgICAqIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgbGVuZ3RoIG9mIHRoZSBlZGdlIGFuZCBpdHMgbWluaW11bSBsZW5ndGguCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNsYWNrKGcsIGUpIHsKICAgICAgcmV0dXJuIGcubm9kZShlLncpLnJhbmsgLSBnLm5vZGUoZS52KS5yYW5rIC0gZy5lZGdlKGUpLm1pbmxlbjsKICAgIH0KCiAgICB2YXIgR3JhcGgkMyA9IGdyYXBobGliXzEuR3JhcGg7CiAgICB2YXIgc2xhY2skMSA9IHV0aWwkMS5zbGFjazsKCiAgICB2YXIgZmVhc2libGVUcmVlXzEgPSBmZWFzaWJsZVRyZWU7CgogICAgLyoKICAgICAqIENvbnN0cnVjdHMgYSBzcGFubmluZyB0cmVlIHdpdGggdGlnaHQgZWRnZXMgYW5kIGFkanVzdGVkIHRoZSBpbnB1dCBub2RlJ3MKICAgICAqIHJhbmtzIHRvIGFjaGlldmUgdGhpcy4gQSB0aWdodCBlZGdlIGlzIG9uZSB0aGF0IGlzIGhhcyBhIGxlbmd0aCB0aGF0IG1hdGNoZXMKICAgICAqIGl0cyAibWlubGVuIiBhdHRyaWJ1dGUuCiAgICAgKgogICAgICogVGhlIGJhc2ljIHN0cnVjdHVyZSBmb3IgdGhpcyBmdW5jdGlvbiBpcyBkZXJpdmVkIGZyb20gR2Fuc25lciwgZXQgYWwuLCAiQQogICAgICogVGVjaG5pcXVlIGZvciBEcmF3aW5nIERpcmVjdGVkIEdyYXBocy4iCiAgICAgKgogICAgICogUHJlLWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gR3JhcGggbXVzdCBiZSBhIERBRy4KICAgICAqICAgIDIuIEdyYXBoIG11c3QgYmUgY29ubmVjdGVkLgogICAgICogICAgMy4gR3JhcGggbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSBub2RlLgogICAgICogICAgNS4gR3JhcGggbm9kZXMgbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBhc3NpZ25lZCBhICJyYW5rIiBwcm9wZXJ0eSB0aGF0CiAgICAgKiAgICAgICByZXNwZWN0cyB0aGUgIm1pbmxlbiIgcHJvcGVydHkgb2YgaW5jaWRlbnQgZWRnZXMuCiAgICAgKiAgICA2LiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgYSAibWlubGVuIiBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBQb3N0LWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgLSBHcmFwaCBub2RlcyB3aWxsIGhhdmUgdGhlaXIgcmFuayBhZGp1c3RlZCB0byBlbnN1cmUgdGhhdCBhbGwgZWRnZXMgYXJlCiAgICAgKiAgICAgIHRpZ2h0LgogICAgICoKICAgICAqIFJldHVybnMgYSB0cmVlICh1bmRpcmVjdGVkIGdyYXBoKSB0aGF0IGlzIGNvbnN0cnVjdGVkIHVzaW5nIG9ubHkgInRpZ2h0IgogICAgICogZWRnZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZlYXNpYmxlVHJlZShnKSB7CiAgICAgIHZhciB0ID0gbmV3IEdyYXBoJDMoeyBkaXJlY3RlZDogZmFsc2UgfSk7CgogICAgICAvLyBDaG9vc2UgYXJiaXRyYXJ5IG5vZGUgZnJvbSB3aGljaCB0byBzdGFydCBvdXIgdHJlZQogICAgICB2YXIgc3RhcnQgPSBnLm5vZGVzKClbMF07CiAgICAgIHZhciBzaXplID0gZy5ub2RlQ291bnQoKTsKICAgICAgdC5zZXROb2RlKHN0YXJ0LCB7fSk7CgogICAgICB2YXIgZWRnZSwgZGVsdGE7CiAgICAgIHdoaWxlICh0aWdodFRyZWUodCwgZykgPCBzaXplKSB7CiAgICAgICAgZWRnZSA9IGZpbmRNaW5TbGFja0VkZ2UodCwgZyk7CiAgICAgICAgZGVsdGEgPSB0Lmhhc05vZGUoZWRnZS52KSA/IHNsYWNrJDEoZywgZWRnZSkgOiAtc2xhY2skMShnLCBlZGdlKTsKICAgICAgICBzaGlmdFJhbmtzKHQsIGcsIGRlbHRhKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHQ7CiAgICB9CgogICAgLyoKICAgICAqIEZpbmRzIGEgbWF4aW1hbCB0cmVlIG9mIHRpZ2h0IGVkZ2VzIGFuZCByZXR1cm5zIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gdGhlCiAgICAgKiB0cmVlLgogICAgICovCiAgICBmdW5jdGlvbiB0aWdodFRyZWUodCwgZykgewogICAgICBmdW5jdGlvbiBkZnModikgewogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVFZGdlcyh2KSwgZnVuY3Rpb24oZSkgewogICAgICAgICAgdmFyIGVkZ2VWID0gZS52LAogICAgICAgICAgICB3ID0gKHYgPT09IGVkZ2VWKSA/IGUudyA6IGVkZ2VWOwogICAgICAgICAgaWYgKCF0Lmhhc05vZGUodykgJiYgIXNsYWNrJDEoZywgZSkpIHsKICAgICAgICAgICAgdC5zZXROb2RlKHcsIHt9KTsKICAgICAgICAgICAgdC5zZXRFZGdlKHYsIHcsIHt9KTsKICAgICAgICAgICAgZGZzKHcpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2godC5ub2RlcygpLCBkZnMpOwogICAgICByZXR1cm4gdC5ub2RlQ291bnQoKTsKICAgIH0KCiAgICAvKgogICAgICogRmluZHMgdGhlIGVkZ2Ugd2l0aCB0aGUgc21hbGxlc3Qgc2xhY2sgdGhhdCBpcyBpbmNpZGVudCBvbiB0cmVlIGFuZCByZXR1cm5zCiAgICAgKiBpdC4KICAgICAqLwogICAgZnVuY3Rpb24gZmluZE1pblNsYWNrRWRnZSh0LCBnKSB7CiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLm1pbkJ5KGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIGlmICh0Lmhhc05vZGUoZS52KSAhPT0gdC5oYXNOb2RlKGUudykpIHsKICAgICAgICAgIHJldHVybiBzbGFjayQxKGcsIGUpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2hpZnRSYW5rcyh0LCBnLCBkZWx0YSkgewogICAgICBsb2Rhc2hfMSQxLmZvckVhY2godC5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgZy5ub2RlKHYpLnJhbmsgKz0gZGVsdGE7CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBzbGFjayQyID0gdXRpbCQxLnNsYWNrOwogICAgdmFyIGluaXRSYW5rID0gdXRpbCQxLmxvbmdlc3RQYXRoOwogICAgdmFyIHByZW9yZGVyJDEgPSBncmFwaGxpYl8xLmFsZy5wcmVvcmRlcjsKICAgIHZhciBwb3N0b3JkZXIkMSA9IGdyYXBobGliXzEuYWxnLnBvc3RvcmRlcjsKICAgIHZhciBzaW1wbGlmeSQxID0gdXRpbC5zaW1wbGlmeTsKCiAgICB2YXIgbmV0d29ya1NpbXBsZXhfMSA9IG5ldHdvcmtTaW1wbGV4OwoKICAgIC8vIEV4cG9zZSBzb21lIGludGVybmFscyBmb3IgdGVzdGluZyBwdXJwb3NlcwogICAgbmV0d29ya1NpbXBsZXguaW5pdExvd0xpbVZhbHVlcyA9IGluaXRMb3dMaW1WYWx1ZXM7CiAgICBuZXR3b3JrU2ltcGxleC5pbml0Q3V0VmFsdWVzID0gaW5pdEN1dFZhbHVlczsKICAgIG5ldHdvcmtTaW1wbGV4LmNhbGNDdXRWYWx1ZSA9IGNhbGNDdXRWYWx1ZTsKICAgIG5ldHdvcmtTaW1wbGV4LmxlYXZlRWRnZSA9IGxlYXZlRWRnZTsKICAgIG5ldHdvcmtTaW1wbGV4LmVudGVyRWRnZSA9IGVudGVyRWRnZTsKICAgIG5ldHdvcmtTaW1wbGV4LmV4Y2hhbmdlRWRnZXMgPSBleGNoYW5nZUVkZ2VzOwoKICAgIC8qCiAgICAgKiBUaGUgbmV0d29yayBzaW1wbGV4IGFsZ29yaXRobSBhc3NpZ25zIHJhbmtzIHRvIGVhY2ggbm9kZSBpbiB0aGUgaW5wdXQgZ3JhcGgKICAgICAqIGFuZCBpdGVyYXRpdmVseSBpbXByb3ZlcyB0aGUgcmFua2luZyB0byByZWR1Y2UgdGhlIGxlbmd0aCBvZiBlZGdlcy4KICAgICAqCiAgICAgKiBQcmVjb25kaXRpb25zOgogICAgICoKICAgICAqICAgIDEuIFRoZSBpbnB1dCBncmFwaCBtdXN0IGJlIGEgREFHLgogICAgICogICAgMi4gQWxsIG5vZGVzIGluIHRoZSBncmFwaCBtdXN0IGhhdmUgYW4gb2JqZWN0IHZhbHVlLgogICAgICogICAgMy4gQWxsIGVkZ2VzIGluIHRoZSBncmFwaCBtdXN0IGhhdmUgIm1pbmxlbiIgYW5kICJ3ZWlnaHQiIGF0dHJpYnV0ZXMuCiAgICAgKgogICAgICogUG9zdGNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gQWxsIG5vZGVzIGluIHRoZSBncmFwaCB3aWxsIGhhdmUgYW4gYXNzaWduZWQgInJhbmsiIGF0dHJpYnV0ZSB0aGF0IGhhcwogICAgICogICAgICAgYmVlbiBvcHRpbWl6ZWQgYnkgdGhlIG5ldHdvcmsgc2ltcGxleCBhbGdvcml0aG0uIFJhbmtzIHN0YXJ0IGF0IDAuCiAgICAgKgogICAgICoKICAgICAqIEEgcm91Z2ggc2tldGNoIG9mIHRoZSBhbGdvcml0aG0gaXMgYXMgZm9sbG93czoKICAgICAqCiAgICAgKiAgICAxLiBBc3NpZ24gaW5pdGlhbCByYW5rcyB0byBlYWNoIG5vZGUuIFdlIHVzZSB0aGUgbG9uZ2VzdCBwYXRoIGFsZ29yaXRobSwKICAgICAqICAgICAgIHdoaWNoIGFzc2lnbnMgcmFua3MgdG8gdGhlIGxvd2VzdCBwb3NpdGlvbiBwb3NzaWJsZS4gSW4gZ2VuZXJhbCB0aGlzCiAgICAgKiAgICAgICBsZWFkcyB0byB2ZXJ5IHdpZGUgYm90dG9tIHJhbmtzIGFuZCB1bm5lY2Vzc2FyaWx5IGxvbmcgZWRnZXMuCiAgICAgKiAgICAyLiBDb25zdHJ1Y3QgYSBmZWFzaWJsZSB0aWdodCB0cmVlLiBBIHRpZ2h0IHRyZWUgaXMgb25lIHN1Y2ggdGhhdCBhbGwKICAgICAqICAgICAgIGVkZ2VzIGluIHRoZSB0cmVlIGhhdmUgbm8gc2xhY2sgKGRpZmZlcmVuY2UgYmV0d2VlbiBsZW5ndGggb2YgZWRnZQogICAgICogICAgICAgYW5kIG1pbmxlbiBmb3IgdGhlIGVkZ2UpLiBUaGlzIGJ5IGl0c2VsZiBncmVhdGx5IGltcHJvdmVzIHRoZSBhc3NpZ25lZAogICAgICogICAgICAgcmFua2luZ3MgYnkgc2hvcnRpbmcgZWRnZXMuCiAgICAgKiAgICAzLiBJdGVyYXRpdmVseSBmaW5kIGVkZ2VzIHRoYXQgaGF2ZSBuZWdhdGl2ZSBjdXQgdmFsdWVzLiBHZW5lcmFsbHkgYQogICAgICogICAgICAgbmVnYXRpdmUgY3V0IHZhbHVlIGluZGljYXRlcyB0aGF0IHRoZSBlZGdlIGNvdWxkIGJlIHJlbW92ZWQgYW5kIGEgbmV3CiAgICAgKiAgICAgICB0cmVlIGVkZ2UgY291bGQgYmUgYWRkZWQgdG8gcHJvZHVjZSBhIG1vcmUgY29tcGFjdCBncmFwaC4KICAgICAqCiAgICAgKiBNdWNoIG9mIHRoZSBhbGdvcml0aG1zIGhlcmUgYXJlIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sICJBIFRlY2huaXF1ZQogICAgICogZm9yIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLiIgVGhlIHN0cnVjdHVyZSBvZiB0aGUgZmlsZSByb3VnaGx5IGZvbGxvd3MgdGhlCiAgICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIG92ZXJhbGwgYWxnb3JpdGhtLgogICAgICovCiAgICBmdW5jdGlvbiBuZXR3b3JrU2ltcGxleChnKSB7CiAgICAgIGcgPSBzaW1wbGlmeSQxKGcpOwogICAgICBpbml0UmFuayhnKTsKICAgICAgdmFyIHQgPSBmZWFzaWJsZVRyZWVfMShnKTsKICAgICAgaW5pdExvd0xpbVZhbHVlcyh0KTsKICAgICAgaW5pdEN1dFZhbHVlcyh0LCBnKTsKCiAgICAgIHZhciBlLCBmOwogICAgICB3aGlsZSAoKGUgPSBsZWF2ZUVkZ2UodCkpKSB7CiAgICAgICAgZiA9IGVudGVyRWRnZSh0LCBnLCBlKTsKICAgICAgICBleGNoYW5nZUVkZ2VzKHQsIGcsIGUsIGYpOwogICAgICB9CiAgICB9CgogICAgLyoKICAgICAqIEluaXRpYWxpemVzIGN1dCB2YWx1ZXMgZm9yIGFsbCBlZGdlcyBpbiB0aGUgdHJlZS4KICAgICAqLwogICAgZnVuY3Rpb24gaW5pdEN1dFZhbHVlcyh0LCBnKSB7CiAgICAgIHZhciB2cyA9IHBvc3RvcmRlciQxKHQsIHQubm9kZXMoKSk7CiAgICAgIHZzID0gdnMuc2xpY2UoMCwgdnMubGVuZ3RoIC0gMSk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaCh2cywgZnVuY3Rpb24odikgewogICAgICAgIGFzc2lnbkN1dFZhbHVlKHQsIGcsIHYpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc3NpZ25DdXRWYWx1ZSh0LCBnLCBjaGlsZCkgewogICAgICB2YXIgY2hpbGRMYWIgPSB0Lm5vZGUoY2hpbGQpOwogICAgICB2YXIgcGFyZW50ID0gY2hpbGRMYWIucGFyZW50OwogICAgICB0LmVkZ2UoY2hpbGQsIHBhcmVudCkuY3V0dmFsdWUgPSBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpOwogICAgfQoKICAgIC8qCiAgICAgKiBHaXZlbiB0aGUgdGlnaHQgdHJlZSwgaXRzIGdyYXBoLCBhbmQgYSBjaGlsZCBpbiB0aGUgZ3JhcGggY2FsY3VsYXRlIGFuZAogICAgICogcmV0dXJuIHRoZSBjdXQgdmFsdWUgZm9yIHRoZSBlZGdlIGJldHdlZW4gdGhlIGNoaWxkIGFuZCBpdHMgcGFyZW50LgogICAgICovCiAgICBmdW5jdGlvbiBjYWxjQ3V0VmFsdWUodCwgZywgY2hpbGQpIHsKICAgICAgdmFyIGNoaWxkTGFiID0gdC5ub2RlKGNoaWxkKTsKICAgICAgdmFyIHBhcmVudCA9IGNoaWxkTGFiLnBhcmVudDsKICAgICAgLy8gVHJ1ZSBpZiB0aGUgY2hpbGQgaXMgb24gdGhlIHRhaWwgZW5kIG9mIHRoZSBlZGdlIGluIHRoZSBkaXJlY3RlZCBncmFwaAogICAgICB2YXIgY2hpbGRJc1RhaWwgPSB0cnVlOwogICAgICAvLyBUaGUgZ3JhcGgncyB2aWV3IG9mIHRoZSB0cmVlIGVkZ2Ugd2UncmUgaW5zcGVjdGluZwogICAgICB2YXIgZ3JhcGhFZGdlID0gZy5lZGdlKGNoaWxkLCBwYXJlbnQpOwogICAgICAvLyBUaGUgYWNjdW11bGF0ZWQgY3V0IHZhbHVlIGZvciB0aGUgZWRnZSBiZXR3ZWVuIHRoaXMgbm9kZSBhbmQgaXRzIHBhcmVudAogICAgICB2YXIgY3V0VmFsdWUgPSAwOwoKICAgICAgaWYgKCFncmFwaEVkZ2UpIHsKICAgICAgICBjaGlsZElzVGFpbCA9IGZhbHNlOwogICAgICAgIGdyYXBoRWRnZSA9IGcuZWRnZShwYXJlbnQsIGNoaWxkKTsKICAgICAgfQoKICAgICAgY3V0VmFsdWUgPSBncmFwaEVkZ2Uud2VpZ2h0OwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZUVkZ2VzKGNoaWxkKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBpc091dEVkZ2UgPSBlLnYgPT09IGNoaWxkLAogICAgICAgICAgb3RoZXIgPSBpc091dEVkZ2UgPyBlLncgOiBlLnY7CgogICAgICAgIGlmIChvdGhlciAhPT0gcGFyZW50KSB7CiAgICAgICAgICB2YXIgcG9pbnRzVG9IZWFkID0gaXNPdXRFZGdlID09PSBjaGlsZElzVGFpbCwKICAgICAgICAgICAgb3RoZXJXZWlnaHQgPSBnLmVkZ2UoZSkud2VpZ2h0OwoKICAgICAgICAgIGN1dFZhbHVlICs9IHBvaW50c1RvSGVhZCA/IG90aGVyV2VpZ2h0IDogLW90aGVyV2VpZ2h0OwogICAgICAgICAgaWYgKGlzVHJlZUVkZ2UodCwgY2hpbGQsIG90aGVyKSkgewogICAgICAgICAgICB2YXIgb3RoZXJDdXRWYWx1ZSA9IHQuZWRnZShjaGlsZCwgb3RoZXIpLmN1dHZhbHVlOwogICAgICAgICAgICBjdXRWYWx1ZSArPSBwb2ludHNUb0hlYWQgPyAtb3RoZXJDdXRWYWx1ZSA6IG90aGVyQ3V0VmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIHJldHVybiBjdXRWYWx1ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbml0TG93TGltVmFsdWVzKHRyZWUsIHJvb3QpIHsKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgcm9vdCA9IHRyZWUubm9kZXMoKVswXTsKICAgICAgfQogICAgICBkZnNBc3NpZ25Mb3dMaW0odHJlZSwge30sIDEsIHJvb3QpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRmc0Fzc2lnbkxvd0xpbSh0cmVlLCB2aXNpdGVkLCBuZXh0TGltLCB2LCBwYXJlbnQpIHsKICAgICAgdmFyIGxvdyA9IG5leHRMaW07CiAgICAgIHZhciBsYWJlbCA9IHRyZWUubm9kZSh2KTsKCiAgICAgIHZpc2l0ZWRbdl0gPSB0cnVlOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2godHJlZS5uZWlnaGJvcnModiksIGZ1bmN0aW9uKHcpIHsKICAgICAgICBpZiAoIWxvZGFzaF8xJDEuaGFzKHZpc2l0ZWQsIHcpKSB7CiAgICAgICAgICBuZXh0TGltID0gZGZzQXNzaWduTG93TGltKHRyZWUsIHZpc2l0ZWQsIG5leHRMaW0sIHcsIHYpOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBsYWJlbC5sb3cgPSBsb3c7CiAgICAgIGxhYmVsLmxpbSA9IG5leHRMaW0rKzsKICAgICAgaWYgKHBhcmVudCkgewogICAgICAgIGxhYmVsLnBhcmVudCA9IHBhcmVudDsKICAgICAgfSBlbHNlIHsKICAgICAgICAvLyBUT0RPIHNob3VsZCBiZSBhYmxlIHRvIHJlbW92ZSB0aGlzIHdoZW4gd2UgaW5jcmVtZW50YWxseSB1cGRhdGUgbG93IGxpbQogICAgICAgIGRlbGV0ZSBsYWJlbC5wYXJlbnQ7CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXh0TGltOwogICAgfQoKICAgIGZ1bmN0aW9uIGxlYXZlRWRnZSh0cmVlKSB7CiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLmZpbmQodHJlZS5lZGdlcygpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgcmV0dXJuIHRyZWUuZWRnZShlKS5jdXR2YWx1ZSA8IDA7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGVudGVyRWRnZSh0LCBnLCBlZGdlKSB7CiAgICAgIHZhciB2ID0gZWRnZS52OwogICAgICB2YXIgdyA9IGVkZ2UudzsKCiAgICAgIC8vIEZvciB0aGUgcmVzdCBvZiB0aGlzIGZ1bmN0aW9uIHdlIGFzc3VtZSB0aGF0IHYgaXMgdGhlIHRhaWwgYW5kIHcgaXMgdGhlCiAgICAgIC8vIGhlYWQsIHNvIGlmIHdlIGRvbid0IGhhdmUgdGhpcyBlZGdlIGluIHRoZSBncmFwaCB3ZSBzaG91bGQgZmxpcCBpdCB0bwogICAgICAvLyBtYXRjaCB0aGUgY29ycmVjdCBvcmllbnRhdGlvbi4KICAgICAgaWYgKCFnLmhhc0VkZ2UodiwgdykpIHsKICAgICAgICB2ID0gZWRnZS53OwogICAgICAgIHcgPSBlZGdlLnY7CiAgICAgIH0KCiAgICAgIHZhciB2TGFiZWwgPSB0Lm5vZGUodik7CiAgICAgIHZhciB3TGFiZWwgPSB0Lm5vZGUodyk7CiAgICAgIHZhciB0YWlsTGFiZWwgPSB2TGFiZWw7CiAgICAgIHZhciBmbGlwID0gZmFsc2U7CgogICAgICAvLyBJZiB0aGUgcm9vdCBpcyBpbiB0aGUgdGFpbCBvZiB0aGUgZWRnZSB0aGVuIHdlIG5lZWQgdG8gZmxpcCB0aGUgbG9naWMgdGhhdAogICAgICAvLyBjaGVja3MgZm9yIHRoZSBoZWFkIGFuZCB0YWlsIG5vZGVzIGluIHRoZSBjYW5kaWRhdGVzIGZ1bmN0aW9uIGJlbG93LgogICAgICBpZiAodkxhYmVsLmxpbSA+IHdMYWJlbC5saW0pIHsKICAgICAgICB0YWlsTGFiZWwgPSB3TGFiZWw7CiAgICAgICAgZmxpcCA9IHRydWU7CiAgICAgIH0KCiAgICAgIHZhciBjYW5kaWRhdGVzID0gbG9kYXNoXzEkMS5maWx0ZXIoZy5lZGdlcygpLCBmdW5jdGlvbihlZGdlKSB7CiAgICAgICAgcmV0dXJuIGZsaXAgPT09IGlzRGVzY2VuZGFudCQxKHQsIHQubm9kZShlZGdlLnYpLCB0YWlsTGFiZWwpICYmCiAgICAgICAgICAgICAgIGZsaXAgIT09IGlzRGVzY2VuZGFudCQxKHQsIHQubm9kZShlZGdlLncpLCB0YWlsTGFiZWwpOwogICAgICB9KTsKCiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLm1pbkJ5KGNhbmRpZGF0ZXMsIGZ1bmN0aW9uKGVkZ2UpIHsgcmV0dXJuIHNsYWNrJDIoZywgZWRnZSk7IH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGV4Y2hhbmdlRWRnZXModCwgZywgZSwgZikgewogICAgICB2YXIgdiA9IGUudjsKICAgICAgdmFyIHcgPSBlLnc7CiAgICAgIHQucmVtb3ZlRWRnZSh2LCB3KTsKICAgICAgdC5zZXRFZGdlKGYudiwgZi53LCB7fSk7CiAgICAgIGluaXRMb3dMaW1WYWx1ZXModCk7CiAgICAgIGluaXRDdXRWYWx1ZXModCwgZyk7CiAgICAgIHVwZGF0ZVJhbmtzKHQsIGcpOwogICAgfQoKICAgIGZ1bmN0aW9uIHVwZGF0ZVJhbmtzKHQsIGcpIHsKICAgICAgdmFyIHJvb3QgPSBsb2Rhc2hfMSQxLmZpbmQodC5ub2RlcygpLCBmdW5jdGlvbih2KSB7IHJldHVybiAhZy5ub2RlKHYpLnBhcmVudDsgfSk7CiAgICAgIHZhciB2cyA9IHByZW9yZGVyJDEodCwgcm9vdCk7CiAgICAgIHZzID0gdnMuc2xpY2UoMSk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaCh2cywgZnVuY3Rpb24odikgewogICAgICAgIHZhciBwYXJlbnQgPSB0Lm5vZGUodikucGFyZW50LAogICAgICAgICAgZWRnZSA9IGcuZWRnZSh2LCBwYXJlbnQpLAogICAgICAgICAgZmxpcHBlZCA9IGZhbHNlOwoKICAgICAgICBpZiAoIWVkZ2UpIHsKICAgICAgICAgIGVkZ2UgPSBnLmVkZ2UocGFyZW50LCB2KTsKICAgICAgICAgIGZsaXBwZWQgPSB0cnVlOwogICAgICAgIH0KCiAgICAgICAgZy5ub2RlKHYpLnJhbmsgPSBnLm5vZGUocGFyZW50KS5yYW5rICsgKGZsaXBwZWQgPyBlZGdlLm1pbmxlbiA6IC1lZGdlLm1pbmxlbik7CiAgICAgIH0pOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVkZ2UgaXMgaW4gdGhlIHRyZWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzVHJlZUVkZ2UodHJlZSwgdSwgdikgewogICAgICByZXR1cm4gdHJlZS5oYXNFZGdlKHUsIHYpOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGRlc2NlbmRhbnQgb2YgdGhlIHJvb3Qgbm9kZSBwZXIgdGhlCiAgICAgKiBhc3NpZ25lZCBsb3cgYW5kIGxpbSBhdHRyaWJ1dGVzIGluIHRoZSB0cmVlLgogICAgICovCiAgICBmdW5jdGlvbiBpc0Rlc2NlbmRhbnQkMSh0cmVlLCB2TGFiZWwsIHJvb3RMYWJlbCkgewogICAgICByZXR1cm4gcm9vdExhYmVsLmxvdyA8PSB2TGFiZWwubGltICYmIHZMYWJlbC5saW0gPD0gcm9vdExhYmVsLmxpbTsKICAgIH0KCiAgICB2YXIgbG9uZ2VzdFBhdGgkMSA9IHV0aWwkMS5sb25nZXN0UGF0aDsKCgoKICAgIHZhciByYW5rXzEgPSByYW5rOwoKICAgIC8qCiAgICAgKiBBc3NpZ25zIGEgcmFuayB0byBlYWNoIG5vZGUgaW4gdGhlIGlucHV0IGdyYXBoIHRoYXQgcmVzcGVjdHMgdGhlICJtaW5sZW4iCiAgICAgKiBjb25zdHJhaW50IHNwZWNpZmllZCBvbiBlZGdlcyBiZXR3ZWVuIG5vZGVzLgogICAgICoKICAgICAqIFRoaXMgYmFzaWMgc3RydWN0dXJlIGlzIGRlcml2ZWQgZnJvbSBHYW5zbmVyLCBldCBhbC4sICJBIFRlY2huaXF1ZSBmb3IKICAgICAqIERyYXdpbmcgRGlyZWN0ZWQgR3JhcGhzLiIKICAgICAqCiAgICAgKiBQcmUtY29uZGl0aW9uczoKICAgICAqCiAgICAgKiAgICAxLiBHcmFwaCBtdXN0IGJlIGEgY29ubmVjdGVkIERBRwogICAgICogICAgMi4gR3JhcGggbm9kZXMgbXVzdCBiZSBvYmplY3RzCiAgICAgKiAgICAzLiBHcmFwaCBlZGdlcyBtdXN0IGhhdmUgIndlaWdodCIgYW5kICJtaW5sZW4iIGF0dHJpYnV0ZXMKICAgICAqCiAgICAgKiBQb3N0LWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gR3JhcGggbm9kZXMgd2lsbCBoYXZlIGEgInJhbmsiIGF0dHJpYnV0ZSBiYXNlZCBvbiB0aGUgcmVzdWx0cyBvZiB0aGUKICAgICAqICAgICAgIGFsZ29yaXRobS4gUmFua3MgY2FuIHN0YXJ0IGF0IGFueSBpbmRleCAoaW5jbHVkaW5nIG5lZ2F0aXZlKSwgd2UnbGwKICAgICAqICAgICAgIGZpeCB0aGVtIHVwIGxhdGVyLgogICAgICovCiAgICBmdW5jdGlvbiByYW5rKGcpIHsKICAgICAgc3dpdGNoKGcuZ3JhcGgoKS5yYW5rZXIpIHsKICAgICAgY2FzZSAibmV0d29yay1zaW1wbGV4IjogbmV0d29ya1NpbXBsZXhSYW5rZXIoZyk7IGJyZWFrOwogICAgICBjYXNlICJ0aWdodC10cmVlIjogdGlnaHRUcmVlUmFua2VyKGcpOyBicmVhazsKICAgICAgY2FzZSAibG9uZ2VzdC1wYXRoIjogbG9uZ2VzdFBhdGhSYW5rZXIoZyk7IGJyZWFrOwogICAgICBkZWZhdWx0OiBuZXR3b3JrU2ltcGxleFJhbmtlcihnKTsKICAgICAgfQogICAgfQoKICAgIC8vIEEgZmFzdCBhbmQgc2ltcGxlIHJhbmtlciwgYnV0IHJlc3VsdHMgYXJlIGZhciBmcm9tIG9wdGltYWwuCiAgICB2YXIgbG9uZ2VzdFBhdGhSYW5rZXIgPSBsb25nZXN0UGF0aCQxOwoKICAgIGZ1bmN0aW9uIHRpZ2h0VHJlZVJhbmtlcihnKSB7CiAgICAgIGxvbmdlc3RQYXRoJDEoZyk7CiAgICAgIGZlYXNpYmxlVHJlZV8xKGcpOwogICAgfQoKICAgIGZ1bmN0aW9uIG5ldHdvcmtTaW1wbGV4UmFua2VyKGcpIHsKICAgICAgbmV0d29ya1NpbXBsZXhfMShnKTsKICAgIH0KCiAgICB2YXIgcGFyZW50RHVtbXlDaGFpbnNfMSA9IHBhcmVudER1bW15Q2hhaW5zOwoKICAgIGZ1bmN0aW9uIHBhcmVudER1bW15Q2hhaW5zKGcpIHsKICAgICAgdmFyIHBvc3RvcmRlck51bXMgPSBwb3N0b3JkZXIkMihnKTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmdyYXBoKCkuZHVtbXlDaGFpbnMsIGZ1bmN0aW9uKHYpIHsKICAgICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTsKICAgICAgICB2YXIgZWRnZU9iaiA9IG5vZGUuZWRnZU9iajsKICAgICAgICB2YXIgcGF0aERhdGEgPSBmaW5kUGF0aChnLCBwb3N0b3JkZXJOdW1zLCBlZGdlT2JqLnYsIGVkZ2VPYmoudyk7CiAgICAgICAgdmFyIHBhdGggPSBwYXRoRGF0YS5wYXRoOwogICAgICAgIHZhciBsY2EgPSBwYXRoRGF0YS5sY2E7CiAgICAgICAgdmFyIHBhdGhJZHggPSAwOwogICAgICAgIHZhciBwYXRoViA9IHBhdGhbcGF0aElkeF07CiAgICAgICAgdmFyIGFzY2VuZGluZyA9IHRydWU7CgogICAgICAgIHdoaWxlICh2ICE9PSBlZGdlT2JqLncpIHsKICAgICAgICAgIG5vZGUgPSBnLm5vZGUodik7CgogICAgICAgICAgaWYgKGFzY2VuZGluZykgewogICAgICAgICAgICB3aGlsZSAoKHBhdGhWID0gcGF0aFtwYXRoSWR4XSkgIT09IGxjYSAmJgogICAgICAgICAgICAgICAgICAgZy5ub2RlKHBhdGhWKS5tYXhSYW5rIDwgbm9kZS5yYW5rKSB7CiAgICAgICAgICAgICAgcGF0aElkeCsrOwogICAgICAgICAgICB9CgogICAgICAgICAgICBpZiAocGF0aFYgPT09IGxjYSkgewogICAgICAgICAgICAgIGFzY2VuZGluZyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCFhc2NlbmRpbmcpIHsKICAgICAgICAgICAgd2hpbGUgKHBhdGhJZHggPCBwYXRoLmxlbmd0aCAtIDEgJiYKICAgICAgICAgICAgICAgICAgIGcubm9kZShwYXRoViA9IHBhdGhbcGF0aElkeCArIDFdKS5taW5SYW5rIDw9IG5vZGUucmFuaykgewogICAgICAgICAgICAgIHBhdGhJZHgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBwYXRoViA9IHBhdGhbcGF0aElkeF07CiAgICAgICAgICB9CgogICAgICAgICAgZy5zZXRQYXJlbnQodiwgcGF0aFYpOwogICAgICAgICAgdiA9IGcuc3VjY2Vzc29ycyh2KVswXTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIC8vIEZpbmQgYSBwYXRoIGZyb20gdiB0byB3IHRocm91Z2ggdGhlIGxvd2VzdCBjb21tb24gYW5jZXN0b3IgKExDQSkuIFJldHVybiB0aGUKICAgIC8vIGZ1bGwgcGF0aCBhbmQgdGhlIExDQS4KICAgIGZ1bmN0aW9uIGZpbmRQYXRoKGcsIHBvc3RvcmRlck51bXMsIHYsIHcpIHsKICAgICAgdmFyIHZQYXRoID0gW107CiAgICAgIHZhciB3UGF0aCA9IFtdOwogICAgICB2YXIgbG93ID0gTWF0aC5taW4ocG9zdG9yZGVyTnVtc1t2XS5sb3csIHBvc3RvcmRlck51bXNbd10ubG93KTsKICAgICAgdmFyIGxpbSA9IE1hdGgubWF4KHBvc3RvcmRlck51bXNbdl0ubGltLCBwb3N0b3JkZXJOdW1zW3ddLmxpbSk7CiAgICAgIHZhciBwYXJlbnQ7CiAgICAgIHZhciBsY2E7CgogICAgICAvLyBUcmF2ZXJzZSB1cCBmcm9tIHYgdG8gZmluZCB0aGUgTENBCiAgICAgIHBhcmVudCA9IHY7CiAgICAgIGRvIHsKICAgICAgICBwYXJlbnQgPSBnLnBhcmVudChwYXJlbnQpOwogICAgICAgIHZQYXRoLnB1c2gocGFyZW50KTsKICAgICAgfSB3aGlsZSAocGFyZW50ICYmCiAgICAgICAgICAgICAgIChwb3N0b3JkZXJOdW1zW3BhcmVudF0ubG93ID4gbG93IHx8IGxpbSA+IHBvc3RvcmRlck51bXNbcGFyZW50XS5saW0pKTsKICAgICAgbGNhID0gcGFyZW50OwoKICAgICAgLy8gVHJhdmVyc2UgZnJvbSB3IHRvIExDQQogICAgICBwYXJlbnQgPSB3OwogICAgICB3aGlsZSAoKHBhcmVudCA9IGcucGFyZW50KHBhcmVudCkpICE9PSBsY2EpIHsKICAgICAgICB3UGF0aC5wdXNoKHBhcmVudCk7CiAgICAgIH0KCiAgICAgIHJldHVybiB7IHBhdGg6IHZQYXRoLmNvbmNhdCh3UGF0aC5yZXZlcnNlKCkpLCBsY2E6IGxjYSB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvc3RvcmRlciQyKGcpIHsKICAgICAgdmFyIHJlc3VsdCA9IHt9OwogICAgICB2YXIgbGltID0gMDsKCiAgICAgIGZ1bmN0aW9uIGRmcyh2KSB7CiAgICAgICAgdmFyIGxvdyA9IGxpbTsKICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5jaGlsZHJlbih2KSwgZGZzKTsKICAgICAgICByZXN1bHRbdl0gPSB7IGxvdzogbG93LCBsaW06IGxpbSsrIH07CiAgICAgIH0KICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTsKCiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgdmFyIG5lc3RpbmdHcmFwaCA9IHsKICAgICAgcnVuOiBydW4kMiwKICAgICAgY2xlYW51cDogY2xlYW51cAogICAgfTsKCiAgICAvKgogICAgICogQSBuZXN0aW5nIGdyYXBoIGNyZWF0ZXMgZHVtbXkgbm9kZXMgZm9yIHRoZSB0b3BzIGFuZCBib3R0b21zIG9mIHN1YmdyYXBocywKICAgICAqIGFkZHMgYXBwcm9wcmlhdGUgZWRnZXMgdG8gZW5zdXJlIHRoYXQgYWxsIGNsdXN0ZXIgbm9kZXMgYXJlIHBsYWNlZCBiZXR3ZWVuCiAgICAgKiB0aGVzZSBib3VuZHJpZXMsIGFuZCBlbnN1cmVzIHRoYXQgdGhlIGdyYXBoIGlzIGNvbm5lY3RlZC4KICAgICAqCiAgICAgKiBJbiBhZGRpdGlvbiB3ZSBlbnN1cmUsIHRocm91Z2ggdGhlIHVzZSBvZiB0aGUgbWlubGVuIHByb3BlcnR5LCB0aGF0IG5vZGVzCiAgICAgKiBhbmQgc3ViZ3JhcGggYm9yZGVyIG5vZGVzIHRvIG5vdCBlbmQgdXAgb24gdGhlIHNhbWUgcmFuay4KICAgICAqCiAgICAgKiBQcmVjb25kaXRpb25zOgogICAgICoKICAgICAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHCiAgICAgKiAgICAyLiBOb2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGggaGFzIGEgbWlubGVuIGF0dHJpYnV0ZQogICAgICoKICAgICAqIFBvc3Rjb25kaXRpb25zOgogICAgICoKICAgICAqICAgIDEuIElucHV0IGdyYXBoIGlzIGNvbm5lY3RlZC4KICAgICAqICAgIDIuIER1bW15IG5vZGVzIGFyZSBhZGRlZCBmb3IgdGhlIHRvcHMgYW5kIGJvdHRvbXMgb2Ygc3ViZ3JhcGhzLgogICAgICogICAgMy4gVGhlIG1pbmxlbiBhdHRyaWJ1dGUgZm9yIG5vZGVzIGlzIGFkanVzdGVkIHRvIGVuc3VyZSBub2RlcyBkbyBub3QKICAgICAqICAgICAgIGdldCBwbGFjZWQgb24gdGhlIHNhbWUgcmFuayBhcyBzdWJncmFwaCBib3JkZXIgbm9kZXMuCiAgICAgKgogICAgICogVGhlIG5lc3RpbmcgZ3JhcGggaWRlYSBjb21lcyBmcm9tIFNhbmRlciwgIkxheW91dCBvZiBDb21wb3VuZCBEaXJlY3RlZAogICAgICogR3JhcGhzLiIKICAgICAqLwogICAgZnVuY3Rpb24gcnVuJDIoZykgewogICAgICB2YXIgcm9vdCA9IHV0aWwuYWRkRHVtbXlOb2RlKGcsICJyb290Iiwge30sICJfcm9vdCIpOwogICAgICB2YXIgZGVwdGhzID0gdHJlZURlcHRocyhnKTsKICAgICAgdmFyIGhlaWdodCA9IGxvZGFzaF8xJDEubWF4KGxvZGFzaF8xJDEudmFsdWVzKGRlcHRocykpIC0gMTsgLy8gTm90ZTogZGVwdGhzIGlzIGFuIE9iamVjdCBub3QgYW4gYXJyYXkKICAgICAgdmFyIG5vZGVTZXAgPSAyICogaGVpZ2h0ICsgMTsKCiAgICAgIGcuZ3JhcGgoKS5uZXN0aW5nUm9vdCA9IHJvb3Q7CgogICAgICAvLyBNdWx0aXBseSBtaW5sZW4gYnkgbm9kZVNlcCB0byBhbGlnbiBub2RlcyBvbiBub24tYm9yZGVyIHJhbmtzLgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7IGcuZWRnZShlKS5taW5sZW4gKj0gbm9kZVNlcDsgfSk7CgogICAgICAvLyBDYWxjdWxhdGUgYSB3ZWlnaHQgdGhhdCBpcyBzdWZmaWNpZW50IHRvIGtlZXAgc3ViZ3JhcGhzIHZlcnRpY2FsbHkgY29tcGFjdAogICAgICB2YXIgd2VpZ2h0ID0gc3VtV2VpZ2h0cyhnKSArIDE7CgogICAgICAvLyBDcmVhdGUgYm9yZGVyIG5vZGVzIGFuZCBsaW5rIHRoZW0gdXAKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZnVuY3Rpb24oY2hpbGQpIHsKICAgICAgICBkZnMkMShnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCBjaGlsZCk7CiAgICAgIH0pOwoKICAgICAgLy8gU2F2ZSB0aGUgbXVsdGlwbGllciBmb3Igbm9kZSBsYXllcnMgZm9yIGxhdGVyIHJlbW92YWwgb2YgZW1wdHkgYm9yZGVyCiAgICAgIC8vIGxheWVycy4KICAgICAgZy5ncmFwaCgpLm5vZGVSYW5rRmFjdG9yID0gbm9kZVNlcDsKICAgIH0KCiAgICBmdW5jdGlvbiBkZnMkMShnLCByb290LCBub2RlU2VwLCB3ZWlnaHQsIGhlaWdodCwgZGVwdGhzLCB2KSB7CiAgICAgIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7CiAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgaWYgKHYgIT09IHJvb3QpIHsKICAgICAgICAgIGcuc2V0RWRnZShyb290LCB2LCB7IHdlaWdodDogMCwgbWlubGVuOiBub2RlU2VwIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIHZhciB0b3AgPSB1dGlsLmFkZEJvcmRlck5vZGUoZywgIl9idCIpOwogICAgICB2YXIgYm90dG9tID0gdXRpbC5hZGRCb3JkZXJOb2RlKGcsICJfYmIiKTsKICAgICAgdmFyIGxhYmVsID0gZy5ub2RlKHYpOwoKICAgICAgZy5zZXRQYXJlbnQodG9wLCB2KTsKICAgICAgbGFiZWwuYm9yZGVyVG9wID0gdG9wOwogICAgICBnLnNldFBhcmVudChib3R0b20sIHYpOwogICAgICBsYWJlbC5ib3JkZXJCb3R0b20gPSBib3R0b207CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7CiAgICAgICAgZGZzJDEoZywgcm9vdCwgbm9kZVNlcCwgd2VpZ2h0LCBoZWlnaHQsIGRlcHRocywgY2hpbGQpOwoKICAgICAgICB2YXIgY2hpbGROb2RlID0gZy5ub2RlKGNoaWxkKTsKICAgICAgICB2YXIgY2hpbGRUb3AgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gY2hpbGROb2RlLmJvcmRlclRvcCA6IGNoaWxkOwogICAgICAgIHZhciBjaGlsZEJvdHRvbSA9IGNoaWxkTm9kZS5ib3JkZXJCb3R0b20gPyBjaGlsZE5vZGUuYm9yZGVyQm90dG9tIDogY2hpbGQ7CiAgICAgICAgdmFyIHRoaXNXZWlnaHQgPSBjaGlsZE5vZGUuYm9yZGVyVG9wID8gd2VpZ2h0IDogMiAqIHdlaWdodDsKICAgICAgICB2YXIgbWlubGVuID0gY2hpbGRUb3AgIT09IGNoaWxkQm90dG9tID8gMSA6IGhlaWdodCAtIGRlcHRoc1t2XSArIDE7CgogICAgICAgIGcuc2V0RWRnZSh0b3AsIGNoaWxkVG9wLCB7CiAgICAgICAgICB3ZWlnaHQ6IHRoaXNXZWlnaHQsCiAgICAgICAgICBtaW5sZW46IG1pbmxlbiwKICAgICAgICAgIG5lc3RpbmdFZGdlOiB0cnVlCiAgICAgICAgfSk7CgogICAgICAgIGcuc2V0RWRnZShjaGlsZEJvdHRvbSwgYm90dG9tLCB7CiAgICAgICAgICB3ZWlnaHQ6IHRoaXNXZWlnaHQsCiAgICAgICAgICBtaW5sZW46IG1pbmxlbiwKICAgICAgICAgIG5lc3RpbmdFZGdlOiB0cnVlCiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgaWYgKCFnLnBhcmVudCh2KSkgewogICAgICAgIGcuc2V0RWRnZShyb290LCB0b3AsIHsgd2VpZ2h0OiAwLCBtaW5sZW46IGhlaWdodCArIGRlcHRoc1t2XSB9KTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRyZWVEZXB0aHMoZykgewogICAgICB2YXIgZGVwdGhzID0ge307CiAgICAgIGZ1bmN0aW9uIGRmcyh2LCBkZXB0aCkgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7CiAgICAgICAgaWYgKGNoaWxkcmVuICYmIGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgewogICAgICAgICAgICBkZnMoY2hpbGQsIGRlcHRoICsgMSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZGVwdGhzW3ZdID0gZGVwdGg7CiAgICAgIH0KICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZnVuY3Rpb24odikgeyBkZnModiwgMSk7IH0pOwogICAgICByZXR1cm4gZGVwdGhzOwogICAgfQoKICAgIGZ1bmN0aW9uIHN1bVdlaWdodHMoZykgewogICAgICByZXR1cm4gbG9kYXNoXzEkMS5yZWR1Y2UoZy5lZGdlcygpLCBmdW5jdGlvbihhY2MsIGUpIHsKICAgICAgICByZXR1cm4gYWNjICsgZy5lZGdlKGUpLndlaWdodDsKICAgICAgfSwgMCk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xlYW51cChnKSB7CiAgICAgIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpOwogICAgICBnLnJlbW92ZU5vZGUoZ3JhcGhMYWJlbC5uZXN0aW5nUm9vdCk7CiAgICAgIGRlbGV0ZSBncmFwaExhYmVsLm5lc3RpbmdSb290OwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7CiAgICAgICAgaWYgKGVkZ2UubmVzdGluZ0VkZ2UpIHsKICAgICAgICAgIGcucmVtb3ZlRWRnZShlKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHZhciBhZGRCb3JkZXJTZWdtZW50c18xID0gYWRkQm9yZGVyU2VnbWVudHM7CgogICAgZnVuY3Rpb24gYWRkQm9yZGVyU2VnbWVudHMoZykgewogICAgICBmdW5jdGlvbiBkZnModikgewogICAgICAgIHZhciBjaGlsZHJlbiA9IGcuY2hpbGRyZW4odik7CiAgICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7CiAgICAgICAgaWYgKGNoaWxkcmVuLmxlbmd0aCkgewogICAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGNoaWxkcmVuLCBkZnMpOwogICAgICAgIH0KCiAgICAgICAgaWYgKGxvZGFzaF8xJDEuaGFzKG5vZGUsICJtaW5SYW5rIikpIHsKICAgICAgICAgIG5vZGUuYm9yZGVyTGVmdCA9IFtdOwogICAgICAgICAgbm9kZS5ib3JkZXJSaWdodCA9IFtdOwogICAgICAgICAgZm9yICh2YXIgcmFuayA9IG5vZGUubWluUmFuaywgbWF4UmFuayA9IG5vZGUubWF4UmFuayArIDE7CiAgICAgICAgICAgIHJhbmsgPCBtYXhSYW5rOwogICAgICAgICAgICArK3JhbmspIHsKICAgICAgICAgICAgYWRkQm9yZGVyTm9kZSQxKGcsICJib3JkZXJMZWZ0IiwgIl9ibCIsIHYsIG5vZGUsIHJhbmspOwogICAgICAgICAgICBhZGRCb3JkZXJOb2RlJDEoZywgImJvcmRlclJpZ2h0IiwgIl9iciIsIHYsIG5vZGUsIHJhbmspOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuY2hpbGRyZW4oKSwgZGZzKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhZGRCb3JkZXJOb2RlJDEoZywgcHJvcCwgcHJlZml4LCBzZywgc2dOb2RlLCByYW5rKSB7CiAgICAgIHZhciBsYWJlbCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCwgcmFuazogcmFuaywgYm9yZGVyVHlwZTogcHJvcCB9OwogICAgICB2YXIgcHJldiA9IHNnTm9kZVtwcm9wXVtyYW5rIC0gMV07CiAgICAgIHZhciBjdXJyID0gdXRpbC5hZGREdW1teU5vZGUoZywgImJvcmRlciIsIGxhYmVsLCBwcmVmaXgpOwogICAgICBzZ05vZGVbcHJvcF1bcmFua10gPSBjdXJyOwogICAgICBnLnNldFBhcmVudChjdXJyLCBzZyk7CiAgICAgIGlmIChwcmV2KSB7CiAgICAgICAgZy5zZXRFZGdlKHByZXYsIGN1cnIsIHsgd2VpZ2h0OiAxIH0pOwogICAgICB9CiAgICB9CgogICAgdmFyIGNvb3JkaW5hdGVTeXN0ZW0gPSB7CiAgICAgIGFkanVzdDogYWRqdXN0LAogICAgICB1bmRvOiB1bmRvJDIKICAgIH07CgogICAgZnVuY3Rpb24gYWRqdXN0KGcpIHsKICAgICAgdmFyIHJhbmtEaXIgPSBnLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAocmFua0RpciA9PT0gImxyIiB8fCByYW5rRGlyID09PSAicmwiKSB7CiAgICAgICAgc3dhcFdpZHRoSGVpZ2h0KGcpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdW5kbyQyKGcpIHsKICAgICAgdmFyIHJhbmtEaXIgPSBnLmdyYXBoKCkucmFua2Rpci50b0xvd2VyQ2FzZSgpOwogICAgICBpZiAocmFua0RpciA9PT0gImJ0IiB8fCByYW5rRGlyID09PSAicmwiKSB7CiAgICAgICAgcmV2ZXJzZVkoZyk7CiAgICAgIH0KCiAgICAgIGlmIChyYW5rRGlyID09PSAibHIiIHx8IHJhbmtEaXIgPT09ICJybCIpIHsKICAgICAgICBzd2FwWFkoZyk7CiAgICAgICAgc3dhcFdpZHRoSGVpZ2h0KGcpOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc3dhcFdpZHRoSGVpZ2h0KGcpIHsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgeyBzd2FwV2lkdGhIZWlnaHRPbmUoZy5ub2RlKHYpKTsgfSk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsgc3dhcFdpZHRoSGVpZ2h0T25lKGcuZWRnZShlKSk7IH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHN3YXBXaWR0aEhlaWdodE9uZShhdHRycykgewogICAgICB2YXIgdyA9IGF0dHJzLndpZHRoOwogICAgICBhdHRycy53aWR0aCA9IGF0dHJzLmhlaWdodDsKICAgICAgYXR0cnMuaGVpZ2h0ID0gdzsKICAgIH0KCiAgICBmdW5jdGlvbiByZXZlcnNlWShnKSB7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgcmV2ZXJzZVlPbmUoZy5ub2RlKHYpKTsgfSk7CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSk7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGVkZ2UucG9pbnRzLCByZXZlcnNlWU9uZSk7CiAgICAgICAgaWYgKGxvZGFzaF8xJDEuaGFzKGVkZ2UsICJ5IikpIHsKICAgICAgICAgIHJldmVyc2VZT25lKGVkZ2UpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmV2ZXJzZVlPbmUoYXR0cnMpIHsKICAgICAgYXR0cnMueSA9IC1hdHRycy55OwogICAgfQoKICAgIGZ1bmN0aW9uIHN3YXBYWShnKSB7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgc3dhcFhZT25lKGcubm9kZSh2KSk7IH0pOwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBlZGdlID0gZy5lZGdlKGUpOwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChlZGdlLnBvaW50cywgc3dhcFhZT25lKTsKICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMoZWRnZSwgIngiKSkgewogICAgICAgICAgc3dhcFhZT25lKGVkZ2UpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gc3dhcFhZT25lKGF0dHJzKSB7CiAgICAgIHZhciB4ID0gYXR0cnMueDsKICAgICAgYXR0cnMueCA9IGF0dHJzLnk7CiAgICAgIGF0dHJzLnkgPSB4OwogICAgfQoKICAgIHZhciBpbml0T3JkZXJfMSA9IGluaXRPcmRlcjsKCiAgICAvKgogICAgICogQXNzaWducyBhbiBpbml0aWFsIG9yZGVyIHZhbHVlIGZvciBlYWNoIG5vZGUgYnkgcGVyZm9ybWluZyBhIERGUyBzZWFyY2gKICAgICAqIHN0YXJ0aW5nIGZyb20gbm9kZXMgaW4gdGhlIGZpcnN0IHJhbmsuIE5vZGVzIGFyZSBhc3NpZ25lZCBhbiBvcmRlciBpbiB0aGVpcgogICAgICogcmFuayBhcyB0aGV5IGFyZSBmaXJzdCB2aXNpdGVkLgogICAgICoKICAgICAqIFRoaXMgYXBwcm9hY2ggY29tZXMgZnJvbSBHYW5zbmVyLCBldCBhbC4sICJBIFRlY2huaXF1ZSBmb3IgRHJhd2luZyBEaXJlY3RlZAogICAgICogR3JhcGhzLiIKICAgICAqCiAgICAgKiBSZXR1cm5zIGEgbGF5ZXJpbmcgbWF0cml4IHdpdGggYW4gYXJyYXkgcGVyIGxheWVyIGFuZCBlYWNoIGxheWVyIHNvcnRlZCBieQogICAgICogdGhlIG9yZGVyIG9mIGl0cyBub2Rlcy4KICAgICAqLwogICAgZnVuY3Rpb24gaW5pdE9yZGVyKGcpIHsKICAgICAgdmFyIHZpc2l0ZWQgPSB7fTsKICAgICAgdmFyIHNpbXBsZU5vZGVzID0gbG9kYXNoXzEkMS5maWx0ZXIoZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgcmV0dXJuICFnLmNoaWxkcmVuKHYpLmxlbmd0aDsKICAgICAgfSk7CiAgICAgIHZhciBtYXhSYW5rID0gbG9kYXNoXzEkMS5tYXgobG9kYXNoXzEkMS5tYXAoc2ltcGxlTm9kZXMsIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIGcubm9kZSh2KS5yYW5rOyB9KSk7CiAgICAgIHZhciBsYXllcnMgPSBsb2Rhc2hfMSQxLm1hcChsb2Rhc2hfMSQxLnJhbmdlKG1heFJhbmsgKyAxKSwgZnVuY3Rpb24oKSB7IHJldHVybiBbXTsgfSk7CgogICAgICBmdW5jdGlvbiBkZnModikgewogICAgICAgIGlmIChsb2Rhc2hfMSQxLmhhcyh2aXNpdGVkLCB2KSkgcmV0dXJuOwogICAgICAgIHZpc2l0ZWRbdl0gPSB0cnVlOwogICAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpOwogICAgICAgIGxheWVyc1tub2RlLnJhbmtdLnB1c2godik7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuc3VjY2Vzc29ycyh2KSwgZGZzKTsKICAgICAgfQoKICAgICAgdmFyIG9yZGVyZWRWcyA9IGxvZGFzaF8xJDEuc29ydEJ5KHNpbXBsZU5vZGVzLCBmdW5jdGlvbih2KSB7IHJldHVybiBnLm5vZGUodikucmFuazsgfSk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChvcmRlcmVkVnMsIGRmcyk7CgogICAgICByZXR1cm4gbGF5ZXJzOwogICAgfQoKICAgIHZhciBjcm9zc0NvdW50XzEgPSBjcm9zc0NvdW50OwoKICAgIC8qCiAgICAgKiBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYSBsYXllcmluZyAoYW4gYXJyYXkgb2YgbGF5ZXJzLCBlYWNoIHdpdGggYW4gYXJyYXkgb2YKICAgICAqIG9yZGVyZXJkIG5vZGVzKSBhbmQgYSBncmFwaCBhbmQgcmV0dXJucyBhIHdlaWdodGVkIGNyb3NzaW5nIGNvdW50LgogICAgICoKICAgICAqIFByZS1jb25kaXRpb25zOgogICAgICoKICAgICAqICAgIDEuIElucHV0IGdyYXBoIG11c3QgYmUgc2ltcGxlIChub3QgYSBtdWx0aWdyYXBoKSwgZGlyZWN0ZWQsIGFuZCBpbmNsdWRlCiAgICAgKiAgICAgICBvbmx5IHNpbXBsZSBlZGdlcy4KICAgICAqICAgIDIuIEVkZ2VzIGluIHRoZSBpbnB1dCBncmFwaCBtdXN0IGhhdmUgYXNzaWduZWQgd2VpZ2h0cy4KICAgICAqCiAgICAgKiBQb3N0LWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gVGhlIGdyYXBoIGFuZCBsYXllcmluZyBtYXRyaXggYXJlIGxlZnQgdW5jaGFuZ2VkLgogICAgICoKICAgICAqIFRoaXMgYWxnb3JpdGhtIGlzIGRlcml2ZWQgZnJvbSBCYXJ0aCwgZXQgYWwuLCAiQmlsYXllciBDcm9zcyBDb3VudGluZy4iCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyb3NzQ291bnQoZywgbGF5ZXJpbmcpIHsKICAgICAgdmFyIGNjID0gMDsKICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBsYXllcmluZy5sZW5ndGg7ICsraSkgewogICAgICAgIGNjICs9IHR3b0xheWVyQ3Jvc3NDb3VudChnLCBsYXllcmluZ1tpLTFdLCBsYXllcmluZ1tpXSk7CiAgICAgIH0KICAgICAgcmV0dXJuIGNjOwogICAgfQoKICAgIGZ1bmN0aW9uIHR3b0xheWVyQ3Jvc3NDb3VudChnLCBub3J0aExheWVyLCBzb3V0aExheWVyKSB7CiAgICAgIC8vIFNvcnQgYWxsIG9mIHRoZSBlZGdlcyBiZXR3ZWVuIHRoZSBub3J0aCBhbmQgc291dGggbGF5ZXJzIGJ5IHRoZWlyIHBvc2l0aW9uCiAgICAgIC8vIGluIHRoZSBub3J0aCBsYXllciBhbmQgdGhlbiB0aGUgc291dGguIE1hcCB0aGVzZSBlZGdlcyB0byB0aGUgcG9zaXRpb24gb2YKICAgICAgLy8gdGhlaXIgaGVhZCBpbiB0aGUgc291dGggbGF5ZXIuCiAgICAgIHZhciBzb3V0aFBvcyA9IGxvZGFzaF8xJDEuemlwT2JqZWN0KHNvdXRoTGF5ZXIsCiAgICAgICAgbG9kYXNoXzEkMS5tYXAoc291dGhMYXllciwgZnVuY3Rpb24gKHYsIGkpIHsgcmV0dXJuIGk7IH0pKTsKICAgICAgdmFyIHNvdXRoRW50cmllcyA9IGxvZGFzaF8xJDEuZmxhdHRlbihsb2Rhc2hfMSQxLm1hcChub3J0aExheWVyLCBmdW5jdGlvbih2KSB7CiAgICAgICAgcmV0dXJuIGxvZGFzaF8xJDEuc29ydEJ5KGxvZGFzaF8xJDEubWFwKGcub3V0RWRnZXModiksIGZ1bmN0aW9uKGUpIHsKICAgICAgICAgIHJldHVybiB7IHBvczogc291dGhQb3NbZS53XSwgd2VpZ2h0OiBnLmVkZ2UoZSkud2VpZ2h0IH07CiAgICAgICAgfSksICJwb3MiKTsKICAgICAgfSksIHRydWUpOwoKICAgICAgLy8gQnVpbGQgdGhlIGFjY3VtdWxhdG9yIHRyZWUKICAgICAgdmFyIGZpcnN0SW5kZXggPSAxOwogICAgICB3aGlsZSAoZmlyc3RJbmRleCA8IHNvdXRoTGF5ZXIubGVuZ3RoKSBmaXJzdEluZGV4IDw8PSAxOwogICAgICB2YXIgdHJlZVNpemUgPSAyICogZmlyc3RJbmRleCAtIDE7CiAgICAgIGZpcnN0SW5kZXggLT0gMTsKICAgICAgdmFyIHRyZWUgPSBsb2Rhc2hfMSQxLm1hcChuZXcgQXJyYXkodHJlZVNpemUpLCBmdW5jdGlvbigpIHsgcmV0dXJuIDA7IH0pOwoKICAgICAgLy8gQ2FsY3VsYXRlIHRoZSB3ZWlnaHRlZCBjcm9zc2luZ3MKICAgICAgdmFyIGNjID0gMDsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKHNvdXRoRW50cmllcy5mb3JFYWNoKGZ1bmN0aW9uKGVudHJ5KSB7CiAgICAgICAgdmFyIGluZGV4ID0gZW50cnkucG9zICsgZmlyc3RJbmRleDsKICAgICAgICB0cmVlW2luZGV4XSArPSBlbnRyeS53ZWlnaHQ7CiAgICAgICAgdmFyIHdlaWdodFN1bSA9IDA7CiAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkgewogICAgICAgICAgaWYgKGluZGV4ICUgMikgewogICAgICAgICAgICB3ZWlnaHRTdW0gKz0gdHJlZVtpbmRleCArIDFdOwogICAgICAgICAgfQogICAgICAgICAgaW5kZXggPSAoaW5kZXggLSAxKSA+PiAxOwogICAgICAgICAgdHJlZVtpbmRleF0gKz0gZW50cnkud2VpZ2h0OwogICAgICAgIH0KICAgICAgICBjYyArPSBlbnRyeS53ZWlnaHQgKiB3ZWlnaHRTdW07CiAgICAgIH0pKTsKCiAgICAgIHJldHVybiBjYzsKICAgIH0KCiAgICB2YXIgYmFyeWNlbnRlcl8xID0gYmFyeWNlbnRlcjsKCiAgICBmdW5jdGlvbiBiYXJ5Y2VudGVyKGcsIG1vdmFibGUpIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xJDEubWFwKG1vdmFibGUsIGZ1bmN0aW9uKHYpIHsKICAgICAgICB2YXIgaW5WID0gZy5pbkVkZ2VzKHYpOwogICAgICAgIGlmICghaW5WLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIHsgdjogdiB9OwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgcmVzdWx0ID0gbG9kYXNoXzEkMS5yZWR1Y2UoaW5WLCBmdW5jdGlvbihhY2MsIGUpIHsKICAgICAgICAgICAgdmFyIGVkZ2UgPSBnLmVkZ2UoZSksCiAgICAgICAgICAgICAgbm9kZVUgPSBnLm5vZGUoZS52KTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICBzdW06IGFjYy5zdW0gKyAoZWRnZS53ZWlnaHQgKiBub2RlVS5vcmRlciksCiAgICAgICAgICAgICAgd2VpZ2h0OiBhY2Mud2VpZ2h0ICsgZWRnZS53ZWlnaHQKICAgICAgICAgICAgfTsKICAgICAgICAgIH0sIHsgc3VtOiAwLCB3ZWlnaHQ6IDAgfSk7CgogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgdjogdiwKICAgICAgICAgICAgYmFyeWNlbnRlcjogcmVzdWx0LnN1bSAvIHJlc3VsdC53ZWlnaHQsCiAgICAgICAgICAgIHdlaWdodDogcmVzdWx0LndlaWdodAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0pOwogICAgfQoKICAgIHZhciByZXNvbHZlQ29uZmxpY3RzXzEgPSByZXNvbHZlQ29uZmxpY3RzOwoKICAgIC8qCiAgICAgKiBHaXZlbiBhIGxpc3Qgb2YgZW50cmllcyBvZiB0aGUgZm9ybSB7diwgYmFyeWNlbnRlciwgd2VpZ2h0fSBhbmQgYQogICAgICogY29uc3RyYWludCBncmFwaCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmVzb2x2ZSBhbnkgY29uZmxpY3RzIGJldHdlZW4gdGhlCiAgICAgKiBjb25zdHJhaW50IGdyYXBoIGFuZCB0aGUgYmFyeWNlbnRlcnMgZm9yIHRoZSBlbnRyaWVzLiBJZiB0aGUgYmFyeWNlbnRlcnMgZm9yCiAgICAgKiBhbiBlbnRyeSB3b3VsZCB2aW9sYXRlIGEgY29uc3RyYWludCBpbiB0aGUgY29uc3RyYWludCBncmFwaCB0aGVuIHdlIGNvYWxlc2NlCiAgICAgKiB0aGUgbm9kZXMgaW4gdGhlIGNvbmZsaWN0IGludG8gYSBuZXcgbm9kZSB0aGF0IHJlc3BlY3RzIHRoZSBjb250cmFpbnQgYW5kCiAgICAgKiBhZ2dyZWdhdGVzIGJhcnljZW50ZXIgYW5kIHdlaWdodCBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIHRoZSBkZXNjcmlwdGlvbiBpbiBGb3JzdGVyLCAiQSBGYXN0IGFuZAogICAgICogU2ltcGxlIEh1ZXJpc3RpYyBmb3IgQ29uc3RyYWluZWQgVHdvLUxldmVsIENyb3NzaW5nIFJlZHVjdGlvbiwiIHRob3VnaHQgaXQKICAgICAqIGRpZmZlcnMgaW4gc29tZSBzcGVjaWZpYyBkZXRhaWxzLgogICAgICoKICAgICAqIFByZS1jb25kaXRpb25zOgogICAgICoKICAgICAqICAgIDEuIEVhY2ggZW50cnkgaGFzIHRoZSBmb3JtIHt2LCBiYXJ5Y2VudGVyLCB3ZWlnaHR9LCBvciBpZiB0aGUgbm9kZSBoYXMKICAgICAqICAgICAgIG5vIGJhcnljZW50ZXIsIHRoZW4ge3Z9LgogICAgICoKICAgICAqIFJldHVybnM6CiAgICAgKgogICAgICogICAgQSBuZXcgbGlzdCBvZiBlbnRyaWVzIG9mIHRoZSBmb3JtIHt2cywgaSwgYmFyeWNlbnRlciwgd2VpZ2h0fS4gVGhlIGxpc3QKICAgICAqICAgIGB2c2AgbWF5IGVpdGhlciBiZSBhIHNpbmdsZXRvbiBvciBpdCBtYXkgYmUgYW4gYWdncmVnYXRpb24gb2Ygbm9kZXMKICAgICAqICAgIG9yZGVyZWQgc3VjaCB0aGF0IHRoZXkgZG8gbm90IHZpb2xhdGUgY29uc3RyYWludHMgZnJvbSB0aGUgY29uc3RyYWludAogICAgICogICAgZ3JhcGguIFRoZSBwcm9wZXJ0eSBgaWAgaXMgdGhlIGxvd2VzdCBvcmlnaW5hbCBpbmRleCBvZiBhbnkgb2YgdGhlCiAgICAgKiAgICBlbGVtZW50cyBpbiBgdnNgLgogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlQ29uZmxpY3RzKGVudHJpZXMsIGNnKSB7CiAgICAgIHZhciBtYXBwZWRFbnRyaWVzID0ge307CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSwgaSkgewogICAgICAgIHZhciB0bXAgPSBtYXBwZWRFbnRyaWVzW2VudHJ5LnZdID0gewogICAgICAgICAgaW5kZWdyZWU6IDAsCiAgICAgICAgICAiaW4iOiBbXSwKICAgICAgICAgIG91dDogW10sCiAgICAgICAgICB2czogW2VudHJ5LnZdLAogICAgICAgICAgaTogaQogICAgICAgIH07CiAgICAgICAgaWYgKCFsb2Rhc2hfMSQxLmlzVW5kZWZpbmVkKGVudHJ5LmJhcnljZW50ZXIpKSB7CiAgICAgICAgICB0bXAuYmFyeWNlbnRlciA9IGVudHJ5LmJhcnljZW50ZXI7CiAgICAgICAgICB0bXAud2VpZ2h0ID0gZW50cnkud2VpZ2h0OwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goY2cuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBlbnRyeVYgPSBtYXBwZWRFbnRyaWVzW2Uudl07CiAgICAgICAgdmFyIGVudHJ5VyA9IG1hcHBlZEVudHJpZXNbZS53XTsKICAgICAgICBpZiAoIWxvZGFzaF8xJDEuaXNVbmRlZmluZWQoZW50cnlWKSAmJiAhbG9kYXNoXzEkMS5pc1VuZGVmaW5lZChlbnRyeVcpKSB7CiAgICAgICAgICBlbnRyeVcuaW5kZWdyZWUrKzsKICAgICAgICAgIGVudHJ5Vi5vdXQucHVzaChtYXBwZWRFbnRyaWVzW2Uud10pOwogICAgICAgIH0KICAgICAgfSk7CgogICAgICB2YXIgc291cmNlU2V0ID0gbG9kYXNoXzEkMS5maWx0ZXIobWFwcGVkRW50cmllcywgZnVuY3Rpb24oZW50cnkpIHsKICAgICAgICByZXR1cm4gIWVudHJ5LmluZGVncmVlOwogICAgICB9KTsKCiAgICAgIHJldHVybiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBkb1Jlc29sdmVDb25mbGljdHMoc291cmNlU2V0KSB7CiAgICAgIHZhciBlbnRyaWVzID0gW107CgogICAgICBmdW5jdGlvbiBoYW5kbGVJbih2RW50cnkpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24odUVudHJ5KSB7CiAgICAgICAgICBpZiAodUVudHJ5Lm1lcmdlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAobG9kYXNoXzEkMS5pc1VuZGVmaW5lZCh1RW50cnkuYmFyeWNlbnRlcikgfHwKICAgICAgICAgICAgICBsb2Rhc2hfMSQxLmlzVW5kZWZpbmVkKHZFbnRyeS5iYXJ5Y2VudGVyKSB8fAogICAgICAgICAgICAgIHVFbnRyeS5iYXJ5Y2VudGVyID49IHZFbnRyeS5iYXJ5Y2VudGVyKSB7CiAgICAgICAgICAgIG1lcmdlRW50cmllcyh2RW50cnksIHVFbnRyeSk7CiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gaGFuZGxlT3V0KHZFbnRyeSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbih3RW50cnkpIHsKICAgICAgICAgIHdFbnRyeVsiaW4iXS5wdXNoKHZFbnRyeSk7CiAgICAgICAgICBpZiAoLS13RW50cnkuaW5kZWdyZWUgPT09IDApIHsKICAgICAgICAgICAgc291cmNlU2V0LnB1c2god0VudHJ5KTsKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICB3aGlsZSAoc291cmNlU2V0Lmxlbmd0aCkgewogICAgICAgIHZhciBlbnRyeSA9IHNvdXJjZVNldC5wb3AoKTsKICAgICAgICBlbnRyaWVzLnB1c2goZW50cnkpOwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChlbnRyeVsiaW4iXS5yZXZlcnNlKCksIGhhbmRsZUluKGVudHJ5KSk7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGVudHJ5Lm91dCwgaGFuZGxlT3V0KGVudHJ5KSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLm1hcChsb2Rhc2hfMSQxLmZpbHRlcihlbnRyaWVzLCBmdW5jdGlvbihlbnRyeSkgeyByZXR1cm4gIWVudHJ5Lm1lcmdlZDsgfSksCiAgICAgICAgZnVuY3Rpb24oZW50cnkpIHsKICAgICAgICAgIHJldHVybiBsb2Rhc2hfMSQxLnBpY2soZW50cnksIFsidnMiLCAiaSIsICJiYXJ5Y2VudGVyIiwgIndlaWdodCJdKTsKICAgICAgICB9KTsKCiAgICB9CgogICAgZnVuY3Rpb24gbWVyZ2VFbnRyaWVzKHRhcmdldCwgc291cmNlKSB7CiAgICAgIHZhciBzdW0gPSAwOwogICAgICB2YXIgd2VpZ2h0ID0gMDsKCiAgICAgIGlmICh0YXJnZXQud2VpZ2h0KSB7CiAgICAgICAgc3VtICs9IHRhcmdldC5iYXJ5Y2VudGVyICogdGFyZ2V0LndlaWdodDsKICAgICAgICB3ZWlnaHQgKz0gdGFyZ2V0LndlaWdodDsKICAgICAgfQoKICAgICAgaWYgKHNvdXJjZS53ZWlnaHQpIHsKICAgICAgICBzdW0gKz0gc291cmNlLmJhcnljZW50ZXIgKiBzb3VyY2Uud2VpZ2h0OwogICAgICAgIHdlaWdodCArPSBzb3VyY2Uud2VpZ2h0OwogICAgICB9CgogICAgICB0YXJnZXQudnMgPSBzb3VyY2UudnMuY29uY2F0KHRhcmdldC52cyk7CiAgICAgIHRhcmdldC5iYXJ5Y2VudGVyID0gc3VtIC8gd2VpZ2h0OwogICAgICB0YXJnZXQud2VpZ2h0ID0gd2VpZ2h0OwogICAgICB0YXJnZXQuaSA9IE1hdGgubWluKHNvdXJjZS5pLCB0YXJnZXQuaSk7CiAgICAgIHNvdXJjZS5tZXJnZWQgPSB0cnVlOwogICAgfQoKICAgIHZhciBzb3J0XzEgPSBzb3J0OwoKICAgIGZ1bmN0aW9uIHNvcnQoZW50cmllcywgYmlhc1JpZ2h0KSB7CiAgICAgIHZhciBwYXJ0cyA9IHV0aWwucGFydGl0aW9uKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7CiAgICAgICAgcmV0dXJuIGxvZGFzaF8xJDEuaGFzKGVudHJ5LCAiYmFyeWNlbnRlciIpOwogICAgICB9KTsKICAgICAgdmFyIHNvcnRhYmxlID0gcGFydHMubGhzLAogICAgICAgIHVuc29ydGFibGUgPSBsb2Rhc2hfMSQxLnNvcnRCeShwYXJ0cy5yaHMsIGZ1bmN0aW9uKGVudHJ5KSB7IHJldHVybiAtZW50cnkuaTsgfSksCiAgICAgICAgdnMgPSBbXSwKICAgICAgICBzdW0gPSAwLAogICAgICAgIHdlaWdodCA9IDAsCiAgICAgICAgdnNJbmRleCA9IDA7CgogICAgICBzb3J0YWJsZS5zb3J0KGNvbXBhcmVXaXRoQmlhcyghIWJpYXNSaWdodCkpOwoKICAgICAgdnNJbmRleCA9IGNvbnN1bWVVbnNvcnRhYmxlKHZzLCB1bnNvcnRhYmxlLCB2c0luZGV4KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChzb3J0YWJsZSwgZnVuY3Rpb24gKGVudHJ5KSB7CiAgICAgICAgdnNJbmRleCArPSBlbnRyeS52cy5sZW5ndGg7CiAgICAgICAgdnMucHVzaChlbnRyeS52cyk7CiAgICAgICAgc3VtICs9IGVudHJ5LmJhcnljZW50ZXIgKiBlbnRyeS53ZWlnaHQ7CiAgICAgICAgd2VpZ2h0ICs9IGVudHJ5LndlaWdodDsKICAgICAgICB2c0luZGV4ID0gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIHZzSW5kZXgpOwogICAgICB9KTsKCiAgICAgIHZhciByZXN1bHQgPSB7IHZzOiBsb2Rhc2hfMSQxLmZsYXR0ZW4odnMsIHRydWUpIH07CiAgICAgIGlmICh3ZWlnaHQpIHsKICAgICAgICByZXN1bHQuYmFyeWNlbnRlciA9IHN1bSAvIHdlaWdodDsKICAgICAgICByZXN1bHQud2VpZ2h0ID0gd2VpZ2h0OwogICAgICB9CiAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3VtZVVuc29ydGFibGUodnMsIHVuc29ydGFibGUsIGluZGV4KSB7CiAgICAgIHZhciBsYXN0OwogICAgICB3aGlsZSAodW5zb3J0YWJsZS5sZW5ndGggJiYgKGxhc3QgPSBsb2Rhc2hfMSQxLmxhc3QodW5zb3J0YWJsZSkpLmkgPD0gaW5kZXgpIHsKICAgICAgICB1bnNvcnRhYmxlLnBvcCgpOwogICAgICAgIHZzLnB1c2gobGFzdC52cyk7CiAgICAgICAgaW5kZXgrKzsKICAgICAgfQogICAgICByZXR1cm4gaW5kZXg7CiAgICB9CgogICAgZnVuY3Rpb24gY29tcGFyZVdpdGhCaWFzKGJpYXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKGVudHJ5ViwgZW50cnlXKSB7CiAgICAgICAgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyIDwgZW50cnlXLmJhcnljZW50ZXIpIHsKICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9IGVsc2UgaWYgKGVudHJ5Vi5iYXJ5Y2VudGVyID4gZW50cnlXLmJhcnljZW50ZXIpIHsKICAgICAgICAgIHJldHVybiAxOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICFiaWFzID8gZW50cnlWLmkgLSBlbnRyeVcuaSA6IGVudHJ5Vy5pIC0gZW50cnlWLmk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIHNvcnRTdWJncmFwaF8xID0gc29ydFN1YmdyYXBoOwoKICAgIGZ1bmN0aW9uIHNvcnRTdWJncmFwaChnLCB2LCBjZywgYmlhc1JpZ2h0KSB7CiAgICAgIHZhciBtb3ZhYmxlID0gZy5jaGlsZHJlbih2KTsKICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7CiAgICAgIHZhciBibCA9IG5vZGUgPyBub2RlLmJvcmRlckxlZnQgOiB1bmRlZmluZWQ7CiAgICAgIHZhciBiciA9IG5vZGUgPyBub2RlLmJvcmRlclJpZ2h0OiB1bmRlZmluZWQ7CiAgICAgIHZhciBzdWJncmFwaHMgPSB7fTsKCiAgICAgIGlmIChibCkgewogICAgICAgIG1vdmFibGUgPSBsb2Rhc2hfMSQxLmZpbHRlcihtb3ZhYmxlLCBmdW5jdGlvbih3KSB7CiAgICAgICAgICByZXR1cm4gdyAhPT0gYmwgJiYgdyAhPT0gYnI7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIHZhciBiYXJ5Y2VudGVycyA9IGJhcnljZW50ZXJfMShnLCBtb3ZhYmxlKTsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGJhcnljZW50ZXJzLCBmdW5jdGlvbihlbnRyeSkgewogICAgICAgIGlmIChnLmNoaWxkcmVuKGVudHJ5LnYpLmxlbmd0aCkgewogICAgICAgICAgdmFyIHN1YmdyYXBoUmVzdWx0ID0gc29ydFN1YmdyYXBoKGcsIGVudHJ5LnYsIGNnLCBiaWFzUmlnaHQpOwogICAgICAgICAgc3ViZ3JhcGhzW2VudHJ5LnZdID0gc3ViZ3JhcGhSZXN1bHQ7CiAgICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMoc3ViZ3JhcGhSZXN1bHQsICJiYXJ5Y2VudGVyIikpIHsKICAgICAgICAgICAgbWVyZ2VCYXJ5Y2VudGVycyhlbnRyeSwgc3ViZ3JhcGhSZXN1bHQpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CgogICAgICB2YXIgZW50cmllcyA9IHJlc29sdmVDb25mbGljdHNfMShiYXJ5Y2VudGVycywgY2cpOwogICAgICBleHBhbmRTdWJncmFwaHMoZW50cmllcywgc3ViZ3JhcGhzKTsKCiAgICAgIHZhciByZXN1bHQgPSBzb3J0XzEoZW50cmllcywgYmlhc1JpZ2h0KTsKCiAgICAgIGlmIChibCkgewogICAgICAgIHJlc3VsdC52cyA9IGxvZGFzaF8xJDEuZmxhdHRlbihbYmwsIHJlc3VsdC52cywgYnJdLCB0cnVlKTsKICAgICAgICBpZiAoZy5wcmVkZWNlc3NvcnMoYmwpLmxlbmd0aCkgewogICAgICAgICAgdmFyIGJsUHJlZCA9IGcubm9kZShnLnByZWRlY2Vzc29ycyhibClbMF0pLAogICAgICAgICAgICBiclByZWQgPSBnLm5vZGUoZy5wcmVkZWNlc3NvcnMoYnIpWzBdKTsKICAgICAgICAgIGlmICghbG9kYXNoXzEkMS5oYXMocmVzdWx0LCAiYmFyeWNlbnRlciIpKSB7CiAgICAgICAgICAgIHJlc3VsdC5iYXJ5Y2VudGVyID0gMDsKICAgICAgICAgICAgcmVzdWx0LndlaWdodCA9IDA7CiAgICAgICAgICB9CiAgICAgICAgICByZXN1bHQuYmFyeWNlbnRlciA9IChyZXN1bHQuYmFyeWNlbnRlciAqIHJlc3VsdC53ZWlnaHQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxQcmVkLm9yZGVyICsgYnJQcmVkLm9yZGVyKSAvIChyZXN1bHQud2VpZ2h0ICsgMik7CiAgICAgICAgICByZXN1bHQud2VpZ2h0ICs9IDI7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cGFuZFN1YmdyYXBocyhlbnRyaWVzLCBzdWJncmFwaHMpIHsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGVudHJpZXMsIGZ1bmN0aW9uKGVudHJ5KSB7CiAgICAgICAgZW50cnkudnMgPSBsb2Rhc2hfMSQxLmZsYXR0ZW4oZW50cnkudnMubWFwKGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIGlmIChzdWJncmFwaHNbdl0pIHsKICAgICAgICAgICAgcmV0dXJuIHN1YmdyYXBoc1t2XS52czsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiB2OwogICAgICAgIH0pLCB0cnVlKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gbWVyZ2VCYXJ5Y2VudGVycyh0YXJnZXQsIG90aGVyKSB7CiAgICAgIGlmICghbG9kYXNoXzEkMS5pc1VuZGVmaW5lZCh0YXJnZXQuYmFyeWNlbnRlcikpIHsKICAgICAgICB0YXJnZXQuYmFyeWNlbnRlciA9ICh0YXJnZXQuYmFyeWNlbnRlciAqIHRhcmdldC53ZWlnaHQgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyLmJhcnljZW50ZXIgKiBvdGhlci53ZWlnaHQpIC8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXJnZXQud2VpZ2h0ICsgb3RoZXIud2VpZ2h0KTsKICAgICAgICB0YXJnZXQud2VpZ2h0ICs9IG90aGVyLndlaWdodDsKICAgICAgfSBlbHNlIHsKICAgICAgICB0YXJnZXQuYmFyeWNlbnRlciA9IG90aGVyLmJhcnljZW50ZXI7CiAgICAgICAgdGFyZ2V0LndlaWdodCA9IG90aGVyLndlaWdodDsKICAgICAgfQogICAgfQoKICAgIHZhciBHcmFwaCQ0ID0gZ3JhcGhsaWJfMS5HcmFwaDsKCiAgICB2YXIgYnVpbGRMYXllckdyYXBoXzEgPSBidWlsZExheWVyR3JhcGg7CgogICAgLyoKICAgICAqIENvbnN0cnVjdHMgYSBncmFwaCB0aGF0IGNhbiBiZSB1c2VkIHRvIHNvcnQgYSBsYXllciBvZiBub2Rlcy4gVGhlIGdyYXBoIHdpbGwKICAgICAqIGNvbnRhaW4gYWxsIGJhc2UgYW5kIHN1YmdyYXBoIG5vZGVzIGZyb20gdGhlIHJlcXVlc3QgbGF5ZXIgaW4gdGhlaXIgb3JpZ2luYWwKICAgICAqIGhpZXJhcmNoeSBhbmQgYW55IGVkZ2VzIHRoYXQgYXJlIGluY2lkZW50IG9uIHRoZXNlIG5vZGVzIGFuZCBhcmUgb2YgdGhlIHR5cGUKICAgICAqIHJlcXVlc3RlZCBieSB0aGUgInJlbGF0aW9uc2hpcCIgcGFyYW1ldGVyLgogICAgICoKICAgICAqIE5vZGVzIGZyb20gdGhlIHJlcXVlc3RlZCByYW5rIHRoYXQgZG8gbm90IGhhdmUgcGFyZW50cyBhcmUgYXNzaWduZWQgYSByb290CiAgICAgKiBub2RlIGluIHRoZSBvdXRwdXQgZ3JhcGgsIHdoaWNoIGlzIHNldCBpbiB0aGUgcm9vdCBncmFwaCBhdHRyaWJ1dGUuIFRoaXMKICAgICAqIG1ha2VzIGl0IGVhc3kgdG8gd2FsayB0aGUgaGllcmFyY2h5IG9mIG1vdmFibGUgbm9kZXMgZHVyaW5nIG9yZGVyaW5nLgogICAgICoKICAgICAqIFByZS1jb25kaXRpb25zOgogICAgICoKICAgICAqICAgIDEuIElucHV0IGdyYXBoIGlzIGEgREFHCiAgICAgKiAgICAyLiBCYXNlIG5vZGVzIGluIHRoZSBpbnB1dCBncmFwaCBoYXZlIGEgcmFuayBhdHRyaWJ1dGUKICAgICAqICAgIDMuIFN1YmdyYXBoIG5vZGVzIGluIHRoZSBpbnB1dCBncmFwaCBoYXMgbWluUmFuayBhbmQgbWF4UmFuayBhdHRyaWJ1dGVzCiAgICAgKiAgICA0LiBFZGdlcyBoYXZlIGFuIGFzc2lnbmVkIHdlaWdodAogICAgICoKICAgICAqIFBvc3QtY29uZGl0aW9uczoKICAgICAqCiAgICAgKiAgICAxLiBPdXRwdXQgZ3JhcGggaGFzIGFsbCBub2RlcyBpbiB0aGUgbW92YWJsZSByYW5rIHdpdGggcHJlc2VydmVkCiAgICAgKiAgICAgICBoaWVyYXJjaHkuCiAgICAgKiAgICAyLiBSb290IG5vZGVzIGluIHRoZSBtb3ZhYmxlIGxheWVyIGFyZSBtYWRlIGNoaWxkcmVuIG9mIHRoZSBub2RlCiAgICAgKiAgICAgICBpbmRpY2F0ZWQgYnkgdGhlIHJvb3QgYXR0cmlidXRlIG9mIHRoZSBncmFwaC4KICAgICAqICAgIDMuIE5vbi1tb3ZhYmxlIG5vZGVzIGluY2lkZW50IG9uIG1vdmFibGUgbm9kZXMsIHNlbGVjdGVkIGJ5IHRoZQogICAgICogICAgICAgcmVsYXRpb25zaGlwIHBhcmFtZXRlciwgYXJlIGluY2x1ZGVkIGluIHRoZSBncmFwaCAod2l0aG91dCBoaWVyYXJjaHkpLgogICAgICogICAgNC4gRWRnZXMgaW5jaWRlbnQgb24gbW92YWJsZSBub2Rlcywgc2VsZWN0ZWQgYnkgdGhlIHJlbGF0aW9uc2hpcAogICAgICogICAgICAgcGFyYW1ldGVyLCBhcmUgYWRkZWQgdG8gdGhlIG91dHB1dCBncmFwaC4KICAgICAqICAgIDUuIFRoZSB3ZWlnaHRzIGZvciBjb3BpZWQgZWRnZXMgYXJlIGFnZ3JlZ2F0ZWQgYXMgbmVlZCwgc2luY2UgdGhlIG91dHB1dAogICAgICogICAgICAgZ3JhcGggaXMgbm90IGEgbXVsdGktZ3JhcGguCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkTGF5ZXJHcmFwaChnLCByYW5rLCByZWxhdGlvbnNoaXApIHsKICAgICAgdmFyIHJvb3QgPSBjcmVhdGVSb290Tm9kZShnKSwKICAgICAgICByZXN1bHQgPSBuZXcgR3JhcGgkNCh7IGNvbXBvdW5kOiB0cnVlIH0pLnNldEdyYXBoKHsgcm9vdDogcm9vdCB9KQogICAgICAgICAgLnNldERlZmF1bHROb2RlTGFiZWwoZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpOyB9KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KSwKICAgICAgICAgIHBhcmVudCA9IGcucGFyZW50KHYpOwoKICAgICAgICBpZiAobm9kZS5yYW5rID09PSByYW5rIHx8IG5vZGUubWluUmFuayA8PSByYW5rICYmIHJhbmsgPD0gbm9kZS5tYXhSYW5rKSB7CiAgICAgICAgICByZXN1bHQuc2V0Tm9kZSh2KTsKICAgICAgICAgIHJlc3VsdC5zZXRQYXJlbnQodiwgcGFyZW50IHx8IHJvb3QpOwoKICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB3ZSBoYXZlIG9ubHkgc2hvcnQgZWRnZXMhCiAgICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZ1tyZWxhdGlvbnNoaXBdKHYpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgICAgIHZhciB1ID0gZS52ID09PSB2ID8gZS53IDogZS52LAogICAgICAgICAgICAgIGVkZ2UgPSByZXN1bHQuZWRnZSh1LCB2KSwKICAgICAgICAgICAgICB3ZWlnaHQgPSAhbG9kYXNoXzEkMS5pc1VuZGVmaW5lZChlZGdlKSA/IGVkZ2Uud2VpZ2h0IDogMDsKICAgICAgICAgICAgcmVzdWx0LnNldEVkZ2UodSwgdiwgeyB3ZWlnaHQ6IGcuZWRnZShlKS53ZWlnaHQgKyB3ZWlnaHQgfSk7CiAgICAgICAgICB9KTsKCiAgICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMobm9kZSwgIm1pblJhbmsiKSkgewogICAgICAgICAgICByZXN1bHQuc2V0Tm9kZSh2LCB7CiAgICAgICAgICAgICAgYm9yZGVyTGVmdDogbm9kZS5ib3JkZXJMZWZ0W3JhbmtdLAogICAgICAgICAgICAgIGJvcmRlclJpZ2h0OiBub2RlLmJvcmRlclJpZ2h0W3JhbmtdCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CgogICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIGZ1bmN0aW9uIGNyZWF0ZVJvb3ROb2RlKGcpIHsKICAgICAgdmFyIHY7CiAgICAgIHdoaWxlIChnLmhhc05vZGUoKHYgPSBsb2Rhc2hfMSQxLnVuaXF1ZUlkKCJfcm9vdCIpKSkpOwogICAgICByZXR1cm4gdjsKICAgIH0KCiAgICB2YXIgYWRkU3ViZ3JhcGhDb25zdHJhaW50c18xID0gYWRkU3ViZ3JhcGhDb25zdHJhaW50czsKCiAgICBmdW5jdGlvbiBhZGRTdWJncmFwaENvbnN0cmFpbnRzKGcsIGNnLCB2cykgewogICAgICB2YXIgcHJldiA9IHt9LAogICAgICAgIHJvb3RQcmV2OwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKHZzLCBmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIGNoaWxkID0gZy5wYXJlbnQodiksCiAgICAgICAgICBwYXJlbnQsCiAgICAgICAgICBwcmV2Q2hpbGQ7CiAgICAgICAgd2hpbGUgKGNoaWxkKSB7CiAgICAgICAgICBwYXJlbnQgPSBnLnBhcmVudChjaGlsZCk7CiAgICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgIHByZXZDaGlsZCA9IHByZXZbcGFyZW50XTsKICAgICAgICAgICAgcHJldltwYXJlbnRdID0gY2hpbGQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBwcmV2Q2hpbGQgPSByb290UHJldjsKICAgICAgICAgICAgcm9vdFByZXYgPSBjaGlsZDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChwcmV2Q2hpbGQgJiYgcHJldkNoaWxkICE9PSBjaGlsZCkgewogICAgICAgICAgICBjZy5zZXRFZGdlKHByZXZDaGlsZCwgY2hpbGQpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBjaGlsZCA9IHBhcmVudDsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgLyoKICAgICAgZnVuY3Rpb24gZGZzKHYpIHsKICAgICAgICB2YXIgY2hpbGRyZW4gPSB2ID8gZy5jaGlsZHJlbih2KSA6IGcuY2hpbGRyZW4oKTsKICAgICAgICBpZiAoY2hpbGRyZW4ubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLAogICAgICAgICAgICAgIHN1YmdyYXBocyA9IFtdOwogICAgICAgICAgXy5lYWNoKGNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkgewogICAgICAgICAgICB2YXIgY2hpbGRNaW4gPSBkZnMoY2hpbGQpOwogICAgICAgICAgICBpZiAoZy5jaGlsZHJlbihjaGlsZCkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgc3ViZ3JhcGhzLnB1c2goeyB2OiBjaGlsZCwgb3JkZXI6IGNoaWxkTWluIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgY2hpbGRNaW4pOwogICAgICAgICAgfSk7CiAgICAgICAgICBfLnJlZHVjZShfLnNvcnRCeShzdWJncmFwaHMsICJvcmRlciIpLCBmdW5jdGlvbihwcmV2LCBjdXJyKSB7CiAgICAgICAgICAgIGNnLnNldEVkZ2UocHJldi52LCBjdXJyLnYpOwogICAgICAgICAgICByZXR1cm4gY3VycjsKICAgICAgICAgIH0pOwogICAgICAgICAgcmV0dXJuIG1pbjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGcubm9kZSh2KS5vcmRlcjsKICAgICAgfQogICAgICBkZnModW5kZWZpbmVkKTsKICAgICAgKi8KICAgIH0KCiAgICB2YXIgR3JhcGgkNSA9IGdyYXBobGliXzEuR3JhcGg7CgoKICAgIHZhciBvcmRlcl8xID0gb3JkZXI7CgogICAgLyoKICAgICAqIEFwcGxpZXMgaGV1cmlzdGljcyB0byBtaW5pbWl6ZSBlZGdlIGNyb3NzaW5ncyBpbiB0aGUgZ3JhcGggYW5kIHNldHMgdGhlIGJlc3QKICAgICAqIG9yZGVyIHNvbHV0aW9uIGFzIGFuIG9yZGVyIGF0dHJpYnV0ZSBvbiBlYWNoIG5vZGUuCiAgICAgKgogICAgICogUHJlLWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gR3JhcGggbXVzdCBiZSBEQUcKICAgICAqICAgIDIuIEdyYXBoIG5vZGVzIG11c3QgYmUgb2JqZWN0cyB3aXRoIGEgInJhbmsiIGF0dHJpYnV0ZQogICAgICogICAgMy4gR3JhcGggZWRnZXMgbXVzdCBoYXZlIHRoZSAid2VpZ2h0IiBhdHRyaWJ1dGUKICAgICAqCiAgICAgKiBQb3N0LWNvbmRpdGlvbnM6CiAgICAgKgogICAgICogICAgMS4gR3JhcGggbm9kZXMgd2lsbCBoYXZlIGFuICJvcmRlciIgYXR0cmlidXRlIGJhc2VkIG9uIHRoZSByZXN1bHRzIG9mIHRoZQogICAgICogICAgICAgYWxnb3JpdGhtLgogICAgICovCiAgICBmdW5jdGlvbiBvcmRlcihnKSB7CiAgICAgIHZhciBtYXhSYW5rID0gdXRpbC5tYXhSYW5rKGcpLAogICAgICAgIGRvd25MYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgbG9kYXNoXzEkMS5yYW5nZSgxLCBtYXhSYW5rICsgMSksICJpbkVkZ2VzIiksCiAgICAgICAgdXBMYXllckdyYXBocyA9IGJ1aWxkTGF5ZXJHcmFwaHMoZywgbG9kYXNoXzEkMS5yYW5nZShtYXhSYW5rIC0gMSwgLTEsIC0xKSwgIm91dEVkZ2VzIik7CgogICAgICB2YXIgbGF5ZXJpbmcgPSBpbml0T3JkZXJfMShnKTsKICAgICAgYXNzaWduT3JkZXIoZywgbGF5ZXJpbmcpOwoKICAgICAgdmFyIGJlc3RDQyA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwKICAgICAgICBiZXN0OwoKICAgICAgZm9yICh2YXIgaSA9IDAsIGxhc3RCZXN0ID0gMDsgbGFzdEJlc3QgPCA0OyArK2ksICsrbGFzdEJlc3QpIHsKICAgICAgICBzd2VlcExheWVyR3JhcGhzKGkgJSAyID8gZG93bkxheWVyR3JhcGhzIDogdXBMYXllckdyYXBocywgaSAlIDQgPj0gMik7CgogICAgICAgIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpOwogICAgICAgIHZhciBjYyA9IGNyb3NzQ291bnRfMShnLCBsYXllcmluZyk7CiAgICAgICAgaWYgKGNjIDwgYmVzdENDKSB7CiAgICAgICAgICBsYXN0QmVzdCA9IDA7CiAgICAgICAgICBiZXN0ID0gbG9kYXNoXzEkMS5jbG9uZURlZXAobGF5ZXJpbmcpOwogICAgICAgICAgYmVzdENDID0gY2M7CiAgICAgICAgfQogICAgICB9CgogICAgICBhc3NpZ25PcmRlcihnLCBiZXN0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBidWlsZExheWVyR3JhcGhzKGcsIHJhbmtzLCByZWxhdGlvbnNoaXApIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xJDEubWFwKHJhbmtzLCBmdW5jdGlvbihyYW5rKSB7CiAgICAgICAgcmV0dXJuIGJ1aWxkTGF5ZXJHcmFwaF8xKGcsIHJhbmssIHJlbGF0aW9uc2hpcCk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHN3ZWVwTGF5ZXJHcmFwaHMobGF5ZXJHcmFwaHMsIGJpYXNSaWdodCkgewogICAgICB2YXIgY2cgPSBuZXcgR3JhcGgkNSgpOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2gobGF5ZXJHcmFwaHMsIGZ1bmN0aW9uKGxnKSB7CiAgICAgICAgdmFyIHJvb3QgPSBsZy5ncmFwaCgpLnJvb3Q7CiAgICAgICAgdmFyIHNvcnRlZCA9IHNvcnRTdWJncmFwaF8xKGxnLCByb290LCBjZywgYmlhc1JpZ2h0KTsKICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2goc29ydGVkLnZzLCBmdW5jdGlvbih2LCBpKSB7CiAgICAgICAgICBsZy5ub2RlKHYpLm9yZGVyID0gaTsKICAgICAgICB9KTsKICAgICAgICBhZGRTdWJncmFwaENvbnN0cmFpbnRzXzEobGcsIGNnLCBzb3J0ZWQudnMpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc3NpZ25PcmRlcihnLCBsYXllcmluZykgewogICAgICBsb2Rhc2hfMSQxLmZvckVhY2gobGF5ZXJpbmcsIGZ1bmN0aW9uKGxheWVyKSB7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2LCBpKSB7CiAgICAgICAgICBnLm5vZGUodikub3JkZXIgPSBpOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgR3JhcGgkNiA9IGdyYXBobGliXzEuR3JhcGg7CgoKICAgIC8qCiAgICAgKiBUaGlzIG1vZHVsZSBwcm92aWRlcyBjb29yZGluYXRlIGFzc2lnbm1lbnQgYmFzZWQgb24gQnJhbmRlcyBhbmQgS8O2cGYsICJGYXN0CiAgICAgKiBhbmQgU2ltcGxlIEhvcml6b250YWwgQ29vcmRpbmF0ZSBBc3NpZ25tZW50LiIKICAgICAqLwoKICAgIHZhciBiayA9IHsKICAgICAgcG9zaXRpb25YOiBwb3NpdGlvblgsCiAgICAgIGZpbmRUeXBlMUNvbmZsaWN0czogZmluZFR5cGUxQ29uZmxpY3RzLAogICAgICBmaW5kVHlwZTJDb25mbGljdHM6IGZpbmRUeXBlMkNvbmZsaWN0cywKICAgICAgYWRkQ29uZmxpY3Q6IGFkZENvbmZsaWN0LAogICAgICBoYXNDb25mbGljdDogaGFzQ29uZmxpY3QsCiAgICAgIHZlcnRpY2FsQWxpZ25tZW50OiB2ZXJ0aWNhbEFsaWdubWVudCwKICAgICAgaG9yaXpvbnRhbENvbXBhY3Rpb246IGhvcml6b250YWxDb21wYWN0aW9uLAogICAgICBhbGlnbkNvb3JkaW5hdGVzOiBhbGlnbkNvb3JkaW5hdGVzLAogICAgICBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudDogZmluZFNtYWxsZXN0V2lkdGhBbGlnbm1lbnQsCiAgICAgIGJhbGFuY2U6IGJhbGFuY2UKICAgIH07CgogICAgLyoKICAgICAqIE1hcmtzIGFsbCBlZGdlcyBpbiB0aGUgZ3JhcGggd2l0aCBhIHR5cGUtMSBjb25mbGljdCB3aXRoIHRoZSAidHlwZTFDb25mbGljdCIKICAgICAqIHByb3BlcnR5LiBBIHR5cGUtMSBjb25mbGljdCBpcyBvbmUgd2hlcmUgYSBub24taW5uZXIgc2VnbWVudCBjcm9zc2VzIGFuCiAgICAgKiBpbm5lciBzZWdtZW50LiBBbiBpbm5lciBzZWdtZW50IGlzIGFuIGVkZ2Ugd2l0aCBib3RoIGluY2lkZW50IG5vZGVzIG1hcmtlZAogICAgICogd2l0aCB0aGUgImR1bW15IiBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBUaGlzIGFsZ29yaXRobSBzY2FucyBsYXllciBieSBsYXllciwgc3RhcnRpbmcgd2l0aCB0aGUgc2Vjb25kLCBmb3IgdHlwZS0xCiAgICAgKiBjb25mbGljdHMgYmV0d2VlbiB0aGUgY3VycmVudCBsYXllciBhbmQgdGhlIHByZXZpb3VzIGxheWVyLiBGb3IgZWFjaCBsYXllcgogICAgICogaXQgc2NhbnMgdGhlIG5vZGVzIGZyb20gbGVmdCB0byByaWdodCB1bnRpbCBpdCByZWFjaGVzIG9uZSB0aGF0IGlzIGluY2lkZW50CiAgICAgKiBvbiBhbiBpbm5lciBzZWdtZW50LiBJdCB0aGVuIHNjYW5zIHByZWRlY2Vzc29ycyB0byBkZXRlcm1pbmUgaWYgdGhleSBoYXZlCiAgICAgKiBlZGdlcyB0aGF0IGNyb3NzIHRoYXQgaW5uZXIgc2VnbWVudC4gQXQgdGhlIGVuZCBhIGZpbmFsIHNjYW4gaXMgZG9uZSBmb3IgYWxsCiAgICAgKiBub2RlcyBvbiB0aGUgY3VycmVudCByYW5rIHRvIHNlZSBpZiB0aGV5IGNyb3NzIHRoZSBsYXN0IHZpc2l0ZWQgaW5uZXIKICAgICAqIHNlZ21lbnQuCiAgICAgKgogICAgICogVGhpcyBhbGdvcml0aG0gKHNhZmVseSkgYXNzdW1lcyB0aGF0IGEgZHVtbXkgbm9kZSB3aWxsIG9ubHkgYmUgaW5jaWRlbnQgb24gYQogICAgICogc2luZ2xlIG5vZGUgaW4gdGhlIGxheWVycyBiZWluZyBzY2FubmVkLgogICAgICovCiAgICBmdW5jdGlvbiBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpIHsKICAgICAgdmFyIGNvbmZsaWN0cyA9IHt9OwoKICAgICAgZnVuY3Rpb24gdmlzaXRMYXllcihwcmV2TGF5ZXIsIGxheWVyKSB7CiAgICAgICAgdmFyCiAgICAgICAgICAvLyBsYXN0IHZpc2l0ZWQgbm9kZSBpbiB0aGUgcHJldmlvdXMgbGF5ZXIgdGhhdCBpcyBpbmNpZGVudCBvbiBhbiBpbm5lcgogICAgICAgICAgLy8gc2VnbWVudC4KICAgICAgICAgIGswID0gMCwKICAgICAgICAgIC8vIFRyYWNrcyB0aGUgbGFzdCBub2RlIGluIHRoaXMgbGF5ZXIgc2Nhbm5lZCBmb3IgY3Jvc3NpbmdzIHdpdGggYSB0eXBlLTEKICAgICAgICAgIC8vIHNlZ21lbnQuCiAgICAgICAgICBzY2FuUG9zID0gMCwKICAgICAgICAgIHByZXZMYXllckxlbmd0aCA9IHByZXZMYXllci5sZW5ndGgsCiAgICAgICAgICBsYXN0Tm9kZSA9IGxvZGFzaF8xJDEubGFzdChsYXllcik7CgogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkgewogICAgICAgICAgdmFyIHcgPSBmaW5kT3RoZXJJbm5lclNlZ21lbnROb2RlKGcsIHYpLAogICAgICAgICAgICBrMSA9IHcgPyBnLm5vZGUodykub3JkZXIgOiBwcmV2TGF5ZXJMZW5ndGg7CgogICAgICAgICAgaWYgKHcgfHwgdiA9PT0gbGFzdE5vZGUpIHsKICAgICAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVyLnNsaWNlKHNjYW5Qb3MsIGkgKzEpLCBmdW5jdGlvbihzY2FuTm9kZSkgewogICAgICAgICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLnByZWRlY2Vzc29ycyhzY2FuTm9kZSksIGZ1bmN0aW9uKHUpIHsKICAgICAgICAgICAgICAgIHZhciB1TGFiZWwgPSBnLm5vZGUodSksCiAgICAgICAgICAgICAgICAgIHVQb3MgPSB1TGFiZWwub3JkZXI7CiAgICAgICAgICAgICAgICBpZiAoKHVQb3MgPCBrMCB8fCBrMSA8IHVQb3MpICYmCiAgICAgICAgICAgICAgICAgICAgISh1TGFiZWwuZHVtbXkgJiYgZy5ub2RlKHNjYW5Ob2RlKS5kdW1teSkpIHsKICAgICAgICAgICAgICAgICAgYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB1LCBzY2FuTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzY2FuUG9zID0gaSArIDE7CiAgICAgICAgICAgIGswID0gazE7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBsYXllcjsKICAgICAgfQoKICAgICAgbG9kYXNoXzEkMS5yZWR1Y2UobGF5ZXJpbmcsIHZpc2l0TGF5ZXIpOwogICAgICByZXR1cm4gY29uZmxpY3RzOwogICAgfQoKICAgIGZ1bmN0aW9uIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykgewogICAgICB2YXIgY29uZmxpY3RzID0ge307CgogICAgICBmdW5jdGlvbiBzY2FuKHNvdXRoLCBzb3V0aFBvcywgc291dGhFbmQsIHByZXZOb3J0aEJvcmRlciwgbmV4dE5vcnRoQm9yZGVyKSB7CiAgICAgICAgdmFyIHY7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxvZGFzaF8xJDEucmFuZ2Uoc291dGhQb3MsIHNvdXRoRW5kKSwgZnVuY3Rpb24oaSkgewogICAgICAgICAgdiA9IHNvdXRoW2ldOwogICAgICAgICAgaWYgKGcubm9kZSh2KS5kdW1teSkgewogICAgICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5wcmVkZWNlc3NvcnModiksIGZ1bmN0aW9uKHUpIHsKICAgICAgICAgICAgICB2YXIgdU5vZGUgPSBnLm5vZGUodSk7CiAgICAgICAgICAgICAgaWYgKHVOb2RlLmR1bW15ICYmCiAgICAgICAgICAgICAgICAgICh1Tm9kZS5vcmRlciA8IHByZXZOb3J0aEJvcmRlciB8fCB1Tm9kZS5vcmRlciA+IG5leHROb3J0aEJvcmRlcikpIHsKICAgICAgICAgICAgICAgIGFkZENvbmZsaWN0KGNvbmZsaWN0cywgdSwgdik7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKCiAgICAgIGZ1bmN0aW9uIHZpc2l0TGF5ZXIobm9ydGgsIHNvdXRoKSB7CiAgICAgICAgdmFyIHByZXZOb3J0aFBvcyA9IC0xLAogICAgICAgICAgbmV4dE5vcnRoUG9zLAogICAgICAgICAgc291dGhQb3MgPSAwOwoKICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2goc291dGgsIGZ1bmN0aW9uKHYsIHNvdXRoTG9va2FoZWFkKSB7CiAgICAgICAgICBpZiAoZy5ub2RlKHYpLmR1bW15ID09PSAiYm9yZGVyIikgewogICAgICAgICAgICB2YXIgcHJlZGVjZXNzb3JzID0gZy5wcmVkZWNlc3NvcnModik7CiAgICAgICAgICAgIGlmIChwcmVkZWNlc3NvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgbmV4dE5vcnRoUG9zID0gZy5ub2RlKHByZWRlY2Vzc29yc1swXSkub3JkZXI7CiAgICAgICAgICAgICAgc2Nhbihzb3V0aCwgc291dGhQb3MsIHNvdXRoTG9va2FoZWFkLCBwcmV2Tm9ydGhQb3MsIG5leHROb3J0aFBvcyk7CiAgICAgICAgICAgICAgc291dGhQb3MgPSBzb3V0aExvb2thaGVhZDsKICAgICAgICAgICAgICBwcmV2Tm9ydGhQb3MgPSBuZXh0Tm9ydGhQb3M7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIHNjYW4oc291dGgsIHNvdXRoUG9zLCBzb3V0aC5sZW5ndGgsIG5leHROb3J0aFBvcywgbm9ydGgubGVuZ3RoKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIHNvdXRoOwogICAgICB9CgogICAgICBsb2Rhc2hfMSQxLnJlZHVjZShsYXllcmluZywgdmlzaXRMYXllcik7CiAgICAgIHJldHVybiBjb25mbGljdHM7CiAgICB9CgogICAgZnVuY3Rpb24gZmluZE90aGVySW5uZXJTZWdtZW50Tm9kZShnLCB2KSB7CiAgICAgIGlmIChnLm5vZGUodikuZHVtbXkpIHsKICAgICAgICByZXR1cm4gbG9kYXNoXzEkMS5maW5kKGcucHJlZGVjZXNzb3JzKHYpLCBmdW5jdGlvbih1KSB7CiAgICAgICAgICByZXR1cm4gZy5ub2RlKHUpLmR1bW15OwogICAgICAgIH0pOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYWRkQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7CiAgICAgIGlmICh2ID4gdykgewogICAgICAgIHZhciB0bXAgPSB2OwogICAgICAgIHYgPSB3OwogICAgICAgIHcgPSB0bXA7CiAgICAgIH0KCiAgICAgIHZhciBjb25mbGljdHNWID0gY29uZmxpY3RzW3ZdOwogICAgICBpZiAoIWNvbmZsaWN0c1YpIHsKICAgICAgICBjb25mbGljdHNbdl0gPSBjb25mbGljdHNWID0ge307CiAgICAgIH0KICAgICAgY29uZmxpY3RzVlt3XSA9IHRydWU7CiAgICB9CgogICAgZnVuY3Rpb24gaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSB7CiAgICAgIGlmICh2ID4gdykgewogICAgICAgIHZhciB0bXAgPSB2OwogICAgICAgIHYgPSB3OwogICAgICAgIHcgPSB0bXA7CiAgICAgIH0KICAgICAgcmV0dXJuIGxvZGFzaF8xJDEuaGFzKGNvbmZsaWN0c1t2XSwgdyk7CiAgICB9CgogICAgLyoKICAgICAqIFRyeSB0byBhbGlnbiBub2RlcyBpbnRvIHZlcnRpY2FsICJibG9ja3MiIHdoZXJlIHBvc3NpYmxlLiBUaGlzIGFsZ29yaXRobQogICAgICogYXR0ZW1wdHMgdG8gYWxpZ24gYSBub2RlIHdpdGggb25lIG9mIGl0cyBtZWRpYW4gbmVpZ2hib3JzLiBJZiB0aGUgZWRnZQogICAgICogY29ubmVjdGluZyBhIG5laWdoYm9yIGlzIGEgdHlwZS0xIGNvbmZsaWN0IHRoZW4gd2UgaWdub3JlIHRoYXQgcG9zc2liaWxpdHkuCiAgICAgKiBJZiBhIHByZXZpb3VzIG5vZGUgaGFzIGFscmVhZHkgZm9ybWVkIGEgYmxvY2sgd2l0aCBhIG5vZGUgYWZ0ZXIgdGhlIG5vZGUKICAgICAqIHdlJ3JlIHRyeWluZyB0byBmb3JtIGEgYmxvY2sgd2l0aCwgd2UgYWxzbyBpZ25vcmUgdGhhdCBwb3NzaWJpbGl0eSAtIG91cgogICAgICogYmxvY2tzIHdvdWxkIGJlIHNwbGl0IGluIHRoYXQgc2NlbmFyaW8uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHZlcnRpY2FsQWxpZ25tZW50KGcsIGxheWVyaW5nLCBjb25mbGljdHMsIG5laWdoYm9yRm4pIHsKICAgICAgdmFyIHJvb3QgPSB7fSwKICAgICAgICBhbGlnbiA9IHt9LAogICAgICAgIHBvcyA9IHt9OwoKICAgICAgLy8gV2UgY2FjaGUgdGhlIHBvc2l0aW9uIGhlcmUgYmFzZWQgb24gdGhlIGxheWVyaW5nIGJlY2F1c2UgdGhlIGdyYXBoIGFuZAogICAgICAvLyBsYXllcmluZyBtYXkgYmUgb3V0IG9mIHN5bmMuIFRoZSBsYXllcmluZyBtYXRyaXggaXMgbWFuaXB1bGF0ZWQgdG8KICAgICAgLy8gZ2VuZXJhdGUgZGlmZmVyZW50IGV4dHJlbWUgYWxpZ25tZW50cy4KICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikgewogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgb3JkZXIpIHsKICAgICAgICAgIHJvb3Rbdl0gPSB2OwogICAgICAgICAgYWxpZ25bdl0gPSB2OwogICAgICAgICAgcG9zW3ZdID0gb3JkZXI7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikgewogICAgICAgIHZhciBwcmV2SWR4ID0gLTE7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVyLCBmdW5jdGlvbih2KSB7CiAgICAgICAgICB2YXIgd3MgPSBuZWlnaGJvckZuKHYpOwogICAgICAgICAgaWYgKHdzLmxlbmd0aCkgewogICAgICAgICAgICB3cyA9IGxvZGFzaF8xJDEuc29ydEJ5KHdzLCBmdW5jdGlvbih3KSB7IHJldHVybiBwb3Nbd107IH0pOwogICAgICAgICAgICB2YXIgbXAgPSAod3MubGVuZ3RoIC0gMSkgLyAyOwogICAgICAgICAgICBmb3IgKHZhciBpID0gTWF0aC5mbG9vcihtcCksIGlsID0gTWF0aC5jZWlsKG1wKTsgaSA8PSBpbDsgKytpKSB7CiAgICAgICAgICAgICAgdmFyIHcgPSB3c1tpXTsKICAgICAgICAgICAgICBpZiAoYWxpZ25bdl0gPT09IHYgJiYKICAgICAgICAgICAgICAgICAgcHJldklkeCA8IHBvc1t3XSAmJgogICAgICAgICAgICAgICAgICAhaGFzQ29uZmxpY3QoY29uZmxpY3RzLCB2LCB3KSkgewogICAgICAgICAgICAgICAgYWxpZ25bd10gPSB2OwogICAgICAgICAgICAgICAgYWxpZ25bdl0gPSByb290W3ZdID0gcm9vdFt3XTsKICAgICAgICAgICAgICAgIHByZXZJZHggPSBwb3Nbd107CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIHsgcm9vdDogcm9vdCwgYWxpZ246IGFsaWduIH07CiAgICB9CgogICAgZnVuY3Rpb24gaG9yaXpvbnRhbENvbXBhY3Rpb24oZywgbGF5ZXJpbmcsIHJvb3QsIGFsaWduLCByZXZlcnNlU2VwKSB7CiAgICAgIC8vIFRoaXMgcG9ydGlvbiBvZiB0aGUgYWxnb3JpdGhtIGRpZmZlcnMgZnJvbSBCSyBkdWUgdG8gYSBudW1iZXIgb2YgcHJvYmxlbXMuCiAgICAgIC8vIEluc3RlYWQgb2YgdGhlaXIgYWxnb3JpdGhtIHdlIGNvbnN0cnVjdCBhIG5ldyBibG9jayBncmFwaCBhbmQgZG8gdHdvCiAgICAgIC8vIHN3ZWVwcy4gVGhlIGZpcnN0IHN3ZWVwIHBsYWNlcyBibG9ja3Mgd2l0aCB0aGUgc21hbGxlc3QgcG9zc2libGUKICAgICAgLy8gY29vcmRpbmF0ZXMuIFRoZSBzZWNvbmQgc3dlZXAgcmVtb3ZlcyB1bnVzZWQgc3BhY2UgYnkgbW92aW5nIGJsb2NrcyB0byB0aGUKICAgICAgLy8gZ3JlYXRlc3QgY29vcmRpbmF0ZXMgd2l0aG91dCB2aW9sYXRpbmcgc2VwYXJhdGlvbi4KICAgICAgdmFyIHhzID0ge30sCiAgICAgICAgYmxvY2tHID0gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSwKICAgICAgICBib3JkZXJUeXBlID0gcmV2ZXJzZVNlcCA/ICJib3JkZXJMZWZ0IiA6ICJib3JkZXJSaWdodCI7CgogICAgICBmdW5jdGlvbiBpdGVyYXRlKHNldFhzRnVuYywgbmV4dE5vZGVzRnVuYykgewogICAgICAgIHZhciBzdGFjayA9IGJsb2NrRy5ub2RlcygpOwogICAgICAgIHZhciBlbGVtID0gc3RhY2sucG9wKCk7CiAgICAgICAgdmFyIHZpc2l0ZWQgPSB7fTsKICAgICAgICB3aGlsZSAoZWxlbSkgewogICAgICAgICAgaWYgKHZpc2l0ZWRbZWxlbV0pIHsKICAgICAgICAgICAgc2V0WHNGdW5jKGVsZW0pOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmlzaXRlZFtlbGVtXSA9IHRydWU7CiAgICAgICAgICAgIHN0YWNrLnB1c2goZWxlbSk7CiAgICAgICAgICAgIHN0YWNrID0gc3RhY2suY29uY2F0KG5leHROb2Rlc0Z1bmMoZWxlbSkpOwogICAgICAgICAgfQoKICAgICAgICAgIGVsZW0gPSBzdGFjay5wb3AoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8vIEZpcnN0IHBhc3MsIGFzc2lnbiBzbWFsbGVzdCBjb29yZGluYXRlcwogICAgICBmdW5jdGlvbiBwYXNzMShlbGVtKSB7CiAgICAgICAgeHNbZWxlbV0gPSBibG9ja0cuaW5FZGdlcyhlbGVtKS5yZWR1Y2UoZnVuY3Rpb24oYWNjLCBlKSB7CiAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoYWNjLCB4c1tlLnZdICsgYmxvY2tHLmVkZ2UoZSkpOwogICAgICAgIH0sIDApOwogICAgICB9CgogICAgICAvLyBTZWNvbmQgcGFzcywgYXNzaWduIGdyZWF0ZXN0IGNvb3JkaW5hdGVzCiAgICAgIGZ1bmN0aW9uIHBhc3MyKGVsZW0pIHsKICAgICAgICB2YXIgbWluID0gYmxvY2tHLm91dEVkZ2VzKGVsZW0pLnJlZHVjZShmdW5jdGlvbihhY2MsIGUpIHsKICAgICAgICAgIHJldHVybiBNYXRoLm1pbihhY2MsIHhzW2Uud10gLSBibG9ja0cuZWRnZShlKSk7CiAgICAgICAgfSwgTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKTsKCiAgICAgICAgdmFyIG5vZGUgPSBnLm5vZGUoZWxlbSk7CiAgICAgICAgaWYgKG1pbiAhPT0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZICYmIG5vZGUuYm9yZGVyVHlwZSAhPT0gYm9yZGVyVHlwZSkgewogICAgICAgICAgeHNbZWxlbV0gPSBNYXRoLm1heCh4c1tlbGVtXSwgbWluKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGl0ZXJhdGUocGFzczEsIGJsb2NrRy5wcmVkZWNlc3NvcnMuYmluZChibG9ja0cpKTsKICAgICAgaXRlcmF0ZShwYXNzMiwgYmxvY2tHLnN1Y2Nlc3NvcnMuYmluZChibG9ja0cpKTsKCiAgICAgIC8vIEFzc2lnbiB4IGNvb3JkaW5hdGVzIHRvIGFsbCBub2RlcwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goYWxpZ24sIGZ1bmN0aW9uKHYpIHsKICAgICAgICB4c1t2XSA9IHhzW3Jvb3Rbdl1dOwogICAgICB9KTsKCiAgICAgIHJldHVybiB4czsKICAgIH0KCgogICAgZnVuY3Rpb24gYnVpbGRCbG9ja0dyYXBoKGcsIGxheWVyaW5nLCByb290LCByZXZlcnNlU2VwKSB7CiAgICAgIHZhciBibG9ja0dyYXBoID0gbmV3IEdyYXBoJDYoKSwKICAgICAgICBncmFwaExhYmVsID0gZy5ncmFwaCgpLAogICAgICAgIHNlcEZuID0gc2VwKGdyYXBoTGFiZWwubm9kZXNlcCwgZ3JhcGhMYWJlbC5lZGdlc2VwLCByZXZlcnNlU2VwKTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllcmluZywgZnVuY3Rpb24obGF5ZXIpIHsKICAgICAgICB2YXIgdTsKICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2gobGF5ZXIsIGZ1bmN0aW9uKHYpIHsKICAgICAgICAgIHZhciB2Um9vdCA9IHJvb3Rbdl07CiAgICAgICAgICBibG9ja0dyYXBoLnNldE5vZGUodlJvb3QpOwogICAgICAgICAgaWYgKHUpIHsKICAgICAgICAgICAgdmFyIHVSb290ID0gcm9vdFt1XSwKICAgICAgICAgICAgICBwcmV2TWF4ID0gYmxvY2tHcmFwaC5lZGdlKHVSb290LCB2Um9vdCk7CiAgICAgICAgICAgIGJsb2NrR3JhcGguc2V0RWRnZSh1Um9vdCwgdlJvb3QsIE1hdGgubWF4KHNlcEZuKGcsIHYsIHUpLCBwcmV2TWF4IHx8IDApKTsKICAgICAgICAgIH0KICAgICAgICAgIHUgPSB2OwogICAgICAgIH0pOwogICAgICB9KTsKCiAgICAgIHJldHVybiBibG9ja0dyYXBoOwogICAgfQoKICAgIC8qCiAgICAgKiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgdGhhdCBoYXMgdGhlIHNtYWxsZXN0IHdpZHRoIG9mIHRoZSBnaXZlbiBhbGlnbm1lbnRzLgogICAgICovCiAgICBmdW5jdGlvbiBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xJDEubWluQnkobG9kYXNoXzEkMS52YWx1ZXMoeHNzKSwgZnVuY3Rpb24gKHhzKSB7CiAgICAgICAgdmFyIG1heCA9IE51bWJlci5ORUdBVElWRV9JTkZJTklUWTsKICAgICAgICB2YXIgbWluID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwoKICAgICAgICBsb2Rhc2hfMSQxLmZvckluKHhzLCBmdW5jdGlvbiAoeCwgdikgewogICAgICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoKGcsIHYpIC8gMjsKCiAgICAgICAgICBtYXggPSBNYXRoLm1heCh4ICsgaGFsZldpZHRoLCBtYXgpOwogICAgICAgICAgbWluID0gTWF0aC5taW4oeCAtIGhhbGZXaWR0aCwgbWluKTsKICAgICAgICB9KTsKCiAgICAgICAgcmV0dXJuIG1heCAtIG1pbjsKICAgICAgfSk7CiAgICB9CgogICAgLyoKICAgICAqIEFsaWduIHRoZSBjb29yZGluYXRlcyBvZiBlYWNoIG9mIHRoZSBsYXlvdXQgYWxpZ25tZW50cyBzdWNoIHRoYXQKICAgICAqIGxlZnQtYmlhc2VkIGFsaWdubWVudHMgaGF2ZSB0aGVpciBtaW5pbXVtIGNvb3JkaW5hdGUgYXQgdGhlIHNhbWUgcG9pbnQgYXMKICAgICAqIHRoZSBtaW5pbXVtIGNvb3JkaW5hdGUgb2YgdGhlIHNtYWxsZXN0IHdpZHRoIGFsaWdubWVudCBhbmQgcmlnaHQtYmlhc2VkCiAgICAgKiBhbGlnbm1lbnRzIGhhdmUgdGhlaXIgbWF4aW11bSBjb29yZGluYXRlIGF0IHRoZSBzYW1lIHBvaW50IGFzIHRoZSBtYXhpbXVtCiAgICAgKiBjb29yZGluYXRlIG9mIHRoZSBzbWFsbGVzdCB3aWR0aCBhbGlnbm1lbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFsaWduQ29vcmRpbmF0ZXMoeHNzLCBhbGlnblRvKSB7CiAgICAgIHZhciBhbGlnblRvVmFscyA9IGxvZGFzaF8xJDEudmFsdWVzKGFsaWduVG8pLAogICAgICAgIGFsaWduVG9NaW4gPSBsb2Rhc2hfMSQxLm1pbihhbGlnblRvVmFscyksCiAgICAgICAgYWxpZ25Ub01heCA9IGxvZGFzaF8xJDEubWF4KGFsaWduVG9WYWxzKTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChbInUiLCAiZCJdLCBmdW5jdGlvbih2ZXJ0KSB7CiAgICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKFsibCIsICJyIl0sIGZ1bmN0aW9uKGhvcml6KSB7CiAgICAgICAgICB2YXIgYWxpZ25tZW50ID0gdmVydCArIGhvcml6LAogICAgICAgICAgICB4cyA9IHhzc1thbGlnbm1lbnRdLAogICAgICAgICAgICBkZWx0YTsKICAgICAgICAgIGlmICh4cyA9PT0gYWxpZ25UbykgcmV0dXJuOwoKICAgICAgICAgIHZhciB4c1ZhbHMgPSBsb2Rhc2hfMSQxLnZhbHVlcyh4cyk7CiAgICAgICAgICBkZWx0YSA9IGhvcml6ID09PSAibCIgPyBhbGlnblRvTWluIC0gbG9kYXNoXzEkMS5taW4oeHNWYWxzKSA6IGFsaWduVG9NYXggLSBsb2Rhc2hfMSQxLm1heCh4c1ZhbHMpOwoKICAgICAgICAgIGlmIChkZWx0YSkgewogICAgICAgICAgICB4c3NbYWxpZ25tZW50XSA9IGxvZGFzaF8xJDEubWFwVmFsdWVzKHhzLCBmdW5jdGlvbih4KSB7IHJldHVybiB4ICsgZGVsdGE7IH0pOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBiYWxhbmNlKHhzcywgYWxpZ24pIHsKICAgICAgcmV0dXJuIGxvZGFzaF8xJDEubWFwVmFsdWVzKHhzcy51bCwgZnVuY3Rpb24oaWdub3JlLCB2KSB7CiAgICAgICAgaWYgKGFsaWduKSB7CiAgICAgICAgICByZXR1cm4geHNzW2FsaWduLnRvTG93ZXJDYXNlKCldW3ZdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB2YXIgeHMgPSBsb2Rhc2hfMSQxLnNvcnRCeShsb2Rhc2hfMSQxLm1hcCh4c3MsIHYpKTsKICAgICAgICAgIHJldHVybiAoeHNbMV0gKyB4c1syXSkgLyAyOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9zaXRpb25YKGcpIHsKICAgICAgdmFyIGxheWVyaW5nID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpOwogICAgICB2YXIgY29uZmxpY3RzID0gbG9kYXNoXzEkMS5tZXJnZSgKICAgICAgICBmaW5kVHlwZTFDb25mbGljdHMoZywgbGF5ZXJpbmcpLAogICAgICAgIGZpbmRUeXBlMkNvbmZsaWN0cyhnLCBsYXllcmluZykpOwoKICAgICAgdmFyIHhzcyA9IHt9OwogICAgICB2YXIgYWRqdXN0ZWRMYXllcmluZzsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKFsidSIsICJkIl0sIGZ1bmN0aW9uKHZlcnQpIHsKICAgICAgICBhZGp1c3RlZExheWVyaW5nID0gdmVydCA9PT0gInUiID8gbGF5ZXJpbmcgOiBsb2Rhc2hfMSQxLnZhbHVlcyhsYXllcmluZykucmV2ZXJzZSgpOwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChbImwiLCAiciJdLCBmdW5jdGlvbihob3JpeikgewogICAgICAgICAgaWYgKGhvcml6ID09PSAiciIpIHsKICAgICAgICAgICAgYWRqdXN0ZWRMYXllcmluZyA9IGxvZGFzaF8xJDEubWFwKGFkanVzdGVkTGF5ZXJpbmcsIGZ1bmN0aW9uKGlubmVyKSB7CiAgICAgICAgICAgICAgcmV0dXJuIGxvZGFzaF8xJDEudmFsdWVzKGlubmVyKS5yZXZlcnNlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQoKICAgICAgICAgIHZhciBuZWlnaGJvckZuID0gKHZlcnQgPT09ICJ1IiA/IGcucHJlZGVjZXNzb3JzIDogZy5zdWNjZXNzb3JzKS5iaW5kKGcpOwogICAgICAgICAgdmFyIGFsaWduID0gdmVydGljYWxBbGlnbm1lbnQoZywgYWRqdXN0ZWRMYXllcmluZywgY29uZmxpY3RzLCBuZWlnaGJvckZuKTsKICAgICAgICAgIHZhciB4cyA9IGhvcml6b250YWxDb21wYWN0aW9uKGcsIGFkanVzdGVkTGF5ZXJpbmcsCiAgICAgICAgICAgIGFsaWduLnJvb3QsIGFsaWduLmFsaWduLCBob3JpeiA9PT0gInIiKTsKICAgICAgICAgIGlmIChob3JpeiA9PT0gInIiKSB7CiAgICAgICAgICAgIHhzID0gbG9kYXNoXzEkMS5tYXBWYWx1ZXMoeHMsIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIC14OyB9KTsKICAgICAgICAgIH0KICAgICAgICAgIHhzc1t2ZXJ0ICsgaG9yaXpdID0geHM7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgdmFyIHNtYWxsZXN0V2lkdGggPSBmaW5kU21hbGxlc3RXaWR0aEFsaWdubWVudChnLCB4c3MpOwogICAgICBhbGlnbkNvb3JkaW5hdGVzKHhzcywgc21hbGxlc3RXaWR0aCk7CiAgICAgIHJldHVybiBiYWxhbmNlKHhzcywgZy5ncmFwaCgpLmFsaWduKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXAobm9kZVNlcCwgZWRnZVNlcCwgcmV2ZXJzZVNlcCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oZywgdiwgdykgewogICAgICAgIHZhciB2TGFiZWwgPSBnLm5vZGUodik7CiAgICAgICAgdmFyIHdMYWJlbCA9IGcubm9kZSh3KTsKICAgICAgICB2YXIgc3VtID0gMDsKICAgICAgICB2YXIgZGVsdGE7CgogICAgICAgIHN1bSArPSB2TGFiZWwud2lkdGggLyAyOwogICAgICAgIGlmIChsb2Rhc2hfMSQxLmhhcyh2TGFiZWwsICJsYWJlbHBvcyIpKSB7CiAgICAgICAgICBzd2l0Y2ggKHZMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICBjYXNlICJsIjogZGVsdGEgPSAtdkxhYmVsLndpZHRoIC8gMjsgYnJlYWs7CiAgICAgICAgICBjYXNlICJyIjogZGVsdGEgPSB2TGFiZWwud2lkdGggLyAyOyBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRlbHRhKSB7CiAgICAgICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhOwogICAgICAgIH0KICAgICAgICBkZWx0YSA9IDA7CgogICAgICAgIHN1bSArPSAodkxhYmVsLmR1bW15ID8gZWRnZVNlcCA6IG5vZGVTZXApIC8gMjsKICAgICAgICBzdW0gKz0gKHdMYWJlbC5kdW1teSA/IGVkZ2VTZXAgOiBub2RlU2VwKSAvIDI7CgogICAgICAgIHN1bSArPSB3TGFiZWwud2lkdGggLyAyOwogICAgICAgIGlmIChsb2Rhc2hfMSQxLmhhcyh3TGFiZWwsICJsYWJlbHBvcyIpKSB7CiAgICAgICAgICBzd2l0Y2ggKHdMYWJlbC5sYWJlbHBvcy50b0xvd2VyQ2FzZSgpKSB7CiAgICAgICAgICBjYXNlICJsIjogZGVsdGEgPSB3TGFiZWwud2lkdGggLyAyOyBicmVhazsKICAgICAgICAgIGNhc2UgInIiOiBkZWx0YSA9IC13TGFiZWwud2lkdGggLyAyOyBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGRlbHRhKSB7CiAgICAgICAgICBzdW0gKz0gcmV2ZXJzZVNlcCA/IGRlbHRhIDogLWRlbHRhOwogICAgICAgIH0KICAgICAgICBkZWx0YSA9IDA7CgogICAgICAgIHJldHVybiBzdW07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gd2lkdGgoZywgdikgewogICAgICByZXR1cm4gZy5ub2RlKHYpLndpZHRoOwogICAgfQoKICAgIHZhciBwb3NpdGlvblgkMSA9IGJrLnBvc2l0aW9uWDsKCiAgICB2YXIgcG9zaXRpb25fMSA9IHBvc2l0aW9uOwoKICAgIGZ1bmN0aW9uIHBvc2l0aW9uKGcpIHsKICAgICAgZyA9IHV0aWwuYXNOb25Db21wb3VuZEdyYXBoKGcpOwoKICAgICAgcG9zaXRpb25ZKGcpOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2gocG9zaXRpb25YJDEoZyksIGZ1bmN0aW9uKHgsIHYpIHsKICAgICAgICBnLm5vZGUodikueCA9IHg7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvc2l0aW9uWShnKSB7CiAgICAgIHZhciBsYXllcmluZyA9IHV0aWwuYnVpbGRMYXllck1hdHJpeChnKTsKICAgICAgdmFyIHJhbmtTZXAgPSBnLmdyYXBoKCkucmFua3NlcDsKICAgICAgdmFyIHByZXZZID0gMDsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGxheWVyaW5nLCBmdW5jdGlvbihsYXllcikgewogICAgICAgIHZhciBtYXhIZWlnaHQgPSBsb2Rhc2hfMSQxLm1heChsb2Rhc2hfMSQxLm1hcChsYXllciwgZnVuY3Rpb24odikgeyByZXR1cm4gZy5ub2RlKHYpLmhlaWdodDsgfSkpOwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllciwgZnVuY3Rpb24odikgewogICAgICAgICAgZy5ub2RlKHYpLnkgPSBwcmV2WSArIG1heEhlaWdodCAvIDI7CiAgICAgICAgfSk7CiAgICAgICAgcHJldlkgKz0gbWF4SGVpZ2h0ICsgcmFua1NlcDsKICAgICAgfSk7CiAgICB9CgogICAgdmFyIG5vcm1hbGl6ZVJhbmtzJDEgPSB1dGlsLm5vcm1hbGl6ZVJhbmtzOwoKICAgIHZhciByZW1vdmVFbXB0eVJhbmtzJDEgPSB1dGlsLnJlbW92ZUVtcHR5UmFua3M7CgoKCgoKICAgIHZhciB1dGlsJDIgPSB1dGlsOwogICAgdmFyIEdyYXBoJDcgPSBncmFwaGxpYl8xLkdyYXBoOwoKICAgIHZhciBsYXlvdXRfMSA9IGxheW91dDsKCiAgICBmdW5jdGlvbiBsYXlvdXQoZywgb3B0cykgewogICAgICB2YXIgdGltZSA9IG9wdHMgJiYgb3B0cy5kZWJ1Z1RpbWluZyA/IHV0aWwkMi50aW1lIDogdXRpbCQyLm5vdGltZTsKICAgICAgdGltZSgibGF5b3V0IiwgZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGxheW91dEdyYXBoID0gCiAgICAgICAgICB0aW1lKCIgIGJ1aWxkTGF5b3V0R3JhcGgiLCBmdW5jdGlvbigpIHsgcmV0dXJuIGJ1aWxkTGF5b3V0R3JhcGgoZyk7IH0pOwogICAgICAgIHRpbWUoIiAgcnVuTGF5b3V0IiwgICAgICAgIGZ1bmN0aW9uKCkgeyBydW5MYXlvdXQobGF5b3V0R3JhcGgsIHRpbWUpOyB9KTsKICAgICAgICB0aW1lKCIgIHVwZGF0ZUlucHV0R3JhcGgiLCBmdW5jdGlvbigpIHsgdXBkYXRlSW5wdXRHcmFwaChnLCBsYXlvdXRHcmFwaCk7IH0pOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBydW5MYXlvdXQoZywgdGltZSkgewogICAgICB0aW1lKCIgICAgbWFrZVNwYWNlRm9yRWRnZUxhYmVscyIsIGZ1bmN0aW9uKCkgeyBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpOyB9KTsKICAgICAgdGltZSgiICAgIHJlbW92ZVNlbGZFZGdlcyIsICAgICAgICBmdW5jdGlvbigpIHsgcmVtb3ZlU2VsZkVkZ2VzKGcpOyB9KTsKICAgICAgdGltZSgiICAgIGFjeWNsaWMiLCAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgYWN5Y2xpYy5ydW4oZyk7IH0pOwogICAgICB0aW1lKCIgICAgbmVzdGluZ0dyYXBoLnJ1biIsICAgICAgIGZ1bmN0aW9uKCkgeyBuZXN0aW5nR3JhcGgucnVuKGcpOyB9KTsKICAgICAgdGltZSgiICAgIHJhbmsiLCAgICAgICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmFua18xKHV0aWwkMi5hc05vbkNvbXBvdW5kR3JhcGgoZykpOyB9KTsKICAgICAgdGltZSgiICAgIGluamVjdEVkZ2VMYWJlbFByb3hpZXMiLCBmdW5jdGlvbigpIHsgaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKTsgfSk7CiAgICAgIHRpbWUoIiAgICByZW1vdmVFbXB0eVJhbmtzIiwgICAgICAgZnVuY3Rpb24oKSB7IHJlbW92ZUVtcHR5UmFua3MkMShnKTsgfSk7CiAgICAgIHRpbWUoIiAgICBuZXN0aW5nR3JhcGguY2xlYW51cCIsICAgZnVuY3Rpb24oKSB7IG5lc3RpbmdHcmFwaC5jbGVhbnVwKGcpOyB9KTsKICAgICAgdGltZSgiICAgIG5vcm1hbGl6ZVJhbmtzIiwgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplUmFua3MkMShnKTsgfSk7CiAgICAgIHRpbWUoIiAgICBhc3NpZ25SYW5rTWluTWF4IiwgICAgICAgZnVuY3Rpb24oKSB7IGFzc2lnblJhbmtNaW5NYXgoZyk7IH0pOwogICAgICB0aW1lKCIgICAgcmVtb3ZlRWRnZUxhYmVsUHJveGllcyIsIGZ1bmN0aW9uKCkgeyByZW1vdmVFZGdlTGFiZWxQcm94aWVzKGcpOyB9KTsKICAgICAgdGltZSgiICAgIG5vcm1hbGl6ZS5ydW4iLCAgICAgICAgICBmdW5jdGlvbigpIHsgbm9ybWFsaXplJDIucnVuKGcpOyB9KTsKICAgICAgdGltZSgiICAgIHBhcmVudER1bW15Q2hhaW5zIiwgICAgICBmdW5jdGlvbigpIHsgcGFyZW50RHVtbXlDaGFpbnNfMShnKTsgfSk7CiAgICAgIHRpbWUoIiAgICBhZGRCb3JkZXJTZWdtZW50cyIsICAgICAgZnVuY3Rpb24oKSB7IGFkZEJvcmRlclNlZ21lbnRzXzEoZyk7IH0pOwogICAgICB0aW1lKCIgICAgb3JkZXIiLCAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBvcmRlcl8xKGcpOyB9KTsKICAgICAgdGltZSgiICAgIGluc2VydFNlbGZFZGdlcyIsICAgICAgICBmdW5jdGlvbigpIHsgaW5zZXJ0U2VsZkVkZ2VzKGcpOyB9KTsKICAgICAgdGltZSgiICAgIGFkanVzdENvb3JkaW5hdGVTeXN0ZW0iLCBmdW5jdGlvbigpIHsgY29vcmRpbmF0ZVN5c3RlbS5hZGp1c3QoZyk7IH0pOwogICAgICB0aW1lKCIgICAgcG9zaXRpb24iLCAgICAgICAgICAgICAgIGZ1bmN0aW9uKCkgeyBwb3NpdGlvbl8xKGcpOyB9KTsKICAgICAgdGltZSgiICAgIHBvc2l0aW9uU2VsZkVkZ2VzIiwgICAgICBmdW5jdGlvbigpIHsgcG9zaXRpb25TZWxmRWRnZXMoZyk7IH0pOwogICAgICB0aW1lKCIgICAgcmVtb3ZlQm9yZGVyTm9kZXMiLCAgICAgIGZ1bmN0aW9uKCkgeyByZW1vdmVCb3JkZXJOb2RlcyhnKTsgfSk7CiAgICAgIHRpbWUoIiAgICBub3JtYWxpemUudW5kbyIsICAgICAgICAgZnVuY3Rpb24oKSB7IG5vcm1hbGl6ZSQyLnVuZG8oZyk7IH0pOwogICAgICB0aW1lKCIgICAgZml4dXBFZGdlTGFiZWxDb29yZHMiLCAgIGZ1bmN0aW9uKCkgeyBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKTsgfSk7CiAgICAgIHRpbWUoIiAgICB1bmRvQ29vcmRpbmF0ZVN5c3RlbSIsICAgZnVuY3Rpb24oKSB7IGNvb3JkaW5hdGVTeXN0ZW0udW5kbyhnKTsgfSk7CiAgICAgIHRpbWUoIiAgICB0cmFuc2xhdGVHcmFwaCIsICAgICAgICAgZnVuY3Rpb24oKSB7IHRyYW5zbGF0ZUdyYXBoKGcpOyB9KTsKICAgICAgdGltZSgiICAgIGFzc2lnbk5vZGVJbnRlcnNlY3RzIiwgICBmdW5jdGlvbigpIHsgYXNzaWduTm9kZUludGVyc2VjdHMoZyk7IH0pOwogICAgICB0aW1lKCIgICAgcmV2ZXJzZVBvaW50cyIsICAgICAgICAgIGZ1bmN0aW9uKCkgeyByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKTsgfSk7CiAgICAgIHRpbWUoIiAgICBhY3ljbGljLnVuZG8iLCAgICAgICAgICAgZnVuY3Rpb24oKSB7IGFjeWNsaWMudW5kbyhnKTsgfSk7CiAgICB9CgogICAgLyoKICAgICAqIENvcGllcyBmaW5hbCBsYXlvdXQgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGF5b3V0IGdyYXBoIGJhY2sgdG8gdGhlIGlucHV0CiAgICAgKiBncmFwaC4gVGhpcyBwcm9jZXNzIG9ubHkgY29waWVzIHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgbGF5b3V0IGdyYXBoCiAgICAgKiB0byB0aGUgaW5wdXQgZ3JhcGgsIHNvIGl0IHNlcnZlcyBhcyBhIGdvb2QgcGxhY2UgdG8gZGV0ZXJtaW5lIHdoYXQKICAgICAqIGF0dHJpYnV0ZXMgY2FuIGluZmx1ZW5jZSBsYXlvdXQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVwZGF0ZUlucHV0R3JhcGgoaW5wdXRHcmFwaCwgbGF5b3V0R3JhcGgpIHsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGlucHV0R3JhcGgubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHZhciBpbnB1dExhYmVsID0gaW5wdXRHcmFwaC5ub2RlKHYpOwogICAgICAgIHZhciBsYXlvdXRMYWJlbCA9IGxheW91dEdyYXBoLm5vZGUodik7CgogICAgICAgIGlmIChpbnB1dExhYmVsKSB7CiAgICAgICAgICBpbnB1dExhYmVsLnggPSBsYXlvdXRMYWJlbC54OwogICAgICAgICAgaW5wdXRMYWJlbC55ID0gbGF5b3V0TGFiZWwueTsKCiAgICAgICAgICBpZiAobGF5b3V0R3JhcGguY2hpbGRyZW4odikubGVuZ3RoKSB7CiAgICAgICAgICAgIGlucHV0TGFiZWwud2lkdGggPSBsYXlvdXRMYWJlbC53aWR0aDsKICAgICAgICAgICAgaW5wdXRMYWJlbC5oZWlnaHQgPSBsYXlvdXRMYWJlbC5oZWlnaHQ7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChpbnB1dEdyYXBoLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgaW5wdXRMYWJlbCA9IGlucHV0R3JhcGguZWRnZShlKTsKICAgICAgICB2YXIgbGF5b3V0TGFiZWwgPSBsYXlvdXRHcmFwaC5lZGdlKGUpOwoKICAgICAgICBpbnB1dExhYmVsLnBvaW50cyA9IGxheW91dExhYmVsLnBvaW50czsKICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMobGF5b3V0TGFiZWwsICJ4IikpIHsKICAgICAgICAgIGlucHV0TGFiZWwueCA9IGxheW91dExhYmVsLng7CiAgICAgICAgICBpbnB1dExhYmVsLnkgPSBsYXlvdXRMYWJlbC55OwogICAgICAgIH0KICAgICAgfSk7CgogICAgICBpbnB1dEdyYXBoLmdyYXBoKCkud2lkdGggPSBsYXlvdXRHcmFwaC5ncmFwaCgpLndpZHRoOwogICAgICBpbnB1dEdyYXBoLmdyYXBoKCkuaGVpZ2h0ID0gbGF5b3V0R3JhcGguZ3JhcGgoKS5oZWlnaHQ7CiAgICB9CgogICAgdmFyIGdyYXBoTnVtQXR0cnMgPSBbIm5vZGVzZXAiLCAiZWRnZXNlcCIsICJyYW5rc2VwIiwgIm1hcmdpbngiLCAibWFyZ2lueSJdOwogICAgdmFyIGdyYXBoRGVmYXVsdHMgPSB7IHJhbmtzZXA6IDUwLCBlZGdlc2VwOiAyMCwgbm9kZXNlcDogNTAsIHJhbmtkaXI6ICJ0YiIgfTsKICAgIHZhciBncmFwaEF0dHJzID0gWyJhY3ljbGljZXIiLCAicmFua2VyIiwgInJhbmtkaXIiLCAiYWxpZ24iXTsKICAgIHZhciBub2RlTnVtQXR0cnMgPSBbIndpZHRoIiwgImhlaWdodCJdOwogICAgdmFyIG5vZGVEZWZhdWx0cyA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9OwogICAgdmFyIGVkZ2VOdW1BdHRycyA9IFsibWlubGVuIiwgIndlaWdodCIsICJ3aWR0aCIsICJoZWlnaHQiLCAibGFiZWxvZmZzZXQiXTsKICAgIHZhciBlZGdlRGVmYXVsdHMgPSB7CiAgICAgIG1pbmxlbjogMSwgd2VpZ2h0OiAxLCB3aWR0aDogMCwgaGVpZ2h0OiAwLAogICAgICBsYWJlbG9mZnNldDogMTAsIGxhYmVscG9zOiAiciIKICAgIH07CiAgICB2YXIgZWRnZUF0dHJzID0gWyJsYWJlbHBvcyJdOwoKICAgIC8qCiAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGdyYXBoIGZyb20gdGhlIGlucHV0IGdyYXBoLCB3aGljaCBjYW4gYmUgdXNlZCBmb3IgbGF5b3V0LgogICAgICogVGhpcyBwcm9jZXNzIGNvcGllcyBvbmx5IHdoaXRlbGlzdGVkIGF0dHJpYnV0ZXMgZnJvbSB0aGUgaW5wdXQgZ3JhcGggdG8gdGhlCiAgICAgKiBsYXlvdXQgZ3JhcGguIFRodXMgdGhpcyBmdW5jdGlvbiBzZXJ2ZXMgYXMgYSBnb29kIHBsYWNlIHRvIGRldGVybWluZSB3aGF0CiAgICAgKiBhdHRyaWJ1dGVzIGNhbiBpbmZsdWVuY2UgbGF5b3V0LgogICAgICovCiAgICBmdW5jdGlvbiBidWlsZExheW91dEdyYXBoKGlucHV0R3JhcGgpIHsKICAgICAgdmFyIGcgPSBuZXcgR3JhcGgkNyh7IG11bHRpZ3JhcGg6IHRydWUsIGNvbXBvdW5kOiB0cnVlIH0pOwogICAgICB2YXIgZ3JhcGggPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ncmFwaCgpKTsKCiAgICAgIGcuc2V0R3JhcGgobG9kYXNoXzEkMS5tZXJnZSh7fSwKICAgICAgICBncmFwaERlZmF1bHRzLAogICAgICAgIHNlbGVjdE51bWJlckF0dHJzKGdyYXBoLCBncmFwaE51bUF0dHJzKSwKICAgICAgICBsb2Rhc2hfMSQxLnBpY2soZ3JhcGgsIGdyYXBoQXR0cnMpKSk7CgogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goaW5wdXRHcmFwaC5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIG5vZGUgPSBjYW5vbmljYWxpemUoaW5wdXRHcmFwaC5ub2RlKHYpKTsKICAgICAgICBnLnNldE5vZGUodiwgbG9kYXNoXzEkMS5kZWZhdWx0cyhzZWxlY3ROdW1iZXJBdHRycyhub2RlLCBub2RlTnVtQXR0cnMpLCBub2RlRGVmYXVsdHMpKTsKICAgICAgICBnLnNldFBhcmVudCh2LCBpbnB1dEdyYXBoLnBhcmVudCh2KSk7CiAgICAgIH0pOwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGlucHV0R3JhcGguZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBlZGdlID0gY2Fub25pY2FsaXplKGlucHV0R3JhcGguZWRnZShlKSk7CiAgICAgICAgZy5zZXRFZGdlKGUsIGxvZGFzaF8xJDEubWVyZ2Uoe30sCiAgICAgICAgICBlZGdlRGVmYXVsdHMsCiAgICAgICAgICBzZWxlY3ROdW1iZXJBdHRycyhlZGdlLCBlZGdlTnVtQXR0cnMpLAogICAgICAgICAgbG9kYXNoXzEkMS5waWNrKGVkZ2UsIGVkZ2VBdHRycykpKTsKICAgICAgfSk7CgogICAgICByZXR1cm4gZzsKICAgIH0KCiAgICAvKgogICAgICogVGhpcyBpZGVhIGNvbWVzIGZyb20gdGhlIEdhbnNuZXIgcGFwZXI6IHRvIGFjY291bnQgZm9yIGVkZ2UgbGFiZWxzIGluIG91cgogICAgICogbGF5b3V0IHdlIHNwbGl0IGVhY2ggcmFuayBpbiBoYWxmIGJ5IGRvdWJsaW5nIG1pbmxlbiBhbmQgaGFsdmluZyByYW5rc2VwLgogICAgICogVGhlbiB3ZSBjYW4gcGxhY2UgbGFiZWxzIGF0IHRoZXNlIG1pZC1wb2ludHMgYmV0d2VlbiBub2Rlcy4KICAgICAqCiAgICAgKiBXZSBhbHNvIGFkZCBzb21lIG1pbmltYWwgcGFkZGluZyB0byB0aGUgd2lkdGggdG8gcHVzaCB0aGUgbGFiZWwgZm9yIHRoZSBlZGdlCiAgICAgKiBhd2F5IGZyb20gdGhlIGVkZ2UgaXRzZWxmIGEgYml0LgogICAgICovCiAgICBmdW5jdGlvbiBtYWtlU3BhY2VGb3JFZGdlTGFiZWxzKGcpIHsKICAgICAgdmFyIGdyYXBoID0gZy5ncmFwaCgpOwogICAgICBncmFwaC5yYW5rc2VwIC89IDI7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTsKICAgICAgICBlZGdlLm1pbmxlbiAqPSAyOwogICAgICAgIGlmIChlZGdlLmxhYmVscG9zLnRvTG93ZXJDYXNlKCkgIT09ICJjIikgewogICAgICAgICAgaWYgKGdyYXBoLnJhbmtkaXIgPT09ICJUQiIgfHwgZ3JhcGgucmFua2RpciA9PT0gIkJUIikgewogICAgICAgICAgICBlZGdlLndpZHRoICs9IGVkZ2UubGFiZWxvZmZzZXQ7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBlZGdlLmhlaWdodCArPSBlZGdlLmxhYmVsb2Zmc2V0OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgLyoKICAgICAqIENyZWF0ZXMgdGVtcG9yYXJ5IGR1bW15IG5vZGVzIHRoYXQgY2FwdHVyZSB0aGUgcmFuayBpbiB3aGljaCBlYWNoIGVkZ2UncwogICAgICogbGFiZWwgaXMgZ29pbmcgdG8sIGlmIGl0IGhhcyBvbmUgb2Ygbm9uLXplcm8gd2lkdGggYW5kIGhlaWdodC4gV2UgZG8gdGhpcwogICAgICogc28gdGhhdCB3ZSBjYW4gc2FmZWx5IHJlbW92ZSBlbXB0eSByYW5rcyB3aGlsZSBwcmVzZXJ2aW5nIGJhbGFuY2UgZm9yIHRoZQogICAgICogbGFiZWwncyBwb3NpdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gaW5qZWN0RWRnZUxhYmVsUHJveGllcyhnKSB7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTsKICAgICAgICBpZiAoZWRnZS53aWR0aCAmJiBlZGdlLmhlaWdodCkgewogICAgICAgICAgdmFyIHYgPSBnLm5vZGUoZS52KTsKICAgICAgICAgIHZhciB3ID0gZy5ub2RlKGUudyk7CiAgICAgICAgICB2YXIgbGFiZWwgPSB7IHJhbms6ICh3LnJhbmsgLSB2LnJhbmspIC8gMiArIHYucmFuaywgZTogZSB9OwogICAgICAgICAgdXRpbCQyLmFkZER1bW15Tm9kZShnLCAiZWRnZS1wcm94eSIsIGxhYmVsLCAiX2VwIik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc3NpZ25SYW5rTWluTWF4KGcpIHsKICAgICAgdmFyIG1heFJhbmsgPSAwOwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7CiAgICAgICAgaWYgKG5vZGUuYm9yZGVyVG9wKSB7CiAgICAgICAgICBub2RlLm1pblJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJUb3ApLnJhbms7CiAgICAgICAgICBub2RlLm1heFJhbmsgPSBnLm5vZGUobm9kZS5ib3JkZXJCb3R0b20pLnJhbms7CiAgICAgICAgICBtYXhSYW5rID0gbG9kYXNoXzEkMS5tYXgobWF4UmFuaywgbm9kZS5tYXhSYW5rKTsKICAgICAgICB9CiAgICAgIH0pOwogICAgICBnLmdyYXBoKCkubWF4UmFuayA9IG1heFJhbms7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRWRnZUxhYmVsUHJveGllcyhnKSB7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTsKICAgICAgICBpZiAobm9kZS5kdW1teSA9PT0gImVkZ2UtcHJveHkiKSB7CiAgICAgICAgICBnLmVkZ2Uobm9kZS5lKS5sYWJlbFJhbmsgPSBub2RlLnJhbms7CiAgICAgICAgICBnLnJlbW92ZU5vZGUodik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVHcmFwaChnKSB7CiAgICAgIHZhciBtaW5YID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICB2YXIgbWF4WCA9IDA7CiAgICAgIHZhciBtaW5ZID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZOwogICAgICB2YXIgbWF4WSA9IDA7CiAgICAgIHZhciBncmFwaExhYmVsID0gZy5ncmFwaCgpOwogICAgICB2YXIgbWFyZ2luWCA9IGdyYXBoTGFiZWwubWFyZ2lueCB8fCAwOwogICAgICB2YXIgbWFyZ2luWSA9IGdyYXBoTGFiZWwubWFyZ2lueSB8fCAwOwoKICAgICAgZnVuY3Rpb24gZ2V0RXh0cmVtZXMoYXR0cnMpIHsKICAgICAgICB2YXIgeCA9IGF0dHJzLng7CiAgICAgICAgdmFyIHkgPSBhdHRycy55OwogICAgICAgIHZhciB3ID0gYXR0cnMud2lkdGg7CiAgICAgICAgdmFyIGggPSBhdHRycy5oZWlnaHQ7CiAgICAgICAgbWluWCA9IE1hdGgubWluKG1pblgsIHggLSB3IC8gMik7CiAgICAgICAgbWF4WCA9IE1hdGgubWF4KG1heFgsIHggKyB3IC8gMik7CiAgICAgICAgbWluWSA9IE1hdGgubWluKG1pblksIHkgLSBoIC8gMik7CiAgICAgICAgbWF4WSA9IE1hdGgubWF4KG1heFksIHkgKyBoIC8gMik7CiAgICAgIH0KCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsgZ2V0RXh0cmVtZXMoZy5ub2RlKHYpKTsgfSk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTsKICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMoZWRnZSwgIngiKSkgewogICAgICAgICAgZ2V0RXh0cmVtZXMoZWRnZSk7CiAgICAgICAgfQogICAgICB9KTsKCiAgICAgIG1pblggLT0gbWFyZ2luWDsKICAgICAgbWluWSAtPSBtYXJnaW5ZOwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIHZhciBub2RlID0gZy5ub2RlKHYpOwogICAgICAgIG5vZGUueCAtPSBtaW5YOwogICAgICAgIG5vZGUueSAtPSBtaW5ZOwogICAgICB9KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTsKICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZWRnZS5wb2ludHMsIGZ1bmN0aW9uKHApIHsKICAgICAgICAgIHAueCAtPSBtaW5YOwogICAgICAgICAgcC55IC09IG1pblk7CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGxvZGFzaF8xJDEuaGFzKGVkZ2UsICJ4IikpIHsgZWRnZS54IC09IG1pblg7IH0KICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMoZWRnZSwgInkiKSkgeyBlZGdlLnkgLT0gbWluWTsgfQogICAgICB9KTsKCiAgICAgIGdyYXBoTGFiZWwud2lkdGggPSBtYXhYIC0gbWluWCArIG1hcmdpblg7CiAgICAgIGdyYXBoTGFiZWwuaGVpZ2h0ID0gbWF4WSAtIG1pblkgKyBtYXJnaW5ZOwogICAgfQoKICAgIGZ1bmN0aW9uIGFzc2lnbk5vZGVJbnRlcnNlY3RzKGcpIHsKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcuZWRnZXMoKSwgZnVuY3Rpb24oZSkgewogICAgICAgIHZhciBlZGdlID0gZy5lZGdlKGUpOwogICAgICAgIHZhciBub2RlViA9IGcubm9kZShlLnYpOwogICAgICAgIHZhciBub2RlVyA9IGcubm9kZShlLncpOwogICAgICAgIHZhciBwMSwgcDI7CiAgICAgICAgaWYgKCFlZGdlLnBvaW50cykgewogICAgICAgICAgZWRnZS5wb2ludHMgPSBbXTsKICAgICAgICAgIHAxID0gbm9kZVc7CiAgICAgICAgICBwMiA9IG5vZGVWOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwMSA9IGVkZ2UucG9pbnRzWzBdOwogICAgICAgICAgcDIgPSBlZGdlLnBvaW50c1tlZGdlLnBvaW50cy5sZW5ndGggLSAxXTsKICAgICAgICB9CiAgICAgICAgZWRnZS5wb2ludHMudW5zaGlmdCh1dGlsJDIuaW50ZXJzZWN0UmVjdChub2RlViwgcDEpKTsKICAgICAgICBlZGdlLnBvaW50cy5wdXNoKHV0aWwkMi5pbnRlcnNlY3RSZWN0KG5vZGVXLCBwMikpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaXh1cEVkZ2VMYWJlbENvb3JkcyhnKSB7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTsKICAgICAgICBpZiAobG9kYXNoXzEkMS5oYXMoZWRnZSwgIngiKSkgewogICAgICAgICAgaWYgKGVkZ2UubGFiZWxwb3MgPT09ICJsIiB8fCBlZGdlLmxhYmVscG9zID09PSAiciIpIHsKICAgICAgICAgICAgZWRnZS53aWR0aCAtPSBlZGdlLmxhYmVsb2Zmc2V0OwogICAgICAgICAgfQogICAgICAgICAgc3dpdGNoIChlZGdlLmxhYmVscG9zKSB7CiAgICAgICAgICBjYXNlICJsIjogZWRnZS54IC09IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7CiAgICAgICAgICBjYXNlICJyIjogZWRnZS54ICs9IGVkZ2Uud2lkdGggLyAyICsgZWRnZS5sYWJlbG9mZnNldDsgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXZlcnNlUG9pbnRzRm9yUmV2ZXJzZWRFZGdlcyhnKSB7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICB2YXIgZWRnZSA9IGcuZWRnZShlKTsKICAgICAgICBpZiAoZWRnZS5yZXZlcnNlZCkgewogICAgICAgICAgZWRnZS5wb2ludHMucmV2ZXJzZSgpOwogICAgICAgIH0KICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlQm9yZGVyTm9kZXMoZykgewogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgaWYgKGcuY2hpbGRyZW4odikubGVuZ3RoKSB7CiAgICAgICAgICB2YXIgbm9kZSA9IGcubm9kZSh2KTsKICAgICAgICAgIHZhciB0ID0gZy5ub2RlKG5vZGUuYm9yZGVyVG9wKTsKICAgICAgICAgIHZhciBiID0gZy5ub2RlKG5vZGUuYm9yZGVyQm90dG9tKTsKICAgICAgICAgIHZhciBsID0gZy5ub2RlKGxvZGFzaF8xJDEubGFzdChub2RlLmJvcmRlckxlZnQpKTsKICAgICAgICAgIHZhciByID0gZy5ub2RlKGxvZGFzaF8xJDEubGFzdChub2RlLmJvcmRlclJpZ2h0KSk7CgogICAgICAgICAgbm9kZS53aWR0aCA9IE1hdGguYWJzKHIueCAtIGwueCk7CiAgICAgICAgICBub2RlLmhlaWdodCA9IE1hdGguYWJzKGIueSAtIHQueSk7CiAgICAgICAgICBub2RlLnggPSBsLnggKyBub2RlLndpZHRoIC8gMjsKICAgICAgICAgIG5vZGUueSA9IHQueSArIG5vZGUuaGVpZ2h0IC8gMjsKICAgICAgICB9CiAgICAgIH0pOwoKICAgICAgbG9kYXNoXzEkMS5mb3JFYWNoKGcubm9kZXMoKSwgZnVuY3Rpb24odikgewogICAgICAgIGlmIChnLm5vZGUodikuZHVtbXkgPT09ICJib3JkZXIiKSB7CiAgICAgICAgICBnLnJlbW92ZU5vZGUodik7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmVTZWxmRWRnZXMoZykgewogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5lZGdlcygpLCBmdW5jdGlvbihlKSB7CiAgICAgICAgaWYgKGUudiA9PT0gZS53KSB7CiAgICAgICAgICB2YXIgbm9kZSA9IGcubm9kZShlLnYpOwogICAgICAgICAgaWYgKCFub2RlLnNlbGZFZGdlcykgewogICAgICAgICAgICBub2RlLnNlbGZFZGdlcyA9IFtdOwogICAgICAgICAgfQogICAgICAgICAgbm9kZS5zZWxmRWRnZXMucHVzaCh7IGU6IGUsIGxhYmVsOiBnLmVkZ2UoZSkgfSk7CiAgICAgICAgICBnLnJlbW92ZUVkZ2UoZSk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnNlcnRTZWxmRWRnZXMoZykgewogICAgICB2YXIgbGF5ZXJzID0gdXRpbCQyLmJ1aWxkTGF5ZXJNYXRyaXgoZyk7CiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllcnMsIGZ1bmN0aW9uKGxheWVyKSB7CiAgICAgICAgdmFyIG9yZGVyU2hpZnQgPSAwOwogICAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllciwgZnVuY3Rpb24odiwgaSkgewogICAgICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7CiAgICAgICAgICBub2RlLm9yZGVyID0gaSArIG9yZGVyU2hpZnQ7CiAgICAgICAgICBsb2Rhc2hfMSQxLmZvckVhY2gobm9kZS5zZWxmRWRnZXMsIGZ1bmN0aW9uKHNlbGZFZGdlKSB7CiAgICAgICAgICAgIHV0aWwkMi5hZGREdW1teU5vZGUoZywgInNlbGZlZGdlIiwgewogICAgICAgICAgICAgIHdpZHRoOiBzZWxmRWRnZS5sYWJlbC53aWR0aCwKICAgICAgICAgICAgICBoZWlnaHQ6IHNlbGZFZGdlLmxhYmVsLmhlaWdodCwKICAgICAgICAgICAgICByYW5rOiBub2RlLnJhbmssCiAgICAgICAgICAgICAgb3JkZXI6IGkgKyAoKytvcmRlclNoaWZ0KSwKICAgICAgICAgICAgICBlOiBzZWxmRWRnZS5lLAogICAgICAgICAgICAgIGxhYmVsOiBzZWxmRWRnZS5sYWJlbAogICAgICAgICAgICB9LCAiX3NlIik7CiAgICAgICAgICB9KTsKICAgICAgICAgIGRlbGV0ZSBub2RlLnNlbGZFZGdlczsKICAgICAgICB9KTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcG9zaXRpb25TZWxmRWRnZXMoZykgewogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goZy5ub2RlcygpLCBmdW5jdGlvbih2KSB7CiAgICAgICAgdmFyIG5vZGUgPSBnLm5vZGUodik7CiAgICAgICAgaWYgKG5vZGUuZHVtbXkgPT09ICJzZWxmZWRnZSIpIHsKICAgICAgICAgIHZhciBzZWxmTm9kZSA9IGcubm9kZShub2RlLmUudik7CiAgICAgICAgICB2YXIgeCA9IHNlbGZOb2RlLnggKyBzZWxmTm9kZS53aWR0aCAvIDI7CiAgICAgICAgICB2YXIgeSA9IHNlbGZOb2RlLnk7CiAgICAgICAgICB2YXIgZHggPSBub2RlLnggLSB4OwogICAgICAgICAgdmFyIGR5ID0gc2VsZk5vZGUuaGVpZ2h0IC8gMjsKICAgICAgICAgIGcuc2V0RWRnZShub2RlLmUsIG5vZGUubGFiZWwpOwogICAgICAgICAgZy5yZW1vdmVOb2RlKHYpOwogICAgICAgICAgbm9kZS5sYWJlbC5wb2ludHMgPSBbCiAgICAgICAgICAgIHsgeDogeCArIDIgKiBkeCAvIDMsIHk6IHkgLSBkeSB9LAogICAgICAgICAgICB7IHg6IHggKyA1ICogZHggLyA2LCB5OiB5IC0gZHkgfSwKICAgICAgICAgICAgeyB4OiB4ICsgICAgIGR4ICAgICwgeTogeSB9LAogICAgICAgICAgICB7IHg6IHggKyA1ICogZHggLyA2LCB5OiB5ICsgZHkgfSwKICAgICAgICAgICAgeyB4OiB4ICsgMiAqIGR4IC8gMywgeTogeSArIGR5IH0KICAgICAgICAgIF07CiAgICAgICAgICBub2RlLmxhYmVsLnggPSBub2RlLng7CiAgICAgICAgICBub2RlLmxhYmVsLnkgPSBub2RlLnk7CiAgICAgICAgfQogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3ROdW1iZXJBdHRycyhvYmosIGF0dHJzKSB7CiAgICAgIHJldHVybiBsb2Rhc2hfMSQxLm1hcFZhbHVlcyhsb2Rhc2hfMSQxLnBpY2sob2JqLCBhdHRycyksIE51bWJlcik7CiAgICB9CgogICAgZnVuY3Rpb24gY2Fub25pY2FsaXplKGF0dHJzKSB7CiAgICAgIHZhciBuZXdBdHRycyA9IHt9OwogICAgICBsb2Rhc2hfMSQxLmZvckVhY2goYXR0cnMsIGZ1bmN0aW9uKHYsIGspIHsKICAgICAgICBuZXdBdHRyc1trLnRvTG93ZXJDYXNlKCldID0gdjsKICAgICAgfSk7CiAgICAgIHJldHVybiBuZXdBdHRyczsKICAgIH0KCiAgICB2YXIgR3JhcGgkOCA9IGdyYXBobGliXzEuR3JhcGg7CgogICAgdmFyIGRlYnVnID0gewogICAgICBkZWJ1Z09yZGVyaW5nOiBkZWJ1Z09yZGVyaW5nCiAgICB9OwoKICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovCiAgICBmdW5jdGlvbiBkZWJ1Z09yZGVyaW5nKGcpIHsKICAgICAgdmFyIGxheWVyTWF0cml4ID0gdXRpbC5idWlsZExheWVyTWF0cml4KGcpOwoKICAgICAgdmFyIGggPSBuZXcgR3JhcGgkOCh7IGNvbXBvdW5kOiB0cnVlLCBtdWx0aWdyYXBoOiB0cnVlIH0pLnNldEdyYXBoKHt9KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLm5vZGVzKCksIGZ1bmN0aW9uKHYpIHsKICAgICAgICBoLnNldE5vZGUodiwgeyBsYWJlbDogdiB9KTsKICAgICAgICBoLnNldFBhcmVudCh2LCAibGF5ZXIiICsgZy5ub2RlKHYpLnJhbmspOwogICAgICB9KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChnLmVkZ2VzKCksIGZ1bmN0aW9uKGUpIHsKICAgICAgICBoLnNldEVkZ2UoZS52LCBlLncsIHt9LCBlLm5hbWUpOwogICAgICB9KTsKCiAgICAgIGxvZGFzaF8xJDEuZm9yRWFjaChsYXllck1hdHJpeCwgZnVuY3Rpb24obGF5ZXIsIGkpIHsKICAgICAgICB2YXIgbGF5ZXJWID0gImxheWVyIiArIGk7CiAgICAgICAgaC5zZXROb2RlKGxheWVyViwgeyByYW5rOiAic2FtZSIgfSk7CiAgICAgICAgbG9kYXNoXzEkMS5yZWR1Y2UobGF5ZXIsIGZ1bmN0aW9uKHUsIHYpIHsKICAgICAgICAgIGguc2V0RWRnZSh1LCB2LCB7IHN0eWxlOiAiaW52aXMiIH0pOwogICAgICAgICAgcmV0dXJuIHY7CiAgICAgICAgfSk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGg7CiAgICB9CgogICAgdmFyIHZlcnNpb24kNSA9ICIwLjguNSI7CgogICAgLyoKICAgIENvcHlyaWdodCAoYykgMjAxMi0yMDE0IENocmlzIFBldHRpdHQKCiAgICBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CiAgICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAogICAgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwogICAgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAogICAgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCiAgICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgoKICAgIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluCiAgICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS4KCiAgICBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgIkFTIElTIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUgogICAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksCiAgICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUKICAgIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVIKICAgIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sCiAgICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOCiAgICBUSEUgU09GVFdBUkUuCiAgICAqLwoKICAgIHZhciBkYWdyZSA9IHsKICAgICAgZ3JhcGhsaWI6IGdyYXBobGliXzEsCgogICAgICBsYXlvdXQ6IGxheW91dF8xLAogICAgICBkZWJ1ZzogZGVidWcsCiAgICAgIHV0aWw6IHsKICAgICAgICB0aW1lOiB1dGlsLnRpbWUsCiAgICAgICAgbm90aW1lOiB1dGlsLm5vdGltZQogICAgICB9LAogICAgICB2ZXJzaW9uOiB2ZXJzaW9uJDUKICAgIH07CgogICAgLyogQ29weXJpZ2h0IDIwMTUgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBBU1lOQ19UQVNLX0RFTEFZID0gMjA7CiAgICAvKioKICAgICAqIE1lYXN1cmUgYW5kIGxvZyBhIHN5bmNocm9ub3VzIHRhc2suCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRpbWUkMyhtc2csIHRhc2spIHsKICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgIGxldCByZXN1bHQgPSB0YXNrKCk7CiAgICAgICAgLyogdHNsaW50OmRpc2FibGUgKi8KICAgICAgICBjb25zb2xlLmxvZyhtc2csICc6JywgRGF0ZS5ub3coKSAtIHN0YXJ0LCAnbXMnKTsKICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovCiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHRyYWNrZXIgdGhhdCBzZXRzIHRoZSBwcm9ncmVzcyBwcm9wZXJ0eSBvZiB0aGUKICAgICAqIHByb3ZpZGVkIHBvbHltZXIgY29tcG9uZW50LiBUaGUgcHJvdmlkZWQgY29tcG9uZW50IG11c3QgaGF2ZQogICAgICogYSBwcm9wZXJ0eSBjYWxsZWQgJ3Byb2dyZXNzJyB0aGF0IGlzIG5vdCByZWFkLW9ubHkuIFRoZSBwcm9ncmVzcwogICAgICogcHJvcGVydHkgaXMgYW4gb2JqZWN0IHdpdGggYSBudW1lcmljYWwgJ3ZhbHVlJyBwcm9wZXJ0eSBhbmQgYQogICAgICogc3RyaW5nICdtc2cnIHByb3BlcnR5LgogICAgICovCiAgICBmdW5jdGlvbiBnZXRUcmFja2VyKHBvbHltZXJDb21wb25lbnQpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzZXRNZXNzYWdlOiBmdW5jdGlvbiAobXNnKSB7CiAgICAgICAgICAgICAgICBwb2x5bWVyQ29tcG9uZW50LnNldCgncHJvZ3Jlc3MnLCB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHBvbHltZXJDb21wb25lbnQucHJvZ3Jlc3MudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgbXNnOiBtc2csCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3M6IGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICAgICAgcG9seW1lckNvbXBvbmVudC5zZXQoJ3Byb2dyZXNzJywgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwb2x5bWVyQ29tcG9uZW50LnByb2dyZXNzLnZhbHVlICsgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgbXNnOiBwb2x5bWVyQ29tcG9uZW50LnByb2dyZXNzLm1zZywKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24gKG1zZywgZXJyKSB7CiAgICAgICAgICAgICAgICAvLyBMb2cgdGhlIHN0YWNrIHRyYWNlIGluIHRoZSBjb25zb2xlLgogICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIuc3RhY2spOwogICAgICAgICAgICAgICAgLy8gQW5kIHNlbmQgYSB1c2VyLWZyaWVuZGx5IG1lc3NhZ2UgdG8gdGhlIFVJLgogICAgICAgICAgICAgICAgcG9seW1lckNvbXBvbmVudC5zZXQoJ3Byb2dyZXNzJywgewogICAgICAgICAgICAgICAgICAgIHZhbHVlOiBwb2x5bWVyQ29tcG9uZW50LnByb2dyZXNzLnZhbHVlLAogICAgICAgICAgICAgICAgICAgIG1zZzogbXNnLAogICAgICAgICAgICAgICAgICAgIGVycm9yOiB0cnVlLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHRyYWNrZXIgZm9yIGEgc3VidGFzayBnaXZlbiB0aGUgcGFyZW50IHRyYWNrZXIsIHRoZSB0b3RhbAogICAgICogcHJvZ3Jlc3MKICAgICAqIG9mIHRoZSBzdWJ0YXNrIGFuZCB0aGUgc3VidGFzayBtZXNzYWdlLiBUaGUgcGFyZW50IHRhc2sgc2hvdWxkIHBhc3MgYQogICAgICogc3VidHJhY2tlciB0byBpdHMgc3VidGFza3MuIFRoZSBzdWJ0YXNrIHJlcG9ydHMgaXRzIG93biBwcm9ncmVzcyB3aGljaAogICAgICogYmVjb21lcyByZWxhdGl2ZSB0byB0aGUgbWFpbiB0YXNrLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTdWJ0YXNrVHJhY2tlcihwYXJlbnRUcmFja2VyLCBpbXBhY3RPblRvdGFsUHJvZ3Jlc3MsIHN1YnRhc2tNc2cpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzZXRNZXNzYWdlOiBmdW5jdGlvbiAocHJvZ3Jlc3NNc2cpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJlbnQgc2hvdWxkIHNob3cgYSBjb25jYXRlbmF0aW9uIG9mIGl0cyBtZXNzYWdlIGFsb25nIHdpdGgKICAgICAgICAgICAgICAgIC8vIGl0cyBzdWJ0YXNrIHRyYWNrZXIgbWVzc2FnZS4KICAgICAgICAgICAgICAgIHBhcmVudFRyYWNrZXIuc2V0TWVzc2FnZShzdWJ0YXNrTXNnICsgJzogJyArIHByb2dyZXNzTXNnKTsKICAgICAgICAgICAgfSwKICAgICAgICAgICAgdXBkYXRlUHJvZ3Jlc3M6IGZ1bmN0aW9uIChpbmNyZW1lbnRWYWx1ZSkgewogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwYXJlbnQgcHJvZ3Jlc3MgcmVsYXRpdmUgdG8gdGhlIGNoaWxkIHByb2dyZXNzLgogICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBzdWItdGFzayBwcm9ncmVzc2VzIGJ5IDMwJSwgYW5kIHRoZSBpbXBhY3Qgb24gdGhlCiAgICAgICAgICAgICAgICAvLyB0b3RhbCBwcm9ncmVzcyBpcyA1MCUsIHRoZW4gdGhlIHRhc2sgcHJvZ3Jlc3NlcyBieSAzMCUgKiA1MCUgPSAxNSUuCiAgICAgICAgICAgICAgICBwYXJlbnRUcmFja2VyLnVwZGF0ZVByb2dyZXNzKChpbmNyZW1lbnRWYWx1ZSAqIGltcGFjdE9uVG90YWxQcm9ncmVzcykgLyAxMDApOwogICAgICAgICAgICB9LAogICAgICAgICAgICByZXBvcnRFcnJvcjogZnVuY3Rpb24gKG1zZywgZXJyKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgcGFyZW50IHNob3VsZCBzaG93IGEgY29uY2F0ZW5hdGlvbiBvZiBpdHMgbWVzc2FnZSBhbG9uZyB3aXRoCiAgICAgICAgICAgICAgICAvLyBpdHMgc3VidGFzayBlcnJvciBtZXNzYWdlLgogICAgICAgICAgICAgICAgcGFyZW50VHJhY2tlci5yZXBvcnRFcnJvcihzdWJ0YXNrTXNnICsgJzogJyArIG1zZywgZXJyKTsKICAgICAgICAgICAgfSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBSdW5zIGEgc3luY2hyb25vdXMgZXhwZW5zaXZlIHRhc2sgYW5kIHJldHVybiB0aGUgcmVzdWx0LgogICAgICogUGxlYXNlIHVzZSBydW5Bc3luY1Byb21pc2VUYXNrIGluIGNhc2UgYSB0YXNrIHJldHVybnMgYSBQcm9taXNlLgogICAgICovCiAgICBmdW5jdGlvbiBydW5UYXNrKG1zZywgaW5jUHJvZ3Jlc3NWYWx1ZSwgdGFzaywgdHJhY2tlcikgewogICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgbWVzc2FnZSB0byBzYXkgdGhlIGN1cnJlbnQgcnVubmluZyB0YXNrLgogICAgICAgIHRyYWNrZXIuc2V0TWVzc2FnZShtc2cpOwogICAgICAgIC8vIFJ1biB0aGUgZXhwZW5zaXZlIHRhc2sgd2l0aCBhIGRlbGF5IHRoYXQgZ2l2ZXMgZW5vdWdoIHRpbWUgZm9yIHRoZQogICAgICAgIC8vIFVJIHRvIHVwZGF0ZS4KICAgICAgICB0cnkgewogICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGltZSQzKG1zZywgdGFzayk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgdmFsdWUuCiAgICAgICAgICAgIHRyYWNrZXIudXBkYXRlUHJvZ3Jlc3MoaW5jUHJvZ3Jlc3NWYWx1ZSk7CiAgICAgICAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IHRvIGJlIHVzZWQgYnkgb3RoZXIgdGFza3MuCiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIEVycm9ycyB0aGF0IGhhcHBlbiBpbnNpZGUgYXN5bmNocm9ub3VzIHRhc2tzIGFyZQogICAgICAgICAgICAvLyByZXBvcnRlZCB0byB0aGUgdHJhY2tlciB1c2luZyBhIHVzZXItZnJpZW5kbHkgbWVzc2FnZS4KICAgICAgICAgICAgdHJhY2tlci5yZXBvcnRFcnJvcignRmFpbGVkICcgKyBtc2csIGUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUnVucyBhbiBleHBlbnNpdmUgdGFzayBhc3luY2hyb25vdXNseSBhbmQgcmV0dXJucyBhIHByb21pc2Ugb2YgdGhlIHJlc3VsdC4KICAgICAqLwogICAgZnVuY3Rpb24gcnVuQXN5bmNUYXNrKG1zZywgaW5jUHJvZ3Jlc3NWYWx1ZSwgdGFzaywgdHJhY2tlcikgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgbWVzc2FnZSB0byBzYXkgdGhlIGN1cnJlbnQgcnVubmluZyB0YXNrLgogICAgICAgICAgICB0cmFja2VyLnNldE1lc3NhZ2UobXNnKTsKICAgICAgICAgICAgLy8gUnVuIHRoZSBleHBlbnNpdmUgdGFzayB3aXRoIGEgZGVsYXkgdGhhdCBnaXZlcyBlbm91Z2ggdGltZSBmb3IgdGhlCiAgICAgICAgICAgIC8vIFVJIHRvIHVwZGF0ZS4KICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aW1lJDMobXNnLCB0YXNrKTsKICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHByb2dyZXNzIHZhbHVlLgogICAgICAgICAgICAgICAgICAgIHRyYWNrZXIudXBkYXRlUHJvZ3Jlc3MoaW5jUHJvZ3Jlc3NWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSByZXN1bHQgdG8gYmUgdXNlZCBieSBvdGhlciB0YXNrcy4KICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIC8vIEVycm9ycyB0aGF0IGhhcHBlbiBpbnNpZGUgYXN5bmNocm9ub3VzIHRhc2tzIGFyZQogICAgICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIHRvIHRoZSB0cmFja2VyIHVzaW5nIGEgdXNlci1mcmllbmRseSBtZXNzYWdlLgogICAgICAgICAgICAgICAgICAgIHRyYWNrZXIucmVwb3J0RXJyb3IoJ0ZhaWxlZCAnICsgbXNnLCBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwgQVNZTkNfVEFTS19ERUxBWSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEFzeW5jaHJvbm91c2x5IHJ1bnMgYW4gZXhwZW5zaXZlIHRhc2sgdGhhdCByZXR1cm5zIGEgcHJvbWlzZS4gVXBkYXRlcyB0aGUKICAgICAqIHRyYWNrZXIncyBwcm9ncmVzcyBhZnRlciB0aGUgcHJvbWlzZSByZXNvbHZlcy4gUmV0dXJucyBhIG5ldyBwcm9taXNlIHRoYXQKICAgICAqIHJlc29sdmVzIGFmdGVyIHRoZSBwcm9ncmVzcyBpcyB1cGRhdGVkLgogICAgICovCiAgICBmdW5jdGlvbiBydW5Bc3luY1Byb21pc2VUYXNrKG1zZywgaW5jUHJvZ3Jlc3NWYWx1ZSwgdGFzaywgdHJhY2tlcikgewogICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgIGxldCBoYW5kbGVFcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAvLyBFcnJvcnMgdGhhdCBoYXBwZW4gaW5zaWRlIGFzeW5jaHJvbm91cyB0YXNrcyBhcmUKICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIHRvIHRoZSB0cmFja2VyIHVzaW5nIGEgdXNlci1mcmllbmRseSBtZXNzYWdlLgogICAgICAgICAgICAgICAgdHJhY2tlci5yZXBvcnRFcnJvcignRmFpbGVkICcgKyBtc2csIGUpOwogICAgICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHByb2dyZXNzIG1lc3NhZ2UgdG8gc2F5IHRoZSBjdXJyZW50IHJ1bm5pbmcgdGFzay4KICAgICAgICAgICAgdHJhY2tlci5zZXRNZXNzYWdlKG1zZyk7CiAgICAgICAgICAgIC8vIFJ1biB0aGUgZXhwZW5zaXZlIHRhc2sgd2l0aCBhIGRlbGF5IHRoYXQgZ2l2ZXMgZW5vdWdoIHRpbWUgZm9yIHRoZQogICAgICAgICAgICAvLyBVSSB0byB1cGRhdGUuCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBsZXQgc3RhcnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgICAgIHRhc2soKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2cobXNnLCAnOicsIERhdGUubm93KCkgLSBzdGFydCwgJ21zJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcHJvZ3Jlc3MgdmFsdWUuCiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrZXIudXBkYXRlUHJvZ3Jlc3MoaW5jUHJvZ3Jlc3NWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiB0aGUgcmVzdWx0IHRvIGJlIHVzZWQgYnkgb3RoZXIgdGFza3MuCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIC5jYXRjaChoYW5kbGVFcnJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LCBBU1lOQ19UQVNLX0RFTEFZKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIHF1ZXJ5IHNlbGVjdG9yIHdpdGggZXNjYXBlZCBzcGVjaWFsIGNoYXJhY3RlcnMgdGhhdCBhcmUgbm90CiAgICAgKiBhbGxvd2VkIGluIGEgcXVlcnkgc2VsZWN0b3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVzY2FwZVF1ZXJ5U2VsZWN0b3IocXVlcnlTZWxlY3RvcikgewogICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yLnJlcGxhY2UoLyhbOi5cW1xdLC9cXFwoXCldKS9nLCAnXFwkMScpOwogICAgfQogICAgLy8gRm9yIHVuaXQgY29udmVyc2lvbi4KICAgIGNvbnN0IE1FTU9SWV9VTklUUyA9IFsKICAgICAgICAvLyBBdG9taWMgdW5pdC4KICAgICAgICB7IHN5bWJvbDogJ0InIH0sCiAgICAgICAgLy8gbnVtVW5pdHMgc3BlY2lmaWVzIGhvdyBtYW55IHByZXZpb3VzIHVuaXRzIHRoaXMgdW5pdCBjb250YWlucy4KICAgICAgICB7IHN5bWJvbDogJ0tCJywgbnVtVW5pdHM6IDEwMjQgfSwKICAgICAgICB7IHN5bWJvbDogJ01CJywgbnVtVW5pdHM6IDEwMjQgfSwKICAgICAgICB7IHN5bWJvbDogJ0dCJywgbnVtVW5pdHM6IDEwMjQgfSwKICAgICAgICB7IHN5bWJvbDogJ1RCJywgbnVtVW5pdHM6IDEwMjQgfSwKICAgICAgICB7IHN5bWJvbDogJ1BCJywgbnVtVW5pdHM6IDEwMjQgfSwKICAgIF07CiAgICBjb25zdCBUSU1FX1VOSVRTID0gWwogICAgICAgIC8vIEF0b21pYyB1bml0LiBGaW5lc3QgZ3JhbnVsYXJpdHkgaW4gVGVuc29yRmxvdyBzdGF0IGNvbGxlY3Rpb24uCiAgICAgICAgeyBzeW1ib2w6ICfCtXMnIH0sCiAgICAgICAgLy8gbnVtVW5pdHMgc3BlY2lmaWVzIGhvdyBtYW55IHByZXZpb3VzIHVuaXRzIHRoaXMgdW5pdCBjb250YWlucy4KICAgICAgICB7IHN5bWJvbDogJ21zJywgbnVtVW5pdHM6IDEwMDAgfSwKICAgICAgICB7IHN5bWJvbDogJ3MnLCBudW1Vbml0czogMTAwMCB9LAogICAgICAgIHsgc3ltYm9sOiAnbWluJywgbnVtVW5pdHM6IDYwIH0sCiAgICAgICAgeyBzeW1ib2w6ICdocicsIG51bVVuaXRzOiA2MCB9LAogICAgICAgIHsgc3ltYm9sOiAnZGF5cycsIG51bVVuaXRzOiAyNCB9LAogICAgXTsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaHVtYW4gcmVhZGFibGUgdmVyc2lvbiBvZiB0aGUgdW5pdC4KICAgICAqIChlLmcuIDEuMzUgR0IsIDIzIE1CLCAzNCBtcywgNi41MyBtaW4gZXRjKS4KICAgICAqLwogICAgZnVuY3Rpb24gY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHZhbHVlLCB1bml0cywgdW5pdEluZGV4ID0gMCkgewogICAgICAgIGlmICh1bml0SW5kZXggKyAxIDwgdW5pdHMubGVuZ3RoICYmIHZhbHVlID49IHVuaXRzW3VuaXRJbmRleCArIDFdLm51bVVuaXRzKSB7CiAgICAgICAgICAgIHJldHVybiBjb252ZXJ0VW5pdHNUb0h1bWFuUmVhZGFibGUodmFsdWUgLyB1bml0c1t1bml0SW5kZXggKyAxXS5udW1Vbml0cywgdW5pdHMsIHVuaXRJbmRleCArIDEpOwogICAgICAgIH0KICAgICAgICAvLyB0b1ByZWNpc2lvbigpIGhhcyB0aGUgdGVuZGVuY3kgdG8gcmV0dXJuIGEgbnVtYmVyIGluIHNjaWVudGlmaWMKICAgICAgICAvLyBub3RhdGlvbiBhbmQgY2FzdGluZyBiYWNrIHRvIGEgbnVtYmVyIGJyaW5ncyBpdCBiYWNrIHRvIG5vcm1hbCBub3RhdGlvbi4KICAgICAgICAvLyBlLmcuLAogICAgICAgIC8vICAgPiB2YWx1ZSA9IDIxMzsgdmFsdWUudG9QcmVjaXNpb24oMSkKICAgICAgICAvLyAgIDwgIjJlKzIiCiAgICAgICAgLy8gICA+IE51bWJlcih2YWx1ZS50b1ByZWNpc2lvbigxKSkKICAgICAgICAvLyAgIDwgMjAwCiAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZS50b1ByZWNpc2lvbigzKSkgKyAnICcgKyB1bml0c1t1bml0SW5kZXhdLnN5bWJvbDsKICAgIH0KICAgIGZ1bmN0aW9uIGhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKHN0YXRzKSB7CiAgICAgICAgaWYgKHN0YXRzICYmCiAgICAgICAgICAgIChzdGF0cy50b3RhbEJ5dGVzID4gMCB8fCBzdGF0cy5nZXRUb3RhbE1pY3JvcygpID4gMCB8fCBzdGF0cy5vdXRwdXRTaXplKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBHaXZlbiBhIGxpc3Qgb2Ygc3RyaW5ncywgaXQgcmV0dXJucyBhIG5ldyBsaXN0IG9mIHN0cmluZ3Mgd2l0aCB0aGUgbG9uZ2VzdAogICAgICogY29tbW9uIHByZWZpeCByZW1vdmVkLiBJZiB0aGUgY29tbW9uIHByZWZpeCBpcyBvbmUgb2YgdGhlIHN0cmluZ3MgaW4gdGhlCiAgICAgKiBsaXN0LCBpdCByZXR1cm5zIHRoZSBvcmlnaW5hbCBzdHJpbmdzLgogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVDb21tb25QcmVmaXgoc3RyaW5ncykgewogICAgICAgIGlmIChzdHJpbmdzLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0cmluZ3M7CiAgICAgICAgfQogICAgICAgIGxldCBpbmRleCA9IDA7CiAgICAgICAgbGV0IGxhcmdlc3RJbmRleCA9IDA7CiAgICAgICAgLy8gRmluZCB0aGUgc2hvcnRlc3QgbmFtZSBhY3Jvc3MgYWxsIHN0cmluZ3MuCiAgICAgICAgbGV0IG1pbkxlbmd0aCA9IGxvZGFzaC5taW4obG9kYXNoLm1hcChzdHJpbmdzLCAoc3RyKSA9PiBzdHIubGVuZ3RoKSk7CiAgICAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgbGV0IHByZWZpeGVzID0gbG9kYXNoLm1hcChzdHJpbmdzLCAoc3RyKSA9PiBzdHIuc3Vic3RyaW5nKDAsIGluZGV4KSk7CiAgICAgICAgICAgIGxldCBhbGxUaGVTYW1lID0gcHJlZml4ZXMuZXZlcnkoKHByZWZpeCwgaSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGkgPT09IDAgPyB0cnVlIDogcHJlZml4ID09PSBwcmVmaXhlc1tpIC0gMV07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoYWxsVGhlU2FtZSkgewogICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IG1pbkxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgc3RyaW5nIHdob3NlIHdob2xlIG5hbWUgaXMgYSBwcmVmaXggdG8gb3RoZXIgc3RyaW5nLgogICAgICAgICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSwgd2UgcmV0dXJuIHRoZSBvcmlnaW5hbCBsaXN0IG9mIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RyaW5nczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxhcmdlc3RJbmRleCA9IGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxvZGFzaC5tYXAoc3RyaW5ncywgKHN0cikgPT4gc3RyLnN1YnN0cmluZyhsYXJnZXN0SW5kZXgpKTsKICAgIH0KICAgIC8qKgogICAgICogR2l2ZW4gYSB0aW1lc3RhbXAgaW4gbWljcm9zZWNvbmRzLCByZXR1cm4gYSBodW1hbi1mcmllbmRseSBzdHJpbmcgZGVub3RpbmcKICAgICAqIGhvdyBsb25nIGFnbyB0aGUgdGltZXN0YW1wIHdhcy4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKHRpbWVJbk1pY3Jvc2Vjb25kcykgewogICAgICAgIHZhciB0aW1lRGlmZmVyZW5jZUluTXMgPSArbmV3IERhdGUoKSAtICtuZXcgRGF0ZSh0aW1lSW5NaWNyb3NlY29uZHMgLyAxMDAwKTsKICAgICAgICBpZiAodGltZURpZmZlcmVuY2VJbk1zIDwgMzAwMDApIHsKICAgICAgICAgICAgcmV0dXJuICdqdXN0IG5vdyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRpbWVEaWZmZXJlbmNlSW5NcyA8IDYwMDAwKSB7CiAgICAgICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWVEaWZmZXJlbmNlSW5NcyAvIDEwMDApICsgJyBzZWNvbmRzIGFnbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRpbWVEaWZmZXJlbmNlSW5NcyA8IDEyMDAwMCkgewogICAgICAgICAgICByZXR1cm4gJ2EgbWludXRlIGFnbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRpbWVEaWZmZXJlbmNlSW5NcyA8IDM2MDAwMDApIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGltZURpZmZlcmVuY2VJbk1zIC8gNjAwMDApICsgJyBtaW51dGVzIGFnbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKE1hdGguZmxvb3IodGltZURpZmZlcmVuY2VJbk1zIC8gMzYwMDAwMCkgPT0gMSkgewogICAgICAgICAgICByZXR1cm4gJ2FuIGhvdXIgYWdvJzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodGltZURpZmZlcmVuY2VJbk1zIDwgODY0MDAwMDApIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGguZmxvb3IodGltZURpZmZlcmVuY2VJbk1zIC8gMzYwMDAwMCkgKyAnIGhvdXJzIGFnbyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHRpbWVEaWZmZXJlbmNlSW5NcyA8IDE3MjgwMDAwMCkgewogICAgICAgICAgICByZXR1cm4gJ3llc3RlcmRheSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiBNYXRoLmZsb29yKHRpbWVEaWZmZXJlbmNlSW5NcyAvIDg2NDAwMDAwKSArICcgZGF5cyBhZ28nOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE1IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3QgTkFNRVNQQUNFX0RFTElNID0gJy8nOwogICAgY29uc3QgUk9PVF9OQU1FID0gJ19fcm9vdF9fJzsKICAgIGNvbnN0IEZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVggPSAnX19mdW5jdGlvbl9saWJyYXJ5X18nOwogICAgLyoqIEF0dHJpYnV0ZSBrZXkgdXNlZCBmb3Igc3RvcmluZyBhdHRyaWJ1dGVzIHRoYXQgYXJlIHRvbyBsYXJnZS4gKi8KICAgIGNvbnN0IExBUkdFX0FUVFJTX0tFWSA9ICdfdG9vX2xhcmdlX2F0dHJzJzsKICAgIC8vIFNlcGFyYXRvciBiZXR3ZWVuIHRoZSBzb3VyY2UgYW5kIHRoZSBkZXN0aW5hdGlvbiBuYW1lIG9mIHRoZSBlZGdlLgogICAgY29uc3QgRURHRV9LRVlfREVMSU0kMSA9ICctLSc7CiAgICB2YXIgR3JhcGhUeXBlOwogICAgKGZ1bmN0aW9uIChHcmFwaFR5cGUpIHsKICAgICAgICBHcmFwaFR5cGVbR3JhcGhUeXBlWyJGVUxMIl0gPSAwXSA9ICJGVUxMIjsKICAgICAgICBHcmFwaFR5cGVbR3JhcGhUeXBlWyJFTUJFRERFRCJdID0gMV0gPSAiRU1CRURERUQiOwogICAgICAgIEdyYXBoVHlwZVtHcmFwaFR5cGVbIk1FVEEiXSA9IDJdID0gIk1FVEEiOwogICAgICAgIEdyYXBoVHlwZVtHcmFwaFR5cGVbIlNFUklFUyJdID0gM10gPSAiU0VSSUVTIjsKICAgICAgICBHcmFwaFR5cGVbR3JhcGhUeXBlWyJDT1JFIl0gPSA0XSA9ICJDT1JFIjsKICAgICAgICBHcmFwaFR5cGVbR3JhcGhUeXBlWyJTSEFET1ciXSA9IDVdID0gIlNIQURPVyI7CiAgICAgICAgR3JhcGhUeXBlW0dyYXBoVHlwZVsiQlJJREdFIl0gPSA2XSA9ICJCUklER0UiOwogICAgICAgIEdyYXBoVHlwZVtHcmFwaFR5cGVbIkVER0UiXSA9IDddID0gIkVER0UiOwogICAgfSkoR3JhcGhUeXBlIHx8IChHcmFwaFR5cGUgPSB7fSkpOwogICAgdmFyIE5vZGVUeXBlOwogICAgKGZ1bmN0aW9uIChOb2RlVHlwZSkgewogICAgICAgIE5vZGVUeXBlW05vZGVUeXBlWyJNRVRBIl0gPSAwXSA9ICJNRVRBIjsKICAgICAgICBOb2RlVHlwZVtOb2RlVHlwZVsiT1AiXSA9IDFdID0gIk9QIjsKICAgICAgICBOb2RlVHlwZVtOb2RlVHlwZVsiU0VSSUVTIl0gPSAyXSA9ICJTRVJJRVMiOwogICAgICAgIE5vZGVUeXBlW05vZGVUeXBlWyJCUklER0UiXSA9IDNdID0gIkJSSURHRSI7CiAgICAgICAgTm9kZVR5cGVbTm9kZVR5cGVbIkVMTElQU0lTIl0gPSA0XSA9ICJFTExJUFNJUyI7CiAgICB9KShOb2RlVHlwZSB8fCAoTm9kZVR5cGUgPSB7fSkpOwogICAgLyoqIEluZGljYXRlcyBpZiBhIG5vZGUgaXMgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIG1haW4gZ3JhcGggd2hlbiByZW5kZXJlZC4gKi8KICAgIHZhciBJbmNsdXNpb25UeXBlOwogICAgKGZ1bmN0aW9uIChJbmNsdXNpb25UeXBlKSB7CiAgICAgICAgSW5jbHVzaW9uVHlwZVtJbmNsdXNpb25UeXBlWyJJTkNMVURFIl0gPSAwXSA9ICJJTkNMVURFIjsKICAgICAgICBJbmNsdXNpb25UeXBlW0luY2x1c2lvblR5cGVbIkVYQ0xVREUiXSA9IDFdID0gIkVYQ0xVREUiOwogICAgICAgIEluY2x1c2lvblR5cGVbSW5jbHVzaW9uVHlwZVsiVU5TUEVDSUZJRUQiXSA9IDJdID0gIlVOU1BFQ0lGSUVEIjsKICAgIH0pKEluY2x1c2lvblR5cGUgfHwgKEluY2x1c2lvblR5cGUgPSB7fSkpOwogICAgLyoqIEluZGljYXRlcyBpZiBhIHNlcmllcyBpcyB0byBiZSBncm91cGVkIGluIHRoZSBncmFwaCB3aGVuIHJlbmRlcmVkLiAqLwogICAgdmFyIFNlcmllc0dyb3VwaW5nVHlwZTsKICAgIChmdW5jdGlvbiAoU2VyaWVzR3JvdXBpbmdUeXBlKSB7CiAgICAgICAgU2VyaWVzR3JvdXBpbmdUeXBlW1Nlcmllc0dyb3VwaW5nVHlwZVsiR1JPVVAiXSA9IDBdID0gIkdST1VQIjsKICAgICAgICBTZXJpZXNHcm91cGluZ1R5cGVbU2VyaWVzR3JvdXBpbmdUeXBlWyJVTkdST1VQIl0gPSAxXSA9ICJVTkdST1VQIjsKICAgIH0pKFNlcmllc0dyb3VwaW5nVHlwZSB8fCAoU2VyaWVzR3JvdXBpbmdUeXBlID0ge30pKTsKICAgIC8qKiBBdHRyaWJ1dGUga2V5IHJlc2VydmVkIGZvciB0aGUgc2hhcGVzIG9mIHRoZSBvdXRwdXQgdGVuc29ycy4gKi8KICAgIGNvbnN0IE9VVFBVVF9TSEFQRVNfS0VZID0gJ19vdXRwdXRfc2hhcGVzJzsKICAgIC8qKiBBdHRyaWJ1dGUga2V5IHJlc2VydmVkIGZvciB0aGUgWExBIGNsdXN0ZXIgdGhhdCBhbiBvcCBydW5zIG9uLiAqLwogICAgY29uc3QgX1hMQV9DTFVTVEVSX0tFWSA9ICdfWGxhQ2x1c3Rlcic7CiAgICAvKioKICAgICAqIEEgU2xpbUdyYXBoIGlzIGluc3BpcmVkIGJ5IGdyYXBobGliLkdyYXBoLCBidXQgaGF2aW5nIG9ubHkgdGhlIGZ1bmN0aW9uYWxpdHkKICAgICAqIHRoYXQgd2UgbmVlZC4KICAgICAqLwogICAgY2xhc3MgU2xpbUdyYXBoIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5ub2RlcyA9IHt9OwogICAgICAgICAgICB0aGlzLmVkZ2VzID0gW107CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgRWxsaXBzaXNOb2RlSW1wbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBlbGxpcHNpcyBhbm5vdGF0aW9uIG5vZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbnVtTm9kZXMgVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGFubm90YXRpb25zIHRoaXMgbm9kZSByZXByZXNlbnRzLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG51bU5vZGVzKSB7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLkVMTElQU0lTOwogICAgICAgICAgICB0aGlzLmlzR3JvdXBOb2RlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuY2FyZGluYWxpdHkgPSAxOwogICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnN0YXRzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zZXROdW1Nb3JlTm9kZXMobnVtTm9kZXMpOwogICAgICAgICAgICB0aGlzLmluY2x1ZGUgPSBJbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEOwogICAgICAgIH0KICAgICAgICBzZXROdW1Nb3JlTm9kZXMobnVtTm9kZXMpIHsKICAgICAgICAgICAgdGhpcy5udW1Nb3JlTm9kZXMgPSBudW1Ob2RlczsKICAgICAgICAgICAgdGhpcy5uYW1lID0gJy4uLiAnICsgbnVtTm9kZXMgKyAnIG1vcmUnOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBsYWJlbCBvYmplY3QgZm9yIG5vZGVzIGluIHRoZSBmdWxsIGdyYXBoIGFuZCBsZWFmIG5vZGVzIGluIHRoZSByZW5kZXIKICAgICAqIGdyYXBoLgogICAgICovCiAgICBjbGFzcyBPcE5vZGVJbXBsIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IE9wIG5vZGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gcmF3Tm9kZSBUaGUgcmF3IG5vZGUuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IocmF3Tm9kZSkgewogICAgICAgICAgICB0aGlzLm9wID0gcmF3Tm9kZS5vcDsKICAgICAgICAgICAgdGhpcy5uYW1lID0gcmF3Tm9kZS5uYW1lOwogICAgICAgICAgICB0aGlzLmRldmljZSA9IHJhd05vZGUuZGV2aWNlOwogICAgICAgICAgICB0aGlzLmF0dHIgPSByYXdOb2RlLmF0dHI7CiAgICAgICAgICAgIC8vIEFuIGFycmF5IG9mIG5vcm1hbGl6ZWQgaW5wdXRzIHRoYXQgZGVub3RlIHRoZSBpbmNvbWluZyBlZGdlcyB0bwogICAgICAgICAgICAvLyB0aGUgY3VycmVudCBub2RlLiBFYWNoIGlucHV0IGNvbnRhaW5zIHRoZSBub3JtYWxpemVkIG5hbWUgb2YgdGhlCiAgICAgICAgICAgIC8vIHNvdXJjZSBub2RlLCB3aGV0aGVyIGl0IGhhcyBhIG51bWJlciBwYXJ0IGFuZCB3aGV0aGVyIGl0IGlzIGEKICAgICAgICAgICAgLy8gY29udHJvbCBkZXBlbmRlbmN5LgogICAgICAgICAgICB0aGlzLmlucHV0cyA9IG5vcm1hbGl6ZUlucHV0cyhyYXdOb2RlLmlucHV0KTsKICAgICAgICAgICAgdGhpcy5vdXRwdXRTaGFwZXMgPSBleHRyYWN0T3V0cHV0U2hhcGVzKHJhd05vZGUuYXR0cik7CiAgICAgICAgICAgIHRoaXMueGxhQ2x1c3RlciA9IGV4dHJhY3RYbGFDbHVzdGVyKHJhd05vZGUuYXR0cik7CiAgICAgICAgICAgIHRoaXMuY29tcGF0aWJsZSA9IGZhbHNlOwogICAgICAgICAgICAvLyBhZGRpdGlvbmFsIHByb3BlcnRpZXMKICAgICAgICAgICAgdGhpcy50eXBlID0gTm9kZVR5cGUuT1A7CiAgICAgICAgICAgIHRoaXMuaXNHcm91cE5vZGUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jYXJkaW5hbGl0eSA9IDE7CiAgICAgICAgICAgIHRoaXMuaW5FbWJlZGRpbmdzID0gW107CiAgICAgICAgICAgIHRoaXMub3V0RW1iZWRkaW5ncyA9IFtdOwogICAgICAgICAgICB0aGlzLnBhcmVudE5vZGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmluY2x1ZGUgPSBJbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEOwogICAgICAgICAgICB0aGlzLm93bmluZ1NlcmllcyA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY3JlYXRlTWV0YW5vZGUobmFtZSwgb3B0ID0ge30pIHsKICAgICAgICByZXR1cm4gbmV3IE1ldGFub2RlSW1wbChuYW1lLCBvcHQpOwogICAgfQogICAgLyoqCiAgICAgKiBKb2lucyB0aGUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhdHMgZmlsZSAobWVtb3J5LCBjb21wdXRlIHRpbWUpIHdpdGggdGhlCiAgICAgKiBncmFwaCBpbmZvcm1hdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gam9pblN0YXRzSW5mb1dpdGhHcmFwaChncmFwaCwgc3RhdHMsIGRldmljZXNGb3JTdGF0cykgewogICAgICAgIC8vIFJlc2V0IHN0YXRzIGZvciBlYWNoIG5vZGUuCiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGgubm9kZXMsIChub2RlKSA9PiB7CiAgICAgICAgICAgIG5vZGUuc3RhdHMgPSBudWxsOwogICAgICAgIH0pOwogICAgICAgIGxvZGFzaC5lYWNoKHN0YXRzLmRldl9zdGF0cywgKGRldlN0YXRzKSA9PiB7CiAgICAgICAgICAgIC8vIElnbm9yZSBkZXZpY2VzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZC4KICAgICAgICAgICAgaWYgKGRldmljZXNGb3JTdGF0cyAmJiAhZGV2aWNlc0ZvclN0YXRzW2RldlN0YXRzLmRldmljZV0pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsb2Rhc2guZWFjaChkZXZTdGF0cy5ub2RlX3N0YXRzLCAobm9kZVN0YXRzKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBMb29rdXAgdGhlIG5vZGUgaW4gdGhlIGdyYXBoIGJ5IGl0cyBvcmlnaW5hbCBuYW1lLCBlLmcuIEEvQi4gSWYgbm90CiAgICAgICAgICAgICAgICAvLyBmb3VuZCwgbG9va3VwIGJ5IHRoZSByZXdyaXR0ZW4gbmFtZSBBL0IvKEIpIGluIGNhc2UgdGhlIG5hbWUgaXMgYm90aAogICAgICAgICAgICAgICAgLy8gYSBuYW1lc3BhY2UgYW5kIGEgbm9kZSBuYW1lLgogICAgICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gbm9kZVN0YXRzLm5vZGVfbmFtZSBpbiBncmFwaC5ub2RlcwogICAgICAgICAgICAgICAgICAgID8gbm9kZVN0YXRzLm5vZGVfbmFtZQogICAgICAgICAgICAgICAgICAgIDogZ2V0U3RyaWN0TmFtZShub2RlU3RhdHMubm9kZV9uYW1lKTsKICAgICAgICAgICAgICAgIC8vIENvdWxkbid0IGZpbmQgYSBtYXRjaGluZyBub2RlLgogICAgICAgICAgICAgICAgaWYgKCEobm9kZU5hbWUgaW4gZ3JhcGgubm9kZXMpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgYnl0ZXMgdXNlZC4KICAgICAgICAgICAgICAgIGxldCB0b3RhbEJ5dGVzID0gMDsKICAgICAgICAgICAgICAgIGlmIChub2RlU3RhdHMubWVtb3J5KSB7CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZVN0YXRzLm1lbW9yeSwgKGFsbG9jKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvYy50b3RhbF9ieXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG9jLnRvdGFsX2J5dGVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXMgKz0gTnVtYmVyKGFsbG9jLnRvdGFsX2J5dGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2lnbm9yaW5nIG5lZ2F0aXZlIG1lbW9yeSBhbGxvY2F0aW9uIGZvciAnICsgbm9kZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRzbGludDplbmFibGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IG91dHB1dFNpemUgPSBudWxsOwogICAgICAgICAgICAgICAgaWYgKG5vZGVTdGF0cy5vdXRwdXQpIHsKICAgICAgICAgICAgICAgICAgICBvdXRwdXRTaXplID0gbG9kYXNoLm1hcChub2RlU3RhdHMub3V0cHV0LCAob3V0cHV0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsb2Rhc2gubWFwKG91dHB1dC50ZW5zb3JfZGVzY3JpcHRpb24uc2hhcGUuZGltLCAoZGltKSA9PiBOdW1iZXIoZGltLnNpemUpKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdyYXBoLm5vZGVzW25vZGVOYW1lXS5kZXZpY2UgPSBkZXZTdGF0cy5kZXZpY2U7CiAgICAgICAgICAgICAgICBpZiAoZ3JhcGgubm9kZXNbbm9kZU5hbWVdLnN0YXRzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBncmFwaC5ub2Rlc1tub2RlTmFtZV0uc3RhdHMgPSBuZXcgTm9kZVN0YXRzKG91dHB1dFNpemUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZ3JhcGgubm9kZXNbbm9kZU5hbWVdLnN0YXRzLmFkZEJ5dGVzQWxsb2NhdGlvbih0b3RhbEJ5dGVzKTsKICAgICAgICAgICAgICAgIGlmIChub2RlU3RhdHMuYWxsX2VuZF9yZWxfbWljcm9zKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVTdGF0cy5hbGxfZW5kX3JlbF9taWNyb3MgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLm5vZGVzW25vZGVOYW1lXS5zdGF0cy5hZGRFeGVjdXRpb25UaW1lKG5vZGVTdGF0cy5hbGxfc3RhcnRfbWljcm9zLCBub2RlU3RhdHMuYWxsX3N0YXJ0X21pY3JvcyArIG5vZGVTdGF0cy5hbGxfZW5kX3JlbF9taWNyb3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyogdHNsaW50OmRpc2FibGUgKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2lnbm9yaW5nIG5lZ2F0aXZlIHJ1bnRpbWUgZm9yICcgKyBub2RlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qIHRzbGludDplbmFibGUgKi8KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgY2xhc3MgTWV0YW5vZGVJbXBsIHsKICAgICAgICAvKiogQSBsYWJlbCBvYmplY3QgZm9yIG1ldGEtbm9kZXMgaW4gdGhlIGdyYXBoIGhpZXJhcmNoeSAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5hbWUsIG9wdCA9IHt9KSB7CiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgIHRoaXMudHlwZSA9IE5vZGVUeXBlLk1FVEE7CiAgICAgICAgICAgIC8qKiBudW1iZXIgb2YgbGV2ZWxzIHVuZGVyIHRoaXMgZ3JvdXAgKi8KICAgICAgICAgICAgdGhpcy5kZXB0aCA9IDE7CiAgICAgICAgICAgIHRoaXMuaXNHcm91cE5vZGUgPSB0cnVlOwogICAgICAgICAgICAvKiogIyBvZiBsZWFmIG5vZGVzIChpbmNsdWRpbmcgZW1iZWRkZWQgb25lcykgKi8KICAgICAgICAgICAgdGhpcy5jYXJkaW5hbGl0eSA9IDA7CiAgICAgICAgICAgIC8qKiBncmFwaCBjb250YWlucyBtZXRhbm9kZXMsIG5vZGVzLCBlZGdlcwogICAgICAgICAgICAgKiBhbmQgbWV0YWVkZ2VzIGZvciBtYWluIGl0ZW1zIHdpdGhpbiB0aGlzIG1ldGFub2RlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm1ldGFncmFwaCA9IGNyZWF0ZUdyYXBoKG5hbWUsIEdyYXBoVHlwZS5NRVRBLCBvcHQpOwogICAgICAgICAgICAvKiogYnJpZGdlZ3JhcGggbXVzdCBiZSBjb25zdHJ1Y3RlZCBsYXppbHktc2VlIGhpZXJhcmNoeS5nZXRCcmlkZ2VncmFwaCgpICovCiAgICAgICAgICAgIHRoaXMuYnJpZGdlZ3JhcGggPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBkaWN0aW9uYXJ5IHRoYXQgY291bnQgb3BzIHR5cGUgb2Ygbm9kZXMgaW4gdGhpcyBtZXRhbm9kZQogICAgICAgICAgICAgKiAob3AgdHlwZSA9PiBjb3VudCkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9wSGlzdG9ncmFtID0ge307CiAgICAgICAgICAgIHRoaXMuZGV2aWNlSGlzdG9ncmFtID0ge307CiAgICAgICAgICAgIHRoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbSA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0gPSB7IGNvbXBhdGlibGU6IDAsIGluY29tcGF0aWJsZTogMCB9OwogICAgICAgICAgICAvKiogdW5pcXVlIGlkIGZvciBhIG1ldGFub2RlIG9mIHNpbWlsYXIgc3ViZ3JhcGggKi8KICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZUlkID0gbnVsbDsKICAgICAgICAgICAgLyoqIE1ldGFub2RlIHdoaWNoIGNvbnRhaW5zIHRoaXMgbm9kZSwgaWYgYW55ICovCiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuaGFzTm9uQ29udHJvbEVkZ2VzID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuaW5jbHVkZSA9IEluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQ7CiAgICAgICAgICAgIHRoaXMuYXNzb2NpYXRlZEZ1bmN0aW9uID0gJyc7CiAgICAgICAgfQogICAgICAgIGdldEZpcnN0Q2hpbGQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm1ldGFncmFwaC5ub2RlKHRoaXMubWV0YWdyYXBoLm5vZGVzKClbMF0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBvcCBub2RlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWV0YW5vZGUuCiAgICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBtZXRhbm9kZSBpcyAnc2dkJywgdGhlIGFzc29jaWF0ZWQKICAgICAgICAgKiBvcCBub2RlIGlzIHNnZC8oc2dkKS4KICAgICAgICAgKi8KICAgICAgICBnZXRSb290T3AoKSB7CiAgICAgICAgICAgIGxldCBuYW1lU3BsaXQgPSB0aGlzLm5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgbGV0IHJvb3RPcE5hbWUgPSB0aGlzLm5hbWUgKyAnLygnICsgbmFtZVNwbGl0W25hbWVTcGxpdC5sZW5ndGggLSAxXSArICcpJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWV0YWdyYXBoLm5vZGUocm9vdE9wTmFtZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybiBhbiBhcnJheSBvZiB0aGUgbmFtZXMgb2YgYWxsIHRoZSBsZWF2ZXMgKG5vbi1Hcm91cE5vZGVzKSBpbnNpZGUKICAgICAgICAgKiB0aGlzIG1ldGFub2RlLiBUaGlzIHBlcmZvcm1zIGEgYnJlYWR0aC1maXJzdCBzZWFyY2ggb2YgdGhlIHRyZWUsIHNvCiAgICAgICAgICogaW1tZWRpYXRlIGNoaWxkIGxlYXZlcyB3aWxsIGFwcGVhciBlYXJsaWVyIGluIHRoZSBvdXRwdXQgYXJyYXkgdGhhbgogICAgICAgICAqIGRlc2NlbmRhbnQgbGVhdmVzLgogICAgICAgICAqLwogICAgICAgIGxlYXZlcygpIHsKICAgICAgICAgICAgbGV0IGxlYXZlcyA9IFtdOwogICAgICAgICAgICBsZXQgcXVldWUgPSBbdGhpc107CiAgICAgICAgICAgIGxldCBtZXRhZ3JhcGg7IC8vIERlZmluZWQgaGVyZSBkdWUgdG8gYSBsaW1pdGF0aW9uIG9mIEVTNi0+NSBjb21waWxhdGlvbi4KICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBxdWV1ZS5zaGlmdCgpOwogICAgICAgICAgICAgICAgaWYgKG5vZGUuaXNHcm91cE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICBtZXRhZ3JhcGggPSBub2RlLm1ldGFncmFwaDsKICAgICAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChtZXRhZ3JhcGgubm9kZXMoKSwgKG5hbWUpID0+IHF1ZXVlLnB1c2gobWV0YWdyYXBoLm5vZGUobmFtZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxlYXZlcy5wdXNoKG5vZGUubmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxlYXZlczsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVNZXRhZWRnZSh2LCB3KSB7CiAgICAgICAgcmV0dXJuIG5ldyBNZXRhZWRnZUltcGwodiwgdyk7CiAgICB9CiAgICAvKioKICAgICAqIEEgbGFiZWwgb2JqZWN0IGZvciBlZGdlcyBiZXR3ZWVuIG1ldGFub2RlcyBvZiBzdWJncmFwaHMgaW4gdGhlIHJlbmRlciBncmFwaC4KICAgICAqLwogICAgY2xhc3MgTWV0YWVkZ2VJbXBsIHsKICAgICAgICBjb25zdHJ1Y3Rvcih2LCB3KSB7CiAgICAgICAgICAgIHRoaXMudiA9IHY7CiAgICAgICAgICAgIHRoaXMudyA9IHc7CiAgICAgICAgICAgIHRoaXMuYmFzZUVkZ2VMaXN0ID0gW107CiAgICAgICAgICAgIHRoaXMuaW5ib3VuZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMubnVtUmVndWxhckVkZ2VzID0gMDsKICAgICAgICAgICAgdGhpcy5udW1Db250cm9sRWRnZXMgPSAwOwogICAgICAgICAgICB0aGlzLm51bVJlZkVkZ2VzID0gMDsKICAgICAgICAgICAgdGhpcy50b3RhbFNpemUgPSAwOwogICAgICAgIH0KICAgICAgICBhZGRCYXNlRWRnZShlZGdlLCBoKSB7CiAgICAgICAgICAgIHRoaXMuYmFzZUVkZ2VMaXN0LnB1c2goZWRnZSk7CiAgICAgICAgICAgIGlmIChlZGdlLmlzQ29udHJvbERlcGVuZGVuY3kpIHsKICAgICAgICAgICAgICAgIHRoaXMubnVtQ29udHJvbEVkZ2VzICs9IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLm51bVJlZ3VsYXJFZGdlcyArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlZGdlLmlzUmVmZXJlbmNlRWRnZSkgewogICAgICAgICAgICAgICAgdGhpcy5udW1SZWZFZGdlcyArPSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIHRlbnNvciBmbG93aW5nIHRocm91Z2ggdGhpcwogICAgICAgICAgICAvLyBiYXNlIGVkZ2UuCiAgICAgICAgICAgIHRoaXMudG90YWxTaXplICs9IE1ldGFlZGdlSW1wbC5jb21wdXRlU2l6ZU9mRWRnZShlZGdlLCBoKTsKICAgICAgICAgICAgaC5tYXhNZXRhRWRnZVNpemUgPSBNYXRoLm1heChoLm1heE1ldGFFZGdlU2l6ZSwgdGhpcy50b3RhbFNpemUpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgY29tcHV0ZVNpemVPZkVkZ2UoZWRnZSwgaCkgewogICAgICAgICAgICBsZXQgb3BOb2RlID0gaC5ub2RlKGVkZ2Uudik7CiAgICAgICAgICAgIGlmICghb3BOb2RlLm91dHB1dFNoYXBlcykgewogICAgICAgICAgICAgICAgLy8gTm8gc2hhcGUgaW5mb3JtYXRpb24uIEFzc3N1bWUgYSBzaW5nbGUgbnVtYmVyLiBUaGlzIGdpdmVzCiAgICAgICAgICAgICAgICAvLyBhIGxvd2VyIGJvdW5kIGZvciB0aGUgdG90YWwgc2l6ZS4KICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGguaGFzU2hhcGVJbmZvID0gdHJ1ZTsKICAgICAgICAgICAgLy8gU3VtIHRoZSBzaXplcyBvZiBhbGwgb3V0cHV0IHRlbnNvcnMuCiAgICAgICAgICAgIC8vIFRPRE8oc3RlcGhhbndsZWUpOiBVc2UgT2JqZWN0LnZhbHVlcyBhZnRlciBlczIwMTcuCiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5rZXlzKG9wTm9kZS5vdXRwdXRTaGFwZXMpCiAgICAgICAgICAgICAgICAubWFwKChrKSA9PiBvcE5vZGUub3V0cHV0U2hhcGVzW2tdKQogICAgICAgICAgICAgICAgLm1hcCgoc2hhcGUpID0+IHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzaGFwZSBpcyB1bmtub3duLCB0cmVhdCBpdCBhcyAxIHdoZW4gY29tcHV0aW5nCiAgICAgICAgICAgICAgICAvLyB0b3RhbCBzaXplLiBUaGlzIGdpdmVzIGEgbG93ZXIgYm91bmQgZm9yIHRoZSB0b3RhbCBzaXplLgogICAgICAgICAgICAgICAgaWYgKHNoYXBlID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE11bHRpcGx5IGFsbCBzaGFwZXMgdG8gZ2V0IHRoZSB0b3RhbCBzaXplIG9mIHRoZSB0ZW5zb3IuCiAgICAgICAgICAgICAgICAvLyBFLmcuIFRoZSB0b3RhbCBzaXplIG9mIFs0LCAyLCAxXSBpcyA0ICogMiAqIDEuCiAgICAgICAgICAgICAgICByZXR1cm4gc2hhcGUucmVkdWNlKChhY2N1bXVsYXRlZCwgY3VyclNpemUpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIHBhcnRpY3VsYXIgZGltZW5zaW9uIGlzIHVua25vd24sIHRyZWF0CiAgICAgICAgICAgICAgICAgICAgLy8gaXQgYXMgMSB3aGVuIGNvbXB1dGluZyB0b3RhbCBzaXplLiBUaGlzIGdpdmVzIGEgbG93ZXIgYm91bmQKICAgICAgICAgICAgICAgICAgICAvLyBmb3IgdGhlIHRvdGFsIHNpemUuCiAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJTaXplID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyU2l6ZSA9IDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBhY2N1bXVsYXRlZCAqIGN1cnJTaXplOwogICAgICAgICAgICAgICAgfSwgMSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gbG9kYXNoLnN1bSh2YWx1ZXMpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcmllc05vZGUocHJlZml4LCBzdWZmaXgsIHBhcmVudCwgY2x1c3RlcklkLCBuYW1lLCBncmFwaE9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gbmV3IFNlcmllc05vZGVJbXBsKHByZWZpeCwgc3VmZml4LCBwYXJlbnQsIGNsdXN0ZXJJZCwgbmFtZSwgZ3JhcGhPcHRpb25zKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFNlcmllc05vZGVOYW1lKHByZWZpeCwgc3VmZml4LCBwYXJlbnQsIHN0YXJ0SWQsIGVuZElkKSB7CiAgICAgICAgbGV0IG51bVJlcHJlc2VudGF0aW9uID0gdHlwZW9mIHN0YXJ0SWQgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBlbmRJZCAhPT0gJ3VuZGVmaW5lZCcKICAgICAgICAgICAgPyAnWycgKyBzdGFydElkICsgJy0nICsgZW5kSWQgKyAnXScKICAgICAgICAgICAgOiAnIyc7CiAgICAgICAgbGV0IHBhdHRlcm4gPSBwcmVmaXggKyBudW1SZXByZXNlbnRhdGlvbiArIHN1ZmZpeDsKICAgICAgICByZXR1cm4gKHBhcmVudCA/IHBhcmVudCArICcvJyA6ICcnKSArIHBhdHRlcm47CiAgICB9CiAgICBjbGFzcyBTZXJpZXNOb2RlSW1wbCB7CiAgICAgICAgY29uc3RydWN0b3IocHJlZml4LCBzdWZmaXgsIHBhcmVudCwgY2x1c3RlcklkLCBuYW1lLCBncmFwaE9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZSB8fCBnZXRTZXJpZXNOb2RlTmFtZShwcmVmaXgsIHN1ZmZpeCwgcGFyZW50KTsKICAgICAgICAgICAgdGhpcy50eXBlID0gTm9kZVR5cGUuU0VSSUVTOwogICAgICAgICAgICB0aGlzLmhhc0xvb3AgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5wcmVmaXggPSBwcmVmaXg7CiAgICAgICAgICAgIHRoaXMuc3VmZml4ID0gc3VmZml4OwogICAgICAgICAgICB0aGlzLmNsdXN0ZXJJZCA9IGNsdXN0ZXJJZDsKICAgICAgICAgICAgdGhpcy5pZHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHRoaXMuaXNHcm91cE5vZGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmNhcmRpbmFsaXR5ID0gMDsKICAgICAgICAgICAgdGhpcy5tZXRhZ3JhcGggPSBjcmVhdGVHcmFwaChuYW1lLCBHcmFwaFR5cGUuU0VSSUVTLCBncmFwaE9wdGlvbnMpOwogICAgICAgICAgICAvLyBicmlkZ2VncmFwaCBtdXN0IGJlIGNvbnN0cnVjdGVkIGxhemlseS1zZWUgaGllcmFyY2h5LmdldEJyaWRnZWdyYXBoKCkKICAgICAgICAgICAgdGhpcy5icmlkZ2VncmFwaCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZGV2aWNlSGlzdG9ncmFtID0ge307CiAgICAgICAgICAgIHRoaXMueGxhQ2x1c3Rlckhpc3RvZ3JhbSA9IHt9OwogICAgICAgICAgICB0aGlzLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0gPSB7IGNvbXBhdGlibGU6IDAsIGluY29tcGF0aWJsZTogMCB9OwogICAgICAgICAgICB0aGlzLmhhc05vbkNvbnRyb2xFZGdlcyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmluY2x1ZGUgPSBJbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRXh0cmFjdHMgdGhlIHNoYXBlcyBvZiB0aGUgb3V0cHV0IHRlbnNvcnMgZnJvbSB0aGUgYXR0ciBwcm9wZXJ0eSBpbiB0aGUKICAgICAqIG5vZGUgcHJvdG8uCiAgICAgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkKICAgIGZ1bmN0aW9uIGV4dHJhY3RPdXRwdXRTaGFwZXMoYXR0cikgewogICAgICAgIC8vIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhlIG91dHB1dCB0ZW5zb3JzLgogICAgICAgIGlmICghYXR0cikgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxldCB7IGtleSwgdmFsdWUgfSA9IGF0dHJbaV07CiAgICAgICAgICAgIGlmIChrZXkgPT09IE9VVFBVVF9TSEFQRVNfS0VZKSB7CiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLmxpc3Quc2hhcGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgT1VUUFVUX1NIQVBFU19LRVkgbGFja3MgYSB2YWx1ZS4gV2Uga25vdyBub3RoaW5nIGFib3V0IHRoZSBzaGFwZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE1hcCBhbGwgb3V0cHV0IHRlbnNvcnMgaW50byBhcnJheSBvZiBudW1iZXJzIGRlbm90aW5nIHRoZWlyIHNoYXBlLgogICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHZhbHVlLmxpc3Quc2hhcGUubWFwKChzaGFwZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChzaGFwZS51bmtub3duX3JhbmspIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBvdXRwdXQgdGVuc29yIGlzIG9mIHVua25vd24gcmFuay4gV2UgZG9uJ3Qga25vdyBpZiBpdCBpcyBhCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNjYWxhciwgb3IgYSB0ZW5zb3IsIG9yIG9mIHdoYXQgc2hhcGUgaXQgaXMuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoc2hhcGUuZGltID09IG51bGwgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHNoYXBlLmRpbS5sZW5ndGggPT09IDEgJiYgc2hhcGUuZGltWzBdLnNpemUgPT0gbnVsbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBvdXRwdXQgdGVuc29yIGlzIGEgc2NhbGFyLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgb3V0cHV0IHRlbnNvciBoYXMgYSBrbm93biByYW5rLiBNYXAgZWFjaCBkaW1lbnNpb24gc2l6ZQogICAgICAgICAgICAgICAgICAgIC8vIGludG8gYSBudW1iZXIuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNoYXBlLmRpbS5tYXAoKGRpbSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAvLyBTaXplIGNhbiBiZSAtMSBpZiB0aGlzIHBhcnRpY3VsYXIgZGltZW5zaW9uIGlzIHVua25vd24uCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkaW0uc2l6ZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgYWxyZWFkeSBwcm9jZXNzZWQgaXQsIHJlbW92ZSB0aGUgZW50cnkgZnJvbSB0aGUgYXR0cmlidXRlCiAgICAgICAgICAgICAgICAvLyBsaXN0IChzYXZlcyBtZW1vcnkpLgogICAgICAgICAgICAgICAgYXR0ci5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFdlIGRpZG4ndCBmaW5kIE9VVFBVVF9TSEFQRVNfS0VZIGluIGF0dHJpYnV0ZXMsIHNvIHdlIGRvbid0IGtub3cgYW55dGhpbmcKICAgICAgICAvLyBhYm91dCB0aGUgb3V0cHV0IHRlbnNvcnMuCiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEV4dHJhY3RzIHRoZSBYTEEgQ2x1c3RlciB0aGF0IGFuIG9wIHJ1bnMgb24gZnJvbSB0aGUgYXR0cnMgb2YgdGhlIE9wTm9kZS4KICAgICAqIEBwYXJhbSBhdHRyIFRoZSBhdHRyIHByb3BlcnR5LgogICAgICogQHJldHVybiBBIHN0cmluZyB0aGF0IGlzIHRoZSBuYW1lIG9mIHRoZSBjbHVzdGVyLiBPciBudWxsIGlmIGl0IGNvdWxkIG5vdCBiZQogICAgICogICAgIGRldGVybWluZWQuCiAgICAgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkKICAgIGZ1bmN0aW9uIGV4dHJhY3RYbGFDbHVzdGVyKGF0dHIpIHsKICAgICAgICBpZiAoIWF0dHIpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBmb3IgWExBIGNsdXN0ZXIgaWYgdGhlcmUgaXMgb25lLgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0ci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAoYXR0cltpXS5rZXkgPT09IF9YTEFfQ0xVU1RFUl9LRVkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhdHRyW2ldLnZhbHVlWydzJ10gfHwgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogTm9ybWFsaXplcyB0aGUgaW5wdXRzIGFuZCBleHRyYWN0cyBhc3NvY2lhdGVkIG1ldGFkYXRhOgogICAgICogMSkgSW5wdXRzIGNhbiBjb250YWluIGEgY29sb24gZm9sbG93ZWQgYnkgYSBzdWZmaXggb2YgY2hhcmFjdGVycy4KICAgICAqICAgIFRoYXQgc3VmZml4IG1heSBiZSBhIHNpbmdsZSBudW1iZXIgKGUuZy4gaW5wdXROYW1lOjEpIG9yIHNldmVyYWwgd29yZAogICAgICogICAgY2hhcmFjdGVycyBzZXBhcmF0ZWQgZnJvbSBhIG51bWJlciBieSBhIGNvbG9uIChlLmcuIGlucHV0TmFtZTpmb286MSkuIFRoZQogICAgICogICAgbGF0dGVyIGNhc2UgaXMgdXNlZCB0byBkZW5vdGUgaW5wdXRzIGFuZCBvdXRwdXRzIG9mIGZ1bmN0aW9ucy4KICAgICAqIDIpIENvbnRyb2wgZGVwZW5kZW5jeSBpbnB1dHMgY29udGFpbiBjYXJldCBhdCB0aGUgYmVnaW5uaW5nIGFuZCB3ZQogICAgICogICAgcmVtb3ZlIHRoaXMgYW5kIGFubm90YXRlIHRoZSBlZGdlIGFzIGEgY29udHJvbCBkZXBlbmRlbmN5LgogICAgICogQHBhcmFtIGlucHV0cyBBcnJheSBvZiB1bm5vcm1hbGl6ZWQgbmFtZXMgb2YgaW5wdXQgbm9kZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUlucHV0cyhpbnB1dHMpIHsKICAgICAgICBsZXQgbm9ybWFsaXplZElucHV0cyA9IFtdOwogICAgICAgIGxvZGFzaC5lYWNoKGlucHV0cywgKGlucHV0TmFtZSkgPT4gewogICAgICAgICAgICBsZXQgaXNDb250cm9sRGVwZW5kZW5jeSA9IGlucHV0TmFtZVswXSA9PT0gJ14nOwogICAgICAgICAgICBpZiAoaXNDb250cm9sRGVwZW5kZW5jeSkgewogICAgICAgICAgICAgICAgLy8gVGhlIGNhcmF0IG1lcmVseSBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlucHV0IGlzIGEgY29udHJvbCBkZXBlbmRlbmN5LgogICAgICAgICAgICAgICAgLy8gSXQgc2hvdWxkIG5vdCBiZSBwYXJ0IG9mIHRoZSBuYW1lLgogICAgICAgICAgICAgICAgaW5wdXROYW1lID0gaW5wdXROYW1lLnN1YnN0cmluZygxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgbmFtZSA9IGlucHV0TmFtZTsKICAgICAgICAgICAgbGV0IG91dHB1dFRlbnNvcktleSA9ICcwJzsKICAgICAgICAgICAgbGV0IG1hdGNoID0gaW5wdXROYW1lLm1hdGNoKC8oLiopOihcdys6XGQrKSQvKTsKICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgb3V0cHV0IHN0cmluZyBjb25zaXN0cyBvZiBzZXZlcmFsIGNoYXJhY3RlcnMgYW5kIGEgbnVtYmVyIHNlcGFyYXRlZAogICAgICAgICAgICAgICAgLy8gYnkgYSBjb2xvbi4KICAgICAgICAgICAgICAgIG5hbWUgPSBtYXRjaFsxXTsKICAgICAgICAgICAgICAgIG91dHB1dFRlbnNvcktleSA9IG1hdGNoWzJdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbWF0Y2ggPSBpbnB1dE5hbWUubWF0Y2goLyguKik6KFxkKykkLyk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgb3V0cHV0IHN0cmluZyBjb25zaXN0cyBvZiBhIHNpbmdsZSBudW1iZXIuCiAgICAgICAgICAgICAgICAgICAgbmFtZSA9IG1hdGNoWzFdOwogICAgICAgICAgICAgICAgICAgIG91dHB1dFRlbnNvcktleSA9IG1hdGNoWzJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub3JtYWxpemVkSW5wdXRzLmxlbmd0aCA9PT0gMCB8fAogICAgICAgICAgICAgICAgbmFtZSAhPT0gbm9ybWFsaXplZElucHV0c1tub3JtYWxpemVkSW5wdXRzLmxlbmd0aCAtIDFdLm5hbWUpIHsKICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRJbnB1dHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgICAgICBvdXRwdXRUZW5zb3JLZXk6IG91dHB1dFRlbnNvcktleSwKICAgICAgICAgICAgICAgICAgICBpc0NvbnRyb2xEZXBlbmRlbmN5OiBpc0NvbnRyb2xEZXBlbmRlbmN5LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gbm9ybWFsaXplZElucHV0czsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZEVkZ2VUb0dyYXBoKGdyYXBoLCBpbnB1dE5hbWUsIG91dHB1dE5vZGUsIGlucHV0LCBwYXJhbXMsIGluZGV4KSB7CiAgICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9vcHMgaW4gdGhlIGdyYXBoLgogICAgICAgIGlmIChpbnB1dE5hbWUgPT09IG91dHB1dE5vZGUubmFtZSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIENoZWNrIGlmIHRoaXMgb3AgdHlwZSBhbmQgaW5wdXQgbnVtYmVyIGNvcnJlc3BvbmRzIHRvIGEKICAgICAgICAvLyByZWZlcmVuY2UgZWRnZSB1c2luZyB0aGUgcmVmRWRnZXMgZGljdGlvbmFyeSBpbiB0aGUgcGFyYW1zLgogICAgICAgIGxldCBpc1JlZkVkZ2UgPSBwYXJhbXMucmVmRWRnZXNbb3V0cHV0Tm9kZS5vcCArICcgJyArIGluZGV4XSA9PT0gdHJ1ZTsKICAgICAgICBncmFwaC5lZGdlcy5wdXNoKHsKICAgICAgICAgICAgdjogaW5wdXROYW1lLAogICAgICAgICAgICB3OiBvdXRwdXROb2RlLm5hbWUsCiAgICAgICAgICAgIG91dHB1dFRlbnNvcktleTogaW5wdXQub3V0cHV0VGVuc29yS2V5LAogICAgICAgICAgICBpc0NvbnRyb2xEZXBlbmRlbmN5OiBpbnB1dC5pc0NvbnRyb2xEZXBlbmRlbmN5LAogICAgICAgICAgICBpc1JlZmVyZW5jZUVkZ2U6IGlzUmVmRWRnZSwKICAgICAgICB9KTsKICAgIH0KICAgIGNvbnN0IERlZmF1bHRCdWlsZFBhcmFtcyA9IHsKICAgICAgICBlbmFibGVFbWJlZGRpbmc6IHRydWUsCiAgICAgICAgaW5FbWJlZGRpbmdUeXBlczogWydDb25zdCddLAogICAgICAgIG91dEVtYmVkZGluZ1R5cGVzOiBbJ15bYS16QS1aXStTdW1tYXJ5JCddLAogICAgICAgIC8vIFRoaXMgaXMgdGhlIHdoaXRlbGlzdCBvZiBpbnB1dHMgb24gb3AgdHlwZXMgdGhhdCBhcmUgY29uc2lkZXJlZAogICAgICAgIC8vIHJlZmVyZW5jZSBlZGdlcy4gIkFzc2lnbiAwIiBpbmRpY2F0ZXMgdGhhdCB0aGUgZmlyc3QgaW5wdXQgdG8KICAgICAgICAvLyBhbiBPcE5vZGUgd2l0aCBvcGVyYXRpb24gdHlwZSAiQXNzaWduIiBpcyBhIHJlZmVyZW5jZSBlZGdlLgogICAgICAgIHJlZkVkZ2VzOiB7CiAgICAgICAgICAgICdBc3NpZ24gMCc6IHRydWUsCiAgICAgICAgICAgICdBc3NpZ25BZGQgMCc6IHRydWUsCiAgICAgICAgICAgICdBc3NpZ25TdWIgMCc6IHRydWUsCiAgICAgICAgICAgICdhc3NpZ24gMCc6IHRydWUsCiAgICAgICAgICAgICdhc3NpZ25fYWRkIDAnOiB0cnVlLAogICAgICAgICAgICAnYXNzaWduX3N1YiAwJzogdHJ1ZSwKICAgICAgICAgICAgJ2NvdW50X3VwX3RvIDAnOiB0cnVlLAogICAgICAgICAgICAnU2NhdHRlckFkZCAwJzogdHJ1ZSwKICAgICAgICAgICAgJ1NjYXR0ZXJTdWIgMCc6IHRydWUsCiAgICAgICAgICAgICdTY2F0dGVyVXBkYXRlIDAnOiB0cnVlLAogICAgICAgICAgICAnc2NhdHRlcl9hZGQgMCc6IHRydWUsCiAgICAgICAgICAgICdzY2F0dGVyX3N1YiAwJzogdHJ1ZSwKICAgICAgICAgICAgJ3NjYXR0ZXJfdXBkYXRlIDAnOiB0cnVlLAogICAgICAgIH0sCiAgICB9OwogICAgZnVuY3Rpb24gYnVpbGQoZ3JhcGhEZWYsIHBhcmFtcywgdHJhY2tlcikgewogICAgICAgIC8qKgogICAgICAgICAqIEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgZWFjaCBpbi1lbWJlZGRpbmcgbm9kZSBuYW1lIHRvIHRoZSBub2RlCiAgICAgICAgICogb2JqZWN0LgogICAgICAgICAqLwogICAgICAgIGxldCBpbkVtYmVkZGluZyA9IHt9OwogICAgICAgIC8qKgogICAgICAgICAqIEEgZGljdGlvbmFyeSB0aGF0IG1hcHMgZWFjaCBvdXQtZW1iZWRkaW5nIG5vZGUgbmFtZSB0byB0aGUgbm9kZQogICAgICAgICAqIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBsZXQgb3V0RW1iZWRkaW5nID0ge307CiAgICAgICAgLyoqCiAgICAgICAgICogQSBkaWN0aW9uYXJ5IHRoYXQgbWFwcyBlYWNoIG5vZGUgbmFtZSB0byBhbiBhcnJheSBvZiB0aGUgbm9kZSdzCiAgICAgICAgICogb3V0LWVtYmVkZGluZyBub2RlIGxhYmVsIG9iamVjdHMuCiAgICAgICAgICovCiAgICAgICAgbGV0IG91dEVtYmVkZGluZ3MgPSB7fTsKICAgICAgICBsZXQgaXNJbkVtYmVkZGVkUHJlZCA9IGdldEVtYmVkUHJlZGljYXRlKHBhcmFtcy5pbkVtYmVkZGluZ1R5cGVzKTsKICAgICAgICBsZXQgaXNPdXRFbWJlZGRlZFByZWQgPSBnZXRFbWJlZFByZWRpY2F0ZShwYXJhbXMub3V0RW1iZWRkaW5nVHlwZXMpOwogICAgICAgIGxldCBlbWJlZGRpbmdOb2RlTmFtZXMgPSBbXTsKICAgICAgICBsZXQgcmF3Tm9kZXMgPSBncmFwaERlZi5ub2RlOwogICAgICAgIC8qKgogICAgICAgICAqIEEgbGlzdCBvZiBhbGwgdGhlIG5vbi1lbWJlZGRpbmcgbm9kZSBuYW1lcyB3aGljaCBhcHBlYXIgaW4gdGhlIHByb2Nlc3NlZAogICAgICAgICAqIGxpc3Qgb2YgcmF3IG5vZGVzLiBIZXJlIHdlIHByZS1hbGxvY2F0ZSBlbm91Z2ggcm9vbSBmb3IgYWxsIHRoZSByYXdOb2RlcywKICAgICAgICAgKiBldmVuIHRob3VnaCB0aGVyZSB3aWxsIHNvbWUgbnVtYmVyIG9mIGVtYmVkZGluZ3MuIFRoZSBleGNlc3MgYXJyYXkgbGVuZ3RoCiAgICAgICAgICogaXMgc3BsaWNlZCBvZmYgbGF0ZXIuCiAgICAgICAgICoKICAgICAgICAgKiBFeHBlcmltZW50YXRpb24gc2hvd3MgdGhhdCBhcm91bmQgMzAlIG9mIHRoZSBhcnJheSB3aWxsIGdvIHVudXNlZCwgYW5kCiAgICAgICAgICogZXZlbiBmb3IgdmVyeSBsYXJnZSBuZXR3b3JrcyB0aGF0IGFtb3VudHMgdG8gbGVzcyB0aGFuIDEwayBzcGFjZXMuCiAgICAgICAgICovCiAgICAgICAgbGV0IG5vZGVOYW1lcyA9IG5ldyBBcnJheShyYXdOb2Rlcy5sZW5ndGgpOwogICAgICAgIHJldHVybiBydW5Bc3luY1Rhc2soJ05vcm1hbGl6aW5nIG5hbWVzJywgMzAsICgpID0+IHsKICAgICAgICAgICAgbGV0IG9wTm9kZXMgPSBuZXcgQXJyYXkocmF3Tm9kZXMubGVuZ3RoKTsKICAgICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgICAgY29uc3QgcHJvY2Vzc1Jhd05vZGUgPSAocmF3Tm9kZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IG9wTm9kZSA9IG5ldyBPcE5vZGVJbXBsKHJhd05vZGUpOwogICAgICAgICAgICAgICAgaWYgKGlzSW5FbWJlZGRlZFByZWQob3BOb2RlKSkgewogICAgICAgICAgICAgICAgICAgIGVtYmVkZGluZ05vZGVOYW1lcy5wdXNoKG9wTm9kZS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICBpbkVtYmVkZGluZ1tvcE5vZGUubmFtZV0gPSBvcE5vZGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wTm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc091dEVtYmVkZGVkUHJlZChvcE5vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgZW1iZWRkaW5nTm9kZU5hbWVzLnB1c2gob3BOb2RlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIG91dEVtYmVkZGluZ1tvcE5vZGUubmFtZV0gPSBvcE5vZGU7CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gob3BOb2RlLmlucHV0cywgKGlucHV0KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBpbnB1dE5hbWUgPSBpbnB1dC5uYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBvdXRFbWJlZGRpbmdzW2lucHV0TmFtZV0gPSBvdXRFbWJlZGRpbmdzW2lucHV0TmFtZV0gfHwgW107CiAgICAgICAgICAgICAgICAgICAgICAgIG91dEVtYmVkZGluZ3NbaW5wdXROYW1lXS5wdXNoKG9wTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wTm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGlzIG5vdCBhbiBlbWJlZGRpbmcsIHNvIGFkZCBpdCB0byB0aGUgbmFtZXMgYW5kIG5vZGVzCiAgICAgICAgICAgICAgICAvLyBsaXN0cy4KICAgICAgICAgICAgICAgIG9wTm9kZXNbaW5kZXhdID0gb3BOb2RlOwogICAgICAgICAgICAgICAgbm9kZU5hbWVzW2luZGV4XSA9IG9wTm9kZS5uYW1lOwogICAgICAgICAgICAgICAgaW5kZXgrKzsKICAgICAgICAgICAgICAgIHJldHVybiBvcE5vZGU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKHJhd05vZGVzLCBwcm9jZXNzUmF3Tm9kZSk7CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NGdW5jdGlvbiA9IChmdW5jKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBHaXZlIHRoZSBmdW5jdGlvbiBpdHNlbGYgYSBub2RlLgogICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25Ob2RlTmFtZSA9IEZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVggKyBmdW5jLnNpZ25hdHVyZS5uYW1lOwogICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIG9wIG5vZGUgZm9yIHRoZSBmdW5jdGlvbi4gTWFyayBpdCBhcyBwYXJ0IG9mIGEKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGxpYnJhcnkuCiAgICAgICAgICAgICAgICBwcm9jZXNzUmF3Tm9kZSh7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogZnVuY3Rpb25Ob2RlTmFtZSwKICAgICAgICAgICAgICAgICAgICBpbnB1dDogW10sCiAgICAgICAgICAgICAgICAgICAgZGV2aWNlOiAnJywKICAgICAgICAgICAgICAgICAgICBvcDogJycsCiAgICAgICAgICAgICAgICAgICAgYXR0cjogW10sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBmdW5jdGlvbiBoYXMgaW5wdXRzLCBtYWtlIG5vZGVzIG91dCBvZiB0aGVtLgogICAgICAgICAgICAgICAgaWYgKGZ1bmMuc2lnbmF0dXJlLmlucHV0X2FyZykgewogICAgICAgICAgICAgICAgICAgIC8vIE1ha2VzIGFuIE9wTm9kZSBvdXQgb2YgZWl0aGVyIGFuIGlucHV0X2FyZyBvZiBhIGxpYnJhcnkKICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbi4KICAgICAgICAgICAgICAgICAgICBsZXQgY3VycmVudElucHV0SW5kZXggPSAwOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NJbnB1dCA9IChhcmcpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BOb2RlID0gcHJvY2Vzc1Jhd05vZGUoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZnVuY3Rpb25Ob2RlTmFtZSArIE5BTUVTUEFDRV9ERUxJTSArIGFyZy5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQ6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wOiAnaW5wdXRfYXJnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHI6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogJ1QnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogYXJnLnR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICBvcE5vZGUuZnVuY3Rpb25JbnB1dEluZGV4ID0gY3VycmVudElucHV0SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRJbnB1dEluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIG5vZGVzIGZvciBpbnB1dCBhcmdzIG9mIHRoZSBmdW5jdGlvbi4gVW5mb3J0dW5hdGVseSwgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcGJ0eHQgY29uZmlndXJhdGlvbiBsYW5ndWFnZSBpcyBub3QgcmljaCBlbm91Z2ggdG8KICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gYXJyYXkgd2l0aCAxIGl0ZW0gdnMgMSBvYmplY3QKICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgICAgICBpZiAoZnVuYy5zaWduYXR1cmUuaW5wdXRfYXJnWyduYW1lJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgb25seSAxIGlucHV0IGFyZy4KICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc0lucHV0KGZ1bmMuc2lnbmF0dXJlLmlucHV0X2FyZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgc2V2ZXJhbCBpbnB1dCBhcmdzLgogICAgICAgICAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChmdW5jLnNpZ25hdHVyZS5pbnB1dF9hcmcsIHByb2Nlc3NJbnB1dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gTWFrZSBub2RlcyBmb3Igb3V0cHV0IGFyZ3Mgb2YgdGhlIGZ1bmN0aW9uLiBUcmFjayB0aGUgbmFtZXMgb2YKICAgICAgICAgICAgICAgIC8vIG91dHB1dCBhcmdzIHdpdGhpbiB0aGUga2V5cyBvZiB0aGlzIG9iamVjdC4gVW5saWtlIHRoZQogICAgICAgICAgICAgICAgLy8gaW5wdXRfYXJncywgdGhlIG91dHB1dF9hcmdzIGFyZSBhbHJlYWR5IGRlZmluZWQgd2l0aGluIHRoZQogICAgICAgICAgICAgICAgLy8gbm9kZV9kZWZzIG9mIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRPdXRwdXRJbmRleCA9IDA7CiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXRBcmdOYW1lcyA9IHt9OwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGhhcyBvdXRwdXRzLCBtYWtlIG5vZGVzIG91dCBvZiB0aGVtLgogICAgICAgICAgICAgICAgaWYgKGZ1bmMuc2lnbmF0dXJlLm91dHB1dF9hcmcpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9jZXNzT3V0cHV0ID0gKGFyZykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRBcmdOYW1lc1tmdW5jdGlvbk5vZGVOYW1lICsgTkFNRVNQQUNFX0RFTElNICsgYXJnLm5hbWVdID0gY3VycmVudE91dHB1dEluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50T3V0cHV0SW5kZXgrKzsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGlmIChmdW5jLnNpZ25hdHVyZS5vdXRwdXRfYXJnWyduYW1lJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgb25seSAxIG91dHB1dCBhcmcuCiAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NPdXRwdXQoZnVuYy5zaWduYXR1cmUub3V0cHV0X2FyZyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgc2V2ZXJhbCBvdXRwdXQgYXJncy4KICAgICAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmVhY2goZnVuYy5zaWduYXR1cmUub3V0cHV0X2FyZywgcHJvY2Vzc091dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2goZnVuYy5ub2RlX2RlZiwgKHJhd05vZGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBQcmVmaXggd2l0aCB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gc28gdGhhdCB0aGUgZ3JhcGgKICAgICAgICAgICAgICAgICAgICAvLyBjb3JyZWN0bHkgY29tcHV0ZXMgdGhlIGhpZXJhcmNoeSAoYW5kIG1ha2VzIG1ldGFub2RlcykuCiAgICAgICAgICAgICAgICAgICAgcmF3Tm9kZS5uYW1lID0gZnVuY3Rpb25Ob2RlTmFtZSArICcvJyArIHJhd05vZGUubmFtZTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJhd05vZGUuaW5wdXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJhd05vZGUuaW5wdXQgPSBbcmF3Tm9kZS5pbnB1dF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9wTm9kZSA9IHByb2Nlc3NSYXdOb2RlKHJhd05vZGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNOdW1iZXIob3V0cHV0QXJnTmFtZXNbcmF3Tm9kZS5uYW1lXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWFyayB0aGUgbm9kZSBhcyBvbmUgb2YgdGhlIG91dHB1dHMgb2YgdGhlIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgICAgICBvcE5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCA9IG91dHB1dEFyZ05hbWVzW3Jhd05vZGUubmFtZV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKG9wTm9kZS5pbnB1dHMsIChub3JtYWxpemVkSW5wdXQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0Lm5hbWUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25Ob2RlTmFtZSArIE5BTUVTUEFDRV9ERUxJTSArIG5vcm1hbGl6ZWRJbnB1dC5uYW1lOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGlmIChncmFwaERlZi5saWJyYXJ5ICYmIGdyYXBoRGVmLmxpYnJhcnkuZnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgZ3JhcGggY29udGFpbnMgZnVuY3Rpb25zLgogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGhEZWYubGlicmFyeS5mdW5jdGlvbiwgcHJvY2Vzc0Z1bmN0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcE5vZGVzLnNwbGljZShpbmRleCk7CiAgICAgICAgICAgIG5vZGVOYW1lcy5zcGxpY2UoaW5kZXgpOwogICAgICAgICAgICByZXR1cm4gb3BOb2RlczsKICAgICAgICB9LCB0cmFja2VyKQogICAgICAgICAgICAudGhlbigob3BOb2RlcykgPT4gewogICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGdyYXBoIGRhdGEgc3RydWN0dXJlIGZyb20gdGhlIGdyYXBobGliIGxpYnJhcnkuCiAgICAgICAgICAgIHJldHVybiBydW5Bc3luY1Rhc2soJ0J1aWxkaW5nIHRoZSBkYXRhIHN0cnVjdHVyZScsIDcwLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZE5hbWVEaWN0ID0gbWFwU3RyaWN0SGllcmFyY2h5KG5vZGVOYW1lcywgZW1iZWRkaW5nTm9kZU5hbWVzKTsKICAgICAgICAgICAgICAgIGxldCBncmFwaCA9IG5ldyBTbGltR3JhcGgoKTsKICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbm9kZXMgdG8gdGhlIGdyYXBoLgogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gob3BOb2RlcywgKG9wTm9kZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGxldCBub3JtYWxpemVkTmFtZSA9IG5vcm1hbGl6ZWROYW1lRGljdFtvcE5vZGUubmFtZV0gfHwgb3BOb2RlLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgZ3JhcGgubm9kZXNbbm9ybWFsaXplZE5hbWVdID0gb3BOb2RlOwogICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBub2RlIGhhcyBvdXQtZW1iZWRkaW5ncy4gSWYgeWVzLCBhZGQgdGhlbSB0byB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBub2RlLgogICAgICAgICAgICAgICAgICAgIGlmIChvcE5vZGUubmFtZSBpbiBvdXRFbWJlZGRpbmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9wTm9kZS5vdXRFbWJlZGRpbmdzID0gb3V0RW1iZWRkaW5nc1tvcE5vZGUubmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vcm1hbGl6ZSB0aGUgbmFtZXMgb2YgdGhlIG91dC1lbWJlZGRpbmdzLgogICAgICAgICAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChvcE5vZGUub3V0RW1iZWRkaW5ncywgKG5vZGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGUubmFtZSA9IG5vcm1hbGl6ZWROYW1lRGljdFtub2RlLm5hbWVdIHx8IG5vZGUubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmFtZSBvZiB0aGUgbm9kZS4KICAgICAgICAgICAgICAgICAgICBvcE5vZGUubmFtZSA9IG5vcm1hbGl6ZWROYW1lOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBWaXNpdCBlYWNoIG5vZGUncyBpbnB1dHMgdG8gYWRkIHRoZSBlZGdlcyB0byB0aGUgZ3JhcGguIElmIHRoZQogICAgICAgICAgICAgICAgLy8gaW5wdXQKICAgICAgICAgICAgICAgIC8vIGlzIGFuIGluLWVtYmVkZGluZywgdGhlbiBhZGQgaXQgdG8gdGhlIG5vZGUncyBpbi1lbWJlZGRpbmdzCiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkLgogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gob3BOb2RlcywgKG9wTm9kZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKG9wTm9kZS5pbnB1dHMsIChpbnB1dCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgaW5wdXROYW1lID0gaW5wdXQubmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0TmFtZSBpbiBpbkVtYmVkZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGluRW1iZWROb2RlID0gaW5FbWJlZGRpbmdbaW5wdXROYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wTm9kZS5pbkVtYmVkZGluZ3MucHVzaChpbkVtYmVkTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSBpbnB1dHMgb2YgdGhlIGluLWVtYmVkZGluZyBub2RlIGludG8gaW5jb21pbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVkZ2VzIG9mCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbWFpbiBub2RlLiBFLmcuIHRoZSBjb250cm9sIGRlcGVuZGVuY3kgb2YgYSBjb25zdGFudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIG1vdmVkIHRvIHRoZSBvcCBub2RlIHdoZXJlIHRoZSBjb25zdGFudCBpcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW1iZWRkZWQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBlbWJlZElucHV0IG9mIGluRW1iZWROb2RlLmlucHV0cykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVkZ2VUb0dyYXBoKGdyYXBoLCBub3JtYWxpemVkTmFtZURpY3RbZW1iZWRJbnB1dC5uYW1lXSB8fCBlbWJlZElucHV0Lm5hbWUsIG9wTm9kZSwgZW1iZWRJbnB1dCwgcGFyYW1zLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpbnB1dE5hbWUgaW4gb3V0RW1iZWRkaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSBpbnB1dHMgb2YgdGhlIG91dC1lbWJlZGRpbmcgbm9kZSBpbnRvIGlucHV0cyBvZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIG1haW4gbm9kZSB3aGVyZSB0aGUgb3V0LWVtYmVkZGluZyBwb2ludHMgdG8uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgb3V0RW1iZWROb2RlID0gb3V0RW1iZWRkaW5nW2lucHV0TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBlbWJlZElucHV0IG9mIG91dEVtYmVkTm9kZS5pbnB1dHMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRFZGdlVG9HcmFwaChncmFwaCwgbm9ybWFsaXplZE5hbWVEaWN0W2VtYmVkSW5wdXQubmFtZV0gfHwgZW1iZWRJbnB1dC5uYW1lLCBvcE5vZGUsIGlucHV0LCBwYXJhbXMsIGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRWRnZVRvR3JhcGgoZ3JhcGgsIG5vcm1hbGl6ZWROYW1lRGljdFtpbnB1dE5hbWVdIHx8IGlucHV0TmFtZSwgb3BOb2RlLCBpbnB1dCwgcGFyYW1zLCBpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgdGhlIG5hbWVzIG9mIGluLWVtYmVkZGluZ3MuCiAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChpbkVtYmVkZGluZywgKG5vZGUsIG5hbWUpID0+IHsKICAgICAgICAgICAgICAgICAgICBub2RlLm5hbWUgPSBub3JtYWxpemVkTmFtZURpY3Rbbm9kZS5uYW1lXSB8fCBub2RlLm5hbWU7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBncmFwaDsKICAgICAgICAgICAgfSwgdHJhY2tlcik7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZSBhIG5ldyBncmFwaGxpYi5HcmFwaCgpIGluc3RhbmNlIHdpdGggZGVmYXVsdCBwYXJhbWV0ZXJzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUdyYXBoKG5hbWUsIHR5cGUsIG9wdCkgewogICAgICAgIGNvbnN0IGdyYXBoT3B0aW9ucyA9IG9wdCB8fCB7fTsKICAgICAgICBsZXQgZ3JhcGggPSBuZXcgZGFncmUuZ3JhcGhsaWIuR3JhcGgoZ3JhcGhPcHRpb25zKTsKICAgICAgICBncmFwaC5zZXRHcmFwaCh7CiAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgIHJhbmtkaXI6IGdyYXBoT3B0aW9ucy5yYW5rZGlyIHx8ICdCVCcsCiAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIGdyYXBoOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBwcmVkaWNhdGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgYSBub2RlIHNob3VsZCBiZSBlbWJlZGRlZCBiYXNlZCBvbgogICAgICogdGhlIHNwZWNpZmllZCB0eXBlcy4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RW1iZWRQcmVkaWNhdGUodHlwZXMpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKG5vZGUpIHsKICAgICAgICAgICAgLy8gY2hlY2sgdHlwZXMKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0eXBlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGV0IHJlZ0V4cCA9IG5ldyBSZWdFeHAodHlwZXNbaV0pOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBub2RlLm9wID09PSAnc3RyaW5nJyAmJiBub2RlLm9wLm1hdGNoKHJlZ0V4cCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIHN0cmljdCBub2RlIG5hbWUgKG5hbWUgPT4gbmFtZS8obmFtZSkpIHRvIGF2b2lkIGNvbmZsaWN0cwogICAgICogd2hlcmUgdGhlIG5vZGUgbmFtZSBpcyBhbHNvIGEgbmFtZXNwYWNlLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTdHJpY3ROYW1lKG5hbWUpIHsKICAgICAgICBsZXQgcGFydHMgPSBuYW1lLnNwbGl0KE5BTUVTUEFDRV9ERUxJTSk7CiAgICAgICAgcmV0dXJuIG5hbWUgKyBOQU1FU1BBQ0VfREVMSU0gKyAnKCcgKyBwYXJ0c1twYXJ0cy5sZW5ndGggLSAxXSArICcpJzsKICAgIH0KICAgIC8qKgogICAgICogRm9yIGVhY2ggb3Agbm9kZSAoZW1iZWRkaW5nIG9yIG5vbi1lbWJlZGRpbmcpLCByZW5hbWUgaXQgaWYgdGhlcmUgaXMgYQogICAgICogbm9uLWVtYmVkZGluZyBub2RlIHVuZGVyIGl0cyBuYW1lc3BhY2UuIEZvciBleGFtcGxlLCBhc3N1bWUgbm9kZSBuYW1lICdBJy4KICAgICAqIElmIHRoZXJlIGlzIGEgbm9uLWVtYmVkZGluZyBub2RlIHVuZGVyIGl0cyBuYW1lc3BhY2UgKGUuZy4gJ0EvQicpLCAnQScgd2lsbAogICAgICogYmUgcmVuYW1lZCB0byAnQS8oQSknLiBUaGVuIHRoZSBuYW1lc3BhY2UgJ0EnIHdpbGwgY29udGFpbiAyIG5vZGVzOiAnKEEpJwogICAgICogYW5kICdCJy4gSWYgYWxsIHRoZSBub2RlcyB1bmRlciAnQScgYXJlIGVtYmVkZGluZyBub2RlcyAoZS5nLiBjb25zdGFudCBhbmQKICAgICAqIHN1bW1hcnkpLCBrZWVwICdBJyBhcyBhbiBPcCBub2RlIGFuZCBkb24ndCBjcmVhdGUgYSBuYW1lc3BhY2UuCiAgICAgKgogICAgICogQHBhcmFtIG5vZGVOYW1lcyBBbiBhcnJheSBvZiByZWd1bGFyIChub24tZW1iZWRkaW5nKSBub2RlIG5hbWVzLgogICAgICogQHBhcmFtIGVtYmVkZGluZ05vZGVOYW1lcyBBbiBhcnJheSBvZiBlbWJlZGRpbmcgbm9kZSBuYW1lcy4KICAgICAqIEByZXR1cm4gRGljdGlvbmFyeSBvYmplY3QgbWFwcGluZyBuYW1lcyB0aGF0IG5lZWQgdG8gYmUgcmVuYW1lZCB0bwogICAgICogICAgIG5ldyBuYW1lcy4KICAgICAqLwogICAgZnVuY3Rpb24gbWFwU3RyaWN0SGllcmFyY2h5KG5vZGVOYW1lcywgZW1iZWRkaW5nTm9kZU5hbWVzKSB7CiAgICAgICAgLyoqIERpY3Rpb25hcnkgdGhhdCBtYXBzIHRoZSBvbGQgbmV3IHRvIHRoZSBuZXcgbmFtZSAqLwogICAgICAgIGxldCBuZXdOYW1lRGljdGlvbmFyeSA9IHt9OwogICAgICAgIC8qKiBTZXQgdXNlZCB0byBzdG9yZSBhbGwgbmFtZXNwYWNlcy4gKi8KICAgICAgICBsZXQgbmFtZXNwYWNlU2V0ID0ge307CiAgICAgICAgLy8gc29ydCB0aGUgbm9kZXMgdG8gbWFrZSBwcmVmaXggY2hlY2sgZmFzdGVyCiAgICAgICAgbm9kZU5hbWVzLnNvcnQoKTsKICAgICAgICAvLyBsb29rIGZvciBub2RlcyB3aXRoIGEgcHJlZml4IGEsYS9iIC0+IGEvKGEpLGEvYgogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZU5hbWVzLmxlbmd0aCAtIDE7ICsraSkgewogICAgICAgICAgICBsZXQgYSA9IG5vZGVOYW1lc1tpXTsKICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcGFyZW50IG5hbWVzcGFjZXMgb2YgdGhlIGN1cnJlbnQgbm9kZQogICAgICAgICAgICAvLyBhbmQgYWRkIHRoZW0gaW4gdGhlIG5hbWVzcGFjZSBzZXQuCiAgICAgICAgICAgIGxvZGFzaC5lYWNoKGdldEhpZXJhcmNoaWNhbFBhdGgoYSkuc2xpY2UoMCwgLTEpLCAobnMpID0+IHsKICAgICAgICAgICAgICAgIG5hbWVzcGFjZVNldFtuc10gPSB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IGkgKyAxOyBqIDwgbm9kZU5hbWVzLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgICBsZXQgYiA9IG5vZGVOYW1lc1tqXTsKICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guc3RhcnRzV2l0aChiLCBhKSkgewogICAgICAgICAgICAgICAgICAgIGlmIChiLmxlbmd0aCA+IGEubGVuZ3RoICYmIGIuY2hhckF0KGEubGVuZ3RoKSA9PT0gTkFNRVNQQUNFX0RFTElNKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05hbWVEaWN0aW9uYXJ5W2FdID0gZ2V0U3RyaWN0TmFtZShhKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIGVtYmVkZGluZyBub2RlIG5hbWVzIGFuZCByZW5hbWUgdGhlbSBpbiBjYXNlIHRoZXkKICAgICAgICAvLyBjb2xsaWRlIHdpdGggbmFtZXNwYWNlcy4KICAgICAgICBsb2Rhc2guZWFjaChlbWJlZGRpbmdOb2RlTmFtZXMsIChlbWJlZGRpbmdOYW1lKSA9PiB7CiAgICAgICAgICAgIGlmIChlbWJlZGRpbmdOYW1lIGluIG5hbWVzcGFjZVNldCkgewogICAgICAgICAgICAgICAgLy8gUmVuYW1lIHRvIGZvbGxvdyBzdHJpY3QgaGllcmFyY2h5LgogICAgICAgICAgICAgICAgbmV3TmFtZURpY3Rpb25hcnlbZW1iZWRkaW5nTmFtZV0gPSBnZXRTdHJpY3ROYW1lKGVtYmVkZGluZ05hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIG5ld05hbWVEaWN0aW9uYXJ5OwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbGlzdCBvZiB0aGUgZGVncmVlcyBvZiBlYWNoIG5vZGUgaW4gdGhlIGdyYXBoLgogICAgICovCiAgICBmdW5jdGlvbiBkZWdyZWVTZXF1ZW5jZShncmFwaCkgewogICAgICAgIGxldCBkZWdyZWVzID0gZ3JhcGgubm9kZXMoKS5tYXAoZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGdyYXBoLm5laWdoYm9ycyhuYW1lKS5sZW5ndGg7CiAgICAgICAgfSk7CiAgICAgICAgZGVncmVlcy5zb3J0KCk7CiAgICAgICAgcmV0dXJuIGRlZ3JlZXM7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgaWYgdGhlIGRlZ3JlZSBzZXF1ZW5jZSBvZiB0aGUgdHdvIGdyYXBocyBpcyB0aGUgc2FtZS4KICAgICAqLwogICAgZnVuY3Rpb24gaGFzU2ltaWxhckRlZ3JlZVNlcXVlbmNlKGdyYXBoMSwgZ3JhcGgyKSB7CiAgICAgICAgbGV0IGRnMSA9IGRlZ3JlZVNlcXVlbmNlKGdyYXBoMSk7CiAgICAgICAgbGV0IGRnMiA9IGRlZ3JlZVNlcXVlbmNlKGdyYXBoMik7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZzEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGRnMVtpXSAhPT0gZGcyW2ldKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGhpZXJhcmNoaWNhbCBwYXRoIG9mIHRoZSBjdXJyZW50IG5vZGUsIGJhc2VkIG9uIHRoZSBub2RlJ3MgbmFtZS4KICAgICAqIEZvciBleGFtcGxlLCBpZiB0aGUgbmFtZSBpcyAnYS9iL2MnLCB0aGUgcmV0dXJuZWQgcGF0aCBpcwogICAgICogWydhJywgJ2EvYicsICdhL2IvYyddLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRIaWVyYXJjaGljYWxQYXRoKG5hbWUsIHNlcmllc05hbWVzKSB7CiAgICAgICAgbGV0IHBhdGggPSBbXTsKICAgICAgICBsZXQgaSA9IG5hbWUuaW5kZXhPZihOQU1FU1BBQ0VfREVMSU0pOwogICAgICAgIC8vIFB1c2ggYWxsIHBhcmVudCBwb3J0aW9ucyBvZiB0aGUgcGF0aC4KICAgICAgICB3aGlsZSAoaSA+PSAwKSB7CiAgICAgICAgICAgIHBhdGgucHVzaChuYW1lLnN1YnN0cmluZygwLCBpKSk7CiAgICAgICAgICAgIGkgPSBuYW1lLmluZGV4T2YoTkFNRVNQQUNFX0RFTElNLCBpICsgMSk7CiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBub2RlJ3MgcGF0aCBpcyB1bmRlciBhIHNlcmllcywgdGhlbiBhZGQgdGhlIHNlcmllcyBub2RlIG5hbWUgdG8gdGhlCiAgICAgICAgLy8gaGllcmFyY2hpY2FsIHBhdGggYXMgdGhlIHBhcmVudCBvZiB0aGUgbGVhZi4KICAgICAgICBpZiAoc2VyaWVzTmFtZXMpIHsKICAgICAgICAgICAgbGV0IHNlcmllc05hbWUgPSBzZXJpZXNOYW1lc1tuYW1lXTsKICAgICAgICAgICAgaWYgKHNlcmllc05hbWUpIHsKICAgICAgICAgICAgICAgIHBhdGgucHVzaChzZXJpZXNOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBQdXNoIHRoZSBsZWFmIG9mIHRoZSBwYXRoLgogICAgICAgIHBhdGgucHVzaChuYW1lKTsKICAgICAgICByZXR1cm4gcGF0aDsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgc3RyaW5nIGZvciB0aGUgbm9kZSBpbmNsdXNpb24gdG9nZ2xlIGJ1dHRvbiwgZGVwZW5kYW50CiAgICAgKiBvbiB0aGUgcHJvdmlkZWQgY3VycmVudCBJbmNsdXNpb25UeXBlLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhpbmNsdWRlKSB7CiAgICAgICAgaWYgKGluY2x1ZGUgPT09IEluY2x1c2lvblR5cGUuRVhDTFVERSkgewogICAgICAgICAgICByZXR1cm4gJ0FkZCB0byBtYWluIGdyYXBoJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAnUmVtb3ZlIGZyb20gbWFpbiBncmFwaCc7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBzdHJpbmcgZm9yIHRoZSBzZXJpZXMgbm9kZSBncm91cGluZyB0b2dnbGUgYnV0dG9uLCBkZXBlbmRhbnQKICAgICAqIG9uIHRoZSBwcm92aWRlZCBjdXJyZW50IFNlcmllc0dyb3VwaW5nVHlwZS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nKGdyb3VwKSB7CiAgICAgICAgaWYgKGdyb3VwID09PSBTZXJpZXNHcm91cGluZ1R5cGUuR1JPVVApIHsKICAgICAgICAgICAgcmV0dXJuICdVbmdyb3VwIHRoaXMgc2VyaWVzIG9mIG5vZGVzJzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAnR3JvdXAgdGhpcyBzZXJpZXMgb2Ygbm9kZXMnOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVG9nZ2xlIHRoZSBub2RlIHNlcmllcyBncm91cGluZyBvcHRpb24gaW4gdGhlIHByb3ZpZGVkIG1hcCwgc2V0dGluZyBpdAogICAgICogdG8gdW5ncm91cCBpZiB0aGUgc2VyaWVzIGlzIG5vdCBhbHJlYWR5IGluIHRoZSBtYXAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvZ2dsZU5vZGVTZXJpZXNHcm91cChtYXAsIG5hbWUpIHsKICAgICAgICBpZiAoIShuYW1lIGluIG1hcCkgfHwgbWFwW25hbWVdID09PSBTZXJpZXNHcm91cGluZ1R5cGUuR1JPVVApIHsKICAgICAgICAgICAgbWFwW25hbWVdID0gU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVA7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBtYXBbbmFtZV0gPSBTZXJpZXNHcm91cGluZ1R5cGUuR1JPVVA7CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE1IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBDb2xvciBwYXJhbWV0ZXJzIGZvciBvcCBub2Rlcy4KICAgICAqLwogICAgbGV0IE9wTm9kZUNvbG9ycyA9IHsKICAgICAgICBERUZBVUxUX0ZJTEw6ICcjZmZmZmZmJywKICAgICAgICBERUZBVUxUX1NUUk9LRTogJyNiMmIyYjInLAogICAgICAgIENPTVBBVElCTEU6ICcjMGY5ZDU4JywKICAgICAgICBJTkNPTVBBVElCTEU6ICcjZGI0NDM3JywKICAgIH07CiAgICAvKioKICAgICAqIENvbG9yIHBhcmFtZXRlcnMgZm9yIG5vZGUgZW5jb2RpbmcuCiAgICAgKiBAdHlwZSB7T2JqZWN0fQogICAgICovCiAgICBsZXQgTWV0YW5vZGVDb2xvcnMgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogRGVmYXVsdCBmaWxsIGFuZCBzdHJva2UgdG8gdXNlIHdoZW4gbm8gb3RoZXIgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgogICAgICAgICAqLwogICAgICAgIERFRkFVTFRfRklMTDogJyNkOWQ5ZDknLAogICAgICAgIERFRkFVTFRfU1RST0tFOiAnI2E2YTZhNicsCiAgICAgICAgU0FUVVJBVElPTjogMC42LAogICAgICAgIExJR0hUTkVTUzogMC44NSwKICAgICAgICAvKioKICAgICAgICAgKiBOZXV0cmFsIGNvbG9yIHRvIHVzZSB3aGVuIHRoZSBub2RlIGlzIGV4cGFuZGVkICh1c2VkIHdoZW4gY29sb3JpbmcgYnkKICAgICAgICAgKiBjb21wdXRlIHRpbWUsIG1lbW9yeSBhbmQgZGV2aWNlKS4KICAgICAgICAgKi8KICAgICAgICBFWFBBTkRFRF9DT0xPUjogJyNmMGYwZjAnLAogICAgICAgIC8qKgogICAgICAgICAqIFN0YW5kYXJkIGh1ZSB2YWx1ZXMgZm9yIG5vZGUgY29sb3IgcGFsZXR0ZS4KICAgICAgICAgKi8KICAgICAgICBIVUVTOiBbMjIwLCAxMDAsIDE4MCwgNDAsIDIwLCAzNDAsIDI2MCwgMzAwLCAxNDAsIDYwXSwKICAgICAgICBTVFJVQ1RVUkVfUEFMRVRURShpZCwgbGlnaHRlbmVkKSB7CiAgICAgICAgICAgIC8vIFRoZSBjb2RlIGJlbG93IGlzIGEgZmxleGlibGUgd2F5IHRvIGNvbXB1dGF0aW9uYWxseSBjcmVhdGUgYSBzZXQKICAgICAgICAgICAgLy8gb2YgY29sb3JzIHRoYXQgZ28gd2VsbCB0b2dldGhlci4KICAgICAgICAgICAgbGV0IGh1ZXMgPSBNZXRhbm9kZUNvbG9ycy5IVUVTOwogICAgICAgICAgICBsZXQgbiA9IGh1ZXMubGVuZ3RoOwogICAgICAgICAgICBsZXQgaHVlID0gaHVlc1tpZCAlIG5dOwogICAgICAgICAgICBsZXQgbSA9IE1hdGguc2luKChodWUgKiBNYXRoLlBJKSAvIDM2MCk7CiAgICAgICAgICAgIGxldCBzYXQgPSBsaWdodGVuZWQgPyAzMCA6IDkwIC0gNjAgKiBtOwogICAgICAgICAgICBsZXQgbGlnaHQgPSBsaWdodGVuZWQgPyA5NSA6IDgwOwogICAgICAgICAgICByZXR1cm4gaHNsKGh1ZSwgMC4wMSAqIHNhdCwgMC4wMSAqIGxpZ2h0KS50b1N0cmluZygpOwogICAgICAgIH0sCiAgICAgICAgREVWSUNFX1BBTEVUVEUoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIE1ldGFub2RlQ29sb3JzLlNUUlVDVFVSRV9QQUxFVFRFKGluZGV4KTsKICAgICAgICB9LAogICAgICAgIFhMQV9DTFVTVEVSX1BBTEVUVEUoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIE1ldGFub2RlQ29sb3JzLlNUUlVDVFVSRV9QQUxFVFRFKGluZGV4KTsKICAgICAgICB9LAogICAgICAgIFVOS05PV046ICcjZWVlJywKICAgICAgICBHUkFESUVOVF9PVVRMSU5FOiAnIzg4OCcsCiAgICB9OwogICAgLyoqCiAgICAgKiBDb2xvciBwYXJhbWV0ZXJzIGZvciBvcCBub2Rlcy4KICAgICAqLwogICAgbGV0IFNlcmllc05vZGVDb2xvcnMgPSB7CiAgICAgICAgREVGQVVMVF9GSUxMOiAnd2hpdGUnLAogICAgICAgIERFRkFVTFRfU1RST0tFOiAnI2IyYjJiMicsCiAgICB9OwogICAgLyoqCiAgICAgKiBQYXJhbWV0ZXJzIHRoYXQgYWZmZWN0IGhvdyB0aGUgZ3JhcGggaXMgcmVuZGVyZWQgb24gdGhlIHNjcmVlbi4KICAgICAqLwogICAgY29uc3QgUEFSQU1TID0gewogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gZXh0cmFjdCBoaWdoIGRlZ3JlZSBub2RlcyBmcm9tIHRoZSBjb3JlIHBhcnQgb2YgdGhlIGdyYXBoLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZUV4dHJhY3Rpb246IHRydWUsCiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1pbmltdW0gbnVtYmVyIG9mIG5vZGVzIGZvciBhIGdyYXBoIHRvIGhhdmUgaW4gb3JkZXIgZm9yIGhpZ2ggaW4gYW5kCiAgICAgICAgICogb3V0IGRlZ3JlZSBub2RlcyB0byBiZSBleHRyYWN0ZWQgaW4gYXV4aWxpYXJ5LiBUaGUgYWltIGhlcmUgaXMgdG8gcHJldmVudAogICAgICAgICAqIG5vZGVzIGZyb20gYmVpbmcgZXh0cmFjdGVkIGZyb20gc21hbGwgZ3JhcGhzLgogICAgICAgICAqLwogICAgICAgIG1pbk5vZGVDb3VudEZvckV4dHJhY3Rpb246IDE1LAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBtaW5pbXVtIGluIG9yIG91dCBkZWdyZWUgYSBub2RlIG11c3QgaGF2ZSBpbiBvcmRlciB0byBiZSBwb3NzaWJseQogICAgICAgICAqIGV4dHJhY3RlZC4KICAgICAgICAgKi8KICAgICAgICBtaW5EZWdyZWVGb3JFeHRyYWN0aW9uOiA1LAogICAgICAgIC8qKgogICAgICAgICAqIE1heGltdW0gbnVtYmVyIG9mIGNvbnRyb2wgZWRnZXMgYSBub2RlIGNhbiBoYXZlIGJlZm9yZSB0aGV5IGFyZW4ndAogICAgICAgICAqIGRpc3BsYXllZC4KICAgICAgICAgKi8KICAgICAgICBtYXhDb250cm9sRGVncmVlOiA0LAogICAgICAgIC8qKgogICAgICAgICAqIE1heGltdW0gaW4gKGZvciBvdXRib3VuZCBicmlkZ2UgcGF0aHMpIG9yIG91dCAoZm9yIGluYm91bmQgYnJpZGdlIHBhdGhzKQogICAgICAgICAqIGRlZ3JlZSBvZiBhIG5vZGUgYWxsb3dlZCBmb3IgYSBicmlkZ2UgcGF0aCB0byBiZSByZW5kZXJlZCB0byBpdCBmcm9tIGEKICAgICAgICAgKiBzdWJoaWVyYXJjaHkgb2Ygbm9kZXMuIEhhdmluZyBhIG1heCBwcmV2ZW50cyBoYXZpbmcgdG9vIG1hbnkgbm9kZXMgZW1hbmF0ZQogICAgICAgICAqIGZyb20gYSBzdWJoaWVyYXJjaHkgYW5kIGNyb3dkaW5nIHVwLgogICAgICAgICAqLwogICAgICAgIG1heEJyaWRnZVBhdGhEZWdyZWU6IDQsCiAgICAgICAgLyoqCiAgICAgICAgICogVHlwZXMgcGF0dGVybnMgZm9yIHByZWRlZmluZWQgb3V0LWV4dHJhY3Qgbm9kZXMsIHdoaWNoIGFyZQogICAgICAgICAqIHNpbmstbGlrZSBub2RlcyB0aGF0IHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIG1haW4gZ3JhcGguCiAgICAgICAgICovCiAgICAgICAgb3V0RXh0cmFjdFR5cGVzOiBbJ05vT3AnXSwKICAgICAgICAvKioKICAgICAgICAgKiBUeXBlcyBwYXR0ZXJucyBmb3IgcHJlZGVmaW5lZCBpbi1leHRyYWN0IG5vZGVzLCB3aGljaCBhcmUKICAgICAgICAgKiBzb3VyY2UtbGlrZSBub2RlcyB0aGF0IHdpbGwgYmUgZXh0cmFjdGVkIGZyb20gdGhlIG1haW4gZ3JhcGguCiAgICAgICAgICovCiAgICAgICAgaW5FeHRyYWN0VHlwZXM6IFtdLAogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gcmVtb3ZpbmcgZWRnZXMgZnJvbSBhIGhpZ2ggZGVncmVlIG5vZGUsIHJlbW92ZSBhbGwgb2YgaXRzIGVkZ2VzIGlmCiAgICAgICAgICogZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlIGlzIHRydWUuICBPdGhlcndpc2UgcmVtb3ZlIGFsbCBpbi1lZGdlcyBpZgogICAgICAgICAqIHRoZSBub2RlIGhhcyBoaWdoIGluLWRlZ3JlZSwgb3IgYWxsIG91dC1lZGdlcyBpZiB0aGUgbm9kZSBoYXMgaGlnaAogICAgICAgICAqIG91dC1kZWdyZWUuCiAgICAgICAgICovCiAgICAgICAgZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlOiB0cnVlLAogICAgICAgIC8qKgogICAgICAgICAqIEFmdGVyIGV4dHJhY3RpbmcgaGlnaCBpbi9vdXQgZGVncmVlIG5vZGVzIGFuZCBwcmVkZWZpbmVkCiAgICAgICAgICogc291cmNlLWxpa2Uvc2luay1saWtlLCBleHRyYWN0IGlzb2xhdGVkIG5vZGVzIHRvIHRoZSBzaWRlCiAgICAgICAgICogaWYgdGhpcyBleHRyYWN0SXNvbGF0ZWROb2Rlc1dpdGhBbm5vdGF0aW9uc09uT25lU2lkZSBpcyB0cnVlLgogICAgICAgICAqLwogICAgICAgIGV4dHJhY3RJc29sYXRlZE5vZGVzV2l0aEFubm90YXRpb25zT25PbmVTaWRlOiB0cnVlLAogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdG8gYWRkIGJyaWRnZSBub2RlcyBhbmQgZWRnZXMgdG8gdGhlIGNvcmUgd2hlbiBidWlsZGluZyB0aGUKICAgICAgICAgKiBzdWJoaWVyYXJjaHkgb2YgYW4gZXhwYW5kZWQgbWV0YW5vZGUuIFNlZSBidWlsZFN1YmhpZXJhcmNoeSgpLgogICAgICAgICAqLwogICAgICAgIGVuYWJsZUJyaWRnZWdyYXBoOiB0cnVlLAogICAgICAgIC8qKgogICAgICAgICAqIDIgY29sb3JzLCBmb3IgdGhlIG1pbmltdW0gYW5kIG1heGltdW0gdmFsdWUgcmVzcGVjdGl2ZWx5LCB3aGVuZXZlciB3ZQogICAgICAgICAqIGhhdmUgYSBncmFkaWVudCBzY2FsZS4KICAgICAgICAgKi8KICAgICAgICBtaW5NYXhDb2xvcnM6IFsnI2ZmZjVmMCcsICcjZmI2YTRhJ10sCiAgICAgICAgLyoqCiAgICAgICAgICogTWF4aW11bSBudW1iZXIgb2YgYW5ub3RhdGlvbnMgdG8gYmUgZGlzcGxheWVkIG9uIGEgbm9kZSBiZWZvcmUgYW4KICAgICAgICAgKiBlbGxpcHNpcyBpcyB1c2VkLgogICAgICAgICAqLwogICAgICAgIG1heEFubm90YXRpb25zOiA1LAogICAgfTsKICAgIC8qKgogICAgICogVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byB1c2Ugd2hlbiBwYXJzaW5nIGZvciB0aGUgc3RyaW5nIHRoYXQgaXMKICAgICAqIHVzZWQgdG8gbGFiZWwgYSBmdW5jdGlvbiBub2RlIGluIHRoZSBncmFwaC4gV2Ugc3RyaXAgYXdheSBhIHByZWZpeAogICAgICogaW5kaWNhdGluZyB0aGF0IHRoZSBub2RlIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBkZWZpbml0aW9uLiBXZSBhbHNvCiAgICAgKiByZW1vdmUgYW4gYXJiaXRyYXJ5IGhleGFkZWNpbWFsIHN1ZmZpeCBhbmQgdGhlIG51bWJlciBmb2xsb3dpbmcgaXQKICAgICAqIGlmIGl0IGlzIHByZXNlbnQuIFRvIGJlIGNsZWFyLCB3ZSBleHRyYWN0IGZvbyBmcm9tCiAgICAgKiBfX2Z1bmN0aW9uX2xpYnJhcnlfX2Zvb19kZWFkYjAwZl80Mi4KICAgICAqLwogICAgY29uc3Qgbm9kZURpc3BsYXlOYW1lUmVnZXggPSBuZXcgUmVnRXhwKCdeKD86JyArCiAgICAgICAgRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCArCiAgICAgICAgJyk/KFxcdyspX1thLXowLTldezh9KD86X1xcZCspPyQnKTsKICAgIC8qKgogICAgICogU3RvcmVzIHRoZSByZW5kZXJpbmcgaW5mb3JtYXRpb24sIHN1Y2ggYXMgeCBhbmQgeSBjb29yZGluYXRlcywKICAgICAqIGZvciBlYWNoIG5vZGUgaW4gdGhlIGdyYXBoLgogICAgICovCiAgICBjbGFzcyBSZW5kZXJHcmFwaEluZm8gewogICAgICAgIGNvbnN0cnVjdG9yKGhpZXJhcmNoeSwgZGlzcGxheWluZ1N0YXRzKSB7CiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5ID0gaGllcmFyY2h5OwogICAgICAgICAgICB0aGlzLmRpc3BsYXlpbmdTdGF0cyA9IGRpc3BsYXlpbmdTdGF0czsKICAgICAgICAgICAgdGhpcy5pbmRleCA9IHt9OwogICAgICAgICAgICB0aGlzLnJlbmRlcmVkT3BOYW1lcyA9IFtdOwogICAgICAgICAgICB0aGlzLmNvbXB1dGVTY2FsZXMoKTsKICAgICAgICAgICAgLy8gTWFwcyBub2RlIG5hbWUgdG8gd2hldGhlciB0aGUgcmVuZGVyaW5nIGhpZXJhcmNoeSB3YXMgYWxyZWFkeQogICAgICAgICAgICAvLyBjb25zdHJ1Y3RlZC4KICAgICAgICAgICAgdGhpcy5oYXNTdWJoaWVyYXJjaHkgPSB7fTsKICAgICAgICAgICAgdGhpcy5yb290ID0gbmV3IFJlbmRlckdyb3VwTm9kZUluZm8oaGllcmFyY2h5LnJvb3QsIGhpZXJhcmNoeS5ncmFwaE9wdGlvbnMpOwogICAgICAgICAgICB0aGlzLmluZGV4W2hpZXJhcmNoeS5yb290Lm5hbWVdID0gdGhpcy5yb290OwogICAgICAgICAgICB0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKGhpZXJhcmNoeS5yb290Lm5hbWUpOwogICAgICAgICAgICB0aGlzLmJ1aWxkU3ViaGllcmFyY2h5KGhpZXJhcmNoeS5yb290Lm5hbWUpOwogICAgICAgICAgICB0aGlzLnJvb3QuZXhwYW5kZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnRyYWNlSW5wdXRzID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGNvbXB1dGVTY2FsZXMoKSB7CiAgICAgICAgICAgIHRoaXMuZGV2aWNlQ29sb3JNYXAgPSBvcmRpbmFsKCkKICAgICAgICAgICAgICAgIC5kb21haW4odGhpcy5oaWVyYXJjaHkuZGV2aWNlcykKICAgICAgICAgICAgICAgIC5yYW5nZShsb2Rhc2gubWFwKHNlcXVlbmNlKHRoaXMuaGllcmFyY2h5LmRldmljZXMubGVuZ3RoKSwgTWV0YW5vZGVDb2xvcnMuREVWSUNFX1BBTEVUVEUpKTsKICAgICAgICAgICAgdGhpcy54bGFDbHVzdGVyQ29sb3JNYXAgPSBvcmRpbmFsKCkKICAgICAgICAgICAgICAgIC5kb21haW4odGhpcy5oaWVyYXJjaHkueGxhQ2x1c3RlcnMpCiAgICAgICAgICAgICAgICAucmFuZ2UobG9kYXNoLm1hcChzZXF1ZW5jZSh0aGlzLmhpZXJhcmNoeS54bGFDbHVzdGVycy5sZW5ndGgpLCBNZXRhbm9kZUNvbG9ycy5YTEFfQ0xVU1RFUl9QQUxFVFRFKSk7CiAgICAgICAgICAgIGxldCB0b3BMZXZlbEdyYXBoID0gdGhpcy5oaWVyYXJjaHkucm9vdC5tZXRhZ3JhcGg7CiAgICAgICAgICAgIC8vIEZpbmQgdGhlIG1heGltdW0gbWVtb3J5IHVzYWdlLiBVc2UgMCBhcyB0aGUgbWluaW11bS4KICAgICAgICAgICAgbGV0IG1heE1lbW9yeSA9IG1heCh0b3BMZXZlbEdyYXBoLm5vZGVzKCksIChub2RlTmFtZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBub2RlID0gdG9wTGV2ZWxHcmFwaC5ub2RlKG5vZGVOYW1lKTsKICAgICAgICAgICAgICAgIC8vIFNvbWUgb3BzIGRvbid0IGhhdmUgc3RhdHMgYXQgYWxsLgogICAgICAgICAgICAgICAgaWYgKG5vZGUuc3RhdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRzLnRvdGFsQnl0ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLm1lbW9yeVVzYWdlU2NhbGUgPSBsaW5lYXIkMigpCiAgICAgICAgICAgICAgICAuZG9tYWluKFswLCBtYXhNZW1vcnldKQogICAgICAgICAgICAgICAgLnJhbmdlKFBBUkFNUy5taW5NYXhDb2xvcnMpOwogICAgICAgICAgICAvLyBGaW5kIHRoZSBtYXhpbXVtIGNvbXB1dGUgdGltZS4gVXNlIDAgYXMgdGhlIG1pbmltdW0uCiAgICAgICAgICAgIGxldCBtYXhDb21wdXRlVGltZSA9IG1heCh0b3BMZXZlbEdyYXBoLm5vZGVzKCksIChub2RlTmFtZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBub2RlID0gdG9wTGV2ZWxHcmFwaC5ub2RlKG5vZGVOYW1lKTsKICAgICAgICAgICAgICAgIC8vIFNvbWUgb3BzIGRvbid0IGhhdmUgc3RhdHMgYXQgYWxsLgogICAgICAgICAgICAgICAgaWYgKG5vZGUuc3RhdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRzLmdldFRvdGFsTWljcm9zKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmNvbXB1dGVUaW1lU2NhbGUgPSBsaW5lYXIkMigpCiAgICAgICAgICAgICAgICAuZG9tYWluKFswLCBtYXhDb21wdXRlVGltZV0pCiAgICAgICAgICAgICAgICAucmFuZ2UoUEFSQU1TLm1pbk1heENvbG9ycyk7CiAgICAgICAgICAgIHRoaXMuZWRnZVdpZHRoU2l6ZWRCYXNlZFNjYWxlID0gdGhpcy5oaWVyYXJjaHkuaGFzU2hhcGVJbmZvCiAgICAgICAgICAgICAgICA/IEVER0VfV0lEVEhfU0laRV9CQVNFRF9TQ0FMRQogICAgICAgICAgICAgICAgOiBsaW5lYXIkMigpCiAgICAgICAgICAgICAgICAgICAgLmRvbWFpbihbMSwgdGhpcy5oaWVyYXJjaHkubWF4TWV0YUVkZ2VTaXplXSkKICAgICAgICAgICAgICAgICAgICAucmFuZ2UoWwogICAgICAgICAgICAgICAgICAgIE1JTl9FREdFX1dJRFRILAogICAgICAgICAgICAgICAgICAgIE1BWF9FREdFX1dJRFRILAogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBhIHByZXZpb3VzbHkgY3JlYXRlZCBSZW5kZXJOb2RlSW5mbyBieSBpdHMgbm9kZSBuYW1lLgogICAgICAgICAqLwogICAgICAgIGdldFJlbmRlck5vZGVCeU5hbWUobm9kZU5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhbbm9kZU5hbWVdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHVuZGVybHlpbmcgbm9kZSBpbiB0aGUgaGllcmFyY2hpY2FsIGdyYXBoIGJ5IGl0cyBuYW1lLgogICAgICAgICAqLwogICAgICAgIGdldE5vZGVCeU5hbWUobm9kZU5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGllcmFyY2h5Lm5vZGUobm9kZU5hbWUpOwogICAgICAgIH0KICAgICAgICBjb2xvckhpc3RvZ3JhbShoaXN0b2dyYW0sIGNvbG9ycykgewogICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMoaGlzdG9ncmFtKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCAjIG9mIGl0ZW1zLgogICAgICAgICAgICAgICAgY29uc3QgbnVtSXRlbXMgPSBsb2Rhc2guc3VtKE9iamVjdC5rZXlzKGhpc3RvZ3JhbSkubWFwKChrZXkpID0+IGhpc3RvZ3JhbVtrZXldKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMoaGlzdG9ncmFtKS5tYXAoKGtleSkgPT4gKHsKICAgICAgICAgICAgICAgICAgICBjb2xvcjogY29sb3JzKGtleSksCiAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIHRvIGEgcHJvcG9ydGlvbiBvZiB0b3RhbCAjIG9mIGl0ZW1zLgogICAgICAgICAgICAgICAgICAgIHByb3BvcnRpb246IGhpc3RvZ3JhbVtrZXldIC8gbnVtSXRlbXMsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc29sZS5pbmZvKCdubyBwYWlycyBmb3VuZCEnKTsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBhIHByZXZpb3VzbHkgY3JlYXRlZCBSZW5kZXJOb2RlSW5mbyBmb3IgdGhlIHNwZWNpZmllZCBub2RlIG5hbWUsCiAgICAgICAgICogb3IgY3JlYXRlIG9uZSBpZiBpdCBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldC4KICAgICAgICAgKi8KICAgICAgICBnZXRPckNyZWF0ZVJlbmRlck5vZGVCeU5hbWUobm9kZU5hbWUpIHsKICAgICAgICAgICAgLy8gUG9seW1lciBtYXkgaW52b2tlIHRoaXMgd2l0aCBudWxsLgogICAgICAgICAgICBpZiAoIW5vZGVOYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZU5hbWUgaW4gdGhpcy5pbmRleCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhbbm9kZU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5oaWVyYXJjaHkubm9kZShub2RlTmFtZSk7CiAgICAgICAgICAgIC8vIEV4aXQgZWFybHkgaWYgdGhlIG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIGhpZXJhcmNoeS4gVGhpcyBjYW4gaGFwcGVuCiAgICAgICAgICAgIC8vIHdoZW4gYSBncmFwaCBpcyByZWxvYWRlZCB3aGlsZSB0aGUgaW5mb2NhcmQgcG9pbnRzIHRvIGEgbm9kZSBub3QgdmlzaWJsZQogICAgICAgICAgICAvLyBhdCB0aGUgdG9wLWxldmVsLgogICAgICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCByZW5kZXJJbmZvID0gbm9kZS5pc0dyb3VwTm9kZQogICAgICAgICAgICAgICAgPyBuZXcgUmVuZGVyR3JvdXBOb2RlSW5mbyhub2RlLCB0aGlzLmhpZXJhcmNoeS5ncmFwaE9wdGlvbnMpCiAgICAgICAgICAgICAgICA6IG5ldyBSZW5kZXJOb2RlSW5mbyhub2RlKTsKICAgICAgICAgICAgdGhpcy5pbmRleFtub2RlTmFtZV0gPSByZW5kZXJJbmZvOwogICAgICAgICAgICB0aGlzLnJlbmRlcmVkT3BOYW1lcy5wdXNoKG5vZGVOYW1lKTsKICAgICAgICAgICAgaWYgKG5vZGUuc3RhdHMpIHsKICAgICAgICAgICAgICAgIHJlbmRlckluZm8ubWVtb3J5Q29sb3IgPSB0aGlzLm1lbW9yeVVzYWdlU2NhbGUobm9kZS5zdGF0cy50b3RhbEJ5dGVzKTsKICAgICAgICAgICAgICAgIHJlbmRlckluZm8uY29tcHV0ZVRpbWVDb2xvciA9IHRoaXMuY29tcHV0ZVRpbWVTY2FsZShub2RlLnN0YXRzLmdldFRvdGFsTWljcm9zKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlIG9ubHkgZmFkZSBub2RlcyB3aGVuIHdlJ3JlIGRpc3BsYXlpbmcgc3RhdHMuCiAgICAgICAgICAgIHJlbmRlckluZm8uaXNGYWRlZE91dCA9CiAgICAgICAgICAgICAgICB0aGlzLmRpc3BsYXlpbmdTdGF0cyAmJgogICAgICAgICAgICAgICAgICAgICFoYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyhub2RlLnN0YXRzKTsKICAgICAgICAgICAgdmFyIGRldmljZUhpc3RvZ3JhbSA9IG51bGw7CiAgICAgICAgICAgIHZhciB4bGFDbHVzdGVySGlzdG9ncmFtID0gbnVsbDsKICAgICAgICAgICAgdmFyIG9wQ29tcGF0aWJpbGl0eSA9IG51bGw7CiAgICAgICAgICAgIGlmIChub2RlLmlzR3JvdXBOb2RlKSB7CiAgICAgICAgICAgICAgICBkZXZpY2VIaXN0b2dyYW0gPSBub2RlLmRldmljZUhpc3RvZ3JhbTsKICAgICAgICAgICAgICAgIHhsYUNsdXN0ZXJIaXN0b2dyYW0gPSBub2RlLnhsYUNsdXN0ZXJIaXN0b2dyYW07CiAgICAgICAgICAgICAgICBsZXQgY29tcGF0ID0gbm9kZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGU7CiAgICAgICAgICAgICAgICBsZXQgaW5jb21wYXQgPSBub2RlLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOwogICAgICAgICAgICAgICAgaWYgKGNvbXBhdCAhPSAwIHx8IGluY29tcGF0ICE9IDApIHsKICAgICAgICAgICAgICAgICAgICBvcENvbXBhdGliaWxpdHkgPSBjb21wYXQgLyAoY29tcGF0ICsgaW5jb21wYXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IGRldmljZSA9IHJlbmRlckluZm8ubm9kZS5kZXZpY2U7CiAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgICAgZGV2aWNlSGlzdG9ncmFtID0geyBbZGV2aWNlXTogMSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHhsYUNsdXN0ZXIgPSByZW5kZXJJbmZvLm5vZGUueGxhQ2x1c3RlcjsKICAgICAgICAgICAgICAgIGlmICh4bGFDbHVzdGVyKSB7CiAgICAgICAgICAgICAgICAgICAgeGxhQ2x1c3Rlckhpc3RvZ3JhbSA9IHsgW3hsYUNsdXN0ZXJdOiAxIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVuZGVySW5mby5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLk9QKSB7CiAgICAgICAgICAgICAgICAgICAgb3BDb21wYXRpYmlsaXR5ID0gcmVuZGVySW5mby5ub2RlLmNvbXBhdGlibGUgPyAxIDogMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGV2aWNlSGlzdG9ncmFtKSB7CiAgICAgICAgICAgICAgICByZW5kZXJJbmZvLmRldmljZUNvbG9ycyA9IHRoaXMuY29sb3JIaXN0b2dyYW0oZGV2aWNlSGlzdG9ncmFtLCB0aGlzLmRldmljZUNvbG9yTWFwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoeGxhQ2x1c3Rlckhpc3RvZ3JhbSkgewogICAgICAgICAgICAgICAgcmVuZGVySW5mby54bGFDbHVzdGVyQ29sb3JzID0gdGhpcy5jb2xvckhpc3RvZ3JhbSh4bGFDbHVzdGVySGlzdG9ncmFtLCB0aGlzLnhsYUNsdXN0ZXJDb2xvck1hcCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9wQ29tcGF0aWJpbGl0eSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZW5kZXJJbmZvLmNvbXBhdGliaWxpdHlDb2xvcnMgPSBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogT3BOb2RlQ29sb3JzLkNPTVBBVElCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BvcnRpb246IG9wQ29tcGF0aWJpbGl0eSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IE9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEUsCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3BvcnRpb246IDEgLSBvcENvbXBhdGliaWxpdHksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXhbbm9kZU5hbWVdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gdGhlIG5lYXJlc3QgYW5jZXN0b3Igbm9kZSwgaW5jbHVkaW5nIGl0c2VsZiwgdGhhdCBpcyB2aXNpYmxlCiAgICAgICAgICogaW4gdGhlIHZpc3VhbGl6YXRpb24uIFRoaXMgbWV0aG9kIGlzIHVzZWQgc28gdGhhdCB3ZSBjYW4gc2VsZWN0CiAgICAgICAgICogKGhpZ2hsaWdodCkgYSBub2RlIHRoYXQgaXNuJ3QgZHJhd24geWV0LCBieSBzZWxlY3RpbmcgKGhpZ2hsaWdodGluZykKICAgICAgICAgKiBpdHMgbmVhcmVzdCBhbmNlc3RvciB0aGF0IGhhcyBiZWVuIGRyYXduLgogICAgICAgICAqLwogICAgICAgIGdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IobmFtZSkgewogICAgICAgICAgICBsZXQgcGF0aCA9IGdldEhpZXJhcmNoaWNhbFBhdGgobmFtZSk7CiAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgbGV0IHJlbmRlck5vZGUgPSBudWxsOwogICAgICAgICAgICAvLyBGYWxsdGhyb3VnaC4gSWYgZXZlcnl0aGluZyB3YXMgZXhwYW5kZWQgcmV0dXJuIHRoZSBub2RlLgogICAgICAgICAgICBsZXQgbm9kZU5hbWUgPSBuYW1lOwogICAgICAgICAgICBmb3IgKDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIG5vZGVOYW1lID0gcGF0aFtpXTsKICAgICAgICAgICAgICAgIHJlbmRlck5vZGUgPSB0aGlzLmdldFJlbmRlck5vZGVCeU5hbWUobm9kZU5hbWUpOwogICAgICAgICAgICAgICAgLy8gT3Agbm9kZXMgaGF2ZSBleHBhbmRlZCBzZXQgdG8gZmFsc2UgYnkgZGVmYXVsdC4KICAgICAgICAgICAgICAgIGlmICghcmVuZGVyTm9kZS5leHBhbmRlZCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIGNhc2Ugd2hlcmUgaGlnaGxpZ2h0ZWQgbm9kZSBpcyBhbiBlbWJlZGRlZCBub2RlIHdob3NlIHBhcmVudCBub2RlCiAgICAgICAgICAgIC8vIGlzIGFsc28gaXRzIGhpZXJhcmNoaWNhbCBwYXJlbnQuIEluIHRoaXMgY2FzZSwgd2Ugd2FudCB0byByZXR1cm4gdGhlCiAgICAgICAgICAgIC8vIGVtYmVkZGVkIG5vZGUgbmFtZSwgYXMgaXQgaXMgYWxzbyBkaXNwbGF5ZWQgaWYgaXRzIHBhcmVudCBoYXMgYmVlbgogICAgICAgICAgICAvLyBkaXNwbGF5ZWQuCiAgICAgICAgICAgIGlmIChpID09IHBhdGgubGVuZ3RoIC0gMikgewogICAgICAgICAgICAgICAgbGV0IG5leHROYW1lID0gcGF0aFtpICsgMV07CiAgICAgICAgICAgICAgICBpZiAocmVuZGVyTm9kZS5pbkFubm90YXRpb25zLm5vZGVOYW1lc1tuZXh0TmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dE5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVuZGVyTm9kZS5vdXRBbm5vdGF0aW9ucy5ub2RlTmFtZXNbbmV4dE5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHROYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBub2RlTmFtZTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETzogRGVsZXRlIHRoaXMgYW4gYW55IGNvZGUgaXQgdG91Y2hlcyAoYWxsIGRlcHJlY2F0ZWQpLgogICAgICAgIHNldERlcHRoKGRlcHRoKSB7CiAgICAgICAgICAgIHNldEdyb3VwTm9kZURlcHRoKHRoaXMucm9vdCwgK2RlcHRoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByZW5kZXJOb2RlIGlzIGFuIGlzb2xhdGVkIG5vZGUgd2l0aGluIGl0cyBwYXJlbnQgbm9kZS4KICAgICAgICAgKi8KICAgICAgICBpc05vZGVBdXhpbGlhcnkocmVuZGVyTm9kZSkgewogICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9ICh0aGlzLmdldFJlbmRlck5vZGVCeU5hbWUocmVuZGVyTm9kZS5ub2RlLnBhcmVudE5vZGUubmFtZSkpOwogICAgICAgICAgICBsZXQgZm91bmQgPSBsb2Rhc2guZmluZChwYXJlbnROb2RlLmlzb2xhdGVkSW5FeHRyYWN0LCAobm9kZSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGUubm9kZS5uYW1lID09PSByZW5kZXJOb2RlLm5vZGUubmFtZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm91bmQgPSBsb2Rhc2guZmluZChwYXJlbnROb2RlLmlzb2xhdGVkT3V0RXh0cmFjdCwgKG5vZGUpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBub2RlLm5vZGUubmFtZSA9PT0gcmVuZGVyTm9kZS5ub2RlLm5hbWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gISFmb3VuZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIGxpc3Qgb2Ygb3BzIHRoYXQgaGF2ZSBiZWVuIHJlbmRlcmVkIHNvIGZhciBmb3IgdGhpcyBncmFwaC4gTW9yZQogICAgICAgICAqIG9wcyBtYXkgbGF0ZXIgYmUgcmVuZGVyZWQgaWYgdGhlIHVzZXIgZXhwYW5kcyBub2RlcyBmb3IgaW5zdGFuY2UuIFRoZSBsaXN0CiAgICAgICAgICogcmV0dXJuZWQgaGVyZSBjYW4gb25seSBzdGF5IHRoZSBzYW1lIHNpemUgb3IgZ3JvdyBvbiBzdWNjZXNzaXZlIGNhbGxzLgogICAgICAgICAqLwogICAgICAgIGdldE5hbWVzT2ZSZW5kZXJlZE9wcygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyZWRPcE5hbWVzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9uZXMgYW4gb3Agbm9kZSBhbmQgYWRkcyBpdCB0byBhIG1ldGFncmFwaC4gRG9lcyBub3RoaW5nIGlmIGFuIG9wIG5vZGUKICAgICAgICAgKiB3aXRoIHRoZSBzYW1lIG5ldyBuYW1lIGhhcyBhbHJlYWR5IGJlZW4gY3JlYXRlZCB3aXRoaW4gdGhlIG1ldGFncmFwaC4gVGhpcwogICAgICAgICAqIG1ldGhvZCBpcyB1c2VkIHdoZW4gZHVwbGljYXRpbmcgYSBsaWJyYXJ5IGZ1bmN0aW9uIHRvIGJlIGluamVjdGVkIHdpdGhpbiBhCiAgICAgICAgICogbWV0YW5vZGUgcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gY2FsbC4KICAgICAgICAgKiBAcGFyYW0gcGFyZW50TWV0YW5vZGUgVGhlIHBhcmVudCBtZXRhbm9kZSBvbiB3aGljaCB0byBhZGQgdGhlIG5ldyBub2RlLgogICAgICAgICAqIEBwYXJhbSBub2RlIFRoZSBvcCBub2RlIHRvIGNsb25lLgogICAgICAgICAqIEBwYXJhbSBuZXdQcmVmaXggVGhlIHByZWZpeCBzdHJpbmcgdG8gdXNlIGluIGxpZXUgb2YgdGhlIG9uZSB0aGF0IG1lcmVseQogICAgICAgICAqICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbWV0YW5vZGUgcmVwcmVzZW50cyBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICogICAgIGxpYnJhcnkuIFRoaXMgcHJlZml4IHNob3VsZCByZWZsZWN0IGdyYXBoIGhpZXJhcmNoeS4KICAgICAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIG9wIG5vZGUgKHRoZSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwpLgogICAgICAgICAqLwogICAgICAgIGNsb25lQW5kQWRkRnVuY3Rpb25PcE5vZGUocGFyZW50TWV0YW5vZGUsIGxpYnJhcnlGdW5jdGlvbk5vZGVOYW1lLCBub2RlLCBuZXdQcmVmaXgpIHsKICAgICAgICAgICAgY29uc3QgbmV3TmFtZSA9IG5vZGUubmFtZS5yZXBsYWNlKGxpYnJhcnlGdW5jdGlvbk5vZGVOYW1lLCBuZXdQcmVmaXgpOwogICAgICAgICAgICBsZXQgbmV3T3BOb2RlID0gcGFyZW50TWV0YW5vZGUubWV0YWdyYXBoLm5vZGUobmV3TmFtZSk7CiAgICAgICAgICAgIGlmIChuZXdPcE5vZGUpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBoYWQgYWxyZWFkeSBiZWVuIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBncmFwaC4KICAgICAgICAgICAgICAgIHJldHVybiBuZXdPcE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IG9wIG5vZGUuCiAgICAgICAgICAgIG5ld09wTm9kZSA9IG5ldyBPcE5vZGVJbXBsKHsKICAgICAgICAgICAgICAgIG5hbWU6IG5ld05hbWUsCiAgICAgICAgICAgICAgICBpbnB1dDogW10sCiAgICAgICAgICAgICAgICBkZXZpY2U6IG5vZGUuZGV2aWNlLAogICAgICAgICAgICAgICAgb3A6IG5vZGUub3AsCiAgICAgICAgICAgICAgICBhdHRyOiBsb2Rhc2guY2xvbmVEZWVwKG5vZGUuYXR0ciksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBVcGRhdGUgdmFyaW91cyBwcm9wZXJ0aWVzLgogICAgICAgICAgICBuZXdPcE5vZGUuY2FyZGluYWxpdHkgPSBub2RlLmNhcmRpbmFsaXR5OwogICAgICAgICAgICBuZXdPcE5vZGUuaW5jbHVkZSA9IG5vZGUuaW5jbHVkZTsKICAgICAgICAgICAgbmV3T3BOb2RlLm91dHB1dFNoYXBlcyA9IGxvZGFzaC5jbG9uZURlZXAobm9kZS5vdXRwdXRTaGFwZXMpOwogICAgICAgICAgICBuZXdPcE5vZGUueGxhQ2x1c3RlciA9IG5vZGUueGxhQ2x1c3RlcjsKICAgICAgICAgICAgbmV3T3BOb2RlLmZ1bmN0aW9uSW5wdXRJbmRleCA9IG5vZGUuZnVuY3Rpb25JbnB1dEluZGV4OwogICAgICAgICAgICBuZXdPcE5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCA9IG5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleDsKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBpbnB1dHMgb2YgdGhlIG5ldyBub2RlIHRvIHJlZmxlY3QgdGhlIG5ldyBwYXRoLgogICAgICAgICAgICBuZXdPcE5vZGUuaW5wdXRzID0gbm9kZS5pbnB1dHMubWFwKChub3JtYWxpemVkSW5wdXQpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vcm1hbGl6ZWRJbnB1dCA9IGxvZGFzaC5jbG9uZShub3JtYWxpemVkSW5wdXQpOwogICAgICAgICAgICAgICAgbmV3Tm9ybWFsaXplZElucHV0Lm5hbWUgPSBub3JtYWxpemVkSW5wdXQubmFtZS5yZXBsYWNlKGxpYnJhcnlGdW5jdGlvbk5vZGVOYW1lLCBuZXdQcmVmaXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ld05vcm1hbGl6ZWRJbnB1dDsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIEFkZCB0aGUgbmV3IG9wIG5vZGUgdG8gdGhlIGhpZXJhcmNoeSBhbmQgbWV0YWdyYXBoLiBBbHNvIGFkZCBpdCB0byBpdHMKICAgICAgICAgICAgLy8gcGFyZW50IG1ldGFub2RlLgogICAgICAgICAgICBuZXdPcE5vZGUucGFyZW50Tm9kZSA9IHBhcmVudE1ldGFub2RlOwogICAgICAgICAgICBwYXJlbnRNZXRhbm9kZS5tZXRhZ3JhcGguc2V0Tm9kZShuZXdPcE5vZGUubmFtZSwgbmV3T3BOb2RlKTsKICAgICAgICAgICAgdGhpcy5oaWVyYXJjaHkuc2V0Tm9kZShuZXdPcE5vZGUubmFtZSwgbmV3T3BOb2RlKTsKICAgICAgICAgICAgLy8gVXBkYXRlIGVtYmVkZGluZ3MuCiAgICAgICAgICAgIGNvbnN0IHVwZGF0ZUVtYmVkZGluZ09wTm9kZSA9IChlbWJlZGRpbmdOb2RlKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKHBhcmVudE1ldGFub2RlLCBsaWJyYXJ5RnVuY3Rpb25Ob2RlTmFtZSwgZW1iZWRkaW5nTm9kZSwgbmV3UHJlZml4KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgbmV3T3BOb2RlLmluRW1iZWRkaW5ncyA9IG5vZGUuaW5FbWJlZGRpbmdzLm1hcCh1cGRhdGVFbWJlZGRpbmdPcE5vZGUpOwogICAgICAgICAgICBuZXdPcE5vZGUub3V0RW1iZWRkaW5ncyA9IG5vZGUub3V0RW1iZWRkaW5ncy5tYXAodXBkYXRlRW1iZWRkaW5nT3BOb2RlKTsKICAgICAgICAgICAgcmV0dXJuIG5ld09wTm9kZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xvbmVzIGEgTWV0YW5vZGUgdGhhdCByZXByZXNlbnRzIGEgZnVuY3Rpb24gZGVmaW5lZCBpbiB0aGUgZ3JhcGggbGlicmFyeS4KICAgICAgICAgKiBXZSBkeW5hbWljYWxseSBpbmplY3QgYSBjbG9uZSBvZiBhIGZ1bmN0aW9uIGludG8gYSBtZXRhIGdyYXBoIHdoZW4gdGhlIHVzZXIKICAgICAgICAgKiBleHBhbmRzIGEgZnVuY3Rpb24gY2FsbC4gV2UgY2Fubm90IGRvIHRoaXMgYXQgdGhlIGJlZ2lubmluZyBiZWNhdXNlIHRoZQogICAgICAgICAqIGZ1bmN0aW9ucyBtYXkgcmVjdXJzaXZlbHkgY2FsbCB0aGVtc2VsdmVzIG9yIG90aGVyIGZ1bmN0aW9ucy4KICAgICAgICAgKiBAcGFyYW0gbWV0YWdyYXBoIFRoZSBtZXRhZ3JhcGggd2UgYXJlIGN1cnJlbnRseSByZW5kZXJpbmcgdGhlIHN1Yi1oaWVyYXJjaHkKICAgICAgICAgKiAgICAgZm9yLgogICAgICAgICAqIEBwYXJhbSBvcE5vZGVUb1JlcGxhY2UgVGhlIG9wIG5vZGUgaW4gdGhlIGdyYXBoIHRvIHJlcGxhY2Ugd2l0aCBhIG5ldwogICAgICAgICAqICAgICAoZXhwYW5kYWJsZSkgbWV0YW5vZGUgdGhhdCB2aXN1YWxpemVzIHRoZSBpbm5hcmRzIG9mIGEgZnVuY3Rpb24uCiAgICAgICAgICogQHBhcmFtIGxpYnJhcnlNZXRhbm9kZSBUaGUgbWV0YW5vZGUgZm9yIGEgbGlicmFyeSBmdW5jdGlvbiB0byBjbG9uZS4KICAgICAgICAgKiBAcGFyYW0gb2xkUHJlZml4IFRoZSBvbGQgcHJlZml4IHRvIHJlcGxhY2UgKHRoYXQganVzdCByZWZsZWN0cyBob3cgdGhpcwogICAgICAgICAqICAgICBub2RlIGlzIGZvciBhIGxpYnJhcnkgZnVuY3Rpb24pLgogICAgICAgICAqIEBwYXJhbSBuZXdQcmVmaXggVGhlIHByZWZpeCBzdHJpbmcgdG8gdXNlIGluIGxpZXUgb2YgdGhlIG9uZSB0aGF0IG1lcmVseQogICAgICAgICAqICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgbWV0YW5vZGUgcmVwcmVzZW50cyBhIGZ1bmN0aW9uIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICogICAgIGxpYnJhcnkuIFRoaXMgcHJlZml4IHNob3VsZCByZWZsZWN0IGdyYXBoIGhpZXJhcmNoeS4KICAgICAgICAgKi8KICAgICAgICBjbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKG1ldGFncmFwaCwgb3BOb2RlVG9SZXBsYWNlLCBsaWJyYXJ5TWV0YW5vZGUsIG9sZFByZWZpeCwgbmV3UHJlZml4KSB7CiAgICAgICAgICAgIC8vIE1ha2UgYSBtYXBwaW5nIGJldHdlZW4gZnVuY3Rpb24gb3V0cHV0IGluZGV4IGFuZCB0aGUgbmV3IG5vZGUgZm9yIHRoZQogICAgICAgICAgICAvLyBvdXRwdXQuCiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uT3V0cHV0SW5kZXhUb05vZGUgPSB7fTsKICAgICAgICAgICAgY29uc3QgbmV3TWV0YW5vZGUgPSB0aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIobWV0YWdyYXBoLCBvcE5vZGVUb1JlcGxhY2UsIGxpYnJhcnlNZXRhbm9kZSwgb2xkUHJlZml4LCBuZXdQcmVmaXgsIGZ1bmN0aW9uT3V0cHV0SW5kZXhUb05vZGUpOwogICAgICAgICAgICBpZiAoIWxvZGFzaC5pc0VtcHR5KGZ1bmN0aW9uT3V0cHV0SW5kZXhUb05vZGUpKSB7CiAgICAgICAgICAgICAgICAvLyBBZnRlciB3ZSBoYXZlIGNsb25lZCB0aGUgZWRnZXMgd2l0aGluIHRoZSBtZXRhbm9kZSwgd2Ugc3RpbGwgbXVzdCBhZGQKICAgICAgICAgICAgICAgIC8vIGVkZ2VzIHRoYXQgZW1hbmF0ZSBvdXQgb2Ygb3V0cHV0IG9wcyB3aXRoaW4gdGhlIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgdGhpcy5wYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhvcE5vZGVUb1JlcGxhY2UsIGZ1bmN0aW9uT3V0cHV0SW5kZXhUb05vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXdNZXRhbm9kZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBoZWxwZXIgc3Vicm91dGluZSB0aGF0IHBlcmZvcm1zIHRoZSBidWxrIG9mIHRoZSBsb2dpYyBmb3IKICAgICAgICAgKiBgY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZWAuCiAgICAgICAgICogQHBhcmFtIG1ldGFncmFwaCBUaGUgbWV0YWdyYXBoIHdlIGFyZSBjdXJyZW50bHkgcmVuZGVyaW5nIHRoZSBzdWItaGllcmFyY2h5CiAgICAgICAgICogICAgIGZvci4KICAgICAgICAgKiBAcGFyYW0gb3BOb2RlVG9SZXBsYWNlIFRoZSBvcCBub2RlIGluIHRoZSBncmFwaCB0byByZXBsYWNlIHdpdGggYSBuZXcKICAgICAgICAgKiAgICAgKGV4cGFuZGFibGUpIG1ldGFub2RlIHRoYXQgdmlzdWFsaXplcyB0aGUgaW5uYXJkcyBvZiBhIGZ1bmN0aW9uLgogICAgICAgICAqIEBwYXJhbSBsaWJyYXJ5TWV0YW5vZGUgVGhlIG1ldGFub2RlIGZvciBhIGxpYnJhcnkgZnVuY3Rpb24gdG8gY2xvbmUuCiAgICAgICAgICogQHBhcmFtIG9sZFByZWZpeCBUaGUgb2xkIHByZWZpeCB0byByZXBsYWNlICh0aGF0IGp1c3QgcmVmbGVjdHMgaG93IHRoaXMKICAgICAgICAgKiAgICAgbm9kZSBpcyBmb3IgYSBsaWJyYXJ5IGZ1bmN0aW9uKS4KICAgICAgICAgKiBAcGFyYW0gbmV3UHJlZml4IFRoZSBwcmVmaXggc3RyaW5nIHRvIHVzZSBpbiBsaWV1IG9mIHRoZSBvbmUgdGhhdCBtZXJlbHkKICAgICAgICAgKiAgICAgaW5kaWNhdGVzIHRoYXQgdGhlIG1ldGFub2RlIHJlcHJlc2VudHMgYSBmdW5jdGlvbiBkZWZpbmVkIGluIHRoZQogICAgICAgICAqICAgICBsaWJyYXJ5LiBUaGlzIHByZWZpeCBzaG91bGQgcmVmbGVjdCBncmFwaCBoaWVyYXJjaHkuCiAgICAgICAgICogQHBhcmFtIGZ1bmN0aW9uT3V0cHV0SW5kZXhUb05vZGUgQSBtYXBwaW5nIGJldHdlZW4gZnVuY3Rpb24gb3V0cHV0IGluZGV4CiAgICAgICAgICogICAgIGFuZCB0aGUgY29ycmVzcG9uZGluZyBvdXRwdXQgbm9kZS4gVXNlZCB0byBjb25uZWN0IG91dHB1dHMgd2l0aAogICAgICAgICAqICAgICBkZXN0aW5hdGlvbnMgb3V0c2lkZSBvZiB0aGUgZnVuY3Rpb24gbWV0YW5vZGUuCiAgICAgICAgICovCiAgICAgICAgY2xvbmVGdW5jdGlvbkxpYnJhcnlNZXRhbm9kZUhlbHBlcihtZXRhZ3JhcGgsIG9wTm9kZVRvUmVwbGFjZSwgbGlicmFyeU1ldGFub2RlLCBvbGRQcmVmaXgsIG5ld1ByZWZpeCwgZnVuY3Rpb25PdXRwdXRJbmRleFRvTm9kZSkgewogICAgICAgICAgICBjb25zdCBuZXdNZXRhbm9kZSA9IGNyZWF0ZU1ldGFub2RlKGxpYnJhcnlNZXRhbm9kZS5uYW1lLnJlcGxhY2Uob2xkUHJlZml4LCBuZXdQcmVmaXgpKTsKICAgICAgICAgICAgLy8gQ29weSBvdmVyIHZhcmlvdXMgcHJvcGVydGllcy4KICAgICAgICAgICAgbmV3TWV0YW5vZGUuZGVwdGggPSBsaWJyYXJ5TWV0YW5vZGUuZGVwdGg7CiAgICAgICAgICAgIG5ld01ldGFub2RlLmNhcmRpbmFsaXR5ID0gbGlicmFyeU1ldGFub2RlLmNhcmRpbmFsaXR5OwogICAgICAgICAgICBuZXdNZXRhbm9kZS50ZW1wbGF0ZUlkID0gbGlicmFyeU1ldGFub2RlLnRlbXBsYXRlSWQ7CiAgICAgICAgICAgIG5ld01ldGFub2RlLm9wSGlzdG9ncmFtID0gbG9kYXNoLmNsb25lKGxpYnJhcnlNZXRhbm9kZS5vcEhpc3RvZ3JhbSk7CiAgICAgICAgICAgIG5ld01ldGFub2RlLmRldmljZUhpc3RvZ3JhbSA9IGxvZGFzaC5jbG9uZShsaWJyYXJ5TWV0YW5vZGUuZGV2aWNlSGlzdG9ncmFtKTsKICAgICAgICAgICAgbmV3TWV0YW5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSA9IGxvZGFzaC5jbG9uZShsaWJyYXJ5TWV0YW5vZGUueGxhQ2x1c3Rlckhpc3RvZ3JhbSk7CiAgICAgICAgICAgIG5ld01ldGFub2RlLmhhc05vbkNvbnRyb2xFZGdlcyA9IGxpYnJhcnlNZXRhbm9kZS5oYXNOb25Db250cm9sRWRnZXM7CiAgICAgICAgICAgIG5ld01ldGFub2RlLmluY2x1ZGUgPSBsaWJyYXJ5TWV0YW5vZGUuaW5jbHVkZTsKICAgICAgICAgICAgbmV3TWV0YW5vZGUubm9kZUF0dHJpYnV0ZXMgPSBsb2Rhc2guY2xvbmUobGlicmFyeU1ldGFub2RlLm5vZGVBdHRyaWJ1dGVzKTsKICAgICAgICAgICAgbmV3TWV0YW5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uID0gbGlicmFyeU1ldGFub2RlLmFzc29jaWF0ZWRGdW5jdGlvbjsKICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgZHVwbGljYXRlIHRoZSBjaGlsZHJlbiBub2Rlcy4KICAgICAgICAgICAgbG9kYXNoLmVhY2gobGlicmFyeU1ldGFub2RlLm1ldGFncmFwaC5ub2RlcygpLCAobm9kZU5hbWUpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBsaWJyYXJ5TWV0YW5vZGUubWV0YWdyYXBoLm5vZGUobm9kZU5hbWUpOwogICAgICAgICAgICAgICAgc3dpdGNoIChub2RlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlY3Vyc2l2ZWx5IGR1cGxpY2F0ZSB0aGUgbWV0YW5vZGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld05vZGUgPSB0aGlzLmNsb25lRnVuY3Rpb25MaWJyYXJ5TWV0YW5vZGVIZWxwZXIobWV0YWdyYXBoLCBvcE5vZGVUb1JlcGxhY2UsIG5vZGUsIG9sZFByZWZpeCwgbmV3UHJlZml4LCBmdW5jdGlvbk91dHB1dEluZGV4VG9Ob2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBuZXcgbm9kZSB0byB0aGUgZ3JhcGguCiAgICAgICAgICAgICAgICAgICAgICAgIG5ld05vZGUucGFyZW50Tm9kZSA9IG5ld01ldGFub2RlOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdNZXRhbm9kZS5tZXRhZ3JhcGguc2V0Tm9kZShuZXdOb2RlLm5hbWUsIG5ld05vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeS5zZXROb2RlKG5ld05vZGUubmFtZSwgbmV3Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuT1A6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIER1cGxpY2F0ZSB0aGUgb3Agbm9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3T3BOb2RlID0gdGhpcy5jbG9uZUFuZEFkZEZ1bmN0aW9uT3BOb2RlKG5ld01ldGFub2RlLCBvbGRQcmVmaXgsIG5vZGUsIG5ld1ByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNOdW1iZXIobmV3T3BOb2RlLmZ1bmN0aW9uSW5wdXRJbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSByZXByZXNlbnRzIGFuIGlucHV0X2FyZyBvZiB0aGUgbGlicmFyeSBmdW5jdGlvbi4gR2l2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQgZWRnZXMgc28gdGhhdCBpdHMgYnJpZGdlIGVkZ2VzIGFyZSBjcmVhdGVkIGNvcnJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhvcE5vZGVUb1JlcGxhY2UsIG5ld09wTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxvZGFzaC5pc051bWJlcihuZXdPcE5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uT3V0cHV0SW5kZXhUb05vZGVbbmV3T3BOb2RlLmZ1bmN0aW9uT3V0cHV0SW5kZXhdID0gbmV3T3BOb2RlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9naWMgc2hvdWxkIG5ldmVyIHJ1biBiZWNhdXNlIHRoZSBtZXRhIGdyYXBoIHNob3VsZCBvbmx5CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnRhaW4gbWV0YSBhbmQgb3Agbm9kZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihub2RlLm5hbWUgKyAnIGlzIG9kZGx5IG5laXRoZXIgYSBtZXRhbm9kZSBub3IgYW4gb3Bub2RlLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIGVkZ2VzIHdpdGhpbiB0aGUgZnVuY3Rpb24gbGlicmFyeSBtZXRhbm9kZS4KICAgICAgICAgICAgdGhpcy5jbG9uZUxpYnJhcnlNZXRhbm9kZUVkZ2VzKGxpYnJhcnlNZXRhbm9kZSwgbmV3TWV0YW5vZGUsIG9sZFByZWZpeCwgbmV3UHJlZml4KTsKICAgICAgICAgICAgcmV0dXJuIG5ld01ldGFub2RlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9uZXMgdGhlIGVkZ2VzIHdpdGhpbiBgbGlicmFyeU1ldGFub2RlYCBhbmQgYWRkcyB0aGVtIHRvIGBuZXdNZXRhbm9kZWAuCiAgICAgICAgICogVGhlIG5hbWVzIG9mIGVkZ2Ugc291cmNlcyBhbmQgZGVzdGluYXRpb25zIGhhdmUgdGhlaXIgcHJlZml4ZXMgcmVwbGFjZWQKICAgICAgICAgKiB3aXRoIG5ldyBwcmVmaXhlcyB0aGF0IHJlZmxlY3QgdGhlaXIgaGllcmFyY2hpY2FsIHBvc2l0aW9ucyBpbiB0aGUgZ3JhcGgKICAgICAgICAgKiBpbnN0ZWFkIG9mIHdpdGhpbiB0aGUgZnVuY3Rpb24gbGlicmFyeSB0ZW1wbGF0ZS4gVGhpcyBpcyBhIHN1YnJvdXRpbmUgZm9yCiAgICAgICAgICogZHluYW1pY2FsbHkgaW5qZWN0aW5nIGEgZnVuY3Rpb24gbWV0YW5vZGUgaW50byB0aGUgZ3JhcGguCiAgICAgICAgICovCiAgICAgICAgY2xvbmVMaWJyYXJ5TWV0YW5vZGVFZGdlcyhsaWJyYXJ5TWV0YW5vZGUsIG5ld01ldGFub2RlLCBvbGRQcmVmaXgsIG5ld1ByZWZpeCkgewogICAgICAgICAgICBsb2Rhc2guZWFjaChsaWJyYXJ5TWV0YW5vZGUubWV0YWdyYXBoLmVkZ2VzKCksIChlZGdlT2JqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBlZGdlID0gbGlicmFyeU1ldGFub2RlLm1ldGFncmFwaC5lZGdlKGVkZ2VPYmplY3QpOwogICAgICAgICAgICAgICAgY29uc3QgbmV3ViA9IGVkZ2Uudi5yZXBsYWNlKG9sZFByZWZpeCwgbmV3UHJlZml4KTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld1cgPSBlZGdlLncucmVwbGFjZShvbGRQcmVmaXgsIG5ld1ByZWZpeCk7CiAgICAgICAgICAgICAgICBjb25zdCBuZXdNZXRhRWRnZSA9IG5ldyBNZXRhZWRnZUltcGwobmV3ViwgbmV3Vyk7CiAgICAgICAgICAgICAgICAvLyBEdXBsaWNhdGUgdmFyaW91cyBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgbmV3TWV0YUVkZ2UuaW5ib3VuZCA9IGVkZ2UuaW5ib3VuZDsKICAgICAgICAgICAgICAgIG5ld01ldGFFZGdlLm51bVJlZ3VsYXJFZGdlcyA9IGVkZ2UubnVtUmVndWxhckVkZ2VzOwogICAgICAgICAgICAgICAgbmV3TWV0YUVkZ2UubnVtQ29udHJvbEVkZ2VzID0gZWRnZS5udW1Db250cm9sRWRnZXM7CiAgICAgICAgICAgICAgICBuZXdNZXRhRWRnZS5udW1SZWZFZGdlcyA9IGVkZ2UubnVtUmVmRWRnZXM7CiAgICAgICAgICAgICAgICBuZXdNZXRhRWRnZS50b3RhbFNpemUgPSBlZGdlLnRvdGFsU2l6ZTsKICAgICAgICAgICAgICAgIGlmIChlZGdlLmJhc2VFZGdlTGlzdCkgewogICAgICAgICAgICAgICAgICAgIG5ld01ldGFFZGdlLmJhc2VFZGdlTGlzdCA9IGVkZ2UuYmFzZUVkZ2VMaXN0Lm1hcCgoYmFzZUVkZ2UpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3QmFzZUVkZ2UgPSBsb2Rhc2guY2xvbmUoYmFzZUVkZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdCYXNlRWRnZS52ID0gYmFzZUVkZ2Uudi5yZXBsYWNlKG9sZFByZWZpeCwgbmV3UHJlZml4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3QmFzZUVkZ2UudyA9IGJhc2VFZGdlLncucmVwbGFjZShvbGRQcmVmaXgsIG5ld1ByZWZpeCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXdCYXNlRWRnZTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBlZGdlIGJhc2VkIG9uIHdoZXRoZXIgaXQgaXMgaW5ib3VuZC4gVGhlIGVkZ2UKICAgICAgICAgICAgICAgIC8vIGlzIGluYm91bmQgaWYgaXRzIGRlc3RpbmF0aW9uIGlzIHdpdGhpbiB0aGUgbWV0YWdyYXBoLgogICAgICAgICAgICAgICAgaWYgKG5ld01ldGFub2RlLm1ldGFncmFwaC5ub2RlKG5ld1cpKSB7CiAgICAgICAgICAgICAgICAgICAgbmV3TWV0YW5vZGUubWV0YWdyYXBoLnNldEVkZ2UobmV3ViwgbmV3VywgbmV3TWV0YUVkZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbmV3TWV0YW5vZGUubWV0YWdyYXBoLnNldEVkZ2UobmV3VywgbmV3ViwgbmV3TWV0YUVkZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBhIG1ldGFub2RlIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIGlzIGNsb25lZCBhbmQgcGxhY2VkIGludG8gdGhlCiAgICAgICAgICogZ3JhcGgsIHdlIG11c3QgY3JlYXRlIGVkZ2VzIGJldHdlZW4gaW5wdXRzIGludG8gdGhlIGZ1bmN0aW9uIGNhbGwgYW5kIHRoZQogICAgICAgICAqIGlucHV0IG9wcyB3aXRoaW4gdGhlIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHRoYXQgcGF0Y2hpbmcuCiAgICAgICAgICovCiAgICAgICAgcGF0Y2hFZGdlc0ludG9GdW5jdGlvbklucHV0cyhvcE5vZGVUb1JlcGxhY2UsIG5ld09wTm9kZSkgewogICAgICAgICAgICAvLyBJZiB0aGUgbGFzdCBmZXcgcmF3IGlucHV0cyBhcmUgdGhlIHNhbWUgbm9kZSwgcHJldmlvdXMgZ3JhcGggbG9naWMKICAgICAgICAgICAgLy8gY29sbGFwc2VzIHRoZW0gaW50byBhIHNpbmdsZSBub3JtYWxpemVkIGlucHV0LgogICAgICAgICAgICBsZXQgaW5wdXRJbmRleCA9IE1hdGgubWluKG5ld09wTm9kZS5mdW5jdGlvbklucHV0SW5kZXgsIG9wTm9kZVRvUmVwbGFjZS5pbnB1dHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIGxldCBuZXdJbnB1dCA9IGxvZGFzaC5jbG9uZShvcE5vZGVUb1JlcGxhY2UuaW5wdXRzW2lucHV0SW5kZXhdKTsKICAgICAgICAgICAgd2hpbGUgKG5ld0lucHV0LmlzQ29udHJvbERlcGVuZGVuY3kpIHsKICAgICAgICAgICAgICAgIC8vIElnbm9yZSBjb250cm9sIGRlcGVuZGVuY2llcyAtIHRoZXkgYXJlIG5vdCBhc3NpZ25lZCB0bwogICAgICAgICAgICAgICAgLy8gaW5wdXRfYXJncy4KICAgICAgICAgICAgICAgIGlucHV0SW5kZXgrKzsKICAgICAgICAgICAgICAgIG5ld0lucHV0ID0gb3BOb2RlVG9SZXBsYWNlLmlucHV0c1tpbnB1dEluZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDbG9uZSB0aGUgbm9ybWFsaXplZCBpbnB1dCBvYmplY3QuCiAgICAgICAgICAgIG5ld09wTm9kZS5pbnB1dHMucHVzaChuZXdJbnB1dCk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB2YWx1ZXMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZWRnZSBpbiB0aGUgaGlnaC1sZXZlbAogICAgICAgICAgICAvLyBtZXRhZ3JhcGguCiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0YUVkZ2VzID0gdGhpcy5oaWVyYXJjaHkuZ2V0UHJlZGVjZXNzb3JzKG9wTm9kZVRvUmVwbGFjZS5uYW1lKTsKICAgICAgICAgICAgLy8gRmluZCB0aGUgbWV0YWVkZ2UgdGhhdCB0aGUgaW5wdXQgaW5kZXggY29ycmVzcG9uZHMgdG8uCiAgICAgICAgICAgIC8vIEEgbWV0YWVkZ2UgbWF5IGNvcnJlc3BvbmQgdG8gc2V2ZXJhbCBlZGdlcy4gRm9yIGluc3RhbmNlLAogICAgICAgICAgICAvLyBhbiBlZGdlIG1heSBlbnRlciBhIHNlcmllcyBub2RlLgogICAgICAgICAgICBsZXQgb3JpZ2luYWxNZXRhRWRnZTsKICAgICAgICAgICAgbGV0IHJlZ3VsYXJFZGdlQ291bnQgPSAwOwogICAgICAgICAgICBsb2Rhc2guZWFjaChvcmlnaW5hbE1ldGFFZGdlcy5yZWd1bGFyLCAobWV0YUVkZ2UpID0+IHsKICAgICAgICAgICAgICAgIHJlZ3VsYXJFZGdlQ291bnQgKz0gbWV0YUVkZ2UubnVtUmVndWxhckVkZ2VzOwogICAgICAgICAgICAgICAgaWYgKHJlZ3VsYXJFZGdlQ291bnQgPiBpbnB1dEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxNZXRhRWRnZSA9IG1ldGFFZGdlOwogICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0aGUgbG9vcC4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBBbHNvIGNoYW5nZSBhbnkgYmFzZSBlZGdlcyB0aGF0IHBvaW50IGludG8gdGhlIG9yaWdpbmFsIG5vZGUgdG8KICAgICAgICAgICAgLy8gcG9pbnQgdG8gdGhlIGlucHV0IGFyZyB3aXRoaW4gdGhlIGZ1bmN0aW9uLiBUaGVzZSBhcmUgdXNlZCB0bwogICAgICAgICAgICAvLyBtYWtlIGJyaWRnZSBlZGdlcy4KICAgICAgICAgICAgbG9kYXNoLmVhY2gob3JpZ2luYWxNZXRhRWRnZS5iYXNlRWRnZUxpc3QsIChlZGdlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZWRnZS53ID09PSBvcE5vZGVUb1JlcGxhY2UubmFtZSkgewogICAgICAgICAgICAgICAgICAgIGVkZ2UudyA9IG5ld09wTm9kZS5uYW1lOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVkZ2UudiA9PT0gb3BOb2RlVG9SZXBsYWNlLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBlZGdlLnYgPSBuZXdPcE5vZGUubmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gYSBtZXRhbm9kZSByZXByZXNlbnRpbmcgYSBmdW5jdGlvbiBpcyBjbG9uZWQgYW5kIHBsYWNlZCBpbnRvIHRoZQogICAgICAgICAqIGdyYXBoLCB3ZSBtdXN0IGNyZWF0ZSBlZGdlcyBiZXR3ZWVuIG91dHB1dCBvcHMgd2l0aGluIHRoZSBuZXcgZnVuY3Rpb24KICAgICAgICAgKiBtZXRhbm9kZSB0byBpdHMgc3VjY2Vzc29ycy4gVGhpcyBmdW5jdGlvbiBkb2VzIHRoYXQgYWZ0ZXIgc2Nhbm5pbmcgdGhlCiAgICAgICAgICogc3VjY2Vzc29ycyBvZiB0aGUgZnVuY3Rpb24gY2FsbC4KICAgICAgICAgKi8KICAgICAgICBwYXRjaEVkZ2VzRnJvbUZ1bmN0aW9uT3V0cHV0cyhvcE5vZGVUb1JlcGxhY2UsIGZ1bmN0aW9uT3V0cHV0SW5kZXhUb0Rlc3RpbmF0aW9uTm9kZSkgewogICAgICAgICAgICAvLyBDb25uZWN0IHRoZSBvdXRwdXRzIG9mIHRoZSBmdW5jdGlvbiB0byBvdGhlciBvcHMuCiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTWV0YUVkZ2VzID0gdGhpcy5oaWVyYXJjaHkuZ2V0U3VjY2Vzc29ycyhvcE5vZGVUb1JlcGxhY2UubmFtZSk7CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKG9yaWdpbmFsTWV0YUVkZ2VzLnJlZ3VsYXIsIChtZXRhZWRnZSkgPT4gewogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gobWV0YWVkZ2UuYmFzZUVkZ2VMaXN0LCAoYmFzZUVkZ2UpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBEZXN0aW5hdGlvbiBub2RlcyB3aXRoaW4gcmVndWxhciBiYXNlIGVkZ2VzIGFyZSBvcCBub2Rlcy4KICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbk5vZGUgPSB0aGlzLmhpZXJhcmNoeS5ub2RlKGJhc2VFZGdlLncpOwogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKGRlc3RpbmF0aW9uTm9kZS5pbnB1dHMsIChub3JtYWxpemVkSW5wdXQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgYW4gb3V0cHV0IG9mIHRoZSBmdW5jdGlvbiBpcyBhbiBpbnB1dCBpbnRvIHRoZSBvcCwgbWFwIGl0IGJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gdGhlIG91dHB1dCB3aXRoaW4gdGhlIGZ1bmN0aW9uIHNvIGJyaWRnZSBlZGdlcyBhcmUgY29tcHV0ZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub3JtYWxpemVkSW5wdXQubmFtZSA9PT0gb3BOb2RlVG9SZXBsYWNlLm5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1hcCB0aGUgb3V0cHV0IHRlbnNvciBpbmRleCAod2hpY2ggaW4gdGhpcyBjYXNlIGlzIGZvciBzdXJlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBudW1lcmljIGJlY2F1c2UgaXQgaXMgYW4gb3V0cHV0IG9mIGEgbWV0YW5vZGUpIHRvIHRoZSBjb3JyZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBvdXRwdXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXROb2RlID0gZnVuY3Rpb25PdXRwdXRJbmRleFRvRGVzdGluYXRpb25Ob2RlW25vcm1hbGl6ZWRJbnB1dC5vdXRwdXRUZW5zb3JLZXldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZElucHV0Lm5hbWUgPSBvdXRwdXROb2RlLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVkSW5wdXQub3V0cHV0VGVuc29yS2V5ID0gYmFzZUVkZ2Uub3V0cHV0VGVuc29yS2V5OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIE1vZGlmeSB0aGUgbGlzdCBvZiBiYXNlIGVkZ2VzIHRvIHBvaW50IGZyb20gdGhlIG91dHB1dCBzbyB0aGF0IGJyaWRnZQogICAgICAgICAgICAgICAgLy8gZWRnZXMgYXJlIGNvcnJlY3QuCiAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChtZXRhZWRnZS5iYXNlRWRnZUxpc3QsIChiYXNlRWRnZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGJhc2VFZGdlLnYgPQogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbk91dHB1dEluZGV4VG9EZXN0aW5hdGlvbk5vZGVbYmFzZUVkZ2Uub3V0cHV0VGVuc29yS2V5XS5uYW1lOwogICAgICAgICAgICAgICAgICAgIGJhc2VFZGdlLm91dHB1dFRlbnNvcktleSA9ICcwJzsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgYnVpbGRTdWJoaWVyYXJjaHkobm9kZU5hbWUpIHsKICAgICAgICAgICAgLy8gVGVybWluYXRlIGlmIHRoZSByZW5kZXJpbmcgaGllcmFyY2h5IHdhcyBhbHJlYWR5IGNvbnN0cnVjdGVkCiAgICAgICAgICAgIC8vIGZvciB0aGlzIG5vZGUuCiAgICAgICAgICAgIGlmIChub2RlTmFtZSBpbiB0aGlzLmhhc1N1YmhpZXJhcmNoeSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlY29yZCB0aGF0IHdlIGNvbnN0cnVjdGVkIHRoZSByZW5kZXJpbmcgaGllcmFyY2h5IGZvciB0aGlzIG5vZGUsIHNvIHdlCiAgICAgICAgICAgIC8vIGRvbid0IGNvbnN0cnVjdCBpdCBhbm90aGVyIHRpbWUuCiAgICAgICAgICAgIHRoaXMuaGFzU3ViaGllcmFyY2h5W25vZGVOYW1lXSA9IHRydWU7CiAgICAgICAgICAgIGxldCByZW5kZXJOb2RlSW5mbyA9IHRoaXMuaW5kZXhbbm9kZU5hbWVdOwogICAgICAgICAgICAvLyBJZiBpdCBpcyBub3QgYSBtZXRhIG5vZGUgb3IgYSBzZXJpZXMgbm9kZSwgZG9uJ3QgZG8gYW55dGhpbmcuCiAgICAgICAgICAgIGlmIChyZW5kZXJOb2RlSW5mby5ub2RlLnR5cGUgIT09IE5vZGVUeXBlLk1FVEEgJiYKICAgICAgICAgICAgICAgIHJlbmRlck5vZGVJbmZvLm5vZGUudHlwZSAhPT0gTm9kZVR5cGUuU0VSSUVTKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBrbm93IHRoZSByZW5kZXJpbmcgaW5mb3JtYXRpb24gaXMgYWJvdXQgYSBncm91cCBub2RlLgogICAgICAgICAgICBsZXQgcmVuZGVyR3JvdXBOb2RlSW5mbyA9IHJlbmRlck5vZGVJbmZvOwogICAgICAgICAgICBsZXQgbWV0YWdyYXBoID0gcmVuZGVyR3JvdXBOb2RlSW5mby5ub2RlLm1ldGFncmFwaDsKICAgICAgICAgICAgbGV0IGNvcmVHcmFwaCA9IHJlbmRlckdyb3VwTm9kZUluZm8uY29yZUdyYXBoOwogICAgICAgICAgICBjb25zdCBub2Rlc1RoYXRHb3RDbG9uZWQgPSBbXTsKICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25DYWxsTWV0YW5vZGVzVG9BZGQgPSBbXTsKICAgICAgICAgICAgaWYgKCFsb2Rhc2guaXNFbXB0eSh0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zKSkgewogICAgICAgICAgICAgICAgLy8gVGhpcyBncmFwaCBoYXMgbGlicmFyeSBmdW5jdGlvbnMuIEFkZCB0aGVtIHRvIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAvLyBzdWItaGllcmFyY2h5IGlmIG5lY2Vzc2FyeS4KICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKG1ldGFncmFwaC5ub2RlcygpLCAoY2hpbGROYW1lKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2h5IGlzIHRoaXMgc28gb2Z0ZW4gdW5kZWZpbmVkPwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTm9kZSA9IG1ldGFncmFwaC5ub2RlKGNoaWxkTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGlicmFyeUZ1bmN0aW9uRGF0YSA9IHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnNbb3JpZ2luYWxOb2RlLm9wXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWxpYnJhcnlGdW5jdGlvbkRhdGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBub2RlIGlzIG5vdCBhIGZ1bmN0aW9uIGNhbGwuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNoaWxkTmFtZS5pbmRleE9mKEZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZXBsYWNlIGxpYnJhcnkgZnVuY3Rpb25zIGluIHRoZSBncmFwaC4gVGhlIGxpYnJhcnkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb25zIHNlcnZlIGFzIHRlbXBsYXRlcyBmb3Igb3RoZXIgbm9kZXMuCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbGF0ZXIgcmVwbGFjZSB0aGUgbm9kZSB0aGF0IGlzIGEgZnVuY3Rpb24gY2FsbCB3aXRoIGEgY29weSBvZiB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBtZXRhZ3JhcGguIFdlIGRvIG5vdCBkbyBzbyBub3cgYmVjYXVzZSB3ZSBhcmUgYWxzbyBsb29waW5nCiAgICAgICAgICAgICAgICAgICAgLy8gdGhyb3VnaCBhbGwgdGhlIG5vZGVzLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsb25lZE1ldGFub2RlID0gdGhpcy5jbG9uZUZ1bmN0aW9uTGlicmFyeU1ldGFub2RlKG1ldGFncmFwaCwgb3JpZ2luYWxOb2RlLCBsaWJyYXJ5RnVuY3Rpb25EYXRhLm5vZGUsIGxpYnJhcnlGdW5jdGlvbkRhdGEubm9kZS5uYW1lLCBvcmlnaW5hbE5vZGUubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgbm9kZXNUaGF0R290Q2xvbmVkLnB1c2gob3JpZ2luYWxOb2RlKTsKICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbkNhbGxNZXRhbm9kZXNUb0FkZC5wdXNoKGNsb25lZE1ldGFub2RlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gUGVyZm9ybSBub2RlIHJlcGxhY2VtZW50LgogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2goZnVuY3Rpb25DYWxsTWV0YW5vZGVzVG9BZGQsIChjbG9uZWRNZXRhbm9kZSwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsTm9kZSA9IG5vZGVzVGhhdEdvdENsb25lZFtpXTsKICAgICAgICAgICAgICAgICAgICBjbG9uZWRNZXRhbm9kZS5wYXJlbnROb2RlID0gb3JpZ2luYWxOb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgICAgICAgICAgbWV0YWdyYXBoLnNldE5vZGUob3JpZ2luYWxOb2RlLm5hbWUsIGNsb25lZE1ldGFub2RlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeS5zZXROb2RlKG9yaWdpbmFsTm9kZS5uYW1lLCBjbG9uZWRNZXRhbm9kZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDcmVhdGUgcmVuZGVyIG5vZGVzIHRvIHJlcHJlc2VudCBlYWNoIGNoaWxkIGZyb20gdGhlIG1ldGFncmFwaC4gQWx0aG91Z2gKICAgICAgICAgICAgLy8gdGhlc2Ugd2lsbCBpbml0aWFsbHkgYmUgYWRkZWQgdG8gdGhlIGNvcmVHcmFwaCwgdGhleSBtYXkgbGF0ZXIgYmUKICAgICAgICAgICAgLy8gZXh0cmFjdGVkLiBBbHNvLCBkdWUgdG8gZXh0cmFjdGlvbiwgdGhlIGNvcmVHcmFwaCBtYXkgY29udGFpbiBkaXNqb2ludAogICAgICAgICAgICAvLyBncm91cHMgYmV0d2VlbiB3aGljaCB0aGVyZSBpcyBubyB2aXNpYmxlIHBhdGggKG90aGVyIHRoYW4gYW5ub3RhdGlvbnMpLgogICAgICAgICAgICBsb2Rhc2guZWFjaChtZXRhZ3JhcGgubm9kZXMoKSwgKGNoaWxkTmFtZSkgPT4gewogICAgICAgICAgICAgICAgbGV0IGNoaWxkUmVuZGVySW5mbyA9IHRoaXMuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKGNoaWxkTmFtZSk7CiAgICAgICAgICAgICAgICBsZXQgY2hpbGROb2RlID0gY2hpbGRSZW5kZXJJbmZvLm5vZGU7CiAgICAgICAgICAgICAgICBjb3JlR3JhcGguc2V0Tm9kZShjaGlsZE5hbWUsIGNoaWxkUmVuZGVySW5mbyk7CiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkTm9kZS5pc0dyb3VwTm9kZSkgewogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKGNoaWxkTm9kZS5pbkVtYmVkZGluZ3MsIChlbWJlZGRpbmcpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbmRlck1ldGFlZGdlSW5mbyA9IG5ldyBSZW5kZXJNZXRhZWRnZUluZm8obnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCByZW5kZXJOb2RlSW5mbyA9IG5ldyBSZW5kZXJOb2RlSW5mbyhlbWJlZGRpbmcpOwogICAgICAgICAgICAgICAgICAgICAgICBhZGRJbkFubm90YXRpb24oY2hpbGRSZW5kZXJJbmZvLCBlbWJlZGRpbmcsIHJlbmRlck5vZGVJbmZvLCByZW5kZXJNZXRhZWRnZUluZm8sIEFubm90YXRpb25UeXBlLkNPTlNUQU5UKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleFtlbWJlZGRpbmcubmFtZV0gPSByZW5kZXJOb2RlSW5mbzsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChjaGlsZE5vZGUub3V0RW1iZWRkaW5ncywgKGVtYmVkZGluZykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVuZGVyTWV0YWVkZ2VJbmZvID0gbmV3IFJlbmRlck1ldGFlZGdlSW5mbyhudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlbmRlck5vZGVJbmZvID0gbmV3IFJlbmRlck5vZGVJbmZvKGVtYmVkZGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkZE91dEFubm90YXRpb24oY2hpbGRSZW5kZXJJbmZvLCBlbWJlZGRpbmcsIHJlbmRlck5vZGVJbmZvLCByZW5kZXJNZXRhZWRnZUluZm8sIEFubm90YXRpb25UeXBlLlNVTU1BUlkpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4W2VtYmVkZGluZy5uYW1lXSA9IHJlbmRlck5vZGVJbmZvOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gQWRkIHJlbmRlciBtZXRhZWRnZSBpbmZvIGZvciBlZGdlcyBpbiB0aGUgbWV0YWdyYXBoLgogICAgICAgICAgICBsb2Rhc2guZWFjaChtZXRhZ3JhcGguZWRnZXMoKSwgKGVkZ2VPYmopID0+IHsKICAgICAgICAgICAgICAgIGxldCBtZXRhZWRnZSA9IG1ldGFncmFwaC5lZGdlKGVkZ2VPYmopOwogICAgICAgICAgICAgICAgbGV0IHJlbmRlck1ldGFlZGdlSW5mbyA9IG5ldyBSZW5kZXJNZXRhZWRnZUluZm8obWV0YWVkZ2UpOwogICAgICAgICAgICAgICAgcmVuZGVyTWV0YWVkZ2VJbmZvLmlzRmFkZWRPdXQgPQogICAgICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhbZWRnZU9iai52XS5pc0ZhZGVkT3V0IHx8IHRoaXMuaW5kZXhbZWRnZU9iai53XS5pc0ZhZGVkT3V0OwogICAgICAgICAgICAgICAgY29yZUdyYXBoLnNldEVkZ2UoZWRnZU9iai52LCBlZGdlT2JqLncsIHJlbmRlck1ldGFlZGdlSW5mbyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICByZW5kZXJHcm91cE5vZGVJbmZvLm5vZGUudHlwZSA9PT0gTm9kZVR5cGUuTUVUQSkgewogICAgICAgICAgICAgICAgZXh0cmFjdEhpZ2hEZWdyZWVzKHJlbmRlckdyb3VwTm9kZUluZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBmdW5jdGlvbnMsIGl0IGlzIHBvc3NpYmxlIGZvciBtZXRhbm9kZXMgdG8gYmUgZHluYW1pY2FsbHkKICAgICAgICAgICAgLy8gYWRkZWQgbGF0ZXIuIENvbnN0cnVjdCB0aGUgaGllcmFyY2hpZXMgZm9yIG5vZGVzIHRoYXQgYXJlIHByZWRlY2Vzc29ycyB0bwogICAgICAgICAgICAvLyBub2RlcyBpbiB0aGUgY3VycmVudCBoaWVyYXJjaHkgc28gdGhhdCBlZGdlcyBhcmUgZHJhd24gY29ycmVjdGx5LgogICAgICAgICAgICBpZiAoIWxvZGFzaC5pc0VtcHR5KHRoaXMuaGllcmFyY2h5LmxpYnJhcnlGdW5jdGlvbnMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkU3ViaGllcmFyY2hpZXNGb3JOZWVkZWRGdW5jdGlvbnMobWV0YWdyYXBoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09IFJPT1RfTkFNRSkgewogICAgICAgICAgICAgICAgLy8gQWRkIGFsbCBtZXRhbm9kZXMgcmVwcmVzZW50aW5nIGxpYnJhcnkgZnVuY3Rpb24gdGVtcGxhdGVzIGludG8gdGhlCiAgICAgICAgICAgICAgICAvLyBsaWJyYXJ5IGZ1bmN0aW9uIHNjZW5lIGdyb3VwIGZvciB0aGUgcm9vdCBub2RlLgogICAgICAgICAgICAgICAgbG9kYXNoLmZvck93bih0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zLCAobGlicmFyeUZ1bmN0aW9uRGF0YSwgZnVuY3Rpb25OYW1lKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZSA9IGxpYnJhcnlGdW5jdGlvbkRhdGEubm9kZTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFJlbmRlckluZm8gPSB0aGlzLmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShub2RlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIHJlbmRlckdyb3VwTm9kZUluZm8ubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QucHVzaChjaGlsZFJlbmRlckluZm8pOwogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCByZW5kZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMgaW4gdGhlIGNvcmUgZ3JhcGguCiAgICAgICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJJbmZvLm5vZGUuaW5jbHVkZSA9IEluY2x1c2lvblR5cGUuRVhDTFVERTsKICAgICAgICAgICAgICAgICAgICBjb3JlR3JhcGgucmVtb3ZlTm9kZShub2RlLm5hbWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTG9vayB1cCB0aGUgcGFyZW50IG5vZGUncyByZW5kZXIgaW5mb3JtYXRpb24gYW5kIHNob3J0IGNpcmN1aXQgaWYgbm9uZS4KICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSByZW5kZXJHcm91cE5vZGVJbmZvLm5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgaWYgKCFwYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHBhcmVudE5vZGVJbmZvID0gdGhpcy5pbmRleFtwYXJlbnROb2RlLm5hbWVdOwogICAgICAgICAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBjb21wdXRpbmcgdGhlIG5hbWUgb2YgYSBicmlkZ2Ugbm9kZS4KICAgICAgICAgICAgbGV0IGdldEJyaWRnZU5vZGVOYW1lID0gKGluYm91bmQsIC4uLnJlc3QpID0+IHJlc3QuY29uY2F0KFtpbmJvdW5kID8gJ0lOJyA6ICdPVVQnXSkuam9pbignfn4nKTsKICAgICAgICAgICAgLy8gQnVpbGQgb3V0IHRoZSBicmlkZ2VncmFwaC4KICAgICAgICAgICAgbGV0IGJyaWRnZWdyYXBoID0gdGhpcy5oaWVyYXJjaHkuZ2V0QnJpZGdlZ3JhcGgobm9kZU5hbWUpOwogICAgICAgICAgICAvLyBMb29rIGZvciBwb3B1bGFyIG5vZGVzIHNvIHdlIGNhbiBtYWtlIGFubm90YXRpb25zIGluc3RlYWQgb2YgcGF0aHMuCiAgICAgICAgICAgIGxldCBvdGhlckNvdW50cyA9IHsKICAgICAgICAgICAgICAgIC8vIENvdW50cyBvZiBlZGdlcyBjb21pbmcgSU5UTyBvdGhlciBub2RlcyBieSBuYW1lIChvdXRnb2luZyBmcm9tIHNlbGYpLgogICAgICAgICAgICAgICAgaW46IHt9LAogICAgICAgICAgICAgICAgLy8gQ291bnRzIG9mIGVkZ2VzIGdvaW5nIE9VVCBmcm9tIG90aGVyIG5vZGVzIGJ5IG5hbWUgKGNvbWluZyBpbnRvIHNlbGYpLgogICAgICAgICAgICAgICAgb3V0OiB7fSwKICAgICAgICAgICAgICAgIC8vIENvdW50cyBvZiBhbGwgY29udHJvbCBlZGdlcyBpbnZvbHZpbmcgb3RoZXIgbm9kZXMgYnkgbmFtZS4KICAgICAgICAgICAgICAgIGNvbnRyb2w6IHt9LAogICAgICAgICAgICB9OwogICAgICAgICAgICBsb2Rhc2guZWFjaChicmlkZ2VncmFwaC5lZGdlcygpLCAoZSkgPT4gewogICAgICAgICAgICAgICAgLy8gQW4gZWRnZSBpcyBpbmJvdW5kIGlmIGl0cyBkZXN0aW5hdGlvbiBub2RlIGlzIGluIHRoZSBtZXRhZ3JhcGguCiAgICAgICAgICAgICAgICBsZXQgaW5ib3VuZCA9ICEhbWV0YWdyYXBoLm5vZGUoZS53KTsKICAgICAgICAgICAgICAgIGxldCBvdGhlck5hbWUgPSBpbmJvdW5kID8gZS52IDogZS53OwogICAgICAgICAgICAgICAgbGV0IG1ldGFlZGdlID0gYnJpZGdlZ3JhcGguZWRnZShlKTsKICAgICAgICAgICAgICAgIGlmICghbWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgb3RoZXJDb3VudHMuY29udHJvbFtvdGhlck5hbWVdID0KICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyQ291bnRzLmNvbnRyb2xbb3RoZXJOYW1lXSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChpbmJvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgb3RoZXJDb3VudHMub3V0W290aGVyTmFtZV0gPSAob3RoZXJDb3VudHMub3V0W290aGVyTmFtZV0gfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgb3RoZXJDb3VudHMuaW5bb3RoZXJOYW1lXSA9IChvdGhlckNvdW50cy5pbltvdGhlck5hbWVdIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIEFkZCBhbm5vdGF0aW9ucyBhbmQgZWRnZXMgZm9yIGJyaWRnZWdyYXBoIHJlbGF0aW9uc2hpcHMuCiAgICAgICAgICAgIGxldCBoaWVyYXJjaHlOb2RlTWFwID0gdGhpcy5oaWVyYXJjaHkuZ2V0Tm9kZU1hcCgpOwogICAgICAgICAgICBsb2Rhc2guZWFjaChicmlkZ2VncmFwaC5lZGdlcygpLCAoYnJpZGdlRWRnZU9iaikgPT4gewogICAgICAgICAgICAgICAgbGV0IGJyaWRnZU1ldGFlZGdlID0gYnJpZGdlZ3JhcGguZWRnZShicmlkZ2VFZGdlT2JqKTsKICAgICAgICAgICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgYnJpZGdlIGVkZ2UgaXMgaW5jb21pbmcgYnkgY2hlY2tpbmcgdGhlCiAgICAgICAgICAgICAgICAvLyBtZXRhZ3JhcGggZm9yIGEgbm9kZSB0aGF0IG1hdGNoZXMgdGhlIGRlc3RpbmF0aW9uIGVuZC4KICAgICAgICAgICAgICAgIGxldCBpbmJvdW5kID0gISFtZXRhZ3JhcGgubm9kZShicmlkZ2VFZGdlT2JqLncpOwogICAgICAgICAgICAgICAgLy8gQmFzZWQgb24gdGhlIGRpcmVjdGlvbiBvZiB0aGUgZWRnZSwgb25lIGVuZHBvaW50IHdpbGwgYmUgYW4gaW1tZWRpYXRlCiAgICAgICAgICAgICAgICAvLyBjaGlsZCBvZiB0aGlzIHJlbmRlck5vZGVJbmZvLCBhbmQgdGhlIG90aGVyIGVuZHBvaW50IHdpbGwgYmUgYSBzaWJsaW5nCiAgICAgICAgICAgICAgICAvLyBvZiB0aGUgcGFyZW50IChvciBhbiBhbmNlc3RvciBmdXJ0aGVyIHVwKS4KICAgICAgICAgICAgICAgIGxldCBbY2hpbGROYW1lLCBvdGhlck5hbWVdID0gaW5ib3VuZAogICAgICAgICAgICAgICAgICAgID8gW2JyaWRnZUVkZ2VPYmoudywgYnJpZGdlRWRnZU9iai52XQogICAgICAgICAgICAgICAgICAgIDogW2JyaWRnZUVkZ2VPYmoudiwgYnJpZGdlRWRnZU9iai53XTsKICAgICAgICAgICAgICAgIGxldCBjaGlsZFJlbmRlckluZm8gPSB0aGlzLmluZGV4W2NoaWxkTmFtZV07CiAgICAgICAgICAgICAgICBsZXQgb3RoZXJSZW5kZXJJbmZvID0gdGhpcy5pbmRleFtvdGhlck5hbWVdOwogICAgICAgICAgICAgICAgbGV0IG90aGVyTm9kZSA9IG90aGVyUmVuZGVySW5mbwogICAgICAgICAgICAgICAgICAgID8gb3RoZXJSZW5kZXJJbmZvLm5vZGUKICAgICAgICAgICAgICAgICAgICA6IGhpZXJhcmNoeU5vZGVNYXBbb3RoZXJOYW1lXTsKICAgICAgICAgICAgICAgIC8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgZWRnZSBpcyBhIGNvbnRyb2wgZWRnZSBiZXR3ZWVuIG5vZGVzIHdoZXJlCiAgICAgICAgICAgICAgICAvLyBlaXRoZXIgbm9kZSBpcyBoaWdoLWRlZ3JlZSB3aXRoIHJlc3BlY3QgdG8gY29udHJvbCBlZGdlcy4gVGhpcyB3aWxsCiAgICAgICAgICAgICAgICAvLyBiZSBhIHNpZ25hbCB0byBzaG93IGl0IGFzIGFuIGFubm90YXRpb24gaW5zdGVhZCBvZiBhIGJyaWRnZSBlZGdlLgogICAgICAgICAgICAgICAgbGV0IGlzSGlnaERlZ3JlZUNvbnRyb2xFZGdlID0gIWJyaWRnZU1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlcyAmJgogICAgICAgICAgICAgICAgICAgIG90aGVyQ291bnRzLmNvbnRyb2xbb3RoZXJOYW1lXSA+IFBBUkFNUy5tYXhDb250cm9sRGVncmVlOwogICAgICAgICAgICAgICAgbGV0IFssIGNoaWxkQW5ub3RhdGlvbnNdID0gaW5ib3VuZAogICAgICAgICAgICAgICAgICAgID8gW3JlbmRlck5vZGVJbmZvLmluQW5ub3RhdGlvbnMsIGNoaWxkUmVuZGVySW5mby5pbkFubm90YXRpb25zXQogICAgICAgICAgICAgICAgICAgIDogW3JlbmRlck5vZGVJbmZvLm91dEFubm90YXRpb25zLCBjaGlsZFJlbmRlckluZm8ub3V0QW5ub3RhdGlvbnNdOwogICAgICAgICAgICAgICAgLy8gRG9uJ3QgcmVuZGVyIGEgYnJpZGdlIHBhdGggaWYgdGhlIG90aGVyIG5vZGUgaGFzIGluIG9yIG91dCBkZWdyZWUgYWJvdmUKICAgICAgICAgICAgICAgIC8vIGEgdGhyZXNob2xkLCBsZXN0IGJyaWRnZSBwYXRocyBlbWFuYXRpbmcgb3V0IG9mIGEgbWV0YWdyYXBoIGNyb3dkIHVwLAogICAgICAgICAgICAgICAgLy8gYXMgd2FzIHRoZSBjYXNlIGZvciB0aGUgRmF0Y2F0IExTVE0gbHN0bV8xID4gbHN0bV8xIG1ldGFncmFwaC4KICAgICAgICAgICAgICAgIGxldCBvdGhlckRlZ3JlZUNvdW50ID0gKGluYm91bmQgPyBvdGhlckNvdW50cy5vdXQgOiBvdGhlckNvdW50cy5pbilbb3RoZXJOYW1lXTsKICAgICAgICAgICAgICAgIGxldCBpc090aGVySGlnaERlZ3JlZSA9IG90aGVyRGVncmVlQ291bnQgPiBQQVJBTVMubWF4QnJpZGdlUGF0aERlZ3JlZTsKICAgICAgICAgICAgICAgIC8vIFRoZSBhZGpvaW5pbmcgcmVuZGVyIG1ldGFlZGdlIGluZm8gZnJvbSB0aGUgcGFyZW50J3MgY29yZUdyYXBoLCBpZiBhbnkuCiAgICAgICAgICAgICAgICAvLyBJdCB3aWxsIGVpdGhlciBiZSBhIE1ldGFlZGdlIGludm9sdmluZyB0aGlzIG5vZGUgZGlyZWN0bHksIGlmIGl0CiAgICAgICAgICAgICAgICAvLyBwcmV2aW91c2x5IGNhbWUgZnJvbSBhIG1ldGFncmFwaCwgb3IgaXQnbGwgYmUgYSBNZXRhZWRnZSBpbnZvbHZpbmcKICAgICAgICAgICAgICAgIC8vIGEgcHJldmlvdXNseSBjcmVhdGVkIGJyaWRnZSBub2RlIHN0YW5kaW5nIGluIGZvciB0aGUgb3RoZXIgbm9kZS4KICAgICAgICAgICAgICAgIGxldCBhZGpvaW5pbmdNZXRhZWRnZSA9IG51bGw7CiAgICAgICAgICAgICAgICAvLyBXZSBjYW4gb25seSBob3BlIHRvIHJlbmRlciBhIGJyaWRnZSBwYXRoIGlmOgogICAgICAgICAgICAgICAgLy8gIC0gYnJpZGdlZ3JhcGggcGF0aHMgYXJlIGVuYWJsZWQsCiAgICAgICAgICAgICAgICAvLyAgLSB0aGUgb3RoZXIgbm9kZSBpcyBub3QgdG9vIGhpZ2gtZGVncmVlLAogICAgICAgICAgICAgICAgLy8gIC0gdGhlIGNoaWxkIGlzIGluIHRoZSBjb3JlIChub3QgZXh0cmFjdGVkIGZvciBiZWluZyBoaWdoLWRlZ3JlZSksIGFuZAogICAgICAgICAgICAgICAgLy8gIC0gdGhlcmUncyBhIHBhdGggKGluIHRoZSB0cmF2ZXJzYWwgc2Vuc2UpIGJldHdlZW4gY2hpbGQgYW5kIG90aGVyLgogICAgICAgICAgICAgICAgbGV0IGNhbkRyYXdCcmlkZ2VQYXRoID0gZmFsc2U7CiAgICAgICAgICAgICAgICBpZiAoCiAgICAgICAgICAgICAgICAgICAgIWlzT3RoZXJIaWdoRGVncmVlICYmCiAgICAgICAgICAgICAgICAgICAgIWlzSGlnaERlZ3JlZUNvbnRyb2xFZGdlICYmCiAgICAgICAgICAgICAgICAgICAgY2hpbGRSZW5kZXJJbmZvLmlzSW5Db3JlKCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBmaW5kaW5nIGFuIGFkam9pbmluZyBtZXRhZWRnZS4KICAgICAgICAgICAgICAgICAgICBsZXQgZmluZEFkam9pbmluZ01ldGFlZGdlID0gKHRhcmdldE5hbWUpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFkam9pbmluZ0VkZ2VPYmogPSBpbmJvdW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHsgdjogdGFyZ2V0TmFtZSwgdzogbm9kZU5hbWUgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7IHY6IG5vZGVOYW1lLCB3OiB0YXJnZXROYW1lIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAocGFyZW50Tm9kZUluZm8uY29yZUdyYXBoLmVkZ2UoYWRqb2luaW5nRWRnZU9iaikpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgYWRqb2luaW5nTWV0YWVkZ2UgPSBmaW5kQWRqb2luaW5nTWV0YWVkZ2Uob3RoZXJOYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWFkam9pbmluZ01ldGFlZGdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFkam9pbmluZ01ldGFlZGdlID0gZmluZEFkam9pbmluZ01ldGFlZGdlKGdldEJyaWRnZU5vZGVOYW1lKGluYm91bmQsIG90aGVyTmFtZSwgcGFyZW50Tm9kZS5uYW1lKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhbkRyYXdCcmlkZ2VQYXRoID0gISFhZGpvaW5pbmdNZXRhZWRnZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEFsdGhvdWdoIGRhdGFmbG93IGVkZ2VzIGFyZSBhY3ljbGljLCBjb250cm9sIGRlcGVuZGVuY3kgZWRnZXMgbWF5CiAgICAgICAgICAgICAgICAvLyBhY3R1YWxseSBwb2ludCAnYmFja3dhcmRzJyBpbiB0aGUgZ3JhcGguIElmIHRoaXMgYnJpZGdlTWV0YWVkZ2UgaXMKICAgICAgICAgICAgICAgIC8vIGEgY29udHJvbCBkZXBlbmRlbmN5LCB3ZSBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIGl0J3MgYmFja3dhcmRzCiAgICAgICAgICAgICAgICAvLyBwb2ludGluZyBzbyB0aGF0IHdlIHJlbmRlciBpdCBhcHByb3ByaWF0ZWx5LgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIEZvciBpbnN0YW5jZSwgc2F5IHdlJ3JlIHJlbmRlcmluZyBhIGdyYXBoIHdpdGggbm9kZXMgbmFtZWQgQS9CIGFuZCBaL1ksCiAgICAgICAgICAgICAgICAvLyBhbmQgd2UncmUgY3VycmVudGx5IHJlbmRlcmluZyB0aGUgYnJpZGdlZ3JhcGggZm9yIEEuIEZ1cnRoZXIsIGxldCdzIHNheQogICAgICAgICAgICAgICAgLy8gdGhhdCB0aGVyZSB3YXMgYW4gb3JpZ2luYWwgQmFzZUVkZ2UgZnJvbSBBL0ItPlovWSBhbmQgYSBDT05UUk9MIEVER0UKICAgICAgICAgICAgICAgIC8vIGZyb20gWi9ZPT5BL0IuCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gICAgICstLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgLy8gICAgIHwgQSAgICAgICAgICAgICAgfAogICAgICAgICAgICAgICAgLy8gICAgIHwgICstLS0tLSsgICAgICAgfCAgICAgICAgICstLS0tLS0rCiAgICAgICAgICAgICAgICAvLyAgICAgfCAgfCBCICAgfD4tLS0tLT58Pi0tLS0tLS0+fCBaICAgIHwKICAgICAgICAgICAgICAgIC8vICAgICB8ICB8ICAgICB8ICAgICAgIHwgICAgICAgICB8ICAgICAgfAogICAgICAgICAgICAgICAgLy8gICAgIHwgIHwgICAgIHwgICAqICAgfCAgICAgICAgIHwgICAgICB8CiAgICAgICAgICAgICAgICAvLyAgICAgfCAgfCAgICAgfDw9PT09PTx8PD09PT09PT08fCAgICAgIHwKICAgICAgICAgICAgICAgIC8vICAgICB8ICArLS0tLS0rICAgICAgIHwgICAgICAgICArLS0tLS0tKwogICAgICAgICAgICAgICAgLy8gICAgICstLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UgcmVuZGVyIHRoZSBzdWJoaWVyYXJjaHkgZm9yIE1ldGFub2RlIEEsIHdlJ2xsIGNvbWUgYWNyb3NzIGEKICAgICAgICAgICAgICAgIC8vIGNvbnRyb2wtb25seSBNZXRhZWRnZSBpbiB0aGUgYnJpZGdlZ3JhcGggZnJvbSBaPT5BL0IgKCopLiBUaGUgcXVlc3Rpb24KICAgICAgICAgICAgICAgIC8vIGlzIHdoZXRoZXIgdGhpcyBlZGdlIGlzIGJhY2t3YXJkcy4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBUbyBhbnN3ZXIgdGhhdCBxdWVzdGlvbiwgd2UgZm9sbG93IHRoZSBjaGFpbiBvZiBhZGpvaW5pbmcgbWV0YWVkZ2VzCiAgICAgICAgICAgICAgICAvLyB1bnRpbCB3ZSByZWFjaCB0aGUgdG9wbW9zdCBvbmUuIEluIHRoaXMgY2FzZSwgdGhhdCdzIHRoZSBjb250cm9sLW9ubHkKICAgICAgICAgICAgICAgIC8vIE1ldGFlZGdlIFo9PkEgaW4gdGhlIFJPT1QncyBtZXRhZ3JhcGguIFdlIGRldGVybWluZSB0aGF0IHRoaXMgZWRnZQogICAgICAgICAgICAgICAgLy8gaXMgYmFja3dhcmRzIGJ5IGxvb2tpbmcgYXQgdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nIG9mIFJPT1QncyBtZXRhZ3JhcGgKICAgICAgICAgICAgICAgIC8vICh3aGljaCBpZ25vcmVzIGNvbnRyb2wgZWRnZXMpIGFuZCBzZWVpbmcgdGhhdCBaIGNvbWVzIEFGVEVSIEEuCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gVGhlIHByb3BlcnR5IG9mIGJlaW5nIGJhY2t3YXJkcyBpcyBpbmRlcGVuZGVudCBvZiB3aGV0aGVyIHRoZSBlZGdlCiAgICAgICAgICAgICAgICAvLyBpcyBpbmJvdW5kIG9yIG91dGJvdW5kLiBJbiB0aGUgcHJlY2VkaW5nIGV4YW1wbGUsIGlmIHdlIHdlcmUgYnVpbGRpbmcKICAgICAgICAgICAgICAgIC8vIHRoZSBzdWJoaWVyYXJjaHkgZm9yIFosIHdlJ2QgZmluZCBicmlkZ2UgZWRnZSBaL1k9PkEsIHdhbGsgdG8gaXRzCiAgICAgICAgICAgICAgICAvLyB0b3Btb3N0IGFkam9pbmluZyBtZXRhZWRnZSBaPT5BIGFuZCBkaXNjb3ZlciB0aGF0IGl0J3MgYmFja3dhcmRzLgogICAgICAgICAgICAgICAgbGV0IGJhY2t3YXJkcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKGFkam9pbmluZ01ldGFlZGdlICYmICFicmlkZ2VNZXRhZWRnZS5udW1SZWd1bGFyRWRnZXMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBGaW5kIHRoZSB0b3AtbW9zdCBhZGpvaW5pbmcgcmVuZGVyIG1ldGFlZGdlIGluZm9ybWF0aW9uLCBhbmQgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gR3JvdXBOb2RlIHdob3NlIG1ldGFncmFwaCBtdXN0IGNvbnRhaW4gdGhlIGFzc29jaWF0ZWQgbWV0YWVkZ2UuCiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcEFkam9pbmluZ01ldGFlZGdlID0gYWRqb2luaW5nTWV0YWVkZ2U7CiAgICAgICAgICAgICAgICAgICAgbGV0IHRvcEdyb3VwTm9kZSA9IHBhcmVudE5vZGVJbmZvLm5vZGU7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRvcEFkam9pbmluZ01ldGFlZGdlLmFkam9pbmluZ01ldGFlZGdlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcEFkam9pbmluZ01ldGFlZGdlID0gdG9wQWRqb2luaW5nTWV0YWVkZ2UuYWRqb2luaW5nTWV0YWVkZ2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcEdyb3VwTm9kZSA9IHRvcEdyb3VwTm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBhZ2FpbnN0IHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZyBmb3IgdGhlIHRvcCBub2RlLiBUaGUgY3VycmVudAogICAgICAgICAgICAgICAgICAgIC8vIGJyaWRnZSBtZXRhZWRnZSB3ZSdyZSBldmFsdWF0aW5nIGlzIGJhY2t3YXJkcyBpZiBpdHMgc291cmNlIGNvbWVzCiAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgaXRzIGRlc3RpbmF0aW9uLgogICAgICAgICAgICAgICAgICAgIGxldCBvcmRlcmluZyA9IHRoaXMuaGllcmFyY2h5LmdldFRvcG9sb2dpY2FsT3JkZXJpbmcodG9wR3JvdXBOb2RlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIGxldCBlID0gdG9wQWRqb2luaW5nTWV0YWVkZ2UubWV0YWVkZ2U7CiAgICAgICAgICAgICAgICAgICAgYmFja3dhcmRzID0gb3JkZXJpbmdbZS52XSA+IG9yZGVyaW5nW2Uud107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBSZW5kZXIgYmFja3dhcmRzIGNvbnRyb2wgZWRnZXMgYXMgYW5ub3RhdGlvbnMuCiAgICAgICAgICAgICAgICBjYW5EcmF3QnJpZGdlUGF0aCA9IGNhbkRyYXdCcmlkZ2VQYXRoICYmICFiYWNrd2FyZHM7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBjYW4ndCBtYWtlIGEgYnJpZGdlIHBhdGggZm9yIGFueSByZWFzb24sIHRoZW4gd2UgYWRkIGFuCiAgICAgICAgICAgICAgICAvLyBhbm5vdGF0aW9uIGluc3RlYWQuCiAgICAgICAgICAgICAgICBpZiAoIWNhbkRyYXdCcmlkZ2VQYXRoKSB7CiAgICAgICAgICAgICAgICAgICAgY2hpbGRBbm5vdGF0aW9ucy5wdXNoKG5ldyBBbm5vdGF0aW9uKG90aGVyTm9kZSwgb3RoZXJSZW5kZXJJbmZvLCBuZXcgUmVuZGVyTWV0YWVkZ2VJbmZvKGJyaWRnZU1ldGFlZGdlKSwgQW5ub3RhdGlvblR5cGUuU0hPUlRDVVQsIGluYm91bmQpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCBhbGwgY29uZGl0aW9ucyBoYXZlIGJlZW4gbWV0IGZvciBkcmF3aW5nIGEgYnJpZGdlIHBhdGguCiAgICAgICAgICAgICAgICAvLyBGaW5kIG9yIGNyZWF0ZSB0aGUgSU4vT1VUIG5vZGUgcmVwcmVzZW50aW5nIG90aGVyTm9kZS4KICAgICAgICAgICAgICAgIGxldCBicmlkZ2VDb250YWluZXJOYW1lID0gZ2V0QnJpZGdlTm9kZU5hbWUoaW5ib3VuZCwgbm9kZU5hbWUpOwogICAgICAgICAgICAgICAgbGV0IGJyaWRnZU5vZGVOYW1lID0gZ2V0QnJpZGdlTm9kZU5hbWUoaW5ib3VuZCwgb3RoZXJOYW1lLCBub2RlTmFtZSk7CiAgICAgICAgICAgICAgICBsZXQgYnJpZGdlTm9kZVJlbmRlckluZm8gPSBjb3JlR3JhcGgubm9kZShicmlkZ2VOb2RlTmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoIWJyaWRnZU5vZGVSZW5kZXJJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRmluZCBvciBjcmVhdGUgdGhlIGRpcmVjdGlvbmFsIGNvbnRhaW5lciBmb3IgdGhlIGJyaWRnZSBub2RlLgogICAgICAgICAgICAgICAgICAgIGxldCBicmlkZ2VDb250YWluZXJJbmZvID0gY29yZUdyYXBoLm5vZGUoYnJpZGdlQ29udGFpbmVyTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFicmlkZ2VDb250YWluZXJJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBicmlkZ2VDb250YWluZXJOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1wb3J0YW50IG5vZGUgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IGJyaWRnZUNvbnRhaW5lck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBOb2RlVHlwZS5CUklER0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVbnVzZWQgbm9kZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNHcm91cE5vZGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZGluYWxpdHk6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHM6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlOiBJbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVELAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJpZGdlTm9kZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5ib3VuZDogaW5ib3VuZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyaWJ1dGVzOiB7fSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlQ29udGFpbmVySW5mbyA9IG5ldyBSZW5kZXJOb2RlSW5mbyhicmlkZ2VDb250YWluZXJOb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleFticmlkZ2VDb250YWluZXJOYW1lXSA9IGJyaWRnZUNvbnRhaW5lckluZm87CiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVHcmFwaC5zZXROb2RlKGJyaWRnZUNvbnRhaW5lck5hbWUsIGJyaWRnZUNvbnRhaW5lckluZm8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsZXQgYnJpZGdlTm9kZSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1wb3J0YW50IG5vZGUgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogYnJpZGdlTm9kZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlLkJSSURHRSwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVW5pbXBvcnRhbnQgbm9kZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgICAgICAgICBpc0dyb3VwTm9kZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0czogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTogSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQnJpZGdlTm9kZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgICAgICAgICBpbmJvdW5kOiBpbmJvdW5kLAogICAgICAgICAgICAgICAgICAgICAgICBub2RlQXR0cmlidXRlczoge30sCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBicmlkZ2VOb2RlUmVuZGVySW5mbyA9IG5ldyBSZW5kZXJOb2RlSW5mbyhicmlkZ2VOb2RlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4W2JyaWRnZU5vZGVOYW1lXSA9IGJyaWRnZU5vZGVSZW5kZXJJbmZvOwogICAgICAgICAgICAgICAgICAgIGNvcmVHcmFwaC5zZXROb2RlKGJyaWRnZU5vZGVOYW1lLCBicmlkZ2VOb2RlUmVuZGVySW5mbyk7CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGJyaWRnZU5vZGUgdG8gYmUgYSBncmFwaGxpYiBjaGlsZCBvZiB0aGUgY29udGFpbmVyIG5vZGUuCiAgICAgICAgICAgICAgICAgICAgY29yZUdyYXBoLnNldFBhcmVudChicmlkZ2VOb2RlTmFtZSwgYnJpZGdlQ29udGFpbmVyTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgYnJpZGdlQ29udGFpbmVySW5mby5ub2RlLmNhcmRpbmFsaXR5Kys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYW5kIGFkZCBhIGJyaWRnZSByZW5kZXIgbWV0YWVkZ2UuCiAgICAgICAgICAgICAgICBsZXQgYnJpZGdlUmVuZGVyTWV0YWVkZ2UgPSBuZXcgUmVuZGVyTWV0YWVkZ2VJbmZvKGJyaWRnZU1ldGFlZGdlKTsKICAgICAgICAgICAgICAgIGJyaWRnZVJlbmRlck1ldGFlZGdlLmFkam9pbmluZ01ldGFlZGdlID0gYWRqb2luaW5nTWV0YWVkZ2U7CiAgICAgICAgICAgICAgICBpbmJvdW5kCiAgICAgICAgICAgICAgICAgICAgPyBjb3JlR3JhcGguc2V0RWRnZShicmlkZ2VOb2RlTmFtZSwgY2hpbGROYW1lLCBicmlkZ2VSZW5kZXJNZXRhZWRnZSkKICAgICAgICAgICAgICAgICAgICA6IGNvcmVHcmFwaC5zZXRFZGdlKGNoaWxkTmFtZSwgYnJpZGdlTm9kZU5hbWUsIGJyaWRnZVJlbmRlck1ldGFlZGdlKTsKICAgICAgICAgICAgfSk7IC8vIEVuZCBfLmVhY2goYnJpZGdlZ3JhcGguZWRnZXMpLgogICAgICAgICAgICAvLyBGb3IgZWFjaCBicmlkZ2UgY29udGFpbmVyIChJTiBhbmQvb3IgT1VUKSwgYWRkIHN0cnVjdHVyYWwgZWRnZXMgYmV0d2VlbgogICAgICAgICAgICAvLyB0ZXJtaW5hbCBub2RlcyBhbmQgdGhhdCBjb250YWluZXIuIEEgdGVybWluYWwgbm9kZSBpcyBvbmUgd2hpY2ggaGFzIG5vCiAgICAgICAgICAgIC8vIG5vbi1icmlkZ2UgZWRnZXMgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgY29udGFpbmVyLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgYSBNZXRhbm9kZSBBIHdoaWNoIGNvbnRhaW5zIHR3byBjaGlsZCBub2RlcyBBL0IKICAgICAgICAgICAgLy8gYW5kIEEvQy4gTGV0J3Mgc2F5IGl0IGhhcyBvbmUgZWRnZSBpbiB0aGUgbWV0YWdyYXBoIGZyb20gQS9CLT5BL0MsIGFuZAogICAgICAgICAgICAvLyBvbmUgZWRnZSBpbiB0aGUgYnJpZGdlZ3JhcGggZnJvbSBaLT5BL0MuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQsIHdlJ3ZlIGFkZGVkIGEgY29udGFpbmVyIGJyaWRnZSBub2RlIElOIHRvIGhvdXNlIGFsbAogICAgICAgICAgICAvLyBpbmNvbWluZyBicmlkZ2Ugbm9kZXMuIFdlJ3ZlIGFsc28gYWRkZWQgYSBicmlkZ2Ugbm9kZSBaJyAod2l0aCBwYXJlbnQgSU4pCiAgICAgICAgICAgIC8vIHRvIEEsIGFuZCBhIGJyaWRnZSBlZGdlIGZyb20gWictPkMuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgLy8gICAgIHwgQSAgICAgICAgICArLS0tKyAgICAgfAogICAgICAgICAgICAvLyAgICAgfCAgICArLS0tLS0tPnwgQyB8ICAgICB8CiAgICAgICAgICAgIC8vICAgICB8ICAgIHwgICAgICAgKy0tLSsgICAgIHwKICAgICAgICAgICAgLy8gICAgIHwgICAgfCAgICAgICAgIF4gICAgICAgfAogICAgICAgICAgICAvLyAgICAgfCAgICB8ICAgICAgICAgfCAgICAgICB8CiAgICAgICAgICAgIC8vICAgICB8ICAgIHwgICAgKy0tLS18LS0tLSsgIHwKICAgICAgICAgICAgLy8gICAgIHwgICAgfCAgICB8IElOIHwgICAgfCAgfAogICAgICAgICAgICAvLyAgICAgfCAgKy0tLSsgIHwgICstLS0rICB8ICB8CiAgICAgICAgICAgIC8vICAgICB8ICB8IEIgfCAgfCAgfCBaJ3wgIHwgIHwKICAgICAgICAgICAgLy8gICAgIHwgICstLS0rICB8ICArLS0tKyAgfCAgfAogICAgICAgICAgICAvLyAgICAgfCAgICAgICAgICstLS0tLS0tLS0rICB8CiAgICAgICAgICAgIC8vICAgICArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gV2l0aCBubyBvdGhlciBoZWxwLCBkYWdyZSB3b3VsZCBsYXkgb3V0IEIgYW5kIFonIG9uIHRoZSBzYW1lIGxldmVsLAogICAgICAgICAgICAvLyBiZWNhdXNlIGJvdGggb2YgdGhlbSBoYXZlIG5vIGluY29taW5nIGVkZ2VzLiBJbiBvdGhlciB3b3JkcywgQiBpcyBhCiAgICAgICAgICAgIC8vIHRlcm1pbmFsIG5vZGUgaW4gdGhlIElOQ09NSU5HIGRpcmVjdGlvbi4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQnV0IHdlIHdhbnQgdG8gZm9yY2UgZGFncmUgdG8gbGF5IG91dCBaJyAoYW5kIGV2ZXJ5dGhpbmcgaW4gSU4pIGxvd2VyCiAgICAgICAgICAgIC8vIHRoYW4gYWxsIG5vbi1icmlkZ2Ugbm9kZXMsIHNvIHRoYXQgdGhlcmUncyBlbm91Z2ggcm9vbSBmb3IgdGhlIGJyaWRnZQogICAgICAgICAgICAvLyBlZGdlcyBhZnRlciB0aGV5J3ZlIGJlZW4gYWRqdXN0ZWQgdG8gbWVldCB1cCB3aXRoIHBhdGhzIGNvbWluZyBpbiBmcm9tCiAgICAgICAgICAgIC8vIG91dHNpZGUuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRvIGZvcmNlIFonIChhbmQgYWxsIG90aGVyIGJyaWRnZSBub2RlcykgdG8gYmUgbG93ZXN0IGluIHRoZSBncmFwaCwgd2UKICAgICAgICAgICAgLy8gaWRlbnRpZnkgdGVybWluYWwgbm9kZXMgbGlrZSBCIGFuZCBnaXZlIHRoZW0gc3RydWN0dXJhbCBlZGdlcyB0bwogICAgICAgICAgICAvLyBhIG5ldyBzdHJ1Y3R1cmFsIGJyaWRnZSBub2RlIFMgd2hpY2ggd2UgYWRkIHRvIElOLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgIC8vICAgICB8IEEgICAgICAgICAgKy0tLSsgICAgIHwKICAgICAgICAgICAgLy8gICAgIHwgICAgICAgKy0tLT58IEMgfCAgICAgfAogICAgICAgICAgICAvLyAgICAgfCAgICAgICB8ICAgICstLS0rICAgICB8CiAgICAgICAgICAgIC8vICAgICB8ICAgICArLS0tKyAgICBeICAgICAgIHwKICAgICAgICAgICAgLy8gICAgIHwgICAgIHwgQiB8ICAgIHwgICAgICAgfAogICAgICAgICAgICAvLyAgICAgfCAgICAgKy0tLSsgICAgfCAgICAgICB8CiAgICAgICAgICAgIC8vICAgICB8ICAgICAgIF4gICAgICB8ICAgICAgIHwKICAgICAgICAgICAgLy8gICAgIHwgICAgICAgfCAgICAgIHwgICAgICAgfAogICAgICAgICAgICAvLyAgICAgfCAgKy0tLS18LS0tLS0tfC0tLS0rICB8CiAgICAgICAgICAgIC8vICAgICB8ICB8SU4gIHwgICAgICB8ICAgIHwgIHwKICAgICAgICAgICAgLy8gICAgIHwgIHwgICstLS0rICArLS0tKyAgfCAgfAogICAgICAgICAgICAvLyAgICAgfCAgfCAgfCBTIHwgIHwgWid8ICB8ICB8CiAgICAgICAgICAgIC8vICAgICB8ICB8ICArLS0tKyAgKy0tLSsgIHwgIHwKICAgICAgICAgICAgLy8gICAgIHwgICstLS0tLS0tLS0tLS0tLS0tKyAgfAogICAgICAgICAgICAvLyAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoaXMgZW5zdXJlcyB0aGF0IGRhZ3JlIHdpbGwgbGF5IG91dCB0aGUgYnJpZGdlIGNvbnRhaW5lcnMgc3RyaWN0bHkgYXQKICAgICAgICAgICAgLy8gdGhlIGVuZHMgb2YgdGhlIGdyYXBoLiBUaGUgc3RydWN0dXJhbCBlZGdlcyB3aWxsIG5ldmVyIGJlIHNlZW4gaW4gdGhlCiAgICAgICAgICAgIC8vIHZpc3VhbGl6YXRpb24gZXhjZXB0IGFzIGEgZGVidWdnaW5nIGFpZC4KICAgICAgICAgICAgbG9kYXNoLmVhY2goW3RydWUsIGZhbHNlXSwgKGluYm91bmQpID0+IHsKICAgICAgICAgICAgICAgIGxldCBicmlkZ2VDb250YWluZXJOYW1lID0gZ2V0QnJpZGdlTm9kZU5hbWUoaW5ib3VuZCwgbm9kZU5hbWUpOwogICAgICAgICAgICAgICAgbGV0IGJyaWRnZUNvbnRhaW5lckluZm8gPSBjb3JlR3JhcGgubm9kZShicmlkZ2VDb250YWluZXJOYW1lKTsKICAgICAgICAgICAgICAgIGlmICghYnJpZGdlQ29udGFpbmVySW5mbykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKGNvcmVHcmFwaC5ub2RlcygpLCAoY2hpbGROYW1lKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2hvcnQtY2lyY3VpdCBpZiB0aGlzIGNoaWxkIGlzIGEgYnJpZGdlIG5vZGUgb3IgaXQncyBub3QgYSB0ZXJtaW5hbAogICAgICAgICAgICAgICAgICAgIC8vIG5vZGUgaW4gdGhlIGRpcmVjdGlvbiB3ZSdyZSBpbnRlcmVzdGVkIGluLgogICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZE5vZGVJbmZvID0gY29yZUdyYXBoLm5vZGUoY2hpbGROYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlSW5mby5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLkJSSURHRSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxldCBpc1Rlcm1pbmFsID0gaW5ib3VuZAogICAgICAgICAgICAgICAgICAgICAgICA/ICFjb3JlR3JhcGgucHJlZGVjZXNzb3JzKGNoaWxkTmFtZSkubGVuZ3RoCiAgICAgICAgICAgICAgICAgICAgICAgIDogIWNvcmVHcmFwaC5zdWNjZXNzb3JzKGNoaWxkTmFtZSkubGVuZ3RoOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNUZXJtaW5hbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgb3IgY3JlYXRlIGEgYnJpZGdlIG5vZGUgaW4gdGhlIGNvbnRhaW5lciBmb3IgYWxsIHN0cnVjdHVyYWwKICAgICAgICAgICAgICAgICAgICAvLyBtZXRhZWRnZXMuIEl0IHdvdWxkIGhhdmUgYmVlbiBuaWNlIHRvIHNraXAgdGhpcyBzdGVwIGFuZCBzaW1wbHkKICAgICAgICAgICAgICAgICAgICAvLyBzZXQgYSBtZXRhZWRnZSBiZXR3ZWVuIHRoZSB0ZXJtaW5hbCBub2RlIGFuZCB0aGUgY29udGFpbmVyIG5vZGUsIGJ1dAogICAgICAgICAgICAgICAgICAgIC8vIGluIHRoYXQgY2FzZSwgc29tZXRoaW5nIGFib3V0IHRoZSBncmFwaCB1cHNldHMgZGFncmUubGF5b3V0KCkncwogICAgICAgICAgICAgICAgICAgIC8vIGxvbmdlc3RQYXRoIGFsZ29yaXRobSAod2FzIGdldHRpbmcgZXJyb3JzIGR1ZSB0byBhbiB1bmRlZmluZWQpLgogICAgICAgICAgICAgICAgICAgIGxldCBzdHJ1Y3R1cmFsTm9kZU5hbWUgPSBnZXRCcmlkZ2VOb2RlTmFtZShpbmJvdW5kLCBub2RlTmFtZSwgJ1NUUlVDVFVSQUxfVEFSR0VUJyk7CiAgICAgICAgICAgICAgICAgICAgbGV0IHN0cnVjdHVyYWxSZW5kZXJJbmZvID0gY29yZUdyYXBoLm5vZGUoc3RydWN0dXJhbE5vZGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cnVjdHVyYWxSZW5kZXJJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBicmlkZ2VOb2RlID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW1wb3J0YW50IE5vZGUgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHN0cnVjdHVyYWxOb2RlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IE5vZGVUeXBlLkJSSURHRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaW1wb3J0YW50IE5vZGUgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzR3JvdXBOb2RlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcmRpbmFsaXR5OiAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRzOiBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZTogSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJyaWRnZU5vZGUgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluYm91bmQ6IGluYm91bmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlQXR0cmlidXRlczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyYWxSZW5kZXJJbmZvID0gbmV3IFJlbmRlck5vZGVJbmZvKGJyaWRnZU5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsUmVuZGVySW5mby5zdHJ1Y3R1cmFsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbmRleFtzdHJ1Y3R1cmFsTm9kZU5hbWVdID0gc3RydWN0dXJhbFJlbmRlckluZm87CiAgICAgICAgICAgICAgICAgICAgICAgIGNvcmVHcmFwaC5zZXROb2RlKHN0cnVjdHVyYWxOb2RlTmFtZSwgc3RydWN0dXJhbFJlbmRlckluZm8pOwogICAgICAgICAgICAgICAgICAgICAgICBicmlkZ2VDb250YWluZXJJbmZvLm5vZGUuY2FyZGluYWxpdHkrKzsKICAgICAgICAgICAgICAgICAgICAgICAgY29yZUdyYXBoLnNldFBhcmVudChzdHJ1Y3R1cmFsTm9kZU5hbWUsIGJyaWRnZUNvbnRhaW5lck5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHN0cnVjdHVyYWwgTWV0YWVkZ2UgYW5kIGluc2VydCBpdC4KICAgICAgICAgICAgICAgICAgICBsZXQgc3RydWN0dXJhbE1ldGFlZGdlSW5mbyA9IG5ldyBSZW5kZXJNZXRhZWRnZUluZm8obnVsbCk7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0dXJhbE1ldGFlZGdlSW5mby5zdHJ1Y3R1cmFsID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmFsTWV0YWVkZ2VJbmZvLndlaWdodC0tOyAvLyBSZWR1Y2Ugd2VpZ2h0IGZvciBkYWdyZSBsYXlvdXQuCiAgICAgICAgICAgICAgICAgICAgaW5ib3VuZAogICAgICAgICAgICAgICAgICAgICAgICA/IGNvcmVHcmFwaC5zZXRFZGdlKHN0cnVjdHVyYWxOb2RlTmFtZSwgY2hpbGROYW1lLCBzdHJ1Y3R1cmFsTWV0YWVkZ2VJbmZvKQogICAgICAgICAgICAgICAgICAgICAgICA6IGNvcmVHcmFwaC5zZXRFZGdlKGNoaWxkTmFtZSwgc3RydWN0dXJhbE5vZGVOYW1lLCBzdHJ1Y3R1cmFsTWV0YWVkZ2VJbmZvKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgYnVpbGRzIHN1YmhpZXJhcmNoaWVzIGZvciBmdW5jdGlvbiBjYWxscyB0aGF0IGFyZSBuZWVkZWQgZm9yCiAgICAgICAgICogcmVuZGVyaW5nIGVkZ2VzIGluIHRoZSBjdXJyZW50IHN1YmhpZXJhcmNoeSBiZWluZyBidWlsdC4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4gYnVpbGRpbmcgc3ViaGllcmFyY2hpZXMgZm9yIGEgbWV0YWdyYXBoIE0sIHRoZSBzdWJoaWVyYXJjaGllcyBvZgogICAgICAgICAqIG1ldGFub2RlcyBjb250YWluaW5nIGVuZHBvaW50IG5vZGVzIGZvciBlZGdlcyB3aXRoaW4gbWV0YWdyYXBoIE0gbXVzdAogICAgICAgICAqIGFscmVhZHkgYmUgYnVpbHQuIE90aGVyd2lzZSwgYnJpZGdlIGVkZ2VzIHdpbGwgYmUgbWlzc2luZyBmcm9tIHRoZSBncmFwaC4KICAgICAgICAgKi8KICAgICAgICBidWlsZFN1YmhpZXJhcmNoaWVzRm9yTmVlZGVkRnVuY3Rpb25zKG1ldGFncmFwaCkgewogICAgICAgICAgICBsb2Rhc2guZWFjaChtZXRhZ3JhcGguZWRnZXMoKSwgKGVkZ2VPYmopID0+IHsKICAgICAgICAgICAgICAgIGxldCBtZXRhZWRnZSA9IG1ldGFncmFwaC5lZGdlKGVkZ2VPYmopOwogICAgICAgICAgICAgICAgbGV0IHJlbmRlck1ldGFlZGdlSW5mbyA9IG5ldyBSZW5kZXJNZXRhZWRnZUluZm8obWV0YWVkZ2UpOwogICAgICAgICAgICAgICAgbG9kYXNoLmZvckVhY2gocmVuZGVyTWV0YWVkZ2VJbmZvLm1ldGFlZGdlLmJhc2VFZGdlTGlzdCwgKGJhc2VFZGdlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlUGF0aExpc3QgPSBiYXNlRWRnZS52LnNwbGl0KE5BTUVTUEFDRV9ERUxJTSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNvdXJjZVBhdGhMaXN0Lmxlbmd0aDsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbUJlZ2lubmluZ1BhdGhMaXN0ID0gc291cmNlUGF0aExpc3Quc2xpY2UoMCwgaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmhpZXJhcmNoeS5ub2RlKGZyb21CZWdpbm5pbmdQYXRoTGlzdC5qb2luKE5BTUVTUEFDRV9ERUxJTSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuT1AgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZXJhcmNoeS5saWJyYXJ5RnVuY3Rpb25zW25vZGUub3BdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDE7IGogPCBmcm9tQmVnaW5uaW5nUGF0aExpc3QubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXhwYW5kIGFsbCBoaWVyYXJjaGllcyBpbmNsdWRpbmcgdGhlIHBhcmVudC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudE5vZGVOYW1lID0gZnJvbUJlZ2lubmluZ1BhdGhMaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2xpY2UoMCwgaikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKE5BTUVTUEFDRV9ERUxJTSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY3VycmVudE5vZGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCB0aGUgaGllcmFyY2h5IGZvciB0aGlzIGN1cnJlbnQgbGV2ZWwuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRTdWJoaWVyYXJjaHkoY3VycmVudE5vZGVOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGFuYWx5emUgdGhlIG90aGVyIGhpZ2hlciBoaWVyYXJjaGllcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBjbGFzcyBmb3IgcmVuZGVyaW5nIGFubm90YXRpb24gb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGxhYmVsCiAgICAgKiBhYm91dCB0aGUgbm9kZSBlbWJlZGRlZCBhcyBhbm5vdGF0aW9uLCB0eXBlIG9mIGFubm90YXRpb24gYW5kIHRoZSBsb2NhdGlvbgogICAgICogb2YgYm90aCB0aGUgYW5ub3RhdGlvbidzIG5vZGUgYW5kIGVkZ2UuCiAgICAgKgogICAgICogQW5ub3RhdGlvbiBvYmplY3RzIGluY2x1ZGUgZW1iZWRkZWQgY29uc3RhbnRzLCBlbWJlZGRlZCBzdW1tYXJ5LCBhbmQKICAgICAqIGVkZ2Ugc2hvcnRjdXRzLgogICAgICovCiAgICBjbGFzcyBBbm5vdGF0aW9uIHsKICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IEFubm90YXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gbm9kZSBUaGUgdW5kZXJseWluZyBub2RlIHRoaXMgYW5ub3RhdGlvbiBwb2ludHMgdG8uCiAgICAgICAgICogQHBhcmFtIHJlbmRlck5vZGVJbmZvIFRoZSByZW5kZXIgaW5mb3JtYXRpb24gZm9yIHRoZSB1bmRlcmx5aW5nIG5vZGUKICAgICAgICAgKiAgICAgdGhpcyBhbm5vdGF0aW9uIHBvaW50cyB0by4gVGhpcyBjYW4gYmUgbnVsbCBpZiB0aGUgYW5ub3RhdGlvbgogICAgICAgICAqICAgICBkZW5vdGVzIGFuIGVtYmVkZGluZyAoY29uc3RhbnQsIHN1bW1hcnkpLCBpbiB3aGljaCBjYXNlIHdlCiAgICAgICAgICogICAgIHVzZSB0aGUgbm9kZSBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0gcmVuZGVyTWV0YWVkZ2VJbmZvIFRoZSByZW5kZXIgaW5mb3JtYXRpb24gZm9yIHRoZSBlZGdlIGFzc29jaWF0ZWQKICAgICAgICAgKiAgICAgd2l0aCB0aGUgYW5ub3RhdGlvbi4KICAgICAgICAgKiBAcGFyYW0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgYW5ub3RhdGlvbi4KICAgICAgICAgKiBAcGFyYW0gaXNJbiBUcnVlIGlmIGl0IGlzIGFuIGluLWFubm90YXRpb24uIEZhbHNlIGlmIGl0IGlzIGFuCiAgICAgICAgICogICAgIG91dC1hbm5vdGF0aW9uLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5vZGUsIHJlbmRlck5vZGVJbmZvLCByZW5kZXJNZXRhZWRnZUluZm8sIHR5cGUsIGlzSW4pIHsKICAgICAgICAgICAgdGhpcy5ub2RlID0gbm9kZTsKICAgICAgICAgICAgdGhpcy5yZW5kZXJOb2RlSW5mbyA9IHJlbmRlck5vZGVJbmZvOwogICAgICAgICAgICB0aGlzLnJlbmRlck1ldGFlZGdlSW5mbyA9IHJlbmRlck1ldGFlZGdlSW5mbzsKICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uVHlwZSA9IHR5cGU7CiAgICAgICAgICAgIC8vIFByb3BlcnRpZXMgc3BlY2lmaWVkIGJ5IGxheW91dAogICAgICAgICAgICB0aGlzLmR4ID0gMDsKICAgICAgICAgICAgdGhpcy5keSA9IDA7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICAgICAgICB0aGlzLmhlaWdodCA9IDA7CiAgICAgICAgICAgIC8vIFByb3BlcnRpZXMgbmVlZGVkIGZvciBnZW5lcmF0aW5nIGFuIElEIGZvciB0aGUgZWRnZSdzIHBhdGggZWxlbWVudCBpZgogICAgICAgICAgICAvLyB0aGlzIGFubm90YXRpb24gaXMgYXNzb2NpYXRlZCB3aXRoIGEgbWV0YWVkZ2UuCiAgICAgICAgICAgIGlmIChyZW5kZXJNZXRhZWRnZUluZm8gJiYgcmVuZGVyTWV0YWVkZ2VJbmZvLm1ldGFlZGdlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnYgPSByZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2UudjsKICAgICAgICAgICAgICAgIHRoaXMudyA9IHJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZS53OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaXNJbiA9IGlzSW47CiAgICAgICAgICAgIHRoaXMucG9pbnRzID0gW107CiAgICAgICAgfQogICAgfQogICAgdmFyIEFubm90YXRpb25UeXBlOwogICAgKGZ1bmN0aW9uIChBbm5vdGF0aW9uVHlwZSkgewogICAgICAgIEFubm90YXRpb25UeXBlW0Fubm90YXRpb25UeXBlWyJTSE9SVENVVCJdID0gMF0gPSAiU0hPUlRDVVQiOwogICAgICAgIEFubm90YXRpb25UeXBlW0Fubm90YXRpb25UeXBlWyJDT05TVEFOVCJdID0gMV0gPSAiQ09OU1RBTlQiOwogICAgICAgIEFubm90YXRpb25UeXBlW0Fubm90YXRpb25UeXBlWyJTVU1NQVJZIl0gPSAyXSA9ICJTVU1NQVJZIjsKICAgICAgICBBbm5vdGF0aW9uVHlwZVtBbm5vdGF0aW9uVHlwZVsiRUxMSVBTSVMiXSA9IDNdID0gIkVMTElQU0lTIjsKICAgIH0pKEFubm90YXRpb25UeXBlIHx8IChBbm5vdGF0aW9uVHlwZSA9IHt9KSk7CiAgICAvKioKICAgICAqIE1hbmFnZXMgYSBsaXN0IG9mIGFubm90YXRpb25zLiBUd28gd2lsbCBiZSB1c2VkIGZvciBlYWNoCiAgICAgKiBSZW5kZXJOb2RlSW5mbywgb25lIGZvciBpbiBhbm5vdGF0aW9ucyBhbmQgb25lIGZvciBvdXQgYW5ub3RhdGlvbnMuCiAgICAgKi8KICAgIGNsYXNzIEFubm90YXRpb25MaXN0IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5saXN0ID0gW107CiAgICAgICAgICAgIHRoaXMubm9kZU5hbWVzID0ge307CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFwcGVuZCBhbiBhbm5vdGF0aW9uIHRvIHRoZSBsaXN0LCBvciBhIHN0YW5kLWluIGVsbGlwc2lzIGFubm90YXRpb24gaW5zdGVhZAogICAgICAgICAqIGlmIHRoaXMgd291bGQgbWFrZSBpdCB0b28gbWFueS4KICAgICAgICAgKi8KICAgICAgICBwdXNoKGFubm90YXRpb24pIHsKICAgICAgICAgICAgaWYgKGFubm90YXRpb24ubm9kZS5uYW1lIGluIHRoaXMubm9kZU5hbWVzKSB7CiAgICAgICAgICAgICAgICByZXR1cm47IC8vIFNraXAgZHVwbGljYXRlIGFubm90YXRpb24uCiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5ub2RlTmFtZXNbYW5ub3RhdGlvbi5ub2RlLm5hbWVdID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHRoaXMubGlzdC5sZW5ndGggPCBQQVJBTVMubWF4QW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgIHRoaXMubGlzdC5wdXNoKGFubm90YXRpb24pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBsYXN0QW5ub3RhdGlvbiA9IHRoaXMubGlzdFt0aGlzLmxpc3QubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIGlmIChsYXN0QW5ub3RhdGlvbi5hbm5vdGF0aW9uVHlwZSA9PT0gQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMpIHsKICAgICAgICAgICAgICAgIGxldCBlbGxpcHNpc05vZGUgPSBsYXN0QW5ub3RhdGlvbi5ub2RlOwogICAgICAgICAgICAgICAgZWxsaXBzaXNOb2RlLnNldE51bU1vcmVOb2RlcygrK2VsbGlwc2lzTm9kZS5udW1Nb3JlTm9kZXMpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBlbGxpcHNpc05vZGUgPSBuZXcgRWxsaXBzaXNOb2RlSW1wbCgxKTsKICAgICAgICAgICAgdGhpcy5saXN0LnB1c2gobmV3IEFubm90YXRpb24oZWxsaXBzaXNOb2RlLCBuZXcgUmVuZGVyTm9kZUluZm8oZWxsaXBzaXNOb2RlKSwgbnVsbCwgQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMsIGFubm90YXRpb24uaXNJbikpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29udGFpbnMgcmVuZGVyaW5nIGluZm9ybWF0aW9uIGFib3V0IGEgbm9kZSBpbiB0aGUgaGllcmFyY2hpY2FsIGdyYXBoLgogICAgICovCiAgICBjbGFzcyBSZW5kZXJOb2RlSW5mbyB7CiAgICAgICAgY29uc3RydWN0b3Iobm9kZSkgewogICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICAgICAgICB0aGlzLmV4cGFuZGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuaW5Bbm5vdGF0aW9ucyA9IG5ldyBBbm5vdGF0aW9uTGlzdCgpOwogICAgICAgICAgICB0aGlzLm91dEFubm90YXRpb25zID0gbmV3IEFubm90YXRpb25MaXN0KCk7CiAgICAgICAgICAgIC8vIFBhcmFtcyBzcGVjaWZpZWQgYnkgbGF5b3V0CiAgICAgICAgICAgIHRoaXMueCA9IDA7CiAgICAgICAgICAgIHRoaXMueSA9IDA7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICAgICAgICB0aGlzLmhlaWdodCA9IDA7CiAgICAgICAgICAgIHRoaXMuaW5ib3hXaWR0aCA9IDA7CiAgICAgICAgICAgIHRoaXMub3V0Ym94V2lkdGggPSAwOwogICAgICAgICAgICB0aGlzLmV4Y2x1ZGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8vIFBhcmFtcyBmb3IgYnJpZGdlIHBhdGhzLgogICAgICAgICAgICB0aGlzLnN0cnVjdHVyYWwgPSBmYWxzZTsKICAgICAgICAgICAgLy8gUGFyYW1zIGZvciBub2RlIGJveC4KICAgICAgICAgICAgdGhpcy5sYWJlbE9mZnNldCA9IDA7CiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gMDsKICAgICAgICAgICAgLy8gUGFyYW1zIGZvciBleHBhbmRlZCBub2RlCiAgICAgICAgICAgIHRoaXMubGFiZWxIZWlnaHQgPSAwOwogICAgICAgICAgICB0aGlzLnBhZGRpbmdUb3AgPSAwOwogICAgICAgICAgICB0aGlzLnBhZGRpbmdMZWZ0ID0gMDsKICAgICAgICAgICAgdGhpcy5wYWRkaW5nUmlnaHQgPSAwOwogICAgICAgICAgICB0aGlzLnBhZGRpbmdCb3R0b20gPSAwOwogICAgICAgICAgICB0aGlzLmlzSW5FeHRyYWN0ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuaXNPdXRFeHRyYWN0ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuY29yZUJveCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9OwogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB3ZSBkb24ndCBmYWRlIG5vZGVzIG91dC4gRGVmYXVsdCB0byBmYWxzZSBmb3Igc2FmZXR5LgogICAgICAgICAgICB0aGlzLmlzRmFkZWRPdXQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gT25seSB1c2UgdGhlIHBvcnRpb24gYmV5b25kIHRoZSBsYXN0IGRlbGltaXRlciBhcyB0aGUgZGlzcGxheQogICAgICAgICAgICAvLyBuYW1lLgogICAgICAgICAgICB0aGlzLmRpc3BsYXlOYW1lID0gbm9kZS5uYW1lLnN1YnN0cmluZyhub2RlLm5hbWUubGFzdEluZGV4T2YoTkFNRVNQQUNFX0RFTElNKSArIDEpOwogICAgICAgICAgICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZS5NRVRBICYmIG5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAvLyBGdW5jdGlvbiBuYW1lcyBhcmUgc3VmZml4ZWQgd2l0aCBhIGxlbmd0aC04IGhleGFkZWNpbWFsIHN0cmluZwogICAgICAgICAgICAgICAgLy8gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgbnVtYmVyLiBXZSByZW1vdmUgdGhhdCBzdWZmaXggYmVjYXVzZQogICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgZGlkIG5vdCBnZW5lcmF0ZSB0aGF0IHN1ZmZpeC4gVGhhdCBzdWZmaXggbWVyZWx5CiAgICAgICAgICAgICAgICAvLyBzZXJ2ZXMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGZ1bmN0aW9ucyB3aXRoIGRpZmZlcmVudAogICAgICAgICAgICAgICAgLy8gc2lnbmF0dXJlcyBidXQgdGhlIHNhbWUgbmFtZSBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAvLyBGdXJ0aGVybW9yZSwgd2UgcmVtb3ZlIHRoZSBwcmVmaXggdGhhdCBtZXJlbHkgYXNjZXJ0YWlucyB0aGlzCiAgICAgICAgICAgICAgICAvLyBub2RlIGFzIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhlcmUgaXMgbm8gcmVhc29uIGZvciB0aGUgdXNlcgogICAgICAgICAgICAgICAgLy8gdG8gc2VlIHRoYXQgaW4gdGhlIGdyYXBoLCBhcyB0aGUgbm9kZSB3b3VsZCBhbHJlYWR5IGJlIHdpdGhpbgogICAgICAgICAgICAgICAgLy8gdGhlIGZ1bmN0aW9ucyBzY2VuZSBncm91cC4KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdGhpcy5kaXNwbGF5TmFtZS5tYXRjaChub2RlRGlzcGxheU5hbWVSZWdleCk7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGlzcGxheSBuYW1lIGhhZCBiZWVuIHN1Y2Nlc3NmdWxseSBleHRyYWN0ZWQuIFRoaXMgaXMgdGhlIG1vc3QKICAgICAgICAgICAgICAgICAgICAvLyBjb21tb24gc2NlbmFyaW8uCiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNwbGF5TmFtZSA9IG1hdGNoWzFdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobG9kYXNoLnN0YXJ0c1dpdGgodGhpcy5kaXNwbGF5TmFtZSwgRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgc3RyaW5nIGRvZXMgbm90IG1hdGNoIHRoZSB1c3VhbCBwYXR0ZXJuIGZvciBob3cgZnVuY3Rpb25zIGFyZQogICAgICAgICAgICAgICAgICAgIC8vIG5hbWVkLiBKdXN0IHVzZSB0aGUgZW50aXJlIHNlY29uZCBwb3J0aW9uIG9mIHRoZSBzdHJpbmcgYXMgdGhlIG5hbWUKICAgICAgICAgICAgICAgICAgICAvLyBpZiB3ZSBjYW4gc3VjY2Vzc2Z1bGx5IHJlbW92ZSB0aGUgcHJlZml4LgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB0aGlzLmRpc3BsYXlOYW1lLnN1YnN0cmluZyhGVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYLmxlbmd0aCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaXNJbkNvcmUoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5pc0luRXh0cmFjdCAmJiAhdGhpcy5pc091dEV4dHJhY3QgJiYgIXRoaXMuaXNMaWJyYXJ5RnVuY3Rpb247CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb250YWlucyByZW5kZXJpbmcgaW5mb3JtYXRpb24gYWJvdXQgYSBNZXRhZWRnZSBmcm9tIHRoZSB1bmRlcmx5aW5nCiAgICAgKiBoaWVyYXJjaGljYWwgZ3JhcGguIEl0IG1heSBiZSBmcm9tIGVpdGhlciBhIG1ldGFncmFwaCBvciBhIGJyaWRnZWdyYXBoLgogICAgICovCiAgICBjbGFzcyBSZW5kZXJNZXRhZWRnZUluZm8gewogICAgICAgIGNvbnN0cnVjdG9yKG1ldGFlZGdlKSB7CiAgICAgICAgICAgIHRoaXMubWV0YWVkZ2UgPSBtZXRhZWRnZTsKICAgICAgICAgICAgdGhpcy5hZGpvaW5pbmdNZXRhZWRnZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuc3RydWN0dXJhbCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLndlaWdodCA9IDE7CiAgICAgICAgICAgIHRoaXMuaXNGYWRlZE91dCA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFkZEluQW5ub3RhdGlvbihub2RlLCBwcmVkZWNlc3NvciwgcHJlZGVjZXNzb3JSZW5kZXJJbmZvLCBlZGdlLCB0eXBlKSB7CiAgICAgICAgbGV0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbihwcmVkZWNlc3NvciwgcHJlZGVjZXNzb3JSZW5kZXJJbmZvLCBlZGdlLCB0eXBlLCB0cnVlKTsKICAgICAgICBub2RlLmluQW5ub3RhdGlvbnMucHVzaChhbm5vdGF0aW9uKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZE91dEFubm90YXRpb24obm9kZSwgc3VjY2Vzc29yLCBzdWNjZXNzb3JSZW5kZXJJbmZvLCBlZGdlLCB0eXBlKSB7CiAgICAgICAgbGV0IGFubm90YXRpb24gPSBuZXcgQW5ub3RhdGlvbihzdWNjZXNzb3IsIHN1Y2Nlc3NvclJlbmRlckluZm8sIGVkZ2UsIHR5cGUsIGZhbHNlKTsKICAgICAgICBub2RlLm91dEFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbik7CiAgICB9CiAgICBmdW5jdGlvbiBzZXRHcmFwaERlcHRoKGdyYXBoLCBkZXB0aCkgewogICAgICAgIGxvZGFzaC5lYWNoKGdyYXBoLm5vZGVzKCksIChub2RlTmFtZSkgPT4gewogICAgICAgICAgICBsZXQgY2hpbGQgPSBncmFwaC5ub2RlKG5vZGVOYW1lKTsKICAgICAgICAgICAgY2hpbGQuZXhwYW5kZWQgPSBkZXB0aCA+IDE7IC8vIHNldCBhbGwgY2hpbGQgb2YgZGVwdGggMSB0byBjb2xsYXBzZWQKICAgICAgICAgICAgaWYgKGRlcHRoID4gMCkgewogICAgICAgICAgICAgICAgc3dpdGNoIChjaGlsZC5ub2RlLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6CiAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlVHlwZS5TRVJJRVM6CiAgICAgICAgICAgICAgICAgICAgICAgIHNldEdyb3VwTm9kZURlcHRoKGNoaWxkLCBkZXB0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3RoaW5nIGZvciBsZWFmCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIGNsYXNzIFJlbmRlckdyb3VwTm9kZUluZm8gZXh0ZW5kcyBSZW5kZXJOb2RlSW5mbyB7CiAgICAgICAgY29uc3RydWN0b3IoZ3JvdXBOb2RlLCBncmFwaE9wdGlvbnMpIHsKICAgICAgICAgICAgc3VwZXIoZ3JvdXBOb2RlKTsKICAgICAgICAgICAgbGV0IG1ldGFncmFwaCA9IGdyb3VwTm9kZS5tZXRhZ3JhcGg7CiAgICAgICAgICAgIGxldCBnbCA9IG1ldGFncmFwaC5ncmFwaCgpOwogICAgICAgICAgICBncmFwaE9wdGlvbnMuY29tcG91bmQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmNvcmVHcmFwaCA9IGNyZWF0ZUdyYXBoKGdsLm5hbWUsIEdyYXBoVHlwZS5DT1JFLCBncmFwaE9wdGlvbnMpOwogICAgICAgICAgICB0aGlzLmluRXh0cmFjdEJveCA9IHsgd2lkdGg6IDAsIGhlaWdodDogMCB9OwogICAgICAgICAgICB0aGlzLm91dEV4dHJhY3RCb3ggPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICAgICAgdGhpcy5saWJyYXJ5RnVuY3Rpb25zQm94ID0geyB3aWR0aDogMCwgaGVpZ2h0OiAwIH07CiAgICAgICAgICAgIHRoaXMuaXNvbGF0ZWRJbkV4dHJhY3QgPSBbXTsKICAgICAgICAgICAgdGhpcy5pc29sYXRlZE91dEV4dHJhY3QgPSBbXTsKICAgICAgICAgICAgdGhpcy5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCA9IFtdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIHNldEdyb3VwTm9kZURlcHRoKHJlbmRlckluZm8sIGRlcHRoKSB7CiAgICAgICAgaWYgKHJlbmRlckluZm8uY29yZUdyYXBoKSB7CiAgICAgICAgICAgIHNldEdyYXBoRGVwdGgocmVuZGVySW5mby5jb3JlR3JhcGgsIGRlcHRoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBhbiBlZGdlIGZyb20gdGhlIGdyYXBoIGFuZCBhZGQgYW5ub3RhdGlvbnMgdG8gYm90aCBlbmRzIG9mIHRoZSBlZGdlLgogICAgICoKICAgICAqIEBwYXJhbSBUaGUgY29yZSBncmFwaC4KICAgICAqIEBwYXJhbSB2IFNvdXJjZSBuYW1lLgogICAgICogQHBhcmFtIHcgU2luayBuYW1lLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVTaG9ydGN1dChncmFwaCwgdiwgdykgewogICAgICAgIGxldCBzcmMgPSBncmFwaC5ub2RlKHYpOwogICAgICAgIGxldCBzaW5rID0gZ3JhcGgubm9kZSh3KTsKICAgICAgICBsZXQgZWRnZSA9IGdyYXBoLmVkZ2Uodiwgdyk7CiAgICAgICAgLy8gSWYgZWl0aGVyIG9mIHRoZSBub2RlcyBpcyBleHBsaWNpdGx5IGluY2x1ZGVkIGluIHRoZSBtYWluIGdyYXBoIGFuZAogICAgICAgIC8vIGJvdGggbm9kZXMgYXJlIGluIHRoZSBtYWluIGdyYXBoIHRoZW4gZG8gbm90IGNyZWF0ZSB0aGUgc2hvcnRjdXQKICAgICAgICAvLyBhbmQgaW5zdGVhZCBrZWVwIHRoZSByZWFsIGVkZ2UuCiAgICAgICAgaWYgKChzcmMubm9kZS5pbmNsdWRlID09PSBJbmNsdXNpb25UeXBlLklOQ0xVREUgfHwKICAgICAgICAgICAgc2luay5ub2RlLmluY2x1ZGUgPT09IEluY2x1c2lvblR5cGUuSU5DTFVERSkgJiYKICAgICAgICAgICAgc3JjLm5vZGUuaW5jbHVkZSAhPT0gSW5jbHVzaW9uVHlwZS5FWENMVURFICYmCiAgICAgICAgICAgIHNpbmsubm9kZS5pbmNsdWRlICE9PSBJbmNsdXNpb25UeXBlLkVYQ0xVREUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBBZGQgZWFjaCBhbm5vdGF0aW9uLgogICAgICAgIGFkZE91dEFubm90YXRpb24oc3JjLCBzaW5rLm5vZGUsIHNpbmssIGVkZ2UsIEFubm90YXRpb25UeXBlLlNIT1JUQ1VUKTsKICAgICAgICBhZGRJbkFubm90YXRpb24oc2luaywgc3JjLm5vZGUsIHNyYywgZWRnZSwgQW5ub3RhdGlvblR5cGUuU0hPUlRDVVQpOwogICAgICAgIC8vIFJlbW92ZSB0aGUgZWRnZSBmcm9tIHRoZSBjb3JlIGdyYXBoLgogICAgICAgIGdyYXBoLnJlbW92ZUVkZ2Uodiwgdyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBlZGdlcyBmcm9tIGEgbm9kZSwgYW5kIHNldCBpdHMgaXNPdXRFeHRyYWN0IHByb3BlcnR5IHRvIHRydWUsCiAgICAgKiBhbmQgcmVtb3ZlIHRoZSBub2RlIGFuZCBtb3ZlIGl0IHRvIGlzb2xhdGVkT3V0RXh0cmFjdC4KICAgICAqCiAgICAgKiBJZiBkZXRhY2hBbGxFZGdlc0ZvckhpZ2hEZWdyZWUgb3IgZm9yY2VEZXRhY2ggaXMgdHJ1ZSwgZXh0cmFjdCBhbGwgb2YgaXRzCiAgICAgKiBlZGdlcy4gT3RoZXJ3aXNlLCBvbmx5IGV4dHJhY3QgYWxsIGluLWVkZ2VzLgogICAgICovCiAgICBmdW5jdGlvbiBtYWtlT3V0RXh0cmFjdChyZW5kZXJOb2RlLCBuLCBmb3JjZURldGFjaCkgewogICAgICAgIGxldCBncmFwaCA9IHJlbmRlck5vZGUuY29yZUdyYXBoOwogICAgICAgIGxldCBjaGlsZCA9IGdyYXBoLm5vZGUobik7CiAgICAgICAgY2hpbGQuaXNPdXRFeHRyYWN0ID0gdHJ1ZTsKICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5wcmVkZWNlc3NvcnMobiksIChwLCBpbmRleCkgPT4gewogICAgICAgICAgICBjcmVhdGVTaG9ydGN1dChncmFwaCwgcCwgbik7CiAgICAgICAgfSk7CiAgICAgICAgewogICAgICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5zdWNjZXNzb3JzKG4pLCAocywgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGNyZWF0ZVNob3J0Y3V0KGdyYXBoLCBuLCBzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSB0aGUgbm9kZSBmcm9tIHRoZSBjb3JlIGdyYXBoIGlmIGl0IG5vIGxvbmdlciBoYXMgbmVpZ2hib3JzLgogICAgICAgIGlmIChncmFwaC5uZWlnaGJvcnMobikubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgIGNoaWxkLm5vZGUuaW5jbHVkZSA9IEluY2x1c2lvblR5cGUuRVhDTFVERTsKICAgICAgICAgICAgcmVuZGVyTm9kZS5pc29sYXRlZE91dEV4dHJhY3QucHVzaChjaGlsZCk7CiAgICAgICAgICAgIGdyYXBoLnJlbW92ZU5vZGUobik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmUgZWRnZXMgZnJvbSBhIG5vZGUsIHNldCBpdHMgaXNJbkV4dHJhY3QgcHJvcGVydHkgdG8gdHJ1ZSwKICAgICAqIGFuZCByZW1vdmUgdGhlIG5vZGUgYW5kIG1vdmUgaXQgdG8gaXNvbGF0ZWRJbkV4dHJhY3QuCiAgICAgKgogICAgICogSWYgZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlIG9yIGZvcmNlRGV0YWNoIGlzIHRydWUsIGV4dHJhY3QgYWxsIG9mIGl0cwogICAgICogZWRnZXMuIE90aGVyd2lzZSwgb25seSByZW1vdmUgYWxsIG91dC1lZGdlcy4KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUluRXh0cmFjdChyZW5kZXJOb2RlLCBuLCBmb3JjZURldGFjaCkgewogICAgICAgIGxldCBncmFwaCA9IHJlbmRlck5vZGUuY29yZUdyYXBoOwogICAgICAgIGxldCBjaGlsZCA9IGdyYXBoLm5vZGUobik7CiAgICAgICAgY2hpbGQuaXNJbkV4dHJhY3QgPSB0cnVlOwogICAgICAgIGxvZGFzaC5lYWNoKGdyYXBoLnN1Y2Nlc3NvcnMobiksIChzLCBpbmRleCkgPT4gewogICAgICAgICAgICBjcmVhdGVTaG9ydGN1dChncmFwaCwgbiwgcyk7CiAgICAgICAgfSk7CiAgICAgICAgewogICAgICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5wcmVkZWNlc3NvcnMobiksIChwLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgY3JlYXRlU2hvcnRjdXQoZ3JhcGgsIHAsIG4pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLy8gUmVtb3ZlIHRoZSBub2RlIGZyb20gdGhlIGNvcmUgZ3JhcGggaWYgaXQgbm8gbG9uZ2VyIGhhcyBuZWlnaGJvcnMuCiAgICAgICAgaWYgKGdyYXBoLm5laWdoYm9ycyhuKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgY2hpbGQubm9kZS5pbmNsdWRlID0gSW5jbHVzaW9uVHlwZS5FWENMVURFOwogICAgICAgICAgICByZW5kZXJOb2RlLmlzb2xhdGVkSW5FeHRyYWN0LnB1c2goY2hpbGQpOwogICAgICAgICAgICBncmFwaC5yZW1vdmVOb2RlKG4pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2hlY2sgd2hldGhlciB0aGUgbm9kZSdzIHR5cGUgaXMgYSBtZW1iZXIgb2YgdGhlIGdpdmVuIGxpc3Qgb2YgdHlwZXMuCiAgICAgKgogICAgICogQHBhcmFtIG5vZGUgTm9kZS4KICAgICAqIEBwYXJhbSB0eXBlcyBMaXN0IG9mIHR5cGUgdG8gbWF0Y2guCiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc1R5cGVJbihub2RlLCB0eXBlcykgewogICAgICAgIGlmIChub2RlLnR5cGUgPT09IE5vZGVUeXBlLk9QKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdHlwZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChub2RlLm9wID09PSB0eXBlc1tpXSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuTUVUQSkgewogICAgICAgICAgICBsZXQgcm9vdE9wTm9kZSA9IG5vZGUuZ2V0Um9vdE9wKCk7CiAgICAgICAgICAgIGlmIChyb290T3BOb2RlKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJvb3RPcE5vZGUub3AgPT09IHR5cGVzW2ldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKiogTW92ZSBub2RlcyB0aGF0IGFyZSBzcGVjaWZpZWQgdG8gYmUgZXhjbHVkZWQgb3V0IG9mIHRoZSBjb3JlIGdyYXBoLiAqLwogICAgZnVuY3Rpb24gZXh0cmFjdFNwZWNpZmllZE5vZGVzKHJlbmRlck5vZGUpIHsKICAgICAgICBsZXQgZ3JhcGggPSByZW5kZXJOb2RlLmNvcmVHcmFwaDsKICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5ub2RlcygpLCAobikgPT4gewogICAgICAgICAgICBsZXQgcmVuZGVySW5mbyA9IGdyYXBoLm5vZGUobik7CiAgICAgICAgICAgIGlmIChyZW5kZXJJbmZvLm5vZGUuaW5jbHVkZSA9PT0gSW5jbHVzaW9uVHlwZS5FWENMVURFICYmCiAgICAgICAgICAgICAgICAhbi5zdGFydHNXaXRoKEZVTkNUSU9OX0xJQlJBUllfTk9ERV9QUkVGSVgpKSB7CiAgICAgICAgICAgICAgICAvLyBNb3ZlIHRoZSBub2RlIGlmIHRoZSBub2RlIGlzIGV4Y2x1ZGVkIGFuZCBub3QgcGFydCBvZiB0aGUgbGlicmFyeQogICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc2NlbmUgZ3JvdXAsIHdoaWNoIGNvbnRhaW5zIG5vZGVzIHRoYXQgZG8gbm90IHJlcHJlc2VudCBvcHMgaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBncmFwaCBhbmQgc2hvdWxkIHRodXMgbmV2ZXIgaGF2ZSBpdHMgbm9kZXMgYWRkZWQgdG8gdGhlIGNvcmUgZ3JhcGguCiAgICAgICAgICAgICAgICBpZiAocmVuZGVyTm9kZS5jb3JlR3JhcGgub3V0RWRnZXMobikubGVuZ3RoID4KICAgICAgICAgICAgICAgICAgICByZW5kZXJOb2RlLmNvcmVHcmFwaC5pbkVkZ2VzKG4pLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIG1ha2VPdXRFeHRyYWN0KHJlbmRlck5vZGUsIG4pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWFrZUluRXh0cmFjdChyZW5kZXJOb2RlLCBuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqIFJlbW92ZSBlZGdlcyBmcm9tIHByZS1kZWZpbmVkIG91dC1leHRyYWN0IHBhdHRlcm5zICovCiAgICBmdW5jdGlvbiBleHRyYWN0UHJlZGVmaW5lZFNpbmsocmVuZGVyTm9kZSkgewogICAgICAgIGxldCBncmFwaCA9IHJlbmRlck5vZGUuY29yZUdyYXBoOwogICAgICAgIGxvZGFzaC5lYWNoKGdyYXBoLm5vZGVzKCksIChuKSA9PiB7CiAgICAgICAgICAgIGxldCByZW5kZXJJbmZvID0gZ3JhcGgubm9kZShuKTsKICAgICAgICAgICAgaWYgKHJlbmRlckluZm8ubm9kZS5pbmNsdWRlICE9PSBJbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhhc1R5cGVJbihyZW5kZXJJbmZvLm5vZGUsIFBBUkFNUy5vdXRFeHRyYWN0VHlwZXMpKSB7CiAgICAgICAgICAgICAgICBtYWtlT3V0RXh0cmFjdChyZW5kZXJOb2RlLCBuKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqIFJlbW92ZSBlZGdlcyBmcm9tIHByZS1kZWZpbmVkIGluLWV4dHJhY3QgcGF0dGVybnMgKi8KICAgIGZ1bmN0aW9uIGV4dHJhY3RQcmVkZWZpbmVkU291cmNlKHJlbmRlck5vZGUpIHsKICAgICAgICBsZXQgZ3JhcGggPSByZW5kZXJOb2RlLmNvcmVHcmFwaDsKICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5ub2RlcygpLCAobikgPT4gewogICAgICAgICAgICBsZXQgcmVuZGVySW5mbyA9IGdyYXBoLm5vZGUobik7CiAgICAgICAgICAgIGlmIChyZW5kZXJJbmZvLm5vZGUuaW5jbHVkZSAhPT0gSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoYXNUeXBlSW4ocmVuZGVySW5mby5ub2RlLCBQQVJBTVMuaW5FeHRyYWN0VHlwZXMpKSB7CiAgICAgICAgICAgICAgICBtYWtlSW5FeHRyYWN0KHJlbmRlck5vZGUsIG4pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICAvKiogRXh0cmFjdCBub2RlcyBkZWVtZWQgdG8gaGF2ZSBlaXRoZXIgaGlnaCBpbi1kZWdyZWUgb3IgaGlnaCBvdXQtZGVncmVlLiAqLwogICAgZnVuY3Rpb24gZXh0cmFjdEhpZ2hJbk9yT3V0RGVncmVlKHJlbmRlck5vZGUpIHsKICAgICAgICBsZXQgZ3JhcGggPSByZW5kZXJOb2RlLmNvcmVHcmFwaDsKICAgICAgICAvLyBDcmVhdGUgbWFwcGluZ3MgZnJvbSBub2RlIHRvIGluIGFuZCBvdXQgZGVncmVlcy4gQ291bnQgdGhlIG51bWJlciBvZiB2YWxpZAogICAgICAgIC8vIG5vZGVzIGFsb25nIHRoZSB3YXkuCiAgICAgICAgbGV0IG5vZGVUb0luRGVncmVlID0ge307CiAgICAgICAgbGV0IG5vZGVUb091dERlZ3JlZSA9IHt9OwogICAgICAgIGxldCB2YWxpZE5vZGVDb3VudCA9IDA7CiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGgubm9kZXMoKSwgKGN1cnJlbnROb2RlKSA9PiB7CiAgICAgICAgICAgIGlmIChncmFwaC5ub2RlKGN1cnJlbnROb2RlKS5ub2RlLmluY2x1ZGUgIT09IEluY2x1c2lvblR5cGUuVU5TUEVDSUZJRUQpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGZpcnN0IHBsYWNlLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENvdW50IHRoZSBpbiBhbmQgb3V0IGRlZ3JlZXMgYmFzZWQgb24gb25seSByZWd1bGFyIGVkZ2VzLCB1bmxlc3MgdGhlcmUKICAgICAgICAgICAgLy8gYXJlIG5vIHJlZ3VsYXIgZWRnZXMsIGluIHdoaWNoIGNhc2UgdXNlIHRoZSBudW1iZXIgb2YgY29udHJvbCBlZGdlcy4KICAgICAgICAgICAgLy8gVGhpcyBpcyBkb25lIHNvIHRoYXQgY29udHJvbCBlZGdlcyBkb24ndCBhZmZlY3QgaWYgbm9kZXMgYXJlIGV4dHJhY3RlZAogICAgICAgICAgICAvLyBmcm9tIHRoZSBjb3JlIGdyYXBoLCB1bmxlc3MgdGhlIG5vZGUgaXMgb25seSB1c2VkIGZvciBjb250cm9sLgogICAgICAgICAgICBsZXQgaW5EZWdyZWUgPSBsb2Rhc2gucmVkdWNlKGdyYXBoLnByZWRlY2Vzc29ycyhjdXJyZW50Tm9kZSksIChpbkRlZ3JlZSwgcHJlZCkgPT4gewogICAgICAgICAgICAgICAgbGV0IG1ldGFlZGdlID0gZ3JhcGguZWRnZShwcmVkLCBjdXJyZW50Tm9kZSkubWV0YWVkZ2U7CiAgICAgICAgICAgICAgICByZXR1cm4gaW5EZWdyZWUgKyAobWV0YWVkZ2UubnVtUmVndWxhckVkZ2VzID8gMSA6IDApOwogICAgICAgICAgICB9LCAwKTsKICAgICAgICAgICAgaWYgKGluRGVncmVlID09PSAwICYmIGdyYXBoLnByZWRlY2Vzc29ycyhjdXJyZW50Tm9kZSkubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgaW5EZWdyZWUgPSBncmFwaC5wcmVkZWNlc3NvcnMoY3VycmVudE5vZGUpLmxlbmd0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgb3V0RGVncmVlID0gbG9kYXNoLnJlZHVjZShncmFwaC5zdWNjZXNzb3JzKGN1cnJlbnROb2RlKSwgKG91dERlZ3JlZSwgc3VjYykgPT4gewogICAgICAgICAgICAgICAgbGV0IG1ldGFlZGdlID0gZ3JhcGguZWRnZShjdXJyZW50Tm9kZSwgc3VjYykubWV0YWVkZ2U7CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0RGVncmVlICsgKG1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlcyA/IDEgOiAwKTsKICAgICAgICAgICAgfSwgMCk7CiAgICAgICAgICAgIGlmIChvdXREZWdyZWUgPT09IDAgJiYgZ3JhcGguc3VjY2Vzc29ycyhjdXJyZW50Tm9kZSkubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgb3V0RGVncmVlID0gZ3JhcGguc3VjY2Vzc29ycyhjdXJyZW50Tm9kZSkubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN0b3JlIHRoZSBpbiBhbmQgb3V0IGRlZ3JlZXMgb2YgdGhpcyBub2RlIHRvIGF2b2lkIHJlY29tcHV0aW5nLgogICAgICAgICAgICBub2RlVG9JbkRlZ3JlZVtjdXJyZW50Tm9kZV0gPSBpbkRlZ3JlZTsKICAgICAgICAgICAgbm9kZVRvT3V0RGVncmVlW2N1cnJlbnROb2RlXSA9IG91dERlZ3JlZTsKICAgICAgICAgICAgdmFsaWROb2RlQ291bnQrKzsKICAgICAgICB9KTsKICAgICAgICBpZiAodmFsaWROb2RlQ291bnQgPCBQQVJBTVMubWluTm9kZUNvdW50Rm9yRXh0cmFjdGlvbikgewogICAgICAgICAgICAvLyBUaGlzIGdyYXBoIGhhcyBmZXcgbm9kZXMuIERvIG5vdCBleHRyYWN0IGFueSBub2Rlcy4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvLyBXZSBvbmx5IGV4dHJhY3QgaWYgdGhlIG5vZGUgaGFzIGEgbWluIGluIG9yIG91dCBkZWdyZWUgZ3JlYXRlciB0aGFuIHRoaXMuCiAgICAgICAgbGV0IG1pblVwcGVyQm91bmQgPSBQQVJBTVMubWluRGVncmVlRm9yRXh0cmFjdGlvbiAtIDE7CiAgICAgICAgLy8gTWFyayBmb3IgZXh0cmFjdGlvbiBub2RlcyB3aXRoIGluLWRlZ3JlZSA+IFEzICsgKFEzIC0gUTEpLgogICAgICAgIGxldCBxM0luZGV4ID0gTWF0aC5yb3VuZCh2YWxpZE5vZGVDb3VudCAqIDAuNzUpOwogICAgICAgIGxldCBxMUluZGV4ID0gTWF0aC5yb3VuZCh2YWxpZE5vZGVDb3VudCAqIDAuMjUpOwogICAgICAgIGxldCBzb3J0ZWRCeUluRGVncmVlID0gT2JqZWN0LmtleXMobm9kZVRvSW5EZWdyZWUpLnNvcnQoKG5vZGUwLCBub2RlMSkgPT4gewogICAgICAgICAgICByZXR1cm4gbm9kZVRvSW5EZWdyZWVbbm9kZTBdIC0gbm9kZVRvSW5EZWdyZWVbbm9kZTFdOwogICAgICAgIH0pOwogICAgICAgIGxldCBpbkRlZ3JlZVEzID0gbm9kZVRvSW5EZWdyZWVbc29ydGVkQnlJbkRlZ3JlZVtxM0luZGV4XV07CiAgICAgICAgbGV0IGluRGVncmVlUTEgPSBub2RlVG9JbkRlZ3JlZVtzb3J0ZWRCeUluRGVncmVlW3ExSW5kZXhdXTsKICAgICAgICBsZXQgaW5EZWdyZWVVcHBlckJvdW5kID0gaW5EZWdyZWVRMyArIGluRGVncmVlUTMgLSBpbkRlZ3JlZVExOwogICAgICAgIC8vIE9ubHkgZXh0cmFjdCBpZiB0aGUgdXBwZXIgYm91bmQgaXMgaGlnaCBlbm91Z2guCiAgICAgICAgaW5EZWdyZWVVcHBlckJvdW5kID0gTWF0aC5tYXgoaW5EZWdyZWVVcHBlckJvdW5kLCBtaW5VcHBlckJvdW5kKTsKICAgICAgICBmb3IgKGxldCBpID0gdmFsaWROb2RlQ291bnQgLSAxOyBub2RlVG9JbkRlZ3JlZVtzb3J0ZWRCeUluRGVncmVlW2ldXSA+IGluRGVncmVlVXBwZXJCb3VuZDsgaS0tKSB7CiAgICAgICAgICAgIC8vIEV4dHJhY3QgYSBoaWdoIGluLWRlZ3JlZSBub2RlLgogICAgICAgICAgICBtYWtlSW5FeHRyYWN0KHJlbmRlck5vZGUsIHNvcnRlZEJ5SW5EZWdyZWVbaV0pOwogICAgICAgIH0KICAgICAgICAvLyBNYXJrIGZvciBleHRyYWN0aW9uIG5vZGVzIHdpdGggb3V0LWRlZ3JlZSA+IFEzICsgKFEzIC0gUTEpICogNC4KICAgICAgICBsZXQgc29ydGVkQnlPdXREZWdyZWUgPSBPYmplY3Qua2V5cyhub2RlVG9PdXREZWdyZWUpLnNvcnQoKG5vZGUwLCBub2RlMSkgPT4gewogICAgICAgICAgICByZXR1cm4gbm9kZVRvT3V0RGVncmVlW25vZGUwXSAtIG5vZGVUb091dERlZ3JlZVtub2RlMV07CiAgICAgICAgfSk7CiAgICAgICAgbGV0IG91dERlZ3JlZVEzID0gbm9kZVRvT3V0RGVncmVlW3NvcnRlZEJ5T3V0RGVncmVlW3EzSW5kZXhdXTsKICAgICAgICBsZXQgb3V0RGVncmVlUTEgPSBub2RlVG9PdXREZWdyZWVbc29ydGVkQnlPdXREZWdyZWVbcTFJbmRleF1dOwogICAgICAgIC8vIFRoZSB1cHBlciBib3VuZCBmb3IgZXh0cmFjdGluZyBvdXQtZGVncmVlIG5vZGVzIGlzIGhpZ2hlciB0aGFuIHRoYXQgZm9yCiAgICAgICAgLy8gZXh0cmFjdGluZyBpbi1kZWdyZWUgb25lcyAoTm90ZSB0aGUgIiogNCIpIGJlY2F1c2UsIGluIHByYWN0aWNlLCBzb21lCiAgICAgICAgLy8gZ3JhcGhzIGxvb2sgd29yc2Ugd2l0aCBhIHNtYWxsZXIgb3V0LWRlZ3JlZSBib3VuZC4gRm9yIGluc3RhbmNlLCBhIHNtYWxsZXIKICAgICAgICAvLyBvdXQtZGVncmVlIGJvdW5kIHJlbW92ZXMgdGhlIGNvbnZvbHV0aW9uIG5vZGVzIGZyb20gY2lmYXIgMTAgdHJhaW4ncyBncmFwaC4KICAgICAgICBsZXQgb3V0RGVncmVlVXBwZXJCb3VuZCA9IG91dERlZ3JlZVEzICsgKG91dERlZ3JlZVEzIC0gb3V0RGVncmVlUTEpICogNDsKICAgICAgICAvLyBPbmx5IGV4dHJhY3QgaWYgdGhlIHVwcGVyIGJvdW5kIGlzIGhpZ2ggZW5vdWdoLgogICAgICAgIG91dERlZ3JlZVVwcGVyQm91bmQgPSBNYXRoLm1heChvdXREZWdyZWVVcHBlckJvdW5kLCBtaW5VcHBlckJvdW5kKTsKICAgICAgICBmb3IgKGxldCBpID0gdmFsaWROb2RlQ291bnQgLSAxOyBub2RlVG9PdXREZWdyZWVbc29ydGVkQnlPdXREZWdyZWVbaV1dID4gb3V0RGVncmVlVXBwZXJCb3VuZDsgaS0tKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gZ3JhcGgubm9kZShzb3J0ZWRCeU91dERlZ3JlZVtpXSk7CiAgICAgICAgICAgIGlmICghbm9kZSB8fCBub2RlLmlzSW5FeHRyYWN0KSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgaGFzIGFscmVhZHkgYmVlbiBleHRyYWN0ZWQgZHVlIHRvIGhpZ2ggaW4tZGVncmVlLiBJdCBtaWdodAogICAgICAgICAgICAgICAgLy8gaGF2ZSBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgZ3JhcGggaW4gZ2VuZXJhbCAoZHVyaW5nIGluLWRlZ3JlZQogICAgICAgICAgICAgICAgLy8gZXh0cmFjdGlvbikgZHVlIHRvIGEgbGFjayBvZiBuZWlnaGJvcnMuIERvIG5vdCBleHRyYWN0IHRoaXMgbm9kZSB0d2ljZS4KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEV4dHJhY3QgYSBoaWdoIG91dC1kZWdyZWUgbm9kZSB0aGF0IGhhcyBub3QgYWxyZWFkeSBiZWVuIGV4dHJhY3RlZC4KICAgICAgICAgICAgbWFrZU91dEV4dHJhY3QocmVuZGVyTm9kZSwgc29ydGVkQnlPdXREZWdyZWVbaV0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBSZW1vdmUgY29udHJvbCBlZGdlcyBmcm9tIG5vZGVzIHRoYXQgaGF2ZSB0b28gbWFueSBjb250cm9sIGVkZ2VzICovCiAgICBmdW5jdGlvbiByZW1vdmVDb250cm9sRWRnZXMocmVuZGVyTm9kZSkgewogICAgICAgIGxldCBncmFwaCA9IHJlbmRlck5vZGUuY29yZUdyYXBoOwogICAgICAgIC8vIENvbGxlY3QgY29udHJvbCBlZGdlcyBpbnRvIGEgbWFwIGJ5IG5vZGUgbmFtZS4KICAgICAgICBsZXQgbWFwID0ge307CiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGguZWRnZXMoKSwgKGUpID0+IHsKICAgICAgICAgICAgaWYgKCFncmFwaC5lZGdlKGUpLm1ldGFlZGdlLm51bVJlZ3VsYXJFZGdlcykgewogICAgICAgICAgICAgICAgKG1hcFtlLnZdID0gbWFwW2Uudl0gfHwgW10pLnB1c2goZSk7CiAgICAgICAgICAgICAgICAobWFwW2Uud10gPSBtYXBbZS53XSB8fCBbXSkucHVzaChlKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIC8vIEZvciBlYWNoIG5vZGUgd2l0aCB0b28gbWFueSBjb250cm9sIGVkZ2VzLCB0dXJuIHRoZW0gaW50byBhbm5vdGF0aW9ucy4KICAgICAgICBsb2Rhc2guZWFjaChtYXAsIChlZGdlcywgbm9kZU5hbWUpID0+IHsKICAgICAgICAgICAgaWYgKGVkZ2VzLmxlbmd0aCA+IFBBUkFNUy5tYXhDb250cm9sRGVncmVlKSB7CiAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChlZGdlcywgKGUpID0+IGNyZWF0ZVNob3J0Y3V0KGdyYXBoLCBlLnYsIGUudykpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZSBlZGdlcyBhbmQgYWRkIHRvIGFubm90YXRpb24gaW5zdGVhZC4KICAgICAqCiAgICAgKiBGb3Igcm9vdCBub2RlLCBjb25zaWRlciBwcmVkZWZpbmVkIHR5cGVzIGZvciBzb3VyY2UgYW5kIHNpbmsuCiAgICAgKiBXZSBkbyBub3QgZXh0cmFjdCBwcmVkZWZpbmVkIHR5cGUgZnJvbSBub24tcm9vdCBzbyB0aGF0IFZhcmlhYmxlcyBhbmQgdGhlCiAgICAgKiBzZ2Qgbm9kZSAob3AgdHlwZSA9ICdOb09wJykgZG8gbm90IGdldCBleHRyYWN0IGZyb20gaW5zaWRlIG93biBncm91cC4KICAgICAqCiAgICAgKiBUaGUgb3JkZXIgb2YgZXh0cmFjdGlvbiBpcyBpbXBvcnRhbnQgaGVyZSBhcyBzd2FwcGluZyB0aGUgb3JkZXIgY2FuIHRvdGFsbHkKICAgICAqIHNjcmV3IHVwIHRoZSBncmFwaCBsYXlvdXQuCiAgICAgKgogICAgICogQHBhcmFtIHtSZW5kZXIuTm9kZX0gcmVuZGVyTm9kZSBOb2RlIHRvIG1hbmlwdWxhdGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4dHJhY3RIaWdoRGVncmVlcyhyZW5kZXJOb2RlKSB7CiAgICAgICAgZXh0cmFjdFNwZWNpZmllZE5vZGVzKHJlbmRlck5vZGUpOwogICAgICAgIGlmIChQQVJBTVMub3V0RXh0cmFjdFR5cGVzKSB7CiAgICAgICAgICAgIGV4dHJhY3RQcmVkZWZpbmVkU2luayhyZW5kZXJOb2RlKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBoYXMgdG8gY29tZSBiZWZvcmUgZXh0cmFjdCBoaWdoIGluLWRlZ3JlZSB0byBwcm90ZWN0IHRoZSBjb3JlIHBhcnQKICAgICAgICAvLyB0aGF0IHRha2VzIG1hbnkgdmFyaWFibGVzLgogICAgICAgIGlmIChQQVJBTVMuaW5FeHRyYWN0VHlwZXMpIHsKICAgICAgICAgICAgZXh0cmFjdFByZWRlZmluZWRTb3VyY2UocmVuZGVyTm9kZSk7CiAgICAgICAgfQogICAgICAgIGV4dHJhY3RIaWdoSW5Pck91dERlZ3JlZShyZW5kZXJOb2RlKTsKICAgICAgICB7CiAgICAgICAgICAgIHJlbW92ZUNvbnRyb2xFZGdlcyhyZW5kZXJOb2RlKTsKICAgICAgICB9CiAgICAgICAgLy8gRXh0cmFjdCBpc29sYXRlZCBub2Rlcywgd2hpY2ggY2FuIGJlCiAgICAgICAgLy8gKDEpIHNvdXJjZS1saWtlIGFuZCBzaW5rLWxpa2Ugbm9kZXMgdGhhdCBhcmUgbm90IG9yaWdpbmFsbHkgaXNvbGF0ZWQgYnV0CiAgICAgICAgLy8gICAgIGJlY29tZSBpc29sYXRlZCBhZnRlciBmdXJ0aGVyIHJlbW92YWwuCiAgICAgICAgLy8gKDIpIGlzb2xhdGVkIG5vZGVzIHdpdGggYW5ub3RhdGlvbnMgb24gb25lLXNpZGUuICBUaGVzZSBtaWdodCBiZSBlaXRoZXIKICAgICAgICAvLyAgICAgLSBub2RlcyB0aGF0IG9yaWdpbmFsbHkgaGF2ZSBoaWdoIG91dC1kZWdyZWUgYnV0IGJlY2F1c2Ugd2UgcmVtb3ZlCiAgICAgICAgLy8gICAgICAgaGlnaCBpbi1kZWdyZWUgbm9kZXMgZmlyc3QsIHRoZXkgbm8gbG9uZ2VyIGhhdmUgaGlnaCBpbi1kZWdyZWUgd2hlbgogICAgICAgIC8vICAgICAgIHdlIGNoZWNrLiAgKERldGVjdGluZyBhbGwgaGlnaC1kZWdyZWUgYmVmb3JlIHJlbW92aW5nIGFsc28gbGVhZHMgdG8KICAgICAgICAvLyAgICAgICBhbm90aGVyIHByb2JsZW0uKQogICAgICAgIC8vICAgICAtIG5vZGVzIHRoYXQgZG8gbm90IGhhdmUgaGlnaCBkZWdyZWUsIGJ1dCB0aGVpciBuZWlnaGJvcnMgYXJlIGFsbAogICAgICAgIC8vICAgICAgIGV4dHJhY3RlZCwgc28gaXQgbWlnaHQgbWFrZSBzZW5zZSB0byBleHRyYWN0IHRoZW0gdG9vLgogICAgICAgIGxldCBncmFwaCA9IHJlbmRlck5vZGUuY29yZUdyYXBoOwogICAgICAgIGxvZGFzaC5lYWNoKGdyYXBoLm5vZGVzKCksIChuKSA9PiB7CiAgICAgICAgICAgIGxldCBjaGlsZCA9IGdyYXBoLm5vZGUobik7CiAgICAgICAgICAgIGxldCBkZWdyZWUgPSBncmFwaC5uZWlnaGJvcnMobikubGVuZ3RoOwogICAgICAgICAgICBpZiAoY2hpbGQubm9kZS5pbmNsdWRlICE9PSBJbmNsdXNpb25UeXBlLlVOU1BFQ0lGSUVEKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlZ3JlZSA9PT0gMCkgewogICAgICAgICAgICAgICAgbGV0IGhhc091dEFubm90YXRpb25zID0gY2hpbGQub3V0QW5ub3RhdGlvbnMubGlzdC5sZW5ndGggPiAwOwogICAgICAgICAgICAgICAgbGV0IGhhc0luQW5ub3RhdGlvbnMgPSBjaGlsZC5pbkFubm90YXRpb25zLmxpc3QubGVuZ3RoID4gMDsKICAgICAgICAgICAgICAgIGlmIChjaGlsZC5pc0luRXh0cmFjdCkgewogICAgICAgICAgICAgICAgICAgIC8vIElzIHNvdXJjZS1saWtlLgogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2FzZSBvbmx5IGhhcHBlbnMgaWYgZGV0YWNoQWxsRWRnZXNGb3JIaWdoRGVncmVlIGlzIGZhbHNlLgogICAgICAgICAgICAgICAgICAgIC8vIChPdGhlcndpc2UgYWxsIHNvdXJjZS1saWtlIG5vZGVzIGFyZSBhbGwgaXNvbGF0ZWQgYWxyZWFkeS4pCiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5ub2RlLmluY2x1ZGUgPSBJbmNsdXNpb25UeXBlLkVYQ0xVREU7CiAgICAgICAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlTm9kZShuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGNoaWxkLmlzT3V0RXh0cmFjdCkgewogICAgICAgICAgICAgICAgICAgIC8vIElzIHNpbmstbGlrZS4KICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNhc2Ugb25seSBoYXBwZW5zIGlmIGRldGFjaEFsbEVkZ2VzRm9ySGlnaERlZ3JlZSBpcyBmYWxzZS4KICAgICAgICAgICAgICAgICAgICAvLyAvLyAoT3RoZXJ3aXNlIGFsbCBzaW5rLWxpa2Ugbm9kZXMgYXJlIGFsbCBpc29sYXRlZCBhbHJlYWR5LikKICAgICAgICAgICAgICAgICAgICByZW5kZXJOb2RlLmlzb2xhdGVkT3V0RXh0cmFjdC5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICBjaGlsZC5ub2RlLmluY2x1ZGUgPSBJbmNsdXNpb25UeXBlLkVYQ0xVREU7CiAgICAgICAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlTm9kZShuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChoYXNPdXRBbm5vdGF0aW9ucyAmJiAhaGFzSW5Bbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5pc0luRXh0cmFjdCA9IHRydWU7IC8vIGZvciBvbmVzIHdpdGggaGlnaCBvdXQtYW5ub3RhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5pc29sYXRlZEluRXh0cmFjdC5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQubm9kZS5pbmNsdWRlID0gSW5jbHVzaW9uVHlwZS5FWENMVURFOwogICAgICAgICAgICAgICAgICAgICAgICBncmFwaC5yZW1vdmVOb2RlKG4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNJbkFubm90YXRpb25zICYmICFoYXNPdXRBbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5pc091dEV4dHJhY3QgPSB0cnVlOyAvLyBmb3Igb25lcyB3aXRoIGhpZ2ggaW4tYW5ub3RhdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5pc29sYXRlZE91dEV4dHJhY3QucHVzaChjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkLm5vZGUuaW5jbHVkZSA9IEluY2x1c2lvblR5cGUuRVhDTFVERTsKICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGgucmVtb3ZlTm9kZShuKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogRXhwYW5kcyBub2RlcyBpbiB0aGUgZ3JhcGggdW50aWwgdGhlIGRlc2lyZWQgbm9kZSBpcyB2aXNpYmxlLgogICAgICoKICAgICAqIEBwYXJhbSBzY2VuZSBUaGUgc2NlbmUgcG9seW1lciBjb21wb25lbnQuCiAgICAgKiBAcGFyYW0gcmVuZGVySGllcmFyY2h5IFRoZSByZW5kZXIgaGllcmFyY2h5LgogICAgICogQHBhcmFtIHRlbnNvck5hbWUgVGhlIG5hbWUgb2YgYSB0ZW5zb3IuCiAgICAgKiBAcmV0dXJuIEEgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIG5vZGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB0ZW5zb3IuCiAgICAgKiAgICAgTm90ZSB0aGF0IHRoZSBvcmlnaW5hbCB0ZW5zb3IgbmFtZSBtaWdodCBkaWZmZXIgZnJvbSB0aGlzIHJldHVybmVkIG5vZGUKICAgICAqICAgICBuYW1lLiBTcGVjaWZpY2FsbHksIGZvciBpbnN0YW5jZSwgdGhlIHRlbnNvciBuYW1lIHVzdWFsbHkgZW5kcyB3aXRoIGFuCiAgICAgKiAgICAgb3V0cHV0IHNsb3QgaW5kZXggKHN1Y2ggYXMgOjApLCB3aGlsZSB0aGUgbm9kZSBuYW1lIGxhY2tzIHRoYXQgc3VmZml4LgogICAgICovCiAgICBmdW5jdGlvbiBleHBhbmRVbnRpbE5vZGVJc1Nob3duKHNjZW5lLCByZW5kZXJIaWVyYXJjaHksIHRlbnNvck5hbWUpIHsKICAgICAgICBjb25zdCBzcGxpdFRlbnNvck5hbWUgPSB0ZW5zb3JOYW1lLnNwbGl0KCcvJyk7CiAgICAgICAgLy8gR3JhcGggbmFtZXMgZG8gbm90IHRha2UgaW50byBhY2NvdW50IHRoZSBvdXRwdXQgc2xvdC4gU3RyaXAgaXQuCiAgICAgICAgY29uc3QgbGFzdE5vZGVOYW1lTWF0Y2ggPSBzcGxpdFRlbnNvck5hbWVbc3BsaXRUZW5zb3JOYW1lLmxlbmd0aCAtIDFdLm1hdGNoKC8oLiopOlx3Ky8pOwogICAgICAgIGlmIChsYXN0Tm9kZU5hbWVNYXRjaC5sZW5ndGggPT09IDIpIHsKICAgICAgICAgICAgc3BsaXRUZW5zb3JOYW1lW3NwbGl0VGVuc29yTmFtZS5sZW5ndGggLSAxXSA9IGxhc3ROb2RlTmFtZU1hdGNoWzFdOwogICAgICAgIH0KICAgICAgICBsZXQgbm9kZU5hbWUgPSBzcGxpdFRlbnNvck5hbWVbMF07CiAgICAgICAgbGV0IHJlbmRlck5vZGUgPSByZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShub2RlTmFtZSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBzcGxpdFRlbnNvck5hbWUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLy8gT3Agbm9kZXMgYXJlIG5vdCBleHBhbmRhYmxlLgogICAgICAgICAgICBpZiAocmVuZGVyTm9kZS5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLk9QKSB7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkobm9kZU5hbWUpOwogICAgICAgICAgICByZW5kZXJOb2RlLmV4cGFuZGVkID0gdHJ1ZTsKICAgICAgICAgICAgc2NlbmUuc2V0Tm9kZUV4cGFuZGVkKHJlbmRlck5vZGUpOwogICAgICAgICAgICBub2RlTmFtZSArPSAnLycgKyBzcGxpdFRlbnNvck5hbWVbaV07CiAgICAgICAgICAgIHJlbmRlck5vZGUgPSByZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShub2RlTmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW5kZXJOb2RlLm5vZGUubmFtZTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNvbnN0IFBBUkFNUyQxID0gewogICAgICAgIGFuaW1hdGlvbjogewogICAgICAgICAgICAvKiogRGVmYXVsdCBkdXJhdGlvbiBmb3IgZ3JhcGggYW5pbWF0aW9ucyBpbiBtcy4gKi8KICAgICAgICAgICAgZHVyYXRpb246IDI1MCwKICAgICAgICB9LAogICAgICAgIGdyYXBoOiB7CiAgICAgICAgICAgIC8qKiBHcmFwaCBwYXJhbWV0ZXIgZm9yIG1ldGFub2RlLiAqLwogICAgICAgICAgICBtZXRhOiB7CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIERhZ3JlJ3Mgbm9kZXNlcCBwYXJhbSAtIG51bWJlciBvZiBwaXhlbHMgdGhhdAogICAgICAgICAgICAgICAgICogc2VwYXJhdGUgbm9kZXMgaG9yaXpvbnRhbGx5IGluIHRoZSBsYXlvdXQuCiAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jcGV0dGl0dC9kYWdyZS93aWtpI2NvbmZpZ3VyaW5nLXRoZS1sYXlvdXQKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbm9kZVNlcDogNSwKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogRGFncmUncyByYW5rc2VwIHBhcmFtIC0gbnVtYmVyIG9mIHBpeGVscwogICAgICAgICAgICAgICAgICogYmV0d2VlbiBlYWNoIHJhbmsgaW4gdGhlIGxheW91dC4KICAgICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2NwZXR0aXR0L2RhZ3JlL3dpa2kjY29uZmlndXJpbmctdGhlLWxheW91dAogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByYW5rU2VwOiAyNSwKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogRGFncmUncyBlZGdlc2VwIHBhcmFtIC0gbnVtYmVyIG9mIHBpeGVscyB0aGF0IHNlcGFyYXRlCiAgICAgICAgICAgICAgICAgKiBlZGdlcyBob3Jpem9udGFsbHkgaW4gdGhlIGxheW91dC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZWRnZVNlcDogNSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIEdyYXBoIHBhcmFtZXRlciBmb3IgbWV0YW5vZGUuICovCiAgICAgICAgICAgIHNlcmllczogewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBEYWdyZSdzIG5vZGVzZXAgcGFyYW0gLSBudW1iZXIgb2YgcGl4ZWxzIHRoYXQKICAgICAgICAgICAgICAgICAqIHNlcGFyYXRlIG5vZGVzIGhvcml6b250YWxseSBpbiB0aGUgbGF5b3V0LgogICAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY3BldHRpdHQvZGFncmUvd2lraSNjb25maWd1cmluZy10aGUtbGF5b3V0CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG5vZGVTZXA6IDUsCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIERhZ3JlJ3MgcmFua3NlcCBwYXJhbSAtIG51bWJlciBvZiBwaXhlbHMKICAgICAgICAgICAgICAgICAqIGJldHdlZW4gZWFjaCByYW5rIGluIHRoZSBsYXlvdXQuCiAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICogU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9jcGV0dGl0dC9kYWdyZS93aWtpI2NvbmZpZ3VyaW5nLXRoZS1sYXlvdXQKICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmFua1NlcDogMjUsCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIERhZ3JlJ3MgZWRnZXNlcCBwYXJhbSAtIG51bWJlciBvZiBwaXhlbHMgdGhhdCBzZXBhcmF0ZQogICAgICAgICAgICAgICAgICogZWRnZXMgaG9yaXpvbnRhbGx5IGluIHRoZSBsYXlvdXQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGVkZ2VTZXA6IDUsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBQYWRkaW5nIGlzIHVzZWQgdG8gY29ycmVjdGx5IHBvc2l0aW9uIHRoZSBncmFwaCBTVkcgaW5zaWRlIG9mIGl0cyBwYXJlbnQKICAgICAgICAgICAgICogZWxlbWVudC4gVGhlIHBhZGRpbmcgYW1vdW50cyBhcmUgYXBwbGllZCB1c2luZyBhbiBTVkcgdHJhbnNmb3JtIG9mIFggYW5kCiAgICAgICAgICAgICAqIFkgY29vcmRpbmF0ZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwYWRkaW5nOiB7IHBhZGRpbmdUb3A6IDQwLCBwYWRkaW5nTGVmdDogMjAgfSwKICAgICAgICB9LAogICAgICAgIHN1YnNjZW5lOiB7CiAgICAgICAgICAgIG1ldGE6IHsKICAgICAgICAgICAgICAgIHBhZGRpbmdUb3A6IDEwLAogICAgICAgICAgICAgICAgcGFkZGluZ0JvdHRvbTogMTAsCiAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogMTAsCiAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IDEwLAogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBVc2VkIHRvIGxlYXZlIHJvb20gZm9yIHRoZSBsYWJlbCBvbiB0b3Agb2YgdGhlIGhpZ2hlc3Qgbm9kZSBpbgogICAgICAgICAgICAgICAgICogdGhlIGNvcmUgZ3JhcGguCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGxhYmVsSGVpZ2h0OiAyMCwKICAgICAgICAgICAgICAgIC8qKiBYLXNwYWNlIGJldHdlZW4gZWFjaCBleHRyYWN0ZWQgbm9kZSBhbmQgdGhlIGNvcmUgZ3JhcGguICovCiAgICAgICAgICAgICAgICBleHRyYWN0WE9mZnNldDogMTUsCiAgICAgICAgICAgICAgICAvKiogWS1zcGFjZSBiZXR3ZWVuIGVhY2ggZXh0cmFjdGVkIG5vZGUuICovCiAgICAgICAgICAgICAgICBleHRyYWN0WU9mZnNldDogMjAsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHNlcmllczogewogICAgICAgICAgICAgICAgcGFkZGluZ1RvcDogMTAsCiAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tOiAxMCwKICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAxMCwKICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogMTAsCiAgICAgICAgICAgICAgICBsYWJlbEhlaWdodDogMTAsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBub2RlU2l6ZTogewogICAgICAgICAgICAvKiogU2l6ZSBvZiBtZXRhIG5vZGVzLiAqLwogICAgICAgICAgICBtZXRhOiB7CiAgICAgICAgICAgICAgICByYWRpdXM6IDUsCiAgICAgICAgICAgICAgICB3aWR0aDogNjAsCiAgICAgICAgICAgICAgICBtYXhMYWJlbFdpZHRoOiA1MiwKICAgICAgICAgICAgICAgIC8qKiBBIHNjYWxlIGZvciB0aGUgbm9kZSdzIGhlaWdodCBiYXNlZCBvbiBudW1iZXIgb2Ygbm9kZXMgaW5zaWRlICovCiAgICAgICAgICAgICAgICAvLyBIYWNrIC0gc2V0IHRoaXMgYXMgYW4gYW55IHR5cGUgdG8gYXZvaWQgaXNzdWVzIGluIGV4cG9ydGluZyBhIHR5cGUKICAgICAgICAgICAgICAgIC8vIGZyb20gYW4gZXh0ZXJuYWwgbW9kdWxlLgogICAgICAgICAgICAgICAgaGVpZ2h0OiBsaW5lYXIkMigpCiAgICAgICAgICAgICAgICAgICAgLmRvbWFpbihbMSwgMjAwXSkKICAgICAgICAgICAgICAgICAgICAucmFuZ2UoWzE1LCA2MF0pCiAgICAgICAgICAgICAgICAgICAgLmNsYW1wKHRydWUpLAogICAgICAgICAgICAgICAgLyoqIFRoZSByYWRpdXMgb2YgdGhlIGNpcmNsZSBkZW5vdGluZyB0aGUgZXhwYW5kIGJ1dHRvbi4gKi8KICAgICAgICAgICAgICAgIGV4cGFuZEJ1dHRvblJhZGl1czogMywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIFNpemUgb2Ygb3Agbm9kZXMuICovCiAgICAgICAgICAgIG9wOiB7CiAgICAgICAgICAgICAgICB3aWR0aDogMTUsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDYsCiAgICAgICAgICAgICAgICByYWRpdXM6IDMsCiAgICAgICAgICAgICAgICBsYWJlbE9mZnNldDogLTgsCiAgICAgICAgICAgICAgICBtYXhMYWJlbFdpZHRoOiAzMCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLyoqIFNpemUgb2Ygc2VyaWVzIG5vZGVzLiAqLwogICAgICAgICAgICBzZXJpZXM6IHsKICAgICAgICAgICAgICAgIGV4cGFuZGVkOiB7CiAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4cGFuZGVkIHNlcmllcyBub2Rlcywgd2lkdGggYW5kIGhlaWdodCB3aWxsIGJlCiAgICAgICAgICAgICAgICAgICAgLy8gY29tcHV0ZWQgdG8gYWNjb3VudCBmb3IgdGhlIHN1YnNjZW5lLgogICAgICAgICAgICAgICAgICAgIHJhZGl1czogMTAsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxPZmZzZXQ6IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgdmVydGljYWw6IHsKICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHVuZXhwYW5kZWQsIHNlcmllcyB3aG9zZSB1bmRlcmx5aW5nIG1ldGFncmFwaHMgY29udGFpbgogICAgICAgICAgICAgICAgICAgIC8vIG9uZSBvciBtb3JlIG5vbi1jb250cm9sIGVkZ2VzIHdpbGwgc2hvdyBhcyBhIHZlcnRpY2FsIHN0YWNrCiAgICAgICAgICAgICAgICAgICAgLy8gb2YgZWxsaXBzZXMuCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDE2LAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogMTMsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxPZmZzZXQ6IC0xMywKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBob3Jpem9udGFsOiB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiB1bmV4cGFuZGVkLCBzZXJpZXMgd2hvc2UgdW5kZXJseWluZyBtZXRhZ3JhcGhzIGNvbnRhaW4KICAgICAgICAgICAgICAgICAgICAvLyBubyBub24tY29udHJvbCBlZGdlcyB3aWxsIHNob3cgYXMgYSBob3Jpem9udGFsIHN0YWNrIG9mCiAgICAgICAgICAgICAgICAgICAgLy8gZWxsaXBzZXMuCiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IDI0LAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogOCwKICAgICAgICAgICAgICAgICAgICByYWRpdXM6IDEwLAogICAgICAgICAgICAgICAgICAgIGxhYmVsT2Zmc2V0OiAtMTAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAvKiogU2l6ZSBvZiBicmlkZ2Ugbm9kZXMuICovCiAgICAgICAgICAgIGJyaWRnZTogewogICAgICAgICAgICAgICAgLy8gTk9URTogYnJpZGdlIG5vZGVzIHdpbGwgbm9ybWFsbHkgYmUgaW52aXNpYmxlLCBidXQgdGhleSBtdXN0CiAgICAgICAgICAgICAgICAvLyB0YWtlIHVwIHNvbWUgc3BhY2Ugc28gdGhhdCB0aGUgbGF5b3V0IHN0ZXAgbGVhdmVzIHJvb20gZm9yCiAgICAgICAgICAgICAgICAvLyB0aGVpciBlZGdlcy4KICAgICAgICAgICAgICAgIHdpZHRoOiAyMCwKICAgICAgICAgICAgICAgIGhlaWdodDogMjAsCiAgICAgICAgICAgICAgICByYWRpdXM6IDIsCiAgICAgICAgICAgICAgICBsYWJlbE9mZnNldDogMCwKICAgICAgICAgICAgfSwKICAgICAgICB9LAogICAgICAgIHNob3J0Y3V0U2l6ZTogewogICAgICAgICAgICAvKiogU2l6ZSBvZiBzaG9ydGN1dHMgZm9yIG9wIG5vZGVzICovCiAgICAgICAgICAgIG9wOiB7IHdpZHRoOiAxMCwgaGVpZ2h0OiA0IH0sCiAgICAgICAgICAgIC8qKiBTaXplIG9mIHNob3J0Y3V0cyBmb3IgbWV0YSBub2RlcyAqLwogICAgICAgICAgICBtZXRhOiB7IHdpZHRoOiAxMiwgaGVpZ2h0OiA0LCByYWRpdXM6IDEgfSwKICAgICAgICAgICAgLyoqIFNpemUgb2Ygc2hvcnRjdXRzIGZvciBzZXJpZXMgbm9kZXMgKi8KICAgICAgICAgICAgc2VyaWVzOiB7CiAgICAgICAgICAgICAgICB3aWR0aDogMTQsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IDQsCiAgICAgICAgICAgIH0sCiAgICAgICAgfSwKICAgICAgICBhbm5vdGF0aW9uczogewogICAgICAgICAgICAvKiogTWF4aW11bSBwb3NzaWJsZSB3aWR0aCBvZiB0aGUgYm91bmRpbmcgYm94IGZvciBpbiBhbm5vdGF0aW9ucyAqLwogICAgICAgICAgICBpbmJveFdpZHRoOiA1MCwKICAgICAgICAgICAgLyoqIE1heGltdW0gcG9zc2libGUgd2lkdGggb2YgdGhlIGJvdW5kaW5nIGJveCBmb3Igb3V0IGFubm90YXRpb25zICovCiAgICAgICAgICAgIG91dGJveFdpZHRoOiA1MCwKICAgICAgICAgICAgLyoqIFgtc3BhY2UgYmV0d2VlbiB0aGUgc2hhcGUgYW5kIGVhY2ggYW5ub3RhdGlvbi1ub2RlLiAqLwogICAgICAgICAgICB4T2Zmc2V0OiAxMCwKICAgICAgICAgICAgLyoqIFktc3BhY2UgYmV0d2VlbiBlYWNoIGFubm90YXRpb24tbm9kZS4gKi8KICAgICAgICAgICAgeU9mZnNldDogMywKICAgICAgICAgICAgLyoqIFgtc3BhY2UgYmV0d2VlbiBlYWNoIGFubm90YXRpb24tbm9kZSBhbmQgaXRzIGxhYmVsLiAqLwogICAgICAgICAgICBsYWJlbE9mZnNldDogMiwKICAgICAgICAgICAgLyoqIERlZmluZXMgdGhlIG1heCB3aWR0aCBmb3IgYW5ub3RhdGlvbiBsYWJlbCAqLwogICAgICAgICAgICBtYXhMYWJlbFdpZHRoOiAxMjAsCiAgICAgICAgfSwKICAgICAgICBjb25zdGFudDogeyBzaXplOiB7IHdpZHRoOiA0LCBoZWlnaHQ6IDQgfSB9LAogICAgICAgIHNlcmllczogewogICAgICAgICAgICAvKiogTWF4aW11bSBudW1iZXIgb2YgcmVwZWF0ZWQgaXRlbSBmb3IgdW5leHBhbmRlZCBzZXJpZXMgbm9kZS4gKi8KICAgICAgICAgICAgbWF4U3RhY2tDb3VudDogMywKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFBvc2l0aW9uaW5nIG9mZnNldCByYXRpbyBmb3IgY29sbGFwc2VkIHN0YWNrCiAgICAgICAgICAgICAqIG9mIHBhcmFsbGVsIHNlcmllcyAoc2VyaWVzIHdpdGhvdXQgZWRnZXMgYmV0d2VlbiBpdHMgbWVtYmVycykuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwYXJhbGxlbFN0YWNrT2Zmc2V0UmF0aW86IDAuMiwKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFBvc2l0aW9uaW5nIG9mZnNldCByYXRpbyBmb3IgY29sbGFwc2VkIHN0YWNrCiAgICAgICAgICAgICAqIG9mIHRvd2VyIHNlcmllcyAoc2VyaWVzIHdpdGggZWRnZXMgYmV0d2VlbiBpdHMgbWVtYmVycykuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0b3dlclN0YWNrT2Zmc2V0UmF0aW86IDAuNSwKICAgICAgICB9LAogICAgICAgIG1pbmltYXA6IHsKICAgICAgICAgICAgLyoqIFRoZSBtYXhpbXVtIHdpZHRoL2hlaWdodCB0aGUgbWluaW1hcCBjYW4gaGF2ZS4gKi8KICAgICAgICAgICAgc2l6ZTogMTUwLAogICAgICAgIH0sCiAgICB9OwogICAgLyoqCiAgICAgKiBUaGUgbWluaW11bSB3aWR0aCB3ZSBjb25mZXIgdXBvbiB0aGUgYXV4aWxpYXJ5IG5vZGVzIHNlY3Rpb24gaWYgZnVuY3Rpb25zCiAgICAgKiBhbHNvIGFwcGVhci4gV2l0aG91dCBlbmZvcmNpbmcgdGhpcyBtaW5pbXVtLCBtZXRhbm9kZXMgaW4gdGhlIGZ1bmN0aW9uCiAgICAgKiBsaWJyYXJ5IHNlY3Rpb24gY291bGQganV0IGludG8gdGhlIGF1eGlsaWFyeSBub2RlcyBzZWN0aW9uIGJlY2F1c2UgdGhlCiAgICAgKiB0aXRsZSAiQXV4aWxpYXJ5IE5vZGVzIiBpcyBsb25nZXIgdGhhbiB0aGUgd2lkdGggb2YgdGhlIGF1eGlsaWFyeSBub2RlcwogICAgICogc2VjdGlvbiBpdHNlbGYuCiAgICAgKi8KICAgIGNvbnN0IE1JTl9BVVhfV0lEVEggPSAxNDA7CiAgICAvKiogQ2FsY3VsYXRlIGxheW91dCBmb3IgYSBzY2VuZSBvZiBhIGdyb3VwIG5vZGUuICovCiAgICBmdW5jdGlvbiBsYXlvdXRTY2VuZShyZW5kZXJOb2RlSW5mbykgewogICAgICAgIC8vIFVwZGF0ZSBsYXlvdXQsIHNpemUsIGFuZCBhbm5vdGF0aW9ucyBvZiBpdHMgY2hpbGRyZW4gbm9kZXMgYW5kIGVkZ2VzLgogICAgICAgIGlmIChyZW5kZXJOb2RlSW5mby5ub2RlLmlzR3JvdXBOb2RlKSB7CiAgICAgICAgICAgIGxheW91dENoaWxkcmVuKHJlbmRlck5vZGVJbmZvKTsKICAgICAgICB9CiAgICAgICAgLy8gVXBkYXRlIHBvc2l0aW9uIG9mIGl0cyBjaGlsZHJlbiBub2RlcyBhbmQgZWRnZXMKICAgICAgICBpZiAocmVuZGVyTm9kZUluZm8ubm9kZS50eXBlID09PSBOb2RlVHlwZS5NRVRBKSB7CiAgICAgICAgICAgIGxheW91dE1ldGFub2RlKHJlbmRlck5vZGVJbmZvKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVuZGVyTm9kZUluZm8ubm9kZS50eXBlID09PSBOb2RlVHlwZS5TRVJJRVMpIHsKICAgICAgICAgICAgbGF5b3V0U2VyaWVzTm9kZShyZW5kZXJOb2RlSW5mbyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIHRoZSB0b3RhbCB3aWR0aCBvZiBhbiB1bmV4cGFuZGVkIG5vZGUgd2hpY2ggaW5jbHVkZXMgdGhlIHNpemUgb2YgaXRzCiAgICAgKiBpbiBhbmQgb3V0IGFubm90YXRpb25zLgogICAgICovCiAgICBmdW5jdGlvbiB1cGRhdGVUb3RhbFdpZHRoT2ZOb2RlKHJlbmRlckluZm8pIHsKICAgICAgICByZW5kZXJJbmZvLmluYm94V2lkdGggPQogICAgICAgICAgICByZW5kZXJJbmZvLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGggPiAwCiAgICAgICAgICAgICAgICA/IFBBUkFNUyQxLmFubm90YXRpb25zLmluYm94V2lkdGgKICAgICAgICAgICAgICAgIDogMDsKICAgICAgICByZW5kZXJJbmZvLm91dGJveFdpZHRoID0KICAgICAgICAgICAgcmVuZGVySW5mby5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCA+IDAKICAgICAgICAgICAgICAgID8gUEFSQU1TJDEuYW5ub3RhdGlvbnMub3V0Ym94V2lkdGgKICAgICAgICAgICAgICAgIDogMDsKICAgICAgICAvLyBBc3NpZ24gdGhlIHdpZHRoIG9mIHRoZSBjb3JlIGJveCAodGhlIG1haW4gc2hhcGUgb2YgdGhlIG5vZGUpLgogICAgICAgIHJlbmRlckluZm8uY29yZUJveC53aWR0aCA9IHJlbmRlckluZm8ud2lkdGg7CiAgICAgICAgcmVuZGVySW5mby5jb3JlQm94LmhlaWdodCA9IHJlbmRlckluZm8uaGVpZ2h0OwogICAgICAgIC8vIFRPRE86IEFjY291bnQgZm9yIGZvbnQgd2lkdGggcmF0aGVyIHRoYW4gdXNpbmcgYSBtYWdpYyBudW1iZXIuCiAgICAgICAgbGV0IGxhYmVsTGVuZ3RoID0gcmVuZGVySW5mby5kaXNwbGF5TmFtZS5sZW5ndGg7CiAgICAgICAgbGV0IGNoYXJXaWR0aCA9IDM7IC8vIDMgcGl4ZWxzIHBlciBjaGFyYWN0ZXIuCiAgICAgICAgLy8gQ29tcHV0ZSB0aGUgdG90YWwgd2lkdGggb2YgdGhlIG5vZGUuCiAgICAgICAgcmVuZGVySW5mby53aWR0aCA9IE1hdGgubWF4KHJlbmRlckluZm8uY29yZUJveC53aWR0aCArIHJlbmRlckluZm8uaW5ib3hXaWR0aCArIHJlbmRlckluZm8ub3V0Ym94V2lkdGgsIGxhYmVsTGVuZ3RoICogY2hhcldpZHRoKTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGxheW91dCwgc2l6ZSwgYW5kIGFubm90YXRpb25zIG9mIGl0cyBjaGlsZHJlbiBub2RlcyBhbmQgZWRnZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxheW91dENoaWxkcmVuKHJlbmRlck5vZGVJbmZvKSB7CiAgICAgICAgbGV0IGNoaWxkcmVuID0gcmVuZGVyTm9kZUluZm8uY29yZUdyYXBoCiAgICAgICAgICAgIC5ub2RlcygpCiAgICAgICAgICAgIC5tYXAoKG4pID0+IHsKICAgICAgICAgICAgcmV0dXJuIHJlbmRlck5vZGVJbmZvLmNvcmVHcmFwaC5ub2RlKG4pOwogICAgICAgIH0pCiAgICAgICAgICAgIC5jb25jYXQocmVuZGVyTm9kZUluZm8uaXNvbGF0ZWRJbkV4dHJhY3QsIHJlbmRlck5vZGVJbmZvLmlzb2xhdGVkT3V0RXh0cmFjdCwgcmVuZGVyTm9kZUluZm8ubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QpOwogICAgICAgIGxvZGFzaC5lYWNoKGNoaWxkcmVuLCAoY2hpbGROb2RlSW5mbykgPT4gewogICAgICAgICAgICAvLyBTZXQgc2l6ZSBvZiBlYWNoIGNoaWxkCiAgICAgICAgICAgIHN3aXRjaCAoY2hpbGROb2RlSW5mby5ub2RlLnR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuT1A6CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmV4dGVuZChjaGlsZE5vZGVJbmZvLCBQQVJBTVMkMS5ub2RlU2l6ZS5vcCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE5vZGVUeXBlLkJSSURHRToKICAgICAgICAgICAgICAgICAgICBsb2Rhc2guZXh0ZW5kKGNoaWxkTm9kZUluZm8sIFBBUkFNUyQxLm5vZGVTaXplLmJyaWRnZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGlsZE5vZGVJbmZvLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBmaXhlZCB3aWR0aCBhbmQgc2NhbGFibGUgaGVpZ2h0IGJhc2VkIG9uIGNhcmRpbmFsaXR5CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZGFzaC5leHRlbmQoY2hpbGROb2RlSW5mbywgUEFSQU1TJDEubm9kZVNpemUubWV0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTm9kZUluZm8uaGVpZ2h0ID0gUEFSQU1TJDEubm9kZVNpemUubWV0YS5oZWlnaHQoY2hpbGROb2RlSW5mby5ub2RlLmNhcmRpbmFsaXR5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjaGlsZEdyb3VwTm9kZUluZm8gPSBjaGlsZE5vZGVJbmZvOwogICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXRTY2VuZShjaGlsZEdyb3VwTm9kZUluZm8pOyAvLyBSZWN1cnNpdmVseSBsYXlvdXQgaXRzIHN1YnNjZW5lLgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuU0VSSUVTOgogICAgICAgICAgICAgICAgICAgIGlmIChjaGlsZE5vZGVJbmZvLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZGFzaC5leHRlbmQoY2hpbGROb2RlSW5mbywgUEFSQU1TJDEubm9kZVNpemUuc2VyaWVzLmV4cGFuZGVkKTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkR3JvdXBOb2RlSW5mbyA9IGNoaWxkTm9kZUluZm87CiAgICAgICAgICAgICAgICAgICAgICAgIGxheW91dFNjZW5lKGNoaWxkR3JvdXBOb2RlSW5mbyk7IC8vIFJlY3Vyc2l2ZWx5IGxheW91dCBpdHMgc3Vic2NlbmUuCiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2hpbGRHcm91cE5vZGVJbmZvID0gY2hpbGROb2RlSW5mbzsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlcmllc1BhcmFtcyA9IGNoaWxkR3JvdXBOb2RlSW5mby5ub2RlLmhhc05vbkNvbnRyb2xFZGdlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBQQVJBTVMkMS5ub2RlU2l6ZS5zZXJpZXMudmVydGljYWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogUEFSQU1TJDEubm9kZVNpemUuc2VyaWVzLmhvcml6b250YWw7CiAgICAgICAgICAgICAgICAgICAgICAgIGxvZGFzaC5leHRlbmQoY2hpbGROb2RlSW5mbywgc2VyaWVzUGFyYW1zKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAnICsgY2hpbGROb2RlSW5mby5ub2RlLnR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENvbXB1dGUgdG90YWwgd2lkdGggb2YgdW4tZXhwYW5kZWQgbm9kZXMuIFdpZHRoIG9mIGV4cGFuZGVkIG5vZGVzCiAgICAgICAgICAgIC8vIGhhcyBhbHJlYWR5IGJlZW4gY29tcHV0ZWQuCiAgICAgICAgICAgIGlmICghY2hpbGROb2RlSW5mby5leHBhbmRlZCkgewogICAgICAgICAgICAgICAgdXBkYXRlVG90YWxXaWR0aE9mTm9kZShjaGlsZE5vZGVJbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBMYXlvdXQgZWFjaCBjaGlsZCdzIGFubm90YXRpb25zCiAgICAgICAgICAgIGxheW91dEFubm90YXRpb24oY2hpbGROb2RlSW5mbyk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZSBsYXlvdXQgZm9yIGEgZ3JhcGggdXNpbmcgZGFncmUKICAgICAqIEBwYXJhbSBncmFwaCB0aGUgZ3JhcGggdG8gYmUgbGFpZCBvdXQKICAgICAqIEBwYXJhbSBwYXJhbXMgbGF5b3V0IHBhcmFtZXRlcnMKICAgICAqIEByZXR1cm4gd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY29yZSBncmFwaAogICAgICovCiAgICBmdW5jdGlvbiBkYWdyZUxheW91dChncmFwaCwgcGFyYW1zKSB7CiAgICAgICAgbG9kYXNoLmV4dGVuZChncmFwaC5ncmFwaCgpLCB7CiAgICAgICAgICAgIG5vZGVzZXA6IHBhcmFtcy5ub2RlU2VwLAogICAgICAgICAgICByYW5rc2VwOiBwYXJhbXMucmFua1NlcCwKICAgICAgICAgICAgZWRnZXNlcDogcGFyYW1zLmVkZ2VTZXAsCiAgICAgICAgfSk7CiAgICAgICAgbGV0IG5vbkJyaWRnZU5vZGVOYW1lcyA9IFtdOwogICAgICAgIC8vIFNwbGl0IG91dCBub2RlcyBpbnRvIGJyaWRnZSBhbmQgbm9uLWJyaWRnZSBub2RlcywgYW5kIGNhbGN1bGF0ZSB0aGUgdG90YWwKICAgICAgICAvLyB3aWR0aCB3ZSBzaG91bGQgdXNlIGZvciBicmlkZ2Ugbm9kZXMuCiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGgubm9kZXMoKSwgKG5vZGVOYW1lKSA9PiB7CiAgICAgICAgICAgIGxldCBub2RlSW5mbyA9IGdyYXBoLm5vZGUobm9kZU5hbWUpOwogICAgICAgICAgICBpZiAobm9kZUluZm8ubm9kZS50eXBlID09PSBOb2RlVHlwZS5CUklER0UpIDsKICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBub25CcmlkZ2VOb2RlTmFtZXMucHVzaChub2RlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBJZiB0aGVyZSBhcmUgbm8gbm9uLWJyaWRnZSBub2RlcywgdGhlbiB0aGUgZ3JhcGggaGFzIHplcm8gc2l6ZS4KICAgICAgICBpZiAoIW5vbkJyaWRnZU5vZGVOYW1lcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHdpZHRoOiAwLAogICAgICAgICAgICAgICAgaGVpZ2h0OiAwLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBkYWdyZS5sYXlvdXQoZ3JhcGgpOwogICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgdHJ1ZSBib3VuZGluZyBib3ggb2YgdGhlIGdyYXBoIGJ5IGl0ZXJhdGluZyBvdmVyIG5vZGVzIGFuZAogICAgICAgIC8vIGVkZ2VzIHJhdGhlciB0aGFuIGFjY2VwdGluZyBkYWdyZSdzIHdvcmQgZm9yIGl0LiBJbiBwYXJ0aWN1bGFyLCB3ZSBzaG91bGQKICAgICAgICAvLyBpZ25vcmUgdGhlIGV4dHJhLXdpZGUgYnJpZGdlIG5vZGVzIGFuZCBicmlkZ2UgZWRnZXMsIGFuZCBhbGxvdyBmb3IKICAgICAgICAvLyBhbm5vdGF0aW9uIGJveGVzIGFuZCBsYWJlbHMuCiAgICAgICAgbGV0IG1pblggPSBJbmZpbml0eTsKICAgICAgICBsZXQgbWluWSA9IEluZmluaXR5OwogICAgICAgIGxldCBtYXhYID0gLUluZmluaXR5OwogICAgICAgIGxldCBtYXhZID0gLUluZmluaXR5OwogICAgICAgIGxvZGFzaC5lYWNoKG5vbkJyaWRnZU5vZGVOYW1lcywgKG5vZGVOYW1lKSA9PiB7CiAgICAgICAgICAgIGxldCBub2RlSW5mbyA9IGdyYXBoLm5vZGUobm9kZU5hbWUpOwogICAgICAgICAgICBsZXQgdyA9IDAuNSAqIG5vZGVJbmZvLndpZHRoOwogICAgICAgICAgICBsZXQgeDEgPSBub2RlSW5mby54IC0gdzsKICAgICAgICAgICAgbGV0IHgyID0gbm9kZUluZm8ueCArIHc7CiAgICAgICAgICAgIG1pblggPSB4MSA8IG1pblggPyB4MSA6IG1pblg7CiAgICAgICAgICAgIG1heFggPSB4MiA+IG1heFggPyB4MiA6IG1heFg7CiAgICAgICAgICAgIC8vIFRPRE86IEFjY291bnQgZm9yIHRoZSBoZWlnaHQgb2YgbGFiZWxzIGFib3ZlIG9wIG5vZGVzIGhlcmUuCiAgICAgICAgICAgIGxldCBoID0gMC41ICogbm9kZUluZm8uaGVpZ2h0OwogICAgICAgICAgICBsZXQgeTEgPSBub2RlSW5mby55IC0gaDsKICAgICAgICAgICAgbGV0IHkyID0gbm9kZUluZm8ueSArIGg7CiAgICAgICAgICAgIG1pblkgPSB5MSA8IG1pblkgPyB5MSA6IG1pblk7CiAgICAgICAgICAgIG1heFkgPSB5MiA+IG1heFkgPyB5MiA6IG1heFk7CiAgICAgICAgfSk7CiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGguZWRnZXMoKSwgKGVkZ2VPYmopID0+IHsKICAgICAgICAgICAgbGV0IGVkZ2VJbmZvID0gZ3JhcGguZWRnZShlZGdlT2JqKTsKICAgICAgICAgICAgaWYgKGVkZ2VJbmZvLnN0cnVjdHVyYWwpIHsKICAgICAgICAgICAgICAgIHJldHVybjsgLy8gU2tpcCBzdHJ1Y3R1cmFsIGVkZ2VzIGZyb20gbWluL21heCBjYWxjdWxhdGlvbnMuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2luY2UgdGhlIG5vZGUgc2l6ZSBwYXNzZWQgdG8gZGFncmUgaW5jbHVkZXMgdGhlIGluIGFuZCBvdXQKICAgICAgICAgICAgLy8gYW5ub3RhdGlvbnMsIHRoZSBlbmRwb2ludHMgb2YgdGhlIGVkZ2UgcHJvZHVjZWQgYnkgZGFncmUgbWF5IG5vdAogICAgICAgICAgICAvLyBwb2ludCB0byB0aGUgYWN0dWFsIG5vZGUgc2hhcGUgKHJlY3RhbmdsZSwgZWxsaXBzZSkuIFdlIGNvcnJlY3QgdGhlCiAgICAgICAgICAgIC8vIGVuZC1wb2ludHMgYnkgZmluZGluZyB0aGUgaW50ZXJzZWN0aW9uIG9mIGEgbGluZSBiZXR3ZWVuIHRoZQogICAgICAgICAgICAvLyBuZXh0LXRvLWxhc3QgKG5leHQtdG8tZmlyc3QpIHBvaW50IGFuZCB0aGUgZGVzdGluYXRpb24gKHNvdXJjZSkKICAgICAgICAgICAgLy8gcmVjdGFuZ2xlLgogICAgICAgICAgICBsZXQgc291cmNlTm9kZSA9IGdyYXBoLm5vZGUoZWRnZUluZm8ubWV0YWVkZ2Uudik7CiAgICAgICAgICAgIGxldCBkZXN0Tm9kZSA9IGdyYXBoLm5vZGUoZWRnZUluZm8ubWV0YWVkZ2Uudyk7CiAgICAgICAgICAgIC8vIFN0cmFpZ2h0IDMtcG9pbnRzIGVkZ2VzIGFyZSBzcGVjaWFsIGNhc2UsIHNpbmNlIHRoZXkgYXJlIGN1cnZlZCBhZnRlcgogICAgICAgICAgICAvLyBvdXIgZGVmYXVsdCBjb3JyZWN0aW9uLiBUbyBrZWVwIHRoZW0gc3RyYWlnaHQsIHdlIHJlbW92ZSB0aGUgbWlkIHBvaW50CiAgICAgICAgICAgIC8vIGFuZCBjb3JyZWN0IHRoZSBmaXJzdCBhbmQgdGhlIGxhc3QgcG9pbnQgdG8gYmUgdGhlIGNlbnRlciBvZiB0aGUKICAgICAgICAgICAgLy8gc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub2RlIHJlc3BlY3RpdmVseS4KICAgICAgICAgICAgaWYgKGVkZ2VJbmZvLnBvaW50cy5sZW5ndGggPT09IDMgJiYgaXNTdHJhaWdodExpbmUoZWRnZUluZm8ucG9pbnRzKSkgewogICAgICAgICAgICAgICAgaWYgKHNvdXJjZU5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGxldCBjeFNvdXJjZSA9IHNvdXJjZU5vZGUuZXhwYW5kZWQKICAgICAgICAgICAgICAgICAgICAgICAgPyBzb3VyY2VOb2RlLngKICAgICAgICAgICAgICAgICAgICAgICAgOiBjb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHNvdXJjZU5vZGUpOwogICAgICAgICAgICAgICAgICAgIGVkZ2VJbmZvLnBvaW50c1swXS54ID0gY3hTb3VyY2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZGVzdE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGxldCBjeERlc3QgPSBkZXN0Tm9kZS5leHBhbmRlZAogICAgICAgICAgICAgICAgICAgICAgICA/IGRlc3ROb2RlLngKICAgICAgICAgICAgICAgICAgICAgICAgOiBjb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKGRlc3ROb2RlKTsKICAgICAgICAgICAgICAgICAgICBlZGdlSW5mby5wb2ludHNbMl0ueCA9IGN4RGVzdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgbWlkZGxlIHBvaW50IHNvIHRoZSBlZGdlIGRvZXNuJ3QgY3VydmUuCiAgICAgICAgICAgICAgICBlZGdlSW5mby5wb2ludHMgPSBbZWRnZUluZm8ucG9pbnRzWzBdLCBlZGdlSW5mby5wb2ludHNbMV1dOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENvcnJlY3QgdGhlIGRlc3RpbmF0aW9uIGVuZHBvaW50IG9mIHRoZSBlZGdlLgogICAgICAgICAgICBsZXQgbmV4dFRvTGFzdFBvaW50ID0gZWRnZUluZm8ucG9pbnRzW2VkZ2VJbmZvLnBvaW50cy5sZW5ndGggLSAyXTsKICAgICAgICAgICAgLy8gVGhlIGRlc3RpbmF0aW9uIG5vZGUgbWlnaHQgYmUgbnVsbCBpZiB0aGlzIGlzIGEgYnJpZGdlIGVkZ2UuCiAgICAgICAgICAgIGlmIChkZXN0Tm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBlZGdlSW5mby5wb2ludHNbZWRnZUluZm8ucG9pbnRzLmxlbmd0aCAtIDFdID0gaW50ZXJzZWN0UG9pbnRBbmROb2RlKG5leHRUb0xhc3RQb2ludCwgZGVzdE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENvcnJlY3QgdGhlIHNvdXJjZSBlbmRwb2ludCBvZiB0aGUgZWRnZS4KICAgICAgICAgICAgbGV0IHNlY29uZFBvaW50ID0gZWRnZUluZm8ucG9pbnRzWzFdOwogICAgICAgICAgICAvLyBUaGUgc291cmNlIG1pZ2h0IGJlIG51bGwgaWYgdGhpcyBpcyBhIGJyaWRnZSBlZGdlLgogICAgICAgICAgICBpZiAoc291cmNlTm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBlZGdlSW5mby5wb2ludHNbMF0gPSBpbnRlcnNlY3RQb2ludEFuZE5vZGUoc2Vjb25kUG9pbnQsIHNvdXJjZU5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKGVkZ2VJbmZvLnBvaW50cywgKHBvaW50KSA9PiB7CiAgICAgICAgICAgICAgICBtaW5YID0gcG9pbnQueCA8IG1pblggPyBwb2ludC54IDogbWluWDsKICAgICAgICAgICAgICAgIG1heFggPSBwb2ludC54ID4gbWF4WCA/IHBvaW50LnggOiBtYXhYOwogICAgICAgICAgICAgICAgbWluWSA9IHBvaW50LnkgPCBtaW5ZID8gcG9pbnQueSA6IG1pblk7CiAgICAgICAgICAgICAgICBtYXhZID0gcG9pbnQueSA+IG1heFkgPyBwb2ludC55IDogbWF4WTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgLy8gU2hpZnQgYWxsIG5vZGVzIGFuZCBlZGdlIHBvaW50cyB0byBhY2NvdW50IGZvciB0aGUgbGVmdC1wYWRkaW5nIGFtb3VudCwKICAgICAgICAvLyBhbmQgdGhlIGludmlzaWJsZSBicmlkZ2Ugbm9kZXMuCiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGgubm9kZXMoKSwgKG5vZGVOYW1lKSA9PiB7CiAgICAgICAgICAgIGxldCBub2RlSW5mbyA9IGdyYXBoLm5vZGUobm9kZU5hbWUpOwogICAgICAgICAgICBub2RlSW5mby54IC09IG1pblg7CiAgICAgICAgICAgIG5vZGVJbmZvLnkgLT0gbWluWTsKICAgICAgICB9KTsKICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5lZGdlcygpLCAoZWRnZU9iaikgPT4gewogICAgICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5lZGdlKGVkZ2VPYmopLnBvaW50cywgKHBvaW50KSA9PiB7CiAgICAgICAgICAgICAgICBwb2ludC54IC09IG1pblg7CiAgICAgICAgICAgICAgICBwb2ludC55IC09IG1pblk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHdpZHRoOiBtYXhYIC0gbWluWCwKICAgICAgICAgICAgaGVpZ2h0OiBtYXhZIC0gbWluWSwKICAgICAgICB9OwogICAgfQogICAgLyoqIExheW91dCBhIG1ldGFub2RlLiBPbmx5IGNhbGxlZCBmb3IgYW4gZXhwYW5kZWQgbm9kZS4gKi8KICAgIGZ1bmN0aW9uIGxheW91dE1ldGFub2RlKHJlbmRlck5vZGVJbmZvKSB7CiAgICAgICAgLy8gRmlyc3QsIGNvcHkgcGFyYW1zIHNwZWNpZmljIHRvIG1ldGEgbm9kZXMgb250byB0aGlzIHJlbmRlciBpbmZvIG9iamVjdC4KICAgICAgICBsZXQgcGFyYW1zID0gUEFSQU1TJDEuc3Vic2NlbmUubWV0YTsKICAgICAgICBsb2Rhc2guZXh0ZW5kKHJlbmRlck5vZGVJbmZvLCBwYXJhbXMpOwogICAgICAgIC8vIEludm9rZSBkYWdyZS5sYXlvdXQoKSBvbiB0aGUgY29yZSBncmFwaCBhbmQgcmVjb3JkIHRoZSBib3VuZGluZyBib3gKICAgICAgICAvLyBkaW1lbnNpb25zLgogICAgICAgIGxvZGFzaC5leHRlbmQocmVuZGVyTm9kZUluZm8uY29yZUJveCwgZGFncmVMYXlvdXQocmVuZGVyTm9kZUluZm8uY29yZUdyYXBoLCBQQVJBTVMkMS5ncmFwaC5tZXRhKSk7CiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBwb3NpdGlvbiBvZiBub2RlcyBpbiBpc29sYXRlZEluRXh0cmFjdCByZWxhdGl2ZSB0byB0aGUKICAgICAgICAvLyB0b3AtbGVmdCBjb3JuZXIgb2YgaW5FeHRyYWN0Qm94ICh0aGUgYm91bmRpbmcgYm94IGZvciBhbGwgaW5FeHRyYWN0IG5vZGVzKQogICAgICAgIC8vIGFuZCBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGluRXh0cmFjdEJveC4KICAgICAgICBsZXQgbWF4SW5FeHRyYWN0V2lkdGggPSByZW5kZXJOb2RlSW5mby5pc29sYXRlZEluRXh0cmFjdC5sZW5ndGgKICAgICAgICAgICAgPyBsb2Rhc2gubWF4QnkocmVuZGVyTm9kZUluZm8uaXNvbGF0ZWRJbkV4dHJhY3QsIChyZW5kZXJOb2RlKSA9PiByZW5kZXJOb2RlLndpZHRoKS53aWR0aAogICAgICAgICAgICA6IG51bGw7CiAgICAgICAgcmVuZGVyTm9kZUluZm8uaW5FeHRyYWN0Qm94LndpZHRoID0KICAgICAgICAgICAgbWF4SW5FeHRyYWN0V2lkdGggIT0gbnVsbCA/IG1heEluRXh0cmFjdFdpZHRoIDogMDsKICAgICAgICByZW5kZXJOb2RlSW5mby5pbkV4dHJhY3RCb3guaGVpZ2h0ID0gbG9kYXNoLnJlZHVjZShyZW5kZXJOb2RlSW5mby5pc29sYXRlZEluRXh0cmFjdCwgKGhlaWdodCwgY2hpbGQsIGkpID0+IHsKICAgICAgICAgICAgbGV0IHlPZmZzZXQgPSBpID4gMCA/IHBhcmFtcy5leHRyYWN0WU9mZnNldCA6IDA7CiAgICAgICAgICAgIC8vIHVzZSB3aWR0aC9oZWlnaHQgaGVyZSB0byBhdm9pZCBvdmVybGFwcyBiZXR3ZWVuIGV4dHJhY3RzCiAgICAgICAgICAgIGNoaWxkLnggPSAwOwogICAgICAgICAgICBjaGlsZC55ID0gaGVpZ2h0ICsgeU9mZnNldCArIGNoaWxkLmhlaWdodCAvIDI7CiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgKyB5T2Zmc2V0ICsgY2hpbGQuaGVpZ2h0OwogICAgICAgIH0sIDApOwogICAgICAgIC8vIENhbGN1bGF0ZSB0aGUgcG9zaXRpb24gb2Ygbm9kZXMgaW4gaXNvbGF0ZWRPdXRFeHRyYWN0IHJlbGF0aXZlIHRvIHRoZQogICAgICAgIC8vIHRvcC1sZWZ0IGNvcm5lciBvZiBvdXRFeHRyYWN0Qm94ICh0aGUgYm91bmRpbmcgYm94IGZvciBhbGwgb3V0RXh0cmFjdAogICAgICAgIC8vIG5vZGVzKSBhbmQgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBvdXRFeHRyYWN0Qm94LgogICAgICAgIGxldCBtYXhPdXRFeHRyYWN0V2lkdGggPSByZW5kZXJOb2RlSW5mby5pc29sYXRlZE91dEV4dHJhY3QubGVuZ3RoCiAgICAgICAgICAgID8gbG9kYXNoLm1heEJ5KHJlbmRlck5vZGVJbmZvLmlzb2xhdGVkT3V0RXh0cmFjdCwgKHJlbmRlck5vZGUpID0+IHJlbmRlck5vZGUud2lkdGgpLndpZHRoCiAgICAgICAgICAgIDogbnVsbDsKICAgICAgICByZW5kZXJOb2RlSW5mby5vdXRFeHRyYWN0Qm94LndpZHRoID0KICAgICAgICAgICAgbWF4T3V0RXh0cmFjdFdpZHRoICE9IG51bGwgPyBtYXhPdXRFeHRyYWN0V2lkdGggOiAwOwogICAgICAgIHJlbmRlck5vZGVJbmZvLm91dEV4dHJhY3RCb3guaGVpZ2h0ID0gbG9kYXNoLnJlZHVjZShyZW5kZXJOb2RlSW5mby5pc29sYXRlZE91dEV4dHJhY3QsIChoZWlnaHQsIGNoaWxkLCBpKSA9PiB7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gaSA+IDAgPyBwYXJhbXMuZXh0cmFjdFlPZmZzZXQgOiAwOwogICAgICAgICAgICAvLyB1c2Ugd2lkdGgvaGVpZ2h0IGhlcmUgdG8gYXZvaWQgb3ZlcmxhcHMgYmV0d2VlbiBleHRyYWN0cwogICAgICAgICAgICBjaGlsZC54ID0gMDsKICAgICAgICAgICAgY2hpbGQueSA9IGhlaWdodCArIHlPZmZzZXQgKyBjaGlsZC5oZWlnaHQgLyAyOwogICAgICAgICAgICByZXR1cm4gaGVpZ2h0ICsgeU9mZnNldCArIGNoaWxkLmhlaWdodDsKICAgICAgICB9LCAwKTsKICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9mIG5vZGVzIGluIGxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0IHJlbGF0aXZlIHRvIHRoZQogICAgICAgIC8vIHRvcC1sZWZ0IGNvcm5lciBvZiBsaWJyYXJ5RnVuY3Rpb25zQm94ICh0aGUgYm91bmRpbmcgYm94IGZvciBhbGwgbGlicmFyeQogICAgICAgIC8vIGZ1bmN0aW9uIG5vZGVzKSBhbmQgY2FsY3VsYXRlIHRoZSBzaXplIG9mIHRoZSBsaWJyYXJ5RnVuY3Rpb25zQm94LgogICAgICAgIGxldCBtYXhMaWJyYXJ5RnVuY3Rpb25zV2lkdGggPSByZW5kZXJOb2RlSW5mby5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGgKICAgICAgICAgICAgPyBsb2Rhc2gubWF4QnkocmVuZGVyTm9kZUluZm8ubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsIChyZW5kZXJOb2RlKSA9PiByZW5kZXJOb2RlLndpZHRoKS53aWR0aAogICAgICAgICAgICA6IG51bGw7CiAgICAgICAgcmVuZGVyTm9kZUluZm8ubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCA9CiAgICAgICAgICAgIG1heExpYnJhcnlGdW5jdGlvbnNXaWR0aCAhPSBudWxsID8gbWF4TGlicmFyeUZ1bmN0aW9uc1dpZHRoIDogMDsKICAgICAgICByZW5kZXJOb2RlSW5mby5saWJyYXJ5RnVuY3Rpb25zQm94LmhlaWdodCA9IGxvZGFzaC5yZWR1Y2UocmVuZGVyTm9kZUluZm8ubGlicmFyeUZ1bmN0aW9uc0V4dHJhY3QsIChoZWlnaHQsIGNoaWxkLCBpKSA9PiB7CiAgICAgICAgICAgIGxldCB5T2Zmc2V0ID0gaSA+IDAgPyBwYXJhbXMuZXh0cmFjdFlPZmZzZXQgOiAwOwogICAgICAgICAgICAvLyB1c2Ugd2lkdGgvaGVpZ2h0IGhlcmUgdG8gYXZvaWQgb3ZlcmxhcHMgYmV0d2VlbiBleHRyYWN0cwogICAgICAgICAgICBjaGlsZC54ID0gMDsKICAgICAgICAgICAgY2hpbGQueSA9IGhlaWdodCArIHlPZmZzZXQgKyBjaGlsZC5oZWlnaHQgLyAyOwogICAgICAgICAgICByZXR1cm4gaGVpZ2h0ICsgeU9mZnNldCArIGNoaWxkLmhlaWdodDsKICAgICAgICB9LCAwKTsKICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBwYWRkaW5nIGJldHdlZW4gdGhlIGNvcmUgZ3JhcGgsIGluLWV4dHJhY3QgYW5kCiAgICAgICAgLy8gb3V0LWV4dHJhY3QgYm94ZXMuCiAgICAgICAgbGV0IG51bVBhcnRzID0gMDsKICAgICAgICBpZiAocmVuZGVyTm9kZUluZm8uaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoID4gMCkgewogICAgICAgICAgICBudW1QYXJ0cysrOwogICAgICAgIH0KICAgICAgICBpZiAocmVuZGVyTm9kZUluZm8uaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbnVtUGFydHMrKzsKICAgICAgICB9CiAgICAgICAgaWYgKHJlbmRlck5vZGVJbmZvLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbnVtUGFydHMrKzsKICAgICAgICB9CiAgICAgICAgaWYgKHJlbmRlck5vZGVJbmZvLmNvcmVHcmFwaC5ub2RlQ291bnQoKSA+IDApIHsKICAgICAgICAgICAgbnVtUGFydHMrKzsKICAgICAgICB9CiAgICAgICAgbGV0IG9mZnNldCA9IFBBUkFNUyQxLnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQ7CiAgICAgICAgbGV0IHBhZGRpbmcgPSBudW1QYXJ0cyA8PSAxID8gMCA6IG51bVBhcnRzICogb2Zmc2V0OwogICAgICAgIC8vIEFkZCB0aGUgaW4tZXh0cmFjdCBhbmQgb3V0LWV4dHJhY3Qgd2lkdGggdG8gdGhlIGNvcmUgYm94IHdpZHRoLiBEbyBub3QgbGV0CiAgICAgICAgLy8gdGhlIGF1eGlsaWFyeSB3aWR0aCBiZSB0b28gc21hbGwsIGxlc3QgaXQgYmUgc21hbGxlciB0aGFuIHRoZSB0aXRsZS4KICAgICAgICBjb25zdCBhdXhXaWR0aCA9IE1hdGgubWF4KE1JTl9BVVhfV0lEVEgsIHJlbmRlck5vZGVJbmZvLmluRXh0cmFjdEJveC53aWR0aCArIHJlbmRlck5vZGVJbmZvLm91dEV4dHJhY3RCb3gud2lkdGgpOwogICAgICAgIHJlbmRlck5vZGVJbmZvLmNvcmVCb3gud2lkdGggKz0KICAgICAgICAgICAgYXV4V2lkdGggKyBwYWRkaW5nICsgcmVuZGVyTm9kZUluZm8ubGlicmFyeUZ1bmN0aW9uc0JveC53aWR0aCArIHBhZGRpbmc7CiAgICAgICAgcmVuZGVyTm9kZUluZm8uY29yZUJveC5oZWlnaHQgPQogICAgICAgICAgICBwYXJhbXMubGFiZWxIZWlnaHQgKwogICAgICAgICAgICAgICAgTWF0aC5tYXgocmVuZGVyTm9kZUluZm8uaW5FeHRyYWN0Qm94LmhlaWdodCwgcmVuZGVyTm9kZUluZm8uY29yZUJveC5oZWlnaHQsIHJlbmRlck5vZGVJbmZvLmxpYnJhcnlGdW5jdGlvbnNCb3guaGVpZ2h0LCByZW5kZXJOb2RlSW5mby5vdXRFeHRyYWN0Qm94LmhlaWdodCk7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB3aG9sZSBtZXRhbm9kZSdzIHdpZHRoIChmcm9tIGxlZnQgdG8gcmlnaHQpLgogICAgICAgIHJlbmRlck5vZGVJbmZvLndpZHRoID0KICAgICAgICAgICAgcmVuZGVyTm9kZUluZm8uY29yZUJveC53aWR0aCArIHBhcmFtcy5wYWRkaW5nTGVmdCArIHBhcmFtcy5wYWRkaW5nUmlnaHQ7CiAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB3aG9sZSBtZXRhbm9kZSdzIGhlaWdodCAoZnJvbSB0b3AgdG8gYm90dG9tKS4KICAgICAgICByZW5kZXJOb2RlSW5mby5oZWlnaHQgPQogICAgICAgICAgICByZW5kZXJOb2RlSW5mby5wYWRkaW5nVG9wICsKICAgICAgICAgICAgICAgIHJlbmRlck5vZGVJbmZvLmNvcmVCb3guaGVpZ2h0ICsKICAgICAgICAgICAgICAgIHJlbmRlck5vZGVJbmZvLnBhZGRpbmdCb3R0b207CiAgICB9CiAgICAvKioKICAgICAqIENhbGN1bGF0ZSBsYXlvdXQgZm9yIHNlcmllcyBub2RlJ3MgY29yZSBncmFwaC4gT25seSBjYWxsZWQgZm9yIGFuIGV4cGFuZGVkCiAgICAgKiBzZXJpZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxheW91dFNlcmllc05vZGUobm9kZSkgewogICAgICAgIGxldCBncmFwaCA9IG5vZGUuY29yZUdyYXBoOwogICAgICAgIGxldCBwYXJhbXMgPSBQQVJBTVMkMS5zdWJzY2VuZS5zZXJpZXM7CiAgICAgICAgbG9kYXNoLmV4dGVuZChub2RlLCBwYXJhbXMpOwogICAgICAgIC8vIExheW91dCB0aGUgY29yZS4KICAgICAgICBsb2Rhc2guZXh0ZW5kKG5vZGUuY29yZUJveCwgZGFncmVMYXlvdXQobm9kZS5jb3JlR3JhcGgsIFBBUkFNUyQxLmdyYXBoLnNlcmllcykpOwogICAgICAgIGxvZGFzaC5lYWNoKGdyYXBoLm5vZGVzKCksIChub2RlTmFtZSkgPT4gewogICAgICAgICAgICBncmFwaC5ub2RlKG5vZGVOYW1lKS5leGNsdWRlZCA9IGZhbHNlOwogICAgICAgIH0pOwogICAgICAgIC8vIFNlcmllcyBkbyBub3QgaGF2ZSBpbi9vdXRFeHRyYWN0Qm94IHNvIG5vIG5lZWQgdG8gaW5jbHVkZSB0aGVtIGhlcmUuCiAgICAgICAgbm9kZS53aWR0aCA9IG5vZGUuY29yZUJveC53aWR0aCArIHBhcmFtcy5wYWRkaW5nTGVmdCArIHBhcmFtcy5wYWRkaW5nUmlnaHQ7CiAgICAgICAgbm9kZS5oZWlnaHQgPSBub2RlLmNvcmVCb3guaGVpZ2h0ICsgcGFyYW1zLnBhZGRpbmdUb3AgKyBwYXJhbXMucGFkZGluZ0JvdHRvbTsKICAgIH0KICAgIC8qKgogICAgICogQ2FsY3VsYXRlIGxheW91dCBmb3IgYW5ub3RhdGlvbnMgb2YgYSBnaXZlbiBub2RlLgogICAgICogVGhpcyB3aWxsIG1vZGlmeSBwb3NpdGlvbnMgb2YgdGhlIGdpdmVuIG5vZGUgYW5kIGl0cyBhbm5vdGF0aW9ucy4KICAgICAqCiAgICAgKiBAc2VlIHRmLmdyYXBoLnJlbmRlci5Ob2RlIGFuZCB0Zi5ncmFwaC5yZW5kZXIuQW5ub3RhdGlvbgogICAgICogZm9yIGRlc2NyaXB0aW9uIG9mIGVhY2ggcHJvcGVydHkgb2YgZWFjaCByZW5kZXIgbm9kZS4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxheW91dEFubm90YXRpb24ocmVuZGVyTm9kZUluZm8pIHsKICAgICAgICAvLyBJZiB0aGUgcmVuZGVyIG5vZGUgaXMgYW4gZXhwYW5kZWQgbWV0YW5vZGUsIHRoZW4gaXRzIGFubm90YXRpb25zIHdpbGwgbm90CiAgICAgICAgLy8gYmUgdmlzaWJsZSBhbmQgd2Ugc2hvdWxkIHNraXAgdGhlIGFubm90YXRpb24gY2FsY3VsYXRpb25zLgogICAgICAgIGlmIChyZW5kZXJOb2RlSW5mby5leHBhbmRlZCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBpbkFubm90YXRpb25zID0gcmVuZGVyTm9kZUluZm8uaW5Bbm5vdGF0aW9ucy5saXN0OwogICAgICAgIGxldCBvdXRBbm5vdGF0aW9ucyA9IHJlbmRlck5vZGVJbmZvLm91dEFubm90YXRpb25zLmxpc3Q7CiAgICAgICAgLy8gQ2FsY3VsYXRlIHNpemUgZm9yIGluLWFubm90YXRpb25zCiAgICAgICAgbG9kYXNoLmVhY2goaW5Bbm5vdGF0aW9ucywgKGEpID0+IHNpemVBbm5vdGF0aW9uKGEpKTsKICAgICAgICAvLyBDYWxjdWxhdGUgc2l6ZSBmb3Igb3V0LWFubm90YXRpb25zCiAgICAgICAgbG9kYXNoLmVhY2gob3V0QW5ub3RhdGlvbnMsIChhKSA9PiBzaXplQW5ub3RhdGlvbihhKSk7CiAgICAgICAgbGV0IHBhcmFtcyA9IFBBUkFNUyQxLmFubm90YXRpb25zOwogICAgICAgIC8vIENhbGN1bGF0ZSBhbm5vdGF0aW9uIG5vZGUgcG9zaXRpb24gKGEuZHgsIGEuZHkpCiAgICAgICAgLy8gYW5kIHRvdGFsIGhlaWdodCBmb3IgaW4tYW5ub3RhdGlvbnMKICAgICAgICAvLyBBZnRlciB0aGlzIGNodW5rIG9mIGNvZGU6CiAgICAgICAgLy8gaW5ib3hIZWlnaHQgPSBzdW0gb2YgYW5ub3RhdGlvbiBoZWlnaHRzKyAoYW5ub3RhdGlvbi5sZW5ndGggLSAxICogeU9mZnNldCkKICAgICAgICBsZXQgaW5ib3hIZWlnaHQgPSBsb2Rhc2gucmVkdWNlKGluQW5ub3RhdGlvbnMsIChoZWlnaHQsIGEsIGkpID0+IHsKICAgICAgICAgICAgbGV0IHlPZmZzZXQgPSBpID4gMCA/IHBhcmFtcy55T2Zmc2V0IDogMDsKICAgICAgICAgICAgYS5keCA9IC0ocmVuZGVyTm9kZUluZm8uY29yZUJveC53aWR0aCArIGEud2lkdGgpIC8gMiAtIHBhcmFtcy54T2Zmc2V0OwogICAgICAgICAgICBhLmR5ID0gaGVpZ2h0ICsgeU9mZnNldCArIGEuaGVpZ2h0IC8gMjsKICAgICAgICAgICAgcmV0dXJuIGhlaWdodCArIHlPZmZzZXQgKyBhLmhlaWdodDsKICAgICAgICB9LCAwKTsKICAgICAgICBsb2Rhc2guZWFjaChpbkFubm90YXRpb25zLCAoYSkgPT4gewogICAgICAgICAgICBhLmR5IC09IGluYm94SGVpZ2h0IC8gMjsKICAgICAgICAgICAgYS5sYWJlbE9mZnNldCA9IHBhcmFtcy5sYWJlbE9mZnNldDsKICAgICAgICB9KTsKICAgICAgICAvLyBDYWxjdWxhdGUgYW5ub3RhdGlvbiBub2RlIHBvc2l0aW9uIChhLmR4LCBhLmR5KQogICAgICAgIC8vIGFuZCB0b3RhbCBoZWlnaHQgZm9yIG91dC1hbm5vdGF0aW9ucwogICAgICAgIC8vIEFmdGVyIHRoaXMgY2h1bmsgb2YgY29kZToKICAgICAgICAvLyBvdXRib3hIZWlnaHQgPSBzdW0gb2YgYW5ub3RhdGlvbiBoZWlnaHRzICsKICAgICAgICAvLyAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbi5sZW5ndGggLSAxICogeU9mZnNldCkKICAgICAgICBsZXQgb3V0Ym94SGVpZ2h0ID0gbG9kYXNoLnJlZHVjZShvdXRBbm5vdGF0aW9ucywgKGhlaWdodCwgYSwgaSkgPT4gewogICAgICAgICAgICBsZXQgeU9mZnNldCA9IGkgPiAwID8gcGFyYW1zLnlPZmZzZXQgOiAwOwogICAgICAgICAgICBhLmR4ID0gKHJlbmRlck5vZGVJbmZvLmNvcmVCb3gud2lkdGggKyBhLndpZHRoKSAvIDIgKyBwYXJhbXMueE9mZnNldDsKICAgICAgICAgICAgYS5keSA9IGhlaWdodCArIHlPZmZzZXQgKyBhLmhlaWdodCAvIDI7CiAgICAgICAgICAgIHJldHVybiBoZWlnaHQgKyB5T2Zmc2V0ICsgYS5oZWlnaHQ7CiAgICAgICAgfSwgMCk7CiAgICAgICAgbG9kYXNoLmVhY2gob3V0QW5ub3RhdGlvbnMsIChhKSA9PiB7CiAgICAgICAgICAgIC8vIGFkanVzdCBieSAoaGFsZiBvZiApIHRoZSB0b3RhbCBoZWlnaHQKICAgICAgICAgICAgLy8gc28gZHkgaXMgcmVsYXRpdmUgdG8gdGhlIGhvc3Qgbm9kZSdzIGNlbnRlci4KICAgICAgICAgICAgYS5keSAtPSBvdXRib3hIZWlnaHQgLyAyOwogICAgICAgICAgICBhLmxhYmVsT2Zmc2V0ID0gcGFyYW1zLmxhYmVsT2Zmc2V0OwogICAgICAgIH0pOwogICAgICAgIC8vIENyZWF0aW5nIHNjYWxlcyBmb3IgdG91Y2ggcG9pbnQgYmV0d2VlbiB0aGUgaW4tYW5ub3RhdGlvbiBlZGdlcwogICAgICAgIC8vIGFuZCB0aGVpciBob3N0cy4KICAgICAgICBsZXQgaW5Ub3VjaEhlaWdodCA9IE1hdGgubWluKHJlbmRlck5vZGVJbmZvLmhlaWdodCAvIDIgLSByZW5kZXJOb2RlSW5mby5yYWRpdXMsIGluYm94SGVpZ2h0IC8gMik7CiAgICAgICAgaW5Ub3VjaEhlaWdodCA9IGluVG91Y2hIZWlnaHQgPCAwID8gMCA6IGluVG91Y2hIZWlnaHQ7CiAgICAgICAgbGV0IGluWSA9IGxpbmVhciQyKCkKICAgICAgICAgICAgLmRvbWFpbihbMCwgaW5Bbm5vdGF0aW9ucy5sZW5ndGggLSAxXSkKICAgICAgICAgICAgLnJhbmdlKFstaW5Ub3VjaEhlaWdodCwgaW5Ub3VjaEhlaWdodF0pOwogICAgICAgIC8vIENhbGN1bGF0ZSBhbm5vdGF0aW9uIGVkZ2UgcG9zaXRpb24KICAgICAgICBsb2Rhc2guZWFjaChpbkFubm90YXRpb25zLCAoYSwgaSkgPT4gewogICAgICAgICAgICBhLnBvaW50cyA9IFsKICAgICAgICAgICAgICAgIC8vIFRoZSBhbm5vdGF0aW9uIG5vZGUgZW5kCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgZHg6IGEuZHggKyBhLndpZHRoIC8gMiwKICAgICAgICAgICAgICAgICAgICBkeTogYS5keSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAvLyBUaGUgaG9zdCBub2RlIGVuZAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGR4OiAtcmVuZGVyTm9kZUluZm8uY29yZUJveC53aWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2Ugc2NhbGUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUsCiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNlbnRlciBpdCB2ZXJ0aWNhbGx5CiAgICAgICAgICAgICAgICAgICAgZHk6IGluQW5ub3RhdGlvbnMubGVuZ3RoID4gMSA/IGluWShpKSA6IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdOwogICAgICAgIH0pOwogICAgICAgIC8vIENyZWF0aW5nIHNjYWxlcyBmb3IgdG91Y2ggcG9pbnQgYmV0d2VlbiB0aGUgb3V0LWFubm90YXRpb24gZWRnZXMKICAgICAgICAvLyBhbmQgdGhlaXIgaG9zdHMuCiAgICAgICAgbGV0IG91dFRvdWNoSGVpZ2h0ID0gTWF0aC5taW4ocmVuZGVyTm9kZUluZm8uaGVpZ2h0IC8gMiAtIHJlbmRlck5vZGVJbmZvLnJhZGl1cywgb3V0Ym94SGVpZ2h0IC8gMik7CiAgICAgICAgb3V0VG91Y2hIZWlnaHQgPSBvdXRUb3VjaEhlaWdodCA8IDAgPyAwIDogb3V0VG91Y2hIZWlnaHQ7CiAgICAgICAgbGV0IG91dFkgPSBsaW5lYXIkMigpCiAgICAgICAgICAgIC5kb21haW4oWzAsIG91dEFubm90YXRpb25zLmxlbmd0aCAtIDFdKQogICAgICAgICAgICAucmFuZ2UoWy1vdXRUb3VjaEhlaWdodCwgb3V0VG91Y2hIZWlnaHRdKTsKICAgICAgICBsb2Rhc2guZWFjaChvdXRBbm5vdGF0aW9ucywgKGEsIGkpID0+IHsKICAgICAgICAgICAgLy8gQWRkIHBvaW50IGZyb20gdGhlIGJvcmRlciBvZiB0aGUgYW5ub3RhdGlvbiBub2RlCiAgICAgICAgICAgIGEucG9pbnRzID0gWwogICAgICAgICAgICAgICAgLy8gVGhlIGhvc3Qgbm9kZSBlbmQKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBkeDogcmVuZGVyTm9kZUluZm8uY29yZUJveC53aWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgLy8gb25seSB1c2Ugc2NhbGUgaWYgdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUsCiAgICAgICAgICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGNlbnRlciBpdCB2ZXJ0aWNhbGx5CiAgICAgICAgICAgICAgICAgICAgZHk6IG91dEFubm90YXRpb25zLmxlbmd0aCA+IDEgPyBvdXRZKGkpIDogMCwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAvLyBUaGUgYW5ub3RhdGlvbiBub2RlIGVuZAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIGR4OiBhLmR4IC0gYS53aWR0aCAvIDIsCiAgICAgICAgICAgICAgICAgICAgZHk6IGEuZHksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICBdOwogICAgICAgIH0pOwogICAgICAgIHJlbmRlck5vZGVJbmZvLmhlaWdodCA9IE1hdGgubWF4KHJlbmRlck5vZGVJbmZvLmhlaWdodCwgaW5ib3hIZWlnaHQsIG91dGJveEhlaWdodCk7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBzaXplIG9mIGFuIGFubm90YXRpb24gbm9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gc2l6ZUFubm90YXRpb24oYSkgewogICAgICAgIHN3aXRjaCAoYS5hbm5vdGF0aW9uVHlwZSkgewogICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLkNPTlNUQU5UOgogICAgICAgICAgICAgICAgbG9kYXNoLmV4dGVuZChhLCBQQVJBTVMkMS5jb25zdGFudC5zaXplKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNIT1JUQ1VUOgogICAgICAgICAgICAgICAgaWYgKGEubm9kZS50eXBlID09PSBOb2RlVHlwZS5PUCkgewogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5leHRlbmQoYSwgUEFSQU1TJDEuc2hvcnRjdXRTaXplLm9wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGEubm9kZS50eXBlID09PSBOb2RlVHlwZS5NRVRBKSB7CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmV4dGVuZChhLCBQQVJBTVMkMS5zaG9ydGN1dFNpemUubWV0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChhLm5vZGUudHlwZSA9PT0gTm9kZVR5cGUuU0VSSUVTKSB7CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmV4dGVuZChhLCBQQVJBTVMkMS5zaG9ydGN1dFNpemUuc2VyaWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdJbnZhbGlkIG5vZGUgdHlwZTogJyArIGEubm9kZS50eXBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIEFubm90YXRpb25UeXBlLlNVTU1BUlk6CiAgICAgICAgICAgICAgICBsb2Rhc2guZXh0ZW5kKGEsIFBBUkFNUyQxLmNvbnN0YW50LnNpemUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHRoZSBjZW50ZXIgcG9zaXRpb24gb2YgdGhlIG5vZGUncyBzaGFwZS4gVGhlIHBvc2l0aW9uIGRlcGVuZHMKICAgICAqIG9uIGlmIHRoZSBub2RlIGhhcyBpbiBhbmQgb3V0LWFubm90YXRpb25zLgogICAgICovCiAgICBmdW5jdGlvbiBjb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKHJlbmRlckluZm8pIHsKICAgICAgICBpZiAocmVuZGVySW5mby5leHBhbmRlZCkgewogICAgICAgICAgICByZXR1cm4gcmVuZGVySW5mby54OwogICAgICAgIH0KICAgICAgICBsZXQgZHggPSByZW5kZXJJbmZvLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGggPyByZW5kZXJJbmZvLmluYm94V2lkdGggOiAwOwogICAgICAgIHJldHVybiAocmVuZGVySW5mby54IC0gcmVuZGVySW5mby53aWR0aCAvIDIgKyBkeCArIHJlbmRlckluZm8uY29yZUJveC53aWR0aCAvIDIpOwogICAgfQogICAgLyoqIFJldHVybnMgdGhlIGFuZ2xlIChpbiBkZWdyZWVzKSBiZXR3ZWVuIHR3byBwb2ludHMuICovCiAgICBmdW5jdGlvbiBhbmdsZUJldHdlZW5Ud29Qb2ludHMoYSwgYikgewogICAgICAgIGxldCBkeCA9IGIueCAtIGEueDsKICAgICAgICBsZXQgZHkgPSBiLnkgLSBhLnk7CiAgICAgICAgcmV0dXJuICgxODAgKiBNYXRoLmF0YW4oZHkgLyBkeCkpIC8gTWF0aC5QSTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBpZiBhIGxpbmUgZ29pbmcgdGhyb3VnaCB0aGUgc3BlY2lmaWVkIHBvaW50cyBpcyBhIHN0cmFpZ2h0IGxpbmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzU3RyYWlnaHRMaW5lKHBvaW50cykgewogICAgICAgIGxldCBhbmdsZSA9IGFuZ2xlQmV0d2VlblR3b1BvaW50cyhwb2ludHNbMF0sIHBvaW50c1sxXSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7CiAgICAgICAgICAgIGxldCBuZXdBbmdsZSA9IGFuZ2xlQmV0d2VlblR3b1BvaW50cyhwb2ludHNbaV0sIHBvaW50c1tpICsgMV0pOwogICAgICAgICAgICAvLyBIYXZlIGEgdG9sZXJhbmNlIG9mIDEgZGVncmVlLgogICAgICAgICAgICBpZiAoTWF0aC5hYnMobmV3QW5nbGUgLSBhbmdsZSkgPiAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYW5nbGUgPSBuZXdBbmdsZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGludGVyc2VjdGlvbiBvZiBhIGxpbmUgYmV0d2VlbiB0aGUgcHJvdmlkZWQgcG9pbnQKICAgICAqIGFuZCB0aGUgcHJvdmlkZWQgcmVjdGFuZ2xlLgogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcnNlY3RQb2ludEFuZE5vZGUocG9pbnQsIG5vZGUpIHsKICAgICAgICAvLyBjeCBhbmQgY3kgYXJlIHRoZSBjZW50ZXIgb2YgdGhlIHJlY3RhbmdsZS4KICAgICAgICBsZXQgY3ggPSBub2RlLmV4cGFuZGVkID8gbm9kZS54IDogY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZShub2RlKTsKICAgICAgICBsZXQgY3kgPSBub2RlLnk7CiAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBzbG9wZQogICAgICAgIGxldCBkeCA9IHBvaW50LnggLSBjeDsKICAgICAgICBsZXQgZHkgPSBwb2ludC55IC0gY3k7CiAgICAgICAgbGV0IHcgPSBub2RlLmV4cGFuZGVkID8gbm9kZS53aWR0aCA6IG5vZGUuY29yZUJveC53aWR0aDsKICAgICAgICBsZXQgaCA9IG5vZGUuZXhwYW5kZWQgPyBub2RlLmhlaWdodCA6IG5vZGUuY29yZUJveC5oZWlnaHQ7CiAgICAgICAgbGV0IGRlbHRhWCwgZGVsdGFZOwogICAgICAgIGlmICgoTWF0aC5hYnMoZHkpICogdykgLyAyID4gKE1hdGguYWJzKGR4KSAqIGgpIC8gMikgewogICAgICAgICAgICAvLyBUaGUgaW50ZXJzZWN0aW9uIGlzIGFib3ZlIG9yIGJlbG93IHRoZSByZWN0YW5nbGUuCiAgICAgICAgICAgIGlmIChkeSA8IDApIHsKICAgICAgICAgICAgICAgIGggPSAtaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWx0YVggPSBkeSA9PT0gMCA/IDAgOiAoKGggLyAyKSAqIGR4KSAvIGR5OwogICAgICAgICAgICBkZWx0YVkgPSBoIC8gMjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFRoZSBpbnRlcnNlY3Rpb24gaXMgbGVmdCBvciByaWdodCBvZiB0aGUgcmVjdGFuZ2xlLgogICAgICAgICAgICBpZiAoZHggPCAwKSB7CiAgICAgICAgICAgICAgICB3ID0gLXc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVsdGFYID0gdyAvIDI7CiAgICAgICAgICAgIGRlbHRhWSA9IGR4ID09PSAwID8gMCA6ICgodyAvIDIpICogZHkpIC8gZHg7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHg6IGN4ICsgZGVsdGFYLCB5OiBjeSArIGRlbHRhWSB9OwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE1IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3Qgc2VsZWN0Q2hpbGQkMSA9IHNlbGVjdENoaWxkOwogICAgY29uc3QgQ2xhc3MkMiA9IENsYXNzJDE7CiAgICAvKioKICAgICAqIFRoZSBkaW1lbnNpb25zIG9mIHRoZSBtaW5pbWFwIGluY2x1ZGluZyBwYWRkaW5nIGFuZCBtYXJnaW4uCiAgICAgKi8KICAgIGNvbnN0IE1JTklNQVBfQk9YX1dJRFRIID0gMzIwOwogICAgY29uc3QgTUlOSU1BUF9CT1hfSEVJR0hUID0gMTUwOwogICAgbGV0IGhlYWx0aFBpbGxFbnRyaWVzID0gWwogICAgICAgIHsKICAgICAgICAgICAgYmFja2dyb3VuZF9jb2xvcjogJyNDQzJGMkMnLAogICAgICAgICAgICBsYWJlbDogJ05hTicsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGJhY2tncm91bmRfY29sb3I6ICcjRkY4RDAwJywKICAgICAgICAgICAgbGFiZWw6ICct4oieJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgYmFja2dyb3VuZF9jb2xvcjogJyNFQUVBRUEnLAogICAgICAgICAgICBsYWJlbDogJy0nLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBiYWNrZ3JvdW5kX2NvbG9yOiAnI0E1QTVBNScsCiAgICAgICAgICAgIGxhYmVsOiAnMCcsCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIGJhY2tncm91bmRfY29sb3I6ICcjMjYyNjI2JywKICAgICAgICAgICAgbGFiZWw6ICcrJywKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgYmFja2dyb3VuZF9jb2xvcjogJyMwMDNFRDQnLAogICAgICAgICAgICBsYWJlbDogJyviiJ4nLAogICAgICAgIH0sCiAgICBdOwogICAgLyoqCiAgICAgKiBIZWxwZXIgbWV0aG9kIGZvciBmaXR0aW5nIHRoZSBncmFwaCBpbiB0aGUgc3ZnIHZpZXcuCiAgICAgKgogICAgICogQHBhcmFtIHN2ZyBUaGUgbWFpbiBzdmcuCiAgICAgKiBAcGFyYW0gem9vbUcgVGhlIHN2ZyBncm91cCB1c2VkIGZvciBwYW5uaW5nIGFuZCB6b29taW5nLgogICAgICogQHBhcmFtIGQzem9vbSBUaGUgem9vbSBiZWhhdmlvci4KICAgICAqIEBwYXJhbSBjYWxsYmFjayBDYWxsZWQgd2hlbiB0aGUgZml0dGluZyBpcyBkb25lLgogICAgICovCiAgICBmdW5jdGlvbiBmaXQkMihzdmcsIHpvb21HLCBkM3pvb20sIGNhbGxiYWNrKSB7CiAgICAgICAgbGV0IHN2Z1JlY3QgPSBzdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgbGV0IHNjZW5lU2l6ZSA9IG51bGw7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc2NlbmVTaXplID0gem9vbUcuZ2V0QkJveCgpOwogICAgICAgICAgICBpZiAoc2NlbmVTaXplLndpZHRoID09PSAwKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBzY2VuZSBhbnltb3JlLiBXZSBoYXZlIGJlZW4gZGV0YWNoZWQgZnJvbSB0aGUgZG9tLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIC8vIEZpcmVmb3ggcHJvZHVjZWQgTlNfRVJST1JfRkFJTFVSRSBpZiB3ZSBoYXZlIGJlZW4KICAgICAgICAgICAgLy8gZGV0YWNoZWQgZnJvbSB0aGUgZG9tLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGxldCBzY2FsZSA9IDAuOSAqCiAgICAgICAgICAgIE1hdGgubWluKHN2Z1JlY3Qud2lkdGggLyBzY2VuZVNpemUud2lkdGgsIHN2Z1JlY3QuaGVpZ2h0IC8gc2NlbmVTaXplLmhlaWdodCwgMik7CiAgICAgICAgbGV0IHBhcmFtcyA9IFBBUkFNUyQxLmdyYXBoOwogICAgICAgIGNvbnN0IHRyYW5zZm9ybSA9IGlkZW50aXR5JDkKICAgICAgICAgICAgLnNjYWxlKHNjYWxlKQogICAgICAgICAgICAudHJhbnNsYXRlKHBhcmFtcy5wYWRkaW5nLnBhZGRpbmdMZWZ0LCBwYXJhbXMucGFkZGluZy5wYWRkaW5nVG9wKTsKICAgICAgICBzZWxlY3Qoc3ZnKQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5kdXJhdGlvbig1MDApCiAgICAgICAgICAgIC5jYWxsKGQzem9vbS50cmFuc2Zvcm0sIHRyYW5zZm9ybSkKICAgICAgICAgICAgLm9uKCdlbmQuZml0dGVkJywgKCkgPT4gewogICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3RlbmVyIGZvciB0aGUgem9vbWVuZCBldmVudCwKICAgICAgICAgICAgLy8gc28gd2UgZG9uJ3QgZ2V0IGNhbGxlZCBhdCB0aGUgZW5kIG9mIHJlZ3VsYXIgem9vbSBldmVudHMsCiAgICAgICAgICAgIC8vIGp1c3QgdGhvc2UgdGhhdCBmaXQgdGhlIGdyYXBoIHRvIHNjcmVlbi4KICAgICAgICAgICAgZDN6b29tLm9uKCdlbmQuZml0dGVkJywgbnVsbCk7CiAgICAgICAgICAgIGNhbGxiYWNrKCk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEhlbHBlciBtZXRob2QgZm9yIHBhbm5pbmcgdGhlIGdyYXBoIHRvIGNlbnRlciBvbiB0aGUgcHJvdmlkZWQgbm9kZSwKICAgICAqIGlmIHRoZSBub2RlIGlzIGN1cnJlbnRseSBvZmYtc2NyZWVuLgogICAgICoKICAgICAqIEBwYXJhbSBub2RlTmFtZSBUaGUgbm9kZSB0byBjZW50ZXIgdGhlIGdyYXBoIG9uCiAgICAgKiBAcGFyYW0gc3ZnIFRoZSByb290IFNWRyBlbGVtZW50IGZvciB0aGUgZ3JhcGgKICAgICAqIEBwYXJhbSB6b29tRyBUaGUgc3ZnIGdyb3VwIHVzZWQgZm9yIHBhbm5pbmcgYW5kIHpvb21pbmcuCiAgICAgKiBAcGFyYW0gZDN6b29tIFRoZSB6b29tIGJlaGF2aW9yLgogICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBncmFwaCBoYWQgdG8gYmUgcGFubmVkIHRvIGRpc3BsYXkgdGhlCiAgICAgKiAgICAgICAgICAgIHByb3ZpZGVkIG5vZGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhblRvTm9kZShub2RlTmFtZSwgc3ZnLCB6b29tRywgZDN6b29tKSB7CiAgICAgICAgY29uc3Qgbm9kZSA9IChzZWxlY3Qoc3ZnKS5zZWxlY3QoYFtkYXRhLW5hbWU9IiR7bm9kZU5hbWV9Il1gKS5ub2RlKCkpOwogICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oYHBhblRvTm9kZSgpIGZhaWxlZCBmb3Igbm9kZSBuYW1lICIke25vZGVOYW1lfSJgKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvLyBDaGVjayBpZiB0aGUgc2VsZWN0ZWQgbm9kZSBpcyBvZmYtc2NyZWVuIGluIGVpdGhlcgogICAgICAgIC8vIFggb3IgWSBkaW1lbnNpb24gaW4gZWl0aGVyIGRpcmVjdGlvbi4KICAgICAgICBsZXQgbm9kZUJveCA9IG5vZGUuZ2V0QkJveCgpOwogICAgICAgIGxldCBub2RlQ3RtID0gbm9kZS5nZXRTY3JlZW5DVE0oKTsKICAgICAgICBsZXQgcG9pbnRUTCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgICAgIGxldCBwb2ludEJSID0gc3ZnLmNyZWF0ZVNWR1BvaW50KCk7CiAgICAgICAgcG9pbnRUTC54ID0gbm9kZUJveC54OwogICAgICAgIHBvaW50VEwueSA9IG5vZGVCb3gueTsKICAgICAgICBwb2ludEJSLnggPSBub2RlQm94LnggKyBub2RlQm94LndpZHRoOwogICAgICAgIHBvaW50QlIueSA9IG5vZGVCb3gueSArIG5vZGVCb3guaGVpZ2h0OwogICAgICAgIHBvaW50VEwgPSBwb2ludFRMLm1hdHJpeFRyYW5zZm9ybShub2RlQ3RtKTsKICAgICAgICBwb2ludEJSID0gcG9pbnRCUi5tYXRyaXhUcmFuc2Zvcm0obm9kZUN0bSk7CiAgICAgICAgbGV0IGlzT3V0c2lkZU9mQm91bmRzID0gKHN0YXJ0LCBlbmQsIGxvd2VyQm91bmQsIHVwcGVyQm91bmQpID0+IHsKICAgICAgICAgICAgLy8gUmV0dXJuIGlmIGV2ZW4gYSBwYXJ0IG9mIHRoZSBpbnRlcnZhbCBpcyBvdXQgb2YgYm91bmRzLgogICAgICAgICAgICByZXR1cm4gIShzdGFydCA+IGxvd2VyQm91bmQgJiYgZW5kIDwgdXBwZXJCb3VuZCk7CiAgICAgICAgfTsKICAgICAgICBsZXQgc3ZnUmVjdCA9IHN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAvLyBTdWJ0cmFjdCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgbm9kZSBpcyBub3QgaGlkZGVuIGJlaGluZCB0aGUgbWluaW1hcC4KICAgICAgICBjb25zdCBob3Jpem9udGFsQm91bmQgPSBzdmdSZWN0LmxlZnQgKyBzdmdSZWN0LndpZHRoIC0gTUlOSU1BUF9CT1hfV0lEVEg7CiAgICAgICAgY29uc3QgdmVydGljYWxCb3VuZCA9IHN2Z1JlY3QudG9wICsgc3ZnUmVjdC5oZWlnaHQgLSBNSU5JTUFQX0JPWF9IRUlHSFQ7CiAgICAgICAgaWYgKGlzT3V0c2lkZU9mQm91bmRzKHBvaW50VEwueCwgcG9pbnRCUi54LCBzdmdSZWN0LmxlZnQsIGhvcml6b250YWxCb3VuZCkgfHwKICAgICAgICAgICAgaXNPdXRzaWRlT2ZCb3VuZHMocG9pbnRUTC55LCBwb2ludEJSLnksIHN2Z1JlY3QudG9wLCB2ZXJ0aWNhbEJvdW5kKSkgewogICAgICAgICAgICAvLyBEZXRlcm1pbmUgdGhlIGFtb3VudCB0byB0cmFuc2xhdGUgdGhlIGdyYXBoIGluIGJvdGggWCBhbmQgWSBkaW1lbnNpb25zIGluCiAgICAgICAgICAgIC8vIG9yZGVyIHRvIGNlbnRlciB0aGUgc2VsZWN0ZWQgbm9kZS4gVGhpcyB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHBvc2l0aW9uCiAgICAgICAgICAgIC8vIG9mIHRoZSBub2RlLCB0aGUgc2l6ZSBvZiB0aGUgc3ZnIHNjZW5lLCB0aGUgYW1vdW50IHRoZSBzY2VuZSBoYXMgYmVlbgogICAgICAgICAgICAvLyBzY2FsZWQgYnkgdGhyb3VnaCB6b29taW5nLCBhbmQgYW55IHByZXZpb3VzIHRyYW5zZm9ybXMgYWxyZWFkeSBwZXJmb3JtZWQKICAgICAgICAgICAgLy8gYnkgdGhpcyBsb2dpYy4KICAgICAgICAgICAgbGV0IGNlbnRlclggPSAocG9pbnRUTC54ICsgcG9pbnRCUi54KSAvIDI7CiAgICAgICAgICAgIGxldCBjZW50ZXJZID0gKHBvaW50VEwueSArIHBvaW50QlIueSkgLyAyOwogICAgICAgICAgICBsZXQgZHggPSBzdmdSZWN0LmxlZnQgKyBzdmdSZWN0LndpZHRoIC8gMiAtIGNlbnRlclg7CiAgICAgICAgICAgIGxldCBkeSA9IHN2Z1JlY3QudG9wICsgc3ZnUmVjdC5oZWlnaHQgLyAyIC0gY2VudGVyWTsKICAgICAgICAgICAgLy8gV2UgdHJhbnNsYXRlIGJ5IHRoaXMgYW1vdW50LiBXZSBkaXZpZGUgdGhlIFggYW5kIFkgdHJhbnNsYXRpb25zIGJ5IHRoZQogICAgICAgICAgICAvLyBzY2FsZSB0byB1bmRvIGhvdyB0cmFuc2xhdGVCeSBzY2FsZXMgdGhlIHRyYW5zbGF0aW9ucyAoaW4gZDMgdjQpLgogICAgICAgICAgICBjb25zdCBzdmdUcmFuc2Zvcm0gPSB0cmFuc2Zvcm0kMShzdmcpOwogICAgICAgICAgICBzZWxlY3Qoc3ZnKQogICAgICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAgICAgLmR1cmF0aW9uKDUwMCkKICAgICAgICAgICAgICAgIC5jYWxsKGQzem9vbS50cmFuc2xhdGVCeSwgZHggLyBzdmdUcmFuc2Zvcm0uaywgZHkgLyBzdmdUcmFuc2Zvcm0uayk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEdpdmVuIGEgc2NlbmUncyBzdmcgZ3JvdXAsIHNldCAgZy5pbi1leHRyYWN0LCBnLmNvcmVHcmFwaCwgZy5vdXQtZXh0cmFjdCBzdmcKICAgICAqIGdyb3VwcycgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIHNjZW5lLgogICAgICoKICAgICAqIEBwYXJhbSBzY2VuZUdyb3VwCiAgICAgKiBAcGFyYW0gcmVuZGVyTm9kZSByZW5kZXIgbm9kZSBvZiBhIG1ldGFub2RlIG9yIHNlcmllcyBub2RlLgogICAgICovCiAgICBmdW5jdGlvbiBwb3NpdGlvbiQxKHNjZW5lR3JvdXAsIHJlbmRlck5vZGUpIHsKICAgICAgICAvLyBUcmFuc2xhdGUgc2NlbmVzIGRvd24gYnkgdGhlIGxhYmVsIGhlaWdodCBzbyB0aGF0IHdoZW4gc2hvd2luZyBncmFwaHMgaW4KICAgICAgICAvLyBleHBhbmRlZCBtZXRhbm9kZXMsIHRoZSBncmFwaHMgYXJlIGJlbG93IHRoZSBsYWJlbHMuICBEbyBub3Qgc2hpZnQgdGhlbQogICAgICAgIC8vIGRvd24gZm9yIHNlcmllcyBub2RlcyBhcyBzZXJpZXMgbm9kZXMgZG9uJ3QgaGF2ZSBsYWJlbHMgaW5zaWRlIG9mIHRoZWlyCiAgICAgICAgLy8gYm91bmRpbmcgYm94ZXMuCiAgICAgICAgbGV0IHlUcmFuc2xhdGUgPSByZW5kZXJOb2RlLm5vZGUudHlwZSA9PT0gTm9kZVR5cGUuU0VSSUVTCiAgICAgICAgICAgID8gMAogICAgICAgICAgICA6IFBBUkFNUyQxLnN1YnNjZW5lLm1ldGEubGFiZWxIZWlnaHQ7CiAgICAgICAgLy8gY29yZQogICAgICAgIHRyYW5zbGF0ZSQxKHNlbGVjdENoaWxkJDEoc2NlbmVHcm91cCwgJ2cnLCBDbGFzcyQyLlNjZW5lLkNPUkUpLCAwLCB5VHJhbnNsYXRlKTsKICAgICAgICAvLyBpbi1leHRyYWN0CiAgICAgICAgbGV0IGhhc0luRXh0cmFjdCA9IHJlbmRlck5vZGUuaXNvbGF0ZWRJbkV4dHJhY3QubGVuZ3RoID4gMDsKICAgICAgICBsZXQgaGFzT3V0RXh0cmFjdCA9IHJlbmRlck5vZGUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCA+IDA7CiAgICAgICAgbGV0IGhhc0xpYnJhcnlGdW5jdGlvbnMgPSByZW5kZXJOb2RlLmxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0Lmxlbmd0aCA+IDA7CiAgICAgICAgbGV0IG9mZnNldCA9IFBBUkFNUyQxLnN1YnNjZW5lLm1ldGEuZXh0cmFjdFhPZmZzZXQ7CiAgICAgICAgbGV0IGF1eFdpZHRoID0gMDsKICAgICAgICBpZiAoaGFzSW5FeHRyYWN0KSB7CiAgICAgICAgICAgIGF1eFdpZHRoICs9IHJlbmRlck5vZGUub3V0RXh0cmFjdEJveC53aWR0aDsKICAgICAgICB9CiAgICAgICAgaWYgKGhhc091dEV4dHJhY3QpIHsKICAgICAgICAgICAgYXV4V2lkdGggKz0gcmVuZGVyTm9kZS5vdXRFeHRyYWN0Qm94LndpZHRoOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzSW5FeHRyYWN0KSB7CiAgICAgICAgICAgIGxldCBpbkV4dHJhY3RYID0gcmVuZGVyTm9kZS5jb3JlQm94LndpZHRoOwogICAgICAgICAgICBpZiAoYXV4V2lkdGggPCBNSU5fQVVYX1dJRFRIKSB7CiAgICAgICAgICAgICAgICBpbkV4dHJhY3RYID0KICAgICAgICAgICAgICAgICAgICBpbkV4dHJhY3RYIC0gTUlOX0FVWF9XSURUSCArIHJlbmRlck5vZGUuaW5FeHRyYWN0Qm94LndpZHRoIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGluRXh0cmFjdFggPQogICAgICAgICAgICAgICAgICAgIGluRXh0cmFjdFggLQogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJOb2RlLmluRXh0cmFjdEJveC53aWR0aCAvIDIgLQogICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJOb2RlLm91dEV4dHJhY3RCb3gud2lkdGggLQogICAgICAgICAgICAgICAgICAgICAgICAoaGFzT3V0RXh0cmFjdCA/IG9mZnNldCA6IDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluRXh0cmFjdFggPQogICAgICAgICAgICAgICAgaW5FeHRyYWN0WCAtCiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoIC0KICAgICAgICAgICAgICAgICAgICAoaGFzTGlicmFyeUZ1bmN0aW9ucyA/IG9mZnNldCA6IDApOwogICAgICAgICAgICB0cmFuc2xhdGUkMShzZWxlY3RDaGlsZCQxKHNjZW5lR3JvdXAsICdnJywgQ2xhc3MkMi5TY2VuZS5JTkVYVFJBQ1QpLCBpbkV4dHJhY3RYLCB5VHJhbnNsYXRlKTsKICAgICAgICB9CiAgICAgICAgLy8gb3V0LWV4dHJhY3QKICAgICAgICBpZiAoaGFzT3V0RXh0cmFjdCkgewogICAgICAgICAgICBsZXQgb3V0RXh0cmFjdFggPSByZW5kZXJOb2RlLmNvcmVCb3gud2lkdGg7CiAgICAgICAgICAgIGlmIChhdXhXaWR0aCA8IE1JTl9BVVhfV0lEVEgpIHsKICAgICAgICAgICAgICAgIG91dEV4dHJhY3RYID0KICAgICAgICAgICAgICAgICAgICBvdXRFeHRyYWN0WCAtIE1JTl9BVVhfV0lEVEggKyByZW5kZXJOb2RlLm91dEV4dHJhY3RCb3gud2lkdGggLyAyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgb3V0RXh0cmFjdFggLT0gcmVuZGVyTm9kZS5vdXRFeHRyYWN0Qm94LndpZHRoIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBvdXRFeHRyYWN0WCA9CiAgICAgICAgICAgICAgICBvdXRFeHRyYWN0WCAtCiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoIC0KICAgICAgICAgICAgICAgICAgICAoaGFzTGlicmFyeUZ1bmN0aW9ucyA/IG9mZnNldCA6IDApOwogICAgICAgICAgICB0cmFuc2xhdGUkMShzZWxlY3RDaGlsZCQxKHNjZW5lR3JvdXAsICdnJywgQ2xhc3MkMi5TY2VuZS5PVVRFWFRSQUNUKSwgb3V0RXh0cmFjdFgsIHlUcmFuc2xhdGUpOwogICAgICAgIH0KICAgICAgICBpZiAoaGFzTGlicmFyeUZ1bmN0aW9ucykgewogICAgICAgICAgICBsZXQgbGlicmFyeUZ1bmN0aW9uc0V4dHJhY3RYID0gcmVuZGVyTm9kZS5jb3JlQm94LndpZHRoIC0gcmVuZGVyTm9kZS5saWJyYXJ5RnVuY3Rpb25zQm94LndpZHRoIC8gMjsKICAgICAgICAgICAgdHJhbnNsYXRlJDEoc2VsZWN0Q2hpbGQkMShzY2VuZUdyb3VwLCAnZycsIENsYXNzJDIuU2NlbmUuRlVOQ1RJT05fTElCUkFSWSksIGxpYnJhcnlGdW5jdGlvbnNFeHRyYWN0WCwgeVRyYW5zbGF0ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqIEFkZHMgYSBjbGljayBsaXN0ZW5lciB0byBhIGdyb3VwIHRoYXQgZmlyZXMgYSBncmFwaC1zZWxlY3QgZXZlbnQgKi8KICAgIGZ1bmN0aW9uIGFkZEdyYXBoQ2xpY2tMaXN0ZW5lcihncmFwaEdyb3VwLCBzY2VuZUVsZW1lbnQpIHsKICAgICAgICBzZWxlY3QoZ3JhcGhHcm91cCkub24oJ2NsaWNrJywgKCkgPT4gewogICAgICAgICAgICBzY2VuZUVsZW1lbnQuZmlyZSgnZ3JhcGgtc2VsZWN0Jyk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKiogSGVscGVyIGZvciBhZGRpbmcgdHJhbnNmb3JtOiB0cmFuc2xhdGUoeDAsIHkwKSAqLwogICAgZnVuY3Rpb24gdHJhbnNsYXRlJDEoc2VsZWN0aW9uLCB4MCwgeTApIHsKICAgICAgICAvLyBJZiBpdCBpcyBhbHJlYWR5IHBsYWNlZCBvbiB0aGUgc2NyZWVuLCBtYWtlIGl0IGEgdHJhbnNpdGlvbi4KICAgICAgICBpZiAoc2VsZWN0aW9uLmF0dHIoJ3RyYW5zZm9ybScpICE9IG51bGwpIHsKICAgICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0aW9uLnRyYW5zaXRpb24oJ3Bvc2l0aW9uJyk7CiAgICAgICAgfQogICAgICAgIHNlbGVjdGlvbi5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyB4MCArICcsJyArIHkwICsgJyknKTsKICAgIH0KICAgIC8qKgogICAgICogSGVscGVyIGZvciBzZXR0aW5nIHBvc2l0aW9uIG9mIGEgc3ZnIHJlY3QKICAgICAqIEBwYXJhbSByZWN0IEEgZDMgc2VsZWN0aW9uIG9mIHJlY3QocykgdG8gc2V0IHBvc2l0aW9uIG9mLgogICAgICogQHBhcmFtIGN4IENlbnRlciB4LgogICAgICogQHBhcmFtIGN5IENlbnRlciB4LgogICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIHRvIHNldC4KICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IHRvIHNldC4KICAgICAqLwogICAgZnVuY3Rpb24gcG9zaXRpb25SZWN0KHJlY3QsIGN4LCBjeSwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIHJlY3QKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuYXR0cigneCcsIGN4IC0gd2lkdGggLyAyKQogICAgICAgICAgICAuYXR0cigneScsIGN5IC0gaGVpZ2h0IC8gMikKICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgd2lkdGgpCiAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCBoZWlnaHQpOwogICAgfQogICAgLyoqCiAgICAgKiBQb3NpdGlvbnMgYSB0cmlhbmdsZSBhbmQgc2l6ZXMgaXQuCiAgICAgKiBAcGFyYW0gcG9seWdvbiBwb2x5Z29uIHRvIHNldCBwb3NpdGlvbiBvZi4KICAgICAqIEBwYXJhbSBjeCBDZW50ZXIgeC4KICAgICAqIEBwYXJhbSBjeSBDZW50ZXIgeS4KICAgICAqIEBwYXJhbSB3aWR0aCBXaWR0aCBvZiBib3VuZGluZyBib3ggZm9yIHRyaWFuZ2xlLgogICAgICogQHBhcmFtIGhlaWdodCBIZWlnaHQgb2YgYm91bmRpbmcgYm94IGZvciB0cmlhbmdsZS4KICAgICAqLwogICAgZnVuY3Rpb24gcG9zaXRpb25UcmlhbmdsZShwb2x5Z29uLCBjeCwgY3ksIHdpZHRoLCBoZWlnaHQpIHsKICAgICAgICBjb25zdCBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjsKICAgICAgICBjb25zdCBoYWxmV2lkdGggPSB3aWR0aCAvIDI7CiAgICAgICAgY29uc3QgcG9pbnRzID0gWwogICAgICAgICAgICBbY3gsIGN5IC0gaGFsZkhlaWdodF0sCiAgICAgICAgICAgIFtjeCArIGhhbGZXaWR0aCwgY3kgKyBoYWxmSGVpZ2h0XSwKICAgICAgICAgICAgW2N4IC0gaGFsZldpZHRoLCBjeSArIGhhbGZIZWlnaHRdLAogICAgICAgIF07CiAgICAgICAgcG9seWdvbgogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5hdHRyKCdwb2ludHMnLCBwb2ludHMubWFwKChwb2ludCkgPT4gcG9pbnQuam9pbignLCcpKS5qb2luKCcgJykpOwogICAgfQogICAgLyoqCiAgICAgKiBIZWxwZXIgZm9yIHNldHRpbmcgcG9zaXRpb24gb2YgYSBzdmcgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbgogICAgICogQHBhcmFtIGJ1dHRvbiBjb250YWluZXIgZ3JvdXAKICAgICAqIEBwYXJhbSByZW5kZXJOb2RlIHRoZSByZW5kZXIgbm9kZSBvZiB0aGUgZ3JvdXAgbm9kZSB0byBwb3NpdGlvbgogICAgICogICAgICAgIHRoZSBidXR0b24gb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBvc2l0aW9uQnV0dG9uKGJ1dHRvbiwgcmVuZGVyTm9kZSkgewogICAgICAgIGxldCBjeCA9IGNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUocmVuZGVyTm9kZSk7CiAgICAgICAgLy8gUG9zaXRpb24gdGhlIGJ1dHRvbiBpbiB0aGUgdG9wLXJpZ2h0IGNvcm5lciBvZiB0aGUgZ3JvdXAgbm9kZSwKICAgICAgICAvLyB3aXRoIHNwYWNlIGdpdmVuIHRoZSBkcmF3IHRoZSBidXR0b24gaW5zaWRlIG9mIHRoZSBjb3JuZXIuCiAgICAgICAgbGV0IHdpZHRoID0gcmVuZGVyTm9kZS5leHBhbmRlZCA/IHJlbmRlck5vZGUud2lkdGggOiByZW5kZXJOb2RlLmNvcmVCb3gud2lkdGg7CiAgICAgICAgbGV0IGhlaWdodCA9IHJlbmRlck5vZGUuZXhwYW5kZWQKICAgICAgICAgICAgPyByZW5kZXJOb2RlLmhlaWdodAogICAgICAgICAgICA6IHJlbmRlck5vZGUuY29yZUJveC5oZWlnaHQ7CiAgICAgICAgbGV0IHggPSBjeCArIHdpZHRoIC8gMiAtIDY7CiAgICAgICAgbGV0IHkgPSByZW5kZXJOb2RlLnkgLSBoZWlnaHQgLyAyICsgNjsKICAgICAgICAvLyBGb3IgdW5leHBhbmRlZCBzZXJpZXMgbm9kZXMsIHRoZSBidXR0b24gaGFzIHNwZWNpYWwgcGxhY2VtZW50IGR1ZQogICAgICAgIC8vIHRvIHRoZSB1bmlxdWUgdmlzdWFscyBvZiB0aGlzIGdyb3VwIG5vZGUuCiAgICAgICAgaWYgKHJlbmRlck5vZGUubm9kZS50eXBlID09PSBOb2RlVHlwZS5TRVJJRVMgJiYgIXJlbmRlck5vZGUuZXhwYW5kZWQpIHsKICAgICAgICAgICAgeCArPSAxMDsKICAgICAgICAgICAgeSAtPSAyOwogICAgICAgIH0KICAgICAgICBsZXQgdHJhbnNsYXRlU3RyID0gJ3RyYW5zbGF0ZSgnICsgeCArICcsJyArIHkgKyAnKSc7CiAgICAgICAgYnV0dG9uLnNlbGVjdEFsbCgncGF0aCcpLnRyYW5zaXRpb24oKS5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGVTdHIpOwogICAgICAgIGJ1dHRvbgogICAgICAgICAgICAuc2VsZWN0KCdjaXJjbGUnKQogICAgICAgICAgICAudHJhbnNpdGlvbigpCiAgICAgICAgICAgIC5hdHRyKHsgY3g6IHgsIGN5OiB5LCByOiBQQVJBTVMkMS5ub2RlU2l6ZS5tZXRhLmV4cGFuZEJ1dHRvblJhZGl1cyB9KTsKICAgIH0KICAgIC8qKgogICAgICogSGVscGVyIGZvciBzZXR0aW5nIHBvc2l0aW9uIG9mIGEgc3ZnIGVsbGlwc2UKICAgICAqIEBwYXJhbSBlbGxpcHNlIGVsbGlwc2UgdG8gc2V0IHBvc2l0aW9uIG9mLgogICAgICogQHBhcmFtIGN4IENlbnRlciB4LgogICAgICogQHBhcmFtIGN5IENlbnRlciB4LgogICAgICogQHBhcmFtIHdpZHRoIFdpZHRoIHRvIHNldC4KICAgICAqIEBwYXJhbSBoZWlnaHQgSGVpZ2h0IHRvIHNldC4KICAgICAqLwogICAgZnVuY3Rpb24gcG9zaXRpb25FbGxpcHNlKGVsbGlwc2UsIGN4LCBjeSwgd2lkdGgsIGhlaWdodCkgewogICAgICAgIGVsbGlwc2UKICAgICAgICAgICAgLnRyYW5zaXRpb24oKQogICAgICAgICAgICAuYXR0cignY3gnLCBjeCkKICAgICAgICAgICAgLmF0dHIoJ2N5JywgY3kpCiAgICAgICAgICAgIC5hdHRyKCdyeCcsIHdpZHRoIC8gMikKICAgICAgICAgICAgLmF0dHIoJ3J5JywgaGVpZ2h0IC8gMik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzdGF0IEEgc3RhdCBmb3IgYSBoZWFsdGggcGlsbCAoc3VjaCBhcyBtZWFuIG9yIHZhcmlhbmNlKS4KICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkUm91bmRPbmVzRGlnaXQgV2hldGhlciB0byByb3VuZCB0aGlzIG51bWJlciB0byB0aGUKICAgICAqICAgICBvbmVzIGRpZ2l0LiBVc2VmdWwgZm9yIHNheSBpbnQsIHVpbnQsIGFuZCBib29sIG91dHB1dCB0eXBlcy4KICAgICAqIEByZXR1cm4ge3N0cmluZ30gQSBodW1hbi1mcmllbmRseSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhhdCBzdGF0LgogICAgICovCiAgICBmdW5jdGlvbiBodW1hbml6ZUhlYWx0aFBpbGxTdGF0KHN0YXQsIHNob3VsZFJvdW5kT25lc0RpZ2l0KSB7CiAgICAgICAgaWYgKHNob3VsZFJvdW5kT25lc0RpZ2l0KSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0LnRvRml4ZWQoMCk7CiAgICAgICAgfQogICAgICAgIGlmIChNYXRoLmFicyhzdGF0KSA+PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0LnRvRml4ZWQoMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdGF0LnRvRXhwb25lbnRpYWwoMSk7CiAgICB9CiAgICAvKioKICAgICAqIEdldCB0ZXh0IGNvbnRlbnQgZGVzY3JpYmluZyBhIGhlYWx0aCBwaWxsLgogICAgICovCiAgICBmdW5jdGlvbiBfZ2V0SGVhbHRoUGlsbFRleHRDb250ZW50KGhlYWx0aFBpbGwsIHRvdGFsQ291bnQsIGVsZW1lbnRzQnJlYWtkb3duLCBudW1lcmljU3RhdHMpIHsKICAgICAgICBsZXQgdGV4dCA9ICdEZXZpY2U6ICcgKyBoZWFsdGhQaWxsLmRldmljZV9uYW1lICsgJ1xuJzsKICAgICAgICB0ZXh0ICs9ICdkdHlwZTogJyArIGhlYWx0aFBpbGwuZHR5cGUgKyAnXG4nOwogICAgICAgIGxldCBzaGFwZVN0ciA9ICcoc2NhbGFyKSc7CiAgICAgICAgaWYgKGhlYWx0aFBpbGwuc2hhcGUubGVuZ3RoID4gMCkgewogICAgICAgICAgICBzaGFwZVN0ciA9ICcoJyArIGhlYWx0aFBpbGwuc2hhcGUuam9pbignLCcpICsgJyknOwogICAgICAgIH0KICAgICAgICB0ZXh0ICs9ICdcbnNoYXBlOiAnICsgc2hhcGVTdHIgKyAnXG5cbic7CiAgICAgICAgdGV4dCArPSAnIyhlbGVtZW50cyk6ICcgKyB0b3RhbENvdW50ICsgJ1xuJzsKICAgICAgICBjb25zdCBicmVha2Rvd25JdGVtcyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHNCcmVha2Rvd24ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKGVsZW1lbnRzQnJlYWtkb3duW2ldID4gMCkgewogICAgICAgICAgICAgICAgYnJlYWtkb3duSXRlbXMucHVzaCgnIygnICsgaGVhbHRoUGlsbEVudHJpZXNbaV0ubGFiZWwgKyAnKTogJyArIGVsZW1lbnRzQnJlYWtkb3duW2ldKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0ZXh0ICs9IGJyZWFrZG93bkl0ZW1zLmpvaW4oJywgJykgKyAnXG5cbic7CiAgICAgICAgLy8gSW4gc29tZSBjYXNlcyAoZS5nLiwgc2l6ZS0wIHRlbnNvcnM7IGFsbCBlbGVtZW50cyBhcmUgbmFuIG9yIGluZikgdGhlCiAgICAgICAgLy8gbWluL21heCBhbmQgbWVhbi9zdGRkZXYgc3RhdHMgYXJlIG1lYW5pbmdsZXNzLgogICAgICAgIGlmIChudW1lcmljU3RhdHMubWF4ID49IG51bWVyaWNTdGF0cy5taW4pIHsKICAgICAgICAgICAgdGV4dCArPSAnbWluOiAnICsgbnVtZXJpY1N0YXRzLm1pbiArICcsIG1heDogJyArIG51bWVyaWNTdGF0cy5tYXggKyAnXG4nOwogICAgICAgICAgICB0ZXh0ICs9ICdtZWFuOiAnICsgbnVtZXJpY1N0YXRzLm1lYW4gKyAnLCBzdGRkZXY6ICcgKyBudW1lcmljU3RhdHMuc3RkZGV2OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIC8qKgogICAgICogUmVuZGVycyBhIGhlYWx0aCBwaWxsIGZvciBhbiBvcCBhdG9wIGEgbm9kZS4KICAgICAqIG5vZGVHcm91cEVsZW1lbnQ6IFRoZSBTVkcgZWxlbWVudCBpbiB3aGljaCB0byByZW5kZXIuCiAgICAgKiBoZWFsdGhQaWxsOiBBIGxpc3Qgb2YgYmFja2VuZC5IZWFsdGhQaWxsIG9iamVjdHMuCiAgICAgKiBub2RlSW5mbzogSW5mbyBvbiB0aGUgYXNzb2NpYXRlZCBub2RlLgogICAgICogaGVhbHRoUGlsbElkOiBBIHVuaXF1ZSBudW1lcmljIElEIGFzc2lnbmVkIHRvIHRoaXMgaGVhbHRoIHBpbGwuCiAgICAgKiBoZWFsdGhQaWxsV2lkdGg6IE9wdGlvbmFsIHdpZHRoIG9mIHRoZSBoZWFsdGggcGlsbC4KICAgICAqIGhlYWx0aFBpbGxIZWlnaHQ6IE9wdGlvbmFsIGhlaWdodCBvZiB0aGUgaGVhbHRoIHBpbGwuCiAgICAgKiBoZWFsdGhQaWxsWU9mZnNldDogT3B0aW9uYWwgeS1vZmZzZXQgb2YgdGhlIGhlYWx0aCBwaWxsICh0aGF0IGlzLCB0aGUKICAgICAqICAgY29sb3ItY29kZWQgcmVnaW9uKS4KICAgICAqIHRleHRPZmZzZXQ6IE9wdGlvbmFsIHZhbHVlIGZvciB0aGUgeC1vZmZzZXQgb2YgdGhlIHRvcCB0ZXh0IGxhYmVsCiAgICAgKiAgIHJlbGF0aXZlIHRvIHRoZSBsZWZ0IGVkZ2Ugb2YgdGhlIGhlYWx0aCBwaWxsLiBJZiBub3QgcHJvdmlkZWQsIHdpbGwKICAgICAqICAgZGVmYXVsdCB0byBgaGVhbHRoUGlsbFdpZHRoIC8gMmAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZEhlYWx0aFBpbGwobm9kZUdyb3VwRWxlbWVudCwgaGVhbHRoUGlsbCwgbm9kZUluZm8sIGhlYWx0aFBpbGxJZCwgaGVhbHRoUGlsbFdpZHRoID0gNjAsIGhlYWx0aFBpbGxIZWlnaHQgPSAxMCwgaGVhbHRoUGlsbFlPZmZzZXQgPSAwLCB0ZXh0WE9mZnNldCkgewogICAgICAgIC8vIENoZWNrIGlmIHRleHQgYWxyZWFkeSBleGlzdHMgYXQgbG9jYXRpb24uCiAgICAgICAgc2VsZWN0KG5vZGVHcm91cEVsZW1lbnQucGFyZW50Tm9kZSkKICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmhlYWx0aC1waWxsJykKICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgICAgIGlmICghaGVhbHRoUGlsbCkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGNvbnN0IGxhc3RIZWFsdGhQaWxsRGF0YSA9IGhlYWx0aFBpbGwudmFsdWU7CiAgICAgICAgLy8gRm9yIG5vdywgd2Ugb25seSB2aXN1YWxpemUgdGhlIDYgdmFsdWVzIHRoYXQgc3VtbWFyaXplIGNvdW50cyBvZiB0ZW5zb3IKICAgICAgICAvLyBlbGVtZW50cyBvZiB2YXJpb3VzIGNhdGVnb3JpZXM6IC1JbmYsIG5lZ2F0aXZlLCAwLCBwb3NpdGl2ZSwgSW5mLCBhbmQgTmFOLgogICAgICAgIGNvbnN0IGxhc3RIZWFsdGhQaWxsRWxlbWVudHNCcmVha2Rvd24gPSBsYXN0SGVhbHRoUGlsbERhdGEuc2xpY2UoMiwgOCk7CiAgICAgICAgY29uc3QgbmFuQ291bnQgPSBsYXN0SGVhbHRoUGlsbEVsZW1lbnRzQnJlYWtkb3duWzBdOwogICAgICAgIGNvbnN0IG5lZ0luZkNvdW50ID0gbGFzdEhlYWx0aFBpbGxFbGVtZW50c0JyZWFrZG93blsxXTsKICAgICAgICBjb25zdCBwb3NJbmZDb3VudCA9IGxhc3RIZWFsdGhQaWxsRWxlbWVudHNCcmVha2Rvd25bNV07CiAgICAgICAgbGV0IHRvdGFsQ291bnQgPSBsYXN0SGVhbHRoUGlsbERhdGFbMV07CiAgICAgICAgY29uc3QgbnVtZXJpY1N0YXRzID0gewogICAgICAgICAgICBtaW46IGxhc3RIZWFsdGhQaWxsRGF0YVs4XSwKICAgICAgICAgICAgbWF4OiBsYXN0SGVhbHRoUGlsbERhdGFbOV0sCiAgICAgICAgICAgIG1lYW46IGxhc3RIZWFsdGhQaWxsRGF0YVsxMF0sCiAgICAgICAgICAgIHN0ZGRldjogTWF0aC5zcXJ0KGxhc3RIZWFsdGhQaWxsRGF0YVsxMV0pLAogICAgICAgIH07CiAgICAgICAgaWYgKGhlYWx0aFBpbGxXaWR0aCA9PSBudWxsKSB7CiAgICAgICAgICAgIGhlYWx0aFBpbGxXaWR0aCA9IDYwOwogICAgICAgIH0KICAgICAgICBpZiAoaGVhbHRoUGlsbEhlaWdodCA9PSBudWxsKSB7CiAgICAgICAgICAgIGhlYWx0aFBpbGxIZWlnaHQgPSAxMDsKICAgICAgICB9CiAgICAgICAgaWYgKGhlYWx0aFBpbGxZT2Zmc2V0ID09IG51bGwpIHsKICAgICAgICAgICAgaGVhbHRoUGlsbFlPZmZzZXQgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZUluZm8gIT0gbnVsbCAmJiBub2RlSW5mby5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLk9QKSB7CiAgICAgICAgICAgIC8vIFVzZSBhIHNtYWxsZXIgaGVhbHRoIHBpbGwgZm9yIG9wIG5vZGVzIChyZW5kZXJlZCBhcyBzbWFsbGVyIGVsbGlwc2VzKS4KICAgICAgICAgICAgaGVhbHRoUGlsbFdpZHRoIC89IDI7CiAgICAgICAgICAgIGhlYWx0aFBpbGxIZWlnaHQgLz0gMjsKICAgICAgICB9CiAgICAgICAgbGV0IGhlYWx0aFBpbGxHcm91cCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCAnZycpOwogICAgICAgIGhlYWx0aFBpbGxHcm91cC5jbGFzc0xpc3QuYWRkKCdoZWFsdGgtcGlsbCcpOwogICAgICAgIC8vIERlZmluZSB0aGUgZ3JhZGllbnQgZm9yIHRoZSBoZWFsdGggcGlsbC4KICAgICAgICBsZXQgaGVhbHRoUGlsbERlZnMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgJ2RlZnMnKTsKICAgICAgICBoZWFsdGhQaWxsR3JvdXAuYXBwZW5kQ2hpbGQoaGVhbHRoUGlsbERlZnMpOwogICAgICAgIGxldCBoZWFsdGhQaWxsR3JhZGllbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgJ2xpbmVhckdyYWRpZW50Jyk7CiAgICAgICAgLy8gRXZlcnkgZWxlbWVudCBpbiBhIHdlYiBwYWdlIG11c3QgaGF2ZSBhIHVuaXF1ZSBJRC4KICAgICAgICBjb25zdCBoZWFsdGhQaWxsR3JhZGllbnRJZCA9ICdoZWFsdGgtcGlsbC1ncmFkaWVudC0nICsgaGVhbHRoUGlsbElkOwogICAgICAgIGhlYWx0aFBpbGxHcmFkaWVudC5zZXRBdHRyaWJ1dGUoJ2lkJywgaGVhbHRoUGlsbEdyYWRpZW50SWQpOwogICAgICAgIGxldCBjdW11bGF0aXZlQ291bnQgPSAwOwogICAgICAgIGxldCBwcmV2aW91c09mZnNldCA9ICcwJSc7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsYXN0SGVhbHRoUGlsbEVsZW1lbnRzQnJlYWtkb3duLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghbGFzdEhlYWx0aFBpbGxFbGVtZW50c0JyZWFrZG93bltpXSkgewogICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBlbXB0eSBjYXRlZ29yaWVzLgogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3VtdWxhdGl2ZUNvdW50ICs9IGxhc3RIZWFsdGhQaWxsRWxlbWVudHNCcmVha2Rvd25baV07CiAgICAgICAgICAgIC8vIENyZWF0ZSBhIGNvbG9yIGludGVydmFsIHVzaW5nIDIgc3RvcCBlbGVtZW50cy4KICAgICAgICAgICAgbGV0IHN0b3BFbGVtZW50MCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCAnc3RvcCcpOwogICAgICAgICAgICBzdG9wRWxlbWVudDAuc2V0QXR0cmlidXRlKCdvZmZzZXQnLCBwcmV2aW91c09mZnNldCk7CiAgICAgICAgICAgIHN0b3BFbGVtZW50MC5zZXRBdHRyaWJ1dGUoJ3N0b3AtY29sb3InLCBoZWFsdGhQaWxsRW50cmllc1tpXS5iYWNrZ3JvdW5kX2NvbG9yKTsKICAgICAgICAgICAgaGVhbHRoUGlsbEdyYWRpZW50LmFwcGVuZENoaWxkKHN0b3BFbGVtZW50MCk7CiAgICAgICAgICAgIGxldCBzdG9wRWxlbWVudDEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoU1ZHX05BTUVTUEFDRSwgJ3N0b3AnKTsKICAgICAgICAgICAgbGV0IHBlcmNlbnQgPSAoY3VtdWxhdGl2ZUNvdW50ICogMTAwKSAvIHRvdGFsQ291bnQgKyAnJSc7CiAgICAgICAgICAgIHN0b3BFbGVtZW50MS5zZXRBdHRyaWJ1dGUoJ29mZnNldCcsIHBlcmNlbnQpOwogICAgICAgICAgICBzdG9wRWxlbWVudDEuc2V0QXR0cmlidXRlKCdzdG9wLWNvbG9yJywgaGVhbHRoUGlsbEVudHJpZXNbaV0uYmFja2dyb3VuZF9jb2xvcik7CiAgICAgICAgICAgIGhlYWx0aFBpbGxHcmFkaWVudC5hcHBlbmRDaGlsZChzdG9wRWxlbWVudDEpOwogICAgICAgICAgICBwcmV2aW91c09mZnNldCA9IHBlcmNlbnQ7CiAgICAgICAgfQogICAgICAgIGhlYWx0aFBpbGxEZWZzLmFwcGVuZENoaWxkKGhlYWx0aFBpbGxHcmFkaWVudCk7CiAgICAgICAgLy8gQ3JlYXRlIHRoZSByZWN0YW5nbGUgZm9yIHRoZSBoZWFsdGggcGlsbC4KICAgICAgICBsZXQgcmVjdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCAncmVjdCcpOwogICAgICAgIHJlY3Quc2V0QXR0cmlidXRlKCdmaWxsJywgJ3VybCgjJyArIGhlYWx0aFBpbGxHcmFkaWVudElkICsgJyknKTsKICAgICAgICByZWN0LnNldEF0dHJpYnV0ZSgnd2lkdGgnLCBTdHJpbmcoaGVhbHRoUGlsbFdpZHRoKSk7CiAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsIFN0cmluZyhoZWFsdGhQaWxsSGVpZ2h0KSk7CiAgICAgICAgcmVjdC5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoaGVhbHRoUGlsbFlPZmZzZXQpKTsKICAgICAgICBoZWFsdGhQaWxsR3JvdXAuYXBwZW5kQ2hpbGQocmVjdCk7CiAgICAgICAgLy8gU2hvdyBhIHRpdGxlIHdpdGggc3BlY2lmaWMgY291bnRzIG9uIGhvdmVyLgogICAgICAgIGxldCB0aXRsZVN2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCAndGl0bGUnKTsKICAgICAgICB0aXRsZVN2Zy50ZXh0Q29udGVudCA9IF9nZXRIZWFsdGhQaWxsVGV4dENvbnRlbnQoaGVhbHRoUGlsbCwgdG90YWxDb3VudCwgbGFzdEhlYWx0aFBpbGxFbGVtZW50c0JyZWFrZG93biwgbnVtZXJpY1N0YXRzKTsKICAgICAgICBoZWFsdGhQaWxsR3JvdXAuYXBwZW5kQ2hpbGQodGl0bGVTdmcpOwogICAgICAgIC8vIENlbnRlciB0aGlzIGhlYWx0aCBwaWxsIGp1c3QgcmlnaHQgYWJvdmUgdGhlIG5vZGUgZm9yIHRoZSBvcC4KICAgICAgICBsZXQgc2hvdWxkUm91bmRPbmVzRGlnaXQgPSBmYWxzZTsKICAgICAgICBpZiAobm9kZUluZm8gIT0gbnVsbCkgewogICAgICAgICAgICBsZXQgaGVhbHRoUGlsbFggPSBub2RlSW5mby54IC0gaGVhbHRoUGlsbFdpZHRoIC8gMjsKICAgICAgICAgICAgbGV0IGhlYWx0aFBpbGxZID0gbm9kZUluZm8ueSAtIGhlYWx0aFBpbGxIZWlnaHQgLSBub2RlSW5mby5oZWlnaHQgLyAyIC0gMjsKICAgICAgICAgICAgaWYgKG5vZGVJbmZvLmxhYmVsT2Zmc2V0IDwgMCkgewogICAgICAgICAgICAgICAgLy8gVGhlIGxhYmVsIGlzIHBvc2l0aW9uZWQgYWJvdmUgdGhlIG5vZGUuIERvIG5vdCBvY2NsdWRlIHRoZSBsYWJlbC4KICAgICAgICAgICAgICAgIGhlYWx0aFBpbGxZICs9IG5vZGVJbmZvLmxhYmVsT2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGhlYWx0aFBpbGxHcm91cC5zZXRBdHRyaWJ1dGUoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoJyArIGhlYWx0aFBpbGxYICsgJywgJyArIGhlYWx0aFBpbGxZICsgJyknKTsKICAgICAgICAgICAgaWYgKGxhc3RIZWFsdGhQaWxsRWxlbWVudHNCcmVha2Rvd25bMl0gfHwKICAgICAgICAgICAgICAgIGxhc3RIZWFsdGhQaWxsRWxlbWVudHNCcmVha2Rvd25bM10gfHwKICAgICAgICAgICAgICAgIGxhc3RIZWFsdGhQaWxsRWxlbWVudHNCcmVha2Rvd25bNF0pIHsKICAgICAgICAgICAgICAgIC8vIEF0IGxlYXN0IDEgIm5vbi1JbmYgYW5kIG5vbi1OYU4iIHZhbHVlIGV4aXN0cyAoYSAtLCAwLCBvciArIHZhbHVlKS4gU2hvdwogICAgICAgICAgICAgICAgLy8gc3RhdHMgb24gdGVuc29yIHZhbHVlcy4KICAgICAgICAgICAgICAgIC8vIERldGVybWluZSBpZiB3ZSBzaG91bGQgZGlzcGxheSB0aGUgb3V0cHV0IHJhbmdlIGFzIGludGVnZXJzLgogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBub2RlSW5mby5ub2RlOwogICAgICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZXMgPSBub2RlLmF0dHI7CiAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlcyAmJiBhdHRyaWJ1dGVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGF0dHJpYnV0ZSBmb3Igb3V0cHV0IHR5cGUgaWYgdGhlcmUgaXMgb25lLgogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cmlidXRlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cmlidXRlc1tpXS5rZXkgPT09ICdUJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB3aGV0aGVyIHRoZSBvdXRwdXQgdHlwZSBpcyBhbiBpbnRlZ2VyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG91dHB1dFR5cGUgPSBhdHRyaWJ1dGVzW2ldLnZhbHVlWyd0eXBlJ107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG91bGRSb3VuZE9uZXNEaWdpdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VHlwZSAmJiAvXkRUXyhCT09MfElOVHxVSU5UKS8udGVzdChvdXRwdXRUeXBlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxldCBzdGF0c1N2ZyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCAndGV4dCcpOwogICAgICAgIGlmIChOdW1iZXIuaXNGaW5pdGUobnVtZXJpY1N0YXRzLm1pbikgJiYgTnVtYmVyLmlzRmluaXRlKG51bWVyaWNTdGF0cy5tYXgpKSB7CiAgICAgICAgICAgIGNvbnN0IG1pblN0cmluZyA9IGh1bWFuaXplSGVhbHRoUGlsbFN0YXQobnVtZXJpY1N0YXRzLm1pbiwgc2hvdWxkUm91bmRPbmVzRGlnaXQpOwogICAgICAgICAgICBjb25zdCBtYXhTdHJpbmcgPSBodW1hbml6ZUhlYWx0aFBpbGxTdGF0KG51bWVyaWNTdGF0cy5tYXgsIHNob3VsZFJvdW5kT25lc0RpZ2l0KTsKICAgICAgICAgICAgaWYgKHRvdGFsQ291bnQgPiAxKSB7CiAgICAgICAgICAgICAgICBzdGF0c1N2Zy50ZXh0Q29udGVudCA9IG1pblN0cmluZyArICcgfiAnICsgbWF4U3RyaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3RhdHNTdmcudGV4dENvbnRlbnQgPSBtaW5TdHJpbmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5hbkNvdW50ID4gMCB8fCBuZWdJbmZDb3VudCA+IDAgfHwgcG9zSW5mQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICBzdGF0c1N2Zy50ZXh0Q29udGVudCArPSAnICgnOwogICAgICAgICAgICAgICAgY29uc3QgYmFkVmFsdWVTdHJpbmdzID0gW107CiAgICAgICAgICAgICAgICBpZiAobmFuQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgYmFkVmFsdWVTdHJpbmdzLnB1c2goYE5hTsOXJHtuYW5Db3VudH1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZWdJbmZDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBiYWRWYWx1ZVN0cmluZ3MucHVzaChgLeKInsOXJHtuZWdJbmZDb3VudH1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwb3NJbmZDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgICAgICBiYWRWYWx1ZVN0cmluZ3MucHVzaChgK+KInsOXJHtwb3NJbmZDb3VudH1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRzU3ZnLnRleHRDb250ZW50ICs9IGJhZFZhbHVlU3RyaW5ncy5qb2luKCc7ICcpICsgJyknOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBzdGF0c1N2Zy50ZXh0Q29udGVudCA9ICcoTm8gZmluaXRlIGVsZW1lbnRzKSc7CiAgICAgICAgfQogICAgICAgIHN0YXRzU3ZnLmNsYXNzTGlzdC5hZGQoJ2hlYWx0aC1waWxsLXN0YXRzJyk7CiAgICAgICAgaWYgKHRleHRYT2Zmc2V0ID09IG51bGwpIHsKICAgICAgICAgICAgdGV4dFhPZmZzZXQgPSBoZWFsdGhQaWxsV2lkdGggLyAyOwogICAgICAgIH0KICAgICAgICBzdGF0c1N2Zy5zZXRBdHRyaWJ1dGUoJ3gnLCBTdHJpbmcodGV4dFhPZmZzZXQpKTsKICAgICAgICBzdGF0c1N2Zy5zZXRBdHRyaWJ1dGUoJ3knLCBTdHJpbmcoaGVhbHRoUGlsbFlPZmZzZXQgLSAyKSk7CiAgICAgICAgaGVhbHRoUGlsbEdyb3VwLmFwcGVuZENoaWxkKHN0YXRzU3ZnKTsKICAgICAgICBkb20obm9kZUdyb3VwRWxlbWVudC5wYXJlbnROb2RlKS5hcHBlbmRDaGlsZChoZWFsdGhQaWxsR3JvdXApOwogICAgfQogICAgLyoqCiAgICAgKiBBZGRzIGhlYWx0aCBwaWxscyAod2hpY2ggdmlzdWFsaXplIHRlbnNvciBzdW1tYXJpZXMpIHRvIGEgZ3JhcGggZ3JvdXAuCiAgICAgKiBAcGFyYW0gc3ZnUm9vdCBUaGUgcm9vdCBTVkcgZWxlbWVudCBvZiB0aGUgZ3JhcGggdG8gYWRkIGhlYXRoIHBpbGxzIHRvLgogICAgICogQHBhcmFtIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMgQW4gb2JqZWN0IG1hcHBpbmcgbm9kZSBuYW1lIHRvIGhlYWx0aCBwaWxsLgogICAgICogQHBhcmFtIGNvbG9ycyBBIGxpc3Qgb2YgY29sb3JzIHRvIHVzZS4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkSGVhbHRoUGlsbHMoc3ZnUm9vdCwgbm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCkgewogICAgICAgIGlmICghbm9kZU5hbWVzVG9IZWFsdGhQaWxscykgewogICAgICAgICAgICAvLyBObyBoZWFsdGggcGlsbCBpbmZvcm1hdGlvbiBhdmFpbGFibGUuCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gV2UgZ2VuZXJhdGUgYSB1bmlxdWUgSUQgZm9yIGVhY2ggaGVhbHRoIHBpbGwgYmVjYXVzZSB0aGUgSUQgb2YgZWFjaCBlbGVtZW50CiAgICAgICAgLy8gaW4gYSB3ZWIgcGFnZSBtdXN0IGJlIHVuaXF1ZSwgYW5kIGVhY2ggaGVhbHRoIHBpbGwgZ2VuZXJhdGVzIGEgZ3JhZGllbnQKICAgICAgICAvLyB0aGF0IGl0cyBjb2RlIGxhdGVyIHJlZmVycyB0by4KICAgICAgICBsZXQgaGVhbHRoUGlsbElkID0gMTsKICAgICAgICBsZXQgc3ZnUm9vdFNlbGVjdGlvbiA9IHNlbGVjdChzdmdSb290KTsKICAgICAgICBzdmdSb290U2VsZWN0aW9uCiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ2cubm9kZXNoYXBlJykKICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKG5vZGVJbmZvKSB7CiAgICAgICAgICAgIC8vIE9ubHkgc2hvdyBoZWFsdGggcGlsbCBkYXRhIGZvciB0aGlzIG5vZGUgaWYgaXQgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICBjb25zdCBoZWFsdGhQaWxscyA9IG5vZGVOYW1lc1RvSGVhbHRoUGlsbHNbbm9kZUluZm8ubm9kZS5uYW1lXTsKICAgICAgICAgICAgY29uc3QgaGVhbHRoUGlsbCA9IGhlYWx0aFBpbGxzID8gaGVhbHRoUGlsbHNbaGVhbHRoUGlsbFN0ZXBJbmRleF0gOiBudWxsOwogICAgICAgICAgICBhZGRIZWFsdGhQaWxsKHRoaXMsIGhlYWx0aFBpbGwsIG5vZGVJbmZvLCBoZWFsdGhQaWxsSWQrKyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZHcmFwaERlYnVnZ2VyRGF0YUNhcmQgPSBjbGFzcyBUZkdyYXBoRGVidWdnZXJEYXRhQ2FyZCBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvLyBPbmx5IHJlbGV2YW50IGlmIHdlIGFyZSBpbiBhbGwgc3RlcHMgbW9kZSwgaW4gd2hpY2ggY2FzZSB0aGUgdXNlciBtYXkgd2FudCB0byB2aWV3IGhlYWx0aAogICAgICAgICAgICAvLyBwaWxscyBmb3IgYSBzcGVjaWZpYyBzdGVwLgogICAgICAgICAgICB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAgPSAwOwogICAgICAgICAgICB0aGlzLmhlYWx0aFBpbGxFbnRyaWVzID0gaGVhbHRoUGlsbEVudHJpZXM7CiAgICAgICAgfQogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgICB2YXIgbWFpbkNvbnRhaW5lciA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdtYWluQ29udGFpbmVyJyk7CiAgICAgICAgICAgIHZhciBzY3JvbGxiYXJDb250YWluZXIgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0Zi1kYXNoYm9hcmQtbGF5b3V0IC5zY3JvbGxiYXInKTsKICAgICAgICAgICAgaWYgKG1haW5Db250YWluZXIgJiYgc2Nyb2xsYmFyQ29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGlzIGNvbXBvbmVudCBpcyBiZWluZyB1c2VkIGluc2lkZSBvZiBUZW5zb3JCb2FyZCdzIGRhc2hib2FyZCBsYXlvdXQsIGl0IG1heSBlYXNpbHkKICAgICAgICAgICAgICAgIC8vIGNhdXNlIHRoZSBkYXNoYm9hcmQgbGF5b3V0IGVsZW1lbnQgdG8gb3ZlcmZsb3csIGdpdmluZyB0aGUgdXNlciAyIHNjcm9sbCBiYXJzLiBQcmV2ZW50CiAgICAgICAgICAgICAgICAvLyB0aGF0IGJ5IGhpZGluZyB3aGF0ZXZlciBjb250ZW50IG92ZXJmbG93cyAtIHRoZSB1c2VyIHdpbGwgaGF2ZSB0byBleHBhbmQgdGhlIHZpZXdwb3J0IHRvCiAgICAgICAgICAgICAgICAvLyB1c2UgdGhpcyBkZWJ1Z2dpbmcgY2FyZC4KICAgICAgICAgICAgICAgIG1haW5Db250YWluZXIuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgICAgICAgICAgICAgIHNjcm9sbGJhckNvbnRhaW5lci5zdHlsZS5vdmVyZmxvdyA9ICdoaWRkZW4nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9oZWFsdGhQaWxsc0F2YWlsYWJsZShkZWJ1Z2dlckRhdGFFbmFibGVkLCBub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSB7CiAgICAgICAgICAgIC8vIFNvIGxvbmcgYXMgdGhlcmUgaXMgYSBtYXBwaW5nIChldmVuIGlmIGVtcHR5KSBmcm9tIG5vZGUgbmFtZSB0byBoZWFsdGggcGlsbHMsIHNob3cgdGhlCiAgICAgICAgICAgIC8vIGxlZ2VuZCBhbmQgc2xpZGVyLiBXZSBkbyB0aGF0IGJlY2F1c2UsIGV2ZW4gaWYgbm8gaGVhbHRoIHBpbGxzIGV4aXN0IGF0IHRoZSBjdXJyZW50IHN0ZXAsCiAgICAgICAgICAgIC8vIHRoZSB1c2VyIG1heSBkZXNpcmUgdG8gY2hhbmdlIHN0ZXBzLCBhbmQgdGhlIHNsaWRlciBtdXN0IHNob3cgZm9yIHRoZSB1c2VyIHRvIGRvIHRoYXQuCiAgICAgICAgICAgIHJldHVybiBkZWJ1Z2dlckRhdGFFbmFibGVkICYmIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHM7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlVGVuc29yQ291bnRTdHJpbmcoaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZSwgdmFsdWVJbmRleCkgewogICAgICAgICAgICBpZiAoIWhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUpIHsKICAgICAgICAgICAgICAgIC8vIE5vIGhlYWx0aCBwaWxsIGRhdGEgaXMgYXZhaWxhYmxlLgogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlW3ZhbHVlSW5kZXhdLnRvRml4ZWQoMCk7CiAgICAgICAgfQogICAgICAgIGdldCBoZWFsdGhQaWxsVmFsdWVzRm9yU2VsZWN0ZWROb2RlKCkgewogICAgICAgICAgICB2YXIgbm9kZU5hbWVzVG9IZWFsdGhQaWxscyA9IHRoaXMubm9kZU5hbWVzVG9IZWFsdGhQaWxsczsKICAgICAgICAgICAgdmFyIGhlYWx0aFBpbGxTdGVwSW5kZXggPSB0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXg7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZTsKICAgICAgICAgICAgdmFyIGFsbFN0ZXBzTW9kZUVuYWJsZWQgPSB0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQ7CiAgICAgICAgICAgIHZhciBhcmVIZWFsdGhQaWxsc0xvYWRpbmcgPSB0aGlzLmFyZUhlYWx0aFBpbGxzTG9hZGluZzsKICAgICAgICAgICAgaWYgKGFyZUhlYWx0aFBpbGxzTG9hZGluZykgewogICAgICAgICAgICAgICAgLy8gSGVhbHRoIHBpbGxzIGFyZSBsb2FkaW5nLiBEbyBub3QgcmVuZGVyIGRhdGEgdGhhdCBpcyBvdXQgb2YgZGF0ZS4KICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghc2VsZWN0ZWROb2RlKSB7CiAgICAgICAgICAgICAgICAvLyBObyBub2RlIGlzIHNlbGVjdGVkLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaGVhbHRoUGlsbHMgPSBub2RlTmFtZXNUb0hlYWx0aFBpbGxzW3NlbGVjdGVkTm9kZV07CiAgICAgICAgICAgIGlmICghaGVhbHRoUGlsbHMpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgbm9kZSBsYWNrcyBhIGhlYWx0aCBwaWxsLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgYWxsIHN0ZXBzIG1vZGUgaXMgZW5hYmxlZCwgd2UgdXNlIHRoZSBmaXJzdCBoZWFsdGggcGlsbCBpbiB0aGUgbGlzdCBiZWNhdXNlIHRoZSBKU09OCiAgICAgICAgICAgIC8vIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBpcyBhIG1hcHBpbmcgYmV0d2VlbiBub2RlIG5hbWUgYW5kIGEgbGlzdCBvZiAxIGhlYWx0aCBwaWxsLgogICAgICAgICAgICBjb25zdCBoZWFsdGhQaWxsID0gaGVhbHRoUGlsbHNbYWxsU3RlcHNNb2RlRW5hYmxlZCA/IDAgOiBoZWFsdGhQaWxsU3RlcEluZGV4XTsKICAgICAgICAgICAgaWYgKCFoZWFsdGhQaWxsKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIG5vZGUgbGFja3MgYSBoZWFsdGggcGlsbCBhdCB0aGUgY3VycmVudCBzdGVwLgogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIGhlYWx0aCBwaWxsIGNvdW50IHZhbHVlcyBzdGFydCBhdCAyLiBFYWNoIGhlYWx0aCBwaWxsIGNvbnRhaW5zIDYgdmFsdWVzLgogICAgICAgICAgICByZXR1cm4gaGVhbHRoUGlsbC52YWx1ZS5zbGljZSgyLCA4KTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jdXJyZW50U3RlcERpc3BsYXlWYWx1ZSgpIHsKICAgICAgICAgICAgdmFyIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMgPSB0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHM7CiAgICAgICAgICAgIHZhciBoZWFsdGhQaWxsU3RlcEluZGV4ID0gdGhpcy5oZWFsdGhQaWxsU3RlcEluZGV4OwogICAgICAgICAgICB2YXIgYWxsU3RlcHNNb2RlRW5hYmxlZCA9IHRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZDsKICAgICAgICAgICAgdmFyIHNwZWNpZmljSGVhbHRoUGlsbFN0ZXAgPSB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXA7CiAgICAgICAgICAgIHZhciBhcmVIZWFsdGhQaWxsc0xvYWRpbmcgPSB0aGlzLmFyZUhlYWx0aFBpbGxzTG9hZGluZzsKICAgICAgICAgICAgaWYgKGFsbFN0ZXBzTW9kZUVuYWJsZWQpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIHNlZWtzIGhlYWx0aCBwaWxscyBmb3Igc3BlY2lmaWMgc3RlcCBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgICAgICByZXR1cm4gc3BlY2lmaWNIZWFsdGhQaWxsU3RlcC50b0ZpeGVkKDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhcmVIZWFsdGhQaWxsc0xvYWRpbmcpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IHN0ZXAgaXMgdW5kZWZpbmVkLgogICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgbm9kZU5hbWUgaW4gbm9kZU5hbWVzVG9IZWFsdGhQaWxscykgewogICAgICAgICAgICAgICAgLy8gQWxsIG5vZGVzIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIHN0ZXBzIHN0b3JlZCwgc28gb25seSBleGFtaW5lIDEgbm9kZS4gV2UgY2Fubm90CiAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBpbmRleCBpbnRvIHRoZSBub2RlTmFtZXNUb0hlYWx0aFBpbGxzIG9iamVjdCBiZWNhdXNlIHdlIGRvIG5vdCBoYXZlIGEga2V5LgogICAgICAgICAgICAgICAgLy8gSWYgYWxsIHN0ZXBzIG1vZGUgaXMgZW5hYmxlZCwgd2Ugb25seSBoYXZlIDEgc3RlcCB0byBzaG93LgogICAgICAgICAgICAgICAgcmV0dXJuIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHNbbm9kZU5hbWVdW2hlYWx0aFBpbGxTdGVwSW5kZXhdLnN0ZXAudG9GaXhlZCgwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgY3VycmVudCBzdGVwIGNvdWxkIG5vdCBiZSBjb21wdXRlZC4KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBiaWdnZXN0IHN0ZXAgdmFsdWUgZXZlciBzZWVuLiBVc2VkIHRvIGRldGVybWluZSB3aGF0IHN0ZXBzIG9mIGhlYWx0aCBwaWxscyB0byBsZXQgdGhlCiAgICAgICAgLy8gdXNlciBmZXRjaCBpbiBhbGwgc3RlcHMgbW9kZS4KICAgICAgICBnZXQgX2JpZ2dlc3RTdGVwRXZlclNlZW4oKSB7CiAgICAgICAgICAgIHZhciBub2RlTmFtZXNUb0hlYWx0aFBpbGxzID0gdGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOwogICAgICAgICAgICBmb3IgKGxldCBub2RlTmFtZSBpbiBub2RlTmFtZXNUb0hlYWx0aFBpbGxzKSB7CiAgICAgICAgICAgICAgICAvLyBBbGwgbm9kZXMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygc3RlcHMgc3RvcmVkLCBzbyBvbmx5IGV4YW1pbmUgMSBub2RlLgogICAgICAgICAgICAgICAgLy8gVGhlIGluZGV4IGlzIDEgbGVzcyB0aGFuIHRoZSBjb3VudC4gVGVuc29yYm9hcmQgYmFja2VuZCBsb2dpYyBndWFyYW50ZWVzIHRoYXQgdGhlIGxlbmd0aAogICAgICAgICAgICAgICAgLy8gb2YgdGhlIGFycmF5IHdpbGwgYmUgZ3JlYXRlciB0aGFuIDEuCiAgICAgICAgICAgICAgICB2YXIgaGVhbHRoUGlsbHMgPSBub2RlTmFtZXNUb0hlYWx0aFBpbGxzW25vZGVOYW1lXTsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCh0aGlzLl9iaWdnZXN0U3RlcEV2ZXJTZWVuLCBoZWFsdGhQaWxsc1toZWFsdGhQaWxscy5sZW5ndGggLSAxXS5zdGVwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBObyBzdGVwcyBzZWVuIHNvIGZhci4gRGVmYXVsdCB0byAwLgogICAgICAgICAgICByZXR1cm4gdGhpcy5fYmlnZ2VzdFN0ZXBFdmVyU2VlbiB8fCAwOwogICAgICAgIH0KICAgICAgICBnZXQgX21heFN0ZXBJbmRleCgpIHsKICAgICAgICAgICAgdmFyIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMgPSB0aGlzLm5vZGVOYW1lc1RvSGVhbHRoUGlsbHM7CiAgICAgICAgICAgIGZvciAobGV0IG5vZGVOYW1lIGluIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpIHsKICAgICAgICAgICAgICAgIC8vIEFsbCBub2RlcyBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBzdGVwcyBzdG9yZWQsIHNvIG9ubHkgZXhhbWluZSAxIG5vZGUuCiAgICAgICAgICAgICAgICAvLyBUaGUgaW5kZXggaXMgMSBsZXNzIHRoYW4gdGhlIGNvdW50LiBUZW5zb3Jib2FyZCBiYWNrZW5kIGxvZ2ljIGd1YXJhbnRlZXMgdGhhdCB0aGUgbGVuZ3RoCiAgICAgICAgICAgICAgICAvLyBvZiB0aGUgYXJyYXkgd2lsbCBiZSBncmVhdGVyIHRoYW4gMS4KICAgICAgICAgICAgICAgIHJldHVybiBub2RlTmFtZXNUb0hlYWx0aFBpbGxzW25vZGVOYW1lXS5sZW5ndGggLSAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJldHVybiBhIGZhbHN5IHZhbHVlLiBUaGUgc2xpZGVyIHNob3VsZCBiZSBoaWRkZW4uCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cykgewogICAgICAgICAgICByZXR1cm4gZGVidWdnZXJOdW1lcmljQWxlcnRzICYmIGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVBbGVydHNMaXN0KCkgewogICAgICAgICAgICB2YXIgZGVidWdnZXJOdW1lcmljQWxlcnRzID0gdGhpcy5kZWJ1Z2dlck51bWVyaWNBbGVydHM7CiAgICAgICAgICAgIHZhciBhbGVydEJvZHkgPSB0aGlzLiQkKCcjbnVtZXJpYy1hbGVydHMtYm9keScpOwogICAgICAgICAgICBpZiAoIWFsZXJ0Qm9keSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFsZXJ0Qm9keS5pbm5lclRleHQgPSAnJzsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWJ1Z2dlck51bWVyaWNBbGVydHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciBhbGVydCA9IGRlYnVnZ2VyTnVtZXJpY0FsZXJ0c1tpXTsKICAgICAgICAgICAgICAgIHZhciB0YWJsZVJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICAgICAgICAgICAgICB2YXIgdGltZXN0YW1wVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgICAgICAgICAgICAgdGltZXN0YW1wVGQuaW5uZXJUZXh0ID0gY29tcHV0ZUh1bWFuRnJpZW5kbHlUaW1lKGFsZXJ0LmZpcnN0X3RpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICB0aW1lc3RhbXBUZC5jbGFzc0xpc3QuYWRkKCdmaXJzdC1vZmZlbnNlLXRkJyk7CiAgICAgICAgICAgICAgICB0YWJsZVJvdy5hcHBlbmRDaGlsZCh0aW1lc3RhbXBUZCk7CiAgICAgICAgICAgICAgICB2YXIgdGVuc29yRGV2aWNlVGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZCcpOwogICAgICAgICAgICAgICAgdGVuc29yRGV2aWNlVGQuY2xhc3NMaXN0LmFkZCgndGVuc29yLWRldmljZS10ZCcpOwogICAgICAgICAgICAgICAgdmFyIHRlbnNvclNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIHRlbnNvclNlY3Rpb24uY2xhc3NMaXN0LmFkZCgndGVuc29yLXNlY3Rpb24td2l0aGluLXRhYmxlJyk7CiAgICAgICAgICAgICAgICB0ZW5zb3JTZWN0aW9uLmlubmVyVGV4dCA9IGFsZXJ0LnRlbnNvcl9uYW1lOwogICAgICAgICAgICAgICAgdGhpcy5fYWRkT3BFeHBhbnNpb25MaXN0ZW5lcih0ZW5zb3JTZWN0aW9uLCBhbGVydC50ZW5zb3JfbmFtZSk7CiAgICAgICAgICAgICAgICB0ZW5zb3JEZXZpY2VUZC5hcHBlbmRDaGlsZCh0ZW5zb3JTZWN0aW9uKTsKICAgICAgICAgICAgICAgIHZhciBkZXZpY2VTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBkZXZpY2VTZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ2RldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZScpOwogICAgICAgICAgICAgICAgZGV2aWNlU2VjdGlvbi5pbm5lclRleHQgPSAnKCcgKyBhbGVydC5kZXZpY2VfbmFtZSArICcpJzsKICAgICAgICAgICAgICAgIHRlbnNvckRldmljZVRkLmFwcGVuZENoaWxkKGRldmljZVNlY3Rpb24pOwogICAgICAgICAgICAgICAgdGFibGVSb3cuYXBwZW5kQ2hpbGQodGVuc29yRGV2aWNlVGQpOwogICAgICAgICAgICAgICAgdmFyIG1pbmlIZWFsdGhQaWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBtaW5pSGVhbHRoUGlsbC5jbGFzc0xpc3QuYWRkKCdtaW5pLWhlYWx0aC1waWxsJyk7CiAgICAgICAgICAgICAgICB2YXIgbWluaUhlYWx0aFBpbGxUZCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RkJyk7CiAgICAgICAgICAgICAgICBtaW5pSGVhbHRoUGlsbFRkLmNsYXNzTGlzdC5hZGQoJ21pbmktaGVhbHRoLXBpbGwtdGQnKTsKICAgICAgICAgICAgICAgIG1pbmlIZWFsdGhQaWxsVGQuYXBwZW5kQ2hpbGQobWluaUhlYWx0aFBpbGwpOwogICAgICAgICAgICAgICAgdGFibGVSb3cuYXBwZW5kQ2hpbGQobWluaUhlYWx0aFBpbGxUZCk7CiAgICAgICAgICAgICAgICBpZiAoYWxlcnQubmVnX2luZl9ldmVudF9jb3VudCkgewogICAgICAgICAgICAgICAgICAgIHZhciBuZWdhdGl2ZUluZkNvdW50U2VjdGlvbiA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlSW5mQ291bnRTZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ25lZ2F0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZUluZkNvdW50U2VjdGlvbi5pbm5lclRleHQgPSBhbGVydC5uZWdfaW5mX2V2ZW50X2NvdW50OwogICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlSW5mQ291bnRTZWN0aW9uLnNldEF0dHJpYnV0ZSgndGl0bGUnLCBhbGVydC5uZWdfaW5mX2V2ZW50X2NvdW50ICsgJyBldmVudHMgd2l0aCAtXHUyMjFFJyk7CiAgICAgICAgICAgICAgICAgICAgbWluaUhlYWx0aFBpbGwuYXBwZW5kQ2hpbGQobmVnYXRpdmVJbmZDb3VudFNlY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFsZXJ0LnBvc19pbmZfZXZlbnRfY291bnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcG9zaXRpdmVJbmZDb3VudFNlY3Rpb24gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZUluZkNvdW50U2VjdGlvbi5jbGFzc0xpc3QuYWRkKCdwb3NpdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVJbmZDb3VudFNlY3Rpb24uaW5uZXJUZXh0ID0gYWxlcnQucG9zX2luZl9ldmVudF9jb3VudDsKICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZUluZkNvdW50U2VjdGlvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgYWxlcnQucG9zX2luZl9ldmVudF9jb3VudCArICcgZXZlbnRzIHdpdGggK1x1MjIxRScpOwogICAgICAgICAgICAgICAgICAgIG1pbmlIZWFsdGhQaWxsLmFwcGVuZENoaWxkKHBvc2l0aXZlSW5mQ291bnRTZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhbGVydC5uYW5fZXZlbnRfY291bnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFuQ291bnRTZWN0aW9uID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICAgICAgbmFuQ291bnRTZWN0aW9uLmNsYXNzTGlzdC5hZGQoJ25hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24nKTsKICAgICAgICAgICAgICAgICAgICBuYW5Db3VudFNlY3Rpb24uaW5uZXJUZXh0ID0gYWxlcnQubmFuX2V2ZW50X2NvdW50OwogICAgICAgICAgICAgICAgICAgIG5hbkNvdW50U2VjdGlvbi5zZXRBdHRyaWJ1dGUoJ3RpdGxlJywgYWxlcnQubmFuX2V2ZW50X2NvdW50ICsgJyBldmVudHMgd2l0aCBOYU4nKTsKICAgICAgICAgICAgICAgICAgICBtaW5pSGVhbHRoUGlsbC5hcHBlbmRDaGlsZChuYW5Db3VudFNlY3Rpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZG9tKGFsZXJ0Qm9keSkuYXBwZW5kQ2hpbGQodGFibGVSb3cpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIEFkZHMgYSBsaXN0ZW5lciB0byBhbiBlbGVtZW50LCBzbyB0aGF0IHdoZW4gdGhhdCBlbGVtZW50IGlzIGNsaWNrZWQsIHRoZSB0ZW5zb3Igd2l0aAogICAgICAgIC8vIHRlbnNvck5hbWUgZXhwYW5kcy4KICAgICAgICBfYWRkT3BFeHBhbnNpb25MaXN0ZW5lcihjbGlja2FibGVFbGVtZW50LCB0ZW5zb3JOYW1lKSB7CiAgICAgICAgICAgIGNsaWNrYWJsZUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSB1c2VyIGNsaWNrcyBvbiBhIHRlbnNvciBuYW1lLCBleHBhbmQgYWxsIG5vZGVzIHVudGlsIHRoZSB1c2VyIGNhbiBzZWUgdGhlCiAgICAgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIG5vZGUuCiAgICAgICAgICAgICAgICB2YXIgbmFtZU9mTm9kZVRvU2VsZWN0ID0gZXhwYW5kVW50aWxOb2RlSXNTaG93bihkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnc2NlbmUnKSwgdGhpcy5yZW5kZXJIaWVyYXJjaHksIHRlbnNvck5hbWUpOwogICAgICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgc2Nyb2xsIG9mIHRoZSBncmFwaCBpbmZvIGNhcmQuIE5vZGUgc2VsZWN0aW9uIGFsdGVycyB0aGF0IHNjcm9sbCwgYW5kCiAgICAgICAgICAgICAgICAvLyB3ZSByZXN0b3JlIHRoZSBzY3JvbGwgbGF0ZXIuCiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNTY3JvbGxGcm9tQm90dG9tOwogICAgICAgICAgICAgICAgdmFyIGdyYXBoSW5mb0NhcmQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCd0Zi1ncmFwaC1pbmZvI2dyYXBoLWluZm8nKTsKICAgICAgICAgICAgICAgIGlmIChncmFwaEluZm9DYXJkKSB7CiAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNTY3JvbGxGcm9tQm90dG9tID0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhJbmZvQ2FyZC5zY3JvbGxIZWlnaHQgLSBncmFwaEluZm9DYXJkLnNjcm9sbFRvcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc2VsZWN0ZWQgbm9kZSB3aXRoaW4gZ3JhcGggbG9naWMuCiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNTZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdzZWxlY3RlZE5vZGUnLCBuYW1lT2ZOb2RlVG9TZWxlY3QpOwogICAgICAgICAgICAgICAgLy8gU2Nyb2xsIHRoZSBncmFwaCBpbmZvIGNhcmQgYmFjayBkb3duIGlmIG5lY2Vzc2FyeSBzbyB0aGF0IHVzZXIgY2FuIHNlZSB0aGUgYWxlcnRzIHNlY3Rpb24KICAgICAgICAgICAgICAgIC8vIGFnYWluLiBTZWxlY3RpbmcgdGhlIG5vZGUgY2F1c2VzIHRoZSBpbmZvIGNhcmQgdG8gc2Nyb2xsIHRvIHRoZSB0b3AsIHdoaWNoIG1heSBtZWFuIHRoZQogICAgICAgICAgICAgICAgLy8gdXNlciBubyBsb25nZXIgc2VlcyB0aGUgbGlzdCBvZiBhbGVydHMuCiAgICAgICAgICAgICAgICB2YXIgc2Nyb2xsVG9PcmlnaW5hbExvY2F0aW9uID0gKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGdyYXBoSW5mb0NhcmQuc2Nyb2xsVG9wID0KICAgICAgICAgICAgICAgICAgICAgICAgZ3JhcGhJbmZvQ2FyZC5zY3JvbGxIZWlnaHQgLSBwcmV2aW91c1Njcm9sbEZyb21Cb3R0b207CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKGdyYXBoSW5mb0NhcmQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNvbXBvbmVudCBpcyB1c2VkIHdpdGhpbiBhbiBpbmZvIGNhcmQuIFJlc3RvcmUgdGhlIG9yaWdpbmFsIHNjcm9sbC4KICAgICAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNTZWxlY3RlZE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGNhcmQgZm9yIHRoZSBzZWxlY3RlZCBub2RlIGhhcyBhbHJlYWR5IG9wZW5lZC4gSW1tZWRpYXRlbHkgcmVzdG9yZSB0aGUgc2Nyb2xsLgogICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb09yaWdpbmFsTG9jYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgRE9NIG9mIHRoZSBpbmZvIGNhcmQgdG8gYmUgY3JlYXRlZCBiZWZvcmUgc2Nyb2xsaW5nIGRvd24uCiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KHNjcm9sbFRvT3JpZ2luYWxMb2NhdGlvbiwgMjApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfTsKICAgIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LXNpemU6IDEycHg7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1sZWdlbmQgewogICAgICAgIHBhZGRpbmc6IDE1cHg7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1sZWdlbmQgaDIgewogICAgICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDEwcHggMTBweCAwOwogICAgICB9CgogICAgICAuaGVhbHRoLXBpbGwtZW50cnkgLmNvbG9yLXByZXZpZXcgewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIG1hcmdpbjogMCAxMHB4IDAgMDsKICAgICAgfQoKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC5jb2xvci1sYWJlbCwKICAgICAgLmhlYWx0aC1waWxsLWVudHJ5IC50ZW5zb3ItY291bnQgewogICAgICAgIGNvbG9yOiAjNzc3OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDI2cHg7CiAgICAgICAgZm9udC1zaXplOiAyMnB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAyNnB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgIC5oZWFsdGgtcGlsbC1lbnRyeSAudGVuc29yLWNvdW50IHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KCiAgICAgICNoZWFsdGgtcGlsbC1zdGVwLXNsaWRlciB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAtMTVweDsKICAgICAgICAvKiAzMSBjb21lcyBmcm9tIGFkZGluZyBhIHBhZGRpbmcgb2YgMTVweCBmcm9tIGJvdGggc2lkZXMgb2YgdGhlIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcKICAgKiAxcHggc28gdGhhdCB0aGUgc2xpZGVyIHdpZHRoIGFsaWducyB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLAogICAqIGFuZCBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mIHRoZSBpbWFnZS4gMzAgLSAxICsgMi4KICAgKiBBcHBhcmVudGx5LCB0aGUgcGFwZXItc2xpZGVyIGxhY2tzIGEgbWl4aW4gZm9yIHRob3NlIHBhZGRpbmcgdmFsdWVzLiAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgfQoKICAgICAgI2hlYWx0aC1waWxscy1sb2FkaW5nLXNwaW5uZXIgewogICAgICAgIHdpZHRoOiAyMHB4OwogICAgICAgIGhlaWdodDogMjBweDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjaGVhbHRoLXBpbGwtc3RlcC1udW1iZXItaW5wdXQgewogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogdG9wOwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUtY29udGFpbmVyIHsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy14OiBoaWRkZW47CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQoKICAgICAgI251bWVyaWMtYWxlcnRzLXRhYmxlIHsKICAgICAgICB0ZXh0LWFsaWduOiBsZWZ0OwogICAgICB9CgogICAgICAjbnVtZXJpYy1hbGVydHMtdGFibGUgdGQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KCiAgICAgICNudW1lcmljLWFsZXJ0cy10YWJsZSAuZmlyc3Qtb2ZmZW5zZS10ZCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CgogICAgICAuZmlyc3Qtb2ZmZW5zZS10ZCB7CiAgICAgICAgd2lkdGg6IDgwcHg7CiAgICAgIH0KCiAgICAgIC50ZW5zb3ItZGV2aWNlLXRkIHsKICAgICAgICBtYXgtd2lkdGg6IDE0MHB4OwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgfQoKICAgICAgLnRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZSB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICAgIG9wYWNpdHk6IDAuODsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLnRlbnNvci1zZWN0aW9uLXdpdGhpbi10YWJsZTpob3ZlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLmRldmljZS1zZWN0aW9uLXdpdGhpbi10YWJsZSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC5taW5pLWhlYWx0aC1waWxsIHsKICAgICAgICB3aWR0aDogMTMwcHg7CiAgICAgIH0KCiAgICAgIC5taW5pLWhlYWx0aC1waWxsID4gZGl2IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDYwcHg7CiAgICAgICAgYm9yZGVyLXJhZGl1czogM3B4OwogICAgICB9CgogICAgICAjZXZlbnQtY291bnRzLXRoIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAxMHB4OwogICAgICB9CgogICAgICAubmVnYXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiB7CiAgICAgICAgYmFja2dyb3VuZDogcmdiKDI1NSwgMTQxLCAwKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLnBvc2l0aXZlLWluZi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigwLCA2MiwgMjEyKTsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGJhY2tncm91bmQ6IHJnYigyMDQsIDQ3LCA0NCk7CiAgICAgICAgd2lkdGg6IDIwcHg7CiAgICAgIH0KCiAgICAgIC5uZWdhdGl2ZS1pbmYtbWluaS1oZWFsdGgtcGlsbC1zZWN0aW9uLAogICAgICAucG9zaXRpdmUtaW5mLW1pbmktaGVhbHRoLXBpbGwtc2VjdGlvbiwKICAgICAgLm5hbi1taW5pLWhlYWx0aC1waWxsLXNlY3Rpb24gewogICAgICAgIGNvbG9yOiAjZmZmOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgbGluZS1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luOiAwIDAgMCAxMHB4OwogICAgICAgIHRleHQtYWxpZ246IGNlbnRlcjsKICAgICAgfQoKICAgICAgLm5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiB7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQgaGVhbHRoLXBpbGwtbGVnZW5kIj4KICAgICAgPGRpdiBjbGFzcz0idGl0bGUiPgogICAgICAgIEVuYWJsZSBhbGwgKG5vdCBqdXN0IHNhbXBsZWQpIHN0ZXBzLiBSZXF1aXJlcyBzbG93IGRpc2sgcmVhZC4KICAgICAgPC9kaXY+CiAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uCiAgICAgICAgaWQ9ImVuYWJsZUFsbFN0ZXBzTW9kZVRvZ2dsZSIKICAgICAgICBjaGVja2VkPSJ7e2FsbFN0ZXBzTW9kZUVuYWJsZWR9fSIKICAgICAgPgogICAgICA8L3BhcGVyLXRvZ2dsZS1idXR0b24+CiAgICAgIDxoMj4KICAgICAgICBTdGVwIG9mIEhlYWx0aCBQaWxsczoKICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICAgIDxpbnB1dAogICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgIGlkPSJoZWFsdGgtcGlsbC1zdGVwLW51bWJlci1pbnB1dCIKICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICBtYXg9IltbX2JpZ2dlc3RTdGVwRXZlclNlZW5dXSIKICAgICAgICAgICAgdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcDo6aW5wdXR9fSIKICAgICAgICAgIC8+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIWFsbFN0ZXBzTW9kZUVuYWJsZWRdXSI+CiAgICAgICAgICBbW19jdXJyZW50U3RlcERpc3BsYXlWYWx1ZV1dCiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8cGFwZXItc3Bpbm5lci1saXRlCiAgICAgICAgICBhY3RpdmUKICAgICAgICAgIGhpZGRlbiQ9IltbIWFyZUhlYWx0aFBpbGxzTG9hZGluZ11dIgogICAgICAgICAgaWQ9ImhlYWx0aC1waWxscy1sb2FkaW5nLXNwaW5uZXIiCiAgICAgICAgPjwvcGFwZXItc3Bpbm5lci1saXRlPgogICAgICA8L2gyPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICBpZD0iaGVhbHRoLXBpbGwtc3RlcC1zbGlkZXIiCiAgICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IgogICAgICAgICAgbWF4PSJbW19iaWdnZXN0U3RlcEV2ZXJTZWVuXV0iCiAgICAgICAgICBzbmFwcwogICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgIHZhbHVlPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shYWxsU3RlcHNNb2RlRW5hYmxlZF1dIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX21heFN0ZXBJbmRleF1dIj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIKICAgICAgICAgICAgaWQ9ImhlYWx0aC1waWxsLXN0ZXAtc2xpZGVyIgogICAgICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgICBtYXg9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBzbmFwcwogICAgICAgICAgICBzdGVwPSIxIgogICAgICAgICAgICB2YWx1ZT0ie3toZWFsdGhQaWxsU3RlcEluZGV4fX0iCiAgICAgICAgICA+PC9wYXBlci1zbGlkZXI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGgyPgogICAgICAgIEhlYWx0aCBQaWxsCiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW2hlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGVdXSI+CiAgICAgICAgICBDb3VudHMgZm9yIFNlbGVjdGVkIE5vZGUKICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZV1dIj4KICAgICAgICAgIExlZ2VuZAogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvaDI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbaGVhbHRoUGlsbEVudHJpZXNdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iaGVhbHRoLXBpbGwtZW50cnkiPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0iY29sb3ItcHJldmlldyIKICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQ6W1tpdGVtLmJhY2tncm91bmRfY29sb3JdXSIKICAgICAgICAgID48L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxhYmVsIj5bW2l0ZW0ubGFiZWxdXTwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0idGVuc29yLWNvdW50Ij4KICAgICAgICAgICAgW1tfY29tcHV0ZVRlbnNvckNvdW50U3RyaW5nKGhlYWx0aFBpbGxWYWx1ZXNGb3JTZWxlY3RlZE5vZGUsCiAgICAgICAgICAgIGluZGV4KV1dCiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBoaWRkZW4kPSJbWyFfaGFzRGVidWdnZXJOdW1lcmljQWxlcnRzKGRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyldXSI+CiAgICAgICAgPGgyIGlkPSJudW1lcmljLWFsZXJ0cy1oZWFkZXIiPk51bWVyaWMgQWxlcnRzPC9oMj4KICAgICAgICA8cD5BbGVydHMgYXJlIHNvcnRlZCBmcm9tIHRvcCB0byBib3R0b20gYnkgaW5jcmVhc2luZyB0aW1lc3RhbXAuPC9wPgogICAgICAgIDxkaXYgaWQ9Im51bWVyaWMtYWxlcnRzLXRhYmxlLWNvbnRhaW5lciI+CiAgICAgICAgICA8dGFibGUgaWQ9Im51bWVyaWMtYWxlcnRzLXRhYmxlIj4KICAgICAgICAgICAgPHRoZWFkPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0aD5GaXJzdCBPZmZlbnNlPC90aD4KICAgICAgICAgICAgICAgIDx0aD5UZW5zb3IgKERldmljZSk8L3RoPgogICAgICAgICAgICAgICAgPHRoIGlkPSJldmVudC1jb3VudHMtdGgiPkV2ZW50IENvdW50czwvdGg+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgPC90aGVhZD4KICAgICAgICAgICAgPHRib2R5IGlkPSJudW1lcmljLWFsZXJ0cy1ib2R5Ij48L3Rib2R5PgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZQogICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgaWY9IltbIV9oYXNEZWJ1Z2dlck51bWVyaWNBbGVydHMoZGVidWdnZXJOdW1lcmljQWxlcnRzKV1dIgogICAgICA+CiAgICAgICAgPHAgY2xhc3M9Im5vLW51bWVyaWMtYWxlcnRzLW5vdGlmaWNhdGlvbiI+CiAgICAgICAgICBObyBudW1lcmljIGFsZXJ0cyBzbyBmYXIuIFRoYXQgaXMgbGlrZWx5IGdvb2QuIEFsZXJ0cyBpbmRpY2F0ZSB0aGUKICAgICAgICAgIHByZXNlbmNlIG9mIE5hTiBvciAoKy8tKSBJbmZpbml0eSB2YWx1ZXMsIHdoaWNoIG1heSBiZSBjb25jZXJuaW5nLgogICAgICAgIDwvcD4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaERlYnVnZ2VyRGF0YUNhcmQucHJvdG90eXBlLCAicmVuZGVySGllcmFyY2h5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgImRlYnVnZ2VyTnVtZXJpY0FsZXJ0cyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgImhlYWx0aFBpbGxTdGVwSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgInNwZWNpZmljSGVhbHRoUGlsbFN0ZXAiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgInNlbGVjdGVkTm9kZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaERlYnVnZ2VyRGF0YUNhcmQucHJvdG90eXBlLCAiaGlnaGxpZ2h0ZWROb2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoRGVidWdnZXJEYXRhQ2FyZC5wcm90b3R5cGUsICJzZWxlY3RlZE5vZGVJbmNsdWRlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgImFyZUhlYWx0aFBpbGxzTG9hZGluZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEFycmF5LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoRGVidWdnZXJEYXRhQ2FyZC5wcm90b3R5cGUsICJoZWFsdGhQaWxsRW50cmllcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgImFsbFN0ZXBzTW9kZUVuYWJsZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ25vZGVOYW1lc1RvSGVhbHRoUGlsbHMnLCAnaGVhbHRoUGlsbFN0ZXBJbmRleCcsICdzZWxlY3RlZE5vZGUnLCAnYWxsU3RlcHNNb2RlRW5hYmxlZCcsICdhcmVIZWFsdGhQaWxsc0xvYWRpbmcnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZHcmFwaERlYnVnZ2VyRGF0YUNhcmQucHJvdG90eXBlLCAiaGVhbHRoUGlsbFZhbHVlc0ZvclNlbGVjdGVkTm9kZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ25vZGVOYW1lc1RvSGVhbHRoUGlsbHMnLCAnaGVhbHRoUGlsbFN0ZXBJbmRleCcsICdhbGxTdGVwc01vZGVFbmFibGVkJywgJ3NwZWNpZmljSGVhbHRoUGlsbFN0ZXAnLCAnYXJlSGVhbHRoUGlsbHNMb2FkaW5nJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoRGVidWdnZXJEYXRhQ2FyZC5wcm90b3R5cGUsICJfY3VycmVudFN0ZXBEaXNwbGF5VmFsdWUiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdub2RlTmFtZXNUb0hlYWx0aFBpbGxzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoRGVidWdnZXJEYXRhQ2FyZC5wcm90b3R5cGUsICJfYmlnZ2VzdFN0ZXBFdmVyU2VlbiIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ25vZGVOYW1lc1RvSGVhbHRoUGlsbHMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlciksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkLnByb3RvdHlwZSwgIl9tYXhTdGVwSW5kZXgiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ2RlYnVnZ2VyTnVtZXJpY0FsZXJ0cycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaERlYnVnZ2VyRGF0YUNhcmQucHJvdG90eXBlLCAiX3VwZGF0ZUFsZXJ0c0xpc3QiLCBudWxsKTsKICAgIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkJykKICAgIF0sIFRmR3JhcGhEZWJ1Z2dlckRhdGFDYXJkKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHZhciBHcmFwaEljb25UeXBlOwogICAgKGZ1bmN0aW9uIChHcmFwaEljb25UeXBlKSB7CiAgICAgICAgR3JhcGhJY29uVHlwZVsiQ09OU1QiXSA9ICJDT05TVCI7CiAgICAgICAgR3JhcGhJY29uVHlwZVsiTUVUQSJdID0gIk1FVEEiOwogICAgICAgIEdyYXBoSWNvblR5cGVbIk9QIl0gPSAiT1AiOwogICAgICAgIEdyYXBoSWNvblR5cGVbIlNFUklFUyJdID0gIlNFUklFUyI7CiAgICAgICAgR3JhcGhJY29uVHlwZVsiU1VNTUFSWSJdID0gIlNVTU1BUlkiOwogICAgfSkoR3JhcGhJY29uVHlwZSB8fCAoR3JhcGhJY29uVHlwZSA9IHt9KSk7CiAgICBsZXQgVGZHcmFwaEljb24gPSBjbGFzcyBUZkdyYXBoSWNvbiBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLnZlcnRpY2FsID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZmlsbE92ZXJyaWRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zdHJva2VPdmVycmlkZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gMjA7CiAgICAgICAgICAgIHRoaXMuZmFkZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZ2V0U3ZnRGVmaW5hYmxlRWxlbWVudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC5zdmdEZWZzOwogICAgICAgIH0KICAgICAgICBnZXQgX2ZpbGwoKSB7CiAgICAgICAgICAgIHZhciB0eXBlID0gdGhpcy50eXBlOwogICAgICAgICAgICB2YXIgZmlsbE92ZXJyaWRlID0gdGhpcy5maWxsT3ZlcnJpZGU7CiAgICAgICAgICAgIGlmIChmaWxsT3ZlcnJpZGUgIT0gbnVsbCkKICAgICAgICAgICAgICAgIHJldHVybiBmaWxsT3ZlcnJpZGU7CiAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBHcmFwaEljb25UeXBlLk1FVEE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE1ldGFub2RlQ29sb3JzLkRFRkFVTFRfRklMTDsKICAgICAgICAgICAgICAgIGNhc2UgR3JhcGhJY29uVHlwZS5TRVJJRVM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9GSUxMOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT3BOb2RlQ29sb3JzLkRFRkFVTFRfRklMTDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBnZXQgX3N0cm9rZSgpIHsKICAgICAgICAgICAgdmFyIHR5cGUgPSB0aGlzLnR5cGU7CiAgICAgICAgICAgIHZhciBzdHJva2VPdmVycmlkZSA9IHRoaXMuc3Ryb2tlT3ZlcnJpZGU7CiAgICAgICAgICAgIGlmIChzdHJva2VPdmVycmlkZSAhPSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIHN0cm9rZU92ZXJyaWRlOwogICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgR3JhcGhJY29uVHlwZS5NRVRBOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBNZXRhbm9kZUNvbG9ycy5ERUZBVUxUX1NUUk9LRTsKICAgICAgICAgICAgICAgIGNhc2UgR3JhcGhJY29uVHlwZS5TRVJJRVM6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFNlcmllc05vZGVDb2xvcnMuREVGQVVMVF9TVFJPS0U7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBPcE5vZGVDb2xvcnMuREVGQVVMVF9TVFJPS0U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGVzdCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgbm9kZSdzIHR5cGUsIG9yIHRoZSBsaXRlcmFsIHR5cGUgc3RyaW5nLAogICAgICAgICAqIG1hdGNoIGEgcGFydGljdWxhciBvdGhlciB0eXBlLgogICAgICAgICAqLwogICAgICAgIF9pc1R5cGUodHlwZSwgdGFyZ2V0VHlwZSkgewogICAgICAgICAgICByZXR1cm4gdHlwZSA9PT0gdGFyZ2V0VHlwZTsKICAgICAgICB9CiAgICAgICAgX2ZhZGVkQ2xhc3MoZmFkZWQsIHNoYXBlKSB7CiAgICAgICAgICAgIHJldHVybiBmYWRlZCA/ICdmYWRlZC0nICsgc2hhcGUgOiAnJzsKICAgICAgICB9CiAgICB9OwogICAgVGZHcmFwaEljb24udGVtcGxhdGUgPSBodG1sIGAKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtc2l6ZTogMDsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QgewogICAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLWVsbGlwc2UgewogICAgICAgIGZpbGw6IHVybCgjZWxsaXBzZUhhdGNoKTsKICAgICAgfQoKICAgICAgLmZhZGVkLXJlY3QsCiAgICAgIC5mYWRlZC1lbGxpcHNlLAogICAgICAuZmFkZWQtc2VyaWVzIHsKICAgICAgICBzdHJva2U6IHZhcigtLXRiLWdyYXBoLWZhZGVkKSAhaW1wb3J0YW50OwogICAgICB9CiAgICAgICNyZWN0SGF0Y2ggbGluZSwKICAgICAgI2VsbGlwc2VIYXRjaCBsaW5lIHsKICAgICAgICBjb2xvcjogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICAgIGZpbGw6IHdoaXRlOwogICAgICAgIHN0cm9rZTogI2UwZDRiMyAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPCEtLSBTVkcgZm9yIGRlZmluaXRpb25zIC0tPgogICAgPHN2ZyBoZWlnaHQ9IjAiIHdpZHRoPSIwIiBpZD0ic3ZnRGVmcyI+CiAgICAgIDxkZWZzPgogICAgICAgIDwhLS0gSGF0Y2ggcGF0dGVybnMgZm9yIGZhZGVkIG91dCBub2Rlcy4gLS0+CiAgICAgICAgPHBhdHRlcm4KICAgICAgICAgIGlkPSJyZWN0SGF0Y2giCiAgICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIKICAgICAgICAgIHdpZHRoPSI1IgogICAgICAgICAgaGVpZ2h0PSI1IgogICAgICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgICA+CiAgICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSI+PC9saW5lPgogICAgICAgIDwvcGF0dGVybj4KICAgICAgICA8cGF0dGVybgogICAgICAgICAgaWQ9ImVsbGlwc2VIYXRjaCIKICAgICAgICAgIHBhdHRlcm5UcmFuc2Zvcm09InJvdGF0ZSg0NSAwIDApIgogICAgICAgICAgd2lkdGg9IjIiCiAgICAgICAgICBoZWlnaHQ9IjIiCiAgICAgICAgICBwYXR0ZXJuVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICAgID4KICAgICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgICAgPC9wYXR0ZXJuPgogICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGFuIE9wIG5vZGUgZWxsaXBzZS4gLS0+CiAgICAgICAgPGVsbGlwc2UKICAgICAgICAgIGlkPSJvcC1ub2RlLXN0YW1wIgogICAgICAgICAgcng9IjcuNSIKICAgICAgICAgIHJ5PSIzIgogICAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgICAgZmlsbD0iaW5oZXJpdCIKICAgICAgICA+PC9lbGxpcHNlPgogICAgICAgIDwhLS0gVGVtcGxhdGUgZm9yIGFuIE9wIG5vZGUgYW5ub3RhdGlvbiBlbGxpcHNlIChzbWFsbGVyKS4gLS0+CiAgICAgICAgPGVsbGlwc2UKICAgICAgICAgIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiCiAgICAgICAgICByeD0iNSIKICAgICAgICAgIHJ5PSIyIgogICAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgICAgZmlsbD0iaW5oZXJpdCIKICAgICAgICA+PC9lbGxpcHNlPgogICAgICAgIDwhLS0gVmVydGljYWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyB3aGVuIHVuZXhwYW5kZWQuIC0tPgogICAgICAgIDxnIGlkPSJvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iOSI+PC91c2U+CiAgICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2Ij48L3VzZT4KICAgICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjgiIHk9IjMiPjwvdXNlPgogICAgICAgIDwvZz4KICAgICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTYiIHk9IjQiPjwvdXNlPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iMTIiIHk9IjQiPjwvdXNlPgogICAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iNCI+PC91c2U+CiAgICAgICAgPC9nPgogICAgICAgIDxnCiAgICAgICAgICBpZD0ic3VtbWFyeS1pY29uIgogICAgICAgICAgZmlsbD0iIzg0ODQ4NCIKICAgICAgICAgIGhlaWdodD0iMTIiCiAgICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgICAgICAgICB3aWR0aD0iMTIiCiAgICAgICAgPgogICAgICAgICAgPHBhdGgKICAgICAgICAgICAgZD0iTTE5IDNINWMtMS4xIDAtMiAuOS0yIDJ2MTRjMCAxLjEuOSAyIDIgMmgxNGMxLjEgMCAyLS45IDItMlY1YzAtMS4xLS45LTItMi0yek05IDE3SDd2LTdoMnY3em00IDBoLTJWN2gydjEwem00IDBoLTJ2LTRoMnY0eiIKICAgICAgICAgID48L3BhdGg+CiAgICAgICAgPC9nPgogICAgICA8L2RlZnM+CiAgICA8L3N2Zz4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdDT05TVCcpXV0iPgogICAgICA8c3ZnCiAgICAgICAgaGVpZ2h0JD0iW1toZWlnaHRdXSIKICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgPgogICAgICAgIDxjaXJjbGUKICAgICAgICAgIGN4PSI1IgogICAgICAgICAgY3k9IjUiCiAgICAgICAgICByPSIzIgogICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgID48L2NpcmNsZT4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ1NVTU1BUlknKV1dIj4KICAgICAgPHN2ZwogICAgICAgIHdpZHRoJD0iW1toZWlnaHRdXSIKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHZpZXdCb3g9IjAgMCAyNCAyNCIKICAgICAgICBmaWxsPSIjODQ4NDg0IgogICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiCiAgICAgICAgPjwvcGF0aD4KICAgICAgPC9zdmc+CiAgICA8L3RlbXBsYXRlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc1R5cGUodHlwZSwgJ09QJyldXSI+CiAgICAgIDxzdmcKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgdmlld0JveD0iMCAwIDE2IDgiCiAgICAgID4KICAgICAgICA8dXNlCiAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIgogICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgICAgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAnZWxsaXBzZScpfX0iCiAgICAgICAgICB4PSI4IgogICAgICAgICAgeT0iNCIKICAgICAgICA+PC91c2U+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdNRVRBJyldXSI+CiAgICAgIDxzdmcKICAgICAgICBoZWlnaHQkPSJbW2hlaWdodF1dIgogICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgdmlld0JveD0iMCAwIDM3IDE2IgogICAgICA+CiAgICAgICAgPHJlY3QKICAgICAgICAgIHg9IjEiCiAgICAgICAgICB5PSIxIgogICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgICAgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGZhZGVkLCAncmVjdCcpfX0iCiAgICAgICAgICBzdHJva2Utd2lkdGg9IjJweCIKICAgICAgICAgIGhlaWdodD0iMTQiCiAgICAgICAgICB3aWR0aD0iMzUiCiAgICAgICAgICByeD0iNSIKICAgICAgICAgIHJ5PSI1IgogICAgICAgID48L3JlY3Q+CiAgICAgIDwvc3ZnPgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaXNUeXBlKHR5cGUsICdTRVJJRVMnKV1dIj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3ZlcnRpY2FsXV0iPgogICAgICAgIDxzdmcKICAgICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgdmlld0JveD0iMCAwIDE2IDE1IgogICAgICAgID4KICAgICAgICAgIDx1c2UKICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgIHhsaW5rOmhyZWY9IiNvcC1zZXJpZXMtdmVydGljYWwtc3RhbXAiCiAgICAgICAgICAgIGZpbGwkPSJbW19maWxsXV0iCiAgICAgICAgICAgIHN0cm9rZSQ9IltbX3N0cm9rZV1dIgogICAgICAgICAgICBjbGFzcyQ9Int7X2ZhZGVkQ2xhc3MoZmFkZWQsICdzZXJpZXMnKX19IgogICAgICAgICAgICB4PSIwIgogICAgICAgICAgICB5PSIyIgogICAgICAgICAgPjwvdXNlPgogICAgICAgIDwvc3ZnPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIXZlcnRpY2FsXV0iPgogICAgICAgIDxzdmcKICAgICAgICAgIGhlaWdodCQ9IltbaGVpZ2h0XV0iCiAgICAgICAgICBwcmVzZXJ2ZUFzcGVjdFJhdGlvPSJ4TWluWU1pZCBtZWV0IgogICAgICAgICAgdmlld0JveD0iMCAwIDI0IDEwIgogICAgICAgID4KICAgICAgICAgIDx1c2UKICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgIHhsaW5rOmhyZWY9IiNvcC1zZXJpZXMtaG9yaXpvbnRhbC1zdGFtcCIKICAgICAgICAgICAgZmlsbCQ9IltbX2ZpbGxdXSIKICAgICAgICAgICAgc3Ryb2tlJD0iW1tfc3Ryb2tlXV0iCiAgICAgICAgICAgIGNsYXNzJD0ie3tfZmFkZWRDbGFzcyhmYWRlZCwgJ3NlcmllcycpfX0iCiAgICAgICAgICAgIHg9IjAiCiAgICAgICAgICAgIHk9IjEiCiAgICAgICAgICA+PC91c2U+CiAgICAgICAgPC9zdmc+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3RlbXBsYXRlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGhJY29uLnByb3RvdHlwZSwgInR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhJY29uLnByb3RvdHlwZSwgInZlcnRpY2FsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaEljb24ucHJvdG90eXBlLCAiZmlsbE92ZXJyaWRlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaEljb24ucHJvdG90eXBlLCAic3Ryb2tlT3ZlcnJpZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoSWNvbi5wcm90b3R5cGUsICJoZWlnaHQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhJY29uLnByb3RvdHlwZSwgImZhZGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCd0eXBlJywgJ2ZpbGxPdmVycmlkZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZHcmFwaEljb24ucHJvdG90eXBlLCAiX2ZpbGwiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCd0eXBlJywgJ3N0cm9rZU92ZXJyaWRlJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoSWNvbi5wcm90b3R5cGUsICJfc3Ryb2tlIiwgbnVsbCk7CiAgICBUZkdyYXBoSWNvbiA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWdyYXBoLWljb24nKQogICAgXSwgVGZHcmFwaEljb24pOwoKICAgIHZhciB0Zl9ncmFwaF9pY29uID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBnZXQgR3JhcGhJY29uVHlwZSAoKSB7IHJldHVybiBHcmFwaEljb25UeXBlOyB9CiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgdG9wIGFuZCBsZWZ0IGRpc3RhbmNlIG9mIHRoZSBzY2VuZSBlbGVtZW50IGZyb20gdGhlIHRvcCBsZWZ0CiAgICAgKiBjb3JuZXIgb2YgdGhlIHNjcmVlbi4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T2Zmc2V0KHNjZW5lRWxlbWVudCkgewogICAgICAgIGxldCBsZWZ0RGlzdGFuY2UgPSAwOwogICAgICAgIGxldCB0b3BEaXN0YW5jZSA9IDA7CiAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50ID0gc2NlbmVFbGVtZW50OwogICAgICAgIHdoaWxlIChjdXJyZW50RWxlbWVudCAmJgogICAgICAgICAgICBjdXJyZW50RWxlbWVudC5vZmZzZXRMZWZ0ID49IDAgJiYKICAgICAgICAgICAgY3VycmVudEVsZW1lbnQub2Zmc2V0VG9wID49IDApIHsKICAgICAgICAgICAgbGVmdERpc3RhbmNlICs9IGN1cnJlbnRFbGVtZW50Lm9mZnNldExlZnQgLSBjdXJyZW50RWxlbWVudC5zY3JvbGxMZWZ0OwogICAgICAgICAgICB0b3BEaXN0YW5jZSArPSBjdXJyZW50RWxlbWVudC5vZmZzZXRUb3AgLSBjdXJyZW50RWxlbWVudC5zY3JvbGxUb3A7CiAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQub2Zmc2V0UGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gewogICAgICAgICAgICBsZWZ0OiBsZWZ0RGlzdGFuY2UsCiAgICAgICAgICAgIHRvcDogdG9wRGlzdGFuY2UsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZXZlbnQgbGlzdGVuZXIsIHdoaWNoIGNhbiBiZSB1c2VkIGFzIGFuIGFyZ3VtZW50IGZvciB0aGUgZDMKICAgICAqIHNlbGVjdGlvbi5vbiBmdW5jdGlvbi4gUmVuZGVycyB0aGUgY29udGV4dCBtZW51IHRoYXQgaXMgdG8gYmUgZGlzcGxheWVkCiAgICAgKiBpbiByZXNwb25zZSB0byB0aGUgZXZlbnQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE1lbnUoc2NlbmVFbGVtZW50LCBtZW51KSB7CiAgICAgICAgY29uc3QgbWVudU5vZGUgPSBzY2VuZUVsZW1lbnQuZ2V0Q29udGV4dE1lbnUoKTsKICAgICAgICBjb25zdCBtZW51U2VsZWN0aW9uID0gc2VsZWN0KHNjZW5lRWxlbWVudC5nZXRDb250ZXh0TWVudSgpKTsKICAgICAgICAvLyBGdW5jdGlvbiBjYWxsZWQgdG8gcG9wdWxhdGUgdGhlIGNvbnRleHQgbWVudS4KICAgICAgICByZXR1cm4gZnVuY3Rpb24gKGRhdGEsIGluZGV4KSB7CiAgICAgICAgICAgIC8vIFBvc2l0aW9uIGFuZCBkaXNwbGF5IHRoZSBtZW51LgogICAgICAgICAgICBsZXQgZXZlbnQkMSA9IGV2ZW50OwogICAgICAgICAgICBjb25zdCBzY2VuZU9mZnNldCA9IGdldE9mZnNldChzY2VuZUVsZW1lbnQpOwogICAgICAgICAgICBtZW51U2VsZWN0aW9uCiAgICAgICAgICAgICAgICAuc3R5bGUoJ2Rpc3BsYXknLCAnYmxvY2snKQogICAgICAgICAgICAgICAgLnN0eWxlKCdsZWZ0JywgZXZlbnQkMS5jbGllbnRYIC0gc2NlbmVPZmZzZXQubGVmdCArIDEgKyAncHgnKQogICAgICAgICAgICAgICAgLnN0eWxlKCd0b3AnLCBldmVudCQxLmNsaWVudFkgLSBzY2VuZU9mZnNldC50b3AgKyAxICsgJ3B4Jyk7CiAgICAgICAgICAgIC8vIFN0b3AgdGhlIGV2ZW50IGZyb20gcHJvcGFnYXRpbmcgZnVydGhlci4KICAgICAgICAgICAgZXZlbnQkMS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBldmVudCQxLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBmdW5jdGlvbiBtYXliZUNsb3NlTWVudShldmVudCkgewogICAgICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LmNvbXBvc2VkUGF0aCgpLmluY2x1ZGVzKG1lbnVOb2RlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1lbnVTZWxlY3Rpb24uc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBtYXliZUNsb3NlTWVudSwgewogICAgICAgICAgICAgICAgICAgIGNhcHR1cmU6IHRydWUsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBEaXNtaXNzIGFuZCByZW1vdmUgdGhlIGNsaWNrIGxpc3RlbmVyIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBtb3VzZWRvd24KICAgICAgICAgICAgLy8gb24gdGhlIGRvY3VtZW50LiBXZSB1c2UgY2FwdHVyZSBsaXN0ZW5lciBzbyBubyBjb21wb25lbnQgY2FuIHN0b3AKICAgICAgICAgICAgLy8gY29udGV4dCBtZW51IGZyb20gZGlzbWlzc2luZyBkdWUgdG8gc3RvcHBlZCBwcm9wYWdhdGlvbi4KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdtb3VzZWRvd24nLCBtYXliZUNsb3NlTWVudSwgewogICAgICAgICAgICAgICAgY2FwdHVyZTogdHJ1ZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIEFkZCBwcm92aWRlZCBpdGVtcyB0byB0aGUgY29udGV4dCBtZW51LgogICAgICAgICAgICBtZW51U2VsZWN0aW9uLmh0bWwoJycpOwogICAgICAgICAgICBsZXQgbGlzdCA9IG1lbnVTZWxlY3Rpb24uYXBwZW5kKCd1bCcpOwogICAgICAgICAgICBsaXN0CiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCdsaScpCiAgICAgICAgICAgICAgICAuZGF0YShtZW51KQogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2xpJykKICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCAoZCwgaSkgPT4gewogICAgICAgICAgICAgICAgZC5hY3Rpb24odGhpcywgZGF0YSwgaW5kZXgpOwogICAgICAgICAgICAgICAgbWF5YmVDbG9zZU1lbnUoKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5odG1sKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZC50aXRsZShkYXRhKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKiBEZWxpbWl0ZXIgYmV0d2VlbiBkaW1lbnNpb25zIHdoZW4gc2hvd2luZyBzaXplcyBvZiB0ZW5zb3JzLiAqLwogICAgY29uc3QgVEVOU09SX1NIQVBFX0RFTElNID0gJ1x1MDBENyc7CiAgICBsZXQgYXJyb3doZWFkTWFwID0gcXVhbnRpemUkMSgpCiAgICAgICAgLmRvbWFpbihbTUlOX0VER0VfV0lEVEgsIE1BWF9FREdFX1dJRFRIXSkKICAgICAgICAucmFuZ2UoWydzbWFsbCcsICdtZWRpdW0nLCAnbGFyZ2UnLCAneGxhcmdlJ10pOwogICAgZnVuY3Rpb24gZ2V0RWRnZUtleShlZGdlT2JqKSB7CiAgICAgICAgcmV0dXJuIGVkZ2VPYmoudiArIEVER0VfS0VZX0RFTElNJDEgKyBlZGdlT2JqLnc7CiAgICB9CiAgICAvKioKICAgICAqIFNlbGVjdCBvciBDcmVhdGUgYSAnZy5lZGdlcycgZ3JvdXAgdG8gYSBnaXZlbiBzY2VuZUdyb3VwCiAgICAgKiBhbmQgYnVpbGRzIGEgbnVtYmVyIG9mICdnLmVkZ2UnIGdyb3VwcyBpbnNpZGUgdGhlIGdyb3VwLgogICAgICoKICAgICAqIFN0cnVjdHVyZSBQYXR0ZXJuOgogICAgICoKICAgICAqIDxnIGNsYXNzPSdlZGdlcyc+CiAgICAgKiAgIDxnIGNsYXNzPSdlZGdlJz4KICAgICAqICAgICA8cGF0aCBjbGFzcz0nZWRnZWxpbmUnLz4KICAgICAqICAgPC9nPgogICAgICogICAuLi4KICAgICAqIDwvZz4KICAgICAqCiAgICAgKgogICAgICogQHBhcmFtIHNjZW5lR3JvdXAgY29udGFpbmVyCiAgICAgKiBAcGFyYW0gZ3JhcGgKICAgICAqIEBwYXJhbSBzY2VuZUVsZW1lbnQgPHRmLWdyYXBoLXNjZW5lPiBwb2x5bWVyIGVsZW1lbnQuCiAgICAgKiBAcmV0dXJuIHNlbGVjdGlvbiBvZiB0aGUgY3JlYXRlZCBub2RlR3JvdXBzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkR3JvdXAoc2NlbmVHcm91cCwgZ3JhcGgsIHNjZW5lRWxlbWVudCkgewogICAgICAgIGNvbnN0IHNjZW5lQ29tcG9uZW50ID0gc2NlbmVFbGVtZW50OwogICAgICAgIGxldCBlZGdlcyA9IFtdOwogICAgICAgIGVkZ2VzID0gbG9kYXNoLnJlZHVjZShncmFwaC5lZGdlcygpLCAoZWRnZXMsIGVkZ2VPYmopID0+IHsKICAgICAgICAgICAgbGV0IGVkZ2VMYWJlbCA9IGdyYXBoLmVkZ2UoZWRnZU9iaik7CiAgICAgICAgICAgIGVkZ2VzLnB1c2goewogICAgICAgICAgICAgICAgdjogZWRnZU9iai52LAogICAgICAgICAgICAgICAgdzogZWRnZU9iai53LAogICAgICAgICAgICAgICAgbGFiZWw6IGVkZ2VMYWJlbCwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBlZGdlczsKICAgICAgICB9LCBlZGdlcyk7CiAgICAgICAgbGV0IGNvbnRhaW5lciA9IHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2NlbmVHcm91cCwgJ2cnLCBDbGFzcyQxLkVkZ2UuQ09OVEFJTkVSKTsKICAgICAgICAvLyBTZWxlY3QgYWxsIGNoaWxkcmVuIGFuZCBqb2luIHdpdGggZGF0YS4KICAgICAgICAvLyAoTm90ZSB0aGF0IGFsbCBjaGlsZHJlbiBvZiBnLmVkZ2VzIGFyZSBnLmVkZ2UpCiAgICAgICAgbGV0IGVkZ2VHcm91cHMgPSBjb250YWluZXIKICAgICAgICAgICAgLnNlbGVjdEFsbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM7CiAgICAgICAgfSkKICAgICAgICAgICAgLmRhdGEoZWRnZXMsIGdldEVkZ2VLZXkpOwogICAgICAgIC8vIE1ha2UgZWRnZXMgYSBncm91cCB0byBzdXBwb3J0IHJlbmRlcmluZyBtdWx0aXBsZSBsaW5lcyBmb3IgbWV0YWVkZ2UKICAgICAgICBlZGdlR3JvdXBzCiAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cignY2xhc3MnLCBDbGFzcyQxLkVkZ2UuR1JPVVApCiAgICAgICAgICAgIC5hdHRyKCdkYXRhLWVkZ2UnLCBnZXRFZGdlS2V5KQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBsZXQgZWRnZUdyb3VwID0gc2VsZWN0KHRoaXMpOwogICAgICAgICAgICBkLmxhYmVsLmVkZ2VHcm91cCA9IGVkZ2VHcm91cDsKICAgICAgICAgICAgLy8gaW5kZXggbm9kZSBncm91cCBmb3IgcXVpY2sgaGlnaGxpZ2h0aW5nCiAgICAgICAgICAgIHNjZW5lQ29tcG9uZW50Ll9lZGdlR3JvdXBJbmRleFtnZXRFZGdlS2V5KGQpXSA9IGVkZ2VHcm91cDsKICAgICAgICAgICAgaWYgKHNjZW5lQ29tcG9uZW50LmhhbmRsZUVkZ2VTZWxlY3RlZCkgewogICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgb3Igc29tZSBoaWdoZXItbGV2ZWwgY29tcG9uZW50IGhhcyBvcHRlZCB0byBtYWtlIGVkZ2VzIHNlbGVjdGFibGUuCiAgICAgICAgICAgICAgICBlZGdlR3JvdXAub24oJ2NsaWNrJywgKGQpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIHRoaXMgZXZlbnQncyBwcm9wYWdhdGlvbiBzbyB0aGF0IGl0IGlzbid0IGFsc28gY29uc2lkZXJlZAogICAgICAgICAgICAgICAgICAgIC8vIGEgZ3JhcGgtc2VsZWN0LgogICAgICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICAgICAgICAgIHNjZW5lQ29tcG9uZW50LmZpcmUoJ2VkZ2Utc2VsZWN0JywgewogICAgICAgICAgICAgICAgICAgICAgICBlZGdlRGF0YTogZCwKICAgICAgICAgICAgICAgICAgICAgICAgZWRnZUdyb3VwOiBlZGdlR3JvdXAsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBZGQgbGluZSBkdXJpbmcgZW50ZXIgYmVjYXVzZSB3ZSdyZSBhc3N1bWluZyB0aGF0IHR5cGUgb2YgbGluZQogICAgICAgICAgICAvLyBub3JtYWxseSBkb2VzIG5vdCBjaGFuZ2UuCiAgICAgICAgICAgIGFwcGVuZEVkZ2UoZWRnZUdyb3VwLCBkLCBzY2VuZUNvbXBvbmVudCk7CiAgICAgICAgfSkKICAgICAgICAgICAgLm1lcmdlKGVkZ2VHcm91cHMpCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgcG9zaXRpb24kMihzY2VuZUVsZW1lbnQsIHRoaXMpOwogICAgICAgIH0pCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIHN0eWxpemUoc2VsZWN0KHRoaXMpLCBkKTsKICAgICAgICB9KTsKICAgICAgICBlZGdlR3JvdXBzCiAgICAgICAgICAgIC5leGl0KCkKICAgICAgICAgICAgLmVhY2goKGQpID0+IHsKICAgICAgICAgICAgZGVsZXRlIHNjZW5lQ29tcG9uZW50Ll9lZGdlR3JvdXBJbmRleFtnZXRFZGdlS2V5KGQpXTsKICAgICAgICB9KQogICAgICAgICAgICAucmVtb3ZlKCk7CiAgICAgICAgcmV0dXJuIGVkZ2VHcm91cHM7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gYmFzZSBlZGdlLgogICAgICogVGhlIGxhYmVsIGlzIHRoZSBzaGFwZSBvZiB0aGUgdW5kZXJseWluZyB0ZW5zb3IuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExhYmVsRm9yQmFzZUVkZ2UoYmFzZUVkZ2UsIHJlbmRlckluZm8pIHsKICAgICAgICBsZXQgbm9kZSA9IHJlbmRlckluZm8uZ2V0Tm9kZUJ5TmFtZShiYXNlRWRnZS52KTsKICAgICAgICBpZiAobm9kZS5vdXRwdXRTaGFwZXMgPT0gbnVsbCB8fCBsb2Rhc2guaXNFbXB0eShub2RlLm91dHB1dFNoYXBlcykpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGxldCBzaGFwZSA9IG5vZGUub3V0cHV0U2hhcGVzW2Jhc2VFZGdlLm91dHB1dFRlbnNvcktleV07CiAgICAgICAgaWYgKHNoYXBlID09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChzaGFwZS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuICdzY2FsYXInOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2hhcGUKICAgICAgICAgICAgLm1hcCgoc2l6ZSkgPT4gewogICAgICAgICAgICByZXR1cm4gc2l6ZSA9PT0gLTEgPyAnPycgOiBzaXplOwogICAgICAgIH0pCiAgICAgICAgICAgIC5qb2luKFRFTlNPUl9TSEFQRV9ERUxJTSk7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgdGhlIGxhYmVsIGZvciB0aGUgZ2l2ZW4gbWV0YWVkZ2UuIElmIHRoZSBtZXRhZWRnZSBjb25zaXN0cwogICAgICogb2Ygb25seSAxIHRlbnNvciwgYW5kIGl0J3Mgc2hhcGUgaXMga25vd24sIHRoZSBsYWJlbCB3aWxsIGNvbnRhaW4gdGhhdAogICAgICogc2hhcGUuIE90aGVyd2lzZSwgdGhlIGxhYmVsIHdpbGwgc2F5IHRoZSBudW1iZXIgb2YgdGVuc29ycyBpbiB0aGUgbWV0YWVkZ2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExhYmVsRm9yRWRnZShtZXRhZWRnZSwgcmVuZGVySW5mbykgewogICAgICAgIGlmIChyZW5kZXJJbmZvLmVkZ2VMYWJlbEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIC8vIFRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgYSBtZWFucyBvZiBjb21wdXRpbmcgdGhlIGxhYmVsLgogICAgICAgICAgICByZXR1cm4gcmVuZGVySW5mby5lZGdlTGFiZWxGdW5jdGlvbihtZXRhZWRnZSwgcmVuZGVySW5mbyk7CiAgICAgICAgfQogICAgICAgIC8vIENvbXB1dGUgdGhlIGxhYmVsIGJhc2VkIG9uIGVpdGhlciB0ZW5zb3IgY291bnQgb3Igc2l6ZS4KICAgICAgICBsZXQgaXNNdWx0aUVkZ2UgPSBtZXRhZWRnZS5iYXNlRWRnZUxpc3QubGVuZ3RoID4gMTsKICAgICAgICByZXR1cm4gaXNNdWx0aUVkZ2UKICAgICAgICAgICAgPyBtZXRhZWRnZS5iYXNlRWRnZUxpc3QubGVuZ3RoICsgJyB0ZW5zb3JzJwogICAgICAgICAgICA6IGdldExhYmVsRm9yQmFzZUVkZ2UobWV0YWVkZ2UuYmFzZUVkZ2VMaXN0WzBdLCByZW5kZXJJbmZvKTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgdGhlIGluZGV4IGludG8gYSBzZXQgb2YgcG9pbnRzIHRoYXQgY29uc3RpdHV0ZSBhIHBhdGggZm9yIHdoaWNoIHRoZQogICAgICogZGlzdGFuY2UgYWxvbmcgdGhlIHBhdGggZnJvbSB0aGUgaW5pdGlhbCBwb2ludCBpcyBhcyBsYXJnZSBhcyBwb3NzaWJsZQogICAgICogd2l0aG91dCBleGNlZWRpbmcgdGhlIGxlbmd0aC4gVGhpcyBmdW5jdGlvbiB3YXMgaW50cm9kdWNlZCBhZnRlciB0aGUKICAgICAqIG5hdGl2ZSBnZXRQYXRoU2VnQXRMZW5ndGggbWV0aG9kIGdvdCBkZXByZWNhdGVkIGJ5IFNWRyAyLgogICAgICogQHBhcmFtIHBvaW50cyBBcnJheSBvZiBwYXRoIGNvbnRyb2wgcG9pbnRzLiBBIHBvaW50IGhhcyB4IGFuZCB5IHByb3BlcnRpZXMuCiAgICAgKiAgIE11c3QgYmUgb2YgbGVuZ3RoIGF0IGxlYXN0IDIuCiAgICAgKiBAcGFyYW0gbGVuZ3RoIFRoZSBsZW5ndGggKGZsb2F0KS4KICAgICAqIEBwYXJhbSBsaW5lRnVuYyBBIGZ1bmN0aW9uIHRoYXQgdGFrZXMgcG9pbnRzIGFuZCByZXR1cm5zIHRoZSAiZCIgYXR0cmlidXRlCiAgICAgKiAgIG9mIGEgcGF0aCBtYWRlIGZyb20gY29ubmVjdGluZyB0aGUgcG9pbnRzLgogICAgICogQHJldHVybiBUaGUgaW5kZXggaW50byB0aGUgcG9pbnRzIGFycmF5LgogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXRoU2VnbWVudEluZGV4QXRMZW5ndGgocG9pbnRzLCBsZW5ndGgsIGxpbmVGdW5jKSB7CiAgICAgICAgY29uc3QgcGF0aCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhTVkdfTkFNRVNQQUNFLCAncGF0aCcpOwogICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHBhdGguc2V0QXR0cmlidXRlKCdkJywgbGluZUZ1bmMocG9pbnRzLnNsaWNlKDAsIGkpKSk7CiAgICAgICAgICAgIGlmIChwYXRoLmdldFRvdGFsTGVuZ3RoKCkgPiBsZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgbWFueSBwb2ludHMgaGFzIGFscmVhZHkgZXhjZWVkZWQgdGhlIGxlbmd0aC4KICAgICAgICAgICAgICAgIHJldHVybiBpIC0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBUaGUgZW50aXJlIHBhdGggaXMgc2hvcnRlciB0aGFuIHRoZSBzcGVjaWZpZWQgbGVuZ3RoLgogICAgICAgIHJldHVybiBwb2ludHMubGVuZ3RoIC0gMTsKICAgIH0KICAgIC8qKgogICAgICogU2hvcnRlbnMgdGhlIHBhdGggZW5vdWdodCBzdWNoIHRoYXQgdGhlIHRpcCBvZiB0aGUgc3RhcnQvZW5kIG1hcmtlciB3aWxsCiAgICAgKiBwb2ludCB0byB0aGUgc3RhcnQvZW5kIG9mIHRoZSBwYXRoLiBUaGUgbWFya2VyIGNhbiBiZSBvZiBhcmJpdHJhcnkgc2l6ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gcG9pbnRzIEFycmF5IG9mIHBhdGggY29udHJvbCBwb2ludHMuCiAgICAgKiBAcGFyYW0gbWFya2VyIEQzIHNlbGVjdGlvbiBvZiB0aGUgPG1hcmtlcj4gc3ZnIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gaXNTdGFydCBJcyB0aGUgbWFya2VyIGEgYHN0YXJ0LW1hcmtlcmAuIElmIGZhbHNlLCB0aGUgbWFya2VyIGlzCiAgICAgKiAgICAgYW4gYGVuZC1tYXJrZXJgLgogICAgICogQHJldHVybiBUaGUgbmV3IGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzLgogICAgICovCiAgICBmdW5jdGlvbiBhZGp1c3RQYXRoUG9pbnRzRm9yTWFya2VyKHBvaW50cywgbWFya2VyLCBpc1N0YXJ0KSB7CiAgICAgICAgbGV0IGxpbmVGdW5jID0gbGluZSgpCiAgICAgICAgICAgIC54KChkKSA9PiBkLngpCiAgICAgICAgICAgIC55KChkKSA9PiBkLnkpOwogICAgICAgIGxldCBwYXRoID0gc2VsZWN0KGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnLCAncGF0aCcpKQogICAgICAgICAgICAuYXR0cignZCcsIGxpbmVGdW5jKHBvaW50cykpOwogICAgICAgIGxldCBtYXJrZXJXaWR0aCA9ICttYXJrZXIuYXR0cignbWFya2VyV2lkdGgnKTsKICAgICAgICBsZXQgdmlld0JveCA9IG1hcmtlci5hdHRyKCd2aWV3Qm94Jykuc3BsaXQoJyAnKS5tYXAoTnVtYmVyKTsKICAgICAgICBsZXQgdmlld0JveFdpZHRoID0gdmlld0JveFsyXSAtIHZpZXdCb3hbMF07CiAgICAgICAgbGV0IHJlZlggPSArbWFya2VyLmF0dHIoJ3JlZlgnKTsKICAgICAgICBsZXQgcGF0aE5vZGUgPSBwYXRoLm5vZGUoKTsKICAgICAgICBpZiAoaXNTdGFydCkgewogICAgICAgICAgICAvLyBUaGUgZWRnZSBmbG93cyBkb3dud2FyZHMuIERvIG5vdCBtYWtlIHRoZSBlZGdlIGdvIHRoZSB3aG9sZSB3YXksIGxlc3Qgd2UKICAgICAgICAgICAgLy8gY2xvYmJlciB0aGUgYXJyb3doZWFkLgogICAgICAgICAgICBjb25zdCBmcmFjdGlvblN0aWNraW5nT3V0ID0gMSAtIHJlZlggLyB2aWV3Qm94V2lkdGg7CiAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IG1hcmtlcldpZHRoICogZnJhY3Rpb25TdGlja2luZ091dDsKICAgICAgICAgICAgY29uc3QgcG9pbnQgPSBwYXRoTm9kZS5nZXRQb2ludEF0TGVuZ3RoKGxlbmd0aCk7CiAgICAgICAgICAgIC8vIEZpZ3VyZSBvdXQgaG93IG1hbnkgc2VnbWVudHMgb2YgdGhlIHBhdGggd2UgbmVlZCB0byByZW1vdmUgaW4gb3JkZXIKICAgICAgICAgICAgLy8gdG8gc2hvcnRlbiB0aGUgcGF0aC4KICAgICAgICAgICAgY29uc3Qgc2VnSW5kZXggPSBnZXRQYXRoU2VnbWVudEluZGV4QXRMZW5ndGgocG9pbnRzLCBsZW5ndGgsIGxpbmVGdW5jKTsKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB2ZXJ5IGZpcnN0IHNlZ21lbnQuCiAgICAgICAgICAgIHBvaW50c1tzZWdJbmRleCAtIDFdID0geyB4OiBwb2ludC54LCB5OiBwb2ludC55IH07CiAgICAgICAgICAgIC8vIElnbm9yZSBldmVyeSBwb2ludCBiZWZvcmUgc2VnSW5kZXggLSAxLgogICAgICAgICAgICByZXR1cm4gcG9pbnRzLnNsaWNlKHNlZ0luZGV4IC0gMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUaGUgZWRnZSBmbG93cyB1cHdhcmRzLiBEbyBub3QgbWFrZSB0aGUgZWRnZSBnbyB0aGUgd2hvbGUgd2F5LCBsZXN0IHdlCiAgICAgICAgICAgIC8vIGNsb2JiZXIgdGhlIGFycm93aGVhZC4KICAgICAgICAgICAgY29uc3QgZnJhY3Rpb25TdGlja2luZ091dCA9IDEgLSByZWZYIC8gdmlld0JveFdpZHRoOwogICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXRoTm9kZS5nZXRUb3RhbExlbmd0aCgpIC0gbWFya2VyV2lkdGggKiBmcmFjdGlvblN0aWNraW5nT3V0OwogICAgICAgICAgICBjb25zdCBwb2ludCA9IHBhdGhOb2RlLmdldFBvaW50QXRMZW5ndGgobGVuZ3RoKTsKICAgICAgICAgICAgLy8gRmlndXJlIG91dCBob3cgbWFueSBzZWdtZW50cyBvZiB0aGUgcGF0aCB3ZSBuZWVkIHRvIHJlbW92ZSBpbiBvcmRlcgogICAgICAgICAgICAvLyB0byBzaG9ydGVuIHRoZSBwYXRoLgogICAgICAgICAgICBjb25zdCBzZWdJbmRleCA9IGdldFBhdGhTZWdtZW50SW5kZXhBdExlbmd0aChwb2ludHMsIGxlbmd0aCwgbGluZUZ1bmMpOwogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHZlcnkgbGFzdCBzZWdtZW50LgogICAgICAgICAgICBwb2ludHNbc2VnSW5kZXhdID0geyB4OiBwb2ludC54LCB5OiBwb2ludC55IH07CiAgICAgICAgICAgIC8vIElnbm9yZSBldmVyeSBwb2ludCBhZnRlciBzZWdJbmRleC4KICAgICAgICAgICAgcmV0dXJuIHBvaW50cy5zbGljZSgwLCBzZWdJbmRleCArIDEpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRm9yIGEgZ2l2ZW4gZDMgc2VsZWN0aW9uIGFuZCBkYXRhIG9iamVjdCwgY3JlYXRlIGEgcGF0aCB0byByZXByZXNlbnQgdGhlCiAgICAgKiBlZGdlIGRlc2NyaWJlZCBpbiBkLmxhYmVsLgogICAgICoKICAgICAqIElmIGQubGFiZWwgaXMgZGVmaW5lZCwgaXQgd2lsbCBiZSBhIFJlbmRlck1ldGFlZGdlSW5mbyBpbnN0YW5jZS4gSXQKICAgICAqIHdpbGwgc29tZXRpbWVzIGJlIHVuZGVmaW5lZCwgZm9yIGV4YW1wbGUgZm9yIHNvbWUgQW5ub3RhdGlvbiBlZGdlcyBmb3Igd2hpY2gKICAgICAqIHRoZXJlIGlzIG5vIHVuZGVybHlpbmcgTWV0YWVkZ2UgaW4gdGhlIGhpZXJhcmNoaWNhbCBncmFwaC4KICAgICAqLwogICAgZnVuY3Rpb24gYXBwZW5kRWRnZShlZGdlR3JvdXAsIGQsIHNjZW5lRWxlbWVudCwgZWRnZUNsYXNzKSB7CiAgICAgICAgZWRnZUNsYXNzID0gZWRnZUNsYXNzIHx8IENsYXNzJDEuRWRnZS5MSU5FOyAvLyBzZXQgZGVmYXVsdCB0eXBlCiAgICAgICAgaWYgKGQubGFiZWwgJiYgZC5sYWJlbC5zdHJ1Y3R1cmFsKSB7CiAgICAgICAgICAgIGVkZ2VDbGFzcyArPSAnICcgKyBDbGFzcyQxLkVkZ2UuU1RSVUNUVVJBTDsKICAgICAgICB9CiAgICAgICAgaWYgKGQubGFiZWwgJiYgZC5sYWJlbC5tZXRhZWRnZSAmJiBkLmxhYmVsLm1ldGFlZGdlLm51bVJlZkVkZ2VzKSB7CiAgICAgICAgICAgIGVkZ2VDbGFzcyArPSAnICcgKyBDbGFzcyQxLkVkZ2UuUkVGRVJFTkNFX0VER0U7CiAgICAgICAgfQogICAgICAgIGlmIChzY2VuZUVsZW1lbnQuaGFuZGxlRWRnZVNlbGVjdGVkKSB7CiAgICAgICAgICAgIC8vIFRoZSB1c2VyIGhhcyBvcHRlZCB0byBtYWtlIGVkZ2VzIHNlbGVjdGFibGUuCiAgICAgICAgICAgIGVkZ2VDbGFzcyArPSAnICcgKyBDbGFzcyQxLkVkZ2UuU0VMRUNUQUJMRTsKICAgICAgICB9CiAgICAgICAgLy8gR2l2ZSB0aGUgcGF0aCBhIHVuaXF1ZSBpZCwgd2hpY2ggd2lsbCBiZSB1c2VkIHRvIGxpbmsKICAgICAgICAvLyB0aGUgdGV4dFBhdGggKGVkZ2UgbGFiZWwpIHRvIHRoaXMgcGF0aC4KICAgICAgICBsZXQgcGF0aElkID0gJ3BhdGhfJyArIGdldEVkZ2VLZXkoZCk7CiAgICAgICAgbGV0IHN0cm9rZVdpZHRoOwogICAgICAgIGlmIChzY2VuZUVsZW1lbnQucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIC8vIENvbXB1dGUgZWRnZSB0aGlja25lc3MgYmFzZWQgb24gdGhlIHVzZXItc3BlY2lmaWVkIG1ldGhvZC4KICAgICAgICAgICAgc3Ryb2tlV2lkdGggPSBzY2VuZUVsZW1lbnQucmVuZGVySGllcmFyY2h5LmVkZ2VXaWR0aEZ1bmN0aW9uKGQsIGVkZ2VDbGFzcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBFbmNvZGUgdGVuc29yIHNpemUgd2l0aGluIGVkZ2UgdGhpY2tuZXNzLgogICAgICAgICAgICBsZXQgc2l6ZSA9IDE7CiAgICAgICAgICAgIGlmIChkLmxhYmVsICE9IG51bGwgJiYgZC5sYWJlbC5tZXRhZWRnZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbiB1bmRlcmx5aW5nIE1ldGFlZGdlLgogICAgICAgICAgICAgICAgc2l6ZSA9IGQubGFiZWwubWV0YWVkZ2UudG90YWxTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0cm9rZVdpZHRoID0gc2NlbmVFbGVtZW50LnJlbmRlckhpZXJhcmNoeS5lZGdlV2lkdGhTaXplZEJhc2VkU2NhbGUoc2l6ZSk7CiAgICAgICAgfQogICAgICAgIGxldCBwYXRoID0gZWRnZUdyb3VwCiAgICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKQogICAgICAgICAgICAuYXR0cignaWQnLCBwYXRoSWQpCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIGVkZ2VDbGFzcykKICAgICAgICAgICAgLnN0eWxlKCdzdHJva2Utd2lkdGgnLCBzdHJva2VXaWR0aCArICdweCcpOwogICAgICAgIC8vIENoZWNrIGlmIHRoZXJlIGlzIGEgcmVmZXJlbmNlIGVkZ2UgYW5kIGFkZCBhbiBhcnJvd2hlYWQgb2YgdGhlIHJpZ2h0IHNpemUuCiAgICAgICAgaWYgKGQubGFiZWwgJiYgZC5sYWJlbC5tZXRhZWRnZSkgewogICAgICAgICAgICBpZiAoZC5sYWJlbC5tZXRhZWRnZS5udW1SZWZFZGdlcykgewogICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHJlZmVyZW5jZSBlZGdlLgogICAgICAgICAgICAgICAgY29uc3QgbWFya2VySWQgPSBgcmVmZXJlbmNlLWFycm93aGVhZC0ke2Fycm93aGVhZE1hcChzdHJva2VXaWR0aCl9YDsKICAgICAgICAgICAgICAgIHBhdGguc3R5bGUoJ21hcmtlci1zdGFydCcsIGB1cmwoIyR7bWFya2VySWR9KWApOwogICAgICAgICAgICAgICAgZC5sYWJlbC5zdGFydE1hcmtlcklkID0gbWFya2VySWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgZGF0YWZsb3cgZWRnZS4KICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlcklkID0gYGRhdGFmbG93LWFycm93aGVhZC0ke2Fycm93aGVhZE1hcChzdHJva2VXaWR0aCl9YDsKICAgICAgICAgICAgICAgIHBhdGguc3R5bGUoJ21hcmtlci1lbmQnLCBgdXJsKCMke21hcmtlcklkfSlgKTsKICAgICAgICAgICAgICAgIGQubGFiZWwuZW5kTWFya2VySWQgPSBtYXJrZXJJZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoZC5sYWJlbCA9PSBudWxsIHx8IGQubGFiZWwubWV0YWVkZ2UgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBhc3NvY2lhdGVkIG1ldGFlZGdlLCB0aHVzIG5vIHRleHQuCiAgICAgICAgICAgIC8vIFRoaXMgaGFwcGVucyBmb3IgYW5ub3RhdGlvbiBlZGdlcy4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgbGFiZWxGb3JFZGdlID0gZ2V0TGFiZWxGb3JFZGdlKGQubGFiZWwubWV0YWVkZ2UsIHNjZW5lRWxlbWVudC5yZW5kZXJIaWVyYXJjaHkpOwogICAgICAgIGlmIChsYWJlbEZvckVkZ2UgPT0gbnVsbCkgewogICAgICAgICAgICAvLyBXZSBoYXZlIG5vIGluZm9ybWF0aW9uIHRvIHNob3cgb24gdGhpcyBlZGdlLgogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGVkZ2VHcm91cAogICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgLmFwcGVuZCgndGV4dFBhdGgnKQogICAgICAgICAgICAuYXR0cigneGxpbms6aHJlZicsICcjJyArIHBhdGhJZCkKICAgICAgICAgICAgLmF0dHIoJ3N0YXJ0T2Zmc2V0JywgJzUwJScpCiAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAuYXR0cignZG9taW5hbnQtYmFzZWxpbmUnLCAnY2VudHJhbCcpCiAgICAgICAgICAgIC50ZXh0KGxhYmVsRm9yRWRnZSk7CiAgICB9CiAgICBsZXQgaW50ZXJwb2xhdGUkNyA9IGxpbmUoKQogICAgICAgIC5jdXJ2ZShiYXNpcyQyKQogICAgICAgIC54KChkKSA9PiB7CiAgICAgICAgcmV0dXJuIGQueDsKICAgIH0pCiAgICAgICAgLnkoKGQpID0+IHsKICAgICAgICByZXR1cm4gZC55OwogICAgfSk7CiAgICAvKioKICAgICAqIFJldHVybnMgYSB0d2VlbiBpbnRlcnBvbGF0b3IgZm9yIHRoZSBlbmRwb2ludCBvZiBhbiBlZGdlIHBhdGguCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEVkZ2VQYXRoSW50ZXJwb2xhdG9yKGNvbXBvbmVudCwgcmVuZGVyUGF0aCwgZCwgaSwgYSkgewogICAgICAgIGxldCByZW5kZXJNZXRhZWRnZUluZm8gPSBkLmxhYmVsOwogICAgICAgIGxldCBhZGpvaW5pbmdNZXRhZWRnZSA9IHJlbmRlck1ldGFlZGdlSW5mby5hZGpvaW5pbmdNZXRhZWRnZTsKICAgICAgICBsZXQgcG9pbnRzID0gcmVuZGVyTWV0YWVkZ2VJbmZvLnBvaW50czsKICAgICAgICAvLyBBZGp1c3QgdGhlIHBhdGggc28gdGhhdCBzdGFydC9lbmQgbWFya2VycyBwb2ludCB0byB0aGUgZW5kCiAgICAgICAgLy8gb2YgdGhlIHBhdGguCiAgICAgICAgY29uc3QgeyBzaGFkb3dSb290IH0gPSBjb21wb25lbnQ7CiAgICAgICAgaWYgKGQubGFiZWwuc3RhcnRNYXJrZXJJZCkgewogICAgICAgICAgICBwb2ludHMgPSBhZGp1c3RQYXRoUG9pbnRzRm9yTWFya2VyKHBvaW50cywgc2VsZWN0KHNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcignIycgKyBkLmxhYmVsLnN0YXJ0TWFya2VySWQpKSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmIChkLmxhYmVsLmVuZE1hcmtlcklkKSB7CiAgICAgICAgICAgIHBvaW50cyA9IGFkanVzdFBhdGhQb2ludHNGb3JNYXJrZXIocG9pbnRzLCBzZWxlY3Qoc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjJyArIGQubGFiZWwuZW5kTWFya2VySWQpKSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBpZiAoIWFkam9pbmluZ01ldGFlZGdlKSB7CiAgICAgICAgICAgIHJldHVybiBpbnRlcnBvbGF0ZVZhbHVlKGEsIGludGVycG9sYXRlJDcocG9pbnRzKSk7CiAgICAgICAgfQogICAgICAgIC8vIEdldCB0aGUgYWRqb2luaW5nIHBhdGggdGhhdCBtYXRjaGVzIHRoZSBhZGpvaW5pbmcgbWV0YWVkZ2UuCiAgICAgICAgbGV0IGFkam9pbmluZ1BhdGggPSAoYWRqb2luaW5nTWV0YWVkZ2UuZWRnZUdyb3VwLm5vZGUoKS5maXJzdENoaWxkKTsKICAgICAgICAvLyBGaW5kIHRoZSBkZXNpcmVkIFNWR1BvaW50IGFsb25nIHRoZSBhZGpvaW5pbmcgcGF0aCwgdGhlbiBjb252ZXJ0IHRob3NlCiAgICAgICAgLy8gY29vcmRpbmF0ZXMgaW50byB0aGUgc3BhY2Ugb2YgdGhlIHJlbmRlclBhdGggdXNpbmcgaXRzIEN1cnJlbnQKICAgICAgICAvLyBUcmFuc2Zvcm1hdGlvbiBNYXRyaXggKENUTSkuCiAgICAgICAgbGV0IGluYm91bmQgPSByZW5kZXJNZXRhZWRnZUluZm8ubWV0YWVkZ2UuaW5ib3VuZDsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gKHQpIHsKICAgICAgICAgICAgbGV0IGFkam9pbmluZ1BvaW50ID0gYWRqb2luaW5nUGF0aAogICAgICAgICAgICAgICAgLmdldFBvaW50QXRMZW5ndGgoaW5ib3VuZCA/IGFkam9pbmluZ1BhdGguZ2V0VG90YWxMZW5ndGgoKSA6IDApCiAgICAgICAgICAgICAgICAubWF0cml4VHJhbnNmb3JtKGFkam9pbmluZ1BhdGguZ2V0Q1RNKCkpCiAgICAgICAgICAgICAgICAubWF0cml4VHJhbnNmb3JtKHJlbmRlclBhdGguZ2V0Q1RNKCkuaW52ZXJzZSgpKTsKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZWxldmFudCBwb2ludCBpbiB0aGUgcmVuZGVyTWV0YWVkZ2VJbmZvJ3MgcG9pbnRzIGxpc3QsIHRoZW4KICAgICAgICAgICAgLy8gcmUtaW50ZXJwb2xhdGUgdGhlIHBhdGguCiAgICAgICAgICAgIGxldCBpbmRleCA9IGluYm91bmQgPyAwIDogcG9pbnRzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIHBvaW50c1tpbmRleF0ueCA9IGFkam9pbmluZ1BvaW50Lng7CiAgICAgICAgICAgIHBvaW50c1tpbmRleF0ueSA9IGFkam9pbmluZ1BvaW50Lnk7CiAgICAgICAgICAgIGxldCBkUGF0aCA9IGludGVycG9sYXRlJDcocG9pbnRzKTsKICAgICAgICAgICAgcmV0dXJuIGRQYXRoOwogICAgICAgIH07CiAgICB9CiAgICBmdW5jdGlvbiBwb3NpdGlvbiQyKGNvbXBvbmVudCwgZWRnZUdyb3VwKSB7CiAgICAgICAgc2VsZWN0KGVkZ2VHcm91cCkKICAgICAgICAgICAgLnNlbGVjdCgncGF0aC4nICsgQ2xhc3MkMS5FZGdlLkxJTkUpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHJUd2VlbignZCcsIGZ1bmN0aW9uIChkLCBpLCBhKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRFZGdlUGF0aEludGVycG9sYXRvcihjb21wb25lbnQsIHRoaXMsIGQsIGksIGEpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBGb3IgYSBnaXZlbiBkMyBzZWxlY3Rpb24gYW5kIGRhdGEgb2JqZWN0LCBtYXJrIHRoZSBlZGdlIGFzIGEgY29udHJvbAogICAgICogZGVwZW5kZW5jeSBpZiBpdCBjb250YWlucyBvbmx5IGNvbnRyb2wgZWRnZXMuCiAgICAgKgogICAgICogZCdzIGxhYmVsIHByb3BlcnR5IHdpbGwgYmUgYSBSZW5kZXJNZXRhZWRnZUluZm8gb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBzdHlsaXplKGVkZ2VHcm91cCwgZCwgc3R5bGl6ZSkgewogICAgICAgIGVkZ2VHcm91cC5jbGFzc2VkKCdmYWRlZCcsIGQubGFiZWwuaXNGYWRlZE91dCk7CiAgICAgICAgbGV0IG1ldGFlZGdlID0gZC5sYWJlbC5tZXRhZWRnZTsKICAgICAgICBlZGdlR3JvdXAKICAgICAgICAgICAgLnNlbGVjdCgncGF0aC4nICsgQ2xhc3MkMS5FZGdlLkxJTkUpCiAgICAgICAgICAgIC5jbGFzc2VkKCdjb250cm9sLWRlcCcsIG1ldGFlZGdlICYmICFtZXRhZWRnZS5udW1SZWd1bGFyRWRnZXMpOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE1IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBTZWxlY3Qgb3IgQ3JlYXRlIGEgJ2cubm9kZXMnIGdyb3VwIHRvIGEgZ2l2ZW4gc2NlbmVHcm91cAogICAgICogYW5kIGJ1aWxkcyBhIG51bWJlciBvZiAnZy5ub2RlJyBncm91cHMgaW5zaWRlIHRoZSBncm91cC4KICAgICAqCiAgICAgKiBTdHJ1Y3R1cmUgUGF0dGVybjoKICAgICAqCiAgICAgKiA8ZyBjbGFzcz0nbm9kZXMnPgogICAgICogICA8ZyBjbGFzcz0nbm9kZSc+CiAgICAgKiAgICAgPGcgY2xhc3M9J2luLWFubm90YXRpb25zJz4KICAgICAqICAgICAgIC4uLgogICAgICogICAgIDwvZz4KICAgICAqICAgICA8ZyBjbGFzcz0nb3V0LWFubm90YXRpb25zJz4KICAgICAqICAgICAgIC4uLgogICAgICogICAgIDwvZz4KICAgICAqICAgICA8ZyBjbGFzcz0nbm9kZXNoYXBlJz4KICAgICAqICAgICAgPCEtLQogICAgICogICAgICBDb250ZW50IG9mIHRoZSBub2RlIHNoYXBlIHNob3VsZCBiZSBmb3IgdGhlIG5vZGUgaXRzZWxmLiBGb3IgZXhhbXBsZSBhCiAgICAgKiAgICAgIE1ldGFub2RlIHdvdWxkIGhhdmUgYSA8cmVjdD4gd2l0aCByb3VuZGVkIGVkZ2VzLCBhbiBvcCB3b3VsZCBoYXZlIGFuCiAgICAgKiAgICAgIDxlbGxpcHNlPi4gTW9yZSBjb21wbGV4IG5vZGVzIGxpa2Ugc2VyaWVzIG1heSBjb250YWluIG11bHRpcGxlCiAgICAgKiAgICAgIGVsZW1lbnRzIHdoaWNoIGFyZSBjb25kaXRpb25hbGx5IHZpc2libGUgYmFzZWQgb24gd2hldGhlciB0aGUgbm9kZSBpcwogICAgICogICAgICBleHBhbmRlZC4KICAgICAqICAgICAgLS0+CiAgICAgKiAgICAgPC9nPgogICAgICogICAgIDx0ZXh0IGNsYXNzPSdsYWJlbCc+bm9kZSBuYW1lPC90ZXh0PgogICAgICogICAgIDxnIGNsYXNzPSdzdWJzY2VuZSc+CiAgICAgKiAgICAgICA8IS0tCiAgICAgKiAgICAgICBDb250ZW50IG9mICB0aGUgc3Vic2NlbmUgKG9ubHkgZm9yIG1ldGFub2RlIGFuZCBzZXJpZXMgbm9kZSkuCiAgICAgKgogICAgICogICAgICAgU3Vic2NlbmUgaXMgYSBzdmcgZ3JvdXAgdGhhdCBjb250YWlucyBjb250ZW50IG9mIHRoZQogICAgICogICAgICAgbWV0YW5vZGUncyBtZXRhZ3JhcGggdGhhdCBpcyByZWN1cnNpdmVseSBnZW5lcmF0ZWQgYnkgU2NlbmUuYnVpbGQoKS4KICAgICAqCiAgICAgKiAgICAgICBXaGVuIHRoZSBncmFwaCBpcyBleHBhbmRlZCBtdWx0aXBsZSB0aW1lcywgYSBzdWJzY2VuZSBjYW4gY29udGFpbgogICAgICogICAgICAgbmVzdGVkIHN1YnNjZW5lcyBpbnNpZGUuCiAgICAgKiAgICAgICAtLT4KICAgICAqICAgICA8L2c+CiAgICAgKiAgIDwvZz4KICAgICAqICAgLi4uCiAgICAgKiA8L2c+CiAgICAgKgogICAgICoKICAgICAqIEBwYXJhbSBzY2VuZUdyb3VwIHNlbGVjdGlvbiBvZiB0aGUgY29udGFpbmVyCiAgICAgKiBAcGFyYW0gbm9kZURhdGEgYXJyYXkgb2YgcmVuZGVyIG5vZGUgaW5mb3JtYXRpb24gdG8gbWFwCiAgICAgKiBAcGFyYW0gc2NlbmVFbGVtZW50IDx0Zi1ncmFwaC1zY2VuZT4gcG9seW1lciBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHNlbGVjdGlvbiBvZiB0aGUgY3JlYXRlZCBub2RlR3JvdXBzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkR3JvdXAkMShzY2VuZUdyb3VwLCBub2RlRGF0YSwgc2NlbmVFbGVtZW50KSB7CiAgICAgICAgbGV0IGNvbnRhaW5lciA9IHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2NlbmVHcm91cCwgJ2cnLCBDbGFzcyQxLk5vZGUuQ09OVEFJTkVSKTsKICAgICAgICAvLyBTZWxlY3QgYWxsIGNoaWxkcmVuIGFuZCBqb2luIHdpdGggZGF0YS4KICAgICAgICAvLyAoTm90ZSB0aGF0IGFsbCBjaGlsZHJlbiBvZiBnLm5vZGVzIGFyZSBnLm5vZGUpCiAgICAgICAgbGV0IG5vZGVHcm91cHMgPSBjb250YWluZXIKICAgICAgICAgICAgLnNlbGVjdEFsbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoaWxkTm9kZXM7CiAgICAgICAgfSkKICAgICAgICAgICAgLmRhdGEobm9kZURhdGEsIChkKSA9PiB7CiAgICAgICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgdG8gc3dhcCBzaGFwZSB0eXBlCiAgICAgICAgICAgIHJldHVybiBkLm5vZGUubmFtZSArICc6JyArIGQubm9kZS50eXBlOwogICAgICAgIH0pOwogICAgICAgIC8vIEVOVEVSCiAgICAgICAgbm9kZUdyb3VwcwogICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgLmF0dHIoJ2RhdGEtbmFtZScsIChkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBkLm5vZGUubmFtZTsKICAgICAgICB9KQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBsZXQgbm9kZUdyb3VwID0gc2VsZWN0KHRoaXMpOwogICAgICAgICAgICAvLyBpbmRleCBub2RlIGdyb3VwIGZvciBxdWljayBzdHlsaXppbmcKICAgICAgICAgICAgc2NlbmVFbGVtZW50LmFkZE5vZGVHcm91cChkLm5vZGUubmFtZSwgbm9kZUdyb3VwKTsKICAgICAgICB9KQogICAgICAgICAgICAubWVyZ2Uobm9kZUdyb3VwcykKICAgICAgICAgICAgLy8gRU5URVIgKyBVUERBVEUKICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgKGQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIENsYXNzJDEuTm9kZS5HUk9VUCArICcgJyArIG5vZGVDbGFzcyhkKTsKICAgICAgICB9KQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICBsZXQgbm9kZUdyb3VwID0gc2VsZWN0KHRoaXMpOwogICAgICAgICAgICAvLyBBZGQgZy5pbi1hbm5vdGF0aW9ucyAoYWx3YXlzIGFkZCAtLSB0byBrZWVwIGxheWVyIG9yZGVyCiAgICAgICAgICAgIC8vIGNvbnNpc3RlbnQuKQogICAgICAgICAgICBsZXQgaW5Bbm5vdGF0aW9uQm94ID0gc2VsZWN0T3JDcmVhdGVDaGlsZChub2RlR3JvdXAsICdnJywgQ2xhc3MkMS5Bbm5vdGF0aW9uLklOQk9YKTsKICAgICAgICAgICAgYnVpbGRHcm91cEZvckFubm90YXRpb24oaW5Bbm5vdGF0aW9uQm94LCBkLmluQW5ub3RhdGlvbnMsIGQsIHNjZW5lRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEFkZCBnLm91dC1hbm5vdGF0aW9ucyAgKGFsd2F5cyBhZGQgLS0gdG8ga2VlcCBsYXllciBvcmRlcgogICAgICAgICAgICAvLyBjb25zaXN0ZW50LikKICAgICAgICAgICAgbGV0IG91dEFubm90YXRpb25Cb3ggPSBzZWxlY3RPckNyZWF0ZUNoaWxkKG5vZGVHcm91cCwgJ2cnLCBDbGFzcyQxLkFubm90YXRpb24uT1VUQk9YKTsKICAgICAgICAgICAgYnVpbGRHcm91cEZvckFubm90YXRpb24ob3V0QW5ub3RhdGlvbkJveCwgZC5vdXRBbm5vdGF0aW9ucywgZCwgc2NlbmVFbGVtZW50KTsKICAgICAgICAgICAgLy8gQnVpbGQgLnNoYXBlIGZpcnN0IChiYWNrZ3JvdW5kIG9mIHRoZSBub2RlKS4KICAgICAgICAgICAgbGV0IHNoYXBlID0gYnVpbGRTaGFwZShub2RlR3JvdXAsIGQsIENsYXNzJDEuTm9kZS5TSEFQRSk7CiAgICAgICAgICAgIGlmIChkLm5vZGUuaXNHcm91cE5vZGUpIHsKICAgICAgICAgICAgICAgIGFkZEJ1dHRvbihzaGFwZSwgZCwgc2NlbmVFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhZGRJbnRlcmFjdGlvbihzaGFwZSwgZCwgc2NlbmVFbGVtZW50KTsKICAgICAgICAgICAgLy8gQnVpbGQgc3Vic2NlbmUgb24gdGhlIHRvcC4KICAgICAgICAgICAgc3Vic2NlbmVCdWlsZChub2RlR3JvdXAsIGQsIHNjZW5lRWxlbWVudCk7CiAgICAgICAgICAgIC8vIEJ1aWxkIGxhYmVsIGxhc3QuIFNob3VsZCBiZSBvbiB0b3Agb2YgZXZlcnl0aGluZyBlbHNlLgogICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbEJ1aWxkKG5vZGVHcm91cCwgZCwgc2NlbmVFbGVtZW50KTsKICAgICAgICAgICAgLy8gRG8gbm90IGFkZCBpbnRlcmFjdGlvbiB0byBtZXRhbm9kZSBsYWJlbHMgYXMgdGhleSBsaXZlIGluc2lkZSB0aGUKICAgICAgICAgICAgLy8gbWV0YW5vZGUgc2hhcGUgd2hpY2ggYWxyZWFkeSBoYXMgdGhlIHNhbWUgaW50ZXJhY3Rpb25zLgogICAgICAgICAgICBhZGRJbnRlcmFjdGlvbihsYWJlbCwgZCwgc2NlbmVFbGVtZW50LCBkLm5vZGUudHlwZSA9PT0gTm9kZVR5cGUuTUVUQSk7CiAgICAgICAgICAgIHN0eWxpemUkMShub2RlR3JvdXAsIGQsIHNjZW5lRWxlbWVudCk7CiAgICAgICAgICAgIHBvc2l0aW9uJDMobm9kZUdyb3VwLCBkKTsKICAgICAgICB9KTsKICAgICAgICAvLyBFWElUCiAgICAgICAgbm9kZUdyb3VwcwogICAgICAgICAgICAuZXhpdCgpCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgIC8vIHJlbW92ZSBhbGwgaW5kaWNlcyBvbiByZW1vdmUKICAgICAgICAgICAgc2NlbmVFbGVtZW50LnJlbW92ZU5vZGVHcm91cChkLm5vZGUubmFtZSk7CiAgICAgICAgICAgIGxldCBub2RlR3JvdXAgPSBzZWxlY3QodGhpcyk7CiAgICAgICAgICAgIGlmIChkLmluQW5ub3RhdGlvbnMubGlzdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBub2RlR3JvdXAKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCcuJyArIENsYXNzJDEuQW5ub3RhdGlvbi5JTkJPWCkKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuJyArIENsYXNzJDEuQW5ub3RhdGlvbi5HUk9VUCkKICAgICAgICAgICAgICAgICAgICAuZWFjaCgoYSkgPT4gewogICAgICAgICAgICAgICAgICAgIHNjZW5lRWxlbWVudC5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoYSwgZCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZC5vdXRBbm5vdGF0aW9ucy5saXN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIG5vZGVHcm91cAogICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoJy4nICsgQ2xhc3MkMS5Bbm5vdGF0aW9uLk9VVEJPWCkKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuJyArIENsYXNzJDEuQW5ub3RhdGlvbi5HUk9VUCkKICAgICAgICAgICAgICAgICAgICAuZWFjaCgoYSkgPT4gewogICAgICAgICAgICAgICAgICAgIHNjZW5lRWxlbWVudC5yZW1vdmVBbm5vdGF0aW9uR3JvdXAoYSwgZCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pCiAgICAgICAgICAgIC5yZW1vdmUoKTsKICAgICAgICByZXR1cm4gbm9kZUdyb3VwczsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIG9yIHJlbW92ZSB0aGUgc3Vic2NlbmUgb2YgYSByZW5kZXIgZ3JvdXAgbm9kZSBkZXBlbmRpbmcgb24gd2hldGhlciBpdAogICAgICogaXMgYSBleHBhbmRlZC4gSWYgdGhlIG5vZGUgaXMgbm90IGEgZ3JvdXAgbm9kZSwgdGhpcyBtZXRob2QgaGFzIG5vIGVmZmVjdC4KICAgICAqCiAgICAgKiBAcGFyYW0gbm9kZUdyb3VwIHNlbGVjdGlvbiBvZiB0aGUgY29udGFpbmVyCiAgICAgKiBAcGFyYW0gcmVuZGVyTm9kZUluZm8gdGhlIHJlbmRlciBpbmZvcm1hdGlvbiBmb3IgdGhlIG5vZGUuCiAgICAgKiBAcGFyYW0gc2NlbmVFbGVtZW50IDx0Zi1ncmFwaC1zY2VuZT4gcG9seW1lciBlbGVtZW50LgogICAgICogQHJldHVybiBTZWxlY3Rpb24gb2YgdGhlIHN1YnNjZW5lIGdyb3VwLCBvciBudWxsIGlmIG5vZGUgZ3JvdXAgZG9lcyBub3QgaGF2ZQogICAgICogICAgICAgIGEgc3Vic2NlbmUuIE9wIG5vZGVzLCBicmlkZ2Ugbm9kZXMgYW5kIHVuZXhwYW5kZWQgZ3JvdXAgbm9kZXMgd2lsbAogICAgICogICAgICAgIG5vdCBoYXZlIGEgc3Vic2NlbmUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1YnNjZW5lQnVpbGQobm9kZUdyb3VwLCByZW5kZXJOb2RlSW5mbywgc2NlbmVFbGVtZW50KSB7CiAgICAgICAgaWYgKHJlbmRlck5vZGVJbmZvLm5vZGUuaXNHcm91cE5vZGUpIHsKICAgICAgICAgICAgaWYgKHJlbmRlck5vZGVJbmZvLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBidWlsZCB0aGUgc3Vic2NlbmUuCiAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRHcm91cEZvclNjZW5lKG5vZGVHcm91cCwgcmVuZGVyTm9kZUluZm8sIHNjZW5lRWxlbWVudCwgQ2xhc3MkMS5TdWJzY2VuZS5HUk9VUCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2xlYW4gb3V0IGV4aXN0aW5nIHN1YnNjZW5lIGlmIHRoZSBub2RlIGlzIG5vdCBleHBhbmRlZC4KICAgICAgICAgICAgc2VsZWN0Q2hpbGQkMShub2RlR3JvdXAsICdnJywgQ2xhc3MkMS5TdWJzY2VuZS5HUk9VUCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBUcmFuc2xhdGUgdGhlIHN1YnNjZW5lIG9mIHRoZSBnaXZlbiBub2RlIGdyb3VwCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1YnNjZW5lUG9zaXRpb24obm9kZUdyb3VwLCBkKSB7CiAgICAgICAgbGV0IHgwID0gZC54IC0gZC53aWR0aCAvIDIgKyBkLnBhZGRpbmdMZWZ0OwogICAgICAgIGxldCB5MCA9IGQueSAtIGQuaGVpZ2h0IC8gMiArIGQucGFkZGluZ1RvcDsKICAgICAgICBsZXQgc3Vic2NlbmUgPSBzZWxlY3RDaGlsZCQxKG5vZGVHcm91cCwgJ2cnLCBDbGFzcyQxLlN1YnNjZW5lLkdST1VQKTsKICAgICAgICB0cmFuc2xhdGUkMShzdWJzY2VuZSwgeDAsIHkwKTsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGFuIGV4cGFuZC9jb2xsYXBzZSBidXR0b24gdG8gYSBncm91cCBub2RlCiAgICAgKgogICAgICogQHBhcmFtIHNlbGVjdGlvbiBUaGUgZ3JvdXAgbm9kZSBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0gZCBJbmZvIGFib3V0IHRoZSBub2RlIGJlaW5nIHJlbmRlcmVkLgogICAgICogQHBhcmFtIHNjZW5lRWxlbWVudCA8dGYtZ3JhcGgtc2NlbmU+IHBvbHltZXIgZWxlbWVudC4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkQnV0dG9uKHNlbGVjdGlvbiwgZCwgc2NlbmVFbGVtZW50KSB7CiAgICAgICAgbGV0IGdyb3VwID0gc2VsZWN0T3JDcmVhdGVDaGlsZChzZWxlY3Rpb24sICdnJywgQ2xhc3MkMS5Ob2RlLkJVVFRPTl9DT05UQUlORVIpOwogICAgICAgIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoZ3JvdXAsICdjaXJjbGUnLCBDbGFzcyQxLk5vZGUuQlVUVE9OX0NJUkNMRSk7CiAgICAgICAgc2VsZWN0T3JDcmVhdGVDaGlsZChncm91cCwgJ3BhdGgnLCBDbGFzcyQxLk5vZGUuRVhQQU5EX0JVVFRPTikKICAgICAgICAgICAgLmF0dHIoJ2QnLCAnTTAsLTIuMiBWMi4yIE0tMi4yLDAgSDIuMicpOwogICAgICAgIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoZ3JvdXAsICdwYXRoJywgQ2xhc3MkMS5Ob2RlLkNPTExBUFNFX0JVVFRPTikKICAgICAgICAgICAgLmF0dHIoJ2QnLCAnTS0yLjIsMCBIMi4yJyk7CiAgICAgICAgZ3JvdXAub24oJ2NsaWNrJywgKGQpID0+IHsKICAgICAgICAgICAgLy8gU3RvcCB0aGlzIGV2ZW50J3MgcHJvcGFnYXRpb24gc28gdGhhdCBpdCBpc24ndCBhbHNvIGNvbnNpZGVyZWQgYQogICAgICAgICAgICAvLyBub2RlLXNlbGVjdC4KICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHNjZW5lRWxlbWVudC5maXJlKCdub2RlLXRvZ2dsZS1leHBhbmQnLCB7IG5hbWU6IGQubm9kZS5uYW1lIH0pOwogICAgICAgIH0pOwogICAgICAgIHBvc2l0aW9uQnV0dG9uKGdyb3VwLCBkKTsKICAgIH0KICAgIC8qKgogICAgICogRmlyZSBub2RlLSogZXZlbnRzIHdoZW4gdGhlIHNlbGVjdGlvbiBpcyBpbnRlcmFjdGVkLgogICAgICoKICAgICAqIEBwYXJhbSBkaXNhYmxlSW50ZXJhY3Rpb24gV2hlbiB0cnVlLCBoYXZlIHRoZSBwcm92aWRlZCBzZWxlY3Rpb24KICAgICAqIGlnbm9yZSBhbGwgcG9pbnRlciBldmVudHMuIFVzZWQgZm9yIHRleHQgbGFiZWxzIGluc2lkZSBvZiBtZXRhbm9kZXMsIHdoaWNoCiAgICAgKiBkb24ndCBuZWVkIGludGVyYWN0aW9uIGFzIHRoZWlyIHN1cnJvdW5kaW5nIHNoYXBlIGhhcyBpbnRlcmFjdGlvbiwgYW5kIGlmCiAgICAgKiBnaXZlbiBpbnRlcmFjdGlvbiB3b3VsZCBjYXVzZSBjb25mbGljdHMgd2l0aCB0aGUgZXhwYW5kL2NvbGxhcHNlIGJ1dHRvbi4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkSW50ZXJhY3Rpb24oc2VsZWN0aW9uLCBkLCBzY2VuZUVsZW1lbnQsIGRpc2FibGVJbnRlcmFjdGlvbikgewogICAgICAgIGlmIChkaXNhYmxlSW50ZXJhY3Rpb24pIHsKICAgICAgICAgICAgc2VsZWN0aW9uLmF0dHIoJ3BvaW50ZXItZXZlbnRzJywgJ25vbmUnKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgY29udGV4dE1lbnVGdW5jdGlvbiA9IGdldE1lbnUoc2NlbmVFbGVtZW50LCBnZXRDb250ZXh0TWVudShkLm5vZGUsIHNjZW5lRWxlbWVudCkpOwogICAgICAgIHNlbGVjdGlvbgogICAgICAgICAgICAub24oJ2RibGNsaWNrJywgKGQpID0+IHsKICAgICAgICAgICAgc2NlbmVFbGVtZW50LmZpcmUoJ25vZGUtdG9nZ2xlLWV4cGFuZCcsIHsgbmFtZTogZC5ub2RlLm5hbWUgfSk7CiAgICAgICAgfSkKICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCAoZCkgPT4gewogICAgICAgICAgICAvLyBkb24ndCBzZW5kIG1vdXNlb3ZlciBvdmVyIGV4cGFuZGVkIGdyb3VwLAogICAgICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgY2F1c2luZyB0b28gbXVjaCBnbGl0Y2hlcwogICAgICAgICAgICBpZiAoc2NlbmVFbGVtZW50LmlzTm9kZUV4cGFuZGVkKGQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2NlbmVFbGVtZW50LmZpcmUoJ25vZGUtaGlnaGxpZ2h0JywgeyBuYW1lOiBkLm5vZGUubmFtZSB9KTsKICAgICAgICB9KQogICAgICAgICAgICAub24oJ21vdXNlb3V0JywgKGQpID0+IHsKICAgICAgICAgICAgLy8gZG9uJ3Qgc2VuZCBtb3VzZW92ZXIgb3ZlciBleHBhbmRlZCBncm91cCwKICAgICAgICAgICAgLy8gb3RoZXJ3aXNlIGl0IGlzIGNhdXNpbmcgdG9vIG11Y2ggZ2xpdGNoZXMKICAgICAgICAgICAgaWYgKHNjZW5lRWxlbWVudC5pc05vZGVFeHBhbmRlZChkKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjZW5lRWxlbWVudC5maXJlKCdub2RlLXVuaGlnaGxpZ2h0JywgeyBuYW1lOiBkLm5vZGUubmFtZSB9KTsKICAgICAgICB9KQogICAgICAgICAgICAub24oJ2NsaWNrJywgKGQpID0+IHsKICAgICAgICAgICAgLy8gU3RvcCB0aGlzIGV2ZW50J3MgcHJvcGFnYXRpb24gc28gdGhhdCBpdCBpc24ndCBhbHNvIGNvbnNpZGVyZWQKICAgICAgICAgICAgLy8gYSBncmFwaC1zZWxlY3QuCiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICBzY2VuZUVsZW1lbnQuZmlyZSgnbm9kZS1zZWxlY3QnLCB7IG5hbWU6IGQubm9kZS5uYW1lIH0pOwogICAgICAgIH0pCiAgICAgICAgICAgIC5vbignY29udGV4dG1lbnUnLCAoZCwgaSkgPT4gewogICAgICAgICAgICBzY2VuZUVsZW1lbnQuZmlyZSgnbm9kZS1zZWxlY3QnLCB7IG5hbWU6IGQubm9kZS5uYW1lIH0pOwogICAgICAgICAgICBjb250ZXh0TWVudUZ1bmN0aW9uLmNhbGwoZCwgaSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGQzIGNvbnRleHQgbWVudSBzcGVjaWZpY2F0aW9uIGZvciB0aGUgcHJvdmlkZWQgbm9kZS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q29udGV4dE1lbnUobm9kZSwgc2NlbmVFbGVtZW50KSB7CiAgICAgICAgbGV0IG1lbnUgPSBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHRpdGxlOiAoZCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRJbmNsdWRlTm9kZUJ1dHRvblN0cmluZyhub2RlLmluY2x1ZGUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFjdGlvbjogKGVsbSwgZCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgIHNjZW5lRWxlbWVudC5maXJlKCdub2RlLXRvZ2dsZS1leHRyYWN0JywgeyBuYW1lOiBub2RlLm5hbWUgfSk7CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICAgICAgaWYgKHNjZW5lRWxlbWVudC5ub2RlQ29udGV4dE1lbnVJdGVtcykgewogICAgICAgICAgICAvLyBBZGQgdGhlc2UgYWRkaXRpb25hbCBjb250ZXh0IG1lbnUgaXRlbXMuCiAgICAgICAgICAgIG1lbnUgPSBtZW51LmNvbmNhdChzY2VuZUVsZW1lbnQubm9kZUNvbnRleHRNZW51SXRlbXMpOwogICAgICAgIH0KICAgICAgICBpZiAoY2FuQmVJblNlcmllcyhub2RlKSkgewogICAgICAgICAgICBtZW51LnB1c2goewogICAgICAgICAgICAgICAgdGl0bGU6IChkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEdyb3VwU2V0dGluZ0xhYmVsKG5vZGUpOwogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGFjdGlvbjogKGVsbSwgZCwgaSkgPT4gewogICAgICAgICAgICAgICAgICAgIHNjZW5lRWxlbWVudC5maXJlKCdub2RlLXRvZ2dsZS1zZXJpZXNncm91cCcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogZ2V0U2VyaWVzTmFtZShub2RlKSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWVudTsKICAgIH0KICAgIC8qKiBSZXR1cm5zIGlmIGEgbm9kZSBjYW4gYmUgcGFydCBvZiBhIGdyb3VwZWQgc2VyaWVzICovCiAgICBmdW5jdGlvbiBjYW5CZUluU2VyaWVzKG5vZGUpIHsKICAgICAgICByZXR1cm4gZ2V0U2VyaWVzTmFtZShub2RlKSAhPT0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcG9zc2libGUgZ3JvdXBlZCBzZXJpZXMgY29udGFpbmluZyB0aGlzIG5vZGUuCiAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5vZGUgY2Fubm90IGJlIHBhcnQgb2YgYSBncm91cGVkIHNlcmllcyBvZiBub2Rlcy4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U2VyaWVzTmFtZShub2RlKSB7CiAgICAgICAgaWYgKCFub2RlKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAobm9kZS50eXBlID09PSBOb2RlVHlwZS5TRVJJRVMpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUubmFtZTsKICAgICAgICB9CiAgICAgICAgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuT1ApIHsKICAgICAgICAgICAgbGV0IG9wID0gbm9kZTsKICAgICAgICAgICAgcmV0dXJuIG9wLm93bmluZ1NlcmllczsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIFNlcmllc05vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzZXJpZXMgdGhhdCB0aGUgcHJvdmlkZWQgbm9kZQogICAgICogaXMgY29udGFpbmVkIGluIChvciBpdHNlbGYgaWYgdGhlIHByb3ZpZGVkIG5vZGUgaXMgaXRzZWxmIGEgU2VyaWVzTm9kZSkuCiAgICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIG5vZGUgaXMgbm90IHJlbmRlcmVkIGFzIHBhcnQgb2YgYSBzZXJpZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbnRhaW5pbmdTZXJpZXMobm9kZSkgewogICAgICAgIGxldCBzID0gbnVsbDsKICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuU0VSSUVTKSB7CiAgICAgICAgICAgIHMgPSBub2RlOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChub2RlLnBhcmVudE5vZGUgJiYgbm9kZS5wYXJlbnROb2RlLnR5cGUgPT09IE5vZGVUeXBlLlNFUklFUykgewogICAgICAgICAgICBzID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gczsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbGFiZWwgZm9yIGEgYnV0dG9uIHRvIHRvZ2dsZSB0aGUgZ3JvdXAgc2V0dGluZyBvZiB0aGUgcHJvdmlkZWQKICAgICAqIG5vZGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEdyb3VwU2V0dGluZ0xhYmVsKG5vZGUpIHsKICAgICAgICByZXR1cm4gZ2V0R3JvdXBTZXJpZXNOb2RlQnV0dG9uU3RyaW5nKGdldENvbnRhaW5pbmdTZXJpZXMobm9kZSkgIT09IG51bGwKICAgICAgICAgICAgPyBTZXJpZXNHcm91cGluZ1R5cGUuR1JPVVAKICAgICAgICAgICAgOiBTZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCk7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZCBzdmcgdGV4dCBmb3IgbGFiZWwgYW5kIGFzc2lnbiBkYXRhLgogICAgICogQHBhcmFtIG5vZGVHcm91cAogICAgICogQHBhcmFtIHJlbmRlck5vZGVJbmZvIFRoZSByZW5kZXIgbm9kZSBpbmZvcm1hdGlvbiBmb3IgdGhlIGxhYmVsLgogICAgICogQHBhcmFtIHNjZW5lRWxlbWVudCA8dGYtZ3JhcGgtc2NlbmU+IHBvbHltZXIgZWxlbWVudC4KICAgICAqLwogICAgZnVuY3Rpb24gbGFiZWxCdWlsZChub2RlR3JvdXAsIHJlbmRlck5vZGVJbmZvLCBzY2VuZUVsZW1lbnQpIHsKICAgICAgICBsZXQgdGV4dCA9IHJlbmRlck5vZGVJbmZvLmRpc3BsYXlOYW1lOwogICAgICAgIC8vIFRydW5jYXRlIGxvbmcgbGFiZWxzIGZvciB1bmV4cGFuZGVkIE1ldGFub2Rlcy4KICAgICAgICBsZXQgdXNlRm9udFNjYWxlID0gcmVuZGVyTm9kZUluZm8ubm9kZS50eXBlID09PSBOb2RlVHlwZS5NRVRBICYmICFyZW5kZXJOb2RlSW5mby5leHBhbmRlZDsKICAgICAgICBsZXQgbGFiZWwgPSBzZWxlY3RPckNyZWF0ZUNoaWxkKG5vZGVHcm91cCwgJ3RleHQnLCBDbGFzcyQxLk5vZGUuTEFCRUwpOwogICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgbGFiZWwgaXMgdmlzdWFsbHkgb24gdG9wIGFtb25nIGl0cyBzaWJsaW5ncy4KICAgICAgICBsZXQgbGFiZWxOb2RlID0gbGFiZWwubm9kZSgpOwogICAgICAgIGxhYmVsTm9kZS5wYXJlbnROb2RlLmFwcGVuZENoaWxkKGxhYmVsTm9kZSk7CiAgICAgICAgbGFiZWwuYXR0cignZHknLCAnLjM1ZW0nKS5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKTsKICAgICAgICBpZiAodXNlRm9udFNjYWxlKSB7CiAgICAgICAgICAgIGlmICh0ZXh0Lmxlbmd0aCA+IHNjZW5lRWxlbWVudC5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHIoMCwgc2NlbmVFbGVtZW50Lm1heE1ldGFub2RlTGFiZWxMZW5ndGggLSAyKSArICcuLi4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzY2FsZSA9IGdldExhYmVsRm9udFNjYWxlKHNjZW5lRWxlbWVudCk7CiAgICAgICAgICAgIGxhYmVsLmF0dHIoJ2ZvbnQtc2l6ZScsIHNjYWxlKHRleHQubGVuZ3RoKSArICdweCcpOwogICAgICAgIH0KICAgICAgICBsZXQgdHh0RWxlbWVudCA9IGxhYmVsLnRleHQodGV4dCk7CiAgICAgICAgZW5mb3JjZUxhYmVsV2lkdGgodHh0RWxlbWVudCwgcmVuZGVyTm9kZUluZm8ubm9kZS50eXBlLCByZW5kZXJOb2RlSW5mbyk7CiAgICAgICAgcmV0dXJuIGxhYmVsOwogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIHNob3J0ZW5zIHRleHQgd2hpY2ggd291bGQgZXhjZWVkIHRoZSBtYXhpbXVtIHBpeGVsIHdpZHRoIG9mCiAgICAgKiBhIGxhYmVsLgogICAgICoKICAgICAqIEBwYXJhbSB0eHRFbGVtZW50U2VsZWN0aW9uIFRoZSB0ZXh0IGVsZW1lbnQgY29udGFpbmluZyB0aGUgbGFiZWwncyB0ZXh0IGFzIGQzCiAgICAgKiBzZWxlY3Rpb24uCiAgICAgKiBAcGFyYW0gbm9kZVR5cGUgVGhlIHR5cGUgb2YgdGhlIG5vZGUgdGhlIGxhYmVsIGJlbG9uZ3MgdG8uIElmIHRoZSBub2RlIGlzCiAgICAgKiBhbiBhbm5vdGF0aW9uLCB0aGUgdmFsdWUgaXMgLTEuIExhYmVsIHdpZHRocyBhcmUgZGVmaW5lZCBpbgogICAgICogbGF5b3V0LlBBUkFNUy5ub2RlU2l6ZS57bWV0YXxvcHwuLi59Lm1heExhYmVsV2lkdGggZm9yIG5vZGVzIGFuZAogICAgICogbGF5b3V0LlBBUkFNUy5hbm5vdGF0aW9ucy5sYWJlbFdpZHRoIGZvciBhbm5vdGF0aW9ucy4KICAgICAqIEBwYXJhbSByZW5kZXJOb2RlSW5mbyBUaGUgcmVuZGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBub2RlLCByZXF1aXJlZCB0bwogICAgICogZGV0ZXJtaW5lIHdoZXRoZXIgTUVUQSBub2RlcyBhcmUgY29sbGFwc2VkIG9yIGV4cGFuZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBlbmZvcmNlTGFiZWxXaWR0aCh0eHRFbGVtZW50U2VsZWN0aW9uLCBub2RlVHlwZSwgcmVuZGVyTm9kZUluZm8pIHsKICAgICAgICAvLyBHZXQgdGV4dCBlbGVtZW50IGl0c2VsZiBhbmQgaXRzIG9uLXNjcmVlbiB3aWR0aC4KICAgICAgICBsZXQgdHh0Tm9kZSA9IHR4dEVsZW1lbnRTZWxlY3Rpb24ubm9kZSgpOwogICAgICAgIGxldCBjb21wdXRlZFR4dExlbmd0aCA9IHR4dE5vZGUuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7CiAgICAgICAgbGV0IGxhYmVsQ29udGVudCA9IHR4dE5vZGUudGV4dENvbnRlbnQ7CiAgICAgICAgLy8gR2V0IG1heGltdW0gbGVuZ3RoIGZyb20gc2V0dGluZ3MuCiAgICAgICAgbGV0IG1heExlbmd0aCA9IG51bGw7CiAgICAgICAgc3dpdGNoIChub2RlVHlwZSkgewogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6CiAgICAgICAgICAgICAgICBpZiAocmVuZGVyTm9kZUluZm8gJiYgIXJlbmRlck5vZGVJbmZvLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT25seSB0cmltIHRleHQgaWYKICAgICAgICAgICAgICAgICAgICAvLyBub2RlIGV4cGFuZGVkLgogICAgICAgICAgICAgICAgICAgIG1heExlbmd0aCA9IFBBUkFNUyQxLm5vZGVTaXplLm1ldGEubWF4TGFiZWxXaWR0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk9QOgogICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gUEFSQU1TJDEubm9kZVNpemUub3AubWF4TGFiZWxXaWR0aDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIC0xOgogICAgICAgICAgICAgICAgbWF4TGVuZ3RoID0gUEFSQU1TJDEuYW5ub3RhdGlvbnMubWF4TGFiZWxXaWR0aDsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgICAvLyBSZXR1cm4gaWYgbm8gbWF4IGxlbmd0aCBwcm92aWRlZCBmb3Igbm9kZSB0eXBlLCBvciBjdXJyZW50IGxhYmVsIGxlbmd0aCBpcwogICAgICAgIC8vIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgcHJvdmlkZWQgbGVuZ3RoIGxpbWl0LgogICAgICAgIGlmIChtYXhMZW5ndGggPT09IG51bGwgfHwgY29tcHV0ZWRUeHRMZW5ndGggPD0gbWF4TGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGNoYXJhY3RlciB3aGljaCBleGNlZWRzIHRoZSB3aWR0aC4KICAgICAgICAvLyBnZXRTdWJTdHJpbmdMZW5ndGggcGVyZm9ybXMgZmFyIGJldHRlciB0aGFuIGdldENvbXB1dGVkVGV4dExlbmd0aCwgYW5kCiAgICAgICAgLy8gcmVzdWx0cyBpbiBhIDN4IHNwZWVkLXVwIG9uIGF2ZXJhZ2UuCiAgICAgICAgbGV0IGluZGV4ID0gMTsKICAgICAgICB3aGlsZSAodHh0Tm9kZS5nZXRTdWJTdHJpbmdMZW5ndGgoMCwgaW5kZXgpIDwgbWF4TGVuZ3RoKSB7CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgICAgIC8vIFNob3J0ZW4gdGhlIGxhYmVsIHN0YXJ0aW5nIGF0IHRoZSBzdHJpbmcgbGVuZ3RoIGtub3duIHRvIGJlIG9uZQogICAgICAgIC8vIGNoYXJhY3RlciBhYm92ZSBtYXggcGl4ZWwgbGVuZ3RoLgogICAgICAgIC8vIFdoZW4gc2hvcnRlbmVkIHRoZSBvcmlnaW5hbCBsYWJlbCdzIHN1YnN0cmluZyBpcyBjb25jYXRlbmF0ZWQgd2l0aAogICAgICAgIC8vICcuLi4nLCBiYXNlVGV4dCBjb250YWlucyB0aGUgc3Vic3RyaW5nIG5vdCBpbmNsdWRpbmcgdGhlICcuLi4nLgogICAgICAgIGxldCBiYXNlVGV4dCA9IHR4dE5vZGUudGV4dENvbnRlbnQuc3Vic3RyKDAsIGluZGV4KTsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGJhc2VUZXh0ID0gYmFzZVRleHQuc3Vic3RyKDAsIGJhc2VUZXh0Lmxlbmd0aCAtIDEpOwogICAgICAgICAgICAvLyBSZWNvbXB1dGUgdGV4dCBsZW5ndGguCiAgICAgICAgICAgIHR4dE5vZGUudGV4dENvbnRlbnQgPSBiYXNlVGV4dCArICcuLi4nOwogICAgICAgICAgICBjb21wdXRlZFR4dExlbmd0aCA9IHR4dE5vZGUuZ2V0Q29tcHV0ZWRUZXh0TGVuZ3RoKCk7CiAgICAgICAgfSB3aGlsZSAoY29tcHV0ZWRUeHRMZW5ndGggPiBtYXhMZW5ndGggJiYgYmFzZVRleHQubGVuZ3RoID4gMCk7CiAgICAgICAgLy8gQWRkIHRvb2x0aXAgd2l0aCBmdWxsIG5hbWUgYW5kIHJldHVybi4KICAgICAgICByZXR1cm4gdHh0RWxlbWVudFNlbGVjdGlvbi5hcHBlbmQoJ3RpdGxlJykudGV4dChsYWJlbENvbnRlbnQpOwogICAgfQogICAgLyoqCiAgICAgKiBkMyBzY2FsZSB1c2VkIGZvciBzaXppbmcgZm9udCBvZiBsYWJlbHMsIHVzZWQgYnkgbGFiZWxCdWlsZCwKICAgICAqIGluaXRpYWxpemVkIG9uY2UgYnkgZ2V0TGFiZWxGb250U2NhbGUuCiAgICAgKi8KICAgIGxldCBmb250U2NhbGUgPSBudWxsOwogICAgZnVuY3Rpb24gZ2V0TGFiZWxGb250U2NhbGUoc2NlbmVFbGVtZW50KSB7CiAgICAgICAgaWYgKCFmb250U2NhbGUpIHsKICAgICAgICAgICAgZm9udFNjYWxlID0gbGluZWFyJDIoKQogICAgICAgICAgICAgICAgLmRvbWFpbihbCiAgICAgICAgICAgICAgICBzY2VuZUVsZW1lbnQubWF4TWV0YW5vZGVMYWJlbExlbmd0aExhcmdlRm9udCwKICAgICAgICAgICAgICAgIHNjZW5lRWxlbWVudC5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoLAogICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgLnJhbmdlKFsKICAgICAgICAgICAgICAgIHNjZW5lRWxlbWVudC5tYXhNZXRhbm9kZUxhYmVsTGVuZ3RoRm9udFNpemUsCiAgICAgICAgICAgICAgICBzY2VuZUVsZW1lbnQubWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplLAogICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgLmNsYW1wKHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZm9udFNjYWxlOwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgbGFiZWwgcG9zaXRpb24gb2YgYSBnaXZlbiBub2RlIGdyb3VwCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxhYmVsUG9zaXRpb24obm9kZUdyb3VwLCBjeCwgY3ksIHlPZmZzZXQpIHsKICAgICAgICBzZWxlY3RDaGlsZCQxKG5vZGVHcm91cCwgJ3RleHQnLCBDbGFzcyQxLk5vZGUuTEFCRUwpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ3gnLCBjeCkKICAgICAgICAgICAgLmF0dHIoJ3knLCBjeSArIHlPZmZzZXQpOwogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3Qgb3IgYXBwZW5kL2luc2VydCBzaGFwZSBmb3IgYSBub2RlIGFuZCBhc3NpZ24gcmVuZGVyTm9kZQogICAgICogYXMgdGhlIHNoYXBlJ3MgZGF0YS4KICAgICAqCiAgICAgKiBAcGFyYW0gbm9kZUdyb3VwCiAgICAgKiBAcGFyYW0gZCBSZW5kZXIgbm9kZSBpbmZvcm1hdGlvbi4KICAgICAqIEBwYXJhbSBub2RlQ2xhc3MgY2xhc3MgZm9yIHRoZSBlbGVtZW50LgogICAgICogQHJldHVybiBTZWxlY3Rpb24gb2YgdGhlIHNoYXBlLgogICAgICovCiAgICBmdW5jdGlvbiBidWlsZFNoYXBlKG5vZGVHcm91cCwgZCwgbm9kZUNsYXNzKSB7CiAgICAgICAgLy8gQ3JlYXRlIGEgZ3JvdXAgdG8gaG91c2UgdGhlIHVuZGVybHlpbmcgdmlzdWFsIGVsZW1lbnRzLgogICAgICAgIGxldCBzaGFwZUdyb3VwID0gc2VsZWN0T3JDcmVhdGVDaGlsZChub2RlR3JvdXAsICdnJywgbm9kZUNsYXNzKTsKICAgICAgICAvLyBUT0RPOiBET00gc3RydWN0dXJlIHNob3VsZCBiZSB0ZW1wbGF0ZWQgaW4gSFRNTCBzb21ld2hlcmUsIG5vdCBKUy4KICAgICAgICBzd2l0Y2ggKGQubm9kZS50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuT1A6CiAgICAgICAgICAgICAgICBjb25zdCBvcE5vZGUgPSBkLm5vZGU7CiAgICAgICAgICAgICAgICBpZiAobG9kYXNoLmlzTnVtYmVyKG9wTm9kZS5mdW5jdGlvbklucHV0SW5kZXgpIHx8CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmlzTnVtYmVyKG9wTm9kZS5mdW5jdGlvbk91dHB1dEluZGV4KSkgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgaW5wdXQgb3Igb3V0cHV0IGFyZyBmb3IgYSBUZW5zb3JGbG93IGZ1bmN0aW9uLiBVc2UgYSBzcGVjaWFsCiAgICAgICAgICAgICAgICAgICAgLy8gc2hhcGUgKGEgdHJpYW5nbGUpIGZvciB0aGVtLgogICAgICAgICAgICAgICAgICAgIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2hhcGVHcm91cCwgJ3BvbHlnb24nLCBDbGFzcyQxLk5vZGUuQ09MT1JfVEFSR0VUKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2hhcGVHcm91cCwgJ2VsbGlwc2UnLCBDbGFzcyQxLk5vZGUuQ09MT1JfVEFSR0VUKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLlNFUklFUzoKICAgICAgICAgICAgICAgIC8vIENob29zZSB0aGUgY29ycmVjdCBzdGFtcCB0byB1c2UgdG8gcmVwcmVzZW50IHRoaXMgc2VyaWVzLgogICAgICAgICAgICAgICAgbGV0IHN0YW1wVHlwZSA9ICdhbm5vdGF0aW9uJzsKICAgICAgICAgICAgICAgIGxldCBncm91cE5vZGVJbmZvID0gZDsKICAgICAgICAgICAgICAgIGlmIChncm91cE5vZGVJbmZvLmNvcmVHcmFwaCkgewogICAgICAgICAgICAgICAgICAgIHN0YW1wVHlwZSA9IGdyb3VwTm9kZUluZm8ubm9kZS5oYXNOb25Db250cm9sRWRnZXMKICAgICAgICAgICAgICAgICAgICAgICAgPyAndmVydGljYWwnCiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2hvcml6b250YWwnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGNsYXNzTGlzdCA9IFtDbGFzcyQxLk5vZGUuQ09MT1JfVEFSR0VUXTsKICAgICAgICAgICAgICAgIGlmIChncm91cE5vZGVJbmZvLmlzRmFkZWRPdXQpIHsKICAgICAgICAgICAgICAgICAgICBjbGFzc0xpc3QucHVzaCgnZmFkZWQtZWxsaXBzZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZWN0T3JDcmVhdGVDaGlsZChzaGFwZUdyb3VwLCAndXNlJywgY2xhc3NMaXN0KQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd4bGluazpocmVmJywgJyNvcC1zZXJpZXMtJyArIHN0YW1wVHlwZSArICctc3RhbXAnKTsKICAgICAgICAgICAgICAgIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2hhcGVHcm91cCwgJ3JlY3QnLCBDbGFzcyQxLk5vZGUuQ09MT1JfVEFSR0VUKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyeCcsIGQucmFkaXVzKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyeScsIGQucmFkaXVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLkJSSURHRToKICAgICAgICAgICAgICAgIHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2hhcGVHcm91cCwgJ3JlY3QnLCBDbGFzcyQxLk5vZGUuQ09MT1JfVEFSR0VUKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyeCcsIGQucmFkaXVzKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyeScsIGQucmFkaXVzKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6CiAgICAgICAgICAgICAgICBzZWxlY3RPckNyZWF0ZUNoaWxkKHNoYXBlR3JvdXAsICdyZWN0JywgQ2xhc3MkMS5Ob2RlLkNPTE9SX1RBUkdFVCkKICAgICAgICAgICAgICAgICAgICAuYXR0cigncngnLCBkLnJhZGl1cykKICAgICAgICAgICAgICAgICAgICAuYXR0cigncnknLCBkLnJhZGl1cyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAnICsgZC5ub2RlLnR5cGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2hhcGVHcm91cDsKICAgIH0KICAgIGZ1bmN0aW9uIG5vZGVDbGFzcyhkKSB7CiAgICAgICAgc3dpdGNoIChkLm5vZGUudHlwZSkgewogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk9QOgogICAgICAgICAgICAgICAgcmV0dXJuIENsYXNzJDEuT1BOT0RFOwogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6CiAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MkMS5NRVRBTk9ERTsKICAgICAgICAgICAgY2FzZSBOb2RlVHlwZS5TRVJJRVM6CiAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MkMS5TRVJJRVNOT0RFOwogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLkJSSURHRToKICAgICAgICAgICAgICAgIHJldHVybiBDbGFzcyQxLkJSSURHRU5PREU7CiAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuRUxMSVBTSVM6CiAgICAgICAgICAgICAgICByZXR1cm4gQ2xhc3MkMS5FTExJUFNJU05PREU7CiAgICAgICAgfQogICAgICAgIHRocm93IEVycm9yKCdVbnJlY29nbml6ZWQgbm9kZSB0eXBlOiAnICsgZC5ub2RlLnR5cGUpOwogICAgfQogICAgLyoqIE1vZGlmeSBub2RlIGFuZCBpdHMgc3Vic2NlbmUgYW5kIGl0cyBsYWJlbCdzIHBvc2l0aW9uYWwgYXR0cmlidXRlcyAqLwogICAgZnVuY3Rpb24gcG9zaXRpb24kMyhub2RlR3JvdXAsIGQpIHsKICAgICAgICBsZXQgc2hhcGVHcm91cCA9IHNlbGVjdENoaWxkJDEobm9kZUdyb3VwLCAnZycsIENsYXNzJDEuTm9kZS5TSEFQRSk7CiAgICAgICAgbGV0IGN4ID0gY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZShkKTsKICAgICAgICBzd2l0Y2ggKGQubm9kZS50eXBlKSB7CiAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuT1A6IHsKICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIHNoYXBlCiAgICAgICAgICAgICAgICBjb25zdCBvcE5vZGUgPSBkLm5vZGU7CiAgICAgICAgICAgICAgICBpZiAobG9kYXNoLmlzTnVtYmVyKG9wTm9kZS5mdW5jdGlvbklucHV0SW5kZXgpIHx8CiAgICAgICAgICAgICAgICAgICAgbG9kYXNoLmlzTnVtYmVyKG9wTm9kZS5mdW5jdGlvbk91dHB1dEluZGV4KSkgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hhcGUgcmVwcmVzZW50cyB0aGUgaW5wdXQgaW50byBvciBvdXRwdXQgb3V0IG9mIGEgVGVuc29yRmxvdwogICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uLgogICAgICAgICAgICAgICAgICAgIGxldCBzaGFwZSA9IHNlbGVjdENoaWxkJDEoc2hhcGVHcm91cCwgJ3BvbHlnb24nKTsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblRyaWFuZ2xlKHNoYXBlLCBkLngsIGQueSwgZC5jb3JlQm94LndpZHRoLCBkLmNvcmVCb3guaGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGxldCBzaGFwZSA9IHNlbGVjdENoaWxkJDEoc2hhcGVHcm91cCwgJ2VsbGlwc2UnKTsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbkVsbGlwc2Uoc2hhcGUsIGN4LCBkLnksIGQuY29yZUJveC53aWR0aCwgZC5jb3JlQm94LmhlaWdodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsYWJlbFBvc2l0aW9uKG5vZGVHcm91cCwgY3gsIGQueSwgZC5sYWJlbE9mZnNldCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIE5vZGVUeXBlLk1FVEE6IHsKICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIHNoYXBlCiAgICAgICAgICAgICAgICBsZXQgc2hhcGVzID0gc2hhcGVHcm91cC5zZWxlY3RBbGwoJ3JlY3QnKTsKICAgICAgICAgICAgICAgIGlmIChkLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25SZWN0KHNoYXBlcywgZC54LCBkLnksIGQud2lkdGgsIGQuaGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICBzdWJzY2VuZVBvc2l0aW9uKG5vZGVHcm91cCwgZCk7CiAgICAgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBsYWJlbCBvbiB0b3AuCiAgICAgICAgICAgICAgICAgICAgbGFiZWxQb3NpdGlvbihub2RlR3JvdXAsIGN4LCBkLnksIC1kLmhlaWdodCAvIDIgKyBkLmxhYmVsSGVpZ2h0IC8gMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblJlY3Qoc2hhcGVzLCBjeCwgZC55LCBkLmNvcmVCb3gud2lkdGgsIGQuY29yZUJveC5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIC8vIFBsYWNlIHRoZSBsYWJlbCBpbiB0aGUgbWlkZGxlLgogICAgICAgICAgICAgICAgICAgIGxhYmVsUG9zaXRpb24obm9kZUdyb3VwLCBjeCwgZC55LCAwKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuU0VSSUVTOiB7CiAgICAgICAgICAgICAgICBsZXQgc2hhcGUgPSBzZWxlY3RDaGlsZCQxKHNoYXBlR3JvdXAsICd1c2UnKTsKICAgICAgICAgICAgICAgIGlmIChkLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25SZWN0KHNoYXBlLCBkLngsIGQueSwgZC53aWR0aCwgZC5oZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIHN1YnNjZW5lUG9zaXRpb24obm9kZUdyb3VwLCBkKTsKICAgICAgICAgICAgICAgICAgICAvLyBwdXQgbGFiZWwgb24gdG9wCiAgICAgICAgICAgICAgICAgICAgbGFiZWxQb3NpdGlvbihub2RlR3JvdXAsIGN4LCBkLnksIC1kLmhlaWdodCAvIDIgKyBkLmxhYmVsSGVpZ2h0IC8gMik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvblJlY3Qoc2hhcGUsIGN4LCBkLnksIGQuY29yZUJveC53aWR0aCwgZC5jb3JlQm94LmhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxQb3NpdGlvbihub2RlR3JvdXAsIGN4LCBkLnksIGQubGFiZWxPZmZzZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBOb2RlVHlwZS5CUklER0U6IHsKICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uIHNoYXBlCiAgICAgICAgICAgICAgICAvLyBOT1RFOiBJbiByZWFsaXR5LCB0aGVzZSB3aWxsIG5vdCBiZSB2aXNpYmxlLCBidXQgaXQgaGVscHMgdG8gcHV0IHRoZW0KICAgICAgICAgICAgICAgIC8vIGluIHRoZSBjb3JyZWN0IHBvc2l0aW9uIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCiAgICAgICAgICAgICAgICBsZXQgc2hhcGUgPSBzZWxlY3RDaGlsZCQxKHNoYXBlR3JvdXAsICdyZWN0Jyk7CiAgICAgICAgICAgICAgICBwb3NpdGlvblJlY3Qoc2hhcGUsIGQueCwgZC55LCBkLndpZHRoLCBkLmhlaWdodCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVW5yZWNvZ25pemVkIG5vZGUgdHlwZTogJyArIGQubm9kZS50eXBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKiBFbnVtIHNwZWNpZnlpbmcgdGhlIG9wdGlvbnMgdG8gY29sb3Igbm9kZXMgYnkgKi8KICAgIHZhciBDb2xvckJ5OwogICAgKGZ1bmN0aW9uIChDb2xvckJ5KSB7CiAgICAgICAgQ29sb3JCeVtDb2xvckJ5WyJTVFJVQ1RVUkUiXSA9IDBdID0gIlNUUlVDVFVSRSI7CiAgICAgICAgQ29sb3JCeVtDb2xvckJ5WyJERVZJQ0UiXSA9IDFdID0gIkRFVklDRSI7CiAgICAgICAgQ29sb3JCeVtDb2xvckJ5WyJYTEFfQ0xVU1RFUiJdID0gMl0gPSAiWExBX0NMVVNURVIiOwogICAgICAgIENvbG9yQnlbQ29sb3JCeVsiQ09NUFVURV9USU1FIl0gPSAzXSA9ICJDT01QVVRFX1RJTUUiOwogICAgICAgIENvbG9yQnlbQ29sb3JCeVsiTUVNT1JZIl0gPSA0XSA9ICJNRU1PUlkiOwogICAgICAgIENvbG9yQnlbQ29sb3JCeVsiT1BfQ09NUEFUSUJJTElUWSJdID0gNV0gPSAiT1BfQ09NUEFUSUJJTElUWSI7CiAgICB9KShDb2xvckJ5IHx8IChDb2xvckJ5ID0ge30pKTsKICAgIGZ1bmN0aW9uIGdldEdyYWRpZW50KGlkLCBjb2xvcnMsIHN2Z1Jvb3QpIHsKICAgICAgICBsZXQgZXNjYXBlZElkID0gZXNjYXBlUXVlcnlTZWxlY3RvcihpZCk7CiAgICAgICAgaWYgKCFzdmdSb290KQogICAgICAgICAgICByZXR1cm4gYHVybCgjJHtlc2NhcGVkSWR9KWA7CiAgICAgICAgbGV0ICRzdmdSb290ID0gc2VsZWN0KHN2Z1Jvb3QpOwogICAgICAgIGxldCBncmFkaWVudERlZnMgPSAkc3ZnUm9vdC5zZWxlY3QoJ2RlZnMjX2dyYXBoLWdyYWRpZW50cycpOwogICAgICAgIGlmIChncmFkaWVudERlZnMuZW1wdHkoKSkgewogICAgICAgICAgICBncmFkaWVudERlZnMgPSAkc3ZnUm9vdC5hcHBlbmQoJ2RlZnMnKS5hdHRyKCdpZCcsICdfZ3JhcGgtZ3JhZGllbnRzJyk7CiAgICAgICAgfQogICAgICAgIGxldCBsaW5lYXJHcmFkaWVudCA9IGdyYWRpZW50RGVmcy5zZWxlY3QoJ2xpbmVhckdyYWRpZW50IycgKyBlc2NhcGVkSWQpOwogICAgICAgIC8vIElmIHRoZSBsaW5lYXIgZ3JhZGllbnQgaXMgbm90IHRoZXJlIHlldCwgY3JlYXRlIGl0LgogICAgICAgIGlmIChsaW5lYXJHcmFkaWVudC5lbXB0eSgpKSB7CiAgICAgICAgICAgIGxpbmVhckdyYWRpZW50ID0gZ3JhZGllbnREZWZzLmFwcGVuZCgnbGluZWFyR3JhZGllbnQnKS5hdHRyKCdpZCcsIGlkKTsKICAgICAgICAgICAgLy8gUmUtY3JlYXRlIHRoZSBzdG9wcyBvZiB0aGUgbGluZWFyIGdyYWRpZW50LgogICAgICAgICAgICBsaW5lYXJHcmFkaWVudC5zZWxlY3RBbGwoJyonKS5yZW1vdmUoKTsKICAgICAgICAgICAgbGV0IGN1bXVsYXRpdmVQcm9wb3J0aW9uID0gMDsKICAgICAgICAgICAgLy8gRm9yIGVhY2ggY29sb3IsIGNyZWF0ZSBhIHN0b3AgdXNpbmcgdGhlIHByb3BvcnRpb24gb2YgdGhhdCBkZXZpY2UuCiAgICAgICAgICAgIGxvZGFzaC5lYWNoKGNvbG9ycywgKGQpID0+IHsKICAgICAgICAgICAgICAgIGxldCBjb2xvciA9IGQuY29sb3I7CiAgICAgICAgICAgICAgICBsaW5lYXJHcmFkaWVudAogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3N0b3AnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdvZmZzZXQnLCBjdW11bGF0aXZlUHJvcG9ydGlvbikKICAgICAgICAgICAgICAgICAgICAuYXR0cignc3RvcC1jb2xvcicsIGNvbG9yKTsKICAgICAgICAgICAgICAgIGxpbmVhckdyYWRpZW50CiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnc3RvcCcpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ29mZnNldCcsIGN1bXVsYXRpdmVQcm9wb3J0aW9uICsgZC5wcm9wb3J0aW9uKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdzdG9wLWNvbG9yJywgY29sb3IpOwogICAgICAgICAgICAgICAgY3VtdWxhdGl2ZVByb3BvcnRpb24gKz0gZC5wcm9wb3J0aW9uOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGB1cmwoIyR7ZXNjYXBlZElkfSlgOwogICAgfQogICAgZnVuY3Rpb24gcmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyhzdmdSb290KSB7CiAgICAgICAgc2VsZWN0KHN2Z1Jvb3QpLnNlbGVjdCgnZGVmcyNfZ3JhcGgtZ3JhZGllbnRzJykucmVtb3ZlKCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGZpbGwgY29sb3IgZm9yIHRoZSBub2RlIGdpdmVuIGl0cyBzdGF0ZSBhbmQgdGhlICdjb2xvciBieScKICAgICAqIG9wdGlvbi4KICAgICAqIFRha2VzIGluIG9wdGlvbmFsIHN2Z1Jvb3QsIHdoZW4gcGFzc2VkLCB0aGF0IHBvcHVsYXRlcyBTVkcgZGVmaW5pdGlvbnMKICAgICAqIGZvciB0aGUgZmlsbCBpbnNpZGUgdGhlIHN2Z1Jvb3Qgd2hlbiBuZWNlc3NhcnkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEZpbGxGb3JOb2RlKHRlbXBsYXRlSW5kZXgsIGNvbG9yQnksIHJlbmRlckluZm8sIGlzRXhwYW5kZWQsIHN2Z1Jvb3QpIHsKICAgICAgICBsZXQgY29sb3JQYXJhbXMgPSBNZXRhbm9kZUNvbG9yczsKICAgICAgICBzd2l0Y2ggKGNvbG9yQnkpIHsKICAgICAgICAgICAgY2FzZSBDb2xvckJ5LlNUUlVDVFVSRToKICAgICAgICAgICAgICAgIGlmIChyZW5kZXJJbmZvLm5vZGUudHlwZSA9PT0gTm9kZVR5cGUuTUVUQSkgewogICAgICAgICAgICAgICAgICAgIGxldCB0aWQgPSByZW5kZXJJbmZvLm5vZGUudGVtcGxhdGVJZDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlkID09PSBudWxsCiAgICAgICAgICAgICAgICAgICAgICAgID8gY29sb3JQYXJhbXMuVU5LTk9XTgogICAgICAgICAgICAgICAgICAgICAgICA6IGNvbG9yUGFyYW1zLlNUUlVDVFVSRV9QQUxFVFRFKHRlbXBsYXRlSW5kZXgodGlkKSwgaXNFeHBhbmRlZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChyZW5kZXJJbmZvLm5vZGUudHlwZSA9PT0gTm9kZVR5cGUuU0VSSUVTKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXhwYW5kZWQsIHdlJ3JlIHNob3dpbmcgdGhlIGJhY2tncm91bmQgcmVjdCwgd2hpY2ggd2Ugd2FudCB0bwogICAgICAgICAgICAgICAgICAgIC8vIGFwcGVhciBncmF5LiBPdGhlcndpc2Ugd2UncmUgc2hvd2luZyBhIHN0YWNrIG9mIGVsbGlwc2VzIHdoaWNoIHdlCiAgICAgICAgICAgICAgICAgICAgLy8gd2FudCB0byBzaG93IHdoaXRlLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBpc0V4cGFuZGVkID8gY29sb3JQYXJhbXMuRVhQQU5ERURfQ09MT1IgOiAnd2hpdGUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocmVuZGVySW5mby5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLkJSSURHRSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByZW5kZXJJbmZvLnN0cnVjdHVyYWwKICAgICAgICAgICAgICAgICAgICAgICAgPyAnI2YwZScKICAgICAgICAgICAgICAgICAgICAgICAgOiByZW5kZXJJbmZvLm5vZGUuaW5ib3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnIzBlZicKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJyNmZTAnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobG9kYXNoLmlzTnVtYmVyKHJlbmRlckluZm8ubm9kZS5mdW5jdGlvbklucHV0SW5kZXgpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhbiBpbnB1dCBvZiBhIFRlbnNvckZsb3cgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcjNzk1NTQ4JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGxvZGFzaC5pc051bWJlcihyZW5kZXJJbmZvLm5vZGUuZnVuY3Rpb25PdXRwdXRJbmRleCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGFuIG91dHB1dCBvZiBhIFRlbnNvckZsb3cgZnVuY3Rpb24uCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcjMDA5Njg4JzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIE9wIG5vZGVzIGFyZSB3aGl0ZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3doaXRlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBDb2xvckJ5LkRFVklDRToKICAgICAgICAgICAgICAgIGlmIChyZW5kZXJJbmZvLmRldmljZUNvbG9ycyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBodWUgZm9yIHVua25vd24gZGV2aWNlLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvclBhcmFtcy5VTktOT1dOOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGlzRXhwYW5kZWQKICAgICAgICAgICAgICAgICAgICA/IGNvbG9yUGFyYW1zLkVYUEFOREVEX0NPTE9SCiAgICAgICAgICAgICAgICAgICAgOiBnZXRHcmFkaWVudCgnZGV2aWNlLScgKyByZW5kZXJJbmZvLm5vZGUubmFtZSwgcmVuZGVySW5mby5kZXZpY2VDb2xvcnMsIHN2Z1Jvb3QpOwogICAgICAgICAgICBjYXNlIENvbG9yQnkuWExBX0NMVVNURVI6CiAgICAgICAgICAgICAgICBpZiAocmVuZGVySW5mby54bGFDbHVzdGVyQ29sb3JzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGh1ZSBmb3IgdW5rbm93biB4bGFDbHVzdGVyLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvclBhcmFtcy5VTktOT1dOOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGlzRXhwYW5kZWQKICAgICAgICAgICAgICAgICAgICA/IGNvbG9yUGFyYW1zLkVYUEFOREVEX0NPTE9SCiAgICAgICAgICAgICAgICAgICAgOiBnZXRHcmFkaWVudCgneGxhLScgKyByZW5kZXJJbmZvLm5vZGUubmFtZSwgcmVuZGVySW5mby54bGFDbHVzdGVyQ29sb3JzLCBzdmdSb290KTsKICAgICAgICAgICAgY2FzZSBDb2xvckJ5LkNPTVBVVEVfVElNRToKICAgICAgICAgICAgICAgIHJldHVybiBpc0V4cGFuZGVkCiAgICAgICAgICAgICAgICAgICAgPyBjb2xvclBhcmFtcy5FWFBBTkRFRF9DT0xPUgogICAgICAgICAgICAgICAgICAgIDogcmVuZGVySW5mby5jb21wdXRlVGltZUNvbG9yIHx8IGNvbG9yUGFyYW1zLlVOS05PV047CiAgICAgICAgICAgIGNhc2UgQ29sb3JCeS5NRU1PUlk6CiAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHBhbmRlZAogICAgICAgICAgICAgICAgICAgID8gY29sb3JQYXJhbXMuRVhQQU5ERURfQ09MT1IKICAgICAgICAgICAgICAgICAgICA6IHJlbmRlckluZm8ubWVtb3J5Q29sb3IgfHwgY29sb3JQYXJhbXMuVU5LTk9XTjsKICAgICAgICAgICAgY2FzZSBDb2xvckJ5Lk9QX0NPTVBBVElCSUxJVFk6CiAgICAgICAgICAgICAgICBpZiAocmVuZGVySW5mby5jb21wYXRpYmlsaXR5Q29sb3JzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGh1ZSBmb3IgdW5rbm93biBjb21wYXRpYmlsaXR5IGluZm8uCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbG9yUGFyYW1zLlVOS05PV047CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaXNFeHBhbmRlZAogICAgICAgICAgICAgICAgICAgID8gY29sb3JQYXJhbXMuRVhQQU5ERURfQ09MT1IKICAgICAgICAgICAgICAgICAgICA6IGdldEdyYWRpZW50KCdvcC1jb21wYXQtJyArIHJlbmRlckluZm8ubm9kZS5uYW1lLCByZW5kZXJJbmZvLmNvbXBhdGliaWxpdHlDb2xvcnMsIHN2Z1Jvb3QpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIGNhc2UgdG8gY29sb3Igbm9kZXMgYnknKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE1vZGlmeSBub2RlIHN0eWxlIGJ5IHRvZ2dsaW5nIGNsYXNzIGFuZCBhc3NpZ24gYXR0cmlidXRlcyAob25seSBmb3IgdGhpbmdzCiAgICAgKiB0aGF0IGNhbid0IGJlIGRvbmUgaW4gY3NzKS4KICAgICAqLwogICAgZnVuY3Rpb24gc3R5bGl6ZSQxKG5vZGVHcm91cCwgcmVuZGVySW5mbywgc2NlbmVFbGVtZW50LCBub2RlQ2xhc3MpIHsKICAgICAgICBub2RlQ2xhc3MgPSBub2RlQ2xhc3MgfHwgQ2xhc3MkMS5Ob2RlLlNIQVBFOwogICAgICAgIGxldCBpc0hpZ2hsaWdodGVkID0gc2NlbmVFbGVtZW50LmlzTm9kZUhpZ2hsaWdodGVkKHJlbmRlckluZm8ubm9kZS5uYW1lKTsKICAgICAgICBsZXQgaXNTZWxlY3RlZCA9IHNjZW5lRWxlbWVudC5pc05vZGVTZWxlY3RlZChyZW5kZXJJbmZvLm5vZGUubmFtZSk7CiAgICAgICAgbGV0IGlzRXh0cmFjdCA9IHJlbmRlckluZm8uaXNJbkV4dHJhY3QgfHwKICAgICAgICAgICAgcmVuZGVySW5mby5pc091dEV4dHJhY3QgfHwKICAgICAgICAgICAgcmVuZGVySW5mby5pc0xpYnJhcnlGdW5jdGlvbjsKICAgICAgICBsZXQgaXNFeHBhbmRlZCA9IHJlbmRlckluZm8uZXhwYW5kZWQgJiYgbm9kZUNsYXNzICE9PSBDbGFzcyQxLkFubm90YXRpb24uTk9ERTsKICAgICAgICBsZXQgaXNGYWRlZE91dCA9IHJlbmRlckluZm8uaXNGYWRlZE91dDsKICAgICAgICBub2RlR3JvdXAuY2xhc3NlZCgnaGlnaGxpZ2h0ZWQnLCBpc0hpZ2hsaWdodGVkKTsKICAgICAgICBub2RlR3JvdXAuY2xhc3NlZCgnc2VsZWN0ZWQnLCBpc1NlbGVjdGVkKTsKICAgICAgICBub2RlR3JvdXAuY2xhc3NlZCgnZXh0cmFjdCcsIGlzRXh0cmFjdCk7CiAgICAgICAgbm9kZUdyb3VwLmNsYXNzZWQoJ2V4cGFuZGVkJywgaXNFeHBhbmRlZCk7CiAgICAgICAgbm9kZUdyb3VwLmNsYXNzZWQoJ2ZhZGVkJywgaXNGYWRlZE91dCk7CiAgICAgICAgLy8gTWFpbiBub2RlIGFsd2F5cyBleGlzdHMgaGVyZSBhbmQgaXQgd2lsbCBiZSByZWFjaGVkIGJlZm9yZSBzdWJzY2VuZSwKICAgICAgICAvLyBzbyBkMyBzZWxlY3Rpb24gaXMgZmluZSBoZXJlLgogICAgICAgIGxldCBub2RlID0gbm9kZUdyb3VwLnNlbGVjdCgnLicgKyBub2RlQ2xhc3MgKyAnIC4nICsgQ2xhc3MkMS5Ob2RlLkNPTE9SX1RBUkdFVCk7CiAgICAgICAgbGV0IGZpbGxDb2xvciA9IGdldEZpbGxGb3JOb2RlKHNjZW5lRWxlbWVudC50ZW1wbGF0ZUluZGV4LCBDb2xvckJ5W3NjZW5lRWxlbWVudC5jb2xvckJ5LnRvVXBwZXJDYXNlKCldLCByZW5kZXJJbmZvLCBpc0V4cGFuZGVkLCBzY2VuZUVsZW1lbnQuZ2V0R3JhcGhTdmdSb290KCkpOwogICAgICAgIG5vZGUuc3R5bGUoJ2ZpbGwnLCBmaWxsQ29sb3IpOwogICAgICAgIC8vIENob29zZSBvdXRsaW5lIHRvIGJlIGRhcmtlciB2ZXJzaW9uIG9mIG5vZGUgY29sb3IgaWYgdGhlIG5vZGUgaXMgYSBzaW5nbGUKICAgICAgICAvLyBjb2xvciBhbmQgaXMgbm90IHNlbGVjdGVkLgogICAgICAgIG5vZGUuc3R5bGUoJ3N0cm9rZScsIGlzU2VsZWN0ZWQgPyBudWxsIDogZ2V0U3Ryb2tlRm9yRmlsbChmaWxsQ29sb3IpKTsKICAgIH0KICAgIC8qKgogICAgICogR2l2ZW4gYSBub2RlJ3MgZmlsbCBjb2xvci9ncmFkaWVudCwgZGV0ZXJtaW5lIHRoZSBzdHJva2UgZm9yIHRoZSBub2RlLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTdHJva2VGb3JGaWxsKGZpbGwpIHsKICAgICAgICAvLyBJZiBub2RlIGlzIGNvbG9yZWQgYnkgYSBncmFkaWVudCwgdGhlbiB1c2UgYSBkYXJrIGdyYXkgb3V0bGluZS4KICAgICAgICByZXR1cm4gZmlsbC5zdWJzdHJpbmcoMCwgMykgPT09ICd1cmwnCiAgICAgICAgICAgID8gTWV0YW5vZGVDb2xvcnMuR1JBRElFTlRfT1VUTElORQogICAgICAgICAgICA6IHJnYihmaWxsKS5kYXJrZXIoKS50b1N0cmluZygpOwogICAgfQogICAgLyoqCiAgICAgKiBGaW5kcyBzZWxlY3RlZCBub2RlIGFuZCBoaWdobGlnaHRzIGFsbCBub2RlcyB3aGljaCBhcmUgcHJvdmlkaW5nIGRpcmVjdAogICAgICogb3IgaW5kaXJlY3QgaW5wdXQgdG8gdGhlIG5vZGUgYW5kIGFsbCBlZGdlcyBjb25uZWN0aW5nIHRoZXNlIG5vZGVzCiAgICAgKiB0b2dldGhlciBhbmQgdG8gdGhlIHNlbGVjdGVkIG5vZGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHVwZGF0ZUlucHV0VHJhY2Uoc3ZnUm9vdCwgcmVuZGVyR3JhcGhJbmZvLCBzZWxlY3RlZE5vZGVOYW1lLCB0cmFjZUlucHV0cykgewogICAgICAgIC8vIFJlc2V0IGFsbCBzdHlsaW5nLgogICAgICAgIGNvbnN0IHN2ZyA9IHNlbGVjdChzdmdSb290KTsKICAgICAgICBzdmcuc2VsZWN0QWxsKCcuaW5wdXQtaGlnaGxpZ2h0JykuY2xhc3NlZCgnaW5wdXQtaGlnaGxpZ2h0JywgZmFsc2UpOwogICAgICAgIHN2Zy5zZWxlY3RBbGwoJy5ub24taW5wdXQnKS5jbGFzc2VkKCdub24taW5wdXQnLCBmYWxzZSk7CiAgICAgICAgc3ZnLnNlbGVjdEFsbCgnLmlucHV0LXBhcmVudCcpLmNsYXNzZWQoJ2lucHV0LXBhcmVudCcsIGZhbHNlKTsKICAgICAgICBzdmcuc2VsZWN0QWxsKCcuaW5wdXQtY2hpbGQnKS5jbGFzc2VkKCdpbnB1dC1jaGlsZCcsIGZhbHNlKTsKICAgICAgICBzdmcuc2VsZWN0QWxsKCcuaW5wdXQtZWRnZS1oaWdobGlnaHQnKS5jbGFzc2VkKCdpbnB1dC1lZGdlLWhpZ2hsaWdodCcsIGZhbHNlKTsKICAgICAgICBzdmcKICAgICAgICAgICAgLnNlbGVjdEFsbCgnLm5vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCcpCiAgICAgICAgICAgIC5jbGFzc2VkKCdub24taW5wdXQtZWRnZS1oaWdobGlnaHQnLCBmYWxzZSk7CiAgICAgICAgc3ZnCiAgICAgICAgICAgIC5zZWxlY3RBbGwoJy5pbnB1dC1oaWdobGlnaHQtc2VsZWN0ZWQnKQogICAgICAgICAgICAuY2xhc3NlZCgnaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkJywgZmFsc2UpOwogICAgICAgIC8vIEV4dHJhY3QgY3VycmVudGx5IHNlbGVjdGVkIG5vZGUuIFJldHVybiBpZiBpbnB1dCB0cmFjaW5nIGRpc2FibGVkIG9yIG5vCiAgICAgICAgLy8gbm9kZSBpcyBzZWxlY3RlZC4KICAgICAgICBpZiAoIXJlbmRlckdyYXBoSW5mbyB8fCAhdHJhY2VJbnB1dHMgfHwgIXNlbGVjdGVkTm9kZU5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBsZXQgb3BOb2RlcyA9IF9nZXRBbGxDb250YWluZWRPcE5vZGVzKHNlbGVjdGVkTm9kZU5hbWUsIHJlbmRlckdyYXBoSW5mbyk7CiAgICAgICAgbGV0IGFsbFRyYWNlZE5vZGVzID0ge307CiAgICAgICAgbG9kYXNoLmVhY2gob3BOb2RlcywgZnVuY3Rpb24gKG5vZGVJbnN0YW5jZSkgewogICAgICAgICAgICBhbGxUcmFjZWROb2RlcyA9IHRyYWNlQWxsSW5wdXRzT2ZPcE5vZGUoc3ZnUm9vdCwgcmVuZGVyR3JhcGhJbmZvLCBub2RlSW5zdGFuY2UsIGFsbFRyYWNlZE5vZGVzKTsKICAgICAgICB9KTsKICAgICAgICAvLyBIaWdobGlnaHQgYWxsIHBhcmVudCBub2RlcyBvZiBlYWNoIE9wTm9kZSBhcyBpbnB1dCBwYXJlbnQgdG8gYWxsb3cKICAgICAgICAvLyBzcGVjaWZpYyBoaWdobGlnaHRpbmcuCiAgICAgICAgbGV0IGhpZ2hsaWdodGVkTm9kZXMgPSBPYmplY3Qua2V5cyhhbGxUcmFjZWROb2Rlcyk7CiAgICAgICAgbGV0IHZpc2libGVOb2RlcyA9IF9maW5kVmlzaWJsZVBhcmVudHNGcm9tT3BOb2RlcyhyZW5kZXJHcmFwaEluZm8sIGhpZ2hsaWdodGVkTm9kZXMpOwogICAgICAgIF9tYXJrUGFyZW50c09mTm9kZXMoc3ZnUm9vdCwgdmlzaWJsZU5vZGVzKTsKICAgICAgICAvLyBBdHRhY2ggY2xhc3MgdG8gYWxsIG5vbi1pbnB1dCBub2RlcyBhbmQgZWRnZXMgZm9yIHN0eWxpbmcuCiAgICAgICAgc3ZnCiAgICAgICAgICAgIC5zZWxlY3RBbGwoJ2cubm9kZTpub3QoLnNlbGVjdGVkKTpub3QoLmlucHV0LWhpZ2hsaWdodCknICsKICAgICAgICAgICAgJzpub3QoLmlucHV0LXBhcmVudCk6bm90KC5pbnB1dC1jaGlsZHJlbiknKQogICAgICAgICAgICAuY2xhc3NlZCgnbm9uLWlucHV0JywgdHJ1ZSkKICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgLy8gTWFyayBhbGwgbm9kZXMgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgYXMgbm9uLWlucHV0cy4gVGhpcwogICAgICAgICAgICAvLyByZXN1bHRzIGluIEFubm90YXRpb24gbm9kZXMgd2hpY2ggYXJlIGF0dGFjaGVkIHRvIGlucHV0cyB0byBiZQogICAgICAgICAgICAvLyB0YWdnZWQgYXMgd2VsbC4KICAgICAgICAgICAgbGV0IG5vZGVOYW1lID0gZC5ub2RlLm5hbWU7CiAgICAgICAgICAgIHN2Zy5zZWxlY3RBbGwoYFtkYXRhLW5hbWU9IiR7bm9kZU5hbWV9Il1gKS5jbGFzc2VkKCdub24taW5wdXQnLCB0cnVlKTsKICAgICAgICB9KTsKICAgICAgICBzdmcKICAgICAgICAgICAgLnNlbGVjdEFsbCgnZy5lZGdlOm5vdCguaW5wdXQtZWRnZS1oaWdobGlnaHQpJykKICAgICAgICAgICAgLmNsYXNzZWQoJ25vbi1pbnB1dC1lZGdlLWhpZ2hsaWdodCcsIHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWN1cnNpdmVseSBmaW5kIGFsbCBvcCBub2RlcyBjb250YWluZWQgYnkgdGhlIG5vZGUgaWRlbnRpZmllZCBieSB0aGUKICAgICAqIHByb3ZpZGVkIG5hbWUuCiAgICAgKiBAcGFyYW0gbm9kZU5hbWUgVGhlIG1ldGEgb3Igb3Agbm9kZSBvZiB3aGljaCB0aGUgT3BOb2RlIGluc3RhbmNlcyBhcmUKICAgICAqIHJlcXVpcmVkLgogICAgICogQHBhcmFtIHJlbmRlckdyYXBoSW5mbyBUaGUgcmVuZGVyZWQgZ3JhcGggaW5mb3JtYXRpb24gb2JqZWN0LgogICAgICogQHJldHVybnMge0FycmF5fSBBbiBhcnJheSBvZiBPcE5vZGVJbXBsIGluc3RhbmNlcy4KICAgICAqLwogICAgZnVuY3Rpb24gX2dldEFsbENvbnRhaW5lZE9wTm9kZXMobm9kZU5hbWUsIHJlbmRlckdyYXBoSW5mbykgewogICAgICAgIGxldCBvcE5vZGVzID0gW107CiAgICAgICAgLy8gR2V0IGN1cnJlbnQgbm9kZS4KICAgICAgICBsZXQgbm9kZSA9IHJlbmRlckdyYXBoSW5mby5nZXROb2RlQnlOYW1lKG5vZGVOYW1lKTsKICAgICAgICAvLyBJZiBub2RlIGlzIGFscmVhZHkgT3BOb2RlIHRoZW4gcmV0dXJuIHRoZSBub2RlIHBsdXMgaXRzIGlucHV0IGVtYmVkZGluZ3MuCiAgICAgICAgaWYgKG5vZGUgaW5zdGFuY2VvZiBPcE5vZGVJbXBsKSB7CiAgICAgICAgICAgIHJldHVybiBbbm9kZV0uY29uY2F0KG5vZGUuaW5FbWJlZGRpbmdzKTsKICAgICAgICB9CiAgICAgICAgLy8gT3RoZXJ3aXNlLCBtYWtlIHJlY3Vyc2l2ZSBjYWxsIGZvciBlYWNoIG5vZGUgY29udGFpbmVkIGJ5IHRoZSBHcm91cE5vZGUuCiAgICAgICAgbGV0IGNoaWxkTm9kZU5hbWVzID0gbm9kZS5tZXRhZ3JhcGgubm9kZXMoKTsKICAgICAgICBsb2Rhc2guZWFjaChjaGlsZE5vZGVOYW1lcywgZnVuY3Rpb24gKGNoaWxkTm9kZU5hbWUpIHsKICAgICAgICAgICAgb3BOb2RlcyA9IG9wTm9kZXMuY29uY2F0KF9nZXRBbGxDb250YWluZWRPcE5vZGVzKGNoaWxkTm9kZU5hbWUsIHJlbmRlckdyYXBoSW5mbykpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBvcE5vZGVzOwogICAgfQogICAgZnVuY3Rpb24gdHJhY2VBbGxJbnB1dHNPZk9wTm9kZShzdmdSb290LCByZW5kZXJHcmFwaEluZm8sIHN0YXJ0Tm9kZSwgYWxsVHJhY2VkTm9kZXMpIHsKICAgICAgICAvLyBUbyBwcmV2ZW50IGluZmluaXRlIGxvb3BzIGR1ZSB0byBjeWNsaWNhbCByZWxhdGlvbnNoaXBzIGFuZCBpbXByb3ZpbmcKICAgICAgICAvLyBwZXJmb3JtYW5jZSBieSB0cmFjaW5nIE9wTm9kZSB3aGljaCBpcyBpbnB1dCB0byAyKyBub2RlcyBvbmx5IG9uY2UuCiAgICAgICAgaWYgKGFsbFRyYWNlZE5vZGVzW3N0YXJ0Tm9kZS5uYW1lXSkgewogICAgICAgICAgICByZXR1cm4gYWxsVHJhY2VkTm9kZXM7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBhbGxUcmFjZWROb2Rlc1tzdGFydE5vZGUubmFtZV0gPSB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBFeHRyYWN0IHRoZSBpbnB1dHMuCiAgICAgICAgbGV0IGlucHV0cyA9IHN0YXJ0Tm9kZS5pbnB1dHM7CiAgICAgICAgLy8gR2V0IHZpc2libGUgcGFyZW50LgogICAgICAgIGxldCBjdXJyZW50VmlzaWJsZVBhcmVudCA9IGdldFZpc2libGVQYXJlbnQocmVuZGVyR3JhcGhJbmZvLCBzdGFydE5vZGUpOwogICAgICAgIC8vIE1hcmsgYXMgaW5wdXQgbm9kZS4KICAgICAgICBzZWxlY3Qoc3ZnUm9vdCkKICAgICAgICAgICAgLnNlbGVjdChgLm5vZGVbZGF0YS1uYW1lPSIke2N1cnJlbnRWaXNpYmxlUGFyZW50Lm5hbWV9Il1gKQogICAgICAgICAgICAuY2xhc3NlZCgnaW5wdXQtaGlnaGxpZ2h0JywgdHJ1ZSk7CiAgICAgICAgLy8gRmluZCB0aGUgdmlzaWJsZSBwYXJlbnQgb2YgZWFjaCBpbnB1dC4KICAgICAgICBsZXQgdmlzaWJsZUlucHV0cyA9IHt9OwogICAgICAgIGxvZGFzaC5lYWNoKGlucHV0cywgZnVuY3Rpb24gKG5vZGVJbnN0YW5jZSkgewogICAgICAgICAgICBsZXQgcmVzb2x2ZWROb2RlID0gcmVuZGVyR3JhcGhJbmZvLmdldE5vZGVCeU5hbWUobm9kZUluc3RhbmNlLm5hbWUpOwogICAgICAgICAgICBpZiAocmVzb2x2ZWROb2RlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIE5vZGUgY291bGQgbm90IGJlIGZvdW5kIGluIHJlbmRlcmVkIEhpZXJhcmNoeSwgd2hpY2ggaGFwcGVucyB3aGVuCiAgICAgICAgICAgICAgICAvLyB0cmFjaW5nIGlucHV0cyBvZiBhIFN1bW1hcnlOb2RlLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEVuc3VyZSBub2RlIGlzIHJlc29sdmVkIHRvIE9wTm9kZSBpZiBuYW1lIGNvbGxpc2lvbiB3aXRoIE1ldGFub2RlIGV4aXN0cy4KICAgICAgICAgICAgaWYgKHJlc29sdmVkTm9kZSBpbnN0YW5jZW9mIE1ldGFub2RlSW1wbCkgewogICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkTm9kZU5hbWUgPSBnZXRTdHJpY3ROYW1lKHJlc29sdmVkTm9kZS5uYW1lKTsKICAgICAgICAgICAgICAgIHJlc29sdmVkTm9kZSA9IHJlbmRlckdyYXBoSW5mby5nZXROb2RlQnlOYW1lKHJlc29sdmVkTm9kZU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB2aXNpYmxlUGFyZW50ID0gZ2V0VmlzaWJsZVBhcmVudChyZW5kZXJHcmFwaEluZm8sIHJlc29sdmVkTm9kZSk7CiAgICAgICAgICAgIC8vIEFwcGVuZCBPcE5vZGUgdG8gdmlzaWJsZSBwYXJlbnQgZW50cnkuCiAgICAgICAgICAgIGxldCB2aXNpYmxlSW5wdXRzRW50cnkgPSB2aXNpYmxlSW5wdXRzW3Zpc2libGVQYXJlbnQubmFtZV07CiAgICAgICAgICAgIGlmICh2aXNpYmxlSW5wdXRzRW50cnkpIHsKICAgICAgICAgICAgICAgIHZpc2libGVJbnB1dHNFbnRyeS5vcE5vZGVzLnB1c2gocmVzb2x2ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZW50cnkuCiAgICAgICAgICAgICAgICB2aXNpYmxlSW5wdXRzW3Zpc2libGVQYXJlbnQubmFtZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgdmlzaWJsZVBhcmVudDogdmlzaWJsZVBhcmVudCwKICAgICAgICAgICAgICAgICAgICBvcE5vZGVzOiBbcmVzb2x2ZWROb2RlXSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICAvLyBGaW5kIGFsbCBwYXJlbnRzIG9mIHRoZSBzdGFydCBub2RlLgogICAgICAgIGxldCBzdGFydE5vZGVQYXJlbnRzID0ge307CiAgICAgICAgbGV0IGluZGV4ZWRTdGFydE5vZGVQYXJlbnRzID0gW2N1cnJlbnRWaXNpYmxlUGFyZW50XTsKICAgICAgICBzdGFydE5vZGVQYXJlbnRzW2N1cnJlbnRWaXNpYmxlUGFyZW50Lm5hbWVdID0gewogICAgICAgICAgICB0cmFjZWQ6IGZhbHNlLAogICAgICAgICAgICBpbmRleDogMCwKICAgICAgICAgICAgY29ubmVjdGlvbkVuZHBvaW50czogW10sCiAgICAgICAgfTsKICAgICAgICBsZXQgY3VycmVudE5vZGUgPSBjdXJyZW50VmlzaWJsZVBhcmVudDsKICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGN1cnJlbnROb2RlLm5hbWUgIT09IFJPT1RfTkFNRTsgaW5kZXgrKykgewogICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIHN0YXJ0Tm9kZVBhcmVudHNbY3VycmVudE5vZGUubmFtZV0gPSB7CiAgICAgICAgICAgICAgICB0cmFjZWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgaW5kZXg6IGluZGV4LAogICAgICAgICAgICAgICAgY29ubmVjdGlvbkVuZHBvaW50czogW10sCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGluZGV4ZWRTdGFydE5vZGVQYXJlbnRzW2luZGV4XSA9IGN1cnJlbnROb2RlOwogICAgICAgIH0KICAgICAgICAvLyBGaW5kIGZpcnN0IG11dHVhbCBwYXJlbnQgb2YgZWFjaCBpbnB1dCBub2RlIGFuZCBoaWdobGlnaHQgY29ubmVjdGlvbi4KICAgICAgICBsb2Rhc2guZm9yT3duKHZpc2libGVJbnB1dHMsIGZ1bmN0aW9uICh2aXNpYmxlUGFyZW50SW5mbywga2V5KSB7CiAgICAgICAgICAgIGxldCBub2RlSW5zdGFuY2UgPSB2aXNpYmxlUGFyZW50SW5mby52aXNpYmxlUGFyZW50OwogICAgICAgICAgICAvLyBNYWtlIHJlY3Vyc2l2ZSBjYWxsIGZvciBlYWNoIGlucHV0LU9wTm9kZSBjb250YWluZWQgYnkgdGhlIHZpc2libGUKICAgICAgICAgICAgLy8gcGFyZW50LgogICAgICAgICAgICBsb2Rhc2guZWFjaCh2aXNpYmxlUGFyZW50SW5mby5vcE5vZGVzLCBmdW5jdGlvbiAob3BOb2RlKSB7CiAgICAgICAgICAgICAgICBhbGxUcmFjZWROb2RlcyA9IHRyYWNlQWxsSW5wdXRzT2ZPcE5vZGUoc3ZnUm9vdCwgcmVuZGVyR3JhcGhJbmZvLCBvcE5vZGUsIGFsbFRyYWNlZE5vZGVzKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChub2RlSW5zdGFuY2UubmFtZSAhPT0gY3VycmVudFZpc2libGVQYXJlbnQubmFtZSkgewogICAgICAgICAgICAgICAgX2NyZWF0ZVZpc2libGVUcmFjZShzdmdSb290LCBub2RlSW5zdGFuY2UsIHN0YXJ0Tm9kZVBhcmVudHMsIGluZGV4ZWRTdGFydE5vZGVQYXJlbnRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBhbGxUcmFjZWROb2RlczsKICAgIH0KICAgIC8qKgogICAgICogQ29sb3JzIHRoZSBlZGdlcyB0byBjb25uZWN0IHRoZSBwYXNzZWQgbm9kZSB0byB0aGUgc3RhcnQgbm9kZS4gVGhpcyBpcwogICAgICogZG9uZSBieToKICAgICAqCiAgICAgKiBhKSBGaW5kaW5nIHRoZSBmaXJzdCAodmlzaWJsZSkgY29tbW9uIHBhcmVudCBpbiB0aGUgcmVuZGVyZWQKICAgICAqIGhpZXJhcmNoeS4KICAgICAqIE5COiBUaGVyZSBhcmUgMiB0eXBlcyBvZiBjb25uZWN0aW9uczoKICAgICAqIDEpIERpcmVjdCBjb25uZWN0aW9ucyBiZXR3ZWVuIG5vZGUgQQogICAgICogYW5kIEIsIG1hcmtlZCBiZWxvdyBhcyBJSSwKICAgICAqIDIpIENvbm5lY3Rpb25zIGZyb20gYW55IG5vZGUgQSB0byBpdHMgcGFyZW50LCBBJy4gTWFya2VkIGJlbG93IGFzIEkgYW5kIElJSS4KICAgICAqIEZvciB0eXBlIDIgY29ubmVjdGlvbiB5b3UgbmVlZCB0byBrbm93IHRoZSBpbm5lci1uZXN0ZWQgbm9kZSwgdGhlCiAgICAgKiBkaXJlY3QgcGFyZW50LCBhbmQgdGhlIHVsdGltYXRlIGRlc3RpbmF0aW9uIG9mIHRoZSBjb25uZWN0aW9uLgogICAgICoKICAgICAqICBBX3BhcmVudCAgICAgIEJfcGFyZW50CiAgICAgKiArLS0tLS0tLS0rICAgICstLS0tLS0tLS0rCiAgICAgKiB8ICAgICAgICB8ICAgIHwgICAgICAgICB8CiAgICAgKiB8ICArLS0rIEl8IElJIHxJSUkrLS0rICB8CiAgICAgKiB8ICB8QSArLS0tLS0tLS0tLT4rQiB8ICB8CiAgICAgKiB8ICArLS0rICB8ICAgIHwgICArLS0rICB8CiAgICAgKiB8ICAgICAgICB8ICAgIHwgICAgICAgICB8CiAgICAgKiArLS0tLS0tLS0rICAgICstLS0tLS0tLS0rCiAgICAgKgogICAgICoKICAgICAqIGIpIEhpZ2hsaWdodGluZyB0aGUgZGlyZWN0IGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgcGFyZW50cyBvZiBBIGFuZCBCLAogICAgICogY2FsbGVkIEFfcGFyZW50IGFuZCBCX3BhcmVudCwgcy50LiBBX3BhcmVudCBhbmQgQl9wYXJlbnQgYXJlIGNoaWxkcmVuIG9mIHRoZQogICAgICogbXV0dWFsIHBhcmVudCBvZiBBIGFuZCBCIGZvdW5kIGluIGEpLCBtYXJrZWQgYWJvdmUgYXMgSUkuCiAgICAgKgogICAgICogYykgSGlnaGxpZ2h0aW5nIHRoZSBjb25uZWN0aW9uIGZyb20gQSB0byBBX3BhcmVudCBhbmQgQiB0byBCX3BhcmVudAogICAgICogKHRocm91Z2ggYWxsIGxheWVycyBvZiBwYXJlbnRzIGJldHdlZW4gQSBhbmQgQV9wYXJlbnQgYW5kIEIgYW5kIEJfcGFyZW50LAogICAgICogcmVzcGVjdGl2ZWx5KS4gTWFya2VkIGFib3ZlIGFzIEkgYW5kIElJSS4KICAgICAqCiAgICAgKiBAcGFyYW0gbm9kZUluc3RhbmNlIFRoZSBpbnN0YW5jZSBvZiB0aGUgbm9kZSB0byB1c2UgYXMgZGVzdGluYXRpb24gbm9kZSwgQi4KICAgICAqIEBwYXJhbSBzdGFydE5vZGVQYXJlbnRzIE1hcCBvZiBzdGFydE5vZGVQYXJlbnQgbmFtZXMgdG8gaW5mb3JtYXRpb24gb2JqZWN0cwogICAgICogYWJvdXQgdGhlIHBhcmVudC4KICAgICAqIEBwYXJhbSBpbmRleGVkU3RhcnROb2RlUGFyZW50cyBBbiBhcnJheSBvZiBhbGwgcGFyZW50cyBvZiB0aGUgc3RhcnQgbm9kZS4KICAgICAqIFRoaXMgaXMgcmVxdWlyZWQgdG8gZmluZCB0aGUgY2hpbGQgb2YgdGhlIG11dHVhbCBwYXJlbnQgd2hpY2ggaXMgYSBwYXJlbnQKICAgICAqIG9mIHRoZSBzdGFydCBub2RlLgogICAgICogQHByaXZhdGUKICAgICAqLwogICAgZnVuY3Rpb24gX2NyZWF0ZVZpc2libGVUcmFjZShzdmdSb290LCBub2RlSW5zdGFuY2UsIHN0YXJ0Tm9kZVBhcmVudHMsIGluZGV4ZWRTdGFydE5vZGVQYXJlbnRzKSB7CiAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZUluc3RhbmNlOwogICAgICAgIGxldCBwcmV2aW91c05vZGUgPSBub2RlSW5zdGFuY2U7CiAgICAgICAgLy8gQXNjZW5kIHRocm91Z2ggcGFyZW50cyB1bnRpbCBhIG11dHVhbCBwYXJlbnQgaXMgZm91bmQgd2l0aCB0aGUgc3RhcnQKICAgICAgICAvLyBub2RlLgogICAgICAgIGxldCBkZXN0aW5hdGlvblBhcmVudFBhaXJzID0gW107CiAgICAgICAgd2hpbGUgKCFzdGFydE5vZGVQYXJlbnRzW2N1cnJlbnROb2RlLm5hbWVdKSB7CiAgICAgICAgICAgIGlmIChwcmV2aW91c05vZGUubmFtZSAhPT0gY3VycmVudE5vZGUubmFtZSkgewogICAgICAgICAgICAgICAgZGVzdGluYXRpb25QYXJlbnRQYWlycy5wdXNoKFtwcmV2aW91c05vZGUsIGN1cnJlbnROb2RlXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJldmlvdXNOb2RlID0gY3VycmVudE5vZGU7CiAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgLy8gQ29ubmVjdGlvbiBiZXR3ZWVuIG5vZGVzIGlzIGRyYXduIGJldHdlZW4gdGhlIHBhcmVudHMgb2YgZWFjaAogICAgICAgIC8vIHJlc3BlY3RpdmUgbm9kZSwgYm90aCBvZiB3aGljaCBzaGFyZSB0aGUgbXV0dWFsIHBhcmVudC4KICAgICAgICBsZXQgc3RhcnROb2RlSW5kZXggPSBzdGFydE5vZGVQYXJlbnRzW2N1cnJlbnROb2RlLm5hbWVdLmluZGV4OwogICAgICAgIGxldCBzdGFydE5vZGVOYW1lID0gaW5kZXhlZFN0YXJ0Tm9kZVBhcmVudHNbTWF0aC5tYXgoc3RhcnROb2RlSW5kZXggLSAxLCAwKV0ubmFtZTsKICAgICAgICBsZXQgc3RhcnROb2RlVG9wUGFyZW50TmFtZSA9IHN0YXJ0Tm9kZU5hbWU7CiAgICAgICAgbGV0IHRhcmdldE5vZGVUb3BQYXJlbnROYW1lID0gcHJldmlvdXNOb2RlLm5hbWU7CiAgICAgICAgbGV0IGVuZE5vZGVOYW1lID0gcHJldmlvdXNOb2RlLm5hbWU7CiAgICAgICAgY29uc3Qgc3ZnID0gc2VsZWN0KHN2Z1Jvb3QpOwogICAgICAgIHN2ZwogICAgICAgICAgICAuc2VsZWN0QWxsKGBbZGF0YS1lZGdlPSIke2VuZE5vZGVOYW1lfS0tJHtzdGFydE5vZGVOYW1lfSJdYCkKICAgICAgICAgICAgLmNsYXNzZWQoJ2lucHV0LWVkZ2UtaGlnaGxpZ2h0JywgdHJ1ZSk7CiAgICAgICAgLy8gVHJhY2UgdXAgdGhlIHBhcmVudHMgb2YgdGhlIGlucHV0LgogICAgICAgIGxvZGFzaC5lYWNoKGRlc3RpbmF0aW9uUGFyZW50UGFpcnMsIGZ1bmN0aW9uICh2YWx1ZSkgewogICAgICAgICAgICBsZXQgaW5uZXIgPSB2YWx1ZVswXTsKICAgICAgICAgICAgbGV0IG91dGVyID0gdmFsdWVbMV07CiAgICAgICAgICAgIGxldCBlZGdlU2VsZWN0b3IgPSBgW2RhdGEtZWRnZT0iJHtpbm5lci5uYW1lfS0tJHtzdGFydE5vZGVUb3BQYXJlbnROYW1lfWAgKwogICAgICAgICAgICAgICAgYH5+JHtvdXRlci5uYW1lfX5+T1VUIl1gOwogICAgICAgICAgICBzdmcuc2VsZWN0QWxsKGVkZ2VTZWxlY3RvcikuY2xhc3NlZCgnaW5wdXQtZWRnZS1oaWdobGlnaHQnLCB0cnVlKTsKICAgICAgICB9KTsKICAgICAgICAvLyBUcmFjZSB1cCB0aGUgcGFyZW50cyBvZiB0aGUgc3RhcnQgbm9kZS4KICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc3RhcnROb2RlSW5kZXg7IGluZGV4KyspIHsKICAgICAgICAgICAgbGV0IGlubmVyID0gaW5kZXhlZFN0YXJ0Tm9kZVBhcmVudHNbaW5kZXggLSAxXTsKICAgICAgICAgICAgbGV0IG91dGVyID0gaW5kZXhlZFN0YXJ0Tm9kZVBhcmVudHNbaW5kZXhdOwogICAgICAgICAgICBsZXQgZWRnZVNlbGVjdG9yID0gYFtkYXRhLWVkZ2U9IiR7dGFyZ2V0Tm9kZVRvcFBhcmVudE5hbWV9fn4ke291dGVyLm5hbWV9YCArCiAgICAgICAgICAgICAgICBgfn5JTi0tJHtpbm5lci5uYW1lfSJdYDsKICAgICAgICAgICAgc3ZnLnNlbGVjdEFsbChlZGdlU2VsZWN0b3IpLmNsYXNzZWQoJ2lucHV0LWVkZ2UtaGlnaGxpZ2h0JywgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIG1hcCB7IFtuYW1lOiBzdHJpbmddIC0+IE5vZGUgfSBvZiBhbGwgdmlzaWJsZSAvIHJlbmRlcmVkIHBhcmVudHMKICAgICAqIG9mIHRoZSBub2RlcyBpZGVudGlmaWVkIGJ5IHRoZSBub2RlIG5hbWVzIHBhc3NlZCBpbi4KICAgICAqCiAgICAgKiBAcGFyYW0gcmVuZGVyR3JhcGhJbmZvIFRoZSBpbmZvcm1hdGlvbiBvbiB0aGUgcmVuZGVyZWQgZ3JhcGguCiAgICAgKiBAcGFyYW0gbm9kZU5hbWVzIFN0cmluZyBhcnJheSBvZiBub2RlIG5hbWVzLgogICAgICogQHJldHVybnMge1tub2RlTmFtZTogc3RyaW5nXTogTm9kZX0KICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGZ1bmN0aW9uIF9maW5kVmlzaWJsZVBhcmVudHNGcm9tT3BOb2RlcyhyZW5kZXJHcmFwaEluZm8sIG5vZGVOYW1lcykgewogICAgICAgIGxldCB2aXNpYmxlUGFyZW50cyA9IHt9OwogICAgICAgIGxvZGFzaC5lYWNoKG5vZGVOYW1lcywgZnVuY3Rpb24gKG5vZGVOYW1lKSB7CiAgICAgICAgICAgIGxldCBjdXJyZW50Tm9kZSA9IHJlbmRlckdyYXBoSW5mby5nZXROb2RlQnlOYW1lKG5vZGVOYW1lKTsKICAgICAgICAgICAgbGV0IHZpc2libGVQYXJlbnQgPSBnZXRWaXNpYmxlUGFyZW50KHJlbmRlckdyYXBoSW5mbywgY3VycmVudE5vZGUpOwogICAgICAgICAgICB2aXNpYmxlUGFyZW50c1t2aXNpYmxlUGFyZW50Lm5hbWVdID0gdmlzaWJsZVBhcmVudDsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gdmlzaWJsZVBhcmVudHM7CiAgICB9CiAgICAvKioKICAgICAqIFRyYXZlcnNlIHRocm91Z2ggdGhlIHBhcmVudHMgb2YgYWxsIG5vZGVzIGluIHRoZSBsaXN0IGFuZCBtYXJrIGVhY2gKICAgICAqIGVuY291bnRlcmVkIG5vZGUgYXMgaW5wdXQtcGFyZW50LgogICAgICogQHBhcmFtIHZpc2libGVOb2RlcyBNYXAgb2YgaW5wdXQgbm9kZXMsIGhhdmUgdG8gYmUgdmlzaWJsZS9yZW5kZXJlZCB3aGVuCiAgICAgKiBjYWxsZWQuCiAgICAgKiBAcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfbWFya1BhcmVudHNPZk5vZGVzKHN2Z1Jvb3QsIHZpc2libGVOb2RlcykgewogICAgICAgIGxvZGFzaC5mb3JPd24odmlzaWJsZU5vZGVzLCBmdW5jdGlvbiAobm9kZUluc3RhbmNlKSB7CiAgICAgICAgICAgIC8vIE1hcmsgYWxsIHBhcmVudHMgb2YgdGhlIG5vZGUgYXMgaW5wdXQtcGFyZW50cy4KICAgICAgICAgICAgbGV0IGN1cnJlbnROb2RlID0gbm9kZUluc3RhbmNlOwogICAgICAgICAgICB3aGlsZSAoY3VycmVudE5vZGUubmFtZSAhPT0gUk9PVF9OQU1FKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZW5kZXJlZEVsZW1lbnRTZWxlY3Rpb24gPSBzZWxlY3Qoc3ZnUm9vdCkKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KGAubm9kZVtkYXRhLW5hbWU9IiR7Y3VycmVudE5vZGUubmFtZX0iXWApOwogICAgICAgICAgICAgICAgLy8gT25seSBtYXJrIHRoZSBlbGVtZW50IGFzIGEgcGFyZW50IG5vZGUgdG8gYW4gaW5wdXQgaWYgaXQgaXMgbm90CiAgICAgICAgICAgICAgICAvLyBtYXJrZWQgYXMgaW5wdXQgbm9kZSBpdHNlbGYuCiAgICAgICAgICAgICAgICBpZiAocmVuZGVyZWRFbGVtZW50U2VsZWN0aW9uLm5vZGVzKCkubGVuZ3RoICYmCiAgICAgICAgICAgICAgICAgICAgIXJlbmRlcmVkRWxlbWVudFNlbGVjdGlvbi5jbGFzc2VkKCdpbnB1dC1oaWdobGlnaHQnKSAmJgogICAgICAgICAgICAgICAgICAgICFyZW5kZXJlZEVsZW1lbnRTZWxlY3Rpb24uY2xhc3NlZCgnc2VsZWN0ZWQnKSAmJgogICAgICAgICAgICAgICAgICAgIC8vIE9wTm9kZSBvbmx5IHBhcmVudCBpZiBzdGFydCBub2RlIGlzIGVtYmVkZGVkIG5vZGUsIGluIHdoaWNoIGNhc2UKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgT3BOb2RlIHNob3VsZCBiZSBmYWRlZCBhcyB3ZWxsLgogICAgICAgICAgICAgICAgICAgICFyZW5kZXJlZEVsZW1lbnRTZWxlY3Rpb24uY2xhc3NlZCgnb3AnKSkgewogICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRWxlbWVudFNlbGVjdGlvbi5jbGFzc2VkKCdpbnB1dC1wYXJlbnQnLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBGaW5kIHRoZSBwYXJlbnQgb2YgdGhlIHBhc3NlZCBpbiBvcCBub2RlIHdoaWNoIGlzIGV4cGFuZGVkLiBUaGlzIGlzIGRvbmUKICAgICAqIGJ5IGdvaW5nIHRocm91Z2ggYWxsIHBhcmVudHMgdW50aWwgdGhlIHBhcmVudCdzIHBhcmVudCBpcyBleHBhbmRlZCwgdGh1cwogICAgICogZmluZGluZyB0aGUgZmlyc3QgdW5leHBhbmRlZCBwYXJlbnQgd2hpY2ggaXMgcmVuZGVyZWQgb24gdGhlIHNjcmVlbi4KICAgICAqIEBwYXJhbSByZW5kZXJHcmFwaEluZm8gVGhlIGdyYXBoIGluZm8gb2JqZWN0IHVzZWQgdG8gZ2FpbiBhY2Nlc3MgdG8gdGhlCiAgICAgKiByZW5kZXIgaW5mbyBvZiB0aGUgcGFyZW50cy4KICAgICAqIEBwYXJhbSBjdXJyZW50Tm9kZSBUaGUgbm9kZSB3aG9zZSBwYXJlbnQgaXMgdG8gYmUgZm91bmQuCiAgICAgKiBAcmV0dXJucyBOb2RlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFZpc2libGVQYXJlbnQocmVuZGVyR3JhcGhJbmZvLCBjdXJyZW50Tm9kZSkgewogICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgIGxldCBjdXJyZW50UGFyZW50ID0gY3VycmVudE5vZGU7CiAgICAgICAgd2hpbGUgKCFmb3VuZCkgewogICAgICAgICAgICAvLyBHZXQgcGFyZW50IGVsZW1lbnQsIHRvIGV4dHJhY3QgbmFtZS4KICAgICAgICAgICAgY3VycmVudE5vZGUgPSBjdXJyZW50UGFyZW50OwogICAgICAgICAgICBjdXJyZW50UGFyZW50ID0gY3VycmVudE5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgaWYgKGN1cnJlbnRQYXJlbnQgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbGV0IHJlbmRlck5vZGUgPSByZW5kZXJHcmFwaEluZm8uZ2V0UmVuZGVyTm9kZUJ5TmFtZShjdXJyZW50UGFyZW50Lm5hbWUpOwogICAgICAgICAgICAgICAgLy8gRm91bmQgaWYgbm9kZSBpcyByZW5kZXJlZCBvbiB0aGUgc2NyZWVuIChyZW5kZXJOb2RlIHRydXRoeSksIGFuZAogICAgICAgICAgICAgICAgLy8gdGhlIHBhcmVudCBpcyBlaXRoZXIgZXhwYW5kZWQgKGkuZS4gaXQgaXMgYSBtZXRhbm9kZSBvciBzZXJpZXNub2RlKQogICAgICAgICAgICAgICAgLy8gb3IgdGhlIHBhcmVudCBpcyBhbiBPcE5vZGUgaW4gd2hpY2ggY2FzZSBjdXJyZW50Tm9kZSBpcyBhbiBlbWJlZGRlZAogICAgICAgICAgICAgICAgLy8gbm9kZSB3aGljaCBoYXMgYW5vdGhlciBPcE5vZGUgYXMgcGFyZW50LgogICAgICAgICAgICAgICAgaWYgKHJlbmRlck5vZGUgJiYKICAgICAgICAgICAgICAgICAgICAocmVuZGVyTm9kZS5leHBhbmRlZCB8fCBjdXJyZW50UGFyZW50IGluc3RhbmNlb2YgT3BOb2RlSW1wbCkpIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9IC8vIENsb3NlIHdoaWxlIGxvb3AuCiAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlOwogICAgfQogICAgLyoqCiAgICAgKiBBbm5vdGF0aW9ucy4KICAgICAqLwogICAgZnVuY3Rpb24gYnVpbGRHcm91cEZvckFubm90YXRpb24oY29udGFpbmVyLCBhbm5vdGF0aW9uRGF0YSwgZCwgc2NlbmVFbGVtZW50KSB7CiAgICAgICAgLy8gU2VsZWN0IGFsbCBjaGlsZHJlbiBhbmQgam9pbiB3aXRoIGRhdGEuCiAgICAgICAgbGV0IGFubm90YXRpb25Hcm91cHMgPSBjb250YWluZXIKICAgICAgICAgICAgLnNlbGVjdEFsbChmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIC8vIHVzaW5nIGQzJ3Mgc2VsZWN0b3IgZnVuY3Rpb24KICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9tYm9zdG9jay9kMy9yZWxlYXNlcy90YWcvdjIuMC4wCiAgICAgICAgICAgIC8vIChJdCdzIG5vdCBsaXN0ZWQgaW4gdGhlIGQzIHdpa2kuKQogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlsZE5vZGVzOwogICAgICAgIH0pCiAgICAgICAgICAgIC5kYXRhKGFubm90YXRpb25EYXRhLmxpc3QsIChkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBkLm5vZGUubmFtZTsKICAgICAgICB9KTsKICAgICAgICBhbm5vdGF0aW9uR3JvdXBzCiAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAuYXR0cignZGF0YS1uYW1lJywgKGEpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGEubm9kZS5uYW1lOwogICAgICAgIH0pCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgIGxldCBhR3JvdXAgPSBzZWxlY3QodGhpcyk7CiAgICAgICAgICAgIC8vIEFkZCBhbm5vdGF0aW9uIHRvIHRoZSBpbmRleCBpbiB0aGUgc2NlbmUKICAgICAgICAgICAgc2NlbmVFbGVtZW50LmFkZEFubm90YXRpb25Hcm91cChhLCBkLCBhR3JvdXApOwogICAgICAgICAgICAvLyBBcHBlbmQgYW5ub3RhdGlvbiBlZGdlCiAgICAgICAgICAgIGxldCBlZGdlVHlwZSA9IENsYXNzJDEuQW5ub3RhdGlvbi5FREdFOwogICAgICAgICAgICBsZXQgbWV0YWVkZ2UgPSBhLnJlbmRlck1ldGFlZGdlSW5mbyAmJiBhLnJlbmRlck1ldGFlZGdlSW5mby5tZXRhZWRnZTsKICAgICAgICAgICAgaWYgKG1ldGFlZGdlICYmICFtZXRhZWRnZS5udW1SZWd1bGFyRWRnZXMpIHsKICAgICAgICAgICAgICAgIGVkZ2VUeXBlICs9ICcgJyArIENsYXNzJDEuQW5ub3RhdGlvbi5DT05UUk9MX0VER0U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgYW55IGVkZ2VzIGFyZSByZWZlcmVuY2UgZWRnZXMsIGFkZCB0aGUgcmVmZXJlbmNlIGVkZ2UgY2xhc3MuCiAgICAgICAgICAgIGlmIChtZXRhZWRnZSAmJiBtZXRhZWRnZS5udW1SZWZFZGdlcykgewogICAgICAgICAgICAgICAgZWRnZVR5cGUgKz0gJyAnICsgQ2xhc3MkMS5FZGdlLlJFRl9MSU5FOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFwcGVuZEVkZ2UoYUdyb3VwLCBhLCBzY2VuZUVsZW1lbnQsIGVkZ2VUeXBlKTsKICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUgIT09IEFubm90YXRpb25UeXBlLkVMTElQU0lTKSB7CiAgICAgICAgICAgICAgICBhZGRBbm5vdGF0aW9uTGFiZWxGcm9tTm9kZShhR3JvdXAsIGEpOwogICAgICAgICAgICAgICAgYnVpbGRTaGFwZUZvckFubm90YXRpb24oYUdyb3VwLCBhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGFkZEFubm90YXRpb25MYWJlbChhR3JvdXAsIGEubm9kZS5uYW1lLCBhLCBDbGFzcyQxLkFubm90YXRpb24uRUxMSVBTSVMpOwogICAgICAgICAgICB9CiAgICAgICAgfSkKICAgICAgICAgICAgLm1lcmdlKGFubm90YXRpb25Hcm91cHMpCiAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsIChhKSA9PiB7CiAgICAgICAgICAgIHJldHVybiAoQ2xhc3MkMS5Bbm5vdGF0aW9uLkdST1VQICsKICAgICAgICAgICAgICAgICcgJyArCiAgICAgICAgICAgICAgICBhbm5vdGF0aW9uVG9DbGFzc05hbWUoYS5hbm5vdGF0aW9uVHlwZSkgKwogICAgICAgICAgICAgICAgJyAnICsKICAgICAgICAgICAgICAgIG5vZGVDbGFzcyhhKSk7CiAgICAgICAgfSkKICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKGEpIHsKICAgICAgICAgICAgbGV0IGFHcm91cCA9IHNlbGVjdCh0aGlzKTsKICAgICAgICAgICAgdXBkYXRlKGFHcm91cCwgZCwgYSwgc2NlbmVFbGVtZW50KTsKICAgICAgICAgICAgaWYgKGEuYW5ub3RhdGlvblR5cGUgIT09IEFubm90YXRpb25UeXBlLkVMTElQU0lTKSB7CiAgICAgICAgICAgICAgICBhZGRJbnRlcmFjdGlvbkZvckFubm90YXRpb24oYUdyb3VwLCBkLCBhLCBzY2VuZUVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgYW5ub3RhdGlvbkdyb3VwcwogICAgICAgICAgICAuZXhpdCgpCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChhKSB7CiAgICAgICAgICAgIGxldCBhR3JvdXAgPSBzZWxlY3QodGhpcyk7CiAgICAgICAgICAgIC8vIFJlbW92ZSBhbm5vdGF0aW9uIGZyb20gdGhlIGluZGV4IGluIHRoZSBzY2VuZQogICAgICAgICAgICBzY2VuZUVsZW1lbnQucmVtb3ZlQW5ub3RhdGlvbkdyb3VwKGEsIGQsIGFHcm91cCk7CiAgICAgICAgfSkKICAgICAgICAgICAgLnJlbW92ZSgpOwogICAgICAgIHJldHVybiBhbm5vdGF0aW9uR3JvdXBzOwogICAgfQogICAgLyoqCiAgICAgKiBNYXBzIGFuIGFubm90YXRpb24gZW51bSB0byBhIGNsYXNzIG5hbWUgdXNlZCBpbiBjc3MgcnVsZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFubm90YXRpb25Ub0NsYXNzTmFtZShhbm5vdGF0aW9uVHlwZSkgewogICAgICAgIHJldHVybiAoQW5ub3RhdGlvblR5cGVbYW5ub3RhdGlvblR5cGVdIHx8ICcnKS50b0xvd2VyQ2FzZSgpIHx8IG51bGw7CiAgICB9CiAgICBmdW5jdGlvbiBidWlsZFNoYXBlRm9yQW5ub3RhdGlvbihhR3JvdXAsIGEpIHsKICAgICAgICBpZiAoYS5hbm5vdGF0aW9uVHlwZSA9PT0gQW5ub3RhdGlvblR5cGUuU1VNTUFSWSkgewogICAgICAgICAgICBsZXQgc3VtbWFyeSA9IHNlbGVjdE9yQ3JlYXRlQ2hpbGQoYUdyb3VwLCAndXNlJyk7CiAgICAgICAgICAgIHN1bW1hcnkKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdzdW1tYXJ5JykKICAgICAgICAgICAgICAgIC5hdHRyKCd4bGluazpocmVmJywgJyNzdW1tYXJ5LWljb24nKQogICAgICAgICAgICAgICAgLmF0dHIoJ2N1cnNvcicsICdwb2ludGVyJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBsZXQgc2hhcGUgPSBidWlsZFNoYXBlKGFHcm91cCwgYSwgQ2xhc3MkMS5Bbm5vdGF0aW9uLk5PREUpOwogICAgICAgICAgICAvLyBhZGQgdGl0bGUgdGFnIHRvIGdldCBuYXRpdmUgdG9vbHRpcHMKICAgICAgICAgICAgc2VsZWN0T3JDcmVhdGVDaGlsZChzaGFwZSwgJ3RpdGxlJykudGV4dChhLm5vZGUubmFtZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYWRkQW5ub3RhdGlvbkxhYmVsRnJvbU5vZGUoYUdyb3VwLCBhKSB7CiAgICAgICAgbGV0IG5hbWVQYXRoID0gYS5ub2RlLm5hbWUuc3BsaXQoJy8nKTsKICAgICAgICBsZXQgdGV4dCA9IG5hbWVQYXRoW25hbWVQYXRoLmxlbmd0aCAtIDFdOwogICAgICAgIHJldHVybiBhZGRBbm5vdGF0aW9uTGFiZWwoYUdyb3VwLCB0ZXh0LCBhLCBudWxsKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZEFubm90YXRpb25MYWJlbChhR3JvdXAsIGxhYmVsLCBhLCBhZGRpdGlvbmFsQ2xhc3NOYW1lcykgewogICAgICAgIGxldCBjbGFzc05hbWVzID0gQ2xhc3MkMS5Bbm5vdGF0aW9uLkxBQkVMOwogICAgICAgIGlmIChhZGRpdGlvbmFsQ2xhc3NOYW1lcykgewogICAgICAgICAgICBjbGFzc05hbWVzICs9ICcgJyArIGFkZGl0aW9uYWxDbGFzc05hbWVzOwogICAgICAgIH0KICAgICAgICBsZXQgdHh0RWxlbWVudCA9IGFHcm91cAogICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgY2xhc3NOYW1lcykKICAgICAgICAgICAgLmF0dHIoJ2R5JywgJy4zNWVtJykKICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgYS5pc0luID8gJ2VuZCcgOiAnc3RhcnQnKQogICAgICAgICAgICAudGV4dChsYWJlbCk7CiAgICAgICAgcmV0dXJuIGVuZm9yY2VMYWJlbFdpZHRoKHR4dEVsZW1lbnQsIC0xKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZEludGVyYWN0aW9uRm9yQW5ub3RhdGlvbihzZWxlY3Rpb24sIGQsIGFubm90YXRpb24sIHNjZW5lRWxlbWVudCkgewogICAgICAgIHNlbGVjdGlvbgogICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIChhKSA9PiB7CiAgICAgICAgICAgIHNjZW5lRWxlbWVudC5maXJlKCdhbm5vdGF0aW9uLWhpZ2hsaWdodCcsIHsKICAgICAgICAgICAgICAgIG5hbWU6IGEubm9kZS5uYW1lLAogICAgICAgICAgICAgICAgaG9zdE5hbWU6IGQubm9kZS5uYW1lLAogICAgICAgICAgICB9KTsKICAgICAgICB9KQogICAgICAgICAgICAub24oJ21vdXNlb3V0JywgKGEpID0+IHsKICAgICAgICAgICAgc2NlbmVFbGVtZW50LmZpcmUoJ2Fubm90YXRpb24tdW5oaWdobGlnaHQnLCB7CiAgICAgICAgICAgICAgICBuYW1lOiBhLm5vZGUubmFtZSwKICAgICAgICAgICAgICAgIGhvc3ROYW1lOiBkLm5vZGUubmFtZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfSkKICAgICAgICAgICAgLm9uKCdjbGljaycsIChhKSA9PiB7CiAgICAgICAgICAgIC8vIFN0b3AgdGhpcyBldmVudCdzIHByb3BhZ2F0aW9uIHNvIHRoYXQgaXQgaXNuJ3QgYWxzbyBjb25zaWRlcmVkIGEKICAgICAgICAgICAgLy8gZ3JhcGgtc2VsZWN0LgogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgc2NlbmVFbGVtZW50LmZpcmUoJ2Fubm90YXRpb24tc2VsZWN0JywgewogICAgICAgICAgICAgICAgbmFtZTogYS5ub2RlLm5hbWUsCiAgICAgICAgICAgICAgICBob3N0TmFtZTogZC5ub2RlLm5hbWUsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgICAgIGlmIChhbm5vdGF0aW9uLmFubm90YXRpb25UeXBlICE9PSBBbm5vdGF0aW9uVHlwZS5TVU1NQVJZICYmCiAgICAgICAgICAgIGFubm90YXRpb24uYW5ub3RhdGlvblR5cGUgIT09IEFubm90YXRpb25UeXBlLkNPTlNUQU5UKSB7CiAgICAgICAgICAgIHNlbGVjdGlvbi5vbignY29udGV4dG1lbnUnLCBnZXRNZW51KHNjZW5lRWxlbWVudCwgZ2V0Q29udGV4dE1lbnUoYW5ub3RhdGlvbi5ub2RlLCBzY2VuZUVsZW1lbnQpKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBZGp1c3QgYW5ub3RhdGlvbidzIHBvc2l0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSBhR3JvdXAgc2VsZWN0aW9uIG9mIGEgJ2cuYW5ub3RhdGlvbicgZWxlbWVudC4KICAgICAqIEBwYXJhbSBkIEhvc3Qgbm9kZSBkYXRhLgogICAgICogQHBhcmFtIGEgYW5ub3RhdGlvbiBub2RlIGRhdGEuCiAgICAgKiBAcGFyYW0gc2NlbmVFbGVtZW50IDx0Zi1ncmFwaC1zY2VuZT4gcG9seW1lciBlbGVtZW50LgogICAgICovCiAgICBmdW5jdGlvbiB1cGRhdGUoYUdyb3VwLCBkLCBhLCBzY2VuZUVsZW1lbnQpIHsKICAgICAgICBsZXQgY3ggPSBjb21wdXRlQ1hQb3NpdGlvbk9mTm9kZVNoYXBlKGQpOwogICAgICAgIC8vIEFubm90YXRpb25zIHRoYXQgcG9pbnQgdG8gZW1iZWRkZWQgbm9kZXMgKGNvbnN0YW50cyxzdW1tYXJ5KQogICAgICAgIC8vIGRvbid0IGhhdmUgYSByZW5kZXIgaW5mb3JtYXRpb24gYXR0YWNoZWQgc28gd2UgZG9uJ3Qgc3R5bGl6ZSB0aGVzZS4KICAgICAgICAvLyBBbHNvIHdlIGRvbid0IHN0eWxpemUgZWxsaXBzaXMgYW5ub3RhdGlvbnMgKHRoZSBzdHJpbmcgJy4uLiBhbmQgWCBtb3JlJykuCiAgICAgICAgaWYgKGEucmVuZGVyTm9kZUluZm8gJiYgYS5hbm5vdGF0aW9uVHlwZSAhPT0gQW5ub3RhdGlvblR5cGUuRUxMSVBTSVMpIHsKICAgICAgICAgICAgc3R5bGl6ZSQxKGFHcm91cCwgYS5yZW5kZXJOb2RlSW5mbywgc2NlbmVFbGVtZW50LCBDbGFzcyQxLkFubm90YXRpb24uTk9ERSk7CiAgICAgICAgfQogICAgICAgIGlmIChhLmFubm90YXRpb25UeXBlID09PSBBbm5vdGF0aW9uVHlwZS5TVU1NQVJZKSB7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgd2lkdGggb2YgdGhlIGFubm90YXRpb24gdG8gZ2l2ZSBzcGFjZSBmb3IgdGhlIGltYWdlLgogICAgICAgICAgICBhLndpZHRoICs9IDEwOwogICAgICAgIH0KICAgICAgICAvLyBsYWJlbCBwb3NpdGlvbgogICAgICAgIGFHcm91cAogICAgICAgICAgICAuc2VsZWN0KCd0ZXh0LicgKyBDbGFzcyQxLkFubm90YXRpb24uTEFCRUwpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ3gnLCBjeCArIGEuZHggKyAoYS5pc0luID8gLTEgOiAxKSAqIChhLndpZHRoIC8gMiArIGEubGFiZWxPZmZzZXQpKQogICAgICAgICAgICAuYXR0cigneScsIGQueSArIGEuZHkpOwogICAgICAgIC8vIFNvbWUgYW5ub3RhdGlvbnMgKHN1Y2ggYXMgc3VtbWFyeSkgYXJlIHJlcHJlc2VudGVkIHVzaW5nIGEgMTJ4MTIgaW1hZ2UgdGFnLgogICAgICAgIC8vIFB1cnBvc2VseSBvbWl0dGVkIHVuaXRzIChlLmcuIHBpeGVscykgc2luY2UgdGhlIGltYWdlcyBhcmUgdmVjdG9yIGdyYXBoaWNzLgogICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGltYWdlLCB3ZSBhZGp1c3QgdGhlIGxvY2F0aW9uIG9mIHRoZSBpbWFnZSB0byBiZSB2ZXJ0aWNhbGx5CiAgICAgICAgLy8gY2VudGVyZWQgd2l0aCB0aGUgbm9kZSBhbmQgaG9yaXpvbnRhbGx5IGNlbnRlcmVkIGJldHdlZW4gdGhlIGFycm93IGFuZCB0aGUKICAgICAgICAvLyB0ZXh0IGxhYmVsLgogICAgICAgIGFHcm91cAogICAgICAgICAgICAuc2VsZWN0KCd1c2Uuc3VtbWFyeScpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ3gnLCBjeCArIGEuZHggLSAzKQogICAgICAgICAgICAuYXR0cigneScsIGQueSArIGEuZHkgLSA2KTsKICAgICAgICAvLyBOb2RlIHBvc2l0aW9uIChvbmx5IG9uZSBvZiB0aGUgc2hhcGUgc2VsZWN0aW9uIHdpbGwgYmUgbm9uLWVtcHR5LikKICAgICAgICBwb3NpdGlvbkVsbGlwc2UoYUdyb3VwLnNlbGVjdCgnLicgKyBDbGFzcyQxLkFubm90YXRpb24uTk9ERSArICcgZWxsaXBzZScpLCBjeCArIGEuZHgsIGQueSArIGEuZHksIGEud2lkdGgsIGEuaGVpZ2h0KTsKICAgICAgICBwb3NpdGlvblJlY3QoYUdyb3VwLnNlbGVjdCgnLicgKyBDbGFzcyQxLkFubm90YXRpb24uTk9ERSArICcgcmVjdCcpLCBjeCArIGEuZHgsIGQueSArIGEuZHksIGEud2lkdGgsIGEuaGVpZ2h0KTsKICAgICAgICBwb3NpdGlvblJlY3QoYUdyb3VwLnNlbGVjdCgnLicgKyBDbGFzcyQxLkFubm90YXRpb24uTk9ERSArICcgdXNlJyksIGN4ICsgYS5keCwgZC55ICsgYS5keSwgYS53aWR0aCwgYS5oZWlnaHQpOwogICAgICAgIC8vIEVkZ2UgcG9zaXRpb24KICAgICAgICBhR3JvdXAKICAgICAgICAgICAgLnNlbGVjdCgncGF0aC4nICsgQ2xhc3MkMS5Bbm5vdGF0aW9uLkVER0UpCiAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgLmF0dHIoJ2QnLCAoYSkgPT4gewogICAgICAgICAgICAvLyBtYXAgcmVsYXRpdmUgcG9zaXRpb24gdG8gYWJzb2x1dGUgcG9zaXRpb24KICAgICAgICAgICAgbGV0IHBvaW50cyA9IGEucG9pbnRzLm1hcCgocCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHsgeDogcC5keCArIGN4LCB5OiBwLmR5ICsgZC55IH07CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gaW50ZXJwb2xhdGUkNyhwb2ludHMpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBTY2VuZS4KICAgICAqLwogICAgLyoqCiAgICAgKiBTZWxlY3Qgb3IgY3JlYXRlIGEgc2NlbmVHcm91cCBhbmQgYnVpbGQvdXBkYXRlIGl0cyBub2RlcyBhbmQgZWRnZXMuCiAgICAgKgogICAgICogU3RydWN0dXJlIFBhdHRlcm46CiAgICAgKgogICAgICogPGcgY2xhc3M9J3NjZW5lJz4KICAgICAqICAgPGcgY2xhc3M9J2NvcmUnPgogICAgICogICAgIDxnIGNsYXNzPSdlZGdlcyc+CiAgICAgKiAgICAgICAuLi4gc3R1ZmYgZnJvbSB0Zi5ncmFwaC5zY2VuZS5lZGdlcy5idWlsZCAuLi4KICAgICAqICAgICA8L2c+CiAgICAgKiAgICAgPGcgY2xhc3M9J25vZGVzJz4KICAgICAqICAgICAgIC4uLiBzdHVmZiBmcm9tIHRmLmdyYXBoLnNjZW5lLm5vZGVzLmJ1aWxkIC4uLgogICAgICogICAgIDwvZz4KICAgICAqICAgPC9nPgogICAgICogICA8ZyBjbGFzcz0naW4tZXh0cmFjdCc+CiAgICAgKiAgICAgPGcgY2xhc3M9J25vZGVzJz4KICAgICAqICAgICAgIC4uLiBzdHVmZiBmcm9tIHRmLmdyYXBoLnNjZW5lLm5vZGVzLmJ1aWxkIC4uLgogICAgICogICAgIDwvZz4KICAgICAqICAgPC9nPgogICAgICogICA8ZyBjbGFzcz0nb3V0LWV4dHJhY3QnPgogICAgICogICAgIDxnIGNsYXNzPSdub2Rlcyc+CiAgICAgKiAgICAgICAuLi4gc3R1ZmYgZnJvbSB0Zi5ncmFwaC5zY2VuZS5ub2Rlcy5idWlsZCAuLi4KICAgICAqICAgICA8L2c+CiAgICAgKiAgIDwvZz4KICAgICAqIDwvZz4KICAgICAqCiAgICAgKiBAcGFyYW0gY29udGFpbmVyIEQzIHNlbGVjdGlvbiBvZiB0aGUgcGFyZW50LgogICAgICogQHBhcmFtIHJlbmRlck5vZGUgcmVuZGVyIG5vZGUgb2YgYSBtZXRhbm9kZSBvciBzZXJpZXMgbm9kZS4KICAgICAqIEBwYXJhbSBzY2VuZUVsZW1lbnQgPHRmLWdyYXBoLXNjZW5lPiBwb2x5bWVyIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gc2NlbmVDbGFzcyBjbGFzcyBhdHRyaWJ1dGUgb2YgdGhlIHNjZW5lIChkZWZhdWx0PSdzY2VuZScpLgogICAgICovCiAgICBmdW5jdGlvbiBidWlsZEdyb3VwRm9yU2NlbmUoY29udGFpbmVyLCByZW5kZXJOb2RlLCBzY2VuZUVsZW1lbnQsIHNjZW5lQ2xhc3MpIHsKICAgICAgICBzY2VuZUNsYXNzID0gc2NlbmVDbGFzcyB8fCBDbGFzcyQxLlNjZW5lLkdST1VQOwogICAgICAgIGxldCBpc05ld1NjZW5lR3JvdXAgPSBzZWxlY3RDaGlsZChjb250YWluZXIsICdnJywgc2NlbmVDbGFzcykuZW1wdHkoKTsKICAgICAgICBsZXQgc2NlbmVHcm91cCA9IHNlbGVjdE9yQ3JlYXRlQ2hpbGQoY29udGFpbmVyLCAnZycsIHNjZW5lQ2xhc3MpOwogICAgICAgIC8vIGNvcmUKICAgICAgICBsZXQgY29yZUdyb3VwID0gc2VsZWN0T3JDcmVhdGVDaGlsZChzY2VuZUdyb3VwLCAnZycsIENsYXNzJDEuU2NlbmUuQ09SRSk7CiAgICAgICAgbGV0IGNvcmVOb2RlcyA9IGxvZGFzaC5yZWR1Y2UocmVuZGVyTm9kZS5jb3JlR3JhcGgubm9kZXMoKSwgKG5vZGVzLCBuYW1lKSA9PiB7CiAgICAgICAgICAgIGxldCBub2RlID0gcmVuZGVyTm9kZS5jb3JlR3JhcGgubm9kZShuYW1lKTsKICAgICAgICAgICAgaWYgKCFub2RlLmV4Y2x1ZGVkKSB7CiAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBub2RlczsKICAgICAgICB9LCBbXSk7CiAgICAgICAgaWYgKHJlbmRlck5vZGUubm9kZS50eXBlID09PSBOb2RlVHlwZS5TRVJJRVMpIHsKICAgICAgICAgICAgLy8gRm9yIHNlcmllcywgd2Ugd2FudCB0aGUgZmlyc3QgaXRlbSBvbiB0b3AsIHNvIHJldmVyc2UgdGhlIGFycmF5IHNvCiAgICAgICAgICAgIC8vIHRoZSBmaXJzdCBpdGVtIGluIHRoZSBzZXJpZXMgYmVjb21lcyBsYXN0IGl0ZW0gaW4gdGhlIHRvcCwgYW5kIHRodXMKICAgICAgICAgICAgLy8gaXMgcmVuZGVyZWQgb24gdGhlIHRvcC4KICAgICAgICAgICAgY29yZU5vZGVzLnJldmVyc2UoKTsKICAgICAgICB9CiAgICAgICAgLy8gQ3JlYXRlIHRoZSBsYXllciBvZiBlZGdlcyBmb3IgdGhpcyBzY2VuZSAocGF0aHMpLgogICAgICAgIGJ1aWxkR3JvdXAoY29yZUdyb3VwLCByZW5kZXJOb2RlLmNvcmVHcmFwaCwgc2NlbmVFbGVtZW50KTsKICAgICAgICAvLyBDcmVhdGUgdGhlIGxheWVyIG9mIG5vZGVzIGZvciB0aGlzIHNjZW5lIChlbGxpcHNlcywgcmVjdHMgZXRjKS4KICAgICAgICBidWlsZEdyb3VwJDEoY29yZUdyb3VwLCBjb3JlTm9kZXMsIHNjZW5lRWxlbWVudCk7CiAgICAgICAgLy8gSW4tZXh0cmFjdAogICAgICAgIGlmIChyZW5kZXJOb2RlLmlzb2xhdGVkSW5FeHRyYWN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGV0IGluRXh0cmFjdEdyb3VwID0gc2VsZWN0T3JDcmVhdGVDaGlsZChzY2VuZUdyb3VwLCAnZycsIENsYXNzJDEuU2NlbmUuSU5FWFRSQUNUKTsKICAgICAgICAgICAgYnVpbGRHcm91cCQxKGluRXh0cmFjdEdyb3VwLCByZW5kZXJOb2RlLmlzb2xhdGVkSW5FeHRyYWN0LCBzY2VuZUVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2VsZWN0Q2hpbGQoc2NlbmVHcm91cCwgJ2cnLCBDbGFzcyQxLlNjZW5lLklORVhUUkFDVCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIC8vIE91dC1leHRyYWN0CiAgICAgICAgaWYgKHJlbmRlck5vZGUuaXNvbGF0ZWRPdXRFeHRyYWN0Lmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgbGV0IG91dEV4dHJhY3RHcm91cCA9IHNlbGVjdE9yQ3JlYXRlQ2hpbGQoc2NlbmVHcm91cCwgJ2cnLCBDbGFzcyQxLlNjZW5lLk9VVEVYVFJBQ1QpOwogICAgICAgICAgICBidWlsZEdyb3VwJDEob3V0RXh0cmFjdEdyb3VwLCByZW5kZXJOb2RlLmlzb2xhdGVkT3V0RXh0cmFjdCwgc2NlbmVFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNlbGVjdENoaWxkKHNjZW5lR3JvdXAsICdnJywgQ2xhc3MkMS5TY2VuZS5PVVRFWFRSQUNUKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgLy8gTGlicmFyeSBmdW5jdGlvbnMKICAgICAgICBpZiAocmVuZGVyTm9kZS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIGxldCBvdXRFeHRyYWN0R3JvdXAgPSBzZWxlY3RPckNyZWF0ZUNoaWxkKHNjZW5lR3JvdXAsICdnJywgQ2xhc3MkMS5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKTsKICAgICAgICAgICAgYnVpbGRHcm91cCQxKG91dEV4dHJhY3RHcm91cCwgcmVuZGVyTm9kZS5saWJyYXJ5RnVuY3Rpb25zRXh0cmFjdCwgc2NlbmVFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHNlbGVjdENoaWxkKHNjZW5lR3JvdXAsICdnJywgQ2xhc3MkMS5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgcG9zaXRpb24kMShzY2VuZUdyb3VwLCByZW5kZXJOb2RlKTsKICAgICAgICAvLyBGYWRlIGluIHRoZSBzY2VuZSBncm91cCBpZiBpdCBkaWRuJ3QgYWxyZWFkeSBleGlzdC4KICAgICAgICBpZiAoaXNOZXdTY2VuZUdyb3VwKSB7CiAgICAgICAgICAgIHNjZW5lR3JvdXAuYXR0cignb3BhY2l0eScsIDApLnRyYW5zaXRpb24oKS5hdHRyKCdvcGFjaXR5JywgMSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY2VuZUdyb3VwOwogICAgfQoKICAgIHZhciB0Zl9ncmFwaF9zY2VuZV9ub2RlID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgICAgIF9fcHJvdG9fXzogbnVsbCwKICAgICAgICBidWlsZEdyb3VwOiBidWlsZEdyb3VwJDEsCiAgICAgICAgZ2V0Q29udGV4dE1lbnU6IGdldENvbnRleHRNZW51LAogICAgICAgIGNhbkJlSW5TZXJpZXM6IGNhbkJlSW5TZXJpZXMsCiAgICAgICAgZ2V0U2VyaWVzTmFtZTogZ2V0U2VyaWVzTmFtZSwKICAgICAgICBnZXRHcm91cFNldHRpbmdMYWJlbDogZ2V0R3JvdXBTZXR0aW5nTGFiZWwsCiAgICAgICAgZW5mb3JjZUxhYmVsV2lkdGg6IGVuZm9yY2VMYWJlbFdpZHRoLAogICAgICAgIGJ1aWxkU2hhcGU6IGJ1aWxkU2hhcGUsCiAgICAgICAgbm9kZUNsYXNzOiBub2RlQ2xhc3MsCiAgICAgICAgZ2V0IENvbG9yQnkgKCkgeyByZXR1cm4gQ29sb3JCeTsgfSwKICAgICAgICByZW1vdmVHcmFkaWVudERlZmluaXRpb25zOiByZW1vdmVHcmFkaWVudERlZmluaXRpb25zLAogICAgICAgIGdldEZpbGxGb3JOb2RlOiBnZXRGaWxsRm9yTm9kZSwKICAgICAgICBzdHlsaXplOiBzdHlsaXplJDEsCiAgICAgICAgZ2V0U3Ryb2tlRm9yRmlsbDogZ2V0U3Ryb2tlRm9yRmlsbCwKICAgICAgICB1cGRhdGVJbnB1dFRyYWNlOiB1cGRhdGVJbnB1dFRyYWNlLAogICAgICAgIGdldFZpc2libGVQYXJlbnQ6IGdldFZpc2libGVQYXJlbnQsCiAgICAgICAgYnVpbGRHcm91cEZvckFubm90YXRpb246IGJ1aWxkR3JvdXBGb3JBbm5vdGF0aW9uLAogICAgICAgIGJ1aWxkR3JvdXBGb3JTY2VuZTogYnVpbGRHcm91cEZvclNjZW5lCiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZk5vZGVJY29uID0gY2xhc3MgVGZOb2RlSWNvbiBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTm9kZSB0byByZXByZXNlbnQgd2l0aCBhbiBpY29uLiBPcHRpb25hbCwgYnV0IGlmIHNwZWNpZmllZCwgaXRzCiAgICAgICAgICAgICAqIHByb3BlcnRpZXMgb3ZlcnJpZGUgdGhvc2UgZGVmaW5lZCBpbiB0aGUgdHlwZSwgdmVydGljYWwsIGNvbnN0IGFuZAogICAgICAgICAgICAgKiBzdW1tYXJ5IHByb3BlcnRpZXMuCiAgICAgICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYSB0Zi5ncmFwaC5Ob2RlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5ub2RlID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFJlbmRlciBub2RlIGluZm9ybWF0aW9uIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG5vZGUuIE9wdGlvbmFsLiBJZgogICAgICAgICAgICAgKiBzcGVjaWZpZWQsIHRoaXMgaXMgb25seSB1c2VkIHdoZW4gY29tcHV0aW5nIHRoZSBmaWxsIG9mIHRoZSBpY29uCiAgICAgICAgICAgICAqIGVsZW1lbnQuCiAgICAgICAgICAgICAqIFRoaXMgcHJvcGVydHkgaXMgYSB0Zi5ncmFwaC5yZW5kZXIuUmVuZGVyTm9kZUluZm8uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnJlbmRlckluZm8gPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyaW5nIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgY29sb3JpbmcgdG8gdXNlIGZvciB0aGlzIG5vZGUsIHVzZWQKICAgICAgICAgICAgICogb25seSBmb3IgZGV0ZXJtaW5pbmcgdGhlIGZpbGwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNvbG9yQnkgPSAnc3RydWN0dXJhbCc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBGdW5jdGlvbiB1c2VkIGJ5IHN0cnVjdHVyYWwgY29sb3JpbmcgYWxnb3JpdGhtIHRvIGRldGVybWluZSB3aGljaAogICAgICAgICAgICAgKiBjb2xvciB0byB1c2UgYmFzZWQgb24gdGhlIHRlbXBsYXRlIElEIG9mIHRoZSBub2RlLiBPcHRpb25hbC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVJbmRleCA9IG51bGw7CiAgICAgICAgICAgIC8qKiBUeXBlIG9mIG5vZGUgdG8gZHJhdyAoaWdub3JlZCBpZiBub2RlIGlzIHNldCkuICovCiAgICAgICAgICAgIHRoaXMudHlwZSA9IG51bGw7CiAgICAgICAgICAgIC8qKiBEaXJlY3Rpb24gZm9yIHNlcmllcyAoaWdub3JlZCBmb3Igb3RoZXIgdHlwZXMpLiAqLwogICAgICAgICAgICB0aGlzLnZlcnRpY2FsID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBXaGV0aGVyIHRoZSBvcCBpcyBDb25zdCAoaWdub3JlZCBmb3Igbm9uLW9wcykuICovCiAgICAgICAgICAgIHRoaXMuY29uc3QgPSBmYWxzZTsKICAgICAgICAgICAgLyoqIFdoZXRoZXIgdGhlIG9wIGlzIGEgU3VtbWFyeSAoaWdub3JlZCBmb3Igbm9uLW9wcykuICovCiAgICAgICAgICAgIHRoaXMuc3VtbWFyeSA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRmlsbCBmb3IgdGhlIGljb24sIG9wdGlvbmFsLiBJZiBmaWxsIGlzIHNwZWNpZmllZCBhbmQgbm9kZSBpcyBub3QKICAgICAgICAgICAgICogc3BlY2lmaWVkLCB0aGVuIHRoaXMgdmFsdWUgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCBmb3IgdGhlCiAgICAgICAgICAgICAqIGVsZW1lbnQuIEhvd2V2ZXIsIGlmIG5vZGUgaXMgc3BlY2lmaWVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZmlsbCA9IG51bGw7CiAgICAgICAgICAgIC8qKiBIZWlnaHQgb2YgdGhlIFNWRyBlbGVtZW50IGluIHBpeGVscywgdXNlZCBmb3Igc2NhbGluZy4gKi8KICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSAyMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBmaWxsIHZhbHVlIGJhc2VkIG9uIG5vZGUgYW5kIGNvbmZpZ3VyYXRpb24uIElmIGFueSBvZiB0aG9zZQogICAgICAgICAqIGNvbmZpZ3VyYXRpb25zIG9yIG5vZGUgdmFsdWUgbWlzc2luZywgaXQgcmV0dXJucyBgZmlsbGAgcHJvcGVydHkuCiAgICAgICAgICogTm90ZSB0aGF0IGlmIHRoaXMgZXZhbHVhdGVzIHRvIG51bGwsIGl0IHdpbGwgYmUgY2hvc2VuIGJhc2VkIG9uCiAgICAgICAgICogdGhlIHR5cGUgb2YgdGhlIG5vZGUuCiAgICAgICAgICovCiAgICAgICAgX2NvbXB1dGVGaWxsT3ZlcnJpZGUoaW5wdXROb2RlLCBpbnB1dFJlbmRlckluZm8sIGlucHV0Q29sb3JCeSwgaW5wdXRUZW1wbGF0ZUluZGV4LCBpbnB1dEZpbGwpIHsKICAgICAgICAgICAgaWYgKGlucHV0Tm9kZSAmJiBpbnB1dFJlbmRlckluZm8gJiYgaW5wdXRDb2xvckJ5ICYmIGlucHV0VGVtcGxhdGVJbmRleCkgewogICAgICAgICAgICAgICAgdmFyIG5zID0gdGZfZ3JhcGhfc2NlbmVfbm9kZTsKICAgICAgICAgICAgICAgIHZhciBjb2xvckJ5ID0gbnMuQ29sb3JCeVtpbnB1dENvbG9yQnkudG9VcHBlckNhc2UoKV07CiAgICAgICAgICAgICAgICByZXR1cm4gbnMuZ2V0RmlsbEZvck5vZGUoaW5wdXRUZW1wbGF0ZUluZGV4LCBjb2xvckJ5LCBpbnB1dFJlbmRlckluZm8sIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaW5wdXRGaWxsOwogICAgICAgIH0KICAgICAgICBfZ2V0U3Ryb2tlT3ZlcnJpZGUoZmlsbE92ZXJyaWRlKSB7CiAgICAgICAgICAgIHJldHVybiBmaWxsT3ZlcnJpZGUKICAgICAgICAgICAgICAgID8gZ2V0U3Ryb2tlRm9yRmlsbChmaWxsT3ZlcnJpZGUpCiAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgZ3JhcGgtaWNvbiB0eXBlIGZyb20gaW5wdXQsIHR5cGUsIGFuZCBzdW1tYXJ5LgogICAgICAgICAqLwogICAgICAgIF9nZXRUeXBlKGlucHV0Tm9kZSwgaXNTdW1tYXJ5LCBpc0NvbnN0LCBpbnB1dFR5cGUpIHsKICAgICAgICAgICAgY29uc3QgeyBHcmFwaEljb25UeXBlIH0gPSB0Zl9ncmFwaF9pY29uOwogICAgICAgICAgICBpZiAoaW5wdXROb2RlKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGlucHV0Tm9kZS50eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBOb2RlVHlwZS5PUDogewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcE5hbWUgPSBpbnB1dE5vZGUub3A7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8odGVuc29yYm9hcmFkLXRlYW0pOiBgb3BgIHNob3VsZCBoYXZlIGEgcHJlZGljdGFibGUgdHlwZS4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSB0eXBlIGNoZWNrLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wTmFtZSAhPT0gJ3N0cmluZycpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gR3JhcGhJY29uVHlwZS5PUDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wTmFtZSA9PT0gJ0NvbnN0JyB8fCBpc0NvbnN0KQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdyYXBoSWNvblR5cGUuQ09OU1Q7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcE5hbWUuZW5kc1dpdGgoJ1N1bW1hcnknKSB8fCBpc1N1bW1hcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBHcmFwaEljb25UeXBlLlNVTU1BUlk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdyYXBoSWNvblR5cGUuT1A7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZVR5cGUuTUVUQToKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdyYXBoSWNvblR5cGUuTUVUQTsKICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGVUeXBlLlNFUklFUzoKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEdyYXBoSWNvblR5cGUuU0VSSUVTOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbnB1dFR5cGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3Qgd2hldGhlciB0aGUgc3BlY2lmaWVkIG5vZGUgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIGEgdmVydGljYWwKICAgICAgICAgKiBzZXJpZXMuIERlZmF1bHRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmVydGljYWwgcHJvcGVydHkgaWYgbm9kZSBpcwogICAgICAgICAqIG5vdCBzcGVjaWZpZWQuCiAgICAgICAgICovCiAgICAgICAgX2lzVmVydGljYWwoaW5wdXROb2RlLCBpbnB1dFZlcnRpY2FsKSB7CiAgICAgICAgICAgIGlmIChpbnB1dE5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dE5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAhIWlucHV0VmVydGljYWw7CiAgICAgICAgfQogICAgICAgIF9nZXRGYWRlZChpdGVtUmVuZGVySW5mbykgewogICAgICAgICAgICByZXR1cm4gaXRlbVJlbmRlckluZm8gJiYgaXRlbVJlbmRlckluZm8uaXNGYWRlZE91dDsKICAgICAgICB9CiAgICAgICAgX29uRmlsbE92ZXJyaWRlQ2hhbmdlZChuZXdGaWxsLCBvbGRGaWxsKSB7CiAgICAgICAgICAgIGNvbnN0IHsgbm9kZSwgcmVuZGVySW5mbywgY29sb3JCeSwgdGVtcGxhdGVJbmRleCB9ID0gdGhpczsKICAgICAgICAgICAgY29uc3QgbnMgPSB0Zl9ncmFwaF9zY2VuZV9ub2RlOwogICAgICAgICAgICBpZiAobmV3RmlsbCAhPT0gb2xkRmlsbCkgewogICAgICAgICAgICAgICAgbnMucmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuaWNvbi5nZXRTdmdEZWZpbmFibGVFbGVtZW50KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub2RlICYmIHJlbmRlckluZm8gJiYgY29sb3JCeSAmJiB0ZW1wbGF0ZUluZGV4KSB7CiAgICAgICAgICAgICAgICBjb25zdCBuc0NvbG9yQnkgPSBucy5Db2xvckJ5W2NvbG9yQnkudG9VcHBlckNhc2UoKV07CiAgICAgICAgICAgICAgICBucy5nZXRGaWxsRm9yTm9kZSh0ZW1wbGF0ZUluZGV4LCBuc0NvbG9yQnksIHJlbmRlckluZm8sIGZhbHNlLCB0aGlzLiQuaWNvbi5nZXRTdmdEZWZpbmFibGVFbGVtZW50KCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIFRmTm9kZUljb24udGVtcGxhdGUgPSBodG1sIGAKICAgIDxzdHlsZT4KICAgICAgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgLS10Yi1ncmFwaC1mYWRlZDogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRmLWdyYXBoLWljb24KICAgICAgaWQ9Imljb24iCiAgICAgIHR5cGU9IltbX2dldFR5cGUobm9kZSwgc3VtbWFyeSwgY29uc3QsIHR5cGUpXV0iCiAgICAgIGhlaWdodD0iW1toZWlnaHRdXSIKICAgICAgZmlsbC1vdmVycmlkZT0iW1tfZmlsbE92ZXJyaWRlXV0iCiAgICAgIHN0cm9rZS1vdmVycmlkZT0iW1tfZ2V0U3Ryb2tlT3ZlcnJpZGUoX2ZpbGxPdmVycmlkZSldXSIKICAgICAgZmFkZWQ9IltbX2dldEZhZGVkKHJlbmRlckluZm8pXV0iCiAgICAgIHZlcnRpY2FsPSJbW19pc1ZlcnRpY2FsKG5vZGUsIHZlcnRpY2FsKV1dIgogICAgPjwvdGYtZ3JhcGgtaWNvbj4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJY29uLnByb3RvdHlwZSwgIm5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJY29uLnByb3RvdHlwZSwgInJlbmRlckluZm8iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJY29uLnByb3RvdHlwZSwgImNvbG9yQnkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJY29uLnByb3RvdHlwZSwgInRlbXBsYXRlSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk5vZGVJY29uLnByb3RvdHlwZSwgInR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmTm9kZUljb24ucHJvdG90eXBlLCAidmVydGljYWwiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmTm9kZUljb24ucHJvdG90eXBlLCAiY29uc3QiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmTm9kZUljb24ucHJvdG90eXBlLCAic3VtbWFyeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmTm9kZUljb24ucHJvdG90eXBlLCAiZmlsbCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmTm9kZUljb24ucHJvdG90eXBlLCAiaGVpZ2h0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBjb21wdXRlZDogJ19jb21wdXRlRmlsbE92ZXJyaWRlKG5vZGUsIHJlbmRlckluZm8sIGNvbG9yQnksIHRlbXBsYXRlSW5kZXgsIGZpbGwpJywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfb25GaWxsT3ZlcnJpZGVDaGFuZ2VkJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmTm9kZUljb24ucHJvdG90eXBlLCAiX2ZpbGxPdmVycmlkZSIsIHZvaWQgMCk7CiAgICBUZk5vZGVJY29uID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtbm9kZS1pY29uJykKICAgIF0sIFRmTm9kZUljb24pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmR3JhcGhPcENvbXBhdExpc3RJdGVtID0gY2xhc3MgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0gZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBfaXRlbVR5cGVDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAodGhpcy5pdGVtVHlwZSAhPT0gJ3N1Ym5vZGUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRbJ2xpc3QtaXRlbSddLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy4kWydsaXN0LWl0ZW0nXS5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2FibGUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfbm9kZUxpc3RlbmVyKGV2ZW50KSB7CiAgICAgICAgICAgIC8vIGZpcmUgbm9kZS5jbGljay9tb3VzZW92ZXIvbW91c2VvdXQKICAgICAgICAgICAgdGhpcy5maXJlKCdub2RlLWxpc3QtaXRlbS0nICsgZXZlbnQudHlwZSwgewogICAgICAgICAgICAgICAgbm9kZU5hbWU6IHRoaXMubmFtZSwKICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMuaXRlbVR5cGUsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfZmFkZWRDbGFzcyhpdGVtUmVuZGVySW5mbykgewogICAgICAgICAgICByZXR1cm4gaXRlbVJlbmRlckluZm8gJiYgaXRlbVJlbmRlckluZm8uaXNGYWRlZE91dCA/ICdmYWRlZCcgOiAnJzsKICAgICAgICB9CiAgICB9OwogICAgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0udGVtcGxhdGUgPSBodG1sIGAKICAgIDxzdHlsZT4KICAgICAgI2xpc3QtaXRlbSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgI2xpc3QtaXRlbTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZ29vZ2xlLXllbGxvdy0xMDApOwogICAgICB9CgogICAgICAuY2xpY2thYmxlIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3BhbiB7CiAgICAgICAgbWFyZ2luLWxlZnQ6IDQwcHg7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0uZXhjbHVkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6ICM5OTk7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW0gc3Bhbi5lZGdlLWxhYmVsIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbi1sZWZ0OiAzcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDFweDsKICAgICAgICBsZWZ0OiAycHg7CiAgICAgIH0KCiAgICAgIC5mYWRlZCBzcGFuIHsKICAgICAgICBjb2xvcjogdmFyKC0tdGItZ3JhcGgtZmFkZWQpOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYKICAgICAgaWQ9Imxpc3QtaXRlbSIKICAgICAgb24tbW91c2VvdmVyPSJfbm9kZUxpc3RlbmVyIgogICAgICBvbi1tb3VzZW91dD0iX25vZGVMaXN0ZW5lciIKICAgICAgb24tY2xpY2s9Il9ub2RlTGlzdGVuZXIiCiAgICA+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uCiAgICAgICAgICBjbGFzcz0ibm9kZS1pY29uIgogICAgICAgICAgaGVpZ2h0PSIxMiIKICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICAgIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iCiAgICAgICAgICBub2RlPSJbW2l0ZW1Ob2RlXV0iCiAgICAgICAgICByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIgogICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbdGVtcGxhdGVJbmRleF1dIgogICAgICAgID4KICAgICAgICA8L3RmLW5vZGUtaWNvbj4KICAgICAgICA8c3BhbiB0aXRsZSQ9IltbbmFtZV1dIj5bW25hbWVdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoT3BDb21wYXRMaXN0SXRlbS5wcm90b3R5cGUsICJjYXJkTm9kZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhPcENvbXBhdExpc3RJdGVtLnByb3RvdHlwZSwgIml0ZW1Ob2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0ucHJvdG90eXBlLCAiZWRnZUxhYmVsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0ucHJvdG90eXBlLCAiaXRlbVJlbmRlckluZm8iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoT3BDb21wYXRMaXN0SXRlbS5wcm90b3R5cGUsICJuYW1lIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBvYnNlcnZlcjogJ19pdGVtVHlwZUNoYW5nZWQnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0ucHJvdG90eXBlLCAiaXRlbVR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoT3BDb21wYXRMaXN0SXRlbS5wcm90b3R5cGUsICJjb2xvckJ5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0ucHJvdG90eXBlLCAiY29sb3JCeVBhcmFtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhPcENvbXBhdExpc3RJdGVtLnByb3RvdHlwZSwgInRlbXBsYXRlSW5kZXgiLCB2b2lkIDApOwogICAgVGZHcmFwaE9wQ29tcGF0TGlzdEl0ZW0gPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ncmFwaC1vcC1jb21wYXQtbGlzdC1pdGVtJykKICAgIF0sIFRmR3JhcGhPcENvbXBhdExpc3RJdGVtKTsKCiAgICBmdW5jdGlvbiBkZXRlY3QoaCwgdmVyaWZ5VGVtcGxhdGUpIHsKICAgICAgICAvLyBJbiBhbnkgcGFydGljdWxhciBzdWJncmFwaCwgdGhlcmUgYXJlIGVpdGhlcgogICAgICAgIC8vIC0gbGVhZiBub2RlcyAod2hpY2ggZG8gbm90IGhhdmUgc3ViZ3JhcGgpCiAgICAgICAgLy8gLSBtZXRhbm9kZSBub2RlcyAtIHNvbWUgb2YgdGhlbSBoYXZlIG9ubHkgb25lIG1lbWJlciAoc2luZ3VsYXIgbWV0YW5vZGUpCiAgICAgICAgLy8gICAgICAgICAgICAgICAgICAgIGFuZCBzb21lIGhhdmUgbXVsdGlwbGUgbWVtYmVycyAobm9uLXNpbmd1bGFyIG1ldGFub2RlKQogICAgICAgIC8vIEZpcnN0LCBnZW5lcmF0ZSBhIG5lYXJlc3QgbmVpZ2hib3IgaGFzaCBvZiBtZXRhbm9kZSBub2Rlcy4KICAgICAgICBsZXQgbm5Hcm91cHMgPSBjbHVzdGVyU2ltaWxhclN1YmdyYXBocyhoKTsKICAgICAgICAvLyBGb3IgZWFjaCBtZXRhbm9kZSwgY29tcGFyZSBpdHMgc3ViZ3JhcGggKHN0YXJ0aW5nIGZyb20gc2hhbGxvd2VyIGdyb3VwcykKICAgICAgICAvLyBhbmQgYXNzaWduIHRlbXBsYXRlIGlkLgogICAgICAgIGxldCB0ZW1wbGF0ZXMgPSBncm91cFRlbXBsYXRlQW5kQXNzaWduSWQobm5Hcm91cHMsIHZlcmlmeVRlbXBsYXRlKTsKICAgICAgICAvLyBTb3J0IHRoZSB0ZW1wbGF0ZXMgYnkgbWluaW11bSBsZXZlbCBpbiB0aGUgZ3JhcGggYXQgd2hpY2ggdGhleSBhcHBlYXIsCiAgICAgICAgLy8gYXMgdGhpcyBsZWFkcyB0byBvcHRpbWFsIHNldHRpbmcgb2YgdGhlIGNvbG9ycyBvZiBlYWNoIHRlbXBsYXRlIGZvcgogICAgICAgIC8vIG1heGltdW0gZGlmZmVyZW50aWF0aW9uLgogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0ZW1wbGF0ZXMpCiAgICAgICAgICAgIC5zb3J0KChrZXkpID0+IHRlbXBsYXRlc1trZXldLmxldmVsKQogICAgICAgICAgICAucmVkdWNlKChvYmosIGtleSkgPT4gewogICAgICAgICAgICBvYmpba2V5XSA9IHRlbXBsYXRlc1trZXldOwogICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgIH0sIHt9KTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiBVbmlxdWUgc3RyaW5nIGZvciBhIG1ldGFub2RlIGJhc2VkIG9uIGRlcHRoLCB8VnwsIHxFfCBhbmQKICAgICAqIG9wIHR5cGUgaGlzdG9ncmFtLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTaWduYXR1cmUobWV0YW5vZGUpIHsKICAgICAgICAvLyBkZXB0aD08bnVtYmVyPiB8Vnw9PG51bWJlcj4gfEV8PTxudW1iZXI+CiAgICAgICAgbGV0IHByb3BzID0gbG9kYXNoLm1hcCh7CiAgICAgICAgICAgIGRlcHRoOiBtZXRhbm9kZS5kZXB0aCwKICAgICAgICAgICAgJ3xWfCc6IG1ldGFub2RlLm1ldGFncmFwaC5ub2RlcygpLmxlbmd0aCwKICAgICAgICAgICAgJ3xFfCc6IG1ldGFub2RlLm1ldGFncmFwaC5lZGdlcygpLmxlbmd0aCwKICAgICAgICB9LCBmdW5jdGlvbiAodiwgaykgewogICAgICAgICAgICByZXR1cm4gayArICc9JyArIHY7CiAgICAgICAgfSkuam9pbignICcpOwogICAgICAgIC8vIG9wdHlwZTE9Y291bnQxLG9wdHlwZTI9Y291bnQyCiAgICAgICAgbGV0IG9wcyA9IGxvZGFzaC5tYXAobWV0YW5vZGUub3BIaXN0b2dyYW0sIGZ1bmN0aW9uIChjb3VudCwgb3ApIHsKICAgICAgICAgICAgcmV0dXJuIG9wICsgJz0nICsgY291bnQ7CiAgICAgICAgfSkuam9pbignLCcpOwogICAgICAgIHJldHVybiBwcm9wcyArICcgW29wc10gJyArIG9wczsKICAgIH0KICAgIC8qKgogICAgICogR2VuZXJhdGUgYSBuZWFyZXN0IG5laWdoYm9yIGhhc2ggb2YgbWV0YW5vZGVzCiAgICAgKiBiYXNlZCBvbiBkZXB0aCwgfFZ8LCB8RXwsIGFuZCBvcEhpc3RvZ3JhbSBvZiB0aGVpciBzdWJncmFwaAogICAgICogKGV4Y2x1ZGluZyBsZWFmIG5vZGVzIGFuZCBzaW5ndWxhciBtZXRhbm9kZXMpLgogICAgICogQHBhcmFtIGdyYXBoIFRoZSBncmFwaAogICAgICogQHJldHVybiBBcnJheSBvZiBwYWlycyBvZiBbc2lnbmF0dXJlLAogICAgICogICBPYmplY3Qgd2l0aCBtaW4gbGV2ZWwgb2YgdGhlIHRlbXBsYXRlIGFuZCBhbiBBcnJheSBvZiB0Zi5ncmFwaC5Hcm91cF0KICAgICAqICAgc29ydCBieSBhc2NlbmRpbmcgb3JkZXIgb2YgbWluaW11bSBkZXB0aCBhdCB3aGljaCBtZXRhbm9kZSBhcHBlYXJzLgogICAgICovCiAgICBmdW5jdGlvbiBjbHVzdGVyU2ltaWxhclN1YmdyYXBocyhoKSB7CiAgICAgICAgLyoqIGEgZGljdCBmcm9tIG1ldGFub2RlLnNpZ25hdHVyZSgpID0+IEFycmF5IG9mIHRmLmdyYXBoLkdyb3VwcyAqLwogICAgICAgIGNvbnN0IG1hcCA9IGguZ2V0Tm9kZU1hcCgpOwogICAgICAgIGxldCBoYXNoRGljdCA9IE9iamVjdC5rZXlzKG1hcCkucmVkdWNlKChyZWR1Y2VkLCBuYW1lKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBtYXBbbmFtZV07CiAgICAgICAgICAgIGlmIChub2RlLnR5cGUgIT09IE5vZGVUeXBlLk1FVEEpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZWR1Y2VkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBsZXZlbE9mTWV0YU5vZGUgPSBuYW1lLnNwbGl0KCcvJykubGVuZ3RoIC0gMTsKICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IGdldFNpZ25hdHVyZShub2RlKTsKICAgICAgICAgICAgbGV0IHRlbXBsYXRlSW5mbyA9IHJlZHVjZWRbc2lnbmF0dXJlXSB8fCB7CiAgICAgICAgICAgICAgICBub2RlczogW10sCiAgICAgICAgICAgICAgICBsZXZlbDogbGV2ZWxPZk1ldGFOb2RlLAogICAgICAgICAgICB9OwogICAgICAgICAgICByZWR1Y2VkW3NpZ25hdHVyZV0gPSB0ZW1wbGF0ZUluZm87CiAgICAgICAgICAgIHRlbXBsYXRlSW5mby5ub2Rlcy5wdXNoKG5vZGUpOwogICAgICAgICAgICBpZiAodGVtcGxhdGVJbmZvLmxldmVsID4gbGV2ZWxPZk1ldGFOb2RlKSB7CiAgICAgICAgICAgICAgICB0ZW1wbGF0ZUluZm8ubGV2ZWwgPSBsZXZlbE9mTWV0YU5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlZHVjZWQ7CiAgICAgICAgfSwge30pOwogICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhoYXNoRGljdCkKICAgICAgICAgICAgLm1hcCgoa2V5KSA9PiBba2V5LCBoYXNoRGljdFtrZXldXSkKICAgICAgICAgICAgLmZpbHRlcigoW18sIHN1YkdyYXBoXSkgPT4gewogICAgICAgICAgICBjb25zdCB7IG5vZGVzIH0gPSBzdWJHcmFwaDsKICAgICAgICAgICAgaWYgKG5vZGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIG1vcmUgdGhhbiAxIG5vZGUgd2l0aCB0aGlzIHRlbXBsYXRlLiBJdCBpcyB3b3J0aCBhc3NpZ25pbmcKICAgICAgICAgICAgICAgIC8vIGEgdW5pcXVlIGNvbG9yIHRvIHRoaXMgdGVtcGxhdGUuCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IDEgbm9kZSB3aXRoIHRoaXMgdGVtcGxhdGUsIG9ubHkgbWFrZSBhIHRlbXBsYXRlIGZvcgogICAgICAgICAgICAvLyBpdCBpZiBpdCByZXByZXNlbnRzIGEgZnVuY3Rpb24uIEluIHRoYXQgY2FzZSwgdGhlIGdyYXBoIGV4cGxvcmVyIG1heQogICAgICAgICAgICAvLyBhZGQgbW9yZSBub2RlcyB3aXRoIHRoZSB0ZW1wbGF0ZSBsYXRlci4KICAgICAgICAgICAgY29uc3Qgbm9kZSA9IG5vZGVzWzBdOwogICAgICAgICAgICByZXR1cm4gKG5vZGUudHlwZSA9PT0gTm9kZVR5cGUuTUVUQSAmJiBub2RlLmFzc29jaWF0ZWRGdW5jdGlvbik7CiAgICAgICAgfSkKICAgICAgICAgICAgLnNvcnQoKFtfLCBzdWJHcmFwaF0pID0+IHsKICAgICAgICAgICAgLy8gc29ydCBieSBkZXB0aAogICAgICAgICAgICAvLyAoYWxsIG1lbWJlcnMgaW4gdGhlIHNhbWUgbm5Hcm91cCBoYXMgZXF1YWwgZGVwdGgpCiAgICAgICAgICAgIHJldHVybiBzdWJHcmFwaC5ub2Rlc1swXS5kZXB0aDsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdyb3VwVGVtcGxhdGVBbmRBc3NpZ25JZChubkdyb3VwcywgdmVyaWZ5VGVtcGxhdGUpIHsKICAgICAgICAvLyBGb3IgZWFjaCBtZXRhbm9kZSwgY29tcGFyZSBpdHMgc3ViZ3JhcGggKHN0YXJ0aW5nIGZyb20gc2hhbGxvd2VyIGdyb3VwcykKICAgICAgICAvLyBhbmQgYXNzaWduIHRlbXBsYXRlIGlkLgogICAgICAgIGxldCByZXN1bHQgPSB7fTsKICAgICAgICByZXR1cm4gbG9kYXNoLnJlZHVjZShubkdyb3VwcywgZnVuY3Rpb24gKHRlbXBsYXRlcywgbm5Hcm91cFBhaXIpIHsKICAgICAgICAgICAgbGV0IHNpZ25hdHVyZSA9IG5uR3JvdXBQYWlyWzBdLCBubkdyb3VwID0gbm5Hcm91cFBhaXJbMV0ubm9kZXMsIGNsdXN0ZXJzID0gW107CiAgICAgICAgICAgIG5uR3JvdXAuZm9yRWFjaChmdW5jdGlvbiAobWV0YW5vZGUpIHsKICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdpdGggZWFjaCBleGlzdGluZyBjbHVzdGVyCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNsdXN0ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHNpbWlsYXIgPSAhdmVyaWZ5VGVtcGxhdGUgfHwKICAgICAgICAgICAgICAgICAgICAgICAgaXNTaW1pbGFyU3ViZ3JhcGgoY2x1c3RlcnNbaV0ubWV0YW5vZGUubWV0YWdyYXBoLCBtZXRhbm9kZS5tZXRhZ3JhcGgpOwogICAgICAgICAgICAgICAgICAgIC8vIGlmIHNpbWlsYXIsIGp1c3QgYWRkIHRoaXMgbWV0YW5vZGUgdG8gdGhlIGNsdXN0ZXIKICAgICAgICAgICAgICAgICAgICBpZiAoc2ltaWxhcikgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGVtcGxhdGUgZnJvbSB0aGUgZmlyc3Qgb25lCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFub2RlLnRlbXBsYXRlSWQgPSBjbHVzdGVyc1tpXS5tZXRhbm9kZS50ZW1wbGF0ZUlkOwogICAgICAgICAgICAgICAgICAgICAgICBjbHVzdGVyc1tpXS5tZW1iZXJzLnB1c2gobWV0YW5vZGUubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgY3JlYXRlIGEgbmV3IGNsdXN0ZXIgd2l0aCBpZCAnc2lnbmF0dXJlIFtjb3VudF0gJwogICAgICAgICAgICAgICAgbWV0YW5vZGUudGVtcGxhdGVJZCA9IHNpZ25hdHVyZSArICdbJyArIGNsdXN0ZXJzLmxlbmd0aCArICddJzsKICAgICAgICAgICAgICAgIGNsdXN0ZXJzLnB1c2goewogICAgICAgICAgICAgICAgICAgIG1ldGFub2RlOiBtZXRhbm9kZSwKICAgICAgICAgICAgICAgICAgICBtZW1iZXJzOiBbbWV0YW5vZGUubmFtZV0sCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNsdXN0ZXJzLmZvckVhY2goZnVuY3Rpb24gKGMpIHsKICAgICAgICAgICAgICAgIHRlbXBsYXRlc1tjLm1ldGFub2RlLnRlbXBsYXRlSWRdID0gewogICAgICAgICAgICAgICAgICAgIGxldmVsOiBubkdyb3VwUGFpclsxXS5sZXZlbCwKICAgICAgICAgICAgICAgICAgICBub2RlczogYy5tZW1iZXJzLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiB0ZW1wbGF0ZXM7CiAgICAgICAgfSwgcmVzdWx0KTsKICAgIH0KICAgIGZ1bmN0aW9uIHNvcnROb2RlcyhuYW1lcywgZ3JhcGgsIHByZWZpeCkgewogICAgICAgIHJldHVybiBsb2Rhc2guc29ydEJ5KG5hbWVzLCBbCiAgICAgICAgICAgIChuYW1lKSA9PiBncmFwaC5ub2RlKG5hbWUpLm9wLAogICAgICAgICAgICAobmFtZSkgPT4gZ3JhcGgubm9kZShuYW1lKS50ZW1wbGF0ZUlkLAogICAgICAgICAgICAobmFtZSkgPT4gZ3JhcGgubmVpZ2hib3JzKG5hbWUpLmxlbmd0aCwKICAgICAgICAgICAgKG5hbWUpID0+IGdyYXBoLnByZWRlY2Vzc29ycyhuYW1lKS5sZW5ndGgsCiAgICAgICAgICAgIChuYW1lKSA9PiBncmFwaC5zdWNjZXNzb3JzKG5hbWUpLmxlbmd0aCwKICAgICAgICAgICAgKG5hbWUpID0+IG5hbWUuc3Vic3RyKHByZWZpeC5sZW5ndGgpLAogICAgICAgIF0pOwogICAgfQogICAgZnVuY3Rpb24gaXNTaW1pbGFyU3ViZ3JhcGgoZzEsIGcyKSB7CiAgICAgICAgaWYgKCFoYXNTaW1pbGFyRGVncmVlU2VxdWVuY2UoZzEsIGcyKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8vIGlmIHdlIHdhbnQgdG8gc2tpcCwganVzdCByZXR1cm4gdHJ1ZSBoZXJlLgogICAgICAgIC8vIHJldHVybiB0cnVlOwogICAgICAgIC8vIFZlcmlmeSBzZXF1ZW5jZSBieSBydW5uaW5nIERGUwogICAgICAgIGxldCBnMXByZWZpeCA9IGcxLmdyYXBoKCkubmFtZTsKICAgICAgICBsZXQgZzJwcmVmaXggPSBnMi5ncmFwaCgpLm5hbWU7CiAgICAgICAgbGV0IHZpc2l0ZWQxID0ge307CiAgICAgICAgbGV0IHZpc2l0ZWQyID0ge307CiAgICAgICAgbGV0IHN0YWNrID0gW107CiAgICAgICAgLyoqCiAgICAgICAgICogcHVzaCBzb3VyY2VzIG9yIHN1Y2Nlc3NvcnMgaW50byB0aGUgc3RhY2sKICAgICAgICAgKiBpZiB0aGUgdmlzaXRpbmcgcGF0dGVybiBoYXMgYmVlbiBzaW1pbGFyLgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHN0YWNrUHVzaElmTm90RGlmZmVyZW50KG4xLCBuMikgewogICAgICAgICAgICBsZXQgc3ViMSA9IG4xLnN1YnN0cihnMXByZWZpeC5sZW5ndGgpLCBzdWIyID0gbjIuc3Vic3RyKGcycHJlZml4Lmxlbmd0aCk7CiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlICovCiAgICAgICAgICAgIGlmICh2aXNpdGVkMVtzdWIxXSBeIHZpc2l0ZWQyW3N1YjJdKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ2RpZmZlcmVudCB2aXNpdCBwYXR0ZXJuJywgJ1snICsgZzFwcmVmaXggKyAnXScsIHN1YjEsICdbJyArIGcycHJlZml4ICsgJ10nLCBzdWIyKTsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIHRzbGludDplbmFibGUgKi8KICAgICAgICAgICAgaWYgKCF2aXNpdGVkMVtzdWIxXSkgewogICAgICAgICAgICAgICAgLy8gaW1wbGllZCAmJiAhdmlzaXRlZDJbc3ViMl0KICAgICAgICAgICAgICAgIHZpc2l0ZWQxW3N1YjFdID0gdmlzaXRlZDJbc3ViMl0gPSB0cnVlOwogICAgICAgICAgICAgICAgc3RhY2sucHVzaCh7IG4xOiBuMSwgbjI6IG4yIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLy8gY2hlY2sgaWYgaGF2ZSBzYW1lICMgb2Ygc291cmNlcyB0aGVuIHNvcnQgYW5kIHB1c2gKICAgICAgICBsZXQgc291cmNlczEgPSBnMS5zb3VyY2VzKCk7CiAgICAgICAgbGV0IHNvdXJjZXMyID0gZzIuc291cmNlcygpOwogICAgICAgIGlmIChzb3VyY2VzMS5sZW5ndGggIT09IHNvdXJjZXMyLmxlbmd0aCkgewogICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqLwogICAgICAgICAgICBjb25zb2xlLmxvZygnZGlmZmVyZW50IHNvdXJjZSBsZW5ndGgnKTsKICAgICAgICAgICAgLyogdHNsaW50OmVuYWJsZSAqLwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHNvdXJjZXMxID0gc29ydE5vZGVzKHNvdXJjZXMxLCBnMSwgZzFwcmVmaXgpOwogICAgICAgIHNvdXJjZXMyID0gc29ydE5vZGVzKHNvdXJjZXMyLCBnMiwgZzJwcmVmaXgpOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc291cmNlczEubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGRpZmZlcmVudCA9IHN0YWNrUHVzaElmTm90RGlmZmVyZW50KHNvdXJjZXMxW2ldLCBzb3VyY2VzMltpXSk7CiAgICAgICAgICAgIGlmIChkaWZmZXJlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB3aGlsZSAoc3RhY2subGVuZ3RoID4gMCkgewogICAgICAgICAgICBsZXQgY3VyID0gc3RhY2sucG9wKCk7CiAgICAgICAgICAgIC8vIGNoZWNrIG5vZGUKICAgICAgICAgICAgbGV0IHNpbWlsYXIgPSBpc1NpbWlsYXJOb2RlKGcxLm5vZGUoY3VyLm4xKSwgZzIubm9kZShjdXIubjIpKTsKICAgICAgICAgICAgaWYgKCFzaW1pbGFyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gY2hlY2sgaWYgaGF2ZSBzYW1lICMgb2Ygc3VjY2Vzc29ycyB0aGVuIHNvcnQgYW5kIHB1c2gKICAgICAgICAgICAgbGV0IHN1Y2MxID0gZzEuc3VjY2Vzc29ycyhjdXIubjEpLCBzdWNjMiA9IGcyLnN1Y2Nlc3NvcnMoY3VyLm4yKTsKICAgICAgICAgICAgaWYgKHN1Y2MxLmxlbmd0aCAhPT0gc3VjYzIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvKiB0c2xpbnQ6ZGlzYWJsZSAqLwogICAgICAgICAgICAgICAgY29uc29sZS5sb2coJyMgb2Ygc3VjY2Vzc29ycyBtaXNtYXRjaCcsIHN1Y2MxLCBzdWNjMik7CiAgICAgICAgICAgICAgICAvKiB0c2xpbnQ6ZW5hYmxlICovCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VjYzEgPSBzb3J0Tm9kZXMoc3VjYzEsIGcxLCBnMXByZWZpeCk7CiAgICAgICAgICAgIHN1Y2MyID0gc29ydE5vZGVzKHN1Y2MyLCBnMiwgZzJwcmVmaXgpOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHN1Y2MxLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICBsZXQgZGlmZmVyZW50ID0gc3RhY2tQdXNoSWZOb3REaWZmZXJlbnQoc3VjYzFbal0sIHN1Y2MyW2pdKTsKICAgICAgICAgICAgICAgIGlmIChkaWZmZXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgaWYgdHdvIG5vZGVzIGhhdmUgaWRlbnRpY2FsIHN0cnVjdHVyZS4KICAgICAqLwogICAgZnVuY3Rpb24gaXNTaW1pbGFyTm9kZShuMSwgbjIpIHsKICAgICAgICBpZiAobjEudHlwZSA9PT0gTm9kZVR5cGUuTUVUQSkgewogICAgICAgICAgICAvLyBjb21wYXJlIG1ldGFub2RlCiAgICAgICAgICAgIGxldCBtZXRhbm9kZTEgPSBuMTsKICAgICAgICAgICAgbGV0IG1ldGFub2RlMiA9IG4yOwogICAgICAgICAgICByZXR1cm4gKG1ldGFub2RlMS50ZW1wbGF0ZUlkICYmCiAgICAgICAgICAgICAgICBtZXRhbm9kZTIudGVtcGxhdGVJZCAmJgogICAgICAgICAgICAgICAgbWV0YW5vZGUxLnRlbXBsYXRlSWQgPT09IG1ldGFub2RlMi50ZW1wbGF0ZUlkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobjEudHlwZSA9PT0gTm9kZVR5cGUuT1AgJiYgbjIudHlwZSA9PT0gTm9kZVR5cGUuT1ApIHsKICAgICAgICAgICAgLy8gY29tcGFyZSBsZWFmIG5vZGUKICAgICAgICAgICAgcmV0dXJuIG4xLm9wID09PSBuMi5vcDsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAobjEudHlwZSA9PT0gTm9kZVR5cGUuU0VSSUVTICYmIG4yLnR5cGUgPT09IE5vZGVUeXBlLlNFUklFUykgewogICAgICAgICAgICAvLyBjb21wYXJlIHNlcmllcyBub2RlIHNpemVzIGFuZCBvcGVyYXRpb25zCiAgICAgICAgICAgIC8vIChvbmx5IG5lZWQgdG8gY2hlY2sgb25lIG9wIGFzIGFsbCBvcCBub2RlcyBhcmUgaWRlbnRpY2FsIGluIHNlcmllcykKICAgICAgICAgICAgbGV0IHNuMSA9IG4xOwogICAgICAgICAgICBsZXQgc24yID0gbjI7CiAgICAgICAgICAgIGxldCBzZXJpZXNub2RlMUNvdW50ID0gc24xLm1ldGFncmFwaC5ub2RlQ291bnQoKTsKICAgICAgICAgICAgcmV0dXJuIChzZXJpZXNub2RlMUNvdW50ID09PSBzbjIubWV0YWdyYXBoLm5vZGVDb3VudCgpICYmCiAgICAgICAgICAgICAgICAoc2VyaWVzbm9kZTFDb3VudCA9PT0gMCB8fAogICAgICAgICAgICAgICAgICAgIHNuMS5tZXRhZ3JhcGgubm9kZShzbjEubWV0YWdyYXBoLm5vZGVzKClbMF0pLm9wID09PQogICAgICAgICAgICAgICAgICAgICAgICBzbjIubWV0YWdyYXBoLm5vZGUoc24yLm1ldGFncmFwaC5ub2RlcygpWzBdKS5vcCkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTUgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIENsYXNzIGZvciB0aGUgR3JhcGggSGllcmFyY2h5IGZvciBUZW5zb3JGbG93IGdyYXBoLgogICAgICovCiAgICBjbGFzcyBIaWVyYXJjaHlJbXBsIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgaGllcmFyY2h5LgogICAgICAgICAqIEBwYXJhbSBncmFwaE9wdGlvbnMgT3B0aW9ucyBwYXNzZWQgdG8gZGFncmUgZm9yIGNyZWF0aW5nIHRoZSBncmFwaC4gTm90ZQogICAgICAgICAqICAgdGhhdCB0aGUgYGNvbXBvdW5kYCBhcmd1bWVudCB3aWxsIGJlIG92ZXJyaWRkZW4gdG8gdHJ1ZS4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihncmFwaE9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5oYXNTaGFwZUluZm8gPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5tYXhNZXRhRWRnZVNpemUgPSAxOwogICAgICAgICAgICB0aGlzLmdyYXBoT3B0aW9ucyA9IGdyYXBoT3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5ncmFwaE9wdGlvbnMuY29tcG91bmQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJvb3QgPSBjcmVhdGVNZXRhbm9kZShST09UX05BTUUsIHRoaXMuZ3JhcGhPcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5saWJyYXJ5RnVuY3Rpb25zID0ge307CiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5kZXZpY2VzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy54bGFDbHVzdGVycyA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fSBEaWN0aW9uYXJ5IG9iamVjdCB0aGF0IG1hcHMgbm9kZSBuYW1lIHRvIHRoZSBub2RlCiAgICAgICAgICAgICAqIChjb3VsZCBiZSBvcC1ub2RlLCBtZXRhbm9kZSwgb3Igc2VyaWVzLW5vZGUpCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmluZGV4ID0ge307CiAgICAgICAgICAgIHRoaXMuaW5kZXhbUk9PVF9OQU1FXSA9IHRoaXMucm9vdDsKICAgICAgICAgICAgdGhpcy5vcmRlcmluZ3MgPSB7fTsKICAgICAgICB9CiAgICAgICAgZ2V0Tm9kZU1hcCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXg7CiAgICAgICAgfQogICAgICAgIG5vZGUobmFtZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleFtuYW1lXTsKICAgICAgICB9CiAgICAgICAgc2V0Tm9kZShuYW1lLCBub2RlKSB7CiAgICAgICAgICAgIHRoaXMuaW5kZXhbbmFtZV0gPSBub2RlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHaXZlbiB0aGUgbmFtZSBvZiBhIG5vZGUgaW4gdGhpcyBoaWVyYXJjaHksIGdldCBpdHMgYnJpZGdlZ3JhcGgsIGNyZWF0aW5nCiAgICAgICAgICogaXQgb24gdGhlIGZseSBpZiBuZWNlc3NhcnkuIElmIHRoZSBub2RlIGlzIG5vdCBhIEdyb3VwTm9kZSwgdGhlbiB0aGlzCiAgICAgICAgICogbWV0aG9kIHJldHVybnMgbnVsbC4gSWYgdGhlIHByb3ZpZGVkIG5hbWUgZG9lcyBub3QgbWFwIHRvIGEgbm9kZSBpbiB0aGUKICAgICAgICAgKiBoaWVyYXJjaHksIGFuIGVycm9yIHdpbGwgYmUgdGhyb3duLgogICAgICAgICAqLwogICAgICAgIGdldEJyaWRnZWdyYXBoKG5vZGVOYW1lKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5pbmRleFtub2RlTmFtZV07CiAgICAgICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIG5vZGUgaW4gaGllcmFyY2h5OiAnICsgbm9kZU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKCdtZXRhZ3JhcGgnIGluIG5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZ3JvdXBOb2RlID0gbm9kZTsKICAgICAgICAgICAgaWYgKGdyb3VwTm9kZS5icmlkZ2VncmFwaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGdyb3VwTm9kZS5icmlkZ2VncmFwaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgYnJpZGdlZ3JhcGggPSAoZ3JvdXBOb2RlLmJyaWRnZWdyYXBoID0gY3JlYXRlR3JhcGgoJ0JSSURHRUdSQVBIJywgR3JhcGhUeXBlLkJSSURHRSwgdGhpcy5ncmFwaE9wdGlvbnMpKTsKICAgICAgICAgICAgaWYgKCFub2RlLnBhcmVudE5vZGUgfHwgISgnbWV0YWdyYXBoJyBpbiBub2RlLnBhcmVudE5vZGUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYnJpZGdlZ3JhcGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHBhcmVudE5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIGxldCBwYXJlbnRNZXRhZ3JhcGggPSBwYXJlbnROb2RlLm1ldGFncmFwaDsKICAgICAgICAgICAgbGV0IHBhcmVudEJyaWRnZWdyYXBoID0gdGhpcy5nZXRCcmlkZ2VncmFwaChwYXJlbnROb2RlLm5hbWUpOwogICAgICAgICAgICAvLyBGb3IgZWFjaCBvZiB0aGUgcGFyZW50IG5vZGUncyB0d28gTWV0YWVkZ2UgY29udGFpbmluZyBncmFwaHMsIHByb2Nlc3MKICAgICAgICAgICAgLy8gZWFjaCBNZXRhZWRnZSBpbnZvbHZpbmcgdGhpcyBub2RlLgogICAgICAgICAgICBsb2Rhc2guZWFjaChbcGFyZW50TWV0YWdyYXBoLCBwYXJlbnRCcmlkZ2VncmFwaF0sIChwYXJlbnRHcmFwaCkgPT4gewogICAgICAgICAgICAgICAgcGFyZW50R3JhcGgKICAgICAgICAgICAgICAgICAgICAuZWRnZXMoKQogICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKGUpID0+IGUudiA9PT0gbm9kZU5hbWUgfHwgZS53ID09PSBub2RlTmFtZSkKICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgocGFyZW50RWRnZU9iaikgPT4gewogICAgICAgICAgICAgICAgICAgIGxldCBpbmJvdW5kID0gcGFyZW50RWRnZU9iai53ID09PSBub2RlTmFtZTsKICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50TWV0YWVkZ2UgPSBwYXJlbnRHcmFwaC5lZGdlKHBhcmVudEVkZ2VPYmopOwogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBwYXJlbnQncyBNZXRhZWRnZSByZXByZXNlbnRzIHNvbWUgbnVtYmVyIG9mIHVuZGVybHlpbmcKICAgICAgICAgICAgICAgICAgICAvLyBCYXNlRWRnZXMgZnJvbSB0aGUgb3JpZ2luYWwgZnVsbCBncmFwaC4gRm9yIGVhY2ggb2YgdGhvc2UsIHdlIG5lZWQKICAgICAgICAgICAgICAgICAgICAvLyB0byBkZXRlcm1pbmUgd2hpY2ggaW1tZWRpYXRlIGNoaWxkIGlzIGludm9sdmVkIGFuZCBtYWtlIHN1cmUKICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIGEgTWV0YWVkZ2UgaW4gdGhlIGJyaWRnZWdyYXBoIHRoYXQgY292ZXJzIGl0LgogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKHBhcmVudE1ldGFlZGdlLmJhc2VFZGdlTGlzdCwgKGJhc2VFZGdlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEJhc2VkIG9uIHRoZSBkaXJlY3Rpb24sIGZpZ3VyZSBvdXQgd2hpY2ggaXMgdGhlIGRlc2NlbmRhbnQgbm9kZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2hpY2ggaXMgdGhlICdvdGhlcicgbm9kZSAoc2libGluZyBvZiBwYXJlbnQgb3IgYW5jZXN0b3IpLgogICAgICAgICAgICAgICAgICAgICAgICBsZXQgW2Rlc2NlbmRhbnROYW1lLCBvdGhlck5hbWVdID0gaW5ib3VuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBbYmFzZUVkZ2UudywgcGFyZW50RWRnZU9iai52XQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBbYmFzZUVkZ2UudiwgcGFyZW50RWRnZU9iai53XTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBpbW1lZGlhdGUgY2hpbGQgY29udGFpbmluZyB0aGlzIGRlc2NlbmRhbnQgbm9kZS4KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNoaWxkTmFtZSA9IHRoaXMuZ2V0Q2hpbGROYW1lKG5vZGVOYW1lLCBkZXNjZW5kYW50TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvb2sgZm9yIGFuIGV4aXN0aW5nIE1ldGFlZGdlIGluIHRoZSBicmlkZ2VncmFwaCAob3IgY3JlYXRlIGEKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3IG9uZSkgdGhhdCBjb3ZlcnMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGNoaWxkIGFuZCBvdGhlci4KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJyaWRnZUVkZ2VPYmogPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2OiBpbmJvdW5kID8gb3RoZXJOYW1lIDogY2hpbGROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdzogaW5ib3VuZCA/IGNoaWxkTmFtZSA6IG90aGVyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGJyaWRnZU1ldGFlZGdlID0gYnJpZGdlZ3JhcGguZWRnZShicmlkZ2VFZGdlT2JqKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFicmlkZ2VNZXRhZWRnZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJpZGdlTWV0YWVkZ2UgPSBjcmVhdGVNZXRhZWRnZShicmlkZ2VFZGdlT2JqLnYsIGJyaWRnZUVkZ2VPYmoudyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmlkZ2VNZXRhZWRnZS5pbmJvdW5kID0gaW5ib3VuZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZWdyYXBoLnNldEVkZ2UoYnJpZGdlRWRnZU9iai52LCBicmlkZ2VFZGdlT2JqLncsIGJyaWRnZU1ldGFlZGdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBDb3B5IHRoZSBCYXNlRWRnZSBmcm9tIHRoZSBwYXJlbnQncyBNZXRhZWRnZSBpbnRvIHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnJpZGdlZ3JhcGggTWV0YWVkZ2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGJyaWRnZU1ldGFlZGdlLmFkZEJhc2VFZGdlKGJhc2VFZGdlLCB0aGlzKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIGJyaWRnZWdyYXBoOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVdGlsaXR5IGZ1bmN0aW9uIGZvciBkZXRlcm1pbmluZyB0aGUgbmFtZSBvZiB0aGUgaW1tZWRpYXRlIGNoaWxkIHVuZGVyIGEKICAgICAgICAgKiBub2RlIGZvciBhIGdpdmVuIGRlc2NlbmRhbnQgcGF0aC4gSWYgdGhlIGRlc2NlbmRhbnQgY29ycmVzcG9uZHMgdG8gbm8KICAgICAgICAgKiBpbW1lZGlhdGUgY2hpbGQsIGFuIGVycm9yIGlzIHRocm93bi4KICAgICAgICAgKi8KICAgICAgICBnZXRDaGlsZE5hbWUobm9kZU5hbWUsIGRlc2NlbmRhbnROYW1lKSB7CiAgICAgICAgICAgIC8vIFdhbGsgdXAgdGhlIGhpZXJhcmNoeSBmcm9tIHRoZSBkZXNjZW5kYW50IHRvIGZpbmQgdGhlIGNoaWxkLgogICAgICAgICAgICBsZXQgY3VycmVudE5vZGUgPSB0aGlzLmluZGV4W2Rlc2NlbmRhbnROYW1lXTsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGUucGFyZW50Tm9kZSAmJiBjdXJyZW50Tm9kZS5wYXJlbnROb2RlLm5hbWUgPT09IG5vZGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnROb2RlLm5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjdXJyZW50Tm9kZSA9IGN1cnJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIGltbWVkaWF0ZSBjaGlsZCBmb3IgZGVzY2VuZGFudDogJyArIGRlc2NlbmRhbnROYW1lKTsKICAgICAgICB9CiAgICAgICAgLyoqIEdpdmVuIHRoZSBuYW1lIG9mIGEgbm9kZSwgcmV0dXJuIGl0cyBpbmNvbWluZyBtZXRhZWRnZXMuICovCiAgICAgICAgZ2V0UHJlZGVjZXNzb3JzKG5vZGVOYW1lKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5pbmRleFtub2RlTmFtZV07CiAgICAgICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAnICsgbm9kZU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBwcmVkZWNlc3NvcnMgPSB0aGlzLmdldE9uZVdheUVkZ2VzKG5vZGUsIHRydWUpOwogICAgICAgICAgICAvLyBBZGQgZW1iZWRkZWQgcHJlZGVjZXNzb3JzLCBzdWNoIGFzIGNvbnN0YW50cy4KICAgICAgICAgICAgaWYgKCFub2RlLmlzR3JvdXBOb2RlKSB7CiAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChub2RlLmluRW1iZWRkaW5ncywgKGVtYmVkZGVkTm9kZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKG5vZGUuaW5wdXRzLCAoaW5wdXQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lm5hbWUgPT09IGVtYmVkZGVkTm9kZS5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGEgbmV3IG1ldGFlZGdlIGhvbGRpbmcgdGhlIGVkZ2UgYmV0d2VlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGUgYW5kIHRoZSBpbi1lbWJlZGRpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbWV0YWVkZ2UgPSBuZXcgTWV0YWVkZ2VJbXBsKGVtYmVkZGVkTm9kZS5uYW1lLCBub2RlTmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhZWRnZS5hZGRCYXNlRWRnZSh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNDb250cm9sRGVwZW5kZW5jeTogaW5wdXQuaXNDb250cm9sRGVwZW5kZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRUZW5zb3JLZXk6IGlucHV0Lm91dHB1dFRlbnNvcktleSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlZmVyZW5jZUVkZ2U6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHY6IGVtYmVkZGVkTm9kZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHc6IG5vZGVOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhpcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVkZWNlc3NvcnMucmVndWxhci5wdXNoKG1ldGFlZGdlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHByZWRlY2Vzc29yczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gdGhlIG5hbWUgb2YgYSBub2RlLCByZXR1cm4gaXRzIG91dGdvaW5nIG1ldGFlZGdlcy4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGludmVyc2Ugb2YgZ2V0UHJlZGVjZXNzb3JzKCkuIFNlZSB0aGF0IG1ldGhvZCdzIGRvY3VtZW50YXRpb24KICAgICAgICAgKiBmb3IgYW4gaW4tZGVwdGggZXhhbXBsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTdWNjZXNzb3JzKG5vZGVOYW1lKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5pbmRleFtub2RlTmFtZV07CiAgICAgICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAnICsgbm9kZU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JzID0gdGhpcy5nZXRPbmVXYXlFZGdlcyhub2RlLCBmYWxzZSk7CiAgICAgICAgICAgIC8vIEFkZCBlbWJlZGRlZCBzdWNjZXNzb3JzLCBzdWNoIGFzIHN1bW1hcmllcy4KICAgICAgICAgICAgaWYgKCFub2RlLmlzR3JvdXBOb2RlKSB7CiAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChub2RlLm91dEVtYmVkZGluZ3MsIChlbWJlZGRlZE5vZGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChlbWJlZGRlZE5vZGUuaW5wdXRzLCAoaW5wdXQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0Lm5hbWUgPT09IG5vZGVOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGEgbmV3IG1ldGFlZGdlIGhvbGRpbmcgdGhlIGVkZ2UgYmV0d2VlbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vZGUgYW5kIHRoZSBvdXQtZW1iZWRkaW5nLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1ldGFlZGdlID0gbmV3IE1ldGFlZGdlSW1wbChub2RlTmFtZSwgZW1iZWRkZWROb2RlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWVkZ2UuYWRkQmFzZUVkZ2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29udHJvbERlcGVuZGVuY3k6IGlucHV0LmlzQ29udHJvbERlcGVuZGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0VGVuc29yS2V5OiBpbnB1dC5vdXRwdXRUZW5zb3JLZXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZWZlcmVuY2VFZGdlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2OiBub2RlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3OiBlbWJlZGRlZE5vZGUubmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29ycy5yZWd1bGFyLnB1c2gobWV0YWVkZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3VjY2Vzc29yczsKICAgICAgICB9CiAgICAgICAgLyoqIEhlbHBlciBtZXRob2QgZm9yIGdldFByZWRlY2Vzc29ycyBhbmQgZ2V0U3VjY2Vzc29ycyAqLwogICAgICAgIGdldE9uZVdheUVkZ2VzKG5vZGUsIGluRWRnZXMpIHsKICAgICAgICAgICAgbGV0IGVkZ2VzID0geyBjb250cm9sOiBbXSwgcmVndWxhcjogW10gfTsKICAgICAgICAgICAgLy8gQSBub2RlIHdpdGggbm8gcGFyZW50IGNhbm5vdCBoYXZlIGFueSBlZGdlcy4KICAgICAgICAgICAgaWYgKCFub2RlLnBhcmVudE5vZGUgfHwgIW5vZGUucGFyZW50Tm9kZS5pc0dyb3VwTm9kZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVkZ2VzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBwYXJlbnROb2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICBsZXQgbWV0YWdyYXBoID0gcGFyZW50Tm9kZS5tZXRhZ3JhcGg7CiAgICAgICAgICAgIGxldCBicmlkZ2VncmFwaCA9IHRoaXMuZ2V0QnJpZGdlZ3JhcGgocGFyZW50Tm9kZS5uYW1lKTsKICAgICAgICAgICAgZmluZEVkZ2VUYXJnZXRzSW5HcmFwaChtZXRhZ3JhcGgsIG5vZGUsIGluRWRnZXMsIGVkZ2VzKTsKICAgICAgICAgICAgZmluZEVkZ2VUYXJnZXRzSW5HcmFwaChicmlkZ2VncmFwaCwgbm9kZSwgaW5FZGdlcywgZWRnZXMpOwogICAgICAgICAgICByZXR1cm4gZWRnZXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZvciBhIGdpdmVuIEdyb3VwTm9kZSwgZ2V0IG9yIGNhbGN1bGF0ZSBhbiBvYmplY3Qgd2hpY2ggZGVzY3JpYmVzIGEKICAgICAgICAgKiB0b3BvbG9naWNhbCBvcmRlcmluZyBvZiBjaGlsZCBub2RlcyB3aXRoaW4gdGhhdCBHcm91cE5vZGUncyBtZXRhZ3JhcGguCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG9yZGVyaW5nIGlzIHVzZWQgd2hlbiByZW5kZXJpbmcgYnJpZGdlIGNvbnRyb2wgZWRnZXMgd2hpY2ggYXJlCiAgICAgICAgICogc29tZXRpbWVzIGJhY2t3YXJkcyByZWxhdGl2ZSB0byB0aGUgZGF0YWZsb3cuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgZXhhbXBsZSwgc2F5IHdlIGhhdmUgYSBncmFwaCB3aXRoIHR3byBlZGdlcyBBLT5CIGFuZCBBLT5DLCBhbmQgd2UncmUKICAgICAgICAgKiBpbnRlcmVzdGVkIGluIHRoZSBvcmRlcmluZyB1bmRlciBST09ULiBJbiB0aGlzIGNhc2UsIGFueSBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAgICogd291bGQgYmUgbGVnaXRpbWF0ZSByZXR1cm4gdmFsdWVzOgogICAgICAgICAqCiAgICAgICAgICogIC0geyAnQSc6IDAsICdCJzogMSwgJ0MnOiAyIH0gLS0gbW9zdCBsaWtlbHkKICAgICAgICAgKiAgLSB7ICdBJzogMCwgJ0InOiAyLCAnQyc6IDEgfSAtLSBsZXNzIGxpa2VseQogICAgICAgICAqICAtIHsgJ0EnOiAxMiwgJ0InOiAxMDAsICdDJzogOTkgfSAtLSB1bmxpa2VseSwgYnV0IHN0aWxsIE9LCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGFsbCBudW1iZXJzIGZyb20gMC1OICh3aGVyZSBOIGlzCiAgICAgICAgICogdGhlIG51bWJlciBvZiBub2RlcykgYXBwZWFyIGV4YWN0bHkgb25jZS4gUmF0aGVyIGl0IGd1YXJhbnRlZXMgdGhhdCBpZgogICAgICAgICAqIHRoZXJlIGlzIGEgcGF0aCBiZXR3ZWVuIHR3byBub2RlcywgdGhlIGVhcmxpZXIgb25lIHdpbGwgaGF2ZSBhIGxvd2VyCiAgICAgICAgICogbnVtYmVyIGluIHRoZSBvcmRlcmluZyBoYXNoLgogICAgICAgICAqCiAgICAgICAgICogV2hlbiBnZW5lcmF0aW5nIHRoZSBvcmRlcmluZywgd2UgaWdub3JlIGNvbnRyb2wgTWV0YWVkZ2VzICh0aG9zZSB3aGljaAogICAgICAgICAqIHJlcHJlc2VudCBvbmx5IEJhc2VFZGdlcyB0aGF0IGhhdmUgaXNDb250cm9sRGVwZW5kZW5jeSBzZXQgdG8gdHJ1ZSkuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGVyZSBpcyBubyBub2RlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBhbiBlcnJvciBpcyB0aHJvd24uIElmIHRoZQogICAgICAgICAqIG5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGEgZ3JvdXAgbm9kZSwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAgICAgKi8KICAgICAgICBnZXRUb3BvbG9naWNhbE9yZGVyaW5nKG5vZGVOYW1lKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gdGhpcy5pbmRleFtub2RlTmFtZV07CiAgICAgICAgICAgIGlmICghbm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIG5vZGUgd2l0aCBuYW1lOiAnICsgbm9kZU5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghbm9kZS5pc0dyb3VwTm9kZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5vZGVOYW1lIGluIHRoaXMub3JkZXJpbmdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcmRlcmluZ3Nbbm9kZU5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE1hcHBpbmcgb2YgYSBjaGlsZCBub2RlIG5hbWVzIHRvIGxpc3RzIG9mIHRoZWlyIHN1Y2Nlc3NvcnMuCiAgICAgICAgICAgIGxldCBzdWNjZXNzb3JzID0ge307CiAgICAgICAgICAgIC8vIFNldCBvZiBub2RlIG5hbWVzIHdoaWNoIGhhdmUgYXBwZWFyZWQgYXMgYSBkZXN0aW5hdGlvbi4KICAgICAgICAgICAgbGV0IGRlc3RpbmF0aW9ucyA9IHt9OwogICAgICAgICAgICBsZXQgbWV0YWdyYXBoID0gbm9kZS5tZXRhZ3JhcGg7CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKG1ldGFncmFwaC5lZGdlcygpLCAoZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFtZXRhZ3JhcGguZWRnZShlKS5udW1SZWd1bGFyRWRnZXMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIFNraXAgY29udHJvbCBlZGdlcy4KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygc3VjY2Vzc29ycyBhbmQgZGVzdGluYXRpb25zLgogICAgICAgICAgICAgICAgaWYgKCEoZS52IGluIHN1Y2Nlc3NvcnMpKSB7CiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc29yc1tlLnZdID0gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdWNjZXNzb3JzW2Uudl0ucHVzaChlLncpOwogICAgICAgICAgICAgICAgZGVzdGluYXRpb25zW2Uud10gPSB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gU2VlZCB0aGUgcXVldWUgd2l0aCB0cnVlIHNvdXJjZXMgKHRob3NlIHRoYXQgYXJlIG5vdCBkZXN0aW5hdGlvbnMpLgogICAgICAgICAgICBsZXQgcXVldWUgPSBsb2Rhc2guZGlmZmVyZW5jZShsb2Rhc2gua2V5cyhzdWNjZXNzb3JzKSwgbG9kYXNoLmtleXMoZGVzdGluYXRpb25zKSk7CiAgICAgICAgICAgIC8vIFByb2R1Y2UgYW4gb3JkZXJpbmcgYnkgdHJhdmVyc2luZyB0aGUgZ3JhcGggYnJlYWR0aCBmaXJzdC4KICAgICAgICAgICAgbGV0IG9yZGVyaW5nID0gKHRoaXMub3JkZXJpbmdzW25vZGVOYW1lXSA9IHt9KTsKICAgICAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgbGV0IGNoaWxkTmFtZSA9IHF1ZXVlLnNoaWZ0KCk7CiAgICAgICAgICAgICAgICBvcmRlcmluZ1tjaGlsZE5hbWVdID0gaW5kZXgrKzsKICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKHN1Y2Nlc3NvcnNbY2hpbGROYW1lXSwgKHN1Y2NOYW1lKSA9PiBxdWV1ZS5wdXNoKHN1Y2NOYW1lKSk7CiAgICAgICAgICAgICAgICBkZWxldGUgc3VjY2Vzc29yc1tjaGlsZE5hbWVdOyAvLyBQcmV2ZW50IGN5Y2xlcyBmcm9tIGluZmluaXRlIGxvb3BpbmcuCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9yZGVyaW5nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGEgZDMgT3JkaW5hbCBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIGluZGV4IG9mCiAgICAgICAgICogYSBub2RlIGJhc2VkIG9uIGl0cyB0ZW1wbGF0ZSBpZC4KICAgICAgICAgKi8KICAgICAgICBnZXRUZW1wbGF0ZUluZGV4KCkgewogICAgICAgICAgICBsZXQgdGVtcGxhdGVOYW1lcyA9IGtleXModGhpcy50ZW1wbGF0ZXMpOwogICAgICAgICAgICBsZXQgdGVtcGxhdGVJbmRleCA9IG9yZGluYWwoKQogICAgICAgICAgICAgICAgLmRvbWFpbih0ZW1wbGF0ZU5hbWVzKQogICAgICAgICAgICAgICAgLnJhbmdlKHNlcXVlbmNlKDAsIHRlbXBsYXRlTmFtZXMubGVuZ3RoKSk7CiAgICAgICAgICAgIHJldHVybiAodGVtcGxhdGVJZCkgPT4gdGVtcGxhdGVJbmRleCh0ZW1wbGF0ZUlkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEludGVybmFsIHV0aWxpdHkgZnVuY3Rpb24gLSBnaXZlbiBhIGdyYXBoIChzaG91bGQgYmUgZWl0aGVyIGEgbWV0YWdyYXBoIG9yIGEKICAgICAqIGJyaWRnZWdyYXBoKSBhbmQgYSBub2RlIHdoaWNoIGlzIGtub3duIHRvIGJlIGluIHRoYXQgZ3JhcGgsIGRldGVybWluZQogICAgICogdGhlIG90aGVyIGVuZHMgb2YgZWRnZXMgdGhhdCBpbnZvbHZlIHRoYXQgbm9kZSBpbiB0aGUgZGlyZWN0aW9uIHNwZWNpZmllZAogICAgICogYnkgd2hldGhlciBpdCdzIGluYm91bmQuCiAgICAgKgogICAgICogRm9yIGV4YW1wbGUgaWYgeW91IHdhbnRlZCB0byBmaW5kIHRoZSBwcmVkZWNlc3NvcnMgb2YgYSBub2RlLCB5b3UnZCBjYWxsCiAgICAgKiB0aGlzIG1ldGhvZCBmb3IgdGhlIHBhcmVudCdzIG1ldGFncmFwaCBhbmQgYnJpZGdlZ3JhcGgsIHNwZWNpZnlpbmcgaW5ib3VuZAogICAgICogYXMgdHJ1ZSAobG9vayBhdCB0aGUgc291cmNlIG9mIGluYm91bmQgZWRnZXMgdG8gdGhlIHNwZWNpZmllZCBub2RlKS4KICAgICAqCiAgICAgKiBEaXNjb3ZlcmVkIHRhcmdldCBuYW1lcyBhcmUgYXBwZW5kZWQgdG8gdGhlIHRhcmdldHMgYXJyYXkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRFZGdlVGFyZ2V0c0luR3JhcGgoZ3JhcGgsIG5vZGUsIGluYm91bmQsIHRhcmdldHMpIHsKICAgICAgICBsZXQgZWRnZXMgPSBpbmJvdW5kID8gZ3JhcGguaW5FZGdlcyhub2RlLm5hbWUpIDogZ3JhcGgub3V0RWRnZXMobm9kZS5uYW1lKTsKICAgICAgICBsb2Rhc2guZWFjaChlZGdlcywgKGUpID0+IHsKICAgICAgICAgICAgbGV0IG1ldGFlZGdlID0gZ3JhcGguZWRnZShlKTsKICAgICAgICAgICAgbGV0IHRhcmdldExpc3QgPSBtZXRhZWRnZS5udW1SZWd1bGFyRWRnZXMKICAgICAgICAgICAgICAgID8gdGFyZ2V0cy5yZWd1bGFyCiAgICAgICAgICAgICAgICA6IHRhcmdldHMuY29udHJvbDsKICAgICAgICAgICAgdGFyZ2V0TGlzdC5wdXNoKG1ldGFlZGdlKTsKICAgICAgICB9KTsKICAgIH0KICAgIGNvbnN0IERlZmF1bHRIaWVyYXJjaHlQYXJhbXMgPSB7CiAgICAgICAgdmVyaWZ5VGVtcGxhdGU6IHRydWUsCiAgICAgICAgc2VyaWVzTm9kZU1pblNpemU6IDUsCiAgICAgICAgc2VyaWVzTWFwOiB7fSwKICAgICAgICByYW5rRGlyZWN0aW9uOiAnQlQnLAogICAgICAgIHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnM6IGZhbHNlLAogICAgfTsKICAgIC8qKgogICAgICogQHBhcmFtIGdyYXBoIFRoZSByYXcgZ3JhcGguCiAgICAgKiBAcGFyYW0gcGFyYW1zIFBhcmFtZXRlcnMgdXNlZCB3aGVuIGJ1aWxkaW5nIGEgaGllcmFyY2h5LgogICAgICovCiAgICBmdW5jdGlvbiBidWlsZCQxKGdyYXBoLCBwYXJhbXMsIHRyYWNrZXIpIHsKICAgICAgICBsZXQgaCA9IG5ldyBIaWVyYXJjaHlJbXBsKHsgcmFua2RpcjogcGFyYW1zLnJhbmtEaXJlY3Rpb24gfSk7CiAgICAgICAgbGV0IHNlcmllc05hbWVzID0ge307CiAgICAgICAgcmV0dXJuIHJ1bkFzeW5jVGFzaygnQWRkaW5nIG5vZGVzJywgMjAsICgpID0+IHsKICAgICAgICAgICAgLy8gR2V0IGFsbCB0aGUgcG9zc2libGUgZGV2aWNlIGFuZCBYTEEgY2x1c3RlciBuYW1lcy4KICAgICAgICAgICAgbGV0IGRldmljZU5hbWVzID0ge307CiAgICAgICAgICAgIGxldCB4bGFDbHVzdGVyTmFtZXMgPSB7fTsKICAgICAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGgubm9kZXMsIChub2RlLCBub2RlTmFtZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKG5vZGUuZGV2aWNlKSB7CiAgICAgICAgICAgICAgICAgICAgZGV2aWNlTmFtZXNbbm9kZS5kZXZpY2VdID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChub2RlLnhsYUNsdXN0ZXIpIHsKICAgICAgICAgICAgICAgICAgICB4bGFDbHVzdGVyTmFtZXNbbm9kZS54bGFDbHVzdGVyXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBoLmRldmljZXMgPSBsb2Rhc2gua2V5cyhkZXZpY2VOYW1lcyk7CiAgICAgICAgICAgIGgueGxhQ2x1c3RlcnMgPSBsb2Rhc2gua2V5cyh4bGFDbHVzdGVyTmFtZXMpOwogICAgICAgICAgICBhZGROb2RlcyhoLCBncmFwaCk7CiAgICAgICAgfSwgdHJhY2tlcikKICAgICAgICAgICAgLnRoZW4oKCkgPT4gewogICAgICAgICAgICByZXR1cm4gcnVuQXN5bmNUYXNrKCdEZXRlY3Qgc2VyaWVzJywgMjAsICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXMuc2VyaWVzTm9kZU1pblNpemUgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgZ3JvdXBTZXJpZXMoaC5yb290LCBoLCBzZXJpZXNOYW1lcywgcGFyYW1zLnNlcmllc05vZGVNaW5TaXplLCBwYXJhbXMuc2VyaWVzTWFwLCBwYXJhbXMudXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sIHRyYWNrZXIpOwogICAgICAgIH0pCiAgICAgICAgICAgIC50aGVuKCgpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHJ1bkFzeW5jVGFzaygnQWRkaW5nIGVkZ2VzJywgMzAsICgpID0+IHsKICAgICAgICAgICAgICAgIGFkZEVkZ2VzKGgsIGdyYXBoKTsKICAgICAgICAgICAgfSwgdHJhY2tlcik7CiAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oKCkgPT4gewogICAgICAgICAgICByZXR1cm4gcnVuQXN5bmNUYXNrKCdGaW5kaW5nIHNpbWlsYXIgc3ViZ3JhcGhzJywgMzAsICgpID0+IHsKICAgICAgICAgICAgICAgIGgudGVtcGxhdGVzID0gZGV0ZWN0KGgsIHBhcmFtcy52ZXJpZnlUZW1wbGF0ZSk7CiAgICAgICAgICAgIH0sIHRyYWNrZXIpOwogICAgICAgIH0pCiAgICAgICAgICAgIC50aGVuKCgpID0+IHsKICAgICAgICAgICAgcmV0dXJuIGg7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBqb2luQW5kQWdncmVnYXRlU3RhdHMoaCwgc3RhdHMpIHsKICAgICAgICAvLyBHZXQgYWxsIHRoZSBwb3NzaWJsZSBkZXZpY2UgYW5kIFhMQSBjbHVzdGVyIG5hbWVzLgogICAgICAgIGxldCBkZXZpY2VOYW1lcyA9IHt9OwogICAgICAgIGxldCB4bGFDbHVzdGVyTmFtZXMgPSB7fTsKICAgICAgICBsb2Rhc2guZWFjaChoLnJvb3QubGVhdmVzKCksIChub2RlTmFtZSkgPT4gewogICAgICAgICAgICBsZXQgbGVhZiA9IGgubm9kZShub2RlTmFtZSk7CiAgICAgICAgICAgIGlmIChsZWFmLmRldmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICBkZXZpY2VOYW1lc1tsZWFmLmRldmljZV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChsZWFmLnhsYUNsdXN0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgeGxhQ2x1c3Rlck5hbWVzW2xlYWYueGxhQ2x1c3Rlcl0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgaC5kZXZpY2VzID0gbG9kYXNoLmtleXMoZGV2aWNlTmFtZXMpOwogICAgICAgIGgueGxhQ2x1c3RlcnMgPSBsb2Rhc2gua2V5cyh4bGFDbHVzdGVyTmFtZXMpOwogICAgICAgIC8vIFJlc2V0IHN0YXRzIGZvciBlYWNoIGdyb3VwIG5vZGUuCiAgICAgICAgbG9kYXNoLmVhY2goaC5nZXROb2RlTWFwKCksIChub2RlLCBub2RlTmFtZSkgPT4gewogICAgICAgICAgICBpZiAobm9kZS5pc0dyb3VwTm9kZSkgewogICAgICAgICAgICAgICAgbm9kZS5zdGF0cyA9IG5ldyBOb2RlU3RhdHMobnVsbCk7CiAgICAgICAgICAgICAgICBub2RlLmRldmljZUhpc3RvZ3JhbSA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgLy8gQnViYmxlLXVwIHRoZSBzdGF0cyBhbmQgZGV2aWNlIGRpc3RyaWJ1dGlvbiBmcm9tIGxlYXZlcyB0byBwYXJlbnRzLgogICAgICAgIGxvZGFzaC5lYWNoKGgucm9vdC5sZWF2ZXMoKSwgKG5vZGVOYW1lKSA9PiB7CiAgICAgICAgICAgIGxldCBsZWFmID0gaC5ub2RlKG5vZGVOYW1lKTsKICAgICAgICAgICAgbGV0IG5vZGUgPSBsZWFmOwogICAgICAgICAgICB3aGlsZSAobm9kZS5wYXJlbnROb2RlICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChsZWFmLmRldmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGRldmljZUhpc3RvZ3JhbSA9IG5vZGUucGFyZW50Tm9kZS5kZXZpY2VIaXN0b2dyYW07CiAgICAgICAgICAgICAgICAgICAgZGV2aWNlSGlzdG9ncmFtW2xlYWYuZGV2aWNlXSA9IChkZXZpY2VIaXN0b2dyYW1bbGVhZi5kZXZpY2VdIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsZWFmLnhsYUNsdXN0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGxldCB4bGFDbHVzdGVySGlzdG9ncmFtID0gbm9kZS5wYXJlbnROb2RlCiAgICAgICAgICAgICAgICAgICAgICAgIC54bGFDbHVzdGVySGlzdG9ncmFtOwogICAgICAgICAgICAgICAgICAgIHhsYUNsdXN0ZXJIaXN0b2dyYW1bbGVhZi54bGFDbHVzdGVyXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICh4bGFDbHVzdGVySGlzdG9ncmFtW2xlYWYueGxhQ2x1c3Rlcl0gfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGxlYWYuc3RhdHMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZS5zdGF0cy5jb21iaW5lKGxlYWYuc3RhdHMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZ2V0SW5jb21wYXRpYmxlT3BzKGhpZXJhcmNoeSwgaGllcmFyY2h5UGFyYW1zKSB7CiAgICAgICAgbGV0IG5vZGVzID0gW107CiAgICAgICAgbGV0IGFkZGVkU2VyaWVzTm9kZXMgPSB7fTsKICAgICAgICBsb2Rhc2guZWFjaChoaWVyYXJjaHkucm9vdC5sZWF2ZXMoKSwgKGxlYWYpID0+IHsKICAgICAgICAgICAgbGV0IG5vZGUgPSBoaWVyYXJjaHkubm9kZShsZWFmKTsKICAgICAgICAgICAgaWYgKG5vZGUudHlwZSA9PSBOb2RlVHlwZS5PUCkgewogICAgICAgICAgICAgICAgbGV0IG9wTm9kZSA9IG5vZGU7CiAgICAgICAgICAgICAgICBpZiAoIW9wTm9kZS5jb21wYXRpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG9wTm9kZS5vd25pbmdTZXJpZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhpZXJhcmNoeVBhcmFtcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGllcmFyY2h5UGFyYW1zLnNlcmllc01hcFtvcE5vZGUub3duaW5nU2VyaWVzXSA9PT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJpZXNHcm91cGluZ1R5cGUuVU5HUk9VUCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIHVuLWdyb3VwZWQgc2VyaWVzIG5vZGUsIGFkZCBlYWNoIG5vZGUgaW5kaXZpZHVhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG9wTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFkZGVkU2VyaWVzTm9kZXNbb3BOb2RlLm93bmluZ1Nlcmllc10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2VyaWVzID0gaGllcmFyY2h5Lm5vZGUob3BOb2RlLm93bmluZ1Nlcmllcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlcmllcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRlZFNlcmllc05vZGVzW29wTm9kZS5vd25pbmdTZXJpZXNdID0gc2VyaWVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKHNlcmllcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBub2Rlcy5wdXNoKG9wTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGVtYmVkZGluZ3MgZm9yIGludmFsaWQgb3BlcmF0aW9ucwogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gob3BOb2RlLmluRW1iZWRkaW5ncywgKGluTm9kZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghaW5Ob2RlLmNvbXBhdGlibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChpbk5vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gob3BOb2RlLm91dEVtYmVkZGluZ3MsIChvdXROb2RlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvdXROb2RlLmNvbXBhdGlibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZXMucHVzaChvdXROb2RlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBub2RlczsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgbWV0YW5vZGVzIGluIHRoZSBoaWVyYXJjaGljYWwgZ3JhcGggYW5kIGFzc2lnbnMgcGFyZW50LWNoaWxkCiAgICAgKiByZWxhdGlvbnNoaXAgYmV0d2VlbiB0aGVtLiBBbHNvIGFzc2lnbnMgcmVsYXRpb25zaGlwcyBiZXR3ZWVuIGxpYnJhcnkKICAgICAqIGZ1bmN0aW9ucyBhbmQgdGhlaXIgdXNhZ2VzIHRocm91Z2hvdXQgdGhlIGdyYXBoLgogICAgICovCiAgICBmdW5jdGlvbiBhZGROb2RlcyhoLCBncmFwaCkgewogICAgICAgIC8vIE1hcHMgdGhlIG9wIG9mIGEgbm9kZSB0byBuYW1lcyBvZiBub2RlcyB0aGF0IGhhdmUgdGhlIG9wLiBVc2VkIHRvIHBvcHVsYXRlCiAgICAgICAgLy8gdGhlIGxpYnJhcnlGdW5jdGlvbnMgZmllbGQgb2YgdGhlIGhpZXJhcmNoeS4KICAgICAgICBjb25zdCBvcFRvTm9kZSA9IHt9OwogICAgICAgIGxvZGFzaC5lYWNoKGdyYXBoLm5vZGVzLCAobm9kZSwgbm9kZU5hbWUpID0+IHsKICAgICAgICAgICAgbGV0IHBhdGggPSBnZXRIaWVyYXJjaGljYWxQYXRoKG5vZGUubmFtZSk7CiAgICAgICAgICAgIGxldCBwYXJlbnQgPSBoLnJvb3Q7CiAgICAgICAgICAgIHBhcmVudC5kZXB0aCA9IE1hdGgubWF4KHBhdGgubGVuZ3RoLCBwYXJlbnQuZGVwdGgpOwogICAgICAgICAgICAvLyBUcmFjayB3aGljaCBub2RlcyBhcmUgYXNzb2NpYXRlZCB3aXRoIHdoaWNoIG9wcy4KICAgICAgICAgICAgaWYgKCFvcFRvTm9kZVtub2RlLm9wXSkgewogICAgICAgICAgICAgICAgb3BUb05vZGVbbm9kZS5vcF0gPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBvcFRvTm9kZVtub2RlLm9wXS5wdXNoKG5vZGUpOwogICAgICAgICAgICAvLyBDcmVhdGUgcGFyZW50IG1ldGFub2RlcyBmb3IgZWFjaCBkZXB0aC4gRm9yIGV4YW1wbGUgaWYgdGhlIG5vZGUgbmFtZQogICAgICAgICAgICAvLyBpcyAnYS9iL2MnLCB0aGVuIGNyZWF0ZSBtZXRhbm9kZXMgJ2EnIGFuZCAnYS9iJywgd2hlcmUgJ2EvYicgaXMgYSBjaGlsZAogICAgICAgICAgICAvLyBvZiBhLgogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGgubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHBhcmVudC5kZXB0aCA9IE1hdGgubWF4KHBhcmVudC5kZXB0aCwgcGF0aC5sZW5ndGggLSBpKTsKICAgICAgICAgICAgICAgIHBhcmVudC5jYXJkaW5hbGl0eSArPSBub2RlLmNhcmRpbmFsaXR5OwogICAgICAgICAgICAgICAgcGFyZW50Lm9wSGlzdG9ncmFtW25vZGUub3BdID0gKHBhcmVudC5vcEhpc3RvZ3JhbVtub2RlLm9wXSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICBpZiAobm9kZS5kZXZpY2UgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHBhcmVudC5kZXZpY2VIaXN0b2dyYW1bbm9kZS5kZXZpY2VdID0KICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudC5kZXZpY2VIaXN0b2dyYW1bbm9kZS5kZXZpY2VdIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChub2RlLnhsYUNsdXN0ZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHBhcmVudC54bGFDbHVzdGVySGlzdG9ncmFtW25vZGUueGxhQ2x1c3Rlcl0gPQogICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50LnhsYUNsdXN0ZXJIaXN0b2dyYW1bbm9kZS54bGFDbHVzdGVyXSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgcGFyZW50cyBhcHByb3ByaWF0ZSBjb21wYXRpYmlsaXR5IGNvdW50CiAgICAgICAgICAgICAgICBpZiAobm9kZS5jb21wYXRpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChwYXJlbnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHBhcmVudC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChwYXJlbnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGUgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSW5jcmVtZW50IGNhcGFiaWxpdHkgY291bnRzIGZvciBpbiBhbmQgb3V0IGVtYmVkZGluZ3MKICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKG5vZGUuaW5FbWJlZGRpbmdzLCAoaW5Ob2RlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluTm9kZS5jb21wYXRpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXJlbnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGUgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZS5vdXRFbWJlZGRpbmdzLCAob3V0Tm9kZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChvdXROb2RlLmNvbXBhdGlibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGFyZW50LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhcmVudC5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoaSA9PT0gcGF0aC5sZW5ndGggLSAxKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IHBhdGhbaV07CiAgICAgICAgICAgICAgICBsZXQgY2hpbGQgPSBoLm5vZGUobmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQgPSBjcmVhdGVNZXRhbm9kZShuYW1lLCBoLmdyYXBoT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgY2hpbGQucGFyZW50Tm9kZSA9IHBhcmVudDsKICAgICAgICAgICAgICAgICAgICBoLnNldE5vZGUobmFtZSwgY2hpbGQpOwogICAgICAgICAgICAgICAgICAgIHBhcmVudC5tZXRhZ3JhcGguc2V0Tm9kZShuYW1lLCBjaGlsZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWUuaW5kZXhPZihGVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYKSA9PT0gMCAmJgogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQubmFtZSA9PT0gUk9PVF9OQU1FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgbWV0YW5vZGUgcmVwcmVzZW50cyBhIGZ1bmN0aW9uIGluIHRoZSBMaWJyYXJ5LiBXZSBsYXRlciBjb3B5CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0cyBjb250ZW50cyB0byBkeW5hbWljYWxseSBpbmplY3QgZnVuY3Rpb24gZGF0YSBpbnRvIHRoZSBncmFwaAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGVuIHRoZSBzdWJoaWVyYXJjaHkgb2YgYSBtZXRhbm9kZSBpcyBidWlsdCAodXBvbiBpdHMgZXhwYW5zaW9uKS4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZnVuY3Rpb25OYW1lID0gbmFtZS5zdWJzdHJpbmcoRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWC5sZW5ndGgpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCByZW1lbWJlciB0aGUgbWV0YW5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBmdW5jdGlvbiB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgbmFtZS4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvcFRvTm9kZVtmdW5jdGlvbk5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFRvTm9kZVtmdW5jdGlvbk5hbWVdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaC5saWJyYXJ5RnVuY3Rpb25zW2Z1bmN0aW9uTmFtZV0gPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiBjaGlsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlczogb3BUb05vZGVbZnVuY3Rpb25OYW1lXSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuYXNzb2NpYXRlZEZ1bmN0aW9uID0gZnVuY3Rpb25OYW1lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHBhcmVudCA9IGNoaWxkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFzc3VtaW5nIG5vZGUgbmFtZSBpcyAnYS9iL2MnLCBhc3NpZ24gdGhlIE9wTm9kZSBhcyBhIGNoaWxkIG9mIHRoZQogICAgICAgICAgICAvLyBtZXRhbm9kZSAnYS9iJy4KICAgICAgICAgICAgaC5zZXROb2RlKG5vZGUubmFtZSwgbm9kZSk7CiAgICAgICAgICAgIG5vZGUucGFyZW50Tm9kZSA9IHBhcmVudDsKICAgICAgICAgICAgcGFyZW50Lm1ldGFncmFwaC5zZXROb2RlKG5vZGUubmFtZSwgbm9kZSk7CiAgICAgICAgICAgIC8vIEFkZCBlYWNoIG9mIHRoZSBpbi1lbWJlZGRpbmdzIGFuZCBvdXQtZW1iZWRkaW5ncyBpbiB0aGUgaGllcmFyY2h5LgogICAgICAgICAgICBsb2Rhc2guZWFjaChub2RlLmluRW1iZWRkaW5ncywgZnVuY3Rpb24gKGVtYmVkZGluZykgewogICAgICAgICAgICAgICAgaC5zZXROb2RlKGVtYmVkZGluZy5uYW1lLCBlbWJlZGRpbmcpOwogICAgICAgICAgICAgICAgZW1iZWRkaW5nLnBhcmVudE5vZGUgPSBub2RlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZS5vdXRFbWJlZGRpbmdzLCBmdW5jdGlvbiAoZW1iZWRkaW5nKSB7CiAgICAgICAgICAgICAgICBoLnNldE5vZGUoZW1iZWRkaW5nLm5hbWUsIGVtYmVkZGluZyk7CiAgICAgICAgICAgICAgICBlbWJlZGRpbmcucGFyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBGb3IgZWFjaCBtZXRhbm9kZSBpbiB0aGUgaGllcmFyY2hpY2FsIGdyYXBoLCB0aGlzIG1ldGhvZCBhZGRzOgogICAgICogdGhlIGVkZ2VzIGluIHRoZSBtZXRhZ3JhcGguIFRoZXNlIGFyZSBlZGdlcyBiZXR3ZWVuIG5vZGVzCiAgICAgKiB0aGF0IHNoYXJlIHRoZSBzYW1lIHBhcmVudC4KICAgICAqLwogICAgZnVuY3Rpb24gYWRkRWRnZXMoaCwgZ3JhcGgsIHNlcmllc05hbWVzKSB7CiAgICAgICAgbGV0IG5vZGVJbmRleCA9IGguZ2V0Tm9kZU1hcCgpOwogICAgICAgIC8vIEFuY2VzdG9yIHBhdGhzIGZvciB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBub2RlcyBvZiBhbiBlZGdlLiBUaGVzZSBhcmUKICAgICAgICAvLyByZXVzZWQgZm9yIGVhY2ggZWRnZSByYXRoZXIgdGhhbiBhbGxvY2F0aW5nIG5ldyBvbmVzLiBJdCdzIGFib3V0IDEwJSBmYXN0ZXIKICAgICAgICAvLyB0aGFuIGFsbG9jYXRpbmcgbmV3IG9uZXMgb24gZWFjaCBwYXNzIHRocm91Z2ggdGhlIGxvb3AuCiAgICAgICAgbGV0IHNvdXJjZVBhdGggPSBbXTsKICAgICAgICBsZXQgZGVzdFBhdGggPSBbXTsKICAgICAgICAvLyBJbnNlcnQgdGhlIGFuY2VzdG9yIHBhdGggZm9yIGEgbm9kZSBpbnRvIHRoZSBwcm92aWRlZCBhcnJheSwgaW5jbHVkaW5nIHRoZQogICAgICAgIC8vIG5vZGUgaXRzZWxmLiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG5vZGUgaW5zZXJ0ZWQgKGFsd2F5cyBST09UKS4KICAgICAgICBsZXQgZ2V0UGF0aCA9IChub2RlLCBwYXRoKSA9PiB7CiAgICAgICAgICAgIGxldCBpID0gMDsKICAgICAgICAgICAgd2hpbGUgKG5vZGUpIHsKICAgICAgICAgICAgICAgIHBhdGhbaSsrXSA9IG5vZGUubmFtZTsKICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGkgLSAxOwogICAgICAgIH07CiAgICAgICAgbG9kYXNoLmVhY2goZ3JhcGguZWRnZXMsIChiYXNlRWRnZSkgPT4gewogICAgICAgICAgICAvLyBHZXQgdGhlIGhpZXJhcmNoaWNhbCBwYXRocyBmb3IgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gb2YgdGhlIGVkZ2UuCiAgICAgICAgICAgIGxldCBzb3VyY2VBbmNlc3RvckluZGV4ID0gZ2V0UGF0aChncmFwaC5ub2Rlc1tiYXNlRWRnZS52XSwgc291cmNlUGF0aCk7CiAgICAgICAgICAgIGxldCBkZXN0QW5jZXN0b3JJbmRleCA9IGdldFBhdGgoZ3JhcGgubm9kZXNbYmFzZUVkZ2Uud10sIGRlc3RQYXRoKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGhpZXJhcmNoaWNhbCBwYXRoIGNhbm5vdCBiZSBmb3VuZCBmb3IgZWl0aGVyIGVuZHBvaW50LCB0aGVuIHdlCiAgICAgICAgICAgIC8vIGNhbm5vdCBjcmVhdGUgdGhlIGVkZ2UuIFRoaXMgaGFwcGVucyBmb3IgZXhhbXBsZSB3aGVuIGEgbm9kZSBoYXMgYQogICAgICAgICAgICAvLyBjb250cm9sIGRlcGVuZGVuY3kgb24gYSBzdW1tYXJ5IG5vZGUsIHdoaWNoIGFyZSBlbWJlZGRlZC4KICAgICAgICAgICAgaWYgKHNvdXJjZUFuY2VzdG9ySW5kZXggPT09IC0xIHx8IGRlc3RBbmNlc3RvckluZGV4ID09PSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGxvd2VzdCBzaGFyZWQgYW5jZXN0b3IgYmV0d2VlbiBzb3VyY2UgYW5kIGRlc3QgYnkgbG9va2luZyBmb3IKICAgICAgICAgICAgLy8gdGhlIGhpZ2hlc3Qgbm9kZXMgdGhhdCBkaWZmZXIgYmV0d2VlbiB0aGVpciBhbmNlc3RvciBwYXRocy4KICAgICAgICAgICAgd2hpbGUgKHNvdXJjZVBhdGhbc291cmNlQW5jZXN0b3JJbmRleF0gPT09IGRlc3RQYXRoW2Rlc3RBbmNlc3RvckluZGV4XSkgewogICAgICAgICAgICAgICAgc291cmNlQW5jZXN0b3JJbmRleC0tOwogICAgICAgICAgICAgICAgZGVzdEFuY2VzdG9ySW5kZXgtLTsKICAgICAgICAgICAgICAgIGlmIChzb3VyY2VBbmNlc3RvckluZGV4IDwgMCB8fCBkZXN0QW5jZXN0b3JJbmRleCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdvdWxkIG9ubHkgb2NjdXIgaWYgdGhlIHR3byBub2RlcyB3ZXJlIHRoZSBzYW1lIChhIGN5Y2xlIGluIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIGdyYXBoKSwgb3IgaWYgb25lIGVuZHBvaW50IHdhcyBhIHN0cmljdCBhbmNlc3RvciBvZiB0aGUgb3RoZXIuIFRoZQogICAgICAgICAgICAgICAgICAgIC8vIGxhdHRlciBzaG91bGRuJ3QgaGFwcGVuIGJlY2F1c2Ugd2UgcmVuYW1lIG5vZGVzIHdoaWNoIGFyZSBib3RoCiAgICAgICAgICAgICAgICAgICAgLy8gbWV0YW5vZGVzIGFuZCBvcCBub2Rlcy4gRS5nLiAnQS9CJyBiZWNvbWVzICdBL0IvKEIpJy4KICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignTm8gZGlmZmVyZW5jZSBmb3VuZCBiZXR3ZWVuIGFuY2VzdG9yIHBhdGhzLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzaGFyZWRBbmNlc3Rvck5vZGUgPSAobm9kZUluZGV4W3NvdXJjZVBhdGhbc291cmNlQW5jZXN0b3JJbmRleCArIDFdXSk7CiAgICAgICAgICAgIGxldCBzb3VyY2VBbmNlc3Rvck5hbWUgPSBzb3VyY2VQYXRoW3NvdXJjZUFuY2VzdG9ySW5kZXhdOwogICAgICAgICAgICBsZXQgZGVzdEFuY2VzdG9yTmFtZSA9IGRlc3RQYXRoW2Rlc3RBbmNlc3RvckluZGV4XTsKICAgICAgICAgICAgLy8gRmluZCBvciBjcmVhdGUgdGhlIE1ldGFlZGdlIHdoaWNoIHNob3VsZCBjb250YWluIHRoaXMgQmFzZUVkZ2UgaW5zaWRlCiAgICAgICAgICAgIC8vIHRoZSBzaGFyZWQgYW5jZXN0b3IuCiAgICAgICAgICAgIGxldCBtZXRhZWRnZSA9IHNoYXJlZEFuY2VzdG9yTm9kZS5tZXRhZ3JhcGguZWRnZShzb3VyY2VBbmNlc3Rvck5hbWUsIGRlc3RBbmNlc3Rvck5hbWUpOwogICAgICAgICAgICBpZiAoIW1ldGFlZGdlKSB7CiAgICAgICAgICAgICAgICBtZXRhZWRnZSA9IGNyZWF0ZU1ldGFlZGdlKHNvdXJjZUFuY2VzdG9yTmFtZSwgZGVzdEFuY2VzdG9yTmFtZSk7CiAgICAgICAgICAgICAgICBzaGFyZWRBbmNlc3Rvck5vZGUubWV0YWdyYXBoLnNldEVkZ2Uoc291cmNlQW5jZXN0b3JOYW1lLCBkZXN0QW5jZXN0b3JOYW1lLCBtZXRhZWRnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFzaGFyZWRBbmNlc3Rvck5vZGUuaGFzTm9uQ29udHJvbEVkZ2VzICYmCiAgICAgICAgICAgICAgICAhYmFzZUVkZ2UuaXNDb250cm9sRGVwZW5kZW5jeSkgewogICAgICAgICAgICAgICAgc2hhcmVkQW5jZXN0b3JOb2RlLmhhc05vbkNvbnRyb2xFZGdlcyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWV0YWVkZ2UuYWRkQmFzZUVkZ2UoYmFzZUVkZ2UsIGgpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBVc2luZyB0aGUgaGllcmFyY2h5IHRlbXBsYXRlIGluZm9ybWF0aW9uLCBkZXRlY3Qgc2VyaWVzIGluIHRoZSBwcm92aWRlZAogICAgICogbWV0YW5vZGUuICBGb3IgZWFjaCBkZXRlY3RlZCBzZXJpZXMsIGNyZWF0ZSBhIG5ldyBTZXJpZXNOb2RlCiAgICAgKiBhbmQgcmVtb3ZlIHNlcmllcyBtZW1iZXJzIGZyb20gdGhlIG1ldGFub2RlJ3MgbWV0YWdyYXBoIGFuZCBtb3ZlIHRoZW0gdG8KICAgICAqIHRoZSBuZXcgc2VyaWVzIG5vZGUncyBtZXRhZ3JhcGguCiAgICAgKgogICAgICogQHBhcmFtIG1ldGFub2RlCiAgICAgKiBAcGFyYW0gaGllcmFyY2h5CiAgICAgKiBAcGFyYW0gc2VyaWVzTmFtZXMgTWFwIG9mIG5vZGUgbmFtZXMgdG8gdGhlaXIgc2VyaWVzIHRoZXkgYXJlIGNvbnRhaW5lZCBpbi4KICAgICAqICAgICBUaGlzIHNob3VsZCBiZSBwcm92aWRlZCBlbXB0eSBhbmQgaXMgcG9wdWxhdGVkIGJ5IHRoaXMgbWV0aG9kLgogICAgICogQHBhcmFtIHRocmVzaG9sZCBJZiB0aGUgc2VyaWVzIGhhcyB0aGlzIG1hbnkgbm9kZXMgb3IgbW9yZSwgdGhlbiBncm91cCB0aGVtCiAgICAgKiAgICAgaW50byBhIHNlcmllcy4KICAgICAqIEBwYXJhbSBtYXAgTWFwIG9mIHNlcmllcyBuYW1lcyB0byB0aGVpciBzZXJpZXMgZ3JvdXBpbmcgdHlwZSwgaWYgb25lIGhhcwogICAgICogICAgIGJlZW4gc2V0LgogICAgICogQHBhcmFtIHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnMgV2hldGhlciB0byB1c2UgZmluZCBwYXR0ZXJucyBmb3Igc2VyaWVzCiAgICAgKiAgICAgbm9kZXMgdXNpbmcgYW55IHBhcnRzIG9mIG5hbWVzIG9mIG5vZGVzLiBJZiBmYWxzZSwgb25seSB1c2VzIHBhdHRlcm5zCiAgICAgKiAgICAgZGlzY292ZXJlZCB3aXRoaW4gbnVtZXJpYyBzdWZmaXhlcyBvZiBub2RlcyBuYW1lcy4KICAgICAqIEByZXR1cm4gQSBkaWN0aW9uYXJ5IGZyb20gbm9kZSBuYW1lIHRvIHNlcmllcyBub2RlIG5hbWUgdGhhdCBjb250YWlucyB0aGUKICAgICAqICAgICBub2RlLgogICAgICovCiAgICBmdW5jdGlvbiBncm91cFNlcmllcyhtZXRhbm9kZSwgaGllcmFyY2h5LCBzZXJpZXNOYW1lcywgdGhyZXNob2xkLCBtYXAsIHVzZUdlbmVyYWxpemVkU2VyaWVzUGF0dGVybnMpIHsKICAgICAgICBsZXQgbWV0YWdyYXBoID0gbWV0YW5vZGUubWV0YWdyYXBoOwogICAgICAgIGxvZGFzaC5lYWNoKG1ldGFncmFwaC5ub2RlcygpLCAobikgPT4gewogICAgICAgICAgICBsZXQgY2hpbGQgPSBtZXRhZ3JhcGgubm9kZShuKTsKICAgICAgICAgICAgaWYgKGNoaWxkLnR5cGUgPT09IE5vZGVUeXBlLk1FVEEpIHsKICAgICAgICAgICAgICAgIGdyb3VwU2VyaWVzKGNoaWxkLCBoaWVyYXJjaHksIHNlcmllc05hbWVzLCB0aHJlc2hvbGQsIG1hcCwgdXNlR2VuZXJhbGl6ZWRTZXJpZXNQYXR0ZXJucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBsZXQgY2x1c3RlcnMgPSBjbHVzdGVyTm9kZXMobWV0YWdyYXBoKTsKICAgICAgICBjb25zdCBkZXRlY3RTZXJpZXNNZXRob2QgPSB1c2VHZW5lcmFsaXplZFNlcmllc1BhdHRlcm5zCiAgICAgICAgICAgID8gZGV0ZWN0U2VyaWVzQW55d2hlcmVJbk5vZGVOYW1lCiAgICAgICAgICAgIDogZGV0ZWN0U2VyaWVzVXNpbmdOdW1lcmljU3VmZml4ZXM7CiAgICAgICAgbGV0IHNlcmllc0RpY3QgPSBkZXRlY3RTZXJpZXNNZXRob2QoY2x1c3RlcnMsIG1ldGFncmFwaCwgaGllcmFyY2h5LmdyYXBoT3B0aW9ucyk7CiAgICAgICAgLy8gQWRkIGVhY2ggc2VyaWVzIG5vZGUgdG8gdGhlIGdyYXBoIGFuZCBhZGQgaXRzIGdyb3VwZWQgY2hpbGRyZW4gdG8gaXRzIG93bgogICAgICAgIC8vIG1ldGFncmFwaC4KICAgICAgICBsb2Rhc2guZWFjaChzZXJpZXNEaWN0LCBmdW5jdGlvbiAoc2VyaWVzTm9kZSwgc2VyaWVzTmFtZSkgewogICAgICAgICAgICBsZXQgbm9kZU1lbWJlck5hbWVzID0gc2VyaWVzTm9kZS5tZXRhZ3JhcGgubm9kZXMoKTsKICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZU1lbWJlck5hbWVzLCAobikgPT4gewogICAgICAgICAgICAgICAgbGV0IGNoaWxkID0gbWV0YWdyYXBoLm5vZGUobik7CiAgICAgICAgICAgICAgICBpZiAoIWNoaWxkLm93bmluZ1NlcmllcykgewogICAgICAgICAgICAgICAgICAgIGNoaWxkLm93bmluZ1NlcmllcyA9IHNlcmllc05hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBJZiB0aGUgc2VyaWVzIGNvbnRhaW5zIGxlc3MgdGhhbiB0aGUgdGhyZXNob2xkIG51bWJlciBvZiBub2RlcyBhbmQKICAgICAgICAgICAgLy8gdGhpcyBzZXJpZXMgaGFzIG5vdCBiZWVuIGFkZGluZyB0byB0aGUgc2VyaWVzIG1hcCwgdGhlbiBzZXQgdGhpcwogICAgICAgICAgICAvLyBzZXJpZXMgdG8gYmUgc2hvd24gdW5ncm91cGVkIGluIHRoZSBtYXAuCiAgICAgICAgICAgIGlmIChub2RlTWVtYmVyTmFtZXMubGVuZ3RoIDwgdGhyZXNob2xkICYmICEoc2VyaWVzTm9kZS5uYW1lIGluIG1hcCkpIHsKICAgICAgICAgICAgICAgIG1hcFtzZXJpZXNOb2RlLm5hbWVdID0gU2VyaWVzR3JvdXBpbmdUeXBlLlVOR1JPVVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIHNlcmllcyBpcyBpbiB0aGUgbWFwIGFzIHVuZ3JvdXBlZCB0aGVuIGRvIG5vdCBncm91cCB0aGUgc2VyaWVzLgogICAgICAgICAgICBpZiAoc2VyaWVzTm9kZS5uYW1lIGluIG1hcCAmJgogICAgICAgICAgICAgICAgbWFwW3Nlcmllc05vZGUubmFtZV0gPT09IFNlcmllc0dyb3VwaW5nVHlwZS5VTkdST1VQKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaGllcmFyY2h5LnNldE5vZGUoc2VyaWVzTmFtZSwgc2VyaWVzTm9kZSk7IC8vIGFkZCB0byB0aGUgaW5kZXgKICAgICAgICAgICAgbWV0YWdyYXBoLnNldE5vZGUoc2VyaWVzTmFtZSwgc2VyaWVzTm9kZSk7CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKG5vZGVNZW1iZXJOYW1lcywgKG4pID0+IHsKICAgICAgICAgICAgICAgIGxldCBjaGlsZCA9IG1ldGFncmFwaC5ub2RlKG4pOwogICAgICAgICAgICAgICAgc2VyaWVzTm9kZS5tZXRhZ3JhcGguc2V0Tm9kZShuLCBjaGlsZCk7CiAgICAgICAgICAgICAgICBzZXJpZXNOb2RlLnBhcmVudE5vZGUgPSBjaGlsZC5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgc2VyaWVzTm9kZS5jYXJkaW5hbGl0eSsrOwogICAgICAgICAgICAgICAgaWYgKGNoaWxkLmRldmljZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgc2VyaWVzTm9kZS5kZXZpY2VIaXN0b2dyYW1bY2hpbGQuZGV2aWNlXSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChzZXJpZXNOb2RlLmRldmljZUhpc3RvZ3JhbVtjaGlsZC5kZXZpY2VdIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjaGlsZC54bGFDbHVzdGVyICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBzZXJpZXNOb2RlLnhsYUNsdXN0ZXJIaXN0b2dyYW1bY2hpbGQueGxhQ2x1c3Rlcl0gPQogICAgICAgICAgICAgICAgICAgICAgICAoc2VyaWVzTm9kZS54bGFDbHVzdGVySGlzdG9ncmFtW2NoaWxkLnhsYUNsdXN0ZXJdIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBwYXJlbnRzIGFwcHJvcHJpYXRlIGNvbXBhdGliaWxpdHkgY291bnQKICAgICAgICAgICAgICAgIGlmIChjaGlsZC5jb21wYXRpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgc2VyaWVzTm9kZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUgPQogICAgICAgICAgICAgICAgICAgICAgICAoc2VyaWVzTm9kZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2VyaWVzTm9kZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmluY29tcGF0aWJsZSA9CiAgICAgICAgICAgICAgICAgICAgICAgIChzZXJpZXNOb2RlLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlIHx8IDApICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEluY3JlbWVudCBjYXBhYmlsaXR5IGNvdW50cyBmb3IgaW4gYW5kIG91dCBlbWJlZGRpbmdzCiAgICAgICAgICAgICAgICBsb2Rhc2guZWFjaChjaGlsZC5pbkVtYmVkZGluZ3MsIChpbk5vZGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5Ob2RlLmNvbXBhdGlibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWVzTm9kZS5jb21wYXRpYmlsaXR5SGlzdG9ncmFtLmNvbXBhdGlibGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcmllc05vZGUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlIHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc05vZGUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNlcmllc05vZGUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGUgfHwgMCkgKyAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgbG9kYXNoLmVhY2goY2hpbGQub3V0RW1iZWRkaW5ncywgKG91dE5vZGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAob3V0Tm9kZS5jb21wYXRpYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc05vZGUuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5jb21wYXRpYmxlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXJpZXNOb2RlLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZSB8fCAwKSArIDE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzZXJpZXNOb2RlLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXJpZXNOb2RlLmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlIHx8IDApICsgMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNoaWxkLnBhcmVudE5vZGUgPSBzZXJpZXNOb2RlOwogICAgICAgICAgICAgICAgc2VyaWVzTmFtZXNbbl0gPSBzZXJpZXNOYW1lOwogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIG5vdy1ncm91cGVkIG5vZGUgZnJvbSBpdHMgb3JpZ2luYWwgcGFyZW50J3MgbWV0YWdyYXBoLgogICAgICAgICAgICAgICAgbWV0YWdyYXBoLnJlbW92ZU5vZGUobik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgLyoqIGNsdXN0ZXIgb3Atbm9kZXMgd2l0aCBzaW1pbGFyIG9wICovCiAgICBmdW5jdGlvbiBjbHVzdGVyTm9kZXMobWV0YWdyYXBoKSB7CiAgICAgICAgbGV0IHJlc3VsdCA9IHt9OwogICAgICAgIHJldHVybiBsb2Rhc2gucmVkdWNlKG1ldGFncmFwaC5ub2RlcygpLCAoY2x1c3RlcnMsIG4pID0+IHsKICAgICAgICAgICAgbGV0IGNoaWxkID0gbWV0YWdyYXBoLm5vZGUobik7CiAgICAgICAgICAgIGlmIChjaGlsZC50eXBlID09PSBOb2RlVHlwZS5NRVRBKSB7CiAgICAgICAgICAgICAgICAvLyBza2lwIG1ldGFub2RlcwogICAgICAgICAgICAgICAgcmV0dXJuIGNsdXN0ZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB0ZW1wbGF0ZSA9IGNoaWxkLm9wOwogICAgICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgIGNsdXN0ZXJzW3RlbXBsYXRlXSA9IGNsdXN0ZXJzW3RlbXBsYXRlXSB8fCBbXTsKICAgICAgICAgICAgICAgIGNsdXN0ZXJzW3RlbXBsYXRlXS5wdXNoKGNoaWxkLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjbHVzdGVyczsKICAgICAgICB9LCByZXN1bHQpOwogICAgfQogICAgLyoqCiAgICAgKiBGb3IgZWFjaCBjbHVzdGVyIG9mIG9wLW5vZGVzIGJhc2VkIG9wIHR5cGUsIHRyeSB0byBkZXRlY3QgZ3JvdXBpbmdzLgogICAgICogSW5mZXIgc2VyaWVzIG5hbWUgdXNpbmcgYnkgdHJ5aW5nIHRvIGZpbmQgcGF0dGVybiAnPG51bWJlcj4nIHRvd2FyZHMgdGhlIGVuZAogICAgICogb2Ygbm9kZSBuYW1lcy4KICAgICAqCiAgICAgKiBAcGFyYW0gY2x1c3RlcnMgRGljdGlvbmFyeSBvdXRwdXQgZnJvbSBjbHVzdGVyTm9kZXMoKS4KICAgICAqIEBwYXJhbSBtZXRhZ3JhcGgKICAgICAqIEByZXR1cm4gQSBkaWN0aW9uYXJ5IGZyb20gc2VyaWVzIG5hbWUgPT4gc2VyaWVzTm9kZQogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RTZXJpZXNVc2luZ051bWVyaWNTdWZmaXhlcyhjbHVzdGVycywgbWV0YWdyYXBoLCBncmFwaE9wdGlvbnMpIHsKICAgICAgICBsZXQgc2VyaWVzRGljdCA9IHt9OwogICAgICAgIGxvZGFzaC5lYWNoKGNsdXN0ZXJzLCBmdW5jdGlvbiAobWVtYmVycywgY2x1c3RlcklkKSB7CiAgICAgICAgICAgIGlmIChtZW1iZXJzLmxlbmd0aCA8PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0gLy8gaXNvbGF0ZWQgY2x1c3RlcnMgY2FuJ3QgbWFrZSBzZXJpZXMKICAgICAgICAgICAgLyoqIEB0eXBlIHtPYmplY3R9ICBBIGRpY3Rpb25hcnkgbWFwcGluZyBzZXJpZXNOYW1lIHRvIHNlcmllc0luZm9BcnJheSwKICAgICAgICAgICAgICogd2hpY2ggaXMgYW4gYXJyYXkgdGhhdCBjb250YWlucyBvYmplY3RzIHdpdGggbmFtZSwgaWQsIHByZWZpeCwgc3VmZml4LAogICAgICAgICAgICAgKiBhbmQgcGFyZW50IHByb3BlcnRpZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBsZXQgY2FuZGlkYXRlc0RpY3QgPSB7fTsKICAgICAgICAgICAgLy8gR3JvdXAgYWxsIG5vZGVzIHRoYXQgaGF2ZSB0aGUgc2FtZSBuYW1lLCB3aXRoIHRoZSBleGNlcHRpb24gb2YgYQogICAgICAgICAgICAvLyBudW1iZXIgYXQgdGhlIGVuZCBvZiB0aGUgbmFtZSBhZnRlciBhbiB1bmRlcnNjb3JlLCB3aGljaCBpcyBhbGxvd2VkIHRvCiAgICAgICAgICAgIC8vIHZhcnkuCiAgICAgICAgICAgIGxvZGFzaC5lYWNoKG1lbWJlcnMsIGZ1bmN0aW9uIChuYW1lKSB7CiAgICAgICAgICAgICAgICBsZXQgaXNHcm91cCA9IG5hbWUuY2hhckF0KG5hbWUubGVuZ3RoIC0gMSkgPT09ICcqJzsKICAgICAgICAgICAgICAgIGxldCBuYW1lcGF0aCA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGxldCBsZWFmID0gbmFtZXBhdGhbbmFtZXBhdGgubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICBsZXQgcGFyZW50ID0gbmFtZXBhdGguc2xpY2UoMCwgbmFtZXBhdGgubGVuZ3RoIC0gMSkuam9pbignLycpOwogICAgICAgICAgICAgICAgbGV0IG1hdGNoZXMgPSBsZWFmLm1hdGNoKC9eKFxEKilfKFxkKykkLyk7CiAgICAgICAgICAgICAgICBsZXQgcHJlZml4OwogICAgICAgICAgICAgICAgbGV0IGlkOwogICAgICAgICAgICAgICAgbGV0IHN1ZmZpeCA9ICcnOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoZXMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiBmb3VuZCAnPG51bWJlcj4nIGluIHRoZSBuYW1lLCBhc3NpZ24gaWQuCiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbWF0Y2hlc1sxXTsgLy8gdGhlIGZyb250IG5vbi1udW1lcmljIGNoYXJhY3RlcnMKICAgICAgICAgICAgICAgICAgICBpZCA9IG1hdGNoZXNbMl07IC8vIHRoZSBkaWdpdHMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGZvciBub2RlIHdpdGhvdXQgJ188bnVtYmVyPicsIG1ha2UgdGhlbSB6ZXJvLXRoIGl0ZW1zLgogICAgICAgICAgICAgICAgICAgIHByZWZpeCA9IGlzR3JvdXAgPyBsZWFmLnN1YnN0cigwLCBsZWFmLmxlbmd0aCAtIDEpIDogbGVhZjsKICAgICAgICAgICAgICAgICAgICBpZCA9IDA7CiAgICAgICAgICAgICAgICAgICAgc3VmZml4ID0gaXNHcm91cCA/ICcqJyA6ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHNlcmllc05hbWUgPSBnZXRTZXJpZXNOb2RlTmFtZShwcmVmaXgsIHN1ZmZpeCwgcGFyZW50KTsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXNEaWN0W3Nlcmllc05hbWVdID0gY2FuZGlkYXRlc0RpY3Rbc2VyaWVzTmFtZV0gfHwgW107CiAgICAgICAgICAgICAgICBsZXQgc2VyaWVzTm9kZSA9IGNyZWF0ZVNlcmllc05vZGUocHJlZml4LCBzdWZmaXgsIHBhcmVudCwgK2lkLCBuYW1lLCBncmFwaE9wdGlvbnMpOwogICAgICAgICAgICAgICAgY2FuZGlkYXRlc0RpY3Rbc2VyaWVzTmFtZV0ucHVzaChzZXJpZXNOb2RlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIEluIGVhY2ggZ3JvdXAgb2Ygbm9kZXMsIGdyb3VwIG5vZGVzIGluIGJ1bmNoZXMgdGhhdCBoYXZlIG1vbm90b25pY2FsbHkKICAgICAgICAgICAgLy8gaW5jcmVhc2luZyBudW1iZXJzIGluIHRoZWlyIG5hbWVzLiAgRWFjaCBvZiB0aGVzZSBidW5jaGVzIGlzIGEgc2VyaWVzLgogICAgICAgICAgICBsb2Rhc2guZWFjaChjYW5kaWRhdGVzRGljdCwgZnVuY3Rpb24gKHNlcmllc0luZm9BcnJheSwgc2VyaWVzTmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHNlcmllc0luZm9BcnJheS5sZW5ndGggPCAyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VyaWVzSW5mb0FycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gK2EuY2x1c3RlcklkIC0gK2IuY2x1c3RlcklkOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBMb29wIHRocm91Z2ggdGhlIG5vZGVzIHNvcnRlZCBieSBpdHMgZGV0ZWN0ZWQgc2VyaWVzIG51bWJlciwgZ3JvdXBpbmcKICAgICAgICAgICAgICAgIC8vIGFsbCBub2RlcyB3aXRoIG1vbm90b25pY2FsbHktaW5jcmVhc2luZyBzZXJpZXMgbnVtYmVycy4KICAgICAgICAgICAgICAgIGxldCBzZXJpZXNOb2RlcyA9IFtzZXJpZXNJbmZvQXJyYXlbMF1dOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8IHNlcmllc0luZm9BcnJheS5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgICAgICBsZXQgbmV4dE5vZGUgPSBzZXJpZXNJbmZvQXJyYXlbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0Tm9kZS5jbHVzdGVySWQgPT09CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc05vZGVzW3Nlcmllc05vZGVzLmxlbmd0aCAtIDFdLmNsdXN0ZXJJZCArIDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWVzTm9kZXMucHVzaChuZXh0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBhZGRTZXJpZXNUb0RpY3Qoc2VyaWVzTm9kZXMsIHNlcmllc0RpY3QsICtjbHVzdGVySWQsIG1ldGFncmFwaCwgZ3JhcGhPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBzZXJpZXNOb2RlcyA9IFtuZXh0Tm9kZV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhZGRTZXJpZXNUb0RpY3Qoc2VyaWVzTm9kZXMsIHNlcmllc0RpY3QsICtjbHVzdGVySWQsIG1ldGFncmFwaCwgZ3JhcGhPcHRpb25zKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIHNlcmllc0RpY3Q7CiAgICB9CiAgICAvKioKICAgICAqIEZvciBlYWNoIGNsdXN0ZXIgb2Ygb3Atbm9kZXMgYmFzZWQgb3AgdHlwZSwgdHJ5IHRvIGRldGVjdCBncm91cGluZ3MuCiAgICAgKiBJbmZlciBzZXJpZXMgbmFtZSB1c2luZyBieSB0cnlpbmcgdG8gZmluZCBhIHBhdHRlcm4gb2YgbnVtYmVycwogICAgICogYW55d2hlcmUgd2l0aGluIG5vZGUgbmFtZXMuCiAgICAgKgogICAgICogQHBhcmFtIGNsdXN0ZXJzIERpY3Rpb25hcnkgb3V0cHV0IGZyb20gY2x1c3Rlck5vZGVzKCkuCiAgICAgKiBAcGFyYW0gbWV0YWdyYXBoCiAgICAgKiBAcmV0dXJuIEEgZGljdGlvbmFyeSBmcm9tIHNlcmllcyBuYW1lID0+IHNlcmllc05vZGUKICAgICAqLwogICAgZnVuY3Rpb24gZGV0ZWN0U2VyaWVzQW55d2hlcmVJbk5vZGVOYW1lKGNsdXN0ZXJzLCBtZXRhZ3JhcGgsIGdyYXBoT3B0aW9ucykgewogICAgICAgIGxldCBzZXJpZXNEaWN0ID0ge307CiAgICAgICAgbG9kYXNoLmVhY2goY2x1c3RlcnMsIGZ1bmN0aW9uIChtZW1iZXJzLCBjbHVzdGVySWQpIHsKICAgICAgICAgICAgaWYgKG1lbWJlcnMubGVuZ3RoIDw9IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfSAvLyBpc29sYXRlZCBjbHVzdGVycyBjYW4ndCBtYWtlIHNlcmllcwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUge09iamVjdH0gIEEgZGljdGlvbmFyeSBtYXBwaW5nIGEgc2VyaWVzIG5hbWUgdG8gYSBTZXJpZXNOb2RlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGV0IGZvcndhcmREaWN0ID0ge307CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAdHlwZSB7T2JqZWN0fSAgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgbWVtYmVyIG5hbWUgdG8gYW4gYXJyYXkgb2Ygc2VyaWVzCiAgICAgICAgICAgICAqIG5hbWVzIHRoaXMgbWVtYmVyIGNvdWxkIHBvdGVudGlhbGx5IGJlIGdyb3VwZWQgdW5kZXIgYW5kIHRoZQogICAgICAgICAgICAgKiBjb3JyZXNwb25kaW5nIGlkcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGxldCByZXZlcnNlRGljdCA9IHt9OwogICAgICAgICAgICAvLyBHcm91cCBhbGwgbm9kZXMgdGhhdCBoYXZlIHRoZSBzYW1lIG5hbWUsIHdpdGggdGhlIGV4Y2VwdGlvbiBvZiBhCiAgICAgICAgICAgIC8vIG51bWJlciBhdCB0aGUgZW5kIG9mIHRoZSBuYW1lIGFmdGVyIGFuIHVuZGVyc2NvcmUsIHdoaWNoIGlzIGFsbG93ZWQgdG8KICAgICAgICAgICAgLy8gdmFyeS4KICAgICAgICAgICAgbG9kYXNoLmVhY2gobWVtYmVycywgZnVuY3Rpb24gKG5hbWUpIHsKICAgICAgICAgICAgICAgIGxldCBpc0dyb3VwID0gbmFtZS5jaGFyQXQobmFtZS5sZW5ndGggLSAxKSA9PT0gJyonOwogICAgICAgICAgICAgICAgbGV0IG5hbWVwYXRoID0gbmFtZS5zcGxpdCgnLycpOwogICAgICAgICAgICAgICAgbGV0IGxlYWYgPSBuYW1lcGF0aFtuYW1lcGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSBuYW1lcGF0aC5zbGljZSgwLCBuYW1lcGF0aC5sZW5ndGggLSAxKS5qb2luKCcvJyk7CiAgICAgICAgICAgICAgICBjb25zdCBudW1SZWdleCA9IC8oXGQrKS9nOwogICAgICAgICAgICAgICAgbGV0IG1hdGNoUmVzdWx0OwogICAgICAgICAgICAgICAgbGV0IHByZWZpeDsKICAgICAgICAgICAgICAgIGxldCBpZDsKICAgICAgICAgICAgICAgIGxldCBzdWZmaXg7CiAgICAgICAgICAgICAgICBsZXQgc2VyaWVzTmFtZTsKICAgICAgICAgICAgICAgIGxldCBtYXRjaGVkID0gMDsKICAgICAgICAgICAgICAgIC8vIFNjYW4gb3ZlciB0aGUgZW50aXJlIGxlYWYgbmFtZSBhbmQgbWF0Y2ggYW55IHBvc3NpYmxlIG51bWJlcnMsCiAgICAgICAgICAgICAgICAvLyBhbmQgcHV0IHRoZSByZXN1bHRzIGludG8gY29ycmVzcG9uZGluZyBkaWN0aW9uYXJpZXMuCiAgICAgICAgICAgICAgICB3aGlsZSAoKG1hdGNoUmVzdWx0ID0gbnVtUmVnZXguZXhlYyhsZWFmKSkpIHsKICAgICAgICAgICAgICAgICAgICArK21hdGNoZWQ7CiAgICAgICAgICAgICAgICAgICAgcHJlZml4ID0gbGVhZi5zbGljZSgwLCBtYXRjaFJlc3VsdC5pbmRleCk7CiAgICAgICAgICAgICAgICAgICAgaWQgPSBtYXRjaFJlc3VsdFswXTsKICAgICAgICAgICAgICAgICAgICBzdWZmaXggPSBsZWFmLnNsaWNlKG1hdGNoUmVzdWx0LmluZGV4ICsgbWF0Y2hSZXN1bHRbMF0ubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBzZXJpZXNOYW1lID0gZ2V0U2VyaWVzTm9kZU5hbWUocHJlZml4LCBzdWZmaXgsIHBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgZm9yd2FyZERpY3Rbc2VyaWVzTmFtZV0gPSBmb3J3YXJkRGljdFtzZXJpZXNOYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcndhcmREaWN0W3Nlcmllc05hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmREaWN0W3Nlcmllc05hbWVdID0gY3JlYXRlU2VyaWVzTm9kZShwcmVmaXgsIHN1ZmZpeCwgcGFyZW50LCAraWQsIG5hbWUsIGdyYXBoT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcndhcmREaWN0W3Nlcmllc05hbWVdLmlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgICAgICByZXZlcnNlRGljdFtuYW1lXSA9IHJldmVyc2VEaWN0W25hbWVdIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIHJldmVyc2VEaWN0W25hbWVdLnB1c2goW3Nlcmllc05hbWUsIGlkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZCA8IDEpIHsKICAgICAgICAgICAgICAgICAgICBwcmVmaXggPSBpc0dyb3VwID8gbGVhZi5zdWJzdHIoMCwgbGVhZi5sZW5ndGggLSAxKSA6IGxlYWY7CiAgICAgICAgICAgICAgICAgICAgaWQgPSAwOwogICAgICAgICAgICAgICAgICAgIHN1ZmZpeCA9IGlzR3JvdXAgPyAnKicgOiAnJzsKICAgICAgICAgICAgICAgICAgICBzZXJpZXNOYW1lID0gZ2V0U2VyaWVzTm9kZU5hbWUocHJlZml4LCBzdWZmaXgsIHBhcmVudCk7CiAgICAgICAgICAgICAgICAgICAgZm9yd2FyZERpY3Rbc2VyaWVzTmFtZV0gPSBmb3J3YXJkRGljdFtzZXJpZXNOYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIWZvcndhcmREaWN0W3Nlcmllc05hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmREaWN0W3Nlcmllc05hbWVdID0gY3JlYXRlU2VyaWVzTm9kZShwcmVmaXgsIHN1ZmZpeCwgcGFyZW50LCAraWQsIG5hbWUsIGdyYXBoT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvcndhcmREaWN0W3Nlcmllc05hbWVdLmlkcy5wdXNoKGlkKTsKICAgICAgICAgICAgICAgICAgICByZXZlcnNlRGljdFtuYW1lXSA9IHJldmVyc2VEaWN0W25hbWVdIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIHJldmVyc2VEaWN0W25hbWVdLnB1c2goW3Nlcmllc05hbWUsIGlkXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvKiogQHR5cGUge09iamVjdH0gIEEgZGljdGlvbmFyeSBtYXBwaW5nIHNlcmllc05hbWUgdG8gc2VyaWVzSW5mb0FycmF5LAogICAgICAgICAgICAgKiB3aGljaCBpcyBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIG9iamVjdHMgd2l0aCBuYW1lLCBpZCwgcHJlZml4LCBzdWZmaXgsCiAgICAgICAgICAgICAqIGFuZCBwYXJlbnQgcHJvcGVydGllcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhciBjYW5kaWRhdGVzRGljdCA9IHt9OwogICAgICAgICAgICAvLyBGb3IgZWFjaCBvZiB0aGUgbWVtYmVyLCBwdXQgaXQgaW50byB0aGUgbWF4aW11bSBwb3NzaWJsZSBzZXJpZXMsCiAgICAgICAgICAgIC8vIGFuZCBjcmVhdGUgY2FuZGlkYXRlc0RpY3QgYWNjb3JkaW5nbHkuCiAgICAgICAgICAgIGxvZGFzaC5lYWNoKHJldmVyc2VEaWN0LCBmdW5jdGlvbiAoc2VyaWVzTmFtZUlkQXJyYXksIG5hbWUpIHsKICAgICAgICAgICAgICAgIHNlcmllc05hbWVJZEFycmF5LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9yd2FyZERpY3RbYlswXV0uaWRzLmxlbmd0aCAtIGZvcndhcmREaWN0W2FbMF1dLmlkcy5sZW5ndGg7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHZhciBzZXJpZXNOYW1lID0gc2VyaWVzTmFtZUlkQXJyYXlbMF1bMF07CiAgICAgICAgICAgICAgICB2YXIgaWQgPSBzZXJpZXNOYW1lSWRBcnJheVswXVsxXTsKICAgICAgICAgICAgICAgIGNhbmRpZGF0ZXNEaWN0W3Nlcmllc05hbWVdID0gY2FuZGlkYXRlc0RpY3Rbc2VyaWVzTmFtZV0gfHwgW107CiAgICAgICAgICAgICAgICBjb25zdCBuYW1lcGF0aCA9IG5hbWUuc3BsaXQoJy8nKTsKICAgICAgICAgICAgICAgIGNvbnN0IGxlYWYgPSBuYW1lcGF0aFtuYW1lcGF0aC5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IG5hbWVwYXRoLnNsaWNlKDAsIG5hbWVwYXRoLmxlbmd0aCAtIDEpLmpvaW4oJy8nKTsKICAgICAgICAgICAgICAgIHZhciBzZXJpZXNOb2RlID0gY3JlYXRlU2VyaWVzTm9kZShmb3J3YXJkRGljdFtzZXJpZXNOYW1lXS5wcmVmaXgsIGZvcndhcmREaWN0W3Nlcmllc05hbWVdLnN1ZmZpeCwgcGFyZW50LCAraWQsIG5hbWUsIGdyYXBoT3B0aW9ucyk7CiAgICAgICAgICAgICAgICBjYW5kaWRhdGVzRGljdFtzZXJpZXNOYW1lXS5wdXNoKHNlcmllc05vZGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gSW4gZWFjaCBncm91cCBvZiBub2RlcywgZ3JvdXAgbm9kZXMgaW4gYnVuY2hlcyB0aGF0IGhhdmUgbW9ub3RvbmljYWxseQogICAgICAgICAgICAvLyBpbmNyZWFzaW5nIG51bWJlcnMgaW4gdGhlaXIgbmFtZXMuICBFYWNoIG9mIHRoZXNlIGJ1bmNoZXMgaXMgYSBzZXJpZXMuCiAgICAgICAgICAgIGxvZGFzaC5lYWNoKGNhbmRpZGF0ZXNEaWN0LCBmdW5jdGlvbiAoc2VyaWVzSW5mb0FycmF5LCBzZXJpZXNOYW1lKSB7CiAgICAgICAgICAgICAgICBpZiAoc2VyaWVzSW5mb0FycmF5Lmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXJpZXNJbmZvQXJyYXkuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiArYS5jbHVzdGVySWQgLSArYi5jbHVzdGVySWQ7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIExvb3AgdGhyb3VnaCB0aGUgbm9kZXMgc29ydGVkIGJ5IGl0cyBkZXRlY3RlZCBzZXJpZXMgbnVtYmVyLCBncm91cGluZwogICAgICAgICAgICAgICAgLy8gYWxsIG5vZGVzIHdpdGggbW9ub3RvbmljYWxseS1pbmNyZWFzaW5nIHNlcmllcyBudW1iZXJzLgogICAgICAgICAgICAgICAgbGV0IHNlcmllc05vZGVzID0gW3Nlcmllc0luZm9BcnJheVswXV07CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDE7IGluZGV4IDwgc2VyaWVzSW5mb0FycmF5Lmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgICAgIGxldCBuZXh0Tm9kZSA9IHNlcmllc0luZm9BcnJheVtpbmRleF07CiAgICAgICAgICAgICAgICAgICAgaWYgKG5leHROb2RlLmNsdXN0ZXJJZCA9PT0KICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWVzTm9kZXNbc2VyaWVzTm9kZXMubGVuZ3RoIC0gMV0uY2x1c3RlcklkICsgMSkgewogICAgICAgICAgICAgICAgICAgICAgICBzZXJpZXNOb2Rlcy5wdXNoKG5leHROb2RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZFNlcmllc1RvRGljdChzZXJpZXNOb2Rlcywgc2VyaWVzRGljdCwgK2NsdXN0ZXJJZCwgbWV0YWdyYXBoLCBncmFwaE9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIHNlcmllc05vZGVzID0gW25leHROb2RlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFkZFNlcmllc1RvRGljdChzZXJpZXNOb2Rlcywgc2VyaWVzRGljdCwgK2NsdXN0ZXJJZCwgbWV0YWdyYXBoLCBncmFwaE9wdGlvbnMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gc2VyaWVzRGljdDsKICAgIH0KICAgIC8qKgogICAgICogQWRkIGEgc2VyaWVzIHRvIHRoZSBwcm92aWRlZCBkaWN0aW9uYXJ5IG1hcHBpbmcgc2VyaWVzIG5hbWVzIHRvIHNlcmllcy4KICAgICAqCiAgICAgKiBAcGFyYW0gc2VyaWVzTm9kZXMgdGhlIG5vZGVzIGluIHRoZSBzZXJpZXMuIENvbnRhaW5zCiAgICAgKiAgICAgbmFtZSwgaWQsIHByZWZpeCwgc3VmZml4IGFuZCBwYXJlbnQgcHJvcGVydGllcyBvZiB0aGUgbm9kZS4KICAgICAqIEBwYXJhbSBzZXJpZXNEaWN0IHRoZSBkaWN0aW9uYXJ5IG9mIHNlcmllcwogICAgICogQHBhcmFtIGNsdXN0ZXJJZCBJRCBvZiB0aGUgdGVtcGxhdGUgb2YgdGhlIG5vZGVzIG9mIHRoZSBzZXJpZXMKICAgICAqIEBwYXJhbSBtZXRhZ3JhcGgKICAgICAqIEBwYXJhbSBncmFwaE9wdGlvbnMKICAgICAqLwogICAgZnVuY3Rpb24gYWRkU2VyaWVzVG9EaWN0KHNlcmllc05vZGVzLCBzZXJpZXNEaWN0LCBjbHVzdGVySWQsIG1ldGFncmFwaCwgZ3JhcGhPcHRpb25zKSB7CiAgICAgICAgaWYgKHNlcmllc05vZGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgbGV0IGN1clNlcmllc05hbWUgPSBnZXRTZXJpZXNOb2RlTmFtZShzZXJpZXNOb2Rlc1swXS5wcmVmaXgsIHNlcmllc05vZGVzWzBdLnN1ZmZpeCwgc2VyaWVzTm9kZXNbMF0ucGFyZW50LCBzZXJpZXNOb2Rlc1swXS5jbHVzdGVySWQsIHNlcmllc05vZGVzW3Nlcmllc05vZGVzLmxlbmd0aCAtIDFdLmNsdXN0ZXJJZCk7CiAgICAgICAgICAgIGxldCBjdXJTZXJpZXNOb2RlID0gY3JlYXRlU2VyaWVzTm9kZShzZXJpZXNOb2Rlc1swXS5wcmVmaXgsIHNlcmllc05vZGVzWzBdLnN1ZmZpeCwgc2VyaWVzTm9kZXNbMF0ucGFyZW50LCBjbHVzdGVySWQsIGN1clNlcmllc05hbWUsIGdyYXBoT3B0aW9ucyk7CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKHNlcmllc05vZGVzLCBmdW5jdGlvbiAobm9kZSkgewogICAgICAgICAgICAgICAgY3VyU2VyaWVzTm9kZS5pZHMucHVzaChub2RlLmNsdXN0ZXJJZCk7CiAgICAgICAgICAgICAgICBjdXJTZXJpZXNOb2RlLm1ldGFncmFwaC5zZXROb2RlKG5vZGUubmFtZSwgbWV0YWdyYXBoLm5vZGUobm9kZS5uYW1lKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzZXJpZXNEaWN0W2N1clNlcmllc05hbWVdID0gY3VyU2VyaWVzTm9kZTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZHcmFwaE9wQ29tcGF0Q2FyZCA9IGNsYXNzIFRmR3JhcGhPcENvbXBhdENhcmQgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9vcENvbXBhdENvbG9yID0gT3BOb2RlQ29sb3JzLkNPTVBBVElCTEU7CiAgICAgICAgICAgIHRoaXMuX29wSW5jb21wYXRDb2xvciA9IE9wTm9kZUNvbG9ycy5JTkNPTVBBVElCTEU7CiAgICAgICAgfQogICAgICAgIGdldCBfdGVtcGxhdGVJbmRleCgpIHsKICAgICAgICAgICAgdmFyIGdyYXBoSGllcmFyY2h5ID0gdGhpcy5ncmFwaEhpZXJhcmNoeTsKICAgICAgICAgICAgcmV0dXJuIGdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKTsKICAgICAgICB9CiAgICAgICAgX2dldE5vZGUobm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KSB7CiAgICAgICAgICAgIHJldHVybiBncmFwaEhpZXJhcmNoeS5ub2RlKG5vZGVOYW1lKTsKICAgICAgICB9CiAgICAgICAgX2dldFJlbmRlckluZm8obm9kZU5hbWUsIHJlbmRlckhpZXJhcmNoeSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0T3JDcmVhdGVSZW5kZXJOb2RlQnlOYW1lKG5vZGVOYW1lKTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUV4cGFuZGVkKCkgewogICAgICAgICAgICB0aGlzLl9leHBhbmRlZCA9ICF0aGlzLl9leHBhbmRlZDsKICAgICAgICB9CiAgICAgICAgX2dldFRvZ2dsZUljb24oZXhwYW5kZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGV4cGFuZGVkID8gJ2V4cGFuZC1sZXNzJyA6ICdleHBhbmQtbW9yZSc7CiAgICAgICAgfQogICAgICAgIF9yZXNpemVMaXN0KHNlbGVjdG9yKSB7CiAgICAgICAgICAgIHZhciBsaXN0ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihzZWxlY3Rvcik7CiAgICAgICAgICAgIGlmIChsaXN0KSB7CiAgICAgICAgICAgICAgICBsaXN0LmZpcmUoJ2lyb24tcmVzaXplJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZ2V0IF9pbmNvbXBhdGlibGVPcE5vZGVzKCkgewogICAgICAgICAgICB2YXIgZ3JhcGhIaWVyYXJjaHkgPSB0aGlzLmdyYXBoSGllcmFyY2h5OwogICAgICAgICAgICB2YXIgaGllcmFyY2h5UGFyYW1zID0gdGhpcy5oaWVyYXJjaHlQYXJhbXM7CiAgICAgICAgICAgIGlmIChncmFwaEhpZXJhcmNoeSAmJiBncmFwaEhpZXJhcmNoeS5yb290KSB7CiAgICAgICAgICAgICAgICB0aGlzLmFzeW5jKHRoaXMuX3Jlc2l6ZUxpc3QuYmluZCh0aGlzLCAnI2luY29tcGF0aWJsZU9wc0xpc3QnKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0SW5jb21wYXRpYmxlT3BzKGdyYXBoSGllcmFyY2h5LCBoaWVyYXJjaHlQYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGdldCBfb3BDb21wYXRTY29yZSgpIHsKICAgICAgICAgICAgdmFyIGdyYXBoSGllcmFyY2h5ID0gdGhpcy5ncmFwaEhpZXJhcmNoeTsKICAgICAgICAgICAgaWYgKGdyYXBoSGllcmFyY2h5ICYmIGdyYXBoSGllcmFyY2h5LnJvb3QpIHsKICAgICAgICAgICAgICAgIHZhciByb290ID0gZ3JhcGhIaWVyYXJjaHkucm9vdDsKICAgICAgICAgICAgICAgIHZhciBudW1Db21wYXQgPSByb290LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uY29tcGF0aWJsZTsKICAgICAgICAgICAgICAgIHZhciBudW1JbmNvbXBhdCA9IHJvb3QuY29tcGF0aWJpbGl0eUhpc3RvZ3JhbS5pbmNvbXBhdGlibGU7CiAgICAgICAgICAgICAgICBpZiAobnVtQ29tcGF0ID09IDAgJiYgbnVtSW5jb21wYXQgPT0gMCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIHZhciBudW1Ub3RhbCA9IG51bUNvbXBhdCArIG51bUluY29tcGF0OwogICAgICAgICAgICAgICAgLy8gUm91bmQgdGhlIHJhdGlvIHRvd2FyZHMgbmVnYXRpdmUgaW5maW5pdHkuCiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5mbG9vcigoMTAwICogbnVtQ29tcGF0KSAvIG51bVRvdGFsKSAvIDEwMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9vcENvbXBhdFNjb3JlTGFiZWwoKSB7CiAgICAgICAgICAgIHZhciBvcENvbXBhdFNjb3JlID0gdGhpcy5fb3BDb21wYXRTY29yZTsKICAgICAgICAgICAgcmV0dXJuIGZvcm1hdCgnLjAlJykob3BDb21wYXRTY29yZSk7CiAgICAgICAgfQogICAgICAgIGdldCBfdG90YWxJbmNvbXBhdE9wcygpIHsKICAgICAgICAgICAgdmFyIGdyYXBoSGllcmFyY2h5ID0gdGhpcy5ncmFwaEhpZXJhcmNoeTsKICAgICAgICAgICAgaWYgKGdyYXBoSGllcmFyY2h5ICYmIGdyYXBoSGllcmFyY2h5LnJvb3QpIHsKICAgICAgICAgICAgICAgIHJldHVybiBncmFwaEhpZXJhcmNoeS5yb290LmNvbXBhdGliaWxpdHlIaXN0b2dyYW0uaW5jb21wYXRpYmxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgIH07CiAgICBUZkdyYXBoT3BDb21wYXRDYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXgtaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgLmluY29tcGF0aWJsZS1vcHMtbGlzdCB7CiAgICAgICAgaGVpZ2h0OiAzNTBweDsKICAgICAgICBtYXgtaGVpZ2h0OiA0MDBweDsKICAgICAgICBvdmVyZmxvdy15OiBzY3JvbGw7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICB9CgogICAgICBpcm9uLWxpc3QgewogICAgICAgIGZsZXg6IDEgMSBhdXRvOwogICAgICB9CgogICAgICBwYXBlci1pdGVtIHsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGJhY2tncm91bmQ6ICNlOWU5ZTk7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0tYm9keVt0d28tbGluZV0gewogICAgICAgIG1pbi1oZWlnaHQ6IDA7CiAgICAgICAgcGFkZGluZzogOHB4IDEycHggNHB4OwogICAgICB9CgogICAgICAuZXhwYW5kZWRJbmZvIHsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweDsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5zdWJ0aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxMnB0OwogICAgICAgIGNvbG9yOiAjNWU1ZTVlOwogICAgICB9CgogICAgICAudG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC5ub24tY29udHJvbC1saXN0LWl0ZW0gewogICAgICAgIHBhZGRpbmctbGVmdDogMTBweDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC1kaXNwbGF5IHsKICAgICAgICBtYXJnaW4tdG9wOiAxMHB4OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgfQoKICAgICAgc3ZnLm9wLWNvbXBhdCB7CiAgICAgICAgd2lkdGg6IDI1MHB4OwogICAgICAgIGhlaWdodDogMjVweDsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQoKICAgICAgZGl2Lm9wLWNvbXBhdC12YWx1ZSB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgY29sb3I6IGJsYWNrOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxwYXBlci1pdGVtPgogICAgICA8cGFwZXItaXRlbS1ib2R5IHR3by1saW5lPgogICAgICAgIDxkaXY+CiAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgaWNvbj0ie3tfZ2V0VG9nZ2xlSWNvbihfZXhwYW5kZWQpfX0iCiAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtYnV0dG9uIgogICAgICAgICAgPgogICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vZGUtbmFtZSIgaWQ9Im5vZGV0aXRsZSI+W1tub2RlVGl0bGVdXTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc2Vjb25kYXJ5PgogICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcC1jb21wYXQtZGlzcGxheSI+CiAgICAgICAgICAgICAgPHN2ZwogICAgICAgICAgICAgICAgY2xhc3M9Im9wLWNvbXBhdCIKICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMjUwIDI1IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxkZWZzPgogICAgICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQgaWQ9Im9wLWNvbXBhdC1maWxsIj4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjAiIHN0b3AtY29sb3IkPSJbW19vcENvbXBhdENvbG9yXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcAogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0JD0iW1tfb3BDb21wYXRTY29yZV1dIgogICAgICAgICAgICAgICAgICAgICAgc3RvcC1jb2xvciQ9IltbX29wQ29tcGF0Q29sb3JdXSIKICAgICAgICAgICAgICAgICAgICA+PC9zdG9wPgogICAgICAgICAgICAgICAgICAgIDxzdG9wCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQkPSJbW19vcENvbXBhdFNjb3JlXV0iCiAgICAgICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfb3BJbmNvbXBhdENvbG9yXV0iCiAgICAgICAgICAgICAgICAgICAgPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgICA8c3RvcCBvZmZzZXQ9IjEiIHN0b3AtY29sb3IkPSJbW19vcEluY29tcGF0Q29sb3IgXV0iPjwvc3RvcD4KICAgICAgICAgICAgICAgICAgPC9saW5lYXJHcmFkaWVudD4KICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgIDxyZWN0CiAgICAgICAgICAgICAgICAgIGhlaWdodD0iMjUiCiAgICAgICAgICAgICAgICAgIHdpZHRoPSIyNTAiCiAgICAgICAgICAgICAgICAgIHJ4PSI1IgogICAgICAgICAgICAgICAgICByeT0iNSIKICAgICAgICAgICAgICAgICAgc3R5bGU9ImZpbGw6IHVybCgnI29wLWNvbXBhdC1maWxsJyk7IgogICAgICAgICAgICAgICAgPjwvcmVjdD4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJvcC1jb21wYXQtdmFsdWUiPltbX29wQ29tcGF0U2NvcmVMYWJlbF1dPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvcGFwZXItaXRlbS1ib2R5PgogICAgPC9wYXBlci1pdGVtPgoKICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIEluY29tcGF0aWJsZSBPcGVyYXRpb25zOiAoPHNwYW4+W1tfdG90YWxJbmNvbXBhdE9wc11dPC9zcGFuPikKICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgY2xhc3M9ImluY29tcGF0aWJsZS1vcHMtbGlzdCIKICAgICAgICAgICAgaWQ9ImluY29tcGF0aWJsZU9wc0xpc3QiCiAgICAgICAgICAgIGl0ZW1zPSJbW19pbmNvbXBhdGlibGVPcE5vZGVzXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbQogICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgIGl0ZW0tbm9kZT0iW1tpdGVtXV0iCiAgICAgICAgICAgICAgICBpdGVtLXJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGl0ZW0ubmFtZSwgcmVuZGVySGllcmFyY2h5KV1dIgogICAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtLm5hbWVdXSIKICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICBpdGVtLXR5cGU9ImluY29tcGF0aWJsZS1vcHMiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIDwvdGYtZ3JhcGgtb3AtY29tcGF0LWxpc3QtaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9pcm9uLWNvbGxhcHNlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQucHJvdG90eXBlLCAiZ3JhcGhIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoT3BDb21wYXRDYXJkLnByb3RvdHlwZSwgImhpZXJhcmNoeVBhcmFtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQucHJvdG90eXBlLCAicmVuZGVySGllcmFyY2h5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaE9wQ29tcGF0Q2FyZC5wcm90b3R5cGUsICJub2RlVGl0bGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQucHJvdG90eXBlLCAiX2V4cGFuZGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaE9wQ29tcGF0Q2FyZC5wcm90b3R5cGUsICJfb3BDb21wYXRDb2xvciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQucHJvdG90eXBlLCAiX29wSW5jb21wYXRDb2xvciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnZ3JhcGhIaWVyYXJjaHknKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQucHJvdG90eXBlLCAiX3RlbXBsYXRlSW5kZXgiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdncmFwaEhpZXJhcmNoeScsICdoaWVyYXJjaHlQYXJhbXMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQucHJvdG90eXBlLCAiX2luY29tcGF0aWJsZU9wTm9kZXMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdncmFwaEhpZXJhcmNoeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZHcmFwaE9wQ29tcGF0Q2FyZC5wcm90b3R5cGUsICJfb3BDb21wYXRTY29yZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19vcENvbXBhdFNjb3JlJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoT3BDb21wYXRDYXJkLnByb3RvdHlwZSwgIl9vcENvbXBhdFNjb3JlTGFiZWwiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdncmFwaEhpZXJhcmNoeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZHcmFwaE9wQ29tcGF0Q2FyZC5wcm90b3R5cGUsICJfdG90YWxJbmNvbXBhdE9wcyIsIG51bGwpOwogICAgVGZHcmFwaE9wQ29tcGF0Q2FyZCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWdyYXBoLW9wLWNvbXBhdC1jYXJkJykKICAgIF0sIFRmR3JhcGhPcENvbXBhdENhcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmTm9kZUxpc3RJdGVtID0gY2xhc3MgVGZOb2RlTGlzdEl0ZW0gZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBfaXRlbVR5cGVDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAodGhpcy5pdGVtVHlwZSAhPT0gJ3N1Ym5vZGUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLiRbJ2xpc3QtaXRlbSddLmNsYXNzTGlzdC5hZGQoJ2NsaWNrYWJsZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy4kWydsaXN0LWl0ZW0nXS5jbGFzc0xpc3QucmVtb3ZlKCdjbGlja2FibGUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfbm9kZUxpc3RlbmVyKGV2ZW50KSB7CiAgICAgICAgICAgIC8vIGZpcmUgbm9kZS5jbGljay9tb3VzZW92ZXIvbW91c2VvdXQKICAgICAgICAgICAgdGhpcy5maXJlKCdub2RlLWxpc3QtaXRlbS0nICsgZXZlbnQudHlwZSwgewogICAgICAgICAgICAgICAgY2FyZE5vZGU6IHRoaXMuY2FyZE5vZGUubmFtZSwKICAgICAgICAgICAgICAgIG5vZGVOYW1lOiB0aGlzLm5hbWUsCiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLml0ZW1UeXBlLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2ZhZGVkQ2xhc3MoaXRlbVJlbmRlckluZm8pIHsKICAgICAgICAgICAgcmV0dXJuIGl0ZW1SZW5kZXJJbmZvICYmIGl0ZW1SZW5kZXJJbmZvLmlzRmFkZWRPdXQgPyAnZmFkZWQnIDogJyc7CiAgICAgICAgfQogICAgfTsKICAgIFRmTm9kZUxpc3RJdGVtLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8c3R5bGU+CiAgICAgICNsaXN0LWl0ZW0gewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGNvbG9yOiAjNTY1NjU2OwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgICNsaXN0LWl0ZW06aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLmNsaWNrYWJsZSB7CiAgICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4gewogICAgICAgIG1hcmdpbi1sZWZ0OiA0MHB4OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtLmV4Y2x1ZGVkIHNwYW4gewogICAgICAgIGNvbG9yOiAjOTk5OwogICAgICB9CgogICAgICAjbGlzdC1pdGVtIHNwYW4uZWRnZS1sYWJlbCB7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW4tbGVmdDogM3B4OwogICAgICAgIG1hcmdpbi1yaWdodDogNXB4OwogICAgICB9CgogICAgICAubm9kZS1pY29uIHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAxcHg7CiAgICAgICAgbGVmdDogMnB4OwogICAgICB9CgogICAgICAuZmFkZWQgc3BhbiB7CiAgICAgICAgY29sb3I6IHZhcigtLXRiLWdyYXBoLWZhZGVkKTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxkaXYKICAgICAgaWQ9Imxpc3QtaXRlbSIKICAgICAgb24tbW91c2VvdmVyPSJfbm9kZUxpc3RlbmVyIgogICAgICBvbi1tb3VzZW91dD0iX25vZGVMaXN0ZW5lciIKICAgICAgb24tY2xpY2s9Il9ub2RlTGlzdGVuZXIiCiAgICA+CiAgICAgIDxkaXYgY2xhc3MkPSJ7e19mYWRlZENsYXNzKGl0ZW1SZW5kZXJJbmZvKX19Ij4KICAgICAgICA8dGYtbm9kZS1pY29uCiAgICAgICAgICBjbGFzcz0ibm9kZS1pY29uIgogICAgICAgICAgaGVpZ2h0PSIxMiIKICAgICAgICAgIGNvbG9yLWJ5PSJbW2NvbG9yQnldXSIKICAgICAgICAgIGNvbG9yLWJ5LXBhcmFtcz0iW1tjb2xvckJ5UGFyYW1zXV0iCiAgICAgICAgICBub2RlPSJbW2l0ZW1Ob2RlXV0iCiAgICAgICAgICByZW5kZXItaW5mbz0iW1tpdGVtUmVuZGVySW5mb11dIgogICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbdGVtcGxhdGVJbmRleF1dIgogICAgICAgID48L3RmLW5vZGUtaWNvbj4KICAgICAgICA8c3BhbiB0aXRsZSQ9IltbbmFtZV1dIj5bW25hbWVdXTwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iZWRnZS1sYWJlbCI+W1tlZGdlTGFiZWxdXTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVMaXN0SXRlbS5wcm90b3R5cGUsICJjYXJkTm9kZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmTm9kZUxpc3RJdGVtLnByb3RvdHlwZSwgIml0ZW1Ob2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZOb2RlTGlzdEl0ZW0ucHJvdG90eXBlLCAiZWRnZUxhYmVsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZOb2RlTGlzdEl0ZW0ucHJvdG90eXBlLCAiaXRlbVJlbmRlckluZm8iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk5vZGVMaXN0SXRlbS5wcm90b3R5cGUsICJuYW1lIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBvYnNlcnZlcjogJ19pdGVtVHlwZUNoYW5nZWQnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZOb2RlTGlzdEl0ZW0ucHJvdG90eXBlLCAiaXRlbVR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk5vZGVMaXN0SXRlbS5wcm90b3R5cGUsICJjb2xvckJ5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZOb2RlTGlzdEl0ZW0ucHJvdG90eXBlLCAiY29sb3JCeVBhcmFtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmTm9kZUxpc3RJdGVtLnByb3RvdHlwZSwgInRlbXBsYXRlSW5kZXgiLCB2b2lkIDApOwogICAgVGZOb2RlTGlzdEl0ZW0gPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ub2RlLWxpc3QtaXRlbScpCiAgICBdLCBUZk5vZGVMaXN0SXRlbSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZOb2RlSW5mbyA9IGNsYXNzIFRmTm9kZUluZm8gZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9vcGVuZWRDb250cm9sUHJlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9vcGVuZWRDb250cm9sU3VjYyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBleHBhbmROb2RlKCkgewogICAgICAgICAgICB0aGlzLmZpcmUoJ19ub2RlLmV4cGFuZCcsIHRoaXMubm9kZSk7CiAgICAgICAgfQogICAgICAgIGdldCBfdGVtcGxhdGVJbmRleCgpIHsKICAgICAgICAgICAgdmFyIGdyYXBoSGllcmFyY2h5ID0gdGhpcy5ncmFwaEhpZXJhcmNoeTsKICAgICAgICAgICAgcmV0dXJuIGdyYXBoSGllcmFyY2h5LmdldFRlbXBsYXRlSW5kZXgoKTsKICAgICAgICB9CiAgICAgICAgX2dldE5vZGUoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpIHsKICAgICAgICAgICAgcmV0dXJuIGdyYXBoSGllcmFyY2h5Lm5vZGUoZ3JhcGhOb2RlTmFtZSk7CiAgICAgICAgfQogICAgICAgIF9nZXROb2RlU3RhdHMoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpIHsKICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9nZXROb2RlKGdyYXBoTm9kZU5hbWUsIGdyYXBoSGllcmFyY2h5KTsKICAgICAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBub2RlLnN0YXRzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBfZ2V0VG90YWxNaWNyb3Moc3RhdHMpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRzID8gc3RhdHMuZ2V0VG90YWxNaWNyb3MoKSA6IDA7CiAgICAgICAgfQogICAgICAgIGdldCBfaGFzRGlzcGxheWFibGVOb2RlU3RhdHMoKSB7CiAgICAgICAgICAgIHZhciBzdGF0cyA9IHRoaXMuX25vZGVTdGF0czsKICAgICAgICAgICAgcmV0dXJuIGhhc0Rpc3BsYXlhYmxlTm9kZVN0YXRzKHN0YXRzKTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlcygpIHsKICAgICAgICAgICAgdmFyIHN0YXRzID0gdGhpcy5fbm9kZVN0YXRzOwogICAgICAgICAgICBpZiAoIXN0YXRzIHx8ICFzdGF0cy50b3RhbEJ5dGVzKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShzdGF0cy50b3RhbEJ5dGVzLCBNRU1PUllfVU5JVFMpOwogICAgICAgIH0KICAgICAgICBnZXQgX25vZGVTdGF0c0Zvcm1hdHRlZENvbXB1dGVUaW1lKCkgewogICAgICAgICAgICB2YXIgc3RhdHMgPSB0aGlzLl9ub2RlU3RhdHM7CiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLmdldFRvdGFsTWljcm9zKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKHN0YXRzLmdldFRvdGFsTWljcm9zKCksIFRJTUVfVU5JVFMpOwogICAgICAgIH0KICAgICAgICBnZXQgX25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzKCkgewogICAgICAgICAgICB2YXIgc3RhdHMgPSB0aGlzLl9ub2RlU3RhdHM7CiAgICAgICAgICAgIGlmICghc3RhdHMgfHwgIXN0YXRzLm91dHB1dFNpemUgfHwgIXN0YXRzLm91dHB1dFNpemUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxvZGFzaC5tYXAoc3RhdHMub3V0cHV0U2l6ZSwgZnVuY3Rpb24gKHNoYXBlKSB7CiAgICAgICAgICAgICAgICBpZiAoc2hhcGUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdzY2FsYXInOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICdbJyArIHNoYXBlLmpvaW4oJywgJykgKyAnXSc7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfZ2V0UmVuZGVySW5mbyhncmFwaE5vZGVOYW1lLCByZW5kZXJIaWVyYXJjaHkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE9yQ3JlYXRlUmVuZGVyTm9kZUJ5TmFtZShncmFwaE5vZGVOYW1lKTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9hdHRyaWJ1dGVzKCkgewogICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX25vZGU7CiAgICAgICAgICAgIHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsICcjYXR0cmlidXRlc0xpc3QnKSk7CiAgICAgICAgICAgIGlmICghbm9kZSB8fCAhbm9kZS5hdHRyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGF0dHJzID0gW107CiAgICAgICAgICAgIGxvZGFzaC5lYWNoKG5vZGUuYXR0ciwgZnVuY3Rpb24gKGVudHJ5KSB7CiAgICAgICAgICAgICAgICAvLyBVbnBhY2sgdGhlICJ0b28gbGFyZ2UiIGF0dHJpYnV0ZXMgaW50byBzZXBhcmF0ZSBhdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICAvLyBpbiB0aGUgaW5mbyBjYXJkLCB3aXRoIHZhbHVlcyAidG9vIGxhcmdlIHRvIHNob3ciLgogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmtleSA9PT0gTEFSR0VfQVRUUlNfS0VZKSB7CiAgICAgICAgICAgICAgICAgICAgYXR0cnMgPSBhdHRycy5jb25jYXQoZW50cnkudmFsdWUubGlzdC5zLm1hcChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGtleToga2V5LCB2YWx1ZTogJ1RvbyBsYXJnZSB0byBzaG93Li4uJyB9OwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGF0dHJzLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBrZXk6IGVudHJ5LmtleSwKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IEpTT04uc3RyaW5naWZ5KGVudHJ5LnZhbHVlKSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBhdHRyczsKICAgICAgICB9CiAgICAgICAgZ2V0IF9kZXZpY2UoKSB7CiAgICAgICAgICAgIHZhciBub2RlID0gdGhpcy5fbm9kZTsKICAgICAgICAgICAgcmV0dXJuIG5vZGUgPyBub2RlLmRldmljZSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGdldCBfc3VjY2Vzc29ycygpIHsKICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLl9ub2RlOwogICAgICAgICAgICB2YXIgaGllcmFyY2h5ID0gdGhpcy5ncmFwaEhpZXJhcmNoeTsKICAgICAgICAgICAgdGhpcy5fcmVmcmVzaE5vZGVJdGVtTGlzdCgnaW5wdXRzTGlzdCcpOwogICAgICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IHJlZ3VsYXI6IFtdLCBjb250cm9sOiBbXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChoaWVyYXJjaHkuZ2V0U3VjY2Vzc29ycyhub2RlLm5hbWUpLCBmYWxzZSwgbm9kZS5pc0dyb3VwTm9kZSk7CiAgICAgICAgfQogICAgICAgIGdldCBfcHJlZGVjZXNzb3JzKCkgewogICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX25vZGU7CiAgICAgICAgICAgIHZhciBoaWVyYXJjaHkgPSB0aGlzLmdyYXBoSGllcmFyY2h5OwogICAgICAgICAgICB0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCdvdXRwdXRzTGlzdCcpOwogICAgICAgICAgICBpZiAoIW5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IHJlZ3VsYXI6IFtdLCBjb250cm9sOiBbXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb252ZXJ0RWRnZUxpc3RUb0VkZ2VJbmZvTGlzdChoaWVyYXJjaHkuZ2V0UHJlZGVjZXNzb3JzKG5vZGUubmFtZSksIHRydWUsIG5vZGUuaXNHcm91cE5vZGUpOwogICAgICAgIH0KICAgICAgICAvLyBPbmx5IHJlbGV2YW50IGlmIHRoaXMgaXMgYSBsaWJyYXJ5IGZ1bmN0aW9uLiBBIGxpc3Qgb2Ygbm9kZXMgdGhhdAogICAgICAgIC8vIHJlcHJlc2VudCB3aGVyZSB0aGUgZnVuY3Rpb24gaXMgdXNlZC4KICAgICAgICBnZXQgX2Z1bmN0aW9uVXNhZ2VzKCkgewogICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX25vZGU7CiAgICAgICAgICAgIHZhciBoaWVyYXJjaHkgPSB0aGlzLmdyYXBoSGllcmFyY2h5OwogICAgICAgICAgICB0aGlzLl9yZWZyZXNoTm9kZUl0ZW1MaXN0KCdmdW5jdGlvblVzYWdlc0xpc3QnKTsKICAgICAgICAgICAgaWYgKCFub2RlIHx8IG5vZGUudHlwZSAhPT0gTm9kZVR5cGUuTUVUQSkgewogICAgICAgICAgICAgICAgLy8gRnVuY3Rpb25zIG11c3QgYmUgcmVwcmVzZW50ZWQgYnkgbWV0YW5vZGVzLgogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGxpYnJhcnlGdW5jdGlvbkRhdGEgPSBoaWVyYXJjaHkubGlicmFyeUZ1bmN0aW9uc1tub2RlLmFzc29jaWF0ZWRGdW5jdGlvbl07CiAgICAgICAgICAgIGlmICghbGlicmFyeUZ1bmN0aW9uRGF0YSkgewogICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBubyBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXR1cm4gd2hlcmUgdGhlIGZ1bmN0aW9uIGlzIHVzZWQuCiAgICAgICAgICAgIHJldHVybiBsaWJyYXJ5RnVuY3Rpb25EYXRhLnVzYWdlczsKICAgICAgICB9CiAgICAgICAgLy8gVGhlIGlyb24gbGlzdHMgdGhhdCBlbnVtZXJhdGUgb3BzIG11c3QgYmUgYXN5bmNocm9ub3VzbHkgdXBkYXRlZCB3aGVuCiAgICAgICAgLy8gdGhlIGRhdGEgdGhleSByZW5kZXIgY2hhbmdlcy4gVGhpcyBmdW5jdGlvbiB0cmlnZ2VycyB0aGF0IHVwZGF0ZS4KICAgICAgICBfcmVmcmVzaE5vZGVJdGVtTGlzdChub2RlTGlzdElkKSB7CiAgICAgICAgICAgIHRoaXMuYXN5bmModGhpcy5fcmVzaXplTGlzdC5iaW5kKHRoaXMsIGAjJHtub2RlTGlzdElkfWApKTsKICAgICAgICB9CiAgICAgICAgX2NvbnZlcnRFZGdlTGlzdFRvRWRnZUluZm9MaXN0KGxpc3QsIGlzUHJlZGVjZXNzb3IsIGlzR3JvdXBOb2RlKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBVbnBhY2tzIHRoZSBtZXRhZWRnZSBpbnRvIGEgbGlzdCBvZiBiYXNlIGVkZ2UgaW5mb3JtYXRpb24KICAgICAgICAgICAgICogdGhhdCBjYW4gYmUgcmVuZGVyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXIgdW5wYWNrTWV0YWVkZ2UgPSAobWV0YWVkZ2UpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2Rhc2gubWFwKG1ldGFlZGdlLmJhc2VFZGdlTGlzdCwgKGJhc2VFZGdlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdmFyIG5hbWUgPSBpc1ByZWRlY2Vzc29yID8gYmFzZUVkZ2UudiA6IGJhc2VFZGdlLnc7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZTogdGhpcy5fZ2V0Tm9kZShuYW1lLCB0aGlzLmdyYXBoSGllcmFyY2h5KSwKICAgICAgICAgICAgICAgICAgICAgICAgZWRnZUxhYmVsOiBnZXRMYWJlbEZvckJhc2VFZGdlKGJhc2VFZGdlLCB0aGlzLnJlbmRlckhpZXJhcmNoeSksCiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckluZm86IHRoaXMuX2dldFJlbmRlckluZm8obmFtZSwgdGhpcy5yZW5kZXJIaWVyYXJjaHkpLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbnZlcnRzIGEgbGlzdCBvZiBtZXRhZWRnZXMgdG8gYSBsaXN0IG9mIGVkZ2UgaW5mb3JtYXRpb24KICAgICAgICAgICAgICogdGhhdCBjYW4gYmUgcmVuZGVyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2YXIgdG9FZGdlSW5mb0xpc3QgPSBmdW5jdGlvbiAoZWRnZXMpIHsKICAgICAgICAgICAgICAgIHZhciBlZGdlSW5mb0xpc3QgPSBbXTsKICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKGVkZ2VzLCAobWV0YWVkZ2UpID0+IHsKICAgICAgICAgICAgICAgICAgICB2YXIgbmFtZSA9IGlzUHJlZGVjZXNzb3IgPyBtZXRhZWRnZS52IDogbWV0YWVkZ2UudzsKICAgICAgICAgICAgICAgICAgICAvLyBFbnVtZXJhdGUgYWxsIHRoZSBiYXNlIGVkZ2VzIGlmIHRoZSBub2RlIGlzIGFuIE9wTm9kZSwgb3IgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gbWV0YWVkZ2UgaGFzIG9ubHkgMSBlZGdlIGluIGl0LgogICAgICAgICAgICAgICAgICAgIGlmICghaXNHcm91cE5vZGUgfHwgbWV0YWVkZ2UuYmFzZUVkZ2VMaXN0Lmxlbmd0aCA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VJbmZvTGlzdCA9IGVkZ2VJbmZvTGlzdC5jb25jYXQodW5wYWNrTWV0YWVkZ2UobWV0YWVkZ2UpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVkZ2VJbmZvTGlzdC5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlOiB0aGlzLl9nZXROb2RlKG5hbWUsIHRoaXMuZ3JhcGhIaWVyYXJjaHkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWRnZUxhYmVsOiBnZXRMYWJlbEZvckVkZ2UobWV0YWVkZ2UsIHRoaXMucmVuZGVySGllcmFyY2h5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckluZm86IHRoaXMuX2dldFJlbmRlckluZm8obmFtZSwgdGhpcy5yZW5kZXJIaWVyYXJjaHkpLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHJldHVybiBlZGdlSW5mb0xpc3Q7CiAgICAgICAgICAgIH0uYmluZCh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJlZ3VsYXI6IHRvRWRnZUluZm9MaXN0KGxpc3QucmVndWxhciksCiAgICAgICAgICAgICAgICBjb250cm9sOiB0b0VkZ2VJbmZvTGlzdChsaXN0LmNvbnRyb2wpLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBnZXQgX3N1Ym5vZGVzKCkgewogICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuX25vZGU7CiAgICAgICAgICAgIHJldHVybiBub2RlICYmIG5vZGUubWV0YWdyYXBoID8gbm9kZS5tZXRhZ3JhcGgubm9kZXMoKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIGdldCBfdG90YWxQcmVkZWNlc3NvcnMoKSB7CiAgICAgICAgICAgIHZhciBwcmVkZWNlc3NvcnMgPSB0aGlzLl9wcmVkZWNlc3NvcnM7CiAgICAgICAgICAgIHJldHVybiBwcmVkZWNlc3NvcnMucmVndWxhci5sZW5ndGggKyBwcmVkZWNlc3NvcnMuY29udHJvbC5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIGdldCBfdG90YWxTdWNjZXNzb3JzKCkgewogICAgICAgICAgICB2YXIgc3VjY2Vzc29ycyA9IHRoaXMuX3N1Y2Nlc3NvcnM7CiAgICAgICAgICAgIHJldHVybiBzdWNjZXNzb3JzLnJlZ3VsYXIubGVuZ3RoICsgc3VjY2Vzc29ycy5jb250cm9sLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUNvbnRyb2xQcmVkKCkgewogICAgICAgICAgICB0aGlzLl9vcGVuZWRDb250cm9sUHJlZCA9ICF0aGlzLl9vcGVuZWRDb250cm9sUHJlZDsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUNvbnRyb2xTdWNjKCkgewogICAgICAgICAgICB0aGlzLl9vcGVuZWRDb250cm9sU3VjYyA9ICF0aGlzLl9vcGVuZWRDb250cm9sU3VjYzsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUV4cGFuZGVkKCkgewogICAgICAgICAgICB0aGlzLl9leHBhbmRlZCA9ICF0aGlzLl9leHBhbmRlZDsKICAgICAgICB9CiAgICAgICAgX2dldFRvZ2dsZUljb24oZXhwYW5kZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGV4cGFuZGVkID8gJ2V4cGFuZC1sZXNzJyA6ICdleHBhbmQtbW9yZSc7CiAgICAgICAgfQogICAgICAgIF9yZXNldFN0YXRlKCkgewogICAgICAgICAgICB0aGlzLl9vcGVuZWRDb250cm9sUHJlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9vcGVuZWRDb250cm9sU3VjYyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnNldCgnX2dyb3VwQnV0dG9uVGV4dCcsIGdldEdyb3VwU2V0dGluZ0xhYmVsKHRoaXMuX25vZGUpKTsKICAgICAgICB9CiAgICAgICAgX3Jlc2l6ZUxpc3Qoc2VsZWN0b3IpIHsKICAgICAgICAgICAgdmFyIGxpc3QgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgaWYgKGxpc3QpIHsKICAgICAgICAgICAgICAgIGxpc3QuZmlyZSgnaXJvbi1yZXNpemUnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfdG9nZ2xlSW5jbHVkZSgpIHsKICAgICAgICAgICAgdGhpcy5maXJlKCdub2RlLXRvZ2dsZS1pbmNsdXNpb24nLCB7IG5hbWU6IHRoaXMuZ3JhcGhOb2RlTmFtZSB9KTsKICAgICAgICB9CiAgICAgICAgX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkKGluY2x1ZGUsIG9sZEluY2x1ZGUpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19hdXhCdXR0b25UZXh0JywgZ2V0SW5jbHVkZU5vZGVCdXR0b25TdHJpbmcoaW5jbHVkZSkpOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlR3JvdXAoKSB7CiAgICAgICAgICAgIHZhciBzZXJpZXNOYW1lID0gZ2V0U2VyaWVzTmFtZSh0aGlzLl9ub2RlKTsKICAgICAgICAgICAgdGhpcy5maXJlKCdub2RlLXRvZ2dsZS1zZXJpZXNncm91cCcsIHsgbmFtZTogc2VyaWVzTmFtZSB9KTsKICAgICAgICB9CiAgICAgICAgX2lzTGlicmFyeUZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIG5vZGUgbmFtZSBzdGFydHMgd2l0aCB0aGlzIHN0cmluZywgdGhlIG5vZGUgaXMgZWl0aGVyIGEKICAgICAgICAgICAgLy8gbGlicmFyeSBmdW5jdGlvbiBvciBhIG5vZGUgd2l0aGluIGl0LiBUaG9zZSBub2RlcyBzaG91bGQgbmV2ZXIgYmUKICAgICAgICAgICAgLy8gZXh0cmFjdGVkIGludG8gdGhlIGF1eGlsaWFyeSBzY2VuZSBncm91cCBiZWNhdXNlIHRoZXkgcmVwcmVzZW50CiAgICAgICAgICAgIC8vIHRlbXBsYXRlcyBmb3IgZnVuY3Rpb24gY2FsbCBub2Rlcywgbm90IG9wcyBpbiB0aGUgZ3JhcGggdGhlbXNlbHZlcy4KICAgICAgICAgICAgcmV0dXJuIG5vZGUgJiYgbm9kZS5uYW1lLnN0YXJ0c1dpdGgoRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCk7CiAgICAgICAgfQogICAgICAgIF9pc0luU2VyaWVzKG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIGNhbkJlSW5TZXJpZXMobm9kZSk7CiAgICAgICAgfQogICAgfTsKICAgIFRmTm9kZUluZm8udGVtcGxhdGUgPSBodG1sIGAKICAgIDxzdHlsZT4KICAgICAgLnN1Yi1saXN0LWdyb3VwIHsKICAgICAgICBmb250LXdlaWdodDogNTAwOwogICAgICAgIGZvbnQtc2l6ZTogMTJwdDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogOHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDMwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IHNjcm9sbDsKICAgICAgfQoKICAgICAgLmF0dHItbGVmdCB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgd2lkdGg6IDMwJTsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgY29sb3I6ICM1NjU2NTY7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC5hdHRyLXJpZ2h0IHsKICAgICAgICBtYXJnaW4tbGVmdDogMzAlOwogICAgICAgIHdvcmQtd3JhcDogYnJlYWstd29yZDsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUgewogICAgICAgIGRpc3BsYXk6IHRhYmxlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc3ViLWxpc3QtdGFibGUtcm93IHsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1yb3c7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1yb3cgLnN1Yi1saXN0LXRhYmxlLWNlbGw6bGFzdC1jaGlsZCB7CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KCiAgICAgIC5zdWItbGlzdC10YWJsZS1jZWxsIHsKICAgICAgICBjb2xvcjogIzU2NTY1NjsKICAgICAgICBkaXNwbGF5OiB0YWJsZS1jZWxsOwogICAgICAgIGZvbnQtc2l6ZTogMTFwdDsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICAgIG1heC13aWR0aDogMjAwcHg7CiAgICAgICAgcGFkZGluZzogMCA0cHg7CiAgICAgIH0KCiAgICAgIHBhcGVyLWl0ZW0gewogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgYmFja2dyb3VuZDogI2U5ZTllOTsKICAgICAgfQoKICAgICAgcGFwZXItaXRlbS1ib2R5W3R3by1saW5lXSB7CiAgICAgICAgbWluLWhlaWdodDogMDsKICAgICAgICBwYWRkaW5nOiA4cHggMTJweCA0cHg7CiAgICAgIH0KCiAgICAgIC5leHBhbmRlZEluZm8gewogICAgICAgIHBhZGRpbmc6IDhweCAxMnB4OwogICAgICB9CgogICAgICAuY29udHJvbERlcHMgewogICAgICAgIHBhZGRpbmc6IDAgMCAwIDhweDsKICAgICAgfQoKICAgICAgLm5vZGUtbmFtZSB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vcm1hbDsKICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7CiAgICAgICAgZm9udC1zaXplOiAxNHB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgIH0KCiAgICAgIC5ub2RlLWljb24gewogICAgICAgIGZsb2F0OiByaWdodDsKICAgICAgfQoKICAgICAgLnN1YnRpdGxlIHsKICAgICAgICBmb250LXNpemU6IDEycHQ7CiAgICAgICAgY29sb3I6ICM1ZTVlNWU7CiAgICAgIH0KCiAgICAgIC5jb250cm9sTGluZSB7CiAgICAgICAgZm9udC1zaXplOiAxMXB0OwogICAgICAgIGZvbnQtd2VpZ2h0OiA0MDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtYnV0dG9uIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLmNvbnRyb2wtdG9nZ2xlLWJ1dHRvbiB7CiAgICAgICAgZmxvYXQ6IGxlZnQ7CiAgICAgICAgbWF4LWhlaWdodDogMjBweDsKICAgICAgICBtYXgtd2lkdGg6IDIwcHg7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQoKICAgICAgLnRvZ2dsZS1pbmNsdWRlLWdyb3VwIHsKICAgICAgICBwYWRkaW5nLXRvcDogNHB4OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGUgewogICAgICAgIG1hcmdpbjogNXB4IDZweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgICBwYWRkaW5nOiA0cHggNnB4OwogICAgICAgIGZvbnQtc2l6ZTogMTBwdDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmFmYWZhOwogICAgICAgIGNvbG9yOiAjNjY2OwogICAgICB9CgogICAgICAudG9nZ2xlLWluY2x1ZGU6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWdvb2dsZS15ZWxsb3ctMTAwKTsKICAgICAgfQoKICAgICAgLm5vbi1jb250cm9sLWxpc3QtaXRlbSB7CiAgICAgICAgcGFkZGluZy1sZWZ0OiAxMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHBhcGVyLWl0ZW0+CiAgICAgIDxwYXBlci1pdGVtLWJvZHkgdHdvLWxpbmU+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9leHBhbmRlZCl9fSIKICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1idXR0b24iCiAgICAgICAgICA+CiAgICAgICAgICA8L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm9kZS1uYW1lIj4KICAgICAgICAgICAgPHRmLXdici1zdHJpbmcgdmFsdWU9IltbX25vZGUubmFtZV1dIiBkZWxpbWl0ZXItcGF0dGVybj0iLyI+CiAgICAgICAgICAgIDwvdGYtd2JyLXN0cmluZz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgc2Vjb25kYXJ5PgogICAgICAgICAgPHRmLW5vZGUtaWNvbgogICAgICAgICAgICBjbGFzcz0ibm9kZS1pY29uIgogICAgICAgICAgICBub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgIHJlbmRlci1pbmZvPSJbW19nZXRSZW5kZXJJbmZvKGdyYXBoTm9kZU5hbWUsIHJlbmRlckhpZXJhcmNoeSldXSIKICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgPjwvdGYtbm9kZS1pY29uPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm9wfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWJ0aXRsZSI+CiAgICAgICAgICAgICAgT3BlcmF0aW9uOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUub3BdXTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19ub2RlLm1ldGFncmFwaH19Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3VidGl0bGUiPgogICAgICAgICAgICAgIFN1YmdyYXBoOgogICAgICAgICAgICAgIDxzcGFuPltbX25vZGUuY2FyZGluYWxpdHldXTwvc3Bhbj4gbm9kZXMKICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvZGl2PgogICAgICA8L3BhcGVyLWl0ZW0tYm9keT4KICAgIDwvcGFwZXItaXRlbT4KICAgIDxpcm9uLWNvbGxhcHNlIG9wZW5lZD0ie3tfZXhwYW5kZWR9fSI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZXhwYW5kZWR9fSIgcmVzdGFtcD0idHJ1ZSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZXhwYW5kZWRJbmZvIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIGF0dHJpYnV0ZXMiPgogICAgICAgICAgICBBdHRyaWJ1dGVzICg8c3Bhbj5bW19hdHRyaWJ1dGVzLmxlbmd0aF1dPC9zcGFuPikKICAgICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICBpZD0iYXR0cmlidXRlc0xpc3QiCiAgICAgICAgICAgICAgaXRlbXM9IltbX2F0dHJpYnV0ZXNdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItbGVmdCI+W1tpdGVtLmtleV1dPC9kaXY+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItcmlnaHQiPltbaXRlbS52YWx1ZV1dPC9kaXY+CiAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZGV2aWNlfX0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJzdWItbGlzdC1ncm91cCBkZXZpY2UiPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImF0dHItbGVmdCI+RGV2aWNlPC9kaXY+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iYXR0ci1yaWdodCI+W1tfZGV2aWNlXV08L2Rpdj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHByZWRlY2Vzc29ycyI+CiAgICAgICAgICAgIElucHV0cyAoPHNwYW4+W1tfdG90YWxQcmVkZWNlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9ImlucHV0c0xpc3QiCiAgICAgICAgICAgICAgaXRlbXM9IltbX3ByZWRlY2Vzc29ycy5yZWd1bGFyXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tbm9kZT0iW1tpdGVtLm5vZGVdXSIKICAgICAgICAgICAgICAgICAgZWRnZS1sYWJlbD0iW1tpdGVtLmVkZ2VMYWJlbF1dIgogICAgICAgICAgICAgICAgICBpdGVtLXJlbmRlci1pbmZvPSJbW2l0ZW0ucmVuZGVySW5mb11dIgogICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgICAgICAgICB0ZW1wbGF0ZS1pbmRleD0iW1tfdGVtcGxhdGVJbmRleF1dIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC90Zi1ub2RlLWxpc3QtaXRlbT4KICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sUHJlZCl9fSIKICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xQcmVkIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sUHJlZH19IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICAgICAgICAgICAgaWY9Int7X29wZW5lZENvbnRyb2xQcmVkfX0iCiAgICAgICAgICAgICAgICAgICAgcmVzdGFtcD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPSJzdWItbGlzdCIKICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19wcmVkZWNlc3NvcnMuY29udHJvbF1dIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgICAgICAgY2FyZC1ub2RlPSJbW19ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iW1tpdGVtLm5hbWVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLXR5cGU9InByZWRlY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgoKICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LWdyb3VwIHN1Y2Nlc3NvcnMiPgogICAgICAgICAgICBPdXRwdXRzICg8c3Bhbj5bW190b3RhbFN1Y2Nlc3NvcnNdXTwvc3Bhbj4pCiAgICAgICAgICAgIDxpcm9uLWxpc3QKICAgICAgICAgICAgICBjbGFzcz0ic3ViLWxpc3QiCiAgICAgICAgICAgICAgaWQ9Im91dHB1dHNMaXN0IgogICAgICAgICAgICAgIGl0ZW1zPSJbW19zdWNjZXNzb3JzLnJlZ3VsYXJdXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi1ub2RlLWxpc3QtaXRlbQogICAgICAgICAgICAgICAgICBjbGFzcz0ibm9uLWNvbnRyb2wtbGlzdC1pdGVtIgogICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgaXRlbS1ub2RlPSJbW2l0ZW0ubm9kZV1dIgogICAgICAgICAgICAgICAgICBlZGdlLWxhYmVsPSJbW2l0ZW0uZWRnZUxhYmVsXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tcmVuZGVyLWluZm89IltbaXRlbS5yZW5kZXJJbmZvXV0iCiAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0ic3VjY2Vzc29yIgogICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgIHRlbXBsYXRlLWluZGV4PSJbW190ZW1wbGF0ZUluZGV4XV0iCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvaXJvbi1saXN0PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3N1Y2Nlc3NvcnMuY29udHJvbC5sZW5ndGhdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbERlcHMiPgogICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29udHJvbExpbmUiPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJ7e19nZXRUb2dnbGVJY29uKF9vcGVuZWRDb250cm9sU3VjYyl9fSIKICAgICAgICAgICAgICAgICAgICBvbi1jbGljaz0iX3RvZ2dsZUNvbnRyb2xTdWNjIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJjb250cm9sLXRvZ2dsZS1idXR0b24iCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICAgICAgQ29udHJvbCBkZXBlbmRlbmNpZXMKICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJ7e19vcGVuZWRDb250cm9sU3VjY319IiBuby1hbmltYXRpb24+CiAgICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgICAgICAgICAgICAgaWY9Int7X29wZW5lZENvbnRyb2xTdWNjfX0iCiAgICAgICAgICAgICAgICAgICAgcmVzdGFtcD0idHJ1ZSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIDxpcm9uLWxpc3QgY2xhc3M9InN1Yi1saXN0IiBpdGVtcz0iW1tfc3VjY2Vzc29ycy5jb250cm9sXV0iPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgICAgICA8dGYtbm9kZS1saXN0LWl0ZW0KICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbS5ub2RlXV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS1yZW5kZXItaW5mbz0iW1tpdGVtLnJlbmRlckluZm9dXSIKICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJbW2l0ZW0ubmFtZV1dIgogICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tdHlwZT0ic3VjY2Vzc29ycyIKICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDwvaXJvbi1jb2xsYXBzZT4KICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e19oYXNEaXNwbGF5YWJsZU5vZGVTdGF0c319Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgbm9kZS1zdGF0cyI+CiAgICAgICAgICAgICAgTm9kZSBTdGF0cwogICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlIj4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZVN0YXRzLnRvdGFsQnl0ZXN9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+TWVtb3J5PC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICBbW19ub2RlU3RhdHNGb3JtYXR0ZWRCeXRlc11dCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfZ2V0VG90YWxNaWNyb3MoX25vZGVTdGF0cyl9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+Q29tcHV0ZSBUaW1lPC9kaXY+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgICAgICAgICBbW19ub2RlU3RhdHNGb3JtYXR0ZWRDb21wdXRlVGltZV1dCiAgICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfbm9kZVN0YXRzLm91dHB1dFNpemV9fSI+CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLXJvdyI+CiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtdGFibGUtY2VsbCI+VGVuc29yIE91dHB1dCBTaXplczwvZGl2PgogICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9InN1Yi1saXN0LXRhYmxlLWNlbGwiPgogICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICAgICAgICAgICAgICAgIGlzPSJkb20tcmVwZWF0IgogICAgICAgICAgICAgICAgICAgICAgICBpdGVtcz0ie3tfbm9kZVN0YXRzRm9ybWF0dGVkT3V0cHV0U2l6ZXN9fSIKICAgICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgICAgW1tpdGVtXV0gPGJyIC8+CiAgICAgICAgICAgICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KCiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2Z1bmN0aW9uVXNhZ2VzLmxlbmd0aF1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic3ViLWxpc3QtZ3JvdXAgcHJlZGVjZXNzb3JzIj4KICAgICAgICAgICAgICBVc2FnZXMgb2YgdGhlIEZ1bmN0aW9uICg8c3Bhbj5bW19mdW5jdGlvblVzYWdlcy5sZW5ndGhdXTwvc3Bhbj4pCiAgICAgICAgICAgICAgPGlyb24tbGlzdAogICAgICAgICAgICAgICAgY2xhc3M9InN1Yi1saXN0IgogICAgICAgICAgICAgICAgaWQ9ImZ1bmN0aW9uVXNhZ2VzTGlzdCIKICAgICAgICAgICAgICAgIGl0ZW1zPSJbW19mdW5jdGlvblVzYWdlc11dIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgICAgPHRmLW5vZGUtbGlzdC1pdGVtCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Im5vbi1jb250cm9sLWxpc3QtaXRlbSIKICAgICAgICAgICAgICAgICAgICBjYXJkLW5vZGU9IltbX25vZGVdXSIKICAgICAgICAgICAgICAgICAgICBpdGVtLW5vZGU9IltbaXRlbV1dIgogICAgICAgICAgICAgICAgICAgIG5hbWU9IltbaXRlbS5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgaXRlbS10eXBlPSJmdW5jdGlvblVzYWdlcyIKICAgICAgICAgICAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGUtaW5kZXg9IltbX3RlbXBsYXRlSW5kZXhdXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8L3RmLW5vZGUtbGlzdC1pdGVtPgogICAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgICA8L2lyb24tbGlzdD4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2lzTGlicmFyeUZ1bmN0aW9uKF9ub2RlKV1dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idG9nZ2xlLWluY2x1ZGUtZ3JvdXAiPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgIHJhaXNlZAogICAgICAgICAgICAgICAgY2xhc3M9InRvZ2dsZS1pbmNsdWRlIgogICAgICAgICAgICAgICAgb24tY2xpY2s9Il90b2dnbGVJbmNsdWRlIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxzcGFuPltbX2F1eEJ1dHRvblRleHRdXTwvc3Bhbj4KICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgoKICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0ie3tfaXNJblNlcmllcyhfbm9kZSl9fSI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRvZ2dsZS1pbmNsdWRlLWdyb3VwIj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICByYWlzZWQKICAgICAgICAgICAgICAgIGNsYXNzPSJ0b2dnbGUtaW5jbHVkZSIKICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlR3JvdXAiCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHNwYW4+W1tfZ3JvdXBCdXR0b25UZXh0XV08L3NwYW4+CiAgICAgICAgICAgICAgPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvaXJvbi1jb2xsYXBzZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgImdyYXBoTm9kZU5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgImdyYXBoSGllcmFyY2h5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJyZW5kZXJIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgImNvbG9yQnkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2dldE5vZGUoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpJywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfcmVzZXRTdGF0ZScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9ub2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBjb21wdXRlZDogJ19nZXROb2RlU3RhdHMoZ3JhcGhOb2RlTmFtZSwgZ3JhcGhIaWVyYXJjaHkpJywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfcmVzZXRTdGF0ZScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9ub2RlU3RhdHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX25vZGVJbmNsdWRlU3RhdGVDaGFuZ2VkJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmTm9kZUluZm8ucHJvdG90eXBlLCAibm9kZUluY2x1ZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmTm9kZUluZm8ucHJvdG90eXBlLCAiX2V4cGFuZGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9vcGVuZWRDb250cm9sUHJlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfb3BlbmVkQ29udHJvbFN1Y2MiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9hdXhCdXR0b25UZXh0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfZ3JvdXBCdXR0b25UZXh0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdncmFwaEhpZXJhcmNoeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfdGVtcGxhdGVJbmRleCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ub2RlU3RhdHMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9oYXNEaXNwbGF5YWJsZU5vZGVTdGF0cyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ub2RlU3RhdHMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmTm9kZUluZm8ucHJvdG90eXBlLCAiX25vZGVTdGF0c0Zvcm1hdHRlZEJ5dGVzIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX25vZGVTdGF0cycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfbm9kZVN0YXRzRm9ybWF0dGVkQ29tcHV0ZVRpbWUiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfbm9kZVN0YXRzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmTm9kZUluZm8ucHJvdG90eXBlLCAiX25vZGVTdGF0c0Zvcm1hdHRlZE91dHB1dFNpemVzIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX25vZGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfYXR0cmlidXRlcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ub2RlJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9kZXZpY2UiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfbm9kZScsICdncmFwaEhpZXJhcmNoeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfc3VjY2Vzc29ycyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ub2RlJywgJ2dyYXBoSGllcmFyY2h5JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9wcmVkZWNlc3NvcnMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfbm9kZScsICdncmFwaEhpZXJhcmNoeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZk5vZGVJbmZvLnByb3RvdHlwZSwgIl9mdW5jdGlvblVzYWdlcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ub2RlJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmTm9kZUluZm8ucHJvdG90eXBlLCAiX3N1Ym5vZGVzIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3ByZWRlY2Vzc29ycycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfdG90YWxQcmVkZWNlc3NvcnMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfc3VjY2Vzc29ycycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZOb2RlSW5mby5wcm90b3R5cGUsICJfdG90YWxTdWNjZXNzb3JzIiwgbnVsbCk7CiAgICBUZk5vZGVJbmZvID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtbm9kZS1pbmZvJykKICAgIF0sIFRmTm9kZUluZm8pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmR3JhcGhJbmZvID0gY2xhc3MgVGZHcmFwaEluZm8gZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdub2RlLWxpc3QtaXRlbS1jbGljaycsIHRoaXMuX25vZGVMaXN0SXRlbUNsaWNrZWQuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbm9kZS1saXN0LWl0ZW0tbW91c2VvdmVyJywgdGhpcy5fbm9kZUxpc3RJdGVtTW91c2VvdmVyLmJpbmQodGhpcykpOwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ25vZGUtbGlzdC1pdGVtLW1vdXNlb3V0JywgdGhpcy5fbm9kZUxpc3RJdGVtTW91c2VvdXQuYmluZCh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIF9ub2RlTGlzdEl0ZW1DbGlja2VkKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWROb2RlID0gZXZlbnQuZGV0YWlsLm5vZGVOYW1lOwogICAgICAgIH0KICAgICAgICBfbm9kZUxpc3RJdGVtTW91c2VvdmVyKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWROb2RlID0gZXZlbnQuZGV0YWlsLm5vZGVOYW1lOwogICAgICAgIH0KICAgICAgICBfbm9kZUxpc3RJdGVtTW91c2VvdXQoKSB7CiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWROb2RlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgX2hlYWx0aFBpbGxzQXZhaWxhYmxlKGRlYnVnZ2VyRGF0YUVuYWJsZWQsIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpIHsKICAgICAgICAgICAgLy8gU28gbG9uZyBhcyB0aGVyZSBpcyBhIG1hcHBpbmcgKGV2ZW4gaWYgZW1wdHkpIGZyb20gbm9kZSBuYW1lIHRvIGhlYWx0aCBwaWxscywgc2hvdyB0aGUKICAgICAgICAgICAgLy8gbGVnZW5kIGFuZCBzbGlkZXIuIFdlIGRvIHRoYXQgYmVjYXVzZSwgZXZlbiBpZiBubyBoZWFsdGggcGlsbHMgZXhpc3QgYXQgdGhlIGN1cnJlbnQgc3RlcCwKICAgICAgICAgICAgLy8gdGhlIHVzZXIgbWF5IGRlc2lyZSB0byBjaGFuZ2Ugc3RlcHMsIGFuZCB0aGUgc2xpZGVyIG11c3Qgc2hvdyBmb3IgdGhlIHVzZXIgdG8gZG8gdGhhdC4KICAgICAgICAgICAgcmV0dXJuIChkZWJ1Z2dlckRhdGFFbmFibGVkICYmCiAgICAgICAgICAgICAgICBub2RlTmFtZXNUb0hlYWx0aFBpbGxzICYmCiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhub2RlTmFtZXNUb0hlYWx0aFBpbGxzKS5sZW5ndGggPiAwKTsKICAgICAgICB9CiAgICAgICAgX2VxdWFscyhhLCBiKSB7CiAgICAgICAgICAgIHJldHVybiBhID09PSBiOwogICAgICAgIH0KICAgIH07CiAgICBUZkdyYXBoSW5mby50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG1heC1oZWlnaHQ6IDY1MHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CgogICAgICBoMiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CiAgICA8L3N0eWxlPgogICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJ7e3NlbGVjdGVkTm9kZX19Ij4KICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9ImNhcmQiPgogICAgICAgIDx0Zi1ub2RlLWluZm8KICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICAgIGZsYXQtZ3JhcGg9IltbZ3JhcGhdXSIKICAgICAgICAgIGdyYXBoLW5vZGUtbmFtZT0iW1tzZWxlY3RlZE5vZGVdXSIKICAgICAgICAgIG5vZGUtaW5jbHVkZT0iW1tzZWxlY3RlZE5vZGVJbmNsdWRlXV0iCiAgICAgICAgICBoaWdobGlnaHRlZC1ub2RlPSJ7e2hpZ2hsaWdodGVkTm9kZX19IgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgID4KICAgICAgICA8L3RmLW5vZGUtaW5mbz4KICAgICAgPC9wYXBlci1tYXRlcmlhbD4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnb3BfY29tcGF0aWJpbGl0eScpXV0iPgogICAgICA8dGYtZ3JhcGgtb3AtY29tcGF0LWNhcmQKICAgICAgICBncmFwaC1oaWVyYXJjaHk9IltbZ3JhcGhIaWVyYXJjaHldXSIKICAgICAgICBoaWVyYXJjaHktcGFyYW1zPSJbW2hpZXJhcmNoeVBhcmFtc11dIgogICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgIG5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iCiAgICAgID4KICAgICAgPC90Zi1ncmFwaC1vcC1jb21wYXQtY2FyZD4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUKICAgICAgaXM9ImRvbS1pZiIKICAgICAgaWY9IltbX2hlYWx0aFBpbGxzQXZhaWxhYmxlKGRlYnVnZ2VyRGF0YUVuYWJsZWQsIG5vZGVOYW1lc1RvSGVhbHRoUGlsbHMpXV0iCiAgICA+CiAgICAgIDx0Zi1ncmFwaC1kZWJ1Z2dlci1kYXRhLWNhcmQKICAgICAgICByZW5kZXItaGllcmFyY2h5PSJbW3JlbmRlckhpZXJhcmNoeV1dIgogICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIgogICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e3NlbGVjdGVkTm9kZX19IgogICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7aGlnaGxpZ2h0ZWROb2RlfX0iCiAgICAgICAgYXJlLWhlYWx0aC1waWxscy1sb2FkaW5nPSJbW2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIgogICAgICAgIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IgogICAgICAgIHNwZWNpZmljLWhlYWx0aC1waWxsLXN0ZXA9Int7c3BlY2lmaWNIZWFsdGhQaWxsU3RlcH19IgogICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICA+CiAgICAgIDwvdGYtZ3JhcGgtZGVidWdnZXItZGF0YS1jYXJkPgogICAgPC90ZW1wbGF0ZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoSW5mby5wcm90b3R5cGUsICJ0aXRsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhJbmZvLnByb3RvdHlwZSwgImdyYXBoSGllcmFyY2h5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaEluZm8ucHJvdG90eXBlLCAiZ3JhcGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoSW5mby5wcm90b3R5cGUsICJyZW5kZXJIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoSW5mby5wcm90b3R5cGUsICJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoSW5mby5wcm90b3R5cGUsICJoZWFsdGhQaWxsU3RlcEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaEluZm8ucHJvdG90eXBlLCAiY29sb3JCeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGhJbmZvLnByb3RvdHlwZSwgImNvbXBhdE5vZGVUaXRsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaEluZm8ucHJvdG90eXBlLCAic2VsZWN0ZWROb2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoSW5mby5wcm90b3R5cGUsICJoaWdobGlnaHRlZE5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhJbmZvLnByb3RvdHlwZSwgInNlbGVjdGVkTm9kZUluY2x1ZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhJbmZvLnByb3RvdHlwZSwgImRlYnVnZ2VyRGF0YUVuYWJsZWQiLCB2b2lkIDApOwogICAgVGZHcmFwaEluZm8gPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ncmFwaC1pbmZvJykKICAgIF0sIFRmR3JhcGhJbmZvKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNvbnN0IEZSQUNfVklFV1BPSU5UX0FSRUEgPSAwLjg7CiAgICBjbGFzcyBNaW5pbWFwIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG1pbmltYXAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3ZnIFRoZSBtYWluIHN2ZyBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB6b29tRyBUaGUgc3ZnIGdyb3VwIHVzZWQgZm9yIHBhbm5pbmcgYW5kIHpvb21pbmcgdGhlIG1haW4gc3ZnLgogICAgICAgICAqIEBwYXJhbSBtYWluWm9vbSBUaGUgbWFpbiB6b29tIGJlaGF2aW9yLgogICAgICAgICAqIEBwYXJhbSBtaW5pbWFwIFRoZSBtaW5pbWFwIGNvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0gbWF4V2FuZEggVGhlIG1heGltdW0gd2lkdGgvaGVpZ2h0IGZvciB0aGUgbWluaW1hcC4KICAgICAgICAgKiBAcGFyYW0gbGFiZWxQYWRkaW5nIFBhZGRpbmcgaW4gcGl4ZWxzIGR1ZSB0byB0aGUgbWFpbiBncmFwaCBsYWJlbHMuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3ZnLCB6b29tRywgbWFpblpvb20sIG1pbmltYXAsIG1heFdhbmRILCBsYWJlbFBhZGRpbmcpIHsKICAgICAgICAgICAgdGhpcy5zdmcgPSBzdmc7CiAgICAgICAgICAgIHRoaXMubGFiZWxQYWRkaW5nID0gbGFiZWxQYWRkaW5nOwogICAgICAgICAgICB0aGlzLnpvb21HID0gem9vbUc7CiAgICAgICAgICAgIHRoaXMubWFpblpvb20gPSBtYWluWm9vbTsKICAgICAgICAgICAgdGhpcy5tYXhXYW5kSCA9IG1heFdhbmRIOwogICAgICAgICAgICBsZXQgJHNoYWRvd1Jvb3QgPSBzZWxlY3QobWluaW1hcC5zaGFkb3dSb290KTsKICAgICAgICAgICAgLy8gVGhlIG1pbmltYXAgd2lsbCBoYXZlIDIgbWFpbiBjb21wb25lbnRzOiB0aGUgY2FudmFzIHNob3dpbmcgdGhlIGNvbnRlbnQKICAgICAgICAgICAgLy8gYW5kIGFuIHN2ZyBzaG93aW5nIGEgcmVjdGFuZ2xlIG9mIHRoZSBjdXJyZW50bHkgem9vbWVkL3Bhbm5lZCB2aWV3cG9pbnQuCiAgICAgICAgICAgIGxldCAkbWluaW1hcFN2ZyA9ICRzaGFkb3dSb290LnNlbGVjdCgnc3ZnJyk7CiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHZpZXdwb2ludCByZWN0YW5nbGUgZHJhZ2dhYmxlLgogICAgICAgICAgICBsZXQgJHZpZXdwb2ludCA9ICRtaW5pbWFwU3ZnLnNlbGVjdCgncmVjdCcpOwogICAgICAgICAgICBsZXQgZHJhZ21vdmUgPSAoZCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy52aWV3cG9pbnRDb29yZC54ID0gZXZlbnQueDsKICAgICAgICAgICAgICAgIHRoaXMudmlld3BvaW50Q29vcmQueSA9IGV2ZW50Lnk7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVZpZXdwb2ludCgpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLnZpZXdwb2ludENvb3JkID0geyB4OiAwLCB5OiAwIH07CiAgICAgICAgICAgIGxldCBkcmFnJDEgPSBkcmFnKCkuc3ViamVjdChPYmplY3QpLm9uKCdkcmFnJywgZHJhZ21vdmUpOwogICAgICAgICAgICAkdmlld3BvaW50LmRhdHVtKHRoaXMudmlld3BvaW50Q29vcmQpLmNhbGwoZHJhZyQxKTsKICAgICAgICAgICAgLy8gTWFrZSB0aGUgbWluaW1hcCBjbGlja2FibGUuCiAgICAgICAgICAgICRtaW5pbWFwU3ZnLm9uKCdjbGljaycsICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChldmVudC5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBjbGljayB3YXMgcGFydCBvZiBhIGRyYWcgZXZlbnQsIHNvIHN1cHByZXNzIGl0LgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHZpZXdwb2ludC4KICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9IE51bWJlcigkdmlld3BvaW50LmF0dHIoJ3dpZHRoJykpOwogICAgICAgICAgICAgICAgbGV0IGhlaWdodCA9IE51bWJlcigkdmlld3BvaW50LmF0dHIoJ2hlaWdodCcpKTsKICAgICAgICAgICAgICAgIGxldCBjbGlja0Nvb3JkcyA9IG1vdXNlKCRtaW5pbWFwU3ZnLm5vZGUoKSk7CiAgICAgICAgICAgICAgICB0aGlzLnZpZXdwb2ludENvb3JkLnggPSBjbGlja0Nvb3Jkc1swXSAtIHdpZHRoIC8gMjsKICAgICAgICAgICAgICAgIHRoaXMudmlld3BvaW50Q29vcmQueSA9IGNsaWNrQ29vcmRzWzFdIC0gaGVpZ2h0IC8gMjsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlld3BvaW50KCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnZpZXdwb2ludCA9ICR2aWV3cG9pbnQubm9kZSgpOwogICAgICAgICAgICB0aGlzLm1pbmltYXBTdmcgPSAkbWluaW1hcFN2Zy5ub2RlKCk7CiAgICAgICAgICAgIHRoaXMubWluaW1hcCA9IG1pbmltYXA7CiAgICAgICAgICAgIHRoaXMuY2FudmFzID0gJHNoYWRvd1Jvb3Quc2VsZWN0KCdjYW52YXMuZmlyc3QnKS5ub2RlKCk7CiAgICAgICAgICAgIHRoaXMuY2FudmFzQnVmZmVyID0gKCRzaGFkb3dSb290LnNlbGVjdCgnY2FudmFzLnNlY29uZCcpLm5vZGUoKSk7CiAgICAgICAgICAgIHRoaXMuZG93bmxvYWRDYW52YXMgPSAoJHNoYWRvd1Jvb3Quc2VsZWN0KCdjYW52YXMuZG93bmxvYWQnKS5ub2RlKCkpOwogICAgICAgICAgICBzZWxlY3QodGhpcy5kb3dubG9hZENhbnZhcykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBwb3NpdGlvbiBhbmQgdGhlIHNpemUgb2YgdGhlIHZpZXdwb2ludCByZWN0YW5nbGUuCiAgICAgICAgICogSXQgYWxzbyBub3RpZmllcyB0aGUgbWFpbiBzdmcgYWJvdXQgdGhlIG5ldyBwYW5uZWQgcG9zaXRpb24uCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlVmlld3BvaW50KCkgewogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSB2aWV3cG9pbnQgcmVjdGFuZ2xlLgogICAgICAgICAgICBzZWxlY3QodGhpcy52aWV3cG9pbnQpCiAgICAgICAgICAgICAgICAuYXR0cigneCcsIHRoaXMudmlld3BvaW50Q29vcmQueCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgdGhpcy52aWV3cG9pbnRDb29yZC55KTsKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSB0cmFuc2xhdGlvbiB2ZWN0b3Igb2YgdGhlIG1haW4gc3ZnIHRvIHJlZmxlY3QgdGhlCiAgICAgICAgICAgIC8vIG5ldyB2aWV3cG9pbnQuCiAgICAgICAgICAgIGxldCBtYWluWCA9ICgtdGhpcy52aWV3cG9pbnRDb29yZC54ICogdGhpcy5zY2FsZU1haW4pIC8gdGhpcy5zY2FsZU1pbmltYXA7CiAgICAgICAgICAgIGxldCBtYWluWSA9ICgtdGhpcy52aWV3cG9pbnRDb29yZC55ICogdGhpcy5zY2FsZU1haW4pIC8gdGhpcy5zY2FsZU1pbmltYXA7CiAgICAgICAgICAgIHNlbGVjdCh0aGlzLnN2ZykuY2FsbCh0aGlzLm1haW5ab29tLnRyYW5zZm9ybSwgaWRlbnRpdHkkOS50cmFuc2xhdGUobWFpblgsIG1haW5ZKS5zY2FsZSh0aGlzLnNjYWxlTWFpbikpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWRyYXdzIHRoZSBtaW5pbWFwLiBTaG91bGQgYmUgY2FsbGVkIHdoZW5ldmVyIHRoZSBtYWluIHN2ZwogICAgICAgICAqIHdhcyB1cGRhdGVkIChlLmcuIHdoZW4gYSBub2RlIHdhcyBleHBhbmRlZCkuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlKCkgewogICAgICAgICAgICBsZXQgc2NlbmVTaXplID0gbnVsbDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgZW50aXJlIHNjZW5lLgogICAgICAgICAgICAgICAgc2NlbmVTaXplID0gdGhpcy56b29tRy5nZXRCQm94KCk7CiAgICAgICAgICAgICAgICBpZiAoc2NlbmVTaXplLndpZHRoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlcmUgaXMgbm8gc2NlbmUgYW55bW9yZS4gV2UgaGF2ZSBiZWVuIGRldGFjaGVkIGZyb20gdGhlIGRvbS4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIC8vIEZpcmVmb3ggcHJvZHVjZWQgTlNfRVJST1JfRkFJTFVSRSBpZiB3ZSBoYXZlIGJlZW4KICAgICAgICAgICAgICAgIC8vIGRldGFjaGVkIGZyb20gdGhlIGRvbS4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgJGRvd25sb2FkID0gc2VsZWN0KCcjZ3JhcGhkb3dubG9hZCcpOwogICAgICAgICAgICB0aGlzLmRvd25sb2FkID0gJGRvd25sb2FkLm5vZGUoKTsKICAgICAgICAgICAgJGRvd25sb2FkLm9uKCdjbGljaycsIChkKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBSZXZva2UgdGhlIG9sZCBVUkwsIGlmIGFueS4gVGhlbiwgZ2VuZXJhdGUgYSBuZXcgVVJMLgogICAgICAgICAgICAgICAgVVJMLnJldm9rZU9iamVjdFVSTCh0aGlzLmRvd25sb2FkLmhyZWYpOwogICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBgSFRNTENhbnZhc0VsZW1lbnQudG9CbG9iYCBBUEkgYmVjYXVzZSBpdCBkb2VzCiAgICAgICAgICAgICAgICAvLyBub3QgaGF2ZSBhIHN5bmNocm9ub3VzIHZhcmlhbnQsIGFuZCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGlzIGhyZWYKICAgICAgICAgICAgICAgIC8vIHN5bmNocm9ub3VzbHkuIEluc3RlYWQsIHdlIGNyZWF0ZSBhIGJsb2IgbWFudWFsbHkgZnJvbSB0aGUgZGF0YQogICAgICAgICAgICAgICAgLy8gVVJMLgogICAgICAgICAgICAgICAgY29uc3QgZGF0YVVybCA9IHRoaXMuZG93bmxvYWRDYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTsKICAgICAgICAgICAgICAgIGNvbnN0IHByZWZpeCA9IGRhdGFVcmwuc2xpY2UoMCwgZGF0YVVybC5pbmRleE9mKCcsJykpOwogICAgICAgICAgICAgICAgaWYgKCFwcmVmaXguZW5kc1dpdGgoJztiYXNlNjQnKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2Fybihgbm9uLWJhc2U2NCBkYXRhIFVSTCAoJHtwcmVmaXh9KTsgY2Fubm90IHVzZSBibG9iIGRvd25sb2FkYCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kb3dubG9hZC5ocmVmID0gZGF0YVVybDsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gYXRvYihkYXRhVXJsLnNsaWNlKGRhdGFVcmwuaW5kZXhPZignLCcpICsgMSkpOwogICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSBuZXcgVWludDhBcnJheShkYXRhLmxlbmd0aCkubWFwKChfLCBpKSA9PiBkYXRhLmNoYXJDb2RlQXQoaSkpOwogICAgICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtieXRlc10sIHsgdHlwZTogJ2ltYWdlL3BuZycgfSk7CiAgICAgICAgICAgICAgICB0aGlzLmRvd25sb2FkLmhyZWYgPSBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGV0ICRzdmcgPSBzZWxlY3QodGhpcy5zdmcpOwogICAgICAgICAgICAvLyBSZWFkIGFsbCB0aGUgc3R5bGUgcnVsZXMgaW4gdGhlIGRvY3VtZW50IGFuZCBlbWJlZCB0aGVtIGludG8gdGhlIHN2Zy4KICAgICAgICAgICAgLy8gVGhlIHN2ZyBuZWVkcyB0byBiZSBzZWxmIGNvbnRhaW5lZCwgaS5lLiBhbGwgdGhlIHN0eWxlIHJ1bGVzIG5lZWQgdG8gYmUKICAgICAgICAgICAgLy8gZW1iZWRkZWQgc28gdGhlIGNhbnZhcyBvdXRwdXQgbWF0Y2hlcyB0aGUgb3JpZ2luLgogICAgICAgICAgICBsZXQgc3R5bGVzVGV4dCA9ICcnOwogICAgICAgICAgICBjb25zdCBhbnlTdmcgPSB0aGlzLnN2ZzsKICAgICAgICAgICAgLy8gTVNFZGdlIGRvZXMgbm90IGhhdmUgYGdldFJvb3ROb2RlYC4gSW4gdGhhdCBjYXNlLCBtYW51YWxseSBnZXQgdGhlIHJvb3QKICAgICAgICAgICAgLy8gbm9kZS4gVGhpcyBpcyBtb3JlIGJyaXR0bGUgdGhhbiB0aGUgZ2V0Um9vdE5vZGUgYXMgY2hhbmdpbmcgRE9NIHN0cnVjdHVyZQogICAgICAgICAgICAvLyB3aWxsIGJyZWFrIHRoaXMuCiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gYW55U3ZnLmdldFJvb3ROb2RlCiAgICAgICAgICAgICAgICA/IGFueVN2Zy5nZXRSb290Tm9kZSgpCiAgICAgICAgICAgICAgICA6IHRoaXMuc3ZnLnBhcmVudE5vZGU7CiAgICAgICAgICAgIGNvbnN0IHN0eWxlU2hlZXRzID0gcm9vdE5vZGUuc3R5bGVTaGVldHM7CiAgICAgICAgICAgIGZvciAobGV0IGsgPSAwOyBrIDwgc3R5bGVTaGVldHMubGVuZ3RoOyBrKyspIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IGNzc1J1bGVzID0gc3R5bGVTaGVldHNba10uY3NzUnVsZXMgfHwgc3R5bGVTaGVldHNba10ucnVsZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNzc1J1bGVzID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3NzUnVsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRmLSogc2VsZWN0b3JzIGZyb20gdGhlIHN0eWxlcy4KICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzVGV4dCArPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzUnVsZXNbaV0uY3NzVGV4dC5yZXBsYWNlKC8gP3RmLVtcdy1dKyA/L2csICcnKSArICdcbic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZS5uYW1lICE9PSAnU2VjdXJpdHlFcnJvcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgYWRkIHRoZSBjc3MgcnVsZXMgdG8gdGhlIG1haW4gc3ZnLgogICAgICAgICAgICBsZXQgc3ZnU3R5bGUgPSAkc3ZnLmFwcGVuZCgnc3R5bGUnKTsKICAgICAgICAgICAgc3ZnU3R5bGUudGV4dChzdHlsZXNUZXh0KTsKICAgICAgICAgICAgLy8gVGVtcG9yYXJpbHkgcmVtb3ZlIHRoZSB6b29tL3BhbiB0cmFuc2Zvcm0gZnJvbSB0aGUgbWFpbiBzdmcgc2luY2Ugd2UKICAgICAgICAgICAgLy8gd2FudCB0aGUgbWluaW1hcCB0byBzaG93IGEgem9vbWVkLW91dCBhbmQgY2VudGVyZWQgdmlldy4KICAgICAgICAgICAgbGV0ICR6b29tRyA9IHNlbGVjdCh0aGlzLnpvb21HKTsKICAgICAgICAgICAgbGV0IHpvb21UcmFuc2Zvcm0gPSAkem9vbUcuYXR0cigndHJhbnNmb3JtJyk7CiAgICAgICAgICAgICR6b29tRy5hdHRyKCd0cmFuc2Zvcm0nLCBudWxsKTsKICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE1OTgKICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgU1ZHIGNvbnRlbnQgc2hpZnQuIFNWR0dyYXBoaWNzRWxlbWVudC5nZXRCQm94KCkud2lkdGggcmV0dXJucwogICAgICAgICAgICAvLyB3aWR0aCBpbiBwaXhlbCB2YWx1ZSBvZiB2ZXJ5IHRpZ2h0IGJvdW5kaW5nIGJveCBvZiBub24tZW1wdHkgY29udGVudC4KICAgICAgICAgICAgLy8gU2luY2Ugd2Ugd2FudCB0byBtZWFzdXJlIHRoZSBzY2VuZVNpemUgZnJvbSB0aGUgb3JpZ2luIHRvIHRoZSByaWdodCBtb3N0CiAgICAgICAgICAgIC8vIGVkZ2Ugb2YgdGhlIHJpZ2h0IG1vc3Qgbm9kZSwgd2UgbmVlZCB0byBhY2NvdW50IGZvciBkaXN0YW5jZSBmcm9tIHRoZQogICAgICAgICAgICAvLyBvcmlnaW4gdG8gdGhlIGxlZnQgZWRnZSBvZiB0aGUgYm91bmRpbmcgYm94LgogICAgICAgICAgICBzY2VuZVNpemUuaGVpZ2h0ICs9IHNjZW5lU2l6ZS55OwogICAgICAgICAgICBzY2VuZVNpemUud2lkdGggKz0gc2NlbmVTaXplLng7CiAgICAgICAgICAgIC8vIFNpbmNlIHdlIGFkZCBwYWRkaW5nLCBhY2NvdW50IGZvciB0aGF0IGhlcmUuCiAgICAgICAgICAgIHNjZW5lU2l6ZS5oZWlnaHQgKz0gdGhpcy5sYWJlbFBhZGRpbmcgKiAyOwogICAgICAgICAgICBzY2VuZVNpemUud2lkdGggKz0gdGhpcy5sYWJlbFBhZGRpbmcgKiAyOwogICAgICAgICAgICAvLyBUZW1wb3JhcmlseSBhc3NpZ24gYW4gZXhwbGljaXQgd2lkdGgvaGVpZ2h0IHRvIHRoZSBtYWluIHN2Zywgc2luY2UKICAgICAgICAgICAgLy8gaXQgZG9lc24ndCBoYXZlIG9uZSAodXNlcyBmbGV4LWJveCksIGJ1dCB3ZSBuZWVkIGl0IGZvciB0aGUgY2FudmFzCiAgICAgICAgICAgIC8vIHRvIHdvcmsuCiAgICAgICAgICAgICRzdmcuYXR0cignd2lkdGgnLCBzY2VuZVNpemUud2lkdGgpLmF0dHIoJ2hlaWdodCcsIHNjZW5lU2l6ZS5oZWlnaHQpOwogICAgICAgICAgICAvLyBTaW5jZSB0aGUgY29udGVudCBpbnNpZGUgdGhlIHN2ZyBjaGFuZ2VkIChlLmcuIGEgbm9kZSB3YXMgZXhwYW5kZWQpLAogICAgICAgICAgICAvLyB0aGUgYXNwZWN0IHJhdGlvIGhhdmUgYWxzbyBjaGFuZ2VkLiBUaHVzLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgc2NhbGUKICAgICAgICAgICAgLy8gZmFjdG9yIG9mIHRoZSBtaW5pbWFwLiBUaGUgc2NhbGUgZmFjdG9yIGlzIGRldGVybWluZWQgc3VjaCB0aGF0IGJvdGgKICAgICAgICAgICAgLy8gdGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIG1pbmltYXAgYXJlIDw9IG1heGltdW0gc3BlY2lmaWVkIHcvaC4KICAgICAgICAgICAgdGhpcy5zY2FsZU1pbmltYXAgPQogICAgICAgICAgICAgICAgdGhpcy5tYXhXYW5kSCAvIE1hdGgubWF4KHNjZW5lU2l6ZS53aWR0aCwgc2NlbmVTaXplLmhlaWdodCk7CiAgICAgICAgICAgIHRoaXMubWluaW1hcFNpemUgPSB7CiAgICAgICAgICAgICAgICB3aWR0aDogc2NlbmVTaXplLndpZHRoICogdGhpcy5zY2FsZU1pbmltYXAsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IHNjZW5lU2l6ZS5oZWlnaHQgKiB0aGlzLnNjYWxlTWluaW1hcCwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzaXplIG9mIHRoZSBtaW5pbWFwJ3Mgc3ZnLCB0aGUgYnVmZmVyIGNhbnZhcyBhbmQgdGhlCiAgICAgICAgICAgIC8vIHZpZXdwb2ludCByZWN0LgogICAgICAgICAgICBzZWxlY3QodGhpcy5taW5pbWFwU3ZnKS5hdHRyKHRoaXMubWluaW1hcFNpemUpOwogICAgICAgICAgICBzZWxlY3QodGhpcy5jYW52YXNCdWZmZXIpLmF0dHIodGhpcy5taW5pbWFwU2l6ZSk7CiAgICAgICAgICAgIC8vIERvd25sb2FkIGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBtdWx0aXBsZXMgb2YgdGhlIHN0eWxlIHdpZHRoIGFuZAogICAgICAgICAgICAvLyBoZWlnaHQgaW4gb3JkZXIgdG8gaW5jcmVhc2UgcGl4ZWwgZGVuc2l0eSBvZiB0aGUgUE5HIGZvciBjbGFyaXR5LgogICAgICAgICAgICBjb25zdCBkb3dubG9hZENhbnZhc1NlbGVjdGlvbiA9IHNlbGVjdCh0aGlzLmRvd25sb2FkQ2FudmFzKTsKICAgICAgICAgICAgZG93bmxvYWRDYW52YXNTZWxlY3Rpb24uc3R5bGUoJ3dpZHRoJywgc2NlbmVTaXplLndpZHRoKTsKICAgICAgICAgICAgZG93bmxvYWRDYW52YXNTZWxlY3Rpb24uc3R5bGUoJ2hlaWdodCcsIHNjZW5lU2l6ZS5oZWlnaHQpOwogICAgICAgICAgICBkb3dubG9hZENhbnZhc1NlbGVjdGlvbi5hdHRyKCd3aWR0aCcsIDMgKiBzY2VuZVNpemUud2lkdGgpOwogICAgICAgICAgICBkb3dubG9hZENhbnZhc1NlbGVjdGlvbi5hdHRyKCdoZWlnaHQnLCAzICogc2NlbmVTaXplLmhlaWdodCk7CiAgICAgICAgICAgIGlmICh0aGlzLnRyYW5zbGF0ZSAhPSBudWxsICYmIHRoaXMuem9vbSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHZpZXdwb2ludCByZWN0YW5nbGUgc2hhcGUgc2luY2UgdGhlIGFzcGVjdCByYXRpbyBvZiB0aGUKICAgICAgICAgICAgICAgIC8vIG1hcCBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLnpvb20oKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVE9ETyhzdGVwaGFud2xlZSk6IENvbnNpZGVyIG5vdCBtdXRhdGluZyB0aGUgb3JpZ2luYWwgRE9NIHRoZW4gcmVhZCBpdCAtLQogICAgICAgICAgICAvLyB0aGlzIG1heSBjYXVzZSByZWZsb3cuCiAgICAgICAgICAgIC8vIFNlcmlhbGl6ZSB0aGUgbWFpbiBzdmcgdG8gYSBzdHJpbmcgd2hpY2ggd2lsbCBiZSB1c2VkIGFzIHRoZSByZW5kZXJpbmcKICAgICAgICAgICAgLy8gY29udGVudCBmb3IgdGhlIGNhbnZhcy4KICAgICAgICAgICAgbGV0IHN2Z1htbCA9IG5ldyBYTUxTZXJpYWxpemVyKCkuc2VyaWFsaXplVG9TdHJpbmcodGhpcy5zdmcpOwogICAgICAgICAgICAvLyBOb3cgdGhhdCB0aGUgc3ZnIGlzIHNlcmlhbGl6ZWQgZm9yIHJlbmRlcmluZywgcmVtb3ZlIHRoZSB0ZW1wb3JhcmlseQogICAgICAgICAgICAvLyBhc3NpZ25lZCBzdHlsZXMsIGV4cGxpY2l0IHdpZHRoIGFuZCBoZWlnaHQgYW5kIGJyaW5nIGJhY2sgdGhlIHBhbi96b29tCiAgICAgICAgICAgIC8vIHRyYW5zZm9ybS4KICAgICAgICAgICAgc3ZnU3R5bGUucmVtb3ZlKCk7CiAgICAgICAgICAgICRzdmcuYXR0cignd2lkdGgnLCBudWxsKS5hdHRyKCdoZWlnaHQnLCBudWxsKTsKICAgICAgICAgICAgJHpvb21HLmF0dHIoJ3RyYW5zZm9ybScsIHpvb21UcmFuc2Zvcm0pOwogICAgICAgICAgICBsZXQgaW1hZ2UgPSBuZXcgSW1hZ2UoKTsKICAgICAgICAgICAgaW1hZ2Uub25sb2FkID0gKCkgPT4gewogICAgICAgICAgICAgICAgLy8gRHJhdyB0aGUgc3ZnIGNvbnRlbnQgb250byB0aGUgYnVmZmVyIGNhbnZhcy4KICAgICAgICAgICAgICAgIGxldCBjb250ZXh0ID0gdGhpcy5jYW52YXNCdWZmZXIuZ2V0Q29udGV4dCgnMmQnKTsKICAgICAgICAgICAgICAgIGNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHRoaXMuY2FudmFzQnVmZmVyLndpZHRoLCB0aGlzLmNhbnZhc0J1ZmZlci5oZWlnaHQpOwogICAgICAgICAgICAgICAgY29udGV4dC5kcmF3SW1hZ2UoaW1hZ2UsIDAsIDAsIHRoaXMubWluaW1hcFNpemUud2lkdGgsIHRoaXMubWluaW1hcFNpemUuaGVpZ2h0KTsKICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gSGlkZSB0aGUgb2xkIGNhbnZhcyBhbmQgc2hvdyB0aGUgbmV3IGJ1ZmZlciBjYW52YXMuCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMuY2FudmFzQnVmZmVyKS5zdHlsZSgnZGlzcGxheScsIG51bGwpOwogICAgICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzLmNhbnZhcykuc3R5bGUoJ2Rpc3BsYXknLCAnbm9uZScpOwogICAgICAgICAgICAgICAgICAgIC8vIFN3YXAgdGhlIHR3byBjYW52YXNlcy4KICAgICAgICAgICAgICAgICAgICBbdGhpcy5jYW52YXMsIHRoaXMuY2FudmFzQnVmZmVyXSA9IFt0aGlzLmNhbnZhc0J1ZmZlciwgdGhpcy5jYW52YXNdOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBsZXQgZG93bmxvYWRDb250ZXh0ID0gdGhpcy5kb3dubG9hZENhbnZhcy5nZXRDb250ZXh0KCcyZCcpOwogICAgICAgICAgICAgICAgZG93bmxvYWRDb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB0aGlzLmRvd25sb2FkQ2FudmFzLndpZHRoLCB0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgICAgICBkb3dubG9hZENvbnRleHQuZHJhd0ltYWdlKGltYWdlLCAwLCAwLCB0aGlzLmRvd25sb2FkQ2FudmFzLndpZHRoLCB0aGlzLmRvd25sb2FkQ2FudmFzLmhlaWdodCk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGltYWdlLm9uZXJyb3IgPSAoKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKFtzdmdYbWxdLCB7IHR5cGU6ICdpbWFnZS9zdmcreG1sO2NoYXJzZXQ9dXRmLTgnIH0pOwogICAgICAgICAgICAgICAgaW1hZ2Uuc3JjID0gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaW1hZ2Uuc3JjID0KICAgICAgICAgICAgICAgICdkYXRhOmltYWdlL3N2Zyt4bWw7Y2hhcnNldD11dGYtOCwnICsgZW5jb2RlVVJJQ29tcG9uZW50KHN2Z1htbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgY2hhbmdlcyBpbiB6b29taW5nL3Bhbm5pbmcuIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgbWFpbiBzdmcKICAgICAgICAgKiB0byBub3RpZnkgdGhhdCBhIHpvb20vcGFuIHdhcyBwZXJmb3JtZWQgYW5kIHRoaXMgbWluaW1hcCB3aWxsIHVwZGF0ZSBpdCdzCiAgICAgICAgICogdmlld3BvaW50IHJlY3RhbmdsZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB0cmFuc2xhdGUgVGhlIHRyYW5zbGF0ZSB2ZWN0b3IsIG9yIG5vbmUgdG8gdXNlIHRoZSBsYXN0IHVzZWQgb25lLgogICAgICAgICAqIEBwYXJhbSBzY2FsZSBUaGUgc2NhbGluZyBmYWN0b3IsIG9yIG5vbmUgdG8gdXNlIHRoZSBsYXN0IHVzZWQgb25lLgogICAgICAgICAqLwogICAgICAgIHpvb20odHJhbnNmb3JtKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNjYWxlTWluaW1hcCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBTY2VuZSBpcyBub3QgcmVhZHkgeWV0LgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV3IHRyYW5zbGF0ZSBhbmQgc2NhbGUgcGFyYW1zLCBvbmx5IGlmIHNwZWNpZmllZC4KICAgICAgICAgICAgaWYgKHRyYW5zZm9ybSkgewogICAgICAgICAgICAgICAgdGhpcy50cmFuc2xhdGUgPSBbdHJhbnNmb3JtLngsIHRyYW5zZm9ybS55XTsKICAgICAgICAgICAgICAgIHRoaXMuc2NhbGVNYWluID0gdHJhbnNmb3JtLms7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBsb2NhdGlvbiBvZiB0aGUgdmlld3BvaW50IHJlY3RhbmdsZS4KICAgICAgICAgICAgbGV0IHN2Z1JlY3QgPSB0aGlzLnN2Zy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgbGV0ICR2aWV3cG9pbnQgPSBzZWxlY3QodGhpcy52aWV3cG9pbnQpOwogICAgICAgICAgICB0aGlzLnZpZXdwb2ludENvb3JkLnggPQogICAgICAgICAgICAgICAgKC10aGlzLnRyYW5zbGF0ZVswXSAqIHRoaXMuc2NhbGVNaW5pbWFwKSAvIHRoaXMuc2NhbGVNYWluOwogICAgICAgICAgICB0aGlzLnZpZXdwb2ludENvb3JkLnkgPQogICAgICAgICAgICAgICAgKC10aGlzLnRyYW5zbGF0ZVsxXSAqIHRoaXMuc2NhbGVNaW5pbWFwKSAvIHRoaXMuc2NhbGVNYWluOwogICAgICAgICAgICBsZXQgdmlld3BvaW50V2lkdGggPSAoc3ZnUmVjdC53aWR0aCAqIHRoaXMuc2NhbGVNaW5pbWFwKSAvIHRoaXMuc2NhbGVNYWluOwogICAgICAgICAgICBsZXQgdmlld3BvaW50SGVpZ2h0ID0gKHN2Z1JlY3QuaGVpZ2h0ICogdGhpcy5zY2FsZU1pbmltYXApIC8gdGhpcy5zY2FsZU1haW47CiAgICAgICAgICAgICR2aWV3cG9pbnQKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgdGhpcy52aWV3cG9pbnRDb29yZC54KQogICAgICAgICAgICAgICAgLmF0dHIoJ3knLCB0aGlzLnZpZXdwb2ludENvb3JkLnkpCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB2aWV3cG9pbnRXaWR0aCkKICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB2aWV3cG9pbnRIZWlnaHQpOwogICAgICAgICAgICAvLyBTaG93L2hpZGUgdGhlIG1pbmltYXAgZGVwZW5kaW5nIG9uIHRoZSB2aWV3cG9pbnQgYXJlYSBhcyBmcmFjdGlvbiBvZiB0aGUKICAgICAgICAgICAgLy8gd2hvbGUgbWluaW1hcC4KICAgICAgICAgICAgbGV0IG1hcFdpZHRoID0gdGhpcy5taW5pbWFwU2l6ZS53aWR0aDsKICAgICAgICAgICAgbGV0IG1hcEhlaWdodCA9IHRoaXMubWluaW1hcFNpemUuaGVpZ2h0OwogICAgICAgICAgICBsZXQgeCA9IHRoaXMudmlld3BvaW50Q29vcmQueDsKICAgICAgICAgICAgbGV0IHkgPSB0aGlzLnZpZXdwb2ludENvb3JkLnk7CiAgICAgICAgICAgIGxldCB3ID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeCArIHZpZXdwb2ludFdpZHRoKSwgbWFwV2lkdGgpIC0KICAgICAgICAgICAgICAgIE1hdGgubWluKE1hdGgubWF4KDAsIHgpLCBtYXBXaWR0aCk7CiAgICAgICAgICAgIGxldCBoID0gTWF0aC5taW4oTWF0aC5tYXgoMCwgeSArIHZpZXdwb2ludEhlaWdodCksIG1hcEhlaWdodCkgLQogICAgICAgICAgICAgICAgTWF0aC5taW4oTWF0aC5tYXgoMCwgeSksIG1hcEhlaWdodCk7CiAgICAgICAgICAgIGxldCBmcmFjSW50ZXJzZWN0ID0gKHcgKiBoKSAvIChtYXBXaWR0aCAqIG1hcEhlaWdodCk7CiAgICAgICAgICAgIGlmIChmcmFjSW50ZXJzZWN0IDwgRlJBQ19WSUVXUE9JTlRfQVJFQSkgewogICAgICAgICAgICAgICAgdGhpcy5taW5pbWFwLmNsYXNzTGlzdC5yZW1vdmUoJ2hpZGRlbicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5taW5pbWFwLmNsYXNzTGlzdC5hZGQoJ2hpZGRlbicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmR3JhcGhNaW5pbWFwID0gY2xhc3MgVGZHcmFwaE1pbmltYXAgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogSW5pdGlhbGl6ZXMgdGhlIG1pbmltYXAgYW5kIHJldHVybnMgYSBtaW5pbWFwIG9iamVjdCB0byBub3RpZnkgd2hlbgogICAgICAgICAqIHRoaW5ncyB1cGRhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gc3ZnIFRoZSBtYWluIHN2ZyBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB6b29tRyBUaGUgc3ZnIGdyb3VwIHVzZWQgZm9yIHBhbm5pbmcgYW5kIHpvb21pbmcgdGhlIG1haW4gc3ZnLgogICAgICAgICAqIEBwYXJhbSBtYWluWm9vbSBUaGUgbWFpbiB6b29tIGJlaGF2aW9yLgogICAgICAgICAqIEBwYXJhbSBtYXhXQW5kSCBUaGUgbWF4aW11bSB3aWR0aC9oZWlnaHQgZm9yIHRoZSBtaW5pbWFwLgogICAgICAgICAqIEBwYXJhbSBsYWJlbFBhZGRpbmcgUGFkZGluZyBpbiBwaXhlbHMgZHVlIHRvIHRoZSBtYWluIGdyYXBoIGxhYmVscy4KICAgICAgICAgKi8KICAgICAgICBpbml0KHN2Zywgem9vbUcsIG1haW5ab29tLCBtYXhXQW5kSCwgbGFiZWxQYWRkaW5nKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTWluaW1hcChzdmcsIHpvb21HLCBtYWluWm9vbSwgdGhpcywgbWF4V0FuZEgsIGxhYmVsUGFkZGluZyk7CiAgICAgICAgfQogICAgfTsKICAgIFRmR3JhcGhNaW5pbWFwLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuM3MgbGluZWFyOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdCguaGlkZGVuKSB7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBwb2ludGVyLWV2ZW50czogbm9uZTsKICAgICAgfQoKICAgICAgY2FudmFzIHsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjOTk5OwogICAgICB9CgogICAgICByZWN0IHsKICAgICAgICBmaWxsOiB3aGl0ZTsKICAgICAgICBzdHJva2U6ICMxMTExMTE7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbHRlcjogdXJsKCNtaW5pbWFwRHJvcFNoYWRvdyk7CiAgICAgICAgY3Vyc29yOiBtb3ZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICAgIDxzdmc+CiAgICAgIDxkZWZzPgogICAgICAgIDxmaWx0ZXIKICAgICAgICAgIGlkPSJtaW5pbWFwRHJvcFNoYWRvdyIKICAgICAgICAgIHg9Ii0yMCUiCiAgICAgICAgICB5PSItMjAlIgogICAgICAgICAgd2lkdGg9IjE1MCUiCiAgICAgICAgICBoZWlnaHQ9IjE1MCUiCiAgICAgICAgPgogICAgICAgICAgPGZlT2Zmc2V0IHJlc3VsdD0ib2ZmT3V0IiBpbj0iU291cmNlR3JhcGhpYyIgZHg9IjEiIGR5PSIxIj48L2ZlT2Zmc2V0PgogICAgICAgICAgPGZlQ29sb3JNYXRyaXgKICAgICAgICAgICAgcmVzdWx0PSJtYXRyaXhPdXQiCiAgICAgICAgICAgIGluPSJvZmZPdXQiCiAgICAgICAgICAgIHR5cGU9Im1hdHJpeCIKICAgICAgICAgICAgdmFsdWVzPSIwLjEgMCAwIDAgMCAwIDAuMSAwIDAgMCAwIDAgMC4xIDAgMCAwIDAgMCAwLjUgMCIKICAgICAgICAgID48L2ZlQ29sb3JNYXRyaXg+CiAgICAgICAgICA8ZmVHYXVzc2lhbkJsdXIKICAgICAgICAgICAgcmVzdWx0PSJibHVyT3V0IgogICAgICAgICAgICBpbj0ibWF0cml4T3V0IgogICAgICAgICAgICBzdGREZXZpYXRpb249IjIiCiAgICAgICAgICA+PC9mZUdhdXNzaWFuQmx1cj4KICAgICAgICAgIDxmZUJsZW5kIGluPSJTb3VyY2VHcmFwaGljIiBpbjI9ImJsdXJPdXQiIG1vZGU9Im5vcm1hbCI+PC9mZUJsZW5kPgogICAgICAgIDwvZmlsdGVyPgogICAgICA8L2RlZnM+CiAgICAgIDxyZWN0PjwvcmVjdD4KICAgIDwvc3ZnPgogICAgPGNhbnZhcyBjbGFzcz0iZmlyc3QiPjwvY2FudmFzPgogICAgPCEtLSBBZGRpdGlvbmFsIGNhbnZhcyB0byB1c2UgYXMgYnVmZmVyIHRvIGF2b2lkIGZsaWNrZXJpbmcgYmV0d2VlbiB1cGRhdGVzIC0tPgogICAgPGNhbnZhcyBjbGFzcz0ic2Vjb25kIj48L2NhbnZhcz4KICAgIDxjYW52YXMgY2xhc3M9ImRvd25sb2FkIj48L2NhbnZhcz4KICBgOwogICAgVGZHcmFwaE1pbmltYXAgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ncmFwaC1taW5pbWFwJykKICAgIF0sIFRmR3JhcGhNaW5pbWFwKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNvbnN0IHRlbXBsYXRlJGogPSBodG1sIGAKICA8c3R5bGU+CiAgICA6aG9zdCB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIGZvbnQtc2l6ZTogMjBweDsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAjc3ZnIHsKICAgICAgZmxleDogMTsKICAgICAgZm9udC1mYW1pbHk6IFJvYm90bywgc2Fucy1zZXJpZjsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICAjaGlkZGVuIHsKICAgICAgcG9zaXRpb246IGZpeGVkOwogICAgICB0b3A6IDBweDsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIC8qIC0tLSBOb2RlIGFuZCBhbm5vdGF0aW9uLW5vZGUgZm9yIE1ldGFub2RlIC0tLSAqLwoKICAgIC5tZXRhID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAubWV0YSA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiBoc2woMCwgMCUsIDcwJSk7CiAgICB9CiAgICAubm9kZS5tZXRhLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAubm9kZS5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CiAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAuYW5ub3RhdGlvbi5tZXRhLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICB9CiAgICAubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLm1ldGEuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CiAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLm5vZGVzaGFwZSA+IHJlY3QsCiAgICAubm9kZS5tZXRhLnNlbGVjdGVkLmV4cGFuZGVkID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAzOwogICAgfQogICAgLmFubm90YXRpb24ubWV0YS5zZWxlY3RlZCA+IC5ub2Rlc2hhcGUgPiByZWN0LAogICAgLmFubm90YXRpb24ubWV0YS5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCwKICAgIC5ub2RlLm1ldGEuc2VsZWN0ZWQuZXhwYW5kZWQuaGlnaGxpZ2h0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDQ7CiAgICB9CgogICAgLmZhZGVkLAogICAgLmZhZGVkIHJlY3QsCiAgICAuZmFkZWQgZWxsaXBzZSwKICAgIC5mYWRlZCBwYXRoLAogICAgLmZhZGVkIHVzZSwKICAgICNyZWN0SGF0Y2ggbGluZSwKICAgICNlbGxpcHNlSGF0Y2ggbGluZSB7CiAgICAgIGNvbG9yOiAjZTBkNGIzICFpbXBvcnRhbnQ7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6ICNlMGQ0YjMgIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmFkZWQgcGF0aCB7CiAgICAgIHN0cm9rZS13aWR0aDogMXB4ICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLmZhZGVkIHJlY3QgewogICAgICBmaWxsOiB1cmwoI3JlY3RIYXRjaCkgIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmFkZWQgZWxsaXBzZSwKICAgIC5mYWRlZCB1c2UgewogICAgICBmaWxsOiB1cmwoI2VsbGlwc2VIYXRjaCkgIWltcG9ydGFudDsKICAgIH0KCiAgICAuZmFkZWQgdGV4dCB7CiAgICAgIG9wYWNpdHk6IDA7CiAgICB9CgogICAgLyogUnVsZXMgdXNlZCBmb3IgaW5wdXQtdHJhY2luZy4gKi8KICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gcmVjdCwKICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gZWxsaXBzZSwKICAgIC5pbnB1dC1oaWdobGlnaHQgPiAqID4gdXNlIHsKICAgICAgZmlsbDogd2hpdGU7CiAgICAgIHN0cm9rZTogI2ZmOTgwMCAhaW1wb3J0YW50OwogICAgfQoKICAgIC8qICAtIEZhZGVkIG5vbi1pbnB1dCBzdHlsaW5nICovCiAgICAubm9uLWlucHV0ID4gKiA+IHJlY3QsCi5ub24taW5wdXQgPiAqID4gZWxsaXBzZSwKLm5vbi1pbnB1dCA+ICogPiB1c2UsCi8qIEZvciBDb25zdCBub2Rlcy4gKi8KLm5vbi1pbnB1dCA+ICogPiAuY29uc3RhbnQ6bm90KFtjbGFzcyo9ImlucHV0LWhpZ2hsaWdodCJdKSA+CiAgLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UsCi8qIEZvciBzdHlsaW5nIG9mIGFubm90YXRpb24gbm9kZXMgb2Ygbm9uLWlucHV0IG5vZGVzLiAqLwoubm9uLWlucHV0ID4gZyA+IC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbm9kZSA+IHJlY3QgewogICAgICBzdHJva2U6ICNlMGQ0YjMgIWltcG9ydGFudDsKICAgICAgc3Ryb2tlLXdpZHRoOiBpbmhlcml0OwogICAgICBzdHJva2UtZGFzaGFycmF5OiBpbmhlcml0OwogICAgfQoKICAgIC5ub24taW5wdXQgcGF0aCB7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICAubm9uLWlucHV0ID4gLm5vZGVzaGFwZSA+IHJlY3QsCi5ub24taW5wdXQgPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCwKLyogRm9yIHN0eWxpbmcgb2YgYW5ub3RhdGlvbiBub2RlcyBvZiBub24taW5wdXQgbm9kZXMuICovCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gcmVjdCB7CiAgICAgIGZpbGw6IHVybCgjcmVjdEhhdGNoKSAhaW1wb3J0YW50OwogICAgfQoKICAgIC5ub24taW5wdXQgZWxsaXBzZSwKICAgIC5ub24taW5wdXQgdXNlIHsKICAgICAgZmlsbDogdXJsKCNlbGxpcHNlSGF0Y2gpICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLm5vbi1pbnB1dCA+IHRleHQgewogICAgICBvcGFjaXR5OiAwOwogICAgfQoKICAgIC5ub24taW5wdXQgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICB9CgogICAgLm5vbi1pbnB1dCAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWVkZ2UucmVmbGluZSB7CiAgICAgIG1hcmtlci1zdGFydDogdXJsKCNyZWYtYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgfQoKICAgIC8qIElucHV0IGVkZ2VzLiAqLwogICAgLmlucHV0LWVkZ2UtaGlnaGxpZ2h0ID4gdGV4dCB7CiAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICB9CiAgICAuaW5wdXQtaGlnaGxpZ2h0ID4gLmluLWFubm90YXRpb25zID4gLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlLAogICAgLmlucHV0LWhpZ2hsaWdodC1zZWxlY3RlZAogICAgICA+IC5pbi1hbm5vdGF0aW9ucwogICAgICA+IC5hbm5vdGF0aW9uCiAgICAgID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgIHN0cm9rZTogIzk5OSAhaW1wb3J0YW50OwogICAgfQoKICAgIC8qIE5vbi1pbnB1dCBlZGdlcy4gKi8KICAgIC5ub24taW5wdXQtZWRnZS1oaWdobGlnaHQsCi5ub24taW5wdXQgPiBnID4gLmFubm90YXRpb24gPiBwYXRoLAovKiBBbm5vdGF0aW9uIHN0eWxlcyAobGFiZWwgYW5kIGVkZ2VzIHJlc3BlY3RpdmVseSkuICovCi5ub24taW5wdXQgPiBnID4KLmFubm90YXRpb246bm90KC5pbnB1dC1oaWdobGlnaHQpOm5vdCguaW5wdXQtaGlnaGxpZ2h0LXNlbGVjdGVkKSA+Ci5hbm5vdGF0aW9uLWxhYmVsCi8qLmFubm90YXRpb24tZWRnZSovIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgfQoKICAgIC8qIC0tLSBPcCBOb2RlIC0tLSAqLwoKICAgIC5vcCA+IC5ub2Rlc2hhcGUgPiAubm9kZWNvbG9ydGFyZ2V0LAogICAgLm9wID4gLmFubm90YXRpb24tbm9kZSA+IC5ub2RlY29sb3J0YXJnZXQgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6ICNmZmY7CiAgICAgIHN0cm9rZTogI2NjYzsKICAgIH0KCiAgICAub3Auc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgIC5vcC5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KCiAgICAub3AuaGlnaGxpZ2h0ZWQgPiAubm9kZXNoYXBlID4gLm5vZGVjb2xvcnRhcmdldCwKICAgIC5vcC5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiAubm9kZWNvbG9ydGFyZ2V0IHsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC8qIC0tLSBTZXJpZXMgTm9kZSAtLS0gKi8KCiAgICAvKiBCeSBkZWZhdWx0LCBkb24ndCBzaG93IHRoZSBzZXJpZXMgYmFja2dyb3VuZCA8cmVjdD4uICovCiAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHJlY3QgewogICAgICBmaWxsOiBoc2woMCwgMCUsIDcwJSk7CiAgICAgIGZpbGwtb3BhY2l0eTogMDsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogNSwgNTsKICAgICAgc3Ryb2tlLW9wYWNpdHk6IDA7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KCiAgICAvKiBPbmNlIGV4cGFuZGVkLCBzaG93IHRoZSBzZXJpZXMgYmFja2dyb3VuZCA8cmVjdD4gYW5kIGhpZGUgdGhlIDx1c2U+LiAqLwogICAgLnNlcmllcy5leHBhbmRlZCA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgZmlsbC1vcGFjaXR5OiAwLjE1OwogICAgICBzdHJva2U6IGhzbCgwLCAwJSwgNzAlKTsKICAgICAgc3Ryb2tlLW9wYWNpdHk6IDE7CiAgICB9CiAgICAuc2VyaWVzLmV4cGFuZGVkID4gLm5vZGVzaGFwZSA+IHVzZSB7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICAvKioKICogVE9ETzogU2ltcGxpZnkgdGhpcyBieSBhcHBseWluZyBhIHN0YWJsZSBjbGFzcyBuYW1lIHRvIGFsbCA8Zz4KICogZWxlbWVudHMgdGhhdCBjdXJyZW50bHkgaGF2ZSBlaXRoZXIgdGhlIG5vZGVzaGFwZSBvciBhbm5vdGF0aW9uLW5vZGUgY2xhc3Nlcy4KICovCiAgICAuc2VyaWVzID4gLm5vZGVzaGFwZSA+IHVzZSwKICAgIC5zZXJpZXMgPiAuYW5ub3RhdGlvbi1ub2RlID4gdXNlIHsKICAgICAgc3Ryb2tlOiAjY2NjOwogICAgfQogICAgLnNlcmllcy5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiB1c2UsCiAgICAuc2VyaWVzLmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IHVzZSB7CiAgICAgIHN0cm9rZS13aWR0aDogMjsKICAgIH0KICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gdXNlLAogICAgLnNlcmllcy5zZWxlY3RlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiB1c2UgewogICAgICBzdHJva2U6IHJlZDsKICAgICAgc3Ryb2tlLXdpZHRoOiAyOwogICAgfQoKICAgIC5zZXJpZXMuc2VsZWN0ZWQgPiAubm9kZXNoYXBlID4gcmVjdCB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CgogICAgLmFubm90YXRpb24uc2VyaWVzLnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IHVzZSB7CiAgICAgIHN0cm9rZTogcmVkOwogICAgICBzdHJva2Utd2lkdGg6IDI7CiAgICB9CgogICAgLyogLS0tIEJyaWRnZSBOb2RlIC0tLSAqLwogICAgLmJyaWRnZSA+IC5ub2Rlc2hhcGUgPiByZWN0IHsKICAgICAgc3Ryb2tlOiAjZjBmOwogICAgICBvcGFjaXR5OiAwLjI7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLyogLS0tIFN0cnVjdHVyYWwgRWxlbWVudHMgLS0tICovCiAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUuc3RydWN0dXJhbCB7CiAgICAgIHN0cm9rZTogI2YwZjsKICAgICAgb3BhY2l0eTogMC4yOwogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC8qIFJlZmVyZW5jZSBFZGdlICovCiAgICAuZWRnZSA+IHBhdGguZWRnZWxpbmUucmVmZXJlbmNlZWRnZSB7CiAgICAgIHN0cm9rZTogI2ZmYjc0ZDsKICAgICAgb3BhY2l0eTogMTsKICAgIH0KCiAgICAvKiAtLS0gU2VyaWVzIE5vZGVzIC0tLSAqLwoKICAgIC8qIEhpZGUgdGhlIHJlY3QgZm9yIGEgc2VyaWVzJyBhbm5vdGF0aW9uLiAqLwogICAgLnNlcmllcyA+IC5hbm5vdGF0aW9uLW5vZGUgPiByZWN0IHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAvKiAtLS0gTm9kZSBsYWJlbCAtLS0gKi8KCiAgICAubm9kZSA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiAjNDQ0OwogICAgfQoKICAgIC5tZXRhLmV4cGFuZGVkID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBmb250LXNpemU6IDlweDsKICAgIH0KCiAgICAuc2VyaWVzID4gdGV4dC5ub2RlbGFiZWwgewogICAgICBmb250LXNpemU6IDhweDsKICAgIH0KCiAgICAub3AgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGZvbnQtc2l6ZTogNnB4OwogICAgfQoKICAgIC5icmlkZ2UgPiB0ZXh0Lm5vZGVsYWJlbCB7CiAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICB9CgogICAgLm5vZGUubWV0YS5leHBhbmRlZCA+IHRleHQubm9kZWxhYmVsIHsKICAgICAgY3Vyc29yOiBub3JtYWw7CiAgICB9CgogICAgLmFubm90YXRpb24ubWV0YS5oaWdobGlnaHRlZCA+IHRleHQuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgIGZpbGw6ICM1MGEzZjc7CiAgICB9CgogICAgLmFubm90YXRpb24ubWV0YS5zZWxlY3RlZCA+IHRleHQuYW5ub3RhdGlvbi1sYWJlbCB7CiAgICAgIGZpbGw6ICM0Mjg1ZjQ7CiAgICB9CgogICAgLyogLS0tIEFubm90YXRpb24gLS0tICovCgogICAgLyogb25seSBhcHBsaWVkIGZvciBhbm5vdGF0aW9ucyB0aGF0IGFyZSBub3Qgc3VtbWFyeSBvciBjb25zdGFudC4KKC5zdW1tYXJ5LCAuY29uc3RhbnQgZ2V0cyBvdmVycmlkZGVuIGJlbG93KSAqLwogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1ub2RlID4gKiB7CiAgICAgIHN0cm9rZS13aWR0aDogMC41OwogICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgfQoKICAgIC5hbm5vdGF0aW9uLnN1bW1hcnkgPiAuYW5ub3RhdGlvbi1ub2RlID4gKiwKICAgIC5hbm5vdGF0aW9uLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+ICogewogICAgICBzdHJva2Utd2lkdGg6IDE7CiAgICAgIHN0cm9rZS1kYXNoYXJyYXk6IG5vbmU7CiAgICB9CgogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1lZGdlIHsKICAgICAgZmlsbDogbm9uZTsKICAgICAgc3Ryb2tlOiAjYWFhOwogICAgICBzdHJva2Utd2lkdGg6IDAuNTsKICAgICAgbWFya2VyLWVuZDogdXJsKCNhbm5vdGF0aW9uLWFycm93aGVhZCk7CiAgICB9CgogICAgLmZhZGVkIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZSB7CiAgICAgIG1hcmtlci1lbmQ6IHVybCgjYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQpOwogICAgfQoKICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZCk7CiAgICB9CgogICAgLmZhZGVkIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tZWRnZS5yZWZsaW5lIHsKICAgICAgbWFya2VyLXN0YXJ0OiB1cmwoI3JlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCk7CiAgICB9CgogICAgLmFubm90YXRpb24gPiAuYW5ub3RhdGlvbi1jb250cm9sLWVkZ2UgewogICAgICBzdHJva2UtZGFzaGFycmF5OiAxLCAxOwogICAgfQoKICAgICNhbm5vdGF0aW9uLWFycm93aGVhZCB7CiAgICAgIGZpbGw6ICNhYWE7CiAgICB9CgogICAgI2Fubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIHsKICAgICAgZmlsbDogI2UwZDRiMzsKICAgIH0KCiAgICAjcmVmLWFubm90YXRpb24tYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2FhYTsKICAgIH0KCiAgICAjcmVmLWFubm90YXRpb24tYXJyb3doZWFkLWZhZGVkIHsKICAgICAgZmlsbDogI2UwZDRiMzsKICAgIH0KCiAgICAuYW5ub3RhdGlvbiA+IC5hbm5vdGF0aW9uLWxhYmVsIHsKICAgICAgZm9udC1zaXplOiA1cHg7CiAgICAgIGN1cnNvcjogcG9pbnRlcjsKICAgIH0KICAgIC5hbm5vdGF0aW9uID4gLmFubm90YXRpb24tbGFiZWwuYW5ub3RhdGlvbi1lbGxpcHNpcyB7CiAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgIH0KCiAgICAvKiBIaWRlIGFubm90YXRpb25zIG9uIGV4cGFuZGVkIG1ldGEgbm9kZXMgc2luY2UgdGhleSdyZSByZWR1bmRhbnQuICovCiAgICAuZXhwYW5kZWQgPiAuaW4tYW5ub3RhdGlvbnMsCiAgICAuZXhwYW5kZWQgPiAub3V0LWFubm90YXRpb25zIHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KCiAgICAvKiAtLS0gQW5ub3RhdGlvbjogQ29uc3RhbnQgLS0tICovCgogICAgLmNvbnN0YW50ID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIGZpbGw6IHdoaXRlOwogICAgICBzdHJva2U6ICM4NDg0ODQ7CiAgICB9CgogICAgLmNvbnN0YW50LnNlbGVjdGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBmaWxsOiB3aGl0ZTsKICAgICAgc3Ryb2tlOiByZWQ7CiAgICB9CgogICAgLmNvbnN0YW50LmhpZ2hsaWdodGVkID4gLmFubm90YXRpb24tbm9kZSA+IGVsbGlwc2UgewogICAgICBzdHJva2Utd2lkdGg6IDEuNTsKICAgIH0KCiAgICAvKiAtLS0gQW5ub3RhdGlvbjogU3VtbWFyeSAtLS0gKi8KCiAgICAuc3VtbWFyeSA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgICBmaWxsOiAjZGI0NDM3OwogICAgICBzdHJva2U6ICNkYjQ0Mzc7CiAgICB9CgogICAgLnN1bW1hcnkuc2VsZWN0ZWQgPiAuYW5ub3RhdGlvbi1ub2RlID4gZWxsaXBzZSB7CiAgICAgIGZpbGw6ICNhNTI3MTQ7CiAgICAgIHN0cm9rZTogI2E1MjcxNDsKICAgIH0KCiAgICAuc3VtbWFyeS5oaWdobGlnaHRlZCA+IC5hbm5vdGF0aW9uLW5vZGUgPiBlbGxpcHNlIHsKICAgICAgc3Ryb2tlLXdpZHRoOiAxLjU7CiAgICB9CgogICAgLyogLS0tIEVkZ2UgLS0tICovCgogICAgLmVkZ2UgPiBwYXRoLmVkZ2VsaW5lIHsKICAgICAgZmlsbDogbm9uZTsKICAgICAgc3Ryb2tlOiAjYmJiOwogICAgICBzdHJva2UtbGluZWNhcDogcm91bmQ7CiAgICAgIHN0cm9rZS13aWR0aDogMC43NTsKICAgIH0KCiAgICAuZWRnZSAuc2VsZWN0YWJsZWVkZ2UgewogICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICB9CgogICAgLnNlbGVjdGVkZWRnZSA+IHBhdGguZWRnZWxpbmUgewogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICAgIHN0cm9rZTogI2YwMDsKICAgIH0KCiAgICAuZWRnZS5zZWxlY3RlZGVkZ2UgdGV4dCB7CiAgICAgIGZpbGw6ICMwMDA7CiAgICB9CgogICAgLyogTGFiZWxzIHNob3dpbmcgdGVuc29yIHNoYXBlcyBvbiBlZGdlcyAqLwogICAgLmVkZ2UgPiB0ZXh0IHsKICAgICAgZm9udC1zaXplOiAzLjVweDsKICAgICAgZmlsbDogIzY2NjsKICAgIH0KCiAgICAuZGF0YWZsb3ctYXJyb3doZWFkIHsKICAgICAgZmlsbDogI2JiYjsKICAgIH0KCiAgICAucmVmZXJlbmNlLWFycm93aGVhZCB7CiAgICAgIGZpbGw6ICNmZmI3NGQ7CiAgICB9CgogICAgLnNlbGVjdGVkLWFycm93aGVhZCB7CiAgICAgIGZpbGw6ICNmMDA7CiAgICB9CgogICAgLmVkZ2UgLmNvbnRyb2wtZGVwIHsKICAgICAgc3Ryb2tlLWRhc2hhcnJheTogMiwgMjsKICAgIH0KCiAgICAvKiAtLS0gR3JvdXAgbm9kZSBleHBhbmQvY29sbGFwc2UgYnV0dG9uIC0tLSAqLwoKICAgIC8qIEhpZGVzIGV4cGFuZC9jb2xsYXBzZSBidXR0b25zIHdoZW4gYSBub2RlIGlzbid0IGV4cGFuZGVkIG9yIGhpZ2hsaWdodGVkLiBVc2luZwogICBpbmNyZWRpYmx5IHNtYWxsIG9wYWNpdHkgc28gdGhhdCB0aGUgYm91bmRpbmcgYm94IG9mIHRoZSA8Zz4gcGFyZW50IHN0aWxsIHRha2VzCiAgIHRoaXMgY29udGFpbmVyIGludG8gYWNjb3VudCBldmVuIHdoZW4gaXQgaXNuJ3QgdmlzaWJsZSAqLwogICAgLm5vZGU6bm90KC5oaWdobGlnaHRlZCk6bm90KC5leHBhbmRlZCkgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciB7CiAgICAgIG9wYWNpdHk6IDAuMDE7CiAgICB9CiAgICAubm9kZS5oaWdobGlnaHRlZCA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyIHsKICAgICAgY3Vyc29yOiBwb2ludGVyOwogICAgfQogICAgLmJ1dHRvbmNpcmNsZSB7CiAgICAgIGZpbGw6ICNlNzgxMWQ7CiAgICB9CiAgICAuYnV0dG9uY2lyY2xlOmhvdmVyIHsKICAgICAgZmlsbDogI2I5NjcxNzsKICAgIH0KICAgIC5leHBhbmRidXR0b24sCiAgICAuY29sbGFwc2VidXR0b24gewogICAgICBzdHJva2U6IHdoaXRlOwogICAgfQogICAgLyogRG8gbm90IGxldCB0aGUgcGF0aCBlbGVtZW50cyBpbiB0aGUgYnV0dG9uIHRha2UgcG9pbnRlciBmb2N1cyAqLwogICAgLm5vZGUgPiAubm9kZXNoYXBlID4gLmJ1dHRvbmNvbnRhaW5lciA+IC5leHBhbmRidXR0b24sCiAgICAubm9kZSA+IC5ub2Rlc2hhcGUgPiAuYnV0dG9uY29udGFpbmVyID4gLmNvbGxhcHNlYnV0dG9uIHsKICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICB9CiAgICAvKiBPbmx5IHNob3cgdGhlIGV4cGFuZCBidXR0b24gd2hlbiBhIG5vZGUgaXMgY29sbGFwc2VkIGFuZCBvbmx5IHNob3cgdGhlCiAgIGNvbGxhcHNlIGJ1dHRvbiB3aGVuIGEgbm9kZSBpcyBleHBhbmRlZC4gKi8KICAgIC5ub2RlLmV4cGFuZGVkID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuZXhwYW5kYnV0dG9uIHsKICAgICAgZGlzcGxheTogbm9uZTsKICAgIH0KICAgIC5ub2RlOm5vdCguZXhwYW5kZWQpID4gLm5vZGVzaGFwZSA+IC5idXR0b25jb250YWluZXIgPiAuY29sbGFwc2VidXR0b24gewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIC5oZWFsdGgtcGlsbC1zdGF0cyB7CiAgICAgIGZvbnQtc2l6ZTogNHB4OwogICAgICB0ZXh0LWFuY2hvcjogbWlkZGxlOwogICAgfQoKICAgIC5oZWFsdGgtcGlsbCByZWN0IHsKICAgICAgZmlsdGVyOiB1cmwoI2hlYWx0aC1waWxsLXNoYWRvdyk7CiAgICAgIHJ4OiAzOwogICAgICByeTogMzsKICAgIH0KCiAgICAudGl0bGVDb250YWluZXIgewogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHRvcDogMjBweDsKICAgIH0KCiAgICAudGl0bGUsCiAgICAuYXV4VGl0bGUsCiAgICAuZnVuY3Rpb25MaWJyYXJ5VGl0bGUgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB9CgogICAgI21pbmltYXAgewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHJpZ2h0OiAyMHB4OwogICAgICBib3R0b206IDIwcHg7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UyZTJlMjsKICAgICAgYm9yZGVyLXJhZGl1czogMnB4OwogICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgIG1pbi13aWR0aDogMTUwcHg7CiAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNkNGQ0ZDQ7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB1bCB7CiAgICAgIGxpc3Qtc3R5bGUtdHlwZTogbm9uZTsKICAgICAgbWFyZ2luOiAwOwogICAgICBwYWRkaW5nOiAwOwogICAgICBjdXJzb3I6IGRlZmF1bHQ7CiAgICB9CgogICAgLmNvbnRleHQtbWVudSB1bCBsaSB7CiAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgfQoKICAgIC5jb250ZXh0LW1lbnUgdWwgbGk6aG92ZXIgewogICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZjM5MTNlOwogICAgICBjb2xvcjogd2hpdGU7CiAgICB9CiAgPC9zdHlsZT4KICA8ZGl2IGNsYXNzPSJ0aXRsZUNvbnRhaW5lciI+CiAgICA8ZGl2IGlkPSJ0aXRsZSIgY2xhc3M9InRpdGxlIj5NYWluIEdyYXBoPC9kaXY+CiAgICA8ZGl2IGlkPSJhdXhUaXRsZSIgY2xhc3M9ImF1eFRpdGxlIj5BdXhpbGlhcnkgTm9kZXM8L2Rpdj4KICAgIDxkaXYgaWQ9ImZ1bmN0aW9uTGlicmFyeVRpdGxlIiBjbGFzcz0iZnVuY3Rpb25MaWJyYXJ5VGl0bGUiPkZ1bmN0aW9uczwvZGl2PgogIDwvZGl2PgogIDxzdmcgaWQ9InN2ZyI+CiAgICA8ZGVmcz4KICAgICAgPCEtLSBBcnJvdyBoZWFkcyBmb3IgcmVmZXJlbmNlIGVkZ2UgcGF0aHMgb2YgZGlmZmVyZW50IHByZWRlZmluZWQgc2l6ZXMgcGVyIGNvbG9yLiAtLT4KICAgICAgPHBhdGgKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIgogICAgICAgIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIKICAgICAgPjwvcGF0aD4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJyZWZlcmVuY2UtYXJyb3doZWFkIgogICAgICAgIGlkPSJyZWZlcmVuY2UtYXJyb3doZWFkLXNtYWxsIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiCiAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbWVkaXVtIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMTMiCiAgICAgICAgbWFya2VySGVpZ2h0PSIxMyIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0icmVmZXJlbmNlLWFycm93aGVhZCIKICAgICAgICBpZD0icmVmZXJlbmNlLWFycm93aGVhZC1sYXJnZSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjE2IgogICAgICAgIG1hcmtlckhlaWdodD0iMTYiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI3JlZmVyZW5jZS1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9InJlZmVyZW5jZS1hcnJvd2hlYWQiCiAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQteGxhcmdlIgogICAgICAgIHZpZXdCb3g9IjAgMCAxMCAxMCIKICAgICAgICBtYXJrZXJXaWR0aD0iMjAiCiAgICAgICAgbWFya2VySGVpZ2h0PSIyMCIKICAgICAgICByZWZYPSIyIgogICAgICAgIHJlZlk9IjUiCiAgICAgICAgb3JpZW50PSJhdXRvLXN0YXJ0LXJldmVyc2UiCiAgICAgICAgbWFya2VyVW5pdHM9InVzZXJTcGFjZU9uVXNlIgogICAgICA+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjcmVmZXJlbmNlLWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CgogICAgICA8IS0tIEFycm93IGhlYWRzIGZvciBkYXRhZmxvdyBlZGdlIHBhdGhzIG9mIGRpZmZlcmVudCBwcmVkZWZpbmVkIHNpemVzIHBlciBjb2xvci4gLS0+CiAgICAgIDxwYXRoCiAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1wYXRoIgogICAgICAgIGQ9Ik0gMCwwIEwgMTAsNSBMIDAsMTAgQyAzLDcgMywzIDAsMCIKICAgICAgPjwvcGF0aD4KICAgICAgPG1hcmtlcgogICAgICAgIGNsYXNzPSJkYXRhZmxvdy1hcnJvd2hlYWQiCiAgICAgICAgaWQ9ImRhdGFmbG93LWFycm93aGVhZC1zbWFsbCIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLW1lZGl1bSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjEzIgogICAgICAgIG1hcmtlckhlaWdodD0iMTMiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBjbGFzcz0iZGF0YWZsb3ctYXJyb3doZWFkIgogICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGFyZ2UiCiAgICAgICAgdmlld0JveD0iMCAwIDEwIDEwIgogICAgICAgIG1hcmtlcldpZHRoPSIxNiIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjE2IgogICAgICAgIHJlZlg9IjIiCiAgICAgICAgcmVmWT0iNSIKICAgICAgICBvcmllbnQ9ImF1dG8tc3RhcnQtcmV2ZXJzZSIKICAgICAgICBtYXJrZXJVbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNkYXRhZmxvdy1hcnJvd2hlYWQtcGF0aCI+PC91c2U+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgY2xhc3M9ImRhdGFmbG93LWFycm93aGVhZCIKICAgICAgICBpZD0iZGF0YWZsb3ctYXJyb3doZWFkLXhsYXJnZSIKICAgICAgICB2aWV3Qm94PSIwIDAgMTAgMTAiCiAgICAgICAgbWFya2VyV2lkdGg9IjIwIgogICAgICAgIG1hcmtlckhlaWdodD0iMjAiCiAgICAgICAgcmVmWD0iMiIKICAgICAgICByZWZZPSI1IgogICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgIG1hcmtlclVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI2RhdGFmbG93LWFycm93aGVhZC1wYXRoIj48L3VzZT4KICAgICAgPC9tYXJrZXI+CgogICAgICA8IS0tIEFycm93IGhlYWQgZm9yIGFubm90YXRpb24gZWRnZSBwYXRocy4gLS0+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0iYW5ub3RhdGlvbi1hcnJvd2hlYWQiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjUiCiAgICAgICAgcmVmWT0iMi41IgogICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgNSwyLjUgTCAwLDUgTCAwLDAiPjwvcGF0aD4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0iYW5ub3RhdGlvbi1hcnJvd2hlYWQtZmFkZWQiCiAgICAgICAgbWFya2VyV2lkdGg9IjUiCiAgICAgICAgbWFya2VySGVpZ2h0PSI1IgogICAgICAgIHJlZlg9IjUiCiAgICAgICAgcmVmWT0iMi41IgogICAgICAgIG9yaWVudD0iYXV0byIKICAgICAgPgogICAgICAgIDxwYXRoIGQ9Ik0gMCwwIEwgNSwyLjUgTCAwLDUgTCAwLDAiPjwvcGF0aD4KICAgICAgPC9tYXJrZXI+CiAgICAgIDxtYXJrZXIKICAgICAgICBpZD0icmVmLWFubm90YXRpb24tYXJyb3doZWFkIgogICAgICAgIG1hcmtlcldpZHRoPSI1IgogICAgICAgIG1hcmtlckhlaWdodD0iNSIKICAgICAgICByZWZYPSIwIgogICAgICAgIHJlZlk9IjIuNSIKICAgICAgICBvcmllbnQ9ImF1dG8iCiAgICAgID4KICAgICAgICA8cGF0aCBkPSJNIDUsMCBMIDAsMi41IEwgNSw1IEwgNSwwIj48L3BhdGg+CiAgICAgIDwvbWFya2VyPgogICAgICA8bWFya2VyCiAgICAgICAgaWQ9InJlZi1hbm5vdGF0aW9uLWFycm93aGVhZC1mYWRlZCIKICAgICAgICBtYXJrZXJXaWR0aD0iNSIKICAgICAgICBtYXJrZXJIZWlnaHQ9IjUiCiAgICAgICAgcmVmWD0iMCIKICAgICAgICByZWZZPSIyLjUiCiAgICAgICAgb3JpZW50PSJhdXRvIgogICAgICA+CiAgICAgICAgPHBhdGggZD0iTSA1LDAgTCAwLDIuNSBMIDUsNSBMIDUsMCI+PC9wYXRoPgogICAgICA8L21hcmtlcj4KICAgICAgPCEtLSBUZW1wbGF0ZSBmb3IgYW4gT3Agbm9kZSBlbGxpcHNlLiAtLT4KICAgICAgPGVsbGlwc2UKICAgICAgICBpZD0ib3Atbm9kZS1zdGFtcCIKICAgICAgICByeD0iNy41IgogICAgICAgIHJ5PSIzIgogICAgICAgIHN0cm9rZT0iaW5oZXJpdCIKICAgICAgICBmaWxsPSJpbmhlcml0IgogICAgICA+PC9lbGxpcHNlPgogICAgICA8IS0tIFRlbXBsYXRlIGZvciBhbiBPcCBub2RlIGFubm90YXRpb24gZWxsaXBzZSAoc21hbGxlcikuIC0tPgogICAgICA8ZWxsaXBzZQogICAgICAgIGlkPSJvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiCiAgICAgICAgcng9IjUiCiAgICAgICAgcnk9IjIiCiAgICAgICAgc3Ryb2tlPSJpbmhlcml0IgogICAgICAgIGZpbGw9ImluaGVyaXQiCiAgICAgID48L2VsbGlwc2U+CiAgICAgIDwhLS0gVmVydGljYWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyB3aGVuIHVuZXhwYW5kZWQuIC0tPgogICAgICA8ZyBpZD0ib3Atc2VyaWVzLXZlcnRpY2FsLXN0YW1wIj4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI5Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSI2Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSI4IiB5PSIzIj48L3VzZT4KICAgICAgPC9nPgogICAgICA8IS0tIEhvcml6b250YWxseSBzdGFja2VkIHNlcmllcyBvZiBPcCBub2RlcyB3aGVuIHVuZXhwYW5kZWQuIC0tPgogICAgICA8ZyBpZD0ib3Atc2VyaWVzLWhvcml6b250YWwtc3RhbXAiPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtc3RhbXAiIHg9IjE2IiB5PSI0Ij48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLXN0YW1wIiB4PSIxMiIgeT0iNCI+PC91c2U+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1zdGFtcCIgeD0iOCIgeT0iNCI+PC91c2U+CiAgICAgIDwvZz4KICAgICAgPCEtLSBIb3Jpem9udGFsbHkgc3RhY2tlZCBzZXJpZXMgb2YgT3Agbm9kZXMgZm9yIGFubm90YXRpb24uIC0tPgogICAgICA8ZyBpZD0ib3Atc2VyaWVzLWFubm90YXRpb24tc3RhbXAiPgogICAgICAgIDx1c2UgeGxpbms6aHJlZj0iI29wLW5vZGUtYW5ub3RhdGlvbi1zdGFtcCIgeD0iOSIgeT0iMiI+PC91c2U+CiAgICAgICAgPHVzZSB4bGluazpocmVmPSIjb3Atbm9kZS1hbm5vdGF0aW9uLXN0YW1wIiB4PSI3IiB5PSIyIj48L3VzZT4KICAgICAgICA8dXNlIHhsaW5rOmhyZWY9IiNvcC1ub2RlLWFubm90YXRpb24tc3RhbXAiIHg9IjUiIHk9IjIiPjwvdXNlPgogICAgICA8L2c+CiAgICAgIDxzdmcKICAgICAgICBpZD0ic3VtbWFyeS1pY29uIgogICAgICAgIGZpbGw9IiM4NDg0ODQiCiAgICAgICAgaGVpZ2h0PSIxMiIKICAgICAgICB2aWV3Qm94PSIwIDAgMjQgMjQiCiAgICAgICAgd2lkdGg9IjEyIgogICAgICA+CiAgICAgICAgPHBhdGgKICAgICAgICAgIGQ9Ik0xOSAzSDVjLTEuMSAwLTIgLjktMiAydjE0YzAgMS4xLjkgMiAyIDJoMTRjMS4xIDAgMi0uOSAyLTJWNWMwLTEuMS0uOS0yLTItMnpNOSAxN0g3di03aDJ2N3ptNCAwaC0yVjdoMnYxMHptNCAwaC0ydi00aDJ2NHoiCiAgICAgICAgPjwvcGF0aD4KICAgICAgPC9zdmc+CgogICAgICA8IS0tIEhhdGNoIHBhdHRlcm5zIGZvciBmYWRlZCBvdXQgbm9kZXMuIC0tPgogICAgICA8cGF0dGVybgogICAgICAgIGlkPSJyZWN0SGF0Y2giCiAgICAgICAgcGF0dGVyblRyYW5zZm9ybT0icm90YXRlKDQ1IDAgMCkiCiAgICAgICAgd2lkdGg9IjUiCiAgICAgICAgaGVpZ2h0PSI1IgogICAgICAgIHBhdHRlcm5Vbml0cz0idXNlclNwYWNlT25Vc2UiCiAgICAgID4KICAgICAgICA8bGluZSB4MT0iMCIgeTE9IjAiIHgyPSIwIiB5Mj0iNSIgc3R5bGU9InN0cm9rZS13aWR0aDogMSI+PC9saW5lPgogICAgICA8L3BhdHRlcm4+CiAgICAgIDxwYXR0ZXJuCiAgICAgICAgaWQ9ImVsbGlwc2VIYXRjaCIKICAgICAgICBwYXR0ZXJuVHJhbnNmb3JtPSJyb3RhdGUoNDUgMCAwKSIKICAgICAgICB3aWR0aD0iMiIKICAgICAgICBoZWlnaHQ9IjIiCiAgICAgICAgcGF0dGVyblVuaXRzPSJ1c2VyU3BhY2VPblVzZSIKICAgICAgPgogICAgICAgIDxsaW5lIHgxPSIwIiB5MT0iMCIgeDI9IjAiIHkyPSIyIiBzdHlsZT0ic3Ryb2tlLXdpZHRoOiAxIj48L2xpbmU+CiAgICAgIDwvcGF0dGVybj4KCiAgICAgIDwhLS0gQSBzaGFkb3cgZm9yIGhlYWx0aCBwaWxscy4gLS0+CiAgICAgIDxmaWx0ZXIKICAgICAgICBpZD0iaGVhbHRoLXBpbGwtc2hhZG93IgogICAgICAgIHg9Ii00MCUiCiAgICAgICAgeT0iLTQwJSIKICAgICAgICB3aWR0aD0iMTgwJSIKICAgICAgICBoZWlnaHQ9IjE4MCUiCiAgICAgID4KICAgICAgICA8ZmVHYXVzc2lhbkJsdXIgaW49IlNvdXJjZUFscGhhIiBzdGREZXZpYXRpb249IjAuOCI+PC9mZUdhdXNzaWFuQmx1cj4KICAgICAgICA8ZmVPZmZzZXQgZHg9IjAiIGR5PSIwIiByZXN1bHQ9Im9mZnNldGJsdXIiPjwvZmVPZmZzZXQ+CiAgICAgICAgPGZlRmxvb2QgZmxvb2QtY29sb3I9IiMwMDAwMDAiPjwvZmVGbG9vZD4KICAgICAgICA8ZmVDb21wb3NpdGUgaW4yPSJvZmZzZXRibHVyIiBvcGVyYXRvcj0iaW4iPjwvZmVDb21wb3NpdGU+CiAgICAgICAgPGZlTWVyZ2U+CiAgICAgICAgICA8ZmVNZXJnZU5vZGU+PC9mZU1lcmdlTm9kZT4KICAgICAgICAgIDxmZU1lcmdlTm9kZSBpbj0iU291cmNlR3JhcGhpYyI+PC9mZU1lcmdlTm9kZT4KICAgICAgICA8L2ZlTWVyZ2U+CiAgICAgIDwvZmlsdGVyPgogICAgPC9kZWZzPgogICAgPCEtLSBNYWtlIGEgbGFyZ2UgcmVjdGFuZ2xlIHRoYXQgZmlsbHMgdGhlIHN2ZyBzcGFjZSBzbyB0aGF0CiAgem9vbSBldmVudHMgZ2V0IGNhcHR1cmVkIG9uIHNhZmFyaSAtLT4KICAgIDxyZWN0IGZpbGw9IndoaXRlIiB3aWR0aD0iMTAwMDAiIGhlaWdodD0iMTAwMDAiPjwvcmVjdD4KICAgIDxnIGlkPSJyb290Ij48L2c+CiAgPC9zdmc+CiAgPHRmLWdyYXBoLW1pbmltYXAgaWQ9Im1pbmltYXAiPjwvdGYtZ3JhcGgtbWluaW1hcD4KICA8ZGl2IGlkPSJjb250ZXh0TWVudSIgY2xhc3M9ImNvbnRleHQtbWVudSI+PC9kaXY+CmA7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZHcmFwaFNjZW5lMiA9IGNsYXNzIFRmR3JhcGhTY2VuZTIgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgLyoqIEtlZXBzIHRyYWNrIG9mIGlmIHRoZSBncmFwaCBoYXMgYmVlbiB6b29tZWQvcGFubmVkIHNpbmNlIGxvYWRpbmcgKi8KICAgICAgICAgICAgdGhpcy5fem9vbWVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgc3RhcnRpbmcgY29vcmRpbmF0ZXMgb2YgYSBncmFwaCB6b29tL3Bhbi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUge3t4OiBudW1iZXIsIHk6IG51bWJlcn0/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fem9vbVN0YXJ0Q29vcmRzID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50IGNvb3JkaW5hdGVzIG9mIGEgZ3JhcGggem9vbS9wYW4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQHByaXZhdGUge3t4OiBudW1iZXIsIHk6IG51bWJlcn0/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fem9vbVRyYW5zZm9ybSA9IG51bGw7CiAgICAgICAgICAgIC8qKiBNYXhpbXVtIGRpc3RhbmNlIG9mIGEgem9vbSBldmVudCBmb3IgaXQgdG8gYmUgaW50ZXJwcmV0ZWQgYXMgYSBjbGljayAqLwogICAgICAgICAgICB0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljayA9IDIwOwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBEaWN0aW9uYXJ5IGZvciBlYXNpbHkgc3R5bGl6aW5nIG5vZGVzIHdoZW4gc3RhdGUgY2hhbmdlcy4KICAgICAgICAgICAgICogX25vZGVHcm91cEluZGV4W25vZGVOYW1lXSA9IGQzX3NlbGVjdGlvbiBvZiB0aGUgbm9kZUdyb3VwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9ub2RlR3JvdXBJbmRleCA9IHt9OwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBEaWN0aW9uYXJ5IGZvciBlYXNpbHkgc3R5bGl6aW5nIGFubm90YXRpb24gbm9kZXMgd2hlbiBzdGF0ZSBjaGFuZ2VzLgogICAgICAgICAgICAgKiBfYW5ub3RhdGlvbkdyb3VwSW5kZXhbbm9kZU5hbWVdW2hvc3ROb2RlTmFtZV0gPQogICAgICAgICAgICAgKiAgIGQzX3NlbGVjdGlvbiBvZiB0aGUgYW5ub3RhdGlvbkdyb3VwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleCA9IHt9OwogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBEaWN0aW9uYXJ5IGZvciBlYXNpbHkgc3R5bGl6aW5nIGVkZ2VzIHdoZW4gc3RhdGUgY2hhbmdlcy4KICAgICAgICAgICAgICogX2VkZ2VHcm91cEluZGV4W2VkZ2VOYW1lXSA9IGQzX3NlbGVjdGlvbiBvZiB0aGUgZWRnZUdyb3VwCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9lZGdlR3JvdXBJbmRleCA9IHt9OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTWF4IGZvbnQgc2l6ZSBmb3IgbWV0YW5vZGUgbGFiZWwgc3RyaW5ncy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubWF4TWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplID0gOTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1pbiBmb250IHNpemUgZm9yIG1ldGFub2RlIGxhYmVsIHN0cmluZ3MuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm1pbk1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSA9IDY7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNZXRhbm9kZSBsYWJlbCBzdHJpbmdzIGxvbmdlciB0aGFuIHRoaXMgYXJlIGdpdmVuIHNtYWxsZXIgZm9udHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm1heE1ldGFub2RlTGFiZWxMZW5ndGhMYXJnZUZvbnQgPSAxMTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1ldGFub2RlIGxhYmVsIHN0cmluZ3MgbG9uZ2VyIHRoYW4gdGhpcyBhcmUgdHJ1bmNhdGVkIHdpdGggZWxsaXBzZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm1heE1ldGFub2RlTGFiZWxMZW5ndGggPSAxODsKICAgICAgICB9CiAgICAgICAgZ2V0Tm9kZShub2RlTmFtZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJIaWVyYXJjaHkuZ2V0UmVuZGVyTm9kZUJ5TmFtZShub2RlTmFtZSk7CiAgICAgICAgfQogICAgICAgIGlzTm9kZUV4cGFuZGVkKG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUuZXhwYW5kZWQ7CiAgICAgICAgfQogICAgICAgIHNldE5vZGVFeHBhbmRlZChyZW5kZXJOb2RlKSB7CiAgICAgICAgICAgIHRoaXMuX2J1aWxkKHRoaXMucmVuZGVySGllcmFyY2h5KTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQYW5zIHRvIGEgbm9kZS4gQXNzdW1lcyB0aGF0IHRoZSBub2RlIGV4aXN0cy4KICAgICAgICAgKiBAcGFyYW0gbm9kZU5hbWUge3N0cmluZ30gVGhlIG5hbWUgb2YgdGhlIG5vZGUgdG8gcGFuIHRvLgogICAgICAgICAqLwogICAgICAgIHBhblRvTm9kZShub2RlTmFtZSkgewogICAgICAgICAgICBjb25zdCB6b29tZWQgPSBwYW5Ub05vZGUobm9kZU5hbWUsIHRoaXMuJC5zdmcsIHRoaXMuJC5yb290LCB0aGlzLl96b29tKTsKICAgICAgICAgICAgaWYgKHpvb21lZCkgewogICAgICAgICAgICAgICAgdGhpcy5fem9vbWVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBvdXRlci1tb3N0IFNWRyB0aGF0IHJlbmRlcnMgdGhlIGdyYXBoLgogICAgICAgICAqLwogICAgICAgIGdldEdyYXBoU3ZnUm9vdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC5zdmc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm5zIHshSFRNTEVsZW1lbnR9CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udGV4dE1lbnUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLiQuY29udGV4dE1lbnU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB0aGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudC4gQ2FsbGVkIHdoZW5ldmVyIHRoZSB3aG9sZSBncmFwaAogICAgICAgICAqIChkYXRhc2V0KSBjaGFuZ2VzLgogICAgICAgICAqLwogICAgICAgIF9yZXNldFN0YXRlKCkgewogICAgICAgICAgICAvLyBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIGNvbXBvbmVudC4KICAgICAgICAgICAgdGhpcy5fbm9kZUdyb3VwSW5kZXggPSB7fTsKICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXggPSB7fTsKICAgICAgICAgICAgdGhpcy5fZWRnZUdyb3VwSW5kZXggPSB7fTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGFiZWxzKGZhbHNlKTsKICAgICAgICAgICAgLy8gUmVtb3ZlIGFsbCBzdmcgZWxlbWVudHMgdW5kZXIgdGhlICdyb290JyBzdmcgZ3JvdXAuCiAgICAgICAgICAgIHNlbGVjdCh0aGlzLiQuc3ZnKS5zZWxlY3QoJyNyb290Jykuc2VsZWN0QWxsKCcqJykucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIEFuZCB0aGUgZGVmcy4KICAgICAgICAgICAgcmVtb3ZlR3JhZGllbnREZWZpbml0aW9ucyh0aGlzLiQuc3ZnKTsKICAgICAgICB9CiAgICAgICAgLyoqIE1haW4gbWV0aG9kIGZvciBidWlsZGluZyB0aGUgc2NlbmUgKi8KICAgICAgICBfYnVpbGQocmVuZGVySGllcmFyY2h5KSB7CiAgICAgICAgICAgIHRoaXMudGVtcGxhdGVJbmRleCA9IHJlbmRlckhpZXJhcmNoeS5oaWVyYXJjaHkuZ2V0VGVtcGxhdGVJbmRleCgpOwogICAgICAgICAgICB0aW1lJDMoJ3RmLWdyYXBoLXNjZW5lIChsYXlvdXQpOicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIC8vIGxheW91dCB0aGUgc2NlbmUgZm9yIHRoaXMgbWV0YSAvIHNlcmllcyBub2RlCiAgICAgICAgICAgICAgICBsYXlvdXRTY2VuZShyZW5kZXJIaWVyYXJjaHkucm9vdCk7CiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgICAgIHRpbWUkMygndGYtZ3JhcGgtc2NlbmUgKGJ1aWxkIHNjZW5lKTonLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBidWlsZEdyb3VwRm9yU2NlbmUoc2VsZWN0KHRoaXMuJC5yb290KSwgcmVuZGVySGllcmFyY2h5LnJvb3QsIHRoaXMpOwogICAgICAgICAgICAgICAgYWRkR3JhcGhDbGlja0xpc3RlbmVyKHRoaXMuJC5zdmcsIHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlSW5wdXRUcmFjZSgpOwogICAgICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG1pbmltYXAgYWdhaW4gd2hlbiB0aGUgZ3JhcGggaXMgZG9uZSBhbmltYXRpbmcuCiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlSGVhbHRoUGlsbHModGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzLCB0aGlzLmhlYWx0aFBpbGxTdGVwSW5kZXgpOwogICAgICAgICAgICAgICAgdGhpcy5taW5pbWFwLnVwZGF0ZSgpOwogICAgICAgICAgICB9LmJpbmQodGhpcyksIFBBUkFNUyQxLmFuaW1hdGlvbi5kdXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgICB0aGlzLl96b29tID0gem9vbSgpCiAgICAgICAgICAgICAgICAub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b29tU3RhcnRDb29yZHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIGRpc3RhbmNlIGRyYWdnZWQgZHVyaW5nIHRoZSB6b29tIGV2ZW50LgogICAgICAgICAgICAgICAgICAgIC8vIElmIGl0IGlzIHN1ZmZpY2llbnRseSBzbWFsbCwgdGhlbiBmaXJlIGFuIGV2ZW50IGluZGljYXRpbmcKICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHpvb21pbmcgaGFzIGVuZGVkLiBPdGhlcndpc2Ugd2FpdCB0byBmaXJlIHRoZSB6b29tIGVuZAogICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LCBzbyB0aGF0IGEgbW91c2UgY2xpY2sgcmVnaXN0ZXJlZCBhcyBwYXJ0IG9mIHRoaXMgem9vbWluZwogICAgICAgICAgICAgICAgICAgIC8vIGlzIGlnbm9yZWQgKGFzIHRoaXMgbW91c2UgY2xpY2sgd2FzIHBhcnQgb2YgYSB6b29taW5nLCBhbmQgc2hvdWxkCiAgICAgICAgICAgICAgICAgICAgLy8gbm90IGJlIHVzZWQgdG8gaW5kaWNhdGUgYW4gYWN0dWFsIGNsaWNrIG9uIHRoZSBncmFwaCkuCiAgICAgICAgICAgICAgICAgICAgdmFyIGRyYWdEaXN0YW5jZSA9IE1hdGguc3FydChNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueCAtIHRoaXMuX3pvb21UcmFuc2Zvcm0ueCwgMikgKwogICAgICAgICAgICAgICAgICAgICAgICBNYXRoLnBvdyh0aGlzLl96b29tU3RhcnRDb29yZHMueSAtIHRoaXMuX3pvb21UcmFuc2Zvcm0ueSwgMikpOwogICAgICAgICAgICAgICAgICAgIGlmIChkcmFnRGlzdGFuY2UgPCB0aGlzLl9tYXhab29tRGlzdGFuY2VGb3JDbGljaykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9maXJlRW5hYmxlQ2xpY2soKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5fZmlyZUVuYWJsZUNsaWNrLmJpbmQodGhpcyksIDUwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl96b29tU3RhcnRDb29yZHMgPSBudWxsOwogICAgICAgICAgICB9LmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAub24oJ3pvb20nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBTdG9yZSB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHpvb20gZXZlbnQuCiAgICAgICAgICAgICAgICB0aGlzLl96b29tVHJhbnNmb3JtID0gZXZlbnQudHJhbnNmb3JtOwogICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgem9vbSBldmVudCBhZnRlciBhIHpvb20tZW5kLCB0aGVuCiAgICAgICAgICAgICAgICAvLyBzdG9yZSB0aGUgY29vcmRpbmF0ZXMgYXMgdGhlIHN0YXJ0IGNvb3JkaW5hdGVzIGFzIHdlbGwsCiAgICAgICAgICAgICAgICAvLyBhbmQgZmlyZSBhbiBldmVudCB0byBpbmRpY2F0ZSB0aGF0IHpvb21pbmcgaGFzIHN0YXJ0ZWQuCiAgICAgICAgICAgICAgICAvLyBUaGlzIGRvZXNuJ3QgdXNlIHRoZSB6b29tc3RhcnQgZXZlbnQsIGFzIGQzIHNlbmRzIHRoaXMKICAgICAgICAgICAgICAgIC8vIGV2ZW50IG9uIG1vdXNlLWRvd24sIGV2ZW4gaWYgdGhlcmUgaGFzIGJlZW4gbm8gZHJhZ2dpbmcKICAgICAgICAgICAgICAgIC8vIGRvbmUgdG8gdHJhbnNsYXRlIHRoZSBncmFwaCBhcm91bmQuCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3pvb21TdGFydENvb3JkcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvb21TdGFydENvb3JkcyA9IHRoaXMuX3pvb21UcmFuc2Zvcm07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdkaXNhYmxlLWNsaWNrJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl96b29tZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgc2VsZWN0KHRoaXMuJC5yb290KS5hdHRyKCd0cmFuc2Zvcm0nLCBldmVudC50cmFuc2Zvcm0pOwogICAgICAgICAgICAgICAgLy8gTm90aWZ5IHRoZSBtaW5pbWFwLgogICAgICAgICAgICAgICAgdGhpcy5taW5pbWFwLnpvb20oZXZlbnQudHJhbnNmb3JtKTsKICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgc2VsZWN0KHRoaXMuJC5zdmcpCiAgICAgICAgICAgICAgICAuY2FsbCh0aGlzLl96b29tKQogICAgICAgICAgICAgICAgLm9uKCdkYmxjbGljay56b29tJywgbnVsbCk7CiAgICAgICAgICAgIHNlbGVjdCh3aW5kb3cpLm9uKCdyZXNpemUnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIG1pbmltYXAgdGhhdCB0aGUgdXNlcidzIHdpbmRvdyB3YXMgcmVzaXplZC4KICAgICAgICAgICAgICAgIC8vIFRoZSBtaW5pbWFwIHdpbGwgZmlndXJlIG91dCB0aGUgbmV3IGRpbWVuc2lvbnMgb2YgdGhlIG1haW4gc3ZnCiAgICAgICAgICAgICAgICAvLyBhbmQgd2lsbCB1c2UgdGhlIGV4aXN0aW5nIHRyYW5zbGF0ZSBhbmQgc2NhbGUgcGFyYW1zLgogICAgICAgICAgICAgICAgdGhpcy5taW5pbWFwLnpvb20oKTsKICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgbWluaW1hcC4KICAgICAgICAgICAgdGhpcy5taW5pbWFwID0gdGhpcy4kLm1pbmltYXAuaW5pdCh0aGlzLiQuc3ZnLCB0aGlzLiQucm9vdCwgdGhpcy5fem9vbSwgUEFSQU1TJDEubWluaW1hcC5zaXplLCBQQVJBTVMkMS5zdWJzY2VuZS5tZXRhLmxhYmVsSGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfaXNBdHRhY2hlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgICBkZXRhY2hlZCgpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19pc0F0dGFjaGVkJywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCgpIHsKICAgICAgICAgICAgdmFyIHJlbmRlckhpZXJhcmNoeSA9IHRoaXMucmVuZGVySGllcmFyY2h5OwogICAgICAgICAgICB0aGlzLl9oYXNSZW5kZXJIaWVyYXJjaHlCZWVuRml0T25jZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9yZXNldFN0YXRlKCk7CiAgICAgICAgICAgIHRoaXMuX2J1aWxkKHJlbmRlckhpZXJhcmNoeSk7CiAgICAgICAgfQogICAgICAgIC8vIEFuaW1hdGlvbiBhbmQgZml0dGluZyBtdXN0IGNvbWUgYWZ0ZXIgdGhlIG9ic2VydmVyIGZvciB0aGUgaGllcmFyY2h5IGNoYW5naW5nIGJlY2F1c2Ugd2UgbXVzdAogICAgICAgIC8vIGZpcnN0IGJ1aWxkIHRoZSByZW5kZXIgaGllcmFyY2h5LgogICAgICAgIF9hbmltYXRlQW5kRml0KCkgewogICAgICAgICAgICB2YXIgaXNBdHRhY2hlZCA9IHRoaXMuX2lzQXR0YWNoZWQ7CiAgICAgICAgICAgIHZhciByZW5kZXJIaWVyYXJjaHkgPSB0aGlzLnJlbmRlckhpZXJhcmNoeTsKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlIHx8ICFpc0F0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICAvLyBEbyBub3QgYW5pbWF0ZSBhbmQgZml0IGlmIHRoZSBzY2VuZSBoYXMgYWxyZWFkeSBmaXR0ZWQgdGhpcyByZW5kZXIgaGllcmFyY2h5IG9uY2UuIE9yIGlmCiAgICAgICAgICAgICAgICAvLyB0aGUgZ3JhcGggZGFzaGJvYXJkIGlzIG5vdCBhdHRhY2hlZCAoaW4gd2hpY2ggY2FzZSB0aGUgc2NlbmUgbGFja3MgRE9NIGluZm8gZm9yIGZpdHRpbmcpLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZpdCB0byBzY3JlZW4gYWZ0ZXIgdGhlIGdyYXBoIGlzIGRvbmUgYW5pbWF0aW5nLgogICAgICAgICAgICBzZXRUaW1lb3V0KHRoaXMuZml0LmJpbmQodGhpcyksIFBBUkFNUyQxLmFuaW1hdGlvbi5kdXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVMYWJlbHMoc2hvd0xhYmVscykgewogICAgICAgICAgICB2YXIgbWFpbkdyYXBoVGl0bGVFbGVtZW50ID0gdGhpcy4kJCgnLnRpdGxlJyk7CiAgICAgICAgICAgIHZhciB0aXRsZVN0eWxlID0gbWFpbkdyYXBoVGl0bGVFbGVtZW50LnN0eWxlOwogICAgICAgICAgICB2YXIgYXV4VGl0bGVFbGVtZW50ID0gdGhpcy4kJCgnLmF1eFRpdGxlJyk7CiAgICAgICAgICAgIHZhciBhdXhUaXRsZVN0eWxlID0gYXV4VGl0bGVFbGVtZW50LnN0eWxlOwogICAgICAgICAgICB2YXIgZnVuY3Rpb25MaWJyYXJ5VGl0bGVTdHlsZSA9IHRoaXMuJCQoJy5mdW5jdGlvbkxpYnJhcnlUaXRsZScpLnN0eWxlOwogICAgICAgICAgICBjb25zdCByb290ID0gc2VsZWN0KHRoaXMuJC5zdmcpOwogICAgICAgICAgICB2YXIgY29yZSA9IHJvb3QKICAgICAgICAgICAgICAgIC5zZWxlY3QoJy4nICsKICAgICAgICAgICAgICAgIENsYXNzJDIuU2NlbmUuR1JPVVAgKwogICAgICAgICAgICAgICAgJz4uJyArCiAgICAgICAgICAgICAgICBDbGFzcyQyLlNjZW5lLkNPUkUpCiAgICAgICAgICAgICAgICAubm9kZSgpOwogICAgICAgICAgICAvLyBPbmx5IHNob3cgbGFiZWxzIGlmIHRoZSBncmFwaCBpcyBmdWxseSBsb2FkZWQuCiAgICAgICAgICAgIGlmIChzaG93TGFiZWxzICYmIGNvcmUgJiYgdGhpcy5wcm9ncmVzcyAmJiB0aGlzLnByb2dyZXNzLnZhbHVlID09PSAxMDApIHsKICAgICAgICAgICAgICAgIHZhciBhdXggPSByb290CiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgnLicgKwogICAgICAgICAgICAgICAgICAgIENsYXNzJDIuU2NlbmUuR1JPVVAgKwogICAgICAgICAgICAgICAgICAgICc+LicgKwogICAgICAgICAgICAgICAgICAgIENsYXNzJDIuU2NlbmUuSU5FWFRSQUNUKQogICAgICAgICAgICAgICAgICAgIC5ub2RlKCkgfHwKICAgICAgICAgICAgICAgICAgICByb290CiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3QoJy4nICsKICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3MkMi5TY2VuZS5HUk9VUCArCiAgICAgICAgICAgICAgICAgICAgICAgICc+LicgKwogICAgICAgICAgICAgICAgICAgICAgICBDbGFzcyQyLlNjZW5lLk9VVEVYVFJBQ1QpCiAgICAgICAgICAgICAgICAgICAgICAgIC5ub2RlKCk7CiAgICAgICAgICAgICAgICB2YXIgY29yZVggPSBjb3JlLmdldENUTSgpLmU7CiAgICAgICAgICAgICAgICB2YXIgYXV4WCA9IGF1eCA/IGF1eC5nZXRDVE0oKS5lIDogbnVsbDsKICAgICAgICAgICAgICAgIHRpdGxlU3R5bGUuZGlzcGxheSA9ICdpbmxpbmUnOwogICAgICAgICAgICAgICAgdGl0bGVTdHlsZS5sZWZ0ID0gY29yZVggKyAncHgnOwogICAgICAgICAgICAgICAgaWYgKGF1eFggIT09IG51bGwgJiYgYXV4WCAhPT0gY29yZVgpIHsKICAgICAgICAgICAgICAgICAgICBhdXhUaXRsZVN0eWxlLmRpc3BsYXkgPSAnaW5saW5lJzsKICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgYXV4IHRpdGxlIGlzIHBvc2l0aW9uZWQgcmlnaHR3YXJkcyBlbm91Z2ggc28gYXMgdG8KICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IG92ZXJsYXAgd2l0aCB0aGUgbWFpbiBncmFwaCB0aXRsZS4KICAgICAgICAgICAgICAgICAgICBhdXhYID0gTWF0aC5tYXgoY29yZVggKyBtYWluR3JhcGhUaXRsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsIGF1eFgpOwogICAgICAgICAgICAgICAgICAgIGF1eFRpdGxlU3R5bGUubGVmdCA9IGF1eFggKyAncHgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXV4VGl0bGVTdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IGZ1bmN0aW9uTGlicmFyeSA9IHJvb3QKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCcuJyArCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MkMi5TY2VuZS5HUk9VUCArCiAgICAgICAgICAgICAgICAgICAgJz4uJyArCiAgICAgICAgICAgICAgICAgICAgQ2xhc3MkMi5TY2VuZS5GVU5DVElPTl9MSUJSQVJZKQogICAgICAgICAgICAgICAgICAgIC5ub2RlKCk7CiAgICAgICAgICAgICAgICBsZXQgZnVuY3Rpb25MaWJyYXJ5WCA9IGZ1bmN0aW9uTGlicmFyeQogICAgICAgICAgICAgICAgICAgID8gZnVuY3Rpb25MaWJyYXJ5LmdldENUTSgpLmUKICAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgICAgICAgICBpZiAoZnVuY3Rpb25MaWJyYXJ5WCAhPT0gbnVsbCAmJiBmdW5jdGlvbkxpYnJhcnlYICE9PSBhdXhYKSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25MaWJyYXJ5VGl0bGVTdHlsZS5kaXNwbGF5ID0gJ2lubGluZSc7CiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGxpYnJhcnkgdGl0bGUgaXMgcG9zaXRpb25lZCByaWdodHdhcmRzCiAgICAgICAgICAgICAgICAgICAgLy8gZW5vdWdoIHNvIGFzIHRvIHByZXZlbnQgb3ZlcmxhcCB3aXRoIG90aGVyIGNvbnRlbnQuCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25MaWJyYXJ5WCA9IE1hdGgubWF4KGF1eFggKyBhdXhUaXRsZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGgsIGZ1bmN0aW9uTGlicmFyeVgpOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uTGlicmFyeVRpdGxlU3R5bGUubGVmdCA9IGZ1bmN0aW9uTGlicmFyeVggKyAncHgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb25MaWJyYXJ5VGl0bGVTdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGl0bGVTdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgYXV4VGl0bGVTdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgZnVuY3Rpb25MaWJyYXJ5VGl0bGVTdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGxlZCB3aGVuZXZlciB0aGUgdXNlciBjaGFuZ2VkIHRoZSAnY29sb3IgYnknIG9wdGlvbiBpbiB0aGUKICAgICAgICAgKiBVSSBjb250cm9scy4KICAgICAgICAgKi8KICAgICAgICBfY29sb3JCeUNoYW5nZWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlckhpZXJhcmNoeSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBpdGVyYXRlIHRocm91Z2ggZWFjaCBzdmcgbm9kZSBhbmQgdXBkYXRlIGl0cyBzdGF0ZS4KICAgICAgICAgICAgICAgIGxvZGFzaC5lYWNoKHRoaXMuX25vZGVHcm91cEluZGV4LCAobm9kZUdyb3VwLCBub2RlTmFtZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU5vZGVTdGF0ZShub2RlTmFtZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIE5vdGlmeSBhbHNvIHRoZSBtaW5pbWFwLgogICAgICAgICAgICAgICAgdGhpcy5taW5pbWFwLnVwZGF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpdCgpIHsKICAgICAgICAgICAgdGhpcy5faGFzUmVuZGVySGllcmFyY2h5QmVlbkZpdE9uY2UgPSB0cnVlOwogICAgICAgICAgICBmaXQkMih0aGlzLiQuc3ZnLCB0aGlzLiQucm9vdCwgdGhpcy5fem9vbSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy5fem9vbWVkID0gZmFsc2U7CiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIGlzTm9kZVNlbGVjdGVkKG4pIHsKICAgICAgICAgICAgcmV0dXJuIG4gPT09IHRoaXMuc2VsZWN0ZWROb2RlOwogICAgICAgIH0KICAgICAgICBpc05vZGVIaWdobGlnaHRlZChuKSB7CiAgICAgICAgICAgIHJldHVybiBuID09PSB0aGlzLmhpZ2hsaWdodGVkTm9kZTsKICAgICAgICB9CiAgICAgICAgYWRkQW5ub3RhdGlvbkdyb3VwKGEsIGQsIHNlbGVjdGlvbikgewogICAgICAgICAgICB2YXIgYW4gPSBhLm5vZGUubmFtZTsKICAgICAgICAgICAgdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYW5dID0gdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYW5dIHx8IHt9OwogICAgICAgICAgICB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthbl1bZC5ub2RlLm5hbWVdID0gc2VsZWN0aW9uOwogICAgICAgIH0KICAgICAgICBnZXRBbm5vdGF0aW9uR3JvdXBzSW5kZXgoYSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbkdyb3VwSW5kZXhbYV07CiAgICAgICAgfQogICAgICAgIHJlbW92ZUFubm90YXRpb25Hcm91cChhLCBkKSB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9hbm5vdGF0aW9uR3JvdXBJbmRleFthLm5vZGUubmFtZV1bZC5ub2RlLm5hbWVdOwogICAgICAgIH0KICAgICAgICBhZGROb2RlR3JvdXAobiwgc2VsZWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX25vZGVHcm91cEluZGV4W25dID0gc2VsZWN0aW9uOwogICAgICAgIH0KICAgICAgICBnZXROb2RlR3JvdXAobikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbm9kZUdyb3VwSW5kZXhbbl07CiAgICAgICAgfQogICAgICAgIHJlbW92ZU5vZGVHcm91cChuKSB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9ub2RlR3JvdXBJbmRleFtuXTsKICAgICAgICB9CiAgICAgICAgYWRkRWRnZUdyb3VwKG4sIHNlbGVjdGlvbikgewogICAgICAgICAgICB0aGlzLl9lZGdlR3JvdXBJbmRleFtuXSA9IHNlbGVjdGlvbjsKICAgICAgICB9CiAgICAgICAgZ2V0RWRnZUdyb3VwKGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VkZ2VHcm91cEluZGV4W2VdOwogICAgICAgIH0KICAgICAgICBfdXBkYXRlSGVhbHRoUGlsbHMoKSB7CiAgICAgICAgICAgIHZhciBub2RlTmFtZXNUb0hlYWx0aFBpbGxzID0gdGhpcy5ub2RlTmFtZXNUb0hlYWx0aFBpbGxzOwogICAgICAgICAgICB2YXIgaGVhbHRoUGlsbFN0ZXBJbmRleCA9IHRoaXMuaGVhbHRoUGlsbFN0ZXBJbmRleDsKICAgICAgICAgICAgYWRkSGVhbHRoUGlsbHModGhpcy4kLnN2Zywgbm9kZU5hbWVzVG9IZWFsdGhQaWxscywgaGVhbHRoUGlsbFN0ZXBJbmRleCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSBub2RlIGFuZCBhbm5vdGF0aW9uIG5vZGUgb2YgdGhlIGdpdmVuIG5hbWUuCiAgICAgICAgICogQHBhcmFtICB7U3RyaW5nfSBuIG5vZGUgbmFtZQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVOb2RlU3RhdGUobikgewogICAgICAgICAgICB2YXIgbm9kZSA9IHRoaXMuZ2V0Tm9kZShuKTsKICAgICAgICAgICAgdmFyIG5vZGVHcm91cCA9IHRoaXMuZ2V0Tm9kZUdyb3VwKG4pOwogICAgICAgICAgICBpZiAobm9kZUdyb3VwKSB7CiAgICAgICAgICAgICAgICBzdHlsaXplJDEobm9kZUdyb3VwLCBub2RlLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZS5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLk1FVEEgJiYKICAgICAgICAgICAgICAgIG5vZGUubm9kZS5hc3NvY2lhdGVkRnVuY3Rpb24gJiYKICAgICAgICAgICAgICAgICFub2RlLmlzTGlicmFyeUZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBpcyB0aGF0IG9mIGEgZnVuY3Rpb24gY2FsbC4gQWxzbyBsaW5rIHRoZSBub2RlIHdpdGhpbiB0aGUKICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGxpYnJhcnkuIFRoaXMgY2xhcmlmaWVzIHRvIHRoZSB1c2VyIHRoYXQgdGhlIGxpYnJhcnkgZnVuY3Rpb24KICAgICAgICAgICAgICAgIC8vIGlzIGJlaW5nIHVzZWQuCiAgICAgICAgICAgICAgICB2YXIgbGlicmFyeUZ1bmN0aW9uTm9kZU5hbWUgPSBGVU5DVElPTl9MSUJSQVJZX05PREVfUFJFRklYICsKICAgICAgICAgICAgICAgICAgICBub2RlLm5vZGUuYXNzb2NpYXRlZEZ1bmN0aW9uOwogICAgICAgICAgICAgICAgdmFyIGZ1bmN0aW9uR3JvdXAgPSBzZWxlY3QoJy4nICsKICAgICAgICAgICAgICAgICAgICBDbGFzcyQyLlNjZW5lLkdST1VQICsKICAgICAgICAgICAgICAgICAgICAnPi4nICsKICAgICAgICAgICAgICAgICAgICBDbGFzcyQyLlNjZW5lLkZVTkNUSU9OX0xJQlJBUlkgKwogICAgICAgICAgICAgICAgICAgICcgZ1tkYXRhLW5hbWU9IicgKwogICAgICAgICAgICAgICAgICAgIGxpYnJhcnlGdW5jdGlvbk5vZGVOYW1lICsKICAgICAgICAgICAgICAgICAgICAnIl0nKTsKICAgICAgICAgICAgICAgIHN0eWxpemUkMShmdW5jdGlvbkdyb3VwLCBub2RlLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgYW5ub3RhdGlvbkdyb3VwSW5kZXggPSB0aGlzLmdldEFubm90YXRpb25Hcm91cHNJbmRleChuKTsKICAgICAgICAgICAgbG9kYXNoLmVhY2goYW5ub3RhdGlvbkdyb3VwSW5kZXgsIChhR3JvdXAsIGhvc3ROYW1lKSA9PiB7CiAgICAgICAgICAgICAgICBzdHlsaXplJDEoYUdyb3VwLCBub2RlLCB0aGlzLCBDbGFzcyQyLkFubm90YXRpb24uTk9ERSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIG5ldyBub2RlIHNlbGVjdGlvbi4gMSkgVXBkYXRlcyB0aGUgc2VsZWN0ZWQtc3RhdGUgb2YgZWFjaCBub2RlLAogICAgICAgICAqIDIpIHRyaWdnZXJzIGlucHV0IHRyYWNpbmcuCiAgICAgICAgICogQHBhcmFtIHNlbGVjdGVkTm9kZSB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgbmV3bHkgc2VsZWN0ZWQgbm9kZS4KICAgICAgICAgKiBAcGFyYW0gb2xkU2VsZWN0ZWROb2RlIHtzdHJpbmd9IFRoZSBuYW1lIG9mIHRoZSBwcmV2aW91c2x5IHNlbGVjdGVkIG5vZGUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBfc2VsZWN0ZWROb2RlQ2hhbmdlZChzZWxlY3RlZE5vZGUsIG9sZFNlbGVjdGVkTm9kZSkgewogICAgICAgICAgICBpZiAoc2VsZWN0ZWROb2RlID09PSBvbGRTZWxlY3RlZE5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob2xkU2VsZWN0ZWROb2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVOb2RlU3RhdGUob2xkU2VsZWN0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXNlbGVjdGVkTm9kZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbWluaW1hcCB0byByZWZsZWN0IHRoZSBoaWdobGlnaHRlZCAoc2VsZWN0ZWQpIG5vZGUuCiAgICAgICAgICAgIHRoaXMubWluaW1hcC51cGRhdGUoKTsKICAgICAgICAgICAgdmFyIG5vZGUgPSB0aGlzLnJlbmRlckhpZXJhcmNoeS5oaWVyYXJjaHkubm9kZShzZWxlY3RlZE5vZGUpOwogICAgICAgICAgICB2YXIgbm9kZVBhcmVudHMgPSBbXTsKICAgICAgICAgICAgLy8gQ3JlYXRlIGxpc3Qgb2YgYWxsIG1ldGFub2RlIHBhcmVudHMgb2YgdGhlIHNlbGVjdGVkIG5vZGUuCiAgICAgICAgICAgIHdoaWxlIChub2RlLnBhcmVudE5vZGUgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLm5hbWUgIT0gUk9PVF9OQU1FKSB7CiAgICAgICAgICAgICAgICBub2RlID0gbm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgbm9kZVBhcmVudHMucHVzaChub2RlLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEVuc3VyZSBlYWNoIHBhcmVudCBtZXRhbm9kZSBpcyBidWlsdCBhbmQgZXhwYW5kZWQuCiAgICAgICAgICAgIHZhciB0b3BQYXJlbnROb2RlVG9CZUV4cGFuZGVkOwogICAgICAgICAgICBsb2Rhc2guZm9yRWFjaFJpZ2h0KG5vZGVQYXJlbnRzLCAocGFyZW50TmFtZSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkocGFyZW50TmFtZSk7CiAgICAgICAgICAgICAgICB2YXIgcmVuZGVyTm9kZSA9IHRoaXMucmVuZGVySGllcmFyY2h5LmdldFJlbmRlck5vZGVCeU5hbWUocGFyZW50TmFtZSk7CiAgICAgICAgICAgICAgICBpZiAocmVuZGVyTm9kZS5ub2RlLmlzR3JvdXBOb2RlICYmICFyZW5kZXJOb2RlLmV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5leHBhbmRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0b3BQYXJlbnROb2RlVG9CZUV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvcFBhcmVudE5vZGVUb0JlRXhwYW5kZWQgPSByZW5kZXJOb2RlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIElmIGFueSBleHBhbnNpb24gd2FzIG5lZWRlZCB0byBkaXNwbGF5IHRoaXMgc2VsZWN0ZWQgbm9kZSwgdGhlbgogICAgICAgICAgICAvLyBpbmZvcm0gdGhlIHNjZW5lIG9mIHRoZSB0b3AtbW9zdCBleHBhbnNpb24uCiAgICAgICAgICAgIGlmICh0b3BQYXJlbnROb2RlVG9CZUV4cGFuZGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldE5vZGVFeHBhbmRlZCh0b3BQYXJlbnROb2RlVG9CZUV4cGFuZGVkKTsKICAgICAgICAgICAgICAgIHRoaXMuX3pvb21lZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGVjdGVkTm9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTm9kZVN0YXRlKHNlbGVjdGVkTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gR2l2ZSB0aW1lIGZvciBhbnkgZXhwYW5kaW5nIHRvIGZpbmlzaCBiZWZvcmUgcGFubmluZyB0byBhIG5vZGUuCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIHBhbiB3aWxsIGJlIGNvbXB1dGVkIGZyb20gaW5jb3JyZWN0IG1lYXN1cmVtZW50cy4KICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnBhblRvTm9kZShzZWxlY3RlZE5vZGUpOwogICAgICAgICAgICB9LCBQQVJBTVMkMS5hbmltYXRpb24uZHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICBfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZChoaWdobGlnaHRlZE5vZGUsIG9sZEhpZ2hsaWdodGVkTm9kZSkgewogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0ZWROb2RlID09PSBvbGRIaWdobGlnaHRlZE5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGlnaGxpZ2h0ZWROb2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVOb2RlU3RhdGUoaGlnaGxpZ2h0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob2xkSGlnaGxpZ2h0ZWROb2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVOb2RlU3RhdGUob2xkSGlnaGxpZ2h0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfb25ab29tQ2hhbmdlZCgpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlTGFiZWxzKCF0aGlzLl96b29tZWQpOwogICAgICAgIH0KICAgICAgICBfZmlyZUVuYWJsZUNsaWNrKCkgewogICAgICAgICAgICB0aGlzLmZpcmUoJ2VuYWJsZS1jbGljaycpOwogICAgICAgIH0KICAgICAgICAvLyBXaGVuIHJlbmRlckhpZXJhcmNoeSBjaGFuZ2VzLCB3ZSBuZWVkIHRvIGZpcnN0IGJ1aWxkIHRoZSBuZXcgU1ZHIGJhc2VkCiAgICAgICAgLy8gb24gdGhlIG5ldyBoaWVyYXJjaHkgKGFuZCBpdCBpcyBhc3luY2hyb25vdXMpLiBXZSB3aWxsIGxldCB0aGF0IG9ic2VydmVyCiAgICAgICAgLy8gdXBkYXRlIHRoZSBpbnB1dCB0cmFjZS4KICAgICAgICBfdXBkYXRlSW5wdXRUcmFjZSgpIHsKICAgICAgICAgICAgdXBkYXRlSW5wdXRUcmFjZSh0aGlzLmdldEdyYXBoU3ZnUm9vdCgpLCB0aGlzLnJlbmRlckhpZXJhcmNoeSwgdGhpcy5zZWxlY3RlZE5vZGUsIHRoaXMudHJhY2VJbnB1dHMpOwogICAgICAgIH0KICAgIH07CiAgICBUZkdyYXBoU2NlbmUyLnRlbXBsYXRlID0gdGVtcGxhdGUkajsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVuZGVyR3JhcGhJbmZvKQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJyZW5kZXJIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIm5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgImNvbG9yQnkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhTY2VuZTIucHJvdG90eXBlLCAidHJhY2VJbnB1dHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhTY2VuZTIucHJvdG90eXBlLCAiX2hhc1JlbmRlckhpZXJhcmNoeUJlZW5GaXRPbmNlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIl9pc0F0dGFjaGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJfem9vbSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfaGlnaGxpZ2h0ZWROb2RlQ2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgImhpZ2hsaWdodGVkTm9kZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfc2VsZWN0ZWROb2RlQ2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgInNlbGVjdGVkTm9kZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhTY2VuZTIucHJvdG90eXBlLCAiaGFuZGxlRWRnZVNlbGVjdGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfb25ab29tQ2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJfem9vbWVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJfem9vbVN0YXJ0Q29vcmRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJfem9vbVRyYW5zZm9ybSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhTY2VuZTIucHJvdG90eXBlLCAiX21heFpvb21EaXN0YW5jZUZvckNsaWNrIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgInRlbXBsYXRlSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIm1pbmltYXAiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIl9ub2RlR3JvdXBJbmRleCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhTY2VuZTIucHJvdG90eXBlLCAiX2Fubm90YXRpb25Hcm91cEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJfZWRnZUdyb3VwSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIm1heE1ldGFub2RlTGFiZWxMZW5ndGhGb250U2l6ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhTY2VuZTIucHJvdG90eXBlLCAibWluTWV0YW5vZGVMYWJlbExlbmd0aEZvbnRTaXplIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoTGFyZ2VGb250Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJtYXhNZXRhbm9kZUxhYmVsTGVuZ3RoIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJwcm9ncmVzcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIm5vZGVDb250ZXh0TWVudUl0ZW1zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJoZWFsdGhQaWxsU3RlcEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3JlbmRlckhpZXJhcmNoeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaFNjZW5lMi5wcm90b3R5cGUsICJfcmVuZGVySGllcmFyY2h5Q2hhbmdlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX2lzQXR0YWNoZWQnLCAncmVuZGVySGllcmFyY2h5JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIl9hbmltYXRlQW5kRml0IiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdjb2xvckJ5JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIl9jb2xvckJ5Q2hhbmdlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnbm9kZU5hbWVzVG9IZWFsdGhQaWxscycsICdoZWFsdGhQaWxsU3RlcEluZGV4JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIl91cGRhdGVIZWFsdGhQaWxscyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgndHJhY2VJbnB1dHMnLCAnc2VsZWN0ZWROb2RlJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoU2NlbmUyLnByb3RvdHlwZSwgIl91cGRhdGVJbnB1dFRyYWNlIiwgbnVsbCk7CiAgICBUZkdyYXBoU2NlbmUyID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZ3JhcGgtc2NlbmUnKQogICAgXSwgVGZHcmFwaFNjZW5lMik7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZHcmFwaCA9IGNsYXNzIFRmR3JhcGggZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyRGVwdGggPSAxOwogICAgICAgICAgICB0aGlzLl9hbGxvd0dyYXBoU2VsZWN0ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5lZGdlV2lkdGhGdW5jdGlvbiA9ICcnOwogICAgICAgICAgICB0aGlzLmhhbmRsZU5vZGVTZWxlY3RlZCA9ICcnOwogICAgICAgICAgICB0aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uID0gJyc7CiAgICAgICAgICAgIHRoaXMuaGFuZGxlRWRnZVNlbGVjdGVkID0gJyc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFBhbnMgdG8gYSBub2RlLiBBc3N1bWVzIHRoYXQgdGhlIG5vZGUgZXhpc3RzLgogICAgICAgICAqIEBwYXJhbSBub2RlTmFtZSB7c3RyaW5nfSBUaGUgbmFtZSBvZiB0aGUgbm9kZSB0byBwYW4gdG8uCiAgICAgICAgICovCiAgICAgICAgcGFuVG9Ob2RlKG5vZGVOYW1lKSB7CiAgICAgICAgICAgIHRoaXMuJCQoJ3RmLWdyYXBoLXNjZW5lJykucGFuVG9Ob2RlKG5vZGVOYW1lKTsKICAgICAgICB9CiAgICAgICAgX2J1aWxkTmV3UmVuZGVySGllcmFyY2h5KCkgewogICAgICAgICAgICB2YXIgZ3JhcGhIaWVyYXJjaHkgPSB0aGlzLmdyYXBoSGllcmFyY2h5OwogICAgICAgICAgICBpZiAoIWdyYXBoSGllcmFyY2h5KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeShncmFwaEhpZXJhcmNoeSk7CiAgICAgICAgfQogICAgICAgIF9zdGF0c0NoYW5nZWQoKSB7CiAgICAgICAgICAgIHZhciBzdGF0cyA9IHRoaXMuc3RhdHM7CiAgICAgICAgICAgIHZhciBkZXZpY2VzRm9yU3RhdHMgPSB0aGlzLmRldmljZXNGb3JTdGF0czsKICAgICAgICAgICAgaWYgKHRoaXMuZ3JhcGhIaWVyYXJjaHkpIHsKICAgICAgICAgICAgICAgIGlmIChzdGF0cyAmJiBkZXZpY2VzRm9yU3RhdHMpIHsKICAgICAgICAgICAgICAgICAgICBqb2luU3RhdHNJbmZvV2l0aEdyYXBoKHRoaXMuYmFzaWNHcmFwaCwgc3RhdHMsIGRldmljZXNGb3JTdGF0cyk7CiAgICAgICAgICAgICAgICAgICAgam9pbkFuZEFnZ3JlZ2F0ZVN0YXRzKHRoaXMuZ3JhcGhIaWVyYXJjaHkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUmVjb21wdXRlIHRoZSByZW5kZXJpbmcgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICB0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdncmFwaC1zZWxlY3QnLCB0aGlzLl9ncmFwaFNlbGVjdGVkLmJpbmQodGhpcykpOwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2Rpc2FibGUtY2xpY2snLCB0aGlzLl9kaXNhYmxlQ2xpY2suYmluZCh0aGlzKSk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZW5hYmxlLWNsaWNrJywgdGhpcy5fZW5hYmxlQ2xpY2suYmluZCh0aGlzKSk7CiAgICAgICAgICAgIC8vIE5vZGVzCiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbm9kZS10b2dnbGUtZXhwYW5kJywgdGhpcy5fbm9kZVRvZ2dsZUV4cGFuZC5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdub2RlLXNlbGVjdCcsIHRoaXMuX25vZGVTZWxlY3RlZC5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdub2RlLWhpZ2hsaWdodCcsIHRoaXMuX25vZGVIaWdobGlnaHRlZC5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdub2RlLXVuaGlnaGxpZ2h0JywgdGhpcy5fbm9kZVVuaGlnaGxpZ2h0ZWQuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbm9kZS10b2dnbGUtZXh0cmFjdCcsIHRoaXMuX25vZGVUb2dnbGVFeHRyYWN0LmJpbmQodGhpcykpOwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ25vZGUtdG9nZ2xlLXNlcmllc2dyb3VwJywgdGhpcy5fbm9kZVRvZ2dsZVNlcmllc0dyb3VwLmJpbmQodGhpcykpOwogICAgICAgICAgICAvLyBFZGdlcwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2VkZ2Utc2VsZWN0JywgdGhpcy5fZWRnZVNlbGVjdGVkLmJpbmQodGhpcykpOwogICAgICAgICAgICAvLyBBbm5vdGF0aW9ucwogICAgICAgICAgICAvKiBOb3RlOiBjdXJyZW50bHkgaGlnaGxpZ2h0aW5nL3NlbGVjdGluZyBhbm5vdGF0aW9uIG5vZGUgaGFzIHRoZSBzYW1lCiAgICAgICAgICAgICAqIGJlaGF2aW9yIGFzIGhpZ2hsaWdodGluZy9zZWxlY3RpbmcgYWN0dWFsIG5vZGUgc28gd2UgcG9pbnQgdG8gdGhlIHNhbWUKICAgICAgICAgICAgICogc2V0IG9mIGV2ZW50IGxpc3RlbmVycy4gIEhvd2V2ZXIsIHdlIG1pZ2h0IHJlZGVzaWduIHRoaXMgdG8gYmUgYSBiaXQKICAgICAgICAgICAgICogZGlmZmVyZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9uLXNlbGVjdCcsIHRoaXMuX25vZGVTZWxlY3RlZC5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9uLWhpZ2hsaWdodCcsIHRoaXMuX25vZGVIaWdobGlnaHRlZC5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdhbm5vdGF0aW9uLXVuaGlnaGxpZ2h0JywgdGhpcy5fbm9kZVVuaGlnaGxpZ2h0ZWQuYmluZCh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIF9idWlsZFJlbmRlckhpZXJhcmNoeShncmFwaEhpZXJhcmNoeSkgewogICAgICAgICAgICB0aW1lJDMoJ25ldyB0Zl9ncmFwaF9yZW5kZXIuSGllcmFyY2h5JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKGdyYXBoSGllcmFyY2h5LnJvb3QudHlwZSAhPT0gTm9kZVR5cGUuTUVUQSkgewogICAgICAgICAgICAgICAgICAgIC8vIHJvb3QgbXVzdCBiZSBtZXRhbm9kZSBidXQgc29tZXRpbWVzIFBvbHltZXIncyBkb20taWYgaGFzIG5vdAogICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0Zi1ncmFwaCBlbGVtZW50IHlldCBpbiA8dGYtbm9kZS1pbmZvPgogICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aHVzIG1pc3Rha2VubHkgcGFzcyBub24tbWV0YW5vZGUgdG8gdGhpcyBtb2R1bGUuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHJlbmRlckdyYXBoID0gbmV3IFJlbmRlckdyYXBoSW5mbyhncmFwaEhpZXJhcmNoeSwgISF0aGlzLnN0YXRzIC8qKiBkaXNwbGF5aW5nU3RhdHMgKi8pOwogICAgICAgICAgICAgICAgcmVuZGVyR3JhcGguZWRnZUxhYmVsRnVuY3Rpb24gPSB0aGlzLmVkZ2VMYWJlbEZ1bmN0aW9uOwogICAgICAgICAgICAgICAgcmVuZGVyR3JhcGguZWRnZVdpZHRoRnVuY3Rpb24gPSB0aGlzLmVkZ2VXaWR0aEZ1bmN0aW9uOwogICAgICAgICAgICAgICAgLy8gUHJvZHVjaW5nIHRoZSAnY29sb3IgYnknIHBhcmFtZXRlcnMgdG8gYmUgY29uc3VtZWQKICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSB0Zi1ncmFwaC1jb250cm9scyBwYW5lbC4gSXQgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCiAgICAgICAgICAgICAgICAvLyBtaW4gYW5kIG1heCB2YWx1ZXMgYW5kIHRoZWlyIHJlc3BlY3RpdmUgY29sb3JzLCBhcyB3ZWxsIGFzIGxpc3QKICAgICAgICAgICAgICAgIC8vIG9mIGRldmljZXMgd2l0aCB0aGVpciByZXNwZWN0aXZlIGNvbG9ycy4KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGdldENvbG9yUGFyYW1zRnJvbVNjYWxlKHNjYWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluVmFsdWU6IHNjYWxlLmRvbWFpbigpWzBdLAogICAgICAgICAgICAgICAgICAgICAgICBtYXhWYWx1ZTogc2NhbGUuZG9tYWluKClbMV0sCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0Q29sb3I6IHNjYWxlLnJhbmdlKClbMF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGVuZENvbG9yOiBzY2FsZS5yYW5nZSgpWzFdLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDb2xvckJ5UGFyYW1zKHsKICAgICAgICAgICAgICAgICAgICBjb21wdXRlX3RpbWU6IGdldENvbG9yUGFyYW1zRnJvbVNjYWxlKHJlbmRlckdyYXBoLmNvbXB1dGVUaW1lU2NhbGUpLAogICAgICAgICAgICAgICAgICAgIG1lbW9yeTogZ2V0Q29sb3JQYXJhbXNGcm9tU2NhbGUocmVuZGVyR3JhcGgubWVtb3J5VXNhZ2VTY2FsZSksCiAgICAgICAgICAgICAgICAgICAgZGV2aWNlOiBsb2Rhc2gubWFwKHJlbmRlckdyYXBoLmRldmljZUNvbG9yTWFwLmRvbWFpbigpLCBmdW5jdGlvbiAoZGV2aWNlTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlOiBkZXZpY2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6IHJlbmRlckdyYXBoLmRldmljZUNvbG9yTWFwKGRldmljZU5hbWUpLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICAgICAgICAgIHhsYV9jbHVzdGVyOiBsb2Rhc2gubWFwKHJlbmRlckdyYXBoLnhsYUNsdXN0ZXJDb2xvck1hcC5kb21haW4oKSwgZnVuY3Rpb24gKHhsYUNsdXN0ZXJOYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB4bGFfY2x1c3RlcjogeGxhQ2x1c3Rlck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvcjogcmVuZGVyR3JhcGgueGxhQ2x1c3RlckNvbG9yTWFwKHhsYUNsdXN0ZXJOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fc2V0UmVuZGVySGllcmFyY2h5KHJlbmRlckdyYXBoKTsKICAgICAgICAgICAgICAgIHRoaXMuYXN5bmMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZSgncmVuZGVyZWQnKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICAgIH0KICAgICAgICBfZ2V0VmlzaWJsZShuYW1lKSB7CiAgICAgICAgICAgIGlmICghbmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVySGllcmFyY2h5LmdldE5lYXJlc3RWaXNpYmxlQW5jZXN0b3IobmFtZSk7CiAgICAgICAgfQogICAgICAgIGZpdCgpIHsKICAgICAgICAgICAgdGhpcy4kLnNjZW5lLmZpdCgpOwogICAgICAgIH0KICAgICAgICBfZ3JhcGhDaGFuZ2VkKCkgewogICAgICAgICAgICAvLyBXaGVuIGEgbmV3IGdyYXBoIGlzIGxvYWRlZCwgZmlyZSB0aGlzIGV2ZW50IHNvIHRoYXQgdGhlcmUgaXMgbm8KICAgICAgICAgICAgLy8gaW5mby1jYXJkIGJlaW5nIGRpc3BsYXllZCBmb3IgdGhlIHByZXZpb3VzbHktbG9hZGVkIGdyYXBoLgogICAgICAgICAgICB0aGlzLmZpcmUoJ2dyYXBoLXNlbGVjdCcpOwogICAgICAgIH0KICAgICAgICBfZ3JhcGhTZWxlY3RlZChldmVudCkgewogICAgICAgICAgICAvLyBHcmFwaCBzZWxlY3Rpb24gaXMgbm90IGFsbG93ZWQgZHVyaW5nIGFuIGFjdGl2ZSB6b29tIGV2ZW50LCBhcyB0aGUKICAgICAgICAgICAgLy8gY2xpY2sgc2VlbiBkdXJpbmcgYSB6b29tL3BhbiBpcyBwYXJ0IG9mIHRoZSB6b29taW5nIGFuZCBkb2VzIG5vdAogICAgICAgICAgICAvLyBpbmRpY2F0ZSBhIHVzZXIgZGVzaXJlIHRvIGNsaWNrIG9uIGEgc3BlY2lmaWMgc2VjdGlvbiBvZiB0aGUgZ3JhcGguCiAgICAgICAgICAgIGlmICh0aGlzLl9hbGxvd0dyYXBoU2VsZWN0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnc2VsZWN0ZWROb2RlJywgbnVsbCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnc2VsZWN0ZWRFZGdlJywgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzZXQgdGhpcyB2YXJpYWJsZSBhcyBhIGJ1ZyBpbiBkMyB6b29tIGJlaGF2aW9yIGNhbiBjYXVzZSB6b29tZW5kCiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG5vdCB0byBiZSBjYWxsZWQgaWYgYSByaWdodC1jbGljayBoYXBwZW5zIGR1cmluZyBhIHpvb20gZXZlbnQuCiAgICAgICAgICAgIHRoaXMuX2FsbG93R3JhcGhTZWxlY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBfZGlzYWJsZUNsaWNrKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2FsbG93R3JhcGhTZWxlY3QgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX2VuYWJsZUNsaWNrKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2FsbG93R3JhcGhTZWxlY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2VsZWN0ZWQgbm9kZSBjaGFuZ2VzLCBpZSB0aGVyZSBpcyBhIG5ldyBzZWxlY3RlZCBub2RlIG9yCiAgICAgICAgLy8gdGhlIGN1cnJlbnQgb25lIGlzIHVuc2VsZWN0ZWQuCiAgICAgICAgX3NlbGVjdGVkTm9kZUNoYW5nZWQoKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZE5vZGUgPSB0aGlzLnNlbGVjdGVkTm9kZTsKICAgICAgICAgICAgaWYgKHRoaXMuaGFuZGxlTm9kZVNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAvLyBBIGhpZ2hlci1sZXZlbCBjb21wb25lbnQgcHJvdmlkZWQgYSBjYWxsYmFjay4gUnVuIGl0LgogICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVOb2RlU2VsZWN0ZWQoc2VsZWN0ZWROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgc2VsZWN0ZWQgZWRnZSBjaGFuZ2VzLCBpZSB0aGVyZSBpcyBhIG5ldyBzZWxlY3RlZCBlZGdlIG9yCiAgICAgICAgLy8gdGhlIGN1cnJlbnQgb25lIGlzIHVuc2VsZWN0ZWQuCiAgICAgICAgX3NlbGVjdGVkRWRnZUNoYW5nZWQoKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZEVkZ2UgPSB0aGlzLnNlbGVjdGVkRWRnZTsKICAgICAgICAgICAgdGhpcy5fZGVzZWxlY3RQcmV2aW91c0VkZ2UoKTsKICAgICAgICAgICAgLy8gVmlzdWFsbHkgbWFyayB0aGlzIG5ldyBlZGdlIGFzIHNlbGVjdGVkLgogICAgICAgICAgICBpZiAoc2VsZWN0ZWRFZGdlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0U2VsZWN0ZWRFZGdlR3JvdXAuY2xhc3NlZChDbGFzcyQyLkVkZ2UuU0VMRUNURUQsIHRydWUpOwogICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBjb2xvciBvZiB0aGUgbWFya2VyIHRvbyBpZiB0aGUgZWRnZSBoYXMgb25lLgogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2Uoc2VsZWN0ZWRFZGdlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5oYW5kbGVFZGdlU2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgIC8vIEEgaGlnaGVyLWxldmVsIGNvbXBvbmVudCBwcm92aWRlZCBhIGNhbGxiYWNrLiBSdW4gaXQuCiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZUVkZ2VTZWxlY3RlZChzZWxlY3RlZEVkZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIENhbGxlZCBvbmx5IHdoZW4gYSBuZXcgKG5vbi1udWxsKSBub2RlIGlzIHNlbGVjdGVkLgogICAgICAgIF9ub2RlU2VsZWN0ZWQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2FsbG93R3JhcGhTZWxlY3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdzZWxlY3RlZE5vZGUnLCBldmVudC5kZXRhaWwubmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzZXQgdGhpcyB2YXJpYWJsZSBhcyBhIGJ1ZyBpbiBkMyB6b29tIGJlaGF2aW9yIGNhbiBjYXVzZSB6b29tZW5kCiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG5vdCB0byBiZSBjYWxsZWQgaWYgYSByaWdodC1jbGljayBoYXBwZW5zIGR1cmluZyBhIHpvb20gZXZlbnQuCiAgICAgICAgICAgIHRoaXMuX2FsbG93R3JhcGhTZWxlY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBfZWRnZVNlbGVjdGVkKGV2ZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hbGxvd0dyYXBoU2VsZWN0KSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCcsIGV2ZW50LmRldGFpbC5lZGdlR3JvdXApOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ3NlbGVjdGVkRWRnZScsIGV2ZW50LmRldGFpbC5lZGdlRGF0YSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVzZXQgdGhpcyB2YXJpYWJsZSBhcyBhIGJ1ZyBpbiBkMyB6b29tIGJlaGF2aW9yIGNhbiBjYXVzZSB6b29tZW5kCiAgICAgICAgICAgIC8vIGNhbGxiYWNrIG5vdCB0byBiZSBjYWxsZWQgaWYgYSByaWdodC1jbGljayBoYXBwZW5zIGR1cmluZyBhIHpvb20gZXZlbnQuCiAgICAgICAgICAgIHRoaXMuX2FsbG93R3JhcGhTZWxlY3QgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBfbm9kZUhpZ2hsaWdodGVkKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdoaWdobGlnaHRlZE5vZGUnLCBldmVudC5kZXRhaWwubmFtZSk7CiAgICAgICAgfQogICAgICAgIF9ub2RlVW5oaWdobGlnaHRlZChldmVudCkgewogICAgICAgICAgICB0aGlzLnNldCgnaGlnaGxpZ2h0ZWROb2RlJywgbnVsbCk7CiAgICAgICAgfQogICAgICAgIF9ub2RlVG9nZ2xlRXhwYW5kKGV2ZW50KSB7CiAgICAgICAgICAgIC8vIEltbWVkaWF0ZWx5IHNlbGVjdCB0aGUgbm9kZSB0aGF0IGlzIGFib3V0IHRvIGJlIGV4cGFuZGVkLgogICAgICAgICAgICB0aGlzLl9ub2RlU2VsZWN0ZWQoZXZlbnQpOwogICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzdWItaGllcmFyY2h5IHNjZW5lLgogICAgICAgICAgICB2YXIgbm9kZU5hbWUgPSBldmVudC5kZXRhaWwubmFtZTsKICAgICAgICAgICAgdmFyIHJlbmRlck5vZGUgPSB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKG5vZGVOYW1lKTsKICAgICAgICAgICAgLy8gT3Agbm9kZXMgYXJlIG5vdCBleHBhbmRhYmxlLgogICAgICAgICAgICBpZiAocmVuZGVyTm9kZS5ub2RlLnR5cGUgPT09IE5vZGVUeXBlLk9QKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZW5kZXJIaWVyYXJjaHkuYnVpbGRTdWJoaWVyYXJjaHkobm9kZU5hbWUpOwogICAgICAgICAgICByZW5kZXJOb2RlLmV4cGFuZGVkID0gIXJlbmRlck5vZGUuZXhwYW5kZWQ7CiAgICAgICAgICAgIC8vIEV4cGFuZCB0aGUgbm9kZSB3aXRoIHNvbWUgZGVsYXkgc28gdGhhdCB0aGUgdXNlciBjYW4gaW1tZWRpYXRlbHkgc2VlCiAgICAgICAgICAgIC8vIHRoZSB2aXN1YWwgZWZmZWN0IG9mIHNlbGVjdGluZyB0aGF0IG5vZGUsIGJlZm9yZSB0aGUgZXhwYW5zaW9uIGlzCiAgICAgICAgICAgIC8vIGRvbmUuCiAgICAgICAgICAgIHRoaXMuYXN5bmMoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdGhpcy4kLnNjZW5lLnNldE5vZGVFeHBhbmRlZChyZW5kZXJOb2RlKTsKICAgICAgICAgICAgfSwgNzUpOwogICAgICAgIH0KICAgICAgICBfbm9kZVRvZ2dsZUV4dHJhY3QoZXZlbnQpIHsKICAgICAgICAgICAgLy8gVG9nZ2xlIHRoZSBpbmNsdWRlIHNldHRpbmcgb2YgdGhlIHNwZWNpZmllZCBub2RlIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgIHZhciBub2RlTmFtZSA9IGV2ZW50LmRldGFpbC5uYW1lOwogICAgICAgICAgICB0aGlzLm5vZGVUb2dnbGVFeHRyYWN0KG5vZGVOYW1lKTsKICAgICAgICB9CiAgICAgICAgbm9kZVRvZ2dsZUV4dHJhY3Qobm9kZU5hbWUpIHsKICAgICAgICAgICAgdmFyIHJlbmRlck5vZGUgPSB0aGlzLnJlbmRlckhpZXJhcmNoeS5nZXRSZW5kZXJOb2RlQnlOYW1lKG5vZGVOYW1lKTsKICAgICAgICAgICAgaWYgKHJlbmRlck5vZGUubm9kZS5pbmNsdWRlID09IEluY2x1c2lvblR5cGUuSU5DTFVERSkgewogICAgICAgICAgICAgICAgcmVuZGVyTm9kZS5ub2RlLmluY2x1ZGUgPSBJbmNsdXNpb25UeXBlLkVYQ0xVREU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVuZGVyTm9kZS5ub2RlLmluY2x1ZGUgPT0gSW5jbHVzaW9uVHlwZS5FWENMVURFKSB7CiAgICAgICAgICAgICAgICByZW5kZXJOb2RlLm5vZGUuaW5jbHVkZSA9IEluY2x1c2lvblR5cGUuSU5DTFVERTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlbmRlck5vZGUubm9kZS5pbmNsdWRlID0gdGhpcy5yZW5kZXJIaWVyYXJjaHkuaXNOb2RlQXV4aWxpYXJ5KHJlbmRlck5vZGUpCiAgICAgICAgICAgICAgICAgICAgPyBJbmNsdXNpb25UeXBlLklOQ0xVREUKICAgICAgICAgICAgICAgICAgICA6IEluY2x1c2lvblR5cGUuRVhDTFVERTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZWJ1aWxkIHRoZSByZW5kZXIgaGllcmFyY2h5LgogICAgICAgICAgICB0aGlzLl9idWlsZFJlbmRlckhpZXJhcmNoeSh0aGlzLmdyYXBoSGllcmFyY2h5KTsKICAgICAgICB9CiAgICAgICAgX25vZGVUb2dnbGVTZXJpZXNHcm91cChldmVudCkgewogICAgICAgICAgICAvLyBUb2dnbGUgdGhlIGdyb3VwIHNldHRpbmcgb2YgdGhlIHNwZWNpZmllZCBub2RlIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgIHZhciBub2RlTmFtZSA9IGV2ZW50LmRldGFpbC5uYW1lOwogICAgICAgICAgICB0aGlzLm5vZGVUb2dnbGVTZXJpZXNHcm91cChub2RlTmFtZSk7CiAgICAgICAgfQogICAgICAgIG5vZGVUb2dnbGVTZXJpZXNHcm91cChub2RlTmFtZSkgewogICAgICAgICAgICAvLyBUb2dnbGUgdGhlIGdyb3VwIHNldHRpbmcgb2YgdGhlIHNwZWNpZmllZCBub2RlIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgIHRvZ2dsZU5vZGVTZXJpZXNHcm91cCh0aGlzLmhpZXJhcmNoeVBhcmFtcy5zZXJpZXNNYXAsIG5vZGVOYW1lKTsKICAgICAgICAgICAgLy8gUmVidWlsZCB0aGUgcmVuZGVyIGhpZXJhcmNoeSB3aXRoIHRoZSB1cGRhdGVkIHNlcmllcyBncm91cGluZyBtYXAuCiAgICAgICAgICAgIHRoaXMuc2V0KCdwcm9ncmVzcycsIHsKICAgICAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICAgICAgbXNnOiAnJywKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciB0cmFja2VyID0gZ2V0VHJhY2tlcih0aGlzKTsKICAgICAgICAgICAgdmFyIGhpZXJhcmNoeVRyYWNrZXIgPSBnZXRTdWJ0YXNrVHJhY2tlcih0cmFja2VyLCAxMDAsICdOYW1lc3BhY2UgaGllcmFyY2h5Jyk7CiAgICAgICAgICAgIGJ1aWxkJDEodGhpcy5iYXNpY0dyYXBoLCB0aGlzLmhpZXJhcmNoeVBhcmFtcywgaGllcmFyY2h5VHJhY2tlcikKICAgICAgICAgICAgICAgIC50aGVuKGZ1bmN0aW9uIChncmFwaEhpZXJhcmNoeSkgewogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ2dyYXBoSGllcmFyY2h5JywgZ3JhcGhIaWVyYXJjaHkpOwogICAgICAgICAgICAgICAgdGhpcy5fYnVpbGRSZW5kZXJIaWVyYXJjaHkodGhpcy5ncmFwaEhpZXJhcmNoeSk7CiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIF9kZXNlbGVjdFByZXZpb3VzRWRnZSgpIHsKICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTZWxlY3RvciA9ICcuJyArIENsYXNzJDIuRWRnZS5TRUxFQ1RFRDsKICAgICAgICAgICAgLy8gVmlzdWFsbHkgbWFyayB0aGUgcHJldmlvdXNseSBzZWxlY3RlZCBlZGdlIChpZiBhbnkpIGFzIGRlc2VsZWN0ZWQuCiAgICAgICAgICAgIHNlbGVjdChzZWxlY3RlZFNlbGVjdG9yKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoQ2xhc3MkMi5FZGdlLlNFTEVDVEVELCBmYWxzZSkKICAgICAgICAgICAgICAgIC5lYWNoKChkLCBpKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBSZXNldCBpdHMgbWFya2VyLgogICAgICAgICAgICAgICAgaWYgKGQubGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXRocyA9IHNlbGVjdCh0aGlzKS5zZWxlY3RBbGwoJ3BhdGguZWRnZWxpbmUnKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZC5sYWJlbC5zdGFydE1hcmtlcklkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnN0eWxlKCdtYXJrZXItc3RhcnQnLCBgdXJsKCMke2QubGFiZWwuc3RhcnRNYXJrZXJJZH0pYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChkLmxhYmVsLmVuZE1hcmtlcklkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhzLnN0eWxlKCdtYXJrZXItZW5kJywgYHVybCgjJHtkLmxhYmVsLmVuZE1hcmtlcklkfSlgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfdXBkYXRlTWFya2VyT2ZTZWxlY3RlZEVkZ2Uoc2VsZWN0ZWRFZGdlKSB7CiAgICAgICAgICAgIGlmIChzZWxlY3RlZEVkZ2UubGFiZWwpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBtYXJrZXIgd2lsbCB2YXJ5IGJhc2VkIG9uIHRoZSBkaXJlY3Rpb24gb2YgdGhlIGVkZ2UuCiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJJZCA9IHNlbGVjdGVkRWRnZS5sYWJlbC5zdGFydE1hcmtlcklkIHx8IHNlbGVjdGVkRWRnZS5sYWJlbC5lbmRNYXJrZXJJZDsKICAgICAgICAgICAgICAgIGlmIChtYXJrZXJJZCkgewogICAgICAgICAgICAgICAgICAgIC8vIEZpbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFya2VyIGZvciBhIHNlbGVjdGVkIGVkZ2UuCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRNYXJrZXJJZCA9IG1hcmtlcklkLnJlcGxhY2UoJ2RhdGFmbG93LScsICdzZWxlY3RlZC0nKTsKICAgICAgICAgICAgICAgICAgICBsZXQgc2VsZWN0ZWRNYXJrZXIgPSB0aGlzLiQkKCcjJyArIHNlbGVjdGVkTWFya2VySWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghc2VsZWN0ZWRNYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG1hcmtlciBmb3IgYSBzZWxlY3RlZCBlZGdlIG9mIHRoaXMgc2l6ZSBkb2VzIG5vdCBleGlzdCB5ZXQuIENyZWF0ZSBpdC4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxNYXJrZXIgPSB0aGlzLiQuc2NlbmUucXVlcnlTZWxlY3RvcignIycgKyBtYXJrZXJJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWFya2VyID0gb3JpZ2luYWxNYXJrZXIuY2xvbmVOb2RlKHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1hcmtlci5zZXRBdHRyaWJ1dGUoJ2lkJywgc2VsZWN0ZWRNYXJrZXJJZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWFya2VyLmNsYXNzTGlzdC5hZGQoJ3NlbGVjdGVkLWFycm93aGVhZCcpOwogICAgICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbE1hcmtlci5wYXJlbnROb2RlLmFwcGVuZENoaWxkKHNlbGVjdGVkTWFya2VyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgcGF0aCB1c2UgdGhpcyBuZXcgbWFya2VyIHdoaWxlIGl0IGlzIHNlbGVjdGVkLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcmtlckF0dHJpYnV0ZSA9IHNlbGVjdGVkRWRnZS5sYWJlbC5zdGFydE1hcmtlcklkCiAgICAgICAgICAgICAgICAgICAgICAgID8gJ21hcmtlci1zdGFydCcKICAgICAgICAgICAgICAgICAgICAgICAgOiAnbWFya2VyLWVuZCc7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFNlbGVjdGVkRWRnZUdyb3VwCiAgICAgICAgICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3BhdGguZWRnZWxpbmUnKQogICAgICAgICAgICAgICAgICAgICAgICAuc3R5bGUobWFya2VyQXR0cmlidXRlLCBgdXJsKCMke3NlbGVjdGVkTWFya2VySWR9KWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdCh4KSB7CiAgICAgICAgICAgIHJldHVybiAheDsKICAgICAgICB9CiAgICB9OwogICAgVGZHcmFwaC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHN0eWxlPgogICAgICAuY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYmFja2dyb3VuZDogd2hpdGU7CiAgICAgICAgYm94LXNoYWRvdzogMCAxcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4yKTsKICAgICAgfQoKICAgICAgLnZlcnRpY2FsIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LXZlcnRpY2FsOwogICAgICB9CgogICAgICAuYXV0byB7CiAgICAgICAgQGFwcGx5IC0tbGF5b3V0LWZsZXgtYXV0bzsKICAgICAgICBAYXBwbHkgLS1sYXlvdXQtdmVydGljYWw7CiAgICAgIH0KCiAgICAgIGgyIHsKICAgICAgICB0ZXh0LWFsaWduOiBjZW50ZXI7CiAgICAgIH0KCiAgICAgIHBhcGVyLWJ1dHRvbiB7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8ZGl2IGNsYXNzPSJjb250YWluZXIiPgogICAgICA8ZGl2IGNsYXNzPSJ2ZXJ0aWNhbCI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3RpdGxlXV0iPgogICAgICAgICAgPGgyPltbdGl0bGVdXTwvaDI+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGYtZ3JhcGgtc2NlbmUKICAgICAgICAgIGlkPSJzY2VuZSIKICAgICAgICAgIGNsYXNzPSJhdXRvIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tyZW5kZXJIaWVyYXJjaHldXSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9IltbX2dldFZpc2libGUoaGlnaGxpZ2h0ZWROb2RlKV1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLWVkZ2U9Int7c2VsZWN0ZWRFZGdlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBwcm9ncmVzcz0iW1twcm9ncmVzc11dIgogICAgICAgICAgbm9kZS1jb250ZXh0LW1lbnUtaXRlbXM9Iltbbm9kZUNvbnRleHRNZW51SXRlbXNdXSIKICAgICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW25vZGVOYW1lc1RvSGVhbHRoUGlsbHNdXSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICA+PC90Zi1ncmFwaC1zY2VuZT4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfZ3JhcGhDaGFuZ2VkJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGgucHJvdG90eXBlLCAiZ3JhcGhIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImJhc2ljR3JhcGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgInN0YXRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJkZXZpY2VzRm9yU3RhdHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImhpZXJhcmNoeVBhcmFtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJwcm9ncmVzcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGgucHJvdG90eXBlLCAidGl0bGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGgucHJvdG90eXBlLCAic2VsZWN0ZWROb2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgInNlbGVjdGVkRWRnZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGgucHJvdG90eXBlLCAiX2xhc3RTZWxlY3RlZEVkZ2VHcm91cCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJoaWdobGlnaHRlZE5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImNvbG9yQnkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImNvbG9yQnlQYXJhbXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgInJlbmRlckhpZXJhcmNoeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJ0cmFjZUlucHV0cyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgIm5vZGVDb250ZXh0TWVudUl0ZW1zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJfcmVuZGVyRGVwdGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGgucHJvdG90eXBlLCAiX2FsbG93R3JhcGhTZWxlY3QiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImhlYWx0aFBpbGxTdGVwSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImVkZ2VXaWR0aEZ1bmN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJoYW5kbGVOb2RlU2VsZWN0ZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoLnByb3RvdHlwZSwgImVkZ2VMYWJlbEZ1bmN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJoYW5kbGVFZGdlU2VsZWN0ZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnZ3JhcGhIaWVyYXJjaHknLCAnZWRnZVdpZHRoRnVuY3Rpb24nLCAnaGFuZGxlTm9kZVNlbGVjdGVkJywgJ2VkZ2VMYWJlbEZ1bmN0aW9uJywgJ2hhbmRsZUVkZ2VTZWxlY3RlZCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJfYnVpbGROZXdSZW5kZXJIaWVyYXJjaHkiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3N0YXRzJywgJ2RldmljZXNGb3JTdGF0cycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJfc3RhdHNDaGFuZ2VkIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdzZWxlY3RlZE5vZGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmR3JhcGgucHJvdG90eXBlLCAiX3NlbGVjdGVkTm9kZUNoYW5nZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3NlbGVjdGVkRWRnZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaC5wcm90b3R5cGUsICJfc2VsZWN0ZWRFZGdlQ2hhbmdlZCIsIG51bGwpOwogICAgVGZHcmFwaCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWdyYXBoJykKICAgIF0sIFRmR3JhcGgpOwoKICAgIC8qKgogICAgICogRWxlbWVudCBmb3IgcHV0dGluZyB0Zi1ncmFwaCBhbmQgdGYtZ3JhcGgtaW5mbyBzaWRlIGJ5IHNpZGUuCiAgICAgKgogICAgICogRXhhbXBsZQogICAgICogPHRmLWdyYXBoLWJvYXJkIGdyYXBoPVtbZ3JhcGhdXT48L3RmLWdyYXBoLWJvYXJkPgogICAgICovCiAgICBsZXQgVGZHcmFwaEJvYXJkID0gY2xhc3MgVGZHcmFwaEJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHVzZXIgY2FuIHJlcXVlc3QgaGVhbHRoIHBpbGxzIGZvciBpbmRpdmlkdWFsIHN0ZXBzIGZyb20gdGhlIHNlcnZlci4gVGhpcyBjYW4gYmUKICAgICAgICAgICAgLy8gc2xvdyBjb21wYXJlZCB0aGUgZGVmYXVsdCBvZiBzaG93aW5nIHNhbXBsZWQgaGVhbHRoIHBpbGxzLgogICAgICAgICAgICB0aGlzLmFsbFN0ZXBzTW9kZUVuYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgLy8gUmVsZXZhbnQgaWYgYWxsU3RlcHNNb2RlRW5hYmxlZC4gVGhlIHNwZWNpZmljIHN0ZXAgZm9yIHdoaWNoIHRvIGZldGNoIGhlYWx0aCBwaWxscyBmcm9tIHRoZQogICAgICAgICAgICAvLyBzZXJ2ZXIgZm9yLgogICAgICAgICAgICB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAgPSAwOwogICAgICAgICAgICB0aGlzLmNvbXBhdE5vZGVUaXRsZSA9ICdUUFUgQ29tcGF0aWJpbGl0eSc7CiAgICAgICAgfQogICAgICAgIGZpdCgpIHsKICAgICAgICAgICAgdGhpcy4kLmdyYXBoLmZpdCgpOwogICAgICAgIH0KICAgICAgICAvKiogVHJ1ZSBpZiB0aGUgcHJvZ3Jlc3MgaXMgbm90IGNvbXBsZXRlIHlldCAoPCAxMDAgJSkuICovCiAgICAgICAgX2lzTm90Q29tcGxldGUocHJvZ3Jlc3MpIHsKICAgICAgICAgICAgcmV0dXJuIHByb2dyZXNzLnZhbHVlIDwgMTAwOwogICAgICAgIH0KICAgICAgICBfZ2V0Q29udGFpbmVyQ2xhc3MocHJvZ3Jlc3MpIHsKICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICdjb250YWluZXInOwogICAgICAgICAgICBpZiAocHJvZ3Jlc3MuZXJyb3IpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnIGVycm9yJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5faXNOb3RDb21wbGV0ZShwcm9ncmVzcykpIHsKICAgICAgICAgICAgICAgIHJlc3VsdCArPSAnIGxvYWRpbmcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIF9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuJC5ncmFwaC5ub2RlVG9nZ2xlRXh0cmFjdChldmVudC5kZXRhaWwubmFtZSk7CiAgICAgICAgfQogICAgICAgIF9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQoZXZlbnQpIHsKICAgICAgICAgICAgdGhpcy4kLmdyYXBoLm5vZGVUb2dnbGVTZXJpZXNHcm91cChldmVudC5kZXRhaWwubmFtZSk7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVOb2RlSW5jbHVkZSgpIHsKICAgICAgICAgICAgY29uc3Qgbm9kZSA9ICF0aGlzLnJlbmRlckhpZXJhcmNoeQogICAgICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgICAgICA6IHRoaXMucmVuZGVySGllcmFyY2h5LmdldE5vZGVCeU5hbWUodGhpcy5zZWxlY3RlZE5vZGUpOwogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZE5vZGVJbmNsdWRlID0gbm9kZQogICAgICAgICAgICAgICAgPyBub2RlLmluY2x1ZGUKICAgICAgICAgICAgICAgIDogSW5jbHVzaW9uVHlwZS5VTlNQRUNJRklFRDsKICAgICAgICB9CiAgICB9OwogICAgVGZHcmFwaEJvYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8c3R5bGU+CiAgICAgIDo6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KCiAgICAgIC9kZWVwLyAuY2xvc2UgewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgbGVmdDogMTVweDsKICAgICAgICBib3R0b206IDE1cHg7CiAgICAgIH0KCiAgICAgIC5jb250YWluZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CgogICAgICAuY29udGFpbmVyLmxvYWRpbmcgewogICAgICAgIGN1cnNvcjogcHJvZ3Jlc3M7CiAgICAgICAgb3BhY2l0eTogMC4xOwogICAgICB9CgogICAgICAuY29udGFpbmVyLmxvYWRpbmcuZXJyb3IgewogICAgICAgIGN1cnNvcjogYXV0bzsKICAgICAgfQoKICAgICAgI2luZm8gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICByaWdodDogNXB4OwogICAgICAgIHRvcDogNXB4OwogICAgICAgIHBhZGRpbmc6IDBweDsKICAgICAgICBtYXgtd2lkdGg6IDM4MHB4OwogICAgICAgIG1pbi13aWR0aDogMzIwcHg7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogcmdiYSgyNTUsIDI1NSwgMjU1LCAwLjkpOwogICAgICAgIEBhcHBseSAtLXNoYWRvdy1lbGV2YXRpb24tMmRwOwogICAgICB9CgogICAgICAjbWFpbiB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MtYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiA0MHB4OwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgZm9udC1zaXplOiAxM3B4OwogICAgICB9CgogICAgICAjcHJvZ3Jlc3MtbXNnIHsKICAgICAgICBtYXJnaW4tYm90dG9tOiA1cHg7CiAgICAgICAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgfQoKICAgICAgcGFwZXItcHJvZ3Jlc3MgewogICAgICAgIHdpZHRoOiA0MDBweDsKICAgICAgICAtLXBhcGVyLXByb2dyZXNzLWhlaWdodDogNnB4OwogICAgICAgIC0tcGFwZXItcHJvZ3Jlc3MtYWN0aXZlLWNvbG9yOiAjZjM5MTNlOwogICAgICB9CgogICAgICAuY29udGV4dC1tZW51IHsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTJlMmUyOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWluLXdpZHRoOiAxNTBweDsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjZDRkNGQ0OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCB7CiAgICAgICAgbGlzdC1zdHlsZS10eXBlOiBub25lOwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgfQoKICAgICAgL2RlZXAvIC5jb250ZXh0LW1lbnUgdWwgbGkgewogICAgICAgIHBhZGRpbmc6IDRweCAxNnB4OwogICAgICB9CgogICAgICAvZGVlcC8gLmNvbnRleHQtbWVudSB1bCBsaTpob3ZlciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2YzOTEzZTsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTm90Q29tcGxldGUocHJvZ3Jlc3MpXV0iPgogICAgICA8ZGl2IGlkPSJwcm9ncmVzcy1iYXIiPgogICAgICAgIDxkaXYgaWQ9InByb2dyZXNzLW1zZyI+W1twcm9ncmVzcy5tc2ddXTwvZGl2PgogICAgICAgIDxwYXBlci1wcm9ncmVzcyB2YWx1ZT0iW1twcm9ncmVzcy52YWx1ZV1dIj48L3BhcGVyLXByb2dyZXNzPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzJD0iW1tfZ2V0Q29udGFpbmVyQ2xhc3MocHJvZ3Jlc3MpXV0iPgogICAgICA8ZGl2IGlkPSJtYWluIj4KICAgICAgICA8dGYtZ3JhcGgKICAgICAgICAgIGlkPSJncmFwaCIKICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0ie3tncmFwaEhpZXJhcmNoeX19IgogICAgICAgICAgYmFzaWMtZ3JhcGg9IltbZ3JhcGhdXSIKICAgICAgICAgIGhpZXJhcmNoeS1wYXJhbXM9IltbaGllcmFyY2h5UGFyYW1zXV0iCiAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJ7e3JlbmRlckhpZXJhcmNoeX19IgogICAgICAgICAgZGV2aWNlcy1mb3Itc3RhdHM9IltbZGV2aWNlc0ZvclN0YXRzXV0iCiAgICAgICAgICBzdGF0cz0iW1tzdGF0c11dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIGhpZ2hsaWdodGVkLW5vZGU9Int7X2hpZ2hsaWdodGVkTm9kZX19IgogICAgICAgICAgY29sb3ItYnk9IltbY29sb3JCeV1dIgogICAgICAgICAgY29sb3ItYnktcGFyYW1zPSJ7e2NvbG9yQnlQYXJhbXN9fSIKICAgICAgICAgIHByb2dyZXNzPSJ7e3Byb2dyZXNzfX0iCiAgICAgICAgICBlZGdlLWxhYmVsLWZ1bmN0aW9uPSJbW2VkZ2VMYWJlbEZ1bmN0aW9uXV0iCiAgICAgICAgICBlZGdlLXdpZHRoLWZ1bmN0aW9uPSJbW2VkZ2VXaWR0aEZ1bmN0aW9uXV0iCiAgICAgICAgICBub2RlLW5hbWVzLXRvLWhlYWx0aC1waWxscz0iW1tub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iCiAgICAgICAgICBoZWFsdGgtcGlsbC1zdGVwLWluZGV4PSJbW2hlYWx0aFBpbGxTdGVwSW5kZXhdXSIKICAgICAgICAgIGhhbmRsZS1ub2RlLXNlbGVjdGVkPSJbW2hhbmRsZU5vZGVTZWxlY3RlZF1dIgogICAgICAgICAgaGFuZGxlLWVkZ2Utc2VsZWN0ZWQ9IltbaGFuZGxlRWRnZVNlbGVjdGVkXV0iCiAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbdHJhY2VJbnB1dHNdXSIKICAgICAgICA+PC90Zi1ncmFwaD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgaWQ9ImluZm8iPgogICAgICAgIDx0Zi1ncmFwaC1pbmZvCiAgICAgICAgICBpZD0iZ3JhcGgtaW5mbyIKICAgICAgICAgIHRpdGxlPSJzZWxlY3RlZCIKICAgICAgICAgIGdyYXBoLWhpZXJhcmNoeT0iW1tncmFwaEhpZXJhcmNoeV1dIgogICAgICAgICAgaGllcmFyY2h5LXBhcmFtcz0iW1toaWVyYXJjaHlQYXJhbXNdXSIKICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgICBncmFwaD0iW1tncmFwaF1dIgogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHNlbGVjdGVkLW5vZGUtaW5jbHVkZT0ie3tfc2VsZWN0ZWROb2RlSW5jbHVkZX19IgogICAgICAgICAgaGlnaGxpZ2h0ZWQtbm9kZT0ie3tfaGlnaGxpZ2h0ZWROb2RlfX0iCiAgICAgICAgICBjb2xvci1ieT0iW1tjb2xvckJ5XV0iCiAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9IltbY29sb3JCeVBhcmFtc11dIgogICAgICAgICAgZGVidWdnZXItZGF0YS1lbmFibGVkPSJbW2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIKICAgICAgICAgIGFyZS1oZWFsdGgtcGlsbHMtbG9hZGluZz0iW1thcmVIZWFsdGhQaWxsc0xvYWRpbmddXSIKICAgICAgICAgIGRlYnVnZ2VyLW51bWVyaWMtYWxlcnRzPSJbW2RlYnVnZ2VyTnVtZXJpY0FsZXJ0c11dIgogICAgICAgICAgbm9kZS1uYW1lcy10by1oZWFsdGgtcGlsbHM9Iltbbm9kZU5hbWVzVG9IZWFsdGhQaWxsc11dIgogICAgICAgICAgYWxsLXN0ZXBzLW1vZGUtZW5hYmxlZD0ie3thbGxTdGVwc01vZGVFbmFibGVkfX0iCiAgICAgICAgICBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgIGhlYWx0aC1waWxsLXN0ZXAtaW5kZXg9Int7aGVhbHRoUGlsbFN0ZXBJbmRleH19IgogICAgICAgICAgY29tcGF0LW5vZGUtdGl0bGU9IltbY29tcGF0Tm9kZVRpdGxlXV0iCiAgICAgICAgICBvbi1ub2RlLXRvZ2dsZS1pbmNsdXNpb249Il9vbk5vZGVJbmNsdXNpb25Ub2dnbGVkIgogICAgICAgICAgb24tbm9kZS10b2dnbGUtc2VyaWVzZ3JvdXA9Il9vbk5vZGVTZXJpZXNHcm91cFRvZ2dsZWQiCiAgICAgICAgPjwvdGYtZ3JhcGgtaW5mbz4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiZ3JhcGhIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiZ3JhcGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAic3RhdHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAicHJvZ3Jlc3MiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhCb2FyZC5wcm90b3R5cGUsICJ0cmFjZUlucHV0cyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGhCb2FyZC5wcm90b3R5cGUsICJjb2xvckJ5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiY29sb3JCeVBhcmFtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgInJlbmRlckhpZXJhcmNoeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgImRlYnVnZ2VyRGF0YUVuYWJsZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhCb2FyZC5wcm90b3R5cGUsICJhcmVIZWFsdGhQaWxsc0xvYWRpbmciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiZGVidWdnZXJOdW1lcmljQWxlcnRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgIm5vZGVOYW1lc1RvSGVhbHRoUGlsbHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgImFsbFN0ZXBzTW9kZUVuYWJsZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhCb2FyZC5wcm90b3R5cGUsICJzcGVjaWZpY0hlYWx0aFBpbGxTdGVwIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgImhlYWx0aFBpbGxTdGVwSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGhCb2FyZC5wcm90b3R5cGUsICJzZWxlY3RlZE5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiY29tcGF0Tm9kZVRpdGxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgImVkZ2VXaWR0aEZ1bmN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgIl9zZWxlY3RlZE5vZGVJbmNsdWRlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgIl9oaWdobGlnaHRlZE5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiaGFuZGxlTm9kZVNlbGVjdGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgImVkZ2VMYWJlbEZ1bmN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaEJvYXJkLnByb3RvdHlwZSwgImhhbmRsZUVkZ2VTZWxlY3RlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdzZWxlY3RlZE5vZGUnLCAncmVuZGVySGllcmFyY2h5JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoQm9hcmQucHJvdG90eXBlLCAiX3VwZGF0ZU5vZGVJbmNsdWRlIiwgbnVsbCk7CiAgICBUZkdyYXBoQm9hcmQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ncmFwaC1ib2FyZCcpCiAgICBdLCBUZkdyYXBoQm9hcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmR3JhcGhOb2RlU2VhcmNoID0gY2xhc3MgVGZHcmFwaE5vZGVTZWFyY2ggZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5fcmF3UmVnZXhJbnB1dCA9ICcnOwogICAgICAgICAgICAvLyBUaGUgdmFsdWUgb2YgdGhlIHJlZ2V4IGlucHV0IGZvciB0aGUgbGFzdCBzZWFyY2guCiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dCA9ICcnOwogICAgICAgICAgICB0aGlzLl9zZWFyY2hUaW1lb3V0RGVsYXkgPSAxNTA7CiAgICAgICAgICAgIHRoaXMuX21heFJlZ2V4UmVzdWx0cyA9IDQyOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIGlzIHRoZSBjbGVhbmVkIGlucHV0LgogICAgICAgIGdldCBfcmVnZXhJbnB1dCgpIHsKICAgICAgICAgICAgdmFyIHJlbmRlckhpZXJhcmNoeSA9IHRoaXMucmVuZGVySGllcmFyY2h5OwogICAgICAgICAgICB2YXIgcmF3UmVnZXhJbnB1dCA9IHRoaXMuX3Jhd1JlZ2V4SW5wdXQ7CiAgICAgICAgICAgIHJldHVybiByYXdSZWdleElucHV0LnRyaW0oKTsKICAgICAgICB9CiAgICAgICAgX3JlZ2V4SW5wdXRDaGFuZ2VkKCkgewogICAgICAgICAgICB2YXIgcmVnZXhJbnB1dCA9IHRoaXMuX3JlZ2V4SW5wdXQ7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZWFyY2goKTsKICAgICAgICB9CiAgICAgICAgX2NsZWFyU2VhcmNoUmVzdWx0cygpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19yZWdleE1hdGNoZXMnLCBbXSk7CiAgICAgICAgfQogICAgICAgIF9yZXF1ZXN0U2VhcmNoKCkgewogICAgICAgICAgICBpZiAodGhpcy5fc2VhcmNoUGVuZGluZykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9yZWdleElucHV0ID09PSB0aGlzLl9wcmV2aW91c1JlZ2V4SW5wdXQpIHsKICAgICAgICAgICAgICAgIC8vIE5vIG5ldyBzZWFyY2ggaXMgbmVlZGVkLgogICAgICAgICAgICAgICAgdGhpcy5fc2VhcmNoUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NlYXJjaFBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9leGVjdXRlU2VhcmNoKCk7CiAgICAgICAgICAgIC8vIEFmdGVyIHNvbWUgdGltZSwgcGVyaGFwcyBleGVjdXRlIGFub3RoZXIgc2VhcmNoLgogICAgICAgICAgICB0aGlzLmFzeW5jKCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlYXJjaFBlbmRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RTZWFyY2goKTsKICAgICAgICAgICAgfSwgdGhpcy5fc2VhcmNoVGltZW91dERlbGF5KTsKICAgICAgICB9CiAgICAgICAgX2V4ZWN1dGVTZWFyY2goKSB7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzUmVnZXhJbnB1dCA9IHRoaXMuX3JlZ2V4SW5wdXQ7CiAgICAgICAgICAgIGlmICghdGhpcy5fcmVnZXhJbnB1dCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJTZWFyY2hSZXN1bHRzKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhciByZWdleCA9IG5ldyBSZWdFeHAodGhpcy5fcmVnZXhJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSByZWd1bGFyIGV4cHJlc3Npb24gaXMgaW52YWxpZC4KICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU2VhcmNoUmVzdWx0cygpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROb2RlcyA9IFtdOwogICAgICAgICAgICBjb25zdCBub2RlTWFwID0gdGhpcy5yZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LmdldE5vZGVNYXAoKTsKICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZU1hcCwgKF8sIG5vZGVOYW1lKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hlZE5vZGVzLmxlbmd0aCA+PSB0aGlzLl9tYXhSZWdleFJlc3VsdHMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUZXJtaW5hdGUuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFyZWdleC50ZXN0KG5vZGVOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1hdGNoZWROb2Rlcy5wdXNoKG5vZGVOYW1lKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfcmVnZXhNYXRjaGVzJywgbWF0Y2hlZE5vZGVzKTsKICAgICAgICB9CiAgICAgICAgX21hdGNoQ2xpY2tlZChlKSB7CiAgICAgICAgICAgIGNvbnN0IG5vZGUgPSBlLm1vZGVsLml0ZW07CiAgICAgICAgICAgIHRoaXMuc2V0KCdzZWxlY3RlZE5vZGUnLCBub2RlKTsKICAgICAgICB9CiAgICB9OwogICAgVGZHcmFwaE5vZGVTZWFyY2gudGVtcGxhdGUgPSBodG1sIGAKICAgIDxkaXYgaWQ9InNlYXJjaC1jb250YWluZXIiPgogICAgICA8cGFwZXItaW5wdXQKICAgICAgICBpZD0icnVucy1yZWdleCIKICAgICAgICBsYWJlbD0iU2VhcmNoIG5vZGVzLiBSZWdleGVzIHN1cHBvcnRlZC4iCiAgICAgICAgdmFsdWU9Int7X3Jhd1JlZ2V4SW5wdXR9fSIKICAgICAgPgogICAgICA8L3BhcGVyLWlucHV0PgogICAgICA8ZGl2IGlkPSJzZWFyY2gtcmVzdWx0cy1hbmNob3IiPgogICAgICAgIDxkaXYgaWQ9InNlYXJjaC1yZXN1bHRzIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3JlZ2V4TWF0Y2hlc11dIj4KICAgICAgICAgICAgPGRpdiBpZD0ic2VhcmNoLW1hdGNoIiBvbi1jbGljaz0iX21hdGNoQ2xpY2tlZCI+W1tpdGVtXV08L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgICNzZWFyY2gtY29udGFpbmVyIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgI3J1bnMtcmVnZXggewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAjc2VhcmNoLXJlc3VsdHMtYW5jaG9yIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtcmVzdWx0cyB7CiAgICAgICAgY29sb3I6ICNmZmY7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgICAgIG1heC13aWR0aDogMTAwJTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICB9CgogICAgICAjc2VhcmNoLW1hdGNoIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICBwYWRkaW5nOiAzcHg7CiAgICAgICAgZmxvYXQ6IHJpZ2h0OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZGlyZWN0aW9uOiBydGw7CiAgICAgIH0KCiAgICAgICNzZWFyY2gtbWF0Y2g6aG92ZXIgewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLW9yYW5nZS13ZWFrKTsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaE5vZGVTZWFyY2gucHJvdG90eXBlLCAicmVuZGVySGllcmFyY2h5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoTm9kZVNlYXJjaC5wcm90b3R5cGUsICJzZWxlY3RlZE5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoTm9kZVNlYXJjaC5wcm90b3R5cGUsICJfcmF3UmVnZXhJbnB1dCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmR3JhcGhOb2RlU2VhcmNoLnByb3RvdHlwZSwgIl9wcmV2aW91c1JlZ2V4SW5wdXQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoTm9kZVNlYXJjaC5wcm90b3R5cGUsICJfc2VhcmNoVGltZW91dERlbGF5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkdyYXBoTm9kZVNlYXJjaC5wcm90b3R5cGUsICJfc2VhcmNoUGVuZGluZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhOb2RlU2VhcmNoLnByb3RvdHlwZSwgIl9tYXhSZWdleFJlc3VsdHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZHcmFwaE5vZGVTZWFyY2gucHJvdG90eXBlLCAiX3JlZ2V4TWF0Y2hlcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgncmVuZGVySGllcmFyY2h5JywgJ19yYXdSZWdleElucHV0JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoTm9kZVNlYXJjaC5wcm90b3R5cGUsICJfcmVnZXhJbnB1dCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX3JlZ2V4SW5wdXQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmR3JhcGhOb2RlU2VhcmNoLnByb3RvdHlwZSwgIl9yZWdleElucHV0Q2hhbmdlZCIsIG51bGwpOwogICAgVGZHcmFwaE5vZGVTZWFyY2ggPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ncmFwaC1ub2RlLXNlYXJjaCcpCiAgICBdLCBUZkdyYXBoTm9kZVNlYXJjaCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBERVZJQ0VfTkFNRV9SRUdFWCA9IC9kZXZpY2U6KFteOl0rOlswLTldKykkLzsKICAgIC8qKgogICAgICogRGlzcGxheSBvbmx5IGRldmljZXMgbWF0Y2hpbmcgb25lIG9mIHRoZSBmb2xsb3dpbmcgcmVnZXguCiAgICAgKi8KICAgIGNvbnN0IERFVklDRV9OQU1FU19JTkNMVURFID0gWwogICAgICAgIHsKICAgICAgICAgICAgLy8gRG9uJ3QgaW5jbHVkZSBHUFUgc3RyZWFtLCBtZW1jcHksIGV0Yy4gZGV2aWNlcwogICAgICAgICAgICByZWdleDogREVWSUNFX05BTUVfUkVHRVgsCiAgICAgICAgfSwKICAgIF07CiAgICAvKioKICAgICAqIFN0YXRzIGZyb20gZGV2aWNlIG5hbWVzIHRoYXQgbWF0Y2ggdGhlc2UgcmVnZXhlcyB3aWxsIGJlIGRpc2FibGVkIGJ5IGRlZmF1bHQuCiAgICAgKiBUaGUgdXNlciBjYW4gc3RpbGwgdHVybiBvbiBhIGRldmljZSBieSBzZWxlY3RpbmcgdGhlIGNoZWNrYm94IGluIHRoZSBkZXZpY2UgbGlzdC4KICAgICAqLwogICAgY29uc3QgREVWSUNFX1NUQVRTX0RFRkFVTFRfT0ZGID0gW107CiAgICB2YXIgQ29sb3JCeSQxOwogICAgKGZ1bmN0aW9uIChDb2xvckJ5KSB7CiAgICAgICAgQ29sb3JCeVsiQ09NUFVURV9USU1FIl0gPSAiY29tcHV0ZV90aW1lIjsKICAgICAgICBDb2xvckJ5WyJNRU1PUlkiXSA9ICJtZW1vcnkiOwogICAgICAgIENvbG9yQnlbIlNUUlVDVFVSRSJdID0gInN0cnVjdHVyZSI7CiAgICAgICAgQ29sb3JCeVsiWExBX0NMVVNURVIiXSA9ICJ4bGFfY2x1c3RlciI7CiAgICAgICAgQ29sb3JCeVsiT1BfQ09NUEFUSUJJTElUWSJdID0gIm9wX2NvbXBhdGliaWxpdHkiOwogICAgfSkoQ29sb3JCeSQxIHx8IChDb2xvckJ5JDEgPSB7fSkpOwogICAgY29uc3QgR1JBRElFTlRfQ09NUEFUSUJMRV9DT0xPUl9CWSA9IG5ldyBTZXQoWwogICAgICAgIENvbG9yQnkkMS5DT01QVVRFX1RJTUUsCiAgICAgICAgQ29sb3JCeSQxLk1FTU9SWSwKICAgIF0pOwogICAgbGV0IFRmR3JhcGhDb250cm9scyA9IGNsYXNzIFRmR3JhcGhDb250cm9scyBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvLyBQdWJsaWMgQVBJLgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUgez90Zl9ncmFwaF9wcm90by5TdGVwU3RhdHN9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnN0YXRzID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEB0eXBlIHs/T2JqZWN0PHN0cmluZywgYm9vbGVhbj59CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRldmljZXNGb3JTdGF0cyA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAdHlwZSB7IUNvbG9yQnl9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNvbG9yQnkgPSBDb2xvckJ5JDEuU1RSVUNUVVJFOwogICAgICAgICAgICB0aGlzLmRhdGFzZXRzID0gW107CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUnVuSW5kZXggPSAwOwogICAgICAgICAgICB0aGlzLnRyYWNlSW5wdXRzID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVGFnSW5kZXggPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUge3RmX2dyYXBoX2NvbW1vbi5TZWxlY3Rpb25UeXBlfQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGUgPSBTZWxlY3Rpb25UeXBlLk9QX0dSQVBIOwogICAgICAgICAgICB0aGlzLnNob3dTZXNzaW9uUnVuc0Ryb3Bkb3duID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5zaG93VXBsb2FkQnV0dG9uID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fbGVnZW5kT3BlbmVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KSB7CiAgICAgICAgICAgIHJldHVybiAocmVuZGVySGllcmFyY2h5ICYmCiAgICAgICAgICAgICAgICByZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5ICYmCiAgICAgICAgICAgICAgICByZW5kZXJIaWVyYXJjaHkuaGllcmFyY2h5LnhsYUNsdXN0ZXJzLmxlbmd0aCA+IDApOwogICAgICAgIH0KICAgICAgICBfc3RhdHNDaGFuZ2VkKHN0YXRzKSB7CiAgICAgICAgICAgIGlmIChzdGF0cyA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGRldmljZXNGb3JTdGF0cyA9IHt9OwogICAgICAgICAgICB2YXIgZGV2aWNlcyA9IGxvZGFzaC5lYWNoKHN0YXRzLmRldl9zdGF0cywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY29uc2lkZXJlZCBpbmNsdWRlZCBkZXZpY2VzLgogICAgICAgICAgICAgICAgdmFyIGluY2x1ZGUgPSBsb2Rhc2guc29tZShERVZJQ0VfTkFNRVNfSU5DTFVERSwgZnVuY3Rpb24gKHJ1bGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVsZS5yZWdleC50ZXN0KGQuZGV2aWNlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gRXhjbHVkZSBkZXZpY2UgbmFtZXMgdGhhdCBhcmUgaWdub3JlZCBieSBkZWZhdWx0LgogICAgICAgICAgICAgICAgdmFyIGV4Y2x1ZGUgPSBsb2Rhc2guc29tZShERVZJQ0VfU1RBVFNfREVGQVVMVF9PRkYsIGZ1bmN0aW9uIChydWxlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUucmVnZXgudGVzdChkLmRldmljZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChpbmNsdWRlICYmICFleGNsdWRlKSB7CiAgICAgICAgICAgICAgICAgICAgZGV2aWNlc0ZvclN0YXRzW2QuZGV2aWNlXSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnNldCgnZGV2aWNlc0ZvclN0YXRzJywgZGV2aWNlc0ZvclN0YXRzKTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jdXJyZW50RGV2aWNlcygpIHsKICAgICAgICAgICAgdmFyIGRldmljZXNGb3JTdGF0cyA9IHRoaXMuZGV2aWNlc0ZvclN0YXRzOwogICAgICAgICAgICBjb25zdCBzdGF0cyA9IHRoaXMuc3RhdHM7CiAgICAgICAgICAgIGNvbnN0IGRldlN0YXRzID0gc3RhdHMgPyBzdGF0cy5kZXZfc3RhdHMgOiBbXTsKICAgICAgICAgICAgY29uc3QgYWxsRGV2aWNlcyA9IGRldlN0YXRzLm1hcCgoZCkgPT4gZC5kZXZpY2UpOwogICAgICAgICAgICBjb25zdCBkZXZpY2VzID0gYWxsRGV2aWNlcy5maWx0ZXIoKGRldmljZU5hbWUpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfTkFNRVNfSU5DTFVERS5zb21lKChydWxlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUucmVnZXgudGVzdChkZXZpY2VOYW1lKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRGV2aWNlcyBuYW1lcyBjYW4gYmUgbG9uZyBzbyB3ZSByZW1vdmUgdGhlIGxvbmdlc3QgY29tbW9uIHByZWZpeAogICAgICAgICAgICAvLyBiZWZvcmUgc2hvd2luZyB0aGUgZGV2aWNlcyBpbiBhIGxpc3QuCiAgICAgICAgICAgIGNvbnN0IHN1ZmZpeGVzID0gcmVtb3ZlQ29tbW9uUHJlZml4KGRldmljZXMpOwogICAgICAgICAgICBpZiAoc3VmZml4ZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kID0gc3VmZml4ZXNbMF0ubWF0Y2goREVWSUNFX05BTUVfUkVHRVgpOwogICAgICAgICAgICAgICAgaWYgKGZvdW5kKSB7CiAgICAgICAgICAgICAgICAgICAgc3VmZml4ZXNbMF0gPSBmb3VuZFsxXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGV2aWNlcy5tYXAoKGRldmljZSwgaSkgPT4gewogICAgICAgICAgICAgICAgbGV0IGlnbm9yZWRNc2cgPSBudWxsOwogICAgICAgICAgICAgICAgLy8gVE9ETyhzdGVwaGFud2xlZSk6IHRoaXMgc2hvdWxkIHByb2JhYmx5IGJhaWwgb24gdGhlIGZpcnN0IG1hdGNoIG9yCiAgICAgICAgICAgICAgICAvLyBkbyBzb21ldGhpbmcgdXNlZnVsIHdpdGggbXVsdGlwbGUgcnVsZS5tc2dzLgogICAgICAgICAgICAgICAgREVWSUNFX1NUQVRTX0RFRkFVTFRfT0ZGLmZvckVhY2goKHJ1bGUpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocnVsZS5yZWdleC50ZXN0KGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlZE1zZyA9IHJ1bGUubXNnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBkZXZpY2U6IGRldmljZSwKICAgICAgICAgICAgICAgICAgICBzdWZmaXg6IHN1ZmZpeGVzW2ldLAogICAgICAgICAgICAgICAgICAgIHVzZWQ6IGRldmljZXNGb3JTdGF0c1tkZXZpY2VdLAogICAgICAgICAgICAgICAgICAgIGlnbm9yZWRNc2c6IGlnbm9yZWRNc2csCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2RldmljZUNoZWNrYm94Q2xpY2tlZChldmVudCkgewogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIGRldmljZSBtYXAuCiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gZXZlbnQudGFyZ2V0OwogICAgICAgICAgICBjb25zdCBkZXZpY2VzRm9yU3RhdHMgPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRldmljZXNGb3JTdGF0cyk7CiAgICAgICAgICAgIGNvbnN0IGRldmljZSA9IGlucHV0LnZhbHVlOwogICAgICAgICAgICBpZiAoaW5wdXQuY2hlY2tlZCkgewogICAgICAgICAgICAgICAgZGV2aWNlc0ZvclN0YXRzW2RldmljZV0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZGVsZXRlIGRldmljZXNGb3JTdGF0c1tkZXZpY2VdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2V0KCdkZXZpY2VzRm9yU3RhdHMnLCBkZXZpY2VzRm9yU3RhdHMpOwogICAgICAgIH0KICAgICAgICBfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFRhZ3MoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4KS5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIF9nZXRUYWdzKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCkgewogICAgICAgICAgICBpZiAoIWRhdGFzZXRzIHx8ICFkYXRhc2V0c1tfc2VsZWN0ZWRSdW5JbmRleF0pIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGF0YXNldHNbX3NlbGVjdGVkUnVuSW5kZXhdLnRhZ3M7CiAgICAgICAgfQogICAgICAgIF9maXQoKSB7CiAgICAgICAgICAgIHRoaXMuZmlyZSgnZml0LXRhcCcpOwogICAgICAgIH0KICAgICAgICBfaXNHcmFkaWVudENvbG9yaW5nKHN0YXRzLCBjb2xvckJ5KSB7CiAgICAgICAgICAgIHJldHVybiBHUkFESUVOVF9DT01QQVRJQkxFX0NPTE9SX0JZLmhhcyhjb2xvckJ5KSAmJiBzdGF0cyAhPSBudWxsOwogICAgICAgIH0KICAgICAgICBfZXF1YWxzKGEsIGIpIHsKICAgICAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICAgICAgfQogICAgICAgIGdldCBfY3VycmVudERldmljZVBhcmFtcygpIHsKICAgICAgICAgICAgdmFyIGNvbG9yQnlQYXJhbXMgPSB0aGlzLmNvbG9yQnlQYXJhbXM7CiAgICAgICAgICAgIGNvbnN0IGRldmljZVBhcmFtcyA9IGNvbG9yQnlQYXJhbXMuZGV2aWNlLmZpbHRlcigocGFyYW0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBERVZJQ0VfTkFNRVNfSU5DTFVERS5zb21lKChydWxlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bGUucmVnZXgudGVzdChwYXJhbS5kZXZpY2UpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBSZW1vdmUgY29tbW9uIHByZWZpeCBhbmQgbWVyZ2UgYmFjayBjb3JyZXNwb25kaW5nIGNvbG9yLiBJZgogICAgICAgICAgICAvLyB0aGVyZSBpcyBvbmx5IG9uZSBkZXZpY2UgdGhlbiByZW1vdmUgZXZlcnl0aGluZyB1cCB0byAiL2RldmljZToiLgogICAgICAgICAgICBjb25zdCBzdWZmaXhlcyA9IHJlbW92ZUNvbW1vblByZWZpeChkZXZpY2VQYXJhbXMubWFwKChkKSA9PiBkLmRldmljZSkpOwogICAgICAgICAgICBpZiAoc3VmZml4ZXMubGVuZ3RoID09IDEpIHsKICAgICAgICAgICAgICAgIHZhciBmb3VuZCA9IHN1ZmZpeGVzWzBdLm1hdGNoKERFVklDRV9OQU1FX1JFR0VYKTsKICAgICAgICAgICAgICAgIGlmIChmb3VuZCkgewogICAgICAgICAgICAgICAgICAgIHN1ZmZpeGVzWzBdID0gZm91bmRbMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGRldmljZVBhcmFtcy5tYXAoKGQsIGkpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGRldmljZTogc3VmZml4ZXNbaV0sIGNvbG9yOiBkLmNvbG9yIH07CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBnZXQgX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zKCkgewogICAgICAgICAgICB2YXIgY29sb3JCeVBhcmFtcyA9IHRoaXMuY29sb3JCeVBhcmFtczsKICAgICAgICAgICAgcmV0dXJuIGNvbG9yQnlQYXJhbXMueGxhX2NsdXN0ZXI7CiAgICAgICAgfQogICAgICAgIGdldCBfY3VycmVudEdyYWRpZW50UGFyYW1zKCkgewogICAgICAgICAgICB2YXIgY29sb3JCeVBhcmFtcyA9IHRoaXMuY29sb3JCeVBhcmFtczsKICAgICAgICAgICAgdmFyIGNvbG9yQnkgPSB0aGlzLmNvbG9yQnk7CiAgICAgICAgICAgIGlmICghdGhpcy5faXNHcmFkaWVudENvbG9yaW5nKHRoaXMuc3RhdHMsIGNvbG9yQnkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gY29sb3JCeVBhcmFtc1tjb2xvckJ5XTsKICAgICAgICAgICAgbGV0IG1pblZhbHVlID0gcGFyYW1zLm1pblZhbHVlOwogICAgICAgICAgICBsZXQgbWF4VmFsdWUgPSBwYXJhbXMubWF4VmFsdWU7CiAgICAgICAgICAgIGlmIChjb2xvckJ5ID09PSBDb2xvckJ5JDEuTUVNT1JZKSB7CiAgICAgICAgICAgICAgICBtaW5WYWx1ZSA9IGNvbnZlcnRVbml0c1RvSHVtYW5SZWFkYWJsZShtaW5WYWx1ZSwgTUVNT1JZX1VOSVRTKTsKICAgICAgICAgICAgICAgIG1heFZhbHVlID0gY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKG1heFZhbHVlLCBNRU1PUllfVU5JVFMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbG9yQnkgPT09IENvbG9yQnkkMS5DT01QVVRFX1RJTUUpIHsKICAgICAgICAgICAgICAgIG1pblZhbHVlID0gY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKG1pblZhbHVlLCBUSU1FX1VOSVRTKTsKICAgICAgICAgICAgICAgIG1heFZhbHVlID0gY29udmVydFVuaXRzVG9IdW1hblJlYWRhYmxlKG1heFZhbHVlLCBUSU1FX1VOSVRTKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWluVmFsdWUsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZSwKICAgICAgICAgICAgICAgIHN0YXJ0Q29sb3I6IHBhcmFtcy5zdGFydENvbG9yLAogICAgICAgICAgICAgICAgZW5kQ29sb3I6IHBhcmFtcy5lbmRDb2xvciwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZG93bmxvYWQoKSB7CiAgICAgICAgICAgIHRoaXMuJC5ncmFwaGRvd25sb2FkLmNsaWNrKCk7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVGaWxlSW5wdXQoZSkgewogICAgICAgICAgICBjb25zdCBmaWxlID0gZS50YXJnZXQuZmlsZXNbMF07CiAgICAgICAgICAgIGlmICghZmlsZSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLy8gU3RyaXAgb2ZmIGV2ZXJ5dGhpbmcgYmVmb3JlIHRoZSBsYXN0ICIvIiBhbmQgc3RyaXAgb2ZmIHRoZSBmaWxlCiAgICAgICAgICAgIC8vIGV4dGVuc2lvbiBpbiBvcmRlciB0byBnZXQgdGhlIG5hbWUgb2YgdGhlIFBORyBmb3IgdGhlIGdyYXBoLgogICAgICAgICAgICBsZXQgZmlsZVBhdGggPSBmaWxlLm5hbWU7CiAgICAgICAgICAgIGNvbnN0IGRvdEluZGV4ID0gZmlsZVBhdGgubGFzdEluZGV4T2YoJy4nKTsKICAgICAgICAgICAgaWYgKGRvdEluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgIGZpbGVQYXRoID0gZmlsZVBhdGguc3Vic3RyaW5nKDAsIGRvdEluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBsYXN0U2xhc2hJbmRleCA9IGZpbGVQYXRoLmxhc3RJbmRleE9mKCcvJyk7CiAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICBmaWxlUGF0aCA9IGZpbGVQYXRoLnN1YnN0cmluZyhsYXN0U2xhc2hJbmRleCArIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUoZmlsZVBhdGgpOwogICAgICAgICAgICB0aGlzLnNldCgnc2VsZWN0ZWRGaWxlJywgZSk7CiAgICAgICAgfQogICAgICAgIF9kYXRhc2V0c0NoYW5nZWQobmV3RGF0YXNldHMsIG9sZERhdGFzZXRzKSB7CiAgICAgICAgICAgIGlmIChvbGREYXRhc2V0cyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGZpcnN0IGRhdGFzZXQgYnkgZGVmYXVsdC4KICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUnVuSW5kZXggPSAwOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlU2VsZWN0aW9uKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgsIF9zZWxlY3RlZEdyYXBoVHlwZSkgewogICAgICAgICAgICBpZiAoIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XSB8fAogICAgICAgICAgICAgICAgIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XS50YWdzW19zZWxlY3RlZFRhZ0luZGV4XSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJ1bjogZGF0YXNldHNbX3NlbGVjdGVkUnVuSW5kZXhdLm5hbWUsCiAgICAgICAgICAgICAgICB0YWc6IGRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XS50YWdzW19zZWxlY3RlZFRhZ0luZGV4XS50YWcsCiAgICAgICAgICAgICAgICB0eXBlOiBfc2VsZWN0ZWRHcmFwaFR5cGUsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIF9zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZChydW5JbmRleCkgewogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YXNldHMpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBzdGF0ZXMgd2hlbiB1c2VyIHBpY2sgYSBkaWZmZXJlbnQgcnVuLgogICAgICAgICAgICB0aGlzLmNvbG9yQnkgPSBDb2xvckJ5JDEuU1RSVUNUVVJFOwogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFRhZ0luZGV4ID0gMDsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRHcmFwaFR5cGUgPSB0aGlzLl9nZXREZWZhdWx0U2VsZWN0aW9uVHlwZSgpOwogICAgICAgICAgICB0aGlzLnRyYWNlSW5wdXRzID0gZmFsc2U7IC8vIFNldCB0cmFjZSBpbnB1dCB0byBvZmYtc3RhdGUuCiAgICAgICAgICAgIHRoaXMuX3NldERvd25sb2FkRmlsZW5hbWUodGhpcy5kYXRhc2V0c1tydW5JbmRleF0gPyB0aGlzLmRhdGFzZXRzW3J1bkluZGV4XS5uYW1lIDogJycpOwogICAgICAgIH0KICAgICAgICBfc2VsZWN0ZWRUYWdJbmRleENoYW5nZWQoKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkR3JhcGhUeXBlID0gdGhpcy5fZ2V0RGVmYXVsdFNlbGVjdGlvblR5cGUoKTsKICAgICAgICB9CiAgICAgICAgX2dldERlZmF1bHRTZWxlY3Rpb25UeXBlKCkgewogICAgICAgICAgICBjb25zdCB7IGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleDogcnVuLCBfc2VsZWN0ZWRUYWdJbmRleDogdGFnIH0gPSB0aGlzOwogICAgICAgICAgICBpZiAoIWRhdGFzZXRzIHx8CiAgICAgICAgICAgICAgICAhZGF0YXNldHNbcnVuXSB8fAogICAgICAgICAgICAgICAgIWRhdGFzZXRzW3J1bl0udGFnc1t0YWddIHx8CiAgICAgICAgICAgICAgICBkYXRhc2V0c1tydW5dLnRhZ3NbdGFnXS5vcEdyYXBoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBkYXRhc2V0Rm9yUnVuID0gZGF0YXNldHNbcnVuXTsKICAgICAgICAgICAgaWYgKGRhdGFzZXRGb3JSdW4udGFnc1t0YWddLnByb2ZpbGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBTZWxlY3Rpb25UeXBlLlBST0ZJTEU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGFzZXRGb3JSdW4udGFnc1t0YWddLmNvbmNlcHR1YWxHcmFwaCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFNlbGVjdGlvblR5cGUuQ09OQ0VQVFVBTF9HUkFQSDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uVHlwZS5PUF9HUkFQSDsKICAgICAgICB9CiAgICAgICAgX2dldEZpbGUoKSB7CiAgICAgICAgICAgIHRoaXMuJCQoJyNmaWxlJykuY2xpY2soKTsKICAgICAgICB9CiAgICAgICAgX3NldERvd25sb2FkRmlsZW5hbWUobmFtZSkgewogICAgICAgICAgICB0aGlzLiQuZ3JhcGhkb3dubG9hZC5zZXRBdHRyaWJ1dGUoJ2Rvd25sb2FkJywgbmFtZSArICcucG5nJyk7CiAgICAgICAgfQogICAgICAgIF9zdGF0c05vdE51bGwoc3RhdHMpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRzICE9PSBudWxsOwogICAgICAgIH0KICAgICAgICBfdG9nZ2xlTGVnZW5kT3BlbigpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19sZWdlbmRPcGVuZWQnLCAhdGhpcy5fbGVnZW5kT3BlbmVkKTsKICAgICAgICB9CiAgICAgICAgX2dldFRvZ2dsZVRleHQobGVnZW5kT3BlbmVkKSB7CiAgICAgICAgICAgIHJldHVybiBsZWdlbmRPcGVuZWQgPyAnQ2xvc2UgbGVnZW5kLicgOiAnRXhwYW5kIGxlZ2VuZC4nOwogICAgICAgIH0KICAgICAgICBfZ2V0VG9nZ2xlTGVnZW5kSWNvbihsZWdlbmRPcGVuZWQpIHsKICAgICAgICAgICAgLy8gVGhpcyBzZWVtcyBjb3VudGVyLWludHVpdGl2ZSwgYnV0IGFjdHVhbGx5IG1ha2VzIHNlbnNlIGJlY2F1c2UgdGhlCiAgICAgICAgICAgIC8vIGV4cGFuZC1tb3JlIGJ1dHRvbiBwb2ludHMgZG93bndhcmRzLCBhbmQgdGhlIGV4cGFuZC1sZXNzIGJ1dHRvbiBwb2ludHMKICAgICAgICAgICAgLy8gdXB3YXJkcy4gRm9yIG1vc3QgY29sbGFwc2libGVzLCB0aGlzIHdvcmtzIGJlY2F1c2UgdGhlIGNvbGxhcHNpYmxlcwogICAgICAgICAgICAvLyBleHBhbmQgaW4gdGhlIGRvd253YXJkcyBkaXJlY3Rpb24uIFRoaXMgY29sbGFwc2libGUgZXhwYW5kcyB1cHdhcmRzCiAgICAgICAgICAgIC8vIHRob3VnaCwgc28gd2UgcmV2ZXJzZSB0aGUgaWNvbnMuCiAgICAgICAgICAgIHJldHVybiBsZWdlbmRPcGVuZWQgPyAnZXhwYW5kLW1vcmUnIDogJ2V4cGFuZC1sZXNzJzsKICAgICAgICB9CiAgICAgICAgX2dldFNlbGVjdGlvbk9wR3JhcGhEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KSB7CiAgICAgICAgICAgIHJldHVybiAoIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XSB8fAogICAgICAgICAgICAgICAgIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XS50YWdzW19zZWxlY3RlZFRhZ0luZGV4XSB8fAogICAgICAgICAgICAgICAgIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XS50YWdzW19zZWxlY3RlZFRhZ0luZGV4XS5vcEdyYXBoKTsKICAgICAgICB9CiAgICAgICAgX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KSB7CiAgICAgICAgICAgIHJldHVybiAoIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XSB8fAogICAgICAgICAgICAgICAgIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XS50YWdzW19zZWxlY3RlZFRhZ0luZGV4XSB8fAogICAgICAgICAgICAgICAgIWRhdGFzZXRzW19zZWxlY3RlZFJ1bkluZGV4XS50YWdzW19zZWxlY3RlZFRhZ0luZGV4XS5wcm9maWxlKTsKICAgICAgICB9CiAgICAgICAgX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuICghZGF0YXNldHNbX3NlbGVjdGVkUnVuSW5kZXhdIHx8CiAgICAgICAgICAgICAgICAhZGF0YXNldHNbX3NlbGVjdGVkUnVuSW5kZXhdLnRhZ3NbX3NlbGVjdGVkVGFnSW5kZXhdIHx8CiAgICAgICAgICAgICAgICAhZGF0YXNldHNbX3NlbGVjdGVkUnVuSW5kZXhdLnRhZ3NbX3NlbGVjdGVkVGFnSW5kZXhdLmNvbmNlcHR1YWxHcmFwaCk7CiAgICAgICAgfQogICAgfTsKICAgIFRmR3JhcGhDb250cm9scy50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgLS1wYXBlci1kcm9wZG93bi1tZW51LWlucHV0OiB7CiAgICAgICAgICBwYWRkaW5nOiAwOwogICAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgICAgfQogICAgICAgIC0taXJvbi1pY29uLXdpZHRoOiAxNXB4OwogICAgICAgIC0taXJvbi1pY29uLWhlaWdodDogMTVweDsKICAgICAgICAtLXByaW1hcnktdGV4dC1jb2xvcjogZ3JheTsKICAgICAgICAtLXBhcGVyLWl0ZW0tbWluLWhlaWdodDogMzBweDsKICAgICAgfQoKICAgICAgcGFwZXItYnV0dG9uW3JhaXNlZF0ua2V5Ym9hcmQtZm9jdXMgewogICAgICAgIGZvbnQtd2VpZ2h0OiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC5ydW4tZHJvcGRvd24gewogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyOiB7CiAgICAgICAgICBwYWRkaW5nOiA4cHggMCA4cHggMTBweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC5jb2xvci1kcm9wZG93biB7CiAgICAgICAgLS1wYXBlci1pbnB1dC1jb250YWluZXI6IHsKICAgICAgICAgIHBhZGRpbmc6IDlweCAwIDAgMTNweDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlIHsKICAgICAgICBib3JkZXItY29sbGFwc2U6IGNvbGxhcHNlOwogICAgICAgIGJvcmRlci1zcGFjaW5nOiAwOwogICAgICB9CgogICAgICB0YWJsZSB0ZCB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgICBtYXJnaW46IDA7CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyB7CiAgICAgICAgcGFkZGluZzogMCAyMHB4IDIwcHg7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIC5sZWdlbmQtaG9sZGVyIHsKICAgICAgICBiYWNrZ3JvdW5kOiAjZTllOWU5OwogICAgICAgIGJvcmRlci10b3A6IDFweCBzb2xpZCAjY2NjOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgY29sb3I6ICM1NTU7CiAgICAgICAgcGFkZGluZzogMTVweCAyMHB4OwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAudG9nZ2xlLWxlZ2VuZC1idXR0b24gewogICAgICAgIG1heC1oZWlnaHQ6IDIwcHg7CiAgICAgICAgbWF4LXdpZHRoOiAyMHB4OwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgIH0KCiAgICAgIC50b2dnbGUtbGVnZW5kLXRleHQgewogICAgICAgIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7CiAgICAgIH0KCiAgICAgIHBhcGVyLXJhZGlvLWJ1dHRvbiB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CiAgICAgIHN2Zy5pY29uLAogICAgICB0Zi1ncmFwaC1pY29uIHsKICAgICAgICB3aWR0aDogNjBweDsKICAgICAgICBoZWlnaHQ6IDE4cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblZhbHVlcyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogMTY1cHg7CiAgICAgIH0KICAgICAgLmRvbWFpblN0YXJ0IHsKICAgICAgICBmbG9hdDogbGVmdDsKICAgICAgfQogICAgICAuZG9tYWluRW5kIHsKICAgICAgICBmbG9hdDogcmlnaHQ7CiAgICAgIH0KICAgICAgLmNvbG9yQm94IHsKICAgICAgICB3aWR0aDogMjBweDsKICAgICAgfQoKICAgICAgLmltYWdlLWljb24gewogICAgICAgIHdpZHRoOiAyNHB4OwogICAgICAgIGhlaWdodDogMjRweDsKICAgICAgfQoKICAgICAgLmhlbHAtaWNvbiB7CiAgICAgICAgaGVpZ2h0OiAxNXB4OwogICAgICAgIG1hcmdpbjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAuZ3JheSB7CiAgICAgICAgY29sb3I6ICM2NjY7CiAgICAgIH0KCiAgICAgIC50aXRsZSB7CiAgICAgICAgZm9udC1zaXplOiAxNnB4OwogICAgICAgIG1hcmdpbjogOHB4IDVweCA4cHggMDsKICAgICAgICBjb2xvcjogYmxhY2s7CiAgICAgIH0KICAgICAgLnRpdGxlIHNtYWxsIHsKICAgICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICB9CiAgICAgIC5kZXZpY2VMaXN0LAogICAgICAueGxhQ2x1c3Rlckxpc3QgewogICAgICAgIG1heC1oZWlnaHQ6IDIwMHB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgICNmaWxlIHsKICAgICAgICBwYWRkaW5nOiA4cHggMDsKICAgICAgfQoKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDIwcHg7CiAgICAgICAgbWFyZ2luLXRvcDogNXB4OwogICAgICB9CgogICAgICAuY29sb3ItbGVnZW5kLXJvdyAubGFiZWwsCiAgICAgIC5jb2xvci1sZWdlbmQtcm93IHN2ZywKICAgICAgLmNvbG9yLWxlZ2VuZC1yb3cgdGYtZ3JhcGgtaWNvbiB7CiAgICAgICAgZmxleDogMCAwIDQwcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAyMHB4OwogICAgICB9CgogICAgICAuZGV2aWNlcy1jaGVja2JveCBpbnB1dCB7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOwogICAgICB9CgogICAgICAuY29udHJvbC1ob2xkZXIgLmljb24tYnV0dG9uIHsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luOiAwIC01cHg7CiAgICAgICAgcGFkZGluZzogNXB4OwogICAgICB9CgogICAgICAuYnV0dG9uLXRleHQgewogICAgICAgIHBhZGRpbmctbGVmdDogMjBweDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogbm9uZTsKICAgICAgfQoKICAgICAgLnVwbG9hZC1idXR0b24gewogICAgICAgIHdpZHRoOiAxNjVweDsKICAgICAgICBoZWlnaHQ6IDI1cHg7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7CiAgICAgICAgbWFyZ2luLXRvcDogNHB4OwogICAgICB9CgogICAgICAuYnV0dG9uLWljb24gewogICAgICAgIHdpZHRoOiAyNnB4OwogICAgICAgIGhlaWdodDogMjZweDsKICAgICAgICBjb2xvcjogdmFyKC0tcGFwZXItb3JhbmdlLTUwMCk7CiAgICAgIH0KCiAgICAgIC5oaWRkZW4taW5wdXQgewogICAgICAgIGhlaWdodDogMHB4OwogICAgICAgIHdpZHRoOiAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC5jb250cm9sLWhvbGRlciB7CiAgICAgICAgY2xlYXI6IGJvdGg7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IHNwYWNlLWJldHdlZW47CiAgICAgIH0KCiAgICAgIC5hbGxjb250cm9scyAuY29udHJvbC1ob2xkZXIgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQoKICAgICAgc3Bhbi5jb3VudGVyIHsKICAgICAgICBmb250LXNpemU6IDEzcHg7CiAgICAgICAgY29sb3I6IGdyYXk7CiAgICAgIH0KCiAgICAgIC5ydW5zIHBhcGVyLWl0ZW0gewogICAgICAgIC0tcGFwZXItaXRlbTogewogICAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHRhYmxlLmNvbnRyb2wtaG9sZGVyIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsKICAgICAgfQoKICAgICAgdGFibGUudGYtZ3JhcGgtY29udHJvbHMgdGQuaW5wdXQtZWxlbWVudC10YWJsZS1kYXRhIHsKICAgICAgICBwYWRkaW5nOiAwIDAgMCAyMHB4OwogICAgICB9CgogICAgICAuc3BhY2VyIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgIH0KCiAgICAgIC5jb2xvci10ZXh0IHsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CgogICAgICAvKiogT3ZlcnJpZGUgaW5saW5lIHN0eWxlcyB0aGF0IHN1cHByZXNzIHBvaW50ZXIgZXZlbnRzIGZvciBkaXNhYmxlZCBidXR0b25zLiBPdGhlcndpc2UsIHRoZSAqLwogICAgICAvKiAgdG9vbHRpcHMgZG8gbm90IGFwcGVhci4gKi8KICAgICAgcGFwZXItcmFkaW8tZ3JvdXAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBwb2ludGVyLWV2ZW50czogYXV0byAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAubGVnZW5kLWNsYXJpZmllciB7CiAgICAgICAgY29sb3I6ICMyNjYyMzY7CiAgICAgICAgY3Vyc29yOiBoZWxwOwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgLmxlZ2VuZC1jbGFyaWZpZXIgcGFwZXItdG9vbHRpcCB7CiAgICAgICAgd2lkdGg6IDE1MHB4OwogICAgICB9CgogICAgICAvKiogT3RoZXJ3aXNlLCBwb2x5bWVyIFVJIGNvbnRyb2xzIGFwcGVhciBhdG9wIG5vZGUgc2VhcmNoLiAqLwogICAgICB0Zi1ncmFwaC1ub2RlLXNlYXJjaCB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgoKICAgIDxkaXYgY2xhc3M9ImFsbGNvbnRyb2xzIj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDx0Zi1ncmFwaC1ub2RlLXNlYXJjaAogICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tzZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIHJlbmRlci1oaWVyYXJjaHk9IltbcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgPjwvdGYtZ3JhcGgtbm9kZS1zZWFyY2g+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLWJ1dHRvbiBjbGFzcz0iaWNvbi1idXR0b24iIG9uLXRhcD0iX2ZpdCIgYWx0PSJGaXQgdG8gc2NyZWVuIj4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iYXNwZWN0LXJhdGlvIiBjbGFzcz0iYnV0dG9uLWljb24iPjwvaXJvbi1pY29uPgogICAgICAgICAgPHNwYW4gY2xhc3M9ImJ1dHRvbi10ZXh0Ij5GaXQgdG8gU2NyZWVuPC9zcGFuPgogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgIGNsYXNzPSJpY29uLWJ1dHRvbiIKICAgICAgICAgIG9uLWNsaWNrPSJkb3dubG9hZCIKICAgICAgICAgIGFsdD0iRG93bmxvYWQgUE5HIgogICAgICAgID4KICAgICAgICAgIDxpcm9uLWljb24gaWNvbj0iZmlsZS1kb3dubG9hZCIgY2xhc3M9ImJ1dHRvbi1pY29uIj48L2lyb24taWNvbj4KICAgICAgICAgIDxzcGFuIGNsYXNzPSJidXR0b24tdGV4dCI+RG93bmxvYWQgUE5HPC9zcGFuPgogICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgIDxhIGhyZWY9IiMiIGlkPSJncmFwaGRvd25sb2FkIiBjbGFzcz0idGl0bGUiIGRvd25sb2FkPSJncmFwaC5wbmciPjwvYT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIHJ1bnMiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgIFJ1biA8c3BhbiBjbGFzcz0iY291bnRlciI+KFtbZGF0YXNldHMubGVuZ3RoXV0pPC9zcGFuPgogICAgICAgIDwvZGl2PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICBuby1sYWJlbC1mbG9hdAogICAgICAgICAgbm8tYW5pbWF0aW9ucwogICAgICAgICAgbm9pbmsKICAgICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgICAgICBjbGFzcz0icnVuLWRyb3Bkb3duIgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRSdW5JbmRleH19IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW2RhdGFzZXRzXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPltbaXRlbS5uYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dTZXNzaW9uUnVuc0Ryb3Bkb3duXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj4KICAgICAgICAgICAgVGFnCiAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb3VudGVyIgogICAgICAgICAgICAgID4oW1tfbnVtVGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0pPC9zcGFuCiAgICAgICAgICAgID4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgbm8tbGFiZWwtZmxvYXQKICAgICAgICAgICAgbm8tYW5pbWF0aW9ucwogICAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgICAgICBub2luawogICAgICAgICAgICBjbGFzcz0icnVuLWRyb3Bkb3duIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFRhZ0luZGV4fX0iCiAgICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tfZ2V0VGFncyhkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgpXV0iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+W1tpdGVtLmRpc3BsYXlOYW1lXV08L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd1VwbG9hZEJ1dHRvbl1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0aXRsZSI+VXBsb2FkPC9kaXY+CiAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgIHJhaXNlZAogICAgICAgICAgICBjbGFzcz0idXBsb2FkLWJ1dHRvbiIKICAgICAgICAgICAgb24tY2xpY2s9Il9nZXRGaWxlIgogICAgICAgICAgICB0aXRsZT0iVXBsb2FkIGEgZ3JhcGggcGJ0eHQgZmlsZSB0byB2aWV3IHRoZSBncmFwaCIKICAgICAgICAgID4KICAgICAgICAgICAgQ2hvb3NlIEZpbGUKICAgICAgICAgIDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGlkZGVuLWlucHV0Ij4KICAgICAgICAgICAgPGlucHV0CiAgICAgICAgICAgICAgdHlwZT0iZmlsZSIKICAgICAgICAgICAgICBpZD0iZmlsZSIKICAgICAgICAgICAgICBuYW1lPSJmaWxlIgogICAgICAgICAgICAgIG9uLWNoYW5nZT0iX3VwZGF0ZUZpbGVJbnB1dCIKICAgICAgICAgICAgICBhY2NlcHQ9Ii5wYnR4dCIKICAgICAgICAgICAgLz4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8ZGl2IGNsYXNzPSJjb250cm9sLWhvbGRlciI+CiAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwIHNlbGVjdGVkPSJ7e19zZWxlY3RlZEdyYXBoVHlwZX19Ij4KICAgICAgICAgIDwhLS0gTm90ZSB0aGF0IHRoZSBuYW1lIGhhcyB0byBtYXRjaCB0aGF0IG9mIHRmX2dyYXBoX2NvbW1vbi5TZWxlY3Rpb25UeXBlLiAtLT4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgbmFtZT0ib3BfZ3JhcGgiCiAgICAgICAgICAgIGRpc2FibGVkPSJbW19nZXRTZWxlY3Rpb25PcEdyYXBoRGlzYWJsZWQoZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCldXSIKICAgICAgICAgICAgPkdyYXBoPC9wYXBlci1yYWRpby1idXR0b24KICAgICAgICAgID4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgbmFtZT0iY29uY2VwdHVhbF9ncmFwaCIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvbkNvbmNlcHR1YWxHcmFwaERpc2FibGVkKGRhdGFzZXRzLCBfc2VsZWN0ZWRSdW5JbmRleCwgX3NlbGVjdGVkVGFnSW5kZXgpXV0iCiAgICAgICAgICAgID5Db25jZXB0dWFsIEdyYXBoPC9wYXBlci1yYWRpby1idXR0b24KICAgICAgICAgID4KICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgbmFtZT0icHJvZmlsZSIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2dldFNlbGVjdGlvblByb2ZpbGVEaXNhYmxlZChkYXRhc2V0cywgX3NlbGVjdGVkUnVuSW5kZXgsIF9zZWxlY3RlZFRhZ0luZGV4KV1dIgogICAgICAgICAgICA+UHJvZmlsZTwvcGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICA+CiAgICAgICAgPC9wYXBlci1yYWRpby1ncm91cD4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXRvZ2dsZS1idXR0b24gY2hlY2tlZD0ie3t0cmFjZUlucHV0c319IiBjbGFzcz0idGl0bGUiPgogICAgICAgICAgICBUcmFjZSBpbnB1dHMKICAgICAgICAgIDwvcGFwZXItdG9nZ2xlLWJ1dHRvbj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWFsdGhQaWxsc0ZlYXR1cmVFbmFibGVkXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtaG9sZGVyIj4KICAgICAgICAgIDxwYXBlci10b2dnbGUtYnV0dG9uIGNoZWNrZWQ9Int7aGVhbHRoUGlsbHNUb2dnbGVkT259fSIgY2xhc3M9InRpdGxlIgogICAgICAgICAgICA+U2hvdyBoZWFsdGggcGlsbHM8L3BhcGVyLXRvZ2dsZS1idXR0b24KICAgICAgICAgID4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPGRpdiBjbGFzcz0iY29udHJvbC1ob2xkZXIiPgogICAgICAgIDxkaXYgY2xhc3M9InRpdGxlIj5Db2xvcjwvZGl2PgogICAgICAgIDxwYXBlci1yYWRpby1ncm91cCBzZWxlY3RlZD0ie3tjb2xvckJ5fX0iPgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBuYW1lPSJzdHJ1Y3R1cmUiPlN0cnVjdHVyZTwvcGFwZXItcmFkaW8tYnV0dG9uPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gbmFtZT0iZGV2aWNlIj5EZXZpY2U8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJ4bGEtY2x1c3Rlci1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9InhsYV9jbHVzdGVyIgogICAgICAgICAgICBkaXNhYmxlZD0iW1shX3hsYUNsdXN0ZXJzUHJvdmlkZWQocmVuZGVySGllcmFyY2h5KV1dIgogICAgICAgICAgPgogICAgICAgICAgICBYTEEgQ2x1c3RlcgogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgIGZvcj0ieGxhLWNsdXN0ZXItcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgWExBIGNsdXN0ZXIgaXMgb25seSBlbmFibGVkIGlmIGF0IGxlYXN0IDEgb3Agc3BlY2lmaWVzCiAgICAgICAgICAgIGFuIFhMQSBjbHVzdGVyLgogICAgICAgICAgPC9wYXBlci10b29sdGlwPgoKICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24KICAgICAgICAgICAgaWQ9ImNvbXB1dGUtdGltZS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9ImNvbXB1dGVfdGltZSIKICAgICAgICAgICAgZGlzYWJsZWQ9IltbIXN0YXRzXV0iCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbXB1dGUgdGltZQogICAgICAgICAgPC9wYXBlci1yYWRpby1idXR0b24+CiAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgIGZvcj0iY29tcHV0ZS10aW1lLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICA+CiAgICAgICAgICAgIENvbG9yaW5nIGJ5IGNvbXB1dGUgdGltZSBpcyBvbmx5IGVuYWJsZWQgaWYgdGhlIFJ1bk1ldGFkYXRhIHByb3RvIGlzCiAgICAgICAgICAgIHBhc3NlZCB0byB0aGUgRmlsZVdyaXRlciB3aGVuIGEgc3BlY2lmaWMgc2Vzc2lvbiBpcyBydW4uCiAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CgogICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICBpZD0ibWVtb3J5LXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgbmFtZT0ibWVtb3J5IgogICAgICAgICAgICBkaXNhYmxlZD0iW1shc3RhdHNdXSIKICAgICAgICAgID4KICAgICAgICAgICAgTWVtb3J5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJtZW1vcnktcmFkaW8tYnV0dG9uIgogICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgID4KICAgICAgICAgICAgQ29sb3JpbmcgYnkgbWVtb3J5IGlzIG9ubHkgZW5hYmxlZCBpZiB0aGUgUnVuTWV0YWRhdGEgcHJvdG8gaXMKICAgICAgICAgICAgcGFzc2VkIHRvIHRoZSBGaWxlV3JpdGVyIHdoZW4gYSBzcGVjaWZpYyBzZXNzaW9uIGlzIHJ1bi4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KCiAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uCiAgICAgICAgICAgIGlkPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIG5hbWU9Im9wX2NvbXBhdGliaWxpdHkiCiAgICAgICAgICA+CiAgICAgICAgICAgIFRQVSBDb21wYXRpYmlsaXR5CiAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgZm9yPSJ0cHUtY29tcGF0aWJpbGl0eS1yYWRpby1idXR0b24iCiAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgPgogICAgICAgICAgICBDb2xvcmluZyBieSB3aGV0aGVyIGFuIG9wZXJhdGlvbiBpcyBjb21wYXRpYmxlIGZvciB0aGUgVFBVIGRldmljZS4KICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgIDxzcGFuIGNsYXNzPSJzcGFjZXIiPjwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19pc0dyYWRpZW50Q29sb3Jpbmcoc3RhdHMsIGNvbG9yQnkpXV0iPgogICAgICAgICAgPHN2ZyB3aWR0aD0iMTQwIiBoZWlnaHQ9IjIwIiBzdHlsZT0ibWFyZ2luOiAwIDVweCIgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICA8bGluZWFyR3JhZGllbnQKICAgICAgICAgICAgICAgIGlkPSJsaW5lYXJHcmFkaWVudCIKICAgICAgICAgICAgICAgIHgxPSIwJSIKICAgICAgICAgICAgICAgIHkxPSIwJSIKICAgICAgICAgICAgICAgIHgyPSIxMDAlIgogICAgICAgICAgICAgICAgeTI9IjAlIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxzdG9wCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJzdGFydCIKICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwJSIKICAgICAgICAgICAgICAgICAgc3RvcC1jb2xvciQ9IltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5zdGFydENvbG9yXV0iCiAgICAgICAgICAgICAgICA+PC9zdG9wPgogICAgICAgICAgICAgICAgPHN0b3AKICAgICAgICAgICAgICAgICAgY2xhc3M9ImVuZCIKICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIxMDAlIgogICAgICAgICAgICAgICAgICBzdG9wLWNvbG9yJD0iW1tfY3VycmVudEdyYWRpZW50UGFyYW1zLmVuZENvbG9yXV0iCiAgICAgICAgICAgICAgICA+PC9zdG9wPgogICAgICAgICAgICAgIDwvbGluZWFyR3JhZGllbnQ+CiAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgPHJlY3QKICAgICAgICAgICAgICB4PSIwIgogICAgICAgICAgICAgIHk9IjAiCiAgICAgICAgICAgICAgd2lkdGg9IjEzNSIKICAgICAgICAgICAgICBoZWlnaHQ9IjIwIgogICAgICAgICAgICAgIGZpbGw9InVybCgjbGluZWFyR3JhZGllbnQpIgogICAgICAgICAgICAgIHN0cm9rZT0iYmxhY2siCiAgICAgICAgICAgID48L3JlY3Q+CiAgICAgICAgICA8L3N2Zz4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpblZhbHVlcyBjb2xvci10ZXh0Ij4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iZG9tYWluU3RhcnQiPltbX2N1cnJlbnRHcmFkaWVudFBhcmFtcy5taW5WYWx1ZV1dPC9kaXY+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImRvbWFpbkVuZCI+W1tfY3VycmVudEdyYWRpZW50UGFyYW1zLm1heFZhbHVlXV08L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGJyIHN0eWxlPSJjbGVhcjogYm90aCIgLz4KICAgICAgICAgIDxkaXY+RGV2aWNlcyBpbmNsdWRlZCBpbiBzdGF0czo8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImRldmljZUxpc3QiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlc11dIj4KICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93IGRldmljZXMtY2hlY2tib3giPgogICAgICAgICAgICAgICAgPHNwYW4KICAgICAgICAgICAgICAgICAgPjxpbnB1dAogICAgICAgICAgICAgICAgICAgIHR5cGU9ImNoZWNrYm94IgogICAgICAgICAgICAgICAgICAgIHZhbHVlJD0iW1tpdGVtLmRldmljZV1dIgogICAgICAgICAgICAgICAgICAgIGNoZWNrZWQkPSJbW2l0ZW0udXNlZF1dIgogICAgICAgICAgICAgICAgICAgIG9uLWNsaWNrPSJfZGV2aWNlQ2hlY2tib3hDbGlja2VkIgogICAgICAgICAgICAgICAgLz48L3NwYW4+CiAgICAgICAgICAgICAgICA8c3Bhbj5bW2l0ZW0uc3VmZml4XV08L3NwYW4+CiAgICAgICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaXRlbS5pZ25vcmVkTXNnXV0iPgogICAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgICBpY29uPSJoZWxwIgogICAgICAgICAgICAgICAgICAgIGNsYXNzPSJoZWxwLWljb24iCiAgICAgICAgICAgICAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcCBwb3NpdGlvbj0icmlnaHQiIG9mZnNldD0iMCIgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgID5bW2l0ZW0uaWdub3JlZE1zZ11dPC9wYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICdzdHJ1Y3R1cmUnKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0ibGFiZWwiPiBjb2xvcnMgPC9zcGFuPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnNhbWUgc3Vic3RydWN0dXJlPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgZmlsbC1vdmVycmlkZT0iI2VlZSIKICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiIKICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPnVuaXF1ZSBzdWJzdHJ1Y3R1cmU8L3NwYW4+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2VxdWFscyhjb2xvckJ5LCAnZGV2aWNlJyldXSI+CiAgICAgICAgICA8ZGl2PgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jdXJyZW50RGV2aWNlUGFyYW1zXV0iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgdHlwZT0iTUVUQSIKICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgZmlsbC1vdmVycmlkZT0iW1tpdGVtLmNvbG9yXV0iCiAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2E2YTZhNiIKICAgICAgICAgICAgICAgID48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5bW2l0ZW0uZGV2aWNlXV08L3NwYW4+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLWxlZ2VuZC1yb3ciPgogICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uCiAgICAgICAgICAgICAgICB0eXBlPSJNRVRBIgogICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNlZWUiCiAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNhNmE2YTYiCiAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIGRldmljZTwvc3Bhbj4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZXF1YWxzKGNvbG9yQnksICd4bGFfY2x1c3RlcicpXV0iPgogICAgICAgICAgPGRpdj4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY3VycmVudFhsYUNsdXN0ZXJQYXJhbXNdXSI+CiAgICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgICA8dXNlCiAgICAgICAgICAgICAgICAgICAgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiCiAgICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj0iI3VuZmlsbGVkLXJlY3QiCiAgICAgICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgICAgICB5PSIwIgogICAgICAgICAgICAgICAgICAgIHN0eWxlPSJmaWxsOltbaXRlbS5jb2xvcl1dIgogICAgICAgICAgICAgICAgICA+PC91c2U+CiAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPltbaXRlbS54bGFfY2x1c3Rlcl1dPC9zcGFuPgogICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8c3ZnPgogICAgICAgICAgICAgICAgPHVzZQogICAgICAgICAgICAgICAgICB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIKICAgICAgICAgICAgICAgICAgeGxpbms6aHJlZj0iI2dyZXktcmVjdCIKICAgICAgICAgICAgICAgICAgeD0iMCIKICAgICAgICAgICAgICAgICAgeT0iMCIKICAgICAgICAgICAgICAgID48L3VzZT4KICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj51bmtub3duIFhMQSBjbHVzdGVyPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19lcXVhbHMoY29sb3JCeSwgJ29wX2NvbXBhdGliaWxpdHknKV1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbG9yLXRleHQiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2xvci1sZWdlbmQtcm93Ij4KICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgdHlwZT0iT1AiCiAgICAgICAgICAgICAgICBoZWlnaHQ9IjE2IgogICAgICAgICAgICAgICAgZmlsbC1vdmVycmlkZT0iIzBmOWQ1OCIKICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSJjb2xvci1sZWdlbmQtdmFsdWUiPlZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgIHR5cGU9Ik9QIgogICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgIGZpbGwtb3ZlcnJpZGU9IiNkYjQ0MzciCiAgICAgICAgICAgICAgICBzdHJva2Utb3ZlcnJpZGU9IiNjY2MiCiAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iY29sb3ItbGVnZW5kLXZhbHVlIj5JbnZhbGlkIE9wPC9zcGFuPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19zdGF0c05vdE51bGwoc3RhdHMpXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0iY29sb3ItbGVnZW5kLXJvdyI+CiAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik1FVEEiIGhlaWdodD0iMTYiIGZhZGVkPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgPHNwYW4gY2xhc3M9ImNvbG9yLWxlZ2VuZC12YWx1ZSI+dW51c2VkIHN1YnN0cnVjdHVyZTwvc3Bhbj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9kaXY+CiAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtaG9sZGVyIj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0iW1tfZ2V0VG9nZ2xlTGVnZW5kSWNvbihfbGVnZW5kT3BlbmVkKV1dIgogICAgICAgIG9uLWNsaWNrPSJfdG9nZ2xlTGVnZW5kT3BlbiIKICAgICAgICBjbGFzcz0idG9nZ2xlLWxlZ2VuZC1idXR0b24iCiAgICAgID4KICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHNwYW4gY2xhc3M9InRvZ2dsZS1sZWdlbmQtdGV4dCI+CiAgICAgICAgW1tfZ2V0VG9nZ2xlVGV4dChfbGVnZW5kT3BlbmVkKV1dCiAgICAgIDwvc3Bhbj4KICAgICAgPGlyb24tY29sbGFwc2Ugb3BlbmVkPSJbW19sZWdlbmRPcGVuZWRdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDx0YWJsZT4KICAgICAgICAgICAgPHRib2R5PgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD48ZGl2IGNsYXNzPSJ0aXRsZSI+R3JhcGg8L2Rpdj48L3RkPgogICAgICAgICAgICAgICAgPHRkPigqID0gZXhwYW5kYWJsZSk8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbgogICAgICAgICAgICAgICAgICAgIHR5cGU9Ik1FVEEiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICBmaWxsLW92ZXJyaWRlPSIjZDlkOWQ5IgogICAgICAgICAgICAgICAgICAgIHN0cm9rZS1vdmVycmlkZT0iI2NjYyIKICAgICAgICAgICAgICAgICAgPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIE5hbWVzcGFjZTxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgRW5jYXBzdWxhdGVzIGEgc2V0IG9mIG5vZGVzLiBOYW1lc3BhY2UgaXMgaGllcmFyY2hpY2FsIGFuZAogICAgICAgICAgICAgICAgICAgICAgYmFzZWQgb24gc2NvcGUuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDx0Zi1ncmFwaC1pY29uIHR5cGU9Ik9QIiBoZWlnaHQ9IjE2Ij48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBPcE5vZGUKICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGVnZW5kLWNsYXJpZmllciI+CiAgICAgICAgICAgICAgICAgICAgPHNwYW4+Pzwvc3Bhbj4KICAgICAgICAgICAgICAgICAgICA8cGFwZXItdG9vbHRpcAogICAgICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICAgIE5vZGUgdGhhdCBwZXJmb3JtcyBhbiBvcGVyYXRpb24uIFRoZXNlIG5vZGVzIGNhbm5vdAogICAgICAgICAgICAgICAgICAgICAgZXhwYW5kLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTRVJJRVMiIGhlaWdodD0iMTYiPjwvdGYtZ3JhcGgtaWNvbj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFVuY29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgbm90IGNvbm5lY3RlZCB0byBlYWNoCiAgICAgICAgICAgICAgICAgICAgICBvdGhlci4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgPHRmLWdyYXBoLWljb24KICAgICAgICAgICAgICAgICAgICB0eXBlPSJTRVJJRVMiCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNiIKICAgICAgICAgICAgICAgICAgICB2ZXJ0aWNhbAogICAgICAgICAgICAgICAgICA+PC90Zi1ncmFwaC1pY29uPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgQ29ubmVjdGVkIHNlcmllczxzcGFuIGNsYXNzPSJncmF5Ij4qPC9zcGFuPgogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2Ugb2YgbnVtYmVyZWQgbm9kZXMgdGhhdCBhcmUgY29ubmVjdGVkIHRvIGVhY2gKICAgICAgICAgICAgICAgICAgICAgIG90aGVyLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnIGNsYXNzPSJpY29uIj4KICAgICAgICAgICAgICAgICAgICA8Y2lyY2xlCiAgICAgICAgICAgICAgICAgICAgICBmaWxsPSJ3aGl0ZSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iIzg0ODQ4NCIKICAgICAgICAgICAgICAgICAgICAgIGN4PSIxMCIKICAgICAgICAgICAgICAgICAgICAgIGN5PSIxMCIKICAgICAgICAgICAgICAgICAgICAgIHI9IjUiCiAgICAgICAgICAgICAgICAgICAgPjwvY2lyY2xlPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIENvbnN0YW50CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgb3V0cHV0cyBhIGNvbnN0YW50IHZhbHVlLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8dGYtZ3JhcGgtaWNvbiB0eXBlPSJTVU1NQVJZIiBoZWlnaHQ9IjIwIj48L3RmLWdyYXBoLWljb24+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICBTdW1tYXJ5CiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBOb2RlIHRoYXQgY29sbGVjdHMgZGF0YSBmb3IgdmlzdWFsaXphdGlvbiB3aXRoaW4KICAgICAgICAgICAgICAgICAgICAgIFRlbnNvckJvYXJkLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imljb24iCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNXB4IgogICAgICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDE1IDE1IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPGRlZnM+CiAgICAgICAgICAgICAgICAgICAgICA8bWFya2VyCiAgICAgICAgICAgICAgICAgICAgICAgIGlkPSJkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kIgogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjYmJiIgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckhlaWdodD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlg9IjkiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlk9IjUiCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgbWFya2VyLWVuZD0idXJsKCNkYXRhZmxvdy1hcnJvd2hlYWQtbGVnZW5kKSIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI2JiYiIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgID48L3BhdGg+CiAgICAgICAgICAgICAgICAgIDwvc3ZnPgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICAgRGF0YWZsb3cgZWRnZQogICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtY2xhcmlmaWVyIj4KICAgICAgICAgICAgICAgICAgICA8c3Bhbj4/PC9zcGFuPgogICAgICAgICAgICAgICAgICAgIDxwYXBlci10b29sdGlwCiAgICAgICAgICAgICAgICAgICAgICBhbmltYXRpb24tZGVsYXk9IjAiCiAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgRWRnZSBzaG93aW5nIHRoZSBkYXRhIGZsb3cgYmV0d2VlbiBvcGVyYXRpb25zLiBFZGdlcyBmbG93CiAgICAgICAgICAgICAgICAgICAgICB1cHdhcmRzIHVubGVzcyBhcnJvd2hlYWRzIHNwZWNpZnkgb3RoZXJ3aXNlLgogICAgICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgICAgICA8L3RkPgogICAgICAgICAgICAgIDwvdHI+CiAgICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgICA8c3ZnCiAgICAgICAgICAgICAgICAgICAgY2xhc3M9Imljb24iCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0PSIxNXB4IgogICAgICAgICAgICAgICAgICAgIHByZXNlcnZlQXNwZWN0UmF0aW89InhNaW5ZTWlkIG1lZXQiCiAgICAgICAgICAgICAgICAgICAgdmlld0JveD0iMCAwIDE1IDE1IgogICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgPHBhdGgKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZT0iI2JiYiIKICAgICAgICAgICAgICAgICAgICAgIGQ9Ik0yIDkgbCAyOSAwIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIgogICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlLWRhc2hhcnJheT0iMiwgMiIKICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIENvbnRyb2wgZGVwZW5kZW5jeSBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhlIGNvbnRyb2wgZGVwZW5kZW5jeSBiZXR3ZWVuIG9wZXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgPC90cj4KICAgICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIDxzdmcKICAgICAgICAgICAgICAgICAgICBjbGFzcz0iaWNvbiIKICAgICAgICAgICAgICAgICAgICBoZWlnaHQ9IjE1cHgiCiAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pbllNaWQgbWVldCIKICAgICAgICAgICAgICAgICAgICB2aWV3Qm94PSIwIDAgMTUgMTUiCiAgICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgICA8ZGVmcz4KICAgICAgICAgICAgICAgICAgICAgIDxtYXJrZXIKICAgICAgICAgICAgICAgICAgICAgICAgaWQ9InJlZmVyZW5jZS1hcnJvd2hlYWQtbGVnZW5kIgogICAgICAgICAgICAgICAgICAgICAgICBmaWxsPSIjRkZCNzREIgogICAgICAgICAgICAgICAgICAgICAgICBtYXJrZXJXaWR0aD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckhlaWdodD0iMTAiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlg9IjkiCiAgICAgICAgICAgICAgICAgICAgICAgIHJlZlk9IjUiCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudD0iYXV0by1zdGFydC1yZXZlcnNlIgogICAgICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgICAgICA8cGF0aCBkPSJNIDAsMCBMIDEwLDUgTCAwLDEwIEMgMyw3IDMsMyAwLDAiPjwvcGF0aD4KICAgICAgICAgICAgICAgICAgICAgIDwvbWFya2VyPgogICAgICAgICAgICAgICAgICAgIDwvZGVmcz4KICAgICAgICAgICAgICAgICAgICA8cGF0aAogICAgICAgICAgICAgICAgICAgICAgbWFya2VyLWVuZD0idXJsKCNyZWZlcmVuY2UtYXJyb3doZWFkLWxlZ2VuZCkiCiAgICAgICAgICAgICAgICAgICAgICBzdHJva2U9IiNGRkI3NEQiCiAgICAgICAgICAgICAgICAgICAgICBkPSJNMiA5IGwgMjkgMCIKICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZS1saW5lY2FwPSJyb3VuZCIKICAgICAgICAgICAgICAgICAgICA+PC9wYXRoPgogICAgICAgICAgICAgICAgICA8L3N2Zz4KICAgICAgICAgICAgICAgIDwvdGQ+CiAgICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgIFJlZmVyZW5jZSBlZGdlCiAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxlZ2VuZC1jbGFyaWZpZXIiPgogICAgICAgICAgICAgICAgICAgIDxzcGFuPj88L3NwYW4+CiAgICAgICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi1kZWxheT0iMCIKICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgICAgICBFZGdlIHNob3dpbmcgdGhhdCB0aGUgb3V0Z29pbmcgb3BlcmF0aW9uIG5vZGUgY2FuIG11dGF0ZQogICAgICAgICAgICAgICAgICAgICAgdGhlIGluY29taW5nIHRlbnNvci4KICAgICAgICAgICAgICAgICAgICA8L3BhcGVyLXRvb2x0aXA+CiAgICAgICAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgICA8L3RyPgogICAgICAgICAgICA8L3Rib2R5PgogICAgICAgICAgPC90YWJsZT4KICAgICAgICA8L2Rpdj4KICAgICAgPC9pcm9uLWNvbGxhcHNlPgogICAgPC9kaXY+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBvYnNlcnZlcjogJ19zdGF0c0NoYW5nZWQnLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaENvbnRyb2xzLnByb3RvdHlwZSwgInN0YXRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiZGV2aWNlc0ZvclN0YXRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiY29sb3JCeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaENvbnRyb2xzLnByb3RvdHlwZSwgImNvbG9yQnlQYXJhbXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfZGF0YXNldHNDaGFuZ2VkJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhDb250cm9scy5wcm90b3R5cGUsICJkYXRhc2V0cyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhDb250cm9scy5wcm90b3R5cGUsICJyZW5kZXJIaWVyYXJjaHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgICAgIGNvbXB1dGVkOiAnX2NvbXB1dGVTZWxlY3Rpb24oZGF0YXNldHMsIF9zZWxlY3RlZFJ1bkluZGV4LCBfc2VsZWN0ZWRUYWdJbmRleCwgX3NlbGVjdGVkR3JhcGhUeXBlKScsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAic2VsZWN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAic2VsZWN0ZWRGaWxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBvYnNlcnZlcjogJ19zZWxlY3RlZFJ1bkluZGV4Q2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiX3NlbGVjdGVkUnVuSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaENvbnRyb2xzLnByb3RvdHlwZSwgInRyYWNlSW5wdXRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBvYnNlcnZlcjogJ19zZWxlY3RlZFRhZ0luZGV4Q2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiX3NlbGVjdGVkVGFnSW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiX3NlbGVjdGVkR3JhcGhUeXBlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAic2VsZWN0ZWROb2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAic2hvd1Nlc3Npb25SdW5zRHJvcGRvd24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhDb250cm9scy5wcm90b3R5cGUsICJzaG93VXBsb2FkQnV0dG9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiaGVhbHRoUGlsbHNGZWF0dXJlRW5hYmxlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiaGVhbHRoUGlsbHNUb2dnbGVkT24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhDb250cm9scy5wcm90b3R5cGUsICJfbGVnZW5kT3BlbmVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdkZXZpY2VzRm9yU3RhdHMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZHcmFwaENvbnRyb2xzLnByb3RvdHlwZSwgIl9jdXJyZW50RGV2aWNlcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ2NvbG9yQnlQYXJhbXMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZHcmFwaENvbnRyb2xzLnByb3RvdHlwZSwgIl9jdXJyZW50RGV2aWNlUGFyYW1zIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnY29sb3JCeVBhcmFtcycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiX2N1cnJlbnRYbGFDbHVzdGVyUGFyYW1zIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnY29sb3JCeVBhcmFtcycsICdjb2xvckJ5JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkdyYXBoQ29udHJvbHMucHJvdG90eXBlLCAiX2N1cnJlbnRHcmFkaWVudFBhcmFtcyIsIG51bGwpOwogICAgVGZHcmFwaENvbnRyb2xzID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZ3JhcGgtY29udHJvbHMnKQogICAgXSwgVGZHcmFwaENvbnRyb2xzKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIFRwdUNvbXBhdGliaWxpdHlQcm92aWRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBub2RlJ3MgaW5mZXJyZWQgZGV2aWNlIGlzIG5vdCB0aGUgVFBVLgogICAgICAgICAqIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgYSBiZXN0LWVmZm9ydCBjaGVjay4KICAgICAgICAgKi8KICAgICAgICBpc05vdFRwdU9wKG9wRGV2aWNlKSB7CiAgICAgICAgICAgIGlmIChvcERldmljZS50b0xvd2VyQ2FzZSgpLnNlYXJjaCgnY3B1OicpICE9IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3BEZXZpY2UudG9Mb3dlckNhc2UoKS5zZWFyY2goJ2dwdTonKSAhPSAtMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG9wRGV2aWNlLnRvTG93ZXJDYXNlKCkuc2VhcmNoKCd0cHUnKSA9PSAtMTsKICAgICAgICB9CiAgICAgICAgb3BWYWxpZChvcE5vZGUpIHsKICAgICAgICAgICAgLy8gRnVuY3Rpb24gbGlicmFyeSBub2RlcyBhcmUgZ2VuZXJhbGx5IGZvciBpbnRlcm5hbCB1c2UuCiAgICAgICAgICAgIGlmIChvcE5vZGUubmFtZS5zZWFyY2goRlVOQ1RJT05fTElCUkFSWV9OT0RFX1BSRUZJWCkgPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTm9kZXMgdGhhdCBsYWNrIG9wIHR5cGVzIHNob3VsZCBiZSBpZ25vcmVkLgogICAgICAgICAgICBpZiAoIW9wTm9kZS5vcCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgYXNzaWduZWQgYSBkZXZpY2UgdGhhdCBpcyBub3QgVFBVLXJlbGF0ZWQgYXNzdW1lIG9wIGlzIHZhbGlkLgogICAgICAgICAgICBpZiAob3BOb2RlLmRldmljZSAmJiB0aGlzLmlzTm90VHB1T3Aob3BOb2RlLmRldmljZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIGFzc2lnbmVkIHRvIHRoZSBUUFVfU1lTVEVNIGRldmljZSwgYXNzdW1lIG9wIGlzIHZhbGlkLgogICAgICAgICAgICBpZiAob3BOb2RlLmRldmljZSAmJiBvcE5vZGUuZGV2aWNlLnNlYXJjaCgnVFBVX1NZU1RFTScpICE9IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbG9kYXNoLmluY2x1ZGVzKFRwdUNvbXBhdGliaWxpdHlQcm92aWRlci5XSElURUxJU1QsIG9wTm9kZS5vcCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBbGxvd2VkIGxpc3Qgb2YgY3VycmVudCBUZW5zb3JmbG93IG9wcyB2YWxpZCBvbiB0aGUgVFBVLgogICAgICogTm90ZSB0aGF0IHNvbWUgZGF0YSB0eXBlcyBtYXkgYmUgdW5zdXBwb3J0ZWQuCiAgICAgKi8KICAgIFRwdUNvbXBhdGliaWxpdHlQcm92aWRlci5XSElURUxJU1QgPSBbCiAgICAgICAgJ0FicycsCiAgICAgICAgJ0Fjb3MnLAogICAgICAgICdBY29zaCcsCiAgICAgICAgJ0FkZCcsCiAgICAgICAgJ0FkZE4nLAogICAgICAgICdBZGRWMicsCiAgICAgICAgJ0FkanVzdENvbnRyYXN0djInLAogICAgICAgICdBZGp1c3RIdWUnLAogICAgICAgICdBZGp1c3RTYXR1cmF0aW9uJywKICAgICAgICAnQWxsJywKICAgICAgICAnQWxsVG9BbGwnLAogICAgICAgICdBbmdsZScsCiAgICAgICAgJ0FueScsCiAgICAgICAgJ0FwcHJveGltYXRlRXF1YWwnLAogICAgICAgICdBcmdNYXgnLAogICAgICAgICdBcmdNaW4nLAogICAgICAgICdBc2luJywKICAgICAgICAnQXNpbmgnLAogICAgICAgICdBc3NlcnQnLAogICAgICAgICdBc3NpZ25BZGRWYXJpYWJsZU9wJywKICAgICAgICAnQXNzaWduU3ViVmFyaWFibGVPcCcsCiAgICAgICAgJ0Fzc2lnblZhcmlhYmxlT3AnLAogICAgICAgICdBdGFuJywKICAgICAgICAnQXRhbjInLAogICAgICAgICdBdGFuaCcsCiAgICAgICAgJ0F2Z1Bvb2wnLAogICAgICAgICdBdmdQb29sM0QnLAogICAgICAgICdBdmdQb29sM0RHcmFkJywKICAgICAgICAnQXZnUG9vbEdyYWQnLAogICAgICAgICdCYXRjaE1hdE11bCcsCiAgICAgICAgJ0JhdGNoTWF0TXVsVjInLAogICAgICAgICdCYXRjaFRvU3BhY2UnLAogICAgICAgICdCYXRjaFRvU3BhY2VORCcsCiAgICAgICAgJ0Jlc3NlbEkwZScsCiAgICAgICAgJ0Jlc3NlbEkxZScsCiAgICAgICAgJ0JldGFpbmMnLAogICAgICAgICdCaWFzQWRkJywKICAgICAgICAnQmlhc0FkZEdyYWQnLAogICAgICAgICdCaWFzQWRkVjEnLAogICAgICAgICdCaXRjYXN0JywKICAgICAgICAnQml0d2lzZUFuZCcsCiAgICAgICAgJ0JpdHdpc2VPcicsCiAgICAgICAgJ0JpdHdpc2VYb3InLAogICAgICAgICdCcm9hZGNhc3RBcmdzJywKICAgICAgICAnQnJvYWRjYXN0R3JhZGllbnRBcmdzJywKICAgICAgICAnQnJvYWRjYXN0VG8nLAogICAgICAgICdCdWNrZXRpemUnLAogICAgICAgICdDYXNlJywKICAgICAgICAnQ2FzdCcsCiAgICAgICAgJ0NlaWwnLAogICAgICAgICdDaGVja051bWVyaWNzJywKICAgICAgICAnQ2hvbGVza3knLAogICAgICAgICdDbGlwQnlWYWx1ZScsCiAgICAgICAgJ0NvbGxlY3RpdmVQZXJtdXRlJywKICAgICAgICAnQ29tcGxleCcsCiAgICAgICAgJ0NvbXBsZXhBYnMnLAogICAgICAgICdDb25jYXQnLAogICAgICAgICdDb25jYXRPZmZzZXQnLAogICAgICAgICdDb25jYXRWMicsCiAgICAgICAgJ0NvbmonLAogICAgICAgICdDb25qdWdhdGVUcmFuc3Bvc2UnLAogICAgICAgICdDb25zdCcsCiAgICAgICAgJ0NvbnRyb2xUcmlnZ2VyJywKICAgICAgICAnQ29udjJEJywKICAgICAgICAnQ29udjJEQmFja3Byb3BGaWx0ZXInLAogICAgICAgICdDb252MkRCYWNrcHJvcElucHV0JywKICAgICAgICAnQ29udjNEJywKICAgICAgICAnQ29udjNEQmFja3Byb3BGaWx0ZXJWMicsCiAgICAgICAgJ0NvbnYzREJhY2twcm9wSW5wdXRWMicsCiAgICAgICAgJ0NvcycsCiAgICAgICAgJ0Nvc2gnLAogICAgICAgICdDcm9zcycsCiAgICAgICAgJ0Nyb3NzUmVwbGljYVN1bScsCiAgICAgICAgJ0N1bXByb2QnLAogICAgICAgICdDdW1zdW0nLAogICAgICAgICdEYXRhRm9ybWF0RGltTWFwJywKICAgICAgICAnRGF0YUZvcm1hdFZlY1Blcm11dGUnLAogICAgICAgICdEYXRhRm9ybWF0VmVjUGVybXV0ZScsCiAgICAgICAgJ0RlcHRoVG9TcGFjZScsCiAgICAgICAgJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZScsCiAgICAgICAgJ0RlcHRod2lzZUNvbnYyZE5hdGl2ZUJhY2twcm9wRmlsdGVyJywKICAgICAgICAnRGVwdGh3aXNlQ29udjJkTmF0aXZlQmFja3Byb3BJbnB1dCcsCiAgICAgICAgJ0RlcXVhbnRpemUnLAogICAgICAgICdEZXZpY2VJbmRleCcsCiAgICAgICAgJ0RpYWcnLAogICAgICAgICdEaWFnUGFydCcsCiAgICAgICAgJ0RpZ2FtbWEnLAogICAgICAgICdEaXYnLAogICAgICAgICdEaXZOb05hbicsCiAgICAgICAgJ0R5bmFtaWNTdGl0Y2gnLAogICAgICAgICdFaW5zdW0nLAogICAgICAgICdFbHUnLAogICAgICAgICdFbHVHcmFkJywKICAgICAgICAnRW1wdHknLAogICAgICAgICdFbXB0eVRlbnNvckxpc3QnLAogICAgICAgICdFbnN1cmVTaGFwZScsCiAgICAgICAgJ0VxdWFsJywKICAgICAgICAnRXJmJywKICAgICAgICAnRXJmYycsCiAgICAgICAgJ0VyZmludicsCiAgICAgICAgJ0V4cCcsCiAgICAgICAgJ0V4cGFuZERpbXMnLAogICAgICAgICdFeHBtMScsCiAgICAgICAgJ0V4dHJhY3RJbWFnZVBhdGNoZXMnLAogICAgICAgICdGRlQnLAogICAgICAgICdGRlQyRCcsCiAgICAgICAgJ0ZGVDNEJywKICAgICAgICAnRmFrZVBhcmFtJywKICAgICAgICAnRmFrZVF1YW50V2l0aE1pbk1heEFyZ3MnLAogICAgICAgICdGYWtlUXVhbnRXaXRoTWluTWF4QXJnc0dyYWRpZW50JywKICAgICAgICAnRmFrZVF1YW50V2l0aE1pbk1heFZhcnMnLAogICAgICAgICdGYWtlUXVhbnRXaXRoTWluTWF4VmFyc0dyYWRpZW50JywKICAgICAgICAnRmlsbCcsCiAgICAgICAgJ0Zsb29yJywKICAgICAgICAnRmxvb3JEaXYnLAogICAgICAgICdGbG9vck1vZCcsCiAgICAgICAgJ0Z1c2VkQmF0Y2hOb3JtJywKICAgICAgICAnRnVzZWRCYXRjaE5vcm1HcmFkJywKICAgICAgICAnRnVzZWRCYXRjaE5vcm1HcmFkVjInLAogICAgICAgICdGdXNlZEJhdGNoTm9ybUdyYWRWMycsCiAgICAgICAgJ0Z1c2VkQmF0Y2hOb3JtVjInLAogICAgICAgICdGdXNlZEJhdGNoTm9ybVYzJywKICAgICAgICAnR2F0aGVyJywKICAgICAgICAnR2F0aGVyTmQnLAogICAgICAgICdHYXRoZXJWMicsCiAgICAgICAgJ0dldEl0ZW0nLAogICAgICAgICdHcmVhdGVyJywKICAgICAgICAnR3JlYXRlckVxdWFsJywKICAgICAgICAnSFNWVG9SR0InLAogICAgICAgICdJRkZUJywKICAgICAgICAnSUZGVDJEJywKICAgICAgICAnSUZGVDNEJywKICAgICAgICAnSVJGRlQnLAogICAgICAgICdJUkZGVDJEJywKICAgICAgICAnSVJGRlQzRCcsCiAgICAgICAgJ0lkZW50aXR5JywKICAgICAgICAnSWRlbnRpdHlOJywKICAgICAgICAnSWYnLAogICAgICAgICdJZ2FtbWEnLAogICAgICAgICdJZ2FtbWFHcmFkQScsCiAgICAgICAgJ0lnYW1tYWMnLAogICAgICAgICdJbWFnJywKICAgICAgICAnSW5Ub3BLVjInLAogICAgICAgICdJbmZlZWREZXF1ZXVlJywKICAgICAgICAnSW5mZWVkRGVxdWV1ZVR1cGxlJywKICAgICAgICAnSW5wbGFjZUFkZCcsCiAgICAgICAgJ0lucGxhY2VVcGRhdGUnLAogICAgICAgICdJbnYnLAogICAgICAgICdJbnZlcnQnLAogICAgICAgICdJbnZlcnRQZXJtdXRhdGlvbicsCiAgICAgICAgJ0lzRmluaXRlJywKICAgICAgICAnSXNJbmYnLAogICAgICAgICdJc05hbicsCiAgICAgICAgJ0t0aE9yZGVyU3RhdGlzdGljJywKICAgICAgICAnTDJMb3NzJywKICAgICAgICAnTFJOJywKICAgICAgICAnTFJOR3JhZCcsCiAgICAgICAgJ0xlYWt5UmVsdScsCiAgICAgICAgJ0xlYWt5UmVsdUdyYWQnLAogICAgICAgICdMZWZ0U2hpZnQnLAogICAgICAgICdMZXNzJywKICAgICAgICAnTGVzc0VxdWFsJywKICAgICAgICAnTGdhbW1hJywKICAgICAgICAnTGluU3BhY2UnLAogICAgICAgICdMaXN0RGlmZicsCiAgICAgICAgJ0xvZycsCiAgICAgICAgJ0xvZzFwJywKICAgICAgICAnTG9nU29mdG1heCcsCiAgICAgICAgJ0xvZ2ljYWxBbmQnLAogICAgICAgICdMb2dpY2FsTm90JywKICAgICAgICAnTG9naWNhbE9yJywKICAgICAgICAnTG93ZXJCb3VuZCcsCiAgICAgICAgJ01ha2VVbmlxdWUnLAogICAgICAgICdNYXRNdWwnLAogICAgICAgICdNYXRyaXhCYW5kUGFydCcsCiAgICAgICAgJ01hdHJpeERpYWcnLAogICAgICAgICdNYXRyaXhEaWFnUGFydCcsCiAgICAgICAgJ01hdHJpeERpYWdQYXJ0VjInLAogICAgICAgICdNYXRyaXhEaWFnUGFydFYzJywKICAgICAgICAnTWF0cml4RGlhZ1YyJywKICAgICAgICAnTWF0cml4RGlhZ1YzJywKICAgICAgICAnTWF0cml4SW52ZXJzZScsCiAgICAgICAgJ01hdHJpeFNldERpYWcnLAogICAgICAgICdNYXRyaXhTZXREaWFnVjInLAogICAgICAgICdNYXRyaXhTZXREaWFnVjMnLAogICAgICAgICdNYXRyaXhTb2x2ZScsCiAgICAgICAgJ01hdHJpeFRyaWFuZ3VsYXJTb2x2ZScsCiAgICAgICAgJ01heCcsCiAgICAgICAgJ01heFBvb2wnLAogICAgICAgICdNYXhQb29sM0QnLAogICAgICAgICdNYXhQb29sM0RHcmFkJywKICAgICAgICAnTWF4UG9vbDNER3JhZEdyYWQnLAogICAgICAgICdNYXhQb29sR3JhZCcsCiAgICAgICAgJ01heFBvb2xHcmFkR3JhZCcsCiAgICAgICAgJ01heFBvb2xHcmFkR3JhZFYyJywKICAgICAgICAnTWF4UG9vbEdyYWRWMicsCiAgICAgICAgJ01heFBvb2xWMicsCiAgICAgICAgJ01heGltdW0nLAogICAgICAgICdNZWFuJywKICAgICAgICAnTWluJywKICAgICAgICAnTWluaW11bScsCiAgICAgICAgJ01pcnJvclBhZCcsCiAgICAgICAgJ01vZCcsCiAgICAgICAgJ011bCcsCiAgICAgICAgJ011bE5vTmFuJywKICAgICAgICAnTXVsdGlub21pYWwnLAogICAgICAgICdOZHRyaScsCiAgICAgICAgJ05lZycsCiAgICAgICAgJ05leHRBZnRlcicsCiAgICAgICAgJ05vT3AnLAogICAgICAgICdOb25NYXhTdXBwcmVzc2lvblY0JywKICAgICAgICAnTm90RXF1YWwnLAogICAgICAgICdPbmVIb3QnLAogICAgICAgICdPbmVzTGlrZScsCiAgICAgICAgJ091dGZlZWRFbnF1ZXVlJywKICAgICAgICAnT3V0ZmVlZEVucXVldWVUdXBsZScsCiAgICAgICAgJ1BhY2snLAogICAgICAgICdQYWQnLAogICAgICAgICdQYWRWMicsCiAgICAgICAgJ1BhcmFsbGVsRHluYW1pY1N0aXRjaCcsCiAgICAgICAgJ1BhcmFtZXRlcml6ZWRUcnVuY2F0ZWROb3JtYWwnLAogICAgICAgICdQYXJ0aXRpb25lZENhbGwnLAogICAgICAgICdQbGFjZWhvbGRlcldpdGhEZWZhdWx0JywKICAgICAgICAnUG9wdWxhdGlvbkNvdW50JywKICAgICAgICAnUG93JywKICAgICAgICAnUHJldmVudEdyYWRpZW50JywKICAgICAgICAnUHJvZCcsCiAgICAgICAgJ1FyJywKICAgICAgICAnUXVhbnRpemVBbmREZXF1YW50aXplVjInLAogICAgICAgICdRdWFudGl6ZUFuZERlcXVhbnRpemVWMycsCiAgICAgICAgJ1JGRlQnLAogICAgICAgICdSRkZUMkQnLAogICAgICAgICdSRkZUM0QnLAogICAgICAgICdSR0JUb0hTVicsCiAgICAgICAgJ1JhbmRvbUdhbW1hR3JhZCcsCiAgICAgICAgJ1JhbmRvbVNodWZmbGUnLAogICAgICAgICdSYW5kb21TdGFuZGFyZE5vcm1hbCcsCiAgICAgICAgJ1JhbmRvbVVuaWZvcm0nLAogICAgICAgICdSYW5kb21Vbmlmb3JtSW50JywKICAgICAgICAnUmFuZ2UnLAogICAgICAgICdSYW5rJywKICAgICAgICAnUmVhZFZhcmlhYmxlT3AnLAogICAgICAgICdSZWFsJywKICAgICAgICAnUmVhbERpdicsCiAgICAgICAgJ1JlY2lwcm9jYWwnLAogICAgICAgICdSZWNpcHJvY2FsR3JhZCcsCiAgICAgICAgJ1JlbHUnLAogICAgICAgICdSZWx1NicsCiAgICAgICAgJ1JlbHU2R3JhZCcsCiAgICAgICAgJ1JlbHVHcmFkJywKICAgICAgICAnUmVzaGFwZScsCiAgICAgICAgJ1Jlc2l6ZUJpbGluZWFyJywKICAgICAgICAnUmVzaXplQmlsaW5lYXJHcmFkJywKICAgICAgICAnUmVzaXplTmVhcmVzdE5laWdoYm9yJywKICAgICAgICAnUmVzaXplTmVhcmVzdE5laWdoYm9yR3JhZCcsCiAgICAgICAgJ1Jlc291cmNlQXBwbHlBZGFNYXgnLAogICAgICAgICdSZXNvdXJjZUFwcGx5QWRhZGVsdGEnLAogICAgICAgICdSZXNvdXJjZUFwcGx5QWRhZ3JhZCcsCiAgICAgICAgJ1Jlc291cmNlQXBwbHlBZGFncmFkREEnLAogICAgICAgICdSZXNvdXJjZUFwcGx5QWRhZ3JhZFYyJywKICAgICAgICAnUmVzb3VyY2VBcHBseUFkYW0nLAogICAgICAgICdSZXNvdXJjZUFwcGx5QWRkU2lnbicsCiAgICAgICAgJ1Jlc291cmNlQXBwbHlDZW50ZXJlZFJNU1Byb3AnLAogICAgICAgICdSZXNvdXJjZUFwcGx5RnRybCcsCiAgICAgICAgJ1Jlc291cmNlQXBwbHlGdHJsVjInLAogICAgICAgICdSZXNvdXJjZUFwcGx5R3JhZGllbnREZXNjZW50JywKICAgICAgICAnUmVzb3VyY2VBcHBseUtlcmFzTW9tZW50dW0nLAogICAgICAgICdSZXNvdXJjZUFwcGx5TW9tZW50dW0nLAogICAgICAgICdSZXNvdXJjZUFwcGx5UG93ZXJTaWduJywKICAgICAgICAnUmVzb3VyY2VBcHBseVByb3hpbWFsQWRhZ3JhZCcsCiAgICAgICAgJ1Jlc291cmNlQXBwbHlQcm94aW1hbEdyYWRpZW50RGVzY2VudCcsCiAgICAgICAgJ1Jlc291cmNlQXBwbHlSTVNQcm9wJywKICAgICAgICAnUmVzb3VyY2VHYXRoZXInLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJBZGQnLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJEaXYnLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJNYXgnLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJNaW4nLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJNdWwnLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJOZEFkZCcsCiAgICAgICAgJ1Jlc291cmNlU2NhdHRlck5kU3ViJywKICAgICAgICAnUmVzb3VyY2VTY2F0dGVyTmRVcGRhdGUnLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJTdWInLAogICAgICAgICdSZXNvdXJjZVNjYXR0ZXJVcGRhdGUnLAogICAgICAgICdSZXNvdXJjZVN0cmlkZWRTbGljZUFzc2lnbicsCiAgICAgICAgJ1JldmVyc2UnLAogICAgICAgICdSZXZlcnNlU2VxdWVuY2UnLAogICAgICAgICdSZXZlcnNlVjInLAogICAgICAgICdSaWdodFNoaWZ0JywKICAgICAgICAnUmludCcsCiAgICAgICAgJ1JvbGwnLAogICAgICAgICdSb3VuZCcsCiAgICAgICAgJ1JzcXJ0JywKICAgICAgICAnUnNxcnRHcmFkJywKICAgICAgICAnU2NhdHRlck5kJywKICAgICAgICAnU2VsZWN0JywKICAgICAgICAnU2VsZWN0VjInLAogICAgICAgICdTZWxmQWRqb2ludEVpZ1YyJywKICAgICAgICAnU2VsdScsCiAgICAgICAgJ1NlbHVHcmFkJywKICAgICAgICAnU2hhcGUnLAogICAgICAgICdTaGFwZU4nLAogICAgICAgICdTaWdtb2lkJywKICAgICAgICAnU2lnbW9pZEdyYWQnLAogICAgICAgICdTaWduJywKICAgICAgICAnU2luJywKICAgICAgICAnU2luaCcsCiAgICAgICAgJ1NpemUnLAogICAgICAgICdTbGljZScsCiAgICAgICAgJ1NuYXBzaG90JywKICAgICAgICAnU29mdG1heCcsCiAgICAgICAgJ1NvZnRtYXhDcm9zc0VudHJvcHlXaXRoTG9naXRzJywKICAgICAgICAnU29mdHBsdXMnLAogICAgICAgICdTb2Z0cGx1c0dyYWQnLAogICAgICAgICdTb2Z0c2lnbicsCiAgICAgICAgJ1NvZnRzaWduR3JhZCcsCiAgICAgICAgJ1NwYWNlVG9CYXRjaCcsCiAgICAgICAgJ1NwYWNlVG9CYXRjaE5EJywKICAgICAgICAnU3BhY2VUb0RlcHRoJywKICAgICAgICAnU3BhcnNlTWF0TXVsJywKICAgICAgICAnU3BhcnNlU29mdG1heENyb3NzRW50cm9weVdpdGhMb2dpdHMnLAogICAgICAgICdTcGFyc2VUb0RlbnNlJywKICAgICAgICAnU3BsaXQnLAogICAgICAgICdTcGxpdFYnLAogICAgICAgICdTcXJ0JywKICAgICAgICAnU3FydEdyYWQnLAogICAgICAgICdTcXVhcmUnLAogICAgICAgICdTcXVhcmVkRGlmZmVyZW5jZScsCiAgICAgICAgJ1NxdWVlemUnLAogICAgICAgICdTdGFja0Nsb3NlVjInLAogICAgICAgICdTdGFja1BvcFYyJywKICAgICAgICAnU3RhY2tQdXNoVjInLAogICAgICAgICdTdGFja1YyJywKICAgICAgICAnU3RhdGVmdWxQYXJ0aXRpb25lZENhbGwnLAogICAgICAgICdTdGF0ZWZ1bFN0YW5kYXJkTm9ybWFsVjInLAogICAgICAgICdTdGF0ZWZ1bFRydW5jYXRlZE5vcm1hbCcsCiAgICAgICAgJ1N0YXRlZnVsVW5pZm9ybScsCiAgICAgICAgJ1N0YXRlZnVsVW5pZm9ybUZ1bGxJbnQnLAogICAgICAgICdTdGF0ZWZ1bFVuaWZvcm1JbnQnLAogICAgICAgICdTdGF0ZWxlc3NDYXNlJywKICAgICAgICAnU3RhdGVsZXNzSWYnLAogICAgICAgICdTdGF0ZWxlc3NNdWx0aW5vbWlhbCcsCiAgICAgICAgJ1N0YXRlbGVzc1JhbmRvbU5vcm1hbCcsCiAgICAgICAgJ1N0YXRlbGVzc1JhbmRvbVVuaWZvcm0nLAogICAgICAgICdTdGF0ZWxlc3NSYW5kb21Vbmlmb3JtRnVsbEludCcsCiAgICAgICAgJ1N0YXRlbGVzc1JhbmRvbVVuaWZvcm1JbnQnLAogICAgICAgICdTdGF0ZWxlc3NUcnVuY2F0ZWROb3JtYWwnLAogICAgICAgICdTdGF0ZWxlc3NXaGlsZScsCiAgICAgICAgJ1N0b3BHcmFkaWVudCcsCiAgICAgICAgJ1N0cmlkZWRTbGljZScsCiAgICAgICAgJ1N0cmlkZWRTbGljZUdyYWQnLAogICAgICAgICdTdWInLAogICAgICAgICdTdW0nLAogICAgICAgICdTdmQnLAogICAgICAgICdTeW1ib2xpY0dyYWRpZW50JywKICAgICAgICAnVFBVRW1iZWRkaW5nQWN0aXZhdGlvbnMnLAogICAgICAgICdUYW4nLAogICAgICAgICdUYW5oJywKICAgICAgICAnVGFuaEdyYWQnLAogICAgICAgICdUZW5zb3JBcnJheUNsb3NlVjMnLAogICAgICAgICdUZW5zb3JBcnJheUNvbmNhdFYzJywKICAgICAgICAnVGVuc29yQXJyYXlHYXRoZXJWMycsCiAgICAgICAgJ1RlbnNvckFycmF5R3JhZFYzJywKICAgICAgICAnVGVuc29yQXJyYXlSZWFkVjMnLAogICAgICAgICdUZW5zb3JBcnJheVNjYXR0ZXJWMycsCiAgICAgICAgJ1RlbnNvckFycmF5U2l6ZVYzJywKICAgICAgICAnVGVuc29yQXJyYXlTcGxpdFYzJywKICAgICAgICAnVGVuc29yQXJyYXlWMycsCiAgICAgICAgJ1RlbnNvckFycmF5V3JpdGVWMycsCiAgICAgICAgJ1RlbnNvckxpc3RDb25jYXRWMicsCiAgICAgICAgJ1RlbnNvckxpc3RFbGVtZW50U2hhcGUnLAogICAgICAgICdUZW5zb3JMaXN0RnJvbVRlbnNvcicsCiAgICAgICAgJ1RlbnNvckxpc3RHYXRoZXInLAogICAgICAgICdUZW5zb3JMaXN0R2V0SXRlbScsCiAgICAgICAgJ1RlbnNvckxpc3RMZW5ndGgnLAogICAgICAgICdUZW5zb3JMaXN0UG9wQmFjaycsCiAgICAgICAgJ1RlbnNvckxpc3RQdXNoQmFjaycsCiAgICAgICAgJ1RlbnNvckxpc3RSZXNlcnZlJywKICAgICAgICAnVGVuc29yTGlzdFNldEl0ZW0nLAogICAgICAgICdUZW5zb3JMaXN0U3BsaXQnLAogICAgICAgICdUZW5zb3JMaXN0U3RhY2snLAogICAgICAgICdUZW5zb3JTY2F0dGVyQWRkJywKICAgICAgICAnVGVuc29yU2NhdHRlclN1YicsCiAgICAgICAgJ1RlbnNvclNjYXR0ZXJVcGRhdGUnLAogICAgICAgICdUaWxlJywKICAgICAgICAnVG9wS1VuaXF1ZScsCiAgICAgICAgJ1RvcEtWMicsCiAgICAgICAgJ1RvcEtXaXRoVW5pcXVlJywKICAgICAgICAnVHJhbnNwb3NlJywKICAgICAgICAnVHJpZGlhZ29uYWxTb2x2ZScsCiAgICAgICAgJ1RydW5jYXRlRGl2JywKICAgICAgICAnVHJ1bmNhdGVNb2QnLAogICAgICAgICdUcnVuY2F0ZWROb3JtYWwnLAogICAgICAgICdVbnBhY2snLAogICAgICAgICdVbnNvcnRlZFNlZ21lbnRNYXgnLAogICAgICAgICdVbnNvcnRlZFNlZ21lbnRNaW4nLAogICAgICAgICdVbnNvcnRlZFNlZ21lbnRQcm9kJywKICAgICAgICAnVW5zb3J0ZWRTZWdtZW50U3VtJywKICAgICAgICAnVXBwZXJCb3VuZCcsCiAgICAgICAgJ1ZhcklzSW5pdGlhbGl6ZWRPcCcsCiAgICAgICAgJ1ZhcmlhYmxlU2hhcGUnLAogICAgICAgICdXaGVyZScsCiAgICAgICAgJ1doaWxlJywKICAgICAgICAnWGRpdnknLAogICAgICAgICdYbGFCcm9hZGNhc3RIZWxwZXInLAogICAgICAgICdYbGFDb252JywKICAgICAgICAnWGxhRGVxdWFudGl6ZScsCiAgICAgICAgJ1hsYURvdCcsCiAgICAgICAgJ1hsYUR5bmFtaWNTbGljZScsCiAgICAgICAgJ1hsYUR5bmFtaWNVcGRhdGVTbGljZScsCiAgICAgICAgJ1hsYUVpbnN1bScsCiAgICAgICAgJ1hsYUdhdGhlcicsCiAgICAgICAgJ1hsYUhvc3RDb21wdXRlJywKICAgICAgICAnWGxhSWYnLAogICAgICAgICdYbGFLZXlWYWx1ZVNvcnQnLAogICAgICAgICdYbGFQYWQnLAogICAgICAgICdYbGFSZWN2JywKICAgICAgICAnWGxhUmVjdkZyb21Ib3N0JywKICAgICAgICAnWGxhUmVkdWNlJywKICAgICAgICAnWGxhUmVkdWNlV2luZG93JywKICAgICAgICAnWGxhUmVwbGljYUlkJywKICAgICAgICAnWGxhU2NhdHRlcicsCiAgICAgICAgJ1hsYVNlbGVjdEFuZFNjYXR0ZXInLAogICAgICAgICdYbGFTZWxmQWRqb2ludEVpZycsCiAgICAgICAgJ1hsYVNlbmQnLAogICAgICAgICdYbGFTZW5kVG9Ib3N0JywKICAgICAgICAnWGxhU2hhcmRpbmcnLAogICAgICAgICdYbGFTb3J0JywKICAgICAgICAnWGxhU3BtZEZ1bGxUb1NoYXJkU2hhcGUnLAogICAgICAgICdYbGFTcG1kU2hhcmRUb0Z1bGxTaGFwZScsCiAgICAgICAgJ1hsYVN2ZCcsCiAgICAgICAgJ1hsYVdoaWxlJywKICAgICAgICAnWGxvZzFweScsCiAgICAgICAgJ1hsb2d5JywKICAgICAgICAnWmVyb3NMaWtlJywKICAgICAgICAvLyBPcHMgYmVsb3cgYXJlIG1hbnVhbGx5IHdoaXRlbGlzdGVkIGFuZCBzaG91bGQgbm90IGJlIGV2YWx1YXRlZCBmb3IKICAgICAgICAvLyBjb21wYXRpYmlsaXR5IGZvciB2YXJpb3VzIHJlYXNvbnMuCiAgICAgICAgLy8gQ29udHJvbCBmbG93IG9wcy4KICAgICAgICAnRW50ZXInLAogICAgICAgICdFeGl0JywKICAgICAgICAnTG9vcENvbmQnLAogICAgICAgICdNZXJnZScsCiAgICAgICAgJ05leHRJdGVyYXRpb24nLAogICAgICAgICdTd2l0Y2gnLAogICAgICAgIC8vIE9wcyBiZWxvdyBhcmUgaW5zZXJ0ZWQgYnkgdGhlIGNvbXBpbGVyLgogICAgICAgICdfQXJnJywKICAgICAgICAnX0FycmF5VG9MaXN0JywKICAgICAgICAnX0Z1c2VkQmF0Y2hOb3JtRXgnLAogICAgICAgICdfTGlzdFRvQXJyYXknLAogICAgICAgICdfUGFyYWxsZWxDb25jYXRVcGRhdGUnLAogICAgICAgICdfUmVjdlRQVUVtYmVkZGluZ0FjdGl2YXRpb25zJywKICAgICAgICAnX1JlY3ZUUFVFbWJlZGRpbmdEZWR1cGxpY2F0aW9uRGF0YScsCiAgICAgICAgJ19SZXR2YWwnLAogICAgICAgICdfU2VuZFRQVUVtYmVkZGluZ0dyYWRpZW50cycsCiAgICAgICAgJ19UUFVDb21waWxlJywKICAgICAgICAnX1RQVUV4ZWN1dGUnLAogICAgICAgICdfVW5hcnlPcHNDb21wb3NpdGlvbicsCiAgICAgICAgLy8gRGlzdHJpYnV0ZWQgVFBVIG9wcy4KICAgICAgICAnVFBVQ29tcGlsYXRpb25SZXN1bHQnLAogICAgICAgICdUUFVSZXBsaWNhdGVkSW5wdXQnLAogICAgICAgICdUUFVSZXBsaWNhdGVkT3V0cHV0JywKICAgICAgICAnVFBVUmVwbGljYXRlTWV0YWRhdGEnLAogICAgICAgIC8vIENoZWNrcG9pbnRpbmcgb3BzLgogICAgICAgICdNZXJnZVYyQ2hlY2twb2ludHMnLAogICAgICAgICdSZXN0b3JlVjInLAogICAgICAgICdTYXZlVjInLAogICAgICAgIC8vIE1pc2NlbGxhbmVvdXMgQ1BVIG9wcy4KICAgICAgICAnQWJvcnQnLAogICAgICAgICdBc3NlcnQnLAogICAgICAgICdBc3NpZ24nLAogICAgICAgICdQbGFjZWhvbGRlcicsCiAgICAgICAgJ1BsYWNlaG9sZGVyVjInLAogICAgICAgICdTaGFyZGVkRmlsZW5hbWUnLAogICAgICAgICdTdHJpbmdKb2luJywKICAgICAgICAnVmFyaWFibGUnLAogICAgICAgICdWYXJpYWJsZVYyJywKICAgICAgICAnVmFySGFuZGxlT3AnLAogICAgICAgIC8vIFN1bW1hcnkgb3BzLgogICAgICAgICdBdWRpb1N1bW1hcnknLAogICAgICAgICdBdWRpb1N1bW1hcnlWMicsCiAgICAgICAgJ0RlYnVnTnVtZXJpY1N1bW1hcnknLAogICAgICAgICdIaXN0b2dyYW1TdW1tYXJ5JywKICAgICAgICAnSW1hZ2VTdW1tYXJ5JywKICAgICAgICAnTWVyZ2VTdW1tYXJ5JywKICAgICAgICAnU2NhbGFyU3VtbWFyeScsCiAgICAgICAgJ1N0YXRzQWdncmVnYXRvclN1bW1hcnknLAogICAgXTsKICAgIGZ1bmN0aW9uIGNoZWNrT3BzRm9yQ29tcGF0aWJpbGl0eShncmFwaCwgcHJvdmlkZXIpIHsKICAgICAgICBpZiAocHJvdmlkZXIgPT09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb21wYXRpYmlsaXR5IHByb3ZpZGVyIHJlcXVpcmVkLCBidXQgZ290OiAnICsgcHJvdmlkZXIpOwogICAgICAgIH0KICAgICAgICBsb2Rhc2guZWFjaChncmFwaC5ub2RlcywgKG5vZGUpID0+IHsKICAgICAgICAgICAgbm9kZS5jb21wYXRpYmxlID0gcHJvdmlkZXIub3BWYWxpZChub2RlKTsKICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZS5pbkVtYmVkZGluZ3MsIChub2RlKSA9PiB7CiAgICAgICAgICAgICAgICBub2RlLmNvbXBhdGlibGUgPSBwcm92aWRlci5vcFZhbGlkKG5vZGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbG9kYXNoLmVhY2gobm9kZS5vdXRFbWJlZGRpbmdzLCAobm9kZSkgPT4gewogICAgICAgICAgICAgICAgbm9kZS5jb21wYXRpYmxlID0gcHJvdmlkZXIub3BWYWxpZChub2RlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VWYWx1ZSh2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA9PT0gJ3RydWUnKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPT09ICdmYWxzZScpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBsZXQgZmlyc3RDaGFyID0gdmFsdWVbMF07CiAgICAgICAgaWYgKGZpcnN0Q2hhciA9PT0gJyInKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5zdWJzdHJpbmcoMSwgdmFsdWUubGVuZ3RoIC0gMSk7CiAgICAgICAgfQogICAgICAgIGxldCBudW0gPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICByZXR1cm4gaXNOYU4obnVtKSA/IHZhbHVlIDogbnVtOwogICAgfQogICAgLyoqCiAgICAgKiBGZXRjaGVzIGEgdGV4dCBmaWxlIGFuZCByZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgcmVzdWx0LgogICAgICovCiAgICBmdW5jdGlvbiBmZXRjaFBiVHh0KGZpbGVwYXRoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHsKICAgICAgICAgICAgZmV0Y2goZmlsZXBhdGgpLnRoZW4oKHJlcykgPT4gewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggZG9lcyBub3QgcmVqZWN0IGZvciA0MDArLgogICAgICAgICAgICAgICAgaWYgKHJlcy5vaykgewogICAgICAgICAgICAgICAgICAgIHJlcy5hcnJheUJ1ZmZlcigpLnRoZW4ocmVzb2x2ZSwgcmVqZWN0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJlcy50ZXh0KCkudGhlbihyZWplY3QsIHJlamVjdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBGZXRjaGVzIHRoZSBtZXRhZGF0YSBmaWxlLCBwYXJzZXMgaXQgYW5kIHJldHVybnMgYSBwcm9taXNlIG9mIHRoZSByZXN1bHQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoQW5kUGFyc2VNZXRhZGF0YShwYXRoLCB0cmFja2VyKSB7CiAgICAgICAgcmV0dXJuIHJ1blRhc2soJ1JlYWRpbmcgbWV0YWRhdGEgcGJ0eHQnLCA0MCwgKCkgPT4gewogICAgICAgICAgICBpZiAocGF0aCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmZXRjaFBiVHh0KHBhdGgpOwogICAgICAgIH0sIHRyYWNrZXIpCiAgICAgICAgICAgIC50aGVuKChhcnJheUJ1ZmZlcikgPT4gewogICAgICAgICAgICByZXR1cm4gcnVuQXN5bmNQcm9taXNlVGFzaygnUGFyc2luZyBtZXRhZGF0YS5wYnR4dCcsIDYwLCAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlCdWZmZXIgIT0gbnVsbAogICAgICAgICAgICAgICAgICAgID8gcGFyc2VTdGF0c1BiVHh0KGFycmF5QnVmZmVyKQogICAgICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKG51bGwpOwogICAgICAgICAgICB9LCB0cmFja2VyKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogRmV0Y2hlcyB0aGUgZ3JhcGggZmlsZSwgcGFyc2VzIGl0IGFuZCByZXR1cm5zIGEgcHJvbWlzZSBvZiB0aGUgcmVzdWx0LiBUaGUKICAgICAqIHJlc3VsdCB3aWxsIGJlIHVuZGVmaW5lZCBpZiB0aGUgZ3JhcGggaXMgZW1wdHkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZldGNoQW5kUGFyc2VHcmFwaERhdGEocGF0aCwgcGJUeHRGaWxlLCB0cmFja2VyKSB7CiAgICAgICAgcmV0dXJuIHJ1bkFzeW5jUHJvbWlzZVRhc2soJ1JlYWRpbmcgZ3JhcGggcGJ0eHQnLCA0MCwgKCkgPT4gewogICAgICAgICAgICBpZiAocGJUeHRGaWxlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIGxldCBmaWxlUmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLm9ubG9hZCA9ICgpID0+IHJlc29sdmUoZmlsZVJlYWRlci5yZXN1bHQpOwogICAgICAgICAgICAgICAgICAgIGZpbGVSZWFkZXIub25lcnJvciA9ICgpID0+IHJlamVjdChmaWxlUmVhZGVyLmVycm9yKTsKICAgICAgICAgICAgICAgICAgICBmaWxlUmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKHBiVHh0RmlsZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBmZXRjaFBiVHh0KHBhdGgpOwogICAgICAgICAgICB9CiAgICAgICAgfSwgdHJhY2tlcikKICAgICAgICAgICAgLnRoZW4oKGFycmF5QnVmZmVyKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBydW5Bc3luY1Byb21pc2VUYXNrKCdQYXJzaW5nIGdyYXBoLnBidHh0JywgNjAsICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBwYXJzZUdyYXBoUGJUeHQoYXJyYXlCdWZmZXIpOwogICAgICAgICAgICB9LCB0cmFja2VyKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2UgYSBmaWxlIG9iamVjdCBpbiBhIHN0cmVhbWluZyBmYXNoaW9uIGxpbmUgYnkgbGluZSAob3IgY3VzdG9tIGRlbGltKS4KICAgICAqIENhbiBoYW5kbGUgdmVyeSBsYXJnZSBmaWxlcy4KICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgZmlsZSBvYmplY3QgYXMgYW4gYXJyYXkgYnVmZmVyLgogICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayBjYWxsZWQgb24gZWFjaCBsaW5lCiAgICAgKiBAcGFyYW0gY2h1bmtTaXplIFRoZSBzaXplIG9mIGVhY2ggcmVhZCBjaHVuay4gKG9wdGlvbmFsKQogICAgICogQHBhcmFtIGRlbGltIFRoZSBkZWxpbWl0ZXIgdXNlZCB0byBzcGxpdCBhIGxpbmUuIChvcHRpb25hbCkKICAgICAqIEByZXR1cm5zIFByb21pc2UgdGhhdCByZXNvbHZlcyB3aXRoIHRydWUgd2hlbiBpdCBpcyBmaW5pc2hlZC4KICAgICAqLwogICAgZnVuY3Rpb24gc3RyZWFtUGFyc2UoYXJyYXlCdWZmZXIsIGNhbGxiYWNrLCBjaHVua1NpemUgPSAxMDAwMDAwLCBkZWxpbSA9ICdcbicpIHsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkgewogICAgICAgICAgICBmdW5jdGlvbiByZWFkQ2h1bmsob2xkRGF0YSwgbmV3RGF0YSwgb2Zmc2V0KSB7CiAgICAgICAgICAgICAgICBjb25zdCBkb25lUmVhZGluZyA9IG9mZnNldCA+PSBhcnJheUJ1ZmZlci5ieXRlTGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBuZXdEYXRhLnNwbGl0KGRlbGltKTsKICAgICAgICAgICAgICAgIHBhcnRzWzBdID0gb2xkRGF0YSArIHBhcnRzWzBdOwogICAgICAgICAgICAgICAgLy8gVGhlIGxhc3QgcGFydCBtYXkgYmUgcGFydCBvZiBhIGxvbmdlciBzdHJpbmcgdGhhdCBnb3QgY3V0IG9mZgogICAgICAgICAgICAgICAgLy8gZHVlIHRvIHRoZSBjaHVua2luZy4KICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmRlciA9IGRvbmVSZWFkaW5nID8gJycgOiBwYXJ0cy5wb3AoKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IHBhcnQgb2YgcGFydHMpIHsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhwYXJ0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRvbmVSZWFkaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Q2h1bmsgPSBuZXcgQmxvYihbCiAgICAgICAgICAgICAgICAgICAgYXJyYXlCdWZmZXIuc2xpY2Uob2Zmc2V0LCBvZmZzZXQgKyBjaHVua1NpemUpLAogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgICAgICBjb25zdCBmaWxlID0gbmV3IEZpbGVSZWFkZXIoKTsKICAgICAgICAgICAgICAgIGZpbGUub25sb2FkID0gZnVuY3Rpb24gKGUpIHsKICAgICAgICAgICAgICAgICAgICByZWFkQ2h1bmsocmVtYWluZGVyLCBlLnRhcmdldC5yZXN1bHQsIG9mZnNldCArIGNodW5rU2l6ZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgZmlsZS5yZWFkQXNUZXh0KG5leHRDaHVuayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVhZENodW5rKCcnLCAnJywgMCk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIFNpbmNlIHByb3RvLXR4dCBkb2Vzbid0IGV4cGxpY2l0bHkgc2F5IHdoZXRoZXIgYW4gYXR0cmlidXRlIGlzIHJlcGVhdGVkCiAgICAgKiAoYW4gYXJyYXkpIG9yIG5vdCwgd2Uga2VlcCBhIGhhcmQtY29kZWQgbGlzdCBvZiBhdHRyaWJ1dGVzIHRoYXQgYXJlIGtub3duCiAgICAgKiB0byBiZSByZXBlYXRlZC4gVGhpcyBsaXN0IGlzIHVzZWQgaW4gcGFyc2luZyB0aW1lIHRvIGNvbnZlcnQgcmVwZWF0ZWQKICAgICAqIGF0dHJpYnV0ZXMgaW50byBhcnJheXMgZXZlbiB3aGVuIHRoZSBhdHRyaWJ1dGUgb25seSBzaG93cyB1cCBvbmNlIGluIHRoZQogICAgICogb2JqZWN0LgogICAgICogUmVwZWF0ZWQgZmllbGRzIGhhdmUgdG8gYmUgaW4gc3luYyB3aXRoIGdyYXBoLnByb3RvIGFuZCBhbGwgb2YgaXRzCiAgICAgKiBkZXBlbmRlbmNpZXMuCiAgICAgKiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUvZnJhbWV3b3JrL2dyYXBoLnByb3RvCiAgICAgKi8KICAgIGNvbnN0IEdSQVBIX1JFUEVBVEVEX0ZJRUxEUyA9IHsKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbic6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYnOiB0cnVlLAogICAgICAgICdsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmlucHV0JzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyJzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuYic6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LmYnOiB0cnVlLAogICAgICAgICdsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5mdW5jJzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLmxpc3QuaSc6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnMnOiB0cnVlLAogICAgICAgICdsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUubGlzdC5zaGFwZSc6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnNoYXBlLmRpbSc6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnRlbnNvcic6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkuZnVuY3Rpb24ubm9kZV9kZWYuYXR0ci52YWx1ZS5saXN0LnR5cGUnOiB0cnVlLAogICAgICAgICdsaWJyYXJ5LmZ1bmN0aW9uLm5vZGVfZGVmLmF0dHIudmFsdWUuc2hhcGUuZGltJzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci5zdHJpbmdfdmFsJzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5ub2RlX2RlZi5hdHRyLnZhbHVlLnRlbnNvci50ZW5zb3Jfc2hhcGUuZGltJzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUuaW5wdXRfYXJnJzogdHJ1ZSwKICAgICAgICAnbGlicmFyeS5mdW5jdGlvbi5zaWduYXR1cmUub3V0cHV0X2FyZyc6IHRydWUsCiAgICAgICAgJ2xpYnJhcnkudmVyc2lvbnMnOiB0cnVlLAogICAgICAgIG5vZGU6IHRydWUsCiAgICAgICAgJ25vZGUuaW5wdXQnOiB0cnVlLAogICAgICAgICdub2RlLmF0dHInOiB0cnVlLAogICAgICAgICdub2RlLmF0dHIudmFsdWUubGlzdC5iJzogdHJ1ZSwKICAgICAgICAnbm9kZS5hdHRyLnZhbHVlLmxpc3QuZic6IHRydWUsCiAgICAgICAgJ25vZGUuYXR0ci52YWx1ZS5saXN0LmZ1bmMnOiB0cnVlLAogICAgICAgICdub2RlLmF0dHIudmFsdWUubGlzdC5pJzogdHJ1ZSwKICAgICAgICAnbm9kZS5hdHRyLnZhbHVlLmxpc3Qucyc6IHRydWUsCiAgICAgICAgJ25vZGUuYXR0ci52YWx1ZS5saXN0LnNoYXBlJzogdHJ1ZSwKICAgICAgICAnbm9kZS5hdHRyLnZhbHVlLmxpc3Quc2hhcGUuZGltJzogdHJ1ZSwKICAgICAgICAnbm9kZS5hdHRyLnZhbHVlLmxpc3QudGVuc29yJzogdHJ1ZSwKICAgICAgICAnbm9kZS5hdHRyLnZhbHVlLmxpc3QudHlwZSc6IHRydWUsCiAgICAgICAgJ25vZGUuYXR0ci52YWx1ZS5zaGFwZS5kaW0nOiB0cnVlLAogICAgICAgICdub2RlLmF0dHIudmFsdWUudGVuc29yLnN0cmluZ192YWwnOiB0cnVlLAogICAgICAgICdub2RlLmF0dHIudmFsdWUudGVuc29yLnRlbnNvcl9zaGFwZS5kaW0nOiB0cnVlLAogICAgfTsKICAgIGNvbnN0IE1FVEFEQVRBX1JFUEVBVEVEX0ZJRUxEUyA9IHsKICAgICAgICAnc3RlcF9zdGF0cy5kZXZfc3RhdHMnOiB0cnVlLAogICAgICAgICdzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzJzogdHJ1ZSwKICAgICAgICAnc3RlcF9zdGF0cy5kZXZfc3RhdHMubm9kZV9zdGF0cy5vdXRwdXQnOiB0cnVlLAogICAgICAgICdzdGVwX3N0YXRzLmRldl9zdGF0cy5ub2RlX3N0YXRzLm1lbW9yeSc6IHRydWUsCiAgICAgICAgJ3N0ZXBfc3RhdHMuZGV2X3N0YXRzLm5vZGVfc3RhdHMub3V0cHV0LnRlbnNvcl9kZXNjcmlwdGlvbi5zaGFwZS5kaW0nOiB0cnVlLAogICAgfTsKICAgIC8qKgogICAgICogUGFyc2VzIGFuIEFycmF5QnVmZmVyIG9mIGEgcHJvdG8gdHh0IGZpbGUgaW50byBhIHJhdyBHcmFwaCBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlR3JhcGhQYlR4dChpbnB1dCkgewogICAgICAgIHJldHVybiBwYXJzZVBidHh0RmlsZShpbnB1dCwgR1JBUEhfUkVQRUFURURfRklFTERTKTsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2VzIGFuIEFycmF5QnVmZmVyIG9mIGEgcHJvdG8gdHh0IGZpbGUgaW50byBhIFN0ZXBTdGF0cyBvYmplY3QuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlU3RhdHNQYlR4dChpbnB1dCkgewogICAgICAgIHJldHVybiBwYXJzZVBidHh0RmlsZShpbnB1dCwgTUVUQURBVEFfUkVQRUFURURfRklFTERTKS50aGVuKChvYmopID0+IG9ialsnc3RlcF9zdGF0cyddKTsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2VzIGEgQXJyYXlCdWZmZXIgb2YgYSBwcm90byB0eHQgZmlsZSBpbnRvIGphdmFzY3JpcHQgb2JqZWN0LgogICAgICoKICAgICAqIEBwYXJhbSBpbnB1dCBUaGUgQXJyYXlCdWZmZXIgb3IgZmlsZSBvYmplY3QgaW1wbGVtZW50aW5nIHNsaWNlLgogICAgICogQHBhcmFtIHJlcGVhdGVkRmllbGRzIE1hcCAoU2V0KSBvZiBhbGwgdGhlIHJlcGVhdGVkIGZpZWxkcywgc2luY2UgeW91IGNhbid0CiAgICAgKiAgIHRlbGwgZGlyZWN0bHkgZnJvbSB0aGUgcGJ0eHQgaWYgYSBmaWVsZCBpcyByZXBlYXRlZCBvciBub3QuCiAgICAgKiBAcmV0dXJucyBUaGUgcGFyc2VkIG9iamVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VQYnR4dEZpbGUoaW5wdXQsIHJlcGVhdGVkRmllbGRzKSB7CiAgICAgICAgbGV0IG91dHB1dCA9IHt9OwogICAgICAgIGxldCBzdGFjayA9IFtdOwogICAgICAgIGxldCBwYXRoID0gW107CiAgICAgICAgbGV0IGN1cnJlbnQgPSBvdXRwdXQ7CiAgICAgICAgZnVuY3Rpb24gc3BsaXROYW1lQW5kVmFsdWVJbkF0dHJpYnV0ZShsaW5lKSB7CiAgICAgICAgICAgIGxldCBjb2xvbkluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGxldCBuYW1lID0gbGluZS5zdWJzdHJpbmcoMCwgY29sb25JbmRleCkudHJpbSgpOwogICAgICAgICAgICBsZXQgdmFsdWUgPSBwYXJzZVZhbHVlKGxpbmUuc3Vic3RyaW5nKGNvbG9uSW5kZXggKyAyKS50cmltKCkpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIHZhbHVlLCBnaXZlbiB0aGUgYXR0cmlidXRlIG5hbWUgYW5kIHRoZSBob3N0IG9iamVjdC4gSWYgdGhlCiAgICAgICAgICogYXR0cmlidXRlIGFscmVhZHkgZXhpc3RzLCBidXQgaXMgbm90IGFuIGFycmF5LCBpdCB3aWxsIGNvbnZlcnQgaXQgdG8gYW4KICAgICAgICAgKiBhcnJheSBvZiB2YWx1ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gb2JqIFRoZSBob3N0IG9iamVjdCB0aGF0IGhvbGRzIHRoZSBhdHRyaWJ1dGUuCiAgICAgICAgICogQHBhcmFtIG5hbWUgVGhlIGF0dHJpYnV0ZSBuYW1lIChrZXkpLgogICAgICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgYXR0cmlidXRlIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlkZW50aWZpZXMgdGhlIGF0dHJpYnV0ZS4gVXNlZCB0byBjaGVjayBpZgogICAgICAgICAqICAgICBhbiBhdHRyaWJ1dGUgaXMgYW4gYXJyYXkgb3Igbm90LgogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGFkZEF0dHJpYnV0ZShvYmosIG5hbWUsIHZhbHVlLCBwYXRoKSB7CiAgICAgICAgICAgIC8vIFdlIHRyZWF0ICdub2RlJyBzcGVjaWFsbHkgc2luY2UgaXQgaXMgZG9uZSBzbyBvZnRlbi4KICAgICAgICAgICAgbGV0IGV4aXN0aW5nVmFsdWUgPSBvYmpbbmFtZV07CiAgICAgICAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09IG51bGwpIHsKICAgICAgICAgICAgICAgIG9ialtuYW1lXSA9IHBhdGguam9pbignLicpIGluIHJlcGVhdGVkRmllbGRzID8gW3ZhbHVlXSA6IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZXhpc3RpbmdWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIGV4aXN0aW5nVmFsdWUucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBvYmpbbmFtZV0gPSBbZXhpc3RpbmdWYWx1ZSwgdmFsdWVdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBmaWxlIGEgbGluZSBhdCBhIHRpbWUuCiAgICAgICAgcmV0dXJuIHN0cmVhbVBhcnNlKGlucHV0LCBmdW5jdGlvbiAobGluZSkgewogICAgICAgICAgICBpZiAoIWxpbmUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaW5lID0gbGluZS50cmltKCk7CiAgICAgICAgICAgIHN3aXRjaCAobGluZVtsaW5lLmxlbmd0aCAtIDFdKSB7CiAgICAgICAgICAgICAgICBjYXNlICd7JzogLy8gY3JlYXRlIG5ldyBvYmplY3QKICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGxpbmUuc3Vic3RyaW5nKDAsIGxpbmUubGVuZ3RoIC0gMikudHJpbSgpOwogICAgICAgICAgICAgICAgICAgIGxldCBuZXdWYWx1ZSA9IHt9OwogICAgICAgICAgICAgICAgICAgIHN0YWNrLnB1c2goY3VycmVudCk7CiAgICAgICAgICAgICAgICAgICAgcGF0aC5wdXNoKG5hbWUpOwogICAgICAgICAgICAgICAgICAgIGFkZEF0dHJpYnV0ZShjdXJyZW50LCBuYW1lLCBuZXdWYWx1ZSwgcGF0aCk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnfSc6CiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IHN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgICAgIHBhdGgucG9wKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGxldCB4ID0gc3BsaXROYW1lQW5kVmFsdWVJbkF0dHJpYnV0ZShsaW5lKTsKICAgICAgICAgICAgICAgICAgICBhZGRBdHRyaWJ1dGUoY3VycmVudCwgeC5uYW1lLCB4LnZhbHVlLCBwYXRoLmNvbmNhdCh4Lm5hbWUpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0pLnRoZW4oZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gb3V0cHV0OwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgodHJhY2tlciwgcmVtb3RlUGF0aCwgcGJUeHRGaWxlLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIgPSBuZXcgVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyKCksIGhpZXJhcmNoeVBhcmFtcyA9IERlZmF1bHRIaWVyYXJjaHlQYXJhbXMpIHsKICAgICAgICBjb25zdCBkYXRhVHJhY2tlciA9IGdldFN1YnRhc2tUcmFja2VyKHRyYWNrZXIsIDMwLCAnRGF0YScpOwogICAgICAgIGNvbnN0IGdyYXBoVHJhY2tlciA9IGdldFN1YnRhc2tUcmFja2VyKHRyYWNrZXIsIDIwLCAnR3JhcGgnKTsKICAgICAgICBjb25zdCBoaWVyYXJjaHlUcmFja2VyID0gZ2V0U3VidGFza1RyYWNrZXIodHJhY2tlciwgNTAsICdOYW1lc3BhY2UgaGllcmFyY2h5Jyk7CiAgICAgICAgcmV0dXJuIGZldGNoQW5kUGFyc2VHcmFwaERhdGEocmVtb3RlUGF0aCwgcGJUeHRGaWxlLCBkYXRhVHJhY2tlcikKICAgICAgICAgICAgLnRoZW4oZnVuY3Rpb24gKGdyYXBoKSB7CiAgICAgICAgICAgIGlmICghZ3JhcGgubm9kZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgZ3JhcGggaXMgZW1wdHkuIFRoaXMgY2FuIGhhcHBlbiB3aGVuICcgKwogICAgICAgICAgICAgICAgICAgICdUZW5zb3JGbG93IGNvdWxkIG5vdCB0cmFjZSBhbnkgZ3JhcGguIFBsZWFzZSByZWZlciB0byAnICsKICAgICAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5NjEgZm9yIG1vcmUgJyArCiAgICAgICAgICAgICAgICAgICAgJ2luZm9ybWF0aW9uLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBidWlsZChncmFwaCwgRGVmYXVsdEJ1aWxkUGFyYW1zLCBncmFwaFRyYWNrZXIpOwogICAgICAgIH0sICgpID0+IHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNYWxmb3JtZWQgR3JhcGhEZWYuIFRoaXMgY2FuIHNvbWV0aW1lcyBiZSBjYXVzZWQgYnkgJyArCiAgICAgICAgICAgICAgICAnYSBiYWQgbmV0d29yayBjb25uZWN0aW9uIG9yIGRpZmZpY3VsdHkgcmVjb25jaWxpbmcgbXVsdGlwbGUgJyArCiAgICAgICAgICAgICAgICAnR3JhcGhEZWZzOyBmb3IgdGhlIGxhdHRlciBjYXNlLCBwbGVhc2UgcmVmZXIgdG8gJyArCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzE5MjkuJyk7CiAgICAgICAgfSkKICAgICAgICAgICAgLnRoZW4oKGdyYXBoKSA9PiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgIC8vIFBvcHVsYXRlIGNvbXBhdGliaWxlIGZpZWxkIG9mIE9wTm9kZSBiYXNlZCBvbiB3aGl0ZWxpc3QKICAgICAgICAgICAgY2hlY2tPcHNGb3JDb21wYXRpYmlsaXR5KGdyYXBoLCBjb21wYXRpYmlsaXR5UHJvdmlkZXIpOwogICAgICAgICAgICBjb25zdCBncmFwaEhpZXJhcmNoeSA9IHlpZWxkIGJ1aWxkJDEoZ3JhcGgsIGhpZXJhcmNoeVBhcmFtcywgaGllcmFyY2h5VHJhY2tlcik7CiAgICAgICAgICAgIHJldHVybiB7IGdyYXBoLCBncmFwaEhpZXJhcmNoeSB9OwogICAgICAgIH0pKQogICAgICAgICAgICAuY2F0Y2goKGUpID0+IHsKICAgICAgICAgICAgLy8gR2VuZXJpYyBlcnJvciBjYXRjaCwgZm9yIGVycm9ycyB0aGF0IGhhcHBlbmVkIG91dHNpZGUKICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzIHRhc2tzLgogICAgICAgICAgICBjb25zdCBtc2cgPSBgR3JhcGggdmlzdWFsaXphdGlvbiBmYWlsZWQuXG5cbiR7ZX1gOwogICAgICAgICAgICB0cmFja2VyLnJlcG9ydEVycm9yKG1zZywgZSk7CiAgICAgICAgICAgIC8vIERvbid0IHN3YWxsb3cgdGhlIGVycm9yLgogICAgICAgICAgICB0aHJvdyBlOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBEYXRhIGxvYWRlciBmb3IgdGYtZ3JhcGgtZGFzaGJvYXJkLgogICAgICoKICAgICAqIFRoZSBsb2FkZXIgbG9hZHMgb3AgZ3JhcGgsIGNvbmNlcHR1YWwgZ3JhcGhzLCBhbmQgUnVuTWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoCiAgICAgKiBhbiBvcCBncmFwaCB3aGljaCBpcyB0aGUgbWFqb3IgZGlmZmVyZW5jZSBmcm9tIHRoZSB0Zi1ncmFwaC1sb2FkZXIgd2hpY2ggaXMKICAgICAqIG9ubHkgY2FwYWJsZSBvZiBsb2FkaW5nIGFuIG9wIGdyYXBoLiBBbm90aGVyIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgbG9hZGVyCiAgICAgKiB0YWtlcyBgc2VsZWN0aW9uYCBmcm9tIHRoZSB0Zi1ncmFwaC1jb250cm9scyBhcyBhbiBpbnB1dCBhcyBvcHBvc2VkIHRvIFVSTAogICAgICogcGF0aCBvZiBhbiBkYXRhIGVuZHBvaW50LgogICAgICovCiAgICBsZXQgVGZHcmFwaERhc2hib2FyZExvYWRlciA9IGNsYXNzIFRmR3JhcGhEYXNoYm9hcmRMb2FkZXIgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5jb21wYXRpYmlsaXR5UHJvdmlkZXIgPSBuZXcgVHB1Q29tcGF0aWJpbGl0eVByb3ZpZGVyKCk7CiAgICAgICAgICAgIHRoaXMuaGllcmFyY2h5UGFyYW1zID0gRGVmYXVsdEhpZXJhcmNoeVBhcmFtczsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBfc2VsZWN0aW9uQ2hhbmdlZCgpIHsKICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGNhbiBjaGFuZ2UgYSBsb3Qgd2l0aGluIGEgbWljcm90YXNrLgogICAgICAgICAgICAvLyBEb24ndCBmZXRjaCB0b28gbXVjaCB0b28gZmFzdCBhbmQgaW50cm9kdWNlIHJhY2UgY29uZGl0aW9uLgogICAgICAgICAgICB0aGlzLmRlYm91bmNlKCdzZWxlY3Rpb25jaGFuZ2UnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9sb2FkKHRoaXMuc2VsZWN0aW9uKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9sb2FkKHNlbGVjdGlvbikgewogICAgICAgICAgICBjb25zdCB7IHJ1biwgdGFnLCB0eXBlOiBzZWxlY3Rpb25UeXBlIH0gPSBzZWxlY3Rpb247CiAgICAgICAgICAgIHN3aXRjaCAoc2VsZWN0aW9uVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBTZWxlY3Rpb25UeXBlLk9QX0dSQVBIOgogICAgICAgICAgICAgICAgY2FzZSBTZWxlY3Rpb25UeXBlLkNPTkNFUFRVQUxfR1JBUEg6IHsKICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciBzdGF0cyBhYm91dCB0aGUgcHJldmlvdXMgZ3JhcGguCiAgICAgICAgICAgICAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0T3V0U3RhdHMobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpKCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IG5ldyBVUkxTZWFyY2hQYXJhbXMoKTsKICAgICAgICAgICAgICAgICAgICBwYXJhbXMuc2V0KCdydW4nLCBydW4pOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoJ2NvbmNlcHR1YWwnLCBTdHJpbmcoc2VsZWN0aW9uVHlwZSA9PT0gU2VsZWN0aW9uVHlwZS5DT05DRVBUVUFMX0dSQVBIKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZykKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNldCgndGFnJywgdGFnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBncmFwaFBhdGggPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnZ3JhcGhzJywgJy9ncmFwaCcsIHBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgoZ3JhcGhQYXRoKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ3JhcGhSdW5UYWcgPSB7IHJ1biwgdGFnIH07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIFNlbGVjdGlvblR5cGUuUFJPRklMRTogewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdGFncyB9ID0gdGhpcy5kYXRhc2V0cy5maW5kKCh7IG5hbWUgfSkgPT4gbmFtZSA9PT0gcnVuKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdNZXRhID0gdGFncy5maW5kKCh0KSA9PiB0LnRhZyA9PT0gdGFnKTsKICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGN1cnJlbnQgdGFnIG1pc3NlcyBvcEdyYXBoIGJ1dCBoYXMgcHJvZmlsZSBpbmZvcm1hdGlvbiwKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBmYWxsYmFjayB0byB0aGUgdjEgYmVoYXZpb3Igb2YgZmV0Y2hpbmcgdGhlIHJ1biBncmFwaC4KICAgICAgICAgICAgICAgICAgICBjb25zdCByZXF1aXJlZE9wR3JhcGhUYWcgPSB0YWdNZXRhLm9wR3JhcGggPyB0YWcgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRhZ3MuZmluZCgodCkgPT4gdC50YWcgPT09IHJlcXVpcmVkT3BHcmFwaFRhZyksIGBSZXF1aXJlZCB0YWcgKCR7cmVxdWlyZWRPcEdyYXBoVGFnfSkgaXMgbWlzc2luZy5gKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzaG91bGRGZXRjaEdyYXBoID0gIXRoaXMuX2dyYXBoUnVuVGFnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2dyYXBoUnVuVGFnLnJ1biAhPT0gcnVuIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2dyYXBoUnVuVGFnLnRhZyAhPT0gcmVxdWlyZWRPcEdyYXBoVGFnOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1heWJlRmV0Y2hHcmFwaFByb21pc2UgPSBzaG91bGRGZXRjaEdyYXBoCiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5fbG9hZCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6IHJlcXVpcmVkT3BHcmFwaFRhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IFNlbGVjdGlvblR5cGUuT1BfR1JBUEgsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcygpOwogICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zZXQoJ3RhZycsIHRhZyk7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnNldCgncnVuJywgcnVuKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YVBhdGggPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnZ3JhcGhzJywgJy9ydW5fbWV0YWRhdGEnLCBwYXJhbXMpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXliZUZldGNoR3JhcGhQcm9taXNlLnRoZW4oKCkgPT4gdGhpcy5fcmVhZEFuZFBhcnNlTWV0YWRhdGEobWV0YWRhdGFQYXRoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYFVua25vd24gc2VsZWN0aW9uIHR5cGU6ICR7c2VsZWN0aW9uVHlwZX1gKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3JlYWRBbmRQYXJzZU1ldGFkYXRhKHBhdGgpIHsKICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHByb2dyZXNzIGJhciB0byAwLgogICAgICAgICAgICB0aGlzLnNldCgncHJvZ3Jlc3MnLCB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgIG1zZzogJycsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgdHJhY2tlciA9IGdldFRyYWNrZXIodGhpcyk7CiAgICAgICAgICAgIGZldGNoQW5kUGFyc2VNZXRhZGF0YShwYXRoLCB0cmFja2VyKS50aGVuKGZ1bmN0aW9uIChzdGF0cykgewogICAgICAgICAgICAgICAgdGhpcy5fc2V0T3V0U3RhdHMoc3RhdHMpOwogICAgICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICAgIH0KICAgICAgICBfZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChwYXRoLCBwYlR4dEZpbGUpIHsKICAgICAgICAgICAgLy8gUmVzZXQgdGhlIHByb2dyZXNzIGJhciB0byAwLgogICAgICAgICAgICB0aGlzLnNldCgncHJvZ3Jlc3MnLCB7CiAgICAgICAgICAgICAgICB2YWx1ZTogMCwKICAgICAgICAgICAgICAgIG1zZzogJycsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCB0cmFja2VyID0gZ2V0VHJhY2tlcih0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIGZldGNoQW5kQ29uc3RydWN0SGllcmFyY2hpY2FsR3JhcGgodHJhY2tlciwgcGF0aCwgcGJUeHRGaWxlLCB0aGlzLmNvbXBhdGliaWxpdHlQcm92aWRlciwgdGhpcy5oaWVyYXJjaHlQYXJhbXMpCiAgICAgICAgICAgICAgICAudGhlbihmdW5jdGlvbiAoeyBncmFwaCwgZ3JhcGhIaWVyYXJjaHkgfSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2V0T3V0R3JhcGgoZ3JhcGgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2V0T3V0R3JhcGhIaWVyYXJjaHkoZ3JhcGhIaWVyYXJjaHkpOwogICAgICAgICAgICB9LmJpbmQodGhpcykpOwogICAgICAgIH0KICAgICAgICBfc2VsZWN0ZWRGaWxlQ2hhbmdlZCgpIHsKICAgICAgICAgICAgdmFyIGUgPSB0aGlzLnNlbGVjdGVkRmlsZTsKICAgICAgICAgICAgaWYgKCFlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZS50YXJnZXQ7CiAgICAgICAgICAgIGNvbnN0IGZpbGUgPSB0YXJnZXQuZmlsZXNbMF07CiAgICAgICAgICAgIGlmICghZmlsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgdmFsdWUgb2YgdGhlIGZpbGUgY2hvb3Nlci4gVGhpcyBlbnN1cmVzIHRoYXQgaWYgdGhlIHVzZXIKICAgICAgICAgICAgLy8gc2VsZWN0cyB0aGUgc2FtZSBmaWxlLCB3ZSdsbCByZS1yZWFkIGl0LgogICAgICAgICAgICB0YXJnZXQudmFsdWUgPSAnJzsKICAgICAgICAgICAgdGhpcy5fZmV0Y2hBbmRDb25zdHJ1Y3RIaWVyYXJjaGljYWxHcmFwaChudWxsLCBmaWxlKTsKICAgICAgICB9CiAgICB9OwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJkYXRhc2V0cyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJwcm9ncmVzcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmRMb2FkZXIucHJvdG90eXBlLCAic2VsZWN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJzZWxlY3RlZEZpbGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkTG9hZGVyLnByb3RvdHlwZSwgImNvbXBhdGliaWxpdHlQcm92aWRlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmRMb2FkZXIucHJvdG90eXBlLCAiaGllcmFyY2h5UGFyYW1zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICByZWFkT25seTogdHJ1ZSwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJvdXRHcmFwaEhpZXJhcmNoeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmRMb2FkZXIucHJvdG90eXBlLCAib3V0R3JhcGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkTG9hZGVyLnByb3RvdHlwZSwgIm91dFN0YXRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJfZ3JhcGhSdW5UYWciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnc2VsZWN0aW9uJywgJ2NvbXBhdGliaWxpdHlQcm92aWRlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJfc2VsZWN0aW9uQ2hhbmdlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnc2VsZWN0ZWRGaWxlJywgJ2NvbXBhdGliaWxpdHlQcm92aWRlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlci5wcm90b3R5cGUsICJfc2VsZWN0ZWRGaWxlQ2hhbmdlZCIsIG51bGwpOwogICAgVGZHcmFwaERhc2hib2FyZExvYWRlciA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWdyYXBoLWRhc2hib2FyZC1sb2FkZXInKQogICAgXSwgVGZHcmFwaERhc2hib2FyZExvYWRlcik7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFRoZSAoc3RyaW5nKSBuYW1lIGZvciB0aGUgcnVuIG9mIHRoZSBzZWxlY3RlZCBkYXRhc2V0IGluIHRoZSBncmFwaCBkYXNoYm9hcmQuCiAgICAgKi8KICAgIGNvbnN0IFJVTl9TVE9SQUdFX0tFWSA9ICdydW4nOwogICAgLyoqCiAgICAgKiB0Zi1ncmFwaC1kYXNoYm9hcmQgZGlzcGxheXMgYSBncmFwaCBmcm9tIGEgVGVuc29yRmxvdyBydW4uCiAgICAgKgogICAgICogSXQgaGFzIHNpbXBsZSBiZWhhdmlvcjogQ3JlYXRlcyBhIHVybC1nZW5lcmF0b3IgYW5kIHJ1bi1nZW5lcmF0b3IKICAgICAqIHRvIHRhbGsgdG8gdGhlIGJhY2tlbmQsIGFuZCB0aGVuIHBhc3NlcyB0aGUgcnVuc1dpdGhHcmFwaCAobGlzdCBvZiBydW5zIHdpdGgKICAgICAqIGFzc29jaWF0ZWQgZ3JhcGhzKSBhbG9uZyB3aXRoIHRoZSB1cmwgZ2VuZXJhdG9yIGludG8gdGYtZ3JhcGgtYm9hcmQgZm9yIGRpc3BsYXkuCiAgICAgKgogICAgICogSWYgdGhlcmUgYXJlIG11bHRpcGxlIHJ1bnMgd2l0aCBncmFwaHMsIHRoZSBmaXJzdCBydW4ncyBncmFwaCBpcyBzaG93bgogICAgICogYnkgZGVmYXVsdC4gVGhlIHVzZXIgY2FuIHNlbGVjdCBhIGRpZmZlcmVudCBydW4gZnJvbSBhIGRyb3Bkb3duIG1lbnUuCiAgICAgKi8KICAgIGxldCBUZkdyYXBoRGFzaGJvYXJkID0gY2xhc3MgVGZHcmFwaERhc2hib2FyZCBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUgeyFBcnJheTwhUnVuSXRlbT59CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kYXRhc2V0cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9kYXRhc2V0c0ZldGNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWREYXRhc2V0ID0gMDsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIgPSBuZXcgUmVxdWVzdE1hbmFnZXIoKTsKICAgICAgICAgICAgdGhpcy5fY2FuY2VsbGVyID0gbmV3IENhbmNlbGxlcigpOwogICAgICAgICAgICB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAgPSAwOwogICAgICAgICAgICB0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEFuIGFycmF5IG9mIGFsZXJ0cyAoaW4gY2hyb25vbG9naWNhbCBvcmRlcikgcHJvdmlkZWQgYnkgZGVidWdnaW5nIGxpYnJhcmllcyBvbiB3aGVuIGJhZAogICAgICAgICAgICAvLyB2YWx1ZXMgKE5hTiwgKy8tIEluZikgYXBwZWFyLgogICAgICAgICAgICB0aGlzLl9kZWJ1Z2dlck51bWVyaWNBbGVydHMgPSBbXTsKICAgICAgICAgICAgLy8gTWFwcyB0aGUgbmFtZXMgb2Ygbm9kZXMgdG8gYW4gYXJyYXkgb2YgaGVhbHRoIHBpbGxzIChIZWFsdGhQaWxsRGF0dW1zKS4KICAgICAgICAgICAgdGhpcy5fbm9kZU5hbWVzVG9IZWFsdGhQaWxscyA9IHt9OwogICAgICAgICAgICAvLyBBIHN0cmljdGx5IGluY3JlYXNpbmcgSUQuIEVhY2ggcmVxdWVzdCBmb3IgaGVhbHRoIHBpbGxzIGhhcyBhIHVuaXF1ZSBJRC4gVGhpcyBoZWxwcyB1cwogICAgICAgICAgICAvLyBpZGVudGlmeSBzdGFsZSByZXF1ZXN0cy4KICAgICAgICAgICAgdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZCA9IDE7CiAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGZvciBoZWFsdGggcGlsbHMgYXQgYSBzcGVjaWZpYyBzdGVwIChhcyBvcHBvc2VkIHRvIGFsbCBzYW1wbGVkIGhlYWx0aCBwaWxscykgbWF5CiAgICAgICAgICAgIC8vIGludm9sdmUgc2xvdyBkaXNrIHJlYWRzLiBIZW5jZSwgd2UgdGhyb3R0bGUgdG8gMSBvZiB0aG9zZSByZXF1ZXN0cyBldmVyeSB0aGlzIG1hbnkgbXMuCiAgICAgICAgICAgIHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVyRGVsYXkgPSA1MDA7CiAgICAgICAgICAgIHRoaXMucnVuID0gZ2V0U3RyaW5nSW5pdGlhbGl6ZXIoUlVOX1NUT1JBR0VfS0VZLCB7CiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6ICcnLAogICAgICAgICAgICAgICAgdXNlTG9jYWxTdG9yYWdlOiBmYWxzZSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9ydW5PYnNlcnZlciA9IGdldFN0cmluZ09ic2VydmVyKFJVTl9TVE9SQUdFX0tFWSwgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgIHBvbHltZXJQcm9wZXJ0eTogJ3J1bicsCiAgICAgICAgICAgICAgICB1c2VMb2NhbFN0b3JhZ2U6IGZhbHNlLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMuc2V0KCdfaXNBdHRhY2hlZCcsIHRydWUpOwogICAgICAgIH0KICAgICAgICBkZXRhY2hlZCgpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19pc0F0dGFjaGVkJywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdub2RlLXRvZ2dsZS1leHBhbmQnLCB0aGlzLl9oYW5kbGVOb2RlVG9nZ2xlRXhwYW5kLmJpbmQodGhpcykpOwogICAgICAgIH0KICAgICAgICByZWxvYWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGVidWdnZXJEYXRhRW5hYmxlZCkgewogICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGRlYnVnZ2VyIHBsdWdpbiBpcyBlbmFibGVkIG5vdy4KICAgICAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZ2V0Um91dGVyKCkucGx1Z2luc0xpc3RpbmcoKSkudGhlbih0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdC52YWx1ZVsnZGVidWdnZXInXSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZGVidWdnZXIgcGx1Z2luIGlzIGVuYWJsZWQuIFJlcXVlc3QgZGVidWdnZXItcmVsYXRlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhLiBQZXJoYXBzIHRoZSBkZWJ1Z2dlciBwbHVnaW4gaGFkIGJlZW4gZGlzYWJsZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlaGFuZCBiZWNhdXNlIG5vIGJhZCB2YWx1ZXMgKE5hTiwgLS8rIEluZikgaGFkIGJlZW4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgYW5kIG11dGVkX2lmX2hlYWx0aHkgaGFkIGJlZW4gb24uCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfZGVidWdnZXJEYXRhRW5hYmxlZCcsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tYXliZUZldGNoSGVhbHRoUGlsbHMoKTsKICAgICAgICB9CiAgICAgICAgX2ZpdCgpIHsKICAgICAgICAgICAgdGhpcy4kJCgnI2dyYXBoYm9hcmQnKS5maXQoKTsKICAgICAgICB9CiAgICAgICAgX2ZldGNoRGF0YXNldCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ2dyYXBocycsICcvaW5mbycpKTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgKiBTZWUgYWxzbyBfbWF5YmVGZXRjaEhlYWx0aFBpbGxzLCBfaW5pdGlhdGVOZXR3b3JrUmVxdWVzdEZvckhlYWx0aFBpbGxzLgogICAgICAgICAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIHByb21pc2Ugd2l0aCB0aGUgcmF3IGhlYWx0aCBwaWxsIGRhdGEuCiAgICAgICAgICovCiAgICAgICAgX2ZldGNoSGVhbHRoUGlsbHMobm9kZU5hbWVzLCBzdGVwKSB7CiAgICAgICAgICAgIGNvbnN0IHBvc3REYXRhID0gewogICAgICAgICAgICAgICAgbm9kZV9uYW1lczogSlNPTi5zdHJpbmdpZnkobm9kZU5hbWVzKSwKICAgICAgICAgICAgICAgIC8vIEV2ZW50cyBmaWxlcyB3aXRoIGRlYnVnZ2VyIGRhdGEgZmFsbCB1bmRlciB0aGlzIHNwZWNpYWwgcnVuLgogICAgICAgICAgICAgICAgcnVuOiAnX19kZWJ1Z2dlcl9kYXRhX18nLAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoc3RlcCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciByZXF1ZXN0ZWQgaGVhbHRoIHBpbGxzIGZvciBhIHNwZWNpZmljIHN0ZXAuIFRoaXMgcmVxdWVzdAogICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgc2xvdyBzaW5jZSB0aGUgYmFja2VuZCByZWFkcyBldmVudHMgc2VxdWVudGlhbGx5IGZyb20gZGlzay4KICAgICAgICAgICAgICAgIHBvc3REYXRhWydzdGVwJ10gPSBzdGVwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLnBsdWdpblJvdXRlKCdkZWJ1Z2dlcicsICcvaGVhbHRoX3BpbGxzJyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHVybCwgcG9zdERhdGEpOwogICAgICAgIH0KICAgICAgICBfZmV0Y2hEZWJ1Z2dlck51bWVyaWNzQWxlcnRzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdChnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnZGVidWdnZXInLCAnL251bWVyaWNzX2FsZXJ0X3JlcG9ydCcpKTsKICAgICAgICB9CiAgICAgICAgX2dyYXBoVXJsKHJ1biwgbGltaXRBdHRyU2l6ZSwgbGFyZ2VBdHRyc0tleSkgewogICAgICAgICAgICByZXR1cm4gZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ2dyYXBocycsICcvZ3JhcGgnLCBuZXcgVVJMU2VhcmNoUGFyYW1zKHsKICAgICAgICAgICAgICAgIHJ1bjogcnVuLAogICAgICAgICAgICAgICAgbGltaXRfYXR0cl9zaXplOiBsaW1pdEF0dHJTaXplLAogICAgICAgICAgICAgICAgbGFyZ2VfYXR0cnNfa2V5OiBsYXJnZUF0dHJzS2V5LAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIF9zaG91bGRSZXF1ZXN0SGVhbHRoUGlsbHMoKSB7CiAgICAgICAgICAgIC8vIERvIG5vdCBsb2FkIGRlYnVnZ2VyIGRhdGEgaWYgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGlmIHRoZSB1c2VyIHRvZ2dsZWQgb2ZmIHRoZSBmZWF0dXJlLAogICAgICAgICAgICAvLyBvciBpZiB0aGUgZ3JhcGggaXRzZWxmIGhhcyBub3QgbG9hZGVkIHlldC4gV2UgbmVlZCB0aGUgZ3JhcGggdG8gbG9hZCBzbyB0aGF0IHdlIGtub3cgd2hpY2gKICAgICAgICAgICAgLy8gbm9kZXMgdG8gcmVxdWVzdCBoZWFsdGggcGlsbHMgZm9yLgogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2RlYnVnZ2VyRGF0YUVuYWJsZWQgJiYKICAgICAgICAgICAgICAgIHRoaXMuaGVhbHRoUGlsbHNUb2dnbGVkT24gJiYKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlckhpZXJhcmNoeSAmJgogICAgICAgICAgICAgICAgdGhpcy5fZGF0YXNldHNTdGF0ZSh0aGlzLl9kYXRhc2V0c0ZldGNoZWQsIHRoaXMuX2RhdGFzZXRzLCAnUFJFU0VOVCcpKTsKICAgICAgICB9CiAgICAgICAgX21heWJlSW5pdGlhbGl6ZURhc2hib2FyZCgpIHsKICAgICAgICAgICAgdmFyIGlzQXR0YWNoZWQgPSB0aGlzLl9pc0F0dGFjaGVkOwogICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQgfHwgIWlzQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIC8vIEVpdGhlciB0aGlzIGRhc2hib2FyZCBpcyBhbHJlYWR5IGluaXRpYWxpemVkIC4uLiBvciB3ZSBhcmUgbm90IHlldCByZWFkeSB0byBpbml0aWFsaXplLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2V0KCdfY29tcGF0aWJpbGl0eVByb3ZpZGVyJywgbmV3IFRwdUNvbXBhdGliaWxpdHlQcm92aWRlcigpKTsKICAgICAgICAgICAgLy8gU2V0IHRoaXMgdG8gdHJ1ZSBzbyB3ZSBvbmx5IGluaXRpYWxpemUgb25jZS4KICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9mZXRjaERhdGFzZXQoKS50aGVuKChkYXRhc2V0KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBydW5OYW1lcyA9IE9iamVjdC5rZXlzKGRhdGFzZXQpOwogICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIHJhdyBkYXRhIGludG8gVUkgZnJpZW5kbHkgZGF0YS4KICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFzZXRzID0gcnVuTmFtZXMKICAgICAgICAgICAgICAgICAgICAuc29ydChjb21wYXJlVGFnTmFtZXMpCiAgICAgICAgICAgICAgICAgICAgLm1hcCgocnVuTmFtZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bkRhdGEgPSBkYXRhc2V0W3J1bk5hbWVdOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ05hbWVzID0gT2JqZWN0LmtleXMocnVuRGF0YS50YWdzKS5zb3J0KGNvbXBhcmVUYWdOYW1lcyk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IHRhZ05hbWVzCiAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKG5hbWUpID0+IHJ1bkRhdGEudGFnc1tuYW1lXSkKICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoeyB0YWcsIGNvbmNlcHR1YWxfZ3JhcGgsIG9wX2dyYXBoLCBwcm9maWxlIH0pID0+ICh7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGxheU5hbWU6IHRhZywKICAgICAgICAgICAgICAgICAgICAgICAgY29uY2VwdHVhbEdyYXBoOiBjb25jZXB0dWFsX2dyYXBoLAogICAgICAgICAgICAgICAgICAgICAgICBvcEdyYXBoOiBvcF9ncmFwaCwKICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNsYXRlIGEgcnVuLXdpZGUgR3JhcGhEZWYgaW50byBzcGVjaWFsbHkgbmFtZWQgKHdpdGhvdXQgYSB0YWcpIG9wIGdyYXBoCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWJzdHJhY3QgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiBydW5fZ3JhcGggdnMuIG9wX2dyYXBoIGZyb20gb3RoZXIKICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnRzLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3NXaXRoVjFHcmFwaCA9IHJ1bkRhdGEucnVuX2dyYXBoCiAgICAgICAgICAgICAgICAgICAgICAgID8gWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZzogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5TmFtZTogJ0RlZmF1bHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmNlcHR1YWxHcmFwaDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BHcmFwaDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuLi50YWdzLAogICAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgICAgICAgICAgICAgIDogdGFnczsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBuYW1lOiBydW5OYW1lLCB0YWdzOiB0YWdzV2l0aFYxR3JhcGggfTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5fZGF0YXNldHNGZXRjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9kZXRlcm1pbmVTZWxlY3RlZERhdGFzZXQoKSB7CiAgICAgICAgICAgIHZhciBkYXRhc2V0c0ZldGNoZWQgPSB0aGlzLl9kYXRhc2V0c0ZldGNoZWQ7CiAgICAgICAgICAgIHZhciBkYXRhc2V0cyA9IHRoaXMuX2RhdGFzZXRzOwogICAgICAgICAgICB2YXIgcnVuID0gdGhpcy5ydW47CiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIGxvYWQgdGhlIGZpcnN0IGRhdGFzZXQuCiAgICAgICAgICAgIGlmICghcnVuKSB7CiAgICAgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBsb2FkIHRoZSBmaXJzdCBkYXRhc2V0LgogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19zZWxlY3RlZERhdGFzZXQnLCAwKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiB0aGUgVVJMIHNwZWNpZmllcyBhIGRhdGFzZXQsIGxvYWQgaXQuCiAgICAgICAgICAgIGNvbnN0IGRhdGFzZXQgPSBkYXRhc2V0cy5maW5kSW5kZXgoKGQpID0+IGQubmFtZSA9PT0gcnVuKTsKICAgICAgICAgICAgaWYgKGRhdGFzZXQgPT09IC0xKSB7CiAgICAgICAgICAgICAgICBpZiAoZGF0YXNldHNGZXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGVsbCB0aGUgdXNlciBpZiB0aGUgZGF0YXNldCBjYW5ub3QgYmUgZm91bmQgdG8gYXZvaWQgbWlzbGVhZGluZwogICAgICAgICAgICAgICAgICAgIC8vIHRoZSB1c2VyLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpYWxvZyA9IHRoaXMuJCQoJyNlcnJvci1kaWFsb2cnKTsKICAgICAgICAgICAgICAgICAgICBkaWFsb2cudGV4dENvbnRlbnQgPSBgTm8gZGF0YXNldCBuYW1lZCAiJHtydW59IiBjb3VsZCBiZSBmb3VuZC5gOwogICAgICAgICAgICAgICAgICAgIGRpYWxvZy5vcGVuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zZXQoJ19zZWxlY3RlZERhdGFzZXQnLCBkYXRhc2V0KTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZVNlbGVjdGVkRGF0YXNldE5hbWUoKSB7CiAgICAgICAgICAgIHZhciBkYXRhc2V0c0ZldGNoZWQgPSB0aGlzLl9kYXRhc2V0c0ZldGNoZWQ7CiAgICAgICAgICAgIHZhciBkYXRhc2V0cyA9IHRoaXMuX2RhdGFzZXRzOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWREYXRhc2V0ID0gdGhpcy5fc2VsZWN0ZWREYXRhc2V0OwogICAgICAgICAgICBpZiAoIWRhdGFzZXRzRmV0Y2hlZCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLy8gQ2Fubm90IHVwZGF0ZSBgcnVuYCB0byB1cGRhdGUgdGhlIGhhc2ggaW4gY2FzZSBkYXRhc2V0cyBmb3IgZ3JhcGggaXMgZW1wdHkuCiAgICAgICAgICAgIGlmIChkYXRhc2V0cy5sZW5ndGggPD0gc2VsZWN0ZWREYXRhc2V0KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLnNldCgncnVuJywgZGF0YXNldHNbc2VsZWN0ZWREYXRhc2V0XS5uYW1lKTsKICAgICAgICB9CiAgICAgICAgX3JlcXVlc3RIZWFsdGhQaWxscygpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19hcmVIZWFsdGhQaWxsc0xvYWRpbmcnLCB0cnVlKTsKICAgICAgICAgICAgdmFyIHJlcXVlc3RJZCA9ICsrdGhpcy5faGVhbHRoUGlsbFJlcXVlc3RJZDsKICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIEEgcmVxdWVzdCBmb3IgaGVhbHRoIHBpbGxzIGlzIGFscmVhZHkgc2NoZWR1bGVkIHRvIGJlIGluaXRpYXRlZC4gQ2xlYXIgaXQsIGFuZCBzY2hlZHVsZSBhCiAgICAgICAgICAgICAgICAvLyBuZXcgcmVxdWVzdC4KICAgICAgICAgICAgICAgIHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5hbGxTdGVwc01vZGVFbmFibGVkKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIHBhdGggbWF5IGJlIHNsb3cuIFNjaGVkdWxlIG5ldHdvcmsgcmVxdWVzdHMgdG8gc3RhcnQgc29tZSB0aW1lIGxhdGVyLiBJZiBhbm90aGVyCiAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGlzIHNjaGVkdWxlZCBpbiB0aGUgbWVhbiB0aW1lLCBkcm9wIHRoaXMgY3VycmVudCByZXF1ZXN0LgogICAgICAgICAgICAgICAgdGhpcy5faGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJJZCA9IHNldFRpbWVvdXQoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hlYWx0aFBpbGxTdGVwUmVxdWVzdFRpbWVySWQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhyZXF1ZXN0SWQpOwogICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpLCB0aGlzLl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lckRlbGF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFRoZSB1c2VyIGlzIGZldGNoaW5nIHNhbXBsZWQgc3RlcHMuIFRoaXMgcGF0aCBpcyBmYXN0LCBzbyBubyBuZWVkIHRvIHRocm90dGxlLiBEaXJlY3RseQogICAgICAgICAgICAgICAgLy8gZmV0Y2ggdGhlIGhlYWx0aCBwaWxscyBhY3Jvc3MgdGhlIG5ldHdvcmsuCiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWF0ZU5ldHdvcmtSZXF1ZXN0Rm9ySGVhbHRoUGlsbHMocmVxdWVzdElkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJbml0aWF0ZXMgdGhlIG5ldHdvcmsgcmVxdWVzdCBmb3IgaGVhbHRoIHBpbGxzLiBEbyBub3QgZGlyZWN0bHkgY2FsbCB0aGlzIG1ldGhvZCAtIG5ldHdvcmsKICAgICAgICAvLyByZXF1ZXN0cyBtYXkgYmUgdGhyb3R0bGVkLiBJbnN0ZWFkLCBjYWxsIF9yZXF1ZXN0SGVhbHRoUGlsbHMsIHdoaWNoIHVzZXMgdGhpcyBtZXRob2QuCiAgICAgICAgX2luaXRpYXRlTmV0d29ya1JlcXVlc3RGb3JIZWFsdGhQaWxscyhyZXF1ZXN0SWQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWx0aFBpbGxSZXF1ZXN0SWQgIT09IHJlcXVlc3RJZCkgewogICAgICAgICAgICAgICAgLy8gVGhpcyBwb3NzaWJseSBzY2hlZHVsZWQgcmVxdWVzdCB3YXMgb3V0ZGF0ZWQgYmVmb3JlIGl0IHdhcyBldmVuIHNlbnQgYWNyb3NzIHRoZSBuZXR3b3JrLiBEbwogICAgICAgICAgICAgICAgLy8gbm90IGJvdGhlciBpbml0aWF0aW5nIGl0LgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNwZWNpZmljU3RlcCA9IHRoaXMuYWxsU3RlcHNNb2RlRW5hYmxlZAogICAgICAgICAgICAgICAgPyB0aGlzLnNwZWNpZmljSGVhbHRoUGlsbFN0ZXAKICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkOwogICAgICAgICAgICBjb25zdCBoZWFsdGhQaWxsc1Byb21pc2UgPSB0aGlzLl9mZXRjaEhlYWx0aFBpbGxzKHRoaXMuX3JlbmRlckhpZXJhcmNoeS5nZXROYW1lc09mUmVuZGVyZWRPcHMoKSwgc3BlY2lmaWNTdGVwKTsKICAgICAgICAgICAgY29uc3QgYWxlcnRzUHJvbWlzZSA9IHRoaXMuX2ZldGNoRGVidWdnZXJOdW1lcmljc0FsZXJ0cygpOwogICAgICAgICAgICBQcm9taXNlLmFsbChbaGVhbHRoUGlsbHNQcm9taXNlLCBhbGVydHNQcm9taXNlXSkudGhlbihmdW5jdGlvbiAocmVzdWx0KSB7CiAgICAgICAgICAgICAgICB2YXIgaGVhbHRoUGlsbHNSZXN1bHQgPSByZXN1bHRbMF07CiAgICAgICAgICAgICAgICB2YXIgYWxlcnRzUmVzdWx0ID0gcmVzdWx0WzFdOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmhlYWx0aFBpbGxzVG9nZ2xlZE9uKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHVzZXIgaGFzIG9wdGVkIHRvIGhpZGUgaGVhbHRoIHBpbGxzIHZpYSB0aGUgdG9nZ2xlIGJ1dHRvbi4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9PSB0aGlzLl9oZWFsdGhQaWxsUmVxdWVzdElkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyByZXNwb25zZSBpcyBubyBsb25nZXIgcmVsZXZhbnQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBpbmRleCBmb3Igd2hpY2ggc3RlcCB0byBzaG93IGZvciB0aGUgaGVhbHRoIHBpbGxzLiBCeSBkZWZhdWx0LCBzaG93IHRoZSBsYXN0IHN0ZXAuCiAgICAgICAgICAgICAgICAvLyBBIHByZWNvbmRpdGlvbiB3ZSBhc3N1bWUgKHRoYXQgVGVuc29yYm9hcmQncyByZXNlcnZvaXIgc2FtcGxpbmcgZ3VhcmFudGVlcykgaXMgdGhhdCBhbGwKICAgICAgICAgICAgICAgIC8vIG5vZGUgbmFtZXMgc2hvdWxkIGJlIG1hcHBlZCB0byB0aGUgc2FtZSBudW1iZXIgb2Ygc3RlcHMuCiAgICAgICAgICAgICAgICBmb3IgKHZhciBub2RlTmFtZSBpbiBoZWFsdGhQaWxsc1Jlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfaGVhbHRoUGlsbFN0ZXBJbmRleCcsIGhlYWx0aFBpbGxzUmVzdWx0W25vZGVOYW1lXS5sZW5ndGggLSAxKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfZGVidWdnZXJOdW1lcmljQWxlcnRzJywgYWxlcnRzUmVzdWx0KTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfbm9kZU5hbWVzVG9IZWFsdGhQaWxscycsIGhlYWx0aFBpbGxzUmVzdWx0KTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfYXJlSGVhbHRoUGlsbHNMb2FkaW5nJywgZmFsc2UpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkJywgbnVsbCk7CiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIF9kYXRhc2V0c1N0YXRlKGRhdGFzZXRzRmV0Y2hlZCwgZGF0YXNldHMsIHN0YXRlKSB7CiAgICAgICAgICAgIGlmICghZGF0YXNldHNGZXRjaGVkKQogICAgICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09PSAnTk9UX0xPQURFRCc7CiAgICAgICAgICAgIGlmICghZGF0YXNldHMgfHwgIWRhdGFzZXRzLmxlbmd0aCkKICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSA9PT0gJ0VNUFRZJzsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlID09PSAnUFJFU0VOVCc7CiAgICAgICAgfQogICAgICAgIF9yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkKHJlbmRlckhpZXJhcmNoeSkgewogICAgICAgICAgICAvLyBSZWxvYWQgYW55IGRhdGEgb24gdGhlIGdyYXBoIHdoZW4gdGhlIHJlbmRlciBoaWVyYXJjaHkgKHdoaWNoIGRldGVybWluZXMgd2hpY2ggbm9kZXMgYXJlCiAgICAgICAgICAgIC8vIHJlbmRlcmVkKSBjaGFuZ2VzLgogICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICBfaGFuZGxlTm9kZVRvZ2dsZUV4cGFuZCgpIHsKICAgICAgICAgICAgLy8gTm9kZXMgd2VyZSB0b2dnbGVkLiBXZSBtYXkgbmVlZCB0byByZXF1ZXN0IGhlYWx0aCBwaWxscyBmb3IgbW9yZSBub2Rlcy4KICAgICAgICAgICAgdGhpcy5fbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCk7CiAgICAgICAgfQogICAgICAgIF9oZWFsdGhQaWxsc1RvZ2dsZWRPbkNoYW5nZWQoaGVhbHRoUGlsbHNUb2dnbGVkT24pIHsKICAgICAgICAgICAgaWYgKGhlYWx0aFBpbGxzVG9nZ2xlZE9uKSB7CiAgICAgICAgICAgICAgICAvLyBMb2FkIGhlYWx0aCBwaWxscy4KICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGhlYWx0aCBwaWxscyBieSBzZXR0aW5nIGFuIGVtcHR5IG1hcHBpbmcuCiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX25vZGVOYW1lc1RvSGVhbHRoUGlsbHMnLCB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gRmV0Y2ggaGVhbHRoIHBpbGxzIGZvciBhIHNwZWNpZmljIHN0ZXAgaWYgYXBwbGljYWJsZS4KICAgICAgICBfbWF5YmVGZXRjaEhlYWx0aFBpbGxzKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Nob3VsZFJlcXVlc3RIZWFsdGhQaWxscygpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVxdWVzdEhlYWx0aFBpbGxzKCk7CiAgICAgICAgfQogICAgfTsKICAgIFRmR3JhcGhEYXNoYm9hcmQudGVtcGxhdGUgPSBodG1sIGAKICAgIDxwYXBlci1kaWFsb2cgaWQ9ImVycm9yLWRpYWxvZyIgd2l0aC1iYWNrZHJvcD48L3BhcGVyLWRpYWxvZz4KICAgIDx0ZW1wbGF0ZQogICAgICBpcz0iZG9tLWlmIgogICAgICBpZj0iW1tfZGF0YXNldHNTdGF0ZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsICdFTVBUWScpXV0iCiAgICA+CiAgICAgIDxkaXYgc3R5bGU9Im1heC13aWR0aDogNTQwcHg7IG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsiPgogICAgICAgIDxoMz5ObyBncmFwaCBkZWZpbml0aW9uIGZpbGVzIHdlcmUgZm91bmQuPC9oMz4KICAgICAgICA8cD4KICAgICAgICAgIFRvIHN0b3JlIGEgZ3JhcGgsIGNyZWF0ZSBhCiAgICAgICAgICA8Y29kZT50Zi5zdW1tYXJ5LkZpbGVXcml0ZXI8L2NvZGU+CiAgICAgICAgICBhbmQgcGFzcyB0aGUgZ3JhcGggZWl0aGVyIHZpYSB0aGUgY29uc3RydWN0b3IsIG9yIGJ5IGNhbGxpbmcgaXRzCiAgICAgICAgICA8Y29kZT5hZGRfZ3JhcGgoKTwvY29kZT4gbWV0aG9kLiBZb3UgbWF5IHdhbnQgdG8gY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvZ3JhcGhfdml6IgogICAgICAgICAgICA+Z3JhcGggdmlzdWFsaXplciB0dXRvcmlhbDwvYQogICAgICAgICAgPi4KICAgICAgICA8L3A+CgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8gYWRkCiAgICAgICAgICBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgPGEKICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICA+CiAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgIDxhCiAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgPi4KICAgICAgICA8L3A+CgogICAgICAgIDxwPgogICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgIDxhCiAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICA+CiAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICA8L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZQogICAgICBpcz0iZG9tLWlmIgogICAgICBpZj0iW1tfZGF0YXNldHNTdGF0ZShfZGF0YXNldHNGZXRjaGVkLCBfZGF0YXNldHMsICdQUkVTRU5UJyldXSIKICAgID4KICAgICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgICAgPHRmLWdyYXBoLWNvbnRyb2xzCiAgICAgICAgICBpZD0iY29udHJvbHMiCiAgICAgICAgICBjbGFzcz0ic2lkZWJhciIKICAgICAgICAgIHNsb3Q9InNpZGViYXIiCiAgICAgICAgICBkZXZpY2VzLWZvci1zdGF0cz0ie3tfZGV2aWNlc0ZvclN0YXRzfX0iCiAgICAgICAgICBjb2xvci1ieS1wYXJhbXM9IltbX2NvbG9yQnlQYXJhbXNdXSIKICAgICAgICAgIHN0YXRzPSJbW19zdGF0c11dIgogICAgICAgICAgY29sb3ItYnk9Int7X2NvbG9yQnl9fSIKICAgICAgICAgIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIgogICAgICAgICAgcmVuZGVyLWhpZXJhcmNoeT0iW1tfcmVuZGVySGllcmFyY2h5XV0iCiAgICAgICAgICBzZWxlY3Rpb249Int7X3NlbGVjdGlvbn19IgogICAgICAgICAgc2VsZWN0ZWQtZmlsZT0ie3tfc2VsZWN0ZWRGaWxlfX0iCiAgICAgICAgICBzZWxlY3RlZC1ub2RlPSJ7e19zZWxlY3RlZE5vZGV9fSIKICAgICAgICAgIGhlYWx0aC1waWxscy1mZWF0dXJlLWVuYWJsZWQ9IltbX2RlYnVnZ2VyRGF0YUVuYWJsZWRdXSIKICAgICAgICAgIGhlYWx0aC1waWxscy10b2dnbGVkLW9uPSJ7e2hlYWx0aFBpbGxzVG9nZ2xlZE9ufX0iCiAgICAgICAgICBvbi1maXQtdGFwPSJfZml0IgogICAgICAgICAgdHJhY2UtaW5wdXRzPSJ7e190cmFjZUlucHV0c319IgogICAgICAgID48L3RmLWdyYXBoLWNvbnRyb2xzPgogICAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICAgIDx0Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyCiAgICAgICAgICAgIGlkPSJsb2FkZXIiCiAgICAgICAgICAgIGRhdGFzZXRzPSJbW19kYXRhc2V0c11dIgogICAgICAgICAgICBzZWxlY3Rpb249IltbX3NlbGVjdGlvbl1dIgogICAgICAgICAgICBzZWxlY3RlZC1maWxlPSJbW19zZWxlY3RlZEZpbGVdXSIKICAgICAgICAgICAgb3V0LWdyYXBoLWhpZXJhcmNoeT0ie3tfZ3JhcGhIaWVyYXJjaHl9fSIKICAgICAgICAgICAgb3V0LWdyYXBoPSJ7e19ncmFwaH19IgogICAgICAgICAgICBvdXQtc3RhdHM9Int7X3N0YXRzfX0iCiAgICAgICAgICAgIHByb2dyZXNzPSJ7e19wcm9ncmVzc319IgogICAgICAgICAgICBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIKICAgICAgICAgICAgY29tcGF0aWJpbGl0eS1wcm92aWRlcj0iW1tfY29tcGF0aWJpbGl0eVByb3ZpZGVyXV0iCiAgICAgICAgICA+PC90Zi1ncmFwaC1kYXNoYm9hcmQtbG9hZGVyPgogICAgICAgICAgPHRmLWdyYXBoLWJvYXJkCiAgICAgICAgICAgIGlkPSJncmFwaGJvYXJkIgogICAgICAgICAgICBkZXZpY2VzLWZvci1zdGF0cz0iW1tfZGV2aWNlc0ZvclN0YXRzXV0iCiAgICAgICAgICAgIGNvbG9yLWJ5PSJbW19jb2xvckJ5XV0iCiAgICAgICAgICAgIGNvbG9yLWJ5LXBhcmFtcz0ie3tfY29sb3JCeVBhcmFtc319IgogICAgICAgICAgICBncmFwaC1oaWVyYXJjaHk9IltbX2dyYXBoSGllcmFyY2h5XV0iCiAgICAgICAgICAgIGdyYXBoPSJbW19ncmFwaF1dIgogICAgICAgICAgICBoaWVyYXJjaHktcGFyYW1zPSJbW19oaWVyYXJjaHlQYXJhbXNdXSIKICAgICAgICAgICAgcHJvZ3Jlc3M9IltbX3Byb2dyZXNzXV0iCiAgICAgICAgICAgIGRlYnVnZ2VyLWRhdGEtZW5hYmxlZD0iW1tfZGVidWdnZXJEYXRhRW5hYmxlZF1dIgogICAgICAgICAgICBhcmUtaGVhbHRoLXBpbGxzLWxvYWRpbmc9IltbX2FyZUhlYWx0aFBpbGxzTG9hZGluZ11dIgogICAgICAgICAgICBkZWJ1Z2dlci1udW1lcmljLWFsZXJ0cz0iW1tfZGVidWdnZXJOdW1lcmljQWxlcnRzXV0iCiAgICAgICAgICAgIG5vZGUtbmFtZXMtdG8taGVhbHRoLXBpbGxzPSJbW19ub2RlTmFtZXNUb0hlYWx0aFBpbGxzXV0iCiAgICAgICAgICAgIGFsbC1zdGVwcy1tb2RlLWVuYWJsZWQ9Int7YWxsU3RlcHNNb2RlRW5hYmxlZH19IgogICAgICAgICAgICBzcGVjaWZpYy1oZWFsdGgtcGlsbC1zdGVwPSJ7e3NwZWNpZmljSGVhbHRoUGlsbFN0ZXB9fSIKICAgICAgICAgICAgaGVhbHRoLXBpbGwtc3RlcC1pbmRleD0iW1tfaGVhbHRoUGlsbFN0ZXBJbmRleF1dIgogICAgICAgICAgICByZW5kZXItaGllcmFyY2h5PSJ7e19yZW5kZXJIaWVyYXJjaHl9fSIKICAgICAgICAgICAgc2VsZWN0ZWQtbm9kZT0ie3tfc2VsZWN0ZWROb2RlfX0iCiAgICAgICAgICAgIHN0YXRzPSJbW19zdGF0c11dIgogICAgICAgICAgICB0cmFjZS1pbnB1dHM9IltbX3RyYWNlSW5wdXRzXV0iCiAgICAgICAgICA+PC90Zi1ncmFwaC1ib2FyZD4KICAgICAgICA8L2Rpdj4KICAgICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgL2RlZXAvIHsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90bycsIHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC5zaWRlYmFyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgLmNlbnRlciB7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgcGFwZXItZGlhbG9nIHsKICAgICAgICBwYWRkaW5nOiAyMHB4OwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEFycmF5LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kYXRhc2V0cyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJfZGF0YXNldHNGZXRjaGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJfc2VsZWN0ZWREYXRhc2V0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0LCBvYnNlcnZlcjogJ19yZW5kZXJIaWVyYXJjaHlDaGFuZ2VkJyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlbmRlckhpZXJhcmNoeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJfcmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBDYW5jZWxsZXIpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYW5jZWxsZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiX2RlYnVnZ2VyRGF0YUVuYWJsZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiYWxsU3RlcHNNb2RlRW5hYmxlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAic3BlY2lmaWNIZWFsdGhQaWxsU3RlcCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG9ic2VydmVyOiAnX2hlYWx0aFBpbGxzVG9nZ2xlZE9uQ2hhbmdlZCcsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJoZWFsdGhQaWxsc1RvZ2dsZWRPbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJzZWxlY3RlZE5vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiX2lzQXR0YWNoZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiX2luaXRpYWxpemVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9hcmVIZWFsdGhQaWxsc0xvYWRpbmciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kZWJ1Z2dlck51bWVyaWNBbGVydHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9ub2RlTmFtZXNUb0hlYWx0aFBpbGxzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJfaGVhbHRoUGlsbFN0ZXBJbmRleCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiX2hlYWx0aFBpbGxSZXF1ZXN0SWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9oZWFsdGhQaWxsU3RlcFJlcXVlc3RUaW1lcklkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJfaGVhbHRoUGlsbFN0ZXBSZXF1ZXN0VGltZXJEZWxheSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgInJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfcnVuT2JzZXJ2ZXInLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJydW4iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9zZWxlY3Rpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jb21wYXRpYmlsaXR5UHJvdmlkZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQucHJvdG90eXBlLCAiX3RyYWNlSW5wdXRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19pc0F0dGFjaGVkJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9tYXliZUluaXRpYWxpemVEYXNoYm9hcmQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19kYXRhc2V0c0ZldGNoZWQnLCAnX2RhdGFzZXRzJywgJ3J1bicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZHcmFwaERhc2hib2FyZC5wcm90b3R5cGUsICJfZGV0ZXJtaW5lU2VsZWN0ZWREYXRhc2V0IiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdfZGF0YXNldHNGZXRjaGVkJywgJ19kYXRhc2V0cycsICdfc2VsZWN0ZWREYXRhc2V0JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkdyYXBoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl91cGRhdGVTZWxlY3RlZERhdGFzZXROYW1lIiwgbnVsbCk7CiAgICBUZkdyYXBoRGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZ3JhcGgtZGFzaGJvYXJkJykKICAgIF0sIFRmR3JhcGhEYXNoYm9hcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDE2IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLy8gVHlwZVNjcmlwdCBjYW4ndCBkZWFsIHdpdGggZDMncyBzdHlsZSBvZiBvdmVybG9hZGluZyBhbmQKICAgIC8vIHBvbHltb3JwaGlzbSwgYW5kIGNvbnN0YW50bHkgZmFpbHMgdG8gc2VsZWN0IHRoZSBjb3JyZWN0IG92ZXJsb2FkLgogICAgLy8gVGhpcyBtb2R1bGUgd2FzIGNvbnZlcnRlZCBmcm9tIHdvcmtpbmcgbm9uLVR5cGVTY3JpcHQgY29kZSwgc28gd2UKICAgIC8vIGdyYW5kZmF0aGVyIGl0IGluIHVudHlwZWQuCiAgICBjb25zdCBkMyQxID0gZDNUeXBlZDsKICAgIGxldCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzID0gY2xhc3MgX1Z6SGlzdG9ncmFtVGltZXNlcmllcyBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLm1vZGUgPSAnb2Zmc2V0JzsKICAgICAgICAgICAgdGhpcy50aW1lUHJvcGVydHkgPSAnc3RlcCc7CiAgICAgICAgICAgIHRoaXMuYmlucyA9ICdiaW5zJzsKICAgICAgICAgICAgdGhpcy54ID0gJ3gnOwogICAgICAgICAgICB0aGlzLmR4ID0gJ2R4JzsKICAgICAgICAgICAgdGhpcy55ID0gJ3knOwogICAgICAgICAgICB0aGlzLmNvbG9yU2NhbGUgPSBkMyQxLnNjYWxlT3JkaW5hbChkMyQxLnNjaGVtZUNhdGVnb3J5MTApOwogICAgICAgICAgICB0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24gPSA1MDA7CiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9kYXRhID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICAgIC8vIFBvbHltZXIncyB3YXkgb2Ygc2NvcGluZyBzdHlsZXMgb24gbm9kZXMgdGhhdCBkMyBjcmVhdGVkCiAgICAgICAgICAgIHRoaXMuc2NvcGVTdWJ0cmVlKHRoaXMuJC5zdmcsIHRydWUpOwogICAgICAgIH0KICAgICAgICBhdHRhY2hlZCgpIHsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBkZXRhY2hlZCgpIHsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgc2V0U2VyaWVzRGF0YShuYW1lLCBkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBuYW1lOwogICAgICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTsKICAgICAgICAgICAgdGhpcy5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgX3JlZHJhd09uQ2hhbmdlKCkgewogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWRyYXdzIHRoZSBjaGFydC4gVGhpcyBpcyBvbmx5IGNhbGxlZCBpZiB0aGUgY2hhcnQgaXMgYXR0YWNoZWQgdG8gdGhlCiAgICAgICAgICogc2NyZWVuIGFuZCBpZiB0aGUgY2hhcnQgaGFzIGRhdGEuCiAgICAgICAgICovCiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLl9kcmF3KDApOwogICAgICAgIH0KICAgICAgICBfbW9kZVJlZHJhdygpIHsKICAgICAgICAgICAgdGhpcy5fZHJhdyh0aGlzLm1vZGVUcmFuc2l0aW9uRHVyYXRpb24pOwogICAgICAgIH0KICAgICAgICBfZHJhdyhkdXJhdGlvbikgewogICAgICAgICAgICBpZiAoIXRoaXMuX2F0dGFjaGVkIHx8ICF0aGlzLl9kYXRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gRGF0YSB2ZXJpZmljYXRpb24KICAgICAgICAgICAgLy8KICAgICAgICAgICAgaWYgKGR1cmF0aW9uID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Z6LWhpc3RvZ3JhbS10aW1lc2VyaWVzIF9kcmF3IG5lZWRzIGR1cmF0aW9uJyk7CiAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhLmxlbmd0aCA8PSAwKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdOb3QgZW5vdWdoIHN0ZXBzIGluIHRoZSBkYXRhJyk7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGF0YVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmJpbnMpKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCJObyBiaW5zIHByb3BlcnR5IG9mICciICsgdGhpcy5iaW5zICsgIicgaW4gZGF0YSIpOwogICAgICAgICAgICBpZiAodGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdLmxlbmd0aCA8PSAwKQogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdNdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGJpbiBpbiBiaW5zIGluIGRhdGEnKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kYXRhWzBdW3RoaXMuYmluc11bMF0uaGFzT3duUHJvcGVydHkodGhpcy54KSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8geCBwcm9wZXJ0eSAnIiArIHRoaXMueCArICInIG9uIGJpbnMgZGF0YSIpOwogICAgICAgICAgICBpZiAoIXRoaXMuX2RhdGFbMF1bdGhpcy5iaW5zXVswXS5oYXNPd25Qcm9wZXJ0eSh0aGlzLmR4KSkKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigiTm8gZHggcHJvcGVydHkgJyIgKyB0aGlzLmR4ICsgIicgb24gYmlucyBkYXRhIik7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGF0YVswXVt0aGlzLmJpbnNdWzBdLmhhc093blByb3BlcnR5KHRoaXMueSkpCiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoIk5vIHkgcHJvcGVydHkgJyIgKyB0aGlzLnkgKyAiJyBvbiBiaW5zIGRhdGEiKTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gSW5pdGlhbGl6YXRpb24KICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIHRpbWVQcm9wID0gdGhpcy50aW1lUHJvcGVydHk7CiAgICAgICAgICAgIHZhciB4UHJvcCA9IHRoaXMueDsKICAgICAgICAgICAgdmFyIGJpbnNQcm9wID0gdGhpcy5iaW5zOwogICAgICAgICAgICB2YXIgZHhQcm9wID0gdGhpcy5keDsKICAgICAgICAgICAgdmFyIHlQcm9wID0gdGhpcy55OwogICAgICAgICAgICB2YXIgZGF0YSA9IHRoaXMuX2RhdGE7CiAgICAgICAgICAgIHZhciBuYW1lID0gdGhpcy5fbmFtZTsKICAgICAgICAgICAgdmFyIG1vZGUgPSB0aGlzLm1vZGU7CiAgICAgICAgICAgIHZhciBjb2xvciA9IGQzJDEuaGNsKHRoaXMuY29sb3JTY2FsZShuYW1lKSk7CiAgICAgICAgICAgIHZhciB0b29sdGlwID0gZDMkMS5zZWxlY3QodGhpcy4kLnRvb2x0aXApOwogICAgICAgICAgICB2YXIgeEFjY2Vzc29yID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkW3hQcm9wXTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIHlBY2Nlc3NvciA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZFt5UHJvcF07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB4UmlnaHRBY2Nlc3NvciA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZFt4UHJvcF0gKyBkW2R4UHJvcF07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciB0aW1lQWNjZXNzb3IgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRbdGltZVByb3BdOwogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAodGltZVByb3AgPT09ICdyZWxhdGl2ZScpIHsKICAgICAgICAgICAgICAgIHRpbWVBY2Nlc3NvciA9IGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGQud2FsbF90aW1lIC0gZGF0YVswXS53YWxsX3RpbWU7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBicmVjdCA9IHRoaXMuJC5zdmcuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIHZhciBvdXRlcldpZHRoID0gYnJlY3Qud2lkdGgsIG91dGVySGVpZ2h0ID0gYnJlY3QuaGVpZ2h0OwogICAgICAgICAgICB2YXIgc2xpY2VIZWlnaHQsIG1hcmdpbiA9IHsgdG9wOiA1LCByaWdodDogNjAsIGJvdHRvbTogMjAsIGxlZnQ6IDI0IH07CiAgICAgICAgICAgIGlmIChtb2RlID09PSAnb2Zmc2V0JykgewogICAgICAgICAgICAgICAgc2xpY2VIZWlnaHQgPSBvdXRlckhlaWdodCAvIDIuNTsKICAgICAgICAgICAgICAgIG1hcmdpbi50b3AgPSBzbGljZUhlaWdodCArIDU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzbGljZUhlaWdodCA9IG91dGVySGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHdpZHRoID0gb3V0ZXJXaWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0LCBoZWlnaHQgPSBvdXRlckhlaWdodCAtIG1hcmdpbi50b3AgLSBtYXJnaW4uYm90dG9tOwogICAgICAgICAgICB2YXIgbGVmdE1pbiA9IGQzJDEubWluKGRhdGEsIHhBY2Nlc3NvciksIHJpZ2h0TWF4ID0gZDMkMS5tYXgoZGF0YSwgeFJpZ2h0QWNjZXNzb3IpOwogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBUZXh0IGZvcm1hdHRlcnMKICAgICAgICAgICAgLy8KICAgICAgICAgICAgdmFyIGZvcm1hdCA9IGQzJDEuZm9ybWF0KCcuM24nKTsKICAgICAgICAgICAgdmFyIHlBeGlzRm9ybWF0ID0gZDMkMS5mb3JtYXQoJy4wZicpOwogICAgICAgICAgICBpZiAodGltZVByb3AgPT09ICd3YWxsX3RpbWUnKSB7CiAgICAgICAgICAgICAgICB5QXhpc0Zvcm1hdCA9IGQzJDEudGltZUZvcm1hdCgnJW0vJWQgJVgnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aW1lUHJvcCA9PT0gJ3JlbGF0aXZlJykgewogICAgICAgICAgICAgICAgeUF4aXNGb3JtYXQgPSBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkMyQxLmZvcm1hdCgnLjFyJykoZCAvIDMuNmU2KSArICdoJzsgLy8gQ29udmVydCB0byBob3Vycy4KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHRoZSBleHRlbnRzCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIHZhciB4RXh0ZW50cyA9IGRhdGEubWFwKGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgIGQzJDEubWluKGRbYmluc1Byb3BdLCB4QWNjZXNzb3IpLAogICAgICAgICAgICAgICAgICAgIGQzJDEubWF4KGRbYmluc1Byb3BdLCB4UmlnaHRBY2Nlc3NvciksCiAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIHlFeHRlbnRzID0gZGF0YS5tYXAoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkMyQxLmV4dGVudChkW2JpbnNQcm9wXSwgeUFjY2Vzc29yKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFNjYWxlcyBhbmQgYXhpcwogICAgICAgICAgICAvLwogICAgICAgICAgICB2YXIgb3V0bGluZUNhbnZhc1NpemUgPSA1MDA7CiAgICAgICAgICAgIHZhciBleHRlbnQgPSBkMyQxLmV4dGVudChkYXRhLCB0aW1lQWNjZXNzb3IpOwogICAgICAgICAgICB2YXIgeVNjYWxlID0gKHRpbWVQcm9wID09PSAnd2FsbF90aW1lJyA/IGQzJDEuc2NhbGVUaW1lKCkgOiBkMyQxLnNjYWxlTGluZWFyKCkpCiAgICAgICAgICAgICAgICAuZG9tYWluKGV4dGVudCkKICAgICAgICAgICAgICAgIC5yYW5nZShbMCwgbW9kZSA9PT0gJ29mZnNldCcgPyBoZWlnaHQgOiAwXSk7CiAgICAgICAgICAgIHZhciB5U2xpY2VTY2FsZSA9IGQzJDEKICAgICAgICAgICAgICAgIC5zY2FsZUxpbmVhcigpCiAgICAgICAgICAgICAgICAuZG9tYWluKFsKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgICAgICBkMyQxLm1heChkYXRhLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB5RXh0ZW50c1tpXVsxXTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICBdKQogICAgICAgICAgICAgICAgLnJhbmdlKFtzbGljZUhlaWdodCwgMF0pOwogICAgICAgICAgICB2YXIgeUxpbmVTY2FsZSA9IGQzJDEKICAgICAgICAgICAgICAgIC5zY2FsZUxpbmVhcigpCiAgICAgICAgICAgICAgICAuZG9tYWluKHlTbGljZVNjYWxlLmRvbWFpbigpKQogICAgICAgICAgICAgICAgLnJhbmdlKFtvdXRsaW5lQ2FudmFzU2l6ZSwgMF0pOwogICAgICAgICAgICB2YXIgeFNjYWxlID0gZDMkMQogICAgICAgICAgICAgICAgLnNjYWxlTGluZWFyKCkKICAgICAgICAgICAgICAgIC5kb21haW4oWwogICAgICAgICAgICAgICAgZDMkMS5taW4oZGF0YSwgZnVuY3Rpb24gKGQsIGkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geEV4dGVudHNbaV1bMF07CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgIGQzJDEubWF4KGRhdGEsIGZ1bmN0aW9uIChkLCBpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHhFeHRlbnRzW2ldWzFdOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAubmljZSgpCiAgICAgICAgICAgICAgICAucmFuZ2UoWzAsIHdpZHRoXSk7CiAgICAgICAgICAgIHZhciB4TGluZVNjYWxlID0gZDMkMQogICAgICAgICAgICAgICAgLnNjYWxlTGluZWFyKCkKICAgICAgICAgICAgICAgIC5kb21haW4oeFNjYWxlLmRvbWFpbigpKQogICAgICAgICAgICAgICAgLnJhbmdlKFswLCBvdXRsaW5lQ2FudmFzU2l6ZV0pOwogICAgICAgICAgICB2YXIgb3V0bGluZUNvbG9yID0gZDMkMQogICAgICAgICAgICAgICAgLnNjYWxlTGluZWFyKCkKICAgICAgICAgICAgICAgIC5kb21haW4oZDMkMS5leHRlbnQoZGF0YSwgdGltZUFjY2Vzc29yKSkKICAgICAgICAgICAgICAgIC5yYW5nZShbY29sb3IuZGFya2VyKCksIGNvbG9yLmJyaWdodGVyKCldKQogICAgICAgICAgICAgICAgLmludGVycG9sYXRlKGQzJDEuaW50ZXJwb2xhdGVIY2wpOwogICAgICAgICAgICB2YXIgeEF4aXMgPSBkMyQxLmF4aXNCb3R0b20oeFNjYWxlKS50aWNrcyhNYXRoLm1heCgyLCB3aWR0aCAvIDIwKSk7CiAgICAgICAgICAgIHZhciB5QXhpcyA9IGQzJDEKICAgICAgICAgICAgICAgIC5heGlzUmlnaHQoeVNjYWxlKQogICAgICAgICAgICAgICAgLnRpY2tzKE1hdGgubWF4KDIsIGhlaWdodCAvIDE1KSkKICAgICAgICAgICAgICAgIC50aWNrRm9ybWF0KHlBeGlzRm9ybWF0KTsKICAgICAgICAgICAgdmFyIHlTbGljZUF4aXMgPSBkMyQxCiAgICAgICAgICAgICAgICAuYXhpc1JpZ2h0KHlTbGljZVNjYWxlKQogICAgICAgICAgICAgICAgLnRpY2tzKE1hdGgubWF4KDIsIGhlaWdodCAvIDE1KSkKICAgICAgICAgICAgICAgIC50aWNrU2l6ZSh3aWR0aCArIDUpCiAgICAgICAgICAgICAgICAudGlja0Zvcm1hdChmb3JtYXQpOwogICAgICAgICAgICB2YXIgeEJpbkNlbnRyb2lkID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkW3hQcm9wXSArIGRbZHhQcm9wXSAvIDI7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBsaW5lUGF0aCA9IGQzJDEKICAgICAgICAgICAgICAgIC5saW5lKCkKICAgICAgICAgICAgICAgIC54KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geExpbmVTY2FsZSh4QmluQ2VudHJvaWQoZCkpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnkoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB5TGluZVNjYWxlKGRbeVByb3BdKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHZhciBwYXRoID0gZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIC8vIERyYXcgYSBsaW5lIGZyb20gMCB0byB0aGUgZmlyc3QgcG9pbnQgYW5kIGZyb20gdGhlIGxhc3QgcG9pbnQgdG8gMC4KICAgICAgICAgICAgICAgIHJldHVybiAoJ00nICsKICAgICAgICAgICAgICAgICAgICB4TGluZVNjYWxlKHhCaW5DZW50cm9pZChkWzBdKSkgKwogICAgICAgICAgICAgICAgICAgICcsJyArCiAgICAgICAgICAgICAgICAgICAgeUxpbmVTY2FsZSgwKSArCiAgICAgICAgICAgICAgICAgICAgJ0wnICsKICAgICAgICAgICAgICAgICAgICBsaW5lUGF0aChkKS5zbGljZSgxKSArCiAgICAgICAgICAgICAgICAgICAgJ0wnICsKICAgICAgICAgICAgICAgICAgICB4TGluZVNjYWxlKHhCaW5DZW50cm9pZChkW2QubGVuZ3RoIC0gMV0pKSArCiAgICAgICAgICAgICAgICAgICAgJywnICsKICAgICAgICAgICAgICAgICAgICB5TGluZVNjYWxlKDApKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gUmVuZGVyCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIHZhciBzdmdOb2RlID0gdGhpcy4kLnN2ZzsKICAgICAgICAgICAgdmFyIHN2ZyA9IGQzJDEuc2VsZWN0KHN2Z05vZGUpOwogICAgICAgICAgICB2YXIgc3ZnVHJhbnNpdGlvbiA9IHN2Zy50cmFuc2l0aW9uKCkuZHVyYXRpb24oZHVyYXRpb24pOwogICAgICAgICAgICB2YXIgZyA9IHN2ZwogICAgICAgICAgICAgICAgLnNlbGVjdCgnZycpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnc21hbGwnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2lkdGggPiAwICYmIHdpZHRoIDw9IDE1MDsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdtZWRpdW0nLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2lkdGggPiAxNTAgJiYgd2lkdGggPD0gMzAwOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2xhcmdlJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpZHRoID4gMzAwOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdmFyIGdUcmFuc2l0aW9uID0gc3ZnVHJhbnNpdGlvbgogICAgICAgICAgICAgICAgLnNlbGVjdCgnZycpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgbWFyZ2luLmxlZnQgKyAnLCcgKyBtYXJnaW4udG9wICsgJyknKTsKICAgICAgICAgICAgdmFyIGJpc2VjdCA9IGQzJDEuYmlzZWN0b3IoeFJpZ2h0QWNjZXNzb3IpLmxlZnQ7CiAgICAgICAgICAgIHZhciBzdGFnZSA9IGcKICAgICAgICAgICAgICAgIC5zZWxlY3QoJy5zdGFnZScpCiAgICAgICAgICAgICAgICAub24oJ21vdXNlb3ZlcicsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGhvdmVyVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSk7CiAgICAgICAgICAgICAgICB4QXhpc0hvdmVyVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSk7CiAgICAgICAgICAgICAgICB5QXhpc0hvdmVyVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMSk7CiAgICAgICAgICAgICAgICB5U2xpY2VBeGlzSG92ZXJVcGRhdGUuc3R5bGUoJ29wYWNpdHknLCAxKTsKICAgICAgICAgICAgICAgIHRvb2x0aXAuc3R5bGUoJ29wYWNpdHknLCAxKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICBob3ZlclVwZGF0ZS5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICAgICAgICAgICAgeEF4aXNIb3ZlclVwZGF0ZS5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICAgICAgICAgICAgeUF4aXNIb3ZlclVwZGF0ZS5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICAgICAgICAgICAgeVNsaWNlQXhpc0hvdmVyVXBkYXRlLnN0eWxlKCdvcGFjaXR5JywgMCk7CiAgICAgICAgICAgICAgICBob3ZlclVwZGF0ZS5jbGFzc2VkKCdob3Zlci1jbG9zZXN0JywgZmFsc2UpOwogICAgICAgICAgICAgICAgb3V0bGluZVVwZGF0ZS5jbGFzc2VkKCdvdXRsaW5lLWhvdmVyJywgZmFsc2UpOwogICAgICAgICAgICAgICAgdG9vbHRpcC5zdHlsZSgnb3BhY2l0eScsIDApOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSk7CiAgICAgICAgICAgIHZhciBiYWNrZ3JvdW5kID0gc3RhZ2UKICAgICAgICAgICAgICAgIC5zZWxlY3QoJy5iYWNrZ3JvdW5kJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKCcgKyAtbWFyZ2luLmxlZnQgKyAnLCcgKyAtbWFyZ2luLnRvcCArICcpJykKICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIG91dGVyV2lkdGgpCiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0Jywgb3V0ZXJIZWlnaHQpOwogICAgICAgICAgICB2YXIgaGlzdG9ncmFtID0gc3RhZ2Uuc2VsZWN0QWxsKCcuaGlzdG9ncmFtJykuZGF0YShkYXRhKSwgaGlzdG9ncmFtRXhpdCA9IGhpc3RvZ3JhbS5leGl0KCkucmVtb3ZlKCksIGhpc3RvZ3JhbUVudGVyID0gaGlzdG9ncmFtLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnaGlzdG9ncmFtJyksIGhpc3RvZ3JhbVVwZGF0ZSA9IGhpc3RvZ3JhbUVudGVyLm1lcmdlKGhpc3RvZ3JhbSkuc29ydChmdW5jdGlvbiAoYSwgYikgewogICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVBY2Nlc3NvcihhKSAtIHRpbWVBY2Nlc3NvcihiKTsKICAgICAgICAgICAgfSksIGhpc3RvZ3JhbVRyYW5zaXRpb24gPSBnVHJhbnNpdGlvbgogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmhpc3RvZ3JhbScpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoJ3RyYW5zbGF0ZSgwLCAnICsKICAgICAgICAgICAgICAgICAgICAobW9kZSA9PT0gJ29mZnNldCcgPyB5U2NhbGUodGltZUFjY2Vzc29yKGQpKSAtIHNsaWNlSGVpZ2h0IDogMCkgKwogICAgICAgICAgICAgICAgICAgICcpJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgYmFzZWxpbmVFbnRlciA9IGhpc3RvZ3JhbUVudGVyLmFwcGVuZCgnbGluZScpLmF0dHIoJ2NsYXNzJywgJ2Jhc2VsaW5lJyksIGJhc2VsaW5lVXBkYXRlID0gaGlzdG9ncmFtVHJhbnNpdGlvbgogICAgICAgICAgICAgICAgLnNlbGVjdCgnLmJhc2VsaW5lJykKICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlLW9wYWNpdHknLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1vZGUgPT09ICdvZmZzZXQnID8gMC4xIDogMDsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIHNsaWNlSGVpZ2h0KQogICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgc2xpY2VIZWlnaHQpCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB3aWR0aCk7CiAgICAgICAgICAgIHZhciBvdXRsaW5lRW50ZXIgPSBoaXN0b2dyYW1FbnRlci5hcHBlbmQoJ3BhdGgnKS5hdHRyKCdjbGFzcycsICdvdXRsaW5lJyksIG91dGxpbmVVcGRhdGUgPSBoaXN0b2dyYW1VcGRhdGUKICAgICAgICAgICAgICAgIC5zZWxlY3QoJy5vdXRsaW5lJykKICAgICAgICAgICAgICAgIC5hdHRyKCd2ZWN0b3ItZWZmZWN0JywgJ25vbi1zY2FsaW5nLXN0cm9rZScpCiAgICAgICAgICAgICAgICAuYXR0cignZCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aChkW2JpbnNQcm9wXSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS13aWR0aCcsIDEpLCBvdXRsaW5lVHJhbnNpdGlvbiA9IGhpc3RvZ3JhbVRyYW5zaXRpb24KICAgICAgICAgICAgICAgIC5zZWxlY3QoJy5vdXRsaW5lJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAnc2NhbGUoJyArCiAgICAgICAgICAgICAgICB3aWR0aCAvIG91dGxpbmVDYW52YXNTaXplICsKICAgICAgICAgICAgICAgICcsICcgKwogICAgICAgICAgICAgICAgc2xpY2VIZWlnaHQgLyBvdXRsaW5lQ2FudmFzU2l6ZSArCiAgICAgICAgICAgICAgICAnKScpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZSA9PT0gJ29mZnNldCcgPyAnd2hpdGUnIDogb3V0bGluZUNvbG9yKHRpbWVBY2Nlc3NvcihkKSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuc3R5bGUoJ2ZpbGwtb3BhY2l0eScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbW9kZSA9PT0gJ29mZnNldCcgPyAxIDogMDsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0bGluZUNvbG9yKHRpbWVBY2Nlc3NvcihkKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB2YXIgaG92ZXJFbnRlciA9IGhpc3RvZ3JhbUVudGVyLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2hvdmVyJyk7CiAgICAgICAgICAgIHZhciBob3ZlclVwZGF0ZSA9IGhpc3RvZ3JhbVVwZGF0ZQogICAgICAgICAgICAgICAgLnNlbGVjdCgnLmhvdmVyJykKICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3V0bGluZUNvbG9yKHRpbWVBY2Nlc3NvcihkKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBob3ZlckVudGVyLmFwcGVuZCgnY2lyY2xlJykuYXR0cigncicsIDIpOwogICAgICAgICAgICBob3ZlckVudGVyLmFwcGVuZCgndGV4dCcpLnN0eWxlKCdkaXNwbGF5JywgJ25vbmUnKS5hdHRyKCdkeCcsIDQpOwogICAgICAgICAgICB2YXIgeEF4aXNIb3ZlciA9IGcuc2VsZWN0KCcueC1heGlzLWhvdmVyJykuc2VsZWN0QWxsKCcubGFiZWwnKS5kYXRhKFsneCddKSwgeEF4aXNIb3ZlckVudGVyID0geEF4aXNIb3Zlci5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2xhYmVsJyksIHhBeGlzSG92ZXJVcGRhdGUgPSB4QXhpc0hvdmVyLm1lcmdlKHhBeGlzSG92ZXJFbnRlcik7CiAgICAgICAgICAgIHhBeGlzSG92ZXJFbnRlcgogICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpCiAgICAgICAgICAgICAgICAuYXR0cigneCcsIC0yMCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgNikKICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIDQwKQogICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDE0KTsKICAgICAgICAgICAgeEF4aXNIb3ZlckVudGVyCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdsaW5lJykKICAgICAgICAgICAgICAgIC5hdHRyKCd4MScsIDApCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCAwKQogICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgMCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIDYpOwogICAgICAgICAgICB4QXhpc0hvdmVyRW50ZXIuYXBwZW5kKCd0ZXh0JykuYXR0cignZHknLCAxOCk7CiAgICAgICAgICAgIHZhciB5QXhpc0hvdmVyID0gZy5zZWxlY3QoJy55LWF4aXMtaG92ZXInKS5zZWxlY3RBbGwoJy5sYWJlbCcpLmRhdGEoWyd5J10pLCB5QXhpc0hvdmVyRW50ZXIgPSB5QXhpc0hvdmVyLmVudGVyKCkuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnbGFiZWwnKSwgeUF4aXNIb3ZlclVwZGF0ZSA9IHlBeGlzSG92ZXIubWVyZ2UoeUF4aXNIb3ZlckVudGVyKTsKICAgICAgICAgICAgeUF4aXNIb3ZlckVudGVyCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgOCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgLTYpCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCA0MCkKICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCAxNCk7CiAgICAgICAgICAgIHlBeGlzSG92ZXJFbnRlcgogICAgICAgICAgICAgICAgLmFwcGVuZCgnbGluZScpCiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgNikKICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApCiAgICAgICAgICAgICAgICAuYXR0cigneTInLCAwKTsKICAgICAgICAgICAgeUF4aXNIb3ZlckVudGVyLmFwcGVuZCgndGV4dCcpLmF0dHIoJ2R4JywgOCkuYXR0cignZHknLCA0KTsKICAgICAgICAgICAgdmFyIHlTbGljZUF4aXNIb3ZlciA9IGcKICAgICAgICAgICAgICAgIC5zZWxlY3QoJy55LXNsaWNlLWF4aXMtaG92ZXInKQogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmxhYmVsJykKICAgICAgICAgICAgICAgIC5kYXRhKFsneSddKSwgeVNsaWNlQXhpc0hvdmVyRW50ZXIgPSB5U2xpY2VBeGlzSG92ZXIKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdsYWJlbCcpLCB5U2xpY2VBeGlzSG92ZXJVcGRhdGUgPSB5U2xpY2VBeGlzSG92ZXIubWVyZ2UoeVNsaWNlQXhpc0hvdmVyRW50ZXIpOwogICAgICAgICAgICB5U2xpY2VBeGlzSG92ZXJFbnRlcgogICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpCiAgICAgICAgICAgICAgICAuYXR0cigneCcsIDgpCiAgICAgICAgICAgICAgICAuYXR0cigneScsIC02KQogICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgNDApCiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgMTQpOwogICAgICAgICAgICB5U2xpY2VBeGlzSG92ZXJFbnRlcgogICAgICAgICAgICAgICAgLmFwcGVuZCgnbGluZScpCiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgNikKICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIDApCiAgICAgICAgICAgICAgICAuYXR0cigneTInLCAwKTsKICAgICAgICAgICAgeVNsaWNlQXhpc0hvdmVyRW50ZXIuYXBwZW5kKCd0ZXh0JykuYXR0cignZHgnLCA4KS5hdHRyKCdkeScsIDQpOwogICAgICAgICAgICBnVHJhbnNpdGlvbgogICAgICAgICAgICAgICAgLnNlbGVjdCgnLnkuYXhpcy5zbGljZScpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCBtb2RlID09PSAnb2Zmc2V0JyA/IDAgOiAxKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICd0cmFuc2xhdGUoMCwgJyArIChtb2RlID09PSAnb2Zmc2V0JyA/IC1zbGljZUhlaWdodCA6IDApICsgJyknKQogICAgICAgICAgICAgICAgLmNhbGwoeVNsaWNlQXhpcyk7CiAgICAgICAgICAgIGdUcmFuc2l0aW9uCiAgICAgICAgICAgICAgICAuc2VsZWN0KCcueC5heGlzJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAndHJhbnNsYXRlKDAsICcgKyBoZWlnaHQgKyAnKScpCiAgICAgICAgICAgICAgICAuY2FsbCh4QXhpcyk7CiAgICAgICAgICAgIGdUcmFuc2l0aW9uCiAgICAgICAgICAgICAgICAuc2VsZWN0KCcueS5heGlzJykKICAgICAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIG1vZGUgPT09ICdvZmZzZXQnID8gMSA6IDApCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgd2lkdGggKyAnLCAnICsgKG1vZGUgPT09ICdvZmZzZXQnID8gMCA6IGhlaWdodCkgKyAnKScpCiAgICAgICAgICAgICAgICAuY2FsbCh5QXhpcyk7CiAgICAgICAgICAgIGdUcmFuc2l0aW9uLnNlbGVjdEFsbCgnLnRpY2sgdGV4dCcpLmF0dHIoJ2ZpbGwnLCAnI2FhYScpOwogICAgICAgICAgICBnVHJhbnNpdGlvbi5zZWxlY3RBbGwoJy5heGlzIHBhdGguZG9tYWluJykuYXR0cignc3Ryb2tlJywgJ25vbmUnKTsKICAgICAgICAgICAgZnVuY3Rpb24gb25Nb3VzZU1vdmUoKSB7CiAgICAgICAgICAgICAgICB2YXIgbSA9IGQzJDEubW91c2UodGhpcyksIHYgPSB4U2NhbGUuaW52ZXJ0KG1bMF0pLCB0ID0geVNjYWxlLmludmVydChtWzFdKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGhvdmVyWEluZGV4KGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oZFtiaW5zUHJvcF0ubGVuZ3RoIC0gMSwgYmlzZWN0KGRbYmluc1Byb3BdLCB2KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgY2xvc2VzdFNsaWNlRGF0YTsKICAgICAgICAgICAgICAgIHZhciBjbG9zZXN0U2xpY2VEaXN0YW5jZSA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgdmFyIGxhc3RTbGljZURhdGE7CiAgICAgICAgICAgICAgICBob3ZlclVwZGF0ZS5hdHRyKCd0cmFuc2Zvcm0nLCBmdW5jdGlvbiAoZCwgaSkgewogICAgICAgICAgICAgICAgICAgIHZhciBpbmRleCA9IGhvdmVyWEluZGV4KGQpOwogICAgICAgICAgICAgICAgICAgIGxhc3RTbGljZURhdGEgPSBkOwogICAgICAgICAgICAgICAgICAgIHZhciB4ID0geFNjYWxlKGRbYmluc1Byb3BdW2luZGV4XVt4UHJvcF0gKyBkW2JpbnNQcm9wXVtpbmRleF1bZHhQcm9wXSAvIDIpOwogICAgICAgICAgICAgICAgICAgIHZhciB5ID0geVNsaWNlU2NhbGUoZFtiaW5zUHJvcF1baW5kZXhdW3lQcm9wXSk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGdsb2JhbFkgPSBtb2RlID09PSAnb2Zmc2V0JyA/IHlTY2FsZSh0aW1lQWNjZXNzb3IoZCkpIC0gKHNsaWNlSGVpZ2h0IC0geSkgOiB5OwogICAgICAgICAgICAgICAgICAgIHZhciBkaXN0ID0gTWF0aC5hYnMobVsxXSAtIGdsb2JhbFkpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaXN0IDwgY2xvc2VzdFNsaWNlRGlzdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VzdFNsaWNlRGlzdGFuY2UgPSBkaXN0OwogICAgICAgICAgICAgICAgICAgICAgICBjbG9zZXN0U2xpY2VEYXRhID0gZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHggKyAnLCcgKyB5ICsgJyknOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBob3ZlclVwZGF0ZS5zZWxlY3QoJ3RleHQnKS50ZXh0KGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gaG92ZXJYSW5kZXgoZCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRbYmluc1Byb3BdW2luZGV4XVt5UHJvcF07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGhvdmVyVXBkYXRlLmNsYXNzZWQoJ2hvdmVyLWNsb3Nlc3QnLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkID09PSBjbG9zZXN0U2xpY2VEYXRhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBvdXRsaW5lVXBkYXRlLmNsYXNzZWQoJ291dGxpbmUtaG92ZXInLCBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkID09PSBjbG9zZXN0U2xpY2VEYXRhOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgaW5kZXggPSBob3ZlclhJbmRleChsYXN0U2xpY2VEYXRhKTsKICAgICAgICAgICAgICAgIHhBeGlzSG92ZXJVcGRhdGUKICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCd0cmFuc2xhdGUoJyArCiAgICAgICAgICAgICAgICAgICAgICAgIHhTY2FsZShsYXN0U2xpY2VEYXRhW2JpbnNQcm9wXVtpbmRleF1beFByb3BdICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RTbGljZURhdGFbYmluc1Byb3BdW2luZGV4XVtkeFByb3BdIC8gMikgKwogICAgICAgICAgICAgICAgICAgICAgICAnLCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICsKICAgICAgICAgICAgICAgICAgICAgICAgJyknKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgndGV4dCcpCiAgICAgICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0KGxhc3RTbGljZURhdGFbYmluc1Byb3BdW2luZGV4XVt4UHJvcF0gKwogICAgICAgICAgICAgICAgICAgICAgICBsYXN0U2xpY2VEYXRhW2JpbnNQcm9wXVtpbmRleF1bZHhQcm9wXSAvIDIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgZnkgPSB5QXhpcy50aWNrRm9ybWF0KCk7CiAgICAgICAgICAgICAgICB5QXhpc0hvdmVyVXBkYXRlCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgndHJhbnNsYXRlKCcgKwogICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCArCiAgICAgICAgICAgICAgICAgICAgICAgICcsICcgKwogICAgICAgICAgICAgICAgICAgICAgICAobW9kZSA9PT0gJ29mZnNldCcgPyB5U2NhbGUodGltZUFjY2Vzc29yKGNsb3Nlc3RTbGljZURhdGEpKSA6IDApICsKICAgICAgICAgICAgICAgICAgICAgICAgJyknKTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgICAgLnN0eWxlKCdkaXNwbGF5JywgbW9kZSA9PT0gJ29mZnNldCcgPyAnJyA6ICdub25lJykKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCd0ZXh0JykKICAgICAgICAgICAgICAgICAgICAudGV4dChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmeSh0aW1lQWNjZXNzb3IoY2xvc2VzdFNsaWNlRGF0YSkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgZnN5ID0geVNsaWNlQXhpcy50aWNrRm9ybWF0KCk7CiAgICAgICAgICAgICAgICB5U2xpY2VBeGlzSG92ZXJVcGRhdGUKICAgICAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCd0cmFuc2xhdGUoJyArCiAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoICsKICAgICAgICAgICAgICAgICAgICAgICAgJywgJyArCiAgICAgICAgICAgICAgICAgICAgICAgIChtb2RlID09PSAnb2Zmc2V0JwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHlTbGljZVNjYWxlKGNsb3Nlc3RTbGljZURhdGFbYmluc1Byb3BdW2luZGV4XVt5UHJvcF0pKSArCiAgICAgICAgICAgICAgICAgICAgICAgICcpJyk7CiAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgICAgIC5zdHlsZSgnZGlzcGxheScsIG1vZGUgPT09ICdvZmZzZXQnID8gJ25vbmUnIDogJycpCiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdCgndGV4dCcpCiAgICAgICAgICAgICAgICAgICAgLnRleHQoZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnN5KGNsb3Nlc3RTbGljZURhdGFbYmluc1Byb3BdW2luZGV4XVt5UHJvcF0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgc3ZnTW91c2UgPSBkMyQxLm1vdXNlKHN2Z05vZGUpOwogICAgICAgICAgICAgICAgdG9vbHRpcAogICAgICAgICAgICAgICAgICAgIC5zdHlsZSgndHJhbnNmb3JtJywgJ3RyYW5zbGF0ZSgnICsgKHN2Z01vdXNlWzBdICsgMTUpICsgJ3B4LCcgKyAoc3ZnTW91c2VbMV0gLSAxNSkgKyAncHgpJykKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0KCdzcGFuJykKICAgICAgICAgICAgICAgICAgICAudGV4dChtb2RlID09PSAnb2Zmc2V0JwogICAgICAgICAgICAgICAgICAgID8gZnN5KGNsb3Nlc3RTbGljZURhdGFbYmluc1Byb3BdW2luZGV4XVt5UHJvcF0pCiAgICAgICAgICAgICAgICAgICAgOiAodGltZVByb3AgPT09ICdzdGVwJyA/ICdzdGVwICcgOiAnJykgKwogICAgICAgICAgICAgICAgICAgICAgICBmeSh0aW1lQWNjZXNzb3IoY2xvc2VzdFNsaWNlRGF0YSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGlkPSJ0b29sdGlwIj48c3Bhbj48L3NwYW4+PC9kaXY+CiAgICA8c3ZnIGlkPSJzdmciPgogICAgICA8Zz4KICAgICAgICA8ZyBjbGFzcz0iYXhpcyB4Ij48L2c+CiAgICAgICAgPGcgY2xhc3M9ImF4aXMgeSI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJheGlzIHkgc2xpY2UiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ic3RhZ2UiPgogICAgICAgICAgPHJlY3QgY2xhc3M9ImJhY2tncm91bmQiPjwvcmVjdD4KICAgICAgICA8L2c+CiAgICAgICAgPGcgY2xhc3M9IngtYXhpcy1ob3ZlciI+PC9nPgogICAgICAgIDxnIGNsYXNzPSJ5LWF4aXMtaG92ZXIiPjwvZz4KICAgICAgICA8ZyBjbGFzcz0ieS1zbGljZS1heGlzLWhvdmVyIj48L2c+CiAgICAgIDwvZz4KICAgIDwvc3ZnPgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICB9CgogICAgICBzdmcgewogICAgICAgIGZvbnQtZmFtaWx5OiByb2JvdG8sIHNhbnMtc2VyaWY7CiAgICAgICAgb3ZlcmZsb3c6IHZpc2libGU7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZsZXgtc2hyaW5rOiAxOwogICAgICB9CgogICAgICAjdG9vbHRpcCB7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICB9CgogICAgICAuYmFja2dyb3VuZCB7CiAgICAgICAgZmlsbC1vcGFjaXR5OiAwOwogICAgICAgIGZpbGw6IHJlZDsKICAgICAgfQoKICAgICAgLmhpc3RvZ3JhbSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC5ob3ZlciB7CiAgICAgICAgZm9udC1zaXplOiA5cHg7CiAgICAgICAgZG9taW5hbnQtYmFzZWxpbmU6IG1pZGRsZTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAuaG92ZXIgY2lyY2xlIHsKICAgICAgICBzdHJva2U6IHdoaXRlOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjU7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxcHg7CiAgICAgIH0KCiAgICAgIC5ob3ZlciB0ZXh0IHsKICAgICAgICBmaWxsOiBibGFjazsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAuaG92ZXIuaG92ZXItY2xvc2VzdCBjaXJjbGUgewogICAgICAgIGZpbGw6IGJsYWNrICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC5ob3Zlci5ob3Zlci1jbG9zZXN0IHRleHQgewogICAgICAgIG9wYWNpdHk6IDE7CiAgICAgIH0KCiAgICAgIC5iYXNlbGluZSB7CiAgICAgICAgc3Ryb2tlOiBibGFjazsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMC4xOwogICAgICB9CgogICAgICAub3V0bGluZSB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6IHdoaXRlOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjU7CiAgICAgIH0KCiAgICAgIC5vdXRsaW5lLm91dGxpbmUtaG92ZXIgewogICAgICAgIHN0cm9rZTogYmxhY2sgIWltcG9ydGFudDsKICAgICAgICBzdHJva2Utb3BhY2l0eTogMTsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciwKICAgICAgLnktYXhpcy1ob3ZlciwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgLmxhYmVsLAogICAgICAueS1heGlzLWhvdmVyIC5sYWJlbCwKICAgICAgLnktc2xpY2UtYXhpcy1ob3ZlciAubGFiZWwgewogICAgICAgIG9wYWNpdHk6IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgZm9udC1zaXplOiAxMXB4OwogICAgICAgIHRleHQtYW5jaG9yOiBlbmQ7CiAgICAgIH0KCiAgICAgIC54LWF4aXMtaG92ZXIgdGV4dCB7CiAgICAgICAgdGV4dC1hbmNob3I6IG1pZGRsZTsKICAgICAgfQoKICAgICAgLnktYXhpcy1ob3ZlciB0ZXh0LAogICAgICAueS1zbGljZS1heGlzLWhvdmVyIHRleHQgewogICAgICAgIHRleHQtYW5jaG9yOiBzdGFydDsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciBsaW5lLAogICAgICAueS1heGlzLWhvdmVyIGxpbmUsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgbGluZSB7CiAgICAgICAgc3Ryb2tlOiBibGFjazsKICAgICAgfQoKICAgICAgLngtYXhpcy1ob3ZlciByZWN0LAogICAgICAueS1heGlzLWhvdmVyIHJlY3QsCiAgICAgIC55LXNsaWNlLWF4aXMtaG92ZXIgcmVjdCB7CiAgICAgICAgZmlsbDogd2hpdGU7CiAgICAgIH0KCiAgICAgIC5heGlzIHsKICAgICAgICBmb250LXNpemU6IDExcHg7CiAgICAgIH0KCiAgICAgIC5heGlzIHBhdGguZG9tYWluIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICB9CgogICAgICAuYXhpcyAudGljayBsaW5lIHsKICAgICAgICBzdHJva2U6ICNkZGQ7CiAgICAgIH0KCiAgICAgIC5heGlzLnNsaWNlIHsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICAuYXhpcy5zbGljZSAudGljayBsaW5lIHsKICAgICAgICBzdHJva2UtZGFzaGFycmF5OiAyOwogICAgICB9CgogICAgICAuc21hbGwgLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6Zmlyc3Qtb2YtdHlwZSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuc21hbGwgLmF4aXMgLnRpY2s6bGFzdC1vZi10eXBlIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5tZWRpdW0gLmF4aXMgdGV4dCB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgICAubWVkaXVtIC5heGlzIC50aWNrOm50aC1jaGlsZCgybiArIDEpIHRleHQgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CiAgICAgIC5sYXJnZSAuYXhpcyAudGljazpudGgtY2hpbGQoMm4gKyAxKSB0ZXh0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnByb3RvdHlwZSwgIm1vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnByb3RvdHlwZSwgInRpbWVQcm9wZXJ0eSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9Wekhpc3RvZ3JhbVRpbWVzZXJpZXMucHJvdG90eXBlLCAiYmlucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9Wekhpc3RvZ3JhbVRpbWVzZXJpZXMucHJvdG90eXBlLCAieCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9Wekhpc3RvZ3JhbVRpbWVzZXJpZXMucHJvdG90eXBlLCAiZHgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnByb3RvdHlwZSwgInkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnByb3RvdHlwZSwgImNvbG9yU2NhbGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnByb3RvdHlwZSwgIm1vZGVUcmFuc2l0aW9uRHVyYXRpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9Wekhpc3RvZ3JhbVRpbWVzZXJpZXMucHJvdG90eXBlLCAiX2F0dGFjaGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgX1Z6SGlzdG9ncmFtVGltZXNlcmllcy5wcm90b3R5cGUsICJfbmFtZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzLnByb3RvdHlwZSwgIl9kYXRhIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3RpbWVQcm9wZXJ0eScsICdjb2xvclNjYWxlJywgJ19hdHRhY2hlZCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgX1Z6SGlzdG9ncmFtVGltZXNlcmllcy5wcm90b3R5cGUsICJfcmVkcmF3T25DaGFuZ2UiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ21vZGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIF9Wekhpc3RvZ3JhbVRpbWVzZXJpZXMucHJvdG90eXBlLCAiX21vZGVSZWRyYXciLCBudWxsKTsKICAgIF9Wekhpc3RvZ3JhbVRpbWVzZXJpZXMgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd2ei1oaXN0b2dyYW0tdGltZXNlcmllcycpCiAgICBdLCBfVnpIaXN0b2dyYW1UaW1lc2VyaWVzKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGZ1bmN0aW9uIGJhY2tlbmRUb0ludGVybWVkaWF0ZShoaXN0b2dyYW0pIHsKICAgICAgICBjb25zdCBbd2FsbF90aW1lLCBzdGVwLCBidWNrZXRzXSA9IGhpc3RvZ3JhbTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB3YWxsX3RpbWUsCiAgICAgICAgICAgIHN0ZXAsCiAgICAgICAgICAgIG1pbjogbWluKGJ1Y2tldHMubWFwKChbbGVmdCwgLF0pID0+IGxlZnQpKSwKICAgICAgICAgICAgbWF4OiBtYXgoYnVja2V0cy5tYXAoKFssIHJpZ2h0XSkgPT4gcmlnaHQpKSwKICAgICAgICAgICAgYnVja2V0czogYnVja2V0cy5tYXAoKFtsZWZ0LCByaWdodCwgY291bnRdKSA9PiAoeyBsZWZ0LCByaWdodCwgY291bnQgfSkpLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnQgaGlzdG9ncmFtIGRhdGEgdG8gdGhlIHN0YW5kYXJkIEQzIGZvcm1hdCB0byBtYWtlIGl0IG1vcmUKICAgICAqIGNvbXBhdGlibGUgYW5kIGVhc2llciB0byB2aXN1YWxpemUuIFdoZW4gcmVuZGVyaW5nIGhpc3RvZ3JhbXMsIGhhdmluZwogICAgICogYWNjZXNzIHRvIHRoZSBsZWZ0IGVkZ2UgYW5kIHdpZHRoIG9mIGVhY2ggYmluIG1ha2VzIHRoaW5ncyBxdWl0ZSBhCiAgICAgKiBiaXQgZWFzaWVyLCBzbyB3ZSBpbmNsdWRlIHRoZXNlIGluIHRoZSByZXN1bHQuIFdlIGFsc28gY29udmVydCB0aGUKICAgICAqIGJpbnMgdG8gaGF2ZSBhIHVuaWZvcm0gd2lkdGgsIHdoaWNoIG1ha2VzIHRoZSB2aXN1YWxpemF0aW9uIGVhc2llciB0bwogICAgICogdW5kZXJzdGFuZC4KICAgICAqCiAgICAgKiBAcGFyYW0gaGlzdG9ncmFtCiAgICAgKiBAcGFyYW0gbWluIFRoZSBsZWZ0bW9zdCBlZGdlLiBUaGUgYmlubmluZyB3aWxsIHN0YXJ0IG9uIGl0LgogICAgICogQHBhcmFtIG1heCBUaGUgcmlnaHRtb3N0IGVkZ2UuIFRoZSBiaW5uaW5nIHdpbGwgZW5kIG9uIGl0LgogICAgICogQHBhcmFtIG51bUJpbnMgVGhlIG51bWJlciBvZiBiaW5zIG9mIHRoZSBjb252ZXJ0ZWQgZGF0YS4gVGhlIGRlZmF1bHQKICAgICAqIG9mIDMwIGlzIHNlbnNpYmxlOiBpZiB5b3UgdXNlIG1vcmUsIHlvdSBzdGFydCB0byBnZXQgYXJ0aWZhY3RzCiAgICAgKiBiZWNhdXNlIHRoZSBldmVudCBkYXRhIGlzIHN0b3JlZCBpbiBidWNrZXRzLCBhbmQgeW91IHN0YXJ0IGJlaW5nIGFibGUKICAgICAqIHRvIHNlZSB0aGUgYWxpYXNlZCBib3JkZXJzIGJldHdlZW4gZWFjaCBidWNrZXQuCiAgICAgKgogICAgICogQHJldHVybiBBIGxpc3Qgb2YgaGlzdG9ncmFtIGJpbnMuIEVhY2ggYmluIGhhcyBhbiBgeGAgKGxlZnQKICAgICAqICAgICBlZGdlKSwgYSBgZHhgICh3aWR0aCksIGFuZCBhIGB5YCAoY291bnQpLiBJZiB0aGUgZ2l2ZW4KICAgICAqICAgICByaWdodCBlZGdlcyBhcmUgaW5jbHVzaXZlLCB0aGVuIHRoZXNlIGxlZnQgZWRnZXMgKGB4YCkgYXJlCiAgICAgKiAgICAgZXhjbHVzaXZlLgogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcm1lZGlhdGVUb0QzKGhpc3RvZ3JhbSwgbWluLCBtYXgsIG51bUJpbnMgPSAzMCkgewogICAgICAgIGlmIChtYXggPT09IG1pbikgewogICAgICAgICAgICAvLyBDcmVhdGUgYmlucyBldmVuIGlmIGFsbCB0aGUgZGF0YSBoYXMgYSBzaW5nbGUgdmFsdWUuCiAgICAgICAgICAgIG1heCA9IG1pbiAqIDEuMSArIDE7CiAgICAgICAgICAgIG1pbiA9IG1pbiAvIDEuMSAtIDE7CiAgICAgICAgfQogICAgICAgIC8vIFRlcm1pbm9sb2d5IG5vdGU6IF9idWNrZXRzXyBhcmUgdGhlIGlucHV0IHRvIHRoaXMgZnVuY3Rpb24sCiAgICAgICAgLy8gd2hpbGUgX2JpbnNfIGFyZSBvdXIgb3V0cHV0LgogICAgICAgIGNvbnN0IGJpbldpZHRoID0gKG1heCAtIG1pbikgLyBudW1CaW5zOwogICAgICAgIGxldCBidWNrZXRJbmRleCA9IDA7CiAgICAgICAgcmV0dXJuIHNlcXVlbmNlKG1pbiwgbWF4LCBiaW5XaWR0aCkubWFwKChiaW5MZWZ0KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGJpblJpZ2h0ID0gYmluTGVmdCArIGJpbldpZHRoOwogICAgICAgICAgICAvLyBUYWtlIHRoZSBjb3VudCBvZiBlYWNoIGV4aXN0aW5nIGJ1Y2tldCwgbXVsdGlwbHkgaXQgYnkgdGhlCiAgICAgICAgICAgIC8vIHByb3BvcnRpb24gb2Ygb3ZlcmxhcCB3aXRoIHRoZSBuZXcgYmluLCB0aGVuIHN1bSBhbmQgc3RvcmUgYXMgdGhlCiAgICAgICAgICAgIC8vIGNvdW50IGZvciB0aGUgbmV3IGJpbi4gSWYgbm8gb3ZlcmxhcCwgd2lsbCBhZGQgdG8gemVybzsgaWYgMTAwJQogICAgICAgICAgICAvLyBvdmVybGFwLCB3aWxsIGluY2x1ZGUgdGhlIGZ1bGwgY291bnQgaW50byBuZXcgYmluLgogICAgICAgICAgICBsZXQgYmluWSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChidWNrZXRJbmRleCA8IGhpc3RvZ3JhbS5idWNrZXRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy8gQ2xpcCB0aGUgcmlnaHQgZWRnZSBiZWNhdXNlIHJpZ2h0LW1vc3QgZWRnZSBjYW4gYmUKICAgICAgICAgICAgICAgIC8vIGluZmluaXRlLXNpemVkLgogICAgICAgICAgICAgICAgY29uc3QgYnVja2V0UmlnaHQgPSBNYXRoLm1pbihtYXgsIGhpc3RvZ3JhbS5idWNrZXRzW2J1Y2tldEluZGV4XS5yaWdodCk7CiAgICAgICAgICAgICAgICBjb25zdCBidWNrZXRMZWZ0ID0gTWF0aC5tYXgobWluLCBoaXN0b2dyYW0uYnVja2V0c1tidWNrZXRJbmRleF0ubGVmdCk7CiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcnNlY3QgPSBNYXRoLm1pbihidWNrZXRSaWdodCwgYmluUmlnaHQpIC0gTWF0aC5tYXgoYnVja2V0TGVmdCwgYmluTGVmdCk7CiAgICAgICAgICAgICAgICBjb25zdCBjb3VudCA9IChpbnRlcnNlY3QgLyAoYnVja2V0UmlnaHQgLSBidWNrZXRMZWZ0KSkgKgogICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbS5idWNrZXRzW2J1Y2tldEluZGV4XS5jb3VudDsKICAgICAgICAgICAgICAgIGJpblkgKz0gaW50ZXJzZWN0ID4gMCA/IGNvdW50IDogMDsKICAgICAgICAgICAgICAgIC8vIElmIGBidWNrZXRSaWdodGAgaXMgYmlnZ2VyIHRoYW4gYGJpblJpZ2h0YCwgdGhlbiB0aGlzIGJpbiBpcwogICAgICAgICAgICAgICAgLy8gZmluaXNoZWQgYW5kIHRoZXJlIGlzIGRhdGEgZm9yIHRoZSBuZXh0IGJpbiwgc28gZG9uJ3QgaW5jcmVtZW50CiAgICAgICAgICAgICAgICAvLyBgYnVja2V0SW5kZXhgLgogICAgICAgICAgICAgICAgaWYgKGJ1Y2tldFJpZ2h0ID4gYmluUmlnaHQpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJ1Y2tldEluZGV4Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgeDogYmluTGVmdCwgZHg6IGJpbldpZHRoLCB5OiBiaW5ZIH07CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBiYWNrZW5kVG9WeihoaXN0b2dyYW1zKSB7CiAgICAgICAgY29uc3QgaW50ZXJtZWRpYXRlSGlzdG9ncmFtcyA9IGhpc3RvZ3JhbXMubWFwKGJhY2tlbmRUb0ludGVybWVkaWF0ZSk7CiAgICAgICAgY29uc3QgbWlubWluID0gbWluKGludGVybWVkaWF0ZUhpc3RvZ3JhbXMsIChoKSA9PiBoLm1pbik7CiAgICAgICAgY29uc3QgbWF4bWF4ID0gbWF4KGludGVybWVkaWF0ZUhpc3RvZ3JhbXMsIChoKSA9PiBoLm1heCk7CiAgICAgICAgcmV0dXJuIGludGVybWVkaWF0ZUhpc3RvZ3JhbXMubWFwKChoKSA9PiAoewogICAgICAgICAgICB3YWxsX3RpbWU6IGgud2FsbF90aW1lLAogICAgICAgICAgICBzdGVwOiBoLnN0ZXAsCiAgICAgICAgICAgIGJpbnM6IGludGVybWVkaWF0ZVRvRDMoaCwgbWlubWluLCBtYXhtYXgpLAogICAgICAgIH0pKTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBfVGZIaXN0b2dyYW1Mb2FkZXIgPSBjbGFzcyBfVGZIaXN0b2dyYW1Mb2FkZXIgZXh0ZW5kcyBEYXRhTG9hZGVyQmVoYXZpb3IoTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLmdldERhdGFMb2FkTmFtZSA9ICh7IHJ1biB9KSA9PiBydW47CiAgICAgICAgICAgIHRoaXMucmVxdWVzdERhdGEgPSAoaXRlbXMsIG9uTG9hZCwgb25GaW5pc2gpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGdldFJvdXRlcigpOwogICAgICAgICAgICAgICAgY29uc3QgYmFzZVVybCA9IHJvdXRlci5wbHVnaW5Sb3V0ZSgnaGlzdG9ncmFtcycsICcvaGlzdG9ncmFtcycpOwogICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoaXRlbXMubWFwKChpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gYWRkUGFyYW1zKGJhc2VVcmwsIHsgdGFnOiBpdGVtLnRhZywgcnVuOiBpdGVtLnJ1biB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0TWFuYWdlcgogICAgICAgICAgICAgICAgICAgICAgICAucmVxdWVzdCh1cmwpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB2b2lkIG9uTG9hZCh7IGl0ZW0sIGRhdGEgfSkpOwogICAgICAgICAgICAgICAgfSkpLmZpbmFsbHkoKCkgPT4gdm9pZCBvbkZpbmlzaCgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5sb2FkRGF0YUNhbGxiYWNrID0gKF8sIGRhdHVtLCBkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBkM0RhdGEgPSBiYWNrZW5kVG9WeihkYXRhKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLmdldERhdGFMb2FkTmFtZShkYXR1bSk7CiAgICAgICAgICAgICAgICB0aGlzLiQuY2hhcnQuc2V0U2VyaWVzRGF0YShuYW1lLCBkM0RhdGEpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9jb2xvclNjYWxlRnVuY3Rpb24gPSBydW5zQ29sb3JTY2FsZTsKICAgICAgICAgICAgdGhpcy5fZXhwYW5kZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX3JlbG9hZE9uUnVuVGFnUmVxdWVzdE1hbmFnZXJDaGFuZ2UoKSB7CiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVEYXRhVG9Mb2FkKCkgewogICAgICAgICAgICB2YXIgcnVuID0gdGhpcy5ydW47CiAgICAgICAgICAgIHZhciB0YWcgPSB0aGlzLnRhZzsKICAgICAgICAgICAgdGhpcy5kYXRhVG9Mb2FkID0gW3sgcnVuLCB0YWcgfV07CiAgICAgICAgfQogICAgICAgIGdldCBfcnVuQ29sb3IoKSB7CiAgICAgICAgICAgIHZhciBydW4gPSB0aGlzLnJ1bjsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihydW4pOwogICAgICAgIH0KICAgICAgICByZWRyYXcoKSB7CiAgICAgICAgICAgIHRoaXMuJC5jaGFydC5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUV4cGFuZGVkKGUpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19leHBhbmRlZCcsICF0aGlzLl9leHBhbmRlZCk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgfTsKICAgIF9UZkhpc3RvZ3JhbUxvYWRlci50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIHJ1bj0iW1tydW5dXSIKICAgICAgZGlzcGxheS1uYW1lPSJbW3RhZ01ldGFkYXRhLmRpc3BsYXlOYW1lXV0iCiAgICAgIGRlc2NyaXB0aW9uPSJbW3RhZ01ldGFkYXRhLmRlc2NyaXB0aW9uXV0iCiAgICAgIGNvbG9yPSJbW19ydW5Db2xvcl1dIgogICAgPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPCEtLQogICAgICBUaGUgbWFpbiBoaXN0b2dyYW0gdGhhdCB3ZSByZW5kZXIuIERhdGEgaXMgc2V0IGRpcmVjdGx5IHdpdGgKICAgICAgXGBzZXRTZXJpZXNEYXRhXGAsIG5vdCB3aXRoIGEgYm91bmQgcHJvcGVydHkuCiAgICAtLT4KICAgIDx2ei1oaXN0b2dyYW0tdGltZXNlcmllcwogICAgICBpZD0iY2hhcnQiCiAgICAgIHRpbWUtcHJvcGVydHk9IltbdGltZVByb3BlcnR5XV0iCiAgICAgIG1vZGU9IltbaGlzdG9ncmFtTW9kZV1dIgogICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iCiAgICA+PC92ei1oaXN0b2dyYW0tdGltZXNlcmllcz4KICAgIDxkaXYgc3R5bGU9ImRpc3BsYXk6IGZsZXg7IGZsZXgtZGlyZWN0aW9uOiByb3c7Ij4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgc2VsZWN0ZWQkPSJbW19leHBhbmRlZF1dIgogICAgICAgIGljb249ImZ1bGxzY3JlZW4iCiAgICAgICAgb24tdGFwPSJfdG9nZ2xlRXhwYW5kZWQiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDMzMHB4OwogICAgICAgIGhlaWdodDogMjM1cHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHsKICAgICAgICB3aWR0aDogNzAwcHg7CiAgICAgICAgaGVpZ2h0OiA1MDBweDsKICAgICAgfQoKICAgICAgdnotaGlzdG9ncmFtLXRpbWVzZXJpZXMgewogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLXdlYmtpdC11c2VyLXNlbGVjdDogbm9uZTsKICAgICAgICB3aWxsLWNoYW5nZTogdHJhbnNmb3JtOwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgICB3aWR0aDogOTAlOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIF9UZkhpc3RvZ3JhbUxvYWRlci5wcm90b3R5cGUsICJydW4iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZIaXN0b2dyYW1Mb2FkZXIucHJvdG90eXBlLCAidGFnIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmSGlzdG9ncmFtTG9hZGVyLnByb3RvdHlwZSwgImdldERhdGFMb2FkTmFtZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgX1RmSGlzdG9ncmFtTG9hZGVyLnByb3RvdHlwZSwgInJlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgX1RmSGlzdG9ncmFtTG9hZGVyLnByb3RvdHlwZSwgImxvYWREYXRhQ2FsbGJhY2siLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBfVGZIaXN0b2dyYW1Mb2FkZXIucHJvdG90eXBlLCAidGFnTWV0YWRhdGEiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBfVGZIaXN0b2dyYW1Mb2FkZXIucHJvdG90eXBlLCAidGltZVByb3BlcnR5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgX1RmSGlzdG9ncmFtTG9hZGVyLnByb3RvdHlwZSwgImhpc3RvZ3JhbU1vZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbikKICAgIF0sIF9UZkhpc3RvZ3JhbUxvYWRlci5wcm90b3R5cGUsICJfY29sb3JTY2FsZUZ1bmN0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiwgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIF9UZkhpc3RvZ3JhbUxvYWRlci5wcm90b3R5cGUsICJfZXhwYW5kZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgncnVuJywgJ3RhZycsICdyZXF1ZXN0TWFuYWdlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgX1RmSGlzdG9ncmFtTG9hZGVyLnByb3RvdHlwZSwgIl9yZWxvYWRPblJ1blRhZ1JlcXVlc3RNYW5hZ2VyQ2hhbmdlIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdydW4nLCAndGFnJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBfVGZIaXN0b2dyYW1Mb2FkZXIucHJvdG90eXBlLCAiX3VwZGF0ZURhdGFUb0xvYWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdydW4nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIF9UZkhpc3RvZ3JhbUxvYWRlci5wcm90b3R5cGUsICJfcnVuQ29sb3IiLCBudWxsKTsKICAgIF9UZkhpc3RvZ3JhbUxvYWRlciA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWhpc3RvZ3JhbS1sb2FkZXInKQogICAgXSwgX1RmSGlzdG9ncmFtTG9hZGVyKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZkhpc3RvZ3JhbURhc2hib2FyZCA9IGNsYXNzIFRmSGlzdG9ncmFtRGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkT25SZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2hpc3RvZ3JhbU1vZGUgPSAnb2Zmc2V0JzsKICAgICAgICAgICAgdGhpcy5fdGltZVByb3BlcnR5ID0gJ3N0ZXAnOwogICAgICAgICAgICB0aGlzLl9yZXN0YW1wID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKCk7CiAgICAgICAgfQogICAgICAgIF9yZWRyYXdDYXRlZ29yeVBhbmUoZXZlbnQsIHZhbCkgewogICAgICAgICAgICBpZiAoIXZhbCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgZXZlbnQudGFyZ2V0CiAgICAgICAgICAgICAgICAucXVlcnlTZWxlY3RvckFsbCgndGYtaGlzdG9ncmFtLWxvYWRlcicpCiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoaGlzdG9ncmFtKSA9PiBoaXN0b2dyYW0ucmVkcmF3KCkpOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgaWYgKHRoaXMucmVsb2FkT25SZWFkeSkKICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgdGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRIaXN0b2dyYW1zKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfZmV0Y2hUYWdzKCkgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnaGlzdG9ncmFtcycsICcvdGFncycpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwpLnRoZW4oKHJ1blRvVGFnSW5mbykgPT4gewogICAgICAgICAgICAgICAgaWYgKGxvZGFzaC5pc0VxdWFsKHJ1blRvVGFnSW5mbywgdGhpcy5fcnVuVG9UYWdJbmZvKSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdXBkYXRlIGFueXRoaW5nIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VzLgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHJ1blRvVGFnID0gbG9kYXNoLm1hcFZhbHVlcyhydW5Ub1RhZ0luZm8sICh4KSA9PiBPYmplY3Qua2V5cyh4KSk7CiAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gZ2V0VGFncyhydW5Ub1RhZyk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2RhdGFOb3RGb3VuZCcsIHRhZ3MubGVuZ3RoID09PSAwKTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfcnVuVG9UYWcnLCBydW5Ub1RhZyk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3J1blRvVGFnSW5mbycsIHJ1blRvVGFnSW5mbyk7CiAgICAgICAgICAgICAgICB0aGlzLmFzeW5jKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYF9jYXRlZ29yaWVzRG9tUmVhZHlgLgogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfY2F0ZWdvcmllc0RvbVJlYWR5JywgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9yZWxvYWRIaXN0b2dyYW1zKCkgewogICAgICAgICAgICB0aGlzLnJvb3QucXVlcnlTZWxlY3RvckFsbCgndGYtaGlzdG9ncmFtLWxvYWRlcicpLmZvckVhY2goKGhpc3RvZ3JhbSkgPT4gewogICAgICAgICAgICAgICAgaGlzdG9ncmFtLnJlbG9hZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3Nob3VsZE9wZW4oaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4IDw9IDI7CiAgICAgICAgfQogICAgICAgIGdldCBfY2F0ZWdvcmllcygpIHsKICAgICAgICAgICAgdmFyIHJ1blRvVGFnID0gdGhpcy5fcnVuVG9UYWc7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZFJ1bnMgPSB0aGlzLl9zZWxlY3RlZFJ1bnM7CiAgICAgICAgICAgIHZhciB0YWdGaWx0ZXIgPSB0aGlzLl90YWdGaWx0ZXI7CiAgICAgICAgICAgIHZhciBjYXRlZ29yaWVzRG9tUmVhZHkgPSB0aGlzLl9jYXRlZ29yaWVzRG9tUmVhZHk7CiAgICAgICAgICAgIHJldHVybiBjYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKHJ1blRvVGFnLCBzZWxlY3RlZFJ1bnMsIHRhZ0ZpbHRlcik7CiAgICAgICAgfQogICAgICAgIF90YWdNZXRhZGF0YShydW5Ub1RhZ0luZm8sIHJ1biwgdGFnKSB7CiAgICAgICAgICAgIHJldHVybiBydW5Ub1RhZ0luZm9bcnVuXVt0YWddOwogICAgICAgIH0KICAgIH07CiAgICBUZkhpc3RvZ3JhbURhc2hib2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJoaXN0b2dyYW1Nb2RlU2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iSGlzdG9ncmFtIG1vZGUiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X2hpc3RvZ3JhbU1vZGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9Im92ZXJsYXkiPm92ZXJsYXk8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJvZmZzZXQiPm9mZnNldDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICA8L3RmLW9wdGlvbi1zZWxlY3Rvcj4KICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJ0aW1lUHJvcGVydHlTZWxlY3RvciIKICAgICAgICAgICAgICBuYW1lPSJPZmZzZXQgdGltZSBheGlzIgogICAgICAgICAgICAgIHNlbGVjdGVkLWlkPSJ7e190aW1lUHJvcGVydHl9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJyZWxhdGl2ZSI+cmVsYXRpdmU8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvciBzZWxlY3RlZC1ydW5zPSJ7e19zZWxlY3RlZFJ1bnN9fSI+CiAgICAgICAgICA8L3RmLXJ1bnMtc2VsZWN0b3I+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNlbnRlciI+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW19kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaGlzdG9ncmFtIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBZb3UgaGF2ZW7igJl0IHdyaXR0ZW4gYW55IGhpc3RvZ3JhbSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaGlzdG9ncmFtLWxvYWRlcgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShfcnVuVG9UYWdJbmZvLCBpdGVtLnJ1biwgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHRpbWUtcHJvcGVydHk9IltbX3RpbWVQcm9wZXJ0eV1dIgogICAgICAgICAgICAgICAgICBoaXN0b2dyYW0tbW9kZT0iW1tfaGlzdG9ncmFtTW9kZV1dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICA+PC90Zi1oaXN0b2dyYW0tbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZIaXN0b2dyYW1EYXNoYm9hcmQucHJvdG90eXBlLCAicmVsb2FkT25SZWFkeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSGlzdG9ncmFtRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9oaXN0b2dyYW1Nb2RlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZIaXN0b2dyYW1EYXNoYm9hcmQucHJvdG90eXBlLCAiX3RpbWVQcm9wZXJ0eSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkhpc3RvZ3JhbURhc2hib2FyZC5wcm90b3R5cGUsICJfc2VsZWN0ZWRSdW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIaXN0b2dyYW1EYXNoYm9hcmQucHJvdG90eXBlLCAiX3J1blRvVGFnIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIaXN0b2dyYW1EYXNoYm9hcmQucHJvdG90eXBlLCAiX3J1blRvVGFnSW5mbyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZIaXN0b2dyYW1EYXNoYm9hcmQucHJvdG90eXBlLCAiX2RhdGFOb3RGb3VuZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSGlzdG9ncmFtRGFzaGJvYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmSGlzdG9ncmFtRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9yZXN0YW1wIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkhpc3RvZ3JhbURhc2hib2FyZC5wcm90b3R5cGUsICJfY2F0ZWdvcmllc0RvbVJlYWR5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVxdWVzdE1hbmFnZXIpCiAgICBdLCBUZkhpc3RvZ3JhbURhc2hib2FyZC5wcm90b3R5cGUsICJfcmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ydW5Ub1RhZycsICdfc2VsZWN0ZWRSdW5zJywgJ190YWdGaWx0ZXInLCAnX2NhdGVnb3JpZXNEb21SZWFkeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkhpc3RvZ3JhbURhc2hib2FyZC5wcm90b3R5cGUsICJfY2F0ZWdvcmllcyIsIG51bGwpOwogICAgVGZIaXN0b2dyYW1EYXNoYm9hcmQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1oaXN0b2dyYW0tZGFzaGJvYXJkJykKICAgIF0sIFRmSGlzdG9ncmFtRGFzaGJvYXJkKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAvLyBGdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCBIUGFyYW1zLCBNZXRyaWNzLCBDb2x1bW5zLAogICAgLy8gU2Vzc2lvbkdyb3VwcyBhbmQgU2NoZW1hIG9iamVjdHMuCiAgICAvLyBJbiB0aGUgZm9sbG93aW5nIHJvdXRpbmVzIHdlIHVzZSB0aGUgZm9sbG93aW5nIG5hbWluZyBjb252ZW50aW9ucyBmb3IKICAgIC8vIHBhcmFtZXRlcnM6CiAgICAvLwogICAgLy8gaHBhcmFtSW5mbywgbWV0cmljSW5mbzogQSBKYXZhU2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUKICAgIC8vICAgICBIUGFyYW1JbmZvIHByb3RvIGRlZmluZWQgaW4gYXBpLnByb3RvLgogICAgLy8gc2NoZW1hOiBUaGUgb2JqZWN0IHN0b3JpbmcgbWV0YWRhdGEgb24gdGhlIG1ldHJpY3MgYW5kIGhwYXJhbXMgdXNlZAogICAgLy8gICAgIGluIHRoZSBleHBlcmltZW50LiBTZWUgdGhlIGRvY3VtZW50YXRpb24gaW4KICAgIC8vICAgICAndGYtaHBhcmFtcy1xdWVyeS1wYW5lLmh0bWwnLgogICAgLy8gdmlzaWJsZVNjaGVtYTogVGhlIG9iamVjdCBzdG9yaW5nIG1ldGFkYXRhIG9uIGp1c3QgdGhlIHZpc2libGUgbWV0cmljcwogICAgLy8gICAgIGFuZCBocGFyYW1zIGluICdzY2hlbWEnLiBUaGlzIGlzIHRoZSBvYmplY3Qgc3RvcmVkIGluIHRoZSBwcm9wZXJ0eQogICAgLy8gICAgICd2aXNpYmxlU2NoZW1hJyBvZiAnY29uZmlndXJhdGlvbicgKHNlZSB0aGUgZG9jdW1lbnRhdGlvbiBpbgogICAgLy8gICAgIHRmLWhwYXJhbXMtcXVlcnktcGFuZS5odG1sJyBmb3IgbW9yZSBkZXRhaWxzKS4gVGhpcyBvYmplY3QgYW5kIHRoZQogICAgLy8gICAgIHV0aWxpdHkgZnVuY3Rpb25zIGJlbG93IHRoYXQgYWNjZXB0IGl0IGFyZSBkZXByZWNhdGVkIGFuZCB0aGUKICAgIC8vICAgICBpbnRlbnRpb24gaXMgdG8gZXZlbnR1YWxseSByZW1vdmUgdGhlbS4KICAgIC8vICAgICBOZXcgY29kZSBzaG91bGQgaW5zdGVhZCBmaWx0ZXIgdGhlIGVudHJpZXMgaW4gdGhlIHNjaGVtYSBvYmplY3QKICAgIC8vICAgICBkaXJlY3RseSB0byBmaW5kIGFsbCB0aGUgdmlzaWJsZSBjb2x1bW5zIGFuZCBvbmx5IHVzZSB0aGUgZnVuY3Rpb25zCiAgICAvLyAgICAgYmVsb3cgdGhhdCB0YWtlIGEgJ3NjaGVtYScgb2JqZWN0LgogICAgLy8gc2Vzc2lvbkdyb3VwOiBBIEphdmFTY3JpcHQgb2JqZWN0IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBTZXNzaW9uR3JvdXAKICAgIC8vICAgICBwcm90byBkZWZpbmVkIGluIGFwaS5wcm90by4KICAgIC8vIHNlc3Npb25Hcm91cHM6IEFuIGFycmF5IG9mICdzZXNzaW9uR3JvdXAnIG9iamVjdHMuCiAgICAvLyBjb2x1bW5JbmRleDogQW4gaW5kZXggb2YgYSAnY29sdW1uJyBvZiBhIHNlc3Npb25Hcm91cCB3aXRoIHJlc3BlY3QKICAgIC8vICAgICB0byBhIHNjaGVtYSBvciB2aXNpYmxlU2NoZW1hIG9iamVjdC4gV2UgcmVnYXJkIGEKICAgIC8vICAgICBzZXNzaW9uR3JvdXAgYXMgYSByb3cgaW4gYSB0YWJsZSB3aGVyZSB0aGUgY29sdW1ucyByZXByZXNlbnQKICAgIC8vICAgICBocGFyYW1zIGFuZCBtZXRyaWMgdmFsdWVzIGZvciB0aGUgc2Vzc2lvbiBncm91cC4gVGhlIGNvbHVtbnMgYXJlCiAgICAvLyAgICAgb3JkZXJlZCBieSBsaXN0aW5nIHRoZSBocGFyYW0gY29sdW1ucyBmaXJzdCBpbiB0aGUgc2FtZSBvcmRlciBhcwogICAgLy8gICAgIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIG9mIHNjaGVtYS5ocGFyYW1Db2x1bW5zIG9yCiAgICAvLyAgICAgdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcywgZm9sbG93ZWQgYnkgdGhlCiAgICAvLyAgICAgbWV0cmljIGNvbHVtbnMgaW4gdGhlIHNhbWUgb3JkZXIgYXMgdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudHMgb2YKICAgIC8vICAgICBzY2hlbWEubWV0cmljQ29sdW1ucyBvciB2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLiBXaGV0aGVyIHRoZQogICAgLy8gICAgIGluZGV4IGlzIGdpdmVuIHdpdGggcmVzcGVjdCB0byBhIHNjaGVtYSBvciBhIHZpc2libGVTY2hlbWUgZGVwZW5kcwogICAgLy8gICAgIG9uIHRoZSB0eXBlIG9mIHNjaGVtYSBwYXJhbWV0ZXIgdGhlIHV0aWxpdHkgZnVuY3Rpb24gYmVsb3cgYWNjZXB0cwogICAgLy8gICAgIGluIGFkZGl0aW9uIHRvIHRoZSBjb2x1bW5JbmRleCBwYXJhbWV0ZXIuCiAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgLy8gQ29tcHV0ZXMgdGhlIG5hbWUgdG8gZGlzcGxheSBmb3IgdGhlIGdpdmVuICdocGFyYW1JbmZvJyBvYmplY3QuCiAgICBmdW5jdGlvbiBocGFyYW1OYW1lKGhwYXJhbUluZm8pIHsKICAgICAgICBpZiAoaHBhcmFtSW5mby5kaXNwbGF5TmFtZSAhPT0gJycgJiYgaHBhcmFtSW5mby5kaXNwbGF5TmFtZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiBocGFyYW1JbmZvLmRpc3BsYXlOYW1lOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaHBhcmFtSW5mby5uYW1lOwogICAgfQogICAgLy8gQ29tcHV0ZXMgdGhlIG5hbWUgdG8gZGlzcGxheSBmb3IgdGhlIGdpdmVuIG1ldHJpY0luZm8gb2JqZWN0LgogICAgZnVuY3Rpb24gbWV0cmljTmFtZShtZXRyaWNJbmZvKSB7CiAgICAgICAgaWYgKG1ldHJpY0luZm8uZGlzcGxheU5hbWUgIT09ICcnICYmIG1ldHJpY0luZm8uZGlzcGxheU5hbWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gbWV0cmljSW5mby5kaXNwbGF5TmFtZTsKICAgICAgICB9CiAgICAgICAgbGV0IGdyb3VwID0gbWV0cmljSW5mby5uYW1lLmdyb3VwOwogICAgICAgIGxldCB0YWcgPSBtZXRyaWNJbmZvLm5hbWUudGFnOwogICAgICAgIGlmIChncm91cCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGdyb3VwID0gJyc7CiAgICAgICAgfQogICAgICAgIGlmICh0YWcgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0YWcgPSAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKGdyb3VwID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gdGFnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZ3JvdXAgKyAnLicgKyB0YWc7CiAgICB9CiAgICBmdW5jdGlvbiBzY2hlbWFDb2x1bW5OYW1lKHNjaGVtYSwgY29sdW1uSW5kZXgpIHsKICAgICAgICBpZiAoY29sdW1uSW5kZXggPCBzY2hlbWEuaHBhcmFtQ29sdW1ucy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIGhwYXJhbU5hbWUoc2NoZW1hLmhwYXJhbUNvbHVtbnNbY29sdW1uSW5kZXhdLmhwYXJhbUluZm8pOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXRyaWNJbmRleCA9IGNvbHVtbkluZGV4IC0gc2NoZW1hLmhwYXJhbUNvbHVtbnMubGVuZ3RoOwogICAgICAgIHJldHVybiBtZXRyaWNOYW1lKHNjaGVtYS5tZXRyaWNDb2x1bW5zW21ldHJpY0luZGV4XS5tZXRyaWNJbmZvKTsKICAgIH0KICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBocGFyYW1zIGluIHNjaGVtYSAodmlzaWJsZSBhbmQgaW52aXNpYmxlKS4KICAgIGZ1bmN0aW9uIG51bUhQYXJhbXMoc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIHNjaGVtYS5ocGFyYW1Db2x1bW5zLmxlbmd0aDsKICAgIH0KICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBtZXRyaWNzIGluIHNjaGVtYSAodmlzaWJsZSBhbmQgaW52aXNpYmxlKS4KICAgIGZ1bmN0aW9uIG51bU1ldHJpY3Moc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIHNjaGVtYS5tZXRyaWNDb2x1bW5zLmxlbmd0aDsKICAgIH0KICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHNjaGVtYSAodmlzaWJsZSBhbmQgaW52aXNpYmxlKS4KICAgIGZ1bmN0aW9uIG51bUNvbHVtbnMoc2NoZW1hKSB7CiAgICAgICAgcmV0dXJuIG51bUhQYXJhbXMoc2NoZW1hKSArIG51bU1ldHJpY3Moc2NoZW1hKTsKICAgIH0KICAgIC8vIFJldHVybnMgaHBhcmFtVmFsdWVzW2hwYXJhbU5hbWVdLiBUbyBiZSB1c2VkIGluIGEgUG9seW1lciBkYXRhYmluZGluZwogICAgLy8gYW5ub3RhdGlvbiAoYXMgUG9seW1lciBkb2Vzbid0IGhhdmUgYW4gYW5ub3RhdGlvbiBmb3IgbG9va2luZyB1cCBhCiAgICAvLyBwcm9wZXJ0eSBpbiBhbiBKUyBvYmplY3QpLgogICAgZnVuY3Rpb24gaHBhcmFtVmFsdWVCeU5hbWUoaHBhcmFtVmFsdWVzLCBocGFyYW1OYW1lKSB7CiAgICAgICAgcmV0dXJuIGhwYXJhbVZhbHVlc1tocGFyYW1OYW1lXTsKICAgIH0KICAgIC8vIEdpdmVuIGFuIGFycmF5ICdtZXRyaWNWYWx1ZXMnIG9mIChqYXZhc2NyaXB0IG9iamVjdCByZXByZXNlbnRhdGlvbikgb2YKICAgIC8vIHRlbnNvcmJvYXJkLmhwYXJhbXMuTWV0cmljVmFsdWUncyBwcm90b2NvbCBidWZmZXJzLCByZXR1cm5zIHRoZSBmaXJzdAogICAgLy8gZWxlbWVudCB3aG9zZSBtZXRyaWMgbmFtZSBpcyAnbWV0cmljTmFtZScgb3IgdW5kZWZpbmVkIGlmIG5vIHN1Y2gKICAgIC8vIGVsZW1lbnQgZXhpc3RzLgogICAgZnVuY3Rpb24gbWV0cmljVmFsdWVCeU5hbWUobWV0cmljVmFsdWVzLCBtZXRyaWNOYW1lKSB7CiAgICAgICAgcmV0dXJuIG1ldHJpY1ZhbHVlcy5maW5kKChtdikgPT4gbG9kYXNoLmlzRXF1YWwobXYubmFtZSwgbWV0cmljTmFtZSkpOwogICAgfQogICAgLy8gUmV0dXJucyBzZXNzaW9uR3JvdXAncyBtZXRyaWMgdmFsdWUgb2YgdGhlIG1ldHJpYyB3aXRoIGluZGV4CiAgICAvLyAnbWV0cmljSW5kZXgnIGluIHNjaGVtYS5tZXRyaWNDb2x1bW5zLgogICAgZnVuY3Rpb24gaHBhcmFtVmFsdWVCeUluZGV4KHNjaGVtYSwgc2Vzc2lvbkdyb3VwLCBocGFyYW1JbmRleCkgewogICAgICAgIHJldHVybiBzZXNzaW9uR3JvdXAuaHBhcmFtc1tzY2hlbWEuaHBhcmFtQ29sdW1uc1tocGFyYW1JbmRleF0uaHBhcmFtSW5mby5uYW1lXTsKICAgIH0KICAgIC8vIFJldHVybnMgc2Vzc2lvbkdyb3VwJ3MgbWV0cmljIHZhbHVlIG9mIHRoZSBtZXRyaWMgd2l0aCBpbmRleAogICAgLy8gJ21ldHJpY0luZGV4JyBpbiBzY2hlbWEubWV0cmljQ29sdW1ucy4KICAgIGZ1bmN0aW9uIG1ldHJpY1ZhbHVlQnlJbmRleChzY2hlbWEsIHNlc3Npb25Hcm91cCwgbWV0cmljSW5kZXgpIHsKICAgICAgICBjb25zdCBtZXRyaWNOYW1lID0gc2NoZW1hLm1ldHJpY0NvbHVtbnNbbWV0cmljSW5kZXhdLm1ldHJpY0luZm8ubmFtZTsKICAgICAgICBjb25zdCBtZXRyaWNWYWx1ZSA9IG1ldHJpY1ZhbHVlQnlOYW1lKHNlc3Npb25Hcm91cC5tZXRyaWNWYWx1ZXMsIG1ldHJpY05hbWUpOwogICAgICAgIHJldHVybiBtZXRyaWNWYWx1ZSA9PT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogbWV0cmljVmFsdWUudmFsdWU7CiAgICB9CiAgICAvLyBSZXR1cm5zIHNlc3Npb25Hcm91cCdzIGNvbHVtbiB2YWx1ZSBvZiB0aGUgY29sdW1uIHdpdGggaW5kZXgKICAgIC8vICdjb2x1bW5JbmRleCcgaW4gc2NoZW1hLgogICAgZnVuY3Rpb24gY29sdW1uVmFsdWVCeUluZGV4KHNjaGVtYSwgc2Vzc2lvbkdyb3VwLCBjb2x1bW5JbmRleCkgewogICAgICAgIGlmIChjb2x1bW5JbmRleCA8IHNjaGVtYS5ocGFyYW1Db2x1bW5zLmxlbmd0aCkgewogICAgICAgICAgICByZXR1cm4gaHBhcmFtVmFsdWVCeUluZGV4KHNjaGVtYSwgc2Vzc2lvbkdyb3VwLCBjb2x1bW5JbmRleCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBtZXRyaWNWYWx1ZUJ5SW5kZXgoc2NoZW1hLCBzZXNzaW9uR3JvdXAsIGNvbHVtbkluZGV4IC0gc2NoZW1hLmhwYXJhbUNvbHVtbnMubGVuZ3RoKTsKICAgIH0KICAgIC8vIFJldHVybnMgYW4gYXJyYXkgW21pbiwgbWF4XSByZXByZXNlbnRpbmcgdGhlIG1pbmltdW0gYW5kIG1heGltdW0KICAgIC8vIHZhbHVlIG9mIHRoZSBnaXZlbiBjb2x1bW4gaW4gdGhlIHNlc3Npb25Hcm91cHMgYXJyYXkuCiAgICAvLyBJZ25vcmVzIHNlc3Npb24gZ3JvdXBzIHdpdGggbWlzc2luZyB2YWx1ZXMgZm9yIHRoZSBjb2x1bW4uCiAgICBmdW5jdGlvbiBudW1lcmljQ29sdW1uRXh0ZW50KHNjaGVtYSwgc2Vzc2lvbkdyb3VwcywgY29sdW1uSW5kZXgpIHsKICAgICAgICByZXR1cm4gZXh0ZW50KHNlc3Npb25Hcm91cHMsIChzZykgPT4gY29sdW1uVmFsdWVCeUluZGV4KHNjaGVtYSwgc2csIGNvbHVtbkluZGV4KSk7CiAgICB9CiAgICAvLyBDb252ZXJ0cyBhIHZpc2libGVTY2hlbWEgY29sdW1uSW5kZXggdG8gYSBzY2hlbWEgY29sdW1uSW5kZXguCiAgICAvLyBSZXR1cm5zIHRoZSBzY2hlbWEtcmVsYXRpdmUgY29sdW1uSW5kZXggZm9yIHRoZSB2aXNpYmxlIGNvbHVtbiB3aXRoCiAgICAvLyB2aXNpYmxlU2NoZW1hLXJlbGVhdGl2ZSBjb2x1bW5JbmRleCBnaXZlbiBieSAndmlzaWJsZUNvbHVtbkluZGV4Jy4KICAgIGZ1bmN0aW9uIGdldEFic29sdXRlQ29sdW1uSW5kZXgoc2NoZW1hLCB2aXNpYmxlU2NoZW1hLCB2aXNpYmxlQ29sdW1uSW5kZXgpIHsKICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgIGlmICh2aXNpYmxlQ29sdW1uSW5kZXggPCB2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmxlbmd0aCkgewogICAgICAgICAgICByZXN1bHQgPSBzY2hlbWEuaHBhcmFtQ29sdW1ucy5maW5kSW5kZXgoKGMpID0+IGMuaHBhcmFtSW5mby5uYW1lID09PSB2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zW3Zpc2libGVDb2x1bW5JbmRleF0ubmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb25zdCBtZXRyaWNJbmRleCA9IHZpc2libGVDb2x1bW5JbmRleCAtIHZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwogICAgICAgICAgICBjb25zdCBtZXRyaWNOYW1lID0gdmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1ttZXRyaWNJbmRleF0ubmFtZTsKICAgICAgICAgICAgcmVzdWx0ID0KICAgICAgICAgICAgICAgIHNjaGVtYS5ocGFyYW1Db2x1bW5zLmxlbmd0aCArCiAgICAgICAgICAgICAgICAgICAgc2NoZW1hLm1ldHJpY0NvbHVtbnMuZmluZEluZGV4KChjKSA9PiBjLm1ldHJpY0luZm8ubmFtZSA9PT0gbWV0cmljTmFtZSk7CiAgICAgICAgfQogICAgICAgIGNvbnNvbGUuYXNzZXJ0KHJlc3VsdCAhPT0gLTEpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvLyBERVBSRUNBVEVELiBVc2Ugc2NoZW1hQ29sdW1uTmFtZSBpbnN0ZWFkICh3aXRoIGFuICJhYnNvbHV0ZSIKICAgIC8vIGNvbHVtbkluZGV4KS4KICAgIC8vIENvbXB1dGVzIHRoZSBuYW1lIHRvIGRpc3BsYXkgZm9yIHRoZSBnaXZlbiB2aXNpYmxlIGNvbHVtbiBpbmRleC4KICAgIGZ1bmN0aW9uIHNjaGVtYVZpc2libGVDb2x1bW5OYW1lKHZpc2libGVTY2hlbWEsIGNvbHVtbkluZGV4KSB7CiAgICAgICAgaWYgKGNvbHVtbkluZGV4IDwgdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIGhwYXJhbU5hbWUodmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc1tjb2x1bW5JbmRleF0pOwogICAgICAgIH0KICAgICAgICBjb25zdCBtZXRyaWNJbmRleCA9IGNvbHVtbkluZGV4IC0gdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGg7CiAgICAgICAgcmV0dXJuIG1ldHJpY05hbWUodmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1ttZXRyaWNJbmRleF0pOwogICAgfQogICAgLy8gREVQUkVDQVRFRC4gVXNlIG51bURpc3BsYXllZEhQYXJhbXMgaW5zdGVhZC4KICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBocGFyYW1zIGluIHZpc2libGVTY2hlbWEuIFRoaXMgaXMgdGhlIHNhbWUKICAgIC8vIHZhbHVlIGFzIG51bURpc3BsYXllZEhQYXJhbXMoc2NoZW1hKSB3aXRoIHNjaGVtYSBiZWluZyB0aGUgImNvbnRhaW5pbmciCiAgICAvLyBzY2hlbWEgb2YgdmlzaWJsZVNjaGVtYS4KICAgIGZ1bmN0aW9uIG51bVZpc2libGVIUGFyYW1zKHZpc2libGVTY2hlbWEpIHsKICAgICAgICByZXR1cm4gdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGg7CiAgICB9CiAgICAvLyBERVBSRUNBVEVELiBVc2UgbnVtRGlzcGxheWVkTWV0cmljcyBpbnN0ZWFkLgogICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGhwYXJhbXMgaW4gdmlzaWJsZVNjaGVtYS4gVGhpcyBpcyB0aGUgc2FtZQogICAgLy8gdmFsdWUgYXMgbnVtRGlzcGxheWVkTWV0cmljcyhzY2hlbWEpIHdpdGggc2NoZW1hIGJlaW5nIHRoZSAiY29udGFpbmluZyIKICAgIC8vIHNjaGVtYSBvZiB2aXNpYmxlU2NoZW1hLgogICAgZnVuY3Rpb24gbnVtVmlzaWJsZU1ldHJpY3ModmlzaWJsZVNjaGVtYSkgewogICAgICAgIHJldHVybiB2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aDsKICAgIH0KICAgIC8vIERFUFJFQ0FURUQuCiAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmlzaWJsZSBjb2x1bW5zIChoYXZpbmcgJ2Rpc3BsYXllZCcgdHJ1ZSkuCiAgICAvLyBUaGlzIGlzIHRoZSBzYW1lIHZhbHVlIGFzIG51bURpc3BsYXllZENvbHVtbnMoc2NoZW1hKSB3aXRoIHNjaGVtYQogICAgLy8gYmVpbmcgdGhlICJjb250YWluaW5nIiBzY2hlbWEgb2YgdmlzaWJsZVNjaGVtYS4KICAgIGZ1bmN0aW9uIG51bVZpc2libGVDb2x1bW5zKHZpc2libGVTY2hlbWEpIHsKICAgICAgICByZXR1cm4gbnVtVmlzaWJsZUhQYXJhbXModmlzaWJsZVNjaGVtYSkgKyBudW1WaXNpYmxlTWV0cmljcyh2aXNpYmxlU2NoZW1hKTsKICAgIH0KICAgIC8vIERFUFJFQ0FURUQuIFVzZSBudW1lcmljQ29sdW1uRXh0ZW50IHdpdGggYSBzY2hlbWEgY29sdW1uSW5kZXggaW5zdGVhZC4KICAgIC8vIFJldHVybnMgYW4gYXJyYXkgW21pbiwgbWF4XSByZXByZXNlbnRpbmcgdGhlIG1pbmltdW0gYW5kIG1heGltdW0KICAgIC8vIHZhbHVlIG9mIHRoZSBnaXZlbiB2aXNpYmxlIGNvbHVtbiBpbiB0aGUgc2Vzc2lvbkdyb3VwcyBhcnJheS4KICAgIC8vIElnbm9yZXMgc2Vzc2lvbiBncm91cHMgd2l0aCBtaXNzaW5nIHZhbHVlcyBmb3IgdGhlIGNvbHVtbi4KICAgIGZ1bmN0aW9uIHZpc2libGVOdW1lcmljQ29sdW1uRXh0ZW50KHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cHMsIGNvbHVtbkluZGV4KSB7CiAgICAgICAgcmV0dXJuIGV4dGVudChzZXNzaW9uR3JvdXBzLCAoc2cpID0+IGNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXgodmlzaWJsZVNjaGVtYSwgc2csIGNvbHVtbkluZGV4KSk7CiAgICB9CiAgICAvLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGhwYXJhbVZhbHVlc1tocGFyYW1OYW1lXSBzdWl0YWJsZQogICAgLy8gZm9yIGRpc3BsYXkuCiAgICBmdW5jdGlvbiBwcmV0dHlQcmludEhQYXJhbVZhbHVlQnlOYW1lKGhwYXJhbVZhbHVlcywgaHBhcmFtTmFtZSkgewogICAgICAgIHJldHVybiBwcmV0dHlQcmludChocGFyYW1WYWx1ZUJ5TmFtZShocGFyYW1WYWx1ZXMsIGhwYXJhbU5hbWUpKTsKICAgIH0KICAgIC8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgbWV0cmljVmFsdWVCeU5hbWUgc3VpdGFibGUgZm9yCiAgICAvLyBkaXNwbGF5LgogICAgZnVuY3Rpb24gcHJldHR5UHJpbnRNZXRyaWNWYWx1ZUJ5TmFtZShtZXRyaWNWYWx1ZXMsIG1ldHJpY05hbWUpIHsKICAgICAgICByZXR1cm4gcHJldHR5UHJpbnQobWV0cmljVmFsdWVCeU5hbWUobWV0cmljVmFsdWVzLCBtZXRyaWNOYW1lKSk7CiAgICB9CiAgICAvLyBSZXR1cm5zIHRoZSBzZXNzaW9uIGdyb3VwIHdpdGggbmFtZSAnbmFtZScgaW4gc2Vzc2lvbkdyb3VwcyBvcgogICAgLy8gdW5kZWZpbmVkIG9mIG5vIHN1Y2ggZWxlbWVudCBleGlzdC4KICAgIGZ1bmN0aW9uIHNlc3Npb25Hcm91cFdpdGhOYW1lKHNlc3Npb25Hcm91cHMsIG5hbWUpIHsKICAgICAgICByZXR1cm4gc2Vzc2lvbkdyb3Vwcy5maW5kKChzZykgPT4gc2cubmFtZSA9PT0gbmFtZSk7CiAgICB9CiAgICAvLyBERVBSRUNBVEVELiBVc2UgaHBhcmFtVmFsdWVCeUluZGV4IHdpdGggYSBzY2hlbWEgaHBhcmFtSW5kZXggaW5zdGVhZC4KICAgIC8vIFJldHVybnMgc2Vzc2lvbkdyb3VwJ3MgaHBhcmFtIHZhbHVlIG9mIHRoZSB2aXNpYmxlIGhwYXJhbSB3aXRoIGluZGV4CiAgICAvLyAnaHBhcmFtSW5kZXgnIGluIHZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MuCiAgICBmdW5jdGlvbiBocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4KHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCwgaHBhcmFtSW5kZXgpIHsKICAgICAgICByZXR1cm4gc2Vzc2lvbkdyb3VwLmhwYXJhbXNbdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvc1tocGFyYW1JbmRleF0ubmFtZV07CiAgICB9CiAgICAvLyBERVBSRUNBVEVELiBVc2UgbWV0cmljVmFsdWVCeUluZGV4IHdpdGggYSBzY2hlbWEgbWV0cmljSW5kZXggaW5zdGVhZC4KICAgIC8vIFJldHVybnMgc2Vzc2lvbkdyb3VwJ3MgbWV0cmljIHZhbHVlIG9mIHRoZSB2aXNpYmxlIG1ldHJpYyB3aXRoIGluZGV4CiAgICAvLyAnbWV0cmljSW5kZXgnIGluIHZpc2libGVTY2hlbWEubWV0cmljSW5mb3MuCiAgICBmdW5jdGlvbiBtZXRyaWNWYWx1ZUJ5VmlzaWJsZUluZGV4KHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCwgdmlzaWJsZU1ldHJpY0luZGV4KSB7CiAgICAgICAgY29uc3QgbWV0cmljTmFtZSA9IHZpc2libGVTY2hlbWEubWV0cmljSW5mb3NbdmlzaWJsZU1ldHJpY0luZGV4XS5uYW1lOwogICAgICAgIGNvbnN0IG1ldHJpY1ZhbHVlID0gbWV0cmljVmFsdWVCeU5hbWUoc2Vzc2lvbkdyb3VwLm1ldHJpY1ZhbHVlcywgbWV0cmljTmFtZSk7CiAgICAgICAgcmV0dXJuIG1ldHJpY1ZhbHVlID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBtZXRyaWNWYWx1ZS52YWx1ZTsKICAgIH0KICAgIC8vIERFUFJFQ0FURUQuIFVzZSBjb2x1bW5WYWx1ZUJ5SW5kZXggd2l0aCBhIHNjaGVtYSBjb2x1bW5JbmRleCBpbnN0ZWFkLgogICAgLy8gUmV0dXJucyBzZXNzaW9uR3JvdXAncyBjb2x1bW4gdmFsdWUgb2YgdGhlIHZpc2libGUgY29sdW1uIHdpdGggaW5kZXgKICAgIC8vICdjb2x1bW5JbmRleCcgaW4gdmlzaWJsZVNjaGVtYS4KICAgIGZ1bmN0aW9uIGNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXgodmlzaWJsZVNjaGVtYSwgc2Vzc2lvbkdyb3VwLCBjb2x1bW5JbmRleCkgewogICAgICAgIGlmIChjb2x1bW5JbmRleCA8IHZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4KHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCwgY29sdW1uSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0cmljVmFsdWVCeVZpc2libGVJbmRleCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXAsIGNvbHVtbkluZGV4IC0gdmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGgpOwogICAgfQogICAgLy8gLS0tLSBNaXNjIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIC8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgJ3ZhbHVlJyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KICAgIGZ1bmN0aW9uIHByZXR0eVByaW50KHZhbHVlKSB7CiAgICAgICAgaWYgKGxvZGFzaC5pc051bWJlcih2YWx1ZSkpIHsKICAgICAgICAgICAgLy8gVE9ETyhlcmV6KTpNYWtlIHRoZSBwcmVjaXNpb24gdXNlci1jb25maWd1cmFibGUuCiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1ByZWNpc2lvbig1KTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgIH0KICAgIC8vIFJldHVybnMgdGhlIHNxdWFyZSBvZiB0aGUgTDItbm9ybSBvZiAoeCwgeSkuCiAgICBmdW5jdGlvbiBsMk5vcm1TcXVhcmVkKHgsIHkpIHsKICAgICAgICByZXR1cm4geCAqIHggKyB5ICogeTsKICAgIH0KICAgIC8vIFJldHVybnMgdGhlIGV1Y2xpZGVhbiBkaXN0YW5jZSBiZXR3ZWVuICh4MCwgeTApIGFuZCAoeDEsIHkxKS4KICAgIGZ1bmN0aW9uIGV1Y2xpZGVhbkRpc3QoeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KGwyTm9ybVNxdWFyZWQoeDAgLSB4MSwgeTAgLSB5MSkpOwogICAgfQogICAgLy8gUmV0dXJucyB0aGUgKGV1Y2xpZGVhbikgZGlzdGFuY2UgYmV0d2VlbiB0aGUgcG9pbnQgKHgsIHkpIGFuZCB0aGUKICAgIC8vIHJlY3RhbmdsZSBbeDAsIHgxKSB4IFt5MCwgeTEpLgogICAgZnVuY3Rpb24gcG9pbnRUb1JlY3RhbmdsZURpc3QoeCwgeSwgeDAsIHkwLCB4MSwgeTEpIHsKICAgICAgICBpZiAoeCA8IHgwICYmIHkgPCB5MCkgewogICAgICAgICAgICByZXR1cm4gZXVjbGlkZWFuRGlzdCh4LCB5LCB4MCwgeTApOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh4MCA8PSB4ICYmIHggPCB4MSAmJiB5IDwgeTApIHsKICAgICAgICAgICAgcmV0dXJuIHkwIC0geTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoeDEgPD0geCAmJiB5IDwgeTApIHsKICAgICAgICAgICAgcmV0dXJuIGV1Y2xpZGVhbkRpc3QoeCwgeSwgeDEsIHkwKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoeCA8IHgwICYmIHkwIDw9IHkgJiYgeSA8IHkxKSB7CiAgICAgICAgICAgIHJldHVybiB4MCAtIHg7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHgwIDw9IHggJiYgeCA8IHgxICYmIHkwIDw9IHkgJiYgeSA8IHkxKSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh4MSA8PSB4ICYmIHkwIDw9IHkgJiYgeSA8IHkxKSB7CiAgICAgICAgICAgIHJldHVybiB4IC0geDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHggPCB4MCAmJiB5MSA8PSB5KSB7CiAgICAgICAgICAgIHJldHVybiBldWNsaWRlYW5EaXN0KHgsIHksIHgwLCB5MSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHgwIDw9IHggJiYgeCA8IHgxICYmIHkxIDw9IHkpIHsKICAgICAgICAgICAgcmV0dXJuIHkgLSB5MTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoeDEgPD0geCAmJiB5MSA8PSB5KSB7CiAgICAgICAgICAgIHJldHVybiBldWNsaWRlYW5EaXN0KHgsIHksIHgxLCB5MSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyAnUG9pbnQgKHgseSkgbXVzdCBiZSBpbiBvbmUgb2YgdGhlIHJlZ2lvbnMgZGVmaW5lZCBhYm92ZS4nOwogICAgICAgIH0KICAgIH0KICAgIC8vIFNWRyBlbGVtZW50cyBzdWNoIGFzIDxnPiBjYW4gb3B0aW9uYWxseSBoYXZlIGEgInRyYW5zZm9ybSIgYXR0cmlidXRlCiAgICAvLyB0aGUgYWx0ZXJzIHRoZSB3YXkgdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgZHJhd24uCiAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhlbHBzIGdlbmVyYXRlIGEgInRyYW5zbGF0ZSBmdW5jdGlvbiIgdmFsdWUKICAgIC8vIGZvciB0aGlzIGF0dHJpYnV0ZS4KICAgIC8vIFNlZQogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS90cmFuc2Zvcm0KICAgIC8vIGZvciBtb3JlIGRldGFpbHMuCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVTdHIoeCwgb3B0X3kpIHsKICAgICAgICBpZiAob3B0X3kgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gJ3RyYW5zbGF0ZSgnICsgeCArICcpJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHggKyAnLCcgKyBvcHRfeSArICcpJzsKICAgIH0KICAgIC8vIFNWRyBlbGVtZW50cyBzdWNoIGFzIDxnPiBjYW4gb3B0aW9uYWxseSBoYXZlIGEgInRyYW5zZm9ybSIgYXR0cmlidXRlCiAgICAvLyB0aGUgYWx0ZXJzIHRoZSB3YXkgdGhlIGVsZW1lbnQgYW5kIGl0cyBjaGlsZHJlbiBhcmUgZHJhd24uCiAgICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9uIGhlbHBzIGdlbmVyYXRlIGEgInJvdGF0ZSBmdW5jdGlvbiIgdmFsdWUKICAgIC8vIGZvciB0aGlzIGF0dHJpYnV0ZS4KICAgIC8vIFNlZQogICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvU1ZHL0F0dHJpYnV0ZS90cmFuc2Zvcm0KICAgIC8vIGZvciBtb3JlIGRldGFpbHMuCiAgICBmdW5jdGlvbiByb3RhdGVTdHIoYW5nbGUsIHgsIHkpIHsKICAgICAgICBsZXQgcmVzdWx0ID0gJ3JvdGF0ZSgnICsgYW5nbGU7CiAgICAgICAgaWYgKHggIT09IHVuZGVmaW5lZCAmJiB5ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgJywnICsgeCArICcsJyArIHk7CiAgICAgICAgfQogICAgICAgIHJlc3VsdCA9IHJlc3VsdCArICcpJzsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoeCkgewogICAgICAgIHJldHVybiB4ID09PSBudWxsIHx8IHggPT09IHVuZGVmaW5lZDsKICAgIH0KICAgIC8vIEdpdmVuIGEgZDMucXVhZFRyZWUgb2JqZWN0LCB2aXNpdHMgYWxsIHRoZSBwb2ludHMgaW4gaXQKICAgIC8vIHRoYXQgbGllIGluc2lkZSB0aGUgcmVjdGFuZ2xlIFt4MCwgeDEpIHggW3kwLCB5MSkuCiAgICAvLyBGb3IgZWFjaCBzdWNoIHBvaW50IGNhbGxzIHRoZSBnaXZlbiBjYWxsYmFjaywgcGFzc2luZyB0aGUKICAgIC8vIHBvaW50J3MgcXVhZHRyZWUgZGF0YS4KICAgIGZ1bmN0aW9uIHF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QocXVhZFRyZWUsIHgwLCB5MCwgeDEsIHkxLCBjYWxsYmFjaykgewogICAgICAgIHF1YWRUcmVlLnZpc2l0KChub2RlLCBueDAsIG55MCwgbngxLCBueTEpID0+IHsKICAgICAgICAgICAgLy8gUmVwcmVzZW50cyB0aGUgc2V0IG9mIHBvaW50cyBbbngwLCBueDEpIHggW255MCwgbnkxKS4KICAgICAgICAgICAgaWYgKG5vZGUubGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gcXVhZFRyZWUueCgpKG5vZGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IHF1YWRUcmVlLnkoKShub2RlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIGlmICh4MCA8PSB4ICYmIHggPCB4MSAmJiB5MCA8PSB5ICYmIHkgPCB5MSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhub2RlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKChub2RlID0gbm9kZS5uZXh0KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTa2lwIHRoaXMgbm9kZSBpZiBJbnRlcnNlY3Rpb24oW254MCwgbngxKSB4IFtueTAsIG55MSksCiAgICAgICAgICAgIC8vICBbeDAsIHgxKSB4IFt5MCwgeTEpKSBpcyBlbXB0eSwgb3IgZXF1aXZhbGVudGx5LCBpZgogICAgICAgICAgICAvLyBlaXRoZXIgSW50ZXJzZWN0aW9uKFtueDAsIG54MSksIFt4MCwgeDEpKSBvcgogICAgICAgICAgICAvLyBJbnRlcnNlY3Rpb24oW255MCwgbnkxKSwgW3kwLCB5MSkpIGlzIGVtcHR5LgogICAgICAgICAgICByZXR1cm4gbngwID49IHgxIHx8IG54MSA8PSB4MCB8fCBueTAgPj0geTEgfHwgbnkxIDw9IHkwOwogICAgICAgIH0pOwogICAgfQogICAgLy8gR2l2ZW4gYSBkMy5xdWFkVHJlZSBvYmplY3QsIHZpc2l0cyBhbGwgdGhlIHBvaW50cyBpbiBpdAogICAgLy8gdGhhdCBsaWUgaW5zaWRlIHRoZSBjbG9zZWQgZGlzayBjZW50ZXJlZCBhdCAoY2VudGVyWCwgY2VudGVyWSkKICAgIC8vIHdpdGggdGhlIGdpdmVuIHJhZGl1cy4KICAgIC8vIEZvciBlYWNoIHN1Y2ggcG9pbnQgY2FsbHMgdGhlIGdpdmVuIGNhbGxiYWNrLCBwYXNzaW5nIHRoZQogICAgLy8gcG9pbnQncyBxdWFkdHJlZSBkYXRhIGFuZCB0aGUgZGlzdGFuY2UgZnJvbSB0aGUgcG9pbnQgdG8gdGhlIGNlbnRlcgogICAgLy8gb2YgdGhlIGRpc2suCiAgICBmdW5jdGlvbiBxdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKHF1YWRUcmVlLCBjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGNhbGxiYWNrKSB7CiAgICAgICAgcXVhZFRyZWUudmlzaXQoKG5vZGUsIHgwLCB5MCwgeDEsIHkxKSA9PiB7CiAgICAgICAgICAgIC8vIFJlcHJlc2VudHMgdGhlIHNldCBvZiBwb2ludHMgW3gwLCB4MSkgeCBbeTAsIHkxKS4KICAgICAgICAgICAgaWYgKG5vZGUubGVuZ3RoID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB4ID0gcXVhZFRyZWUueCgpKG5vZGUuZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeSA9IHF1YWRUcmVlLnkoKShub2RlLmRhdGEpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbnRlckRpc3QgPSBldWNsaWRlYW5EaXN0KGNlbnRlclgsIGNlbnRlclksIHgsIHkpOwogICAgICAgICAgICAgICAgICAgIGlmIChjZW50ZXJEaXN0IDw9IHJhZGl1cykgewogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayhub2RlLmRhdGEsIGNlbnRlckRpc3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0gd2hpbGUgKChub2RlID0gbm9kZS5uZXh0KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTa2lwIG5vZGVzIHRoYXQgcmVwcmVzZW50IGEgcmVjdGFuZ2xlIHRoYXQgZG9lcyBub3QgaW50ZXJzZWN0IHRoZQogICAgICAgICAgICAvLyBkaXNrLiBFcXVpdmFsZW50bHksIHNraXAgbm9kZXMgdGhhdCByZXByZXNlbnQgYSByZWN0YW5nbGUgd2hvc2UKICAgICAgICAgICAgLy8gZGlzdGFuY2UgdG8gKGNlbnRlclgsIGNlbnRlclkpIGlzIGxhcmdlciB0aGFuIHJhZGl1cy4KICAgICAgICAgICAgcmV0dXJuIHBvaW50VG9SZWN0YW5nbGVEaXN0KGNlbnRlclgsIGNlbnRlclksIHgwLCB5MCwgeDEsIHkxKSA+IHJhZGl1czsKICAgICAgICB9KTsKICAgIH0KICAgIC8vIFJldHVybnMgYSBTZXQgY29uc2lzdGluZyBvZiBhbGwgZWxlbWVudHMgaW4gJ3NldCcgZm9yIHdoaWNoCiAgICAvLyBwcmVkaWNhdGVGbiBldmFsdWF0ZXMgdG8gYSB0cnV0aHkgdmFsdWUuCiAgICBmdW5jdGlvbiBmaWx0ZXJTZXQoc2V0LCBwcmVkaWNhdGVGbikgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTsKICAgICAgICBzZXQuZm9yRWFjaCgodmFsKSA9PiB7CiAgICAgICAgICAgIGlmIChwcmVkaWNhdGVGbih2YWwpKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gU2V0cyB0aGUgYXJyYXkgcHJvcGVydHkgb2YgcG9seW1lckVsZW1lbnQgdG8gJ25ld0FycmF5JyBpbgogICAgLy8gYSBQb2x5bWVyLSJvYnNlcnZhYmxlIiBtYW5uZXIsIHNvIHRoYXQgb3RoZXIgZWxlbWVudHMgdGhhdCBoYXZlCiAgICAvLyB0aGUgYXJyYXkgYXMgYSBwcm9wZXJ0eSAobGlrZSBhIGRvbS1yZXBlYXQpIHdvdWxkIHVwZGF0ZSBjb3JyZWN0bHkuCiAgICAvLyBBcmdzOgogICAgLy8gICBwb2x5bWVyRWxlbWVudDogdGhlIHBvbHltZXIgZWxlbWVudCB3aG9zZSBhcnJheSBwcm9wZXJ0eSB3ZSB3YW50CiAgICAvLyAgICAgICAgICAgICAgICAgICB0byBjaGFuZ2UuCiAgICAvLyAgIHBhdGhUb0FycmF5OiBhIHBvbHltZXIgZG90LXNlcGFyYXRlZCBwYXRoIHN0cmluZyB0byB0aGUgYXJyYXkKICAgIC8vICAgbmV3QXJyYXk6IHRoZSBuZXcgYXJyYXkgdG8gc2V0LgogICAgZnVuY3Rpb24gc2V0QXJyYXlPYnNlcnZhYmx5KHBvbHltZXJFbGVtZW50LCBwYXRoVG9BcnJheSwgbmV3QXJyYXkpIHsKICAgICAgICBjb25zdCBjdXJyZW50QXJyYXkgPSBwb2x5bWVyRWxlbWVudC5nZXQocGF0aFRvQXJyYXksIHBvbHltZXJFbGVtZW50KTsKICAgICAgICAvLyBJZiB0aGUgY3VycmVudCB2YWx1ZSBpcyBub3QgYW4gYXJyYXksIHRoZW4gd2UgdXNlCiAgICAgICAgLy8gJ3BvbHltZXJFbGVtZW50LnNldCcgdG8gcmVwbGFjZSBpdCB3aXRoIG5ld0FycmF5LgogICAgICAgIGlmICghQXJyYXkuaXNBcnJheShjdXJyZW50QXJyYXkpKSB7CiAgICAgICAgICAgIHBvbHltZXJFbGVtZW50LnNldChwYXRoVG9BcnJheSwgbmV3QXJyYXkpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8vIENhbGwgUG9seW1lci5CYXNlLnNwbGljZSgpIHJlbW92aW5nIHRoZSBvbGQgZWxlbWVudHMgYW5kIGluc2VydGluZwogICAgICAgIC8vIHRoZSBuZXcgb25lcy4KICAgICAgICAvLyBXZSBuZWVkIHRvIGNhbGwgcG9seW1lckVsZW1lbnQuc3BsaWNlIHdpdGggJ2FwcGx5JyBzaW5jZSBzcGxpY2UKICAgICAgICAvLyByZWNlaXZlcyBhIHZhcmlhYmxlIGFyZ3VtZW50LWxpc3QgYW5kIHdlIHdhbnQgdG8gcGFzcyBpdCBhbiBhcnJheQogICAgICAgIC8vIChuZXdBcnJheSkuCiAgICAgICAgcG9seW1lckVsZW1lbnQuc3BsaWNlLmFwcGx5KHBvbHltZXJFbGVtZW50LCBbcGF0aFRvQXJyYXksIDAsIGN1cnJlbnRBcnJheS5sZW5ndGhdLmNvbmNhdChuZXdBcnJheSkpOwogICAgfQogICAgLy8gQ29tcHV0ZXMgYSBzaW1wbGUgbm90LXNlY3VyZSAzMi1iaXQgaW50ZWdlciBoYXNoIHZhbHVlIGZvciBhIHN0cmluZy4KICAgIGZ1bmN0aW9uIGhhc2hPZlN0cmluZyhzdHIpIHsKICAgICAgICBsZXQgcmVzdWx0ID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkgewogICAgICAgICAgICByZXN1bHQgPSAocmVzdWx0ICogMzEgKyBzdHIuY2hhckNvZGVBdChpKSkgJiA0Mjk0OTY3Mjk1OwogICAgICAgIH0KICAgICAgICAvLyBCaXR3aXNlIG9wZXJhdGlvbnMgaW4gSmF2YVNjcmlwdCBjb252ZXJ0IG9wZXJhbmRzIHRvIDMyLWJpdCAyJ3MKICAgICAgICAvLyBjb21wbGVtZW50IHJlcHJlc2VudGF0aW9uIGluIHRoZSByYW5nZSBbLTIqKjMxLCgyKiozMSktMV0uIFNoaWZ0IGl0CiAgICAgICAgLy8gdG8gdGhlIHJhbmdlIFswLCAoMioqMzIpLTFdLgogICAgICAgIHJldHVybiByZXN1bHQgKyBNYXRoLnBvdygyLCAzMSk7CiAgICB9CgogICAgdmFyIHRmX2hwYXJhbXNfdXRpbHMgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIGhwYXJhbU5hbWU6IGhwYXJhbU5hbWUsCiAgICAgICAgbWV0cmljTmFtZTogbWV0cmljTmFtZSwKICAgICAgICBzY2hlbWFDb2x1bW5OYW1lOiBzY2hlbWFDb2x1bW5OYW1lLAogICAgICAgIG51bUhQYXJhbXM6IG51bUhQYXJhbXMsCiAgICAgICAgbnVtTWV0cmljczogbnVtTWV0cmljcywKICAgICAgICBudW1Db2x1bW5zOiBudW1Db2x1bW5zLAogICAgICAgIGhwYXJhbVZhbHVlQnlOYW1lOiBocGFyYW1WYWx1ZUJ5TmFtZSwKICAgICAgICBtZXRyaWNWYWx1ZUJ5TmFtZTogbWV0cmljVmFsdWVCeU5hbWUsCiAgICAgICAgaHBhcmFtVmFsdWVCeUluZGV4OiBocGFyYW1WYWx1ZUJ5SW5kZXgsCiAgICAgICAgbWV0cmljVmFsdWVCeUluZGV4OiBtZXRyaWNWYWx1ZUJ5SW5kZXgsCiAgICAgICAgY29sdW1uVmFsdWVCeUluZGV4OiBjb2x1bW5WYWx1ZUJ5SW5kZXgsCiAgICAgICAgbnVtZXJpY0NvbHVtbkV4dGVudDogbnVtZXJpY0NvbHVtbkV4dGVudCwKICAgICAgICBnZXRBYnNvbHV0ZUNvbHVtbkluZGV4OiBnZXRBYnNvbHV0ZUNvbHVtbkluZGV4LAogICAgICAgIHNjaGVtYVZpc2libGVDb2x1bW5OYW1lOiBzY2hlbWFWaXNpYmxlQ29sdW1uTmFtZSwKICAgICAgICBudW1WaXNpYmxlSFBhcmFtczogbnVtVmlzaWJsZUhQYXJhbXMsCiAgICAgICAgbnVtVmlzaWJsZU1ldHJpY3M6IG51bVZpc2libGVNZXRyaWNzLAogICAgICAgIG51bVZpc2libGVDb2x1bW5zOiBudW1WaXNpYmxlQ29sdW1ucywKICAgICAgICB2aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudDogdmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQsCiAgICAgICAgcHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZTogcHJldHR5UHJpbnRIUGFyYW1WYWx1ZUJ5TmFtZSwKICAgICAgICBwcmV0dHlQcmludE1ldHJpY1ZhbHVlQnlOYW1lOiBwcmV0dHlQcmludE1ldHJpY1ZhbHVlQnlOYW1lLAogICAgICAgIHNlc3Npb25Hcm91cFdpdGhOYW1lOiBzZXNzaW9uR3JvdXBXaXRoTmFtZSwKICAgICAgICBocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4OiBocGFyYW1WYWx1ZUJ5VmlzaWJsZUluZGV4LAogICAgICAgIG1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXg6IG1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXgsCiAgICAgICAgY29sdW1uVmFsdWVCeVZpc2libGVJbmRleDogY29sdW1uVmFsdWVCeVZpc2libGVJbmRleCwKICAgICAgICBwcmV0dHlQcmludDogcHJldHR5UHJpbnQsCiAgICAgICAgbDJOb3JtU3F1YXJlZDogbDJOb3JtU3F1YXJlZCwKICAgICAgICBldWNsaWRlYW5EaXN0OiBldWNsaWRlYW5EaXN0LAogICAgICAgIHBvaW50VG9SZWN0YW5nbGVEaXN0OiBwb2ludFRvUmVjdGFuZ2xlRGlzdCwKICAgICAgICB0cmFuc2xhdGVTdHI6IHRyYW5zbGF0ZVN0ciwKICAgICAgICByb3RhdGVTdHI6IHJvdGF0ZVN0ciwKICAgICAgICBpc051bGxPclVuZGVmaW5lZDogaXNOdWxsT3JVbmRlZmluZWQsCiAgICAgICAgcXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdDogcXVhZFRyZWVWaXNpdFBvaW50c0luUmVjdCwKICAgICAgICBxdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrOiBxdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrLAogICAgICAgIGZpbHRlclNldDogZmlsdGVyU2V0LAogICAgICAgIHNldEFycmF5T2JzZXJ2YWJseTogc2V0QXJyYXlPYnNlcnZhYmx5LAogICAgICAgIGhhc2hPZlN0cmluZzogaGFzaE9mU3RyaW5nCiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBIcGFyYW1zU3BsaXRMYXlvdXQgPSBjbGFzcyBIcGFyYW1zU3BsaXRMYXlvdXQgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMub3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7CiAgICAgICAgfQogICAgfTsKICAgIEhwYXJhbXNTcGxpdExheW91dC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHNsb3QgbmFtZT0iY29udGVudCI+PC9zbG90PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CgogICAgICA6aG9zdCBzbG90IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgOmhvc3QgOjpzbG90dGVkKCopIHsKICAgICAgICBmbGV4OiAwIDAgYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIHNsb3QgewogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgICAgb3ZlcmZsb3cteDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSd2ZXJ0aWNhbCddKSBzbG90IHsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogY29sdW1uOwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0IDo6c2xvdHRlZCgqOm5vdCg6bGFzdC1jaGlsZCkpIHsKICAgICAgICBib3JkZXI6IDAgc29saWQgdmFyKC0tZGl2aWRlci1jb2xvciwgI2NjYyk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtvcmllbnRhdGlvbj0ndmVydGljYWwnXSkgOjpzbG90dGVkKCo6bm90KDpsYXN0LWNoaWxkKSkgewogICAgICAgIGJvcmRlci1ib3R0b20td2lkdGg6IDVweDsKICAgICAgfQoKICAgICAgOmhvc3QoW29yaWVudGF0aW9uPSdob3Jpem9udGFsJ10pIDo6c2xvdHRlZCgqOm5vdCg6bGFzdC1jaGlsZCkpIHsKICAgICAgICBib3JkZXItcmlnaHQtd2lkdGg6IDVweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcsIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIEhwYXJhbXNTcGxpdExheW91dC5wcm90b3R5cGUsICJvcmllbnRhdGlvbiIsIHZvaWQgMCk7CiAgICBIcGFyYW1zU3BsaXRMYXlvdXQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCdocGFyYW1zLXNwbGl0LWxheW91dCcpCiAgICBdLCBIcGFyYW1zU3BsaXRMYXlvdXQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBUaGUgdGYtaHBhcmFtcy1xdWVyeS1wYW5lIGVsZW1lbnQgaW1wbGVtZW50cyBjb250cm9scyBmb3IgcXVlcnlpbmcgdGhlCiAgICAgKiBzZXJ2ZXIgZm9yIGEgbGlzdCBvZiBzZXNzaW9uIGdyb3Vwcy4gSXQgcHJvdmlkZXMgZmlsdGVyaW5nLCBhbmQKICAgICAqIHNvcnRpbmcgY29udHJvbHMuCiAgICAgKgogICAgICogVE9ETyhlcmV6KTogQWRkIGFnZ3JlZ2F0aW9uIGNvbnRyb2xzIGZvciByZXBlYXRlZCBzZXNzaW9ucy4KICAgICAqLwogICAgbGV0IFRmSHBhcmFtc1F1ZXJ5UGFuZSA9IGNsYXNzIFRmSHBhcmFtc1F1ZXJ5UGFuZSBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvLyBDb250YWlucyB0aGUgc2NoZW1hIGFuZCBjb2x1bW5zIHZpc2liaWxpdHkgc3RhdHVzLgogICAgICAgICAgICAvLyBXZSB1c2UgYSBzaW5nbGUgb2JqZWN0IHdlIGNhbGwgJ2NvbmZpZ3VyYXRpb24nIHRvIGhvbGQgYm90aCBvZgogICAgICAgICAgICAvLyB0aGVzZSBwcm9wZXJ0aWVzLCBzaW5jZSBQb2x5bWVyICh2MSkgZG9lc24ndCBhbGxvdyBhdG9taWMKICAgICAgICAgICAgLy8gY2hhbmdlcyB0byBtdWx0aXBsZSBwcm9wZXJ0aWVzICh0aGF0IGlzLCBzZW5kaW5nIHRoZSBub3RpZmljYXRpb24KICAgICAgICAgICAgLy8gdG8gZG93bnN0cmVhbSBjb25zdW1lcnMgb25seSBhZnRlciBhbGwgcHJvcGVydGllcyBoYXZlIGJlZW4gdXBkYXRlZCkuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFByb3BlcnRpZXM6CiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIHNjaGVtYS5ocGFyYW1Db2x1bW5zW2ldLmhwYXJhbUluZm8gY29udGFpbnMgdGhlIEhQYXJhbUluZm8gcHJvdG9jb2wKICAgICAgICAgICAgLy8gYnVmZmVyIHJlcHJlc2VudGluZyB0aGUgaXRoIGhwYXJhbS4KICAgICAgICAgICAgLy8gc2NoZW1hLm1ldHJpY0NvbHVtbnNbaV0ubWV0cmljSW5mbyBjb250YWlucyB0aGUgTWV0cmljSW5mbyBwcm90b2NvbAogICAgICAgICAgICAvLyBidWZmZXIgcmVwcmVzZW50aW5nIHRoZSBpdGggbWV0cmljLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBjb2x1bW5zVmlzaWJpbGl0eVtdLgogICAgICAgICAgICAvLyBBIGJvb2xlYW4gYXJyYXkgd2hvc2UgaXRoIGVudHJ5IGlzIHRydWUgaWYKICAgICAgICAgICAgLy8gdGhlIGl0aCBjb2x1bW4gaXMgdmlzaWJsZSAoc2VsZWN0ZWQgdG8gYmUgZGlzcGxheWVkIGJ5IHRoZSB1c2VyKS4KICAgICAgICAgICAgLy8gQ29sdW1ucyBhcmUgaW5kZXhlZCBieSBsaXN0aW5nIHRoZSBoeXBlcnBhcmFtZXRlcnMgZmlyc3QgaW4KICAgICAgICAgICAgLy8gdGhlIG9yZGVyIHRoZXkgYXJlIHJlcHJlc2VudGVkIGJ5IHNjaGVtYS5ocGFyYW1Db2x1bW5zLCBmb2xsb3dlZAogICAgICAgICAgICAvLyBieSB0aGUgbWV0cmljcyBpbiB0aGUgb3JkZXIgdGhleSBhcmUgcmVwcmVzZW50ZWQgYnkKICAgICAgICAgICAgLy8gc2NoZW1hLm1ldHJpY0NvbHVtbnMuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIHZpc2libGVTY2hlbWEuCiAgICAgICAgICAgIC8vIERFUFJFQ0FURUQuIE5ldyBjb2RlIHNob3VsZCB1c2UgdGhlIHNjaGVtYSBhbmQgY29sdW1uVmlzaWJpbGUKICAgICAgICAgICAgLy8gcHJvcGVydGllcyBpbnN0ZWFkLgogICAgICAgICAgICAvLyBUT0RPKCk6IFJlbW92ZSB3aGVuIGFsbCBjb25zdW1lcnMgYXJlIG1pZ3JhdGVkIHRvIHVzZSB0aGUKICAgICAgICAgICAgLy8gc2NoZW1hIGFuZCBjb2x1bW5WaXNpYmlsZSBmaWVsZHMuCiAgICAgICAgICAgIC8vIENvbnRhaW5zIGFycmF5cyBvZiBIUGFyYW1JbmZvIGFuZCBNZXRyaWNJbmZvIHByb3RvY29sIGJ1ZmZlcnMKICAgICAgICAgICAgLy8gY29uc2lzdGluZyBvZiBvbmx5IHRoZSB2aXNpYmxlIGh5cGVycGFyYW1ldGVycyBhbmQgbWV0cmljcywKICAgICAgICAgICAgLy8gcmVzcGVjdGl2ZWx5LgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUge3sKICAgICAgICAgICAgICogICAgc2NoZW1hOiB7CiAgICAgICAgICAgICAqICAgICAgaHBhcmFtQ29sdW1uczogQXJyYXk8e2hwYXJhbUluZm86IE9iamVjdH0+LAogICAgICAgICAgICAgKiAgICAgIG1ldHJpY0NvbHVtbnM6IEFycmF5PHttZXRyaWNJbmZvOiBPYmplY3R9PiwKICAgICAgICAgICAgICogICAgfSwKICAgICAgICAgICAgICogICAgY29sdW1uc1Zpc2liaWxpdHk6IEFycmF5PEJvb2xlYW4+LAogICAgICAgICAgICAgKiAgICB2aXNpYmxlU2NoZW1hOiB7CiAgICAgICAgICAgICAqICAgICAgaHBhcmFtSW5mb3M6IEFycmF5PE9iamVjdD4sCiAgICAgICAgICAgICAqICAgICAgbWV0cmljSW5mb3M6IEFycmF5PE9iamVjdD4sCiAgICAgICAgICAgICAqICAgIH0KICAgICAgICAgICAgICogfX0KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbiA9IHsKICAgICAgICAgICAgICAgIHNjaGVtYTogewogICAgICAgICAgICAgICAgICAgIGhwYXJhbUNvbHVtbnM6IFtdLAogICAgICAgICAgICAgICAgICAgIG1ldHJpY0NvbHVtbnM6IFtdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIGNvbHVtbnNWaXNpYmlsaXR5OiBbXSwKICAgICAgICAgICAgICAgIHZpc2libGVTY2hlbWE6IHsKICAgICAgICAgICAgICAgICAgICBocGFyYW1JbmZvczogW10sCiAgICAgICAgICAgICAgICAgICAgbWV0cmljSW5mb3M6IFtdLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gVGhlIGxhdGVzdCBsaXN0IG9mIHNlc3Npb24gZ3JvdXBzIHJlY2VpdmVkIGZyb20gdGhlIHNlcnZlci4KICAgICAgICAgICAgLy8gU2VlIHRoZSBjb21tZW50cyBpbiB0aGUgX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCkgbWV0aG9kcyBmb3IKICAgICAgICAgICAgLy8gbW9yZSBkZXRhaWxzLgogICAgICAgICAgICB0aGlzLnNlc3Npb25Hcm91cHMgPSBbXTsKICAgICAgICAgICAgLy8gV2UgdHJhY2sgYm90aCAiZGF0YSBmb3VuZCIgYW5kICJkYXRhIG5vdCBmb3VuZCIsIGJlY2F1c2UgdGhpcwogICAgICAgICAgICAvLyBtYWtlcyBpdCBleHBlZGllbnQgdG8gZGlzcGxheSBub3RoaW5nIHVudGlsIHRoZSBpbml0aWFsIGZldGNoIGlzCiAgICAgICAgICAgIC8vIGNvbXBsZXRlLiAgSW4gdGhlIGFic2VuY2Ugb2YgdGhpcyAidW5kZWZpbmVkIiBjYXNlLCB3ZSB3b3VsZCBlbmQgdXAKICAgICAgICAgICAgLy8gYnJpZWZseSBkaXNwbGF5aW5nIHRoZSAibm8gZGF0YSIgbWVzc2FnZSBiZWZvcmUgdGhlIGRhdGEgYXJyaXZlcy4KICAgICAgICAgICAgLy8gTm90ZSB0aGF0LCBpbiB0aGUgY29udGV4dCBvZiBhIGRvbS1pZiBjb25kaXRpb24sIHdlIGNhbm5vdCBlYXNpbHkKICAgICAgICAgICAgLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBmYWxzZSBhbmQgdW5kZWZpbmVkLgogICAgICAgICAgICB0aGlzLmRhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zID0gZmFsc2U7CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBgZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMgPSBmYWxzZWAgbWVhbnMgdGhhdCB3ZSBkb24ndAogICAgICAgICAgICAvLyBrbm93IHlldCB3aGV0aGVyIGRhdGEgd2lsbCBiZSBmb3VuZCBvciBub3QgKGkuZS4sIHRoZSBmZXRjaCBoYXMgbm90CiAgICAgICAgICAgIC8vIHlldCByZXR1cm5lZCkuICBgZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMgPSB0cnVlYCBtZWFucyB0aGUgZmV0Y2gKICAgICAgICAgICAgLy8gY29tcGxldGVkLCBhbmQgdGhlcmUgcmVhbGx5IGlzIG5vIGRhdGEuCiAgICAgICAgICAgIHRoaXMuZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMgPSBmYWxzZTsKICAgICAgICAgICAgLy8gQW4gYXJyYXkgb2Ygb2JqZWN0cyBlYWNoIHJlcHJlc2VudGluZyBpbmZvcm1hdGlvbiBhYm91dCBhIHNlc3Npb24KICAgICAgICAgICAgLy8gc3RhdHVzIGFuZCB3aGV0aGVyIGl0IGlzIGN1cnJlbnRseSBhbGxvd2VkIGJ5IHRoZSB1c2VyLgogICAgICAgICAgICB0aGlzLl9zdGF0dXNlcyA9IFsKICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdTVEFUVVNfVU5LTk9XTicsIGRpc3BsYXlOYW1lOiAnVW5rbm93bicsIGFsbG93ZWQ6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdTVEFUVVNfU1VDQ0VTUycsIGRpc3BsYXlOYW1lOiAnU3VjY2VzcycsIGFsbG93ZWQ6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdTVEFUVVNfRkFJTFVSRScsIGRpc3BsYXlOYW1lOiAnRmFpbHVyZScsIGFsbG93ZWQ6IHRydWUgfSwKICAgICAgICAgICAgICAgIHsgdmFsdWU6ICdTVEFUVVNfUlVOTklORycsIGRpc3BsYXlOYW1lOiAnUnVubmluZycsIGFsbG93ZWQ6IHRydWUgfSwKICAgICAgICAgICAgXTsKICAgICAgICAgICAgLy8gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIGluaXRpYWwgZ2V0RXhwZXJpbWVudCBuZXR3b3JrIFJQQwogICAgICAgICAgICAvLyByZXNvbHZlcy4gVXNlZCBmb3IgdW5pdC10ZXN0IHRvIGFsbG93IHRlc3RpbmcgdG8gcnVuIGFmdGVyIHRoZQogICAgICAgICAgICAvLyBlbGVtZW50IGhhcyBpbml0aWFsaXplZC4KICAgICAgICAgICAgdGhpcy5fZ2V0RXhwZXJpbWVudFJlc29sdmVkID0gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3Jlc29sdmVHZXRFeHBlcmltZW50ID0gcmVzb2x2ZTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIEEgdGZfYmFja2VuZC5jYW5jZWxsZXIgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHBlbmRpbmcKICAgICAgICAgICAgLy8gTGlzdFNlc3Npb25Hcm91cHMgcmVxdWVzdHMgYW5kIGNhbmNlbCB0aGVpciByZXN1bHRpbmcgVUkgdXBkYXRlcwogICAgICAgICAgICAvLyB3aGVuIGEgbmV3IExpc3RTZXNzaW9uR3JvdXBzIHJlcXVlc3QgaXMgbWFkZS4KICAgICAgICAgICAgdGhpcy5fbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXIgPSBuZXcgQ2FuY2VsbGVyKCk7CiAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBhbmQgaW52YWxpZCBwcm9wZXJ0aWVzIG9mIHRoZSAncGFnZS1zaXplJyBpbnB1dCBib3guCiAgICAgICAgICAgIHRoaXMuX3BhZ2VTaXplSW5wdXQgPSB7IHZhbHVlOiAnMTAwJywgaW52YWxpZDogZmFsc2UgfTsKICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGFuZCBpbnZhbGlkIHByb3BlcnRpZXMgb2YgdGhlICdwYWdlLW51bWJlcicgaW5wdXQgYm94LgogICAgICAgICAgICB0aGlzLl9wYWdlTnVtYmVySW5wdXQgPSB7IHZhbHVlOiAnMScsIGludmFsaWQ6IGZhbHNlIH07CiAgICAgICAgICAgIC8vIFRoZSBzdHJpbmcgZGlzcGxheWluZyB0aGUgdG90YWwgbnVtYmVyIG9mIHBhZ2VzIG9yICc/JyBpZiB1bmtub3duLgogICAgICAgICAgICB0aGlzLl9wYWdlQ291bnRTdHIgPSAnPyc7CiAgICAgICAgICAgIHRoaXMuX2hwYXJhbU5hbWUgPSBocGFyYW1OYW1lOwogICAgICAgICAgICB0aGlzLl9tZXRyaWNOYW1lID0gbWV0cmljTmFtZTsKICAgICAgICAgICAgdGhpcy5fcHJldHR5UHJpbnQgPSBwcmV0dHlQcmludDsKICAgICAgICB9CiAgICAgICAgcmVsb2FkKCkgewogICAgICAgICAgICB0aGlzLl9xdWVyeVNlcnZlcigpOwogICAgICAgIH0KICAgICAgICBfY3N2VXJsKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChyZXF1ZXN0LCBjb25maWd1cmF0aW9uLCAnY3N2Jyk7CiAgICAgICAgfQogICAgICAgIF9qc29uVXJsKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rvd25sb2FkRGF0YVVybChyZXF1ZXN0LCBjb25maWd1cmF0aW9uLCAnanNvbicpOwogICAgICAgIH0KICAgICAgICBfbGF0ZXhVcmwocmVxdWVzdCwgY29uZmlndXJhdGlvbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZG93bmxvYWREYXRhVXJsKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24sICdsYXRleCcpOwogICAgICAgIH0KICAgICAgICBfZG93bmxvYWREYXRhVXJsKHJlcXVlc3QsIGNvbmZpZ3VyYXRpb24sIGZvcm1hdCkgewogICAgICAgICAgICBjb25zdCB2aXNpYmlsaXR5ID0gY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZC5nZXREb3dubG9hZFVybChmb3JtYXQsIHJlcXVlc3QsIHZpc2liaWxpdHkpOwogICAgICAgIH0KICAgICAgICAvLyBTZW5kcyBhIHJlcXVlc3QgZm9yIGV4cGVyaW1lbnQgdG8gdGhlIHNlcnZlciwgYW5kIHVwZGF0ZXMKICAgICAgICAvLyB0aGUgc3RhdGUgb2YgdGhpcyBlbGVtZW50IGFjY29yZGluZ2x5LiBDdXJyZW50bHksIG9ubHkgY2FsbGVkCiAgICAgICAgLy8gb25jZSBvbiBlbGVtZW50IGluaXRpYWxpemF0aW9uLgogICAgICAgIF9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcygpIHsKICAgICAgICAgICAgY29uc3QgdXRpbHMgPSB0Zl9ocGFyYW1zX3V0aWxzOwogICAgICAgICAgICBpZiAodXRpbHMuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5iYWNrZW5kKSB8fAogICAgICAgICAgICAgICAgdXRpbHMuaXNOdWxsT3JVbmRlZmluZWQodGhpcy5leHBlcmltZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBleHBlcmltZW50UmVxdWVzdCA9IHsKICAgICAgICAgICAgICAgIGV4cGVyaW1lbnROYW1lOiB0aGlzLmV4cGVyaW1lbnROYW1lLAogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLmJhY2tlbmQKICAgICAgICAgICAgICAgIC5nZXRFeHBlcmltZW50KGV4cGVyaW1lbnRSZXF1ZXN0KQogICAgICAgICAgICAgICAgLnRoZW4oKGV4cGVyaW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNFcXVhbChleHBlcmltZW50LCB0aGlzLl9leHBlcmltZW50KSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdXBkYXRlIGFueXRoaW5nIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VzLgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfZXhwZXJpbWVudCcsIGV4cGVyaW1lbnQpOwogICAgICAgICAgICAgICAgdGhpcy5fY29tcHV0ZUhQYXJhbXMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVNZXRyaWNzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9xdWVyeVNlcnZlcigpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVzb2x2ZUdldEV4cGVyaW1lbnQoKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5maW5hbGx5KCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVEYXRhRm91bmQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlRGF0YUZvdW5kKCkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBCb29sZWFuKHRoaXMuX2V4cGVyaW1lbnQgJiYKICAgICAgICAgICAgICAgIHRoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MgJiYKICAgICAgICAgICAgICAgIHRoaXMuX2V4cGVyaW1lbnQuaHBhcmFtSW5mb3MubGVuZ3RoID4gMCAmJgogICAgICAgICAgICAgICAgdGhpcy5fZXhwZXJpbWVudC5tZXRyaWNJbmZvcyAmJgogICAgICAgICAgICAgICAgdGhpcy5fZXhwZXJpbWVudC5tZXRyaWNJbmZvcy5sZW5ndGggPiAwKTsKICAgICAgICAgICAgdGhpcy5zZXQoJ2RhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zJywgcmVzdWx0KTsKICAgICAgICAgICAgdGhpcy5zZXQoJ2RhdGFMb2FkZWRXaXRoRW1wdHlIcGFyYW1zJywgIXJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZXMgdGhlIF9ocGFyYW1zIHByb3BlcnR5IGZyb20gdGhlIF9leHBlcmltZW50IHByb3BlcnR5LgogICAgICAgIF9jb21wdXRlSFBhcmFtcygpIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgICAgIGNvbnN0IGtOdW1IUGFyYW1zVG9EaXNwbGF5QnlEZWZhdWx0ID0gNTsKICAgICAgICAgICAgdGhpcy5fZXhwZXJpbWVudC5ocGFyYW1JbmZvcy5mb3JFYWNoKChhbkluZm8sIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBocGFyYW0gPSB7CiAgICAgICAgICAgICAgICAgICAgaW5mbzogYW5JbmZvLAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZDogaW5kZXggPCBrTnVtSFBhcmFtc1RvRGlzcGxheUJ5RGVmYXVsdCwKICAgICAgICAgICAgICAgICAgICBmaWx0ZXI6IHt9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGlmIChocGFyYW0uaW5mby5oYXNPd25Qcm9wZXJ0eSgnZG9tYWluRGlzY3JldGUnKSkgewogICAgICAgICAgICAgICAgICAgIGhwYXJhbS5maWx0ZXIuZG9tYWluRGlzY3JldGUgPSBbXTsKICAgICAgICAgICAgICAgICAgICBocGFyYW0uaW5mby5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKCh2YWwpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaHBhcmFtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhwYXJhbS5pbmZvLnR5cGUgPT09ICdEQVRBX1RZUEVfQk9PTCcpIHsKICAgICAgICAgICAgICAgICAgICBocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlID0gWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGVja2VkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrZWQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhwYXJhbS5pbmZvLnR5cGUgPT09ICdEQVRBX1RZUEVfRkxPQVQ2NCcpIHsKICAgICAgICAgICAgICAgICAgICBocGFyYW0uZmlsdGVyLmludGVydmFsID0gewogICAgICAgICAgICAgICAgICAgICAgICBtaW46IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChocGFyYW0uaW5mby50eXBlID09PSAnREFUQV9UWVBFX1NUUklORycpIHsKICAgICAgICAgICAgICAgICAgICBocGFyYW0uZmlsdGVyLnJlZ2V4cCA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCd1bmtub3duIGhwYXJhbS5pbmZvLnR5cGU6ICVzJywgaHBhcmFtLmluZm8udHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChocGFyYW0pOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5zZXQoJ19ocGFyYW1zJywgcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgLy8gVXBkYXRlcyB0aGUgX21ldHJpY3MgcHJvcGVydHkgZnJvbSB0aGUgX2V4cGVyaW1lbnQgcHJvcGVydHkuCiAgICAgICAgX2NvbXB1dGVNZXRyaWNzKCkgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCB3ZSBkaXNwbGF5IHRoZSBmaXJzdCBrTnVtTWV0cmljc1RvRGlzcGxheUJ5RGVmYXVsdCBtZXRyaWNzCiAgICAgICAgICAgIC8vIGFuZCBub3QgdGhlIHJlc3QuCiAgICAgICAgICAgIGNvbnN0IGtOdW1NZXRyaWNzVG9EaXNwbGF5QnlEZWZhdWx0ID0gNTsKICAgICAgICAgICAgdGhpcy5fZXhwZXJpbWVudC5tZXRyaWNJbmZvcy5mb3JFYWNoKChpbmZvLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgbWV0cmljID0gewogICAgICAgICAgICAgICAgICAgIGluZm86IGluZm8sCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGludGVydmFsOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW46IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogJycsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4OiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6ICcnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWQ6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGRpc3BsYXllZDogaW5kZXggPCBrTnVtTWV0cmljc1RvRGlzcGxheUJ5RGVmYXVsdCwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChtZXRyaWMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5zZXQoJ19tZXRyaWNzJywgcmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVTY2hlbWEoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faHBhcmFtcyB8fCAhdGhpcy5fbWV0cmljcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgaHBhcmFtQ29sdW1uczogW10sIG1ldHJpY0NvbHVtbnM6IFtdIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGhwYXJhbUNvbHVtbnM6IHRoaXMuX2hwYXJhbXMubWFwKChocGFyYW0pID0+ICh7CiAgICAgICAgICAgICAgICAgICAgaHBhcmFtSW5mbzogaHBhcmFtLmluZm8sCiAgICAgICAgICAgICAgICB9KSksCiAgICAgICAgICAgICAgICBtZXRyaWNDb2x1bW5zOiB0aGlzLl9tZXRyaWNzLm1hcCgobWV0cmljKSA9PiAoewogICAgICAgICAgICAgICAgICAgIG1ldHJpY0luZm86IG1ldHJpYy5pbmZvLAogICAgICAgICAgICAgICAgfSkpLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBfdXBkYXRlQ29uZmlndXJhdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZSgnX3VwZGF0ZUNvbmZpZ3VyYXRpb24nLCAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgc2NoZW1hOiB0aGlzLl9jb21wdXRlU2NoZW1hKCksCiAgICAgICAgICAgICAgICAgICAgY29sdW1uc1Zpc2liaWxpdHk6IHRoaXMuX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpLAogICAgICAgICAgICAgICAgICAgIHZpc2libGVTY2hlbWE6IHRoaXMuX2NvbXB1dGVWaXNpYmxlU2NoZW1hKCksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVDb2x1bW5zVmlzaWJpbGl0eSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9ocGFyYW1zIHx8ICF0aGlzLl9tZXRyaWNzKQogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICByZXR1cm4gdGhpcy5faHBhcmFtcwogICAgICAgICAgICAgICAgLm1hcCgoaHBhcmFtKSA9PiBocGFyYW0uZGlzcGxheWVkKQogICAgICAgICAgICAgICAgLmNvbmNhdCh0aGlzLl9tZXRyaWNzLm1hcCgobWV0cmljKSA9PiBtZXRyaWMuZGlzcGxheWVkKSk7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlVmlzaWJsZVNjaGVtYSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9ocGFyYW1zIHx8ICF0aGlzLl9tZXRyaWNzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBocGFyYW1JbmZvczogW10sIG1ldHJpY0luZm9zOiBbXSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IG5ld0hQYXJhbUluZm9zID0gdGhpcy5faHBhcmFtcwogICAgICAgICAgICAgICAgLmZpbHRlcigoaHBhcmFtKSA9PiBocGFyYW0uZGlzcGxheWVkKQogICAgICAgICAgICAgICAgLm1hcCgoaHBhcmFtKSA9PiBocGFyYW0uaW5mbyk7CiAgICAgICAgICAgIGNvbnN0IG5ld01ldHJpY0luZm9zID0gdGhpcy5fbWV0cmljcwogICAgICAgICAgICAgICAgLmZpbHRlcigobWV0cmljKSA9PiBtZXRyaWMuZGlzcGxheWVkKQogICAgICAgICAgICAgICAgLm1hcCgobWV0cmljKSA9PiBtZXRyaWMuaW5mbyk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBocGFyYW1JbmZvczogbmV3SFBhcmFtSW5mb3MsCiAgICAgICAgICAgICAgICBtZXRyaWNJbmZvczogbmV3TWV0cmljSW5mb3MsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8vIFNlbmRzIGEgcXVlcnkgdG8gdGhlIHNlcnZlciBmb3IgdGhlIGxpc3Qgb2Ygc2Vzc2lvbiBncm91cHMuCiAgICAgICAgLy8gQXN5bmNocm9ub3VzbHkgdXBkYXRlcyB0aGUgc2Vzc2lvbkdyb3VwcyBwcm9wZXJ0eSB3aXRoIHRoZSByZXNwb25zZS4KICAgICAgICBfcXVlcnlTZXJ2ZXIoKSB7CiAgICAgICAgICAgIHRoaXMuZGVib3VuY2UoJ3F1ZXJ5U2VydmVyJywgKCkgPT4gdGhpcy5fcXVlcnlTZXJ2ZXJOb0RlYm91bmNlKCksIDEwMCk7CiAgICAgICAgfQogICAgICAgIC8vIERpcmVjdGx5IHF1ZXJpZXMgdGhlIHNlcnZlciB3aXRob3V0IGEgZGVib3VuY2UsIGNhbGxlZCBpbiBxdWVyeVNlcnZlcigpCiAgICAgICAgLy8gYWJvdmUuIFJldHVybnMgYSBwcm9taXNlLCBmb3IgdXNlIGluIHVuaXQtdGVzdHMsIHRoYXQgcmVzb2x2ZXMgKHdpdGgKICAgICAgICAvLyAndW5kZWZpbmVkJykgd2hlbiB0aGUgTGlzdFNlc3Npb25Hcm91cHMgUlBDIHJldHVybnMuCiAgICAgICAgX3F1ZXJ5U2VydmVyTm9EZWJvdW5jZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9ocGFyYW1zIHx8ICF0aGlzLl9tZXRyaWNzKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbmRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKS50aGVuKHRoaXMuX2xpc3RTZXNzaW9uR3JvdXBzQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKCh7IHZhbHVlLCBjYW5jZWxsZWQgfSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFRoZSBzZXJ2ZXIgbWF5IG5vdCBzdXBwb3J0IGEgInRvdGFsU2l6ZSIgZmllbGQgaW4KICAgICAgICAgICAgICAgIC8vIHdoaWNoIGNhc2UgdGhpcyBmaWVsZCB3b3VsZCBiZSBuZWdhdGl2ZSwgYW5kIHdlCiAgICAgICAgICAgICAgICAvLyBwb3B1bGF0ZSB0aGUgcGFnZSBjb3VudCB3aXRoIGEgIj8iLgogICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRvdGFsU2l6ZSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFnZVNpemUgPSArdGhpcy5fcGFnZVNpemVJbnB1dC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3BhZ2VDb3VudFN0cicsIFN0cmluZyhNYXRoLmNlaWwodmFsdWUudG90YWxTaXplIC8gcGFnZVNpemUpKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ190b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0cicsIHZhbHVlLnRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3BhZ2VDb3VudFN0cicsICc/Jyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ190b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0cicsICdVbmtub3duJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzZXRBcnJheU9ic2VydmFibHkodGhpcywgJ3Nlc3Npb25Hcm91cHMnLCB2YWx1ZS5zZXNzaW9uR3JvdXBzKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBfc2VuZExpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCgpIHsKICAgICAgICAgICAgY29uc3QgcmVxdWVzdCA9IHRoaXMuX2J1aWxkTGlzdFNlc3Npb25Hcm91cHNSZXF1ZXN0KCk7CiAgICAgICAgICAgIGlmIChyZXF1ZXN0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBJZiBxdWVyeSBjb25maWd1cmF0aW9uIGlzIG5vdCB2YWxpZCBkb24ndCBzZW5kIGEgcmVxdWVzdC4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNldCgnX3Nlc3Npb25Hcm91cHNSZXF1ZXN0JywgcmVxdWVzdCk7CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgcmVzcG9uc2VzIHRvIHRoZSBSUENzIHNlbnQKICAgICAgICAgICAgLy8gdG8gdGhlIGJhY2tlbmQgbWF5IHJldHVybiBpbiBhIGRpZmZlcmVudCBvcmRlciB0aGFuIHRoZSBvcmRlciBpbgogICAgICAgICAgICAvLyB3aGljaCB0aGV5IHdlcmUgc2VudC4gSWYgd2UganVzdCB1cGRhdGUgc2Vzc2lvbkdyb3VwcyBpbiB0aGUKICAgICAgICAgICAgLy8gb3JkZXIgb2YgcmVzcG9uc2VzIHJlY2VpdmVkLCB3ZSBjYW4gZW5kIHVwCiAgICAgICAgICAgIC8vIHdpdGggYSBzZXNzaW9uR3JvdXBzIG9iamVjdCB0aGF0IGRvZXNuJ3QgbWF0Y2ggdGhlIGZpbHRlcmluZyBhbmQKICAgICAgICAgICAgLy8gc29ydGluZyBjb25maWd1cmF0aW9uLiBGb3IgZXhhbXBsZSwgaWYgdGhlIGxhc3QgcmVzcG9uc2UgcmVjZWl2ZWQKICAgICAgICAgICAgLy8gd2FzIGZvciBhIHF1ZXJ5IGJlbG9uZ2luZyB0byB0aGUgcGVudWx0aW1hdGUgZmlsdGVyaW5nIGFuZAogICAgICAgICAgICAvLyBzb3J0aW5nIGNvbmZpZ3VyYXRpb24uIFRvIHNvbHZlIHRoaXMsIHdlIHVzZSB0Zl9iYWNrZW5kLmNhbmNlbGxlcgogICAgICAgICAgICAvLyB0byBjYW5jZWwgYWxsIHRoZSBwZW5kaW5nIHByb21pc2VzIGZyb20gcHJldmlvdXMgcXVlcmllcyBmb3Igd2hpY2gKICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCByZWNlaXZlZCBhIHJlc3BvbnNlIHlldC4KICAgICAgICAgICAgdGhpcy5fbGlzdFNlc3Npb25Hcm91cHNDYW5jZWxsZXIuY2FuY2VsQWxsKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJhY2tlbmQubGlzdFNlc3Npb25Hcm91cHMocmVxdWVzdCk7CiAgICAgICAgfQogICAgICAgIC8vIFJlYWRzIHRoZSB2YWx1ZXMgb2YgdGhlIHByb3BlcnRpZXMgYm91bmQgdG8gdGhlIHF1ZXJ5IGVsZW1lbnRzCiAgICAgICAgLy8gYW5kIGJ1aWxkcyB0aGUgY29ycmVzcG9uZGluZyBMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QuCiAgICAgICAgLy8gSWYgdGhlIHVzZXIgc2V0dGluZ3MgYXJlIGludmFsaWQgKGUuZy4gYW4gaW5wdXQtYm94IGRvZXNuJ3QgY29udGFpbnQKICAgICAgICAvLyBhIHBhcnNhYmxlIG51bWJlciksIG1hcmtzIHRoZSBjb3JyZXNwb25kaW5nIGVsZW1lbnRzIChpZiB0aGV5IGV4aXN0LAogICAgICAgIC8vIHNlZSBuZXh0IHBhcmFncmFwaCkgYXMgaW52YWxpZCBzbyB0aGF0IHRoZXkgd2lsbCBkaXNwbGF5IGFuCiAgICAgICAgLy8gZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBudWxsLgogICAgICAgIC8vCiAgICAgICAgLy8gTm90ZSwgdGhhdCB0aGlzIG1ldGhvZCBjYW4gYmUgY2FsbGVkIGJlZm9yZSB0aGUgZWxlbWVudHMgaGF2ZQogICAgICAgIC8vIGJlZW4gcmVuZGVyZWQgKHdoZW4gdGhlIHRmLWhwYXJhbXMtcXVlcnkgaXMgZmlyc3QgY3JlYXRlZCksIGluIHdoaWNoCiAgICAgICAgLy8gY2FzZSBpdCB3aWxsIG5vdCB0cnkgdG8gbWFyayB0aGUgZWxlbWVudHMgYXMgaW52YWxpZC4KICAgICAgICBfYnVpbGRMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QoKSB7CiAgICAgICAgICAgIGNvbnN0IF90aGlzID0gdGhpczsKICAgICAgICAgICAgLy8gV2lsbCBiZSBzZXQgdG8gZmFsc2UgaWYgd2UgZW5jb3VudGVyIGFueSBpbnZhbGlkIGlucHV0cy4KICAgICAgICAgICAgbGV0IHF1ZXJ5VmFsaWQgPSB0cnVlOwogICAgICAgICAgICAvLyBQYXJzZXMgYW4gaW5wdXRJbnRlcnZhbCBvYmplY3Qgb2YgdGhlIGZvcm06CiAgICAgICAgICAgIC8vIHttaW46IHt2YWx1ZTogc3RyaW5nLCBpbnZhbGlkOiBib29sZWFufSwKICAgICAgICAgICAgLy8gIG1heDoge3ZhbHVlOiBzdHJpbmcgIGludmFsaWQ6IGJvb2xlYW59fS4gUmV0dXJucyBhbiBvYmplY3QKICAgICAgICAgICAgLy8gb2YgdGhlIGZvcm06IHttaW5WYWx1ZTogbnVtYmVyLCBtYXhWYWx1ZTogbnVtYmVyfSBzdWl0YWJsZSB0bwogICAgICAgICAgICAvLyBiZSBpbmNsdWRlZCBhcyBhbiBpbnRlcnZhbCBpbiBMaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QuIElmIHRoZQogICAgICAgICAgICAvLyBtaW4gb3IgbWF4IHZhbHVlcyBjYW5ub3QgYmUgcGFyc2VkLCByZXR1cm5zIG51bGwuIEluIGJvdGggY2FzZXMKICAgICAgICAgICAgLy8gc2V0cyB0aGUgJ2ludmFsaWQnIGZpZWxkcyB0byBkZW5vdGUgd2hldGhlciB0aGUgaW5wdXRzIGlzIGludmFsaWQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFRoZSBpbnB1dEludGVydmFsUGF0aCBzaG91bGQgYmUgYSBQb2x5bWVyIHBhdGggZm9yIHRoZSBpbnB1dEludGVydmFsCiAgICAgICAgICAgIC8vIG9iamVjdC4gV2Ugd29yayB3aXRoIHBhdGhzLCByYXRoZXIgdGhhbiB0aGUgb2JqZWN0LCBzbyB0aGF0IHdlCiAgICAgICAgICAgIC8vIGNhbiBtYWtlIG9ic2VydmFibGUgY2hhbmdlcy4KICAgICAgICAgICAgZnVuY3Rpb24gcGFyc2VJbnB1dEludGVydmFsKGlucHV0SW50ZXJ2YWxQYXRoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtaW5WYWx1ZVN0ciA9IF90aGlzLmdldChpbnB1dEludGVydmFsUGF0aCArICcubWluLnZhbHVlJyk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmFzc2VydChtaW5WYWx1ZVN0ciAhPT0gdW5kZWZpbmVkKTsKICAgICAgICAgICAgICAgIC8vIFRoZSBwcm90b2J1ZmZlciBKU09OIG1hcHBpbmcgbWFwcyB0aGUgc3RyaW5ncyAiLUluZmluaXR5IiBhbmQKICAgICAgICAgICAgICAgIC8vICJJbmZpbml0eSIgdG8gdGhlIGZsb2F0aW5nLXBvaW50IGluZmluaXR5IGFuZCAtaW5maW5pdHkgdmFsdWVzLgogICAgICAgICAgICAgICAgY29uc3QgbWluVmFsdWUgPSBtaW5WYWx1ZVN0ciA9PT0gJycgPyAnLUluZmluaXR5JyA6ICttaW5WYWx1ZVN0cjsKICAgICAgICAgICAgICAgIF90aGlzLnNldChpbnB1dEludGVydmFsUGF0aCArICcubWluLmludmFsaWQnLCBpc05hTihtaW5WYWx1ZSkpOwogICAgICAgICAgICAgICAgcXVlcnlWYWxpZCA9IHF1ZXJ5VmFsaWQgJiYgIWlzTmFOKG1pblZhbHVlKTsKICAgICAgICAgICAgICAgIGNvbnN0IG1heFZhbHVlU3RyID0gX3RoaXMuZ2V0KGlucHV0SW50ZXJ2YWxQYXRoICsgJy5tYXgudmFsdWUnKTsKICAgICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KG1heFZhbHVlU3RyICE9PSB1bmRlZmluZWQpOwogICAgICAgICAgICAgICAgY29uc3QgbWF4VmFsdWUgPSBtYXhWYWx1ZVN0ciA9PT0gJycgPyAnSW5maW5pdHknIDogK21heFZhbHVlU3RyOwogICAgICAgICAgICAgICAgX3RoaXMuc2V0KGlucHV0SW50ZXJ2YWxQYXRoICsgJy5tYXguaW52YWxpZCcsIGlzTmFOKG1heFZhbHVlKSk7CiAgICAgICAgICAgICAgICBxdWVyeVZhbGlkID0gcXVlcnlWYWxpZCAmJiAhaXNOYU4obWF4VmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKGlzTmFOKG1pblZhbHVlKSB8fCBpc05hTihtYXhWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7IG1pblZhbHVlOiBtaW5WYWx1ZSwgbWF4VmFsdWU6IG1heFZhbHVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUGFyc2VzIHRoZSB2YWx1ZSBvZiBhbiBpbnB1dCBvYmplY3Qgb2YgdGhlIGZvcm06CiAgICAgICAgICAgIC8vIHt2YWx1ZTogc3RyaW5nLCBpbnZhbGlkOiBib29sZWFufSBhcyBhIHBvc2l0aXZlIGludGVnZXIgYW5kIHJldHVybnMKICAgICAgICAgICAgLy8gdGhlIGludGVnZXIgb3IgbnVsbCBpZiB0aGUgcGFyc2luZyBmYWlscy4KICAgICAgICAgICAgLy8gSWYgcGFyc2luZyBmYWlscywgYWxzbyBzZXRzIHRoZSAnaW52YWxpZCcgcHJvcGVydHkgb2YgdGhlIGlucHV0CiAgICAgICAgICAgIC8vIG9iamVjdCB0byBmYWxzZS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gVGhlIGlucHV0UGF0aCBzaG91bGQgYmUgYSBQb2x5bWVyIHBhdGggdG8gaW5wdXQgb2JqZWN0LiBXZSB3b3JrCiAgICAgICAgICAgIC8vIHdpdGggcGF0aHMsIHJhdGhlciB0aGFuIHRoZSBvYmplY3QsIHNvIHRoYXQgd2UgY2FuIG1ha2Ugb2JzZXJ2YWJsZQogICAgICAgICAgICAvLyBjaGFuZ2VzLgogICAgICAgICAgICBmdW5jdGlvbiBwYXJzZUlucHV0QXNQb3NpdGl2ZUludChpbnB1dFBhdGgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWVTdHIgPSBfdGhpcy5nZXQoaW5wdXRQYXRoICsgJy52YWx1ZScpOwogICAgICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoaW5wdXRWYWx1ZVN0ciAhPT0gdW5kZWZpbmVkKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9ICtpbnB1dFZhbHVlU3RyOwogICAgICAgICAgICAgICAgY29uc3QgdmFsaWRSZXN1bHQgPSBOdW1iZXIuaXNJbnRlZ2VyKHJlc3VsdCkgJiYgcmVzdWx0ID4gMDsKICAgICAgICAgICAgICAgIF90aGlzLnNldChpbnB1dFBhdGggKyAnLmludmFsaWQnLCAhdmFsaWRSZXN1bHQpOwogICAgICAgICAgICAgICAgcXVlcnlWYWxpZCA9IHF1ZXJ5VmFsaWQgJiYgdmFsaWRSZXN1bHQ7CiAgICAgICAgICAgICAgICBpZiAodmFsaWRSZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGFsbG93ZWQgc3RhdHVzIGZpbHRlcnMuCiAgICAgICAgICAgIGNvbnN0IGFsbG93ZWRTdGF0dXNlcyA9IHRoaXMuX3N0YXR1c2VzCiAgICAgICAgICAgICAgICAuZmlsdGVyKChzKSA9PiBzLmFsbG93ZWQpCiAgICAgICAgICAgICAgICAubWFwKChzKSA9PiBzLnZhbHVlKTsKICAgICAgICAgICAgbGV0IGNvbFBhcmFtcyA9IFtdOwogICAgICAgICAgICAvLyBCdWlsZCB0aGUgaHBhcmFtcyBmaWx0ZXJzIGluIHRoZSByZXF1ZXN0LgogICAgICAgICAgICB0aGlzLl9ocGFyYW1zLmZvckVhY2goKGhwYXJhbSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGxldCBjb2xQYXJhbSA9IHsgaHBhcmFtOiBocGFyYW0uaW5mby5uYW1lIH07CiAgICAgICAgICAgICAgICBpZiAoaHBhcmFtLmZpbHRlci5kb21haW5EaXNjcmV0ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbFBhcmFtLmZpbHRlckRpc2NyZXRlID0gW107CiAgICAgICAgICAgICAgICAgICAgaHBhcmFtLmZpbHRlci5kb21haW5EaXNjcmV0ZS5mb3JFYWNoKChmaWx0ZXJWYWwpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlclZhbC5jaGVja2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xQYXJhbS5maWx0ZXJEaXNjcmV0ZS5wdXNoKGZpbHRlclZhbC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhwYXJhbS5maWx0ZXIuaW50ZXJ2YWwpIHsKICAgICAgICAgICAgICAgICAgICBjb2xQYXJhbS5maWx0ZXJJbnRlcnZhbCA9IHBhcnNlSW5wdXRJbnRlcnZhbCgnX2hwYXJhbXMuJyArIGluZGV4ICsgJy5maWx0ZXIuaW50ZXJ2YWwnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhwYXJhbS5maWx0ZXIucmVnZXhwKSB7CiAgICAgICAgICAgICAgICAgICAgY29sUGFyYW0uZmlsdGVyUmVnZXhwID0gaHBhcmFtLmZpbHRlci5yZWdleHA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdocGFyYW0uZmlsdGVyIHdpdGggbm8gZG9tYWluRGlzY3JldGUsIGludGVydmFsIG9yIHJlZ2V4cCcgKwogICAgICAgICAgICAgICAgICAgICAgICAnIHByb3BlcnRpZXMgc2V0OiAlcycsIGhwYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb2xQYXJhbXMucHVzaChjb2xQYXJhbSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBCdWlsZCB0aGUgbWV0cmljIGZpbHRlcnMgaW4gdGhlIHJlcXVlc3QuCiAgICAgICAgICAgIHRoaXMuX21ldHJpY3MuZm9yRWFjaCgobWV0cmljLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgbGV0IGNvbFBhcmFtID0gewogICAgICAgICAgICAgICAgICAgIG1ldHJpYzogbWV0cmljLmluZm8ubmFtZSwKICAgICAgICAgICAgICAgICAgICBmaWx0ZXJJbnRlcnZhbDogcGFyc2VJbnB1dEludGVydmFsKCdfbWV0cmljcy4nICsgaW5kZXggKyAnLmZpbHRlci5pbnRlcnZhbCcpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGNvbFBhcmFtcy5wdXNoKGNvbFBhcmFtKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIFNvcnRpbmcuCiAgICAgICAgICAgIC8vIFRPRE8oZXJleik6IFN1cHBvcnQgc29ydGluZyBieSBtdWx0aXBsZSBjb2x1bW5zLgogICAgICAgICAgICBpZiAodGhpcy5fc29ydEJ5SW5kZXggIT09IHVuZGVmaW5lZCAmJiB0aGlzLl9zb3J0RGlyZWN0aW9uICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGlmICghKHRoaXMuX3NvcnRCeUluZGV4IGluIGNvbFBhcmFtcykpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdObyBjb2x1bW4gaW4gY29sUGFyYW1zIHdpdGggaW5kZXggc29ydEJ5SW5kZXg6ICVzJywgdGhpcy5fc29ydEJ5SW5kZXgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29sUGFyYW1zW3RoaXMuX3NvcnRCeUluZGV4XS5vcmRlciA9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc29ydERpcmVjdGlvbiA9PT0gMCA/ICdPUkRFUl9BU0MnIDogJ09SREVSX0RFU0MnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFBhZ2luZy4KICAgICAgICAgICAgY29uc3QgcGFnZU51bSA9IHBhcnNlSW5wdXRBc1Bvc2l0aXZlSW50KCdfcGFnZU51bWJlcklucHV0Jyk7CiAgICAgICAgICAgIGNvbnN0IHBhZ2VTaXplID0gcGFyc2VJbnB1dEFzUG9zaXRpdmVJbnQoJ19wYWdlU2l6ZUlucHV0Jyk7CiAgICAgICAgICAgIGlmICghcXVlcnlWYWxpZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHBhZ2VTaXplICogKHBhZ2VOdW0gLSAxKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGV4cGVyaW1lbnROYW1lOiB0aGlzLmV4cGVyaW1lbnROYW1lLAogICAgICAgICAgICAgICAgYWxsb3dlZFN0YXR1c2VzOiBhbGxvd2VkU3RhdHVzZXMsCiAgICAgICAgICAgICAgICBjb2xQYXJhbXM6IGNvbFBhcmFtcywKICAgICAgICAgICAgICAgIHN0YXJ0SW5kZXg6IHN0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICBzbGljZVNpemU6IHBhZ2VTaXplLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvLyBXZSBhbGxvdyBzb3J0aW5nIGJ5IGFueSBjb2x1bW4gb2YgYSBzZXNzaW9uIGdyb3VwLiBBIGNvbHVtbiBpcyBlaXRoZXIgYQogICAgICAgIC8vIG1ldHJpYyBvciBhIGh5cGVycGFyYW1ldGVyLgogICAgICAgIC8vIEZvciB0aGUgcHVycG9zZSBvZiBzb3J0aW5nLCB3ZSBpZGVudGlmeSBlYWNoIHN1Y2ggY29sdW1uIGJ5IGl0cyBpbmRleAogICAgICAgIC8vIGluIHRoZSBsaXN0IGZvcm1lZCBieSBjb25jYXRlbmF0aW5nIHRoZSBtZXRyaWMgaW4gX21ldHJpY3MgYWZ0ZXIgdGhlCiAgICAgICAgLy8gaHBhcmFtcyBpbiBfaHBhcmFtcy4gVGhpcyBtZXRob2QgY29tcHV0ZXMgdGhpcyBzb3J0aW5nIGluZGV4IG9mIHRoZQogICAgICAgIC8vIG1ldHJpYyBjb2x1bW4gcmVwcmVzZW50ZWQgYnkgX21ldHJpY3NbbWV0cmljSW5kZXhdLgogICAgICAgIF9tZXRyaWNTb3J0QnlJbmRleChtZXRyaWNJbmRleCkgewogICAgICAgICAgICByZXR1cm4gbWV0cmljSW5kZXggKyB0aGlzLl9ocGFyYW1zLmxlbmd0aDsKICAgICAgICB9CiAgICB9OwogICAgVGZIcGFyYW1zUXVlcnlQYW5lLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8aHBhcmFtcy1zcGxpdC1sYXlvdXQgb3JpZW50YXRpb249InZlcnRpY2FsIj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBoeXBlcnBhcmFtZXRlcnMiPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPkh5cGVycGFyYW1ldGVyczwvZGl2PgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9Int7X2hwYXJhbXN9fSIgYXM9ImhwYXJhbSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJocGFyYW0iPgogICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICBjaGVja2VkPSJ7e2hwYXJhbS5kaXNwbGF5ZWR9fSIKICAgICAgICAgICAgICBjbGFzcz0iaHBhcmFtLWNoZWNrYm94IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgW1tfaHBhcmFtTmFtZShocGFyYW0uaW5mbyldXQogICAgICAgICAgICA8L3BhcGVyLWNoZWNrYm94PgogICAgICAgICAgICA8IS0tIFByZWNpc2VseSBvbmUgb2YgdGhlIHRlbXBsYXRlcyBiZWxvdyB3aWxsIGJlIHN0YW1wZWQuLS0+CiAgICAgICAgICAgIDwhLS0gMS4gQSBsaXN0IG9mIGNoZWNrYm94ZXMgLS0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZQogICAgICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgICAgICBpdGVtcz0iW1tocGFyYW0uZmlsdGVyLmRvbWFpbkRpc2NyZXRlXV0iCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgICAgIGNoZWNrZWQ9Int7aXRlbS5jaGVja2VkfX0iCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJkaXNjcmV0ZS12YWx1ZS1jaGVja2JveCIKICAgICAgICAgICAgICAgICAgb24tY2hhbmdlPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIFtbX3ByZXR0eVByaW50KGl0ZW0udmFsdWUpXV0KICAgICAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPCEtLSAyLiBBIG51bWVyaWMgaW50ZXJ2YWwgLS0+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsXV0iPgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICAgICAgbGFiZWw9Ik1pbiIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWluLnZhbHVlfX0iCiAgICAgICAgICAgICAgICBhbGxvd2VkX3BhdHRlcm49IlswLTkuZVxcLV0iCiAgICAgICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICAgICAgICBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IgogICAgICAgICAgICAgICAgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkXV0iCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iLWluZmluaXR5IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICAgICAgbGFiZWw9Ik1heCIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e2hwYXJhbS5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iCiAgICAgICAgICAgICAgICBhbGxvd2VkX3BhdHRlcm49IlswLTkuZVxcLV0iCiAgICAgICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICAgICAgICBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IgogICAgICAgICAgICAgICAgaW52YWxpZD0iW1tocGFyYW0uZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkXV0iCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iK2luZmluaXR5IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgICA8IS0tIDMuIEEgcmVnZXhwIC0tPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbaHBhcmFtLmZpbHRlci5yZWdleHBdXSI+CiAgICAgICAgICAgICAgPHBhcGVyLWlucHV0CiAgICAgICAgICAgICAgICBsYWJlbD0iUmVndWxhciBleHByZXNzaW9uIgogICAgICAgICAgICAgICAgdmFsdWU9Int7aHBhcmFtLmZpbHRlci5yZWdleHB9fSIKICAgICAgICAgICAgICAgIG9uLXZhbHVlLWNoYW5nZWQ9Il9xdWVyeVNlcnZlciIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIG1ldHJpY3MiPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPk1ldHJpY3M8L2Rpdj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJ7e19tZXRyaWNzfX0iIGFzPSJtZXRyaWMiPgogICAgICAgICAgPGRpdiBjbGFzcz0ibWV0cmljIj4KICAgICAgICAgICAgPCEtLSBUT0RPKGVyZXopOiBNYWtlIGl0IGVhc2llciB0byBoYW5kbGUgYSBsYXJnZSBudW1iZXIgb2YKICAgICAgICAgICAgICAgICAgbWV0cmljczoKICAgICAgICAgICAgICAgICAgMS4gQWRkIGFuICdpc29sYXRvcicgcmFkaW8tYnV0dG9uIHRvIHNlbGVjdCBqdXN0IG9uZQogICAgICAgICAgICAgICAgICBtZXRyaWMgYW5kCiAgICAgICAgICAgICAgICAgIGhpZGUgYWxsIHRoZSByZXN0CiAgICAgICAgICAgICAgICAgIDIuIEFkZCBhICd0b2dnbGUtYWxsJyBidXR0b24gdGhhdCB3aWxsIGhpZGUvdW5oaWRlCiAgICAgICAgICAgICAgICAgICAgYWxsIHRoZQogICAgICAgICAgICAgICAgICBtZXRyaWNzLgogICAgICAgICAgICAgICAgICBVc2Ugc2ltaWxhciBsb2dpYy9hcHBlYXJhbmNlIHRvIHRoZSBydW4tc2VsZWN0b3Igb2YKICAgICAgICAgICAgICAgICAgc2NhbGFycy4tLT4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgY2hlY2tlZD0ie3ttZXRyaWMuZGlzcGxheWVkfX0iCiAgICAgICAgICAgICAgY2xhc3M9Im1ldHJpYy1jaGVja2JveCIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIFtbX21ldHJpY05hbWUobWV0cmljLmluZm8pXV0KICAgICAgICAgICAgPC9wYXBlci1jaGVja2JveD4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICAgICAgbGFiZWw9Ik1pbiIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWluLnZhbHVlfX0iCiAgICAgICAgICAgICAgICBhbGxvd2VkLXBhdHRlcm49IlswLTkuZVxcLV0iCiAgICAgICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICAgICAgICBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IgogICAgICAgICAgICAgICAgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1pbi5pbnZhbGlkfX0iCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iLWluZmluaXR5IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQiPgogICAgICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICAgICAgbGFiZWw9Ik1heCIKICAgICAgICAgICAgICAgIGFsbG93ZWQtcGF0dGVybj0iWzAtOS5lXFwtXSIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e21ldHJpYy5maWx0ZXIuaW50ZXJ2YWwubWF4LnZhbHVlfX0iCiAgICAgICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICAgICAgICBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IgogICAgICAgICAgICAgICAgaW52YWxpZD0ie3ttZXRyaWMuZmlsdGVyLmludGVydmFsLm1heC5pbnZhbGlkfX0iCiAgICAgICAgICAgICAgICBwbGFjZWhvbGRlcj0iK2luZmluaXR5IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3BhcGVyLWlucHV0PgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzZWN0aW9uIHN0YXR1cyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U3RhdHVzPC9kaXY+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfc3RhdHVzZXNdXSIgYXM9InN0YXR1cyI+CiAgICAgICAgICA8cGFwZXItY2hlY2tib3ggY2hlY2tlZD0ie3tzdGF0dXMuYWxsb3dlZH19IiBvbi1jaGFuZ2U9Il9xdWVyeVNlcnZlciI+CiAgICAgICAgICAgIFtbc3RhdHVzLmRpc3BsYXlOYW1lXV0KICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gc29ydGluZyI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2VjdGlvbi10aXRsZSI+U29ydGluZzwvZGl2PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICBsYWJlbD0iU29ydCBieSIKICAgICAgICAgIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIgogICAgICAgICAgaG9yaXpvbnRhbC1hbGlnbj0ibGVmdCIKICAgICAgICA+CiAgICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgICBjbGFzcz0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgc2VsZWN0ZWQ9Int7X3NvcnRCeUluZGV4fX0iCiAgICAgICAgICAgIG9uLXNlbGVjdGVkLWl0ZW0tY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIgogICAgICAgICAgPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19ocGFyYW1zXV0iIGFzPSJocGFyYW0iPgogICAgICAgICAgICAgIDxwYXBlci1pdGVtPiBbW19ocGFyYW1OYW1lKGhwYXJhbS5pbmZvKV1dIDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfbWV0cmljc11dIiBhcz0ibWV0cmljIj4KICAgICAgICAgICAgICA8cGFwZXItaXRlbT4gW1tfbWV0cmljTmFtZShtZXRyaWMuaW5mbyldXSA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgICBsYWJlbD0iRGlyZWN0aW9uIgogICAgICAgICAgb24tc2VsZWN0ZWQtaXRlbS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICBob3Jpem9udGFsLWFsaWduPSJsZWZ0IgogICAgICAgID4KICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICBzZWxlY3RlZD0ie3tfc29ydERpcmVjdGlvbn19IgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItaXRlbT5Bc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICAgIDxwYXBlci1pdGVtPkRlc2NlbmRpbmc8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBzbG90PSJjb250ZW50IiBjbGFzcz0ic2VjdGlvbiBwYWdpbmciPgogICAgICAgIDxkaXYgY2xhc3M9InNlY3Rpb24tdGl0bGUiPlBhZ2luZzwvZGl2PgogICAgICAgIDxkaXY+CiAgICAgICAgICBOdW1iZXIgb2YgbWF0Y2hpbmcgc2Vzc2lvbiBncm91cHM6IFtbX3RvdGFsU2Vzc2lvbkdyb3Vwc0NvdW50U3RyXV0KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJpbmxpbmUtZWxlbWVudCBwYWdlLW51bWJlci1pbnB1dCI+CiAgICAgICAgICA8cGFwZXItaW5wdXQKICAgICAgICAgICAgbGFiZWw9IlBhZ2UgIyIKICAgICAgICAgICAgdmFsdWU9Int7X3BhZ2VOdW1iZXJJbnB1dC52YWx1ZX19IgogICAgICAgICAgICBhbGxvd2VkLXBhdHRlcm49IlswLTldIgogICAgICAgICAgICBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IgogICAgICAgICAgICBpbnZhbGlkPSJbW19wYWdlTnVtYmVySW5wdXQuaW52YWxpZF1dIgogICAgICAgICAgICBvbi12YWx1ZS1jaGFuZ2VkPSJfcXVlcnlTZXJ2ZXIiCiAgICAgICAgICA+CiAgICAgICAgICAgIDxkaXYgc2xvdD0ic3VmZml4IiBjbGFzcz0icGFnZS1zdWZmaXgiPi8gW1tfcGFnZUNvdW50U3RyXV08L2Rpdj4KICAgICAgICAgIDwvcGFwZXItaW5wdXQ+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0iaW5saW5lLWVsZW1lbnQgcGFnZS1zaXplLWlucHV0Ij4KICAgICAgICAgIDxwYXBlci1pbnB1dAogICAgICAgICAgICBsYWJlbD0iTWF4ICMgb2Ygc2Vzc2lvbiBncm91cHMgcGVyIHBhZ2U6IgogICAgICAgICAgICB2YWx1ZT0ie3tfcGFnZVNpemVJbnB1dC52YWx1ZX19IgogICAgICAgICAgICBhbGxvd2VkLXBhdHRlcm49IlswLTldIgogICAgICAgICAgICBlcnJvci1tZXNzYWdlPSJJbnZhbGlkIGlucHV0IgogICAgICAgICAgICBpbnZhbGlkPSJbW19wYWdlU2l6ZUlucHV0LmludmFsaWRdXSIKICAgICAgICAgICAgb24tdmFsdWUtY2hhbmdlZD0iX3F1ZXJ5U2VydmVyIgogICAgICAgICAgPgogICAgICAgICAgPC9wYXBlci1pbnB1dD4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY29udGVudCIgY2xhc3M9InNlY3Rpb24gZG93bmxvYWQiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfc2Vzc2lvbkdyb3Vwc1JlcXVlc3RdXSI+CiAgICAgICAgICBEb3dubG9hZCBkYXRhIGFzCiAgICAgICAgICA8c3Bhbj4KICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBpZD0iY3N2TGluayIKICAgICAgICAgICAgICBkb3dubG9hZD0iaHBhcmFtc190YWJsZS5jc3YiCiAgICAgICAgICAgICAgaHJlZj0iW1tfY3N2VXJsKF9zZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29uZmlndXJhdGlvbildXSIKICAgICAgICAgICAgICA+Q1NWPC9hCiAgICAgICAgICAgID4KICAgICAgICAgICAgPGEKICAgICAgICAgICAgICBpZD0ianNvbkxpbmsiCiAgICAgICAgICAgICAgZG93bmxvYWQ9ImhwYXJhbXNfdGFibGUuanNvbiIKICAgICAgICAgICAgICBocmVmPSJbW19qc29uVXJsKF9zZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29uZmlndXJhdGlvbildXSIKICAgICAgICAgICAgICA+SlNPTjwvYQogICAgICAgICAgICA+CiAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgaWQ9ImxhdGV4TGluayIKICAgICAgICAgICAgICBkb3dubG9hZD0iaHBhcmFtc190YWJsZS50ZXgiCiAgICAgICAgICAgICAgaHJlZj0iW1tfbGF0ZXhVcmwoX3Nlc3Npb25Hcm91cHNSZXF1ZXN0LCBjb25maWd1cmF0aW9uKV1dIgogICAgICAgICAgICAgID5MYVRlWDwvYQogICAgICAgICAgICA+CiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L2hwYXJhbXMtc3BsaXQtbGF5b3V0PgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAuc2VjdGlvbi10aXRsZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogN3B4OwogICAgICB9CiAgICAgIC5kaXNjcmV0ZS12YWx1ZS1jaGVja2JveCwKICAgICAgLm1ldHJpYy1jaGVja2JveCwKICAgICAgLmhwYXJhbS1jaGVja2JveCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgLmRpc2NyZXRlLXZhbHVlLWNoZWNrYm94IHsKICAgICAgICBtYXJnaW4tbGVmdDogMjBweDsKICAgICAgfQogICAgICAuaHBhcmFtLAogICAgICAubWV0cmljIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICAuaW5saW5lLWVsZW1lbnQgewogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogNDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICB9CiAgICAgIC5wYWdlLW51bWJlci1pbnB1dCB7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgfQogICAgICAucGFnZS1zaXplLWlucHV0IHsKICAgICAgICB3aWR0aDogNjAlOwogICAgICB9CiAgICAgIHZhYWRpbi1zcGxpdC1sYXlvdXQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICBwYXBlci1saXN0Ym94IHsKICAgICAgICBtYXgtaGVpZ2h0OiAxNWVtOwogICAgICB9CiAgICAgIC5wYWdlLXN1ZmZpeCB7CiAgICAgICAgd2hpdGUtc3BhY2U6IG5vd3JhcDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiZXhwZXJpbWVudE5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJjb25maWd1cmF0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJzZXNzaW9uR3JvdXBzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJkYXRhTG9hZGVkV2l0aE5vbkVtcHR5SHBhcmFtcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiX2V4cGVyaW1lbnQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZIcGFyYW1zUXVlcnlQYW5lLnByb3RvdHlwZSwgIl9ocGFyYW1zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJfbWV0cmljcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IEFycmF5LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zUXVlcnlQYW5lLnByb3RvdHlwZSwgIl9zdGF0dXNlcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJfZ2V0RXhwZXJpbWVudFJlc29sdmVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiX3Jlc29sdmVHZXRFeHBlcmltZW50Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zUXVlcnlQYW5lLnByb3RvdHlwZSwgIl9saXN0U2Vzc2lvbkdyb3Vwc0NhbmNlbGxlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJfc29ydEJ5SW5kZXgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiX3NvcnREaXJlY3Rpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiX3BhZ2VTaXplSW5wdXQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiX3BhZ2VOdW1iZXJJbnB1dCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJfcGFnZUNvdW50U3RyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZIcGFyYW1zUXVlcnlQYW5lLnByb3RvdHlwZSwgIl90b3RhbFNlc3Npb25Hcm91cHNDb3VudFN0ciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1F1ZXJ5UGFuZS5wcm90b3R5cGUsICJfc2Vzc2lvbkdyb3Vwc1JlcXVlc3QiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnYmFja2VuZCcsICdleHBlcmltZW50TmFtZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZIcGFyYW1zUXVlcnlQYW5lLnByb3RvdHlwZSwgIl9jb21wdXRlRXhwZXJpbWVudEFuZFJlbGF0ZWRQcm9wcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX2hwYXJhbXMuKicsICdfbWV0cmljcy4qJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUucHJvdG90eXBlLCAiX3VwZGF0ZUNvbmZpZ3VyYXRpb24iLCBudWxsKTsKICAgIFRmSHBhcmFtc1F1ZXJ5UGFuZSA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWhwYXJhbXMtcXVlcnktcGFuZScpCiAgICBdLCBUZkhwYXJhbXNRdWVyeVBhbmUpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmSHBhcmFtc1NjYWxlQW5kQ29sb3JDb250cm9scyA9IGNsYXNzIFRmSHBhcmFtc1NjYWxlQW5kQ29sb3JDb250cm9scyBleHRlbmRzIFBvbHltZXJFbGVtZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyogUHJpdmF0ZSBtZXRob2RzICovCiAgICAgICAgX2NvbmZpZ3VyYXRpb25DaGFuZ2VkKCkgewogICAgICAgICAgICAvLyBQb3B1bGF0ZSBvcHRpb25zLmNvbHVtbnMgd2l0aCBhIGxpbmVhciBzY2FsZSBmb3IgZWFjaCBjb2x1bW4gKAogICAgICAgICAgICAvLyBocGFyYW0gb3IgbWV0cmljKS4KICAgICAgICAgICAgY29uc3QgdmlzaWJsZVNjaGVtYSA9IHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hOwogICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLmNvbmZpZ3VyYXRpb24uc2NoZW1hOwogICAgICAgICAgICBjb25zdCBuZXdIUGFyYW1Db2x1bW4gPSAoaW5mbywgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgbmFtZTogaHBhcmFtTmFtZShpbmZvKSwKICAgICAgICAgICAgICAgICAgICBpbmRleDogaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVJbmRleDogZ2V0QWJzb2x1dGVDb2x1bW5JbmRleChzY2hlbWEsIHZpc2libGVTY2hlbWEsIGluZGV4KSwKICAgICAgICAgICAgICAgICAgICBzY2FsZTogdGhpcy5faXNOdW1lcmljQ29sdW1uKGluZGV4KSA/ICdMSU5FQVInIDogJ05PTl9OVU1FUklDJywKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IG5ld01ldHJpY0NvbHVtbiA9IChpbmZvLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY29sSW5kZXggPSBpbmRleCArIHZpc2libGVTY2hlbWEuaHBhcmFtSW5mb3MubGVuZ3RoOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBzY2FsZTogJ0xJTkVBUicsCiAgICAgICAgICAgICAgICAgICAgbmFtZTogbWV0cmljTmFtZShpbmZvKSwKICAgICAgICAgICAgICAgICAgICBpbmRleDogY29sSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgYWJzb2x1dGVJbmRleDogZ2V0QWJzb2x1dGVDb2x1bW5JbmRleChzY2hlbWEsIHZpc2libGVTY2hlbWEsIGNvbEluZGV4KSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSB7CiAgICAgICAgICAgICAgICBjb2x1bW5zOiB2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zCiAgICAgICAgICAgICAgICAgICAgLm1hcChuZXdIUGFyYW1Db2x1bW4pCiAgICAgICAgICAgICAgICAgICAgLmNvbmNhdCh2aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLm1hcChuZXdNZXRyaWNDb2x1bW4pKSwKICAgICAgICAgICAgICAgIG1pbkNvbG9yOiAnIzAwMDBGRicsCiAgICAgICAgICAgICAgICBtYXhDb2xvcjogJyNGRjAwMDAnLAogICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogdGhpcy5jb25maWd1cmF0aW9uLAogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBTZXQgdGhlIGNvbG9yQnlDb2x1bW5JbmRleCBwcm9wZXJ0eS4KICAgICAgICAgICAgLy8gSWYgd2Ugc2V0IG9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4IGF0IHRoZSBzYW1lIHRpbWUgYXMgd2UKICAgICAgICAgICAgLy8gc2V0IHRoZSBvdGhlciBvcHRpb25zLCBQb2x5bWVyIGZpcnN0IHVwZGF0ZXMgdGhlIGRyb3AtZG93biBtZW51CiAgICAgICAgICAgIC8vIHNlbGVjdGVkIGxhYmVsIGFuZCBvbmx5IHRoZW4gdXBkYXRlcyB0aGUgbGlzdCBib3ggd2l0aCB0aGUgbmV3IGl0ZW1zLgogICAgICAgICAgICAvLyBBcyBhIHJlc3VsdCB0aGUgc2VsZWN0ZWQgbGFiZWwgZ2V0cyBhbiBlcnJvbmVvdXMgdmFsdWUgKGJhc2VkIG9uCiAgICAgICAgICAgIC8vIHRoZSBvbGQgZWxlbWVudHMgaW4gdGhlIGxpc3QpLgogICAgICAgICAgICAvLyBUbyBvdmVyY29tZSB0aGlzLCB3ZSBmaXJzdCBzZXQgdGhlIHNlbGVjdGVkIGl0ZW0gdG8gInVuZGVmaW5lZCIsCiAgICAgICAgICAgIC8vIGNhbGwgZmx1c2ggdG8gc3luY2hyb25vdXNseSB1cGRhdGUgdGhlIGRyb3AtZG93biBtZW51IGxpc3Qgd2l0aAogICAgICAgICAgICAvLyB0aGUgbmV3IGl0ZW1zLCBhbmQgdGhlbiByZXNldCB0aGUgc2VsZWN0ZWQgaXRlbSBpbmRleCBzbyB0aGF0CiAgICAgICAgICAgIC8vIFBvbHltZXIgd2lsbCB1cGRhdGUgdGhlIGxhYmVsIGJhc2VkIG9uIHRoZSBuZXcgbGlzdC4KICAgICAgICAgICAgLy8gU2VlIGFsc286IGh0dHBzOi8vZ2l0aHViLmNvbS9Qb2x5bWVyRWxlbWVudHMvcGFwZXItZHJvcGRvd24tbWVudS9pc3N1ZXMvMTk3I2lzc3VlY29tbWVudC0yNDk5MjczNzEsIGFuZCBodHRwOi8vanNiaW4uY29tL2Z1cW95ZS9lZGl0P2h0bWwsb3V0cHV0LgogICAgICAgICAgICB0aGlzLnNldCgnb3B0aW9ucycsIG9wdGlvbnMpOyAvLyBzZXQgdGhlIGJvdW5kIHNlbGVjdGVkIGl0ZW0gdG8KICAgICAgICAgICAgLy8gdW5kZWZpbmVkLgogICAgICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICB0aGlzLnNldCgnb3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXgnLCB0aGlzLl9kZWZhdWx0Q29sb3JCeUNvbHVtbkluZGV4KCkpOwogICAgICAgIH0KICAgICAgICBfdW5zZWxlY3REaXNhYmxlZExvZ1NjYWxlcygpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gV2UgbWF5IGJlIGNhbGxlZCBiZWZvcmUgdGhlIG9wdGlvbnMgYXJlIGNvbnN0cnVjdGVkIGJ5CiAgICAgICAgICAgICAgICAvLyBfY29uZmlndXJhdGlvbkNoYW5nZWQoKS4gSW4gdGhpcyBjYXNlIHdlIG5lZWQgbm90IHdvcnJ5CiAgICAgICAgICAgICAgICAvLyBhYm91dCBzZWxlY3RlZCBkaXNhYmxlZCBsb2cgc2NhbGVzLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jb2x1bW5zLmZvckVhY2goKGNvbCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY29sUGF0aCA9ICdvcHRpb25zLmNvbHVtbnMuJyArIGNvbC5pbmRleDsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fYWxsb3dMb2dTY2FsZShjb2wpICYmIGNvbC5zY2FsZSA9PT0gJ0xPRycpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVzZSBQb2x5bWVyIHBhdGhzIHRvIG1ha2UgdGhlIGNoYW5nZSBvYnNlcnZhYmxlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KGNvbFBhdGggKyAnLnNjYWxlJywgJ0xJTkVBUicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2FsbG93TG9nU2NhbGUoY29sdW1uKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faXNOdW1lcmljQ29sdW1uKGNvbHVtbi5pbmRleCkgfHwgIXRoaXMuc2Vzc2lvbkdyb3VwcykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IFttaW4sIG1heF0gPSB2aXNpYmxlTnVtZXJpY0NvbHVtbkV4dGVudCh0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYSwgdGhpcy5zZXNzaW9uR3JvdXBzLCBjb2x1bW4uaW5kZXgpOwogICAgICAgICAgICAvLyBMb2cgc2NhbGUgaXMgb25seSBkZWZpbmVkIHdoZW4gdGhlIGRvbWFpbiBkb2VzIG5vdCBpbmNsdWRlIDAuCiAgICAgICAgICAgIHJldHVybiBtaW4gPiAwIHx8IG1heCA8IDA7CiAgICAgICAgfQogICAgICAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2NhbGUgaXMgbnVtZXJpYy4KICAgICAgICAvLyBVc2VkIHRvIHByZXZlbnQgbm9uLW51bWVyaWMgY29sdW1ucyBmcm9tIGhhdmluZyBhIHNjYWxlLXNlbGVjdGlvbgogICAgICAgIC8vIHJhZGlvIGdyb3VwLgogICAgICAgIF9pc051bWVyaWNDb2x1bW4oY29sSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIChjb2xJbmRleCA+PSB0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGggfHwKICAgICAgICAgICAgICAgIHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zW2NvbEluZGV4XS50eXBlID09PQogICAgICAgICAgICAgICAgICAgICdEQVRBX1RZUEVfRkxPQVQ2NCcpOwogICAgICAgIH0KICAgICAgICAvLyBVc2UgdGhlIGZpcnN0IG1ldHJpYyBpZiB0aGVyZSBhcmUgbWV0cmljcywgb3Igb3RoZXJ3aXNlIHRoZSBmaXJzdAogICAgICAgIC8vIG51bWVyaWMgaHBhcmFtIGlmIHRoZXJlIGFyZSBocGFyYW1zLiBJZiB0aGVyZSBhcmUgbm8gbnVtZXJpYyBjb2x1bW5zCiAgICAgICAgLy8gcmV0dXJuIHVuZGVmaW5lZC4KICAgICAgICBfZGVmYXVsdENvbG9yQnlDb2x1bW5JbmRleCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYS5ocGFyYW1JbmZvcy5sZW5ndGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaSA9IHRoaXMuY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zLmZpbmRJbmRleCgoaW5mbykgPT4gaW5mby50eXBlID09PSAnREFUQV9UWVBFX0ZMT0FUNjQnKTsKICAgICAgICAgICAgaWYgKGkgIT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgIH07CiAgICBUZkhwYXJhbXNTY2FsZUFuZENvbG9yQ29udHJvbHMudGVtcGxhdGUgPSBodG1sIGAKICAgIDxkaXYgY2xhc3M9ImNvbnRyb2wtcGFuZWwiPgogICAgICA8IS0tICdDb2xvciBieScgZHJvcCBkb3duIG1lbnUgLS0+CiAgICAgIDxwYXBlci1kcm9wZG93bi1tZW51CiAgICAgICAgbGFiZWw9IkNvbG9yIGJ5IgogICAgICAgIGlkPSJjb2xvckJ5RHJvcERvd25NZW51IgogICAgICAgIGhvcml6b250YWwtYWxpZ249ImxlZnQiCiAgICAgID4KICAgICAgICA8cGFwZXItbGlzdGJveAogICAgICAgICAgY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiCiAgICAgICAgICBzbG90PSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgc2VsZWN0ZWQ9Int7b3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXh9fSIKICAgICAgICAgIGlkPSJjb2xvckJ5TGlzdEJveCIKICAgICAgICA+CiAgICAgICAgICA8dGVtcGxhdGUKICAgICAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgICAgIGl0ZW1zPSJbW29wdGlvbnMuY29sdW1uc11dIgogICAgICAgICAgICBhcz0iY29sdW1uIgogICAgICAgICAgICBpZD0iY29sb3JCeUNvbHVtblRlbXBsYXRlIgogICAgICAgICAgPgogICAgICAgICAgICA8cGFwZXItaXRlbSBkaXNhYmxlZD0iW1shX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICAgIFtbY29sdW1uLm5hbWVdXQogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvcGFwZXItbGlzdGJveD4KICAgICAgPC9wYXBlci1kcm9wZG93bi1tZW51PgoKICAgICAgPCEtLSBDb2x1bW5zIHNjYWxlcyAtLT4KICAgICAgPGRpdiBjbGFzcz0iY29sdW1ucy1jb250YWluZXIiPgogICAgICAgIDwhLS0gU2NhbGUgb3B0aW9ucyBmb3IgZWFjaCBudW1lcmljIGZlYXR1cmUgLS0+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0ie3tvcHRpb25zLmNvbHVtbnN9fSIgYXM9ImNvbHVtbiI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2lzTnVtZXJpY0NvbHVtbihjb2x1bW4uaW5kZXgpXV0iPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJjb2x1bW4iPgogICAgICAgICAgICAgIDxkaXYgY2xhc3M9ImNvbHVtbi10aXRsZSI+W1tjb2x1bW4ubmFtZV1dPC9kaXY+CiAgICAgICAgICAgICAgPGRpdj4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1ncm91cAogICAgICAgICAgICAgICAgICBjbGFzcz0ic2NhbGUtcmFkaW8tZ3JvdXAiCiAgICAgICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e2NvbHVtbi5zY2FsZX19IgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IkxJTkVBUiI+CiAgICAgICAgICAgICAgICAgICAgTGluZWFyCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8IS0tIFRoZSBpZCBoZXJlIGlzIHVzZWQgdG8gYWNjZXNzIHRoaXMgYnV0dG9uIGluIHVuaXQKICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cy4tLT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbgogICAgICAgICAgICAgICAgICAgIGlkPSJsb2dTY2FsZUJ1dHRvbl9bW2NvbHVtbi5uYW1lXV0iCiAgICAgICAgICAgICAgICAgICAgbmFtZT0iTE9HIgogICAgICAgICAgICAgICAgICAgIGRpc2FibGVkPSJbWyFfYWxsb3dMb2dTY2FsZShjb2x1bW4sIHNlc3Npb25Hcm91cHMuKildXSIKICAgICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICAgIExvZ2FyaXRobWljCiAgICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIG5hbWU9IlFVQU5USUxFIj4KICAgICAgICAgICAgICAgICAgICBRdWFudGlsZQogICAgICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWJ1dHRvbj4KICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tZ3JvdXA+CiAgICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICAgIC5jb250cm9sLXBhbmVsIHsKICAgICAgICBvdmVyZmxvdzogYXV0bzsKICAgICAgfQogICAgICAuY29sdW1uIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiA1cHg7CiAgICAgICAgYm9yZGVyOiBzb2xpZCAxcHggZGFya2dyYXk7CiAgICAgICAgcGFkZGluZzogM3B4OwogICAgICB9CiAgICAgIC5jb2x1bW4tdGl0bGUgewogICAgICAgIC8qIEZpdCBldmVyeSB0aXRsZSBpbiBvbmUgbGluZSBzbyB0aGUgcmFkaW8gYm94ZXMgYWxpZ24gdmVydGljYWxseS4gKi8KICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgICB9CiAgICAgIC5jb2x1bW5zLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CiAgICAgIC5zY2FsZS1yYWRpby1ncm91cCBwYXBlci1yYWRpby1idXR0b24gewogICAgICAgIHBhZGRpbmc6IDJweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBwYXBlci1saXN0Ym94IHsKICAgICAgICBtYXgtaGVpZ2h0OiAxNWVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1NjYWxlQW5kQ29sb3JDb250cm9scy5wcm90b3R5cGUsICJjb25maWd1cmF0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmSHBhcmFtc1NjYWxlQW5kQ29sb3JDb250cm9scy5wcm90b3R5cGUsICJzZXNzaW9uR3JvdXBzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNTY2FsZUFuZENvbG9yQ29udHJvbHMucHJvdG90eXBlLCAib3B0aW9ucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdjb25maWd1cmF0aW9uLionKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmSHBhcmFtc1NjYWxlQW5kQ29sb3JDb250cm9scy5wcm90b3R5cGUsICJfY29uZmlndXJhdGlvbkNoYW5nZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3Nlc3Npb25Hcm91cHMuKicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZIcGFyYW1zU2NhbGVBbmRDb2xvckNvbnRyb2xzLnByb3RvdHlwZSwgIl91bnNlbGVjdERpc2FibGVkTG9nU2NhbGVzIiwgbnVsbCk7CiAgICBUZkhwYXJhbXNTY2FsZUFuZENvbG9yQ29udHJvbHMgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scycpCiAgICBdLCBUZkhwYXJhbXNTY2FsZUFuZENvbG9yQ29udHJvbHMpOwoKICAgIGNsYXNzIEx1bW8gZXh0ZW5kcyBIVE1MRWxlbWVudCB7CiAgICAgIHN0YXRpYyBnZXQgdmVyc2lvbigpIHsKICAgICAgICByZXR1cm4gJzEuNi4wJzsKICAgICAgfQogICAgfQoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZSgndmFhZGluLWx1bW8tc3R5bGVzJywgTHVtbyk7CgogICAgY29uc3QgJF9kb2N1bWVudENvbnRhaW5lciQ1ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKCiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDUuaW5uZXJIVE1MID0gYDxjdXN0b20tc3R5bGU+CiAgPHN0eWxlPgogICAgaHRtbCB7CiAgICAgIC8qIEJhc2UgKGJhY2tncm91bmQpICovCiAgICAgIC0tbHVtby1iYXNlLWNvbG9yOiAjRkZGOwoKICAgICAgLyogVGludCAqLwogICAgICAtLWx1bW8tdGludC01cGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjMpOwogICAgICAtLWx1bW8tdGludC0xMHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC4zNyk7CiAgICAgIC0tbHVtby10aW50LTIwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjQ0KTsKICAgICAgLS1sdW1vLXRpbnQtMzBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNSk7CiAgICAgIC0tbHVtby10aW50LTQwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjU3KTsKICAgICAgLS1sdW1vLXRpbnQtNTBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNjQpOwogICAgICAtLWx1bW8tdGludC02MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC43KTsKICAgICAgLS1sdW1vLXRpbnQtNzBwY3Q6IGhzbGEoMCwgMCUsIDEwMCUsIDAuNzcpOwogICAgICAtLWx1bW8tdGludC04MHBjdDogaHNsYSgwLCAwJSwgMTAwJSwgMC44NCk7CiAgICAgIC0tbHVtby10aW50LTkwcGN0OiBoc2xhKDAsIDAlLCAxMDAlLCAwLjkpOwogICAgICAtLWx1bW8tdGludDogI0ZGRjsKCiAgICAgIC8qIFNoYWRlICovCiAgICAgIC0tbHVtby1zaGFkZS01cGN0OiBoc2xhKDIxNCwgNjElLCAyNSUsIDAuMDUpOwogICAgICAtLWx1bW8tc2hhZGUtMTBwY3Q6IGhzbGEoMjE0LCA1NyUsIDI0JSwgMC4xKTsKICAgICAgLS1sdW1vLXNoYWRlLTIwcGN0OiBoc2xhKDIxNCwgNTMlLCAyMyUsIDAuMTYpOwogICAgICAtLWx1bW8tc2hhZGUtMzBwY3Q6IGhzbGEoMjE0LCA1MCUsIDIyJSwgMC4yNik7CiAgICAgIC0tbHVtby1zaGFkZS00MHBjdDogaHNsYSgyMTQsIDQ3JSwgMjElLCAwLjM4KTsKICAgICAgLS1sdW1vLXNoYWRlLTUwcGN0OiBoc2xhKDIxNCwgNDUlLCAyMCUsIDAuNSk7CiAgICAgIC0tbHVtby1zaGFkZS02MHBjdDogaHNsYSgyMTQsIDQzJSwgMTklLCAwLjYxKTsKICAgICAgLS1sdW1vLXNoYWRlLTcwcGN0OiBoc2xhKDIxNCwgNDIlLCAxOCUsIDAuNzIpOwogICAgICAtLWx1bW8tc2hhZGUtODBwY3Q6IGhzbGEoMjE0LCA0MSUsIDE3JSwgMC44Myk7CiAgICAgIC0tbHVtby1zaGFkZS05MHBjdDogaHNsYSgyMTQsIDQwJSwgMTYlLCAwLjk0KTsKICAgICAgLS1sdW1vLXNoYWRlOiBoc2woMjE0LCAzNSUsIDE1JSk7CgogICAgICAvKiBDb250cmFzdCAqLwogICAgICAtLWx1bW8tY29udHJhc3QtNXBjdDogdmFyKC0tbHVtby1zaGFkZS01cGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTEwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTEwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTIwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTMwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTMwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTQwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTQwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTUwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTUwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTYwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTYwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTcwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTcwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTgwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTgwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0LTkwcGN0OiB2YXIoLS1sdW1vLXNoYWRlLTkwcGN0KTsKICAgICAgLS1sdW1vLWNvbnRyYXN0OiB2YXIoLS1sdW1vLXNoYWRlKTsKCiAgICAgIC8qIFRleHQgKi8KICAgICAgLS1sdW1vLWhlYWRlci10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0KTsKICAgICAgLS1sdW1vLWJvZHktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC05MHBjdCk7CiAgICAgIC0tbHVtby1zZWNvbmRhcnktdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC03MHBjdCk7CiAgICAgIC0tbHVtby10ZXJ0aWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTUwcGN0KTsKICAgICAgLS1sdW1vLWRpc2FibGVkLXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtMzBwY3QpOwoKICAgICAgLyogUHJpbWFyeSAqLwogICAgICAtLWx1bW8tcHJpbWFyeS1jb2xvcjogaHNsKDIxNCwgOTAlLCA1MiUpOwogICAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdDogaHNsYSgyMTQsIDkwJSwgNTIlLCAwLjUpOwogICAgICAtLWx1bW8tcHJpbWFyeS1jb2xvci0xMHBjdDogaHNsYSgyMTQsIDkwJSwgNTIlLCAwLjEpOwogICAgICAtLWx1bW8tcHJpbWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktY29sb3IpOwogICAgICAtLWx1bW8tcHJpbWFyeS1jb250cmFzdC1jb2xvcjogI0ZGRjsKCiAgICAgIC8qIEVycm9yICovCiAgICAgIC0tbHVtby1lcnJvci1jb2xvcjogaHNsKDMsIDEwMCUsIDYxJSk7CiAgICAgIC0tbHVtby1lcnJvci1jb2xvci01MHBjdDogaHNsYSgzLCAxMDAlLCA2MCUsIDAuNSk7CiAgICAgIC0tbHVtby1lcnJvci1jb2xvci0xMHBjdDogaHNsYSgzLCAxMDAlLCA2MCUsIDAuMSk7CiAgICAgIC0tbHVtby1lcnJvci10ZXh0LWNvbG9yOiBoc2woMywgOTIlLCA1MyUpOwogICAgICAtLWx1bW8tZXJyb3ItY29udHJhc3QtY29sb3I6ICNGRkY7CgogICAgICAvKiBTdWNjZXNzICovCiAgICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yOiBoc2woMTQ1LCA4MCUsIDQyJSk7IC8qIGhzbCgxNDQsODIlLDM3JSk7ICovCiAgICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yLTUwcGN0OiBoc2xhKDE0NSwgNzYlLCA0NCUsIDAuNTUpOwogICAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci0xMHBjdDogaHNsYSgxNDUsIDc2JSwgNDQlLCAwLjEyKTsKICAgICAgLS1sdW1vLXN1Y2Nlc3MtdGV4dC1jb2xvcjogaHNsKDE0NSwgMTAwJSwgMzIlKTsKICAgICAgLS1sdW1vLXN1Y2Nlc3MtY29udHJhc3QtY29sb3I6ICNGRkY7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+PGRvbS1tb2R1bGUgaWQ9Imx1bW8tY29sb3IiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgW3RoZW1lfj0iZGFyayJdIHsKICAgICAgICAvKiBCYXNlIChiYWNrZ3JvdW5kKSAqLwogICAgICAgIC0tbHVtby1iYXNlLWNvbG9yOiBoc2woMjE0LCAzNSUsIDIxJSk7CgogICAgICAgIC8qIFRpbnQgKi8KICAgICAgICAtLWx1bW8tdGludC01cGN0OiBoc2xhKDIxNCwgNjUlLCA4NSUsIDAuMDYpOwogICAgICAgIC0tbHVtby10aW50LTEwcGN0OiBoc2xhKDIxNCwgNjAlLCA4MCUsIDAuMTQpOwogICAgICAgIC0tbHVtby10aW50LTIwcGN0OiBoc2xhKDIxNCwgNjQlLCA4MiUsIDAuMjMpOwogICAgICAgIC0tbHVtby10aW50LTMwcGN0OiBoc2xhKDIxNCwgNjklLCA4NCUsIDAuMzIpOwogICAgICAgIC0tbHVtby10aW50LTQwcGN0OiBoc2xhKDIxNCwgNzMlLCA4NiUsIDAuNDEpOwogICAgICAgIC0tbHVtby10aW50LTUwcGN0OiBoc2xhKDIxNCwgNzglLCA4OCUsIDAuNSk7CiAgICAgICAgLS1sdW1vLXRpbnQtNjBwY3Q6IGhzbGEoMjE0LCA4MiUsIDkwJSwgMC42KTsKICAgICAgICAtLWx1bW8tdGludC03MHBjdDogaHNsYSgyMTQsIDg3JSwgOTIlLCAwLjcpOwogICAgICAgIC0tbHVtby10aW50LTgwcGN0OiBoc2xhKDIxNCwgOTElLCA5NCUsIDAuOCk7CiAgICAgICAgLS1sdW1vLXRpbnQtOTBwY3Q6IGhzbGEoMjE0LCA5NiUsIDk2JSwgMC45KTsKICAgICAgICAtLWx1bW8tdGludDogaHNsKDIxNCwgMTAwJSwgOTglKTsKCiAgICAgICAgLyogU2hhZGUgKi8KICAgICAgICAtLWx1bW8tc2hhZGUtNXBjdDogaHNsYSgyMTQsIDAlLCAwJSwgMC4wNyk7CiAgICAgICAgLS1sdW1vLXNoYWRlLTEwcGN0OiBoc2xhKDIxNCwgNCUsIDIlLCAwLjE1KTsKICAgICAgICAtLWx1bW8tc2hhZGUtMjBwY3Q6IGhzbGEoMjE0LCA4JSwgNCUsIDAuMjMpOwogICAgICAgIC0tbHVtby1zaGFkZS0zMHBjdDogaHNsYSgyMTQsIDEyJSwgNiUsIDAuMzIpOwogICAgICAgIC0tbHVtby1zaGFkZS00MHBjdDogaHNsYSgyMTQsIDE2JSwgOCUsIDAuNDEpOwogICAgICAgIC0tbHVtby1zaGFkZS01MHBjdDogaHNsYSgyMTQsIDIwJSwgMTAlLCAwLjUpOwogICAgICAgIC0tbHVtby1zaGFkZS02MHBjdDogaHNsYSgyMTQsIDI0JSwgMTIlLCAwLjYpOwogICAgICAgIC0tbHVtby1zaGFkZS03MHBjdDogaHNsYSgyMTQsIDI4JSwgMTMlLCAwLjcpOwogICAgICAgIC0tbHVtby1zaGFkZS04MHBjdDogaHNsYSgyMTQsIDMyJSwgMTMlLCAwLjgpOwogICAgICAgIC0tbHVtby1zaGFkZS05MHBjdDogaHNsYSgyMTQsIDMzJSwgMTMlLCAwLjkpOwogICAgICAgIC0tbHVtby1zaGFkZTogaHNsKDIxNCwgMzMlLCAxMyUpOwoKICAgICAgICAvKiBDb250cmFzdCAqLwogICAgICAgIC0tbHVtby1jb250cmFzdC01cGN0OiB2YXIoLS1sdW1vLXRpbnQtNXBjdCk7CiAgICAgICAgLS1sdW1vLWNvbnRyYXN0LTEwcGN0OiB2YXIoLS1sdW1vLXRpbnQtMTBwY3QpOwogICAgICAgIC0tbHVtby1jb250cmFzdC0yMHBjdDogdmFyKC0tbHVtby10aW50LTIwcGN0KTsKICAgICAgICAtLWx1bW8tY29udHJhc3QtMzBwY3Q6IHZhcigtLWx1bW8tdGludC0zMHBjdCk7CiAgICAgICAgLS1sdW1vLWNvbnRyYXN0LTQwcGN0OiB2YXIoLS1sdW1vLXRpbnQtNDBwY3QpOwogICAgICAgIC0tbHVtby1jb250cmFzdC01MHBjdDogdmFyKC0tbHVtby10aW50LTUwcGN0KTsKICAgICAgICAtLWx1bW8tY29udHJhc3QtNjBwY3Q6IHZhcigtLWx1bW8tdGludC02MHBjdCk7CiAgICAgICAgLS1sdW1vLWNvbnRyYXN0LTcwcGN0OiB2YXIoLS1sdW1vLXRpbnQtNzBwY3QpOwogICAgICAgIC0tbHVtby1jb250cmFzdC04MHBjdDogdmFyKC0tbHVtby10aW50LTgwcGN0KTsKICAgICAgICAtLWx1bW8tY29udHJhc3QtOTBwY3Q6IHZhcigtLWx1bW8tdGludC05MHBjdCk7CiAgICAgICAgLS1sdW1vLWNvbnRyYXN0OiB2YXIoLS1sdW1vLXRpbnQpOwoKICAgICAgICAvKiBUZXh0ICovCiAgICAgICAgLS1sdW1vLWhlYWRlci10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0KTsKICAgICAgICAtLWx1bW8tYm9keS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTkwcGN0KTsKICAgICAgICAtLWx1bW8tc2Vjb25kYXJ5LXRleHQtY29sb3I6IHZhcigtLWx1bW8tY29udHJhc3QtNzBwY3QpOwogICAgICAgIC0tbHVtby10ZXJ0aWFyeS10ZXh0LWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTUwcGN0KTsKICAgICAgICAtLWx1bW8tZGlzYWJsZWQtdGV4dC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CgogICAgICAgIC8qIFByaW1hcnkgKi8KICAgICAgICAtLWx1bW8tcHJpbWFyeS1jb2xvcjogaHNsKDIxNCwgODYlLCA1NSUpOwogICAgICAgIC0tbHVtby1wcmltYXJ5LWNvbG9yLTUwcGN0OiBoc2xhKDIxNCwgODYlLCA1NSUsIDAuNSk7CiAgICAgICAgLS1sdW1vLXByaW1hcnktY29sb3ItMTBwY3Q6IGhzbGEoMjE0LCA5MCUsIDYzJSwgMC4xKTsKICAgICAgICAtLWx1bW8tcHJpbWFyeS10ZXh0LWNvbG9yOiBoc2woMjE0LCAxMDAlLCA3MCUpOwogICAgICAgIC0tbHVtby1wcmltYXJ5LWNvbnRyYXN0LWNvbG9yOiAjRkZGOwoKICAgICAgICAvKiBFcnJvciAqLwogICAgICAgIC0tbHVtby1lcnJvci1jb2xvcjogaHNsKDMsIDkwJSwgNjMlKTsKICAgICAgICAtLWx1bW8tZXJyb3ItY29sb3ItNTBwY3Q6IGhzbGEoMywgOTAlLCA2MyUsIDAuNSk7CiAgICAgICAgLS1sdW1vLWVycm9yLWNvbG9yLTEwcGN0OiBoc2xhKDMsIDkwJSwgNjMlLCAwLjEpOwogICAgICAgIC0tbHVtby1lcnJvci10ZXh0LWNvbG9yOiBoc2woMywgMTAwJSwgNjclKTsKCiAgICAgICAgLyogU3VjY2VzcyAqLwogICAgICAgIC0tbHVtby1zdWNjZXNzLWNvbG9yOiBoc2woMTQ1LCA2NSUsIDQyJSk7CiAgICAgICAgLS1sdW1vLXN1Y2Nlc3MtY29sb3ItNTBwY3Q6IGhzbGEoMTQ1LCA2NSUsIDQyJSwgMC41KTsKICAgICAgICAtLWx1bW8tc3VjY2Vzcy1jb2xvci0xMHBjdDogaHNsYSgxNDUsIDY1JSwgNDIlLCAwLjEpOwogICAgICAgIC0tbHVtby1zdWNjZXNzLXRleHQtY29sb3I6IGhzbCgxNDUsIDg1JSwgNDclKTsKICAgICAgfQoKICAgICAgaHRtbCB7CiAgICAgICAgY29sb3I6IHZhcigtLWx1bW8tYm9keS10ZXh0LWNvbG9yKTsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgICB9CgogICAgICBbdGhlbWV+PSJkYXJrIl0gewogICAgICAgIGNvbG9yOiB2YXIoLS1sdW1vLWJvZHktdGV4dC1jb2xvcik7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgICAgfQoKICAgICAgaDEsCiAgICAgIGgyLAogICAgICBoMywKICAgICAgaDQsCiAgICAgIGg1LAogICAgICBoNiB7CiAgICAgICAgY29sb3I6IHZhcigtLWx1bW8taGVhZGVyLXRleHQtY29sb3IpOwogICAgICB9CgogICAgICBhIHsKICAgICAgICBjb2xvcjogdmFyKC0tbHVtby1wcmltYXJ5LXRleHQtY29sb3IpOwogICAgICB9CgogICAgICBibG9ja3F1b3RlIHsKICAgICAgICBjb2xvcjogdmFyKC0tbHVtby1zZWNvbmRhcnktdGV4dC1jb2xvcik7CiAgICAgIH0KCiAgICAgIGNvZGUsCiAgICAgIHByZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLW0pOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0ibHVtby1jb2xvci1sZWdhY3kiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJsdW1vLWNvbG9yIj4KICAgICAgOmhvc3QgewogICAgICAgIGNvbG9yOiB2YXIoLS1sdW1vLWJvZHktdGV4dC1jb2xvcikgIWltcG9ydGFudDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpICFpbXBvcnRhbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkX2RvY3VtZW50Q29udGFpbmVyJDUuY29udGVudCk7CgogICAgY29uc3QgJF9kb2N1bWVudENvbnRhaW5lciQ2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKCiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDYuaW5uZXJIVE1MID0gYDxjdXN0b20tc3R5bGU+CiAgPHN0eWxlPgogICAgQGZvbnQtZmFjZSB7CiAgICAgIGZvbnQtZmFtaWx5OiAnbHVtby1pY29ucyc7CiAgICAgIHNyYzogdXJsKGRhdGE6YXBwbGljYXRpb24vZm9udC13b2ZmO2NoYXJzZXQ9dXRmLTg7YmFzZTY0LGQwOUdSZ0FCQUFBQUFCRWdBQXNBQUFBQUlpd0FBUUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFCSFUxVkNBQUFCQ0FBQUFEc0FBQUJVSUlzbGVrOVRMeklBQUFGRUFBQUFRd0FBQUZaQUlVdUtZMjFoY0FBQUFZZ0FBQUQ0QUFBRHJzQ1U4ZDVuYkhsbUFBQUNnQUFBQzJNQUFCZDRoOVRvMldobFlXUUFBQTNrQUFBQU1RQUFBRFlTbkNrdWFHaGxZUUFBRGhnQUFBQWRBQUFBSkFicEEzNW9iWFI0QUFBT09BQUFBQkFBQUFDc3BCQUFBR3h2WTJFQUFBNUlBQUFBV0FBQUFGaDU1SUFzYldGNGNBQUFEcUFBQUFBZkFBQUFJQUZLQVhCdVlXMWxBQUFPd0FBQUFURUFBQUl1VVVKWkNIQnZjM1FBQUEvMEFBQUJLd0FBQWVsbThTelZlSnhqWUdSZ1lPQmlNR0N3WTJCeWNmTUpZZURMU1N6Slk1QmlZR0dBQUpBOE1wc3hKek05a1lFRHhnUEtzWUJwRGlCbWc0Z0NBQ1k3QlVnQWVKeGpZR1MreURpQmdaV0JnYW1LYVE4REEwTVBoR1o4d0dESXlBUVVaV0JsWnNBS0F0SmNVeGdjWGpHKzBtSU8rcC9GRU1VY3hEQU5LTXdJa2dNQUJuOE1MUUI0bk8zU1dXNkRNQUJGMFV0d0NFbklQTS96aExLOExxaGZYUnliU1AxNFhVWXRIVjloR1lRd1FCTklvM2NVSVBraFFlTTdyaWIxZWtxblhnOTgxWHVDMXF2eTg0bHpvamxlaDNwdXhMMGhQakdqUlU0NzN0ZWxvRWVmQVVOR2pKa3daY2FjQlV0V3JObXdaY2VlQTBkT25MbHc1Y2FkQjA5ZWxQR2hHZitqME5USS82NUtmWGVyVDZKaHFLbnBSS3RnT3B1cWFUcnRLalBVbHFIbWh0bzIxSTdwTDZpNmhscVkzcTdxR1dyZlVBZUdPalRVa2FHT0RYVmlxRk5EblJucTNGQVhocm8wMUpXaHJnMTFZNmhiUTkwWjZ0NVFENFo2Tk5TVG9aNE45V0tvVjBPOUdlcmRVQitHK2pUVWw2R1dSdmtMMjRCa0VYaWN0Vmg5YkZ2VkZiL254dmJ6KzdSZi9ONnpIY2QyYkNmUCtXZ2MxWjlOMGpwTm5FTDZrYlJWUzZIQTJoUVlHaDlUR1IxQ2JDcWEyclhyV09rUUUvc0hOSmdtdFp2b1ZOWnFFMUIxRE5IeHpUUXhDZWhVVFlpSlRReUVOdWkwcVNMZXpyM1BkdXlRZmdtUldPZmRlOCs5NTUxejdybm4vTzRqTG9KL2JSUDBVYUtRTUxGSmpwQkF2cGhMWkMzRGswb2s3V0J6UjIvdXBKczdSeXcvbmZGYmxuL3V1Ti9hcEN2d3JLTHJTdlVxUnVmYm01cG4wZnMwdzRnWXhuR1ZQNnFIbk80YldpRFFHUWd3dFM2bG0zbEIzUW9YMU0ydndFbXV6aXJGMzl5K0VzMitESjhkMXBreXFCSXFvemUzRDErWno0RHJGb2F6eEk4ZFd3TXJEbFoyRE1xUUFSOUFST3NKVSsyY21sVFBhelRjbzUyRjF4VGEyYTIrSzh2dnE5MmRWSG10TG9QZVFYL0FaUFJZR3RoRFlPZVpqQmpLb0ZzVkd1bFIzbFdVOTVXZUNLNDRxSFU3TWhXVUdVS1pEVDNvS1VjRzJHV3VoK0VERGZVWUEvamhBaGwwVE9zSk5ZU0V1N21RbWkzVXpmWHdaS0E0QnNWc0hMWFFZR2dSVzk1dUV0cEoxVmZuOVhpTHJpUkJsRkVxeHNEakEwOXlDTlVvUXh4d2Q3S1dTVHQyeTNHVEtpZmxxSFJTb1daYzNtMTFXYS9mSmRGZ1hENHNTWWZsZUpCS2Q4R016N0o4ZFpuL2NHUkNjS0dEbkEyR2UzZkt6Y3ZsblRETnRoR1dMWHpYL1dhWHRVQW1SZ2VMbEhTcjMwcjBHOVVUWE1iMEF0bXd6T295NzNma1NsSFprZHV3L1RZdVU5Y0FENFl1dFBveFRUc0EzNzk3d1ZyNFovMU5DNXpBUkhyNHZ0eEpqeElmaVpNaE1rYldrKzE0Qm5KWkt3cUdad0Rmc3dMeXhXRFNnMTFyRkxKRjdOb3B4amQxaDEvUU9UK29lemdmdTNZcStIaytkdWY1eCs0MG8xR1RrYUlnaWtLL0lFbkM2YVl4Q1VCYVpKU040WFRZRmpVL1lNTklLcUp3aERHT0NDSThGRFhuWG1YanRHaEdKeVNocWpBT25CT2tXMkpHOVM3R2dZZU1XQVU1SnpobldtQk9hT00rQ0tFUG9xU2ZGREMyVW5xK0RMbFVnVVZVRkZMWkdKZzZqdGxvanNkc2E4a1BPYlB1SmRpNWRuQmRCc0xKTUdUV0RhNHQySnZ0d3VQbzlzK1k4NnN1di9XMzNRRzFyQWFPQVVWK3Z4NEs2ZjJEMDRQVktsQzdXTFNyWnpBaTQ1WlY2bElDN1dvWHFtUnl2VXFvVndyelVvVnNJamVUWFdRditSSDVHVGxCWGlCL0luOGxuMEliQkNBRk9hakFKcmdaWXlPSFdxT2ZVZS9hSGpJMTJSNk9RbzFqQ2d0MjE1bCs0ZjZYUGIrME1Ob3UwVis0M24yRjc3dFNmUmIyNGQ3eml0Z25LbXZZSHM2OXp1Z2FQdkJ3djZpb1hrYjJMZEw2NUF0dzUxdUxrWGx1MWJoTU1SY1hTUGNZb3FLSVJsaDM0bFFQOC81SmJ1VUZ5ZTR2eEQ2LzZNeEZGMTFDMHVWTHI5VWxndzQ0dFMzcE1WaU5MVUV4YnljRmdMSWN0K1FETWliUmlteDF5ZFV6OEZYWml1T0lEQk9NVlgyblVaYytodU5FNVhVSjgxdWlKb2lhYndxYVZGMHVhY0tiYXUvcGw0UjJWVzBYWGxKcmE2Ym9WcllHNjQ2VEY1Tll6d3k0dmpFTlZyRGxjTnBaUGw4REg2WFg4WFdDeDBtdldWWlk2S0ZMcnZzWTY2L3pQaWN0NUZueGFOVVIvanV2WkNNM1R2RDYwRTJXMXRaaXpiWFRQRHVhYmNtMG5iYnpwV0twbUExYXlCUThnaWVkTFVNK0Ewa05qQmpRam11WXo3WXJnSVhZdm1GNjNaTEJ3U1hycG45VGI5d3dkZC9VMUgwUE1RSzNYY084dWwzV1Q3UHlQUGRweTBUZW1LeE5SY0pOYXVpWEpublVEcFVwcFFXczRTblVJeTBFRVNHWXFKWVFMR0h4emFHV3dWSWFTNlk3bVFGTThaallEUTNheGpmNjFTV2pVMzNKd09aQTFwd2FHMUw5bXpmNzFhSFJkWDFKSHc2RnAwYVhoTndicXllR05nNE5iZHpHQ0J4b3o0WlhqeTROdTY5WnI2c0RZNnZNckxVNW5BMVA4SmtiZFdYSjZFUmZNcnl2TmgxSmZROStUNGRJaEd2Szl3M2R4akJCemF0c1EvTWxPSFZJRG5ZcER6Nm9kQVhsUTAxdDJQYTVJYWZkOE1NcHhBZURLUDBDNkNqZ1ZMVDVvc0I2aWNVeDAxbFdqWHh6VC9HeVJGMndlbEVNNVovN2pHM1ZqUTFTck5uNUlieXpPRzVkb2JCMy9RSHh5WnZzWGNvejhJb0V3UzdwbENnK3p4SFFrNDI0cTlCZkVwa0VTSmJGSFF1c0RCU1dGa3VCa29QTzBrTEt3UlZZanhHWGxIVGNURFFNSi9INlRYOWFma083bW5yYVRPMWZlVG5aQVhMdTRjcDdIQVhNbU5HMXllRms5VGdTL05IaFpSLzRRb0JUci9aQis2aENneWwxNU5xMVViTjZuRTEvWm5QMVUyY2l6Q0JwdnM4Y0pRWko0TGtZeDVOL3laUEFVWk5RUTBWNGYzQlFsbFdySzNZUnpsMzBkT1Q2UlZuMnVwTnVyNndvU2E4Q3FwZFQvYUtuQk00bzNqTnVyOWQ5eHF0VVQ2dmVCRXQ5Q2E5YXQrRVJ6RUVoVWtSOHNhNW1RNGFWdkpvVmVFQTh6STRlaTVtVUxYRkd5VTd6LzZUQWVZTFZjcHpTV1pZOFBZWUY1eXJUVjYwc1QwK1hWMTQxdlgrK1dmMTZWMmJGZUdWUFpYeEZwa3Z5ZUtUV0xsemZXMG1uS3hzWTZZMzI5NC8wOTk4U0NmWDFibG01cGJjdkZHbHEvcjA3TVJBTWhZSURpVzVKRktXVzN2ZHJFcENzWlNKRytvbTdadS9QU1NjWkpoTmtMYm1XNVdzcjEycFdxVzV6S3Rsd1JTNGJGT3hVdzE3bUN6eTZsc2tDRGwxV1lPR1dEWXJBRHJNQTdCRER3ZVdXTmQ1a29pSm5SMWR6K3l0TFAycTBTcVBCMWxuSzJjY0I3UlllNEZTb1BrczNpQjN0NHR4VFNIY3RiMnN5MWl2azBwdkh1Q05tNncxZjZ3eHYzK09DZ043OExxZFFuVVZoN1Iwb1RBcDB6T2YycmJXNzcwVnU1QzJkSXlHZFRuSG84elNqaTdkcHBqMFVTb1ZDeitsaFJNVGg1M1RlcTlWYkdmYmp1U2JBb29TZFhheVk0UFlIZzM3NEM2ZjdnbDFCL0RYdUo0L1FYeE9CZEpGSnNwRnNJM2VncG9XVVVDamxUSUZuTllObCtaeVpLbUJlWUtHSGtEMVF5RGxoYUtiS3dLY0lKcUo0VExKMk9tZFkvSldYYWU0RGRHQnc4SFo3ZVhjZ0ZGMnpyMlNvYWxEcnk1aUtxb2EwUHVoZTNoUFEyczNlbFRZTStNSStuM3JLMEtnTDcvTGEzR2VNTHQ2bTd1OTEydkdudnRPUmlJYTBxQm1ocVZpK1hXOVhOQm1xYjhlVmdLeklIZkdJNWJOb0c3WDBVQ3plSVNtcUljTy9uWThGSDdVOGF2WDlmeC9TVCtoeDBzZXpQdzlReThNdW0zR1dmMk40VXkveUlZR1ZCWGJKSFdJWnA3ZGZUY3B0ZE1UcjlRbXE3RGFpSy91a3FDTDRrdDRSVWZTNVhQbk10bVQyMi9tUUZxRjdlbVNxdHJsdThTVkVseERSSnJaT0RrcHV3ZTBWZlRmamRFcDFmN0E3ditmb3pOQlhVSi82V1R1SzJUdEZscEZWWkFaM0xjRnZVaTFaMnAyWVQrRU1Ba0dKVlN0T3pMVEFQZzRJcVdJQWx6UlNqT0JrbDJ6eGozVEt5Y3B6VC9NbnZYM3VhU01XTStnVTBya1hqb2hoZWZWUk1hcHMzL2tMTVNLdjIzbFQyM3V4UXJrUWp5T0psZU1Ec2RoQW5ENlpHRWxXWjVNakNYekNFL2hrV1grV0Y0a256R2hWT3lLMmVRWmVrVjNleW8wekw4a3VZV0NuREN2ampoQWtjVFBPQkRYVmRvYXYzSFZjRm5Rakx2dFY5UzJwMHpBNkplZ1B3TVF4dCt5RmIzbGw5ekdscS81ZFJLYjNjRXlRWW9hTllwaGFySjd4Q0I3QVd4c0xZM2pqWlhZMFhzWmowV2p3YzlJNlBQL2RLQUJuQ1phcUhwYVpFQUN4azRaZUxaU0tOZ1pBQmwrbFlRWDFzSlFPU1gzbjZyNDEwZXZjb3VkNUplQUdVWFZQOUgxdFpPS2VqVHE0T25vMHowZXJybzFGcm5PcG9odmExZC9oVGR0VnNRZEtONVc5UmxUM05qRDBuem55S05UZ0tBTWZXTldjeW9kVjBJR0xQSUhPRjBvNEp5cXVmYUs0ejZXSUl6dUdoM2Q4Yzhjd1FnOEVSK09WeHlyamRtOHZOdWh0czRMb09paEd4SU11VWRnendpWU43eGhoMStvWm5KTnVURzdnUVp2dTRYV1o5R0FaWmpHRXVid2VQcVlodEtEVEgrOVZRa2wxNy9pR3lic25KKzgrc0t0eVByY2xsOXR5NjVac2RzdC85aXFwRUtoN001VmRCeGgzY3NPZE5jNnRXM0kxdXlNMVB6T1hlZ1NPckxGc0ZOSTJPMjdNK1RGMkFwbk45TVV2NXVkNkxqeEl2RVFuSFJ6eEl1NElzQTlNTEZrSm4ydGNab1o3T043ZFhlN3VqcmM4SHJ1c1BLYW1scVh3ZDc3bFFVdUxwaWxhdTRQVU1hcHVlQmI3aXJVNFJvVVhFWVh1VnVJR2xSR21PcCsybE5rYVJQVnppT3FtbGFadmFxRzRkRmdTajBqeEVKV3J2MTJJVVdudG13K3JmUWFyUkUwQXBoNG9jSTZubFVsR3FzK3UzLytUL2V0aFc2MlBwSHAyZUhiWnN0bmgvd09POTV5REFIaWNZMkJrWUdBQVlpMk5PSjk0ZnB1dkROek1MNEFpRE5jL2Z6cUVvUCsvWnA3S2RBdkk1V0JnQW9rQ0FHa2NEZmdBQUFCNG5HTmdaR0JnRHZxZkJTUmZNQUFCODFRR1JnWlVvQTBBVnZZRGJ3QUFBSGljWTJCZ1lHQitNVFF3QU04RUpvOEFBQUFBQUU0QW1nRG9BUW9CTEFGT0FYQUJtZ0hFQWU0Q0dnS2NBdWdFbWdTOEJOWUU4Z1VPQlNvRmVnWFFCZjRHUkFabUJyWUhHQWVRQ0JnSVVnaHFDUDRKUmdtK0Nkb0tCQW84Q29JS3VBcndDMUFMbGd1OGVKeGpZR1JnWU5CbVRHRVFaUUFCSmlEbUFrSUdodjlnUGdNQUdKUUJ2QUI0bkcyUlBVN0RNQmlHMy9RUDBVb0lCR0poOFFJTGF2b3pkbVJvOXc3ZDA5UnBVemx4NUxnVnZRTW40QkFjZ29FemNBZ093VnZ6U1pWUWJjbmY0OGZ2RnlzSmdHdDhJY0p4Uk9pRzlUZ2F1T0R1ajV1a0crRVcrVUc0alI0ZWhUdjBRK0V1bmpFUjd1RVdtaytJV3BjMGQzZ1ZidUFLYjhKTituZmhGdmxEdUkxN2ZBcDM2TCtGdTFqZ1I3aUhwK2pGN0FyYnoxTmIxbk85M3BuRW5jU0pGdHJWdVMzVktCNmU1RXlYMmlWZXI5VHlvT3I5ZXV4OXBqSm5DelcxcGRmR1dGVTV1OVdwanpmZVY1UEJJQk1mcDdhQXdRNEZMUHJJa2JLV3FESG4rNjdwRFJLNHM0bHpic0V1eDVxSHZjSUlNYi9udWVTTXlUS2tFM2pXRmROTEhMalcyUFBtTWExSHhuM0dqR1cvd2pUMEh0T0cwOUpVNFd4TGs5TEgySVN1aXY5dHdKbjl5OGZoOXVJWEkrQmtuQUFBQUhpY2JZN1pib013RUVXNUNWQkNTTHJ2Kzc2a2ZKUmpUd0hGc2RHQUcrWHZ5NUpVZmVoSUhwMHJueG1OTi9ENmlyMy9hNFlCaHZBUklNUU9Jb3dRWTR3RUUweXhpejNzNHdDSE9NSXhUbkNLTTV6akFwZTR3alZ1Y0lzNzNPTUJqM2pDTTE3d2lqZTg0d016ZkhxSjBFVm1Va21tSm83N29PbXJIdmZJUlpiWHNUQ1pwbFRabGRsZ2IzVFlHVkhQcm93RnMxMXQxQTU3dGNPTjJyRXJSM1BCcWN3RjEvNmN0STZrMEdTVTRKSE1TUzZXZ2hkSlE5OXNUYmZ1TjdRTEo5dlEzN2ROcmd5a3RuSXhsRFlMSk51cWl0cFJiWVdLRk51eURUNnBvZzZvT1lLSHRLYWtlYWtxS2pIWHBQd2xHUmNzQytPcXhMSWlKcFhxb3FxRE1yZUcybDVidjlSaTNUUlgrYzIzRFpuYTlXRkZnbVh1TzZQczFKbS93NkVyVzhOM0ZiSG4vUUM0NDRqMEFBPT0pIGZvcm1hdCgnd29mZicpOwogICAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgICBmb250LXN0eWxlOiBub3JtYWw7CiAgICB9CgogICAgaHRtbCB7CiAgICAgIC0tbHVtby1pY29ucy1hbGlnbi1jZW50ZXI6ICJcXGVhMDEiOwogICAgICAtLWx1bW8taWNvbnMtYWxpZ24tbGVmdDogIlxcZWEwMiI7CiAgICAgIC0tbHVtby1pY29ucy1hbGlnbi1yaWdodDogIlxcZWEwMyI7CiAgICAgIC0tbHVtby1pY29ucy1hbmdsZS1kb3duOiAiXFxlYTA0IjsKICAgICAgLS1sdW1vLWljb25zLWFuZ2xlLWxlZnQ6ICJcXGVhMDUiOwogICAgICAtLWx1bW8taWNvbnMtYW5nbGUtcmlnaHQ6ICJcXGVhMDYiOwogICAgICAtLWx1bW8taWNvbnMtYW5nbGUtdXA6ICJcXGVhMDciOwogICAgICAtLWx1bW8taWNvbnMtYXJyb3ctZG93bjogIlxcZWEwOCI7CiAgICAgIC0tbHVtby1pY29ucy1hcnJvdy1sZWZ0OiAiXFxlYTA5IjsKICAgICAgLS1sdW1vLWljb25zLWFycm93LXJpZ2h0OiAiXFxlYTBhIjsKICAgICAgLS1sdW1vLWljb25zLWFycm93LXVwOiAiXFxlYTBiIjsKICAgICAgLS1sdW1vLWljb25zLWJhci1jaGFydDogIlxcZWEwYyI7CiAgICAgIC0tbHVtby1pY29ucy1iZWxsOiAiXFxlYTBkIjsKICAgICAgLS1sdW1vLWljb25zLWNhbGVuZGFyOiAiXFxlYTBlIjsKICAgICAgLS1sdW1vLWljb25zLWNoZWNrbWFyazogIlxcZWEwZiI7CiAgICAgIC0tbHVtby1pY29ucy1jaGV2cm9uLWRvd246ICJcXGVhMTAiOwogICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi1sZWZ0OiAiXFxlYTExIjsKICAgICAgLS1sdW1vLWljb25zLWNoZXZyb24tcmlnaHQ6ICJcXGVhMTIiOwogICAgICAtLWx1bW8taWNvbnMtY2hldnJvbi11cDogIlxcZWExMyI7CiAgICAgIC0tbHVtby1pY29ucy1jbG9jazogIlxcZWExNCI7CiAgICAgIC0tbHVtby1pY29ucy1jb2c6ICJcXGVhMTUiOwogICAgICAtLWx1bW8taWNvbnMtY3Jvc3M6ICJcXGVhMTYiOwogICAgICAtLWx1bW8taWNvbnMtZG93bmxvYWQ6ICJcXGVhMTciOwogICAgICAtLWx1bW8taWNvbnMtZHJvcGRvd246ICJcXGVhMTgiOwogICAgICAtLWx1bW8taWNvbnMtZWRpdDogIlxcZWExOSI7CiAgICAgIC0tbHVtby1pY29ucy1lcnJvcjogIlxcZWExYSI7CiAgICAgIC0tbHVtby1pY29ucy1leWU6ICJcXGVhMWIiOwogICAgICAtLWx1bW8taWNvbnMtZXllLWRpc2FibGVkOiAiXFxlYTFjIjsKICAgICAgLS1sdW1vLWljb25zLW1lbnU6ICJcXGVhMWQiOwogICAgICAtLWx1bW8taWNvbnMtbWludXM6ICJcXGVhMWUiOwogICAgICAtLWx1bW8taWNvbnMtb3JkZXJlZC1saXN0OiAiXFxlYTFmIjsKICAgICAgLS1sdW1vLWljb25zLXBob25lOiAiXFxlYTIwIjsKICAgICAgLS1sdW1vLWljb25zLXBob3RvOiAiXFxlYTIxIjsKICAgICAgLS1sdW1vLWljb25zLXBsYXk6ICJcXGVhMjIiOwogICAgICAtLWx1bW8taWNvbnMtcGx1czogIlxcZWEyMyI7CiAgICAgIC0tbHVtby1pY29ucy1yZWRvOiAiXFxlYTI0IjsKICAgICAgLS1sdW1vLWljb25zLXJlbG9hZDogIlxcZWEyNSI7CiAgICAgIC0tbHVtby1pY29ucy1zZWFyY2g6ICJcXGVhMjYiOwogICAgICAtLWx1bW8taWNvbnMtdW5kbzogIlxcZWEyNyI7CiAgICAgIC0tbHVtby1pY29ucy11bm9yZGVyZWQtbGlzdDogIlxcZWEyOCI7CiAgICAgIC0tbHVtby1pY29ucy11cGxvYWQ6ICJcXGVhMjkiOwogICAgICAtLWx1bW8taWNvbnMtdXNlcjogIlxcZWEyYSI7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDsKCiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCRfZG9jdW1lbnRDb250YWluZXIkNi5jb250ZW50KTsKCiAgICBjb25zdCAkX2RvY3VtZW50Q29udGFpbmVyJDcgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpOwoKICAgICRfZG9jdW1lbnRDb250YWluZXIkNy5pbm5lckhUTUwgPSBgPGN1c3RvbS1zdHlsZT4KICA8c3R5bGU+CiAgICBodG1sIHsKICAgICAgLS1sdW1vLXNpemUteHM6IDEuNjI1cmVtOwogICAgICAtLWx1bW8tc2l6ZS1zOiAxLjg3NXJlbTsKICAgICAgLS1sdW1vLXNpemUtbTogMi4yNXJlbTsKICAgICAgLS1sdW1vLXNpemUtbDogMi43NXJlbTsKICAgICAgLS1sdW1vLXNpemUteGw6IDMuNXJlbTsKCiAgICAgIC8qIEljb25zICovCiAgICAgIC0tbHVtby1pY29uLXNpemUtczogMS4yNWVtOwogICAgICAtLWx1bW8taWNvbi1zaXplLW06IDEuNWVtOwogICAgICAtLWx1bW8taWNvbi1zaXplLWw6IDIuMjVlbTsKICAgICAgLyogRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5ICovCiAgICAgIC0tbHVtby1pY29uLXNpemU6IHZhcigtLWx1bW8taWNvbi1zaXplLW0pOwogICAgfQogIDwvc3R5bGU+CjwvY3VzdG9tLXN0eWxlPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkX2RvY3VtZW50Q29udGFpbmVyJDcuY29udGVudCk7CgogICAgY29uc3QgJF9kb2N1bWVudENvbnRhaW5lciQ4ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGVtcGxhdGUnKTsKCiAgICAkX2RvY3VtZW50Q29udGFpbmVyJDguaW5uZXJIVE1MID0gYDxjdXN0b20tc3R5bGU+CiAgPHN0eWxlPgogICAgaHRtbCB7CiAgICAgIC8qIFNxdWFyZSAqLwogICAgICAtLWx1bW8tc3BhY2UteHM6IDAuMjVyZW07CiAgICAgIC0tbHVtby1zcGFjZS1zOiAwLjVyZW07CiAgICAgIC0tbHVtby1zcGFjZS1tOiAxcmVtOwogICAgICAtLWx1bW8tc3BhY2UtbDogMS41cmVtOwogICAgICAtLWx1bW8tc3BhY2UteGw6IDIuNXJlbTsKCiAgICAgIC8qIFdpZGUgKi8KICAgICAgLS1sdW1vLXNwYWNlLXdpZGUteHM6IGNhbGModmFyKC0tbHVtby1zcGFjZS14cykgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLXhzKTsKICAgICAgLS1sdW1vLXNwYWNlLXdpZGUtczogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXMpIC8gMikgdmFyKC0tbHVtby1zcGFjZS1zKTsKICAgICAgLS1sdW1vLXNwYWNlLXdpZGUtbTogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLW0pIC8gMikgdmFyKC0tbHVtby1zcGFjZS1tKTsKICAgICAgLS1sdW1vLXNwYWNlLXdpZGUtbDogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLWwpIC8gMikgdmFyKC0tbHVtby1zcGFjZS1sKTsKICAgICAgLS1sdW1vLXNwYWNlLXdpZGUteGw6IGNhbGModmFyKC0tbHVtby1zcGFjZS14bCkgLyAyKSB2YXIoLS1sdW1vLXNwYWNlLXhsKTsKCiAgICAgIC8qIFRhbGwgKi8KICAgICAgLS1sdW1vLXNwYWNlLXRhbGwteHM6IHZhcigtLWx1bW8tc3BhY2UteHMpIGNhbGModmFyKC0tbHVtby1zcGFjZS14cykgLyAyKTsKICAgICAgLS1sdW1vLXNwYWNlLXRhbGwtczogdmFyKC0tbHVtby1zcGFjZS1zKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UtcykgLyAyKTsKICAgICAgLS1sdW1vLXNwYWNlLXRhbGwtbTogdmFyKC0tbHVtby1zcGFjZS1tKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UtbSkgLyAyKTsKICAgICAgLS1sdW1vLXNwYWNlLXRhbGwtbDogdmFyKC0tbHVtby1zcGFjZS1sKSBjYWxjKHZhcigtLWx1bW8tc3BhY2UtbCkgLyAyKTsKICAgICAgLS1sdW1vLXNwYWNlLXRhbGwteGw6IHZhcigtLWx1bW8tc3BhY2UteGwpIGNhbGModmFyKC0tbHVtby1zcGFjZS14bCkgLyAyKTsKICAgIH0KICA8L3N0eWxlPgo8L2N1c3RvbS1zdHlsZT5gOwoKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoJF9kb2N1bWVudENvbnRhaW5lciQ4LmNvbnRlbnQpOwoKICAgIGNvbnN0ICRfZG9jdW1lbnRDb250YWluZXIkOSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CgogICAgJF9kb2N1bWVudENvbnRhaW5lciQ5LmlubmVySFRNTCA9IGA8Y3VzdG9tLXN0eWxlPgogIDxzdHlsZT4KICAgIGh0bWwgewogICAgICAvKiBCb3JkZXIgcmFkaXVzICovCiAgICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLXM6IDAuMjVlbTsgLyogQ2hlY2tib3gsIGJhZGdlLCBkYXRlLXBpY2tlciB5ZWFyIGluZGljYXRvciwgZXRjICovCiAgICAgIC0tbHVtby1ib3JkZXItcmFkaXVzLW06IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cywgMC4yNWVtKTsgLyogQnV0dG9uLCB0ZXh0IGZpZWxkLCBtZW51IG92ZXJsYXksIGV0YyAqLwogICAgICAtLWx1bW8tYm9yZGVyLXJhZGl1cy1sOiAwLjVlbTsgLyogRGlhbG9nLCBub3RpZmljYXRpb24sIGV0YyAqLwogICAgICAtLWx1bW8tYm9yZGVyLXJhZGl1czogMC4yNWVtOyAvKiBEZXByZWNhdGVkICovCgogICAgICAvKiBTaGFkb3cgKi8KICAgICAgLS1sdW1vLWJveC1zaGFkb3cteHM6IDAgMXB4IDRweCAtMXB4IHZhcigtLWx1bW8tc2hhZGUtNTBwY3QpOwogICAgICAtLWx1bW8tYm94LXNoYWRvdy1zOiAwIDJweCA0cHggLTFweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCAzcHggMTJweCAtMXB4IHZhcigtLWx1bW8tc2hhZGUtMzBwY3QpOwogICAgICAtLWx1bW8tYm94LXNoYWRvdy1tOiAwIDJweCA2cHggLTFweCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSwgMCA4cHggMjRweCAtNHB4IHZhcigtLWx1bW8tc2hhZGUtNDBwY3QpOwogICAgICAtLWx1bW8tYm94LXNoYWRvdy1sOiAwIDNweCAxOHB4IC0ycHggdmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIDAgMTJweCA0OHB4IC02cHggdmFyKC0tbHVtby1zaGFkZS00MHBjdCk7CiAgICAgIC0tbHVtby1ib3gtc2hhZG93LXhsOiAwIDRweCAyNHB4IC0zcHggdmFyKC0tbHVtby1zaGFkZS0yMHBjdCksIDAgMThweCA2NHB4IC04cHggdmFyKC0tbHVtby1zaGFkZS00MHBjdCk7CgogICAgICAvKiBDbGlja2FibGUgZWxlbWVudCBjdXJzb3IgKi8KICAgICAgLS1sdW1vLWNsaWNrYWJsZS1jdXJzb3I6IGRlZmF1bHQ7CiAgICB9CiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+YDsKCiAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKCRfZG9jdW1lbnRDb250YWluZXIkOS5jb250ZW50KTsKCiAgICBjb25zdCAkX2RvY3VtZW50Q29udGFpbmVyJGEgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0ZW1wbGF0ZScpOwoKICAgICRfZG9jdW1lbnRDb250YWluZXIkYS5pbm5lckhUTUwgPSBgPGN1c3RvbS1zdHlsZT4KICA8c3R5bGU+CiAgICBodG1sIHsKICAgICAgLyogRm9udCBmYW1pbGllcyAqLwogICAgICAtLWx1bW8tZm9udC1mYW1pbHk6IC1hcHBsZS1zeXN0ZW0sIEJsaW5rTWFjU3lzdGVtRm9udCwgIlJvYm90byIsICJTZWdvZSBVSSIsIEhlbHZldGljYSwgQXJpYWwsIHNhbnMtc2VyaWYsICJBcHBsZSBDb2xvciBFbW9qaSIsICJTZWdvZSBVSSBFbW9qaSIsICJTZWdvZSBVSSBTeW1ib2wiOwoKICAgICAgLyogRm9udCBzaXplcyAqLwogICAgICAtLWx1bW8tZm9udC1zaXplLXh4czogLjc1cmVtOwogICAgICAtLWx1bW8tZm9udC1zaXplLXhzOiAuODEyNXJlbTsKICAgICAgLS1sdW1vLWZvbnQtc2l6ZS1zOiAuODc1cmVtOwogICAgICAtLWx1bW8tZm9udC1zaXplLW06IDFyZW07CiAgICAgIC0tbHVtby1mb250LXNpemUtbDogMS4xMjVyZW07CiAgICAgIC0tbHVtby1mb250LXNpemUteGw6IDEuMzc1cmVtOwogICAgICAtLWx1bW8tZm9udC1zaXplLXh4bDogMS43NXJlbTsKICAgICAgLS1sdW1vLWZvbnQtc2l6ZS14eHhsOiAyLjVyZW07CgogICAgICAvKiBMaW5lIGhlaWdodHMgKi8KICAgICAgLS1sdW1vLWxpbmUtaGVpZ2h0LXhzOiAxLjI1OwogICAgICAtLWx1bW8tbGluZS1oZWlnaHQtczogMS4zNzU7CiAgICAgIC0tbHVtby1saW5lLWhlaWdodC1tOiAxLjYyNTsKICAgIH0KCiAgPC9zdHlsZT4KPC9jdXN0b20tc3R5bGU+PGRvbS1tb2R1bGUgaWQ9Imx1bW8tdHlwb2dyYXBoeSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICBodG1sIHsKICAgICAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZSwgdmFyKC0tbHVtby1mb250LXNpemUtbSkpOwogICAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LW0pOwogICAgICAgIC13ZWJraXQtdGV4dC1zaXplLWFkanVzdDogMTAwJTsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwogICAgICB9CgogICAgICAvKiBDYW7igJl0IGNvbWJpbmUgd2l0aCB0aGUgYWJvdmUgc2VsZWN0b3IgYmVjYXVzZSB0aGF0IGRvZXNu4oCZdCB3b3JrIGluIGJyb3dzZXJzIHdpdGhvdXQgbmF0aXZlIHNoYWRvdyBkb20gKi8KICAgICAgOmhvc3QgewogICAgICAgIGZvbnQtZmFtaWx5OiB2YXIoLS1sdW1vLWZvbnQtZmFtaWx5KTsKICAgICAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLCB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1tKSk7CiAgICAgICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQtbSk7CiAgICAgICAgLXdlYmtpdC10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOwogICAgICAgIC13ZWJraXQtZm9udC1zbW9vdGhpbmc6IGFudGlhbGlhc2VkOwogICAgICAgIC1tb3otb3N4LWZvbnQtc21vb3RoaW5nOiBncmF5c2NhbGU7CiAgICAgIH0KCiAgICAgIHNtYWxsLAogICAgICBbdGhlbWV+PSJmb250LXNpemUtcyJdIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLXMpOwogICAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXMpOwogICAgICB9CgogICAgICBbdGhlbWV+PSJmb250LXNpemUteHMiXSB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14cyk7CiAgICAgICAgbGluZS1oZWlnaHQ6IHZhcigtLWx1bW8tbGluZS1oZWlnaHQteHMpOwogICAgICB9CgogICAgICBoMSwKICAgICAgaDIsCiAgICAgIGgzLAogICAgICBoNCwKICAgICAgaDUsCiAgICAgIGg2IHsKICAgICAgICBmb250LXdlaWdodDogNjAwOwogICAgICAgIGxpbmUtaGVpZ2h0OiB2YXIoLS1sdW1vLWxpbmUtaGVpZ2h0LXhzKTsKICAgICAgICBtYXJnaW4tdG9wOiAxLjI1ZW07CiAgICAgIH0KCiAgICAgIGgxIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLXh4eGwpOwogICAgICAgIG1hcmdpbi1ib3R0b206IDAuNzVlbTsKICAgICAgfQoKICAgICAgaDIgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteHhsKTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICAgICAgfQoKICAgICAgaDMgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUteGwpOwogICAgICAgIG1hcmdpbi1ib3R0b206IDAuNWVtOwogICAgICB9CgogICAgICBoNCB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1sKTsKICAgICAgICBtYXJnaW4tYm90dG9tOiAwLjVlbTsKICAgICAgfQoKICAgICAgaDUgewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtbSk7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMC4yNWVtOwogICAgICB9CgogICAgICBoNiB7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14cyk7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMDsKICAgICAgICB0ZXh0LXRyYW5zZm9ybTogdXBwZXJjYXNlOwogICAgICAgIGxldHRlci1zcGFjaW5nOiAwLjAzZW07CiAgICAgIH0KCiAgICAgIHAsCiAgICAgIGJsb2NrcXVvdGUgewogICAgICAgIG1hcmdpbi10b3A6IDAuNWVtOwogICAgICAgIG1hcmdpbi1ib3R0b206IDAuNzVlbTsKICAgICAgfQoKICAgICAgYSB7CiAgICAgICAgdGV4dC1kZWNvcmF0aW9uOiBub25lOwogICAgICB9CgogICAgICBhOmhvdmVyIHsKICAgICAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgICAgfQoKICAgICAgaHIgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGFsaWduLXNlbGY6IHN0cmV0Y2g7CiAgICAgICAgaGVpZ2h0OiAxcHg7CiAgICAgICAgYm9yZGVyOiAwOwogICAgICAgIHBhZGRpbmc6IDA7CiAgICAgICAgbWFyZ2luOiB2YXIoLS1sdW1vLXNwYWNlLXMpIGNhbGModmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLW0pIC8gMik7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICAgIH0KCiAgICAgIGJsb2NrcXVvdGUgewogICAgICAgIGJvcmRlci1sZWZ0OiAycHggc29saWQgdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICAgIH0KCiAgICAgIGIsCiAgICAgIHN0cm9uZyB7CiAgICAgICAgZm9udC13ZWlnaHQ6IDYwMDsKICAgICAgfQoKICAgICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwoKICAgICAgYmxvY2txdW90ZVtkaXI9InJ0bCJdIHsKICAgICAgICBib3JkZXItbGVmdDogbm9uZTsKICAgICAgICBib3JkZXItcmlnaHQ6IDJweCBzb2xpZCB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICAgICAgfQoKICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkX2RvY3VtZW50Q29udGFpbmVyJGEuY29udGVudCk7CgogICAgY29uc3QgJF9kb2N1bWVudENvbnRhaW5lciRiID0gaHRtbGA8ZG9tLW1vZHVsZSBpZD0ibHVtby1jaGVja2JveCIgdGhlbWUtZm9yPSJ2YWFkaW4tY2hlY2tib3giPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZSBpbmNsdWRlPSJsdW1vLWNoZWNrYm94LXN0eWxlIGx1bW8tY2hlY2tib3gtZWZmZWN0cyI+CiAgICAgIC8qIElFMTEgb25seSAqLwogICAgICA6Oi1tcy1iYWNrZHJvcCwKICAgICAgW3BhcnQ9ImNoZWNrYm94Il0gewogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT48ZG9tLW1vZHVsZSBpZD0ibHVtby1jaGVja2JveC1zdHlsZSI+CiAgPHRlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIC1tb3otdXNlci1zZWxlY3Q6IG5vbmU7CiAgICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAgIHVzZXItc2VsZWN0OiBub25lOwogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBvdXRsaW5lOiBub25lOwogICAgICB9CgogICAgICBbcGFydD0ibGFiZWwiXTpub3QoW2VtcHR5XSkgewogICAgICAgIG1hcmdpbjogMC4xODc1ZW0gMC44NzVlbSAwLjE4NzVlbSAwLjM3NWVtOwogICAgICB9CgogICAgICBbcGFydD0iY2hlY2tib3giXSB7CiAgICAgICAgd2lkdGg6IGNhbGMoMWVtICsgMnB4KTsKICAgICAgICBoZWlnaHQ6IGNhbGMoMWVtICsgMnB4KTsKICAgICAgICBtYXJnaW46IDAuMTg3NWVtOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcyk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0yMHBjdCk7CiAgICAgICAgdHJhbnNpdGlvbjogdHJhbnNmb3JtIDAuMnMgY3ViaWMtYmV6aWVyKC4xMiwgLjMyLCAuNTQsIDIpLCBiYWNrZ3JvdW5kLWNvbG9yIDAuMTVzOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxLjI7CiAgICAgIH0KCiAgICAgIDpob3N0KFtpbmRldGVybWluYXRlXSkgW3BhcnQ9ImNoZWNrYm94Il0sCiAgICAgIDpob3N0KFtjaGVja2VkXSkgW3BhcnQ9ImNoZWNrYm94Il0gewogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvcik7CiAgICAgIH0KCiAgICAgIC8qIE5lZWRlZCB0byBhbGlnbiB0aGUgY2hlY2tib3ggbmljZWx5IG9uIHRoZSBiYXNlbGluZSAqLwogICAgICBbcGFydD0iY2hlY2tib3giXTo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiXFwyMDAzIjsKICAgICAgfQoKICAgICAgLyogQ2hlY2ttYXJrICovCiAgICAgIFtwYXJ0PSJjaGVja2JveCJdOjphZnRlciB7CiAgICAgICAgY29udGVudDogIiI7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIHdpZHRoOiAwOwogICAgICAgIGhlaWdodDogMDsKICAgICAgICBib3JkZXI6IDAgc29saWQgdmFyKC0tbHVtby1wcmltYXJ5LWNvbnRyYXN0LWNvbG9yKTsKICAgICAgICBib3JkZXItd2lkdGg6IDAuMTg3NWVtIDAgMCAwLjE4NzVlbTsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDAgMDsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwLjgxMjVlbTsKICAgICAgICBsZWZ0OiAwLjVlbTsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuNTUpIHJvdGF0ZSgtMTM1ZGVnKTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICB9CgogICAgICA6aG9zdChbY2hlY2tlZF0pIFtwYXJ0PSJjaGVja2JveCJdOjphZnRlciB7CiAgICAgICAgb3BhY2l0eTogMTsKICAgICAgICB3aWR0aDogMC42MjVlbTsKICAgICAgICBoZWlnaHQ6IDEuMDYyNWVtOwogICAgICB9CgogICAgICAvKiBJbmRldGVybWluYXRlIGNoZWNrbWFyayAqLwoKICAgICAgOmhvc3QoW2luZGV0ZXJtaW5hdGVdKSBbcGFydD0iY2hlY2tib3giXTo6YWZ0ZXIgewogICAgICAgIHRyYW5zZm9ybTogbm9uZTsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRvcDogNDUlOwogICAgICAgIGhlaWdodDogMTAlOwogICAgICAgIGxlZnQ6IDIyJTsKICAgICAgICByaWdodDogMjIlOwogICAgICAgIHdpZHRoOiBhdXRvOwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLXByaW1hcnktY29udHJhc3QtY29sb3IpOwogICAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4yNXM7CiAgICAgIH0KCiAgICAgIC8qIEZvY3VzIHJpbmcgKi8KCiAgICAgIDpob3N0KFtmb2N1cy1yaW5nXSkgW3BhcnQ9ImNoZWNrYm94Il0gewogICAgICAgIGJveC1zaGFkb3c6IDAgMCAwIDNweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgICB9CgogICAgICAvKiBEaXNhYmxlZCAqLwoKICAgICAgOmhvc3QoW2Rpc2FibGVkXSkgewogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGNvbG9yOiB2YXIoLS1sdW1vLWRpc2FibGVkLXRleHQtY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSBbcGFydD0ibGFiZWwiXSA6OnNsb3R0ZWQoKikgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSBbcGFydD0iY2hlY2tib3giXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXNhYmxlZF0pIFtwYXJ0PSJjaGVja2JveCJdOjphZnRlciB7CiAgICAgICAgYm9yZGVyLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICAgICAgfQoKICAgICAgOmhvc3QoW2luZGV0ZXJtaW5hdGVdW2Rpc2FibGVkXSkgW3BhcnQ9ImNoZWNrYm94Il06OmFmdGVyIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTMwcGN0KTsKICAgICAgfQoKICAgICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwoKICAgICAgOmhvc3QoW2Rpcj0icnRsIl0pIFtwYXJ0PSJsYWJlbCJdOm5vdChbZW1wdHldKSB7CiAgICAgICAgbWFyZ2luOiAwLjE4NzVlbSAwLjM3NWVtIDAuMTg3NWVtIDAuODc1ZW07CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPjxkb20tbW9kdWxlIGlkPSJsdW1vLWNoZWNrYm94LWVmZmVjdHMiPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgLyogVHJhbnNpdGlvbiB0aGUgY2hlY2ttYXJrIGlmIGFjdGl2YXRlZCB3aXRoIHRoZSBtb3VzZSAoZGlzYWJsZWQgZm9yIGdyaWQgc2VsZWN0LWFsbCB0aGlzIHdheSkgKi8KICAgICAgOmhvc3QoOmhvdmVyKSBbcGFydD0iY2hlY2tib3giXTo6YWZ0ZXIgewogICAgICAgIHRyYW5zaXRpb246IHdpZHRoIDAuMXMsIGhlaWdodCAwLjI1czsKICAgICAgfQoKICAgICAgLyogVXNlZCBmb3IgYWN0aXZhdGlvbiAiaGFsbyIgKi8KICAgICAgW3BhcnQ9ImNoZWNrYm94Il06OmJlZm9yZSB7CiAgICAgICAgY29sb3I6IHRyYW5zcGFyZW50OwogICAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jazsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgYm9yZGVyLXJhZGl1czogaW5oZXJpdDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiBpbmhlcml0OwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMS40KTsKICAgICAgICBvcGFjaXR5OiAwOwogICAgICAgIHRyYW5zaXRpb246IHRyYW5zZm9ybSAwLjFzLCBvcGFjaXR5IDAuOHM7CiAgICAgIH0KCiAgICAgIC8qIEhvdmVyICovCgogICAgICA6aG9zdCg6bm90KFtjaGVja2VkXSk6bm90KFtpbmRldGVybWluYXRlXSk6bm90KFtkaXNhYmxlZF0pOmhvdmVyKSBbcGFydD0iY2hlY2tib3giXSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0zMHBjdCk7CiAgICAgIH0KCiAgICAgIC8qIERpc2FibGUgaG92ZXIgZm9yIHRvdWNoIGRldmljZXMgKi8KICAgICAgQG1lZGlhIChwb2ludGVyOiBjb2Fyc2UpIHsKICAgICAgICA6aG9zdCg6bm90KFtjaGVja2VkXSk6bm90KFtpbmRldGVybWluYXRlXSk6bm90KFtkaXNhYmxlZF0pOmhvdmVyKSBbcGFydD0iY2hlY2tib3giXSB7CiAgICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTIwcGN0KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qIEFjdGl2ZSAqLwoKICAgICAgOmhvc3QoW2FjdGl2ZV0pIFtwYXJ0PSJjaGVja2JveCJdIHsKICAgICAgICB0cmFuc2Zvcm06IHNjYWxlKDAuOSk7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wNXM7CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3RpdmVdW2NoZWNrZWRdKSBbcGFydD0iY2hlY2tib3giXSB7CiAgICAgICAgdHJhbnNmb3JtOiBzY2FsZSgxLjEpOwogICAgICB9CgogICAgICA6aG9zdChbYWN0aXZlXTpub3QoW2NoZWNrZWRdKSkgW3BhcnQ9ImNoZWNrYm94Il06OmJlZm9yZSB7CiAgICAgICAgdHJhbnNpdGlvbi1kdXJhdGlvbjogMC4wMXMsIDAuMDFzOwogICAgICAgIHRyYW5zZm9ybTogc2NhbGUoMCk7CiAgICAgICAgb3BhY2l0eTogMC40OwogICAgICB9CiAgICA8L3N0eWxlPgogIDwvdGVtcGxhdGU+CjwvZG9tLW1vZHVsZT5gOwoKICAgIGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoJF9kb2N1bWVudENvbnRhaW5lciRiLmNvbnRlbnQpOwoKICAgIC8qKgogICAgICogQHBvbHltZXJNaXhpbgogICAgICovCiAgICBjb25zdCBUaGVtZVByb3BlcnR5TWl4aW4gPSBzdXBlckNsYXNzID0+IGNsYXNzIFZhYWRpblRoZW1lUHJvcGVydHlNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogSGVscGVyIHByb3BlcnR5IHdpdGggdGhlbWUgYXR0cmlidXRlIHZhbHVlIGZhY2lsaXRhdGluZyBwcm9wYWdhdGlvbgogICAgICAgICAgICogaW4gc2hhZG93IERPTS4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBFbmFibGVzIHRoZSBjb21wb25lbnQgaW1wbGVtZW50YXRpb24gdG8gcHJvcGFnYXRlIHRoZSBgdGhlbWVgCiAgICAgICAgICAgKiBhdHRyaWJ1dGUgdmFsdWUgdG8gdGhlIHN1YmNvbXBvbmVudHMgaW4gU2hhZG93IERPTSBieSBiaW5kaW5nCiAgICAgICAgICAgKiB0aGUgc3ViY29tcG9uZW504oCZcyAidGhlbWUiIGF0dHJpYnV0ZSB0byB0aGUgYHRoZW1lYCBwcm9wZXJ0eSBvZgogICAgICAgICAgICogdGhlIGhvc3QuCiAgICAgICAgICAgKgogICAgICAgICAgICogKipOT1RFOioqIEV4dGVuZGluZyB0aGUgbWl4aW4gb25seSBwcm92aWRlcyB0aGUgcHJvcGVydHkgZm9yIGJpbmRpbmcsCiAgICAgICAgICAgKiBhbmQgZG9lcyBub3QgbWFrZSB0aGUgcHJvcGFnYXRpb24gYWxvbmUuCiAgICAgICAgICAgKgogICAgICAgICAgICogU2VlIFtUaGVtZSBBdHRyaWJ1dGUgYW5kIFN1YmNvbXBvbmVudHNdKGh0dHBzOi8vZ2l0aHViLmNvbS92YWFkaW4vdmFhZGluLXRoZW1hYmxlLW1peGluL3dpa2kvNS4tVGhlbWUtQXR0cmlidXRlLWFuZC1TdWJjb21wb25lbnRzKS4KICAgICAgICAgICAqIHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgKgogICAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAgICovCiAgICAgICAgICB0aGVtZTogewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIHJlYWRPbmx5OiB0cnVlCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqIEBwcm90ZWN0ZWQgKi8KICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgewogICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwoKICAgICAgICBpZiAobmFtZSA9PT0gJ3RoZW1lJykgewogICAgICAgICAgdGhpcy5fc2V0VGhlbWUobmV3VmFsdWUpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqIEBtaXhlcyBUaGVtZVByb3BlcnR5TWl4aW4KICAgICAqLwogICAgY29uc3QgVGhlbWFibGVNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgVmFhZGluVGhlbWFibGVNaXhpbiBleHRlbmRzIFRoZW1lUHJvcGVydHlNaXhpbihzdXBlckNsYXNzKSB7CgogICAgICAvKiogQHByb3RlY3RlZCAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKCiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLnByb3RvdHlwZS5fdGVtcGxhdGU7CgogICAgICAgIGNvbnN0IGhhc093blRlbXBsYXRlID0gdGhpcy50ZW1wbGF0ZSAmJiB0aGlzLnRlbXBsYXRlLnBhcmVudEVsZW1lbnQgJiYgdGhpcy50ZW1wbGF0ZS5wYXJlbnRFbGVtZW50LmlkID09PSB0aGlzLmlzOwogICAgICAgIGNvbnN0IGluaGVyaXRlZFRlbXBsYXRlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMucHJvdG90eXBlKS5fdGVtcGxhdGU7CiAgICAgICAgaWYgKGluaGVyaXRlZFRlbXBsYXRlICYmICFoYXNPd25UZW1wbGF0ZSkgewogICAgICAgICAgLy8gVGhlIGVsZW1lbnQgZG9lc24ndCBkZWZpbmUgaXRzIG93biB0ZW1wbGF0ZSAtPiBpbmNsdWRlIHRoZSB0aGVtZSBtb2R1bGVzIGZyb20gdGhlIGluaGVyaXRlZCB0ZW1wbGF0ZQogICAgICAgICAgQXJyYXkuZnJvbShpbmhlcml0ZWRUZW1wbGF0ZS5jb250ZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlW2luY2x1ZGVdJykpLmZvckVhY2gocyA9PiB7CiAgICAgICAgICAgIHRoaXMuX2luY2x1ZGVTdHlsZShzLmdldEF0dHJpYnV0ZSgnaW5jbHVkZScpLCB0ZW1wbGF0ZSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2luY2x1ZGVNYXRjaGluZ1RoZW1lcyh0ZW1wbGF0ZSk7CiAgICAgIH0KCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBzdGF0aWMgX2luY2x1ZGVNYXRjaGluZ1RoZW1lcyh0ZW1wbGF0ZSkgewogICAgICAgIGNvbnN0IGRvbU1vZHVsZSA9IERvbU1vZHVsZTsKICAgICAgICBjb25zdCBtb2R1bGVzID0gZG9tTW9kdWxlLnByb3RvdHlwZS5tb2R1bGVzOwoKICAgICAgICBsZXQgaGFzVGhlbWVzID0gZmFsc2U7CiAgICAgICAgY29uc3QgZGVmYXVsdE1vZHVsZU5hbWUgPSB0aGlzLmlzICsgJy1kZWZhdWx0LXRoZW1lJzsKCiAgICAgICAgT2JqZWN0LmtleXMobW9kdWxlcykKICAgICAgICAgIC5zb3J0KChtb2R1bGVOYW1lQSwgbW9kdWxlTmFtZUIpID0+IHsKICAgICAgICAgICAgY29uc3QgdmFhZGluQSA9IG1vZHVsZU5hbWVBLmluZGV4T2YoJ3ZhYWRpbi0nKSA9PT0gMDsKICAgICAgICAgICAgY29uc3QgdmFhZGluQiA9IG1vZHVsZU5hbWVCLmluZGV4T2YoJ3ZhYWRpbi0nKSA9PT0gMDsKCiAgICAgICAgICAgIGNvbnN0IHZhYWRpblRoZW1lUHJlZml4ZXMgPSBbJ2x1bW8tJywgJ21hdGVyaWFsLSddOwogICAgICAgICAgICBjb25zdCB2YWFkaW5UaGVtZUEgPSB2YWFkaW5UaGVtZVByZWZpeGVzLmZpbHRlcihwcmVmaXggPT4gbW9kdWxlTmFtZUEuaW5kZXhPZihwcmVmaXgpID09PSAwKS5sZW5ndGggPiAwOwogICAgICAgICAgICBjb25zdCB2YWFkaW5UaGVtZUIgPSB2YWFkaW5UaGVtZVByZWZpeGVzLmZpbHRlcihwcmVmaXggPT4gbW9kdWxlTmFtZUIuaW5kZXhPZihwcmVmaXgpID09PSAwKS5sZW5ndGggPiAwOwoKICAgICAgICAgICAgaWYgKHZhYWRpbkEgIT09IHZhYWRpbkIpIHsKICAgICAgICAgICAgICAvLyBJbmNsdWRlIHZhYWRpbiBjb3JlIHN0eWxlcyBmaXJzdAogICAgICAgICAgICAgIHJldHVybiB2YWFkaW5BID8gLTEgOiAxOwogICAgICAgICAgICB9IGVsc2UgaWYgKHZhYWRpblRoZW1lQSAhPT0gdmFhZGluVGhlbWVCKSB7CiAgICAgICAgICAgICAgLy8gSW5jbHVkZSB2YWFkaW4gdGhlbWUgc3R5bGVzIGFmdGVyIHRoYXQKICAgICAgICAgICAgICByZXR1cm4gdmFhZGluVGhlbWVBID8gLTEgOiAxOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIExhc3RseSBpbmNsdWRlIGN1c3RvbSBzdHlsZXMgc28gdGhleSBvdmVycmlkZSBhbGwgdmFhZGluIHN0eWxlcwogICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICB9KQogICAgICAgICAgLmZvckVhY2gobW9kdWxlTmFtZSA9PiB7CiAgICAgICAgICAgIGlmIChtb2R1bGVOYW1lICE9PSBkZWZhdWx0TW9kdWxlTmFtZSkgewogICAgICAgICAgICAgIGNvbnN0IHRoZW1lRm9yID0gbW9kdWxlc1ttb2R1bGVOYW1lXS5nZXRBdHRyaWJ1dGUoJ3RoZW1lLWZvcicpOwogICAgICAgICAgICAgIGlmICh0aGVtZUZvcikgewogICAgICAgICAgICAgICAgdGhlbWVGb3Iuc3BsaXQoJyAnKS5mb3JFYWNoKHRoZW1lRm9yVG9rZW4gPT4gewogICAgICAgICAgICAgICAgICBpZiAobmV3IFJlZ0V4cCgnXicgKyB0aGVtZUZvclRva2VuLnNwbGl0KCcqJykuam9pbignLionKSArICckJykudGVzdCh0aGlzLmlzKSkgewogICAgICAgICAgICAgICAgICAgIGhhc1RoZW1lcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5jbHVkZVN0eWxlKG1vZHVsZU5hbWUsIHRlbXBsYXRlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKCiAgICAgICAgaWYgKCFoYXNUaGVtZXMgJiYgbW9kdWxlc1tkZWZhdWx0TW9kdWxlTmFtZV0pIHsKICAgICAgICAgIC8vIE5vIHRoZW1lIG1vZHVsZXMgZm91bmQsIGluY2x1ZGUgdGhlIGRlZmF1bHQgbW9kdWxlIGlmIGl0IGV4aXN0cwogICAgICAgICAgdGhpcy5faW5jbHVkZVN0eWxlKGRlZmF1bHRNb2R1bGVOYW1lLCB0ZW1wbGF0ZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiogQHByaXZhdGUgKi8KICAgICAgc3RhdGljIF9pbmNsdWRlU3R5bGUobW9kdWxlTmFtZSwgdGVtcGxhdGUpIHsKICAgICAgICBpZiAodGVtcGxhdGUgJiYgIXRlbXBsYXRlLmNvbnRlbnQucXVlcnlTZWxlY3Rvcihgc3R5bGVbaW5jbHVkZT0iJHttb2R1bGVOYW1lfSJdYCkpIHsKICAgICAgICAgIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgc3R5bGVFbC5zZXRBdHRyaWJ1dGUoJ2luY2x1ZGUnLCBtb2R1bGVOYW1lKTsKICAgICAgICAgIHRlbXBsYXRlLmNvbnRlbnQuYXBwZW5kQ2hpbGQoc3R5bGVFbCk7CiAgICAgICAgfQogICAgICB9CgogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIEEgcHJpdmF0ZSBtaXhpbiB0byBhdm9pZCBwcm9ibGVtcyB3aXRoIGR5bmFtaWMgcHJvcGVydGllcyBhbmQgUG9seW1lciBBbmFseXplci4KICAgICAqIE5vIG5lZWQgdG8gZXhwb3NlIHRoZXNlIHByb3BlcnRpZXMgaW4gdGhlIEFQSSBkb2NzLgogICAgICogQHBvbHltZXJNaXhpbgogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY29uc3QgVGFiSW5kZXhNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgVmFhZGluVGFiSW5kZXhNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgewogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgdmFyIHByb3BlcnRpZXMgPSB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIEludGVybmFsIHByb3BlcnR5IG5lZWRlZCB0byBsaXN0ZW4gdG8gYHRhYmluZGV4YCBhdHRyaWJ1dGUgY2hhbmdlcy4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBGb3IgY2hhbmdpbmcgdGhlIHRhYmluZGV4IG9mIHRoaXMgY29tcG9uZW50IHVzZSB0aGUgbmF0aXZlIGB0YWJJbmRleGAgcHJvcGVydHkuCiAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICovCiAgICAgICAgICB0YWJpbmRleDogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIHZhbHVlOiAwLAogICAgICAgICAgICByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWUsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX3RhYmluZGV4Q2hhbmdlZCcKICAgICAgICAgIH0KICAgICAgICB9OwoKICAgICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgICAvLyBTaGFkeURPTSBicm93c2VycyBuZWVkIHRoZSBgdGFiSW5kZXhgIGluIG9yZGVyIHRvIG5vdGlmeSB3aGVuIHRoZSB1c2VyIGNoYW5nZXMgaXQgcHJvZ3JhbW1hdGljYWxseS4KICAgICAgICAgIHByb3BlcnRpZXNbJ3RhYkluZGV4J10gPSBwcm9wZXJ0aWVzLnRhYmluZGV4OwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHByb3BlcnRpZXM7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBQb2x5bWVyLklyb25Db250cm9sU3RhdGUgaXMgbm90IGEgcHJvcGVyIDIuMCBjbGFzcywgYWxzbywgaXRzIHRhYmluZGV4CiAgICAgKiBpbXBsZW1lbnRhdGlvbiBmYWlscyBpbiB0aGUgc2hhZG93IGRvbSwgc28gd2UgaGF2ZSB0aGlzIGZvciB2YWFkaW4gZWxlbWVudHMuCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IENvbnRyb2xTdGF0ZU1peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBWYWFkaW5Db250cm9sU3RhdGVNaXhpbiBleHRlbmRzIFRhYkluZGV4TWl4aW4oc3VwZXJDbGFzcykgewogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogU3BlY2lmeSB0aGF0IHRoaXMgY29udHJvbCBzaG91bGQgaGF2ZSBpbnB1dCBmb2N1cyB3aGVuIHRoZSBwYWdlIGxvYWRzLgogICAgICAgICAgICovCiAgICAgICAgICBhdXRvZm9jdXM6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFN0b3JlcyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgdGFiaW5kZXggYXR0cmlidXRlIG9mIHRoZSBkaXNhYmxlZCBlbGVtZW50CiAgICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAgICovCiAgICAgICAgICBfcHJldmlvdXNUYWJJbmRleDogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJZiB0cnVlLCB0aGUgdXNlciBjYW5ub3QgaW50ZXJhY3Qgd2l0aCB0aGlzIGVsZW1lbnQuCiAgICAgICAgICAgKi8KICAgICAgICAgIGRpc2FibGVkOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG9ic2VydmVyOiAnX2Rpc2FibGVkQ2hhbmdlZCcsCiAgICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgKi8KICAgICAgICAgIF9pc1NoaWZ0VGFiYmluZzogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIHJlYWR5KCkgewogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIGUgPT4gewogICAgICAgICAgaWYgKGUuY29tcG9zZWRQYXRoKClbMF0gPT09IHRoaXMpIHsKICAgICAgICAgICAgLy8gT25seSBmb2N1cyBpZiB0aGUgZm9jdXMgaXMgcmVjZWl2ZWQgZnJvbSBzb21ld2hlcmUgb3V0c2lkZQogICAgICAgICAgICBpZiAoIXRoaXMuY29udGFpbnMoZS5yZWxhdGVkVGFyZ2V0KSkgewogICAgICAgICAgICAgIHRoaXMuX2ZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoZS5jb21wb3NlZFBhdGgoKS5pbmRleE9mKHRoaXMuZm9jdXNFbGVtZW50KSAhPT0gLTEgJiYgIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fc2V0Rm9jdXNlZCh0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgZSA9PiB0aGlzLl9zZXRGb2N1c2VkKGZhbHNlKSk7CgogICAgICAgIC8vIEluIHN1cGVyLnJlYWR5KCkgb3RoZXIgJ2ZvY3VzaW4nIGFuZCAnZm9jdXNvdXQnIGxpc3RlbmVycyBtaWdodCBiZQogICAgICAgIC8vIGFkZGVkLCBzbyB3ZSBjYWxsIGl0IGFmdGVyIG91ciBvd24gb25lcyB0byBlbnN1cmUgdGhleSBleGVjdXRlIGZpcnN0LgogICAgICAgIC8vIElzc3VlIHRvIHdhdGNoIG91dDogd2hlbiBpbmNvcnJlY3QsIDx2YWFkaW4tY29tYm8tYm94PiByZWZvY3VzZXMgdGhlCiAgICAgICAgLy8gaW5wdXQgZmllbGQgb24gaU9TIGFmdGVyIOKAnERvbmXigJ0gaXMgcHJlc3NlZC4KICAgICAgICBzdXBlci5yZWFkeSgpOwoKICAgICAgICAvLyBUaGlzIGZpeGVzIHRoZSBidWcgaW4gRmlyZWZveCA2MSAoaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTQ3Mjg4NykKICAgICAgICAvLyB3aGVyZSBmb2N1c291dCBldmVudCBkb2VzIG5vdCBnbyBvdXQgb2Ygc2hhZHkgRE9NIGJlY2F1c2UgY29tcG9zZWQgcHJvcGVydHkgaW4gdGhlIGV2ZW50IGlzIG5vdCB0cnVlCiAgICAgICAgY29uc3QgZW5zdXJlRXZlbnRDb21wb3NlZCA9IGUgPT4gewogICAgICAgICAgaWYgKCFlLmNvbXBvc2VkKSB7CiAgICAgICAgICAgIGUudGFyZ2V0LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KGUudHlwZSwgewogICAgICAgICAgICAgIGJ1YmJsZXM6IHRydWUsCiAgICAgICAgICAgICAgY29tcG9zZWQ6IHRydWUsCiAgICAgICAgICAgICAgY2FuY2VsYWJsZTogZmFsc2UKICAgICAgICAgICAgfSkpOwogICAgICAgICAgfQogICAgICAgIH07CiAgICAgICAgdGhpcy5zaGFkb3dSb290LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCBlbnN1cmVFdmVudENvbXBvc2VkKTsKICAgICAgICB0aGlzLnNoYWRvd1Jvb3QuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBlbnN1cmVFdmVudENvbXBvc2VkKTsKCiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgZSA9PiB7CiAgICAgICAgICBpZiAoIWUuZGVmYXVsdFByZXZlbnRlZCAmJiBlLmtleUNvZGUgPT09IDkpIHsKICAgICAgICAgICAgaWYgKGUuc2hpZnRLZXkpIHsKICAgICAgICAgICAgICAvLyBGbGFnIGlzIGNoZWNrZWQgaW4gX2ZvY3VzIGV2ZW50IGhhbmRsZXIuCiAgICAgICAgICAgICAgdGhpcy5faXNTaGlmdFRhYmJpbmcgPSB0cnVlOwogICAgICAgICAgICAgIEhUTUxFbGVtZW50LnByb3RvdHlwZS5mb2N1cy5hcHBseSh0aGlzKTsKICAgICAgICAgICAgICB0aGlzLl9zZXRGb2N1c2VkKGZhbHNlKTsKICAgICAgICAgICAgICAvLyBFdmVudCBoYW5kbGluZyBpbiBJRSBpcyBhc3luY2hyb25vdXMgYW5kIHRoZSBmbGFnIGlzIHJlbW92ZWQgYXN5bmNocm9ub3VzbHkgYXMgd2VsbAogICAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy5faXNTaGlmdFRhYmJpbmcgPSBmYWxzZSwgMCk7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gV29ya2Fyb3VuZCBmb3IgRkY2My02NSBidWcgdGhhdCBjYXVzZXMgdGhlIGZvY3VzIHRvIGdldCBsb3N0IHdoZW4KICAgICAgICAgICAgICAvLyBibHVycmluZyBhIHNsb3R0ZWQgY29tcG9uZW50IHdpdGggZm9jdXNhYmxlIHNoYWRvdyByb290IGNvbnRlbnQKICAgICAgICAgICAgICAvLyBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD0xNTI4Njg2CiAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHdoZW4gc2FmZQogICAgICAgICAgICAgIGNvbnN0IGZpcmVmb3ggPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvRmlyZWZveFwvKFxkXGRcLlxkKS8pOwogICAgICAgICAgICAgIGlmIChmaXJlZm94CiAgICAgICAgICAgICAgICAmJiBwYXJzZUZsb2F0KGZpcmVmb3hbMV0pID49IDYzCiAgICAgICAgICAgICAgICAmJiBwYXJzZUZsb2F0KGZpcmVmb3hbMV0pIDwgNjYKICAgICAgICAgICAgICAgICYmIHRoaXMucGFyZW50Tm9kZQogICAgICAgICAgICAgICAgJiYgdGhpcy5uZXh0U2libGluZykgewogICAgICAgICAgICAgICAgY29uc3QgZmFrZVRhcmdldCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICAgICAgICAgICAgICBmYWtlVGFyZ2V0LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKICAgICAgICAgICAgICAgIGZha2VUYXJnZXQuc3R5bGUub3BhY2l0eSA9ICcwJzsKICAgICAgICAgICAgICAgIGZha2VUYXJnZXQudGFiSW5kZXggPSB0aGlzLnRhYkluZGV4OwoKICAgICAgICAgICAgICAgIHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZmFrZVRhcmdldCwgdGhpcy5uZXh0U2libGluZyk7CiAgICAgICAgICAgICAgICBmYWtlVGFyZ2V0LmZvY3VzKCk7CiAgICAgICAgICAgICAgICBmYWtlVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgKCkgPT4gdGhpcy5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGZha2VUYXJnZXQpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIGlmICh0aGlzLmF1dG9mb2N1cyAmJiAhdGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzKCk7CiAgICAgICAgICAgIHRoaXMuX3NldEZvY3VzZWQodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdmb2N1cy1yaW5nJywgJycpOwogICAgICAgICAgfSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9ib3VuZEtleWRvd25MaXN0ZW5lciA9IHRoaXMuX2JvZHlLZXlkb3duTGlzdGVuZXIuYmluZCh0aGlzKTsKICAgICAgICB0aGlzLl9ib3VuZEtleXVwTGlzdGVuZXIgPSB0aGlzLl9ib2R5S2V5dXBMaXN0ZW5lci5iaW5kKHRoaXMpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKCiAgICAgICAgZG9jdW1lbnQuYm9keS5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fYm91bmRLZXlkb3duTGlzdGVuZXIsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmJvZHkuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9ib3VuZEtleXVwTGlzdGVuZXIsIHRydWUpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKCiAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fYm91bmRLZXlkb3duTGlzdGVuZXIsIHRydWUpOwogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9ib3VuZEtleXVwTGlzdGVuZXIsIHRydWUpOwoKICAgICAgICAvLyBpbiBub24tQ2hyb21lIGJyb3dzZXJzLCBibHVyIGRvZXMgbm90IGZpcmUgb24gdGhlIGVsZW1lbnQgd2hlbiBpdCBpcyBkaXNjb25uZWN0ZWQuCiAgICAgICAgLy8gcmVwcm9kdWNpYmxlIGluIGA8dmFhZGluLWRhdGUtcGlja2VyPmAgd2hlbiBjbG9zaW5nIG9uIGBDYW5jZWxgIG9yIGBUb2RheWAgY2xpY2suCiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdmb2N1c2VkJykpIHsKICAgICAgICAgIHRoaXMuX3NldEZvY3VzZWQoZmFsc2UpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7Ym9vbGVhbn0gZm9jdXNlZAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfc2V0Rm9jdXNlZChmb2N1c2VkKSB7CiAgICAgICAgaWYgKGZvY3VzZWQpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdmb2N1c2VkJywgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZm9jdXNlZCcpOwogICAgICAgIH0KCiAgICAgICAgLy8gZm9jdXMtcmluZyBpcyB0cnVlIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGZvY3VzZWQgZnJvbSB0aGUga2V5Ym9hcmQuCiAgICAgICAgLy8gRm9jdXMgUmluZyBbQTExeWNhc3RzXTogaHR0cHM6Ly95b3V0dS5iZS9pbGoyUDUtNUNqSQogICAgICAgIGlmIChmb2N1c2VkICYmIHRoaXMuX3RhYlByZXNzZWQpIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdmb2N1cy1yaW5nJywgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZm9jdXMtcmluZycpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7S2V5Ym9hcmRFdmVudH0gZQogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX2JvZHlLZXlkb3duTGlzdGVuZXIoZSkgewogICAgICAgIHRoaXMuX3RhYlByZXNzZWQgPSBlLmtleUNvZGUgPT09IDk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX2JvZHlLZXl1cExpc3RlbmVyKCkgewogICAgICAgIHRoaXMuX3RhYlByZXNzZWQgPSBmYWxzZTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFueSBlbGVtZW50IGV4dGVuZGluZyB0aGlzIG1peGluIGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCB0aGlzIGdldHRlci4KICAgICAgICogSXQgcmV0dXJucyB0aGUgYWN0dWFsIGZvY3VzYWJsZSBlbGVtZW50IGluIHRoZSBjb21wb25lbnQuCiAgICAgICAqIEByZXR1cm4ge0VsZW1lbnQgfCBudWxsIHwgdW5kZWZpbmVkfQogICAgICAgKi8KICAgICAgZ2V0IGZvY3VzRWxlbWVudCgpIHsKICAgICAgICB3aW5kb3cuY29uc29sZS53YXJuKGBQbGVhc2UgaW1wbGVtZW50IHRoZSAnZm9jdXNFbGVtZW50JyBwcm9wZXJ0eSBpbiA8JHt0aGlzLmxvY2FsTmFtZX0+YCk7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfZm9jdXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmZvY3VzRWxlbWVudCB8fCB0aGlzLl9pc1NoaWZ0VGFiYmluZykgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5mb2N1c0VsZW1lbnQuZm9jdXMoKTsKICAgICAgICB0aGlzLl9zZXRGb2N1c2VkKHRydWUpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogTW92aW5nIHRoZSBmb2N1cyBmcm9tIHRoZSBob3N0IGVsZW1lbnQgY2F1c2VzIGZpcmluZyBvZiB0aGUgYmx1ciBldmVudCB3aGF0IGxlYWRzIHRvIHByb2JsZW1zIGluIElFLgogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgZm9jdXMoKSB7CiAgICAgICAgaWYgKCF0aGlzLmZvY3VzRWxlbWVudCB8fCB0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aGlzLmZvY3VzRWxlbWVudC5mb2N1cygpOwogICAgICAgIHRoaXMuX3NldEZvY3VzZWQodHJ1ZSk7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBOYXRpdmUgYmx1cmluZyBpbiB0aGUgaG9zdCBlbGVtZW50IGRvZXMgbm90aGluZyBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgdGhlIGZvY3VzLgogICAgICAgKiBJbiBjaHJvbWUgaXQgd29ya3MsIGJ1dCBub3QgaW4gRkYuCiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBibHVyKCkgewogICAgICAgIGlmICghdGhpcy5mb2N1c0VsZW1lbnQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgdGhpcy5mb2N1c0VsZW1lbnQuYmx1cigpOwogICAgICAgIHRoaXMuX3NldEZvY3VzZWQoZmFsc2UpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHBhcmFtIHtib29sZWFufSBkaXNhYmxlZAogICAgICAgKiBAcHJpdmF0ZQogICAgICAgKi8KICAgICAgX2Rpc2FibGVkQ2hhbmdlZChkaXNhYmxlZCkgewogICAgICAgIHRoaXMuZm9jdXNFbGVtZW50LmRpc2FibGVkID0gZGlzYWJsZWQ7CiAgICAgICAgaWYgKGRpc2FibGVkKSB7CiAgICAgICAgICB0aGlzLmJsdXIoKTsKICAgICAgICAgIHRoaXMuX3ByZXZpb3VzVGFiSW5kZXggPSB0aGlzLnRhYmluZGV4OwogICAgICAgICAgdGhpcy50YWJpbmRleCA9IC0xOwogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnLCAndHJ1ZScpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3ByZXZpb3VzVGFiSW5kZXggIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIHRoaXMudGFiaW5kZXggPSB0aGlzLl9wcmV2aW91c1RhYkluZGV4OwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2FyaWEtZGlzYWJsZWQnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBAcGFyYW0ge251bWJlciB8IG51bGwgfCB1bmRlZmluZWR9IHRhYmluZGV4CiAgICAgICAqIEBwcml2YXRlCiAgICAgICAqLwogICAgICBfdGFiaW5kZXhDaGFuZ2VkKHRhYmluZGV4KSB7CiAgICAgICAgaWYgKHRhYmluZGV4ICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHRoaXMuZm9jdXNFbGVtZW50LnRhYkluZGV4ID0gdGFiaW5kZXg7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCAmJiB0aGlzLnRhYmluZGV4KSB7CiAgICAgICAgICAvLyBJZiB0YWJpbmRleCBhdHRyaWJ1dGUgd2FzIGNoYW5nZWQgd2hpbGUgY2hlY2tib3ggd2FzIGRpc2FibGVkCiAgICAgICAgICBpZiAodGhpcy50YWJpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNUYWJJbmRleCA9IHRoaXMudGFiaW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLnRhYmluZGV4ID0gdGFiaW5kZXggPSB1bmRlZmluZWQ7CiAgICAgICAgfQoKICAgICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgICB0aGlzLnNldFByb3BlcnRpZXMoe3RhYkluZGV4OiB0YWJpbmRleCwgdGFiaW5kZXg6IHRhYmluZGV4fSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogQHByb3RlY3RlZAogICAgICAgKi8KICAgICAgY2xpY2soKSB7CiAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICBzdXBlci5jbGljaygpOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMjAgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIEhlbHBlciB0aGF0IHByb3ZpZGVzIGEgc2V0IG9mIGZ1bmN0aW9ucyBmb3IgUlRMLgogICAgICovCiAgICBjbGFzcyBEaXJIZWxwZXIgewogICAgICAvKioKICAgICAgICogR2V0IHRoZSBzY3JvbGwgdHlwZSBpbiB0aGUgY3VycmVudCBicm93c2VyIHZpZXcuCiAgICAgICAqCiAgICAgICAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHNjcm9sbCB0eXBlLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIGBkZWZhdWx0fHJldmVyc2V8bmVnYXRpdmVgCiAgICAgICAqLwogICAgICBzdGF0aWMgZGV0ZWN0U2Nyb2xsVHlwZSgpIHsKICAgICAgICBjb25zdCBkdW1teSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgIGR1bW15LnRleHRDb250ZW50ID0gJ0FCQ0QnOwogICAgICAgIGR1bW15LmRpciA9ICdydGwnOwogICAgICAgIGR1bW15LnN0eWxlLmZvbnRTaXplID0gJzE0cHgnOwogICAgICAgIGR1bW15LnN0eWxlLndpZHRoID0gJzRweCc7CiAgICAgICAgZHVtbXkuc3R5bGUuaGVpZ2h0ID0gJzFweCc7CiAgICAgICAgZHVtbXkuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgIGR1bW15LnN0eWxlLnRvcCA9ICctMTAwMHB4JzsKICAgICAgICBkdW1teS5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnOwogICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoZHVtbXkpOwoKICAgICAgICBsZXQgY2FjaGVkVHlwZSA9ICdyZXZlcnNlJzsKICAgICAgICBpZiAoZHVtbXkuc2Nyb2xsTGVmdCA+IDApIHsKICAgICAgICAgIGNhY2hlZFR5cGUgPSAnZGVmYXVsdCc7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGR1bW15LnNjcm9sbExlZnQgPSAxOwogICAgICAgICAgaWYgKGR1bW15LnNjcm9sbExlZnQgPT09IDApIHsKICAgICAgICAgICAgY2FjaGVkVHlwZSA9ICduZWdhdGl2ZSc7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGRvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQoZHVtbXkpOwogICAgICAgIHJldHVybiBjYWNoZWRUeXBlOwogICAgICB9CgogICAgICAvKioKICAgICAgICogR2V0IHRoZSBzY3JvbGxMZWZ0IHZhbHVlIG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rpb24KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNjcm9sbFR5cGUgdHlwZSBvZiB0aGUgc2Nyb2xsIGRldGVjdGVkIHdpdGggYGRldGVjdFNjcm9sbFR5cGVgCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkaXJlY3Rpb24gY3VycmVudCBkaXJlY3Rpb24gb2YgdGhlIGVsZW1lbnQKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAgICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIHNjcm9sbExlZnQgdmFsdWUuCiAgICAgICovCiAgICAgIHN0YXRpYyBnZXROb3JtYWxpemVkU2Nyb2xsTGVmdChzY3JvbGxUeXBlLCBkaXJlY3Rpb24sIGVsZW1lbnQpIHsKICAgICAgICBjb25zdCB7c2Nyb2xsTGVmdH0gPSBlbGVtZW50OwogICAgICAgIGlmIChkaXJlY3Rpb24gIT09ICdydGwnIHx8ICFzY3JvbGxUeXBlKSB7CiAgICAgICAgICByZXR1cm4gc2Nyb2xsTGVmdDsKICAgICAgICB9CgogICAgICAgIHN3aXRjaCAoc2Nyb2xsVHlwZSkgewogICAgICAgICAgY2FzZSAnbmVnYXRpdmUnOgogICAgICAgICAgICByZXR1cm4gZWxlbWVudC5zY3JvbGxXaWR0aCAtIGVsZW1lbnQuY2xpZW50V2lkdGggKyBzY3JvbGxMZWZ0OwogICAgICAgICAgY2FzZSAncmV2ZXJzZSc6CiAgICAgICAgICAgIHJldHVybiBlbGVtZW50LnNjcm9sbFdpZHRoIC0gZWxlbWVudC5jbGllbnRXaWR0aCAtIHNjcm9sbExlZnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzY3JvbGxMZWZ0OwogICAgICB9CgogICAgICAvKioKICAgICAgICogU2V0IHRoZSBzY3JvbGxMZWZ0IHZhbHVlIG9mIHRoZSBlbGVtZW50IHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rpb24KICAgICAgICoKICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHNjcm9sbFR5cGUgdHlwZSBvZiB0aGUgc2Nyb2xsIGRldGVjdGVkIHdpdGggYGRldGVjdFNjcm9sbFR5cGVgCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkaXJlY3Rpb24gY3VycmVudCBkaXJlY3Rpb24gb2YgdGhlIGVsZW1lbnQKICAgICAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50CiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzY3JvbGxMZWZ0IHRoZSBzY3JvbGxMZWZ0IHZhbHVlIHRvIGJlIHNldAogICAgICAgKi8KICAgICAgc3RhdGljIHNldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHNjcm9sbFR5cGUsIGRpcmVjdGlvbiwgZWxlbWVudCwgc2Nyb2xsTGVmdCkgewogICAgICAgIGlmIChkaXJlY3Rpb24gIT09ICdydGwnIHx8ICFzY3JvbGxUeXBlKSB7CiAgICAgICAgICBlbGVtZW50LnNjcm9sbExlZnQgPSBzY3JvbGxMZWZ0OwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoIChzY3JvbGxUeXBlKSB7CiAgICAgICAgICBjYXNlICduZWdhdGl2ZSc6CiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsTGVmdCA9IGVsZW1lbnQuY2xpZW50V2lkdGggLSBlbGVtZW50LnNjcm9sbFdpZHRoICsgc2Nyb2xsTGVmdDsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdyZXZlcnNlJzoKICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxMZWZ0ID0gZWxlbWVudC5zY3JvbGxXaWR0aCAtIGVsZW1lbnQuY2xpZW50V2lkdGggLSBzY3JvbGxMZWZ0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsTGVmdCA9IHNjcm9sbExlZnQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQXJyYXkgb2YgVmFhZGluIGN1c3RvbSBlbGVtZW50IGNsYXNzZXMgdGhhdCBoYXZlIGJlZW4gc3Vic2NyaWJlZCB0byB0aGUgZGlyIGNoYW5nZXMuCiAgICAgKi8KICAgIGNvbnN0IGRpcmVjdGlvblN1YnNjcmliZXJzID0gW107CiAgICBjb25zdCBkaXJlY3Rpb25VcGRhdGVyID0gZnVuY3Rpb24oKSB7CiAgICAgIGNvbnN0IGRvY3VtZW50RGlyID0gZ2V0RG9jdW1lbnREaXIoKTsKICAgICAgZGlyZWN0aW9uU3Vic2NyaWJlcnMuZm9yRWFjaChlbGVtZW50ID0+IHsKICAgICAgICBhbGlnbkRpcnMoZWxlbWVudCwgZG9jdW1lbnREaXIpOwogICAgICB9KTsKICAgIH07CgogICAgbGV0IHNjcm9sbFR5cGU7CgogICAgY29uc3QgZGlyZWN0aW9uT2JzZXJ2ZXIgPSBuZXcgTXV0YXRpb25PYnNlcnZlcihkaXJlY3Rpb25VcGRhdGVyKTsKICAgIGRpcmVjdGlvbk9ic2VydmVyLm9ic2VydmUoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LCB7YXR0cmlidXRlczogdHJ1ZSwgYXR0cmlidXRlRmlsdGVyOiBbJ2RpciddfSk7CgogICAgY29uc3QgYWxpZ25EaXJzID0gZnVuY3Rpb24oZWxlbWVudCwgZG9jdW1lbnREaXIpIHsKICAgICAgaWYgKGRvY3VtZW50RGlyKSB7CiAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RpcicsIGRvY3VtZW50RGlyKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZSgnZGlyJyk7CiAgICAgIH0KICAgIH07CgogICAgY29uc3QgZ2V0RG9jdW1lbnREaXIgPSBmdW5jdGlvbigpIHsKICAgICAgcmV0dXJuIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RpcicpOwogICAgfTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgRGlyTWl4aW4kMSA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgVmFhZGluRGlyTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgICAqLwogICAgICAgICAgZGlyOiB7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICAvKiogQHByb3RlY3RlZCAqLwogICAgICBzdGF0aWMgZmluYWxpemUoKSB7CiAgICAgICAgc3VwZXIuZmluYWxpemUoKTsKCiAgICAgICAgaWYgKCFzY3JvbGxUeXBlKSB7CiAgICAgICAgICBzY3JvbGxUeXBlID0gRGlySGVscGVyLmRldGVjdFNjcm9sbFR5cGUoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKiBAcHJvdGVjdGVkICovCiAgICAgIGNvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CgogICAgICAgIGlmICghdGhpcy5oYXNBdHRyaWJ1dGUoJ2RpcicpKSB7CiAgICAgICAgICB0aGlzLl9fc3Vic2NyaWJlKCk7CiAgICAgICAgICBhbGlnbkRpcnModGhpcywgZ2V0RG9jdW1lbnREaXIoKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKiogQHByb3RlY3RlZCAqLwogICAgICBhdHRyaWJ1dGVDaGFuZ2VkQ2FsbGJhY2sobmFtZSwgb2xkVmFsdWUsIG5ld1ZhbHVlKSB7CiAgICAgICAgc3VwZXIuYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSk7CiAgICAgICAgaWYgKG5hbWUgIT09ICdkaXInKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBOZXcgdmFsdWUgZXF1YWxzIHRvIHRoZSBkb2N1bWVudCBkaXJlY3Rpb24gYW5kIHRoZSBlbGVtZW50IGlzIG5vdCBzdWJzY3JpYmVkIHRvIHRoZSBjaGFuZ2VzCiAgICAgICAgY29uc3QgbmV3VmFsdWVFcWxEb2NEaXIgPSBuZXdWYWx1ZSA9PT0gZ2V0RG9jdW1lbnREaXIoKSAmJiBkaXJlY3Rpb25TdWJzY3JpYmVycy5pbmRleE9mKHRoaXMpID09PSAtMTsKICAgICAgICAvLyBWYWx1ZSB3YXMgZW1wdGllZCBhbmQgdGhlIGVsZW1lbnQgaXMgbm90IHN1YnNjcmliZWQgdG8gdGhlIGNoYW5nZXMKICAgICAgICBjb25zdCBuZXdWYWx1ZUVtcHRpZWQgPSAhbmV3VmFsdWUgJiYgb2xkVmFsdWUgJiYgZGlyZWN0aW9uU3Vic2NyaWJlcnMuaW5kZXhPZih0aGlzKSA9PT0gLTE7CiAgICAgICAgLy8gTmV3IHZhbHVlIGlzIGRpZmZlcmVudCBhbmQgdGhlIG9sZCBlcXVhbHMgdG8gZG9jdW1lbnQgZGlyZWN0aW9uIGFuZCB0aGUgZWxlbWVudCBpcyBub3Qgc3Vic2NyaWJlZCB0byB0aGUgY2hhbmdlcwogICAgICAgIGNvbnN0IG5ld0RpZmZWYWx1ZSA9IG5ld1ZhbHVlICE9PSBnZXREb2N1bWVudERpcigpICYmIG9sZFZhbHVlID09PSBnZXREb2N1bWVudERpcigpOwoKICAgICAgICBpZiAobmV3VmFsdWVFcWxEb2NEaXIgfHwgbmV3VmFsdWVFbXB0aWVkKSB7CiAgICAgICAgICB0aGlzLl9fc3Vic2NyaWJlKCk7CiAgICAgICAgICBhbGlnbkRpcnModGhpcywgZ2V0RG9jdW1lbnREaXIoKSk7CiAgICAgICAgfSBlbHNlIGlmIChuZXdEaWZmVmFsdWUpIHsKICAgICAgICAgIHRoaXMuX19zdWJzY3JpYmUoZmFsc2UpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqIEBwcm90ZWN0ZWQgKi8KICAgICAgZGlzY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuZGlzY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICB0aGlzLl9fc3Vic2NyaWJlKGZhbHNlKTsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZSgnZGlyJyk7CiAgICAgIH0KCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBfX3N1YnNjcmliZShwdXNoID0gdHJ1ZSkgewogICAgICAgIGlmIChwdXNoKSB7CiAgICAgICAgICBkaXJlY3Rpb25TdWJzY3JpYmVycy5pbmRleE9mKHRoaXMpID09PSAtMSAmJgogICAgICAgICAgICBkaXJlY3Rpb25TdWJzY3JpYmVycy5wdXNoKHRoaXMpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBkaXJlY3Rpb25TdWJzY3JpYmVycy5pbmRleE9mKHRoaXMpID4gLTEgJiYKICAgICAgICAgICAgZGlyZWN0aW9uU3Vic2NyaWJlcnMuc3BsaWNlKGRpcmVjdGlvblN1YnNjcmliZXJzLmluZGV4T2YodGhpcyksIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAgICAgKiBAcmV0dXJuIHtudW1iZXJ9CiAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICovCiAgICAgIF9fZ2V0Tm9ybWFsaXplZFNjcm9sbExlZnQoZWxlbWVudCkgewogICAgICAgIHJldHVybiBEaXJIZWxwZXIuZ2V0Tm9ybWFsaXplZFNjcm9sbExlZnQoc2Nyb2xsVHlwZSwgdGhpcy5nZXRBdHRyaWJ1dGUoJ2RpcicpIHx8ICdsdHInLCBlbGVtZW50KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7RWxlbWVudH0gZWxlbWVudAogICAgICAgKiBAcGFyYW0ge251bWJlcn0gc2Nyb2xsTGVmdAogICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAqLwogICAgICBfX3NldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KGVsZW1lbnQsIHNjcm9sbExlZnQpIHsKICAgICAgICByZXR1cm4gRGlySGVscGVyLnNldE5vcm1hbGl6ZWRTY3JvbGxMZWZ0KHNjcm9sbFR5cGUsIHRoaXMuZ2V0QXR0cmlidXRlKCdkaXInKSB8fCAnbHRyJywgZWxlbWVudCwgc2Nyb2xsTGVmdCk7CiAgICAgIH0KICAgIH07CgogICAgY29uc3QgREVWX01PREVfQ09ERV9SRUdFWFAgPQogICAgICAvXC9cKlwqXHMrdmFhZGluLWRldi1tb2RlOnN0YXJ0KFtcc1xTXSopdmFhZGluLWRldi1tb2RlOmVuZFxzK1wqXCpcLy9pOwoKICAgIGNvbnN0IEZsb3dDbGllbnRzID0gd2luZG93LlZhYWRpbiAmJiB3aW5kb3cuVmFhZGluLkZsb3cgJiYgd2luZG93LlZhYWRpbi5GbG93LmNsaWVudHM7CgogICAgZnVuY3Rpb24gaXNNaW5pZmllZCgpIHsKICAgICAgZnVuY3Rpb24gdGVzdCgpIHsKICAgICAgICAvKiogdmFhZGluLWRldi1tb2RlOnN0YXJ0CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHZhYWRpbi1kZXYtbW9kZTplbmQgKiovCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KICAgICAgcmV0dXJuIHVuY29tbWVudEFuZFJ1bih0ZXN0KTsKICAgIH0KCiAgICBmdW5jdGlvbiBpc0RldmVsb3BtZW50TW9kZSgpIHsKICAgICAgdHJ5IHsKICAgICAgICBpZiAoaXNGb3JjZWREZXZlbG9wbWVudE1vZGUoKSkgewogICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQoKICAgICAgICBpZiAoIWlzTG9jYWxob3N0KCkpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIGlmIChGbG93Q2xpZW50cykgewogICAgICAgICAgcmV0dXJuICFpc0Zsb3dQcm9kdWN0aW9uTW9kZSgpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICFpc01pbmlmaWVkKCk7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAvLyBTb21lIGVycm9yIGluIHRoaXMgY29kZSwgYXNzdW1lIHByb2R1Y3Rpb24gc28gbm8gZnVydGhlciBhY3Rpb25zIHdpbGwgYmUgdGFrZW4KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpc0ZvcmNlZERldmVsb3BtZW50TW9kZSgpIHsKICAgICAgcmV0dXJuIGxvY2FsU3RvcmFnZS5nZXRJdGVtKCJ2YWFkaW4uZGV2ZWxvcG1lbnRtb2RlLmZvcmNlIik7CiAgICB9CgogICAgZnVuY3Rpb24gaXNMb2NhbGhvc3QoKSB7CiAgICAgIHJldHVybiAoWyJsb2NhbGhvc3QiLCIxMjcuMC4wLjEiXS5pbmRleE9mKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSkgPj0gMCk7CiAgICB9CgogICAgZnVuY3Rpb24gaXNGbG93UHJvZHVjdGlvbk1vZGUoKSB7CiAgICAgIGlmIChGbG93Q2xpZW50cykgewogICAgICAgIGNvbnN0IHByb2R1Y3Rpb25Nb2RlQXBwcyA9IE9iamVjdC5rZXlzKEZsb3dDbGllbnRzKQogICAgICAgICAgLm1hcChrZXkgPT4gRmxvd0NsaWVudHNba2V5XSkKICAgICAgICAgIC5maWx0ZXIoY2xpZW50ID0+IGNsaWVudC5wcm9kdWN0aW9uTW9kZSk7CiAgICAgICAgaWYgKHByb2R1Y3Rpb25Nb2RlQXBwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHVuY29tbWVudEFuZFJ1bihjYWxsYmFjaywgYXJncykgewogICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgcmV0dXJuOwogICAgICB9CgogICAgICBjb25zdCBtYXRjaCA9IERFVl9NT0RFX0NPREVfUkVHRVhQLmV4ZWMoY2FsbGJhY2sudG9TdHJpbmcoKSk7CiAgICAgIGlmIChtYXRjaCkgewogICAgICAgIHRyeSB7CiAgICAgICAgICAvLyByZXF1aXJlcyBDU1A6IHNjcmlwdC1zcmMgJ3Vuc2FmZS1ldmFsJwogICAgICAgICAgY2FsbGJhY2sgPSBuZXcgRnVuY3Rpb24obWF0Y2hbMV0pOwogICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgIC8vIGVhdCB0aGUgZXhjZXB0aW9uCiAgICAgICAgICBjb25zb2xlLmxvZygndmFhZGluLWRldmVsb3BtZW50LW1vZGUtZGV0ZWN0b3I6IHVuY29tbWVudEFuZFJ1bigpIGZhaWxlZCcsIGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIGNhbGxiYWNrKGFyZ3MpOwogICAgfQoKICAgIC8vIEEgZ3VhcmQgYWdhaW5zdCBwb2x5bWVyLW1vZHVsaXplciByZW1vdmluZyB0aGUgd2luZG93LlZhYWRpbgogICAgLy8gaW5pdGlhbGl6YXRpb24gYWJvdmUuCiAgICB3aW5kb3dbJ1ZhYWRpbiddID0gd2luZG93WydWYWFkaW4nXSB8fCB7fTsKCiAgICAvKioKICAgICAqIEluc3BlY3RzIHRoZSBzb3VyY2UgY29kZSBvZiB0aGUgZ2l2ZW4gYGNhbGxiYWNrYCBmdW5jdGlvbiBmb3IKICAgICAqIHNwZWNpYWxseS1tYXJrZWQgX2NvbW1lbnRlZF8gY29kZS4gSWYgc3VjaCBjb21tZW50ZWQgY29kZSBpcyBmb3VuZCBpbiB0aGUKICAgICAqIGNhbGxiYWNrIHNvdXJjZSwgdW5jb21tZW50cyBhbmQgcnVucyB0aGF0IGNvZGUgaW5zdGVhZCBvZiB0aGUgY2FsbGJhY2sKICAgICAqIGl0c2VsZi4gT3RoZXJ3aXNlIHJ1bnMgdGhlIGNhbGxiYWNrIGFzIGlzLgogICAgICoKICAgICAqIFRoZSBvcHRpb25hbCBhcmd1bWVudHMgYXJlIHBhc3NlZCBpbnRvIHRoZSBjYWxsYmFjayAvIHVuY29tbWVudGVkIGNvZGUsCiAgICAgKiB0aGUgcmVzdWx0IGlzIHJldHVybmVkLgogICAgICoKICAgICAqIFNlZSB0aGUgYGlzTWluaWZpZWQoKWAgZnVuY3Rpb24gc291cmNlIGNvZGUgaW4gdGhpcyBmaWxlIGZvciBhbiBleGFtcGxlLgogICAgICoKICAgICAqLwogICAgY29uc3QgcnVuSWZEZXZlbG9wbWVudE1vZGUgPSBmdW5jdGlvbihjYWxsYmFjaywgYXJncykgewogICAgICBpZiAod2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGUpIHsKICAgICAgICByZXR1cm4gdW5jb21tZW50QW5kUnVuKGNhbGxiYWNrLCBhcmdzKTsKICAgICAgfQogICAgfTsKCiAgICBpZiAod2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGUgPT09IHVuZGVmaW5lZCkgewogICAgICB3aW5kb3cuVmFhZGluLmRldmVsb3BtZW50TW9kZSA9IGlzRGV2ZWxvcG1lbnRNb2RlKCk7CiAgICB9CgogICAgLyogVGhpcyBmaWxlIGlzIGF1dG9nZW5lcmF0ZWQgZnJvbSBzcmMvdmFhZGluLXVzYWdlLXN0YXRpc3RpY3MudHBsLmh0bWwgKi8KCiAgICBmdW5jdGlvbiBtYXliZUdhdGhlckFuZFNlbmRTdGF0cygpIHsKICAgICAgLyoqIHZhYWRpbi1kZXYtbW9kZTpzdGFydAogICAgICAoZnVuY3Rpb24gKCkgewogICAgJ3VzZSBzdHJpY3QnOwoKICAgIHZhciBfdHlwZW9mID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiB0eXBlb2YgU3ltYm9sLml0ZXJhdG9yID09PSAic3ltYm9sIiA/IGZ1bmN0aW9uIChvYmopIHsKICAgICAgcmV0dXJuIHR5cGVvZiBvYmo7CiAgICB9IDogZnVuY3Rpb24gKG9iaikgewogICAgICByZXR1cm4gb2JqICYmIHR5cGVvZiBTeW1ib2wgPT09ICJmdW5jdGlvbiIgJiYgb2JqLmNvbnN0cnVjdG9yID09PSBTeW1ib2wgJiYgb2JqICE9PSBTeW1ib2wucHJvdG90eXBlID8gInN5bWJvbCIgOiB0eXBlb2Ygb2JqOwogICAgfTsKCiAgICB2YXIgY2xhc3NDYWxsQ2hlY2sgPSBmdW5jdGlvbiAoaW5zdGFuY2UsIENvbnN0cnVjdG9yKSB7CiAgICAgIGlmICghKGluc3RhbmNlIGluc3RhbmNlb2YgQ29uc3RydWN0b3IpKSB7CiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigiQ2Fubm90IGNhbGwgYSBjbGFzcyBhcyBhIGZ1bmN0aW9uIik7CiAgICAgIH0KICAgIH07CgogICAgdmFyIGNyZWF0ZUNsYXNzID0gZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKHRhcmdldCwgcHJvcHMpIHsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IHByb3BzW2ldOwogICAgICAgICAgZGVzY3JpcHRvci5lbnVtZXJhYmxlID0gZGVzY3JpcHRvci5lbnVtZXJhYmxlIHx8IGZhbHNlOwogICAgICAgICAgZGVzY3JpcHRvci5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgICAgaWYgKCJ2YWx1ZSIgaW4gZGVzY3JpcHRvcikgZGVzY3JpcHRvci53cml0YWJsZSA9IHRydWU7CiAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBkZXNjcmlwdG9yLmtleSwgZGVzY3JpcHRvcik7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24gKENvbnN0cnVjdG9yLCBwcm90b1Byb3BzLCBzdGF0aWNQcm9wcykgewogICAgICAgIGlmIChwcm90b1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLnByb3RvdHlwZSwgcHJvdG9Qcm9wcyk7CiAgICAgICAgaWYgKHN0YXRpY1Byb3BzKSBkZWZpbmVQcm9wZXJ0aWVzKENvbnN0cnVjdG9yLCBzdGF0aWNQcm9wcyk7CiAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yOwogICAgICB9OwogICAgfSgpOwoKICAgIHZhciBnZXRQb2x5bWVyVmVyc2lvbiA9IGZ1bmN0aW9uIGdldFBvbHltZXJWZXJzaW9uKCkgewogICAgICByZXR1cm4gd2luZG93LlBvbHltZXIgJiYgd2luZG93LlBvbHltZXIudmVyc2lvbjsKICAgIH07CgogICAgdmFyIFN0YXRpc3RpY3NHYXRoZXJlciA9IGZ1bmN0aW9uICgpIHsKICAgICAgZnVuY3Rpb24gU3RhdGlzdGljc0dhdGhlcmVyKGxvZ2dlcikgewogICAgICAgIGNsYXNzQ2FsbENoZWNrKHRoaXMsIFN0YXRpc3RpY3NHYXRoZXJlcik7CgogICAgICAgIHRoaXMubm93ID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7CiAgICAgIH0KCiAgICAgIGNyZWF0ZUNsYXNzKFN0YXRpc3RpY3NHYXRoZXJlciwgW3sKICAgICAgICBrZXk6ICdmcmFtZXdvcmtWZXJzaW9uRGV0ZWN0b3JzJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZnJhbWV3b3JrVmVyc2lvbkRldGVjdG9ycygpIHsKICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICdGbG93JzogZnVuY3Rpb24gRmxvdygpIHsKICAgICAgICAgICAgICBpZiAod2luZG93LlZhYWRpbiAmJiB3aW5kb3cuVmFhZGluLkZsb3cgJiYgd2luZG93LlZhYWRpbi5GbG93LmNsaWVudHMpIHsKICAgICAgICAgICAgICAgIHZhciBmbG93VmVyc2lvbnMgPSBPYmplY3Qua2V5cyh3aW5kb3cuVmFhZGluLkZsb3cuY2xpZW50cykubWFwKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5WYWFkaW4uRmxvdy5jbGllbnRzW2tleV07CiAgICAgICAgICAgICAgICB9KS5maWx0ZXIoZnVuY3Rpb24gKGNsaWVudCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50LmdldFZlcnNpb25JbmZvOwogICAgICAgICAgICAgICAgfSkubWFwKGZ1bmN0aW9uIChjbGllbnQpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRWZXJzaW9uSW5mbygpLmZsb3c7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGlmIChmbG93VmVyc2lvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZmxvd1ZlcnNpb25zWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ1ZhYWRpbiBGcmFtZXdvcmsnOiBmdW5jdGlvbiBWYWFkaW5GcmFtZXdvcmsoKSB7CiAgICAgICAgICAgICAgaWYgKHdpbmRvdy52YWFkaW4gJiYgd2luZG93LnZhYWRpbi5jbGllbnRzKSB7CiAgICAgICAgICAgICAgICB2YXIgZnJhbWV3b3JrVmVyc2lvbnMgPSBPYmplY3QudmFsdWVzKHdpbmRvdy52YWFkaW4uY2xpZW50cykuZmlsdGVyKGZ1bmN0aW9uIChjbGllbnQpIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsaWVudC5nZXRWZXJzaW9uSW5mbzsKICAgICAgICAgICAgICAgIH0pLm1hcChmdW5jdGlvbiAoY2xpZW50KSB7CiAgICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnQuZ2V0VmVyc2lvbkluZm8oKS52YWFkaW5WZXJzaW9uOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoZnJhbWV3b3JrVmVyc2lvbnMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICByZXR1cm4gZnJhbWV3b3JrVmVyc2lvbnNbMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnQW5ndWxhckpzJzogZnVuY3Rpb24gQW5ndWxhckpzKCkgewogICAgICAgICAgICAgIGlmICh3aW5kb3cuYW5ndWxhciAmJiB3aW5kb3cuYW5ndWxhci52ZXJzaW9uICYmIHdpbmRvdy5hbmd1bGFyLnZlcnNpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cuYW5ndWxhci52ZXJzaW9uLmZ1bGw7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnQW5ndWxhcic6IGZ1bmN0aW9uIEFuZ3VsYXIoKSB7CiAgICAgICAgICAgICAgaWYgKHdpbmRvdy5uZykgewogICAgICAgICAgICAgICAgdmFyIHRhZ3MgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCJbbmctdmVyc2lvbl0iKTsKICAgICAgICAgICAgICAgIGlmICh0YWdzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhZ3NbMF0uZ2V0QXR0cmlidXRlKCJuZy12ZXJzaW9uIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gIlVua25vd24iOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0JhY2tib25lLmpzJzogZnVuY3Rpb24gQmFja2JvbmVKcygpIHsKICAgICAgICAgICAgICBpZiAod2luZG93LkJhY2tib25lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LkJhY2tib25lLlZFUlNJT047CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnUmVhY3QnOiBmdW5jdGlvbiBSZWFjdCgpIHsKICAgICAgICAgICAgICB2YXIgcmVhY3RTZWxlY3RvciA9ICdbZGF0YS1yZWFjdHJvb3RdLCBbZGF0YS1yZWFjdGlkXSc7CiAgICAgICAgICAgICAgaWYgKCEhZG9jdW1lbnQucXVlcnlTZWxlY3RvcihyZWFjdFNlbGVjdG9yKSkgewogICAgICAgICAgICAgICAgLy8gUmVhY3QgZG9lcyBub3QgcHVibGlzaCB0aGUgdmVyc2lvbiBieSBkZWZhdWx0CiAgICAgICAgICAgICAgICByZXR1cm4gInVua25vd24iOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0VtYmVyJzogZnVuY3Rpb24gRW1iZXIoKSB7CiAgICAgICAgICAgICAgaWYgKHdpbmRvdy5FbSAmJiB3aW5kb3cuRW0uVkVSU0lPTikgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5FbS5WRVJTSU9OOwogICAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LkVtYmVyICYmIHdpbmRvdy5FbWJlci5WRVJTSU9OKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93LkVtYmVyLlZFUlNJT047CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnalF1ZXJ5JzogZnVuY3Rpb24gKF9qUXVlcnkpIHsKICAgICAgICAgICAgICBmdW5jdGlvbiBqUXVlcnkoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX2pRdWVyeS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgalF1ZXJ5LnRvU3RyaW5nID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9qUXVlcnkudG9TdHJpbmcoKTsKICAgICAgICAgICAgICB9OwoKICAgICAgICAgICAgICByZXR1cm4galF1ZXJ5OwogICAgICAgICAgICB9KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICBpZiAodHlwZW9mIGpRdWVyeSA9PT0gJ2Z1bmN0aW9uJyAmJiBqUXVlcnkucHJvdG90eXBlLmpxdWVyeSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4galF1ZXJ5LnByb3RvdHlwZS5qcXVlcnk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgJ1BvbHltZXInOiBmdW5jdGlvbiBQb2x5bWVyKCkgewogICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gZ2V0UG9seW1lclZlcnNpb24oKTsKICAgICAgICAgICAgICBpZiAodmVyc2lvbikgewogICAgICAgICAgICAgICAgcmV0dXJuIHZlcnNpb247CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9LAogICAgICAgICAgICAnTGl0RWxlbWVudCc6IGZ1bmN0aW9uIExpdEVsZW1lbnQoKSB7CiAgICAgICAgICAgICAgdmFyIHZlcnNpb24gPSB3aW5kb3cubGl0RWxlbWVudFZlcnNpb25zICYmIHdpbmRvdy5saXRFbGVtZW50VmVyc2lvbnNbMF07CiAgICAgICAgICAgICAgaWYgKHZlcnNpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiB2ZXJzaW9uOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSwKICAgICAgICAgICAgJ0xpdEh0bWwnOiBmdW5jdGlvbiBMaXRIdG1sKCkgewogICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gd2luZG93LmxpdEh0bWxWZXJzaW9ucyAmJiB3aW5kb3cubGl0SHRtbFZlcnNpb25zWzBdOwogICAgICAgICAgICAgIGlmICh2ZXJzaW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmVyc2lvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICdWdWUuanMnOiBmdW5jdGlvbiBWdWVKcygpIHsKICAgICAgICAgICAgICBpZiAod2luZG93LlZ1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5WdWUudmVyc2lvbjsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH07CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnZ2V0VXNlZFZhYWRpbkVsZW1lbnRzJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2V0VXNlZFZhYWRpbkVsZW1lbnRzKGVsZW1lbnRzKSB7CiAgICAgICAgICB2YXIgdmVyc2lvbiA9IGdldFBvbHltZXJWZXJzaW9uKCk7CiAgICAgICAgICB2YXIgZWxlbWVudENsYXNzZXMgPSB2b2lkIDA7CiAgICAgICAgICAvLyBOT1RFOiBJbiBjYXNlIHlvdSBlZGl0IHRoZSBjb2RlIGhlcmUsIFlPVSBNVVNUIFVQREFURSBhbnkgc3RhdGlzdGljcyByZXBvcnRpbmcgY29kZSBpbiBGbG93LgogICAgICAgICAgLy8gQ2hlY2sgYWxsIGxvY2F0aW9ucyBjYWxsaW5nIHRoZSBtZXRob2QgZ2V0RW50cmllcygpIGluCiAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vdmFhZGluL2Zsb3cvYmxvYi9tYXN0ZXIvZmxvdy1zZXJ2ZXIvc3JjL21haW4vamF2YS9jb20vdmFhZGluL2Zsb3cvaW50ZXJuYWwvVXNhZ2VTdGF0aXN0aWNzLmphdmEjTDEwNgogICAgICAgICAgLy8gQ3VycmVudGx5IGl0IGlzIG9ubHkgdXNlZCBieSBCb290c3RyYXBIYW5kbGVyLgogICAgICAgICAgaWYgKHZlcnNpb24gJiYgdmVyc2lvbi5pbmRleE9mKCcyJykgPT09IDApIHsKICAgICAgICAgICAgLy8gUG9seW1lciAyOiBjb21wb25lbnRzIGNsYXNzZXMgYXJlIHN0b3JlZCBpbiB3aW5kb3cuVmFhZGluCiAgICAgICAgICAgIGVsZW1lbnRDbGFzc2VzID0gT2JqZWN0LmtleXMod2luZG93LlZhYWRpbikubWFwKGZ1bmN0aW9uIChjKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5WYWFkaW5bY107CiAgICAgICAgICAgIH0pLmZpbHRlcihmdW5jdGlvbiAoYykgewogICAgICAgICAgICAgIHJldHVybiBjLmlzOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFBvbHltZXIgMzogY29tcG9uZW50cyBjbGFzc2VzIGFyZSBzdG9yZWQgaW4gd2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zCiAgICAgICAgICAgIGVsZW1lbnRDbGFzc2VzID0gd2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zIHx8IFtdOwogICAgICAgICAgfQogICAgICAgICAgZWxlbWVudENsYXNzZXMuZm9yRWFjaChmdW5jdGlvbiAoa2xhc3MpIHsKICAgICAgICAgICAgdmFyIHZlcnNpb24gPSBrbGFzcy52ZXJzaW9uID8ga2xhc3MudmVyc2lvbiA6ICIwLjAuMCI7CiAgICAgICAgICAgIGVsZW1lbnRzW2tsYXNzLmlzXSA9IHsgdmVyc2lvbjogdmVyc2lvbiB9OwogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnZ2V0VXNlZFZhYWRpblRoZW1lcycsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGdldFVzZWRWYWFkaW5UaGVtZXModGhlbWVzKSB7CiAgICAgICAgICBbJ0x1bW8nLCAnTWF0ZXJpYWwnXS5mb3JFYWNoKGZ1bmN0aW9uICh0aGVtZU5hbWUpIHsKICAgICAgICAgICAgdmFyIHRoZW1lOwogICAgICAgICAgICB2YXIgdmVyc2lvbiA9IGdldFBvbHltZXJWZXJzaW9uKCk7CiAgICAgICAgICAgIGlmICh2ZXJzaW9uICYmIHZlcnNpb24uaW5kZXhPZignMicpID09PSAwKSB7CiAgICAgICAgICAgICAgLy8gUG9seW1lciAyOiB0aGVtZXMgYXJlIHN0b3JlZCBpbiB3aW5kb3cuVmFhZGluCiAgICAgICAgICAgICAgdGhlbWUgPSB3aW5kb3cuVmFhZGluW3RoZW1lTmFtZV07CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgLy8gUG9seW1lciAzOiB0aGVtZXMgYXJlIHN0b3JlZCBpbiBjdXN0b20gZWxlbWVudCByZWdpc3RyeQogICAgICAgICAgICAgIHRoZW1lID0gY3VzdG9tRWxlbWVudHMuZ2V0KCd2YWFkaW4tJyArIHRoZW1lTmFtZS50b0xvd2VyQ2FzZSgpICsgJy1zdHlsZXMnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhlbWUgJiYgdGhlbWUudmVyc2lvbikgewogICAgICAgICAgICAgIHRoZW1lc1t0aGVtZU5hbWVdID0geyB2ZXJzaW9uOiB0aGVtZS52ZXJzaW9uIH07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogJ2dldEZyYW1ld29ya3MnLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBnZXRGcmFtZXdvcmtzKGZyYW1ld29ya3MpIHsKICAgICAgICAgIHZhciBkZXRlY3RvcnMgPSB0aGlzLmZyYW1ld29ya1ZlcnNpb25EZXRlY3RvcnMoKTsKICAgICAgICAgIE9iamVjdC5rZXlzKGRldGVjdG9ycykuZm9yRWFjaChmdW5jdGlvbiAoZnJhbWV3b3JrKSB7CiAgICAgICAgICAgIHZhciBkZXRlY3RvciA9IGRldGVjdG9yc1tmcmFtZXdvcmtdOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgIHZhciB2ZXJzaW9uID0gZGV0ZWN0b3IoKTsKICAgICAgICAgICAgICBpZiAodmVyc2lvbikgewogICAgICAgICAgICAgICAgZnJhbWV3b3Jrc1tmcmFtZXdvcmtdID0geyB2ZXJzaW9uOiB2ZXJzaW9uIH07CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IGNhdGNoIChlKSB7fQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnZ2F0aGVyJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gZ2F0aGVyKHN0b3JhZ2UpIHsKICAgICAgICAgIHZhciBzdG9yZWRTdGF0cyA9IHN0b3JhZ2UucmVhZCgpOwogICAgICAgICAgdmFyIGdhdGhlcmVkU3RhdHMgPSB7fTsKICAgICAgICAgIHZhciB0eXBlcyA9IFsiZWxlbWVudHMiLCAiZnJhbWV3b3JrcyIsICJ0aGVtZXMiXTsKCiAgICAgICAgICB0eXBlcy5mb3JFYWNoKGZ1bmN0aW9uICh0eXBlKSB7CiAgICAgICAgICAgIGdhdGhlcmVkU3RhdHNbdHlwZV0gPSB7fTsKICAgICAgICAgICAgaWYgKCFzdG9yZWRTdGF0c1t0eXBlXSkgewogICAgICAgICAgICAgIHN0b3JlZFN0YXRzW3R5cGVdID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwoKICAgICAgICAgIHZhciBwcmV2aW91c1N0YXRzID0gSlNPTi5zdHJpbmdpZnkoc3RvcmVkU3RhdHMpOwoKICAgICAgICAgIHRoaXMuZ2V0VXNlZFZhYWRpbkVsZW1lbnRzKGdhdGhlcmVkU3RhdHMuZWxlbWVudHMpOwogICAgICAgICAgdGhpcy5nZXRGcmFtZXdvcmtzKGdhdGhlcmVkU3RhdHMuZnJhbWV3b3Jrcyk7CiAgICAgICAgICB0aGlzLmdldFVzZWRWYWFkaW5UaGVtZXMoZ2F0aGVyZWRTdGF0cy50aGVtZXMpOwoKICAgICAgICAgIHZhciBub3cgPSB0aGlzLm5vdzsKICAgICAgICAgIHR5cGVzLmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHsKICAgICAgICAgICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhnYXRoZXJlZFN0YXRzW3R5cGVdKTsKICAgICAgICAgICAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uIChrZXkpIHsKICAgICAgICAgICAgICBpZiAoIXN0b3JlZFN0YXRzW3R5cGVdW2tleV0gfHwgX3R5cGVvZihzdG9yZWRTdGF0c1t0eXBlXVtrZXldKSAhPSBfdHlwZW9mKHt9KSkgewogICAgICAgICAgICAgICAgc3RvcmVkU3RhdHNbdHlwZV1ba2V5XSA9IHsgZmlyc3RVc2VkOiBub3cgfTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gRGlzY2FyZHMgYW55IHByZXZpb3VzbHkgbG9nZ2VkIHZlcnNpb24gbnVtYmVyCiAgICAgICAgICAgICAgc3RvcmVkU3RhdHNbdHlwZV1ba2V5XS52ZXJzaW9uID0gZ2F0aGVyZWRTdGF0c1t0eXBlXVtrZXldLnZlcnNpb247CiAgICAgICAgICAgICAgc3RvcmVkU3RhdHNbdHlwZV1ba2V5XS5sYXN0VXNlZCA9IG5vdzsKICAgICAgICAgICAgfSk7CiAgICAgICAgICB9KTsKCiAgICAgICAgICB2YXIgbmV3U3RhdHMgPSBKU09OLnN0cmluZ2lmeShzdG9yZWRTdGF0cyk7CiAgICAgICAgICBzdG9yYWdlLndyaXRlKG5ld1N0YXRzKTsKICAgICAgICAgIGlmIChuZXdTdGF0cyAhPSBwcmV2aW91c1N0YXRzICYmIE9iamVjdC5rZXlzKHN0b3JlZFN0YXRzKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJOZXcgc3RhdHM6ICIgKyBuZXdTdGF0cyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9XSk7CiAgICAgIHJldHVybiBTdGF0aXN0aWNzR2F0aGVyZXI7CiAgICB9KCk7CgogICAgdmFyIFN0YXRpc3RpY3NTdG9yYWdlID0gZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBTdGF0aXN0aWNzU3RvcmFnZShrZXkpIHsKICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdGF0aXN0aWNzU3RvcmFnZSk7CgogICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICB9CgogICAgICBjcmVhdGVDbGFzcyhTdGF0aXN0aWNzU3RvcmFnZSwgW3sKICAgICAgICBrZXk6ICdyZWFkJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gcmVhZCgpIHsKICAgICAgICAgIHZhciBsb2NhbFN0b3JhZ2VTdGF0c1N0cmluZyA9IGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMua2V5KTsKICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKGxvY2FsU3RvcmFnZVN0YXRzU3RyaW5nID8gbG9jYWxTdG9yYWdlU3RhdHNTdHJpbmcgOiAne30nKTsKICAgICAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogJ3dyaXRlJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gd3JpdGUoZGF0YSkgewogICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5rZXksIGRhdGEpOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogJ2NsZWFyJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gY2xlYXIoKSB7CiAgICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLmtleSk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnaXNFbXB0eScsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGlzRW1wdHkoKSB7CiAgICAgICAgICB2YXIgc3RvcmVkU3RhdHMgPSB0aGlzLnJlYWQoKTsKICAgICAgICAgIHZhciBlbXB0eSA9IHRydWU7CiAgICAgICAgICBPYmplY3Qua2V5cyhzdG9yZWRTdGF0cykuZm9yRWFjaChmdW5jdGlvbiAoa2V5KSB7CiAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhzdG9yZWRTdGF0c1trZXldKS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgZW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CgogICAgICAgICAgcmV0dXJuIGVtcHR5OwogICAgICAgIH0KICAgICAgfV0pOwogICAgICByZXR1cm4gU3RhdGlzdGljc1N0b3JhZ2U7CiAgICB9KCk7CgogICAgdmFyIFN0YXRpc3RpY3NTZW5kZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGZ1bmN0aW9uIFN0YXRpc3RpY3NTZW5kZXIodXJsLCBsb2dnZXIpIHsKICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdGF0aXN0aWNzU2VuZGVyKTsKCiAgICAgICAgdGhpcy51cmwgPSB1cmw7CiAgICAgICAgdGhpcy5sb2dnZXIgPSBsb2dnZXI7CiAgICAgIH0KCiAgICAgIGNyZWF0ZUNsYXNzKFN0YXRpc3RpY3NTZW5kZXIsIFt7CiAgICAgICAga2V5OiAnc2VuZCcsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoZGF0YSwgZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgICB2YXIgbG9nZ2VyID0gdGhpcy5sb2dnZXI7CgogICAgICAgICAgaWYgKG5hdmlnYXRvci5vbkxpbmUgPT09IGZhbHNlKSB7CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiT2ZmbGluZSwgY2FuJ3Qgc2VuZCIpOwogICAgICAgICAgICBlcnJvckhhbmRsZXIoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgbG9nZ2VyLmRlYnVnKCJTZW5kaW5nIGRhdGEgdG8gIiArIHRoaXMudXJsKTsKCiAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICByZXEud2l0aENyZWRlbnRpYWxzID0gdHJ1ZTsKICAgICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyBTdGF0cyBzZW50LCBub3RoaW5nIG1vcmUgdG8gZG8KICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJSZXNwb25zZTogIiArIHJlcS5yZXNwb25zZVRleHQpOwogICAgICAgICAgfSk7CiAgICAgICAgICByZXEuYWRkRXZlbnRMaXN0ZW5lcigiZXJyb3IiLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIGxvZ2dlci5kZWJ1ZygiU2VuZCBmYWlsZWQiKTsKICAgICAgICAgICAgZXJyb3JIYW5kbGVyKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJlcS5hZGRFdmVudExpc3RlbmVyKCJhYm9ydCIsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgbG9nZ2VyLmRlYnVnKCJTZW5kIGFib3J0ZWQiKTsKICAgICAgICAgICAgZXJyb3JIYW5kbGVyKCk7CiAgICAgICAgICB9KTsKICAgICAgICAgIHJlcS5vcGVuKCJQT1NUIiwgdGhpcy51cmwpOwogICAgICAgICAgcmVxLnNldFJlcXVlc3RIZWFkZXIoIkNvbnRlbnQtVHlwZSIsICJhcHBsaWNhdGlvbi9qc29uIik7CiAgICAgICAgICByZXEuc2VuZChkYXRhKTsKICAgICAgICB9CiAgICAgIH1dKTsKICAgICAgcmV0dXJuIFN0YXRpc3RpY3NTZW5kZXI7CiAgICB9KCk7CgogICAgdmFyIFN0YXRpc3RpY3NMb2dnZXIgPSBmdW5jdGlvbiAoKSB7CiAgICAgIGZ1bmN0aW9uIFN0YXRpc3RpY3NMb2dnZXIoaWQpIHsKICAgICAgICBjbGFzc0NhbGxDaGVjayh0aGlzLCBTdGF0aXN0aWNzTG9nZ2VyKTsKCiAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICB9CgogICAgICBjcmVhdGVDbGFzcyhTdGF0aXN0aWNzTG9nZ2VyLCBbewogICAgICAgIGtleTogJ19pc0RlYnVnJywKICAgICAgICB2YWx1ZTogZnVuY3Rpb24gX2lzRGVidWcoKSB7CiAgICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oInZhYWRpbi4iICsgdGhpcy5pZCArICIuZGVidWciKTsKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICBrZXk6ICdkZWJ1ZycsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGRlYnVnKG1zZykgewogICAgICAgICAgaWYgKHRoaXMuX2lzRGVidWcoKSkgewogICAgICAgICAgICBjb25zb2xlLmluZm8odGhpcy5pZCArICI6ICIgKyBtc2cpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfV0pOwogICAgICByZXR1cm4gU3RhdGlzdGljc0xvZ2dlcjsKICAgIH0oKTsKCiAgICB2YXIgVXNhZ2VTdGF0aXN0aWNzID0gZnVuY3Rpb24gKCkgewogICAgICBmdW5jdGlvbiBVc2FnZVN0YXRpc3RpY3MoKSB7CiAgICAgICAgY2xhc3NDYWxsQ2hlY2sodGhpcywgVXNhZ2VTdGF0aXN0aWNzKTsKCiAgICAgICAgdGhpcy5ub3cgPSBuZXcgRGF0ZSgpOwogICAgICAgIHRoaXMudGltZU5vdyA9IHRoaXMubm93LmdldFRpbWUoKTsKICAgICAgICB0aGlzLmdhdGhlckRlbGF5ID0gMTA7IC8vIERlbGF5IGJldHdlZW4gbG9hZGluZyB0aGlzIGZpbGUgYW5kIGdhdGhlcmluZyBzdGF0cwogICAgICAgIHRoaXMuaW5pdGlhbERlbGF5ID0gMjQgKiA2MCAqIDYwOwoKICAgICAgICB0aGlzLmxvZ2dlciA9IG5ldyBTdGF0aXN0aWNzTG9nZ2VyKCJzdGF0aXN0aWNzIik7CiAgICAgICAgdGhpcy5zdG9yYWdlID0gbmV3IFN0YXRpc3RpY3NTdG9yYWdlKCJ2YWFkaW4uc3RhdGlzdGljcy5iYXNrZXQiKTsKICAgICAgICB0aGlzLmdhdGhlcmVyID0gbmV3IFN0YXRpc3RpY3NHYXRoZXJlcih0aGlzLmxvZ2dlcik7CiAgICAgICAgdGhpcy5zZW5kZXIgPSBuZXcgU3RhdGlzdGljc1NlbmRlcigiaHR0cHM6Ly90b29scy52YWFkaW4uY29tL3VzYWdlLXN0YXRzL3N1Ym1pdCIsIHRoaXMubG9nZ2VyKTsKICAgICAgfQoKICAgICAgY3JlYXRlQ2xhc3MoVXNhZ2VTdGF0aXN0aWNzLCBbewogICAgICAgIGtleTogJ21heWJlR2F0aGVyQW5kU2VuZCcsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1heWJlR2F0aGVyQW5kU2VuZCgpIHsKICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CgogICAgICAgICAgaWYgKGxvY2FsU3RvcmFnZS5nZXRJdGVtKFVzYWdlU3RhdGlzdGljcy5vcHRPdXRLZXkpKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuZ2F0aGVyZXIuZ2F0aGVyKHRoaXMuc3RvcmFnZSk7CiAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgX3RoaXMubWF5YmVTZW5kKCk7CiAgICAgICAgICB9LCB0aGlzLmdhdGhlckRlbGF5ICogMTAwMCk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnbG90dGVyeScsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIGxvdHRlcnkoKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICBrZXk6ICdjdXJyZW50TW9udGgnLAogICAgICAgIHZhbHVlOiBmdW5jdGlvbiBjdXJyZW50TW9udGgoKSB7CiAgICAgICAgICByZXR1cm4gdGhpcy5ub3cuZ2V0WWVhcigpICogMTIgKyB0aGlzLm5vdy5nZXRNb250aCgpOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogJ21heWJlU2VuZCcsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIG1heWJlU2VuZCgpIHsKICAgICAgICAgIHZhciBmaXJzdFVzZSA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShVc2FnZVN0YXRpc3RpY3MuZmlyc3RVc2VLZXkpKTsKICAgICAgICAgIHZhciBtb250aFByb2Nlc3NlZCA9IE51bWJlcihsb2NhbFN0b3JhZ2UuZ2V0SXRlbShVc2FnZVN0YXRpc3RpY3MubW9udGhQcm9jZXNzZWRLZXkpKTsKCiAgICAgICAgICBpZiAoIWZpcnN0VXNlKSB7CiAgICAgICAgICAgIC8vIFVzZSBhIGdyYWNlIHBlcmlvZCB0byBhdm9pZCBpbnRlcmZlcmluZyB3aXRoIHRlc3RzLCBpbmNvZ25pdG8gbW9kZSBldGMKICAgICAgICAgICAgZmlyc3RVc2UgPSB0aGlzLnRpbWVOb3c7CiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKFVzYWdlU3RhdGlzdGljcy5maXJzdFVzZUtleSwgZmlyc3RVc2UpOwogICAgICAgICAgfQoKICAgICAgICAgIGlmICh0aGlzLnRpbWVOb3cgPCBmaXJzdFVzZSArIHRoaXMuaW5pdGlhbERlbGF5ICogMTAwMCkgewogICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygiTm8gc3RhdGlzdGljcyB3aWxsIGJlIHNlbnQgdW50aWwgdGhlIGluaXRpYWwgZGVsYXkgb2YgIiArIHRoaXMuaW5pdGlhbERlbGF5ICsgInMgaGFzIHBhc3NlZCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBpZiAodGhpcy5jdXJyZW50TW9udGgoKSA8PSBtb250aFByb2Nlc3NlZCkgewogICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygiVGhpcyBtb250aCBoYXMgYWxyZWFkeSBiZWVuIHByb2Nlc3NlZCIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShVc2FnZVN0YXRpc3RpY3MubW9udGhQcm9jZXNzZWRLZXksIHRoaXMuY3VycmVudE1vbnRoKCkpOwogICAgICAgICAgLy8gVXNlIHJhbmRvbSBzYW1wbGluZwogICAgICAgICAgaWYgKHRoaXMubG90dGVyeSgpKSB7CiAgICAgICAgICAgIHRoaXMubG9nZ2VyLmRlYnVnKCJDb25ncmF0dWxhdGlvbnMsIHdlIGhhdmUgYSB3aW5uZXIhIik7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLmxvZ2dlci5kZWJ1ZygiU29ycnksIG5vIHN0YXRzIGZyb20geW91IHRoaXMgdGltZSIpOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgdGhpcy5zZW5kKCk7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnc2VuZCcsCiAgICAgICAgdmFsdWU6IGZ1bmN0aW9uIHNlbmQoKSB7CiAgICAgICAgICAvLyBFbnN1cmUgd2UgaGF2ZSB0aGUgbGF0ZXN0IGRhdGEKICAgICAgICAgIHRoaXMuZ2F0aGVyZXIuZ2F0aGVyKHRoaXMuc3RvcmFnZSk7CgogICAgICAgICAgLy8gUmVhZCwgc2VuZCBhbmQgY2xlYW4gdXAKICAgICAgICAgIHZhciBkYXRhID0gdGhpcy5zdG9yYWdlLnJlYWQoKTsKICAgICAgICAgIGRhdGFbImZpcnN0VXNlIl0gPSBOdW1iZXIobG9jYWxTdG9yYWdlLmdldEl0ZW0oVXNhZ2VTdGF0aXN0aWNzLmZpcnN0VXNlS2V5KSk7CiAgICAgICAgICBkYXRhWyJ1c2FnZVN0YXRpc3RpY3NWZXJzaW9uIl0gPSBVc2FnZVN0YXRpc3RpY3MudmVyc2lvbjsKICAgICAgICAgIHZhciBpbmZvID0gJ1RoaXMgcmVxdWVzdCBjb250YWlucyB1c2FnZSBzdGF0aXN0aWNzIGdhdGhlcmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIHJ1bm5pbmcgaW4gZGV2ZWxvcG1lbnQgbW9kZS4gXG5cblN0YXRpc3RpY3MgZ2F0aGVyaW5nIGlzIGF1dG9tYXRpY2FsbHkgZGlzYWJsZWQgYW5kIGV4Y2x1ZGVkIGZyb20gcHJvZHVjdGlvbiBidWlsZHMuXG5cbkZvciBkZXRhaWxzIGFuZCB0byBvcHQtb3V0LCBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3ZhYWRpbi92YWFkaW4tdXNhZ2Utc3RhdGlzdGljcy5cblxuXG5cbic7CiAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICB0aGlzLnNlbmRlci5zZW5kKGluZm8gKyBKU09OLnN0cmluZ2lmeShkYXRhKSwgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAvLyBSZXZlcnQgdGhlICdtb250aCBwcm9jZXNzZWQnIGZsYWcKICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oVXNhZ2VTdGF0aXN0aWNzLm1vbnRoUHJvY2Vzc2VkS2V5LCBzZWxmLmN1cnJlbnRNb250aCgpIC0gMSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH1dLCBbewogICAgICAgIGtleTogJ3ZlcnNpb24nLAogICAgICAgIGdldDogZnVuY3Rpb24gZ2V0JDEoKSB7CiAgICAgICAgICByZXR1cm4gJzIuMS4wJzsKICAgICAgICB9CiAgICAgIH0sIHsKICAgICAgICBrZXk6ICdmaXJzdFVzZUtleScsCiAgICAgICAgZ2V0OiBmdW5jdGlvbiBnZXQkMSgpIHsKICAgICAgICAgIHJldHVybiAndmFhZGluLnN0YXRpc3RpY3MuZmlyc3R1c2UnOwogICAgICAgIH0KICAgICAgfSwgewogICAgICAgIGtleTogJ21vbnRoUHJvY2Vzc2VkS2V5JywKICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQxKCkgewogICAgICAgICAgcmV0dXJuICd2YWFkaW4uc3RhdGlzdGljcy5tb250aFByb2Nlc3NlZCc7CiAgICAgICAgfQogICAgICB9LCB7CiAgICAgICAga2V5OiAnb3B0T3V0S2V5JywKICAgICAgICBnZXQ6IGZ1bmN0aW9uIGdldCQxKCkgewogICAgICAgICAgcmV0dXJuICd2YWFkaW4uc3RhdGlzdGljcy5vcHRvdXQnOwogICAgICAgIH0KICAgICAgfV0pOwogICAgICByZXR1cm4gVXNhZ2VTdGF0aXN0aWNzOwogICAgfSgpOwoKICAgIHRyeSB7CiAgICAgIHdpbmRvdy5WYWFkaW4gPSB3aW5kb3cuVmFhZGluIHx8IHt9OwogICAgICB3aW5kb3cuVmFhZGluLnVzYWdlU3RhdHNDaGVja2VyID0gd2luZG93LlZhYWRpbi51c2FnZVN0YXRzQ2hlY2tlciB8fCBuZXcgVXNhZ2VTdGF0aXN0aWNzKCk7CiAgICAgIHdpbmRvdy5WYWFkaW4udXNhZ2VTdGF0c0NoZWNrZXIubWF5YmVHYXRoZXJBbmRTZW5kKCk7CiAgICB9IGNhdGNoIChlKSB7CiAgICAgIC8vIEludGVudGlvbmFsbHkgaWdub3JlZCBhcyB0aGlzIGlzIG5vdCBhIHByb2JsZW0gaW4gdGhlIGFwcCBiZWluZyBkZXZlbG9wZWQKICAgIH0KCiAgICB9KCkpOwoKICAgICAgdmFhZGluLWRldi1tb2RlOmVuZCAqKi8KICAgIH0KCiAgICBjb25zdCB1c2FnZVN0YXRpc3RpY3MgPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHR5cGVvZiBydW5JZkRldmVsb3BtZW50TW9kZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgIHJldHVybiBydW5JZkRldmVsb3BtZW50TW9kZShtYXliZUdhdGhlckFuZFNlbmRTdGF0cyk7CiAgICAgIH0KICAgIH07CgogICAgaWYgKCF3aW5kb3cuVmFhZGluKSB7CiAgICAgIHdpbmRvd1snVmFhZGluJ10gPSB7fTsKICAgIH0KCiAgICAvKioKICAgICAqIEFycmF5IG9mIFZhYWRpbiBjdXN0b20gZWxlbWVudCBjbGFzc2VzIHRoYXQgaGF2ZSBiZWVuIGZpbmFsaXplZC4KICAgICAqLwogICAgd2luZG93WydWYWFkaW4nXS5yZWdpc3RyYXRpb25zID0gd2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zIHx8IFtdOwoKICAgIC8vIFVzZSB0aGUgaGFjayB0byBwcmV2ZW50IHBvbHltZXItbW9kdWxpemVyIGZyb20gY29udmVydGluZyB0byBleHBvcnRzCiAgICB3aW5kb3dbJ1ZhYWRpbiddLmRldmVsb3BtZW50TW9kZUNhbGxiYWNrID0gd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFjayB8fCB7fTsKICAgIHdpbmRvd1snVmFhZGluJ10uZGV2ZWxvcG1lbnRNb2RlQ2FsbGJhY2tbJ3ZhYWRpbi11c2FnZS1zdGF0aXN0aWNzJ10gPSBmdW5jdGlvbigpIHsKICAgICAgaWYgKHVzYWdlU3RhdGlzdGljcykgewogICAgICAgIHVzYWdlU3RhdGlzdGljcygpOwogICAgICB9CiAgICB9OwoKICAgIGxldCBzdGF0c0pvYjsKCiAgICBjb25zdCByZWdpc3RlcmVkID0gbmV3IFNldCgpOwoKICAgIC8qKgogICAgICogQHBvbHltZXJNaXhpbgogICAgICogQG1peGVzIERpck1peGluCiAgICAgKi8KICAgIGNvbnN0IEVsZW1lbnRNaXhpbiQxID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBWYWFkaW5FbGVtZW50TWl4aW4gZXh0ZW5kcyBEaXJNaXhpbiQxKHN1cGVyQ2xhc3MpIHsKICAgICAgLyoqIEBwcm90ZWN0ZWQgKi8KICAgICAgc3RhdGljIGZpbmFsaXplKCkgewogICAgICAgIHN1cGVyLmZpbmFsaXplKCk7CgogICAgICAgIGNvbnN0IHtpc30gPSB0aGlzOwoKICAgICAgICAvLyBSZWdpc3RlcnMgYSBjbGFzcyBwcm90b3R5cGUgZm9yIHRlbGVtZXRyeSBwdXJwb3Nlcy4KICAgICAgICBpZiAoaXMgJiYgIXJlZ2lzdGVyZWQuaGFzKGlzKSkgewogICAgICAgICAgd2luZG93LlZhYWRpbi5yZWdpc3RyYXRpb25zLnB1c2godGhpcyk7CiAgICAgICAgICByZWdpc3RlcmVkLmFkZChpcyk7CgogICAgICAgICAgaWYgKHdpbmRvdy5WYWFkaW4uZGV2ZWxvcG1lbnRNb2RlQ2FsbGJhY2spIHsKICAgICAgICAgICAgc3RhdHNKb2IgPSBEZWJvdW5jZXIuZGVib3VuY2Uoc3RhdHNKb2IsCiAgICAgICAgICAgICAgaWRsZVBlcmlvZCwgKCkgPT4gewogICAgICAgICAgICAgICAgd2luZG93LlZhYWRpbi5kZXZlbG9wbWVudE1vZGVDYWxsYmFja1sndmFhZGluLXVzYWdlLXN0YXRpc3RpY3MnXSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgKTsKICAgICAgICAgICAgZW5xdWV1ZURlYm91bmNlcihzdGF0c0pvYik7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIGlmIChkb2N1bWVudC5kb2N0eXBlID09PSBudWxsKSB7CiAgICAgICAgICBjb25zb2xlLndhcm4oCiAgICAgICAgICAgICdWYWFkaW4gY29tcG9uZW50cyByZXF1aXJlIHRoZSAic3RhbmRhcmRzIG1vZGUiIGRlY2xhcmF0aW9uLiBQbGVhc2UgYWRkIDwhRE9DVFlQRSBodG1sPiB0byB0aGUgSFRNTCBkb2N1bWVudC4nCiAgICAgICAgICApOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIGA8dmFhZGluLWNoZWNrYm94PmAgaXMgYSBXZWIgQ29tcG9uZW50IGZvciBjdXN0b21pemVkIGNoZWNrYm94ZXMuCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPHZhYWRpbi1jaGVja2JveD4KICAgICAqICAgTWFrZSBteSBwcm9maWxlIHZpc2libGUKICAgICAqIDwvdmFhZGluLWNoZWNrYm94PgogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIFN0eWxpbmcKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIHNoYWRvdyBET00gcGFydHMgYXJlIGF2YWlsYWJsZSBmb3Igc3R5bGluZzoKICAgICAqCiAgICAgKiBQYXJ0IG5hbWUgICAgICAgICB8IERlc2NyaXB0aW9uCiAgICAgKiAtLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICogYGNoZWNrYm94YCAgICAgICAgfCBUaGUgd3JhcHBlciBlbGVtZW50IGZvciB0aGUgbmF0aXZlIDxpbnB1dCB0eXBlPSJjaGVja2JveCI+CiAgICAgKiBgbGFiZWxgICAgICAgICAgICB8IFRoZSB3cmFwcGVyIGVsZW1lbnQgaW4gd2hpY2ggdGhlIGNvbXBvbmVudCdzIGNoaWxkcmVuLCBuYW1lbHkgdGhlIGxhYmVsLCBpcyBzbG90dGVkCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBzdGF0ZSBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CiAgICAgKgogICAgICogQXR0cmlidXRlICAgIHwgRGVzY3JpcHRpb24gfCBQYXJ0IG5hbWUKICAgICAqIC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLQogICAgICogYGFjdGl2ZWAgICAgIHwgU2V0IHdoZW4gdGhlIGNoZWNrYm94IGlzIHByZXNzZWQgZG93biwgZWl0aGVyIHdpdGggbW91c2UsIHRvdWNoIG9yIHRoZSBrZXlib2FyZC4gfCBgOmhvc3RgCiAgICAgKiBgZGlzYWJsZWRgICAgfCBTZXQgd2hlbiB0aGUgY2hlY2tib3ggaXMgZGlzYWJsZWQuIHwgYDpob3N0YAogICAgICogYGZvY3VzLXJpbmdgIHwgU2V0IHdoZW4gdGhlIGNoZWNrYm94IGlzIGZvY3VzZWQgdXNpbmcgdGhlIGtleWJvYXJkLiB8IGA6aG9zdGAKICAgICAqIGBmb2N1c2VkYCAgICB8IFNldCB3aGVuIHRoZSBjaGVja2JveCBpcyBmb2N1c2VkLiB8IGA6aG9zdGAKICAgICAqIGBpbmRldGVybWluYXRlYCB8IFNldCB3aGVuIHRoZSBjaGVja2JveCBpcyBpbiBpbmRldGVybWluYXRlIG1vZGUuIHwgYDpob3N0YAogICAgICogYGNoZWNrZWRgIHwgU2V0IHdoZW4gdGhlIGNoZWNrYm94IGlzIGNoZWNrZWQuIHwgYDpob3N0YAogICAgICogYGVtcHR5YCB8IFNldCB3aGVuIHRoZXJlIGlzIG5vIGxhYmVsIHByb3ZpZGVkLiB8IGBsYWJlbGAKICAgICAqCiAgICAgKiBTZWUgW1RoZW1hYmxlTWl4aW4g4oCTIGhvdyB0byBhcHBseSBzdHlsZXMgZm9yIHNoYWRvdyBwYXJ0c10oaHR0cHM6Ly9naXRodWIuY29tL3ZhYWRpbi92YWFkaW4tdGhlbWFibGUtbWl4aW4vd2lraSkKICAgICAqCiAgICAgKiBAZXh0ZW5kcyBQb2x5bWVyRWxlbWVudAogICAgICogQG1peGVzIEVsZW1lbnRNaXhpbgogICAgICogQG1peGVzIENvbnRyb2xTdGF0ZU1peGluCiAgICAgKiBAbWl4ZXMgVGhlbWFibGVNaXhpbgogICAgICogQG1peGVzIEdlc3R1cmVFdmVudExpc3RlbmVycwogICAgICogQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAgKi8KICAgIGNsYXNzIENoZWNrYm94RWxlbWVudCBleHRlbmRzCiAgICAgIEVsZW1lbnRNaXhpbiQxKAogICAgICAgIENvbnRyb2xTdGF0ZU1peGluKAogICAgICAgICAgVGhlbWFibGVNaXhpbigKICAgICAgICAgICAgR2VzdHVyZUV2ZW50TGlzdGVuZXJzKFBvbHltZXJFbGVtZW50KSkpKSB7CiAgICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgICAgcmV0dXJuIGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KCiAgICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgICB9CgogICAgICBsYWJlbCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGJhc2VsaW5lOwogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgIH0KCiAgICAgIFtwYXJ0PSJjaGVja2JveCJdIHsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZsZXg6IG5vbmU7CiAgICAgIH0KCiAgICAgIGlucHV0W3R5cGU9ImNoZWNrYm94Il0gewogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB0b3A6IDA7CiAgICAgICAgbGVmdDogMDsKICAgICAgICByaWdodDogMDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICBjdXJzb3I6IGluaGVyaXQ7CiAgICAgICAgbWFyZ2luOiAwOwogICAgICB9CgogICAgICA6aG9zdChbZGlzYWJsZWRdKSB7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgfQogICAgPC9zdHlsZT4KCiAgICA8bGFiZWw+CiAgICAgIDxzcGFuIHBhcnQ9ImNoZWNrYm94Ij4KICAgICAgICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIGNoZWNrZWQ9Int7Y2hlY2tlZDo6Y2hhbmdlfX0iIGRpc2FibGVkXCQ9IltbZGlzYWJsZWRdXSIgaW5kZXRlcm1pbmF0ZT0ie3tpbmRldGVybWluYXRlOjpjaGFuZ2V9fSIgcm9sZT0icHJlc2VudGF0aW9uIiB0YWJpbmRleD0iLTEiPgogICAgICA8L3NwYW4+CgogICAgICA8c3BhbiBwYXJ0PSJsYWJlbCI+CiAgICAgICAgPHNsb3Q+PC9zbG90PgogICAgICA8L3NwYW4+CiAgICA8L2xhYmVsPgpgOwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IGlzKCkgewogICAgICAgIHJldHVybiAndmFhZGluLWNoZWNrYm94JzsKICAgICAgfQoKICAgICAgc3RhdGljIGdldCB2ZXJzaW9uKCkgewogICAgICAgIHJldHVybiAnMi4zLjAnOwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogVHJ1ZSBpZiB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZC4KICAgICAgICAgICAqLwogICAgICAgICAgY2hlY2tlZDogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfY2hlY2tlZENoYW5nZWQnLAogICAgICAgICAgICByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWUKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBJbmRldGVybWluYXRlIHN0YXRlIG9mIHRoZSBjaGVja2JveCB3aGVuIGl0J3MgbmVpdGhlciBjaGVja2VkIG5vciB1bmNoZWNrZWQsIGJ1dCB1bmRldGVybWluZWQuCiAgICAgICAgICAgKiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9IVE1ML0VsZW1lbnQvaW5wdXQvY2hlY2tib3gjSW5kZXRlcm1pbmF0ZV9zdGF0ZV9jaGVja2JveGVzCiAgICAgICAgICAgKi8KICAgICAgICAgIGluZGV0ZXJtaW5hdGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ19pbmRldGVybWluYXRlQ2hhbmdlZCcsCiAgICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogVGhlIHZhbHVlIGdpdmVuIHRvIHRoZSBkYXRhIHN1Ym1pdHRlZCB3aXRoIHRoZSBjaGVja2JveCdzIG5hbWUgdG8gdGhlIHNlcnZlciB3aGVuIHRoZSBjb250cm9sIGlzIGluc2lkZSBhIGZvcm0uCiAgICAgICAgICAgKi8KICAgICAgICAgIHZhbHVlOiB7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgdmFsdWU6ICdvbicKICAgICAgICAgIH0sCgogICAgICAgICAgX25hdGl2ZUNoZWNrYm94OiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdAogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQHR5cGUge3N0cmluZ30KICAgICAgICAgKiBOYW1lIG9mIHRoZSBlbGVtZW50LgogICAgICAgICAqLwogICAgICAgIHRoaXMubmFtZTsKICAgICAgfQoKICAgICAgZ2V0IG5hbWUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuY2hlY2tlZCA/IHRoaXMuX3N0b3JlZE5hbWUgOiAnJzsKICAgICAgfQoKICAgICAgc2V0IG5hbWUobmFtZSkgewogICAgICAgIHRoaXMuX3N0b3JlZE5hbWUgPSBuYW1lOwogICAgICB9CgogICAgICByZWFkeSgpIHsKICAgICAgICBzdXBlci5yZWFkeSgpOwoKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgncm9sZScsICdjaGVja2JveCcpOwoKICAgICAgICB0aGlzLl9uYXRpdmVDaGVja2JveCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dFt0eXBlPSJjaGVja2JveCJdJyk7CgogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9oYW5kbGVDbGljay5iaW5kKHRoaXMpKTsKCiAgICAgICAgdGhpcy5fYWRkQWN0aXZlTGlzdGVuZXJzKCk7CgogICAgICAgIGNvbnN0IGF0dHJOYW1lID0gdGhpcy5nZXRBdHRyaWJ1dGUoJ25hbWUnKTsKICAgICAgICBpZiAoYXR0ck5hbWUpIHsKICAgICAgICAgIHRoaXMubmFtZSA9IGF0dHJOYW1lOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0ibGFiZWwiXScpLnF1ZXJ5U2VsZWN0b3IoJ3Nsb3QnKQogICAgICAgICAgLmFkZEV2ZW50TGlzdGVuZXIoJ3Nsb3RjaGFuZ2UnLCB0aGlzLl91cGRhdGVMYWJlbEF0dHJpYnV0ZS5iaW5kKHRoaXMpKTsKCiAgICAgICAgdGhpcy5fdXBkYXRlTGFiZWxBdHRyaWJ1dGUoKTsKICAgICAgfQoKICAgICAgX3VwZGF0ZUxhYmVsQXR0cmlidXRlKCkgewogICAgICAgIGNvbnN0IGxhYmVsID0gdGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj0ibGFiZWwiXScpOwogICAgICAgIGNvbnN0IGFzc2lnbmVkTm9kZXMgPSBsYWJlbC5maXJzdEVsZW1lbnRDaGlsZC5hc3NpZ25lZE5vZGVzKCk7CiAgICAgICAgaWYgKHRoaXMuX2lzQXNzaWduZWROb2Rlc0VtcHR5KGFzc2lnbmVkTm9kZXMpKSB7CiAgICAgICAgICBsYWJlbC5zZXRBdHRyaWJ1dGUoJ2VtcHR5JywgJycpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBsYWJlbC5yZW1vdmVBdHRyaWJ1dGUoJ2VtcHR5Jyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfaXNBc3NpZ25lZE5vZGVzRW1wdHkobm9kZXMpIHsKICAgICAgICAvLyBUaGUgYXNzaWduZWQgbm9kZXMgY29uc2lkZXJlZCB0byBiZSBlbXB0eSBpZiB0aGVyZSBpcyBubyBzbG90dGVkIGNvbnRlbnQgb3Igb25seSBvbmUgZW1wdHkgdGV4dCBub2RlCiAgICAgICAgcmV0dXJuIG5vZGVzLmxlbmd0aCA9PT0gMCB8fAogICAgICAgICAgICAgIChub2Rlcy5sZW5ndGggPT0gMQogICAgICAgICAgICAgICYmIG5vZGVzWzBdLm5vZGVUeXBlID09IE5vZGUuVEVYVF9OT0RFCiAgICAgICAgICAgICAgJiYgbm9kZXNbMF0udGV4dENvbnRlbnQudHJpbSgpID09PSAnJyk7CiAgICAgIH0KCiAgICAgIF9jaGVja2VkQ2hhbmdlZChjaGVja2VkKSB7CiAgICAgICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FyaWEtY2hlY2tlZCcsICdtaXhlZCcpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywgQm9vbGVhbihjaGVja2VkKSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfaW5kZXRlcm1pbmF0ZUNoYW5nZWQoaW5kZXRlcm1pbmF0ZSkgewogICAgICAgIGlmIChpbmRldGVybWluYXRlKSB7CiAgICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZSgnYXJpYS1jaGVja2VkJywgJ21peGVkJyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdhcmlhLWNoZWNrZWQnLCB0aGlzLmNoZWNrZWQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2FkZEFjdGl2ZUxpc3RlbmVycygpIHsKICAgICAgICAvLyBET1dOCiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lclRvTm9kZSh0aGlzLCAnZG93bicsIChlKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQoZSkpIHsKICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gVVAKICAgICAgICB0aGlzLl9hZGRFdmVudExpc3RlbmVyVG9Ob2RlKHRoaXMsICd1cCcsICgpID0+IHRoaXMucmVtb3ZlQXR0cmlidXRlKCdhY3RpdmUnKSk7CgogICAgICAgIC8vIEtFWURPV04KICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCBlID0+IHsKICAgICAgICAgIGlmICh0aGlzLl9faW50ZXJhY3Rpb25zQWxsb3dlZChlKSAmJiBlLmtleUNvZGUgPT09IDMyKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUoJ2FjdGl2ZScsICcnKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgLy8gS0VZVVAKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgZSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5fX2ludGVyYWN0aW9uc0FsbG93ZWQoZSkgJiYgZS5rZXlDb2RlID09PSAzMikgewogICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNoZWNrZWQoKTsKICAgICAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGUoJ2FjdGl2ZScpOwoKICAgICAgICAgICAgaWYgKHRoaXMuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8qKiBAcHJvdGVjdGVkICovCiAgICAgIGdldCBmb2N1c0VsZW1lbnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVHJ1ZSBpZiB1c2VycycgaW50ZXJhY3Rpb25zIChtb3VzZSBvciBrZXlib2FyZCkKICAgICAgICogc2hvdWxkIHRvZ2dsZSB0aGUgY2hlY2tib3gKICAgICAgICovCiAgICAgIF9faW50ZXJhY3Rpb25zQWxsb3dlZChlKSB7CiAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CgogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92YWFkaW4vdmFhZGluLWNoZWNrYm94L2lzc3Vlcy82MwogICAgICAgIGlmIChlLnRhcmdldC5sb2NhbE5hbWUgPT09ICdhJykgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIF9oYW5kbGVDbGljayhlKSB7CiAgICAgICAgaWYgKHRoaXMuX19pbnRlcmFjdGlvbnNBbGxvd2VkKGUpKSB7CiAgICAgICAgICBpZiAoIXRoaXMuaW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgICBpZiAoZS5jb21wb3NlZFBhdGgoKVswXSAhPT0gdGhpcy5fbmF0aXZlQ2hlY2tib3gpIHsKICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2hlY2tlZCgpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAvKgogICAgICAgICAgICAgKiBSZXF1aXJlZCBmb3IgSUUgMTEgYW5kIEVkZ2UuCiAgICAgICAgICAgICAqIFNlZSBpc3N1ZSBoZXJlOiBodHRwczovL2RldmVsb3Blci5taWNyb3NvZnQuY29tL2VuLXVzL21pY3Jvc29mdC1lZGdlL3BsYXRmb3JtL2lzc3Vlcy83MzQ0NDE4LwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5pbmRldGVybWluYXRlID0gZmFsc2U7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2hlY2tlZCgpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX3RvZ2dsZUNoZWNrZWQoKSB7CiAgICAgICAgdGhpcy5jaGVja2VkID0gIXRoaXMuY2hlY2tlZDsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjaGFuZ2UnLCB7Y29tcG9zZWQ6IGZhbHNlLCBidWJibGVzOiB0cnVlfSkpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogRmlyZWQgd2hlbiB0aGUgdXNlciBjb21taXRzIGEgdmFsdWUgY2hhbmdlLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgY2hhbmdlCiAgICAgICAqLwogICAgfQoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShDaGVja2JveEVsZW1lbnQuaXMsIENoZWNrYm94RWxlbWVudCk7CgogICAgY29uc3QgJF9kb2N1bWVudENvbnRhaW5lciRjID0gaHRtbGA8ZG9tLW1vZHVsZSBpZD0ibHVtby1ncmlkIiB0aGVtZS1mb3I9InZhYWRpbi1ncmlkIj4KICA8dGVtcGxhdGU+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS1tKTsKICAgICAgICBsaW5lLWhlaWdodDogdmFyKC0tbHVtby1saW5lLWhlaWdodC1zKTsKICAgICAgICBjb2xvcjogdmFyKC0tbHVtby1ib2R5LXRleHQtY29sb3IpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tYmFzZS1jb2xvcik7CiAgICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7CiAgICAgICAgLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOiB0cmFuc3BhcmVudDsKICAgICAgICAtd2Via2l0LWZvbnQtc21vb3RoaW5nOiBhbnRpYWxpYXNlZDsKICAgICAgICAtbW96LW9zeC1mb250LXNtb290aGluZzogZ3JheXNjYWxlOwoKICAgICAgICAvKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkgKi8KICAgICAgICAtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yOiB2YXIoLS1sdW1vLWNvbnRyYXN0LTIwcGN0KTsKICAgICAgICAtLV9sdW1vLWdyaWQtc2Vjb25kYXJ5LWJvcmRlci1jb2xvcjogdmFyKC0tbHVtby1jb250cmFzdC0xMHBjdCk7CiAgICAgICAgLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aDogMXB4OwogICAgICAgIC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci0xMHBjdCk7CiAgICAgIH0KCiAgICAgIC8qIE5vIChvdXRlcikgYm9yZGVyICovCgogICAgICA6aG9zdCg6bm90KFt0aGVtZX49Im5vLWJvcmRlciJdKSkgewogICAgICAgIGJvcmRlcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLyogQ2VsbCBzdHlsZXMgKi8KCiAgICAgIFtwYXJ0fj0iY2VsbCJdIHsKICAgICAgICBtaW4taGVpZ2h0OiB2YXIoLS1sdW1vLXNpemUtbSk7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJjZWxsIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIGN1cnNvcjogZGVmYXVsdDsKICAgICAgICBwYWRkaW5nOiB2YXIoLS1sdW1vLXNwYWNlLXhzKSB2YXIoLS1sdW1vLXNwYWNlLW0pOwogICAgICB9CgogICAgICAvKiBBcHBseSByb3cgYm9yZGVycyBieSBkZWZhdWx0IGFuZCBpbnRyb2R1Y2UgdGhlICJuby1yb3ctYm9yZGVycyIgdmFyaWFudCAqLwogICAgICA6aG9zdCg6bm90KFt0aGVtZX49Im5vLXJvdy1ib3JkZXJzIl0pKSBbcGFydH49ImNlbGwiXTpub3QoW3BhcnR+PSJkZXRhaWxzLWNlbGwiXSkgewogICAgICAgIGJvcmRlci10b3A6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgICB9CgogICAgICAvKiBIaWRlIGZpcnN0IGJvZHkgcm93IHRvcCBib3JkZXIgKi8KICAgICAgOmhvc3QoOm5vdChbdGhlbWV+PSJuby1yb3ctYm9yZGVycyJdKSkgW3BhcnQ9InJvdyJdW2ZpcnN0XSBbcGFydH49ImNlbGwiXTpub3QoW3BhcnR+PSJkZXRhaWxzLWNlbGwiXSkgewogICAgICAgIGJvcmRlci10b3A6IDA7CiAgICAgICAgbWluLWhlaWdodDogY2FsYyh2YXIoLS1sdW1vLXNpemUtbSkgLSB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkpOwogICAgICB9CgogICAgICAvKiBGb2N1cy1yaW5nICovCgogICAgICBbcGFydH49ImNlbGwiXTpmb2N1cyB7CiAgICAgICAgb3V0bGluZTogbm9uZTsKICAgICAgfQoKICAgICAgOmhvc3QoW25hdmlnYXRpbmddKSBbcGFydH49ImNlbGwiXTpmb2N1czo6YmVmb3JlIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgICB9CgogICAgICAvKiBEcmFnIGFuZCBEcm9wIHN0eWxlcyAqLwogICAgICA6aG9zdChbZHJhZ292ZXJdKTo6YWZ0ZXIgewogICAgICAgIGNvbnRlbnQ6ICIiOwogICAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgICAgICB6LWluZGV4OiAxMDA7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGJveC1zaGFkb3c6IGluc2V0IDAgMCAwIDJweCB2YXIoLS1sdW1vLXByaW1hcnktY29sb3ItNTBwY3QpOwogICAgICB9CgogICAgICBbcGFydH49InJvdyJdW2RyYWdvdmVyXSB7CiAgICAgICAgei1pbmRleDogMTAwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIFtwYXJ0fj0icm93Il1bZHJhZ292ZXJdIFtwYXJ0fj0iY2VsbCJdIHsKICAgICAgICBvdmVyZmxvdzogdmlzaWJsZTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyb3ciXVtkcmFnb3Zlcl0gW3BhcnR+PSJjZWxsIl06OmFmdGVyIHsKICAgICAgICBjb250ZW50OiAiIjsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgdG9wOiAwOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIGJvdHRvbTogMDsKICAgICAgICBsZWZ0OiAwOwogICAgICAgIGhlaWdodDogY2FsYyh2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgKyAycHgpOwogICAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt0aGVtZX49Im5vLXJvdy1ib3JkZXJzIl0pIFtkcmFnb3Zlcl0gW3BhcnR+PSJjZWxsIl06OmFmdGVyIHsKICAgICAgICBoZWlnaHQ6IDJweDsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyb3ciXVtkcmFnb3Zlcj0iYmVsb3ciXSBbcGFydH49ImNlbGwiXTo6YWZ0ZXIgewogICAgICAgIHRvcDogMTAwJTsKICAgICAgICBib3R0b206IGF1dG87CiAgICAgICAgbWFyZ2luLXRvcDogLTFweDsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyb3ciXVtkcmFnb3Zlcj0iYWJvdmUiXSBbcGFydH49ImNlbGwiXTo6YWZ0ZXIgewogICAgICAgIHRvcDogYXV0bzsKICAgICAgICBib3R0b206IDEwMCU7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogLTFweDsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyb3ciXVtkZXRhaWxzLW9wZW5lZF1bZHJhZ292ZXI9ImJlbG93Il0gW3BhcnR+PSJjZWxsIl06bm90KFtwYXJ0fj0iZGV0YWlscy1jZWxsIl0pOjphZnRlciwKICAgICAgW3BhcnR+PSJyb3ciXVtkZXRhaWxzLW9wZW5lZF1bZHJhZ292ZXI9ImFib3ZlIl0gW3BhcnR+PSJkZXRhaWxzLWNlbGwiXTo6YWZ0ZXIgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KCiAgICAgIFtwYXJ0fj0icm93Il1bZHJhZ292ZXJdW2RyYWdvdmVyPSJvbi10b3AiXSBbcGFydH49ImNlbGwiXTo6YWZ0ZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyb3ciXVtkcmFnc3RhcnRdIHsKICAgICAgICAvKiBBZGQgYm90dG9tLXNwYWNlIHRvIHRoZSByb3cgc28gdGhlIGRyYWcgbnVtYmVyIGRvZXNuJ3QgZ2V0IGNsaXBwZWQuIE5lZWRlZCBmb3IgSUUvRWRnZSAqLwogICAgICAgIGJvcmRlci1ib3R0b206IDEwMHB4IHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIHotaW5kZXg6IDEwMCAhaW1wb3J0YW50OwogICAgICAgIG9wYWNpdHk6IDAuOTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyb3ciXVtkcmFnc3RhcnRdIFtwYXJ0fj0iY2VsbCJdIHsKICAgICAgICBib3JkZXI6IG5vbmUgIWltcG9ydGFudDsKICAgICAgICBib3gtc2hhZG93OiBub25lICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIFtwYXJ0fj0icm93Il1bZHJhZ3N0YXJ0XSBbcGFydH49ImNlbGwiXVtsYXN0LWNvbHVtbl0gewogICAgICAgIGJvcmRlci1yYWRpdXM6IDAgdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSAwOwogICAgICB9CgogICAgICBbcGFydH49InJvdyJdW2RyYWdzdGFydF0gW3BhcnR+PSJjZWxsIl1bZmlyc3QtY29sdW1uXSB7CiAgICAgICAgYm9yZGVyLXJhZGl1czogdmFyKC0tbHVtby1ib3JkZXItcmFkaXVzLXMpIDAgMCB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcyk7CiAgICAgIH0KCiAgICAgIFtpb3NdIFtwYXJ0fj0icm93Il1bZHJhZ3N0YXJ0XSBbcGFydH49ImNlbGwiXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tbHVtby1wcmltYXJ5LWNvbG9yLTUwcGN0KTsKICAgICAgfQoKICAgICAgI3Njcm9sbGVyOm5vdChbaW9zXSkgW3BhcnR+PSJyb3ciXVtkcmFnc3RhcnRdOm5vdChbZHJhZ3N0YXJ0PSIiXSk6OmFmdGVyIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgICAgbGVmdDogdmFyKC0tX2dyaWQtZHJhZy1zdGFydC14KTsKICAgICAgICB0b3A6IHZhcigtLV9ncmlkLWRyYWctc3RhcnQteSk7CiAgICAgICAgei1pbmRleDogMTAwOwogICAgICAgIGNvbnRlbnQ6IGF0dHIoZHJhZ3N0YXJ0KTsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyOwogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgcGFkZGluZzogY2FsYyh2YXIoLS1sdW1vLXNwYWNlLXhzKSAqIDAuOCk7CiAgICAgICAgY29sb3I6IHZhcigtLWx1bW8tZXJyb3ItY29udHJhc3QtY29sb3IpOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tZXJyb3ItY29sb3IpOwogICAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1tKTsKICAgICAgICBmb250LWZhbWlseTogdmFyKC0tbHVtby1mb250LWZhbWlseSk7CiAgICAgICAgZm9udC1zaXplOiB2YXIoLS1sdW1vLWZvbnQtc2l6ZS14eHMpOwogICAgICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgICAgIGZvbnQtd2VpZ2h0OiA1MDA7CiAgICAgICAgdGV4dC10cmFuc2Zvcm06IGluaXRpYWw7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IGluaXRpYWw7CiAgICAgICAgbWluLXdpZHRoOiBjYWxjKHZhcigtLWx1bW8tc2l6ZS1zKSAqIDAuNyk7CiAgICAgICAgdGV4dC1hbGlnbjogY2VudGVyOwogICAgICB9CgogICAgICAvKiBIZWFkZXJzIGFuZCBmb290ZXJzICovCgogICAgICBbcGFydH49ImhlYWRlci1jZWxsIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCksCiAgICAgIFtwYXJ0fj0iZm9vdGVyLWNlbGwiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSwKICAgICAgW3BhcnR+PSJyZW9yZGVyLWdob3N0Il0gewogICAgICAgIGZvbnQtc2l6ZTogdmFyKC0tbHVtby1mb250LXNpemUtcyk7CiAgICAgICAgZm9udC13ZWlnaHQ6IDUwMDsKICAgICAgfQoKICAgICAgW3BhcnR+PSJmb290ZXItY2VsbCJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpIHsKICAgICAgICBmb250LXdlaWdodDogNDAwOwogICAgICB9CgogICAgICBbcGFydD0icm93Il06b25seS1jaGlsZCBbcGFydH49ImhlYWRlci1jZWxsIl0gewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWx1bW8tc2l6ZS14bCk7CiAgICAgIH0KCiAgICAgIC8qIEhlYWRlciBib3JkZXJzICovCgogICAgICAvKiBIaWRlIGZpcnN0IGhlYWRlciByb3cgdG9wIGJvcmRlciAqLwogICAgICA6aG9zdCg6bm90KFt0aGVtZX49Im5vLXJvdy1ib3JkZXJzIl0pKSBbcGFydD0icm93Il06Zmlyc3QtY2hpbGQgW3BhcnR+PSJoZWFkZXItY2VsbCJdIHsKICAgICAgICBib3JkZXItdG9wOiAwOwogICAgICB9CgogICAgICBbcGFydD0icm93Il06bGFzdC1jaGlsZCBbcGFydH49ImhlYWRlci1jZWxsIl0gewogICAgICAgIGJvcmRlci1ib3R0b206IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbdGhlbWV+PSJuby1yb3ctYm9yZGVycyJdKSkgW3BhcnQ9InJvdyJdOmxhc3QtY2hpbGQgW3BhcnR+PSJoZWFkZXItY2VsbCJdIHsKICAgICAgICBib3JkZXItYm90dG9tLWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgICB9CgogICAgICAvKiBPdmVyZmxvdyB1c2VzIGEgc3Ryb25nZXIgYm9yZGVyIGNvbG9yICovCiAgICAgIDpob3N0KFtvdmVyZmxvd349InRvcCJdKSBbcGFydD0icm93Il06bGFzdC1jaGlsZCBbcGFydH49ImhlYWRlci1jZWxsIl0gewogICAgICAgIGJvcmRlci1ib3R0b20tY29sb3I6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLyogRm9vdGVyIGJvcmRlcnMgKi8KCiAgICAgIFtwYXJ0PSJyb3ciXTpmaXJzdC1jaGlsZCBbcGFydH49ImZvb3Rlci1jZWxsIl0gewogICAgICAgIGJvcmRlci10b3A6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB0cmFuc3BhcmVudDsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbdGhlbWV+PSJuby1yb3ctYm9yZGVycyJdKSkgW3BhcnQ9InJvdyJdOmZpcnN0LWNoaWxkIFtwYXJ0fj0iZm9vdGVyLWNlbGwiXSB7CiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLyogT3ZlcmZsb3cgdXNlcyBhIHN0cm9uZ2VyIGJvcmRlciBjb2xvciAqLwogICAgICA6aG9zdChbb3ZlcmZsb3d+PSJib3R0b20iXSkgW3BhcnQ9InJvdyJdOmZpcnN0LWNoaWxkIFtwYXJ0fj0iZm9vdGVyLWNlbGwiXSB7CiAgICAgICAgYm9yZGVyLXRvcC1jb2xvcjogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItY29sb3IpOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gcmVvcmRlcmluZyAqLwoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49ImNlbGwiXSB7CiAgICAgICAgYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHZhcigtLWx1bW8tc2hhZGUtMjBwY3QpLCB2YXIoLS1sdW1vLXNoYWRlLTIwcGN0KSkgdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49ImNlbGwiXVtyZW9yZGVyLXN0YXR1cz0iYWxsb3dlZCJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiB2YXIoLS1sdW1vLWJhc2UtY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdChbcmVvcmRlcmluZ10pIFtwYXJ0fj0iY2VsbCJdW3Jlb3JkZXItc3RhdHVzPSJkcmFnZ2luZyJdIHsKICAgICAgICBiYWNrZ3JvdW5kOiBsaW5lYXItZ3JhZGllbnQodmFyKC0tbHVtby1jb250cmFzdC01cGN0KSwgdmFyKC0tbHVtby1jb250cmFzdC01cGN0KSkgdmFyKC0tbHVtby1iYXNlLWNvbG9yKTsKICAgICAgfQoKICAgICAgW3BhcnR+PSJyZW9yZGVyLWdob3N0Il0gewogICAgICAgIG9wYWNpdHk6IDAuODU7CiAgICAgICAgYm94LXNoYWRvdzogdmFyKC0tbHVtby1ib3gtc2hhZG93LXMpOwogICAgICAgIC8qIFRPRE8gVXNlIHRoZSBzYW1lIHN0eWxlcyBhcyBmb3IgdGhlIGNlbGwgZWxlbWVudCAocmVvcmRlci1naG9zdCBjb3BpZXMgc3R5bGVzIGZyb20gdGhlIGNlbGwgZWxlbWVudCkgKi8KICAgICAgICBwYWRkaW5nOiB2YXIoLS1sdW1vLXNwYWNlLXMpIHZhcigtLWx1bW8tc3BhY2UtbSkgIWltcG9ydGFudDsKICAgICAgfQoKICAgICAgLyogQ29sdW1uIHJlc2l6aW5nICovCgogICAgICBbcGFydD0icmVzaXplLWhhbmRsZSJdIHsKICAgICAgICB3aWR0aDogM3B4OwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWx1bW8tcHJpbWFyeS1jb2xvci01MHBjdCk7CiAgICAgICAgb3BhY2l0eTogMDsKICAgICAgICB0cmFuc2l0aW9uOiBvcGFjaXR5IDAuMnM7CiAgICAgIH0KCiAgICAgIDpob3N0KDpub3QoW3Jlb3JkZXJpbmddKSkgKjpub3QoW2NvbHVtbi1yZXNpemluZ10pIFtwYXJ0fj0iY2VsbCJdOmhvdmVyIFtwYXJ0PSJyZXNpemUtaGFuZGxlIl0sCiAgICAgIFtwYXJ0PSJyZXNpemUtaGFuZGxlIl06YWN0aXZlIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICAgIHRyYW5zaXRpb24tZGVsYXk6IDAuMTVzOwogICAgICB9CgogICAgICAvKiBDb2x1bW4gYm9yZGVycyAqLwoKICAgICAgOmhvc3QoW3RoZW1lfj0iY29sdW1uLWJvcmRlcnMiXSkgW3BhcnR+PSJjZWxsIl06bm90KFtsYXN0LWNvbHVtbl0pOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tX2x1bW8tZ3JpZC1zZWNvbmRhcnktYm9yZGVyLWNvbG9yKTsKICAgICAgfQoKICAgICAgLyogRnJvemVuIGNvbHVtbnMgKi8KCiAgICAgIFtsYXN0LWZyb3plbl0gewogICAgICAgIGJvcmRlci1yaWdodDogdmFyKC0tX2x1bW8tZ3JpZC1ib3JkZXItd2lkdGgpIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KCiAgICAgIDpob3N0KFtvdmVyZmxvd349ImxlZnQiXSkgW3BhcnR+PSJjZWxsIl1bbGFzdC1mcm96ZW5dOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0LWNvbG9yOiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci1jb2xvcik7CiAgICAgIH0KCiAgICAgIC8qIFJvdyBzdHJpcGVzICovCgogICAgICA6aG9zdChbdGhlbWV+PSJyb3ctc3RyaXBlcyJdKSBbcGFydH49InJvdyJdOm5vdChbb2RkXSkgW3BhcnR+PSJib2R5LWNlbGwiXSwKICAgICAgOmhvc3QoW3RoZW1lfj0icm93LXN0cmlwZXMiXSkgW3BhcnR+PSJyb3ciXTpub3QoW29kZF0pIFtwYXJ0fj0iZGV0YWlscy1jZWxsIl0gewogICAgICAgIGJhY2tncm91bmQtaW1hZ2U6IGxpbmVhci1ncmFkaWVudCh2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpLCB2YXIoLS1sdW1vLWNvbnRyYXN0LTVwY3QpKTsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0LXg7CiAgICAgIH0KCiAgICAgIC8qIFNlbGVjdGVkIHJvdyAqLwoKICAgICAgLyogUmFpc2UgdGhlIHNlbGVjdGVkIHJvd3MgYWJvdmUgdW5zZWxlY3RlZCByb3dzIChzbyB0aGF0IGJveC1zaGFkb3cgY2FuIGNvdmVyIHVuc2VsZWN0ZWQgcm93cykgKi8KICAgICAgOmhvc3QoOm5vdChbcmVvcmRlcmluZ10pKSBbcGFydH49InJvdyJdW3NlbGVjdGVkXSB7CiAgICAgICAgei1pbmRleDogMTsKICAgICAgfQoKICAgICAgOmhvc3QoOm5vdChbcmVvcmRlcmluZ10pKSBbcGFydH49InJvdyJdW3NlbGVjdGVkXSBbcGFydH49ImJvZHktY2VsbCJdOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKSB7CiAgICAgICAgYmFja2dyb3VuZC1pbWFnZTogbGluZWFyLWdyYWRpZW50KHZhcigtLV9sdW1vLWdyaWQtc2VsZWN0ZWQtcm93LWNvbG9yKSwgdmFyKC0tX2x1bW8tZ3JpZC1zZWxlY3RlZC1yb3ctY29sb3IpKTsKICAgICAgICBiYWNrZ3JvdW5kLXJlcGVhdDogcmVwZWF0OwogICAgICB9CgogICAgICAvKiBDb3ZlciB0aGUgYm9yZGVyIG9mIGFuIHVuc2VsZWN0ZWQgcm93ICovCiAgICAgIDpob3N0KDpub3QoW3RoZW1lfj0ibm8tcm93LWJvcmRlcnMiXSkpIFtwYXJ0fj0icm93Il1bc2VsZWN0ZWRdIFtwYXJ0fj0iY2VsbCJdOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKSB7CiAgICAgICAgYm94LXNoYWRvdzogMCB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgMCAwIHZhcigtLV9sdW1vLWdyaWQtc2VsZWN0ZWQtcm93LWNvbG9yKTsKICAgICAgfQoKICAgICAgLyogQ29tcGFjdCAqLwoKICAgICAgOmhvc3QoW3RoZW1lfj0iY29tcGFjdCJdKSBbcGFydD0icm93Il06b25seS1jaGlsZCBbcGFydH49ImhlYWRlci1jZWxsIl0gewogICAgICAgIG1pbi1oZWlnaHQ6IHZhcigtLWx1bW8tc2l6ZS1tKTsKICAgICAgfQoKICAgICAgOmhvc3QoW3RoZW1lfj0iY29tcGFjdCJdKSBbcGFydH49ImNlbGwiXSB7CiAgICAgICAgbWluLWhlaWdodDogdmFyKC0tbHVtby1zaXplLXMpOwogICAgICB9CgogICAgICA6aG9zdChbdGhlbWV+PSJjb21wYWN0Il0pIFtwYXJ0PSJyb3ciXVtmaXJzdF0gW3BhcnR+PSJjZWxsIl06bm90KFtwYXJ0fj0iZGV0YWlscy1jZWxsIl0pIHsKICAgICAgICBtaW4taGVpZ2h0OiBjYWxjKHZhcigtLWx1bW8tc2l6ZS1zKSAtIHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSk7CiAgICAgIH0KCiAgICAgIDpob3N0KFt0aGVtZX49ImNvbXBhY3QiXSkgW3BhcnR+PSJjZWxsIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHBhZGRpbmc6IHZhcigtLWx1bW8tc3BhY2UteHMpIHZhcigtLWx1bW8tc3BhY2Utcyk7CiAgICAgIH0KCiAgICAgIC8qIFdyYXAgY2VsbCBjb250ZW50cyAqLwoKICAgICAgOmhvc3QoW3RoZW1lfj0id3JhcC1jZWxsLWNvbnRlbnQiXSkgW3BhcnR+PSJjZWxsIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgIH0KCiAgICAgIC8qIFJUTCBzcGVjaWZpYyBzdHlsZXMgKi8KCiAgICAgIDpob3N0KFtkaXI9InJ0bCJdKSBbcGFydH49InJvdyJdW2RyYWdzdGFydF0gW3BhcnR+PSJjZWxsIl1bbGFzdC1jb2x1bW5dIHsKICAgICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMCAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKTsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpcj0icnRsIl0pIFtwYXJ0fj0icm93Il1bZHJhZ3N0YXJ0XSBbcGFydH49ImNlbGwiXVtmaXJzdC1jb2x1bW5dIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIHZhcigtLWx1bW8tYm9yZGVyLXJhZGl1cy1zKSB2YXIoLS1sdW1vLWJvcmRlci1yYWRpdXMtcykgMDsKICAgICAgfQoKICAgICAgOmhvc3QoW2Rpcj0icnRsIl1bdGhlbWV+PSJjb2x1bW4tYm9yZGVycyJdKSBbcGFydH49ImNlbGwiXTpub3QoW2xhc3QtY29sdW1uXSk6bm90KFtwYXJ0fj0iZGV0YWlscy1jZWxsIl0pIHsKICAgICAgICBib3JkZXItcmlnaHQ6IG5vbmU7CiAgICAgICAgYm9yZGVyLWxlZnQ6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLXdpZHRoKSBzb2xpZCB2YXIoLS1fbHVtby1ncmlkLXNlY29uZGFyeS1ib3JkZXItY29sb3IpOwogICAgICB9CgogICAgICA6aG9zdChbZGlyPSJydGwiXSkgW2xhc3QtZnJvemVuXSB7CiAgICAgICAgYm9yZGVyLXJpZ2h0OiBub25lOwogICAgICAgIGJvcmRlci1sZWZ0OiB2YXIoLS1fbHVtby1ncmlkLWJvcmRlci13aWR0aCkgc29saWQgdHJhbnNwYXJlbnQ7CiAgICAgIH0KCiAgICAgIDpob3N0KFtkaXI9InJ0bCJdW292ZXJmbG93fj0icmlnaHQiXSkgW3BhcnR+PSJjZWxsIl1bbGFzdC1mcm96ZW5dOm5vdChbcGFydH49ImRldGFpbHMtY2VsbCJdKSB7CiAgICAgICAgYm9yZGVyLWxlZnQtY29sb3I6IHZhcigtLV9sdW1vLWdyaWQtYm9yZGVyLWNvbG9yKTsKICAgICAgfQogICAgPC9zdHlsZT4KICA8L3RlbXBsYXRlPgo8L2RvbS1tb2R1bGU+PGRvbS1tb2R1bGUgdGhlbWUtZm9yPSJ2YWFkaW4tY2hlY2tib3giIGlkPSJ2YWFkaW4tZ3JpZC1zZWxlY3QtYWxsLWNoZWNrYm94LWx1bW8iPgogIDx0ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QoLnZhYWRpbi1ncmlkLXNlbGVjdC1hbGwtY2hlY2tib3gpIHsKICAgICAgICBmb250LXNpemU6IHZhcigtLWx1bW8tZm9udC1zaXplLW0pOwogICAgICB9CiAgIDwvc3R5bGU+CiAgPC90ZW1wbGF0ZT4KPC9kb20tbW9kdWxlPmA7CgogICAgZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCgkX2RvY3VtZW50Q29udGFpbmVyJGMuY29udGVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE2IFRoZSBQb2x5bWVyIFByb2plY3QgQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICAgIFRoaXMgY29kZSBtYXkgb25seSBiZSB1c2VkIHVuZGVyIHRoZSBCU0Qgc3R5bGUgbGljZW5zZSBmb3VuZCBhdCBodHRwOi8vcG9seW1lci5naXRodWIuaW8vTElDRU5TRS50eHQKICAgIFRoZSBjb21wbGV0ZSBzZXQgb2YgYXV0aG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0FVVEhPUlMudHh0CiAgICBUaGUgY29tcGxldGUgc2V0IG9mIGNvbnRyaWJ1dG9ycyBtYXkgYmUgZm91bmQgYXQgaHR0cDovL3BvbHltZXIuZ2l0aHViLmlvL0NPTlRSSUJVVE9SUy50eHQKICAgIENvZGUgZGlzdHJpYnV0ZWQgYnkgR29vZ2xlIGFzIHBhcnQgb2YgdGhlIHBvbHltZXIgcHJvamVjdCBpcyBhbHNvCiAgICBzdWJqZWN0IHRvIGFuIGFkZGl0aW9uYWwgSVAgcmlnaHRzIGdyYW50IGZvdW5kIGF0IGh0dHA6Ly9wb2x5bWVyLmdpdGh1Yi5pby9QQVRFTlRTLnR4dAogICAgKi8KICAgIHZhciBJT1MkMSA9IG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL2lQKD86aG9uZXxhZDsoPzogVTspPyBDUFUpIE9TIChcZCspLyk7CiAgICB2YXIgSU9TX1RPVUNIX1NDUk9MTElORyQxID0gSU9TJDEgJiYgSU9TJDFbMV0gPj0gODsKICAgIHZhciBERUZBVUxUX1BIWVNJQ0FMX0NPVU5UJDEgPSAzOwogICAgdmFyIEFOSU1BVElPTl9GUkFNRSA9IGFuaW1hdGlvbkZyYW1lOwogICAgdmFyIElETEVfVElNRSA9IGlkbGVQZXJpb2Q7CiAgICB2YXIgTUlDUk9fVEFTSyA9IG1pY3JvVGFzazsKCiAgICBjb25zdCBQb2x5bWVySXJvbkxpc3QgPSBDbGFzcyh7CgogICAgICBiZWhhdmlvcnM6IFsKICAgICAgICBJcm9uUmVzaXphYmxlQmVoYXZpb3IsCiAgICAgICAgSXJvblNjcm9sbFRhcmdldEJlaGF2aW9yCiAgICAgIF0sCgogICAgICAvKioKICAgICAgICogVGhlIHJhdGlvIG9mIGhpZGRlbiB0aWxlcyB0aGF0IHNob3VsZCByZW1haW4gaW4gdGhlIHNjcm9sbCBkaXJlY3Rpb24uCiAgICAgICAqIFJlY29tbWVuZGVkIHZhbHVlIH4wLjUsIHNvIGl0IHdpbGwgZGlzdHJpYnV0ZSB0aWxlcyBldmVubHkgaW4gYm90aCBkaXJlY3Rpb25zLgogICAgICAgKi8KICAgICAgX3JhdGlvOiAwLjUsCgogICAgICAvKioKICAgICAgICogVGhlIHBhZGRpbmctdG9wIHZhbHVlIGZvciB0aGUgbGlzdC4KICAgICAgICovCiAgICAgIF9zY3JvbGxlclBhZGRpbmdUb3A6IDAsCgogICAgICAvKioKICAgICAgICogVGhpcyB2YWx1ZSBpcyB0aGUgc2FtZSBhcyBgc2Nyb2xsVG9wYC4KICAgICAgICovCiAgICAgIF9zY3JvbGxQb3NpdGlvbjogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgc3VtIG9mIHRoZSBoZWlnaHRzIG9mIGFsbCB0aGUgdGlsZXMgaW4gdGhlIERPTS4KICAgICAgICovCiAgICAgIF9waHlzaWNhbFNpemU6IDAsCgogICAgICAvKioKICAgICAgICogVGhlIGF2ZXJhZ2UgYG9mZnNldEhlaWdodGAgb2YgdGhlIHRpbGVzIG9ic2VydmVkIHRpbGwgbm93LgogICAgICAgKi8KICAgICAgX3BoeXNpY2FsQXZlcmFnZTogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgbnVtYmVyIG9mIHRpbGVzIHdoaWNoIGBvZmZzZXRIZWlnaHRgID4gMCBvYnNlcnZlZCB1bnRpbCBub3cuCiAgICAgICAqLwogICAgICBfcGh5c2ljYWxBdmVyYWdlQ291bnQ6IDAsCgogICAgICAvKioKICAgICAgICogVGhlIFkgcG9zaXRpb24gb2YgdGhlIGl0ZW0gcmVuZGVyZWQgaW4gdGhlIGBfcGh5c2ljYWxTdGFydGAKICAgICAgICogdGlsZSByZWxhdGl2ZSB0byB0aGUgc2Nyb2xsaW5nIGxpc3QuCiAgICAgICAqLwogICAgICBfcGh5c2ljYWxUb3A6IDAsCgogICAgICAvKioKICAgICAgICogVGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KICAgICAgICovCiAgICAgIF92aXJ0dWFsQ291bnQ6IDAsCgogICAgICAvKioKICAgICAgICogVGhlIGVzdGltYXRlZCBzY3JvbGwgaGVpZ2h0IGJhc2VkIG9uIGBfcGh5c2ljYWxBdmVyYWdlYAogICAgICAgKi8KICAgICAgX2VzdFNjcm9sbEhlaWdodDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgc2Nyb2xsIGhlaWdodCBvZiB0aGUgZG9tIG5vZGUKICAgICAgICovCiAgICAgIF9zY3JvbGxIZWlnaHQ6IDAsCgogICAgICAvKioKICAgICAgICogVGhlIGhlaWdodCBvZiB0aGUgbGlzdC4gVGhpcyBpcyByZWZlcnJlZCBhcyB0aGUgdmlld3BvcnQgaW4gdGhlIGNvbnRleHQgb2YgbGlzdC4KICAgICAgICovCiAgICAgIF92aWV3cG9ydEhlaWdodDogMCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgd2lkdGggb2YgdGhlIGxpc3QuIFRoaXMgaXMgcmVmZXJyZWQgYXMgdGhlIHZpZXdwb3J0IGluIHRoZSBjb250ZXh0IG9mIGxpc3QuCiAgICAgICAqLwogICAgICBfdmlld3BvcnRXaWR0aDogMCwKCiAgICAgIC8qKgogICAgICAgKiBBbiBhcnJheSBvZiBET00gbm9kZXMgdGhhdCBhcmUgY3VycmVudGx5IGluIHRoZSB0cmVlCiAgICAgICAqIEB0eXBlIHs/QXJyYXk8IVRlbXBsYXRpemVyTm9kZT59CiAgICAgICAqLwogICAgICBfcGh5c2ljYWxJdGVtczogbnVsbCwKCiAgICAgIC8qKgogICAgICAgKiBBbiBhcnJheSBvZiBoZWlnaHRzIGZvciBlYWNoIGl0ZW0gaW4gYF9waHlzaWNhbEl0ZW1zYAogICAgICAgKiBAdHlwZSB7P0FycmF5PG51bWJlcj59CiAgICAgICAqLwogICAgICBfcGh5c2ljYWxTaXplczogbnVsbCwKCiAgICAgIC8qKgogICAgICAgKiBBIGNhY2hlZCB2YWx1ZSBmb3IgdGhlIGZpcnN0IHZpc2libGUgaW5kZXguCiAgICAgICAqIFNlZSBgZmlyc3RWaXNpYmxlSW5kZXhgCiAgICAgICAqIEB0eXBlIHs/bnVtYmVyfQogICAgICAgKi8KICAgICAgX2ZpcnN0VmlzaWJsZUluZGV4VmFsOiBudWxsLAoKICAgICAgLyoqCiAgICAgICAqIEEgUG9seW1lciBjb2xsZWN0aW9uIGZvciB0aGUgaXRlbXMuCiAgICAgICAqIEB0eXBlIHs/UG9seW1lci5Db2xsZWN0aW9ufQogICAgICAgKi8KICAgICAgX2NvbGxlY3Rpb246IG51bGwsCgogICAgICAvKioKICAgICAgICogQSBjYWNoZWQgdmFsdWUgZm9yIHRoZSBsYXN0IHZpc2libGUgaW5kZXguCiAgICAgICAqIFNlZSBgbGFzdFZpc2libGVJbmRleGAKICAgICAgICogQHR5cGUgez9udW1iZXJ9CiAgICAgICAqLwogICAgICBfbGFzdFZpc2libGVJbmRleFZhbDogbnVsbCwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgbWF4IG51bWJlciBvZiBwYWdlcyB0byByZW5kZXIuIE9uZSBwYWdlIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGhlaWdodCBvZiB0aGUgbGlzdC4KICAgICAgICovCiAgICAgIF9tYXhQYWdlczogMiwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgdmlydHVhbCBpbmRleCBvZiB0aGUgZm9jdXNlZCBpdGVtLgogICAgICAgKi8KICAgICAgX2ZvY3VzZWRWaXJ0dWFsSW5kZXg6IC0xLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBtYXhpbXVtIGl0ZW1zIHBlciByb3cKICAgICAgICovCiAgICAgIF9pdGVtc1BlclJvdzogMSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgaGVpZ2h0IG9mIHRoZSByb3cgaW4gZ3JpZCBsYXlvdXQuCiAgICAgICAqLwogICAgICBfcm93SGVpZ2h0OiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBjb3N0IG9mIHN0YW1waW5nIGEgdGVtcGxhdGUgaW4gbXMuCiAgICAgICAqLwogICAgICBfdGVtcGxhdGVDb3N0OiAwLAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBib3R0b20gb2YgdGhlIHBoeXNpY2FsIGNvbnRlbnQuCiAgICAgICAqLwogICAgICBnZXQgX3BoeXNpY2FsQm90dG9tKCkgewogICAgICAgIHJldHVybiB0aGlzLl9waHlzaWNhbFRvcCArIHRoaXMuX3BoeXNpY2FsU2l6ZTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgYm90dG9tIG9mIHRoZSBzY3JvbGwuCiAgICAgICAqLwogICAgICBnZXQgX3Njcm9sbEJvdHRvbSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fc2Nyb2xsUG9zaXRpb24gKyB0aGlzLl92aWV3cG9ydEhlaWdodDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgbi10aCBpdGVtIHJlbmRlcmVkIGluIHRoZSBsYXN0IHBoeXNpY2FsIGl0ZW0uCiAgICAgICAqLwogICAgICBnZXQgX3ZpcnR1YWxFbmQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCArIHRoaXMuX3BoeXNpY2FsQ291bnQgLSAxOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHBoeXNpY2FsIGNvbnRlbnQgdGhhdCBpc24ndCBvbiB0aGUgc2NyZWVuLgogICAgICAgKi8KICAgICAgZ2V0IF9oaWRkZW5Db250ZW50U2l6ZSgpIHsKICAgICAgICB2YXIgc2l6ZSA9IHRoaXMuZ3JpZCA/IHRoaXMuX3BoeXNpY2FsUm93cyAqIHRoaXMuX3Jvd0hlaWdodCA6IHRoaXMuX3BoeXNpY2FsU2l6ZTsKICAgICAgICByZXR1cm4gc2l6ZSAtIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFRoZSBtYXhpbXVtIHNjcm9sbCB0b3AgdmFsdWUuCiAgICAgICAqLwogICAgICBnZXQgX21heFNjcm9sbFRvcCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0IC0gdGhpcy5fdmlld3BvcnRIZWlnaHQgKyB0aGlzLl9zY3JvbGxPZmZzZXQ7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhlIGxhcmdlc3Qgbi10aCB2YWx1ZSBmb3IgYW4gaXRlbSBzdWNoIHRoYXQgaXQgY2FuIGJlIHJlbmRlcmVkIGluIGBfcGh5c2ljYWxTdGFydGAuCiAgICAgICAqLwogICAgICBnZXQgX21heFZpcnR1YWxTdGFydCgpIHsKICAgICAgICB2YXIgdmlydHVhbENvdW50ID0gdGhpcy5fY29udmVydEluZGV4VG9Db21wbGV0ZVJvdyh0aGlzLl92aXJ0dWFsQ291bnQpOwogICAgICAgIHJldHVybiBNYXRoLm1heCgwLCB2aXJ0dWFsQ291bnQgLSB0aGlzLl9waHlzaWNhbENvdW50KTsKICAgICAgfSwKCiAgICAgIHNldCBfdmlydHVhbFN0YXJ0KHZhbCkgewogICAgICAgIHZhbCA9IHRoaXMuX2NsYW1wKHZhbCwgMCwgdGhpcy5fbWF4VmlydHVhbFN0YXJ0KTsKICAgICAgICBpZiAodGhpcy5ncmlkKSB7CiAgICAgICAgICB2YWwgPSB2YWwgLSAodmFsICUgdGhpcy5faXRlbXNQZXJSb3cpOwogICAgICAgIH0KICAgICAgICB0aGlzLl92aXJ0dWFsU3RhcnRWYWwgPSB2YWw7CiAgICAgIH0sCgogICAgICBnZXQgX3ZpcnR1YWxTdGFydCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmlydHVhbFN0YXJ0VmFsIHx8IDA7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVGhlIGstdGggdGlsZSB0aGF0IGlzIGF0IHRoZSB0b3Agb2YgdGhlIHNjcm9sbGluZyBsaXN0LgogICAgICAgKi8KICAgICAgc2V0IF9waHlzaWNhbFN0YXJ0KHZhbCkgewogICAgICAgIHZhbCA9IHZhbCAlIHRoaXMuX3BoeXNpY2FsQ291bnQ7CiAgICAgICAgaWYgKHZhbCA8IDApIHsKICAgICAgICAgIHZhbCA9IHRoaXMuX3BoeXNpY2FsQ291bnQgKyB2YWw7CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLmdyaWQpIHsKICAgICAgICAgIHZhbCA9IHZhbCAtICh2YWwgJSB0aGlzLl9pdGVtc1BlclJvdyk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWwgPSB2YWw7CiAgICAgIH0sCgogICAgICBnZXQgX3BoeXNpY2FsU3RhcnQoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3BoeXNpY2FsU3RhcnRWYWwgfHwgMDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBUaGUgay10aCB0aWxlIHRoYXQgaXMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc2Nyb2xsaW5nIGxpc3QuCiAgICAgICAqLwogICAgICBnZXQgX3BoeXNpY2FsRW5kKCkgewogICAgICAgIHJldHVybiAodGhpcy5fcGh5c2ljYWxTdGFydCArIHRoaXMuX3BoeXNpY2FsQ291bnQgLSAxKSAlIHRoaXMuX3BoeXNpY2FsQ291bnQ7CiAgICAgIH0sCgogICAgICBzZXQgX3BoeXNpY2FsQ291bnQodmFsKSB7CiAgICAgICAgdGhpcy5fcGh5c2ljYWxDb3VudFZhbCA9IHZhbDsKICAgICAgfSwKCiAgICAgIGdldCBfcGh5c2ljYWxDb3VudCgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcGh5c2ljYWxDb3VudFZhbCB8fCAwOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEFuIG9wdGltYWwgcGh5c2ljYWwgc2l6ZSBzdWNoIHRoYXQgd2Ugd2lsbCBoYXZlIGVub3VnaCBwaHlzaWNhbCBpdGVtcwogICAgICAgKiB0byBmaWxsIHVwIHRoZSB2aWV3cG9ydCBhbmQgcmVjeWNsZSB3aGVuIHRoZSB1c2VyIHNjcm9sbHMuCiAgICAgICAqCiAgICAgICAqIFRoaXMgZGVmYXVsdCB2YWx1ZSBhc3N1bWVzIHRoYXQgd2Ugd2lsbCBhdCBsZWFzdCBoYXZlIHRoZSBlcXVpdmFsZW50CiAgICAgICAqIHRvIGEgdmlld3BvcnQgb2YgcGh5c2ljYWwgaXRlbXMgYWJvdmUgYW5kIGJlbG93IHRoZSB1c2VyJ3Mgdmlld3BvcnQuCiAgICAgICAqLwogICAgICBnZXQgX29wdFBoeXNpY2FsU2l6ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fdmlld3BvcnRIZWlnaHQgPT09IDAgPyBJbmZpbml0eSA6IHRoaXMuX3ZpZXdwb3J0SGVpZ2h0ICogdGhpcy5fbWF4UGFnZXM7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVHJ1ZSBpZiB0aGUgY3VycmVudCBsaXN0IGlzIHZpc2libGUuCiAgICAgICAqLwogICAgICBnZXQgX2lzVmlzaWJsZSgpIHsKICAgICAgICByZXR1cm4gQm9vbGVhbih0aGlzLm9mZnNldFdpZHRoIHx8IHRoaXMub2Zmc2V0SGVpZ2h0KTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdmlzaWJsZSBpdGVtIGluIHRoZSB2aWV3cG9ydC4KICAgICAgICoKICAgICAgICogQHR5cGUge251bWJlcn0KICAgICAgICovCiAgICAgIGdldCBmaXJzdFZpc2libGVJbmRleCgpIHsKICAgICAgICB2YXIgaWR4ID0gdGhpcy5fZmlyc3RWaXNpYmxlSW5kZXhWYWw7CiAgICAgICAgaWYgKGlkeCA9PSBudWxsKSB7CiAgICAgICAgICB2YXIgcGh5c2ljYWxPZmZzZXQgPSB0aGlzLl9waHlzaWNhbFRvcCArIHRoaXMuX3Njcm9sbE9mZnNldDsKCiAgICAgICAgICBpZHggPSB0aGlzLl9pdGVyYXRlSXRlbXMoZnVuY3Rpb24ocGlkeCwgdmlkeCkgewogICAgICAgICAgICBwaHlzaWNhbE9mZnNldCArPSB0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocGlkeCk7CgogICAgICAgICAgICBpZiAocGh5c2ljYWxPZmZzZXQgPiB0aGlzLl9zY3JvbGxQb3NpdGlvbikgewogICAgICAgICAgICAgIHJldHVybiB0aGlzLmdyaWQgPyB2aWR4IC0gKHZpZHggJSB0aGlzLl9pdGVtc1BlclJvdykgOiB2aWR4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEhhbmRsZSBhIHBhcnRpYWxseSByZW5kZXJlZCBmaW5hbCByb3cgaW4gZ3JpZCBtb2RlCiAgICAgICAgICAgIGlmICh0aGlzLmdyaWQgJiYgdGhpcy5fdmlydHVhbENvdW50IC0gMSA9PT0gdmlkeCkgewogICAgICAgICAgICAgIHJldHVybiB2aWR4IC0gKHZpZHggJSB0aGlzLl9pdGVtc1BlclJvdyk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pIHx8IDA7CiAgICAgICAgICB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCA9IGlkeDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkeDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBHZXRzIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB2aXNpYmxlIGl0ZW0gaW4gdGhlIHZpZXdwb3J0LgogICAgICAgKgogICAgICAgKiBAdHlwZSB7bnVtYmVyfQogICAgICAgKi8KICAgICAgZ2V0IGxhc3RWaXNpYmxlSW5kZXgoKSB7CiAgICAgICAgdmFyIGlkeCA9IHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWw7CiAgICAgICAgaWYgKGlkeCA9PSBudWxsKSB7CiAgICAgICAgICBpZiAodGhpcy5ncmlkKSB7CiAgICAgICAgICAgIGlkeCA9IE1hdGgubWluKHRoaXMuX3ZpcnR1YWxDb3VudCwgdGhpcy5maXJzdFZpc2libGVJbmRleCArIHRoaXMuX2VzdFJvd3NJblZpZXcgKiB0aGlzLl9pdGVtc1BlclJvdyAtIDEpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdmFyIHBoeXNpY2FsT2Zmc2V0ID0gdGhpcy5fcGh5c2ljYWxUb3AgKyB0aGlzLl9zY3JvbGxPZmZzZXQ7CiAgICAgICAgICAgIHRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwaWR4LCB2aWR4KSB7CiAgICAgICAgICAgICAgaWYgKHBoeXNpY2FsT2Zmc2V0IDwgdGhpcy5fc2Nyb2xsQm90dG9tKSB7CiAgICAgICAgICAgICAgICBpZHggPSB2aWR4OwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBwaHlzaWNhbE9mZnNldCArPSB0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQocGlkeCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbCA9IGlkeDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlkeDsKICAgICAgfSwKCiAgICAgIGdldCBfc2Nyb2xsT2Zmc2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxlclBhZGRpbmdUb3A7CiAgICAgIH0sCgogICAgICBhdHRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fZGVib3VuY2UoJ19yZW5kZXInLCB0aGlzLl9yZW5kZXIsIEFOSU1BVElPTl9GUkFNRSk7CiAgICAgICAgLy8gYGlyb24tcmVzaXplYCBpcyBmaXJlZCB3aGVuIHRoZSBsaXN0IGlzIGF0dGFjaGVkIGlmIHRoZSBldmVudCBpcyBhZGRlZAogICAgICAgIC8vIGJlZm9yZSBhdHRhY2hlZCBjYXVzaW5nIHVubmVjZXNzYXJ5IHdvcmsuCiAgICAgICAgdGhpcy5saXN0ZW4odGhpcywgJ2lyb24tcmVzaXplJywgJ19yZXNpemVIYW5kbGVyJyk7CiAgICAgIH0sCgogICAgICBkZXRhY2hlZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy51bmxpc3Rlbih0aGlzLCAnaXJvbi1yZXNpemUnLCAnX3Jlc2l6ZUhhbmRsZXInKTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBJbnZva2UgdGhpcyBtZXRob2QgaWYgeW91IGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgdmlld3BvcnQncwogICAgICAgKiBzaXplIG9yIENTUyBwYWRkaW5nLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcwogICAgICAgKi8KICAgICAgdXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3R5bGVzID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUodGhpcyk7CiAgICAgICAgdGhpcy5fc2Nyb2xsZXJQYWRkaW5nVG9wID0gdGhpcy5zY3JvbGxUYXJnZXQgPT09IHRoaXMgPyAwIDogcGFyc2VJbnQoc3R5bGVzWydwYWRkaW5nLXRvcCddLCAxMCk7CiAgICAgICAgdGhpcy5faXNSVEwgPSBCb29sZWFuKHN0eWxlcy5kaXJlY3Rpb24gPT09ICdydGwnKTsKICAgICAgICB0aGlzLl92aWV3cG9ydFdpZHRoID0gdGhpcy4kLml0ZW1zLm9mZnNldFdpZHRoOwogICAgICAgIHRoaXMuX3ZpZXdwb3J0SGVpZ2h0ID0gdGhpcy5fc2Nyb2xsVGFyZ2V0SGVpZ2h0OwogICAgICAgIHRoaXMuZ3JpZCAmJiB0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJlY3ljbGVzIHRoZSBwaHlzaWNhbCBpdGVtcyB3aGVuIG5lZWRlZC4KICAgICAgICovCiAgICAgIF9zY3JvbGxIYW5kbGVyOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2Nyb2xsVG9wID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5fbWF4U2Nyb2xsVG9wLCB0aGlzLl9zY3JvbGxUb3ApKTsKICAgICAgICB2YXIgZGVsdGEgPSBzY3JvbGxUb3AgLSB0aGlzLl9zY3JvbGxQb3NpdGlvbjsKICAgICAgICB2YXIgaXNTY3JvbGxpbmdEb3duID0gZGVsdGEgPj0gMDsKICAgICAgICAvLyBUcmFjayB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24uCiAgICAgICAgdGhpcy5fc2Nyb2xsUG9zaXRpb24gPSBzY3JvbGxUb3A7CiAgICAgICAgLy8gQ2xlYXIgaW5kZXhlcyBmb3IgZmlyc3QgYW5kIGxhc3QgdmlzaWJsZSBpbmRleGVzLgogICAgICAgIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICAvLyBSYW5kb20gYWNjZXNzLgogICAgICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPiB0aGlzLl9waHlzaWNhbFNpemUgJiYgdGhpcy5fcGh5c2ljYWxTaXplID4gMCkgewogICAgICAgICAgZGVsdGEgPSBkZWx0YSAtIHRoaXMuX3Njcm9sbE9mZnNldDsKICAgICAgICAgIHZhciBpZHhBZGp1c3RtZW50ID0gTWF0aC5yb3VuZChkZWx0YSAvIHRoaXMuX3BoeXNpY2FsQXZlcmFnZSkgKiB0aGlzLl9pdGVtc1BlclJvdzsKICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTdGFydCA9IHRoaXMuX3ZpcnR1YWxTdGFydCArIGlkeEFkanVzdG1lbnQ7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFN0YXJ0ID0gdGhpcy5fcGh5c2ljYWxTdGFydCArIGlkeEFkanVzdG1lbnQ7CiAgICAgICAgICAvLyBFc3RpbWF0ZSBuZXcgcGh5c2ljYWwgb2Zmc2V0LgogICAgICAgICAgdGhpcy5fcGh5c2ljYWxUb3AgPSBNYXRoLmZsb29yKHRoaXMuX3ZpcnR1YWxTdGFydCAvIHRoaXMuX2l0ZW1zUGVyUm93KSAqIHRoaXMuX3BoeXNpY2FsQXZlcmFnZTsKICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcGh5c2ljYWxDb3VudCA+IDApIHsKICAgICAgICAgIHZhciByZXVzYWJsZXMgPSB0aGlzLl9nZXRSZXVzYWJsZXMoaXNTY3JvbGxpbmdEb3duKTsKICAgICAgICAgIGlmIChpc1Njcm9sbGluZ0Rvd24pIHsKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxUb3AgPSByZXVzYWJsZXMucGh5c2ljYWxUb3A7CiAgICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTdGFydCA9IHRoaXMuX3ZpcnR1YWxTdGFydCArIHJldXNhYmxlcy5pbmRleGVzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxTdGFydCA9IHRoaXMuX3BoeXNpY2FsU3RhcnQgKyByZXVzYWJsZXMuaW5kZXhlcy5sZW5ndGg7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl92aXJ0dWFsU3RhcnQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgLSByZXVzYWJsZXMuaW5kZXhlcy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU3RhcnQgPSB0aGlzLl9waHlzaWNhbFN0YXJ0IC0gcmV1c2FibGVzLmluZGV4ZXMubGVuZ3RoOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fdXBkYXRlKHJldXNhYmxlcy5pbmRleGVzLCBpc1Njcm9sbGluZ0Rvd24gPyBudWxsIDogcmV1c2FibGVzLmluZGV4ZXMpOwogICAgICAgICAgdGhpcy5fZGVib3VuY2UoJ19pbmNyZWFzZVBvb2xJZk5lZWRlZCcsIHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkLmJpbmQodGhpcywgMCksIE1JQ1JPX1RBU0spOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoZSBpbmRleGVzIG9mIHRoZSBwaHlzaWNhbCBpdGVtcwogICAgICAgKiB0aGF0IG1pZ2h0IGJlIHJldXNlZCBhbmQgdGhlIHBoeXNpY2FsVG9wLgogICAgICAgKgogICAgICAgKiBAcGFyYW0ge2Jvb2xlYW59IGZyb21Ub3AgSWYgdGhlIHBvdGVudGlhbCByZXVzYWJsZSBpdGVtcyBhcmUgYWJvdmUgdGhlIHNjcm9sbGluZyByZWdpb24uCiAgICAgICAqLwogICAgICBfZ2V0UmV1c2FibGVzOiBmdW5jdGlvbihmcm9tVG9wKSB7CiAgICAgICAgdmFyIGl0aCwgb2Zmc2V0Q29udGVudCwgcGh5c2ljYWxJdGVtSGVpZ2h0OwogICAgICAgIHZhciBpZHhzID0gW107CiAgICAgICAgdmFyIHByb3RlY3RlZE9mZnNldENvbnRlbnQgPSB0aGlzLl9oaWRkZW5Db250ZW50U2l6ZSAqIHRoaXMuX3JhdGlvOwogICAgICAgIHZhciB2aXJ0dWFsU3RhcnQgPSB0aGlzLl92aXJ0dWFsU3RhcnQ7CiAgICAgICAgdmFyIHZpcnR1YWxFbmQgPSB0aGlzLl92aXJ0dWFsRW5kOwogICAgICAgIHZhciBwaHlzaWNhbENvdW50ID0gdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgICB2YXIgdG9wID0gdGhpcy5fcGh5c2ljYWxUb3AgKyB0aGlzLl9zY3JvbGxPZmZzZXQ7CiAgICAgICAgdmFyIGJvdHRvbSA9IHRoaXMuX3BoeXNpY2FsQm90dG9tICsgdGhpcy5fc2Nyb2xsT2Zmc2V0OwogICAgICAgIHZhciBzY3JvbGxUb3AgPSB0aGlzLl9zY3JvbGxUb3A7CiAgICAgICAgdmFyIHNjcm9sbEJvdHRvbSA9IHRoaXMuX3Njcm9sbEJvdHRvbTsKCiAgICAgICAgaWYgKGZyb21Ub3ApIHsKICAgICAgICAgIGl0aCA9IHRoaXMuX3BoeXNpY2FsU3RhcnQ7CiAgICAgICAgICBvZmZzZXRDb250ZW50ID0gc2Nyb2xsVG9wIC0gdG9wOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBpdGggPSB0aGlzLl9waHlzaWNhbEVuZDsKICAgICAgICAgIG9mZnNldENvbnRlbnQgPSBib3R0b20gLSBzY3JvbGxCb3R0b207CiAgICAgICAgfQogICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zdGFudC1jb25kaXRpb24KICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgcGh5c2ljYWxJdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGl0aCk7CiAgICAgICAgICBvZmZzZXRDb250ZW50ID0gb2Zmc2V0Q29udGVudCAtIHBoeXNpY2FsSXRlbUhlaWdodDsKICAgICAgICAgIGlmIChpZHhzLmxlbmd0aCA+PSBwaHlzaWNhbENvdW50IHx8IG9mZnNldENvbnRlbnQgPD0gcHJvdGVjdGVkT2Zmc2V0Q29udGVudCkgewogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChmcm9tVG9wKSB7CiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgaW5kZXggaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZS4KICAgICAgICAgICAgaWYgKHZpcnR1YWxFbmQgKyBpZHhzLmxlbmd0aCArIDEgPj0gdGhpcy5fdmlydHVhbENvdW50KSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgaW5kZXggaXMgbm90IHZpc2libGUuCiAgICAgICAgICAgIGlmICh0b3AgKyBwaHlzaWNhbEl0ZW1IZWlnaHQgPj0gc2Nyb2xsVG9wIC0gdGhpcy5fc2Nyb2xsT2Zmc2V0KSB7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWR4cy5wdXNoKGl0aCk7CiAgICAgICAgICAgIHRvcCA9IHRvcCArIHBoeXNpY2FsSXRlbUhlaWdodDsKICAgICAgICAgICAgaXRoID0gKGl0aCArIDEpICUgcGh5c2ljYWxDb3VudDsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgaW5kZXggaXMgd2l0aGluIHRoZSB2YWxpZCByYW5nZS4KICAgICAgICAgICAgaWYgKHZpcnR1YWxTdGFydCAtIGlkeHMubGVuZ3RoIDw9IDApIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDaGVjayB0aGF0IHRoZSBpbmRleCBpcyBub3QgdmlzaWJsZS4KICAgICAgICAgICAgaWYgKHRvcCArIHRoaXMuX3BoeXNpY2FsU2l6ZSAtIHBoeXNpY2FsSXRlbUhlaWdodCA8PSBzY3JvbGxCb3R0b20pIHsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZHhzLnB1c2goaXRoKTsKICAgICAgICAgICAgdG9wID0gdG9wIC0gcGh5c2ljYWxJdGVtSGVpZ2h0OwogICAgICAgICAgICBpdGggPSAoaXRoID09PSAwKSA/IHBoeXNpY2FsQ291bnQgLSAxIDogaXRoIC0gMTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHtpbmRleGVzOiBpZHhzLCBwaHlzaWNhbFRvcDogdG9wIC0gdGhpcy5fc2Nyb2xsT2Zmc2V0fTsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBVcGRhdGUgdGhlIGxpc3Qgb2YgaXRlbXMsIHN0YXJ0aW5nIGZyb20gdGhlIGBfdmlydHVhbFN0YXJ0YCBpdGVtLgogICAgICAgKiBAcGFyYW0geyFBcnJheTxudW1iZXI+PX0gaXRlbVNldAogICAgICAgKiBAcGFyYW0geyFBcnJheTxudW1iZXI+PX0gbW92aW5nVXAKICAgICAgICovCiAgICAgIF91cGRhdGU6IGZ1bmN0aW9uKGl0ZW1TZXQsIG1vdmluZ1VwKSB7CiAgICAgICAgaWYgKChpdGVtU2V0ICYmIGl0ZW1TZXQubGVuZ3RoID09PSAwKSB8fCB0aGlzLl9waHlzaWNhbENvdW50ID09PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIHRoaXMuX21hbmFnZUZvY3VzKCk7CiAgICAgICAgdGhpcy5fYXNzaWduTW9kZWxzKGl0ZW1TZXQpOwogICAgICAgIHRoaXMuX3VwZGF0ZU1ldHJpY3MoaXRlbVNldCk7CiAgICAgICAgLy8gQWRqdXN0IG9mZnNldCBhZnRlciBtZWFzdXJpbmcuCiAgICAgICAgaWYgKG1vdmluZ1VwKSB7CiAgICAgICAgICB3aGlsZSAobW92aW5nVXAubGVuZ3RoKSB7CiAgICAgICAgICAgIHZhciBpZHggPSBtb3ZpbmdVcC5wb3AoKTsKICAgICAgICAgICAgdGhpcy5fcGh5c2ljYWxUb3AgLT0gdGhpcy5fZ2V0UGh5c2ljYWxTaXplSW5jcmVtZW50KGlkeCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRoaXMuX3Bvc2l0aW9uSXRlbXMoKTsKICAgICAgICB0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKTsKICAgICAgfSwKCiAgICAgIF9pc0NsaWVudEZ1bGw6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxCb3R0b20gIT0gMCAmJiB0aGlzLl9waHlzaWNhbEJvdHRvbSAtIDEgPj0gdGhpcy5fc2Nyb2xsQm90dG9tICYmCiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsVG9wIDw9IHRoaXMuX3Njcm9sbFBvc2l0aW9uOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEluY3JlYXNlcyB0aGUgcG9vbCBzaXplLgogICAgICAgKi8KICAgICAgX2luY3JlYXNlUG9vbElmTmVlZGVkOiBmdW5jdGlvbihjb3VudCkgewogICAgICAgIHZhciBuZXh0UGh5c2ljYWxDb3VudCA9IHRoaXMuX2NsYW1wKHRoaXMuX3BoeXNpY2FsQ291bnQgKyBjb3VudCwKICAgICAgICAgIERFRkFVTFRfUEhZU0lDQUxfQ09VTlQkMSwgdGhpcy5fdmlydHVhbENvdW50IC0gdGhpcy5fdmlydHVhbFN0YXJ0KTsKICAgICAgICBuZXh0UGh5c2ljYWxDb3VudCA9IHRoaXMuX2NvbnZlcnRJbmRleFRvQ29tcGxldGVSb3cobmV4dFBoeXNpY2FsQ291bnQpOwogICAgICAgIHZhciBkZWx0YSA9IG5leHRQaHlzaWNhbENvdW50IC0gdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgICB2YXIgbmV4dEluY3JlYXNlID0gTWF0aC5yb3VuZCh0aGlzLl9waHlzaWNhbENvdW50ICogMC41KTsKCiAgICAgICAgaWYgKGRlbHRhIDwgMCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CiAgICAgICAgICB2YXIgdHMgPSB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCk7CiAgICAgICAgICAvLyBDb25jYXQgYXJyYXlzIGluIHBsYWNlLgogICAgICAgICAgW10ucHVzaC5hcHBseSh0aGlzLl9waHlzaWNhbEl0ZW1zLCB0aGlzLl9jcmVhdGVQb29sKGRlbHRhKSk7CiAgICAgICAgICAvLyBQdXNoIDBzIGludG8gcGh5c2ljYWxTaXplcy4gQ2FuJ3QgdXNlIEFycmF5LmZpbGwgYmVjYXVzZSBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBpdC4KICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGVsdGE7IGkrKykgewogICAgICAgICAgICB0aGlzLl9waHlzaWNhbFNpemVzLnB1c2goMCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9waHlzaWNhbENvdW50ID0gdGhpcy5fcGh5c2ljYWxDb3VudCArIGRlbHRhOwogICAgICAgICAgLy8gVXBkYXRlIHRoZSBwaHlzaWNhbCBzdGFydCBpZiBpdCBuZWVkcyB0byBwcmVzZXJ2ZSB0aGUgbW9kZWwgb2YgdGhlIGZvY3VzZWQgaXRlbS4KICAgICAgICAgIC8vIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgZm9jdXNlZCBpdGVtIGlzIGN1cnJlbnRseSByZW5kZXJlZCBhbmQgaXRzIG1vZGVsIHdvdWxkCiAgICAgICAgICAvLyBoYXZlIGNoYW5nZWQgYWZ0ZXIgaW5jcmVhc2luZyB0aGUgcG9vbCBpZiB0aGUgcGh5c2ljYWwgc3RhcnQgcmVtYWluZWQgdW5jaGFuZ2VkLgogICAgICAgICAgaWYgKHRoaXMuX3BoeXNpY2FsU3RhcnQgPiB0aGlzLl9waHlzaWNhbEVuZCAmJgogICAgICAgICAgICAgIHRoaXMuX2lzSW5kZXhSZW5kZXJlZCh0aGlzLl9mb2N1c2VkVmlydHVhbEluZGV4KSAmJgogICAgICAgICAgICAgIHRoaXMuX2dldFBoeXNpY2FsSW5kZXgodGhpcy5fZm9jdXNlZFZpcnR1YWxJbmRleCkgPCB0aGlzLl9waHlzaWNhbEVuZCkgewogICAgICAgICAgICB0aGlzLl9waHlzaWNhbFN0YXJ0ID0gdGhpcy5fcGh5c2ljYWxTdGFydCArIGRlbHRhOwogICAgICAgICAgfQogICAgICAgICAgdGhpcy5fdXBkYXRlKCk7CiAgICAgICAgICB0aGlzLl90ZW1wbGF0ZUNvc3QgPSAod2luZG93LnBlcmZvcm1hbmNlLm5vdygpIC0gdHMpIC8gZGVsdGE7CiAgICAgICAgICBuZXh0SW5jcmVhc2UgPSBNYXRoLnJvdW5kKHRoaXMuX3BoeXNpY2FsQ291bnQgKiAwLjUpOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgdXBwZXIgYm91bmRzIGlzIG5vdCBmaXhlZCB3aGVuIGRlYWxpbmcgd2l0aCBhIGdyaWQgdGhhdCBkb2Vzbid0CiAgICAgICAgLy8gZmlsbCBpdCdzIGxhc3Qgcm93IHdpdGggdGhlIGV4YWN0IG51bWJlciBvZiBpdGVtcyBwZXIgcm93LgogICAgICAgIGlmICh0aGlzLl92aXJ0dWFsRW5kID49IHRoaXMuX3ZpcnR1YWxDb3VudCAtIDEgfHwgbmV4dEluY3JlYXNlID09PSAwKSA7IGVsc2UgaWYgKCF0aGlzLl9pc0NsaWVudEZ1bGwoKSkgewogICAgICAgICAgdGhpcy5fZGVib3VuY2UoCiAgICAgICAgICAgICdfaW5jcmVhc2VQb29sSWZOZWVkZWQnLAogICAgICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKAogICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgbmV4dEluY3JlYXNlCiAgICAgICAgICAgICksIE1JQ1JPX1RBU0spOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fcGh5c2ljYWxTaXplIDwgdGhpcy5fb3B0UGh5c2ljYWxTaXplKSB7CiAgICAgICAgICAvLyBZaWVsZCBhbmQgaW5jcmVhc2UgdGhlIHBvb2wgZHVyaW5nIGlkbGUgdGltZSB1bnRpbCB0aGUgcGh5c2ljYWwgc2l6ZSBpcyBvcHRpbWFsLgogICAgICAgICAgdGhpcy5fZGVib3VuY2UoCiAgICAgICAgICAgICdfaW5jcmVhc2VQb29sSWZOZWVkZWQnLAogICAgICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZC5iaW5kKAogICAgICAgICAgICAgIHRoaXMsCiAgICAgICAgICAgICAgdGhpcy5fY2xhbXAoTWF0aC5yb3VuZCg1MCAvIHRoaXMuX3RlbXBsYXRlQ29zdCksIDEsIG5leHRJbmNyZWFzZSkKICAgICAgICAgICAgKSwgSURMRV9USU1FKTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVuZGVycyB0aGUgYSBuZXcgbGlzdC4KICAgICAgICovCiAgICAgIF9yZW5kZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIGlmICghdGhpcy5pc0F0dGFjaGVkIHx8ICF0aGlzLl9pc1Zpc2libGUpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CiAgICAgICAgaWYgKHRoaXMuX3BoeXNpY2FsQ291bnQgIT09IDApIHsKICAgICAgICAgIHZhciByZXVzYWJsZXMgPSB0aGlzLl9nZXRSZXVzYWJsZXModHJ1ZSk7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IHJldXNhYmxlcy5waHlzaWNhbFRvcDsKICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTdGFydCA9IHRoaXMuX3ZpcnR1YWxTdGFydCArIHJldXNhYmxlcy5pbmRleGVzLmxlbmd0aDsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU3RhcnQgPSB0aGlzLl9waHlzaWNhbFN0YXJ0ICsgcmV1c2FibGVzLmluZGV4ZXMubGVuZ3RoOwogICAgICAgICAgdGhpcy5fdXBkYXRlKHJldXNhYmxlcy5pbmRleGVzKTsKICAgICAgICAgIHRoaXMuX3VwZGF0ZSgpOwogICAgICAgICAgdGhpcy5faW5jcmVhc2VQb29sSWZOZWVkZWQoMCk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl92aXJ0dWFsQ291bnQgPiAwKSB7CiAgICAgICAgICAvLyBJbml0aWFsIHJlbmRlcgogICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTsKICAgICAgICAgIHRoaXMuX2luY3JlYXNlUG9vbElmTmVlZGVkKERFRkFVTFRfUEhZU0lDQUxfQ09VTlQkMSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBpdGVtcyBoYXZlIGNoYW5nZWQuIFRoYXQgaXMsIHJlYXNzaWdubWVudHMKICAgICAgICogdG8gYGl0ZW1zYCwgc3BsaWNlcyBvciB1cGRhdGVzIHRvIGEgc2luZ2xlIGl0ZW0uCiAgICAgICAqLwogICAgICBfaXRlbXNDaGFuZ2VkOiBmdW5jdGlvbihjaGFuZ2UpIHsKICAgICAgICBpZiAoY2hhbmdlLnBhdGggPT09ICdpdGVtcycpIHsKICAgICAgICAgIHRoaXMuX3ZpcnR1YWxTdGFydCA9IDA7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IDA7CiAgICAgICAgICB0aGlzLl92aXJ0dWFsQ291bnQgPSB0aGlzLml0ZW1zID8gdGhpcy5pdGVtcy5sZW5ndGggOiAwOwogICAgICAgICAgdGhpcy5fY29sbGVjdGlvbiA9IHRoaXMuaXRlbXMgJiYgdW5kZWZpbmVkID8KICAgICAgICAgICAgdW5kZWZpbmVkLmdldCh0aGlzLml0ZW1zKSA6IG51bGw7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbEluZGV4Rm9yS2V5ID0ge307CiAgICAgICAgICB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCA9IG51bGw7CiAgICAgICAgICB0aGlzLl9sYXN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQ291bnQgPSB0aGlzLl9waHlzaWNhbENvdW50IHx8IDA7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbEl0ZW1zID0gdGhpcy5fcGh5c2ljYWxJdGVtcyB8fCBbXTsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU2l6ZXMgPSB0aGlzLl9waHlzaWNhbFNpemVzIHx8IFtdOwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxTdGFydCA9IDA7CiAgICAgICAgICBpZiAodGhpcy5fc2Nyb2xsVG9wID4gdGhpcy5fc2Nyb2xsT2Zmc2V0KSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0U2Nyb2xsUG9zaXRpb24oMCk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9yZW1vdmVGb2N1c2VkSXRlbSgpOwogICAgICAgICAgdGhpcy5fZGVib3VuY2UoJ19yZW5kZXInLCB0aGlzLl9yZW5kZXIsIEFOSU1BVElPTl9GUkFNRSk7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEV4ZWN1dGVzIGEgcHJvdmlkZWQgZnVuY3Rpb24gcGVyIGV2ZXJ5IHBoeXNpY2FsIGluZGV4IGluIGBpdGVtU2V0YAogICAgICAgKiBgaXRlbVNldGAgZGVmYXVsdCB2YWx1ZSBpcyBlcXVpdmFsZW50IHRvIHRoZSBlbnRpcmUgc2V0IG9mIHBoeXNpY2FsIGluZGV4ZXMuCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7IWZ1bmN0aW9uKG51bWJlciwgbnVtYmVyKX0gZm4KICAgICAgICogQHBhcmFtIHshQXJyYXk8bnVtYmVyPj19IGl0ZW1TZXQKICAgICAgICovCiAgICAgIF9pdGVyYXRlSXRlbXM6IGZ1bmN0aW9uKGZuLCBpdGVtU2V0KSB7CiAgICAgICAgdmFyIHBpZHgsIHZpZHgsIHJ0biwgaTsKCiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDIgJiYgaXRlbVNldCkgewogICAgICAgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1TZXQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcGlkeCA9IGl0ZW1TZXRbaV07CiAgICAgICAgICAgIHZpZHggPSB0aGlzLl9jb21wdXRlVmlkeChwaWR4KTsKICAgICAgICAgICAgaWYgKChydG4gPSBmbi5jYWxsKHRoaXMsIHBpZHgsIHZpZHgpKSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHJ0bjsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBwaWR4ID0gdGhpcy5fcGh5c2ljYWxTdGFydDsKICAgICAgICAgIHZpZHggPSB0aGlzLl92aXJ0dWFsU3RhcnQ7CiAgICAgICAgICBmb3IgKDsgcGlkeCA8IHRoaXMuX3BoeXNpY2FsQ291bnQ7IHBpZHgrKywgdmlkeCsrKSB7CiAgICAgICAgICAgIGlmICgocnRuID0gZm4uY2FsbCh0aGlzLCBwaWR4LCB2aWR4KSkgIT0gbnVsbCkgewogICAgICAgICAgICAgIHJldHVybiBydG47CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGZvciAocGlkeCA9IDA7IHBpZHggPCB0aGlzLl9waHlzaWNhbFN0YXJ0OyBwaWR4KyssIHZpZHgrKykgewogICAgICAgICAgICBpZiAoKHJ0biA9IGZuLmNhbGwodGhpcywgcGlkeCwgdmlkeCkpICE9IG51bGwpIHsKICAgICAgICAgICAgICByZXR1cm4gcnRuOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgdGhlIHZpcnR1YWwgaW5kZXggZm9yIGEgZ2l2ZW4gcGh5c2ljYWwgaW5kZXgKICAgICAgICoKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHBpZHggUGh5c2ljYWwgaW5kZXgKICAgICAgICogQHJldHVybiB7bnVtYmVyfQogICAgICAgKi8KICAgICAgX2NvbXB1dGVWaWR4OiBmdW5jdGlvbihwaWR4KSB7CiAgICAgICAgaWYgKHBpZHggPj0gdGhpcy5fcGh5c2ljYWxTdGFydCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3ZpcnR1YWxTdGFydCArIChwaWR4IC0gdGhpcy5fcGh5c2ljYWxTdGFydCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl92aXJ0dWFsU3RhcnQgKyAodGhpcy5fcGh5c2ljYWxDb3VudCAtIHRoaXMuX3BoeXNpY2FsU3RhcnQpICsgcGlkeDsKICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBVcGRhdGVzIHRoZSBoZWlnaHQgZm9yIGEgZ2l2ZW4gc2V0IG9mIGl0ZW1zLgogICAgICAgKgogICAgICAgKiBAcGFyYW0geyFBcnJheTxudW1iZXI+PX0gaXRlbVNldAogICAgICAgKi8KICAgICAgX3VwZGF0ZU1ldHJpY3M6IGZ1bmN0aW9uKGl0ZW1TZXQpIHsKICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZGlzdHJpYnV0ZWQgYWxsIHRoZSBwaHlzaWNhbCBpdGVtcwogICAgICAgIC8vIHNvIHdlIGNhbiBtZWFzdXJlIHRoZW0uCiAgICAgICAgZmx1c2ggPyBmbHVzaCgpIDogZmx1c2goKTsKCiAgICAgICAgdmFyIG5ld1BoeXNpY2FsU2l6ZSA9IDA7CiAgICAgICAgdmFyIG9sZFBoeXNpY2FsU2l6ZSA9IDA7CiAgICAgICAgdmFyIHByZXZBdmdDb3VudCA9IHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50OwogICAgICAgIHZhciBwcmV2UGh5c2ljYWxBdmcgPSB0aGlzLl9waHlzaWNhbEF2ZXJhZ2U7CgogICAgICAgIHRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwaWR4LCB2aWR4KSB7CiAgICAgICAgICBvbGRQaHlzaWNhbFNpemUgKz0gdGhpcy5fcGh5c2ljYWxTaXplc1twaWR4XTsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU2l6ZXNbcGlkeF0gPSB0aGlzLl9waHlzaWNhbEl0ZW1zW3BpZHhdLm9mZnNldEhlaWdodDsKICAgICAgICAgIG5ld1BoeXNpY2FsU2l6ZSArPSB0aGlzLl9waHlzaWNhbFNpemVzW3BpZHhdOwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQgKz0gdGhpcy5fcGh5c2ljYWxTaXplc1twaWR4XSA/IDEgOiAwOwogICAgICAgIH0sIGl0ZW1TZXQpOwoKICAgICAgICBpZiAodGhpcy5ncmlkKSB7CiAgICAgICAgICB0aGlzLl91cGRhdGVHcmlkTWV0cmljcygpOwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxTaXplID0gTWF0aC5jZWlsKHRoaXMuX3BoeXNpY2FsQ291bnQgLyB0aGlzLl9pdGVtc1BlclJvdykgKiB0aGlzLl9yb3dIZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIG9sZFBoeXNpY2FsU2l6ZSA9ICh0aGlzLl9pdGVtc1BlclJvdyA9PT0gMSkgPwogICAgICAgICAgICBvbGRQaHlzaWNhbFNpemUgOgogICAgICAgICAgICBNYXRoLmNlaWwodGhpcy5fcGh5c2ljYWxDb3VudCAvIHRoaXMuX2l0ZW1zUGVyUm93KSAqIHRoaXMuX3Jvd0hlaWdodDsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsU2l6ZSA9IHRoaXMuX3BoeXNpY2FsU2l6ZSArIG5ld1BoeXNpY2FsU2l6ZSAtIG9sZFBoeXNpY2FsU2l6ZTsKICAgICAgICAgIHRoaXMuX2l0ZW1zUGVyUm93ID0gMTsKICAgICAgICB9CiAgICAgICAgLy8gVXBkYXRlIHRoZSBhdmVyYWdlIGlmIGl0IG1lYXN1cmVkIHNvbWV0aGluZy4KICAgICAgICBpZiAodGhpcy5fcGh5c2ljYWxBdmVyYWdlQ291bnQgIT09IHByZXZBdmdDb3VudCkgewogICAgICAgICAgdGhpcy5fcGh5c2ljYWxBdmVyYWdlID0gTWF0aC5yb3VuZCgKICAgICAgICAgICAgKChwcmV2UGh5c2ljYWxBdmcgKiBwcmV2QXZnQ291bnQpICsgbmV3UGh5c2ljYWxTaXplKSAvCiAgICAgICAgICAgIHRoaXMuX3BoeXNpY2FsQXZlcmFnZUNvdW50KTsKICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIHBoeXNpY2FsIGl0ZW1zLgogICAgICAgKi8KICAgICAgX3Bvc2l0aW9uSXRlbXM6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7CgogICAgICAgIHZhciB5ID0gdGhpcy5fcGh5c2ljYWxUb3A7CgogICAgICAgIHRoaXMuX2l0ZXJhdGVJdGVtcyhmdW5jdGlvbihwaWR4LCB2aWR4KSB7CiAgICAgICAgICB0aGlzLnRyYW5zbGF0ZTNkKDAsIHkgKyAncHgnLCAwLCB0aGlzLl9waHlzaWNhbEl0ZW1zW3BpZHhdKTsKICAgICAgICAgIHkgKz0gdGhpcy5fcGh5c2ljYWxTaXplc1twaWR4XTsKICAgICAgICB9KTsKICAgICAgfSwKCiAgICAgIF9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQ6IGZ1bmN0aW9uKHBpZHgpIHsKICAgICAgICBpZiAoIXRoaXMuZ3JpZCkgewogICAgICAgICAgcmV0dXJuIHRoaXMuX3BoeXNpY2FsU2l6ZXNbcGlkeF07CiAgICAgICAgfQogICAgICAgIGlmICh0aGlzLl9jb21wdXRlVmlkeChwaWR4KSAlIHRoaXMuX2l0ZW1zUGVyUm93ICE9PSB0aGlzLl9pdGVtc1BlclJvdyAtIDEpIHsKICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fcm93SGVpZ2h0OwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIEFkanVzdHMgdGhlIHNjcm9sbCBwb3NpdGlvbiB3aGVuIGl0IHdhcyBvdmVyZXN0aW1hdGVkLgogICAgICAgKi8KICAgICAgX2FkanVzdFNjcm9sbFBvc2l0aW9uOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZGVsdGFIZWlnaHQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgPT09IDAgPyB0aGlzLl9waHlzaWNhbFRvcCA6IE1hdGgubWluKHRoaXMuX3Njcm9sbFBvc2l0aW9uICsgdGhpcy5fcGh5c2ljYWxUb3AsIDApOwogICAgICAgIC8vIE5vdGU6IHRoZSBkZWx0YSBjYW4gYmUgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCiAgICAgICAgaWYgKGRlbHRhSGVpZ2h0ICE9PSAwKSB7CiAgICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IHRoaXMuX3BoeXNpY2FsVG9wIC0gZGVsdGFIZWlnaHQ7CiAgICAgICAgICB2YXIgc2Nyb2xsVG9wID0gdGhpcy5fc2Nyb2xsVG9wOwogICAgICAgICAgLy8ganVraW5nIHNjcm9sbCBwb3NpdGlvbiBkdXJpbmcgaW50ZXJpYWwgc2Nyb2xsaW5nIG9uIGlPUyBpcyBubyBidWVubwogICAgICAgICAgaWYgKCFJT1NfVE9VQ0hfU0NST0xMSU5HJDEgJiYgc2Nyb2xsVG9wID4gMCkgewogICAgICAgICAgICB0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHNjcm9sbFRvcCAtIGRlbHRhSGVpZ2h0KTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogU2V0cyB0aGUgcG9zaXRpb24gb2YgdGhlIHNjcm9sbC4KICAgICAgICovCiAgICAgIF9yZXNldFNjcm9sbFBvc2l0aW9uOiBmdW5jdGlvbihwb3MpIHsKICAgICAgICBpZiAodGhpcy5zY3JvbGxUYXJnZXQgJiYgcG9zID49IDApIHsKICAgICAgICAgIHRoaXMuX3Njcm9sbFRvcCA9IHBvczsKICAgICAgICAgIHRoaXMuX3Njcm9sbFBvc2l0aW9uID0gdGhpcy5fc2Nyb2xsVG9wOwogICAgICAgIH0KICAgICAgfSwKCiAgICAgIC8qKgogICAgICAgKiBTZXRzIHRoZSBzY3JvbGwgaGVpZ2h0LCB0aGF0J3MgdGhlIGhlaWdodCBvZiB0aGUgY29udGVudCwKICAgICAgICoKICAgICAgICogQHBhcmFtIHtib29sZWFuPX0gZm9yY2VVcGRhdGUgSWYgdHJ1ZSwgdXBkYXRlcyB0aGUgaGVpZ2h0IG5vIG1hdHRlciB3aGF0LgogICAgICAgKi8KICAgICAgX3VwZGF0ZVNjcm9sbGVyU2l6ZTogZnVuY3Rpb24oZm9yY2VVcGRhdGUpIHsKICAgICAgICBpZiAodGhpcy5ncmlkKSB7CiAgICAgICAgICB0aGlzLl9lc3RTY3JvbGxIZWlnaHQgPSB0aGlzLl92aXJ0dWFsUm93Q291bnQgKiB0aGlzLl9yb3dIZWlnaHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX2VzdFNjcm9sbEhlaWdodCA9ICh0aGlzLl9waHlzaWNhbEJvdHRvbSArCiAgICAgICAgICAgICAgTWF0aC5tYXgodGhpcy5fdmlydHVhbENvdW50IC0gdGhpcy5fcGh5c2ljYWxDb3VudCAtIHRoaXMuX3ZpcnR1YWxTdGFydCwgMCkgKiB0aGlzLl9waHlzaWNhbEF2ZXJhZ2UpOwogICAgICAgIH0KICAgICAgICBmb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlIHx8IHRoaXMuX3Njcm9sbEhlaWdodCA9PT0gMDsKICAgICAgICBmb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlIHx8IHRoaXMuX3Njcm9sbFBvc2l0aW9uID49IHRoaXMuX2VzdFNjcm9sbEhlaWdodCAtIHRoaXMuX3BoeXNpY2FsU2l6ZTsKICAgICAgICBmb3JjZVVwZGF0ZSA9IGZvcmNlVXBkYXRlIHx8IHRoaXMuZ3JpZCAmJiB0aGlzLiQuaXRlbXMuc3R5bGUuaGVpZ2h0IDwgdGhpcy5fZXN0U2Nyb2xsSGVpZ2h0OwogICAgICAgIC8vIEFtb3J0aXplIGhlaWdodCBhZGp1c3RtZW50LCBzbyBpdCB3b24ndCB0cmlnZ2VyIGxhcmdlIHJlcGFpbnRzIHRvbyBvZnRlbi4KICAgICAgICBpZiAoZm9yY2VVcGRhdGUgfHwgTWF0aC5hYnModGhpcy5fZXN0U2Nyb2xsSGVpZ2h0IC0gdGhpcy5fc2Nyb2xsSGVpZ2h0KSA+PSB0aGlzLl92aWV3cG9ydEhlaWdodCkgewogICAgICAgICAgdGhpcy4kLml0ZW1zLnN0eWxlLmhlaWdodCA9IHRoaXMuX2VzdFNjcm9sbEhlaWdodCArICdweCc7CiAgICAgICAgICB0aGlzLl9zY3JvbGxIZWlnaHQgPSB0aGlzLl9lc3RTY3JvbGxIZWlnaHQ7CiAgICAgICAgfQogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIFNjcm9sbCB0byBhIHNwZWNpZmljIGluZGV4IGluIHRoZSB2aXJ0dWFsIGxpc3QgcmVnYXJkbGVzcwogICAgICAgKiBvZiB0aGUgcGh5c2ljYWwgaXRlbXMgaW4gdGhlIERPTSB0cmVlLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHNjcm9sbFRvSW5kZXgKICAgICAgICogQHBhcmFtIHtudW1iZXJ9IGlkeCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0KICAgICAgICovCiAgICAgIHNjcm9sbFRvSW5kZXg6IGZ1bmN0aW9uKGlkeCkgewogICAgICAgIGlmICh0eXBlb2YgaWR4ICE9PSAnbnVtYmVyJyB8fCBpZHggPCAwIHx8IGlkeCA+IHRoaXMuaXRlbXMubGVuZ3RoIC0gMSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBmbHVzaCA/IGZsdXNoKCkgOiBmbHVzaCgpOwogICAgICAgIC8vIEl0ZW1zIHNob3VsZCBoYXZlIGJlZW4gcmVuZGVyZWQgcHJpb3Igc2Nyb2xsaW5nIHRvIGFuIGluZGV4LgogICAgICAgIGlmICh0aGlzLl9waHlzaWNhbENvdW50ID09PSAwKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlkeCA9IHRoaXMuX2NsYW1wKGlkeCwgMCwgdGhpcy5fdmlydHVhbENvdW50IC0gMSk7CiAgICAgICAgLy8gVXBkYXRlIHRoZSB2aXJ0dWFsIHN0YXJ0IG9ubHkgd2hlbiBuZWVkZWQuCiAgICAgICAgaWYgKCF0aGlzLl9pc0luZGV4UmVuZGVyZWQoaWR4KSB8fCBpZHggPj0gdGhpcy5fbWF4VmlydHVhbFN0YXJ0KSB7CiAgICAgICAgICB0aGlzLl92aXJ0dWFsU3RhcnQgPSB0aGlzLmdyaWQgPyAoaWR4IC0gdGhpcy5faXRlbXNQZXJSb3cgKiAyKSA6IChpZHggLSAxKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fbWFuYWdlRm9jdXMoKTsKICAgICAgICB0aGlzLl9hc3NpZ25Nb2RlbHMoKTsKICAgICAgICB0aGlzLl91cGRhdGVNZXRyaWNzKCk7CiAgICAgICAgLy8gRXN0aW1hdGUgbmV3IHBoeXNpY2FsIG9mZnNldC4KICAgICAgICB0aGlzLl9waHlzaWNhbFRvcCA9IE1hdGguZmxvb3IodGhpcy5fdmlydHVhbFN0YXJ0IC8gdGhpcy5faXRlbXNQZXJSb3cpICogdGhpcy5fcGh5c2ljYWxBdmVyYWdlOwoKICAgICAgICB2YXIgY3VycmVudFRvcEl0ZW0gPSB0aGlzLl9waHlzaWNhbFN0YXJ0OwogICAgICAgIHZhciBjdXJyZW50VmlydHVhbEl0ZW0gPSB0aGlzLl92aXJ0dWFsU3RhcnQ7CiAgICAgICAgdmFyIHRhcmdldE9mZnNldFRvcCA9IDA7CiAgICAgICAgdmFyIGhpZGRlbkNvbnRlbnRTaXplID0gdGhpcy5faGlkZGVuQ29udGVudFNpemU7CiAgICAgICAgLy8gc2Nyb2xsIHRvIHRoZSBpdGVtIGFzIG11Y2ggYXMgd2UgY2FuLgogICAgICAgIHdoaWxlIChjdXJyZW50VmlydHVhbEl0ZW0gPCBpZHggJiYgdGFyZ2V0T2Zmc2V0VG9wIDw9IGhpZGRlbkNvbnRlbnRTaXplKSB7CiAgICAgICAgICB0YXJnZXRPZmZzZXRUb3AgPSB0YXJnZXRPZmZzZXRUb3AgKyB0aGlzLl9nZXRQaHlzaWNhbFNpemVJbmNyZW1lbnQoY3VycmVudFRvcEl0ZW0pOwogICAgICAgICAgY3VycmVudFRvcEl0ZW0gPSAoY3VycmVudFRvcEl0ZW0gKyAxKSAlIHRoaXMuX3BoeXNpY2FsQ291bnQ7CiAgICAgICAgICBjdXJyZW50VmlydHVhbEl0ZW0rKzsKICAgICAgICB9CiAgICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsZXJTaXplKHRydWUpOwogICAgICAgIHRoaXMuX3Bvc2l0aW9uSXRlbXMoKTsKICAgICAgICB0aGlzLl9yZXNldFNjcm9sbFBvc2l0aW9uKHRoaXMuX3BoeXNpY2FsVG9wICsgdGhpcy5fc2Nyb2xsT2Zmc2V0ICsgdGFyZ2V0T2Zmc2V0VG9wKTsKICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKTsKICAgICAgICAvLyBjbGVhciBjYWNoZWQgdmlzaWJsZSBpbmRleC4KICAgICAgICB0aGlzLl9maXJzdFZpc2libGVJbmRleFZhbCA9IG51bGw7CiAgICAgICAgdGhpcy5fbGFzdFZpc2libGVJbmRleFZhbCA9IG51bGw7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogUmVzZXQgdGhlIHBoeXNpY2FsIGF2ZXJhZ2UgYW5kIHRoZSBhdmVyYWdlIGNvdW50LgogICAgICAgKi8KICAgICAgX3Jlc2V0QXZlcmFnZTogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcGh5c2ljYWxBdmVyYWdlID0gMDsKICAgICAgICB0aGlzLl9waHlzaWNhbEF2ZXJhZ2VDb3VudCA9IDA7CiAgICAgIH0sCgogICAgICAvKioKICAgICAgICogQSBoYW5kbGVyIGZvciB0aGUgYGlyb24tcmVzaXplYCBldmVudCB0cmlnZ2VyZWQgYnkgYElyb25SZXNpemFibGVCZWhhdmlvcmAKICAgICAgICogd2hlbiB0aGUgZWxlbWVudCBpcyByZXNpemVkLgogICAgICAgKi8KICAgICAgX3Jlc2l6ZUhhbmRsZXI6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlKCdfcmVuZGVyJywgZnVuY3Rpb24oKSB7CiAgICAgICAgICAvLyBjbGVhciBjYWNoZWQgdmlzaWJsZSBpbmRleC4KICAgICAgICAgIHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4VmFsID0gbnVsbDsKICAgICAgICAgIHRoaXMuX2xhc3RWaXNpYmxlSW5kZXhWYWwgPSBudWxsOwogICAgICAgICAgLy8gU2tpcCB0aGUgcmVzaXplIGV2ZW50IG9uIHRvdWNoIGRldmljZXMgd2hlbiB0aGUgYWRkcmVzcyBiYXIgc2xpZGVzIHVwLgogICAgICAgICAgdGhpcy51cGRhdGVWaWV3cG9ydEJvdW5kYXJpZXMoKTsKICAgICAgICAgIGlmICh0aGlzLl9pc1Zpc2libGUpIHsKICAgICAgICAgICAgLy8gUmVpbnN0YWxsIHRoZSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIuCiAgICAgICAgICAgIHRoaXMudG9nZ2xlU2Nyb2xsTGlzdGVuZXIodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0QXZlcmFnZSgpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXIoKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIFVuaW5zdGFsbCB0aGUgc2Nyb2xsIGV2ZW50IGxpc3RlbmVyLgogICAgICAgICAgICB0aGlzLnRvZ2dsZVNjcm9sbExpc3RlbmVyKGZhbHNlKTsKICAgICAgICAgIH0KICAgICAgICB9LCBBTklNQVRJT05fRlJBTUUpOwogICAgICB9LAoKICAgICAgLyoqCiAgICAgICAqIENvbnZlcnRzIGEgcmFuZG9tIGluZGV4IHRvIHRoZSBpbmRleCBvZiB0aGUgaXRlbSB0aGF0IGNvbXBsZXRlcyBpdCdzIHJvdy4KICAgICAgICogQWxsb3dzIGZvciBiZXR0ZXIgb3JkZXIgYW5kIGZpbGwgY29tcHV0YXRpb24gd2hlbiBncmlkID09IHRydWUuCiAgICAgICAqLwogICAgICBfY29udmVydEluZGV4VG9Db21wbGV0ZVJvdzogZnVuY3Rpb24oaWR4KSB7CiAgICAgICAgLy8gd2hlbiBncmlkID09IGZhbHNlIF9pdGVtUGVyUm93IGNhbiBiZSB1bnNldC4KICAgICAgICB0aGlzLl9pdGVtc1BlclJvdyA9IHRoaXMuX2l0ZW1zUGVyUm93IHx8IDE7CiAgICAgICAgcmV0dXJuIHRoaXMuZ3JpZCA/IE1hdGguY2VpbChpZHggLyB0aGlzLl9pdGVtc1BlclJvdykgKiB0aGlzLl9pdGVtc1BlclJvdyA6IGlkeDsKICAgICAgfSwKCiAgICAgIF9pc0luZGV4UmVuZGVyZWQ6IGZ1bmN0aW9uKGlkeCkgewogICAgICAgIHJldHVybiBpZHggPj0gdGhpcy5fdmlydHVhbFN0YXJ0ICYmIGlkeCA8PSB0aGlzLl92aXJ0dWFsRW5kOwogICAgICB9LAoKICAgICAgX2dldFBoeXNpY2FsSW5kZXg6IGZ1bmN0aW9uKHZpZHgpIHsKICAgICAgICByZXR1cm4gKHRoaXMuX3BoeXNpY2FsU3RhcnQgKyAodmlkeCAtIHRoaXMuX3ZpcnR1YWxTdGFydCkpICUgdGhpcy5fcGh5c2ljYWxDb3VudDsKICAgICAgfSwKCiAgICAgIF9jbGFtcDogZnVuY3Rpb24odiwgbWluLCBtYXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5taW4obWF4LCBNYXRoLm1heChtaW4sIHYpKTsKICAgICAgfSwKCiAgICAgIF9kZWJvdW5jZTogZnVuY3Rpb24obmFtZSwgY2IsIGFzeW5jTW9kdWxlKSB7CiAgICAgICAgdGhpcy5fZGVib3VuY2VycyA9IHRoaXMuX2RlYm91bmNlcnMgfHwge307CiAgICAgICAgdGhpcy5fZGVib3VuY2Vyc1tuYW1lXSA9IERlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgIHRoaXMuX2RlYm91bmNlcnNbbmFtZV0sCiAgICAgICAgICBhc3luY01vZHVsZSwKICAgICAgICAgIGNiLmJpbmQodGhpcykpOwogICAgICAgIGVucXVldWVEZWJvdW5jZXIodGhpcy5fZGVib3VuY2Vyc1tuYW1lXSk7CiAgICAgIH0KCiAgICB9KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIFRoaXMgRWxlbWVudCBpcyB1c2VkIGludGVybmFsbHkgYnkgdmFhZGluLWdyaWQuCiAgICAgKgogICAgICogQHByaXZhdGUKICAgICAqLwogICAgY2xhc3MgR3JpZFNjcm9sbGVyRWxlbWVudCBleHRlbmRzIFBvbHltZXJJcm9uTGlzdCB7CgogICAgICBzdGF0aWMgZ2V0IGlzKCkgewogICAgICAgIHJldHVybiAndmFhZGluLWdyaWQtc2Nyb2xsZXInOwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIHNpemU6IHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICBub3RpZnk6IHRydWUKICAgICAgICAgIH0sCiAgICAgICAgICBfdmlkeE9mZnNldDogewogICAgICAgICAgICB2YWx1ZTogMAogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX2VmZmVjdGl2ZVNpemVDaGFuZ2VkKF9lZmZlY3RpdmVTaXplKScKICAgICAgICBdOwogICAgICB9CgogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICogQHByb3RlY3RlZAogICAgICAqLwogICAgICBfdXBkYXRlU2Nyb2xsZXJJdGVtKGl0ZW0sIGluZGV4KSB7fQogICAgICAvKioKICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICovCiAgICAgIF9hZnRlclNjcm9sbCgpIHt9CiAgICAgIC8qKgogICAgICAqIEBwcm90ZWN0ZWQKICAgICAgKi8KICAgICAgX2dldFJvd1RhcmdldCgpIHt9CiAgICAgIC8qKgogICAgICAqIEBwcm90ZWN0ZWQKICAgICAgKi8KICAgICAgX2NyZWF0ZVNjcm9sbGVyUm93cygpIHt9CiAgICAgIC8qKgogICAgICAqIEBwcm90ZWN0ZWQKICAgICAgKi8KICAgICAgX2NhblBvcHVsYXRlKCkge30KCiAgICAgIC8qKgogICAgICAqIEBwcml2YXRlCiAgICAgICovCiAgICAgIHNjcm9sbFRvSW5kZXgoaW5kZXgpIHsKICAgICAgICB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzcygnc2Nyb2xsVG9JbmRleCcpOwoKICAgICAgICBpZiAoaW5kZXggPiAwKSB7CiAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Nyb2xsVG9JbmRleCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGlmICghcGFyc2VJbnQodGhpcy4kLml0ZW1zLnN0eWxlLmJvcmRlclRvcFdpZHRoKSAmJiBpbmRleCA+IDApIHsKICAgICAgICAgIC8vIFNjaGVkdWxlIGFub3RoZXIgc2Nyb2xsIHRvIGJlIGludm9rZWQgb25jZSBpbml0IGlzIGNvbXBsZXRlCiAgICAgICAgICB0aGlzLl9wZW5kaW5nU2Nyb2xsVG9JbmRleCA9IGluZGV4OwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fc2Nyb2xsaW5nVG9JbmRleCA9IHRydWU7CiAgICAgICAgaW5kZXggPSBNYXRoLm1pbihNYXRoLm1heChpbmRleCwgMCksIHRoaXMuX2VmZmVjdGl2ZVNpemUgLSAxKTsKICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsVG9wID0gaW5kZXggLyB0aGlzLl9lZmZlY3RpdmVTaXplICogKHRoaXMuJC50YWJsZS5zY3JvbGxIZWlnaHQgLSB0aGlzLiQudGFibGUub2Zmc2V0SGVpZ2h0KTsKICAgICAgICB0aGlzLl9zY3JvbGxIYW5kbGVyKCk7CgogICAgICAgIGlmICh0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKSA9PiB0aGlzLl9tYXhTY3JvbGxUb3ApICYmIHRoaXMuX3ZpcnR1YWxDb3VudCA8IHRoaXMuX2VmZmVjdGl2ZVNpemUpIHsKICAgICAgICAgIHRoaXMuX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldCgxMDAwMDAwKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgpID0+IHN1cGVyLnNjcm9sbFRvSW5kZXgoaW5kZXggLSB0aGlzLl92aWR4T2Zmc2V0KSk7CiAgICAgICAgdGhpcy5fc2Nyb2xsSGFuZGxlcigpOwoKICAgICAgICAvLyBFbnN1cmUgc2Nyb2xsIHBvc2l0aW9uCiAgICAgICAgY29uc3Qgcm93ID0gQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5pbmRleCA9PT0gaW5kZXgpWzBdOwogICAgICAgIGlmIChyb3cpIHsKICAgICAgICAgIGNvbnN0IGhlYWRlck9mZnNldCA9IHJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSB0aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgICAgICAgIGlmIChNYXRoLmFicyhoZWFkZXJPZmZzZXQpID4gMSkgewogICAgICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsVG9wICs9IGhlYWRlck9mZnNldDsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsSGFuZGxlcigpOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fc2Nyb2xsaW5nVG9JbmRleCA9IGZhbHNlOwogICAgICB9CgogICAgICBfZWZmZWN0aXZlU2l6ZUNoYW5nZWQoc2l6ZSkgewogICAgICAgIGxldCBmdmk7IC8vIGZpcnN0IHZpc2libGUgKGFkanVzdGVkKSBpbmRleAogICAgICAgIGxldCBmdmlPZmZzZXQgPSAwOwogICAgICAgIHRoaXMuX2l0ZXJhdGVJdGVtcygocGlkeCwgdmlkeCkgPT4gewogICAgICAgICAgaWYgKHZpZHggPT09IHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4KSB7CiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF07CiAgICAgICAgICAgIGZ2aSA9IHJvdy5pbmRleDsKICAgICAgICAgICAgZnZpT2Zmc2V0ID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgaWYgKHRoaXMuaXRlbXMgJiYgc2l6ZSA8IHRoaXMuaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAvLyBTaXplIHdhcyByZWR1Y2VkLCBzY3JvbGwgdG8gMCBmaXJzdAogICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gMDsKICAgICAgICB9CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHRoaXMuaXRlbXMpKSB7CiAgICAgICAgICAvLyBFZGdlL0lFIHNlZW1zIHRvIGhhdmUgdGhlIGxvd2VzdCBtYXhpbXVtCiAgICAgICAgICBjb25zdCBtYXhWaXJ0dWFsSXRlbXMgPSB0aGlzLl9lZGdlIHx8IHRoaXMuX2llID8gMzAwMDAgOiAxMDAwMDA7CiAgICAgICAgICB0aGlzLml0ZW1zID0ge2xlbmd0aDogTWF0aC5taW4oc2l6ZSwgbWF4VmlydHVhbEl0ZW1zKX07CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKSA9PiBzdXBlci5faXRlbXNDaGFuZ2VkKHtwYXRoOiAnaXRlbXMnfSkpOwoKICAgICAgICB0aGlzLl92aXJ0dWFsQ291bnQgPSBNYXRoLm1pbih0aGlzLml0ZW1zLmxlbmd0aCwgc2l6ZSkgfHwgMDsKCiAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFRvcCA9PT0gMCkgewogICAgICAgICAgdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCkgPT4gdGhpcy5fc2Nyb2xsVG9JbmRleChNYXRoLm1pbihzaXplIC0gMSwgZnZpKSkpOwogICAgICAgICAgdGhpcy5faXRlcmF0ZUl0ZW1zKChwaWR4LCB2aWR4KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJvdyA9IHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF07CiAgICAgICAgICAgIGlmIChyb3cuaW5kZXggPT09IGZ2aSkgewogICAgICAgICAgICAgIHRoaXMuJC50YWJsZS5zY3JvbGxUb3AgKz0gTWF0aC5yb3VuZChyb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wIC0gZnZpT2Zmc2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXN0b3JlIGtleWJvYXJkIGZvY3VzIHRvIHRoZSByaWdodCBjZWxsCiAgICAgICAgICAgIGlmIChyb3cuaW5kZXggPT09IHRoaXMuX2ZvY3VzZWRJdGVtSW5kZXggJiYgdGhpcy5faXRlbXNGb2N1c2FibGUgJiYgdGhpcy4kLml0ZW1zLmNvbnRhaW5zKHRoaXMuc2hhZG93Um9vdC5hY3RpdmVFbGVtZW50KSkgewogICAgICAgICAgICAgIGNvbnN0IGNlbGxJbmRleCA9IEFycmF5LmZyb20odGhpcy5faXRlbXNGb2N1c2FibGUucGFyZW50RWxlbWVudC5jaGlsZHJlbikuaW5kZXhPZih0aGlzLl9pdGVtc0ZvY3VzYWJsZSk7CiAgICAgICAgICAgICAgcm93LmNoaWxkcmVuW2NlbGxJbmRleF0uZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2Fzc2lnbk1vZGVscygpOwogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB0aGlzLl91cGRhdGUoKSk7CiAgICAgIH0KCiAgICAgIF9wb3NpdGlvbkl0ZW1zKCkgewogICAgICAgIHRoaXMuX2FkanVzdFNjcm9sbFBvc2l0aW9uKCk7CgogICAgICAgIGxldCByZVBvc2l0aW9uOwogICAgICAgIGlmIChpc05hTih0aGlzLl9waHlzaWNhbFRvcCkpIHsKICAgICAgICAgIHJlUG9zaXRpb24gPSB0cnVlOwogICAgICAgICAgdGhpcy5fcGh5c2ljYWxUb3AgPSAwOwogICAgICAgIH0KCiAgICAgICAgbGV0IHkgPSB0aGlzLl9waHlzaWNhbFRvcDsKICAgICAgICB0aGlzLl9pdGVyYXRlSXRlbXMoKHBpZHgsIHZpZHgpID0+IHsKICAgICAgICAgIHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF0uc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHt5fXB4KWA7CiAgICAgICAgICB5ICs9IHRoaXMuX3BoeXNpY2FsU2l6ZXNbcGlkeF07CiAgICAgICAgfSk7CgogICAgICAgIGlmIChyZVBvc2l0aW9uKSB7CiAgICAgICAgICB0aGlzLl9zY3JvbGxUb0luZGV4KDApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2luY3JlYXNlUG9vbElmTmVlZGVkKGNvdW50KSB7CiAgICAgICAgaWYgKChjb3VudCA9PT0gMCAmJiB0aGlzLl9zY3JvbGxpbmdUb0luZGV4KSB8fCAhdGhpcy5fY2FuUG9wdWxhdGUoKSB8fCAhdGhpcy5fZWZmZWN0aXZlU2l6ZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKCF0aGlzLl9pbml0aWFsUG9vbENyZWF0ZWQpIHsKICAgICAgICAgIHRoaXMuX2luaXRpYWxQb29sQ3JlYXRlZCA9IHRydWU7CiAgICAgICAgICBzdXBlci5faW5jcmVhc2VQb29sSWZOZWVkZWQoMjUpOwogICAgICAgIH0gZWxzZSBpZiAodGhpcy5fb3B0UGh5c2ljYWxTaXplICE9PSBJbmZpbml0eSkgewogICAgICAgICAgdGhpcy5fZGVib3VuY2VJbmNyZWFzZVBvb2wgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlSW5jcmVhc2VQb29sLAogICAgICAgICAgICBhbmltYXRpb25GcmFtZSwKICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKICAgICAgICAgICAgICBjb25zdCByZW1haW5pbmdQaHlzaWNhbFNpemUgPSB0aGlzLl9vcHRQaHlzaWNhbFNpemUgLSB0aGlzLl9waHlzaWNhbFNpemU7CiAgICAgICAgICAgICAgbGV0IGVzdGltYXRlZE1pc3NpbmdSb3dDb3VudCA9IE1hdGguY2VpbChyZW1haW5pbmdQaHlzaWNhbFNpemUgLyB0aGlzLl9waHlzaWNhbEF2ZXJhZ2UpOwoKICAgICAgICAgICAgICBpZiAodGhpcy5fcGh5c2ljYWxDb3VudCArIGVzdGltYXRlZE1pc3NpbmdSb3dDb3VudCA+IHRoaXMuX2VmZmVjdGl2ZVNpemUpIHsKICAgICAgICAgICAgICAgIC8vIERvIG5vdCBpbmNyZWFzZSB0aGUgcGh5c2ljYWwgaXRlbSBjb3VudCBhYm92ZSB0aGUgdGhpcy5fZWZmZWN0aXZlU2l6ZQogICAgICAgICAgICAgICAgZXN0aW1hdGVkTWlzc2luZ1Jvd0NvdW50ID0gTWF0aC5tYXgoMCwgdGhpcy5fZWZmZWN0aXZlU2l6ZSAtIHRoaXMuX3BoeXNpY2FsQ291bnQpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKHRoaXMuX3BoeXNpY2FsU2l6ZSAmJiBlc3RpbWF0ZWRNaXNzaW5nUm93Q291bnQgPiAwICYmIHRoaXMuX29wdFBoeXNpY2FsU2l6ZSAhPT0gSW5maW5pdHkpIHsKICAgICAgICAgICAgICAgIHN1cGVyLl9pbmNyZWFzZVBvb2xJZk5lZWRlZChlc3RpbWF0ZWRNaXNzaW5nUm93Q291bnQpOwogICAgICAgICAgICAgICAgLy8gRW5zdXJlIHRoZSByb3dzIGFyZSBpbiBvcmRlciBhZnRlciBpbmNyZWFzaW5nIHBvb2wKICAgICAgICAgICAgICAgIHRoaXMuX19yZW9yZGVyQ2hpbGROb2RlcygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3Jlb3JkZXJDaGlsZE5vZGVzKCkgewogICAgICAgIGNvbnN0IGNoaWxkTm9kZXMgPSBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZE5vZGVzKTsKICAgICAgICBjb25zdCByb3dzSW5PcmRlciA9ICEhY2hpbGROb2Rlcy5yZWR1Y2UoKGluT3JkZXIsIGN1cnJlbnQsIGN1cnJlbnRJbmRleCwgYXJyYXkpID0+IHsKICAgICAgICAgIGlmIChjdXJyZW50SW5kZXggPT09IDAgfHwgYXJyYXlbY3VycmVudEluZGV4IC0gMV0uaW5kZXggPT09IGN1cnJlbnQuaW5kZXggLSAxKSB7CiAgICAgICAgICAgIHJldHVybiBpbk9yZGVyOwogICAgICAgICAgfQogICAgICAgIH0sIHRydWUpOwoKICAgICAgICBpZiAoIXJvd3NJbk9yZGVyKSB7CiAgICAgICAgICBjaGlsZE5vZGVzLnNvcnQoKHJvdzEsIHJvdzIpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHJvdzEuaW5kZXggLSByb3cyLmluZGV4OwogICAgICAgICAgfSkuZm9yRWFjaChyb3cgPT4gdGhpcy4kLml0ZW1zLmFwcGVuZENoaWxkKHJvdykpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2NyZWF0ZVBvb2woc2l6ZSkgewogICAgICAgIGNvbnN0IGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwogICAgICAgIGNvbnN0IHBoeXNpY2FsSXRlbXMgPSB0aGlzLl9jcmVhdGVTY3JvbGxlclJvd3Moc2l6ZSk7CgogICAgICAgIHBoeXNpY2FsSXRlbXMuZm9yRWFjaChpbnN0ID0+IGZyYWdtZW50LmFwcGVuZENoaWxkKGluc3QpKTsKICAgICAgICB0aGlzLl9nZXRSb3dUYXJnZXQoKS5hcHBlbmRDaGlsZChmcmFnbWVudCk7CgogICAgICAgIC8vIFdlaXJkIGhhY2sgbmVlZGVkIHRvIGdldCBTYWZhcmkgdG8gYWN0dWFsbHkgZGlzdHJpYnV0ZSBzbG90cwogICAgICAgIGNvbnN0IGNvbnRlbnQgPSB0aGlzLnF1ZXJ5U2VsZWN0b3IoJ1tzbG90XScpOwogICAgICAgIGlmIChjb250ZW50KSB7CiAgICAgICAgICBjb25zdCBzbG90ID0gY29udGVudC5nZXRBdHRyaWJ1dGUoJ3Nsb3QnKTsKICAgICAgICAgIGNvbnRlbnQuc2V0QXR0cmlidXRlKCdzbG90JywgJ2Zvby1iYXInKTsKICAgICAgICAgIGNvbnRlbnQuc2V0QXR0cmlidXRlKCdzbG90Jywgc2xvdCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7CgogICAgICAgIGFmdGVyTmV4dFJlbmRlcih0aGlzLCAoKSA9PiB0aGlzLm5vdGlmeVJlc2l6ZSgpKTsKICAgICAgICByZXR1cm4gcGh5c2ljYWxJdGVtczsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEFzc2lnbnMgdGhlIGRhdGEgbW9kZWxzIHRvIGEgZ2l2ZW4gc2V0IG9mIGl0ZW1zLgogICAgICAgKiBAcGFyYW0geyFBcnJheTxudW1iZXI+PX0gaXRlbVNldAogICAgICAgKi8KICAgICAgX2Fzc2lnbk1vZGVscyhpdGVtU2V0KSB7CiAgICAgICAgdGhpcy5faXRlcmF0ZUl0ZW1zKChwaWR4LCB2aWR4KSA9PiB7CiAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuX3BoeXNpY2FsSXRlbXNbcGlkeF07CiAgICAgICAgICB0aGlzLl90b2dnbGVBdHRyaWJ1dGUoJ2hpZGRlbicsIHZpZHggPj0gdGhpcy5fZWZmZWN0aXZlU2l6ZSwgZWwpOwogICAgICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsZXJJdGVtKGVsLCB2aWR4ICsgKHRoaXMuX3ZpZHhPZmZzZXQgfHwgMCkpOwogICAgICAgIH0sIGl0ZW1TZXQpOwogICAgICB9CgogICAgICBfc2Nyb2xsSGFuZGxlcigpIHsKICAgICAgICBjb25zdCBkZWx0YSA9IHRoaXMuJC50YWJsZS5zY3JvbGxUb3AgLSB0aGlzLl9zY3JvbGxQb3NpdGlvbjsKICAgICAgICB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fc2Nyb2xsSGFuZGxlcik7CiAgICAgICAgY29uc3Qgb2xkT2Zmc2V0ID0gdGhpcy5fdmlkeE9mZnNldDsKICAgICAgICBpZiAodGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCkgPT4gdGhpcy5fbWF4U2Nyb2xsVG9wKSAmJiB0aGlzLl92aXJ0dWFsQ291bnQgPCB0aGlzLl9lZmZlY3RpdmVTaXplKSB7CiAgICAgICAgICB0aGlzLl9hZGp1c3RWaXJ0dWFsSW5kZXhPZmZzZXQoZGVsdGEpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fdmlkeE9mZnNldCAhPT0gb2xkT2Zmc2V0KSB7CiAgICAgICAgICB0aGlzLl91cGRhdGUoKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fYWZ0ZXJTY3JvbGwoKTsKICAgICAgfQoKICAgICAgX2FkanVzdFZpcnR1YWxJbmRleE9mZnNldChkZWx0YSkgewogICAgICAgIGlmIChNYXRoLmFicyhkZWx0YSkgPiAxMDAwMCkgewogICAgICAgICAgaWYgKHRoaXMuX25vU2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5fbm9TY2FsZSA9IGZhbHNlOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMuJC50YWJsZS5zY3JvbGxUb3AgLyAodGhpcy4kLnRhYmxlLnNjcm9sbEhlaWdodCAtIHRoaXMuJC50YWJsZS5vZmZzZXRIZWlnaHQpOwogICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc2NhbGUgKiB0aGlzLl9lZmZlY3RpdmVTaXplOwogICAgICAgICAgdGhpcy5fdmlkeE9mZnNldCA9IE1hdGgucm91bmQob2Zmc2V0IC0gc2NhbGUgKiB0aGlzLl92aXJ0dWFsQ291bnQpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAvLyBNYWtlIHN1cmUgdXNlciBjYW4gYWx3YXlzIHN3aXBlL3doZWVsIHNjcm9sbCB0byB0aGUgc3RhcnQgYW5kIGVuZAogICAgICAgICAgY29uc3Qgb2xkT2Zmc2V0ID0gdGhpcy5fdmlkeE9mZnNldCB8fCAwOwogICAgICAgICAgY29uc3QgdGhyZXNob2xkID0gMTAwMDsKICAgICAgICAgIGNvbnN0IG1heFNoaWZ0ID0gMTAwOwogICAgICAgICAgLy8gQXQgc3RhcnQKICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxUb3AgPT09IDApIHsKICAgICAgICAgICAgdGhpcy5fdmlkeE9mZnNldCA9IDA7CiAgICAgICAgICAgIGlmIChvbGRPZmZzZXQgIT09IHRoaXMuX3ZpZHhPZmZzZXQpIHsKICAgICAgICAgICAgICBzdXBlci5zY3JvbGxUb0luZGV4KDApOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlyc3RWaXNpYmxlSW5kZXggPCB0aHJlc2hvbGQgJiYgdGhpcy5fdmlkeE9mZnNldCA+IDApIHsKICAgICAgICAgICAgdGhpcy5fdmlkeE9mZnNldCAtPSBNYXRoLm1pbih0aGlzLl92aWR4T2Zmc2V0LCBtYXhTaGlmdCk7CiAgICAgICAgICAgIGlmIChvbGRPZmZzZXQgIT09IHRoaXMuX3ZpZHhPZmZzZXQpIHsKICAgICAgICAgICAgICBzdXBlci5zY3JvbGxUb0luZGV4KHRoaXMuZmlyc3RWaXNpYmxlSW5kZXggKyAob2xkT2Zmc2V0IC0gdGhpcy5fdmlkeE9mZnNldCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX25vU2NhbGUgPSB0cnVlOwogICAgICAgICAgfQogICAgICAgICAgLy8gQXQgZW5kCiAgICAgICAgICBjb25zdCBtYXhPZmZzZXQgPSB0aGlzLl9lZmZlY3RpdmVTaXplIC0gdGhpcy5fdmlydHVhbENvdW50OwogICAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFRvcCA+PSB0aGlzLl9tYXhTY3JvbGxUb3AgJiYgdGhpcy5fbWF4U2Nyb2xsVG9wID4gMCkgewogICAgICAgICAgICB0aGlzLl92aWR4T2Zmc2V0ID0gbWF4T2Zmc2V0OwogICAgICAgICAgICBpZiAob2xkT2Zmc2V0ICE9PSB0aGlzLl92aWR4T2Zmc2V0KSB7CiAgICAgICAgICAgICAgc3VwZXIuc2Nyb2xsVG9JbmRleCh0aGlzLl92aXJ0dWFsQ291bnQpOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZmlyc3RWaXNpYmxlSW5kZXggPiB0aGlzLl92aXJ0dWFsQ291bnQgLSB0aHJlc2hvbGQgJiYgdGhpcy5fdmlkeE9mZnNldCA8IG1heE9mZnNldCkgewogICAgICAgICAgICB0aGlzLl92aWR4T2Zmc2V0ICs9IE1hdGgubWluKG1heE9mZnNldCAtIHRoaXMuX3ZpZHhPZmZzZXQsIG1heFNoaWZ0KTsKICAgICAgICAgICAgaWYgKG9sZE9mZnNldCAhPT0gdGhpcy5fdmlkeE9mZnNldCkgewogICAgICAgICAgICAgIHN1cGVyLnNjcm9sbFRvSW5kZXgodGhpcy5maXJzdFZpc2libGVJbmRleCAtICh0aGlzLl92aWR4T2Zmc2V0IC0gb2xkT2Zmc2V0KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbm9TY2FsZSA9IHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfYWNjZXNzSXJvbkxpc3RBUEkoY2IpIHsKICAgICAgICB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzc0FzeW5jRW5hYmxlZCA9IGZhbHNlOwogICAgICAgIGNvbnN0IHJldHVyblZhbHVlID0gY2IuYXBwbHkodGhpcyk7CiAgICAgICAgdGhpcy5fZGVib3VuY2VyV2FyblByaXZhdGVBUElBY2Nlc3MgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICB0aGlzLl9kZWJvdW5jZXJXYXJuUHJpdmF0ZUFQSUFjY2VzcywKICAgICAgICAgIGFuaW1hdGlvbkZyYW1lLAogICAgICAgICAgKCkgPT4gdGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3NBc3luY0VuYWJsZWQgPSB0cnVlCiAgICAgICAgKTsKICAgICAgICByZXR1cm4gcmV0dXJuVmFsdWU7CiAgICAgIH0KCiAgICAgIC8qIEFsbG93IGlyb24tbGlzdCB0byBhY2Nlc3MgaXRzIEFQSXMgZnJvbSBkZWJvdW5jZWQgY2FsbGJhY2tzIHdpdGhvdXQgd2FybnMgKi8KICAgICAgX2RlYm91bmNlUmVuZGVyKGNiLCBhc3luY01vZHVsZSkgewogICAgICAgIHN1cGVyLl9kZWJvdW5jZVJlbmRlcigoKSA9PiB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShjYiksIGFzeW5jTW9kdWxlKTsKICAgICAgfQoKICAgICAgLyogV2FybiB3aGVuIGlyb24tbGlzdCBBUElzIGFyZSBiZWluZyBhY2Nlc3NlZCBkaXJlY3RseSAqLwogICAgICBfd2FyblByaXZhdGVBUElBY2Nlc3MoYXBpTmFtZSkgewogICAgICAgIGlmICh0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2Vzc0FzeW5jRW5hYmxlZCkgewogICAgICAgICAgY29uc29sZS53YXJuKGBBY2Nlc3NpbmcgcHJpdmF0ZSBBUEkgKCR7YXBpTmFtZX0pIWApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3JlbmRlcigpIHsKICAgICAgICB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fcmVuZGVyKTsKICAgICAgfQoKICAgICAgX2NyZWF0ZUZvY3VzQmFja2ZpbGxJdGVtKCkgeyAvKiBJZ25vcmUgKi8gfQogICAgICBfbXVsdGlTZWxlY3Rpb25DaGFuZ2VkKCkgeyAvKiBJZ25vcmUgKi8gfQogICAgICBjbGVhclNlbGVjdGlvbigpIHsgLyogSWdub3JlICovIH0KICAgICAgX2l0ZW1zQ2hhbmdlZCgpIHsgLyogSWdub3JlICovIH0KICAgICAgX21hbmFnZUZvY3VzKCkgeyAvKiBJZ25vcmUgKi8gfQogICAgICBfcmVtb3ZlRm9jdXNlZEl0ZW0oKSB7IC8qIElnbm9yZSAqLyB9CgogICAgICBnZXQgX2ZpcnN0VmlzaWJsZUluZGV4KCkgewogICAgICAgIHJldHVybiB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKSA9PiBzdXBlci5maXJzdFZpc2libGVJbmRleCk7CiAgICAgIH0KICAgICAgZ2V0IF9sYXN0VmlzaWJsZUluZGV4KCkgewogICAgICAgIHJldHVybiB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSSgoKSA9PiBzdXBlci5sYXN0VmlzaWJsZUluZGV4KTsKICAgICAgfQogICAgICBfc2Nyb2xsVG9JbmRleChpbmRleCkgewogICAgICAgIHRoaXMuX2FjY2Vzc0lyb25MaXN0QVBJKCgpID0+IHRoaXMuc2Nyb2xsVG9JbmRleChpbmRleCkpOwogICAgICB9CiAgICAgIGdldCBmaXJzdFZpc2libGVJbmRleCgpIHsKICAgICAgICB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygnZmlyc3RWaXNpYmxlSW5kZXgnKTsgcmV0dXJuIHN1cGVyLmZpcnN0VmlzaWJsZUluZGV4OwogICAgICB9CiAgICAgIHNldCBmaXJzdFZpc2libGVJbmRleCh2YWx1ZSkgewogICAgICAgIHRoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzKCdmaXJzdFZpc2libGVJbmRleCcpOyBzdXBlci5maXJzdFZpc2libGVJbmRleCA9IHZhbHVlOwogICAgICB9CiAgICAgIGdldCBsYXN0VmlzaWJsZUluZGV4KCkgewogICAgICAgIHRoaXMuX3dhcm5Qcml2YXRlQVBJQWNjZXNzKCdsYXN0VmlzaWJsZUluZGV4Jyk7IHJldHVybiBzdXBlci5sYXN0VmlzaWJsZUluZGV4OwogICAgICB9CiAgICAgIHNldCBsYXN0VmlzaWJsZUluZGV4KHZhbHVlKSB7CiAgICAgICAgdGhpcy5fd2FyblByaXZhdGVBUElBY2Nlc3MoJ2xhc3RWaXNpYmxlSW5kZXgnKTsgc3VwZXIubGFzdFZpc2libGVJbmRleCA9IHZhbHVlOwogICAgICB9CiAgICAgIHVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcygpIHsKICAgICAgICB0aGlzLl93YXJuUHJpdmF0ZUFQSUFjY2VzcygndXBkYXRlVmlld3BvcnRCb3VuZGFyaWVzJyk7IHN1cGVyLnVwZGF0ZVZpZXdwb3J0Qm91bmRhcmllcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICB9CiAgICAgIF9yZXNpemVIYW5kbGVyKCkgewogICAgICAgIHN1cGVyLl9yZXNpemVIYW5kbGVyKCk7CiAgICAgICAgZmx1c2goKTsKICAgICAgfQogICAgfQoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShHcmlkU2Nyb2xsZXJFbGVtZW50LmlzLCBHcmlkU2Nyb2xsZXJFbGVtZW50KTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgQTExeU1peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBBMTF5TWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICdfYTExeVVwZGF0ZUdyaWRTaXplKHNpemUsIF9jb2x1bW5UcmVlLCBfY29sdW1uVHJlZS4qKScKICAgICAgICBdOwogICAgICB9CgogICAgICBfYTExeUdldEhlYWRlclJvd0NvdW50KF9jb2x1bW5UcmVlKSB7CiAgICAgICAgcmV0dXJuIF9jb2x1bW5UcmVlLmZpbHRlcihsZXZlbCA9PiBsZXZlbC5zb21lKGNvbCA9PiBjb2wuX2hlYWRlclRlbXBsYXRlIHx8IGNvbC5oZWFkZXJSZW5kZXJlciB8fCBjb2wucGF0aCB8fCBjb2wuaGVhZGVyKSkubGVuZ3RoOwogICAgICB9CgogICAgICBfYTExeUdldEZvb3RlclJvd0NvdW50KF9jb2x1bW5UcmVlKSB7CiAgICAgICAgcmV0dXJuIF9jb2x1bW5UcmVlLmZpbHRlcihsZXZlbCA9PiBsZXZlbC5zb21lKGNvbCA9PiBjb2wuX2hlYWRlclRlbXBsYXRlIHx8IGNvbC5oZWFkZXJSZW5kZXJlcikpLmxlbmd0aDsKICAgICAgfQoKICAgICAgX2ExMXlVcGRhdGVHcmlkU2l6ZShzaXplLCBfY29sdW1uVHJlZSkgewogICAgICAgIGlmIChzaXplID09PSB1bmRlZmluZWQgfHwgX2NvbHVtblRyZWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgYm9keUNvbHVtbnMgPSBfY29sdW1uVHJlZVtfY29sdW1uVHJlZS5sZW5ndGggLSAxXTsKICAgICAgICB0aGlzLiQudGFibGUuc2V0QXR0cmlidXRlKAogICAgICAgICAgJ2FyaWEtcm93Y291bnQnLAogICAgICAgICAgc2l6ZSArIHRoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudChfY29sdW1uVHJlZSkgKyB0aGlzLl9hMTF5R2V0Rm9vdGVyUm93Q291bnQoX2NvbHVtblRyZWUpCiAgICAgICAgKTsKICAgICAgICB0aGlzLiQudGFibGUuc2V0QXR0cmlidXRlKCdhcmlhLWNvbGNvdW50JywgYm9keUNvbHVtbnMgJiYgYm9keUNvbHVtbnMubGVuZ3RoIHx8IDApOwoKICAgICAgICB0aGlzLl9hMTF5VXBkYXRlSGVhZGVyUm93cygpOwogICAgICAgIHRoaXMuX2ExMXlVcGRhdGVGb290ZXJSb3dzKCk7CiAgICAgIH0KCiAgICAgIF9hMTF5VXBkYXRlSGVhZGVyUm93cygpIHsKICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5oZWFkZXIuY2hpbGRyZW4pLmZvckVhY2goKGhlYWRlclJvdywgaW5kZXgpID0+CiAgICAgICAgICBoZWFkZXJSb3cuc2V0QXR0cmlidXRlKCdhcmlhLXJvd2luZGV4JywgaW5kZXggKyAxKQogICAgICAgICk7CiAgICAgIH0KCiAgICAgIF9hMTF5VXBkYXRlRm9vdGVyUm93cygpIHsKICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5mb290ZXIuY2hpbGRyZW4pLmZvckVhY2goKGZvb3RlclJvdywgaW5kZXgpID0+CiAgICAgICAgICBmb290ZXJSb3cuc2V0QXR0cmlidXRlKAogICAgICAgICAgICAnYXJpYS1yb3dpbmRleCcsCiAgICAgICAgICAgIHRoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0aGlzLl9jb2x1bW5UcmVlKSArIHRoaXMuc2l6ZSArIGluZGV4ICsgMQogICAgICAgICAgKQogICAgICAgICk7CiAgICAgIH0KCiAgICAgIF9hMTF5VXBkYXRlUm93Um93aW5kZXgocm93LCBpbmRleCkgewogICAgICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ2FyaWEtcm93aW5kZXgnLCBpbmRleCArIHRoaXMuX2ExMXlHZXRIZWFkZXJSb3dDb3VudCh0aGlzLl9jb2x1bW5UcmVlKSArIDEpOwogICAgICB9CgogICAgICBfYTExeVVwZGF0ZVJvd1NlbGVjdGVkKHJvdywgc2VsZWN0ZWQpIHsKICAgICAgICAvLyBKYXdzIHJlYWRzIHNlbGVjdGlvbiBvbmx5IGZvciByb3dzLCBOVkRBIG9ubHkgZm9yIGNlbGxzCiAgICAgICAgcm93LnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIEJvb2xlYW4oc2VsZWN0ZWQpKTsKICAgICAgICBBcnJheS5mcm9tKHJvdy5jaGlsZHJlbikuZm9yRWFjaChjZWxsID0+CiAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgnYXJpYS1zZWxlY3RlZCcsIEJvb2xlYW4oc2VsZWN0ZWQpKQogICAgICAgICk7CiAgICAgIH0KCiAgICAgIF9hMTF5VXBkYXRlUm93TGV2ZWwocm93LCBsZXZlbCkgewogICAgICAgIHJvdy5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGV2ZWwnLCBsZXZlbCArIDEpOwogICAgICB9CgogICAgICBfYTExeVVwZGF0ZVJvd0RldGFpbHNPcGVuZWQocm93LCBkZXRhaWxzT3BlbmVkKSB7CiAgICAgICAgQXJyYXkuZnJvbShyb3cuY2hpbGRyZW4pLmZvckVhY2goY2VsbCA9PiB7CiAgICAgICAgICBpZiAodHlwZW9mIGRldGFpbHNPcGVuZWQgPT09ICdib29sZWFuJykgewogICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcsIGRldGFpbHNPcGVuZWQpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaWYgKGNlbGwuaGFzQXR0cmlidXRlKCdhcmlhLWV4cGFuZGVkJykpIHsKICAgICAgICAgICAgICBjZWxsLnJlbW92ZUF0dHJpYnV0ZSgnYXJpYS1leHBhbmRlZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIF9hMTF5U2V0Um93RGV0YWlsc0NlbGwocm93LCBkZXRhaWxzQ2VsbCkgewogICAgICAgIEFycmF5LmZyb20ocm93LmNoaWxkcmVuKS5mb3JFYWNoKGNlbGwgPT4gewogICAgICAgICAgaWYgKGNlbGwgIT09IGRldGFpbHNDZWxsKSB7CiAgICAgICAgICAgIGNlbGwuc2V0QXR0cmlidXRlKCdhcmlhLWNvbnRyb2xzJywgZGV0YWlsc0NlbGwuaWQpOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfYTExeVVwZGF0ZUNlbGxDb2xzcGFuKGNlbGwsIGNvbHNwYW4pIHsKICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgnYXJpYS1jb2xzcGFuJywgTnVtYmVyKGNvbHNwYW4pKTsKICAgICAgfQoKICAgICAgX2ExMXlVcGRhdGVTb3J0ZXJzKCkgewogICAgICAgIEFycmF5LmZyb20odGhpcy5xdWVyeVNlbGVjdG9yQWxsKCd2YWFkaW4tZ3JpZC1zb3J0ZXInKSkuZm9yRWFjaChzb3J0ZXIgPT4gewogICAgICAgICAgbGV0IGNlbGxDb250ZW50ID0gc29ydGVyLnBhcmVudE5vZGU7CiAgICAgICAgICB3aGlsZSAoY2VsbENvbnRlbnQgJiYgY2VsbENvbnRlbnQubG9jYWxOYW1lICE9PSAndmFhZGluLWdyaWQtY2VsbC1jb250ZW50JykgewogICAgICAgICAgICBjZWxsQ29udGVudCA9IGNlbGxDb250ZW50LnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY2VsbENvbnRlbnQgJiYgY2VsbENvbnRlbnQuYXNzaWduZWRTbG90KSB7CiAgICAgICAgICAgIGNvbnN0IGNlbGwgPSBjZWxsQ29udGVudC5hc3NpZ25lZFNsb3QucGFyZW50Tm9kZTsKICAgICAgICAgICAgY2VsbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtc29ydCcsIHsKICAgICAgICAgICAgICAnYXNjJzogJ2FzY2VuZGluZycsCiAgICAgICAgICAgICAgJ2Rlc2MnOiAnZGVzY2VuZGluZycKICAgICAgICAgICAgfVtTdHJpbmcoc29ydGVyLmRpcmVjdGlvbildIHx8ICdub25lJyk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFZhYWRpbiBMdGQuCiAgICBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAqLwogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IEFjdGl2ZUl0ZW1NaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgQWN0aXZlSXRlbU1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogVGhlIGl0ZW0gdXNlciBoYXMgbGFzdCBpbnRlcmFjdGVkIHdpdGguIFR1cm5zIHRvIGBudWxsYCBhZnRlciB1c2VyIGRlYWN0aXZhdGVzCiAgICAgICAgICAgKiB0aGUgaXRlbSBieSByZS1pbnRlcmFjdGluZyB3aXRoIHRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0uCiAgICAgICAgICAgKi8KICAgICAgICAgIGFjdGl2ZUl0ZW06IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiBudWxsCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgcmVhZHkoKSB7CiAgICAgICAgc3VwZXIucmVhZHkoKTsKCiAgICAgICAgdGhpcy4kLnNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5fb25DbGljay5iaW5kKHRoaXMpKTsKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2NlbGwtYWN0aXZhdGUnLCB0aGlzLl9hY3RpdmF0ZUl0ZW0uYmluZCh0aGlzKSk7CiAgICAgIH0KCiAgICAgIF9hY3RpdmF0ZUl0ZW0oZSkgewogICAgICAgIGNvbnN0IG1vZGVsID0gZS5kZXRhaWwubW9kZWw7CiAgICAgICAgY29uc3QgY2xpY2tlZEl0ZW0gPSBtb2RlbCA/IG1vZGVsLml0ZW0gOiBudWxsOwoKICAgICAgICBpZiAoY2xpY2tlZEl0ZW0pIHsKICAgICAgICAgIHRoaXMuYWN0aXZlSXRlbSA9ICF0aGlzLl9pdGVtc0VxdWFsKHRoaXMuYWN0aXZlSXRlbSwgY2xpY2tlZEl0ZW0pID8gY2xpY2tlZEl0ZW0gOiBudWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gd2UgbmVlZCB0byBsaXN0ZW4gdG8gY2xpY2sgaW5zdGVhZCBvZiB0YXAgYmVjYXVzZSBvbiBtb2JpbGUgc2FmYXJpLCB0aGUKICAgICAgLy8gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCBoYXMgbm90IGJlZW4gdXBkYXRlZCAoZm9jdXMgaGFzIG5vdCBiZWVuIHNoaWZ0ZWQpCiAgICAgIC8vIHlldCBhdCB0aGUgcG9pbnQgd2hlbiB0YXAgZXZlbnQgaXMgYmVpbmcgZXhlY3V0ZWQuCiAgICAgIF9vbkNsaWNrKGUpIHsKICAgICAgICBpZiAoZS5kZWZhdWx0UHJldmVudGVkKSB7CiAgICAgICAgICAvLyBTb21ldGhpbmcgaGFzIGhhbmRsZWQgdGhpcyBjbGljayBhbHJlYWR5LCBlLiBnLiwgPHZhYWRpbi1ncmlkLXNvcnRlcj4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHBhdGggPSBlLmNvbXBvc2VkUGF0aCgpOwogICAgICAgIGNvbnN0IGNlbGwgPSBwYXRoW3BhdGguaW5kZXhPZih0aGlzLiQudGFibGUpIC0gM107CiAgICAgICAgaWYgKCFjZWxsIHx8IGNlbGwuZ2V0QXR0cmlidXRlKCdwYXJ0JykuaW5kZXhPZignZGV0YWlscy1jZWxsJykgPiAtMSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBjZWxsQ29udGVudCA9IGNlbGwuX2NvbnRlbnQ7CgogICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLmdldFJvb3ROb2RlKCkuYWN0aXZlRWxlbWVudDsKICAgICAgICBjb25zdCBjZWxsQ29udGVudEhhc0ZvY3VzID0gY2VsbENvbnRlbnQuY29udGFpbnMoYWN0aXZlRWxlbWVudCkgJiYKICAgICAgICAgIC8vIE1TSUUgYnVnOiBmbGV4IGNoaWxkcmVuIHJlY2VpdmUgZm9jdXMuIE1ha2UgdHlwZSAmIGF0dHJpYnV0ZXMgY2hlY2suCiAgICAgICAgICAoIXRoaXMuX2llIHx8IHRoaXMuX2lzRm9jdXNhYmxlKGFjdGl2ZUVsZW1lbnQpKTsKICAgICAgICBpZiAoIWNlbGxDb250ZW50SGFzRm9jdXMgJiYgIXRoaXMuX2lzRm9jdXNhYmxlKGUudGFyZ2V0KSkgewogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnY2VsbC1hY3RpdmF0ZScsIHtkZXRhaWw6IHsKICAgICAgICAgICAgbW9kZWw6IHRoaXMuX19nZXRSb3dNb2RlbChjZWxsLnBhcmVudEVsZW1lbnQpCiAgICAgICAgICB9fSkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2lzRm9jdXNhYmxlKHRhcmdldCkgewogICAgICAgIGlmICghdGFyZ2V0LnBhcmVudE5vZGUpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZm9jdXNhYmxlcyA9IEFycmF5LmZyb20odGFyZ2V0LnBhcmVudE5vZGUKICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCdbdGFiaW5kZXhdLCBidXR0b24sIGlucHV0LCBzZWxlY3QsIHRleHRhcmVhLCBvYmplY3QsIGlmcmFtZSwgbGFiZWwsIGFbaHJlZl0sIGFyZWFbaHJlZl0nKSkKICAgICAgICAgIC5maWx0ZXIoZWxlbWVudCA9PiBlbGVtZW50LmdldEF0dHJpYnV0ZSgncGFydCcpICE9PSAnY2VsbCBib2R5LWNlbGwnKTsKCiAgICAgICAgY29uc3QgaXNGb2N1c2FibGVFbGVtZW50ID0gZm9jdXNhYmxlcy5pbmRleE9mKHRhcmdldCkgIT09IC0xOwogICAgICAgIHJldHVybiAhdGFyZ2V0LmRpc2FibGVkICYmIGlzRm9jdXNhYmxlRWxlbWVudDsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCgogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IEFycmF5RGF0YVByb3ZpZGVyTWl4aW4gPSBzdXBlckNsYXNzID0+IGNsYXNzIEFycmF5RGF0YVByb3ZpZGVyTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKCiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogQW4gYXJyYXkgY29udGFpbmluZyB0aGUgaXRlbXMgd2hpY2ggd2lsbCBiZSBzdGFtcGVkIHRvIHRoZSBjb2x1bW4gdGVtcGxhdGUKICAgICAgICAgICAqIGluc3RhbmNlcy4KICAgICAgICAgICAqLwogICAgICAgICAgaXRlbXM6IEFycmF5CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX2l0ZW1zQ2hhbmdlZChpdGVtcywgaXRlbXMuKiwgaXNBdHRhY2hlZCknCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgX2l0ZW1zQ2hhbmdlZChpdGVtcywgc3BsaWNlcywgaXNBdHRhY2hlZCkgewogICAgICAgIGlmICghaXNBdHRhY2hlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoaXRlbXMpKSB7CiAgICAgICAgICBpZiAoaXRlbXMgPT09IHVuZGVmaW5lZCB8fCBpdGVtcyA9PT0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnNpemUgPSAwOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyID09PSB0aGlzLl9hcnJheURhdGFQcm92aWRlcikgewogICAgICAgICAgICB0aGlzLmRhdGFQcm92aWRlciA9IHVuZGVmaW5lZDsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIHRoaXMuc2l6ZSA9IGl0ZW1zLmxlbmd0aDsKICAgICAgICB0aGlzLmRhdGFQcm92aWRlciA9IHRoaXMuZGF0YVByb3ZpZGVyIHx8IHRoaXMuX2FycmF5RGF0YVByb3ZpZGVyOwogICAgICAgIHRoaXMuY2xlYXJDYWNoZSgpOwogICAgICAgIHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpOwogICAgICB9CgogICAgICBfYXJyYXlEYXRhUHJvdmlkZXIob3B0cywgY2IpIHsKICAgICAgICBsZXQgaXRlbXMgPSAoQXJyYXkuaXNBcnJheSh0aGlzLml0ZW1zKSA/IHRoaXMuaXRlbXMgOiBbXSkuc2xpY2UoMCk7CgogICAgICAgIGlmICh0aGlzLl9maWx0ZXJzICYmIHRoaXMuX2NoZWNrUGF0aHModGhpcy5fZmlsdGVycywgJ2ZpbHRlcmluZycsIGl0ZW1zKSkgewogICAgICAgICAgaXRlbXMgPSB0aGlzLl9maWx0ZXIoaXRlbXMpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5zaXplID0gaXRlbXMubGVuZ3RoOwoKICAgICAgICBpZiAob3B0cy5zb3J0T3JkZXJzLmxlbmd0aCAmJiB0aGlzLl9jaGVja1BhdGhzKHRoaXMuX3NvcnRlcnMsICdzb3J0aW5nJywgaXRlbXMpKSB7CiAgICAgICAgICBpdGVtcyA9IGl0ZW1zLnNvcnQodGhpcy5fbXVsdGlTb3J0LmJpbmQodGhpcykpOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qgc3RhcnQgPSBvcHRzLnBhZ2UgKiBvcHRzLnBhZ2VTaXplOwogICAgICAgIGNvbnN0IGVuZCA9IHN0YXJ0ICsgb3B0cy5wYWdlU2l6ZTsKICAgICAgICBjb25zdCBzbGljZSA9IGl0ZW1zLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICAgIGNiKHNsaWNlLCBpdGVtcy5sZW5ndGgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2hlY2sgYXJyYXkgb2YgZmlsdGVycy9zb3J0ZXJzIGZvciBwYXRocyB2YWxpZGl0eSwgY29uc29sZS53YXJuIGludmFsaWQgaXRlbXMKICAgICAgICogQHBhcmFtIHtBcnJheX0gIGFycmF5VG9DaGVjayBUaGUgYXJyYXkgb2YgZmlsdGVycy9zb3J0ZXJzIHRvIGNoZWNrCiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBhY3Rpb24gICAgICAgVGhlIG5hbWUgb2YgYWN0aW9uIHRvIGluY2x1ZGUgaW4gd2FybmluZyAoZmlsdGVyaW5nLCBzb3J0aW5nKQogICAgICAgKiBAcGFyYW0ge0FycmF5fSAgaXRlbXMKICAgICAgICovCiAgICAgIF9jaGVja1BhdGhzKGFycmF5VG9DaGVjaywgYWN0aW9uLCBpdGVtcykgewogICAgICAgIGlmICghaXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQoKICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKCiAgICAgICAgZm9yICh2YXIgaSBpbiBhcnJheVRvQ2hlY2spIHsKICAgICAgICAgIGNvbnN0IHBhdGggPSBhcnJheVRvQ2hlY2tbaV0ucGF0aDsKCiAgICAgICAgICAvLyBza2lwIHNpbXBsZSBwYXRocwogICAgICAgICAgaWYgKCFwYXRoIHx8IHBhdGguaW5kZXhPZignLicpID09PSAtMSkgewogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBwYXJlbnRQcm9wZXJ0eSA9IHBhdGgucmVwbGFjZSgvXC5bXlwuXSokLywgJycpOyAvLyBhLmIuYyAtPiBhLmIKICAgICAgICAgIGlmIChCYXNlLmdldChwYXJlbnRQcm9wZXJ0eSwgaXRlbXNbMF0pID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKGBQYXRoICIke3BhdGh9IiB1c2VkIGZvciAke2FjdGlvbn0gZG9lcyBub3QgZXhpc3QgaW4gYWxsIG9mIHRoZSBpdGVtcywgJHthY3Rpb259IGlzIGRpc2FibGVkLmApOwogICAgICAgICAgICByZXN1bHQgPSBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICAgIF9tdWx0aVNvcnQoYSwgYikgewogICAgICAgIHJldHVybiB0aGlzLl9zb3J0ZXJzLm1hcChzb3J0ID0+IHsKICAgICAgICAgIGlmIChzb3J0LmRpcmVjdGlvbiA9PT0gJ2FzYycpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBhcmUoQmFzZS5nZXQoc29ydC5wYXRoLCBhKSwgQmFzZS5nZXQoc29ydC5wYXRoLCBiKSk7CiAgICAgICAgICB9IGVsc2UgaWYgKHNvcnQuZGlyZWN0aW9uID09PSAnZGVzYycpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbXBhcmUoQmFzZS5nZXQoc29ydC5wYXRoLCBiKSwgQmFzZS5nZXQoc29ydC5wYXRoLCBhKSk7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9KS5yZWR1Y2UoKHAsIG4pID0+IHsKICAgICAgICAgIHJldHVybiBwID8gcCA6IG47CiAgICAgICAgfSwgMCk7CiAgICAgIH0KCiAgICAgIF9ub3JtYWxpemVFbXB0eVZhbHVlKHZhbHVlKSB7CiAgICAgICAgaWYgKFt1bmRlZmluZWQsIG51bGxdLmluZGV4T2YodmFsdWUpID49IDApIHsKICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9IGVsc2UgaWYgKGlzTmFOKHZhbHVlKSkgewogICAgICAgICAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9jb21wYXJlKGEsIGIpIHsKICAgICAgICBhID0gdGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShhKTsKICAgICAgICBiID0gdGhpcy5fbm9ybWFsaXplRW1wdHlWYWx1ZShiKTsKCiAgICAgICAgaWYgKGEgPCBiKSB7CiAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgfQogICAgICAgIGlmIChhID4gYikgewogICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiAwOwogICAgICB9CgogICAgICBfZmlsdGVyKGl0ZW1zKSB7CiAgICAgICAgcmV0dXJuIGl0ZW1zLmZpbHRlcigoaXRlbSwgaW5kZXgpID0+IHsKICAgICAgICAgIHJldHVybiB0aGlzLl9maWx0ZXJzLmZpbHRlcihmaWx0ZXIgPT4gewogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHRoaXMuX25vcm1hbGl6ZUVtcHR5VmFsdWUoQmFzZS5nZXQoZmlsdGVyLnBhdGgsIGl0ZW0pKTsKICAgICAgICAgICAgY29uc3QgZmlsdGVyVmFsdWVMb3dlcmNhc2UgPSB0aGlzLl9ub3JtYWxpemVFbXB0eVZhbHVlKGZpbHRlci52YWx1ZSkudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKS50b0xvd2VyQ2FzZSgpLmluZGV4T2YoZmlsdGVyVmFsdWVMb3dlcmNhc2UpID09PSAtMTsKICAgICAgICAgIH0pLmxlbmd0aCA9PT0gMDsKICAgICAgICB9KTsKICAgICAgfQoKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFZhYWRpbiBMdGQuCiAgICBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAqLwoKICAgIC8qKgogICAgICogQHBvbHltZXJNaXhpbgogICAgICovCiAgICBjb25zdCBDb2x1bW5SZXNpemluZ01peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBDb2x1bW5SZXNpemluZ01peGluIGV4dGVuZHMgR2VzdHVyZUV2ZW50TGlzdGVuZXJzKHN1cGVyQ2xhc3MpIHsKCiAgICAgIHJlYWR5KCkgewogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgY29uc3Qgc2Nyb2xsZXIgPSB0aGlzLiQuc2Nyb2xsZXI7CiAgICAgICAgYWRkTGlzdGVuZXIoc2Nyb2xsZXIsICd0cmFjaycsIHRoaXMuX29uSGVhZGVyVHJhY2suYmluZCh0aGlzKSk7CgogICAgICAgIC8vIERpc2FsbG93IHNjcm9sbGluZyB3aGlsZSByZXNpemluZwogICAgICAgIHNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIGUgPT4gc2Nyb2xsZXIuaGFzQXR0cmlidXRlKCdjb2x1bW4tcmVzaXppbmcnKSAmJiBlLnByZXZlbnREZWZhdWx0KCkpOwoKICAgICAgICAvLyBEaXNhYmxlIGNvbnRleHRtZW51IG9uIGFueSByZXNpemUgc2VwYXJhdG9yLgogICAgICAgIHNjcm9sbGVyLmFkZEV2ZW50TGlzdGVuZXIoJ2NvbnRleHRtZW51JywgZSA9PiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3BhcnQnKSA9PSAncmVzaXplLWhhbmRsZScgJiYgZS5wcmV2ZW50RGVmYXVsdCgpKTsKCiAgICAgICAgLy8gRGlzYWJsZSBuYXRpdmUgY2VsbCBmb2N1cyB3aGVuIHJlc2l6aW5nCiAgICAgICAgc2Nyb2xsZXIuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgZSA9PiBlLnRhcmdldC5nZXRBdHRyaWJ1dGUoJ3BhcnQnKSA9PT0gJ3Jlc2l6ZS1oYW5kbGUnICYmIGUucHJldmVudERlZmF1bHQoKSk7CiAgICAgIH0KCiAgICAgIF9vbkhlYWRlclRyYWNrKGUpIHsKICAgICAgICBjb25zdCBoYW5kbGUgPSBlLnRhcmdldDsKICAgICAgICBpZiAoaGFuZGxlLmdldEF0dHJpYnV0ZSgncGFydCcpID09PSAncmVzaXplLWhhbmRsZScpIHsKICAgICAgICAgIGNvbnN0IGNlbGwgPSBoYW5kbGUucGFyZW50RWxlbWVudDsKICAgICAgICAgIGxldCBjb2x1bW4gPSBjZWxsLl9jb2x1bW47CgogICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdjb2x1bW4tcmVzaXppbmcnLCB0cnVlLCB0aGlzLiQuc2Nyb2xsZXIpOwoKICAgICAgICAgIC8vIEdldCB0aGUgdGFyZ2V0IGNvbHVtbiB0byByZXNpemUKICAgICAgICAgIHdoaWxlIChjb2x1bW4ubG9jYWxOYW1lID09PSAndmFhZGluLWdyaWQtY29sdW1uLWdyb3VwJykgewogICAgICAgICAgICBjb2x1bW4gPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChjb2x1bW4uX2NoaWxkQ29sdW1ucywgMCkKICAgICAgICAgICAgICAuc29ydChmdW5jdGlvbihhLCBiKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYS5fb3JkZXIgLSBiLl9vcmRlcjsKICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIC5maWx0ZXIoZnVuY3Rpb24oY29sdW1uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gIWNvbHVtbi5oaWRkZW47CiAgICAgICAgICAgICAgfSkucG9wKCk7CiAgICAgICAgICB9CgogICAgICAgICAgY29uc3QgY29sdW1uUm93Q2VsbHMgPSBBcnJheS5mcm9tKHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvckFsbCgnW3BhcnR+PSJyb3ciXTpsYXN0LWNoaWxkIFtwYXJ0fj0iY2VsbCJdJykpOwogICAgICAgICAgdmFyIHRhcmdldENlbGwgPSBjb2x1bW5Sb3dDZWxscy5maWx0ZXIoY2VsbCA9PiBjZWxsLl9jb2x1bW4gPT09IGNvbHVtbilbMF07CiAgICAgICAgICAvLyBSZXNpemUgdGhlIHRhcmdldCBjb2x1bW4KICAgICAgICAgIGlmICh0YXJnZXRDZWxsLm9mZnNldFdpZHRoKSB7CiAgICAgICAgICAgIHZhciBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKHRhcmdldENlbGwpOwogICAgICAgICAgICB2YXIgbWluV2lkdGggPSAxMCArIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdMZWZ0KSArIHBhcnNlSW50KHN0eWxlLnBhZGRpbmdSaWdodCkgKyBwYXJzZUludChzdHlsZS5ib3JkZXJMZWZ0V2lkdGgpCiAgICAgICAgICAgICAgKyBwYXJzZUludChzdHlsZS5ib3JkZXJSaWdodFdpZHRoKSArIHBhcnNlSW50KHN0eWxlLm1hcmdpbkxlZnQpICsgcGFyc2VJbnQoc3R5bGUubWFyZ2luUmlnaHQpOwogICAgICAgICAgICBjb25zdCBtYXhXaWR0aCA9IHRhcmdldENlbGwub2Zmc2V0V2lkdGggKyAodGhpcy5fX2lzUlRMID8gdGFyZ2V0Q2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC0gZS5kZXRhaWwueCA6CiAgICAgICAgICAgICAgZS5kZXRhaWwueCAtIHRhcmdldENlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQpOwogICAgICAgICAgICBjb2x1bW4ud2lkdGggPSBNYXRoLm1heChtaW5XaWR0aCwgbWF4V2lkdGgpICsgJ3B4JzsKICAgICAgICAgICAgY29sdW1uLmZsZXhHcm93ID0gMDsKICAgICAgICAgIH0KICAgICAgICAgIC8vIEZpeCB3aWR0aCBhbmQgZmxleC1ncm93IGZvciBhbGwgcHJlY2VkaW5nIGNvbHVtbnMKICAgICAgICAgIGNvbHVtblJvd0NlbGxzCiAgICAgICAgICAgIC5zb3J0KAogICAgICAgICAgICAgIGZ1bmN0aW9uKGEsIGIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhLl9jb2x1bW4uX29yZGVyIC0gYi5fY29sdW1uLl9vcmRlcjsKICAgICAgICAgICAgICB9KQogICAgICAgICAgICAuZm9yRWFjaChmdW5jdGlvbihjZWxsLCBpbmRleCwgYXJyYXkpIHsKICAgICAgICAgICAgICBpZiAoaW5kZXggPCBhcnJheS5pbmRleE9mKHRhcmdldENlbGwpKSB7CiAgICAgICAgICAgICAgICBjZWxsLl9jb2x1bW4ud2lkdGggPSBjZWxsLm9mZnNldFdpZHRoICsgJ3B4JzsKICAgICAgICAgICAgICAgIGNlbGwuX2NvbHVtbi5mbGV4R3JvdyA9IDA7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICBpZiAoZS5kZXRhaWwuc3RhdGUgPT09ICdlbmQnKSB7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnY29sdW1uLXJlc2l6aW5nJywgZmFsc2UsIHRoaXMuJC5zY3JvbGxlcik7CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NvbHVtbi1yZXNpemUnLCB7CiAgICAgICAgICAgICAgZGV0YWlsOiB7cmVzaXplZENvbHVtbjogY29sdW1ufQogICAgICAgICAgICB9KSk7CiAgICAgICAgICB9CgogICAgICAgICAgLy8gTm90aWZ5IHJlc2l6ZQogICAgICAgICAgdGhpcy5fcmVzaXplSGFuZGxlcigpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICogRmlyZWQgd2hlbiBhIGNvbHVtbiBpbiB0aGUgZ3JpZCBpcyByZXNpemVkIGJ5IHRoZSB1c2VyLgogICAgICAqCiAgICAgICogQGV2ZW50IGNvbHVtbi1yZXNpemUKICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0YWlsCiAgICAgICogQHBhcmFtIHtPYmplY3R9IGRldGFpbC5yZXNpemVkQ29sdW1uIHRoZSBjb2x1bW4gdGhhdCB3YXMgcmVzaXplZAogICAgICAqLwogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCgogICAgY29uc3QgSXRlbUNhY2hlID0gY2xhc3MgSXRlbUNhY2hlIHsKCiAgICAgIGNvbnN0cnVjdG9yKGdyaWQsIHBhcmVudENhY2hlLCBwYXJlbnRJdGVtKSB7CiAgICAgICAgdGhpcy5ncmlkID0gZ3JpZDsKICAgICAgICB0aGlzLnBhcmVudENhY2hlID0gcGFyZW50Q2FjaGU7CiAgICAgICAgdGhpcy5wYXJlbnRJdGVtID0gcGFyZW50SXRlbTsKICAgICAgICB0aGlzLml0ZW1DYWNoZXMgPSB7fTsKICAgICAgICB0aGlzLml0ZW1zID0ge307CiAgICAgICAgdGhpcy5lZmZlY3RpdmVTaXplID0gMDsKICAgICAgICB0aGlzLnNpemUgPSAwOwogICAgICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0ge307CiAgICAgIH0KCiAgICAgIGlzTG9hZGluZygpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGhpcy5wZW5kaW5nUmVxdWVzdHMpLmxlbmd0aCB8fCBPYmplY3Qua2V5cyh0aGlzLml0ZW1DYWNoZXMpLmZpbHRlcihpbmRleCA9PiB7CiAgICAgICAgICByZXR1cm4gdGhpcy5pdGVtQ2FjaGVzW2luZGV4XS5pc0xvYWRpbmcoKTsKICAgICAgICB9KVswXTsKICAgICAgfQoKICAgICAgZ2V0SXRlbUZvckluZGV4KGluZGV4KSB7CiAgICAgICAgY29uc3Qge2NhY2hlLCBzY2FsZWRJbmRleH0gPSB0aGlzLmdldENhY2hlQW5kSW5kZXgoaW5kZXgpOwogICAgICAgIHJldHVybiBjYWNoZS5pdGVtc1tzY2FsZWRJbmRleF07CiAgICAgIH0KCiAgICAgIHVwZGF0ZVNpemUoKSB7CiAgICAgICAgdGhpcy5lZmZlY3RpdmVTaXplID0gKCF0aGlzLnBhcmVudEl0ZW0gfHwgdGhpcy5ncmlkLl9pc0V4cGFuZGVkKHRoaXMucGFyZW50SXRlbSkpID8KICAgICAgICAgIHRoaXMuc2l6ZSArIE9iamVjdC5rZXlzKHRoaXMuaXRlbUNhY2hlcykucmVkdWNlKChwcmV2LCBjdXJyKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHN1YkNhY2hlID0gdGhpcy5pdGVtQ2FjaGVzW2N1cnJdOwogICAgICAgICAgICBzdWJDYWNoZS51cGRhdGVTaXplKCk7CiAgICAgICAgICAgIHJldHVybiBwcmV2ICsgc3ViQ2FjaGUuZWZmZWN0aXZlU2l6ZTsKICAgICAgICAgIH0sIDApIDoKICAgICAgICAgIDA7CiAgICAgIH0KCiAgICAgIGVuc3VyZVN1YkNhY2hlRm9yU2NhbGVkSW5kZXgoc2NhbGVkSW5kZXgpIHsKICAgICAgICBpZiAoIXRoaXMuaXRlbUNhY2hlc1tzY2FsZWRJbmRleF0pIHsKICAgICAgICAgIGNvbnN0IHN1YkNhY2hlID0gbmV3IEl0ZW1DYWNoZSh0aGlzLmdyaWQsIHRoaXMsIHRoaXMuaXRlbXNbc2NhbGVkSW5kZXhdKTsKICAgICAgICAgIHRoaXMuaXRlbUNhY2hlc1tzY2FsZWRJbmRleF0gPSBzdWJDYWNoZTsKICAgICAgICAgIHRoaXMuZ3JpZC5fbG9hZFBhZ2UoMCwgc3ViQ2FjaGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZ2V0Q2FjaGVBbmRJbmRleChpbmRleCkgewogICAgICAgIGxldCB0aGlzTGV2ZWxJbmRleCA9IGluZGV4OwogICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLml0ZW1DYWNoZXMpOwogICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgZXhwYW5kZWRJbmRleCA9IE51bWJlcihrZXlzW2ldKTsKICAgICAgICAgIGNvbnN0IHN1YkNhY2hlID0gdGhpcy5pdGVtQ2FjaGVzW2V4cGFuZGVkSW5kZXhdOwogICAgICAgICAgaWYgKHRoaXNMZXZlbEluZGV4IDw9IGV4cGFuZGVkSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIHtjYWNoZTogdGhpcywgc2NhbGVkSW5kZXg6IHRoaXNMZXZlbEluZGV4fTsKICAgICAgICAgIH0gZWxzZSBpZiAodGhpc0xldmVsSW5kZXggPD0gZXhwYW5kZWRJbmRleCArIHN1YkNhY2hlLmVmZmVjdGl2ZVNpemUpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YkNhY2hlLmdldENhY2hlQW5kSW5kZXgodGhpc0xldmVsSW5kZXggLSBleHBhbmRlZEluZGV4IC0gMSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzTGV2ZWxJbmRleCAtPSBzdWJDYWNoZS5lZmZlY3RpdmVTaXplOwogICAgICAgIH0KICAgICAgICByZXR1cm4ge2NhY2hlOiB0aGlzLCBzY2FsZWRJbmRleDogdGhpc0xldmVsSW5kZXh9OwogICAgICB9CgogICAgfTsKCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgRGF0YVByb3ZpZGVyTWl4aW4gPSBzdXBlckNsYXNzID0+IGNsYXNzIERhdGFQcm92aWRlck1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIE51bWJlciBvZiBpdGVtcyBmZXRjaGVkIGF0IGEgdGltZSBmcm9tIHRoZSBkYXRhcHJvdmlkZXIuCiAgICAgICAgICAgKi8KICAgICAgICAgIHBhZ2VTaXplOiB7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgdmFsdWU6IDUwLAogICAgICAgICAgICBvYnNlcnZlcjogJ19wYWdlU2l6ZUNoYW5nZWQnCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogRnVuY3Rpb24gdGhhdCBwcm92aWRlcyBpdGVtcyBsYXppbHkuIFJlY2VpdmVzIGFyZ3VtZW50cyBgcGFyYW1zYCwgYGNhbGxiYWNrYAogICAgICAgICAgICoKICAgICAgICAgICAqIGBwYXJhbXMucGFnZWAgUmVxdWVzdGVkIHBhZ2UgaW5kZXgKICAgICAgICAgICAqCiAgICAgICAgICAgKiBgcGFyYW1zLnBhZ2VTaXplYCBDdXJyZW50IHBhZ2Ugc2l6ZQogICAgICAgICAgICoKICAgICAgICAgICAqIGBwYXJhbXMuZmlsdGVyc2AgQ3VycmVudGx5IGFwcGxpZWQgZmlsdGVycwogICAgICAgICAgICoKICAgICAgICAgICAqIGBwYXJhbXMuc29ydE9yZGVyc2AgQ3VycmVudGx5IGFwcGxpZWQgc29ydGluZyBvcmRlcnMKICAgICAgICAgICAqCiAgICAgICAgICAgKiBgcGFyYW1zLnBhcmVudEl0ZW1gIFdoZW4gdHJlZSBpcyB1c2VkLCBhbmQgc3VibGV2ZWwgaXRlbXMKICAgICAgICAgICAqIGFyZSByZXF1ZXN0ZWQsIHJlZmVyZW5jZSB0byBwYXJlbnQgaXRlbSBvZiB0aGUgcmVxdWVzdGVkIHN1YmxldmVsLgogICAgICAgICAgICogT3RoZXJ3aXNlIGB1bmRlZmluZWRgLgogICAgICAgICAgICoKICAgICAgICAgICAqIGBjYWxsYmFjayhpdGVtcywgc2l6ZSlgIENhbGxiYWNrIGZ1bmN0aW9uIHdpdGggYXJndW1lbnRzOgogICAgICAgICAgICogICAtIGBpdGVtc2AgQ3VycmVudCBwYWdlIG9mIGl0ZW1zCiAgICAgICAgICAgKiAgIC0gYHNpemVgIFRvdGFsIG51bWJlciBvZiBpdGVtcy4gV2hlbiB0cmVlIHN1YmxldmVsIGl0ZW1zCiAgICAgICAgICAgKiAgICAgYXJlIHJlcXVlc3RlZCwgdG90YWwgbnVtYmVyIG9mIGl0ZW1zIGluIHRoZSByZXF1ZXN0ZWQgc3VibGV2ZWwuCiAgICAgICAgICAgKiAgICAgT3B0aW9uYWwgd2hlbiB0cmVlIGlzIG5vdCB1c2VkLCByZXF1aXJlZCBmb3IgdHJlZS4KICAgICAgICAgICAqLwogICAgICAgICAgZGF0YVByb3ZpZGVyOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ19kYXRhUHJvdmlkZXJDaGFuZ2VkJwogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIGB0cnVlYCB3aGlsZSBkYXRhIGlzIGJlaW5nIHJlcXVlc3RlZCBmcm9tIHRoZSBkYXRhIHByb3ZpZGVyLgogICAgICAgICAgICovCiAgICAgICAgICBsb2FkaW5nOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZQogICAgICAgICAgfSwKCiAgICAgICAgICBfY2FjaGU6IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgY29uc3QgY2FjaGUgPSBuZXcgSXRlbUNhY2hlKHRoaXMpOwogICAgICAgICAgICAgIHJldHVybiBjYWNoZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFBhdGggdG8gYW4gaXRlbSBzdWItcHJvcGVydHkgdGhhdCBpZGVudGlmaWVzIHRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICBpdGVtSWRQYXRoOiB7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICAgICAgdmFsdWU6IG51bGwKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBBbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBleHBhbmRlZCBpdGVtcy4KICAgICAgICAgICAqLwogICAgICAgICAgZXhwYW5kZWRJdGVtczogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6ICgpID0+IFtdCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX3NpemVDaGFuZ2VkKHNpemUpJywKICAgICAgICAgICdfaXRlbUlkUGF0aENoYW5nZWQoaXRlbUlkUGF0aCknLAogICAgICAgICAgJ19leHBhbmRlZEl0ZW1zQ2hhbmdlZChleHBhbmRlZEl0ZW1zLiopJwogICAgICAgIF07CiAgICAgIH0KCiAgICAgIF9zaXplQ2hhbmdlZChzaXplKSB7CiAgICAgICAgY29uc3QgZGVsdGEgPSBzaXplIC0gdGhpcy5fY2FjaGUuc2l6ZTsKICAgICAgICB0aGlzLl9jYWNoZS5zaXplICs9IGRlbHRhOwogICAgICAgIHRoaXMuX2NhY2hlLmVmZmVjdGl2ZVNpemUgKz0gZGVsdGE7CiAgICAgICAgdGhpcy5fZWZmZWN0aXZlU2l6ZSA9IHRoaXMuX2NhY2hlLmVmZmVjdGl2ZVNpemU7CiAgICAgIH0KCiAgICAgIF9nZXRJdGVtKGluZGV4LCBlbCkgewogICAgICAgIGlmIChpbmRleCA+PSB0aGlzLl9lZmZlY3RpdmVTaXplKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBlbC5pbmRleCA9IGluZGV4OwogICAgICAgIGNvbnN0IHtjYWNoZSwgc2NhbGVkSW5kZXh9ID0gdGhpcy5fY2FjaGUuZ2V0Q2FjaGVBbmRJbmRleChpbmRleCk7CiAgICAgICAgY29uc3QgaXRlbSA9IGNhY2hlLml0ZW1zW3NjYWxlZEluZGV4XTsKICAgICAgICBpZiAoaXRlbSkgewogICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdsb2FkaW5nJywgZmFsc2UsIGVsKTsKICAgICAgICAgIHRoaXMuX3VwZGF0ZUl0ZW0oZWwsIGl0ZW0pOwogICAgICAgICAgaWYgKHRoaXMuX2lzRXhwYW5kZWQoaXRlbSkpIHsKICAgICAgICAgICAgY2FjaGUuZW5zdXJlU3ViQ2FjaGVGb3JTY2FsZWRJbmRleChzY2FsZWRJbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbG9hZGluZycsIHRydWUsIGVsKTsKICAgICAgICAgIHRoaXMuX2xvYWRQYWdlKHRoaXMuX2dldFBhZ2VGb3JJbmRleChzY2FsZWRJbmRleCksIGNhY2hlKTsKICAgICAgICB9CgogICAgICB9CgogICAgICBfZXhwYW5kZWRJbnN0YW5jZUNoYW5nZWRDYWxsYmFjayhpbnN0LCB2YWx1ZSkgewogICAgICAgIGlmIChpbnN0Lml0ZW0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgIHRoaXMuZXhwYW5kSXRlbShpbnN0Lml0ZW0pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB0aGlzLmNvbGxhcHNlSXRlbShpbnN0Lml0ZW0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJldHVybnMgYSB2YWx1ZSB0aGF0IGlkZW50aWZpZXMgdGhlIGl0ZW0uIFVzZXMgYGl0ZW1JZFBhdGhgIGlmIGF2YWlsYWJsZS4KICAgICAgICogQ2FuIGJlIGN1c3RvbWl6ZWQgYnkgb3ZlcnJpZGluZy4KICAgICAgICovCiAgICAgIGdldEl0ZW1JZChpdGVtKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuaXRlbUlkUGF0aCA/IHRoaXMuZ2V0KHRoaXMuaXRlbUlkUGF0aCwgaXRlbSkgOiBpdGVtOwogICAgICB9CgogICAgICBfaXNFeHBhbmRlZChpdGVtKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX19leHBhbmRlZEtleXMuaGFzKHRoaXMuZ2V0SXRlbUlkKGl0ZW0pKTsKICAgICAgfQoKICAgICAgX2V4cGFuZGVkSXRlbXNDaGFuZ2VkKGUpIHsKICAgICAgICB0aGlzLl9fY2FjaGVFeHBhbmRlZEtleXMoKTsKICAgICAgICB0aGlzLl9jYWNoZS51cGRhdGVTaXplKCk7CiAgICAgICAgdGhpcy5fZWZmZWN0aXZlU2l6ZSA9IHRoaXMuX2NhY2hlLmVmZmVjdGl2ZVNpemU7CiAgICAgICAgdGhpcy5fYXNzaWduTW9kZWxzKCk7CiAgICAgIH0KCiAgICAgIF9pdGVtSWRQYXRoQ2hhbmdlZChlKSB7CiAgICAgICAgdGhpcy5fX2NhY2hlRXhwYW5kZWRLZXlzKCk7CiAgICAgIH0KCiAgICAgIF9fY2FjaGVFeHBhbmRlZEtleXMoKSB7CiAgICAgICAgaWYgKHRoaXMuZXhwYW5kZWRJdGVtcykgewogICAgICAgICAgdGhpcy5fX2V4cGFuZGVkS2V5cyA9IG5ldyBTZXQoKTsKICAgICAgICAgIHRoaXMuZXhwYW5kZWRJdGVtcy5mb3JFYWNoKGl0ZW0gPT4gewogICAgICAgICAgICB0aGlzLl9fZXhwYW5kZWRLZXlzLmFkZCh0aGlzLmdldEl0ZW1JZChpdGVtKSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBFeHBhbmRzIHRoZSBnaXZlbiBpdGVtIHRyZWUuCiAgICAgICAqLwogICAgICBleHBhbmRJdGVtKGl0ZW0pIHsKICAgICAgICBpZiAoIXRoaXMuX2lzRXhwYW5kZWQoaXRlbSkpIHsKICAgICAgICAgIHRoaXMucHVzaCgnZXhwYW5kZWRJdGVtcycsIGl0ZW0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIENvbGxhcHNlcyB0aGUgZ2l2ZW4gaXRlbSB0cmVlLgogICAgICAgKi8KICAgICAgY29sbGFwc2VJdGVtKGl0ZW0pIHsKICAgICAgICBpZiAodGhpcy5faXNFeHBhbmRlZChpdGVtKSkgewogICAgICAgICAgdGhpcy5zcGxpY2UoJ2V4cGFuZGVkSXRlbXMnLCB0aGlzLl9nZXRJdGVtSW5kZXhJbkFycmF5KGl0ZW0sIHRoaXMuZXhwYW5kZWRJdGVtcyksIDEpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2dldEluZGV4TGV2ZWwoaW5kZXgpIHsKICAgICAgICBsZXQge2NhY2hlfSA9IHRoaXMuX2NhY2hlLmdldENhY2hlQW5kSW5kZXgoaW5kZXgpOwogICAgICAgIGxldCBsZXZlbCA9IDA7CiAgICAgICAgd2hpbGUgKGNhY2hlLnBhcmVudENhY2hlKSB7CiAgICAgICAgICBjYWNoZSA9IGNhY2hlLnBhcmVudENhY2hlOwogICAgICAgICAgbGV2ZWwrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxldmVsOwogICAgICB9CgogICAgICBfY2FuUG9wdWxhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2hhc0RhdGEgJiYgdGhpcy5fY29sdW1uVHJlZTsKICAgICAgfQoKICAgICAgX2xvYWRQYWdlKHBhZ2UsIGNhY2hlKSB7CiAgICAgICAgLy8gbWFrZSBzdXJlIHNhbWUgcGFnZSBpc24ndCByZXF1ZXN0ZWQgbXVsdGlwbGUgdGltZXMuCiAgICAgICAgaWYgKCFjYWNoZS5wZW5kaW5nUmVxdWVzdHNbcGFnZV0gJiYgdGhpcy5kYXRhUHJvdmlkZXIpIHsKICAgICAgICAgIHRoaXMuX3NldExvYWRpbmcodHJ1ZSk7CiAgICAgICAgICBjYWNoZS5wZW5kaW5nUmVxdWVzdHNbcGFnZV0gPSB0cnVlOwogICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICBwYWdlLAogICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5wYWdlU2l6ZSwKICAgICAgICAgICAgc29ydE9yZGVyczogdGhpcy5fbWFwU29ydGVycygpLAogICAgICAgICAgICBmaWx0ZXJzOiB0aGlzLl9tYXBGaWx0ZXJzKCksCiAgICAgICAgICAgIHBhcmVudEl0ZW06IGNhY2hlLnBhcmVudEl0ZW0KICAgICAgICAgIH07CgogICAgICAgICAgdGhpcy5kYXRhUHJvdmlkZXIocGFyYW1zLCAoaXRlbXMsIHNpemUpID0+IHsKICAgICAgICAgICAgaWYgKHNpemUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgIGNhY2hlLnNpemUgPSBzaXplOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGlmIChwYXJhbXMucGFyZW50SXRlbSkgewogICAgICAgICAgICAgICAgY2FjaGUuc2l6ZSA9IGl0ZW1zLmxlbmd0aDsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRJdGVtcyA9IEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5tYXAocm93ID0+IHJvdy5faXRlbSk7CgogICAgICAgICAgICAvLyBQb3B1bGF0ZSB0aGUgY2FjaGUgd2l0aCBuZXcgaXRlbXMKICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoaXRlbSwgaXRlbXNJbmRleCkgPT4gewogICAgICAgICAgICAgIGNvbnN0IGl0ZW1JbmRleCA9IHBhZ2UgKiB0aGlzLnBhZ2VTaXplICsgaXRlbXNJbmRleDsKICAgICAgICAgICAgICBjYWNoZS5pdGVtc1tpdGVtSW5kZXhdID0gaXRlbTsKICAgICAgICAgICAgICBpZiAodGhpcy5faXNFeHBhbmRlZChpdGVtKSAmJiBjdXJyZW50SXRlbXMuaW5kZXhPZihpdGVtKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAvLyBGb3JjZSBzeW5jaHJvbm91cyBkYXRhIHJlcXVlc3QgZm9yIGV4cGFuZGVkIGl0ZW0gc3ViLWNhY2hlCiAgICAgICAgICAgICAgICBjYWNoZS5lbnN1cmVTdWJDYWNoZUZvclNjYWxlZEluZGV4KGl0ZW1JbmRleCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKCiAgICAgICAgICAgIHRoaXMuX2hhc0RhdGEgPSB0cnVlOwoKICAgICAgICAgICAgZGVsZXRlIGNhY2hlLnBlbmRpbmdSZXF1ZXN0c1twYWdlXTsKCiAgICAgICAgICAgIHRoaXMuX3NldExvYWRpbmcoZmFsc2UpOwogICAgICAgICAgICB0aGlzLl9jYWNoZS51cGRhdGVTaXplKCk7CiAgICAgICAgICAgIHRoaXMuX2VmZmVjdGl2ZVNpemUgPSB0aGlzLl9jYWNoZS5lZmZlY3RpdmVTaXplOwoKICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pCiAgICAgICAgICAgICAgLmZpbHRlcihyb3cgPT4gIXJvdy5oaWRkZW4pCiAgICAgICAgICAgICAgLmZvckVhY2gocm93ID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlZEl0ZW0gPSB0aGlzLl9jYWNoZS5nZXRJdGVtRm9ySW5kZXgocm93LmluZGV4KTsKICAgICAgICAgICAgICAgIGlmIChjYWNoZWRJdGVtKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbG9hZGluZycsIGZhbHNlLCByb3cpOwogICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVJdGVtKHJvdywgY2FjaGVkSXRlbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfSk7CgogICAgICAgICAgICB0aGlzLl9pbmNyZWFzZVBvb2xJZk5lZWRlZCgwKTsKCiAgICAgICAgICAgIHRoaXMuX19pdGVtc1JlY2VpdmVkKCk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9nZXRQYWdlRm9ySW5kZXgoaW5kZXgpIHsKICAgICAgICByZXR1cm4gTWF0aC5mbG9vcihpbmRleCAvIHRoaXMucGFnZVNpemUpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQ2xlYXJzIHRoZSBjYWNoZWQgcGFnZXMgYW5kIHJlbG9hZHMgZGF0YSBmcm9tIGRhdGFwcm92aWRlciB3aGVuIG5lZWRlZC4KICAgICAgICovCiAgICAgIGNsZWFyQ2FjaGUoKSB7CiAgICAgICAgdGhpcy5fY2FjaGUgPSBuZXcgSXRlbUNhY2hlKHRoaXMpOwogICAgICAgIEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKHJvdyA9PiB7CiAgICAgICAgICBBcnJheS5mcm9tKHJvdy5jaGlsZHJlbikuZm9yRWFjaChjZWxsID0+IHsKICAgICAgICAgICAgLy8gRm9yY2UgZGF0YSBzeXN0ZW0gdG8gcGljayB1cCBzdWJwcm9wZXJ0eSBjaGFuZ2VzCiAgICAgICAgICAgIGNlbGwuX2luc3RhbmNlICYmIGNlbGwuX2luc3RhbmNlLl9zZXRQZW5kaW5nUHJvcGVydHkoJ2l0ZW0nLCB7fSwgZmFsc2UpOwogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy5fY2FjaGUuc2l6ZSA9IHRoaXMuc2l6ZSB8fCAwOwogICAgICAgIHRoaXMuX2NhY2hlLnVwZGF0ZVNpemUoKTsKICAgICAgICB0aGlzLl9oYXNEYXRhID0gZmFsc2U7CiAgICAgICAgdGhpcy5fYXNzaWduTW9kZWxzKCk7CgogICAgICAgIGlmICghdGhpcy5fZWZmZWN0aXZlU2l6ZSkgewogICAgICAgICAgdGhpcy5fbG9hZFBhZ2UoMCwgdGhpcy5fY2FjaGUpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3BhZ2VTaXplQ2hhbmdlZChwYWdlU2l6ZSwgb2xkUGFnZVNpemUpIHsKICAgICAgICBpZiAob2xkUGFnZVNpemUgIT09IHVuZGVmaW5lZCAmJiBwYWdlU2l6ZSAhPT0gb2xkUGFnZVNpemUpIHsKICAgICAgICAgIHRoaXMuY2xlYXJDYWNoZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2NoZWNrU2l6ZSgpIHsKICAgICAgICBpZiAodGhpcy5zaXplID09PSB1bmRlZmluZWQgJiYgdGhpcy5fZWZmZWN0aXZlU2l6ZSA9PT0gMCkgewogICAgICAgICAgY29uc29sZS53YXJuKAogICAgICAgICAgICAnVGhlIDx2YWFkaW4tZ3JpZD4gbmVlZHMgdGhlIHRvdGFsIG51bWJlciBvZiBpdGVtcycgKwogICAgICAgICAgICAnIGluIG9yZGVyIHRvIGRpc3BsYXkgcm93cy4gU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMnICsKICAgICAgICAgICAgJyB0byB0aGUgYHNpemVgIHByb3BlcnR5LCBvciBwcm92aWRlIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMnICsKICAgICAgICAgICAgJyBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBgZGF0YVByb3ZpZGVyYOKAmXMgYGNhbGxiYWNrYCBjYWxsLicKICAgICAgICAgICk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfZGF0YVByb3ZpZGVyQ2hhbmdlZChkYXRhUHJvdmlkZXIsIG9sZERhdGFQcm92aWRlcikgewogICAgICAgIGlmIChvbGREYXRhUHJvdmlkZXIgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgdGhpcy5jbGVhckNhY2hlKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAoZGF0YVByb3ZpZGVyICYmIHRoaXMuaXRlbXMgJiYgdGhpcy5pdGVtcy5sZW5ndGgpIHsKICAgICAgICAgIC8vIEZpeGVzIHBvc3NpYmx5IGludmFsaWQgY2FjaGVkIGxhc3RWaXNpYmxlSW5kZXggdmFsdWUgaW4gPGlyb24tbGlzdD4KICAgICAgICAgIHRoaXMuX3Njcm9sbFRvSW5kZXgodGhpcy5fZmlyc3RWaXNpYmxlSW5kZXgpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fZW5zdXJlRmlyc3RQYWdlTG9hZGVkKCk7CgogICAgICAgIHRoaXMuX2RlYm91bmNlckNoZWNrU2l6ZSA9IERlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgIHRoaXMuX2RlYm91bmNlckNoZWNrU2l6ZSwKICAgICAgICAgIHRpbWVPdXQuYWZ0ZXIoMjAwMCksCiAgICAgICAgICB0aGlzLl9jaGVja1NpemUuYmluZCh0aGlzKSk7CgogICAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIoKTsKICAgICAgfQoKICAgICAgX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2hhc0RhdGEpIHsKICAgICAgICAgIC8vIGxvYWQgZGF0YSBiZWZvcmUgYWRkaW5nIHJvd3MgdG8gbWFrZSBzdXJlIHRoZXkgaGF2ZSBjb250ZW50IHdoZW4KICAgICAgICAgIC8vIHJlbmRlcmVkIGZvciB0aGUgZmlyc3QgdGltZS4KICAgICAgICAgIHRoaXMuX2xvYWRQYWdlKDAsIHRoaXMuX2NhY2hlLCAoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGhhZERhdGEgPSB0aGlzLl9oYXNEYXRhOwogICAgICAgICAgICB0aGlzLl9oYXNEYXRhID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCFoYWREYXRhKSB7CiAgICAgICAgICAgICAgdGhpcy5ub3RpZnlSZXNpemUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfaXRlbXNFcXVhbChpdGVtMSwgaXRlbTIpIHsKICAgICAgICByZXR1cm4gdGhpcy5nZXRJdGVtSWQoaXRlbTEpID09PSB0aGlzLmdldEl0ZW1JZChpdGVtMik7CiAgICAgIH0KCiAgICAgIF9nZXRJdGVtSW5kZXhJbkFycmF5KGl0ZW0sIGFycmF5KSB7CiAgICAgICAgbGV0IHJlc3VsdCA9IC0xOwogICAgICAgIGFycmF5LmZvckVhY2goKGksIGlkeCkgPT4gewogICAgICAgICAgaWYgKHRoaXMuX2l0ZW1zRXF1YWwoaSwgaXRlbSkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gaWR4OwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgIH0KCiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBWYWFkaW4gTHRkLgogICAgVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgKi8KCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgRHluYW1pY0NvbHVtbnNNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgRHluYW1pY0NvbHVtbnNNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgcmVhZHkoKSB7CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICB0aGlzLl9hZGROb2RlT2JzZXJ2ZXIoKTsKICAgICAgfQoKICAgICAgX2hhc0NvbHVtbkdyb3Vwcyhjb2x1bW5zKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb2x1bW5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICBpZiAoY29sdW1uc1tpXS5sb2NhbE5hbWUgPT09ICd2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAnKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICB9CgogICAgICBfZ2V0Q2hpbGRDb2x1bW5zKGVsKSB7CiAgICAgICAgcmV0dXJuIEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIuZ2V0RmxhdHRlbmVkTm9kZXMoZWwpLmZpbHRlcih0aGlzLl9pc0NvbHVtbkVsZW1lbnQpOwogICAgICB9CgogICAgICBfZmxhdHRlbkNvbHVtbkdyb3Vwcyhjb2x1bW5zKSB7CiAgICAgICAgcmV0dXJuIGNvbHVtbnMubWFwKGNvbCA9PiB7CiAgICAgICAgICBpZiAoY29sLmxvY2FsTmFtZSA9PT0gJ3ZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCcpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldENoaWxkQ29sdW1ucyhjb2wpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIFtjb2xdOwogICAgICAgICAgfQogICAgICAgIH0pLnJlZHVjZSgocHJldiwgY3VycikgPT4gewogICAgICAgICAgcmV0dXJuIHByZXYuY29uY2F0KGN1cnIpOwogICAgICAgIH0sIFtdKTsKICAgICAgfQoKICAgICAgX2dldENvbHVtblRyZWUoKSB7CiAgICAgICAgdmFyIHJvb3RDb2x1bW5zID0gRmxhdHRlbmVkTm9kZXNPYnNlcnZlci5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKS5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KTsKICAgICAgICB2YXIgX2NvbHVtblRyZWUgPSBbXTsKCiAgICAgICAgZm9yICh2YXIgYyA9IHJvb3RDb2x1bW5zOyA7KSB7CiAgICAgICAgICBfY29sdW1uVHJlZS5wdXNoKGMpOwogICAgICAgICAgaWYgKCF0aGlzLl9oYXNDb2x1bW5Hcm91cHMoYykpIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICB9CiAgICAgICAgICBjID0gdGhpcy5fZmxhdHRlbkNvbHVtbkdyb3VwcyhjKTsKICAgICAgICB9CgogICAgICAgIHJldHVybiBfY29sdW1uVHJlZTsKICAgICAgfQoKICAgICAgX3VwZGF0ZUNvbHVtblRyZWUoKSB7CiAgICAgICAgdmFyIGNvbHVtblRyZWUgPSB0aGlzLl9nZXRDb2x1bW5UcmVlKCk7CiAgICAgICAgaWYgKCF0aGlzLl9hcnJheUVxdWFscyhjb2x1bW5UcmVlLCB0aGlzLl9jb2x1bW5UcmVlKSkgewogICAgICAgICAgdGhpcy5fY29sdW1uVHJlZSA9IGNvbHVtblRyZWU7CiAgICAgICAgfQogICAgICB9CgogICAgICBfYWRkTm9kZU9ic2VydmVyKCkgewogICAgICAgIHRoaXMuX29ic2VydmVyID0gbmV3IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgaW5mbyA9PiB7CgogICAgICAgICAgY29uc3Qgcm93RGV0YWlsc1RlbXBsYXRlID0gaW5mby5hZGRlZE5vZGVzLmZpbHRlcihuID0+IG4ubG9jYWxOYW1lID09PSAndGVtcGxhdGUnICYmIG4uY2xhc3NMaXN0LmNvbnRhaW5zKCdyb3ctZGV0YWlscycpKVswXTsKICAgICAgICAgIGlmIChyb3dEZXRhaWxzVGVtcGxhdGUgJiYgdGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlICE9PSByb3dEZXRhaWxzVGVtcGxhdGUpIHsKICAgICAgICAgICAgdGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlID0gcm93RGV0YWlsc1RlbXBsYXRlOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChpbmZvLmFkZGVkTm9kZXMuZmlsdGVyKHRoaXMuX2lzQ29sdW1uRWxlbWVudCkubGVuZ3RoID4gMCB8fAogICAgICAgICAgICBpbmZvLnJlbW92ZWROb2Rlcy5maWx0ZXIodGhpcy5faXNDb2x1bW5FbGVtZW50KS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbHVtblRyZWUoKTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLl9kZWJvdW5jZXJDaGVja0ltcG9ydHMgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlckNoZWNrSW1wb3J0cywKICAgICAgICAgICAgdGltZU91dC5hZnRlcigyMDAwKSwKICAgICAgICAgICAgdGhpcy5fY2hlY2tJbXBvcnRzLmJpbmQodGhpcykpOwoKICAgICAgICAgIHRoaXMuX2Vuc3VyZUZpcnN0UGFnZUxvYWRlZCgpOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBfYXJyYXlFcXVhbHMoYXJyMSwgYXJyMikgewogICAgICAgIGlmICghYXJyMSB8fCAhYXJyMiB8fCBhcnIxLmxlbmd0aCAhPSBhcnIyLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KCiAgICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBhcnIxLmxlbmd0aDsgaSA8IGw7IGkrKykgewogICAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSBuZXN0ZWQgYXJyYXlzCiAgICAgICAgICBpZiAoYXJyMVtpXSBpbnN0YW5jZW9mIEFycmF5ICYmIGFycjJbaV0gaW5zdGFuY2VvZiBBcnJheSkgewogICAgICAgICAgICAvLyByZWN1cnNlIGludG8gdGhlIG5lc3RlZCBhcnJheXMKICAgICAgICAgICAgaWYgKCF0aGlzLl9hcnJheUVxdWFscyhhcnIxW2ldLCBhcnIyW2ldKSkgewogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChhcnIxW2ldICE9IGFycjJbaV0pIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgfQoKICAgICAgX2NoZWNrSW1wb3J0cygpIHsKICAgICAgICBbCiAgICAgICAgICAndmFhZGluLWdyaWQtY29sdW1uLWdyb3VwJywKICAgICAgICAgICd2YWFkaW4tZ3JpZC1maWx0ZXInLAogICAgICAgICAgJ3ZhYWRpbi1ncmlkLWZpbHRlci1jb2x1bW4nLAogICAgICAgICAgJ3ZhYWRpbi1ncmlkLXRyZWUtdG9nZ2xlJywKICAgICAgICAgICd2YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uJywKICAgICAgICAgICd2YWFkaW4tZ3JpZC1zb3J0LWNvbHVtbicsCiAgICAgICAgICAndmFhZGluLWdyaWQtc29ydGVyJwogICAgICAgIF0uZm9yRWFjaChlbGVtZW50TmFtZSA9PiB7CiAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXMucXVlcnlTZWxlY3RvcihlbGVtZW50TmFtZSk7CiAgICAgICAgICBpZiAoZWxlbWVudCAmJiAhKGVsZW1lbnQgaW5zdGFuY2VvZiBQb2x5bWVyRWxlbWVudCkpIHsKICAgICAgICAgICAgY29uc29sZS53YXJuKGBNYWtlIHN1cmUgeW91IGhhdmUgaW1wb3J0ZWQgdGhlIHJlcXVpcmVkIG1vZHVsZSBmb3IgPCR7ZWxlbWVudE5hbWV9PiBlbGVtZW50LmApOwogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfdXBkYXRlRmlyc3RBbmRMYXN0Q29sdW1uKCkgewogICAgICAgIEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RyJykpLmZvckVhY2gocm93ID0+IHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyhyb3cpKTsKICAgICAgfQoKICAgICAgX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyhyb3cpIHsKICAgICAgICBBcnJheS5mcm9tKHJvdy5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49ImNlbGwiXTpub3QoW3BhcnR+PSJkZXRhaWxzLWNlbGwiXSknKSkKICAgICAgICAgIC5zb3J0KChhLCBiKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBhLl9jb2x1bW4uX29yZGVyIC0gYi5fY29sdW1uLl9vcmRlcjsKICAgICAgICAgIH0pLmZvckVhY2goKGNlbGwsIGNlbGxJbmRleCwgY2hpbGRyZW4pID0+IHsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdmaXJzdC1jb2x1bW4nLCBjZWxsSW5kZXggPT09IDAsIGNlbGwpOwogICAgICAgICAgICB0aGlzLl90b2dnbGVBdHRyaWJ1dGUoJ2xhc3QtY29sdW1uJywgY2VsbEluZGV4ID09PSBjaGlsZHJlbi5sZW5ndGggLSAxLCBjZWxsKTsKICAgICAgICAgIH0pOwogICAgICB9CgogICAgICBfaXNDb2x1bW5FbGVtZW50KG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgL1xiY29sdW1uXGIvLnRlc3Qobm9kZS5sb2NhbE5hbWUpOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxOCBWYWFkaW4gTHRkLgogICAgVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgKi8KICAgIC8qKgogICAgICogQHBvbHltZXJNaXhpbgogICAgICovCiAgICBjb25zdCBFdmVudENvbnRleHRNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgRXZlbnRDb250ZXh0TWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHsKCiAgICAgIC8qKgogICAgICAgKiBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIGNvbnRleHQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGV2ZW50IHRhcmdldDoKICAgICAgICogLSBgaXRlbWA6IHRoZSBkYXRhIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0YXJnZXRlZCByb3cgKG5vdCBzcGVjaWZpZWQgd2hlbiB0YXJnZXRpbmcgaGVhZGVyIG9yIGZvb3RlcikKICAgICAgICogLSBgY29sdW1uYDogdGhlIGNvbHVtbiBlbGVtZW50IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRhcmdldGVkIGNlbGwgKG5vdCBzcGVjaWZpZWQgd2hlbiB0YXJnZXRpbmcgcm93IGRldGFpbHMpCiAgICAgICAqIC0gYHNlY3Rpb25gOiB3aGV0aGVyIHRoZSBldmVudCB0YXJnZXRlZCB0aGUgYm9keSwgaGVhZGVyLCBmb290ZXIgb3IgZGV0YWlscyBvZiB0aGUgZ3JpZAogICAgICAgKgogICAgICAgKiBUaGVzZSBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIGluY2x1ZGVkIHdoZW4gYGl0ZW1gIGlzIHNwZWNpZmllZDoKICAgICAgICogLSBgaW5kZXhgOiB0aGUgaW5kZXggb2YgdGhlIGl0ZW0KICAgICAgICogLSBgc2VsZWN0ZWRgOiB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIGl0ZW0KICAgICAgICogLSBgZGV0YWlsc09wZW5lZGA6IHdoZXRoZXIgdGhlIHJvdyBkZXRhaWxzIGFyZSBvcGVuIGZvciB0aGUgaXRlbQogICAgICAgKiAtIGBleHBhbmRlZGA6IHRoZSBleHBhbmRlZCBzdGF0ZSBvZiB0aGUgdHJlZSB0b2dnbGUKICAgICAgICogLSBgbGV2ZWxgOiB0aGUgdHJlZSBoaWVyYXJjaHkgbGV2ZWwKICAgICAgICoKICAgICAgICogVGhlIHJldHVybmVkIG9iamVjdCBpcyBwb3B1bGF0ZWQgb25seSB3aGVuIGEgZ3JpZCBjZWxsLCBoZWFkZXIsIGZvb3RlciBvciByb3cgZGV0YWlscyBpcyBmb3VuZCBpbiBgZXZlbnQuY29tcG9zZWRQYXRoKClgLgogICAgICAgKiBUaGlzIG1lYW5zIG1vc3RseSBtb3VzZSBhbmQga2V5Ym9hcmQgZXZlbnRzLiBJZiBzdWNoIGEgZ3JpZCBwYXJ0IGlzIG5vdCBmb3VuZCBpbiB0aGUgcGF0aCwgYW4gZW1wdHkgb2JqZWN0IGlzIHJldHVybmVkLgogICAgICAgKiBUaGlzIG1heSBiZSB0aGUgY2FzZSBlZy4gaWYgdGhlIGV2ZW50IGlzIGZpcmVkIG9uIHRoZSBgPHZhYWRpbi1ncmlkPmAgZWxlbWVudCBhbmQgbm90IGFueSBkZWVwZXIgaW4gdGhlIERPTSwgb3IgaWYKICAgICAgICogdGhlIGV2ZW50IHRhcmdldHMgdGhlIGVtcHR5IHBhcnQgb2YgdGhlIGdyaWQgYm9keS4KICAgICAgICovCiAgICAgIGdldEV2ZW50Q29udGV4dChldmVudCkgewoKICAgICAgICBjb25zdCBjb250ZXh0ID0ge307CgogICAgICAgIGNvbnN0IHBhdGggPSBldmVudC5jb21wb3NlZFBhdGgoKTsKICAgICAgICBjb25zdCBjZWxsID0gcGF0aFtwYXRoLmluZGV4T2YodGhpcy4kLnRhYmxlKSAtIDNdOwoKICAgICAgICBpZiAoIWNlbGwpIHsKICAgICAgICAgIHJldHVybiBjb250ZXh0OwogICAgICAgIH0KCiAgICAgICAgY29udGV4dC5zZWN0aW9uID0gWydib2R5JywgJ2hlYWRlcicsICdmb290ZXInLCAnZGV0YWlscyddCiAgICAgICAgICAuZmlsdGVyKHNlY3Rpb24gPT4gY2VsbC5nZXRBdHRyaWJ1dGUoJ3BhcnQnKS5pbmRleE9mKHNlY3Rpb24pID4gLTEpWzBdOwoKICAgICAgICBpZiAoY2VsbC5fY29sdW1uKSB7CiAgICAgICAgICBjb250ZXh0LmNvbHVtbiA9IGNlbGwuX2NvbHVtbjsKICAgICAgICB9CgogICAgICAgIGlmIChjb250ZXh0LnNlY3Rpb24gPT09ICdib2R5JyB8fCBjb250ZXh0LnNlY3Rpb24gPT09ICdkZXRhaWxzJykgewogICAgICAgICAgT2JqZWN0LmFzc2lnbihjb250ZXh0LCB0aGlzLl9fZ2V0Um93TW9kZWwoY2VsbC5wYXJlbnRFbGVtZW50KSk7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gY29udGV4dDsKICAgICAgfQoKICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFZhYWRpbiBMdGQuCiAgICBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAqLwogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IEZpbHRlck1peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBGaWx0ZXJNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBfZmlsdGVyczogewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJlYWR5KCkgewogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdmaWx0ZXItY2hhbmdlZCcsIHRoaXMuX2ZpbHRlckNoYW5nZWQuYmluZCh0aGlzKSk7CiAgICAgIH0KCiAgICAgIF9maWx0ZXJDaGFuZ2VkKGUpIHsKICAgICAgICBpZiAodGhpcy5fZmlsdGVycy5pbmRleE9mKGUudGFyZ2V0KSA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuX2ZpbHRlcnMucHVzaChlLnRhcmdldCk7CiAgICAgICAgfQoKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwoKICAgICAgICBpZiAodGhpcy5kYXRhUHJvdmlkZXIpIHsKICAgICAgICAgIHRoaXMuY2xlYXJDYWNoZSgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX21hcEZpbHRlcnMoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2ZpbHRlcnMubWFwKGZpbHRlciA9PiB7CiAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICBwYXRoOiBmaWx0ZXIucGF0aCwKICAgICAgICAgICAgdmFsdWU6IGZpbHRlci52YWx1ZQogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIGB2YWFkaW4tZ3JpZC10ZW1wbGF0aXplcmAgaXMgYSBoZWxwZXIgZWxlbWVudCBmb3IgdGhlIGB2YWFkaW4tZ3JpZGAgdGhhdCBpcyBwcmVwYXJpbmcgYW5kCiAgICAgKiBzdGFtcGluZyBpbnN0YW5jZXMgb2YgY2VsbHMgYW5kIGNvbHVtbnMgdGVtcGxhdGVzCiAgICAgKgogICAgICogQGV4dGVuZHMgUG9seW1lckVsZW1lbnQKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIEdyaWRUZW1wbGF0aXplciBleHRlbmRzIChjbGFzcyBleHRlbmRzIFBvbHltZXJFbGVtZW50IHt9KSB7CiAgICAgIHN0YXRpYyBnZXQgaXMoKSB7CiAgICAgICAgcmV0dXJuICd2YWFkaW4tZ3JpZC10ZW1wbGF0aXplcic7CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgZGF0YUhvc3Q6IE9iamVjdCwKCiAgICAgICAgICB0ZW1wbGF0ZTogT2JqZWN0LAoKICAgICAgICAgIF90ZW1wbGF0ZUluc3RhbmNlczogewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKCiAgICAgICAgICBfcGFyZW50UGF0aFZhbHVlczogewogICAgICAgICAgICB2YWx1ZTogZnVuY3Rpb24oKSB7CiAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICB9LAoKICAgICAgICAgIF9ncmlkOiBPYmplY3QKICAgICAgICB9OwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgJ190ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQoX3RlbXBsYXRlSW5zdGFuY2VzLiosIF9wYXJlbnRQYXRoVmFsdWVzLiopJwogICAgICAgIF07CiAgICAgIH0KCiAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgIHN1cGVyKCk7CgogICAgICAgIHRoaXMuX2luc3RhbmNlUHJvcHMgPSB7CiAgICAgICAgICBkZXRhaWxzT3BlbmVkOiB0cnVlLAogICAgICAgICAgaW5kZXg6IHRydWUsCiAgICAgICAgICBpdGVtOiB0cnVlLAogICAgICAgICAgc2VsZWN0ZWQ6IHRydWUsCiAgICAgICAgICBleHBhbmRlZDogdHJ1ZSwKICAgICAgICAgIGxldmVsOiB0cnVlCiAgICAgICAgfTsKICAgICAgfQoKICAgICAgY3JlYXRlSW5zdGFuY2UoKSB7CiAgICAgICAgdGhpcy5fZW5zdXJlVGVtcGxhdGl6ZWQoKTsKICAgICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyB0aGlzLl9UZW1wbGF0ZUNsYXNzKHt9KTsKICAgICAgICB0aGlzLmFkZEluc3RhbmNlKGluc3RhbmNlKTsKCiAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgICB9CgogICAgICBhZGRJbnN0YW5jZShpbnN0YW5jZSkgewogICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5pbmRleE9mKGluc3RhbmNlKSA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLnB1c2goaW5zdGFuY2UpOwogICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMubm90aWZ5UGF0aCgnX3RlbXBsYXRlSW5zdGFuY2VzLionLCB0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcykpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmVtb3ZlSW5zdGFuY2UoaW5zdGFuY2UpIHsKICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmluZGV4T2YoaW5zdGFuY2UpOwogICAgICAgIHRoaXMuc3BsaWNlKCdfdGVtcGxhdGVJbnN0YW5jZXMnLCBpbmRleCwgMSk7CiAgICAgIH0KCiAgICAgIF9lbnN1cmVUZW1wbGF0aXplZCgpIHsKICAgICAgICBpZiAoIXRoaXMuX1RlbXBsYXRlQ2xhc3MpIHsKICAgICAgICAgIHRoaXMuX1RlbXBsYXRlQ2xhc3MgPSB0ZW1wbGF0aXplKHRoaXMudGVtcGxhdGUsIHRoaXMsIHsKICAgICAgICAgICAgaW5zdGFuY2VQcm9wczogdGhpcy5faW5zdGFuY2VQcm9wcywKICAgICAgICAgICAgcGFyZW50TW9kZWw6IHRydWUsCgogICAgICAgICAgICBmb3J3YXJkSG9zdFByb3A6IGZ1bmN0aW9uKHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgICAgdGhpcy5fZm9yd2FyZFBhcmVudFByb3AocHJvcCwgdmFsdWUpOwoKICAgICAgICAgICAgICBpZiAodGhpcy5fdGVtcGxhdGVJbnN0YW5jZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzLmZvckVhY2goaW5zdCA9PiBpbnN0Lm5vdGlmeVBhdGgocHJvcCwgdmFsdWUpKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0sCgogICAgICAgICAgICBub3RpZnlJbnN0YW5jZVByb3A6IGZ1bmN0aW9uKGluc3QsIHByb3AsIHZhbHVlKSB7CiAgICAgICAgICAgICAgaWYgKHByb3AgPT09ICdpbmRleCcgfHwgcHJvcCA9PT0gJ2l0ZW0nKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBkb27igJl0IG5lZWQgYSBjaGFuZ2Ugbm90aWZpY2F0aW9uIGZvciB0aGVzZS4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsUHJvcCA9IGBfXyR7cHJvcH1fX2A7CgogICAgICAgICAgICAgIC8vIE5vdGlmeSBmb3Igb25seSB1c2VyLWFjdGlvbiBjaGFuZ2VzLCBub3QgZm9yIHNjcm9sbGluZyB1cGRhdGVzLiBFLiBnLiwKICAgICAgICAgICAgICAvLyBpZiBgZGV0YWlsc09wZW5lZGAgaXMgZGlmZmVyZW50IGZyb20gYF9fZGV0YWlsc09wZW5lZF9fYCwgd2hpY2ggd2FzIHNldCBkdXJpbmcgcmVuZGVyLgogICAgICAgICAgICAgIGlmIChpbnN0W29yaWdpbmFsUHJvcF0gPT09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGluc3Rbb3JpZ2luYWxQcm9wXSA9IHZhbHVlOwoKICAgICAgICAgICAgICBjb25zdCByb3cgPSBBcnJheS5mcm9tKHRoaXMuX2dyaWQuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKHJvdyA9PiB0aGlzLl9ncmlkLl9pdGVtc0VxdWFsKHJvdy5faXRlbSwgaW5zdC5pdGVtKSlbMF07CiAgICAgICAgICAgICAgaWYgKHJvdykgewogICAgICAgICAgICAgICAgQXJyYXkuZnJvbShyb3cuY2hpbGRyZW4pLmZvckVhY2goY2VsbCA9PiB7CiAgICAgICAgICAgICAgICAgIGlmIChjZWxsLl9pbnN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIGNlbGwuX2luc3RhbmNlW29yaWdpbmFsUHJvcF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICBjZWxsLl9pbnN0YW5jZS5ub3RpZnlQYXRoKHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBjb25zdCBpdGVtUHJlZml4ID0gJ2l0ZW0uJzsKICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLl9ncmlkLml0ZW1zKSAmJiBwcm9wLmluZGV4T2YoaXRlbVByZWZpeCkgPT09IDApIHsKICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1zSW5kZXggPSB0aGlzLl9ncmlkLml0ZW1zLmluZGV4T2YoaW5zdC5pdGVtKTsKICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBwcm9wLnNsaWNlKGl0ZW1QcmVmaXgubGVuZ3RoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2dyaWQubm90aWZ5UGF0aChgaXRlbXMuJHtpdGVtc0luZGV4fS4ke3BhdGh9YCwgdmFsdWUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgY29uc3QgZ3JpZENhbGxiYWNrID0gYF8ke3Byb3B9SW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2tgOwogICAgICAgICAgICAgIGlmICh0aGlzLl9ncmlkICYmIHRoaXMuX2dyaWRbZ3JpZENhbGxiYWNrXSkgewogICAgICAgICAgICAgICAgdGhpcy5fZ3JpZFtncmlkQ2FsbGJhY2tdKGluc3QsIHZhbHVlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9mb3J3YXJkUGFyZW50UHJvcChwcm9wLCB2YWx1ZSkgewogICAgICAgIHRoaXMuX3BhcmVudFBhdGhWYWx1ZXNbcHJvcF0gPSB2YWx1ZTsKICAgICAgICB0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5mb3JFYWNoKGluc3QgPT4gaW5zdC5ub3RpZnlQYXRoKHByb3AsIHZhbHVlKSk7CiAgICAgIH0KCiAgICAgIF90ZW1wbGF0ZUluc3RhbmNlc0NoYW5nZWQodCwgcCkgewogICAgICAgIGxldCBpbmRleCwgY291bnQ7CiAgICAgICAgaWYgKHQucGF0aCA9PT0gJ190ZW1wbGF0ZUluc3RhbmNlcycpIHsKICAgICAgICAgIC8vIEl0ZXJhdGUgYWxsIGluc3RhbmNlcwogICAgICAgICAgaW5kZXggPSAwOwogICAgICAgICAgY291bnQgPSB0aGlzLl90ZW1wbGF0ZUluc3RhbmNlcy5sZW5ndGg7CiAgICAgICAgfSBlbHNlIGlmICh0LnBhdGggPT09ICdfdGVtcGxhdGVJbnN0YW5jZXMuc3BsaWNlcycpIHsKICAgICAgICAgIC8vIEl0ZXJhdGUgb25seSBuZXcgaW5zdGFuY2VzCiAgICAgICAgICBpbmRleCA9IHQudmFsdWUuaW5kZXg7CiAgICAgICAgICBjb3VudCA9IHQudmFsdWUuYWRkZWRDb3VudDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9wYXJlbnRQYXRoVmFsdWVzIHx8IHt9KS5mb3JFYWNoKGtleU5hbWUgPT4gewogICAgICAgICAgZm9yICh2YXIgaSA9IGluZGV4OyBpIDwgaW5kZXggKyBjb3VudDsgaSsrKSB7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlSW5zdGFuY2VzW2ldLnNldChrZXlOYW1lLCB0aGlzLl9wYXJlbnRQYXRoVmFsdWVzW2tleU5hbWVdKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgIH0KCiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoR3JpZFRlbXBsYXRpemVyLmlzLCBHcmlkVGVtcGxhdGl6ZXIpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBWYWFkaW4gTHRkLgogICAgVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgKi8KCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgUm93RGV0YWlsc01peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBSb3dEZXRhaWxzTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIEFuIGFycmF5IGNvbnRhaW5pbmcgcmVmZXJlbmNlcyB0byBpdGVtcyB3aXRoIG9wZW4gcm93IGRldGFpbHMuCiAgICAgICAgICAgKi8KICAgICAgICAgIGRldGFpbHNPcGVuZWRJdGVtczogewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgfSwKCiAgICAgICAgICBfcm93RGV0YWlsc1RlbXBsYXRlOiBPYmplY3QsCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBDdXN0b20gZnVuY3Rpb24gZm9yIHJlbmRlcmluZyB0aGUgY29udGVudCBvZiB0aGUgcm93IGRldGFpbHMuCiAgICAgICAgICAgKiBSZWNlaXZlcyB0aHJlZSBhcmd1bWVudHM6CiAgICAgICAgICAgKgogICAgICAgICAgICogLSBgcm9vdGAgVGhlIHJvdyBkZXRhaWxzIGNvbnRlbnQgRE9NIGVsZW1lbnQuIEFwcGVuZCB5b3VyIGNvbnRlbnQgdG8gaXQuCiAgICAgICAgICAgKiAtIGBncmlkYCBUaGUgYDx2YWFkaW4tZ3JpZD5gIGVsZW1lbnQuCiAgICAgICAgICAgKiAtIGByb3dEYXRhYCBUaGUgb2JqZWN0IHdpdGggdGhlIHByb3BlcnRpZXMgcmVsYXRlZCB3aXRoCiAgICAgICAgICAgKiAgIHRoZSByZW5kZXJlZCBpdGVtLCBjb250YWluczoKICAgICAgICAgICAqICAgLSBgcm93RGF0YS5pbmRleGAgVGhlIGluZGV4IG9mIHRoZSBpdGVtLgogICAgICAgICAgICogICAtIGByb3dEYXRhLml0ZW1gIFRoZSBpdGVtLgogICAgICAgICAgICovCiAgICAgICAgICByb3dEZXRhaWxzUmVuZGVyZXI6IEZ1bmN0aW9uLAoKICAgICAgICAgIF9kZXRhaWxzQ2VsbHM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICB9CiAgICAgICAgfTsKICAgICAgfQoKICAgICAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICdfZGV0YWlsc09wZW5lZEl0ZW1zQ2hhbmdlZChkZXRhaWxzT3BlbmVkSXRlbXMuKiwgX3Jvd0RldGFpbHNUZW1wbGF0ZSwgcm93RGV0YWlsc1JlbmRlcmVyKScsCiAgICAgICAgICAnX3Jvd0RldGFpbHNUZW1wbGF0ZU9yUmVuZGVyZXJDaGFuZ2VkKF9yb3dEZXRhaWxzVGVtcGxhdGUsIHJvd0RldGFpbHNSZW5kZXJlciknCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgX3Jvd0RldGFpbHNUZW1wbGF0ZU9yUmVuZGVyZXJDaGFuZ2VkKHJvd0RldGFpbHNUZW1wbGF0ZSwgcm93RGV0YWlsc1JlbmRlcmVyKSB7CiAgICAgICAgaWYgKHJvd0RldGFpbHNUZW1wbGF0ZSAmJiByb3dEZXRhaWxzUmVuZGVyZXIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBvbmx5IHVzZSBlaXRoZXIgYSByZW5kZXJlciBvciBhIHRlbXBsYXRlIGZvciByb3cgZGV0YWlscycpOwogICAgICAgIH0KICAgICAgICBpZiAocm93RGV0YWlsc1RlbXBsYXRlIHx8IHJvd0RldGFpbHNSZW5kZXJlcikgewogICAgICAgICAgaWYgKHJvd0RldGFpbHNUZW1wbGF0ZSAmJiAhcm93RGV0YWlsc1RlbXBsYXRlLnRlbXBsYXRpemVyKSB7CiAgICAgICAgICAgIHZhciB0ZW1wbGF0aXplciA9IG5ldyBHcmlkVGVtcGxhdGl6ZXIoKTsKICAgICAgICAgICAgdGVtcGxhdGl6ZXIuX2dyaWQgPSB0aGlzOwogICAgICAgICAgICB0ZW1wbGF0aXplci5kYXRhSG9zdCA9IHRoaXMuZGF0YUhvc3Q7CiAgICAgICAgICAgIHRlbXBsYXRpemVyLnRlbXBsYXRlID0gcm93RGV0YWlsc1RlbXBsYXRlOwogICAgICAgICAgICByb3dEZXRhaWxzVGVtcGxhdGUudGVtcGxhdGl6ZXIgPSB0ZW1wbGF0aXplcjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAodGhpcy5fY29sdW1uVHJlZSkgewogICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgcm93cyBpZiB0aGUgY29sdW1uIHRyZWUgaGFzIGFscmVhZHkgYmVlbiBpbml0aWFsaXplZAogICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaChyb3cgPT4gewogICAgICAgICAgICAgIGlmICghcm93LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj1kZXRhaWxzLWNlbGxdJykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJvdyhyb3csIHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGggLSAxXSk7CiAgICAgICAgICAgICAgICB0aGlzLl9hMTF5VXBkYXRlUm93RGV0YWlsc09wZW5lZChyb3csIGZhbHNlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgLy8gQ2xlYXIgYW55IG9sZCB0ZW1wbGF0ZSBpbnN0YW5jZXMKICAgICAgICAgICAgICBkZWxldGUgcm93LnF1ZXJ5U2VsZWN0b3IoJ1twYXJ0fj1kZXRhaWxzLWNlbGxdJykuX2luc3RhbmNlOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAodGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMubGVuZ3RoKSB7CiAgICAgICAgICAgIEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKHRoaXMuX3RvZ2dsZURldGFpbHNDZWxsLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlKCk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfZGV0YWlsc09wZW5lZEl0ZW1zQ2hhbmdlZChjaGFuZ2VSZWNvcmQsIHJvd0RldGFpbHNUZW1wbGF0ZSwgcm93RGV0YWlsc1JlbmRlcmVyKSB7CiAgICAgICAgaWYgKGNoYW5nZVJlY29yZC5wYXRoID09PSAnZGV0YWlsc09wZW5lZEl0ZW1zLmxlbmd0aCcgfHwgIWNoYW5nZVJlY29yZC52YWx1ZSkgewogICAgICAgICAgLy8gTGV04oCZcyBhdm9pZCBkdXBsaWNhdGUgd29yayBvZiBib3RoIOKAnC5zcGxpY2Vz4oCdIGFuZCDigJwubGVuZ3Ro4oCdIHVwZGF0ZXMuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKHJvdyA9PiB7CiAgICAgICAgICB0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbChyb3csIHJvdy5faXRlbSk7CiAgICAgICAgICB0aGlzLl9hMTF5VXBkYXRlUm93RGV0YWlsc09wZW5lZChyb3csIHRoaXMuX2lzRGV0YWlsc09wZW5lZChyb3cuX2l0ZW0pKTsKICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnZGV0YWlscy1vcGVuZWQnLCB0aGlzLl9pc0RldGFpbHNPcGVuZWQocm93Ll9pdGVtKSwgcm93KTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgX2NvbmZpZ3VyZURldGFpbHNDZWxsKGNlbGwpIHsKICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgncGFydCcsICdjZWxsIGRldGFpbHMtY2VsbCcpOwogICAgICAgIC8vIEZyZWV6ZSB0aGUgZGV0YWlscyBjZWxsLCBzbyB0aGF0IGl0IGRvZXMgbm90IHNjcm9sbCBob3Jpem9udGFsbHkKICAgICAgICAvLyB3aXRoIHRoZSBub3JtYWwgY2VsbHMuIFRoaXMgd2F5IGl0IGxvb2tzIGxlc3Mgd2VpcmQuCiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdmcm96ZW4nLCB0cnVlLCBjZWxsKTsKICAgICAgfQoKICAgICAgX3RvZ2dsZURldGFpbHNDZWxsKHJvdywgaXRlbSkgewogICAgICAgIGNvbnN0IGNlbGwgPSByb3cucXVlcnlTZWxlY3RvcignW3BhcnR+PSJkZXRhaWxzLWNlbGwiXScpOwogICAgICAgIGlmICghY2VsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBkZXRhaWxzSGlkZGVuID0gIXRoaXMuX2lzRGV0YWlsc09wZW5lZChpdGVtKTsKICAgICAgICBjb25zdCBoaWRkZW5DaGFuZ2VkID0gISFjZWxsLmhpZGRlbiAhPT0gZGV0YWlsc0hpZGRlbjsKCiAgICAgICAgaWYgKCFjZWxsLl9pbnN0YW5jZSAmJiAhY2VsbC5fcmVuZGVyZXIgfHwgY2VsbC5oaWRkZW4gIT09IGRldGFpbHNIaWRkZW4pIHsKICAgICAgICAgIGNlbGwuaGlkZGVuID0gZGV0YWlsc0hpZGRlbjsKICAgICAgICAgIGlmIChkZXRhaWxzSGlkZGVuKSB7CiAgICAgICAgICAgIHJvdy5zdHlsZS5yZW1vdmVQcm9wZXJ0eSgncGFkZGluZy1ib3R0b20nKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJvd0RldGFpbHNSZW5kZXJlcikgewogICAgICAgICAgICAgIGNlbGwuX3JlbmRlcmVyID0gdGhpcy5yb3dEZXRhaWxzUmVuZGVyZXI7CiAgICAgICAgICAgICAgY2VsbC5fcmVuZGVyZXIuY2FsbCh0aGlzLCBjZWxsLl9jb250ZW50LCB0aGlzLCB7aW5kZXg6IHJvdy5pbmRleCwgaXRlbTogaXRlbX0pOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZSAmJiAhY2VsbC5faW5zdGFuY2UpIHsKICAgICAgICAgICAgICAvLyBTdGFtcCB0aGUgdGVtcGxhdGUKICAgICAgICAgICAgICBjZWxsLl9pbnN0YW5jZSA9IHRoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZS50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpOwogICAgICAgICAgICAgIGNlbGwuX2NvbnRlbnQuaW5uZXJIVE1MID0gJyc7CiAgICAgICAgICAgICAgY2VsbC5fY29udGVudC5hcHBlbmRDaGlsZChjZWxsLl9pbnN0YW5jZS5yb290KTsKICAgICAgICAgICAgICB0aGlzLl91cGRhdGVJdGVtKHJvdywgaXRlbSk7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgIHJvdy5zdHlsZS5zZXRQcm9wZXJ0eSgncGFkZGluZy1ib3R0b20nLCBgJHtjZWxsLm9mZnNldEhlaWdodH1weGApOwoKICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHRoaXMubm90aWZ5UmVzaXplKCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoaGlkZGVuQ2hhbmdlZCkgewogICAgICAgICAgdGhpcy5fdXBkYXRlTWV0cmljcygpOwogICAgICAgICAgdGhpcy5fcG9zaXRpb25JdGVtcygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3VwZGF0ZURldGFpbHNDZWxsSGVpZ2h0cygpIHsKICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49ImRldGFpbHMtY2VsbCJdOm5vdChbaGlkZGVuXSknKSkuZm9yRWFjaChjZWxsID0+IHsKICAgICAgICAgIGNlbGwucGFyZW50RWxlbWVudC5zdHlsZS5zZXRQcm9wZXJ0eSgncGFkZGluZy1ib3R0b20nLCBgJHtjZWxsLm9mZnNldEhlaWdodH1weGApOwogICAgICAgIH0pOwogICAgICB9CgogICAgICBfaXNEZXRhaWxzT3BlbmVkKGl0ZW0pIHsKICAgICAgICByZXR1cm4gdGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMgJiYgdGhpcy5fZ2V0SXRlbUluZGV4SW5BcnJheShpdGVtLCB0aGlzLmRldGFpbHNPcGVuZWRJdGVtcykgIT09IC0xOwogICAgICB9CgogICAgICAvKioKICAgICAgICogT3BlbiB0aGUgZGV0YWlscyByb3cgb2YgYSBnaXZlbiBpdGVtLgogICAgICAgKi8KICAgICAgb3Blbkl0ZW1EZXRhaWxzKGl0ZW0pIHsKICAgICAgICBpZiAoIXRoaXMuX2lzRGV0YWlsc09wZW5lZChpdGVtKSkgewogICAgICAgICAgdGhpcy5wdXNoKCdkZXRhaWxzT3BlbmVkSXRlbXMnLCBpdGVtKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBDbG9zZSB0aGUgZGV0YWlscyByb3cgb2YgYSBnaXZlbiBpdGVtLgogICAgICAgKi8KICAgICAgY2xvc2VJdGVtRGV0YWlscyhpdGVtKSB7CiAgICAgICAgaWYgKHRoaXMuX2lzRGV0YWlsc09wZW5lZChpdGVtKSkgewogICAgICAgICAgdGhpcy5zcGxpY2UoJ2RldGFpbHNPcGVuZWRJdGVtcycsIHRoaXMuX2dldEl0ZW1JbmRleEluQXJyYXkoaXRlbSwgdGhpcy5kZXRhaWxzT3BlbmVkSXRlbXMpLCAxKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9kZXRhaWxzT3BlbmVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2soaW5zdGFuY2UsIHZhbHVlKSB7CiAgICAgICAgaWYgKHN1cGVyLl9kZXRhaWxzT3BlbmVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2spIHsKICAgICAgICAgIHN1cGVyLl9kZXRhaWxzT3BlbmVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2soaW5zdGFuY2UsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICB0aGlzLm9wZW5JdGVtRGV0YWlscyhpbnN0YW5jZS5pdGVtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5jbG9zZUl0ZW1EZXRhaWxzKGluc3RhbmNlLml0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCgogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IFNjcm9sbE1peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBTY3JvbGxNaXhpbiBleHRlbmRzIHN1cGVyQ2xhc3MgewoKICAgICAgZ2V0IF90aW1lb3V0cygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgU0NST0xMX1BFUklPRDogMTAwMCwKICAgICAgICAgIFdIRUVMX1NDUk9MTElORzogMjAwLAogICAgICAgICAgU0NST0xMSU5HOiAxMDAsCiAgICAgICAgICBJR05PUkVfV0hFRUw6IDUwMAogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewoKICAgICAgICAgIC8vIENhY2hlZCBhcnJheSBvZiBmcm96ZW4gY2VsbHMKICAgICAgICAgIF9mcm96ZW5DZWxsczogewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfSwKICAgICAgICAgIH0sCgogICAgICAgICAgX3Njcm9sbGJhcldpZHRoOiB7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgbWVhc3VyZW1lbnQgbm9kZQogICAgICAgICAgICAgIHZhciBzY3JvbGxEaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICBzY3JvbGxEaXYuc3R5bGUud2lkdGggPSAnMTAwcHgnOwogICAgICAgICAgICAgIHNjcm9sbERpdi5zdHlsZS5oZWlnaHQgPSAnMTAwcHgnOwogICAgICAgICAgICAgIHNjcm9sbERpdi5zdHlsZS5vdmVyZmxvdyA9ICdzY3JvbGwnOwogICAgICAgICAgICAgIHNjcm9sbERpdi5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgICAgICAgICAgc2Nyb2xsRGl2LnN0eWxlLnRvcCA9ICctOTk5OXB4JzsKICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKHNjcm9sbERpdik7CiAgICAgICAgICAgICAgLy8gR2V0IHRoZSBzY3JvbGxiYXIgd2lkdGgKICAgICAgICAgICAgICB2YXIgc2Nyb2xsYmFyV2lkdGggPSBzY3JvbGxEaXYub2Zmc2V0V2lkdGggLSBzY3JvbGxEaXYuY2xpZW50V2lkdGg7CiAgICAgICAgICAgICAgLy8gRGVsZXRlIHRoZSBESVYKICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKHNjcm9sbERpdik7CiAgICAgICAgICAgICAgcmV0dXJuIHNjcm9sbGJhcldpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAoKICAgICAgICAgIF9yb3dXaXRoRm9jdXNlZEVsZW1lbnQ6IEVsZW1lbnQsCgogICAgICAgICAgX2RlbHRhWUFjYzogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIHZhbHVlOiAwCiAgICAgICAgICB9CgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX3Njcm9sbEhlaWdodFVwZGF0ZWQoX2VzdFNjcm9sbEhlaWdodCknLAogICAgICAgICAgJ19zY3JvbGxWaWV3cG9ydEhlaWdodFVwZGF0ZWQoX3ZpZXdwb3J0SGVpZ2h0KScKICAgICAgICBdOwogICAgICB9CgogICAgICAvLyBPdmVycmlkZSAoZnJvbSBpcm9uLXNjcm9sbC10YXJnZXQtYmVoYXZpb3IpIHRvIGF2b2lkIGRvY3VtZW50IHNjcm9sbAogICAgICBzZXQgX3Njcm9sbFRvcCh0b3ApIHsKICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsVG9wID0gdG9wOwogICAgICB9CgogICAgICBnZXQgX3Njcm9sbFRvcCgpIHsKICAgICAgICByZXR1cm4gdGhpcy4kLnRhYmxlLnNjcm9sbFRvcDsKICAgICAgfQoKICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgc3VwZXIoKTsKICAgICAgICB0aGlzLl9zY3JvbGxMaW5lSGVpZ2h0ID0gdGhpcy5fZ2V0U2Nyb2xsTGluZUhlaWdodCgpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogQHJldHVybnMge051bWJlcnx1bmRlZmluZWR9IC0gVGhlIGJyb3dzZXIncyBkZWZhdWx0IGZvbnQtc2l6ZSBpbiBwaXhlbHMKICAgICAgICovCiAgICAgIF9nZXRTY3JvbGxMaW5lSGVpZ2h0KCkgewogICAgICAgIGNvbnN0IGVsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgZWwuc3R5bGUuZm9udFNpemUgPSAnaW5pdGlhbCc7CiAgICAgICAgZWwuc3R5bGUuZGlzcGxheSA9ICdub25lJzsKICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGVsKTsKICAgICAgICBjb25zdCBmb250U2l6ZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsKS5mb250U2l6ZTsKICAgICAgICBkb2N1bWVudC5ib2R5LnJlbW92ZUNoaWxkKGVsKTsKICAgICAgICByZXR1cm4gZm9udFNpemUgPyB3aW5kb3cucGFyc2VJbnQoZm9udFNpemUpIDogdW5kZWZpbmVkOwogICAgICB9CgogICAgICBfc2Nyb2xsVmlld3BvcnRIZWlnaHRVcGRhdGVkKF92aWV3cG9ydEhlaWdodCkgewogICAgICAgIHRoaXMuX3Njcm9sbFBhZ2VIZWlnaHQgPSBfdmlld3BvcnRIZWlnaHQgLSB0aGlzLiQuaGVhZGVyLmNsaWVudEhlaWdodCAtIHRoaXMuJC5mb290ZXIuY2xpZW50SGVpZ2h0IC0gdGhpcy5fc2Nyb2xsTGluZUhlaWdodDsKICAgICAgfQoKICAgICAgcmVhZHkoKSB7CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICB0aGlzLnNjcm9sbFRhcmdldCA9IHRoaXMuJC50YWJsZTsKCiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCd3aGVlbCcsIGUgPT4gewogICAgICAgICAgdGhpcy5fd2hlZWxTY3JvbGxpbmcgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZGVib3VuY2VyV2hlZWxTY3JvbGxpbmcgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlcldoZWVsU2Nyb2xsaW5nLAogICAgICAgICAgICB0aW1lT3V0LmFmdGVyKHRoaXMuX3RpbWVvdXRzLldIRUVMX1NDUk9MTElORyksCiAgICAgICAgICAgICgpID0+IHRoaXMuX3doZWVsU2Nyb2xsaW5nID0gZmFsc2UKICAgICAgICAgICk7CiAgICAgICAgICB0aGlzLl9vbldoZWVsKGUpOwogICAgICAgIH0pOwoKICAgICAgICB0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgZSA9PiB7CiAgICAgICAgICBpZiAodGhpcy4kLm91dGVyc2Nyb2xsZXIub3V0ZXJTY3JvbGxpbmcpIHsKICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgICAgICAgIH0KICAgICAgICB9LCB0cnVlKTsKCiAgICAgICAgdGhpcy4kLml0ZW1zLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzaW4nLCAoZSkgPT4gewogICAgICAgICAgY29uc3QgaXRlbXNJbmRleCA9IGUuY29tcG9zZWRQYXRoKCkuaW5kZXhPZih0aGlzLiQuaXRlbXMpOwogICAgICAgICAgdGhpcy5fcm93V2l0aEZvY3VzZWRFbGVtZW50ID0gZS5jb21wb3NlZFBhdGgoKVtpdGVtc0luZGV4IC0gMV07CiAgICAgICAgfSk7CiAgICAgICAgdGhpcy4kLml0ZW1zLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgKCkgPT4gdGhpcy5fcm93V2l0aEZvY3VzZWRFbGVtZW50ID0gdW5kZWZpbmVkKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFNjcm9sbCB0byBhIHNwZWNpZmljIHJvdyBpbmRleCBpbiB0aGUgdmlydHVhbCBsaXN0LiBOb3RlIHRoYXQgdGhlIHJvdyBpbmRleCBpcwogICAgICAgKiBub3QgYWx3YXlzIHRoZSBzYW1lIGZvciBhbnkgcGFydGljdWxhciBpdGVtLiBGb3IgZXhhbXBsZSwgc29ydGluZy9maWx0ZXJpbmcvZXhwYW5kaW5nCiAgICAgICAqIG9yIGNvbGxhcHNpbmcgaGllcmFyY2hpY2FsIGl0ZW1zIGNhbiBhZmZlY3QgdGhlIHJvdyBpbmRleCByZWxhdGVkIHRvIGFuIGl0ZW0uCiAgICAgICAqCiAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBpbmRleCBSb3cgaW5kZXggdG8gc2Nyb2xsIHRvCiAgICAgICAqLwogICAgICBzY3JvbGxUb0luZGV4KGluZGV4KSB7CiAgICAgICAgdGhpcy5fYWNjZXNzSXJvbkxpc3RBUEkoKCkgPT4gc3VwZXIuc2Nyb2xsVG9JbmRleChpbmRleCkpOwogICAgICB9CgogICAgICBfb25XaGVlbChlKSB7CiAgICAgICAgaWYgKGUuY3RybEtleSB8fCB0aGlzLl9oYXNTY3JvbGxlZEFuY2VzdG9yKGUudGFyZ2V0LCBlLmRlbHRhWCwgZS5kZWx0YVkpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCB0YWJsZSA9IHRoaXMuJC50YWJsZTsKCiAgICAgICAgbGV0IGRlbHRhWSA9IGUuZGVsdGFZOwogICAgICAgIGlmIChlLmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfTElORSkgewogICAgICAgICAgLy8gU2Nyb2xsaW5nIGJ5ICJsaW5lcyBvZiB0ZXh0IiBpbnN0ZWFkIG9mIHBpeGVscwogICAgICAgICAgZGVsdGFZICo9IHRoaXMuX3Njcm9sbExpbmVIZWlnaHQ7CiAgICAgICAgfSBlbHNlIGlmIChlLmRlbHRhTW9kZSA9PT0gV2hlZWxFdmVudC5ET01fREVMVEFfUEFHRSkgewogICAgICAgICAgLy8gU2Nyb2xsaW5nIGJ5ICJwYWdlcyIgaW5zdGVhZCBvZiBwaXhlbHMKICAgICAgICAgIGRlbHRhWSAqPSB0aGlzLl9zY3JvbGxQYWdlSGVpZ2h0OwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX3doZWVsQW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAgIC8vIFNraXAgbmV3IHdoZWVsIGV2ZW50cyB3aGlsZSBvbmUgaXMgYmVpbmcgcHJvY2Vzc2VkCiAgICAgICAgICB0aGlzLl9kZWx0YVlBY2MgKz0gZGVsdGFZOwogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgZGVsdGFZICs9IHRoaXMuX2RlbHRhWUFjYzsKICAgICAgICB0aGlzLl9kZWx0YVlBY2MgPSAwOwoKICAgICAgICB0aGlzLl93aGVlbEFuaW1hdGlvbkZyYW1lID0gdHJ1ZTsKICAgICAgICB0aGlzLl9kZWJvdW5jZXJXaGVlbEFuaW1hdGlvbkZyYW1lID0gRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgdGhpcy5fZGVib3VuY2VyV2hlZWxBbmltYXRpb25GcmFtZSwKICAgICAgICAgIGFuaW1hdGlvbkZyYW1lLAogICAgICAgICAgKCkgPT4gdGhpcy5fd2hlZWxBbmltYXRpb25GcmFtZSA9IGZhbHNlCiAgICAgICAgKTsKCiAgICAgICAgdmFyIG1vbWVudHVtID0gTWF0aC5hYnMoZS5kZWx0YVgpICsgTWF0aC5hYnMoZGVsdGFZKTsKCiAgICAgICAgaWYgKHRoaXMuX2NhblNjcm9sbCh0YWJsZSwgZS5kZWx0YVgsIGRlbHRhWSkpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgIHRhYmxlLnNjcm9sbFRvcCArPSBkZWx0YVk7CiAgICAgICAgICB0YWJsZS5zY3JvbGxMZWZ0ICs9IGUuZGVsdGFYOwogICAgICAgICAgdGhpcy5fc2Nyb2xsSGFuZGxlcigpOwogICAgICAgICAgdGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bSA9IHRydWU7CgogICAgICAgICAgdGhpcy5faWdub3JlTmV3V2hlZWwgPSB0cnVlOwogICAgICAgICAgdGhpcy5fZGVib3VuY2VySWdub3JlTmV3V2hlZWwgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICAgIHRoaXMuX2RlYm91bmNlcklnbm9yZU5ld1doZWVsLAogICAgICAgICAgICB0aW1lT3V0LmFmdGVyKHRoaXMuX3RpbWVvdXRzLklHTk9SRV9XSEVFTCksCiAgICAgICAgICAgICgpID0+IHRoaXMuX2lnbm9yZU5ld1doZWVsID0gZmFsc2UKICAgICAgICAgICk7CiAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9oYXNSZXNpZHVhbE1vbWVudHVtICYmIG1vbWVudHVtIDw9IHRoaXMuX3ByZXZpb3VzTW9tZW50dW0gfHwgdGhpcy5faWdub3JlTmV3V2hlZWwpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9IGVsc2UgaWYgKG1vbWVudHVtID4gdGhpcy5fcHJldmlvdXNNb21lbnR1bSkgewogICAgICAgICAgdGhpcy5faGFzUmVzaWR1YWxNb21lbnR1bSA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICB0aGlzLl9wcmV2aW91c01vbWVudHVtID0gbW9tZW50dW07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBhbmNlc3RvciBwcmlvciB0byB0aGlzCiAgICAgICAqIGNlbGwgY29udGVudCB0aGF0IGhhbmRsZXMgdGhlIHNjcm9sbCBkZWx0YQogICAgICAgKi8KICAgICAgX2hhc1Njcm9sbGVkQW5jZXN0b3IoZWwsIGRlbHRhWCwgZGVsdGFZKSB7CiAgICAgICAgaWYgKGVsLmxvY2FsTmFtZSA9PT0gJ3ZhYWRpbi1ncmlkLWNlbGwtY29udGVudCcpIHsKICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2NhblNjcm9sbChlbCwgZGVsdGFYLCBkZWx0YVkpCiAgICAgICAgICAmJiBbJ2F1dG8nLCAnc2Nyb2xsJ10uaW5kZXhPZihnZXRDb21wdXRlZFN0eWxlKGVsKS5vdmVyZmxvdykgIT09IC0xKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9IGVsc2UgaWYgKGVsICE9PSB0aGlzICYmIGVsLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNTY3JvbGxlZEFuY2VzdG9yKGVsLnBhcmVudEVsZW1lbnQsIGRlbHRhWCwgZGVsdGFZKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSB0aGUgZ2l2ZW4gc2Nyb2xsIGRlbHRhcyBjYW4gYmUgYXBwbGllZCB0byB0aGUgZWxlbWVudAogICAgICAgKiAoZnVsbHkgb3IgcGFydGlhbGx5KQogICAgICAgKi8KICAgICAgX2NhblNjcm9sbChlbCwgZGVsdGFYLCBkZWx0YVkpIHsKICAgICAgICByZXR1cm4gKGRlbHRhWSA+IDAgJiYgZWwuc2Nyb2xsVG9wIDwgZWwuc2Nyb2xsSGVpZ2h0IC0gZWwub2Zmc2V0SGVpZ2h0KSB8fAogICAgICAgIChkZWx0YVkgPCAwICYmIGVsLnNjcm9sbFRvcCA+IDApIHx8CiAgICAgICAgKGRlbHRhWCA+IDAgJiYgZWwuc2Nyb2xsTGVmdCA8IGVsLnNjcm9sbFdpZHRoIC0gZWwub2Zmc2V0V2lkdGgpIHx8CiAgICAgICAgKGRlbHRhWCA8IDAgJiYgZWwuc2Nyb2xsTGVmdCA+IDApOwogICAgICB9CgogICAgICBfc2NoZWR1bGVTY3JvbGxpbmcoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9zY3JvbGxpbmdGcmFtZSkgewogICAgICAgICAgLy8gRGVmZXIgc2V0dGluZyBzdGF0ZSBhdHRyaWJ1dGVzIHRvIGF2b2lkIEVkZ2UgaGljY3VwcwogICAgICAgICAgdGhpcy5fc2Nyb2xsaW5nRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdzY3JvbGxpbmcnLCB0cnVlLCB0aGlzLiQuc2Nyb2xsZXIpKTsKICAgICAgICB9CiAgICAgICAgdGhpcy5fZGVib3VuY2VTY3JvbGxpbmcgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICB0aGlzLl9kZWJvdW5jZVNjcm9sbGluZywKICAgICAgICAgIHRpbWVPdXQuYWZ0ZXIodGhpcy5fdGltZW91dHMuU0NST0xMSU5HKSwKICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUodGhpcy5fc2Nyb2xsaW5nRnJhbWUpOwogICAgICAgICAgICBkZWxldGUgdGhpcy5fc2Nyb2xsaW5nRnJhbWU7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnc2Nyb2xsaW5nJywgZmFsc2UsIHRoaXMuJC5zY3JvbGxlcik7CiAgICAgICAgICAgIGlmICghdGhpcy4kLm91dGVyc2Nyb2xsZXIub3V0ZXJTY3JvbGxpbmcpIHsKICAgICAgICAgICAgICB0aGlzLl9yZW9yZGVyUm93cygpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgKTsKCiAgICAgICAgaWYgKCF0aGlzLl9zY3JvbGxQZXJpb2RGcmFtZSkgewogICAgICAgICAgdGhpcy5fc2Nyb2xsUGVyaW9kRnJhbWUgPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdzY3JvbGwtcGVyaW9kJywgdHJ1ZSwgdGhpcy4kLnNjcm9sbGVyKSk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX2RlYm91bmNlU2Nyb2xsUGVyaW9kID0gRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgdGhpcy5fZGVib3VuY2VTY3JvbGxQZXJpb2QsCiAgICAgICAgICB0aW1lT3V0LmFmdGVyKHRoaXMuX3RpbWVvdXRzLlNDUk9MTF9QRVJJT0QpLAogICAgICAgICAgKCkgPT4gewogICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9zY3JvbGxQZXJpb2RGcmFtZSk7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLl9zY3JvbGxQZXJpb2RGcmFtZTsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdzY3JvbGwtcGVyaW9kJywgZmFsc2UsIHRoaXMuJC5zY3JvbGxlcik7CiAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgfQoKICAgICAgX2FmdGVyU2Nyb2xsKCkgewogICAgICAgIHRoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpOwoKICAgICAgICBpZiAoIXRoaXMuaGFzQXR0cmlidXRlKCdyZW9yZGVyaW5nJykpIHsKICAgICAgICAgIHRoaXMuX3NjaGVkdWxlU2Nyb2xsaW5nKCk7CiAgICAgICAgfQoKICAgICAgICBjb25zdCBvcyA9IHRoaXMuJC5vdXRlcnNjcm9sbGVyOwogICAgICAgIGlmICghdGhpcy5faW9zICYmICh0aGlzLl93aGVlbFNjcm9sbGluZyB8fCBvcy5wYXNzdGhyb3VnaCkpIHsKICAgICAgICAgIG9zLnN5bmNPdXRlclNjcm9sbGVyKCk7CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy5faW9zKSB7CiAgICAgICAgICAvLyBFbmFibGUgdmVydGljYWwgcnViYmVyYmFuZCBmZWVkYmFjawogICAgICAgICAgY29uc3Qgb3ZlclNjcm9sbCA9IE1hdGgubWF4KC1vcy5zY3JvbGxUb3AsIDApIHx8CiAgICAgICAgICAgIE1hdGgubWluKDAsIG9zLnNjcm9sbEhlaWdodCAtIG9zLnNjcm9sbFRvcCAtIG9zLm9mZnNldEhlaWdodCk7CiAgICAgICAgICB0aGlzLiQuaXRlbXMuc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZVkoJHtvdmVyU2Nyb2xsfXB4KWA7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl91cGRhdGVPdmVyZmxvdygpOwogICAgICB9CgogICAgICBfdXBkYXRlT3ZlcmZsb3coKSB7CiAgICAgICAgLy8gU2V0IG92ZXJmbG93IHN0eWxpbmcgYXR0cmlidXRlcwogICAgICAgIGxldCBvdmVyZmxvdyA9ICcnOwogICAgICAgIGNvbnN0IHRhYmxlID0gdGhpcy4kLnRhYmxlOwogICAgICAgIGlmICh0YWJsZS5zY3JvbGxUb3AgPCB0YWJsZS5zY3JvbGxIZWlnaHQgLSB0YWJsZS5jbGllbnRIZWlnaHQpIHsKICAgICAgICAgIG92ZXJmbG93ICs9ICcgYm90dG9tJzsKICAgICAgICB9CgogICAgICAgIGlmICh0YWJsZS5zY3JvbGxUb3AgPiAwKSB7CiAgICAgICAgICBvdmVyZmxvdyArPSAnIHRvcCc7CiAgICAgICAgfQoKICAgICAgICBpZiAodGFibGUuc2Nyb2xsTGVmdCA8IHRhYmxlLnNjcm9sbFdpZHRoIC0gdGFibGUuY2xpZW50V2lkdGgpIHsKICAgICAgICAgIG92ZXJmbG93ICs9ICcgcmlnaHQnOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRhYmxlLnNjcm9sbExlZnQgPiAwKSB7CiAgICAgICAgICBvdmVyZmxvdyArPSAnIGxlZnQnOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fZGVib3VuY2VPdmVyZmxvdyA9IERlYm91bmNlci5kZWJvdW5jZSgKICAgICAgICAgIHRoaXMuX2RlYm91bmNlT3ZlcmZsb3csCiAgICAgICAgICBhbmltYXRpb25GcmFtZSwKICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBvdmVyZmxvdy50cmltKCk7CiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPiAwICYmIHRoaXMuZ2V0QXR0cmlidXRlKCdvdmVyZmxvdycpICE9PSB2YWx1ZSkgewogICAgICAgICAgICAgIHRoaXMuc2V0QXR0cmlidXRlKCdvdmVyZmxvdycsIHZhbHVlKTsKICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5sZW5ndGggPT0gMCAmJiB0aGlzLmhhc0F0dHJpYnV0ZSgnb3ZlcmZsb3cnKSkgewogICAgICAgICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdvdmVyZmxvdycpOwogICAgICAgICAgICB9CiAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgfQoKICAgICAgLy8gY29ycmVjdCBvcmRlciBuZWVkZWQgZm9yIHByZXNlcnZpbmcgY29ycmVjdCB0YWIgb3JkZXIgYmV0d2VlbiBjZWxsIGNvbnRlbnRzLgogICAgICBfcmVvcmRlclJvd3MoKSB7CiAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuJC5pdGVtczsKICAgICAgICBjb25zdCBpdGVtcyA9IGJvZHkucXVlcnlTZWxlY3RvckFsbCgndHInKTsKICAgICAgICBpZiAoIWl0ZW1zLmxlbmd0aCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgYWRqdXN0ZWRWaXJ0dWFsU3RhcnQgPSB0aGlzLl92aXJ0dWFsU3RhcnQgKyB0aGlzLl92aWR4T2Zmc2V0OwoKICAgICAgICAvLyBXaGljaCByb3cgdG8gdXNlIGFzIGEgdGFyZ2V0PwogICAgICAgIGNvbnN0IHRhcmdldFJvdyA9IHRoaXMuX3Jvd1dpdGhGb2N1c2VkRWxlbWVudCB8fCBBcnJheS5mcm9tKGl0ZW1zKS5maWx0ZXIocm93ID0+ICFyb3cuaGlkZGVuKVswXTsKICAgICAgICBpZiAoIXRhcmdldFJvdykgewogICAgICAgICAgLy8gQWxsIHJvd3MgYXJlIGhpZGRlbiwgZG9uJ3QgcmVvcmRlcgogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gV2hlcmUgdGhlIHRhcmdldCByb3cgc2hvdWxkIGJlPwogICAgICAgIGNvbnN0IHRhcmdldFBoeXNpY2FsSW5kZXggPSB0YXJnZXRSb3cuaW5kZXggLSBhZGp1c3RlZFZpcnR1YWxTdGFydDsKCiAgICAgICAgLy8gUmVvZHJlciB0aGUgRE9NIGVsZW1lbnRzIHRvIGtlZXAgdGhlIHRhcmdldCByb3cgYXQgdGhlIHRhcmdldCBwaHlzaWNhbCBpbmRleAogICAgICAgIGNvbnN0IGRlbHRhID0gQXJyYXkuZnJvbShpdGVtcykuaW5kZXhPZih0YXJnZXRSb3cpIC0gdGFyZ2V0UGh5c2ljYWxJbmRleDsKICAgICAgICBpZiAoZGVsdGEgPiAwKSB7CiAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlbHRhOyBpKyspIHsKICAgICAgICAgICAgYm9keS5hcHBlbmRDaGlsZChpdGVtc1tpXSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChkZWx0YSA8IDApIHsKICAgICAgICAgIGZvciAobGV0IGkgPSBpdGVtcy5sZW5ndGggKyBkZWx0YTsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGJvZHkuaW5zZXJ0QmVmb3JlKGl0ZW1zW2ldLCBpdGVtc1swXSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfZnJvemVuQ2VsbHNDaGFuZ2VkKCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlckNhY2hlRWxlbWVudHMgPSBEZWJvdW5jZXIuZGVib3VuY2UoCiAgICAgICAgICB0aGlzLl9kZWJvdW5jZXJDYWNoZUVsZW1lbnRzLAogICAgICAgICAgbWljcm9UYXNrLAogICAgICAgICAgKCkgPT4gewogICAgICAgICAgICBBcnJheS5mcm9tKHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCdbcGFydH49ImNlbGwiXScpKS5mb3JFYWNoKGZ1bmN0aW9uKGNlbGwpIHsKICAgICAgICAgICAgICBjZWxsLnN0eWxlLnRyYW5zZm9ybSA9ICcnOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fZnJvemVuQ2VsbHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLiQudGFibGUucXVlcnlTZWxlY3RvckFsbCgnW2Zyb3plbl0nKSk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNjcm9sbGVyTWVhc3VyZW1lbnRzKCk7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpOwogICAgICAgICAgfQogICAgICAgICk7CiAgICAgICAgdGhpcy5fdXBkYXRlTGFzdEZyb3plbigpOwogICAgICB9CgogICAgICBfdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKSB7CiAgICAgICAgaWYgKHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aCA+IDAgJiYgdGhpcy5fX2lzUlRMKSB7CiAgICAgICAgICB0aGlzLl9fc2Nyb2xsZXJNZXRyaWNzID0gewogICAgICAgICAgICBzY3JvbGxXaWR0aDogdGhpcy4kLm91dGVyc2Nyb2xsZXIuc2Nyb2xsV2lkdGgsCiAgICAgICAgICAgIGNsaWVudFdpZHRoOiB0aGlzLiQub3V0ZXJzY3JvbGxlci5jbGllbnRXaWR0aAogICAgICAgICAgfTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF91cGRhdGVMYXN0RnJvemVuKCkgewogICAgICAgIGlmICghdGhpcy5fY29sdW1uVHJlZSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgY29sdW1uc1JvdyA9IHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGggLSAxXS5zbGljZSgwKTsKICAgICAgICBjb2x1bW5zUm93LnNvcnQoKGEsIGIpID0+IHsKICAgICAgICAgIHJldHVybiBhLl9vcmRlciAtIGIuX29yZGVyOwogICAgICAgIH0pOwogICAgICAgIGNvbnN0IGxhc3RGcm96ZW4gPSBjb2x1bW5zUm93LnJlZHVjZSgocHJldiwgY29sLCBpbmRleCkgPT4gewogICAgICAgICAgY29sLl9sYXN0RnJvemVuID0gZmFsc2U7CiAgICAgICAgICByZXR1cm4gY29sLmZyb3plbiAmJiAhY29sLmhpZGRlbiA/IGluZGV4IDogcHJldjsKICAgICAgICB9LCB1bmRlZmluZWQpOwogICAgICAgIGlmIChsYXN0RnJvemVuICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgIGNvbHVtbnNSb3dbbGFzdEZyb3plbl0uX2xhc3RGcm96ZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3RyYW5zbGF0ZVN0YXRpb25hcnlFbGVtZW50cygpIHsKICAgICAgICBpZiAodGhpcy5fZWRnZSAmJiAhdGhpcy5fc2Nyb2xsYmFyV2lkdGgpIHsKICAgICAgICAgIC8vIEZpeGVkIG1vZGUgKFRhYmxldCBFZGdlKQogICAgICAgICAgdGhpcy4kLml0ZW1zLnN0eWxlLnRyYW5zZm9ybSA9CiAgICAgICAgICB0aGlzLl9nZXRUcmFuc2xhdGUoLXRoaXMuX3Njcm9sbExlZnQgfHwgMCwgLXRoaXMuX3Njcm9sbFRvcCB8fCAwKTsKCiAgICAgICAgICB0aGlzLiQuZm9vdGVyLnN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuJC5oZWFkZXIuc3R5bGUudHJhbnNmb3JtID0KICAgICAgICAgIHRoaXMuX2dldFRyYW5zbGF0ZSgtdGhpcy5fc2Nyb2xsTGVmdCB8fCAwLCAwKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy4kLmZvb3Rlci5zdHlsZS50cmFuc2Zvcm0gPSB0aGlzLiQuaGVhZGVyLnN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuX2dldFRyYW5zbGF0ZSgwLCB0aGlzLl9zY3JvbGxUb3ApOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuX2Zyb3plbkNlbGxzLmxlbmd0aCA+IDApIHsKICAgICAgICAgIGNvbnN0IHggPSB0aGlzLl9faXNSVEwgPwogICAgICAgICAgICB0aGlzLl9fZ2V0Tm9ybWFsaXplZFNjcm9sbExlZnQodGhpcy4kLnRhYmxlKSArIHRoaXMuX19zY3JvbGxlck1ldHJpY3MuY2xpZW50V2lkdGggLQogICAgICAgICAgICB0aGlzLl9fc2Nyb2xsZXJNZXRyaWNzLnNjcm9sbFdpZHRoCiAgICAgICAgICAgIDogdGhpcy5fc2Nyb2xsTGVmdDsKICAgICAgICAgIHZhciBmcm96ZW5DZWxsVHJhbnNmb3JtID0gdGhpcy5fZ2V0VHJhbnNsYXRlKHgsIDApOwogICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLl9mcm96ZW5DZWxscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICB0aGlzLl9mcm96ZW5DZWxsc1tpXS5zdHlsZS50cmFuc2Zvcm0gPSBmcm96ZW5DZWxsVHJhbnNmb3JtOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX2dldFRyYW5zbGF0ZSh4LCB5KSB7CiAgICAgICAgcmV0dXJuICd0cmFuc2xhdGUoJyArIHggKyAncHgsJyArIHkgKyAncHgpJzsKICAgICAgfQoKICAgICAgX3Njcm9sbEhlaWdodFVwZGF0ZWQoX2VzdFNjcm9sbEhlaWdodCkgewogICAgICAgIHRoaXMuJC5vdXRlcnNpemVyLnN0eWxlLnRvcCA9IHRoaXMuJC5maXhlZHNpemVyLnN0eWxlLnRvcCA9IF9lc3RTY3JvbGxIZWlnaHQgKyAncHgnOwogICAgICB9CgogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgU2VsZWN0aW9uTWl4aW4gPSBzdXBlckNsYXNzID0+IGNsYXNzIFNlbGVjdGlvbk1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogQW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgc2VsZWN0ZWQgaXRlbXMuCiAgICAgICAgICAgKi8KICAgICAgICAgIHNlbGVjdGVkSXRlbXM6IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICAgIHZhbHVlOiAoKSA9PiBbXQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX3NlbGVjdGVkSXRlbXNDaGFuZ2VkKHNlbGVjdGVkSXRlbXMuKiknCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgX2lzU2VsZWN0ZWQoaXRlbSkgewogICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSXRlbXMgJiYgdGhpcy5fZ2V0SXRlbUluZGV4SW5BcnJheShpdGVtLCB0aGlzLnNlbGVjdGVkSXRlbXMpID4gLTE7CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBTZWxlY3RzIHRoZSBnaXZlbiBpdGVtLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIHNlbGVjdEl0ZW0KICAgICAgICogQHBhcmFtIHtPYmplY3R9IGl0ZW0gVGhlIGl0ZW0gb2JqZWN0CiAgICAgICAqLwogICAgICBzZWxlY3RJdGVtKGl0ZW0pIHsKICAgICAgICBpZiAoIXRoaXMuX2lzU2VsZWN0ZWQoaXRlbSkpIHsKICAgICAgICAgIHRoaXMucHVzaCgnc2VsZWN0ZWRJdGVtcycsIGl0ZW0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIERlc2VsZWN0cyB0aGUgZ2l2ZW4gaXRlbSBpZiBpdCBpcyBhbHJlYWR5IHNlbGVjdGVkLgogICAgICAgKgogICAgICAgKiBAbWV0aG9kIGRlc2VsZWN0CiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIFRoZSBpdGVtIG9iamVjdAogICAgICAgKi8KICAgICAgZGVzZWxlY3RJdGVtKGl0ZW0pIHsKICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX2dldEl0ZW1JbmRleEluQXJyYXkoaXRlbSwgdGhpcy5zZWxlY3RlZEl0ZW1zKTsKICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgdGhpcy5zcGxpY2UoJ3NlbGVjdGVkSXRlbXMnLCBpbmRleCwgMSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvKioKICAgICAgICogVG9nZ2xlcyB0aGUgc2VsZWN0ZWQgc3RhdGUgb2YgdGhlIGdpdmVuIGl0ZW0uCiAgICAgICAqCiAgICAgICAqIEBtZXRob2QgdG9nZ2xlCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtIFRoZSBpdGVtIG9iamVjdAogICAgICAgKi8KICAgICAgX3RvZ2dsZUl0ZW0oaXRlbSkgewogICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fZ2V0SXRlbUluZGV4SW5BcnJheShpdGVtLCB0aGlzLnNlbGVjdGVkSXRlbXMpOwogICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICAgIHRoaXMuc2VsZWN0SXRlbShpdGVtKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5kZXNlbGVjdEl0ZW0oaXRlbSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfc2VsZWN0ZWRJdGVtc0NoYW5nZWQoZSkgewogICAgICAgIGlmICh0aGlzLiQuaXRlbXMuY2hpbGRyZW4ubGVuZ3RoICYmIChlLnBhdGggPT09ICdzZWxlY3RlZEl0ZW1zJyB8fCBlLnBhdGggPT09ICdzZWxlY3RlZEl0ZW1zLnNwbGljZXMnKSkgewogICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZvckVhY2gocm93ID0+IHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlSXRlbShyb3csIHJvdy5faXRlbSk7CiAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9zZWxlY3RlZEluc3RhbmNlQ2hhbmdlZENhbGxiYWNrKGluc3RhbmNlLCB2YWx1ZSkgewogICAgICAgIGlmIChzdXBlci5fc2VsZWN0ZWRJbnN0YW5jZUNoYW5nZWRDYWxsYmFjaykgewogICAgICAgICAgc3VwZXIuX3NlbGVjdGVkSW5zdGFuY2VDaGFuZ2VkQ2FsbGJhY2soaW5zdGFuY2UsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICB0aGlzLnNlbGVjdEl0ZW0oaW5zdGFuY2UuaXRlbSk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHRoaXMuZGVzZWxlY3RJdGVtKGluc3RhbmNlLml0ZW0pOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCgogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IFNvcnRNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgU29ydE1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIGB0cnVlYCwgYWxsIGA8dmFhZGluLWdyaWQtc29ydGVyPmAgYXJlIGFwcGxpZWQgZm9yIHNvcnRpbmcuCiAgICAgICAgICAgKi8KICAgICAgICAgIG11bHRpU29ydDogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogZmFsc2UKICAgICAgICAgIH0sCgogICAgICAgICAgX3NvcnRlcnM6IHsKICAgICAgICAgICAgdHlwZTogQXJyYXksCiAgICAgICAgICAgIHZhbHVlOiBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgIH0sCgogICAgICAgICAgX3ByZXZpb3VzU29ydGVyczogewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJlYWR5KCkgewogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdzb3J0ZXItY2hhbmdlZCcsIHRoaXMuX29uU29ydGVyQ2hhbmdlZCk7CgogICAgICAgIC8vIFdpdGggUG9seW1lciAyICYgc2hhZHkgdGhlICdzb3J0ZXItY2hhbmdlZCcgbGlzdGVuZXIgaXNuJ3QgZ3VhcmFudGVlZCB0byBiZSByZWdpc3RlcmVkCiAgICAgICAgLy8gYmVmb3JlIGNoaWxkIDx2YWFkaW4tZ3JpZC1zb3J0ZXI+J3MgdXBncmFkZSBhbmQgZmlyZSB0aGUgZXZlbnRzLiBUaGUgZm9sbG93aW5nCiAgICAgICAgLy8gbWFrZXMgc3VyZSB0aGF0ICdzb3J0ZXItY2hhbmdlZCcgaXMgZmlyZWQgZm9yIGFsbCA8dmFhZGluLWdyaWQtc29ydGVyPiBlbGVtZW50cwogICAgICAgIC8vIGFmdGVyIHRoaXMgKDx2YWFkaW4tZ3JpZD4pIGlzIHJlYWR5IChhbmQgdGhlIGxpc3RlbmVycyBhcmUgYWN0aXZlKS4KICAgICAgICBpZiAod2luZG93LlNoYWR5RE9NKSB7CiAgICAgICAgICBtaWNyb1Rhc2sucnVuKCgpID0+IHsKICAgICAgICAgICAgY29uc3Qgc29ydGVycyA9IHRoaXMucXVlcnlTZWxlY3RvckFsbCgndmFhZGluLWdyaWQtc29ydGVyJyk7CiAgICAgICAgICAgIEFycmF5LmZyb20oc29ydGVycykuZm9yRWFjaCgoc29ydGVyKSA9PiB7CiAgICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIGZpcmUgaWYgdGhlIHNvcnRlciBoYXNuJ3QgYmVlbiB1cGdyYWRlZCB5ZXQKICAgICAgICAgICAgICBpZiAoc29ydGVyIGluc3RhbmNlb2YgUG9seW1lckVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHNvcnRlci5kaXNwYXRjaEV2ZW50KG5ldyBDdXN0b21FdmVudCgnc29ydGVyLWNoYW5nZWQnLCB7YnViYmxlczogdHJ1ZSwgY29tcG9zZWQ6IHRydWV9KSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX29uU29ydGVyQ2hhbmdlZChlKSB7CiAgICAgICAgY29uc3Qgc29ydGVyID0gZS50YXJnZXQ7CgogICAgICAgIHRoaXMuX3JlbW92ZUFycmF5SXRlbSh0aGlzLl9zb3J0ZXJzLCBzb3J0ZXIpOwogICAgICAgIHNvcnRlci5fb3JkZXIgPSBudWxsOwoKICAgICAgICBpZiAodGhpcy5tdWx0aVNvcnQpIHsKICAgICAgICAgIGlmIChzb3J0ZXIuZGlyZWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3NvcnRlcnMudW5zaGlmdChzb3J0ZXIpOwogICAgICAgICAgfQoKICAgICAgICAgIHRoaXMuX3NvcnRlcnMuZm9yRWFjaCgoc29ydGVyLCBpbmRleCkgPT4gc29ydGVyLl9vcmRlciA9IHRoaXMuX3NvcnRlcnMubGVuZ3RoID4gMSA/IGluZGV4IDogbnVsbCwgdGhpcyk7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmIChzb3J0ZXIuZGlyZWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3NvcnRlcnMuZm9yRWFjaChzb3J0ZXIgPT4gewogICAgICAgICAgICAgIHNvcnRlci5fb3JkZXIgPSBudWxsOwogICAgICAgICAgICAgIHNvcnRlci5kaXJlY3Rpb24gPSBudWxsOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fc29ydGVycyA9IFtzb3J0ZXJdOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKCiAgICAgICAgaWYgKHRoaXMuZGF0YVByb3ZpZGVyICYmCiAgICAgICAgICAvLyBObyBuZWVkIHRvIGNsZWFyIGNhY2hlIGlmIHNvcnRlcnMgZGlkbid0IGNoYW5nZQogICAgICAgICAgSlNPTi5zdHJpbmdpZnkodGhpcy5fcHJldmlvdXNTb3J0ZXJzKSAhPT0gSlNPTi5zdHJpbmdpZnkodGhpcy5fbWFwU29ydGVycygpKSkgewogICAgICAgICAgdGhpcy5jbGVhckNhY2hlKCk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9hMTF5VXBkYXRlU29ydGVycygpOwoKICAgICAgICB0aGlzLl9wcmV2aW91c1NvcnRlcnMgPSB0aGlzLl9tYXBTb3J0ZXJzKCk7CiAgICAgIH0KCiAgICAgIF9tYXBTb3J0ZXJzKCkgewogICAgICAgIHJldHVybiB0aGlzLl9zb3J0ZXJzLm1hcChzb3J0ZXIgPT4gewogICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgcGF0aDogc29ydGVyLnBhdGgsCiAgICAgICAgICAgIGRpcmVjdGlvbjogc29ydGVyLmRpcmVjdGlvbgogICAgICAgICAgfTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgX3JlbW92ZUFycmF5SXRlbShhcnJheSwgaXRlbSkgewogICAgICAgIGNvbnN0IGluZGV4ID0gYXJyYXkuaW5kZXhPZihpdGVtKTsKICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgYXJyYXkuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE4IFZhYWRpbiBMdGQuCiAgICBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAqLwogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IFN0eWxpbmdNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgU3R5bGluZ01peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGFsbG93cyBnZW5lcmF0aW5nIENTUyBjbGFzcyBuYW1lcyBmb3IgZ3JpZCBjZWxscwogICAgICAgICAgICogYmFzZWQgb24gdGhlaXIgcm93IGFuZCBjb2x1bW4uIFRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIHRoZSBnZW5lcmF0ZWQKICAgICAgICAgICAqIGNsYXNzIG5hbWUgYXMgYSBzdHJpbmcsIG9yIG11bHRpcGxlIGNsYXNzIG5hbWVzIHNlcGFyYXRlZCBieSB3aGl0ZXNwYWNlCiAgICAgICAgICAgKiBjaGFyYWN0ZXJzLgogICAgICAgICAgICoKICAgICAgICAgICAqIFJlY2VpdmVzIHR3byBhcmd1bWVudHM6CiAgICAgICAgICAgKiAtIGBjb2x1bW5gIFRoZSBgPHZhYWRpbi1ncmlkLWNvbHVtbj5gIGVsZW1lbnQgKGB1bmRlZmluZWRgIGZvciBkZXRhaWxzLWNlbGwpLgogICAgICAgICAgICogLSBgcm93RGF0YWAgVGhlIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgd2l0aAogICAgICAgICAgICogICB0aGUgcmVuZGVyZWQgaXRlbSwgY29udGFpbnM6CiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuaW5kZXhgIFRoZSBpbmRleCBvZiB0aGUgaXRlbS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5pdGVtYCBUaGUgaXRlbS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5leHBhbmRlZGAgU3VibGV2ZWwgdG9nZ2xlIHN0YXRlLgogICAgICAgICAgICogICAtIGByb3dEYXRhLmxldmVsYCBMZXZlbCBvZiB0aGUgdHJlZSByZXByZXNlbnRlZCB3aXRoIGEgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHRvZ2dsZSBidXR0b24uCiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuc2VsZWN0ZWRgIFNlbGVjdGVkIHN0YXRlLgogICAgICAgICAgICovCiAgICAgICAgICBjZWxsQ2xhc3NOYW1lR2VuZXJhdG9yOiBGdW5jdGlvbgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX19jZWxsQ2xhc3NOYW1lR2VuZXJhdG9yQ2hhbmdlZChjZWxsQ2xhc3NOYW1lR2VuZXJhdG9yKScKICAgICAgICBdOwogICAgICB9CgogICAgICBfX2NlbGxDbGFzc05hbWVHZW5lcmF0b3JDaGFuZ2VkKGNlbGxDbGFzc0dlbmVyYXRvcikgewogICAgICAgIHRoaXMuZ2VuZXJhdGVDZWxsQ2xhc3NOYW1lcygpOwogICAgICB9CgogICAgICAvKioKICAgICAgICogUnVucyB0aGUgYGNlbGxDbGFzc05hbWVHZW5lcmF0b3JgIGZvciB0aGUgdmlzaWJsZSBjZWxscy4KICAgICAgICogSWYgdGhlIGdlbmVyYXRvciBkZXBlbmRzIG9uIHZhcnlpbmcgY29uZGl0aW9ucywgeW91IG5lZWQgdG8KICAgICAgICogY2FsbCB0aGlzIGZ1bmN0aW9uIG1hbnVhbGx5IGluIG9yZGVyIHRvIHVwZGF0ZSB0aGUgc3R5bGVzIHdoZW4KICAgICAgICogdGhlIGNvbmRpdGlvbnMgY2hhbmdlLgogICAgICAgKi8KICAgICAgZ2VuZXJhdGVDZWxsQ2xhc3NOYW1lcygpIHsKICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKHJvdyA9PiAhcm93LmhpZGRlbikuZm9yRWFjaCgKICAgICAgICAgIHJvdyA9PiB0aGlzLl9nZW5lcmF0ZUNlbGxDbGFzc05hbWVzKHJvdywgdGhpcy5fX2dldFJvd01vZGVsKHJvdykpKTsKICAgICAgfQoKICAgICAgX2dlbmVyYXRlQ2VsbENsYXNzTmFtZXMocm93LCByb3dEYXRhKSB7CiAgICAgICAgQXJyYXkuZnJvbShyb3cuY2hpbGRyZW4pLmZvckVhY2goY2VsbCA9PiB7CiAgICAgICAgICBpZiAoY2VsbC5fX2dlbmVyYXRlZENsYXNzZXMpIHsKICAgICAgICAgICAgY2VsbC5fX2dlbmVyYXRlZENsYXNzZXMuZm9yRWFjaChjbGFzc05hbWUgPT4gY2VsbC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSkpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKHRoaXMuY2VsbENsYXNzTmFtZUdlbmVyYXRvcikgewogICAgICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmNlbGxDbGFzc05hbWVHZW5lcmF0b3IoY2VsbC5fY29sdW1uLCByb3dEYXRhKTsKICAgICAgICAgICAgY2VsbC5fX2dlbmVyYXRlZENsYXNzZXMgPSByZXN1bHQgJiYgcmVzdWx0LnNwbGl0KCcgJykuZmlsdGVyKGNsYXNzTmFtZSA9PiBjbGFzc05hbWUubGVuZ3RoID4gMCk7CiAgICAgICAgICAgIGlmIChjZWxsLl9fZ2VuZXJhdGVkQ2xhc3NlcykgewogICAgICAgICAgICAgIGNlbGwuX19nZW5lcmF0ZWRDbGFzc2VzLmZvckVhY2goY2xhc3NOYW1lID0+IGNlbGwuY2xhc3NMaXN0LmFkZChjbGFzc05hbWUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxOSBWYWFkaW4gTHRkLgogICAgVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgKi8KICAgIGNvbnN0IERyb3BNb2RlID0gewogICAgICBCRVRXRUVOOiAnYmV0d2VlbicsCiAgICAgIE9OX1RPUDogJ29uLXRvcCcsCiAgICAgIE9OX1RPUF9PUl9CRVRXRUVOOiAnb24tdG9wLW9yLWJldHdlZW4nLAogICAgICBPTl9HUklEOiAnb24tZ3JpZCcKICAgIH07CgogICAgY29uc3QgRHJvcExvY2F0aW9uID0gewogICAgICBPTl9UT1A6ICdvbi10b3AnLAogICAgICBBQk9WRTogJ2Fib3ZlJywKICAgICAgQkVMT1c6ICdiZWxvdycsCiAgICAgIEVNUFRZOiAnZW1wdHknCiAgICB9OwoKICAgIC8qKgogICAgICogQHBvbHltZXJNaXhpbgogICAgICovCiAgICBjb25zdCBEcmFnQW5kRHJvcE1peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBEcmFnQW5kRHJvcE1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogRGVmaW5lcyB0aGUgbG9jYXRpb25zIHdpdGhpbiB0aGUgR3JpZCByb3cgd2hlcmUgYW4gZWxlbWVudCBjYW4gYmUgZHJvcHBlZC4KICAgICAgICAgICAqCiAgICAgICAgICAgKiBQb3NzaWJsZSB2YWx1ZXMgYXJlOgogICAgICAgICAgICogLSBgYmV0d2VlbmA6IFRoZSBkcm9wIGV2ZW50IGNhbiBoYXBwZW4gYmV0d2VlbiBHcmlkIHJvd3MuCiAgICAgICAgICAgKiAtIGBvbi10b3BgOiBUaGUgZHJvcCBldmVudCBjYW4gaGFwcGVuIG9uIHRvcCBvZiBHcmlkIHJvd3MuCiAgICAgICAgICAgKiAtIGBvbi10b3Atb3ItYmV0d2VlbmA6IFRoZSBkcm9wIGV2ZW50IGNhbiBoYXBwZW4gZWl0aGVyIG9uIHRvcCBvZiBvciBiZXR3ZWVuIEdyaWQgcm93cy4KICAgICAgICAgICAqIC0gYG9uLWdyaWRgOiBUaGUgZHJvcCBldmVudCB3aWxsIG5vdCBoYXBwZW4gb24gYW55IHNwZWNpZmljIHJvdywgaXQgd2lsbCBzaG93IHRoZSBkcm9wIHRhcmdldCBvdXRsaW5lIGFyb3VuZCB0aGUgd2hvbGUgZ3JpZC4KICAgICAgICAgICAqLwogICAgICAgICAgZHJvcE1vZGU6IFN0cmluZywKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIE1hcmtzIHRoZSBncmlkJ3Mgcm93cyB0byBiZSBhdmFpbGFibGUgZm9yIGRyYWdnaW5nLgogICAgICAgICAgICovCiAgICAgICAgICByb3dzRHJhZ2dhYmxlOiBCb29sZWFuLAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGZpbHRlcnMgZHJhZ2dpbmcgb2Ygc3BlY2lmaWMgZ3JpZCByb3dzLiBUaGUgcmV0dXJuIHZhbHVlIHNob3VsZCBiZSBmYWxzZQogICAgICAgICAgICogaWYgZHJhZ2dpbmcgb2YgdGhlIHJvdyBzaG91bGQgYmUgZGlzYWJsZWQuCiAgICAgICAgICAgKgogICAgICAgICAgICogUmVjZWl2ZXMgb25lIGFyZ3VtZW50OgogICAgICAgICAgICogLSBgcm93RGF0YWAgVGhlIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgd2l0aAogICAgICAgICAgICogICB0aGUgcmVuZGVyZWQgaXRlbSwgY29udGFpbnM6CiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuaW5kZXhgIFRoZSBpbmRleCBvZiB0aGUgaXRlbS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5pdGVtYCBUaGUgaXRlbS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5leHBhbmRlZGAgU3VibGV2ZWwgdG9nZ2xlIHN0YXRlLgogICAgICAgICAgICogICAtIGByb3dEYXRhLmxldmVsYCBMZXZlbCBvZiB0aGUgdHJlZSByZXByZXNlbnRlZCB3aXRoIGEgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHRvZ2dsZSBidXR0b24uCiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuc2VsZWN0ZWRgIFNlbGVjdGVkIHN0YXRlLgogICAgICAgICAgICovCiAgICAgICAgICBkcmFnRmlsdGVyOiBGdW5jdGlvbiwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEEgZnVuY3Rpb24gdGhhdCBmaWx0ZXJzIGRyb3BwaW5nIG9uIHNwZWNpZmljIGdyaWQgcm93cy4gVGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgZmFsc2UKICAgICAgICAgICAqIGlmIGRyb3BwaW5nIG9uIHRoZSByb3cgc2hvdWxkIGJlIGRpc2FibGVkLgogICAgICAgICAgICoKICAgICAgICAgICAqIFJlY2VpdmVzIG9uZSBhcmd1bWVudDoKICAgICAgICAgICAqIC0gYHJvd0RhdGFgIFRoZSBvYmplY3Qgd2l0aCB0aGUgcHJvcGVydGllcyByZWxhdGVkIHdpdGgKICAgICAgICAgICAqICAgdGhlIHJlbmRlcmVkIGl0ZW0sIGNvbnRhaW5zOgogICAgICAgICAgICogICAtIGByb3dEYXRhLmluZGV4YCBUaGUgaW5kZXggb2YgdGhlIGl0ZW0uCiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuaXRlbWAgVGhlIGl0ZW0uCiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuZXhwYW5kZWRgIFN1YmxldmVsIHRvZ2dsZSBzdGF0ZS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5sZXZlbGAgTGV2ZWwgb2YgdGhlIHRyZWUgcmVwcmVzZW50ZWQgd2l0aCBhIGhvcml6b250YWwgb2Zmc2V0IG9mIHRoZSB0b2dnbGUgYnV0dG9uLgogICAgICAgICAgICogICAtIGByb3dEYXRhLnNlbGVjdGVkYCBTZWxlY3RlZCBzdGF0ZS4KICAgICAgICAgICAqLwogICAgICAgICAgZHJvcEZpbHRlcjogRnVuY3Rpb24sCgogICAgICAgICAgX19kbmRBdXRvU2Nyb2xsVGhyZXNob2xkOiB7CiAgICAgICAgICAgIHZhbHVlOiA1MAogICAgICAgICAgfQoKICAgICAgICB9OwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IG9ic2VydmVycygpIHsKICAgICAgICByZXR1cm4gWwogICAgICAgICAgJ19kcmFnRHJvcEFjY2Vzc0NoYW5nZWQocm93c0RyYWdnYWJsZSwgZHJvcE1vZGUsIGRyYWdGaWx0ZXIsIGRyb3BGaWx0ZXIpJwogICAgICAgIF07CiAgICAgIH0KCiAgICAgIHJlYWR5KCkgewogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdzdGFydCcsIHRoaXMuX29uRHJhZ1N0YXJ0LmJpbmQodGhpcykpOwogICAgICAgIHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW5kJywgdGhpcy5fb25EcmFnRW5kLmJpbmQodGhpcykpOwogICAgICAgIHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnb3ZlcicsIHRoaXMuX29uRHJhZ092ZXIuYmluZCh0aGlzKSk7CiAgICAgICAgdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2RyYWdsZWF2ZScsIHRoaXMuX29uRHJhZ0xlYXZlLmJpbmQodGhpcykpOwogICAgICAgIHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcm9wJywgdGhpcy5fb25Ecm9wLmJpbmQodGhpcykpOwogICAgICAgIHRoaXMuJC50YWJsZS5hZGRFdmVudExpc3RlbmVyKCdkcmFnZW50ZXInLCBlID0+IHsKICAgICAgICAgIGlmICh0aGlzLmRyb3BNb2RlKSB7CiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgIH0KCiAgICAgIF9vbkRyYWdTdGFydChlKSB7CiAgICAgICAgaWYgKHRoaXMucm93c0RyYWdnYWJsZSkgewogICAgICAgICAgbGV0IHJvdyA9IGUudGFyZ2V0OwogICAgICAgICAgaWYgKHJvdy5sb2NhbE5hbWUgPT09ICd2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQnKSB7CiAgICAgICAgICAgIC8vIFRoZSBkcmFnZ2FibGUgbm9kZSBpcyB0aGUgY2VsbCBjb250ZW50IGVsZW1lbnQgb24gYnJvd3NlcnMgdGhhdCBzdXBwb3J0IG5hdGl2ZSBzaGFkb3cKICAgICAgICAgICAgcm93ID0gcm93LmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlLnBhcmVudE5vZGU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAocm93LnBhcmVudE5vZGUgIT09IHRoaXMuJC5pdGVtcykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnZHJhZ2dpbmctcm93cycsIHRydWUsIHRoaXMpOwoKICAgICAgICAgIGlmICh0aGlzLl9zYWZhcmkpIHsKICAgICAgICAgICAgLy8gU2FmYXJpIGRvZXNuJ3QgZ2V0IHByb3BlciBkcmFnIGltYWdlcyBmcm9tIHRyYW5zZm9ybWVkCiAgICAgICAgICAgIC8vIGVsZW1lbnRzIHNvIHdlIG5lZWQgdG8gc3dpdGNoIHRvIHRvcCB0ZW1wb3JhcmlseQogICAgICAgICAgICBjb25zdCB0cmFuc2Zvcm0gPSByb3cuc3R5bGUudHJhbnNmb3JtOwogICAgICAgICAgICByb3cuc3R5bGUudG9wID0gL3RyYW5zbGF0ZVlcKCguKilcKS8uZXhlYyh0cmFuc2Zvcm0pWzFdOwogICAgICAgICAgICByb3cuc3R5bGUudHJhbnNmb3JtID0gJ25vbmUnOwogICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4gewogICAgICAgICAgICAgIHJvdy5zdHlsZS50b3AgPSAnJzsKICAgICAgICAgICAgICByb3cuc3R5bGUudHJhbnNmb3JtID0gdHJhbnNmb3JtOwogICAgICAgICAgICB9KTsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCByb3dSZWN0ID0gcm93LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgaWYgKCF3aW5kb3cuU2hhZHlET00pIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lvcykgewogICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShyb3cpOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIGUuZGF0YVRyYW5zZmVyLnNldERyYWdJbWFnZShyb3csIGUuY2xpZW50WCAtIHJvd1JlY3QubGVmdCwgZS5jbGllbnRZIC0gcm93UmVjdC50b3ApOwogICAgICAgICAgICB9CgogICAgICAgICAgfQoKICAgICAgICAgIGxldCByb3dzID0gW3Jvd107CiAgICAgICAgICBpZiAodGhpcy5faXNTZWxlY3RlZChyb3cuX2l0ZW0pKSB7CiAgICAgICAgICAgIHJvd3MgPSB0aGlzLl9fZ2V0Vmlld3BvcnRSb3dzKCkKICAgICAgICAgICAgICAuZmlsdGVyKHJvdyA9PiB0aGlzLl9pc1NlbGVjdGVkKHJvdy5faXRlbSkpCiAgICAgICAgICAgICAgLmZpbHRlcihyb3cgPT4gIXRoaXMuZHJhZ0ZpbHRlciB8fCB0aGlzLmRyYWdGaWx0ZXIodGhpcy5fX2dldFJvd01vZGVsKHJvdykpKTsKICAgICAgICAgIH0KCiAgICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgdHJhbnNmZXIgZGF0YQogICAgICAgICAgZS5kYXRhVHJhbnNmZXIuc2V0RGF0YSgndGV4dCcsIHRoaXMuX19mb3JtYXREZWZhdWx0VHJhbnNmZXJEYXRhKHJvd3MpKTsKCiAgICAgICAgICByb3cuc2V0QXR0cmlidXRlKCdkcmFnc3RhcnQnLCByb3dzLmxlbmd0aCA+IDEgPyByb3dzLmxlbmd0aCA6ICcnKTsKICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHsKICAgICAgICAgICAgJy0tX2dyaWQtZHJhZy1zdGFydC14JzogYCR7ZS5jbGllbnRYIC0gcm93UmVjdC5sZWZ0ICsgMjB9cHhgLAogICAgICAgICAgICAnLS1fZ3JpZC1kcmFnLXN0YXJ0LXknOiBgJHtlLmNsaWVudFkgLSByb3dSZWN0LnRvcCArIDEwfXB4YAogICAgICAgICAgfSk7CgogICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgICAgcm93LnJlbW92ZUF0dHJpYnV0ZSgnZHJhZ3N0YXJ0Jyk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKHsnLS1fZ3JpZC1kcmFnLXN0YXJ0LXgnOiAnJywgJy0tX2dyaWQtZHJhZy1zdGFydC15JzogJyd9KTsKICAgICAgICAgIH0pOwoKICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdncmlkLWRyYWdzdGFydCcsIHsKICAgICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgICAgZHJhZ2dlZEl0ZW1zOiByb3dzLm1hcChyb3cgPT4gcm93Ll9pdGVtKSwKICAgICAgICAgICAgICBzZXREcmFnRGF0YTogKHR5cGUsIGRhdGEpID0+IGUuZGF0YVRyYW5zZmVyLnNldERhdGEodHlwZSwgZGF0YSksCiAgICAgICAgICAgICAgc2V0RHJhZ2dlZEl0ZW1zQ291bnQ6IGNvdW50ID0+IHJvdy5zZXRBdHRyaWJ1dGUoJ2RyYWdzdGFydCcsIGNvdW50KQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQgPSBlOwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9vbkRyYWdFbmQoZSkgewogICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnZHJhZ2dpbmctcm93cycsIGZhbHNlLCB0aGlzKTsKICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdncmlkLWRyYWdlbmQnKTsKICAgICAgICBldmVudC5vcmlnaW5hbEV2ZW50ID0gZTsKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgICB9CgogICAgICBfb25EcmFnTGVhdmUoZSkgewogICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fY2xlYXJEcmFnU3R5bGVzKCk7CiAgICAgIH0KCiAgICAgIF9vbkRyYWdPdmVyKGUpIHsKCiAgICAgICAgaWYgKHRoaXMuZHJvcE1vZGUpIHsKICAgICAgICAgIHRoaXMuX2Ryb3BMb2NhdGlvbiA9IHVuZGVmaW5lZDsKICAgICAgICAgIHRoaXMuX2RyYWdPdmVySXRlbSA9IHVuZGVmaW5lZDsKCiAgICAgICAgICBpZiAodGhpcy5fX2RuZEF1dG9TY3JvbGwoZS5jbGllbnRZKSkgewogICAgICAgICAgICB0aGlzLl9jbGVhckRyYWdTdHlsZXMoKTsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgfQoKICAgICAgICAgIGxldCByb3cgPSBlLmNvbXBvc2VkUGF0aCgpLmZpbHRlcihub2RlID0+IG5vZGUubG9jYWxOYW1lID09PSAndHInKVswXTsKCiAgICAgICAgICBpZiAoIXRoaXMuX2VmZmVjdGl2ZVNpemUgfHwgdGhpcy5kcm9wTW9kZSA9PT0gRHJvcE1vZGUuT05fR1JJRCkgewogICAgICAgICAgICAvLyBUaGUgZ3JpZCBpcyBlbXB0eSBvciAib24tZ3JpZCIgZHJvcCBtb2RlIHdhcyB1c2VkLCBhbHdheXMgZGVmYXVsdCB0byAiZW1wdHkiCiAgICAgICAgICAgIHRoaXMuX2Ryb3BMb2NhdGlvbiA9IERyb3BMb2NhdGlvbi5FTVBUWTsKICAgICAgICAgIH0gZWxzZSBpZiAoIXJvdyB8fCByb3cucGFyZW50Tm9kZSAhPT0gdGhpcy4kLml0ZW1zKSB7CiAgICAgICAgICAgIC8vIFRoZSBkcmFnb3ZlciBkaWRuJ3Qgb2NjdXIgb24gYSBib2R5IHJvdyBidXQgdGhlIGdyaWQgaGFzIGl0ZW1zCiAgICAgICAgICAgIGlmIChyb3cpIHsKICAgICAgICAgICAgICAvLyBUaGUgZHJhZ292ZXIgb2NjdXJyZWQgb3ZlciBhIGhlYWRlci9mb290ZXIgcm93CiAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJvcE1vZGUgPT09IERyb3BNb2RlLkJFVFdFRU4gfHwgdGhpcy5kcm9wTW9kZSA9PT0gRHJvcE1vZGUuT05fVE9QX09SX0JFVFdFRU4pIHsKICAgICAgICAgICAgICAvLyBUaGUgZHJvcCBtb2RlIGFsbG93cyBzZXR0aW5nIHRoZSBsYXN0IHJvdyBhcyB0aGUgZHJhZyBvdmVyIGl0ZW0KICAgICAgICAgICAgICByb3cgPSBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZmlsdGVyKHJvdyA9PiAhcm93LmhpZGRlbikucG9wKCk7CiAgICAgICAgICAgICAgdGhpcy5fZHJvcExvY2F0aW9uID0gRHJvcExvY2F0aW9uLkJFTE9XOwogICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgIC8vIERyb3AgbW9kZSBvbi10b3AgdXNlZCBidXQgdGhlIGRyYWdvdmVyIGRpZG4ndCBvY2N1ciBvdmVyIG9uZSBvZiB0aGUgZXhpc3Rpbmcgcm93cwogICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gVGhlIGRyYWdvdmVyIG9jY3VycmVkIG9uIGEgYm9keSByb3csIGRldGVybWluZSB0aGUgZHJvcCBsb2NhdGlvbiBmcm9tIGNvb3JkaW5hdGVzCiAgICAgICAgICAgIGNvbnN0IHJvd1JlY3QgPSByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CgogICAgICAgICAgICB0aGlzLl9kcm9wTG9jYXRpb24gPSBEcm9wTG9jYXRpb24uT05fVE9QOwoKICAgICAgICAgICAgaWYgKHRoaXMuZHJvcE1vZGUgPT09IERyb3BNb2RlLkJFVFdFRU4pIHsKICAgICAgICAgICAgICBjb25zdCBkcm9wQWJvdmUgPSBlLmNsaWVudFkgLSByb3dSZWN0LnRvcCA8IHJvd1JlY3QuYm90dG9tIC0gZS5jbGllbnRZOwogICAgICAgICAgICAgIHRoaXMuX2Ryb3BMb2NhdGlvbiA9IGRyb3BBYm92ZSA/IERyb3BMb2NhdGlvbi5BQk9WRSA6IERyb3BMb2NhdGlvbi5CRUxPVzsKCiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcm9wTW9kZSA9PT0gRHJvcE1vZGUuT05fVE9QX09SX0JFVFdFRU4pIHsKICAgICAgICAgICAgICBpZiAoZS5jbGllbnRZIC0gcm93UmVjdC50b3AgPCByb3dSZWN0LmhlaWdodCAvIDMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Ryb3BMb2NhdGlvbiA9IERyb3BMb2NhdGlvbi5BQk9WRTsKICAgICAgICAgICAgICB9IGVsc2UgaWYgKGUuY2xpZW50WSAtIHJvd1JlY3QudG9wID4gKHJvd1JlY3QuaGVpZ2h0IC8gMykgKiAyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kcm9wTG9jYXRpb24gPSBEcm9wTG9jYXRpb24uQkVMT1c7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHJvdyAmJiByb3cuaGFzQXR0cmlidXRlKCdkcm9wLWRpc2FibGVkJykpIHsKICAgICAgICAgICAgdGhpcy5fZHJvcExvY2F0aW9uID0gdW5kZWZpbmVkOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKCiAgICAgICAgICBpZiAodGhpcy5fZHJvcExvY2F0aW9uID09PSBEcm9wTG9jYXRpb24uRU1QVFkpIHsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdkcmFnb3ZlcicsIHRydWUsIHRoaXMpOwogICAgICAgICAgfSBlbHNlIGlmIChyb3cpIHsKICAgICAgICAgICAgdGhpcy5fZHJhZ092ZXJJdGVtID0gcm93Ll9pdGVtOwogICAgICAgICAgICBpZiAocm93LmdldEF0dHJpYnV0ZSgnZHJhZ292ZXInKSAhPT0gdGhpcy5fZHJvcExvY2F0aW9uKSB7CiAgICAgICAgICAgICAgcm93LnNldEF0dHJpYnV0ZSgnZHJhZ292ZXInLCB0aGlzLl9kcm9wTG9jYXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLl9jbGVhckRyYWdTdHlsZXMoKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fZG5kQXV0b1Njcm9sbChjbGllbnRZKSB7CiAgICAgICAgaWYgKHRoaXMuX19kbmRBdXRvU2Nyb2xsaW5nKSB7CiAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGhlYWRlckJvdHRvbSA9IHRoaXMuJC5oZWFkZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkuYm90dG9tOwogICAgICAgIGNvbnN0IGZvb3RlclRvcCA9IHRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwogICAgICAgIGNvbnN0IHRvcERpZmYgPSBoZWFkZXJCb3R0b20gLSBjbGllbnRZICsgdGhpcy5fX2RuZEF1dG9TY3JvbGxUaHJlc2hvbGQ7CiAgICAgICAgY29uc3QgYm90dG9tRGlmZiA9IGNsaWVudFkgLSBmb290ZXJUb3AgKyB0aGlzLl9fZG5kQXV0b1Njcm9sbFRocmVzaG9sZDsKICAgICAgICBsZXQgc2Nyb2xsVG9wRGVsdGEgPSAwOwoKICAgICAgICBpZiAoYm90dG9tRGlmZiA+IDApIHsKICAgICAgICAgIHNjcm9sbFRvcERlbHRhID0gYm90dG9tRGlmZiAqIDI7CiAgICAgICAgfSBlbHNlIGlmICh0b3BEaWZmID4gMCkgewogICAgICAgICAgc2Nyb2xsVG9wRGVsdGEgPSAtdG9wRGlmZiAqIDI7CiAgICAgICAgfQoKICAgICAgICBpZiAoc2Nyb2xsVG9wRGVsdGEpIHsKICAgICAgICAgIGNvbnN0IHNjcm9sbFRvcCA9IHRoaXMuJC50YWJsZS5zY3JvbGxUb3A7CiAgICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsVG9wICs9IHNjcm9sbFRvcERlbHRhOwogICAgICAgICAgY29uc3Qgc2Nyb2xsVG9wQ2hhbmdlZCA9IHNjcm9sbFRvcCAhPT0gdGhpcy4kLnRhYmxlLnNjcm9sbFRvcDsKICAgICAgICAgIGlmIChzY3JvbGxUb3BDaGFuZ2VkKSB7CiAgICAgICAgICAgIHRoaXMuX19kbmRBdXRvU2Nyb2xsaW5nID0gdHJ1ZTsKICAgICAgICAgICAgLy8gRGlzYWxsb3cgbW9yZSBhdXRvLXNjcm9sbHMgd2l0aGluIDIwbXMKICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB0aGlzLl9fZG5kQXV0b1Njcm9sbGluZyA9IGZhbHNlLCAyMCk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIoKTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX2dldFZpZXdwb3J0Um93cygpIHsKICAgICAgICBjb25zdCBoZWFkZXJCb3R0b20gPSB0aGlzLiQuaGVhZGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbTsKICAgICAgICBjb25zdCBmb290ZXJUb3AgPSB0aGlzLiQuZm9vdGVyLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pCiAgICAgICAgICAuZmlsdGVyKHJvdyA9PiB7CiAgICAgICAgICAgIGNvbnN0IHJvd1JlY3QgPSByb3cuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIHJldHVybiByb3dSZWN0LmJvdHRvbSA+IGhlYWRlckJvdHRvbSAmJiByb3dSZWN0LnRvcCA8IGZvb3RlclRvcDsKICAgICAgICAgIH0pOwogICAgICB9CgogICAgICBfY2xlYXJEcmFnU3R5bGVzKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKCdkcmFnb3ZlcicpOwogICAgICAgIEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5mb3JFYWNoKHJvdyA9PiByb3cucmVtb3ZlQXR0cmlidXRlKCdkcmFnb3ZlcicpKTsKICAgICAgfQoKICAgICAgX29uRHJvcChlKSB7CiAgICAgICAgaWYgKHRoaXMuZHJvcE1vZGUpIHsKICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgICAgY29uc3QgZHJhZ0RhdGEgPSBlLmRhdGFUcmFuc2Zlci50eXBlcyAmJiBBcnJheS5mcm9tKGUuZGF0YVRyYW5zZmVyLnR5cGVzKS5tYXAodHlwZSA9PiB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgdHlwZSwKICAgICAgICAgICAgICBkYXRhOiBlLmRhdGFUcmFuc2Zlci5nZXREYXRhKHR5cGUpCiAgICAgICAgICAgIH07CiAgICAgICAgICB9KTsKCiAgICAgICAgICB0aGlzLl9jbGVhckRyYWdTdHlsZXMoKTsKCiAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBDdXN0b21FdmVudCgnZ3JpZC1kcm9wJywgewogICAgICAgICAgICBidWJibGVzOiBlLmJ1YmJsZXMsCiAgICAgICAgICAgIGNhbmNlbGFibGU6IGUuY2FuY2VsYWJsZSwKICAgICAgICAgICAgZGV0YWlsOiB7CiAgICAgICAgICAgICAgZHJvcFRhcmdldEl0ZW06IHRoaXMuX2RyYWdPdmVySXRlbSwKICAgICAgICAgICAgICBkcm9wTG9jYXRpb246IHRoaXMuX2Ryb3BMb2NhdGlvbiwKICAgICAgICAgICAgICBkcmFnRGF0YQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICAgIGV2ZW50Lm9yaWdpbmFsRXZlbnQgPSBlOwogICAgICAgICAgdGhpcy5kaXNwYXRjaEV2ZW50KGV2ZW50KTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9fZm9ybWF0RGVmYXVsdFRyYW5zZmVyRGF0YShyb3dzKSB7CiAgICAgICAgcmV0dXJuIHJvd3MKICAgICAgICAgIC5tYXAocm93ID0+IHsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocm93LmNoaWxkcmVuKQogICAgICAgICAgICAgIC5maWx0ZXIoY2VsbCA9PiAhY2VsbC5oaWRkZW4gJiYgY2VsbC5nZXRBdHRyaWJ1dGUoJ3BhcnQnKS5pbmRleE9mKCdkZXRhaWxzLWNlbGwnKSA9PT0gLTEpCiAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBhLl9jb2x1bW4uX29yZGVyID4gYi5fY29sdW1uLl9vcmRlciA/IDEgOiAtMTsKICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgIC5tYXAoY2VsbCA9PiBjZWxsLl9jb250ZW50LnRleHRDb250ZW50LnRyaW0oKSkKICAgICAgICAgICAgICAuZmlsdGVyKGNvbnRlbnQgPT4gY29udGVudCkKICAgICAgICAgICAgICAuam9pbignXHQnKTsKICAgICAgICAgIH0pCiAgICAgICAgICAuam9pbignXG4nKTsKICAgICAgfQoKICAgICAgX2RyYWdEcm9wQWNjZXNzQ2hhbmdlZChyb3dzRHJhZ2dhYmxlLCBkcm9wTW9kZSwgZHJhZ0ZpbHRlciwgZHJvcEZpbHRlcikgewogICAgICAgIHRoaXMuZmlsdGVyRHJhZ0FuZERyb3AoKTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIFJ1bnMgdGhlIGBkcmFnRmlsdGVyYCBhbmQgYGRyb3BGaWx0ZXJgIGhvb2tzIGZvciB0aGUgdmlzaWJsZSBjZWxscy4KICAgICAgICogSWYgdGhlIGZpbHRlciBkZXBlbmRzIG9uIHZhcnlpbmcgY29uZGl0aW9ucywgeW91IG1heSBuZWVkIHRvCiAgICAgICAqIGNhbGwgdGhpcyBmdW5jdGlvbiBtYW51YWxseSBpbiBvcmRlciB0byB1cGRhdGUgdGhlIGRyYWdnYWJpbGl0eSB3aGVuCiAgICAgICAqIHRoZSBjb25kaXRpb25zIGNoYW5nZS4KICAgICAgICovCiAgICAgIGZpbHRlckRyYWdBbmREcm9wKCkgewogICAgICAgIEFycmF5LmZyb20odGhpcy4kLml0ZW1zLmNoaWxkcmVuKS5maWx0ZXIocm93ID0+ICFyb3cuaGlkZGVuKS5mb3JFYWNoKAogICAgICAgICAgcm93ID0+IHsKICAgICAgICAgICAgdGhpcy5fZmlsdGVyRHJhZ0FuZERyb3Aocm93LCB0aGlzLl9fZ2V0Um93TW9kZWwocm93KSk7CiAgICAgICAgICB9CiAgICAgICAgKTsKICAgICAgfQoKICAgICAgX2ZpbHRlckRyYWdBbmREcm9wKHJvdywgcm93RGF0YSkgewogICAgICAgIGNvbnN0IGRyYWdEaXNhYmxlZCA9ICF0aGlzLnJvd3NEcmFnZ2FibGUgfHwgKHRoaXMuZHJhZ0ZpbHRlciAmJiAhdGhpcy5kcmFnRmlsdGVyKHJvd0RhdGEpKTsKICAgICAgICBjb25zdCBkcm9wRGlzYWJsZWQgPSAhdGhpcy5kcm9wTW9kZSB8fCAodGhpcy5kcm9wRmlsdGVyICYmICF0aGlzLmRyb3BGaWx0ZXIocm93RGF0YSkpOwoKICAgICAgICBjb25zdCBkcmFnZ2FibGVFbGVtZW50cyA9IHdpbmRvdy5TaGFkeURPTQogICAgICAgICAgPyBbcm93XQogICAgICAgICAgOiBBcnJheS5mcm9tKHJvdy5jaGlsZHJlbikubWFwKGNlbGwgPT4gY2VsbC5fY29udGVudCk7CgogICAgICAgIGRyYWdnYWJsZUVsZW1lbnRzLmZvckVhY2goZSA9PiB7CiAgICAgICAgICBpZiAoZHJhZ0Rpc2FibGVkKSB7CiAgICAgICAgICAgIGUucmVtb3ZlQXR0cmlidXRlKCdkcmFnZ2FibGUnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGUuc2V0QXR0cmlidXRlKCdkcmFnZ2FibGUnLCB0cnVlKTsKICAgICAgICAgIH0KICAgICAgICB9KTsKCiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdkcmFnLWRpc2FibGVkJywgZHJhZ0Rpc2FibGVkLCByb3cpOwogICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnZHJvcC1kaXNhYmxlZCcsIGRyb3BEaXNhYmxlZCwgcm93KTsKICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gc3RhcnRpbmcgdG8gZHJhZyBncmlkIHJvd3MuCiAgICAgICAqCiAgICAgICAqIEBldmVudCBncmlkLWRyYWdzdGFydAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gb3JpZ2luYWxFdmVudCBUaGUgbmF0aXZlIGRyYWdzdGFydCBldmVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0YWlsCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRhaWwuZHJhZ2dlZEl0ZW1zIHRoZSBpdGVtcyBpbiB0aGUgdmlzaWJsZSB2aWV3cG9ydCB0aGF0IGFyZSBkcmFnZ2VkCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRldGFpbC5zZXREcmFnZ2VkSXRlbXNDb3VudCBPdmVycmlkZXMgdGhlIGRlZmF1bHQgbnVtYmVyIHNob3duIGluIHRoZSBkcmFnIGltYWdlIG9uIG11bHRpIHJvdyBkcmFnLgogICAgICAgKiBQYXJhbWV0ZXIgaXMgb2YgdHlwZSBudW1iZXIuCiAgICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGRldGFpbC5zZXREcmFnRGF0YSBTZXRzIGRhdGFUcmFuc2ZlciBkYXRhIGZvciB0aGUgZHJhZyBvcGVyYXRpb24uCiAgICAgICAqIE5vdGUgdGhhdCAidGV4dCIgaXMgdGhlIG9ubHkgZGF0YSB0eXBlIHN1cHBvcnRlZCBieSBhbGwgdGhlIGJyb3dzZXJzIHRoZSBncmlkIGN1cnJlbnRseSBzdXBwb3J0cyAoaW5jbHVkaW5nIElFMTEpLgogICAgICAgKiBUaGUgZnVuY3Rpb24gdGFrZXMgdHdvIHBhcmFtZXRlcnM6CiAgICAgICAqIC0gdHlwZTpzdHJpbmcgVGhlIHR5cGUgb2YgdGhlIGRhdGEKICAgICAgICogLSBkYXRhOnN0cmluZyBUaGUgZGF0YQogICAgICAgKi8KCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuIHRoZSBkcmFnZ2luZyBvZiB0aGUgcm93cyBlbmRzLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZ3JpZC1kcmFnZW5kCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IFRoZSBuYXRpdmUgZHJhZ2VuZCBldmVudAogICAgICAgKi8KCiAgICAgIC8qKgogICAgICAgKiBGaXJlZCB3aGVuIGEgZHJvcCBvY2N1cnMgb24gdG9wIG9mIHRoZSBncmlkLgogICAgICAgKgogICAgICAgKiBAZXZlbnQgZ3JpZC1kcm9wCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBvcmlnaW5hbEV2ZW50IFRoZSBuYXRpdmUgZHJvcCBldmVudAogICAgICAgKiBAcGFyYW0ge09iamVjdH0gZGV0YWlsCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRhaWwuZHJvcFRhcmdldEl0ZW0gVGhlIGl0ZW0gb2YgdGhlIGdyaWQgcm93IG9uIHdoaWNoIHRoZSBkcm9wIG9jY3VycmVkLgogICAgICAgKiBAcGFyYW0ge3N0cmluZ30gZGV0YWlsLmRyb3BMb2NhdGlvbiBUaGUgcG9zaXRpb24gYXQgd2hpY2ggdGhlIGRyb3AgZXZlbnQgdG9vayBwbGFjZSByZWxhdGl2ZSB0byBhIHJvdy4KICAgICAgICogRGVwZW5kaW5nIG9uIHRoZSBkcm9wTW9kZSB2YWx1ZSwgdGhlIGRyb3AgbG9jYXRpb24gY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nCiAgICAgICAqIC0gYG9uLXRvcGA6IHdoZW4gdGhlIGRyb3Agb2NjdXJyZWQgb24gdG9wIG9mIHRoZSByb3cKICAgICAgICogLSBgYWJvdmVgOiB3aGVuIHRoZSBkcm9wIG9jY3VycmVkIGFib3ZlIHRoZSByb3cKICAgICAgICogLSBgYmVsb3dgOiB3aGVuIHRoZSBkcm9wIG9jY3VycmVkIGJlbG93IHRoZSByb3cKICAgICAgICogLSBgZW1wdHlgOiB3aGVuIHRoZSBkcm9wIG9jY3VycmVkIG92ZXIgdGhlIGdyaWQsIG5vdCByZWxhdGl2ZSB0byBhbnkgc3BlY2lmaWMgcm93CiAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBkZXRhaWwuZHJhZ0RhdGEgQW4gYXJyYXkgb2YgaXRlbXMgd2l0aCB0aGUgcGF5bG9hZCBhcyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBhcyB0aGUKICAgICAgICogYGRhdGFgIHByb3BlcnR5IGFuZCB0aGUgdHlwZSBvZiB0aGUgZGF0YSBhcyBgdHlwZWAgcHJvcGVydHkuCiAgICAgICAqLwogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgS2V5Ym9hcmROYXZpZ2F0aW9uTWl4aW4gPSBzdXBlckNsYXNzID0+IGNsYXNzIEtleWJvYXJkTmF2aWdhdGlvbk1peGluIGV4dGVuZHMgc3VwZXJDbGFzcyB7CiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgX2hlYWRlckZvY3VzYWJsZTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX2ZvY3VzYWJsZUNoYW5nZWQnCiAgICAgICAgICB9LAogICAgICAgICAgX2l0ZW1zRm9jdXNhYmxlOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfZm9jdXNhYmxlQ2hhbmdlZCcKICAgICAgICAgIH0sCiAgICAgICAgICBfZm9vdGVyRm9jdXNhYmxlOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfZm9jdXNhYmxlQ2hhbmdlZCcKICAgICAgICAgIH0sCiAgICAgICAgICBfbmF2aWdhdGluZ0lzSGlkZGVuOiBCb29sZWFuLAogICAgICAgICAgX2ZvY3VzZWRJdGVtSW5kZXg6IHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgICAgICB2YWx1ZTogMAogICAgICAgICAgfSwKICAgICAgICAgIF9mb2N1c2VkQ29sdW1uT3JkZXI6IE51bWJlcgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJlYWR5KCkgewogICAgICAgIHN1cGVyLnJlYWR5KCk7CgogICAgICAgIGlmICh0aGlzLl9pb3MgfHwgdGhpcy5fYW5kcm9pZCkgewogICAgICAgICAgLy8gRGlzYWJsZSBrZXlib2FyZCBuYXZpZ2F0aW9uIG9uIG1vYmlsZSBkZXZpY2VzCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9vbktleURvd24pOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigna2V5dXAnLCB0aGlzLl9vbktleVVwKTsKCiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgdGhpcy5fb25Gb2N1c0luKTsKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgdGhpcy5fb25Gb2N1c091dCk7CgogICAgICAgIC8vIFdoZW4gZm9jdXMgZ29lcyBmcm9tIGNlbGwgdG8gYW5vdGhlciBjZWxsLCBmb2N1c2luL2ZvY3Vzb3V0IGV2ZW50cyBkbwogICAgICAgIC8vIG5vdCBlc2NhcGUgdGhlIGdyaWTigJlzIHNoYWRvd1Jvb3QsIHRodXMgbGlzdGVuaW5nIGluc2lkZSB0aGUgc2hhZG93Um9vdC4KICAgICAgICB0aGlzLiQudGFibGUuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNpbicsIHRoaXMuX29uQ2VsbEZvY3VzSW4uYmluZCh0aGlzKSk7CiAgICAgICAgdGhpcy4kLnRhYmxlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3Vzb3V0JywgdGhpcy5fb25DZWxsRm9jdXNPdXQuYmluZCh0aGlzKSk7CgogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgKCkgPT4gewogICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCduYXZpZ2F0aW5nJywgZmFsc2UsIHRoaXMpOwogICAgICAgICAgdGhpcy5faXNNb3VzZWRvd24gPSB0cnVlOwogICAgICAgIH0pOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsICgpID0+IHRoaXMuX2lzTW91c2Vkb3duID0gZmFsc2UpOwogICAgICB9CgogICAgICBfZm9jdXNhYmxlQ2hhbmdlZChmb2N1c2FibGUsIG9sZEZvY3VzYWJsZSkgewogICAgICAgIGlmIChvbGRGb2N1c2FibGUpIHsKICAgICAgICAgIG9sZEZvY3VzYWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJy0xJyk7CiAgICAgICAgfQogICAgICAgIGlmIChmb2N1c2FibGUpIHsKICAgICAgICAgIGZvY3VzYWJsZS5zZXRBdHRyaWJ1dGUoJ3RhYmluZGV4JywgJzAnKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9vbktleURvd24oZSkgewogICAgICAgIC8vIEVuc3VyZSBzdGFuZGFyZCBrZXkgdmFsdWUsIHVuaWZpZWQgYWNyb3NzIGJyb3dzZXJzCiAgICAgICAgbGV0IGtleSA9IGUua2V5OwogICAgICAgIGlmIChrZXkgPT09ICdVcCcgfHwga2V5ID09PSAnRG93bicgfHwga2V5ID09PSAnTGVmdCcgfHwga2V5ID09PSAnUmlnaHQnKSB7CiAgICAgICAgICAvLyBNU0lFICYgRWRnZQogICAgICAgICAga2V5ID0gJ0Fycm93JyArIGtleTsKICAgICAgICB9CiAgICAgICAgaWYgKGtleSA9PT0gJ0VzYycpIHsKICAgICAgICAgIC8vIE1TSUUgJiBFZGdlCiAgICAgICAgICBrZXkgPSAnRXNjYXBlJzsKICAgICAgICB9CiAgICAgICAgaWYgKGtleSA9PT0gJ1NwYWNlYmFyJykgewogICAgICAgICAgLy8gTVNJRQogICAgICAgICAga2V5ID0gJyAnOwogICAgICAgIH0KCiAgICAgICAgbGV0IGtleUdyb3VwOwogICAgICAgIHN3aXRjaCAoa2V5KSB7CiAgICAgICAgICBjYXNlICdBcnJvd1VwJzoKICAgICAgICAgIGNhc2UgJ0Fycm93RG93bic6CiAgICAgICAgICBjYXNlICdBcnJvd0xlZnQnOgogICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICBjYXNlICdQYWdlVXAnOgogICAgICAgICAgY2FzZSAnUGFnZURvd24nOgogICAgICAgICAgY2FzZSAnSG9tZSc6CiAgICAgICAgICBjYXNlICdFbmQnOgogICAgICAgICAgICBrZXlHcm91cCA9ICdOYXZpZ2F0aW9uJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdFbnRlcic6CiAgICAgICAgICBjYXNlICdFc2NhcGUnOgogICAgICAgICAgY2FzZSAnRjInOgogICAgICAgICAgICBrZXlHcm91cCA9ICdJbnRlcmFjdGlvbic7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnVGFiJzoKICAgICAgICAgICAga2V5R3JvdXAgPSAnVGFiJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAga2V5R3JvdXAgPSAnU3BhY2UnOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2RldGVjdEludGVyYWN0aW5nKGUpOwogICAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnaW50ZXJhY3RpbmcnKSAmJiBrZXlHcm91cCAhPT0gJ0ludGVyYWN0aW9uJykgewogICAgICAgICAgLy8gV2hlbiBpbiB0aGUgaW50ZXJhY3RpbmcgbW9kZSwgb25seSB0aGUg4oCcSW50ZXJhY3Rpb27igJ0ga2V5cyBhcmUgaGFuZGxlZC4KICAgICAgICAgIGtleUdyb3VwID0gdW5kZWZpbmVkOwogICAgICAgIH0KCiAgICAgICAgaWYgKGtleUdyb3VwKSB7CiAgICAgICAgICB0aGlzW2Bfb24ke2tleUdyb3VwfUtleURvd25gXShlLCBrZXkpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2Vuc3VyZVNjcm9sbGVkVG9JbmRleChpbmRleCkgewogICAgICAgIGNvbnN0IHRhcmdldFJvd0luRG9tID0gQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcihjaGlsZCA9PiBjaGlsZC5pbmRleCA9PT0gaW5kZXgpWzBdOwogICAgICAgIGlmICghdGFyZ2V0Um93SW5Eb20pIHsKICAgICAgICAgIHRoaXMuX3Njcm9sbFRvSW5kZXgoaW5kZXgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX29uTmF2aWdhdGlvbktleURvd24oZSwga2V5KSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBmdW5jdGlvbiBpbmRleE9mQ2hpbGRFbGVtZW50KGVsKSB7CiAgICAgICAgICByZXR1cm4gQXJyYXkucHJvdG90eXBlLmluZGV4T2YuY2FsbChlbC5wYXJlbnROb2RlLmNoaWxkcmVuLCBlbCk7CiAgICAgICAgfQoKICAgICAgICBjb25zdCB2aXNpYmxlSXRlbXNDb3VudCA9IHRoaXMuX2xhc3RWaXNpYmxlSW5kZXggLSB0aGlzLl9maXJzdFZpc2libGVJbmRleCAtIDE7CgogICAgICAgIGxldCBkeCA9IDAsIGR5ID0gMDsKICAgICAgICBzd2l0Y2ggKGtleSkgewogICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6CiAgICAgICAgICAgIGR4ID0gdGhpcy5fX2lzUlRMID8gLTEgOiAxOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6CiAgICAgICAgICAgIGR4ID0gdGhpcy5fX2lzUlRMID8gMSA6IC0xOwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ0hvbWUnOgogICAgICAgICAgICBkeCA9IC1JbmZpbml0eTsKICAgICAgICAgICAgZS5jdHJsS2V5ICYmIChkeSA9IC1JbmZpbml0eSk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnRW5kJzoKICAgICAgICAgICAgZHggPSBJbmZpbml0eTsKICAgICAgICAgICAgZS5jdHJsS2V5ICYmIChkeSA9IEluZmluaXR5KTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOgogICAgICAgICAgICBkeSA9IDE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnQXJyb3dVcCc6CiAgICAgICAgICAgIGR5ID0gLTE7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnUGFnZURvd24nOgogICAgICAgICAgICBkeSA9IHZpc2libGVJdGVtc0NvdW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIGNhc2UgJ1BhZ2VVcCc6CiAgICAgICAgICAgIGR5ID0gLXZpc2libGVJdGVtc0NvdW50OwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgICAgIGNvbnN0IGFjdGl2ZUNlbGwgPSBlLmNvbXBvc2VkUGF0aCgpWzBdOwogICAgICAgIGNvbnN0IGNvbHVtbkluZGV4ID0gaW5kZXhPZkNoaWxkRWxlbWVudChhY3RpdmVDZWxsKTsKICAgICAgICBjb25zdCBpc1Jvd0RldGFpbHMgPSB0aGlzLl9lbGVtZW50TWF0Y2hlcyhhY3RpdmVDZWxsLCAnW3BhcnR+PSJkZXRhaWxzLWNlbGwiXScpOwoKICAgICAgICBjb25zdCBhY3RpdmVSb3cgPSBhY3RpdmVDZWxsLnBhcmVudE5vZGU7CgogICAgICAgIGNvbnN0IGFjdGl2ZVJvd0dyb3VwID0gYWN0aXZlUm93LnBhcmVudE5vZGU7CiAgICAgICAgY29uc3QgbWF4Um93SW5kZXggPSAoYWN0aXZlUm93R3JvdXAgPT09IHRoaXMuJC5pdGVtcyA/IHRoaXMuX2VmZmVjdGl2ZVNpemUgOiBhY3RpdmVSb3dHcm91cC5jaGlsZHJlbi5sZW5ndGgpIC0gMTsKCiAgICAgICAgLy8gQm9keSByb3dzIGhhdmUgaW5kZXggcHJvcGVydHksIG90aGVyd2lzZSBET00gY2hpbGQgaW5kZXggb2YgdGhlIHJvdyBpcyB1c2VkLgogICAgICAgIGNvbnN0IHJvd0luZGV4ID0gKGFjdGl2ZVJvd0dyb3VwID09PSB0aGlzLiQuaXRlbXMpID8KICAgICAgICAgICh0aGlzLl9mb2N1c2VkSXRlbUluZGV4ICE9PSB1bmRlZmluZWQgPyB0aGlzLl9mb2N1c2VkSXRlbUluZGV4IDogYWN0aXZlUm93LmluZGV4KSA6CiAgICAgICAgICBpbmRleE9mQ2hpbGRFbGVtZW50KGFjdGl2ZVJvdyk7CgogICAgICAgIC8vIEluZGV4IG9mIHRoZSBkZXN0aW5hdGlvbiByb3cKICAgICAgICBsZXQgZHN0Um93SW5kZXggPSBNYXRoLm1heCgwLCBNYXRoLm1pbihyb3dJbmRleCArIGR5LCBtYXhSb3dJbmRleCkpOwoKICAgICAgICAvLyBSb3cgZGV0YWlscyBuYXZpZ2F0aW9uIGxvZ2ljCiAgICAgICAgbGV0IGRzdElzUm93RGV0YWlscyA9IGZhbHNlOwogICAgICAgIGlmIChhY3RpdmVSb3dHcm91cCA9PT0gdGhpcy4kLml0ZW1zKSB7CiAgICAgICAgICBjb25zdCBpdGVtID0gYWN0aXZlUm93Ll9pdGVtOwogICAgICAgICAgY29uc3QgZHN0SXRlbSA9IHRoaXMuX2NhY2hlLmdldEl0ZW1Gb3JJbmRleChkc3RSb3dJbmRleCk7CiAgICAgICAgICAvLyBTaG91bGQgd2UgbmF2aWdhdGUgdG8gcm93IGRldGFpbHM/CiAgICAgICAgICBpZiAoaXNSb3dEZXRhaWxzKSB7CiAgICAgICAgICAgIGRzdElzUm93RGV0YWlscyA9IGR5ID09PSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZHN0SXNSb3dEZXRhaWxzID0gZHkgPT09IDEgJiYgdGhpcy5faXNEZXRhaWxzT3BlbmVkKGl0ZW0pIHx8CiAgICAgICAgICAgICAgZHkgPT09IC0xICYmIGRzdFJvd0luZGV4ICE9PSByb3dJbmRleCAmJiB0aGlzLl9pc0RldGFpbHNPcGVuZWQoZHN0SXRlbSk7CiAgICAgICAgICB9CiAgICAgICAgICAvLyBTaG91bGQgd2UgbmF2aWdhdGUgYmV0d2VlbiBkZXRhaWxzIGFuZCByZWd1bGFyIGNlbGxzIG9mIHRoZSBzYW1lIHJvdz8KICAgICAgICAgIGlmIChkc3RJc1Jvd0RldGFpbHMgIT09IGlzUm93RGV0YWlscyAmJgogICAgICAgICAgICAgIChkeSA9PT0gMSAmJiBkc3RJc1Jvd0RldGFpbHMgfHwgZHkgPT09IC0xICYmICFkc3RJc1Jvd0RldGFpbHMpKSB7CiAgICAgICAgICAgIGRzdFJvd0luZGV4ID0gcm93SW5kZXg7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICAvLyBIZWFkZXIgYW5kIGZvb3RlciBjb3VsZCBoYXZlIGhpZGRlbiByb3dzLCBlLiBnLiwgaWYgbm9uZSBvZiB0aGUgY29sdW1ucwogICAgICAgIC8vIG9yIGdyb3VwcyBvbiB0aGUgZ2l2ZW4gY29sdW1uIHRyZWUgbGV2ZWwgZGVmaW5lIHRlbXBsYXRlLiBTa2lwIHRoZW0KICAgICAgICAvLyBpbiB2ZXJ0aWNhbCBrZXlib2FyZCBuYXZpZ2F0aW9uLgogICAgICAgIGlmIChhY3RpdmVSb3dHcm91cCAhPT0gdGhpcy4kLml0ZW1zKSB7CiAgICAgICAgICBpZiAoZHN0Um93SW5kZXggPiByb3dJbmRleCkgewogICAgICAgICAgICB3aGlsZSAoCiAgICAgICAgICAgICAgZHN0Um93SW5kZXggPCBtYXhSb3dJbmRleCAmJgogICAgICAgICAgICAgIGFjdGl2ZVJvd0dyb3VwLmNoaWxkcmVuW2RzdFJvd0luZGV4XS5oaWRkZW4KICAgICAgICAgICAgKSB7CiAgICAgICAgICAgICAgZHN0Um93SW5kZXgrKzsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIGlmIChkc3RSb3dJbmRleCA8IHJvd0luZGV4KSB7CiAgICAgICAgICAgIHdoaWxlICgKICAgICAgICAgICAgICBkc3RSb3dJbmRleCA+IDAgJiYKICAgICAgICAgICAgICBhY3RpdmVSb3dHcm91cC5jaGlsZHJlbltkc3RSb3dJbmRleF0uaGlkZGVuCiAgICAgICAgICAgICkgewogICAgICAgICAgICAgIGRzdFJvd0luZGV4LS07CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIF9mb2N1c2VkQ29sdW1uT3JkZXIgaXMgbWVtb2l6ZWQg4oCUIHRoaXMgaXMgdG8gZW5zdXJlIHByZWRpY3RhYmxlCiAgICAgICAgLy8gbmF2aWdhdGlvbiB3aGVuIGVudGVyaW5nIGFuZCBsZWF2aW5nIGRldGFpbCBhbmQgY29sdW1uIGdyb3VwIGNlbGxzLgogICAgICAgIGlmICh0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgaWYgKGlzUm93RGV0YWlscykgewogICAgICAgICAgICB0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXIgPSAwOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgdGhpcy5fZm9jdXNlZENvbHVtbk9yZGVyID0gdGhpcy5fZ2V0Q29sdW1ucyhhY3RpdmVSb3dHcm91cCwgcm93SW5kZXgpLmZpbHRlcihjID0+ICFjLmhpZGRlbilbY29sdW1uSW5kZXhdLl9vcmRlcjsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIEZpbmQgb3JkZXJlZENvbHVtbkluZGV4IOKAlCB0aGUgaW5kZXggb2Ygb3JkZXIgY2xvc2VzdCBtYXRjaGluZyB0aGUKICAgICAgICAvLyBvcmlnaW5hbCBfZm9jdXNlZENvbHVtbk9yZGVyIGluIHRoZSBzb3J0ZWQgYXJyYXkgb2Ygb3JkZXJzCiAgICAgICAgLy8gb2YgdGhlIHZpc2libGUgY29sdW1ucyBvbiB0aGUgZGVzdGluYXRpb24gcm93LgogICAgICAgIGNvbnN0IGRzdENvbHVtbnMgPSB0aGlzLl9nZXRDb2x1bW5zKGFjdGl2ZVJvd0dyb3VwLCBkc3RSb3dJbmRleCkuZmlsdGVyKGMgPT4gIWMuaGlkZGVuKTsKICAgICAgICBjb25zdCBkc3RTb3J0ZWRDb2x1bW5PcmRlcnMgPSBkc3RDb2x1bW5zLm1hcChjID0+IGMuX29yZGVyKQogICAgICAgICAgLnNvcnQoKGIsIGEpID0+IChiIC0gYSkpOwogICAgICAgIGNvbnN0IG1heE9yZGVyZWRDb2x1bW5JbmRleCA9IGRzdFNvcnRlZENvbHVtbk9yZGVycy5sZW5ndGggLSAxOwogICAgICAgIGNvbnN0IG9yZGVyZWRDb2x1bW5JbmRleCA9IGRzdFNvcnRlZENvbHVtbk9yZGVycy5pbmRleE9mKAogICAgICAgICAgZHN0U29ydGVkQ29sdW1uT3JkZXJzLnNsaWNlKDApLnNvcnQoKGIsIGEpID0+CiAgICAgICAgICAgIE1hdGguYWJzKGIgLSB0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXIpIC0gTWF0aC5hYnMoYSAtIHRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlcikKICAgICAgICAgIClbMF0KICAgICAgICApOwoKICAgICAgICAvLyBJbmRleCBvZiB0aGUgZGVzdGluYXRpb24gY29sdW1uIG9yZGVyCiAgICAgICAgY29uc3QgZHN0T3JkZXJlZENvbHVtbkluZGV4ID0gKGR5ID09PSAwICYmIGlzUm93RGV0YWlscykgPyBvcmRlcmVkQ29sdW1uSW5kZXggOgogICAgICAgICAgTWF0aC5tYXgoMCwgTWF0aC5taW4ob3JkZXJlZENvbHVtbkluZGV4ICsgZHgsIG1heE9yZGVyZWRDb2x1bW5JbmRleCkpOwoKICAgICAgICBpZiAoZHN0T3JkZXJlZENvbHVtbkluZGV4ICE9PSBvcmRlcmVkQ29sdW1uSW5kZXgpIHsKICAgICAgICAgIC8vIEhvcml6b250YWwgbW92ZW1lbnQgaW52YWxpZGF0ZXMgc3RvcmVkIF9mb2N1c2VkQ29sdW1uT3JkZXIKICAgICAgICAgIHRoaXMuX2ZvY3VzZWRDb2x1bW5PcmRlciA9IHVuZGVmaW5lZDsKICAgICAgICB9CgogICAgICAgIC8vIEVuc3VyZSBjb3JyZWN0IHZlcnRpY2FsIHNjcm9sbCBwb3NpdGlvbiwgZGVzdGluYXRpb24gcm93IGlzIHZpc2libGUKICAgICAgICBpZiAoYWN0aXZlUm93R3JvdXAgPT09IHRoaXMuJC5pdGVtcykgewogICAgICAgICAgdGhpcy5fZW5zdXJlU2Nyb2xsZWRUb0luZGV4KGRzdFJvd0luZGV4KTsKICAgICAgICB9CgogICAgICAgIC8vIFRoaXMgaGFzIHRvIGJlIHNldCBhZnRlciBzY3JvbGxpbmcsIG90aGVyd2lzZSBpdCBjYW4gYmUgcmVtb3ZlZCBieQogICAgICAgIC8vIGBfcHJldmVudFNjcm9sbGVyUm90YXRpbmdDZWxsRm9jdXMoaXRlbSwgaW5kZXgpYCBkdXJpbmcgc2Nyb2xsaW5nLgogICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbmF2aWdhdGluZycsIHRydWUsIHRoaXMpOwoKICAgICAgICBjb25zdCBjb2x1bW5JbmRleEJ5T3JkZXIgPSBkc3RDb2x1bW5zLnJlZHVjZSgoYWNjLCBjb2wsIGkpID0+IChhY2NbY29sLl9vcmRlcl0gPSBpLCBhY2MpLCB7fSk7CiAgICAgICAgY29uc3QgZHN0Q29sdW1uSW5kZXggPSBjb2x1bW5JbmRleEJ5T3JkZXJbZHN0U29ydGVkQ29sdW1uT3JkZXJzW2RzdE9yZGVyZWRDb2x1bW5JbmRleF1dOwoKICAgICAgICAvLyBGb3IgYm9keSByb3dzLCB1c2UgaW5kZXggcHJvcGVydHkgdG8gZmluZCBkZXN0aW5hdGlvbiByb3csIG90aGVyd2lzZSB1c2UgRE9NIGNoaWxkIGluZGV4CiAgICAgICAgY29uc3QgZHN0Um93ID0gYWN0aXZlUm93R3JvdXAgPT09IHRoaXMuJC5pdGVtcyA/CiAgICAgICAgICBBcnJheS5mcm9tKGFjdGl2ZVJvd0dyb3VwLmNoaWxkcmVuKS5maWx0ZXIoZWwgPT4gZWwuaW5kZXggPT09IGRzdFJvd0luZGV4KVswXSA6CiAgICAgICAgICBhY3RpdmVSb3dHcm91cC5jaGlsZHJlbltkc3RSb3dJbmRleF07CiAgICAgICAgaWYgKCFkc3RSb3cpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIEhlcmUgd2UgZ28hCiAgICAgICAgY29uc3QgZHN0Q2VsbCA9IGRzdElzUm93RGV0YWlscyA/CiAgICAgICAgICBBcnJheS5mcm9tKGRzdFJvdy5jaGlsZHJlbikKICAgICAgICAgICAgLmZpbHRlcihlbCA9PiB0aGlzLl9lbGVtZW50TWF0Y2hlcyhlbCwgJ1twYXJ0fj0iZGV0YWlscy1jZWxsIl0nKSlbMF0gOgogICAgICAgICAgZHN0Um93LmNoaWxkcmVuW2RzdENvbHVtbkluZGV4XTsKICAgICAgICB0aGlzLl9zY3JvbGxIb3Jpem9udGFsbHlUb0NlbGwoZHN0Q2VsbCk7CiAgICAgICAgaWYgKGFjdGl2ZVJvd0dyb3VwID09PSB0aGlzLiQuaXRlbXMpIHsKICAgICAgICAgIC8vIFdoZW4gc2Nyb2xsaW5nIHdpdGggcmVwZWF0ZWQga2V5ZG93biwgc29tZXRpbWVzIEZvY3VzRXZlbnQgbGlzdGVuZXJzCiAgICAgICAgICAvLyBhcmUgdG9vIGxhdGUgdG8gdXBkYXRlIF9mb2N1c2VkSXRlbUluZGV4LiBFbnN1cmUgbmV4dCBrZXlkb3duCiAgICAgICAgICAvLyBsaXN0ZW5lciBpbnZvY2F0aW9uIGdldHMgdXBkYXRlZCBfZm9jdXNlZEl0ZW1JbmRleCB2YWx1ZS4KICAgICAgICAgIHRoaXMuX2ZvY3VzZWRJdGVtSW5kZXggPSBkc3RSb3dJbmRleDsKICAgICAgICB9CgogICAgICAgIGlmIChhY3RpdmVSb3dHcm91cCA9PT0gdGhpcy4kLml0ZW1zKSB7CiAgICAgICAgICBjb25zdCBkc3RSZWN0ID0gZHN0Q2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgIGNvbnN0IGZvb3RlclRvcCA9IHRoaXMuJC5mb290ZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wOwogICAgICAgICAgY29uc3QgaGVhZGVyQm90dG9tID0gdGhpcy4kLmhlYWRlci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5ib3R0b207CiAgICAgICAgICBpZiAoZHN0UmVjdC5ib3R0b20gPiBmb290ZXJUb3ApIHsKICAgICAgICAgICAgdGhpcy4kLnRhYmxlLnNjcm9sbFRvcCArPSBkc3RSZWN0LmJvdHRvbSAtIGZvb3RlclRvcDsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsSGFuZGxlcigpOwogICAgICAgICAgfSBlbHNlIGlmIChkc3RSZWN0LnRvcCA8IGhlYWRlckJvdHRvbSkgewogICAgICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsVG9wIC09IGhlYWRlckJvdHRvbSAtIGRzdFJlY3QudG9wOwogICAgICAgICAgICB0aGlzLl9zY3JvbGxIYW5kbGVyKCk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBkc3RDZWxsLmZvY3VzKCk7CiAgICAgIH0KCiAgICAgIF9wYXJzZUV2ZW50UGF0aChwYXRoKSB7CiAgICAgICAgY29uc3QgdGFibGVJbmRleCA9IHBhdGguaW5kZXhPZih0aGlzLiQudGFibGUpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICByb3dHcm91cDogcGF0aFt0YWJsZUluZGV4IC0gMV0sCiAgICAgICAgICByb3c6IHBhdGhbdGFibGVJbmRleCAtIDJdLAogICAgICAgICAgY2VsbDogcGF0aFt0YWJsZUluZGV4IC0gM10KICAgICAgICB9OwogICAgICB9CgogICAgICBfb25JbnRlcmFjdGlvbktleURvd24oZSwga2V5KSB7CiAgICAgICAgY29uc3QgbG9jYWxUYXJnZXQgPSBlLmNvbXBvc2VkUGF0aCgpWzBdOwogICAgICAgIGNvbnN0IGxvY2FsVGFyZ2V0SXNUZXh0SW5wdXQgPSBsb2NhbFRhcmdldC5sb2NhbE5hbWUgPT09ICdpbnB1dCcgJiYKICAgICAgICAgICEvXihidXR0b258Y2hlY2tib3h8Y29sb3J8ZmlsZXxpbWFnZXxyYWRpb3xyYW5nZXxyZXNldHxzdWJtaXQpJC9pLnRlc3QobG9jYWxUYXJnZXQudHlwZSk7CgogICAgICAgIGxldCB3YW50SW50ZXJhY3Rpbmc7CiAgICAgICAgc3dpdGNoIChrZXkpIHsKICAgICAgICAgIGNhc2UgJ0VudGVyJzoKICAgICAgICAgICAgd2FudEludGVyYWN0aW5nID0gdGhpcy5oYXNBdHRyaWJ1dGUoJ2ludGVyYWN0aW5nJykgPyAhbG9jYWxUYXJnZXRJc1RleHRJbnB1dCA6IHRydWU7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnRXNjYXBlJzoKICAgICAgICAgICAgd2FudEludGVyYWN0aW5nID0gZmFsc2U7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgY2FzZSAnRjInOgogICAgICAgICAgICB3YW50SW50ZXJhY3RpbmcgPSAhdGhpcy5oYXNBdHRyaWJ1dGUoJ2ludGVyYWN0aW5nJyk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KCiAgICAgICAgY29uc3Qge2NlbGx9ID0gdGhpcy5fcGFyc2VFdmVudFBhdGgoZS5jb21wb3NlZFBhdGgoKSk7CgogICAgICAgIGlmICh0aGlzLmhhc0F0dHJpYnV0ZSgnaW50ZXJhY3RpbmcnKSAhPT0gd2FudEludGVyYWN0aW5nKSB7CiAgICAgICAgICBpZiAod2FudEludGVyYWN0aW5nKSB7CiAgICAgICAgICAgIGNvbnN0IGZvY3VzVGFyZ2V0ID0gY2VsbC5fY29udGVudC5xdWVyeVNlbGVjdG9yKCdbZm9jdXMtdGFyZ2V0XScpIHx8CiAgICAgICAgICAgICAgY2VsbC5fY29udGVudC5maXJzdEVsZW1lbnRDaGlsZDsKICAgICAgICAgICAgaWYgKGZvY3VzVGFyZ2V0KSB7CiAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgIGZvY3VzVGFyZ2V0LmZvY3VzKCk7CiAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdpbnRlcmFjdGluZycsIHRydWUsIHRoaXMpOwogICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbmF2aWdhdGluZycsIGZhbHNlLCB0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB0aGlzLl9mb2N1c2VkQ29sdW1uT3JkZXIgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNlbGwuZm9jdXMoKTsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdpbnRlcmFjdGluZycsIGZhbHNlLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCduYXZpZ2F0aW5nJywgdHJ1ZSwgdGhpcyk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfcHJlZGljdEZvY3VzU3RlcFRhcmdldChzcmNFbGVtZW50LCBzdGVwKSB7CiAgICAgICAgY29uc3QgdGFiT3JkZXIgPSBbCiAgICAgICAgICB0aGlzLiQudGFibGUsCiAgICAgICAgICB0aGlzLl9oZWFkZXJGb2N1c2FibGUsCiAgICAgICAgICB0aGlzLl9pdGVtc0ZvY3VzYWJsZSwKICAgICAgICAgIHRoaXMuX2Zvb3RlckZvY3VzYWJsZSwKICAgICAgICAgIHRoaXMuJC5mb2N1c2V4aXQKICAgICAgICBdOwoKICAgICAgICBsZXQgaW5kZXggPSB0YWJPcmRlci5pbmRleE9mKHNyY0VsZW1lbnQpOwoKICAgICAgICBpbmRleCArPSBzdGVwOwogICAgICAgIHdoaWxlIChpbmRleCA+PSAwICYmIGluZGV4IDw9IHRhYk9yZGVyLmxlbmd0aCAtIDEgJiYKICAgICAgICAgICAgKCF0YWJPcmRlcltpbmRleF0gfHwgdGFiT3JkZXJbaW5kZXhdLnBhcmVudE5vZGUuaGlkZGVuKSkgewogICAgICAgICAgaW5kZXggKz0gc3RlcDsKICAgICAgICB9CgogICAgICAgIHJldHVybiB0YWJPcmRlcltpbmRleF07CiAgICAgIH0KCiAgICAgIF9vblRhYktleURvd24oZSkgewogICAgICAgIGNvbnN0IGZvY3VzVGFyZ2V0ID0gdGhpcy5fcHJlZGljdEZvY3VzU3RlcFRhcmdldChlLmNvbXBvc2VkUGF0aCgpWzBdLCBlLnNoaWZ0S2V5ID8gLTEgOiAxKTsKCiAgICAgICAgaWYgKGZvY3VzVGFyZ2V0ID09PSB0aGlzLiQudGFibGUpIHsKICAgICAgICAgIC8vIFRoZSBmb2N1cyBpcyBhYm91dCB0byBleGl0IHRoZSBncmlkIHRvIHRoZSB0b3AuCiAgICAgICAgICB0aGlzLiQudGFibGUuZm9jdXMoKTsKICAgICAgICB9IGVsc2UgaWYgKGZvY3VzVGFyZ2V0ID09PSB0aGlzLiQuZm9jdXNleGl0KSB7CiAgICAgICAgICAvLyBUaGUgZm9jdXMgaXMgYWJvdXQgdG8gZXhpdCB0aGUgZ3JpZCB0byB0aGUgYm90dG9tLgogICAgICAgICAgdGhpcy4kLmZvY3VzZXhpdC5mb2N1cygpOwogICAgICAgIH0gZWxzZSBpZiAoZm9jdXNUYXJnZXQgPT09IHRoaXMuX2l0ZW1zRm9jdXNhYmxlKSB7CiAgICAgICAgICBsZXQgaXRlbXNGb2N1c1RhcmdldCA9IGZvY3VzVGFyZ2V0OwogICAgICAgICAgY29uc3QgdGFyZ2V0Um93ID0gdGhpcy5faXRlbXNGb2N1c2FibGUucGFyZW50Tm9kZTsKICAgICAgICAgIHRoaXMuX2Vuc3VyZVNjcm9sbGVkVG9JbmRleCh0aGlzLl9mb2N1c2VkSXRlbUluZGV4KTsKICAgICAgICAgIGlmICh0YXJnZXRSb3cuaW5kZXggIT09IHRoaXMuX2ZvY3VzZWRJdGVtSW5kZXgpIHsKICAgICAgICAgICAgLy8gVGhlIHRhcmdldCByb3csIHdoaWNoIGlzIGFib3V0IHRvIGJlIGZvY3VzZWQgbmV4dCwgaGFzIGJlZW4KICAgICAgICAgICAgLy8gYXNzaWduZWQgd2l0aCBhIG5ldyBpbmRleCBzaW5jZSBsYXN0IGZvY3VzLCBwcm9iYWJseSBiZWNhdXNlIG9mCiAgICAgICAgICAgIC8vIHNjcm9sbGluZy4gRm9jdXMgdGhlIHJvdyBmb3IgdGhlIHN0b3JlZCBmb2N1c2VkIGl0ZW0gaW5kZXggaW5zdGVhZC4KICAgICAgICAgICAgY29uc3QgY29sdW1uSW5kZXggPSBBcnJheS5mcm9tKHRhcmdldFJvdy5jaGlsZHJlbikuaW5kZXhPZih0aGlzLl9pdGVtc0ZvY3VzYWJsZSk7CiAgICAgICAgICAgIGNvbnN0IGZvY3VzZWRJdGVtUm93ID0gQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pCiAgICAgICAgICAgICAgLmZpbHRlcihyb3cgPT4gcm93LmluZGV4ID09PSB0aGlzLl9mb2N1c2VkSXRlbUluZGV4KVswXTsKICAgICAgICAgICAgaWYgKGZvY3VzZWRJdGVtUm93KSB7CiAgICAgICAgICAgICAgaXRlbXNGb2N1c1RhcmdldCA9IGZvY3VzZWRJdGVtUm93LmNoaWxkcmVuW2NvbHVtbkluZGV4XTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgaXRlbXNGb2N1c1RhcmdldC5mb2N1cygpOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICBmb2N1c1RhcmdldC5mb2N1cygpOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCduYXZpZ2F0aW5nJywgdHJ1ZSwgdGhpcyk7CiAgICAgIH0KCiAgICAgIF9vblNwYWNlS2V5RG93bihlKSB7CiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpOwoKICAgICAgICBjb25zdCBjZWxsID0gZS5jb21wb3NlZFBhdGgoKVswXTsKICAgICAgICBpZiAoIWNlbGwuX2NvbnRlbnQgfHwgIWNlbGwuX2NvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHsKICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NlbGwtYWN0aXZhdGUnLCB7ZGV0YWlsOiB7CiAgICAgICAgICAgIG1vZGVsOiB0aGlzLl9fZ2V0Um93TW9kZWwoY2VsbC5wYXJlbnRFbGVtZW50KQogICAgICAgICAgfX0pKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKiBAcHJpdmF0ZSAqLwogICAgICBfb25LZXlVcChlKSB7CiAgICAgICAgaWYgKCEvXiggfFNwYWNlQmFyKSQvLnRlc3QoZS5rZXkpKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CgogICAgICAgIGNvbnN0IGNlbGwgPSBlLmNvbXBvc2VkUGF0aCgpWzBdOwogICAgICAgIGlmIChjZWxsLl9jb250ZW50ICYmIGNlbGwuX2NvbnRlbnQuZmlyc3RFbGVtZW50Q2hpbGQpIHsKICAgICAgICAgIGNvbnN0IHdhc05hdmlnYXRpbmcgPSB0aGlzLmhhc0F0dHJpYnV0ZSgnbmF2aWdhdGluZycpOwogICAgICAgICAgY2VsbC5fY29udGVudC5maXJzdEVsZW1lbnRDaGlsZC5jbGljaygpOwogICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCduYXZpZ2F0aW5nJywgd2FzTmF2aWdhdGluZywgdGhpcyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfb25Gb2N1c0luKGUpIHsKICAgICAgICBpZiAoIXRoaXMuX2lzTW91c2Vkb3duKSB7CiAgICAgICAgICB0aGlzLl90b2dnbGVBdHRyaWJ1dGUoJ25hdmlnYXRpbmcnLCB0cnVlLCB0aGlzKTsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHJvb3RUYXJnZXQgPSBlLmNvbXBvc2VkUGF0aCgpWzBdOwoKICAgICAgICBpZiAocm9vdFRhcmdldCA9PT0gdGhpcy4kLnRhYmxlIHx8CiAgICAgICAgICAgIHJvb3RUYXJnZXQgPT09IHRoaXMuJC5mb2N1c2V4aXQpIHsKICAgICAgICAgIC8vIFRoZSBmb2N1cyBlbnRlcnMgdGhlIHRvcCAoYm90dG9tKSBvZiB0aGUgZ3JpZCwgbWVhbmluZyB0aGF0IHVzZXIgaGFzCiAgICAgICAgICAvLyB0YWJiZWQgKHNoaWZ0LXRhYmJlZCkgaW50byB0aGUgZ3JpZC4gTW92ZSB0aGUgZm9jdXMgdG8KICAgICAgICAgIC8vIHRoZSBmaXJzdCAodGhlIGxhc3QpIGZvY3VzYWJsZS4KICAgICAgICAgIHRoaXMuX3ByZWRpY3RGb2N1c1N0ZXBUYXJnZXQoCiAgICAgICAgICAgIHJvb3RUYXJnZXQsCiAgICAgICAgICAgIHJvb3RUYXJnZXQgPT09IHRoaXMuJC50YWJsZSA/IDEgOiAtMQogICAgICAgICAgKS5mb2N1cygpOwogICAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdpbnRlcmFjdGluZycsIGZhbHNlLCB0aGlzKTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdGhpcy5fZGV0ZWN0SW50ZXJhY3RpbmcoZSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfb25Gb2N1c091dChlKSB7CiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCduYXZpZ2F0aW5nJywgZmFsc2UsIHRoaXMpOwogICAgICAgIHRoaXMuX2RldGVjdEludGVyYWN0aW5nKGUpOwogICAgICB9CgogICAgICBfb25DZWxsRm9jdXNJbihlKSB7CiAgICAgICAgdGhpcy5fZGV0ZWN0SW50ZXJhY3RpbmcoZSk7CgogICAgICAgIGlmIChlLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YodGhpcy4kLnRhYmxlKSA9PT0gMykgewogICAgICAgICAgY29uc3QgY2VsbCA9IGUuY29tcG9zZWRQYXRoKClbMF07CiAgICAgICAgICB0aGlzLl9hY3RpdmVSb3dHcm91cCA9IGNlbGwucGFyZW50Tm9kZS5wYXJlbnROb2RlOwogICAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZVJvd0dyb3VwID09PSB0aGlzLiQuaGVhZGVyKSB7CiAgICAgICAgICAgIHRoaXMuX2hlYWRlckZvY3VzYWJsZSA9IGNlbGw7CiAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2FjdGl2ZVJvd0dyb3VwID09PSB0aGlzLiQuaXRlbXMpIHsKICAgICAgICAgICAgdGhpcy5faXRlbXNGb2N1c2FibGUgPSBjZWxsOwogICAgICAgICAgfSBlbHNlIGlmICh0aGlzLl9hY3RpdmVSb3dHcm91cCA9PT0gdGhpcy4kLmZvb3RlcikgewogICAgICAgICAgICB0aGlzLl9mb290ZXJGb2N1c2FibGUgPSBjZWxsOwogICAgICAgICAgfQogICAgICAgICAgLy8gSW5mb3JtIGNlbGwgY29udGVudCBvZiB0aGUgZm9jdXMgKHVzZWQgaW4gPHZhYWRpbi1ncmlkLXNvcnRlcj4pCiAgICAgICAgICBjZWxsLl9jb250ZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjZWxsLWZvY3VzaW4nLCB7YnViYmxlczogZmFsc2V9KSk7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl9kZXRlY3RGb2N1c2VkSXRlbUluZGV4KGUpOwogICAgICB9CgogICAgICBfb25DZWxsRm9jdXNPdXQoZSkgewogICAgICAgIGlmIChlLmNvbXBvc2VkUGF0aCgpLmluZGV4T2YodGhpcy4kLnRhYmxlKSA9PT0gMykgewogICAgICAgICAgY29uc3QgY2VsbCA9IGUuY29tcG9zZWRQYXRoKClbMF07CiAgICAgICAgICAvLyBJbmZvcm0gY2VsbCBjb250ZW50IG9mIHRoZSBmb2N1cyAodXNlZCBpbiA8dmFhZGluLWdyaWQtc29ydGVyPikKICAgICAgICAgIGNlbGwuX2NvbnRlbnQuZGlzcGF0Y2hFdmVudChuZXcgQ3VzdG9tRXZlbnQoJ2NlbGwtZm9jdXNvdXQnLCB7YnViYmxlczogZmFsc2V9KSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfZGV0ZWN0SW50ZXJhY3RpbmcoZSkgewogICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnaW50ZXJhY3RpbmcnLAogICAgICAgICAgZS5jb21wb3NlZFBhdGgoKS5zb21lKGVsID0+IGVsLmxvY2FsTmFtZSA9PT0gJ3ZhYWRpbi1ncmlkLWNlbGwtY29udGVudCcpLAogICAgICAgICAgdGhpcyk7CiAgICAgIH0KCiAgICAgIF9kZXRlY3RGb2N1c2VkSXRlbUluZGV4KGUpIHsKICAgICAgICBjb25zdCB7cm93R3JvdXAsIHJvd30gPSB0aGlzLl9wYXJzZUV2ZW50UGF0aChlLmNvbXBvc2VkUGF0aCgpKTsKICAgICAgICBpZiAocm93R3JvdXAgPT09IHRoaXMuJC5pdGVtcykgewogICAgICAgICAgdGhpcy5fZm9jdXNlZEl0ZW1JbmRleCA9IHJvdy5pbmRleDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9wcmV2ZW50U2Nyb2xsZXJSb3RhdGluZ0NlbGxGb2N1cyhpdGVtLCBpbmRleCkgewogICAgICAgIGlmIChpdGVtLmluZGV4ID09PSB0aGlzLl9mb2N1c2VkSXRlbUluZGV4ICYmIHRoaXMuaGFzQXR0cmlidXRlKCduYXZpZ2F0aW5nJykgJiYgdGhpcy5fYWN0aXZlUm93R3JvdXAgPT09IHRoaXMuJC5pdGVtcykgewogICAgICAgICAgLy8gRm9jdXNlZCBpdGVtIGhhcyB3ZW50LCBoaWRlIG5hdmlnYXRpb24gbW9kZQogICAgICAgICAgdGhpcy5fbmF2aWdhdGluZ0lzSGlkZGVuID0gdHJ1ZTsKICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbmF2aWdhdGluZycsIGZhbHNlLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGV4ID09PSB0aGlzLl9mb2N1c2VkSXRlbUluZGV4ICYmIHRoaXMuX25hdmlnYXRpbmdJc0hpZGRlbikgewogICAgICAgICAgLy8gRm9jdXNlZCBpdGVtIGlzIGJhY2ssIHJlc3RvcmUgbmF2aWdhdGlvbiBtb2RlCiAgICAgICAgICB0aGlzLl9uYXZpZ2F0aW5nSXNIaWRkZW4gPSBmYWxzZTsKICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbmF2aWdhdGluZycsIHRydWUsIHRoaXMpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2dldENvbHVtbnMocm93R3JvdXAsIHJvd0luZGV4KSB7CiAgICAgICAgbGV0IGNvbHVtblRyZWVMZXZlbCA9IHRoaXMuX2NvbHVtblRyZWUubGVuZ3RoIC0gMTsKICAgICAgICBpZiAocm93R3JvdXAgPT09IHRoaXMuJC5oZWFkZXIpIHsKICAgICAgICAgIGNvbHVtblRyZWVMZXZlbCA9IHJvd0luZGV4OwogICAgICAgIH0gZWxzZSBpZiAocm93R3JvdXAgPT09IHRoaXMuJC5mb290ZXIpIHsKICAgICAgICAgIGNvbHVtblRyZWVMZXZlbCA9IHRoaXMuX2NvbHVtblRyZWUubGVuZ3RoIC0gMSAtIHJvd0luZGV4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gdGhpcy5fY29sdW1uVHJlZVtjb2x1bW5UcmVlTGV2ZWxdOwogICAgICB9CgogICAgICBfcmVzZXRLZXlib2FyZE5hdmlnYXRpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuJC5oZWFkZXIuZmlyc3RFbGVtZW50Q2hpbGQpIHsKICAgICAgICAgIHRoaXMuX2hlYWRlckZvY3VzYWJsZSA9IEFycmF5LmZyb20odGhpcy4kLmhlYWRlci5maXJzdEVsZW1lbnRDaGlsZC5jaGlsZHJlbikuZmlsdGVyKGVsID0+ICFlbC5oaWRkZW4pWzBdOwogICAgICAgIH0KCiAgICAgICAgaWYgKHRoaXMuJC5pdGVtcy5maXJzdEVsZW1lbnRDaGlsZCkgewogICAgICAgICAgY29uc3QgZmlyc3RWaXNpYmxlSW5kZXhSb3cgPSB0aGlzLl9pdGVyYXRlSXRlbXMoKHBpZHgsIHZpZHgpID0+IHsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZpcnN0VmlzaWJsZUluZGV4ID09PSB2aWR4KSB7CiAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuJC5pdGVtcy5jaGlsZHJlbltwaWR4XTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgICBpZiAoZmlyc3RWaXNpYmxlSW5kZXhSb3cpIHsKICAgICAgICAgICAgdGhpcy5faXRlbXNGb2N1c2FibGUgPSBBcnJheS5mcm9tKGZpcnN0VmlzaWJsZUluZGV4Um93LmNoaWxkcmVuKS5maWx0ZXIoZWwgPT4gIWVsLmhpZGRlbilbMF07CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAodGhpcy4kLmZvb3Rlci5maXJzdEVsZW1lbnRDaGlsZCkgewogICAgICAgICAgdGhpcy5fZm9vdGVyRm9jdXNhYmxlID0gQXJyYXkuZnJvbSh0aGlzLiQuZm9vdGVyLmZpcnN0RWxlbWVudENoaWxkLmNoaWxkcmVuKS5maWx0ZXIoZWwgPT4gIWVsLmhpZGRlbilbMF07CiAgICAgICAgfQogICAgICB9CgogICAgICBfc2Nyb2xsSG9yaXpvbnRhbGx5VG9DZWxsKGRzdENlbGwpIHsKICAgICAgICBpZiAoZHN0Q2VsbC5oYXNBdHRyaWJ1dGUoJ2Zyb3plbicpIHx8IHRoaXMuX2VsZW1lbnRNYXRjaGVzKGRzdENlbGwsICdbcGFydH49ImRldGFpbHMtY2VsbCJdJykpIHsKICAgICAgICAgIC8vIFRoZXNlIGNlbGxzIGFyZSwgYnkgZGVzaWduLCBhbHdheXMgdmlzaWJsZSwgbm8gbmVlZCB0byBzY3JvbGwuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBkc3RDZWxsUmVjdCA9IGRzdENlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgY29uc3QgZHN0Um93ID0gZHN0Q2VsbC5wYXJlbnROb2RlOwogICAgICAgIGNvbnN0IGRzdENlbGxJbmRleCA9IEFycmF5LmZyb20oZHN0Um93LmNoaWxkcmVuKS5pbmRleE9mKGRzdENlbGwpOwogICAgICAgIGNvbnN0IHRhYmxlUmVjdCA9IHRoaXMuJC50YWJsZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICBsZXQgbGVmdEJvdW5kYXJ5ID0gdGFibGVSZWN0LmxlZnQsIHJpZ2h0Qm91bmRhcnkgPSB0YWJsZVJlY3QucmlnaHQ7CiAgICAgICAgZm9yIChsZXQgaSA9IGRzdENlbGxJbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICBjb25zdCBjZWxsID0gZHN0Um93LmNoaWxkcmVuW2ldOwogICAgICAgICAgaWYgKGNlbGwuaGFzQXR0cmlidXRlKCdoaWRkZW4nKSB8fAogICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRNYXRjaGVzKGNlbGwsICdbcGFydH49ImRldGFpbHMtY2VsbCJdJykpIHsKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICB9CiAgICAgICAgICBpZiAoY2VsbC5oYXNBdHRyaWJ1dGUoJ2Zyb3plbicpKSB7CiAgICAgICAgICAgIGxlZnRCb3VuZGFyeSA9IGNlbGwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkucmlnaHQ7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gZHN0Q2VsbEluZGV4ICsgMTsgaSA8IGRzdFJvdy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgY29uc3QgY2VsbCA9IGRzdFJvdy5jaGlsZHJlbltpXTsKICAgICAgICAgIGlmIChjZWxsLmhhc0F0dHJpYnV0ZSgnaGlkZGVuJykgfHwKICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50TWF0Y2hlcyhjZWxsLCAnW3BhcnR+PSJkZXRhaWxzLWNlbGwiXScpKSB7CiAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGNlbGwuaGFzQXR0cmlidXRlKCdmcm96ZW4nKSkgewogICAgICAgICAgICByaWdodEJvdW5kYXJ5ID0gY2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0OwogICAgICAgICAgICBicmVhazsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChkc3RDZWxsUmVjdC5sZWZ0IDwgbGVmdEJvdW5kYXJ5KSB7CiAgICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsTGVmdCArPSBNYXRoLnJvdW5kKGRzdENlbGxSZWN0LmxlZnQgLSBsZWZ0Qm91bmRhcnkpOwogICAgICAgIH0KICAgICAgICBpZiAoZHN0Q2VsbFJlY3QucmlnaHQgPiByaWdodEJvdW5kYXJ5KSB7CiAgICAgICAgICB0aGlzLiQudGFibGUuc2Nyb2xsTGVmdCArPSBNYXRoLnJvdW5kKGRzdENlbGxSZWN0LnJpZ2h0IC0gcmlnaHRCb3VuZGFyeSk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfZWxlbWVudE1hdGNoZXMoZWwsIHF1ZXJ5KSB7CiAgICAgICAgcmV0dXJuIGVsLm1hdGNoZXMgPyBlbC5tYXRjaGVzKHF1ZXJ5KSA6CiAgICAgICAgICBBcnJheS5mcm9tKGVsLnBhcmVudE5vZGUucXVlcnlTZWxlY3RvckFsbChxdWVyeSkpLmluZGV4T2YoZWwpICE9PSAtMTsKICAgICAgfQogICAgfTsKCiAgICAvKioKICAgIEBsaWNlbnNlCiAgICBDb3B5cmlnaHQgKGMpIDIwMTcgVmFhZGluIEx0ZC4KICAgIFRoaXMgcHJvZ3JhbSBpcyBhdmFpbGFibGUgdW5kZXIgQXBhY2hlIExpY2Vuc2UgVmVyc2lvbiAyLjAsIGF2YWlsYWJsZSBhdCBodHRwczovL3ZhYWRpbi5jb20vbGljZW5zZS8KICAgICovCgogICAgLyoqCiAgICAgKiBAcG9seW1lck1peGluCiAgICAgKi8KICAgIGNvbnN0IENvbHVtblJlb3JkZXJpbmdNaXhpbiA9IHN1cGVyQ2xhc3MgPT4gY2xhc3MgQ29sdW1uUmVvcmRlcmluZ01peGluIGV4dGVuZHMgR2VzdHVyZUV2ZW50TGlzdGVuZXJzKHN1cGVyQ2xhc3MpIHsKCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBTZXQgdG8gdHJ1ZSB0byBhbGxvdyBjb2x1bW4gcmVvcmRlcmluZy4KICAgICAgICAgICAqLwogICAgICAgICAgY29sdW1uUmVvcmRlcmluZ0FsbG93ZWQ6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9LAoKICAgICAgICAgIF9vcmRlckJhc2VTY29wZTogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIHZhbHVlOiAxMDAwMDAwMAogICAgICAgICAgfQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX3VwZGF0ZU9yZGVycyhfY29sdW1uVHJlZSwgX2NvbHVtblRyZWUuKiknCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgcmVhZHkoKSB7CiAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICBhZGRMaXN0ZW5lcih0aGlzLCAndHJhY2snLCB0aGlzLl9vblRyYWNrRXZlbnQpOwogICAgICAgIHRoaXMuX3Jlb3JkZXJHaG9zdCA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCdbcGFydD0icmVvcmRlci1naG9zdCJdJyk7CgogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX29uVG91Y2hTdGFydC5iaW5kKHRoaXMpKTsKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMuX29uVG91Y2hNb3ZlLmJpbmQodGhpcykpOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hlbmQnLCB0aGlzLl9vblRvdWNoRW5kLmJpbmQodGhpcykpOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignY29udGV4dG1lbnUnLCB0aGlzLl9vbkNvbnRleHRNZW51LmJpbmQodGhpcykpOwogICAgICB9CgogICAgICBfb25Db250ZXh0TWVudShlKSB7CiAgICAgICAgaWYgKHRoaXMuaGFzQXR0cmlidXRlKCdyZW9yZGVyaW5nJykpIHsKICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9vblRvdWNoU3RhcnQoZSkgewogICAgICAgIC8vIFRvdWNoIGV2ZW50LCBkZWxheSBhY3RpdmF0aW9uIGJ5IDEwMG1zCiAgICAgICAgdGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0ID0gc2V0VGltZW91dCgoKSA9PiB7CiAgICAgICAgICB0aGlzLl9vblRyYWNrU3RhcnQoewogICAgICAgICAgICBkZXRhaWw6IHsKICAgICAgICAgICAgICB4OiBlLnRvdWNoZXNbMF0uY2xpZW50WCwKICAgICAgICAgICAgICB5OiBlLnRvdWNoZXNbMF0uY2xpZW50WQogICAgICAgICAgICB9CiAgICAgICAgICB9KTsKICAgICAgICB9LCAxMDApOwogICAgICB9CgogICAgICBfb25Ub3VjaE1vdmUoZSkgewogICAgICAgIGlmICh0aGlzLl9kcmFnZ2VkQ29sdW1uKSB7CiAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zdGFydFRvdWNoUmVvcmRlclRpbWVvdXQpOwogICAgICB9CgogICAgICBfb25Ub3VjaEVuZCgpIHsKICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fc3RhcnRUb3VjaFJlb3JkZXJUaW1lb3V0KTsKICAgICAgICB0aGlzLl9vblRyYWNrRW5kKCk7CiAgICAgIH0KCiAgICAgIF9vblRyYWNrRXZlbnQoZSkgewogICAgICAgIGlmIChlLmRldGFpbC5zdGF0ZSA9PT0gJ3N0YXJ0JykgewogICAgICAgICAgY29uc3QgcGF0aCA9IGUuY29tcG9zZWRQYXRoKCk7CiAgICAgICAgICBjb25zdCBoZWFkZXJDZWxsID0gcGF0aFtwYXRoLmluZGV4T2YodGhpcy4kLmhlYWRlcikgLSAyXTsKICAgICAgICAgIGlmICghaGVhZGVyQ2VsbCB8fCAhaGVhZGVyQ2VsbC5fY29udGVudCkgewogICAgICAgICAgICAvLyBOb3QgYSBoZWFkZXIgY29sdW1uCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5nZXRSb290Tm9kZSgpLmFjdGl2ZUVsZW1lbnQ7CiAgICAgICAgICBpZiAoaGVhZGVyQ2VsbC5fY29udGVudC5jb250YWlucyh0aGlzLmdldFJvb3ROb2RlKCkuYWN0aXZlRWxlbWVudCkKICAgICAgICAgICAgICAmJiAoIXRoaXMuX2llIHx8ICF0aGlzLl9pc0ZvY3VzYWJsZShhY3RpdmVFbGVtZW50KSkpIHsKICAgICAgICAgICAgLy8gU29tZXRoaW5nIHdhcyBmb2N1c2VkIGluc2lkZSB0aGUgY2VsbAogICAgICAgICAgICByZXR1cm47CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKHRoaXMuJC5zY3JvbGxlci5oYXNBdHRyaWJ1dGUoJ2NvbHVtbi1yZXNpemluZycpKSB7CiAgICAgICAgICAgIC8vIFJlc2l6aW5nIGlzIGluIHByb2dyZXNzCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoIXRoaXMuX3RvdWNoRGV2aWNlKSB7CiAgICAgICAgICAgIC8vIE5vdCBhIHRvdWNoIGRldmljZQogICAgICAgICAgICB0aGlzLl9vblRyYWNrU3RhcnQoZSk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIGlmIChlLmRldGFpbC5zdGF0ZSA9PT0gJ3RyYWNrJykgewogICAgICAgICAgdGhpcy5fb25UcmFjayhlKTsKICAgICAgICB9IGVsc2UgaWYgKGUuZGV0YWlsLnN0YXRlID09PSAnZW5kJykgewogICAgICAgICAgdGhpcy5fb25UcmFja0VuZChlKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9vblRyYWNrU3RhcnQoZSkgewogICAgICAgIGlmICghdGhpcy5jb2x1bW5SZW9yZGVyaW5nQWxsb3dlZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgLy8gQ2FuY2VsIHJlb3JkZXJpbmcgaWYgdGhlcmUgYXJlIGRyYWdnYWJsZSBub2RlcyBvbiB0aGUgZXZlbnQgcGF0aAogICAgICAgIGNvbnN0IHBhdGggPSBlLnBhdGggfHwgZG9tKGUpLnBhdGg7CiAgICAgICAgaWYgKHBhdGggJiYgcGF0aC5maWx0ZXIobm9kZSA9PiBub2RlLmhhc0F0dHJpYnV0ZSAmJiBub2RlLmhhc0F0dHJpYnV0ZSgnZHJhZ2dhYmxlJykpWzBdKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBjb25zdCBoZWFkZXJDZWxsID0gdGhpcy5fY2VsbEZyb21Qb2ludChlLmRldGFpbC54LCBlLmRldGFpbC55KTsKICAgICAgICBpZiAoIWhlYWRlckNlbGwgfHwgaGVhZGVyQ2VsbC5nZXRBdHRyaWJ1dGUoJ3BhcnQnKS5pbmRleE9mKCdoZWFkZXItY2VsbCcpID09PSAtMSkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdyZW9yZGVyaW5nJywgdHJ1ZSwgdGhpcyk7CiAgICAgICAgdGhpcy5fZHJhZ2dlZENvbHVtbiA9IGhlYWRlckNlbGwuX2NvbHVtbjsKICAgICAgICB3aGlsZSAodGhpcy5fZHJhZ2dlZENvbHVtbi5wYXJlbnRFbGVtZW50LmNoaWxkRWxlbWVudENvdW50ID09PSAxKSB7CiAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBvbmx5IGNvbHVtbiBpbiB0aGUgZ3JvdXAsIGRyYWcgdGhlIHdob2xlIGdyb3VwIGluc3RlYWQKICAgICAgICAgIHRoaXMuX2RyYWdnZWRDb2x1bW4gPSB0aGlzLl9kcmFnZ2VkQ29sdW1uLnBhcmVudEVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCAnYWxsb3dlZCcpOwogICAgICAgIHRoaXMuX2RyYWdnZWRDb2x1bW4uX3Jlb3JkZXJTdGF0dXMgPSAnZHJhZ2dpbmcnOwoKICAgICAgICB0aGlzLl91cGRhdGVHaG9zdChoZWFkZXJDZWxsKTsKICAgICAgICB0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKICAgICAgICB0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGUuZGV0YWlsLngsIHRoaXMuX3RvdWNoRGV2aWNlID8gZS5kZXRhaWwueSAtIDUwIDogZS5kZXRhaWwueSk7CiAgICAgICAgdGhpcy5fYXV0b1Njcm9sbGVyKCk7CiAgICAgIH0KCiAgICAgIF9vblRyYWNrKGUpIHsKICAgICAgICBpZiAoIXRoaXMuX2RyYWdnZWRDb2x1bW4pIHsKICAgICAgICAgIC8vIFJlb3JkZXJpbmcgZGlkbuKAmXQgc3RhcnQuIFNraXAgdGhpcyBldmVudC4KICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHRhcmdldENlbGwgPSB0aGlzLl9jZWxsRnJvbVBvaW50KGUuZGV0YWlsLngsIGUuZGV0YWlsLnkpOwogICAgICAgIGlmICghdGFyZ2V0Q2VsbCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgY29uc3QgdGFyZ2V0Q29sdW1uID0gdGhpcy5fZ2V0VGFyZ2V0Q29sdW1uKHRhcmdldENlbGwsIHRoaXMuX2RyYWdnZWRDb2x1bW4pOwogICAgICAgIGlmICh0aGlzLl9pc1N3YXBBbGxvd2VkKHRoaXMuX2RyYWdnZWRDb2x1bW4sIHRhcmdldENvbHVtbikgJiYKICAgICAgICAgIHRoaXMuX2lzU3dhcHBhYmxlQnlQb3NpdGlvbih0YXJnZXRDb2x1bW4sIGUuZGV0YWlsLngpKSB7CiAgICAgICAgICB0aGlzLl9zd2FwQ29sdW1uT3JkZXJzKHRoaXMuX2RyYWdnZWRDb2x1bW4sIHRhcmdldENvbHVtbik7CiAgICAgICAgfQoKICAgICAgICB0aGlzLl91cGRhdGVHaG9zdFBvc2l0aW9uKGUuZGV0YWlsLngsIHRoaXMuX3RvdWNoRGV2aWNlID8gZS5kZXRhaWwueSAtIDUwIDogZS5kZXRhaWwueSk7CiAgICAgICAgdGhpcy5fbGFzdERyYWdDbGllbnRYID0gZS5kZXRhaWwueDsKICAgICAgfQoKICAgICAgX29uVHJhY2tFbmQoKSB7CiAgICAgICAgaWYgKCF0aGlzLl9kcmFnZ2VkQ29sdW1uKSB7CiAgICAgICAgICAvLyBSZW9yZGVyaW5nIGRpZG7igJl0IHN0YXJ0LiBTa2lwIHRoaXMgZXZlbnQuCiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aGlzLl90b2dnbGVBdHRyaWJ1dGUoJ3Jlb3JkZXJpbmcnLCBmYWxzZSwgdGhpcyk7CiAgICAgICAgdGhpcy5fZHJhZ2dlZENvbHVtbi5fcmVvcmRlclN0YXR1cyA9ICcnOwogICAgICAgIHRoaXMuX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyh0aGlzLl9kcmFnZ2VkQ29sdW1uLCAnJyk7CiAgICAgICAgdGhpcy5fZHJhZ2dlZENvbHVtbiA9IG51bGw7CiAgICAgICAgdGhpcy5fbGFzdERyYWdDbGllbnRYID0gbnVsbDsKICAgICAgICB0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwoKICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdjb2x1bW4tcmVvcmRlcicsIHtkZXRhaWw6IHsKICAgICAgICAgIGNvbHVtbnM6IHRoaXMuX2dldENvbHVtbnNJbk9yZGVyKCkKICAgICAgICB9fSkpOwogICAgICB9CgogICAgICBfZ2V0Q29sdW1uc0luT3JkZXIoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtblRyZWUuc2xpY2UoMCkucG9wKCkKICAgICAgICAgIC5maWx0ZXIoYyA9PiAhYy5oaWRkZW4pCiAgICAgICAgICAuc29ydCgoYiwgYSkgPT4gKGIuX29yZGVyIC0gYS5fb3JkZXIpKTsKICAgICAgfQoKICAgICAgX2NlbGxGcm9tUG9pbnQoeCwgeSkgewogICAgICAgIHggPSB4IHx8IDA7CiAgICAgICAgeSA9IHkgfHwgMDsKICAgICAgICBpZiAoIXRoaXMuX2RyYWdnZWRDb2x1bW4pIHsKICAgICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnbm8tY29udGVudC1wb2ludGVyLWV2ZW50cycsIHRydWUsIHRoaXMuJC5zY3JvbGxlcik7CiAgICAgICAgfQogICAgICAgIGxldCBjZWxsOwogICAgICAgIGlmICh1c2VTaGFkb3cpIHsKICAgICAgICAgIGNlbGwgPSB0aGlzLnNoYWRvd1Jvb3QuZWxlbWVudEZyb21Qb2ludCh4LCB5KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY2VsbCA9IGRvY3VtZW50LmVsZW1lbnRGcm9tUG9pbnQoeCwgeSk7CgogICAgICAgICAgLy8gV29ya2Fyb3VuZCBhIEZGNTggYnVnCiAgICAgICAgICBpZiAoY2VsbC5sb2NhbE5hbWUgPT09ICd2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQnKSB7CiAgICAgICAgICAgIGNlbGwgPSBjZWxsLmFzc2lnbmVkU2xvdC5wYXJlbnROb2RlOwogICAgICAgICAgfQoKICAgICAgICB9CiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCduby1jb250ZW50LXBvaW50ZXItZXZlbnRzJywgZmFsc2UsIHRoaXMuJC5zY3JvbGxlcik7CgogICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgZWxlbWVudCBpcyBhY3R1YWxseSBhIGNlbGwKICAgICAgICBpZiAoY2VsbCAmJiBjZWxsLl9jb2x1bW4pIHsKICAgICAgICAgIHJldHVybiBjZWxsOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3VwZGF0ZUdob3N0UG9zaXRpb24oZXZlbnRDbGllbnRYLCBldmVudENsaWVudFkpIHsKICAgICAgICBjb25zdCBnaG9zdFJlY3QgPSB0aGlzLl9yZW9yZGVyR2hvc3QuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgLy8gLy8gVGhpcyBpcyB3aGVyZSB3ZSB3YW50IHRvIHBvc2l0aW9uIHRoZSBnaG9zdAogICAgICAgIGNvbnN0IHRhcmdldExlZnQgPSBldmVudENsaWVudFggLSBnaG9zdFJlY3Qud2lkdGggLyAyOwogICAgICAgIGNvbnN0IHRhcmdldFRvcCA9IGV2ZW50Q2xpZW50WSAtIGdob3N0UmVjdC5oZWlnaHQgLyAyOwogICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24KICAgICAgICBjb25zdCBfbGVmdCA9IHBhcnNlSW50KHRoaXMuX3Jlb3JkZXJHaG9zdC5fbGVmdCB8fCAwKTsKICAgICAgICBjb25zdCBfdG9wID0gcGFyc2VJbnQodGhpcy5fcmVvcmRlckdob3N0Ll90b3AgfHwgMCk7CiAgICAgICAgLy8gUmVwb3NpdGlvbiB0aGUgZ2hvc3QKICAgICAgICB0aGlzLl9yZW9yZGVyR2hvc3QuX2xlZnQgPSBfbGVmdCAtIChnaG9zdFJlY3QubGVmdCAtIHRhcmdldExlZnQpOwogICAgICAgIHRoaXMuX3Jlb3JkZXJHaG9zdC5fdG9wID0gX3RvcCAtIChnaG9zdFJlY3QudG9wIC0gdGFyZ2V0VG9wKTsKICAgICAgICB0aGlzLl9yZW9yZGVyR2hvc3Quc3R5bGUudHJhbnNmb3JtID0gYHRyYW5zbGF0ZSgke3RoaXMuX3Jlb3JkZXJHaG9zdC5fbGVmdH1weCwgJHt0aGlzLl9yZW9yZGVyR2hvc3QuX3RvcH1weClgOwogICAgICB9CgogICAgICBfZ2V0SW5uZXJUZXh0KGUpIHsKICAgICAgICBpZiAoZS5sb2NhbE5hbWUpIHsKICAgICAgICAgIC8vIEN1c3RvbSBpbXBsZW1lbnRhdGlvbiBuZWVkZWQgc2luY2UgSUUxMSBkb2Vzbid0IHJlc3BlY3QgdGhlIHNwZWMgaW4gY2FzZSBvZiBoaWRkZW4gZWxlbWVudHMKICAgICAgICAgIGlmIChnZXRDb21wdXRlZFN0eWxlKGUpLmRpc3BsYXkgPT09ICdub25lJykgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShlLmNoaWxkTm9kZXMpLm1hcChuID0+IHRoaXMuX2dldElubmVyVGV4dChuKSkuam9pbignJyk7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHJldHVybiBlLnRleHRDb250ZW50OwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3VwZGF0ZUdob3N0KGNlbGwpIHsKICAgICAgICBjb25zdCBnaG9zdCA9IHRoaXMuX3Jlb3JkZXJHaG9zdDsKICAgICAgICBnaG9zdC50ZXh0Q29udGVudCA9IHRoaXMuX2dldElubmVyVGV4dChjZWxsLl9jb250ZW50KTsKICAgICAgICBjb25zdCBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGNlbGwpOwogICAgICAgIFsnYm94U2l6aW5nJywgJ2Rpc3BsYXknLCAnd2lkdGgnLCAnaGVpZ2h0JywgJ2JhY2tncm91bmQnLCAnYWxpZ25JdGVtcycsICdwYWRkaW5nJywgJ2JvcmRlcicsICdmbGV4LWRpcmVjdGlvbicsICdvdmVyZmxvdyddCiAgICAgICAgICAuZm9yRWFjaChwcm9wZXJ0eU5hbWUgPT4gZ2hvc3Quc3R5bGVbcHJvcGVydHlOYW1lXSA9IHN0eWxlW3Byb3BlcnR5TmFtZV0pOwogICAgICAgIHJldHVybiBnaG9zdDsKICAgICAgfQoKICAgICAgX3VwZGF0ZU9yZGVycyhjb2x1bW5UcmVlLCBzcGxpY2VzKSB7CiAgICAgICAgaWYgKGNvbHVtblRyZWUgPT09IHVuZGVmaW5lZCB8fCBzcGxpY2VzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIC8vIFJlc2V0IGFsbCBjb2x1bW4gb3JkZXJzCiAgICAgICAgY29sdW1uVHJlZVswXS5mb3JFYWNoKChjb2x1bW4sIGluZGV4KSA9PiBjb2x1bW4uX29yZGVyID0gMCk7CiAgICAgICAgLy8gU2V0IG9yZGVyIG51bWJlcnMgdG8gdG9wLWxldmVsIGNvbHVtbnMKICAgICAgICBjb2x1bW5UcmVlWzBdLmZvckVhY2goKGNvbHVtbiwgaW5kZXgpID0+IGNvbHVtbi5fb3JkZXIgPSAoaW5kZXggKyAxKSAqIHRoaXMuX29yZGVyQmFzZVNjb3BlKTsKICAgICAgfQoKICAgICAgX3NldFNpYmxpbmdzUmVvcmRlclN0YXR1cyhjb2x1bW4sIHN0YXR1cykgewogICAgICAgIEFycmF5LmZyb20oY29sdW1uLnBhcmVudE5vZGUuY2hpbGRyZW4pCiAgICAgICAgICAuZmlsdGVyKGNoaWxkID0+IC9jb2x1bW4vLnRlc3QoY2hpbGQubG9jYWxOYW1lKSAmJiB0aGlzLl9pc1N3YXBBbGxvd2VkKGNoaWxkLCBjb2x1bW4pKQogICAgICAgICAgLmZvckVhY2goc2libGluZyA9PiBzaWJsaW5nLl9yZW9yZGVyU3RhdHVzID0gc3RhdHVzKTsKICAgICAgfQoKICAgICAgX2F1dG9TY3JvbGxlcigpIHsKICAgICAgICBpZiAodGhpcy5fbGFzdERyYWdDbGllbnRYKSB7CiAgICAgICAgICBjb25zdCByaWdodERpZmYgPSB0aGlzLl9sYXN0RHJhZ0NsaWVudFggLSB0aGlzLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnJpZ2h0ICsgNTA7CiAgICAgICAgICBjb25zdCBsZWZ0RGlmZiA9IHRoaXMuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkubGVmdCAtIHRoaXMuX2xhc3REcmFnQ2xpZW50WCArIDUwOwoKICAgICAgICAgIGlmIChyaWdodERpZmYgPiAwKSB7CiAgICAgICAgICAgIHRoaXMuJC50YWJsZS5zY3JvbGxMZWZ0ICs9IHJpZ2h0RGlmZiAvIDEwOwogICAgICAgICAgfSBlbHNlIGlmIChsZWZ0RGlmZiA+IDApIHsKICAgICAgICAgICAgdGhpcy4kLnRhYmxlLnNjcm9sbExlZnQgLT0gbGVmdERpZmYgLyAxMDsKICAgICAgICAgIH0KICAgICAgICAgIHRoaXMuX3Njcm9sbEhhbmRsZXIoKTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLl9kcmFnZ2VkQ29sdW1uKSB7CiAgICAgICAgICB0aGlzLmFzeW5jKHRoaXMuX2F1dG9TY3JvbGxlciwgMTApOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2lzU3dhcEFsbG93ZWQoY29sdW1uMSwgY29sdW1uMikgewogICAgICAgIGlmIChjb2x1bW4xICYmIGNvbHVtbjIpIHsKICAgICAgICAgIGNvbnN0IGRpZmZlcmVudENvbHVtbnMgPSBjb2x1bW4xICE9PSBjb2x1bW4yOwogICAgICAgICAgY29uc3Qgc2FtZVBhcmVudCA9IGNvbHVtbjEucGFyZW50RWxlbWVudCA9PT0gY29sdW1uMi5wYXJlbnRFbGVtZW50OwogICAgICAgICAgY29uc3Qgc2FtZUZyb3plbiA9IGNvbHVtbjEuZnJvemVuID09PSBjb2x1bW4yLmZyb3plbjsKICAgICAgICAgIHJldHVybiBkaWZmZXJlbnRDb2x1bW5zICYmIHNhbWVQYXJlbnQgJiYgc2FtZUZyb3plbjsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9pc1N3YXBwYWJsZUJ5UG9zaXRpb24odGFyZ2V0Q29sdW1uLCBjbGllbnRYKSB7CiAgICAgICAgY29uc3QgdGFyZ2V0Q2VsbCA9CiAgICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5oZWFkZXIucXVlcnlTZWxlY3RvckFsbCgndHI6bm90KFtoaWRkZW5dKSBbcGFydH49ImNlbGwiXScpKS5maWx0ZXIoY2VsbCA9PiB0YXJnZXRDb2x1bW4uY29udGFpbnMoY2VsbC5fY29sdW1uKSlbMF07CiAgICAgICAgY29uc3Qgc291cmNlQ2VsbFJlY3QgPSB0aGlzLiQuaGVhZGVyLnF1ZXJ5U2VsZWN0b3IoJ3RyOm5vdChbaGlkZGVuXSkgW3Jlb3JkZXItc3RhdHVzPWRyYWdnaW5nXScpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGNvbnN0IHRhcmdldFJlY3QgPSB0YXJnZXRDZWxsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIGlmICh0YXJnZXRSZWN0LmxlZnQgPiBzb3VyY2VDZWxsUmVjdC5sZWZ0KSB7CiAgICAgICAgICByZXR1cm4gY2xpZW50WCA+IHRhcmdldFJlY3QucmlnaHQgLSBzb3VyY2VDZWxsUmVjdC53aWR0aDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgcmV0dXJuIGNsaWVudFggPCB0YXJnZXRSZWN0LmxlZnQgKyBzb3VyY2VDZWxsUmVjdC53aWR0aDsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9zd2FwQ29sdW1uT3JkZXJzKGNvbHVtbjEsIGNvbHVtbjIpIHsKICAgICAgICBjb25zdCBfb3JkZXIgPSBjb2x1bW4xLl9vcmRlcjsKICAgICAgICBjb2x1bW4xLl9vcmRlciA9IGNvbHVtbjIuX29yZGVyOwogICAgICAgIGNvbHVtbjIuX29yZGVyID0gX29yZGVyOwogICAgICAgIHRoaXMuX3VwZGF0ZUxhc3RGcm96ZW4oKTsKICAgICAgICB0aGlzLl91cGRhdGVGaXJzdEFuZExhc3RDb2x1bW4oKTsKICAgICAgfQoKICAgICAgX2dldFRhcmdldENvbHVtbih0YXJnZXRDZWxsLCBkcmFnZ2VkQ29sdW1uKSB7CiAgICAgICAgaWYgKHRhcmdldENlbGwgJiYgZHJhZ2dlZENvbHVtbikgewogICAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHRhcmdldENlbGwuX2NvbHVtbjsKICAgICAgICAgIHdoaWxlIChjYW5kaWRhdGUucGFyZW50RWxlbWVudCAhPT0gZHJhZ2dlZENvbHVtbi5wYXJlbnRFbGVtZW50ICYmIGNhbmRpZGF0ZSAhPT0gdGhpcykgewogICAgICAgICAgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUucGFyZW50RWxlbWVudDsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChjYW5kaWRhdGUucGFyZW50RWxlbWVudCA9PT0gZHJhZ2dlZENvbHVtbi5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgIHJldHVybiBjYW5kaWRhdGU7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICByZXR1cm4gdGFyZ2V0Q2VsbC5fY29sdW1uOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEZpcmVkIHdoZW4gdGhlIGNvbHVtbnMgaW4gdGhlIGdyaWQgYXJlIHJlb3JkZXJlZC4KICAgICAgICoKICAgICAgICogQGV2ZW50IGNvbHVtbi1yZW9yZGVyCiAgICAgICAqIEBwYXJhbSB7T2JqZWN0fSBkZXRhaWwKICAgICAgICogQHBhcmFtIHtPYmplY3R9IGRldGFpbC5jb2x1bW5zIHRoZSBjb2x1bW5zIGluIHRoZSBuZXcgb3JkZXIKICAgICAgICovCiAgICB9OwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxOCBWYWFkaW4gTHRkLgogICAgVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgKi8KCiAgICAvKioKICAgICAqIEBwb2x5bWVyTWl4aW4KICAgICAqLwogICAgY29uc3QgQ29sdW1uQmFzZU1peGluID0gc3VwZXJDbGFzcyA9PiBjbGFzcyBDb2x1bW5CYXNlTWl4aW4gZXh0ZW5kcyBzdXBlckNsYXNzIHsKICAgICAgc3RhdGljIGdldCBwcm9wZXJ0aWVzKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAvKioKICAgICAgICAgICAqIFdoZW4gc2V0IHRvIHRydWUsIHRoZSBjb2x1bW4gaXMgdXNlci1yZXNpemFibGUuCiAgICAgICAgICAgKiBAZGVmYXVsdCBmYWxzZQogICAgICAgICAgICovCiAgICAgICAgICByZXNpemFibGU6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIGlmICh0aGlzLmxvY2FsTmFtZSA9PT0gJ3ZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCcpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgICAgICAgICBpZiAocGFyZW50ICYmIHBhcmVudC5sb2NhbE5hbWUgPT09ICd2YWFkaW4tZ3JpZC1jb2x1bW4tZ3JvdXAnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LnJlc2l6YWJsZSB8fCBmYWxzZTsKICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfSwKCiAgICAgICAgICBfaGVhZGVyVGVtcGxhdGU6IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0CiAgICAgICAgICB9LAoKICAgICAgICAgIF9mb290ZXJUZW1wbGF0ZTogewogICAgICAgICAgICB0eXBlOiBPYmplY3QKICAgICAgICAgIH0sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBXaGVuIHRydWUsIHRoZSBjb2x1bW4gaXMgZnJvemVuLiBXaGVuIGEgY29sdW1uIGluc2lkZSBvZiBhIGNvbHVtbiBncm91cCBpcyBmcm96ZW4sCiAgICAgICAgICAgKiBhbGwgb2YgdGhlIHNpYmxpbmcgY29sdW1ucyBpbnNpZGUgdGhlIGdyb3VwIHdpbGwgZ2V0IGZyb3plbiBhbHNvLgogICAgICAgICAgICovCiAgICAgICAgICBmcm96ZW46IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIGNlbGxzIGZvciB0aGlzIGNvbHVtbiBhcmUgaGlkZGVuLgogICAgICAgICAgICovCiAgICAgICAgICBoaWRkZW46IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbgogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIFRleHQgY29udGVudCB0byBkaXNwbGF5IGluIHRoZSBoZWFkZXIgY2VsbCBvZiB0aGUgY29sdW1uLgogICAgICAgICAgICovCiAgICAgICAgICBoZWFkZXI6IHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQWxpZ25zIHRoZSBjb2x1bW5zIGNlbGwgY29udGVudCBob3Jpem9udGFsbHkuCiAgICAgICAgICAgKiBTdXBwb3J0ZWQgdmFsdWVzOiAic3RhcnQiLCAiY2VudGVyIiBhbmQgImVuZCIuCiAgICAgICAgICAgKi8KICAgICAgICAgIHRleHRBbGlnbjogewogICAgICAgICAgICB0eXBlOiBTdHJpbmcKICAgICAgICAgIH0sCgogICAgICAgICAgX2xhc3RGcm96ZW46IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IGZhbHNlCiAgICAgICAgICB9LAoKICAgICAgICAgIF9vcmRlcjogTnVtYmVyLAoKICAgICAgICAgIF9yZW9yZGVyU3RhdHVzOiBCb29sZWFuLAoKICAgICAgICAgIF9lbXB0eUNlbGxzOiBBcnJheSwKCiAgICAgICAgICBfaGVhZGVyQ2VsbDogT2JqZWN0LAoKICAgICAgICAgIF9mb290ZXJDZWxsOiBPYmplY3QsCgogICAgICAgICAgX2dyaWQ6IE9iamVjdCwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEN1c3RvbSBmdW5jdGlvbiBmb3IgcmVuZGVyaW5nIHRoZSBoZWFkZXIgY29udGVudC4KICAgICAgICAgICAqIFJlY2VpdmVzIHR3byBhcmd1bWVudHM6CiAgICAgICAgICAgKgogICAgICAgICAgICogLSBgcm9vdGAgVGhlIGhlYWRlciBjZWxsIGNvbnRlbnQgRE9NIGVsZW1lbnQuIEFwcGVuZCB5b3VyIGNvbnRlbnQgdG8gaXQuCiAgICAgICAgICAgKiAtIGBjb2x1bW5gIFRoZSBgPHZhYWRpbi1ncmlkLWNvbHVtbj5gIGVsZW1lbnQuCiAgICAgICAgICAgKi8KICAgICAgICAgIGhlYWRlclJlbmRlcmVyOiBGdW5jdGlvbiwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEN1c3RvbSBmdW5jdGlvbiBmb3IgcmVuZGVyaW5nIHRoZSBmb290ZXIgY29udGVudC4KICAgICAgICAgICAqIFJlY2VpdmVzIHR3byBhcmd1bWVudHM6CiAgICAgICAgICAgKgogICAgICAgICAgICogLSBgcm9vdGAgVGhlIGZvb3RlciBjZWxsIGNvbnRlbnQgRE9NIGVsZW1lbnQuIEFwcGVuZCB5b3VyIGNvbnRlbnQgdG8gaXQuCiAgICAgICAgICAgKiAtIGBjb2x1bW5gIFRoZSBgPHZhYWRpbi1ncmlkLWNvbHVtbj5gIGVsZW1lbnQuCiAgICAgICAgICAgKi8KICAgICAgICAgIGZvb3RlclJlbmRlcmVyOiBGdW5jdGlvbgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgb2JzZXJ2ZXJzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAnX3dpZHRoQ2hhbmdlZCh3aWR0aCwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKiknLAogICAgICAgICAgJ19mcm96ZW5DaGFuZ2VkKGZyb3plbiwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKiknLAogICAgICAgICAgJ19mbGV4R3Jvd0NoYW5nZWQoZmxleEdyb3csIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopJywKICAgICAgICAgICdfcGF0aE9ySGVhZGVyQ2hhbmdlZChwYXRoLCBoZWFkZXIsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiosIHJlbmRlcmVyLCBoZWFkZXJSZW5kZXJlciwgX2JvZHlUZW1wbGF0ZSwgX2hlYWRlclRlbXBsYXRlKScsCiAgICAgICAgICAnX3RleHRBbGlnbkNoYW5nZWQodGV4dEFsaWduLCBfY2VsbHMuKiwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsKScsCiAgICAgICAgICAnX29yZGVyQ2hhbmdlZChfb3JkZXIsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCwgX2NlbGxzLiopJywKICAgICAgICAgICdfbGFzdEZyb3plbkNoYW5nZWQoX2xhc3RGcm96ZW4pJywKICAgICAgICAgICdfc2V0Qm9keVRlbXBsYXRlT3JSZW5kZXJlcihfYm9keVRlbXBsYXRlLCByZW5kZXJlciwgX2NlbGxzLCBfY2VsbHMuKiknLAogICAgICAgICAgJ19zZXRIZWFkZXJUZW1wbGF0ZU9yUmVuZGVyZXIoX2hlYWRlclRlbXBsYXRlLCBoZWFkZXJSZW5kZXJlciwgX2hlYWRlckNlbGwpJywKICAgICAgICAgICdfc2V0Rm9vdGVyVGVtcGxhdGVPclJlbmRlcmVyKF9mb290ZXJUZW1wbGF0ZSwgZm9vdGVyUmVuZGVyZXIsIF9mb290ZXJDZWxsKScsCiAgICAgICAgICAnX3Jlc2l6YWJsZUNoYW5nZWQocmVzaXphYmxlLCBfaGVhZGVyQ2VsbCknLAogICAgICAgICAgJ19yZW9yZGVyU3RhdHVzQ2hhbmdlZChfcmVvcmRlclN0YXR1cywgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKiknLAogICAgICAgICAgJ19oaWRkZW5DaGFuZ2VkKGhpZGRlbiwgX2hlYWRlckNlbGwsIF9mb290ZXJDZWxsLCBfY2VsbHMuKiknCiAgICAgICAgXTsKICAgICAgfQoKICAgICAgLyoqIEBwcm90ZWN0ZWQgKi8KICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKCiAgICAgICAgdGhpcy5fYm9keVRlbXBsYXRlICYmICh0aGlzLl9ib2R5VGVtcGxhdGUudGVtcGxhdGl6ZXIuX2dyaWQgPSB0aGlzLl9ncmlkKTsKICAgICAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZSAmJiAodGhpcy5faGVhZGVyVGVtcGxhdGUudGVtcGxhdGl6ZXIuX2dyaWQgPSB0aGlzLl9ncmlkKTsKICAgICAgICB0aGlzLl9mb290ZXJUZW1wbGF0ZSAmJiAodGhpcy5fZm9vdGVyVGVtcGxhdGUudGVtcGxhdGl6ZXIuX2dyaWQgPSB0aGlzLl9ncmlkKTsKCiAgICAgICAgdGhpcy5fdGVtcGxhdGVPYnNlcnZlci5mbHVzaCgpOwogICAgICAgIGlmICghdGhpcy5fYm9keVRlbXBsYXRlKSB7CiAgICAgICAgICAvLyBUaGUgb2JzZXJ2ZXIgbWlnaHQgbm90IGhhdmUgdHJpZ2dlcmVkIGlmIHRoZSB0YWcgaXMgZW1wdHkuIFJ1biBtYW51YWxseS4KICAgICAgICAgIHRoaXMuX3RlbXBsYXRlT2JzZXJ2ZXIuY2FsbGJhY2soKTsKICAgICAgICB9CgogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICB0aGlzLl9hbGxDZWxscy5mb3JFYWNoKGNlbGwgPT4gewogICAgICAgICAgICBpZiAoIWNlbGwuX2NvbnRlbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgIHRoaXMuX2dyaWQgJiYgdGhpcy5fZ3JpZC5hcHBlbmRDaGlsZChjZWxsLl9jb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIC8qKiBAcHJvdGVjdGVkICovCiAgICAgIGRpc2Nvbm5lY3RlZENhbGxiYWNrKCkgewogICAgICAgIHN1cGVyLmRpc2Nvbm5lY3RlZENhbGxiYWNrKCk7CgogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiB7CiAgICAgICAgICBpZiAoIXRoaXMuX2ZpbmRIb3N0R3JpZCgpKSB7CiAgICAgICAgICAgIHRoaXMuX2FsbENlbGxzLmZvckVhY2goY2VsbCA9PiB7CiAgICAgICAgICAgICAgaWYgKGNlbGwuX2NvbnRlbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgY2VsbC5fY29udGVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNlbGwuX2NvbnRlbnQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHRoaXMuX2dyaWRWYWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgfQoKICAgICAgX2ZpbmRIb3N0R3JpZCgpIHsKICAgICAgICBsZXQgZWwgPSB0aGlzOwogICAgICAgIC8vIEN1c3RvbSBlbGVtZW50cyBleHRlbmRpbmcgZ3JpZCBtdXN0IGhhdmUgYSBzcGVjaWZpYyBsb2NhbE5hbWUKICAgICAgICB3aGlsZSAoZWwgJiYgIS9edmFhZGluLipncmlkKC1wcm8pPyQvLnRlc3QoZWwubG9jYWxOYW1lKSkgewogICAgICAgICAgZWwgPSBlbC5hc3NpZ25lZFNsb3QgPyBlbC5hc3NpZ25lZFNsb3QucGFyZW50Tm9kZSA6IGVsLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBlbCB8fCB1bmRlZmluZWQ7CiAgICAgIH0KCiAgICAgIGdldCBfZ3JpZCgpIHsKICAgICAgICBpZiAoIXRoaXMuX2dyaWRWYWx1ZSkgewogICAgICAgICAgdGhpcy5fZ3JpZFZhbHVlID0gdGhpcy5fZmluZEhvc3RHcmlkKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0aGlzLl9ncmlkVmFsdWU7CiAgICAgIH0KCiAgICAgIGdldCBfYWxsQ2VsbHMoKSB7CiAgICAgICAgcmV0dXJuIFtdCiAgICAgICAgICAuY29uY2F0KHRoaXMuX2NlbGxzIHx8IFtdKQogICAgICAgICAgLmNvbmNhdCh0aGlzLl9lbXB0eUNlbGxzIHx8IFtdKQogICAgICAgICAgLmNvbmNhdCh0aGlzLl9oZWFkZXJDZWxsKQogICAgICAgICAgLmNvbmNhdCh0aGlzLl9mb290ZXJDZWxsKQogICAgICAgICAgLmZpbHRlcihjZWxsID0+IGNlbGwpOwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwoKICAgICAgICB0aGlzLl90ZW1wbGF0ZU9ic2VydmVyID0gbmV3IEZsYXR0ZW5lZE5vZGVzT2JzZXJ2ZXIodGhpcywgaW5mbyA9PiB7CiAgICAgICAgICB0aGlzLl9oZWFkZXJUZW1wbGF0ZSA9IHRoaXMuX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpOwogICAgICAgICAgdGhpcy5fZm9vdGVyVGVtcGxhdGUgPSB0aGlzLl9wcmVwYXJlRm9vdGVyVGVtcGxhdGUoKTsKICAgICAgICAgIHRoaXMuX2JvZHlUZW1wbGF0ZSA9IHRoaXMuX3ByZXBhcmVCb2R5VGVtcGxhdGUoKTsKICAgICAgICB9KTsKICAgICAgfQoKICAgICAgX3ByZXBhcmVIZWFkZXJUZW1wbGF0ZSgpIHsKICAgICAgICByZXR1cm4gdGhpcy5fcHJlcGFyZVRlbXBsYXRpemVyKHRoaXMuX2ZpbmRUZW1wbGF0ZSh0cnVlKSB8fCBudWxsLCB7fSk7CiAgICAgIH0KCiAgICAgIF9wcmVwYXJlRm9vdGVyVGVtcGxhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoZmFsc2UsIHRydWUpIHx8IG51bGwsIHt9KTsKICAgICAgfQoKICAgICAgX3ByZXBhcmVCb2R5VGVtcGxhdGUoKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuX3ByZXBhcmVUZW1wbGF0aXplcih0aGlzLl9maW5kVGVtcGxhdGUoKSB8fCBudWxsKTsKICAgICAgfQoKICAgICAgX3ByZXBhcmVUZW1wbGF0aXplcih0ZW1wbGF0ZSwgaW5zdGFuY2VQcm9wcykgewogICAgICAgIGlmICh0ZW1wbGF0ZSAmJiAhdGVtcGxhdGUudGVtcGxhdGl6ZXIpIHsKICAgICAgICAgIGNvbnN0IHRlbXBsYXRpemVyID0gbmV3IEdyaWRUZW1wbGF0aXplcigpOwogICAgICAgICAgdGVtcGxhdGl6ZXIuX2dyaWQgPSB0aGlzLl9ncmlkOwogICAgICAgICAgdGVtcGxhdGl6ZXIuZGF0YUhvc3QgPSB0aGlzLmRhdGFIb3N0OwogICAgICAgICAgdGVtcGxhdGl6ZXIuX2luc3RhbmNlUHJvcHMgPSBpbnN0YW5jZVByb3BzIHx8IHRlbXBsYXRpemVyLl9pbnN0YW5jZVByb3BzOwogICAgICAgICAgdGVtcGxhdGl6ZXIudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKICAgICAgICAgIHRlbXBsYXRlLnRlbXBsYXRpemVyID0gdGVtcGxhdGl6ZXI7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gdGVtcGxhdGU7CiAgICAgIH0KCiAgICAgIF9yZW5kZXJIZWFkZXJBbmRGb290ZXIoKSB7CiAgICAgICAgaWYgKHRoaXMuaGVhZGVyUmVuZGVyZXIgJiYgdGhpcy5faGVhZGVyQ2VsbCkgewogICAgICAgICAgdGhpcy5fX3J1blJlbmRlcmVyKHRoaXMuaGVhZGVyUmVuZGVyZXIsIHRoaXMuX2hlYWRlckNlbGwpOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5mb290ZXJSZW5kZXJlciAmJiB0aGlzLl9mb290ZXJDZWxsKSB7CiAgICAgICAgICB0aGlzLl9fcnVuUmVuZGVyZXIodGhpcy5mb290ZXJSZW5kZXJlciwgdGhpcy5fZm9vdGVyQ2VsbCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX3J1blJlbmRlcmVyKHJlbmRlcmVyLCBjZWxsLCByb3dEYXRhKSB7CiAgICAgICAgY29uc3QgYXJncyA9IFtjZWxsLl9jb250ZW50LCB0aGlzXTsKICAgICAgICBpZiAocm93RGF0YSAmJiByb3dEYXRhLml0ZW0pIHsKICAgICAgICAgIGFyZ3MucHVzaChyb3dEYXRhKTsKICAgICAgICB9CiAgICAgICAgcmVuZGVyZXIuYXBwbHkodGhpcywgYXJncyk7CiAgICAgIH0KCiAgICAgIF9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHRlbXBsYXRlLCByZW5kZXJlciwgY2VsbHMpIHsKICAgICAgICBpZiAodGVtcGxhdGUgJiYgcmVuZGVyZXIpIHsKICAgICAgICAgIHRocm93IG5ldyBFcnJvcignWW91IHNob3VsZCBvbmx5IHVzZSBlaXRoZXIgYSByZW5kZXJlciBvciBhIHRlbXBsYXRlJyk7CiAgICAgICAgfQoKICAgICAgICBjZWxscy5mb3JFYWNoKGNlbGwgPT4gewogICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLl9ncmlkLl9fZ2V0Um93TW9kZWwoY2VsbC5wYXJlbnRFbGVtZW50KTsKCiAgICAgICAgICBpZiAocmVuZGVyZXIpIHsKICAgICAgICAgICAgY2VsbC5fcmVuZGVyZXIgPSByZW5kZXJlcjsKCiAgICAgICAgICAgIGlmIChtb2RlbC5pdGVtIHx8IHJlbmRlcmVyID09PSB0aGlzLmhlYWRlclJlbmRlcmVyIHx8IHJlbmRlcmVyID09PSB0aGlzLmZvb3RlclJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgdGhpcy5fX3J1blJlbmRlcmVyKHJlbmRlcmVyLCBjZWxsLCBtb2RlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0gZWxzZSBpZiAoY2VsbC5fdGVtcGxhdGUgIT09IHRlbXBsYXRlKSB7CiAgICAgICAgICAgIGNlbGwuX3RlbXBsYXRlID0gdGVtcGxhdGU7CgogICAgICAgICAgICBjZWxsLl9jb250ZW50LmlubmVySFRNTCA9ICcnOwogICAgICAgICAgICB0ZW1wbGF0ZS50ZW1wbGF0aXplci5fZ3JpZCA9IHRlbXBsYXRlLnRlbXBsYXRpemVyLl9ncmlkIHx8IHRoaXMuX2dyaWQ7CiAgICAgICAgICAgIGNvbnN0IGluc3QgPSB0ZW1wbGF0ZS50ZW1wbGF0aXplci5jcmVhdGVJbnN0YW5jZSgpOwogICAgICAgICAgICBjZWxsLl9jb250ZW50LmFwcGVuZENoaWxkKGluc3Qucm9vdCk7CiAgICAgICAgICAgIGNlbGwuX2luc3RhbmNlID0gaW5zdDsKICAgICAgICAgICAgaWYgKG1vZGVsLml0ZW0pIHsKICAgICAgICAgICAgICBjZWxsLl9pbnN0YW5jZS5zZXRQcm9wZXJ0aWVzKG1vZGVsKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwogICAgICB9CgogICAgICBfc2V0Qm9keVRlbXBsYXRlT3JSZW5kZXJlcih0ZW1wbGF0ZSwgcmVuZGVyZXIsIGNlbGxzLCBzcGxpY2VzKSB7CiAgICAgICAgaWYgKCh0ZW1wbGF0ZSB8fCByZW5kZXJlcikgJiYgY2VsbHMpIHsKICAgICAgICAgIHRoaXMuX19zZXRDb2x1bW5UZW1wbGF0ZU9yUmVuZGVyZXIodGVtcGxhdGUsIHJlbmRlcmVyLCBjZWxscyk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfc2V0SGVhZGVyVGVtcGxhdGVPclJlbmRlcmVyKGhlYWRlclRlbXBsYXRlLCBoZWFkZXJSZW5kZXJlciwgaGVhZGVyQ2VsbCkgewogICAgICAgIGlmICgoaGVhZGVyVGVtcGxhdGUgfHwgaGVhZGVyUmVuZGVyZXIpICYmIGhlYWRlckNlbGwpIHsKICAgICAgICAgIHRoaXMuX19zZXRDb2x1bW5UZW1wbGF0ZU9yUmVuZGVyZXIoaGVhZGVyVGVtcGxhdGUsIGhlYWRlclJlbmRlcmVyLCBbaGVhZGVyQ2VsbF0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3NldEZvb3RlclRlbXBsYXRlT3JSZW5kZXJlcihmb290ZXJUZW1wbGF0ZSwgZm9vdGVyUmVuZGVyZXIsIGZvb3RlckNlbGwpIHsKICAgICAgICBpZiAoKGZvb3RlclRlbXBsYXRlIHx8IGZvb3RlclJlbmRlcmVyKSAmJiBmb290ZXJDZWxsKSB7CiAgICAgICAgICB0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKGZvb3RlclRlbXBsYXRlLCBmb290ZXJSZW5kZXJlciwgW2Zvb3RlckNlbGxdKTsKICAgICAgICAgIHRoaXMuX2dyaWQuX191cGRhdGVIZWFkZXJGb290ZXJSb3dWaXNpYmlsaXR5KGZvb3RlckNlbGwucGFyZW50RWxlbWVudCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfc2VsZWN0Rmlyc3RUZW1wbGF0ZShoZWFkZXIgPSBmYWxzZSwgZm9vdGVyID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gRmxhdHRlbmVkTm9kZXNPYnNlcnZlci5nZXRGbGF0dGVuZWROb2Rlcyh0aGlzKQogICAgICAgICAgLmZpbHRlcihub2RlID0+CiAgICAgICAgICAgIG5vZGUubG9jYWxOYW1lID09PSAndGVtcGxhdGUnCiAgICAgICAgICAgICYmIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdoZWFkZXInKSA9PT0gaGVhZGVyCiAgICAgICAgICAgICYmIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdmb290ZXInKSA9PT0gZm9vdGVyCiAgICAgICAgICApWzBdOwogICAgICB9CgogICAgICBfZmluZFRlbXBsYXRlKGhlYWRlciwgZm9vdGVyKSB7CiAgICAgICAgY29uc3QgdGVtcGxhdGUgPSB0aGlzLl9zZWxlY3RGaXJzdFRlbXBsYXRlKGhlYWRlciwgZm9vdGVyKTsKICAgICAgICBpZiAodGVtcGxhdGUpIHsKICAgICAgICAgIGlmICh0aGlzLmRhdGFIb3N0KSB7CiAgICAgICAgICAgIC8vIHNldCBkYXRhSG9zdCB0byB0aGUgY29udGV4dCB3aGVyZSB0ZW1wbGF0ZSBoYXMgYmVlbiBkZWZpbmVkCiAgICAgICAgICAgIHRlbXBsYXRlLl9yb290RGF0YUhvc3QgPSB0aGlzLmRhdGFIb3N0Ll9yb290RGF0YUhvc3QgfHwgdGhpcy5kYXRhSG9zdDsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRlbXBsYXRlOwogICAgICB9CgogICAgICBfZmxleEdyb3dDaGFuZ2VkKGZsZXhHcm93LCBoZWFkZXJDZWxsLCBmb290ZXJDZWxsLCBjZWxscykgewogICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQgJiYgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCkgewogICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgnZmxleEdyb3cnKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2FsbENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLnN0eWxlLmZsZXhHcm93ID0gZmxleEdyb3cpOwogICAgICB9CgogICAgICBfb3JkZXJDaGFuZ2VkKG9yZGVyLCBoZWFkZXJDZWxsLCBmb290ZXJDZWxsLCBjZWxscykgewogICAgICAgIHRoaXMuX2FsbENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLnN0eWxlLm9yZGVyID0gb3JkZXIpOwogICAgICB9CgogICAgICBfd2lkdGhDaGFuZ2VkKHdpZHRoLCBoZWFkZXJDZWxsLCBmb290ZXJDZWxsLCBjZWxscykgewogICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQgJiYgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCkgewogICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgnd2lkdGgnKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2FsbENlbGxzLmZvckVhY2goY2VsbCA9PiBjZWxsLnN0eWxlLndpZHRoID0gd2lkdGgpOwoKICAgICAgICAvLyBGb3JjZSBhIHJlZmxvdyB0byB3b3JrYXJvdW5kIGJyb3dzZXIgaXNzdWVzIGNhdXNpbmcgZG91YmxlIHNjcm9sbGJhcnMgdG8gZ3JpZAogICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS92YWFkaW4vdmFhZGluLWdyaWQvaXNzdWVzLzE1ODYKICAgICAgICBpZiAodGhpcy5fZ3JpZCAmJiB0aGlzLl9ncmlkLl9fZm9yY2VSZWZsb3cpIHsKICAgICAgICAgIHRoaXMuX2dyaWQuX19mb3JjZVJlZmxvdygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX2Zyb3plbkNoYW5nZWQoZnJvemVuLCBoZWFkZXJDZWxsLCBmb290ZXJDZWxsLCBjZWxscykgewogICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQgJiYgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCkgewogICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgnZnJvemVuJywgZnJvemVuKTsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2FsbENlbGxzLmZvckVhY2goY2VsbCA9PiB0aGlzLl90b2dnbGVBdHRyaWJ1dGUoJ2Zyb3plbicsIGZyb3plbiwgY2VsbCkpOwoKICAgICAgICB0aGlzLl9ncmlkICYmIHRoaXMuX2dyaWQuX2Zyb3plbkNlbGxzQ2hhbmdlZCAmJiB0aGlzLl9ncmlkLl9mcm96ZW5DZWxsc0NoYW5nZWQoKTsKICAgICAgfQoKICAgICAgX2xhc3RGcm96ZW5DaGFuZ2VkKGxhc3RGcm96ZW4pIHsKICAgICAgICB0aGlzLl9hbGxDZWxscy5mb3JFYWNoKGNlbGwgPT4gdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdsYXN0LWZyb3plbicsIGxhc3RGcm96ZW4sIGNlbGwpKTsKCiAgICAgICAgaWYgKHRoaXMucGFyZW50RWxlbWVudCAmJiB0aGlzLnBhcmVudEVsZW1lbnQuX2NvbHVtblByb3BDaGFuZ2VkKSB7CiAgICAgICAgICB0aGlzLnBhcmVudEVsZW1lbnQuX2xhc3RGcm96ZW4gPSBsYXN0RnJvemVuOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3BhdGhPckhlYWRlckNoYW5nZWQocGF0aCwgaGVhZGVyLCBoZWFkZXJDZWxsLCBmb290ZXJDZWxsLCBjZWxscywgcmVuZGVyZXIsIGhlYWRlclJlbmRlcmVyLCBib2R5VGVtcGxhdGUsIGhlYWRlclRlbXBsYXRlKSB7CiAgICAgICAgY29uc3QgaGFzSGVhZGVyVGV4dCA9IGhlYWRlciAhPT0gdW5kZWZpbmVkOwogICAgICAgIGlmICghaGVhZGVyUmVuZGVyZXIgJiYgIWhlYWRlclRlbXBsYXRlICYmIGhhc0hlYWRlclRleHQgJiYgaGVhZGVyQ2VsbCkgewogICAgICAgICAgdGhpcy5fX3NldFRleHRDb250ZW50KGhlYWRlckNlbGwuX2NvbnRlbnQsIGhlYWRlcik7CiAgICAgICAgfQoKICAgICAgICBpZiAocGF0aCAmJiBjZWxscy52YWx1ZSkgewogICAgICAgICAgaWYgKCFyZW5kZXJlciAmJiAhYm9keVRlbXBsYXRlKSB7CiAgICAgICAgICAgIGNvbnN0IHBhdGhSZW5kZXJlciA9IChyb290LCBvd25lciwge2l0ZW19KSA9PiB0aGlzLl9fc2V0VGV4dENvbnRlbnQocm9vdCwgdGhpcy5nZXQocGF0aCwgaXRlbSkpOwogICAgICAgICAgICB0aGlzLl9fc2V0Q29sdW1uVGVtcGxhdGVPclJlbmRlcmVyKHVuZGVmaW5lZCwgcGF0aFJlbmRlcmVyLCBjZWxscy52YWx1ZSk7CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKCFoZWFkZXJSZW5kZXJlciAmJiAhaGVhZGVyVGVtcGxhdGUgJiYgIWhhc0hlYWRlclRleHQgJiYgaGVhZGVyQ2VsbCAmJiBoZWFkZXIgIT09IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5fX3NldFRleHRDb250ZW50KGhlYWRlckNlbGwuX2NvbnRlbnQsIHRoaXMuX2dlbmVyYXRlSGVhZGVyKHBhdGgpKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChoZWFkZXJDZWxsKSB7CiAgICAgICAgICB0aGlzLl9ncmlkLl9fdXBkYXRlSGVhZGVyRm9vdGVyUm93VmlzaWJpbGl0eShoZWFkZXJDZWxsLnBhcmVudEVsZW1lbnQpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX19zZXRUZXh0Q29udGVudChub2RlLCB0ZXh0Q29udGVudCkgewogICAgICAgIG5vZGUudGV4dENvbnRlbnQgIT09IHRleHRDb250ZW50ICYmIChub2RlLnRleHRDb250ZW50ID0gdGV4dENvbnRlbnQpOwogICAgICB9CgogICAgICBfZ2VuZXJhdGVIZWFkZXIocGF0aCkgewogICAgICAgIHJldHVybiBwYXRoCiAgICAgICAgICAuc3Vic3RyKHBhdGgubGFzdEluZGV4T2YoJy4nKSArIDEpCiAgICAgICAgICAucmVwbGFjZSgvKFtBLVpdKS9nLCAnLSQxJykudG9Mb3dlckNhc2UoKQogICAgICAgICAgLnJlcGxhY2UoLy0vZywgJyAnKQogICAgICAgICAgLnJlcGxhY2UoL14uLywgbWF0Y2ggPT4gbWF0Y2gudG9VcHBlckNhc2UoKSk7CiAgICAgIH0KCiAgICAgIF90b2dnbGVBdHRyaWJ1dGUobmFtZSwgYm9vbCwgbm9kZSkgewogICAgICAgIGlmIChub2RlLmhhc0F0dHJpYnV0ZShuYW1lKSA9PT0gIWJvb2wpIHsKICAgICAgICAgIGlmIChib29sKSB7CiAgICAgICAgICAgIG5vZGUuc2V0QXR0cmlidXRlKG5hbWUsICcnKTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGUucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgX3Jlb3JkZXJTdGF0dXNDaGFuZ2VkKHJlb3JkZXJTdGF0dXMsIGhlYWRlckNlbGwsIGZvb3RlckNlbGwsIGNlbGxzKSB7CiAgICAgICAgdGhpcy5fYWxsQ2VsbHMuZm9yRWFjaChjZWxsID0+IGNlbGwuc2V0QXR0cmlidXRlKCdyZW9yZGVyLXN0YXR1cycsIHJlb3JkZXJTdGF0dXMpKTsKICAgICAgfQoKICAgICAgX3Jlc2l6YWJsZUNoYW5nZWQocmVzaXphYmxlLCBoZWFkZXJDZWxsKSB7CiAgICAgICAgaWYgKHJlc2l6YWJsZSA9PT0gdW5kZWZpbmVkIHx8IGhlYWRlckNlbGwgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KCiAgICAgICAgaWYgKGhlYWRlckNlbGwpIHsKICAgICAgICAgIFtoZWFkZXJDZWxsXS5jb25jYXQodGhpcy5fZW1wdHlDZWxscykuZm9yRWFjaChjZWxsID0+IHsKICAgICAgICAgICAgaWYgKGNlbGwpIHsKICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0hhbmRsZSA9IGNlbGwucXVlcnlTZWxlY3RvcignW3BhcnR+PSJyZXNpemUtaGFuZGxlIl0nKTsKICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdIYW5kbGUpIHsKICAgICAgICAgICAgICAgIGNlbGwucmVtb3ZlQ2hpbGQoZXhpc3RpbmdIYW5kbGUpOwogICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgaWYgKHJlc2l6YWJsZSkgewogICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgICAgICBoYW5kbGUuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3Jlc2l6ZS1oYW5kbGUnKTsKICAgICAgICAgICAgICAgIGNlbGwuYXBwZW5kQ2hpbGQoaGFuZGxlKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3RleHRBbGlnbkNoYW5nZWQodGV4dEFsaWduLCBfY2VsbHMsIF9oZWFkZXJDZWxsLCBfZm9vdGVyQ2VsbCkgewogICAgICAgIGlmICh0ZXh0QWxpZ24gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBpZiAoWydzdGFydCcsICdlbmQnLCAnY2VudGVyJ10uaW5kZXhPZih0ZXh0QWxpZ24pID09PSAtMSkgewogICAgICAgICAgY29uc29sZS53YXJuKCd0ZXh0QWxpZ24gY2FuIG9ubHkgYmUgc2V0IGFzICJzdGFydCIsICJlbmQiIG9yICJjZW50ZXIiJyk7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBsZXQgdGV4dEFsaWduRmFsbGJhY2s7CiAgICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUodGhpcy5fZ3JpZCkuZGlyZWN0aW9uID09PSAnbHRyJykgewogICAgICAgICAgaWYgKHRleHRBbGlnbiA9PT0gJ3N0YXJ0JykgewogICAgICAgICAgICB0ZXh0QWxpZ25GYWxsYmFjayA9ICdsZWZ0JzsKICAgICAgICAgIH0gZWxzZSBpZiAodGV4dEFsaWduID09PSAnZW5kJykgewogICAgICAgICAgICB0ZXh0QWxpZ25GYWxsYmFjayA9ICdyaWdodCc7CiAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGlmICh0ZXh0QWxpZ24gPT09ICdzdGFydCcpIHsKICAgICAgICAgICAgdGV4dEFsaWduRmFsbGJhY2sgPSAncmlnaHQnOwogICAgICAgICAgfSBlbHNlIGlmICh0ZXh0QWxpZ24gPT09ICdlbmQnKSB7CiAgICAgICAgICAgIHRleHRBbGlnbkZhbGxiYWNrID0gJ2xlZnQnOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgdGhpcy5fYWxsQ2VsbHMuZm9yRWFjaChjZWxsID0+IHsKICAgICAgICAgIGNlbGwuX2NvbnRlbnQuc3R5bGUudGV4dEFsaWduID0gdGV4dEFsaWduOwogICAgICAgICAgaWYgKGdldENvbXB1dGVkU3R5bGUoY2VsbC5fY29udGVudCkudGV4dEFsaWduICE9PSB0ZXh0QWxpZ24pIHsKICAgICAgICAgICAgY2VsbC5fY29udGVudC5zdHlsZS50ZXh0QWxpZ24gPSB0ZXh0QWxpZ25GYWxsYmFjazsKICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgfQoKICAgICAgX2hpZGRlbkNoYW5nZWQoaGlkZGVuLCBoZWFkZXJDZWxsLCBmb290ZXJDZWxsLCBjZWxscykgewogICAgICAgIGlmICh0aGlzLnBhcmVudEVsZW1lbnQgJiYgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCkgewogICAgICAgICAgdGhpcy5wYXJlbnRFbGVtZW50Ll9jb2x1bW5Qcm9wQ2hhbmdlZCgnaGlkZGVuJywgaGlkZGVuKTsKICAgICAgICB9CgogICAgICAgIGlmICghIWhpZGRlbiAhPT0gISF0aGlzLl9wcmV2aW91c0hpZGRlbiAmJiB0aGlzLl9ncmlkKSB7CiAgICAgICAgICBpZiAoaGlkZGVuID09PSB0cnVlKSB7CiAgICAgICAgICAgIHRoaXMuX2FsbENlbGxzLmZvckVhY2goY2VsbCA9PiB7CiAgICAgICAgICAgICAgaWYgKGNlbGwuX2NvbnRlbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgY2VsbC5fY29udGVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKGNlbGwuX2NvbnRlbnQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgICB0aGlzLl9ncmlkLl9kZWJvdW5jZXJIaWRkZW5DaGFuZ2VkID0gRGVib3VuY2VyLmRlYm91bmNlKAogICAgICAgICAgICB0aGlzLl9ncmlkLl9kZWJvdW5jZXJIaWRkZW5DaGFuZ2VkLAogICAgICAgICAgICBhbmltYXRpb25GcmFtZSwKICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgIGlmICh0aGlzLl9ncmlkICYmIHRoaXMuX2dyaWQuX3JlbmRlckNvbHVtblRyZWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2dyaWQuX3JlbmRlckNvbHVtblRyZWUodGhpcy5fZ3JpZC5fY29sdW1uVHJlZSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICApOwoKICAgICAgICAgIHRoaXMuX2dyaWQuX3VwZGF0ZUxhc3RGcm96ZW4gJiYgdGhpcy5fZ3JpZC5fdXBkYXRlTGFzdEZyb3plbigpOwogICAgICAgICAgdGhpcy5fZ3JpZC5ub3RpZnlSZXNpemUgJiYgdGhpcy5fZ3JpZC5ub3RpZnlSZXNpemUoKTsKICAgICAgICAgIHRoaXMuX2dyaWQuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uICYmIHRoaXMuX2dyaWQuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCk7CiAgICAgICAgfQogICAgICAgIHRoaXMuX3ByZXZpb3VzSGlkZGVuID0gaGlkZGVuOwogICAgICB9CgogICAgfTsKCiAgICAvKioKICAgICAqIEEgYDx2YWFkaW4tZ3JpZC1jb2x1bW4+YCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSBob3cgYSBjb2x1bW4gaW4gYDx2YWFkaW4tZ3JpZD5gCiAgICAgKiBzaG91bGQgbG9vayBsaWtlLgogICAgICoKICAgICAqIFNlZSBgPHZhYWRpbi1ncmlkPmAgZG9jdW1lbnRhdGlvbiBhbmQgZGVtb3MgZm9yIGluc3RydWN0aW9ucyBhbmQgZXhhbXBsZXMgb24gaG93CiAgICAgKiB0byBjb25maWd1cmUgdGhlIGA8dmFhZGluLWdyaWQtY29sdW1uPmAuCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAZXh0ZW5kcyBQb2x5bWVyRWxlbWVudAogICAgICogQG1peGVzIEdyaWQuQ29sdW1uQmFzZU1peGluCiAgICAgKi8KICAgIGNsYXNzIEdyaWRDb2x1bW5FbGVtZW50IGV4dGVuZHMgQ29sdW1uQmFzZU1peGluKERpck1peGluJDEoUG9seW1lckVsZW1lbnQpKSB7CiAgICAgIHN0YXRpYyBnZXQgaXMoKSB7CiAgICAgICAgcmV0dXJuICd2YWFkaW4tZ3JpZC1jb2x1bW4nOwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgIC8qKgogICAgICAgICAgICogV2lkdGggb2YgdGhlIGNlbGxzIGZvciB0aGlzIGNvbHVtbi4KICAgICAgICAgICAqLwogICAgICAgICAgd2lkdGg6IHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nLAogICAgICAgICAgICB2YWx1ZTogJzEwMHB4JwogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIEZsZXggZ3JvdyByYXRpbyBmb3IgdGhlIGNlbGwgd2lkdGhzLiBXaGVuIHNldCB0byAwLCBjZWxsIHdpZHRoIGlzIGZpeGVkLgogICAgICAgICAgICovCiAgICAgICAgICBmbGV4R3JvdzogewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIHZhbHVlOiAxCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQ3VzdG9tIGZ1bmN0aW9uIGZvciByZW5kZXJpbmcgdGhlIGNlbGwgY29udGVudC4KICAgICAgICAgICAqIFJlY2VpdmVzIHRocmVlIGFyZ3VtZW50czoKICAgICAgICAgICAqCiAgICAgICAgICAgKiAtIGByb290YCBUaGUgY2VsbCBjb250ZW50IERPTSBlbGVtZW50LiBBcHBlbmQgeW91ciBjb250ZW50IHRvIGl0LgogICAgICAgICAgICogLSBgY29sdW1uYCBUaGUgYDx2YWFkaW4tZ3JpZC1jb2x1bW4+YCBlbGVtZW50LgogICAgICAgICAgICogLSBgcm93RGF0YWAgVGhlIG9iamVjdCB3aXRoIHRoZSBwcm9wZXJ0aWVzIHJlbGF0ZWQgd2l0aAogICAgICAgICAgICogICB0aGUgcmVuZGVyZWQgaXRlbSwgY29udGFpbnM6CiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuaW5kZXhgIFRoZSBpbmRleCBvZiB0aGUgaXRlbS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5pdGVtYCBUaGUgaXRlbS4KICAgICAgICAgICAqICAgLSBgcm93RGF0YS5leHBhbmRlZGAgU3VibGV2ZWwgdG9nZ2xlIHN0YXRlLgogICAgICAgICAgICogICAtIGByb3dEYXRhLmxldmVsYCBMZXZlbCBvZiB0aGUgdHJlZSByZXByZXNlbnRlZCB3aXRoIGEgaG9yaXpvbnRhbCBvZmZzZXQgb2YgdGhlIHRvZ2dsZSBidXR0b24uCiAgICAgICAgICAgKiAgIC0gYHJvd0RhdGEuc2VsZWN0ZWRgIFNlbGVjdGVkIHN0YXRlLgogICAgICAgICAgICovCiAgICAgICAgICByZW5kZXJlcjogRnVuY3Rpb24sCgogICAgICAgICAgLyoqCiAgICAgICAgICAgKiBQYXRoIHRvIGFuIGl0ZW0gc3ViLXByb3BlcnR5IHdob3NlIHZhbHVlIGdldHMgZGlzcGxheWVkIGluIHRoZSBjb2x1bW4gYm9keSBjZWxscy4KICAgICAgICAgICAqIFRoZSBwcm9wZXJ0eSBuYW1lIGlzIGFsc28gc2hvd24gaW4gdGhlIGNvbHVtbiBoZWFkZXIgaWYgYW4gZXhwbGljaXQgaGVhZGVyIG9yIHJlbmRlcmVyIGlzbid0IGRlZmluZWQuCiAgICAgICAgICAgKi8KICAgICAgICAgIHBhdGg6IHsKICAgICAgICAgICAgdHlwZTogU3RyaW5nCiAgICAgICAgICB9LAoKICAgICAgICAgIC8qKgogICAgICAgICAgICogQXV0b21hdGljYWxseSBzZXRzIHRoZSB3aWR0aCBvZiB0aGUgY29sdW1uIGJhc2VkIG9uIHRoZSBjb2x1bW4gY29udGVudHMgd2hlbiB0aGlzIGlzIHNldCB0byBgdHJ1ZWAuCiAgICAgICAgICAgKgogICAgICAgICAgICogRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdGhlIGNvbHVtbiB3aWR0aCBpcyBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkgb25seSBvbmNlIHdoZW4gdGhlIGdyaWQgaXRlbXMKICAgICAgICAgICAqIGFyZSByZW5kZXJlZCBmb3IgdGhlIGZpcnN0IHRpbWUgYW5kIHRoZSBjYWxjdWxhdGlvbiBvbmx5IGNvbnNpZGVycyB0aGUgcm93cyB3aGljaCBhcmUgY3VycmVudGx5CiAgICAgICAgICAgKiByZW5kZXJlZCBpbiBET00gKGEgYml0IG1vcmUgdGhhbiB3aGF0IGlzIGN1cnJlbnRseSB2aXNpYmxlKS4gSWYgdGhlIGdyaWQgaXMgc2Nyb2xsZWQsIG9yIHRoZSBjZWxsCiAgICAgICAgICAgKiBjb250ZW50IGNoYW5nZXMsIHRoZSBjb2x1bW4gd2lkdGggbWlnaHQgbm90IG1hdGNoIHRoZSBjb250ZW50cyBhbnltb3JlLgogICAgICAgICAgICoKICAgICAgICAgICAqIEhpZGRlbiBjb2x1bW5zIGFyZSBpZ25vcmVkIGluIHRoZSBjYWxjdWxhdGlvbiBhbmQgdGhlaXIgd2lkdGhzIGFyZSBub3QgYXV0b21hdGljYWxseSB1cGRhdGVkIHdoZW4KICAgICAgICAgICAqIHlvdSBzaG93IGEgY29sdW1uIHRoYXQgd2FzIGluaXRpYWxseSBoaWRkZW4uCiAgICAgICAgICAgKgogICAgICAgICAgICogWW91IGNhbiBtYW51YWxseSB0cmlnZ2VyIHRoZSBhdXRvIHNpemluZyBiZWhhdmlvciBhZ2FpbiBieSBjYWxsaW5nIGBncmlkLnJlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKClgLgogICAgICAgICAgICoKICAgICAgICAgICAqIFRoZSBjb2x1bW4gd2lkdGggbWF5IHN0aWxsIGdyb3cgbGFyZ2VyIHdoZW4gYGZsZXhHcm93YCBpcyBub3QgMC4KICAgICAgICAgICAqLwogICAgICAgICAgYXV0b1dpZHRoOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBmYWxzZQogICAgICAgICAgfSwKCiAgICAgICAgICBfYm9keVRlbXBsYXRlOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdAogICAgICAgICAgfSwKCiAgICAgICAgICBfY2VsbHM6IEFycmF5CgogICAgICAgIH07CiAgICAgIH0KCiAgICB9CgogICAgY3VzdG9tRWxlbWVudHMuZGVmaW5lKEdyaWRDb2x1bW5FbGVtZW50LmlzLCBHcmlkQ29sdW1uRWxlbWVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFZhYWRpbiBMdGQuCiAgICBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAqLwogICAgLyoqCiAgICAgKiBUaGlzIEVsZW1lbnQgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHZhYWRpbi1ncmlkLgogICAgICoKICAgICAqIEBwcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIEdyaWRPdXRlclNjcm9sbGVyRWxlbWVudCBleHRlbmRzIChjbGFzcyBleHRlbmRzIFBvbHltZXJFbGVtZW50IHt9KSB7CiAgICAgIHN0YXRpYyBnZXQgdGVtcGxhdGUoKSB7CiAgICAgICAgcmV0dXJuIGh0bWxgCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHRvcDogMDsKICAgICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICA6aG9zdChbcGFzc3Rocm91Z2hdKSB7CiAgICAgICAgcG9pbnRlci1ldmVudHM6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CgogICAgPHNsb3Q+PC9zbG90PgpgOwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IGlzKCkgewogICAgICAgIHJldHVybiAndmFhZGluLWdyaWQtb3V0ZXItc2Nyb2xsZXInOwogICAgICB9CgogICAgICBzdGF0aWMgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgcmV0dXJuIHsKCiAgICAgICAgICBzY3JvbGxUYXJnZXQ6IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0CiAgICAgICAgICB9LAoKICAgICAgICAgIHNjcm9sbEhhbmRsZXI6IHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0CiAgICAgICAgICB9LAoKICAgICAgICAgIHBhc3N0aHJvdWdoOiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgICAgdmFsdWU6IHRydWUKICAgICAgICAgIH0sCgogICAgICAgICAgb3V0ZXJTY3JvbGxpbmc6IEJvb2xlYW4sCgogICAgICAgICAgbm9TY3JvbGxiYXJzOiBCb29sZWFuLAoKICAgICAgICAgIF90b3VjaERldmljZTogQm9vbGVhbgogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJlYWR5KCkgewogICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKCdzY3JvbGwnLCAoKSA9PiB0aGlzLl9zeW5jU2Nyb2xsVGFyZ2V0KCkpOwogICAgICAgIHRoaXMucGFyZW50RWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLl9vbk1vdXNlTW92ZS5iaW5kKHRoaXMpKTsKCiAgICAgICAgLy8gZm9yIHNvbWUgcmVhc29uIHNjcm9sbCBiYXJzIGFyZSBoaWRkZW4gaW4gaU9TIGlmIHRoaXMgc3R5bGUgaXMKICAgICAgICAvLyBhZGRlZCBpbiBzdHlsZXNoZWV0cyBvciBiZWZvcmUgYXR0YWNoaW5nLgogICAgICAgIHRoaXMuc3R5bGUud2Via2l0T3ZlcmZsb3dTY3JvbGxpbmcgPSAndG91Y2gnOwoKICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIF8gPT4gdGhpcy5vdXRlclNjcm9sbGluZyA9IHRydWUpOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIF8gPT4gewogICAgICAgICAgdGhpcy5vdXRlclNjcm9sbGluZyA9IGZhbHNlOwogICAgICAgICAgdGhpcy5zY3JvbGxIYW5kbGVyLl9zY3JvbGxIYW5kbGVyKCk7CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIF9vbk1vdXNlTW92ZShlKSB7CiAgICAgICAgLy8gSWdub3JlIG1vdXNlbW92ZSBldmVudHMgb24gdG91Y2ggZGV2aWNlcwogICAgICAgIGlmICghdGhpcy5fdG91Y2hEZXZpY2UpIHsKICAgICAgICAgIGlmICh0aGlzLm5vU2Nyb2xsYmFycyAmJiB0aGlzLnBhcmVudEVsZW1lbnQuaGFzQXR0cmlidXRlKCdzY3JvbGwtcGVyaW9kJykpIHsKICAgICAgICAgICAgdGhpcy5wYXNzdGhyb3VnaCA9IGUub2Zmc2V0WSA8PSB0aGlzLmNsaWVudEhlaWdodCAtIDIwICYmIGUub2Zmc2V0WCA8PSB0aGlzLmNsaWVudFdpZHRoIC0gMjA7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB0aGlzLnBhc3N0aHJvdWdoID0gZS5vZmZzZXRZIDw9IHRoaXMuY2xpZW50SGVpZ2h0ICYmIGUub2Zmc2V0WCA8PSB0aGlzLmNsaWVudFdpZHRoOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgc3luY091dGVyU2Nyb2xsZXIoKSB7CiAgICAgICAgdGhpcy5zY3JvbGxUb3AgPSB0aGlzLnNjcm9sbFRhcmdldC5zY3JvbGxUb3A7CiAgICAgICAgdGhpcy5zY3JvbGxMZWZ0ID0gdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdDsKICAgICAgfQoKICAgICAgX3N5bmNTY3JvbGxUYXJnZXQoKSB7CiAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgpID0+IHsKICAgICAgICAgIHRoaXMuc2Nyb2xsVGFyZ2V0LnNjcm9sbFRvcCA9IHRoaXMuc2Nyb2xsVG9wOwogICAgICAgICAgdGhpcy5zY3JvbGxUYXJnZXQuc2Nyb2xsTGVmdCA9IHRoaXMuc2Nyb2xsTGVmdDsKICAgICAgICAgIHRoaXMuc2Nyb2xsSGFuZGxlci5fc2Nyb2xsSGFuZGxlcigpOwogICAgICAgIH0pOwoKICAgICAgfQogICAgfQoKICAgIGN1c3RvbUVsZW1lbnRzLmRlZmluZShHcmlkT3V0ZXJTY3JvbGxlckVsZW1lbnQuaXMsIEdyaWRPdXRlclNjcm9sbGVyRWxlbWVudCk7CgogICAgLyoqCiAgICBAbGljZW5zZQogICAgQ29weXJpZ2h0IChjKSAyMDE3IFZhYWRpbiBMdGQuCiAgICBUaGlzIHByb2dyYW0gaXMgYXZhaWxhYmxlIHVuZGVyIEFwYWNoZSBMaWNlbnNlIFZlcnNpb24gMi4wLCBhdmFpbGFibGUgYXQgaHR0cHM6Ly92YWFkaW4uY29tL2xpY2Vuc2UvCiAgICAqLwogICAgY29uc3QgVmFhZGluR3JpZFN0eWxlcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RvbS1tb2R1bGUnKTsKCiAgICAvLyBOT1RFKHdlYi1wYWRhd2FuKTogaHR0cHM6Ly9naXRodWIuY29tL3ZhYWRpbi92YWFkaW4tZ3JpZC9pc3N1ZXMvMTUxNAogICAgVmFhZGluR3JpZFN0eWxlcy5hcHBlbmRDaGlsZCgKICAgICAgaHRtbGAKICA8c3R5bGU+CiAgICBAa2V5ZnJhbWVzIHZhYWRpbi1ncmlkLWFwcGVhciB7CiAgICAgIHRvIHsKICAgICAgICBvcGFjaXR5OiAxOwogICAgICB9CiAgICB9CgogICAgOmhvc3QgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgYW5pbWF0aW9uOiAxbXMgdmFhZGluLWdyaWQtYXBwZWFyOwogICAgICBoZWlnaHQ6IDQwMHB4OwogICAgICBmbGV4OiAxIDEgYXV0bzsKICAgICAgYWxpZ24tc2VsZjogc3RyZXRjaDsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgfQoKICAgIDpob3N0KFtoaWRkZW5dKSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAjc2Nyb2xsZXIgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVZKDApOwogICAgICB3aWR0aDogYXV0bzsKICAgICAgaGVpZ2h0OiBhdXRvOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIHRvcDogMDsKICAgICAgcmlnaHQ6IDA7CiAgICAgIGJvdHRvbTogMDsKICAgICAgbGVmdDogMDsKICAgIH0KCiAgICA6aG9zdChbaGVpZ2h0LWJ5LXJvd3NdKSB7CiAgICAgIGhlaWdodDogYXV0bzsKICAgICAgYWxpZ24tc2VsZjogZmxleC1zdGFydDsKICAgICAgZmxleC1ncm93OiAwOwogICAgICB3aWR0aDogMTAwJTsKICAgIH0KCiAgICA6aG9zdChbaGVpZ2h0LWJ5LXJvd3NdKSAjc2Nyb2xsZXIgewogICAgICB3aWR0aDogMTAwJTsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB9CgogICAgI3RhYmxlIHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB6LWluZGV4OiAtMjsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBvdXRsaW5lOiBub25lOwogICAgfQoKICAgICNoZWFkZXIgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgfQoKICAgIHRoIHsKICAgICAgdGV4dC1hbGlnbjogaW5oZXJpdDsKICAgIH0KCiAgICAvKiBTYWZhcmkgZG9lc24ndCB3b3JrIHdpdGggImluaGVyaXQiICovCiAgICBbc2FmYXJpXSB0aCB7CiAgICAgIHRleHQtYWxpZ246IGluaXRpYWw7CiAgICB9CgogICAgI2Zvb3RlciB7CiAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogMDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICB9CgogICAgI2l0ZW1zIHsKICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIHdpZHRoOiAxMDAlOwogICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIHotaW5kZXg6IC0xOwogICAgfQoKICAgICNpdGVtcywKICAgICNvdXRlcnNpemVyLAogICAgI2ZpeGVkc2l6ZXIgewogICAgICBib3JkZXItdG9wOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgICBib3JkZXItYm90dG9tOiAwIHNvbGlkIHRyYW5zcGFyZW50OwogICAgfQoKICAgIFtwYXJ0fj0icm93Il0gewogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgYm94LXNpemluZzogYm9yZGVyLWJveDsKICAgICAgbWFyZ2luOiAwOwogICAgfQoKICAgIFtwYXJ0fj0icm93Il1bbG9hZGluZ10gW3BhcnR+PSJib2R5LWNlbGwiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIG9wYWNpdHk6IDA7CiAgICB9CgogICAgI2l0ZW1zIFtwYXJ0fj0icm93Il0gewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICB9CgogICAgI2l0ZW1zIFtwYXJ0fj0icm93Il06ZW1wdHkgewogICAgICBoZWlnaHQ6IDFlbTsKICAgIH0KCiAgICBbcGFydH49ImNlbGwiXTpub3QoW3BhcnR+PSJkZXRhaWxzLWNlbGwiXSkgewogICAgICBmbGV4LXNocmluazogMDsKICAgICAgZmxleC1ncm93OiAxOwogICAgICBib3gtc2l6aW5nOiBib3JkZXItYm94OwogICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB3aWR0aDogMTAwJTsKICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICBwYWRkaW5nOiAwOwogICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgfQoKICAgIFtwYXJ0fj0iZGV0YWlscy1jZWxsIl0gewogICAgICBwb3NpdGlvbjogYWJzb2x1dGU7CiAgICAgIGJvdHRvbTogMDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIHBhZGRpbmc6IDA7CiAgICB9CgogICAgW3BhcnR+PSJjZWxsIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgfQoKICAgIFtoaWRkZW5dIHsKICAgICAgZGlzcGxheTogbm9uZSAhaW1wb3J0YW50OwogICAgfQoKICAgIFtmcm96ZW5dIHsKICAgICAgei1pbmRleDogMjsKICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgIH0KCiAgICAjb3V0ZXJzY3JvbGxlciB7CiAgICAgIC8qIE5lZWRlZCAoYXQgbGVhc3QpIGZvciBBbmRyb2lkIENocm9tZSAqLwogICAgICB6LWluZGV4OiAwOwogICAgfQoKICAgICNzY3JvbGxlcjpub3QoW3NhZmFyaV0pICNvdXRlcnNjcm9sbGVyIHsKICAgICAgLyogTmVlZGVkIGZvciBBbmRyb2lkIENocm9tZSAoIzEwMjApLiBDYW4ndCBiZSBhcHBsaWVkIHRvIFNhZmFyaQogICAgICBzaW5jZSBpdCB3b3VsZCByZS1pbnRyb2R1Y2UgdGhlIHN1Yi1waXhlbCBvdmVyZmxvdyBidWcgKCM4NTMpICovCiAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICB9CgogICAgW25vLXNjcm9sbGJhcnNdOm5vdChbc2FmYXJpXSk6bm90KFtmaXJlZm94XSkgI291dGVyc2Nyb2xsZXIsCiAgICBbbm8tc2Nyb2xsYmFyc11bc2FmYXJpXSAjdGFibGUsCiAgICBbbm8tc2Nyb2xsYmFyc11bZmlyZWZveF0gI3RhYmxlIHsKICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgIH0KCiAgICBbbm8tc2Nyb2xsYmFyc106bm90KFtzYWZhcmldKTpub3QoW2ZpcmVmb3hdKSAjb3V0ZXJzY3JvbGxlciB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIC8qIFJlb3JkZXJpbmcgc3R5bGVzICovCiAgICA6aG9zdChbcmVvcmRlcmluZ10pIFtwYXJ0fj0iY2VsbCJdIDo6c2xvdHRlZCh2YWFkaW4tZ3JpZC1jZWxsLWNvbnRlbnQpLAogICAgOmhvc3QoW3Jlb3JkZXJpbmddKSBbcGFydH49InJlc2l6ZS1oYW5kbGUiXSwKICAgICNzY3JvbGxlcltuby1jb250ZW50LXBvaW50ZXItZXZlbnRzXSBbcGFydH49ImNlbGwiXSA6OnNsb3R0ZWQodmFhZGluLWdyaWQtY2VsbC1jb250ZW50KSB7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgfQoKICAgIFtwYXJ0fj0icmVvcmRlci1naG9zdCJdIHsKICAgICAgdmlzaWJpbGl0eTogaGlkZGVuOwogICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICAgIHBvaW50ZXItZXZlbnRzOiBub25lOwogICAgICBvcGFjaXR5OiAwLjU7CgogICAgICAvKiBQcmV2ZW50IG92ZXJmbG93aW5nIHRoZSBncmlkIGluIEZpcmVmb3ggKi8KICAgICAgdG9wOiAwOwogICAgICBsZWZ0OiAwOwogICAgfQoKICAgIDpob3N0KFtyZW9yZGVyaW5nXSkgewogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAjc2Nyb2xsZXJbaWVdW2NvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWRdIFtwYXJ0fj0iaGVhZGVyLWNlbGwiXSB7CiAgICAgIC1tcy11c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICA6aG9zdChbcmVvcmRlcmluZ10pICNvdXRlcnNjcm9sbGVyIHsKICAgICAgLXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6IGF1dG8gIWltcG9ydGFudDsKICAgIH0KCiAgICAvKiBSZXNpemluZyBzdHlsZXMgKi8KICAgIFtwYXJ0fj0icmVzaXplLWhhbmRsZSJdIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICB0b3A6IDA7CiAgICAgIHJpZ2h0OiAwOwogICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIGN1cnNvcjogY29sLXJlc2l6ZTsKICAgICAgei1pbmRleDogMTsKICAgIH0KCiAgICBbcGFydH49InJlc2l6ZS1oYW5kbGUiXTo6YmVmb3JlIHsKICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICBjb250ZW50OiAiIjsKICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB3aWR0aDogMzVweDsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpOwogICAgfQoKICAgIFtsYXN0LWNvbHVtbl0gW3BhcnR+PSJyZXNpemUtaGFuZGxlIl06OmJlZm9yZSwKICAgIFtsYXN0LWZyb3plbl0gW3BhcnR+PSJyZXNpemUtaGFuZGxlIl06OmJlZm9yZSB7CiAgICAgIHdpZHRoOiAxOHB4OwogICAgICB0cmFuc2Zvcm06IG5vbmU7CiAgICAgIHJpZ2h0OiAwOwogICAgfQoKICAgICNzY3JvbGxlcltjb2x1bW4tcmVzaXppbmddIHsKICAgICAgLW1zLXVzZXItc2VsZWN0OiBub25lOwogICAgICAtbW96LXVzZXItc2VsZWN0OiBub25lOwogICAgICAtd2Via2l0LXVzZXItc2VsZWN0OiBub25lOwogICAgICB1c2VyLXNlbGVjdDogbm9uZTsKICAgIH0KCiAgICAvKiBTaXplciBzdHlsZXMgKi8KICAgIC5zaXplciB7CiAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIHZpc2liaWxpdHk6IGhpZGRlbjsKICAgIH0KCiAgICAuc2l6ZXIgW3BhcnR+PSJkZXRhaWxzLWNlbGwiXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAuc2l6ZXIgW3BhcnR+PSJjZWxsIl1baGlkZGVuXSB7CiAgICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKICAgIH0KCiAgICAuc2l6ZXIgW3BhcnR+PSJjZWxsIl0gewogICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgIGxpbmUtaGVpZ2h0OiAwOwogICAgICBtYXJnaW4tdG9wOiAtMWVtOwogICAgICBoZWlnaHQ6IDAgIWltcG9ydGFudDsKICAgICAgbWluLWhlaWdodDogMCAhaW1wb3J0YW50OwogICAgICBtYXgtaGVpZ2h0OiAwICFpbXBvcnRhbnQ7CiAgICAgIHBhZGRpbmc6IDAgIWltcG9ydGFudDsKICAgIH0KCiAgICAuc2l6ZXIgW3BhcnR+PSJjZWxsIl06OmJlZm9yZSB7CiAgICAgIGNvbnRlbnQ6ICItIjsKICAgIH0KCiAgICAuc2l6ZXIgW3BhcnR+PSJjZWxsIl0gOjpzbG90dGVkKHZhYWRpbi1ncmlkLWNlbGwtY29udGVudCkgewogICAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7CiAgICB9CgogICAgLyogRml4ZWQgbW9kZSAoVGFibGV0IEVkZ2UpICovCiAgICAjZml4ZWRzaXplciB7CiAgICAgIHBvc2l0aW9uOiBhYnNvbHV0ZTsKICAgIH0KCiAgICA6bm90KFtlZGdlXVtuby1zY3JvbGxiYXJzXSkgI2ZpeGVkc2l6ZXIgewogICAgICBkaXNwbGF5OiBub25lOwogICAgfQoKICAgIFtlZGdlXVtuby1zY3JvbGxiYXJzXSB7CiAgICAgIC8qIEFueSB2YWx1ZSBvdGhlciB0aGFuIOKAmG5vbmXigJkgZm9yIHRoZSB0cmFuc2Zvcm0gcmVzdWx0cyBpbiB0aGUgY3JlYXRpb24gb2YgYm90aCBhIHN0YWNraW5nIGNvbnRleHQgYW5kCiAgICAgIGEgY29udGFpbmluZyBibG9jay4gVGhlIG9iamVjdCBhY3RzIGFzIGEgY29udGFpbmluZyBibG9jayBmb3IgZml4ZWQgcG9zaXRpb25lZCBkZXNjZW5kYW50cy4gKi8KICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVaKDApOwogICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgfQoKICAgIFtlZGdlXVtuby1zY3JvbGxiYXJzXSAjaGVhZGVyLAogICAgW2VkZ2VdW25vLXNjcm9sbGJhcnNdICNmb290ZXIgewogICAgICBwb3NpdGlvbjogZml4ZWQ7CiAgICB9CgogICAgW2VkZ2VdW25vLXNjcm9sbGJhcnNdICNpdGVtcyB7CiAgICAgIHBvc2l0aW9uOiBmaXhlZDsKICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIHdpbGwtY2hhbmdlOiB0cmFuc2Zvcm07CiAgICB9CgogICAgLyogUlRMIHNwZWNpZmljIHN0eWxlcyAqLwoKICAgIDpob3N0KFtkaXI9InJ0bCJdKSBbcGFydH49InJlb3JkZXItZ2hvc3QiXSB7CiAgICAgIGxlZnQ6IGF1dG87CiAgICAgIHJpZ2h0OiAwOwogICAgfQoKICAgIDpob3N0KFtkaXI9InJ0bCJdKSBbcGFydH49InJlc2l6ZS1oYW5kbGUiXSB7CiAgICAgIGxlZnQ6IDA7CiAgICAgIHJpZ2h0OiBhdXRvOwogICAgfQoKICAgIDpob3N0KFtkaXI9InJ0bCJdKSBbcGFydH49InJlc2l6ZS1oYW5kbGUiXTo6YmVmb3JlIHsKICAgICAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKDUwJSk7CiAgICB9CgogICAgOmhvc3QoW2Rpcj0icnRsIl0pIFtsYXN0LWNvbHVtbl0gW3BhcnR+PSJyZXNpemUtaGFuZGxlIl06OmJlZm9yZSwKICAgIDpob3N0KFtkaXI9InJ0bCJdKSBbbGFzdC1mcm96ZW5dIFtwYXJ0fj0icmVzaXplLWhhbmRsZSJdOjpiZWZvcmUgewogICAgICBsZWZ0OiAwOwogICAgICByaWdodDogYXV0bzsKICAgIH0KICA8L3N0eWxlPgpgKTsKCiAgICBjb25zdCBzYWZhcmkgPSAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgY29uc3QgZmlyZWZveCA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKS5pbmRleE9mKCdmaXJlZm94JykgPiAtMTsKCiAgICBpZiAoc2FmYXJpIHx8IGZpcmVmb3gpIHsKICAgICAgY29uc3Qgc2Nyb2xsaW5nU3R5bGVzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3R5bGUnKTsKICAgICAgc2Nyb2xsaW5nU3R5bGVzLnRleHRDb250ZW50ID0gYAogICAgW3Njcm9sbGluZ11bc2FmYXJpXSAjb3V0ZXJzY3JvbGxlciwKICAgIFtzY3JvbGxpbmddW2ZpcmVmb3hdICNvdXRlcnNjcm9sbGVyIHsKICAgICAgcG9pbnRlci1ldmVudHM6IGF1dG87CiAgICB9CgogICAgW2lvc10gI291dGVyc2Nyb2xsZXIgewogICAgICBwb2ludGVyLWV2ZW50czogYXV0bzsKICAgICAgei1pbmRleDogLTM7CiAgICB9CgogICAgW2lvc11bc2Nyb2xsaW5nXSAjb3V0ZXJzY3JvbGxlciB7CiAgICAgIHotaW5kZXg6IDA7CiAgICB9CgogICAgW2lvc10gW2Zyb3plbl0gewogICAgICB3aWxsLWNoYW5nZTogYXV0bzsKICAgIH0KICBgOwogICAgICBWYWFkaW5HcmlkU3R5bGVzLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudC5hcHBlbmRDaGlsZChzY3JvbGxpbmdTdHlsZXMpOwogICAgfQoKICAgIFZhYWRpbkdyaWRTdHlsZXMucmVnaXN0ZXIoJ3ZhYWRpbi1ncmlkLXN0eWxlcycpOwoKICAgIC8qKgogICAgQGxpY2Vuc2UKICAgIENvcHlyaWdodCAoYykgMjAxNyBWYWFkaW4gTHRkLgogICAgVGhpcyBwcm9ncmFtIGlzIGF2YWlsYWJsZSB1bmRlciBBcGFjaGUgTGljZW5zZSBWZXJzaW9uIDIuMCwgYXZhaWxhYmxlIGF0IGh0dHBzOi8vdmFhZGluLmNvbS9saWNlbnNlLwogICAgKi8KCiAgICBjb25zdCBUT1VDSF9ERVZJQ0UgPSAoKCkgPT4gewogICAgICB0cnkgewogICAgICAgIGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdUb3VjaEV2ZW50Jyk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0gY2F0Y2ggKGUpIHsKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgIH0KICAgIH0pKCk7CgogICAgLyoqCiAgICAgKgogICAgICogYDx2YWFkaW4tZ3JpZD5gIGlzIGEgZnJlZSwgaGlnaCBxdWFsaXR5IGRhdGEgZ3JpZCAvIGRhdGEgdGFibGUgV2ViIENvbXBvbmVudC4gVGhlIGNvbnRlbnQgb2YgdGhlCiAgICAgKiB0aGUgZ3JpZCBjYW4gYmUgcG9wdWxhdGVkIGluIHR3byB3YXlzOiBpbXBlcmF0aXZlbHkgYnkgdXNpbmcgcmVuZGVyZXIgY2FsbGJhY2sgZnVuY3Rpb24gYW5kCiAgICAgKiBkZWNsYXJhdGl2ZWx5IGJ5IHVzaW5nIFBvbHltZXIncyBUZW1wbGF0ZXMuCiAgICAgKgogICAgICogIyMjIFF1aWNrIFN0YXJ0CiAgICAgKgogICAgICogU3RhcnQgd2l0aCBhbiBhc3NpZ25pbmcgYW4gYXJyYXkgdG8gdGhlIFtgaXRlbXNgXSgjL2VsZW1lbnRzL3ZhYWRpbi1ncmlkI3Byb3BlcnR5LWl0ZW1zKSBwcm9wZXJ0eSB0byB2aXN1YWxpemUgeW91ciBkYXRhLgogICAgICoKICAgICAqIFVzZSB0aGUgW2A8dmFhZGluLWdyaWQtY29sdW1uPmBdKCMvZWxlbWVudHMvdmFhZGluLWdyaWQtY29sdW1uKSBlbGVtZW50IHRvIGNvbmZpZ3VyZSB0aGUgZ3JpZCBjb2x1bW5zLiBTZXQgYHBhdGhgIGFuZCBgaGVhZGVyYAogICAgICogc2hvcnRoYW5kIHByb3BlcnRpZXMgZm9yIHRoZSBjb2x1bW5zIHRvIGRlZmluZSB3aGF0IGdldHMgcmVuZGVyZWQgaW4gdGhlIGNlbGxzIG9mIHRoZSBjb2x1bW4uCiAgICAgKgogICAgICogIyMjIyBFeGFtcGxlOgogICAgICogYGBgaHRtbAogICAgICogPHZhYWRpbi1ncmlkPgogICAgICogICA8dmFhZGluLWdyaWQtY29sdW1uIHBhdGg9Im5hbWUuZmlyc3QiIGhlYWRlcj0iRmlyc3QgbmFtZSI+PC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgKiAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gcGF0aD0ibmFtZS5sYXN0IiBoZWFkZXI9Ikxhc3QgbmFtZSI+PC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgKiAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gcGF0aD0iZW1haWwiPjwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICogPC92YWFkaW4tZ3JpZD4KICAgICAqIGBgYAogICAgICoKICAgICAqIEZvciBjdXN0b20gY29udGVudCBgdmFhZGluLWdyaWQtY29sdW1uYCBlbGVtZW50IHByb3ZpZGVzIHlvdSB3aXRoIHRocmVlIHR5cGVzIG9mIGByZW5kZXJlcmAgY2FsbGJhY2sgZnVuY3Rpb25zOiBgaGVhZGVyUmVuZGVyZXJgLAogICAgICogYHJlbmRlcmVyYCBhbmQgYGZvb3RlclJlbmRlcmVyYC4KICAgICAqCiAgICAgKiBFYWNoIG9mIHRob3NlIHJlbmRlcmVyIGZ1bmN0aW9ucyBwcm92aWRlcyBgcm9vdGAsIGBjb2x1bW5gLCBgcm93RGF0YWAgYXJndW1lbnRzIHdoZW4gYXBwbGljYWJsZS4KICAgICAqIEdlbmVyYXRlIERPTSBjb250ZW50LCBhcHBlbmQgaXQgdG8gdGhlIGByb290YCBlbGVtZW50IGFuZCBjb250cm9sIHRoZSBzdGF0ZQogICAgICogb2YgdGhlIGhvc3QgZWxlbWVudCBieSBhY2Nlc3NpbmcgYGNvbHVtbmAuIEJlZm9yZSBnZW5lcmF0aW5nIG5ldyBjb250ZW50LAogICAgICogdXNlcnMgYXJlIGFibGUgdG8gY2hlY2sgaWYgdGhlcmUgaXMgYWxyZWFkeSBjb250ZW50IGluIGByb290YCBmb3IgcmV1c2luZyBpdC4KICAgICAqCiAgICAgKiBSZW5kZXJlcnMgYXJlIGNhbGxlZCBvbiBpbml0aWFsaXphdGlvbiBvZiBuZXcgY29sdW1uIGNlbGxzIGFuZCBlYWNoIHRpbWUgdGhlCiAgICAgKiByZWxhdGVkIHJvdyBkYXRhIGlzIHVwZGF0ZWQuIERPTSBnZW5lcmF0ZWQgZHVyaW5nIHRoZSByZW5kZXJlciBjYWxsIGNhbiBiZSByZXVzZWQKICAgICAqIGluIHRoZSBuZXh0IHJlbmRlcmVyIGNhbGwgYW5kIHdpbGwgYmUgcHJvdmlkZWQgd2l0aCB0aGUgYHJvb3RgIGFyZ3VtZW50LgogICAgICogT24gZmlyc3QgY2FsbCBpdCB3aWxsIGJlIGVtcHR5LgogICAgICoKICAgICAqICMjIyMgRXhhbXBsZToKICAgICAqIGBgYGh0bWwKICAgICAqIDx2YWFkaW4tZ3JpZD4KICAgICAqICAgPHZhYWRpbi1ncmlkLWNvbHVtbj48L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAqICAgPHZhYWRpbi1ncmlkLWNvbHVtbj48L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAqICAgPHZhYWRpbi1ncmlkLWNvbHVtbj48L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAqIDwvdmFhZGluLWdyaWQ+CiAgICAgKiBgYGAKICAgICAqIGBgYGpzCiAgICAgKiBjb25zdCBncmlkID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcigndmFhZGluLWdyaWQnKTsKICAgICAqIGdyaWQuaXRlbXMgPSBbeyduYW1lJzogJ0pvaG4nLCAnc3VybmFtZSc6ICdMZW5ub24nLCAncm9sZSc6ICdzaW5nZXInfSwKICAgICAqICAgICAgICAgICAgICAgeyduYW1lJzogJ1JpbmdvJywgJ3N1cm5hbWUnOiAnU3RhcnInLCAncm9sZSc6ICdkcnVtcyd9XTsKICAgICAqCiAgICAgKiBjb25zdCBjb2x1bW5zID0gZ3JpZC5xdWVyeVNlbGVjdG9yQWxsKCd2YWFkaW4tZ3JpZC1jb2x1bW4nKTsKICAgICAqCiAgICAgKiBjb2x1bW5zWzBdLmhlYWRlclJlbmRlcmVyID0gZnVuY3Rpb24ocm9vdCkgewogICAgICogICByb290LnRleHRDb250ZW50ID0gJ05hbWUnOwogICAgICogfTsKICAgICAqIGNvbHVtbnNbMF0ucmVuZGVyZXIgPSBmdW5jdGlvbihyb290LCBjb2x1bW4sIHJvd0RhdGEpIHsKICAgICAqICAgcm9vdC50ZXh0Q29udGVudCA9IHJvd0RhdGEuaXRlbS5uYW1lOwogICAgICogfTsKICAgICAqCiAgICAgKiBjb2x1bW5zWzFdLmhlYWRlclJlbmRlcmVyID0gZnVuY3Rpb24ocm9vdCkgewogICAgICogICByb290LnRleHRDb250ZW50ID0gJ1N1cm5hbWUnOwogICAgICogfTsKICAgICAqIGNvbHVtbnNbMV0ucmVuZGVyZXIgPSBmdW5jdGlvbihyb290LCBjb2x1bW4sIHJvd0RhdGEpIHsKICAgICAqICAgcm9vdC50ZXh0Q29udGVudCA9IHJvd0RhdGEuaXRlbS5zdXJuYW1lOwogICAgICogfTsKICAgICAqCiAgICAgKiBjb2x1bW5zWzJdLmhlYWRlclJlbmRlcmVyID0gZnVuY3Rpb24ocm9vdCkgewogICAgICogICByb290LnRleHRDb250ZW50ID0gJ1JvbGUnOwogICAgICogfTsKICAgICAqIGNvbHVtbnNbMl0ucmVuZGVyZXIgPSBmdW5jdGlvbihyb290LCBjb2x1bW4sIHJvd0RhdGEpIHsKICAgICAqICAgcm9vdC50ZXh0Q29udGVudCA9IHJvd0RhdGEuaXRlbS5yb2xlOwogICAgICogfTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEFsdGVybmF0aXZlbHksIHRoZSBjb250ZW50IGNhbiBiZSBwcm92aWRlZCB3aXRoIFBvbHltZXIncyBUZW1wbGF0ZXM6CiAgICAgKgogICAgICogIyMjIyBFeGFtcGxlOgogICAgICogYGBgaHRtbAogICAgICogPHZhYWRpbi1ncmlkIGl0ZW1zPSdbeyJuYW1lIjogIkpvaG4iLCAic3VybmFtZSI6ICJMZW5ub24iLCAicm9sZSI6ICJzaW5nZXIifSwKICAgICAqIHsibmFtZSI6ICJSaW5nbyIsICJzdXJuYW1lIjogIlN0YXJyIiwgInJvbGUiOiAiZHJ1bXMifV0nPgogICAgICogICA8dmFhZGluLWdyaWQtY29sdW1uPgogICAgICogICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj5OYW1lPC90ZW1wbGF0ZT4KICAgICAqICAgICA8dGVtcGxhdGU+W1tpdGVtLm5hbWVdXTwvdGVtcGxhdGU+CiAgICAgKiAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICogICA8dmFhZGluLWdyaWQtY29sdW1uPgogICAgICogICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj5TdXJuYW1lPC90ZW1wbGF0ZT4KICAgICAqICAgICA8dGVtcGxhdGU+W1tpdGVtLnN1cm5hbWVdXTwvdGVtcGxhdGU+CiAgICAgKiAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICogICA8dmFhZGluLWdyaWQtY29sdW1uPgogICAgICogICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj5Sb2xlPC90ZW1wbGF0ZT4KICAgICAqICAgICA8dGVtcGxhdGU+W1tpdGVtLnJvbGVdXTwvdGVtcGxhdGU+CiAgICAgKiAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICogPC92YWFkaW4tZ3JpZD4KICAgICAqIGBgYAogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgaGVscGVyIGVsZW1lbnRzIGNhbiBiZSB1c2VkIGZvciBmdXJ0aGVyIGN1c3RvbWl6YXRpb246CiAgICAgKiAtIFtgPHZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cD5gXSgjL2VsZW1lbnRzL3ZhYWRpbi1ncmlkLWNvbHVtbi1ncm91cCkKICAgICAqIC0gW2A8dmFhZGluLWdyaWQtZmlsdGVyPmBdKCMvZWxlbWVudHMvdmFhZGluLWdyaWQtZmlsdGVyKQogICAgICogLSBbYDx2YWFkaW4tZ3JpZC1zb3J0ZXI+YF0oIy9lbGVtZW50cy92YWFkaW4tZ3JpZC1zb3J0ZXIpCiAgICAgKiAtIFtgPHZhYWRpbi1ncmlkLXNlbGVjdGlvbi1jb2x1bW4+YF0oIy9lbGVtZW50cy92YWFkaW4tZ3JpZC1zZWxlY3Rpb24tY29sdW1uKQogICAgICogLSBbYDx2YWFkaW4tZ3JpZC10cmVlLXRvZ2dsZT5gXSgjL2VsZW1lbnRzL3ZhYWRpbi1ncmlkLXRyZWUtdG9nZ2xlKQogICAgICoKICAgICAqIF9fTm90ZSB0aGF0IHRoZSBoZWxwZXIgZWxlbWVudHMgbXVzdCBiZSBleHBsaWNpdGx5IGltcG9ydGVkLl9fCiAgICAgKiBJZiB5b3Ugd2FudCB0byBpbXBvcnQgZXZlcnl0aGluZyBhdCBvbmNlIHlvdSBjYW4gdXNlIHRoZSBgYWxsLWltcG9ydHMuaHRtbGAgYnVuZGxlLgogICAgICoKICAgICAqIEEgY29sdW1uIHRlbXBsYXRlIGNhbiBiZSBkZWNvcmF0ZWQgd2l0aCBvbmUgdGhlIGZvbGxvd2luZyBjbGFzcyBuYW1lcyB0byBzcGVjaWZ5IGl0cyBwdXJwb3NlCiAgICAgKiAtIGBoZWFkZXJgOiBNYXJrcyBhIGhlYWRlciB0ZW1wbGF0ZQogICAgICogLSBgZm9vdGVyYDogTWFya3MgYSBmb290ZXIgdGVtcGxhdGUKICAgICAqIC0gYHJvdy1kZXRhaWxzYDogTWFya3MgYSByb3cgZGV0YWlscyB0ZW1wbGF0ZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgYnVpbHQtaW4gdGVtcGxhdGUgdmFyaWFibGVzIGNhbiBiZSBib3VuZCB0byBpbnNpZGUgdGhlIGNvbHVtbiB0ZW1wbGF0ZXM6CiAgICAgKiAtIGBbW2luZGV4XV1gOiBOdW1iZXIgcmVwcmVzZW50aW5nIHRoZSByb3cgaW5kZXgKICAgICAqIC0gYFtbaXRlbV1dYCBhbmQgaXQncyBzdWItcHJvcGVydGllczogRGF0YSBvYmplY3QgKHByb3ZpZGVkIGJ5IGEgZGF0YSBwcm92aWRlciAvIGl0ZW1zIGFycmF5KQogICAgICogLSBge3tzZWxlY3RlZH19YDogVHJ1ZSBpZiB0aGUgaXRlbSBpcyBzZWxlY3RlZCAoY2FuIGJlIHR3by13YXkgYm91bmQpCiAgICAgKiAtIGB7e2RldGFpbHNPcGVuZWR9fWA6IFRydWUgaWYgdGhlIGl0ZW0gaGFzIHJvdyBkZXRhaWxzIG9wZW5lZCAoY2FuIGJlIHR3by13YXkgYm91bmQpCiAgICAgKiAtIGB7e2V4cGFuZGVkfX1gOiBUcnVlIGlmIHRoZSBpdGVtIGhhcyB0cmVlIHN1YmxldmVsIGV4cGFuZGVkIChjYW4gYmUgdHdvLXdheSBib3VuZCkKICAgICAqIC0gYFtbbGV2ZWxdXWA6IE51bWJlciBvZiB0aGUgdHJlZSBzdWJsZXZlbCBvZiB0aGUgaXRlbSwgZmlyc3QgbGV2ZWwtaXRlbXMgaGF2ZSAwCiAgICAgKgogICAgICogIyMjIExhenkgTG9hZGluZyB3aXRoIEZ1bmN0aW9uIERhdGEgUHJvdmlkZXIKICAgICAqCiAgICAgKiBJbiBhZGRpdGlvbiB0byBhc3NpZ25pbmcgYW4gYXJyYXkgdG8gdGhlIGl0ZW1zIHByb3BlcnR5LCB5b3UgY2FuIGFsdGVybmF0aXZlbHkKICAgICAqIHByb3ZpZGUgdGhlIGA8dmFhZGluLWdyaWQ+YCBkYXRhIHRocm91Z2ggdGhlCiAgICAgKiBbYGRhdGFQcm92aWRlcmBdKCMvZWxlbWVudHMvdmFhZGluLWdyaWQjcHJvcGVydHktZGF0YVByb3ZpZGVyKSBmdW5jdGlvbiBwcm9wZXJ0eS4KICAgICAqIFRoZSBgPHZhYWRpbi1ncmlkPmAgY2FsbHMgdGhpcyBmdW5jdGlvbiBsYXppbHksIG9ubHkgd2hlbiBpdCBuZWVkcyBtb3JlIGRhdGEKICAgICAqIHRvIGJlIGRpc3BsYXllZC4KICAgICAqCiAgICAgKiBTZWUgdGhlIFtgZGF0YVByb3ZpZGVyYF0oIy9lbGVtZW50cy92YWFkaW4tZ3JpZCNwcm9wZXJ0eS1kYXRhUHJvdmlkZXIpIGluCiAgICAgKiB0aGUgQVBJIHJlZmVyZW5jZSBiZWxvdyBmb3IgdGhlIGRldGFpbGVkIGRhdGEgcHJvdmlkZXIgYXJndW1lbnRzIGRlc2NyaXB0aW9uLAogICAgICogYW5kIHRoZSDigJxBc3NpZ25pbmcgRGF0YeKAnSBwYWdlIGluIHRoZSBkZW1vcy4KICAgICAqCiAgICAgKiBfX05vdGUgdGhhdCBleHBhbmRpbmcgdGhlIHRyZWUgZ3JpZCdzIGl0ZW0gd2lsbCB0cmlnZ2VyIGEgY2FsbCB0byB0aGUgYGRhdGFQcm92aWRlcmAuX18KICAgICAqCiAgICAgKiBfX0Fsc28sIG5vdGUgdGhhdCB3aGVuIHVzaW5nIGZ1bmN0aW9uIGRhdGEgcHJvdmlkZXJzLCB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zCiAgICAgKiBuZWVkcyB0byBiZSBzZXQgbWFudWFsbHkuIFRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgY2FuIGJlIHJldHVybmVkCiAgICAgKiBpbiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBkYXRhIHByb3ZpZGVyIGNhbGxiYWNrOl9fCiAgICAgKgogICAgICogYGBgamF2YXNjcmlwdAogICAgICogZ3JpZC5kYXRhUHJvdmlkZXIgPSBmdW5jdGlvbihwYXJhbXMsIGNhbGxiYWNrKSB7CiAgICAgKiAgIHZhciB1cmwgPSAnaHR0cHM6Ly9hcGkuZXhhbXBsZS9kYXRhJyArCiAgICAgKiAgICAgICAnP3BhZ2U9JyArIHBhcmFtcy5wYWdlICsgICAgICAgIC8vIHRoZSByZXF1ZXN0ZWQgcGFnZSBpbmRleAogICAgICogICAgICAgJyZwZXJfcGFnZT0nICsgcGFyYW1zLnBhZ2VTaXplOyAvLyBudW1iZXIgb2YgaXRlbXMgb24gdGhlIHBhZ2UKICAgICAqICAgdmFyIHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpOwogICAgICogICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7CiAgICAgKiAgICAgdmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZSh4aHIucmVzcG9uc2VUZXh0KTsKICAgICAqICAgICBjYWxsYmFjaygKICAgICAqICAgICAgIHJlc3BvbnNlLmVtcGxveWVlcywgLy8gcmVxdWVzdGVkIHBhZ2Ugb2YgaXRlbXMKICAgICAqICAgICAgIHJlc3BvbnNlLnRvdGFsU2l6ZSAgLy8gdG90YWwgbnVtYmVyIG9mIGl0ZW1zCiAgICAgKiAgICAgKTsKICAgICAqICAgfTsKICAgICAqICAgeGhyLm9wZW4oJ0dFVCcsIHVybCwgdHJ1ZSk7CiAgICAgKiAgIHhoci5zZW5kKCk7CiAgICAgKiB9OwogICAgICogYGBgCiAgICAgKgogICAgICogX19BbHRlcm5hdGl2ZWx5LCB5b3UgY2FuIHVzZSB0aGUgYHNpemVgIHByb3BlcnR5IHRvIHNldCB0aGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zOl9fCiAgICAgKgogICAgICogYGBgamF2YXNjcmlwdAogICAgICogZ3JpZC5zaXplID0gMjAwOyAvLyBUaGUgdG90YWwgbnVtYmVyIG9mIGl0ZW1zCiAgICAgKiBncmlkLmRhdGFQcm92aWRlciA9IGZ1bmN0aW9uKHBhcmFtcywgY2FsbGJhY2spIHsKICAgICAqICAgdmFyIHVybCA9ICdodHRwczovL2FwaS5leGFtcGxlL2RhdGEnICsKICAgICAqICAgICAgICc/cGFnZT0nICsgcGFyYW1zLnBhZ2UgKyAgICAgICAgLy8gdGhlIHJlcXVlc3RlZCBwYWdlIGluZGV4CiAgICAgKiAgICAgICAnJnBlcl9wYWdlPScgKyBwYXJhbXMucGFnZVNpemU7IC8vIG51bWJlciBvZiBpdGVtcyBvbiB0aGUgcGFnZQogICAgICogICB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgKiAgIHhoci5vbmxvYWQgPSBmdW5jdGlvbigpIHsKICAgICAqICAgICB2YXIgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHhoci5yZXNwb25zZVRleHQpOwogICAgICogICAgIGNhbGxiYWNrKHJlc3BvbnNlLmVtcGxveWVlcyk7CiAgICAgKiAgIH07CiAgICAgKiAgIHhoci5vcGVuKCdHRVQnLCB1cmwsIHRydWUpOwogICAgICogICB4aHIuc2VuZCgpOwogICAgICogfTsKICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBTdHlsaW5nCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBzaGFkb3cgRE9NIHBhcnRzIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CiAgICAgKgogICAgICogUGFydCBuYW1lIHwgRGVzY3JpcHRpb24KICAgICAqIC0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLQogICAgICogYHJvd2AgfCBSb3cgaW4gdGhlIGludGVybmFsIHRhYmxlCiAgICAgKiBgY2VsbGAgfCBDZWxsIGluIHRoZSBpbnRlcm5hbCB0YWJsZQogICAgICogYGhlYWRlci1jZWxsYCB8IEhlYWRlciBjZWxsIGluIHRoZSBpbnRlcm5hbCB0YWJsZQogICAgICogYGJvZHktY2VsbGAgfCBCb2R5IGNlbGwgaW4gdGhlIGludGVybmFsIHRhYmxlCiAgICAgKiBgZm9vdGVyLWNlbGxgIHwgRm9vdGVyIGNlbGwgaW4gdGhlIGludGVybmFsIHRhYmxlCiAgICAgKiBgZGV0YWlscy1jZWxsYCB8IFJvdyBkZXRhaWxzIGNlbGwgaW4gdGhlIGludGVybmFsIHRhYmxlCiAgICAgKiBgcmVzaXplLWhhbmRsZWAgfCBIYW5kbGUgZm9yIHJlc2l6aW5nIHRoZSBjb2x1bW5zCiAgICAgKiBgcmVvcmRlci1naG9zdGAgfCBHaG9zdCBlbGVtZW50IG9mIHRoZSBoZWFkZXIgY2VsbCBiZWluZyBkcmFnZ2VkCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBzdGF0ZSBhdHRyaWJ1dGVzIGFyZSBhdmFpbGFibGUgZm9yIHN0eWxpbmc6CiAgICAgKgogICAgICogQXR0cmlidXRlICAgIHwgRGVzY3JpcHRpb24gfCBQYXJ0IG5hbWUKICAgICAqIC0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0KICAgICAqIGBsb2FkaW5nYCB8IFNldCB3aGVuIHRoZSBncmlkIGlzIGxvYWRpbmcgZGF0YSBmcm9tIGRhdGEgcHJvdmlkZXIgfCA6aG9zdAogICAgICogYGludGVyYWN0aW5nYCB8IEtleWJvYXJkIG5hdmlnYXRpb24gaW4gaW50ZXJhY3Rpb24gbW9kZSB8IDpob3N0CiAgICAgKiBgbmF2aWdhdGluZ2AgfCBLZXlib2FyZCBuYXZpZ2F0aW9uIGluIG5hdmlnYXRpb24gbW9kZSB8IDpob3N0CiAgICAgKiBgb3ZlcmZsb3dgIHwgU2V0IHdoZW4gcm93cyBhcmUgb3ZlcmZsb3dpbmcgdGhlIGdyaWQgdmlld3BvcnQuIFBvc3NpYmxlIHZhbHVlczogYHRvcGAsIGBib3R0b21gLCBgbGVmdGAsIGByaWdodGAgfCA6aG9zdAogICAgICogYHJlb3JkZXJpbmdgIHwgU2V0IHdoZW4gdGhlIGdyaWQncyBjb2x1bW5zIGFyZSBiZWluZyByZW9yZGVyZWQgfCA6aG9zdAogICAgICogYGRyYWdvdmVyYCB8IFNldCB3aGVuIHRoZSBncmlkIChub3QgYSBzcGVjaWZpYyByb3cpIGlzIGRyYWdnZWQgb3ZlciB8IDpob3N0CiAgICAgKiBgZHJhZ2dpbmctcm93c2AgOiBTZXQgd2hlbiBncmlkIHJvd3MgYXJlIGRyYWdnZWQgIHwgOmhvc3QKICAgICAqIGByZW9yZGVyLXN0YXR1c2AgfCBSZWZsZWN0cyB0aGUgc3RhdHVzIG9mIGEgY2VsbCB3aGlsZSBjb2x1bW5zIGFyZSBiZWluZyByZW9yZGVyZWQgfCBjZWxsCiAgICAgKiBgZnJvemVuYCB8IEZyb3plbiBjZWxsIHwgY2VsbAogICAgICogYGxhc3QtZnJvemVuYCB8IExhc3QgZnJvemVuIGNlbGwgfCBjZWxsCiAgICAqICogYGZpcnN0LWNvbHVtbmAgfCBGaXJzdCB2aXNpYmxlIGNlbGwgb24gYSByb3cgfCBjZWxsCiAgICAgKiBgbGFzdC1jb2x1bW5gIHwgTGFzdCB2aXNpYmxlIGNlbGwgb24gYSByb3cgfCBjZWxsCiAgICAgKiBgc2VsZWN0ZWRgIHwgU2VsZWN0ZWQgcm93IHwgcm93CiAgICAgKiBgZXhwYW5kZWRgIHwgRXhwYW5kZWQgcm93IHwgcm93CiAgICAgKiBgZGV0YWlscy1vcGVuZWRgIHwgUm93IHdpdGggZGV0YWlscyBvcGVuIHwgcm93CiAgICAgKiBgbG9hZGluZ2AgfCBSb3cgdGhhdCBpcyB3YWl0aW5nIGZvciBkYXRhIGZyb20gZGF0YSBwcm92aWRlciB8IHJvdwogICAgICogYG9kZGAgfCBPZGQgcm93IHwgcm93CiAgICAgKiBgZmlyc3RgIHwgVGhlIGZpcnN0IGJvZHkgcm93IHwgcm93CiAgICAgKiBgZHJhZ3N0YXJ0YCB8IFNldCBmb3Igb25lIGZyYW1lIHdoZW4gZHJhZyBvZiBhIHJvdyBpcyBzdGFydGluZy4gVGhlIHZhbHVlIGlzIGEgbnVtYmVyIHdoZW4gbXVsdGlwbGUgcm93cyBhcmUgZHJhZ2dlZCB8IHJvdwogICAgICogYGRyYWdvdmVyYCB8IFNldCB3aGVuIHRoZSByb3cgaXMgZHJhZ2dlZCBvdmVyIHwgcm93CiAgICAgKiBgZHJhZy1kaXNhYmxlZGAgfCBTZXQgdG8gYSByb3cgdGhhdCBpc24ndCBhdmFpbGFibGUgZm9yIGRyYWdnaW5nIHwgcm93CiAgICAgKiBgZHJvcC1kaXNhYmxlZGAgfCBTZXQgdG8gYSByb3cgdGhhdCBjYW4ndCBiZSBkcm9wcGVkIG9uIHRvcCBvZiB8IHJvdwogICAgICoKICAgICAqIFNlZSBbVGhlbWFibGVNaXhpbiDigJMgaG93IHRvIGFwcGx5IHN0eWxlcyBmb3Igc2hhZG93IHBhcnRzXShodHRwczovL2dpdGh1Yi5jb20vdmFhZGluL3ZhYWRpbi10aGVtYWJsZS1taXhpbi93aWtpKQogICAgICoKICAgICAqIEBleHRlbmRzIFBvbHltZXJFbGVtZW50CiAgICAgKiBAbWl4ZXMgVGhlbWFibGVNaXhpbgogICAgICogQG1peGVzIEdyaWQuQTExeU1peGluCiAgICAgKiBAbWl4ZXMgR3JpZC5BY3RpdmVJdGVtTWl4aW4KICAgICAqIEBtaXhlcyBHcmlkLkFycmF5RGF0YVByb3ZpZGVyTWl4aW4KICAgICAqIEBtaXhlcyBHcmlkLkNvbHVtblJlc2l6aW5nTWl4aW4KICAgICAqIEBtaXhlcyBHcmlkLkRhdGFQcm92aWRlck1peGluCiAgICAgKiBAbWl4ZXMgR3JpZC5EeW5hbWljQ29sdW1uc01peGluCiAgICAgKiBAbWl4ZXMgR3JpZC5GaWx0ZXJNaXhpbgogICAgICogQG1peGVzIEdyaWQuUm93RGV0YWlsc01peGluCiAgICAgKiBAbWl4ZXMgR3JpZC5TY3JvbGxNaXhpbgogICAgICogQG1peGVzIEdyaWQuU2VsZWN0aW9uTWl4aW4KICAgICAqIEBtaXhlcyBHcmlkLlNvcnRNaXhpbgogICAgICogQG1peGVzIEdyaWQuS2V5Ym9hcmROYXZpZ2F0aW9uTWl4aW4KICAgICAqIEBtaXhlcyBHcmlkLkNvbHVtblJlb3JkZXJpbmdNaXhpbgogICAgICogQG1peGVzIEdyaWQuRXZlbnRDb250ZXh0TWl4aW4KICAgICAqIEBtaXhlcyBHcmlkLlN0eWxpbmdNaXhpbgogICAgICogQG1peGVzIEdyaWQuRHJhZ0FuZERyb3BNaXhpbgogICAgICogQGRlbW8gZGVtby9pbmRleC5odG1sCiAgICAgKi8KICAgIGNsYXNzIEdyaWRFbGVtZW50IGV4dGVuZHMKICAgICAgRWxlbWVudE1peGluJDEoCiAgICAgICAgVGhlbWFibGVNaXhpbigKICAgICAgICAgIERhdGFQcm92aWRlck1peGluKAogICAgICAgICAgICBBcnJheURhdGFQcm92aWRlck1peGluKAogICAgICAgICAgICAgIER5bmFtaWNDb2x1bW5zTWl4aW4oCiAgICAgICAgICAgICAgICBBY3RpdmVJdGVtTWl4aW4oCiAgICAgICAgICAgICAgICAgIFNjcm9sbE1peGluKAogICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbk1peGluKAogICAgICAgICAgICAgICAgICAgICAgU29ydE1peGluKAogICAgICAgICAgICAgICAgICAgICAgICBSb3dEZXRhaWxzTWl4aW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5Ym9hcmROYXZpZ2F0aW9uTWl4aW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBBMTF5TWl4aW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlck1peGluKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtblJlb3JkZXJpbmdNaXhpbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtblJlc2l6aW5nTWl4aW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50Q29udGV4dE1peGluKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdBbmREcm9wTWl4aW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsaW5nTWl4aW4oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyaWRTY3JvbGxlckVsZW1lbnQpKSkpKSkpKSkpKSkpKSkpKSkgewogICAgICBzdGF0aWMgZ2V0IHRlbXBsYXRlKCkgewogICAgICAgIHJldHVybiBodG1sYAogICAgPHN0eWxlIGluY2x1ZGU9InZhYWRpbi1ncmlkLXN0eWxlcyI+PC9zdHlsZT4KCiAgICA8ZGl2IGlkPSJzY3JvbGxlciIgbm8tc2Nyb2xsYmFyc1wkPSJbWyFfc2Nyb2xsYmFyV2lkdGhdXSIgd2hlZWwtc2Nyb2xsaW5nXCQ9IltbX3doZWVsU2Nyb2xsaW5nXV0iIHNhZmFyaVwkPSJbW19zYWZhcmldXSIgaW9zXCQ9IltbX2lvc11dIiBsb2FkaW5nXCQ9IltbbG9hZGluZ11dIiBlZGdlXCQ9IltbX2VkZ2VdXSIgZmlyZWZveFwkPSJbW19maXJlZm94XV0iIGllXCQ9IltbX2llXV0iIGNvbHVtbi1yZW9yZGVyaW5nLWFsbG93ZWRcJD0iW1tjb2x1bW5SZW9yZGVyaW5nQWxsb3dlZF1dIj4KCiAgICAgIDx0YWJsZSBpZD0idGFibGUiIHJvbGU9ImdyaWQiIGFyaWEtbXVsdGlzZWxlY3RhYmxlPSJ0cnVlIiB0YWJpbmRleD0iMCI+CiAgICAgICAgPGNhcHRpb24gaWQ9ImZpeGVkc2l6ZXIiIGNsYXNzPSJzaXplciIgcGFydD0icm93Ij48L2NhcHRpb24+CiAgICAgICAgPHRoZWFkIGlkPSJoZWFkZXIiIHJvbGU9InJvd2dyb3VwIj48L3RoZWFkPgogICAgICAgIDx0Ym9keSBpZD0iaXRlbXMiIHJvbGU9InJvd2dyb3VwIj48L3Rib2R5PgogICAgICAgIDx0Zm9vdCBpZD0iZm9vdGVyIiByb2xlPSJyb3dncm91cCI+PC90Zm9vdD4KICAgICAgPC90YWJsZT4KCiAgICAgIDxkaXYgcGFydD0icmVvcmRlci1naG9zdCI+PC9kaXY+CiAgICAgIDx2YWFkaW4tZ3JpZC1vdXRlci1zY3JvbGxlciBpZD0ib3V0ZXJzY3JvbGxlciIgX3RvdWNoLWRldmljZT0iW1tfdG91Y2hEZXZpY2VdXSIgc2Nyb2xsLXRhcmdldD0iW1tzY3JvbGxUYXJnZXRdXSIgc2Nyb2xsLWhhbmRsZXI9IltbX3RoaXNdXSIgbm8tc2Nyb2xsYmFycz0iW1shX3Njcm9sbGJhcldpZHRoXV0iPgogICAgICAgIDxkaXYgaWQ9Im91dGVyc2l6ZXIiIGNsYXNzPSJzaXplciIgcGFydD0icm93Ij48L2Rpdj4KICAgICAgPC92YWFkaW4tZ3JpZC1vdXRlci1zY3JvbGxlcj4KICAgIDwvZGl2PgoKICAgIDwhLS0gVGhlIHRlbXBsYXRlIG5lZWRzIGF0IGxlYXN0IG9uZSBzbG90IG9yIGVsc2Ugc2hhZHkgZG9lc24ndCBkaXN0cmlidXRlIC0tPgogICAgPHNsb3QgbmFtZT0ibm9kaXN0cmlidXRlIj48L3Nsb3Q+CgogICAgPGRpdiBpZD0iZm9jdXNleGl0IiB0YWJpbmRleD0iMCI+PC9kaXY+CmA7CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgaXMoKSB7CiAgICAgICAgcmV0dXJuICd2YWFkaW4tZ3JpZCc7CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgdmVyc2lvbigpIHsKICAgICAgICByZXR1cm4gJzUuNi42JzsKICAgICAgfQoKICAgICAgc3RhdGljIGdldCBvYnNlcnZlcnMoKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICdfY29sdW1uVHJlZUNoYW5nZWQoX2NvbHVtblRyZWUsIF9jb2x1bW5UcmVlLiopJwogICAgICAgIF07CiAgICAgIH0KCiAgICAgIHN0YXRpYyBnZXQgcHJvcGVydGllcygpIHsKICAgICAgICByZXR1cm4gewoKICAgICAgICAgIF90aGlzOiB7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgdmFsdWU6IGZ1bmN0aW9uKCkgewogICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICB9LAoKICAgICAgICAgIF9zYWZhcmk6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkKICAgICAgICAgIH0sCgogICAgICAgICAgX2lvczogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogKC9pUGFkfGlQaG9uZXxpUG9kLy50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpICYmICF3aW5kb3cuTVNTdHJlYW0pCiAgICAgICAgICAgICAgfHwgKG5hdmlnYXRvci5wbGF0Zm9ybSA9PT0gJ01hY0ludGVsJyAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAxKQogICAgICAgICAgfSwKCiAgICAgICAgICBfZWRnZTogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogdHlwZW9mIENTUyAhPT0gJ3VuZGVmaW5lZCcgJiYgQ1NTLnN1cHBvcnRzKCcoLW1zLWltZS1hbGlnbjphdXRvKScpCiAgICAgICAgICB9LAoKICAgICAgICAgIF9pZTogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogISEobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvVHJpZGVudC8pICYmICFuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9NU0lFLykpCiAgICAgICAgICB9LAoKICAgICAgICAgIF9maXJlZm94OiB7CiAgICAgICAgICAgIHR5cGU6IEJvb2xlYW4sCiAgICAgICAgICAgIHZhbHVlOiBuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkuaW5kZXhPZignZmlyZWZveCcpID4gLTEKICAgICAgICAgIH0sCgogICAgICAgICAgX2FuZHJvaWQ6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IC9hbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KQogICAgICAgICAgfSwKCiAgICAgICAgICBfdG91Y2hEZXZpY2U6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IFRPVUNIX0RFVklDRQogICAgICAgICAgfSwKCiAgICAgICAgICAvKioKICAgICAgICAgICAqIElmIHRydWUsIHRoZSBncmlkJ3MgaGVpZ2h0IGlzIGRlZmluZWQgYnkgaXRzIHJvd3MuCiAgICAgICAgICAgKgogICAgICAgICAgICogRWZmZWN0aXZlbHksIHRoaXMgZGlzYWJsZXMgdGhlIGdyaWQncyB2aXJ0dWFsIHNjcm9sbGluZyBzbyB0aGF0IGFsbCB0aGUgcm93cyBhcmUgcmVuZGVyZWQgaW4gdGhlIERPTSBhdCBvbmNlLgogICAgICAgICAgICogSWYgdGhlIGdyaWQgaGFzIGEgbGFyZ2UgbnVtYmVyIG9mIGl0ZW1zLCB1c2luZyB0aGUgZmVhdHVyZSBpcyBkaXNjb3VyYWdlZCB0byBhdm9pZCBwZXJmb3JtYW5jZSBpc3N1ZXMuCiAgICAgICAgICAgKi8KICAgICAgICAgIGhlaWdodEJ5Um93czogewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICB2YWx1ZTogZmFsc2UsCiAgICAgICAgICAgIHJlZmxlY3RUb0F0dHJpYnV0ZTogdHJ1ZSwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfaGVpZ2h0QnlSb3dzQ2hhbmdlZCcKICAgICAgICAgIH0sCiAgICAgICAgICBfcmVjYWxjdWxhdGVDb2x1bW5XaWR0aE9uY2VMb2FkaW5nRmluaXNoZWQ6IHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgdmFsdWU6IHRydWUKICAgICAgICAgIH0KICAgICAgICB9OwogICAgICB9CgogICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICBzdXBlcigpOwogICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uZW5kJywgdGhpcy5fb25BbmltYXRpb25FbmQpOwogICAgICB9CgogICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICBzdXBlci5jb25uZWN0ZWRDYWxsYmFjaygpOwogICAgICAgIHRoaXMucmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoKTsKICAgICAgfQoKICAgICAgYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrKG5hbWUsIG9sZFZhbHVlLCBuZXdWYWx1ZSkgewogICAgICAgIHN1cGVyLmF0dHJpYnV0ZUNoYW5nZWRDYWxsYmFjayhuYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUpOwogICAgICAgIGlmIChuYW1lID09PSAnZGlyJykgewogICAgICAgICAgdGhpcy5fX2lzUlRMID0gbmV3VmFsdWUgPT09ICdydGwnOwogICAgICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIF9faGFzUm93c1dpdGhDbGllbnRIZWlnaHQoKSB7CiAgICAgICAgcmV0dXJuICEhQXJyYXkuZnJvbSh0aGlzLiQuaXRlbXMuY2hpbGRyZW4pLmZpbHRlcihyb3cgPT4gcm93LmNsaWVudEhlaWdodCkubGVuZ3RoOwogICAgICB9CgogICAgICBfX2l0ZW1zUmVjZWl2ZWQoKSB7CiAgICAgICAgaWYgKHRoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhPbmNlTG9hZGluZ0ZpbmlzaGVkCiAgICAgICAgICAmJiAhdGhpcy5fY2FjaGUuaXNMb2FkaW5nKCkKICAgICAgICAgICYmIHRoaXMuX19oYXNSb3dzV2l0aENsaWVudEhlaWdodCgpKSB7CiAgICAgICAgICB0aGlzLl9yZWNhbGN1bGF0ZUNvbHVtbldpZHRoT25jZUxvYWRpbmdGaW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgdGhpcy5yZWNhbGN1bGF0ZUNvbHVtbldpZHRocygpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLyoqCiAgICAgICAqIEBwYXJhbSB7QXJyYXk8VmFhZGluLkdyaWRDb2x1bW5FbGVtZW50Pn0gY29scyB0aGUgY29sdW1ucyB0byBhdXRvIHNpemUgYmFzZWQgb24gdGhlaXIgY29udGVudCB3aWR0aAogICAgICAgKi8KICAgICAgX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKGNvbHMpIHsKICAgICAgICAvLyBOb3RlOiBUaGUgYGNvbHMuZm9yRWFjaCgpYCBsb29wcyBiZWxvdyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZSBsb29wIGJ1dCB0aGlzIGhhcyBiZWVuCiAgICAgICAgLy8gc3BsaXQgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMgdG8gYmF0Y2ggdGhlc2Ugc2ltaWxhciBhY3Rpb25zIFt3cml0ZS9yZWFkXSB0b2dldGhlciB0byBhdm9pZAogICAgICAgIC8vIHVubmVjZXNzYXJ5IGxheW91dCB0cmFzaGluZy4KCiAgICAgICAgLy8gW3dyaXRlXSBTZXQgYXV0b21hdGljIHdpZHRoIGZvciBhbGwgY2VsbHMgKGJyZWFrcyBjb2x1bW4gYWxpZ25tZW50KQogICAgICAgIGNvbHMuZm9yRWFjaChjb2wgPT4gewogICAgICAgICAgY29sLndpZHRoID0gJ2F1dG8nOwogICAgICAgICAgY29sLl9vcmlnRmxleEdyb3cgPSBjb2wuZmxleEdyb3c7CiAgICAgICAgICBjb2wuZmxleEdyb3cgPSAwOwogICAgICAgIH0pOwogICAgICAgIC8vIFtyZWFkXSBNZWFzdXJlIG1heCBjZWxsIHdpZHRoIGluIGVhY2ggY29sdW1uCiAgICAgICAgY29scy5mb3JFYWNoKGNvbCA9PiB7CiAgICAgICAgICBjb2wuX2N1cnJlbnRXaWR0aCA9IDA7CiAgICAgICAgICAvLyBOb3RlOiBfYWxsQ2VsbHMgb25seSBjb250YWlucyBjZWxscyB3aGljaCBhcmUgY3VycmVudGx5IHJlbmRlcmVkIGluIERPTQogICAgICAgICAgY29sLl9hbGxDZWxscy5mb3JFYWNoKGMgPT4gewogICAgICAgICAgICAvLyBBZGQgMXB4IGJ1ZmZlciB0byB0aGUgb2Zmc2V0IHdpZHRoIHRvIGF2b2lkIHRvbyBuYXJyb3cgY29sdW1ucyAoc3ViLXBpeGVsIHJlbmRlcmluZykKICAgICAgICAgICAgY29uc3QgY2VsbFdpZHRoID0gYy5vZmZzZXRXaWR0aCArIDE7CiAgICAgICAgICAgIGNvbC5fY3VycmVudFdpZHRoID0gTWF0aC5tYXgoY29sLl9jdXJyZW50V2lkdGgsIGNlbGxXaWR0aCk7CiAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgICAgICAvLyBbd3JpdGVdIFNldCBjb2x1bW4gd2lkdGhzIHRvIGZpdCB3aWRlc3QgbWVhc3VyZWQgY29udGVudAogICAgICAgIGNvbHMuZm9yRWFjaChjb2wgPT4gewogICAgICAgICAgY29sLndpZHRoID0gYCR7Y29sLl9jdXJyZW50V2lkdGh9cHhgOwogICAgICAgICAgY29sLmZsZXhHcm93ID0gY29sLl9vcmlnRmxleEdyb3c7CiAgICAgICAgICBjb2wuX2N1cnJlbnRXaWR0aCA9IHVuZGVmaW5lZDsKICAgICAgICAgIGNvbC5fb3JpZ0ZsZXhHcm93ID0gdW5kZWZpbmVkOwogICAgICAgIH0pOwogICAgICB9CgogICAgICAvKioKICAgICAgICogVXBkYXRlcyB0aGUgYHdpZHRoYCBvZiBhbGwgY29sdW1ucyB3aGljaCBoYXZlIGBhdXRvV2lkdGhgIHNldCB0byBgdHJ1ZWAuCiAgICAgICAqLwogICAgICByZWNhbGN1bGF0ZUNvbHVtbldpZHRocygpIHsKICAgICAgICBpZiAoIXRoaXMuX2NvbHVtblRyZWUpIHsKICAgICAgICAgIHJldHVybjsgLy8gTm8gY29sdW1ucwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fY2FjaGUuaXNMb2FkaW5nKCkpIHsKICAgICAgICAgIHRoaXMuX3JlY2FsY3VsYXRlQ29sdW1uV2lkdGhPbmNlTG9hZGluZ0ZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgY29uc3QgY29scyA9IHRoaXMuX2dldENvbHVtbnMoKS5maWx0ZXIoY29sID0+ICFjb2wuaGlkZGVuICYmIGNvbC5hdXRvV2lkdGgpOwogICAgICAgICAgdGhpcy5fcmVjYWxjdWxhdGVDb2x1bW5XaWR0aHMoY29scyk7CgogICAgICAgIH0KICAgICAgfQoKICAgICAgX2NyZWF0ZVNjcm9sbGVyUm93cyhjb3VudCkgewogICAgICAgIGNvbnN0IHJvd3MgPSBbXTsKICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgIGNvbnN0IHJvdyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RyJyk7CiAgICAgICAgICByb3cuc2V0QXR0cmlidXRlKCdwYXJ0JywgJ3JvdycpOwogICAgICAgICAgcm93LnNldEF0dHJpYnV0ZSgncm9sZScsICdyb3cnKTsKICAgICAgICAgIGlmICh0aGlzLl9jb2x1bW5UcmVlKSB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJvdyhyb3csIHRoaXMuX2NvbHVtblRyZWVbdGhpcy5fY29sdW1uVHJlZS5sZW5ndGggLSAxXSwgJ2JvZHknLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICB9CiAgICAgICAgICByb3dzLnB1c2gocm93KTsKICAgICAgICB9CgogICAgICAgIGlmICh0aGlzLl9jb2x1bW5UcmVlKSB7CiAgICAgICAgICB0aGlzLl9jb2x1bW5UcmVlW3RoaXMuX2NvbHVtblRyZWUubGVuZ3RoIC0gMV0uZm9yRWFjaChjID0+IGMubm90aWZ5UGF0aCAmJiBjLm5vdGlmeVBhdGgoJ19jZWxscy4qJywgYy5fY2VsbHMpKTsKICAgICAgICB9CgogICAgICAgIGJlZm9yZU5leHRSZW5kZXIodGhpcywgKCkgPT4gewogICAgICAgICAgdGhpcy5fdXBkYXRlRmlyc3RBbmRMYXN0Q29sdW1uKCk7CiAgICAgICAgICB0aGlzLl9yZXNldEtleWJvYXJkTmF2aWdhdGlvbigpOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiByb3dzOwogICAgICB9CgogICAgICBfZ2V0Um93VGFyZ2V0KCkgewogICAgICAgIHJldHVybiB0aGlzLiQuaXRlbXM7CiAgICAgIH0KCiAgICAgIF9jcmVhdGVDZWxsKHRhZ05hbWUpIHsKICAgICAgICBjb25zdCBjb250ZW50SWQgPSB0aGlzLl9jb250ZW50SW5kZXggPSB0aGlzLl9jb250ZW50SW5kZXggKyAxIHx8IDA7CiAgICAgICAgY29uc3Qgc2xvdE5hbWUgPSAndmFhZGluLWdyaWQtY2VsbC1jb250ZW50LScgKyBjb250ZW50SWQ7CgogICAgICAgIGNvbnN0IGNlbGxDb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndmFhZGluLWdyaWQtY2VsbC1jb250ZW50Jyk7CiAgICAgICAgY2VsbENvbnRlbnQuc2V0QXR0cmlidXRlKCdzbG90Jywgc2xvdE5hbWUpOwoKICAgICAgICBjb25zdCBjZWxsID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICAgICAgICBjZWxsLmlkID0gc2xvdE5hbWUucmVwbGFjZSgnLWNvbnRlbnQtJywgJy0nKTsKICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnLTEnKTsKICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgncm9sZScsIHRhZ05hbWUgPT09ICd0ZCcgPyAnZ3JpZGNlbGwnIDogJ2NvbHVtbmhlYWRlcicpOwoKICAgICAgICBjb25zdCBzbG90ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc2xvdCcpOwogICAgICAgIHNsb3Quc2V0QXR0cmlidXRlKCduYW1lJywgc2xvdE5hbWUpOwoKICAgICAgICBjZWxsLmFwcGVuZENoaWxkKHNsb3QpOwoKICAgICAgICBjZWxsLl9jb250ZW50ID0gY2VsbENvbnRlbnQ7CgogICAgICAgIC8vIFdpdGggbmF0aXZlIFNoYWRvdyBET00sIG1vdXNlZG93biBvbiBzbG90dGVkIGVsZW1lbnQgZG9lcyBub3QgZm9jdXMKICAgICAgICAvLyBmb2N1c2FibGUgc2xvdCB3cmFwcGVyLCB0aGF0IGlzIHdoeSBjZWxscyBhcmUgbm90IGZvY3VzZWQgd2l0aAogICAgICAgIC8vIG1vdXNlZG93bi4gV29ya2Fyb3VuZDogbGlzdGVuIGZvciBtb3VzZWRvd24gYW5kIGZvY3VzIG1hbnVhbGx5LgogICAgICAgIGNlbGxDb250ZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsICgpID0+IHsKICAgICAgICAgIGlmICh3aW5kb3cuY2hyb21lKSB7CiAgICAgICAgICAgIC8vIENocm9tZSBidWc6IGZvY3VzaW5nIGJlZm9yZSBtb3VzZXVwIHByZXZlbnRzIHRleHQgc2VsZWN0aW9uLCBzZWUgaHR0cDovL2NyYnVnLmNvbS83NzE5MDMKICAgICAgICAgICAgY29uc3QgbW91c2VVcExpc3RlbmVyID0gKCkgPT4gewogICAgICAgICAgICAgIGlmICghY2VsbENvbnRlbnQuY29udGFpbnModGhpcy5nZXRSb290Tm9kZSgpLmFjdGl2ZUVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICBjZWxsLmZvY3VzKCk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIC8vIElmIGZvY3VzIGlzIGluIHRoZSBjZWxsIGNvbnRlbnQg4oCUIHJlc3BlY3QgaXQsIGRvIG5vdCBjaGFuZ2UuCiAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2V1cCcsIG1vdXNlVXBMaXN0ZW5lciwgdHJ1ZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCBtb3VzZVVwTGlzdGVuZXIsIHRydWUpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgLy8gRm9jdXMgb24gbW91c2V1cCwgb24gdGhlIG90aGVyIGhhbmQsIHJlbW92ZXMgc2VsZWN0aW9uIG9uIFNhZmFyaS4KICAgICAgICAgICAgLy8gV2F0Y2ggb3V0IHN5bmMgZm9jdXMgcmVtb3ZhbCBpc3N1ZSwgb25seSBhc3luYyBmb2N1cyB3b3JrcyBoZXJlLgogICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICBpZiAoIWNlbGxDb250ZW50LmNvbnRhaW5zKHRoaXMuZ2V0Um9vdE5vZGUoKS5hY3RpdmVFbGVtZW50KSkgewogICAgICAgICAgICAgICAgY2VsbC5mb2N1cygpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CgogICAgICAgIHJldHVybiBjZWxsOwogICAgICB9CgogICAgICBfdXBkYXRlUm93KHJvdywgY29sdW1ucywgc2VjdGlvbiwgaXNDb2x1bW5Sb3csIG5vTm90aWZ5KSB7CiAgICAgICAgc2VjdGlvbiA9IHNlY3Rpb24gfHwgJ2JvZHknOwoKICAgICAgICBjb25zdCBjb250ZW50c0ZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpOwoKICAgICAgICBBcnJheS5mcm9tKHJvdy5jaGlsZHJlbikuZm9yRWFjaChjZWxsID0+IGNlbGwuX3ZhY2FudCA9IHRydWUpOwogICAgICAgIHJvdy5pbm5lckhUTUwgPSAnJzsKICAgICAgICBpZiAocm93LmlkICE9PSAnb3V0ZXJzaXplcicgJiYgcm93LmlkICE9PSAnZml4ZWRzaXplcicpIHsKICAgICAgICAgIHJvdy5oaWRkZW4gPSB0cnVlOwogICAgICAgIH0KICAgICAgICBjb2x1bW5zCiAgICAgICAgICAuZmlsdGVyKGNvbHVtbiA9PiAhY29sdW1uLmhpZGRlbikKICAgICAgICAgIC5mb3JFYWNoKChjb2x1bW4sIGluZGV4LCBjb2xzKSA9PiB7CiAgICAgICAgICAgIGxldCBjZWxsOwoKICAgICAgICAgICAgaWYgKHNlY3Rpb24gPT09ICdib2R5JykgewogICAgICAgICAgICAvLyBCb2R5CiAgICAgICAgICAgICAgY29sdW1uLl9jZWxscyA9IGNvbHVtbi5fY2VsbHMgfHwgW107CiAgICAgICAgICAgICAgY2VsbCA9IGNvbHVtbi5fY2VsbHMuZmlsdGVyKGNlbGwgPT4gY2VsbC5fdmFjYW50KVswXTsKICAgICAgICAgICAgICBpZiAoIWNlbGwpIHsKICAgICAgICAgICAgICAgIGNlbGwgPSB0aGlzLl9jcmVhdGVDZWxsKCd0ZCcpOwogICAgICAgICAgICAgICAgY29sdW1uLl9jZWxscy5wdXNoKGNlbGwpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBjZWxsLnNldEF0dHJpYnV0ZSgncGFydCcsICdjZWxsIGJvZHktY2VsbCcpOwogICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChjZWxsKTsKCiAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSBjb2xzLmxlbmd0aCAtIDEgJiYgKHRoaXMuX3Jvd0RldGFpbHNUZW1wbGF0ZSB8fCB0aGlzLnJvd0RldGFpbHNSZW5kZXJlcikpIHsKICAgICAgICAgICAgICAvLyBBZGQgZGV0YWlscyBjZWxsIGFzIGxhc3QgY2VsbCB0byBib2R5IHJvd3MKICAgICAgICAgICAgICAgIHRoaXMuX2RldGFpbHNDZWxscyA9IHRoaXMuX2RldGFpbHNDZWxscyB8fCBbXTsKICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHNDZWxsID0gdGhpcy5fZGV0YWlsc0NlbGxzLmZpbHRlcihjZWxsID0+IGNlbGwuX3ZhY2FudClbMF0gfHwgdGhpcy5fY3JlYXRlQ2VsbCgndGQnKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kZXRhaWxzQ2VsbHMuaW5kZXhPZihkZXRhaWxzQ2VsbCkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgIHRoaXMuX2RldGFpbHNDZWxscy5wdXNoKGRldGFpbHNDZWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghZGV0YWlsc0NlbGwuX2NvbnRlbnQucGFyZW50RWxlbWVudCkgewogICAgICAgICAgICAgICAgICBjb250ZW50c0ZyYWdtZW50LmFwcGVuZENoaWxkKGRldGFpbHNDZWxsLl9jb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2NvbmZpZ3VyZURldGFpbHNDZWxsKGRldGFpbHNDZWxsKTsKICAgICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChkZXRhaWxzQ2VsbCk7CiAgICAgICAgICAgICAgICB0aGlzLl9hMTF5U2V0Um93RGV0YWlsc0NlbGwocm93LCBkZXRhaWxzQ2VsbCk7CiAgICAgICAgICAgICAgICBkZXRhaWxzQ2VsbC5fdmFjYW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICBpZiAoY29sdW1uLm5vdGlmeVBhdGggJiYgIW5vTm90aWZ5KSB7CiAgICAgICAgICAgICAgICBjb2x1bW4ubm90aWZ5UGF0aCgnX2NlbGxzLionLCBjb2x1bW4uX2NlbGxzKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIC8vIEhlYWRlciAmIGZvb3RlcgogICAgICAgICAgICAgIGNvbnN0IHRhZ05hbWUgPSBzZWN0aW9uID09PSAnaGVhZGVyJyA/ICd0aCcgOiAndGQnOwogICAgICAgICAgICAgIGlmIChpc0NvbHVtblJvdyB8fCBjb2x1bW4ubG9jYWxOYW1lID09PSAndmFhZGluLWdyaWQtY29sdW1uLWdyb3VwJykgewogICAgICAgICAgICAgICAgY2VsbCA9IGNvbHVtbltgXyR7c2VjdGlvbn1DZWxsYF0gfHwgdGhpcy5fY3JlYXRlQ2VsbCh0YWdOYW1lKTsKICAgICAgICAgICAgICAgIGNlbGwuX2NvbHVtbiA9IGNvbHVtbjsKICAgICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChjZWxsKTsKICAgICAgICAgICAgICAgIGNvbHVtbltgXyR7c2VjdGlvbn1DZWxsYF0gPSBjZWxsOwogICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICBjb2x1bW4uX2VtcHR5Q2VsbHMgPSBjb2x1bW4uX2VtcHR5Q2VsbHMgfHwgW107CiAgICAgICAgICAgICAgICBjZWxsID0gY29sdW1uLl9lbXB0eUNlbGxzLmZpbHRlcihjZWxsID0+IGNlbGwuX3ZhY2FudClbMF0gfHwgdGhpcy5fY3JlYXRlQ2VsbCh0YWdOYW1lKTsKICAgICAgICAgICAgICAgIGNlbGwuX2NvbHVtbiA9IGNvbHVtbjsKICAgICAgICAgICAgICAgIHJvdy5hcHBlbmRDaGlsZChjZWxsKTsKICAgICAgICAgICAgICAgIGlmIChjb2x1bW4uX2VtcHR5Q2VsbHMuaW5kZXhPZihjZWxsKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgICAgY29sdW1uLl9lbXB0eUNlbGxzLnB1c2goY2VsbCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIGNlbGwuc2V0QXR0cmlidXRlKCdwYXJ0JywgYGNlbGwgJHtzZWN0aW9ufS1jZWxsYCk7CiAgICAgICAgICAgICAgdGhpcy5fX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkocm93KTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgaWYgKCFjZWxsLl9jb250ZW50LnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICBjb250ZW50c0ZyYWdtZW50LmFwcGVuZENoaWxkKGNlbGwuX2NvbnRlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNlbGwuX3ZhY2FudCA9IGZhbHNlOwogICAgICAgICAgICBjZWxsLl9jb2x1bW4gPSBjb2x1bW47CiAgICAgICAgICB9KTsKCiAgICAgICAgLy8gTWlnaHQgYmUgZW1wdHkgaWYgb25seSBjYWNoZSB3YXMgdXNlZAogICAgICAgIHRoaXMuYXBwZW5kQ2hpbGQoY29udGVudHNGcmFnbWVudCk7CgogICAgICAgIHRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOwogICAgICAgIHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbkZvclJvdyhyb3cpOwogICAgICB9CgogICAgICBfX3VwZGF0ZUhlYWRlckZvb3RlclJvd1Zpc2liaWxpdHkocm93KSB7CiAgICAgICAgaWYgKCFyb3cpIHsKICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgIGNvbnN0IHZpc2libGVSb3dDZWxscyA9IEFycmF5LmZyb20ocm93LmNoaWxkcmVuKS5maWx0ZXIoY2VsbCA9PiB7CiAgICAgICAgICBjb25zdCBjb2x1bW4gPSBjZWxsLl9jb2x1bW47CiAgICAgICAgICBpZiAoY29sdW1uLl9lbXB0eUNlbGxzICYmIGNvbHVtbi5fZW1wdHlDZWxscy5pbmRleE9mKGNlbGwpID4gLTEpIHsKICAgICAgICAgICAgLy8gVGhlIGNlbGwgaXMgYW4gImVtcHR5IGNlbGwiICAtPiBkb2Vzbid0IGJsb2NrIGhpZGluZyB0aGUgcm93CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgIH0KICAgICAgICAgIGlmIChyb3cucGFyZW50RWxlbWVudCA9PT0gdGhpcy4kLmhlYWRlcikgewogICAgICAgICAgICBpZiAoY29sdW1uLmhlYWRlclJlbmRlcmVyIHx8IGNvbHVtbi5faGVhZGVyVGVtcGxhdGUpIHsKICAgICAgICAgICAgICAvLyBUaGUgY2VsbCBpcyB0aGUgaGVhZGVyIGNlbGwgb2YgYSBjb2x1bW4gdGhhdCBoYXMgYSBoZWFkZXIgcmVuZGVyZXIKICAgICAgICAgICAgICAvLyBvciBhIGhlYWRlciB0ZW1wbGF0ZSAtPiByb3cgc2hvdWxkIGJlIHZpc2libGUKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29sdW1uLmhlYWRlciA9PT0gbnVsbCkgewogICAgICAgICAgICAgIC8vIFRoZSBjb2x1bW4gaGVhZGVyIGlzIGV4cGxpY2lsdHkgc2V0IHRvIG51bGwgLT4gZG9lc24ndCBibG9jayBoaWRpbmcgdGhlIHJvdwogICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29sdW1uLnBhdGggfHwgY29sdW1uLmhlYWRlciAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgLy8gVGhlIGNvbHVtbiBoYXMgYW4gZXhwbGljaXQgbm9uLW51bGwgaGVhZGVyIG9yIGEgcGF0aCB0aGF0IGdlbmVyYXRlcyBhIGhlYWRlcgogICAgICAgICAgICAgIC8vIC0+IHJvdyBzaG91bGQgYmUgdmlzaWJsZQogICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAoY29sdW1uLmZvb3RlclJlbmRlcmVyIHx8IGNvbHVtbi5fZm9vdGVyVGVtcGxhdGUpIHsKICAgICAgICAgICAgICAvLyBUaGUgY2VsbCBpcyB0aGUgZm9vdGVyIGNlbGwgb2YgYSBjb2x1bW4gdGhhdCBoYXMgYSBmb290ZXIgcmVuZGVyZXIKICAgICAgICAgICAgICAvLyBvciBhIGZvb3RlciB0ZW1wbGF0ZSAtPiByb3cgc2hvdWxkIGJlIHZpc2libGUKICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICBpZiAocm93LmhpZGRlbiAhPT0gIXZpc2libGVSb3dDZWxscy5sZW5ndGgpIHsKICAgICAgICAgIHJvdy5oaWRkZW4gPSAhdmlzaWJsZVJvd0NlbGxzLmxlbmd0aDsKICAgICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfdXBkYXRlU2Nyb2xsZXJJdGVtKHJvdywgaW5kZXgpIHsKICAgICAgICB0aGlzLl9wcmV2ZW50U2Nyb2xsZXJSb3RhdGluZ0NlbGxGb2N1cyhyb3csIGluZGV4KTsKCiAgICAgICAgaWYgKCF0aGlzLl9jb2x1bW5UcmVlKSB7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICB0aGlzLl90b2dnbGVBdHRyaWJ1dGUoJ2ZpcnN0JywgaW5kZXggPT09IDAsIHJvdyk7CiAgICAgICAgdGhpcy5fdG9nZ2xlQXR0cmlidXRlKCdvZGQnLCBpbmRleCAlIDIsIHJvdyk7CiAgICAgICAgdGhpcy5fYTExeVVwZGF0ZVJvd1Jvd2luZGV4KHJvdywgaW5kZXgpOwogICAgICAgIHRoaXMuX2dldEl0ZW0oaW5kZXgsIHJvdyk7CiAgICAgIH0KCiAgICAgIF9jb2x1bW5UcmVlQ2hhbmdlZChjb2x1bW5UcmVlLCBzcGxpY2VzKSB7CiAgICAgICAgdGhpcy5fcmVuZGVyQ29sdW1uVHJlZShjb2x1bW5UcmVlKTsKICAgICAgICB0aGlzLnJlY2FsY3VsYXRlQ29sdW1uV2lkdGhzKCk7CiAgICAgIH0KCiAgICAgIF9yZW5kZXJDb2x1bW5UcmVlKGNvbHVtblRyZWUpIHsKICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5pdGVtcy5jaGlsZHJlbikuZm9yRWFjaCgocm93KSA9PiB0aGlzLl91cGRhdGVSb3cocm93LCBjb2x1bW5UcmVlW2NvbHVtblRyZWUubGVuZ3RoIC0gMV0sIG51bGwsIGZhbHNlLCB0cnVlKSk7CgogICAgICAgIHdoaWxlICh0aGlzLiQuaGVhZGVyLmNoaWxkcmVuLmxlbmd0aCA8IGNvbHVtblRyZWUubGVuZ3RoKSB7CiAgICAgICAgICBjb25zdCBoZWFkZXJSb3cgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0cicpOwogICAgICAgICAgaGVhZGVyUm93LnNldEF0dHJpYnV0ZSgncGFydCcsICdyb3cnKTsKICAgICAgICAgIGhlYWRlclJvdy5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncm93Jyk7CiAgICAgICAgICB0aGlzLiQuaGVhZGVyLmFwcGVuZENoaWxkKGhlYWRlclJvdyk7CgogICAgICAgICAgY29uc3QgZm9vdGVyUm93ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndHInKTsKICAgICAgICAgIGZvb3RlclJvdy5zZXRBdHRyaWJ1dGUoJ3BhcnQnLCAncm93Jyk7CiAgICAgICAgICBmb290ZXJSb3cuc2V0QXR0cmlidXRlKCdyb2xlJywgJ3JvdycpOwogICAgICAgICAgdGhpcy4kLmZvb3Rlci5hcHBlbmRDaGlsZChmb290ZXJSb3cpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAodGhpcy4kLmhlYWRlci5jaGlsZHJlbi5sZW5ndGggPiBjb2x1bW5UcmVlLmxlbmd0aCkgewogICAgICAgICAgdGhpcy4kLmhlYWRlci5yZW1vdmVDaGlsZCh0aGlzLiQuaGVhZGVyLmZpcnN0RWxlbWVudENoaWxkKTsKICAgICAgICAgIHRoaXMuJC5mb290ZXIucmVtb3ZlQ2hpbGQodGhpcy4kLmZvb3Rlci5maXJzdEVsZW1lbnRDaGlsZCk7CiAgICAgICAgfQoKICAgICAgICBBcnJheS5mcm9tKHRoaXMuJC5oZWFkZXIuY2hpbGRyZW4pCiAgICAgICAgICAuZm9yRWFjaCgoaGVhZGVyUm93LCBpbmRleCkgPT4gdGhpcy5fdXBkYXRlUm93KGhlYWRlclJvdywgY29sdW1uVHJlZVtpbmRleF0sICdoZWFkZXInLCBpbmRleCA9PT0gY29sdW1uVHJlZS5sZW5ndGggLSAxKSk7CgogICAgICAgIEFycmF5LmZyb20odGhpcy4kLmZvb3Rlci5jaGlsZHJlbikKICAgICAgICAgIC5mb3JFYWNoKChmb290ZXJSb3csIGluZGV4KSA9PiB0aGlzLl91cGRhdGVSb3coZm9vdGVyUm93LCBjb2x1bW5UcmVlW2NvbHVtblRyZWUubGVuZ3RoIC0gMSAtIGluZGV4XSwgJ2Zvb3RlcicsIGluZGV4ID09PSAwKSk7CgogICAgICAgIC8vIFNpemVyIHJvd3MKICAgICAgICB0aGlzLl91cGRhdGVSb3codGhpcy4kLm91dGVyc2l6ZXIsIGNvbHVtblRyZWVbY29sdW1uVHJlZS5sZW5ndGggLSAxXSwgbnVsbCwgZmFsc2UsIHRydWUpOwogICAgICAgIHRoaXMuX3VwZGF0ZVJvdyh0aGlzLiQuZml4ZWRzaXplciwgY29sdW1uVHJlZVtjb2x1bW5UcmVlLmxlbmd0aCAtIDFdKTsKCiAgICAgICAgdGhpcy5fcmVzaXplSGFuZGxlcigpOwogICAgICAgIHRoaXMuX2Zyb3plbkNlbGxzQ2hhbmdlZCgpOwogICAgICAgIHRoaXMuX3VwZGF0ZUZpcnN0QW5kTGFzdENvbHVtbigpOwogICAgICAgIHRoaXMuX3Jlc2V0S2V5Ym9hcmROYXZpZ2F0aW9uKCk7CiAgICAgICAgdGhpcy5fYTExeVVwZGF0ZUhlYWRlclJvd3MoKTsKICAgICAgICB0aGlzLl9hMTF5VXBkYXRlRm9vdGVyUm93cygpOwogICAgICB9CgogICAgICBfdXBkYXRlSXRlbShyb3csIGl0ZW0pIHsKICAgICAgICByb3cuX2l0ZW0gPSBpdGVtOwogICAgICAgIGNvbnN0IG1vZGVsID0gdGhpcy5fX2dldFJvd01vZGVsKHJvdyk7CgogICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnc2VsZWN0ZWQnLCBtb2RlbC5zZWxlY3RlZCwgcm93KTsKICAgICAgICB0aGlzLl9hMTF5VXBkYXRlUm93U2VsZWN0ZWQocm93LCBtb2RlbC5zZWxlY3RlZCk7CiAgICAgICAgdGhpcy5fYTExeVVwZGF0ZVJvd0xldmVsKHJvdywgbW9kZWwubGV2ZWwpOwogICAgICAgIHRoaXMuX3RvZ2dsZUF0dHJpYnV0ZSgnZXhwYW5kZWQnLCBtb2RlbC5leHBhbmRlZCwgcm93KTsKICAgICAgICBpZiAodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlIHx8IHRoaXMucm93RGV0YWlsc1JlbmRlcmVyKSB7CiAgICAgICAgICB0aGlzLl90b2dnbGVEZXRhaWxzQ2VsbChyb3csIGl0ZW0pOwogICAgICAgIH0KICAgICAgICB0aGlzLl9nZW5lcmF0ZUNlbGxDbGFzc05hbWVzKHJvdywgbW9kZWwpOwogICAgICAgIHRoaXMuX2ZpbHRlckRyYWdBbmREcm9wKHJvdywgbW9kZWwpOwoKICAgICAgICBBcnJheS5mcm9tKHJvdy5jaGlsZHJlbikuZm9yRWFjaChjZWxsID0+IHsKICAgICAgICAgIGlmIChjZWxsLl9yZW5kZXJlcikgewogICAgICAgICAgICBjb25zdCBvd25lciA9IGNlbGwuX2NvbHVtbiB8fCB0aGlzOwogICAgICAgICAgICBjZWxsLl9yZW5kZXJlci5jYWxsKG93bmVyLCBjZWxsLl9jb250ZW50LCBvd25lciwgbW9kZWwpOwogICAgICAgICAgfSBlbHNlIGlmIChjZWxsLl9pbnN0YW5jZSkgewogICAgICAgICAgICBjZWxsLl9pbnN0YW5jZS5fX2RldGFpbHNPcGVuZWRfXyA9IG1vZGVsLmRldGFpbHNPcGVuZWQ7CiAgICAgICAgICAgIGNlbGwuX2luc3RhbmNlLl9fc2VsZWN0ZWRfXyA9IG1vZGVsLnNlbGVjdGVkOwogICAgICAgICAgICBjZWxsLl9pbnN0YW5jZS5fX2xldmVsX18gPSBtb2RlbC5sZXZlbDsKICAgICAgICAgICAgY2VsbC5faW5zdGFuY2UuX19leHBhbmRlZF9fID0gbW9kZWwuZXhwYW5kZWQ7CiAgICAgICAgICAgIGNlbGwuX2luc3RhbmNlLnNldFByb3BlcnRpZXMobW9kZWwpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICB0aGlzLl9kZWJvdW5jZXJVcGRhdGVIZWlnaHRzID0gRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlclVwZGF0ZUhlaWdodHMsCiAgICAgICAgICB0aW1lT3V0LmFmdGVyKDEpLCAoKSA9PiB7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU1ldHJpY3MoKTsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25JdGVtcygpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVTY3JvbGxlclNpemUoKTsKICAgICAgICAgIH0KICAgICAgICApOwogICAgICB9CgogICAgICBfcmVzaXplSGFuZGxlcigpIHsKICAgICAgICB0aGlzLl91cGRhdGVEZXRhaWxzQ2VsbEhlaWdodHMoKTsKICAgICAgICB0aGlzLl9hY2Nlc3NJcm9uTGlzdEFQSShzdXBlci5fcmVzaXplSGFuZGxlciwgdHJ1ZSk7CiAgICAgICAgdGhpcy5fdXBkYXRlU2Nyb2xsZXJNZWFzdXJlbWVudHMoKTsKICAgICAgICB0aGlzLl91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCk7CiAgICAgIH0KCiAgICAgIF91cGRhdGVIZWFkZXJGb290ZXJNZXRyaWNzKCkgewogICAgICAgIGNvbnN0IGhlYWRlckhlaWdodCA9IHRoaXMuJC5oZWFkZXIuY2xpZW50SGVpZ2h0ICsgJ3B4JzsKICAgICAgICBjb25zdCBmb290ZXJIZWlnaHQgPSB0aGlzLiQuZm9vdGVyLmNsaWVudEhlaWdodCArICdweCc7CiAgICAgICAgW3RoaXMuJC5vdXRlcnNpemVyLCB0aGlzLiQuZml4ZWRzaXplciwgdGhpcy4kLml0ZW1zXS5mb3JFYWNoKGVsZW1lbnQgPT4gewogICAgICAgICAgZWxlbWVudC5zdHlsZS5ib3JkZXJUb3BXaWR0aCA9IGhlYWRlckhlaWdodDsKICAgICAgICAgIGVsZW1lbnQuc3R5bGUuYm9yZGVyQm90dG9tV2lkdGggPSBmb290ZXJIZWlnaHQ7CiAgICAgICAgfSk7CgogICAgICAgIGFmdGVyTmV4dFJlbmRlcih0aGlzLiQuaGVhZGVyLCAoKSA9PiB7CiAgICAgICAgICBpZiAodGhpcy5fcGVuZGluZ1Njcm9sbFRvSW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9JbmRleCh0aGlzLl9wZW5kaW5nU2Nyb2xsVG9JbmRleCk7CiAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgIH0KCiAgICAgIF9vbkFuaW1hdGlvbkVuZChlKSB7CiAgICAgICAgLy8gU2hhZHlDU1MgYXBwbGllcyBzY29waW5nIHN1ZmZpeGVzIHRvIGFuaW1hdGlvbiBuYW1lcwogICAgICAgIGlmIChlLmFuaW1hdGlvbk5hbWUuaW5kZXhPZigndmFhZGluLWdyaWQtYXBwZWFyJykgPT09IDApIHsKICAgICAgICAgIHRoaXMuX3JlbmRlcigpOwogICAgICAgICAgdGhpcy5fdXBkYXRlSGVhZGVyRm9vdGVyTWV0cmljcygpOwogICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgICB0aGlzLl9faXRlbXNSZWNlaXZlZCgpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgX3RvZ2dsZUF0dHJpYnV0ZShuYW1lLCBib29sLCBub2RlKSB7CiAgICAgICAgaWYgKG5vZGUuaGFzQXR0cmlidXRlKG5hbWUpID09PSAhYm9vbCkgewogICAgICAgICAgaWYgKGJvb2wpIHsKICAgICAgICAgICAgbm9kZS5zZXRBdHRyaWJ1dGUobmFtZSwgJycpOwogICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgbm9kZS5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBfX2dldFJvd01vZGVsKHJvdykgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICBpbmRleDogcm93LmluZGV4LAogICAgICAgICAgaXRlbTogcm93Ll9pdGVtLAogICAgICAgICAgbGV2ZWw6IHRoaXMuX2dldEluZGV4TGV2ZWwocm93LmluZGV4KSwKICAgICAgICAgIGV4cGFuZGVkOiB0aGlzLl9pc0V4cGFuZGVkKHJvdy5faXRlbSksCiAgICAgICAgICBzZWxlY3RlZDogdGhpcy5faXNTZWxlY3RlZChyb3cuX2l0ZW0pLAogICAgICAgICAgZGV0YWlsc09wZW5lZDoKICAgICAgICAgICAgISEodGhpcy5fcm93RGV0YWlsc1RlbXBsYXRlIHx8IHRoaXMucm93RGV0YWlsc1JlbmRlcmVyKSAmJiB0aGlzLl9pc0RldGFpbHNPcGVuZWQocm93Ll9pdGVtKQogICAgICAgIH07CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBNYW51YWxseSBpbnZva2UgZXhpc3RpbmcgcmVuZGVyZXJzIGZvciBhbGwgdGhlIGNvbHVtbnMKICAgICAgICogKGhlYWRlciwgZm9vdGVyIGFuZCBib2R5IGNlbGxzKSBhbmQgb3BlbmVkIHJvdyBkZXRhaWxzLgogICAgICAgKi8KICAgICAgcmVuZGVyKCkgewogICAgICAgIGlmICh0aGlzLl9jb2x1bW5UcmVlKSB7CiAgICAgICAgICAvLyBoZWFkZXIgYW5kIGZvb3RlciByZW5kZXJlcnMKICAgICAgICAgIHRoaXMuX2NvbHVtblRyZWUuZm9yRWFjaChsZXZlbCA9PiB7CiAgICAgICAgICAgIGxldmVsLmZvckVhY2goY29sdW1uID0+IGNvbHVtbi5fcmVuZGVySGVhZGVyQW5kRm9vdGVyKCkpOwogICAgICAgICAgfSk7CgogICAgICAgICAgLy8gYm9keSBhbmQgcm93IGRldGFpbHMgcmVuZGVyZXJzCiAgICAgICAgICB0aGlzLl91cGRhdGUoKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIC8qKgogICAgICAgKiBVcGRhdGVzIHRoZSBjb21wdXRlZCBtZXRyaWNzIGFuZCBwb3NpdGlvbmluZyBvZiBpbnRlcm5hbCBncmlkIHBhcnRzCiAgICAgICAqIChyb3cvZGV0YWlscyBjZWxsIHBvc2l0aW9uaW5nIGV0YykuIE5lZWRzIHRvIGJlIGludm9rZWQgd2hlbmV2ZXIgdGhlIHNpemluZyBvZiBncmlkCiAgICAgICAqIGNvbnRlbnQgY2hhbmdlcyBhc3luY2hyb25vdXNseSB0byBlbnN1cmUgY29uc2lzdGVudCBhcHBlYXJhbmNlIChlLmcuIHdoZW4gYQogICAgICAgKiBjb250YWluZWQgaW1hZ2Ugd2hvc2UgYm91bmRzIGFyZW4ndCBrbm93biBiZWZvcmVoYW5kIGZpbmlzaGVzIGxvYWRpbmcpLgogICAgICAgKi8KICAgICAgbm90aWZ5UmVzaXplKCkgewogICAgICAgIHN1cGVyLm5vdGlmeVJlc2l6ZSgpOwogICAgICB9CgogICAgICBfaGVpZ2h0QnlSb3dzQ2hhbmdlZCh2YWx1ZSwgb2xkVmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgfHwgb2xkVmFsdWUpIHsKICAgICAgICAgIHRoaXMubm90aWZ5UmVzaXplKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBfX2ZvcmNlUmVmbG93KCkgewogICAgICAgIHRoaXMuX2RlYm91bmNlckZvcmNlUmVmbG93ID0gRGVib3VuY2VyLmRlYm91bmNlKHRoaXMuX2RlYm91bmNlckZvcmNlUmVmbG93LAogICAgICAgICAgYW5pbWF0aW9uRnJhbWUsICgpID0+IHsKICAgICAgICAgICAgdGhpcy4kLnNjcm9sbGVyLnN0eWxlLm92ZXJmbG93ID0gJ2hpZGRlbic7CiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4gdGhpcy4kLnNjcm9sbGVyLnN0eWxlLm92ZXJmbG93ID0gJycpOwogICAgICAgICAgfQogICAgICAgICk7CiAgICAgIH0KICAgIH0KCiAgICBjdXN0b21FbGVtZW50cy5kZWZpbmUoR3JpZEVsZW1lbnQuaXMsIEdyaWRFbGVtZW50KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNiBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZkRvd25sb2FkZXIgPSBjbGFzcyBUZkRvd25sb2FkZXIgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3J1biA9ICcnOwogICAgICAgIH0KICAgICAgICBfY3N2VXJsKHRhZywgcnVuLCB1cmxGbikgewogICAgICAgICAgICBpZiAoIXJ1bikKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgcmV0dXJuIGFkZFBhcmFtcyh1cmxGbih0YWcsIHJ1biksIHsgZm9ybWF0OiAnY3N2JyB9KTsKICAgICAgICB9CiAgICAgICAgX2pzb25VcmwodGFnLCBydW4sIHVybEZuKSB7CiAgICAgICAgICAgIGlmICghcnVuKQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1cm4gdXJsRm4odGFnLCBydW4pOwogICAgICAgIH0KICAgICAgICBfY3N2TmFtZSh0YWcsIHJ1bikgewogICAgICAgICAgICBpZiAoIXJ1bikKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgcmV0dXJuIGBydW4tJHtydW59LXRhZy0ke3RhZ30uY3N2YDsKICAgICAgICB9CiAgICAgICAgX2pzb25OYW1lKHRhZywgcnVuKSB7CiAgICAgICAgICAgIGlmICghcnVuKQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1cm4gYHJ1bi0ke3J1bn0tdGFnLSR7dGFnfS5qc29uYDsKICAgICAgICB9CiAgICB9OwogICAgVGZEb3dubG9hZGVyLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8cGFwZXItZHJvcGRvd24tbWVudQogICAgICBuby1sYWJlbC1mbG9hdD0idHJ1ZSIKICAgICAgbGFiZWw9InJ1biB0byBkb3dubG9hZCIKICAgICAgc2VsZWN0ZWQtaXRlbS1sYWJlbD0ie3tfcnVufX0iCiAgICA+CiAgICAgIDxwYXBlci1saXN0Ym94IHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbcnVuc11dIj4KICAgICAgICAgIDxwYXBlci1pdGVtIG5vLWxhYmVsLWZsb2F0PSJ0cnVlIj5bW2l0ZW1dXTwvcGFwZXItaXRlbT4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICA8L3BhcGVyLWRyb3Bkb3duLW1lbnU+CiAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX3J1bl1dIj4KICAgICAgPGEgZG93bmxvYWQ9IltbX2Nzdk5hbWUodGFnLCBfcnVuKV1dIiBocmVmPSJbW19jc3ZVcmwodGFnLCBfcnVuLCB1cmxGbildXSIKICAgICAgICA+Q1NWPC9hCiAgICAgID48IS0tCiAgICAgIC0tPjxhCiAgICAgICAgZG93bmxvYWQ9IltbX2pzb25OYW1lKHRhZywgX3J1bildXSIKICAgICAgICBocmVmPSJbW19qc29uVXJsKHRhZywgX3J1biwgdXJsRm4pXV0iCiAgICAgICAgPkpTT048L2EKICAgICAgPgogICAgPC90ZW1wbGF0ZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KICAgICAgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CiAgICAgIGEgewogICAgICAgIGZvbnQtc2l6ZTogMTBweDsKICAgICAgICBtYXJnaW46IDAgMC4yZW07CiAgICAgIH0KICAgICAgcGFwZXItaW5wdXQgewogICAgICAgIGZvbnQtc2l6ZTogMjJweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkRvd25sb2FkZXIucHJvdG90eXBlLCAiX3J1biIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkRvd25sb2FkZXIucHJvdG90eXBlLCAicnVucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmRG93bmxvYWRlci5wcm90b3R5cGUsICJ0YWciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkRvd25sb2FkZXIucHJvdG90eXBlLCAidXJsRm4iLCB2b2lkIDApOwogICAgVGZEb3dubG9hZGVyID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZG93bmxvYWRlcicpCiAgICBdLCBUZkRvd25sb2FkZXIpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBpbml0aWFsIFVSTCBxdWVyeSBwYXJhbXMsIGJlZm9yZSB0aGUgQXBwUm91dGluZ0VmZmVjdHMgaW5pdGlhbGl6ZS4KICAgICAqLwogICAgY29uc3QgaW5pdGlhbFVSTFNlYXJjaFBhcmFtcyQxID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgIC8qKgogICAgICogQSBjYXJkIHRoYXQgaGFuZGxlcyBsb2FkaW5nIGRhdGEgKGF0IHRoZSByaWdodCB0aW1lcyksIHJlbmRlcmluZyBhIHNjYWxhcgogICAgICogY2hhcnQsIGFuZCBwcm92aWRpbmcgVUkgYWZmb3JkYW5jZXMgKHN1Y2ggYXMgYnV0dG9ucykgZm9yIHNjYWxhciBkYXRhLgogICAgICovCiAgICBsZXQgVGZTY2FsYXJDYXJkID0gCiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLXZhcmlhYmxlCiAgICBjbGFzcyBUZlNjYWxhckNhcmQgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8vIElmIHNwZWNpZmllZCB1c2VzIHRoZSBnaXZlbiBjb2xvclNjYWxlOyBvdGhlcndpc2UsIHVzZXMgYSBidWlsdC1pbgogICAgICAgICAgICAvLyBkZWZhdWx0LiBTZWUgX2dldENvbG9yU2NhbGUgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4KICAgICAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gbnVsbDsKICAgICAgICAgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBkYXRhIGlzIHJlY2VpdmVkIGZyb20gdGhlIGJhY2tlbmQuCiAgICAgICAgICAgIHRoaXMuX2xvYWREYXRhQ2FsbGJhY2sgPSAoc2NhbGFyQ2hhcnQsIGl0ZW0sIG1heWJlRGF0YSkgPT4gewogICAgICAgICAgICAgICAgaWYgKG1heWJlRGF0YSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignRmFpbGVkIHRvIGxvYWQgZGF0YSBmb3I6JywgaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVkRGF0YSA9IG1heWJlRGF0YS5tYXAoKGRhdHVtKSA9PiAoewogICAgICAgICAgICAgICAgICAgIHdhbGxfdGltZTogbmV3IERhdGUoZGF0dW1bMF0gKiAxMDAwKSwKICAgICAgICAgICAgICAgICAgICBzdGVwOiBkYXR1bVsxXSwKICAgICAgICAgICAgICAgICAgICBzY2FsYXI6IGRhdHVtWzJdLAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IHRoaXMuX2dldFNlcmllc05hbWVGcm9tRGF0dW0oaXRlbSk7CiAgICAgICAgICAgICAgICBzY2FsYXJDaGFydC5zZXRTZXJpZXNNZXRhZGF0YShuYW1lLCBpdGVtKTsKICAgICAgICAgICAgICAgIHNjYWxhckNoYXJ0LnNldFNlcmllc0RhdGEobmFtZSwgZm9ybWF0dGVkRGF0YSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuZ2V0RGF0YUxvYWRVcmwgPSAoeyB0YWcsIHJ1biB9KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ3NjYWxhcnMnLCAnL3NjYWxhcnMnLCBuZXcgVVJMU2VhcmNoUGFyYW1zKHsgdGFnLCBydW4gfSkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBUbyBiZSBwcm92aWRlZCBhcyB0aGUgYHVybC1mbmAgcHJvcGVydHkgdG8gYHRmLWRvd25sb2FkZXJgLgogICAgICAgICAgICB0aGlzLl9kb3dubG9hZFVybEZuID0gKHRhZywgcnVuKSA9PiB0aGlzLmdldERhdGFMb2FkVXJsKHsgdGFnLCBydW4gfSk7CiAgICAgICAgICAgIC8vIEEgZnVuY3Rpb24gY2FsbGVkIHRvIGZldGNoIHRoZSBzY2FsYXJzIGRhdGEgZnJvbSB0aGUgYmFja2VuZC4KICAgICAgICAgICAgLy8gU2hvdWxkIHJlY2VpdmUgYSB7dGFnLCBydW4sIGV4cGVyaW1lbnR9IG9iamVjdCBhbmQgcmV0dXJuCiAgICAgICAgICAgIC8vIGEgcHJvbWlzZSByZXNvbHZpbmcgd2l0aCB0aGUgZmV0Y2hlZCBzY2FsYXJzLiBUaGUgZGVmYXVsdAogICAgICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uIGV4ZWN1dGVzOgogICAgICAgICAgICAvLyB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QoCiAgICAgICAgICAgIC8vICAgICAgdGhpcy5nZXREYXRhTG9hZFVybCh7dGFnLCBydW4sIGV4cGVyaW1lbnR9KQogICAgICAgICAgICB0aGlzLnJlcXVlc3REYXRhID0gKGl0ZW1zLCBvbkxvYWQsIG9uRmluaXNoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBHb29nbGUtaW50ZXJuYWwgQ29sYWIgZG9lc24ndCBzdXBwb3J0IEhUVFAgUE9TVCByZXF1ZXN0cywgc28gd2UgZmFsbAogICAgICAgICAgICAgICAgLy8gYmFjayB0byBIVFRQIEdFVCAoZXZlbiB0aG91Z2ggcHVibGljIENvbGFiIHN1cHBvcnRzIFBPU1QpLgogICAgICAgICAgICAgICAgLy8gU2VlIGIvMTI2Mzg3MTA2LgogICAgICAgICAgICAgICAgY29uc3QgaW5Db2xhYiA9IGluaXRpYWxVUkxTZWFyY2hQYXJhbXMkMS5nZXQoJ3RlbnNvcmJvYXJkQ29sYWInKSA9PT0gJ3RydWUnOwogICAgICAgICAgICAgICAgaWYgKGluQ29sYWIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdERhdGFHZXQoaXRlbXMsIG9uTG9hZCwgb25GaW5pc2gpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3REYXRhUG9zdChpdGVtcywgb25Mb2FkLCBvbkZpbmlzaCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3REYXRhR2V0ID0gKGl0ZW1zLCBvbkxvYWQsIG9uRmluaXNoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXIgPSBnZXRSb3V0ZXIoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSByb3V0ZXIucGx1Z2luUm91dGUoJ3NjYWxhcnMnLCAnL3NjYWxhcnMnKTsKICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGFkZFBhcmFtcyhiYXNlVXJsLCB7IHRhZzogaXRlbS50YWcsIHJ1bjogaXRlbS5ydW4gfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIKICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVlc3QodXJsKQogICAgICAgICAgICAgICAgICAgICAgICAudGhlbigoZGF0YSkgPT4gdm9pZCBvbkxvYWQoeyBpdGVtLCBkYXRhIH0pKTsKICAgICAgICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHZvaWQgb25GaW5pc2goKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3REYXRhUG9zdCA9IChpdGVtcywgb25Mb2FkLCBvbkZpbmlzaCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgcm91dGVyID0gZ2V0Um91dGVyKCk7CiAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSByb3V0ZXIucGx1Z2luUm91dGUoJ3NjYWxhcnMnLCAnL3NjYWxhcnNfbXVsdGlydW4nKTsKICAgICAgICAgICAgICAgIGNvbnN0IHJ1bnNCeVRhZyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgeyB0YWcsIHJ1biB9IG9mIGl0ZW1zKSB7CiAgICAgICAgICAgICAgICAgICAgbGV0IHJ1bnMgPSBydW5zQnlUYWcuZ2V0KHRhZyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bnMgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlUYWcuc2V0KHRhZywgKHJ1bnMgPSBbXSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBydW5zLnB1c2gocnVuKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFJlcXVlc3QgYXQgbW9zdCB0aGlzIG1hbnkgcnVucyBhdCBvbmNlLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIEJhY2stb2YtdGhlLWVudmVsb3BlIG1hdGg6IGVhY2ggc2NhbGFyIGRhdHVtIEpTT04gdmFsdWUgY29udGFpbnMKICAgICAgICAgICAgICAgIC8vIHR3byBmbG9hdHMgYW5kIGEgc21hbGwtaXNoIGludGVnZXIuIEZsb2F0cyBhcmUgYWJvdXQgMTggYnl0ZXMsCiAgICAgICAgICAgICAgICAvLyBzaW5jZSBmNjRzIGhhdmUgLWxvZ18xMCgyXi01Mykgfj0gMTYgZGlnaXRzIG9mIHByZWNpc2lvbiBwbHVzCiAgICAgICAgICAgICAgICAvLyBkZWNpbWFsIHBvaW50IGFuZCBsZWFkaW5nIHplcm8uIFNtYWxsLWlzaCBpbnRlZ2VycyAoc3RlcHMpIGFyZQogICAgICAgICAgICAgICAgLy8gYWJvdXQgNSBieXRlcy4gQWRkIEpTT04gb3ZlcmhlYWQgYFssLF0sYCBhbmQgeW91J3JlIGxvb2tpbmcgYXQKICAgICAgICAgICAgICAgIC8vIGFib3V0IDQ4IGJ5dGVzIHBlciBkYXR1bS4gV2l0aCBzdGFuZGFyZCBkb3duc2FtcGxpbmcgb2YKICAgICAgICAgICAgICAgIC8vIDEwMDAgcG9pbnRzIHBlciB0aW1lIHNlcmllcywgZXhwZWN0IH41MCBLQiBvZiByZXNwb25zZSBwYXlsb2FkCiAgICAgICAgICAgICAgICAvLyBwZXIgcmVxdWVzdGVkIHRpbWUgc2VyaWVzLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIFJlcXVlc3RpbmcgNjQgdGltZSBzZXJpZXMgd2FycmFudHMgYSB+MyBNQiByZXNwb25zZSwgd2hpY2ggc2VlbXMKICAgICAgICAgICAgICAgIC8vIHJlYXNvbmFibGUuCiAgICAgICAgICAgICAgICBjb25zdCBCQVRDSF9TSVpFID0gNjQ7CiAgICAgICAgICAgICAgICBjb25zdCByZXF1ZXN0R3JvdXBzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFt0YWcsIHJ1bnNdIG9mIHJ1bnNCeVRhZykgewogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcnVucy5sZW5ndGg7IGkgKz0gQkFUQ0hfU0laRSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0R3JvdXBzLnB1c2goeyB0YWcsIHJ1bnM6IHJ1bnMuc2xpY2UoaSwgaSArIEJBVENIX1NJWkUpIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKHJlcXVlc3RHcm91cHMubWFwKCh7IHRhZywgcnVucyB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwsIHsgdGFnLCBydW5zIH0pLnRoZW4oKGFsbERhdGEpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBydW4gb2YgcnVucykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaXRlbSA9IHsgdGFnLCBydW4gfTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYWxsRGF0YSwgcnVuKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9hZCh7IGl0ZW0sIGRhdGE6IGFsbERhdGFbcnVuXSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uTG9hZCh7IGl0ZW0sIGRhdGE6IG51bGwgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKS5maW5hbGx5KCgpID0+IHZvaWQgb25GaW5pc2goKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX2dldERhdGFMb2FkTmFtZSA9IChkYXR1bSkgPT4gdGhpcy5fZ2V0U2VyaWVzTmFtZUZyb21EYXR1bShkYXR1bSk7CiAgICAgICAgICAgIHRoaXMuX2V4cGFuZGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBDb2x1bW5zID0gKCgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbnMgPSBERUZBVUxUX1RPT0xUSVBfQ09MVU1OUy5zbGljZSgpOwogICAgICAgICAgICAgICAgY29uc3QgaW5kID0gY29sdW1ucy5maW5kSW5kZXgoKGMpID0+IGMudGl0bGUgPT0gJ05hbWUnKTsKICAgICAgICAgICAgICAgIGNvbHVtbnMuc3BsaWNlKGluZCwgMSwgewogICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnTmFtZScsCiAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdHVtID0gZC5kYXRhc2V0Lm1ldGFkYXRhKCkubWV0YTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGRhdHVtKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gY29sdW1uczsKICAgICAgICAgICAgfSkoKTsKICAgICAgICB9CiAgICAgICAgX2dldENoYXJ0RGF0YUxvYWRlcigpIHsKICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVubmVjZXNzYXJ5LXR5cGUtYXNzZXJ0aW9uCiAgICAgICAgICAgIHJldHVybiB0aGlzLnNoYWRvd1Jvb3QucXVlcnlTZWxlY3RvcigndGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcicpOyAvLyBUZkxpbmVDaGFydERhdGFMb2FkZXIKICAgICAgICB9CiAgICAgICAgcmVsb2FkKCkgewogICAgICAgICAgICB0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWxvYWQoKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWRyYXcoKTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUV4cGFuZGVkKGUpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19leHBhbmRlZCcsICF0aGlzLl9leHBhbmRlZCk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIF90b2dnbGVMb2dTY2FsZSgpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19sb2dTY2FsZUFjdGl2ZScsICF0aGlzLl9sb2dTY2FsZUFjdGl2ZSk7CiAgICAgICAgfQogICAgICAgIF9yZXNldERvbWFpbigpIHsKICAgICAgICAgICAgY29uc3QgY2hhcnQgPSB0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKTsKICAgICAgICAgICAgaWYgKGNoYXJ0KSB7CiAgICAgICAgICAgICAgICBjaGFydC5yZXNldERvbWFpbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF91cGRhdGVEb3dubG9hZExpbmsoKSB7CiAgICAgICAgICAgIGNvbnN0IHN2Z1N0ciA9IHRoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpLmV4cG9ydEFzU3ZnU3RyaW5nKCk7CiAgICAgICAgICAgIC8vIFRoZSBTVkcgY29kZSBzdHJpbmcgbWF5IGluY2x1ZGUgaGFzaCBjaGFyYWN0ZXJzLCBzdWNoIGFzIGFuCiAgICAgICAgICAgIC8vIGF0dHJpYnV0ZSBgY2xpcFBhdGg9InVybCgjZm9vKSJgLiBUaHVzLCB3ZSBiYXNlNjQtZW5jb2RlIHRoZQogICAgICAgICAgICAvLyBkYXRhIHNvIHRoYXQgc3VjaCBhIGhhc2ggaXMgbm90IGludGVycHJldGVkIGFzIGEgZnJhZ21lbnQKICAgICAgICAgICAgLy8gc3BlY2lmaWVyLCB0cnVuY2F0aW5nIHRoZSBTVkcuIChTZWUgaXNzdWUgIzE4NzQuKQogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb24KICAgICAgICAgICAgY29uc3Qgc3ZnTGluayA9IHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCcjc3ZnTGluaycpOwogICAgICAgICAgICBzdmdMaW5rLmhyZWYgPSBgZGF0YTppbWFnZS9zdmcreG1sO2Jhc2U2NCwke2J0b2Eoc3ZnU3RyKX1gOwogICAgICAgIH0KICAgICAgICBfcnVuc0Zyb21EYXRhKGRhdGEpIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGEubWFwKChkYXR1bSkgPT4gZGF0dW0ucnVuKTsKICAgICAgICB9CiAgICAgICAgX2dldERhdGFTZXJpZXMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFUb0xvYWQubWFwKChkKSA9PiB0aGlzLl9nZXRTZXJpZXNOYW1lRnJvbURhdHVtKGQpKTsKICAgICAgICB9CiAgICAgICAgLy8gbmFtZSBpcyBhIHN0YWJsZSBpZGVudGlmaWVyIGZvciBhIHNlcmllcy4KICAgICAgICBfZ2V0U2VyaWVzTmFtZUZyb21EYXR1bSh7IHJ1biwgZXhwZXJpbWVudCA9IHsgbmFtZTogJ19kZWZhdWx0JyB9IH0pIHsKICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KFtleHBlcmltZW50Lm5hbWUsIHJ1bl0pOwogICAgICAgIH0KICAgICAgICAvLyB0aXRsZSBpcyBhIHZpc2libGUgc3RyaW5nIG9mIGEgc2VyaWVzIGZvciB0aGUgVUkuCiAgICAgICAgX2dldFNlcmllc0Rpc3BsYXlOYW1lRnJvbURhdHVtKGRhdHVtKSB7CiAgICAgICAgICAgIHJldHVybiBkYXR1bS5ydW47CiAgICAgICAgfQogICAgICAgIF9nZXRDb2xvclNjYWxlKCkgewogICAgICAgICAgICBpZiAodGhpcy5jb2xvclNjYWxlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xvclNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmICdjb2xvclNjYWxlJyBpc24ndCBleHBsaWNpdGx5IHNwZWNpZmllZCwgdXNlIHRoZSBvbmVzCiAgICAgICAgICAgIC8vIGRlZmluZWQgaW4gdGZfY29sb3Jfc2NhbGUuCiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBzY2FsZTogKG5hbWUpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBbLCBydW5dID0gSlNPTi5wYXJzZShuYW1lKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnVuc0NvbG9yU2NhbGUocnVuKTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfTsKICAgIFRmU2NhbGFyQ2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgPjwvdGYtY2FyZC1oZWFkaW5nPgogICAgPGRpdiBpZD0idGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIiPgogICAgICA8dGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcgogICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICBjb2xvci1zY2FsZT0iW1tfZ2V0Q29sb3JTY2FsZShjb2xvclNjYWxlKV1dIgogICAgICAgIGRhdGEtc2VyaWVzPSJbW19nZXREYXRhU2VyaWVzKGRhdGFUb0xvYWQuKildXSIKICAgICAgICBkYXRhLXRvLWxvYWQ9IltbZGF0YVRvTG9hZF1dIgogICAgICAgIGdldC1kYXRhLWxvYWQtbmFtZT0iW1tfZ2V0RGF0YUxvYWROYW1lXV0iCiAgICAgICAgZ2V0LWRhdGEtbG9hZC11cmw9IltbZ2V0RGF0YUxvYWRVcmxdXSIKICAgICAgICByZXF1ZXN0LWRhdGE9IltbcmVxdWVzdERhdGFdXSIKICAgICAgICBpZ25vcmUteS1vdXRsaWVycz0iW1tpZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICBsb2FkLWRhdGEtY2FsbGJhY2s9IltbX2xvYWREYXRhQ2FsbGJhY2tdXSIKICAgICAgICBsb2FkLWtleT0iW1t0YWddXSIKICAgICAgICBsb2ctc2NhbGUtYWN0aXZlPSJbW19sb2dTY2FsZUFjdGl2ZV1dIgogICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tyZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgIHNtb290aGluZy1lbmFibGVkPSJbW3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgICBzbW9vdGhpbmctd2VpZ2h0PSJbW3Ntb290aGluZ1dlaWdodF1dIgogICAgICAgIHRhZy1tZXRhZGF0YT0iW1t0YWdNZXRhZGF0YV1dIgogICAgICAgIHRvb2x0aXAtY29sdW1ucz0iW1tfdG9vbHRpcENvbHVtbnNdXSIKICAgICAgICB0b29sdGlwLXBvc2l0aW9uPSJhdXRvIgogICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbdG9vbHRpcFNvcnRpbmdNZXRob2RdXSIKICAgICAgICB4LXR5cGU9IltbeFR5cGVdXSIKICAgICAgPgogICAgICA8L3RmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXI+CiAgICA8L2Rpdj4KICAgIDxkaXYgaWQ9ImJ1dHRvbnMiPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBzZWxlY3RlZCQ9IltbX2V4cGFuZGVkXV0iCiAgICAgICAgaWNvbj0iZnVsbHNjcmVlbiIKICAgICAgICBvbi10YXA9Il90b2dnbGVFeHBhbmRlZCIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfbG9nU2NhbGVBY3RpdmVdXSIKICAgICAgICBpY29uPSJsaW5lLXdlaWdodCIKICAgICAgICBvbi10YXA9Il90b2dnbGVMb2dTY2FsZSIKICAgICAgICB0aXRsZT0iVG9nZ2xlIHktYXhpcyBsb2cgc2NhbGUiCiAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICBpY29uPSJzZXR0aW5ncy1vdmVyc2NhbiIKICAgICAgICBvbi10YXA9Il9yZXNldERvbWFpbiIKICAgICAgICB0aXRsZT0iRml0IGRvbWFpbiB0byBkYXRhIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbW3Nob3dEb3dubG9hZExpbmtzXV0iPgogICAgICAgIDxwYXBlci1tZW51LWJ1dHRvbiBvbi1wYXBlci1kcm9wZG93bi1vcGVuPSJfdXBkYXRlRG93bmxvYWRMaW5rIj4KICAgICAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgICAgICBjbGFzcz0iZHJvcGRvd24tdHJpZ2dlciIKICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tdHJpZ2dlciIKICAgICAgICAgICAgaWNvbj0iZmlsZS1kb3dubG9hZCIKICAgICAgICAgID48L3BhcGVyLWljb24tYnV0dG9uPgogICAgICAgICAgPHBhcGVyLWxpc3Rib3ggY2xhc3M9ImRyb3Bkb3duLWNvbnRlbnQiIHNsb3Q9ImRyb3Bkb3duLWNvbnRlbnQiPgogICAgICAgICAgICA8cGFwZXItaXRlbT4KICAgICAgICAgICAgICA8YSBpZD0ic3ZnTGluayIgZG93bmxvYWQ9IltbdGFnXV0uc3ZnIj4KICAgICAgICAgICAgICAgIERvd25sb2FkIEN1cnJlbnQgQ2hhcnQgYXMgU1ZHCiAgICAgICAgICAgICAgPC9hPgogICAgICAgICAgICA8L3BhcGVyLWl0ZW0+CiAgICAgICAgICA8L3BhcGVyLWxpc3Rib3g+CiAgICAgICAgPC9wYXBlci1tZW51LWJ1dHRvbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHNwYW4gc3R5bGU9ImZsZXgtZ3JvdzogMSI+PC9zcGFuPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9Iltbc2hvd0Rvd25sb2FkTGlua3NdXSI+CiAgICAgICAgPGRpdiBjbGFzcz0iZG93bmxvYWQtbGlua3MiPgogICAgICAgICAgPHRmLWRvd25sb2FkZXIKICAgICAgICAgICAgcnVucz0iW1tfcnVuc0Zyb21EYXRhKGRhdGFUb0xvYWQpXV0iCiAgICAgICAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgICAgICAgdXJsLWZuPSJbW19kb3dubG9hZFVybEZuXV0iCiAgICAgICAgICA+PC90Zi1kb3dubG9hZGVyPgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBtYXJnaW46IDVweDsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICB3aWR0aDogMzMwcHg7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSAjdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlci1jb250YWluZXIgewogICAgICAgIGhlaWdodDogNDAwcHg7CiAgICAgIH0KCiAgICAgICN0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyLWNvbnRhaW5lciB7CiAgICAgICAgaGVpZ2h0OiAyMDBweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGYtY2FyZC1oZWFkaW5nIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBtYXJnaW4tYm90dG9tOiAxMHB4OwogICAgICB9CgogICAgICAjYnV0dG9ucyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LWRpcmVjdGlvbjogcm93OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbiB7CiAgICAgICAgY29sb3I6ICMyMTk2ZjM7CiAgICAgICAgYm9yZGVyLXJhZGl1czogMTAwJTsKICAgICAgICB3aWR0aDogMzJweDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgICAgcGFkZGluZzogNHB4OwogICAgICB9CgogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDMycHg7CiAgICAgIH0KCiAgICAgIC5kb3dubG9hZC1saW5rcyBhIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMnB4OwogICAgICB9CgogICAgICAuZG93bmxvYWQtbGlua3MgcGFwZXItZHJvcGRvd24tbWVudSB7CiAgICAgICAgd2lkdGg6IDEwMHB4OwogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWxhYmVsOiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICAgIC0tcGFwZXItaW5wdXQtY29udGFpbmVyLWlucHV0OiB7CiAgICAgICAgICBmb250LXNpemU6IDEwcHg7CiAgICAgICAgfQogICAgICB9CgogICAgICBwYXBlci1tZW51LWJ1dHRvbiB7CiAgICAgICAgcGFkZGluZzogMDsKICAgICAgfQogICAgICBwYXBlci1pdGVtIGEgewogICAgICAgIGNvbG9yOiBpbmhlcml0OwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJ0YWciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZTY2FsYXJDYXJkLnByb3RvdHlwZSwgImRhdGFUb0xvYWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlNjYWxhckNhcmQucHJvdG90eXBlLCAieFR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJhY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJpZ25vcmVZT3V0bGllcnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBSZXF1ZXN0TWFuYWdlcikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJyZXF1ZXN0TWFuYWdlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZTY2FsYXJDYXJkLnByb3RvdHlwZSwgInNob3dEb3duTGlua3MiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJzbW9vdGhpbmdFbmFibGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZTY2FsYXJDYXJkLnByb3RvdHlwZSwgInNtb290aGluZ1dlaWdodCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJ0YWdNZXRhZGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJjb2xvclNjYWxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZTY2FsYXJDYXJkLnByb3RvdHlwZSwgInRvb2x0aXBTb3J0aW5nTWV0aG9kIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZTY2FsYXJDYXJkLnByb3RvdHlwZSwgIl9sb2FkRGF0YUNhbGxiYWNrIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pCiAgICBdLCBUZlNjYWxhckNhcmQucHJvdG90eXBlLCAiZ2V0RGF0YUxvYWRVcmwiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlNjYWxhckNhcmQucHJvdG90eXBlLCAiX2Rvd25sb2FkVXJsRm4iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJyZXF1ZXN0RGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJfZ2V0RGF0YUxvYWROYW1lIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJfZXhwYW5kZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyQ2FyZC5wcm90b3R5cGUsICJfbG9nU2NhbGVBY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZTY2FsYXJDYXJkLnByb3RvdHlwZSwgIl90b29sdGlwQ29sdW1ucyIsIHZvaWQgMCk7CiAgICBUZlNjYWxhckNhcmQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1zY2FsYXItY2FyZCcpCiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC12YXJpYWJsZQogICAgXSwgVGZTY2FsYXJDYXJkKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogU2hvd3MgYSBzZXNzaW9uIGdyb3VwIGluIG1vcmUgZGV0YWlsLiBTcGVjaWZpY2FsbHksIHNob3dzIGdyYXBocyBvZiB0aGUKICAgICAqIG1ldHJpY3MgZm9yIHRoZSBzZXNzaW9uIGluIHRoZSBncm91cCBhcyBhIGZ1bmN0aW9uIG9mIHRoZSB0cmFpbmluZyBzdGVwLgogICAgICogVGhpcyBlbGVtZW50IGlzIHNob3duIG9uZSB0aGUgdXNlciAiZHJpbGxzLWluIiB0byBhIHNlc3Npb24gZ3JvdXAsIGZvcgogICAgICogZXhhbXBsZSB3aGVuIHNoZSBjbGlja3Mgb24gYSByb3cgaW4gdGFibGUtdmlldyBvciBhIGN1cnZlIGluIHBhcmFsbGVsLWNvb3JkcwogICAgICogdmlldy4KICAgICAqLwogICAgbGV0IFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMgPSBjbGFzcyBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzIGV4dGVuZHMgbWl4aW5CZWhhdmlvcnMoW0lyb25SZXNpemFibGVCZWhhdmlvciQxXSwgUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgLy8gVGhlIHNlc3Npb24gZ3JvdXAgb2JqZWN0IHRvIGRpc3BsYXkuIE1hdGNoZXMgdGhlIFNlc3Npb25Hcm91cAogICAgICAgICAgICAvLyBwcm90b2NvbCBidWZmZXIgZGVmaW5lZCBpbiBhcGkucHJvdG8uCiAgICAgICAgICAgIHRoaXMuc2Vzc2lvbkdyb3VwID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5feFR5cGUgPSBYVHlwZS5TVEVQOwogICAgICAgICAgICB0aGlzLl9ub011bHRpRXhwZXJpbWVudHMgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdERhdGEgPSAoaXRlbXMsIG9uTG9hZCwgb25GaW5pc2gpID0+IHsKICAgICAgICAgICAgICAgIFByb21pc2UuYWxsKGl0ZW1zLm1hcCgoaXRlbSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlcXVlc3QgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnROYW1lOiB0aGlzLmV4cGVyaW1lbnROYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uTmFtZTogaXRlbS5ydW4sCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY05hbWU6IGl0ZW0udGFnLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYmFja2VuZAogICAgICAgICAgICAgICAgICAgICAgICAubGlzdE1ldHJpY0V2YWxzKHJlcXVlc3QpCiAgICAgICAgICAgICAgICAgICAgICAgIC50aGVuKChkYXRhKSA9PiB2b2lkIG9uTG9hZCh7IGl0ZW0sIGRhdGEgfSkpOwogICAgICAgICAgICAgICAgfSkpLmZpbmFsbHkoKCkgPT4gdm9pZCBvbkZpbmlzaCgpKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgdGhpcy5fY29sb3JTY2FsZSA9IHsKICAgICAgICAgICAgICAgIHNjYWxlOiAoc2VyaWVzTmFtZSkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSB0Zi1zY2FsYXItY2FyZCBBUEkgc2VuZHMgYSBzZXJpZXNOYW1lIGFzIGEgSlNPTgogICAgICAgICAgICAgICAgICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAyLWVsZW1lbnQgYXJyYXkgW2V4cGVyaW1lbnQsIHJ1bl0sCiAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmUgJ3J1bicgaXMgdGhlIHJ1biB3ZSByZXR1cm4gaW4gdGhlICdyZXF1ZXN0RGF0YScKICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbi0taW4gb3VyIGNhc2UgdGhhdCBpcyB0aGUgc2Vzc2lvbiBuYW1lLCBhbmQKICAgICAgICAgICAgICAgICAgICAvLyAnZXhwZXJpbWVudCcgaXMgbm90IHVzZWQgaGVyZSB0Zi1zY2FsYXItY2FyZCdzCiAgICAgICAgICAgICAgICAgICAgLy8gbXVsdGktZXhwZXJpbWVudCBhdHRyaWJ1dGUgaXMgdHVybmVkIG9mZiBoZXJlKS4KICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY29sb3Igb2YgYSBzZXNzaW9uIGlzIGRldGVybWluZWQgYnkgY2hvb3NpbmcgYQogICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0aW5nIHBvaW50IGluICdwYWxldHRlJyBiYXNlZCBvbiB0aGUgc2Vzc2lvbkdyb3VwIG5hbWUKICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2Fsa2luZyBjeWNsaWNseSAnc2Vzc2lvbkluZGV4JyBzdGVwcyBpbiB0aGUgYXJyYXksIHdoZXJlCiAgICAgICAgICAgICAgICAgICAgLy8gc2VzaW9uSW5kZXggaXMgdGhlIGluZGV4IG9mIHRoZSBzZXNzaW9uIGluIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIGdyb3VwLiBXZSBkbyB0aGlzIGluc3RlYWQgb2YganVzdCBoYXNoaW5nIHRoZSBzZXNzaW9uIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgLy8gdG8gZ3VhcmFudGVlIHRoYXQgd2UgZG9uJ3QgcmVwZWF0IGEgY29sb3IgaWYgdGhlIG51bWJlcgogICAgICAgICAgICAgICAgICAgIC8vIG9mIHNlc3Npb25zIGlzIGF0IG1vc3QgdGhlIHNpemUgb2YgdGhlIHBhbGV0dGUuCiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBldmVyeSB0aW1lIHRoZSB1c2VyIG1vdmVzCiAgICAgICAgICAgICAgICAgICAgLy8gb3ZlciB0aGUgbWV0cmljIHBsb3QsIHNvIGl0IG5lZWRzIHRvIGJlIHJlYXNvbmFibHkgZmFzdC4KICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uTmFtZSA9IEpTT04ucGFyc2Uoc2VyaWVzTmFtZSlbMV07CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkluZGV4ID0gdGhpcy5faW5kZXhPZlNlc3Npb24uZ2V0KHNlc3Npb25OYW1lKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWxldHRlID0gc3RhbmRhcmQ7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBhbGV0dGVbKHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoICsgc2Vzc2lvbkluZGV4KSAlIHBhbGV0dGUubGVuZ3RoXTsKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8vIFdoZW5ldmVyIHRoZSBiYWNrZW5kIHNlbmRzIGEgbmV3ICdzZXNzaW9uR3JvdXBzJyBhcnJheSByZXBseSB0byB0aGUKICAgICAgICAvLyBMaXN0U2Vzc2lvbkdyb3VwcyBSUEMsIHdlIHJlY3JlYXRlIHRoZSB0Zi1zZXNzaW9uLWdyb3VwLWRldGFpbAogICAgICAgIC8vIGVsZW1lbnRzIHRoYXQgY29ycmVzcG9uZCB0byBzZXNzaW9uIGdyb3VwcyB3aG9zZSBuYW1lIGlzIGluIHRoZSBuZXcKICAgICAgICAvLyBzZXNzaW9uR3JvdXBzIGFycmF5LiBBcyBzdWNoIHRoaXMgZWxlbWVudCBjYW4gYmUgY29uc3RydWN0ZWQgd2hlbiBvbmUKICAgICAgICAvLyBvZiBpdHMgcGFyZW50cyBjb250YWluZXIgaXMgaW52aXNpYmxlOiBmb3IgZXhhbXBsZSwgaWYgc2Vzc2lvbkdyb3VwcwogICAgICAgIC8vIHdhcyByZXBsYWNlZCB3aGVuIHRoZSB1c2VyIHdhcyBvbiB0aGUgcGFyYWxsZWwtY29vcmRpbmF0ZXMgdmlldyB0YWIKICAgICAgICAvLyBhbmQgdGhlIG5ldyBzZXNzaW9uR3JvdXBzIGNvbnRhaW5zIGEgc2Vzc2lvbiBncm91cCBvYmplY3QKICAgICAgICAvLyB3aG9zZSBtZXRyaWNzIHdlcmUgb3BlbiBpbiB0aGUgdGFibGUgdmlldyB0YWIgKGkuZS4gdGhlIG9sZAogICAgICAgIC8vIHNlc3Npb25Hcm91cHMgYXJyYXkgY29udGFpbmVkIGEgZGlzdGluY3QgSmF2YVNjcmlwdCBzZXNzaW9uR3JvdXAKICAgICAgICAvLyBvYmplY3Qgd2l0aCBzYW1lIG5hbWUpLgogICAgICAgIC8vIElmIHRoaXMgaGFwcGVucywgdGhlIHRmLXNjYWxhci1jYXJkIGNoaWxkIGVsZW1lbnRzIG9mIHRoaXMgZWxlbWVudAogICAgICAgIC8vIHdvdWxkIG1lYXN1cmUgYSAwIHNpemUgb2YgdGhlaXIgYm91bmRpbmcgYm94ZXMgYW5kIHdvdWxkIHJlbmRlcgogICAgICAgIC8vIGluY29ycmVjdGx5LiBUbyBhdm9pZCB0aGF0LCB3ZSBsaXN0ZW4gZm9yIHRoZSAnaXJvbi1yZXNpemUnIGV2ZW50CiAgICAgICAgLy8gdGhhdCBpcyBmaXJlZCBieSAnaXJvbi1wYWdlcycgd2hlbmV2ZXIgdGhlIGFjdGl2ZSBwYWdlIGNoYW5nZXMgYW5kCiAgICAgICAgLy8gcmVkcmF3IGVhY2ggdGYtc2NhbGFyLWNhcmQgY2hpbGQuCiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICAgIHRoaXMuYWRkRXZlbnRMaXN0ZW5lcignaXJvbi1yZXNpemUnLCB0aGlzLnJlZHJhdy5iaW5kKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLnNoYWRvd1Jvb3QKICAgICAgICAgICAgICAgIC5xdWVyeVNlbGVjdG9yQWxsKCd0Zi1zY2FsYXItY2FyZCcpCiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoYykgPT4gYy5yZWRyYXcoKSk7CiAgICAgICAgfQogICAgICAgIF9zZXNzaW9uR3JvdXBDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2Vzc2lvbkdyb3VwIHx8IE9iamVjdC5rZXlzKHRoaXMuc2Vzc2lvbkdyb3VwKS5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5faW5kZXhPZlNlc3Npb24gPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXNzaW9uR3JvdXBOYW1lSGFzaCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbmRleE9mU2Vzc2lvbiA9IG5ldyBNYXAodGhpcy5zZXNzaW9uR3JvdXAuc2Vzc2lvbnMubWFwKChzZXNzaW9uLCBpbmRleCkgPT4gWwogICAgICAgICAgICAgICAgICAgIHNlc3Npb24ubmFtZSwKICAgICAgICAgICAgICAgICAgICBpbmRleCwKICAgICAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25Hcm91cE5hbWVIYXNoID0gaGFzaE9mU3RyaW5nKHRoaXMuc2Vzc2lvbkdyb3VwLm5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlc2V0IGVhY2ggc2NhbGFyLWNhcmQgYnkgcHJvZGRpbmcgJ3RhZycuCiAgICAgICAgICAgIC8vIFdlIGRvIHRoaXMgc28gdGhlIGNhcmQgd2lsbCByZXNldCBpdHMgZG9tYWluIG9uIHRoZSBuZXh0IGxvYWQuCiAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yQWxsKCd0Zi1zY2FsYXItY2FyZCcpLmZvckVhY2goKGMpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IGFueUNhcmQgPSBjOwogICAgICAgICAgICAgICAgY29uc3QgdGFnID0gYW55Q2FyZC5nZXQoJ3RhZycpOwogICAgICAgICAgICAgICAgYW55Q2FyZC5zZXQoJ3RhZycsICcnKTsKICAgICAgICAgICAgICAgIGFueUNhcmQuc2V0KCd0YWcnLCB0YWcpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX2hhdmVNZXRyaWNzKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMudmlzaWJsZVNjaGVtYSAmJgogICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MpICYmCiAgICAgICAgICAgICAgICB0aGlzLnZpc2libGVTY2hlbWEubWV0cmljSW5mb3MubGVuZ3RoID4gMCk7CiAgICAgICAgfQogICAgICAgIF9oYXZlTWV0cmljc0FuZFNlc3Npb25Hcm91cCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2Vzc2lvbkdyb3VwICYmIHRoaXMuX2hhdmVNZXRyaWNzKCk7CiAgICAgICAgfQogICAgICAgIC8vIFJldHVybnMgYW4gYXJyYXkgb2YgdGhlIHRlbnNvcmJvYXJkICdydW5zJyBhbmQgJ3RhZ3MnIGNvcnJlc3BvbmRpbmcgdG8KICAgICAgICAvLyB0aGUgZ2l2ZW4gbWV0cmljIGluIGVhY2ggb2YgdGhlIHNlc3Npb25zIGluIHRoZSBnaXZlbiBzZXNzaW9uIGdyb3VwLgogICAgICAgIF9jb21wdXRlU2VyaWVzRm9yU2Vzc2lvbkdyb3VwTWV0cmljKHNlc3Npb25Hcm91cCwgbWV0cmljSW5mbykgewogICAgICAgICAgICBpZiAoc2Vzc2lvbkdyb3VwID09PSBudWxsIHx8CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzZXNzaW9uR3JvdXApLmxlbmd0aCA9PSAwIHx8CiAgICAgICAgICAgICAgICBtZXRyaWNJbmZvID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNlc3Npb25Hcm91cC5zZXNzaW9ucwogICAgICAgICAgICAgICAgLmZpbHRlcigKICAgICAgICAgICAgLy8gSWYgdGhpcyBzZXNzaW9uIGRvZXMgbm90IGN1cnJlbnRseSBoYXZlIGEgdmFsdWUgZm9yIHRoZSBnaXZlbgogICAgICAgICAgICAvLyBtZXRyaWMgdGhlbiB3ZSBkb24ndCB3YW50IHRvIGluY2x1ZGUgaXRzIHJ1bi4KICAgICAgICAgICAgKHNlc3Npb24pID0+IG1ldHJpY1ZhbHVlQnlOYW1lKHNlc3Npb24ubWV0cmljVmFsdWVzLCBtZXRyaWNJbmZvLm5hbWUpICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAubWFwKAogICAgICAgICAgICAvLyBTaW5jZSB0aGUgJ3RhZycgYW5kICdydW4nIGZpZWxkcyBhcmUgZXNzZW50aWFsbHkgb3BhcXVlCiAgICAgICAgICAgIC8vIGZvciB0aGUgdGYtc2NhbGFyLWNhcmQgZWxlbWVudCwgYW5kIHBhc3NlZCBhcyBpcyB0byB0aGUKICAgICAgICAgICAgLy8gcmVxdWVzdERhdGEgZnVuY3Rpb24sIHdlIHVzZSB0aGVtIHRvIGVuY29kZSB0aGUgZmllbGRzIHdlCiAgICAgICAgICAgIC8vIG5lZWQgdG8gc3VwcGx5IHRvIHRoZSBldmFsX21ldHJpY3MgQVBJIChjYWxsZWQgaW4gb3VyCiAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIHJlcXVlc3REYXRhIGFib3ZlKS4KICAgICAgICAgICAgKHNlc3Npb24pID0+ICh7IHRhZzogbWV0cmljSW5mby5uYW1lLCBydW46IHNlc3Npb24ubmFtZSB9KSk7CiAgICAgICAgfQogICAgICAgIC8vIENvbXB1dGVzIHRoZSB0YWctbWV0YWRhdGEgYXR0cmlidXRlIHRvIHNlbmQgdG8gdGhlCiAgICAgICAgLy8gdGYtc2NhbGFyLWNhcmQgZWxlbWVudC4KICAgICAgICBfY29tcHV0ZVRhZ01ldGFkYXRhKG1ldHJpY0luZm8pIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lOiBtZXRyaWNOYW1lKG1ldHJpY0luZm8pLAogICAgICAgICAgICAgICAgZGVzY3JpcHRpb246IG1ldHJpY0luZm8uZGVzY3JpcHRpb24gfHwgJycsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfTsKICAgIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMudGVtcGxhdGUgPSBodG1sIGAKICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shc2Vzc2lvbkdyb3VwXV0iPgogICAgICA8ZGl2PgogICAgICAgIDxoMz5ObyBzZXNzaW9uIGdyb3VwIHNlbGVjdGVkPC9oMz4KICAgICAgICA8cD5QbGVhc2Ugc2VsZWN0IGEgc2Vzc2lvbiBncm91cCB0byBzZWUgaXRzIG1ldHJpYy1ncmFwaHMgaGVyZS48L3A+CiAgICAgIDwvZGl2PgogICAgPC90ZW1wbGF0ZT4KICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2hhdmVNZXRyaWNzKHZpc2libGVTY2hlbWEuKildXSI+CiAgICAgIDxkaXY+CiAgICAgICAgPGgzPk5vIG1ldHJpY3MgYXJlIGVuYWJsZWQ8L2gzPgogICAgICAgIDxwPlBsZWFzZSBlbmFibGUgc29tZSBtZXRyaWNzIHRvIHNlZSBjb250ZW50IGhlcmUuPC9wPgogICAgICA8L2Rpdj4KICAgIDwvdGVtcGxhdGU+CiAgICA8ZGl2IGNsYXNzPSJsYXlvdXQgaG9yaXpvbnRhbCB3cmFwIHNlc3Npb24tZ3JvdXAtZGV0YWlscyI+CiAgICAgIDx0ZW1wbGF0ZQogICAgICAgIGlzPSJkb20taWYiCiAgICAgICAgaWY9IltbX2hhdmVNZXRyaWNzQW5kU2Vzc2lvbkdyb3VwKHZpc2libGVTY2hlbWEuKiwgc2Vzc2lvbkdyb3VwKV1dIgogICAgICA+CiAgICAgICAgPHRlbXBsYXRlCiAgICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICAgIGl0ZW1zPSJbW3Zpc2libGVTY2hlbWEubWV0cmljSW5mb3NdXSIKICAgICAgICAgIGFzPSJtZXRyaWNJbmZvIgogICAgICAgID4KICAgICAgICAgIDwhLS0gTm90ZSB0aGF0IHdlIGRvIG5vdCBwcm92aWRlIGEgcmVxdWVzdC1tYW5hZ2VyIGF0dHJpYnV0ZSBzaW5jZQogICAgICAgICAgICAgICB3ZSBwcm92aWRlIGEgZnVuY3Rpb24gaW4gcmVxdWVzdC1kYXRhIGZvciBjYWxsaW5nIHRoZSBiYWNrZW5kCiAgICAgICAgICAgICAgIHRvIGdldCB0aGUgbWV0cmljcyBkYXRhLgogICAgICAgICAgICAtLT4KICAgICAgICAgIDx0Zi1zY2FsYXItY2FyZAogICAgICAgICAgICBjbGFzcz0ic2NhbGFyLWNhcmQiCiAgICAgICAgICAgIGNvbG9yLXNjYWxlPSJbW19jb2xvclNjYWxlXV0iCiAgICAgICAgICAgIGRhdGEtdG8tbG9hZD0iW1tfY29tcHV0ZVNlcmllc0ZvclNlc3Npb25Hcm91cE1ldHJpYyhzZXNzaW9uR3JvdXAsIG1ldHJpY0luZm8pXV0iCiAgICAgICAgICAgIHRhZz0iW1ttZXRyaWNJbmZvLm5hbWUudGFnXV0iCiAgICAgICAgICAgIHRhZy1tZXRhZGF0YT0iW1tfY29tcHV0ZVRhZ01ldGFkYXRhKG1ldHJpY0luZm8pXV0iCiAgICAgICAgICAgIHgtdHlwZT0iW1tfeFR5cGVdXSIKICAgICAgICAgICAgbXVsdGktZXhwZXJpbWVudHM9IltbX25vTXVsdGlFeHBlcmltZW50c11dIgogICAgICAgICAgICByZXF1ZXN0LWRhdGE9IltbX3JlcXVlc3REYXRhXV0iCiAgICAgICAgICAgIGFjdGl2ZQogICAgICAgICAgPgogICAgICAgICAgPC90Zi1zY2FsYXItY2FyZD4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICA8L3RlbXBsYXRlPgogICAgPC9kaXY+CiAgICA8IS0tICJpcm9uLWZsZXgiIGlzIG5lZWRlZCB0byB1c2UgdGhlIGxheW91dCBjbGFzc2VzIGluIHRoZSBkaXYgYWJvdmUgLS0+CiAgICA8c3R5bGUgaW5jbHVkZT0iaXJvbi1mbGV4Ij4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMucHJvdG90eXBlLCAiYmFja2VuZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMucHJvdG90eXBlLCAiZXhwZXJpbWVudE5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzLnByb3RvdHlwZSwgInZpc2libGVTY2hlbWEiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzLnByb3RvdHlwZSwgInNlc3Npb25Hcm91cCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IFN0cmluZywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMucHJvdG90eXBlLCAiX3hUeXBlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzLnByb3RvdHlwZSwgIl9ub011bHRpRXhwZXJpbWVudHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzLnByb3RvdHlwZSwgIl9pbmRleE9mU2Vzc2lvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMucHJvdG90eXBlLCAiX3Nlc3Npb25Hcm91cE5hbWVIYXNoIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzLnByb3RvdHlwZSwgIl9yZXF1ZXN0RGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMucHJvdG90eXBlLCAiX2NvbG9yU2NhbGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnc2Vzc2lvbkdyb3VwLionKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMucHJvdG90eXBlLCAiX3Nlc3Npb25Hcm91cENoYW5nZWQiLCBudWxsKTsKICAgIFRmSHBhcmFtc1Nlc3Npb25Hcm91cERldGFpbHMgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscycpCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uR3JvdXBEZXRhaWxzKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZkhwYXJhbXNUYWJsZVZpZXcgPSBjbGFzcyBUZkhwYXJhbXNUYWJsZVZpZXcgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5faHBhcmFtTmFtZSA9IGhwYXJhbU5hbWU7CiAgICAgICAgICAgIHRoaXMuX21ldHJpY05hbWUgPSBtZXRyaWNOYW1lOwogICAgICAgIH0KICAgICAgICBfdmlzaWJsZVNjaGVtYU9yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKSB7CiAgICAgICAgICAgIC8vIEZyb20gdmFhZGluLWdyaWQgMy4wLjA6CiAgICAgICAgICAgIC8vIFZhYWRpbi1ncmlkIHJlbW92ZXMgJ3Jvdy1kZXRhaWxzJyBpZiB0aGUgdmlzaWJsZVNjaGVtYSBjaGFuZ2VzCiAgICAgICAgICAgIC8vIGFuZCBkb2Vzbid0IHVwZGF0ZSAnZXhwYW5kZWRJdGVtcycuIFNvIHdlIGZpcnN0IGNsb3NlIHRoZQogICAgICAgICAgICAvLyBleHBhbmRlZCBpdGVtcywgY2FsbCBQb2x5bWVyLmRvbS5mbHVzaCgpIHRvIHVwZGF0ZSB0aGUgZ3JpZCwKICAgICAgICAgICAgLy8gYW5kIHRoZW4gcmUtb3BlbiB0aGUgZ3JvdXBzIHRoYXQgd2VyZSBvcGVuIGJlZm9yZS4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gU2luY2UgdGhlbiwgd2UgaGF2ZSB1cGdyYWRlZCB0byB2YWFkaW4tZ3JpZCA1LjYuNiwgd2hlcmUgdGhlIGNvbW1lbnQKICAgICAgICAgICAgLy8gbWF5IGJlIHN0YWxlLiBOb3RhYmx5LCBWYWFkaW4gcmVuYW1lZCAnZXhwYW5kZWRJdGVtcycgdG8KICAgICAgICAgICAgLy8gJ2RldGFpbHNPcGVuZWRJdGVtcycuCiAgICAgICAgICAgIGNvbnN0IGV4cGFuZGVkSXRlbXMgPSB0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLmdldCgnZGV0YWlsc09wZW5lZEl0ZW1zJyk7CiAgICAgICAgICAgIHRoaXMuJC5zZXNzaW9uR3JvdXBzVGFibGUuc2V0KCdkZXRhaWxzT3BlbmVkSXRlbXMnLCBbXSk7CiAgICAgICAgICAgIGZsdXNoKCk7CiAgICAgICAgICAgIC8vIEluZGV4IHNlc3Npb25Hcm91cHMgYnkgbmFtZS4KICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkdyb3Vwc0J5TmFtZSA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5zZXNzaW9uR3JvdXBzLmZvckVhY2goKHNnKSA9PiB7CiAgICAgICAgICAgICAgICBzZXNzaW9uR3JvdXBzQnlOYW1lLnNldChzZy5uYW1lLCBzZyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLiQuc2Vzc2lvbkdyb3Vwc1RhYmxlLnNldCgnZGV0YWlsc09wZW5lZEl0ZW1zJywgZXhwYW5kZWRJdGVtcwogICAgICAgICAgICAgICAgLm1hcCgoc2cpID0+IHNlc3Npb25Hcm91cHNCeU5hbWUuZ2V0KHNnLm5hbWUpKQogICAgICAgICAgICAgICAgLmZpbHRlcihCb29sZWFuKSk7CiAgICAgICAgfQogICAgICAgIF9zZXNzaW9uR3JvdXBIUGFyYW0oc2Vzc2lvbkdyb3VwLCBocGFyYW0pIHsKICAgICAgICAgICAgaWYgKHNlc3Npb25Hcm91cCA9PSBudWxsIHx8CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhzZXNzaW9uR3JvdXApLmxlbmd0aCA9PSAwIHx8CiAgICAgICAgICAgICAgICAhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHNlc3Npb25Hcm91cC5ocGFyYW1zLCBocGFyYW0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHByZXR0eVByaW50KHNlc3Npb25Hcm91cC5ocGFyYW1zW2hwYXJhbV0pOwogICAgICAgIH0KICAgICAgICAvLyBSZXR1cm5zIHRoZSBtZXRyaWMgdmFsdWUgb2YgdGhlIGdpdmVuIHNlc3Npb25Hcm91cC4gVGhlIHZhbHVlIGlzCiAgICAgICAgLy8gcmV0dXJuZWQgYXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCiAgICAgICAgX3Nlc3Npb25Hcm91cE1ldHJpYyhzZXNzaW9uR3JvdXAsIG1ldHJpY05hbWUpIHsKICAgICAgICAgICAgaWYgKHNlc3Npb25Hcm91cCA9PSBudWxsIHx8IE9iamVjdC5rZXlzKHNlc3Npb25Hcm91cCkubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlc3Npb25Hcm91cC5tZXRyaWNWYWx1ZXMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgICAgIGxldCBtZXRyaWNWYWwgPSBzZXNzaW9uR3JvdXAubWV0cmljVmFsdWVzW2ldOwogICAgICAgICAgICAgICAgaWYgKG1ldHJpY1ZhbC5uYW1lLmdyb3VwID09PSBtZXRyaWNOYW1lLmdyb3VwICYmCiAgICAgICAgICAgICAgICAgICAgbWV0cmljVmFsLm5hbWUudGFnID09IG1ldHJpY05hbWUudGFnKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXR0eVByaW50KG1ldHJpY1ZhbC52YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgICAgICBfcm93TnVtYmVyKHJvd0luZGV4KSB7CiAgICAgICAgICAgIHJldHVybiByb3dJbmRleCArIDE7CiAgICAgICAgfQogICAgfTsKICAgIFRmSHBhcmFtc1RhYmxlVmlldy50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHZhYWRpbi1ncmlkCiAgICAgIGNsYXNzPSJzZXNzaW9uLWdyb3VwLXRhYmxlIgogICAgICBpZD0ic2Vzc2lvbkdyb3Vwc1RhYmxlIgogICAgICBjb2x1bW4tcmVvcmRlcmluZy1hbGxvd2VkPSIiCiAgICAgIGl0ZW1zPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgID4KICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjAiIHdpZHRoPSIxMGVtIiByZXNpemFibGU9IiI+CiAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlRyaWFsIElEPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj5bW2l0ZW0ubmFtZV1dPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tlbmFibGVTaG93TWV0cmljc11dIj4KICAgICAgICA8dmFhZGluLWdyaWQtY29sdW1uIGZsZXgtZ3Jvdz0iMCIgYXV0b1dpZHRoPSIiIHJlc2l6YWJsZT0iIj4KICAgICAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0iaGVhZGVyIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtaGVhZGVyIHRhYmxlLWNlbGwiPlNob3cgTWV0cmljczwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNsYXNzPSJ0YWJsZS1jZWxsIiBjaGVja2VkPSJ7e2RldGFpbHNPcGVuZWR9fSI+CiAgICAgICAgICAgIDwvcGFwZXItY2hlY2tib3g+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdmFhZGluLWdyaWQtY29sdW1uPgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUKICAgICAgICBpcz0iZG9tLXJlcGVhdCIKICAgICAgICBpdGVtcz0iW1t2aXNpYmxlU2NoZW1hLmhwYXJhbUluZm9zXV0iCiAgICAgICAgYXM9ImhwYXJhbUluZm8iCiAgICAgICAgaW5kZXgtYXM9ImhwYXJhbUluZGV4IgogICAgICA+CiAgICAgICAgPHZhYWRpbi1ncmlkLWNvbHVtbiBmbGV4LWdyb3c9IjIiIHdpZHRoPSIxMGVtIiByZXNpemFibGU9IiI+CiAgICAgICAgICA8dGVtcGxhdGUgY2xhc3M9ImhlYWRlciI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InRhYmxlLWhlYWRlciB0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19ocGFyYW1OYW1lKGhwYXJhbUluZm8pXV0KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1jZWxsIj4KICAgICAgICAgICAgICBbW19zZXNzaW9uR3JvdXBIUGFyYW0oaXRlbSwgaHBhcmFtSW5mby5uYW1lKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8L3ZhYWRpbi1ncmlkLWNvbHVtbj4KICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPHRlbXBsYXRlCiAgICAgICAgaXM9ImRvbS1yZXBlYXQiCiAgICAgICAgaXRlbXM9Int7dmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc319IgogICAgICAgIGFzPSJtZXRyaWNJbmZvIgogICAgICAgIGluZGV4LWFzPSJtZXRyaWNJbmRleCIKICAgICAgPgogICAgICAgIDx2YWFkaW4tZ3JpZC1jb2x1bW4gZmxleC1ncm93PSIyIiB3aWR0aD0iMTBlbSIgcmVzaXphYmxlPSIiPgogICAgICAgICAgPHRlbXBsYXRlIGNsYXNzPSJoZWFkZXIiPgogICAgICAgICAgICA8ZGl2IGNsYXNzPSJ0YWJsZS1oZWFkZXIgdGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfbWV0cmljTmFtZShtZXRyaWNJbmZvKV1dCiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgPGRpdiBjbGFzcz0idGFibGUtY2VsbCI+CiAgICAgICAgICAgICAgW1tfc2Vzc2lvbkdyb3VwTWV0cmljKGl0ZW0sIG1ldHJpY0luZm8ubmFtZSldXQogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC92YWFkaW4tZ3JpZC1jb2x1bW4+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBjbGFzcz0icm93LWRldGFpbHMiPgogICAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscwogICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICAgIHNlc3Npb24tZ3JvdXA9IltbaXRlbV1dIgogICAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIgogICAgICAgICAgY2xhc3M9InNlc3Npb24tZ3JvdXAtZGV0YWlscyIKICAgICAgICA+CiAgICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdmFhZGluLWdyaWQ+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lOwogICAgICB9CiAgICAgIC50YWJsZS1jZWxsIHsKICAgICAgICB3aGl0ZS1zcGFjZTogbm93cmFwOwogICAgICAgIHRleHQtb3ZlcmZsb3c6IGVsbGlwc2lzOwogICAgICAgIG92ZXJmbG93OiBoaWRkZW47CiAgICAgIH0KICAgICAgLnRhYmxlLWhlYWRlciB7CiAgICAgICAgLyogbGluZS1icmVhayBvdmVyZmxvd2luZyBjb2x1bW4gaGVhZGVycyAqLwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgb3ZlcmZsb3ctd3JhcDogYnJlYWstd29yZDsKICAgICAgfQogICAgICAuc2Vzc2lvbi1ncm91cC10YWJsZSB7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5zZXNzaW9uLWdyb3VwLWRldGFpbHMgewogICAgICAgIGhlaWdodDogMzYwcHg7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNUYWJsZVZpZXcucHJvdG90eXBlLCAidmlzaWJsZVNjaGVtYSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkhwYXJhbXNUYWJsZVZpZXcucHJvdG90eXBlLCAic2Vzc2lvbkdyb3VwcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZIcGFyYW1zVGFibGVWaWV3LnByb3RvdHlwZSwgImVuYWJsZVNob3dNZXRyaWNzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zVGFibGVWaWV3LnByb3RvdHlwZSwgImJhY2tlbmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkhwYXJhbXNUYWJsZVZpZXcucHJvdG90eXBlLCAiZXhwZXJpbWVudE5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgndmlzaWJsZVNjaGVtYS4qJywgJ3Nlc3Npb25Hcm91cHMuKicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZIcGFyYW1zVGFibGVWaWV3LnByb3RvdHlwZSwgIl92aXNpYmxlU2NoZW1hT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZCIsIG51bGwpOwogICAgVGZIcGFyYW1zVGFibGVWaWV3ID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtaHBhcmFtcy10YWJsZS12aWV3JykKICAgIF0sIFRmSHBhcmFtc1RhYmxlVmlldyk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZIcGFyYW1zU2Vzc2lvbkdyb3VwVmFsdWVzID0gY2xhc3MgVGZIcGFyYW1zU2Vzc2lvbkdyb3VwVmFsdWVzIGV4dGVuZHMgUG9seW1lckVsZW1lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvLyBUaGUgc2Vzc2lvbiBncm91cCB3aG9zZSB2YWx1ZXMgd2lsbCBiZSBkaXNwbGF5ZWQuCiAgICAgICAgICAgIC8vIEEgSmF2YVNjcmlwdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdGVuc29yYm9hcmQuaHBhcmFtcy5TZXNzaW9uR3JvdXAKICAgICAgICAgICAgLy8gcHJvdG9jb2wgYnVmZmVyLgogICAgICAgICAgICB0aGlzLnNlc3Npb25Hcm91cCA9IG51bGw7CiAgICAgICAgICAgIC8vIFRoZSB2aXNpYmxlU2NoZW1hIGRlZmluaW5nIHRoZSBjb2x1bW5zIHRvIHVzZS4KICAgICAgICAgICAgLy8gT25seSB0aGUgdmFsdWVzIG9mIGNvbHVtbnMgaW4gdGhlIHZpc2libGVTY2hlbWEgd2lsbCBiZSBkaXNwbGF5ZWQuCiAgICAgICAgICAgIC8vIFNlZSB0Zi1ocGFyYW1zLXF1ZXJ5LXBhbmUgZm9yIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgb2JqZWN0LgogICAgICAgICAgICB0aGlzLnZpc2libGVTY2hlbWEgPSBudWxsOwogICAgICAgIH0KICAgICAgICBfcHJvcGVydGllc0FyZVBvcHVsYXRlZCh2aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXApIHsKICAgICAgICAgICAgcmV0dXJuICh2aXNpYmxlU2NoZW1hICE9PSB1bmRlZmluZWQgJiYKICAgICAgICAgICAgICAgIHZpc2libGVTY2hlbWEgIT09IG51bGwgJiYKICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cCAhPT0gdW5kZWZpbmVkICYmCiAgICAgICAgICAgICAgICBzZXNzaW9uR3JvdXAgIT09IG51bGwpOwogICAgICAgIH0KICAgICAgICBfc2luZ2xldG9uU2Vzc2lvbkdyb3VwcyhzZXNzaW9uR3JvdXApIHsKICAgICAgICAgICAgaWYgKHNlc3Npb25Hcm91cCA9PT0gbnVsbCB8fCBzZXNzaW9uR3JvdXAgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBbc2Vzc2lvbkdyb3VwXTsKICAgICAgICB9CiAgICB9OwogICAgVGZIcGFyYW1zU2Vzc2lvbkdyb3VwVmFsdWVzLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8IS0tIElmIHNlc3Npb25Hcm91cCBvciB2aXNpYmxlU2NoZW1hIGFyZSBub3QgcG9wdWxhdGVkLCBkbyBub3QgZGlzcGxheQogICAgICAgICBhbnl0aGluZy4KICAgICAgLS0+CiAgICA8dGVtcGxhdGUKICAgICAgaXM9ImRvbS1pZiIKICAgICAgaWY9IltbX3Byb3BlcnRpZXNBcmVQb3B1bGF0ZWQodmlzaWJsZVNjaGVtYSwgc2Vzc2lvbkdyb3VwKV1dIgogICAgPgogICAgICA8IS0tIERpc3BsYXkgb25lIHJvdyB3aXRob3V0IGEgInNob3ctbWV0cmljcyIgY29sdW1uIC0tPgogICAgICA8dGYtaHBhcmFtcy10YWJsZS12aWV3CiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbdmlzaWJsZVNjaGVtYV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW19zaW5nbGV0b25TZXNzaW9uR3JvdXBzKHNlc3Npb25Hcm91cCldXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtdGFibGUtdmlldz4KICAgIDwvdGVtcGxhdGU+CiAgICA8dGVtcGxhdGUKICAgICAgaXM9ImRvbS1pZiIKICAgICAgaWY9IltbIV9wcm9wZXJ0aWVzQXJlUG9wdWxhdGVkKHZpc2libGVTY2hlbWEsIHNlc3Npb25Hcm91cCldXSIKICAgID4KICAgICAgPGRpdj5DbGljayBvciBob3ZlciBvdmVyIGEgc2Vzc2lvbiBncm91cCB0byBkaXNwbGF5IGl0cyB2YWx1ZXMgaGVyZS48L2Rpdj4KICAgIDwvdGVtcGxhdGU+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zU2Vzc2lvbkdyb3VwVmFsdWVzLnByb3RvdHlwZSwgInNlc3Npb25Hcm91cCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25Hcm91cFZhbHVlcy5wcm90b3R5cGUsICJ2aXNpYmxlU2NoZW1hIiwgdm9pZCAwKTsKICAgIFRmSHBhcmFtc1Nlc3Npb25Hcm91cFZhbHVlcyA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMnKQogICAgXSwgVGZIcGFyYW1zU2Vzc2lvbkdyb3VwVmFsdWVzKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8vIEZpbmRzIHRoZSAiY2xvc2VzdCIgcGF0aCB0byBhIGdpdmVuICd0YXJnZXQnIHBvaW50IGZyb20gYSBnaXZlbiBhcnJheQogICAgLy8gb2YgJ3BhdGhzJy4KICAgIC8vIEVhY2ggZWxlbWVudCBpbiAncGF0aHMnIHJlcHJlc2VudHMgYSBwYXRoIGFuZCBzaG91bGQgYmUgYW4gb2JqZWN0IHdpdGgKICAgIC8vIGEgJ2NvbnRyb2xQb2ludHMnIHByb3BlcnR5IGNvbnRhaW5pbmcgYSBkLWVsZW1lbnQgYXJyYXkgb2YgdGhlIGZvcm0KICAgIC8vIFtbeDEseTFdLC4uLixbeF9kLHlfZF1dIGNvbnRhaW5pbmcgdGhlIHBhdGgncyBjb250cm9sIHBvaW50cwogICAgLy8gaW4gYXNjZW5kaW5nICd4JyBjb29yZGluYXRlIG9yZGVyLCB3aGVyZSBkIGlzIHRoZSBudW1iZXIgb2YgYXhlcy4KICAgIC8vICdheGVzUG9zJyBzaG91bGQgYmUgYSBkLWVsZW1lbnQgYXJyYXkgY29udGFpbm5nIHRoZSB4IGNvb3JkaW5hdGUgb2YKICAgIC8vIGVhY2ggYXhpcy4KICAgIC8vICd0YXJnZXQnIHNob3VsZCBiZSBhIDItZCBhcnJheSBvZiB0aGUgZm9ybSBbeCwgeV0gZGVmaW5pbmcgdGhlIHRhcmdldAogICAgLy8gcG9pbnQuCiAgICAvLyAndGhyZXNob2xkJyBkZW5vdGVzIGEgdGhyZXNob2xkIHdoZXJlIGlmIHRoZSBjbG9zZXN0IHBhdGggaGFzIGRpc3RhbmNlCiAgICAvLyAoc2VlIGJlbG93KSBvZiBtb3JlIHRoYW4gJ3RocmVzaG9sZCcsIHRoZSByZXR1cm4gdmFsdWUgaXMgbnVsbC4KICAgIC8vCiAgICAvLyBXZSBkZWZpbmUgIkNsb3Nlc3QgcGF0aCIgd2l0aCByZXNwZWN0IHRvIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbiBvZgogICAgLy8gZGlzdGFuY2UuIFRoZSBkaXN0YW5jZSBmcm9tIGEgcG9pbnQgJ3RhcmdldCcgdG8gYSBwYXRoICdwJyBpcwogICAgLy8gdGhlIG1pbmltdW0gRXVjbGlkZWFuIGRpc3RhbmNlIGZyb20gJ3RhcmdldCcgdG8gYSBwb2ludCBpbiB0aGUKICAgIC8vIHN0cmFpZ2h0LWxpbmUgc2VnbWVudCBjb25uZWN0aW5nIHRoZSB0d28gY29udHJvbCBwb2ludHMgb2YgJ3AnCiAgICAvLyAiYXNzb2NpYXRlZCIgd2l0aCAndGFyZ2V0Jy4gVGhlIGNvbnRyb2wgcG9pbnRzIGFzc29jaWF0ZWQgd2l0aCB0YXJnZXQKICAgIC8vIGFyZSB0aG9zZSBjb3JyZXNwb25kaW5nIHRvIHRoZSAyIGF4ZXMgY2xvc2VzdCAodW5kZXIgdGhlIHVzdWFsCiAgICAvLyBFdWNsaWRlYW4gbWVhbmluZykgdG8gJ3RhcmdldCcgKHRpZXMgYXJlIGJyb2tlbiBieSBwcmVmZXJyaW5nIGF4ZXMKICAgIC8vIHdpdGggc21hbGxlciBjb29yZGluYXRlcykuCiAgICAvLwogICAgLy8gVGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBpcyBhIGNsb3Nlc3QgbWVtYmVyIG9mICdwYXRocycgdG8KICAgIC8vICd0YXJnZXQnIGlmIHRoZSBjbG9zZXN0IGRpc3RhbmNlIGlzIGF0IG1vc3QgJ3RocmVzaG9sZCcgb3IgbnVsbAogICAgLy8gb3RoZXJ3aXNlLgogICAgZnVuY3Rpb24gZmluZENsb3Nlc3RQYXRoKHBhdGhzLCBheGVzUG9zLCB0YXJnZXQsIHRocmVzaG9sZCkgewogICAgICAgIGlmIChheGVzUG9zLmxlbmd0aCA8IDIpIHsKICAgICAgICAgICAgY29uc29sZS5lcnJvcignTGVzcyB0aGFuIHR3byBheGVzIGluIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuJyk7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBjb25zdCBjeCA9IHRhcmdldFswXTsKICAgICAgICBjb25zdCBjeSA9IHRhcmdldFsxXTsKICAgICAgICBpZiAoY3ggPD0gYXhlc1Bvc1swXSB8fCBjeCA+PSBheGVzUG9zW2F4ZXNQb3MubGVuZ3RoIC0gMV0pIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8vIEZpbmQgdGhlIGluZGljZXMgYSwgYiBvZiB0aGUgdHdvIGF4ZXMgY2xvc2VzdCB0byAndGFyZ2V0Jy4KICAgICAgICBjb25zdCBiID0gbG9kYXNoLnNvcnRlZEluZGV4KGF4ZXNQb3MsIGN4KTsKICAgICAgICBjb25zb2xlLmFzc2VydChiID4gMCk7CiAgICAgICAgY29uc29sZS5hc3NlcnQoYiA8IGF4ZXNQb3MubGVuZ3RoKTsKICAgICAgICBjb25zdCBhID0gYiAtIDE7CiAgICAgICAgLy8gQ29tcHV0ZXMgdGhlIHNxdWFyZSBvZiB0aGUgbWluaW11bSBFdWNsaWRlYW4gZGlzdGFuY2UgZnJvbQogICAgICAgIC8vIChjeCwgY3kpIHRvIGEgcG9pbnQgb24gdGhlIGxpbmUgc2VnbWVudCBjb25uZWN0aW5nCiAgICAgICAgLy8gKGF4LGF5KSBhbmQgKGJ4LGJ5KS4KICAgICAgICAvLwogICAgICAgIC8vIE1ldGhvZDogTGV0IEE9KGF4LGF5KSwgQj0oYngsYnkpIGFuZCBDPShjeCwgY3kpOgogICAgICAgIC8vIEEgcGFyYW1ldHJpYyBmcm9tIG9mIHRoZSBsaW5lIHBhc3NpbmcgdGhyb3VnaCBBIGFuZCBCIGlzOgogICAgICAgIC8vIEIrdChBLUIpOyB0IHJlYWwuCiAgICAgICAgLy8gVGhlIGxpbmUgc2VnbWVudCBpcyB0aGUgcGFydCB3aXRoIDA8PXQ8PTEuCiAgICAgICAgLy8gTGV0ICd0cCcgYmUgdGhlICd0JyBjb3JyZXNwb25kaW5nIHRvIHRoZSBwcm9qZWN0aW9uIG9mIEMgb250byB0aGUKICAgICAgICAvLyBsaW5lLiBDbGVhcmx5LCAndHAnIHNhdGlzZmllczoKICAgICAgICAvLyA8Qy0oQit0cChBLUIpKSxBLUI+ID0gMCwgd2hlcmUgPD4gZGVub3RlcyB0aGUgZG90IHByb2R1Y3QuIFNvbHZpbmcKICAgICAgICAvLyBmb3IgdHAsIG9uZSBnZXRzOiB0cCA9IDxBLUIsQy1CPiAvIDxBLUIsQS1CPi4KICAgICAgICAvLyBTaW5jZSB0aGUgcG9pbnQgb24gdGhlIGxpbmUgc2VnbWVudCBjbG9zZXN0IHRvIEMgaXMgdGhlIHBvaW50IG9uCiAgICAgICAgLy8gdGhlIHNlZ21lbnQgY2xvc2VzdCB0byB0aGUgcHJvamVjdGlvbiBvZiBDIG9udG8gdGhlIGxpbmUsIHdlIGdldDoKICAgICAgICAvLyBpZiB0cDw9MCwgdGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIGxpbmUgc2VnbWVudCBpcyBCLgogICAgICAgIC8vIGlmIHRwPj0xLCB0aGUgY2xvc2VzdCBwb2ludCBvbiB0aGUgc2VnbWVudCBpcyBBLgogICAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGNsb3Nlc3QgcG9pbnQgaXMgQit0cChBLUIpLgogICAgICAgIGZ1bmN0aW9uIGRpc3RGbihheCwgYXksIGJ4LCBieSkgewogICAgICAgICAgICBjb25zdCBhYnggPSBheCAtIGJ4OwogICAgICAgICAgICBjb25zdCBhYnkgPSBheSAtIGJ5OwogICAgICAgICAgICBjb25zdCBjYnggPSBjeCAtIGJ4OwogICAgICAgICAgICBjb25zdCBjYnkgPSBjeSAtIGJ5OwogICAgICAgICAgICBjb25zdCB0cCA9IChhYnggKiBjYnggKyBhYnkgKiBjYnkpIC8gKGFieCAqIGFieCArIGFieSAqIGFieSk7CiAgICAgICAgICAgIGlmICh0cCA8PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbDJOb3JtU3F1YXJlZChjYngsIGNieSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRwID49IDEpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGNheCA9IGF4IC0gY3g7CiAgICAgICAgICAgICAgICBjb25zdCBjYXkgPSBheSAtIGN5OwogICAgICAgICAgICAgICAgcmV0dXJuIGwyTm9ybVNxdWFyZWQoY2F4LCBjYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBsMk5vcm1TcXVhcmVkKGNieCAtIHRwICogYWJ4LCBjYnkgLSB0cCAqIGFieSk7CiAgICAgICAgfQogICAgICAgIGxldCBtaW5EaXN0ID0gbnVsbDsKICAgICAgICBsZXQgY2xvc2VzdFBhdGggPSBudWxsOwogICAgICAgIHBhdGhzLmZvckVhY2goKHApID0+IHsKICAgICAgICAgICAgY29uc3QgZGlzdCA9IGRpc3RGbihwLmNvbnRyb2xQb2ludHNbYV1bMF0sIHAuY29udHJvbFBvaW50c1thXVsxXSwgcC5jb250cm9sUG9pbnRzW2JdWzBdLCBwLmNvbnRyb2xQb2ludHNbYl1bMV0pOwogICAgICAgICAgICBpZiAoZGlzdCA+IHRocmVzaG9sZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtaW5EaXN0ID09PSBudWxsIHx8IGRpc3QgPCBtaW5EaXN0KSB7CiAgICAgICAgICAgICAgICBtaW5EaXN0ID0gZGlzdDsKICAgICAgICAgICAgICAgIGNsb3Nlc3RQYXRoID0gcDsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjbG9zZXN0UGF0aDsKICAgIH0KICAgIC8vIENvbXB1dGVzIHRoZSBpbnZlcnNlIGltYWdlIChpbiB0aGUgbWF0aGVtYXRpY2FsIHNlbnNlKSBvZiB0aGUKICAgIC8vIHJlYWwtbGluZSBpbnRlcnZhbCBbYSxiXSB1bmRlciB0aGUgZ2l2ZW4gcG9pbnQgc2NhbGUgbWFwcGluZy4KICAgIC8vIFJldHVybnMgdGhlIGFycmF5IGNvbnNpc3Rpbmcgb2YgYWxsIGVsZW1lbnRzIHggc3VjaCB0aGF0IHNjYWxlKHgpCiAgICAvLyBpcyBpbiB0aGUgcmVhbC1saW5lIGludGVydmFsIFthLGJdLgogICAgZnVuY3Rpb24gcG9pbnRTY2FsZUludmVyc2VJbWFnZShzY2FsZSwgYSwgYikgewogICAgICAgIHJldHVybiBzY2FsZS5kb21haW4oKS5maWx0ZXIoKHgpID0+IHsKICAgICAgICAgICAgY29uc3QgeSA9IHNjYWxlKHgpOwogICAgICAgICAgICByZXR1cm4gYSA8PSB5ICYmIHkgPD0gYjsKICAgICAgICB9KTsKICAgIH0KICAgIC8vIENvbXB1dGVzIHRoZSBpbnZlcnNlIGltYWdlIChpbiB0aGUgbWF0aGVtYXRpY2FsIHNlbnNlKSBvZiB0aGUKICAgIC8vIHJlYWwtbGluZSBpbnRlcnZhbCBbYSxiXSB1bmRlciB0aGUgZ2l2ZW4gcXVhbnRpbGUgc2NhbGUgbWFwcGluZzsKICAgIC8vIHByZWNpc2VseToge3ggOiBzY2FsZSh4KSBpbiBbYSxiXX0KICAgIC8vIE5vdGUgdGhhdCBmb3IgYSBEMyBxdWFudGlsZSBzY2FsZSB0aGlzIHNldCBpcyBhIHJlYWwtbGluZSBoYWxmLW9wZW4KICAgIC8vIGludGVydmFsIG9mIHRoZSBmb3JtIFtjLGQpLgogICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoYXQgaW50ZXJ2YWwgYXMgYSAyLWVsZW1lbnQgYXJyYXkgW2MsIGRdLgogICAgZnVuY3Rpb24gcXVhbnRpbGVTY2FsZUludmVyc2VJbWFnZShzY2FsZSwgYSwgYikgewogICAgICAgIGNvbnN0IHJhbmdlID0gc2NhbGUucmFuZ2UoKTsKICAgICAgICBjb25zdCBkb21haW5zID0gcmFuZ2UKICAgICAgICAgICAgLmZpbHRlcigoeSkgPT4gYSA8PSB5ICYmIHkgPD0gYikKICAgICAgICAgICAgLm1hcCgoeSkgPT4gewogICAgICAgICAgICBjb25zdCBkb21haW4gPSBzY2FsZS5pbnZlcnRFeHRlbnQoeSk7CiAgICAgICAgICAgIC8vIEZpbmQgdGhlIGhhbGYgb3BlbiBpbnRlcnZhbCBvZiByZWFsIG51bWJlcnMgbWFwcGluZyB0byB5LgogICAgICAgICAgICAvLyBUaGlzIGlzIHR5cGljYWxseSByZXR1cm5lZCBieSBzY2FsZS5pbnZlcnRFeHRlbnQoeSkuCiAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGlmICd5JyBpcyB0aGUgbGFzdCB2YWx1ZSBpbiB0aGUgcmFuZ2UsIHRoYXQKICAgICAgICAgICAgLy8gaW50ZXJ2YWwgaGFzIHRoZSBmb3JtIFtkLCtpbmZpbml0eSksIHdoZXJlYXMgdGhlIHVwcGVyCiAgICAgICAgICAgIC8vIGJvdW5kIHJldHVybmVkIGJ5IHNjYWxlLmludmVydEV4dGVudCBpcyB0aGUgbGFyZ2VzdCBlbGVtZW50CiAgICAgICAgICAgIC8vIGluIHNjYWxlLmRvbWFpbigpLiBTaW5jZSB3ZSByZXR1cm4gYSBoYWxmLW9wZW4gaW50ZXJ2YWwsIGlmCiAgICAgICAgICAgIC8vIHdlIHVzZSB0aGF0IHZhbHVlLCB3ZSB3aWxsIGRyb3Agc2Vzc2lvbiBncm91cHMgd2hvc2UKICAgICAgICAgICAgLy8gY29sdW1uIHZhbHVlIGV4YWN0bHkgZXF1YWxzIGl0LiBTbyB3ZSB0ZXN0IGZvciB0aGlzIHNwZWNpYWwKICAgICAgICAgICAgLy8gY2FzZSBoZXJlIGFuZCBhZGp1c3QgZG9tYWluWzFdIHRvIGNvbXBlbnNhdGUuCiAgICAgICAgICAgIHJldHVybiB5ID09PSByYW5nZVtyYW5nZS5sZW5ndGggLSAxXQogICAgICAgICAgICAgICAgPyBbZG9tYWluWzBdLCBkb21haW5bMV0gKyAxXQogICAgICAgICAgICAgICAgOiBkb21haW47CiAgICAgICAgfSk7CiAgICAgICAgaWYgKGRvbWFpbnMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIFswLCAwXTsgLy8gUmV0dXJuIGFuIGVtcHR5IGludGVydmFsIFswLDApLgogICAgICAgIH0KICAgICAgICAvLyBTaW5jZSBvdXIgc291cmNlIHNldCBpcyBhIGNvbnRpZ3VvdXMgaW50ZXJ2YWwgW2EsYl0sIHRoZSB1bmlvbiBvZgogICAgICAgIC8vIGRvbWFpbnMgaXMgYSBzaW5nbGUgaGFsZi1vcGVuIGludGVydmFsLgogICAgICAgIHJldHVybiBleHRlbnQobWVyZ2UoZG9tYWlucykpOwogICAgfQogICAgLy8gQ29tcHV0ZXMgdGhlIGludmVyc2UgaW1hZ2UgKGluIHRoZSBtYXRoZW1hdGljYWwgc2Vuc2UpIG9mIHRoZQogICAgLy8gcmVhbC1saW5lIGludGVydmFsIFthLGJdIHVuZGVyIHRoZSBnaXZlbiBjb250aW51b3VzIHNjYWxlIG1hcHBpbmc7CiAgICAvLyBwcmVjaXNlbHk6IHt4IDogc2NhbGUoeCkgaW4gW2EsYl19CiAgICAvLyBOb3RlIHRoYXQgZm9yIGEgRDMgY29udGludW91cyBzY2FsZSB0aGlzIHNldCBpcyBhIHJlYWwtbGluZSBjbG9zZWQKICAgIC8vIGludGVydmFsLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhhdCBpbnRlcnZhbCBhcyBhIDItZWxlbWVudCBhcnJheS4KICAgIGZ1bmN0aW9uIGNvbnRpbnVvdXNTY2FsZUludmVyc2VJbWFnZShzY2FsZSwgYSwgYikgewogICAgICAgIC8vIEQzIGNvbnRpbnVvdXMgc2NhbGVzIGFyZSBtb25vdG9uaWMgY29udGludW91cyBmdW5jdGlvbnM7IGhlbmNlIHRvCiAgICAgICAgLy8gZ2V0IHRoZSBpbnZlcnNlIGltYWdlIGludGVydmFsIHdlIGp1c3QgbmVlZCB0byBpbnZlcnQgdGhlCiAgICAgICAgLy8gZW5kLXBvaW50cyBvZiB0aGUgc291cmNlIGludGVydmFsLiBXZSBzb3J0IHRoZSByZXN1bHRpbmcgZW5kLXBvaW50cywKICAgICAgICAvLyB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIHNjYWxlIGlzIGRlY3JlYXNpbmcuCiAgICAgICAgcmV0dXJuIFtzY2FsZS5pbnZlcnQoYSksIHNjYWxlLmludmVydChiKV0uc29ydCgoeCwgeSkgPT4geCAtIHkpOwogICAgfQogICAgLy8gQ3JlYXRlcyB0aGUgZDMtc2NhbGUgdG8gdXNlIGZvciB0aGUgYXhpcyB3aXRoIGdpdmVuIGRvbWFpbiB2YWx1ZXMKICAgIC8vIGFuZCBoZWlnaHQgYW5kIHNjYWxlLXR5cGUuIFRoaXMgZnVuY3Rpb24gbWF5IHBlcm11dGUgdGhlIGdpdmVuCiAgICAvLyAnZG9tYWluVmFsdWVzJyBhcnJheS4KICAgIGZ1bmN0aW9uIGNyZWF0ZUF4aXNTY2FsZShkb21haW5WYWx1ZXMsIGF4aXNIZWlnaHQsIHNjYWxlVHlwZSkgewogICAgICAgIGZ1bmN0aW9uIGNvbXB1dGVOdW1lcmljRXh0ZW50KCkgewogICAgICAgICAgICBpZiAoZG9tYWluVmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIHZhbHVlcywgdGhlcmUgd29uJ3QgYmUgYW55IHNlc3Npb24gZ3JvdXBzLgogICAgICAgICAgICAgICAgLy8gV2UgY2hvb3NlIGFuIGFyYml0cmFyeSBudW1lcmljIGRvbWFpbiB0aGF0IGRvZXNuJ3QgY29udGFpbiAwCiAgICAgICAgICAgICAgICAvLyAodG8gYWxsb3cgYSBsb2cgc2NhbGUpLgogICAgICAgICAgICAgICAgcmV0dXJuIFsxLCAyXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBbbWluLCBtYXhdID0gZXh0ZW50KGRvbWFpblZhbHVlcyk7CiAgICAgICAgICAgIGlmIChtaW4gIT09IG1heCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFttaW4sIG1heF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2Ugc2hpZnQgdGhlIG1pbiBhbmQgbWF4IG9mIHRoZSBleHRlbnQgaGVyZSBzaW5jZQogICAgICAgICAgICAvLyBkMy5zY2FsZUxpbmVhcigpIGFuZCBkMy5zY2FsZUxvZygpIGJvdGggZXhwZWN0IHRoZSBkb21haW4KICAgICAgICAgICAgLy8gdG8gYmUgYW4gaW50ZXJ2YWwgd2l0aCBtb3JlIHRoYW4gb25lIHBvaW50LiBTaW5jZSBpbiB0aGlzIGNhc2UKICAgICAgICAgICAgLy8gYWxsIHNlc3Npb24gZ3JvdXBzIHdvdWxkIHBhc3MgdGhyb3VnaCBhIHNpbmdsZSBwb2ludCBpbiB0aGUgYXhpcywKICAgICAgICAgICAgLy8gdGhlIGF4aXMgcmVzb2x1dGlvbiBkb2Vzbid0IG1hdHRlciBtdWNoIHNvIHRoZSBhbW91bnQgd2Ugc2hpZnQgYnkKICAgICAgICAgICAgLy8gZG9lc24ndCBtYXR0ZXIgbXVjaCBhcyB3ZWxsLiBTaW5jZSBmb3IgbG9nIHNjYWxlcyB3ZSBkb24ndCBhbGxvdwogICAgICAgICAgICAvLyB0aGUgZG9tYWluIHRvIGNvbnRhaW4gMCwgd2UgbmVlZCB0byBiZSBjYXJlZnVsIG5vdCB0byBtYWtlIHRoZQogICAgICAgICAgICAvLyBkb21haW4gY29udGFpbiAwIGlmIGl0IGhhZG4ndCBiZWZvcmUuCiAgICAgICAgICAgIGlmIChtaW4gPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW21pbiAqIDAuNSwgbWluICogMS41XTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWluIDwgMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIFttaW4gKiAxLjUsIG1pbiAqIDAuNV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFstMSwgMV07CiAgICAgICAgfQogICAgICAgIGlmIChzY2FsZVR5cGUgPT09ICdMSU5FQVInKSB7CiAgICAgICAgICAgIHJldHVybiBsaW5lYXIkMigpCiAgICAgICAgICAgICAgICAuZG9tYWluKGNvbXB1dGVOdW1lcmljRXh0ZW50KCkpCiAgICAgICAgICAgICAgICAucmFuZ2UoW2F4aXNIZWlnaHQsIDBdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2NhbGVUeXBlID09PSAnTE9HJykgewogICAgICAgICAgICBjb25zdCBleHRlbnQgPSBjb21wdXRlTnVtZXJpY0V4dGVudCgpOwogICAgICAgICAgICBpZiAoZXh0ZW50WzBdIDw9IDAgJiYgZXh0ZW50WzFdID49IDApIHsKICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGhhdmUgYSBsb2cgc2NhbGUgZm9yIGRhdGEgd2hvc2UgZXh0ZW50IGNvbnRhaW5zIDAuCiAgICAgICAgICAgICAgICAvLyBVc2UgYSBsaW5lYXIgc2NhbGUgaW5zdGVhZC4KICAgICAgICAgICAgICAgIC8vIFRPRE8oZXJleik6IENyZWF0ZSBhIHN5bWxvZyBzY2FsZSBzaW1pbGFyIHRvIE1hdHBsb3RsaWIncwogICAgICAgICAgICAgICAgLy8gc3ltbG9nLiBTZWUgYWxzbyBkMyBpc3N1ZSBoZXJlOgogICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2QzL2QzLXNjYWxlL2lzc3Vlcy8xMDUKICAgICAgICAgICAgICAgIC8vIGFuZCBiLzExMTc1NTU0MAogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUF4aXNTY2FsZShkb21haW5WYWx1ZXMsIGF4aXNIZWlnaHQsICdMSU5FQVInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbG9nJDEoKQogICAgICAgICAgICAgICAgLmRvbWFpbihleHRlbnQpCiAgICAgICAgICAgICAgICAucmFuZ2UoW2F4aXNIZWlnaHQsIDBdKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc2NhbGVUeXBlID09PSAnUVVBTlRJTEUnKSB7CiAgICAgICAgICAgIC8vIENvbXB1dGUga051bVF1YW50aWxlcyBxdWFudGlsZXMuCiAgICAgICAgICAgIGNvbnN0IGtOdW1RdWFudGlsZXMgPSAyMDsKICAgICAgICAgICAgLy8gQ29tcHV0ZSB0aGUgc2NhbGUncyByYW5nZSB0byBiZSB0aGUgYXJyYXk6CiAgICAgICAgICAgIC8vIFtheGlzSGVpZ2h0LAogICAgICAgICAgICAvLyAgYXhpc0hlaWdodC0xKmF4aXNIZWlnaHQvKGtOdW1RdWFudGlsZXMtMSksCiAgICAgICAgICAgIC8vICBheGlzSGVpZ2h0LTIqYXhpc0hlaWdodC8oa051bVF1YW50aWxlcy0xKSwgLi4uLAogICAgICAgICAgICAvLyAgMF0uCiAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRsZXksCiAgICAgICAgICAgIC8vIGQzLnJhbmdlKGF4aXNIZWlnaHQsIC1heGlzSGVpZ2h0LyhrTnVtUXVhbnRpbGVzLTEpLAogICAgICAgICAgICAvLyAgICAgICAgICAtYXhpc0hlaWdodC8oa051bVF1YW50aWxlcy0xKSkKICAgICAgICAgICAgLy8gaGFzIG51bWVyaWNhbCBpc3N1ZXMgYW5kIG1heSBwcm9kdWNlIGFuIGV4dHJhIG1lbWJlciwgc28gd2UgdXNlIGEKICAgICAgICAgICAgLy8gZGlmZmVyZW50IHByb2NlZHVyZToKICAgICAgICAgICAgY29uc3Qgc2NhbGVSYW5nZSA9IHNlcXVlbmNlKGtOdW1RdWFudGlsZXMpCiAgICAgICAgICAgICAgICAubWFwKChpKSA9PiBheGlzSGVpZ2h0IC0gKGkgKiBheGlzSGVpZ2h0KSAvIChrTnVtUXVhbnRpbGVzIC0gMSkpOwogICAgICAgICAgICBpZiAoZG9tYWluVmFsdWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gTm8gc2Vzc2lvbiBncm91cHMgaW4gdGhpcyBjYXNlLiBXZSB1c2UgYSBkdW1teSB2YWx1ZSBzaW5jZQogICAgICAgICAgICAgICAgLy8gZDMuc2NhbGVRdWFudGlsZSgpIHJlcXVpcmVzIGEgbm9uLWVtcHR5IGRvbWFpbi4KICAgICAgICAgICAgICAgIGRvbWFpblZhbHVlcyA9IFsxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcXVhbnRpbGUoKS5kb21haW4obG9kYXNoLnVuaXEoZG9tYWluVmFsdWVzKSkucmFuZ2Uoc2NhbGVSYW5nZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNjYWxlVHlwZSA9PT0gJ05PTl9OVU1FUklDJykgewogICAgICAgICAgICByZXR1cm4gcG9pbnQkMSgpCiAgICAgICAgICAgICAgICAuZG9tYWluKAogICAgICAgICAgICAvLyBXZSBzb3J0IHRoZSBkb21haW4gdmFsdWVzIHRvIG1ha2UgdGhlIG9yZGVyCiAgICAgICAgICAgIC8vIHN0YWJsZSBhY3Jvc3MgJ0xpc3RTZXNzaW9uR3JvdXBzJyBSUENzCiAgICAgICAgICAgIGxvZGFzaC51bmlxKGRvbWFpblZhbHVlcy5zb3J0KCkpKQogICAgICAgICAgICAgICAgLnJhbmdlKFtheGlzSGVpZ2h0LCAwXSkKICAgICAgICAgICAgICAgIC5wYWRkaW5nKDAuMSk7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICAgICAgdGhyb3cgUmFuZ2VFcnJvcignVW5rbm93biBzY2FsZTogJyArIHNjYWxlVHlwZSk7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICB2YXIgU2NhbGVUeXBlOwogICAgKGZ1bmN0aW9uIChTY2FsZVR5cGUpIHsKICAgICAgICBTY2FsZVR5cGVbIkxJTkVBUiJdID0gIkxJTkVBUiI7CiAgICAgICAgU2NhbGVUeXBlWyJMT0ciXSA9ICJMT0ciOwogICAgICAgIFNjYWxlVHlwZVsiUVVBTlRJTEUiXSA9ICJRVUFOVElMRSI7CiAgICAgICAgU2NhbGVUeXBlWyJOT05fTlVNRVJJQyJdID0gIk5PTl9OVU1FUklDIjsKICAgIH0pKFNjYWxlVHlwZSB8fCAoU2NhbGVUeXBlID0ge30pKTsKICAgIC8qKgogICAgICogQW4gQWx3YXlzUGFzc2luZ0JydXNoRmlsdGVyIHJldHVybnMgJ3RydWUnIGZvciBhbnkgdmFsdWUuIEl0IGlzIHVzZWQKICAgICAqIHRvIHJlcHJlc2VudCB0aGUgY2FzZSB3aGVuIGFuIEF4aXMgZG9lcyBub3QgaGF2ZSBhbiBhY3RpdmUgYnJ1c2ggc2VsZWN0aW9uLgogICAgICovCiAgICBjbGFzcyBBbHdheXNQYXNzaW5nQnJ1c2hGaWx0ZXIgewogICAgICAgIGlzUGFzc2luZyh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFuIEludGVydmFsQnJ1c2hGaWx0ZXIgcmV0dXJucyAndHJ1ZScgaWYgdGhlIGdpdmVuIChudW1lcmljKSB2YWx1ZSBsaWVzCiAgICAgKiBpbiBhIGdpdmVuIGludGVydmFsIHNwZWNpZmllZCBvbiBjb25zdHJ1Y3Rpb24gLiBJdCdzIHVzZWQgdG8gcmVwcmVzZW50CiAgICAgKiBicnVzaCBmaWx0ZXJzIGZvciBBeGlzIHdpdGggbGluZWFyLCBsb2dhcml0aG1pYyBvciBxdWFudGlsZSBzY2FsZXMuCiAgICAgKi8KICAgIGNsYXNzIEludGVydmFsQnJ1c2hGaWx0ZXIgewogICAgICAgIC8qKiBDb25zdHJ1Y3RzIHRoZSBmaWx0ZXIuIFRoZSBpbnRlcnZhbCB1c2VkIGlzIGRlZmluZWQgYnkgbG93ZXIsIGFuZCB1cHBlci4KICAgICAgICAgKiBJZiBsb3dlck9wZW4gKHJlc3AuIHVwcGVyT3BlbikgaXMgdHJ1ZSwgdGhlIGludGVydmFsIHdpbGwgYmUgb3BlbiBpbgogICAgICAgICAqIGl0cyBsb3dlciAocmVzcC4gdXBwZXIpIGVuZCwgb3RoZXJ3aXNlIGl0IHdpbGwgYmUgY2xvc2VkLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGxvd2VyLCB1cHBlciwgbG93ZXJPcGVuLCB1cHBlck9wZW4pIHsKICAgICAgICAgICAgdGhpcy5fbG93ZXIgPSBsb3dlcjsKICAgICAgICAgICAgdGhpcy5fdXBwZXIgPSB1cHBlcjsKICAgICAgICAgICAgdGhpcy5fbG93ZXJPcGVuID0gbG93ZXJPcGVuOwogICAgICAgICAgICB0aGlzLl91cHBlck9wZW4gPSB1cHBlck9wZW47CiAgICAgICAgfQogICAgICAgIGlzUGFzc2luZyh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCBudW1WYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2JlZm9yZSh0aGlzLl9sb3dlciwgbnVtVmFsdWUsICF0aGlzLl9sb3dlck9wZW4pICYmCiAgICAgICAgICAgICAgICB0aGlzLl9iZWZvcmUobnVtVmFsdWUsIHRoaXMuX3VwcGVyLCAhdGhpcy5fdXBwZXJPcGVuKSk7CiAgICAgICAgfQogICAgICAgIF9iZWZvcmUoYSwgYiwgaW5jbHVzaXZlKSB7CiAgICAgICAgICAgIGlmIChpbmNsdXNpdmUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhIDw9IGI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGEgPCBiOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBTZXRCcnVzaEZpbHRlciByZXR1cm5zICd0cnVlJyBpZiB0aGUgdmFsdWUgaXMgaW4gYSBnaXZlbiBzZXQgc3BlY2lmaWVkCiAgICAgKiBpbiBjb25zdHJ1Y3Rpb24uCiAgICAgKi8KICAgIGNsYXNzIFNldEJydXNoRmlsdGVyIHsKICAgICAgICBjb25zdHJ1Y3Rvcihkb21haW5TZXQpIHsKICAgICAgICAgICAgdGhpcy5fZG9tYWluU2V0ID0gZG9tYWluU2V0OwogICAgICAgIH0KICAgICAgICBpc1Bhc3NpbmcodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvbWFpblNldC5maW5kSW5kZXgoKGVsZW1lbnQpID0+IGVsZW1lbnQgPT09IHZhbHVlKSAhPT0gLTE7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXByZXNlbnRzIGEgc2luZ2xlIEF4aXMuIEFuIGF4aXMgZG9lcyBub3Qga25vdyBpdHMgaG9yaXpvbnRhbCBsb2NhdGlvbiBpbgogICAgICogdGhlIFNWRzsgaW5zdGVhZCB0aGUgYXhlcyBsb2NhdGlvbnMgYXJlIG1hbmFnZWQgYnkgdGhlIEF4ZXNDb2xsZWN0aW9uIGNsYXNzLgogICAgICogQW4gYXhpcyByZXByZXNlbnRzIGEgc2luZ2xlIGNvbHVtbiAobWV0cmljIG9yIGhhcGFyYW0pLiBJdCBzdG9yZXMgYSBzY2FsZQogICAgICogdHlwZSBhbmQgYSBEMyBzY2FsZSB0aGF0IG1hcHMgdmFsdWVzIGluIHRoZSBheGlzIGRvbWFpbiAoY29sdW1uIHZhbHVlcykKICAgICAqIHRvIHktY29vcmRpbmF0ZXMgaW4gdGhlIFNWRy4gQWRkaXRpb25hbGx5LCBhbiBheGlzIHN0b3JlcyBhCiAgICAgKiBEMy1icnVzaC1zZWxlY3Rpb24gd2hpY2ggaXMgYSAyLWVsZW1lbnQgbnVtZXJpYyBhcnJheSBvZiB0aGUgZm9ybQogICAgICogW2xvd2VyLCB1cHBlcl0gY29udGFpbmluZyB0aGUgdXBwZXIgYW5kIGxvd2VyIHktY29vcmRpbmF0ZXMgb2YgdGhlIGN1cnJlbnQKICAgICAqIGJydXNoIHNlbGVjdGlvbi4gSWYgbm8gYnJ1c2ggc2VsZWN0aW9uIGV4aXN0cywgdGhlIGJydXNoIHNlbGVjdGlvbiBzdG9yZWQgaXMKICAgICAqIG51bGwuCiAgICAgKiBGaW5hbGx5LCBhbiBheGlzIGNhbiBiZSB2aXNpYmxlIChkaXNwbGF5ZWQpIG9yIGludmlzaWJsZSAod2hpY2ggd2lsbCBiZQogICAgICogc2V0IGJhc2VkIG9uIHRoZSB1c2VyJ3Mgc2V0dGluZ3MgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGNvbHVtbikuIEFuIGludmlzaWJsZQogICAgICogYXhpcyBuZWVkIG5vdCBoYXZlIGl0cyBzY2FsZSBvciBzY2FsZS10eXBlIHBvcHVsYXRlZC4KICAgICAqLwogICAgY2xhc3MgQXhpcyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhbiBheGlzIHJlcHJlc2VudGluZyB0aGUgY29sdW1uIGluZGV4ZWQgYnkgJ2NvbEluZGV4JyB3aXRoCiAgICAgICAgICogcmVzcGVjdCB0byAnc2NoZW1hJy4gTmVlZHMgYW4gSW50ZXJhY3Rpb25NYW5hZ2VyIGluc3RhbmNlIHNvIHRoYXQgaXQgY2FuCiAgICAgICAgICogY2FsbCBpdHMgZXZlbnQgaGFuZGxlcnMgdXBvbiByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdmdQcm9wcywgc2NoZW1hLCBpbnRlcmFjdGlvbk1hbmFnZXIsIGNvbEluZGV4KSB7CiAgICAgICAgICAgIHRoaXMuX3N2Z1Byb3BzID0gc3ZnUHJvcHM7CiAgICAgICAgICAgIHRoaXMuX3NjaGVtYSA9IHNjaGVtYTsKICAgICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyID0gaW50ZXJhY3Rpb25NYW5hZ2VyOwogICAgICAgICAgICB0aGlzLl9jb2xJbmRleCA9IGNvbEluZGV4OwogICAgICAgICAgICB0aGlzLl9pc0Rpc3BsYXllZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl95U2NhbGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9zY2FsZVR5cGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnNldEJydXNoU2VsZWN0aW9uKG51bGwpOwogICAgICAgIH0KICAgICAgICBjb2xJbmRleCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbEluZGV4OwogICAgICAgIH0KICAgICAgICB5U2NhbGUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl95U2NhbGU7CiAgICAgICAgfQogICAgICAgIHNjYWxlVHlwZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NjYWxlVHlwZTsKICAgICAgICB9CiAgICAgICAgYnJ1c2hTZWxlY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9icnVzaFNlbGVjdGlvbjsKICAgICAgICB9CiAgICAgICAgaXNEaXNwbGF5ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0Rpc3BsYXllZDsKICAgICAgICB9CiAgICAgICAgc2V0QnJ1c2hTZWxlY3Rpb24oYnJ1c2hTZWxlY3Rpb24pIHsKICAgICAgICAgICAgdGhpcy5fYnJ1c2hTZWxlY3Rpb24gPSBicnVzaFNlbGVjdGlvbjsKICAgICAgICAgICAgdGhpcy5fYnJ1c2hGaWx0ZXIgPSB0aGlzLl9idWlsZEJydXNoRmlsdGVyKHRoaXMuYnJ1c2hTZWxlY3Rpb24oKSwgdGhpcy5zY2FsZVR5cGUoKSwgdGhpcy55U2NhbGUoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGRvbWFpbiBhbmQgc2NhbGUgdHlwZSBmb3IgdGhlIGF4aXMuIFRoZSBjdXJyZW50IGJydXNoIHNlbGVjdGlvbgogICAgICAgICAqIGlzIHByZXNlcnZlZC4KICAgICAgICAgKi8KICAgICAgICBzZXREb21haW5BbmRTY2FsZShkb21haW5WYWx1ZXMsIHNjYWxlVHlwZSkgewogICAgICAgICAgICB0aGlzLl9zY2FsZVR5cGUgPSBzY2FsZVR5cGU7CiAgICAgICAgICAgIHRoaXMuX3lTY2FsZSA9IGNyZWF0ZUF4aXNTY2FsZSgKICAgICAgICAgICAgLy8gUGFzcyBhIGNvcHkgc2luY2UgY3JlYXRlQXhpc1NjYWxlIG1heSBwZXJtdXRlIHRoZSBkb21haW5WYWx1ZXMgYXJyYXkuCiAgICAgICAgICAgIGRvbWFpblZhbHVlcy5zbGljZSgpLCB0aGlzLl9zdmdQcm9wcy5oZWlnaHQsIHRoaXMuc2NhbGVUeXBlKCkpOwogICAgICAgICAgICAvLyBUT0RPKGVyZXopOiBUcnkgdG8gbW9kaWZ5IHRoZSBicnVzaCBzZWxlY3Rpb24gc28gdGhhdCBpdCBzZWxlY3RzCiAgICAgICAgICAgIC8vIHRoZSBzYW1lIHN1YnNldCBvZiB0aGUgYXhpcyBkb21haW4gd2hpY2ggd2FzIHNlbGVjdGVkIGJlZm9yZQogICAgICAgICAgICAvLyB0aGlzIG1ldGhvZCB3YXMgY2FsbGVkLgogICAgICAgICAgICAvLyBUaGlzIGNhbid0IGFsd2F5cyBiZSBkb25lIChlLmcuIGlmIHdlIHN3aXRjaGVkIGZyb20gYSBsaW5lYXIgdG8gYQogICAgICAgICAgICAvLyBxdWFudGlsZSBzY2FsZSwgb3IgaWYgdGhlIGRvbWFpbiB2YWx1ZXMgY2hhbmdlZCBzaWduaWZpY2FudGx5KSBidXQgaW4KICAgICAgICAgICAgLy8gdGhlIGNhc2VzIHdoZW4gaXQgaXMgcG9zc2libGUsIGl0IHdpbGwgYmUgbW9yZSBjb252ZW5pZW50IHRvIHRoZSB1c2VyLgogICAgICAgICAgICAvLyBDdXJyZW50bHksIHdlIGtlZXAgdGhlIHNhbWUgYnJ1c2ggc2VsZWN0aW9uIGFuZCByZWNhbGN1bGF0ZSB0aGUgZmlsdGVyLgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBldmVyeSB0aW1lIGRhdGEgaXMgcmVsb2FkZWQKICAgICAgICAgICAgLy8gKGUuZy4gZXZlcnkgMzAgc2Vjb25kcyBieSBkZWZhdWx0IGluIFRlbnNvcmJvYXJkKSwgc28gd2UgaGF2ZSB0byBtYWtlCiAgICAgICAgICAgIC8vIHN1cmUgbm90IHRvIGNoYW5nZSB0aGUgc2VsZWN0aW9uIGlmIHRoZSBkYXRhIGhhc24ndCBjaGFuZ2VkLCBhcyB0aGF0CiAgICAgICAgICAgIC8vIHdvdWxkIGJlIHZlcnkgYW5ub3lpbmcgdG8gdGhlIGVuZCB1c2VyLgogICAgICAgICAgICB0aGlzLl9icnVzaEZpbHRlciA9IHRoaXMuX2J1aWxkQnJ1c2hGaWx0ZXIodGhpcy5icnVzaFNlbGVjdGlvbigpLCB0aGlzLnNjYWxlVHlwZSgpLCB0aGlzLnlTY2FsZSgpKTsKICAgICAgICB9CiAgICAgICAgYnJ1c2hGaWx0ZXIoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9icnVzaEZpbHRlcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVuZGVycyB0aGUgYXhpcyBhcyBjaGlsZCBlbGVtZW50cyBvZiAnYXhpc1BhcmVudCcuIFJlbW92ZXMgYW55IHByZWV4aXN0aW5nCiAgICAgICAgICogY2hpbGRyZW4gb2YgYXhpc1BhcmVudC4gJ2F4aXNQYXJlbnQnIGlzIGV4cGVjdGVkIHRvIGJlIGEgPGc+IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRE9NKGF4aXNQYXJlbnQgLyogSFRNTEVsZW1lbnQgKi8pIHsKICAgICAgICAgICAgbGV0IGQzQXhpcyA9IGF4aXNMZWZ0KHRoaXMueVNjYWxlKCkpOwogICAgICAgICAgICBpZiAodGhpcy5zY2FsZVR5cGUoKSA9PT0gU2NhbGVUeXBlLlFVQU5USUxFKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB0aWNrVmFsdWVzIG9mIGEgcXVhbnRpbGUgc2NhbGUgaXMganVzdCB0aGUKICAgICAgICAgICAgICAgIC8vIHNjYWxlIGRvbWFpbiwgd2hpY2ggcHJvZHVjZXMgb3ZlcmxhcHBpbmcgbGFiZWxzIGlmIHRoZQogICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBkb21haW4gaXMgZ3JlYXRlciB0aGFuIHRoZQogICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHF1YW50aWxlcyAoc2luY2UgdGhlbiB0aGUgc2NhbGUgbWFwcyBtb3JlIHRoYW4KICAgICAgICAgICAgICAgIC8vIG9uZSBkb21haW4gdmFsdWUgdG8gdGhlIHNhbWUgcXVhbnRpbGUpLgogICAgICAgICAgICAgICAgZDNBeGlzID0gZDNBeGlzCiAgICAgICAgICAgICAgICAgICAgLnRpY2tWYWx1ZXModGhpcy55U2NhbGUoKS5xdWFudGlsZXMoKSkKICAgICAgICAgICAgICAgICAgICAudGlja0Zvcm1hdChmb3JtYXQoJy0uNmcnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgYXhpc1BhcmVudFNlbCA9IHNlbGVjdChheGlzUGFyZW50KTsKICAgICAgICAgICAgYXhpc1BhcmVudFNlbC5zZWxlY3RBbGwoJ2cnKS5yZW1vdmUoKTsKICAgICAgICAgICAgYXhpc1BhcmVudFNlbAogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnYXhpcycsIHRydWUpCiAgICAgICAgICAgICAgICAuY2FsbChkM0F4aXMpCiAgICAgICAgICAgICAgICAvLyBBZGQgYXhpcyB0aXRsZS4KICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2F4aXMtdGl0bGUnLCB0cnVlKQogICAgICAgICAgICAgICAgLnN0eWxlKCdjdXJzb3InLCAnbW92ZScpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpCiAgICAgICAgICAgICAgICAuYXR0cigneScsIC05KQogICAgICAgICAgICAgICAgLnRleHQoKGNvbEluZGV4KSA9PiBzY2hlbWFDb2x1bW5OYW1lKHRoaXMuX3NjaGVtYSwgY29sSW5kZXgpKTsKICAgICAgICAgICAgLy8gQWRkIGRyYWdnaW5nIGV2ZW50IGhhbmRsZXJzLgogICAgICAgICAgICBheGlzUGFyZW50U2VsLmNhbGwoZHJhZygpCiAgICAgICAgICAgICAgICAub24oJ3N0YXJ0JywgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gV2Ugc2V0IGFuIGF0dHJpYnV0ZSBvbiB0aGUgYXhpcyB0aGF0IHNpZ25hbHMKICAgICAgICAgICAgICAgIC8vIHRoYXQgaXQgaXMgYmVpbmcgZHJhZ2dlZC4gVGhpcyBhbGxvd3MKICAgICAgICAgICAgICAgIC8vIGludGVncmF0aW9uIHRlc3RzIHRvIGtub3cgd2hlbiBkcmFnZ2luZyBpcyBkb25lLgogICAgICAgICAgICAgICAgYXhpc1BhcmVudC5zZXRBdHRyaWJ1dGUoJ2lzLWRyYWdnaW5nJywgJycpOwogICAgICAgICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uRHJhZ1N0YXJ0KHRoaXMuY29sSW5kZXgoKSk7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAub24oJ2RyYWcnLCAoKSA9PiB0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnKGV2ZW50LngpKQogICAgICAgICAgICAgICAgLm9uKCdlbmQnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25EcmFnRW5kKCk7CiAgICAgICAgICAgICAgICBheGlzUGFyZW50LnJlbW92ZUF0dHJpYnV0ZSgnaXMtZHJhZ2dpbmcnKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBBZGQgdGhlIGJydXNoLgogICAgICAgICAgICBjb25zdCBkM0JydXNoID0gYnJ1c2hZKCkKICAgICAgICAgICAgICAgIC5leHRlbnQoWwogICAgICAgICAgICAgICAgWy04LCAwXSwKICAgICAgICAgICAgICAgIFs4LCB0aGlzLl9zdmdQcm9wcy5oZWlnaHQgKyAxXSwKICAgICAgICAgICAgXSkKICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGUgYnJ1c2ggZXZlbnQgaGFuZGxlcnMuIEQzIHdpbGwgY2FsbCB0aGVzZSBib3RoIHdoZW4KICAgICAgICAgICAgICAgICAgICAgICB0aGUgdXNlciBtb3ZlcyB0aGUgYnJ1c2ggc2VsZWN0aW9uIGFuZCB3aGVuIHdlIGNoYW5nZSB0aGUgYnJ1c2gKICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gcHJvZ3JhbW1hdGljYWxseSB1c2luZyBkM0JydXNoLm1vdmUoKS4gV2UnZCBsaWtlIHRvCiAgICAgICAgICAgICAgICAgICAgICAgYXZvaWQgY2FsbGluZyB0aGUgaW50ZXJhY3Rpb25NYW5hZ2VyIGluIHRoZSBsYXR0ZXIgY2FzZTsgdGh1cywKICAgICAgICAgICAgICAgICAgICAgICB3ZSBjYWxsIF9pc0ludGVyYWN0aXZlRDNFdmVudCgpIHRvIGZpbmQgb3V0IGlmIHRoZSBldmVudCB3YXMgZmlyZWQKICAgICAgICAgICAgICAgICAgICAgICBkdWUgdG8gYSBwcm9ncmFtbWV0aWMgY2hhbmdlIG9mIHRoZSBicnVzaCBzZWxlY3Rpb24gLCBhbmQgaWYgc28sCiAgICAgICAgICAgICAgICAgICAgICAgaWdub3JlIHRoZSBldmVudC4gKi8KICAgICAgICAgICAgICAgIC5vbignc3RhcnQnLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIV9pc0ludGVyYWN0aXZlRDNFdmVudChldmVudCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBXZSBzZXQgdGhlICdpcy1icnVzaGluZycgYXR0cmlidXRlIG9uIHRoZSBjb250YWluaW5nCiAgICAgICAgICAgICAgICAvLyAnYXhpcy1wYXJlbnQnLWNsYXNzZWQgPGc+IGVsZW1lbnQgdG8gbm90aWZ5IGludGVncmF0aW9uIHRlc3RzCiAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSBheGlzIGlzIGJ1c3kgYnJ1c2hpbmcuCiAgICAgICAgICAgICAgICBheGlzUGFyZW50LnNldEF0dHJpYnV0ZSgnaXMtYnJ1c2hpbmcnLCAnJyk7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIub25CcnVzaENoYW5nZWQodGhpcy5jb2xJbmRleCgpLCBldmVudC5zZWxlY3Rpb24pOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdicnVzaCcsICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICghX2lzSW50ZXJhY3RpdmVEM0V2ZW50KGV2ZW50KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCksIGV2ZW50LnNlbGVjdGlvbik7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAub24oJ2VuZCcsICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICghX2lzSW50ZXJhY3RpdmVEM0V2ZW50KGV2ZW50KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlci5vbkJydXNoQ2hhbmdlZCh0aGlzLmNvbEluZGV4KCksIGV2ZW50LnNlbGVjdGlvbik7CiAgICAgICAgICAgICAgICBheGlzUGFyZW50LnJlbW92ZUF0dHJpYnV0ZSgnaXMtYnJ1c2hpbmcnKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGNvbnN0IGJydXNoRyA9IHNlbGVjdChheGlzUGFyZW50KQogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnYnJ1c2gnLCB0cnVlKTsKICAgICAgICAgICAgYnJ1c2hHLmNhbGwoZDNCcnVzaCk7CiAgICAgICAgICAgIC8vIFNldCB0aGUgYnJ1c2ggc2VsZWN0aW9uIHByb2dyYW1tYXRpY2FsbHkuCiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2FzdCBicnVzaEcgdG8gJ2FueScgaGVyZSBzaW5jZSBUeXBlU2NyaXB0IGRvZXNuJ3QgcmVhbGl6ZQogICAgICAgICAgICAvLyB0aGUgYnJ1c2hHIGlzIGEgPGc+IHNlbGVjdGlvbiBhbmQgY29tcGxhaW5zLgogICAgICAgICAgICBkM0JydXNoLm1vdmUoYnJ1c2hHLCB0aGlzLmJydXNoU2VsZWN0aW9uKCkpOwogICAgICAgIH0KICAgICAgICBzZXREaXNwbGF5ZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5faXNEaXNwbGF5ZWQgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0aGUgYnJ1c2ggZmlsdGVyIGZvciB0aGUgZ2l2ZW4gc2VsZWN0aW9uIHVzaW5nIHRoZSBjdXJyZW50CiAgICAgICAgICogc2NhbGUuCiAgICAgICAgICovCiAgICAgICAgX2J1aWxkQnJ1c2hGaWx0ZXIoYnJ1c2hTZWxlY3Rpb24sIHNjYWxlVHlwZSwgeVNjYWxlIC8qIEQzIHNjYWxlICovKSB7CiAgICAgICAgICAgIGlmIChicnVzaFNlbGVjdGlvbiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBbHdheXNQYXNzaW5nQnJ1c2hGaWx0ZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2NhbGVUeXBlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCJTY2FsZSB0eXBlIGlzIG51bGwsIGJ1dCBicnVzaFNlbGVjdGlvbiBpc24ndDogIiwgYnJ1c2hTZWxlY3Rpb24pOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBbHdheXNQYXNzaW5nQnJ1c2hGaWx0ZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHNjYWxlVHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSBTY2FsZVR5cGUuTElORUFSOgogICAgICAgICAgICAgICAgY2FzZSBTY2FsZVR5cGUuTE9HOiB7CiAgICAgICAgICAgICAgICAgICAgLyogRmFsbCBUaHJvdWdoICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgW2xvd2VyLCB1cHBlcixdID0gY29udGludW91c1NjYWxlSW52ZXJzZUltYWdlKHlTY2FsZSwgYnJ1c2hTZWxlY3Rpb25bMF0sIGJydXNoU2VsZWN0aW9uWzFdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVydmFsQnJ1c2hGaWx0ZXIobG93ZXIsIHVwcGVyLCAKICAgICAgICAgICAgICAgICAgICAvKmxvd2VyT3Blbj0qLyBmYWxzZSwgCiAgICAgICAgICAgICAgICAgICAgLyp1cHBlck9wZW49Ki8gZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2FzZSBTY2FsZVR5cGUuUVVBTlRJTEU6IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBbbG93ZXIsIHVwcGVyLF0gPSBxdWFudGlsZVNjYWxlSW52ZXJzZUltYWdlKHlTY2FsZSwgYnJ1c2hTZWxlY3Rpb25bMF0sIGJydXNoU2VsZWN0aW9uWzFdKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEludGVydmFsQnJ1c2hGaWx0ZXIobG93ZXIsIHVwcGVyLCAKICAgICAgICAgICAgICAgICAgICAvKmxvd2VyT3Blbj0qLyBmYWxzZSwgCiAgICAgICAgICAgICAgICAgICAgLyp1cHBlck9wZW49Ki8gdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIFNjYWxlVHlwZS5OT05fTlVNRVJJQzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNldEJydXNoRmlsdGVyKHBvaW50U2NhbGVJbnZlcnNlSW1hZ2UoeVNjYWxlLCBicnVzaFNlbGVjdGlvblswXSwgYnJ1c2hTZWxlY3Rpb25bMV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zb2xlLmVycm9yKCdVbmtub3duIHNjYWxlIHR5cGU6ICcsIHNjYWxlVHlwZSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgQWx3YXlzUGFzc2luZ0JydXNoRmlsdGVyKCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYW5hZ2VzIHRoZSBjb2xsZWN0aW9uIG9mIGF4ZXMgc2hvd24gaW4gdGhlIHBsb3QuIEhhcyBtZXRob2RzIHRoYXQgaGFuZGxlCiAgICAgKiBkcmFnZ2luZyBhbiBheGlzIGFuZCBjb250YWlucyB0aGUgbG9naWMgZm9yIHJlLW9yZGVyaW5nIHRoZSBheGVzCiAgICAgKiBkdXJpbmcgZHJhZ2dpbmcuCiAgICAgKi8KICAgIGNsYXNzIEF4ZXNDb2xsZWN0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihzdmdQcm9wcywgc2NoZW1hLCBpbnRlcmFjdGlvbk1hbmFnZXIpIHsKICAgICAgICAgICAgdGhpcy5fc3ZnUHJvcHMgPSBzdmdQcm9wczsKICAgICAgICAgICAgdGhpcy5fc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLl9heGVzID0gdGhpcy5fY3JlYXRlQXhlcyhpbnRlcmFjdGlvbk1hbmFnZXIpOwogICAgICAgICAgICB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyA9IHBvaW50JDEoKQogICAgICAgICAgICAgICAgLnJhbmdlKFsxLCB0aGlzLl9zdmdQcm9wcy53aWR0aCAtIDFdKQogICAgICAgICAgICAgICAgLnBhZGRpbmcoMC41KTsKICAgICAgICAgICAgdGhpcy5fZHJhZ2dlZEF4aXMgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgnZy5heGlzLXBhcmVudCcpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRzU2VsID0gdGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoJy5heGlzLXBhcmVudCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIGFsbCBheGVzIGJhc2VkIG9uIHRoZSBnaXZlbiAnb3B0aW9ucycgKHNlZSB0aGUgY29tbWVudHMgaW4KICAgICAgICAgKiB0Zi1ocGFyYW1zLXNjYWxlLWFuZC1jb2xvci1jb250cm9scy5odG1sKSBhbmQgc2Vzc2lvbkdyb3Vwcy4gU2Vzc2lvbkdyb3VwcwogICAgICAgICAqIGFyZSB1c2VkIHRvIHVwZGF0ZSB0aGUgZG9tYWluIChhbmQgdGh1cyBzY2FsZSkgb2YgdGhlIGF4ZXMuIFRoZSAnb3B0aW9ucycKICAgICAgICAgKiBvYmplY3QgY29udHJvbCB3aGljaCBheGVzIGFyZSB2aXNpYmxlLgogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUF4ZXMob3B0aW9ucywgc2Vzc2lvbkdyb3VwcykgewogICAgICAgICAgICBjb25zb2xlLmFzc2VydCghdGhpcy5pc0F4aXNEcmFnZ2luZygpKTsKICAgICAgICAgICAgLy8gVHJhdmVyc2Ugb3B0aW9ucy5jb2x1bW5zLCBhbmQgdXBkYXRlIGVhY2ggY29ycmVzcG9uZGluZyBheGlzLgogICAgICAgICAgICBjb25zdCB2aXNpYmxlQ29sSW5kaWNlcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgb3B0aW9ucy5jb2x1bW5zLmZvckVhY2goKGNvbHVtbikgPT4gewogICAgICAgICAgICAgICAgY29uc3QgY29sSW5kZXggPSBjb2x1bW4uYWJzb2x1dGVJbmRleDsKICAgICAgICAgICAgICAgIGxldCBheGlzID0gdGhpcy5fYXhlc1tjb2xJbmRleF07CiAgICAgICAgICAgICAgICBheGlzLnNldERpc3BsYXllZCh0cnVlKTsKICAgICAgICAgICAgICAgIGNvbnN0IGRvbWFpblZhbHVlcyA9IHNlc3Npb25Hcm91cHMubWFwKChzZykgPT4gY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSwgc2csIGNvbEluZGV4KSk7CiAgICAgICAgICAgICAgICBheGlzLnNldERvbWFpbkFuZFNjYWxlKGRvbWFpblZhbHVlcywgY29sdW1uLnNjYWxlKTsKICAgICAgICAgICAgICAgIHZpc2libGVDb2xJbmRpY2VzLmFkZChjb2xJbmRleCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBTZXQgdGhlIHZpc2liaWxpdHkgb2YgdGhlIHJlbWFpbmluZyBheGVzIHRvIGZhbHNlLgogICAgICAgICAgICB0aGlzLl9heGVzLmZvckVhY2goKGF4aXMpID0+IHsKICAgICAgICAgICAgICAgIGlmICghdmlzaWJsZUNvbEluZGljZXMuaGFzKGF4aXMuY29sSW5kZXgoKSkpIHsKICAgICAgICAgICAgICAgICAgICBheGlzLnNldERpc3BsYXllZChmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl91cGRhdGVTdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyh2aXNpYmxlQ29sSW5kaWNlcyk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgRE9NLgogICAgICAgICAgICB0aGlzLl9wYXJlbnRzU2VsID0gdGhpcy5fcGFyZW50c1NlbC5kYXRhKEFycmF5LmZyb20odmlzaWJsZUNvbEluZGljZXMpLCAKICAgICAgICAgICAgLyprZXk9Ki8gKGNvbEluZGV4KSA9PiBjb2xJbmRleCk7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudHNTZWwuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRzU2VsID0gdGhpcy5fcGFyZW50c1NlbAogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2F4aXMtcGFyZW50JywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5tZXJnZSh0aGlzLl9wYXJlbnRzU2VsKTsKICAgICAgICAgICAgY29uc3QgX3RoaXMgPSB0aGlzOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRzU2VsCiAgICAgICAgICAgICAgICAuY2FsbCgoc2VsKSA9PiB0aGlzLl91cGRhdGVBeGVzUG9zaXRpb25zSW5ET00oc2VsKSkKICAgICAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChjb2xJbmRleCkgewogICAgICAgICAgICAgICAgLyogSGVyZSAndGhpcycgaXMgdGhlICdheGlzLXBhcmVudCctY2xhc3NlZCA8Zz4gZWxlbWVudCwKICAgICAgICAgICAgICAgICAgICAgYW5kICdfdGhpcycgaXMgdGhlIEF4ZXNDb2xsZWN0aW9uIGVsZW1lbnQuICovCiAgICAgICAgICAgICAgICBfdGhpcy5fYXhlc1tjb2xJbmRleF0udXBkYXRlRE9NKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgbWFwRnVuY3Rpb24gb24gZWFjaCB2aXNpYmxlIGF4aXMuIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUKICAgICAgICAgKiByZXN1bHQgZnJvbSBlYWNoIGludm9jYXRpb24uIFRoZSBmdW5jdGlvbiBpcyBpbnZva2VkIG9uIHRoZSBheGVzIG9yZGVyZWQKICAgICAgICAgKiBieSB0aGVpciBpbmNyZWFzaW5nIHhQb3NpdGlvbi4KICAgICAgICAgKi8KICAgICAgICBtYXBWaXNpYmxlQXhlcyhtYXBGdW5jdGlvbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMKICAgICAgICAgICAgICAgIC5kb21haW4oKQogICAgICAgICAgICAgICAgLm1hcCgoY29sSW5kZXgpID0+IG1hcEZ1bmN0aW9uKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGNvbEluZGV4KSwgdGhpcy5fYXhlc1tjb2xJbmRleF0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIG9uIGV2ZXJ5IHZpc2libGUgYXhpcywKICAgICAgICAgKiAgICAgZmFsc2Ugb3RoZXJ3aXNlLiBOb3RlIHRoYXQgdGhlIHByZWRpY2F0ZSB3aWxsIG9ubHkgYmUgZXZhbHVhdGVkIHVudGlsCiAgICAgICAgICogICAgIHRoZSBmaXJzdCB0aW1lIGl0IHJldHVybnMgZmFsc2UuCiAgICAgICAgICovCiAgICAgICAgYWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KHByZWRpY2F0ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMKICAgICAgICAgICAgICAgIC5kb21haW4oKQogICAgICAgICAgICAgICAgLmV2ZXJ5KChjb2xJbmRleCkgPT4gcHJlZGljYXRlKHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGNvbEluZGV4KSwgdGhpcy5fYXhlc1tjb2xJbmRleF0pKTsKICAgICAgICB9CiAgICAgICAgZ2V0QXhpc0ZvckNvbEluZGV4KGNvbEluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9heGVzW2NvbEluZGV4XTsKICAgICAgICB9CiAgICAgICAgLyogQXhpcyBkcmFnZ2luZy4KICAgICAgICAgKiBUbyBkcmFnIGFuIGF4aXMsIGNhbGw6IGRyYWdTdGFydCgpLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkcmFnKCkgY2FsbHMKICAgICAgICAgKiBmb2xsb3dlZCBieSBhIHNpbmdsZSBjYWxsIHRvIGRyYWdFbmQoKS4KICAgICAgICAgKiBBdCBtb3N0IG9uZSBheGlzIGNhbiBiZSBkcmFnZ2VkIGF0IGFueSBnaXZlbiB0aW1lLgogICAgICAgICAqIEVhY2ggYXhpcyAod2hldGhlciBkcmFnZ2VkIG9yIG5vdCkgaGFzIGFuIGFzc29jaWF0ZWQgInN0YXRpb25hcnkiCiAgICAgICAgICogcG9zaXRpb24gd2hpY2ggaXMgaXRzICh4LWNvb3JkaW5hdGUpIHBvc2l0aW9uIHdoZW4gaXQgaXMgbm90IGJlaW5nIGRyYWdnZWQuCiAgICAgICAgICogVGhlIGFjdHVhbCBwb3NpdGlvbiBvZiBhbiBheGlzIGlzIGVpdGhlciBpdHMgYXNzb2NpYXRlZCBzdGF0aW9uYXJ5CiAgICAgICAgICogcG9zaXRpb24gaWYgaXRzIG5vdCBkcmFnZ2VkIG9yIGl0cyBjdXJyZW50bHkgZHJhZ2dlZCBwb3NpdGlvbi4gVGhpcyBjbGFzcwogICAgICAgICAqIG1haW50YWlucyB0aGUgaW52YXJpYW50IHRoYXQgdGhlIGF4ZXMnIHN0YXRpb25hcnkgcG9zaXRpb25zIG1hdGNoIHRoZSBvcmRlcgogICAgICAgICAqIG9mIHRoZWlyIGFjdHVhbCBwb3NpdGlvbiBieSByZS1hc3NpZ25pbmcgc3RhdGlvbmFyeSBwb3NpdGlvbnMgdG8gYXhlcyB3aGVuCiAgICAgICAgICogZHJhZ2dpbmcgYW4gYXhpcyBjYXVzZXMgaXQgdG8gInBhc3MiIGFub3RoZXIgYXhlcy4KICAgICAgICAgKi8KICAgICAgICBkcmFnU3RhcnQoY29sSW5kZXgpIHsKICAgICAgICAgICAgY29uc29sZS5hc3NlcnQoIXRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7CiAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRoaXMuX2F4ZXNbY29sSW5kZXhdLmlzRGlzcGxheWVkKCkpOwogICAgICAgICAgICB0aGlzLl9kcmFnZ2VkQXhpcyA9IHRoaXMuX2F4ZXNbY29sSW5kZXhdOwogICAgICAgICAgICB0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uID0gdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMoY29sSW5kZXgpOwogICAgICAgIH0KICAgICAgICBkcmFnKG5ld1gpIHsKICAgICAgICAgICAgbmV3WCA9IE1hdGgubWluKE1hdGgubWF4KG5ld1gsIDApLCB0aGlzLl9zdmdQcm9wcy53aWR0aCk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb24gPSBuZXdYOwogICAgICAgICAgICBsZXQgdmlzaWJsZUNvbEluZGljZXMgPSB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucy5kb21haW4oKTsKICAgICAgICAgICAgdmlzaWJsZUNvbEluZGljZXMuc29ydCgoY2kxLCBjaTIpID0+IHRoaXMuZ2V0QXhpc1Bvc2l0aW9uKGNpMSkgLSB0aGlzLmdldEF4aXNQb3NpdGlvbihjaTIpKTsKICAgICAgICAgICAgdGhpcy5fc3RhdGlvbmFyeUF4ZXNQb3NpdGlvbnMuZG9tYWluKHZpc2libGVDb2xJbmRpY2VzKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHRoaXMuX3BhcmVudHNTZWwpOwogICAgICAgIH0KICAgICAgICBkcmFnRW5kKGR1cmF0aW9uKSB7CiAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHRoaXMuaXNBeGlzRHJhZ2dpbmcoKSk7CiAgICAgICAgICAgIHRoaXMuX2RyYWdnZWRBeGlzUG9zaXRpb24gPSBudWxsOwogICAgICAgICAgICB0aGlzLl9kcmFnZ2VkQXhpcyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUF4ZXNQb3NpdGlvbnNJbkRPTSh0aGlzLl9wYXJlbnRzU2VsLnRyYW5zaXRpb24oKS5kdXJhdGlvbihkdXJhdGlvbikpOwogICAgICAgIH0KICAgICAgICBpc0F4aXNEcmFnZ2luZygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnZWRBeGlzICE9PSBudWxsOwogICAgICAgIH0KICAgICAgICBnZXRBeGlzUG9zaXRpb24oY29sSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RyYWdnZWRBeGlzICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICB0aGlzLl9kcmFnZ2VkQXhpcy5jb2xJbmRleCgpID09PSBjb2xJbmRleAogICAgICAgICAgICAgICAgPyB0aGlzLl9kcmFnZ2VkQXhpc1Bvc2l0aW9uCiAgICAgICAgICAgICAgICA6IHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zKGNvbEluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZG9tYWluIG9mICdzdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucycgdG8gYmUgcHJlY2lzZWx5IHRoZSBnaXZlbgogICAgICAgICAqIHZpc2libGVDb2xJbmRpY2VzLCBidXQgcHJlc2VydmVzIHRoZSBvcmRlciBvZiB0aGUgY29sdW1uIGluZGljZXMgdGhhdAogICAgICAgICAqIGFyZSBhbHJlYWR5IGluIHRoZSBkb21haW4uIEVzc2VudGlhbGx5LCB0aGlzIG1ldGhvZCByZW1vdmVzIGluZGljZXMgaW4KICAgICAgICAgKiB0aGUgZG9tYWluIHRoYXQgYXJlIG5vdCBpbiB2aXNpYmxlQ29sSW5kaWNlcyBhbmQgdGhlbiBhcHBlbmRzIGluZGljZXMgaW4KICAgICAgICAgKiB2aXNpYmxlQ29sSW5kaWNlcyB0aGF0IGFyZSBub3QgY3VycmVudGx5IGluIHRoZSBkb21haW4uIFRodXMsIGluZGljZXMgaW4KICAgICAgICAgKiB2aXNpYmxlQ29sSW5kaWNlcyB0aGF0IGFyZSBhbHJlYWR5IGluIHN0YXRpb25hcnlBeGVzUG9zaXRpb25zCiAgICAgICAgICogd2lsbCBtYWludGFpbiB0aGVpciBvcmRlciBpbiBzdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucyBhbmQgd2lsbCBwcmVjZWRlCiAgICAgICAgICogdGhlIG5ldyBlbGVtZW50cy4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgcmVhc3NpZ25zIHN0YXRpb25hcnkgcG9zaXRpb25zIHRvIGF4ZXMgc28gdGhhdCB0aGUgb25seSB2aXNpYmxlCiAgICAgICAgICogYXhlcyBhcmUgdGhlIG9uZXMgd2l0aCBjb2x1bW4gaW5kaWNlcyBpbiAndmlzaWJsZUNvbEluZGljZXMnLCBidXQgcHJlc2VydmVzCiAgICAgICAgICogdGhlIG9yZGVyIG9mIGF4ZXMgaW5kZXhlZCBieSB2aXNpYmxlQ29sSW5kaWNlcyB0aGF0IGFyZSBhbHJlYWR5IHZpc2libGUuCiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVN0YXRpb25hcnlBeGVzUG9zaXRpb25zKHZpc2libGVDb2xJbmRpY2VzKSB7CiAgICAgICAgICAgIGNvbnN0IHZpc2libGVEb21haW4gPSB0aGlzLl9zdGF0aW9uYXJ5QXhlc1Bvc2l0aW9ucwogICAgICAgICAgICAgICAgLmRvbWFpbigpCiAgICAgICAgICAgICAgICAuZmlsdGVyKChjb2xJbmRleCkgPT4gdmlzaWJsZUNvbEluZGljZXMuaGFzKGNvbEluZGV4KSk7CiAgICAgICAgICAgIGNvbnN0IG5ld0RvbWFpbiA9IEFycmF5LmZyb20obmV3IFNldChbLi4udmlzaWJsZURvbWFpbiwgLi4uQXJyYXkuZnJvbSh2aXNpYmxlQ29sSW5kaWNlcyldKSk7CiAgICAgICAgICAgIHRoaXMuX3N0YXRpb25hcnlBeGVzUG9zaXRpb25zLmRvbWFpbihuZXdEb21haW4pOwogICAgICAgIH0KICAgICAgICBfdXBkYXRlQXhlc1Bvc2l0aW9uc0luRE9NKHNlbGVjdGlvbk9yVHJhbnNpdGlvbikgewogICAgICAgICAgICBzZWxlY3Rpb25PclRyYW5zaXRpb24uYXR0cigndHJhbnNmb3JtJywgKGNvbEluZGV4KSA9PiB0cmFuc2xhdGVTdHIodGhpcy5nZXRBeGlzUG9zaXRpb24oY29sSW5kZXgpKSk7CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVBeGVzKGludGVyYWN0aW9uTWFuYWdlcikgewogICAgICAgICAgICByZXR1cm4gc2VxdWVuY2UobnVtQ29sdW1ucyh0aGlzLl9zY2hlbWEpKQogICAgICAgICAgICAgICAgLm1hcCgoY29sSW5kZXgpID0+IG5ldyBBeGlzKHRoaXMuX3N2Z1Byb3BzLCB0aGlzLl9zY2hlbWEsIGludGVyYWN0aW9uTWFuYWdlciwgY29sSW5kZXgpKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBfaXNJbnRlcmFjdGl2ZUQzRXZlbnQoZDNFdmVudCkgewogICAgICAgIHJldHVybiBkM0V2ZW50LnNvdXJjZUV2ZW50ICE9PSBudWxsOwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICdMaWNlbnNlJyk7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gJ0FTIElTJyBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgdmFyIExpbmVUeXBlOwogICAgKGZ1bmN0aW9uIChMaW5lVHlwZSkgewogICAgICAgIExpbmVUeXBlW0xpbmVUeXBlWyJGT1JFR1JPVU5EIl0gPSAwXSA9ICJGT1JFR1JPVU5EIjsKICAgICAgICBMaW5lVHlwZVtMaW5lVHlwZVsiQkFDS0dST1VORCJdID0gMV0gPSAiQkFDS0dST1VORCI7CiAgICB9KShMaW5lVHlwZSB8fCAoTGluZVR5cGUgPSB7fSkpOwogICAgLyoqCiAgICAgKiBBIGhhbmRsZSB0byBhIHJlcHJlc2VudGF0aW9uIG9mIGEgc2Vzc2lvbiBncm91cCBpbiB0aGUgJ0xpbmVzQ29sbGVjdGlvbicKICAgICAqIGNsYXNzIGJlbG93LiBUaGUgaGFuZGxlIGNhbiBhbHNvIGJlICJudWxsIiAtLSBtZWFuaW5nIGl0IHJlZmVyZW5jZXMgbm8KICAgICAqIHNlc3Npb24gZ3JvdXAgKHNpbWlsYXIgdG8gYSAibnVsbCBwb2ludGVyIiksIGluIHdoaWNoIGNhc2UgdGhlCiAgICAgKiAnc2Vzc2lvbkdyb3VwKCknIG1ldGhvZCByZXR1cm5zIG51bGwuCiAgICAgKgogICAgICogTm90ZTogd2UgdXNlIHRoaXMgY2xhc3MgcmF0aGVyIHRoYW4gYSBzaW1wbGUgU2Vzc2lvbkdyb3VwIG9iamVjdCBzbyB0aGF0IHdlCiAgICAgKiB3b24ndCBuZWVkIHRvIHNlYXJjaCB0aGUgRE9NIGZvciB0aGUgPHBhdGg+IHJlcHJlc2VudGluZyB0aGUgc2Vzc2lvbiBncm91cDsKICAgICAqIGluc3RlYWQgdGhlIChmb3JlZ3JvdW5kKSA8cGF0aD4gZWxlbWVudCBpcyBzdG9yZWQgaW4gdGhlIGhhbmRsZS4KICAgICAqLwogICAgY2xhc3MgU2Vzc2lvbkdyb3VwSGFuZGxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGEgc2Vzc2lvbiBncm91cCBoYW5kbGUgZnJvbSBhIEQzIHNlbGVjdGlvbiBvZiB0aGUgcGF0aAogICAgICAgICAqIGVsZW1lbnQgcmVwcmVzZW50aW5nIHRoZSBzZXNzaW9uR3JvdXAuIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIGJ5IHRoZQogICAgICAgICAqICdMaW5lc0NvbGxlY3Rpb24nIGNsYXNzIGJlbG93LiBJZiBzZXNzaW9uR3JvdXBTZWwgaXMgZW1wdHkgb3IgdW5kZWZpbmVkLCBhCiAgICAgICAgICogIm51bGwiIGhhbmRsZSB3aWxsIGJlIGNvbnN0cnVjdGVkLgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHNlc3Npb25Hcm91cFNlbCkgewogICAgICAgICAgICBpZiAoc2Vzc2lvbkdyb3VwU2VsID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cFNlbCA9IHNlbGVjdEFsbChudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zb2xlLmFzc2VydChzZXNzaW9uR3JvdXBTZWwuc2l6ZSgpIDw9IDEpOwogICAgICAgICAgICB0aGlzLl9zZXNzaW9uR3JvdXBTZWwgPSBzZXNzaW9uR3JvdXBTZWw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gdGhlIHNlc3Npb25Hcm91cCBvYmplY3QgdGhpcyBoYW5kbGUgcmVmZXJlbmNlcyBvciBudWxsIGlmCiAgICAgICAgICogdGhpcyBpcyBhICJudWxsIiByZWZlcmVuY2UuCiAgICAgICAgICovCiAgICAgICAgc2Vzc2lvbkdyb3VwKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkdyb3VwU2VsLnNpemUoKSA9PT0gMQogICAgICAgICAgICAgICAgPyB0aGlzLl9zZXNzaW9uR3JvdXBTZWwuZGF0dW0oKQogICAgICAgICAgICAgICAgOiBudWxsOwogICAgICAgIH0KICAgICAgICBpc051bGwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlc3Npb25Hcm91cCgpID09PSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlICdMaW5lc0NvbGxlY3Rpb24nIGNsYXNzIGJlbG93LgogICAgICAgICAqIEByZXR1cm4gdGhlIGQzLXNlbGVjdGlvbiBnaXZlbiBvbiBjb25zdHJ1Y3Rpb24uCiAgICAgICAgICovCiAgICAgICAgc2VsZWN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2Vzc2lvbkdyb3VwU2VsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0aGlzIGhhbmRsZSB0byAnb3RoZXJIYW5kbGUnIGFuZCByZXR1cm5zIHRydWUgaWYgYm90aCBhcmUgbnVsbAogICAgICAgICAqIG9yIGJvdGggYXJlIG5vdCBudWxsIGFuZCB0aGV5IHJlZmVyZW5jZSBlcXVhbCBzZXNzaW9uIGdyb3Vwcy4KICAgICAgICAgKiBTZXNzaW9uIGdyb3VwIGVxdWFsaXR5IGlzIGRldGVybWluZWQgYnkgdGhlaXIgbmFtZXMuCiAgICAgICAgICovCiAgICAgICAgZXF1YWxzVG8ob3RoZXJIYW5kbGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNOdWxsKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvdGhlckhhbmRsZS5pc051bGwoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3RoZXJIYW5kbGUuaXNOdWxsKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3RoZXJIYW5kbGUuc2Vzc2lvbkdyb3VwKCkubmFtZSA9PSB0aGlzLnNlc3Npb25Hcm91cCgpLm5hbWU7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYW5hZ2VzIHRoZSBsaW5lcyByZXByZXNlbnRpbmcgdGhlIHNlc3Npb24gZ3JvdXBzLiBFYWNoIHNlc3Npb24gZ3JvdXAgaXMKICAgICAqIHJlcHJlc2VudGVkIGJ5IHR3byA8cGF0aD4gZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBjb250cm9sIHBvaW50czogYSBmb3JlZ3JvdW5kCiAgICAgKiBhbmQgYSBiYWNrZ3JvdW5kIGxpbmUsIHdpdGggdGhlIGZvcmVncm91bmQgbGluZSBhbHdheXMgcmVuZGVyZWQgYWZ0ZXIgdGhlCiAgICAgKiBiYWNrZ3JvdW5kIGxpbmUgKGl0IHN1Y2NlZWRzIGl0IGluIGRvY3VtZW50IG9yZGVyKS4gVGhlIGZvcmVncm91bmQgbGluZSBpcwogICAgICogY29sb3JlZCBiYXNlZCBvbiB0aGUgdmFsdWUgIG9mIHRoZSAnY29sb3ItYnknIGNvbHVtbiAoc3BlY2lmaWVkIGluIG9wdGlvbnMpLAogICAgICogd2hlcmVhcyB0aGUgYmFja2dyb3VuZCBsaW5lIGlzIGdyYXkuIFRoZSBmb3JlZ3JvdW5kIGxpbmUgaXMgZGlzcGxheWVkIG9ubHkKICAgICAqIGlmIHRoZSBzZXNzaW9uIGdyb3VwIHBhc3NlcyB0aGUgY3VycmVudCBheGVzIGJydXNoIGZpbHRlcnMuIFRoaXMgd2F5LCBvbmx5CiAgICAgKiBzZXNzaW9uIGdyb3VwcyB0aGF0IHBhc3MgdGhlIGN1cnJlbnQgYnJ1c2ggZmlsdGVycyB3aWxsIGJlIHJlcHJlc2VudGVkIGJ5CiAgICAgKiBjb2xvcmVkIGxpbmVzLCBhbmQgdGhlIG90aGVyIHNlc3Npb24gZ3JvdXBzIHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkgZ3JheQogICAgICogbGluZXMuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHdlIGNvdWxkIGhhdmUgcmVwcmVzZW50ZWQgZWFjaCBzZXNzaW9uIGdyb3VwIHdpdGggYSBzaW5nbGUgbGluZQogICAgICogd2l0aCBhIGNvbG9yIHRoYXQgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZSBzZXNzaW9uIGdyb3VwIHBhc3NlZCB0aGUgYnJ1c2gKICAgICAqIGZpbHRlcnMuIEhvd2V2ZXIsIHRoaXMgd291bGQgaGF2ZSByZXF1aXJlZCB1cyB0byByZS1vcmRlciB0aGUgRE9NIHRvIGF2b2lkCiAgICAgKiByZW5kZXJpbmcgZ3JheSBsaW5lcyBvbiB0b3Agb2YgY29sb3JlZCBsaW5lcyAod2hpY2ggd291bGQgbG9vayBiYWQsCiAgICAgKiBlc3BlY2lhbGx5IGlmIHRoZSBkZW5zaXR5IG9mIGxpbmVzIGlzIGxhcmdlKS4KICAgICAqCiAgICAgKiBUaGlzIGNsYXNzIGFsc28gc3RvcmVzIHR3byBTZXNzaW9uR3JvdXBIYW5kbGVzOiBwZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUgYW5kCiAgICAgKiBzZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSwgYW5kIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHVwZGF0aW5nIHRoZW0uIFRoZXNlCiAgICAgKiBhcmUgdXNlZCB0byBzdG9yZSB0aGUgcGVha2VkIHNlc3Npb24gZ3JvdXA6IHRoZSBzZXNzaW9uIGdyb3VwIHdob3NlIGxpbmUKICAgICAqIGlzIGNsb3Nlc3QgdG8gdGhlIG1vdXNlIHBvaW50LiBUaGUgcGVha2VkIHNlc3Npb24gZ3JvdXAgY2FuIGJlIHNlbGVjdGVkCiAgICAgKiBieSBjbGlja2luZyB0aGUgbW91c2UgcG9pbnRlci4gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXNzaW9uIGdyb3VwIGlzCiAgICAgKiByZWZlcmVuY2VkIGJ5IHRoZSBzZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZS4KICAgICAqLwogICAgY2xhc3MgTGluZXNDb2xsZWN0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihzdmdQcm9wcywgc2NoZW1hLCBheGVzQ29sbGVjdGlvbikgewogICAgICAgICAgICB0aGlzLl9zdmdQcm9wcyA9IHN2Z1Byb3BzOwogICAgICAgICAgICB0aGlzLl9zY2hlbWEgPSBzY2hlbWE7CiAgICAgICAgICAgIHRoaXMuX2F4ZXNDb2xsZWN0aW9uID0gYXhlc0NvbGxlY3Rpb247CiAgICAgICAgICAgIHRoaXMuX3Nlc3Npb25Hcm91cHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fc3ZnUHJvcHMuc3ZnRy5zZWxlY3RBbGwoJ2cuYmFja2dyb3VuZCcpLnJlbW92ZSgpOwogICAgICAgICAgICB0aGlzLl9zdmdQcm9wcy5zdmdHLnNlbGVjdEFsbCgnZy5mb3JlZ3JvdW5kJykucmVtb3ZlKCk7CiAgICAgICAgICAgIHRoaXMuX2JnUGF0aHNTZWwgPSB0aGlzLl9zdmdQcm9wcy5zdmdHCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdiYWNrZ3JvdW5kJywgdHJ1ZSkKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJ3BhdGgnKTsKICAgICAgICAgICAgdGhpcy5fZmdQYXRoc1NlbCA9IHRoaXMuX3N2Z1Byb3BzLnN2Z0cKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2ZvcmVncm91bmQnLCB0cnVlKQogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgncGF0aCcpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVWaXNpYmxlRmdQYXRoc1NlbCgpOwogICAgICAgICAgICB0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUgPSBuZXcgU2Vzc2lvbkdyb3VwSGFuZGxlKCk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlID0gbmV3IFNlc3Npb25Hcm91cEhhbmRsZSgpOwogICAgICAgICAgICB0aGlzLl9kM2xpbmUgPSBsaW5lKCkuY3VydmUoY3VydmVMaW5lYXIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIGEgU2Vzc2lvbkdyb3VwSGFuZGxlIHJlZmVyZW5jaW5nIHRoZSBnaXZlbiBzZXNzaW9uR3JvdXAuIElmIHRoZQogICAgICAgICAqIGdpdmVuIHNlc3Npb25Hcm91cCBpcyBudWxsIG9yIHVuZGVmaW5lZCByZXR1cm5zIGEgIm51bGwiIGhhbmRsZS4KICAgICAgICAgKi8KICAgICAgICBnZXRTZXNzaW9uR3JvdXBIYW5kbGUoc2Vzc2lvbkdyb3VwKSB7CiAgICAgICAgICAgIGlmIChzZXNzaW9uR3JvdXAgPT09IG51bGwgfHwgc2Vzc2lvbkdyb3VwID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkdyb3VwSGFuZGxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uR3JvdXBIYW5kbGUodGhpcy5fZmdQYXRoc1NlbC5maWx0ZXIoKHNnKSA9PiBzZy5uYW1lID09PSBzZXNzaW9uR3JvdXAubmFtZSkpOwogICAgICAgIH0KICAgICAgICBoaWRlQmFja2dyb3VuZExpbmVzKCkgewogICAgICAgICAgICB0aGlzLl9iZ1BhdGhzU2VsLmF0dHIoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7CiAgICAgICAgfQogICAgICAgIHNob3dCYWNrZ3JvdW5kTGluZXMoKSB7CiAgICAgICAgICAgIHRoaXMuX2JnUGF0aHNTZWwuYXR0cigndmlzaWJpbGl0eScsIG51bGwpOwogICAgICAgIH0KICAgICAgICBwZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGU7CiAgICAgICAgfQogICAgICAgIHNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlY29tcHV0ZXMgdGhlIGNvbnRyb2wgcG9pbnRzIG9mIHRoZSBsaW5lcyB3aXRoIHRoZSBnaXZlbiAndHlwZScKICAgICAgICAgKiAoZm9yZWdyb3VuZCBvciBiYWNrZ3JvdW5kKSB0byBjb3JyZXNwb25kIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZQogICAgICAgICAqIGF4ZXNDb2xsZWN0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIGxpbmVUeXBlIC0gVGhlIHR5cGUgb2YgbGluZXMgdG8gdXBkYXRlLgogICAgICAgICAqIEBwYXJhbSB0cmFuc2l0aW9uRHVyYXRpb24gLSBUaGUgbGluZXMgd2lsbCBiZSB0cmFuc2l0aW9uZWQgKGFuaW1hdGVkKSB0bwogICAgICAgICAqICAgICB0aGVpciBuZXcgc3RhdGUuIFRoaXMgc3BlY2lmaWVzIHRoZSBkdXJhdGlvbiBvZiB0aGF0IHRyYW5zaXRpb24uIDAKICAgICAgICAgKiAgICAgbWVhbnMgbm8gYW5pbWF0aW9uLgogICAgICAgICAqLwogICAgICAgIHJlY29tcHV0ZUNvbnRyb2xQb2ludHMobGluZVR5cGUsIHRyYW5zaXRpb25EdXJhdGlvbiA9IDApIHsKICAgICAgICAgICAgY29uc3QgcGF0aFNlbCA9IGxpbmVUeXBlID09PSBMaW5lVHlwZS5GT1JFR1JPVU5EID8gdGhpcy5fZmdQYXRoc1NlbCA6IHRoaXMuX2JnUGF0aHNTZWw7CiAgICAgICAgICAgIHBhdGhTZWwKICAgICAgICAgICAgICAgIC50cmFuc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5kdXJhdGlvbih0cmFuc2l0aW9uRHVyYXRpb24pCiAgICAgICAgICAgICAgICAuYXR0cignZCcsIChzZXNzaW9uR3JvdXApID0+IHRoaXMuX3BhdGhEQXR0cmlidXRlKHNlc3Npb25Hcm91cCkpOwogICAgICAgICAgICBpZiAobGluZVR5cGUgPT09IExpbmVUeXBlLkZPUkVHUk9VTkQpIHsKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29udHJvbCBwb2ludHMgcHJvcGVydHksIGlmIHdlJ3JlIHVwZGF0aW5nIHRoZSBmb3JlZ3JvdW5kCiAgICAgICAgICAgICAgICAvLyBsaW5lcy4KICAgICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZmdQYXRoc1NlbC5lYWNoKGZ1bmN0aW9uIChzZXNzaW9uR3JvdXApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ190aGlzJyByZWZlcnMgdG8gdGhlICdMaW5lc0NvbGxlY3Rpb24nIGluc3RhbmNlLgogICAgICAgICAgICAgICAgICAgICAgICBfdGhpcy5fc2V0Q29udHJvbFBvaW50c1Byb3BlcnR5KHRoaXMsIHNlc3Npb25Hcm91cCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXJlbmRlcnMgdGhlIGZvcmVncm91bmQgbGluZXMgc28gdGhhdCB0aGVpciB2aXNpYmlsaXR5IG1hdGNoZXMgdGhlCiAgICAgICAgICogY3VycmVudCBicnVzaCBmaWx0ZXJzLgogICAgICAgICAqLwogICAgICAgIHJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZnUGF0aHNTZWwuY2xhc3NlZCgnaW52aXNpYmxlLXBhdGgnLCAoc2Vzc2lvbkdyb3VwKSA9PiAhdGhpcy5fYXhlc0NvbGxlY3Rpb24uYWxsVmlzaWJsZUF4ZXNTYXRpc2Z5KCh4UG9zaXRpb24sIGF4aXMpID0+IGF4aXMKICAgICAgICAgICAgICAgIC5icnVzaEZpbHRlcigpCiAgICAgICAgICAgICAgICAuaXNQYXNzaW5nKGNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsIHNlc3Npb25Hcm91cCwgYXhpcy5jb2xJbmRleCgpKSkpKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmlzaWJsZUZnUGF0aHNTZWwoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgY29sb3Jpbmcgc2NoZW1lIG9mIHRoZSAodmlzaWJsZSkgZm9yZWdyb3VuZCBsaW5lcy4KICAgICAgICAgKiBBIGZvcmVncm91bmQgbGluZSB3aWxsIGJlIGNvbG9yZWQgYnkgYSBjb2xvciBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZQogICAgICAgICAqIG9mIHRoZSBjb2x1bW4gaW5kZXhlZCBieSBjb2xvckJ5Q29sdW1uSW5kZXggaW4gdGhlIHNlc3Npb24gZ3JvdXAKICAgICAgICAgKiByZXByZXNlbnRlZCBieSB0aGUgbGluZS4gVGhlIGNvbG9yIGNvcnJlc3BvbmRpbmcgdG8gYSB2YWx1ZSBpcwogICAgICAgICAqIGludGVycG9sYXRlZCBiZXR3ZWVuIG1pbkNvbG9yIGFuZCBtYXhDb2xvci4KICAgICAgICAgKi8KICAgICAgICBzZXRGb3JlZ3JvdW5kTGluZXNDb2xvcihjb2xvckJ5Q29sdW1uSW5kZXgsIG1pbkNvbG9yLCBtYXhDb2xvcikgewogICAgICAgICAgICBjb25zdCBsaW5lQ29sb3JGdW5jdGlvbiA9IHRoaXMuX2NyZWF0ZUxpbmVDb2xvckZ1bmN0aW9uKGNvbG9yQnlDb2x1bW5JbmRleCwgbWluQ29sb3IsIG1heENvbG9yKTsKICAgICAgICAgICAgdGhpcy5fZmdQYXRoc1NlbC5hdHRyKCdzdHJva2UnLCBsaW5lQ29sb3JGdW5jdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHNlc3Npb25Hcm91cHMsIGNvbG9yQnlDb2x1bW5JbmRleCwgbWluQ29sb3IgYW5kIG1heENvbG9yIGFuZAogICAgICAgICAqIHJlZHJhd3MgdGhlIGxpbmVzLgogICAgICAgICAqLwogICAgICAgIHJlZHJhdyhzZXNzaW9uR3JvdXBzLCBjb2xvckJ5Q29sdW1uSW5kZXgsIG1pbkNvbG9yLCBtYXhDb2xvcikgewogICAgICAgICAgICBjb25zdCBwZWFrZWRTRyA9IHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZS5zZXNzaW9uR3JvdXAoKTsKICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRTRyA9IHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlc3Npb25Hcm91cCgpOwogICAgICAgICAgICB0aGlzLl9zZXNzaW9uR3JvdXBzID0gc2Vzc2lvbkdyb3VwczsKICAgICAgICAgICAgdGhpcy5fZmdQYXRoc1NlbCA9IHRoaXMuX3JlY29tcHV0ZVBhdGhTZWxlY3Rpb24odGhpcy5fZmdQYXRoc1NlbCk7CiAgICAgICAgICAgIHRoaXMuX2JnUGF0aHNTZWwgPSB0aGlzLl9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKHRoaXMuX2JnUGF0aHNTZWwpOwogICAgICAgICAgICB0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUgPSB0aGlzLmdldFNlc3Npb25Hcm91cEhhbmRsZShwZWFrZWRTRyk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlID0gdGhpcy5nZXRTZXNzaW9uR3JvdXBIYW5kbGUoc2VsZWN0ZWRTRyk7CiAgICAgICAgICAgIHRoaXMucmVjb21wdXRlQ29udHJvbFBvaW50cyhMaW5lVHlwZS5GT1JFR1JPVU5EKTsKICAgICAgICAgICAgdGhpcy5yZWNvbXB1dGVDb250cm9sUG9pbnRzKExpbmVUeXBlLkJBQ0tHUk9VTkQpOwogICAgICAgICAgICB0aGlzLnJlY29tcHV0ZUZvcmVncm91bmRMaW5lc1Zpc2liaWxpdHkoKTsKICAgICAgICAgICAgdGhpcy5zZXRGb3JlZ3JvdW5kTGluZXNDb2xvcihjb2xvckJ5Q29sdW1uSW5kZXgsIG1pbkNvbG9yLCBtYXhDb2xvcik7CiAgICAgICAgfQogICAgICAgIHVwZGF0ZVBlYWtlZFNlc3Npb25Hcm91cChuZXdIYW5kbGUpIHsKICAgICAgICAgICAgdGhpcy5fcGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlLnNlbGVjdGlvbigpLmNsYXNzZWQoJ3BlYWtlZC1wYXRoJywgZmFsc2UpOwogICAgICAgICAgICB0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUgPSBuZXdIYW5kbGU7CiAgICAgICAgICAgIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cEhhbmRsZS5zZWxlY3Rpb24oKS5jbGFzc2VkKCdwZWFrZWQtcGF0aCcsIHRydWUpOwogICAgICAgIH0KICAgICAgICBjbGVhclBlYWtlZFNlc3Npb25Hcm91cCgpIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVQZWFrZWRTZXNzaW9uR3JvdXAobmV3IFNlc3Npb25Hcm91cEhhbmRsZSgpKTsKICAgICAgICB9CiAgICAgICAgdXBkYXRlU2VsZWN0ZWRTZXNzaW9uR3JvdXAobmV3SGFuZGxlKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlCiAgICAgICAgICAgICAgICAuc2VsZWN0aW9uKCkKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCdzZWxlY3RlZC1wYXRoJywgZmFsc2UpOwogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSA9IG5ld0hhbmRsZTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBIYW5kbGUuc2VsZWN0aW9uKCkuY2xhc3NlZCgnc2VsZWN0ZWQtcGF0aCcsIHRydWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGEgaGFuZGxlIHJlZmVyZW5jaW5nIHRoZSBjbG9zZXN0IHNlc3Npb24gZ3JvdXAgdG8gYSBnaXZlbiBwb2ludAogICAgICAgICAqIGluIHRoZSBTVkcgb3IgYSBudWxsIGhhbmRsZSBpZiB0aGUgY2xvc2VzdCBzZXNzaW9uIGdyb3VwIGlzCiAgICAgICAgICogdG9vIGZhciBhd2F5LgogICAgICAgICAqLwogICAgICAgIGZpbmRDbG9zZXN0U2Vzc2lvbkdyb3VwKHgsIHkpIHsKICAgICAgICAgICAgY29uc3QgYXhlc1Bvc2l0aW9ucyA9IHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKCh4UG9zaXRpb24sIGF4aXMpID0+IHhQb3NpdGlvbik7CiAgICAgICAgICAgIGNvbnN0IGNsb3Nlc3RGZ1BhdGggPSBmaW5kQ2xvc2VzdFBhdGgodGhpcy5fdmlzaWJsZUZnUGF0aHNTZWwubm9kZXMoKSwgYXhlc1Bvc2l0aW9ucywgW3gsIHldLCAKICAgICAgICAgICAgLyogdGhyZXNob2xkICovIDEwMCk7CiAgICAgICAgICAgIGlmIChjbG9zZXN0RmdQYXRoID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Hcm91cEhhbmRsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgU2Vzc2lvbkdyb3VwSGFuZGxlKHNlbGVjdChjbG9zZXN0RmdQYXRoKSk7CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVMaW5lQ29sb3JGdW5jdGlvbihjb2xvckJ5Q29sdW1uSW5kZXgsIG1pbkNvbG9yLCBtYXhDb2xvcikgewogICAgICAgICAgICBpZiAoY29sb3JCeUNvbHVtbkluZGV4ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiBVc2UgYSBkZWZhdWx0IGNvbG9yIGlmIG5vIGNvbG9yLWJ5IGNvbHVtbiBpcyBzZWxlY3RlZC4gKi8KICAgICAgICAgICAgICAgIHJldHVybiAoKSA9PiAncmVkJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBjb2xvclNjYWxlID0gbGluZWFyJDIoKQogICAgICAgICAgICAgICAgLmRvbWFpbihudW1lcmljQ29sdW1uRXh0ZW50KHRoaXMuX3NjaGVtYSwgdGhpcy5fc2Vzc2lvbkdyb3VwcywgY29sb3JCeUNvbHVtbkluZGV4KSkKICAgICAgICAgICAgICAgIC5yYW5nZShbbWluQ29sb3IsIG1heENvbG9yXSkKICAgICAgICAgICAgICAgIC5pbnRlcnBvbGF0ZShsYWIkMSk7CiAgICAgICAgICAgIHJldHVybiAoc2Vzc2lvbkdyb3VwKSA9PiBjb2xvclNjYWxlKGNvbHVtblZhbHVlQnlJbmRleCh0aGlzLl9zY2hlbWEsIHNlc3Npb25Hcm91cCwgY29sb3JCeUNvbHVtbkluZGV4KSk7CiAgICAgICAgfQogICAgICAgIF9yZWNvbXB1dGVQYXRoU2VsZWN0aW9uKGN1cnJlbnRQYXRoU2VsIC8qIGQzIHNlbGVjdGlvbiAqLykgewogICAgICAgICAgICBjdXJyZW50UGF0aFNlbCA9IGN1cnJlbnRQYXRoU2VsLmRhdGEodGhpcy5fc2Vzc2lvbkdyb3VwcywgCiAgICAgICAgICAgIC8qa2V5PSovIChzZXNzaW9uR3JvdXApID0+IHNlc3Npb25Hcm91cC5uYW1lKTsKICAgICAgICAgICAgY3VycmVudFBhdGhTZWwuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICByZXR1cm4gY3VycmVudFBhdGhTZWwuZW50ZXIoKS5hcHBlbmQoJ3BhdGgnKS5tZXJnZShjdXJyZW50UGF0aFNlbCk7CiAgICAgICAgfQogICAgICAgIC8qKiBTZXRzIHRoZSBjb250cm9sUG9pbnRzIHByb3BlcnR5IG9mICdwYXRoRWxlbWVudCcgdG8gdGhlIGNvbnRyb2wtcG9pbnRzCiAgICAgICAgICogYXJyYXkgb2YgdGhlIGdpdmVuIHNlc3Npb25Hcm91cCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YKICAgICAgICAgKiB0aGUgYXhlc0NvbGxlY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgX3NldENvbnRyb2xQb2ludHNQcm9wZXJ0eShwYXRoRWxlbWVudCwgc2Vzc2lvbkdyb3VwKSB7CiAgICAgICAgICAgIHBhdGhFbGVtZW50LmNvbnRyb2xQb2ludHMgPSB0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhzZXNzaW9uR3JvdXApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIGFuIGFycmF5IG9mIDItdHVwbGVzLS1lYWNoIHJlcHJlc2VudGluZyBhIGNvbnRyb2wgcG9pbnQgZm9yCiAgICAgICAgICogYSBsaW5lIHJlcHJlc2VudGluZyB0aGUgZ2l2ZW4gJ3Nlc3Npb25Hcm91cCcuIFRoZSBjb250cm9sIHBvaW50cyBhcmUKICAgICAgICAgKiBjb21wdXRlZCB3aXRoIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGF4ZXNDb2xsZWN0aW9uLgogICAgICAgICAqLwogICAgICAgIF9jb21wdXRlQ29udHJvbFBvaW50cyhzZXNzaW9uR3JvdXApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F4ZXNDb2xsZWN0aW9uLm1hcFZpc2libGVBeGVzKCh4UG9zaXRpb24sIGF4aXMpID0+IFsKICAgICAgICAgICAgICAgIHhQb3NpdGlvbiwKICAgICAgICAgICAgICAgIGF4aXMueVNjYWxlKCkoY29sdW1uVmFsdWVCeUluZGV4KHRoaXMuX3NjaGVtYSwgc2Vzc2lvbkdyb3VwLCBheGlzLmNvbEluZGV4KCkpKSwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgIF9wYXRoREF0dHJpYnV0ZShzZXNzaW9uR3JvdXApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2QzbGluZSh0aGlzLl9jb21wdXRlQ29udHJvbFBvaW50cyhzZXNzaW9uR3JvdXApKTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZVZpc2libGVGZ1BhdGhzU2VsKCkgewogICAgICAgICAgICB0aGlzLl92aXNpYmxlRmdQYXRoc1NlbCA9IHRoaXMuX2ZnUGF0aHNTZWwuZmlsdGVyKCc6bm90KC5pbnZpc2libGUtcGF0aCknKTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgJ0xpY2Vuc2UnKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAnQVMgSVMnIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFN0b3JlcyBzb21lIGdsb2JhbCBwcm9wZXJ0aWVzIHN1Y2ggYXMgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgU1ZHIGVsZW1lbnQKICAgICAqIHVzZWQgZm9yIHJlbmRlcmluZyB0aGUgcGFyYWxsZWwgY29vcmRpbmF0ZXMgcGxvdC4gQWxzbyBjb250YWlucyB0aGUgdG9wLWxldmVsCiAgICAgKiBET00gPGc+IGVsZW1lbnQgdW5kZXJ3aGljaCB0aGUgcGxvdCB3aWxsIGJlIHJlbmRlcmVkLgogICAgICovCiAgICBjbGFzcyBTVkdQcm9wZXJ0aWVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb21wdXRlcyB0aGUgd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgU1ZHIGVsZW1lbnQgYmFzZWQgb24gdGhlIG51bWJlciBvZgogICAgICAgICAqIGNvbHVtbnMgaW4gdGhlIHNjaGVtYS4gQWRkcyBzb21lIG1hcmdpbnMgYW5kIGFkZHMgYSB0b3AtbGV2ZWwgPGc+IGVsZW1lbnQKICAgICAgICAgKiB1bmRlcndoaWNoIHRoZSBwbG90IHNob3VsZCBiZSByZW5kZXJlZC4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdmcsIG51bUNvbHVtbnMpIHsKICAgICAgICAgICAgLy8gV2UgdXNlIHRoZSBmb2xsb3dpbmcgYWxnb3JpdGhtIGZvciBsYXlpbmcgb3V0IG91ciBTVkc6CiAgICAgICAgICAgIC8vIFdlIGNvbXB1dGUgYSBtaW5pbXVtIHNpemUgZm9yIHRoZSBTVkcgYmFzZWQgb24gdGhlIG51bWJlciBjb2x1bW5zCiAgICAgICAgICAgIC8vIGFuZCBzb21lIG1hcmdpbnMuIFdlIHNldCB0aGUgc3ZnICJ3aWR0aCIgYW5kICJoZWlnaHQiIHN0eWxlcwogICAgICAgICAgICAvLyB0byAiMTAwJSIgc28gdGhhdCBpdCB0YWtlcyB1cCB0aGUgZnVsbCBhcmVhIG9mIGl0cyBwYXJlbnQsIGJ1dCB1c2UKICAgICAgICAgICAgLy8gIm1pbi13aWR0aCIgYW5kICJtaW4taGVpZ2h0Iiwgc28gdGhhdCBpZiB0aGUgcGFyZW50IGlzIHRvbyBzbWFsbAogICAgICAgICAgICAvLyB0aGUgc3ZnIHdvbid0IHNocmluayBkb3duIChpdCB3aWxsIG92ZXJmbG93IHdpdGggc2Nyb2xsIGJhcnMpLgogICAgICAgICAgICAvLyBJZiB0aGUgcGFyZW50IGlzIGxhcmdlciB0aGFuIHRoZSBtaW5pbXVtIHNpemUsIHdlIHVzZSBpdHMKICAgICAgICAgICAgLy8gcHJlc2VydmVBc3BlY3RSYXRpbyBhdHRyIHRvIHNjYWxlIHRoZSBjb250ZW50cyB0byBmaXQgdGhlIGxhcmdlciBzaXplLgogICAgICAgICAgICB0aGlzLnN2ZyA9IHNlbGVjdChzdmcpOwogICAgICAgICAgICBjb25zdCBtYXJnaW4gPSB7IHRvcDogMzAsIHJpZ2h0OiAxMCwgYm90dG9tOiAxMCwgbGVmdDogMTAgfTsKICAgICAgICAgICAgY29uc3QgQ09MX1dJRFRIID0gMTAwOwogICAgICAgICAgICBjb25zdCBDT0xfSEVJR0hUID0gMjAwOwogICAgICAgICAgICBjb25zdCB0b3RhbFdpZHRoID0gbnVtQ29sdW1ucyAqIENPTF9XSURUSCArIG1hcmdpbi5sZWZ0ICsgbWFyZ2luLnJpZ2h0OwogICAgICAgICAgICBjb25zdCB0b3RhbEhlaWdodCA9IENPTF9IRUlHSFQgKyBtYXJnaW4udG9wICsgbWFyZ2luLmJvdHRvbTsKICAgICAgICAgICAgdGhpcy5zdmcuYXR0cigndmlld0JveCcsIGAwIDAgJHt0b3RhbFdpZHRofSAke3RvdGFsSGVpZ2h0fWApOwogICAgICAgICAgICB0aGlzLnN2Zy5hdHRyKCdwcmVzZXJ2ZUFzcGVjdFJhdGlvJywgJ3hNaWRZTWlkJyk7CiAgICAgICAgICAgIC8vIFNldCBhIG1pbmltdW0gd2lkdGggc28gc2NhbGUgZmFjdG9yIHdhbnQgYmUgbGVzcyB0aGFuIDEKICAgICAgICAgICAgLy8gKGJ1dCBpZiBzaXplIG9mICcjY29udGFpbmVyJyBpcyBsYXJnZXIgdGhlbiB3ZSdsbCBzY2FsZSB1cAogICAgICAgICAgICAvLyBvdXIgc3ZnKS4KICAgICAgICAgICAgdGhpcy5zdmcuc3R5bGUoJ21pbi13aWR0aCcsIHRvdGFsV2lkdGggKyAncHgnKTsKICAgICAgICAgICAgdGhpcy5zdmcuc3R5bGUoJ21pbi1oZWlnaHQnLCB0b3RhbEhlaWdodCArICdweCcpOwogICAgICAgICAgICAvLyAnd2lkdGgnIGFuZCAnaGVpZ2h0JyBzdG9yZSB0aGUgd2lkdGggb2YgdGhlIHN2ZyB3aXRob3V0IG91ciBtYXJnaW5zLgogICAgICAgICAgICB0aGlzLndpZHRoID0gdG90YWxXaWR0aCAtIG1hcmdpbi5sZWZ0IC0gbWFyZ2luLnJpZ2h0OwogICAgICAgICAgICB0aGlzLmhlaWdodCA9IHRvdGFsSGVpZ2h0IC0gbWFyZ2luLnRvcCAtIG1hcmdpbi5ib3R0b207CiAgICAgICAgICAgIHRoaXMuc3ZnRyA9IHRoaXMuc3ZnCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB0cmFuc2xhdGVTdHIobWFyZ2luLmxlZnQsIG1hcmdpbi50b3ApKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIE9yY2hhc3RyYXRlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHBsb3QuIFRoaXMgaXMgdGhlCiAgICAgKiBjbGFzcyB0aGF0IGNvbnN1bWVycyBvZiB0aGlzIG1vZHVsZSBzaG91bGQgdXNlLgogICAgICogVXNhZ2UgZXhhbXBsZToKICAgICAqICAgIG1hbmFnZXIgPSBuZXcgSW50ZXJhY3Rpb25NYW5hZ2VyKHN2Z1Byb3BzLCBzY2hlbWEsIHBlYWtlZFNlc3Npb25DaGFuZ2VkQ0IsCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFNlc3Npb25DaGFuZ2VkQ0IpOwogICAgICogICAgLi4uCiAgICAgKiAgICAvLyBOb3RpZnkgbWFuYWdlciBvZiBuZXcgb3B0aW9ucyBvciBzZXNzaW9uIGdyb3VwczoKICAgICAqICAgIG1hbmFnZXIub25PcHRpb25zT3JTZXNzaW9uR3JvdXBzQ2hhbmdlZChuZXdPcHRpb25zLCBuZXdTZXNzaW9uR3JvdXBzKQogICAgICogICAgLi4uCiAgICAgKiAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIHdoZW4gcGVha2VkIHNlc3Npb24gY2hhbmdlZDoKICAgICAqICAgIGZ1bmN0aW9uIHBlYWtlZFNlc3Npb25DaGFuZ2VkQ0IobmV3U2Vzc2lvbkdyb3VwKSB7CiAgICAgKiAgICAgIC8vIERvIHNvbWV0aGluZyB3aXRoIHRoZSBuZXdTZXNzaW9uR3JvdXAuCiAgICAgKiAgICB9CiAgICAgKi8KICAgIGNsYXNzIEludGVyYWN0aW9uTWFuYWdlciB7CiAgICAgICAgY29uc3RydWN0b3Ioc3ZnUHJvcHMsIHNjaGVtYSwgcGVha2VkU2Vzc2lvbkdyb3VwQ2hhbmdlZENhbGxiYWNrLCBzZWxlY3RlZFNlc3Npb25DaGFuZ2VkQ2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fc3ZnUHJvcHMgPSBzdmdQcm9wczsKICAgICAgICAgICAgdGhpcy5fc2NoZW1hID0gc2NoZW1hOwogICAgICAgICAgICB0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IgPSBwZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ2FsbGJhY2s7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZENCID0gc2VsZWN0ZWRTZXNzaW9uQ2hhbmdlZENhbGxiYWNrOwogICAgICAgICAgICB0aGlzLl9heGVzQ29sbGVjdGlvbiA9IG5ldyBBeGVzQ29sbGVjdGlvbihzdmdQcm9wcywgc2NoZW1hLCAKICAgICAgICAgICAgLyppbnRlcmFjdGlvbk1hbmFnZXI9Ki8gdGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2xpbmVzQ29sbGVjdGlvbiA9IG5ldyBMaW5lc0NvbGxlY3Rpb24oc3ZnUHJvcHMsIHNjaGVtYSwgdGhpcy5fYXhlc0NvbGxlY3Rpb24pOwogICAgICAgICAgICB0aGlzLl9zdmdQcm9wcy5zdmcKICAgICAgICAgICAgICAgIC5vbignY2xpY2snLCAoKSA9PiB0aGlzLm9uQ2xpY2soKSkKICAgICAgICAgICAgICAgIC5vbignbW91c2Vtb3ZlIG1vdXNlZW50ZXInLCAoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBbeCwgeV0gPSBtb3VzZSh0aGlzLl9zdmdQcm9wcy5zdmdHLm5vZGUoKSk7CiAgICAgICAgICAgICAgICB0aGlzLm9uTW91c2VNb3ZlZCh4LCB5KTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5vbignbW91c2VsZWF2ZScsICgpID0+IHRoaXMub25Nb3VzZUxlYXZlKCkpOwogICAgICAgIH0KICAgICAgICBvbkRyYWdTdGFydChjb2xJbmRleCkgewogICAgICAgICAgICB0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnU3RhcnQoY29sSW5kZXgpOwogICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24uaGlkZUJhY2tncm91bmRMaW5lcygpOwogICAgICAgIH0KICAgICAgICBvbkRyYWcobmV3WCkgewogICAgICAgICAgICB0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnKG5ld1gpOwogICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlQ29udHJvbFBvaW50cyhMaW5lVHlwZS5GT1JFR1JPVU5EKTsKICAgICAgICB9CiAgICAgICAgb25EcmFnRW5kKCkgewogICAgICAgICAgICB0aGlzLl9heGVzQ29sbGVjdGlvbi5kcmFnRW5kKC8qdHJhbnNpdGlvbkR1cmF0aW9uPSovIDUwMCk7CiAgICAgICAgICAgIHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5yZWNvbXB1dGVDb250cm9sUG9pbnRzKExpbmVUeXBlLkZPUkVHUk9VTkQsIAogICAgICAgICAgICAvKiB0cmFuc2l0aW9uRHVyYXRpb249Ki8gNTAwKTsKICAgICAgICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbGluZXNDb2xsZWN0aW9uLnJlY29tcHV0ZUNvbnRyb2xQb2ludHMoTGluZVR5cGUuQkFDS0dST1VORCk7CiAgICAgICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24uc2hvd0JhY2tncm91bmRMaW5lcygpOwogICAgICAgICAgICB9LCA1MDApOwogICAgICAgIH0KICAgICAgICBvbkJydXNoQ2hhbmdlZChjb2xJbmRleCwgbmV3QnJ1c2hTZWxlY3Rpb24pIHsKICAgICAgICAgICAgdGhpcy5fYXhlc0NvbGxlY3Rpb24KICAgICAgICAgICAgICAgIC5nZXRBeGlzRm9yQ29sSW5kZXgoY29sSW5kZXgpCiAgICAgICAgICAgICAgICAuc2V0QnJ1c2hTZWxlY3Rpb24obmV3QnJ1c2hTZWxlY3Rpb24pOwogICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVjb21wdXRlRm9yZWdyb3VuZExpbmVzVmlzaWJpbGl0eSgpOwogICAgICAgIH0KICAgICAgICBvbk1vdXNlTW92ZWQobmV3WCwgbmV3WSkgewogICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24udXBkYXRlUGVha2VkU2Vzc2lvbkdyb3VwKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5maW5kQ2xvc2VzdFNlc3Npb25Hcm91cChuZXdYLCBuZXdZKSk7CiAgICAgICAgICAgIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQih0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpOwogICAgICAgIH0KICAgICAgICBvbk1vdXNlTGVhdmUoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLmlzTnVsbCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24uY2xlYXJQZWFrZWRTZXNzaW9uR3JvdXAoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3BlYWtlZFNlc3Npb25Hcm91cENoYW5nZWRDQihudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvbkNsaWNrKCkgewogICAgICAgICAgICBpZiAodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpID09PQogICAgICAgICAgICAgICAgdGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpIHsKICAgICAgICAgICAgICAgIC8qIElmIHRoZSBzZWxlY3RlZCBzZXNzaW9uIGdyb3VwIGlzIHRoZSBzYW1lIGFzIHRoZSAicGVha2VkIiBvbmUsCiAgICAgICAgICAgICAgICAgICAgICAgY2xlYXIgdGhlIHNlbGVjdGlvbi4gKi8KICAgICAgICAgICAgICAgIHRoaXMuX2xpbmVzQ29sbGVjdGlvbi51cGRhdGVTZWxlY3RlZFNlc3Npb25Hcm91cChuZXcgU2Vzc2lvbkdyb3VwSGFuZGxlKCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fbGluZXNDb2xsZWN0aW9uLnVwZGF0ZVNlbGVjdGVkU2Vzc2lvbkdyb3VwKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5wZWFrZWRTZXNzaW9uR3JvdXBIYW5kbGUoKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpOwogICAgICAgIH0KICAgICAgICBvbk9wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKG5ld09wdGlvbnMsIG5ld1Nlc3Npb25Hcm91cHMpIHsKICAgICAgICAgICAgdGhpcy5fYXhlc0NvbGxlY3Rpb24udXBkYXRlQXhlcyhuZXdPcHRpb25zLCBuZXdTZXNzaW9uR3JvdXBzKTsKICAgICAgICAgICAgY29uc3Qgb2xkUGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlID0gdGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpOwogICAgICAgICAgICBjb25zdCBvbGRTZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSA9IHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpOwogICAgICAgICAgICB0aGlzLl9saW5lc0NvbGxlY3Rpb24ucmVkcmF3KG5ld1Nlc3Npb25Hcm91cHMsIG5ld09wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4ICE9PSB1bmRlZmluZWQKICAgICAgICAgICAgICAgID8gbmV3T3B0aW9ucy5jb2x1bW5zW25ld09wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4XS5hYnNvbHV0ZUluZGV4CiAgICAgICAgICAgICAgICA6IG51bGwsIG5ld09wdGlvbnMubWluQ29sb3IsIG5ld09wdGlvbnMubWF4Q29sb3IpOwogICAgICAgICAgICAvLyBBIHJlZHJhdyBtYXkgY2hhbmdlIHRoZSBzZWxlY3RlZCAvIHBlYWtlZCBzZXNzaW9uIGdyb3VwLiBTbyBjYWxsIHRoZQogICAgICAgICAgICAvLyBhcHByb3ByaWF0ZSBjYWxsYmFja3MgaWYgbmVlZGVkLgogICAgICAgICAgICBpZiAoIW9sZFBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZS5lcXVhbHNUbyh0aGlzLl9saW5lc0NvbGxlY3Rpb24ucGVha2VkU2Vzc2lvbkdyb3VwSGFuZGxlKCkpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wZWFrZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnBlYWtlZFNlc3Npb25Hcm91cEhhbmRsZSgpLnNlc3Npb25Hcm91cCgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIW9sZFNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlLmVxdWFsc1RvKHRoaXMuX2xpbmVzQ29sbGVjdGlvbi5zZWxlY3RlZFNlc3Npb25Hcm91cEhhbmRsZSgpKSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkQ0IodGhpcy5fbGluZXNDb2xsZWN0aW9uLnNlbGVjdGVkU2Vzc2lvbkdyb3VwSGFuZGxlKCkuc2Vzc2lvbkdyb3VwKCkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHNjaGVtYSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NjaGVtYTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNQbG90ID0gY2xhc3MgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNQbG90IGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8vIFRoZSBsYXN0IHNlc3Npb24gZ3JvdXAgdGhhdCB3YXMgY2xpY2tlZCBvbiBvciBudWxsIGlmIG5vCiAgICAgICAgICAgIC8vIHNlc3Npb24gZ3JvdXAgd2FzIGNsaWNrZWQgb24geWV0LgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwID0gbnVsbDsKICAgICAgICAgICAgLy8gVGhlIHNlc3Npb24gZ3JvdXAgcmVwcmVzZW50ZWQgYnkgdGhlIGN1cnZlICJjbG9zZXN0IiB0byB0aGUgbW91c2UKICAgICAgICAgICAgLy8gcG9pbnRlciAodGhlIGNvcnJlc3BvbmRpbmcgcGF0aCBlbGVtZW50IHdpbGwgaGF2ZSB0aGUgJ3BlYWtlZC1wYXRoJwogICAgICAgICAgICAvLyBjbGFzcykuIElmIHRoZSBjbG9zZXN0IHNlc3Npb24gZ3JvdXAgZGlzdGFuY2UgaXMgbGFyZ2VyIHRoYW4gYQogICAgICAgICAgICAvLyB0aHJlc2hvbGQsIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBudWxsLgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHR5cGUgez9PYmplY3R9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXAgPSBudWxsOwogICAgICAgICAgICAvLyBDb3VudHMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZWxlbWVudCBoYXMgYmVlbiByZWRyYXduIHNpbmNlIGl0CiAgICAgICAgICAgIC8vIHdhcyBjcmVhdGVkLiBUaGlzIGlzIGluY3JlbWVudGVkIGF0IHRoZSBlbmQgb2YgYSByZWRyYXcgYW5kIGFsbG93cwogICAgICAgICAgICAvLyBpbnRlZ3JhdGlvbiB0ZXN0cyB0byB3YWl0IGZvciB0aGUgZWxlbWVudCB0byBmaW5pc2ggcmVkcmF3aW5nLgogICAgICAgICAgICB0aGlzLnJlZHJhd0NvdW50ID0gMDsKICAgICAgICB9CiAgICAgICAgX29wdGlvbnNPclNlc3Npb25Hcm91cHNDaGFuZ2VkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGNvbmZpZ3VyYXRpb24gPSB0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbjsKICAgICAgICAgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gcmVkcmF3IGZyb20gc2NyYXRjaC4gV2UgcmVkcmF3IGZyb20gc2NyYXRjaCBpZgogICAgICAgICAgICAvLyB0aGlzIGlzIGluaXRpYWxpemF0aW9uIG9yIGlmIGNvbmZpZ3VyYXRpb24uc2NoZW1hIGhhcyBjaGFuZ2VkLgogICAgICAgICAgICBpZiAodGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgICAgICFsb2Rhc2guaXNFcXVhbCh0aGlzLl9pbnRlcmFjdGlvbk1hbmFnZXIuc2NoZW1hKCksIGNvbmZpZ3VyYXRpb24uc2NoZW1hKSkgewogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBwcmUtZXhpc3RpbmcgRE9NIGNoaWxkcmVuIG9mIG91ciBTVkcuCiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcy4kLnN2ZykKICAgICAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcqJykKICAgICAgICAgICAgICAgICAgICAucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICBjb25zdCBzdmdQcm9wcyA9IG5ldyBTVkdQcm9wZXJ0aWVzKHRoaXMuJC5zdmcsIG51bUNvbHVtbnMoY29uZmlndXJhdGlvbi5zY2hlbWEpKTsKICAgICAgICAgICAgICAgIC8vIExpc3RlbiB0byBET00gY2hhbmdlcyB1bmRlcm5lYXRoIHRoaXMuJC5zdmcsIGFuZCBhcHBseSBsb2NhbCBDU1MKICAgICAgICAgICAgICAgIC8vIHNjb3BpbmcgcnVsZXMgc28gdGhhdCBvdXIgcnVsZXMgaW4gdGhlIDxzdHlsZT4gc2VjdGlvbiBhYm92ZQogICAgICAgICAgICAgICAgLy8gd291bGQgYXBwbHkuCiAgICAgICAgICAgICAgICB0aGlzLnNjb3BlU3VidHJlZSh0aGlzLiQuc3ZnLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyYWN0aW9uTWFuYWdlciA9IG5ldyBJbnRlcmFjdGlvbk1hbmFnZXIoc3ZnUHJvcHMsIGNvbmZpZ3VyYXRpb24uc2NoZW1hLCAoc2Vzc2lvbkdyb3VwKSA9PiB0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cCksIChzZXNzaW9uR3JvdXApID0+IHRoaXMuc2VsZWN0ZWRTZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVWYWxpZFNlc3Npb25Hcm91cHMoKTsKICAgICAgICAgICAgdGhpcy5faW50ZXJhY3Rpb25NYW5hZ2VyLm9uT3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQodGhpcy5vcHRpb25zLCB0aGlzLl92YWxpZFNlc3Npb25Hcm91cHMpOwogICAgICAgICAgICB0aGlzLnJlZHJhd0NvdW50Kys7CiAgICAgICAgfQogICAgICAgIGNsb3Nlc3RTZXNzaW9uR3JvdXBDaGFuZ2VkKHNlc3Npb25Hcm91cCkgewogICAgICAgICAgICB0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXAgPSBzZXNzaW9uR3JvdXA7CiAgICAgICAgfQogICAgICAgIHNlbGVjdGVkU2Vzc2lvbkdyb3VwQ2hhbmdlZChzZXNzaW9uR3JvdXApIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCA9IHNlc3Npb25Hcm91cDsKICAgICAgICB9CiAgICAgICAgLy8gY29tcHV0ZXMgdmFsaWRTZXNzaW9uR3JvdXBzOiBGaWx0ZXJzIG91dCB0aGUgc2Vzc2lvbiBncm91cHMgaW4gdGhlCiAgICAgICAgLy8gc2Vzc2lvbkdyb3VwcyB0aGF0IGhhdmUgb25lIG9yIG1vcmUgb2YgdGhlaXIgY29sdW1uIHZhbHVlcyB1bmRlZmluZWQuCiAgICAgICAgLy8gSWYgc2Vzc2lvbkdyb3VwcyBpcyB1bmRlZmluZWQgc2V0cyB2YWxpZFNlc3Npb25Hcm91cHMgdG8gYmUKICAgICAgICAvLyB1bmRlZmluZWQgYXMgd2VsbC4gKFRoaXMgY2FuIGhhcHBlbiBkdXJpbmcgdGVzdGluZyB3aGVuIHdlIGRvbid0IHNldAogICAgICAgIC8vIHRoZSBzZXNzaW9uR3JvdXBzIHByb3BlcnR5KS4KICAgICAgICBfY29tcHV0ZVZhbGlkU2Vzc2lvbkdyb3VwcygpIHsKICAgICAgICAgICAgY29uc3QgdXRpbHMgPSB0Zl9ocGFyYW1zX3V0aWxzOwogICAgICAgICAgICBpZiAodGhpcy5zZXNzaW9uR3JvdXBzID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3VwcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzY2hlbWEgPSB0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5zY2hlbWE7CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkU2Vzc2lvbkdyb3VwcyA9IHRoaXMuc2Vzc2lvbkdyb3Vwcy5maWx0ZXIoKHNnKSA9PiB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBjb2xJbmRleCA9IDA7IGNvbEluZGV4IDwgdXRpbHMubnVtQ29sdW1ucyhzY2hlbWEpOyArK2NvbEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMuY29uZmlndXJhdGlvbi5jb2x1bW5zVmlzaWJpbGl0eVtjb2xJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh1dGlscy5jb2x1bW5WYWx1ZUJ5SW5kZXgoc2NoZW1hLCBzZywgY29sSW5kZXgpID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9OwogICAgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNQbG90LnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgfQogICAgICBzdmcgewogICAgICAgIGZvbnQ6IDEwcHggc2Fucy1zZXJpZjsKICAgICAgfQoKICAgICAgLmJhY2tncm91bmQgcGF0aCB7CiAgICAgICAgZmlsbDogbm9uZTsKICAgICAgICBzdHJva2U6ICNkZGQ7CiAgICAgICAgc2hhcGUtcmVuZGVyaW5nOiBjcmlzcEVkZ2VzOwogICAgICB9CgogICAgICAuZm9yZWdyb3VuZCBwYXRoIHsKICAgICAgICBmaWxsOiBub25lOwogICAgICAgIHN0cm9rZS1vcGFjaXR5OiAwLjc7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAxOwogICAgICB9CgogICAgICAvKiBXaWxsIGJlIHNldCBvbiBmb3JlZ3JvdW5kIHBhdGhzIHRoYXQgYXJlIG5vdCAiY29udGFpbmVkIiBpbiB0aGUgY3VycmVudAogICAgICAgICBheGVzIGJydXNoZXMuIElmIG5vIGJydXNoZXMgYXJlIHNldCwgbm8gcGF0aCB3aWxsIGhhdmUgdGhpcyBjbGFzcy4gKi8KICAgICAgLmZvcmVncm91bmQgLmludmlzaWJsZS1wYXRoIHsKICAgICAgICBkaXNwbGF5OiBub25lOwogICAgICB9CgogICAgICAvKiBTdHlsZSBmb3IgdGhlIHBhdGggY2xvc2VzdCB0byB0aGUgbW91c2UgcG9pbnRlciAodHlwaWNhbGx5IHdpbGwgYmVjb21lCiAgICAgIHRoZSBzZWxlY3RlZCBwYXRoIHdoZW4gdGhlIHVzZXIgY2xpY2tzKS4gKi8KICAgICAgLmZvcmVncm91bmQgLnBlYWtlZC1wYXRoIHsKICAgICAgICBzdHJva2Utd2lkdGg6IDM7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcGF0aCBjbGFzcy4gV2UgdXNlICFpbXBvcnRhbnQgdG8gb3ZlcnJpZGUgdGhlCiAgICAgICAgIGlubGluZSBzdHlsZSB0aGF0IHNldHMgdGhlIHJlZ3VsYXIgY29sb3Igb2YgYSBwYXRoLiAqLwogICAgICAuZm9yZWdyb3VuZCAuc2VsZWN0ZWQtcGF0aCB7CiAgICAgICAgc3Ryb2tlLXdpZHRoOiAzICFpbXBvcnRhbnQ7CiAgICAgICAgc3Ryb2tlOiAjMGYwICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgICNjb250YWluZXIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgc3ZnIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5heGlzIHRleHQgewogICAgICAgIHRleHQtc2hhZG93OiAwIDFweCAwICNmZmYsIDFweCAwIDAgI2ZmZiwgMCAtMXB4IDAgI2ZmZiwgLTFweCAwIDAgI2ZmZjsKICAgICAgICBmaWxsOiAjMDAwOwogICAgICAgIGN1cnNvcjogbW92ZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNQbG90LnByb3RvdHlwZSwgInNlc3Npb25Hcm91cHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1Bsb3QucHJvdG90eXBlLCAib3B0aW9ucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNQbG90LnByb3RvdHlwZSwgInNlbGVjdGVkU2Vzc2lvbkdyb3VwIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1Bsb3QucHJvdG90eXBlLCAiY2xvc2VzdFNlc3Npb25Hcm91cCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmSHBhcmFtc1BhcmFsbGVsQ29vcmRzUGxvdC5wcm90b3R5cGUsICJyZWRyYXdDb3VudCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1Bsb3QucHJvdG90eXBlLCAiX3ZhbGlkU2Vzc2lvbkdyb3VwcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1BhcmFsbGVsQ29vcmRzUGxvdC5wcm90b3R5cGUsICJfaW50ZXJhY3Rpb25NYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ29wdGlvbnMuKicsICdzZXNzaW9uR3JvdXBzLionKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmSHBhcmFtc1BhcmFsbGVsQ29vcmRzUGxvdC5wcm90b3R5cGUsICJfb3B0aW9uc09yU2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLCBudWxsKTsKICAgIFRmSHBhcmFtc1BhcmFsbGVsQ29vcmRzUGxvdCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3QnKQogICAgXSwgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNQbG90KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogVGhlcmUgYXJlIDMgZWxlbWVudHMgaW52b2x2ZWQgaW4gdGhlIHBhcmFsbGVsIGNvb3JkaW5hdGVzIHZpc3VhbGl6YXRpb246CiAgICAgKgogICAgICogMS4gPHRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgKiAgIFJlbmRlcnMgdGhlIGFjdHVhbCBwYXJhbGxlbCBjb29yZGluYXRlIHBsb3QuIFNlZSB0aGUgY29tbWVudHMgaW4gdGhlCiAgICAgKiAgIGNvZGUgZm9yIHRoYXQgZWxlbWVudCBmb3IgbW9yZSBkZXRhaWxzLgogICAgICogMi4gPHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzPgogICAgICogICBBIGNvbnRyb2wgcGFuZWwgZm9yIGNvbmZpZ3VyaW5nIHRoZSBiZWhhdmlvciBvZiB0aGUgcGxvdCAoZS5nLiBzY2FsZQogICAgICogICBvZiBlYWNoIGF4aXMsIGNvbG9ybWFwLCBldGMuKQogICAgICogMy4gPHRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXc+CiAgICAgKiAgIFRoZSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIGFib3ZlIDIgZWxlbWVudHMuCiAgICAgKi8KICAgIGxldCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1ZpZXcgPSBjbGFzcyBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1ZpZXcgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgX2Nsb3Nlc3RPclNlbGVjdGVkKGNsb3Nlc3RTZXNzaW9uR3JvdXAsIHNlbGVjdGVkU2Vzc2lvbkdyb3VwKSB7CiAgICAgICAgICAgIGlmIChjbG9zZXN0U2Vzc2lvbkdyb3VwICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2xvc2VzdFNlc3Npb25Hcm91cDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTZXNzaW9uR3JvdXA7CiAgICAgICAgfQogICAgfTsKICAgIFRmSHBhcmFtc1BhcmFsbGVsQ29vcmRzVmlldy50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPCEtLSBDb250cm9scyBiZWhhdmlvciBvZiBwYXJhbGxlbCBjb29yZGluYXRlcyBwbG90CiAgICAgICAgIG91dHB1dHMgc2V0IG9wdGlvbnMgdG8gdGhlIF9vcHRpb25zIHByb3BlcnR5LgogICAgICAtLT4KICAgIDxocGFyYW1zLXNwbGl0LWxheW91dCBvcmllbnRhdGlvbj0idmVydGljYWwiPgogICAgICA8IS0tIFRoZSBzY2FsZSBhbmQgY29sb3IgY29udHJvbHMuIC0tPgogICAgICA8dGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMKICAgICAgICBpZD0iY29udHJvbHMiCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgb3B0aW9ucz0ie3tfb3B0aW9uc319IgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgIDwhLS0gVGhlIGFjdHVhbCBwYXJhbGxlbCBjb29yZGluYXRlcyBwbG90IC0tPgogICAgICA8dGYtaHBhcmFtcy1wYXJhbGxlbC1jb29yZHMtcGxvdAogICAgICAgIGlkPSJwbG90IgogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgIHNlbGVjdGVkLXNlc3Npb24tZ3JvdXA9Int7X3NlbGVjdGVkR3JvdXB9fSIKICAgICAgICBjbG9zZXN0LXNlc3Npb24tZ3JvdXA9Int7X2Nsb3Nlc3RHcm91cH19IgogICAgICAgIG9wdGlvbnM9IltbX29wdGlvbnNdXSIKICAgICAgPgogICAgICA8L3RmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXBsb3Q+CiAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtdmFsdWVzCiAgICAgICAgaWQ9InZhbHVlcyIKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXA9IltbX2Nsb3Nlc3RPclNlbGVjdGVkKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbG9zZXN0R3JvdXAsIF9zZWxlY3RlZEdyb3VwKV1dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC1kZXRhaWxzCiAgICAgICAgaWQ9ImRldGFpbHMiCiAgICAgICAgc2xvdD0iY29udGVudCIKICAgICAgICBjbGFzcz0ic2VjdGlvbiIKICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICBzZXNzaW9uLWdyb3VwPSJbW19zZWxlY3RlZEdyb3VwXV0iCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscz4KICAgIDwvaHBhcmFtcy1zcGxpdC1sYXlvdXQ+CgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBoZWlnaHQ6IDExNXB4OwogICAgICB9CiAgICAgICNkZXRhaWxzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zUGFyYWxsZWxDb29yZHNWaWV3LnByb3RvdHlwZSwgImJhY2tlbmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1ZpZXcucHJvdG90eXBlLCAiZXhwZXJpbWVudE5hbWUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1ZpZXcucHJvdG90eXBlLCAiY29uZmlndXJhdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1ZpZXcucHJvdG90eXBlLCAic2Vzc2lvbkdyb3VwcyIsIHZvaWQgMCk7CiAgICBUZkhwYXJhbXNQYXJhbGxlbENvb3Jkc1ZpZXcgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3JykKICAgIF0sIFRmSHBhcmFtc1BhcmFsbGVsQ29vcmRzVmlldyk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEEgZDMtYmFzZWQgc2NhdHRlciBwbG90IG1hdHJpeCB2aXN1YWxpemF0aW9uIGNvbXBvbmVudC4KICAgICAqIFRoaXMgY29tcG9uZW50IHJlbmRlcnMgdGhlIGFjdHVhbCBwbG90czsgdGhlICJjb250cm9scyIgcGFydCBvZiB0aGUKICAgICAqIHZpc3VhbGl6YXRpb24gYXJlIHJlbmRlcmVkIGJ5IHRmLWhwYXJhbXMtc2NhbGUtYW5kLWNvbG9yLWNvbnRyb2xzLgogICAgICoKICAgICAqIFRPRE8oZXJleik6IFRoZSBsb2dpYyBmb3IgY29tcHV0aW5nIHRoZSBudW1iZXIgb2YgdGlja3Mgc28gdGhhdCB0aWNrIGxhYmVscwogICAgICogZG8gbm90IG92ZXJsYXAgaXMgaWdub3JlZCwgZm9yIHNvbWUgcmVhc29uLCB3aGVuIHdlIHNldCBjb21waWxlPVRydWUgaW4KICAgICAqIHRoZSB2dWxjYW5pemF0aW9uIGJ1aWxkIHN0ZXAuIEZpZ3VyZSBvdXQgd2h5LgogICAgICovCiAgICBsZXQgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90ID0gY2xhc3MgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90IGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8vIFRoZSBsYXN0IHNlc3Npb24gZ3JvdXAgdGhhdCB3YXMgY2xpY2tlZCBvbiBvciBudWxsIGlmIG5vCiAgICAgICAgICAgIC8vIHNlc3Npb24gZ3JvdXAgd2FzIGNsaWNrZWQgb24geWV0LgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwID0gbnVsbDsKICAgICAgICAgICAgLy8gVGhlIHNlc3Npb24gZ3JvdXAgcmVwcmVzZW50ZWQgYnkgdGhlIG1hcmtlciAiY2xvc2VzdCIgdG8gdGhlIG1vdXNlCiAgICAgICAgICAgIC8vIHBvaW50ZXIuIElmIHRoZSBjbG9zZXN0IHNlc3Npb24gZ3JvdXAgZGlzdGFuY2UgaXMgbGFyZ2VyIHRoYW4gYQogICAgICAgICAgICAvLyB0aHJlc2hvbGQsIHRoaXMgcHJvcGVydHkgd2lsbCBiZSBudWxsLgogICAgICAgICAgICB0aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXAgPSBudWxsOwogICAgICAgICAgICAvLyBUaGUgPGRpdj4gZWxlbWVudCB3aXRoIGlkICJjb250YWluZXIiLgogICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSBudWxsOwogICAgICAgICAgICAvLyBBIEQzIHNlbGVjdGlvbiBjb250YWluaW5nIGp1c3QgdGhlIHJvb3QgPHN2Zz4gZWxlbWVudC4KICAgICAgICAgICAgdGhpcy5fc3ZnID0gbnVsbDsKICAgICAgICAgICAgdGhpcy53aWR0aCA9IDA7CiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gMDsKICAgICAgICAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBjZWxsIGNvbnRhaW5pbmcgYSBicnVzaCBzZWxlY3Rpb24gYXMgYW4gYXJyYXkKICAgICAgICAgICAgLy8gb2YgdGhlIGZvcm0gW2NvbCwgbWV0cmljXSBvciBudWxsIGlmIG5vIGNlbGwgaGFzIGFuIGFjdGl2ZSBicnVzaAogICAgICAgICAgICAvLyBzZWxlY3Rpb24uCiAgICAgICAgICAgIHRoaXMuX2JydXNoZWRDZWxsSW5kZXggPSBudWxsOwogICAgICAgICAgICAvLyBUaGUgdGhlIGFjdGl2ZSBicnVzaCBzZWxlY3Rpb24gaW4gdGhlIGZvcm0KICAgICAgICAgICAgLy8gW1t4MCx5MF0sW3gxLHkxXV0gd2hlcmUgdGhlIGNvb3JkaW5hdGVzIGFyZSByZWxhdGl2ZSB0byB0aGUgY2VsbAogICAgICAgICAgICAvLyBpbmRleGVkIGJ5IF9icnVzaGVkQ2VsbEluZGV4LiBTZXQgdG8gbnVsbCwgaWYgdGhlcmUgaXMgbm8gYWN0aXZlCiAgICAgICAgICAgIC8vIGJydXNoLgogICAgICAgICAgICB0aGlzLl9icnVzaFNlbGVjdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgICB0aGlzLl9jb250YWluZXIgPSB0aGlzLiRbJ2NvbnRhaW5lciddOwogICAgICAgICAgICB0aGlzLl9zdmcgPSBzZWxlY3QodGhpcy4kWydzdmcnXSk7CiAgICAgICAgICAgIHRoaXMuX3JlZHJhdygpOwogICAgICAgIH0KICAgICAgICBfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBUcnkgdG8ga2VlcCB0aGUgc2VsZWN0ZWQgc2Vzc2lvbiBncm91cDogaWYgdGhlIG5ldyBzZXNzaW9uR3JvdXBzCiAgICAgICAgICAgICAgICAvLyBhcnJheSBoYXMgYSBzZXNzaW9uR3JvdXAgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvbmUgdGhhdCB3YXMKICAgICAgICAgICAgICAgIC8vIHNlbGVjdGVkIGJlZm9yZSwgc2VsZWN0IGl0LgogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCA9CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkdyb3VwV2l0aE5hbWUodGhpcy5zZXNzaW9uR3JvdXBzLCB0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwLm5hbWUpIHx8IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIF92aXNpYmxlU2NoZW1hQ2hhbmdlZCgpIHsKICAgICAgICAgICAgdGhpcy5fYnJ1c2hlZENlbGxJbmRleCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2JydXNoU2VsZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIC8vIFJlZHJhd3MgdGhlIHBsb3QuCiAgICAgICAgX3JlZHJhdygpIHsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZSgnX3JlZHJhdycsICgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHV0aWxzID0gdGZfaHBhcmFtc191dGlsczsKICAgICAgICAgICAgICAgIGNvbnN0IFBMT1RfTUlOX1dJRFRIID0gMTIwMDsKICAgICAgICAgICAgICAgIGNvbnN0IFBMT1RfTUlOX0hFSUdIVCA9IDAuNCAqIFBMT1RfTUlOX1dJRFRIOwogICAgICAgICAgICAgICAgY29uc3QgQ0VMTF9NSU5fV0lEVEggPSAxNTA7CiAgICAgICAgICAgICAgICBjb25zdCBDRUxMX01JTl9IRUlHSFQgPSAwLjc1ICogQ0VMTF9NSU5fV0lEVEg7CiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gTWF0aC5tYXgoQ0VMTF9NSU5fV0lEVEggKiB1dGlscy5udW1WaXNpYmxlQ29sdW1ucyh0aGlzLnZpc2libGVTY2hlbWEpLCBQTE9UX01JTl9XSURUSCk7CiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IE1hdGgubWF4KENFTExfTUlOX0hFSUdIVCAqIHV0aWxzLm51bVZpc2libGVNZXRyaWNzKHRoaXMudmlzaWJsZVNjaGVtYSksIFBMT1RfTUlOX0hFSUdIVCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXIuc3R5bGUud2lkdGggPSB0aGlzLndpZHRoICsgJ3B4JzsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lci5zdHlsZS5oZWlnaHQgPSB0aGlzLmhlaWdodCArICdweCc7CiAgICAgICAgICAgICAgICB0aGlzLl9zdmcuYXR0cignd2lkdGgnLCB0aGlzLndpZHRoKS5hdHRyKCdoZWlnaHQnLCB0aGlzLmhlaWdodCk7CiAgICAgICAgICAgICAgICAvLyBEZWxldGUgYWxsIGVsZW1lbnRzIGluIHRoZSBzdmcgc3VidHJlZQogICAgICAgICAgICAgICAgdGhpcy5fc3ZnLnNlbGVjdEFsbCgnZycpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgLy8gRHJhdy4KICAgICAgICAgICAgICAgIHRoaXMuX2RyYXcoKTsKICAgICAgICAgICAgfSwgMTAwKTsKICAgICAgICB9CiAgICAgICAgLy8gQ3JlYXRlcyB0aGUgRE9NIGVsZW1lbnRzIGNvbXByaXNpbmcgdGhlIHNjYXR0ZXItcGxvdC1tYXRyaXggcGxvdCBhbmQKICAgICAgICAvLyByZWdpc3RlcnMgZXZlbnQgaGFuZGxlcnMgdG8gaGFuZGxlIHVzZXIgYWN0aW9ucy4KICAgICAgICBfZHJhdygpIHsKICAgICAgICAgICAgY29uc3QgdXRpbHMgPSB0Zl9ocGFyYW1zX3V0aWxzOwogICAgICAgICAgICBjb25zdCBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgIGlmICghdGhpcy5zZXNzaW9uR3JvdXBzIHx8CiAgICAgICAgICAgICAgICB0aGlzLnNlc3Npb25Hcm91cHMubGVuZ3RoID09IDAgfHwKICAgICAgICAgICAgICAgICF0aGlzLnZpc2libGVTY2hlbWEgfHwKICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvcy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBtZXRyaWNzIG9yIHNlc3Npb24gZ3JvdXBzLiBUaGVyZSdzIG5vdGhpbmcgdG8gZHJhdy4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBbiBhcnJheSBjb250YWluaW5nIHRoZSB2aXNpYmxlU2NoZW1hLWNvbHVtbnMgKGhwYXJhbXMgZm9sbG93ZWQgYnkKICAgICAgICAgICAgLy8gbWV0cmljcykgaW5kaWNlcy4gVGhlc2UgaW5kZXggdGhlIGNvbHVtbnMgb2YgdGhlIHNjYXR0ZXIgcGxvdCBtYXRyaXguCiAgICAgICAgICAgIGNvbnN0IGNvbHMgPSBzZXF1ZW5jZSh1dGlscy5udW1WaXNpYmxlQ29sdW1ucyhfdGhpcy52aXNpYmxlU2NoZW1hKSk7CiAgICAgICAgICAgIC8vIEFuIGFycmF5IGNvbnRhaW5pbmcgdGhlIG1ldHJpYyBpbmRpY2VzLiBUaGVzZSBpbmRleCB0aGUgcm93cyBvZiB0aGUKICAgICAgICAgICAgLy8gc2NhdHRlciBwbG90IG1hdHJpeC4KICAgICAgICAgICAgY29uc3QgbWV0cmljcyA9IHNlcXVlbmNlKHV0aWxzLm51bVZpc2libGVNZXRyaWNzKF90aGlzLnZpc2libGVTY2hlbWEpKTsKICAgICAgICAgICAgLy8gVGhlIG1hcmdpbiBpbiBwaXhlbHMgZnJvbSB0aGUgbGVmdCB0byBsZWF2ZSBmb3IgdGhlIHktYXhpcyB0ZXh0CiAgICAgICAgICAgIC8vICh0aWNrIHZhbHVlcyBhbmQgeC1heGlzIGxhYmVsKS4KICAgICAgICAgICAgY29uc3QgeUF4aXNUZXh0TWFyZ2luID0gODA7CiAgICAgICAgICAgIC8vIFRoZSBtYXJnaW4gaW4gcGl4ZWxzIGZyb20gdGhlIGJvdHRvbSB0byBsZWF2ZSBmb3IgdGhlIHgtYXhpcyB0ZXh0CiAgICAgICAgICAgIC8vICh0aWNrIHZhbHVlcyBhbmQgeC1heGlzIGxhYmVsKS4KICAgICAgICAgICAgY29uc3QgeEF4aXNUZXh0TWFyZ2luID0gNTA7CiAgICAgICAgICAgIC8vIEVhY2ggY2VsbCBpbiB0aGUgc2NhdHRlciBwbG90IG1hdHJpeCBoYXMgYSByZWN0YW5ndWxhciBmcmFtZS4KICAgICAgICAgICAgLy8gVGhlIG1hcmdpbiBpbiBwaXhlbHMgdG8gdXNlIGJldHdlZW4gdGhlIGNlbGwgYm91bmRhcnkgYW5kIGl0cyBmcmFtZS4KICAgICAgICAgICAgY29uc3QgZnJhbWVNYXJnaW4gPSA1OwogICAgICAgICAgICAvLyBjZWxsWChjb2wpLCBjZWxsWShtZXRyaWMpIGFyZSB0aGUgc3ZnIGNvb3JkaW5hdGVzIG9mIHRoZSB1cHBlcgogICAgICAgICAgICAvLyBsZWZ0IGNvcm5lciBvZiB0aGUgYm91bmRhcnkgb2YgdGhlIGNlbGwgaW5kZXhlZCBieSAoY29sLCBtZXRyaWMpLgogICAgICAgICAgICBjb25zdCBjZWxsWCA9IGJhbmQoKQogICAgICAgICAgICAgICAgLmRvbWFpbihjb2xzKQogICAgICAgICAgICAgICAgLnJhbmdlKFt5QXhpc1RleHRNYXJnaW4gKyBmcmFtZU1hcmdpbiwgdGhpcy53aWR0aCAtIDEgLSBmcmFtZU1hcmdpbl0pCiAgICAgICAgICAgICAgICAucGFkZGluZ0lubmVyKDAuMSk7CiAgICAgICAgICAgIGNvbnN0IGNlbGxZID0gYmFuZCgpCiAgICAgICAgICAgICAgICAuZG9tYWluKG1ldHJpY3MpCiAgICAgICAgICAgICAgICAucmFuZ2UoW3RoaXMuaGVpZ2h0IC0gMSAtIGZyYW1lTWFyZ2luIC0geEF4aXNUZXh0TWFyZ2luLCBmcmFtZU1hcmdpbl0pCiAgICAgICAgICAgICAgICAucGFkZGluZ0lubmVyKDAuMSk7CiAgICAgICAgICAgIGNvbnN0IGNlbGxXaWR0aCA9IGNlbGxYLmJhbmR3aWR0aCgpOwogICAgICAgICAgICBjb25zdCBjZWxsSGVpZ2h0ID0gY2VsbFkuYmFuZHdpZHRoKCk7CiAgICAgICAgICAgIC8vIHhDb29yZHNbY29sXShjb2xWYWx1ZSksIHlDb29yZHNbbWV0cmljXShtZXRyaWNWYWx1ZSkgYXJlIHRoZQogICAgICAgICAgICAvLyBjb29yZGluYXRlcyBvZiB0aGUgbWFya2VyIHJlcHJlc2VudGluZyB0aGUgZGF0YQogICAgICAgICAgICAvLyAoY29sVmFsdWUsIG1ldHJpY1ZhbHVlKSBpbiB0aGUgY2VsbCBpbmRleGVkIGJ5IChjb2wsIG1ldHJpYykuCiAgICAgICAgICAgIC8vIFRoZSBjb29yZGluYXRlcyBhcmUgcmVsYXRpdmUgdG8gdGhlIGNlbGwgYm91bmRhcnkncyB1cHBlcgogICAgICAgICAgICAvLyBsZWZ0IGNvcm5lci4KICAgICAgICAgICAgY29uc3QgeENvb3JkcyA9IGNvbHMubWFwKChjKSA9PiBfdGhpcy5fY2VsbFNjYWxlKGMsIFswLCBjZWxsV2lkdGggLSAxXSkpOwogICAgICAgICAgICBjb25zdCB5Q29vcmRzID0gbWV0cmljcy5tYXAoKG0pID0+IF90aGlzLl9jZWxsU2NhbGUobSArIHV0aWxzLm51bVZpc2libGVIUGFyYW1zKF90aGlzLnZpc2libGVTY2hlbWEpLCBbCiAgICAgICAgICAgICAgICBjZWxsSGVpZ2h0IC0gMSwKICAgICAgICAgICAgICAgIDAsCiAgICAgICAgICAgIF0pKTsKICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIERyYXcgYXhlcy4KICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIFgtQXhlcyBhbmQgbGFiZWxzLgogICAgICAgICAgICBjb25zdCB4QXhlc0cgPSB0aGlzLl9zdmcKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy54LWF4aXMnKQogICAgICAgICAgICAgICAgLmRhdGEoY29scykKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCd4LWF4aXMnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChjb2wpID0+IHV0aWxzLnRyYW5zbGF0ZVN0cihjZWxsWChjb2wpLCAwKSk7CiAgICAgICAgICAgIGZ1bmN0aW9uIHhBeGlzQ2xpcFBhdGhJZChjb2wpIHsKICAgICAgICAgICAgICAgIHJldHVybiAneC1heGlzLWNsaXAtcGF0aC0nICsgY29sOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHhMYWJlbENsaXBQYXRoSWQoY29sKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3gtbGFiZWwtY2xpcC1wYXRoLScgKyBjb2w7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgeEF4ZXNHCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdjbGlwUGF0aCcpCiAgICAgICAgICAgICAgICAuYXR0cignaWQnLCB4QXhpc0NsaXBQYXRoSWQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgLWZyYW1lTWFyZ2luKQogICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAwKQogICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgY2VsbFdpZHRoICsgMiAqIGZyYW1lTWFyZ2luKQogICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIF90aGlzLmhlaWdodCAtIHhBeGlzVGV4dE1hcmdpbiAvIDIpOwogICAgICAgICAgICB4QXhlc0cKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NsaXBQYXRoJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIHhMYWJlbENsaXBQYXRoSWQpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgMCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgX3RoaXMuaGVpZ2h0IC0geEF4aXNUZXh0TWFyZ2luIC8gMikKICAgICAgICAgICAgICAgIC5hdHRyKCd3aWR0aCcsIGNlbGxXaWR0aCkKICAgICAgICAgICAgICAgIC5hdHRyKCdoZWlnaHQnLCB4QXhpc1RleHRNYXJnaW4gLyAyKTsKICAgICAgICAgICAgeEF4ZXNHCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGlwLXBhdGgnLCAoY29sKSA9PiAndXJsKCMnICsgeEF4aXNDbGlwUGF0aElkKGNvbCkgKyAnKScpCiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoY29sKSB7CiAgICAgICAgICAgICAgICBzZWxlY3QodGhpcykuY2FsbChkcmF3QXhpcywgYXhpc0JvdHRvbSh4Q29vcmRzW2NvbF0pCiAgICAgICAgICAgICAgICAgICAgLnRpY2tTaXplKF90aGlzLmhlaWdodCAtIHhBeGlzVGV4dE1hcmdpbiksIGNlbGxXaWR0aCwgCiAgICAgICAgICAgICAgICAvKiBtaW5MYWJlbFNpemUgKi8gNDAsIF90aGlzLm9wdGlvbnMuY29sdW1uc1tjb2xdLnNjYWxlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIERyYXcgYSBsYWJlbCBmb3IgZWFjaCBheGlzLgogICAgICAgICAgICB4QXhlc0cKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ3gtYXhpcy1sYWJlbCcsIHRydWUpCiAgICAgICAgICAgICAgICAuYXR0cignY2xpcC1wYXRoJywgKGNvbCkgPT4gJ3VybCgjJyArIHhMYWJlbENsaXBQYXRoSWQoY29sKSArICcpJykKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RleHQtYW5jaG9yJywgJ21pZGRsZScpCiAgICAgICAgICAgICAgICAuYXR0cigneCcsIGNlbGxXaWR0aCAvIDIpCiAgICAgICAgICAgICAgICAuYXR0cigneScsIF90aGlzLmhlaWdodCAtIDEgLSB4QXhpc1RleHRNYXJnaW4gLyA0KQogICAgICAgICAgICAgICAgLnRleHQoKGNvbCkgPT4gdXRpbHMuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoX3RoaXMudmlzaWJsZVNjaGVtYSwgY29sKSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RpdGxlJykgLy8gU2hvdyBmdWxsIG5hbWUgYXMgYSB0b29sdGlwLgogICAgICAgICAgICAgICAgLnRleHQoKGNvbCkgPT4gdXRpbHMuc2NoZW1hVmlzaWJsZUNvbHVtbk5hbWUoX3RoaXMudmlzaWJsZVNjaGVtYSwgY29sKSk7CiAgICAgICAgICAgIC8vIFktQXhlcyBhbmQgbGFiZWxzLgogICAgICAgICAgICBjb25zdCB5QXhlc0cgPSB0aGlzLl9zdmcKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy55LWF4aXMnKQogICAgICAgICAgICAgICAgLmRhdGEobWV0cmljcykKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCd5LWF4aXMnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChtZXRyaWMpID0+IHV0aWxzLnRyYW5zbGF0ZVN0cihfdGhpcy53aWR0aCAtIDEsIGNlbGxZKG1ldHJpYykpKTsKICAgICAgICAgICAgZnVuY3Rpb24geUF4aXNDbGlwUGF0aElkKG1ldHJpYykgewogICAgICAgICAgICAgICAgcmV0dXJuICd5LWF4aXMtY2xpcC1wYXRoLScgKyBtZXRyaWM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24geUxhYmVsQ2xpcFBhdGhJZChtZXRyaWMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAneS1sYWJlbC1jbGlwLXBhdGgtJyArIG1ldHJpYzsKICAgICAgICAgICAgfQogICAgICAgICAgICB5QXhlc0cKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NsaXBQYXRoJykKICAgICAgICAgICAgICAgIC5hdHRyKCdpZCcsIHlBeGlzQ2xpcFBhdGhJZCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAtKF90aGlzLndpZHRoIC0geUF4aXNUZXh0TWFyZ2luIC8gMiAtIDEpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAtZnJhbWVNYXJnaW4pCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCBfdGhpcy53aWR0aCAtIHlBeGlzVGV4dE1hcmdpbiAvIDIpCiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgY2VsbEhlaWdodCArIDIgKiBmcmFtZU1hcmdpbik7CiAgICAgICAgICAgIHlBeGVzRwogICAgICAgICAgICAgICAgLmFwcGVuZCgnY2xpcFBhdGgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2lkJywgeUxhYmVsQ2xpcFBhdGhJZCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3JlY3QnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAtKF90aGlzLndpZHRoIC0gMSkpCiAgICAgICAgICAgICAgICAuYXR0cigneScsIDApCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB5QXhpc1RleHRNYXJnaW4gLyAyKQogICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGNlbGxIZWlnaHQpOwogICAgICAgICAgICB5QXhlc0cKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsaXAtcGF0aCcsIChtZXRyaWMpID0+ICd1cmwoIycgKyB5QXhpc0NsaXBQYXRoSWQobWV0cmljKSArICcpJykKICAgICAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uIChtZXRyaWMpIHsKICAgICAgICAgICAgICAgIHNlbGVjdCh0aGlzKS5jYWxsKGRyYXdBeGlzLCBheGlzTGVmdCh5Q29vcmRzW21ldHJpY10pCiAgICAgICAgICAgICAgICAgICAgLnRpY2tTaXplKF90aGlzLndpZHRoIC0geUF4aXNUZXh0TWFyZ2luKSwgY2VsbEhlaWdodCwgCiAgICAgICAgICAgICAgICAvKiBtaW5MYWJlbFNpemUgKi8gMjAsIF90aGlzLm9wdGlvbnMuY29sdW1uc1ttZXRyaWMgKyB1dGlscy5udW1WaXNpYmxlSFBhcmFtcyhfdGhpcy52aXNpYmxlU2NoZW1hKV0uc2NhbGUpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gQXBwZW5kIGEgbGFiZWwgZm9yIGVhY2ggYXhpcy4KICAgICAgICAgICAgeUF4ZXNHCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5jbGFzc2VkKCd5LWF4aXMtbGFiZWwnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsaXAtcGF0aCcsIChtZXRyaWMpID0+ICd1cmwoIycgKyB5TGFiZWxDbGlwUGF0aElkKG1ldHJpYykgKyAnKScpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCd0ZXh0LWFuY2hvcicsICdtaWRkbGUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAtKF90aGlzLndpZHRoIC0geUF4aXNUZXh0TWFyZ2luIC8gNCAtIDEpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3knLCBjZWxsSGVpZ2h0IC8gMikKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCB1dGlscy5yb3RhdGVTdHIoOTAsIC0oX3RoaXMud2lkdGggLSB5QXhpc1RleHRNYXJnaW4gLyA0IC0gMSksIGNlbGxIZWlnaHQgLyAyKSkKICAgICAgICAgICAgICAgIC50ZXh0KChtZXRyaWMpID0+IHV0aWxzLm1ldHJpY05hbWUoX3RoaXMudmlzaWJsZVNjaGVtYS5tZXRyaWNJbmZvc1ttZXRyaWNdKSkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RpdGxlJykgLy8gU2hvdyBmdWxsIG5hbWUgYXMgYSB0b29sdGlwLgogICAgICAgICAgICAgICAgLnRleHQoKG1ldHJpYykgPT4gdXRpbHMubWV0cmljTmFtZShfdGhpcy52aXNpYmxlU2NoZW1hLm1ldHJpY0luZm9zW21ldHJpY10pKTsKICAgICAgICAgICAgZnVuY3Rpb24gZHJhd0F4aXMoZywgYXhpc0dlbiwgYXhpc0xlbmd0aCwgbWluTGFiZWxTaXplLCBzY2FsZVR5cGUpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGNvbXB1dGUgdGhlIG51bWJlciBvZiB0aWNrcyB0byBkaXNwbGF5IGJhc2VkIG9uIHRoZSBlc3RpbWF0ZQogICAgICAgICAgICAgICAgLy8gb2YgdGhlIG1pbmltdW0gc2l6ZSB0byBhbGxvdyBmb3IgYSBsYWJlbC4KICAgICAgICAgICAgICAgIGNvbnN0IG51bVRpY2tzID0gTWF0aC5mbG9vcihheGlzTGVuZ3RoIC8gbWluTGFiZWxTaXplKTsKICAgICAgICAgICAgICAgIGNvbnN0IHNjYWxlID0gYXhpc0dlbi5zY2FsZSgpOwogICAgICAgICAgICAgICAgaWYgKHNjYWxlVHlwZSA9PT0gJ1FVQU5USUxFJykgewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHRpY2tWYWx1ZXMgb2YgYSBxdWFudGlsZSBzY2FsZSBpcyBqdXN0IHRoZSBzY2FsZQogICAgICAgICAgICAgICAgICAgIC8vIGRvbWFpbiwgd2hpY2ggcHJvZHVjZXMgb3ZlcmxhcHBpbmcgbGFiZWxzIGlmIHRoZSBudW1iZXIgb2YKICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBpbiB0aGUgZG9tYWluIGlzIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mCiAgICAgICAgICAgICAgICAgICAgLy8gcXVhbnRpbGVzLgogICAgICAgICAgICAgICAgICAgIGxldCBxdWFudGlsZXMgPSBzY2FsZS5xdWFudGlsZXMoKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gTWF0aC5jZWlsKHF1YW50aWxlcy5sZW5ndGggLyBudW1UaWNrcyk7CiAgICAgICAgICAgICAgICAgICAgcXVhbnRpbGVzID0gc2VxdWVuY2UoMCwgcXVhbnRpbGVzLmxlbmd0aCwgc3RlcCkKICAgICAgICAgICAgICAgICAgICAgICAgLm1hcCgoaSkgPT4gcXVhbnRpbGVzW2ldKTsKICAgICAgICAgICAgICAgICAgICBheGlzR2VuLnRpY2tWYWx1ZXMocXVhbnRpbGVzKS50aWNrRm9ybWF0KGZvcm1hdCgnLS4yZycpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzY2FsZVR5cGUgPT09ICdMSU5FQVInIHx8IHNjYWxlVHlwZSA9PT0gJ0xPRycpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGlzIGVxdWl2YWxlbnQgdG86IGF4aXNHZW4udGlja3MobnVtVGlja3MpLiBXZQogICAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZm9ybSBiZWxvdywgc2luY2Ugb3RoZXJ3aXNlIHRoZSBjbG9zdXJlIGNvbXBpbGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb25lb3VzbHkgZHJvcHMgdGhlIHBhcmFtZXRlciAnbnVtVGlja3MnIGZyb20gdGhlIGNhbGwuIEl0IGRvZXMKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzLCBzaW5jZSBkMyBkZWZpbmVzIHRoZSB2YXJpYWRpYyAndGlja3MnIG1ldGhvZCBhcwogICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uKCksIHdoaWNoIGNsb3N1cmUgcmVnYXJkcyBhcyBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm8KICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXJzLgogICAgICAgICAgICAgICAgICAgIGF4aXNHZW5bJ3RpY2tzJ10obnVtVGlja3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZy5jYWxsKGF4aXNHZW4pOwogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhY3R1YWwgYXhpcyBsaW5lLCBhbmQgZ3JleSBvdXQgdGhlIHRpY2sgbGluZXMuCiAgICAgICAgICAgICAgICBnLnNlbGVjdEFsbCgnLmRvbWFpbicpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgZy5zZWxlY3RBbGwoJy50aWNrIGxpbmUnKS5hdHRyKCdzdHJva2UnLCAnI2RkZCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAvLyBEcmF3IGNlbGwgZnJhbWVzLgogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgY29uc3QgY2VsbHMgPSB0aGlzLl9zdmcKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy5jZWxsJykKICAgICAgICAgICAgICAgIC5kYXRhKGNyb3NzKGNvbHMsIG1ldHJpY3MpKQogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2NlbGwnLCB0cnVlKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIChbY29sLCBtZXRyaWNdKSA9PiB1dGlscy50cmFuc2xhdGVTdHIoY2VsbFgoY29sKSwgY2VsbFkobWV0cmljKSkpOwogICAgICAgICAgICBjb25zdCBmcmFtZXMgPSBjZWxscwogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuY2xhc3NlZCgnZnJhbWUnLCB0cnVlKQogICAgICAgICAgICAgICAgLmFwcGVuZCgncmVjdCcpCiAgICAgICAgICAgICAgICAuYXR0cigneCcsIC1mcmFtZU1hcmdpbikKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgLWZyYW1lTWFyZ2luKQogICAgICAgICAgICAgICAgLmF0dHIoJ3dpZHRoJywgY2VsbFdpZHRoICsgMiAqIGZyYW1lTWFyZ2luKQogICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIGNlbGxIZWlnaHQgKyAyICogZnJhbWVNYXJnaW4pCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJyMwMDAnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpCiAgICAgICAgICAgICAgICAuYXR0cignc2hhcGUtcmVuZGVyaW5nJywgJ2NyaXNwRWRnZXMnKTsKICAgICAgICAgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgICAgICAgIC8vIERyYXcgZGF0YSBwb2ludCBtYXJrZXJzLgogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgbGV0IGNvbG9yU2NhbGUgPSBudWxsOwogICAgICAgICAgICBpZiAoX3RoaXMub3B0aW9ucy5jb2xvckJ5Q29sdW1uSW5kZXggIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgY29sb3JTY2FsZSA9IGxpbmVhciQyKCkKICAgICAgICAgICAgICAgICAgICAuZG9tYWluKHRoaXMuX2NvbEV4dGVudCh0aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSkKICAgICAgICAgICAgICAgICAgICAucmFuZ2UoW3RoaXMub3B0aW9ucy5taW5Db2xvciwgdGhpcy5vcHRpb25zLm1heENvbG9yXSkKICAgICAgICAgICAgICAgICAgICAuaW50ZXJwb2xhdGUobGFiJDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEEgZnVuY3Rpb24gbWFwcGluZyBhIHNlc3Npb25Hcm91cCB0byBpdHMgbWFya2VyJ3MgY29sb3IuCiAgICAgICAgICAgIGNvbnN0IG1hcmtlckNvbG9yRm4gPSBfdGhpcy5vcHRpb25zLmNvbG9yQnlDb2x1bW5JbmRleCA9PT0gdW5kZWZpbmVkCiAgICAgICAgICAgICAgICA/IC8qIFVzZSBkZWZhdWx0IGNvbG9yIGlmIG5vIGNvbG9yLWJ5IGNvbHVtbiBpcyBzZWxlY3RlZC4gKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiAncmVkJwogICAgICAgICAgICAgICAgOiAoeyBzZXNzaW9uR3JvdXAgfSkgPT4gY29sb3JTY2FsZSh0aGlzLl9jb2xWYWx1ZShzZXNzaW9uR3JvdXAsIF90aGlzLm9wdGlvbnMuY29sb3JCeUNvbHVtbkluZGV4KSk7CiAgICAgICAgICAgIC8vIFJldHVybnMgdGhlIHggY29vcmRpbmF0ZSBmb3IgdGhlIG1hcmtlciByZXByZXNlbnRpbmcgc2Vzc2lvbkdyb3VwCiAgICAgICAgICAgIC8vIGluIGEgY2VsbCBpbiB0aGUgc2NhdHRlciBwbG90IG1hdHJpeCBjb2x1bW4gaW5kZXhlZCBieSAnY29sJy4KICAgICAgICAgICAgZnVuY3Rpb24gbWFya2VyWChzZXNzaW9uR3JvdXAsIGNvbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHhDb29yZHNbY29sXShfdGhpcy5fY29sVmFsdWUoc2Vzc2lvbkdyb3VwLCBjb2wpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXR1cm5zIHRoZSB5IGNvb3JkaW5hdGUgZm9yIHRoZSBtYXJrZXIgcmVwcmVzZW50aW5nIHNlc3Npb25Hcm91cAogICAgICAgICAgICAvLyBpbiBhIGNlbGwgaW4gdGhlIHNjYXR0ZXIgcGxvdCBtYXRyaXggcm93IGluZGV4ZWQgYnkgJ21ldHJpYycuCiAgICAgICAgICAgIGZ1bmN0aW9uIG1hcmtlclkoc2Vzc2lvbkdyb3VwLCBtZXRyaWMpIHsKICAgICAgICAgICAgICAgIHJldHVybiB5Q29vcmRzW21ldHJpY10oX3RoaXMuX21ldHJpY1ZhbHVlKHNlc3Npb25Hcm91cCwgbWV0cmljKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQSBmdW5jdGlvbiB0aGF0IGdldHMgYSBzZWxlY3Rpb24gb2YgPGc+IGVsZW1lbnRzLS1lYWNoIHNob3VsZCBiZQogICAgICAgICAgICAvLyBhIGNoaWxkIG5vZGUgb2YgYSBjZWxsIDxnPiBlbGVtZW50IChhIG1lbWViZXIgb2YgdGhlICdjZWxscycKICAgICAgICAgICAgLy8gc2VsZWN0aW9uKSBhbmQgZHJhd3MgbWFya2VycyByZXByZXNlbnRpbmcgdGhlIGRhdGEgcG9pbnRzIGluIGVhY2gKICAgICAgICAgICAgLy8gY2VsbC4gVGhlIHBhcmFtZXRlciAnZmlsbCcgaXMgZWl0aGVyIGEgY29uc3RhbnQgc3BlY2lmeWluZyB0aGUKICAgICAgICAgICAgLy8gJ2ZpbGwnIGF0dHJpYnV0ZSBvZiBlYWNoIG1hcmtlciBvciBhIGZ1bmN0aW9uIHRha2luZyBhIHNlc3Npb24KICAgICAgICAgICAgLy8gZ3JvdXAgdGhhdCByZXR1cm5zIHRoZSBmaWxsIGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBiZSBzZXQgZm9yIHRoZQogICAgICAgICAgICAvLyBtYXJrZXIgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiBzZXNzaW9uIGdyb3VwLiBUaGUgZnVuY3Rpb24gcmV0dXJucwogICAgICAgICAgICAvLyBhIDMtdHVwbGUgb2YgW21hcmtlcnMsIGNlbGxNYXJrZXJzLCBzZXNzaW9uR3JvdXBNYXJrZXJzTWFwXSwKICAgICAgICAgICAgLy8gd2hlcmU6IG1hcmtlcnMgaXMgdGhlIGQzLXNlbGVjdGlvbiBvZiB0aGUgbWFya2VycywKICAgICAgICAgICAgLy8gY2VsbE1hcmtlcnMgaXMgYSAyLUQgYXJyYXkgd2hvc2UgW2NvbF1bbWV0cmljXSBlbnRyeSBoYXMgYQogICAgICAgICAgICAvLyBkMy1zZWxlY3Rpb24gY29udGFpbmluZyB0aGUgbWFya2VycyBpbiB0aGUgW2NvbCwgbWV0cmljXSBjZWxsLAogICAgICAgICAgICAvLyBhbmQgc2Vzc2lvbkdyb3VwTWFya2Vyc01hcCBpcyBhIE1hcCBtYXBwaW5nIGEgc2Vzc2lvbkdyb3VwIHRvIHRoZQogICAgICAgICAgICAvLyBhcnJheSBvZiBtYXJrZXIgSFRNTCBlbGVtZW50cyByZXByZXNlbnRpbmcgdGhhdCBzZXNzaW9uR3JvdXAuCiAgICAgICAgICAgIGZ1bmN0aW9uIGFkZE1hcmtlcnMoY2VsbHNHU2VsZWN0aW9uLCBmaWxsKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtYXJrZXJzID0gY2VsbHNHU2VsZWN0aW9uCiAgICAgICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmRhdGEtbWFya2VyJykKICAgICAgICAgICAgICAgICAgICAuZGF0YSgoW2NvbCwgbWV0cmljXSkgPT4gCiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgb3V0IHNlc3Npb24gZ3JvdXBzIHRoYXQgZG9uJ3QgaGF2ZSBhIG1ldHJpYy12YWx1ZQogICAgICAgICAgICAgICAgLy8gb3IgYSBjb2x1bW4tdmFsdWUgZm9yIHRoZSBjdXJyZW50IGNlbGwuCiAgICAgICAgICAgICAgICBfdGhpcy5zZXNzaW9uR3JvdXBzCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoc2Vzc2lvbkdyb3VwKSA9PiBfdGhpcy5fY29sVmFsdWUoc2Vzc2lvbkdyb3VwLCBjb2wpICE9PSB1bmRlZmluZWQgJiYKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fbWV0cmljVmFsdWUoc2Vzc2lvbkdyb3VwLCBtZXRyaWMpICE9PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgLm1hcCgoc2Vzc2lvbkdyb3VwKSA9PiAoewogICAgICAgICAgICAgICAgICAgIGNvbDogY29sLAogICAgICAgICAgICAgICAgICAgIG1ldHJpYzogbWV0cmljLAogICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cDogc2Vzc2lvbkdyb3VwLAogICAgICAgICAgICAgICAgICAgIHg6IG1hcmtlclgoc2Vzc2lvbkdyb3VwLCBjb2wpLAogICAgICAgICAgICAgICAgICAgIHk6IG1hcmtlclkoc2Vzc2lvbkdyb3VwLCBtZXRyaWMpLAogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBwb3B1bGF0ZWQgYnkgdGhlIGNvZGUgYmVsb3cgd2l0aAogICAgICAgICAgICAgICAgICAgIC8vIGEgU2V0IG9mIGFsbCB0aGUgbWFya2VycyByZXByZXNlbnRpbmcgdGhpcyBzZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgLy8gZ3JvdXAuCiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkdyb3VwTWFya2VyczogbnVsbCwKICAgICAgICAgICAgICAgIH0pKSkKICAgICAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpCiAgICAgICAgICAgICAgICAgICAgLmNsYXNzZWQoJ2RhdGEtbWFya2VyJywgdHJ1ZSkKICAgICAgICAgICAgICAgICAgICAuYXR0cignY3gnLCAoeyB4IH0pID0+IHgpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2N5JywgKHsgeSB9KSA9PiB5KQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgMikKICAgICAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsIGZpbGwpOwogICAgICAgICAgICAgICAgY29uc3Qgc2Vzc2lvbkdyb3VwTWFya2Vyc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIF90aGlzLnNlc3Npb25Hcm91cHMuZm9yRWFjaCgoc2Vzc2lvbkdyb3VwKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbkdyb3VwTWFya2Vyc01hcC5zZXQoc2Vzc2lvbkdyb3VwLCBbXSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1hcmtlcnMuZWFjaChmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgICAgIHNlc3Npb25Hcm91cE1hcmtlcnNNYXAuZ2V0KGQuc2Vzc2lvbkdyb3VwKS5wdXNoKHRoaXMpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBtYXJrZXJzLmVhY2goKGQpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXNzaW9uR3JvdXBNYXJrZXJzID0gc2Vzc2lvbkdyb3VwTWFya2Vyc01hcC5nZXQoZC5zZXNzaW9uR3JvdXApOwogICAgICAgICAgICAgICAgICAgIGQuc2Vzc2lvbkdyb3VwTWFya2VycyA9IG5ldyBTZXQoc2Vzc2lvbkdyb3VwTWFya2Vycyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IGNlbGxNYXJrZXJzID0gY29scy5tYXAoKGNvbCkgPT4gbWV0cmljcy5tYXAoKG1ldHJpYykgPT4gbWFya2Vycy5maWx0ZXIoKGQpID0+IGQuY29sID09IGNvbCAmJiBkLm1ldHJpYyA9PSBtZXRyaWMpKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gW21hcmtlcnMsIGNlbGxNYXJrZXJzLCBzZXNzaW9uR3JvdXBNYXJrZXJzTWFwXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBbbWFya2VycywgY2VsbE1hcmtlcnMsIHNlc3Npb25Hcm91cE1hcmtlcnNNYXBdID0gYWRkTWFya2VycyhjZWxscy5hcHBlbmQoJ2cnKSwgCiAgICAgICAgICAgIC8qIGZpbGwgKi8gbWFya2VyQ29sb3JGbik7CiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAvLyBDcmVhdGUgYSBicnVzaCBmb3IgZWFjaCBjZWxsLiBCcnVzaGluZyBhIGNlbGwgbWFrZXMgInZpc2libGUiIG9ubHkKICAgICAgICAgICAgLy8gdGhlIG1hcmtlcnMgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gZ3JvdXBzIHdob3NlIG1hcmtlcnMKICAgICAgICAgICAgLy8gaW4gdGhlIGJydXNoZWQgY2VsbCBsaWUgd2l0aGluIHRoZSBicnVzaCBzZWxlY3Rpb24uIEJ5ICJ2aXNpYmlsZSIKICAgICAgICAgICAgLy8gaGVyZSwgd2UgbWFuIGNvbG9yZWQgYWNjb3JkaW5nIHRvIGNvbG9yLWJ5IGNvbHVtbi4gTWFya2VycyB0aGF0CiAgICAgICAgICAgIC8vIGFyZSBub3QgInZpc2liaWxlIiB3aWxsIGJlIHNob3duIGFzIGdyYXllZCBvdXQuCiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAvLyBGb3IgZWFjaCBjZWxsLCB3ZSBpbmRleCB0aGUgbWFya2VycyBpbiBhIHF1YWQtdHJlZSB0byBxdWlja2x5CiAgICAgICAgICAgIC8vIGZpbmQgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgbWFya2VycyB3aXRoIHRoZSAoYnJ1c2gpIHNlbGVjdGlvbi4KICAgICAgICAgICAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBjcmVhdGVzIHRoaXMgcXVhZC10cmVlIGZvciB0aGUgY2VsbCBpbmRleGVkIGJ5CiAgICAgICAgICAgIC8vIChjb2wsIG1ldHJpYykuIEVhY2ggcXVhZCB0cmVlIGRhdHVtIGlzIHRoZSBjb3JyZXNwb25kaW5nIG1hcmtlcidzCiAgICAgICAgICAgIC8vIGVsZW1lbnQuCiAgICAgICAgICAgIGZ1bmN0aW9uIGNyZWF0ZUNlbGxRdWFkVHJlZShjb2wsIG1ldHJpYykgewogICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IFtdOwogICAgICAgICAgICAgICAgY2VsbE1hcmtlcnNbY29sXVttZXRyaWNdLmVhY2goZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGRhdGEucHVzaCh0aGlzKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHF1YWR0cmVlKCkKICAgICAgICAgICAgICAgICAgICAueCgoZWxlbSkgPT4gc2VsZWN0KGVsZW0pLmRhdHVtKCkueCkKICAgICAgICAgICAgICAgICAgICAueSgoZWxlbSkgPT4gc2VsZWN0KGVsZW0pLmRhdHVtKCkueSkKICAgICAgICAgICAgICAgICAgICAuYWRkQWxsKGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHF1YWRUcmVlcyA9IGNvbHMubWFwKChjb2wpID0+IG1ldHJpY3MubWFwKChtZXRyaWMpID0+IGNyZWF0ZUNlbGxRdWFkVHJlZShjb2wsIG1ldHJpYykpKTsKICAgICAgICAgICAgLy8gQSBkMy1zZWxlY3Rpb24gb2YgdGhlIGNlbGwgaW4gJ2NlbGxzJyB0aGF0IGhhcyB0aGUgYWN0aXZlCiAgICAgICAgICAgIC8vIGJydXNoIHNlbGVjdGlvbiwgb3IgbnVsbCBpZiB0aGUgYnJ1c2ggaXMgbm90IGFjdGl2ZS4KICAgICAgICAgICAgbGV0IGJydXNoZWRDZWxsRyA9IG51bGw7CiAgICAgICAgICAgIGlmIChpc0JydXNoQWN0aXZlKCkpIHsKICAgICAgICAgICAgICAgIGJydXNoZWRDZWxsRyA9IGNlbGxzLmZpbHRlcigoY2VsbEluZGV4KSA9PiBsb2Rhc2guaXNFcXVhbChjZWxsSW5kZXgsIF90aGlzLl9icnVzaGVkQ2VsbEluZGV4KSk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmFzc2VydChicnVzaGVkQ2VsbEcuc2l6ZSgpID09IDEsIGJydXNoZWRDZWxsRyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIHNldCBvZiBtYXJrZXJzIChpbiBhbGwgY2VsbHMpIHRoYXQgYXJlIHZpc2libGUuIFdlIGtlZXAgdGhpcwogICAgICAgICAgICAvLyBzZXQgYXJvdW5kIHNvIHRoYXQgd2hlbiB0aGUgYnJ1c2ggc2VsZWN0aW9uIGNoYW5nZXMgd2UgY2FuIGNoYW5nZQogICAgICAgICAgICAvLyB0aGUgImZpbGwiIGF0dHJpYnV0ZSBvZiBvbmx5IHRoZSBtYXJrZXJzIHdlIG5lZWQgdG8uIFRoaXMgcmVkdWNlcwogICAgICAgICAgICAvLyB0aGUgYnJvd3NlcidzIHJlbmRlcmluZyB0aW1lIGFuZCBtYWtlcyBicnVzaGluZyBzbW9vdGhlci4KICAgICAgICAgICAgbGV0IHZpc2libGVNYXJrZXJzID0gbmV3IFNldChtYXJrZXJzLm5vZGVzKCkpOwogICAgICAgICAgICB1cGRhdGVWaXNpYmxlTWFya2VycygpOwogICAgICAgICAgICBmdW5jdGlvbiB1cGRhdGVWaXNpYmxlTWFya2VycygpIHsKICAgICAgICAgICAgICAgIC8vIFdlIHJlZ2FyZCBhbiBlbXB0eSAob3IgaW5hY3RpdmUpIGJydXNoIHNlbGVjdGlvbiBhcyBzZWxlY3RpbmcKICAgICAgICAgICAgICAgIC8vIGFsbCBtYXJrZXJzLgogICAgICAgICAgICAgICAgbGV0IG5ld1Zpc2libGVNYXJrZXJzID0gbmV3IFNldChtYXJrZXJzLm5vZGVzKCkpOwogICAgICAgICAgICAgICAgaWYgKCFpc0JydXNoU2VsZWN0aW9uRW1wdHkoKSkgewogICAgICAgICAgICAgICAgICAgIG5ld1Zpc2libGVNYXJrZXJzID0gZmluZE1hcmtlcnNJblNlbGVjdGlvbihfdGhpcy5fYnJ1c2hlZENlbGxJbmRleCwgX3RoaXMuX2JydXNoU2VsZWN0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEhpZ2hsaWdodCB0aGUgbmV3IHZpc2libGUgbWFya2Vycy4KICAgICAgICAgICAgICAgIHNlbGVjdEFsbChBcnJheS5mcm9tKHV0aWxzLmZpbHRlclNldChuZXdWaXNpYmxlTWFya2VycywgKGVsZW0pID0+ICF2aXNpYmxlTWFya2Vycy5oYXMoZWxlbSkpKSkuYXR0cignZmlsbCcsIG1hcmtlckNvbG9yRm4pOwogICAgICAgICAgICAgICAgLy8gR3JheS1vdXQgdGhlIG5vLWxvbmdlciB2aXNpYmxlIG1hcmtlcnMuCiAgICAgICAgICAgICAgICBzZWxlY3RBbGwoQXJyYXkuZnJvbSh1dGlscy5maWx0ZXJTZXQodmlzaWJsZU1hcmtlcnMsIChlbGVtKSA9PiAhbmV3VmlzaWJsZU1hcmtlcnMuaGFzKGVsZW0pKSkpLmF0dHIoJ2ZpbGwnLCAnI2RkZCcpOwogICAgICAgICAgICAgICAgdmlzaWJsZU1hcmtlcnMgPSBuZXdWaXNpYmxlTWFya2VyczsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXR1cm5zIGEgU2V0IG9mIGFsbCBtYXJrZXIgZWxlbWVudHMgdGhhdCBhcmUgaW4gdGhlCiAgICAgICAgICAgIC8vIHJlY3RhbmdsZSAnc2VsZWN0aW9uJyBnaXZlbiBpbiBjb29yZGluYXRlcyByZWxhdGl2ZSB0byB0aGUKICAgICAgICAgICAgLy8gY2VsbCBpbmRleGVkIGJ5IGNlbGxJbmRleCAuCiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRNYXJrZXJzSW5TZWxlY3Rpb24oY2VsbEluZGV4LCBzZWxlY3Rpb24pIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KGNlbGxJbmRleCAhPT0gbnVsbCk7CiAgICAgICAgICAgICAgICBjb25zb2xlLmFzc2VydChzZWxlY3Rpb24gIT09IG51bGwpOwogICAgICAgICAgICAgICAgY29uc3QgW2NvbCwgbWV0cmljXSA9IGNlbGxJbmRleDsKICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgIHV0aWxzLnF1YWRUcmVlVmlzaXRQb2ludHNJblJlY3QocXVhZFRyZWVzW2NvbF1bbWV0cmljXSwgc2VsZWN0aW9uWzBdWzBdLCBzZWxlY3Rpb25bMF1bMV0sIHNlbGVjdGlvblsxXVswXSwgc2VsZWN0aW9uWzFdWzFdLCAoZWxlbSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBzZWxlY3QoZWxlbSkuZGF0dW0oKTsKICAgICAgICAgICAgICAgICAgICBkYXRhLnNlc3Npb25Hcm91cE1hcmtlcnMuZm9yRWFjaCgoc2dfZWxlbSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYWRkKHNnX2VsZW0pOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGJydXNoJDEgPSBicnVzaCgpCiAgICAgICAgICAgICAgICAuZXh0ZW50KFsKICAgICAgICAgICAgICAgIFstZnJhbWVNYXJnaW4gKyAxLCAtZnJhbWVNYXJnaW4gKyAxXSwKICAgICAgICAgICAgICAgIFtjZWxsV2lkdGggLSAxICsgZnJhbWVNYXJnaW4gLSAxLCBjZWxsSGVpZ2h0IC0gMSArIGZyYW1lTWFyZ2luIC0gMV0sCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAub24oJ3N0YXJ0JywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgaWYgKGlzQnJ1c2hBY3RpdmUoKSAmJiBicnVzaGVkQ2VsbEcubm9kZSgpICE9IHRoaXMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgYnJ1c2ggaXMgYWN0aXZlIGluIGEgZGlmZmVyZW50IGNlbGwuCiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlbGVjdGlvbiBmaXJzdC4KICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHdpbGwgcmVjdXJzaXZlbHkgY2FsbCB0aGUgJ3N0YXJ0JywgJ2JydXNoJywgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gJ2VuZCcgZXZlbnQgbGlzdGVuZXJzIGZvciB0aGUgY2VsbCB3aXRoIHRoZSBzZWxlY3Rpb24KICAgICAgICAgICAgICAgICAgICAvLyBhbmQgd2lsbCB1cGRhdGUgdGhlIG1hcmtlcnMuIFRoZSAnaWYnIGFib3ZlCiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uLgogICAgICAgICAgICAgICAgICAgIGJydXNoJDEubW92ZShicnVzaGVkQ2VsbEcsIG51bGwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYnJ1c2hDaGFuZ2VkKHRoaXMpOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdicnVzaCcsIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGJydXNoQ2hhbmdlZCh0aGlzKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgYnJ1c2hDaGFuZ2VkKHRoaXMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gVXBkYXRlcyB0aGUgaW50ZXJuYWwgc3RhdGUgaW4gcmVzcG9uc2UgdG8gYSBicnVzaCBldmVudCBpbgogICAgICAgICAgICAvLyB0aGUgY2VsbCB3aG9zZSA8Zz4gZWxlbWVudCAoaW4gJ2NlbGxzJykgaXMgZ2l2ZW4gYnkgY2VsbEdOb2RlCiAgICAgICAgICAgIGZ1bmN0aW9uIGJydXNoQ2hhbmdlZChjZWxsR05vZGUpIHsKICAgICAgICAgICAgICAgIC8vIEZvciBzb21lIHJlYXNvbiB0aGUgY2xvc3VyZSBjb21waWxlciBkcm9wcyB0aGUgYXJndW1lbnQgd2hlbiB3ZQogICAgICAgICAgICAgICAgLy8gd3JpdGUgdGhlIGNhbGwgYmVsb3cgYXMgJ2QzLmJydXNoU2VsZWN0aW9uKGNlbGxHTm9kZSknLgogICAgICAgICAgICAgICAgY29uc3QgYnJ1c2hTZWxlY3Rpb24kMSA9IGJydXNoU2VsZWN0aW9uKGNlbGxHTm9kZSk7CiAgICAgICAgICAgICAgICBpZiAoKCFpc0JydXNoQWN0aXZlKCkgJiYgYnJ1c2hTZWxlY3Rpb24kMSA9PT0gbnVsbCkgfHwKICAgICAgICAgICAgICAgICAgICAoaXNCcnVzaEFjdGl2ZSgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGNlbGxHTm9kZSA9PT0gYnJ1c2hlZENlbGxHLm5vZGUoKSAmJgogICAgICAgICAgICAgICAgICAgICAgICBsb2Rhc2guaXNFcXVhbChicnVzaFNlbGVjdGlvbiQxLCBfdGhpcy5fYnJ1c2hTZWxlY3Rpb24pKSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG8gaWYgc2VsZWN0aW9uIGhhc24ndCBjaGFuZ2VkLgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIF90aGlzLl9icnVzaFNlbGVjdGlvbiA9IGJydXNoU2VsZWN0aW9uJDE7CiAgICAgICAgICAgICAgICBpZiAoYnJ1c2hTZWxlY3Rpb24kMSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGJydXNoZWRDZWxsRyA9IHNlbGVjdChjZWxsR05vZGUpOwogICAgICAgICAgICAgICAgICAgIF90aGlzLl9icnVzaGVkQ2VsbEluZGV4ID0gYnJ1c2hlZENlbGxHLmRhdHVtKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBicnVzaGVkQ2VsbEcgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIF90aGlzLl9icnVzaGVkQ2VsbEluZGV4ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHVwZGF0ZVZpc2libGVNYXJrZXJzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXNCcnVzaEFjdGl2ZSgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfdGhpcy5fYnJ1c2hlZENlbGxJbmRleCAhPT0gbnVsbCAmJiBfdGhpcy5fYnJ1c2hTZWxlY3Rpb24gIT09IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXNCcnVzaFNlbGVjdGlvbkVtcHR5KCkgewogICAgICAgICAgICAgICAgcmV0dXJuICghaXNCcnVzaEFjdGl2ZSgpIHx8CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuX2JydXNoU2VsZWN0aW9uWzBdWzBdID09PSBfdGhpcy5fYnJ1c2hTZWxlY3Rpb25bMV1bMF0gfHwKICAgICAgICAgICAgICAgICAgICBfdGhpcy5fYnJ1c2hTZWxlY3Rpb25bMF1bMV0gPT09IF90aGlzLl9icnVzaFNlbGVjdGlvblsxXVsxXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBicnVzaCBlbGVtZW50cyBvbiBlYWNoIGNlbGwuCiAgICAgICAgICAgIGNlbGxzLmNhbGwoYnJ1c2gkMSk7CiAgICAgICAgICAgIGlmIChpc0JydXNoQWN0aXZlKCkpIHsKICAgICAgICAgICAgICAgIC8vIFNldCB0aGUgaW50ZXJuYWwgYnJ1c2ggc2VsZWN0aW9uIHRvIHdoYXQgaXQgd2FzIGJlZm9yZQogICAgICAgICAgICAgICAgLy8gdGhlICdyZWRyYXcoKScuCiAgICAgICAgICAgICAgICBicnVzaCQxLm1vdmUoYnJ1c2hlZENlbGxHLCBfdGhpcy5fYnJ1c2hTZWxlY3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXJzIGZvciBoaWdobGlnaHRpbmcgdGhlIHNlc3Npb24gZ3JvdXAgd2hvc2UgbWFya2VycwogICAgICAgICAgICAvLyBhcmUgY2xvc2VzdCB0byB0aGUgbW91c2UgcG9pbnRlciAob25seSAidmlzaWJsZSIgc2Vzc2lvbiBncm91cHMKICAgICAgICAgICAgLy8gYXJlIGNvbnNpZGVyZWQgLS0gc2VlIGJydXNoaW5nIGFib3ZlKS4gQWxzbywgYWRkIGV2ZW50IGxpc3RlbmVycwogICAgICAgICAgICAvLyBmb3IgbWFraW5nIHRoZSBoaWdobGlnaHRlZCBzZXNzaW9uIGdyb3VwIHRoZSBjdXJyZW50bHktc2VsZWN0ZWQKICAgICAgICAgICAgLy8gZ3JvdXAgYnkgY2xpY2tpbmcuCiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICAgICAgICAvLyBBIGQzLXNlbGVjdGlvbiBjb250YWluaW5nIHRoZSBub2RlcyBpbiBtYXJrZXJzIHJlcHJlc2VudGluZyB0aGUKICAgICAgICAgICAgLy8gU2Vzc2lvbkdyb3VwIHdpdGggYSBtYXJrZXIgY2xvc2VzdCB0byB0aGUgbW91c2UgcG9pbnRlciBvciBudWxsCiAgICAgICAgICAgIC8vIGlmIHRoZSBkaXN0YW5jZSB0byB0aGUgY2xvc2VzdCBzZXNzaW9uIGdyb3VwIGlzIGdyZWF0ZXIgdGhhbiBhCiAgICAgICAgICAgIC8vIHRocmVzaG9sZC4gVGhpcyB3b24ndCBnZXQgc2V0IHVudGlsIHRoZSBmaXJzdCBtb3VzZSBtb3ZlbWVudCBvdmVyCiAgICAgICAgICAgIC8vIGEgY2VsbC4KICAgICAgICAgICAgbGV0IGNsb3Nlc3RNYXJrZXJzID0gbnVsbDsKICAgICAgICAgICAgLy8gQSBkMy1zZWxlY3Rpb24gY29udGFpbmluZyB0aGUgbm9kZXMgaW4gbWFya2VycyByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgIC8vIG1hcmtlcnMgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBzZXNzaW9uIGdyb3VwIG9yIG51bGwgaWYgbm8KICAgICAgICAgICAgLy8gc2Vzc2lvbiBncm91cCBpcyBzZWxlY3RlZC4KICAgICAgICAgICAgbGV0IHNlbGVjdGVkTWFya2VycyA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBzZWxlY3RlZE1hcmtlcnMgPSBzZWxlY3RBbGwoc2Vzc2lvbkdyb3VwTWFya2Vyc01hcC5nZXQodGhpcy5zZWxlY3RlZFNlc3Npb25Hcm91cCkpCiAgICAgICAgICAgICAgICAgICAgLmNsYXNzZWQoJ3NlbGVjdGVkLW1hcmtlcicsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNlbGxzCiAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgY29uc3QgbmV3U2VsZWN0ZWRNYXJrZXJzID0gY2xvc2VzdE1hcmtlcnMgPT09IHNlbGVjdGVkTWFya2VycyA/IG51bGwgOiBjbG9zZXN0TWFya2VyczsKICAgICAgICAgICAgICAgIGlmIChuZXdTZWxlY3RlZE1hcmtlcnMgPT09IHNlbGVjdGVkTWFya2VycykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZE1hcmtlcnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1hcmtlcnMuY2xhc3NlZCgnc2VsZWN0ZWQtbWFya2VyJywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VsZWN0ZWRNYXJrZXJzID0gbmV3U2VsZWN0ZWRNYXJrZXJzOwogICAgICAgICAgICAgICAgaWYgKHNlbGVjdGVkTWFya2VycyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWFya2Vycy5jbGFzc2VkKCdzZWxlY3RlZC1tYXJrZXInLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IG5ld1Nlc3Npb25Hcm91cCA9IHNlbGVjdGVkTWFya2VycyA9PT0gbnVsbAogICAgICAgICAgICAgICAgICAgID8gbnVsbAogICAgICAgICAgICAgICAgICAgIDogLy8gQWxsIGVsZW1lbnRzIGluIHNlbGVjdGVkTWFya2VycyBzaG91bGQgaGF2ZSB0aGUgc2FtZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uR3JvdXAuCiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWFya2Vycy5kYXR1bSgpLnNlc3Npb25Hcm91cDsKICAgICAgICAgICAgICAgIF90aGlzLnNlbGVjdGVkU2Vzc2lvbkdyb3VwID0gbmV3U2Vzc2lvbkdyb3VwOwogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW1vdmUgbW91c2VlbnRlcicsIGZ1bmN0aW9uIChbY29sLCBtZXRyaWNdKSB7CiAgICAgICAgICAgICAgICBjb25zdCBbeCwgeV0gPSBtb3VzZSh0aGlzKTsKICAgICAgICAgICAgICAgIGNvbnN0IG5ld0Nsb3Nlc3RNYXJrZXJzID0gZmluZENsb3Nlc3RNYXJrZXJzKGNvbCwgbWV0cmljLCB4LCB5LCAKICAgICAgICAgICAgICAgIC8qIHRocmVzaG9sZCAqLyAyMCk7CiAgICAgICAgICAgICAgICBpZiAoY2xvc2VzdE1hcmtlcnMgPT09IG5ld0Nsb3Nlc3RNYXJrZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RNYXJrZXJzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdE1hcmtlcnMuY2xhc3NlZCgnY2xvc2VzdC1tYXJrZXInLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjbG9zZXN0TWFya2VycyA9IG5ld0Nsb3Nlc3RNYXJrZXJzOwogICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RNYXJrZXJzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdE1hcmtlcnMuY2xhc3NlZCgnY2xvc2VzdC1tYXJrZXInLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICAvLyBBbGwgZWxlbWVudHMgaW4gY2xvc2VzdE1hcmtlcnMgc2hvdWxkIGhhdmUgdGhlIHNhbWUKICAgICAgICAgICAgICAgICAgICAvLyBzZXNzaW9uR3JvdXAuCiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xvc2VzdFNlc3Npb25Hcm91cCA9IGNsb3Nlc3RNYXJrZXJzLmRhdHVtKCkuc2Vzc2lvbkdyb3VwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgX3RoaXMuY2xvc2VzdFNlc3Npb25Hcm91cCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoW2NvbCwgbWV0cmljXSkgewogICAgICAgICAgICAgICAgaWYgKGNsb3Nlc3RNYXJrZXJzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdE1hcmtlcnMuY2xhc3NlZCgnY2xvc2VzdC1tYXJrZXInLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgY2xvc2VzdE1hcmtlcnMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIF90aGlzLmNsb3Nlc3RTZXNzaW9uR3JvdXAgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gRmluZHMgYSBjbG9zZXN0IHZpc2libGUgbWFya2VyIGluIHRoZSBbY29sLG1ldHJpY10gY2VsbCB0byB0aGUgcG9pbnQKICAgICAgICAgICAgLy8gd2l0aCBjZWxsLXJlbGF0aXZlIGNvb3JkaW5hdGVzICh4LHkpLiBJZiB0aGF0IHBvaW50J3MgZGlzdGFuY2UKICAgICAgICAgICAgLy8gdG8gdGhlIHBvaW50IGF0ICh4LHkpIGlzIGxhcmdlciB0aGFuIHRocmVzaG9sZCwgcmV0dXJucyBudWxsOwogICAgICAgICAgICAvLyBvdGhlcndpc2UgcmV0dXJucyB0aGUgZDMtc2VsZWN0aW9uIGNvbnNpc3Rpbmcgb2YgdGhlIG1hcmtlcnMKICAgICAgICAgICAgLy8gcmVwcmVzZW50aW5nIHRoZSBzZXNzaW9uIGdyb3VwIG9mIHRoYXQgY2xvc2VzdCBtYXJrZXIuCiAgICAgICAgICAgIGZ1bmN0aW9uIGZpbmRDbG9zZXN0TWFya2VycyhtZXRyaWMsIGNvbCwgeCwgeSwgdGhyZXNob2xkKSB7CiAgICAgICAgICAgICAgICBsZXQgbWluRGlzdCA9IEluZmluaXR5OwogICAgICAgICAgICAgICAgbGV0IG1pblNlc3Npb25Hcm91cCA9IG51bGw7CiAgICAgICAgICAgICAgICB1dGlscy5xdWFkVHJlZVZpc2l0UG9pbnRzSW5EaXNrKHF1YWRUcmVlc1ttZXRyaWNdW2NvbF0sIHgsIHksIHRocmVzaG9sZCwgKGVsZW0sIGRpc3RhbmNlVG9DZW50ZXIpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAodmlzaWJsZU1hcmtlcnMuaGFzKGVsZW0pICYmIGRpc3RhbmNlVG9DZW50ZXIgPCBtaW5EaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBzZWxlY3QoZWxlbSkuZGF0dW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgbWluRGlzdCA9IGRpc3RhbmNlVG9DZW50ZXI7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pblNlc3Npb25Hcm91cCA9IGRhdGEuc2Vzc2lvbkdyb3VwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKG1pblNlc3Npb25Hcm91cCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdEFsbChzZXNzaW9uR3JvdXBNYXJrZXJzTWFwLmdldChtaW5TZXNzaW9uR3JvdXApKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICAgICAgLy8gUG9seW1lciBhZGRzIGFuIGV4dHJhICIudGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QiIGNsYXNzIHRvCiAgICAgICAgICAgIC8vIGVhY2ggcnVsZSBzZWxlY3RvciBpbiB0aGUgPHN0eWxlPiBzZWN0aW9uIHdyaXR0ZW4gYWJvdmUuIFdoZW4KICAgICAgICAgICAgLy8gcG9seW1lciBzdGFtcHMgYSB0ZW1wbGF0ZSBpdCBhZGRzIHRoaXMgY2xhc3MgdG8gZXZlcnkgZWxlbWVudAogICAgICAgICAgICAvLyBzdGFtcGVkOyBzaW5jZSB3ZSdyZSBpbmplY3Rpbmcgb3VyIG93biBlbGVtZW50cyBoZXJlLCB3ZSBhZGQgdGhpcwogICAgICAgICAgICAvLyBjbGFzcyB0byBlYWNoIGVsZW1lbnQgc28gdGhhdCB0aGUgc3R5bGUgcnVsZXMgZGVmaW5lZCBhYm92ZSB3aWxsCiAgICAgICAgICAgIC8vIGFwcGx5LgogICAgICAgICAgICB0aGlzLl9zdmcKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJyonKQogICAgICAgICAgICAgICAgLmNsYXNzZWQoJ3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC1wbG90JywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8vIFJldHVybnMgYSBkMyBzY2FsZSBtYXBwaW5nIGVpdGhlciBhIG1ldHJpYyBvciBhbiBocGFyYW0gdmFsdWUKICAgICAgICAvLyB0byB0aGUgY2VsbCdzIGNvb3JkaW5hdGUgc3lzdGVtLiAncmFuZ2UnIHNob3VsZCBiZSBhbiBpbnRlcnZhbCBpbiB0aGUKICAgICAgICAvLyBjZWxsJ3MgY29vcmRpbmF0ZSBzeXN0ZW0gcmVwcmVzZW50aW5nIHRoZSByYW5nZSBvZiB0aGUgc2NhbGUuIFRoZQogICAgICAgIC8vIG1ldHJpYyBvciBocGFyYW0gdG8gYmUgbWFwcGVkIHNob3VsZCBiZSBzcGVjaWZpZWQgYXMgdGhlCiAgICAgICAgLy8gdmlzaWJsZVNjaGVtYS1jb2x1bW4gaW5kZXhlZCBieSBjb2xJbmRleC4KICAgICAgICBfY2VsbFNjYWxlKGNvbEluZGV4LCByYW5nZSkgewogICAgICAgICAgICBjb25zdCBleHRlbnQgPSB0aGlzLl9jb2xFeHRlbnQoY29sSW5kZXgpOwogICAgICAgICAgICBjb25zdCBsaW5lYXJTY2FsZSA9IGxpbmVhciQyKCkuZG9tYWluKGV4dGVudCkucmFuZ2UocmFuZ2UpOwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbHVtbnNbY29sSW5kZXhdLnNjYWxlID09PSAnTElORUFSJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVhclNjYWxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zW2NvbEluZGV4XS5zY2FsZSA9PT0gJ0xPRycpIHsKICAgICAgICAgICAgICAgIGlmIChleHRlbnRbMF0gPD0gMCAmJiBleHRlbnRbMV0gPj0gMCkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IGhhdmUgYSBsb2cgc2NhbGUgZm9yIGRhdGEgd2hvc2UgZXh0ZW50IGNvbnRhaW5zIDAuCiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGEgbGluZWFyIHNjYWxlIGluc3RlYWQuCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhlcmV6KTogQ3JlYXRlIGEgc3ltbG9nIHNjYWxlIHNpbWlsYXIgdG8gTWF0cGxvdGxpYidzCiAgICAgICAgICAgICAgICAgICAgLy8gc3ltbG9nLiBTZWUgYWxzbyBkMyBpc3N1ZSBoZXJlOgogICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9kMy9kMy1zY2FsZS9pc3N1ZXMvMTA1CiAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGIvMTExNzU1NTQwCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpbmVhclNjYWxlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGxvZyQxKCkuZG9tYWluKGV4dGVudCkucmFuZ2UocmFuZ2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMub3B0aW9ucy5jb2x1bW5zW2NvbEluZGV4XS5zY2FsZSA9PT0gJ1FVQU5USUxFJykgewogICAgICAgICAgICAgICAgLy8gQ29tcHV0ZSAyMC1xdWFudGlsZXM6CiAgICAgICAgICAgICAgICBjb25zdCBzdGVwID0gKHJhbmdlWzFdIC0gcmFuZ2VbMF0pIC8gMTk7CiAgICAgICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBzY2FsZSdzIHJhbmdlIHRvIGJlOgogICAgICAgICAgICAgICAgLy8ge3JhbmdlWzBdLCByYW5nZVswXStzdGVwLCAuLi4sIHJhbmdlWzFdfS4KICAgICAgICAgICAgICAgIC8vIGQzLnJhbmdlKHJhbmdlWzBdLCByYW5nZVsxXStzdGVwLCBzdGVwKSBoYXMgbnVtZXJpY2FsCiAgICAgICAgICAgICAgICAvLyBpc3N1ZXMgYW5kIG1heSBwcm9kdWNlIGFuIGV4dHJhIG1lbWJlciwgc28gd2UgdXNlIGEKICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBwcm9jZWR1cmU6CiAgICAgICAgICAgICAgICBjb25zdCBzY2FsZVJhbmdlID0gc2VxdWVuY2UoMjApLm1hcCgoaSkgPT4gcmFuZ2VbMF0gKyBzdGVwICogaSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcXVhbnRpbGUoKQogICAgICAgICAgICAgICAgICAgIC5kb21haW4obG9kYXNoLnVuaXEodGhpcy5zZXNzaW9uR3JvdXBzLm1hcCgoc2cpID0+IHRoaXMuX2NvbFZhbHVlKHNnLCBjb2xJbmRleCkpKSkKICAgICAgICAgICAgICAgICAgICAucmFuZ2Uoc2NhbGVSYW5nZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5vcHRpb25zLmNvbHVtbnNbY29sSW5kZXhdLnNjYWxlID09PSAnTk9OX05VTUVSSUMnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnQkMSgpCiAgICAgICAgICAgICAgICAgICAgLmRvbWFpbigKICAgICAgICAgICAgICAgIC8vIFdlIHNvcnQgdGhlIHNlc3Npb24gZ3JvdXBzIHRvIG1ha2UgdGhlIG9yZGVyCiAgICAgICAgICAgICAgICAvLyBzdGFibGUgYWNyb3NzICdMaXN0U2Vzc2lvbkdyb3VwcycgUlBDcwogICAgICAgICAgICAgICAgbG9kYXNoLnVuaXEodGhpcy5zZXNzaW9uR3JvdXBzLm1hcCgoc2cpID0+IHRoaXMuX2NvbFZhbHVlKHNnLCBjb2xJbmRleCkpLnNvcnQoKSkpCiAgICAgICAgICAgICAgICAgICAgLnJhbmdlKHJhbmdlKQogICAgICAgICAgICAgICAgICAgIC5wYWRkaW5nKDAuMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyAoJ1Vua25vd24gc2NhbGUgZm9yIGNvbHVtbjogJyArIGNvbEluZGV4ICsgJy4gb3B0aW9uczogJyArIHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2NvbFZhbHVlKHNlc3Npb25Hcm91cCwgY29sSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbHVtblZhbHVlQnlWaXNpYmxlSW5kZXgodGhpcy52aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXAsIGNvbEluZGV4KTsKICAgICAgICB9CiAgICAgICAgX21ldHJpY1ZhbHVlKHNlc3Npb25Hcm91cCwgbWV0cmljSW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIG1ldHJpY1ZhbHVlQnlWaXNpYmxlSW5kZXgodGhpcy52aXNpYmxlU2NoZW1hLCBzZXNzaW9uR3JvdXAsIG1ldHJpY0luZGV4KTsKICAgICAgICB9CiAgICAgICAgX2NvbEV4dGVudChjb2xJbmRleCkgewogICAgICAgICAgICByZXR1cm4gdmlzaWJsZU51bWVyaWNDb2x1bW5FeHRlbnQodGhpcy52aXNpYmxlU2NoZW1hLCB0aGlzLnNlc3Npb25Hcm91cHMsIGNvbEluZGV4KTsKICAgICAgICB9CiAgICB9OwogICAgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnRlbXBsYXRlID0gaHRtbCBgCiAgICA8ZGl2IGlkPSJjb250YWluZXIiPgogICAgICA8c3ZnIGlkPSJzdmciPjwvc3ZnPgogICAgPC9kaXY+CgogICAgPHN0eWxlPgogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgICAgc3ZnIHsKICAgICAgICBmb250OiAxMHB4IHNhbnMtc2VyaWY7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjbG9zZXN0IGRhdGEgcG9pbnQgbWFya2VyIHRvIHRoZSBtb3VzZSBwb2ludGVyLiBXZSB1c2UgIWltcG9ydGFudAogICAgICAgICB0byBvdmVycmlkZSB0aGUgaW5saW5lIHN0eWxlIHRoYXQgc2V0cyB0aGUgcmVndWxhciBzdHlsZSBvZiBhIG1hcmtlci4KICAgICAgKi8KICAgICAgLmNsb3Nlc3QtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgIH0KCiAgICAgIC8qIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgZGF0YSBwb2ludCBtYXJrZXIuIFdlIHVzZSAhaW1wb3J0YW50IHRvCiAgICAgICAgIG92ZXJyaWRlIHRoZSBpbmxpbmUgc3R5bGUgdGhhdCBzZXRzIHRoZSByZWd1bGFyIHN0eWxlIG9mIGEgbWFya2VyLiAqLwogICAgICAuc2VsZWN0ZWQtbWFya2VyIHsKICAgICAgICByOiA2ICFpbXBvcnRhbnQ7CiAgICAgICAgZmlsbDogIzBmMCAhaW1wb3J0YW50OwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4UGxvdC5wcm90b3R5cGUsICJ2aXNpYmxlU2NoZW1hIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4UGxvdC5wcm90b3R5cGUsICJzZXNzaW9uR3JvdXBzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnByb3RvdHlwZSwgIm9wdGlvbnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4UGxvdC5wcm90b3R5cGUsICJzZWxlY3RlZFNlc3Npb25Hcm91cCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnByb3RvdHlwZSwgImNsb3Nlc3RTZXNzaW9uR3JvdXAiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBIVE1MRWxlbWVudCkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4UGxvdC5wcm90b3R5cGUsICJfY29udGFpbmVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnByb3RvdHlwZSwgIl9zdmciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkhwYXJhbXNTY2F0dGVyUGxvdE1hdHJpeFBsb3QucHJvdG90eXBlLCAid2lkdGgiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkhwYXJhbXNTY2F0dGVyUGxvdE1hdHJpeFBsb3QucHJvdG90eXBlLCAiaGVpZ2h0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnByb3RvdHlwZSwgIl9icnVzaGVkQ2VsbEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnByb3RvdHlwZSwgIl9icnVzaFNlbGVjdGlvbiIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdzZXNzaW9uR3JvdXBzLionKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4UGxvdC5wcm90b3R5cGUsICJfc2Vzc2lvbkdyb3Vwc0NoYW5nZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3Zpc2libGVTY2hlbWEuKicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90LnByb3RvdHlwZSwgIl92aXNpYmxlU2NoZW1hQ2hhbmdlZCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnb3B0aW9ucy4qJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZkhwYXJhbXNTY2F0dGVyUGxvdE1hdHJpeFBsb3QucHJvdG90eXBlLCAiX3JlZHJhdyIsIG51bGwpOwogICAgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90ID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QnKQogICAgXSwgVGZIcGFyYW1zU2NhdHRlclBsb3RNYXRyaXhQbG90KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQSBEMy1iYXNlZCBpbXBsZW1lbnRhdGlvbiBvZiBhIHNjYXR0ZXIgcGxvdCBtYXRyaXggb2YgdGhlIHNlc3Npb25zCiAgICAgKiBncm91cHMuCiAgICAgKgogICAgICogRm9yIG1vcmUgZGV0YWlscyBvbiBhIHNjYXR0ZXIgcGxvdCBtYXRyaXggdmlzdWFsaXphdGlvbiBzZWUgZm9yIGV4YW1wbGU6CiAgICAgKiBodHRwczovL3d3dy5pdGwubmlzdC5nb3YvZGl2ODk4L2hhbmRib29rL2VkYS9zZWN0aW9uMy9lZGEzM3FiLmh0bQogICAgICoKICAgICAqIFRoZXJlIGFyZSAzIGVsZW1lbnRzIGludm9sdmVkIGluIHRoZSBzY2F0dGVyIHBsb3QgdmlzdWFsaXphdGlvbjoKICAgICAqCiAgICAgKiAxLiA8dGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3Q+CiAgICAgKiAgIFJlbmRlcnMgdGhlIGFjdHVhbCBzY2F0dGVyIHBsb3QgbWF0cml4CiAgICAgKiAyLiA8dGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgKiAgIEEgY29udHJvbCBwYW5lbCBmb3IgY29uZmlndXJpbmcgdGhlIGJlaGF2aW9yIG9mIHRoZSBwbG90IChlLmcuIHNjYWxlCiAgICAgKiAgIG9mIGVhY2ggYXhpcywgY29sb3JtYXAsIGV0Yy4pCiAgICAgKiAzLiA8dGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXZpZXc+CiAgICAgKiAgIFRoZSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIGFib3ZlIDIgZWxlbWVudHMuCiAgICAgKi8KICAgIGxldCBUZkhwYXJhbXNTY2F0dGVyUGxvdE1hdHJpeFZpZXcgPSBjbGFzcyBUZkhwYXJhbXNTY2F0dGVyUGxvdE1hdHJpeFZpZXcgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgX2Nsb3Nlc3RPclNlbGVjdGVkKGNsb3Nlc3RTZXNzaW9uR3JvdXAsIHNlbGVjdGVkU2Vzc2lvbkdyb3VwKSB7CiAgICAgICAgICAgIGlmIChjbG9zZXN0U2Vzc2lvbkdyb3VwICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2xvc2VzdFNlc3Npb25Hcm91cDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRTZXNzaW9uR3JvdXA7CiAgICAgICAgfQogICAgfTsKICAgIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4Vmlldy50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0IG9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+CiAgICAgIDwhLS0gQ29udHJvbHMgYmVoYXZpb3Igb2YgdGhlIHNjYXR0ZXIgcGxvdCBtYXRyaXgKICAgICAgICAgICAgIG91dHB1dHMgdGhlIGNvbmZpZ3VyZWQgb3B0aW9ucyB0byB0aGUgX29wdGlvbnMgcHJvcGVydHkuIC0tPgogICAgICA8dGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHMKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGlkPSJjb250cm9scyIKICAgICAgICBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgb3B0aW9ucz0ie3tfb3B0aW9uc319IgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1zY2FsZS1hbmQtY29sb3ItY29udHJvbHM+CiAgICAgIDwhLS0gVGhlIGFjdHVhbCBzY2F0dGVyIHBsb3QgbWF0cml4IC0tPgogICAgICA8dGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXBsb3QKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGlkPSJwbG90IgogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIgogICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICBzZWxlY3RlZC1zZXNzaW9uLWdyb3VwPSJ7e19zZWxlY3RlZEdyb3VwfX0iCiAgICAgICAgY2xvc2VzdC1zZXNzaW9uLWdyb3VwPSJ7e19jbG9zZXN0R3JvdXB9fSIKICAgICAgICBvcHRpb25zPSJbW19vcHRpb25zXV0iCiAgICAgID4KICAgICAgPC90Zi1ocGFyYW1zLXNjYXR0ZXItcGxvdC1tYXRyaXgtcGxvdD4KICAgICAgPHRmLWhwYXJhbXMtc2Vzc2lvbi1ncm91cC12YWx1ZXMKICAgICAgICBzbG90PSJjb250ZW50IgogICAgICAgIGNsYXNzPSJzZWN0aW9uIgogICAgICAgIGlkPSJ2YWx1ZXMiCiAgICAgICAgdmlzaWJsZS1zY2hlbWE9IltbY29uZmlndXJhdGlvbi52aXNpYmxlU2NoZW1hXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cD0iW1tfY2xvc2VzdE9yU2VsZWN0ZWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9jbG9zZXN0R3JvdXAsIF9zZWxlY3RlZEdyb3VwKV1dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLXZhbHVlcz4KICAgICAgPCEtLSBTaG93cyBzZXNzaW9uIGdyb3VwIGRldGFpbHMgZm9yIHRoZSBjbGlja2VkIG1hcmtlci4gLS0+CiAgICAgIDx0Zi1ocGFyYW1zLXNlc3Npb24tZ3JvdXAtZGV0YWlscwogICAgICAgIHNsb3Q9ImNvbnRlbnQiCiAgICAgICAgY2xhc3M9InNlY3Rpb24iCiAgICAgICAgaWQ9ImRldGFpbHMiCiAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgc2Vzc2lvbi1ncm91cD0iW1tfc2VsZWN0ZWRHcm91cF1dIgogICAgICAgIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIgogICAgICA+CiAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9uLWdyb3VwLWRldGFpbHM+CiAgICA8L2hwYXJhbXMtc3BsaXQtbGF5b3V0PgogICAgPHN0eWxlPgogICAgICAuc2VjdGlvbiB7CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgfQogICAgICAjY29udHJvbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMDsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgICNwbG90IHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBtYXgtaGVpZ2h0OiBmaXQtY29udGVudDsKICAgICAgfQogICAgICAjdmFsdWVzIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgICAgZmxleC1zaHJpbms6IDA7CiAgICAgICAgZmxleC1iYXNpczogYXV0bzsKICAgICAgICBoZWlnaHQ6IDExNXB4OwogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgbWF4LWhlaWdodDogZml0LWNvbnRlbnQ7CiAgICAgIH0KICAgICAgI2RldGFpbHMgewogICAgICAgIGZsZXgtZ3JvdzogMDsKICAgICAgICBmbGV4LXNocmluazogMTsKICAgICAgICBmbGV4LWJhc2lzOiBhdXRvOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIG1heC1oZWlnaHQ6IGZpdC1jb250ZW50OwogICAgICB9CiAgICAgIHZhYWRpbi1zcGxpdC1sYXlvdXQgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNTY2F0dGVyUGxvdE1hdHJpeFZpZXcucHJvdG90eXBlLCAiYmFja2VuZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4Vmlldy5wcm90b3R5cGUsICJleHBlcmltZW50TmFtZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4Vmlldy5wcm90b3R5cGUsICJjb25maWd1cmF0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4Vmlldy5wcm90b3R5cGUsICJzZXNzaW9uR3JvdXBzIiwgdm9pZCAwKTsKICAgIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4VmlldyA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3JykKICAgIF0sIFRmSHBhcmFtc1NjYXR0ZXJQbG90TWF0cml4Vmlldyk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFRoZSB0Zi1ocGFyYW1zLXNlc3Npb24tcGFuZSBlbGVtZW50IGltcGxlbWVudHMgYSB0YWJiZWQgdmlldyBvZiB0aGUKICAgICAqIHNlc3Npb24gZ3JvdXBzLiBFYWNoIHRhYiBpcyBpbXBsZW1lbnRlZCBieSBpdHMgb3duIGVsZW1lbnQgYW5kIHNob3dzCiAgICAgKiBhIHNwZWNpZmljIHZpZXcgb2YgdGhlIHNlc3Npb24gZ3JvdXBzIGxpc3QuIEV4YW1wbGUgb2Ygdmlld3MgYXJlIGEgdGFibGUtdmlldwogICAgICogYW5kIHBhcmFsbGVsLWNvb3JkaW5hdGVzIChodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJhbGxlbF9jb29yZGluYXRlcykKICAgICAqIHZpZXcuCiAgICAgKi8KICAgIGxldCBUZkhwYXJhbXNTZXNzaW9uc1BhbmUgPSBjbGFzcyBUZkhwYXJhbXNTZXNzaW9uc1BhbmUgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVGFiID0gMDsKICAgICAgICB9CiAgICB9OwogICAgVGZIcGFyYW1zU2Vzc2lvbnNQYW5lLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8cGFwZXItaGVhZGVyLXBhbmVsPgogICAgICA8cGFwZXItdG9vbGJhciBzbG90PSJoZWFkZXIiIGNsYXNzPSJ0YWItYmFyIj4KICAgICAgICA8cGFwZXItdGFicyBzZWxlY3RlZD0ie3tfc2VsZWN0ZWRUYWJ9fSIgc2xvdD0idG9wIj4KICAgICAgICAgIDwhLS0gdmlldy1pZCBjYW4gYmUgdXNlZCBieSBpbnRlZ3JhdGlvbiB0ZXN0cyB0byBsb2NhdGUgYSB0YWIuCiAgICAgICAgICAgICAgIEl0IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgcm9vdCBlbGVtZW50IGltcGxlbWVudGluZyB0aGUgdmlldwogICAgICAgICAgICAgICB3aXRob3V0IHRoZSAndGYtaHBhcmFtcy0nIHByZWZpeC4gLS0+CiAgICAgICAgICA8cGFwZXItdGFiIHZpZXctaWQ9InRhYmxlLXZpZXciPiBUQUJMRSBWSUVXIDwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJwYXJhbGxlbC1jb29yZHMtdmlldyI+CiAgICAgICAgICAgIFBBUkFMTEVMIENPT1JESU5BVEVTIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPHBhcGVyLXRhYiB2aWV3LWlkPSJzY2F0dGVyLXBsb3QtbWF0cml4LXZpZXciPgogICAgICAgICAgICBTQ0FUVEVSIFBMT1QgTUFUUklYIFZJRVcKICAgICAgICAgIDwvcGFwZXItdGFiPgogICAgICAgICAgPGRpdiBjbGFzcz0iaGVscC1hbmQtZmVlZGJhY2siPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbYnVnUmVwb3J0VXJsXV0iPgogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmJD0iW1tidWdSZXBvcnRVcmxdXSIKICAgICAgICAgICAgICAgIHRhcmdldD0iX2JsYW5rIgogICAgICAgICAgICAgICAgcmVsPSJub29wZW5lciBub3JlZmVycmVyIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1idXR0b24KICAgICAgICAgICAgICAgICAgaWQ9ImJ1Zy1yZXBvcnQiCiAgICAgICAgICAgICAgICAgIHJhaXNlZAogICAgICAgICAgICAgICAgICB0aXRsZT0iU2VuZCBhIGJ1ZyByZXBvcnQgb3IgZmVhdHVyZSByZXF1ZXN0IgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICBCdWcgUmVwb3J0IC8gRmVhdHVyZSBSZXF1ZXN0CiAgICAgICAgICAgICAgICA8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1toZWxwVXJsXV0iPgogICAgICAgICAgICAgIDxhIGhyZWYkPSJbW2hlbHBVcmxdXSIgdGFyZ2V0PSJfYmxhbmsiIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciI+CiAgICAgICAgICAgICAgICA8cGFwZXItaWNvbi1idXR0b24KICAgICAgICAgICAgICAgICAgaWNvbj0iaGVscC1vdXRsaW5lIgogICAgICAgICAgICAgICAgICB0aXRsZT0iVmlldyBkb2N1bWVudGF0aW9uIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgPC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgICAgICAgICA8L2E+CiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3BhcGVyLXRhYnM+CiAgICAgIDwvcGFwZXItdG9vbGJhcj4KICAgICAgPGlyb24tcGFnZXMgc2VsZWN0ZWQ9IltbX3NlbGVjdGVkVGFiXV0iIGNsYXNzPSJmaXQgdGFiLXZpZXciPgogICAgICAgIDxkaXYgaWQ9IjAiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtdGFibGUtdmlldwogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIHZpc2libGUtc2NoZW1hPSJbW2NvbmZpZ3VyYXRpb24udmlzaWJsZVNjaGVtYV1dIgogICAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0iW1tzZXNzaW9uR3JvdXBzXV0iCiAgICAgICAgICAgIGVuYWJsZS1zaG93LW1ldHJpY3MKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtaHBhcmFtcy10YWJsZS12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjEiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtcGFyYWxsZWwtY29vcmRzLXZpZXcKICAgICAgICAgICAgYmFja2VuZD0iW1tiYWNrZW5kXV0iCiAgICAgICAgICAgIGV4cGVyaW1lbnQtbmFtZT0iW1tleHBlcmltZW50TmFtZV1dIgogICAgICAgICAgICBjb25maWd1cmF0aW9uPSJbW2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9Iltbc2Vzc2lvbkdyb3Vwc11dIgogICAgICAgICAgPgogICAgICAgICAgPC90Zi1ocGFyYW1zLXBhcmFsbGVsLWNvb3Jkcy12aWV3PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgaWQ9IjIiIGNsYXNzPSJ0YWIiPgogICAgICAgICAgPHRmLWhwYXJhbXMtc2NhdHRlci1wbG90LW1hdHJpeC12aWV3CiAgICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgICBleHBlcmltZW50LW5hbWU9IltbZXhwZXJpbWVudE5hbWVdXSIKICAgICAgICAgICAgY29uZmlndXJhdGlvbj0iW1tjb25maWd1cmF0aW9uXV0iCiAgICAgICAgICAgIHNlc3Npb24tZ3JvdXBzPSJbW3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1zY2F0dGVyLXBsb3QtbWF0cml4LXZpZXc+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvaXJvbi1wYWdlcz4KICAgIDwvcGFwZXItaGVhZGVyLXBhbmVsPgoKICAgIDxzdHlsZT4KICAgICAgLnRhYi12aWV3IHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgICAgLnRhYi1iYXIgewogICAgICAgIG92ZXJmbG93LXk6IGF1dG87CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigKICAgICAgICAgIC0tdGItdG9vbGJhci1iYWNrZ3JvdW5kLWNvbG9yLAogICAgICAgICAgdmFyKC0tdGItb3JhbmdlLXN0cm9uZykKICAgICAgICApOwogICAgICB9CiAgICAgIC50YWIgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgICBwYXBlci10YWJzIHsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIC0tcGFwZXItdGFicy1zZWxlY3Rpb24tYmFyLWNvbG9yOiB3aGl0ZTsKICAgICAgICAtLXBhcGVyLXRhYnMtY29udGVudDogewogICAgICAgICAgLXdlYmtpdC1mb250LXNtb290aGluZzogYW50aWFsaWFzZWQ7CiAgICAgICAgfQogICAgICB9CiAgICAgIHRmLWhwYXJhbXMtdGFibGUtdmlldyB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICAgIC5oZWxwLWFuZC1mZWVkYmFjayB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWZsZXg7IC8qIEVuc3VyZSB0aGF0IGljb25zIHN0YXkgYWxpZ25lZCAqLwogICAgICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7CiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjsKICAgICAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgICAgICBjb2xvcjogd2hpdGU7CiAgICAgIH0KICAgICAgI2J1Zy1yZXBvcnQgewogICAgICAgIGJvcmRlcjogc29saWQgYmxhY2s7CiAgICAgICAgYmFja2dyb3VuZDogcmVkOwogICAgICAgIHdoaXRlLXNwYWNlOiBub3JtYWw7CiAgICAgICAgd29yZC1icmVhazogYnJlYWstd29yZHM7CiAgICAgICAgZm9udC1zaXplOiAxMnB4OwogICAgICAgIG1heC13aWR0aDogMTUwcHg7CiAgICAgICAgdGV4dC1hbGlnbjogbGVmdDsKICAgICAgfQogICAgICAuaGVscC1hbmQtZmVlZGJhY2sgYSB7CiAgICAgICAgY29sb3I6IHdoaXRlOwogICAgICAgIHRleHQtZGVjb3JhdGlvbjogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNTZXNzaW9uc1BhbmUucHJvdG90eXBlLCAiYmFja2VuZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25zUGFuZS5wcm90b3R5cGUsICJoZWxwVXJsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZIcGFyYW1zU2Vzc2lvbnNQYW5lLnByb3RvdHlwZSwgImJ1Z1JlcG9ydFVybCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25zUGFuZS5wcm90b3R5cGUsICJleHBlcmltZW50TmFtZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25zUGFuZS5wcm90b3R5cGUsICJjb25maWd1cmF0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmSHBhcmFtc1Nlc3Npb25zUGFuZS5wcm90b3R5cGUsICJzZXNzaW9uR3JvdXBzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogTnVtYmVyLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZIcGFyYW1zU2Vzc2lvbnNQYW5lLnByb3RvdHlwZSwgIl9zZWxlY3RlZFRhYiIsIHZvaWQgMCk7CiAgICBUZkhwYXJhbXNTZXNzaW9uc1BhbmUgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1ocGFyYW1zLXNlc3Npb25zLXBhbmUnKQogICAgXSwgVGZIcGFyYW1zU2Vzc2lvbnNQYW5lKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qIEEgJ3RmLWhwYXJhbXMtYmFja2VuZCcgZW5jYXBzdWxhdGVzIHNlbmRpbmcgSFBhcmFtcyBBUEkgcmVxdWVzdHMgdG8gdGhlCiAgICAgICBiYWNrZW5kLgogICAgICAgQW55IGltcGxlbWVudGF0aW9uIHdpdGggdGhlIHNhbWUgcHVibGljIGludGVyZmFjZSBjYW4gYmUgcGFzc2VkIHRvCiAgICAgICB0Zi1ocGFyYW1zLW1haW4gYXMgdGhlICdiYWNrZW5kJyBwcm9wZXJ0eS4KICAgICovCiAgICBjbGFzcyBCYWNrZW5kIHsKICAgICAgICAvLyBDb25zdHJ1Y3RzIGEgYmFja2VuZCB0aGF0IHVzZXMgdGhlIGdpdmVuIHRmX2JhY2tlbmQucmVxdWVzdE1hbmFnZXIgdG8KICAgICAgICAvLyBzZW5kIHJlcXVlc3RzLiBUaGUgYXBpVXJsIHBhcmFtZXRlciBzaG91bGQgZGVub3RlIHRoZSBiYXNlCiAgICAgICAgLy8gdXJsIHRvIHVzZS4gSWYgdXNlSHR0cEdldCBpcyB0cnVlIHVzZXMgSFRUUCBHRVQgdG8gc2VuZCBhIHJlcXVlc3QKICAgICAgICAvLyBvdGhlcndpc2UgdXNlcyBIVFRQIFBPU1QuIFNlZSB0ZW5zb3Jib2FyZC9wbHVnaW5zL2hwYXJhbXMvaHR0cF9hcGkubWQKICAgICAgICAvLyBmb3IgZGV0YWlscyBvbiBob3cgdGhlIHJlcXVlc3RzIGFuZCByZXNwb25zZXMgYXJlIGVuY29kZWQgaW4gZWFjaAogICAgICAgIC8vIHNjaGVtZSAoR0VUIG9yIFBPU1QpLgogICAgICAgIGNvbnN0cnVjdG9yKGFwaVVybCwgcmVxdWVzdE1hbmFnZXIsIHVzZUh0dHBHZXQgPSB0cnVlKSB7CiAgICAgICAgICAgIHRoaXMuX2FwaVVybCA9IGFwaVVybDsKICAgICAgICAgICAgdGhpcy5fcmVxdWVzdE1hbmFnZXIgPSByZXF1ZXN0TWFuYWdlcjsKICAgICAgICAgICAgdGhpcy5fdXNlSHR0cEdldCA9IHVzZUh0dHBHZXQ7CiAgICAgICAgfQogICAgICAgIC8vIEluIHRoZSBBUEkgbWV0aG9kcyBiZWxvdywgJ3JlcXVlc3QnIHNob3VsZCBiZSBhIEpTT04gdHJhbnNsYXRlZCByZXF1ZXN0CiAgICAgICAgLy8gcHJvdG9jb2wgYnVmZmVyIGFuZCB0aGUgcmVzcG9uc2UgaXMgYSBKU09OIHRyYW5zbGF0ZWQgcmVzcG9uc2UgcHJvdG9jb2wKICAgICAgICAvLyBidWZmZXIuIFNlZSBhcGkucHJvdG8gZm9yIHRoZSBkZXRhaWxzLgogICAgICAgIGdldEV4cGVyaW1lbnQoZXhwZXJpbWVudFJlcXVlc3QpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCdleHBlcmltZW50JywgZXhwZXJpbWVudFJlcXVlc3QpOwogICAgICAgIH0KICAgICAgICBnZXREb3dubG9hZFVybChmb3JtYXQsIGxpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCwgY29sdW1uc1Zpc2liaWxpdHkpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9hcGlVcmwgKwogICAgICAgICAgICAgICAgJy9kb3dubG9hZF9kYXRhPycgKwogICAgICAgICAgICAgICAgbmV3IFVSTFNlYXJjaFBhcmFtcyh7CiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgY29sdW1uc1Zpc2liaWxpdHk6IEpTT04uc3RyaW5naWZ5KGNvbHVtbnNWaXNpYmlsaXR5KSwKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0OiBKU09OLnN0cmluZ2lmeShsaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QpLAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBsaXN0U2Vzc2lvbkdyb3VwcyhsaXN0U2Vzc2lvbkdyb3Vwc1JlcXVlc3QpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbmRSZXF1ZXN0KCdzZXNzaW9uX2dyb3VwcycsIGxpc3RTZXNzaW9uR3JvdXBzUmVxdWVzdCk7CiAgICAgICAgfQogICAgICAgIGxpc3RNZXRyaWNFdmFscyhsaXN0TWV0cmljRXZhbHNSZXF1ZXN0KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZW5kUmVxdWVzdCgnbWV0cmljX2V2YWxzJywgbGlzdE1ldHJpY0V2YWxzUmVxdWVzdCk7CiAgICAgICAgfQogICAgICAgIC8vIC0tLS0gUHJpdmF0ZSBtZXRob2RzIGJlbG93IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAgICBfc2VuZFJlcXVlc3QobWV0aG9kTmFtZSwgcmVxdWVzdF9wcm90bykgewogICAgICAgICAgICBpZiAodGhpcy5fdXNlSHR0cEdldCkgewogICAgICAgICAgICAgICAgY29uc3QgZW5jb2RlZFJlcXVlc3QgPSBlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkocmVxdWVzdF9wcm90bykpOwogICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fYXBpVXJsICsgJy8nICsgbWV0aG9kTmFtZSArICc/cmVxdWVzdD0nICsgZW5jb2RlZFJlcXVlc3Q7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qIFVzZSBQT1NUICovCiAgICAgICAgICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0gbmV3IFJlcXVlc3RPcHRpb25zKCk7CiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zLndpdGhDcmVkZW50aWFscyA9IHRydWU7CiAgICAgICAgICAgIHJlcXVlc3RPcHRpb25zLm1ldGhvZFR5cGUgPSBIdHRwTWV0aG9kVHlwZS5QT1NUOwogICAgICAgICAgICByZXF1ZXN0T3B0aW9ucy5jb250ZW50VHlwZSA9ICd0ZXh0L3BsYWluJzsKICAgICAgICAgICAgcmVxdWVzdE9wdGlvbnMuYm9keSA9IEpTT04uc3RyaW5naWZ5KHJlcXVlc3RfcHJvdG8pOwogICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9hcGlVcmwgKyAnLycgKyBtZXRob2ROYW1lOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdFdpdGhPcHRpb25zKHVybCwgcmVxdWVzdE9wdGlvbnMpOwogICAgICAgIH0KICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogVGhlIGVudHJ5IHBvaW50IGludG8gdGhlIGhwYXJhbXMgcGx1Z2luIGZyb250ZW5kLgogICAgICogQSBjb250YWluZXIgZm9yIHR3byBzdWItZWxlbWVudHM6CiAgICAgKiAxLiBUaGUgcXVlcnktcGFuZSBlbmNhcHN1bGF0ZWQgYnkgdGhlIHRmLWhwYXJhbXMtcXVlcnktcGFuZSBlbGVtZW50LiBUaGlzCiAgICAgKiBlbGVtZW50IGlzc3VlcyBxdWVyaWVzIHRvIHRoZSBiYWNrZW5kIHRvIGdldCBhIGxpc3Qgb2Ygc2Vzc2lvbiBncm91cHMuIEl0IGhhcwogICAgICogY29udHJvbHMgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSBmaWx0ZXJzIGFuZCBzb3J0aW5nIG9wdGlvbnMgaW4gdGhlCiAgICAgKiBpc3N1ZWQtcXVlcnkuIFRoZSBhY3R1YWwgZmlsdGVyaW5nIGFuZCBzb3J0aW5nIGlzIGRvbmUgYnkgdGhlIGJhY2tlbmQuCiAgICAgKiAyLiBUaGUgc2Vzc2lvbi1wYW5lIGVuY2Fwc3VsYXRlZCBieSB0aGUgdGYtaHBhcmFtcy1zZXNzaW9uLXBhbmUgZWxlbWVudC4gVGhpcwogICAgICogZWxlbWVudCBkaXNwbGF5cyBtdWx0aXBsZSB0YWJzLS1lYWNoIHByb3ZpZGluZyBhICJ2aWV3IiBvZiB0aGUgbGlzdCBvZgogICAgICogc2Vzc2lvbiBncm91cHMuIEV4YW1wbGUgb2Ygdmlld3MgYXJlIGEgdGFibGUtdmlldyBhbmQgYSBwYXJhbGxlbC1jb29yZGluYXRlCiAgICAgKiB2aWV3LgogICAgICoKICAgICAqIFRPRE8oZXJleik6IEFkZCBhZ2dyZWdhdGlvbiBvZiByZXBlYXRlZCB0cmlhbHMuCiAgICAgKi8KICAgIGxldCBUZkhwYXJhbXNNYWluID0gY2xhc3MgVGZIcGFyYW1zTWFpbiBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihQb2x5bWVyRWxlbWVudCkgewogICAgICAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCB0byByZWZyZXNoIHRoZSBwbHVnaW4uCiAgICAgICAgcmVsb2FkKCkgewogICAgICAgICAgICB0aGlzLiRbJ3F1ZXJ5LXBhbmUnXS5yZWxvYWQoKTsKICAgICAgICB9CiAgICB9OwogICAgVGZIcGFyYW1zTWFpbi50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPGhwYXJhbXMtc3BsaXQtbGF5b3V0PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJzaWRlYmFyIj4KICAgICAgICA8dGYtaHBhcmFtcy1xdWVyeS1wYW5lCiAgICAgICAgICBpZD0icXVlcnktcGFuZSIKICAgICAgICAgIGJhY2tlbmQ9IltbYmFja2VuZF1dIgogICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICBjb25maWd1cmF0aW9uPSJ7e19jb25maWd1cmF0aW9ufX0iCiAgICAgICAgICBzZXNzaW9uLWdyb3Vwcz0ie3tfc2Vzc2lvbkdyb3Vwc319IgogICAgICAgICAgZGF0YS1sb2FkZWQtd2l0aC1ub24tZW1wdHktaHBhcmFtcz0ie3tfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXN9fSIKICAgICAgICAgIGRhdGEtbG9hZGVkLXdpdGgtZW1wdHktaHBhcmFtcz0ie3tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXN9fSIKICAgICAgICA+CiAgICAgICAgPC90Zi1ocGFyYW1zLXF1ZXJ5LXBhbmU+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2IHNsb3Q9ImNvbnRlbnQiIGNsYXNzPSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhFbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJuby1kYXRhLXdhcm5pbmciPgogICAgICAgICAgICA8aDM+Tm8gaHBhcmFtcyBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgaHBhcmFtcyBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+CiAgICAgICAgICAgICAgICBFdmVudCBmaWxlcyBhcmUgc3RpbGwgYmVpbmcgbG9hZGVkICh0cnkgcmVsb2FkaW5nIHRoaXMgcGFnZSkuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YUxvYWRlZFdpdGhOb25FbXB0eUhwYXJhbXNdXSI+CiAgICAgICAgICA8dGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lCiAgICAgICAgICAgIGlkPSJzZXNzaW9ucy1wYW5lIgogICAgICAgICAgICBiYWNrZW5kPSJbW2JhY2tlbmRdXSIKICAgICAgICAgICAgaGVscC11cmw9IltbaGVscFVybF1dIgogICAgICAgICAgICBidWctcmVwb3J0LXVybD0iW1tidWdSZXBvcnRVcmxdXSIKICAgICAgICAgICAgZXhwZXJpbWVudC1uYW1lPSJbW2V4cGVyaW1lbnROYW1lXV0iCiAgICAgICAgICAgIGNvbmZpZ3VyYXRpb249IltbX2NvbmZpZ3VyYXRpb25dXSIKICAgICAgICAgICAgc2Vzc2lvbi1ncm91cHM9IltbX3Nlc3Npb25Hcm91cHNdXSIKICAgICAgICAgID4KICAgICAgICAgIDwvdGYtaHBhcmFtcy1zZXNzaW9ucy1wYW5lPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC9ocGFyYW1zLXNwbGl0LWxheW91dD4KICAgIDxzdHlsZT4KICAgICAgaHBhcmFtcy1zcGxpdC1sYXlvdXQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CgogICAgICAuc2lkZWJhciB7CiAgICAgICAgd2lkdGg6IDIwJTsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgZmxleC1ncm93OiAwOwogICAgICAgIGZsZXgtc2hyaW5rOiAwOwogICAgICAgIG1pbi13aWR0aDogMTAlOwogICAgICB9CgogICAgICAuY2VudGVyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgb3ZlcmZsb3cteTogYXV0bzsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZmxleC1zaHJpbms6IDE7CiAgICAgICAgd2lkdGg6IDgwJTsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KCiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJhY2tlbmQpCiAgICBdLCBUZkhwYXJhbXNNYWluLnByb3RvdHlwZSwgImJhY2tlbmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkhwYXJhbXNNYWluLnByb3RvdHlwZSwgImV4cGVyaW1lbnROYW1lIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZIcGFyYW1zTWFpbi5wcm90b3R5cGUsICJoZWxwVXJsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZIcGFyYW1zTWFpbi5wcm90b3R5cGUsICJidWdSZXBvcnRVcmwiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkhwYXJhbXNNYWluLnByb3RvdHlwZSwgIl9jb25maWd1cmF0aW9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmSHBhcmFtc01haW4ucHJvdG90eXBlLCAiX3Nlc3Npb25Hcm91cHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmSHBhcmFtc01haW4ucHJvdG90eXBlLCAiX2RhdGFMb2FkZWRXaXRoTm9uRW1wdHlIcGFyYW1zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkhwYXJhbXNNYWluLnByb3RvdHlwZSwgIl9kYXRhTG9hZGVkV2l0aEVtcHR5SHBhcmFtcyIsIHZvaWQgMCk7CiAgICBUZkhwYXJhbXNNYWluID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtaHBhcmFtcy1tYWluJykKICAgIF0sIFRmSHBhcmFtc01haW4pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLy8gUmVhZCBVUkwgYXQgbW9kdWxlIGltcG9ydCB0aW1lLCBiZWZvcmUgQXBwUm91dGluZ0VmZmVjdHMgc3RvbXBzIGl0LgogICAgY29uc3QgaW5Db2xhYiA9IG5ldyBVUkxTZWFyY2hQYXJhbXMod2luZG93LmxvY2F0aW9uLnNlYXJjaCkuZ2V0KCd0ZW5zb3Jib2FyZENvbGFiJykgPT09CiAgICAgICAgJ3RydWUnOwogICAgY29uc3QgUExVR0lOX05BTUUgPSAnaHBhcmFtcyc7CiAgICBsZXQgVGZIcGFyYW1zRGFzaGJvYXJkID0gY2xhc3MgVGZIcGFyYW1zRGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX2JhY2tlbmQgPSBuZXcgQmFja2VuZCgKICAgICAgICAgICAgLyogYXBpVXJsPSAqLyBnZXRSb3V0ZXIoKQogICAgICAgICAgICAgICAgLnBsdWdpblJvdXRlKC8qIHBsdWdpbk5hbWU9ICovIFBMVUdJTl9OQU1FLCAvKiByb3V0ZT0gKi8gJycpLCBuZXcgUmVxdWVzdE1hbmFnZXIoKSwgCiAgICAgICAgICAgIC8qIFVzZSBHRVRzIGlmIHdlJ3JlIHJ1bm5pbmcgaW4gY29sYWIgKGR1ZSB0byBiLzEyNjM4NzEwNikuCiAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSB1c2UgUE9TVHMuICovCiAgICAgICAgICAgIC8qIHVzZUh0dHBHZXQ9ICovIGluQ29sYWIpOwogICAgICAgIH0KICAgICAgICAvLyBUaGlzIGlzIGNhbGxlZCBieSB0aGUgdGVuc29yYm9hcmQgd2ViIGZyYW1ld29yayB0byByZWZyZXNoIHRoZSBwbHVnaW4uCiAgICAgICAgcmVsb2FkKCkgewogICAgICAgICAgICB0aGlzLiRbJ2hwYXJhbXMtbWFpbiddLnJlbG9hZCgpOwogICAgICAgIH0KICAgIH07CiAgICBUZkhwYXJhbXNEYXNoYm9hcmQudGVtcGxhdGUgPSBodG1sIGAKICAgIDwhLS0gVGVuc29yQm9hcmQgZG9lcyBub3Qgc3BlY2lmeSBhbiBleHBlcmltZW50TmFtZS4gQ3VycmVudGx5IGl0IG9ubHkKICAgICAgICAgc3VwcG9ydHMgb25lIGV4cGVyaW1lbnQgcGVyIGludm9jYXRpb24uIC0tPgogICAgPHRmLWhwYXJhbXMtbWFpbgogICAgICBpZD0iaHBhcmFtcy1tYWluIgogICAgICBiYWNrZW5kPSJbW19iYWNrZW5kXV0iCiAgICAgIGV4cGVyaW1lbnQtbmFtZT0iIgogICAgPgogICAgPC90Zi1ocGFyYW1zLW1haW4+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZIcGFyYW1zRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9iYWNrZW5kIiwgdm9pZCAwKTsKICAgIFRmSHBhcmFtc0Rhc2hib2FyZCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLWhwYXJhbXMtZGFzaGJvYXJkJykKICAgIF0sIFRmSHBhcmFtc0Rhc2hib2FyZCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZJbWFnZUxvYWRlciA9IGNsYXNzIFRmSW1hZ2VMb2FkZXIgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgdGhpcy5hY3R1YWxTaXplID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuYnJpZ2h0bmVzc0FkanVzdG1lbnQgPSAwLjU7CiAgICAgICAgICAgIHRoaXMuY29udHJhc3RQZXJjZW50YWdlID0gMDsKICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIgPSBuZXcgQ2FuY2VsbGVyKCk7CiAgICAgICAgICAgIHRoaXMuX2ltYWdlQ2FuY2VsbGVyID0gbmV3IENhbmNlbGxlcigpOwogICAgICAgICAgICB0aGlzLl9zdGVwcyA9IFtdOwogICAgICAgICAgICB0aGlzLl9pc0ltYWdlTG9hZGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBnZXQgX3J1bkNvbG9yKCkgewogICAgICAgICAgICB2YXIgcnVuID0gdGhpcy5ydW47CiAgICAgICAgICAgIHJldHVybiBydW5zQ29sb3JTY2FsZShydW4pOwogICAgICAgIH0KICAgICAgICBnZXQgX2hhc0F0TGVhc3RPbmVTdGVwKCkgewogICAgICAgICAgICB2YXIgc3RlcHMgPSB0aGlzLl9zdGVwczsKICAgICAgICAgICAgcmV0dXJuICEhc3RlcHMgJiYgc3RlcHMubGVuZ3RoID4gMDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9oYXNNdWx0aXBsZVN0ZXBzKCkgewogICAgICAgICAgICB2YXIgc3RlcHMgPSB0aGlzLl9zdGVwczsKICAgICAgICAgICAgcmV0dXJuICEhc3RlcHMgJiYgc3RlcHMubGVuZ3RoID4gMTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jdXJyZW50U3RlcCgpIHsKICAgICAgICAgICAgdmFyIHN0ZXBzID0gdGhpcy5fc3RlcHM7CiAgICAgICAgICAgIHZhciBzdGVwSW5kZXggPSB0aGlzLl9zdGVwSW5kZXg7CiAgICAgICAgICAgIHJldHVybiBzdGVwc1tzdGVwSW5kZXhdIHx8IG51bGw7CiAgICAgICAgfQogICAgICAgIGdldCBfc3RlcFZhbHVlKCkgewogICAgICAgICAgICB2YXIgY3VycmVudFN0ZXAgPSB0aGlzLl9jdXJyZW50U3RlcDsKICAgICAgICAgICAgaWYgKCFjdXJyZW50U3RlcCkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gY3VycmVudFN0ZXAuc3RlcDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jdXJyZW50V2FsbFRpbWUoKSB7CiAgICAgICAgICAgIHZhciBjdXJyZW50U3RlcCA9IHRoaXMuX2N1cnJlbnRTdGVwOwogICAgICAgICAgICBpZiAoIWN1cnJlbnRTdGVwKQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSQxKGN1cnJlbnRTdGVwLndhbGxfdGltZSk7CiAgICAgICAgfQogICAgICAgIGdldCBfbWF4U3RlcEluZGV4KCkgewogICAgICAgICAgICB2YXIgc3RlcHMgPSB0aGlzLl9zdGVwczsKICAgICAgICAgICAgcmV0dXJuIHN0ZXBzLmxlbmd0aCAtIDE7CiAgICAgICAgfQogICAgICAgIGdldCBfc2FtcGxlVGV4dCgpIHsKICAgICAgICAgICAgdmFyIHNhbXBsZSA9IHRoaXMuc2FtcGxlOwogICAgICAgICAgICByZXR1cm4gYCR7c2FtcGxlICsgMX1gOwogICAgICAgIH0KICAgICAgICBnZXQgX2hhc011bHRpcGxlU2FtcGxlcygpIHsKICAgICAgICAgICAgdmFyIG9mU2FtcGxlcyA9IHRoaXMub2ZTYW1wbGVzOwogICAgICAgICAgICByZXR1cm4gb2ZTYW1wbGVzID4gMTsKICAgICAgICB9CiAgICAgICAgX2dldEFyaWFFeHBhbmRlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0dWFsU2l6ZSA/ICd0cnVlJyA6ICdmYWxzZSc7CiAgICAgICAgfQogICAgICAgIGF0dGFjaGVkKCkgewogICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICByZWxvYWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc0F0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbWV0YWRhdGFDYW5jZWxsZXIuY2FuY2VsQWxsKCk7CiAgICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGdldFJvdXRlcigpOwogICAgICAgICAgICBjb25zdCB1cmwgPSBhZGRQYXJhbXMocm91dGVyLnBsdWdpblJvdXRlKCdpbWFnZXMnLCAnL2ltYWdlcycpLCB7CiAgICAgICAgICAgICAgICB0YWc6IHRoaXMudGFnLAogICAgICAgICAgICAgICAgcnVuOiB0aGlzLnJ1biwKICAgICAgICAgICAgICAgIHNhbXBsZTogdGhpcy5zYW1wbGUsCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBjb25zdCB1cGRhdGVTdGVwcyA9IHRoaXMuX21ldGFkYXRhQ2FuY2VsbGVyLmNhbmNlbGxhYmxlKChyZXN1bHQpID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuY2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZXBzID0gZGF0YS5tYXAodGhpcy5fY3JlYXRlU3RlcERhdHVtLmJpbmQodGhpcykpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19zdGVwcycsIHN0ZXBzKTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfc3RlcEluZGV4Jywgc3RlcHMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKHVwZGF0ZVN0ZXBzKTsKICAgICAgICB9CiAgICAgICAgX2NyZWF0ZVN0ZXBEYXR1bShpbWFnZU1ldGFkYXRhKSB7CiAgICAgICAgICAgIGxldCB1cmwgPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnaW1hZ2VzJywgJy9pbmRpdmlkdWFsSW1hZ2UnKTsKICAgICAgICAgICAgLy8gSW5jbHVkZSB3YWxsX3RpbWUganVzdCB0byBkaXNhbWJpZ3VhdGUgdGhlIFVSTCBhbmQgZm9yY2UKICAgICAgICAgICAgLy8gdGhlIGJyb3dzZXIgdG8gcmVsb2FkIHRoZSBpbWFnZSB3aGVuIHRoZSBVUkwgY2hhbmdlcy4gVGhlCiAgICAgICAgICAgIC8vIGJhY2tlbmQgZG9lc24ndCBjYXJlIGFib3V0IHRoZSB2YWx1ZS4KICAgICAgICAgICAgdXJsID0gYWRkUGFyYW1zKHVybCwgeyB0czogaW1hZ2VNZXRhZGF0YS53YWxsX3RpbWUgfSk7CiAgICAgICAgICAgIHVybCArPSAnJicgKyBpbWFnZU1ldGFkYXRhLnF1ZXJ5OwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgLy8gVGhlIHdhbGwgdGltZSB3aXRoaW4gdGhlIG1ldGFkYXRhIGlzIGluIHNlY29uZHMuIFRoZSBEYXRlCiAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBhY2NlcHRzIGEgdGltZSBpbiBtaWxsaXNlY29uZHMsIHNvIHdlIG11bHRpcGx5IGJ5IDEwMDAuCiAgICAgICAgICAgICAgICB3YWxsX3RpbWU6IG5ldyBEYXRlKGltYWdlTWV0YWRhdGEud2FsbF90aW1lICogMTAwMCksCiAgICAgICAgICAgICAgICBzdGVwOiBpbWFnZU1ldGFkYXRhLnN0ZXAsCiAgICAgICAgICAgICAgICB1cmwsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIF91cGRhdGVJbWFnZVVybCgpIHsKICAgICAgICAgICAgdmFyIGN1cnJlbnRTdGVwID0gdGhpcy5fY3VycmVudFN0ZXA7CiAgICAgICAgICAgIHZhciBicmlnaHRuZXNzQWRqdXN0bWVudCA9IHRoaXMuYnJpZ2h0bmVzc0FkanVzdG1lbnQ7CiAgICAgICAgICAgIHZhciBjb250cmFzdFBlcmNlbnRhZ2UgPSB0aGlzLmNvbnRyYXN0UGVyY2VudGFnZTsKICAgICAgICAgICAgLy8gV2UgbWFudWFsbHkgY2hhbmdlIHRoZSBpbWFnZSBVUkwgKGluc3RlYWQgb2YgYmluZGluZyB0byB0aGUKICAgICAgICAgICAgLy8gaW1hZ2UncyBzcmMgYXR0cmlidXRlKSBiZWNhdXNlIHdlIHdvdWxkIGxpa2UgdG8gbWFuYWdlIHdoYXQKICAgICAgICAgICAgLy8gaGFwcGVucyB3aGVuIHRoZSBpbWFnZSBzdGFydHMgYW5kIHN0b3BzIGxvYWRpbmcuCiAgICAgICAgICAgIGlmICghY3VycmVudFN0ZXApCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGltZyA9IG5ldyBJbWFnZSgpOwogICAgICAgICAgICB0aGlzLl9pbWFnZUNhbmNlbGxlci5jYW5jZWxBbGwoKTsKICAgICAgICAgICAgaW1nLm9ubG9hZCA9IGltZy5vbmVycm9yID0gdGhpcy5faW1hZ2VDYW5jZWxsZXIKICAgICAgICAgICAgICAgIC5jYW5jZWxsYWJsZSgocmVzdWx0KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmNhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IG1haW5JbWFnZUNvbnRhaW5lciA9IHRoaXMuJCQoJyNtYWluLWltYWdlLWNvbnRhaW5lcicpOwogICAgICAgICAgICAgICAgbWFpbkltYWdlQ29udGFpbmVyLnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgICAgICBkb20obWFpbkltYWdlQ29udGFpbmVyKS5hcHBlbmRDaGlsZChpbWcpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19pc0ltYWdlTG9hZGluZycsIGZhbHNlKTsKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5iaW5kKHRoaXMpOwogICAgICAgICAgICBpbWcuc3R5bGUuZmlsdGVyID0gYGNvbnRyYXN0KCR7Y29udHJhc3RQZXJjZW50YWdlfSUpIGA7CiAgICAgICAgICAgIGltZy5zdHlsZS5maWx0ZXIgKz0gYGJyaWdodG5lc3MoJHticmlnaHRuZXNzQWRqdXN0bWVudH0pYDsKICAgICAgICAgICAgLy8gTG9hZCB0aGUgbmV3IGltYWdlLgogICAgICAgICAgICB0aGlzLnNldCgnX2lzSW1hZ2VMb2FkaW5nJywgdHJ1ZSk7CiAgICAgICAgICAgIGltZy5zcmMgPSBjdXJyZW50U3RlcC51cmw7CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVUYXAoZSkgewogICAgICAgICAgICB0aGlzLnNldCgnYWN0dWFsU2l6ZScsICF0aGlzLmFjdHVhbFNpemUpOwogICAgICAgIH0KICAgICAgICBfdG9Mb2NhbGVTdHJpbmcobnVtYmVyKSB7CiAgICAgICAgICAgIC8vIFNob3dzIGNvbW1hcyAob3IgbG9jYWxlLWFwcHJvcHJpYXRlIHB1bmN0dWF0aW9uKSBmb3IgbGFyZ2UgbnVtYmVycy4KICAgICAgICAgICAgcmV0dXJuIG51bWJlci50b0xvY2FsZVN0cmluZygpOwogICAgICAgIH0KICAgIH07CiAgICBUZkltYWdlTG9hZGVyLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGYtY2FyZC1oZWFkaW5nCiAgICAgIHRhZz0iW1t0YWddXSIKICAgICAgcnVuPSJbW3J1bl1dIgogICAgICBkaXNwbGF5LW5hbWU9IltbdGFnTWV0YWRhdGEuZGlzcGxheU5hbWVdXSIKICAgICAgZGVzY3JpcHRpb249IltbdGFnTWV0YWRhdGEuZGVzY3JpcHRpb25dXSIKICAgICAgY29sb3I9IltbX3J1bkNvbG9yXV0iCiAgICA+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzTXVsdGlwbGVTYW1wbGVzXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19zYW1wbGVUZXh0XV0gb2YgW1tvZlNhbXBsZXNdXTwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc0F0TGVhc3RPbmVTdGVwXV0iPgogICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctcm93Ij4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwiPgogICAgICAgICAgICBzdGVwCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJmb250LXdlaWdodDogYm9sZCIKICAgICAgICAgICAgICA+W1tfdG9Mb2NhbGVTdHJpbmcoX3N0ZXBWYWx1ZSldXTwvc3BhbgogICAgICAgICAgICA+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImhlYWRpbmctbGFiZWwgaGVhZGluZy1yaWdodCBkYXRldGltZSI+CiAgICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfY3VycmVudFdhbGxUaW1lXV0iPgogICAgICAgICAgICAgIFtbX2N1cnJlbnRXYWxsVGltZV1dCiAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9ImxhYmVsIHJpZ2h0Ij4KICAgICAgICAgICAgPHBhcGVyLXNwaW5uZXItbGl0ZSBhY3RpdmUgaGlkZGVuJD0iW1shX2lzSW1hZ2VMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHNdXSI+CiAgICAgICAgPGRpdj4KICAgICAgICAgIDxwYXBlci1zbGlkZXIKICAgICAgICAgICAgaWQ9InN0ZXBzIgogICAgICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7X3N0ZXBJbmRleH19IgogICAgICAgICAgICBtYXg9IltbX21heFN0ZXBJbmRleF1dIgogICAgICAgICAgICBtYXgtbWFya2Vycz0iW1tfbWF4U3RlcEluZGV4XV0iCiAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDwhLS0gU2VtYW50aWNhbGx5IGEgYnV0dG9uIGJ1dCA8aW1nPiBpbnNpZGUgYSA8YnV0dG9uPiBkaXNhbGxvd3MgdXNlciB0byBkbwogICAgYW4gaW50ZXJlc3Rpbmcgb3BlcmF0aW9uIGxpa2UgIkNvcHkgSW1hZ2UiIGluIG5vbi1DaHJvbWl1bSBicm93c2Vycy4gLS0+CiAgICA8YQogICAgICBpZD0ibWFpbi1pbWFnZS1jb250YWluZXIiCiAgICAgIHJvbGU9ImJ1dHRvbiIKICAgICAgYXJpYS1sYWJlbD0iVG9nZ2xlIGFjdHVhbCBzaXplIgogICAgICBhcmlhLWV4cGFuZGVkJD0iW1tfZ2V0QXJpYUV4cGFuZGVkKGFjdHVhbFNpemUpXV0iCiAgICAgIG9uLXRhcD0iX2hhbmRsZVRhcCIKICAgID48L2E+CgogICAgPHN0eWxlIGluY2x1ZGU9InRmLWNhcmQtaGVhZGluZy1zdHlsZSI+CiAgICAgIC8qKiBNYWtlIGJ1dHRvbiBhIGRpdi4gKi8KICAgICAgYnV0dG9uIHsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBiYWNrZ3JvdW5kOiBub25lOwogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogR2V0IHJpZCBvZiBkb3R0ZWQgbGluZSBpbnNpZGUgYnV0dG9uLiAqLwogICAgICBidXR0b246Oi1tb3otZm9jdXMtaW5uZXIgewogICAgICAgIGJvcmRlcjogMDsKICAgICAgICBwYWRkaW5nOiAwOwogICAgICB9CgogICAgICAvKiogRmlyZWZveDogU2ltdWxhdGUgQ2hyb21lJ3Mgb3V0ZXIgZ2xvdyBvbiBidXR0b24gd2hlbiBmb2N1c2VkLiAqLwogICAgICBidXR0b246LW1vei1mb2N1c3JpbmcgewogICAgICAgIG91dGxpbmU6IG5vbmU7CiAgICAgICAgYm94LXNoYWRvdzogMHB4IDBweCAxcHggMnB4IEhpZ2hsaWdodDsKICAgICAgfQoKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIHdpZHRoOiAzNTBweDsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlOwogICAgICAgIG1hcmdpbjogMCAxNXB4IDQwcHggMDsKICAgICAgICBvdmVyZmxvdy14OiBhdXRvOwogICAgICB9CgogICAgICAvKiogV2hlbiBhY3R1YWwgc2l6ZSBzaG93biBpcyBvbiwgdXNlIHRoZSBhY3R1YWwgaW1hZ2Ugd2lkdGguICovCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pIHsKICAgICAgICBtYXgtd2lkdGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIDpob3N0KFthY3R1YWwtc2l6ZV0pICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogbm9uZTsKICAgICAgICB3aWR0aDogYXV0bzsKICAgICAgfQoKICAgICAgOmhvc3QoW2FjdHVhbC1zaXplXSkgI21haW4taW1hZ2UtY29udGFpbmVyIGltZyB7CiAgICAgICAgd2lkdGg6IGF1dG87CiAgICAgIH0KCiAgICAgIHBhcGVyLXNwaW5uZXItbGl0ZSB7CiAgICAgICAgd2lkdGg6IDE0cHg7CiAgICAgICAgaGVpZ2h0OiAxNHB4OwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0ZXh0LWJvdHRvbTsKICAgICAgICAtLXBhcGVyLXNwaW5uZXItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICB9CgogICAgICAjc3RlcHMgewogICAgICAgIGhlaWdodDogMTVweDsKICAgICAgICBtYXJnaW46IDAgMCAwIC0xNXB4OwogICAgICAgIC8qCiAgICAgICAgICogMzEgY29tZXMgZnJvbSBhZGRpbmcgYSBwYWRkaW5nIG9mIDE1cHggZnJvbSBib3RoIHNpZGVzIG9mIHRoZQogICAgICAgICAqIHBhcGVyLXNsaWRlciwgc3VidHJhY3RpbmcgMXB4IHNvIHRoYXQgdGhlIHNsaWRlciB3aWR0aCBhbGlnbnMKICAgICAgICAgKiB3aXRoIHRoZSBpbWFnZSAodGhlIGxhc3Qgc2xpZGVyIG1hcmtlciB0YWtlcyB1cCAxcHgpLCBhbmQKICAgICAgICAgKiBhZGRpbmcgMnB4IHRvIGFjY291bnQgZm9yIGEgYm9yZGVyIG9mIDFweCBvbiBib3RoIHNpZGVzIG9mCiAgICAgICAgICogdGhlIGltYWdlLiAzMCAtIDEgKyAyLgogICAgICAgICAqLwogICAgICAgIHdpZHRoOiBjYWxjKDEwMCUgKyAzMXB4KTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KCiAgICAgICNtYWluLWltYWdlLWNvbnRhaW5lciB7CiAgICAgICAgbWF4LWhlaWdodDogMTAyNHB4OwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICB9CgogICAgICAjbWFpbi1pbWFnZS1jb250YWluZXIgaW1nIHsKICAgICAgICBjdXJzb3I6IHBvaW50ZXI7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaW1hZ2UtcmVuZGVyaW5nOiAtbW96LWNyaXNwLWVkZ2VzOwogICAgICAgIGltYWdlLXJlbmRlcmluZzogcGl4ZWxhdGVkOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIGhlaWdodDogYXV0bzsKICAgICAgfQoKICAgICAgcGFwZXItaWNvbi1idXR0b24gewogICAgICAgIGNvbG9yOiAjMjE5NmYzOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDEwMCU7CiAgICAgICAgd2lkdGg6IDMycHg7CiAgICAgICAgaGVpZ2h0OiAzMnB4OwogICAgICAgIHBhZGRpbmc6IDRweDsKICAgICAgfQogICAgICBwYXBlci1pY29uLWJ1dHRvbltzZWxlY3RlZF0gewogICAgICAgIGJhY2tncm91bmQ6IHZhcigtLXRiLXVpLWxpZ2h0LWFjY2VudCk7CiAgICAgIH0KICAgICAgW2hpZGRlbl0gewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJydW4iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgInRhZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE51bWJlciB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAic2FtcGxlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJvZlNhbXBsZXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgInRhZ01ldGFkYXRhIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgcmVmbGVjdFRvQXR0cmlidXRlOiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiYWN0dWFsU2l6ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiYnJpZ2h0bmVzc0FkanVzdG1lbnQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgImNvbnRyYXN0UGVyY2VudGFnZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJyZXF1ZXN0TWFuYWdlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiX21ldGFkYXRhQ2FuY2VsbGVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogT2JqZWN0LAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJfaW1hZ2VDYW5jZWxsZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgIl9zdGVwcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJfc3RlcEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgIl9pc0ltYWdlTG9hZGluZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgncnVuJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgIl9ydW5Db2xvciIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19zdGVwcycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiX2hhc0F0TGVhc3RPbmVTdGVwIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3N0ZXBzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJfaGFzTXVsdGlwbGVTdGVwcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19zdGVwcycsICdfc3RlcEluZGV4JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgIl9jdXJyZW50U3RlcCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19jdXJyZW50U3RlcCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJfc3RlcFZhbHVlIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX2N1cnJlbnRTdGVwJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkltYWdlTG9hZGVyLnByb3RvdHlwZSwgIl9jdXJyZW50V2FsbFRpbWUiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfc3RlcHMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlciksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiX21heFN0ZXBJbmRleCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ3NhbXBsZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJfc2FtcGxlVGV4dCIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ29mU2FtcGxlcycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiX2hhc011bHRpcGxlU2FtcGxlcyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgncnVuJywgJ3RhZycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZJbWFnZUxvYWRlci5wcm90b3R5cGUsICJyZWxvYWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19jdXJyZW50U3RlcCcsICdicmlnaHRuZXNzQWRqdXN0bWVudCcsICdjb250cmFzdFBlcmNlbnRhZ2UnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmSW1hZ2VMb2FkZXIucHJvdG90eXBlLCAiX3VwZGF0ZUltYWdlVXJsIiwgbnVsbCk7CiAgICBUZkltYWdlTG9hZGVyID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtaW1hZ2UtbG9hZGVyJykKICAgIF0sIFRmSW1hZ2VMb2FkZXIpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmSW1hZ2VEYXNoYm9hcmQgPSBjbGFzcyBUZkltYWdlRGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkT25SZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudCA9IDE7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRDb250cmFzdFBlcmNlbnRhZ2UgPSAxMDA7CiAgICAgICAgICAgIHRoaXMuX2JyaWdodG5lc3NBZGp1c3RtZW50ID0gMTsKICAgICAgICAgICAgdGhpcy5fY29udHJhc3RQZXJjZW50YWdlID0gMTAwOwogICAgICAgICAgICB0aGlzLl9yZXF1ZXN0TWFuYWdlciA9IG5ldyBSZXF1ZXN0TWFuYWdlcigpOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgaWYgKHRoaXMucmVsb2FkT25SZWFkeSkKICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgdGhpcy5fZmV0Y2hUYWdzKCkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRJbWFnZXMoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9mZXRjaFRhZ3MoKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLnBsdWdpblJvdXRlKCdpbWFnZXMnLCAnL3RhZ3MnKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKChydW5Ub1RhZ0luZm8pID0+IHsKICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNFcXVhbChydW5Ub1RhZ0luZm8sIHRoaXMuX3J1blRvVGFnSW5mbykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHVwZGF0ZSBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcy4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBydW5Ub1RhZyA9IGxvZGFzaC5tYXBWYWx1ZXMocnVuVG9UYWdJbmZvLCAoeCkgPT4gT2JqZWN0LmtleXMoeCkpOwogICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IGdldFRhZ3MocnVuVG9UYWcpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19kYXRhTm90Rm91bmQnLCB0YWdzLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3J1blRvVGFnSW5mbycsIHJ1blRvVGFnSW5mbyk7CiAgICAgICAgICAgICAgICB0aGlzLmFzeW5jKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYF9jYXRlZ29yaWVzRG9tUmVhZHlgLgogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfY2F0ZWdvcmllc0RvbVJlYWR5JywgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9yZWxvYWRJbWFnZXMoKSB7CiAgICAgICAgICAgIHRoaXMucm9vdC5xdWVyeVNlbGVjdG9yQWxsKCd0Zi1pbWFnZS1sb2FkZXInKS5mb3JFYWNoKChpbWFnZSkgPT4gewogICAgICAgICAgICAgICAgaW1hZ2UucmVsb2FkKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfc2hvdWxkT3BlbihpbmRleCkgewogICAgICAgICAgICByZXR1cm4gaW5kZXggPD0gMjsKICAgICAgICB9CiAgICAgICAgX3Jlc2V0QnJpZ2h0bmVzcygpIHsKICAgICAgICAgICAgdGhpcy5fYnJpZ2h0bmVzc0FkanVzdG1lbnQgPSB0aGlzLl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnQ7CiAgICAgICAgfQogICAgICAgIF9yZXNldENvbnRyYXN0KCkgewogICAgICAgICAgICB0aGlzLl9jb250cmFzdFBlcmNlbnRhZ2UgPSB0aGlzLl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlOwogICAgICAgIH0KICAgICAgICBnZXQgX2JyaWdodG5lc3NJc0RlZmF1bHQoKSB7CiAgICAgICAgICAgIHZhciBicmlnaHRuZXNzQWRqdXN0bWVudCA9IHRoaXMuX2JyaWdodG5lc3NBZGp1c3RtZW50OwogICAgICAgICAgICByZXR1cm4gYnJpZ2h0bmVzc0FkanVzdG1lbnQgPT09IHRoaXMuX2RlZmF1bHRCcmlnaHRuZXNzQWRqdXN0bWVudDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jb250cmFzdElzRGVmYXVsdCgpIHsKICAgICAgICAgICAgdmFyIGNvbnRyYXN0UGVyY2VudGFnZSA9IHRoaXMuX2NvbnRyYXN0UGVyY2VudGFnZTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRyYXN0UGVyY2VudGFnZSA9PT0gdGhpcy5fZGVmYXVsdENvbnRyYXN0UGVyY2VudGFnZTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jYXRlZ29yaWVzKCkgewogICAgICAgICAgICB2YXIgcnVuVG9UYWdJbmZvID0gdGhpcy5fcnVuVG9UYWdJbmZvOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRSdW5zID0gdGhpcy5fc2VsZWN0ZWRSdW5zOwogICAgICAgICAgICB2YXIgdGFnRmlsdGVyID0gdGhpcy5fdGFnRmlsdGVyOwogICAgICAgICAgICB2YXIgY2F0ZWdvcmllc0RvbVJlYWR5ID0gdGhpcy5fY2F0ZWdvcmllc0RvbVJlYWR5OwogICAgICAgICAgICBjb25zdCBydW5Ub1RhZyA9IGxvZGFzaC5tYXBWYWx1ZXMocnVuVG9UYWdJbmZvLCAoeCkgPT4gT2JqZWN0LmtleXMoeCkpOwogICAgICAgICAgICBjb25zdCBiYXNlQ2F0ZWdvcmllcyA9IGNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMocnVuVG9UYWcsIHNlbGVjdGVkUnVucywgdGFnRmlsdGVyKTsKICAgICAgICAgICAgZnVuY3Rpb24gZXhwbG9kZUl0ZW0oaXRlbSkgewogICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlcyA9IHJ1blRvVGFnSW5mb1tpdGVtLnJ1bl1baXRlbS50YWddLnNhbXBsZXM7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9kYXNoLnJhbmdlKHNhbXBsZXMpLm1hcCgoaSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgewogICAgICAgICAgICAgICAgICAgIHNhbXBsZTogaSwKICAgICAgICAgICAgICAgICAgICBvZlNhbXBsZXM6IHNhbXBsZXMsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgd2l0aFNhbXBsZXMgPSBiYXNlQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBPYmplY3QuYXNzaWduKHt9LCBjYXRlZ29yeSwgewogICAgICAgICAgICAgICAgaXRlbXM6IFtdLmNvbmNhdC5hcHBseShbXSwgY2F0ZWdvcnkuaXRlbXMubWFwKGV4cGxvZGVJdGVtKSksCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHdpdGhTYW1wbGVzOwogICAgICAgIH0KICAgICAgICBfdGFnTWV0YWRhdGEocnVuVG9UYWdJbmZvLCBydW4sIHRhZykgewogICAgICAgICAgICByZXR1cm4gcnVuVG9UYWdJbmZvW3J1bl1bdGFnXTsKICAgICAgICB9CiAgICB9OwogICAgVGZJbWFnZURhc2hib2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNldHRpbmdzIj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9ImxpbmUtaXRlbSI+CiAgICAgICAgICAgICAgPHBhcGVyLWNoZWNrYm94IGNoZWNrZWQ9Int7X2FjdHVhbFNpemV9fSIKICAgICAgICAgICAgICAgID5TaG93IGFjdHVhbCBpbWFnZSBzaXplPC9wYXBlci1jaGVja2JveAogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDxoMyBjbGFzcz0idG9vbHRpcC1jb250YWluZXIiPkJyaWdodG5lc3MgYWRqdXN0bWVudDwvaDM+CiAgICAgICAgICAgIDxkaXYgY2xhc3M9InJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciI+CiAgICAgICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICAgICAgbWluPSIwIgogICAgICAgICAgICAgICAgbWF4PSIyIgogICAgICAgICAgICAgICAgc25hcHMKICAgICAgICAgICAgICAgIHBpbgogICAgICAgICAgICAgICAgc3RlcD0iMC4wMSIKICAgICAgICAgICAgICAgIHZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IgogICAgICAgICAgICAgICAgaW1tZWRpYXRlLXZhbHVlPSJ7e19icmlnaHRuZXNzQWRqdXN0bWVudH19IgogICAgICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0ieC1idXR0b24iCiAgICAgICAgICAgICAgICBvbi10YXA9Il9yZXNldEJyaWdodG5lc3MiCiAgICAgICAgICAgICAgICBkaXNhYmxlZD0iW1tfYnJpZ2h0bmVzc0lzRGVmYXVsdF1dIgogICAgICAgICAgICAgICAgPlJlc2V0PC9wYXBlci1idXR0b24KICAgICAgICAgICAgICA+CiAgICAgICAgICAgIDwvZGl2PgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24iPgogICAgICAgICAgICA8aDMgY2xhc3M9InRvb2x0aXAtY29udGFpbmVyIj5Db250cmFzdCBhZGp1c3RtZW50PC9oMz4KICAgICAgICAgICAgPGRpdiBjbGFzcz0icmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIj4KICAgICAgICAgICAgICA8cGFwZXItc2xpZGVyCiAgICAgICAgICAgICAgICBtaW49IjAiCiAgICAgICAgICAgICAgICBtYXg9IjUwMCIKICAgICAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgICAgICBwaW4KICAgICAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgICAgICB2YWx1ZT0ie3tfY29udHJhc3RQZXJjZW50YWdlfX0iCiAgICAgICAgICAgICAgICBpbW1lZGlhdGUtdmFsdWU9Int7X2NvbnRyYXN0UGVyY2VudGFnZX19IgogICAgICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgICBjbGFzcz0ieC1idXR0b24iCiAgICAgICAgICAgICAgICBvbi10YXA9Il9yZXNldENvbnRyYXN0IgogICAgICAgICAgICAgICAgZGlzYWJsZWQ9IltbX2NvbnRyYXN0SXNEZWZhdWx0XV0iCiAgICAgICAgICAgICAgICA+UmVzZXQ8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L2Rpdj4KICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gcnVucy1zZWxlY3RvciI+CiAgICAgICAgICA8dGYtcnVucy1zZWxlY3RvcgogICAgICAgICAgICBpZD0icnVucy1zZWxlY3RvciIKICAgICAgICAgICAgc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iCiAgICAgICAgICA+PC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIGltYWdlIGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBpbWFnZSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtaW1hZ2UtbG9hZGVyCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgcnVuPSJbW2l0ZW0ucnVuXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIKICAgICAgICAgICAgICAgICAgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVuLCBpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICBhY3R1YWwtc2l6ZT0iW1tfYWN0dWFsU2l6ZV1dIgogICAgICAgICAgICAgICAgICBicmlnaHRuZXNzLWFkanVzdG1lbnQ9IltbX2JyaWdodG5lc3NBZGp1c3RtZW50XV0iCiAgICAgICAgICAgICAgICAgIGNvbnRyYXN0LXBlcmNlbnRhZ2U9IltbX2NvbnRyYXN0UGVyY2VudGFnZV1dIgogICAgICAgICAgICAgICAgPjwvdGYtaW1hZ2UtbG9hZGVyPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciB7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgfQogICAgICAucmVzZXR0YWJsZS1zbGlkZXItY29udGFpbmVyIHBhcGVyLXNsaWRlciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CiAgICAgIC5yZXNldHRhYmxlLXNsaWRlci1jb250YWluZXIgcGFwZXItYnV0dG9uIHsKICAgICAgICBmbGV4LWdyb3c6IDA7CiAgICAgIH0KICAgICAgLnJlc2V0dGFibGUtc2xpZGVyLWNvbnRhaW5lciBwYXBlci1idXR0b25bZGlzYWJsZWRdIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB1bnNldDsKICAgICAgfQogICAgICAueC1idXR0b24gewogICAgICAgIGZvbnQtc2l6ZTogMTNweDsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10Yi11aS1saWdodC1hY2NlbnQpOwogICAgICAgIGNvbG9yOiB2YXIoLS10Yi11aS1kYXJrLWFjY2VudCk7CiAgICAgIH0KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItc2xpZGVyIHsKICAgICAgICAtLXBhcGVyLXNsaWRlci1hY3RpdmUtY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2ItY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLWtub2Itc3RhcnQtYm9yZGVyLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1rbm9iLXN0YXJ0LWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1tYXJrZXJzLWNvbG9yOiB2YXIoLS10Yi1vcmFuZ2Utc3Ryb25nKTsKICAgICAgICAtLXBhcGVyLXNsaWRlci1waW4tY29sb3I6IHZhcigtLXRiLW9yYW5nZS1zdHJvbmcpOwogICAgICAgIC0tcGFwZXItc2xpZGVyLXBpbi1zdGFydC1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgInJlbG9hZE9uUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZJbWFnZURhc2hib2FyZC5wcm90b3R5cGUsICJfc2VsZWN0ZWRSdW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZJbWFnZURhc2hib2FyZC5wcm90b3R5cGUsICJfcnVuVG9UYWdJbmZvIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kYXRhTm90Rm91bmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmSW1hZ2VEYXNoYm9hcmQucHJvdG90eXBlLCAiX2FjdHVhbFNpemUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kZWZhdWx0QnJpZ2h0bmVzc0FkanVzdG1lbnQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kZWZhdWx0Q29udHJhc3RQZXJjZW50YWdlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZJbWFnZURhc2hib2FyZC5wcm90b3R5cGUsICJfYnJpZ2h0bmVzc0FkanVzdG1lbnQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jb250cmFzdFBlcmNlbnRhZ2UiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmSW1hZ2VEYXNoYm9hcmQucHJvdG90eXBlLCAiX2NhdGVnb3JpZXNEb21SZWFkeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmSW1hZ2VEYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfYnJpZ2h0bmVzc0FkanVzdG1lbnQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9icmlnaHRuZXNzSXNEZWZhdWx0IiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX2NvbnRyYXN0UGVyY2VudGFnZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmSW1hZ2VEYXNoYm9hcmQucHJvdG90eXBlLCAiX2NvbnRyYXN0SXNEZWZhdWx0IiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3J1blRvVGFnSW5mbycsICdfc2VsZWN0ZWRSdW5zJywgJ190YWdGaWx0ZXInLCAnX2NhdGVnb3JpZXNEb21SZWFkeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZkltYWdlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYXRlZ29yaWVzIiwgbnVsbCk7CiAgICBUZkltYWdlRGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtaW1hZ2UtZGFzaGJvYXJkJykKICAgIF0sIFRmSW1hZ2VEYXNoYm9hcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBUeXBlcyBvZiBlcnJvcnMgZHVyaW5nIG5ldHdvcmsgZGF0YSByb3VuZHRyaXAuCiAgICAgKiBAZW51bSB7bnVtYmVyfQogICAgICovCiAgICB2YXIgRXJyb3JDb2RlczsKICAgIChmdW5jdGlvbiAoRXJyb3JDb2RlcykgewogICAgICAgIEVycm9yQ29kZXNbRXJyb3JDb2Rlc1siQ0FOQ0VMTEVEIl0gPSAxXSA9ICJDQU5DRUxMRUQiOwogICAgfSkoRXJyb3JDb2RlcyB8fCAoRXJyb3JDb2RlcyA9IHt9KSk7CiAgICAvKioKICAgICAqIFR5cGVzIG9mIGNvbnRlbnQgZGlzcGxheWVkIGJ5IHRoZSBwbHVnaW4uCiAgICAgKiBAZW51bSB7bnVtYmVyfQogICAgICovCiAgICB2YXIgQ29udGVudFR5cGU7CiAgICAoZnVuY3Rpb24gKENvbnRlbnRUeXBlKSB7CiAgICAgICAgQ29udGVudFR5cGVbQ29udGVudFR5cGVbIlZFUlRFWCJdID0gMV0gPSAiVkVSVEVYIjsKICAgICAgICBDb250ZW50VHlwZVtDb250ZW50VHlwZVsiRkFDRSJdID0gMl0gPSAiRkFDRSI7CiAgICAgICAgQ29udGVudFR5cGVbQ29udGVudFR5cGVbIkNPTE9SIl0gPSAzXSA9ICJDT0xPUiI7CiAgICB9KShDb250ZW50VHlwZSB8fCAoQ29udGVudFR5cGUgPSB7fSkpOwogICAgLyoqCiAgICAgKiBUeXBlcyBvZiBjb250ZW50IGRpc3BsYXllZCBieSB0aGUgcGx1Z2luIG1hcHBlZCB0byB1bmRlcmx5aW5nIGRhdGEgdHlwZXMuCiAgICAgKiBAZW51bSB7c3RyaW5nfQogICAgICovCiAgICB2YXIgQ29udGVudFR5cGVUb0l0ZW1UeXBlOwogICAgKGZ1bmN0aW9uIChDb250ZW50VHlwZVRvSXRlbVR5cGUpIHsKICAgICAgICBDb250ZW50VHlwZVRvSXRlbVR5cGVbIlZFUlRFWCJdID0gImZsb2F0MzIiOwogICAgICAgIENvbnRlbnRUeXBlVG9JdGVtVHlwZVsiRkFDRSJdID0gImludDMyIjsKICAgICAgICBDb250ZW50VHlwZVRvSXRlbVR5cGVbIkNPTE9SIl0gPSAidWludDgiOwogICAgfSkoQ29udGVudFR5cGVUb0l0ZW1UeXBlIHx8IChDb250ZW50VHlwZVRvSXRlbVR5cGUgPSB7fSkpOwogICAgY2xhc3MgQXJyYXlCdWZmZXJEYXRhUHJvdmlkZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEFycmF5QnVmZmVyRGF0YVByb3ZpZGVyIGNvbnN0cnVjdG9yLCBpbml0aWFsaXplcyBldmVyeXRoaW5nIG5lZWRlZCBmb3IKICAgICAgICAgKiBmdXR1cmUgcmVxdWVzdHMgdG8gdGhlIHNlcnZlci4KICAgICAgICAgKiBAcGFyYW0gcmVxdWVzdE1hbmFnZXIgUmVxdWVzdCBtYW5hZ2VyIHRvIGNvbW11bmljYXRlIHdpdGggdGhlCiAgICAgICAgICogIHNlcnZlci4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihyZXF1ZXN0TWFuYWdlcikgewogICAgICAgICAgICB0aGlzLl9jYW5jZWxsZXIgPSBuZXcgQ2FuY2VsbGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gcmVxdWVzdE1hbmFnZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlcXVlc3RzIG5ldyBkYXRhIGZyb20gdGhlIHNlcnZlci4KICAgICAgICAgKi8KICAgICAgICByZWxvYWQocnVuLCB0YWcsIHNhbXBsZSkgewogICAgICAgICAgICB0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mZXRjaE1ldGFkYXRhKHJ1biwgdGFnLCBzYW1wbGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgICAqIFJlcXVlc3RzIG5ldyBkYXRhIG9mIHNvbWUgcGFydGljdWxhciB0eXBlIGZyb20gdGhlIHNlcnZlci4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBydW4gTmFtZSBvZiB0aGUgcnVuIHRvIGdldCBkYXRhIGZvci4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0YWcgTmFtZSBvZiB0aGUgdGFnIHRvIGdldCBkYXRhIGZvci4KICAgICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBjb250ZW50X3R5cGUgVHlwZSBvZiB0aGUgY29udGVudCB0byByZXRyaWV2ZS4KICAgICAgICAgICAqIEBwYXJhbSB7IWFycmF5fSBtZXRhZGF0YSBMaXN0IG9mIG1ldGFkYXRhIHRvIGNvbXBsZXRlIHdpdGggZGF0YSBmcm9tIHRoZQogICAgICAgICAgICogIHNlcnZlci4KICAgICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGUgU2FtcGxlIGluZGV4IGZyb20gYSBiYXRjaCBvZiBkYXRhLgogICAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHN0ZXAgU3RlcCB2YWx1ZSwgcmVwcmVzZW50aW5nIGEgcG9pbnQgaW4gdGhlIHRpbWUgd2hlbiB0aGUKICAgICAgICAgICAgICBldmVudCBvY2N1cnJlZC4KICAgICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gbWVzaERhdGEgTWFwIHRvIHBvcHVsYXRlIHdpdGggbWVzaCBkYXRhLgogICAgICAgICAgICogQHJldHVybiB7IU9iamVjdH0gUHJvbWlzZSBvYmplY3QgcmVwcmVzZW50aW5nIHNlcnZlciByZXF1ZXN0LgogICAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgICAqLwogICAgICAgIF9mZXRjaERhdGFCeVN0ZXAocnVuLCB0YWcsIGNvbnRlbnRfdHlwZSwgc2FtcGxlLCBzdGVwLCBtZXNoRGF0YSkgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnbWVzaCcsICcvZGF0YScsIG5ldyBVUkxTZWFyY2hQYXJhbXMoewogICAgICAgICAgICAgICAgdGFnLAogICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgY29udGVudF90eXBlLAogICAgICAgICAgICAgICAgc2FtcGxlOiBTdHJpbmcoc2FtcGxlKSwKICAgICAgICAgICAgICAgIHN0ZXA6IFN0cmluZyhzdGVwKSwKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBjb25zdCByZXNoYXBlVG8xeE54MyA9IGZ1bmN0aW9uIChkYXRhKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjaGFubmVsc0NvdW50ID0gMzsKICAgICAgICAgICAgICAgIGxldCBpdGVtcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aCAvIGNoYW5uZWxzQ291bnQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGxldCBkYXRhRW50cnkgPSBbXTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGNoYW5uZWxzQ291bnQ7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICBkYXRhRW50cnkucHVzaChkYXRhW2kgKiBjaGFubmVsc0NvdW50ICsgal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKGRhdGFFbnRyeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXM7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGNvbnN0IHByb2Nlc3NEYXRhID0gdGhpcy5fY2FuY2VsbGVyLmNhbmNlbGxhYmxlKChyZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLmNhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGU6IEVycm9yQ29kZXMuQ0FOQ0VMTEVELAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiAnUmVzcG9uc2Ugd2FzIGludmFsaWRhdGVkLicsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgYnVmZmVyID0gcmVzcG9uc2UudmFsdWU7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbnRlbnRfdHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgJ1ZFUlRFWCc6CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc2hEYXRhLnZlcnRpY2VzID0gcmVzaGFwZVRvMXhOeDMobmV3IEZsb2F0MzJBcnJheShidWZmZXIpKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAnRkFDRSc6CiAgICAgICAgICAgICAgICAgICAgICAgIG1lc2hEYXRhLmZhY2VzID0gcmVzaGFwZVRvMXhOeDMobmV3IEludDMyQXJyYXkoYnVmZmVyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgJ0NPTE9SJzoKICAgICAgICAgICAgICAgICAgICAgICAgbWVzaERhdGEuY29sb3JzID0gcmVzaGFwZVRvMXhOeDMobmV3IFVpbnQ4QXJyYXkoYnVmZmVyKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1lc2hEYXRhOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyCiAgICAgICAgICAgICAgICAuZmV0Y2godXJsLCB7CiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLAogICAgICAgICAgICAgICAgaGVhZGVyczogewogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogJ2FycmF5YnVmZmVyJywKICAgICAgICAgICAgICAgICAgICBjb250ZW50VHlwZTogQ29udGVudFR5cGVUb0l0ZW1UeXBlW2NvbnRlbnRfdHlwZV0sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5hcnJheUJ1ZmZlcigpKQogICAgICAgICAgICAgICAgLnRoZW4ocHJvY2Vzc0RhdGEpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXF1ZXN0cyBuZXcgZGF0YSBmb3IgZWFjaCB0eXBlIG9mIG1ldGFkYXRhIGZyb20gdGhlIHNlcnZlci4KICAgICAgICAgKiBNZXRhZGF0YSBjb25zaXN0cyBvZiB3YWxsX3RpbWUsIHN0ZXAsIHRlbnNvciBzaGFwZSwgY29udGVudCB0eXBlIGFuZCBvdGhlcgogICAgICAgICAqIGluZm8sIGJ1dCBub3QgdGVuc29yIGRhdGEgaXRzZWxmLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gc3RlcERhdHVtIERpY3Rpb25hcnkgd2l0aCBtZXNoIGRhdGEgZm9yIGEgY3VycmVudCBzdGVwLgogICAgICAgICAqIEBwYXJhbSB7c3RyaW5nfSBydW4gTmFtZSBvZiB0aGUgcnVuIHRvIGdldCBkYXRhIGZvci4KICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gdGFnIE5hbWUgb2YgdGhlIHR1ZyB0byBnZXQgZGF0YSBmb3IuCiAgICAgICAgICogQHBhcmFtIHtudW1iZXJ9IHNhbXBsZSBTYW1wbGUgaW5kZXggZnJvbSBhIGJhdGNoIG9mIGRhdGEuCiAgICAgICAgICogQHJldHVybiB7IU9iamVjdH0gSm9pbnQgcHJvbWlzZSBmb3IgYWxsIHJlcXVlc3RzIGJlaW5nIHNlbnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBmZXRjaERhdGEoc3RlcERhdHVtLCBydW4sIHRhZywgc2FtcGxlKSB7CiAgICAgICAgICAgIGxldCBwcm9taXNlcyA9IFtdOwogICAgICAgICAgICAvLyBNYXAgdG8gcG9wdWxhdGUgd2l0aCBtZXNoIGRhdGEsIGkuZS4gdmVydGljZXMsIGZhY2VzLCBldGMuCiAgICAgICAgICAgIGxldCBtZXNoRGF0YSA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgT2JqZWN0LmtleXMoQ29udGVudFR5cGUpLmZvckVhY2goKGNvbnRlbnRUeXBlKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSAxIDw8IENvbnRlbnRUeXBlW2NvbnRlbnRUeXBlXTsKICAgICAgICAgICAgICAgIGlmIChzdGVwRGF0dW0uY29tcG9uZW50cyAmIGNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgICAgIHByb21pc2VzLnB1c2godGhpcy5fZmV0Y2hEYXRhQnlTdGVwKHJ1biwgdGFnLCBjb250ZW50VHlwZSwgc2FtcGxlLCBzdGVwRGF0dW0uc3RlcCwgbWVzaERhdGEpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChwcm9taXNlcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlcXVlc3RzIG5ldyBtZXRhZGF0YSBmcm9tIHRoZSBzZXJ2ZXIKICAgICAgICAgKiBAcGFyYW0ge3N0cmluZ30gcnVuIE5hbWUgb2YgdGhlIHJ1biB0byBnZXQgZGF0YSBmb3IuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHRhZyBOYW1lIG9mIHRoZSB0dWcgdG8gZ2V0IGRhdGEgZm9yLgogICAgICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzYW1wbGUgU2FtcGxlIGluZGV4IGZyb20gYSBiYXRjaCBvZiBkYXRhLgogICAgICAgICAqICBjb21wbGV0aW9uLgogICAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IFByb21pc2UgZm9yIHJlcXVlc3RlZCBtZXRhZGF0YS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9mZXRjaE1ldGFkYXRhKHJ1biwgdGFnLCBzYW1wbGUpIHsKICAgICAgICAgICAgdGhpcy5fY2FuY2VsbGVyLmNhbmNlbEFsbCgpOwogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnbWVzaCcsICcvbWVzaGVzJywgbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHRhZywgcnVuLCBzYW1wbGUgfSkpOwogICAgICAgICAgICBjb25zdCByZXF1ZXN0RGF0YSA9IHRoaXMuX2NhbmNlbGxlci5jYW5jZWxsYWJsZSgocmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoewogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBFcnJvckNvZGVzLkNBTkNFTExFRCwKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogJ1Jlc3BvbnNlIHdhcyBpbnZhbGlkYXRlZC4nLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnZhbHVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyCiAgICAgICAgICAgICAgICAuZmV0Y2godXJsKQogICAgICAgICAgICAgICAgLnRoZW4oKHJlc3BvbnNlKSA9PiByZXNwb25zZS5qc29uKCkpCiAgICAgICAgICAgICAgICAudGhlbihyZXF1ZXN0RGF0YSkKICAgICAgICAgICAgICAgIC50aGVuKHRoaXMuX3Byb2Nlc3NNZXRhZGF0YS5iaW5kKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2VzcyBzZXJ2ZXIgcmF3IGRhdGEgaW50byBmcm9udGVuZCBmcmllbmRseSBmb3JtYXQuCiAgICAgICAgICogQHBhcmFtIHshQXJyYXl8dW5kZWZpbmVkfSBkYXRhIGxpc3Qgb2YgcmF3IHNlcnZlciByZWNvcmRzLgogICAgICAgICAqIEByZXR1cm4geyFBcnJheX0gbGlzdCBvZiBzdGVwIGRhdHVtcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9wcm9jZXNzTWV0YWRhdGEoZGF0YSkgewogICAgICAgICAgICBpZiAoIWRhdGEpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IHN0ZXBUb0RhdGEgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgbGV0IGRhdGFFbnRyeSA9IGRhdGFbaV07CiAgICAgICAgICAgICAgICBpZiAoIXN0ZXBUb0RhdGEuaGFzKGRhdGFFbnRyeS5zdGVwKSkgewogICAgICAgICAgICAgICAgICAgIHN0ZXBUb0RhdGEuc2V0KGRhdGFFbnRyeS5zdGVwLCBbXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGVwVG9EYXRhLmdldChkYXRhRW50cnkuc3RlcCkucHVzaChkYXRhRW50cnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBkYXR1bXMgPSBbXTsKICAgICAgICAgICAgc3RlcFRvRGF0YS5mb3JFYWNoKChkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgZGF0dW0gPSB0aGlzLl9jcmVhdGVTdGVwRGF0dW0oZGF0YVswXSk7CiAgICAgICAgICAgICAgICBkYXR1bXMucHVzaChkYXR1bSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICByZXR1cm4gZGF0dW1zOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIHNpbmdsZSByb3cgb2Ygc2VydmVyLXNpZGUgZGF0YSBhbmQgcHV0cyBpdCBpbiBtb3JlIHN0cnVjdHVyZWQgZm9ybS4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG1ldGFkYXRhIE9iamVjdCBkZXNjcmliaW5nIHN0ZXAgc3VtbWFyeS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4geyFPYmplY3R9IHdpdGggd2FsbF90aW1lLCBzdGVwIG51bWJlciBhbmQgZGF0YSBmb3IgdGhlIHN0ZXAuCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVN0ZXBEYXR1bShtZXRhZGF0YSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgLy8gVGhlIHdhbGwgdGltZSB3aXRoaW4gdGhlIG1ldGFkYXRhIGlzIGluIHNlY29uZHMuIFRoZSBEYXRlCiAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciBhY2NlcHRzIGEgdGltZSBpbiBtaWxsaXNlY29uZHMsIHNvIHdlIG11bHRpcGx5IGJ5IDEwMDAuCiAgICAgICAgICAgICAgICB3YWxsX3RpbWU6IG5ldyBEYXRlKG1ldGFkYXRhLndhbGxfdGltZSAqIDEwMDApLAogICAgICAgICAgICAgICAgc3RlcDogbWV0YWRhdGEuc3RlcCwKICAgICAgICAgICAgICAgIGNvbmZpZzogbWV0YWRhdGEuY29uZmlnLAogICAgICAgICAgICAgICAgY29udGVudF90eXBlOiBtZXRhZGF0YS5jb250ZW50X3R5cGUsCiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiBtZXRhZGF0YS5jb21wb25lbnRzLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KCiAgICAvLyBQb2x5ZmlsbHMKCiAgICBpZiAoIE51bWJlci5FUFNJTE9OID09PSB1bmRlZmluZWQgKSB7CgogICAgCU51bWJlci5FUFNJTE9OID0gTWF0aC5wb3coIDIsIC0gNTIgKTsKCiAgICB9CgogICAgaWYgKCBOdW1iZXIuaXNJbnRlZ2VyID09PSB1bmRlZmluZWQgKSB7CgogICAgCS8vIE1pc3NpbmcgaW4gSUUKICAgIAkvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9OdW1iZXIvaXNJbnRlZ2VyCgogICAgCU51bWJlci5pc0ludGVnZXIgPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaXNGaW5pdGUoIHZhbHVlICkgJiYgTWF0aC5mbG9vciggdmFsdWUgKSA9PT0gdmFsdWU7CgogICAgCX07CgogICAgfQoKICAgIC8vCgogICAgaWYgKCBNYXRoLnNpZ24gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvTWF0aC9zaWduCgogICAgCU1hdGguc2lnbiA9IGZ1bmN0aW9uICggeCApIHsKCiAgICAJCXJldHVybiAoIHggPCAwICkgPyAtIDEgOiAoIHggPiAwICkgPyAxIDogKyB4OwoKICAgIAl9OwoKICAgIH0KCiAgICBpZiAoICduYW1lJyBpbiBGdW5jdGlvbi5wcm90b3R5cGUgPT09IGZhbHNlICkgewoKICAgIAkvLyBNaXNzaW5nIGluIElFCiAgICAJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRnVuY3Rpb24vbmFtZQoKICAgIAlPYmplY3QuZGVmaW5lUHJvcGVydHkoIEZ1bmN0aW9uLnByb3RvdHlwZSwgJ25hbWUnLCB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy50b1N0cmluZygpLm1hdGNoKCAvXlxzKmZ1bmN0aW9uXHMqKFteXChcc10qKS8gKVsgMSBdOwoKICAgIAkJfQoKICAgIAl9ICk7CgogICAgfQoKICAgIGlmICggT2JqZWN0LmFzc2lnbiA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkvLyBNaXNzaW5nIGluIElFCiAgICAJLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbgoKICAgIAlPYmplY3QuYXNzaWduID0gZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkIHx8IHRhcmdldCA9PT0gbnVsbCApIHsKCiAgICAJCQl0aHJvdyBuZXcgVHlwZUVycm9yKCAnQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0JyApOwoKICAgIAkJfQoKICAgIAkJdmFyIG91dHB1dCA9IE9iamVjdCggdGFyZ2V0ICk7CgogICAgCQlmb3IgKCB2YXIgaW5kZXggPSAxOyBpbmRleCA8IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4ICsrICkgewoKICAgIAkJCXZhciBzb3VyY2UgPSBhcmd1bWVudHNbIGluZGV4IF07CgogICAgCQkJaWYgKCBzb3VyY2UgIT09IHVuZGVmaW5lZCAmJiBzb3VyY2UgIT09IG51bGwgKSB7CgogICAgCQkJCWZvciAoIHZhciBuZXh0S2V5IGluIHNvdXJjZSApIHsKCiAgICAJCQkJCWlmICggT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKCBzb3VyY2UsIG5leHRLZXkgKSApIHsKCiAgICAJCQkJCQlvdXRwdXRbIG5leHRLZXkgXSA9IHNvdXJjZVsgbmV4dEtleSBdOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIG91dHB1dDsKCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBodHRwczovL2dpdGh1Yi5jb20vbXJkb29iL2V2ZW50ZGlzcGF0Y2hlci5qcy8KICAgICAqLwoKICAgIGZ1bmN0aW9uIEV2ZW50RGlzcGF0Y2hlcigpIHt9CgogICAgT2JqZWN0LmFzc2lnbiggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSwgewoKICAgIAlhZGRFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkgewoKICAgIAkJaWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHRoaXMuX2xpc3RlbmVycyA9IHt9OwoKICAgIAkJdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyczsKCiAgICAJCWlmICggbGlzdGVuZXJzWyB0eXBlIF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlsaXN0ZW5lcnNbIHR5cGUgXSA9IFtdOwoKICAgIAkJfQoKICAgIAkJaWYgKCBsaXN0ZW5lcnNbIHR5cGUgXS5pbmRleE9mKCBsaXN0ZW5lciApID09PSAtIDEgKSB7CgogICAgCQkJbGlzdGVuZXJzWyB0eXBlIF0ucHVzaCggbGlzdGVuZXIgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJaGFzRXZlbnRMaXN0ZW5lcjogZnVuY3Rpb24gKCB0eXBlLCBsaXN0ZW5lciApIHsKCiAgICAJCWlmICggdGhpcy5fbGlzdGVuZXJzID09PSB1bmRlZmluZWQgKSByZXR1cm4gZmFsc2U7CgogICAgCQl2YXIgbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzOwoKICAgIAkJcmV0dXJuIGxpc3RlbmVyc1sgdHlwZSBdICE9PSB1bmRlZmluZWQgJiYgbGlzdGVuZXJzWyB0eXBlIF0uaW5kZXhPZiggbGlzdGVuZXIgKSAhPT0gLSAxOwoKICAgIAl9LAoKICAgIAlyZW1vdmVFdmVudExpc3RlbmVyOiBmdW5jdGlvbiAoIHR5cGUsIGxpc3RlbmVyICkgewoKICAgIAkJaWYgKCB0aGlzLl9saXN0ZW5lcnMgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCiAgICAJCXZhciBsaXN0ZW5lcnMgPSB0aGlzLl9saXN0ZW5lcnM7CiAgICAJCXZhciBsaXN0ZW5lckFycmF5ID0gbGlzdGVuZXJzWyB0eXBlIF07CgogICAgCQlpZiAoIGxpc3RlbmVyQXJyYXkgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl2YXIgaW5kZXggPSBsaXN0ZW5lckFycmF5LmluZGV4T2YoIGxpc3RlbmVyICk7CgogICAgCQkJaWYgKCBpbmRleCAhPT0gLSAxICkgewoKICAgIAkJCQlsaXN0ZW5lckFycmF5LnNwbGljZSggaW5kZXgsIDEgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCWRpc3BhdGNoRXZlbnQ6IGZ1bmN0aW9uICggZXZlbnQgKSB7CgogICAgCQlpZiAoIHRoaXMuX2xpc3RlbmVycyA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOwoKICAgIAkJdmFyIGxpc3RlbmVycyA9IHRoaXMuX2xpc3RlbmVyczsKICAgIAkJdmFyIGxpc3RlbmVyQXJyYXkgPSBsaXN0ZW5lcnNbIGV2ZW50LnR5cGUgXTsKCiAgICAJCWlmICggbGlzdGVuZXJBcnJheSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWV2ZW50LnRhcmdldCA9IHRoaXM7CgogICAgCQkJdmFyIGFycmF5ID0gbGlzdGVuZXJBcnJheS5zbGljZSggMCApOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCWFycmF5WyBpIF0uY2FsbCggdGhpcywgZXZlbnQgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICB9ICk7CgogICAgdmFyIFJFVklTSU9OID0gJzEwOCc7CiAgICB2YXIgTU9VU0UgPSB7IExFRlQ6IDAsIE1JRERMRTogMSwgUklHSFQ6IDIsIFJPVEFURTogMCwgRE9MTFk6IDEsIFBBTjogMiB9OwogICAgdmFyIFRPVUNIID0geyBST1RBVEU6IDAsIFBBTjogMSwgRE9MTFlfUEFOOiAyLCBET0xMWV9ST1RBVEU6IDMgfTsKICAgIHZhciBDdWxsRmFjZU5vbmUgPSAwOwogICAgdmFyIEN1bGxGYWNlQmFjayA9IDE7CiAgICB2YXIgQ3VsbEZhY2VGcm9udCA9IDI7CiAgICB2YXIgQ3VsbEZhY2VGcm9udEJhY2sgPSAzOwogICAgdmFyIEZyb250RmFjZURpcmVjdGlvbkNXID0gMDsKICAgIHZhciBGcm9udEZhY2VEaXJlY3Rpb25DQ1cgPSAxOwogICAgdmFyIEJhc2ljU2hhZG93TWFwID0gMDsKICAgIHZhciBQQ0ZTaGFkb3dNYXAgPSAxOwogICAgdmFyIFBDRlNvZnRTaGFkb3dNYXAgPSAyOwogICAgdmFyIFZTTVNoYWRvd01hcCA9IDM7CiAgICB2YXIgRnJvbnRTaWRlID0gMDsKICAgIHZhciBCYWNrU2lkZSA9IDE7CiAgICB2YXIgRG91YmxlU2lkZSA9IDI7CiAgICB2YXIgRmxhdFNoYWRpbmcgPSAxOwogICAgdmFyIFNtb290aFNoYWRpbmcgPSAyOwogICAgdmFyIE5vQ29sb3JzID0gMDsKICAgIHZhciBGYWNlQ29sb3JzID0gMTsKICAgIHZhciBWZXJ0ZXhDb2xvcnMgPSAyOwogICAgdmFyIE5vQmxlbmRpbmcgPSAwOwogICAgdmFyIE5vcm1hbEJsZW5kaW5nID0gMTsKICAgIHZhciBBZGRpdGl2ZUJsZW5kaW5nID0gMjsKICAgIHZhciBTdWJ0cmFjdGl2ZUJsZW5kaW5nID0gMzsKICAgIHZhciBNdWx0aXBseUJsZW5kaW5nID0gNDsKICAgIHZhciBDdXN0b21CbGVuZGluZyA9IDU7CiAgICB2YXIgQWRkRXF1YXRpb24gPSAxMDA7CiAgICB2YXIgU3VidHJhY3RFcXVhdGlvbiA9IDEwMTsKICAgIHZhciBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiA9IDEwMjsKICAgIHZhciBNaW5FcXVhdGlvbiA9IDEwMzsKICAgIHZhciBNYXhFcXVhdGlvbiA9IDEwNDsKICAgIHZhciBaZXJvRmFjdG9yID0gMjAwOwogICAgdmFyIE9uZUZhY3RvciA9IDIwMTsKICAgIHZhciBTcmNDb2xvckZhY3RvciA9IDIwMjsKICAgIHZhciBPbmVNaW51c1NyY0NvbG9yRmFjdG9yID0gMjAzOwogICAgdmFyIFNyY0FscGhhRmFjdG9yID0gMjA0OwogICAgdmFyIE9uZU1pbnVzU3JjQWxwaGFGYWN0b3IgPSAyMDU7CiAgICB2YXIgRHN0QWxwaGFGYWN0b3IgPSAyMDY7CiAgICB2YXIgT25lTWludXNEc3RBbHBoYUZhY3RvciA9IDIwNzsKICAgIHZhciBEc3RDb2xvckZhY3RvciA9IDIwODsKICAgIHZhciBPbmVNaW51c0RzdENvbG9yRmFjdG9yID0gMjA5OwogICAgdmFyIFNyY0FscGhhU2F0dXJhdGVGYWN0b3IgPSAyMTA7CiAgICB2YXIgTmV2ZXJEZXB0aCA9IDA7CiAgICB2YXIgQWx3YXlzRGVwdGggPSAxOwogICAgdmFyIExlc3NEZXB0aCA9IDI7CiAgICB2YXIgTGVzc0VxdWFsRGVwdGggPSAzOwogICAgdmFyIEVxdWFsRGVwdGggPSA0OwogICAgdmFyIEdyZWF0ZXJFcXVhbERlcHRoID0gNTsKICAgIHZhciBHcmVhdGVyRGVwdGggPSA2OwogICAgdmFyIE5vdEVxdWFsRGVwdGggPSA3OwogICAgdmFyIE11bHRpcGx5T3BlcmF0aW9uID0gMDsKICAgIHZhciBNaXhPcGVyYXRpb24gPSAxOwogICAgdmFyIEFkZE9wZXJhdGlvbiA9IDI7CiAgICB2YXIgTm9Ub25lTWFwcGluZyA9IDA7CiAgICB2YXIgTGluZWFyVG9uZU1hcHBpbmcgPSAxOwogICAgdmFyIFJlaW5oYXJkVG9uZU1hcHBpbmcgPSAyOwogICAgdmFyIFVuY2hhcnRlZDJUb25lTWFwcGluZyA9IDM7CiAgICB2YXIgQ2luZW9uVG9uZU1hcHBpbmcgPSA0OwogICAgdmFyIEFDRVNGaWxtaWNUb25lTWFwcGluZyA9IDU7CgogICAgdmFyIFVWTWFwcGluZyA9IDMwMDsKICAgIHZhciBDdWJlUmVmbGVjdGlvbk1hcHBpbmcgPSAzMDE7CiAgICB2YXIgQ3ViZVJlZnJhY3Rpb25NYXBwaW5nID0gMzAyOwogICAgdmFyIEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nID0gMzAzOwogICAgdmFyIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nID0gMzA0OwogICAgdmFyIFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nID0gMzA1OwogICAgdmFyIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nID0gMzA2OwogICAgdmFyIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nID0gMzA3OwogICAgdmFyIFJlcGVhdFdyYXBwaW5nID0gMTAwMDsKICAgIHZhciBDbGFtcFRvRWRnZVdyYXBwaW5nID0gMTAwMTsKICAgIHZhciBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nID0gMTAwMjsKICAgIHZhciBOZWFyZXN0RmlsdGVyID0gMTAwMzsKICAgIHZhciBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciA9IDEwMDQ7CiAgICB2YXIgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXIgPSAxMDA0OwogICAgdmFyIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIgPSAxMDA1OwogICAgdmFyIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA1OwogICAgdmFyIExpbmVhckZpbHRlciA9IDEwMDY7CiAgICB2YXIgTGluZWFyTWlwbWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7CiAgICB2YXIgTGluZWFyTWlwTWFwTmVhcmVzdEZpbHRlciA9IDEwMDc7CiAgICB2YXIgTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyID0gMTAwODsKICAgIHZhciBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXIgPSAxMDA4OwogICAgdmFyIFVuc2lnbmVkQnl0ZVR5cGUgPSAxMDA5OwogICAgdmFyIEJ5dGVUeXBlID0gMTAxMDsKICAgIHZhciBTaG9ydFR5cGUgPSAxMDExOwogICAgdmFyIFVuc2lnbmVkU2hvcnRUeXBlID0gMTAxMjsKICAgIHZhciBJbnRUeXBlID0gMTAxMzsKICAgIHZhciBVbnNpZ25lZEludFR5cGUgPSAxMDE0OwogICAgdmFyIEZsb2F0VHlwZSA9IDEwMTU7CiAgICB2YXIgSGFsZkZsb2F0VHlwZSA9IDEwMTY7CiAgICB2YXIgVW5zaWduZWRTaG9ydDQ0NDRUeXBlID0gMTAxNzsKICAgIHZhciBVbnNpZ25lZFNob3J0NTU1MVR5cGUgPSAxMDE4OwogICAgdmFyIFVuc2lnbmVkU2hvcnQ1NjVUeXBlID0gMTAxOTsKICAgIHZhciBVbnNpZ25lZEludDI0OFR5cGUgPSAxMDIwOwogICAgdmFyIEFscGhhRm9ybWF0ID0gMTAyMTsKICAgIHZhciBSR0JGb3JtYXQgPSAxMDIyOwogICAgdmFyIFJHQkFGb3JtYXQgPSAxMDIzOwogICAgdmFyIEx1bWluYW5jZUZvcm1hdCA9IDEwMjQ7CiAgICB2YXIgTHVtaW5hbmNlQWxwaGFGb3JtYXQgPSAxMDI1OwogICAgdmFyIFJHQkVGb3JtYXQgPSBSR0JBRm9ybWF0OwogICAgdmFyIERlcHRoRm9ybWF0ID0gMTAyNjsKICAgIHZhciBEZXB0aFN0ZW5jaWxGb3JtYXQgPSAxMDI3OwogICAgdmFyIFJlZEZvcm1hdCA9IDEwMjg7CiAgICB2YXIgUkdCX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NjsKICAgIHZhciBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgPSAzMzc3NzsKICAgIHZhciBSR0JBX1MzVENfRFhUM19Gb3JtYXQgPSAzMzc3ODsKICAgIHZhciBSR0JBX1MzVENfRFhUNV9Gb3JtYXQgPSAzMzc3OTsKICAgIHZhciBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCA9IDM1ODQwOwogICAgdmFyIFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDE7CiAgICB2YXIgUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ID0gMzU4NDI7CiAgICB2YXIgUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0ID0gMzU4NDM7CiAgICB2YXIgUkdCX0VUQzFfRm9ybWF0ID0gMzYxOTY7CiAgICB2YXIgUkdCQV9BU1RDXzR4NF9Gb3JtYXQgPSAzNzgwODsKICAgIHZhciBSR0JBX0FTVENfNXg0X0Zvcm1hdCA9IDM3ODA5OwogICAgdmFyIFJHQkFfQVNUQ181eDVfRm9ybWF0ID0gMzc4MTA7CiAgICB2YXIgUkdCQV9BU1RDXzZ4NV9Gb3JtYXQgPSAzNzgxMTsKICAgIHZhciBSR0JBX0FTVENfNng2X0Zvcm1hdCA9IDM3ODEyOwogICAgdmFyIFJHQkFfQVNUQ184eDVfRm9ybWF0ID0gMzc4MTM7CiAgICB2YXIgUkdCQV9BU1RDXzh4Nl9Gb3JtYXQgPSAzNzgxNDsKICAgIHZhciBSR0JBX0FTVENfOHg4X0Zvcm1hdCA9IDM3ODE1OwogICAgdmFyIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdCA9IDM3ODE2OwogICAgdmFyIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCA9IDM3ODE3OwogICAgdmFyIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdCA9IDM3ODE4OwogICAgdmFyIFJHQkFfQVNUQ18xMHgxMF9Gb3JtYXQgPSAzNzgxOTsKICAgIHZhciBSR0JBX0FTVENfMTJ4MTBfRm9ybWF0ID0gMzc4MjA7CiAgICB2YXIgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCA9IDM3ODIxOwogICAgdmFyIExvb3BPbmNlID0gMjIwMDsKICAgIHZhciBMb29wUmVwZWF0ID0gMjIwMTsKICAgIHZhciBMb29wUGluZ1BvbmcgPSAyMjAyOwogICAgdmFyIEludGVycG9sYXRlRGlzY3JldGUgPSAyMzAwOwogICAgdmFyIEludGVycG9sYXRlTGluZWFyID0gMjMwMTsKICAgIHZhciBJbnRlcnBvbGF0ZVNtb290aCA9IDIzMDI7CiAgICB2YXIgWmVyb0N1cnZhdHVyZUVuZGluZyA9IDI0MDA7CiAgICB2YXIgWmVyb1Nsb3BlRW5kaW5nID0gMjQwMTsKICAgIHZhciBXcmFwQXJvdW5kRW5kaW5nID0gMjQwMjsKICAgIHZhciBUcmlhbmdsZXNEcmF3TW9kZSA9IDA7CiAgICB2YXIgVHJpYW5nbGVTdHJpcERyYXdNb2RlID0gMTsKICAgIHZhciBUcmlhbmdsZUZhbkRyYXdNb2RlID0gMjsKICAgIHZhciBMaW5lYXJFbmNvZGluZyA9IDMwMDA7CiAgICB2YXIgc1JHQkVuY29kaW5nID0gMzAwMTsKICAgIHZhciBHYW1tYUVuY29kaW5nID0gMzAwNzsKICAgIHZhciBSR0JFRW5jb2RpbmcgPSAzMDAyOwogICAgdmFyIExvZ0x1dkVuY29kaW5nID0gMzAwMzsKICAgIHZhciBSR0JNN0VuY29kaW5nID0gMzAwNDsKICAgIHZhciBSR0JNMTZFbmNvZGluZyA9IDMwMDU7CiAgICB2YXIgUkdCREVuY29kaW5nID0gMzAwNjsKICAgIHZhciBCYXNpY0RlcHRoUGFja2luZyA9IDMyMDA7CiAgICB2YXIgUkdCQURlcHRoUGFja2luZyA9IDMyMDE7CiAgICB2YXIgVGFuZ2VudFNwYWNlTm9ybWFsTWFwID0gMDsKICAgIHZhciBPYmplY3RTcGFjZU5vcm1hbE1hcCA9IDE7CgogICAgdmFyIFplcm9TdGVuY2lsT3AgPSAwOwogICAgdmFyIEtlZXBTdGVuY2lsT3AgPSA3NjgwOwogICAgdmFyIFJlcGxhY2VTdGVuY2lsT3AgPSA3NjgxOwogICAgdmFyIEluY3JlbWVudFN0ZW5jaWxPcCA9IDc2ODI7CiAgICB2YXIgRGVjcmVtZW50U3RlbmNpbE9wID0gNzY4MzsKICAgIHZhciBJbmNyZW1lbnRXcmFwU3RlbmNpbE9wID0gMzQwNTU7CiAgICB2YXIgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCA9IDM0MDU2OwogICAgdmFyIEludmVydFN0ZW5jaWxPcCA9IDUzODY7CgogICAgdmFyIE5ldmVyU3RlbmNpbEZ1bmMgPSA1MTI7CiAgICB2YXIgTGVzc1N0ZW5jaWxGdW5jID0gNTEzOwogICAgdmFyIEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTQ7CiAgICB2YXIgTGVzc0VxdWFsU3RlbmNpbEZ1bmMgPSA1MTU7CiAgICB2YXIgR3JlYXRlclN0ZW5jaWxGdW5jID0gNTE2OwogICAgdmFyIE5vdEVxdWFsU3RlbmNpbEZ1bmMgPSA1MTc7CiAgICB2YXIgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmMgPSA1MTg7CiAgICB2YXIgQWx3YXlzU3RlbmNpbEZ1bmMgPSA1MTk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBfbHV0ID0gW107CgogICAgZm9yICggdmFyIGkgPSAwOyBpIDwgMjU2OyBpICsrICkgewoKICAgIAlfbHV0WyBpIF0gPSAoIGkgPCAxNiA/ICcwJyA6ICcnICkgKyAoIGkgKS50b1N0cmluZyggMTYgKTsKCiAgICB9CgogICAgdmFyIF9NYXRoID0gewoKICAgIAlERUcyUkFEOiBNYXRoLlBJIC8gMTgwLAogICAgCVJBRDJERUc6IDE4MCAvIE1hdGguUEksCgogICAgCWdlbmVyYXRlVVVJRDogZnVuY3Rpb24gKCkgewoKICAgIAkJLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xMDUwMzQvaG93LXRvLWNyZWF0ZS1hLWd1aWQtdXVpZC1pbi1qYXZhc2NyaXB0LzIxOTYzMTM2IzIxOTYzMTM2CgogICAgCQl2YXIgZDAgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7CiAgICAJCXZhciBkMSA9IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZmZmIHwgMDsKICAgIAkJdmFyIGQyID0gTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmZmYgfCAwOwogICAgCQl2YXIgZDMgPSBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmZmZiB8IDA7CiAgICAJCXZhciB1dWlkID0gX2x1dFsgZDAgJiAweGZmIF0gKyBfbHV0WyBkMCA+PiA4ICYgMHhmZiBdICsgX2x1dFsgZDAgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMCA+PiAyNCAmIDB4ZmYgXSArICctJyArCiAgICAJCQlfbHV0WyBkMSAmIDB4ZmYgXSArIF9sdXRbIGQxID4+IDggJiAweGZmIF0gKyAnLScgKyBfbHV0WyBkMSA+PiAxNiAmIDB4MGYgfCAweDQwIF0gKyBfbHV0WyBkMSA+PiAyNCAmIDB4ZmYgXSArICctJyArCiAgICAJCQlfbHV0WyBkMiAmIDB4M2YgfCAweDgwIF0gKyBfbHV0WyBkMiA+PiA4ICYgMHhmZiBdICsgJy0nICsgX2x1dFsgZDIgPj4gMTYgJiAweGZmIF0gKyBfbHV0WyBkMiA+PiAyNCAmIDB4ZmYgXSArCiAgICAJCQlfbHV0WyBkMyAmIDB4ZmYgXSArIF9sdXRbIGQzID4+IDggJiAweGZmIF0gKyBfbHV0WyBkMyA+PiAxNiAmIDB4ZmYgXSArIF9sdXRbIGQzID4+IDI0ICYgMHhmZiBdOwoKICAgIAkJLy8gLnRvVXBwZXJDYXNlKCkgaGVyZSBmbGF0dGVucyBjb25jYXRlbmF0ZWQgc3RyaW5ncyB0byBzYXZlIGhlYXAgbWVtb3J5IHNwYWNlLgogICAgCQlyZXR1cm4gdXVpZC50b1VwcGVyQ2FzZSgpOwoKICAgIAl9LAoKICAgIAljbGFtcDogZnVuY3Rpb24gKCB2YWx1ZSwgbWluLCBtYXggKSB7CgogICAgCQlyZXR1cm4gTWF0aC5tYXgoIG1pbiwgTWF0aC5taW4oIG1heCwgdmFsdWUgKSApOwoKICAgIAl9LAoKICAgIAkvLyBjb21wdXRlIGV1Y2xpZGlhbiBtb2R1bG8gb2YgbSAlIG4KICAgIAkvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Nb2R1bG9fb3BlcmF0aW9uCgogICAgCWV1Y2xpZGVhbk1vZHVsbzogZnVuY3Rpb24gKCBuLCBtICkgewoKICAgIAkJcmV0dXJuICggKCBuICUgbSApICsgbSApICUgbTsKCiAgICAJfSwKCiAgICAJLy8gTGluZWFyIG1hcHBpbmcgZnJvbSByYW5nZSA8YTEsIGEyPiB0byByYW5nZSA8YjEsIGIyPgoKICAgIAltYXBMaW5lYXI6IGZ1bmN0aW9uICggeCwgYTEsIGEyLCBiMSwgYjIgKSB7CgogICAgCQlyZXR1cm4gYjEgKyAoIHggLSBhMSApICogKCBiMiAtIGIxICkgLyAoIGEyIC0gYTEgKTsKCiAgICAJfSwKCiAgICAJLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGluZWFyX2ludGVycG9sYXRpb24KCiAgICAJbGVycDogZnVuY3Rpb24gKCB4LCB5LCB0ICkgewoKICAgIAkJcmV0dXJuICggMSAtIHQgKSAqIHggKyB0ICogeTsKCiAgICAJfSwKCiAgICAJLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TbW9vdGhzdGVwCgogICAgCXNtb290aHN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7CgogICAgCQlpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7CiAgICAJCWlmICggeCA+PSBtYXggKSByZXR1cm4gMTsKCiAgICAJCXggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7CgogICAgCQlyZXR1cm4geCAqIHggKiAoIDMgLSAyICogeCApOwoKICAgIAl9LAoKICAgIAlzbW9vdGhlcnN0ZXA6IGZ1bmN0aW9uICggeCwgbWluLCBtYXggKSB7CgogICAgCQlpZiAoIHggPD0gbWluICkgcmV0dXJuIDA7CiAgICAJCWlmICggeCA+PSBtYXggKSByZXR1cm4gMTsKCiAgICAJCXggPSAoIHggLSBtaW4gKSAvICggbWF4IC0gbWluICk7CgogICAgCQlyZXR1cm4geCAqIHggKiB4ICogKCB4ICogKCB4ICogNiAtIDE1ICkgKyAxMCApOwoKICAgIAl9LAoKICAgIAkvLyBSYW5kb20gaW50ZWdlciBmcm9tIDxsb3csIGhpZ2g+IGludGVydmFsCgogICAgCXJhbmRJbnQ6IGZ1bmN0aW9uICggbG93LCBoaWdoICkgewoKICAgIAkJcmV0dXJuIGxvdyArIE1hdGguZmxvb3IoIE1hdGgucmFuZG9tKCkgKiAoIGhpZ2ggLSBsb3cgKyAxICkgKTsKCiAgICAJfSwKCiAgICAJLy8gUmFuZG9tIGZsb2F0IGZyb20gPGxvdywgaGlnaD4gaW50ZXJ2YWwKCiAgICAJcmFuZEZsb2F0OiBmdW5jdGlvbiAoIGxvdywgaGlnaCApIHsKCiAgICAJCXJldHVybiBsb3cgKyBNYXRoLnJhbmRvbSgpICogKCBoaWdoIC0gbG93ICk7CgogICAgCX0sCgogICAgCS8vIFJhbmRvbSBmbG9hdCBmcm9tIDwtcmFuZ2UvMiwgcmFuZ2UvMj4gaW50ZXJ2YWwKCiAgICAJcmFuZEZsb2F0U3ByZWFkOiBmdW5jdGlvbiAoIHJhbmdlICkgewoKICAgIAkJcmV0dXJuIHJhbmdlICogKCAwLjUgLSBNYXRoLnJhbmRvbSgpICk7CgogICAgCX0sCgogICAgCWRlZ1RvUmFkOiBmdW5jdGlvbiAoIGRlZ3JlZXMgKSB7CgogICAgCQlyZXR1cm4gZGVncmVlcyAqIF9NYXRoLkRFRzJSQUQ7CgogICAgCX0sCgogICAgCXJhZFRvRGVnOiBmdW5jdGlvbiAoIHJhZGlhbnMgKSB7CgogICAgCQlyZXR1cm4gcmFkaWFucyAqIF9NYXRoLlJBRDJERUc7CgogICAgCX0sCgogICAgCWlzUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCXJldHVybiAoIHZhbHVlICYgKCB2YWx1ZSAtIDEgKSApID09PSAwICYmIHZhbHVlICE9PSAwOwoKICAgIAl9LAoKICAgIAljZWlsUG93ZXJPZlR3bzogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCXJldHVybiBNYXRoLnBvdyggMiwgTWF0aC5jZWlsKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTsKCiAgICAJfSwKCiAgICAJZmxvb3JQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJcmV0dXJuIE1hdGgucG93KCAyLCBNYXRoLmZsb29yKCBNYXRoLmxvZyggdmFsdWUgKSAvIE1hdGguTE4yICkgKTsKCiAgICAJfQoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KICAgICAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vCiAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCiAgICAgKi8KCiAgICBmdW5jdGlvbiBWZWN0b3IyKCB4LCB5ICkgewoKICAgIAl0aGlzLnggPSB4IHx8IDA7CiAgICAJdGhpcy55ID0geSB8fCAwOwoKICAgIH0KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggVmVjdG9yMi5wcm90b3R5cGUsIHsKCiAgICAJIndpZHRoIjogewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIHRoaXMueDsKCiAgICAJCX0sCgogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJdGhpcy54ID0gdmFsdWU7CgogICAgCQl9CgogICAgCX0sCgogICAgCSJoZWlnaHQiOiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy55OwoKICAgIAkJfSwKCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQl0aGlzLnkgPSB2YWx1ZTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBWZWN0b3IyLnByb3RvdHlwZSwgewoKICAgIAlpc1ZlY3RvcjI6IHRydWUsCgogICAgCXNldDogZnVuY3Rpb24gKCB4LCB5ICkgewoKICAgIAkJdGhpcy54ID0geDsKICAgIAkJdGhpcy55ID0geTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKICAgIAkJdGhpcy54ID0gc2NhbGFyOwogICAgCQl0aGlzLnkgPSBzY2FsYXI7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0WDogZnVuY3Rpb24gKCB4ICkgewoKICAgIAkJdGhpcy54ID0geDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRZOiBmdW5jdGlvbiAoIHkgKSB7CgogICAgCQl0aGlzLnkgPSB5OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7CgogICAgCQlzd2l0Y2ggKCBpbmRleCApIHsKCiAgICAJCQljYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhazsKICAgIAkJCWNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrOwogICAgCQkJZGVmYXVsdDogdGhyb3cgbmV3IEVycm9yKCAnaW5kZXggaXMgb3V0IG9mIHJhbmdlOiAnICsgaW5kZXggKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXggKSB7CgogICAgCQlzd2l0Y2ggKCBpbmRleCApIHsKCiAgICAJCQljYXNlIDA6IHJldHVybiB0aGlzLng7CiAgICAJCQljYXNlIDE6IHJldHVybiB0aGlzLnk7CiAgICAJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLngsIHRoaXMueSApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQl0aGlzLnggPSB2Lng7CiAgICAJCXRoaXMueSA9IHYueTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHsKCiAgICAJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggKz0gdi54OwogICAgCQl0aGlzLnkgKz0gdi55OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdGhpcy54ICs9IHM7CiAgICAJCXRoaXMueSArPSBzOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZFZlY3RvcnM6IGZ1bmN0aW9uICggYSwgYiApIHsKCiAgICAJCXRoaXMueCA9IGEueCArIGIueDsKICAgIAkJdGhpcy55ID0gYS55ICsgYi55OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkgewoKICAgIAkJdGhpcy54ICs9IHYueCAqIHM7CiAgICAJCXRoaXMueSArPSB2LnkgKiBzOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXN1YjogZnVuY3Rpb24gKCB2LCB3ICkgewoKICAgIAkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLnN1YigpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLnN1YlZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYsIHcgKTsKCiAgICAJCX0KCiAgICAJCXRoaXMueCAtPSB2Lng7CiAgICAJCXRoaXMueSAtPSB2Lnk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc3ViU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CgogICAgCQl0aGlzLnggLT0gczsKICAgIAkJdGhpcy55IC09IHM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKICAgIAkJdGhpcy54ID0gYS54IC0gYi54OwogICAgCQl0aGlzLnkgPSBhLnkgLSBiLnk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbXVsdGlwbHk6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXRoaXMueCAqPSB2Lng7CiAgICAJCXRoaXMueSAqPSB2Lnk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKICAgIAkJdGhpcy54ICo9IHNjYWxhcjsKICAgIAkJdGhpcy55ICo9IHNjYWxhcjsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkaXZpZGU6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXRoaXMueCAvPSB2Lng7CiAgICAJCXRoaXMueSAvPSB2Lnk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZGl2aWRlU2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKCiAgICAJCXJldHVybiB0aGlzLm11bHRpcGx5U2NhbGFyKCAxIC8gc2NhbGFyICk7CgogICAgCX0sCgogICAgCWFwcGx5TWF0cml4MzogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJdmFyIHggPSB0aGlzLngsIHkgPSB0aGlzLnk7CiAgICAJCXZhciBlID0gbS5lbGVtZW50czsKCiAgICAJCXRoaXMueCA9IGVbIDAgXSAqIHggKyBlWyAzIF0gKiB5ICsgZVsgNiBdOwogICAgCQl0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltaW46IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltYXg6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljbGFtcDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKCiAgICAJCS8vIGFzc3VtZXMgbWluIDwgbWF4LCBjb21wb25lbnR3aXNlCgogICAgCQl0aGlzLnggPSBNYXRoLm1heCggbWluLngsIE1hdGgubWluKCBtYXgueCwgdGhpcy54ICkgKTsKICAgIAkJdGhpcy55ID0gTWF0aC5tYXgoIG1pbi55LCBNYXRoLm1pbiggbWF4LnksIHRoaXMueSApICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xhbXBTY2FsYXI6IGZ1bmN0aW9uICggbWluVmFsLCBtYXhWYWwgKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnkgKSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgewoKICAgIAkJdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7CgogICAgCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTsKCiAgICAJfSwKCiAgICAJZmxvb3I6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljZWlsOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXJvdW5kOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTsKICAgIAkJdGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJcm91bmRUb1plcm86IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMueCA9ICggdGhpcy54IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnggKSA6IE1hdGguZmxvb3IoIHRoaXMueCApOwogICAgCQl0aGlzLnkgPSAoIHRoaXMueSA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy55ICkgOiBNYXRoLmZsb29yKCB0aGlzLnkgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAluZWdhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMueCA9IC0gdGhpcy54OwogICAgCQl0aGlzLnkgPSAtIHRoaXMueTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkb3Q6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2Lnk7CgogICAgCX0sCgogICAgCWNyb3NzOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gdGhpcy54ICogdi55IC0gdGhpcy55ICogdi54OwoKICAgIAl9LAoKICAgIAlsZW5ndGhTcTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueTsKCiAgICAJfSwKCiAgICAJbGVuZ3RoOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gTWF0aC5zcXJ0KCB0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkgKTsKCiAgICAJfSwKCiAgICAJbWFuaGF0dGFuTGVuZ3RoOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCApICsgTWF0aC5hYnMoIHRoaXMueSApOwoKICAgIAl9LAoKICAgIAlub3JtYWxpemU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmRpdmlkZVNjYWxhciggdGhpcy5sZW5ndGgoKSB8fCAxICk7CgogICAgCX0sCgogICAgCWFuZ2xlOiBmdW5jdGlvbiAoKSB7CgogICAgCQkvLyBjb21wdXRlcyB0aGUgYW5nbGUgaW4gcmFkaWFucyB3aXRoIHJlc3BlY3QgdG8gdGhlIHBvc2l0aXZlIHgtYXhpcwoKICAgIAkJdmFyIGFuZ2xlID0gTWF0aC5hdGFuMiggdGhpcy55LCB0aGlzLnggKTsKCiAgICAJCWlmICggYW5nbGUgPCAwICkgYW5nbGUgKz0gMiAqIE1hdGguUEk7CgogICAgCQlyZXR1cm4gYW5nbGU7CgogICAgCX0sCgogICAgCWRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApOwoKICAgIAl9LAoKICAgIAlkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkgewoKICAgIAkJdmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueTsKICAgIAkJcmV0dXJuIGR4ICogZHggKyBkeSAqIGR5OwoKICAgIAl9LAoKICAgIAltYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApOwoKICAgIAl9LAoKICAgIAlzZXRMZW5ndGg6IGZ1bmN0aW9uICggbGVuZ3RoICkgewoKICAgIAkJcmV0dXJuIHRoaXMubm9ybWFsaXplKCkubXVsdGlwbHlTY2FsYXIoIGxlbmd0aCApOwoKICAgIAl9LAoKICAgIAlsZXJwOiBmdW5jdGlvbiAoIHYsIGFscGhhICkgewoKICAgIAkJdGhpcy54ICs9ICggdi54IC0gdGhpcy54ICkgKiBhbHBoYTsKICAgIAkJdGhpcy55ICs9ICggdi55IC0gdGhpcy55ICkgKiBhbHBoYTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlsZXJwVmVjdG9yczogZnVuY3Rpb24gKCB2MSwgdjIsIGFscGhhICkgewoKICAgIAkJcmV0dXJuIHRoaXMuc3ViVmVjdG9ycyggdjIsIHYxICkubXVsdGlwbHlTY2FsYXIoIGFscGhhICkuYWRkKCB2MSApOwoKICAgIAl9LAoKICAgIAllcXVhbHM6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXJldHVybiAoICggdi54ID09PSB0aGlzLnggKSAmJiAoIHYueSA9PT0gdGhpcy55ICkgKTsKCiAgICAJfSwKCiAgICAJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCXRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTsKICAgIAkJdGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCWFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDsKICAgIAkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTsKCiAgICAJCXJldHVybiBhcnJheTsKCiAgICAJfSwKCiAgICAJZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKICAgIAkJdGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJcm90YXRlQXJvdW5kOiBmdW5jdGlvbiAoIGNlbnRlciwgYW5nbGUgKSB7CgogICAgCQl2YXIgYyA9IE1hdGguY29zKCBhbmdsZSApLCBzID0gTWF0aC5zaW4oIGFuZ2xlICk7CgogICAgCQl2YXIgeCA9IHRoaXMueCAtIGNlbnRlci54OwogICAgCQl2YXIgeSA9IHRoaXMueSAtIGNlbnRlci55OwoKICAgIAkJdGhpcy54ID0geCAqIGMgLSB5ICogcyArIGNlbnRlci54OwogICAgCQl0aGlzLnkgPSB4ICogcyArIHkgKiBjICsgY2VudGVyLnk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCiAgICAgKi8KCiAgICBmdW5jdGlvbiBRdWF0ZXJuaW9uKCB4LCB5LCB6LCB3ICkgewoKICAgIAl0aGlzLl94ID0geCB8fCAwOwogICAgCXRoaXMuX3kgPSB5IHx8IDA7CiAgICAJdGhpcy5feiA9IHogfHwgMDsKICAgIAl0aGlzLl93ID0gKCB3ICE9PSB1bmRlZmluZWQgKSA/IHcgOiAxOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLCB7CgogICAgCXNsZXJwOiBmdW5jdGlvbiAoIHFhLCBxYiwgcW0sIHQgKSB7CgogICAgCQlyZXR1cm4gcW0uY29weSggcWEgKS5zbGVycCggcWIsIHQgKTsKCiAgICAJfSwKCiAgICAJc2xlcnBGbGF0OiBmdW5jdGlvbiAoIGRzdCwgZHN0T2Zmc2V0LCBzcmMwLCBzcmNPZmZzZXQwLCBzcmMxLCBzcmNPZmZzZXQxLCB0ICkgewoKICAgIAkJLy8gZnV6ei1mcmVlLCBhcnJheS1iYXNlZCBRdWF0ZXJuaW9uIFNMRVJQIG9wZXJhdGlvbgoKICAgIAkJdmFyIHgwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDAgXSwKICAgIAkJCXkwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDEgXSwKICAgIAkJCXowID0gc3JjMFsgc3JjT2Zmc2V0MCArIDIgXSwKICAgIAkJCXcwID0gc3JjMFsgc3JjT2Zmc2V0MCArIDMgXSwKCiAgICAJCQl4MSA9IHNyYzFbIHNyY09mZnNldDEgKyAwIF0sCiAgICAJCQl5MSA9IHNyYzFbIHNyY09mZnNldDEgKyAxIF0sCiAgICAJCQl6MSA9IHNyYzFbIHNyY09mZnNldDEgKyAyIF0sCiAgICAJCQl3MSA9IHNyYzFbIHNyY09mZnNldDEgKyAzIF07CgogICAgCQlpZiAoIHcwICE9PSB3MSB8fCB4MCAhPT0geDEgfHwgeTAgIT09IHkxIHx8IHowICE9PSB6MSApIHsKCiAgICAJCQl2YXIgcyA9IDEgLSB0LAoKICAgIAkJCQljb3MgPSB4MCAqIHgxICsgeTAgKiB5MSArIHowICogejEgKyB3MCAqIHcxLAoKICAgIAkJCQlkaXIgPSAoIGNvcyA+PSAwID8gMSA6IC0gMSApLAogICAgCQkJCXNxclNpbiA9IDEgLSBjb3MgKiBjb3M7CgogICAgCQkJLy8gU2tpcCB0aGUgU2xlcnAgZm9yIHRpbnkgc3RlcHMgdG8gYXZvaWQgbnVtZXJpYyBwcm9ibGVtczoKICAgIAkJCWlmICggc3FyU2luID4gTnVtYmVyLkVQU0lMT04gKSB7CgogICAgCQkJCXZhciBzaW4gPSBNYXRoLnNxcnQoIHNxclNpbiApLAogICAgCQkJCQlsZW4gPSBNYXRoLmF0YW4yKCBzaW4sIGNvcyAqIGRpciApOwoKICAgIAkJCQlzID0gTWF0aC5zaW4oIHMgKiBsZW4gKSAvIHNpbjsKICAgIAkJCQl0ID0gTWF0aC5zaW4oIHQgKiBsZW4gKSAvIHNpbjsKCiAgICAJCQl9CgogICAgCQkJdmFyIHREaXIgPSB0ICogZGlyOwoKICAgIAkJCXgwID0geDAgKiBzICsgeDEgKiB0RGlyOwogICAgCQkJeTAgPSB5MCAqIHMgKyB5MSAqIHREaXI7CiAgICAJCQl6MCA9IHowICogcyArIHoxICogdERpcjsKICAgIAkJCXcwID0gdzAgKiBzICsgdzEgKiB0RGlyOwoKICAgIAkJCS8vIE5vcm1hbGl6ZSBpbiBjYXNlIHdlIGp1c3QgZGlkIGEgbGVycDoKICAgIAkJCWlmICggcyA9PT0gMSAtIHQgKSB7CgogICAgCQkJCXZhciBmID0gMSAvIE1hdGguc3FydCggeDAgKiB4MCArIHkwICogeTAgKyB6MCAqIHowICsgdzAgKiB3MCApOwoKICAgIAkJCQl4MCAqPSBmOwogICAgCQkJCXkwICo9IGY7CiAgICAJCQkJejAgKj0gZjsKICAgIAkJCQl3MCAqPSBmOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWRzdFsgZHN0T2Zmc2V0IF0gPSB4MDsKICAgIAkJZHN0WyBkc3RPZmZzZXQgKyAxIF0gPSB5MDsKICAgIAkJZHN0WyBkc3RPZmZzZXQgKyAyIF0gPSB6MDsKICAgIAkJZHN0WyBkc3RPZmZzZXQgKyAzIF0gPSB3MDsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggUXVhdGVybmlvbi5wcm90b3R5cGUsIHsKCiAgICAJeDogewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIHRoaXMuX3g7CgogICAgCQl9LAoKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCXRoaXMuX3ggPSB2YWx1ZTsKICAgIAkJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJeTogewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIHRoaXMuX3k7CgogICAgCQl9LAoKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCXRoaXMuX3kgPSB2YWx1ZTsKICAgIAkJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJejogewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIHRoaXMuX3o7CgogICAgCQl9LAoKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCXRoaXMuX3ogPSB2YWx1ZTsKICAgIAkJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJdzogewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIHRoaXMuX3c7CgogICAgCQl9LAoKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCXRoaXMuX3cgPSB2YWx1ZTsKICAgIAkJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBRdWF0ZXJuaW9uLnByb3RvdHlwZSwgewoKICAgIAlpc1F1YXRlcm5pb246IHRydWUsCgogICAgCXNldDogZnVuY3Rpb24gKCB4LCB5LCB6LCB3ICkgewoKICAgIAkJdGhpcy5feCA9IHg7CiAgICAJCXRoaXMuX3kgPSB5OwogICAgCQl0aGlzLl96ID0gejsKICAgIAkJdGhpcy5fdyA9IHc7CgogICAgCQl0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5feCwgdGhpcy5feSwgdGhpcy5feiwgdGhpcy5fdyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7CgogICAgCQl0aGlzLl94ID0gcXVhdGVybmlvbi54OwogICAgCQl0aGlzLl95ID0gcXVhdGVybmlvbi55OwogICAgCQl0aGlzLl96ID0gcXVhdGVybmlvbi56OwogICAgCQl0aGlzLl93ID0gcXVhdGVybmlvbi53OwoKICAgIAkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciwgdXBkYXRlICkgewoKICAgIAkJaWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkgewoKICAgIAkJCXRocm93IG5ldyBFcnJvciggJ1RIUkVFLlF1YXRlcm5pb246IC5zZXRGcm9tRXVsZXIoKSBub3cgZXhwZWN0cyBhbiBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTsKCiAgICAJCX0KCiAgICAJCXZhciB4ID0gZXVsZXIuX3gsIHkgPSBldWxlci5feSwgeiA9IGV1bGVyLl96LCBvcmRlciA9IGV1bGVyLm9yZGVyOwoKICAgIAkJLy8gaHR0cDovL3d3dy5tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvZmlsZWV4Y2hhbmdlLwogICAgCQkvLyAJMjA2OTYtZnVuY3Rpb24tdG8tY29udmVydC1iZXR3ZWVuLWRjbS1ldWxlci1hbmdsZXMtcXVhdGVybmlvbnMtYW5kLWV1bGVyLXZlY3RvcnMvCiAgICAJCS8vCWNvbnRlbnQvU3BpbkNhbGMubQoKICAgIAkJdmFyIGNvcyA9IE1hdGguY29zOwogICAgCQl2YXIgc2luID0gTWF0aC5zaW47CgogICAgCQl2YXIgYzEgPSBjb3MoIHggLyAyICk7CiAgICAJCXZhciBjMiA9IGNvcyggeSAvIDIgKTsKICAgIAkJdmFyIGMzID0gY29zKCB6IC8gMiApOwoKICAgIAkJdmFyIHMxID0gc2luKCB4IC8gMiApOwogICAgCQl2YXIgczIgPSBzaW4oIHkgLyAyICk7CiAgICAJCXZhciBzMyA9IHNpbiggeiAvIDIgKTsKCiAgICAJCWlmICggb3JkZXIgPT09ICdYWVonICkgewoKICAgIAkJCXRoaXMuX3ggPSBzMSAqIGMyICogYzMgKyBjMSAqIHMyICogczM7CiAgICAJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzIC0gczEgKiBjMiAqIHMzOwogICAgCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyArIHMxICogczIgKiBjMzsKICAgIAkJCXRoaXMuX3cgPSBjMSAqIGMyICogYzMgLSBzMSAqIHMyICogczM7CgogICAgCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7CgogICAgCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsKICAgIAkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgLSBzMSAqIGMyICogczM7CiAgICAJCQl0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzOwogICAgCQkJdGhpcy5fdyA9IGMxICogYzIgKiBjMyArIHMxICogczIgKiBzMzsKCiAgICAJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHsKCiAgICAJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzOwogICAgCQkJdGhpcy5feSA9IGMxICogczIgKiBjMyArIHMxICogYzIgKiBzMzsKICAgIAkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CiAgICAJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzIC0gczEgKiBzMiAqIHMzOwoKICAgIAkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkgewoKICAgIAkJCXRoaXMuX3ggPSBzMSAqIGMyICogYzMgLSBjMSAqIHMyICogczM7CiAgICAJCQl0aGlzLl95ID0gYzEgKiBzMiAqIGMzICsgczEgKiBjMiAqIHMzOwogICAgCQkJdGhpcy5feiA9IGMxICogYzIgKiBzMyAtIHMxICogczIgKiBjMzsKICAgIAkJCXRoaXMuX3cgPSBjMSAqIGMyICogYzMgKyBzMSAqIHMyICogczM7CgogICAgCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7CgogICAgCQkJdGhpcy5feCA9IHMxICogYzIgKiBjMyArIGMxICogczIgKiBzMzsKICAgIAkJCXRoaXMuX3kgPSBjMSAqIHMyICogYzMgKyBzMSAqIGMyICogczM7CiAgICAJCQl0aGlzLl96ID0gYzEgKiBjMiAqIHMzIC0gczEgKiBzMiAqIGMzOwogICAgCQkJdGhpcy5fdyA9IGMxICogYzIgKiBjMyAtIHMxICogczIgKiBzMzsKCiAgICAJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHsKCiAgICAJCQl0aGlzLl94ID0gczEgKiBjMiAqIGMzIC0gYzEgKiBzMiAqIHMzOwogICAgCQkJdGhpcy5feSA9IGMxICogczIgKiBjMyAtIHMxICogYzIgKiBzMzsKICAgIAkJCXRoaXMuX3ogPSBjMSAqIGMyICogczMgKyBzMSAqIHMyICogYzM7CiAgICAJCQl0aGlzLl93ID0gYzEgKiBjMiAqIGMzICsgczEgKiBzMiAqIHMzOwoKICAgIAkJfQoKICAgIAkJaWYgKCB1cGRhdGUgIT09IGZhbHNlICkgdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21BeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CgogICAgCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvYW5nbGVUb1F1YXRlcm5pb24vaW5kZXguaHRtCgogICAgCQkvLyBhc3N1bWVzIGF4aXMgaXMgbm9ybWFsaXplZAoKICAgIAkJdmFyIGhhbGZBbmdsZSA9IGFuZ2xlIC8gMiwgcyA9IE1hdGguc2luKCBoYWxmQW5nbGUgKTsKCiAgICAJCXRoaXMuX3ggPSBheGlzLnggKiBzOwogICAgCQl0aGlzLl95ID0gYXhpcy55ICogczsKICAgIAkJdGhpcy5feiA9IGF4aXMueiAqIHM7CiAgICAJCXRoaXMuX3cgPSBNYXRoLmNvcyggaGFsZkFuZ2xlICk7CgogICAgCQl0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9RdWF0ZXJuaW9uL2luZGV4Lmh0bQoKICAgIAkJLy8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZCkKCiAgICAJCXZhciB0ZSA9IG0uZWxlbWVudHMsCgogICAgCQkJbTExID0gdGVbIDAgXSwgbTEyID0gdGVbIDQgXSwgbTEzID0gdGVbIDggXSwKICAgIAkJCW0yMSA9IHRlWyAxIF0sIG0yMiA9IHRlWyA1IF0sIG0yMyA9IHRlWyA5IF0sCiAgICAJCQltMzEgPSB0ZVsgMiBdLCBtMzIgPSB0ZVsgNiBdLCBtMzMgPSB0ZVsgMTAgXSwKCiAgICAJCQl0cmFjZSA9IG0xMSArIG0yMiArIG0zMywKICAgIAkJCXM7CgogICAgCQlpZiAoIHRyYWNlID4gMCApIHsKCiAgICAJCQlzID0gMC41IC8gTWF0aC5zcXJ0KCB0cmFjZSArIDEuMCApOwoKICAgIAkJCXRoaXMuX3cgPSAwLjI1IC8gczsKICAgIAkJCXRoaXMuX3ggPSAoIG0zMiAtIG0yMyApICogczsKICAgIAkJCXRoaXMuX3kgPSAoIG0xMyAtIG0zMSApICogczsKICAgIAkJCXRoaXMuX3ogPSAoIG0yMSAtIG0xMiApICogczsKCiAgICAJCX0gZWxzZSBpZiAoIG0xMSA+IG0yMiAmJiBtMTEgPiBtMzMgKSB7CgogICAgCQkJcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTExIC0gbTIyIC0gbTMzICk7CgogICAgCQkJdGhpcy5fdyA9ICggbTMyIC0gbTIzICkgLyBzOwogICAgCQkJdGhpcy5feCA9IDAuMjUgKiBzOwogICAgCQkJdGhpcy5feSA9ICggbTEyICsgbTIxICkgLyBzOwogICAgCQkJdGhpcy5feiA9ICggbTEzICsgbTMxICkgLyBzOwoKICAgIAkJfSBlbHNlIGlmICggbTIyID4gbTMzICkgewoKICAgIAkJCXMgPSAyLjAgKiBNYXRoLnNxcnQoIDEuMCArIG0yMiAtIG0xMSAtIG0zMyApOwoKICAgIAkJCXRoaXMuX3cgPSAoIG0xMyAtIG0zMSApIC8gczsKICAgIAkJCXRoaXMuX3ggPSAoIG0xMiArIG0yMSApIC8gczsKICAgIAkJCXRoaXMuX3kgPSAwLjI1ICogczsKICAgIAkJCXRoaXMuX3ogPSAoIG0yMyArIG0zMiApIC8gczsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJcyA9IDIuMCAqIE1hdGguc3FydCggMS4wICsgbTMzIC0gbTExIC0gbTIyICk7CgogICAgCQkJdGhpcy5fdyA9ICggbTIxIC0gbTEyICkgLyBzOwogICAgCQkJdGhpcy5feCA9ICggbTEzICsgbTMxICkgLyBzOwogICAgCQkJdGhpcy5feSA9ICggbTIzICsgbTMyICkgLyBzOwogICAgCQkJdGhpcy5feiA9IDAuMjUgKiBzOwoKICAgIAkJfQoKICAgIAkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21Vbml0VmVjdG9yczogZnVuY3Rpb24gKCB2RnJvbSwgdlRvICkgewoKICAgIAkJLy8gYXNzdW1lcyBkaXJlY3Rpb24gdmVjdG9ycyB2RnJvbSBhbmQgdlRvIGFyZSBub3JtYWxpemVkCgogICAgCQl2YXIgRVBTID0gMC4wMDAwMDE7CgogICAgCQl2YXIgciA9IHZGcm9tLmRvdCggdlRvICkgKyAxOwoKICAgIAkJaWYgKCByIDwgRVBTICkgewoKICAgIAkJCXIgPSAwOwoKICAgIAkJCWlmICggTWF0aC5hYnMoIHZGcm9tLnggKSA+IE1hdGguYWJzKCB2RnJvbS56ICkgKSB7CgogICAgCQkJCXRoaXMuX3ggPSAtIHZGcm9tLnk7CiAgICAJCQkJdGhpcy5feSA9IHZGcm9tLng7CiAgICAJCQkJdGhpcy5feiA9IDA7CiAgICAJCQkJdGhpcy5fdyA9IHI7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdGhpcy5feCA9IDA7CiAgICAJCQkJdGhpcy5feSA9IC0gdkZyb20uejsKICAgIAkJCQl0aGlzLl96ID0gdkZyb20ueTsKICAgIAkJCQl0aGlzLl93ID0gcjsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGNyb3NzVmVjdG9ycyggdkZyb20sIHZUbyApOyAvLyBpbmxpbmVkIHRvIGF2b2lkIGN5Y2xpYyBkZXBlbmRlbmN5IG9uIFZlY3RvcjMKCiAgICAJCQl0aGlzLl94ID0gdkZyb20ueSAqIHZUby56IC0gdkZyb20ueiAqIHZUby55OwogICAgCQkJdGhpcy5feSA9IHZGcm9tLnogKiB2VG8ueCAtIHZGcm9tLnggKiB2VG8uejsKICAgIAkJCXRoaXMuX3ogPSB2RnJvbS54ICogdlRvLnkgLSB2RnJvbS55ICogdlRvLng7CiAgICAJCQl0aGlzLl93ID0gcjsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgpOwoKICAgIAl9LAoKICAgIAlhbmdsZVRvOiBmdW5jdGlvbiAoIHEgKSB7CgogICAgCQlyZXR1cm4gMiAqIE1hdGguYWNvcyggTWF0aC5hYnMoIF9NYXRoLmNsYW1wKCB0aGlzLmRvdCggcSApLCAtIDEsIDEgKSApICk7CgogICAgCX0sCgogICAgCXJvdGF0ZVRvd2FyZHM6IGZ1bmN0aW9uICggcSwgc3RlcCApIHsKCiAgICAJCXZhciBhbmdsZSA9IHRoaXMuYW5nbGVUbyggcSApOwoKICAgIAkJaWYgKCBhbmdsZSA9PT0gMCApIHJldHVybiB0aGlzOwoKICAgIAkJdmFyIHQgPSBNYXRoLm1pbiggMSwgc3RlcCAvIGFuZ2xlICk7CgogICAgCQl0aGlzLnNsZXJwKCBxLCB0ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJaW52ZXJzZTogZnVuY3Rpb24gKCkgewoKICAgIAkJLy8gcXVhdGVybmlvbiBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGgKCiAgICAJCXJldHVybiB0aGlzLmNvbmp1Z2F0ZSgpOwoKICAgIAl9LAoKICAgIAljb25qdWdhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMuX3ggKj0gLSAxOwogICAgCQl0aGlzLl95ICo9IC0gMTsKICAgIAkJdGhpcy5feiAqPSAtIDE7CgogICAgCQl0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZG90OiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5feCAqIHYuX3ggKyB0aGlzLl95ICogdi5feSArIHRoaXMuX3ogKiB2Ll96ICsgdGhpcy5fdyAqIHYuX3c7CgogICAgCX0sCgogICAgCWxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3c7CgogICAgCX0sCgogICAgCWxlbmd0aDogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIE1hdGguc3FydCggdGhpcy5feCAqIHRoaXMuX3ggKyB0aGlzLl95ICogdGhpcy5feSArIHRoaXMuX3ogKiB0aGlzLl96ICsgdGhpcy5fdyAqIHRoaXMuX3cgKTsKCiAgICAJfSwKCiAgICAJbm9ybWFsaXplOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgbCA9IHRoaXMubGVuZ3RoKCk7CgogICAgCQlpZiAoIGwgPT09IDAgKSB7CgogICAgCQkJdGhpcy5feCA9IDA7CiAgICAJCQl0aGlzLl95ID0gMDsKICAgIAkJCXRoaXMuX3ogPSAwOwogICAgCQkJdGhpcy5fdyA9IDE7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWwgPSAxIC8gbDsKCiAgICAJCQl0aGlzLl94ID0gdGhpcy5feCAqIGw7CiAgICAJCQl0aGlzLl95ID0gdGhpcy5feSAqIGw7CiAgICAJCQl0aGlzLl96ID0gdGhpcy5feiAqIGw7CiAgICAJCQl0aGlzLl93ID0gdGhpcy5fdyAqIGw7CgogICAgCQl9CgogICAgCQl0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbXVsdGlwbHk6IGZ1bmN0aW9uICggcSwgcCApIHsKCiAgICAJCWlmICggcCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlF1YXRlcm5pb246IC5tdWx0aXBseSgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLm11bHRpcGx5UXVhdGVybmlvbnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHAgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHRoaXMsIHEgKTsKCiAgICAJfSwKCiAgICAJcHJlbXVsdGlwbHk6IGZ1bmN0aW9uICggcSApIHsKCiAgICAJCXJldHVybiB0aGlzLm11bHRpcGx5UXVhdGVybmlvbnMoIHEsIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJbXVsdGlwbHlRdWF0ZXJuaW9uczogZnVuY3Rpb24gKCBhLCBiICkgewoKICAgIAkJLy8gZnJvbSBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL2NvZGUvaW5kZXguaHRtCgogICAgCQl2YXIgcWF4ID0gYS5feCwgcWF5ID0gYS5feSwgcWF6ID0gYS5feiwgcWF3ID0gYS5fdzsKICAgIAkJdmFyIHFieCA9IGIuX3gsIHFieSA9IGIuX3ksIHFieiA9IGIuX3osIHFidyA9IGIuX3c7CgogICAgCQl0aGlzLl94ID0gcWF4ICogcWJ3ICsgcWF3ICogcWJ4ICsgcWF5ICogcWJ6IC0gcWF6ICogcWJ5OwogICAgCQl0aGlzLl95ID0gcWF5ICogcWJ3ICsgcWF3ICogcWJ5ICsgcWF6ICogcWJ4IC0gcWF4ICogcWJ6OwogICAgCQl0aGlzLl96ID0gcWF6ICogcWJ3ICsgcWF3ICogcWJ6ICsgcWF4ICogcWJ5IC0gcWF5ICogcWJ4OwogICAgCQl0aGlzLl93ID0gcWF3ICogcWJ3IC0gcWF4ICogcWJ4IC0gcWF5ICogcWJ5IC0gcWF6ICogcWJ6OwoKICAgIAkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNsZXJwOiBmdW5jdGlvbiAoIHFiLCB0ICkgewoKICAgIAkJaWYgKCB0ID09PSAwICkgcmV0dXJuIHRoaXM7CiAgICAJCWlmICggdCA9PT0gMSApIHJldHVybiB0aGlzLmNvcHkoIHFiICk7CgogICAgCQl2YXIgeCA9IHRoaXMuX3gsIHkgPSB0aGlzLl95LCB6ID0gdGhpcy5feiwgdyA9IHRoaXMuX3c7CgogICAgCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL3JlYWxOb3JtZWRBbGdlYnJhL3F1YXRlcm5pb25zL3NsZXJwLwoKICAgIAkJdmFyIGNvc0hhbGZUaGV0YSA9IHcgKiBxYi5fdyArIHggKiBxYi5feCArIHkgKiBxYi5feSArIHogKiBxYi5fejsKCiAgICAJCWlmICggY29zSGFsZlRoZXRhIDwgMCApIHsKCiAgICAJCQl0aGlzLl93ID0gLSBxYi5fdzsKICAgIAkJCXRoaXMuX3ggPSAtIHFiLl94OwogICAgCQkJdGhpcy5feSA9IC0gcWIuX3k7CiAgICAJCQl0aGlzLl96ID0gLSBxYi5fejsKCiAgICAJCQljb3NIYWxmVGhldGEgPSAtIGNvc0hhbGZUaGV0YTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdGhpcy5jb3B5KCBxYiApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBjb3NIYWxmVGhldGEgPj0gMS4wICkgewoKICAgIAkJCXRoaXMuX3cgPSB3OwogICAgCQkJdGhpcy5feCA9IHg7CiAgICAJCQl0aGlzLl95ID0geTsKICAgIAkJCXRoaXMuX3ogPSB6OwoKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQoKICAgIAkJdmFyIHNxclNpbkhhbGZUaGV0YSA9IDEuMCAtIGNvc0hhbGZUaGV0YSAqIGNvc0hhbGZUaGV0YTsKCiAgICAJCWlmICggc3FyU2luSGFsZlRoZXRhIDw9IE51bWJlci5FUFNJTE9OICkgewoKICAgIAkJCXZhciBzID0gMSAtIHQ7CiAgICAJCQl0aGlzLl93ID0gcyAqIHcgKyB0ICogdGhpcy5fdzsKICAgIAkJCXRoaXMuX3ggPSBzICogeCArIHQgKiB0aGlzLl94OwogICAgCQkJdGhpcy5feSA9IHMgKiB5ICsgdCAqIHRoaXMuX3k7CiAgICAJCQl0aGlzLl96ID0gcyAqIHogKyB0ICogdGhpcy5fejsKCiAgICAJCQl0aGlzLm5vcm1hbGl6ZSgpOwogICAgCQkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQoKICAgIAkJdmFyIHNpbkhhbGZUaGV0YSA9IE1hdGguc3FydCggc3FyU2luSGFsZlRoZXRhICk7CiAgICAJCXZhciBoYWxmVGhldGEgPSBNYXRoLmF0YW4yKCBzaW5IYWxmVGhldGEsIGNvc0hhbGZUaGV0YSApOwogICAgCQl2YXIgcmF0aW9BID0gTWF0aC5zaW4oICggMSAtIHQgKSAqIGhhbGZUaGV0YSApIC8gc2luSGFsZlRoZXRhLAogICAgCQkJcmF0aW9CID0gTWF0aC5zaW4oIHQgKiBoYWxmVGhldGEgKSAvIHNpbkhhbGZUaGV0YTsKCiAgICAJCXRoaXMuX3cgPSAoIHcgKiByYXRpb0EgKyB0aGlzLl93ICogcmF0aW9CICk7CiAgICAJCXRoaXMuX3ggPSAoIHggKiByYXRpb0EgKyB0aGlzLl94ICogcmF0aW9CICk7CiAgICAJCXRoaXMuX3kgPSAoIHkgKiByYXRpb0EgKyB0aGlzLl95ICogcmF0aW9CICk7CiAgICAJCXRoaXMuX3ogPSAoIHogKiByYXRpb0EgKyB0aGlzLl96ICogcmF0aW9CICk7CgogICAgCQl0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIHF1YXRlcm5pb24gKSB7CgogICAgCQlyZXR1cm4gKCBxdWF0ZXJuaW9uLl94ID09PSB0aGlzLl94ICkgJiYgKCBxdWF0ZXJuaW9uLl95ID09PSB0aGlzLl95ICkgJiYgKCBxdWF0ZXJuaW9uLl96ID09PSB0aGlzLl96ICkgJiYgKCBxdWF0ZXJuaW9uLl93ID09PSB0aGlzLl93ICk7CgogICAgCX0sCgogICAgCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgogICAgCQl0aGlzLl94ID0gYXJyYXlbIG9mZnNldCBdOwogICAgCQl0aGlzLl95ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKICAgIAkJdGhpcy5feiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CiAgICAJCXRoaXMuX3cgPSBhcnJheVsgb2Zmc2V0ICsgMyBdOwoKICAgIAkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCiAgICAJCWlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107CiAgICAJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKICAgIAkJYXJyYXlbIG9mZnNldCBdID0gdGhpcy5feDsKICAgIAkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMuX3k7CiAgICAJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLl96OwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMyBdID0gdGhpcy5fdzsKCiAgICAJCXJldHVybiBhcnJheTsKCiAgICAJfSwKCiAgICAJX29uQ2hhbmdlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgewoKICAgIAkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjayA9IGNhbGxiYWNrOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCV9vbkNoYW5nZUNhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvCiAgICAgKiBAYXV0aG9yIHBoaWxvZ2IgLyBodHRwOi8vYmxvZy50aGVqaXQub3JnLwogICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KICAgICAqIEBhdXRob3IgZWdyYWV0aGVyIC8gaHR0cDovL2VncmFldGhlci5jb20vCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqLwoKICAgIHZhciBfdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfcXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CgogICAgZnVuY3Rpb24gVmVjdG9yMyggeCwgeSwgeiApIHsKCiAgICAJdGhpcy54ID0geCB8fCAwOwogICAgCXRoaXMueSA9IHkgfHwgMDsKICAgIAl0aGlzLnogPSB6IHx8IDA7CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFZlY3RvcjMucHJvdG90eXBlLCB7CgogICAgCWlzVmVjdG9yMzogdHJ1ZSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CgogICAgCQl0aGlzLnggPSB4OwogICAgCQl0aGlzLnkgPSB5OwogICAgCQl0aGlzLnogPSB6OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgogICAgCQl0aGlzLnggPSBzY2FsYXI7CiAgICAJCXRoaXMueSA9IHNjYWxhcjsKICAgIAkJdGhpcy56ID0gc2NhbGFyOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFg6IGZ1bmN0aW9uICggeCApIHsKCiAgICAJCXRoaXMueCA9IHg7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0WTogZnVuY3Rpb24gKCB5ICkgewoKICAgIAkJdGhpcy55ID0geTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRaOiBmdW5jdGlvbiAoIHogKSB7CgogICAgCQl0aGlzLnogPSB6OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCwgdmFsdWUgKSB7CgogICAgCQlzd2l0Y2ggKCBpbmRleCApIHsKCiAgICAJCQljYXNlIDA6IHRoaXMueCA9IHZhbHVlOyBicmVhazsKICAgIAkJCWNhc2UgMTogdGhpcy55ID0gdmFsdWU7IGJyZWFrOwogICAgCQkJY2FzZSAyOiB0aGlzLnogPSB2YWx1ZTsgYnJlYWs7CiAgICAJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCXN3aXRjaCAoIGluZGV4ICkgewoKICAgIAkJCWNhc2UgMDogcmV0dXJuIHRoaXMueDsKICAgIAkJCWNhc2UgMTogcmV0dXJuIHRoaXMueTsKICAgIAkJCWNhc2UgMjogcmV0dXJuIHRoaXMuejsKICAgIAkJCWRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnogKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCB2ICkgewoKICAgIAkJdGhpcy54ID0gdi54OwogICAgCQl0aGlzLnkgPSB2Lnk7CiAgICAJCXRoaXMueiA9IHYuejsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhZGQ6IGZ1bmN0aW9uICggdiwgdyApIHsKCiAgICAJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5hZGQoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5hZGRWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy5hZGRWZWN0b3JzKCB2LCB3ICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggKz0gdi54OwogICAgCQl0aGlzLnkgKz0gdi55OwogICAgCQl0aGlzLnogKz0gdi56OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdGhpcy54ICs9IHM7CiAgICAJCXRoaXMueSArPSBzOwogICAgCQl0aGlzLnogKz0gczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgogICAgCQl0aGlzLnggPSBhLnggKyBiLng7CiAgICAJCXRoaXMueSA9IGEueSArIGIueTsKICAgIAkJdGhpcy56ID0gYS56ICsgYi56OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZFNjYWxlZFZlY3RvcjogZnVuY3Rpb24gKCB2LCBzICkgewoKICAgIAkJdGhpcy54ICs9IHYueCAqIHM7CiAgICAJCXRoaXMueSArPSB2LnkgKiBzOwogICAgCQl0aGlzLnogKz0gdi56ICogczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzdWI6IGZ1bmN0aW9uICggdiwgdyApIHsKCiAgICAJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggLT0gdi54OwogICAgCQl0aGlzLnkgLT0gdi55OwogICAgCQl0aGlzLnogLT0gdi56OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdGhpcy54IC09IHM7CiAgICAJCXRoaXMueSAtPSBzOwogICAgCQl0aGlzLnogLT0gczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzdWJWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgogICAgCQl0aGlzLnggPSBhLnggLSBiLng7CiAgICAJCXRoaXMueSA9IGEueSAtIGIueTsKICAgIAkJdGhpcy56ID0gYS56IC0gYi56OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW11bHRpcGx5OiBmdW5jdGlvbiAoIHYsIHcgKSB7CgogICAgCQlpZiAoIHcgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAubXVsdGlwbHkoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5tdWx0aXBseVZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzLm11bHRpcGx5VmVjdG9ycyggdiwgdyApOwoKICAgIAkJfQoKICAgIAkJdGhpcy54ICo9IHYueDsKICAgIAkJdGhpcy55ICo9IHYueTsKICAgIAkJdGhpcy56ICo9IHYuejsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgogICAgCQl0aGlzLnggKj0gc2NhbGFyOwogICAgCQl0aGlzLnkgKj0gc2NhbGFyOwogICAgCQl0aGlzLnogKj0gc2NhbGFyOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW11bHRpcGx5VmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKICAgIAkJdGhpcy54ID0gYS54ICogYi54OwogICAgCQl0aGlzLnkgPSBhLnkgKiBiLnk7CiAgICAJCXRoaXMueiA9IGEueiAqIGIuejsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhcHBseUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkgewoKICAgIAkJaWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuYXBwbHlFdWxlcigpIG5vdyBleHBlY3RzIGFuIEV1bGVyIHJvdGF0aW9uIHJhdGhlciB0aGFuIGEgVmVjdG9yMyBhbmQgb3JkZXIuJyApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXMuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyICkgKTsKCiAgICAJfSwKCiAgICAJYXBwbHlBeGlzQW5nbGU6IGZ1bmN0aW9uICggYXhpcywgYW5nbGUgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICkgKTsKCiAgICAJfSwKCiAgICAJYXBwbHlNYXRyaXgzOiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejsKICAgIAkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKICAgIAkJdGhpcy54ID0gZVsgMCBdICogeCArIGVbIDMgXSAqIHkgKyBlWyA2IF0gKiB6OwogICAgCQl0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNCBdICogeSArIGVbIDcgXSAqIHo7CiAgICAJCXRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOCBdICogejsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHsKCiAgICAJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OwogICAgCQl2YXIgZSA9IG0uZWxlbWVudHM7CgogICAgCQl2YXIgdyA9IDEgLyAoIGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICk7CgogICAgCQl0aGlzLnggPSAoIGVbIDAgXSAqIHggKyBlWyA0IF0gKiB5ICsgZVsgOCBdICogeiArIGVbIDEyIF0gKSAqIHc7CiAgICAJCXRoaXMueSA9ICggZVsgMSBdICogeCArIGVbIDUgXSAqIHkgKyBlWyA5IF0gKiB6ICsgZVsgMTMgXSApICogdzsKICAgIAkJdGhpcy56ID0gKCBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSApICogdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhcHBseVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKCiAgICAJCXZhciB4ID0gdGhpcy54LCB5ID0gdGhpcy55LCB6ID0gdGhpcy56OwogICAgCQl2YXIgcXggPSBxLngsIHF5ID0gcS55LCBxeiA9IHEueiwgcXcgPSBxLnc7CgogICAgCQkvLyBjYWxjdWxhdGUgcXVhdCAqIHZlY3RvcgoKICAgIAkJdmFyIGl4ID0gcXcgKiB4ICsgcXkgKiB6IC0gcXogKiB5OwogICAgCQl2YXIgaXkgPSBxdyAqIHkgKyBxeiAqIHggLSBxeCAqIHo7CiAgICAJCXZhciBpeiA9IHF3ICogeiArIHF4ICogeSAtIHF5ICogeDsKICAgIAkJdmFyIGl3ID0gLSBxeCAqIHggLSBxeSAqIHkgLSBxeiAqIHo7CgogICAgCQkvLyBjYWxjdWxhdGUgcmVzdWx0ICogaW52ZXJzZSBxdWF0CgogICAgCQl0aGlzLnggPSBpeCAqIHF3ICsgaXcgKiAtIHF4ICsgaXkgKiAtIHF6IC0gaXogKiAtIHF5OwogICAgCQl0aGlzLnkgPSBpeSAqIHF3ICsgaXcgKiAtIHF5ICsgaXogKiAtIHF4IC0gaXggKiAtIHF6OwogICAgCQl0aGlzLnogPSBpeiAqIHF3ICsgaXcgKiAtIHF6ICsgaXggKiAtIHF5IC0gaXkgKiAtIHF4OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXByb2plY3Q6IGZ1bmN0aW9uICggY2FtZXJhICkgewoKICAgIAkJcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICkuYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCApOwoKICAgIAl9LAoKICAgIAl1bnByb2plY3Q6IGZ1bmN0aW9uICggY2FtZXJhICkgewoKICAgIAkJcmV0dXJuIHRoaXMuYXBwbHlNYXRyaXg0KCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeEludmVyc2UgKS5hcHBseU1hdHJpeDQoIGNhbWVyYS5tYXRyaXhXb3JsZCApOwoKICAgIAl9LAoKICAgIAl0cmFuc2Zvcm1EaXJlY3Rpb246IGZ1bmN0aW9uICggbSApIHsKCiAgICAJCS8vIGlucHV0OiBUSFJFRS5NYXRyaXg0IGFmZmluZSBtYXRyaXgKICAgIAkJLy8gdmVjdG9yIGludGVycHJldGVkIGFzIGEgZGlyZWN0aW9uCgogICAgCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMuejsKICAgIAkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKICAgIAkJdGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6OwogICAgCQl0aGlzLnkgPSBlWyAxIF0gKiB4ICsgZVsgNSBdICogeSArIGVbIDkgXSAqIHo7CiAgICAJCXRoaXMueiA9IGVbIDIgXSAqIHggKyBlWyA2IF0gKiB5ICsgZVsgMTAgXSAqIHo7CgogICAgCQlyZXR1cm4gdGhpcy5ub3JtYWxpemUoKTsKCiAgICAJfSwKCiAgICAJZGl2aWRlOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQl0aGlzLnggLz0gdi54OwogICAgCQl0aGlzLnkgLz0gdi55OwogICAgCQl0aGlzLnogLz0gdi56OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWRpdmlkZVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5tdWx0aXBseVNjYWxhciggMSAvIHNjYWxhciApOwoKICAgIAl9LAoKICAgIAltaW46IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXRoaXMueCA9IE1hdGgubWluKCB0aGlzLngsIHYueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1pbiggdGhpcy55LCB2LnkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5taW4oIHRoaXMueiwgdi56ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWF4OiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLm1heCggdGhpcy54LCB2LnggKTsKICAgIAkJdGhpcy55ID0gTWF0aC5tYXgoIHRoaXMueSwgdi55ICk7CiAgICAJCXRoaXMueiA9IE1hdGgubWF4KCB0aGlzLnosIHYueiApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgewoKICAgIAkJLy8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2UKCiAgICAJCXRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xhbXBTY2FsYXI6IGZ1bmN0aW9uICggbWluVmFsLCBtYXhWYWwgKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnggKSApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnkgKSApOwogICAgCQl0aGlzLnogPSBNYXRoLm1heCggbWluVmFsLCBNYXRoLm1pbiggbWF4VmFsLCB0aGlzLnogKSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsYW1wTGVuZ3RoOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgewoKICAgIAkJdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoKCk7CgogICAgCQlyZXR1cm4gdGhpcy5kaXZpZGVTY2FsYXIoIGxlbmd0aCB8fCAxICkubXVsdGlwbHlTY2FsYXIoIE1hdGgubWF4KCBtaW4sIE1hdGgubWluKCBtYXgsIGxlbmd0aCApICkgKTsKCiAgICAJfSwKCiAgICAJZmxvb3I6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMueCA9IE1hdGguZmxvb3IoIHRoaXMueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLmZsb29yKCB0aGlzLnkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5mbG9vciggdGhpcy56ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2VpbDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy54ID0gTWF0aC5jZWlsKCB0aGlzLnggKTsKICAgIAkJdGhpcy55ID0gTWF0aC5jZWlsKCB0aGlzLnkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5jZWlsKCB0aGlzLnogKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyb3VuZDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy54ID0gTWF0aC5yb3VuZCggdGhpcy54ICk7CiAgICAJCXRoaXMueSA9IE1hdGgucm91bmQoIHRoaXMueSApOwogICAgCQl0aGlzLnogPSBNYXRoLnJvdW5kKCB0aGlzLnogKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7CiAgICAJCXRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApOwogICAgCQl0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAluZWdhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMueCA9IC0gdGhpcy54OwogICAgCQl0aGlzLnkgPSAtIHRoaXMueTsKICAgIAkJdGhpcy56ID0gLSB0aGlzLno7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZG90OiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gdGhpcy54ICogdi54ICsgdGhpcy55ICogdi55ICsgdGhpcy56ICogdi56OwoKICAgIAl9LAoKICAgIAkvLyBUT0RPIGxlbmd0aFNxdWFyZWQ/CgogICAgCWxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56OwoKICAgIAl9LAoKICAgIAlsZW5ndGg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiApOwoKICAgIAl9LAoKICAgIAltYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICk7CgogICAgCX0sCgogICAgCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTsKCiAgICAJfSwKCiAgICAJc2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHsKCiAgICAJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTsKCiAgICAJfSwKCiAgICAJbGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHsKCiAgICAJCXRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7CiAgICAJCXRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7CiAgICAJCXRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHsKCiAgICAJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTsKCiAgICAJfSwKCiAgICAJY3Jvc3M6IGZ1bmN0aW9uICggdiwgdyApIHsKCiAgICAJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5jcm9zcygpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmNyb3NzVmVjdG9ycyggYSwgYiApIGluc3RlYWQuJyApOwogICAgCQkJcmV0dXJuIHRoaXMuY3Jvc3NWZWN0b3JzKCB2LCB3ICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpcy5jcm9zc1ZlY3RvcnMoIHRoaXMsIHYgKTsKCiAgICAJfSwKCiAgICAJY3Jvc3NWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgogICAgCQl2YXIgYXggPSBhLngsIGF5ID0gYS55LCBheiA9IGEuejsKICAgIAkJdmFyIGJ4ID0gYi54LCBieSA9IGIueSwgYnogPSBiLno7CgogICAgCQl0aGlzLnggPSBheSAqIGJ6IC0gYXogKiBieTsKICAgIAkJdGhpcy55ID0gYXogKiBieCAtIGF4ICogYno7CiAgICAJCXRoaXMueiA9IGF4ICogYnkgLSBheSAqIGJ4OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXByb2plY3RPblZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CgogICAgCQl2YXIgc2NhbGFyID0gdmVjdG9yLmRvdCggdGhpcyApIC8gdmVjdG9yLmxlbmd0aFNxKCk7CgogICAgCQlyZXR1cm4gdGhpcy5jb3B5KCB2ZWN0b3IgKS5tdWx0aXBseVNjYWxhciggc2NhbGFyICk7CgogICAgCX0sCgogICAgCXByb2plY3RPblBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lTm9ybWFsICkgewoKICAgIAkJX3ZlY3Rvci5jb3B5KCB0aGlzICkucHJvamVjdE9uVmVjdG9yKCBwbGFuZU5vcm1hbCApOwoKICAgIAkJcmV0dXJuIHRoaXMuc3ViKCBfdmVjdG9yICk7CgogICAgCX0sCgogICAgCXJlZmxlY3Q6IGZ1bmN0aW9uICggbm9ybWFsICkgewoKICAgIAkJLy8gcmVmbGVjdCBpbmNpZGVudCB2ZWN0b3Igb2ZmIHBsYW5lIG9ydGhvZ29uYWwgdG8gbm9ybWFsCiAgICAJCS8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGhhdmUgdW5pdCBsZW5ndGgKCiAgICAJCXJldHVybiB0aGlzLnN1YiggX3ZlY3Rvci5jb3B5KCBub3JtYWwgKS5tdWx0aXBseVNjYWxhciggMiAqIHRoaXMuZG90KCBub3JtYWwgKSApICk7CgogICAgCX0sCgogICAgCWFuZ2xlVG86IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXZhciB0aGV0YSA9IHRoaXMuZG90KCB2ICkgLyAoIE1hdGguc3FydCggdGhpcy5sZW5ndGhTcSgpICogdi5sZW5ndGhTcSgpICkgKTsKCiAgICAJCS8vIGNsYW1wLCB0byBoYW5kbGUgbnVtZXJpY2FsIHByb2JsZW1zCgogICAgCQlyZXR1cm4gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGhldGEsIC0gMSwgMSApICk7CgogICAgCX0sCgogICAgCWRpc3RhbmNlVG86IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMuZGlzdGFuY2VUb1NxdWFyZWQoIHYgKSApOwoKICAgIAl9LAoKICAgIAlkaXN0YW5jZVRvU3F1YXJlZDogZnVuY3Rpb24gKCB2ICkgewoKICAgIAkJdmFyIGR4ID0gdGhpcy54IC0gdi54LCBkeSA9IHRoaXMueSAtIHYueSwgZHogPSB0aGlzLnogLSB2Lno7CgogICAgCQlyZXR1cm4gZHggKiBkeCArIGR5ICogZHkgKyBkeiAqIGR6OwoKICAgIAl9LAoKICAgIAltYW5oYXR0YW5EaXN0YW5jZVRvOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gTWF0aC5hYnMoIHRoaXMueCAtIHYueCApICsgTWF0aC5hYnMoIHRoaXMueSAtIHYueSApICsgTWF0aC5hYnMoIHRoaXMueiAtIHYueiApOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tU3BoZXJpY2FsOiBmdW5jdGlvbiAoIHMgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5zZXRGcm9tU3BoZXJpY2FsQ29vcmRzKCBzLnJhZGl1cywgcy5waGksIHMudGhldGEgKTsKCiAgICAJfSwKCiAgICAJc2V0RnJvbVNwaGVyaWNhbENvb3JkczogZnVuY3Rpb24gKCByYWRpdXMsIHBoaSwgdGhldGEgKSB7CgogICAgCQl2YXIgc2luUGhpUmFkaXVzID0gTWF0aC5zaW4oIHBoaSApICogcmFkaXVzOwoKICAgIAkJdGhpcy54ID0gc2luUGhpUmFkaXVzICogTWF0aC5zaW4oIHRoZXRhICk7CiAgICAJCXRoaXMueSA9IE1hdGguY29zKCBwaGkgKSAqIHJhZGl1czsKICAgIAkJdGhpcy56ID0gc2luUGhpUmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbUN5bGluZHJpY2FsOiBmdW5jdGlvbiAoIGMgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5zZXRGcm9tQ3lsaW5kcmljYWxDb29yZHMoIGMucmFkaXVzLCBjLnRoZXRhLCBjLnkgKTsKCiAgICAJfSwKCiAgICAJc2V0RnJvbUN5bGluZHJpY2FsQ29vcmRzOiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7CgogICAgCQl0aGlzLnggPSByYWRpdXMgKiBNYXRoLnNpbiggdGhldGEgKTsKICAgIAkJdGhpcy55ID0geTsKICAgIAkJdGhpcy56ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbU1hdHJpeFBvc2l0aW9uOiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQl2YXIgZSA9IG0uZWxlbWVudHM7CgogICAgCQl0aGlzLnggPSBlWyAxMiBdOwogICAgCQl0aGlzLnkgPSBlWyAxMyBdOwogICAgCQl0aGlzLnogPSBlWyAxNCBdOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21NYXRyaXhTY2FsZTogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJdmFyIHN4ID0gdGhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAwICkubGVuZ3RoKCk7CiAgICAJCXZhciBzeSA9IHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpOwogICAgCQl2YXIgc3ogPSB0aGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDIgKS5sZW5ndGgoKTsKCiAgICAJCXRoaXMueCA9IHN4OwogICAgCQl0aGlzLnkgPSBzeTsKICAgIAkJdGhpcy56ID0gc3o7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbU1hdHJpeENvbHVtbjogZnVuY3Rpb24gKCBtLCBpbmRleCApIHsKCiAgICAJCXJldHVybiB0aGlzLmZyb21BcnJheSggbS5lbGVtZW50cywgaW5kZXggKiA0ICk7CgogICAgCX0sCgogICAgCWVxdWFsczogZnVuY3Rpb24gKCB2ICkgewoKICAgIAkJcmV0dXJuICggKCB2LnggPT09IHRoaXMueCApICYmICggdi55ID09PSB0aGlzLnkgKSAmJiAoIHYueiA9PT0gdGhpcy56ICkgKTsKCiAgICAJfSwKCiAgICAJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCXRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTsKICAgIAkJdGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKICAgIAkJdGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCWFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDsKICAgIAkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejsKCiAgICAJCXJldHVybiBhcnJheTsKCiAgICAJfSwKCiAgICAJZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKICAgIAkJdGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7CiAgICAJCXRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICB2YXIgX3ZlY3RvciQxID0gbmV3IFZlY3RvcjMoKTsKCiAgICBmdW5jdGlvbiBNYXRyaXgzKCkgewoKICAgIAl0aGlzLmVsZW1lbnRzID0gWwoKICAgIAkJMSwgMCwgMCwKICAgIAkJMCwgMSwgMCwKICAgIAkJMCwgMCwgMQoKICAgIAldOwoKICAgIAlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApOwoKICAgIAl9CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIE1hdHJpeDMucHJvdG90eXBlLCB7CgogICAgCWlzTWF0cml4MzogdHJ1ZSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4yMSwgbjIyLCBuMjMsIG4zMSwgbjMyLCBuMzMgKSB7CgogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKICAgIAkJdGVbIDAgXSA9IG4xMTsgdGVbIDEgXSA9IG4yMTsgdGVbIDIgXSA9IG4zMTsKICAgIAkJdGVbIDMgXSA9IG4xMjsgdGVbIDQgXSA9IG4yMjsgdGVbIDUgXSA9IG4zMjsKICAgIAkJdGVbIDYgXSA9IG4xMzsgdGVbIDcgXSA9IG4yMzsgdGVbIDggXSA9IG4zMzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlpZGVudGl0eTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5zZXQoCgogICAgCQkJMSwgMCwgMCwKICAgIAkJCTAsIDEsIDAsCiAgICAJCQkwLCAwLCAxCgogICAgCQkpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKICAgIAkJdmFyIG1lID0gbS5lbGVtZW50czsKCiAgICAJCXRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07CiAgICAJCXRlWyAzIF0gPSBtZVsgMyBdOyB0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07CiAgICAJCXRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsgdGVbIDggXSA9IG1lWyA4IF07CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbU1hdHJpeDQ6IGZ1bmN0aW9uICggbSApIHsKCiAgICAJCXZhciBtZSA9IG0uZWxlbWVudHM7CgogICAgCQl0aGlzLnNldCgKCiAgICAJCQltZVsgMCBdLCBtZVsgNCBdLCBtZVsgOCBdLAogICAgCQkJbWVbIDEgXSwgbWVbIDUgXSwgbWVbIDkgXSwKICAgIAkJCW1lWyAyIF0sIG1lWyA2IF0sIG1lWyAxMCBdCgogICAgCQkpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFwcGx5VG9CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlICkgewoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gYXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQlfdmVjdG9yJDEueCA9IGF0dHJpYnV0ZS5nZXRYKCBpICk7CiAgICAJCQlfdmVjdG9yJDEueSA9IGF0dHJpYnV0ZS5nZXRZKCBpICk7CiAgICAJCQlfdmVjdG9yJDEueiA9IGF0dHJpYnV0ZS5nZXRaKCBpICk7CgogICAgCQkJX3ZlY3RvciQxLmFwcGx5TWF0cml4MyggdGhpcyApOwoKICAgIAkJCWF0dHJpYnV0ZS5zZXRYWVooIGksIF92ZWN0b3IkMS54LCBfdmVjdG9yJDEueSwgX3ZlY3RvciQxLnogKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBhdHRyaWJ1dGU7CgogICAgCX0sCgogICAgCW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQlyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLCBtICk7CgogICAgCX0sCgogICAgCXByZW11bHRpcGx5OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQlyZXR1cm4gdGhpcy5tdWx0aXBseU1hdHJpY2VzKCBtLCB0aGlzICk7CgogICAgCX0sCgogICAgCW11bHRpcGx5TWF0cmljZXM6IGZ1bmN0aW9uICggYSwgYiApIHsKCiAgICAJCXZhciBhZSA9IGEuZWxlbWVudHM7CiAgICAJCXZhciBiZSA9IGIuZWxlbWVudHM7CiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl2YXIgYTExID0gYWVbIDAgXSwgYTEyID0gYWVbIDMgXSwgYTEzID0gYWVbIDYgXTsKICAgIAkJdmFyIGEyMSA9IGFlWyAxIF0sIGEyMiA9IGFlWyA0IF0sIGEyMyA9IGFlWyA3IF07CiAgICAJCXZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNSBdLCBhMzMgPSBhZVsgOCBdOwoKICAgIAkJdmFyIGIxMSA9IGJlWyAwIF0sIGIxMiA9IGJlWyAzIF0sIGIxMyA9IGJlWyA2IF07CiAgICAJCXZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNCBdLCBiMjMgPSBiZVsgNyBdOwogICAgCQl2YXIgYjMxID0gYmVbIDIgXSwgYjMyID0gYmVbIDUgXSwgYjMzID0gYmVbIDggXTsKCiAgICAJCXRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzE7CiAgICAJCXRlWyAzIF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzI7CiAgICAJCXRlWyA2IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzM7CgogICAgCQl0ZVsgMSBdID0gYTIxICogYjExICsgYTIyICogYjIxICsgYTIzICogYjMxOwogICAgCQl0ZVsgNCBdID0gYTIxICogYjEyICsgYTIyICogYjIyICsgYTIzICogYjMyOwogICAgCQl0ZVsgNyBdID0gYTIxICogYjEzICsgYTIyICogYjIzICsgYTIzICogYjMzOwoKICAgIAkJdGVbIDIgXSA9IGEzMSAqIGIxMSArIGEzMiAqIGIyMSArIGEzMyAqIGIzMTsKICAgIAkJdGVbIDUgXSA9IGEzMSAqIGIxMiArIGEzMiAqIGIyMiArIGEzMyAqIGIzMjsKICAgIAkJdGVbIDggXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCiAgICAJCXRlWyAwIF0gKj0gczsgdGVbIDMgXSAqPSBzOyB0ZVsgNiBdICo9IHM7CiAgICAJCXRlWyAxIF0gKj0gczsgdGVbIDQgXSAqPSBzOyB0ZVsgNyBdICo9IHM7CiAgICAJCXRlWyAyIF0gKj0gczsgdGVbIDUgXSAqPSBzOyB0ZVsgOCBdICo9IHM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl2YXIgYSA9IHRlWyAwIF0sIGIgPSB0ZVsgMSBdLCBjID0gdGVbIDIgXSwKICAgIAkJCWQgPSB0ZVsgMyBdLCBlID0gdGVbIDQgXSwgZiA9IHRlWyA1IF0sCiAgICAJCQlnID0gdGVbIDYgXSwgaCA9IHRlWyA3IF0sIGkgPSB0ZVsgOCBdOwoKICAgIAkJcmV0dXJuIGEgKiBlICogaSAtIGEgKiBmICogaCAtIGIgKiBkICogaSArIGIgKiBmICogZyArIGMgKiBkICogaCAtIGMgKiBlICogZzsKCiAgICAJfSwKCiAgICAJZ2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtYXRyaXgsIHRocm93T25EZWdlbmVyYXRlICkgewoKICAgIAkJaWYgKCBtYXRyaXggJiYgbWF0cml4LmlzTWF0cml4NCApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBubyBsb25nZXIgdGFrZXMgYSBNYXRyaXg0IGFyZ3VtZW50LiIgKTsKCiAgICAJCX0KCiAgICAJCXZhciBtZSA9IG1hdHJpeC5lbGVtZW50cywKICAgIAkJCXRlID0gdGhpcy5lbGVtZW50cywKCiAgICAJCQluMTEgPSBtZVsgMCBdLCBuMjEgPSBtZVsgMSBdLCBuMzEgPSBtZVsgMiBdLAogICAgCQkJbjEyID0gbWVbIDMgXSwgbjIyID0gbWVbIDQgXSwgbjMyID0gbWVbIDUgXSwKICAgIAkJCW4xMyA9IG1lWyA2IF0sIG4yMyA9IG1lWyA3IF0sIG4zMyA9IG1lWyA4IF0sCgogICAgCQkJdDExID0gbjMzICogbjIyIC0gbjMyICogbjIzLAogICAgCQkJdDEyID0gbjMyICogbjEzIC0gbjMzICogbjEyLAogICAgCQkJdDEzID0gbjIzICogbjEyIC0gbjIyICogbjEzLAoKICAgIAkJCWRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMzsKCiAgICAJCWlmICggZGV0ID09PSAwICkgewoKICAgIAkJCXZhciBtc2cgPSAiVEhSRUUuTWF0cml4MzogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIjsKCiAgICAJCQlpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkgewoKICAgIAkJCQl0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggbXNnICk7CgogICAgCQkJfQoKICAgIAkJCXJldHVybiB0aGlzLmlkZW50aXR5KCk7CgogICAgCQl9CgogICAgCQl2YXIgZGV0SW52ID0gMSAvIGRldDsKCiAgICAJCXRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7CiAgICAJCXRlWyAxIF0gPSAoIG4zMSAqIG4yMyAtIG4zMyAqIG4yMSApICogZGV0SW52OwogICAgCQl0ZVsgMiBdID0gKCBuMzIgKiBuMjEgLSBuMzEgKiBuMjIgKSAqIGRldEludjsKCiAgICAJCXRlWyAzIF0gPSB0MTIgKiBkZXRJbnY7CiAgICAJCXRlWyA0IF0gPSAoIG4zMyAqIG4xMSAtIG4zMSAqIG4xMyApICogZGV0SW52OwogICAgCQl0ZVsgNSBdID0gKCBuMzEgKiBuMTIgLSBuMzIgKiBuMTEgKSAqIGRldEludjsKCiAgICAJCXRlWyA2IF0gPSB0MTMgKiBkZXRJbnY7CiAgICAJCXRlWyA3IF0gPSAoIG4yMSAqIG4xMyAtIG4yMyAqIG4xMSApICogZGV0SW52OwogICAgCQl0ZVsgOCBdID0gKCBuMjIgKiBuMTEgLSBuMjEgKiBuMTIgKSAqIGRldEludjsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0cmFuc3Bvc2U6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciB0bXAsIG0gPSB0aGlzLmVsZW1lbnRzOwoKICAgIAkJdG1wID0gbVsgMSBdOyBtWyAxIF0gPSBtWyAzIF07IG1bIDMgXSA9IHRtcDsKICAgIAkJdG1wID0gbVsgMiBdOyBtWyAyIF0gPSBtWyA2IF07IG1bIDYgXSA9IHRtcDsKICAgIAkJdG1wID0gbVsgNSBdOyBtWyA1IF0gPSBtWyA3IF07IG1bIDcgXSA9IHRtcDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXROb3JtYWxNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4NCApIHsKCiAgICAJCXJldHVybiB0aGlzLnNldEZyb21NYXRyaXg0KCBtYXRyaXg0ICkuZ2V0SW52ZXJzZSggdGhpcyApLnRyYW5zcG9zZSgpOwoKICAgIAl9LAoKICAgIAl0cmFuc3Bvc2VJbnRvQXJyYXk6IGZ1bmN0aW9uICggciApIHsKCiAgICAJCXZhciBtID0gdGhpcy5lbGVtZW50czsKCiAgICAJCXJbIDAgXSA9IG1bIDAgXTsKICAgIAkJclsgMSBdID0gbVsgMyBdOwogICAgCQlyWyAyIF0gPSBtWyA2IF07CiAgICAJCXJbIDMgXSA9IG1bIDEgXTsKICAgIAkJclsgNCBdID0gbVsgNCBdOwogICAgCQlyWyA1IF0gPSBtWyA3IF07CiAgICAJCXJbIDYgXSA9IG1bIDIgXTsKICAgIAkJclsgNyBdID0gbVsgNSBdOwogICAgCQlyWyA4IF0gPSBtWyA4IF07CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0VXZUcmFuc2Zvcm06IGZ1bmN0aW9uICggdHgsIHR5LCBzeCwgc3ksIHJvdGF0aW9uLCBjeCwgY3kgKSB7CgogICAgCQl2YXIgYyA9IE1hdGguY29zKCByb3RhdGlvbiApOwogICAgCQl2YXIgcyA9IE1hdGguc2luKCByb3RhdGlvbiApOwoKICAgIAkJdGhpcy5zZXQoCiAgICAJCQlzeCAqIGMsIHN4ICogcywgLSBzeCAqICggYyAqIGN4ICsgcyAqIGN5ICkgKyBjeCArIHR4LAogICAgCQkJLSBzeSAqIHMsIHN5ICogYywgLSBzeSAqICggLSBzICogY3ggKyBjICogY3kgKSArIGN5ICsgdHksCiAgICAJCQkwLCAwLCAxCiAgICAJCSk7CgogICAgCX0sCgogICAgCXNjYWxlOiBmdW5jdGlvbiAoIHN4LCBzeSApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl0ZVsgMCBdICo9IHN4OyB0ZVsgMyBdICo9IHN4OyB0ZVsgNiBdICo9IHN4OwogICAgCQl0ZVsgMSBdICo9IHN5OyB0ZVsgNCBdICo9IHN5OyB0ZVsgNyBdICo9IHN5OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXJvdGF0ZTogZnVuY3Rpb24gKCB0aGV0YSApIHsKCiAgICAJCXZhciBjID0gTWF0aC5jb3MoIHRoZXRhICk7CiAgICAJCXZhciBzID0gTWF0aC5zaW4oIHRoZXRhICk7CgogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKICAgIAkJdmFyIGExMSA9IHRlWyAwIF0sIGExMiA9IHRlWyAzIF0sIGExMyA9IHRlWyA2IF07CiAgICAJCXZhciBhMjEgPSB0ZVsgMSBdLCBhMjIgPSB0ZVsgNCBdLCBhMjMgPSB0ZVsgNyBdOwoKICAgIAkJdGVbIDAgXSA9IGMgKiBhMTEgKyBzICogYTIxOwogICAgCQl0ZVsgMyBdID0gYyAqIGExMiArIHMgKiBhMjI7CiAgICAJCXRlWyA2IF0gPSBjICogYTEzICsgcyAqIGEyMzsKCiAgICAJCXRlWyAxIF0gPSAtIHMgKiBhMTEgKyBjICogYTIxOwogICAgCQl0ZVsgNCBdID0gLSBzICogYTEyICsgYyAqIGEyMjsKICAgIAkJdGVbIDcgXSA9IC0gcyAqIGExMyArIGMgKiBhMjM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIHR4LCB0eSApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl0ZVsgMCBdICs9IHR4ICogdGVbIDIgXTsgdGVbIDMgXSArPSB0eCAqIHRlWyA1IF07IHRlWyA2IF0gKz0gdHggKiB0ZVsgOCBdOwogICAgCQl0ZVsgMSBdICs9IHR5ICogdGVbIDIgXTsgdGVbIDQgXSArPSB0eSAqIHRlWyA1IF07IHRlWyA3IF0gKz0gdHkgKiB0ZVsgOCBdOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWVxdWFsczogZnVuY3Rpb24gKCBtYXRyaXggKSB7CgogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgCQl2YXIgbWUgPSBtYXRyaXguZWxlbWVudHM7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkgewoKICAgIAkJCWlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0cnVlOwoKICAgIAl9LAoKICAgIAlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCiAgICAJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHsKCiAgICAJCQl0aGlzLmVsZW1lbnRzWyBpIF0gPSBhcnJheVsgaSArIG9mZnNldCBdOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRvQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCiAgICAJCWlmICggYXJyYXkgPT09IHVuZGVmaW5lZCApIGFycmF5ID0gW107CiAgICAJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCiAgICAJCWFycmF5WyBvZmZzZXQgXSA9IHRlWyAwIF07CiAgICAJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0ZVsgMSBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGVbIDIgXTsKCiAgICAJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgNCBdID0gdGVbIDQgXTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDUgXSA9IHRlWyA1IF07CgogICAgCQlhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07CiAgICAJCWFycmF5WyBvZmZzZXQgKyA4IF0gPSB0ZVsgOCBdOwoKICAgIAkJcmV0dXJuIGFycmF5OwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvCiAgICAgKi8KCiAgICB2YXIgX2NhbnZhczsKCiAgICB2YXIgSW1hZ2VVdGlscyA9IHsKCiAgICAJZ2V0RGF0YVVSTDogZnVuY3Rpb24gKCBpbWFnZSApIHsKCiAgICAJCXZhciBjYW52YXM7CgogICAgCQlpZiAoIHR5cGVvZiBIVE1MQ2FudmFzRWxlbWVudCA9PSAndW5kZWZpbmVkJyApIHsKCiAgICAJCQlyZXR1cm4gaW1hZ2Uuc3JjOwoKICAgIAkJfSBlbHNlIGlmICggaW1hZ2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCApIHsKCiAgICAJCQljYW52YXMgPSBpbWFnZTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJaWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7CgogICAgCQkJX2NhbnZhcy53aWR0aCA9IGltYWdlLndpZHRoOwogICAgCQkJX2NhbnZhcy5oZWlnaHQgPSBpbWFnZS5oZWlnaHQ7CgogICAgCQkJdmFyIGNvbnRleHQgPSBfY2FudmFzLmdldENvbnRleHQoICcyZCcgKTsKCiAgICAJCQlpZiAoIGltYWdlIGluc3RhbmNlb2YgSW1hZ2VEYXRhICkgewoKICAgIAkJCQljb250ZXh0LnB1dEltYWdlRGF0YSggaW1hZ2UsIDAsIDAgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQljb250ZXh0LmRyYXdJbWFnZSggaW1hZ2UsIDAsIDAsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTsKCiAgICAJCQl9CgogICAgCQkJY2FudmFzID0gX2NhbnZhczsKCiAgICAJCX0KCiAgICAJCWlmICggY2FudmFzLndpZHRoID4gMjA0OCB8fCBjYW52YXMuaGVpZ2h0ID4gMjA0OCApIHsKCiAgICAJCQlyZXR1cm4gY2FudmFzLnRvRGF0YVVSTCggJ2ltYWdlL2pwZWcnLCAwLjYgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJcmV0dXJuIGNhbnZhcy50b0RhdGFVUkwoICdpbWFnZS9wbmcnICk7CgogICAgCQl9CgogICAgCX0KCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIHN6aW1layAvIGh0dHBzOi8vZ2l0aHViLmNvbS9zemltZWsvCiAgICAgKi8KCiAgICB2YXIgdGV4dHVyZUlkID0gMDsKCiAgICBmdW5jdGlvbiBUZXh0dXJlKCBpbWFnZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApIHsKCiAgICAJT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiB0ZXh0dXJlSWQgKysgfSApOwoKICAgIAl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKCiAgICAJdGhpcy5uYW1lID0gJyc7CgogICAgCXRoaXMuaW1hZ2UgPSBpbWFnZSAhPT0gdW5kZWZpbmVkID8gaW1hZ2UgOiBUZXh0dXJlLkRFRkFVTFRfSU1BR0U7CiAgICAJdGhpcy5taXBtYXBzID0gW107CgogICAgCXRoaXMubWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBUZXh0dXJlLkRFRkFVTFRfTUFQUElORzsKCiAgICAJdGhpcy53cmFwUyA9IHdyYXBTICE9PSB1bmRlZmluZWQgPyB3cmFwUyA6IENsYW1wVG9FZGdlV3JhcHBpbmc7CiAgICAJdGhpcy53cmFwVCA9IHdyYXBUICE9PSB1bmRlZmluZWQgPyB3cmFwVCA6IENsYW1wVG9FZGdlV3JhcHBpbmc7CgogICAgCXRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CiAgICAJdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IExpbmVhck1pcG1hcExpbmVhckZpbHRlcjsKCiAgICAJdGhpcy5hbmlzb3Ryb3B5ID0gYW5pc290cm9weSAhPT0gdW5kZWZpbmVkID8gYW5pc290cm9weSA6IDE7CgogICAgCXRoaXMuZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JBRm9ybWF0OwogICAgCXRoaXMudHlwZSA9IHR5cGUgIT09IHVuZGVmaW5lZCA/IHR5cGUgOiBVbnNpZ25lZEJ5dGVUeXBlOwoKICAgIAl0aGlzLm9mZnNldCA9IG5ldyBWZWN0b3IyKCAwLCAwICk7CiAgICAJdGhpcy5yZXBlYXQgPSBuZXcgVmVjdG9yMiggMSwgMSApOwogICAgCXRoaXMuY2VudGVyID0gbmV3IFZlY3RvcjIoIDAsIDAgKTsKICAgIAl0aGlzLnJvdGF0aW9uID0gMDsKCiAgICAJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTsKICAgIAl0aGlzLm1hdHJpeCA9IG5ldyBNYXRyaXgzKCk7CgogICAgCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gdHJ1ZTsKICAgIAl0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBmYWxzZTsKICAgIAl0aGlzLmZsaXBZID0gdHJ1ZTsKICAgIAl0aGlzLnVucGFja0FsaWdubWVudCA9IDQ7CS8vIHZhbGlkIHZhbHVlczogMSwgMiwgNCwgOCAoc2VlIGh0dHA6Ly93d3cua2hyb25vcy5vcmcvb3BlbmdsZXMvc2RrL2RvY3MvbWFuL3hodG1sL2dsUGl4ZWxTdG9yZWkueG1sKQoKICAgIAkvLyBWYWx1ZXMgb2YgZW5jb2RpbmcgIT09IFRIUkVFLkxpbmVhckVuY29kaW5nIG9ubHkgc3VwcG9ydGVkIG9uIG1hcCwgZW52TWFwIGFuZCBlbWlzc2l2ZU1hcC4KICAgIAkvLwogICAgCS8vIEFsc28gY2hhbmdpbmcgdGhlIGVuY29kaW5nIGFmdGVyIGFscmVhZHkgdXNlZCBieSBhIE1hdGVyaWFsIHdpbGwgbm90IGF1dG9tYXRpY2FsbHkgbWFrZSB0aGUgTWF0ZXJpYWwKICAgIAkvLyB1cGRhdGUuIFlvdSBuZWVkIHRvIGV4cGxpY2l0bHkgY2FsbCBNYXRlcmlhbC5uZWVkc1VwZGF0ZSB0byB0cmlnZ2VyIGl0IHRvIHJlY29tcGlsZS4KICAgIAl0aGlzLmVuY29kaW5nID0gZW5jb2RpbmcgIT09IHVuZGVmaW5lZCA/IGVuY29kaW5nIDogTGluZWFyRW5jb2Rpbmc7CgogICAgCXRoaXMudmVyc2lvbiA9IDA7CiAgICAJdGhpcy5vblVwZGF0ZSA9IG51bGw7CgogICAgfQoKICAgIFRleHR1cmUuREVGQVVMVF9JTUFHRSA9IHVuZGVmaW5lZDsKICAgIFRleHR1cmUuREVGQVVMVF9NQVBQSU5HID0gVVZNYXBwaW5nOwoKICAgIFRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBUZXh0dXJlLAoKICAgIAlpc1RleHR1cmU6IHRydWUsCgogICAgCXVwZGF0ZU1hdHJpeDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5tYXRyaXguc2V0VXZUcmFuc2Zvcm0oIHRoaXMub2Zmc2V0LngsIHRoaXMub2Zmc2V0LnksIHRoaXMucmVwZWF0LngsIHRoaXMucmVwZWF0LnksIHRoaXMucm90YXRpb24sIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgKTsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQl0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKCiAgICAJCXRoaXMuaW1hZ2UgPSBzb3VyY2UuaW1hZ2U7CiAgICAJCXRoaXMubWlwbWFwcyA9IHNvdXJjZS5taXBtYXBzLnNsaWNlKCAwICk7CgogICAgCQl0aGlzLm1hcHBpbmcgPSBzb3VyY2UubWFwcGluZzsKCiAgICAJCXRoaXMud3JhcFMgPSBzb3VyY2Uud3JhcFM7CiAgICAJCXRoaXMud3JhcFQgPSBzb3VyY2Uud3JhcFQ7CgogICAgCQl0aGlzLm1hZ0ZpbHRlciA9IHNvdXJjZS5tYWdGaWx0ZXI7CiAgICAJCXRoaXMubWluRmlsdGVyID0gc291cmNlLm1pbkZpbHRlcjsKCiAgICAJCXRoaXMuYW5pc290cm9weSA9IHNvdXJjZS5hbmlzb3Ryb3B5OwoKICAgIAkJdGhpcy5mb3JtYXQgPSBzb3VyY2UuZm9ybWF0OwogICAgCQl0aGlzLnR5cGUgPSBzb3VyY2UudHlwZTsKCiAgICAJCXRoaXMub2Zmc2V0LmNvcHkoIHNvdXJjZS5vZmZzZXQgKTsKICAgIAkJdGhpcy5yZXBlYXQuY29weSggc291cmNlLnJlcGVhdCApOwogICAgCQl0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7CiAgICAJCXRoaXMucm90YXRpb24gPSBzb3VyY2Uucm90YXRpb247CgogICAgCQl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBzb3VyY2UubWF0cml4QXV0b1VwZGF0ZTsKICAgIAkJdGhpcy5tYXRyaXguY29weSggc291cmNlLm1hdHJpeCApOwoKICAgIAkJdGhpcy5nZW5lcmF0ZU1pcG1hcHMgPSBzb3VyY2UuZ2VuZXJhdGVNaXBtYXBzOwogICAgCQl0aGlzLnByZW11bHRpcGx5QWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbHlBbHBoYTsKICAgIAkJdGhpcy5mbGlwWSA9IHNvdXJjZS5mbGlwWTsKICAgIAkJdGhpcy51bnBhY2tBbGlnbm1lbnQgPSBzb3VyY2UudW5wYWNrQWxpZ25tZW50OwogICAgCQl0aGlzLmVuY29kaW5nID0gc291cmNlLmVuY29kaW5nOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgewoKICAgIAkJdmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApOwoKICAgIAkJaWYgKCAhIGlzUm9vdE9iamVjdCAmJiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXJldHVybiBtZXRhLnRleHR1cmVzWyB0aGlzLnV1aWQgXTsKCiAgICAJCX0KCiAgICAJCXZhciBvdXRwdXQgPSB7CgogICAgCQkJbWV0YWRhdGE6IHsKICAgIAkJCQl2ZXJzaW9uOiA0LjUsCiAgICAJCQkJdHlwZTogJ1RleHR1cmUnLAogICAgCQkJCWdlbmVyYXRvcjogJ1RleHR1cmUudG9KU09OJwogICAgCQkJfSwKCiAgICAJCQl1dWlkOiB0aGlzLnV1aWQsCiAgICAJCQluYW1lOiB0aGlzLm5hbWUsCgogICAgCQkJbWFwcGluZzogdGhpcy5tYXBwaW5nLAoKICAgIAkJCXJlcGVhdDogWyB0aGlzLnJlcGVhdC54LCB0aGlzLnJlcGVhdC55IF0sCiAgICAJCQlvZmZzZXQ6IFsgdGhpcy5vZmZzZXQueCwgdGhpcy5vZmZzZXQueSBdLAogICAgCQkJY2VudGVyOiBbIHRoaXMuY2VudGVyLngsIHRoaXMuY2VudGVyLnkgXSwKICAgIAkJCXJvdGF0aW9uOiB0aGlzLnJvdGF0aW9uLAoKICAgIAkJCXdyYXA6IFsgdGhpcy53cmFwUywgdGhpcy53cmFwVCBdLAoKICAgIAkJCWZvcm1hdDogdGhpcy5mb3JtYXQsCiAgICAJCQl0eXBlOiB0aGlzLnR5cGUsCiAgICAJCQllbmNvZGluZzogdGhpcy5lbmNvZGluZywKCiAgICAJCQltaW5GaWx0ZXI6IHRoaXMubWluRmlsdGVyLAogICAgCQkJbWFnRmlsdGVyOiB0aGlzLm1hZ0ZpbHRlciwKICAgIAkJCWFuaXNvdHJvcHk6IHRoaXMuYW5pc290cm9weSwKCiAgICAJCQlmbGlwWTogdGhpcy5mbGlwWSwKCiAgICAJCQlwcmVtdWx0aXBseUFscGhhOiB0aGlzLnByZW11bHRpcGx5QWxwaGEsCiAgICAJCQl1bnBhY2tBbGlnbm1lbnQ6IHRoaXMudW5wYWNrQWxpZ25tZW50CgogICAgCQl9OwoKICAgIAkJaWYgKCB0aGlzLmltYWdlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gVE9ETzogTW92ZSB0byBUSFJFRS5JbWFnZQoKICAgIAkJCXZhciBpbWFnZSA9IHRoaXMuaW1hZ2U7CgogICAgCQkJaWYgKCBpbWFnZS51dWlkID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCWltYWdlLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsgLy8gVUdICgogICAgCQkJfQoKICAgIAkJCWlmICggISBpc1Jvb3RPYmplY3QgJiYgbWV0YS5pbWFnZXNbIGltYWdlLnV1aWQgXSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQl2YXIgdXJsOwoKICAgIAkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIGltYWdlICkgKSB7CgogICAgCQkJCQkvLyBwcm9jZXNzIGFycmF5IG9mIGltYWdlcyBlLmcuIEN1YmVUZXh0dXJlCgogICAgCQkJCQl1cmwgPSBbXTsKCiAgICAJCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IGltYWdlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCQkJdXJsLnB1c2goIEltYWdlVXRpbHMuZ2V0RGF0YVVSTCggaW1hZ2VbIGkgXSApICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQkvLyBwcm9jZXNzIHNpbmdsZSBpbWFnZQoKICAgIAkJCQkJdXJsID0gSW1hZ2VVdGlscy5nZXREYXRhVVJMKCBpbWFnZSApOwoKICAgIAkJCQl9CgogICAgCQkJCW1ldGEuaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSB7CiAgICAJCQkJCXV1aWQ6IGltYWdlLnV1aWQsCiAgICAJCQkJCXVybDogdXJsCiAgICAJCQkJfTsKCiAgICAJCQl9CgogICAgCQkJb3V0cHV0LmltYWdlID0gaW1hZ2UudXVpZDsKCiAgICAJCX0KCiAgICAJCWlmICggISBpc1Jvb3RPYmplY3QgKSB7CgogICAgCQkJbWV0YS50ZXh0dXJlc1sgdGhpcy51dWlkIF0gPSBvdXRwdXQ7CgogICAgCQl9CgogICAgCQlyZXR1cm4gb3V0cHV0OwoKICAgIAl9LAoKICAgIAlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsKCiAgICAJfSwKCiAgICAJdHJhbnNmb3JtVXY6IGZ1bmN0aW9uICggdXYgKSB7CgogICAgCQlpZiAoIHRoaXMubWFwcGluZyAhPT0gVVZNYXBwaW5nICkgcmV0dXJuIHV2OwoKICAgIAkJdXYuYXBwbHlNYXRyaXgzKCB0aGlzLm1hdHJpeCApOwoKICAgIAkJaWYgKCB1di54IDwgMCB8fCB1di54ID4gMSApIHsKCiAgICAJCQlzd2l0Y2ggKCB0aGlzLndyYXBTICkgewoKICAgIAkJCQljYXNlIFJlcGVhdFdyYXBwaW5nOgoKICAgIAkJCQkJdXYueCA9IHV2LnggLSBNYXRoLmZsb29yKCB1di54ICk7CiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQljYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CgogICAgCQkJCQl1di54ID0gdXYueCA8IDAgPyAwIDogMTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzoKCiAgICAJCQkJCWlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnggKSAlIDIgKSA9PT0gMSApIHsKCiAgICAJCQkJCQl1di54ID0gTWF0aC5jZWlsKCB1di54ICkgLSB1di54OwoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQl1di54ID0gdXYueCAtIE1hdGguZmxvb3IoIHV2LnggKTsKCiAgICAJCQkJCX0KICAgIAkJCQkJYnJlYWs7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCB1di55IDwgMCB8fCB1di55ID4gMSApIHsKCiAgICAJCQlzd2l0Y2ggKCB0aGlzLndyYXBUICkgewoKICAgIAkJCQljYXNlIFJlcGVhdFdyYXBwaW5nOgoKICAgIAkJCQkJdXYueSA9IHV2LnkgLSBNYXRoLmZsb29yKCB1di55ICk7CiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQljYXNlIENsYW1wVG9FZGdlV3JhcHBpbmc6CgogICAgCQkJCQl1di55ID0gdXYueSA8IDAgPyAwIDogMTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgTWlycm9yZWRSZXBlYXRXcmFwcGluZzoKCiAgICAJCQkJCWlmICggTWF0aC5hYnMoIE1hdGguZmxvb3IoIHV2LnkgKSAlIDIgKSA9PT0gMSApIHsKCiAgICAJCQkJCQl1di55ID0gTWF0aC5jZWlsKCB1di55ICkgLSB1di55OwoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQl1di55ID0gdXYueSAtIE1hdGguZmxvb3IoIHV2LnkgKTsKCiAgICAJCQkJCX0KICAgIAkJCQkJYnJlYWs7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLmZsaXBZICkgewoKICAgIAkJCXV2LnkgPSAxIC0gdXYueTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB1djsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIFRleHR1cmUucHJvdG90eXBlLCAibmVlZHNVcGRhdGUiLCB7CgogICAgCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrLwogICAgICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCiAgICAgKiBAYXV0aG9yIGVncmFldGhlciAvIGh0dHA6Ly9lZ3JhZXRoZXIuY29tLwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICBmdW5jdGlvbiBWZWN0b3I0KCB4LCB5LCB6LCB3ICkgewoKICAgIAl0aGlzLnggPSB4IHx8IDA7CiAgICAJdGhpcy55ID0geSB8fCAwOwogICAgCXRoaXMueiA9IHogfHwgMDsKICAgIAl0aGlzLncgPSAoIHcgIT09IHVuZGVmaW5lZCApID8gdyA6IDE7CgogICAgfQoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBWZWN0b3I0LnByb3RvdHlwZSwgewoKICAgIAkid2lkdGgiOiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy56OwoKICAgIAkJfSwKCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQl0aGlzLnogPSB2YWx1ZTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJImhlaWdodCI6IHsKCiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCXJldHVybiB0aGlzLnc7CgogICAgCQl9LAoKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCXRoaXMudyA9IHZhbHVlOwoKICAgIAkJfQoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7CgogICAgCWlzVmVjdG9yNDogdHJ1ZSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHgsIHksIHosIHcgKSB7CgogICAgCQl0aGlzLnggPSB4OwogICAgCQl0aGlzLnkgPSB5OwogICAgCQl0aGlzLnogPSB6OwogICAgCQl0aGlzLncgPSB3OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgogICAgCQl0aGlzLnggPSBzY2FsYXI7CiAgICAJCXRoaXMueSA9IHNjYWxhcjsKICAgIAkJdGhpcy56ID0gc2NhbGFyOwogICAgCQl0aGlzLncgPSBzY2FsYXI7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0WDogZnVuY3Rpb24gKCB4ICkgewoKICAgIAkJdGhpcy54ID0geDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRZOiBmdW5jdGlvbiAoIHkgKSB7CgogICAgCQl0aGlzLnkgPSB5OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFo6IGZ1bmN0aW9uICggeiApIHsKCiAgICAJCXRoaXMueiA9IHo7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0VzogZnVuY3Rpb24gKCB3ICkgewoKICAgIAkJdGhpcy53ID0gdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRDb21wb25lbnQ6IGZ1bmN0aW9uICggaW5kZXgsIHZhbHVlICkgewoKICAgIAkJc3dpdGNoICggaW5kZXggKSB7CgogICAgCQkJY2FzZSAwOiB0aGlzLnggPSB2YWx1ZTsgYnJlYWs7CiAgICAJCQljYXNlIDE6IHRoaXMueSA9IHZhbHVlOyBicmVhazsKICAgIAkJCWNhc2UgMjogdGhpcy56ID0gdmFsdWU7IGJyZWFrOwogICAgCQkJY2FzZSAzOiB0aGlzLncgPSB2YWx1ZTsgYnJlYWs7CiAgICAJCQlkZWZhdWx0OiB0aHJvdyBuZXcgRXJyb3IoICdpbmRleCBpcyBvdXQgb2YgcmFuZ2U6ICcgKyBpbmRleCApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldENvbXBvbmVudDogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCXN3aXRjaCAoIGluZGV4ICkgewoKICAgIAkJCWNhc2UgMDogcmV0dXJuIHRoaXMueDsKICAgIAkJCWNhc2UgMTogcmV0dXJuIHRoaXMueTsKICAgIAkJCWNhc2UgMjogcmV0dXJuIHRoaXMuejsKICAgIAkJCWNhc2UgMzogcmV0dXJuIHRoaXMudzsKICAgIAkJCWRlZmF1bHQ6IHRocm93IG5ldyBFcnJvciggJ2luZGV4IGlzIG91dCBvZiByYW5nZTogJyArIGluZGV4ICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMueCwgdGhpcy55LCB0aGlzLnosIHRoaXMudyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQl0aGlzLnggPSB2Lng7CiAgICAJCXRoaXMueSA9IHYueTsKICAgIAkJdGhpcy56ID0gdi56OwogICAgCQl0aGlzLncgPSAoIHYudyAhPT0gdW5kZWZpbmVkICkgPyB2LncgOiAxOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZDogZnVuY3Rpb24gKCB2LCB3ICkgewoKICAgIAkJaWYgKCB3ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmFkZCgpIG5vdyBvbmx5IGFjY2VwdHMgb25lIGFyZ3VtZW50LiBVc2UgLmFkZFZlY3RvcnMoIGEsIGIgKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzLmFkZFZlY3RvcnMoIHYsIHcgKTsKCiAgICAJCX0KCiAgICAJCXRoaXMueCArPSB2Lng7CiAgICAJCXRoaXMueSArPSB2Lnk7CiAgICAJCXRoaXMueiArPSB2Lno7CiAgICAJCXRoaXMudyArPSB2Lnc7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYWRkU2NhbGFyOiBmdW5jdGlvbiAoIHMgKSB7CgogICAgCQl0aGlzLnggKz0gczsKICAgIAkJdGhpcy55ICs9IHM7CiAgICAJCXRoaXMueiArPSBzOwogICAgCQl0aGlzLncgKz0gczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhZGRWZWN0b3JzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgogICAgCQl0aGlzLnggPSBhLnggKyBiLng7CiAgICAJCXRoaXMueSA9IGEueSArIGIueTsKICAgIAkJdGhpcy56ID0gYS56ICsgYi56OwogICAgCQl0aGlzLncgPSBhLncgKyBiLnc7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYWRkU2NhbGVkVmVjdG9yOiBmdW5jdGlvbiAoIHYsIHMgKSB7CgogICAgCQl0aGlzLnggKz0gdi54ICogczsKICAgIAkJdGhpcy55ICs9IHYueSAqIHM7CiAgICAJCXRoaXMueiArPSB2LnogKiBzOwogICAgCQl0aGlzLncgKz0gdi53ICogczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzdWI6IGZ1bmN0aW9uICggdiwgdyApIHsKCiAgICAJCWlmICggdyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5zdWIoKSBub3cgb25seSBhY2NlcHRzIG9uZSBhcmd1bWVudC4gVXNlIC5zdWJWZWN0b3JzKCBhLCBiICkgaW5zdGVhZC4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy5zdWJWZWN0b3JzKCB2LCB3ICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggLT0gdi54OwogICAgCQl0aGlzLnkgLT0gdi55OwogICAgCQl0aGlzLnogLT0gdi56OwogICAgCQl0aGlzLncgLT0gdi53OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXN1YlNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdGhpcy54IC09IHM7CiAgICAJCXRoaXMueSAtPSBzOwogICAgCQl0aGlzLnogLT0gczsKICAgIAkJdGhpcy53IC09IHM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc3ViVmVjdG9yczogZnVuY3Rpb24gKCBhLCBiICkgewoKICAgIAkJdGhpcy54ID0gYS54IC0gYi54OwogICAgCQl0aGlzLnkgPSBhLnkgLSBiLnk7CiAgICAJCXRoaXMueiA9IGEueiAtIGIuejsKICAgIAkJdGhpcy53ID0gYS53IC0gYi53OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW11bHRpcGx5U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKCiAgICAJCXRoaXMueCAqPSBzY2FsYXI7CiAgICAJCXRoaXMueSAqPSBzY2FsYXI7CiAgICAJCXRoaXMueiAqPSBzY2FsYXI7CiAgICAJCXRoaXMudyAqPSBzY2FsYXI7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQl2YXIgeCA9IHRoaXMueCwgeSA9IHRoaXMueSwgeiA9IHRoaXMueiwgdyA9IHRoaXMudzsKICAgIAkJdmFyIGUgPSBtLmVsZW1lbnRzOwoKICAgIAkJdGhpcy54ID0gZVsgMCBdICogeCArIGVbIDQgXSAqIHkgKyBlWyA4IF0gKiB6ICsgZVsgMTIgXSAqIHc7CiAgICAJCXRoaXMueSA9IGVbIDEgXSAqIHggKyBlWyA1IF0gKiB5ICsgZVsgOSBdICogeiArIGVbIDEzIF0gKiB3OwogICAgCQl0aGlzLnogPSBlWyAyIF0gKiB4ICsgZVsgNiBdICogeSArIGVbIDEwIF0gKiB6ICsgZVsgMTQgXSAqIHc7CiAgICAJCXRoaXMudyA9IGVbIDMgXSAqIHggKyBlWyA3IF0gKiB5ICsgZVsgMTEgXSAqIHogKyBlWyAxNSBdICogdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkaXZpZGVTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKICAgIAkJcmV0dXJuIHRoaXMubXVsdGlwbHlTY2FsYXIoIDEgLyBzY2FsYXIgKTsKCiAgICAJfSwKCiAgICAJc2V0QXhpc0FuZ2xlRnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSApIHsKCiAgICAJCS8vIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2dlb21ldHJ5L3JvdGF0aW9ucy9jb252ZXJzaW9ucy9xdWF0ZXJuaW9uVG9BbmdsZS9pbmRleC5odG0KCiAgICAJCS8vIHEgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCgogICAgCQl0aGlzLncgPSAyICogTWF0aC5hY29zKCBxLncgKTsKCiAgICAJCXZhciBzID0gTWF0aC5zcXJ0KCAxIC0gcS53ICogcS53ICk7CgogICAgCQlpZiAoIHMgPCAwLjAwMDEgKSB7CgogICAgCQkJdGhpcy54ID0gMTsKICAgIAkJCXRoaXMueSA9IDA7CiAgICAJCQl0aGlzLnogPSAwOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0aGlzLnggPSBxLnggLyBzOwogICAgCQkJdGhpcy55ID0gcS55IC8gczsKICAgIAkJCXRoaXMueiA9IHEueiAvIHM7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0QXhpc0FuZ2xlRnJvbVJvdGF0aW9uTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQkvLyBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9nZW9tZXRyeS9yb3RhdGlvbnMvY29udmVyc2lvbnMvbWF0cml4VG9BbmdsZS9pbmRleC5odG0KCiAgICAJCS8vIGFzc3VtZXMgdGhlIHVwcGVyIDN4MyBvZiBtIGlzIGEgcHVyZSByb3RhdGlvbiBtYXRyaXggKGkuZSwgdW5zY2FsZWQpCgogICAgCQl2YXIgYW5nbGUsIHgsIHksIHosCQkvLyB2YXJpYWJsZXMgZm9yIHJlc3VsdAogICAgCQkJZXBzaWxvbiA9IDAuMDEsCQkvLyBtYXJnaW4gdG8gYWxsb3cgZm9yIHJvdW5kaW5nIGVycm9ycwogICAgCQkJZXBzaWxvbjIgPSAwLjEsCQkvLyBtYXJnaW4gdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiAwIGFuZCAxODAgZGVncmVlcwoKICAgIAkJCXRlID0gbS5lbGVtZW50cywKCiAgICAJCQltMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdLAogICAgCQkJbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXSwKICAgIAkJCW0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdOwoKICAgIAkJaWYgKCAoIE1hdGguYWJzKCBtMTIgLSBtMjEgKSA8IGVwc2lsb24gKSAmJgogICAgCQkgICAgICggTWF0aC5hYnMoIG0xMyAtIG0zMSApIDwgZXBzaWxvbiApICYmCiAgICAJCSAgICAgKCBNYXRoLmFicyggbTIzIC0gbTMyICkgPCBlcHNpbG9uICkgKSB7CgogICAgCQkJLy8gc2luZ3VsYXJpdHkgZm91bmQKICAgIAkJCS8vIGZpcnN0IGNoZWNrIGZvciBpZGVudGl0eSBtYXRyaXggd2hpY2ggbXVzdCBoYXZlICsxIGZvciBhbGwgdGVybXMKICAgIAkJCS8vIGluIGxlYWRpbmcgZGlhZ29uYWwgYW5kIHplcm8gaW4gb3RoZXIgdGVybXMKCiAgICAJCQlpZiAoICggTWF0aC5hYnMoIG0xMiArIG0yMSApIDwgZXBzaWxvbjIgKSAmJgogICAgCQkJICAgICAoIE1hdGguYWJzKCBtMTMgKyBtMzEgKSA8IGVwc2lsb24yICkgJiYKICAgIAkJCSAgICAgKCBNYXRoLmFicyggbTIzICsgbTMyICkgPCBlcHNpbG9uMiApICYmCiAgICAJCQkgICAgICggTWF0aC5hYnMoIG0xMSArIG0yMiArIG0zMyAtIDMgKSA8IGVwc2lsb24yICkgKSB7CgogICAgCQkJCS8vIHRoaXMgc2luZ3VsYXJpdHkgaXMgaWRlbnRpdHkgbWF0cml4IHNvIGFuZ2xlID0gMAoKICAgIAkJCQl0aGlzLnNldCggMSwgMCwgMCwgMCApOwoKICAgIAkJCQlyZXR1cm4gdGhpczsgLy8gemVybyBhbmdsZSwgYXJiaXRyYXJ5IGF4aXMKCiAgICAJCQl9CgogICAgCQkJLy8gb3RoZXJ3aXNlIHRoaXMgc2luZ3VsYXJpdHkgaXMgYW5nbGUgPSAxODAKCiAgICAJCQlhbmdsZSA9IE1hdGguUEk7CgogICAgCQkJdmFyIHh4ID0gKCBtMTEgKyAxICkgLyAyOwogICAgCQkJdmFyIHl5ID0gKCBtMjIgKyAxICkgLyAyOwogICAgCQkJdmFyIHp6ID0gKCBtMzMgKyAxICkgLyAyOwogICAgCQkJdmFyIHh5ID0gKCBtMTIgKyBtMjEgKSAvIDQ7CiAgICAJCQl2YXIgeHogPSAoIG0xMyArIG0zMSApIC8gNDsKICAgIAkJCXZhciB5eiA9ICggbTIzICsgbTMyICkgLyA0OwoKICAgIAkJCWlmICggKCB4eCA+IHl5ICkgJiYgKCB4eCA+IHp6ICkgKSB7CgogICAgCQkJCS8vIG0xMSBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtCgogICAgCQkJCWlmICggeHggPCBlcHNpbG9uICkgewoKICAgIAkJCQkJeCA9IDA7CiAgICAJCQkJCXkgPSAwLjcwNzEwNjc4MTsKICAgIAkJCQkJeiA9IDAuNzA3MTA2NzgxOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJeCA9IE1hdGguc3FydCggeHggKTsKICAgIAkJCQkJeSA9IHh5IC8geDsKICAgIAkJCQkJeiA9IHh6IC8geDsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSBpZiAoIHl5ID4genogKSB7CgogICAgCQkJCS8vIG0yMiBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtCgogICAgCQkJCWlmICggeXkgPCBlcHNpbG9uICkgewoKICAgIAkJCQkJeCA9IDAuNzA3MTA2NzgxOwogICAgCQkJCQl5ID0gMDsKICAgIAkJCQkJeiA9IDAuNzA3MTA2NzgxOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJeSA9IE1hdGguc3FydCggeXkgKTsKICAgIAkJCQkJeCA9IHh5IC8geTsKICAgIAkJCQkJeiA9IHl6IC8geTsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCS8vIG0zMyBpcyB0aGUgbGFyZ2VzdCBkaWFnb25hbCB0ZXJtIHNvIGJhc2UgcmVzdWx0IG9uIHRoaXMKCiAgICAJCQkJaWYgKCB6eiA8IGVwc2lsb24gKSB7CgogICAgCQkJCQl4ID0gMC43MDcxMDY3ODE7CiAgICAJCQkJCXkgPSAwLjcwNzEwNjc4MTsKICAgIAkJCQkJeiA9IDA7CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQl6ID0gTWF0aC5zcXJ0KCB6eiApOwogICAgCQkJCQl4ID0geHogLyB6OwogICAgCQkJCQl5ID0geXogLyB6OwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCXRoaXMuc2V0KCB4LCB5LCB6LCBhbmdsZSApOwoKICAgIAkJCXJldHVybiB0aGlzOyAvLyByZXR1cm4gMTgwIGRlZyByb3RhdGlvbgoKICAgIAkJfQoKICAgIAkJLy8gYXMgd2UgaGF2ZSByZWFjaGVkIGhlcmUgdGhlcmUgYXJlIG5vIHNpbmd1bGFyaXRpZXMgc28gd2UgY2FuIGhhbmRsZSBub3JtYWxseQoKICAgIAkJdmFyIHMgPSBNYXRoLnNxcnQoICggbTMyIC0gbTIzICkgKiAoIG0zMiAtIG0yMyApICsKICAgIAkJICAgICAgICAgICAgICAgICAgICggbTEzIC0gbTMxICkgKiAoIG0xMyAtIG0zMSApICsKICAgIAkJICAgICAgICAgICAgICAgICAgICggbTIxIC0gbTEyICkgKiAoIG0yMSAtIG0xMiApICk7IC8vIHVzZWQgdG8gbm9ybWFsaXplCgogICAgCQlpZiAoIE1hdGguYWJzKCBzICkgPCAwLjAwMSApIHMgPSAxOwoKICAgIAkJLy8gcHJldmVudCBkaXZpZGUgYnkgemVybywgc2hvdWxkIG5vdCBoYXBwZW4gaWYgbWF0cml4IGlzIG9ydGhvZ29uYWwgYW5kIHNob3VsZCBiZQogICAgCQkvLyBjYXVnaHQgYnkgc2luZ3VsYXJpdHkgdGVzdCBhYm92ZSwgYnV0IEkndmUgbGVmdCBpdCBpbiBqdXN0IGluIGNhc2UKCiAgICAJCXRoaXMueCA9ICggbTMyIC0gbTIzICkgLyBzOwogICAgCQl0aGlzLnkgPSAoIG0xMyAtIG0zMSApIC8gczsKICAgIAkJdGhpcy56ID0gKCBtMjEgLSBtMTIgKSAvIHM7CiAgICAJCXRoaXMudyA9IE1hdGguYWNvcyggKCBtMTEgKyBtMjIgKyBtMzMgLSAxICkgLyAyICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWluOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLm1pbiggdGhpcy54LCB2LnggKTsKICAgIAkJdGhpcy55ID0gTWF0aC5taW4oIHRoaXMueSwgdi55ICk7CiAgICAJCXRoaXMueiA9IE1hdGgubWluKCB0aGlzLnosIHYueiApOwogICAgCQl0aGlzLncgPSBNYXRoLm1pbiggdGhpcy53LCB2LncgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltYXg6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXRoaXMueCA9IE1hdGgubWF4KCB0aGlzLngsIHYueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1heCggdGhpcy55LCB2LnkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5tYXgoIHRoaXMueiwgdi56ICk7CiAgICAJCXRoaXMudyA9IE1hdGgubWF4KCB0aGlzLncsIHYudyApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsYW1wOiBmdW5jdGlvbiAoIG1pbiwgbWF4ICkgewoKICAgIAkJLy8gYXNzdW1lcyBtaW4gPCBtYXgsIGNvbXBvbmVudHdpc2UKCiAgICAJCXRoaXMueCA9IE1hdGgubWF4KCBtaW4ueCwgTWF0aC5taW4oIG1heC54LCB0aGlzLnggKSApOwogICAgCQl0aGlzLnkgPSBNYXRoLm1heCggbWluLnksIE1hdGgubWluKCBtYXgueSwgdGhpcy55ICkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5tYXgoIG1pbi56LCBNYXRoLm1pbiggbWF4LnosIHRoaXMueiApICk7CiAgICAJCXRoaXMudyA9IE1hdGgubWF4KCBtaW4udywgTWF0aC5taW4oIG1heC53LCB0aGlzLncgKSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsYW1wU2NhbGFyOiBmdW5jdGlvbiAoIG1pblZhbCwgbWF4VmFsICkgewoKICAgIAkJdGhpcy54ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy54ICkgKTsKICAgIAkJdGhpcy55ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy55ICkgKTsKICAgIAkJdGhpcy56ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy56ICkgKTsKICAgIAkJdGhpcy53ID0gTWF0aC5tYXgoIG1pblZhbCwgTWF0aC5taW4oIG1heFZhbCwgdGhpcy53ICkgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljbGFtcExlbmd0aDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKCiAgICAJCXZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCgpOwoKICAgIAkJcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCBsZW5ndGggfHwgMSApLm11bHRpcGx5U2NhbGFyKCBNYXRoLm1heCggbWluLCBNYXRoLm1pbiggbWF4LCBsZW5ndGggKSApICk7CgogICAgCX0sCgogICAgCWZsb29yOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLmZsb29yKCB0aGlzLnggKTsKICAgIAkJdGhpcy55ID0gTWF0aC5mbG9vciggdGhpcy55ICk7CiAgICAJCXRoaXMueiA9IE1hdGguZmxvb3IoIHRoaXMueiApOwogICAgCQl0aGlzLncgPSBNYXRoLmZsb29yKCB0aGlzLncgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljZWlsOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLmNlaWwoIHRoaXMueCApOwogICAgCQl0aGlzLnkgPSBNYXRoLmNlaWwoIHRoaXMueSApOwogICAgCQl0aGlzLnogPSBNYXRoLmNlaWwoIHRoaXMueiApOwogICAgCQl0aGlzLncgPSBNYXRoLmNlaWwoIHRoaXMudyApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXJvdW5kOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnggPSBNYXRoLnJvdW5kKCB0aGlzLnggKTsKICAgIAkJdGhpcy55ID0gTWF0aC5yb3VuZCggdGhpcy55ICk7CiAgICAJCXRoaXMueiA9IE1hdGgucm91bmQoIHRoaXMueiApOwogICAgCQl0aGlzLncgPSBNYXRoLnJvdW5kKCB0aGlzLncgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyb3VuZFRvWmVybzogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy54ID0gKCB0aGlzLnggPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMueCApIDogTWF0aC5mbG9vciggdGhpcy54ICk7CiAgICAJCXRoaXMueSA9ICggdGhpcy55IDwgMCApID8gTWF0aC5jZWlsKCB0aGlzLnkgKSA6IE1hdGguZmxvb3IoIHRoaXMueSApOwogICAgCQl0aGlzLnogPSAoIHRoaXMueiA8IDAgKSA/IE1hdGguY2VpbCggdGhpcy56ICkgOiBNYXRoLmZsb29yKCB0aGlzLnogKTsKICAgIAkJdGhpcy53ID0gKCB0aGlzLncgPCAwICkgPyBNYXRoLmNlaWwoIHRoaXMudyApIDogTWF0aC5mbG9vciggdGhpcy53ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbmVnYXRlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnggPSAtIHRoaXMueDsKICAgIAkJdGhpcy55ID0gLSB0aGlzLnk7CiAgICAJCXRoaXMueiA9IC0gdGhpcy56OwogICAgCQl0aGlzLncgPSAtIHRoaXMudzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkb3Q6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXJldHVybiB0aGlzLnggKiB2LnggKyB0aGlzLnkgKiB2LnkgKyB0aGlzLnogKiB2LnogKyB0aGlzLncgKiB2Lnc7CgogICAgCX0sCgogICAgCWxlbmd0aFNxOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy54ICogdGhpcy54ICsgdGhpcy55ICogdGhpcy55ICsgdGhpcy56ICogdGhpcy56ICsgdGhpcy53ICogdGhpcy53OwoKICAgIAl9LAoKICAgIAlsZW5ndGg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBNYXRoLnNxcnQoIHRoaXMueCAqIHRoaXMueCArIHRoaXMueSAqIHRoaXMueSArIHRoaXMueiAqIHRoaXMueiArIHRoaXMudyAqIHRoaXMudyApOwoKICAgIAl9LAoKICAgIAltYW5oYXR0YW5MZW5ndGg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBNYXRoLmFicyggdGhpcy54ICkgKyBNYXRoLmFicyggdGhpcy55ICkgKyBNYXRoLmFicyggdGhpcy56ICkgKyBNYXRoLmFicyggdGhpcy53ICk7CgogICAgCX0sCgogICAgCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGl2aWRlU2NhbGFyKCB0aGlzLmxlbmd0aCgpIHx8IDEgKTsKCiAgICAJfSwKCiAgICAJc2V0TGVuZ3RoOiBmdW5jdGlvbiAoIGxlbmd0aCApIHsKCiAgICAJCXJldHVybiB0aGlzLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCBsZW5ndGggKTsKCiAgICAJfSwKCiAgICAJbGVycDogZnVuY3Rpb24gKCB2LCBhbHBoYSApIHsKCiAgICAJCXRoaXMueCArPSAoIHYueCAtIHRoaXMueCApICogYWxwaGE7CiAgICAJCXRoaXMueSArPSAoIHYueSAtIHRoaXMueSApICogYWxwaGE7CiAgICAJCXRoaXMueiArPSAoIHYueiAtIHRoaXMueiApICogYWxwaGE7CiAgICAJCXRoaXMudyArPSAoIHYudyAtIHRoaXMudyApICogYWxwaGE7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbGVycFZlY3RvcnM6IGZ1bmN0aW9uICggdjEsIHYyLCBhbHBoYSApIHsKCiAgICAJCXJldHVybiB0aGlzLnN1YlZlY3RvcnMoIHYyLCB2MSApLm11bHRpcGx5U2NhbGFyKCBhbHBoYSApLmFkZCggdjEgKTsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gKCAoIHYueCA9PT0gdGhpcy54ICkgJiYgKCB2LnkgPT09IHRoaXMueSApICYmICggdi56ID09PSB0aGlzLnogKSAmJiAoIHYudyA9PT0gdGhpcy53ICkgKTsKCiAgICAJfSwKCiAgICAJZnJvbUFycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCXRoaXMueCA9IGFycmF5WyBvZmZzZXQgXTsKICAgIAkJdGhpcy55ID0gYXJyYXlbIG9mZnNldCArIDEgXTsKICAgIAkJdGhpcy56ID0gYXJyYXlbIG9mZnNldCArIDIgXTsKICAgIAkJdGhpcy53ID0gYXJyYXlbIG9mZnNldCArIDMgXTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCWFycmF5WyBvZmZzZXQgXSA9IHRoaXMueDsKICAgIAkJYXJyYXlbIG9mZnNldCArIDEgXSA9IHRoaXMueTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDIgXSA9IHRoaXMuejsKICAgIAkJYXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMudzsKCiAgICAJCXJldHVybiBhcnJheTsKCiAgICAJfSwKCiAgICAJZnJvbUJ1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IG9mZnNldCBoYXMgYmVlbiByZW1vdmVkIGZyb20gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CgogICAgCQl9CgogICAgCQl0aGlzLnggPSBhdHRyaWJ1dGUuZ2V0WCggaW5kZXggKTsKICAgIAkJdGhpcy55ID0gYXR0cmlidXRlLmdldFkoIGluZGV4ICk7CiAgICAJCXRoaXMueiA9IGF0dHJpYnV0ZS5nZXRaKCBpbmRleCApOwogICAgCQl0aGlzLncgPSBhdHRyaWJ1dGUuZ2V0VyggaW5kZXggKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBzemltZWsgLyBodHRwczovL2dpdGh1Yi5jb20vc3ppbWVrLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgTWFyaXVzIEtpbnRlbCAvIGh0dHBzOi8vZ2l0aHViLmNvbS9raW50ZWwKICAgICAqLwoKICAgIC8qCiAgICAgSW4gb3B0aW9ucywgd2UgY2FuIHNwZWNpZnk6CiAgICAgKiBUZXh0dXJlIHBhcmFtZXRlcnMgZm9yIGFuIGF1dG8tZ2VuZXJhdGVkIHRhcmdldCB0ZXh0dXJlCiAgICAgKiBkZXB0aEJ1ZmZlci9zdGVuY2lsQnVmZmVyOiBCb29sZWFucyB0byBpbmRpY2F0ZSBpZiB3ZSBzaG91bGQgZ2VuZXJhdGUgdGhlc2UgYnVmZmVycwogICAgKi8KICAgIGZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0KCB3aWR0aCwgaGVpZ2h0LCBvcHRpb25zICkgewoKICAgIAl0aGlzLndpZHRoID0gd2lkdGg7CiAgICAJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CgogICAgCXRoaXMuc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CiAgICAJdGhpcy5zY2lzc29yVGVzdCA9IGZhbHNlOwoKICAgIAl0aGlzLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKCiAgICAJb3B0aW9ucyA9IG9wdGlvbnMgfHwge307CgogICAgCXRoaXMudGV4dHVyZSA9IG5ldyBUZXh0dXJlKCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgb3B0aW9ucy53cmFwUywgb3B0aW9ucy53cmFwVCwgb3B0aW9ucy5tYWdGaWx0ZXIsIG9wdGlvbnMubWluRmlsdGVyLCBvcHRpb25zLmZvcm1hdCwgb3B0aW9ucy50eXBlLCBvcHRpb25zLmFuaXNvdHJvcHksIG9wdGlvbnMuZW5jb2RpbmcgKTsKCiAgICAJdGhpcy50ZXh0dXJlLmltYWdlID0ge307CiAgICAJdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoID0gd2lkdGg7CiAgICAJdGhpcy50ZXh0dXJlLmltYWdlLmhlaWdodCA9IGhlaWdodDsKCiAgICAJdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IG9wdGlvbnMuZ2VuZXJhdGVNaXBtYXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmdlbmVyYXRlTWlwbWFwcyA6IGZhbHNlOwogICAgCXRoaXMudGV4dHVyZS5taW5GaWx0ZXIgPSBvcHRpb25zLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5taW5GaWx0ZXIgOiBMaW5lYXJGaWx0ZXI7CgogICAgCXRoaXMuZGVwdGhCdWZmZXIgPSBvcHRpb25zLmRlcHRoQnVmZmVyICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmRlcHRoQnVmZmVyIDogdHJ1ZTsKICAgIAl0aGlzLnN0ZW5jaWxCdWZmZXIgPSBvcHRpb25zLnN0ZW5jaWxCdWZmZXIgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuc3RlbmNpbEJ1ZmZlciA6IHRydWU7CiAgICAJdGhpcy5kZXB0aFRleHR1cmUgPSBvcHRpb25zLmRlcHRoVGV4dHVyZSAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aFRleHR1cmUgOiBudWxsOwoKICAgIH0KCiAgICBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFdlYkdMUmVuZGVyVGFyZ2V0LAoKICAgIAlpc1dlYkdMUmVuZGVyVGFyZ2V0OiB0cnVlLAoKICAgIAlzZXRTaXplOiBmdW5jdGlvbiAoIHdpZHRoLCBoZWlnaHQgKSB7CgogICAgCQlpZiAoIHRoaXMud2lkdGggIT09IHdpZHRoIHx8IHRoaXMuaGVpZ2h0ICE9PSBoZWlnaHQgKSB7CgogICAgCQkJdGhpcy53aWR0aCA9IHdpZHRoOwogICAgCQkJdGhpcy5oZWlnaHQgPSBoZWlnaHQ7CgogICAgCQkJdGhpcy50ZXh0dXJlLmltYWdlLndpZHRoID0gd2lkdGg7CiAgICAJCQl0aGlzLnRleHR1cmUuaW1hZ2UuaGVpZ2h0ID0gaGVpZ2h0OwoKICAgIAkJCXRoaXMuZGlzcG9zZSgpOwoKICAgIAkJfQoKICAgIAkJdGhpcy52aWV3cG9ydC5zZXQoIDAsIDAsIHdpZHRoLCBoZWlnaHQgKTsKICAgIAkJdGhpcy5zY2lzc29yLnNldCggMCwgMCwgd2lkdGgsIGhlaWdodCApOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJCXRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7CiAgICAJCXRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDsKCiAgICAJCXRoaXMudmlld3BvcnQuY29weSggc291cmNlLnZpZXdwb3J0ICk7CgogICAgCQl0aGlzLnRleHR1cmUgPSBzb3VyY2UudGV4dHVyZS5jbG9uZSgpOwoKICAgIAkJdGhpcy5kZXB0aEJ1ZmZlciA9IHNvdXJjZS5kZXB0aEJ1ZmZlcjsKICAgIAkJdGhpcy5zdGVuY2lsQnVmZmVyID0gc291cmNlLnN0ZW5jaWxCdWZmZXI7CiAgICAJCXRoaXMuZGVwdGhUZXh0dXJlID0gc291cmNlLmRlcHRoVGV4dHVyZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKiBAYXV0aG9yIE1hdHQgRGVzTGF1cmllcnMgLyBAbWF0dGRlc2wKICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQoIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKSB7CgogICAgCVdlYkdMUmVuZGVyVGFyZ2V0LmNhbGwoIHRoaXMsIHdpZHRoLCBoZWlnaHQsIG9wdGlvbnMgKTsKCiAgICAJdGhpcy5zYW1wbGVzID0gNDsKCiAgICB9CgogICAgV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBXZWJHTFJlbmRlclRhcmdldC5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCwKCiAgICAJaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiB0cnVlLAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJCVdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAkJdGhpcy5zYW1wbGVzID0gc291cmNlLnNhbXBsZXM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICB2YXIgX3YxID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbTEgPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF96ZXJvID0gbmV3IFZlY3RvcjMoIDAsIDAsIDAgKTsKICAgIHZhciBfb25lID0gbmV3IFZlY3RvcjMoIDEsIDEsIDEgKTsKICAgIHZhciBfeCA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3kgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF96ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIHN1cGVyZWdnYmVydCAvIGh0dHA6Ly93d3cucGF1bGJydW50LmNvLnVrLwogICAgICogQGF1dGhvciBwaGlsb2diIC8gaHR0cDovL2Jsb2cudGhlaml0Lm9yZy8KICAgICAqIEBhdXRob3Igam9yZGlfcm9zIC8gaHR0cDovL3BsYXR0c29mdC5jb20KICAgICAqIEBhdXRob3IgRDFwbG8xZCAvIGh0dHA6Ly9naXRodWIuY29tL0QxcGxvMWQKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLwogICAgICogQGF1dGhvciB0aW1rbmlwIC8gaHR0cDovL3d3dy5mbG9vcnBsYW5uZXIuY29tLwogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICBmdW5jdGlvbiBNYXRyaXg0KCkgewoKICAgIAl0aGlzLmVsZW1lbnRzID0gWwoKICAgIAkJMSwgMCwgMCwgMCwKICAgIAkJMCwgMSwgMCwgMCwKICAgIAkJMCwgMCwgMSwgMCwKICAgIAkJMCwgMCwgMCwgMQoKICAgIAldOwoKICAgIAlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAwICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IHRoZSBjb25zdHJ1Y3RvciBubyBsb25nZXIgcmVhZHMgYXJndW1lbnRzLiB1c2UgLnNldCgpIGluc3RlYWQuJyApOwoKICAgIAl9CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIE1hdHJpeDQucHJvdG90eXBlLCB7CgogICAgCWlzTWF0cml4NDogdHJ1ZSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIG4xMSwgbjEyLCBuMTMsIG4xNCwgbjIxLCBuMjIsIG4yMywgbjI0LCBuMzEsIG4zMiwgbjMzLCBuMzQsIG40MSwgbjQyLCBuNDMsIG40NCApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl0ZVsgMCBdID0gbjExOyB0ZVsgNCBdID0gbjEyOyB0ZVsgOCBdID0gbjEzOyB0ZVsgMTIgXSA9IG4xNDsKICAgIAkJdGVbIDEgXSA9IG4yMTsgdGVbIDUgXSA9IG4yMjsgdGVbIDkgXSA9IG4yMzsgdGVbIDEzIF0gPSBuMjQ7CiAgICAJCXRlWyAyIF0gPSBuMzE7IHRlWyA2IF0gPSBuMzI7IHRlWyAxMCBdID0gbjMzOyB0ZVsgMTQgXSA9IG4zNDsKICAgIAkJdGVbIDMgXSA9IG40MTsgdGVbIDcgXSA9IG40MjsgdGVbIDExIF0gPSBuNDM7IHRlWyAxNSBdID0gbjQ0OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWlkZW50aXR5OiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnNldCgKCiAgICAJCQkxLCAwLCAwLCAwLAogICAgCQkJMCwgMSwgMCwgMCwKICAgIAkJCTAsIDAsIDEsIDAsCiAgICAJCQkwLCAwLCAwLCAxCgogICAgCQkpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IE1hdHJpeDQoKS5mcm9tQXJyYXkoIHRoaXMuZWxlbWVudHMgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKICAgIAkJdmFyIG1lID0gbS5lbGVtZW50czsKCiAgICAJCXRlWyAwIF0gPSBtZVsgMCBdOyB0ZVsgMSBdID0gbWVbIDEgXTsgdGVbIDIgXSA9IG1lWyAyIF07IHRlWyAzIF0gPSBtZVsgMyBdOwogICAgCQl0ZVsgNCBdID0gbWVbIDQgXTsgdGVbIDUgXSA9IG1lWyA1IF07IHRlWyA2IF0gPSBtZVsgNiBdOyB0ZVsgNyBdID0gbWVbIDcgXTsKICAgIAkJdGVbIDggXSA9IG1lWyA4IF07IHRlWyA5IF0gPSBtZVsgOSBdOyB0ZVsgMTAgXSA9IG1lWyAxMCBdOyB0ZVsgMTEgXSA9IG1lWyAxMSBdOwogICAgCQl0ZVsgMTIgXSA9IG1lWyAxMiBdOyB0ZVsgMTMgXSA9IG1lWyAxMyBdOyB0ZVsgMTQgXSA9IG1lWyAxNCBdOyB0ZVsgMTUgXSA9IG1lWyAxNSBdOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvcHlQb3NpdGlvbjogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50cywgbWUgPSBtLmVsZW1lbnRzOwoKICAgIAkJdGVbIDEyIF0gPSBtZVsgMTIgXTsKICAgIAkJdGVbIDEzIF0gPSBtZVsgMTMgXTsKICAgIAkJdGVbIDE0IF0gPSBtZVsgMTQgXTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlleHRyYWN0QmFzaXM6IGZ1bmN0aW9uICggeEF4aXMsIHlBeGlzLCB6QXhpcyApIHsKCiAgICAJCXhBeGlzLnNldEZyb21NYXRyaXhDb2x1bW4oIHRoaXMsIDAgKTsKICAgIAkJeUF4aXMuc2V0RnJvbU1hdHJpeENvbHVtbiggdGhpcywgMSApOwogICAgCQl6QXhpcy5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAyICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZUJhc2lzOiBmdW5jdGlvbiAoIHhBeGlzLCB5QXhpcywgekF4aXMgKSB7CgogICAgCQl0aGlzLnNldCgKICAgIAkJCXhBeGlzLngsIHlBeGlzLngsIHpBeGlzLngsIDAsCiAgICAJCQl4QXhpcy55LCB5QXhpcy55LCB6QXhpcy55LCAwLAogICAgCQkJeEF4aXMueiwgeUF4aXMueiwgekF4aXMueiwgMCwKICAgIAkJCTAsIDAsIDAsIDEKICAgIAkJKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlleHRyYWN0Um90YXRpb246IGZ1bmN0aW9uICggbSApIHsKCiAgICAJCS8vIHRoaXMgbWV0aG9kIGRvZXMgbm90IHN1cHBvcnQgcmVmbGVjdGlvbiBtYXRyaWNlcwoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKICAgIAkJdmFyIG1lID0gbS5lbGVtZW50czsKCiAgICAJCXZhciBzY2FsZVggPSAxIC8gX3YxLnNldEZyb21NYXRyaXhDb2x1bW4oIG0sIDAgKS5sZW5ndGgoKTsKICAgIAkJdmFyIHNjYWxlWSA9IDEgLyBfdjEuc2V0RnJvbU1hdHJpeENvbHVtbiggbSwgMSApLmxlbmd0aCgpOwogICAgCQl2YXIgc2NhbGVaID0gMSAvIF92MS5zZXRGcm9tTWF0cml4Q29sdW1uKCBtLCAyICkubGVuZ3RoKCk7CgogICAgCQl0ZVsgMCBdID0gbWVbIDAgXSAqIHNjYWxlWDsKICAgIAkJdGVbIDEgXSA9IG1lWyAxIF0gKiBzY2FsZVg7CiAgICAJCXRlWyAyIF0gPSBtZVsgMiBdICogc2NhbGVYOwogICAgCQl0ZVsgMyBdID0gMDsKCiAgICAJCXRlWyA0IF0gPSBtZVsgNCBdICogc2NhbGVZOwogICAgCQl0ZVsgNSBdID0gbWVbIDUgXSAqIHNjYWxlWTsKICAgIAkJdGVbIDYgXSA9IG1lWyA2IF0gKiBzY2FsZVk7CiAgICAJCXRlWyA3IF0gPSAwOwoKICAgIAkJdGVbIDggXSA9IG1lWyA4IF0gKiBzY2FsZVo7CiAgICAJCXRlWyA5IF0gPSBtZVsgOSBdICogc2NhbGVaOwogICAgCQl0ZVsgMTAgXSA9IG1lWyAxMCBdICogc2NhbGVaOwogICAgCQl0ZVsgMTEgXSA9IDA7CgogICAgCQl0ZVsgMTIgXSA9IDA7CiAgICAJCXRlWyAxMyBdID0gMDsKICAgIAkJdGVbIDE0IF0gPSAwOwogICAgCQl0ZVsgMTUgXSA9IDE7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZVJvdGF0aW9uRnJvbUV1bGVyOiBmdW5jdGlvbiAoIGV1bGVyICkgewoKICAgIAkJaWYgKCAhICggZXVsZXIgJiYgZXVsZXIuaXNFdWxlciApICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAubWFrZVJvdGF0aW9uRnJvbUV1bGVyKCkgbm93IGV4cGVjdHMgYSBFdWxlciByb3RhdGlvbiByYXRoZXIgdGhhbiBhIFZlY3RvcjMgYW5kIG9yZGVyLicgKTsKCiAgICAJCX0KCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl2YXIgeCA9IGV1bGVyLngsIHkgPSBldWxlci55LCB6ID0gZXVsZXIuejsKICAgIAkJdmFyIGEgPSBNYXRoLmNvcyggeCApLCBiID0gTWF0aC5zaW4oIHggKTsKICAgIAkJdmFyIGMgPSBNYXRoLmNvcyggeSApLCBkID0gTWF0aC5zaW4oIHkgKTsKICAgIAkJdmFyIGUgPSBNYXRoLmNvcyggeiApLCBmID0gTWF0aC5zaW4oIHogKTsKCiAgICAJCWlmICggZXVsZXIub3JkZXIgPT09ICdYWVonICkgewoKICAgIAkJCXZhciBhZSA9IGEgKiBlLCBhZiA9IGEgKiBmLCBiZSA9IGIgKiBlLCBiZiA9IGIgKiBmOwoKICAgIAkJCXRlWyAwIF0gPSBjICogZTsKICAgIAkJCXRlWyA0IF0gPSAtIGMgKiBmOwogICAgCQkJdGVbIDggXSA9IGQ7CgogICAgCQkJdGVbIDEgXSA9IGFmICsgYmUgKiBkOwogICAgCQkJdGVbIDUgXSA9IGFlIC0gYmYgKiBkOwogICAgCQkJdGVbIDkgXSA9IC0gYiAqIGM7CgogICAgCQkJdGVbIDIgXSA9IGJmIC0gYWUgKiBkOwogICAgCQkJdGVbIDYgXSA9IGJlICsgYWYgKiBkOwogICAgCQkJdGVbIDEwIF0gPSBhICogYzsKCiAgICAJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWVhaJyApIHsKCiAgICAJCQl2YXIgY2UgPSBjICogZSwgY2YgPSBjICogZiwgZGUgPSBkICogZSwgZGYgPSBkICogZjsKCiAgICAJCQl0ZVsgMCBdID0gY2UgKyBkZiAqIGI7CiAgICAJCQl0ZVsgNCBdID0gZGUgKiBiIC0gY2Y7CiAgICAJCQl0ZVsgOCBdID0gYSAqIGQ7CgogICAgCQkJdGVbIDEgXSA9IGEgKiBmOwogICAgCQkJdGVbIDUgXSA9IGEgKiBlOwogICAgCQkJdGVbIDkgXSA9IC0gYjsKCiAgICAJCQl0ZVsgMiBdID0gY2YgKiBiIC0gZGU7CiAgICAJCQl0ZVsgNiBdID0gZGYgKyBjZSAqIGI7CiAgICAJCQl0ZVsgMTAgXSA9IGEgKiBjOwoKICAgIAkJfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdaWFknICkgewoKICAgIAkJCXZhciBjZSA9IGMgKiBlLCBjZiA9IGMgKiBmLCBkZSA9IGQgKiBlLCBkZiA9IGQgKiBmOwoKICAgIAkJCXRlWyAwIF0gPSBjZSAtIGRmICogYjsKICAgIAkJCXRlWyA0IF0gPSAtIGEgKiBmOwogICAgCQkJdGVbIDggXSA9IGRlICsgY2YgKiBiOwoKICAgIAkJCXRlWyAxIF0gPSBjZiArIGRlICogYjsKICAgIAkJCXRlWyA1IF0gPSBhICogZTsKICAgIAkJCXRlWyA5IF0gPSBkZiAtIGNlICogYjsKCiAgICAJCQl0ZVsgMiBdID0gLSBhICogZDsKICAgIAkJCXRlWyA2IF0gPSBiOwogICAgCQkJdGVbIDEwIF0gPSBhICogYzsKCiAgICAJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWllYJyApIHsKCiAgICAJCQl2YXIgYWUgPSBhICogZSwgYWYgPSBhICogZiwgYmUgPSBiICogZSwgYmYgPSBiICogZjsKCiAgICAJCQl0ZVsgMCBdID0gYyAqIGU7CiAgICAJCQl0ZVsgNCBdID0gYmUgKiBkIC0gYWY7CiAgICAJCQl0ZVsgOCBdID0gYWUgKiBkICsgYmY7CgogICAgCQkJdGVbIDEgXSA9IGMgKiBmOwogICAgCQkJdGVbIDUgXSA9IGJmICogZCArIGFlOwogICAgCQkJdGVbIDkgXSA9IGFmICogZCAtIGJlOwoKICAgIAkJCXRlWyAyIF0gPSAtIGQ7CiAgICAJCQl0ZVsgNiBdID0gYiAqIGM7CiAgICAJCQl0ZVsgMTAgXSA9IGEgKiBjOwoKICAgIAkJfSBlbHNlIGlmICggZXVsZXIub3JkZXIgPT09ICdZWlgnICkgewoKICAgIAkJCXZhciBhYyA9IGEgKiBjLCBhZCA9IGEgKiBkLCBiYyA9IGIgKiBjLCBiZCA9IGIgKiBkOwoKICAgIAkJCXRlWyAwIF0gPSBjICogZTsKICAgIAkJCXRlWyA0IF0gPSBiZCAtIGFjICogZjsKICAgIAkJCXRlWyA4IF0gPSBiYyAqIGYgKyBhZDsKCiAgICAJCQl0ZVsgMSBdID0gZjsKICAgIAkJCXRlWyA1IF0gPSBhICogZTsKICAgIAkJCXRlWyA5IF0gPSAtIGIgKiBlOwoKICAgIAkJCXRlWyAyIF0gPSAtIGQgKiBlOwogICAgCQkJdGVbIDYgXSA9IGFkICogZiArIGJjOwogICAgCQkJdGVbIDEwIF0gPSBhYyAtIGJkICogZjsKCiAgICAJCX0gZWxzZSBpZiAoIGV1bGVyLm9yZGVyID09PSAnWFpZJyApIHsKCiAgICAJCQl2YXIgYWMgPSBhICogYywgYWQgPSBhICogZCwgYmMgPSBiICogYywgYmQgPSBiICogZDsKCiAgICAJCQl0ZVsgMCBdID0gYyAqIGU7CiAgICAJCQl0ZVsgNCBdID0gLSBmOwogICAgCQkJdGVbIDggXSA9IGQgKiBlOwoKICAgIAkJCXRlWyAxIF0gPSBhYyAqIGYgKyBiZDsKICAgIAkJCXRlWyA1IF0gPSBhICogZTsKICAgIAkJCXRlWyA5IF0gPSBhZCAqIGYgLSBiYzsKCiAgICAJCQl0ZVsgMiBdID0gYmMgKiBmIC0gYWQ7CiAgICAJCQl0ZVsgNiBdID0gYiAqIGU7CiAgICAJCQl0ZVsgMTAgXSA9IGJkICogZiArIGFjOwoKICAgIAkJfQoKICAgIAkJLy8gYm90dG9tIHJvdwogICAgCQl0ZVsgMyBdID0gMDsKICAgIAkJdGVbIDcgXSA9IDA7CiAgICAJCXRlWyAxMSBdID0gMDsKCiAgICAJCS8vIGxhc3QgY29sdW1uCiAgICAJCXRlWyAxMiBdID0gMDsKICAgIAkJdGVbIDEzIF0gPSAwOwogICAgCQl0ZVsgMTQgXSA9IDA7CiAgICAJCXRlWyAxNSBdID0gMTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgewoKICAgIAkJcmV0dXJuIHRoaXMuY29tcG9zZSggX3plcm8sIHEsIF9vbmUgKTsKCiAgICAJfSwKCiAgICAJbG9va0F0OiBmdW5jdGlvbiAoIGV5ZSwgdGFyZ2V0LCB1cCApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQlfei5zdWJWZWN0b3JzKCBleWUsIHRhcmdldCApOwoKICAgIAkJaWYgKCBfei5sZW5ndGhTcSgpID09PSAwICkgewoKICAgIAkJCS8vIGV5ZSBhbmQgdGFyZ2V0IGFyZSBpbiB0aGUgc2FtZSBwb3NpdGlvbgoKICAgIAkJCV96LnogPSAxOwoKICAgIAkJfQoKICAgIAkJX3oubm9ybWFsaXplKCk7CiAgICAJCV94LmNyb3NzVmVjdG9ycyggdXAsIF96ICk7CgogICAgCQlpZiAoIF94Lmxlbmd0aFNxKCkgPT09IDAgKSB7CgogICAgCQkJLy8gdXAgYW5kIHogYXJlIHBhcmFsbGVsCgogICAgCQkJaWYgKCBNYXRoLmFicyggdXAueiApID09PSAxICkgewoKICAgIAkJCQlfei54ICs9IDAuMDAwMTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlfei56ICs9IDAuMDAwMTsKCiAgICAJCQl9CgogICAgCQkJX3oubm9ybWFsaXplKCk7CiAgICAJCQlfeC5jcm9zc1ZlY3RvcnMoIHVwLCBfeiApOwoKICAgIAkJfQoKICAgIAkJX3gubm9ybWFsaXplKCk7CiAgICAJCV95LmNyb3NzVmVjdG9ycyggX3osIF94ICk7CgogICAgCQl0ZVsgMCBdID0gX3gueDsgdGVbIDQgXSA9IF95Lng7IHRlWyA4IF0gPSBfei54OwogICAgCQl0ZVsgMSBdID0gX3gueTsgdGVbIDUgXSA9IF95Lnk7IHRlWyA5IF0gPSBfei55OwogICAgCQl0ZVsgMiBdID0gX3guejsgdGVbIDYgXSA9IF95Lno7IHRlWyAxMCBdID0gX3ouejsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltdWx0aXBseTogZnVuY3Rpb24gKCBtLCBuICkgewoKICAgIAkJaWYgKCBuICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5KCkgbm93IG9ubHkgYWNjZXB0cyBvbmUgYXJndW1lbnQuIFVzZSAubXVsdGlwbHlNYXRyaWNlcyggYSwgYiApIGluc3RlYWQuJyApOwogICAgCQkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgbiApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggdGhpcywgbSApOwoKICAgIAl9LAoKICAgIAlwcmVtdWx0aXBseTogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJcmV0dXJuIHRoaXMubXVsdGlwbHlNYXRyaWNlcyggbSwgdGhpcyApOwoKICAgIAl9LAoKICAgIAltdWx0aXBseU1hdHJpY2VzOiBmdW5jdGlvbiAoIGEsIGIgKSB7CgogICAgCQl2YXIgYWUgPSBhLmVsZW1lbnRzOwogICAgCQl2YXIgYmUgPSBiLmVsZW1lbnRzOwogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKICAgIAkJdmFyIGExMSA9IGFlWyAwIF0sIGExMiA9IGFlWyA0IF0sIGExMyA9IGFlWyA4IF0sIGExNCA9IGFlWyAxMiBdOwogICAgCQl2YXIgYTIxID0gYWVbIDEgXSwgYTIyID0gYWVbIDUgXSwgYTIzID0gYWVbIDkgXSwgYTI0ID0gYWVbIDEzIF07CiAgICAJCXZhciBhMzEgPSBhZVsgMiBdLCBhMzIgPSBhZVsgNiBdLCBhMzMgPSBhZVsgMTAgXSwgYTM0ID0gYWVbIDE0IF07CiAgICAJCXZhciBhNDEgPSBhZVsgMyBdLCBhNDIgPSBhZVsgNyBdLCBhNDMgPSBhZVsgMTEgXSwgYTQ0ID0gYWVbIDE1IF07CgogICAgCQl2YXIgYjExID0gYmVbIDAgXSwgYjEyID0gYmVbIDQgXSwgYjEzID0gYmVbIDggXSwgYjE0ID0gYmVbIDEyIF07CiAgICAJCXZhciBiMjEgPSBiZVsgMSBdLCBiMjIgPSBiZVsgNSBdLCBiMjMgPSBiZVsgOSBdLCBiMjQgPSBiZVsgMTMgXTsKICAgIAkJdmFyIGIzMSA9IGJlWyAyIF0sIGIzMiA9IGJlWyA2IF0sIGIzMyA9IGJlWyAxMCBdLCBiMzQgPSBiZVsgMTQgXTsKICAgIAkJdmFyIGI0MSA9IGJlWyAzIF0sIGI0MiA9IGJlWyA3IF0sIGI0MyA9IGJlWyAxMSBdLCBiNDQgPSBiZVsgMTUgXTsKCiAgICAJCXRlWyAwIF0gPSBhMTEgKiBiMTEgKyBhMTIgKiBiMjEgKyBhMTMgKiBiMzEgKyBhMTQgKiBiNDE7CiAgICAJCXRlWyA0IF0gPSBhMTEgKiBiMTIgKyBhMTIgKiBiMjIgKyBhMTMgKiBiMzIgKyBhMTQgKiBiNDI7CiAgICAJCXRlWyA4IF0gPSBhMTEgKiBiMTMgKyBhMTIgKiBiMjMgKyBhMTMgKiBiMzMgKyBhMTQgKiBiNDM7CiAgICAJCXRlWyAxMiBdID0gYTExICogYjE0ICsgYTEyICogYjI0ICsgYTEzICogYjM0ICsgYTE0ICogYjQ0OwoKICAgIAkJdGVbIDEgXSA9IGEyMSAqIGIxMSArIGEyMiAqIGIyMSArIGEyMyAqIGIzMSArIGEyNCAqIGI0MTsKICAgIAkJdGVbIDUgXSA9IGEyMSAqIGIxMiArIGEyMiAqIGIyMiArIGEyMyAqIGIzMiArIGEyNCAqIGI0MjsKICAgIAkJdGVbIDkgXSA9IGEyMSAqIGIxMyArIGEyMiAqIGIyMyArIGEyMyAqIGIzMyArIGEyNCAqIGI0MzsKICAgIAkJdGVbIDEzIF0gPSBhMjEgKiBiMTQgKyBhMjIgKiBiMjQgKyBhMjMgKiBiMzQgKyBhMjQgKiBiNDQ7CgogICAgCQl0ZVsgMiBdID0gYTMxICogYjExICsgYTMyICogYjIxICsgYTMzICogYjMxICsgYTM0ICogYjQxOwogICAgCQl0ZVsgNiBdID0gYTMxICogYjEyICsgYTMyICogYjIyICsgYTMzICogYjMyICsgYTM0ICogYjQyOwogICAgCQl0ZVsgMTAgXSA9IGEzMSAqIGIxMyArIGEzMiAqIGIyMyArIGEzMyAqIGIzMyArIGEzNCAqIGI0MzsKICAgIAkJdGVbIDE0IF0gPSBhMzEgKiBiMTQgKyBhMzIgKiBiMjQgKyBhMzMgKiBiMzQgKyBhMzQgKiBiNDQ7CgogICAgCQl0ZVsgMyBdID0gYTQxICogYjExICsgYTQyICogYjIxICsgYTQzICogYjMxICsgYTQ0ICogYjQxOwogICAgCQl0ZVsgNyBdID0gYTQxICogYjEyICsgYTQyICogYjIyICsgYTQzICogYjMyICsgYTQ0ICogYjQyOwogICAgCQl0ZVsgMTEgXSA9IGE0MSAqIGIxMyArIGE0MiAqIGIyMyArIGE0MyAqIGIzMyArIGE0NCAqIGI0MzsKICAgIAkJdGVbIDE1IF0gPSBhNDEgKiBiMTQgKyBhNDIgKiBiMjQgKyBhNDMgKiBiMzQgKyBhNDQgKiBiNDQ7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbXVsdGlwbHlTY2FsYXI6IGZ1bmN0aW9uICggcyApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl0ZVsgMCBdICo9IHM7IHRlWyA0IF0gKj0gczsgdGVbIDggXSAqPSBzOyB0ZVsgMTIgXSAqPSBzOwogICAgCQl0ZVsgMSBdICo9IHM7IHRlWyA1IF0gKj0gczsgdGVbIDkgXSAqPSBzOyB0ZVsgMTMgXSAqPSBzOwogICAgCQl0ZVsgMiBdICo9IHM7IHRlWyA2IF0gKj0gczsgdGVbIDEwIF0gKj0gczsgdGVbIDE0IF0gKj0gczsKICAgIAkJdGVbIDMgXSAqPSBzOyB0ZVsgNyBdICo9IHM7IHRlWyAxMSBdICo9IHM7IHRlWyAxNSBdICo9IHM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUgKSB7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCV92MS54ID0gYXR0cmlidXRlLmdldFgoIGkgKTsKICAgIAkJCV92MS55ID0gYXR0cmlidXRlLmdldFkoIGkgKTsKICAgIAkJCV92MS56ID0gYXR0cmlidXRlLmdldFooIGkgKTsKCiAgICAJCQlfdjEuYXBwbHlNYXRyaXg0KCB0aGlzICk7CgogICAgCQkJYXR0cmlidXRlLnNldFhZWiggaSwgX3YxLngsIF92MS55LCBfdjEueiApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGF0dHJpYnV0ZTsKCiAgICAJfSwKCiAgICAJZGV0ZXJtaW5hbnQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl2YXIgbjExID0gdGVbIDAgXSwgbjEyID0gdGVbIDQgXSwgbjEzID0gdGVbIDggXSwgbjE0ID0gdGVbIDEyIF07CiAgICAJCXZhciBuMjEgPSB0ZVsgMSBdLCBuMjIgPSB0ZVsgNSBdLCBuMjMgPSB0ZVsgOSBdLCBuMjQgPSB0ZVsgMTMgXTsKICAgIAkJdmFyIG4zMSA9IHRlWyAyIF0sIG4zMiA9IHRlWyA2IF0sIG4zMyA9IHRlWyAxMCBdLCBuMzQgPSB0ZVsgMTQgXTsKICAgIAkJdmFyIG40MSA9IHRlWyAzIF0sIG40MiA9IHRlWyA3IF0sIG40MyA9IHRlWyAxMSBdLCBuNDQgPSB0ZVsgMTUgXTsKCiAgICAJCS8vVE9ETzogbWFrZSB0aGlzIG1vcmUgZWZmaWNpZW50CiAgICAJCS8vKCBiYXNlZCBvbiBodHRwOi8vd3d3LmV1Y2xpZGVhbnNwYWNlLmNvbS9tYXRocy9hbGdlYnJhL21hdHJpeC9mdW5jdGlvbnMvaW52ZXJzZS9mb3VyRC9pbmRleC5odG0gKQoKICAgIAkJcmV0dXJuICgKICAgIAkJCW40MSAqICgKICAgIAkJCQkrIG4xNCAqIG4yMyAqIG4zMgogICAgCQkJCSAtIG4xMyAqIG4yNCAqIG4zMgogICAgCQkJCSAtIG4xNCAqIG4yMiAqIG4zMwogICAgCQkJCSArIG4xMiAqIG4yNCAqIG4zMwogICAgCQkJCSArIG4xMyAqIG4yMiAqIG4zNAogICAgCQkJCSAtIG4xMiAqIG4yMyAqIG4zNAogICAgCQkJKSArCiAgICAJCQluNDIgKiAoCiAgICAJCQkJKyBuMTEgKiBuMjMgKiBuMzQKICAgIAkJCQkgLSBuMTEgKiBuMjQgKiBuMzMKICAgIAkJCQkgKyBuMTQgKiBuMjEgKiBuMzMKICAgIAkJCQkgLSBuMTMgKiBuMjEgKiBuMzQKICAgIAkJCQkgKyBuMTMgKiBuMjQgKiBuMzEKICAgIAkJCQkgLSBuMTQgKiBuMjMgKiBuMzEKICAgIAkJCSkgKwogICAgCQkJbjQzICogKAogICAgCQkJCSsgbjExICogbjI0ICogbjMyCiAgICAJCQkJIC0gbjExICogbjIyICogbjM0CiAgICAJCQkJIC0gbjE0ICogbjIxICogbjMyCiAgICAJCQkJICsgbjEyICogbjIxICogbjM0CiAgICAJCQkJICsgbjE0ICogbjIyICogbjMxCiAgICAJCQkJIC0gbjEyICogbjI0ICogbjMxCiAgICAJCQkpICsKICAgIAkJCW40NCAqICgKICAgIAkJCQktIG4xMyAqIG4yMiAqIG4zMQogICAgCQkJCSAtIG4xMSAqIG4yMyAqIG4zMgogICAgCQkJCSArIG4xMSAqIG4yMiAqIG4zMwogICAgCQkJCSArIG4xMyAqIG4yMSAqIG4zMgogICAgCQkJCSAtIG4xMiAqIG4yMSAqIG4zMwogICAgCQkJCSArIG4xMiAqIG4yMyAqIG4zMQogICAgCQkJKQoKICAgIAkJKTsKCiAgICAJfSwKCiAgICAJdHJhbnNwb3NlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwogICAgCQl2YXIgdG1wOwoKICAgIAkJdG1wID0gdGVbIDEgXTsgdGVbIDEgXSA9IHRlWyA0IF07IHRlWyA0IF0gPSB0bXA7CiAgICAJCXRtcCA9IHRlWyAyIF07IHRlWyAyIF0gPSB0ZVsgOCBdOyB0ZVsgOCBdID0gdG1wOwogICAgCQl0bXAgPSB0ZVsgNiBdOyB0ZVsgNiBdID0gdGVbIDkgXTsgdGVbIDkgXSA9IHRtcDsKCiAgICAJCXRtcCA9IHRlWyAzIF07IHRlWyAzIF0gPSB0ZVsgMTIgXTsgdGVbIDEyIF0gPSB0bXA7CiAgICAJCXRtcCA9IHRlWyA3IF07IHRlWyA3IF0gPSB0ZVsgMTMgXTsgdGVbIDEzIF0gPSB0bXA7CiAgICAJCXRtcCA9IHRlWyAxMSBdOyB0ZVsgMTEgXSA9IHRlWyAxNCBdOyB0ZVsgMTQgXSA9IHRtcDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRQb3NpdGlvbjogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCiAgICAJCWlmICggeC5pc1ZlY3RvcjMgKSB7CgogICAgCQkJdGVbIDEyIF0gPSB4Lng7CiAgICAJCQl0ZVsgMTMgXSA9IHgueTsKICAgIAkJCXRlWyAxNCBdID0geC56OwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0ZVsgMTIgXSA9IHg7CiAgICAJCQl0ZVsgMTMgXSA9IHk7CiAgICAJCQl0ZVsgMTQgXSA9IHo7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0SW52ZXJzZTogZnVuY3Rpb24gKCBtLCB0aHJvd09uRGVnZW5lcmF0ZSApIHsKCiAgICAJCS8vIGJhc2VkIG9uIGh0dHA6Ly93d3cuZXVjbGlkZWFuc3BhY2UuY29tL21hdGhzL2FsZ2VicmEvbWF0cml4L2Z1bmN0aW9ucy9pbnZlcnNlL2ZvdXJEL2luZGV4Lmh0bQogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzLAogICAgCQkJbWUgPSBtLmVsZW1lbnRzLAoKICAgIAkJCW4xMSA9IG1lWyAwIF0sIG4yMSA9IG1lWyAxIF0sIG4zMSA9IG1lWyAyIF0sIG40MSA9IG1lWyAzIF0sCiAgICAJCQluMTIgPSBtZVsgNCBdLCBuMjIgPSBtZVsgNSBdLCBuMzIgPSBtZVsgNiBdLCBuNDIgPSBtZVsgNyBdLAogICAgCQkJbjEzID0gbWVbIDggXSwgbjIzID0gbWVbIDkgXSwgbjMzID0gbWVbIDEwIF0sIG40MyA9IG1lWyAxMSBdLAogICAgCQkJbjE0ID0gbWVbIDEyIF0sIG4yNCA9IG1lWyAxMyBdLCBuMzQgPSBtZVsgMTQgXSwgbjQ0ID0gbWVbIDE1IF0sCgogICAgCQkJdDExID0gbjIzICogbjM0ICogbjQyIC0gbjI0ICogbjMzICogbjQyICsgbjI0ICogbjMyICogbjQzIC0gbjIyICogbjM0ICogbjQzIC0gbjIzICogbjMyICogbjQ0ICsgbjIyICogbjMzICogbjQ0LAogICAgCQkJdDEyID0gbjE0ICogbjMzICogbjQyIC0gbjEzICogbjM0ICogbjQyIC0gbjE0ICogbjMyICogbjQzICsgbjEyICogbjM0ICogbjQzICsgbjEzICogbjMyICogbjQ0IC0gbjEyICogbjMzICogbjQ0LAogICAgCQkJdDEzID0gbjEzICogbjI0ICogbjQyIC0gbjE0ICogbjIzICogbjQyICsgbjE0ICogbjIyICogbjQzIC0gbjEyICogbjI0ICogbjQzIC0gbjEzICogbjIyICogbjQ0ICsgbjEyICogbjIzICogbjQ0LAogICAgCQkJdDE0ID0gbjE0ICogbjIzICogbjMyIC0gbjEzICogbjI0ICogbjMyIC0gbjE0ICogbjIyICogbjMzICsgbjEyICogbjI0ICogbjMzICsgbjEzICogbjIyICogbjM0IC0gbjEyICogbjIzICogbjM0OwoKICAgIAkJdmFyIGRldCA9IG4xMSAqIHQxMSArIG4yMSAqIHQxMiArIG4zMSAqIHQxMyArIG40MSAqIHQxNDsKCiAgICAJCWlmICggZGV0ID09PSAwICkgewoKICAgIAkJCXZhciBtc2cgPSAiVEhSRUUuTWF0cml4NDogLmdldEludmVyc2UoKSBjYW4ndCBpbnZlcnQgbWF0cml4LCBkZXRlcm1pbmFudCBpcyAwIjsKCiAgICAJCQlpZiAoIHRocm93T25EZWdlbmVyYXRlID09PSB0cnVlICkgewoKICAgIAkJCQl0aHJvdyBuZXcgRXJyb3IoIG1zZyApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggbXNnICk7CgogICAgCQkJfQoKICAgIAkJCXJldHVybiB0aGlzLmlkZW50aXR5KCk7CgogICAgCQl9CgogICAgCQl2YXIgZGV0SW52ID0gMSAvIGRldDsKCiAgICAJCXRlWyAwIF0gPSB0MTEgKiBkZXRJbnY7CiAgICAJCXRlWyAxIF0gPSAoIG4yNCAqIG4zMyAqIG40MSAtIG4yMyAqIG4zNCAqIG40MSAtIG4yNCAqIG4zMSAqIG40MyArIG4yMSAqIG4zNCAqIG40MyArIG4yMyAqIG4zMSAqIG40NCAtIG4yMSAqIG4zMyAqIG40NCApICogZGV0SW52OwogICAgCQl0ZVsgMiBdID0gKCBuMjIgKiBuMzQgKiBuNDEgLSBuMjQgKiBuMzIgKiBuNDEgKyBuMjQgKiBuMzEgKiBuNDIgLSBuMjEgKiBuMzQgKiBuNDIgLSBuMjIgKiBuMzEgKiBuNDQgKyBuMjEgKiBuMzIgKiBuNDQgKSAqIGRldEludjsKICAgIAkJdGVbIDMgXSA9ICggbjIzICogbjMyICogbjQxIC0gbjIyICogbjMzICogbjQxIC0gbjIzICogbjMxICogbjQyICsgbjIxICogbjMzICogbjQyICsgbjIyICogbjMxICogbjQzIC0gbjIxICogbjMyICogbjQzICkgKiBkZXRJbnY7CgogICAgCQl0ZVsgNCBdID0gdDEyICogZGV0SW52OwogICAgCQl0ZVsgNSBdID0gKCBuMTMgKiBuMzQgKiBuNDEgLSBuMTQgKiBuMzMgKiBuNDEgKyBuMTQgKiBuMzEgKiBuNDMgLSBuMTEgKiBuMzQgKiBuNDMgLSBuMTMgKiBuMzEgKiBuNDQgKyBuMTEgKiBuMzMgKiBuNDQgKSAqIGRldEludjsKICAgIAkJdGVbIDYgXSA9ICggbjE0ICogbjMyICogbjQxIC0gbjEyICogbjM0ICogbjQxIC0gbjE0ICogbjMxICogbjQyICsgbjExICogbjM0ICogbjQyICsgbjEyICogbjMxICogbjQ0IC0gbjExICogbjMyICogbjQ0ICkgKiBkZXRJbnY7CiAgICAJCXRlWyA3IF0gPSAoIG4xMiAqIG4zMyAqIG40MSAtIG4xMyAqIG4zMiAqIG40MSArIG4xMyAqIG4zMSAqIG40MiAtIG4xMSAqIG4zMyAqIG40MiAtIG4xMiAqIG4zMSAqIG40MyArIG4xMSAqIG4zMiAqIG40MyApICogZGV0SW52OwoKICAgIAkJdGVbIDggXSA9IHQxMyAqIGRldEludjsKICAgIAkJdGVbIDkgXSA9ICggbjE0ICogbjIzICogbjQxIC0gbjEzICogbjI0ICogbjQxIC0gbjE0ICogbjIxICogbjQzICsgbjExICogbjI0ICogbjQzICsgbjEzICogbjIxICogbjQ0IC0gbjExICogbjIzICogbjQ0ICkgKiBkZXRJbnY7CiAgICAJCXRlWyAxMCBdID0gKCBuMTIgKiBuMjQgKiBuNDEgLSBuMTQgKiBuMjIgKiBuNDEgKyBuMTQgKiBuMjEgKiBuNDIgLSBuMTEgKiBuMjQgKiBuNDIgLSBuMTIgKiBuMjEgKiBuNDQgKyBuMTEgKiBuMjIgKiBuNDQgKSAqIGRldEludjsKICAgIAkJdGVbIDExIF0gPSAoIG4xMyAqIG4yMiAqIG40MSAtIG4xMiAqIG4yMyAqIG40MSAtIG4xMyAqIG4yMSAqIG40MiArIG4xMSAqIG4yMyAqIG40MiArIG4xMiAqIG4yMSAqIG40MyAtIG4xMSAqIG4yMiAqIG40MyApICogZGV0SW52OwoKICAgIAkJdGVbIDEyIF0gPSB0MTQgKiBkZXRJbnY7CiAgICAJCXRlWyAxMyBdID0gKCBuMTMgKiBuMjQgKiBuMzEgLSBuMTQgKiBuMjMgKiBuMzEgKyBuMTQgKiBuMjEgKiBuMzMgLSBuMTEgKiBuMjQgKiBuMzMgLSBuMTMgKiBuMjEgKiBuMzQgKyBuMTEgKiBuMjMgKiBuMzQgKSAqIGRldEludjsKICAgIAkJdGVbIDE0IF0gPSAoIG4xNCAqIG4yMiAqIG4zMSAtIG4xMiAqIG4yNCAqIG4zMSAtIG4xNCAqIG4yMSAqIG4zMiArIG4xMSAqIG4yNCAqIG4zMiArIG4xMiAqIG4yMSAqIG4zNCAtIG4xMSAqIG4yMiAqIG4zNCApICogZGV0SW52OwogICAgCQl0ZVsgMTUgXSA9ICggbjEyICogbjIzICogbjMxIC0gbjEzICogbjIyICogbjMxICsgbjEzICogbjIxICogbjMyIC0gbjExICogbjIzICogbjMyIC0gbjEyICogbjIxICogbjMzICsgbjExICogbjIyICogbjMzICkgKiBkZXRJbnY7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2NhbGU6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICAJCXZhciB4ID0gdi54LCB5ID0gdi55LCB6ID0gdi56OwoKICAgIAkJdGVbIDAgXSAqPSB4OyB0ZVsgNCBdICo9IHk7IHRlWyA4IF0gKj0gejsKICAgIAkJdGVbIDEgXSAqPSB4OyB0ZVsgNSBdICo9IHk7IHRlWyA5IF0gKj0gejsKICAgIAkJdGVbIDIgXSAqPSB4OyB0ZVsgNiBdICo9IHk7IHRlWyAxMCBdICo9IHo7CiAgICAJCXRlWyAzIF0gKj0geDsgdGVbIDcgXSAqPSB5OyB0ZVsgMTEgXSAqPSB6OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldE1heFNjYWxlT25BeGlzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdGUgPSB0aGlzLmVsZW1lbnRzOwoKICAgIAkJdmFyIHNjYWxlWFNxID0gdGVbIDAgXSAqIHRlWyAwIF0gKyB0ZVsgMSBdICogdGVbIDEgXSArIHRlWyAyIF0gKiB0ZVsgMiBdOwogICAgCQl2YXIgc2NhbGVZU3EgPSB0ZVsgNCBdICogdGVbIDQgXSArIHRlWyA1IF0gKiB0ZVsgNSBdICsgdGVbIDYgXSAqIHRlWyA2IF07CiAgICAJCXZhciBzY2FsZVpTcSA9IHRlWyA4IF0gKiB0ZVsgOCBdICsgdGVbIDkgXSAqIHRlWyA5IF0gKyB0ZVsgMTAgXSAqIHRlWyAxMCBdOwoKICAgIAkJcmV0dXJuIE1hdGguc3FydCggTWF0aC5tYXgoIHNjYWxlWFNxLCBzY2FsZVlTcSwgc2NhbGVaU3EgKSApOwoKICAgIAl9LAoKICAgIAltYWtlVHJhbnNsYXRpb246IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKCiAgICAJCXRoaXMuc2V0KAoKICAgIAkJCTEsIDAsIDAsIHgsCiAgICAJCQkwLCAxLCAwLCB5LAogICAgCQkJMCwgMCwgMSwgeiwKICAgIAkJCTAsIDAsIDAsIDEKCiAgICAJCSk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZVJvdGF0aW9uWDogZnVuY3Rpb24gKCB0aGV0YSApIHsKCiAgICAJCXZhciBjID0gTWF0aC5jb3MoIHRoZXRhICksIHMgPSBNYXRoLnNpbiggdGhldGEgKTsKCiAgICAJCXRoaXMuc2V0KAoKICAgIAkJCTEsIDAsIDAsIDAsCiAgICAJCQkwLCBjLCAtIHMsIDAsCiAgICAJCQkwLCBzLCBjLCAwLAogICAgCQkJMCwgMCwgMCwgMQoKICAgIAkJKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltYWtlUm90YXRpb25ZOiBmdW5jdGlvbiAoIHRoZXRhICkgewoKICAgIAkJdmFyIGMgPSBNYXRoLmNvcyggdGhldGEgKSwgcyA9IE1hdGguc2luKCB0aGV0YSApOwoKICAgIAkJdGhpcy5zZXQoCgogICAgCQkJIGMsIDAsIHMsIDAsCiAgICAJCQkgMCwgMSwgMCwgMCwKICAgIAkJCS0gcywgMCwgYywgMCwKICAgIAkJCSAwLCAwLCAwLCAxCgogICAgCQkpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW1ha2VSb3RhdGlvblo6IGZ1bmN0aW9uICggdGhldGEgKSB7CgogICAgCQl2YXIgYyA9IE1hdGguY29zKCB0aGV0YSApLCBzID0gTWF0aC5zaW4oIHRoZXRhICk7CgogICAgCQl0aGlzLnNldCgKCiAgICAJCQljLCAtIHMsIDAsIDAsCiAgICAJCQlzLCBjLCAwLCAwLAogICAgCQkJMCwgMCwgMSwgMCwKICAgIAkJCTAsIDAsIDAsIDEKCiAgICAJCSk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZVJvdGF0aW9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHsKCiAgICAJCS8vIEJhc2VkIG9uIGh0dHA6Ly93d3cuZ2FtZWRldi5uZXQvcmVmZXJlbmNlL2FydGljbGVzL2FydGljbGUxMTk5LmFzcAoKICAgIAkJdmFyIGMgPSBNYXRoLmNvcyggYW5nbGUgKTsKICAgIAkJdmFyIHMgPSBNYXRoLnNpbiggYW5nbGUgKTsKICAgIAkJdmFyIHQgPSAxIC0gYzsKICAgIAkJdmFyIHggPSBheGlzLngsIHkgPSBheGlzLnksIHogPSBheGlzLno7CiAgICAJCXZhciB0eCA9IHQgKiB4LCB0eSA9IHQgKiB5OwoKICAgIAkJdGhpcy5zZXQoCgogICAgCQkJdHggKiB4ICsgYywgdHggKiB5IC0gcyAqIHosIHR4ICogeiArIHMgKiB5LCAwLAogICAgCQkJdHggKiB5ICsgcyAqIHosIHR5ICogeSArIGMsIHR5ICogeiAtIHMgKiB4LCAwLAogICAgCQkJdHggKiB6IC0gcyAqIHksIHR5ICogeiArIHMgKiB4LCB0ICogeiAqIHogKyBjLCAwLAogICAgCQkJMCwgMCwgMCwgMQoKICAgIAkJKTsKCiAgICAJCSByZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZVNjYWxlOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CgogICAgCQl0aGlzLnNldCgKCiAgICAJCQl4LCAwLCAwLCAwLAogICAgCQkJMCwgeSwgMCwgMCwKICAgIAkJCTAsIDAsIHosIDAsCiAgICAJCQkwLCAwLCAwLCAxCgogICAgCQkpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW1ha2VTaGVhcjogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKICAgIAkJdGhpcy5zZXQoCgogICAgCQkJMSwgeSwgeiwgMCwKICAgIAkJCXgsIDEsIHosIDAsCiAgICAJCQl4LCB5LCAxLCAwLAogICAgCQkJMCwgMCwgMCwgMQoKICAgIAkJKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb21wb3NlOiBmdW5jdGlvbiAoIHBvc2l0aW9uLCBxdWF0ZXJuaW9uLCBzY2FsZSApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQl2YXIgeCA9IHF1YXRlcm5pb24uX3gsIHkgPSBxdWF0ZXJuaW9uLl95LCB6ID0gcXVhdGVybmlvbi5feiwgdyA9IHF1YXRlcm5pb24uX3c7CiAgICAJCXZhciB4MiA9IHggKyB4LAl5MiA9IHkgKyB5LCB6MiA9IHogKyB6OwogICAgCQl2YXIgeHggPSB4ICogeDIsIHh5ID0geCAqIHkyLCB4eiA9IHggKiB6MjsKICAgIAkJdmFyIHl5ID0geSAqIHkyLCB5eiA9IHkgKiB6MiwgenogPSB6ICogejI7CiAgICAJCXZhciB3eCA9IHcgKiB4Miwgd3kgPSB3ICogeTIsIHd6ID0gdyAqIHoyOwoKICAgIAkJdmFyIHN4ID0gc2NhbGUueCwgc3kgPSBzY2FsZS55LCBzeiA9IHNjYWxlLno7CgogICAgCQl0ZVsgMCBdID0gKCAxIC0gKCB5eSArIHp6ICkgKSAqIHN4OwogICAgCQl0ZVsgMSBdID0gKCB4eSArIHd6ICkgKiBzeDsKICAgIAkJdGVbIDIgXSA9ICggeHogLSB3eSApICogc3g7CiAgICAJCXRlWyAzIF0gPSAwOwoKICAgIAkJdGVbIDQgXSA9ICggeHkgLSB3eiApICogc3k7CiAgICAJCXRlWyA1IF0gPSAoIDEgLSAoIHh4ICsgenogKSApICogc3k7CiAgICAJCXRlWyA2IF0gPSAoIHl6ICsgd3ggKSAqIHN5OwogICAgCQl0ZVsgNyBdID0gMDsKCiAgICAJCXRlWyA4IF0gPSAoIHh6ICsgd3kgKSAqIHN6OwogICAgCQl0ZVsgOSBdID0gKCB5eiAtIHd4ICkgKiBzejsKICAgIAkJdGVbIDEwIF0gPSAoIDEgLSAoIHh4ICsgeXkgKSApICogc3o7CiAgICAJCXRlWyAxMSBdID0gMDsKCiAgICAJCXRlWyAxMiBdID0gcG9zaXRpb24ueDsKICAgIAkJdGVbIDEzIF0gPSBwb3NpdGlvbi55OwogICAgCQl0ZVsgMTQgXSA9IHBvc2l0aW9uLno7CiAgICAJCXRlWyAxNSBdID0gMTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkZWNvbXBvc2U6IGZ1bmN0aW9uICggcG9zaXRpb24sIHF1YXRlcm5pb24sIHNjYWxlICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKCiAgICAJCXZhciBzeCA9IF92MS5zZXQoIHRlWyAwIF0sIHRlWyAxIF0sIHRlWyAyIF0gKS5sZW5ndGgoKTsKICAgIAkJdmFyIHN5ID0gX3YxLnNldCggdGVbIDQgXSwgdGVbIDUgXSwgdGVbIDYgXSApLmxlbmd0aCgpOwogICAgCQl2YXIgc3ogPSBfdjEuc2V0KCB0ZVsgOCBdLCB0ZVsgOSBdLCB0ZVsgMTAgXSApLmxlbmd0aCgpOwoKICAgIAkJLy8gaWYgZGV0ZXJtaW5lIGlzIG5lZ2F0aXZlLCB3ZSBuZWVkIHRvIGludmVydCBvbmUgc2NhbGUKICAgIAkJdmFyIGRldCA9IHRoaXMuZGV0ZXJtaW5hbnQoKTsKICAgIAkJaWYgKCBkZXQgPCAwICkgc3ggPSAtIHN4OwoKICAgIAkJcG9zaXRpb24ueCA9IHRlWyAxMiBdOwogICAgCQlwb3NpdGlvbi55ID0gdGVbIDEzIF07CiAgICAJCXBvc2l0aW9uLnogPSB0ZVsgMTQgXTsKCiAgICAJCS8vIHNjYWxlIHRoZSByb3RhdGlvbiBwYXJ0CiAgICAJCV9tMS5jb3B5KCB0aGlzICk7CgogICAgCQl2YXIgaW52U1ggPSAxIC8gc3g7CiAgICAJCXZhciBpbnZTWSA9IDEgLyBzeTsKICAgIAkJdmFyIGludlNaID0gMSAvIHN6OwoKICAgIAkJX20xLmVsZW1lbnRzWyAwIF0gKj0gaW52U1g7CiAgICAJCV9tMS5lbGVtZW50c1sgMSBdICo9IGludlNYOwogICAgCQlfbTEuZWxlbWVudHNbIDIgXSAqPSBpbnZTWDsKCiAgICAJCV9tMS5lbGVtZW50c1sgNCBdICo9IGludlNZOwogICAgCQlfbTEuZWxlbWVudHNbIDUgXSAqPSBpbnZTWTsKICAgIAkJX20xLmVsZW1lbnRzWyA2IF0gKj0gaW52U1k7CgogICAgCQlfbTEuZWxlbWVudHNbIDggXSAqPSBpbnZTWjsKICAgIAkJX20xLmVsZW1lbnRzWyA5IF0gKj0gaW52U1o7CiAgICAJCV9tMS5lbGVtZW50c1sgMTAgXSAqPSBpbnZTWjsKCiAgICAJCXF1YXRlcm5pb24uc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEgKTsKCiAgICAJCXNjYWxlLnggPSBzeDsKICAgIAkJc2NhbGUueSA9IHN5OwogICAgCQlzY2FsZS56ID0gc3o7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZVBlcnNwZWN0aXZlOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgewoKICAgIAkJaWYgKCBmYXIgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZVBlcnNwZWN0aXZlKCkgaGFzIGJlZW4gcmVkZWZpbmVkIGFuZCBoYXMgYSBuZXcgc2lnbmF0dXJlLiBQbGVhc2UgY2hlY2sgdGhlIGRvY3MuJyApOwoKICAgIAkJfQoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKICAgIAkJdmFyIHggPSAyICogbmVhciAvICggcmlnaHQgLSBsZWZ0ICk7CiAgICAJCXZhciB5ID0gMiAqIG5lYXIgLyAoIHRvcCAtIGJvdHRvbSApOwoKICAgIAkJdmFyIGEgPSAoIHJpZ2h0ICsgbGVmdCApIC8gKCByaWdodCAtIGxlZnQgKTsKICAgIAkJdmFyIGIgPSAoIHRvcCArIGJvdHRvbSApIC8gKCB0b3AgLSBib3R0b20gKTsKICAgIAkJdmFyIGMgPSAtICggZmFyICsgbmVhciApIC8gKCBmYXIgLSBuZWFyICk7CiAgICAJCXZhciBkID0gLSAyICogZmFyICogbmVhciAvICggZmFyIC0gbmVhciApOwoKICAgIAkJdGVbIDAgXSA9IHg7CXRlWyA0IF0gPSAwOwl0ZVsgOCBdID0gYTsJdGVbIDEyIF0gPSAwOwogICAgCQl0ZVsgMSBdID0gMDsJdGVbIDUgXSA9IHk7CXRlWyA5IF0gPSBiOwl0ZVsgMTMgXSA9IDA7CiAgICAJCXRlWyAyIF0gPSAwOwl0ZVsgNiBdID0gMDsJdGVbIDEwIF0gPSBjOwl0ZVsgMTQgXSA9IGQ7CiAgICAJCXRlWyAzIF0gPSAwOwl0ZVsgNyBdID0gMDsJdGVbIDExIF0gPSAtIDE7CXRlWyAxNSBdID0gMDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltYWtlT3J0aG9ncmFwaGljOiBmdW5jdGlvbiAoIGxlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbSwgbmVhciwgZmFyICkgewoKICAgIAkJdmFyIHRlID0gdGhpcy5lbGVtZW50czsKICAgIAkJdmFyIHcgPSAxLjAgLyAoIHJpZ2h0IC0gbGVmdCApOwogICAgCQl2YXIgaCA9IDEuMCAvICggdG9wIC0gYm90dG9tICk7CiAgICAJCXZhciBwID0gMS4wIC8gKCBmYXIgLSBuZWFyICk7CgogICAgCQl2YXIgeCA9ICggcmlnaHQgKyBsZWZ0ICkgKiB3OwogICAgCQl2YXIgeSA9ICggdG9wICsgYm90dG9tICkgKiBoOwogICAgCQl2YXIgeiA9ICggZmFyICsgbmVhciApICogcDsKCiAgICAJCXRlWyAwIF0gPSAyICogdzsJdGVbIDQgXSA9IDA7CXRlWyA4IF0gPSAwOwl0ZVsgMTIgXSA9IC0geDsKICAgIAkJdGVbIDEgXSA9IDA7CXRlWyA1IF0gPSAyICogaDsJdGVbIDkgXSA9IDA7CXRlWyAxMyBdID0gLSB5OwogICAgCQl0ZVsgMiBdID0gMDsJdGVbIDYgXSA9IDA7CXRlWyAxMCBdID0gLSAyICogcDsJdGVbIDE0IF0gPSAtIHo7CiAgICAJCXRlWyAzIF0gPSAwOwl0ZVsgNyBdID0gMDsJdGVbIDExIF0gPSAwOwl0ZVsgMTUgXSA9IDE7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CiAgICAJCXZhciBtZSA9IG1hdHJpeC5lbGVtZW50czsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDE2OyBpICsrICkgewoKICAgIAkJCWlmICggdGVbIGkgXSAhPT0gbWVbIGkgXSApIHJldHVybiBmYWxzZTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0cnVlOwoKICAgIAl9LAoKICAgIAlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCiAgICAJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgMTY7IGkgKysgKSB7CgogICAgCQkJdGhpcy5lbGVtZW50c1sgaSBdID0gYXJyYXlbIGkgKyBvZmZzZXQgXTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCXZhciB0ZSA9IHRoaXMuZWxlbWVudHM7CgogICAgCQlhcnJheVsgb2Zmc2V0IF0gPSB0ZVsgMCBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMSBdID0gdGVbIDEgXTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDIgXSA9IHRlWyAyIF07CiAgICAJCWFycmF5WyBvZmZzZXQgKyAzIF0gPSB0ZVsgMyBdOwoKICAgIAkJYXJyYXlbIG9mZnNldCArIDQgXSA9IHRlWyA0IF07CiAgICAJCWFycmF5WyBvZmZzZXQgKyA1IF0gPSB0ZVsgNSBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgNiBdID0gdGVbIDYgXTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDcgXSA9IHRlWyA3IF07CgogICAgCQlhcnJheVsgb2Zmc2V0ICsgOCBdID0gdGVbIDggXTsKICAgIAkJYXJyYXlbIG9mZnNldCArIDkgXSA9IHRlWyA5IF07CiAgICAJCWFycmF5WyBvZmZzZXQgKyAxMCBdID0gdGVbIDEwIF07CiAgICAJCWFycmF5WyBvZmZzZXQgKyAxMSBdID0gdGVbIDExIF07CgogICAgCQlhcnJheVsgb2Zmc2V0ICsgMTIgXSA9IHRlWyAxMiBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMTMgXSA9IHRlWyAxMyBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMTQgXSA9IHRlWyAxNCBdOwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMTUgXSA9IHRlWyAxNSBdOwoKICAgIAkJcmV0dXJuIGFycmF5OwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwogICAgICovCgogICAgdmFyIF9tYXRyaXggPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF9xdWF0ZXJuaW9uJDEgPSBuZXcgUXVhdGVybmlvbigpOwoKICAgIGZ1bmN0aW9uIEV1bGVyKCB4LCB5LCB6LCBvcmRlciApIHsKCiAgICAJdGhpcy5feCA9IHggfHwgMDsKICAgIAl0aGlzLl95ID0geSB8fCAwOwogICAgCXRoaXMuX3ogPSB6IHx8IDA7CiAgICAJdGhpcy5fb3JkZXIgPSBvcmRlciB8fCBFdWxlci5EZWZhdWx0T3JkZXI7CgogICAgfQoKICAgIEV1bGVyLlJvdGF0aW9uT3JkZXJzID0gWyAnWFlaJywgJ1laWCcsICdaWFknLCAnWFpZJywgJ1lYWicsICdaWVgnIF07CgogICAgRXVsZXIuRGVmYXVsdE9yZGVyID0gJ1hZWic7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIEV1bGVyLnByb3RvdHlwZSwgewoKICAgIAl4OiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy5feDsKCiAgICAJCX0sCgogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJdGhpcy5feCA9IHZhbHVlOwogICAgCQkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl5OiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy5feTsKCiAgICAJCX0sCgogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJdGhpcy5feSA9IHZhbHVlOwogICAgCQkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl6OiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy5fejsKCiAgICAJCX0sCgogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJdGhpcy5feiA9IHZhbHVlOwogICAgCQkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAlvcmRlcjogewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIHRoaXMuX29yZGVyOwoKICAgIAkJfSwKCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQl0aGlzLl9vcmRlciA9IHZhbHVlOwogICAgCQkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJfQoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIEV1bGVyLnByb3RvdHlwZSwgewoKICAgIAlpc0V1bGVyOiB0cnVlLAoKICAgIAlzZXQ6IGZ1bmN0aW9uICggeCwgeSwgeiwgb3JkZXIgKSB7CgogICAgCQl0aGlzLl94ID0geDsKICAgIAkJdGhpcy5feSA9IHk7CiAgICAJCXRoaXMuX3ogPSB6OwogICAgCQl0aGlzLl9vcmRlciA9IG9yZGVyIHx8IHRoaXMuX29yZGVyOwoKICAgIAkJdGhpcy5fb25DaGFuZ2VDYWxsYmFjaygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3osIHRoaXMuX29yZGVyICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggZXVsZXIgKSB7CgogICAgCQl0aGlzLl94ID0gZXVsZXIuX3g7CiAgICAJCXRoaXMuX3kgPSBldWxlci5feTsKICAgIAkJdGhpcy5feiA9IGV1bGVyLl96OwogICAgCQl0aGlzLl9vcmRlciA9IGV1bGVyLl9vcmRlcjsKCiAgICAJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICggbSwgb3JkZXIsIHVwZGF0ZSApIHsKCiAgICAJCXZhciBjbGFtcCA9IF9NYXRoLmNsYW1wOwoKICAgIAkJLy8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZCkKCiAgICAJCXZhciB0ZSA9IG0uZWxlbWVudHM7CiAgICAJCXZhciBtMTEgPSB0ZVsgMCBdLCBtMTIgPSB0ZVsgNCBdLCBtMTMgPSB0ZVsgOCBdOwogICAgCQl2YXIgbTIxID0gdGVbIDEgXSwgbTIyID0gdGVbIDUgXSwgbTIzID0gdGVbIDkgXTsKICAgIAkJdmFyIG0zMSA9IHRlWyAyIF0sIG0zMiA9IHRlWyA2IF0sIG0zMyA9IHRlWyAxMCBdOwoKICAgIAkJb3JkZXIgPSBvcmRlciB8fCB0aGlzLl9vcmRlcjsKCiAgICAJCWlmICggb3JkZXIgPT09ICdYWVonICkgewoKICAgIAkJCXRoaXMuX3kgPSBNYXRoLmFzaW4oIGNsYW1wKCBtMTMsIC0gMSwgMSApICk7CgogICAgCQkJaWYgKCBNYXRoLmFicyggbTEzICkgPCAwLjk5OTk5OTkgKSB7CgogICAgCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7CiAgICAJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMTEgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQl0aGlzLl94ID0gTWF0aC5hdGFuMiggbTMyLCBtMjIgKTsKICAgIAkJCQl0aGlzLl96ID0gMDsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1lYWicgKSB7CgogICAgCQkJdGhpcy5feCA9IE1hdGguYXNpbiggLSBjbGFtcCggbTIzLCAtIDEsIDEgKSApOwoKICAgIAkJCWlmICggTWF0aC5hYnMoIG0yMyApIDwgMC45OTk5OTk5ICkgewoKICAgIAkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggbTEzLCBtMzMgKTsKICAgIAkJCQl0aGlzLl96ID0gTWF0aC5hdGFuMiggbTIxLCBtMjIgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApOwogICAgCQkJCXRoaXMuX3ogPSAwOwoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWlhZJyApIHsKCiAgICAJCQl0aGlzLl94ID0gTWF0aC5hc2luKCBjbGFtcCggbTMyLCAtIDEsIDEgKSApOwoKICAgIAkJCWlmICggTWF0aC5hYnMoIG0zMiApIDwgMC45OTk5OTk5ICkgewoKICAgIAkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0zMyApOwogICAgCQkJCXRoaXMuX3ogPSBNYXRoLmF0YW4yKCAtIG0xMiwgbTIyICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdGhpcy5feSA9IDA7CiAgICAJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIGlmICggb3JkZXIgPT09ICdaWVgnICkgewoKICAgIAkJCXRoaXMuX3kgPSBNYXRoLmFzaW4oIC0gY2xhbXAoIG0zMSwgLSAxLCAxICkgKTsKCiAgICAJCQlpZiAoIE1hdGguYWJzKCBtMzEgKSA8IDAuOTk5OTk5OSApIHsKCiAgICAJCQkJdGhpcy5feCA9IE1hdGguYXRhbjIoIG0zMiwgbTMzICk7CiAgICAJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIG0yMSwgbTExICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdGhpcy5feCA9IDA7CiAgICAJCQkJdGhpcy5feiA9IE1hdGguYXRhbjIoIC0gbTEyLCBtMjIgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgaWYgKCBvcmRlciA9PT0gJ1laWCcgKSB7CgogICAgCQkJdGhpcy5feiA9IE1hdGguYXNpbiggY2xhbXAoIG0yMSwgLSAxLCAxICkgKTsKCiAgICAJCQlpZiAoIE1hdGguYWJzKCBtMjEgKSA8IDAuOTk5OTk5OSApIHsKCiAgICAJCQkJdGhpcy5feCA9IE1hdGguYXRhbjIoIC0gbTIzLCBtMjIgKTsKICAgIAkJCQl0aGlzLl95ID0gTWF0aC5hdGFuMiggLSBtMzEsIG0xMSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXRoaXMuX3ggPSAwOwogICAgCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0zMyApOwoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSBpZiAoIG9yZGVyID09PSAnWFpZJyApIHsKCiAgICAJCQl0aGlzLl96ID0gTWF0aC5hc2luKCAtIGNsYW1wKCBtMTIsIC0gMSwgMSApICk7CgogICAgCQkJaWYgKCBNYXRoLmFicyggbTEyICkgPCAwLjk5OTk5OTkgKSB7CgogICAgCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCBtMzIsIG0yMiApOwogICAgCQkJCXRoaXMuX3kgPSBNYXRoLmF0YW4yKCBtMTMsIG0xMSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXRoaXMuX3ggPSBNYXRoLmF0YW4yKCAtIG0yMywgbTMzICk7CiAgICAJCQkJdGhpcy5feSA9IDA7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5FdWxlcjogLnNldEZyb21Sb3RhdGlvbk1hdHJpeCgpIGdpdmVuIHVuc3VwcG9ydGVkIG9yZGVyOiAnICsgb3JkZXIgKTsKCiAgICAJCX0KCiAgICAJCXRoaXMuX29yZGVyID0gb3JkZXI7CgogICAgCQlpZiAoIHVwZGF0ZSAhPT0gZmFsc2UgKSB0aGlzLl9vbkNoYW5nZUNhbGxiYWNrKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbVF1YXRlcm5pb246IGZ1bmN0aW9uICggcSwgb3JkZXIsIHVwZGF0ZSApIHsKCiAgICAJCV9tYXRyaXgubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTsKCiAgICAJCXJldHVybiB0aGlzLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX21hdHJpeCwgb3JkZXIsIHVwZGF0ZSApOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tVmVjdG9yMzogZnVuY3Rpb24gKCB2LCBvcmRlciApIHsKCiAgICAJCXJldHVybiB0aGlzLnNldCggdi54LCB2LnksIHYueiwgb3JkZXIgfHwgdGhpcy5fb3JkZXIgKTsKCiAgICAJfSwKCiAgICAJcmVvcmRlcjogZnVuY3Rpb24gKCBuZXdPcmRlciApIHsKCiAgICAJCS8vIFdBUk5JTkc6IHRoaXMgZGlzY2FyZHMgcmV2b2x1dGlvbiBpbmZvcm1hdGlvbiAtYmhvdXN0b24KCiAgICAJCV9xdWF0ZXJuaW9uJDEuc2V0RnJvbUV1bGVyKCB0aGlzICk7CgogICAgCQlyZXR1cm4gdGhpcy5zZXRGcm9tUXVhdGVybmlvbiggX3F1YXRlcm5pb24kMSwgbmV3T3JkZXIgKTsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIGV1bGVyICkgewoKICAgIAkJcmV0dXJuICggZXVsZXIuX3ggPT09IHRoaXMuX3ggKSAmJiAoIGV1bGVyLl95ID09PSB0aGlzLl95ICkgJiYgKCBldWxlci5feiA9PT0gdGhpcy5feiApICYmICggZXVsZXIuX29yZGVyID09PSB0aGlzLl9vcmRlciApOwoKICAgIAl9LAoKICAgIAlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CgogICAgCQl0aGlzLl94ID0gYXJyYXlbIDAgXTsKICAgIAkJdGhpcy5feSA9IGFycmF5WyAxIF07CiAgICAJCXRoaXMuX3ogPSBhcnJheVsgMiBdOwogICAgCQlpZiAoIGFycmF5WyAzIF0gIT09IHVuZGVmaW5lZCApIHRoaXMuX29yZGVyID0gYXJyYXlbIDMgXTsKCiAgICAJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2soKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCWFycmF5WyBvZmZzZXQgXSA9IHRoaXMuX3g7CiAgICAJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLl95OwogICAgCQlhcnJheVsgb2Zmc2V0ICsgMiBdID0gdGhpcy5fejsKICAgIAkJYXJyYXlbIG9mZnNldCArIDMgXSA9IHRoaXMuX29yZGVyOwoKICAgIAkJcmV0dXJuIGFycmF5OwoKICAgIAl9LAoKICAgIAl0b1ZlY3RvcjM6IGZ1bmN0aW9uICggb3B0aW9uYWxSZXN1bHQgKSB7CgogICAgCQlpZiAoIG9wdGlvbmFsUmVzdWx0ICkgewoKICAgIAkJCXJldHVybiBvcHRpb25hbFJlc3VsdC5zZXQoIHRoaXMuX3gsIHRoaXMuX3ksIHRoaXMuX3ogKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJcmV0dXJuIG5ldyBWZWN0b3IzKCB0aGlzLl94LCB0aGlzLl95LCB0aGlzLl96ICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCV9vbkNoYW5nZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCiAgICAJCXRoaXMuX29uQ2hhbmdlQ2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlfb25DaGFuZ2VDYWxsYmFjazogZnVuY3Rpb24gKCkge30KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gTGF5ZXJzKCkgewoKICAgIAl0aGlzLm1hc2sgPSAxIHwgMDsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggTGF5ZXJzLnByb3RvdHlwZSwgewoKICAgIAlzZXQ6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKCiAgICAJCXRoaXMubWFzayA9IDEgPDwgY2hhbm5lbCB8IDA7CgogICAgCX0sCgogICAgCWVuYWJsZTogZnVuY3Rpb24gKCBjaGFubmVsICkgewoKICAgIAkJdGhpcy5tYXNrIHw9IDEgPDwgY2hhbm5lbCB8IDA7CgogICAgCX0sCgogICAgCWVuYWJsZUFsbDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5tYXNrID0gMHhmZmZmZmZmZiB8IDA7CgogICAgCX0sCgogICAgCXRvZ2dsZTogZnVuY3Rpb24gKCBjaGFubmVsICkgewoKICAgIAkJdGhpcy5tYXNrIF49IDEgPDwgY2hhbm5lbCB8IDA7CgogICAgCX0sCgogICAgCWRpc2FibGU6IGZ1bmN0aW9uICggY2hhbm5lbCApIHsKCiAgICAJCXRoaXMubWFzayAmPSB+ICggMSA8PCBjaGFubmVsIHwgMCApOwoKICAgIAl9LAoKICAgIAlkaXNhYmxlQWxsOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLm1hc2sgPSAwOwoKICAgIAl9LAoKICAgIAl0ZXN0OiBmdW5jdGlvbiAoIGxheWVycyApIHsKCiAgICAJCXJldHVybiAoIHRoaXMubWFzayAmIGxheWVycy5tYXNrICkgIT09IDA7CgogICAgCX0KCiAgICB9ICk7CgogICAgdmFyIF9vYmplY3QzRElkID0gMDsKCiAgICB2YXIgX3YxJDEgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9xMSA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICB2YXIgX20xJDEgPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF90YXJnZXQgPSBuZXcgVmVjdG9yMygpOwoKICAgIHZhciBfcG9zaXRpb24gPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9zY2FsZSA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3F1YXRlcm5pb24kMiA9IG5ldyBRdWF0ZXJuaW9uKCk7CgogICAgdmFyIF94QXhpcyA9IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7CiAgICB2YXIgX3lBeGlzID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTsKICAgIHZhciBfekF4aXMgPSBuZXcgVmVjdG9yMyggMCwgMCwgMSApOwoKICAgIHZhciBfYWRkZWRFdmVudCA9IHsgdHlwZTogJ2FkZGVkJyB9OwogICAgdmFyIF9yZW1vdmVkRXZlbnQgPSB7IHR5cGU6ICdyZW1vdmVkJyB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKiBAYXV0aG9yIGVsZXBoYW50YXR3b3JrIC8gd3d3LmVsZXBoYW50YXR3b3JrLmNoCiAgICAgKi8KCiAgICBmdW5jdGlvbiBPYmplY3QzRCgpIHsKCiAgICAJT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBfb2JqZWN0M0RJZCArKyB9ICk7CgogICAgCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKICAgIAl0aGlzLm5hbWUgPSAnJzsKICAgIAl0aGlzLnR5cGUgPSAnT2JqZWN0M0QnOwoKICAgIAl0aGlzLnBhcmVudCA9IG51bGw7CiAgICAJdGhpcy5jaGlsZHJlbiA9IFtdOwoKICAgIAl0aGlzLnVwID0gT2JqZWN0M0QuRGVmYXVsdFVwLmNsb25lKCk7CgogICAgCXZhciBwb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIHJvdGF0aW9uID0gbmV3IEV1bGVyKCk7CiAgICAJdmFyIHF1YXRlcm5pb24gPSBuZXcgUXVhdGVybmlvbigpOwogICAgCXZhciBzY2FsZSA9IG5ldyBWZWN0b3IzKCAxLCAxLCAxICk7CgogICAgCWZ1bmN0aW9uIG9uUm90YXRpb25DaGFuZ2UoKSB7CgogICAgCQlxdWF0ZXJuaW9uLnNldEZyb21FdWxlciggcm90YXRpb24sIGZhbHNlICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25RdWF0ZXJuaW9uQ2hhbmdlKCkgewoKICAgIAkJcm90YXRpb24uc2V0RnJvbVF1YXRlcm5pb24oIHF1YXRlcm5pb24sIHVuZGVmaW5lZCwgZmFsc2UgKTsKCiAgICAJfQoKICAgIAlyb3RhdGlvbi5fb25DaGFuZ2UoIG9uUm90YXRpb25DaGFuZ2UgKTsKICAgIAlxdWF0ZXJuaW9uLl9vbkNoYW5nZSggb25RdWF0ZXJuaW9uQ2hhbmdlICk7CgogICAgCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLCB7CiAgICAJCXBvc2l0aW9uOiB7CiAgICAJCQljb25maWd1cmFibGU6IHRydWUsCiAgICAJCQllbnVtZXJhYmxlOiB0cnVlLAogICAgCQkJdmFsdWU6IHBvc2l0aW9uCiAgICAJCX0sCiAgICAJCXJvdGF0aW9uOiB7CiAgICAJCQljb25maWd1cmFibGU6IHRydWUsCiAgICAJCQllbnVtZXJhYmxlOiB0cnVlLAogICAgCQkJdmFsdWU6IHJvdGF0aW9uCiAgICAJCX0sCiAgICAJCXF1YXRlcm5pb246IHsKICAgIAkJCWNvbmZpZ3VyYWJsZTogdHJ1ZSwKICAgIAkJCWVudW1lcmFibGU6IHRydWUsCiAgICAJCQl2YWx1ZTogcXVhdGVybmlvbgogICAgCQl9LAogICAgCQlzY2FsZTogewogICAgCQkJY29uZmlndXJhYmxlOiB0cnVlLAogICAgCQkJZW51bWVyYWJsZTogdHJ1ZSwKICAgIAkJCXZhbHVlOiBzY2FsZQogICAgCQl9LAogICAgCQltb2RlbFZpZXdNYXRyaXg6IHsKICAgIAkJCXZhbHVlOiBuZXcgTWF0cml4NCgpCiAgICAJCX0sCiAgICAJCW5vcm1hbE1hdHJpeDogewogICAgCQkJdmFsdWU6IG5ldyBNYXRyaXgzKCkKICAgIAkJfQogICAgCX0gKTsKCiAgICAJdGhpcy5tYXRyaXggPSBuZXcgTWF0cml4NCgpOwogICAgCXRoaXMubWF0cml4V29ybGQgPSBuZXcgTWF0cml4NCgpOwoKICAgIAl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBPYmplY3QzRC5EZWZhdWx0TWF0cml4QXV0b1VwZGF0ZTsKICAgIAl0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBmYWxzZTsKCiAgICAJdGhpcy5sYXllcnMgPSBuZXcgTGF5ZXJzKCk7CiAgICAJdGhpcy52aXNpYmxlID0gdHJ1ZTsKCiAgICAJdGhpcy5jYXN0U2hhZG93ID0gZmFsc2U7CiAgICAJdGhpcy5yZWNlaXZlU2hhZG93ID0gZmFsc2U7CgogICAgCXRoaXMuZnJ1c3R1bUN1bGxlZCA9IHRydWU7CiAgICAJdGhpcy5yZW5kZXJPcmRlciA9IDA7CgogICAgCXRoaXMudXNlckRhdGEgPSB7fTsKCiAgICB9CgogICAgT2JqZWN0M0QuRGVmYXVsdFVwID0gbmV3IFZlY3RvcjMoIDAsIDEsIDAgKTsKICAgIE9iamVjdDNELkRlZmF1bHRNYXRyaXhBdXRvVXBkYXRlID0gdHJ1ZTsKCiAgICBPYmplY3QzRC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IE9iamVjdDNELAoKICAgIAlpc09iamVjdDNEOiB0cnVlLAoKICAgIAlvbkJlZm9yZVJlbmRlcjogZnVuY3Rpb24gKCkge30sCiAgICAJb25BZnRlclJlbmRlcjogZnVuY3Rpb24gKCkge30sCgogICAgCWFwcGx5TWF0cml4OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCiAgICAJCWlmICggdGhpcy5tYXRyaXhBdXRvVXBkYXRlICkgdGhpcy51cGRhdGVNYXRyaXgoKTsKCiAgICAJCXRoaXMubWF0cml4LnByZW11bHRpcGx5KCBtYXRyaXggKTsKCiAgICAJCXRoaXMubWF0cml4LmRlY29tcG9zZSggdGhpcy5wb3NpdGlvbiwgdGhpcy5xdWF0ZXJuaW9uLCB0aGlzLnNjYWxlICk7CgogICAgCX0sCgogICAgCWFwcGx5UXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgewoKICAgIAkJdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBxICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0Um90YXRpb25Gcm9tQXhpc0FuZ2xlOiBmdW5jdGlvbiAoIGF4aXMsIGFuZ2xlICkgewoKICAgIAkJLy8gYXNzdW1lcyBheGlzIGlzIG5vcm1hbGl6ZWQKCiAgICAJCXRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApOwoKICAgIAl9LAoKICAgIAlzZXRSb3RhdGlvbkZyb21FdWxlcjogZnVuY3Rpb24gKCBldWxlciApIHsKCiAgICAJCXRoaXMucXVhdGVybmlvbi5zZXRGcm9tRXVsZXIoIGV1bGVyLCB0cnVlICk7CgogICAgCX0sCgogICAgCXNldFJvdGF0aW9uRnJvbU1hdHJpeDogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJLy8gYXNzdW1lcyB0aGUgdXBwZXIgM3gzIG9mIG0gaXMgYSBwdXJlIHJvdGF0aW9uIG1hdHJpeCAoaS5lLCB1bnNjYWxlZCkKCiAgICAJCXRoaXMucXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIG0gKTsKCiAgICAJfSwKCiAgICAJc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgewoKICAgIAkJLy8gYXNzdW1lcyBxIGlzIG5vcm1hbGl6ZWQKCiAgICAJCXRoaXMucXVhdGVybmlvbi5jb3B5KCBxICk7CgogICAgCX0sCgogICAgCXJvdGF0ZU9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHsKCiAgICAJCS8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiBvYmplY3Qgc3BhY2UKICAgIAkJLy8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQKCiAgICAJCV9xMS5zZXRGcm9tQXhpc0FuZ2xlKCBheGlzLCBhbmdsZSApOwoKICAgIAkJdGhpcy5xdWF0ZXJuaW9uLm11bHRpcGx5KCBfcTEgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyb3RhdGVPbldvcmxkQXhpczogZnVuY3Rpb24gKCBheGlzLCBhbmdsZSApIHsKCiAgICAJCS8vIHJvdGF0ZSBvYmplY3Qgb24gYXhpcyBpbiB3b3JsZCBzcGFjZQogICAgCQkvLyBheGlzIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAogICAgCQkvLyBtZXRob2QgYXNzdW1lcyBubyByb3RhdGVkIHBhcmVudAoKICAgIAkJX3ExLnNldEZyb21BeGlzQW5nbGUoIGF4aXMsIGFuZ2xlICk7CgogICAgCQl0aGlzLnF1YXRlcm5pb24ucHJlbXVsdGlwbHkoIF9xMSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXJvdGF0ZVg6IGZ1bmN0aW9uICggYW5nbGUgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5yb3RhdGVPbkF4aXMoIF94QXhpcywgYW5nbGUgKTsKCiAgICAJfSwKCiAgICAJcm90YXRlWTogZnVuY3Rpb24gKCBhbmdsZSApIHsKCiAgICAJCXJldHVybiB0aGlzLnJvdGF0ZU9uQXhpcyggX3lBeGlzLCBhbmdsZSApOwoKICAgIAl9LAoKICAgIAlyb3RhdGVaOiBmdW5jdGlvbiAoIGFuZ2xlICkgewoKICAgIAkJcmV0dXJuIHRoaXMucm90YXRlT25BeGlzKCBfekF4aXMsIGFuZ2xlICk7CgogICAgCX0sCgogICAgCXRyYW5zbGF0ZU9uQXhpczogZnVuY3Rpb24gKCBheGlzLCBkaXN0YW5jZSApIHsKCiAgICAJCS8vIHRyYW5zbGF0ZSBvYmplY3QgYnkgZGlzdGFuY2UgYWxvbmcgYXhpcyBpbiBvYmplY3Qgc3BhY2UKICAgIAkJLy8gYXhpcyBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQKCiAgICAJCV92MSQxLmNvcHkoIGF4aXMgKS5hcHBseVF1YXRlcm5pb24oIHRoaXMucXVhdGVybmlvbiApOwoKICAgIAkJdGhpcy5wb3NpdGlvbi5hZGQoIF92MSQxLm11bHRpcGx5U2NhbGFyKCBkaXN0YW5jZSApICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdHJhbnNsYXRlWDogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHsKCiAgICAJCXJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggX3hBeGlzLCBkaXN0YW5jZSApOwoKICAgIAl9LAoKICAgIAl0cmFuc2xhdGVZOiBmdW5jdGlvbiAoIGRpc3RhbmNlICkgewoKICAgIAkJcmV0dXJuIHRoaXMudHJhbnNsYXRlT25BeGlzKCBfeUF4aXMsIGRpc3RhbmNlICk7CgogICAgCX0sCgogICAgCXRyYW5zbGF0ZVo6IGZ1bmN0aW9uICggZGlzdGFuY2UgKSB7CgogICAgCQlyZXR1cm4gdGhpcy50cmFuc2xhdGVPbkF4aXMoIF96QXhpcywgZGlzdGFuY2UgKTsKCiAgICAJfSwKCiAgICAJbG9jYWxUb1dvcmxkOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKCiAgICAJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7CgogICAgCX0sCgogICAgCXdvcmxkVG9Mb2NhbDogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CgogICAgCQlyZXR1cm4gdmVjdG9yLmFwcGx5TWF0cml4NCggX20xJDEuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApICk7CgogICAgCX0sCgogICAgCWxvb2tBdDogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKICAgIAkJLy8gVGhpcyBtZXRob2QgZG9lcyBub3Qgc3VwcG9ydCBvYmplY3RzIGhhdmluZyBub24tdW5pZm9ybWx5LXNjYWxlZCBwYXJlbnQocykKCiAgICAJCWlmICggeC5pc1ZlY3RvcjMgKSB7CgogICAgCQkJX3RhcmdldC5jb3B5KCB4ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCV90YXJnZXQuc2V0KCB4LCB5LCB6ICk7CgogICAgCQl9CgogICAgCQl2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CgogICAgCQl0aGlzLnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApOwoKICAgIAkJX3Bvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApOwoKICAgIAkJaWYgKCB0aGlzLmlzQ2FtZXJhIHx8IHRoaXMuaXNMaWdodCApIHsKCiAgICAJCQlfbTEkMS5sb29rQXQoIF9wb3NpdGlvbiwgX3RhcmdldCwgdGhpcy51cCApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlfbTEkMS5sb29rQXQoIF90YXJnZXQsIF9wb3NpdGlvbiwgdGhpcy51cCApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5xdWF0ZXJuaW9uLnNldEZyb21Sb3RhdGlvbk1hdHJpeCggX20xJDEgKTsKCiAgICAJCWlmICggcGFyZW50ICkgewoKICAgIAkJCV9tMSQxLmV4dHJhY3RSb3RhdGlvbiggcGFyZW50Lm1hdHJpeFdvcmxkICk7CiAgICAJCQlfcTEuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCBfbTEkMSApOwogICAgCQkJdGhpcy5xdWF0ZXJuaW9uLnByZW11bHRpcGx5KCBfcTEuaW52ZXJzZSgpICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCWFkZDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCQlpZiAoIGFyZ3VtZW50cy5sZW5ndGggPiAxICkgewoKICAgIAkJCWZvciAoIHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCXRoaXMuYWRkKCBhcmd1bWVudHNbIGkgXSApOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gdGhpczsKCiAgICAJCX0KCiAgICAJCWlmICggb2JqZWN0ID09PSB0aGlzICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBjYW4ndCBiZSBhZGRlZCBhcyBhIGNoaWxkIG9mIGl0c2VsZi4iLCBvYmplY3QgKTsKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQoKICAgIAkJaWYgKCAoIG9iamVjdCAmJiBvYmplY3QuaXNPYmplY3QzRCApICkgewoKICAgIAkJCWlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHsKCiAgICAJCQkJb2JqZWN0LnBhcmVudC5yZW1vdmUoIG9iamVjdCApOwoKICAgIAkJCX0KCiAgICAJCQlvYmplY3QucGFyZW50ID0gdGhpczsKICAgIAkJCXRoaXMuY2hpbGRyZW4ucHVzaCggb2JqZWN0ICk7CgogICAgCQkJb2JqZWN0LmRpc3BhdGNoRXZlbnQoIF9hZGRlZEV2ZW50ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICJUSFJFRS5PYmplY3QzRC5hZGQ6IG9iamVjdCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuT2JqZWN0M0QuIiwgb2JqZWN0ICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJcmVtb3ZlOiBmdW5jdGlvbiAoIG9iamVjdCApIHsKCiAgICAJCWlmICggYXJndW1lbnRzLmxlbmd0aCA+IDEgKSB7CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJdGhpcy5yZW1vdmUoIGFyZ3VtZW50c1sgaSBdICk7CgogICAgCQkJfQoKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQoKICAgIAkJdmFyIGluZGV4ID0gdGhpcy5jaGlsZHJlbi5pbmRleE9mKCBvYmplY3QgKTsKCiAgICAJCWlmICggaW5kZXggIT09IC0gMSApIHsKCiAgICAJCQlvYmplY3QucGFyZW50ID0gbnVsbDsKICAgIAkJCXRoaXMuY2hpbGRyZW4uc3BsaWNlKCBpbmRleCwgMSApOwoKICAgIAkJCW9iamVjdC5kaXNwYXRjaEV2ZW50KCBfcmVtb3ZlZEV2ZW50ICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYXR0YWNoOiBmdW5jdGlvbiAoIG9iamVjdCApIHsKCiAgICAJCS8vIGFkZHMgb2JqZWN0IGFzIGEgY2hpbGQgb2YgdGhpcywgd2hpbGUgbWFpbnRhaW5pbmcgdGhlIG9iamVjdCdzIHdvcmxkIHRyYW5zZm9ybQoKICAgIAkJdGhpcy51cGRhdGVXb3JsZE1hdHJpeCggdHJ1ZSwgZmFsc2UgKTsKCiAgICAJCV9tMSQxLmdldEludmVyc2UoIHRoaXMubWF0cml4V29ybGQgKTsKCiAgICAJCWlmICggb2JqZWN0LnBhcmVudCAhPT0gbnVsbCApIHsKCiAgICAJCQlvYmplY3QucGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApOwoKICAgIAkJCV9tMSQxLm11bHRpcGx5KCBvYmplY3QucGFyZW50Lm1hdHJpeFdvcmxkICk7CgogICAgCQl9CgogICAgCQlvYmplY3QuYXBwbHlNYXRyaXgoIF9tMSQxICk7CgogICAgCQlvYmplY3QudXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCBmYWxzZSApOwoKICAgIAkJdGhpcy5hZGQoIG9iamVjdCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldE9iamVjdEJ5SWQ6IGZ1bmN0aW9uICggaWQgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5nZXRPYmplY3RCeVByb3BlcnR5KCAnaWQnLCBpZCApOwoKICAgIAl9LAoKICAgIAlnZXRPYmplY3RCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHsKCiAgICAJCXJldHVybiB0aGlzLmdldE9iamVjdEJ5UHJvcGVydHkoICduYW1lJywgbmFtZSApOwoKICAgIAl9LAoKICAgIAlnZXRPYmplY3RCeVByb3BlcnR5OiBmdW5jdGlvbiAoIG5hbWUsIHZhbHVlICkgewoKICAgIAkJaWYgKCB0aGlzWyBuYW1lIF0gPT09IHZhbHVlICkgcmV0dXJuIHRoaXM7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGNoaWxkID0gdGhpcy5jaGlsZHJlblsgaSBdOwogICAgCQkJdmFyIG9iamVjdCA9IGNoaWxkLmdldE9iamVjdEJ5UHJvcGVydHkoIG5hbWUsIHZhbHVlICk7CgogICAgCQkJaWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJcmV0dXJuIG9iamVjdDsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gdW5kZWZpbmVkOwoKICAgIAl9LAoKICAgIAlnZXRXb3JsZFBvc2l0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFBvc2l0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQl0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CgogICAgCQlyZXR1cm4gdGFyZ2V0LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApOwoKICAgIAl9LAoKICAgIAlnZXRXb3JsZFF1YXRlcm5pb246IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkUXVhdGVybmlvbigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgUXVhdGVybmlvbigpOwoKICAgIAkJfQoKICAgIAkJdGhpcy51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOwoKICAgIAkJdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiwgdGFyZ2V0LCBfc2NhbGUgKTsKCiAgICAJCXJldHVybiB0YXJnZXQ7CgogICAgCX0sCgogICAgCWdldFdvcmxkU2NhbGU6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkU2NhbGUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCiAgICAJCXRoaXMubWF0cml4V29ybGQuZGVjb21wb3NlKCBfcG9zaXRpb24sIF9xdWF0ZXJuaW9uJDIsIHRhcmdldCApOwoKICAgIAkJcmV0dXJuIHRhcmdldDsKCiAgICAJfSwKCiAgICAJZ2V0V29ybGREaXJlY3Rpb246IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLmdldFdvcmxkRGlyZWN0aW9uKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQl0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CgogICAgCQl2YXIgZSA9IHRoaXMubWF0cml4V29ybGQuZWxlbWVudHM7CgogICAgCQlyZXR1cm4gdGFyZ2V0LnNldCggZVsgOCBdLCBlWyA5IF0sIGVbIDEwIF0gKS5ub3JtYWxpemUoKTsKCiAgICAJfSwKCiAgICAJcmF5Y2FzdDogZnVuY3Rpb24gKCkge30sCgogICAgCXRyYXZlcnNlOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgewoKICAgIAkJY2FsbGJhY2soIHRoaXMgKTsKCiAgICAJCXZhciBjaGlsZHJlbiA9IHRoaXMuY2hpbGRyZW47CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCWNoaWxkcmVuWyBpIF0udHJhdmVyc2UoIGNhbGxiYWNrICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCXRyYXZlcnNlVmlzaWJsZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCiAgICAJCWlmICggdGhpcy52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCWNhbGxiYWNrKCB0aGlzICk7CgogICAgCQl2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQljaGlsZHJlblsgaSBdLnRyYXZlcnNlVmlzaWJsZSggY2FsbGJhY2sgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJdHJhdmVyc2VBbmNlc3RvcnM6IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CgogICAgCQl2YXIgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CgogICAgCQlpZiAoIHBhcmVudCAhPT0gbnVsbCApIHsKCiAgICAJCQljYWxsYmFjayggcGFyZW50ICk7CgogICAgCQkJcGFyZW50LnRyYXZlcnNlQW5jZXN0b3JzKCBjYWxsYmFjayApOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl1cGRhdGVNYXRyaXg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMubWF0cml4LmNvbXBvc2UoIHRoaXMucG9zaXRpb24sIHRoaXMucXVhdGVybmlvbiwgdGhpcy5zY2FsZSApOwoKICAgIAkJdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJfSwKCiAgICAJdXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CgogICAgCQlpZiAoIHRoaXMubWF0cml4QXV0b1VwZGF0ZSApIHRoaXMudXBkYXRlTWF0cml4KCk7CgogICAgCQlpZiAoIHRoaXMubWF0cml4V29ybGROZWVkc1VwZGF0ZSB8fCBmb3JjZSApIHsKCiAgICAJCQlpZiAoIHRoaXMucGFyZW50ID09PSBudWxsICkgewoKICAgIAkJCQl0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdGhpcy5tYXRyaXhXb3JsZC5tdWx0aXBseU1hdHJpY2VzKCB0aGlzLnBhcmVudC5tYXRyaXhXb3JsZCwgdGhpcy5tYXRyaXggKTsKCiAgICAJCQl9CgogICAgCQkJdGhpcy5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gZmFsc2U7CgogICAgCQkJZm9yY2UgPSB0cnVlOwoKICAgIAkJfQoKICAgIAkJLy8gdXBkYXRlIGNoaWxkcmVuCgogICAgCQl2YXIgY2hpbGRyZW4gPSB0aGlzLmNoaWxkcmVuOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQljaGlsZHJlblsgaSBdLnVwZGF0ZU1hdHJpeFdvcmxkKCBmb3JjZSApOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl1cGRhdGVXb3JsZE1hdHJpeDogZnVuY3Rpb24gKCB1cGRhdGVQYXJlbnRzLCB1cGRhdGVDaGlsZHJlbiApIHsKCiAgICAJCXZhciBwYXJlbnQgPSB0aGlzLnBhcmVudDsKCiAgICAJCWlmICggdXBkYXRlUGFyZW50cyA9PT0gdHJ1ZSAmJiBwYXJlbnQgIT09IG51bGwgKSB7CgogICAgCQkJcGFyZW50LnVwZGF0ZVdvcmxkTWF0cml4KCB0cnVlLCBmYWxzZSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgKSB0aGlzLnVwZGF0ZU1hdHJpeCgpOwoKICAgIAkJaWYgKCB0aGlzLnBhcmVudCA9PT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLm1hdHJpeFdvcmxkLmNvcHkoIHRoaXMubWF0cml4ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXRoaXMubWF0cml4V29ybGQubXVsdGlwbHlNYXRyaWNlcyggdGhpcy5wYXJlbnQubWF0cml4V29ybGQsIHRoaXMubWF0cml4ICk7CgogICAgCQl9CgogICAgCQkvLyB1cGRhdGUgY2hpbGRyZW4KCiAgICAJCWlmICggdXBkYXRlQ2hpbGRyZW4gPT09IHRydWUgKSB7CgogICAgCQkJdmFyIGNoaWxkcmVuID0gdGhpcy5jaGlsZHJlbjsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQljaGlsZHJlblsgaSBdLnVwZGF0ZVdvcmxkTWF0cml4KCBmYWxzZSwgdHJ1ZSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgogICAgCQkvLyBtZXRhIGlzIGEgc3RyaW5nIHdoZW4gY2FsbGVkIGZyb20gSlNPTi5zdHJpbmdpZnkKICAgIAkJdmFyIGlzUm9vdE9iamVjdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApOwoKICAgIAkJdmFyIG91dHB1dCA9IHt9OwoKICAgIAkJLy8gbWV0YSBpcyBhIGhhc2ggdXNlZCB0byBjb2xsZWN0IGdlb21ldHJpZXMsIG1hdGVyaWFscy4KICAgIAkJLy8gbm90IHByb3ZpZGluZyBpdCBpbXBsaWVzIHRoYXQgdGhpcyBpcyB0aGUgcm9vdCBvYmplY3QKICAgIAkJLy8gYmVpbmcgc2VyaWFsaXplZC4KICAgIAkJaWYgKCBpc1Jvb3RPYmplY3QgKSB7CgogICAgCQkJLy8gaW5pdGlhbGl6ZSBtZXRhIG9iagogICAgCQkJbWV0YSA9IHsKICAgIAkJCQlnZW9tZXRyaWVzOiB7fSwKICAgIAkJCQltYXRlcmlhbHM6IHt9LAogICAgCQkJCXRleHR1cmVzOiB7fSwKICAgIAkJCQlpbWFnZXM6IHt9LAogICAgCQkJCXNoYXBlczoge30KICAgIAkJCX07CgogICAgCQkJb3V0cHV0Lm1ldGFkYXRhID0gewogICAgCQkJCXZlcnNpb246IDQuNSwKICAgIAkJCQl0eXBlOiAnT2JqZWN0JywKICAgIAkJCQlnZW5lcmF0b3I6ICdPYmplY3QzRC50b0pTT04nCiAgICAJCQl9OwoKICAgIAkJfQoKICAgIAkJLy8gc3RhbmRhcmQgT2JqZWN0M0Qgc2VyaWFsaXphdGlvbgoKICAgIAkJdmFyIG9iamVjdCA9IHt9OwoKICAgIAkJb2JqZWN0LnV1aWQgPSB0aGlzLnV1aWQ7CiAgICAJCW9iamVjdC50eXBlID0gdGhpcy50eXBlOwoKICAgIAkJaWYgKCB0aGlzLm5hbWUgIT09ICcnICkgb2JqZWN0Lm5hbWUgPSB0aGlzLm5hbWU7CiAgICAJCWlmICggdGhpcy5jYXN0U2hhZG93ID09PSB0cnVlICkgb2JqZWN0LmNhc3RTaGFkb3cgPSB0cnVlOwogICAgCQlpZiAoIHRoaXMucmVjZWl2ZVNoYWRvdyA9PT0gdHJ1ZSApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsKICAgIAkJaWYgKCB0aGlzLnZpc2libGUgPT09IGZhbHNlICkgb2JqZWN0LnZpc2libGUgPSBmYWxzZTsKICAgIAkJaWYgKCB0aGlzLmZydXN0dW1DdWxsZWQgPT09IGZhbHNlICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBmYWxzZTsKICAgIAkJaWYgKCB0aGlzLnJlbmRlck9yZGVyICE9PSAwICkgb2JqZWN0LnJlbmRlck9yZGVyID0gdGhpcy5yZW5kZXJPcmRlcjsKICAgIAkJaWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgb2JqZWN0LnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTsKCiAgICAJCW9iamVjdC5sYXllcnMgPSB0aGlzLmxheWVycy5tYXNrOwogICAgCQlvYmplY3QubWF0cml4ID0gdGhpcy5tYXRyaXgudG9BcnJheSgpOwoKICAgIAkJaWYgKCB0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPT09IGZhbHNlICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCiAgICAJCS8vIG9iamVjdCBzcGVjaWZpYyBwcm9wZXJ0aWVzCgogICAgCQlpZiAoIHRoaXMuaXNNZXNoICYmIHRoaXMuZHJhd01vZGUgIT09IFRyaWFuZ2xlc0RyYXdNb2RlICkgb2JqZWN0LmRyYXdNb2RlID0gdGhpcy5kcmF3TW9kZTsKCiAgICAJCS8vCgogICAgCQlmdW5jdGlvbiBzZXJpYWxpemUoIGxpYnJhcnksIGVsZW1lbnQgKSB7CgogICAgCQkJaWYgKCBsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlsaWJyYXJ5WyBlbGVtZW50LnV1aWQgXSA9IGVsZW1lbnQudG9KU09OKCBtZXRhICk7CgogICAgCQkJfQoKICAgIAkJCXJldHVybiBlbGVtZW50LnV1aWQ7CgogICAgCQl9CgogICAgCQlpZiAoIHRoaXMuaXNNZXNoIHx8IHRoaXMuaXNMaW5lIHx8IHRoaXMuaXNQb2ludHMgKSB7CgogICAgCQkJb2JqZWN0Lmdlb21ldHJ5ID0gc2VyaWFsaXplKCBtZXRhLmdlb21ldHJpZXMsIHRoaXMuZ2VvbWV0cnkgKTsKCiAgICAJCQl2YXIgcGFyYW1ldGVycyA9IHRoaXMuZ2VvbWV0cnkucGFyYW1ldGVyczsKCiAgICAJCQlpZiAoIHBhcmFtZXRlcnMgIT09IHVuZGVmaW5lZCAmJiBwYXJhbWV0ZXJzLnNoYXBlcyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQl2YXIgc2hhcGVzID0gcGFyYW1ldGVycy5zaGFwZXM7CgogICAgCQkJCWlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7CgogICAgCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJCQl2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTsKCiAgICAJCQkJCQlzZXJpYWxpemUoIG1ldGEuc2hhcGVzLCBzaGFwZSApOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJc2VyaWFsaXplKCBtZXRhLnNoYXBlcywgc2hhcGVzICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIHRoaXMubWF0ZXJpYWwgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlpZiAoIEFycmF5LmlzQXJyYXkoIHRoaXMubWF0ZXJpYWwgKSApIHsKCiAgICAJCQkJdmFyIHV1aWRzID0gW107CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMubWF0ZXJpYWwubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJCXV1aWRzLnB1c2goIHNlcmlhbGl6ZSggbWV0YS5tYXRlcmlhbHMsIHRoaXMubWF0ZXJpYWxbIGkgXSApICk7CgogICAgCQkJCX0KCiAgICAJCQkJb2JqZWN0Lm1hdGVyaWFsID0gdXVpZHM7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJb2JqZWN0Lm1hdGVyaWFsID0gc2VyaWFsaXplKCBtZXRhLm1hdGVyaWFscywgdGhpcy5tYXRlcmlhbCApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vCgogICAgCQlpZiAoIHRoaXMuY2hpbGRyZW4ubGVuZ3RoID4gMCApIHsKCiAgICAJCQlvYmplY3QuY2hpbGRyZW4gPSBbXTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLmNoaWxkcmVuLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJb2JqZWN0LmNoaWxkcmVuLnB1c2goIHRoaXMuY2hpbGRyZW5bIGkgXS50b0pTT04oIG1ldGEgKS5vYmplY3QgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIGlzUm9vdE9iamVjdCApIHsKCiAgICAJCQl2YXIgZ2VvbWV0cmllcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuZ2VvbWV0cmllcyApOwogICAgCQkJdmFyIG1hdGVyaWFscyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEubWF0ZXJpYWxzICk7CiAgICAJCQl2YXIgdGV4dHVyZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnRleHR1cmVzICk7CiAgICAJCQl2YXIgaW1hZ2VzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS5pbWFnZXMgKTsKICAgIAkJCXZhciBzaGFwZXMgPSBleHRyYWN0RnJvbUNhY2hlKCBtZXRhLnNoYXBlcyApOwoKICAgIAkJCWlmICggZ2VvbWV0cmllcy5sZW5ndGggPiAwICkgb3V0cHV0Lmdlb21ldHJpZXMgPSBnZW9tZXRyaWVzOwogICAgCQkJaWYgKCBtYXRlcmlhbHMubGVuZ3RoID4gMCApIG91dHB1dC5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7CiAgICAJCQlpZiAoIHRleHR1cmVzLmxlbmd0aCA+IDAgKSBvdXRwdXQudGV4dHVyZXMgPSB0ZXh0dXJlczsKICAgIAkJCWlmICggaW1hZ2VzLmxlbmd0aCA+IDAgKSBvdXRwdXQuaW1hZ2VzID0gaW1hZ2VzOwogICAgCQkJaWYgKCBzaGFwZXMubGVuZ3RoID4gMCApIG91dHB1dC5zaGFwZXMgPSBzaGFwZXM7CgogICAgCQl9CgogICAgCQlvdXRwdXQub2JqZWN0ID0gb2JqZWN0OwoKICAgIAkJcmV0dXJuIG91dHB1dDsKCiAgICAJCS8vIGV4dHJhY3QgZGF0YSBmcm9tIHRoZSBjYWNoZSBoYXNoCiAgICAJCS8vIHJlbW92ZSBtZXRhZGF0YSBvbiBlYWNoIGl0ZW0KICAgIAkJLy8gYW5kIHJldHVybiBhcyBhcnJheQogICAgCQlmdW5jdGlvbiBleHRyYWN0RnJvbUNhY2hlKCBjYWNoZSApIHsKCiAgICAJCQl2YXIgdmFsdWVzID0gW107CiAgICAJCQlmb3IgKCB2YXIga2V5IGluIGNhY2hlICkgewoKICAgIAkJCQl2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTsKICAgIAkJCQlkZWxldGUgZGF0YS5tZXRhZGF0YTsKICAgIAkJCQl2YWx1ZXMucHVzaCggZGF0YSApOwoKICAgIAkJCX0KICAgIAkJCXJldHVybiB2YWx1ZXM7CgogICAgCQl9CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoIHJlY3Vyc2l2ZSApIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMsIHJlY3Vyc2l2ZSApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkgewoKICAgIAkJaWYgKCByZWN1cnNpdmUgPT09IHVuZGVmaW5lZCApIHJlY3Vyc2l2ZSA9IHRydWU7CgogICAgCQl0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKCiAgICAJCXRoaXMudXAuY29weSggc291cmNlLnVwICk7CgogICAgCQl0aGlzLnBvc2l0aW9uLmNvcHkoIHNvdXJjZS5wb3NpdGlvbiApOwogICAgCQl0aGlzLnF1YXRlcm5pb24uY29weSggc291cmNlLnF1YXRlcm5pb24gKTsKICAgIAkJdGhpcy5zY2FsZS5jb3B5KCBzb3VyY2Uuc2NhbGUgKTsKCiAgICAJCXRoaXMubWF0cml4LmNvcHkoIHNvdXJjZS5tYXRyaXggKTsKICAgIAkJdGhpcy5tYXRyaXhXb3JsZC5jb3B5KCBzb3VyY2UubWF0cml4V29ybGQgKTsKCiAgICAJCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IHNvdXJjZS5tYXRyaXhBdXRvVXBkYXRlOwogICAgCQl0aGlzLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSBzb3VyY2UubWF0cml4V29ybGROZWVkc1VwZGF0ZTsKCiAgICAJCXRoaXMubGF5ZXJzLm1hc2sgPSBzb3VyY2UubGF5ZXJzLm1hc2s7CiAgICAJCXRoaXMudmlzaWJsZSA9IHNvdXJjZS52aXNpYmxlOwoKICAgIAkJdGhpcy5jYXN0U2hhZG93ID0gc291cmNlLmNhc3RTaGFkb3c7CiAgICAJCXRoaXMucmVjZWl2ZVNoYWRvdyA9IHNvdXJjZS5yZWNlaXZlU2hhZG93OwoKICAgIAkJdGhpcy5mcnVzdHVtQ3VsbGVkID0gc291cmNlLmZydXN0dW1DdWxsZWQ7CiAgICAJCXRoaXMucmVuZGVyT3JkZXIgPSBzb3VyY2UucmVuZGVyT3JkZXI7CgogICAgCQl0aGlzLnVzZXJEYXRhID0gSlNPTi5wYXJzZSggSlNPTi5zdHJpbmdpZnkoIHNvdXJjZS51c2VyRGF0YSApICk7CgogICAgCQlpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBzb3VyY2UuY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkgewoKICAgIAkJCQl2YXIgY2hpbGQgPSBzb3VyY2UuY2hpbGRyZW5bIGkgXTsKICAgIAkJCQl0aGlzLmFkZCggY2hpbGQuY2xvbmUoKSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFNjZW5lKCkgewoKICAgIAlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdTY2VuZSc7CgogICAgCXRoaXMuYmFja2dyb3VuZCA9IG51bGw7CiAgICAJdGhpcy5mb2cgPSBudWxsOwogICAgCXRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IG51bGw7CgogICAgCXRoaXMuYXV0b1VwZGF0ZSA9IHRydWU7IC8vIGNoZWNrZWQgYnkgdGhlIHJlbmRlcmVyCgogICAgCWlmICggdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gJ3VuZGVmaW5lZCcgKSB7CgogICAgCQlfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmCgogICAgCX0KCiAgICB9CgogICAgU2NlbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFNjZW5lLAoKICAgIAlpc1NjZW5lOiB0cnVlLAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkgewoKICAgIAkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTsKCiAgICAJCWlmICggc291cmNlLmJhY2tncm91bmQgIT09IG51bGwgKSB0aGlzLmJhY2tncm91bmQgPSBzb3VyY2UuYmFja2dyb3VuZC5jbG9uZSgpOwogICAgCQlpZiAoIHNvdXJjZS5mb2cgIT09IG51bGwgKSB0aGlzLmZvZyA9IHNvdXJjZS5mb2cuY2xvbmUoKTsKICAgIAkJaWYgKCBzb3VyY2Uub3ZlcnJpZGVNYXRlcmlhbCAhPT0gbnVsbCApIHRoaXMub3ZlcnJpZGVNYXRlcmlhbCA9IHNvdXJjZS5vdmVycmlkZU1hdGVyaWFsLmNsb25lKCk7CgogICAgCQl0aGlzLmF1dG9VcGRhdGUgPSBzb3VyY2UuYXV0b1VwZGF0ZTsKICAgIAkJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gc291cmNlLm1hdHJpeEF1dG9VcGRhdGU7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgogICAgCQl2YXIgZGF0YSA9IE9iamVjdDNELnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOwoKICAgIAkJaWYgKCB0aGlzLmJhY2tncm91bmQgIT09IG51bGwgKSBkYXRhLm9iamVjdC5iYWNrZ3JvdW5kID0gdGhpcy5iYWNrZ3JvdW5kLnRvSlNPTiggbWV0YSApOwogICAgCQlpZiAoIHRoaXMuZm9nICE9PSBudWxsICkgZGF0YS5vYmplY3QuZm9nID0gdGhpcy5mb2cudG9KU09OKCk7CgogICAgCQlyZXR1cm4gZGF0YTsKCiAgICAJfSwKCiAgICAJZGlzcG9zZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgdmFyIF9wb2ludHMgPSBbCiAgICAJbmV3IFZlY3RvcjMoKSwKICAgIAluZXcgVmVjdG9yMygpLAogICAgCW5ldyBWZWN0b3IzKCksCiAgICAJbmV3IFZlY3RvcjMoKSwKICAgIAluZXcgVmVjdG9yMygpLAogICAgCW5ldyBWZWN0b3IzKCksCiAgICAJbmV3IFZlY3RvcjMoKSwKICAgIAluZXcgVmVjdG9yMygpCiAgICBdOwogICAgdmFyIF92ZWN0b3IkMiA9IG5ldyBWZWN0b3IzKCk7CgogICAgLy8gdHJpYW5nbGUgY2VudGVyZWQgdmVydGljZXMKCiAgICB2YXIgX3YwID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfdjEkMiA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3YyID0gbmV3IFZlY3RvcjMoKTsKCiAgICAvLyB0cmlhbmdsZSBlZGdlIHZlY3RvcnMKCiAgICB2YXIgX2YwID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfZjEgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9mMiA9IG5ldyBWZWN0b3IzKCk7CgogICAgdmFyIF9jZW50ZXIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9leHRlbnRzID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfdHJpYW5nbGVOb3JtYWwgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF90ZXN0QXhpcyA9IG5ldyBWZWN0b3IzKCk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqLwoKICAgIGZ1bmN0aW9uIEJveDMoIG1pbiwgbWF4ICkgewoKICAgIAl0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IzKCArIEluZmluaXR5LCArIEluZmluaXR5LCArIEluZmluaXR5ICk7CiAgICAJdGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMyggLSBJbmZpbml0eSwgLSBJbmZpbml0eSwgLSBJbmZpbml0eSApOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBCb3gzLnByb3RvdHlwZSwgewoKICAgIAlpc0JveDM6IHRydWUsCgogICAgCXNldDogZnVuY3Rpb24gKCBtaW4sIG1heCApIHsKCiAgICAJCXRoaXMubWluLmNvcHkoIG1pbiApOwogICAgCQl0aGlzLm1heC5jb3B5KCBtYXggKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CgogICAgCQl2YXIgbWluWCA9ICsgSW5maW5pdHk7CiAgICAJCXZhciBtaW5ZID0gKyBJbmZpbml0eTsKICAgIAkJdmFyIG1pblogPSArIEluZmluaXR5OwoKICAgIAkJdmFyIG1heFggPSAtIEluZmluaXR5OwogICAgCQl2YXIgbWF4WSA9IC0gSW5maW5pdHk7CiAgICAJCXZhciBtYXhaID0gLSBJbmZpbml0eTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGFycmF5Lmxlbmd0aDsgaSA8IGw7IGkgKz0gMyApIHsKCiAgICAJCQl2YXIgeCA9IGFycmF5WyBpIF07CiAgICAJCQl2YXIgeSA9IGFycmF5WyBpICsgMSBdOwogICAgCQkJdmFyIHogPSBhcnJheVsgaSArIDIgXTsKCiAgICAJCQlpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CiAgICAJCQlpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7CiAgICAJCQlpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7CgogICAgCQkJaWYgKCB4ID4gbWF4WCApIG1heFggPSB4OwogICAgCQkJaWYgKCB5ID4gbWF4WSApIG1heFkgPSB5OwogICAgCQkJaWYgKCB6ID4gbWF4WiApIG1heFogPSB6OwoKICAgIAkJfQoKICAgIAkJdGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7CiAgICAJCXRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21CdWZmZXJBdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlICkgewoKICAgIAkJdmFyIG1pblggPSArIEluZmluaXR5OwogICAgCQl2YXIgbWluWSA9ICsgSW5maW5pdHk7CiAgICAJCXZhciBtaW5aID0gKyBJbmZpbml0eTsKCiAgICAJCXZhciBtYXhYID0gLSBJbmZpbml0eTsKICAgIAkJdmFyIG1heFkgPSAtIEluZmluaXR5OwogICAgCQl2YXIgbWF4WiA9IC0gSW5maW5pdHk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciB4ID0gYXR0cmlidXRlLmdldFgoIGkgKTsKICAgIAkJCXZhciB5ID0gYXR0cmlidXRlLmdldFkoIGkgKTsKICAgIAkJCXZhciB6ID0gYXR0cmlidXRlLmdldFooIGkgKTsKCiAgICAJCQlpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CiAgICAJCQlpZiAoIHkgPCBtaW5ZICkgbWluWSA9IHk7CiAgICAJCQlpZiAoIHogPCBtaW5aICkgbWluWiA9IHo7CgogICAgCQkJaWYgKCB4ID4gbWF4WCApIG1heFggPSB4OwogICAgCQkJaWYgKCB5ID4gbWF4WSApIG1heFkgPSB5OwogICAgCQkJaWYgKCB6ID4gbWF4WiApIG1heFogPSB6OwoKICAgIAkJfQoKICAgIAkJdGhpcy5taW4uc2V0KCBtaW5YLCBtaW5ZLCBtaW5aICk7CiAgICAJCXRoaXMubWF4LnNldCggbWF4WCwgbWF4WSwgbWF4WiApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkgewoKICAgIAkJdGhpcy5tYWtlRW1wdHkoKTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgaWwgPSBwb2ludHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdGhpcy5leHBhbmRCeVBvaW50KCBwb2ludHNbIGkgXSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21DZW50ZXJBbmRTaXplOiBmdW5jdGlvbiAoIGNlbnRlciwgc2l6ZSApIHsKCiAgICAJCXZhciBoYWxmU2l6ZSA9IF92ZWN0b3IkMi5jb3B5KCBzaXplICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKICAgIAkJdGhpcy5taW4uY29weSggY2VudGVyICkuc3ViKCBoYWxmU2l6ZSApOwogICAgCQl0aGlzLm1heC5jb3B5KCBjZW50ZXIgKS5hZGQoIGhhbGZTaXplICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCQl0aGlzLm1ha2VFbXB0eSgpOwoKICAgIAkJcmV0dXJuIHRoaXMuZXhwYW5kQnlPYmplY3QoIG9iamVjdCApOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXRoaXMubWluLmNvcHkoIGJveC5taW4gKTsKICAgIAkJdGhpcy5tYXguY29weSggYm94Lm1heCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW1ha2VFbXB0eTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5taW4ueCA9IHRoaXMubWluLnkgPSB0aGlzLm1pbi56ID0gKyBJbmZpbml0eTsKICAgIAkJdGhpcy5tYXgueCA9IHRoaXMubWF4LnkgPSB0aGlzLm1heC56ID0gLSBJbmZpbml0eTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlpc0VtcHR5OiBmdW5jdGlvbiAoKSB7CgogICAgCQkvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlcwoKICAgIAkJcmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICkgfHwgKCB0aGlzLm1heC56IDwgdGhpcy5taW4ueiApOwoKICAgIAl9LAoKICAgIAlnZXRDZW50ZXI6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCkgPyB0YXJnZXQuc2V0KCAwLCAwLCAwICkgOiB0YXJnZXQuYWRkVmVjdG9ycyggdGhpcy5taW4sIHRoaXMubWF4ICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKICAgIAl9LAoKICAgIAlnZXRTaXplOiBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmdldFNpemUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAsIDAgKSA6IHRhcmdldC5zdWJWZWN0b3JzKCB0aGlzLm1heCwgdGhpcy5taW4gKTsKCiAgICAJfSwKCiAgICAJZXhwYW5kQnlQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCiAgICAJCXRoaXMubWluLm1pbiggcG9pbnQgKTsKICAgIAkJdGhpcy5tYXgubWF4KCBwb2ludCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWV4cGFuZEJ5VmVjdG9yOiBmdW5jdGlvbiAoIHZlY3RvciApIHsKCiAgICAJCXRoaXMubWluLnN1YiggdmVjdG9yICk7CiAgICAJCXRoaXMubWF4LmFkZCggdmVjdG9yICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXhwYW5kQnlTY2FsYXI6IGZ1bmN0aW9uICggc2NhbGFyICkgewoKICAgIAkJdGhpcy5taW4uYWRkU2NhbGFyKCAtIHNjYWxhciApOwogICAgCQl0aGlzLm1heC5hZGRTY2FsYXIoIHNjYWxhciApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWV4cGFuZEJ5T2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCApIHsKCiAgICAJCXZhciBpLCBsOwoKICAgIAkJLy8gQ29tcHV0ZXMgdGhlIHdvcmxkLWF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggb2YgYW4gb2JqZWN0IChpbmNsdWRpbmcgaXRzIGNoaWxkcmVuKSwKICAgIAkJLy8gYWNjb3VudGluZyBmb3IgYm90aCB0aGUgb2JqZWN0J3MsIGFuZCBjaGlsZHJlbidzLCB3b3JsZCB0cmFuc2Zvcm1zCgogICAgCQlvYmplY3QudXBkYXRlV29ybGRNYXRyaXgoIGZhbHNlLCBmYWxzZSApOwoKICAgIAkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwoKICAgIAkJaWYgKCBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCQkJdmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7CgogICAgCQkJCWZvciAoIGkgPSAwLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJCV92ZWN0b3IkMi5jb3B5KCB2ZXJ0aWNlc1sgaSBdICk7CiAgICAJCQkJCV92ZWN0b3IkMi5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApOwoKICAgIAkJCQkJdGhpcy5leHBhbmRCeVBvaW50KCBfdmVjdG9yJDIgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgogICAgCQkJCXZhciBhdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwoKICAgIAkJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJZm9yICggaSA9IDAsIGwgPSBhdHRyaWJ1dGUuY291bnQ7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQkJCV92ZWN0b3IkMi5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGkgKS5hcHBseU1hdHJpeDQoIG9iamVjdC5tYXRyaXhXb3JsZCApOwoKICAgIAkJCQkJCXRoaXMuZXhwYW5kQnlQb2ludCggX3ZlY3RvciQyICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLwoKICAgIAkJdmFyIGNoaWxkcmVuID0gb2JqZWN0LmNoaWxkcmVuOwoKICAgIAkJZm9yICggaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXRoaXMuZXhwYW5kQnlPYmplY3QoIGNoaWxkcmVuWyBpIF0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb250YWluc1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKICAgIAkJcmV0dXJuIHBvaW50LnggPCB0aGlzLm1pbi54IHx8IHBvaW50LnggPiB0aGlzLm1heC54IHx8CiAgICAJCQlwb2ludC55IDwgdGhpcy5taW4ueSB8fCBwb2ludC55ID4gdGhpcy5tYXgueSB8fAogICAgCQkJcG9pbnQueiA8IHRoaXMubWluLnogfHwgcG9pbnQueiA+IHRoaXMubWF4LnogPyBmYWxzZSA6IHRydWU7CgogICAgCX0sCgogICAgCWNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJgogICAgCQkJdGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4LnkgJiYKICAgIAkJCXRoaXMubWluLnogPD0gYm94Lm1pbi56ICYmIGJveC5tYXgueiA8PSB0aGlzLm1heC56OwoKICAgIAl9LAoKICAgIAlnZXRQYXJhbWV0ZXI6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHsKCiAgICAJCS8vIFRoaXMgY2FuIHBvdGVudGlhbGx5IGhhdmUgYSBkaXZpZGUgYnkgemVybyBpZiB0aGUgYm94CiAgICAJCS8vIGhhcyBhIHNpemUgZGltZW5zaW9uIG9mIDAuCgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5nZXRQYXJhbWV0ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0YXJnZXQuc2V0KAogICAgCQkJKCBwb2ludC54IC0gdGhpcy5taW4ueCApIC8gKCB0aGlzLm1heC54IC0gdGhpcy5taW4ueCApLAogICAgCQkJKCBwb2ludC55IC0gdGhpcy5taW4ueSApIC8gKCB0aGlzLm1heC55IC0gdGhpcy5taW4ueSApLAogICAgCQkJKCBwb2ludC56IC0gdGhpcy5taW4ueiApIC8gKCB0aGlzLm1heC56IC0gdGhpcy5taW4ueiApCiAgICAJCSk7CgogICAgCX0sCgogICAgCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgewoKICAgIAkJLy8gdXNpbmcgNiBzcGxpdHRpbmcgcGxhbmVzIHRvIHJ1bGUgb3V0IGludGVyc2VjdGlvbnMuCiAgICAJCXJldHVybiBib3gubWF4LnggPCB0aGlzLm1pbi54IHx8IGJveC5taW4ueCA+IHRoaXMubWF4LnggfHwKICAgIAkJCWJveC5tYXgueSA8IHRoaXMubWluLnkgfHwgYm94Lm1pbi55ID4gdGhpcy5tYXgueSB8fAogICAgCQkJYm94Lm1heC56IDwgdGhpcy5taW4ueiB8fCBib3gubWluLnogPiB0aGlzLm1heC56ID8gZmFsc2UgOiB0cnVlOwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCiAgICAJCS8vIEZpbmQgdGhlIHBvaW50IG9uIHRoZSBBQUJCIGNsb3Nlc3QgdG8gdGhlIHNwaGVyZSBjZW50ZXIuCiAgICAJCXRoaXMuY2xhbXBQb2ludCggc3BoZXJlLmNlbnRlciwgX3ZlY3RvciQyICk7CgogICAgCQkvLyBJZiB0aGF0IHBvaW50IGlzIGluc2lkZSB0aGUgc3BoZXJlLCB0aGUgQUFCQiBhbmQgc3BoZXJlIGludGVyc2VjdC4KICAgIAkJcmV0dXJuIF92ZWN0b3IkMi5kaXN0YW5jZVRvU3F1YXJlZCggc3BoZXJlLmNlbnRlciApIDw9ICggc3BoZXJlLnJhZGl1cyAqIHNwaGVyZS5yYWRpdXMgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKICAgIAkJLy8gV2UgY29tcHV0ZSB0aGUgbWluaW11bSBhbmQgbWF4aW11bSBkb3QgcHJvZHVjdCB2YWx1ZXMuIElmIHRob3NlIHZhbHVlcwogICAgCQkvLyBhcmUgb24gdGhlIHNhbWUgc2lkZSAoYmFjayBvciBmcm9udCkgb2YgdGhlIHBsYW5lLCB0aGVuIHRoZXJlIGlzIG5vIGludGVyc2VjdGlvbi4KCiAgICAJCXZhciBtaW4sIG1heDsKCiAgICAJCWlmICggcGxhbmUubm9ybWFsLnggPiAwICkgewoKICAgIAkJCW1pbiA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5taW4ueDsKICAgIAkJCW1heCA9IHBsYW5lLm5vcm1hbC54ICogdGhpcy5tYXgueDsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJbWluID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1heC54OwogICAgCQkJbWF4ID0gcGxhbmUubm9ybWFsLnggKiB0aGlzLm1pbi54OwoKICAgIAkJfQoKICAgIAkJaWYgKCBwbGFuZS5ub3JtYWwueSA+IDAgKSB7CgogICAgCQkJbWluICs9IHBsYW5lLm5vcm1hbC55ICogdGhpcy5taW4ueTsKICAgIAkJCW1heCArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCW1pbiArPSBwbGFuZS5ub3JtYWwueSAqIHRoaXMubWF4Lnk7CiAgICAJCQltYXggKz0gcGxhbmUubm9ybWFsLnkgKiB0aGlzLm1pbi55OwoKICAgIAkJfQoKICAgIAkJaWYgKCBwbGFuZS5ub3JtYWwueiA+IDAgKSB7CgogICAgCQkJbWluICs9IHBsYW5lLm5vcm1hbC56ICogdGhpcy5taW4uejsKICAgIAkJCW1heCArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCW1pbiArPSBwbGFuZS5ub3JtYWwueiAqIHRoaXMubWF4Lno7CiAgICAJCQltYXggKz0gcGxhbmUubm9ybWFsLnogKiB0aGlzLm1pbi56OwoKICAgIAkJfQoKICAgIAkJcmV0dXJuICggbWluIDw9IC0gcGxhbmUuY29uc3RhbnQgJiYgbWF4ID49IC0gcGxhbmUuY29uc3RhbnQgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c1RyaWFuZ2xlOiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkgewoKICAgIAkJaWYgKCB0aGlzLmlzRW1wdHkoKSApIHsKCiAgICAJCQlyZXR1cm4gZmFsc2U7CgogICAgCQl9CgogICAgCQkvLyBjb21wdXRlIGJveCBjZW50ZXIgYW5kIGV4dGVudHMKICAgIAkJdGhpcy5nZXRDZW50ZXIoIF9jZW50ZXIgKTsKICAgIAkJX2V4dGVudHMuc3ViVmVjdG9ycyggdGhpcy5tYXgsIF9jZW50ZXIgKTsKCiAgICAJCS8vIHRyYW5zbGF0ZSB0cmlhbmdsZSB0byBhYWJiIG9yaWdpbgogICAgCQlfdjAuc3ViVmVjdG9ycyggdHJpYW5nbGUuYSwgX2NlbnRlciApOwogICAgCQlfdjEkMi5zdWJWZWN0b3JzKCB0cmlhbmdsZS5iLCBfY2VudGVyICk7CiAgICAJCV92Mi5zdWJWZWN0b3JzKCB0cmlhbmdsZS5jLCBfY2VudGVyICk7CgogICAgCQkvLyBjb21wdXRlIGVkZ2UgdmVjdG9ycyBmb3IgdHJpYW5nbGUKICAgIAkJX2YwLnN1YlZlY3RvcnMoIF92MSQyLCBfdjAgKTsKICAgIAkJX2YxLnN1YlZlY3RvcnMoIF92MiwgX3YxJDIgKTsKICAgIAkJX2YyLnN1YlZlY3RvcnMoIF92MCwgX3YyICk7CgogICAgCQkvLyB0ZXN0IGFnYWluc3QgYXhlcyB0aGF0IGFyZSBnaXZlbiBieSBjcm9zcyBwcm9kdWN0IGNvbWJpbmF0aW9ucyBvZiB0aGUgZWRnZXMgb2YgdGhlIHRyaWFuZ2xlIGFuZCB0aGUgZWRnZXMgb2YgdGhlIGFhYmIKICAgIAkJLy8gbWFrZSBhbiBheGlzIHRlc3Rpbmcgb2YgZWFjaCBvZiB0aGUgMyBzaWRlcyBvZiB0aGUgYWFiYiBhZ2FpbnN0IGVhY2ggb2YgdGhlIDMgc2lkZXMgb2YgdGhlIHRyaWFuZ2xlID0gOSBheGlzIG9mIHNlcGFyYXRpb24KICAgIAkJLy8gYXhpc19paiA9IHVfaSB4IGZfaiAodTAsIHUxLCB1MiA9IGZhY2Ugbm9ybWFscyBvZiBhYWJiID0geCx5LHogYXhlcyB2ZWN0b3JzIHNpbmNlIGFhYmIgaXMgYXhpcyBhbGlnbmVkKQogICAgCQl2YXIgYXhlcyA9IFsKICAgIAkJCTAsIC0gX2YwLnosIF9mMC55LCAwLCAtIF9mMS56LCBfZjEueSwgMCwgLSBfZjIueiwgX2YyLnksCiAgICAJCQlfZjAueiwgMCwgLSBfZjAueCwgX2YxLnosIDAsIC0gX2YxLngsIF9mMi56LCAwLCAtIF9mMi54LAogICAgCQkJLSBfZjAueSwgX2YwLngsIDAsIC0gX2YxLnksIF9mMS54LCAwLCAtIF9mMi55LCBfZjIueCwgMAogICAgCQldOwogICAgCQlpZiAoICEgc2F0Rm9yQXhlcyggYXhlcywgX3YwLCBfdjEkMiwgX3YyLCBfZXh0ZW50cyApICkgewoKICAgIAkJCXJldHVybiBmYWxzZTsKCiAgICAJCX0KCiAgICAJCS8vIHRlc3QgMyBmYWNlIG5vcm1hbHMgZnJvbSB0aGUgYWFiYgogICAgCQlheGVzID0gWyAxLCAwLCAwLCAwLCAxLCAwLCAwLCAwLCAxIF07CiAgICAJCWlmICggISBzYXRGb3JBeGVzKCBheGVzLCBfdjAsIF92MSQyLCBfdjIsIF9leHRlbnRzICkgKSB7CgogICAgCQkJcmV0dXJuIGZhbHNlOwoKICAgIAkJfQoKICAgIAkJLy8gZmluYWxseSB0ZXN0aW5nIHRoZSBmYWNlIG5vcm1hbCBvZiB0aGUgdHJpYW5nbGUKICAgIAkJLy8gdXNlIGFscmVhZHkgZXhpc3RpbmcgdHJpYW5nbGUgZWRnZSB2ZWN0b3JzIGhlcmUKICAgIAkJX3RyaWFuZ2xlTm9ybWFsLmNyb3NzVmVjdG9ycyggX2YwLCBfZjEgKTsKICAgIAkJYXhlcyA9IFsgX3RyaWFuZ2xlTm9ybWFsLngsIF90cmlhbmdsZU5vcm1hbC55LCBfdHJpYW5nbGVOb3JtYWwueiBdOwoKICAgIAkJcmV0dXJuIHNhdEZvckF4ZXMoIGF4ZXMsIF92MCwgX3YxJDIsIF92MiwgX2V4dGVudHMgKTsKCiAgICAJfSwKCiAgICAJY2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTsKCiAgICAJfSwKCiAgICAJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKICAgIAkJdmFyIGNsYW1wZWRQb2ludCA9IF92ZWN0b3IkMi5jb3B5KCBwb2ludCApLmNsYW1wKCB0aGlzLm1pbiwgdGhpcy5tYXggKTsKCiAgICAJCXJldHVybiBjbGFtcGVkUG9pbnQuc3ViKCBwb2ludCApLmxlbmd0aCgpOwoKICAgIAl9LAoKICAgIAlnZXRCb3VuZGluZ1NwaGVyZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Cb3gzOiAuZ2V0Qm91bmRpbmdTcGhlcmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJLy90YXJnZXQgPSBuZXcgU3BoZXJlKCk7IC8vIHJlbW92ZWQgdG8gYXZvaWQgY3ljbGljIGRlcGVuZGVuY3kKCiAgICAJCX0KCiAgICAJCXRoaXMuZ2V0Q2VudGVyKCB0YXJnZXQuY2VudGVyICk7CgogICAgCQl0YXJnZXQucmFkaXVzID0gdGhpcy5nZXRTaXplKCBfdmVjdG9yJDIgKS5sZW5ndGgoKSAqIDAuNTsKCiAgICAJCXJldHVybiB0YXJnZXQ7CgogICAgCX0sCgogICAgCWludGVyc2VjdDogZnVuY3Rpb24gKCBib3ggKSB7CgogICAgCQl0aGlzLm1pbi5tYXgoIGJveC5taW4gKTsKICAgIAkJdGhpcy5tYXgubWluKCBib3gubWF4ICk7CgogICAgCQkvLyBlbnN1cmUgdGhhdCBpZiB0aGVyZSBpcyBubyBvdmVybGFwLCB0aGUgcmVzdWx0IGlzIGZ1bGx5IGVtcHR5LCBub3Qgc2xpZ2h0bHkgZW1wdHkgd2l0aCBub24taW5mLytpbmYgdmFsdWVzIHRoYXQgd2lsbCBjYXVzZSBzdWJzZXF1ZW5jZSBpbnRlcnNlY3RzIHRvIGVycm9uZW91c2x5IHJldHVybiB2YWxpZCB2YWx1ZXMuCiAgICAJCWlmICggdGhpcy5pc0VtcHR5KCkgKSB0aGlzLm1ha2VFbXB0eSgpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXVuaW9uOiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXRoaXMubWluLm1pbiggYm94Lm1pbiApOwogICAgCQl0aGlzLm1heC5tYXgoIGJveC5tYXggKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkgewoKICAgIAkJLy8gdHJhbnNmb3JtIG9mIGVtcHR5IGJveCBpcyBhbiBlbXB0eSBib3guCiAgICAJCWlmICggdGhpcy5pc0VtcHR5KCkgKSByZXR1cm4gdGhpczsKCiAgICAJCS8vIE5PVEU6IEkgYW0gdXNpbmcgYSBiaW5hcnkgcGF0dGVybiB0byBzcGVjaWZ5IGFsbCAyXjMgY29tYmluYXRpb25zIGJlbG93CiAgICAJCV9wb2ludHNbIDAgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWluLnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMDAKICAgIAkJX3BvaW50c1sgMSBdLnNldCggdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDAwMQogICAgCQlfcG9pbnRzWyAyIF0uc2V0KCB0aGlzLm1pbi54LCB0aGlzLm1heC55LCB0aGlzLm1pbi56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMDEwCiAgICAJCV9wb2ludHNbIDMgXS5zZXQoIHRoaXMubWluLngsIHRoaXMubWF4LnksIHRoaXMubWF4LnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAwMTEKICAgIAkJX3BvaW50c1sgNCBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5taW4ueSwgdGhpcy5taW4ueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDEwMAogICAgCQlfcG9pbnRzWyA1IF0uc2V0KCB0aGlzLm1heC54LCB0aGlzLm1pbi55LCB0aGlzLm1heC56ICkuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsgLy8gMTAxCiAgICAJCV9wb2ludHNbIDYgXS5zZXQoIHRoaXMubWF4LngsIHRoaXMubWF4LnksIHRoaXMubWluLnogKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOyAvLyAxMTAKICAgIAkJX3BvaW50c1sgNyBdLnNldCggdGhpcy5tYXgueCwgdGhpcy5tYXgueSwgdGhpcy5tYXgueiApLmFwcGx5TWF0cml4NCggbWF0cml4ICk7IC8vIDExMQoKICAgIAkJdGhpcy5zZXRGcm9tUG9pbnRzKCBfcG9pbnRzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHsKCiAgICAJCXRoaXMubWluLmFkZCggb2Zmc2V0ICk7CiAgICAJCXRoaXMubWF4LmFkZCggb2Zmc2V0ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBmdW5jdGlvbiBzYXRGb3JBeGVzKCBheGVzLCB2MCwgdjEsIHYyLCBleHRlbnRzICkgewoKICAgIAl2YXIgaSwgajsKCiAgICAJZm9yICggaSA9IDAsIGogPSBheGVzLmxlbmd0aCAtIDM7IGkgPD0gajsgaSArPSAzICkgewoKICAgIAkJX3Rlc3RBeGlzLmZyb21BcnJheSggYXhlcywgaSApOwogICAgCQkvLyBwcm9qZWN0IHRoZSBhYWJiIG9udG8gdGhlIHNlcGVyYXRpbmcgYXhpcwogICAgCQl2YXIgciA9IGV4dGVudHMueCAqIE1hdGguYWJzKCBfdGVzdEF4aXMueCApICsgZXh0ZW50cy55ICogTWF0aC5hYnMoIF90ZXN0QXhpcy55ICkgKyBleHRlbnRzLnogKiBNYXRoLmFicyggX3Rlc3RBeGlzLnogKTsKICAgIAkJLy8gcHJvamVjdCBhbGwgMyB2ZXJ0aWNlcyBvZiB0aGUgdHJpYW5nbGUgb250byB0aGUgc2VwZXJhdGluZyBheGlzCiAgICAJCXZhciBwMCA9IHYwLmRvdCggX3Rlc3RBeGlzICk7CiAgICAJCXZhciBwMSA9IHYxLmRvdCggX3Rlc3RBeGlzICk7CiAgICAJCXZhciBwMiA9IHYyLmRvdCggX3Rlc3RBeGlzICk7CiAgICAJCS8vIGFjdHVhbCB0ZXN0LCBiYXNpY2FsbHkgc2VlIGlmIGVpdGhlciBvZiB0aGUgbW9zdCBleHRyZW1lIG9mIHRoZSB0cmlhbmdsZSBwb2ludHMgaW50ZXJzZWN0cyByCiAgICAJCWlmICggTWF0aC5tYXgoIC0gTWF0aC5tYXgoIHAwLCBwMSwgcDIgKSwgTWF0aC5taW4oIHAwLCBwMSwgcDIgKSApID4gciApIHsKCiAgICAJCQkvLyBwb2ludHMgb2YgdGhlIHByb2plY3RlZCB0cmlhbmdsZSBhcmUgb3V0c2lkZSB0aGUgcHJvamVjdGVkIGhhbGYtbGVuZ3RoIG9mIHRoZSBhYWJiCiAgICAJCQkvLyB0aGUgYXhpcyBpcyBzZXBlcmF0aW5nIGFuZCB3ZSBjYW4gZXhpdAogICAgCQkJcmV0dXJuIGZhbHNlOwoKICAgIAkJfQoKICAgIAl9CgogICAgCXJldHVybiB0cnVlOwoKICAgIH0KCiAgICB2YXIgX2JveCA9IG5ldyBCb3gzKCk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gU3BoZXJlKCBjZW50ZXIsIHJhZGl1cyApIHsKCiAgICAJdGhpcy5jZW50ZXIgPSAoIGNlbnRlciAhPT0gdW5kZWZpbmVkICkgPyBjZW50ZXIgOiBuZXcgVmVjdG9yMygpOwogICAgCXRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMDsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggU3BoZXJlLnByb3RvdHlwZSwgewoKICAgIAlzZXQ6IGZ1bmN0aW9uICggY2VudGVyLCByYWRpdXMgKSB7CgogICAgCQl0aGlzLmNlbnRlci5jb3B5KCBjZW50ZXIgKTsKICAgIAkJdGhpcy5yYWRpdXMgPSByYWRpdXM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMsIG9wdGlvbmFsQ2VudGVyICkgewoKICAgIAkJdmFyIGNlbnRlciA9IHRoaXMuY2VudGVyOwoKICAgIAkJaWYgKCBvcHRpb25hbENlbnRlciAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNlbnRlci5jb3B5KCBvcHRpb25hbENlbnRlciApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlfYm94LnNldEZyb21Qb2ludHMoIHBvaW50cyApLmdldENlbnRlciggY2VudGVyICk7CgogICAgCQl9CgogICAgCQl2YXIgbWF4UmFkaXVzU3EgPSAwOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQltYXhSYWRpdXNTcSA9IE1hdGgubWF4KCBtYXhSYWRpdXNTcSwgY2VudGVyLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludHNbIGkgXSApICk7CgogICAgCQl9CgogICAgCQl0aGlzLnJhZGl1cyA9IE1hdGguc3FydCggbWF4UmFkaXVzU3EgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCiAgICAJCXRoaXMuY2VudGVyLmNvcHkoIHNwaGVyZS5jZW50ZXIgKTsKICAgIAkJdGhpcy5yYWRpdXMgPSBzcGhlcmUucmFkaXVzOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWVtcHR5OiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gKCB0aGlzLnJhZGl1cyA8PSAwICk7CgogICAgCX0sCgogICAgCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgogICAgCQlyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvU3F1YXJlZCggdGhpcy5jZW50ZXIgKSA8PSAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApOwoKICAgIAl9LAoKICAgIAlkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgogICAgCQlyZXR1cm4gKCBwb2ludC5kaXN0YW5jZVRvKCB0aGlzLmNlbnRlciApIC0gdGhpcy5yYWRpdXMgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c1NwaGVyZTogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CgogICAgCQl2YXIgcmFkaXVzU3VtID0gdGhpcy5yYWRpdXMgKyBzcGhlcmUucmFkaXVzOwoKICAgIAkJcmV0dXJuIHNwaGVyZS5jZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuY2VudGVyICkgPD0gKCByYWRpdXNTdW0gKiByYWRpdXNTdW0gKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7CgogICAgCQlyZXR1cm4gYm94LmludGVyc2VjdHNTcGhlcmUoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c1BsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKICAgIAkJcmV0dXJuIE1hdGguYWJzKCBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMuY2VudGVyICkgKSA8PSB0aGlzLnJhZGl1czsKCiAgICAJfSwKCiAgICAJY2xhbXBQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkgewoKICAgIAkJdmFyIGRlbHRhTGVuZ3RoU3EgPSB0aGlzLmNlbnRlci5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuY2xhbXBQb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJfQoKICAgIAkJdGFyZ2V0LmNvcHkoIHBvaW50ICk7CgogICAgCQlpZiAoIGRlbHRhTGVuZ3RoU3EgPiAoIHRoaXMucmFkaXVzICogdGhpcy5yYWRpdXMgKSApIHsKCiAgICAJCQl0YXJnZXQuc3ViKCB0aGlzLmNlbnRlciApLm5vcm1hbGl6ZSgpOwogICAgCQkJdGFyZ2V0Lm11bHRpcGx5U2NhbGFyKCB0aGlzLnJhZGl1cyApLmFkZCggdGhpcy5jZW50ZXIgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0YXJnZXQ7CgogICAgCX0sCgogICAgCWdldEJvdW5kaW5nQm94OiBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuU3BoZXJlOiAuZ2V0Qm91bmRpbmdCb3goKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IEJveDMoKTsKCiAgICAJCX0KCiAgICAJCXRhcmdldC5zZXQoIHRoaXMuY2VudGVyLCB0aGlzLmNlbnRlciApOwogICAgCQl0YXJnZXQuZXhwYW5kQnlTY2FsYXIoIHRoaXMucmFkaXVzICk7CgogICAgCQlyZXR1cm4gdGFyZ2V0OwoKICAgIAl9LAoKICAgIAlhcHBseU1hdHJpeDQ6IGZ1bmN0aW9uICggbWF0cml4ICkgewoKICAgIAkJdGhpcy5jZW50ZXIuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKICAgIAkJdGhpcy5yYWRpdXMgPSB0aGlzLnJhZGl1cyAqIG1hdHJpeC5nZXRNYXhTY2FsZU9uQXhpcygpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7CgogICAgCQl0aGlzLmNlbnRlci5hZGQoIG9mZnNldCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWVxdWFsczogZnVuY3Rpb24gKCBzcGhlcmUgKSB7CgogICAgCQlyZXR1cm4gc3BoZXJlLmNlbnRlci5lcXVhbHMoIHRoaXMuY2VudGVyICkgJiYgKCBzcGhlcmUucmFkaXVzID09PSB0aGlzLnJhZGl1cyApOwoKICAgIAl9CgogICAgfSApOwoKICAgIHZhciBfdmVjdG9yJDMgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9zZWdDZW50ZXIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9zZWdEaXIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9kaWZmID0gbmV3IFZlY3RvcjMoKTsKCiAgICB2YXIgX2VkZ2UxID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfZWRnZTIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9ub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoKICAgIC8qKgogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwogICAgICovCgogICAgZnVuY3Rpb24gUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKCiAgICAJdGhpcy5vcmlnaW4gPSAoIG9yaWdpbiAhPT0gdW5kZWZpbmVkICkgPyBvcmlnaW4gOiBuZXcgVmVjdG9yMygpOwogICAgCXRoaXMuZGlyZWN0aW9uID0gKCBkaXJlY3Rpb24gIT09IHVuZGVmaW5lZCApID8gZGlyZWN0aW9uIDogbmV3IFZlY3RvcjMoKTsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggUmF5LnByb3RvdHlwZSwgewoKICAgIAlzZXQ6IGZ1bmN0aW9uICggb3JpZ2luLCBkaXJlY3Rpb24gKSB7CgogICAgCQl0aGlzLm9yaWdpbi5jb3B5KCBvcmlnaW4gKTsKICAgIAkJdGhpcy5kaXJlY3Rpb24uY29weSggZGlyZWN0aW9uICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCByYXkgKSB7CgogICAgCQl0aGlzLm9yaWdpbi5jb3B5KCByYXkub3JpZ2luICk7CiAgICAJCXRoaXMuZGlyZWN0aW9uLmNvcHkoIHJheS5kaXJlY3Rpb24gKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmF0KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGFyZ2V0LmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMub3JpZ2luICk7CgogICAgCX0sCgogICAgCWxvb2tBdDogZnVuY3Rpb24gKCB2ICkgewoKICAgIAkJdGhpcy5kaXJlY3Rpb24uY29weSggdiApLnN1YiggdGhpcy5vcmlnaW4gKS5ub3JtYWxpemUoKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyZWNhc3Q6IGZ1bmN0aW9uICggdCApIHsKCiAgICAJCXRoaXMub3JpZ2luLmNvcHkoIHRoaXMuYXQoIHQsIF92ZWN0b3IkMyApICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5SYXk6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQl0YXJnZXQuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMub3JpZ2luICk7CgogICAgCQl2YXIgZGlyZWN0aW9uRGlzdGFuY2UgPSB0YXJnZXQuZG90KCB0aGlzLmRpcmVjdGlvbiApOwoKICAgIAkJaWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7CgogICAgCQkJcmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLm9yaWdpbiApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBkaXJlY3Rpb25EaXN0YW5jZSApLmFkZCggdGhpcy5vcmlnaW4gKTsKCiAgICAJfSwKCiAgICAJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKICAgIAkJcmV0dXJuIE1hdGguc3FydCggdGhpcy5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKSApOwoKICAgIAl9LAoKICAgIAlkaXN0YW5jZVNxVG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCiAgICAJCXZhciBkaXJlY3Rpb25EaXN0YW5jZSA9IF92ZWN0b3IkMy5zdWJWZWN0b3JzKCBwb2ludCwgdGhpcy5vcmlnaW4gKS5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CgogICAgCQkvLyBwb2ludCBiZWhpbmQgdGhlIHJheQoKICAgIAkJaWYgKCBkaXJlY3Rpb25EaXN0YW5jZSA8IDAgKSB7CgogICAgCQkJcmV0dXJuIHRoaXMub3JpZ2luLmRpc3RhbmNlVG9TcXVhcmVkKCBwb2ludCApOwoKICAgIAkJfQoKICAgIAkJX3ZlY3RvciQzLmNvcHkoIHRoaXMuZGlyZWN0aW9uICkubXVsdGlwbHlTY2FsYXIoIGRpcmVjdGlvbkRpc3RhbmNlICkuYWRkKCB0aGlzLm9yaWdpbiApOwoKICAgIAkJcmV0dXJuIF92ZWN0b3IkMy5kaXN0YW5jZVRvU3F1YXJlZCggcG9pbnQgKTsKCiAgICAJfSwKCiAgICAJZGlzdGFuY2VTcVRvU2VnbWVudDogZnVuY3Rpb24gKCB2MCwgdjEsIG9wdGlvbmFsUG9pbnRPblJheSwgb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHsKCiAgICAJCS8vIGZyb20gaHR0cDovL3d3dy5nZW9tZXRyaWN0b29scy5jb20vR1RFbmdpbmUvSW5jbHVkZS9NYXRoZW1hdGljcy9HdGVEaXN0UmF5U2VnbWVudC5oCiAgICAJCS8vIEl0IHJldHVybnMgdGhlIG1pbiBkaXN0YW5jZSBiZXR3ZWVuIHRoZSByYXkgYW5kIHRoZSBzZWdtZW50CiAgICAJCS8vIGRlZmluZWQgYnkgdjAgYW5kIHYxCiAgICAJCS8vIEl0IGNhbiBhbHNvIHNldCB0d28gb3B0aW9uYWwgdGFyZ2V0cyA6CiAgICAJCS8vIC0gVGhlIGNsb3Nlc3QgcG9pbnQgb24gdGhlIHJheQogICAgCQkvLyAtIFRoZSBjbG9zZXN0IHBvaW50IG9uIHRoZSBzZWdtZW50CgogICAgCQlfc2VnQ2VudGVyLmNvcHkoIHYwICkuYWRkKCB2MSApLm11bHRpcGx5U2NhbGFyKCAwLjUgKTsKICAgIAkJX3NlZ0Rpci5jb3B5KCB2MSApLnN1YiggdjAgKS5ub3JtYWxpemUoKTsKICAgIAkJX2RpZmYuY29weSggdGhpcy5vcmlnaW4gKS5zdWIoIF9zZWdDZW50ZXIgKTsKCiAgICAJCXZhciBzZWdFeHRlbnQgPSB2MC5kaXN0YW5jZVRvKCB2MSApICogMC41OwogICAgCQl2YXIgYTAxID0gLSB0aGlzLmRpcmVjdGlvbi5kb3QoIF9zZWdEaXIgKTsKICAgIAkJdmFyIGIwID0gX2RpZmYuZG90KCB0aGlzLmRpcmVjdGlvbiApOwogICAgCQl2YXIgYjEgPSAtIF9kaWZmLmRvdCggX3NlZ0RpciApOwogICAgCQl2YXIgYyA9IF9kaWZmLmxlbmd0aFNxKCk7CiAgICAJCXZhciBkZXQgPSBNYXRoLmFicyggMSAtIGEwMSAqIGEwMSApOwogICAgCQl2YXIgczAsIHMxLCBzcXJEaXN0LCBleHREZXQ7CgogICAgCQlpZiAoIGRldCA+IDAgKSB7CgogICAgCQkJLy8gVGhlIHJheSBhbmQgc2VnbWVudCBhcmUgbm90IHBhcmFsbGVsLgoKICAgIAkJCXMwID0gYTAxICogYjEgLSBiMDsKICAgIAkJCXMxID0gYTAxICogYjAgLSBiMTsKICAgIAkJCWV4dERldCA9IHNlZ0V4dGVudCAqIGRldDsKCiAgICAJCQlpZiAoIHMwID49IDAgKSB7CgogICAgCQkJCWlmICggczEgPj0gLSBleHREZXQgKSB7CgogICAgCQkJCQlpZiAoIHMxIDw9IGV4dERldCApIHsKCiAgICAJCQkJCQkvLyByZWdpb24gMAogICAgCQkJCQkJLy8gTWluaW11bSBhdCBpbnRlcmlvciBwb2ludHMgb2YgcmF5IGFuZCBzZWdtZW50LgoKICAgIAkJCQkJCXZhciBpbnZEZXQgPSAxIC8gZGV0OwogICAgCQkJCQkJczAgKj0gaW52RGV0OwogICAgCQkJCQkJczEgKj0gaW52RGV0OwogICAgCQkJCQkJc3FyRGlzdCA9IHMwICogKCBzMCArIGEwMSAqIHMxICsgMiAqIGIwICkgKyBzMSAqICggYTAxICogczAgKyBzMSArIDIgKiBiMSApICsgYzsKCiAgICAJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJLy8gcmVnaW9uIDEKCiAgICAJCQkJCQlzMSA9IHNlZ0V4dGVudDsKICAgIAkJCQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzMSArIGIwICkgKTsKICAgIAkJCQkJCXNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CgogICAgCQkJCQl9CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQkvLyByZWdpb24gNQoKICAgIAkJCQkJczEgPSAtIHNlZ0V4dGVudDsKICAgIAkJCQkJczAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApOwogICAgCQkJCQlzcXJEaXN0ID0gLSBzMCAqIHMwICsgczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJaWYgKCBzMSA8PSAtIGV4dERldCApIHsKCiAgICAJCQkJCS8vIHJlZ2lvbiA0CgogICAgCQkJCQlzMCA9IE1hdGgubWF4KCAwLCAtICggLSBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7CiAgICAJCQkJCXMxID0gKCBzMCA+IDAgKSA/IC0gc2VnRXh0ZW50IDogTWF0aC5taW4oIE1hdGgubWF4KCAtIHNlZ0V4dGVudCwgLSBiMSApLCBzZWdFeHRlbnQgKTsKICAgIAkJCQkJc3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYzsKCiAgICAJCQkJfSBlbHNlIGlmICggczEgPD0gZXh0RGV0ICkgewoKICAgIAkJCQkJLy8gcmVnaW9uIDMKCiAgICAJCQkJCXMwID0gMDsKICAgIAkJCQkJczEgPSBNYXRoLm1pbiggTWF0aC5tYXgoIC0gc2VnRXh0ZW50LCAtIGIxICksIHNlZ0V4dGVudCApOwogICAgCQkJCQlzcXJEaXN0ID0gczEgKiAoIHMxICsgMiAqIGIxICkgKyBjOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJLy8gcmVnaW9uIDIKCiAgICAJCQkJCXMwID0gTWF0aC5tYXgoIDAsIC0gKCBhMDEgKiBzZWdFeHRlbnQgKyBiMCApICk7CiAgICAJCQkJCXMxID0gKCBzMCA+IDAgKSA/IHNlZ0V4dGVudCA6IE1hdGgubWluKCBNYXRoLm1heCggLSBzZWdFeHRlbnQsIC0gYjEgKSwgc2VnRXh0ZW50ICk7CiAgICAJCQkJCXNxckRpc3QgPSAtIHMwICogczAgKyBzMSAqICggczEgKyAyICogYjEgKSArIGM7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIFJheSBhbmQgc2VnbWVudCBhcmUgcGFyYWxsZWwuCgogICAgCQkJczEgPSAoIGEwMSA+IDAgKSA/IC0gc2VnRXh0ZW50IDogc2VnRXh0ZW50OwogICAgCQkJczAgPSBNYXRoLm1heCggMCwgLSAoIGEwMSAqIHMxICsgYjAgKSApOwogICAgCQkJc3FyRGlzdCA9IC0gczAgKiBzMCArIHMxICogKCBzMSArIDIgKiBiMSApICsgYzsKCiAgICAJCX0KCiAgICAJCWlmICggb3B0aW9uYWxQb2ludE9uUmF5ICkgewoKICAgIAkJCW9wdGlvbmFsUG9pbnRPblJheS5jb3B5KCB0aGlzLmRpcmVjdGlvbiApLm11bHRpcGx5U2NhbGFyKCBzMCApLmFkZCggdGhpcy5vcmlnaW4gKTsKCiAgICAJCX0KCiAgICAJCWlmICggb3B0aW9uYWxQb2ludE9uU2VnbWVudCApIHsKCiAgICAJCQlvcHRpb25hbFBvaW50T25TZWdtZW50LmNvcHkoIF9zZWdEaXIgKS5tdWx0aXBseVNjYWxhciggczEgKS5hZGQoIF9zZWdDZW50ZXIgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBzcXJEaXN0OwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlLCB0YXJnZXQgKSB7CgogICAgCQlfdmVjdG9yJDMuc3ViVmVjdG9ycyggc3BoZXJlLmNlbnRlciwgdGhpcy5vcmlnaW4gKTsKICAgIAkJdmFyIHRjYSA9IF92ZWN0b3IkMy5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CiAgICAJCXZhciBkMiA9IF92ZWN0b3IkMy5kb3QoIF92ZWN0b3IkMyApIC0gdGNhICogdGNhOwogICAgCQl2YXIgcmFkaXVzMiA9IHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzOwoKICAgIAkJaWYgKCBkMiA+IHJhZGl1czIgKSByZXR1cm4gbnVsbDsKCiAgICAJCXZhciB0aGMgPSBNYXRoLnNxcnQoIHJhZGl1czIgLSBkMiApOwoKICAgIAkJLy8gdDAgPSBmaXJzdCBpbnRlcnNlY3QgcG9pbnQgLSBlbnRyYW5jZSBvbiBmcm9udCBvZiBzcGhlcmUKICAgIAkJdmFyIHQwID0gdGNhIC0gdGhjOwoKICAgIAkJLy8gdDEgPSBzZWNvbmQgaW50ZXJzZWN0IHBvaW50IC0gZXhpdCBwb2ludCBvbiBiYWNrIG9mIHNwaGVyZQogICAgCQl2YXIgdDEgPSB0Y2EgKyB0aGM7CgogICAgCQkvLyB0ZXN0IHRvIHNlZSBpZiBib3RoIHQwIGFuZCB0MSBhcmUgYmVoaW5kIHRoZSByYXkgLSBpZiBzbywgcmV0dXJuIG51bGwKICAgIAkJaWYgKCB0MCA8IDAgJiYgdDEgPCAwICkgcmV0dXJuIG51bGw7CgogICAgCQkvLyB0ZXN0IHRvIHNlZSBpZiB0MCBpcyBiZWhpbmQgdGhlIHJheToKICAgIAkJLy8gaWYgaXQgaXMsIHRoZSByYXkgaXMgaW5zaWRlIHRoZSBzcGhlcmUsIHNvIHJldHVybiB0aGUgc2Vjb25kIGV4aXQgcG9pbnQgc2NhbGVkIGJ5IHQxLAogICAgCQkvLyBpbiBvcmRlciB0byBhbHdheXMgcmV0dXJuIGFuIGludGVyc2VjdCBwb2ludCB0aGF0IGlzIGluIGZyb250IG9mIHRoZSByYXkuCiAgICAJCWlmICggdDAgPCAwICkgcmV0dXJuIHRoaXMuYXQoIHQxLCB0YXJnZXQgKTsKCiAgICAJCS8vIGVsc2UgdDAgaXMgaW4gZnJvbnQgb2YgdGhlIHJheSwgc28gcmV0dXJuIHRoZSBmaXJzdCBjb2xsaXNpb24gcG9pbnQgc2NhbGVkIGJ5IHQwCiAgICAJCXJldHVybiB0aGlzLmF0KCB0MCwgdGFyZ2V0ICk7CgogICAgCX0sCgogICAgCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGlzdGFuY2VTcVRvUG9pbnQoIHNwaGVyZS5jZW50ZXIgKSA8PSAoIHNwaGVyZS5yYWRpdXMgKiBzcGhlcmUucmFkaXVzICk7CgogICAgCX0sCgogICAgCWRpc3RhbmNlVG9QbGFuZTogZnVuY3Rpb24gKCBwbGFuZSApIHsKCiAgICAJCXZhciBkZW5vbWluYXRvciA9IHBsYW5lLm5vcm1hbC5kb3QoIHRoaXMuZGlyZWN0aW9uICk7CgogICAgCQlpZiAoIGRlbm9taW5hdG9yID09PSAwICkgewoKICAgIAkJCS8vIGxpbmUgaXMgY29wbGFuYXIsIHJldHVybiBvcmlnaW4KICAgIAkJCWlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCB0aGlzLm9yaWdpbiApID09PSAwICkgewoKICAgIAkJCQlyZXR1cm4gMDsKCiAgICAJCQl9CgogICAgCQkJLy8gTnVsbCBpcyBwcmVmZXJhYmxlIHRvIHVuZGVmaW5lZCBzaW5jZSB1bmRlZmluZWQgbWVhbnMuLi4uIGl0IGlzIHVuZGVmaW5lZAoKICAgIAkJCXJldHVybiBudWxsOwoKICAgIAkJfQoKICAgIAkJdmFyIHQgPSAtICggdGhpcy5vcmlnaW4uZG90KCBwbGFuZS5ub3JtYWwgKSArIHBsYW5lLmNvbnN0YW50ICkgLyBkZW5vbWluYXRvcjsKCiAgICAJCS8vIFJldHVybiBpZiB0aGUgcmF5IG5ldmVyIGludGVyc2VjdHMgdGhlIHBsYW5lCgogICAgCQlyZXR1cm4gdCA+PSAwID8gdCA6IG51bGw7CgogICAgCX0sCgogICAgCWludGVyc2VjdFBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lLCB0YXJnZXQgKSB7CgogICAgCQl2YXIgdCA9IHRoaXMuZGlzdGFuY2VUb1BsYW5lKCBwbGFuZSApOwoKICAgIAkJaWYgKCB0ID09PSBudWxsICkgewoKICAgIAkJCXJldHVybiBudWxsOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXMuYXQoIHQsIHRhcmdldCApOwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RzUGxhbmU6IGZ1bmN0aW9uICggcGxhbmUgKSB7CgogICAgCQkvLyBjaGVjayBpZiB0aGUgcmF5IGxpZXMgb24gdGhlIHBsYW5lIGZpcnN0CgogICAgCQl2YXIgZGlzdFRvUG9pbnQgPSBwbGFuZS5kaXN0YW5jZVRvUG9pbnQoIHRoaXMub3JpZ2luICk7CgogICAgCQlpZiAoIGRpc3RUb1BvaW50ID09PSAwICkgewoKICAgIAkJCXJldHVybiB0cnVlOwoKICAgIAkJfQoKICAgIAkJdmFyIGRlbm9taW5hdG9yID0gcGxhbmUubm9ybWFsLmRvdCggdGhpcy5kaXJlY3Rpb24gKTsKCiAgICAJCWlmICggZGVub21pbmF0b3IgKiBkaXN0VG9Qb2ludCA8IDAgKSB7CgogICAgCQkJcmV0dXJuIHRydWU7CgogICAgCQl9CgogICAgCQkvLyByYXkgb3JpZ2luIGlzIGJlaGluZCB0aGUgcGxhbmUgKGFuZCBpcyBwb2ludGluZyBiZWhpbmQgaXQpCgogICAgCQlyZXR1cm4gZmFsc2U7CgogICAgCX0sCgogICAgCWludGVyc2VjdEJveDogZnVuY3Rpb24gKCBib3gsIHRhcmdldCApIHsKCiAgICAJCXZhciB0bWluLCB0bWF4LCB0eW1pbiwgdHltYXgsIHR6bWluLCB0em1heDsKCiAgICAJCXZhciBpbnZkaXJ4ID0gMSAvIHRoaXMuZGlyZWN0aW9uLngsCiAgICAJCQlpbnZkaXJ5ID0gMSAvIHRoaXMuZGlyZWN0aW9uLnksCiAgICAJCQlpbnZkaXJ6ID0gMSAvIHRoaXMuZGlyZWN0aW9uLno7CgogICAgCQl2YXIgb3JpZ2luID0gdGhpcy5vcmlnaW47CgogICAgCQlpZiAoIGludmRpcnggPj0gMCApIHsKCiAgICAJCQl0bWluID0gKCBib3gubWluLnggLSBvcmlnaW4ueCApICogaW52ZGlyeDsKICAgIAkJCXRtYXggPSAoIGJveC5tYXgueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4OwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0bWluID0gKCBib3gubWF4LnggLSBvcmlnaW4ueCApICogaW52ZGlyeDsKICAgIAkJCXRtYXggPSAoIGJveC5taW4ueCAtIG9yaWdpbi54ICkgKiBpbnZkaXJ4OwoKICAgIAkJfQoKICAgIAkJaWYgKCBpbnZkaXJ5ID49IDAgKSB7CgogICAgCQkJdHltaW4gPSAoIGJveC5taW4ueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5OwogICAgCQkJdHltYXggPSAoIGJveC5tYXgueSAtIG9yaWdpbi55ICkgKiBpbnZkaXJ5OwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0eW1pbiA9ICggYm94Lm1heC55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CiAgICAJCQl0eW1heCA9ICggYm94Lm1pbi55IC0gb3JpZ2luLnkgKSAqIGludmRpcnk7CgogICAgCQl9CgogICAgCQlpZiAoICggdG1pbiA+IHR5bWF4ICkgfHwgKCB0eW1pbiA+IHRtYXggKSApIHJldHVybiBudWxsOwoKICAgIAkJLy8gVGhlc2UgbGluZXMgYWxzbyBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdG1pbiBvciB0bWF4IGlzIE5hTgogICAgCQkvLyAocmVzdWx0IG9mIDAgKiBJbmZpbml0eSkuIHggIT09IHggcmV0dXJucyB0cnVlIGlmIHggaXMgTmFOCgogICAgCQlpZiAoIHR5bWluID4gdG1pbiB8fCB0bWluICE9PSB0bWluICkgdG1pbiA9IHR5bWluOwoKICAgIAkJaWYgKCB0eW1heCA8IHRtYXggfHwgdG1heCAhPT0gdG1heCApIHRtYXggPSB0eW1heDsKCiAgICAJCWlmICggaW52ZGlyeiA+PSAwICkgewoKICAgIAkJCXR6bWluID0gKCBib3gubWluLnogLSBvcmlnaW4ueiApICogaW52ZGlyejsKICAgIAkJCXR6bWF4ID0gKCBib3gubWF4LnogLSBvcmlnaW4ueiApICogaW52ZGlyejsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdHptaW4gPSAoIGJveC5tYXgueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OwogICAgCQkJdHptYXggPSAoIGJveC5taW4ueiAtIG9yaWdpbi56ICkgKiBpbnZkaXJ6OwoKICAgIAkJfQoKICAgIAkJaWYgKCAoIHRtaW4gPiB0em1heCApIHx8ICggdHptaW4gPiB0bWF4ICkgKSByZXR1cm4gbnVsbDsKCiAgICAJCWlmICggdHptaW4gPiB0bWluIHx8IHRtaW4gIT09IHRtaW4gKSB0bWluID0gdHptaW47CgogICAgCQlpZiAoIHR6bWF4IDwgdG1heCB8fCB0bWF4ICE9PSB0bWF4ICkgdG1heCA9IHR6bWF4OwoKICAgIAkJLy9yZXR1cm4gcG9pbnQgY2xvc2VzdCB0byB0aGUgcmF5IChwb3NpdGl2ZSBzaWRlKQoKICAgIAkJaWYgKCB0bWF4IDwgMCApIHJldHVybiBudWxsOwoKICAgIAkJcmV0dXJuIHRoaXMuYXQoIHRtaW4gPj0gMCA/IHRtaW4gOiB0bWF4LCB0YXJnZXQgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7CgogICAgCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3RCb3goIGJveCwgX3ZlY3RvciQzICkgIT09IG51bGw7CgogICAgCX0sCgogICAgCWludGVyc2VjdFRyaWFuZ2xlOiBmdW5jdGlvbiAoIGEsIGIsIGMsIGJhY2tmYWNlQ3VsbGluZywgdGFyZ2V0ICkgewoKICAgIAkJLy8gQ29tcHV0ZSB0aGUgb2Zmc2V0IG9yaWdpbiwgZWRnZXMsIGFuZCBub3JtYWwuCgogICAgCQkvLyBmcm9tIGh0dHA6Ly93d3cuZ2VvbWV0cmljdG9vbHMuY29tL0dURW5naW5lL0luY2x1ZGUvTWF0aGVtYXRpY3MvR3RlSW50clJheTNUcmlhbmdsZTMuaAoKICAgIAkJX2VkZ2UxLnN1YlZlY3RvcnMoIGIsIGEgKTsKICAgIAkJX2VkZ2UyLnN1YlZlY3RvcnMoIGMsIGEgKTsKICAgIAkJX25vcm1hbC5jcm9zc1ZlY3RvcnMoIF9lZGdlMSwgX2VkZ2UyICk7CgogICAgCQkvLyBTb2x2ZSBRICsgdCpEID0gYjEqRTEgKyBiMipFMiAoUSA9IGtEaWZmLCBEID0gcmF5IGRpcmVjdGlvbiwKICAgIAkJLy8gRTEgPSBrRWRnZTEsIEUyID0ga0VkZ2UyLCBOID0gQ3Jvc3MoRTEsRTIpKSBieQogICAgCQkvLyAgIHxEb3QoRCxOKXwqYjEgPSBzaWduKERvdChELE4pKSpEb3QoRCxDcm9zcyhRLEUyKSkKICAgIAkJLy8gICB8RG90KEQsTil8KmIyID0gc2lnbihEb3QoRCxOKSkqRG90KEQsQ3Jvc3MoRTEsUSkpCiAgICAJCS8vICAgfERvdChELE4pfCp0ID0gLXNpZ24oRG90KEQsTikpKkRvdChRLE4pCiAgICAJCXZhciBEZE4gPSB0aGlzLmRpcmVjdGlvbi5kb3QoIF9ub3JtYWwgKTsKICAgIAkJdmFyIHNpZ247CgogICAgCQlpZiAoIERkTiA+IDAgKSB7CgogICAgCQkJaWYgKCBiYWNrZmFjZUN1bGxpbmcgKSByZXR1cm4gbnVsbDsKICAgIAkJCXNpZ24gPSAxOwoKICAgIAkJfSBlbHNlIGlmICggRGROIDwgMCApIHsKCiAgICAJCQlzaWduID0gLSAxOwogICAgCQkJRGROID0gLSBEZE47CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXJldHVybiBudWxsOwoKICAgIAkJfQoKICAgIAkJX2RpZmYuc3ViVmVjdG9ycyggdGhpcy5vcmlnaW4sIGEgKTsKICAgIAkJdmFyIERkUXhFMiA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMi5jcm9zc1ZlY3RvcnMoIF9kaWZmLCBfZWRnZTIgKSApOwoKICAgIAkJLy8gYjEgPCAwLCBubyBpbnRlcnNlY3Rpb24KICAgIAkJaWYgKCBEZFF4RTIgPCAwICkgewoKICAgIAkJCXJldHVybiBudWxsOwoKICAgIAkJfQoKICAgIAkJdmFyIERkRTF4USA9IHNpZ24gKiB0aGlzLmRpcmVjdGlvbi5kb3QoIF9lZGdlMS5jcm9zcyggX2RpZmYgKSApOwoKICAgIAkJLy8gYjIgPCAwLCBubyBpbnRlcnNlY3Rpb24KICAgIAkJaWYgKCBEZEUxeFEgPCAwICkgewoKICAgIAkJCXJldHVybiBudWxsOwoKICAgIAkJfQoKICAgIAkJLy8gYjErYjIgPiAxLCBubyBpbnRlcnNlY3Rpb24KICAgIAkJaWYgKCBEZFF4RTIgKyBEZEUxeFEgPiBEZE4gKSB7CgogICAgCQkJcmV0dXJuIG51bGw7CgogICAgCQl9CgogICAgCQkvLyBMaW5lIGludGVyc2VjdHMgdHJpYW5nbGUsIGNoZWNrIGlmIHJheSBkb2VzLgogICAgCQl2YXIgUWROID0gLSBzaWduICogX2RpZmYuZG90KCBfbm9ybWFsICk7CgogICAgCQkvLyB0IDwgMCwgbm8gaW50ZXJzZWN0aW9uCiAgICAJCWlmICggUWROIDwgMCApIHsKCiAgICAJCQlyZXR1cm4gbnVsbDsKCiAgICAJCX0KCiAgICAJCS8vIFJheSBpbnRlcnNlY3RzIHRyaWFuZ2xlLgogICAgCQlyZXR1cm4gdGhpcy5hdCggUWROIC8gRGROLCB0YXJnZXQgKTsKCiAgICAJfSwKCiAgICAJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeDQgKSB7CgogICAgCQl0aGlzLm9yaWdpbi5hcHBseU1hdHJpeDQoIG1hdHJpeDQgKTsKICAgIAkJdGhpcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXg0ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIHJheSApIHsKCiAgICAJCXJldHVybiByYXkub3JpZ2luLmVxdWFscyggdGhpcy5vcmlnaW4gKSAmJiByYXkuZGlyZWN0aW9uLmVxdWFscyggdGhpcy5kaXJlY3Rpb24gKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICB2YXIgX3YwJDEgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF92MSQzID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfdjIkMSA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3YzID0gbmV3IFZlY3RvcjMoKTsKCiAgICB2YXIgX3ZhYiA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3ZhYyA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3ZiYyA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3ZhcCA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3ZicCA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3ZjcCA9IG5ldyBWZWN0b3IzKCk7CgogICAgZnVuY3Rpb24gVHJpYW5nbGUoIGEsIGIsIGMgKSB7CgogICAgCXRoaXMuYSA9ICggYSAhPT0gdW5kZWZpbmVkICkgPyBhIDogbmV3IFZlY3RvcjMoKTsKICAgIAl0aGlzLmIgPSAoIGIgIT09IHVuZGVmaW5lZCApID8gYiA6IG5ldyBWZWN0b3IzKCk7CiAgICAJdGhpcy5jID0gKCBjICE9PSB1bmRlZmluZWQgKSA/IGMgOiBuZXcgVmVjdG9yMygpOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBUcmlhbmdsZSwgewoKICAgIAlnZXROb3JtYWw6IGZ1bmN0aW9uICggYSwgYiwgYywgdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE5vcm1hbCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJfQoKICAgIAkJdGFyZ2V0LnN1YlZlY3RvcnMoIGMsIGIgKTsKICAgIAkJX3YwJDEuc3ViVmVjdG9ycyggYSwgYiApOwogICAgCQl0YXJnZXQuY3Jvc3MoIF92MCQxICk7CgogICAgCQl2YXIgdGFyZ2V0TGVuZ3RoU3EgPSB0YXJnZXQubGVuZ3RoU3EoKTsKICAgIAkJaWYgKCB0YXJnZXRMZW5ndGhTcSA+IDAgKSB7CgogICAgCQkJcmV0dXJuIHRhcmdldC5tdWx0aXBseVNjYWxhciggMSAvIE1hdGguc3FydCggdGFyZ2V0TGVuZ3RoU3EgKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5zZXQoIDAsIDAsIDAgKTsKCiAgICAJfSwKCiAgICAJLy8gc3RhdGljL2luc3RhbmNlIG1ldGhvZCB0byBjYWxjdWxhdGUgYmFyeWNlbnRyaWMgY29vcmRpbmF0ZXMKICAgIAkvLyBiYXNlZCBvbjogaHR0cDovL3d3dy5ibGFja3Bhd24uY29tL3RleHRzL3BvaW50aW5wb2x5L2RlZmF1bHQuaHRtbAogICAgCWdldEJhcnljb29yZDogZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYywgdGFyZ2V0ICkgewoKICAgIAkJX3YwJDEuc3ViVmVjdG9ycyggYywgYSApOwogICAgCQlfdjEkMy5zdWJWZWN0b3JzKCBiLCBhICk7CiAgICAJCV92MiQxLnN1YlZlY3RvcnMoIHBvaW50LCBhICk7CgogICAgCQl2YXIgZG90MDAgPSBfdjAkMS5kb3QoIF92MCQxICk7CiAgICAJCXZhciBkb3QwMSA9IF92MCQxLmRvdCggX3YxJDMgKTsKICAgIAkJdmFyIGRvdDAyID0gX3YwJDEuZG90KCBfdjIkMSApOwogICAgCQl2YXIgZG90MTEgPSBfdjEkMy5kb3QoIF92MSQzICk7CiAgICAJCXZhciBkb3QxMiA9IF92MSQzLmRvdCggX3YyJDEgKTsKCiAgICAJCXZhciBkZW5vbSA9ICggZG90MDAgKiBkb3QxMSAtIGRvdDAxICogZG90MDEgKTsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5nZXRCYXJ5Y29vcmQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCS8vIGNvbGxpbmVhciBvciBzaW5ndWxhciB0cmlhbmdsZQogICAgCQlpZiAoIGRlbm9tID09PSAwICkgewoKICAgIAkJCS8vIGFyYml0cmFyeSBsb2NhdGlvbiBvdXRzaWRlIG9mIHRyaWFuZ2xlPwogICAgCQkJLy8gbm90IHN1cmUgaWYgdGhpcyBpcyB0aGUgYmVzdCBpZGVhLCBtYXliZSBzaG91bGQgYmUgcmV0dXJuaW5nIHVuZGVmaW5lZAogICAgCQkJcmV0dXJuIHRhcmdldC5zZXQoIC0gMiwgLSAxLCAtIDEgKTsKCiAgICAJCX0KCiAgICAJCXZhciBpbnZEZW5vbSA9IDEgLyBkZW5vbTsKICAgIAkJdmFyIHUgPSAoIGRvdDExICogZG90MDIgLSBkb3QwMSAqIGRvdDEyICkgKiBpbnZEZW5vbTsKICAgIAkJdmFyIHYgPSAoIGRvdDAwICogZG90MTIgLSBkb3QwMSAqIGRvdDAyICkgKiBpbnZEZW5vbTsKCiAgICAJCS8vIGJhcnljZW50cmljIGNvb3JkaW5hdGVzIG11c3QgYWx3YXlzIHN1bSB0byAxCiAgICAJCXJldHVybiB0YXJnZXQuc2V0KCAxIC0gdSAtIHYsIHYsIHUgKTsKCiAgICAJfSwKCiAgICAJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCwgYSwgYiwgYyApIHsKCiAgICAJCVRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIF92MyApOwoKICAgIAkJcmV0dXJuICggX3YzLnggPj0gMCApICYmICggX3YzLnkgPj0gMCApICYmICggKCBfdjMueCArIF92My55ICkgPD0gMSApOwoKICAgIAl9LAoKICAgIAlnZXRVVjogZnVuY3Rpb24gKCBwb2ludCwgcDEsIHAyLCBwMywgdXYxLCB1djIsIHV2MywgdGFyZ2V0ICkgewoKICAgIAkJdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCBwMSwgcDIsIHAzLCBfdjMgKTsKCiAgICAJCXRhcmdldC5zZXQoIDAsIDAgKTsKICAgIAkJdGFyZ2V0LmFkZFNjYWxlZFZlY3RvciggdXYxLCBfdjMueCApOwogICAgCQl0YXJnZXQuYWRkU2NhbGVkVmVjdG9yKCB1djIsIF92My55ICk7CiAgICAJCXRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIHV2MywgX3YzLnogKTsKCiAgICAJCXJldHVybiB0YXJnZXQ7CgogICAgCX0sCgogICAgCWlzRnJvbnRGYWNpbmc6IGZ1bmN0aW9uICggYSwgYiwgYywgZGlyZWN0aW9uICkgewoKICAgIAkJX3YwJDEuc3ViVmVjdG9ycyggYywgYiApOwogICAgCQlfdjEkMy5zdWJWZWN0b3JzKCBhLCBiICk7CgogICAgCQkvLyBzdHJpY3RseSBmcm9udCBmYWNpbmcKICAgIAkJcmV0dXJuICggX3YwJDEuY3Jvc3MoIF92MSQzICkuZG90KCBkaXJlY3Rpb24gKSA8IDAgKSA/IHRydWUgOiBmYWxzZTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBUcmlhbmdsZS5wcm90b3R5cGUsIHsKCiAgICAJc2V0OiBmdW5jdGlvbiAoIGEsIGIsIGMgKSB7CgogICAgCQl0aGlzLmEuY29weSggYSApOwogICAgCQl0aGlzLmIuY29weSggYiApOwogICAgCQl0aGlzLmMuY29weSggYyApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21Qb2ludHNBbmRJbmRpY2VzOiBmdW5jdGlvbiAoIHBvaW50cywgaTAsIGkxLCBpMiApIHsKCiAgICAJCXRoaXMuYS5jb3B5KCBwb2ludHNbIGkwIF0gKTsKICAgIAkJdGhpcy5iLmNvcHkoIHBvaW50c1sgaTEgXSApOwogICAgCQl0aGlzLmMuY29weSggcG9pbnRzWyBpMiBdICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCB0cmlhbmdsZSApIHsKCiAgICAJCXRoaXMuYS5jb3B5KCB0cmlhbmdsZS5hICk7CiAgICAJCXRoaXMuYi5jb3B5KCB0cmlhbmdsZS5iICk7CiAgICAJCXRoaXMuYy5jb3B5KCB0cmlhbmdsZS5jICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0QXJlYTogZnVuY3Rpb24gKCkgewoKICAgIAkJX3YwJDEuc3ViVmVjdG9ycyggdGhpcy5jLCB0aGlzLmIgKTsKICAgIAkJX3YxJDMuc3ViVmVjdG9ycyggdGhpcy5hLCB0aGlzLmIgKTsKCiAgICAJCXJldHVybiBfdjAkMS5jcm9zcyggX3YxJDMgKS5sZW5ndGgoKSAqIDAuNTsKCiAgICAJfSwKCiAgICAJZ2V0TWlkcG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmdldE1pZHBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuYSwgdGhpcy5iICkuYWRkKCB0aGlzLmMgKS5tdWx0aXBseVNjYWxhciggMSAvIDMgKTsKCiAgICAJfSwKCiAgICAJZ2V0Tm9ybWFsOiBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCXJldHVybiBUcmlhbmdsZS5nZXROb3JtYWwoIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApOwoKICAgIAl9LAoKICAgIAlnZXRQbGFuZTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuZ2V0UGxhbmUoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0YXJnZXQuc2V0RnJvbUNvcGxhbmFyUG9pbnRzKCB0aGlzLmEsIHRoaXMuYiwgdGhpcy5jICk7CgogICAgCX0sCgogICAgCWdldEJhcnljb29yZDogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkgewoKICAgIAkJcmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMsIHRhcmdldCApOwoKICAgIAl9LAoKICAgIAlnZXRVVjogZnVuY3Rpb24gKCBwb2ludCwgdXYxLCB1djIsIHV2MywgdGFyZ2V0ICkgewoKICAgIAkJcmV0dXJuIFRyaWFuZ2xlLmdldFVWKCBwb2ludCwgdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgdXYxLCB1djIsIHV2MywgdGFyZ2V0ICk7CgogICAgCX0sCgogICAgCWNvbnRhaW5zUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgogICAgCQlyZXR1cm4gVHJpYW5nbGUuY29udGFpbnNQb2ludCggcG9pbnQsIHRoaXMuYSwgdGhpcy5iLCB0aGlzLmMgKTsKCiAgICAJfSwKCiAgICAJaXNGcm9udEZhY2luZzogZnVuY3Rpb24gKCBkaXJlY3Rpb24gKSB7CgogICAgCQlyZXR1cm4gVHJpYW5nbGUuaXNGcm9udEZhY2luZyggdGhpcy5hLCB0aGlzLmIsIHRoaXMuYywgZGlyZWN0aW9uICk7CgogICAgCX0sCgogICAgCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgewoKICAgIAkJcmV0dXJuIGJveC5pbnRlcnNlY3RzVHJpYW5nbGUoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwLCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuY2xvc2VzdFBvaW50VG9Qb2ludCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJfQoKICAgIAkJdmFyIGEgPSB0aGlzLmEsIGIgPSB0aGlzLmIsIGMgPSB0aGlzLmM7CiAgICAJCXZhciB2LCB3OwoKICAgIAkJLy8gYWxnb3JpdGhtIHRoYW5rcyB0byBSZWFsLVRpbWUgQ29sbGlzaW9uIERldGVjdGlvbiBieSBDaHJpc3RlciBFcmljc29uLAogICAgCQkvLyBwdWJsaXNoZWQgYnkgTW9yZ2FuIEthdWZtYW5uIFB1Ymxpc2hlcnMsIChjKSAyMDA1IEVsc2V2aWVyIEluYy4sCiAgICAJCS8vIHVuZGVyIHRoZSBhY2NvbXBhbnlpbmcgbGljZW5zZTsgc2VlIGNoYXB0ZXIgNS4xLjUgZm9yIGRldGFpbGVkIGV4cGxhbmF0aW9uLgogICAgCQkvLyBiYXNpY2FsbHksIHdlJ3JlIGRpc3Rpbmd1aXNoaW5nIHdoaWNoIG9mIHRoZSB2b3Jvbm9pIHJlZ2lvbnMgb2YgdGhlIHRyaWFuZ2xlCiAgICAJCS8vIHRoZSBwb2ludCBsaWVzIGluIHdpdGggdGhlIG1pbmltdW0gYW1vdW50IG9mIHJlZHVuZGFudCBjb21wdXRhdGlvbi4KCiAgICAJCV92YWIuc3ViVmVjdG9ycyggYiwgYSApOwogICAgCQlfdmFjLnN1YlZlY3RvcnMoIGMsIGEgKTsKICAgIAkJX3ZhcC5zdWJWZWN0b3JzKCBwLCBhICk7CiAgICAJCXZhciBkMSA9IF92YWIuZG90KCBfdmFwICk7CiAgICAJCXZhciBkMiA9IF92YWMuZG90KCBfdmFwICk7CiAgICAJCWlmICggZDEgPD0gMCAmJiBkMiA8PSAwICkgewoKICAgIAkJCS8vIHZlcnRleCByZWdpb24gb2YgQTsgYmFyeWNlbnRyaWMgY29vcmRzICgxLCAwLCAwKQogICAgCQkJcmV0dXJuIHRhcmdldC5jb3B5KCBhICk7CgogICAgCQl9CgogICAgCQlfdmJwLnN1YlZlY3RvcnMoIHAsIGIgKTsKICAgIAkJdmFyIGQzID0gX3ZhYi5kb3QoIF92YnAgKTsKICAgIAkJdmFyIGQ0ID0gX3ZhYy5kb3QoIF92YnAgKTsKICAgIAkJaWYgKCBkMyA+PSAwICYmIGQ0IDw9IGQzICkgewoKICAgIAkJCS8vIHZlcnRleCByZWdpb24gb2YgQjsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAxLCAwKQogICAgCQkJcmV0dXJuIHRhcmdldC5jb3B5KCBiICk7CgogICAgCQl9CgogICAgCQl2YXIgdmMgPSBkMSAqIGQ0IC0gZDMgKiBkMjsKICAgIAkJaWYgKCB2YyA8PSAwICYmIGQxID49IDAgJiYgZDMgPD0gMCApIHsKCiAgICAJCQl2ID0gZDEgLyAoIGQxIC0gZDMgKTsKICAgIAkJCS8vIGVkZ2UgcmVnaW9uIG9mIEFCOyBiYXJ5Y2VudHJpYyBjb29yZHMgKDEtdiwgdiwgMCkKICAgIAkJCXJldHVybiB0YXJnZXQuY29weSggYSApLmFkZFNjYWxlZFZlY3RvciggX3ZhYiwgdiApOwoKICAgIAkJfQoKICAgIAkJX3ZjcC5zdWJWZWN0b3JzKCBwLCBjICk7CiAgICAJCXZhciBkNSA9IF92YWIuZG90KCBfdmNwICk7CiAgICAJCXZhciBkNiA9IF92YWMuZG90KCBfdmNwICk7CiAgICAJCWlmICggZDYgPj0gMCAmJiBkNSA8PSBkNiApIHsKCiAgICAJCQkvLyB2ZXJ0ZXggcmVnaW9uIG9mIEM7IGJhcnljZW50cmljIGNvb3JkcyAoMCwgMCwgMSkKICAgIAkJCXJldHVybiB0YXJnZXQuY29weSggYyApOwoKICAgIAkJfQoKICAgIAkJdmFyIHZiID0gZDUgKiBkMiAtIGQxICogZDY7CiAgICAJCWlmICggdmIgPD0gMCAmJiBkMiA+PSAwICYmIGQ2IDw9IDAgKSB7CgogICAgCQkJdyA9IGQyIC8gKCBkMiAtIGQ2ICk7CiAgICAJCQkvLyBlZGdlIHJlZ2lvbiBvZiBBQzsgYmFyeWNlbnRyaWMgY29vcmRzICgxLXcsIDAsIHcpCiAgICAJCQlyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWMsIHcgKTsKCiAgICAJCX0KCiAgICAJCXZhciB2YSA9IGQzICogZDYgLSBkNSAqIGQ0OwogICAgCQlpZiAoIHZhIDw9IDAgJiYgKCBkNCAtIGQzICkgPj0gMCAmJiAoIGQ1IC0gZDYgKSA+PSAwICkgewoKICAgIAkJCV92YmMuc3ViVmVjdG9ycyggYywgYiApOwogICAgCQkJdyA9ICggZDQgLSBkMyApIC8gKCAoIGQ0IC0gZDMgKSArICggZDUgLSBkNiApICk7CiAgICAJCQkvLyBlZGdlIHJlZ2lvbiBvZiBCQzsgYmFyeWNlbnRyaWMgY29vcmRzICgwLCAxLXcsIHcpCiAgICAJCQlyZXR1cm4gdGFyZ2V0LmNvcHkoIGIgKS5hZGRTY2FsZWRWZWN0b3IoIF92YmMsIHcgKTsgLy8gZWRnZSByZWdpb24gb2YgQkMKCiAgICAJCX0KCiAgICAJCS8vIGZhY2UgcmVnaW9uCiAgICAJCXZhciBkZW5vbSA9IDEgLyAoIHZhICsgdmIgKyB2YyApOwogICAgCQkvLyB1ID0gdmEgKiBkZW5vbQogICAgCQl2ID0gdmIgKiBkZW5vbTsKICAgIAkJdyA9IHZjICogZGVub207CgogICAgCQlyZXR1cm4gdGFyZ2V0LmNvcHkoIGEgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWIsIHYgKS5hZGRTY2FsZWRWZWN0b3IoIF92YWMsIHcgKTsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIHRyaWFuZ2xlICkgewoKICAgIAkJcmV0dXJuIHRyaWFuZ2xlLmEuZXF1YWxzKCB0aGlzLmEgKSAmJiB0cmlhbmdsZS5iLmVxdWFscyggdGhpcy5iICkgJiYgdHJpYW5nbGUuYy5lcXVhbHMoIHRoaXMuYyApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBfY29sb3JLZXl3b3JkcyA9IHsgJ2FsaWNlYmx1ZSc6IDB4RjBGOEZGLCAnYW50aXF1ZXdoaXRlJzogMHhGQUVCRDcsICdhcXVhJzogMHgwMEZGRkYsICdhcXVhbWFyaW5lJzogMHg3RkZGRDQsICdhenVyZSc6IDB4RjBGRkZGLAogICAgCSdiZWlnZSc6IDB4RjVGNURDLCAnYmlzcXVlJzogMHhGRkU0QzQsICdibGFjayc6IDB4MDAwMDAwLCAnYmxhbmNoZWRhbG1vbmQnOiAweEZGRUJDRCwgJ2JsdWUnOiAweDAwMDBGRiwgJ2JsdWV2aW9sZXQnOiAweDhBMkJFMiwKICAgIAknYnJvd24nOiAweEE1MkEyQSwgJ2J1cmx5d29vZCc6IDB4REVCODg3LCAnY2FkZXRibHVlJzogMHg1RjlFQTAsICdjaGFydHJldXNlJzogMHg3RkZGMDAsICdjaG9jb2xhdGUnOiAweEQyNjkxRSwgJ2NvcmFsJzogMHhGRjdGNTAsCiAgICAJJ2Nvcm5mbG93ZXJibHVlJzogMHg2NDk1RUQsICdjb3Juc2lsayc6IDB4RkZGOERDLCAnY3JpbXNvbic6IDB4REMxNDNDLCAnY3lhbic6IDB4MDBGRkZGLCAnZGFya2JsdWUnOiAweDAwMDA4QiwgJ2RhcmtjeWFuJzogMHgwMDhCOEIsCiAgICAJJ2Rhcmtnb2xkZW5yb2QnOiAweEI4ODYwQiwgJ2RhcmtncmF5JzogMHhBOUE5QTksICdkYXJrZ3JlZW4nOiAweDAwNjQwMCwgJ2RhcmtncmV5JzogMHhBOUE5QTksICdkYXJra2hha2knOiAweEJEQjc2QiwgJ2RhcmttYWdlbnRhJzogMHg4QjAwOEIsCiAgICAJJ2RhcmtvbGl2ZWdyZWVuJzogMHg1NTZCMkYsICdkYXJrb3JhbmdlJzogMHhGRjhDMDAsICdkYXJrb3JjaGlkJzogMHg5OTMyQ0MsICdkYXJrcmVkJzogMHg4QjAwMDAsICdkYXJrc2FsbW9uJzogMHhFOTk2N0EsICdkYXJrc2VhZ3JlZW4nOiAweDhGQkM4RiwKICAgIAknZGFya3NsYXRlYmx1ZSc6IDB4NDgzRDhCLCAnZGFya3NsYXRlZ3JheSc6IDB4MkY0RjRGLCAnZGFya3NsYXRlZ3JleSc6IDB4MkY0RjRGLCAnZGFya3R1cnF1b2lzZSc6IDB4MDBDRUQxLCAnZGFya3Zpb2xldCc6IDB4OTQwMEQzLAogICAgCSdkZWVwcGluayc6IDB4RkYxNDkzLCAnZGVlcHNreWJsdWUnOiAweDAwQkZGRiwgJ2RpbWdyYXknOiAweDY5Njk2OSwgJ2RpbWdyZXknOiAweDY5Njk2OSwgJ2RvZGdlcmJsdWUnOiAweDFFOTBGRiwgJ2ZpcmVicmljayc6IDB4QjIyMjIyLAogICAgCSdmbG9yYWx3aGl0ZSc6IDB4RkZGQUYwLCAnZm9yZXN0Z3JlZW4nOiAweDIyOEIyMiwgJ2Z1Y2hzaWEnOiAweEZGMDBGRiwgJ2dhaW5zYm9ybyc6IDB4RENEQ0RDLCAnZ2hvc3R3aGl0ZSc6IDB4RjhGOEZGLCAnZ29sZCc6IDB4RkZENzAwLAogICAgCSdnb2xkZW5yb2QnOiAweERBQTUyMCwgJ2dyYXknOiAweDgwODA4MCwgJ2dyZWVuJzogMHgwMDgwMDAsICdncmVlbnllbGxvdyc6IDB4QURGRjJGLCAnZ3JleSc6IDB4ODA4MDgwLCAnaG9uZXlkZXcnOiAweEYwRkZGMCwgJ2hvdHBpbmsnOiAweEZGNjlCNCwKICAgIAknaW5kaWFucmVkJzogMHhDRDVDNUMsICdpbmRpZ28nOiAweDRCMDA4MiwgJ2l2b3J5JzogMHhGRkZGRjAsICdraGFraSc6IDB4RjBFNjhDLCAnbGF2ZW5kZXInOiAweEU2RTZGQSwgJ2xhdmVuZGVyYmx1c2gnOiAweEZGRjBGNSwgJ2xhd25ncmVlbic6IDB4N0NGQzAwLAogICAgCSdsZW1vbmNoaWZmb24nOiAweEZGRkFDRCwgJ2xpZ2h0Ymx1ZSc6IDB4QUREOEU2LCAnbGlnaHRjb3JhbCc6IDB4RjA4MDgwLCAnbGlnaHRjeWFuJzogMHhFMEZGRkYsICdsaWdodGdvbGRlbnJvZHllbGxvdyc6IDB4RkFGQUQyLCAnbGlnaHRncmF5JzogMHhEM0QzRDMsCiAgICAJJ2xpZ2h0Z3JlZW4nOiAweDkwRUU5MCwgJ2xpZ2h0Z3JleSc6IDB4RDNEM0QzLCAnbGlnaHRwaW5rJzogMHhGRkI2QzEsICdsaWdodHNhbG1vbic6IDB4RkZBMDdBLCAnbGlnaHRzZWFncmVlbic6IDB4MjBCMkFBLCAnbGlnaHRza3libHVlJzogMHg4N0NFRkEsCiAgICAJJ2xpZ2h0c2xhdGVncmF5JzogMHg3Nzg4OTksICdsaWdodHNsYXRlZ3JleSc6IDB4Nzc4ODk5LCAnbGlnaHRzdGVlbGJsdWUnOiAweEIwQzRERSwgJ2xpZ2h0eWVsbG93JzogMHhGRkZGRTAsICdsaW1lJzogMHgwMEZGMDAsICdsaW1lZ3JlZW4nOiAweDMyQ0QzMiwKICAgIAknbGluZW4nOiAweEZBRjBFNiwgJ21hZ2VudGEnOiAweEZGMDBGRiwgJ21hcm9vbic6IDB4ODAwMDAwLCAnbWVkaXVtYXF1YW1hcmluZSc6IDB4NjZDREFBLCAnbWVkaXVtYmx1ZSc6IDB4MDAwMENELCAnbWVkaXVtb3JjaGlkJzogMHhCQTU1RDMsCiAgICAJJ21lZGl1bXB1cnBsZSc6IDB4OTM3MERCLCAnbWVkaXVtc2VhZ3JlZW4nOiAweDNDQjM3MSwgJ21lZGl1bXNsYXRlYmx1ZSc6IDB4N0I2OEVFLCAnbWVkaXVtc3ByaW5nZ3JlZW4nOiAweDAwRkE5QSwgJ21lZGl1bXR1cnF1b2lzZSc6IDB4NDhEMUNDLAogICAgCSdtZWRpdW12aW9sZXRyZWQnOiAweEM3MTU4NSwgJ21pZG5pZ2h0Ymx1ZSc6IDB4MTkxOTcwLCAnbWludGNyZWFtJzogMHhGNUZGRkEsICdtaXN0eXJvc2UnOiAweEZGRTRFMSwgJ21vY2Nhc2luJzogMHhGRkU0QjUsICduYXZham93aGl0ZSc6IDB4RkZERUFELAogICAgCSduYXZ5JzogMHgwMDAwODAsICdvbGRsYWNlJzogMHhGREY1RTYsICdvbGl2ZSc6IDB4ODA4MDAwLCAnb2xpdmVkcmFiJzogMHg2QjhFMjMsICdvcmFuZ2UnOiAweEZGQTUwMCwgJ29yYW5nZXJlZCc6IDB4RkY0NTAwLCAnb3JjaGlkJzogMHhEQTcwRDYsCiAgICAJJ3BhbGVnb2xkZW5yb2QnOiAweEVFRThBQSwgJ3BhbGVncmVlbic6IDB4OThGQjk4LCAncGFsZXR1cnF1b2lzZSc6IDB4QUZFRUVFLCAncGFsZXZpb2xldHJlZCc6IDB4REI3MDkzLCAncGFwYXlhd2hpcCc6IDB4RkZFRkQ1LCAncGVhY2hwdWZmJzogMHhGRkRBQjksCiAgICAJJ3BlcnUnOiAweENEODUzRiwgJ3BpbmsnOiAweEZGQzBDQiwgJ3BsdW0nOiAweEREQTBERCwgJ3Bvd2RlcmJsdWUnOiAweEIwRTBFNiwgJ3B1cnBsZSc6IDB4ODAwMDgwLCAncmViZWNjYXB1cnBsZSc6IDB4NjYzMzk5LCAncmVkJzogMHhGRjAwMDAsICdyb3N5YnJvd24nOiAweEJDOEY4RiwKICAgIAkncm95YWxibHVlJzogMHg0MTY5RTEsICdzYWRkbGVicm93bic6IDB4OEI0NTEzLCAnc2FsbW9uJzogMHhGQTgwNzIsICdzYW5keWJyb3duJzogMHhGNEE0NjAsICdzZWFncmVlbic6IDB4MkU4QjU3LCAnc2Vhc2hlbGwnOiAweEZGRjVFRSwKICAgIAknc2llbm5hJzogMHhBMDUyMkQsICdzaWx2ZXInOiAweEMwQzBDMCwgJ3NreWJsdWUnOiAweDg3Q0VFQiwgJ3NsYXRlYmx1ZSc6IDB4NkE1QUNELCAnc2xhdGVncmF5JzogMHg3MDgwOTAsICdzbGF0ZWdyZXknOiAweDcwODA5MCwgJ3Nub3cnOiAweEZGRkFGQSwKICAgIAknc3ByaW5nZ3JlZW4nOiAweDAwRkY3RiwgJ3N0ZWVsYmx1ZSc6IDB4NDY4MkI0LCAndGFuJzogMHhEMkI0OEMsICd0ZWFsJzogMHgwMDgwODAsICd0aGlzdGxlJzogMHhEOEJGRDgsICd0b21hdG8nOiAweEZGNjM0NywgJ3R1cnF1b2lzZSc6IDB4NDBFMEQwLAogICAgCSd2aW9sZXQnOiAweEVFODJFRSwgJ3doZWF0JzogMHhGNURFQjMsICd3aGl0ZSc6IDB4RkZGRkZGLCAnd2hpdGVzbW9rZSc6IDB4RjVGNUY1LCAneWVsbG93JzogMHhGRkZGMDAsICd5ZWxsb3dncmVlbic6IDB4OUFDRDMyIH07CgogICAgdmFyIF9oc2xBID0geyBoOiAwLCBzOiAwLCBsOiAwIH07CiAgICB2YXIgX2hzbEIgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTsKCiAgICBmdW5jdGlvbiBDb2xvciQ3KCByLCBnLCBiICkgewoKICAgIAlpZiAoIGcgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkvLyByIGlzIFRIUkVFLkNvbG9yLCBoZXggb3Igc3RyaW5nCiAgICAJCXJldHVybiB0aGlzLnNldCggciApOwoKICAgIAl9CgogICAgCXJldHVybiB0aGlzLnNldFJHQiggciwgZywgYiApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBodWUycmdiKCBwLCBxLCB0ICkgewoKICAgIAlpZiAoIHQgPCAwICkgdCArPSAxOwogICAgCWlmICggdCA+IDEgKSB0IC09IDE7CiAgICAJaWYgKCB0IDwgMSAvIDYgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiB0OwogICAgCWlmICggdCA8IDEgLyAyICkgcmV0dXJuIHE7CiAgICAJaWYgKCB0IDwgMiAvIDMgKSByZXR1cm4gcCArICggcSAtIHAgKSAqIDYgKiAoIDIgLyAzIC0gdCApOwogICAgCXJldHVybiBwOwoKICAgIH0KCiAgICBmdW5jdGlvbiBTUkdCVG9MaW5lYXIoIGMgKSB7CgogICAgCXJldHVybiAoIGMgPCAwLjA0MDQ1ICkgPyBjICogMC4wNzczOTkzODA4IDogTWF0aC5wb3coIGMgKiAwLjk0Nzg2NzI5ODYgKyAwLjA1MjEzMjcwMTQsIDIuNCApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBMaW5lYXJUb1NSR0IoIGMgKSB7CgogICAgCXJldHVybiAoIGMgPCAwLjAwMzEzMDggKSA/IGMgKiAxMi45MiA6IDEuMDU1ICogKCBNYXRoLnBvdyggYywgMC40MTY2NiApICkgLSAwLjA1NTsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggQ29sb3IkNy5wcm90b3R5cGUsIHsKCiAgICAJaXNDb2xvcjogdHJ1ZSwKCiAgICAJcjogMSwgZzogMSwgYjogMSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkgewoKICAgIAkJCXRoaXMuY29weSggdmFsdWUgKTsKCiAgICAJCX0gZWxzZSBpZiAoIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgKSB7CgogICAgCQkJdGhpcy5zZXRIZXgoIHZhbHVlICk7CgogICAgCQl9IGVsc2UgaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkgewoKICAgIAkJCXRoaXMuc2V0U3R5bGUoIHZhbHVlICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0U2NhbGFyOiBmdW5jdGlvbiAoIHNjYWxhciApIHsKCiAgICAJCXRoaXMuciA9IHNjYWxhcjsKICAgIAkJdGhpcy5nID0gc2NhbGFyOwogICAgCQl0aGlzLmIgPSBzY2FsYXI7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0SGV4OiBmdW5jdGlvbiAoIGhleCApIHsKCiAgICAJCWhleCA9IE1hdGguZmxvb3IoIGhleCApOwoKICAgIAkJdGhpcy5yID0gKCBoZXggPj4gMTYgJiAyNTUgKSAvIDI1NTsKICAgIAkJdGhpcy5nID0gKCBoZXggPj4gOCAmIDI1NSApIC8gMjU1OwogICAgCQl0aGlzLmIgPSAoIGhleCAmIDI1NSApIC8gMjU1OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFJHQjogZnVuY3Rpb24gKCByLCBnLCBiICkgewoKICAgIAkJdGhpcy5yID0gcjsKICAgIAkJdGhpcy5nID0gZzsKICAgIAkJdGhpcy5iID0gYjsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRIU0w6IGZ1bmN0aW9uICggaCwgcywgbCApIHsKCiAgICAJCS8vIGgscyxsIHJhbmdlcyBhcmUgaW4gMC4wIC0gMS4wCiAgICAJCWggPSBfTWF0aC5ldWNsaWRlYW5Nb2R1bG8oIGgsIDEgKTsKICAgIAkJcyA9IF9NYXRoLmNsYW1wKCBzLCAwLCAxICk7CiAgICAJCWwgPSBfTWF0aC5jbGFtcCggbCwgMCwgMSApOwoKICAgIAkJaWYgKCBzID09PSAwICkgewoKICAgIAkJCXRoaXMuciA9IHRoaXMuZyA9IHRoaXMuYiA9IGw7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXZhciBwID0gbCA8PSAwLjUgPyBsICogKCAxICsgcyApIDogbCArIHMgLSAoIGwgKiBzICk7CiAgICAJCQl2YXIgcSA9ICggMiAqIGwgKSAtIHA7CgogICAgCQkJdGhpcy5yID0gaHVlMnJnYiggcSwgcCwgaCArIDEgLyAzICk7CiAgICAJCQl0aGlzLmcgPSBodWUycmdiKCBxLCBwLCBoICk7CiAgICAJCQl0aGlzLmIgPSBodWUycmdiKCBxLCBwLCBoIC0gMSAvIDMgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRTdHlsZTogZnVuY3Rpb24gKCBzdHlsZSApIHsKCiAgICAJCWZ1bmN0aW9uIGhhbmRsZUFscGhhKCBzdHJpbmcgKSB7CgogICAgCQkJaWYgKCBzdHJpbmcgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCiAgICAJCQlpZiAoIHBhcnNlRmxvYXQoIHN0cmluZyApIDwgMSApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ29sb3I6IEFscGhhIGNvbXBvbmVudCBvZiAnICsgc3R5bGUgKyAnIHdpbGwgYmUgaWdub3JlZC4nICk7CgogICAgCQkJfQoKICAgIAkJfQoKCiAgICAJCXZhciBtOwoKICAgIAkJaWYgKCBtID0gL14oKD86cmdifGhzbClhPylcKFxzKihbXlwpXSopXCkvLmV4ZWMoIHN0eWxlICkgKSB7CgogICAgCQkJLy8gcmdiIC8gaHNsCgogICAgCQkJdmFyIGNvbG9yOwogICAgCQkJdmFyIG5hbWUgPSBtWyAxIF07CiAgICAJCQl2YXIgY29tcG9uZW50cyA9IG1bIDIgXTsKCiAgICAJCQlzd2l0Y2ggKCBuYW1lICkgewoKICAgIAkJCQljYXNlICdyZ2InOgogICAgCQkJCWNhc2UgJ3JnYmEnOgoKICAgIAkJCQkJaWYgKCBjb2xvciA9IC9eKFxkKylccyosXHMqKFxkKylccyosXHMqKFxkKylccyooLFxzKihbMC05XSpcLj9bMC05XSspXHMqKT8kLy5leGVjKCBjb21wb25lbnRzICkgKSB7CgogICAgCQkJCQkJLy8gcmdiKDI1NSwwLDApIHJnYmEoMjU1LDAsMCwwLjUpCiAgICAJCQkJCQl0aGlzLnIgPSBNYXRoLm1pbiggMjU1LCBwYXJzZUludCggY29sb3JbIDEgXSwgMTAgKSApIC8gMjU1OwogICAgCQkJCQkJdGhpcy5nID0gTWF0aC5taW4oIDI1NSwgcGFyc2VJbnQoIGNvbG9yWyAyIF0sIDEwICkgKSAvIDI1NTsKICAgIAkJCQkJCXRoaXMuYiA9IE1hdGgubWluKCAyNTUsIHBhcnNlSW50KCBjb2xvclsgMyBdLCAxMCApICkgLyAyNTU7CgogICAgCQkJCQkJaGFuZGxlQWxwaGEoIGNvbG9yWyA1IF0gKTsKCiAgICAJCQkJCQlyZXR1cm4gdGhpczsKCiAgICAJCQkJCX0KCiAgICAJCQkJCWlmICggY29sb3IgPSAvXihcZCspXCVccyosXHMqKFxkKylcJVxzKixccyooXGQrKVwlXHMqKCxccyooWzAtOV0qXC4/WzAtOV0rKVxzKik/JC8uZXhlYyggY29tcG9uZW50cyApICkgewoKICAgIAkJCQkJCS8vIHJnYigxMDAlLDAlLDAlKSByZ2JhKDEwMCUsMCUsMCUsMC41KQogICAgCQkJCQkJdGhpcy5yID0gTWF0aC5taW4oIDEwMCwgcGFyc2VJbnQoIGNvbG9yWyAxIF0sIDEwICkgKSAvIDEwMDsKICAgIAkJCQkJCXRoaXMuZyA9IE1hdGgubWluKCAxMDAsIHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApICkgLyAxMDA7CiAgICAJCQkJCQl0aGlzLmIgPSBNYXRoLm1pbiggMTAwLCBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSApIC8gMTAwOwoKICAgIAkJCQkJCWhhbmRsZUFscGhhKCBjb2xvclsgNSBdICk7CgogICAgCQkJCQkJcmV0dXJuIHRoaXM7CgogICAgCQkJCQl9CgogICAgCQkJCQlicmVhazsKCiAgICAJCQkJY2FzZSAnaHNsJzoKICAgIAkJCQljYXNlICdoc2xhJzoKCiAgICAJCQkJCWlmICggY29sb3IgPSAvXihbMC05XSpcLj9bMC05XSspXHMqLFxzKihcZCspXCVccyosXHMqKFxkKylcJVxzKigsXHMqKFswLTldKlwuP1swLTldKylccyopPyQvLmV4ZWMoIGNvbXBvbmVudHMgKSApIHsKCiAgICAJCQkJCQkvLyBoc2woMTIwLDUwJSw1MCUpIGhzbGEoMTIwLDUwJSw1MCUsMC41KQogICAgCQkJCQkJdmFyIGggPSBwYXJzZUZsb2F0KCBjb2xvclsgMSBdICkgLyAzNjA7CiAgICAJCQkJCQl2YXIgcyA9IHBhcnNlSW50KCBjb2xvclsgMiBdLCAxMCApIC8gMTAwOwogICAgCQkJCQkJdmFyIGwgPSBwYXJzZUludCggY29sb3JbIDMgXSwgMTAgKSAvIDEwMDsKCiAgICAJCQkJCQloYW5kbGVBbHBoYSggY29sb3JbIDUgXSApOwoKICAgIAkJCQkJCXJldHVybiB0aGlzLnNldEhTTCggaCwgcywgbCApOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIGlmICggbSA9IC9eXCMoW0EtRmEtZjAtOV0rKSQvLmV4ZWMoIHN0eWxlICkgKSB7CgogICAgCQkJLy8gaGV4IGNvbG9yCgogICAgCQkJdmFyIGhleCA9IG1bIDEgXTsKICAgIAkJCXZhciBzaXplID0gaGV4Lmxlbmd0aDsKCiAgICAJCQlpZiAoIHNpemUgPT09IDMgKSB7CgogICAgCQkJCS8vICNmZjAKICAgIAkJCQl0aGlzLnIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggMCApICsgaGV4LmNoYXJBdCggMCApLCAxNiApIC8gMjU1OwogICAgCQkJCXRoaXMuZyA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAxICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7CiAgICAJCQkJdGhpcy5iID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDIgKSwgMTYgKSAvIDI1NTsKCiAgICAJCQkJcmV0dXJuIHRoaXM7CgogICAgCQkJfSBlbHNlIGlmICggc2l6ZSA9PT0gNiApIHsKCiAgICAJCQkJLy8gI2ZmMDAwMAogICAgCQkJCXRoaXMuciA9IHBhcnNlSW50KCBoZXguY2hhckF0KCAwICkgKyBoZXguY2hhckF0KCAxICksIDE2ICkgLyAyNTU7CiAgICAJCQkJdGhpcy5nID0gcGFyc2VJbnQoIGhleC5jaGFyQXQoIDIgKSArIGhleC5jaGFyQXQoIDMgKSwgMTYgKSAvIDI1NTsKICAgIAkJCQl0aGlzLmIgPSBwYXJzZUludCggaGV4LmNoYXJBdCggNCApICsgaGV4LmNoYXJBdCggNSApLCAxNiApIC8gMjU1OwoKICAgIAkJCQlyZXR1cm4gdGhpczsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIHN0eWxlICYmIHN0eWxlLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJLy8gY29sb3Iga2V5d29yZHMKICAgIAkJCXZhciBoZXggPSBfY29sb3JLZXl3b3Jkc1sgc3R5bGUgXTsKCiAgICAJCQlpZiAoIGhleCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkvLyByZWQKICAgIAkJCQl0aGlzLnNldEhleCggaGV4ICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJLy8gdW5rbm93biBjb2xvcgogICAgCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkNvbG9yOiBVbmtub3duIGNvbG9yICcgKyBzdHlsZSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLnIsIHRoaXMuZywgdGhpcy5iICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggY29sb3IgKSB7CgogICAgCQl0aGlzLnIgPSBjb2xvci5yOwogICAgCQl0aGlzLmcgPSBjb2xvci5nOwogICAgCQl0aGlzLmIgPSBjb2xvci5iOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvcHlHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGNvbG9yLCBnYW1tYUZhY3RvciApIHsKCiAgICAJCWlmICggZ2FtbWFGYWN0b3IgPT09IHVuZGVmaW5lZCApIGdhbW1hRmFjdG9yID0gMi4wOwoKICAgIAkJdGhpcy5yID0gTWF0aC5wb3coIGNvbG9yLnIsIGdhbW1hRmFjdG9yICk7CiAgICAJCXRoaXMuZyA9IE1hdGgucG93KCBjb2xvci5nLCBnYW1tYUZhY3RvciApOwogICAgCQl0aGlzLmIgPSBNYXRoLnBvdyggY29sb3IuYiwgZ2FtbWFGYWN0b3IgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb3B5TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCBjb2xvciwgZ2FtbWFGYWN0b3IgKSB7CgogICAgCQlpZiAoIGdhbW1hRmFjdG9yID09PSB1bmRlZmluZWQgKSBnYW1tYUZhY3RvciA9IDIuMDsKCiAgICAJCXZhciBzYWZlSW52ZXJzZSA9ICggZ2FtbWFGYWN0b3IgPiAwICkgPyAoIDEuMCAvIGdhbW1hRmFjdG9yICkgOiAxLjA7CgogICAgCQl0aGlzLnIgPSBNYXRoLnBvdyggY29sb3Iuciwgc2FmZUludmVyc2UgKTsKICAgIAkJdGhpcy5nID0gTWF0aC5wb3coIGNvbG9yLmcsIHNhZmVJbnZlcnNlICk7CiAgICAJCXRoaXMuYiA9IE1hdGgucG93KCBjb2xvci5iLCBzYWZlSW52ZXJzZSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvbnZlcnRHYW1tYVRvTGluZWFyOiBmdW5jdGlvbiAoIGdhbW1hRmFjdG9yICkgewoKICAgIAkJdGhpcy5jb3B5R2FtbWFUb0xpbmVhciggdGhpcywgZ2FtbWFGYWN0b3IgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb252ZXJ0TGluZWFyVG9HYW1tYTogZnVuY3Rpb24gKCBnYW1tYUZhY3RvciApIHsKCiAgICAJCXRoaXMuY29weUxpbmVhclRvR2FtbWEoIHRoaXMsIGdhbW1hRmFjdG9yICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29weVNSR0JUb0xpbmVhcjogZnVuY3Rpb24gKCBjb2xvciApIHsKCiAgICAJCXRoaXMuciA9IFNSR0JUb0xpbmVhciggY29sb3IuciApOwogICAgCQl0aGlzLmcgPSBTUkdCVG9MaW5lYXIoIGNvbG9yLmcgKTsKICAgIAkJdGhpcy5iID0gU1JHQlRvTGluZWFyKCBjb2xvci5iICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29weUxpbmVhclRvU1JHQjogZnVuY3Rpb24gKCBjb2xvciApIHsKCiAgICAJCXRoaXMuciA9IExpbmVhclRvU1JHQiggY29sb3IuciApOwogICAgCQl0aGlzLmcgPSBMaW5lYXJUb1NSR0IoIGNvbG9yLmcgKTsKICAgIAkJdGhpcy5iID0gTGluZWFyVG9TUkdCKCBjb2xvci5iICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29udmVydFNSR0JUb0xpbmVhcjogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5jb3B5U1JHQlRvTGluZWFyKCB0aGlzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29udmVydExpbmVhclRvU1JHQjogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5jb3B5TGluZWFyVG9TUkdCKCB0aGlzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0SGV4OiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gKCB0aGlzLnIgKiAyNTUgKSA8PCAxNiBeICggdGhpcy5nICogMjU1ICkgPDwgOCBeICggdGhpcy5iICogMjU1ICkgPDwgMDsKCiAgICAJfSwKCiAgICAJZ2V0SGV4U3RyaW5nOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gKCAnMDAwMDAwJyArIHRoaXMuZ2V0SGV4KCkudG9TdHJpbmcoIDE2ICkgKS5zbGljZSggLSA2ICk7CgogICAgCX0sCgogICAgCWdldEhTTDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQkvLyBoLHMsbCByYW5nZXMgYXJlIGluIDAuMCAtIDEuMAoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5Db2xvcjogLmdldEhTTCgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSB7IGg6IDAsIHM6IDAsIGw6IDAgfTsKCiAgICAJCX0KCiAgICAJCXZhciByID0gdGhpcy5yLCBnID0gdGhpcy5nLCBiID0gdGhpcy5iOwoKICAgIAkJdmFyIG1heCA9IE1hdGgubWF4KCByLCBnLCBiICk7CiAgICAJCXZhciBtaW4gPSBNYXRoLm1pbiggciwgZywgYiApOwoKICAgIAkJdmFyIGh1ZSwgc2F0dXJhdGlvbjsKICAgIAkJdmFyIGxpZ2h0bmVzcyA9ICggbWluICsgbWF4ICkgLyAyLjA7CgogICAgCQlpZiAoIG1pbiA9PT0gbWF4ICkgewoKICAgIAkJCWh1ZSA9IDA7CiAgICAJCQlzYXR1cmF0aW9uID0gMDsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdmFyIGRlbHRhID0gbWF4IC0gbWluOwoKICAgIAkJCXNhdHVyYXRpb24gPSBsaWdodG5lc3MgPD0gMC41ID8gZGVsdGEgLyAoIG1heCArIG1pbiApIDogZGVsdGEgLyAoIDIgLSBtYXggLSBtaW4gKTsKCiAgICAJCQlzd2l0Y2ggKCBtYXggKSB7CgogICAgCQkJCWNhc2UgcjogaHVlID0gKCBnIC0gYiApIC8gZGVsdGEgKyAoIGcgPCBiID8gNiA6IDAgKTsgYnJlYWs7CiAgICAJCQkJY2FzZSBnOiBodWUgPSAoIGIgLSByICkgLyBkZWx0YSArIDI7IGJyZWFrOwogICAgCQkJCWNhc2UgYjogaHVlID0gKCByIC0gZyApIC8gZGVsdGEgKyA0OyBicmVhazsKCiAgICAJCQl9CgogICAgCQkJaHVlIC89IDY7CgogICAgCQl9CgogICAgCQl0YXJnZXQuaCA9IGh1ZTsKICAgIAkJdGFyZ2V0LnMgPSBzYXR1cmF0aW9uOwogICAgCQl0YXJnZXQubCA9IGxpZ2h0bmVzczsKCiAgICAJCXJldHVybiB0YXJnZXQ7CgogICAgCX0sCgogICAgCWdldFN0eWxlOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gJ3JnYignICsgKCAoIHRoaXMuciAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuZyAqIDI1NSApIHwgMCApICsgJywnICsgKCAoIHRoaXMuYiAqIDI1NSApIHwgMCApICsgJyknOwoKICAgIAl9LAoKICAgIAlvZmZzZXRIU0w6IGZ1bmN0aW9uICggaCwgcywgbCApIHsKCiAgICAJCXRoaXMuZ2V0SFNMKCBfaHNsQSApOwoKICAgIAkJX2hzbEEuaCArPSBoOyBfaHNsQS5zICs9IHM7IF9oc2xBLmwgKz0gbDsKCiAgICAJCXRoaXMuc2V0SFNMKCBfaHNsQS5oLCBfaHNsQS5zLCBfaHNsQS5sICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYWRkOiBmdW5jdGlvbiAoIGNvbG9yICkgewoKICAgIAkJdGhpcy5yICs9IGNvbG9yLnI7CiAgICAJCXRoaXMuZyArPSBjb2xvci5nOwogICAgCQl0aGlzLmIgKz0gY29sb3IuYjsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlhZGRDb2xvcnM6IGZ1bmN0aW9uICggY29sb3IxLCBjb2xvcjIgKSB7CgogICAgCQl0aGlzLnIgPSBjb2xvcjEuciArIGNvbG9yMi5yOwogICAgCQl0aGlzLmcgPSBjb2xvcjEuZyArIGNvbG9yMi5nOwogICAgCQl0aGlzLmIgPSBjb2xvcjEuYiArIGNvbG9yMi5iOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWFkZFNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdGhpcy5yICs9IHM7CiAgICAJCXRoaXMuZyArPSBzOwogICAgCQl0aGlzLmIgKz0gczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzdWI6IGZ1bmN0aW9uICggY29sb3IgKSB7CgogICAgCQl0aGlzLnIgPSBNYXRoLm1heCggMCwgdGhpcy5yIC0gY29sb3IuciApOwogICAgCQl0aGlzLmcgPSBNYXRoLm1heCggMCwgdGhpcy5nIC0gY29sb3IuZyApOwogICAgCQl0aGlzLmIgPSBNYXRoLm1heCggMCwgdGhpcy5iIC0gY29sb3IuYiApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW11bHRpcGx5OiBmdW5jdGlvbiAoIGNvbG9yICkgewoKICAgIAkJdGhpcy5yICo9IGNvbG9yLnI7CiAgICAJCXRoaXMuZyAqPSBjb2xvci5nOwogICAgCQl0aGlzLmIgKj0gY29sb3IuYjsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAltdWx0aXBseVNjYWxhcjogZnVuY3Rpb24gKCBzICkgewoKICAgIAkJdGhpcy5yICo9IHM7CiAgICAJCXRoaXMuZyAqPSBzOwogICAgCQl0aGlzLmIgKj0gczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlsZXJwOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHsKCiAgICAJCXRoaXMuciArPSAoIGNvbG9yLnIgLSB0aGlzLnIgKSAqIGFscGhhOwogICAgCQl0aGlzLmcgKz0gKCBjb2xvci5nIC0gdGhpcy5nICkgKiBhbHBoYTsKICAgIAkJdGhpcy5iICs9ICggY29sb3IuYiAtIHRoaXMuYiApICogYWxwaGE7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbGVycEhTTDogZnVuY3Rpb24gKCBjb2xvciwgYWxwaGEgKSB7CgogICAgCQl0aGlzLmdldEhTTCggX2hzbEEgKTsKICAgIAkJY29sb3IuZ2V0SFNMKCBfaHNsQiApOwoKICAgIAkJdmFyIGggPSBfTWF0aC5sZXJwKCBfaHNsQS5oLCBfaHNsQi5oLCBhbHBoYSApOwogICAgCQl2YXIgcyA9IF9NYXRoLmxlcnAoIF9oc2xBLnMsIF9oc2xCLnMsIGFscGhhICk7CiAgICAJCXZhciBsID0gX01hdGgubGVycCggX2hzbEEubCwgX2hzbEIubCwgYWxwaGEgKTsKCiAgICAJCXRoaXMuc2V0SFNMKCBoLCBzLCBsICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIGMgKSB7CgogICAgCQlyZXR1cm4gKCBjLnIgPT09IHRoaXMuciApICYmICggYy5nID09PSB0aGlzLmcgKSAmJiAoIGMuYiA9PT0gdGhpcy5iICk7CgogICAgCX0sCgogICAgCWZyb21BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgogICAgCQl0aGlzLnIgPSBhcnJheVsgb2Zmc2V0IF07CiAgICAJCXRoaXMuZyA9IGFycmF5WyBvZmZzZXQgKyAxIF07CiAgICAJCXRoaXMuYiA9IGFycmF5WyBvZmZzZXQgKyAyIF07CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9BcnJheTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJaWYgKCBhcnJheSA9PT0gdW5kZWZpbmVkICkgYXJyYXkgPSBbXTsKICAgIAkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgogICAgCQlhcnJheVsgb2Zmc2V0IF0gPSB0aGlzLnI7CiAgICAJCWFycmF5WyBvZmZzZXQgKyAxIF0gPSB0aGlzLmc7CiAgICAJCWFycmF5WyBvZmZzZXQgKyAyIF0gPSB0aGlzLmI7CgogICAgCQlyZXR1cm4gYXJyYXk7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuZ2V0SGV4KCk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIEZhY2UzKCBhLCBiLCBjLCBub3JtYWwsIGNvbG9yLCBtYXRlcmlhbEluZGV4ICkgewoKICAgIAl0aGlzLmEgPSBhOwogICAgCXRoaXMuYiA9IGI7CiAgICAJdGhpcy5jID0gYzsKCiAgICAJdGhpcy5ub3JtYWwgPSAoIG5vcm1hbCAmJiBub3JtYWwuaXNWZWN0b3IzICkgPyBub3JtYWwgOiBuZXcgVmVjdG9yMygpOwogICAgCXRoaXMudmVydGV4Tm9ybWFscyA9IEFycmF5LmlzQXJyYXkoIG5vcm1hbCApID8gbm9ybWFsIDogW107CgogICAgCXRoaXMuY29sb3IgPSAoIGNvbG9yICYmIGNvbG9yLmlzQ29sb3IgKSA/IGNvbG9yIDogbmV3IENvbG9yJDcoKTsKICAgIAl0aGlzLnZlcnRleENvbG9ycyA9IEFycmF5LmlzQXJyYXkoIGNvbG9yICkgPyBjb2xvciA6IFtdOwoKICAgIAl0aGlzLm1hdGVyaWFsSW5kZXggPSBtYXRlcmlhbEluZGV4ICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbEluZGV4IDogMDsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggRmFjZTMucHJvdG90eXBlLCB7CgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJdGhpcy5hID0gc291cmNlLmE7CiAgICAJCXRoaXMuYiA9IHNvdXJjZS5iOwogICAgCQl0aGlzLmMgPSBzb3VyY2UuYzsKCiAgICAJCXRoaXMubm9ybWFsLmNvcHkoIHNvdXJjZS5ub3JtYWwgKTsKICAgIAkJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKCiAgICAJCXRoaXMubWF0ZXJpYWxJbmRleCA9IHNvdXJjZS5tYXRlcmlhbEluZGV4OwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXRoaXMudmVydGV4Tm9ybWFsc1sgaSBdID0gc291cmNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdGhpcy52ZXJ0ZXhDb2xvcnNbIGkgXSA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnNbIGkgXS5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIHZhciBtYXRlcmlhbElkID0gMDsKCiAgICBmdW5jdGlvbiBNYXRlcmlhbCgpIHsKCiAgICAJT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAnaWQnLCB7IHZhbHVlOiBtYXRlcmlhbElkICsrIH0gKTsKCiAgICAJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgogICAgCXRoaXMubmFtZSA9ICcnOwogICAgCXRoaXMudHlwZSA9ICdNYXRlcmlhbCc7CgogICAgCXRoaXMuZm9nID0gdHJ1ZTsKICAgIAl0aGlzLmxpZ2h0cyA9IHRydWU7CgogICAgCXRoaXMuYmxlbmRpbmcgPSBOb3JtYWxCbGVuZGluZzsKICAgIAl0aGlzLnNpZGUgPSBGcm9udFNpZGU7CiAgICAJdGhpcy5mbGF0U2hhZGluZyA9IGZhbHNlOwogICAgCXRoaXMudmVydGV4VGFuZ2VudHMgPSBmYWxzZTsKICAgIAl0aGlzLnZlcnRleENvbG9ycyA9IE5vQ29sb3JzOyAvLyBUSFJFRS5Ob0NvbG9ycywgVEhSRUUuVmVydGV4Q29sb3JzLCBUSFJFRS5GYWNlQ29sb3JzCgogICAgCXRoaXMub3BhY2l0eSA9IDE7CiAgICAJdGhpcy50cmFuc3BhcmVudCA9IGZhbHNlOwoKICAgIAl0aGlzLmJsZW5kU3JjID0gU3JjQWxwaGFGYWN0b3I7CiAgICAJdGhpcy5ibGVuZERzdCA9IE9uZU1pbnVzU3JjQWxwaGFGYWN0b3I7CiAgICAJdGhpcy5ibGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247CiAgICAJdGhpcy5ibGVuZFNyY0FscGhhID0gbnVsbDsKICAgIAl0aGlzLmJsZW5kRHN0QWxwaGEgPSBudWxsOwogICAgCXRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gbnVsbDsKCiAgICAJdGhpcy5kZXB0aEZ1bmMgPSBMZXNzRXF1YWxEZXB0aDsKICAgIAl0aGlzLmRlcHRoVGVzdCA9IHRydWU7CiAgICAJdGhpcy5kZXB0aFdyaXRlID0gdHJ1ZTsKCiAgICAJdGhpcy5zdGVuY2lsRnVuYyA9IEFsd2F5c1N0ZW5jaWxGdW5jOwogICAgCXRoaXMuc3RlbmNpbFJlZiA9IDA7CiAgICAJdGhpcy5zdGVuY2lsTWFzayA9IDB4ZmY7CiAgICAJdGhpcy5zdGVuY2lsRmFpbCA9IEtlZXBTdGVuY2lsT3A7CiAgICAJdGhpcy5zdGVuY2lsWkZhaWwgPSBLZWVwU3RlbmNpbE9wOwogICAgCXRoaXMuc3RlbmNpbFpQYXNzID0gS2VlcFN0ZW5jaWxPcDsKICAgIAl0aGlzLnN0ZW5jaWxXcml0ZSA9IGZhbHNlOwoKICAgIAl0aGlzLmNsaXBwaW5nUGxhbmVzID0gbnVsbDsKICAgIAl0aGlzLmNsaXBJbnRlcnNlY3Rpb24gPSBmYWxzZTsKICAgIAl0aGlzLmNsaXBTaGFkb3dzID0gZmFsc2U7CgogICAgCXRoaXMuc2hhZG93U2lkZSA9IG51bGw7CgogICAgCXRoaXMuY29sb3JXcml0ZSA9IHRydWU7CgogICAgCXRoaXMucHJlY2lzaW9uID0gbnVsbDsgLy8gb3ZlcnJpZGUgdGhlIHJlbmRlcmVyJ3MgZGVmYXVsdCBwcmVjaXNpb24gZm9yIHRoaXMgbWF0ZXJpYWwKCiAgICAJdGhpcy5wb2x5Z29uT2Zmc2V0ID0gZmFsc2U7CiAgICAJdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gMDsKICAgIAl0aGlzLnBvbHlnb25PZmZzZXRVbml0cyA9IDA7CgogICAgCXRoaXMuZGl0aGVyaW5nID0gZmFsc2U7CgogICAgCXRoaXMuYWxwaGFUZXN0ID0gMDsKICAgIAl0aGlzLnByZW11bHRpcGxpZWRBbHBoYSA9IGZhbHNlOwoKICAgIAl0aGlzLnZpc2libGUgPSB0cnVlOwoKICAgIAl0aGlzLnRvbmVNYXBwZWQgPSB0cnVlOwoKICAgIAl0aGlzLnVzZXJEYXRhID0ge307CgogICAgCXRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIH0KCiAgICBNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBFdmVudERpc3BhdGNoZXIucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IE1hdGVyaWFsLAoKICAgIAlpc01hdGVyaWFsOiB0cnVlLAoKICAgIAlvbkJlZm9yZUNvbXBpbGU6IGZ1bmN0aW9uICgpIHt9LAoKICAgIAlzZXRWYWx1ZXM6IGZ1bmN0aW9uICggdmFsdWVzICkgewoKICAgIAkJaWYgKCB2YWx1ZXMgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCiAgICAJCWZvciAoIHZhciBrZXkgaW4gdmFsdWVzICkgewoKICAgIAkJCXZhciBuZXdWYWx1ZSA9IHZhbHVlc1sga2V5IF07CgogICAgCQkJaWYgKCBuZXdWYWx1ZSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICJUSFJFRS5NYXRlcmlhbDogJyIgKyBrZXkgKyAiJyBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkLiIgKTsKICAgIAkJCQljb250aW51ZTsKCiAgICAJCQl9CgogICAgCQkJLy8gZm9yIGJhY2t3YXJkIGNvbXBhdGFiaWxpdHkgaWYgc2hhZGluZyBpcyBzZXQgaW4gdGhlIGNvbnN0cnVjdG9yCiAgICAJCQlpZiAoIGtleSA9PT0gJ3NoYWRpbmcnICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS4nICsgdGhpcy50eXBlICsgJzogLnNoYWRpbmcgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIHRoZSBib29sZWFuIC5mbGF0U2hhZGluZyBpbnN0ZWFkLicgKTsKICAgIAkJCQl0aGlzLmZsYXRTaGFkaW5nID0gKCBuZXdWYWx1ZSA9PT0gRmxhdFNoYWRpbmcgKSA/IHRydWUgOiBmYWxzZTsKICAgIAkJCQljb250aW51ZTsKCiAgICAJCQl9CgogICAgCQkJdmFyIGN1cnJlbnRWYWx1ZSA9IHRoaXNbIGtleSBdOwoKICAgIAkJCWlmICggY3VycmVudFZhbHVlID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggIlRIUkVFLiIgKyB0aGlzLnR5cGUgKyAiOiAnIiArIGtleSArICInIGlzIG5vdCBhIHByb3BlcnR5IG9mIHRoaXMgbWF0ZXJpYWwuIiApOwogICAgCQkJCWNvbnRpbnVlOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNDb2xvciApIHsKCiAgICAJCQkJY3VycmVudFZhbHVlLnNldCggbmV3VmFsdWUgKTsKCiAgICAJCQl9IGVsc2UgaWYgKCAoIGN1cnJlbnRWYWx1ZSAmJiBjdXJyZW50VmFsdWUuaXNWZWN0b3IzICkgJiYgKCBuZXdWYWx1ZSAmJiBuZXdWYWx1ZS5pc1ZlY3RvcjMgKSApIHsKCiAgICAJCQkJY3VycmVudFZhbHVlLmNvcHkoIG5ld1ZhbHVlICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdGhpc1sga2V5IF0gPSBuZXdWYWx1ZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgewoKICAgIAkJdmFyIGlzUm9vdCA9ICggbWV0YSA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJyApOwoKICAgIAkJaWYgKCBpc1Jvb3QgKSB7CgogICAgCQkJbWV0YSA9IHsKICAgIAkJCQl0ZXh0dXJlczoge30sCiAgICAJCQkJaW1hZ2VzOiB7fQogICAgCQkJfTsKCiAgICAJCX0KCiAgICAJCXZhciBkYXRhID0gewogICAgCQkJbWV0YWRhdGE6IHsKICAgIAkJCQl2ZXJzaW9uOiA0LjUsCiAgICAJCQkJdHlwZTogJ01hdGVyaWFsJywKICAgIAkJCQlnZW5lcmF0b3I6ICdNYXRlcmlhbC50b0pTT04nCiAgICAJCQl9CiAgICAJCX07CgogICAgCQkvLyBzdGFuZGFyZCBNYXRlcmlhbCBzZXJpYWxpemF0aW9uCiAgICAJCWRhdGEudXVpZCA9IHRoaXMudXVpZDsKICAgIAkJZGF0YS50eXBlID0gdGhpcy50eXBlOwoKICAgIAkJaWYgKCB0aGlzLm5hbWUgIT09ICcnICkgZGF0YS5uYW1lID0gdGhpcy5uYW1lOwoKICAgIAkJaWYgKCB0aGlzLmNvbG9yICYmIHRoaXMuY29sb3IuaXNDb2xvciApIGRhdGEuY29sb3IgPSB0aGlzLmNvbG9yLmdldEhleCgpOwoKICAgIAkJaWYgKCB0aGlzLnJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5yb3VnaG5lc3MgPSB0aGlzLnJvdWdobmVzczsKICAgIAkJaWYgKCB0aGlzLm1ldGFsbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5tZXRhbG5lc3MgPSB0aGlzLm1ldGFsbmVzczsKCiAgICAJCWlmICggdGhpcy5lbWlzc2l2ZSAmJiB0aGlzLmVtaXNzaXZlLmlzQ29sb3IgKSBkYXRhLmVtaXNzaXZlID0gdGhpcy5lbWlzc2l2ZS5nZXRIZXgoKTsKICAgIAkJaWYgKCB0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ICYmIHRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgIT09IDEgKSBkYXRhLmVtaXNzaXZlSW50ZW5zaXR5ID0gdGhpcy5lbWlzc2l2ZUludGVuc2l0eTsKCiAgICAJCWlmICggdGhpcy5zcGVjdWxhciAmJiB0aGlzLnNwZWN1bGFyLmlzQ29sb3IgKSBkYXRhLnNwZWN1bGFyID0gdGhpcy5zcGVjdWxhci5nZXRIZXgoKTsKICAgIAkJaWYgKCB0aGlzLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5zaGluaW5lc3MgPSB0aGlzLnNoaW5pbmVzczsKICAgIAkJaWYgKCB0aGlzLmNsZWFyY29hdCAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhcmNvYXQgPSB0aGlzLmNsZWFyY29hdDsKICAgIAkJaWYgKCB0aGlzLmNsZWFyY29hdFJvdWdobmVzcyAhPT0gdW5kZWZpbmVkICkgZGF0YS5jbGVhcmNvYXRSb3VnaG5lc3MgPSB0aGlzLmNsZWFyY29hdFJvdWdobmVzczsKCiAgICAJCWlmICggdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgJiYgdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAuaXNUZXh0dXJlICkgewoKICAgIAkJCWRhdGEuY2xlYXJjb2F0Tm9ybWFsTWFwID0gdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJCWRhdGEuY2xlYXJjb2F0Tm9ybWFsU2NhbGUgPSB0aGlzLmNsZWFyY29hdE5vcm1hbFNjYWxlLnRvQXJyYXkoKTsKCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5tYXAgJiYgdGhpcy5tYXAuaXNUZXh0dXJlICkgZGF0YS5tYXAgPSB0aGlzLm1hcC50b0pTT04oIG1ldGEgKS51dWlkOwogICAgCQlpZiAoIHRoaXMubWF0Y2FwICYmIHRoaXMubWF0Y2FwLmlzVGV4dHVyZSApIGRhdGEubWF0Y2FwID0gdGhpcy5tYXRjYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJaWYgKCB0aGlzLmFscGhhTWFwICYmIHRoaXMuYWxwaGFNYXAuaXNUZXh0dXJlICkgZGF0YS5hbHBoYU1hcCA9IHRoaXMuYWxwaGFNYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJaWYgKCB0aGlzLmxpZ2h0TWFwICYmIHRoaXMubGlnaHRNYXAuaXNUZXh0dXJlICkgZGF0YS5saWdodE1hcCA9IHRoaXMubGlnaHRNYXAudG9KU09OKCBtZXRhICkudXVpZDsKCiAgICAJCWlmICggdGhpcy5hb01hcCAmJiB0aGlzLmFvTWFwLmlzVGV4dHVyZSApIHsKCiAgICAJCQlkYXRhLmFvTWFwID0gdGhpcy5hb01hcC50b0pTT04oIG1ldGEgKS51dWlkOwogICAgCQkJZGF0YS5hb01hcEludGVuc2l0eSA9IHRoaXMuYW9NYXBJbnRlbnNpdHk7CgogICAgCQl9CgogICAgCQlpZiAoIHRoaXMuYnVtcE1hcCAmJiB0aGlzLmJ1bXBNYXAuaXNUZXh0dXJlICkgewoKICAgIAkJCWRhdGEuYnVtcE1hcCA9IHRoaXMuYnVtcE1hcC50b0pTT04oIG1ldGEgKS51dWlkOwogICAgCQkJZGF0YS5idW1wU2NhbGUgPSB0aGlzLmJ1bXBTY2FsZTsKCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5ub3JtYWxNYXAgJiYgdGhpcy5ub3JtYWxNYXAuaXNUZXh0dXJlICkgewoKICAgIAkJCWRhdGEubm9ybWFsTWFwID0gdGhpcy5ub3JtYWxNYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJCWRhdGEubm9ybWFsTWFwVHlwZSA9IHRoaXMubm9ybWFsTWFwVHlwZTsKICAgIAkJCWRhdGEubm9ybWFsU2NhbGUgPSB0aGlzLm5vcm1hbFNjYWxlLnRvQXJyYXkoKTsKCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5kaXNwbGFjZW1lbnRNYXAgJiYgdGhpcy5kaXNwbGFjZW1lbnRNYXAuaXNUZXh0dXJlICkgewoKICAgIAkJCWRhdGEuZGlzcGxhY2VtZW50TWFwID0gdGhpcy5kaXNwbGFjZW1lbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJCWRhdGEuZGlzcGxhY2VtZW50U2NhbGUgPSB0aGlzLmRpc3BsYWNlbWVudFNjYWxlOwogICAgCQkJZGF0YS5kaXNwbGFjZW1lbnRCaWFzID0gdGhpcy5kaXNwbGFjZW1lbnRCaWFzOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLnJvdWdobmVzc01hcCAmJiB0aGlzLnJvdWdobmVzc01hcC5pc1RleHR1cmUgKSBkYXRhLnJvdWdobmVzc01hcCA9IHRoaXMucm91Z2huZXNzTWFwLnRvSlNPTiggbWV0YSApLnV1aWQ7CiAgICAJCWlmICggdGhpcy5tZXRhbG5lc3NNYXAgJiYgdGhpcy5tZXRhbG5lc3NNYXAuaXNUZXh0dXJlICkgZGF0YS5tZXRhbG5lc3NNYXAgPSB0aGlzLm1ldGFsbmVzc01hcC50b0pTT04oIG1ldGEgKS51dWlkOwoKICAgIAkJaWYgKCB0aGlzLmVtaXNzaXZlTWFwICYmIHRoaXMuZW1pc3NpdmVNYXAuaXNUZXh0dXJlICkgZGF0YS5lbWlzc2l2ZU1hcCA9IHRoaXMuZW1pc3NpdmVNYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJaWYgKCB0aGlzLnNwZWN1bGFyTWFwICYmIHRoaXMuc3BlY3VsYXJNYXAuaXNUZXh0dXJlICkgZGF0YS5zcGVjdWxhck1hcCA9IHRoaXMuc3BlY3VsYXJNYXAudG9KU09OKCBtZXRhICkudXVpZDsKCiAgICAJCWlmICggdGhpcy5lbnZNYXAgJiYgdGhpcy5lbnZNYXAuaXNUZXh0dXJlICkgewoKICAgIAkJCWRhdGEuZW52TWFwID0gdGhpcy5lbnZNYXAudG9KU09OKCBtZXRhICkudXVpZDsKICAgIAkJCWRhdGEucmVmbGVjdGl2aXR5ID0gdGhpcy5yZWZsZWN0aXZpdHk7IC8vIFNjYWxlIGJlaGluZCBlbnZNYXAKICAgIAkJCWRhdGEucmVmcmFjdGlvblJhdGlvID0gdGhpcy5yZWZyYWN0aW9uUmF0aW87CgogICAgCQkJaWYgKCB0aGlzLmNvbWJpbmUgIT09IHVuZGVmaW5lZCApIGRhdGEuY29tYmluZSA9IHRoaXMuY29tYmluZTsKICAgIAkJCWlmICggdGhpcy5lbnZNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIGRhdGEuZW52TWFwSW50ZW5zaXR5ID0gdGhpcy5lbnZNYXBJbnRlbnNpdHk7CgogICAgCQl9CgogICAgCQlpZiAoIHRoaXMuZ3JhZGllbnRNYXAgJiYgdGhpcy5ncmFkaWVudE1hcC5pc1RleHR1cmUgKSB7CgogICAgCQkJZGF0YS5ncmFkaWVudE1hcCA9IHRoaXMuZ3JhZGllbnRNYXAudG9KU09OKCBtZXRhICkudXVpZDsKCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5zaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLnNpemUgPSB0aGlzLnNpemU7CiAgICAJCWlmICggdGhpcy5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIGRhdGEuc2l6ZUF0dGVudWF0aW9uID0gdGhpcy5zaXplQXR0ZW51YXRpb247CgogICAgCQlpZiAoIHRoaXMuYmxlbmRpbmcgIT09IE5vcm1hbEJsZW5kaW5nICkgZGF0YS5ibGVuZGluZyA9IHRoaXMuYmxlbmRpbmc7CiAgICAJCWlmICggdGhpcy5mbGF0U2hhZGluZyA9PT0gdHJ1ZSApIGRhdGEuZmxhdFNoYWRpbmcgPSB0aGlzLmZsYXRTaGFkaW5nOwogICAgCQlpZiAoIHRoaXMuc2lkZSAhPT0gRnJvbnRTaWRlICkgZGF0YS5zaWRlID0gdGhpcy5zaWRlOwogICAgCQlpZiAoIHRoaXMudmVydGV4Q29sb3JzICE9PSBOb0NvbG9ycyApIGRhdGEudmVydGV4Q29sb3JzID0gdGhpcy52ZXJ0ZXhDb2xvcnM7CgogICAgCQlpZiAoIHRoaXMub3BhY2l0eSA8IDEgKSBkYXRhLm9wYWNpdHkgPSB0aGlzLm9wYWNpdHk7CiAgICAJCWlmICggdGhpcy50cmFuc3BhcmVudCA9PT0gdHJ1ZSApIGRhdGEudHJhbnNwYXJlbnQgPSB0aGlzLnRyYW5zcGFyZW50OwoKICAgIAkJZGF0YS5kZXB0aEZ1bmMgPSB0aGlzLmRlcHRoRnVuYzsKICAgIAkJZGF0YS5kZXB0aFRlc3QgPSB0aGlzLmRlcHRoVGVzdDsKICAgIAkJZGF0YS5kZXB0aFdyaXRlID0gdGhpcy5kZXB0aFdyaXRlOwoKICAgIAkJZGF0YS5zdGVuY2lsV3JpdGUgPSB0aGlzLnN0ZW5jaWxXcml0ZTsKICAgIAkJZGF0YS5zdGVuY2lsRnVuYyA9IHRoaXMuc3RlbmNpbEZ1bmM7CiAgICAJCWRhdGEuc3RlbmNpbFJlZiA9IHRoaXMuc3RlbmNpbFJlZjsKICAgIAkJZGF0YS5zdGVuY2lsTWFzayA9IHRoaXMuc3RlbmNpbE1hc2s7CiAgICAJCWRhdGEuc3RlbmNpbEZhaWwgPSB0aGlzLnN0ZW5jaWxGYWlsOwogICAgCQlkYXRhLnN0ZW5jaWxaRmFpbCA9IHRoaXMuc3RlbmNpbFpGYWlsOwogICAgCQlkYXRhLnN0ZW5jaWxaUGFzcyA9IHRoaXMuc3RlbmNpbFpQYXNzOwoKICAgIAkJLy8gcm90YXRpb24gKFNwcml0ZU1hdGVyaWFsKQogICAgCQlpZiAoIHRoaXMucm90YXRpb24gJiYgdGhpcy5yb3RhdGlvbiAhPT0gMCApIGRhdGEucm90YXRpb24gPSB0aGlzLnJvdGF0aW9uOwoKICAgIAkJaWYgKCB0aGlzLnBvbHlnb25PZmZzZXQgPT09IHRydWUgKSBkYXRhLnBvbHlnb25PZmZzZXQgPSB0cnVlOwogICAgCQlpZiAoIHRoaXMucG9seWdvbk9mZnNldEZhY3RvciAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldEZhY3RvciA9IHRoaXMucG9seWdvbk9mZnNldEZhY3RvcjsKICAgIAkJaWYgKCB0aGlzLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gMCApIGRhdGEucG9seWdvbk9mZnNldFVuaXRzID0gdGhpcy5wb2x5Z29uT2Zmc2V0VW5pdHM7CgogICAgCQlpZiAoIHRoaXMubGluZXdpZHRoICYmIHRoaXMubGluZXdpZHRoICE9PSAxICkgZGF0YS5saW5ld2lkdGggPSB0aGlzLmxpbmV3aWR0aDsKICAgIAkJaWYgKCB0aGlzLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBkYXRhLmRhc2hTaXplID0gdGhpcy5kYXNoU2l6ZTsKICAgIAkJaWYgKCB0aGlzLmdhcFNpemUgIT09IHVuZGVmaW5lZCApIGRhdGEuZ2FwU2l6ZSA9IHRoaXMuZ2FwU2l6ZTsKICAgIAkJaWYgKCB0aGlzLnNjYWxlICE9PSB1bmRlZmluZWQgKSBkYXRhLnNjYWxlID0gdGhpcy5zY2FsZTsKCiAgICAJCWlmICggdGhpcy5kaXRoZXJpbmcgPT09IHRydWUgKSBkYXRhLmRpdGhlcmluZyA9IHRydWU7CgogICAgCQlpZiAoIHRoaXMuYWxwaGFUZXN0ID4gMCApIGRhdGEuYWxwaGFUZXN0ID0gdGhpcy5hbHBoYVRlc3Q7CiAgICAJCWlmICggdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSBkYXRhLnByZW11bHRpcGxpZWRBbHBoYSA9IHRoaXMucHJlbXVsdGlwbGllZEFscGhhOwoKICAgIAkJaWYgKCB0aGlzLndpcmVmcmFtZSA9PT0gdHJ1ZSApIGRhdGEud2lyZWZyYW1lID0gdGhpcy53aXJlZnJhbWU7CiAgICAJCWlmICggdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPiAxICkgZGF0YS53aXJlZnJhbWVMaW5ld2lkdGggPSB0aGlzLndpcmVmcmFtZUxpbmV3aWR0aDsKICAgIAkJaWYgKCB0aGlzLndpcmVmcmFtZUxpbmVjYXAgIT09ICdyb3VuZCcgKSBkYXRhLndpcmVmcmFtZUxpbmVjYXAgPSB0aGlzLndpcmVmcmFtZUxpbmVjYXA7CiAgICAJCWlmICggdGhpcy53aXJlZnJhbWVMaW5lam9pbiAhPT0gJ3JvdW5kJyApIGRhdGEud2lyZWZyYW1lTGluZWpvaW4gPSB0aGlzLndpcmVmcmFtZUxpbmVqb2luOwoKICAgIAkJaWYgKCB0aGlzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIGRhdGEubW9ycGhUYXJnZXRzID0gdHJ1ZTsKICAgIAkJaWYgKCB0aGlzLm1vcnBoTm9ybWFscyA9PT0gdHJ1ZSApIGRhdGEubW9ycGhOb3JtYWxzID0gdHJ1ZTsKICAgIAkJaWYgKCB0aGlzLnNraW5uaW5nID09PSB0cnVlICkgZGF0YS5za2lubmluZyA9IHRydWU7CgogICAgCQlpZiAoIHRoaXMudmlzaWJsZSA9PT0gZmFsc2UgKSBkYXRhLnZpc2libGUgPSBmYWxzZTsKCiAgICAJCWlmICggdGhpcy50b25lTWFwcGVkID09PSBmYWxzZSApIGRhdGEudG9uZU1hcHBlZCA9IGZhbHNlOwoKICAgIAkJaWYgKCBKU09OLnN0cmluZ2lmeSggdGhpcy51c2VyRGF0YSApICE9PSAne30nICkgZGF0YS51c2VyRGF0YSA9IHRoaXMudXNlckRhdGE7CgogICAgCQkvLyBUT0RPOiBDb3BpZWQgZnJvbSBPYmplY3QzRC50b0pTT04KCiAgICAJCWZ1bmN0aW9uIGV4dHJhY3RGcm9tQ2FjaGUoIGNhY2hlICkgewoKICAgIAkJCXZhciB2YWx1ZXMgPSBbXTsKCiAgICAJCQlmb3IgKCB2YXIga2V5IGluIGNhY2hlICkgewoKICAgIAkJCQl2YXIgZGF0YSA9IGNhY2hlWyBrZXkgXTsKICAgIAkJCQlkZWxldGUgZGF0YS5tZXRhZGF0YTsKICAgIAkJCQl2YWx1ZXMucHVzaCggZGF0YSApOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gdmFsdWVzOwoKICAgIAkJfQoKICAgIAkJaWYgKCBpc1Jvb3QgKSB7CgogICAgCQkJdmFyIHRleHR1cmVzID0gZXh0cmFjdEZyb21DYWNoZSggbWV0YS50ZXh0dXJlcyApOwogICAgCQkJdmFyIGltYWdlcyA9IGV4dHJhY3RGcm9tQ2FjaGUoIG1ldGEuaW1hZ2VzICk7CgogICAgCQkJaWYgKCB0ZXh0dXJlcy5sZW5ndGggPiAwICkgZGF0YS50ZXh0dXJlcyA9IHRleHR1cmVzOwogICAgCQkJaWYgKCBpbWFnZXMubGVuZ3RoID4gMCApIGRhdGEuaW1hZ2VzID0gaW1hZ2VzOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CgogICAgCQl0aGlzLmZvZyA9IHNvdXJjZS5mb2c7CiAgICAJCXRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0czsKCiAgICAJCXRoaXMuYmxlbmRpbmcgPSBzb3VyY2UuYmxlbmRpbmc7CiAgICAJCXRoaXMuc2lkZSA9IHNvdXJjZS5zaWRlOwogICAgCQl0aGlzLmZsYXRTaGFkaW5nID0gc291cmNlLmZsYXRTaGFkaW5nOwogICAgCQl0aGlzLnZlcnRleENvbG9ycyA9IHNvdXJjZS52ZXJ0ZXhDb2xvcnM7CgogICAgCQl0aGlzLm9wYWNpdHkgPSBzb3VyY2Uub3BhY2l0eTsKICAgIAkJdGhpcy50cmFuc3BhcmVudCA9IHNvdXJjZS50cmFuc3BhcmVudDsKCiAgICAJCXRoaXMuYmxlbmRTcmMgPSBzb3VyY2UuYmxlbmRTcmM7CiAgICAJCXRoaXMuYmxlbmREc3QgPSBzb3VyY2UuYmxlbmREc3Q7CiAgICAJCXRoaXMuYmxlbmRFcXVhdGlvbiA9IHNvdXJjZS5ibGVuZEVxdWF0aW9uOwogICAgCQl0aGlzLmJsZW5kU3JjQWxwaGEgPSBzb3VyY2UuYmxlbmRTcmNBbHBoYTsKICAgIAkJdGhpcy5ibGVuZERzdEFscGhhID0gc291cmNlLmJsZW5kRHN0QWxwaGE7CiAgICAJCXRoaXMuYmxlbmRFcXVhdGlvbkFscGhhID0gc291cmNlLmJsZW5kRXF1YXRpb25BbHBoYTsKCiAgICAJCXRoaXMuZGVwdGhGdW5jID0gc291cmNlLmRlcHRoRnVuYzsKICAgIAkJdGhpcy5kZXB0aFRlc3QgPSBzb3VyY2UuZGVwdGhUZXN0OwogICAgCQl0aGlzLmRlcHRoV3JpdGUgPSBzb3VyY2UuZGVwdGhXcml0ZTsKCiAgICAJCXRoaXMuc3RlbmNpbFdyaXRlID0gc291cmNlLnN0ZW5jaWxXcml0ZTsKICAgIAkJdGhpcy5zdGVuY2lsRnVuYyA9IHNvdXJjZS5zdGVuY2lsRnVuYzsKICAgIAkJdGhpcy5zdGVuY2lsUmVmID0gc291cmNlLnN0ZW5jaWxSZWY7CiAgICAJCXRoaXMuc3RlbmNpbE1hc2sgPSBzb3VyY2Uuc3RlbmNpbE1hc2s7CiAgICAJCXRoaXMuc3RlbmNpbEZhaWwgPSBzb3VyY2Uuc3RlbmNpbEZhaWw7CiAgICAJCXRoaXMuc3RlbmNpbFpGYWlsID0gc291cmNlLnN0ZW5jaWxaRmFpbDsKICAgIAkJdGhpcy5zdGVuY2lsWlBhc3MgPSBzb3VyY2Uuc3RlbmNpbFpQYXNzOwoKICAgIAkJdGhpcy5jb2xvcldyaXRlID0gc291cmNlLmNvbG9yV3JpdGU7CgogICAgCQl0aGlzLnByZWNpc2lvbiA9IHNvdXJjZS5wcmVjaXNpb247CgogICAgCQl0aGlzLnBvbHlnb25PZmZzZXQgPSBzb3VyY2UucG9seWdvbk9mZnNldDsKICAgIAkJdGhpcy5wb2x5Z29uT2Zmc2V0RmFjdG9yID0gc291cmNlLnBvbHlnb25PZmZzZXRGYWN0b3I7CiAgICAJCXRoaXMucG9seWdvbk9mZnNldFVuaXRzID0gc291cmNlLnBvbHlnb25PZmZzZXRVbml0czsKCiAgICAJCXRoaXMuZGl0aGVyaW5nID0gc291cmNlLmRpdGhlcmluZzsKCiAgICAJCXRoaXMuYWxwaGFUZXN0ID0gc291cmNlLmFscGhhVGVzdDsKICAgIAkJdGhpcy5wcmVtdWx0aXBsaWVkQWxwaGEgPSBzb3VyY2UucHJlbXVsdGlwbGllZEFscGhhOwoKICAgIAkJdGhpcy52aXNpYmxlID0gc291cmNlLnZpc2libGU7CgogICAgCQl0aGlzLnRvbmVNYXBwZWQgPSBzb3VyY2UudG9uZU1hcHBlZDsKCiAgICAJCXRoaXMudXNlckRhdGEgPSBKU09OLnBhcnNlKCBKU09OLnN0cmluZ2lmeSggc291cmNlLnVzZXJEYXRhICkgKTsKCiAgICAJCXRoaXMuY2xpcFNoYWRvd3MgPSBzb3VyY2UuY2xpcFNoYWRvd3M7CiAgICAJCXRoaXMuY2xpcEludGVyc2VjdGlvbiA9IHNvdXJjZS5jbGlwSW50ZXJzZWN0aW9uOwoKICAgIAkJdmFyIHNyY1BsYW5lcyA9IHNvdXJjZS5jbGlwcGluZ1BsYW5lcywKICAgIAkJCWRzdFBsYW5lcyA9IG51bGw7CgogICAgCQlpZiAoIHNyY1BsYW5lcyAhPT0gbnVsbCApIHsKCiAgICAJCQl2YXIgbiA9IHNyY1BsYW5lcy5sZW5ndGg7CiAgICAJCQlkc3RQbGFuZXMgPSBuZXcgQXJyYXkoIG4gKTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKQogICAgCQkJCWRzdFBsYW5lc1sgaSBdID0gc3JjUGxhbmVzWyBpIF0uY2xvbmUoKTsKCiAgICAJCX0KCiAgICAJCXRoaXMuY2xpcHBpbmdQbGFuZXMgPSBkc3RQbGFuZXM7CgogICAgCQl0aGlzLnNoYWRvd1NpZGUgPSBzb3VyY2Uuc2hhZG93U2lkZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlkaXNwb3NlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKiAgY29sb3I6IDxoZXg+LAogICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCiAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PgogICAgICoKICAgICAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PgogICAgICoKICAgICAqICBzcGVjdWxhck1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGVudk1hcDogbmV3IFRIUkVFLkN1YmVUZXh0dXJlKCBbcG9zeCwgbmVneCwgcG9zeSwgbmVneSwgcG9zeiwgbmVnel0gKSwKICAgICAqICBjb21iaW5lOiBUSFJFRS5NdWx0aXBseSwKICAgICAqICByZWZsZWN0aXZpdHk6IDxmbG9hdD4sCiAgICAgKiAgcmVmcmFjdGlvblJhdGlvOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBkZXB0aFRlc3Q6IDxib29sPiwKICAgICAqICBkZXB0aFdyaXRlOiA8Ym9vbD4sCiAgICAgKgogICAgICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAogICAgICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgc2tpbm5pbmc6IDxib29sPiwKICAgICAqICBtb3JwaFRhcmdldHM6IDxib29sPgogICAgICogfQogICAgICovCgogICAgZnVuY3Rpb24gTWVzaEJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ01lc2hCYXNpY01hdGVyaWFsJzsKCiAgICAJdGhpcy5jb2xvciA9IG5ldyBDb2xvciQ3KCAweGZmZmZmZiApOyAvLyBlbWlzc2l2ZQoKICAgIAl0aGlzLm1hcCA9IG51bGw7CgogICAgCXRoaXMubGlnaHRNYXAgPSBudWxsOwogICAgCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7CgogICAgCXRoaXMuYW9NYXAgPSBudWxsOwogICAgCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7CgogICAgCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOwoKICAgIAl0aGlzLmFscGhhTWFwID0gbnVsbDsKCiAgICAJdGhpcy5lbnZNYXAgPSBudWxsOwogICAgCXRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uOwogICAgCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKICAgIAl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CgogICAgCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwogICAgCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwoKICAgIAl0aGlzLmxpZ2h0cyA9IGZhbHNlOwoKICAgIAl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKICAgIH0KCiAgICBNZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIE1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hCYXNpY01hdGVyaWFsOwoKICAgIE1lc2hCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hCYXNpY01hdGVyaWFsID0gdHJ1ZTsKCiAgICBNZXNoQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKCiAgICAJdGhpcy5tYXAgPSBzb3VyY2UubWFwOwoKICAgIAl0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwogICAgCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7CgogICAgCXRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CiAgICAJdGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTsKCiAgICAJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKCiAgICAJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCiAgICAJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwogICAgCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwogICAgCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKICAgIAl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CgogICAgCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKCiAgICAJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgogICAgCWlmICggQXJyYXkuaXNBcnJheSggYXJyYXkgKSApIHsKCiAgICAJCXRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTsKCiAgICAJfQoKICAgIAl0aGlzLm5hbWUgPSAnJzsKCiAgICAJdGhpcy5hcnJheSA9IGFycmF5OwogICAgCXRoaXMuaXRlbVNpemUgPSBpdGVtU2l6ZTsKICAgIAl0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIGl0ZW1TaXplIDogMDsKICAgIAl0aGlzLm5vcm1hbGl6ZWQgPSBub3JtYWxpemVkID09PSB0cnVlOwoKICAgIAl0aGlzLmR5bmFtaWMgPSBmYWxzZTsKICAgIAl0aGlzLnVwZGF0ZVJhbmdlID0geyBvZmZzZXQ6IDAsIGNvdW50OiAtIDEgfTsKCiAgICAJdGhpcy52ZXJzaW9uID0gMDsKCiAgICB9CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCAnbmVlZHNVcGRhdGUnLCB7CgogICAgCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWlmICggdmFsdWUgPT09IHRydWUgKSB0aGlzLnZlcnNpb24gKys7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgewoKICAgIAlpc0J1ZmZlckF0dHJpYnV0ZTogdHJ1ZSwKCiAgICAJb25VcGxvYWRDYWxsYmFjazogZnVuY3Rpb24gKCkge30sCgogICAgCXNldEFycmF5OiBmdW5jdGlvbiAoIGFycmF5ICkgewoKICAgIAkJaWYgKCBBcnJheS5pc0FycmF5KCBhcnJheSApICkgewoKICAgIAkJCXRocm93IG5ldyBUeXBlRXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IGFycmF5IHNob3VsZCBiZSBhIFR5cGVkIEFycmF5LicgKTsKCiAgICAJCX0KCiAgICAJCXRoaXMuY291bnQgPSBhcnJheSAhPT0gdW5kZWZpbmVkID8gYXJyYXkubGVuZ3RoIC8gdGhpcy5pdGVtU2l6ZSA6IDA7CiAgICAJCXRoaXMuYXJyYXkgPSBhcnJheTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5keW5hbWljID0gdmFsdWU7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQl0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKICAgIAkJdGhpcy5hcnJheSA9IG5ldyBzb3VyY2UuYXJyYXkuY29uc3RydWN0b3IoIHNvdXJjZS5hcnJheSApOwogICAgCQl0aGlzLml0ZW1TaXplID0gc291cmNlLml0ZW1TaXplOwogICAgCQl0aGlzLmNvdW50ID0gc291cmNlLmNvdW50OwogICAgCQl0aGlzLm5vcm1hbGl6ZWQgPSBzb3VyY2Uubm9ybWFsaXplZDsKCiAgICAJCXRoaXMuZHluYW1pYyA9IHNvdXJjZS5keW5hbWljOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvcHlBdDogZnVuY3Rpb24gKCBpbmRleDEsIGF0dHJpYnV0ZSwgaW5kZXgyICkgewoKICAgIAkJaW5kZXgxICo9IHRoaXMuaXRlbVNpemU7CiAgICAJCWluZGV4MiAqPSBhdHRyaWJ1dGUuaXRlbVNpemU7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLml0ZW1TaXplOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl0aGlzLmFycmF5WyBpbmRleDEgKyBpIF0gPSBhdHRyaWJ1dGUuYXJyYXlbIGluZGV4MiArIGkgXTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb3B5QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CgogICAgCQl0aGlzLmFycmF5LnNldCggYXJyYXkgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb3B5Q29sb3JzQXJyYXk6IGZ1bmN0aW9uICggY29sb3JzICkgewoKICAgIAkJdmFyIGFycmF5ID0gdGhpcy5hcnJheSwgb2Zmc2V0ID0gMDsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGNvbG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBjb2xvciA9IGNvbG9yc1sgaSBdOwoKICAgIAkJCWlmICggY29sb3IgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSgpOiBjb2xvciBpcyB1bmRlZmluZWQnLCBpICk7CiAgICAJCQkJY29sb3IgPSBuZXcgQ29sb3IkNygpOwoKICAgIAkJCX0KCiAgICAJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSBjb2xvci5yOwogICAgCQkJYXJyYXlbIG9mZnNldCArKyBdID0gY29sb3IuZzsKICAgIAkJCWFycmF5WyBvZmZzZXQgKysgXSA9IGNvbG9yLmI7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29weVZlY3RvcjJzQXJyYXk6IGZ1bmN0aW9uICggdmVjdG9ycyApIHsKCiAgICAJCXZhciBhcnJheSA9IHRoaXMuYXJyYXksIG9mZnNldCA9IDA7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB2ZWN0b3JzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIHZlY3RvciA9IHZlY3RvcnNbIGkgXTsKCiAgICAJCQlpZiAoIHZlY3RvciA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoKTogdmVjdG9yIGlzIHVuZGVmaW5lZCcsIGkgKTsKICAgIAkJCQl2ZWN0b3IgPSBuZXcgVmVjdG9yMigpOwoKICAgIAkJCX0KCiAgICAJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueDsKICAgIAkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci55OwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvcHlWZWN0b3Izc0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7CgogICAgCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CgogICAgCQkJaWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7CiAgICAJCQkJdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCQl9CgogICAgCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7CiAgICAJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKICAgIAkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56OwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvcHlWZWN0b3I0c0FycmF5OiBmdW5jdGlvbiAoIHZlY3RvcnMgKSB7CgogICAgCQl2YXIgYXJyYXkgPSB0aGlzLmFycmF5LCBvZmZzZXQgPSAwOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gdmVjdG9ycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciB2ZWN0b3IgPSB2ZWN0b3JzWyBpIF07CgogICAgCQkJaWYgKCB2ZWN0b3IgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyQXR0cmlidXRlLmNvcHlWZWN0b3I0c0FycmF5KCk6IHZlY3RvciBpcyB1bmRlZmluZWQnLCBpICk7CiAgICAJCQkJdmVjdG9yID0gbmV3IFZlY3RvcjQoKTsKCiAgICAJCQl9CgogICAgCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLng7CiAgICAJCQlhcnJheVsgb2Zmc2V0ICsrIF0gPSB2ZWN0b3IueTsKICAgIAkJCWFycmF5WyBvZmZzZXQgKysgXSA9IHZlY3Rvci56OwogICAgCQkJYXJyYXlbIG9mZnNldCArKyBdID0gdmVjdG9yLnc7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHZhbHVlLCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCXRoaXMuYXJyYXkuc2V0KCB2YWx1ZSwgb2Zmc2V0ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0WDogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCXJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgXTsKCiAgICAJfSwKCiAgICAJc2V0WDogZnVuY3Rpb24gKCBpbmRleCwgeCApIHsKCiAgICAJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSBdID0geDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRZOiBmdW5jdGlvbiAoIGluZGV4ICkgewoKICAgIAkJcmV0dXJuIHRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXTsKCiAgICAJfSwKCiAgICAJc2V0WTogZnVuY3Rpb24gKCBpbmRleCwgeSApIHsKCiAgICAJCXRoaXMuYXJyYXlbIGluZGV4ICogdGhpcy5pdGVtU2l6ZSArIDEgXSA9IHk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0WjogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCXJldHVybiB0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF07CgogICAgCX0sCgogICAgCXNldFo6IGZ1bmN0aW9uICggaW5kZXgsIHogKSB7CgogICAgCQl0aGlzLmFycmF5WyBpbmRleCAqIHRoaXMuaXRlbVNpemUgKyAyIF0gPSB6OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7CgogICAgCQlyZXR1cm4gdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdOwoKICAgIAl9LAoKICAgIAlzZXRXOiBmdW5jdGlvbiAoIGluZGV4LCB3ICkgewoKICAgIAkJdGhpcy5hcnJheVsgaW5kZXggKiB0aGlzLml0ZW1TaXplICsgMyBdID0gdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRYWTogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSApIHsKCiAgICAJCWluZGV4ICo9IHRoaXMuaXRlbVNpemU7CgogICAgCQl0aGlzLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CiAgICAJCXRoaXMuYXJyYXlbIGluZGV4ICsgMSBdID0geTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRYWVo6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHogKSB7CgogICAgCQlpbmRleCAqPSB0aGlzLml0ZW1TaXplOwoKICAgIAkJdGhpcy5hcnJheVsgaW5kZXggKyAwIF0gPSB4OwogICAgCQl0aGlzLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CiAgICAJCXRoaXMuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRYWVpXOiBmdW5jdGlvbiAoIGluZGV4LCB4LCB5LCB6LCB3ICkgewoKICAgIAkJaW5kZXggKj0gdGhpcy5pdGVtU2l6ZTsKCiAgICAJCXRoaXMuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKICAgIAkJdGhpcy5hcnJheVsgaW5kZXggKyAxIF0gPSB5OwogICAgCQl0aGlzLmFycmF5WyBpbmRleCArIDIgXSA9IHo7CiAgICAJCXRoaXMuYXJyYXlbIGluZGV4ICsgMyBdID0gdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlvblVwbG9hZDogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCiAgICAJCXRoaXMub25VcGxvYWRDYWxsYmFjayA9IGNhbGxiYWNrOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuYXJyYXksIHRoaXMuaXRlbVNpemUgKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHsKICAgIAkJCWl0ZW1TaXplOiB0aGlzLml0ZW1TaXplLAogICAgCQkJdHlwZTogdGhpcy5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAogICAgCQkJYXJyYXk6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKCB0aGlzLmFycmF5ICksCiAgICAJCQlub3JtYWxpemVkOiB0aGlzLm5vcm1hbGl6ZWQKICAgIAkJfTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvLwoKICAgIGZ1bmN0aW9uIEludDhCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHsKCiAgICAJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7CgogICAgfQoKICAgIEludDhCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOwogICAgSW50OEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQ4QnVmZmVyQXR0cmlidXRlOwoKCiAgICBmdW5jdGlvbiBVaW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKICAgIAlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQ4QXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7CgogICAgfQoKICAgIFVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKICAgIFVpbnQ4QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQ4QnVmZmVyQXR0cmlidXRlOwoKCiAgICBmdW5jdGlvbiBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHsKCiAgICAJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBVaW50OENsYW1wZWRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTsKCiAgICB9CgogICAgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKICAgIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBVaW50OENsYW1wZWRCdWZmZXJBdHRyaWJ1dGU7CgoKICAgIGZ1bmN0aW9uIEludDE2QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgogICAgCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgSW50MTZBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTsKCiAgICB9CgogICAgSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOwogICAgSW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSW50MTZCdWZmZXJBdHRyaWJ1dGU7CgoKICAgIGZ1bmN0aW9uIFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKICAgIAlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IFVpbnQxNkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKICAgIH0KCiAgICBVaW50MTZCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSApOwogICAgVWludDE2QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZTsKCgogICAgZnVuY3Rpb24gSW50MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApIHsKCiAgICAJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIG5ldyBJbnQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKICAgIH0KCiAgICBJbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CiAgICBJbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBJbnQzMkJ1ZmZlckF0dHJpYnV0ZTsKCgogICAgZnVuY3Rpb24gVWludDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgogICAgCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgVWludDMyQXJyYXkoIGFycmF5ICksIGl0ZW1TaXplLCBub3JtYWxpemVkICk7CgogICAgfQoKICAgIFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CiAgICBVaW50MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVWludDMyQnVmZmVyQXR0cmlidXRlOwoKCiAgICBmdW5jdGlvbiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKSB7CgogICAgCUJ1ZmZlckF0dHJpYnV0ZS5jYWxsKCB0aGlzLCBuZXcgRmxvYXQzMkFycmF5KCBhcnJheSApLCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKICAgIH0KCiAgICBGbG9hdDMyQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgKTsKICAgIEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTsKCgogICAgZnVuY3Rpb24gRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkICkgewoKICAgIAlCdWZmZXJBdHRyaWJ1dGUuY2FsbCggdGhpcywgbmV3IEZsb2F0NjRBcnJheSggYXJyYXkgKSwgaXRlbVNpemUsIG5vcm1hbGl6ZWQgKTsKCiAgICB9CgogICAgRmxvYXQ2NEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICk7CiAgICBGbG9hdDY0QnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gRGlyZWN0R2VvbWV0cnkoKSB7CgogICAgCXRoaXMudmVydGljZXMgPSBbXTsKICAgIAl0aGlzLm5vcm1hbHMgPSBbXTsKICAgIAl0aGlzLmNvbG9ycyA9IFtdOwogICAgCXRoaXMudXZzID0gW107CiAgICAJdGhpcy51dnMyID0gW107CgogICAgCXRoaXMuZ3JvdXBzID0gW107CgogICAgCXRoaXMubW9ycGhUYXJnZXRzID0ge307CgogICAgCXRoaXMuc2tpbldlaWdodHMgPSBbXTsKICAgIAl0aGlzLnNraW5JbmRpY2VzID0gW107CgogICAgCS8vIHRoaXMubGluZURpc3RhbmNlcyA9IFtdOwoKICAgIAl0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKICAgIAl0aGlzLmJvdW5kaW5nU3BoZXJlID0gbnVsbDsKCiAgICAJLy8gdXBkYXRlIGZsYWdzCgogICAgCXRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CiAgICAJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMudXZzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBEaXJlY3RHZW9tZXRyeS5wcm90b3R5cGUsIHsKCiAgICAJY29tcHV0ZUdyb3VwczogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKCiAgICAJCXZhciBncm91cDsKICAgIAkJdmFyIGdyb3VwcyA9IFtdOwogICAgCQl2YXIgbWF0ZXJpYWxJbmRleCA9IHVuZGVmaW5lZDsKCiAgICAJCXZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgZmFjZXMubGVuZ3RoOyBpICsrICkgewoKICAgIAkJCXZhciBmYWNlID0gZmFjZXNbIGkgXTsKCiAgICAJCQkvLyBtYXRlcmlhbHMKCiAgICAJCQlpZiAoIGZhY2UubWF0ZXJpYWxJbmRleCAhPT0gbWF0ZXJpYWxJbmRleCApIHsKCiAgICAJCQkJbWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleDsKCiAgICAJCQkJaWYgKCBncm91cCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJZ3JvdXAuY291bnQgPSAoIGkgKiAzICkgLSBncm91cC5zdGFydDsKICAgIAkJCQkJZ3JvdXBzLnB1c2goIGdyb3VwICk7CgogICAgCQkJCX0KCiAgICAJCQkJZ3JvdXAgPSB7CiAgICAJCQkJCXN0YXJ0OiBpICogMywKICAgIAkJCQkJbWF0ZXJpYWxJbmRleDogbWF0ZXJpYWxJbmRleAogICAgCQkJCX07CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCBncm91cCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWdyb3VwLmNvdW50ID0gKCBpICogMyApIC0gZ3JvdXAuc3RhcnQ7CiAgICAJCQlncm91cHMucHVzaCggZ3JvdXAgKTsKCiAgICAJCX0KCiAgICAJCXRoaXMuZ3JvdXBzID0gZ3JvdXBzOwoKICAgIAl9LAoKICAgIAlmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CgogICAgCQl2YXIgZmFjZXMgPSBnZW9tZXRyeS5mYWNlczsKICAgIAkJdmFyIHZlcnRpY2VzID0gZ2VvbWV0cnkudmVydGljZXM7CiAgICAJCXZhciBmYWNlVmVydGV4VXZzID0gZ2VvbWV0cnkuZmFjZVZlcnRleFV2czsKCiAgICAJCXZhciBoYXNGYWNlVmVydGV4VXYgPSBmYWNlVmVydGV4VXZzWyAwIF0gJiYgZmFjZVZlcnRleFV2c1sgMCBdLmxlbmd0aCA+IDA7CiAgICAJCXZhciBoYXNGYWNlVmVydGV4VXYyID0gZmFjZVZlcnRleFV2c1sgMSBdICYmIGZhY2VWZXJ0ZXhVdnNbIDEgXS5sZW5ndGggPiAwOwoKICAgIAkJLy8gbW9ycGhzCgogICAgCQl2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzOwogICAgCQl2YXIgbW9ycGhUYXJnZXRzTGVuZ3RoID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsKCiAgICAJCXZhciBtb3JwaFRhcmdldHNQb3NpdGlvbjsKCiAgICAJCWlmICggbW9ycGhUYXJnZXRzTGVuZ3RoID4gMCApIHsKCiAgICAJCQltb3JwaFRhcmdldHNQb3NpdGlvbiA9IFtdOwoKICAgIAkJCWZvciAoIHZhciBpID0gMDsgaSA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJbW9ycGhUYXJnZXRzUG9zaXRpb25bIGkgXSA9IHsKICAgIAkJCQkJbmFtZTogbW9ycGhUYXJnZXRzWyBpIF0ubmFtZSwKICAgIAkJCQkgCWRhdGE6IFtdCiAgICAJCQkJfTsKCiAgICAJCQl9CgogICAgCQkJdGhpcy5tb3JwaFRhcmdldHMucG9zaXRpb24gPSBtb3JwaFRhcmdldHNQb3NpdGlvbjsKCiAgICAJCX0KCiAgICAJCXZhciBtb3JwaE5vcm1hbHMgPSBnZW9tZXRyeS5tb3JwaE5vcm1hbHM7CiAgICAJCXZhciBtb3JwaE5vcm1hbHNMZW5ndGggPSBtb3JwaE5vcm1hbHMubGVuZ3RoOwoKICAgIAkJdmFyIG1vcnBoVGFyZ2V0c05vcm1hbDsKCiAgICAJCWlmICggbW9ycGhOb3JtYWxzTGVuZ3RoID4gMCApIHsKCiAgICAJCQltb3JwaFRhcmdldHNOb3JtYWwgPSBbXTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBtb3JwaE5vcm1hbHNMZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCW1vcnBoVGFyZ2V0c05vcm1hbFsgaSBdID0gewogICAgCQkJCQluYW1lOiBtb3JwaE5vcm1hbHNbIGkgXS5uYW1lLAogICAgCQkJCSAJZGF0YTogW10KICAgIAkJCQl9OwoKICAgIAkJCX0KCiAgICAJCQl0aGlzLm1vcnBoVGFyZ2V0cy5ub3JtYWwgPSBtb3JwaFRhcmdldHNOb3JtYWw7CgogICAgCQl9CgogICAgCQkvLyBza2lucwoKICAgIAkJdmFyIHNraW5JbmRpY2VzID0gZ2VvbWV0cnkuc2tpbkluZGljZXM7CiAgICAJCXZhciBza2luV2VpZ2h0cyA9IGdlb21ldHJ5LnNraW5XZWlnaHRzOwoKICAgIAkJdmFyIGhhc1NraW5JbmRpY2VzID0gc2tpbkluZGljZXMubGVuZ3RoID09PSB2ZXJ0aWNlcy5sZW5ndGg7CiAgICAJCXZhciBoYXNTa2luV2VpZ2h0cyA9IHNraW5XZWlnaHRzLmxlbmd0aCA9PT0gdmVydGljZXMubGVuZ3RoOwoKICAgIAkJLy8KCiAgICAJCWlmICggdmVydGljZXMubGVuZ3RoID4gMCAmJiBmYWNlcy5sZW5ndGggPT09IDAgKSB7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkRpcmVjdEdlb21ldHJ5OiBGYWNlbGVzcyBnZW9tZXRyaWVzIGFyZSBub3Qgc3VwcG9ydGVkLicgKTsKCiAgICAJCX0KCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGZhY2VzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgogICAgCQkJdGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgZmFjZS5hIF0sIHZlcnRpY2VzWyBmYWNlLmIgXSwgdmVydGljZXNbIGZhY2UuYyBdICk7CgogICAgCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CgogICAgCQkJaWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHsKCiAgICAJCQkJdGhpcy5ub3JtYWxzLnB1c2goIHZlcnRleE5vcm1hbHNbIDAgXSwgdmVydGV4Tm9ybWFsc1sgMSBdLCB2ZXJ0ZXhOb3JtYWxzWyAyIF0gKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQl2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7CgogICAgCQkJCXRoaXMubm9ybWFscy5wdXNoKCBub3JtYWwsIG5vcm1hbCwgbm9ybWFsICk7CgogICAgCQkJfQoKICAgIAkJCXZhciB2ZXJ0ZXhDb2xvcnMgPSBmYWNlLnZlcnRleENvbG9yczsKCiAgICAJCQlpZiAoIHZlcnRleENvbG9ycy5sZW5ndGggPT09IDMgKSB7CgogICAgCQkJCXRoaXMuY29sb3JzLnB1c2goIHZlcnRleENvbG9yc1sgMCBdLCB2ZXJ0ZXhDb2xvcnNbIDEgXSwgdmVydGV4Q29sb3JzWyAyIF0gKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQl2YXIgY29sb3IgPSBmYWNlLmNvbG9yOwoKICAgIAkJCQl0aGlzLmNvbG9ycy5wdXNoKCBjb2xvciwgY29sb3IsIGNvbG9yICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggaGFzRmFjZVZlcnRleFV2ID09PSB0cnVlICkgewoKICAgIAkJCQl2YXIgdmVydGV4VXZzID0gZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07CgogICAgCQkJCWlmICggdmVydGV4VXZzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQl0aGlzLnV2cy5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2ICcsIGkgKTsKCiAgICAJCQkJCXRoaXMudXZzLnB1c2goIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCksIG5ldyBWZWN0b3IyKCkgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQlpZiAoIGhhc0ZhY2VWZXJ0ZXhVdjIgPT09IHRydWUgKSB7CgogICAgCQkJCXZhciB2ZXJ0ZXhVdnMgPSBmYWNlVmVydGV4VXZzWyAxIF1bIGkgXTsKCiAgICAJCQkJaWYgKCB2ZXJ0ZXhVdnMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCXRoaXMudXZzMi5wdXNoKCB2ZXJ0ZXhVdnNbIDAgXSwgdmVydGV4VXZzWyAxIF0sIHZlcnRleFV2c1sgMiBdICk7CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5EaXJlY3RHZW9tZXRyeS5mcm9tR2VvbWV0cnkoKTogVW5kZWZpbmVkIHZlcnRleFV2MiAnLCBpICk7CgogICAgCQkJCQl0aGlzLnV2czIucHVzaCggbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSwgbmV3IFZlY3RvcjIoKSApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCS8vIG1vcnBocwoKICAgIAkJCWZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoVGFyZ2V0c0xlbmd0aDsgaiArKyApIHsKCiAgICAJCQkJdmFyIG1vcnBoVGFyZ2V0ID0gbW9ycGhUYXJnZXRzWyBqIF0udmVydGljZXM7CgogICAgCQkJCW1vcnBoVGFyZ2V0c1Bvc2l0aW9uWyBqIF0uZGF0YS5wdXNoKCBtb3JwaFRhcmdldFsgZmFjZS5hIF0sIG1vcnBoVGFyZ2V0WyBmYWNlLmIgXSwgbW9ycGhUYXJnZXRbIGZhY2UuYyBdICk7CgogICAgCQkJfQoKICAgIAkJCWZvciAoIHZhciBqID0gMDsgaiA8IG1vcnBoTm9ybWFsc0xlbmd0aDsgaiArKyApIHsKCiAgICAJCQkJdmFyIG1vcnBoTm9ybWFsID0gbW9ycGhOb3JtYWxzWyBqIF0udmVydGV4Tm9ybWFsc1sgaSBdOwoKICAgIAkJCQltb3JwaFRhcmdldHNOb3JtYWxbIGogXS5kYXRhLnB1c2goIG1vcnBoTm9ybWFsLmEsIG1vcnBoTm9ybWFsLmIsIG1vcnBoTm9ybWFsLmMgKTsKCiAgICAJCQl9CgogICAgCQkJLy8gc2tpbnMKCiAgICAJCQlpZiAoIGhhc1NraW5JbmRpY2VzICkgewoKICAgIAkJCQl0aGlzLnNraW5JbmRpY2VzLnB1c2goIHNraW5JbmRpY2VzWyBmYWNlLmEgXSwgc2tpbkluZGljZXNbIGZhY2UuYiBdLCBza2luSW5kaWNlc1sgZmFjZS5jIF0gKTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCBoYXNTa2luV2VpZ2h0cyApIHsKCiAgICAJCQkJdGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgZmFjZS5hIF0sIHNraW5XZWlnaHRzWyBmYWNlLmIgXSwgc2tpbldlaWdodHNbIGZhY2UuYyBdICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJdGhpcy5jb21wdXRlR3JvdXBzKCBnZW9tZXRyeSApOwoKICAgIAkJdGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBnZW9tZXRyeS52ZXJ0aWNlc05lZWRVcGRhdGU7CiAgICAJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSBnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZTsKICAgIAkJdGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZTsKICAgIAkJdGhpcy51dnNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZTsKICAgIAkJdGhpcy5ncm91cHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZTsKCiAgICAJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CgogICAgCQl9CgogICAgCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gYXJyYXlNYXgoIGFycmF5ICkgewoKICAgIAlpZiAoIGFycmF5Lmxlbmd0aCA9PT0gMCApIHJldHVybiAtIEluZmluaXR5OwoKICAgIAl2YXIgbWF4ID0gYXJyYXlbIDAgXTsKCiAgICAJZm9yICggdmFyIGkgPSAxLCBsID0gYXJyYXkubGVuZ3RoOyBpIDwgbDsgKysgaSApIHsKCiAgICAJCWlmICggYXJyYXlbIGkgXSA+IG1heCApIG1heCA9IGFycmF5WyBpIF07CgogICAgCX0KCiAgICAJcmV0dXJuIG1heDsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBfYnVmZmVyR2VvbWV0cnlJZCA9IDE7IC8vIEJ1ZmZlckdlb21ldHJ5IHVzZXMgb2RkIG51bWJlcnMgYXMgSWQKCiAgICB2YXIgX20xJDIgPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF9vYmogPSBuZXcgT2JqZWN0M0QoKTsKICAgIHZhciBfb2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfYm94JDEgPSBuZXcgQm94MygpOwogICAgdmFyIF9ib3hNb3JwaFRhcmdldHMgPSBuZXcgQm94MygpOwogICAgdmFyIF92ZWN0b3IkNCA9IG5ldyBWZWN0b3IzKCk7CgogICAgZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnkoKSB7CgogICAgCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX2J1ZmZlckdlb21ldHJ5SWQgKz0gMiB9ICk7CgogICAgCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKICAgIAl0aGlzLm5hbWUgPSAnJzsKICAgIAl0aGlzLnR5cGUgPSAnQnVmZmVyR2VvbWV0cnknOwoKICAgIAl0aGlzLmluZGV4ID0gbnVsbDsKICAgIAl0aGlzLmF0dHJpYnV0ZXMgPSB7fTsKCiAgICAJdGhpcy5tb3JwaEF0dHJpYnV0ZXMgPSB7fTsKCiAgICAJdGhpcy5ncm91cHMgPSBbXTsKCiAgICAJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CiAgICAJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7CgogICAgCXRoaXMuZHJhd1JhbmdlID0geyBzdGFydDogMCwgY291bnQ6IEluZmluaXR5IH07CgogICAgCXRoaXMudXNlckRhdGEgPSB7fTsKCiAgICB9CgogICAgQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBCdWZmZXJHZW9tZXRyeSwKCiAgICAJaXNCdWZmZXJHZW9tZXRyeTogdHJ1ZSwKCiAgICAJZ2V0SW5kZXg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmluZGV4OwoKICAgIAl9LAoKICAgIAlzZXRJbmRleDogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCWlmICggQXJyYXkuaXNBcnJheSggaW5kZXggKSApIHsKCiAgICAJCQl0aGlzLmluZGV4ID0gbmV3ICggYXJyYXlNYXgoIGluZGV4ICkgPiA2NTUzNSA/IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSA6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSApKCBpbmRleCwgMSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0aGlzLmluZGV4ID0gaW5kZXg7CgogICAgCQl9CgogICAgCX0sCgogICAgCWFkZEF0dHJpYnV0ZTogZnVuY3Rpb24gKCBuYW1lLCBhdHRyaWJ1dGUgKSB7CgogICAgCQlpZiAoICEgKCBhdHRyaWJ1dGUgJiYgYXR0cmlidXRlLmlzQnVmZmVyQXR0cmlidXRlICkgJiYgISAoIGF0dHJpYnV0ZSAmJiBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkQXR0cmlidXRlKCkgbm93IGV4cGVjdHMgKCBuYW1lLCBhdHRyaWJ1dGUgKS4nICk7CgogICAgCQkJcmV0dXJuIHRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcmd1bWVudHNbIDEgXSwgYXJndW1lbnRzWyAyIF0gKSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBuYW1lID09PSAnaW5kZXgnICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmFkZEF0dHJpYnV0ZTogVXNlIC5zZXRJbmRleCgpIGZvciBpbmRleCBhdHRyaWJ1dGUuJyApOwogICAgCQkJdGhpcy5zZXRJbmRleCggYXR0cmlidXRlICk7CgogICAgCQkJcmV0dXJuIHRoaXM7CgogICAgCQl9CgogICAgCQl0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXSA9IGF0dHJpYnV0ZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRBdHRyaWJ1dGU6IGZ1bmN0aW9uICggbmFtZSApIHsKCiAgICAJCXJldHVybiB0aGlzLmF0dHJpYnV0ZXNbIG5hbWUgXTsKCiAgICAJfSwKCiAgICAJcmVtb3ZlQXR0cmlidXRlOiBmdW5jdGlvbiAoIG5hbWUgKSB7CgogICAgCQlkZWxldGUgdGhpcy5hdHRyaWJ1dGVzWyBuYW1lIF07CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYWRkR3JvdXA6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ICkgewoKICAgIAkJdGhpcy5ncm91cHMucHVzaCggewoKICAgIAkJCXN0YXJ0OiBzdGFydCwKICAgIAkJCWNvdW50OiBjb3VudCwKICAgIAkJCW1hdGVyaWFsSW5kZXg6IG1hdGVyaWFsSW5kZXggIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsSW5kZXggOiAwCgogICAgCQl9ICk7CgogICAgCX0sCgogICAgCWNsZWFyR3JvdXBzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmdyb3VwcyA9IFtdOwoKICAgIAl9LAoKICAgIAlzZXREcmF3UmFuZ2U6IGZ1bmN0aW9uICggc3RhcnQsIGNvdW50ICkgewoKICAgIAkJdGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzdGFydDsKICAgIAkJdGhpcy5kcmF3UmFuZ2UuY291bnQgPSBjb3VudDsKCiAgICAJfSwKCiAgICAJYXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkgewoKICAgIAkJdmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uOwoKICAgIAkJaWYgKCBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCW1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiApOwogICAgCQkJcG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJfQoKICAgIAkJdmFyIG5vcm1hbCA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CgogICAgCQlpZiAoIG5vcm1hbCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBub3JtYWxNYXRyaXggPSBuZXcgTWF0cml4MygpLmdldE5vcm1hbE1hdHJpeCggbWF0cml4ICk7CgogICAgCQkJbm9ybWFsTWF0cml4LmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbCApOwogICAgCQkJbm9ybWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCX0KCiAgICAJCXZhciB0YW5nZW50ID0gdGhpcy5hdHRyaWJ1dGVzLnRhbmdlbnQ7CgogICAgCQlpZiAoIHRhbmdlbnQgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl2YXIgbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKS5nZXROb3JtYWxNYXRyaXgoIG1hdHJpeCApOwoKICAgIAkJCS8vIFRhbmdlbnQgaXMgdmVjNCwgYnV0IHRoZSAnLncnIGNvbXBvbmVudCBpcyBhIHNpZ24gdmFsdWUgKCsxLy0xKS4KICAgIAkJCW5vcm1hbE1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCB0YW5nZW50ICk7CiAgICAJCQl0YW5nZW50Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJcm90YXRlWDogZnVuY3Rpb24gKCBhbmdsZSApIHsKCiAgICAJCS8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeC1heGlzCgogICAgCQlfbTEkMi5tYWtlUm90YXRpb25YKCBhbmdsZSApOwoKICAgIAkJdGhpcy5hcHBseU1hdHJpeCggX20xJDIgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyb3RhdGVZOiBmdW5jdGlvbiAoIGFuZ2xlICkgewoKICAgIAkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB5LWF4aXMKCiAgICAJCV9tMSQyLm1ha2VSb3RhdGlvblkoIGFuZ2xlICk7CgogICAgCQl0aGlzLmFwcGx5TWF0cml4KCBfbTEkMiApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXJvdGF0ZVo6IGZ1bmN0aW9uICggYW5nbGUgKSB7CgogICAgCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHotYXhpcwoKICAgIAkJX20xJDIubWFrZVJvdGF0aW9uWiggYW5nbGUgKTsKCiAgICAJCXRoaXMuYXBwbHlNYXRyaXgoIF9tMSQyICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIHgsIHksIHogKSB7CgogICAgCQkvLyB0cmFuc2xhdGUgZ2VvbWV0cnkKCiAgICAJCV9tMSQyLm1ha2VUcmFuc2xhdGlvbiggeCwgeSwgeiApOwoKICAgIAkJdGhpcy5hcHBseU1hdHJpeCggX20xJDIgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzY2FsZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKICAgIAkJLy8gc2NhbGUgZ2VvbWV0cnkKCiAgICAJCV9tMSQyLm1ha2VTY2FsZSggeCwgeSwgeiApOwoKICAgIAkJdGhpcy5hcHBseU1hdHJpeCggX20xJDIgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlsb29rQXQ6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKICAgIAkJX29iai5sb29rQXQoIHZlY3RvciApOwoKICAgIAkJX29iai51cGRhdGVNYXRyaXgoKTsKCiAgICAJCXRoaXMuYXBwbHlNYXRyaXgoIF9vYmoubWF0cml4ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2VudGVyOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOwoKICAgIAkJdGhpcy5ib3VuZGluZ0JveC5nZXRDZW50ZXIoIF9vZmZzZXQgKS5uZWdhdGUoKTsKCiAgICAJCXRoaXMudHJhbnNsYXRlKCBfb2Zmc2V0LngsIF9vZmZzZXQueSwgX29mZnNldC56ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCQkvLyBjb25zb2xlLmxvZyggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnNldEZyb21PYmplY3QoKS4gQ29udmVydGluZycsIG9iamVjdCwgdGhpcyApOwoKICAgIAkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwoKICAgIAkJaWYgKCBvYmplY3QuaXNQb2ludHMgfHwgb2JqZWN0LmlzTGluZSApIHsKCiAgICAJCQl2YXIgcG9zaXRpb25zID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCAqIDMsIDMgKTsKICAgIAkJCXZhciBjb2xvcnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCAqIDMsIDMgKTsKCiAgICAJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcyApICk7CiAgICAJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgY29sb3JzLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICkgKTsKCiAgICAJCQlpZiAoIGdlb21ldHJ5LmxpbmVEaXN0YW5jZXMgJiYgZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGggPT09IGdlb21ldHJ5LnZlcnRpY2VzLmxlbmd0aCApIHsKCiAgICAJCQkJdmFyIGxpbmVEaXN0YW5jZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkubGluZURpc3RhbmNlcy5sZW5ndGgsIDEgKTsKCiAgICAJCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdsaW5lRGlzdGFuY2UnLCBsaW5lRGlzdGFuY2VzLmNvcHlBcnJheSggZ2VvbWV0cnkubGluZURpc3RhbmNlcyApICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgogICAgCQkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZS5jbG9uZSgpOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKICAgIAkJCQl0aGlzLmJvdW5kaW5nQm94ID0gZ2VvbWV0cnkuYm91bmRpbmdCb3guY2xvbmUoKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNNZXNoICkgewoKICAgIAkJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCQkJdGhpcy5mcm9tR2VvbWV0cnkoIGdlb21ldHJ5ICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkgewoKICAgIAkJdmFyIHBvc2l0aW9uID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgcG9pbnQgPSBwb2ludHNbIGkgXTsKICAgIAkJCXBvc2l0aW9uLnB1c2goIHBvaW50LngsIHBvaW50LnksIHBvaW50LnogfHwgMCApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbiwgMyApICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdXBkYXRlRnJvbU9iamVjdDogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CgogICAgCQlpZiAoIG9iamVjdC5pc01lc2ggKSB7CgogICAgCQkJdmFyIGRpcmVjdCA9IGdlb21ldHJ5Ll9fZGlyZWN0R2VvbWV0cnk7CgogICAgCQkJaWYgKCBnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPT09IHRydWUgKSB7CgogICAgCQkJCWRpcmVjdCA9IHVuZGVmaW5lZDsKICAgIAkJCQlnZW9tZXRyeS5lbGVtZW50c05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCBkaXJlY3QgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJcmV0dXJuIHRoaXMuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApOwoKICAgIAkJCX0KCiAgICAJCQlkaXJlY3QudmVydGljZXNOZWVkVXBkYXRlID0gZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlOwogICAgCQkJZGlyZWN0Lm5vcm1hbHNOZWVkVXBkYXRlID0gZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGU7CiAgICAJCQlkaXJlY3QuY29sb3JzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LmNvbG9yc05lZWRVcGRhdGU7CiAgICAJCQlkaXJlY3QudXZzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5LnV2c05lZWRVcGRhdGU7CiAgICAJCQlkaXJlY3QuZ3JvdXBzTmVlZFVwZGF0ZSA9IGdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGU7CgogICAgCQkJZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CiAgICAJCQlnZW9tZXRyeS5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCQkJZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCQkJZ2VvbWV0cnkudXZzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCQkJZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSA9IGZhbHNlOwoKICAgIAkJCWdlb21ldHJ5ID0gZGlyZWN0OwoKICAgIAkJfQoKICAgIAkJdmFyIGF0dHJpYnV0ZTsKCiAgICAJCWlmICggZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID09PSB0cnVlICkgewoKICAgIAkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKCiAgICAJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlhdHRyaWJ1dGUuY29weVZlY3RvcjNzQXJyYXkoIGdlb21ldHJ5LnZlcnRpY2VzICk7CiAgICAJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cnkudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CgogICAgCQl9CgogICAgCQlpZiAoIGdlb21ldHJ5Lm5vcm1hbHNOZWVkVXBkYXRlID09PSB0cnVlICkgewoKICAgIAkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy5ub3JtYWw7CgogICAgCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICk7CiAgICAJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cnkubm9ybWFsc05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCWlmICggZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9PT0gdHJ1ZSApIHsKCiAgICAJCQlhdHRyaWJ1dGUgPSB0aGlzLmF0dHJpYnV0ZXMuY29sb3I7CgogICAgCQkJaWYgKCBhdHRyaWJ1dGUgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJYXR0cmlidXRlLmNvcHlDb2xvcnNBcnJheSggZ2VvbWV0cnkuY29sb3JzICk7CiAgICAJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cnkuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOwoKICAgIAkJfQoKICAgIAkJaWYgKCBnZW9tZXRyeS51dnNOZWVkVXBkYXRlICkgewoKICAgIAkJCWF0dHJpYnV0ZSA9IHRoaXMuYXR0cmlidXRlcy51djsKCiAgICAJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlhdHRyaWJ1dGUuY29weVZlY3RvcjJzQXJyYXkoIGdlb21ldHJ5LnV2cyApOwogICAgCQkJCWF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJfQoKICAgIAkJCWdlb21ldHJ5LnV2c05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCWlmICggZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgKSB7CgogICAgCQkJYXR0cmlidXRlID0gdGhpcy5hdHRyaWJ1dGVzLmxpbmVEaXN0YW5jZTsKCiAgICAJCQlpZiAoIGF0dHJpYnV0ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlhdHRyaWJ1dGUuY29weUFycmF5KCBnZW9tZXRyeS5saW5lRGlzdGFuY2VzICk7CiAgICAJCQkJYXR0cmlidXRlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cnkubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCWlmICggZ2VvbWV0cnkuZ3JvdXBzTmVlZFVwZGF0ZSApIHsKCiAgICAJCQlnZW9tZXRyeS5jb21wdXRlR3JvdXBzKCBvYmplY3QuZ2VvbWV0cnkgKTsKICAgIAkJCXRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKICAgIAkJCWdlb21ldHJ5Lmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlmcm9tR2VvbWV0cnk6IGZ1bmN0aW9uICggZ2VvbWV0cnkgKSB7CgogICAgCQlnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ID0gbmV3IERpcmVjdEdlb21ldHJ5KCkuZnJvbUdlb21ldHJ5KCBnZW9tZXRyeSApOwoKICAgIAkJcmV0dXJuIHRoaXMuZnJvbURpcmVjdEdlb21ldHJ5KCBnZW9tZXRyeS5fX2RpcmVjdEdlb21ldHJ5ICk7CgogICAgCX0sCgogICAgCWZyb21EaXJlY3RHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKCiAgICAJCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS52ZXJ0aWNlcy5sZW5ndGggKiAzICk7CiAgICAJCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKS5jb3B5VmVjdG9yM3NBcnJheSggZ2VvbWV0cnkudmVydGljZXMgKSApOwoKICAgIAkJaWYgKCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJdmFyIG5vcm1hbHMgPSBuZXcgRmxvYXQzMkFycmF5KCBnZW9tZXRyeS5ub3JtYWxzLmxlbmd0aCAqIDMgKTsKICAgIAkJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbm9ybWFscywgMyApLmNvcHlWZWN0b3Izc0FycmF5KCBnZW9tZXRyeS5ub3JtYWxzICkgKTsKCiAgICAJCX0KCiAgICAJCWlmICggZ2VvbWV0cnkuY29sb3JzLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJdmFyIGNvbG9ycyA9IG5ldyBGbG9hdDMyQXJyYXkoIGdlb21ldHJ5LmNvbG9ycy5sZW5ndGggKiAzICk7CiAgICAJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkuY29weUNvbG9yc0FycmF5KCBnZW9tZXRyeS5jb2xvcnMgKSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBnZW9tZXRyeS51dnMubGVuZ3RoID4gMCApIHsKCiAgICAJCQl2YXIgdXZzID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzLmxlbmd0aCAqIDIgKTsKICAgIAkJCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgQnVmZmVyQXR0cmlidXRlKCB1dnMsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzICkgKTsKCiAgICAJCX0KCiAgICAJCWlmICggZ2VvbWV0cnkudXZzMi5sZW5ndGggPiAwICkgewoKICAgIAkJCXZhciB1dnMyID0gbmV3IEZsb2F0MzJBcnJheSggZ2VvbWV0cnkudXZzMi5sZW5ndGggKiAyICk7CiAgICAJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2MicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHV2czIsIDIgKS5jb3B5VmVjdG9yMnNBcnJheSggZ2VvbWV0cnkudXZzMiApICk7CgogICAgCQl9CgogICAgCQkvLyBncm91cHMKCiAgICAJCXRoaXMuZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKICAgIAkJLy8gbW9ycGhzCgogICAgCQlmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7CgogICAgCQkJdmFyIGFycmF5ID0gW107CiAgICAJCQl2YXIgbW9ycGhUYXJnZXRzID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzWyBuYW1lIF07CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbW9ycGhUYXJnZXRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCXZhciBtb3JwaFRhcmdldCA9IG1vcnBoVGFyZ2V0c1sgaSBdOwoKICAgIAkJCQl2YXIgYXR0cmlidXRlID0gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG1vcnBoVGFyZ2V0LmRhdGEubGVuZ3RoICogMywgMyApOwogICAgCQkJCWF0dHJpYnV0ZS5uYW1lID0gbW9ycGhUYXJnZXQubmFtZTsKCiAgICAJCQkJYXJyYXkucHVzaCggYXR0cmlidXRlLmNvcHlWZWN0b3Izc0FycmF5KCBtb3JwaFRhcmdldC5kYXRhICkgKTsKCiAgICAJCQl9CgogICAgCQkJdGhpcy5tb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXSA9IGFycmF5OwoKICAgIAkJfQoKICAgIAkJLy8gc2tpbm5pbmcKCiAgICAJCWlmICggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoID4gMCApIHsKCiAgICAJCQl2YXIgc2tpbkluZGljZXMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggZ2VvbWV0cnkuc2tpbkluZGljZXMubGVuZ3RoICogNCwgNCApOwogICAgCQkJdGhpcy5hZGRBdHRyaWJ1dGUoICdza2luSW5kZXgnLCBza2luSW5kaWNlcy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbkluZGljZXMgKSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggPiAwICkgewoKICAgIAkJCXZhciBza2luV2VpZ2h0cyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBnZW9tZXRyeS5za2luV2VpZ2h0cy5sZW5ndGggKiA0LCA0ICk7CiAgICAJCQl0aGlzLmFkZEF0dHJpYnV0ZSggJ3NraW5XZWlnaHQnLCBza2luV2VpZ2h0cy5jb3B5VmVjdG9yNHNBcnJheSggZ2VvbWV0cnkuc2tpbldlaWdodHMgKSApOwoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CgogICAgCQl9CgogICAgCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNvbXB1dGVCb3VuZGluZ0JveDogZnVuY3Rpb24gKCkgewoKICAgIAkJaWYgKCB0aGlzLmJvdW5kaW5nQm94ID09PSBudWxsICkgewoKICAgIAkJCXRoaXMuYm91bmRpbmdCb3ggPSBuZXcgQm94MygpOwoKICAgIAkJfQoKICAgIAkJdmFyIHBvc2l0aW9uID0gdGhpcy5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCQl2YXIgbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gPSB0aGlzLm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjsKCiAgICAJCWlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl0aGlzLmJvdW5kaW5nQm94LnNldEZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uICk7CgogICAgCQkJLy8gcHJvY2VzcyBtb3JwaCBhdHRyaWJ1dGVzIGlmIHByZXNlbnQKCiAgICAJCQlpZiAoIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uICkgewoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24ubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvblsgaSBdOwogICAgCQkJCQlfYm94JDEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUgKTsKCiAgICAJCQkJCXRoaXMuYm91bmRpbmdCb3guZXhwYW5kQnlQb2ludCggX2JveCQxLm1pbiApOwogICAgCQkJCQl0aGlzLmJvdW5kaW5nQm94LmV4cGFuZEJ5UG9pbnQoIF9ib3gkMS5tYXggKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdGhpcy5ib3VuZGluZ0JveC5tYWtlRW1wdHkoKTsKCiAgICAJCX0KCiAgICAJCWlmICggaXNOYU4oIHRoaXMuYm91bmRpbmdCb3gubWluLnggKSB8fCBpc05hTiggdGhpcy5ib3VuZGluZ0JveC5taW4ueSApIHx8IGlzTmFOKCB0aGlzLmJvdW5kaW5nQm94Lm1pbi56ICkgKSB7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ0JveDogQ29tcHV0ZWQgbWluL21heCBoYXZlIE5hTiB2YWx1ZXMuIFRoZSAicG9zaXRpb24iIGF0dHJpYnV0ZSBpcyBsaWtlbHkgdG8gaGF2ZSBOYU4gdmFsdWVzLicsIHRoaXMgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJY29tcHV0ZUJvdW5kaW5nU3BoZXJlOiBmdW5jdGlvbiAoKSB7CgogICAgCQlpZiAoIHRoaXMuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG5ldyBTcGhlcmUoKTsKCiAgICAJCX0KCiAgICAJCXZhciBwb3NpdGlvbiA9IHRoaXMuYXR0cmlidXRlcy5wb3NpdGlvbjsKICAgIAkJdmFyIG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb247CgogICAgCQlpZiAoIHBvc2l0aW9uICkgewoKICAgIAkJCS8vIGZpcnN0LCBmaW5kIHRoZSBjZW50ZXIgb2YgdGhlIGJvdW5kaW5nIHNwaGVyZQoKICAgIAkJCXZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjsKCiAgICAJCQlfYm94JDEuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24gKTsKCiAgICAJCQkvLyBwcm9jZXNzIG1vcnBoIGF0dHJpYnV0ZXMgaWYgcHJlc2VudAoKICAgIAkJCWlmICggbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb24gKSB7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJCXZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uWyBpIF07CiAgICAJCQkJCV9ib3hNb3JwaFRhcmdldHMuc2V0RnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUgKTsKCiAgICAJCQkJCV9ib3gkMS5leHBhbmRCeVBvaW50KCBfYm94TW9ycGhUYXJnZXRzLm1pbiApOwogICAgCQkJCQlfYm94JDEuZXhwYW5kQnlQb2ludCggX2JveE1vcnBoVGFyZ2V0cy5tYXggKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQlfYm94JDEuZ2V0Q2VudGVyKCBjZW50ZXIgKTsKCiAgICAJCQkvLyBzZWNvbmQsIHRyeSB0byBmaW5kIGEgYm91bmRpbmdTcGhlcmUgd2l0aCBhIHJhZGl1cyBzbWFsbGVyIHRoYW4gdGhlCiAgICAJCQkvLyBib3VuZGluZ1NwaGVyZSBvZiB0aGUgYm91bmRpbmdCb3g6IHNxcnQoMykgc21hbGxlciBpbiB0aGUgYmVzdCBjYXNlCgogICAgCQkJdmFyIG1heFJhZGl1c1NxID0gMDsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb24uY291bnQ7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJX3ZlY3RvciQ0LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBpICk7CgogICAgCQkJCW1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIF92ZWN0b3IkNCApICk7CgogICAgCQkJfQoKICAgIAkJCS8vIHByb2Nlc3MgbW9ycGggYXR0cmlidXRlcyBpZiBwcmVzZW50CgogICAgCQkJaWYgKCBtb3JwaEF0dHJpYnV0ZXNQb3NpdGlvbiApIHsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoQXR0cmlidXRlc1Bvc2l0aW9uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCQkJdmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzUG9zaXRpb25bIGkgXTsKCiAgICAJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBtb3JwaEF0dHJpYnV0ZS5jb3VudDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCQkJCV92ZWN0b3IkNC5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgaiApOwoKICAgIAkJCQkJCW1heFJhZGl1c1NxID0gTWF0aC5tYXgoIG1heFJhZGl1c1NxLCBjZW50ZXIuZGlzdGFuY2VUb1NxdWFyZWQoIF92ZWN0b3IkNCApICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgPSBNYXRoLnNxcnQoIG1heFJhZGl1c1NxICk7CgogICAgCQkJaWYgKCBpc05hTiggdGhpcy5ib3VuZGluZ1NwaGVyZS5yYWRpdXMgKSApIHsKCiAgICAJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOiBDb21wdXRlZCByYWRpdXMgaXMgTmFOLiBUaGUgInBvc2l0aW9uIiBhdHRyaWJ1dGUgaXMgbGlrZWx5IHRvIGhhdmUgTmFOIHZhbHVlcy4nLCB0aGlzICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9LAoKICAgIAljb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCS8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CgogICAgCX0sCgogICAgCWNvbXB1dGVWZXJ0ZXhOb3JtYWxzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgaW5kZXggPSB0aGlzLmluZGV4OwogICAgCQl2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlczsKCiAgICAJCWlmICggYXR0cmlidXRlcy5wb3NpdGlvbiApIHsKCiAgICAJCQl2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTsKCiAgICAJCQlpZiAoIGF0dHJpYnV0ZXMubm9ybWFsID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb25zLmxlbmd0aCApLCAzICkgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQkvLyByZXNldCBleGlzdGluZyBub3JtYWxzIHRvIHplcm8KCiAgICAJCQkJdmFyIGFycmF5ID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJCWFycmF5WyBpIF0gPSAwOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCXZhciBub3JtYWxzID0gYXR0cmlidXRlcy5ub3JtYWwuYXJyYXk7CgogICAgCQkJdmFyIHZBLCB2QiwgdkM7CiAgICAJCQl2YXIgcEEgPSBuZXcgVmVjdG9yMygpLCBwQiA9IG5ldyBWZWN0b3IzKCksIHBDID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJCXZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCQkvLyBpbmRleGVkIGVsZW1lbnRzCgogICAgCQkJaWYgKCBpbmRleCApIHsKCiAgICAJCQkJdmFyIGluZGljZXMgPSBpbmRleC5hcnJheTsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGV4LmNvdW50OyBpIDwgaWw7IGkgKz0gMyApIHsKCiAgICAJCQkJCXZBID0gaW5kaWNlc1sgaSArIDAgXSAqIDM7CiAgICAJCQkJCXZCID0gaW5kaWNlc1sgaSArIDEgXSAqIDM7CiAgICAJCQkJCXZDID0gaW5kaWNlc1sgaSArIDIgXSAqIDM7CgogICAgCQkJCQlwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgdkEgKTsKICAgIAkJCQkJcEIuZnJvbUFycmF5KCBwb3NpdGlvbnMsIHZCICk7CiAgICAJCQkJCXBDLmZyb21BcnJheSggcG9zaXRpb25zLCB2QyApOwoKICAgIAkJCQkJY2Iuc3ViVmVjdG9ycyggcEMsIHBCICk7CiAgICAJCQkJCWFiLnN1YlZlY3RvcnMoIHBBLCBwQiApOwogICAgCQkJCQljYi5jcm9zcyggYWIgKTsKCiAgICAJCQkJCW5vcm1hbHNbIHZBIF0gKz0gY2IueDsKICAgIAkJCQkJbm9ybWFsc1sgdkEgKyAxIF0gKz0gY2IueTsKICAgIAkJCQkJbm9ybWFsc1sgdkEgKyAyIF0gKz0gY2IuejsKCiAgICAJCQkJCW5vcm1hbHNbIHZCIF0gKz0gY2IueDsKICAgIAkJCQkJbm9ybWFsc1sgdkIgKyAxIF0gKz0gY2IueTsKICAgIAkJCQkJbm9ybWFsc1sgdkIgKyAyIF0gKz0gY2IuejsKCiAgICAJCQkJCW5vcm1hbHNbIHZDIF0gKz0gY2IueDsKICAgIAkJCQkJbm9ybWFsc1sgdkMgKyAxIF0gKz0gY2IueTsKICAgIAkJCQkJbm9ybWFsc1sgdkMgKyAyIF0gKz0gY2IuejsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCS8vIG5vbi1pbmRleGVkIGVsZW1lbnRzICh1bmNvbm5lY3RlZCB0cmlhbmdsZSBzb3VwKQoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gcG9zaXRpb25zLmxlbmd0aDsgaSA8IGlsOyBpICs9IDkgKSB7CgogICAgCQkJCQlwQS5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSApOwogICAgCQkJCQlwQi5mcm9tQXJyYXkoIHBvc2l0aW9ucywgaSArIDMgKTsKICAgIAkJCQkJcEMuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKyA2ICk7CgogICAgCQkJCQljYi5zdWJWZWN0b3JzKCBwQywgcEIgKTsKICAgIAkJCQkJYWIuc3ViVmVjdG9ycyggcEEsIHBCICk7CiAgICAJCQkJCWNiLmNyb3NzKCBhYiApOwoKICAgIAkJCQkJbm9ybWFsc1sgaSBdID0gY2IueDsKICAgIAkJCQkJbm9ybWFsc1sgaSArIDEgXSA9IGNiLnk7CiAgICAJCQkJCW5vcm1hbHNbIGkgKyAyIF0gPSBjYi56OwoKICAgIAkJCQkJbm9ybWFsc1sgaSArIDMgXSA9IGNiLng7CiAgICAJCQkJCW5vcm1hbHNbIGkgKyA0IF0gPSBjYi55OwogICAgCQkJCQlub3JtYWxzWyBpICsgNSBdID0gY2IuejsKCiAgICAJCQkJCW5vcm1hbHNbIGkgKyA2IF0gPSBjYi54OwogICAgCQkJCQlub3JtYWxzWyBpICsgNyBdID0gY2IueTsKICAgIAkJCQkJbm9ybWFsc1sgaSArIDggXSA9IGNiLno7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJdGhpcy5ub3JtYWxpemVOb3JtYWxzKCk7CgogICAgCQkJYXR0cmlidXRlcy5ub3JtYWwubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeSwgb2Zmc2V0ICkgewoKICAgIAkJaWYgKCAhICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJHZW9tZXRyeS5tZXJnZSgpOiBnZW9tZXRyeSBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQnVmZmVyR2VvbWV0cnkuJywgZ2VvbWV0cnkgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJb2Zmc2V0ID0gMDsKCiAgICAJCQljb25zb2xlLndhcm4oCiAgICAJCQkJJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5Lm1lcmdlKCk6IE92ZXJ3cml0aW5nIG9yaWdpbmFsIGdlb21ldHJ5LCBzdGFydGluZyBhdCBvZmZzZXQ9MC4gJwogICAgCQkJCSsgJ1VzZSBCdWZmZXJHZW9tZXRyeVV0aWxzLm1lcmdlQnVmZmVyR2VvbWV0cmllcygpIGZvciBsb3NzbGVzcyBtZXJnZS4nCiAgICAJCQkpOwoKICAgIAkJfQoKICAgIAkJdmFyIGF0dHJpYnV0ZXMgPSB0aGlzLmF0dHJpYnV0ZXM7CgogICAgCQlmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7CgogICAgCQkJaWYgKCBnZW9tZXRyeS5hdHRyaWJ1dGVzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgY29udGludWU7CgogICAgCQkJdmFyIGF0dHJpYnV0ZTEgPSBhdHRyaWJ1dGVzWyBrZXkgXTsKICAgIAkJCXZhciBhdHRyaWJ1dGVBcnJheTEgPSBhdHRyaWJ1dGUxLmFycmF5OwoKICAgIAkJCXZhciBhdHRyaWJ1dGUyID0gZ2VvbWV0cnkuYXR0cmlidXRlc1sga2V5IF07CiAgICAJCQl2YXIgYXR0cmlidXRlQXJyYXkyID0gYXR0cmlidXRlMi5hcnJheTsKCiAgICAJCQl2YXIgYXR0cmlidXRlT2Zmc2V0ID0gYXR0cmlidXRlMi5pdGVtU2l6ZSAqIG9mZnNldDsKICAgIAkJCXZhciBsZW5ndGggPSBNYXRoLm1pbiggYXR0cmlidXRlQXJyYXkyLmxlbmd0aCwgYXR0cmlidXRlQXJyYXkxLmxlbmd0aCAtIGF0dHJpYnV0ZU9mZnNldCApOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgaiA9IGF0dHJpYnV0ZU9mZnNldDsgaSA8IGxlbmd0aDsgaSArKywgaiArKyApIHsKCiAgICAJCQkJYXR0cmlidXRlQXJyYXkxWyBqIF0gPSBhdHRyaWJ1dGVBcnJheTJbIGkgXTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbm9ybWFsaXplTm9ybWFsczogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG5vcm1hbHMuY291bnQ7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQlfdmVjdG9yJDQueCA9IG5vcm1hbHMuZ2V0WCggaSApOwogICAgCQkJX3ZlY3RvciQ0LnkgPSBub3JtYWxzLmdldFkoIGkgKTsKICAgIAkJCV92ZWN0b3IkNC56ID0gbm9ybWFscy5nZXRaKCBpICk7CgogICAgCQkJX3ZlY3RvciQ0Lm5vcm1hbGl6ZSgpOwoKICAgIAkJCW5vcm1hbHMuc2V0WFlaKCBpLCBfdmVjdG9yJDQueCwgX3ZlY3RvciQ0LnksIF92ZWN0b3IkNC56ICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCXRvTm9uSW5kZXhlZDogZnVuY3Rpb24gKCkgewoKICAgIAkJZnVuY3Rpb24gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICkgewoKICAgIAkJCXZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKICAgIAkJCXZhciBpdGVtU2l6ZSA9IGF0dHJpYnV0ZS5pdGVtU2l6ZTsKCiAgICAJCQl2YXIgYXJyYXkyID0gbmV3IGFycmF5LmNvbnN0cnVjdG9yKCBpbmRpY2VzLmxlbmd0aCAqIGl0ZW1TaXplICk7CgogICAgCQkJdmFyIGluZGV4ID0gMCwgaW5kZXgyID0gMDsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCWluZGV4ID0gaW5kaWNlc1sgaSBdICogaXRlbVNpemU7CgogICAgCQkJCWZvciAoIHZhciBqID0gMDsgaiA8IGl0ZW1TaXplOyBqICsrICkgewoKICAgIAkJCQkJYXJyYXkyWyBpbmRleDIgKysgXSA9IGFycmF5WyBpbmRleCArKyBdOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCXJldHVybiBuZXcgQnVmZmVyQXR0cmlidXRlKCBhcnJheTIsIGl0ZW1TaXplICk7CgogICAgCQl9CgogICAgCQkvLwoKICAgIAkJaWYgKCB0aGlzLmluZGV4ID09PSBudWxsICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5LnRvTm9uSW5kZXhlZCgpOiBHZW9tZXRyeSBpcyBhbHJlYWR5IG5vbi1pbmRleGVkLicgKTsKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQoKICAgIAkJdmFyIGdlb21ldHJ5MiA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoKICAgIAkJdmFyIGluZGljZXMgPSB0aGlzLmluZGV4LmFycmF5OwogICAgCQl2YXIgYXR0cmlidXRlcyA9IHRoaXMuYXR0cmlidXRlczsKCiAgICAJCS8vIGF0dHJpYnV0ZXMKCiAgICAJCWZvciAoIHZhciBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7CgogICAgCQkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTsKCiAgICAJCQl2YXIgbmV3QXR0cmlidXRlID0gY29udmVydEJ1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlLCBpbmRpY2VzICk7CgogICAgCQkJZ2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggbmFtZSwgbmV3QXR0cmlidXRlICk7CgogICAgCQl9CgogICAgCQkvLyBtb3JwaCBhdHRyaWJ1dGVzCgogICAgCQl2YXIgbW9ycGhBdHRyaWJ1dGVzID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXM7CgogICAgCQlmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHsKCiAgICAJCQl2YXIgbW9ycGhBcnJheSA9IFtdOwogICAgCQkJdmFyIG1vcnBoQXR0cmlidXRlID0gbW9ycGhBdHRyaWJ1dGVzWyBuYW1lIF07IC8vIG1vcnBoQXR0cmlidXRlOiBhcnJheSBvZiBGbG9hdDMyQnVmZmVyQXR0cmlidXRlcwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBtb3JwaEF0dHJpYnV0ZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJdmFyIGF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlWyBpIF07CgogICAgCQkJCXZhciBuZXdBdHRyaWJ1dGUgPSBjb252ZXJ0QnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGljZXMgKTsKCiAgICAJCQkJbW9ycGhBcnJheS5wdXNoKCBuZXdBdHRyaWJ1dGUgKTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cnkyLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gbW9ycGhBcnJheTsKCiAgICAJCX0KCiAgICAJCS8vIGdyb3VwcwoKICAgIAkJdmFyIGdyb3VwcyA9IHRoaXMuZ3JvdXBzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gZ3JvdXBzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07CiAgICAJCQlnZW9tZXRyeTIuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGdlb21ldHJ5MjsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZGF0YSA9IHsKICAgIAkJCW1ldGFkYXRhOiB7CiAgICAJCQkJdmVyc2lvbjogNC41LAogICAgCQkJCXR5cGU6ICdCdWZmZXJHZW9tZXRyeScsCiAgICAJCQkJZ2VuZXJhdG9yOiAnQnVmZmVyR2VvbWV0cnkudG9KU09OJwogICAgCQkJfQogICAgCQl9OwoKICAgIAkJLy8gc3RhbmRhcmQgQnVmZmVyR2VvbWV0cnkgc2VyaWFsaXphdGlvbgoKICAgIAkJZGF0YS51dWlkID0gdGhpcy51dWlkOwogICAgCQlkYXRhLnR5cGUgPSB0aGlzLnR5cGU7CiAgICAJCWlmICggdGhpcy5uYW1lICE9PSAnJyApIGRhdGEubmFtZSA9IHRoaXMubmFtZTsKICAgIAkJaWYgKCBPYmplY3Qua2V5cyggdGhpcy51c2VyRGF0YSApLmxlbmd0aCA+IDAgKSBkYXRhLnVzZXJEYXRhID0gdGhpcy51c2VyRGF0YTsKCiAgICAJCWlmICggdGhpcy5wYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CgogICAgCQkJZm9yICggdmFyIGtleSBpbiBwYXJhbWV0ZXJzICkgewoKICAgIAkJCQlpZiAoIHBhcmFtZXRlcnNbIGtleSBdICE9PSB1bmRlZmluZWQgKSBkYXRhWyBrZXkgXSA9IHBhcmFtZXRlcnNbIGtleSBdOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gZGF0YTsKCiAgICAJCX0KCiAgICAJCWRhdGEuZGF0YSA9IHsgYXR0cmlidXRlczoge30gfTsKCiAgICAJCXZhciBpbmRleCA9IHRoaXMuaW5kZXg7CgogICAgCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKICAgIAkJCWRhdGEuZGF0YS5pbmRleCA9IHsKICAgIAkJCQl0eXBlOiBpbmRleC5hcnJheS5jb25zdHJ1Y3Rvci5uYW1lLAogICAgCQkJCWFycmF5OiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggaW5kZXguYXJyYXkgKQogICAgCQkJfTsKCiAgICAJCX0KCiAgICAJCXZhciBhdHRyaWJ1dGVzID0gdGhpcy5hdHRyaWJ1dGVzOwoKICAgIAkJZm9yICggdmFyIGtleSBpbiBhdHRyaWJ1dGVzICkgewoKICAgIAkJCXZhciBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzWyBrZXkgXTsKCiAgICAJCQl2YXIgYXR0cmlidXRlRGF0YSA9IGF0dHJpYnV0ZS50b0pTT04oKTsKCiAgICAJCQlpZiAoIGF0dHJpYnV0ZS5uYW1lICE9PSAnJyApIGF0dHJpYnV0ZURhdGEubmFtZSA9IGF0dHJpYnV0ZS5uYW1lOwoKICAgIAkJCWRhdGEuZGF0YS5hdHRyaWJ1dGVzWyBrZXkgXSA9IGF0dHJpYnV0ZURhdGE7CgogICAgCQl9CgogICAgCQl2YXIgbW9ycGhBdHRyaWJ1dGVzID0ge307CiAgICAJCXZhciBoYXNNb3JwaEF0dHJpYnV0ZXMgPSBmYWxzZTsKCiAgICAJCWZvciAoIHZhciBrZXkgaW4gdGhpcy5tb3JwaEF0dHJpYnV0ZXMgKSB7CgogICAgCQkJdmFyIGF0dHJpYnV0ZUFycmF5ID0gdGhpcy5tb3JwaEF0dHJpYnV0ZXNbIGtleSBdOwoKICAgIAkJCXZhciBhcnJheSA9IFtdOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBhdHRyaWJ1dGVBcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZUFycmF5WyBpIF07CgogICAgCQkJCXZhciBhdHRyaWJ1dGVEYXRhID0gYXR0cmlidXRlLnRvSlNPTigpOwoKICAgIAkJCQlpZiAoIGF0dHJpYnV0ZS5uYW1lICE9PSAnJyApIGF0dHJpYnV0ZURhdGEubmFtZSA9IGF0dHJpYnV0ZS5uYW1lOwoKICAgIAkJCQlhcnJheS5wdXNoKCBhdHRyaWJ1dGVEYXRhICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggYXJyYXkubGVuZ3RoID4gMCApIHsKCiAgICAJCQkJbW9ycGhBdHRyaWJ1dGVzWyBrZXkgXSA9IGFycmF5OwoKICAgIAkJCQloYXNNb3JwaEF0dHJpYnV0ZXMgPSB0cnVlOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggaGFzTW9ycGhBdHRyaWJ1dGVzICkgZGF0YS5kYXRhLm1vcnBoQXR0cmlidXRlcyA9IG1vcnBoQXR0cmlidXRlczsKCiAgICAJCXZhciBncm91cHMgPSB0aGlzLmdyb3VwczsKCiAgICAJCWlmICggZ3JvdXBzLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJZGF0YS5kYXRhLmdyb3VwcyA9IEpTT04ucGFyc2UoIEpTT04uc3RyaW5naWZ5KCBncm91cHMgKSApOwoKICAgIAkJfQoKICAgIAkJdmFyIGJvdW5kaW5nU3BoZXJlID0gdGhpcy5ib3VuZGluZ1NwaGVyZTsKCiAgICAJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgogICAgCQkJZGF0YS5kYXRhLmJvdW5kaW5nU3BoZXJlID0gewogICAgCQkJCWNlbnRlcjogYm91bmRpbmdTcGhlcmUuY2VudGVyLnRvQXJyYXkoKSwKICAgIAkJCQlyYWRpdXM6IGJvdW5kaW5nU3BoZXJlLnJhZGl1cwogICAgCQkJfTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJLyoKICAgIAkJIC8vIEhhbmRsZSBwcmltaXRpdmVzCgogICAgCQkgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CgogICAgCQkgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkgdmFyIHZhbHVlcyA9IFtdOwoKICAgIAkJIGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsKCiAgICAJCSB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTsKCiAgICAJCSB9CgogICAgCQkgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTsKICAgIAkJIHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTsKICAgIAkJIHJldHVybiBnZW9tZXRyeTsKCiAgICAJCSB9CgogICAgCQkgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwogICAgCQkgKi8KCiAgICAJCXJldHVybiBuZXcgQnVmZmVyR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJdmFyIG5hbWUsIGksIGw7CgogICAgCQkvLyByZXNldAoKICAgIAkJdGhpcy5pbmRleCA9IG51bGw7CiAgICAJCXRoaXMuYXR0cmlidXRlcyA9IHt9OwogICAgCQl0aGlzLm1vcnBoQXR0cmlidXRlcyA9IHt9OwogICAgCQl0aGlzLmdyb3VwcyA9IFtdOwogICAgCQl0aGlzLmJvdW5kaW5nQm94ID0gbnVsbDsKICAgIAkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7CgogICAgCQkvLyBuYW1lCgogICAgCQl0aGlzLm5hbWUgPSBzb3VyY2UubmFtZTsKCiAgICAJCS8vIGluZGV4CgogICAgCQl2YXIgaW5kZXggPSBzb3VyY2UuaW5kZXg7CgogICAgCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuc2V0SW5kZXgoIGluZGV4LmNsb25lKCkgKTsKCiAgICAJCX0KCiAgICAJCS8vIGF0dHJpYnV0ZXMKCiAgICAJCXZhciBhdHRyaWJ1dGVzID0gc291cmNlLmF0dHJpYnV0ZXM7CgogICAgCQlmb3IgKCBuYW1lIGluIGF0dHJpYnV0ZXMgKSB7CgogICAgCQkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIG5hbWUgXTsKICAgIAkJCXRoaXMuYWRkQXR0cmlidXRlKCBuYW1lLCBhdHRyaWJ1dGUuY2xvbmUoKSApOwoKICAgIAkJfQoKICAgIAkJLy8gbW9ycGggYXR0cmlidXRlcwoKICAgIAkJdmFyIG1vcnBoQXR0cmlidXRlcyA9IHNvdXJjZS5tb3JwaEF0dHJpYnV0ZXM7CgogICAgCQlmb3IgKCBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHsKCiAgICAJCQl2YXIgYXJyYXkgPSBbXTsKICAgIAkJCXZhciBtb3JwaEF0dHJpYnV0ZSA9IG1vcnBoQXR0cmlidXRlc1sgbmFtZSBdOyAvLyBtb3JwaEF0dHJpYnV0ZTogYXJyYXkgb2YgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZXMKCiAgICAJCQlmb3IgKCBpID0gMCwgbCA9IG1vcnBoQXR0cmlidXRlLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCWFycmF5LnB1c2goIG1vcnBoQXR0cmlidXRlWyBpIF0uY2xvbmUoKSApOwoKICAgIAkJCX0KCiAgICAJCQl0aGlzLm1vcnBoQXR0cmlidXRlc1sgbmFtZSBdID0gYXJyYXk7CgogICAgCQl9CgogICAgCQkvLyBncm91cHMKCiAgICAJCXZhciBncm91cHMgPSBzb3VyY2UuZ3JvdXBzOwoKICAgIAkJZm9yICggaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKICAgIAkJCXRoaXMuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOwoKICAgIAkJfQoKICAgIAkJLy8gYm91bmRpbmcgYm94CgogICAgCQl2YXIgYm91bmRpbmdCb3ggPSBzb3VyY2UuYm91bmRpbmdCb3g7CgogICAgCQlpZiAoIGJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuYm91bmRpbmdCb3ggPSBib3VuZGluZ0JveC5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJLy8gYm91bmRpbmcgc3BoZXJlCgogICAgCQl2YXIgYm91bmRpbmdTcGhlcmUgPSBzb3VyY2UuYm91bmRpbmdTcGhlcmU7CgogICAgCQlpZiAoIGJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBib3VuZGluZ1NwaGVyZS5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJLy8gZHJhdyByYW5nZQoKICAgIAkJdGhpcy5kcmF3UmFuZ2Uuc3RhcnQgPSBzb3VyY2UuZHJhd1JhbmdlLnN0YXJ0OwogICAgCQl0aGlzLmRyYXdSYW5nZS5jb3VudCA9IHNvdXJjZS5kcmF3UmFuZ2UuY291bnQ7CgogICAgCQkvLyB1c2VyIGRhdGEKCiAgICAJCXRoaXMudXNlckRhdGEgPSBzb3VyY2UudXNlckRhdGE7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZGlzcG9zZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdkaXNwb3NlJyB9ICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgbWlrYWVsIGVtdGluZ2VyIC8gaHR0cDovL2dvbW8uc2UvCiAgICAgKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwOi8vam9ub2JyMS5jb20vCiAgICAgKi8KCiAgICB2YXIgX2ludmVyc2VNYXRyaXggPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF9yYXkgPSBuZXcgUmF5KCk7CiAgICB2YXIgX3NwaGVyZSA9IG5ldyBTcGhlcmUoKTsKCiAgICB2YXIgX3ZBID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfdkIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF92QyA9IG5ldyBWZWN0b3IzKCk7CgogICAgdmFyIF90ZW1wQSA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3RlbXBCID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfdGVtcEMgPSBuZXcgVmVjdG9yMygpOwoKICAgIHZhciBfbW9ycGhBID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbW9ycGhCID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbW9ycGhDID0gbmV3IFZlY3RvcjMoKTsKCiAgICB2YXIgX3V2QSA9IG5ldyBWZWN0b3IyKCk7CiAgICB2YXIgX3V2QiA9IG5ldyBWZWN0b3IyKCk7CiAgICB2YXIgX3V2QyA9IG5ldyBWZWN0b3IyKCk7CgogICAgdmFyIF9pbnRlcnNlY3Rpb25Qb2ludCA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX2ludGVyc2VjdGlvblBvaW50V29ybGQgPSBuZXcgVmVjdG9yMygpOwoKICAgIGZ1bmN0aW9uIE1lc2goIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnTWVzaCc7CgogICAgCXRoaXMuZ2VvbWV0cnkgPSBnZW9tZXRyeSAhPT0gdW5kZWZpbmVkID8gZ2VvbWV0cnkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAl0aGlzLm1hdGVyaWFsID0gbWF0ZXJpYWwgIT09IHVuZGVmaW5lZCA/IG1hdGVyaWFsIDogbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBNYXRoLnJhbmRvbSgpICogMHhmZmZmZmYgfSApOwoKICAgIAl0aGlzLmRyYXdNb2RlID0gVHJpYW5nbGVzRHJhd01vZGU7CgogICAgCXRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7CgogICAgfQoKICAgIE1lc2gucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IE1lc2gsCgogICAgCWlzTWVzaDogdHJ1ZSwKCiAgICAJc2V0RHJhd01vZGU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQl0aGlzLmRyYXdNb2RlID0gdmFsdWU7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLmRyYXdNb2RlID0gc291cmNlLmRyYXdNb2RlOwoKICAgIAkJaWYgKCBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJdGhpcy5tb3JwaFRhcmdldEluZmx1ZW5jZXMgPSBzb3VyY2UubW9ycGhUYXJnZXRJbmZsdWVuY2VzLnNsaWNlKCk7CgogICAgCQl9CgogICAgCQlpZiAoIHNvdXJjZS5tb3JwaFRhcmdldERpY3Rpb25hcnkgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UubW9ycGhUYXJnZXREaWN0aW9uYXJ5ICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgCQl2YXIgbSwgbWwsIG5hbWU7CgogICAgCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgogICAgCQkJdmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlczsKICAgIAkJCXZhciBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApOwoKICAgIAkJCWlmICgga2V5cy5sZW5ndGggPiAwICkgewoKICAgIAkJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdOwoKICAgIAkJCQlpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOwogICAgCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9OwoKICAgIAkJCQkJZm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7CgogICAgCQkJCQkJbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTsKCiAgICAJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7CiAgICAJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKCiAgICAJCQlpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkgewoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWVzaC51cGRhdGVNb3JwaFRhcmdldHMoKSBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCXJheWNhc3Q6IGZ1bmN0aW9uICggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgewoKICAgIAkJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgIAkJdmFyIG1hdGVyaWFsID0gdGhpcy5tYXRlcmlhbDsKICAgIAkJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5tYXRyaXhXb3JsZDsKCiAgICAJCWlmICggbWF0ZXJpYWwgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCiAgICAJCS8vIENoZWNraW5nIGJvdW5kaW5nU3BoZXJlIGRpc3RhbmNlIHRvIHJheQoKICAgIAkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKICAgIAkJX3NwaGVyZS5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOwogICAgCQlfc3BoZXJlLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKCiAgICAJCWlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlICkgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJLy8KCiAgICAJCV9pbnZlcnNlTWF0cml4LmdldEludmVyc2UoIG1hdHJpeFdvcmxkICk7CiAgICAJCV9yYXkuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXggKTsKCiAgICAJCS8vIENoZWNrIGJvdW5kaW5nQm94IGJlZm9yZSBjb250aW51aW5nCgogICAgCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKICAgIAkJCWlmICggX3JheS5pbnRlcnNlY3RzQm94KCBnZW9tZXRyeS5ib3VuZGluZ0JveCApID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCX0KCiAgICAJCXZhciBpbnRlcnNlY3Rpb247CgogICAgCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgogICAgCQkJdmFyIGEsIGIsIGM7CiAgICAJCQl2YXIgaW5kZXggPSBnZW9tZXRyeS5pbmRleDsKICAgIAkJCXZhciBwb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAJCQl2YXIgbW9ycGhQb3NpdGlvbiA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbjsKICAgIAkJCXZhciB1diA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMudXY7CiAgICAJCQl2YXIgdXYyID0gZ2VvbWV0cnkuYXR0cmlidXRlcy51djI7CiAgICAJCQl2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwogICAgCQkJdmFyIGRyYXdSYW5nZSA9IGdlb21ldHJ5LmRyYXdSYW5nZTsKICAgIAkJCXZhciBpLCBqLCBpbCwgamw7CiAgICAJCQl2YXIgZ3JvdXAsIGdyb3VwTWF0ZXJpYWw7CiAgICAJCQl2YXIgc3RhcnQsIGVuZDsKCiAgICAJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKICAgIAkJCQkvLyBpbmRleGVkIGJ1ZmZlciBnZW9tZXRyeQoKICAgIAkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7CgogICAgCQkJCQlmb3IgKCBpID0gMCwgaWwgPSBncm91cHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQkJZ3JvdXAgPSBncm91cHNbIGkgXTsKICAgIAkJCQkJCWdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdOwoKICAgIAkJCQkJCXN0YXJ0ID0gTWF0aC5tYXgoIGdyb3VwLnN0YXJ0LCBkcmF3UmFuZ2Uuc3RhcnQgKTsKICAgIAkJCQkJCWVuZCA9IE1hdGgubWluKCAoIGdyb3VwLnN0YXJ0ICsgZ3JvdXAuY291bnQgKSwgKCBkcmF3UmFuZ2Uuc3RhcnQgKyBkcmF3UmFuZ2UuY291bnQgKSApOwoKICAgIAkJCQkJCWZvciAoIGogPSBzdGFydCwgamwgPSBlbmQ7IGogPCBqbDsgaiArPSAzICkgewoKICAgIAkJCQkJCQlhID0gaW5kZXguZ2V0WCggaiApOwogICAgCQkJCQkJCWIgPSBpbmRleC5nZXRYKCBqICsgMSApOwogICAgCQkJCQkJCWMgPSBpbmRleC5nZXRYKCBqICsgMiApOwoKICAgIAkJCQkJCQlpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBncm91cE1hdGVyaWFsLCByYXljYXN0ZXIsIF9yYXksIHBvc2l0aW9uLCBtb3JwaFBvc2l0aW9uLCB1diwgdXYyLCBhLCBiLCBjICk7CgogICAgCQkJCQkJCWlmICggaW50ZXJzZWN0aW9uICkgewoKICAgIAkJCQkJCQkJaW50ZXJzZWN0aW9uLmZhY2VJbmRleCA9IE1hdGguZmxvb3IoIGogLyAzICk7IC8vIHRyaWFuZ2xlIG51bWJlciBpbiBpbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3MKICAgIAkJCQkJCQkJaW50ZXJzZWN0aW9uLmZhY2UubWF0ZXJpYWxJbmRleCA9IGdyb3VwLm1hdGVyaWFsSW5kZXg7CiAgICAJCQkJCQkJCWludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CgogICAgCQkJCQkJCX0KCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQlzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTsKICAgIAkJCQkJZW5kID0gTWF0aC5taW4oIGluZGV4LmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7CgogICAgCQkJCQlmb3IgKCBpID0gc3RhcnQsIGlsID0gZW5kOyBpIDwgaWw7IGkgKz0gMyApIHsKCiAgICAJCQkJCQlhID0gaW5kZXguZ2V0WCggaSApOwogICAgCQkJCQkJYiA9IGluZGV4LmdldFgoIGkgKyAxICk7CiAgICAJCQkJCQljID0gaW5kZXguZ2V0WCggaSArIDIgKTsKCiAgICAJCQkJCQlpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCBfcmF5LCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgdXYsIHV2MiwgYSwgYiwgYyApOwoKICAgIAkJCQkJCWlmICggaW50ZXJzZWN0aW9uICkgewoKICAgIAkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIGluZGV4ZWQgYnVmZmVyIHNlbWFudGljcwogICAgCQkJCQkJCWludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJLy8gbm9uLWluZGV4ZWQgYnVmZmVyIGdlb21ldHJ5CgogICAgCQkJCWlmICggQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKSApIHsKCiAgICAJCQkJCWZvciAoIGkgPSAwLCBpbCA9IGdyb3Vwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJCQlncm91cCA9IGdyb3Vwc1sgaSBdOwogICAgCQkJCQkJZ3JvdXBNYXRlcmlhbCA9IG1hdGVyaWFsWyBncm91cC5tYXRlcmlhbEluZGV4IF07CgogICAgCQkJCQkJc3RhcnQgPSBNYXRoLm1heCggZ3JvdXAuc3RhcnQsIGRyYXdSYW5nZS5zdGFydCApOwogICAgCQkJCQkJZW5kID0gTWF0aC5taW4oICggZ3JvdXAuc3RhcnQgKyBncm91cC5jb3VudCApLCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7CgogICAgCQkJCQkJZm9yICggaiA9IHN0YXJ0LCBqbCA9IGVuZDsgaiA8IGpsOyBqICs9IDMgKSB7CgogICAgCQkJCQkJCWEgPSBqOwogICAgCQkJCQkJCWIgPSBqICsgMTsKICAgIAkJCQkJCQljID0gaiArIDI7CgogICAgCQkJCQkJCWludGVyc2VjdGlvbiA9IGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIHRoaXMsIGdyb3VwTWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSwgcG9zaXRpb24sIG1vcnBoUG9zaXRpb24sIHV2LCB1djIsIGEsIGIsIGMgKTsKCiAgICAJCQkJCQkJaWYgKCBpbnRlcnNlY3Rpb24gKSB7CgogICAgCQkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaiAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIG5vbi1pbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3MKICAgIAkJCQkJCQkJaW50ZXJzZWN0aW9uLmZhY2UubWF0ZXJpYWxJbmRleCA9IGdyb3VwLm1hdGVyaWFsSW5kZXg7CiAgICAJCQkJCQkJCWludGVyc2VjdHMucHVzaCggaW50ZXJzZWN0aW9uICk7CgogICAgCQkJCQkJCX0KCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQlzdGFydCA9IE1hdGgubWF4KCAwLCBkcmF3UmFuZ2Uuc3RhcnQgKTsKICAgIAkJCQkJZW5kID0gTWF0aC5taW4oIHBvc2l0aW9uLmNvdW50LCAoIGRyYXdSYW5nZS5zdGFydCArIGRyYXdSYW5nZS5jb3VudCApICk7CgogICAgCQkJCQlmb3IgKCBpID0gc3RhcnQsIGlsID0gZW5kOyBpIDwgaWw7IGkgKz0gMyApIHsKCiAgICAJCQkJCQlhID0gaTsKICAgIAkJCQkJCWIgPSBpICsgMTsKICAgIAkJCQkJCWMgPSBpICsgMjsKCiAgICAJCQkJCQlpbnRlcnNlY3Rpb24gPSBjaGVja0J1ZmZlckdlb21ldHJ5SW50ZXJzZWN0aW9uKCB0aGlzLCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCBfcmF5LCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgdXYsIHV2MiwgYSwgYiwgYyApOwoKICAgIAkJCQkJCWlmICggaW50ZXJzZWN0aW9uICkgewoKICAgIAkJCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gTWF0aC5mbG9vciggaSAvIDMgKTsgLy8gdHJpYW5nbGUgbnVtYmVyIGluIG5vbi1pbmRleGVkIGJ1ZmZlciBzZW1hbnRpY3MKICAgIAkJCQkJCQlpbnRlcnNlY3RzLnB1c2goIGludGVyc2VjdGlvbiApOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CgogICAgCQkJdmFyIGZ2QSwgZnZCLCBmdkM7CiAgICAJCQl2YXIgaXNNdWx0aU1hdGVyaWFsID0gQXJyYXkuaXNBcnJheSggbWF0ZXJpYWwgKTsKCiAgICAJCQl2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlczsKICAgIAkJCXZhciBmYWNlcyA9IGdlb21ldHJ5LmZhY2VzOwogICAgCQkJdmFyIHV2czsKCiAgICAJCQl2YXIgZmFjZVZlcnRleFV2cyA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIDAgXTsKICAgIAkJCWlmICggZmFjZVZlcnRleFV2cy5sZW5ndGggPiAwICkgdXZzID0gZmFjZVZlcnRleFV2czsKCiAgICAJCQlmb3IgKCB2YXIgZiA9IDAsIGZsID0gZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgogICAgCQkJCXZhciBmYWNlID0gZmFjZXNbIGYgXTsKICAgIAkJCQl2YXIgZmFjZU1hdGVyaWFsID0gaXNNdWx0aU1hdGVyaWFsID8gbWF0ZXJpYWxbIGZhY2UubWF0ZXJpYWxJbmRleCBdIDogbWF0ZXJpYWw7CgogICAgCQkJCWlmICggZmFjZU1hdGVyaWFsID09PSB1bmRlZmluZWQgKSBjb250aW51ZTsKCiAgICAJCQkJZnZBID0gdmVydGljZXNbIGZhY2UuYSBdOwogICAgCQkJCWZ2QiA9IHZlcnRpY2VzWyBmYWNlLmIgXTsKICAgIAkJCQlmdkMgPSB2ZXJ0aWNlc1sgZmFjZS5jIF07CgogICAgCQkJCWludGVyc2VjdGlvbiA9IGNoZWNrSW50ZXJzZWN0aW9uKCB0aGlzLCBmYWNlTWF0ZXJpYWwsIHJheWNhc3RlciwgX3JheSwgZnZBLCBmdkIsIGZ2QywgX2ludGVyc2VjdGlvblBvaW50ICk7CgogICAgCQkJCWlmICggaW50ZXJzZWN0aW9uICkgewoKICAgIAkJCQkJaWYgKCB1dnMgJiYgdXZzWyBmIF0gKSB7CgogICAgCQkJCQkJdmFyIHV2c19mID0gdXZzWyBmIF07CiAgICAJCQkJCQlfdXZBLmNvcHkoIHV2c19mWyAwIF0gKTsKICAgIAkJCQkJCV91dkIuY29weSggdXZzX2ZbIDEgXSApOwogICAgCQkJCQkJX3V2Qy5jb3B5KCB1dnNfZlsgMiBdICk7CgogICAgCQkJCQkJaW50ZXJzZWN0aW9uLnV2ID0gVHJpYW5nbGUuZ2V0VVYoIF9pbnRlcnNlY3Rpb25Qb2ludCwgZnZBLCBmdkIsIGZ2QywgX3V2QSwgX3V2QiwgX3V2QywgbmV3IFZlY3RvcjIoKSApOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJaW50ZXJzZWN0aW9uLmZhY2UgPSBmYWNlOwogICAgCQkJCQlpbnRlcnNlY3Rpb24uZmFjZUluZGV4ID0gZjsKICAgIAkJCQkJaW50ZXJzZWN0cy5wdXNoKCBpbnRlcnNlY3Rpb24gKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvciggdGhpcy5nZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApLmNvcHkoIHRoaXMgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBmdW5jdGlvbiBjaGVja0ludGVyc2VjdGlvbiggb2JqZWN0LCBtYXRlcmlhbCwgcmF5Y2FzdGVyLCByYXksIHBBLCBwQiwgcEMsIHBvaW50ICkgewoKICAgIAl2YXIgaW50ZXJzZWN0OwoKICAgIAlpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgewoKICAgIAkJaW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQywgcEIsIHBBLCB0cnVlLCBwb2ludCApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJaW50ZXJzZWN0ID0gcmF5LmludGVyc2VjdFRyaWFuZ2xlKCBwQSwgcEIsIHBDLCBtYXRlcmlhbC5zaWRlICE9PSBEb3VibGVTaWRlLCBwb2ludCApOwoKICAgIAl9CgogICAgCWlmICggaW50ZXJzZWN0ID09PSBudWxsICkgcmV0dXJuIG51bGw7CgogICAgCV9pbnRlcnNlY3Rpb25Qb2ludFdvcmxkLmNvcHkoIHBvaW50ICk7CiAgICAJX2ludGVyc2VjdGlvblBvaW50V29ybGQuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTsKCiAgICAJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggX2ludGVyc2VjdGlvblBvaW50V29ybGQgKTsKCiAgICAJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIHJldHVybiBudWxsOwoKICAgIAlyZXR1cm4gewogICAgCQlkaXN0YW5jZTogZGlzdGFuY2UsCiAgICAJCXBvaW50OiBfaW50ZXJzZWN0aW9uUG9pbnRXb3JsZC5jbG9uZSgpLAogICAgCQlvYmplY3Q6IG9iamVjdAogICAgCX07CgogICAgfQoKICAgIGZ1bmN0aW9uIGNoZWNrQnVmZmVyR2VvbWV0cnlJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBwb3NpdGlvbiwgbW9ycGhQb3NpdGlvbiwgdXYsIHV2MiwgYSwgYiwgYyApIHsKCiAgICAJX3ZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBhICk7CiAgICAJX3ZCLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBiICk7CiAgICAJX3ZDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBjICk7CgogICAgCXZhciBtb3JwaEluZmx1ZW5jZXMgPSBvYmplY3QubW9ycGhUYXJnZXRJbmZsdWVuY2VzOwoKICAgIAlpZiAoIG1hdGVyaWFsLm1vcnBoVGFyZ2V0cyAmJiBtb3JwaFBvc2l0aW9uICYmIG1vcnBoSW5mbHVlbmNlcyApIHsKCiAgICAJCV9tb3JwaEEuc2V0KCAwLCAwLCAwICk7CiAgICAJCV9tb3JwaEIuc2V0KCAwLCAwLCAwICk7CiAgICAJCV9tb3JwaEMuc2V0KCAwLCAwLCAwICk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbW9ycGhQb3NpdGlvbi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl2YXIgaW5mbHVlbmNlID0gbW9ycGhJbmZsdWVuY2VzWyBpIF07CiAgICAJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaFBvc2l0aW9uWyBpIF07CgogICAgCQkJaWYgKCBpbmZsdWVuY2UgPT09IDAgKSBjb250aW51ZTsKCiAgICAJCQlfdGVtcEEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggbW9ycGhBdHRyaWJ1dGUsIGEgKTsKICAgIAkJCV90ZW1wQi5mcm9tQnVmZmVyQXR0cmlidXRlKCBtb3JwaEF0dHJpYnV0ZSwgYiApOwogICAgCQkJX3RlbXBDLmZyb21CdWZmZXJBdHRyaWJ1dGUoIG1vcnBoQXR0cmlidXRlLCBjICk7CgogICAgCQkJX21vcnBoQS5hZGRTY2FsZWRWZWN0b3IoIF90ZW1wQS5zdWIoIF92QSApLCBpbmZsdWVuY2UgKTsKICAgIAkJCV9tb3JwaEIuYWRkU2NhbGVkVmVjdG9yKCBfdGVtcEIuc3ViKCBfdkIgKSwgaW5mbHVlbmNlICk7CiAgICAJCQlfbW9ycGhDLmFkZFNjYWxlZFZlY3RvciggX3RlbXBDLnN1YiggX3ZDICksIGluZmx1ZW5jZSApOwoKICAgIAkJfQoKICAgIAkJX3ZBLmFkZCggX21vcnBoQSApOwogICAgCQlfdkIuYWRkKCBfbW9ycGhCICk7CiAgICAJCV92Qy5hZGQoIF9tb3JwaEMgKTsKCiAgICAJfQoKICAgIAl2YXIgaW50ZXJzZWN0aW9uID0gY2hlY2tJbnRlcnNlY3Rpb24oIG9iamVjdCwgbWF0ZXJpYWwsIHJheWNhc3RlciwgcmF5LCBfdkEsIF92QiwgX3ZDLCBfaW50ZXJzZWN0aW9uUG9pbnQgKTsKCiAgICAJaWYgKCBpbnRlcnNlY3Rpb24gKSB7CgogICAgCQlpZiAoIHV2ICkgewoKICAgIAkJCV91dkEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGEgKTsKICAgIAkJCV91dkIuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGIgKTsKICAgIAkJCV91dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYsIGMgKTsKCiAgICAJCQlpbnRlcnNlY3Rpb24udXYgPSBUcmlhbmdsZS5nZXRVViggX2ludGVyc2VjdGlvblBvaW50LCBfdkEsIF92QiwgX3ZDLCBfdXZBLCBfdXZCLCBfdXZDLCBuZXcgVmVjdG9yMigpICk7CgogICAgCQl9CgogICAgCQlpZiAoIHV2MiApIHsKCiAgICAJCQlfdXZBLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHV2MiwgYSApOwogICAgCQkJX3V2Qi5mcm9tQnVmZmVyQXR0cmlidXRlKCB1djIsIGIgKTsKICAgIAkJCV91dkMuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggdXYyLCBjICk7CgogICAgCQkJaW50ZXJzZWN0aW9uLnV2MiA9IFRyaWFuZ2xlLmdldFVWKCBfaW50ZXJzZWN0aW9uUG9pbnQsIF92QSwgX3ZCLCBfdkMsIF91dkEsIF91dkIsIF91dkMsIG5ldyBWZWN0b3IyKCkgKTsKCiAgICAJCX0KCiAgICAJCXZhciBmYWNlID0gbmV3IEZhY2UzKCBhLCBiLCBjICk7CiAgICAJCVRyaWFuZ2xlLmdldE5vcm1hbCggX3ZBLCBfdkIsIF92QywgZmFjZS5ub3JtYWwgKTsKCiAgICAJCWludGVyc2VjdGlvbi5mYWNlID0gZmFjZTsKCiAgICAJfQoKICAgIAlyZXR1cm4gaW50ZXJzZWN0aW9uOwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGtpbGUgLyBodHRwOi8va2lsZS5zdHJhdmFnYW56YS5vcmcvCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KICAgICAqLwoKICAgIHZhciBfZ2VvbWV0cnlJZCA9IDA7IC8vIEdlb21ldHJ5IHVzZXMgZXZlbiBudW1iZXJzIGFzIElkCiAgICB2YXIgX20xJDMgPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF9vYmokMSA9IG5ldyBPYmplY3QzRCgpOwogICAgdmFyIF9vZmZzZXQkMSA9IG5ldyBWZWN0b3IzKCk7CgogICAgZnVuY3Rpb24gR2VvbWV0cnkoKSB7CgogICAgCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggdGhpcywgJ2lkJywgeyB2YWx1ZTogX2dlb21ldHJ5SWQgKz0gMiB9ICk7CgogICAgCXRoaXMudXVpZCA9IF9NYXRoLmdlbmVyYXRlVVVJRCgpOwoKICAgIAl0aGlzLm5hbWUgPSAnJzsKICAgIAl0aGlzLnR5cGUgPSAnR2VvbWV0cnknOwoKICAgIAl0aGlzLnZlcnRpY2VzID0gW107CiAgICAJdGhpcy5jb2xvcnMgPSBbXTsKICAgIAl0aGlzLmZhY2VzID0gW107CiAgICAJdGhpcy5mYWNlVmVydGV4VXZzID0gW1tdXTsKCiAgICAJdGhpcy5tb3JwaFRhcmdldHMgPSBbXTsKICAgIAl0aGlzLm1vcnBoTm9ybWFscyA9IFtdOwoKICAgIAl0aGlzLnNraW5XZWlnaHRzID0gW107CiAgICAJdGhpcy5za2luSW5kaWNlcyA9IFtdOwoKICAgIAl0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTsKCiAgICAJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CiAgICAJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IG51bGw7CgogICAgCS8vIHVwZGF0ZSBmbGFncwoKICAgIAl0aGlzLmVsZW1lbnRzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMudmVydGljZXNOZWVkVXBkYXRlID0gZmFsc2U7CiAgICAJdGhpcy51dnNOZWVkVXBkYXRlID0gZmFsc2U7CiAgICAJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMuY29sb3JzTmVlZFVwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBmYWxzZTsKICAgIAl0aGlzLmdyb3Vwc05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICB9CgogICAgR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBHZW9tZXRyeSwKCiAgICAJaXNHZW9tZXRyeTogdHJ1ZSwKCiAgICAJYXBwbHlNYXRyaXg6IGZ1bmN0aW9uICggbWF0cml4ICkgewoKICAgIAkJdmFyIG5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07CiAgICAJCQl2ZXJ0ZXguYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKCiAgICAJCX0KCiAgICAJCWZvciAoIHZhciBpID0gMCwgaWwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXZhciBmYWNlID0gdGhpcy5mYWNlc1sgaSBdOwogICAgCQkJZmFjZS5ub3JtYWwuYXBwbHlNYXRyaXgzKCBub3JtYWxNYXRyaXggKS5ub3JtYWxpemUoKTsKCiAgICAJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCQlmYWNlLnZlcnRleE5vcm1hbHNbIGogXS5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5ib3VuZGluZ0JveCAhPT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLmNvbXB1dGVCb3VuZGluZ0JveCgpOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLmJvdW5kaW5nU3BoZXJlICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CgogICAgCQl9CgogICAgCQl0aGlzLnZlcnRpY2VzTmVlZFVwZGF0ZSA9IHRydWU7CiAgICAJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXJvdGF0ZVg6IGZ1bmN0aW9uICggYW5nbGUgKSB7CgogICAgCQkvLyByb3RhdGUgZ2VvbWV0cnkgYXJvdW5kIHdvcmxkIHgtYXhpcwoKICAgIAkJX20xJDMubWFrZVJvdGF0aW9uWCggYW5nbGUgKTsKCiAgICAJCXRoaXMuYXBwbHlNYXRyaXgoIF9tMSQzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJcm90YXRlWTogZnVuY3Rpb24gKCBhbmdsZSApIHsKCiAgICAJCS8vIHJvdGF0ZSBnZW9tZXRyeSBhcm91bmQgd29ybGQgeS1heGlzCgogICAgCQlfbTEkMy5tYWtlUm90YXRpb25ZKCBhbmdsZSApOwoKICAgIAkJdGhpcy5hcHBseU1hdHJpeCggX20xJDMgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyb3RhdGVaOiBmdW5jdGlvbiAoIGFuZ2xlICkgewoKICAgIAkJLy8gcm90YXRlIGdlb21ldHJ5IGFyb3VuZCB3b3JsZCB6LWF4aXMKCiAgICAJCV9tMSQzLm1ha2VSb3RhdGlvblooIGFuZ2xlICk7CgogICAgCQl0aGlzLmFwcGx5TWF0cml4KCBfbTEkMyApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCB4LCB5LCB6ICkgewoKICAgIAkJLy8gdHJhbnNsYXRlIGdlb21ldHJ5CgogICAgCQlfbTEkMy5tYWtlVHJhbnNsYXRpb24oIHgsIHksIHogKTsKCiAgICAJCXRoaXMuYXBwbHlNYXRyaXgoIF9tMSQzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2NhbGU6IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKCiAgICAJCS8vIHNjYWxlIGdlb21ldHJ5CgogICAgCQlfbTEkMy5tYWtlU2NhbGUoIHgsIHksIHogKTsKCiAgICAJCXRoaXMuYXBwbHlNYXRyaXgoIF9tMSQzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbG9va0F0OiBmdW5jdGlvbiAoIHZlY3RvciApIHsKCiAgICAJCV9vYmokMS5sb29rQXQoIHZlY3RvciApOwoKICAgIAkJX29iaiQxLnVwZGF0ZU1hdHJpeCgpOwoKICAgIAkJdGhpcy5hcHBseU1hdHJpeCggX29iaiQxLm1hdHJpeCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWZyb21CdWZmZXJHZW9tZXRyeTogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKCiAgICAJCXZhciBzY29wZSA9IHRoaXM7CgogICAgCQl2YXIgaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4ICE9PSBudWxsID8gZ2VvbWV0cnkuaW5kZXguYXJyYXkgOiB1bmRlZmluZWQ7CiAgICAJCXZhciBhdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKCiAgICAJCXZhciBwb3NpdGlvbnMgPSBhdHRyaWJ1dGVzLnBvc2l0aW9uLmFycmF5OwogICAgCQl2YXIgbm9ybWFscyA9IGF0dHJpYnV0ZXMubm9ybWFsICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLm5vcm1hbC5hcnJheSA6IHVuZGVmaW5lZDsKICAgIAkJdmFyIGNvbG9ycyA9IGF0dHJpYnV0ZXMuY29sb3IgIT09IHVuZGVmaW5lZCA/IGF0dHJpYnV0ZXMuY29sb3IuYXJyYXkgOiB1bmRlZmluZWQ7CiAgICAJCXZhciB1dnMgPSBhdHRyaWJ1dGVzLnV2ICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2LmFycmF5IDogdW5kZWZpbmVkOwogICAgCQl2YXIgdXZzMiA9IGF0dHJpYnV0ZXMudXYyICE9PSB1bmRlZmluZWQgPyBhdHRyaWJ1dGVzLnV2Mi5hcnJheSA6IHVuZGVmaW5lZDsKCiAgICAJCWlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkgdGhpcy5mYWNlVmVydGV4VXZzWyAxIF0gPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGg7IGkgKz0gMyApIHsKCiAgICAJCQlzY29wZS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMygpLmZyb21BcnJheSggcG9zaXRpb25zLCBpICkgKTsKCiAgICAJCQlpZiAoIGNvbG9ycyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlzY29wZS5jb2xvcnMucHVzaCggbmV3IENvbG9yJDcoKS5mcm9tQXJyYXkoIGNvbG9ycywgaSApICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJZnVuY3Rpb24gYWRkRmFjZSggYSwgYiwgYywgbWF0ZXJpYWxJbmRleCApIHsKCiAgICAJCQl2YXIgdmVydGV4Q29sb3JzID0gKCBjb2xvcnMgPT09IHVuZGVmaW5lZCApID8gW10gOiBbCiAgICAJCQkJc2NvcGUuY29sb3JzWyBhIF0uY2xvbmUoKSwKICAgIAkJCQlzY29wZS5jb2xvcnNbIGIgXS5jbG9uZSgpLAogICAgCQkJCXNjb3BlLmNvbG9yc1sgYyBdLmNsb25lKCkgXTsKCiAgICAJCQl2YXIgdmVydGV4Tm9ybWFscyA9ICggbm9ybWFscyA9PT0gdW5kZWZpbmVkICkgPyBbXSA6IFsKICAgIAkJCQluZXcgVmVjdG9yMygpLmZyb21BcnJheSggbm9ybWFscywgYSAqIDMgKSwKICAgIAkJCQluZXcgVmVjdG9yMygpLmZyb21BcnJheSggbm9ybWFscywgYiAqIDMgKSwKICAgIAkJCQluZXcgVmVjdG9yMygpLmZyb21BcnJheSggbm9ybWFscywgYyAqIDMgKQogICAgCQkJXTsKCiAgICAJCQl2YXIgZmFjZSA9IG5ldyBGYWNlMyggYSwgYiwgYywgdmVydGV4Tm9ybWFscywgdmVydGV4Q29sb3JzLCBtYXRlcmlhbEluZGV4ICk7CgogICAgCQkJc2NvcGUuZmFjZXMucHVzaCggZmFjZSApOwoKICAgIAkJCWlmICggdXZzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCXNjb3BlLmZhY2VWZXJ0ZXhVdnNbIDAgXS5wdXNoKCBbCiAgICAJCQkJCW5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1dnMsIGEgKiAyICksCiAgICAJCQkJCW5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1dnMsIGIgKiAyICksCiAgICAJCQkJCW5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1dnMsIGMgKiAyICkKICAgIAkJCQldICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggdXZzMiAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlzY29wZS5mYWNlVmVydGV4VXZzWyAxIF0ucHVzaCggWwogICAgCQkJCQluZXcgVmVjdG9yMigpLmZyb21BcnJheSggdXZzMiwgYSAqIDIgKSwKICAgIAkJCQkJbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHV2czIsIGIgKiAyICksCiAgICAJCQkJCW5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCB1dnMyLCBjICogMiApCiAgICAJCQkJXSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBncm91cHMgPSBnZW9tZXRyeS5ncm91cHM7CgogICAgCQlpZiAoIGdyb3Vwcy5sZW5ndGggPiAwICkgewoKICAgIAkJCWZvciAoIHZhciBpID0gMDsgaSA8IGdyb3Vwcy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCXZhciBncm91cCA9IGdyb3Vwc1sgaSBdOwoKICAgIAkJCQl2YXIgc3RhcnQgPSBncm91cC5zdGFydDsKICAgIAkJCQl2YXIgY291bnQgPSBncm91cC5jb3VudDsKCiAgICAJCQkJZm9yICggdmFyIGogPSBzdGFydCwgamwgPSBzdGFydCArIGNvdW50OyBqIDwgamw7IGogKz0gMyApIHsKCiAgICAJCQkJCWlmICggaW5kaWNlcyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJCWFkZEZhY2UoIGluZGljZXNbIGogXSwgaW5kaWNlc1sgaiArIDEgXSwgaW5kaWNlc1sgaiArIDIgXSwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOwoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQlhZGRGYWNlKCBqLCBqICsgMSwgaiArIDIsIGdyb3VwLm1hdGVyaWFsSW5kZXggKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSB7CgogICAgCQkJaWYgKCBpbmRpY2VzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7CgogICAgCQkJCQlhZGRGYWNlKCBpbmRpY2VzWyBpIF0sIGluZGljZXNbIGkgKyAxIF0sIGluZGljZXNbIGkgKyAyIF0gKTsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IHBvc2l0aW9ucy5sZW5ndGggLyAzOyBpICs9IDMgKSB7CgogICAgCQkJCQlhZGRGYWNlKCBpLCBpICsgMSwgaSArIDIgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CgogICAgCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nQm94ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuYm91bmRpbmdCb3ggPSBnZW9tZXRyeS5ib3VuZGluZ0JveC5jbG9uZSgpOwoKICAgIAkJfQoKICAgIAkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSAhPT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUuY2xvbmUoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljZW50ZXI6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMuY29tcHV0ZUJvdW5kaW5nQm94KCk7CgogICAgCQl0aGlzLmJvdW5kaW5nQm94LmdldENlbnRlciggX29mZnNldCQxICkubmVnYXRlKCk7CgogICAgCQl0aGlzLnRyYW5zbGF0ZSggX29mZnNldCQxLngsIF9vZmZzZXQkMS55LCBfb2Zmc2V0JDEueiApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKCiAgICAJCXZhciBjZW50ZXIgPSB0aGlzLmJvdW5kaW5nU3BoZXJlLmNlbnRlcjsKICAgIAkJdmFyIHJhZGl1cyA9IHRoaXMuYm91bmRpbmdTcGhlcmUucmFkaXVzOwoKICAgIAkJdmFyIHMgPSByYWRpdXMgPT09IDAgPyAxIDogMS4wIC8gcmFkaXVzOwoKICAgIAkJdmFyIG1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CiAgICAJCW1hdHJpeC5zZXQoCiAgICAJCQlzLCAwLCAwLCAtIHMgKiBjZW50ZXIueCwKICAgIAkJCTAsIHMsIDAsIC0gcyAqIGNlbnRlci55LAogICAgCQkJMCwgMCwgcywgLSBzICogY2VudGVyLnosCiAgICAJCQkwLCAwLCAwLCAxCiAgICAJCSk7CgogICAgCQl0aGlzLmFwcGx5TWF0cml4KCBtYXRyaXggKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb21wdXRlRmFjZU5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBjYiA9IG5ldyBWZWN0b3IzKCksIGFiID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCWZvciAoIHZhciBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgewoKICAgIAkJCXZhciBmYWNlID0gdGhpcy5mYWNlc1sgZiBdOwoKICAgIAkJCXZhciB2QSA9IHRoaXMudmVydGljZXNbIGZhY2UuYSBdOwogICAgCQkJdmFyIHZCID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5iIF07CiAgICAJCQl2YXIgdkMgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmMgXTsKCiAgICAJCQljYi5zdWJWZWN0b3JzKCB2QywgdkIgKTsKICAgIAkJCWFiLnN1YlZlY3RvcnMoIHZBLCB2QiApOwogICAgCQkJY2IuY3Jvc3MoIGFiICk7CgogICAgCQkJY2Iubm9ybWFsaXplKCk7CgogICAgCQkJZmFjZS5ub3JtYWwuY29weSggY2IgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJY29tcHV0ZVZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICggYXJlYVdlaWdodGVkICkgewoKICAgIAkJaWYgKCBhcmVhV2VpZ2h0ZWQgPT09IHVuZGVmaW5lZCApIGFyZWFXZWlnaHRlZCA9IHRydWU7CgogICAgCQl2YXIgdiwgdmwsIGYsIGZsLCBmYWNlLCB2ZXJ0aWNlczsKCiAgICAJCXZlcnRpY2VzID0gbmV3IEFycmF5KCB0aGlzLnZlcnRpY2VzLmxlbmd0aCApOwoKICAgIAkJZm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHsKCiAgICAJCQl2ZXJ0aWNlc1sgdiBdID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCWlmICggYXJlYVdlaWdodGVkICkgewoKICAgIAkJCS8vIHZlcnRleCBub3JtYWxzIHdlaWdodGVkIGJ5IHRyaWFuZ2xlIGFyZWFzCiAgICAJCQkvLyBodHRwOi8vd3d3LmlxdWlsZXpsZXMub3JnL3d3dy9hcnRpY2xlcy9ub3JtYWxzL25vcm1hbHMuaHRtCgogICAgCQkJdmFyIHZBLCB2QiwgdkM7CiAgICAJCQl2YXIgY2IgPSBuZXcgVmVjdG9yMygpLCBhYiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQkJZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCiAgICAJCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKCiAgICAJCQkJdkEgPSB0aGlzLnZlcnRpY2VzWyBmYWNlLmEgXTsKICAgIAkJCQl2QiA9IHRoaXMudmVydGljZXNbIGZhY2UuYiBdOwogICAgCQkJCXZDID0gdGhpcy52ZXJ0aWNlc1sgZmFjZS5jIF07CgogICAgCQkJCWNiLnN1YlZlY3RvcnMoIHZDLCB2QiApOwogICAgCQkJCWFiLnN1YlZlY3RvcnMoIHZBLCB2QiApOwogICAgCQkJCWNiLmNyb3NzKCBhYiApOwoKICAgIAkJCQl2ZXJ0aWNlc1sgZmFjZS5hIF0uYWRkKCBjYiApOwogICAgCQkJCXZlcnRpY2VzWyBmYWNlLmIgXS5hZGQoIGNiICk7CiAgICAJCQkJdmVydGljZXNbIGZhY2UuYyBdLmFkZCggY2IgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CgogICAgCQkJZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCiAgICAJCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKCiAgICAJCQkJdmVydGljZXNbIGZhY2UuYSBdLmFkZCggZmFjZS5ub3JtYWwgKTsKICAgIAkJCQl2ZXJ0aWNlc1sgZmFjZS5iIF0uYWRkKCBmYWNlLm5vcm1hbCApOwogICAgCQkJCXZlcnRpY2VzWyBmYWNlLmMgXS5hZGQoIGZhY2Uubm9ybWFsICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJZm9yICggdiA9IDAsIHZsID0gdGhpcy52ZXJ0aWNlcy5sZW5ndGg7IHYgPCB2bDsgdiArKyApIHsKCiAgICAJCQl2ZXJ0aWNlc1sgdiBdLm5vcm1hbGl6ZSgpOwoKICAgIAkJfQoKICAgIAkJZm9yICggZiA9IDAsIGZsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGYgPCBmbDsgZiArKyApIHsKCiAgICAJCQlmYWNlID0gdGhpcy5mYWNlc1sgZiBdOwoKICAgIAkJCXZhciB2ZXJ0ZXhOb3JtYWxzID0gZmFjZS52ZXJ0ZXhOb3JtYWxzOwoKICAgIAkJCWlmICggdmVydGV4Tm9ybWFscy5sZW5ndGggPT09IDMgKSB7CgogICAgCQkJCXZlcnRleE5vcm1hbHNbIDAgXS5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKTsKICAgIAkJCQl2ZXJ0ZXhOb3JtYWxzWyAxIF0uY29weSggdmVydGljZXNbIGZhY2UuYiBdICk7CiAgICAJCQkJdmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIHZlcnRpY2VzWyBmYWNlLmMgXSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXZlcnRleE5vcm1hbHNbIDAgXSA9IHZlcnRpY2VzWyBmYWNlLmEgXS5jbG9uZSgpOwogICAgCQkJCXZlcnRleE5vcm1hbHNbIDEgXSA9IHZlcnRpY2VzWyBmYWNlLmIgXS5jbG9uZSgpOwogICAgCQkJCXZlcnRleE5vcm1hbHNbIDIgXSA9IHZlcnRpY2VzWyBmYWNlLmMgXS5jbG9uZSgpOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5mYWNlcy5sZW5ndGggPiAwICkgewoKICAgIAkJCXRoaXMubm9ybWFsc05lZWRVcGRhdGUgPSB0cnVlOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAljb21wdXRlRmxhdFZlcnRleE5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBmLCBmbCwgZmFjZTsKCiAgICAJCXRoaXMuY29tcHV0ZUZhY2VOb3JtYWxzKCk7CgogICAgCQlmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgewoKICAgIAkJCWZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CgogICAgCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CgogICAgCQkJaWYgKCB2ZXJ0ZXhOb3JtYWxzLmxlbmd0aCA9PT0gMyApIHsKCiAgICAJCQkJdmVydGV4Tm9ybWFsc1sgMCBdLmNvcHkoIGZhY2Uubm9ybWFsICk7CiAgICAJCQkJdmVydGV4Tm9ybWFsc1sgMSBdLmNvcHkoIGZhY2Uubm9ybWFsICk7CiAgICAJCQkJdmVydGV4Tm9ybWFsc1sgMiBdLmNvcHkoIGZhY2Uubm9ybWFsICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdmVydGV4Tm9ybWFsc1sgMCBdID0gZmFjZS5ub3JtYWwuY2xvbmUoKTsKICAgIAkJCQl2ZXJ0ZXhOb3JtYWxzWyAxIF0gPSBmYWNlLm5vcm1hbC5jbG9uZSgpOwogICAgCQkJCXZlcnRleE5vcm1hbHNbIDIgXSA9IGZhY2Uubm9ybWFsLmNsb25lKCk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLmZhY2VzLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHRydWU7CgogICAgCQl9CgogICAgCX0sCgogICAgCWNvbXB1dGVNb3JwaE5vcm1hbHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBpLCBpbCwgZiwgZmwsIGZhY2U7CgogICAgCQkvLyBzYXZlIG9yaWdpbmFsIG5vcm1hbHMKICAgIAkJLy8gLSBjcmVhdGUgdGVtcCB2YXJpYWJsZXMgb24gZmlyc3QgYWNjZXNzCiAgICAJCS8vICAgb3RoZXJ3aXNlIGp1c3QgY29weSAoZm9yIGZhc3RlciByZXBlYXRlZCBjYWxscykKCiAgICAJCWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgogICAgCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKCiAgICAJCQlpZiAoICEgZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCApIHsKCiAgICAJCQkJZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbCA9IGZhY2Uubm9ybWFsLmNsb25lKCk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZmFjZS5fX29yaWdpbmFsRmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoICEgZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFscyApIGZhY2UuX19vcmlnaW5hbFZlcnRleE5vcm1hbHMgPSBbXTsKCiAgICAJCQlmb3IgKCBpID0gMCwgaWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCWlmICggISBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gKSB7CgogICAgCQkJCQlmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzWyBpIF0gPSBmYWNlLnZlcnRleE5vcm1hbHNbIGkgXS5jbG9uZSgpOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJZmFjZS5fX29yaWdpbmFsVmVydGV4Tm9ybWFsc1sgaSBdLmNvcHkoIGZhY2UudmVydGV4Tm9ybWFsc1sgaSBdICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyB1c2UgdGVtcCBnZW9tZXRyeSB0byBjb21wdXRlIGZhY2UgYW5kIHZlcnRleCBub3JtYWxzIGZvciBlYWNoIG1vcnBoCgogICAgCQl2YXIgdG1wR2VvID0gbmV3IEdlb21ldHJ5KCk7CiAgICAJCXRtcEdlby5mYWNlcyA9IHRoaXMuZmFjZXM7CgogICAgCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLm1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkvLyBjcmVhdGUgb24gZmlyc3QgYWNjZXNzCgogICAgCQkJaWYgKCAhIHRoaXMubW9ycGhOb3JtYWxzWyBpIF0gKSB7CgogICAgCQkJCXRoaXMubW9ycGhOb3JtYWxzWyBpIF0gPSB7fTsKICAgIAkJCQl0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzID0gW107CiAgICAJCQkJdGhpcy5tb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzID0gW107CgogICAgCQkJCXZhciBkc3ROb3JtYWxzRmFjZSA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHM7CiAgICAJCQkJdmFyIGRzdE5vcm1hbHNWZXJ0ZXggPSB0aGlzLm1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHM7CgogICAgCQkJCXZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzOwoKICAgIAkJCQlmb3IgKCBmID0gMCwgZmwgPSB0aGlzLmZhY2VzLmxlbmd0aDsgZiA8IGZsOyBmICsrICkgewoKICAgIAkJCQkJZmFjZU5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CiAgICAJCQkJCXZlcnRleE5vcm1hbHMgPSB7IGE6IG5ldyBWZWN0b3IzKCksIGI6IG5ldyBWZWN0b3IzKCksIGM6IG5ldyBWZWN0b3IzKCkgfTsKCiAgICAJCQkJCWRzdE5vcm1hbHNGYWNlLnB1c2goIGZhY2VOb3JtYWwgKTsKICAgIAkJCQkJZHN0Tm9ybWFsc1ZlcnRleC5wdXNoKCB2ZXJ0ZXhOb3JtYWxzICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJdmFyIG1vcnBoTm9ybWFscyA9IHRoaXMubW9ycGhOb3JtYWxzWyBpIF07CgogICAgCQkJLy8gc2V0IHZlcnRpY2VzIHRvIG1vcnBoIHRhcmdldAoKICAgIAkJCXRtcEdlby52ZXJ0aWNlcyA9IHRoaXMubW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXM7CgogICAgCQkJLy8gY29tcHV0ZSBtb3JwaCBub3JtYWxzCgogICAgCQkJdG1wR2VvLmNvbXB1dGVGYWNlTm9ybWFscygpOwogICAgCQkJdG1wR2VvLmNvbXB1dGVWZXJ0ZXhOb3JtYWxzKCk7CgogICAgCQkJLy8gc3RvcmUgbW9ycGggbm9ybWFscwoKICAgIAkJCXZhciBmYWNlTm9ybWFsLCB2ZXJ0ZXhOb3JtYWxzOwoKICAgIAkJCWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgogICAgCQkJCWZhY2UgPSB0aGlzLmZhY2VzWyBmIF07CgogICAgCQkJCWZhY2VOb3JtYWwgPSBtb3JwaE5vcm1hbHMuZmFjZU5vcm1hbHNbIGYgXTsKICAgIAkJCQl2ZXJ0ZXhOb3JtYWxzID0gbW9ycGhOb3JtYWxzLnZlcnRleE5vcm1hbHNbIGYgXTsKCiAgICAJCQkJZmFjZU5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApOwoKICAgIAkJCQl2ZXJ0ZXhOb3JtYWxzLmEuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAwIF0gKTsKICAgIAkJCQl2ZXJ0ZXhOb3JtYWxzLmIuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAxIF0gKTsKICAgIAkJCQl2ZXJ0ZXhOb3JtYWxzLmMuY29weSggZmFjZS52ZXJ0ZXhOb3JtYWxzWyAyIF0gKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyByZXN0b3JlIG9yaWdpbmFsIG5vcm1hbHMKCiAgICAJCWZvciAoIGYgPSAwLCBmbCA9IHRoaXMuZmFjZXMubGVuZ3RoOyBmIDwgZmw7IGYgKysgKSB7CgogICAgCQkJZmFjZSA9IHRoaXMuZmFjZXNbIGYgXTsKCiAgICAJCQlmYWNlLm5vcm1hbCA9IGZhY2UuX19vcmlnaW5hbEZhY2VOb3JtYWw7CiAgICAJCQlmYWNlLnZlcnRleE5vcm1hbHMgPSBmYWNlLl9fb3JpZ2luYWxWZXJ0ZXhOb3JtYWxzOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAljb21wdXRlQm91bmRpbmdCb3g6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWlmICggdGhpcy5ib3VuZGluZ0JveCA9PT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLmJvdW5kaW5nQm94ID0gbmV3IEJveDMoKTsKCiAgICAJCX0KCiAgICAJCXRoaXMuYm91bmRpbmdCb3guc2V0RnJvbVBvaW50cyggdGhpcy52ZXJ0aWNlcyApOwoKICAgIAl9LAoKICAgIAljb21wdXRlQm91bmRpbmdTcGhlcmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWlmICggdGhpcy5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLmJvdW5kaW5nU3BoZXJlID0gbmV3IFNwaGVyZSgpOwoKICAgIAkJfQoKICAgIAkJdGhpcy5ib3VuZGluZ1NwaGVyZS5zZXRGcm9tUG9pbnRzKCB0aGlzLnZlcnRpY2VzICk7CgogICAgCX0sCgogICAgCW1lcmdlOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCBtYXRyaXgsIG1hdGVyaWFsSW5kZXhPZmZzZXQgKSB7CgogICAgCQlpZiAoICEgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgKSB7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5Lm1lcmdlKCk6IGdlb21ldHJ5IG5vdCBhbiBpbnN0YW5jZSBvZiBUSFJFRS5HZW9tZXRyeS4nLCBnZW9tZXRyeSApOwogICAgCQkJcmV0dXJuOwoKICAgIAkJfQoKICAgIAkJdmFyIG5vcm1hbE1hdHJpeCwKICAgIAkJCXZlcnRleE9mZnNldCA9IHRoaXMudmVydGljZXMubGVuZ3RoLAogICAgCQkJdmVydGljZXMxID0gdGhpcy52ZXJ0aWNlcywKICAgIAkJCXZlcnRpY2VzMiA9IGdlb21ldHJ5LnZlcnRpY2VzLAogICAgCQkJZmFjZXMxID0gdGhpcy5mYWNlcywKICAgIAkJCWZhY2VzMiA9IGdlb21ldHJ5LmZhY2VzLAogICAgCQkJY29sb3JzMSA9IHRoaXMuY29sb3JzLAogICAgCQkJY29sb3JzMiA9IGdlb21ldHJ5LmNvbG9yczsKCiAgICAJCWlmICggbWF0ZXJpYWxJbmRleE9mZnNldCA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxJbmRleE9mZnNldCA9IDA7CgogICAgCQlpZiAoIG1hdHJpeCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCW5vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCkuZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTsKCiAgICAJCX0KCiAgICAJCS8vIHZlcnRpY2VzCgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdmVydGljZXMyLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXZhciB2ZXJ0ZXggPSB2ZXJ0aWNlczJbIGkgXTsKCiAgICAJCQl2YXIgdmVydGV4Q29weSA9IHZlcnRleC5jbG9uZSgpOwoKICAgIAkJCWlmICggbWF0cml4ICE9PSB1bmRlZmluZWQgKSB2ZXJ0ZXhDb3B5LmFwcGx5TWF0cml4NCggbWF0cml4ICk7CgogICAgCQkJdmVydGljZXMxLnB1c2goIHZlcnRleENvcHkgKTsKCiAgICAJCX0KCiAgICAJCS8vIGNvbG9ycwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbG9yczIubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJY29sb3JzMS5wdXNoKCBjb2xvcnMyWyBpIF0uY2xvbmUoKSApOwoKICAgIAkJfQoKICAgIAkJLy8gZmFjZXMKCiAgICAJCWZvciAoIGkgPSAwLCBpbCA9IGZhY2VzMi5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl2YXIgZmFjZSA9IGZhY2VzMlsgaSBdLCBmYWNlQ29weSwgbm9ybWFsLCBjb2xvciwKICAgIAkJCQlmYWNlVmVydGV4Tm9ybWFscyA9IGZhY2UudmVydGV4Tm9ybWFscywKICAgIAkJCQlmYWNlVmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7CgogICAgCQkJZmFjZUNvcHkgPSBuZXcgRmFjZTMoIGZhY2UuYSArIHZlcnRleE9mZnNldCwgZmFjZS5iICsgdmVydGV4T2Zmc2V0LCBmYWNlLmMgKyB2ZXJ0ZXhPZmZzZXQgKTsKICAgIAkJCWZhY2VDb3B5Lm5vcm1hbC5jb3B5KCBmYWNlLm5vcm1hbCApOwoKICAgIAkJCWlmICggbm9ybWFsTWF0cml4ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCWZhY2VDb3B5Lm5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwoKICAgIAkJCX0KCiAgICAJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleE5vcm1hbHMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgogICAgCQkJCW5vcm1hbCA9IGZhY2VWZXJ0ZXhOb3JtYWxzWyBqIF0uY2xvbmUoKTsKCiAgICAJCQkJaWYgKCBub3JtYWxNYXRyaXggIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCW5vcm1hbC5hcHBseU1hdHJpeDMoIG5vcm1hbE1hdHJpeCApLm5vcm1hbGl6ZSgpOwoKICAgIAkJCQl9CgogICAgCQkJCWZhY2VDb3B5LnZlcnRleE5vcm1hbHMucHVzaCggbm9ybWFsICk7CgogICAgCQkJfQoKICAgIAkJCWZhY2VDb3B5LmNvbG9yLmNvcHkoIGZhY2UuY29sb3IgKTsKCiAgICAJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZVZlcnRleENvbG9ycy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJY29sb3IgPSBmYWNlVmVydGV4Q29sb3JzWyBqIF07CiAgICAJCQkJZmFjZUNvcHkudmVydGV4Q29sb3JzLnB1c2goIGNvbG9yLmNsb25lKCkgKTsKCiAgICAJCQl9CgogICAgCQkJZmFjZUNvcHkubWF0ZXJpYWxJbmRleCA9IGZhY2UubWF0ZXJpYWxJbmRleCArIG1hdGVyaWFsSW5kZXhPZmZzZXQ7CgogICAgCQkJZmFjZXMxLnB1c2goIGZhY2VDb3B5ICk7CgogICAgCQl9CgogICAgCQkvLyB1dnMKCiAgICAJCWZvciAoIHZhciBpID0gMCwgaWwgPSBnZW9tZXRyeS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXZhciBmYWNlVmVydGV4VXZzMiA9IGdlb21ldHJ5LmZhY2VWZXJ0ZXhVdnNbIGkgXTsKCiAgICAJCQlpZiAoIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID09PSB1bmRlZmluZWQgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXSA9IFtdOwoKICAgIAkJCWZvciAoIHZhciBqID0gMCwgamwgPSBmYWNlVmVydGV4VXZzMi5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJdmFyIHV2czIgPSBmYWNlVmVydGV4VXZzMlsgaiBdLCB1dnNDb3B5ID0gW107CgogICAgCQkJCWZvciAoIHZhciBrID0gMCwga2wgPSB1dnMyLmxlbmd0aDsgayA8IGtsOyBrICsrICkgewoKICAgIAkJCQkJdXZzQ29weS5wdXNoKCB1dnMyWyBrIF0uY2xvbmUoKSApOwoKICAgIAkJCQl9CgogICAgCQkJCXRoaXMuZmFjZVZlcnRleFV2c1sgaSBdLnB1c2goIHV2c0NvcHkgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCW1lcmdlTWVzaDogZnVuY3Rpb24gKCBtZXNoICkgewoKICAgIAkJaWYgKCAhICggbWVzaCAmJiBtZXNoLmlzTWVzaCApICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeS5tZXJnZU1lc2goKTogbWVzaCBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuTWVzaC4nLCBtZXNoICk7CiAgICAJCQlyZXR1cm47CgogICAgCQl9CgogICAgCQlpZiAoIG1lc2gubWF0cml4QXV0b1VwZGF0ZSApIG1lc2gudXBkYXRlTWF0cml4KCk7CgogICAgCQl0aGlzLm1lcmdlKCBtZXNoLmdlb21ldHJ5LCBtZXNoLm1hdHJpeCApOwoKICAgIAl9LAoKICAgIAkvKgogICAgCSAqIENoZWNrcyBmb3IgZHVwbGljYXRlIHZlcnRpY2VzIHdpdGggaGFzaG1hcC4KICAgIAkgKiBEdXBsaWNhdGVkIHZlcnRpY2VzIGFyZSByZW1vdmVkCiAgICAJICogYW5kIGZhY2VzJyB2ZXJ0aWNlcyBhcmUgdXBkYXRlZC4KICAgIAkgKi8KCiAgICAJbWVyZ2VWZXJ0aWNlczogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIHZlcnRpY2VzTWFwID0ge307IC8vIEhhc2htYXAgZm9yIGxvb2tpbmcgdXAgdmVydGljZXMgYnkgcG9zaXRpb24gY29vcmRpbmF0ZXMgKGFuZCBtYWtpbmcgc3VyZSB0aGV5IGFyZSB1bmlxdWUpCiAgICAJCXZhciB1bmlxdWUgPSBbXSwgY2hhbmdlcyA9IFtdOwoKICAgIAkJdmFyIHYsIGtleTsKICAgIAkJdmFyIHByZWNpc2lvblBvaW50cyA9IDQ7IC8vIG51bWJlciBvZiBkZWNpbWFsIHBvaW50cywgZS5nLiA0IGZvciBlcHNpbG9uIG9mIDAuMDAwMQogICAgCQl2YXIgcHJlY2lzaW9uID0gTWF0aC5wb3coIDEwLCBwcmVjaXNpb25Qb2ludHMgKTsKICAgIAkJdmFyIGksIGlsLCBmYWNlOwogICAgCQl2YXIgaW5kaWNlcywgaiwgamw7CgogICAgCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLnZlcnRpY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXYgPSB0aGlzLnZlcnRpY2VzWyBpIF07CiAgICAJCQlrZXkgPSBNYXRoLnJvdW5kKCB2LnggKiBwcmVjaXNpb24gKSArICdfJyArIE1hdGgucm91bmQoIHYueSAqIHByZWNpc2lvbiApICsgJ18nICsgTWF0aC5yb3VuZCggdi56ICogcHJlY2lzaW9uICk7CgogICAgCQkJaWYgKCB2ZXJ0aWNlc01hcFsga2V5IF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJdmVydGljZXNNYXBbIGtleSBdID0gaTsKICAgIAkJCQl1bmlxdWUucHVzaCggdGhpcy52ZXJ0aWNlc1sgaSBdICk7CiAgICAJCQkJY2hhbmdlc1sgaSBdID0gdW5pcXVlLmxlbmd0aCAtIDE7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJLy9jb25zb2xlLmxvZygnRHVwbGljYXRlIHZlcnRleCBmb3VuZC4gJywgaSwgJyBjb3VsZCBiZSB1c2luZyAnLCB2ZXJ0aWNlc01hcFtrZXldKTsKICAgIAkJCQljaGFuZ2VzWyBpIF0gPSBjaGFuZ2VzWyB2ZXJ0aWNlc01hcFsga2V5IF0gXTsKCiAgICAJCQl9CgogICAgCQl9CgoKICAgIAkJLy8gaWYgZmFjZXMgYXJlIGNvbXBsZXRlbHkgZGVnZW5lcmF0ZSBhZnRlciBtZXJnaW5nIHZlcnRpY2VzLCB3ZQogICAgCQkvLyBoYXZlIHRvIHJlbW92ZSB0aGVtIGZyb20gdGhlIGdlb21ldHJ5LgogICAgCQl2YXIgZmFjZUluZGljZXNUb1JlbW92ZSA9IFtdOwoKICAgIAkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5mYWNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQlmYWNlID0gdGhpcy5mYWNlc1sgaSBdOwoKICAgIAkJCWZhY2UuYSA9IGNoYW5nZXNbIGZhY2UuYSBdOwogICAgCQkJZmFjZS5iID0gY2hhbmdlc1sgZmFjZS5iIF07CiAgICAJCQlmYWNlLmMgPSBjaGFuZ2VzWyBmYWNlLmMgXTsKCiAgICAJCQlpbmRpY2VzID0gWyBmYWNlLmEsIGZhY2UuYiwgZmFjZS5jIF07CgogICAgCQkJLy8gaWYgYW55IGR1cGxpY2F0ZSB2ZXJ0aWNlcyBhcmUgZm91bmQgaW4gYSBGYWNlMwogICAgCQkJLy8gd2UgaGF2ZSB0byByZW1vdmUgdGhlIGZhY2UgYXMgbm90aGluZyBjYW4gYmUgc2F2ZWQKICAgIAkJCWZvciAoIHZhciBuID0gMDsgbiA8IDM7IG4gKysgKSB7CgogICAgCQkJCWlmICggaW5kaWNlc1sgbiBdID09PSBpbmRpY2VzWyAoIG4gKyAxICkgJSAzIF0gKSB7CgogICAgCQkJCQlmYWNlSW5kaWNlc1RvUmVtb3ZlLnB1c2goIGkgKTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlmb3IgKCBpID0gZmFjZUluZGljZXNUb1JlbW92ZS5sZW5ndGggLSAxOyBpID49IDA7IGkgLS0gKSB7CgogICAgCQkJdmFyIGlkeCA9IGZhY2VJbmRpY2VzVG9SZW1vdmVbIGkgXTsKCiAgICAJCQl0aGlzLmZhY2VzLnNwbGljZSggaWR4LCAxICk7CgogICAgCQkJZm9yICggaiA9IDAsIGpsID0gdGhpcy5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCQl0aGlzLmZhY2VWZXJ0ZXhVdnNbIGogXS5zcGxpY2UoIGlkeCwgMSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vIFVzZSB1bmlxdWUgc2V0IG9mIHZlcnRpY2VzCgogICAgCQl2YXIgZGlmZiA9IHRoaXMudmVydGljZXMubGVuZ3RoIC0gdW5pcXVlLmxlbmd0aDsKICAgIAkJdGhpcy52ZXJ0aWNlcyA9IHVuaXF1ZTsKICAgIAkJcmV0dXJuIGRpZmY7CgogICAgCX0sCgogICAgCXNldEZyb21Qb2ludHM6IGZ1bmN0aW9uICggcG9pbnRzICkgewoKICAgIAkJdGhpcy52ZXJ0aWNlcyA9IFtdOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIHBvaW50ID0gcG9pbnRzWyBpIF07CiAgICAJCQl0aGlzLnZlcnRpY2VzLnB1c2goIG5ldyBWZWN0b3IzKCBwb2ludC54LCBwb2ludC55LCBwb2ludC56IHx8IDAgKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNvcnRGYWNlc0J5TWF0ZXJpYWxJbmRleDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGZhY2VzID0gdGhpcy5mYWNlczsKICAgIAkJdmFyIGxlbmd0aCA9IGZhY2VzLmxlbmd0aDsKCiAgICAJCS8vIHRhZyBmYWNlcwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkgewoKICAgIAkJCWZhY2VzWyBpIF0uX2lkID0gaTsKCiAgICAJCX0KCiAgICAJCS8vIHNvcnQgZmFjZXMKCiAgICAJCWZ1bmN0aW9uIG1hdGVyaWFsSW5kZXhTb3J0KCBhLCBiICkgewoKICAgIAkJCXJldHVybiBhLm1hdGVyaWFsSW5kZXggLSBiLm1hdGVyaWFsSW5kZXg7CgogICAgCQl9CgogICAgCQlmYWNlcy5zb3J0KCBtYXRlcmlhbEluZGV4U29ydCApOwoKICAgIAkJLy8gc29ydCB1dnMKCiAgICAJCXZhciB1dnMxID0gdGhpcy5mYWNlVmVydGV4VXZzWyAwIF07CiAgICAJCXZhciB1dnMyID0gdGhpcy5mYWNlVmVydGV4VXZzWyAxIF07CgogICAgCQl2YXIgbmV3VXZzMSwgbmV3VXZzMjsKCiAgICAJCWlmICggdXZzMSAmJiB1dnMxLmxlbmd0aCA9PT0gbGVuZ3RoICkgbmV3VXZzMSA9IFtdOwogICAgCQlpZiAoIHV2czIgJiYgdXZzMi5sZW5ndGggPT09IGxlbmd0aCApIG5ld1V2czIgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgaWQgPSBmYWNlc1sgaSBdLl9pZDsKCiAgICAJCQlpZiAoIG5ld1V2czEgKSBuZXdVdnMxLnB1c2goIHV2czFbIGlkIF0gKTsKICAgIAkJCWlmICggbmV3VXZzMiApIG5ld1V2czIucHVzaCggdXZzMlsgaWQgXSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBuZXdVdnMxICkgdGhpcy5mYWNlVmVydGV4VXZzWyAwIF0gPSBuZXdVdnMxOwogICAgCQlpZiAoIG5ld1V2czIgKSB0aGlzLmZhY2VWZXJ0ZXhVdnNbIDEgXSA9IG5ld1V2czI7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGRhdGEgPSB7CiAgICAJCQltZXRhZGF0YTogewogICAgCQkJCXZlcnNpb246IDQuNSwKICAgIAkJCQl0eXBlOiAnR2VvbWV0cnknLAogICAgCQkJCWdlbmVyYXRvcjogJ0dlb21ldHJ5LnRvSlNPTicKICAgIAkJCX0KICAgIAkJfTsKCiAgICAJCS8vIHN0YW5kYXJkIEdlb21ldHJ5IHNlcmlhbGl6YXRpb24KCiAgICAJCWRhdGEudXVpZCA9IHRoaXMudXVpZDsKICAgIAkJZGF0YS50eXBlID0gdGhpcy50eXBlOwogICAgCQlpZiAoIHRoaXMubmFtZSAhPT0gJycgKSBkYXRhLm5hbWUgPSB0aGlzLm5hbWU7CgogICAgCQlpZiAoIHRoaXMucGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBwYXJhbWV0ZXJzID0gdGhpcy5wYXJhbWV0ZXJzOwoKICAgIAkJCWZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsKCiAgICAJCQkJaWYgKCBwYXJhbWV0ZXJzWyBrZXkgXSAhPT0gdW5kZWZpbmVkICkgZGF0YVsga2V5IF0gPSBwYXJhbWV0ZXJzWyBrZXkgXTsKCiAgICAJCQl9CgogICAgCQkJcmV0dXJuIGRhdGE7CgogICAgCQl9CgogICAgCQl2YXIgdmVydGljZXMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudmVydGljZXMubGVuZ3RoOyBpICsrICkgewoKICAgIAkJCXZhciB2ZXJ0ZXggPSB0aGlzLnZlcnRpY2VzWyBpIF07CiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQl9CgogICAgCQl2YXIgZmFjZXMgPSBbXTsKICAgIAkJdmFyIG5vcm1hbHMgPSBbXTsKICAgIAkJdmFyIG5vcm1hbHNIYXNoID0ge307CiAgICAJCXZhciBjb2xvcnMgPSBbXTsKICAgIAkJdmFyIGNvbG9yc0hhc2ggPSB7fTsKICAgIAkJdmFyIHV2cyA9IFtdOwogICAgCQl2YXIgdXZzSGFzaCA9IHt9OwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGhpcy5mYWNlcy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJdmFyIGZhY2UgPSB0aGlzLmZhY2VzWyBpIF07CgogICAgCQkJdmFyIGhhc01hdGVyaWFsID0gdHJ1ZTsKICAgIAkJCXZhciBoYXNGYWNlVXYgPSBmYWxzZTsgLy8gZGVwcmVjYXRlZAogICAgCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhVdiA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF0gIT09IHVuZGVmaW5lZDsKICAgIAkJCXZhciBoYXNGYWNlTm9ybWFsID0gZmFjZS5ub3JtYWwubGVuZ3RoKCkgPiAwOwogICAgCQkJdmFyIGhhc0ZhY2VWZXJ0ZXhOb3JtYWwgPSBmYWNlLnZlcnRleE5vcm1hbHMubGVuZ3RoID4gMDsKICAgIAkJCXZhciBoYXNGYWNlQ29sb3IgPSBmYWNlLmNvbG9yLnIgIT09IDEgfHwgZmFjZS5jb2xvci5nICE9PSAxIHx8IGZhY2UuY29sb3IuYiAhPT0gMTsKICAgIAkJCXZhciBoYXNGYWNlVmVydGV4Q29sb3IgPSBmYWNlLnZlcnRleENvbG9ycy5sZW5ndGggPiAwOwoKICAgIAkJCXZhciBmYWNlVHlwZSA9IDA7CgogICAgCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAwLCAwICk7IC8vIGlzUXVhZAogICAgCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAxLCBoYXNNYXRlcmlhbCApOwogICAgCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCAyLCBoYXNGYWNlVXYgKTsKICAgIAkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgMywgaGFzRmFjZVZlcnRleFV2ICk7CiAgICAJCQlmYWNlVHlwZSA9IHNldEJpdCggZmFjZVR5cGUsIDQsIGhhc0ZhY2VOb3JtYWwgKTsKICAgIAkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNSwgaGFzRmFjZVZlcnRleE5vcm1hbCApOwogICAgCQkJZmFjZVR5cGUgPSBzZXRCaXQoIGZhY2VUeXBlLCA2LCBoYXNGYWNlQ29sb3IgKTsKICAgIAkJCWZhY2VUeXBlID0gc2V0Qml0KCBmYWNlVHlwZSwgNywgaGFzRmFjZVZlcnRleENvbG9yICk7CgogICAgCQkJZmFjZXMucHVzaCggZmFjZVR5cGUgKTsKICAgIAkJCWZhY2VzLnB1c2goIGZhY2UuYSwgZmFjZS5iLCBmYWNlLmMgKTsKICAgIAkJCWZhY2VzLnB1c2goIGZhY2UubWF0ZXJpYWxJbmRleCApOwoKICAgIAkJCWlmICggaGFzRmFjZVZlcnRleFV2ICkgewoKICAgIAkJCQl2YXIgZmFjZVZlcnRleFV2cyA9IHRoaXMuZmFjZVZlcnRleFV2c1sgMCBdWyBpIF07CgogICAgCQkJCWZhY2VzLnB1c2goCiAgICAJCQkJCWdldFV2SW5kZXgoIGZhY2VWZXJ0ZXhVdnNbIDAgXSApLAogICAgCQkJCQlnZXRVdkluZGV4KCBmYWNlVmVydGV4VXZzWyAxIF0gKSwKICAgIAkJCQkJZ2V0VXZJbmRleCggZmFjZVZlcnRleFV2c1sgMiBdICkKICAgIAkJCQkpOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIGhhc0ZhY2VOb3JtYWwgKSB7CgogICAgCQkJCWZhY2VzLnB1c2goIGdldE5vcm1hbEluZGV4KCBmYWNlLm5vcm1hbCApICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggaGFzRmFjZVZlcnRleE5vcm1hbCApIHsKCiAgICAJCQkJdmFyIHZlcnRleE5vcm1hbHMgPSBmYWNlLnZlcnRleE5vcm1hbHM7CgogICAgCQkJCWZhY2VzLnB1c2goCiAgICAJCQkJCWdldE5vcm1hbEluZGV4KCB2ZXJ0ZXhOb3JtYWxzWyAwIF0gKSwKICAgIAkJCQkJZ2V0Tm9ybWFsSW5kZXgoIHZlcnRleE5vcm1hbHNbIDEgXSApLAogICAgCQkJCQlnZXROb3JtYWxJbmRleCggdmVydGV4Tm9ybWFsc1sgMiBdICkKICAgIAkJCQkpOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIGhhc0ZhY2VDb2xvciApIHsKCiAgICAJCQkJZmFjZXMucHVzaCggZ2V0Q29sb3JJbmRleCggZmFjZS5jb2xvciApICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggaGFzRmFjZVZlcnRleENvbG9yICkgewoKICAgIAkJCQl2YXIgdmVydGV4Q29sb3JzID0gZmFjZS52ZXJ0ZXhDb2xvcnM7CgogICAgCQkJCWZhY2VzLnB1c2goCiAgICAJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMCBdICksCiAgICAJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMSBdICksCiAgICAJCQkJCWdldENvbG9ySW5kZXgoIHZlcnRleENvbG9yc1sgMiBdICkKICAgIAkJCQkpOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWZ1bmN0aW9uIHNldEJpdCggdmFsdWUsIHBvc2l0aW9uLCBlbmFibGVkICkgewoKICAgIAkJCXJldHVybiBlbmFibGVkID8gdmFsdWUgfCAoIDEgPDwgcG9zaXRpb24gKSA6IHZhbHVlICYgKCB+ICggMSA8PCBwb3NpdGlvbiApICk7CgogICAgCQl9CgogICAgCQlmdW5jdGlvbiBnZXROb3JtYWxJbmRleCggbm9ybWFsICkgewoKICAgIAkJCXZhciBoYXNoID0gbm9ybWFsLngudG9TdHJpbmcoKSArIG5vcm1hbC55LnRvU3RyaW5nKCkgKyBub3JtYWwuei50b1N0cmluZygpOwoKICAgIAkJCWlmICggbm9ybWFsc0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlyZXR1cm4gbm9ybWFsc0hhc2hbIGhhc2ggXTsKCiAgICAJCQl9CgogICAgCQkJbm9ybWFsc0hhc2hbIGhhc2ggXSA9IG5vcm1hbHMubGVuZ3RoIC8gMzsKICAgIAkJCW5vcm1hbHMucHVzaCggbm9ybWFsLngsIG5vcm1hbC55LCBub3JtYWwueiApOwoKICAgIAkJCXJldHVybiBub3JtYWxzSGFzaFsgaGFzaCBdOwoKICAgIAkJfQoKICAgIAkJZnVuY3Rpb24gZ2V0Q29sb3JJbmRleCggY29sb3IgKSB7CgogICAgCQkJdmFyIGhhc2ggPSBjb2xvci5yLnRvU3RyaW5nKCkgKyBjb2xvci5nLnRvU3RyaW5nKCkgKyBjb2xvci5iLnRvU3RyaW5nKCk7CgogICAgCQkJaWYgKCBjb2xvcnNIYXNoWyBoYXNoIF0gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJcmV0dXJuIGNvbG9yc0hhc2hbIGhhc2ggXTsKCiAgICAJCQl9CgogICAgCQkJY29sb3JzSGFzaFsgaGFzaCBdID0gY29sb3JzLmxlbmd0aDsKICAgIAkJCWNvbG9ycy5wdXNoKCBjb2xvci5nZXRIZXgoKSApOwoKICAgIAkJCXJldHVybiBjb2xvcnNIYXNoWyBoYXNoIF07CgogICAgCQl9CgogICAgCQlmdW5jdGlvbiBnZXRVdkluZGV4KCB1diApIHsKCiAgICAJCQl2YXIgaGFzaCA9IHV2LngudG9TdHJpbmcoKSArIHV2LnkudG9TdHJpbmcoKTsKCiAgICAJCQlpZiAoIHV2c0hhc2hbIGhhc2ggXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlyZXR1cm4gdXZzSGFzaFsgaGFzaCBdOwoKICAgIAkJCX0KCiAgICAJCQl1dnNIYXNoWyBoYXNoIF0gPSB1dnMubGVuZ3RoIC8gMjsKICAgIAkJCXV2cy5wdXNoKCB1di54LCB1di55ICk7CgogICAgCQkJcmV0dXJuIHV2c0hhc2hbIGhhc2ggXTsKCiAgICAJCX0KCiAgICAJCWRhdGEuZGF0YSA9IHt9OwoKICAgIAkJZGF0YS5kYXRhLnZlcnRpY2VzID0gdmVydGljZXM7CiAgICAJCWRhdGEuZGF0YS5ub3JtYWxzID0gbm9ybWFsczsKICAgIAkJaWYgKCBjb2xvcnMubGVuZ3RoID4gMCApIGRhdGEuZGF0YS5jb2xvcnMgPSBjb2xvcnM7CiAgICAJCWlmICggdXZzLmxlbmd0aCA+IDAgKSBkYXRhLmRhdGEudXZzID0gWyB1dnMgXTsgLy8gdGVtcG9yYWwgYmFja3dhcmQgY29tcGF0aWJpbGl0eQogICAgCQlkYXRhLmRhdGEuZmFjZXMgPSBmYWNlczsKCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJLyoKICAgIAkJIC8vIEhhbmRsZSBwcmltaXRpdmVzCgogICAgCQkgdmFyIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnM7CgogICAgCQkgaWYgKCBwYXJhbWV0ZXJzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkgdmFyIHZhbHVlcyA9IFtdOwoKICAgIAkJIGZvciAoIHZhciBrZXkgaW4gcGFyYW1ldGVycyApIHsKCiAgICAJCSB2YWx1ZXMucHVzaCggcGFyYW1ldGVyc1sga2V5IF0gKTsKCiAgICAJCSB9CgogICAgCQkgdmFyIGdlb21ldHJ5ID0gT2JqZWN0LmNyZWF0ZSggdGhpcy5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgKTsKICAgIAkJIHRoaXMuY29uc3RydWN0b3IuYXBwbHkoIGdlb21ldHJ5LCB2YWx1ZXMgKTsKICAgIAkJIHJldHVybiBnZW9tZXRyeTsKCiAgICAJCSB9CgogICAgCQkgcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwogICAgCQkgKi8KCiAgICAJCXJldHVybiBuZXcgR2VvbWV0cnkoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJdmFyIGksIGlsLCBqLCBqbCwgaywga2w7CgogICAgCQkvLyByZXNldAoKICAgIAkJdGhpcy52ZXJ0aWNlcyA9IFtdOwogICAgCQl0aGlzLmNvbG9ycyA9IFtdOwogICAgCQl0aGlzLmZhY2VzID0gW107CiAgICAJCXRoaXMuZmFjZVZlcnRleFV2cyA9IFtbXV07CiAgICAJCXRoaXMubW9ycGhUYXJnZXRzID0gW107CiAgICAJCXRoaXMubW9ycGhOb3JtYWxzID0gW107CiAgICAJCXRoaXMuc2tpbldlaWdodHMgPSBbXTsKICAgIAkJdGhpcy5za2luSW5kaWNlcyA9IFtdOwogICAgCQl0aGlzLmxpbmVEaXN0YW5jZXMgPSBbXTsKICAgIAkJdGhpcy5ib3VuZGluZ0JveCA9IG51bGw7CiAgICAJCXRoaXMuYm91bmRpbmdTcGhlcmUgPSBudWxsOwoKICAgIAkJLy8gbmFtZQoKICAgIAkJdGhpcy5uYW1lID0gc291cmNlLm5hbWU7CgogICAgCQkvLyB2ZXJ0aWNlcwoKICAgIAkJdmFyIHZlcnRpY2VzID0gc291cmNlLnZlcnRpY2VzOwoKICAgIAkJZm9yICggaSA9IDAsIGlsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdGhpcy52ZXJ0aWNlcy5wdXNoKCB2ZXJ0aWNlc1sgaSBdLmNsb25lKCkgKTsKCiAgICAJCX0KCiAgICAJCS8vIGNvbG9ycwoKICAgIAkJdmFyIGNvbG9ycyA9IHNvdXJjZS5jb2xvcnM7CgogICAgCQlmb3IgKCBpID0gMCwgaWwgPSBjb2xvcnMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdGhpcy5jb2xvcnMucHVzaCggY29sb3JzWyBpIF0uY2xvbmUoKSApOwoKICAgIAkJfQoKICAgIAkJLy8gZmFjZXMKCiAgICAJCXZhciBmYWNlcyA9IHNvdXJjZS5mYWNlczsKCiAgICAJCWZvciAoIGkgPSAwLCBpbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXRoaXMuZmFjZXMucHVzaCggZmFjZXNbIGkgXS5jbG9uZSgpICk7CgogICAgCQl9CgogICAgCQkvLyBmYWNlIHZlcnRleCB1dnMKCiAgICAJCWZvciAoIGkgPSAwLCBpbCA9IHNvdXJjZS5mYWNlVmVydGV4VXZzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCXZhciBmYWNlVmVydGV4VXZzID0gc291cmNlLmZhY2VWZXJ0ZXhVdnNbIGkgXTsKCiAgICAJCQlpZiAoIHRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCXRoaXMuZmFjZVZlcnRleFV2c1sgaSBdID0gW107CgogICAgCQkJfQoKICAgIAkJCWZvciAoIGogPSAwLCBqbCA9IGZhY2VWZXJ0ZXhVdnMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgogICAgCQkJCXZhciB1dnMgPSBmYWNlVmVydGV4VXZzWyBqIF0sIHV2c0NvcHkgPSBbXTsKCiAgICAJCQkJZm9yICggayA9IDAsIGtsID0gdXZzLmxlbmd0aDsgayA8IGtsOyBrICsrICkgewoKICAgIAkJCQkJdmFyIHV2ID0gdXZzWyBrIF07CgogICAgCQkJCQl1dnNDb3B5LnB1c2goIHV2LmNsb25lKCkgKTsKCiAgICAJCQkJfQoKICAgIAkJCQl0aGlzLmZhY2VWZXJ0ZXhVdnNbIGkgXS5wdXNoKCB1dnNDb3B5ICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy8gbW9ycGggdGFyZ2V0cwoKICAgIAkJdmFyIG1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgogICAgCQlmb3IgKCBpID0gMCwgaWwgPSBtb3JwaFRhcmdldHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdmFyIG1vcnBoVGFyZ2V0ID0ge307CiAgICAJCQltb3JwaFRhcmdldC5uYW1lID0gbW9ycGhUYXJnZXRzWyBpIF0ubmFtZTsKCiAgICAJCQkvLyB2ZXJ0aWNlcwoKICAgIAkJCWlmICggbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJbW9ycGhUYXJnZXQudmVydGljZXMgPSBbXTsKCiAgICAJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0udmVydGljZXMubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgogICAgCQkJCQltb3JwaFRhcmdldC52ZXJ0aWNlcy5wdXNoKCBtb3JwaFRhcmdldHNbIGkgXS52ZXJ0aWNlc1sgaiBdLmNsb25lKCkgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQkvLyBub3JtYWxzCgogICAgCQkJaWYgKCBtb3JwaFRhcmdldHNbIGkgXS5ub3JtYWxzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCW1vcnBoVGFyZ2V0Lm5vcm1hbHMgPSBbXTsKCiAgICAJCQkJZm9yICggaiA9IDAsIGpsID0gbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFscy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJCW1vcnBoVGFyZ2V0Lm5vcm1hbHMucHVzaCggbW9ycGhUYXJnZXRzWyBpIF0ubm9ybWFsc1sgaiBdLmNsb25lKCkgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQl0aGlzLm1vcnBoVGFyZ2V0cy5wdXNoKCBtb3JwaFRhcmdldCApOwoKICAgIAkJfQoKICAgIAkJLy8gbW9ycGggbm9ybWFscwoKICAgIAkJdmFyIG1vcnBoTm9ybWFscyA9IHNvdXJjZS5tb3JwaE5vcm1hbHM7CgogICAgCQlmb3IgKCBpID0gMCwgaWwgPSBtb3JwaE5vcm1hbHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdmFyIG1vcnBoTm9ybWFsID0ge307CgogICAgCQkJLy8gdmVydGV4IG5vcm1hbHMKCiAgICAJCQlpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJbW9ycGhOb3JtYWwudmVydGV4Tm9ybWFscyA9IFtdOwoKICAgIAkJCQlmb3IgKCBqID0gMCwgamwgPSBtb3JwaE5vcm1hbHNbIGkgXS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCQkJdmFyIHNyY1ZlcnRleE5vcm1hbCA9IG1vcnBoTm9ybWFsc1sgaSBdLnZlcnRleE5vcm1hbHNbIGogXTsKICAgIAkJCQkJdmFyIGRlc3RWZXJ0ZXhOb3JtYWwgPSB7fTsKCiAgICAJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYSA9IHNyY1ZlcnRleE5vcm1hbC5hLmNsb25lKCk7CiAgICAJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYiA9IHNyY1ZlcnRleE5vcm1hbC5iLmNsb25lKCk7CiAgICAJCQkJCWRlc3RWZXJ0ZXhOb3JtYWwuYyA9IHNyY1ZlcnRleE5vcm1hbC5jLmNsb25lKCk7CgogICAgCQkJCQltb3JwaE5vcm1hbC52ZXJ0ZXhOb3JtYWxzLnB1c2goIGRlc3RWZXJ0ZXhOb3JtYWwgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQkvLyBmYWNlIG5vcm1hbHMKCiAgICAJCQlpZiAoIG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCW1vcnBoTm9ybWFsLmZhY2VOb3JtYWxzID0gW107CgogICAgCQkJCWZvciAoIGogPSAwLCBqbCA9IG1vcnBoTm9ybWFsc1sgaSBdLmZhY2VOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCQkJbW9ycGhOb3JtYWwuZmFjZU5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWxzWyBpIF0uZmFjZU5vcm1hbHNbIGogXS5jbG9uZSgpICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJdGhpcy5tb3JwaE5vcm1hbHMucHVzaCggbW9ycGhOb3JtYWwgKTsKCiAgICAJCX0KCiAgICAJCS8vIHNraW4gd2VpZ2h0cwoKICAgIAkJdmFyIHNraW5XZWlnaHRzID0gc291cmNlLnNraW5XZWlnaHRzOwoKICAgIAkJZm9yICggaSA9IDAsIGlsID0gc2tpbldlaWdodHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdGhpcy5za2luV2VpZ2h0cy5wdXNoKCBza2luV2VpZ2h0c1sgaSBdLmNsb25lKCkgKTsKCiAgICAJCX0KCiAgICAJCS8vIHNraW4gaW5kaWNlcwoKICAgIAkJdmFyIHNraW5JbmRpY2VzID0gc291cmNlLnNraW5JbmRpY2VzOwoKICAgIAkJZm9yICggaSA9IDAsIGlsID0gc2tpbkluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdGhpcy5za2luSW5kaWNlcy5wdXNoKCBza2luSW5kaWNlc1sgaSBdLmNsb25lKCkgKTsKCiAgICAJCX0KCiAgICAJCS8vIGxpbmUgZGlzdGFuY2VzCgogICAgCQl2YXIgbGluZURpc3RhbmNlcyA9IHNvdXJjZS5saW5lRGlzdGFuY2VzOwoKICAgIAkJZm9yICggaSA9IDAsIGlsID0gbGluZURpc3RhbmNlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl0aGlzLmxpbmVEaXN0YW5jZXMucHVzaCggbGluZURpc3RhbmNlc1sgaSBdICk7CgogICAgCQl9CgogICAgCQkvLyBib3VuZGluZyBib3gKCiAgICAJCXZhciBib3VuZGluZ0JveCA9IHNvdXJjZS5ib3VuZGluZ0JveDsKCiAgICAJCWlmICggYm91bmRpbmdCb3ggIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5ib3VuZGluZ0JveCA9IGJvdW5kaW5nQm94LmNsb25lKCk7CgogICAgCQl9CgogICAgCQkvLyBib3VuZGluZyBzcGhlcmUKCiAgICAJCXZhciBib3VuZGluZ1NwaGVyZSA9IHNvdXJjZS5ib3VuZGluZ1NwaGVyZTsKCiAgICAJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5ib3VuZGluZ1NwaGVyZSA9IGJvdW5kaW5nU3BoZXJlLmNsb25lKCk7CgogICAgCQl9CgogICAgCQkvLyB1cGRhdGUgZmxhZ3MKCiAgICAJCXRoaXMuZWxlbWVudHNOZWVkVXBkYXRlID0gc291cmNlLmVsZW1lbnRzTmVlZFVwZGF0ZTsKICAgIAkJdGhpcy52ZXJ0aWNlc05lZWRVcGRhdGUgPSBzb3VyY2UudmVydGljZXNOZWVkVXBkYXRlOwogICAgCQl0aGlzLnV2c05lZWRVcGRhdGUgPSBzb3VyY2UudXZzTmVlZFVwZGF0ZTsKICAgIAkJdGhpcy5ub3JtYWxzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ub3JtYWxzTmVlZFVwZGF0ZTsKICAgIAkJdGhpcy5jb2xvcnNOZWVkVXBkYXRlID0gc291cmNlLmNvbG9yc05lZWRVcGRhdGU7CiAgICAJCXRoaXMubGluZURpc3RhbmNlc05lZWRVcGRhdGUgPSBzb3VyY2UubGluZURpc3RhbmNlc05lZWRVcGRhdGU7CiAgICAJCXRoaXMuZ3JvdXBzTmVlZFVwZGF0ZSA9IHNvdXJjZS5ncm91cHNOZWVkVXBkYXRlOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWRpc3Bvc2U6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnZGlzcG9zZScgfSApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICAvLyBCb3hHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIEJveEdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgd2lkdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIGRlcHRoU2VnbWVudHMgKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0JveEdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQl3aWR0aDogd2lkdGgsCiAgICAJCWhlaWdodDogaGVpZ2h0LAogICAgCQlkZXB0aDogZGVwdGgsCiAgICAJCXdpZHRoU2VnbWVudHM6IHdpZHRoU2VnbWVudHMsCiAgICAJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKICAgIAkJZGVwdGhTZWdtZW50czogZGVwdGhTZWdtZW50cwogICAgCX07CgogICAgCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQm94QnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgZGVwdGhTZWdtZW50cyApICk7CiAgICAJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgogICAgfQoKICAgIEJveEdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgQm94R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94R2VvbWV0cnk7CgogICAgLy8gQm94QnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBCb3hCdWZmZXJHZW9tZXRyeSggd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBkZXB0aFNlZ21lbnRzICkgewoKICAgIAlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdCb3hCdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJd2lkdGg6IHdpZHRoLAogICAgCQloZWlnaHQ6IGhlaWdodCwKICAgIAkJZGVwdGg6IGRlcHRoLAogICAgCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAogICAgCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCiAgICAJCWRlcHRoU2VnbWVudHM6IGRlcHRoU2VnbWVudHMKICAgIAl9OwoKICAgIAl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAl3aWR0aCA9IHdpZHRoIHx8IDE7CiAgICAJaGVpZ2h0ID0gaGVpZ2h0IHx8IDE7CiAgICAJZGVwdGggPSBkZXB0aCB8fCAxOwoKICAgIAkvLyBzZWdtZW50cwoKICAgIAl3aWR0aFNlZ21lbnRzID0gTWF0aC5mbG9vciggd2lkdGhTZWdtZW50cyApIHx8IDE7CiAgICAJaGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CiAgICAJZGVwdGhTZWdtZW50cyA9IE1hdGguZmxvb3IoIGRlcHRoU2VnbWVudHMgKSB8fCAxOwoKICAgIAkvLyBidWZmZXJzCgogICAgCXZhciBpbmRpY2VzID0gW107CiAgICAJdmFyIHZlcnRpY2VzID0gW107CiAgICAJdmFyIG5vcm1hbHMgPSBbXTsKICAgIAl2YXIgdXZzID0gW107CgogICAgCS8vIGhlbHBlciB2YXJpYWJsZXMKCiAgICAJdmFyIG51bWJlck9mVmVydGljZXMgPSAwOwogICAgCXZhciBncm91cFN0YXJ0ID0gMDsKCiAgICAJLy8gYnVpbGQgZWFjaCBzaWRlIG9mIHRoZSBib3ggZ2VvbWV0cnkKCiAgICAJYnVpbGRQbGFuZSggJ3onLCAneScsICd4JywgLSAxLCAtIDEsIGRlcHRoLCBoZWlnaHQsIHdpZHRoLCBkZXB0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgMCApOyAvLyBweAogICAgCWJ1aWxkUGxhbmUoICd6JywgJ3knLCAneCcsIDEsIC0gMSwgZGVwdGgsIGhlaWdodCwgLSB3aWR0aCwgZGVwdGhTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIDEgKTsgLy8gbngKICAgIAlidWlsZFBsYW5lKCAneCcsICd6JywgJ3knLCAxLCAxLCB3aWR0aCwgZGVwdGgsIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMiApOyAvLyBweQogICAgCWJ1aWxkUGxhbmUoICd4JywgJ3onLCAneScsIDEsIC0gMSwgd2lkdGgsIGRlcHRoLCAtIGhlaWdodCwgd2lkdGhTZWdtZW50cywgZGVwdGhTZWdtZW50cywgMyApOyAvLyBueQogICAgCWJ1aWxkUGxhbmUoICd4JywgJ3knLCAneicsIDEsIC0gMSwgd2lkdGgsIGhlaWdodCwgZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA0ICk7IC8vIHB6CiAgICAJYnVpbGRQbGFuZSggJ3gnLCAneScsICd6JywgLSAxLCAtIDEsIHdpZHRoLCBoZWlnaHQsIC0gZGVwdGgsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCA1ICk7IC8vIG56CgogICAgCS8vIGJ1aWxkIGdlb21ldHJ5CgogICAgCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgogICAgCWZ1bmN0aW9uIGJ1aWxkUGxhbmUoIHUsIHYsIHcsIHVkaXIsIHZkaXIsIHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBncmlkWCwgZ3JpZFksIG1hdGVyaWFsSW5kZXggKSB7CgogICAgCQl2YXIgc2VnbWVudFdpZHRoID0gd2lkdGggLyBncmlkWDsKICAgIAkJdmFyIHNlZ21lbnRIZWlnaHQgPSBoZWlnaHQgLyBncmlkWTsKCiAgICAJCXZhciB3aWR0aEhhbGYgPSB3aWR0aCAvIDI7CiAgICAJCXZhciBoZWlnaHRIYWxmID0gaGVpZ2h0IC8gMjsKICAgIAkJdmFyIGRlcHRoSGFsZiA9IGRlcHRoIC8gMjsKCiAgICAJCXZhciBncmlkWDEgPSBncmlkWCArIDE7CiAgICAJCXZhciBncmlkWTEgPSBncmlkWSArIDE7CgogICAgCQl2YXIgdmVydGV4Q291bnRlciA9IDA7CiAgICAJCXZhciBncm91cENvdW50ID0gMDsKCiAgICAJCXZhciBpeCwgaXk7CgogICAgCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKCiAgICAJCWZvciAoIGl5ID0gMDsgaXkgPCBncmlkWTE7IGl5ICsrICkgewoKICAgIAkJCXZhciB5ID0gaXkgKiBzZWdtZW50SGVpZ2h0IC0gaGVpZ2h0SGFsZjsKCiAgICAJCQlmb3IgKCBpeCA9IDA7IGl4IDwgZ3JpZFgxOyBpeCArKyApIHsKCiAgICAJCQkJdmFyIHggPSBpeCAqIHNlZ21lbnRXaWR0aCAtIHdpZHRoSGFsZjsKCiAgICAJCQkJLy8gc2V0IHZhbHVlcyB0byBjb3JyZWN0IHZlY3RvciBjb21wb25lbnQKCiAgICAJCQkJdmVjdG9yWyB1IF0gPSB4ICogdWRpcjsKICAgIAkJCQl2ZWN0b3JbIHYgXSA9IHkgKiB2ZGlyOwogICAgCQkJCXZlY3RvclsgdyBdID0gZGVwdGhIYWxmOwoKICAgIAkJCQkvLyBub3cgYXBwbHkgdmVjdG9yIHRvIHZlcnRleCBidWZmZXIKCiAgICAJCQkJdmVydGljZXMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOwoKICAgIAkJCQkvLyBzZXQgdmFsdWVzIHRvIGNvcnJlY3QgdmVjdG9yIGNvbXBvbmVudAoKICAgIAkJCQl2ZWN0b3JbIHUgXSA9IDA7CiAgICAJCQkJdmVjdG9yWyB2IF0gPSAwOwogICAgCQkJCXZlY3RvclsgdyBdID0gZGVwdGggPiAwID8gMSA6IC0gMTsKCiAgICAJCQkJLy8gbm93IGFwcGx5IHZlY3RvciB0byBub3JtYWwgYnVmZmVyCgogICAgCQkJCW5vcm1hbHMucHVzaCggdmVjdG9yLngsIHZlY3Rvci55LCB2ZWN0b3IueiApOwoKICAgIAkJCQkvLyB1dnMKCiAgICAJCQkJdXZzLnB1c2goIGl4IC8gZ3JpZFggKTsKICAgIAkJCQl1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7CgogICAgCQkJCS8vIGNvdW50ZXJzCgogICAgCQkJCXZlcnRleENvdW50ZXIgKz0gMTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBpbmRpY2VzCgogICAgCQkvLyAxLiB5b3UgbmVlZCB0aHJlZSBpbmRpY2VzIHRvIGRyYXcgYSBzaW5nbGUgZmFjZQogICAgCQkvLyAyLiBhIHNpbmdsZSBzZWdtZW50IGNvbnNpc3RzIG9mIHR3byBmYWNlcwogICAgCQkvLyAzLiBzbyB3ZSBuZWVkIHRvIGdlbmVyYXRlIHNpeCAoMiozKSBpbmRpY2VzIHBlciBzZWdtZW50CgogICAgCQlmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkgewoKICAgIAkJCWZvciAoIGl4ID0gMDsgaXggPCBncmlkWDsgaXggKysgKSB7CgogICAgCQkJCXZhciBhID0gbnVtYmVyT2ZWZXJ0aWNlcyArIGl4ICsgZ3JpZFgxICogaXk7CiAgICAJCQkJdmFyIGIgPSBudW1iZXJPZlZlcnRpY2VzICsgaXggKyBncmlkWDEgKiAoIGl5ICsgMSApOwogICAgCQkJCXZhciBjID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiAoIGl5ICsgMSApOwogICAgCQkJCXZhciBkID0gbnVtYmVyT2ZWZXJ0aWNlcyArICggaXggKyAxICkgKyBncmlkWDEgKiBpeTsKCiAgICAJCQkJLy8gZmFjZXMKCiAgICAJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CiAgICAJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQkJCS8vIGluY3JlYXNlIGNvdW50ZXIKCiAgICAJCQkJZ3JvdXBDb3VudCArPSA2OwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vIGFkZCBhIGdyb3VwIHRvIHRoZSBnZW9tZXRyeS4gdGhpcyB3aWxsIGVuc3VyZSBtdWx0aSBtYXRlcmlhbCBzdXBwb3J0CgogICAgCQlzY29wZS5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgbWF0ZXJpYWxJbmRleCApOwoKICAgIAkJLy8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzCgogICAgCQlncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CgogICAgCQkvLyB1cGRhdGUgdG90YWwgbnVtYmVyIG9mIHZlcnRpY2VzCgogICAgCQludW1iZXJPZlZlcnRpY2VzICs9IHZlcnRleENvdW50ZXI7CgogICAgCX0KCiAgICB9CgogICAgQm94QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBCb3hCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBCb3hCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIFVuaWZvcm0gVXRpbGl0aWVzCiAgICAgKi8KCiAgICBmdW5jdGlvbiBjbG9uZVVuaWZvcm1zKCBzcmMgKSB7CgogICAgCXZhciBkc3QgPSB7fTsKCiAgICAJZm9yICggdmFyIHUgaW4gc3JjICkgewoKICAgIAkJZHN0WyB1IF0gPSB7fTsKCiAgICAJCWZvciAoIHZhciBwIGluIHNyY1sgdSBdICkgewoKICAgIAkJCXZhciBwcm9wZXJ0eSA9IHNyY1sgdSBdWyBwIF07CgogICAgCQkJaWYgKCBwcm9wZXJ0eSAmJiAoIHByb3BlcnR5LmlzQ29sb3IgfHwKICAgIAkJCQlwcm9wZXJ0eS5pc01hdHJpeDMgfHwgcHJvcGVydHkuaXNNYXRyaXg0IHx8CiAgICAJCQkJcHJvcGVydHkuaXNWZWN0b3IyIHx8IHByb3BlcnR5LmlzVmVjdG9yMyB8fCBwcm9wZXJ0eS5pc1ZlY3RvcjQgfHwKICAgIAkJCQlwcm9wZXJ0eS5pc1RleHR1cmUgKSApIHsKCiAgICAJCQkJZHN0WyB1IF1bIHAgXSA9IHByb3BlcnR5LmNsb25lKCk7CgogICAgCQkJfSBlbHNlIGlmICggQXJyYXkuaXNBcnJheSggcHJvcGVydHkgKSApIHsKCiAgICAJCQkJZHN0WyB1IF1bIHAgXSA9IHByb3BlcnR5LnNsaWNlKCk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZHN0WyB1IF1bIHAgXSA9IHByb3BlcnR5OwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfQoKICAgIAlyZXR1cm4gZHN0OwoKICAgIH0KCiAgICBmdW5jdGlvbiBtZXJnZVVuaWZvcm1zKCB1bmlmb3JtcyApIHsKCiAgICAJdmFyIG1lcmdlZCA9IHt9OwoKICAgIAlmb3IgKCB2YXIgdSA9IDA7IHUgPCB1bmlmb3Jtcy5sZW5ndGg7IHUgKysgKSB7CgogICAgCQl2YXIgdG1wID0gY2xvbmVVbmlmb3JtcyggdW5pZm9ybXNbIHUgXSApOwoKICAgIAkJZm9yICggdmFyIHAgaW4gdG1wICkgewoKICAgIAkJCW1lcmdlZFsgcCBdID0gdG1wWyBwIF07CgogICAgCQl9CgogICAgCX0KCiAgICAJcmV0dXJuIG1lcmdlZDsKCiAgICB9CgogICAgLy8gTGVnYWN5CgogICAgdmFyIFVuaWZvcm1zVXRpbHMgPSB7IGNsb25lOiBjbG9uZVVuaWZvcm1zLCBtZXJnZTogbWVyZ2VVbmlmb3JtcyB9OwoKICAgIHZhciBkZWZhdWx0X3ZlcnRleCA9ICJ2b2lkIG1haW4oKSB7XG5cdGdsX1Bvc2l0aW9uID0gcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iOwoKICAgIHZhciBkZWZhdWx0X2ZyYWdtZW50ID0gInZvaWQgbWFpbigpIHtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggMS4wLCAwLjAsIDAuMCwgMS4wICk7XG59IjsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBkZWZpbmVzOiB7ICJsYWJlbCIgOiAidmFsdWUiIH0sCiAgICAgKiAgdW5pZm9ybXM6IHsgInBhcmFtZXRlcjEiOiB7IHZhbHVlOiAxLjAgfSwgInBhcmFtZXRlcjIiOiB7IHZhbHVlMjogMiB9IH0sCiAgICAgKgogICAgICogIGZyYWdtZW50U2hhZGVyOiA8c3RyaW5nPiwKICAgICAqICB2ZXJ0ZXhTaGFkZXI6IDxzdHJpbmc+LAogICAgICoKICAgICAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKICAgICAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4sCiAgICAgKgogICAgICogIGxpZ2h0czogPGJvb2w+LAogICAgICoKICAgICAqICBza2lubmluZzogPGJvb2w+LAogICAgICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAogICAgICogIG1vcnBoTm9ybWFsczogPGJvb2w+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBTaGFkZXJNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCiAgICAJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnU2hhZGVyTWF0ZXJpYWwnOwoKICAgIAl0aGlzLmRlZmluZXMgPSB7fTsKICAgIAl0aGlzLnVuaWZvcm1zID0ge307CgogICAgCXRoaXMudmVydGV4U2hhZGVyID0gZGVmYXVsdF92ZXJ0ZXg7CiAgICAJdGhpcy5mcmFnbWVudFNoYWRlciA9IGRlZmF1bHRfZnJhZ21lbnQ7CgogICAgCXRoaXMubGluZXdpZHRoID0gMTsKCiAgICAJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CgogICAgCXRoaXMuZm9nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2NlbmUgZm9nCiAgICAJdGhpcy5saWdodHMgPSBmYWxzZTsgLy8gc2V0IHRvIHVzZSBzY2VuZSBsaWdodHMKICAgIAl0aGlzLmNsaXBwaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2UgdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcwoKICAgIAl0aGlzLnNraW5uaW5nID0gZmFsc2U7IC8vIHNldCB0byB1c2Ugc2tpbm5pbmcgYXR0cmlidXRlIHN0cmVhbXMKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIHRhcmdldHMKICAgIAl0aGlzLm1vcnBoTm9ybWFscyA9IGZhbHNlOyAvLyBzZXQgdG8gdXNlIG1vcnBoIG5vcm1hbHMKCiAgICAJdGhpcy5leHRlbnNpb25zID0gewogICAgCQlkZXJpdmF0aXZlczogZmFsc2UsIC8vIHNldCB0byB1c2UgZGVyaXZhdGl2ZXMKICAgIAkJZnJhZ0RlcHRoOiBmYWxzZSwgLy8gc2V0IHRvIHVzZSBmcmFnbWVudCBkZXB0aCB2YWx1ZXMKICAgIAkJZHJhd0J1ZmZlcnM6IGZhbHNlLCAvLyBzZXQgdG8gdXNlIGRyYXcgYnVmZmVycwogICAgCQlzaGFkZXJUZXh0dXJlTE9EOiBmYWxzZSAvLyBzZXQgdG8gdXNlIHNoYWRlciB0ZXh0dXJlIExPRAogICAgCX07CgogICAgCS8vIFdoZW4gcmVuZGVyZWQgZ2VvbWV0cnkgZG9lc24ndCBpbmNsdWRlIHRoZXNlIGF0dHJpYnV0ZXMgYnV0IHRoZSBtYXRlcmlhbCBkb2VzLAogICAgCS8vIHVzZSB0aGVzZSBkZWZhdWx0IHZhbHVlcyBpbiBXZWJHTC4gVGhpcyBhdm9pZHMgZXJyb3JzIHdoZW4gYnVmZmVyIGRhdGEgaXMgbWlzc2luZy4KICAgIAl0aGlzLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgPSB7CiAgICAJCSdjb2xvcic6IFsgMSwgMSwgMSBdLAogICAgCQkndXYnOiBbIDAsIDAgXSwKICAgIAkJJ3V2Mic6IFsgMCwgMCBdCiAgICAJfTsKCiAgICAJdGhpcy5pbmRleDBBdHRyaWJ1dGVOYW1lID0gdW5kZWZpbmVkOwogICAgCXRoaXMudW5pZm9ybXNOZWVkVXBkYXRlID0gZmFsc2U7CgogICAgCWlmICggcGFyYW1ldGVycyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJaWYgKCBwYXJhbWV0ZXJzLmF0dHJpYnV0ZXMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU2hhZGVyTWF0ZXJpYWw6IGF0dHJpYnV0ZXMgc2hvdWxkIG5vdyBiZSBkZWZpbmVkIGluIFRIUkVFLkJ1ZmZlckdlb21ldHJ5IGluc3RlYWQuJyApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCiAgICAJfQoKICAgIH0KCiAgICBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNoYWRlck1hdGVyaWFsOwoKICAgIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZS5pc1NoYWRlck1hdGVyaWFsID0gdHJ1ZTsKCiAgICBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy5mcmFnbWVudFNoYWRlciA9IHNvdXJjZS5mcmFnbWVudFNoYWRlcjsKICAgIAl0aGlzLnZlcnRleFNoYWRlciA9IHNvdXJjZS52ZXJ0ZXhTaGFkZXI7CgogICAgCXRoaXMudW5pZm9ybXMgPSBjbG9uZVVuaWZvcm1zKCBzb3VyY2UudW5pZm9ybXMgKTsKCiAgICAJdGhpcy5kZWZpbmVzID0gT2JqZWN0LmFzc2lnbigge30sIHNvdXJjZS5kZWZpbmVzICk7CgogICAgCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgogICAgCXRoaXMubGlnaHRzID0gc291cmNlLmxpZ2h0czsKICAgIAl0aGlzLmNsaXBwaW5nID0gc291cmNlLmNsaXBwaW5nOwoKICAgIAl0aGlzLnNraW5uaW5nID0gc291cmNlLnNraW5uaW5nOwoKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CiAgICAJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOwoKICAgIAl0aGlzLmV4dGVuc2lvbnMgPSBzb3VyY2UuZXh0ZW5zaW9uczsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBTaGFkZXJNYXRlcmlhbC5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCBtZXRhICkgewoKICAgIAl2YXIgZGF0YSA9IE1hdGVyaWFsLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcywgbWV0YSApOwoKICAgIAlkYXRhLnVuaWZvcm1zID0ge307CgogICAgCWZvciAoIHZhciBuYW1lIGluIHRoaXMudW5pZm9ybXMgKSB7CgogICAgCQl2YXIgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbIG5hbWUgXTsKICAgIAkJdmFyIHZhbHVlID0gdW5pZm9ybS52YWx1ZTsKCiAgICAJCWlmICggdmFsdWUgJiYgdmFsdWUuaXNUZXh0dXJlICkgewoKICAgIAkJCWRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHsKICAgIAkJCQl0eXBlOiAndCcsCiAgICAJCQkJdmFsdWU6IHZhbHVlLnRvSlNPTiggbWV0YSApLnV1aWQKICAgIAkJCX07CgogICAgCQl9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc0NvbG9yICkgewoKICAgIAkJCWRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHsKICAgIAkJCQl0eXBlOiAnYycsCiAgICAJCQkJdmFsdWU6IHZhbHVlLmdldEhleCgpCiAgICAJCQl9OwoKICAgIAkJfSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNWZWN0b3IyICkgewoKICAgIAkJCWRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHsKICAgIAkJCQl0eXBlOiAndjInLAogICAgCQkJCXZhbHVlOiB2YWx1ZS50b0FycmF5KCkKICAgIAkJCX07CgogICAgCQl9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc1ZlY3RvcjMgKSB7CgogICAgCQkJZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0gewogICAgCQkJCXR5cGU6ICd2MycsCiAgICAJCQkJdmFsdWU6IHZhbHVlLnRvQXJyYXkoKQogICAgCQkJfTsKCiAgICAJCX0gZWxzZSBpZiAoIHZhbHVlICYmIHZhbHVlLmlzVmVjdG9yNCApIHsKCiAgICAJCQlkYXRhLnVuaWZvcm1zWyBuYW1lIF0gPSB7CiAgICAJCQkJdHlwZTogJ3Y0JywKICAgIAkJCQl2YWx1ZTogdmFsdWUudG9BcnJheSgpCiAgICAJCQl9OwoKICAgIAkJfSBlbHNlIGlmICggdmFsdWUgJiYgdmFsdWUuaXNNYXRyaXgzICkgewoKICAgIAkJCWRhdGEudW5pZm9ybXNbIG5hbWUgXSA9IHsKICAgIAkJCQl0eXBlOiAnbTMnLAogICAgCQkJCXZhbHVlOiB2YWx1ZS50b0FycmF5KCkKICAgIAkJCX07CgogICAgCQl9IGVsc2UgaWYgKCB2YWx1ZSAmJiB2YWx1ZS5pc01hdHJpeDQgKSB7CgogICAgCQkJZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0gewogICAgCQkJCXR5cGU6ICdtNCcsCiAgICAJCQkJdmFsdWU6IHZhbHVlLnRvQXJyYXkoKQogICAgCQkJfTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJZGF0YS51bmlmb3Jtc1sgbmFtZSBdID0gewogICAgCQkJCXZhbHVlOiB2YWx1ZQogICAgCQkJfTsKCiAgICAJCQkvLyBub3RlOiB0aGUgYXJyYXkgdmFyaWFudHMgdjJ2LCB2M3YsIHY0diwgbTR2IGFuZCB0diBhcmUgbm90IHN1cHBvcnRlZCBzbyBmYXIKCiAgICAJCX0KCiAgICAJfQoKICAgIAlpZiAoIE9iamVjdC5rZXlzKCB0aGlzLmRlZmluZXMgKS5sZW5ndGggPiAwICkgZGF0YS5kZWZpbmVzID0gdGhpcy5kZWZpbmVzOwoKICAgIAlkYXRhLnZlcnRleFNoYWRlciA9IHRoaXMudmVydGV4U2hhZGVyOwogICAgCWRhdGEuZnJhZ21lbnRTaGFkZXIgPSB0aGlzLmZyYWdtZW50U2hhZGVyOwoKICAgIAl2YXIgZXh0ZW5zaW9ucyA9IHt9OwoKICAgIAlmb3IgKCB2YXIga2V5IGluIHRoaXMuZXh0ZW5zaW9ucyApIHsKCiAgICAJCWlmICggdGhpcy5leHRlbnNpb25zWyBrZXkgXSA9PT0gdHJ1ZSApIGV4dGVuc2lvbnNbIGtleSBdID0gdHJ1ZTsKCiAgICAJfQoKICAgIAlpZiAoIE9iamVjdC5rZXlzKCBleHRlbnNpb25zICkubGVuZ3RoID4gMCApIGRhdGEuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7CgogICAgCXJldHVybiBkYXRhOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgKi8KCiAgICBmdW5jdGlvbiBDYW1lcmEoKSB7CgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0NhbWVyYSc7CgogICAgCXRoaXMubWF0cml4V29ybGRJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKCiAgICAJdGhpcy5wcm9qZWN0aW9uTWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKICAgIAl0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlID0gbmV3IE1hdHJpeDQoKTsKCiAgICB9CgogICAgQ2FtZXJhLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBDYW1lcmEsCgogICAgCWlzQ2FtZXJhOiB0cnVlLAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSwgcmVjdXJzaXZlICkgewoKICAgIAkJT2JqZWN0M0QucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTsKCiAgICAJCXRoaXMubWF0cml4V29ybGRJbnZlcnNlLmNvcHkoIHNvdXJjZS5tYXRyaXhXb3JsZEludmVyc2UgKTsKCiAgICAJCXRoaXMucHJvamVjdGlvbk1hdHJpeC5jb3B5KCBzb3VyY2UucHJvamVjdGlvbk1hdHJpeCApOwogICAgCQl0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHNvdXJjZS5wcm9qZWN0aW9uTWF0cml4SW52ZXJzZSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldFdvcmxkRGlyZWN0aW9uOiBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQ2FtZXJhOiAuZ2V0V29ybGREaXJlY3Rpb24oKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCiAgICAJCXZhciBlID0gdGhpcy5tYXRyaXhXb3JsZC5lbGVtZW50czsKCiAgICAJCXJldHVybiB0YXJnZXQuc2V0KCAtIGVbIDggXSwgLSBlWyA5IF0sIC0gZVsgMTAgXSApLm5vcm1hbGl6ZSgpOwoKICAgIAl9LAoKICAgIAl1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKCiAgICAJCU9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApOwoKICAgIAkJdGhpcy5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5tYXRyaXhXb3JsZCApOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgZ3JlZ2dtYW4gLyBodHRwOi8vZ2FtZXMuZ3JlZ2dtYW4uY29tLwogICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwogICAgICogQGF1dGhvciB0c2NodwogICAgICovCgogICAgZnVuY3Rpb24gUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKSB7CgogICAgCUNhbWVyYS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdQZXJzcGVjdGl2ZUNhbWVyYSc7CgogICAgCXRoaXMuZm92ID0gZm92ICE9PSB1bmRlZmluZWQgPyBmb3YgOiA1MDsKICAgIAl0aGlzLnpvb20gPSAxOwoKICAgIAl0aGlzLm5lYXIgPSBuZWFyICE9PSB1bmRlZmluZWQgPyBuZWFyIDogMC4xOwogICAgCXRoaXMuZmFyID0gZmFyICE9PSB1bmRlZmluZWQgPyBmYXIgOiAyMDAwOwogICAgCXRoaXMuZm9jdXMgPSAxMDsKCiAgICAJdGhpcy5hc3BlY3QgPSBhc3BlY3QgIT09IHVuZGVmaW5lZCA/IGFzcGVjdCA6IDE7CiAgICAJdGhpcy52aWV3ID0gbnVsbDsKCiAgICAJdGhpcy5maWxtR2F1Z2UgPSAzNTsJLy8gd2lkdGggb2YgdGhlIGZpbG0gKGRlZmF1bHQgaW4gbWlsbGltZXRlcnMpCiAgICAJdGhpcy5maWxtT2Zmc2V0ID0gMDsJLy8gaG9yaXpvbnRhbCBmaWxtIG9mZnNldCAoc2FtZSB1bml0IGFzIGdhdWdlKQoKICAgIAl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCiAgICB9CgogICAgUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggQ2FtZXJhLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBQZXJzcGVjdGl2ZUNhbWVyYSwKCiAgICAJaXNQZXJzcGVjdGl2ZUNhbWVyYTogdHJ1ZSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UsIHJlY3Vyc2l2ZSApIHsKCiAgICAJCUNhbWVyYS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UsIHJlY3Vyc2l2ZSApOwoKICAgIAkJdGhpcy5mb3YgPSBzb3VyY2UuZm92OwogICAgCQl0aGlzLnpvb20gPSBzb3VyY2Uuem9vbTsKCiAgICAJCXRoaXMubmVhciA9IHNvdXJjZS5uZWFyOwogICAgCQl0aGlzLmZhciA9IHNvdXJjZS5mYXI7CiAgICAJCXRoaXMuZm9jdXMgPSBzb3VyY2UuZm9jdXM7CgogICAgCQl0aGlzLmFzcGVjdCA9IHNvdXJjZS5hc3BlY3Q7CiAgICAJCXRoaXMudmlldyA9IHNvdXJjZS52aWV3ID09PSBudWxsID8gbnVsbCA6IE9iamVjdC5hc3NpZ24oIHt9LCBzb3VyY2UudmlldyApOwoKICAgIAkJdGhpcy5maWxtR2F1Z2UgPSBzb3VyY2UuZmlsbUdhdWdlOwogICAgCQl0aGlzLmZpbG1PZmZzZXQgPSBzb3VyY2UuZmlsbU9mZnNldDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAkvKioKICAgIAkgKiBTZXRzIHRoZSBGT1YgYnkgZm9jYWwgbGVuZ3RoIGluIHJlc3BlY3QgdG8gdGhlIGN1cnJlbnQgLmZpbG1HYXVnZS4KICAgIAkgKgogICAgCSAqIFRoZSBkZWZhdWx0IGZpbG0gZ2F1Z2UgaXMgMzUsIHNvIHRoYXQgdGhlIGZvY2FsIGxlbmd0aCBjYW4gYmUgc3BlY2lmaWVkIGZvcgogICAgCSAqIGEgMzVtbSAoZnVsbCBmcmFtZSkgY2FtZXJhLgogICAgCSAqCiAgICAJICogVmFsdWVzIGZvciBmb2NhbCBsZW5ndGggYW5kIGZpbG0gZ2F1Z2UgbXVzdCBoYXZlIHRoZSBzYW1lIHVuaXQuCiAgICAJICovCiAgICAJc2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICggZm9jYWxMZW5ndGggKSB7CgogICAgCQkvLyBzZWUgaHR0cDovL3d3dy5ib2JhdGtpbnMuY29tL3Bob3RvZ3JhcGh5L3RlY2huaWNhbC9maWVsZF9vZl92aWV3Lmh0bWwKICAgIAkJdmFyIHZFeHRlbnRTbG9wZSA9IDAuNSAqIHRoaXMuZ2V0RmlsbUhlaWdodCgpIC8gZm9jYWxMZW5ndGg7CgogICAgCQl0aGlzLmZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKCB2RXh0ZW50U2xvcGUgKTsKICAgIAkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CgogICAgCX0sCgogICAgCS8qKgogICAgCSAqIENhbGN1bGF0ZXMgdGhlIGZvY2FsIGxlbmd0aCBmcm9tIHRoZSBjdXJyZW50IC5mb3YgYW5kIC5maWxtR2F1Z2UuCiAgICAJICovCiAgICAJZ2V0Rm9jYWxMZW5ndGg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciB2RXh0ZW50U2xvcGUgPSBNYXRoLnRhbiggX01hdGguREVHMlJBRCAqIDAuNSAqIHRoaXMuZm92ICk7CgogICAgCQlyZXR1cm4gMC41ICogdGhpcy5nZXRGaWxtSGVpZ2h0KCkgLyB2RXh0ZW50U2xvcGU7CgogICAgCX0sCgogICAgCWdldEVmZmVjdGl2ZUZPVjogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIF9NYXRoLlJBRDJERUcgKiAyICogTWF0aC5hdGFuKAogICAgCQkJTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tICk7CgogICAgCX0sCgogICAgCWdldEZpbG1XaWR0aDogZnVuY3Rpb24gKCkgewoKICAgIAkJLy8gZmlsbSBub3QgY29tcGxldGVseSBjb3ZlcmVkIGluIHBvcnRyYWl0IGZvcm1hdCAoYXNwZWN0IDwgMSkKICAgIAkJcmV0dXJuIHRoaXMuZmlsbUdhdWdlICogTWF0aC5taW4oIHRoaXMuYXNwZWN0LCAxICk7CgogICAgCX0sCgogICAgCWdldEZpbG1IZWlnaHQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCS8vIGZpbG0gbm90IGNvbXBsZXRlbHkgY292ZXJlZCBpbiBsYW5kc2NhcGUgZm9ybWF0IChhc3BlY3QgPiAxKQogICAgCQlyZXR1cm4gdGhpcy5maWxtR2F1Z2UgLyBNYXRoLm1heCggdGhpcy5hc3BlY3QsIDEgKTsKCiAgICAJfSwKCiAgICAJLyoqCiAgICAJICogU2V0cyBhbiBvZmZzZXQgaW4gYSBsYXJnZXIgZnJ1c3R1bS4gVGhpcyBpcyB1c2VmdWwgZm9yIG11bHRpLXdpbmRvdyBvcgogICAgCSAqIG11bHRpLW1vbml0b3IvbXVsdGktbWFjaGluZSBzZXR1cHMuCiAgICAJICoKICAgIAkgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgM3gyIG1vbml0b3JzIGFuZCBlYWNoIG1vbml0b3IgaXMgMTkyMHgxMDgwIGFuZAogICAgCSAqIHRoZSBtb25pdG9ycyBhcmUgaW4gZ3JpZCBsaWtlIHRoaXMKICAgIAkgKgogICAgCSAqICAgKy0tLSstLS0rLS0tKwogICAgCSAqICAgfCBBIHwgQiB8IEMgfAogICAgCSAqICAgKy0tLSstLS0rLS0tKwogICAgCSAqICAgfCBEIHwgRSB8IEYgfAogICAgCSAqICAgKy0tLSstLS0rLS0tKwogICAgCSAqCiAgICAJICogdGhlbiBmb3IgZWFjaCBtb25pdG9yIHlvdSB3b3VsZCBjYWxsIGl0IGxpa2UgdGhpcwogICAgCSAqCiAgICAJICogICB2YXIgdyA9IDE5MjA7CiAgICAJICogICB2YXIgaCA9IDEwODA7CiAgICAJICogICB2YXIgZnVsbFdpZHRoID0gdyAqIDM7CiAgICAJICogICB2YXIgZnVsbEhlaWdodCA9IGggKiAyOwogICAgCSAqCiAgICAJICogICAtLUEtLQogICAgCSAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAwLCB3LCBoICk7CiAgICAJICogICAtLUItLQogICAgCSAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAwLCB3LCBoICk7CiAgICAJICogICAtLUMtLQogICAgCSAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAwLCB3LCBoICk7CiAgICAJICogICAtLUQtLQogICAgCSAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDAsIGggKiAxLCB3LCBoICk7CiAgICAJICogICAtLUUtLQogICAgCSAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDEsIGggKiAxLCB3LCBoICk7CiAgICAJICogICAtLUYtLQogICAgCSAqICAgY2FtZXJhLnNldFZpZXdPZmZzZXQoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgdyAqIDIsIGggKiAxLCB3LCBoICk7CiAgICAJICoKICAgIAkgKiAgIE5vdGUgdGhlcmUgaXMgbm8gcmVhc29uIG1vbml0b3JzIGhhdmUgdG8gYmUgdGhlIHNhbWUgc2l6ZSBvciBpbiBhIGdyaWQuCiAgICAJICovCiAgICAJc2V0Vmlld09mZnNldDogZnVuY3Rpb24gKCBmdWxsV2lkdGgsIGZ1bGxIZWlnaHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7CgogICAgCQl0aGlzLmFzcGVjdCA9IGZ1bGxXaWR0aCAvIGZ1bGxIZWlnaHQ7CgogICAgCQlpZiAoIHRoaXMudmlldyA9PT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLnZpZXcgPSB7CiAgICAJCQkJZW5hYmxlZDogdHJ1ZSwKICAgIAkJCQlmdWxsV2lkdGg6IDEsCiAgICAJCQkJZnVsbEhlaWdodDogMSwKICAgIAkJCQlvZmZzZXRYOiAwLAogICAgCQkJCW9mZnNldFk6IDAsCiAgICAJCQkJd2lkdGg6IDEsCiAgICAJCQkJaGVpZ2h0OiAxCiAgICAJCQl9OwoKICAgIAkJfQoKICAgIAkJdGhpcy52aWV3LmVuYWJsZWQgPSB0cnVlOwogICAgCQl0aGlzLnZpZXcuZnVsbFdpZHRoID0gZnVsbFdpZHRoOwogICAgCQl0aGlzLnZpZXcuZnVsbEhlaWdodCA9IGZ1bGxIZWlnaHQ7CiAgICAJCXRoaXMudmlldy5vZmZzZXRYID0geDsKICAgIAkJdGhpcy52aWV3Lm9mZnNldFkgPSB5OwogICAgCQl0aGlzLnZpZXcud2lkdGggPSB3aWR0aDsKICAgIAkJdGhpcy52aWV3LmhlaWdodCA9IGhlaWdodDsKCiAgICAJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKICAgIAl9LAoKICAgIAljbGVhclZpZXdPZmZzZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWlmICggdGhpcy52aWV3ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMudmlldy5lbmFibGVkID0gZmFsc2U7CgogICAgCQl9CgogICAgCQl0aGlzLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCiAgICAJfSwKCiAgICAJdXBkYXRlUHJvamVjdGlvbk1hdHJpeDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIG5lYXIgPSB0aGlzLm5lYXIsCiAgICAJCQl0b3AgPSBuZWFyICogTWF0aC50YW4oIF9NYXRoLkRFRzJSQUQgKiAwLjUgKiB0aGlzLmZvdiApIC8gdGhpcy56b29tLAogICAgCQkJaGVpZ2h0ID0gMiAqIHRvcCwKICAgIAkJCXdpZHRoID0gdGhpcy5hc3BlY3QgKiBoZWlnaHQsCiAgICAJCQlsZWZ0ID0gLSAwLjUgKiB3aWR0aCwKICAgIAkJCXZpZXcgPSB0aGlzLnZpZXc7CgogICAgCQlpZiAoIHRoaXMudmlldyAhPT0gbnVsbCAmJiB0aGlzLnZpZXcuZW5hYmxlZCApIHsKCiAgICAJCQl2YXIgZnVsbFdpZHRoID0gdmlldy5mdWxsV2lkdGgsCiAgICAJCQkJZnVsbEhlaWdodCA9IHZpZXcuZnVsbEhlaWdodDsKCiAgICAJCQlsZWZ0ICs9IHZpZXcub2Zmc2V0WCAqIHdpZHRoIC8gZnVsbFdpZHRoOwogICAgCQkJdG9wIC09IHZpZXcub2Zmc2V0WSAqIGhlaWdodCAvIGZ1bGxIZWlnaHQ7CiAgICAJCQl3aWR0aCAqPSB2aWV3LndpZHRoIC8gZnVsbFdpZHRoOwogICAgCQkJaGVpZ2h0ICo9IHZpZXcuaGVpZ2h0IC8gZnVsbEhlaWdodDsKCiAgICAJCX0KCiAgICAJCXZhciBza2V3ID0gdGhpcy5maWxtT2Zmc2V0OwogICAgCQlpZiAoIHNrZXcgIT09IDAgKSBsZWZ0ICs9IG5lYXIgKiBza2V3IC8gdGhpcy5nZXRGaWxtV2lkdGgoKTsKCiAgICAJCXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQsIGxlZnQgKyB3aWR0aCwgdG9wLCB0b3AgLSBoZWlnaHQsIG5lYXIsIHRoaXMuZmFyICk7CgogICAgCQl0aGlzLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIHRoaXMucHJvamVjdGlvbk1hdHJpeCApOwoKICAgIAl9LAoKICAgIAl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCiAgICAJCXZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQlkYXRhLm9iamVjdC5mb3YgPSB0aGlzLmZvdjsKICAgIAkJZGF0YS5vYmplY3Quem9vbSA9IHRoaXMuem9vbTsKCiAgICAJCWRhdGEub2JqZWN0Lm5lYXIgPSB0aGlzLm5lYXI7CiAgICAJCWRhdGEub2JqZWN0LmZhciA9IHRoaXMuZmFyOwogICAgCQlkYXRhLm9iamVjdC5mb2N1cyA9IHRoaXMuZm9jdXM7CgogICAgCQlkYXRhLm9iamVjdC5hc3BlY3QgPSB0aGlzLmFzcGVjdDsKCiAgICAJCWlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTsKCiAgICAJCWRhdGEub2JqZWN0LmZpbG1HYXVnZSA9IHRoaXMuZmlsbUdhdWdlOwogICAgCQlkYXRhLm9iamVjdC5maWxtT2Zmc2V0ID0gdGhpcy5maWxtT2Zmc2V0OwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBDYW1lcmEgZm9yIHJlbmRlcmluZyBjdWJlIG1hcHMKICAgICAqCS0gcmVuZGVycyBzY2VuZSBpbnRvIGF4aXMtYWxpZ25lZCBjdWJlCiAgICAgKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIHZhciBmb3YgPSA5MCwgYXNwZWN0ID0gMTsKCiAgICBmdW5jdGlvbiBDdWJlQ2FtZXJhKCBuZWFyLCBmYXIsIGN1YmVSZXNvbHV0aW9uLCBvcHRpb25zICkgewoKICAgIAlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdDdWJlQ2FtZXJhJzsKCiAgICAJdmFyIGNhbWVyYVBYID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CiAgICAJY2FtZXJhUFgudXAuc2V0KCAwLCAtIDEsIDAgKTsKICAgIAljYW1lcmFQWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAxLCAwLCAwICkgKTsKICAgIAl0aGlzLmFkZCggY2FtZXJhUFggKTsKCiAgICAJdmFyIGNhbWVyYU5YID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CiAgICAJY2FtZXJhTlgudXAuc2V0KCAwLCAtIDEsIDAgKTsKICAgIAljYW1lcmFOWC5sb29rQXQoIG5ldyBWZWN0b3IzKCAtIDEsIDAsIDAgKSApOwogICAgCXRoaXMuYWRkKCBjYW1lcmFOWCApOwoKICAgIAl2YXIgY2FtZXJhUFkgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKICAgIAljYW1lcmFQWS51cC5zZXQoIDAsIDAsIDEgKTsKICAgIAljYW1lcmFQWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAxLCAwICkgKTsKICAgIAl0aGlzLmFkZCggY2FtZXJhUFkgKTsKCiAgICAJdmFyIGNhbWVyYU5ZID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCBmb3YsIGFzcGVjdCwgbmVhciwgZmFyICk7CiAgICAJY2FtZXJhTlkudXAuc2V0KCAwLCAwLCAtIDEgKTsKICAgIAljYW1lcmFOWS5sb29rQXQoIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKSApOwogICAgCXRoaXMuYWRkKCBjYW1lcmFOWSApOwoKICAgIAl2YXIgY2FtZXJhUFogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKICAgIAljYW1lcmFQWi51cC5zZXQoIDAsIC0gMSwgMCApOwogICAgCWNhbWVyYVBaLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIDEgKSApOwogICAgCXRoaXMuYWRkKCBjYW1lcmFQWiApOwoKICAgIAl2YXIgY2FtZXJhTlogPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGZvdiwgYXNwZWN0LCBuZWFyLCBmYXIgKTsKICAgIAljYW1lcmFOWi51cC5zZXQoIDAsIC0gMSwgMCApOwogICAgCWNhbWVyYU5aLmxvb2tBdCggbmV3IFZlY3RvcjMoIDAsIDAsIC0gMSApICk7CiAgICAJdGhpcy5hZGQoIGNhbWVyYU5aICk7CgogICAgCW9wdGlvbnMgPSBvcHRpb25zIHx8IHsgZm9ybWF0OiBSR0JGb3JtYXQsIG1hZ0ZpbHRlcjogTGluZWFyRmlsdGVyLCBtaW5GaWx0ZXI6IExpbmVhckZpbHRlciB9OwoKICAgIAl0aGlzLnJlbmRlclRhcmdldCA9IG5ldyBXZWJHTFJlbmRlclRhcmdldEN1YmUoIGN1YmVSZXNvbHV0aW9uLCBjdWJlUmVzb2x1dGlvbiwgb3B0aW9ucyApOwogICAgCXRoaXMucmVuZGVyVGFyZ2V0LnRleHR1cmUubmFtZSA9ICJDdWJlQ2FtZXJhIjsKCiAgICAJdGhpcy51cGRhdGUgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSApIHsKCiAgICAJCWlmICggdGhpcy5wYXJlbnQgPT09IG51bGwgKSB0aGlzLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgogICAgCQl2YXIgY3VycmVudFJlbmRlclRhcmdldCA9IHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpOwoKICAgIAkJdmFyIHJlbmRlclRhcmdldCA9IHRoaXMucmVuZGVyVGFyZ2V0OwogICAgCQl2YXIgZ2VuZXJhdGVNaXBtYXBzID0gcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzOwoKICAgIAkJcmVuZGVyVGFyZ2V0LnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CgogICAgCQlyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMCApOwogICAgCQlyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFQWCApOwoKICAgIAkJcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDEgKTsKICAgIAkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhTlggKTsKCiAgICAJCXJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCAyICk7CiAgICAJCXJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYVBZICk7CgogICAgCQlyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCwgMyApOwogICAgCQlyZW5kZXJlci5yZW5kZXIoIHNjZW5lLCBjYW1lcmFOWSApOwoKICAgIAkJcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQsIDQgKTsKICAgIAkJcmVuZGVyZXIucmVuZGVyKCBzY2VuZSwgY2FtZXJhUFogKTsKCiAgICAJCXJlbmRlclRhcmdldC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGdlbmVyYXRlTWlwbWFwczsKCiAgICAJCXJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCA1ICk7CiAgICAJCXJlbmRlcmVyLnJlbmRlciggc2NlbmUsIGNhbWVyYU5aICk7CgogICAgCQlyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIGN1cnJlbnRSZW5kZXJUYXJnZXQgKTsKCiAgICAJfTsKCiAgICAJdGhpcy5jbGVhciA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApIHsKCiAgICAJCXZhciBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7CgogICAgCQl2YXIgcmVuZGVyVGFyZ2V0ID0gdGhpcy5yZW5kZXJUYXJnZXQ7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCXJlbmRlcmVyLnNldFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0LCBpICk7CgogICAgCQkJcmVuZGVyZXIuY2xlYXIoIGNvbG9yLCBkZXB0aCwgc3RlbmNpbCApOwoKICAgIAkJfQoKICAgIAkJcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0ICk7CgogICAgCX07CgogICAgfQoKICAgIEN1YmVDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7CiAgICBDdWJlQ2FtZXJhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVDYW1lcmE7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSggd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApIHsKCiAgICAJV2ViR0xSZW5kZXJUYXJnZXQuY2FsbCggdGhpcywgd2lkdGgsIGhlaWdodCwgb3B0aW9ucyApOwoKICAgIH0KCiAgICBXZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggV2ViR0xSZW5kZXJUYXJnZXQucHJvdG90eXBlICk7CiAgICBXZWJHTFJlbmRlclRhcmdldEN1YmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2ViR0xSZW5kZXJUYXJnZXRDdWJlOwoKICAgIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPSB0cnVlOwoKICAgIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUuZnJvbUVxdWlyZWN0YW5ndWxhclRleHR1cmUgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCB0ZXh0dXJlICkgewoKICAgIAl0aGlzLnRleHR1cmUudHlwZSA9IHRleHR1cmUudHlwZTsKICAgIAl0aGlzLnRleHR1cmUuZm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7CiAgICAJdGhpcy50ZXh0dXJlLmVuY29kaW5nID0gdGV4dHVyZS5lbmNvZGluZzsKCiAgICAJdmFyIHNjZW5lID0gbmV3IFNjZW5lKCk7CgogICAgCXZhciBzaGFkZXIgPSB7CgogICAgCQl1bmlmb3JtczogewogICAgCQkJdEVxdWlyZWN0OiB7IHZhbHVlOiBudWxsIH0sCiAgICAJCX0sCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFsKCiAgICAJCQkidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsiLAoKICAgIAkJCSJ2ZWMzIHRyYW5zZm9ybURpcmVjdGlvbiggaW4gdmVjMyBkaXIsIGluIG1hdDQgbWF0cml4ICkgeyIsCgogICAgCQkJIglyZXR1cm4gbm9ybWFsaXplKCAoIG1hdHJpeCAqIHZlYzQoIGRpciwgMC4wICkgKS54eXogKTsiLAoKICAgIAkJCSJ9IiwKCiAgICAJCQkidm9pZCBtYWluKCkgeyIsCgogICAgCQkJIgl2V29ybGREaXJlY3Rpb24gPSB0cmFuc2Zvcm1EaXJlY3Rpb24oIHBvc2l0aW9uLCBtb2RlbE1hdHJpeCApOyIsCgogICAgCQkJIgkjaW5jbHVkZSA8YmVnaW5fdmVydGV4PiIsCiAgICAJCQkiCSNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD4iLAoKICAgIAkJCSJ9IgoKICAgIAkJXS5qb2luKCAnXG4nICksCgogICAgCQlmcmFnbWVudFNoYWRlcjogWwoKICAgIAkJCSJ1bmlmb3JtIHNhbXBsZXIyRCB0RXF1aXJlY3Q7IiwKCiAgICAJCQkidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjsiLAoKICAgIAkJCSIjZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYxOCIsCiAgICAJCQkiI2RlZmluZSBSRUNJUFJPQ0FMX1BJMiAwLjE1OTE1NDk0IiwKCiAgICAJCQkidm9pZCBtYWluKCkgeyIsCgogICAgCQkJIgl2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7IiwKCiAgICAJCQkiCXZlYzIgc2FtcGxlVVY7IiwKCiAgICAJCQkiCXNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTsiLAoKICAgIAkJCSIJc2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7IiwKCiAgICAJCQkiCWdsX0ZyYWdDb2xvciA9IHRleHR1cmUyRCggdEVxdWlyZWN0LCBzYW1wbGVVViApOyIsCgogICAgCQkJIn0iCgogICAgCQldLmpvaW4oICdcbicgKSwKICAgIAl9OwoKICAgIAl2YXIgbWF0ZXJpYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHsKCiAgICAJCXR5cGU6ICdDdWJlbWFwRnJvbUVxdWlyZWN0JywKCiAgICAJCXVuaWZvcm1zOiBjbG9uZVVuaWZvcm1zKCBzaGFkZXIudW5pZm9ybXMgKSwKICAgIAkJdmVydGV4U2hhZGVyOiBzaGFkZXIudmVydGV4U2hhZGVyLAogICAgCQlmcmFnbWVudFNoYWRlcjogc2hhZGVyLmZyYWdtZW50U2hhZGVyLAogICAgCQlzaWRlOiBCYWNrU2lkZSwKICAgIAkJYmxlbmRpbmc6IE5vQmxlbmRpbmcKCiAgICAJfSApOwoKICAgIAltYXRlcmlhbC51bmlmb3Jtcy50RXF1aXJlY3QudmFsdWUgPSB0ZXh0dXJlOwoKICAgIAl2YXIgbWVzaCA9IG5ldyBNZXNoKCBuZXcgQm94QnVmZmVyR2VvbWV0cnkoIDUsIDUsIDUgKSwgbWF0ZXJpYWwgKTsKCiAgICAJc2NlbmUuYWRkKCBtZXNoICk7CgogICAgCXZhciBjYW1lcmEgPSBuZXcgQ3ViZUNhbWVyYSggMSwgMTAsIDEgKTsKCiAgICAJY2FtZXJhLnJlbmRlclRhcmdldCA9IHRoaXM7CiAgICAJY2FtZXJhLnJlbmRlclRhcmdldC50ZXh0dXJlLm5hbWUgPSAnQ3ViZUNhbWVyYVRleHR1cmUnOwoKICAgIAljYW1lcmEudXBkYXRlKCByZW5kZXJlciwgc2NlbmUgKTsKCiAgICAJbWVzaC5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAJbWVzaC5tYXRlcmlhbC5kaXNwb3NlKCk7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gRGF0YVRleHR1cmUoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7CgogICAgCVRleHR1cmUuY2FsbCggdGhpcywgbnVsbCwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5LCBlbmNvZGluZyApOwoKICAgIAl0aGlzLmltYWdlID0geyBkYXRhOiBkYXRhLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0IH07CgogICAgCXRoaXMubWFnRmlsdGVyID0gbWFnRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtYWdGaWx0ZXIgOiBOZWFyZXN0RmlsdGVyOwogICAgCXRoaXMubWluRmlsdGVyID0gbWluRmlsdGVyICE9PSB1bmRlZmluZWQgPyBtaW5GaWx0ZXIgOiBOZWFyZXN0RmlsdGVyOwoKICAgIAl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgCXRoaXMuZmxpcFkgPSBmYWxzZTsKICAgIAl0aGlzLnVucGFja0FsaWdubWVudCA9IDE7CgogICAgfQoKICAgIERhdGFUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CiAgICBEYXRhVGV4dHVyZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBEYXRhVGV4dHVyZTsKCiAgICBEYXRhVGV4dHVyZS5wcm90b3R5cGUuaXNEYXRhVGV4dHVyZSA9IHRydWU7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCiAgICAgKi8KCiAgICB2YXIgX3ZlY3RvcjEgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF92ZWN0b3IyID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbm9ybWFsTWF0cml4ID0gbmV3IE1hdHJpeDMoKTsKCiAgICBmdW5jdGlvbiBQbGFuZSggbm9ybWFsLCBjb25zdGFudCApIHsKCiAgICAJLy8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAoKICAgIAl0aGlzLm5vcm1hbCA9ICggbm9ybWFsICE9PSB1bmRlZmluZWQgKSA/IG5vcm1hbCA6IG5ldyBWZWN0b3IzKCAxLCAwLCAwICk7CiAgICAJdGhpcy5jb25zdGFudCA9ICggY29uc3RhbnQgIT09IHVuZGVmaW5lZCApID8gY29uc3RhbnQgOiAwOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBQbGFuZS5wcm90b3R5cGUsIHsKCiAgICAJaXNQbGFuZTogdHJ1ZSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIG5vcm1hbCwgY29uc3RhbnQgKSB7CgogICAgCQl0aGlzLm5vcm1hbC5jb3B5KCBub3JtYWwgKTsKICAgIAkJdGhpcy5jb25zdGFudCA9IGNvbnN0YW50OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldENvbXBvbmVudHM6IGZ1bmN0aW9uICggeCwgeSwgeiwgdyApIHsKCiAgICAJCXRoaXMubm9ybWFsLnNldCggeCwgeSwgeiApOwogICAgCQl0aGlzLmNvbnN0YW50ID0gdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tTm9ybWFsQW5kQ29wbGFuYXJQb2ludDogZnVuY3Rpb24gKCBub3JtYWwsIHBvaW50ICkgewoKICAgIAkJdGhpcy5ub3JtYWwuY29weSggbm9ybWFsICk7CiAgICAJCXRoaXMuY29uc3RhbnQgPSAtIHBvaW50LmRvdCggdGhpcy5ub3JtYWwgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tQ29wbGFuYXJQb2ludHM6IGZ1bmN0aW9uICggYSwgYiwgYyApIHsKCiAgICAJCXZhciBub3JtYWwgPSBfdmVjdG9yMS5zdWJWZWN0b3JzKCBjLCBiICkuY3Jvc3MoIF92ZWN0b3IyLnN1YlZlY3RvcnMoIGEsIGIgKSApLm5vcm1hbGl6ZSgpOwoKICAgIAkJLy8gUTogc2hvdWxkIGFuIGVycm9yIGJlIHRocm93biBpZiBub3JtYWwgaXMgemVybyAoZS5nLiBkZWdlbmVyYXRlIHBsYW5lKT8KCiAgICAJCXRoaXMuc2V0RnJvbU5vcm1hbEFuZENvcGxhbmFyUG9pbnQoIG5vcm1hbCwgYSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggcGxhbmUgKSB7CgogICAgCQl0aGlzLm5vcm1hbC5jb3B5KCBwbGFuZS5ub3JtYWwgKTsKICAgIAkJdGhpcy5jb25zdGFudCA9IHBsYW5lLmNvbnN0YW50OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCW5vcm1hbGl6ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJLy8gTm90ZTogd2lsbCBsZWFkIHRvIGEgZGl2aWRlIGJ5IHplcm8gaWYgdGhlIHBsYW5lIGlzIGludmFsaWQuCgogICAgCQl2YXIgaW52ZXJzZU5vcm1hbExlbmd0aCA9IDEuMCAvIHRoaXMubm9ybWFsLmxlbmd0aCgpOwogICAgCQl0aGlzLm5vcm1hbC5tdWx0aXBseVNjYWxhciggaW52ZXJzZU5vcm1hbExlbmd0aCApOwogICAgCQl0aGlzLmNvbnN0YW50ICo9IGludmVyc2VOb3JtYWxMZW5ndGg7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbmVnYXRlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmNvbnN0YW50ICo9IC0gMTsKICAgIAkJdGhpcy5ub3JtYWwubmVnYXRlKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZGlzdGFuY2VUb1BvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKICAgIAkJcmV0dXJuIHRoaXMubm9ybWFsLmRvdCggcG9pbnQgKSArIHRoaXMuY29uc3RhbnQ7CgogICAgCX0sCgogICAgCWRpc3RhbmNlVG9TcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBzcGhlcmUuY2VudGVyICkgLSBzcGhlcmUucmFkaXVzOwoKICAgIAl9LAoKICAgIAlwcm9qZWN0UG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUGxhbmU6IC5wcm9qZWN0UG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0YXJnZXQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggcG9pbnQgKSApLmFkZCggcG9pbnQgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0TGluZTogZnVuY3Rpb24gKCBsaW5lLCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaW50ZXJzZWN0TGluZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJfQoKICAgIAkJdmFyIGRpcmVjdGlvbiA9IGxpbmUuZGVsdGEoIF92ZWN0b3IxICk7CgogICAgCQl2YXIgZGVub21pbmF0b3IgPSB0aGlzLm5vcm1hbC5kb3QoIGRpcmVjdGlvbiApOwoKICAgIAkJaWYgKCBkZW5vbWluYXRvciA9PT0gMCApIHsKCiAgICAJCQkvLyBsaW5lIGlzIGNvcGxhbmFyLCByZXR1cm4gb3JpZ2luCiAgICAJCQlpZiAoIHRoaXMuZGlzdGFuY2VUb1BvaW50KCBsaW5lLnN0YXJ0ICkgPT09IDAgKSB7CgogICAgCQkJCXJldHVybiB0YXJnZXQuY29weSggbGluZS5zdGFydCApOwoKICAgIAkJCX0KCiAgICAJCQkvLyBVbnN1cmUgaWYgdGhpcyBpcyB0aGUgY29ycmVjdCBtZXRob2QgdG8gaGFuZGxlIHRoaXMgY2FzZS4KICAgIAkJCXJldHVybiB1bmRlZmluZWQ7CgogICAgCQl9CgogICAgCQl2YXIgdCA9IC0gKCBsaW5lLnN0YXJ0LmRvdCggdGhpcy5ub3JtYWwgKSArIHRoaXMuY29uc3RhbnQgKSAvIGRlbm9taW5hdG9yOwoKICAgIAkJaWYgKCB0IDwgMCB8fCB0ID4gMSApIHsKCiAgICAJCQlyZXR1cm4gdW5kZWZpbmVkOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5jb3B5KCBkaXJlY3Rpb24gKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggbGluZS5zdGFydCApOwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RzTGluZTogZnVuY3Rpb24gKCBsaW5lICkgewoKICAgIAkJLy8gTm90ZTogdGhpcyB0ZXN0cyBpZiBhIGxpbmUgaW50ZXJzZWN0cyB0aGUgcGxhbmUsIG5vdCB3aGV0aGVyIGl0IChvciBpdHMgZW5kLXBvaW50cykgYXJlIGNvcGxhbmFyIHdpdGggaXQuCgogICAgCQl2YXIgc3RhcnRTaWduID0gdGhpcy5kaXN0YW5jZVRvUG9pbnQoIGxpbmUuc3RhcnQgKTsKICAgIAkJdmFyIGVuZFNpZ24gPSB0aGlzLmRpc3RhbmNlVG9Qb2ludCggbGluZS5lbmQgKTsKCiAgICAJCXJldHVybiAoIHN0YXJ0U2lnbiA8IDAgJiYgZW5kU2lnbiA+IDAgKSB8fCAoIGVuZFNpZ24gPCAwICYmIHN0YXJ0U2lnbiA+IDAgKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7CgogICAgCQlyZXR1cm4gYm94LmludGVyc2VjdHNQbGFuZSggdGhpcyApOwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RzU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCiAgICAJCXJldHVybiBzcGhlcmUuaW50ZXJzZWN0c1BsYW5lKCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcGxhbmFyUG9pbnQ6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5QbGFuZTogLmNvcGxhbmFyUG9pbnQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0YXJnZXQuY29weSggdGhpcy5ub3JtYWwgKS5tdWx0aXBseVNjYWxhciggLSB0aGlzLmNvbnN0YW50ICk7CgogICAgCX0sCgogICAgCWFwcGx5TWF0cml4NDogZnVuY3Rpb24gKCBtYXRyaXgsIG9wdGlvbmFsTm9ybWFsTWF0cml4ICkgewoKICAgIAkJdmFyIG5vcm1hbE1hdHJpeCA9IG9wdGlvbmFsTm9ybWFsTWF0cml4IHx8IF9ub3JtYWxNYXRyaXguZ2V0Tm9ybWFsTWF0cml4KCBtYXRyaXggKTsKCiAgICAJCXZhciByZWZlcmVuY2VQb2ludCA9IHRoaXMuY29wbGFuYXJQb2ludCggX3ZlY3RvcjEgKS5hcHBseU1hdHJpeDQoIG1hdHJpeCApOwoKICAgIAkJdmFyIG5vcm1hbCA9IHRoaXMubm9ybWFsLmFwcGx5TWF0cml4Myggbm9ybWFsTWF0cml4ICkubm9ybWFsaXplKCk7CgogICAgCQl0aGlzLmNvbnN0YW50ID0gLSByZWZlcmVuY2VQb2ludC5kb3QoIG5vcm1hbCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCBvZmZzZXQgKSB7CgogICAgCQl0aGlzLmNvbnN0YW50IC09IG9mZnNldC5kb3QoIHRoaXMubm9ybWFsICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKICAgIAkJcmV0dXJuIHBsYW5lLm5vcm1hbC5lcXVhbHMoIHRoaXMubm9ybWFsICkgJiYgKCBwbGFuZS5jb25zdGFudCA9PT0gdGhpcy5jb25zdGFudCApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvCiAgICAgKi8KCiAgICB2YXIgX3NwaGVyZSQxID0gbmV3IFNwaGVyZSgpOwogICAgdmFyIF92ZWN0b3IkNSA9IG5ldyBWZWN0b3IzKCk7CgogICAgZnVuY3Rpb24gRnJ1c3R1bSggcDAsIHAxLCBwMiwgcDMsIHA0LCBwNSApIHsKCiAgICAJdGhpcy5wbGFuZXMgPSBbCgogICAgCQkoIHAwICE9PSB1bmRlZmluZWQgKSA/IHAwIDogbmV3IFBsYW5lKCksCiAgICAJCSggcDEgIT09IHVuZGVmaW5lZCApID8gcDEgOiBuZXcgUGxhbmUoKSwKICAgIAkJKCBwMiAhPT0gdW5kZWZpbmVkICkgPyBwMiA6IG5ldyBQbGFuZSgpLAogICAgCQkoIHAzICE9PSB1bmRlZmluZWQgKSA/IHAzIDogbmV3IFBsYW5lKCksCiAgICAJCSggcDQgIT09IHVuZGVmaW5lZCApID8gcDQgOiBuZXcgUGxhbmUoKSwKICAgIAkJKCBwNSAhPT0gdW5kZWZpbmVkICkgPyBwNSA6IG5ldyBQbGFuZSgpCgogICAgCV07CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIEZydXN0dW0ucHJvdG90eXBlLCB7CgogICAgCXNldDogZnVuY3Rpb24gKCBwMCwgcDEsIHAyLCBwMywgcDQsIHA1ICkgewoKICAgIAkJdmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOwoKICAgIAkJcGxhbmVzWyAwIF0uY29weSggcDAgKTsKICAgIAkJcGxhbmVzWyAxIF0uY29weSggcDEgKTsKICAgIAkJcGxhbmVzWyAyIF0uY29weSggcDIgKTsKICAgIAkJcGxhbmVzWyAzIF0uY29weSggcDMgKTsKICAgIAkJcGxhbmVzWyA0IF0uY29weSggcDQgKTsKICAgIAkJcGxhbmVzWyA1IF0uY29weSggcDUgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIGZydXN0dW0gKSB7CgogICAgCQl2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCXBsYW5lc1sgaSBdLmNvcHkoIGZydXN0dW0ucGxhbmVzWyBpIF0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRGcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQl2YXIgcGxhbmVzID0gdGhpcy5wbGFuZXM7CiAgICAJCXZhciBtZSA9IG0uZWxlbWVudHM7CiAgICAJCXZhciBtZTAgPSBtZVsgMCBdLCBtZTEgPSBtZVsgMSBdLCBtZTIgPSBtZVsgMiBdLCBtZTMgPSBtZVsgMyBdOwogICAgCQl2YXIgbWU0ID0gbWVbIDQgXSwgbWU1ID0gbWVbIDUgXSwgbWU2ID0gbWVbIDYgXSwgbWU3ID0gbWVbIDcgXTsKICAgIAkJdmFyIG1lOCA9IG1lWyA4IF0sIG1lOSA9IG1lWyA5IF0sIG1lMTAgPSBtZVsgMTAgXSwgbWUxMSA9IG1lWyAxMSBdOwogICAgCQl2YXIgbWUxMiA9IG1lWyAxMiBdLCBtZTEzID0gbWVbIDEzIF0sIG1lMTQgPSBtZVsgMTQgXSwgbWUxNSA9IG1lWyAxNSBdOwoKICAgIAkJcGxhbmVzWyAwIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUwLCBtZTcgLSBtZTQsIG1lMTEgLSBtZTgsIG1lMTUgLSBtZTEyICkubm9ybWFsaXplKCk7CiAgICAJCXBsYW5lc1sgMSBdLnNldENvbXBvbmVudHMoIG1lMyArIG1lMCwgbWU3ICsgbWU0LCBtZTExICsgbWU4LCBtZTE1ICsgbWUxMiApLm5vcm1hbGl6ZSgpOwogICAgCQlwbGFuZXNbIDIgXS5zZXRDb21wb25lbnRzKCBtZTMgKyBtZTEsIG1lNyArIG1lNSwgbWUxMSArIG1lOSwgbWUxNSArIG1lMTMgKS5ub3JtYWxpemUoKTsKICAgIAkJcGxhbmVzWyAzIF0uc2V0Q29tcG9uZW50cyggbWUzIC0gbWUxLCBtZTcgLSBtZTUsIG1lMTEgLSBtZTksIG1lMTUgLSBtZTEzICkubm9ybWFsaXplKCk7CiAgICAJCXBsYW5lc1sgNCBdLnNldENvbXBvbmVudHMoIG1lMyAtIG1lMiwgbWU3IC0gbWU2LCBtZTExIC0gbWUxMCwgbWUxNSAtIG1lMTQgKS5ub3JtYWxpemUoKTsKICAgIAkJcGxhbmVzWyA1IF0uc2V0Q29tcG9uZW50cyggbWUzICsgbWUyLCBtZTcgKyBtZTYsIG1lMTEgKyBtZTEwLCBtZTE1ICsgbWUxNCApLm5vcm1hbGl6ZSgpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWludGVyc2VjdHNPYmplY3Q6IGZ1bmN0aW9uICggb2JqZWN0ICkgewoKICAgIAkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0Lmdlb21ldHJ5OwoKICAgIAkJaWYgKCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSA9PT0gbnVsbCApIGdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKICAgIAkJX3NwaGVyZSQxLmNvcHkoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlICkuYXBwbHlNYXRyaXg0KCBvYmplY3QubWF0cml4V29ybGQgKTsKCiAgICAJCXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIF9zcGhlcmUkMSApOwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RzU3ByaXRlOiBmdW5jdGlvbiAoIHNwcml0ZSApIHsKCiAgICAJCV9zcGhlcmUkMS5jZW50ZXIuc2V0KCAwLCAwLCAwICk7CiAgICAJCV9zcGhlcmUkMS5yYWRpdXMgPSAwLjcwNzEwNjc4MTE4NjU0NzY7CiAgICAJCV9zcGhlcmUkMS5hcHBseU1hdHJpeDQoIHNwcml0ZS5tYXRyaXhXb3JsZCApOwoKICAgIAkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSQxICk7CgogICAgCX0sCgogICAgCWludGVyc2VjdHNTcGhlcmU6IGZ1bmN0aW9uICggc3BoZXJlICkgewoKICAgIAkJdmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOwogICAgCQl2YXIgY2VudGVyID0gc3BoZXJlLmNlbnRlcjsKICAgIAkJdmFyIG5lZ1JhZGl1cyA9IC0gc3BoZXJlLnJhZGl1czsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgogICAgCQkJdmFyIGRpc3RhbmNlID0gcGxhbmVzWyBpIF0uZGlzdGFuY2VUb1BvaW50KCBjZW50ZXIgKTsKCiAgICAJCQlpZiAoIGRpc3RhbmNlIDwgbmVnUmFkaXVzICkgewoKICAgIAkJCQlyZXR1cm4gZmFsc2U7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRydWU7CgogICAgCX0sCgogICAgCWludGVyc2VjdHNCb3g6IGZ1bmN0aW9uICggYm94ICkgewoKICAgIAkJdmFyIHBsYW5lcyA9IHRoaXMucGxhbmVzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKCiAgICAJCQl2YXIgcGxhbmUgPSBwbGFuZXNbIGkgXTsKCiAgICAJCQkvLyBjb3JuZXIgYXQgbWF4IGRpc3RhbmNlCgogICAgCQkJX3ZlY3RvciQ1LnggPSBwbGFuZS5ub3JtYWwueCA+IDAgPyBib3gubWF4LnggOiBib3gubWluLng7CiAgICAJCQlfdmVjdG9yJDUueSA9IHBsYW5lLm5vcm1hbC55ID4gMCA/IGJveC5tYXgueSA6IGJveC5taW4ueTsKICAgIAkJCV92ZWN0b3IkNS56ID0gcGxhbmUubm9ybWFsLnogPiAwID8gYm94Lm1heC56IDogYm94Lm1pbi56OwoKICAgIAkJCWlmICggcGxhbmUuZGlzdGFuY2VUb1BvaW50KCBfdmVjdG9yJDUgKSA8IDAgKSB7CgogICAgCQkJCXJldHVybiBmYWxzZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gdHJ1ZTsKCiAgICAJfSwKCiAgICAJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCiAgICAJCXZhciBwbGFuZXMgPSB0aGlzLnBsYW5lczsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDY7IGkgKysgKSB7CgogICAgCQkJaWYgKCBwbGFuZXNbIGkgXS5kaXN0YW5jZVRvUG9pbnQoIHBvaW50ICkgPCAwICkgewoKICAgIAkJCQlyZXR1cm4gZmFsc2U7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRydWU7CgogICAgCX0KCiAgICB9ICk7CgogICAgdmFyIGFscGhhbWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQUxQSEFNQVBcblx0ZGlmZnVzZUNvbG9yLmEgKj0gdGV4dHVyZTJEKCBhbHBoYU1hcCwgdlV2ICkuZztcbiNlbmRpZiI7CgogICAgdmFyIGFscGhhbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9BTFBIQU1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhbHBoYU1hcDtcbiNlbmRpZiI7CgogICAgdmFyIGFscGhhdGVzdF9mcmFnbWVudCA9ICIjaWZkZWYgQUxQSEFURVNUXG5cdGlmICggZGlmZnVzZUNvbG9yLmEgPCBBTFBIQVRFU1QgKSBkaXNjYXJkO1xuI2VuZGlmIjsKCiAgICB2YXIgYW9tYXBfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9BT01BUFxuXHRmbG9hdCBhbWJpZW50T2NjbHVzaW9uID0gKCB0ZXh0dXJlMkQoIGFvTWFwLCB2VXYyICkuciAtIDEuMCApICogYW9NYXBJbnRlbnNpdHkgKyAxLjA7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBhbWJpZW50T2NjbHVzaW9uO1xuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEIClcblx0XHRmbG9hdCBkb3ROViA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZ2VvbWV0cnkudmlld0RpciApICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3RTcGVjdWxhciAqPSBjb21wdXRlU3BlY3VsYXJPY2NsdXNpb24oIGRvdE5WLCBhbWJpZW50T2NjbHVzaW9uLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyApO1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIGFvbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9BT01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBhb01hcDtcblx0dW5pZm9ybSBmbG9hdCBhb01hcEludGVuc2l0eTtcbiNlbmRpZiI7CgogICAgdmFyIGJlZ2luX3ZlcnRleCA9ICJ2ZWMzIHRyYW5zZm9ybWVkID0gdmVjMyggcG9zaXRpb24gKTsiOwoKICAgIHZhciBiZWdpbm5vcm1hbF92ZXJ0ZXggPSAidmVjMyBvYmplY3ROb3JtYWwgPSB2ZWMzKCBub3JtYWwgKTtcbiNpZmRlZiBVU0VfVEFOR0VOVFxuXHR2ZWMzIG9iamVjdFRhbmdlbnQgPSB2ZWMzKCB0YW5nZW50Lnh5eiApO1xuI2VuZGlmIjsKCiAgICB2YXIgYnNkZnMgPSAidmVjMiBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGNvbnN0IGluIGZsb2F0IGRvdE5WLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IHZlYzQgYzAgPSB2ZWM0KCAtIDEsIC0gMC4wMjc1LCAtIDAuNTcyLCAwLjAyMiApO1xuXHRjb25zdCB2ZWM0IGMxID0gdmVjNCggMSwgMC4wNDI1LCAxLjA0LCAtIDAuMDQgKTtcblx0dmVjNCByID0gcm91Z2huZXNzICogYzAgKyBjMTtcblx0ZmxvYXQgYTAwNCA9IG1pbiggci54ICogci54LCBleHAyKCAtIDkuMjggKiBkb3ROViApICkgKiByLnggKyByLnk7XG5cdHJldHVybiB2ZWMyKCAtMS4wNCwgMS4wNCApICogYTAwNCArIHIuenc7XG59XG5mbG9hdCBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBjb25zdCBpbiBmbG9hdCBsaWdodERpc3RhbmNlLCBjb25zdCBpbiBmbG9hdCBjdXRvZmZEaXN0YW5jZSwgY29uc3QgaW4gZmxvYXQgZGVjYXlFeHBvbmVudCApIHtcbiNpZiBkZWZpbmVkICggUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUUyApXG5cdGZsb2F0IGRpc3RhbmNlRmFsbG9mZiA9IDEuMCAvIG1heCggcG93KCBsaWdodERpc3RhbmNlLCBkZWNheUV4cG9uZW50ICksIDAuMDEgKTtcblx0aWYoIGN1dG9mZkRpc3RhbmNlID4gMC4wICkge1xuXHRcdGRpc3RhbmNlRmFsbG9mZiAqPSBwb3cyKCBzYXR1cmF0ZSggMS4wIC0gcG93NCggbGlnaHREaXN0YW5jZSAvIGN1dG9mZkRpc3RhbmNlICkgKSApO1xuXHR9XG5cdHJldHVybiBkaXN0YW5jZUZhbGxvZmY7XG4jZWxzZVxuXHRpZiggY3V0b2ZmRGlzdGFuY2UgPiAwLjAgJiYgZGVjYXlFeHBvbmVudCA+IDAuMCApIHtcblx0XHRyZXR1cm4gcG93KCBzYXR1cmF0ZSggLWxpZ2h0RGlzdGFuY2UgLyBjdXRvZmZEaXN0YW5jZSArIDEuMCApLCBkZWNheUV4cG9uZW50ICk7XG5cdH1cblx0cmV0dXJuIDEuMDtcbiNlbmRpZlxufVxudmVjMyBCUkRGX0RpZmZ1c2VfTGFtYmVydCggY29uc3QgaW4gdmVjMyBkaWZmdXNlQ29sb3IgKSB7XG5cdHJldHVybiBSRUNJUFJPQ0FMX1BJICogZGlmZnVzZUNvbG9yO1xufVxudmVjMyBGX1NjaGxpY2soIGNvbnN0IGluIHZlYzMgc3BlY3VsYXJDb2xvciwgY29uc3QgaW4gZmxvYXQgZG90TEggKSB7XG5cdGZsb2F0IGZyZXNuZWwgPSBleHAyKCAoIC01LjU1NDczICogZG90TEggLSA2Ljk4MzE2ICkgKiBkb3RMSCApO1xuXHRyZXR1cm4gKCAxLjAgLSBzcGVjdWxhckNvbG9yICkgKiBmcmVzbmVsICsgc3BlY3VsYXJDb2xvcjtcbn1cbnZlYzMgRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggY29uc3QgaW4gdmVjMyBGMCwgY29uc3QgaW4gZmxvYXQgZG90TlYsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcyApIHtcblx0ZmxvYXQgZnJlc25lbCA9IGV4cDIoICggLTUuNTU0NzMgKiBkb3ROViAtIDYuOTgzMTYgKSAqIGRvdE5WICk7XG5cdHZlYzMgRnIgPSBtYXgoIHZlYzMoIDEuMCAtIHJvdWdobmVzcyApLCBGMCApIC0gRjA7XG5cdHJldHVybiBGciAqIGZyZXNuZWwgKyBGMDtcbn1cbmZsb2F0IEdfR0dYX1NtaXRoKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkwsIGNvbnN0IGluIGZsb2F0IGRvdE5WICkge1xuXHRmbG9hdCBhMiA9IHBvdzIoIGFscGhhICk7XG5cdGZsb2F0IGdsID0gZG90TkwgKyBzcXJ0KCBhMiArICggMS4wIC0gYTIgKSAqIHBvdzIoIGRvdE5MICkgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROViArIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRyZXR1cm4gMS4wIC8gKCBnbCAqIGd2ICk7XG59XG5mbG9hdCBHX0dHWF9TbWl0aENvcnJlbGF0ZWQoIGNvbnN0IGluIGZsb2F0IGFscGhhLCBjb25zdCBpbiBmbG9hdCBkb3ROTCwgY29uc3QgaW4gZmxvYXQgZG90TlYgKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZ3YgPSBkb3ROTCAqIHNxcnQoIGEyICsgKCAxLjAgLSBhMiApICogcG93MiggZG90TlYgKSApO1xuXHRmbG9hdCBnbCA9IGRvdE5WICogc3FydCggYTIgKyAoIDEuMCAtIGEyICkgKiBwb3cyKCBkb3ROTCApICk7XG5cdHJldHVybiAwLjUgLyBtYXgoIGd2ICsgZ2wsIEVQU0lMT04gKTtcbn1cbmZsb2F0IERfR0dYKCBjb25zdCBpbiBmbG9hdCBhbHBoYSwgY29uc3QgaW4gZmxvYXQgZG90TkggKSB7XG5cdGZsb2F0IGEyID0gcG93MiggYWxwaGEgKTtcblx0ZmxvYXQgZGVub20gPSBwb3cyKCBkb3ROSCApICogKCBhMiAtIDEuMCApICsgMS4wO1xuXHRyZXR1cm4gUkVDSVBST0NBTF9QSSAqIGEyIC8gcG93MiggZGVub20gKTtcbn1cbnZlYzMgQlJERl9TcGVjdWxhcl9HR1goIGNvbnN0IGluIEluY2lkZW50TGlnaHQgaW5jaWRlbnRMaWdodCwgY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGFscGhhID0gcG93Miggcm91Z2huZXNzICk7XG5cdHZlYzMgaGFsZkRpciA9IG5vcm1hbGl6ZSggaW5jaWRlbnRMaWdodC5kaXJlY3Rpb24gKyB2aWV3RGlyICk7XG5cdGZsb2F0IGRvdE5MID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19HR1hfU21pdGhDb3JyZWxhdGVkKCBhbHBoYSwgZG90TkwsIGRvdE5WICk7XG5cdGZsb2F0IEQgPSBEX0dHWCggYWxwaGEsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxudmVjMiBMVENfVXYoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGNvbnN0IGZsb2F0IExVVF9TSVpFICA9IDY0LjA7XG5cdGNvbnN0IGZsb2F0IExVVF9TQ0FMRSA9ICggTFVUX1NJWkUgLSAxLjAgKSAvIExVVF9TSVpFO1xuXHRjb25zdCBmbG9hdCBMVVRfQklBUyAgPSAwLjUgLyBMVVRfU0laRTtcblx0ZmxvYXQgZG90TlYgPSBzYXR1cmF0ZSggZG90KCBOLCBWICkgKTtcblx0dmVjMiB1diA9IHZlYzIoIHJvdWdobmVzcywgc3FydCggMS4wIC0gZG90TlYgKSApO1xuXHR1diA9IHV2ICogTFVUX1NDQUxFICsgTFVUX0JJQVM7XG5cdHJldHVybiB1djtcbn1cbmZsb2F0IExUQ19DbGlwcGVkU3BoZXJlRm9ybUZhY3RvciggY29uc3QgaW4gdmVjMyBmICkge1xuXHRmbG9hdCBsID0gbGVuZ3RoKCBmICk7XG5cdHJldHVybiBtYXgoICggbCAqIGwgKyBmLnogKSAvICggbCArIDEuMCApLCAwLjAgKTtcbn1cbnZlYzMgTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb25zdCBpbiB2ZWMzIHYxLCBjb25zdCBpbiB2ZWMzIHYyICkge1xuXHRmbG9hdCB4ID0gZG90KCB2MSwgdjIgKTtcblx0ZmxvYXQgeSA9IGFicyggeCApO1xuXHRmbG9hdCBhID0gMC44NTQzOTg1ICsgKCAwLjQ5NjUxNTUgKyAwLjAxNDUyMDYgKiB5ICkgKiB5O1xuXHRmbG9hdCBiID0gMy40MTc1OTQwICsgKCA0LjE2MTY3MjQgKyB5ICkgKiB5O1xuXHRmbG9hdCB2ID0gYSAvIGI7XG5cdGZsb2F0IHRoZXRhX3NpbnRoZXRhID0gKCB4ID4gMC4wICkgPyB2IDogMC41ICogaW52ZXJzZXNxcnQoIG1heCggMS4wIC0geCAqIHgsIDFlLTcgKSApIC0gdjtcblx0cmV0dXJuIGNyb3NzKCB2MSwgdjIgKSAqIHRoZXRhX3NpbnRoZXRhO1xufVxudmVjMyBMVENfRXZhbHVhdGUoIGNvbnN0IGluIHZlYzMgTiwgY29uc3QgaW4gdmVjMyBWLCBjb25zdCBpbiB2ZWMzIFAsIGNvbnN0IGluIG1hdDMgbUludiwgY29uc3QgaW4gdmVjMyByZWN0Q29vcmRzWyA0IF0gKSB7XG5cdHZlYzMgdjEgPSByZWN0Q29vcmRzWyAxIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgdjIgPSByZWN0Q29vcmRzWyAzIF0gLSByZWN0Q29vcmRzWyAwIF07XG5cdHZlYzMgbGlnaHROb3JtYWwgPSBjcm9zcyggdjEsIHYyICk7XG5cdGlmKCBkb3QoIGxpZ2h0Tm9ybWFsLCBQIC0gcmVjdENvb3Jkc1sgMCBdICkgPCAwLjAgKSByZXR1cm4gdmVjMyggMC4wICk7XG5cdHZlYzMgVDEsIFQyO1xuXHRUMSA9IG5vcm1hbGl6ZSggViAtIE4gKiBkb3QoIFYsIE4gKSApO1xuXHRUMiA9IC0gY3Jvc3MoIE4sIFQxICk7XG5cdG1hdDMgbWF0ID0gbUludiAqIHRyYW5zcG9zZU1hdDMoIG1hdDMoIFQxLCBUMiwgTiApICk7XG5cdHZlYzMgY29vcmRzWyA0IF07XG5cdGNvb3Jkc1sgMCBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAwIF0gLSBQICk7XG5cdGNvb3Jkc1sgMSBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAxIF0gLSBQICk7XG5cdGNvb3Jkc1sgMiBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAyIF0gLSBQICk7XG5cdGNvb3Jkc1sgMyBdID0gbWF0ICogKCByZWN0Q29vcmRzWyAzIF0gLSBQICk7XG5cdGNvb3Jkc1sgMCBdID0gbm9ybWFsaXplKCBjb29yZHNbIDAgXSApO1xuXHRjb29yZHNbIDEgXSA9IG5vcm1hbGl6ZSggY29vcmRzWyAxIF0gKTtcblx0Y29vcmRzWyAyIF0gPSBub3JtYWxpemUoIGNvb3Jkc1sgMiBdICk7XG5cdGNvb3Jkc1sgMyBdID0gbm9ybWFsaXplKCBjb29yZHNbIDMgXSApO1xuXHR2ZWMzIHZlY3RvckZvcm1GYWN0b3IgPSB2ZWMzKCAwLjAgKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMCBdLCBjb29yZHNbIDEgXSApO1xuXHR2ZWN0b3JGb3JtRmFjdG9yICs9IExUQ19FZGdlVmVjdG9yRm9ybUZhY3RvciggY29vcmRzWyAxIF0sIGNvb3Jkc1sgMiBdICk7XG5cdHZlY3RvckZvcm1GYWN0b3IgKz0gTFRDX0VkZ2VWZWN0b3JGb3JtRmFjdG9yKCBjb29yZHNbIDIgXSwgY29vcmRzWyAzIF0gKTtcblx0dmVjdG9yRm9ybUZhY3RvciArPSBMVENfRWRnZVZlY3RvckZvcm1GYWN0b3IoIGNvb3Jkc1sgMyBdLCBjb29yZHNbIDAgXSApO1xuXHRmbG9hdCByZXN1bHQgPSBMVENfQ2xpcHBlZFNwaGVyZUZvcm1GYWN0b3IoIHZlY3RvckZvcm1GYWN0b3IgKTtcblx0cmV0dXJuIHZlYzMoIHJlc3VsdCApO1xufVxudmVjMyBCUkRGX1NwZWN1bGFyX0dHWF9FbnZpcm9ubWVudCggY29uc3QgaW4gdmVjMyB2aWV3RGlyLCBjb25zdCBpbiB2ZWMzIG5vcm1hbCwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggbm9ybWFsLCB2aWV3RGlyICkgKTtcblx0dmVjMiBicmRmID0gaW50ZWdyYXRlU3BlY3VsYXJCUkRGKCBkb3ROViwgcm91Z2huZXNzICk7XG5cdHJldHVybiBzcGVjdWxhckNvbG9yICogYnJkZi54ICsgYnJkZi55O1xufVxudm9pZCBCUkRGX1NwZWN1bGFyX011bHRpc2NhdHRlcmluZ19FbnZpcm9ubWVudCggY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gdmVjMyBzcGVjdWxhckNvbG9yLCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGlub3V0IHZlYzMgc2luZ2xlU2NhdHRlciwgaW5vdXQgdmVjMyBtdWx0aVNjYXR0ZXIgKSB7XG5cdGZsb2F0IGRvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkubm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrX1JvdWdobmVzc0RlcGVuZGVudCggc3BlY3VsYXJDb2xvciwgZG90TlYsIHJvdWdobmVzcyApO1xuXHR2ZWMyIGJyZGYgPSBpbnRlZ3JhdGVTcGVjdWxhckJSREYoIGRvdE5WLCByb3VnaG5lc3MgKTtcblx0dmVjMyBGc3NFc3MgPSBGICogYnJkZi54ICsgYnJkZi55O1xuXHRmbG9hdCBFc3MgPSBicmRmLnggKyBicmRmLnk7XG5cdGZsb2F0IEVtcyA9IDEuMCAtIEVzcztcblx0dmVjMyBGYXZnID0gc3BlY3VsYXJDb2xvciArICggMS4wIC0gc3BlY3VsYXJDb2xvciApICogMC4wNDc2MTk7XHR2ZWMzIEZtcyA9IEZzc0VzcyAqIEZhdmcgLyAoIDEuMCAtIEVtcyAqIEZhdmcgKTtcblx0c2luZ2xlU2NhdHRlciArPSBGc3NFc3M7XG5cdG11bHRpU2NhdHRlciArPSBGbXMgKiBFbXM7XG59XG5mbG9hdCBHX0JsaW5uUGhvbmdfSW1wbGljaXQoICkge1xuXHRyZXR1cm4gMC4yNTtcbn1cbmZsb2F0IERfQmxpbm5QaG9uZyggY29uc3QgaW4gZmxvYXQgc2hpbmluZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROSCApIHtcblx0cmV0dXJuIFJFQ0lQUk9DQUxfUEkgKiAoIHNoaW5pbmVzcyAqIDAuNSArIDEuMCApICogcG93KCBkb3ROSCwgc2hpbmluZXNzICk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfQmxpbm5QaG9uZyggY29uc3QgaW4gSW5jaWRlbnRMaWdodCBpbmNpZGVudExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBjb25zdCBpbiB2ZWMzIHNwZWN1bGFyQ29sb3IsIGNvbnN0IGluIGZsb2F0IHNoaW5pbmVzcyApIHtcblx0dmVjMyBoYWxmRGlyID0gbm9ybWFsaXplKCBpbmNpZGVudExpZ2h0LmRpcmVjdGlvbiArIGdlb21ldHJ5LnZpZXdEaXIgKTtcblx0ZmxvYXQgZG90TkggPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhhbGZEaXIgKSApO1xuXHRmbG9hdCBkb3RMSCA9IHNhdHVyYXRlKCBkb3QoIGluY2lkZW50TGlnaHQuZGlyZWN0aW9uLCBoYWxmRGlyICkgKTtcblx0dmVjMyBGID0gRl9TY2hsaWNrKCBzcGVjdWxhckNvbG9yLCBkb3RMSCApO1xuXHRmbG9hdCBHID0gR19CbGlublBob25nX0ltcGxpY2l0KCApO1xuXHRmbG9hdCBEID0gRF9CbGlublBob25nKCBzaGluaW5lc3MsIGRvdE5IICk7XG5cdHJldHVybiBGICogKCBHICogRCApO1xufVxuZmxvYXQgR0dYUm91Z2huZXNzVG9CbGlubkV4cG9uZW50KCBjb25zdCBpbiBmbG9hdCBnZ3hSb3VnaG5lc3MgKSB7XG5cdHJldHVybiAoIDIuMCAvIHBvdzIoIGdneFJvdWdobmVzcyArIDAuMDAwMSApIC0gMi4wICk7XG59XG5mbG9hdCBCbGlubkV4cG9uZW50VG9HR1hSb3VnaG5lc3MoIGNvbnN0IGluIGZsb2F0IGJsaW5uRXhwb25lbnQgKSB7XG5cdHJldHVybiBzcXJ0KCAyLjAgLyAoIGJsaW5uRXhwb25lbnQgKyAyLjAgKSApO1xufVxuI2lmIGRlZmluZWQoIFVTRV9TSEVFTiApXG5mbG9hdCBEX0NoYXJsaWUoZmxvYXQgcm91Z2huZXNzLCBmbG9hdCBOb0gpIHtcblx0ZmxvYXQgaW52QWxwaGEgID0gMS4wIC8gcm91Z2huZXNzO1xuXHRmbG9hdCBjb3MyaCA9IE5vSCAqIE5vSDtcblx0ZmxvYXQgc2luMmggPSBtYXgoMS4wIC0gY29zMmgsIDAuMDA3ODEyNSk7XHRyZXR1cm4gKDIuMCArIGludkFscGhhKSAqIHBvdyhzaW4yaCwgaW52QWxwaGEgKiAwLjUpIC8gKDIuMCAqIFBJKTtcbn1cbmZsb2F0IFZfTmV1YmVsdChmbG9hdCBOb1YsIGZsb2F0IE5vTCkge1xuXHRyZXR1cm4gc2F0dXJhdGUoMS4wIC8gKDQuMCAqIChOb0wgKyBOb1YgLSBOb0wgKiBOb1YpKSk7XG59XG52ZWMzIEJSREZfU3BlY3VsYXJfU2hlZW4oIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gdmVjMyBMLCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCB2ZWMzIHNwZWN1bGFyQ29sb3IgKSB7XG5cdHZlYzMgTiA9IGdlb21ldHJ5Lm5vcm1hbDtcblx0dmVjMyBWID0gZ2VvbWV0cnkudmlld0Rpcjtcblx0dmVjMyBIID0gbm9ybWFsaXplKCBWICsgTCApO1xuXHRmbG9hdCBkb3ROSCA9IHNhdHVyYXRlKCBkb3QoIE4sIEggKSApO1xuXHRyZXR1cm4gc3BlY3VsYXJDb2xvciAqIERfQ2hhcmxpZSggcm91Z2huZXNzLCBkb3ROSCApICogVl9OZXViZWx0KCBkb3QoTiwgViksIGRvdChOLCBMKSApO1xufVxuI2VuZGlmIjsKCiAgICB2YXIgYnVtcG1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfQlVNUE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBidW1wTWFwO1xuXHR1bmlmb3JtIGZsb2F0IGJ1bXBTY2FsZTtcblx0dmVjMiBkSGR4eV9md2QoKSB7XG5cdFx0dmVjMiBkU1RkeCA9IGRGZHgoIHZVdiApO1xuXHRcdHZlYzIgZFNUZHkgPSBkRmR5KCB2VXYgKTtcblx0XHRmbG9hdCBIbGwgPSBidW1wU2NhbGUgKiB0ZXh0dXJlMkQoIGJ1bXBNYXAsIHZVdiApLng7XG5cdFx0ZmxvYXQgZEJ4ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeCApLnggLSBIbGw7XG5cdFx0ZmxvYXQgZEJ5ID0gYnVtcFNjYWxlICogdGV4dHVyZTJEKCBidW1wTWFwLCB2VXYgKyBkU1RkeSApLnggLSBIbGw7XG5cdFx0cmV0dXJuIHZlYzIoIGRCeCwgZEJ5ICk7XG5cdH1cblx0dmVjMyBwZXJ0dXJiTm9ybWFsQXJiKCB2ZWMzIHN1cmZfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBkSGR4eSApIHtcblx0XHR2ZWMzIHZTaWdtYVggPSB2ZWMzKCBkRmR4KCBzdXJmX3Bvcy54ICksIGRGZHgoIHN1cmZfcG9zLnkgKSwgZEZkeCggc3VyZl9wb3MueiApICk7XG5cdFx0dmVjMyB2U2lnbWFZID0gdmVjMyggZEZkeSggc3VyZl9wb3MueCApLCBkRmR5KCBzdXJmX3Bvcy55ICksIGRGZHkoIHN1cmZfcG9zLnogKSApO1xuXHRcdHZlYzMgdk4gPSBzdXJmX25vcm07XG5cdFx0dmVjMyBSMSA9IGNyb3NzKCB2U2lnbWFZLCB2TiApO1xuXHRcdHZlYzMgUjIgPSBjcm9zcyggdk4sIHZTaWdtYVggKTtcblx0XHRmbG9hdCBmRGV0ID0gZG90KCB2U2lnbWFYLCBSMSApO1xuXHRcdGZEZXQgKj0gKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdHZlYzMgdkdyYWQgPSBzaWduKCBmRGV0ICkgKiAoIGRIZHh5LnggKiBSMSArIGRIZHh5LnkgKiBSMiApO1xuXHRcdHJldHVybiBub3JtYWxpemUoIGFicyggZkRldCApICogc3VyZl9ub3JtIC0gdkdyYWQgKTtcblx0fVxuI2VuZGlmIjsKCiAgICB2YXIgY2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMFxuXHR2ZWM0IHBsYW5lO1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSArKyApIHtcblx0XHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0aWYgKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApIGRpc2NhcmQ7XG5cdH1cblx0I2lmIFVOSU9OX0NMSVBQSU5HX1BMQU5FUyA8IE5VTV9DTElQUElOR19QTEFORVNcblx0XHRib29sIGNsaXBwZWQgPSB0cnVlO1xuXHRcdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0XHRmb3IgKCBpbnQgaSA9IFVOSU9OX0NMSVBQSU5HX1BMQU5FUzsgaSA8IE5VTV9DTElQUElOR19QTEFORVM7IGkgKysgKSB7XG5cdFx0XHRwbGFuZSA9IGNsaXBwaW5nUGxhbmVzWyBpIF07XG5cdFx0XHRjbGlwcGVkID0gKCBkb3QoIHZWaWV3UG9zaXRpb24sIHBsYW5lLnh5eiApID4gcGxhbmUudyApICYmIGNsaXBwZWQ7XG5cdFx0fVxuXHRcdGlmICggY2xpcHBlZCApIGRpc2NhcmQ7XG5cdCNlbmRpZlxuI2VuZGlmIjsKCiAgICB2YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQgPSAiI2lmIE5VTV9DTElQUElOR19QTEFORVMgPiAwXG5cdCNpZiAhIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgISBkZWZpbmVkKCBQSE9ORyApICYmICEgZGVmaW5lZCggTUFUQ0FQIClcblx0XHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcblx0I2VuZGlmXG5cdHVuaWZvcm0gdmVjNCBjbGlwcGluZ1BsYW5lc1sgTlVNX0NMSVBQSU5HX1BMQU5FUyBdO1xuI2VuZGlmIjsKCiAgICB2YXIgY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgISBkZWZpbmVkKCBQSE9ORyApICYmICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jZW5kaWYiOwoKICAgIHZhciBjbGlwcGluZ19wbGFuZXNfdmVydGV4ID0gIiNpZiBOVU1fQ0xJUFBJTkdfUExBTkVTID4gMCAmJiAhIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgISBkZWZpbmVkKCBQSE9ORyApICYmICEgZGVmaW5lZCggTUFUQ0FQIClcblx0dlZpZXdQb3NpdGlvbiA9IC0gbXZQb3NpdGlvbi54eXo7XG4jZW5kaWYiOwoKICAgIHZhciBjb2xvcl9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdGRpZmZ1c2VDb2xvci5yZ2IgKj0gdkNvbG9yO1xuI2VuZGlmIjsKCiAgICB2YXIgY29sb3JfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XG4jZW5kaWYiOwoKICAgIHZhciBjb2xvcl9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0NPTE9SXG5cdHZhcnlpbmcgdmVjMyB2Q29sb3I7XG4jZW5kaWYiOwoKICAgIHZhciBjb2xvcl92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9DT0xPUlxuXHR2Q29sb3IueHl6ID0gY29sb3IueHl6O1xuI2VuZGlmIjsKCiAgICB2YXIgY29tbW9uID0gIiNkZWZpbmUgUEkgMy4xNDE1OTI2NTM1OVxuI2RlZmluZSBQSTIgNi4yODMxODUzMDcxOFxuI2RlZmluZSBQSV9IQUxGIDEuNTcwNzk2MzI2Nzk0OVxuI2RlZmluZSBSRUNJUFJPQ0FMX1BJIDAuMzE4MzA5ODg2MThcbiNkZWZpbmUgUkVDSVBST0NBTF9QSTIgMC4xNTkxNTQ5NFxuI2RlZmluZSBMT0cyIDEuNDQyNjk1XG4jZGVmaW5lIEVQU0lMT04gMWUtNlxuI2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2RlZmluZSB3aGl0ZUNvbXBsZW1lbnQoYSkgKCAxLjAgLSBzYXR1cmF0ZSggYSApIClcbmZsb2F0IHBvdzIoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4Kng7IH1cbmZsb2F0IHBvdzMoIGNvbnN0IGluIGZsb2F0IHggKSB7IHJldHVybiB4KngqeDsgfVxuZmxvYXQgcG93NCggY29uc3QgaW4gZmxvYXQgeCApIHsgZmxvYXQgeDIgPSB4Kng7IHJldHVybiB4Mip4MjsgfVxuZmxvYXQgYXZlcmFnZSggY29uc3QgaW4gdmVjMyBjb2xvciApIHsgcmV0dXJuIGRvdCggY29sb3IsIHZlYzMoIDAuMzMzMyApICk7IH1cbmhpZ2hwIGZsb2F0IHJhbmQoIGNvbnN0IGluIHZlYzIgdXYgKSB7XG5cdGNvbnN0IGhpZ2hwIGZsb2F0IGEgPSAxMi45ODk4LCBiID0gNzguMjMzLCBjID0gNDM3NTguNTQ1Mztcblx0aGlnaHAgZmxvYXQgZHQgPSBkb3QoIHV2Lnh5LCB2ZWMyKCBhLGIgKSApLCBzbiA9IG1vZCggZHQsIFBJICk7XG5cdHJldHVybiBmcmFjdChzaW4oc24pICogYyk7XG59XG4jaWZkZWYgSElHSF9QUkVDSVNJT05cblx0ZmxvYXQgcHJlY2lzaW9uU2FmZUxlbmd0aCggdmVjMyB2ICkgeyByZXR1cm4gbGVuZ3RoKCB2ICk7IH1cbiNlbHNlXG5cdGZsb2F0IG1heDMoIHZlYzMgdiApIHsgcmV0dXJuIG1heCggbWF4KCB2LngsIHYueSApLCB2LnogKTsgfVxuXHRmbG9hdCBwcmVjaXNpb25TYWZlTGVuZ3RoKCB2ZWMzIHYgKSB7XG5cdFx0ZmxvYXQgbWF4Q29tcG9uZW50ID0gbWF4MyggYWJzKCB2ICkgKTtcblx0XHRyZXR1cm4gbGVuZ3RoKCB2IC8gbWF4Q29tcG9uZW50ICkgKiBtYXhDb21wb25lbnQ7XG5cdH1cbiNlbmRpZlxuc3RydWN0IEluY2lkZW50TGlnaHQge1xuXHR2ZWMzIGNvbG9yO1xuXHR2ZWMzIGRpcmVjdGlvbjtcblx0Ym9vbCB2aXNpYmxlO1xufTtcbnN0cnVjdCBSZWZsZWN0ZWRMaWdodCB7XG5cdHZlYzMgZGlyZWN0RGlmZnVzZTtcblx0dmVjMyBkaXJlY3RTcGVjdWxhcjtcblx0dmVjMyBpbmRpcmVjdERpZmZ1c2U7XG5cdHZlYzMgaW5kaXJlY3RTcGVjdWxhcjtcbn07XG5zdHJ1Y3QgR2VvbWV0cmljQ29udGV4dCB7XG5cdHZlYzMgcG9zaXRpb247XG5cdHZlYzMgbm9ybWFsO1xuXHR2ZWMzIHZpZXdEaXI7XG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG59O1xudmVjMyB0cmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCBtYXRyaXggKiB2ZWM0KCBkaXIsIDAuMCApICkueHl6ICk7XG59XG52ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgZGlyLCBpbiBtYXQ0IG1hdHJpeCApIHtcblx0cmV0dXJuIG5vcm1hbGl6ZSggKCB2ZWM0KCBkaXIsIDAuMCApICogbWF0cml4ICkueHl6ICk7XG59XG52ZWMzIHByb2plY3RPblBsYW5lKGluIHZlYzMgcG9pbnQsIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRmbG9hdCBkaXN0YW5jZSA9IGRvdCggcGxhbmVOb3JtYWwsIHBvaW50IC0gcG9pbnRPblBsYW5lICk7XG5cdHJldHVybiAtIGRpc3RhbmNlICogcGxhbmVOb3JtYWwgKyBwb2ludDtcbn1cbmZsb2F0IHNpZGVPZlBsYW5lKCBpbiB2ZWMzIHBvaW50LCBpbiB2ZWMzIHBvaW50T25QbGFuZSwgaW4gdmVjMyBwbGFuZU5vcm1hbCApIHtcblx0cmV0dXJuIHNpZ24oIGRvdCggcG9pbnQgLSBwb2ludE9uUGxhbmUsIHBsYW5lTm9ybWFsICkgKTtcbn1cbnZlYzMgbGluZVBsYW5lSW50ZXJzZWN0KCBpbiB2ZWMzIHBvaW50T25MaW5lLCBpbiB2ZWMzIGxpbmVEaXJlY3Rpb24sIGluIHZlYzMgcG9pbnRPblBsYW5lLCBpbiB2ZWMzIHBsYW5lTm9ybWFsICkge1xuXHRyZXR1cm4gbGluZURpcmVjdGlvbiAqICggZG90KCBwbGFuZU5vcm1hbCwgcG9pbnRPblBsYW5lIC0gcG9pbnRPbkxpbmUgKSAvIGRvdCggcGxhbmVOb3JtYWwsIGxpbmVEaXJlY3Rpb24gKSApICsgcG9pbnRPbkxpbmU7XG59XG5tYXQzIHRyYW5zcG9zZU1hdDMoIGNvbnN0IGluIG1hdDMgbSApIHtcblx0bWF0MyB0bXA7XG5cdHRtcFsgMCBdID0gdmVjMyggbVsgMCBdLngsIG1bIDEgXS54LCBtWyAyIF0ueCApO1xuXHR0bXBbIDEgXSA9IHZlYzMoIG1bIDAgXS55LCBtWyAxIF0ueSwgbVsgMiBdLnkgKTtcblx0dG1wWyAyIF0gPSB2ZWMzKCBtWyAwIF0ueiwgbVsgMSBdLnosIG1bIDIgXS56ICk7XG5cdHJldHVybiB0bXA7XG59XG5mbG9hdCBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCBjb25zdCBpbiB2ZWMzIGNvbG9yICkge1xuXHR2ZWMzIHdlaWdodHMgPSB2ZWMzKCAwLjIxMjYsIDAuNzE1MiwgMC4wNzIyICk7XG5cdHJldHVybiBkb3QoIHdlaWdodHMsIGNvbG9yLnJnYiApO1xufSI7CgogICAgdmFyIGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudCA9ICIjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRV9VVlxuI2RlZmluZSBjdWJlVVZfdGV4dHVyZVNpemUgKDEwMjQuMClcbmludCBnZXRGYWNlRnJvbURpcmVjdGlvbih2ZWMzIGRpcmVjdGlvbikge1xuXHR2ZWMzIGFic0RpcmVjdGlvbiA9IGFicyhkaXJlY3Rpb24pO1xuXHRpbnQgZmFjZSA9IC0xO1xuXHRpZiggYWJzRGlyZWN0aW9uLnggPiBhYnNEaXJlY3Rpb24ueiApIHtcblx0XHRpZihhYnNEaXJlY3Rpb24ueCA+IGFic0RpcmVjdGlvbi55IClcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueCA+IDAuMCA/IDAgOiAzO1xuXHRcdGVsc2Vcblx0XHRcdGZhY2UgPSBkaXJlY3Rpb24ueSA+IDAuMCA/IDEgOiA0O1xuXHR9XG5cdGVsc2Uge1xuXHRcdGlmKGFic0RpcmVjdGlvbi56ID4gYWJzRGlyZWN0aW9uLnkgKVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi56ID4gMC4wID8gMiA6IDU7XG5cdFx0ZWxzZVxuXHRcdFx0ZmFjZSA9IGRpcmVjdGlvbi55ID4gMC4wID8gMSA6IDQ7XG5cdH1cblx0cmV0dXJuIGZhY2U7XG59XG4jZGVmaW5lIGN1YmVVVl9tYXhMb2RzMSAgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMS4wKVxuI2RlZmluZSBjdWJlVVZfcmFuZ2VDbGFtcCAoZXhwMigoNi4wIC0gMS4wKSAqIDIuMCkpXG52ZWMyIE1pcExldmVsSW5mbyggdmVjMyB2ZWMsIGZsb2F0IHJvdWdobmVzc0xldmVsLCBmbG9hdCByb3VnaG5lc3MgKSB7XG5cdGZsb2F0IHNjYWxlID0gZXhwMihjdWJlVVZfbWF4TG9kczEgLSByb3VnaG5lc3NMZXZlbCk7XG5cdGZsb2F0IGR4Um91Z2huZXNzID0gZEZkeChyb3VnaG5lc3MpO1xuXHRmbG9hdCBkeVJvdWdobmVzcyA9IGRGZHkocm91Z2huZXNzKTtcblx0dmVjMyBkeCA9IGRGZHgoIHZlYyAqIHNjYWxlICogZHhSb3VnaG5lc3MgKTtcblx0dmVjMyBkeSA9IGRGZHkoIHZlYyAqIHNjYWxlICogZHlSb3VnaG5lc3MgKTtcblx0ZmxvYXQgZCA9IG1heCggZG90KCBkeCwgZHggKSwgZG90KCBkeSwgZHkgKSApO1xuXHRkID0gY2xhbXAoZCwgMS4wLCBjdWJlVVZfcmFuZ2VDbGFtcCk7XG5cdGZsb2F0IG1pcExldmVsID0gMC41ICogbG9nMihkKTtcblx0cmV0dXJuIHZlYzIoZmxvb3IobWlwTGV2ZWwpLCBmcmFjdChtaXBMZXZlbCkpO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczIgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMi4wKVxuI2RlZmluZSBjdWJlVVZfcmNwVGV4dHVyZVNpemUgKDEuMCAvIGN1YmVVVl90ZXh0dXJlU2l6ZSlcbnZlYzIgZ2V0Q3ViZVVWKHZlYzMgZGlyZWN0aW9uLCBmbG9hdCByb3VnaG5lc3NMZXZlbCwgZmxvYXQgbWlwTGV2ZWwpIHtcblx0bWlwTGV2ZWwgPSByb3VnaG5lc3NMZXZlbCA+IGN1YmVVVl9tYXhMb2RzMiAtIDMuMCA/IDAuMCA6IG1pcExldmVsO1xuXHRmbG9hdCBhID0gMTYuMCAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBleHAyX3BhY2tlZCA9IGV4cDIoIHZlYzIoIHJvdWdobmVzc0xldmVsLCBtaXBMZXZlbCApICk7XG5cdHZlYzIgcmNwX2V4cDJfcGFja2VkID0gdmVjMiggMS4wICkgLyBleHAyX3BhY2tlZDtcblx0ZmxvYXQgcG93U2NhbGUgPSBleHAyX3BhY2tlZC54ICogZXhwMl9wYWNrZWQueTtcblx0ZmxvYXQgc2NhbGUgPSByY3BfZXhwMl9wYWNrZWQueCAqIHJjcF9leHAyX3BhY2tlZC55ICogMC4yNTtcblx0ZmxvYXQgbWlwT2Zmc2V0ID0gMC43NSooMS4wIC0gcmNwX2V4cDJfcGFja2VkLnkpICogcmNwX2V4cDJfcGFja2VkLng7XG5cdGJvb2wgYlJlcyA9IG1pcExldmVsID09IDAuMDtcblx0c2NhbGUgPSAgYlJlcyAmJiAoc2NhbGUgPCBhKSA/IGEgOiBzY2FsZTtcblx0dmVjMyByO1xuXHR2ZWMyIG9mZnNldDtcblx0aW50IGZhY2UgPSBnZXRGYWNlRnJvbURpcmVjdGlvbihkaXJlY3Rpb24pO1xuXHRmbG9hdCByY3BQb3dTY2FsZSA9IDEuMCAvIHBvd1NjYWxlO1xuXHRpZiggZmFjZSA9PSAwKSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueiwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCA9IHZlYzIoMC4wK21pcE9mZnNldCwwLjc1ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyBhIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSBpZiggZmFjZSA9PSAxKSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnksIGRpcmVjdGlvbi54LCBkaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDIpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueiwgZGlyZWN0aW9uLngsIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgPSB2ZWMyKDIuMCpzY2FsZSttaXBPZmZzZXQsIDAuNzUgKiByY3BQb3dTY2FsZSk7XG5cdFx0b2Zmc2V0LnkgPSBiUmVzICYmIChvZmZzZXQueSA8IDIuMCphKSA/IGEgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDMpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnosIGRpcmVjdGlvbi55KTtcblx0XHRvZmZzZXQgPSB2ZWMyKDAuMCttaXBPZmZzZXQsMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRlbHNlIGlmKCBmYWNlID09IDQpIHtcblx0XHRyID0gdmVjMyhkaXJlY3Rpb24ueSwgZGlyZWN0aW9uLngsIC1kaXJlY3Rpb24ueik7XG5cdFx0b2Zmc2V0ID0gdmVjMihzY2FsZSttaXBPZmZzZXQsIDAuNSAqIHJjcFBvd1NjYWxlKTtcblx0XHRvZmZzZXQueSA9IGJSZXMgJiYgKG9mZnNldC55IDwgMi4wKmEpID8gMC4wIDogb2Zmc2V0Lnk7XG5cdH1cblx0ZWxzZSB7XG5cdFx0ciA9IHZlYzMoZGlyZWN0aW9uLnosIC1kaXJlY3Rpb24ueCwgZGlyZWN0aW9uLnkpO1xuXHRcdG9mZnNldCA9IHZlYzIoMi4wKnNjYWxlK21pcE9mZnNldCwgMC41ICogcmNwUG93U2NhbGUpO1xuXHRcdG9mZnNldC55ID0gYlJlcyAmJiAob2Zmc2V0LnkgPCAyLjAqYSkgPyAwLjAgOiBvZmZzZXQueTtcblx0fVxuXHRyID0gbm9ybWFsaXplKHIpO1xuXHRmbG9hdCB0ZXhlbE9mZnNldCA9IDAuNSAqIGN1YmVVVl9yY3BUZXh0dXJlU2l6ZTtcblx0dmVjMiBzID0gKCByLnl6IC8gYWJzKCByLnggKSArIHZlYzIoIDEuMCApICkgKiAwLjU7XG5cdHZlYzIgYmFzZSA9IG9mZnNldCArIHZlYzIoIHRleGVsT2Zmc2V0ICk7XG5cdHJldHVybiBiYXNlICsgcyAqICggc2NhbGUgLSAyLjAgKiB0ZXhlbE9mZnNldCApO1xufVxuI2RlZmluZSBjdWJlVVZfbWF4TG9kczMgKGxvZzIoY3ViZVVWX3RleHR1cmVTaXplKjAuMjUpIC0gMy4wKVxudmVjNCB0ZXh0dXJlQ3ViZVVWKCBzYW1wbGVyMkQgZW52TWFwLCB2ZWMzIHJlZmxlY3RlZERpcmVjdGlvbiwgZmxvYXQgcm91Z2huZXNzICkge1xuXHRmbG9hdCByb3VnaG5lc3NWYWwgPSByb3VnaG5lc3MqIGN1YmVVVl9tYXhMb2RzMztcblx0ZmxvYXQgcjEgPSBmbG9vcihyb3VnaG5lc3NWYWwpO1xuXHRmbG9hdCByMiA9IHIxICsgMS4wO1xuXHRmbG9hdCB0ID0gZnJhY3Qocm91Z2huZXNzVmFsKTtcblx0dmVjMiBtaXBJbmZvID0gTWlwTGV2ZWxJbmZvKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIHJvdWdobmVzcyk7XG5cdGZsb2F0IHMgPSBtaXBJbmZvLnk7XG5cdGZsb2F0IGxldmVsMCA9IG1pcEluZm8ueDtcblx0ZmxvYXQgbGV2ZWwxID0gbGV2ZWwwICsgMS4wO1xuXHRsZXZlbDEgPSBsZXZlbDEgPiA1LjAgPyA1LjAgOiBsZXZlbDE7XG5cdGxldmVsMCArPSBtaW4oIGZsb29yKCBzICsgMC41ICksIDUuMCApO1xuXHR2ZWMyIHV2XzEwID0gZ2V0Q3ViZVVWKHJlZmxlY3RlZERpcmVjdGlvbiwgcjEsIGxldmVsMCk7XG5cdHZlYzQgY29sb3IxMCA9IGVudk1hcFRleGVsVG9MaW5lYXIodGV4dHVyZTJEKGVudk1hcCwgdXZfMTApKTtcblx0dmVjMiB1dl8yMCA9IGdldEN1YmVVVihyZWZsZWN0ZWREaXJlY3Rpb24sIHIyLCBsZXZlbDApO1xuXHR2ZWM0IGNvbG9yMjAgPSBlbnZNYXBUZXhlbFRvTGluZWFyKHRleHR1cmUyRChlbnZNYXAsIHV2XzIwKSk7XG5cdHZlYzQgcmVzdWx0ID0gbWl4KGNvbG9yMTAsIGNvbG9yMjAsIHQpO1xuXHRyZXR1cm4gdmVjNChyZXN1bHQucmdiLCAxLjApO1xufVxuI2VuZGlmIjsKCiAgICB2YXIgZGVmYXVsdG5vcm1hbF92ZXJ0ZXggPSAidmVjMyB0cmFuc2Zvcm1lZE5vcm1hbCA9IG5vcm1hbE1hdHJpeCAqIG9iamVjdE5vcm1hbDtcbiNpZmRlZiBGTElQX1NJREVEXG5cdHRyYW5zZm9ybWVkTm9ybWFsID0gLSB0cmFuc2Zvcm1lZE5vcm1hbDtcbiNlbmRpZlxuI2lmZGVmIFVTRV9UQU5HRU5UXG5cdHZlYzMgdHJhbnNmb3JtZWRUYW5nZW50ID0gbm9ybWFsTWF0cml4ICogb2JqZWN0VGFuZ2VudDtcblx0I2lmZGVmIEZMSVBfU0lERURcblx0XHR0cmFuc2Zvcm1lZFRhbmdlbnQgPSAtIHRyYW5zZm9ybWVkVGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWYiOwoKICAgIHZhciBkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9ESVNQTEFDRU1FTlRNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZGlzcGxhY2VtZW50TWFwO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudFNjYWxlO1xuXHR1bmlmb3JtIGZsb2F0IGRpc3BsYWNlbWVudEJpYXM7XG4jZW5kaWYiOwoKICAgIHZhciBkaXNwbGFjZW1lbnRtYXBfdmVydGV4ID0gIiNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdHRyYW5zZm9ybWVkICs9IG5vcm1hbGl6ZSggb2JqZWN0Tm9ybWFsICkgKiAoIHRleHR1cmUyRCggZGlzcGxhY2VtZW50TWFwLCB1diApLnggKiBkaXNwbGFjZW1lbnRTY2FsZSArIGRpc3BsYWNlbWVudEJpYXMgKTtcbiNlbmRpZiI7CgogICAgdmFyIGVtaXNzaXZlbWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcblx0dmVjNCBlbWlzc2l2ZUNvbG9yID0gdGV4dHVyZTJEKCBlbWlzc2l2ZU1hcCwgdlV2ICk7XG5cdGVtaXNzaXZlQ29sb3IucmdiID0gZW1pc3NpdmVNYXBUZXhlbFRvTGluZWFyKCBlbWlzc2l2ZUNvbG9yICkucmdiO1xuXHR0b3RhbEVtaXNzaXZlUmFkaWFuY2UgKj0gZW1pc3NpdmVDb2xvci5yZ2I7XG4jZW5kaWYiOwoKICAgIHZhciBlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU1JU1NJVkVNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgZW1pc3NpdmVNYXA7XG4jZW5kaWYiOwoKICAgIHZhciBlbmNvZGluZ3NfZnJhZ21lbnQgPSAiZ2xfRnJhZ0NvbG9yID0gbGluZWFyVG9PdXRwdXRUZXhlbCggZ2xfRnJhZ0NvbG9yICk7IjsKCiAgICB2YXIgZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQgPSAiXG52ZWM0IExpbmVhclRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmFsdWU7XG59XG52ZWM0IEdhbW1hVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUsIGluIGZsb2F0IGdhbW1hRmFjdG9yICkge1xuXHRyZXR1cm4gdmVjNCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIGdhbW1hRmFjdG9yICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBMaW5lYXJUb0dhbW1hKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBnYW1tYUZhY3RvciApIHtcblx0cmV0dXJuIHZlYzQoIHBvdyggdmFsdWUucmdiLCB2ZWMzKCAxLjAgLyBnYW1tYUZhY3RvciApICksIHZhbHVlLmEgKTtcbn1cbnZlYzQgc1JHQlRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRyZXR1cm4gdmVjNCggbWl4KCBwb3coIHZhbHVlLnJnYiAqIDAuOTQ3ODY3Mjk4NiArIHZlYzMoIDAuMDUyMTMyNzAxNCApLCB2ZWMzKCAyLjQgKSApLCB2YWx1ZS5yZ2IgKiAwLjA3NzM5OTM4MDgsIHZlYzMoIGxlc3NUaGFuRXF1YWwoIHZhbHVlLnJnYiwgdmVjMyggMC4wNDA0NSApICkgKSApLCB2YWx1ZS5hICk7XG59XG52ZWM0IExpbmVhclRvc1JHQiggaW4gdmVjNCB2YWx1ZSApIHtcblx0cmV0dXJuIHZlYzQoIG1peCggcG93KCB2YWx1ZS5yZ2IsIHZlYzMoIDAuNDE2NjYgKSApICogMS4wNTUgLSB2ZWMzKCAwLjA1NSApLCB2YWx1ZS5yZ2IgKiAxMi45MiwgdmVjMyggbGVzc1RoYW5FcXVhbCggdmFsdWUucmdiLCB2ZWMzKCAwLjAwMzEzMDggKSApICkgKSwgdmFsdWUuYSApO1xufVxudmVjNCBSR0JFVG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiBleHAyKCB2YWx1ZS5hICogMjU1LjAgLSAxMjguMCApLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JFKCBpbiB2ZWM0IHZhbHVlICkge1xuXHRmbG9hdCBtYXhDb21wb25lbnQgPSBtYXgoIG1heCggdmFsdWUuciwgdmFsdWUuZyApLCB2YWx1ZS5iICk7XG5cdGZsb2F0IGZFeHAgPSBjbGFtcCggY2VpbCggbG9nMiggbWF4Q29tcG9uZW50ICkgKSwgLTEyOC4wLCAxMjcuMCApO1xuXHRyZXR1cm4gdmVjNCggdmFsdWUucmdiIC8gZXhwMiggZkV4cCApLCAoIGZFeHAgKyAxMjguMCApIC8gMjU1LjAgKTtcbn1cbnZlYzQgUkdCTVRvTGluZWFyKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0cmV0dXJuIHZlYzQoIHZhbHVlLnJnYiAqIHZhbHVlLmEgKiBtYXhSYW5nZSwgMS4wICk7XG59XG52ZWM0IExpbmVhclRvUkdCTSggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdGZsb2F0IG1heFJHQiA9IG1heCggdmFsdWUuciwgbWF4KCB2YWx1ZS5nLCB2YWx1ZS5iICkgKTtcblx0ZmxvYXQgTSA9IGNsYW1wKCBtYXhSR0IgLyBtYXhSYW5nZSwgMC4wLCAxLjAgKTtcblx0TSA9IGNlaWwoIE0gKiAyNTUuMCApIC8gMjU1LjA7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgLyAoIE0gKiBtYXhSYW5nZSApLCBNICk7XG59XG52ZWM0IFJHQkRUb0xpbmVhciggaW4gdmVjNCB2YWx1ZSwgaW4gZmxvYXQgbWF4UmFuZ2UgKSB7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoICggbWF4UmFuZ2UgLyAyNTUuMCApIC8gdmFsdWUuYSApLCAxLjAgKTtcbn1cbnZlYzQgTGluZWFyVG9SR0JEKCBpbiB2ZWM0IHZhbHVlLCBpbiBmbG9hdCBtYXhSYW5nZSApIHtcblx0ZmxvYXQgbWF4UkdCID0gbWF4KCB2YWx1ZS5yLCBtYXgoIHZhbHVlLmcsIHZhbHVlLmIgKSApO1xuXHRmbG9hdCBEID0gbWF4KCBtYXhSYW5nZSAvIG1heFJHQiwgMS4wICk7XG5cdEQgPSBtaW4oIGZsb29yKCBEICkgLyAyNTUuMCwgMS4wICk7XG5cdHJldHVybiB2ZWM0KCB2YWx1ZS5yZ2IgKiAoIEQgKiAoIDI1NS4wIC8gbWF4UmFuZ2UgKSApLCBEICk7XG59XG5jb25zdCBtYXQzIGNMb2dMdXZNID0gbWF0MyggMC4yMjA5LCAwLjMzOTAsIDAuNDE4NCwgMC4xMTM4LCAwLjY3ODAsIDAuNzMxOSwgMC4wMTAyLCAwLjExMzAsIDAuMjk2OSApO1xudmVjNCBMaW5lYXJUb0xvZ0x1diggaW4gdmVjNCB2YWx1ZSApICB7XG5cdHZlYzMgWHBfWV9YWVpwID0gY0xvZ0x1dk0gKiB2YWx1ZS5yZ2I7XG5cdFhwX1lfWFlacCA9IG1heCggWHBfWV9YWVpwLCB2ZWMzKCAxZS02LCAxZS02LCAxZS02ICkgKTtcblx0dmVjNCB2UmVzdWx0O1xuXHR2UmVzdWx0Lnh5ID0gWHBfWV9YWVpwLnh5IC8gWHBfWV9YWVpwLno7XG5cdGZsb2F0IExlID0gMi4wICogbG9nMihYcF9ZX1hZWnAueSkgKyAxMjcuMDtcblx0dlJlc3VsdC53ID0gZnJhY3QoIExlICk7XG5cdHZSZXN1bHQueiA9ICggTGUgLSAoIGZsb29yKCB2UmVzdWx0LncgKiAyNTUuMCApICkgLyAyNTUuMCApIC8gMjU1LjA7XG5cdHJldHVybiB2UmVzdWx0O1xufVxuY29uc3QgbWF0MyBjTG9nTHV2SW52ZXJzZU0gPSBtYXQzKCA2LjAwMTQsIC0yLjcwMDgsIC0xLjc5OTYsIC0xLjMzMjAsIDMuMTAyOSwgLTUuNzcyMSwgMC4zMDA4LCAtMS4wODgyLCA1LjYyNjggKTtcbnZlYzQgTG9nTHV2VG9MaW5lYXIoIGluIHZlYzQgdmFsdWUgKSB7XG5cdGZsb2F0IExlID0gdmFsdWUueiAqIDI1NS4wICsgdmFsdWUudztcblx0dmVjMyBYcF9ZX1hZWnA7XG5cdFhwX1lfWFlacC55ID0gZXhwMiggKCBMZSAtIDEyNy4wICkgLyAyLjAgKTtcblx0WHBfWV9YWVpwLnogPSBYcF9ZX1hZWnAueSAvIHZhbHVlLnk7XG5cdFhwX1lfWFlacC54ID0gdmFsdWUueCAqIFhwX1lfWFlacC56O1xuXHR2ZWMzIHZSR0IgPSBjTG9nTHV2SW52ZXJzZU0gKiBYcF9ZX1hZWnAucmdiO1xuXHRyZXR1cm4gdmVjNCggbWF4KCB2UkdCLCAwLjAgKSwgMS4wICk7XG59IjsKCiAgICB2YXIgZW52bWFwX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU5WTUFQXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2ZWMzIGNhbWVyYVRvVmVydGV4ID0gbm9ybWFsaXplKCB2V29ybGRQb3NpdGlvbiAtIGNhbWVyYVBvc2l0aW9uICk7XG5cdFx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIG5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCBjYW1lcmFUb1ZlcnRleCwgd29ybGROb3JtYWwgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjMyByZWZsZWN0VmVjID0gcmVmcmFjdCggY2FtZXJhVG9WZXJ0ZXgsIHdvcmxkTm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0I2Vsc2Vcblx0XHR2ZWMzIHJlZmxlY3RWZWMgPSB2UmVmbGVjdDtcblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZNQVBfVFlQRV9DVUJFXG5cdFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHZlYzMoIGZsaXBFbnZNYXAgKiByZWZsZWN0VmVjLngsIHJlZmxlY3RWZWMueXogKSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9FUVVJUkVDIClcblx0XHR2ZWMyIHNhbXBsZVVWO1xuXHRcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHRzYW1wbGVVVi55ID0gYXNpbiggY2xhbXAoIHJlZmxlY3RWZWMueSwgLSAxLjAsIDEuMCApICkgKiBSRUNJUFJPQ0FMX1BJICsgMC41O1xuXHRcdHNhbXBsZVVWLnggPSBhdGFuKCByZWZsZWN0VmVjLnosIHJlZmxlY3RWZWMueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdFx0dmVjNCBlbnZDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCBzYW1wbGVVViApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9TUEhFUkUgKVxuXHRcdHJlZmxlY3RWZWMgPSBub3JtYWxpemUoIHJlZmxlY3RWZWMgKTtcblx0XHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwgMC4wLCAxLjAgKSApO1xuXHRcdHZlYzQgZW52Q29sb3IgPSB0ZXh0dXJlMkQoIGVudk1hcCwgcmVmbGVjdFZpZXcueHkgKiAwLjUgKyAwLjUgKTtcblx0I2Vsc2Vcblx0XHR2ZWM0IGVudkNvbG9yID0gdmVjNCggMC4wICk7XG5cdCNlbmRpZlxuXHRlbnZDb2xvciA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudkNvbG9yICk7XG5cdCNpZmRlZiBFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFlcblx0XHRvdXRnb2luZ0xpZ2h0ID0gbWl4KCBvdXRnb2luZ0xpZ2h0LCBvdXRnb2luZ0xpZ2h0ICogZW52Q29sb3IueHl6LCBzcGVjdWxhclN0cmVuZ3RoICogcmVmbGVjdGl2aXR5ICk7XG5cdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9CTEVORElOR19NSVggKVxuXHRcdG91dGdvaW5nTGlnaHQgPSBtaXgoIG91dGdvaW5nTGlnaHQsIGVudkNvbG9yLnh5eiwgc3BlY3VsYXJTdHJlbmd0aCAqIHJlZmxlY3Rpdml0eSApO1xuXHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfQkxFTkRJTkdfQUREIClcblx0XHRvdXRnb2luZ0xpZ2h0ICs9IGVudkNvbG9yLnh5eiAqIHNwZWN1bGFyU3RyZW5ndGggKiByZWZsZWN0aXZpdHk7XG5cdCNlbmRpZlxuI2VuZGlmIjsKCiAgICB2YXIgZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfRU5WTUFQXG5cdHVuaWZvcm0gZmxvYXQgZW52TWFwSW50ZW5zaXR5O1xuXHR1bmlmb3JtIGZsb2F0IGZsaXBFbnZNYXA7XG5cdHVuaWZvcm0gaW50IG1heE1pcExldmVsO1xuXHQjaWZkZWYgRU5WTUFQX1RZUEVfQ1VCRVxuXHRcdHVuaWZvcm0gc2FtcGxlckN1YmUgZW52TWFwO1xuXHQjZWxzZVxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGVudk1hcDtcblx0I2VuZGlmXG5cdFxuI2VuZGlmIjsKCiAgICB2YXIgZW52bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9FTlZNQVBcblx0dW5pZm9ybSBmbG9hdCByZWZsZWN0aXZpdHk7XG5cdCNpZiBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFVTRV9OT1JNQUxNQVAgKSB8fCBkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIGVudm1hcF9wYXJzX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKSB8fCBkZWZpbmVkKCBVU0VfTk9STUFMTUFQICkgfHxkZWZpbmVkKCBQSE9ORyApXG5cdFx0I2RlZmluZSBFTlZfV09STERQT1Ncblx0I2VuZGlmXG5cdCNpZmRlZiBFTlZfV09STERQT1Ncblx0XHRcblx0XHR2YXJ5aW5nIHZlYzMgdldvcmxkUG9zaXRpb247XG5cdCNlbHNlXG5cdFx0dmFyeWluZyB2ZWMzIHZSZWZsZWN0O1xuXHRcdHVuaWZvcm0gZmxvYXQgcmVmcmFjdGlvblJhdGlvO1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIGVudm1hcF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9FTlZNQVBcblx0I2lmZGVmIEVOVl9XT1JMRFBPU1xuXHRcdHZXb3JsZFBvc2l0aW9uID0gd29ybGRQb3NpdGlvbi54eXo7XG5cdCNlbHNlXG5cdFx0dmVjMyBjYW1lcmFUb1ZlcnRleCA9IG5vcm1hbGl6ZSggd29ybGRQb3NpdGlvbi54eXogLSBjYW1lcmFQb3NpdGlvbiApO1xuXHRcdHZlYzMgd29ybGROb3JtYWwgPSBpbnZlcnNlVHJhbnNmb3JtRGlyZWN0aW9uKCB0cmFuc2Zvcm1lZE5vcm1hbCwgdmlld01hdHJpeCApO1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0XHR2UmVmbGVjdCA9IHJlZmxlY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCApO1xuXHRcdCNlbHNlXG5cdFx0XHR2UmVmbGVjdCA9IHJlZnJhY3QoIGNhbWVyYVRvVmVydGV4LCB3b3JsZE5vcm1hbCwgcmVmcmFjdGlvblJhdGlvICk7XG5cdFx0I2VuZGlmXG5cdCNlbmRpZlxuI2VuZGlmIjsKCiAgICB2YXIgZm9nX3ZlcnRleCA9ICIjaWZkZWYgVVNFX0ZPR1xuXHRmb2dEZXB0aCA9IC1tdlBvc2l0aW9uLno7XG4jZW5kaWYiOwoKICAgIHZhciBmb2dfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9GT0dcblx0dmFyeWluZyBmbG9hdCBmb2dEZXB0aDtcbiNlbmRpZiI7CgogICAgdmFyIGZvZ19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0ZPR1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHRmbG9hdCBmb2dGYWN0b3IgPSAxLjAgLSBleHAoIC0gZm9nRGVuc2l0eSAqIGZvZ0RlbnNpdHkgKiBmb2dEZXB0aCAqIGZvZ0RlcHRoICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZm9nRmFjdG9yID0gc21vb3Roc3RlcCggZm9nTmVhciwgZm9nRmFyLCBmb2dEZXB0aCApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IG1peCggZ2xfRnJhZ0NvbG9yLnJnYiwgZm9nQ29sb3IsIGZvZ0ZhY3RvciApO1xuI2VuZGlmIjsKCiAgICB2YXIgZm9nX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9GT0dcblx0dW5pZm9ybSB2ZWMzIGZvZ0NvbG9yO1xuXHR2YXJ5aW5nIGZsb2F0IGZvZ0RlcHRoO1xuXHQjaWZkZWYgRk9HX0VYUDJcblx0XHR1bmlmb3JtIGZsb2F0IGZvZ0RlbnNpdHk7XG5cdCNlbHNlXG5cdFx0dW5pZm9ybSBmbG9hdCBmb2dOZWFyO1xuXHRcdHVuaWZvcm0gZmxvYXQgZm9nRmFyO1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIGdyYWRpZW50bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFRPT05cblx0dW5pZm9ybSBzYW1wbGVyMkQgZ3JhZGllbnRNYXA7XG5cdHZlYzMgZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCB2ZWMzIG5vcm1hbCwgdmVjMyBsaWdodERpcmVjdGlvbiApIHtcblx0XHRmbG9hdCBkb3ROTCA9IGRvdCggbm9ybWFsLCBsaWdodERpcmVjdGlvbiApO1xuXHRcdHZlYzIgY29vcmQgPSB2ZWMyKCBkb3ROTCAqIDAuNSArIDAuNSwgMC4wICk7XG5cdFx0I2lmZGVmIFVTRV9HUkFESUVOVE1BUFxuXHRcdFx0cmV0dXJuIHRleHR1cmUyRCggZ3JhZGllbnRNYXAsIGNvb3JkICkucmdiO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gKCBjb29yZC54IDwgMC43ICkgPyB2ZWMzKCAwLjcgKSA6IHZlYzMoIDEuMCApO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWYiOwoKICAgIHZhciBsaWdodG1hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBQSSAqIHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiI7CgogICAgdmFyIGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9MSUdIVE1BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBsaWdodE1hcDtcblx0dW5pZm9ybSBmbG9hdCBsaWdodE1hcEludGVuc2l0eTtcbiNlbmRpZiI7CgogICAgdmFyIGxpZ2h0c19sYW1iZXJ0X3ZlcnRleCA9ICJ2ZWMzIGRpZmZ1c2UgPSB2ZWMzKCAxLjAgKTtcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiA9IG12UG9zaXRpb24ueHl6O1xuZ2VvbWV0cnkubm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuZ2VvbWV0cnkudmlld0RpciA9IG5vcm1hbGl6ZSggLW12UG9zaXRpb24ueHl6ICk7XG5HZW9tZXRyaWNDb250ZXh0IGJhY2tHZW9tZXRyeTtcbmJhY2tHZW9tZXRyeS5wb3NpdGlvbiA9IGdlb21ldHJ5LnBvc2l0aW9uO1xuYmFja0dlb21ldHJ5Lm5vcm1hbCA9IC1nZW9tZXRyeS5ub3JtYWw7XG5iYWNrR2VvbWV0cnkudmlld0RpciA9IGdlb21ldHJ5LnZpZXdEaXI7XG52TGlnaHRGcm9udCA9IHZlYzMoIDAuMCApO1xudkluZGlyZWN0RnJvbnQgPSB2ZWMzKCAwLjAgKTtcbiNpZmRlZiBET1VCTEVfU0lERURcblx0dkxpZ2h0QmFjayA9IHZlYzMoIDAuMCApO1xuXHR2SW5kaXJlY3RCYWNrID0gdmVjMyggMC4wICk7XG4jZW5kaWZcbkluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQ7XG5mbG9hdCBkb3ROTDtcbnZlYzMgZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuI2lmIE5VTV9QT0lOVF9MSUdIVFMgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodHNbIGkgXSwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0ZG90TkwgPSBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0ZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlID0gUEkgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0XHR2TGlnaHRGcm9udCArPSBzYXR1cmF0ZSggZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2TGlnaHRCYWNrICs9IHNhdHVyYXRlKCAtZG90TkwgKSAqIGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUUzsgaSArKyApIHtcblx0XHRnZXRTcG90RGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBzcG90TGlnaHRzWyBpIF0sIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApO1xuXHRcdGRpcmVjdExpZ2h0Q29sb3JfRGlmZnVzZSA9IFBJICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdFx0dkxpZ2h0RnJvbnQgKz0gc2F0dXJhdGUoIGRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dkxpZ2h0QmFjayArPSBzYXR1cmF0ZSggLWRvdE5MICkgKiBkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2U7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZlxuI2lmIE5VTV9ESVJfTElHSFRTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRTOyBpICsrICkge1xuXHRcdGdldERpcmVjdGlvbmFsRGlyZWN0TGlnaHRJcnJhZGlhbmNlKCBkaXJlY3Rpb25hbExpZ2h0c1sgaSBdLCBnZW9tZXRyeSwgZGlyZWN0TGlnaHQgKTtcblx0XHRkb3ROTCA9IGRvdCggZ2VvbWV0cnkubm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRkaXJlY3RMaWdodENvbG9yX0RpZmZ1c2UgPSBQSSAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdHZMaWdodEZyb250ICs9IHNhdHVyYXRlKCBkb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRcdHZMaWdodEJhY2sgKz0gc2F0dXJhdGUoIC1kb3ROTCApICogZGlyZWN0TGlnaHRDb2xvcl9EaWZmdXNlO1xuXHRcdCNlbmRpZlxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fSEVNSV9MSUdIVFMgPiAwXG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdHZJbmRpcmVjdEZyb250ICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgZ2VvbWV0cnkgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR2SW5kaXJlY3RCYWNrICs9IGdldEhlbWlzcGhlcmVMaWdodElycmFkaWFuY2UoIGhlbWlzcGhlcmVMaWdodHNbIGkgXSwgYmFja0dlb21ldHJ5ICk7XG5cdFx0I2VuZGlmXG5cdH1cbiNlbmRpZiI7CgogICAgdmFyIGxpZ2h0c19wYXJzX2JlZ2luID0gInVuaWZvcm0gdmVjMyBhbWJpZW50TGlnaHRDb2xvcjtcbnVuaWZvcm0gdmVjMyBsaWdodFByb2JlWyA5IF07XG52ZWMzIHNoR2V0SXJyYWRpYW5jZUF0KCBpbiB2ZWMzIG5vcm1hbCwgaW4gdmVjMyBzaENvZWZmaWNpZW50c1sgOSBdICkge1xuXHRmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56O1xuXHR2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNztcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgMiBdICogMi4wICogMC41MTE2NjQgKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDMgXSAqIDIuMCAqIDAuNTExNjY0ICogeDtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA0IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB5O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7XG5cdHJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNiBdICogKCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTtcblx0cmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA3IF0gKiAyLjAgKiAwLjQyOTA0MyAqIHggKiB6O1xuXHRyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7XG5cdHJldHVybiByZXN1bHQ7XG59XG52ZWMzIGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBjb25zdCBpbiB2ZWMzIGxpZ2h0UHJvYmVbIDkgXSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSApIHtcblx0dmVjMyB3b3JsZE5vcm1hbCA9IGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGdlb21ldHJ5Lm5vcm1hbCwgdmlld01hdHJpeCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBzaEdldElycmFkaWFuY2VBdCggd29ybGROb3JtYWwsIGxpZ2h0UHJvYmUgKTtcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG52ZWMzIGdldEFtYmllbnRMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgYW1iaWVudExpZ2h0Q29sb3IgKSB7XG5cdHZlYzMgaXJyYWRpYW5jZSA9IGFtYmllbnRMaWdodENvbG9yO1xuXHQjaWZuZGVmIFBIWVNJQ0FMTFlfQ09SUkVDVF9MSUdIVFNcblx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHQjZW5kaWZcblx0cmV0dXJuIGlycmFkaWFuY2U7XG59XG4jaWYgTlVNX0RJUl9MSUdIVFMgPiAwXG5cdHN0cnVjdCBEaXJlY3Rpb25hbExpZ2h0IHtcblx0XHR2ZWMzIGRpcmVjdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHR9O1xuXHR1bmlmb3JtIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodHNbIE5VTV9ESVJfTElHSFRTIF07XG5cdHZvaWQgZ2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGNvbnN0IGluIERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgKSB7XG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgPSBkaXJlY3Rpb25hbExpZ2h0LmNvbG9yO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IGRpcmVjdGlvbmFsTGlnaHQuZGlyZWN0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LnZpc2libGUgPSB0cnVlO1xuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUE9JTlRfTElHSFRTID4gMFxuXHRzdHJ1Y3QgUG9pbnRMaWdodCB7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGNvbG9yO1xuXHRcdGZsb2F0IGRpc3RhbmNlO1xuXHRcdGZsb2F0IGRlY2F5O1xuXHRcdGludCBzaGFkb3c7XG5cdFx0ZmxvYXQgc2hhZG93Qmlhcztcblx0XHRmbG9hdCBzaGFkb3dSYWRpdXM7XG5cdFx0dmVjMiBzaGFkb3dNYXBTaXplO1xuXHRcdGZsb2F0IHNoYWRvd0NhbWVyYU5lYXI7XG5cdFx0ZmxvYXQgc2hhZG93Q2FtZXJhRmFyO1xuXHR9O1xuXHR1bmlmb3JtIFBvaW50TGlnaHQgcG9pbnRMaWdodHNbIE5VTV9QT0lOVF9MSUdIVFMgXTtcblx0dm9pZCBnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gUG9pbnRMaWdodCBwb2ludExpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5LCBvdXQgSW5jaWRlbnRMaWdodCBkaXJlY3RMaWdodCApIHtcblx0XHR2ZWMzIGxWZWN0b3IgPSBwb2ludExpZ2h0LnBvc2l0aW9uIC0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uID0gbm9ybWFsaXplKCBsVmVjdG9yICk7XG5cdFx0ZmxvYXQgbGlnaHREaXN0YW5jZSA9IGxlbmd0aCggbFZlY3RvciApO1xuXHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gcG9pbnRMaWdodC5jb2xvcjtcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBwb2ludExpZ2h0LmRpc3RhbmNlLCBwb2ludExpZ2h0LmRlY2F5ICk7XG5cdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9ICggZGlyZWN0TGlnaHQuY29sb3IgIT0gdmVjMyggMC4wICkgKTtcblx0fVxuI2VuZGlmXG4jaWYgTlVNX1NQT1RfTElHSFRTID4gMFxuXHRzdHJ1Y3QgU3BvdExpZ2h0IHtcblx0XHR2ZWMzIHBvc2l0aW9uO1xuXHRcdHZlYzMgZGlyZWN0aW9uO1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0ZmxvYXQgZGlzdGFuY2U7XG5cdFx0ZmxvYXQgZGVjYXk7XG5cdFx0ZmxvYXQgY29uZUNvcztcblx0XHRmbG9hdCBwZW51bWJyYUNvcztcblx0XHRpbnQgc2hhZG93O1xuXHRcdGZsb2F0IHNoYWRvd0JpYXM7XG5cdFx0ZmxvYXQgc2hhZG93UmFkaXVzO1xuXHRcdHZlYzIgc2hhZG93TWFwU2l6ZTtcblx0fTtcblx0dW5pZm9ybSBTcG90TGlnaHQgc3BvdExpZ2h0c1sgTlVNX1NQT1RfTElHSFRTIF07XG5cdHZvaWQgZ2V0U3BvdERpcmVjdExpZ2h0SXJyYWRpYW5jZSggY29uc3QgaW4gU3BvdExpZ2h0IHNwb3RMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgb3V0IEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQgICkge1xuXHRcdHZlYzMgbFZlY3RvciA9IHNwb3RMaWdodC5wb3NpdGlvbiAtIGdlb21ldHJ5LnBvc2l0aW9uO1xuXHRcdGRpcmVjdExpZ2h0LmRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xuXHRcdGZsb2F0IGxpZ2h0RGlzdGFuY2UgPSBsZW5ndGgoIGxWZWN0b3IgKTtcblx0XHRmbG9hdCBhbmdsZUNvcyA9IGRvdCggZGlyZWN0TGlnaHQuZGlyZWN0aW9uLCBzcG90TGlnaHQuZGlyZWN0aW9uICk7XG5cdFx0aWYgKCBhbmdsZUNvcyA+IHNwb3RMaWdodC5jb25lQ29zICkge1xuXHRcdFx0ZmxvYXQgc3BvdEVmZmVjdCA9IHNtb290aHN0ZXAoIHNwb3RMaWdodC5jb25lQ29zLCBzcG90TGlnaHQucGVudW1icmFDb3MsIGFuZ2xlQ29zICk7XG5cdFx0XHRkaXJlY3RMaWdodC5jb2xvciA9IHNwb3RMaWdodC5jb2xvcjtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yICo9IHNwb3RFZmZlY3QgKiBwdW5jdHVhbExpZ2h0SW50ZW5zaXR5VG9JcnJhZGlhbmNlRmFjdG9yKCBsaWdodERpc3RhbmNlLCBzcG90TGlnaHQuZGlzdGFuY2UsIHNwb3RMaWdodC5kZWNheSApO1xuXHRcdFx0ZGlyZWN0TGlnaHQudmlzaWJsZSA9IHRydWU7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGRpcmVjdExpZ2h0LmNvbG9yID0gdmVjMyggMC4wICk7XG5cdFx0XHRkaXJlY3RMaWdodC52aXNpYmxlID0gZmFsc2U7XG5cdFx0fVxuXHR9XG4jZW5kaWZcbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcblx0c3RydWN0IFJlY3RBcmVhTGlnaHQge1xuXHRcdHZlYzMgY29sb3I7XG5cdFx0dmVjMyBwb3NpdGlvbjtcblx0XHR2ZWMzIGhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQ7XG5cdH07XG5cdHVuaWZvcm0gc2FtcGxlcjJEIGx0Y18xO1x0dW5pZm9ybSBzYW1wbGVyMkQgbHRjXzI7XG5cdHVuaWZvcm0gUmVjdEFyZWFMaWdodCByZWN0QXJlYUxpZ2h0c1sgTlVNX1JFQ1RfQVJFQV9MSUdIVFMgXTtcbiNlbmRpZlxuI2lmIE5VTV9IRU1JX0xJR0hUUyA+IDBcblx0c3RydWN0IEhlbWlzcGhlcmVMaWdodCB7XG5cdFx0dmVjMyBkaXJlY3Rpb247XG5cdFx0dmVjMyBza3lDb2xvcjtcblx0XHR2ZWMzIGdyb3VuZENvbG9yO1xuXHR9O1xuXHR1bmlmb3JtIEhlbWlzcGhlcmVMaWdodCBoZW1pc3BoZXJlTGlnaHRzWyBOVU1fSEVNSV9MSUdIVFMgXTtcblx0dmVjMyBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBjb25zdCBpbiBIZW1pc3BoZXJlTGlnaHQgaGVtaUxpZ2h0LCBjb25zdCBpbiBHZW9tZXRyaWNDb250ZXh0IGdlb21ldHJ5ICkge1xuXHRcdGZsb2F0IGRvdE5MID0gZG90KCBnZW9tZXRyeS5ub3JtYWwsIGhlbWlMaWdodC5kaXJlY3Rpb24gKTtcblx0XHRmbG9hdCBoZW1pRGlmZnVzZVdlaWdodCA9IDAuNSAqIGRvdE5MICsgMC41O1xuXHRcdHZlYzMgaXJyYWRpYW5jZSA9IG1peCggaGVtaUxpZ2h0Lmdyb3VuZENvbG9yLCBoZW1pTGlnaHQuc2t5Q29sb3IsIGhlbWlEaWZmdXNlV2VpZ2h0ICk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRpcnJhZGlhbmNlICo9IFBJO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBpcnJhZGlhbmNlO1xuXHR9XG4jZW5kaWYiOwoKICAgIHZhciBlbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApXG5cdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZSQUNUSU9OXG5cdFx0dW5pZm9ybSBmbG9hdCByZWZyYWN0aW9uUmF0aW87XG5cdCNlbmRpZlxuXHR2ZWMzIGdldExpZ2h0UHJvYmVJbmRpcmVjdElycmFkaWFuY2UoIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHR2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggZ2VvbWV0cnkubm9ybWFsLCB2aWV3TWF0cml4ICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlTG9kRVhUKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmVDdWJlKCBlbnZNYXAsIHF1ZXJ5VmVjLCBmbG9hdCggbWF4TUlQTGV2ZWwgKSApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZWxpZiBkZWZpbmVkKCBFTlZNQVBfVFlQRV9DVUJFX1VWIClcblx0XHRcdHZlYzMgcXVlcnlWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogd29ybGROb3JtYWwueCwgd29ybGROb3JtYWwueXogKTtcblx0XHRcdHZlYzQgZW52TWFwQ29sb3IgPSB0ZXh0dXJlQ3ViZVVWKCBlbnZNYXAsIHF1ZXJ5VmVjLCAxLjAgKTtcblx0XHQjZWxzZVxuXHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHZlYzQoIDAuMCApO1xuXHRcdCNlbmRpZlxuXHRcdHJldHVybiBQSSAqIGVudk1hcENvbG9yLnJnYiAqIGVudk1hcEludGVuc2l0eTtcblx0fVxuXHRmbG9hdCBnZXRTcGVjdWxhck1JUExldmVsKCBjb25zdCBpbiBmbG9hdCByb3VnaG5lc3MsIGNvbnN0IGluIGludCBtYXhNSVBMZXZlbCApIHtcblx0XHRmbG9hdCBtYXhNSVBMZXZlbFNjYWxhciA9IGZsb2F0KCBtYXhNSVBMZXZlbCApO1xuXHRcdGZsb2F0IHNpZ21hID0gUEkgKiByb3VnaG5lc3MgKiByb3VnaG5lc3MgLyAoIDEuMCArIHJvdWdobmVzcyApO1xuXHRcdGZsb2F0IGRlc2lyZWRNSVBMZXZlbCA9IG1heE1JUExldmVsU2NhbGFyICsgbG9nMiggc2lnbWEgKTtcblx0XHRyZXR1cm4gY2xhbXAoIGRlc2lyZWRNSVBMZXZlbCwgMC4wLCBtYXhNSVBMZXZlbFNjYWxhciApO1xuXHR9XG5cdHZlYzMgZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGNvbnN0IGluIHZlYzMgdmlld0RpciwgY29uc3QgaW4gdmVjMyBub3JtYWwsIGNvbnN0IGluIGZsb2F0IHJvdWdobmVzcywgY29uc3QgaW4gaW50IG1heE1JUExldmVsICkge1xuXHRcdCNpZmRlZiBFTlZNQVBfTU9ERV9SRUZMRUNUSU9OXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgPSByZWZsZWN0KCAtdmlld0Rpciwgbm9ybWFsICk7XG5cdFx0ICByZWZsZWN0VmVjID0gbm9ybWFsaXplKCBtaXgoIHJlZmxlY3RWZWMsIG5vcm1hbCwgcm91Z2huZXNzICogcm91Z2huZXNzKSApO1xuXHRcdCNlbHNlXG5cdFx0ICB2ZWMzIHJlZmxlY3RWZWMgPSByZWZyYWN0KCAtdmlld0Rpciwgbm9ybWFsLCByZWZyYWN0aW9uUmF0aW8gKTtcblx0XHQjZW5kaWZcblx0XHRyZWZsZWN0VmVjID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggcmVmbGVjdFZlYywgdmlld01hdHJpeCApO1xuXHRcdGZsb2F0IHNwZWN1bGFyTUlQTGV2ZWwgPSBnZXRTcGVjdWxhck1JUExldmVsKCByb3VnaG5lc3MsIG1heE1JUExldmVsICk7XG5cdFx0I2lmZGVmIEVOVk1BUF9UWVBFX0NVQkVcblx0XHRcdHZlYzMgcXVlcnlSZWZsZWN0VmVjID0gdmVjMyggZmxpcEVudk1hcCAqIHJlZmxlY3RWZWMueCwgcmVmbGVjdFZlYy55eiApO1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVMb2RFWFQoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmUoIGVudk1hcCwgcXVlcnlSZWZsZWN0VmVjLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0NVQkVfVVYgKVxuXHRcdFx0dmVjMyBxdWVyeVJlZmxlY3RWZWMgPSB2ZWMzKCBmbGlwRW52TWFwICogcmVmbGVjdFZlYy54LCByZWZsZWN0VmVjLnl6ICk7XG5cdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZUN1YmVVViggZW52TWFwLCBxdWVyeVJlZmxlY3RWZWMsIHJvdWdobmVzcyApO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX0VRVUlSRUMgKVxuXHRcdFx0dmVjMiBzYW1wbGVVVjtcblx0XHRcdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggcmVmbGVjdFZlYy55LCAtIDEuMCwgMS4wICkgKSAqIFJFQ0lQUk9DQUxfUEkgKyAwLjU7XG5cdFx0XHRzYW1wbGVVVi54ID0gYXRhbiggcmVmbGVjdFZlYy56LCByZWZsZWN0VmVjLnggKSAqIFJFQ0lQUk9DQUxfUEkyICsgMC41O1xuXHRcdFx0I2lmZGVmIFRFWFRVUkVfTE9EX0VYVFxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJETG9kRVhUKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZWxzZVxuXHRcdFx0XHR2ZWM0IGVudk1hcENvbG9yID0gdGV4dHVyZTJEKCBlbnZNYXAsIHNhbXBsZVVWLCBzcGVjdWxhck1JUExldmVsICk7XG5cdFx0XHQjZW5kaWZcblx0XHRcdGVudk1hcENvbG9yLnJnYiA9IGVudk1hcFRleGVsVG9MaW5lYXIoIGVudk1hcENvbG9yICkucmdiO1xuXHRcdCNlbGlmIGRlZmluZWQoIEVOVk1BUF9UWVBFX1NQSEVSRSApXG5cdFx0XHR2ZWMzIHJlZmxlY3RWaWV3ID0gbm9ybWFsaXplKCAoIHZpZXdNYXRyaXggKiB2ZWM0KCByZWZsZWN0VmVjLCAwLjAgKSApLnh5eiArIHZlYzMoIDAuMCwwLjAsMS4wICkgKTtcblx0XHRcdCNpZmRlZiBURVhUVVJFX0xPRF9FWFRcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRExvZEVYVCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2Vsc2Vcblx0XHRcdFx0dmVjNCBlbnZNYXBDb2xvciA9IHRleHR1cmUyRCggZW52TWFwLCByZWZsZWN0Vmlldy54eSAqIDAuNSArIDAuNSwgc3BlY3VsYXJNSVBMZXZlbCApO1xuXHRcdFx0I2VuZGlmXG5cdFx0XHRlbnZNYXBDb2xvci5yZ2IgPSBlbnZNYXBUZXhlbFRvTGluZWFyKCBlbnZNYXBDb2xvciApLnJnYjtcblx0XHQjZW5kaWZcblx0XHRyZXR1cm4gZW52TWFwQ29sb3IucmdiICogZW52TWFwSW50ZW5zaXR5O1xuXHR9XG4jZW5kaWYiOwoKICAgIHZhciBsaWdodHNfcGhvbmdfZnJhZ21lbnQgPSAiQmxpbm5QaG9uZ01hdGVyaWFsIG1hdGVyaWFsO1xubWF0ZXJpYWwuZGlmZnVzZUNvbG9yID0gZGlmZnVzZUNvbG9yLnJnYjtcbm1hdGVyaWFsLnNwZWN1bGFyQ29sb3IgPSBzcGVjdWxhcjtcbm1hdGVyaWFsLnNwZWN1bGFyU2hpbmluZXNzID0gc2hpbmluZXNzO1xubWF0ZXJpYWwuc3BlY3VsYXJTdHJlbmd0aCA9IHNwZWN1bGFyU3RyZW5ndGg7IjsKCiAgICB2YXIgbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQgPSAidmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG5zdHJ1Y3QgQmxpbm5QaG9uZ01hdGVyaWFsIHtcblx0dmVjM1x0ZGlmZnVzZUNvbG9yO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuXHRmbG9hdFx0c3BlY3VsYXJTaGluaW5lc3M7XG5cdGZsb2F0XHRzcGVjdWxhclN0cmVuZ3RoO1xufTtcbnZvaWQgUkVfRGlyZWN0X0JsaW5uUGhvbmcoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdCNpZmRlZiBUT09OXG5cdFx0dmVjMyBpcnJhZGlhbmNlID0gZ2V0R3JhZGllbnRJcnJhZGlhbmNlKCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICogZGlyZWN0TGlnaHQuY29sb3I7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgZG90TkwgPSBzYXR1cmF0ZSggZG90KCBnZW9tZXRyeS5ub3JtYWwsIGRpcmVjdExpZ2h0LmRpcmVjdGlvbiApICk7XG5cdFx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2VuZGlmXG5cdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdGlycmFkaWFuY2UgKj0gUEk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGlycmFkaWFuY2UgKiBCUkRGX0RpZmZ1c2VfTGFtYmVydCggbWF0ZXJpYWwuZGlmZnVzZUNvbG9yICk7XG5cdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9IGlycmFkaWFuY2UgKiBCUkRGX1NwZWN1bGFyX0JsaW5uUGhvbmcoIGRpcmVjdExpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJTaGluaW5lc3MgKSAqIG1hdGVyaWFsLnNwZWN1bGFyU3RyZW5ndGg7XG59XG52b2lkIFJFX0luZGlyZWN0RGlmZnVzZV9CbGlublBob25nKCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIEJsaW5uUGhvbmdNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxuI2RlZmluZSBSRV9EaXJlY3RcdFx0XHRcdFJFX0RpcmVjdF9CbGlublBob25nXG4jZGVmaW5lIFJFX0luZGlyZWN0RGlmZnVzZVx0XHRSRV9JbmRpcmVjdERpZmZ1c2VfQmxpbm5QaG9uZ1xuI2RlZmluZSBNYXRlcmlhbF9MaWdodFByb2JlTE9EKCBtYXRlcmlhbCApXHQoMCkiOwoKICAgIHZhciBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQgPSAiUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbDtcbm1hdGVyaWFsLmRpZmZ1c2VDb2xvciA9IGRpZmZ1c2VDb2xvci5yZ2IgKiAoIDEuMCAtIG1ldGFsbmVzc0ZhY3RvciApO1xubWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MgPSBjbGFtcCggcm91Z2huZXNzRmFjdG9yLCAwLjA0LCAxLjAgKTtcbiNpZmRlZiBSRUZMRUNUSVZJVFlcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggTUFYSU1VTV9TUEVDVUxBUl9DT0VGRklDSUVOVCAqIHBvdzIoIHJlZmxlY3Rpdml0eSApICksIGRpZmZ1c2VDb2xvci5yZ2IsIG1ldGFsbmVzc0ZhY3RvciApO1xuI2Vsc2Vcblx0bWF0ZXJpYWwuc3BlY3VsYXJDb2xvciA9IG1peCggdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBkaWZmdXNlQ29sb3IucmdiLCBtZXRhbG5lc3NGYWN0b3IgKTtcbiNlbmRpZlxuI2lmZGVmIENMRUFSQ09BVFxuXHRtYXRlcmlhbC5jbGVhcmNvYXQgPSBzYXR1cmF0ZSggY2xlYXJjb2F0ICk7XHRtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBjbGFtcCggY2xlYXJjb2F0Um91Z2huZXNzLCAwLjA0LCAxLjAgKTtcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHRtYXRlcmlhbC5zaGVlbkNvbG9yID0gc2hlZW47XG4jZW5kaWYiOwoKICAgIHZhciBsaWdodHNfcGh5c2ljYWxfcGFyc19mcmFnbWVudCA9ICJzdHJ1Y3QgUGh5c2ljYWxNYXRlcmlhbCB7XG5cdHZlYzNcdGRpZmZ1c2VDb2xvcjtcblx0ZmxvYXRcdHNwZWN1bGFyUm91Z2huZXNzO1xuXHR2ZWMzXHRzcGVjdWxhckNvbG9yO1xuI2lmZGVmIENMRUFSQ09BVFxuXHRmbG9hdCBjbGVhcmNvYXQ7XG5cdGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR2ZWMzIHNoZWVuQ29sb3I7XG4jZW5kaWZcbn07XG4jZGVmaW5lIE1BWElNVU1fU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgMC4xNlxuI2RlZmluZSBERUZBVUxUX1NQRUNVTEFSX0NPRUZGSUNJRU5UIDAuMDRcbmZsb2F0IGNsZWFyY29hdERIUkFwcHJveCggY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzLCBjb25zdCBpbiBmbG9hdCBkb3ROTCApIHtcblx0cmV0dXJuIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKyAoIDEuMCAtIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSAqICggcG93KCAxLjAgLSBkb3ROTCwgNS4wICkgKiBwb3coIDEuMCAtIHJvdWdobmVzcywgMi4wICkgKTtcbn1cbiNpZiBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDBcblx0dm9pZCBSRV9EaXJlY3RfUmVjdEFyZWFfUGh5c2ljYWwoIGNvbnN0IGluIFJlY3RBcmVhTGlnaHQgcmVjdEFyZWFMaWdodCwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdFx0dmVjMyBub3JtYWwgPSBnZW9tZXRyeS5ub3JtYWw7XG5cdFx0dmVjMyB2aWV3RGlyID0gZ2VvbWV0cnkudmlld0Rpcjtcblx0XHR2ZWMzIHBvc2l0aW9uID0gZ2VvbWV0cnkucG9zaXRpb247XG5cdFx0dmVjMyBsaWdodFBvcyA9IHJlY3RBcmVhTGlnaHQucG9zaXRpb247XG5cdFx0dmVjMyBoYWxmV2lkdGggPSByZWN0QXJlYUxpZ2h0LmhhbGZXaWR0aDtcblx0XHR2ZWMzIGhhbGZIZWlnaHQgPSByZWN0QXJlYUxpZ2h0LmhhbGZIZWlnaHQ7XG5cdFx0dmVjMyBsaWdodENvbG9yID0gcmVjdEFyZWFMaWdodC5jb2xvcjtcblx0XHRmbG9hdCByb3VnaG5lc3MgPSBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcztcblx0XHR2ZWMzIHJlY3RDb29yZHNbIDQgXTtcblx0XHRyZWN0Q29vcmRzWyAwIF0gPSBsaWdodFBvcyArIGhhbGZXaWR0aCAtIGhhbGZIZWlnaHQ7XHRcdHJlY3RDb29yZHNbIDEgXSA9IGxpZ2h0UG9zIC0gaGFsZldpZHRoIC0gaGFsZkhlaWdodDtcblx0XHRyZWN0Q29vcmRzWyAyIF0gPSBsaWdodFBvcyAtIGhhbGZXaWR0aCArIGhhbGZIZWlnaHQ7XG5cdFx0cmVjdENvb3Jkc1sgMyBdID0gbGlnaHRQb3MgKyBoYWxmV2lkdGggKyBoYWxmSGVpZ2h0O1xuXHRcdHZlYzIgdXYgPSBMVENfVXYoIG5vcm1hbCwgdmlld0Rpciwgcm91Z2huZXNzICk7XG5cdFx0dmVjNCB0MSA9IHRleHR1cmUyRCggbHRjXzEsIHV2ICk7XG5cdFx0dmVjNCB0MiA9IHRleHR1cmUyRCggbHRjXzIsIHV2ICk7XG5cdFx0bWF0MyBtSW52ID0gbWF0Myhcblx0XHRcdHZlYzMoIHQxLngsIDAsIHQxLnkgKSxcblx0XHRcdHZlYzMoICAgIDAsIDEsICAgIDAgKSxcblx0XHRcdHZlYzMoIHQxLnosIDAsIHQxLncgKVxuXHRcdCk7XG5cdFx0dmVjMyBmcmVzbmVsID0gKCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICogdDIueCArICggdmVjMyggMS4wICkgLSBtYXRlcmlhbC5zcGVjdWxhckNvbG9yICkgKiB0Mi55ICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gbGlnaHRDb2xvciAqIGZyZXNuZWwgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1JbnYsIHJlY3RDb29yZHMgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9IGxpZ2h0Q29sb3IgKiBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiBMVENfRXZhbHVhdGUoIG5vcm1hbCwgdmlld0RpciwgcG9zaXRpb24sIG1hdDMoIDEuMCApLCByZWN0Q29vcmRzICk7XG5cdH1cbiNlbmRpZlxudm9pZCBSRV9EaXJlY3RfUGh5c2ljYWwoIGNvbnN0IGluIEluY2lkZW50TGlnaHQgZGlyZWN0TGlnaHQsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ICkge1xuXHRmbG9hdCBkb3ROTCA9IHNhdHVyYXRlKCBkb3QoIGdlb21ldHJ5Lm5vcm1hbCwgZGlyZWN0TGlnaHQuZGlyZWN0aW9uICkgKTtcblx0dmVjMyBpcnJhZGlhbmNlID0gZG90TkwgKiBkaXJlY3RMaWdodC5jb2xvcjtcblx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0aXJyYWRpYW5jZSAqPSBQSTtcblx0I2VuZGlmXG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5MID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBkaXJlY3RMaWdodC5kaXJlY3Rpb24gKSApO1xuXHRcdHZlYzMgY2NJcnJhZGlhbmNlID0gY2NEb3ROTCAqIGRpcmVjdExpZ2h0LmNvbG9yO1xuXHRcdCNpZm5kZWYgUEhZU0lDQUxMWV9DT1JSRUNUX0xJR0hUU1xuXHRcdFx0Y2NJcnJhZGlhbmNlICo9IFBJO1xuXHRcdCNlbmRpZlxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiA9IG1hdGVyaWFsLmNsZWFyY29hdCAqIGNsZWFyY29hdERIUkFwcHJveCggbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBjY0RvdE5MICk7XG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0U3BlY3VsYXIgKz0gY2NJcnJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1goIGRpcmVjdExpZ2h0LCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5jbGVhcmNvYXROb3JtYWwsIHZlYzMoIERFRkFVTFRfU1BFQ1VMQVJfQ09FRkZJQ0lFTlQgKSwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzICk7XG5cdCNlbHNlXG5cdFx0ZmxvYXQgY2xlYXJjb2F0REhSID0gMC4wO1xuXHQjZW5kaWZcblx0I2lmZGVmIFVTRV9TSEVFTlxuXHRcdHJlZmxlY3RlZExpZ2h0LmRpcmVjdFNwZWN1bGFyICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9TcGVjdWxhcl9TaGVlbihcblx0XHRcdG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLFxuXHRcdFx0ZGlyZWN0TGlnaHQuZGlyZWN0aW9uLFxuXHRcdFx0Z2VvbWV0cnksXG5cdFx0XHRtYXRlcmlhbC5zaGVlbkNvbG9yXG5cdFx0KTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArPSAoIDEuMCAtIGNsZWFyY29hdERIUiApICogaXJyYWRpYW5jZSAqIEJSREZfU3BlY3VsYXJfR0dYKCBkaXJlY3RMaWdodCwgZ2VvbWV0cnkudmlld0RpciwgZ2VvbWV0cnkubm9ybWFsLCBtYXRlcmlhbC5zcGVjdWxhckNvbG9yLCBtYXRlcmlhbC5zcGVjdWxhclJvdWdobmVzcyk7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICs9ICggMS4wIC0gY2xlYXJjb2F0REhSICkgKiBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdERpZmZ1c2VfUGh5c2ljYWwoIGNvbnN0IGluIHZlYzMgaXJyYWRpYW5jZSwgY29uc3QgaW4gR2VvbWV0cmljQ29udGV4dCBnZW9tZXRyeSwgY29uc3QgaW4gUGh5c2ljYWxNYXRlcmlhbCBtYXRlcmlhbCwgaW5vdXQgUmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgKSB7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArPSBpcnJhZGlhbmNlICogQlJERl9EaWZmdXNlX0xhbWJlcnQoIG1hdGVyaWFsLmRpZmZ1c2VDb2xvciApO1xufVxudm9pZCBSRV9JbmRpcmVjdFNwZWN1bGFyX1BoeXNpY2FsKCBjb25zdCBpbiB2ZWMzIHJhZGlhbmNlLCBjb25zdCBpbiB2ZWMzIGlycmFkaWFuY2UsIGNvbnN0IGluIHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UsIGNvbnN0IGluIEdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnksIGNvbnN0IGluIFBoeXNpY2FsTWF0ZXJpYWwgbWF0ZXJpYWwsIGlub3V0IFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0KSB7XG5cdCNpZmRlZiBDTEVBUkNPQVRcblx0XHRmbG9hdCBjY0RvdE5WID0gc2F0dXJhdGUoIGRvdCggZ2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsLCBnZW9tZXRyeS52aWV3RGlyICkgKTtcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdFNwZWN1bGFyICs9IGNsZWFyY29hdFJhZGlhbmNlICogbWF0ZXJpYWwuY2xlYXJjb2F0ICogQlJERl9TcGVjdWxhcl9HR1hfRW52aXJvbm1lbnQoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgdmVjMyggREVGQVVMVF9TUEVDVUxBUl9DT0VGRklDSUVOVCApLCBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgKTtcblx0XHRmbG9hdCBjY0RvdE5MID0gY2NEb3ROVjtcblx0XHRmbG9hdCBjbGVhcmNvYXRESFIgPSBtYXRlcmlhbC5jbGVhcmNvYXQgKiBjbGVhcmNvYXRESFJBcHByb3goIG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzcywgY2NEb3ROTCApO1xuXHQjZWxzZVxuXHRcdGZsb2F0IGNsZWFyY29hdERIUiA9IDAuMDtcblx0I2VuZGlmXG5cdGZsb2F0IGNsZWFyY29hdEludiA9IDEuMCAtIGNsZWFyY29hdERIUjtcblx0dmVjMyBzaW5nbGVTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XG5cdHZlYzMgbXVsdGlTY2F0dGVyaW5nID0gdmVjMyggMC4wICk7XG5cdHZlYzMgY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlID0gaXJyYWRpYW5jZSAqIFJFQ0lQUk9DQUxfUEk7XG5cdEJSREZfU3BlY3VsYXJfTXVsdGlzY2F0dGVyaW5nX0Vudmlyb25tZW50KCBnZW9tZXRyeSwgbWF0ZXJpYWwuc3BlY3VsYXJDb2xvciwgbWF0ZXJpYWwuc3BlY3VsYXJSb3VnaG5lc3MsIHNpbmdsZVNjYXR0ZXJpbmcsIG11bHRpU2NhdHRlcmluZyApO1xuXHR2ZWMzIGRpZmZ1c2UgPSBtYXRlcmlhbC5kaWZmdXNlQ29sb3IgKiAoIDEuMCAtICggc2luZ2xlU2NhdHRlcmluZyArIG11bHRpU2NhdHRlcmluZyApICk7XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKz0gY2xlYXJjb2F0SW52ICogcmFkaWFuY2UgKiBzaW5nbGVTY2F0dGVyaW5nO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gbXVsdGlTY2F0dGVyaW5nICogY29zaW5lV2VpZ2h0ZWRJcnJhZGlhbmNlO1xuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gZGlmZnVzZSAqIGNvc2luZVdlaWdodGVkSXJyYWRpYW5jZTtcbn1cbiNkZWZpbmUgUkVfRGlyZWN0XHRcdFx0XHRSRV9EaXJlY3RfUGh5c2ljYWxcbiNkZWZpbmUgUkVfRGlyZWN0X1JlY3RBcmVhXHRcdFJFX0RpcmVjdF9SZWN0QXJlYV9QaHlzaWNhbFxuI2RlZmluZSBSRV9JbmRpcmVjdERpZmZ1c2VcdFx0UkVfSW5kaXJlY3REaWZmdXNlX1BoeXNpY2FsXG4jZGVmaW5lIFJFX0luZGlyZWN0U3BlY3VsYXJcdFx0UkVfSW5kaXJlY3RTcGVjdWxhcl9QaHlzaWNhbFxuZmxvYXQgY29tcHV0ZVNwZWN1bGFyT2NjbHVzaW9uKCBjb25zdCBpbiBmbG9hdCBkb3ROViwgY29uc3QgaW4gZmxvYXQgYW1iaWVudE9jY2x1c2lvbiwgY29uc3QgaW4gZmxvYXQgcm91Z2huZXNzICkge1xuXHRyZXR1cm4gc2F0dXJhdGUoIHBvdyggZG90TlYgKyBhbWJpZW50T2NjbHVzaW9uLCBleHAyKCAtIDE2LjAgKiByb3VnaG5lc3MgLSAxLjAgKSApIC0gMS4wICsgYW1iaWVudE9jY2x1c2lvbiApO1xufSI7CgogICAgdmFyIGxpZ2h0c19mcmFnbWVudF9iZWdpbiA9ICJcbkdlb21ldHJpY0NvbnRleHQgZ2VvbWV0cnk7XG5nZW9tZXRyeS5wb3NpdGlvbiA9IC0gdlZpZXdQb3NpdGlvbjtcbmdlb21ldHJ5Lm5vcm1hbCA9IG5vcm1hbDtcbmdlb21ldHJ5LnZpZXdEaXIgPSBub3JtYWxpemUoIHZWaWV3UG9zaXRpb24gKTtcbiNpZmRlZiBDTEVBUkNPQVRcblx0Z2VvbWV0cnkuY2xlYXJjb2F0Tm9ybWFsID0gY2xlYXJjb2F0Tm9ybWFsO1xuI2VuZGlmXG5JbmNpZGVudExpZ2h0IGRpcmVjdExpZ2h0O1xuI2lmICggTlVNX1BPSU5UX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHRQb2ludExpZ2h0IHBvaW50TGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1BPSU5UX0xJR0hUUzsgaSArKyApIHtcblx0XHRwb2ludExpZ2h0ID0gcG9pbnRMaWdodHNbIGkgXTtcblx0XHRnZXRQb2ludERpcmVjdExpZ2h0SXJyYWRpYW5jZSggcG9pbnRMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyApXG5cdFx0ZGlyZWN0TGlnaHQuY29sb3IgKj0gYWxsKCBidmVjMiggcG9pbnRMaWdodC5zaGFkb3csIGRpcmVjdExpZ2h0LnZpc2libGUgKSApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fU1BPVF9MSUdIVFMgPiAwICkgJiYgZGVmaW5lZCggUkVfRGlyZWN0IClcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVFM7IGkgKysgKSB7XG5cdFx0c3BvdExpZ2h0ID0gc3BvdExpZ2h0c1sgaSBdO1xuXHRcdGdldFNwb3REaXJlY3RMaWdodElycmFkaWFuY2UoIHNwb3RMaWdodCwgZ2VvbWV0cnksIGRpcmVjdExpZ2h0ICk7XG5cdFx0I2lmIGRlZmluZWQoIFVTRV9TSEFET1dNQVAgKSAmJiAoIFVOUk9MTEVEX0xPT1BfSU5ERVggPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBzcG90TGlnaHQuc2hhZG93LCBkaXJlY3RMaWdodC52aXNpYmxlICkgKSA/IGdldFNoYWRvdyggc3BvdFNoYWRvd01hcFsgaSBdLCBzcG90TGlnaHQuc2hhZG93TWFwU2l6ZSwgc3BvdExpZ2h0LnNoYWRvd0JpYXMsIHNwb3RMaWdodC5zaGFkb3dSYWRpdXMsIHZTcG90U2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fRElSX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3QgKVxuXHREaXJlY3Rpb25hbExpZ2h0IGRpcmVjdGlvbmFsTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0RJUl9MSUdIVFM7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0Z2V0RGlyZWN0aW9uYWxEaXJlY3RMaWdodElycmFkaWFuY2UoIGRpcmVjdGlvbmFsTGlnaHQsIGdlb21ldHJ5LCBkaXJlY3RMaWdodCApO1xuXHRcdCNpZiBkZWZpbmVkKCBVU0VfU0hBRE9XTUFQICkgJiYgKCBVTlJPTExFRF9MT09QX0lOREVYIDwgTlVNX0RJUl9MSUdIVF9TSEFET1dTIClcblx0XHRkaXJlY3RMaWdodC5jb2xvciAqPSBhbGwoIGJ2ZWMyKCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvdywgZGlyZWN0TGlnaHQudmlzaWJsZSApICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHRcdCNlbmRpZlxuXHRcdFJFX0RpcmVjdCggZGlyZWN0TGlnaHQsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcmVmbGVjdGVkTGlnaHQgKTtcblx0fVxuI2VuZGlmXG4jaWYgKCBOVU1fUkVDVF9BUkVBX0xJR0hUUyA+IDAgKSAmJiBkZWZpbmVkKCBSRV9EaXJlY3RfUmVjdEFyZWEgKVxuXHRSZWN0QXJlYUxpZ2h0IHJlY3RBcmVhTGlnaHQ7XG5cdCNwcmFnbWEgdW5yb2xsX2xvb3Bcblx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX1JFQ1RfQVJFQV9MSUdIVFM7IGkgKysgKSB7XG5cdFx0cmVjdEFyZWFMaWdodCA9IHJlY3RBcmVhTGlnaHRzWyBpIF07XG5cdFx0UkVfRGlyZWN0X1JlY3RBcmVhKCByZWN0QXJlYUxpZ2h0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHJlZmxlY3RlZExpZ2h0ICk7XG5cdH1cbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdHZlYzMgaWJsSXJyYWRpYW5jZSA9IHZlYzMoIDAuMCApO1xuXHR2ZWMzIGlycmFkaWFuY2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHRpcnJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJcnJhZGlhbmNlKCBsaWdodFByb2JlLCBnZW9tZXRyeSApO1xuXHQjaWYgKCBOVU1fSEVNSV9MSUdIVFMgPiAwIClcblx0XHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdFx0Zm9yICggaW50IGkgPSAwOyBpIDwgTlVNX0hFTUlfTElHSFRTOyBpICsrICkge1xuXHRcdFx0aXJyYWRpYW5jZSArPSBnZXRIZW1pc3BoZXJlTGlnaHRJcnJhZGlhbmNlKCBoZW1pc3BoZXJlTGlnaHRzWyBpIF0sIGdlb21ldHJ5ICk7XG5cdFx0fVxuXHQjZW5kaWZcbiNlbmRpZlxuI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0U3BlY3VsYXIgKVxuXHR2ZWMzIHJhZGlhbmNlID0gdmVjMyggMC4wICk7XG5cdHZlYzMgY2xlYXJjb2F0UmFkaWFuY2UgPSB2ZWMzKCAwLjAgKTtcbiNlbmRpZiI7CgogICAgdmFyIGxpZ2h0c19mcmFnbWVudF9tYXBzID0gIiNpZiBkZWZpbmVkKCBSRV9JbmRpcmVjdERpZmZ1c2UgKVxuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0dmVjMyBsaWdodE1hcElycmFkaWFuY2UgPSB0ZXh0dXJlMkQoIGxpZ2h0TWFwLCB2VXYyICkueHl6ICogbGlnaHRNYXBJbnRlbnNpdHk7XG5cdFx0I2lmbmRlZiBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTXG5cdFx0XHRsaWdodE1hcElycmFkaWFuY2UgKj0gUEk7XG5cdFx0I2VuZGlmXG5cdFx0aXJyYWRpYW5jZSArPSBsaWdodE1hcElycmFkaWFuY2U7XG5cdCNlbmRpZlxuXHQjaWYgZGVmaW5lZCggVVNFX0VOVk1BUCApICYmIGRlZmluZWQoIFNUQU5EQVJEICkgJiYgZGVmaW5lZCggRU5WTUFQX1RZUEVfQ1VCRV9VViApXG5cdFx0aWJsSXJyYWRpYW5jZSArPSBnZXRMaWdodFByb2JlSW5kaXJlY3RJcnJhZGlhbmNlKCBnZW9tZXRyeSwgbWF4TWlwTGV2ZWwgKTtcblx0I2VuZGlmXG4jZW5kaWZcbiNpZiBkZWZpbmVkKCBVU0VfRU5WTUFQICkgJiYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdHJhZGlhbmNlICs9IGdldExpZ2h0UHJvYmVJbmRpcmVjdFJhZGlhbmNlKCBnZW9tZXRyeS52aWV3RGlyLCBnZW9tZXRyeS5ub3JtYWwsIG1hdGVyaWFsLnNwZWN1bGFyUm91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjaWZkZWYgQ0xFQVJDT0FUXG5cdFx0Y2xlYXJjb2F0UmFkaWFuY2UgKz0gZ2V0TGlnaHRQcm9iZUluZGlyZWN0UmFkaWFuY2UoIGdlb21ldHJ5LnZpZXdEaXIsIGdlb21ldHJ5LmNsZWFyY29hdE5vcm1hbCwgbWF0ZXJpYWwuY2xlYXJjb2F0Um91Z2huZXNzLCBtYXhNaXBMZXZlbCApO1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIGxpZ2h0c19mcmFnbWVudF9lbmQgPSAiI2lmIGRlZmluZWQoIFJFX0luZGlyZWN0RGlmZnVzZSApXG5cdFJFX0luZGlyZWN0RGlmZnVzZSggaXJyYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmXG4jaWYgZGVmaW5lZCggUkVfSW5kaXJlY3RTcGVjdWxhciApXG5cdFJFX0luZGlyZWN0U3BlY3VsYXIoIHJhZGlhbmNlLCBpYmxJcnJhZGlhbmNlLCBjbGVhcmNvYXRSYWRpYW5jZSwgZ2VvbWV0cnksIG1hdGVyaWFsLCByZWZsZWN0ZWRMaWdodCApO1xuI2VuZGlmIjsKCiAgICB2YXIgbG9nZGVwdGhidWZfZnJhZ21lbnQgPSAiI2lmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRiApICYmIGRlZmluZWQoIFVTRV9MT0dERVBUSEJVRl9FWFQgKVxuXHRnbF9GcmFnRGVwdGhFWFQgPSBsb2cyKCB2RnJhZ0RlcHRoICkgKiBsb2dEZXB0aEJ1ZkZDICogMC41O1xuI2VuZGlmIjsKCiAgICB2YXIgbG9nZGVwdGhidWZfcGFyc19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGICkgJiYgZGVmaW5lZCggVVNFX0xPR0RFUFRIQlVGX0VYVCApXG5cdHVuaWZvcm0gZmxvYXQgbG9nRGVwdGhCdWZGQztcblx0dmFyeWluZyBmbG9hdCB2RnJhZ0RlcHRoO1xuI2VuZGlmIjsKCiAgICB2YXIgbG9nZGVwdGhidWZfcGFyc192ZXJ0ZXggPSAiI2lmZGVmIFVTRV9MT0dERVBUSEJVRlxuXHQjaWZkZWYgVVNFX0xPR0RFUFRIQlVGX0VYVFxuXHRcdHZhcnlpbmcgZmxvYXQgdkZyYWdEZXB0aDtcblx0I2Vsc2Vcblx0XHR1bmlmb3JtIGZsb2F0IGxvZ0RlcHRoQnVmRkM7XG5cdCNlbmRpZlxuI2VuZGlmIjsKCiAgICB2YXIgbG9nZGVwdGhidWZfdmVydGV4ID0gIiNpZmRlZiBVU0VfTE9HREVQVEhCVUZcblx0I2lmZGVmIFVTRV9MT0dERVBUSEJVRl9FWFRcblx0XHR2RnJhZ0RlcHRoID0gMS4wICsgZ2xfUG9zaXRpb24udztcblx0I2Vsc2Vcblx0XHRnbF9Qb3NpdGlvbi56ID0gbG9nMiggbWF4KCBFUFNJTE9OLCBnbF9Qb3NpdGlvbi53ICsgMS4wICkgKSAqIGxvZ0RlcHRoQnVmRkMgLSAxLjA7XG5cdFx0Z2xfUG9zaXRpb24ueiAqPSBnbF9Qb3NpdGlvbi53O1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIG1hcF9mcmFnbWVudCA9ICIjaWZkZWYgVVNFX01BUFxuXHR2ZWM0IHRleGVsQ29sb3IgPSB0ZXh0dXJlMkQoIG1hcCwgdlV2ICk7XG5cdHRleGVsQ29sb3IgPSBtYXBUZXhlbFRvTGluZWFyKCB0ZXhlbENvbG9yICk7XG5cdGRpZmZ1c2VDb2xvciAqPSB0ZXhlbENvbG9yO1xuI2VuZGlmIjsKCiAgICB2YXIgbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xuI2VuZGlmIjsKCiAgICB2YXIgbWFwX3BhcnRpY2xlX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfTUFQXG5cdHZlYzIgdXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggZ2xfUG9pbnRDb29yZC54LCAxLjAgLSBnbF9Qb2ludENvb3JkLnksIDEgKSApLnh5O1xuXHR2ZWM0IG1hcFRleGVsID0gdGV4dHVyZTJEKCBtYXAsIHV2ICk7XG5cdGRpZmZ1c2VDb2xvciAqPSBtYXBUZXhlbFRvTGluZWFyKCBtYXBUZXhlbCApO1xuI2VuZGlmIjsKCiAgICB2YXIgbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9NQVBcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuXHR1bmlmb3JtIHNhbXBsZXIyRCBtYXA7XG4jZW5kaWYiOwoKICAgIHZhciBtZXRhbG5lc3NtYXBfZnJhZ21lbnQgPSAiZmxvYXQgbWV0YWxuZXNzRmFjdG9yID0gbWV0YWxuZXNzO1xuI2lmZGVmIFVTRV9NRVRBTE5FU1NNQVBcblx0dmVjNCB0ZXhlbE1ldGFsbmVzcyA9IHRleHR1cmUyRCggbWV0YWxuZXNzTWFwLCB2VXYgKTtcblx0bWV0YWxuZXNzRmFjdG9yICo9IHRleGVsTWV0YWxuZXNzLmI7XG4jZW5kaWYiOwoKICAgIHZhciBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX01FVEFMTkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCBtZXRhbG5lc3NNYXA7XG4jZW5kaWYiOwoKICAgIHZhciBtb3JwaG5vcm1hbF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFNcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwwIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwxIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDEgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwyIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDIgXTtcblx0b2JqZWN0Tm9ybWFsICs9ICggbW9ycGhOb3JtYWwzIC0gbm9ybWFsICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcbiNlbmRpZiI7CgogICAgdmFyIG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTXG5cdCNpZm5kZWYgVVNFX01PUlBITk9STUFMU1xuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgOCBdO1xuXHQjZWxzZVxuXHR1bmlmb3JtIGZsb2F0IG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIG1vcnBodGFyZ2V0X3ZlcnRleCA9ICIjaWZkZWYgVVNFX01PUlBIVEFSR0VUU1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MCAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDAgXTtcblx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDEgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyAxIF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQyIC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgMiBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0MyAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDMgXTtcblx0I2lmbmRlZiBVU0VfTU9SUEhOT1JNQUxTXG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ0IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNCBdO1xuXHR0cmFuc2Zvcm1lZCArPSAoIG1vcnBoVGFyZ2V0NSAtIHBvc2l0aW9uICkgKiBtb3JwaFRhcmdldEluZmx1ZW5jZXNbIDUgXTtcblx0dHJhbnNmb3JtZWQgKz0gKCBtb3JwaFRhcmdldDYgLSBwb3NpdGlvbiApICogbW9ycGhUYXJnZXRJbmZsdWVuY2VzWyA2IF07XG5cdHRyYW5zZm9ybWVkICs9ICggbW9ycGhUYXJnZXQ3IC0gcG9zaXRpb24gKSAqIG1vcnBoVGFyZ2V0SW5mbHVlbmNlc1sgNyBdO1xuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIG5vcm1hbF9mcmFnbWVudF9iZWdpbiA9ICIjaWZkZWYgRkxBVF9TSEFERURcblx0dmVjMyBmZHggPSB2ZWMzKCBkRmR4KCB2Vmlld1Bvc2l0aW9uLnggKSwgZEZkeCggdlZpZXdQb3NpdGlvbi55ICksIGRGZHgoIHZWaWV3UG9zaXRpb24ueiApICk7XG5cdHZlYzMgZmR5ID0gdmVjMyggZEZkeSggdlZpZXdQb3NpdGlvbi54ICksIGRGZHkoIHZWaWV3UG9zaXRpb24ueSApLCBkRmR5KCB2Vmlld1Bvc2l0aW9uLnogKSApO1xuXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggY3Jvc3MoIGZkeCwgZmR5ICkgKTtcbiNlbHNlXG5cdHZlYzMgbm9ybWFsID0gbm9ybWFsaXplKCB2Tm9ybWFsICk7XG5cdCNpZmRlZiBET1VCTEVfU0lERURcblx0XHRub3JtYWwgPSBub3JtYWwgKiAoIGZsb2F0KCBnbF9Gcm9udEZhY2luZyApICogMi4wIC0gMS4wICk7XG5cdCNlbmRpZlxuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2ZWMzIHRhbmdlbnQgPSBub3JtYWxpemUoIHZUYW5nZW50ICk7XG5cdFx0dmVjMyBiaXRhbmdlbnQgPSBub3JtYWxpemUoIHZCaXRhbmdlbnQgKTtcblx0XHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0XHR0YW5nZW50ID0gdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHRcdGJpdGFuZ2VudCA9IGJpdGFuZ2VudCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0XHQjZW5kaWZcblx0I2VuZGlmXG4jZW5kaWZcbnZlYzMgZ2VvbWV0cnlOb3JtYWwgPSBub3JtYWw7IjsKCiAgICB2YXIgbm9ybWFsX2ZyYWdtZW50X21hcHMgPSAiI2lmZGVmIE9CSkVDVFNQQUNFX05PUk1BTE1BUFxuXHRub3JtYWwgPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHQjaWZkZWYgRkxJUF9TSURFRFxuXHRcdG5vcm1hbCA9IC0gbm9ybWFsO1xuXHQjZW5kaWZcblx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdG5vcm1hbCA9IG5vcm1hbCAqICggZmxvYXQoIGdsX0Zyb250RmFjaW5nICkgKiAyLjAgLSAxLjAgKTtcblx0I2VuZGlmXG5cdG5vcm1hbCA9IG5vcm1hbGl6ZSggbm9ybWFsTWF0cml4ICogbm9ybWFsICk7XG4jZWxpZiBkZWZpbmVkKCBUQU5HRU5UU1BBQ0VfTk9STUFMTUFQIClcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0bWF0MyB2VEJOID0gbWF0MyggdGFuZ2VudCwgYml0YW5nZW50LCBub3JtYWwgKTtcblx0XHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgPSBub3JtYWxTY2FsZSAqIG1hcE4ueHk7XG5cdFx0bm9ybWFsID0gbm9ybWFsaXplKCB2VEJOICogbWFwTiApO1xuXHQjZWxzZVxuXHRcdG5vcm1hbCA9IHBlcnR1cmJOb3JtYWwyQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBub3JtYWxTY2FsZSwgbm9ybWFsTWFwICk7XG5cdCNlbmRpZlxuI2VsaWYgZGVmaW5lZCggVVNFX0JVTVBNQVAgKVxuXHRub3JtYWwgPSBwZXJ0dXJiTm9ybWFsQXJiKCAtdlZpZXdQb3NpdGlvbiwgbm9ybWFsLCBkSGR4eV9md2QoKSApO1xuI2VuZGlmIjsKCiAgICB2YXIgbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgbm9ybWFsTWFwO1xuXHR1bmlmb3JtIHZlYzIgbm9ybWFsU2NhbGU7XG4jZW5kaWZcbiNpZmRlZiBPQkpFQ1RTUEFDRV9OT1JNQUxNQVBcblx0dW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDtcbiNlbmRpZlxuI2lmICEgZGVmaW5lZCAoIFVTRV9UQU5HRU5UICkgJiYgKCBkZWZpbmVkICggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApIHx8IGRlZmluZWQgKCBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCApIClcblx0dmVjMyBwZXJ0dXJiTm9ybWFsMkFyYiggdmVjMyBleWVfcG9zLCB2ZWMzIHN1cmZfbm9ybSwgdmVjMiBub3JtYWxTY2FsZSwgaW4gc2FtcGxlcjJEIG5vcm1hbE1hcCApIHtcblx0XHR2ZWMzIHEwID0gdmVjMyggZEZkeCggZXllX3Bvcy54ICksIGRGZHgoIGV5ZV9wb3MueSApLCBkRmR4KCBleWVfcG9zLnogKSApO1xuXHRcdHZlYzMgcTEgPSB2ZWMzKCBkRmR5KCBleWVfcG9zLnggKSwgZEZkeSggZXllX3Bvcy55ICksIGRGZHkoIGV5ZV9wb3MueiApICk7XG5cdFx0dmVjMiBzdDAgPSBkRmR4KCB2VXYuc3QgKTtcblx0XHR2ZWMyIHN0MSA9IGRGZHkoIHZVdi5zdCApO1xuXHRcdGZsb2F0IHNjYWxlID0gc2lnbiggc3QxLnQgKiBzdDAucyAtIHN0MC50ICogc3QxLnMgKTtcblx0XHR2ZWMzIFMgPSBub3JtYWxpemUoICggcTAgKiBzdDEudCAtIHExICogc3QwLnQgKSAqIHNjYWxlICk7XG5cdFx0dmVjMyBUID0gbm9ybWFsaXplKCAoIC0gcTAgKiBzdDEucyArIHExICogc3QwLnMgKSAqIHNjYWxlICk7XG5cdFx0dmVjMyBOID0gbm9ybWFsaXplKCBzdXJmX25vcm0gKTtcblx0XHR2ZWMzIG1hcE4gPSB0ZXh0dXJlMkQoIG5vcm1hbE1hcCwgdlV2ICkueHl6ICogMi4wIC0gMS4wO1xuXHRcdG1hcE4ueHkgKj0gbm9ybWFsU2NhbGU7XG5cdFx0I2lmZGVmIERPVUJMRV9TSURFRFxuXHRcdFx0dmVjMyBOZnJvbVNUID0gY3Jvc3MoIFMsIFQgKTtcblx0XHRcdGlmKCBkb3QoIE5mcm9tU1QsIE4gKSA+IDAuMCApIHtcblx0XHRcdFx0UyAqPSAtMS4wO1xuXHRcdFx0XHRUICo9IC0xLjA7XG5cdFx0XHR9XG5cdFx0I2Vsc2Vcblx0XHRcdG1hcE4ueHkgKj0gKCBmbG9hdCggZ2xfRnJvbnRGYWNpbmcgKSAqIDIuMCAtIDEuMCApO1xuXHRcdCNlbmRpZlxuXHRcdG1hdDMgdHNuID0gbWF0MyggUywgVCwgTiApO1xuXHRcdHJldHVybiBub3JtYWxpemUoIHRzbiAqIG1hcE4gKTtcblx0fVxuI2VuZGlmIjsKCiAgICB2YXIgY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbiA9ICIjaWZkZWYgQ0xFQVJDT0FUXG5cdHZlYzMgY2xlYXJjb2F0Tm9ybWFsID0gZ2VvbWV0cnlOb3JtYWw7XG4jZW5kaWYiOwoKICAgIHZhciBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X21hcHMgPSAiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdG1hdDMgdlRCTiA9IG1hdDMoIHRhbmdlbnQsIGJpdGFuZ2VudCwgY2xlYXJjb2F0Tm9ybWFsICk7XG5cdFx0dmVjMyBtYXBOID0gdGV4dHVyZTJEKCBub3JtYWxNYXAsIHZVdiApLnh5eiAqIDIuMCAtIDEuMDtcblx0XHRtYXBOLnh5ID0gY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKiBtYXBOLnh5O1xuXHRcdGNsZWFyY29hdE5vcm1hbCA9IG5vcm1hbGl6ZSggdlRCTiAqIG1hcE4gKTtcblx0I2Vsc2Vcblx0XHRjbGVhcmNvYXROb3JtYWwgPSBwZXJ0dXJiTm9ybWFsMkFyYiggLSB2Vmlld1Bvc2l0aW9uLCBjbGVhcmNvYXROb3JtYWwsIGNsZWFyY29hdE5vcm1hbFNjYWxlLCBjbGVhcmNvYXROb3JtYWxNYXAgKTtcblx0I2VuZGlmXG4jZW5kaWYiOwoKICAgIHZhciBjbGVhcmNvYXRfbm9ybWFsbWFwX3BhcnNfZnJhZ21lbnQgPSAiI2lmZGVmIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQXG5cdHVuaWZvcm0gc2FtcGxlcjJEIGNsZWFyY29hdE5vcm1hbE1hcDtcblx0dW5pZm9ybSB2ZWMyIGNsZWFyY29hdE5vcm1hbFNjYWxlO1xuI2VuZGlmIjsKCiAgICB2YXIgcGFja2luZyA9ICJ2ZWMzIHBhY2tOb3JtYWxUb1JHQiggY29uc3QgaW4gdmVjMyBub3JtYWwgKSB7XG5cdHJldHVybiBub3JtYWxpemUoIG5vcm1hbCApICogMC41ICsgMC41O1xufVxudmVjMyB1bnBhY2tSR0JUb05vcm1hbCggY29uc3QgaW4gdmVjMyByZ2IgKSB7XG5cdHJldHVybiAyLjAgKiByZ2IueHl6IC0gMS4wO1xufVxuY29uc3QgZmxvYXQgUGFja1Vwc2NhbGUgPSAyNTYuIC8gMjU1Ljtjb25zdCBmbG9hdCBVbnBhY2tEb3duc2NhbGUgPSAyNTUuIC8gMjU2LjtcbmNvbnN0IHZlYzMgUGFja0ZhY3RvcnMgPSB2ZWMzKCAyNTYuICogMjU2LiAqIDI1Ni4sIDI1Ni4gKiAyNTYuLCAgMjU2LiApO1xuY29uc3QgdmVjNCBVbnBhY2tGYWN0b3JzID0gVW5wYWNrRG93bnNjYWxlIC8gdmVjNCggUGFja0ZhY3RvcnMsIDEuICk7XG5jb25zdCBmbG9hdCBTaGlmdFJpZ2h0OCA9IDEuIC8gMjU2LjtcbnZlYzQgcGFja0RlcHRoVG9SR0JBKCBjb25zdCBpbiBmbG9hdCB2ICkge1xuXHR2ZWM0IHIgPSB2ZWM0KCBmcmFjdCggdiAqIFBhY2tGYWN0b3JzICksIHYgKTtcblx0ci55encgLT0gci54eXogKiBTaGlmdFJpZ2h0ODtcdHJldHVybiByICogUGFja1Vwc2NhbGU7XG59XG5mbG9hdCB1bnBhY2tSR0JBVG9EZXB0aCggY29uc3QgaW4gdmVjNCB2ICkge1xuXHRyZXR1cm4gZG90KCB2LCBVbnBhY2tGYWN0b3JzICk7XG59XG52ZWM0IGVuY29kZUhhbGZSR0JBICggdmVjMiB2ICkge1xuXHR2ZWM0IGVuY29kZWQgPSB2ZWM0KCAwLjAgKTtcblx0Y29uc3QgdmVjMiBvZmZzZXQgPSB2ZWMyKCAxLjAgLyAyNTUuMCwgMC4wICk7XG5cdGVuY29kZWQueHkgPSB2ZWMyKCB2LngsIGZyYWN0KCB2LnggKiAyNTUuMCApICk7XG5cdGVuY29kZWQueHkgPSBlbmNvZGVkLnh5IC0gKCBlbmNvZGVkLnl5ICogb2Zmc2V0ICk7XG5cdGVuY29kZWQuencgPSB2ZWMyKCB2LnksIGZyYWN0KCB2LnkgKiAyNTUuMCApICk7XG5cdGVuY29kZWQuencgPSBlbmNvZGVkLnp3IC0gKCBlbmNvZGVkLnd3ICogb2Zmc2V0ICk7XG5cdHJldHVybiBlbmNvZGVkO1xufVxudmVjMiBkZWNvZGVIYWxmUkdCQSggdmVjNCB2ICkge1xuXHRyZXR1cm4gdmVjMiggdi54ICsgKCB2LnkgLyAyNTUuMCApLCB2LnogKyAoIHYudyAvIDI1NS4wICkgKTtcbn1cbmZsb2F0IHZpZXdaVG9PcnRob2dyYXBoaWNEZXB0aCggY29uc3QgaW4gZmxvYXQgdmlld1osIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuICggdmlld1ogKyBuZWFyICkgLyAoIG5lYXIgLSBmYXIgKTtcbn1cbmZsb2F0IG9ydGhvZ3JhcGhpY0RlcHRoVG9WaWV3WiggY29uc3QgaW4gZmxvYXQgbGluZWFyQ2xpcFosIGNvbnN0IGluIGZsb2F0IG5lYXIsIGNvbnN0IGluIGZsb2F0IGZhciApIHtcblx0cmV0dXJuIGxpbmVhckNsaXBaICogKCBuZWFyIC0gZmFyICkgLSBuZWFyO1xufVxuZmxvYXQgdmlld1pUb1BlcnNwZWN0aXZlRGVwdGgoIGNvbnN0IGluIGZsb2F0IHZpZXdaLCBjb25zdCBpbiBmbG9hdCBuZWFyLCBjb25zdCBpbiBmbG9hdCBmYXIgKSB7XG5cdHJldHVybiAoKCBuZWFyICsgdmlld1ogKSAqIGZhciApIC8gKCggZmFyIC0gbmVhciApICogdmlld1ogKTtcbn1cbmZsb2F0IHBlcnNwZWN0aXZlRGVwdGhUb1ZpZXdaKCBjb25zdCBpbiBmbG9hdCBpbnZDbGlwWiwgY29uc3QgaW4gZmxvYXQgbmVhciwgY29uc3QgaW4gZmxvYXQgZmFyICkge1xuXHRyZXR1cm4gKCBuZWFyICogZmFyICkgLyAoICggZmFyIC0gbmVhciApICogaW52Q2xpcFogLSBmYXIgKTtcbn0iOwoKICAgIHZhciBwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50ID0gIiNpZmRlZiBQUkVNVUxUSVBMSUVEX0FMUEhBXG5cdGdsX0ZyYWdDb2xvci5yZ2IgKj0gZ2xfRnJhZ0NvbG9yLmE7XG4jZW5kaWYiOwoKICAgIHZhciBwcm9qZWN0X3ZlcnRleCA9ICJ2ZWM0IG12UG9zaXRpb24gPSBtb2RlbFZpZXdNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG5nbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uOyI7CgogICAgdmFyIGRpdGhlcmluZ19mcmFnbWVudCA9ICIjaWZkZWYgRElUSEVSSU5HXG5cdGdsX0ZyYWdDb2xvci5yZ2IgPSBkaXRoZXJpbmcoIGdsX0ZyYWdDb2xvci5yZ2IgKTtcbiNlbmRpZiI7CgogICAgdmFyIGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBESVRIRVJJTkdcblx0dmVjMyBkaXRoZXJpbmcoIHZlYzMgY29sb3IgKSB7XG5cdFx0ZmxvYXQgZ3JpZF9wb3NpdGlvbiA9IHJhbmQoIGdsX0ZyYWdDb29yZC54eSApO1xuXHRcdHZlYzMgZGl0aGVyX3NoaWZ0X1JHQiA9IHZlYzMoIDAuMjUgLyAyNTUuMCwgLTAuMjUgLyAyNTUuMCwgMC4yNSAvIDI1NS4wICk7XG5cdFx0ZGl0aGVyX3NoaWZ0X1JHQiA9IG1peCggMi4wICogZGl0aGVyX3NoaWZ0X1JHQiwgLTIuMCAqIGRpdGhlcl9zaGlmdF9SR0IsIGdyaWRfcG9zaXRpb24gKTtcblx0XHRyZXR1cm4gY29sb3IgKyBkaXRoZXJfc2hpZnRfUkdCO1xuXHR9XG4jZW5kaWYiOwoKICAgIHZhciByb3VnaG5lc3NtYXBfZnJhZ21lbnQgPSAiZmxvYXQgcm91Z2huZXNzRmFjdG9yID0gcm91Z2huZXNzO1xuI2lmZGVmIFVTRV9ST1VHSE5FU1NNQVBcblx0dmVjNCB0ZXhlbFJvdWdobmVzcyA9IHRleHR1cmUyRCggcm91Z2huZXNzTWFwLCB2VXYgKTtcblx0cm91Z2huZXNzRmFjdG9yICo9IHRleGVsUm91Z2huZXNzLmc7XG4jZW5kaWYiOwoKICAgIHZhciByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX1JPVUdITkVTU01BUFxuXHR1bmlmb3JtIHNhbXBsZXIyRCByb3VnaG5lc3NNYXA7XG4jZW5kaWYiOwoKICAgIHZhciBzaGFkb3dtYXBfcGFyc19mcmFnbWVudCA9ICIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gc2FtcGxlcjJEIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgc3BvdFNoYWRvd01hcFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHRcdHZhcnlpbmcgdmVjNCB2U3BvdFNoYWRvd0Nvb3JkWyBOVU1fU1BPVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBzYW1wbGVyMkQgcG9pbnRTaGFkb3dNYXBbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdFx0dmFyeWluZyB2ZWM0IHZQb2ludFNoYWRvd0Nvb3JkWyBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0ZmxvYXQgdGV4dHVyZTJEQ29tcGFyZSggc2FtcGxlcjJEIGRlcHRocywgdmVjMiB1diwgZmxvYXQgY29tcGFyZSApIHtcblx0XHRyZXR1cm4gc3RlcCggY29tcGFyZSwgdW5wYWNrUkdCQVRvRGVwdGgoIHRleHR1cmUyRCggZGVwdGhzLCB1diApICkgKTtcblx0fVxuXHR2ZWMyIHRleHR1cmUyRERpc3RyaWJ1dGlvbiggc2FtcGxlcjJEIHNoYWRvdywgdmVjMiB1diApIHtcblx0XHRyZXR1cm4gZGVjb2RlSGFsZlJHQkEoIHRleHR1cmUyRCggc2hhZG93LCB1diApICk7XG5cdH1cblx0ZmxvYXQgVlNNU2hhZG93IChzYW1wbGVyMkQgc2hhZG93LCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICl7XG5cdFx0ZmxvYXQgb2NjbHVzaW9uID0gMS4wO1xuXHRcdHZlYzIgZGlzdHJpYnV0aW9uID0gdGV4dHVyZTJERGlzdHJpYnV0aW9uKCBzaGFkb3csIHV2ICk7XG5cdFx0ZmxvYXQgaGFyZF9zaGFkb3cgPSBzdGVwKCBjb21wYXJlICwgZGlzdHJpYnV0aW9uLnggKTtcblx0XHRpZiAoaGFyZF9zaGFkb3cgIT0gMS4wICkge1xuXHRcdFx0ZmxvYXQgZGlzdGFuY2UgPSBjb21wYXJlIC0gZGlzdHJpYnV0aW9uLnggO1xuXHRcdFx0ZmxvYXQgdmFyaWFuY2UgPSBtYXgoIDAuMDAwMDAsIGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKTtcblx0XHRcdGZsb2F0IHNvZnRuZXNzX3Byb2JhYmlsaXR5ID0gdmFyaWFuY2UgLyAodmFyaWFuY2UgKyBkaXN0YW5jZSAqIGRpc3RhbmNlICk7XHRcdFx0c29mdG5lc3NfcHJvYmFiaWxpdHkgPSBjbGFtcCggKCBzb2Z0bmVzc19wcm9iYWJpbGl0eSAtIDAuMyApIC8gKCAwLjk1IC0gMC4zICksIDAuMCwgMS4wICk7XHRcdFx0b2NjbHVzaW9uID0gY2xhbXAoIG1heCggaGFyZF9zaGFkb3csIHNvZnRuZXNzX3Byb2JhYmlsaXR5ICksIDAuMCwgMS4wICk7XG5cdFx0fVxuXHRcdHJldHVybiBvY2NsdXNpb247XG5cdH1cblx0ZmxvYXQgdGV4dHVyZTJEU2hhZG93TGVycCggc2FtcGxlcjJEIGRlcHRocywgdmVjMiBzaXplLCB2ZWMyIHV2LCBmbG9hdCBjb21wYXJlICkge1xuXHRcdGNvbnN0IHZlYzIgb2Zmc2V0ID0gdmVjMiggMC4wLCAxLjAgKTtcblx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gc2l6ZTtcblx0XHR2ZWMyIGNlbnRyb2lkVVYgPSAoIGZsb29yKCB1diAqIHNpemUgLSAwLjUgKSArIDAuNSApICogdGV4ZWxTaXplO1xuXHRcdGZsb2F0IGxiID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnh4LCBjb21wYXJlICk7XG5cdFx0ZmxvYXQgbHQgPSB0ZXh0dXJlMkRDb21wYXJlKCBkZXB0aHMsIGNlbnRyb2lkVVYgKyB0ZXhlbFNpemUgKiBvZmZzZXQueHksIGNvbXBhcmUgKTtcblx0XHRmbG9hdCByYiA9IHRleHR1cmUyRENvbXBhcmUoIGRlcHRocywgY2VudHJvaWRVViArIHRleGVsU2l6ZSAqIG9mZnNldC55eCwgY29tcGFyZSApO1xuXHRcdGZsb2F0IHJ0ID0gdGV4dHVyZTJEQ29tcGFyZSggZGVwdGhzLCBjZW50cm9pZFVWICsgdGV4ZWxTaXplICogb2Zmc2V0Lnl5LCBjb21wYXJlICk7XG5cdFx0dmVjMiBmID0gZnJhY3QoIHV2ICogc2l6ZSArIDAuNSApO1xuXHRcdGZsb2F0IGEgPSBtaXgoIGxiLCBsdCwgZi55ICk7XG5cdFx0ZmxvYXQgYiA9IG1peCggcmIsIHJ0LCBmLnkgKTtcblx0XHRmbG9hdCBjID0gbWl4KCBhLCBiLCBmLnggKTtcblx0XHRyZXR1cm4gYztcblx0fVxuXHRmbG9hdCBnZXRTaGFkb3coIHNhbXBsZXIyRCBzaGFkb3dNYXAsIHZlYzIgc2hhZG93TWFwU2l6ZSwgZmxvYXQgc2hhZG93QmlhcywgZmxvYXQgc2hhZG93UmFkaXVzLCB2ZWM0IHNoYWRvd0Nvb3JkICkge1xuXHRcdGZsb2F0IHNoYWRvdyA9IDEuMDtcblx0XHRzaGFkb3dDb29yZC54eXogLz0gc2hhZG93Q29vcmQudztcblx0XHRzaGFkb3dDb29yZC56ICs9IHNoYWRvd0JpYXM7XG5cdFx0YnZlYzQgaW5GcnVzdHVtVmVjID0gYnZlYzQgKCBzaGFkb3dDb29yZC54ID49IDAuMCwgc2hhZG93Q29vcmQueCA8PSAxLjAsIHNoYWRvd0Nvb3JkLnkgPj0gMC4wLCBzaGFkb3dDb29yZC55IDw9IDEuMCApO1xuXHRcdGJvb2wgaW5GcnVzdHVtID0gYWxsKCBpbkZydXN0dW1WZWMgKTtcblx0XHRidmVjMiBmcnVzdHVtVGVzdFZlYyA9IGJ2ZWMyKCBpbkZydXN0dW0sIHNoYWRvd0Nvb3JkLnogPD0gMS4wICk7XG5cdFx0Ym9vbCBmcnVzdHVtVGVzdCA9IGFsbCggZnJ1c3R1bVRlc3RWZWMgKTtcblx0XHRpZiAoIGZydXN0dW1UZXN0ICkge1xuXHRcdCNpZiBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9QQ0YgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHgyID0gZHgwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkyID0gZHkwIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHgzID0gZHgxIC8gMi4wO1xuXHRcdFx0ZmxvYXQgZHkzID0gZHkxIC8gMi4wO1xuXHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgyLCBkeTIgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkyICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIGR5MiApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDMsIDAuMCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MiwgZHkzICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MyApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgzLCBkeTMgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MCwgZHkxICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCAwLjAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgxLCBkeTEgKSwgc2hhZG93Q29vcmQueiApXG5cdFx0XHQpICogKCAxLjAgLyAxNy4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKVxuXHRcdFx0dmVjMiB0ZXhlbFNpemUgPSB2ZWMyKCAxLjAgKSAvIHNoYWRvd01hcFNpemU7XG5cdFx0XHRmbG9hdCBkeDAgPSAtIHRleGVsU2l6ZS54ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0ZmxvYXQgZHkwID0gLSB0ZXhlbFNpemUueSAqIHNoYWRvd1JhZGl1cztcblx0XHRcdGZsb2F0IGR4MSA9ICsgdGV4ZWxTaXplLnggKiBzaGFkb3dSYWRpdXM7XG5cdFx0XHRmbG9hdCBkeTEgPSArIHRleGVsU2l6ZS55ICogc2hhZG93UmFkaXVzO1xuXHRcdFx0c2hhZG93ID0gKFxuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCBkeTAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIDAuMCwgZHkwICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDEsIGR5MCApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggZHgwLCAwLjAgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgMC4wICksIHNoYWRvd0Nvb3JkLnogKSArXG5cdFx0XHRcdHRleHR1cmUyRFNoYWRvd0xlcnAoIHNoYWRvd01hcCwgc2hhZG93TWFwU2l6ZSwgc2hhZG93Q29vcmQueHkgKyB2ZWMyKCBkeDAsIGR5MSApLCBzaGFkb3dDb29yZC56ICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRTaGFkb3dMZXJwKCBzaGFkb3dNYXAsIHNoYWRvd01hcFNpemUsIHNoYWRvd0Nvb3JkLnh5ICsgdmVjMiggMC4wLCBkeTEgKSwgc2hhZG93Q29vcmQueiApICtcblx0XHRcdFx0dGV4dHVyZTJEU2hhZG93TGVycCggc2hhZG93TWFwLCBzaGFkb3dNYXBTaXplLCBzaGFkb3dDb29yZC54eSArIHZlYzIoIGR4MSwgZHkxICksIHNoYWRvd0Nvb3JkLnogKVxuXHRcdFx0KSAqICggMS4wIC8gOS4wICk7XG5cdFx0I2VsaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfVlNNIClcblx0XHRcdHNoYWRvdyA9IFZTTVNoYWRvdyggc2hhZG93TWFwLCBzaGFkb3dDb29yZC54eSwgc2hhZG93Q29vcmQueiApO1xuXHRcdCNlbHNlXG5cdFx0XHRzaGFkb3cgPSB0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIHNoYWRvd0Nvb3JkLnh5LCBzaGFkb3dDb29yZC56ICk7XG5cdFx0I2VuZGlmXG5cdFx0fVxuXHRcdHJldHVybiBzaGFkb3c7XG5cdH1cblx0dmVjMiBjdWJlVG9VViggdmVjMyB2LCBmbG9hdCB0ZXhlbFNpemVZICkge1xuXHRcdHZlYzMgYWJzViA9IGFicyggdiApO1xuXHRcdGZsb2F0IHNjYWxlVG9DdWJlID0gMS4wIC8gbWF4KCBhYnNWLngsIG1heCggYWJzVi55LCBhYnNWLnogKSApO1xuXHRcdGFic1YgKj0gc2NhbGVUb0N1YmU7XG5cdFx0diAqPSBzY2FsZVRvQ3ViZSAqICggMS4wIC0gMi4wICogdGV4ZWxTaXplWSApO1xuXHRcdHZlYzIgcGxhbmFyID0gdi54eTtcblx0XHRmbG9hdCBhbG1vc3RBVGV4ZWwgPSAxLjUgKiB0ZXhlbFNpemVZO1xuXHRcdGZsb2F0IGFsbW9zdE9uZSA9IDEuMCAtIGFsbW9zdEFUZXhlbDtcblx0XHRpZiAoIGFic1YueiA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRpZiAoIHYueiA+IDAuMCApXG5cdFx0XHRcdHBsYW5hci54ID0gNC4wIC0gdi54O1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueCA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWCA9IHNpZ24oIHYueCApO1xuXHRcdFx0cGxhbmFyLnggPSB2LnogKiBzaWduWCArIDIuMCAqIHNpZ25YO1xuXHRcdH0gZWxzZSBpZiAoIGFic1YueSA+PSBhbG1vc3RPbmUgKSB7XG5cdFx0XHRmbG9hdCBzaWduWSA9IHNpZ24oIHYueSApO1xuXHRcdFx0cGxhbmFyLnggPSB2LnggKyAyLjAgKiBzaWduWSArIDIuMDtcblx0XHRcdHBsYW5hci55ID0gdi56ICogc2lnblkgLSAyLjA7XG5cdFx0fVxuXHRcdHJldHVybiB2ZWMyKCAwLjEyNSwgMC4yNSApICogcGxhbmFyICsgdmVjMiggMC4zNzUsIDAuNzUgKTtcblx0fVxuXHRmbG9hdCBnZXRQb2ludFNoYWRvdyggc2FtcGxlcjJEIHNoYWRvd01hcCwgdmVjMiBzaGFkb3dNYXBTaXplLCBmbG9hdCBzaGFkb3dCaWFzLCBmbG9hdCBzaGFkb3dSYWRpdXMsIHZlYzQgc2hhZG93Q29vcmQsIGZsb2F0IHNoYWRvd0NhbWVyYU5lYXIsIGZsb2F0IHNoYWRvd0NhbWVyYUZhciApIHtcblx0XHR2ZWMyIHRleGVsU2l6ZSA9IHZlYzIoIDEuMCApIC8gKCBzaGFkb3dNYXBTaXplICogdmVjMiggNC4wLCAyLjAgKSApO1xuXHRcdHZlYzMgbGlnaHRUb1Bvc2l0aW9uID0gc2hhZG93Q29vcmQueHl6O1xuXHRcdGZsb2F0IGRwID0gKCBsZW5ndGgoIGxpZ2h0VG9Qb3NpdGlvbiApIC0gc2hhZG93Q2FtZXJhTmVhciApIC8gKCBzaGFkb3dDYW1lcmFGYXIgLSBzaGFkb3dDYW1lcmFOZWFyICk7XHRcdGRwICs9IHNoYWRvd0JpYXM7XG5cdFx0dmVjMyBiZDNEID0gbm9ybWFsaXplKCBsaWdodFRvUG9zaXRpb24gKTtcblx0XHQjaWYgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGICkgfHwgZGVmaW5lZCggU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQgKSB8fCBkZWZpbmVkKCBTSEFET1dNQVBfVFlQRV9WU00gKVxuXHRcdFx0dmVjMiBvZmZzZXQgPSB2ZWMyKCAtIDEsIDEgKSAqIHNoYWRvd1JhZGl1cyAqIHRleGVsU2l6ZS55O1xuXHRcdFx0cmV0dXJuIChcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eXksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl5eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHl4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eXgsIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNELCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC54eHksIHRleGVsU2l6ZS55ICksIGRwICkgK1xuXHRcdFx0XHR0ZXh0dXJlMkRDb21wYXJlKCBzaGFkb3dNYXAsIGN1YmVUb1VWKCBiZDNEICsgb2Zmc2V0Lnl4eSwgdGV4ZWxTaXplLnkgKSwgZHAgKSArXG5cdFx0XHRcdHRleHR1cmUyRENvbXBhcmUoIHNoYWRvd01hcCwgY3ViZVRvVVYoIGJkM0QgKyBvZmZzZXQueHh4LCB0ZXhlbFNpemUueSApLCBkcCApICtcblx0XHRcdFx0dGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCArIG9mZnNldC55eHgsIHRleGVsU2l6ZS55ICksIGRwIClcblx0XHRcdCkgKiAoIDEuMCAvIDkuMCApO1xuXHRcdCNlbHNlXG5cdFx0XHRyZXR1cm4gdGV4dHVyZTJEQ29tcGFyZSggc2hhZG93TWFwLCBjdWJlVG9VViggYmQzRCwgdGV4ZWxTaXplLnkgKSwgZHAgKTtcblx0XHQjZW5kaWZcblx0fVxuI2VuZGlmIjsKCiAgICB2YXIgc2hhZG93bWFwX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IGRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBOVU1fRElSX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIE5VTV9ESVJfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgPiAwXG5cdFx0dW5pZm9ybSBtYXQ0IHNwb3RTaGFkb3dNYXRyaXhbIE5VTV9TUE9UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlNwb3RTaGFkb3dDb29yZFsgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyBdO1xuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHRcdHVuaWZvcm0gbWF0NCBwb2ludFNoYWRvd01hdHJpeFsgTlVNX1BPSU5UX0xJR0hUX1NIQURPV1MgXTtcblx0XHR2YXJ5aW5nIHZlYzQgdlBvaW50U2hhZG93Q29vcmRbIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTIF07XG5cdCNlbmRpZlxuI2VuZGlmIjsKCiAgICB2YXIgc2hhZG93bWFwX3ZlcnRleCA9ICIjaWZkZWYgVVNFX1NIQURPV01BUFxuXHQjaWYgTlVNX0RJUl9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9ESVJfTElHSFRfU0hBRE9XUzsgaSArKyApIHtcblx0XHR2RGlyZWN0aW9uYWxTaGFkb3dDb29yZFsgaSBdID0gZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXhbIGkgXSAqIHdvcmxkUG9zaXRpb247XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fU1BPVF9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9TUE9UX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0dlNwb3RTaGFkb3dDb29yZFsgaSBdID0gc3BvdFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcblx0I2lmIE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTID4gMFxuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHZQb2ludFNoYWRvd0Nvb3JkWyBpIF0gPSBwb2ludFNoYWRvd01hdHJpeFsgaSBdICogd29ybGRQb3NpdGlvbjtcblx0fVxuXHQjZW5kaWZcbiNlbmRpZiI7CgogICAgdmFyIHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCA9ICJmbG9hdCBnZXRTaGFkb3dNYXNrKCkge1xuXHRmbG9hdCBzaGFkb3cgPSAxLjA7XG5cdCNpZmRlZiBVU0VfU0hBRE9XTUFQXG5cdCNpZiBOVU1fRElSX0xJR0hUX1NIQURPV1MgPiAwXG5cdERpcmVjdGlvbmFsTGlnaHQgZGlyZWN0aW9uYWxMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fRElSX0xJR0hUX1NIQURPV1M7IGkgKysgKSB7XG5cdFx0ZGlyZWN0aW9uYWxMaWdodCA9IGRpcmVjdGlvbmFsTGlnaHRzWyBpIF07XG5cdFx0c2hhZG93ICo9IGJvb2woIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93ICkgPyBnZXRTaGFkb3coIGRpcmVjdGlvbmFsU2hhZG93TWFwWyBpIF0sIGRpcmVjdGlvbmFsTGlnaHQuc2hhZG93TWFwU2l6ZSwgZGlyZWN0aW9uYWxMaWdodC5zaGFkb3dCaWFzLCBkaXJlY3Rpb25hbExpZ2h0LnNoYWRvd1JhZGl1cywgdkRpcmVjdGlvbmFsU2hhZG93Q29vcmRbIGkgXSApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjaWYgTlVNX1NQT1RfTElHSFRfU0hBRE9XUyA+IDBcblx0U3BvdExpZ2h0IHNwb3RMaWdodDtcblx0I3ByYWdtYSB1bnJvbGxfbG9vcFxuXHRmb3IgKCBpbnQgaSA9IDA7IGkgPCBOVU1fU1BPVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHNwb3RMaWdodCA9IHNwb3RMaWdodHNbIGkgXTtcblx0XHRzaGFkb3cgKj0gYm9vbCggc3BvdExpZ2h0LnNoYWRvdyApID8gZ2V0U2hhZG93KCBzcG90U2hhZG93TWFwWyBpIF0sIHNwb3RMaWdodC5zaGFkb3dNYXBTaXplLCBzcG90TGlnaHQuc2hhZG93Qmlhcywgc3BvdExpZ2h0LnNoYWRvd1JhZGl1cywgdlNwb3RTaGFkb3dDb29yZFsgaSBdICkgOiAxLjA7XG5cdH1cblx0I2VuZGlmXG5cdCNpZiBOVU1fUE9JTlRfTElHSFRfU0hBRE9XUyA+IDBcblx0UG9pbnRMaWdodCBwb2ludExpZ2h0O1xuXHQjcHJhZ21hIHVucm9sbF9sb29wXG5cdGZvciAoIGludCBpID0gMDsgaSA8IE5VTV9QT0lOVF9MSUdIVF9TSEFET1dTOyBpICsrICkge1xuXHRcdHBvaW50TGlnaHQgPSBwb2ludExpZ2h0c1sgaSBdO1xuXHRcdHNoYWRvdyAqPSBib29sKCBwb2ludExpZ2h0LnNoYWRvdyApID8gZ2V0UG9pbnRTaGFkb3coIHBvaW50U2hhZG93TWFwWyBpIF0sIHBvaW50TGlnaHQuc2hhZG93TWFwU2l6ZSwgcG9pbnRMaWdodC5zaGFkb3dCaWFzLCBwb2ludExpZ2h0LnNoYWRvd1JhZGl1cywgdlBvaW50U2hhZG93Q29vcmRbIGkgXSwgcG9pbnRMaWdodC5zaGFkb3dDYW1lcmFOZWFyLCBwb2ludExpZ2h0LnNoYWRvd0NhbWVyYUZhciApIDogMS4wO1xuXHR9XG5cdCNlbmRpZlxuXHQjZW5kaWZcblx0cmV0dXJuIHNoYWRvdztcbn0iOwoKICAgIHZhciBza2luYmFzZV92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IGJvbmVNYXRYID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LnggKTtcblx0bWF0NCBib25lTWF0WSA9IGdldEJvbmVNYXRyaXgoIHNraW5JbmRleC55ICk7XG5cdG1hdDQgYm9uZU1hdFogPSBnZXRCb25lTWF0cml4KCBza2luSW5kZXgueiApO1xuXHRtYXQ0IGJvbmVNYXRXID0gZ2V0Qm9uZU1hdHJpeCggc2tpbkluZGV4LncgKTtcbiNlbmRpZiI7CgogICAgdmFyIHNraW5uaW5nX3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dW5pZm9ybSBtYXQ0IGJpbmRNYXRyaXg7XG5cdHVuaWZvcm0gbWF0NCBiaW5kTWF0cml4SW52ZXJzZTtcblx0I2lmZGVmIEJPTkVfVEVYVFVSRVxuXHRcdHVuaWZvcm0gaGlnaHAgc2FtcGxlcjJEIGJvbmVUZXh0dXJlO1xuXHRcdHVuaWZvcm0gaW50IGJvbmVUZXh0dXJlU2l6ZTtcblx0XHRtYXQ0IGdldEJvbmVNYXRyaXgoIGNvbnN0IGluIGZsb2F0IGkgKSB7XG5cdFx0XHRmbG9hdCBqID0gaSAqIDQuMDtcblx0XHRcdGZsb2F0IHggPSBtb2QoIGosIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKSApO1xuXHRcdFx0ZmxvYXQgeSA9IGZsb29yKCBqIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApICk7XG5cdFx0XHRmbG9hdCBkeCA9IDEuMCAvIGZsb2F0KCBib25lVGV4dHVyZVNpemUgKTtcblx0XHRcdGZsb2F0IGR5ID0gMS4wIC8gZmxvYXQoIGJvbmVUZXh0dXJlU2l6ZSApO1xuXHRcdFx0eSA9IGR5ICogKCB5ICsgMC41ICk7XG5cdFx0XHR2ZWM0IHYxID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAwLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYyID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAxLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHYzID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAyLjUgKSwgeSApICk7XG5cdFx0XHR2ZWM0IHY0ID0gdGV4dHVyZTJEKCBib25lVGV4dHVyZSwgdmVjMiggZHggKiAoIHggKyAzLjUgKSwgeSApICk7XG5cdFx0XHRtYXQ0IGJvbmUgPSBtYXQ0KCB2MSwgdjIsIHYzLCB2NCApO1xuXHRcdFx0cmV0dXJuIGJvbmU7XG5cdFx0fVxuXHQjZWxzZVxuXHRcdHVuaWZvcm0gbWF0NCBib25lTWF0cmljZXNbIE1BWF9CT05FUyBdO1xuXHRcdG1hdDQgZ2V0Qm9uZU1hdHJpeCggY29uc3QgaW4gZmxvYXQgaSApIHtcblx0XHRcdG1hdDQgYm9uZSA9IGJvbmVNYXRyaWNlc1sgaW50KGkpIF07XG5cdFx0XHRyZXR1cm4gYm9uZTtcblx0XHR9XG5cdCNlbmRpZlxuI2VuZGlmIjsKCiAgICB2YXIgc2tpbm5pbmdfdmVydGV4ID0gIiNpZmRlZiBVU0VfU0tJTk5JTkdcblx0dmVjNCBza2luVmVydGV4ID0gYmluZE1hdHJpeCAqIHZlYzQoIHRyYW5zZm9ybWVkLCAxLjAgKTtcblx0dmVjNCBza2lubmVkID0gdmVjNCggMC4wICk7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFggKiBza2luVmVydGV4ICogc2tpbldlaWdodC54O1xuXHRza2lubmVkICs9IGJvbmVNYXRZICogc2tpblZlcnRleCAqIHNraW5XZWlnaHQueTtcblx0c2tpbm5lZCArPSBib25lTWF0WiAqIHNraW5WZXJ0ZXggKiBza2luV2VpZ2h0Lno7XG5cdHNraW5uZWQgKz0gYm9uZU1hdFcgKiBza2luVmVydGV4ICogc2tpbldlaWdodC53O1xuXHR0cmFuc2Zvcm1lZCA9ICggYmluZE1hdHJpeEludmVyc2UgKiBza2lubmVkICkueHl6O1xuI2VuZGlmIjsKCiAgICB2YXIgc2tpbm5vcm1hbF92ZXJ0ZXggPSAiI2lmZGVmIFVTRV9TS0lOTklOR1xuXHRtYXQ0IHNraW5NYXRyaXggPSBtYXQ0KCAwLjAgKTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnggKiBib25lTWF0WDtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnkgKiBib25lTWF0WTtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LnogKiBib25lTWF0Wjtcblx0c2tpbk1hdHJpeCArPSBza2luV2VpZ2h0LncgKiBib25lTWF0Vztcblx0c2tpbk1hdHJpeCAgPSBiaW5kTWF0cml4SW52ZXJzZSAqIHNraW5NYXRyaXggKiBiaW5kTWF0cml4O1xuXHRvYmplY3ROb3JtYWwgPSB2ZWM0KCBza2luTWF0cml4ICogdmVjNCggb2JqZWN0Tm9ybWFsLCAwLjAgKSApLnh5ejtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0b2JqZWN0VGFuZ2VudCA9IHZlYzQoIHNraW5NYXRyaXggKiB2ZWM0KCBvYmplY3RUYW5nZW50LCAwLjAgKSApLnh5ejtcblx0I2VuZGlmXG4jZW5kaWYiOwoKICAgIHZhciBzcGVjdWxhcm1hcF9mcmFnbWVudCA9ICJmbG9hdCBzcGVjdWxhclN0cmVuZ3RoO1xuI2lmZGVmIFVTRV9TUEVDVUxBUk1BUFxuXHR2ZWM0IHRleGVsU3BlY3VsYXIgPSB0ZXh0dXJlMkQoIHNwZWN1bGFyTWFwLCB2VXYgKTtcblx0c3BlY3VsYXJTdHJlbmd0aCA9IHRleGVsU3BlY3VsYXIucjtcbiNlbHNlXG5cdHNwZWN1bGFyU3RyZW5ndGggPSAxLjA7XG4jZW5kaWYiOwoKICAgIHZhciBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfU1BFQ1VMQVJNQVBcblx0dW5pZm9ybSBzYW1wbGVyMkQgc3BlY3VsYXJNYXA7XG4jZW5kaWYiOwoKICAgIHZhciB0b25lbWFwcGluZ19mcmFnbWVudCA9ICIjaWYgZGVmaW5lZCggVE9ORV9NQVBQSU5HIClcblx0Z2xfRnJhZ0NvbG9yLnJnYiA9IHRvbmVNYXBwaW5nKCBnbF9GcmFnQ29sb3IucmdiICk7XG4jZW5kaWYiOwoKICAgIHZhciB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50ID0gIiNpZm5kZWYgc2F0dXJhdGVcblx0I2RlZmluZSBzYXR1cmF0ZShhKSBjbGFtcCggYSwgMC4wLCAxLjAgKVxuI2VuZGlmXG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG51bmlmb3JtIGZsb2F0IHRvbmVNYXBwaW5nV2hpdGVQb2ludDtcbnZlYzMgTGluZWFyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdHJldHVybiB0b25lTWFwcGluZ0V4cG9zdXJlICogY29sb3I7XG59XG52ZWMzIFJlaW5oYXJkVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggY29sb3IgLyAoIHZlYzMoIDEuMCApICsgY29sb3IgKSApO1xufVxuI2RlZmluZSBVbmNoYXJ0ZWQySGVscGVyKCB4ICkgbWF4KCAoICggeCAqICggMC4xNSAqIHggKyAwLjEwICogMC41MCApICsgMC4yMCAqIDAuMDIgKSAvICggeCAqICggMC4xNSAqIHggKyAwLjUwICkgKyAwLjIwICogMC4zMCApICkgLSAwLjAyIC8gMC4zMCwgdmVjMyggMC4wICkgKVxudmVjMyBVbmNoYXJ0ZWQyVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggVW5jaGFydGVkMkhlbHBlciggY29sb3IgKSAvIFVuY2hhcnRlZDJIZWxwZXIoIHZlYzMoIHRvbmVNYXBwaW5nV2hpdGVQb2ludCApICkgKTtcbn1cbnZlYzMgT3B0aW1pemVkQ2luZW9uVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdGNvbG9yID0gbWF4KCB2ZWMzKCAwLjAgKSwgY29sb3IgLSAwLjAwNCApO1xuXHRyZXR1cm4gcG93KCAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDAuNSApICkgLyAoIGNvbG9yICogKCA2LjIgKiBjb2xvciArIDEuNyApICsgMC4wNiApLCB2ZWMzKCAyLjIgKSApO1xufVxudmVjMyBBQ0VTRmlsbWljVG9uZU1hcHBpbmcoIHZlYzMgY29sb3IgKSB7XG5cdGNvbG9yICo9IHRvbmVNYXBwaW5nRXhwb3N1cmU7XG5cdHJldHVybiBzYXR1cmF0ZSggKCBjb2xvciAqICggMi41MSAqIGNvbG9yICsgMC4wMyApICkgLyAoIGNvbG9yICogKCAyLjQzICogY29sb3IgKyAwLjU5ICkgKyAwLjE0ICkgKTtcbn0iOwoKICAgIHZhciB1dl9wYXJzX2ZyYWdtZW50ID0gIiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcbiNlbmRpZiI7CgogICAgdmFyIHV2X3BhcnNfdmVydGV4ID0gIiNpZmRlZiBVU0VfVVZcblx0dmFyeWluZyB2ZWMyIHZVdjtcblx0dW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xuI2VuZGlmIjsKCiAgICB2YXIgdXZfdmVydGV4ID0gIiNpZmRlZiBVU0VfVVZcblx0dlV2ID0gKCB1dlRyYW5zZm9ybSAqIHZlYzMoIHV2LCAxICkgKS54eTtcbiNlbmRpZiI7CgogICAgdmFyIHV2Ml9wYXJzX2ZyYWdtZW50ID0gIiNpZiBkZWZpbmVkKCBVU0VfTElHSFRNQVAgKSB8fCBkZWZpbmVkKCBVU0VfQU9NQVAgKVxuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiI7CgogICAgdmFyIHV2Ml9wYXJzX3ZlcnRleCA9ICIjaWYgZGVmaW5lZCggVVNFX0xJR0hUTUFQICkgfHwgZGVmaW5lZCggVVNFX0FPTUFQIClcblx0YXR0cmlidXRlIHZlYzIgdXYyO1xuXHR2YXJ5aW5nIHZlYzIgdlV2MjtcbiNlbmRpZiI7CgogICAgdmFyIHV2Ml92ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9MSUdIVE1BUCApIHx8IGRlZmluZWQoIFVTRV9BT01BUCApXG5cdHZVdjIgPSB1djI7XG4jZW5kaWYiOwoKICAgIHZhciB3b3JsZHBvc192ZXJ0ZXggPSAiI2lmIGRlZmluZWQoIFVTRV9FTlZNQVAgKSB8fCBkZWZpbmVkKCBESVNUQU5DRSApIHx8IGRlZmluZWQgKCBVU0VfU0hBRE9XTUFQIClcblx0dmVjNCB3b3JsZFBvc2l0aW9uID0gbW9kZWxNYXRyaXggKiB2ZWM0KCB0cmFuc2Zvcm1lZCwgMS4wICk7XG4jZW5kaWYiOwoKICAgIHZhciBiYWNrZ3JvdW5kX2ZyYWcgPSAidW5pZm9ybSBzYW1wbGVyMkQgdDJEO1xudmFyeWluZyB2ZWMyIHZVdjtcbnZvaWQgbWFpbigpIHtcblx0dmVjNCB0ZXhDb2xvciA9IHRleHR1cmUyRCggdDJELCB2VXYgKTtcblx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSI7CgogICAgdmFyIGJhY2tncm91bmRfdmVydCA9ICJ2YXJ5aW5nIHZlYzIgdlV2O1xudW5pZm9ybSBtYXQzIHV2VHJhbnNmb3JtO1xudm9pZCBtYWluKCkge1xuXHR2VXYgPSAoIHV2VHJhbnNmb3JtICogdmVjMyggdXYsIDEgKSApLnh5O1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLnh5LCAxLjAsIDEuMCApO1xufSI7CgogICAgdmFyIGN1YmVfZnJhZyA9ICJ1bmlmb3JtIHNhbXBsZXJDdWJlIHRDdWJlO1xudW5pZm9ybSBmbG9hdCB0RmxpcDtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG52b2lkIG1haW4oKSB7XG5cdHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlQ3ViZSggdEN1YmUsIHZlYzMoIHRGbGlwICogdldvcmxkRGlyZWN0aW9uLngsIHZXb3JsZERpcmVjdGlvbi55eiApICk7XG5cdGdsX0ZyYWdDb2xvciA9IG1hcFRleGVsVG9MaW5lYXIoIHRleENvbG9yICk7XG5cdGdsX0ZyYWdDb2xvci5hICo9IG9wYWNpdHk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cbn0iOwoKICAgIHZhciBjdWJlX3ZlcnQgPSAidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9zaXRpb24ueiA9IGdsX1Bvc2l0aW9uLnc7XG59IjsKCiAgICB2YXIgZGVwdGhfZnJhZyA9ICIjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdHVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaWYgREVQVEhfUEFDS0lORyA9PSAzMjAwXG5cdFx0ZGlmZnVzZUNvbG9yLmEgPSBvcGFjaXR5O1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpZiBERVBUSF9QQUNLSU5HID09IDMyMDBcblx0XHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCB2ZWMzKCAxLjAgLSBnbF9GcmFnQ29vcmQueiApLCBvcGFjaXR5ICk7XG5cdCNlbGlmIERFUFRIX1BBQ0tJTkcgPT0gMzIwMVxuXHRcdGdsX0ZyYWdDb2xvciA9IHBhY2tEZXB0aFRvUkdCQSggZ2xfRnJhZ0Nvb3JkLnogKTtcblx0I2VuZGlmXG59IjsKCiAgICB2YXIgZGVwdGhfdmVydCA9ICIjaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpZmRlZiBVU0VfRElTUExBQ0VNRU5UTUFQXG5cdFx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHRcdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxufSI7CgogICAgdmFyIGRpc3RhbmNlUkdCQV9mcmFnID0gIiNkZWZpbmUgRElTVEFOQ0VcbnVuaWZvcm0gdmVjMyByZWZlcmVuY2VQb3NpdGlvbjtcbnVuaWZvcm0gZmxvYXQgbmVhckRpc3RhbmNlO1xudW5pZm9ybSBmbG9hdCBmYXJEaXN0YW5jZTtcbnZhcnlpbmcgdmVjMyB2V29ybGRQb3NpdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFscGhhbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4gKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdGZsb2F0IGRpc3QgPSBsZW5ndGgoIHZXb3JsZFBvc2l0aW9uIC0gcmVmZXJlbmNlUG9zaXRpb24gKTtcblx0ZGlzdCA9ICggZGlzdCAtIG5lYXJEaXN0YW5jZSApIC8gKCBmYXJEaXN0YW5jZSAtIG5lYXJEaXN0YW5jZSApO1xuXHRkaXN0ID0gc2F0dXJhdGUoIGRpc3QgKTtcblx0Z2xfRnJhZ0NvbG9yID0gcGFja0RlcHRoVG9SR0JBKCBkaXN0ICk7XG59IjsKCiAgICB2YXIgZGlzdGFuY2VSR0JBX3ZlcnQgPSAiI2RlZmluZSBESVNUQU5DRVxudmFyeWluZyB2ZWMzIHZXb3JsZFBvc2l0aW9uO1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0RJU1BMQUNFTUVOVE1BUFxuXHRcdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdFx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0XHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGlzcGxhY2VtZW50bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHByb2plY3RfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0dldvcmxkUG9zaXRpb24gPSB3b3JsZFBvc2l0aW9uLnh5ejtcbn0iOwoKICAgIHZhciBlcXVpcmVjdF9mcmFnID0gInVuaWZvcm0gc2FtcGxlcjJEIHRFcXVpcmVjdDtcbnZhcnlpbmcgdmVjMyB2V29ybGREaXJlY3Rpb247XG4jaW5jbHVkZSA8Y29tbW9uPlxudm9pZCBtYWluKCkge1xuXHR2ZWMzIGRpcmVjdGlvbiA9IG5vcm1hbGl6ZSggdldvcmxkRGlyZWN0aW9uICk7XG5cdHZlYzIgc2FtcGxlVVY7XG5cdHNhbXBsZVVWLnkgPSBhc2luKCBjbGFtcCggZGlyZWN0aW9uLnksIC0gMS4wLCAxLjAgKSApICogUkVDSVBST0NBTF9QSSArIDAuNTtcblx0c2FtcGxlVVYueCA9IGF0YW4oIGRpcmVjdGlvbi56LCBkaXJlY3Rpb24ueCApICogUkVDSVBST0NBTF9QSTIgKyAwLjU7XG5cdHZlYzQgdGV4Q29sb3IgPSB0ZXh0dXJlMkQoIHRFcXVpcmVjdCwgc2FtcGxlVVYgKTtcblx0Z2xfRnJhZ0NvbG9yID0gbWFwVGV4ZWxUb0xpbmVhciggdGV4Q29sb3IgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxufSI7CgogICAgdmFyIGVxdWlyZWN0X3ZlcnQgPSAidmFyeWluZyB2ZWMzIHZXb3JsZERpcmVjdGlvbjtcbiNpbmNsdWRlIDxjb21tb24+XG52b2lkIG1haW4oKSB7XG5cdHZXb3JsZERpcmVjdGlvbiA9IHRyYW5zZm9ybURpcmVjdGlvbiggcG9zaXRpb24sIG1vZGVsTWF0cml4ICk7XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cbn0iOwoKICAgIHZhciBsaW5lZGFzaGVkX2ZyYWcgPSAidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIGZsb2F0IGRhc2hTaXplO1xudW5pZm9ybSBmbG9hdCB0b3RhbFNpemU7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0aWYgKCBtb2QoIHZMaW5lRGlzdGFuY2UsIHRvdGFsU2l6ZSApID4gZGFzaFNpemUgKSB7XG5cdFx0ZGlzY2FyZDtcblx0fVxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHRvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0iOwoKICAgIHZhciBsaW5lZGFzaGVkX3ZlcnQgPSAidW5pZm9ybSBmbG9hdCBzY2FsZTtcbmF0dHJpYnV0ZSBmbG9hdCBsaW5lRGlzdGFuY2U7XG52YXJ5aW5nIGZsb2F0IHZMaW5lRGlzdGFuY2U7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdHZMaW5lRGlzdGFuY2UgPSBzY2FsZSAqIGxpbmVEaXN0YW5jZTtcblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApO1xuXHRnbF9Qb3NpdGlvbiA9IHByb2plY3Rpb25NYXRyaXggKiBtdlBvc2l0aW9uO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IjsKCiAgICB2YXIgbWVzaGJhc2ljX2ZyYWcgPSAidW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c3BlY3VsYXJtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHNwZWN1bGFybWFwX2ZyYWdtZW50PlxuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHQjaWZkZWYgVVNFX0xJR0hUTUFQXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9IHRleHR1cmUyRCggbGlnaHRNYXAsIHZVdjIgKS54eXogKiBsaWdodE1hcEludGVuc2l0eTtcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdmVjMyggMS4wICk7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBkaWZmdXNlQ29sb3IucmdiO1xuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDxwcmVtdWx0aXBsaWVkX2FscGhhX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8dG9uZW1hcHBpbmdfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxlbmNvZGluZ3NfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxmb2dfZnJhZ21lbnQ+XG59IjsKCiAgICB2YXIgbWVzaGJhc2ljX3ZlcnQgPSAiI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDx1djJfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx1djJfdmVydGV4PlxuXHQjaW5jbHVkZSA8Y29sb3JfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbmJhc2VfdmVydGV4PlxuXHQjaWZkZWYgVVNFX0VOVk1BUFxuXHQjaW5jbHVkZSA8YmVnaW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGhub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxkZWZhdWx0bm9ybWFsX3ZlcnRleD5cblx0I2VuZGlmXG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubmluZ192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPHdvcmxkcG9zX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxlbnZtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iOwoKICAgIHZhciBtZXNobGFtYmVydF9mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSB2ZWMzIGVtaXNzaXZlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxkaXRoZXJpbmdfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHV2X3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXYyX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YWxwaGFtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhb21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxpZ2h0bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW1pc3NpdmVtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnNkZnM+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFza19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNwZWN1bGFybWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudD5cblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdFJlZmxlY3RlZExpZ2h0IHJlZmxlY3RlZExpZ2h0ID0gUmVmbGVjdGVkTGlnaHQoIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApICk7XG5cdHZlYzMgdG90YWxFbWlzc2l2ZVJhZGlhbmNlID0gZW1pc3NpdmU7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGNvbG9yX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxzcGVjdWxhcm1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgPSBnZXRBbWJpZW50TGlnaHRJcnJhZGlhbmNlKCBhbWJpZW50TGlnaHRDb2xvciApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuaW5kaXJlY3REaWZmdXNlICs9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZJbmRpcmVjdEZyb250IDogdkluZGlyZWN0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKz0gdkluZGlyZWN0RnJvbnQ7XG5cdCNlbmRpZlxuXHQjaW5jbHVkZSA8bGlnaHRtYXBfZnJhZ21lbnQ+XG5cdHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSAqPSBCUkRGX0RpZmZ1c2VfTGFtYmVydCggZGlmZnVzZUNvbG9yLnJnYiApO1xuXHQjaWZkZWYgRE9VQkxFX1NJREVEXG5cdFx0cmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSA9ICggZ2xfRnJvbnRGYWNpbmcgKSA/IHZMaWdodEZyb250IDogdkxpZ2h0QmFjaztcblx0I2Vsc2Vcblx0XHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlID0gdkxpZ2h0RnJvbnQ7XG5cdCNlbmRpZlxuXHRyZWZsZWN0ZWRMaWdodC5kaXJlY3REaWZmdXNlICo9IEJSREZfRGlmZnVzZV9MYW1iZXJ0KCBkaWZmdXNlQ29sb3IucmdiICkgKiBnZXRTaGFkb3dNYXNrKCk7XG5cdCNpbmNsdWRlIDxhb21hcF9mcmFnbWVudD5cblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gcmVmbGVjdGVkTGlnaHQuZGlyZWN0RGlmZnVzZSArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0RGlmZnVzZSArIHRvdGFsRW1pc3NpdmVSYWRpYW5jZTtcblx0I2luY2x1ZGUgPGVudm1hcF9mcmFnbWVudD5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn0iOwoKICAgIHZhciBtZXNobGFtYmVydF92ZXJ0ID0gIiNkZWZpbmUgTEFNQkVSVFxudmFyeWluZyB2ZWMzIHZMaWdodEZyb250O1xudmFyeWluZyB2ZWMzIHZJbmRpcmVjdEZyb250O1xuI2lmZGVmIERPVUJMRV9TSURFRFxuXHR2YXJ5aW5nIHZlYzMgdkxpZ2h0QmFjaztcblx0dmFyeWluZyB2ZWMzIHZJbmRpcmVjdEJhY2s7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGVudm1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8bW9ycGh0YXJnZXRfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2tpbm5pbmdfdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfdmVydGV4PlxuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGxpZ2h0c19sYW1iZXJ0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSI7CgogICAgdmFyIG1lc2htYXRjYXBfZnJhZyA9ICIjZGVmaW5lIE1BVENBUFxudW5pZm9ybSB2ZWMzIGRpZmZ1c2U7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG51bmlmb3JtIHNhbXBsZXIyRCBtYXRjYXA7XG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGFtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0dmVjMyB2aWV3RGlyID0gbm9ybWFsaXplKCB2Vmlld1Bvc2l0aW9uICk7XG5cdHZlYzMgeCA9IG5vcm1hbGl6ZSggdmVjMyggdmlld0Rpci56LCAwLjAsIC0gdmlld0Rpci54ICkgKTtcblx0dmVjMyB5ID0gY3Jvc3MoIHZpZXdEaXIsIHggKTtcblx0dmVjMiB1diA9IHZlYzIoIGRvdCggeCwgbm9ybWFsICksIGRvdCggeSwgbm9ybWFsICkgKSAqIDAuNDk1ICsgMC41O1xuXHQjaWZkZWYgVVNFX01BVENBUFxuXHRcdHZlYzQgbWF0Y2FwQ29sb3IgPSB0ZXh0dXJlMkQoIG1hdGNhcCwgdXYgKTtcblx0XHRtYXRjYXBDb2xvciA9IG1hdGNhcFRleGVsVG9MaW5lYXIoIG1hdGNhcENvbG9yICk7XG5cdCNlbHNlXG5cdFx0dmVjNCBtYXRjYXBDb2xvciA9IHZlYzQoIDEuMCApO1xuXHQjZW5kaWZcblx0dmVjMyBvdXRnb2luZ0xpZ2h0ID0gZGlmZnVzZUNvbG9yLnJnYiAqIG1hdGNhcENvbG9yLnJnYjtcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0iOwoKICAgIHZhciBtZXNobWF0Y2FwX3ZlcnQgPSAiI2RlZmluZSBNQVRDQVBcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDx1dl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPG1vcnBodGFyZ2V0X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHNraW5uaW5nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG5cdCNpZm5kZWYgRkxBVF9TSEFERURcblx0XHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbn0iOwoKICAgIHZhciBtZXNocGhvbmdfZnJhZyA9ICIjZGVmaW5lIFBIT05HXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gdmVjMyBzcGVjdWxhcjtcbnVuaWZvcm0gZmxvYXQgc2hpbmluZXNzO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGxpZ2h0c19wYXJzX2JlZ2luPlxuI2luY2x1ZGUgPGxpZ2h0c19waG9uZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPHNoYWRvd21hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzQgZGlmZnVzZUNvbG9yID0gdmVjNCggZGlmZnVzZSwgb3BhY2l0eSApO1xuXHRSZWZsZWN0ZWRMaWdodCByZWZsZWN0ZWRMaWdodCA9IFJlZmxlY3RlZExpZ2h0KCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSApO1xuXHR2ZWMzIHRvdGFsRW1pc3NpdmVSYWRpYW5jZSA9IGVtaXNzaXZlO1xuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxjb2xvcl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8YWxwaGF0ZXN0X2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8c3BlY3VsYXJtYXBfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3Bob25nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpbmNsdWRlIDxlbnZtYXBfZnJhZ21lbnQ+XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPHByZW11bHRpcGxpZWRfYWxwaGFfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxkaXRoZXJpbmdfZnJhZ21lbnQ+XG59IjsKCiAgICB2YXIgbWVzaHBob25nX3ZlcnQgPSAiI2RlZmluZSBQSE9OR1xudmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuI2VuZGlmXG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPHV2Ml9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxkaXNwbGFjZW1lbnRtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8ZW52bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bG9nZGVwdGhidWZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8dXZfdmVydGV4PlxuXHQjaW5jbHVkZSA8dXYyX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNvbG9yX3ZlcnRleD5cblx0I2luY2x1ZGUgPGJlZ2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBobm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5iYXNlX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5ub3JtYWxfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZGVmYXVsdG5vcm1hbF92ZXJ0ZXg+XG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZOb3JtYWwgPSBub3JtYWxpemUoIHRyYW5zZm9ybWVkTm9ybWFsICk7XG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8ZW52bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPHNoYWRvd21hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSI7CgogICAgdmFyIG1lc2hwaHlzaWNhbF9mcmFnID0gIiNkZWZpbmUgU1RBTkRBUkRcbiNpZmRlZiBQSFlTSUNBTFxuXHQjZGVmaW5lIFJFRkxFQ1RJVklUWVxuXHQjZGVmaW5lIENMRUFSQ09BVFxuXHQjZGVmaW5lIFRSQU5TUEFSRU5DWVxuI2VuZGlmXG51bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gdmVjMyBlbWlzc2l2ZTtcbnVuaWZvcm0gZmxvYXQgcm91Z2huZXNzO1xudW5pZm9ybSBmbG9hdCBtZXRhbG5lc3M7XG51bmlmb3JtIGZsb2F0IG9wYWNpdHk7XG4jaWZkZWYgVFJBTlNQQVJFTkNZXG5cdHVuaWZvcm0gZmxvYXQgdHJhbnNwYXJlbmN5O1xuI2VuZGlmXG4jaWZkZWYgUkVGTEVDVElWSVRZXG5cdHVuaWZvcm0gZmxvYXQgcmVmbGVjdGl2aXR5O1xuI2VuZGlmXG4jaWZkZWYgQ0xFQVJDT0FUXG5cdHVuaWZvcm0gZmxvYXQgY2xlYXJjb2F0O1xuXHR1bmlmb3JtIGZsb2F0IGNsZWFyY29hdFJvdWdobmVzcztcbiNlbmRpZlxuI2lmZGVmIFVTRV9TSEVFTlxuXHR1bmlmb3JtIHZlYzMgc2hlZW47XG4jZW5kaWZcbnZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxwYWNraW5nPlxuI2luY2x1ZGUgPGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDx1djJfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxhbHBoYW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGFvbWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxlbWlzc2l2ZW1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJzZGZzPlxuI2luY2x1ZGUgPGN1YmVfdXZfcmVmbGVjdGlvbl9mcmFnbWVudD5cbiNpbmNsdWRlIDxlbnZtYXBfY29tbW9uX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8ZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8bGlnaHRzX3BhcnNfYmVnaW4+XG4jaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8YnVtcG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxyb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0UmVmbGVjdGVkTGlnaHQgcmVmbGVjdGVkTGlnaHQgPSBSZWZsZWN0ZWRMaWdodCggdmVjMyggMC4wICksIHZlYzMoIDAuMCApLCB2ZWMzKCAwLjAgKSwgdmVjMyggMC4wICkgKTtcblx0dmVjMyB0b3RhbEVtaXNzaXZlUmFkaWFuY2UgPSBlbWlzc2l2ZTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYW1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHJvdWdobmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1ldGFsbmVzc21hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPG5vcm1hbF9mcmFnbWVudF9tYXBzPlxuXHQjaW5jbHVkZSA8Y2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9iZWdpbj5cblx0I2luY2x1ZGUgPGNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0I2luY2x1ZGUgPGVtaXNzaXZlbWFwX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X2JlZ2luPlxuXHQjaW5jbHVkZSA8bGlnaHRzX2ZyYWdtZW50X21hcHM+XG5cdCNpbmNsdWRlIDxsaWdodHNfZnJhZ21lbnRfZW5kPlxuXHQjaW5jbHVkZSA8YW9tYXBfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHJlZmxlY3RlZExpZ2h0LmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5pbmRpcmVjdERpZmZ1c2UgKyByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKyB0b3RhbEVtaXNzaXZlUmFkaWFuY2U7XG5cdCNpZmRlZiBUUkFOU1BBUkVOQ1lcblx0XHRkaWZmdXNlQ29sb3IuYSAqPSBzYXR1cmF0ZSggMS4gLSB0cmFuc3BhcmVuY3kgKyBsaW5lYXJUb1JlbGF0aXZlTHVtaW5hbmNlKCByZWZsZWN0ZWRMaWdodC5kaXJlY3RTcGVjdWxhciArIHJlZmxlY3RlZExpZ2h0LmluZGlyZWN0U3BlY3VsYXIgKSApO1xuXHQjZW5kaWZcblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggb3V0Z29pbmdMaWdodCwgZGlmZnVzZUNvbG9yLmEgKTtcblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGRpdGhlcmluZ19mcmFnbWVudD5cbn0iOwoKICAgIHZhciBtZXNocGh5c2ljYWxfdmVydCA9ICIjZGVmaW5lIFNUQU5EQVJEXG52YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNpZm5kZWYgRkxBVF9TSEFERURcblx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XG5cdCNpZmRlZiBVU0VfVEFOR0VOVFxuXHRcdHZhcnlpbmcgdmVjMyB2VGFuZ2VudDtcblx0XHR2YXJ5aW5nIHZlYzMgdkJpdGFuZ2VudDtcblx0I2VuZGlmXG4jZW5kaWZcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8dXYyX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8bW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2tpbm5pbmdfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0I2luY2x1ZGUgPHV2Ml92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdHZWaWV3UG9zaXRpb24gPSAtIG12UG9zaXRpb24ueHl6O1xuXHQjaW5jbHVkZSA8d29ybGRwb3NfdmVydGV4PlxuXHQjaW5jbHVkZSA8c2hhZG93bWFwX3ZlcnRleD5cblx0I2luY2x1ZGUgPGZvZ192ZXJ0ZXg+XG59IjsKCiAgICB2YXIgbm9ybWFsX2ZyYWcgPSAiI2RlZmluZSBOT1JNQUxcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpZiBkZWZpbmVkKCBGTEFUX1NIQURFRCApIHx8IGRlZmluZWQoIFVTRV9CVU1QTUFQICkgfHwgZGVmaW5lZCggVEFOR0VOVFNQQUNFX05PUk1BTE1BUCApXG5cdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xuI2VuZGlmXG4jaWZuZGVmIEZMQVRfU0hBREVEXG5cdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2YXJ5aW5nIHZlYzMgdlRhbmdlbnQ7XG5cdFx0dmFyeWluZyB2ZWMzIHZCaXRhbmdlbnQ7XG5cdCNlbmRpZlxuI2VuZGlmXG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDx1dl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGJ1bXBtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxub3JtYWxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bG9nZGVwdGhidWZfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfYmVnaW4+XG5cdCNpbmNsdWRlIDxub3JtYWxfZnJhZ21lbnRfbWFwcz5cblx0Z2xfRnJhZ0NvbG9yID0gdmVjNCggcGFja05vcm1hbFRvUkdCKCBub3JtYWwgKSwgb3BhY2l0eSApO1xufSI7CgogICAgdmFyIG5vcm1hbF92ZXJ0ID0gIiNkZWZpbmUgTk9STUFMXG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2YXJ5aW5nIHZlYzMgdlZpZXdQb3NpdGlvbjtcbiNlbmRpZlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2YXJ5aW5nIHZlYzMgdk5vcm1hbDtcblx0I2lmZGVmIFVTRV9UQU5HRU5UXG5cdFx0dmFyeWluZyB2ZWMzIHZUYW5nZW50O1xuXHRcdHZhcnlpbmcgdmVjMyB2Qml0YW5nZW50O1xuXHQjZW5kaWZcbiNlbmRpZlxuI2luY2x1ZGUgPHV2X3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxza2lubmluZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDx1dl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbm5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaG5vcm1hbF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2luYmFzZV92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxza2lubm9ybWFsX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRlZmF1bHRub3JtYWxfdmVydGV4PlxuI2lmbmRlZiBGTEFUX1NIQURFRFxuXHR2Tm9ybWFsID0gbm9ybWFsaXplKCB0cmFuc2Zvcm1lZE5vcm1hbCApO1xuXHQjaWZkZWYgVVNFX1RBTkdFTlRcblx0XHR2VGFuZ2VudCA9IG5vcm1hbGl6ZSggdHJhbnNmb3JtZWRUYW5nZW50ICk7XG5cdFx0dkJpdGFuZ2VudCA9IG5vcm1hbGl6ZSggY3Jvc3MoIHZOb3JtYWwsIHZUYW5nZW50ICkgKiB0YW5nZW50LncgKTtcblx0I2VuZGlmXG4jZW5kaWZcblx0I2luY2x1ZGUgPGJlZ2luX3ZlcnRleD5cblx0I2luY2x1ZGUgPG1vcnBodGFyZ2V0X3ZlcnRleD5cblx0I2luY2x1ZGUgPHNraW5uaW5nX3ZlcnRleD5cblx0I2luY2x1ZGUgPGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG4jaWYgZGVmaW5lZCggRkxBVF9TSEFERUQgKSB8fCBkZWZpbmVkKCBVU0VfQlVNUE1BUCApIHx8IGRlZmluZWQoIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAgKVxuXHR2Vmlld1Bvc2l0aW9uID0gLSBtdlBvc2l0aW9uLnh5ejtcbiNlbmRpZlxufSI7CgogICAgdmFyIHBvaW50c19mcmFnID0gInVuaWZvcm0gdmVjMyBkaWZmdXNlO1xudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xuI2luY2x1ZGUgPGNvbW1vbj5cbiNpbmNsdWRlIDxjb2xvcl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGZvZ19wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfZnJhZ21lbnQ+XG4jaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ+XG5cdHZlYzMgb3V0Z29pbmdMaWdodCA9IHZlYzMoIDAuMCApO1xuXHR2ZWM0IGRpZmZ1c2VDb2xvciA9IHZlYzQoIGRpZmZ1c2UsIG9wYWNpdHkgKTtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8bWFwX3BhcnRpY2xlX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Y29sb3JfZnJhZ21lbnQ+XG5cdCNpbmNsdWRlIDxhbHBoYXRlc3RfZnJhZ21lbnQ+XG5cdG91dGdvaW5nTGlnaHQgPSBkaWZmdXNlQ29sb3IucmdiO1xuXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCBkaWZmdXNlQ29sb3IuYSApO1xuXHQjaW5jbHVkZSA8cHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudD5cblx0I2luY2x1ZGUgPHRvbmVtYXBwaW5nX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8ZW5jb2RpbmdzX2ZyYWdtZW50PlxuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufSI7CgogICAgdmFyIHBvaW50c192ZXJ0ID0gInVuaWZvcm0gZmxvYXQgc2l6ZTtcbnVuaWZvcm0gZmxvYXQgc2NhbGU7XG4jaW5jbHVkZSA8Y29tbW9uPlxuI2luY2x1ZGUgPGNvbG9yX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGZvZ19wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxtb3JwaHRhcmdldF9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleD5cbiNpbmNsdWRlIDxjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXg+XG52b2lkIG1haW4oKSB7XG5cdCNpbmNsdWRlIDxjb2xvcl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxiZWdpbl92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxtb3JwaHRhcmdldF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxwcm9qZWN0X3ZlcnRleD5cblx0Z2xfUG9pbnRTaXplID0gc2l6ZTtcblx0I2lmZGVmIFVTRV9TSVpFQVRURU5VQVRJT05cblx0XHRib29sIGlzUGVyc3BlY3RpdmUgPSAoIHByb2plY3Rpb25NYXRyaXhbIDIgXVsgMyBdID09IC0gMS4wICk7XG5cdFx0aWYgKCBpc1BlcnNwZWN0aXZlICkgZ2xfUG9pbnRTaXplICo9ICggc2NhbGUgLyAtIG12UG9zaXRpb24ueiApO1xuXHQjZW5kaWZcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSI7CgogICAgdmFyIHNoYWRvd19mcmFnID0gInVuaWZvcm0gdmVjMyBjb2xvcjtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8cGFja2luZz5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxic2Rmcz5cbiNpbmNsdWRlIDxsaWdodHNfcGFyc19iZWdpbj5cbiNpbmNsdWRlIDxzaGFkb3dtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ+XG52b2lkIG1haW4oKSB7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIGNvbG9yLCBvcGFjaXR5ICogKCAxLjAgLSBnZXRTaGFkb3dNYXNrKCkgKSApO1xuXHQjaW5jbHVkZSA8Zm9nX2ZyYWdtZW50PlxufSI7CgogICAgdmFyIHNoYWRvd192ZXJ0ID0gIiNpbmNsdWRlIDxmb2dfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8c2hhZG93bWFwX3BhcnNfdmVydGV4Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8YmVnaW5fdmVydGV4PlxuXHQjaW5jbHVkZSA8cHJvamVjdF92ZXJ0ZXg+XG5cdCNpbmNsdWRlIDx3b3JsZHBvc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxzaGFkb3dtYXBfdmVydGV4PlxuXHQjaW5jbHVkZSA8Zm9nX3ZlcnRleD5cbn0iOwoKICAgIHZhciBzcHJpdGVfZnJhZyA9ICJ1bmlmb3JtIHZlYzMgZGlmZnVzZTtcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxtYXBfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxmb2dfcGFyc19mcmFnbWVudD5cbiNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX2ZyYWdtZW50Plxudm9pZCBtYWluKCkge1xuXHQjaW5jbHVkZSA8Y2xpcHBpbmdfcGxhbmVzX2ZyYWdtZW50PlxuXHR2ZWMzIG91dGdvaW5nTGlnaHQgPSB2ZWMzKCAwLjAgKTtcblx0dmVjNCBkaWZmdXNlQ29sb3IgPSB2ZWM0KCBkaWZmdXNlLCBvcGFjaXR5ICk7XG5cdCNpbmNsdWRlIDxsb2dkZXB0aGJ1Zl9mcmFnbWVudD5cblx0I2luY2x1ZGUgPG1hcF9mcmFnbWVudD5cblx0I2luY2x1ZGUgPGFscGhhdGVzdF9mcmFnbWVudD5cblx0b3V0Z29pbmdMaWdodCA9IGRpZmZ1c2VDb2xvci5yZ2I7XG5cdGdsX0ZyYWdDb2xvciA9IHZlYzQoIG91dGdvaW5nTGlnaHQsIGRpZmZ1c2VDb2xvci5hICk7XG5cdCNpbmNsdWRlIDx0b25lbWFwcGluZ19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGVuY29kaW5nc19mcmFnbWVudD5cblx0I2luY2x1ZGUgPGZvZ19mcmFnbWVudD5cbn0iOwoKICAgIHZhciBzcHJpdGVfdmVydCA9ICJ1bmlmb3JtIGZsb2F0IHJvdGF0aW9uO1xudW5pZm9ybSB2ZWMyIGNlbnRlcjtcbiNpbmNsdWRlIDxjb21tb24+XG4jaW5jbHVkZSA8dXZfcGFyc192ZXJ0ZXg+XG4jaW5jbHVkZSA8Zm9nX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4PlxuI2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc19wYXJzX3ZlcnRleD5cbnZvaWQgbWFpbigpIHtcblx0I2luY2x1ZGUgPHV2X3ZlcnRleD5cblx0dmVjNCBtdlBvc2l0aW9uID0gbW9kZWxWaWV3TWF0cml4ICogdmVjNCggMC4wLCAwLjAsIDAuMCwgMS4wICk7XG5cdHZlYzIgc2NhbGU7XG5cdHNjYWxlLnggPSBsZW5ndGgoIHZlYzMoIG1vZGVsTWF0cml4WyAwIF0ueCwgbW9kZWxNYXRyaXhbIDAgXS55LCBtb2RlbE1hdHJpeFsgMCBdLnogKSApO1xuXHRzY2FsZS55ID0gbGVuZ3RoKCB2ZWMzKCBtb2RlbE1hdHJpeFsgMSBdLngsIG1vZGVsTWF0cml4WyAxIF0ueSwgbW9kZWxNYXRyaXhbIDEgXS56ICkgKTtcblx0I2lmbmRlZiBVU0VfU0laRUFUVEVOVUFUSU9OXG5cdFx0Ym9vbCBpc1BlcnNwZWN0aXZlID0gKCBwcm9qZWN0aW9uTWF0cml4WyAyIF1bIDMgXSA9PSAtIDEuMCApO1xuXHRcdGlmICggaXNQZXJzcGVjdGl2ZSApIHNjYWxlICo9IC0gbXZQb3NpdGlvbi56O1xuXHQjZW5kaWZcblx0dmVjMiBhbGlnbmVkUG9zaXRpb24gPSAoIHBvc2l0aW9uLnh5IC0gKCBjZW50ZXIgLSB2ZWMyKCAwLjUgKSApICkgKiBzY2FsZTtcblx0dmVjMiByb3RhdGVkUG9zaXRpb247XG5cdHJvdGF0ZWRQb3NpdGlvbi54ID0gY29zKCByb3RhdGlvbiApICogYWxpZ25lZFBvc2l0aW9uLnggLSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueTtcblx0cm90YXRlZFBvc2l0aW9uLnkgPSBzaW4oIHJvdGF0aW9uICkgKiBhbGlnbmVkUG9zaXRpb24ueCArIGNvcyggcm90YXRpb24gKSAqIGFsaWduZWRQb3NpdGlvbi55O1xuXHRtdlBvc2l0aW9uLnh5ICs9IHJvdGF0ZWRQb3NpdGlvbjtcblx0Z2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbXZQb3NpdGlvbjtcblx0I2luY2x1ZGUgPGxvZ2RlcHRoYnVmX3ZlcnRleD5cblx0I2luY2x1ZGUgPGNsaXBwaW5nX3BsYW5lc192ZXJ0ZXg+XG5cdCNpbmNsdWRlIDxmb2dfdmVydGV4PlxufSI7CgogICAgdmFyIFNoYWRlckNodW5rID0gewogICAgCWFscGhhbWFwX2ZyYWdtZW50OiBhbHBoYW1hcF9mcmFnbWVudCwKICAgIAlhbHBoYW1hcF9wYXJzX2ZyYWdtZW50OiBhbHBoYW1hcF9wYXJzX2ZyYWdtZW50LAogICAgCWFscGhhdGVzdF9mcmFnbWVudDogYWxwaGF0ZXN0X2ZyYWdtZW50LAogICAgCWFvbWFwX2ZyYWdtZW50OiBhb21hcF9mcmFnbWVudCwKICAgIAlhb21hcF9wYXJzX2ZyYWdtZW50OiBhb21hcF9wYXJzX2ZyYWdtZW50LAogICAgCWJlZ2luX3ZlcnRleDogYmVnaW5fdmVydGV4LAogICAgCWJlZ2lubm9ybWFsX3ZlcnRleDogYmVnaW5ub3JtYWxfdmVydGV4LAogICAgCWJzZGZzOiBic2RmcywKICAgIAlidW1wbWFwX3BhcnNfZnJhZ21lbnQ6IGJ1bXBtYXBfcGFyc19mcmFnbWVudCwKICAgIAljbGlwcGluZ19wbGFuZXNfZnJhZ21lbnQ6IGNsaXBwaW5nX3BsYW5lc19mcmFnbWVudCwKICAgIAljbGlwcGluZ19wbGFuZXNfcGFyc19mcmFnbWVudDogY2xpcHBpbmdfcGxhbmVzX3BhcnNfZnJhZ21lbnQsCiAgICAJY2xpcHBpbmdfcGxhbmVzX3BhcnNfdmVydGV4OiBjbGlwcGluZ19wbGFuZXNfcGFyc192ZXJ0ZXgsCiAgICAJY2xpcHBpbmdfcGxhbmVzX3ZlcnRleDogY2xpcHBpbmdfcGxhbmVzX3ZlcnRleCwKICAgIAljb2xvcl9mcmFnbWVudDogY29sb3JfZnJhZ21lbnQsCiAgICAJY29sb3JfcGFyc19mcmFnbWVudDogY29sb3JfcGFyc19mcmFnbWVudCwKICAgIAljb2xvcl9wYXJzX3ZlcnRleDogY29sb3JfcGFyc192ZXJ0ZXgsCiAgICAJY29sb3JfdmVydGV4OiBjb2xvcl92ZXJ0ZXgsCiAgICAJY29tbW9uOiBjb21tb24sCiAgICAJY3ViZV91dl9yZWZsZWN0aW9uX2ZyYWdtZW50OiBjdWJlX3V2X3JlZmxlY3Rpb25fZnJhZ21lbnQsCiAgICAJZGVmYXVsdG5vcm1hbF92ZXJ0ZXg6IGRlZmF1bHRub3JtYWxfdmVydGV4LAogICAgCWRpc3BsYWNlbWVudG1hcF9wYXJzX3ZlcnRleDogZGlzcGxhY2VtZW50bWFwX3BhcnNfdmVydGV4LAogICAgCWRpc3BsYWNlbWVudG1hcF92ZXJ0ZXg6IGRpc3BsYWNlbWVudG1hcF92ZXJ0ZXgsCiAgICAJZW1pc3NpdmVtYXBfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX2ZyYWdtZW50LAogICAgCWVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQ6IGVtaXNzaXZlbWFwX3BhcnNfZnJhZ21lbnQsCiAgICAJZW5jb2RpbmdzX2ZyYWdtZW50OiBlbmNvZGluZ3NfZnJhZ21lbnQsCiAgICAJZW5jb2RpbmdzX3BhcnNfZnJhZ21lbnQ6IGVuY29kaW5nc19wYXJzX2ZyYWdtZW50LAogICAgCWVudm1hcF9mcmFnbWVudDogZW52bWFwX2ZyYWdtZW50LAogICAgCWVudm1hcF9jb21tb25fcGFyc19mcmFnbWVudDogZW52bWFwX2NvbW1vbl9wYXJzX2ZyYWdtZW50LAogICAgCWVudm1hcF9wYXJzX2ZyYWdtZW50OiBlbnZtYXBfcGFyc19mcmFnbWVudCwKICAgIAllbnZtYXBfcGFyc192ZXJ0ZXg6IGVudm1hcF9wYXJzX3ZlcnRleCwKICAgIAllbnZtYXBfcGh5c2ljYWxfcGFyc19mcmFnbWVudDogZW52bWFwX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQsCiAgICAJZW52bWFwX3ZlcnRleDogZW52bWFwX3ZlcnRleCwKICAgIAlmb2dfdmVydGV4OiBmb2dfdmVydGV4LAogICAgCWZvZ19wYXJzX3ZlcnRleDogZm9nX3BhcnNfdmVydGV4LAogICAgCWZvZ19mcmFnbWVudDogZm9nX2ZyYWdtZW50LAogICAgCWZvZ19wYXJzX2ZyYWdtZW50OiBmb2dfcGFyc19mcmFnbWVudCwKICAgIAlncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50OiBncmFkaWVudG1hcF9wYXJzX2ZyYWdtZW50LAogICAgCWxpZ2h0bWFwX2ZyYWdtZW50OiBsaWdodG1hcF9mcmFnbWVudCwKICAgIAlsaWdodG1hcF9wYXJzX2ZyYWdtZW50OiBsaWdodG1hcF9wYXJzX2ZyYWdtZW50LAogICAgCWxpZ2h0c19sYW1iZXJ0X3ZlcnRleDogbGlnaHRzX2xhbWJlcnRfdmVydGV4LAogICAgCWxpZ2h0c19wYXJzX2JlZ2luOiBsaWdodHNfcGFyc19iZWdpbiwKICAgIAlsaWdodHNfcGhvbmdfZnJhZ21lbnQ6IGxpZ2h0c19waG9uZ19mcmFnbWVudCwKICAgIAlsaWdodHNfcGhvbmdfcGFyc19mcmFnbWVudDogbGlnaHRzX3Bob25nX3BhcnNfZnJhZ21lbnQsCiAgICAJbGlnaHRzX3BoeXNpY2FsX2ZyYWdtZW50OiBsaWdodHNfcGh5c2ljYWxfZnJhZ21lbnQsCiAgICAJbGlnaHRzX3BoeXNpY2FsX3BhcnNfZnJhZ21lbnQ6IGxpZ2h0c19waHlzaWNhbF9wYXJzX2ZyYWdtZW50LAogICAgCWxpZ2h0c19mcmFnbWVudF9iZWdpbjogbGlnaHRzX2ZyYWdtZW50X2JlZ2luLAogICAgCWxpZ2h0c19mcmFnbWVudF9tYXBzOiBsaWdodHNfZnJhZ21lbnRfbWFwcywKICAgIAlsaWdodHNfZnJhZ21lbnRfZW5kOiBsaWdodHNfZnJhZ21lbnRfZW5kLAogICAgCWxvZ2RlcHRoYnVmX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9mcmFnbWVudCwKICAgIAlsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50OiBsb2dkZXB0aGJ1Zl9wYXJzX2ZyYWdtZW50LAogICAgCWxvZ2RlcHRoYnVmX3BhcnNfdmVydGV4OiBsb2dkZXB0aGJ1Zl9wYXJzX3ZlcnRleCwKICAgIAlsb2dkZXB0aGJ1Zl92ZXJ0ZXg6IGxvZ2RlcHRoYnVmX3ZlcnRleCwKICAgIAltYXBfZnJhZ21lbnQ6IG1hcF9mcmFnbWVudCwKICAgIAltYXBfcGFyc19mcmFnbWVudDogbWFwX3BhcnNfZnJhZ21lbnQsCiAgICAJbWFwX3BhcnRpY2xlX2ZyYWdtZW50OiBtYXBfcGFydGljbGVfZnJhZ21lbnQsCiAgICAJbWFwX3BhcnRpY2xlX3BhcnNfZnJhZ21lbnQ6IG1hcF9wYXJ0aWNsZV9wYXJzX2ZyYWdtZW50LAogICAgCW1ldGFsbmVzc21hcF9mcmFnbWVudDogbWV0YWxuZXNzbWFwX2ZyYWdtZW50LAogICAgCW1ldGFsbmVzc21hcF9wYXJzX2ZyYWdtZW50OiBtZXRhbG5lc3NtYXBfcGFyc19mcmFnbWVudCwKICAgIAltb3JwaG5vcm1hbF92ZXJ0ZXg6IG1vcnBobm9ybWFsX3ZlcnRleCwKICAgIAltb3JwaHRhcmdldF9wYXJzX3ZlcnRleDogbW9ycGh0YXJnZXRfcGFyc192ZXJ0ZXgsCiAgICAJbW9ycGh0YXJnZXRfdmVydGV4OiBtb3JwaHRhcmdldF92ZXJ0ZXgsCiAgICAJbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiBub3JtYWxfZnJhZ21lbnRfYmVnaW4sCiAgICAJbm9ybWFsX2ZyYWdtZW50X21hcHM6IG5vcm1hbF9mcmFnbWVudF9tYXBzLAogICAgCW5vcm1hbG1hcF9wYXJzX2ZyYWdtZW50OiBub3JtYWxtYXBfcGFyc19mcmFnbWVudCwKICAgIAljbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luOiBjbGVhcmNvYXRfbm9ybWFsX2ZyYWdtZW50X2JlZ2luLAogICAgCWNsZWFyY29hdF9ub3JtYWxfZnJhZ21lbnRfbWFwczogY2xlYXJjb2F0X25vcm1hbF9mcmFnbWVudF9tYXBzLAogICAgCWNsZWFyY29hdF9ub3JtYWxtYXBfcGFyc19mcmFnbWVudDogY2xlYXJjb2F0X25vcm1hbG1hcF9wYXJzX2ZyYWdtZW50LAogICAgCXBhY2tpbmc6IHBhY2tpbmcsCiAgICAJcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudDogcHJlbXVsdGlwbGllZF9hbHBoYV9mcmFnbWVudCwKICAgIAlwcm9qZWN0X3ZlcnRleDogcHJvamVjdF92ZXJ0ZXgsCiAgICAJZGl0aGVyaW5nX2ZyYWdtZW50OiBkaXRoZXJpbmdfZnJhZ21lbnQsCiAgICAJZGl0aGVyaW5nX3BhcnNfZnJhZ21lbnQ6IGRpdGhlcmluZ19wYXJzX2ZyYWdtZW50LAogICAgCXJvdWdobmVzc21hcF9mcmFnbWVudDogcm91Z2huZXNzbWFwX2ZyYWdtZW50LAogICAgCXJvdWdobmVzc21hcF9wYXJzX2ZyYWdtZW50OiByb3VnaG5lc3NtYXBfcGFyc19mcmFnbWVudCwKICAgIAlzaGFkb3dtYXBfcGFyc19mcmFnbWVudDogc2hhZG93bWFwX3BhcnNfZnJhZ21lbnQsCiAgICAJc2hhZG93bWFwX3BhcnNfdmVydGV4OiBzaGFkb3dtYXBfcGFyc192ZXJ0ZXgsCiAgICAJc2hhZG93bWFwX3ZlcnRleDogc2hhZG93bWFwX3ZlcnRleCwKICAgIAlzaGFkb3dtYXNrX3BhcnNfZnJhZ21lbnQ6IHNoYWRvd21hc2tfcGFyc19mcmFnbWVudCwKICAgIAlza2luYmFzZV92ZXJ0ZXg6IHNraW5iYXNlX3ZlcnRleCwKICAgIAlza2lubmluZ19wYXJzX3ZlcnRleDogc2tpbm5pbmdfcGFyc192ZXJ0ZXgsCiAgICAJc2tpbm5pbmdfdmVydGV4OiBza2lubmluZ192ZXJ0ZXgsCiAgICAJc2tpbm5vcm1hbF92ZXJ0ZXg6IHNraW5ub3JtYWxfdmVydGV4LAogICAgCXNwZWN1bGFybWFwX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9mcmFnbWVudCwKICAgIAlzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50OiBzcGVjdWxhcm1hcF9wYXJzX2ZyYWdtZW50LAogICAgCXRvbmVtYXBwaW5nX2ZyYWdtZW50OiB0b25lbWFwcGluZ19mcmFnbWVudCwKICAgIAl0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50OiB0b25lbWFwcGluZ19wYXJzX2ZyYWdtZW50LAogICAgCXV2X3BhcnNfZnJhZ21lbnQ6IHV2X3BhcnNfZnJhZ21lbnQsCiAgICAJdXZfcGFyc192ZXJ0ZXg6IHV2X3BhcnNfdmVydGV4LAogICAgCXV2X3ZlcnRleDogdXZfdmVydGV4LAogICAgCXV2Ml9wYXJzX2ZyYWdtZW50OiB1djJfcGFyc19mcmFnbWVudCwKICAgIAl1djJfcGFyc192ZXJ0ZXg6IHV2Ml9wYXJzX3ZlcnRleCwKICAgIAl1djJfdmVydGV4OiB1djJfdmVydGV4LAogICAgCXdvcmxkcG9zX3ZlcnRleDogd29ybGRwb3NfdmVydGV4LAoKICAgIAliYWNrZ3JvdW5kX2ZyYWc6IGJhY2tncm91bmRfZnJhZywKICAgIAliYWNrZ3JvdW5kX3ZlcnQ6IGJhY2tncm91bmRfdmVydCwKICAgIAljdWJlX2ZyYWc6IGN1YmVfZnJhZywKICAgIAljdWJlX3ZlcnQ6IGN1YmVfdmVydCwKICAgIAlkZXB0aF9mcmFnOiBkZXB0aF9mcmFnLAogICAgCWRlcHRoX3ZlcnQ6IGRlcHRoX3ZlcnQsCiAgICAJZGlzdGFuY2VSR0JBX2ZyYWc6IGRpc3RhbmNlUkdCQV9mcmFnLAogICAgCWRpc3RhbmNlUkdCQV92ZXJ0OiBkaXN0YW5jZVJHQkFfdmVydCwKICAgIAllcXVpcmVjdF9mcmFnOiBlcXVpcmVjdF9mcmFnLAogICAgCWVxdWlyZWN0X3ZlcnQ6IGVxdWlyZWN0X3ZlcnQsCiAgICAJbGluZWRhc2hlZF9mcmFnOiBsaW5lZGFzaGVkX2ZyYWcsCiAgICAJbGluZWRhc2hlZF92ZXJ0OiBsaW5lZGFzaGVkX3ZlcnQsCiAgICAJbWVzaGJhc2ljX2ZyYWc6IG1lc2hiYXNpY19mcmFnLAogICAgCW1lc2hiYXNpY192ZXJ0OiBtZXNoYmFzaWNfdmVydCwKICAgIAltZXNobGFtYmVydF9mcmFnOiBtZXNobGFtYmVydF9mcmFnLAogICAgCW1lc2hsYW1iZXJ0X3ZlcnQ6IG1lc2hsYW1iZXJ0X3ZlcnQsCiAgICAJbWVzaG1hdGNhcF9mcmFnOiBtZXNobWF0Y2FwX2ZyYWcsCiAgICAJbWVzaG1hdGNhcF92ZXJ0OiBtZXNobWF0Y2FwX3ZlcnQsCiAgICAJbWVzaHBob25nX2ZyYWc6IG1lc2hwaG9uZ19mcmFnLAogICAgCW1lc2hwaG9uZ192ZXJ0OiBtZXNocGhvbmdfdmVydCwKICAgIAltZXNocGh5c2ljYWxfZnJhZzogbWVzaHBoeXNpY2FsX2ZyYWcsCiAgICAJbWVzaHBoeXNpY2FsX3ZlcnQ6IG1lc2hwaHlzaWNhbF92ZXJ0LAogICAgCW5vcm1hbF9mcmFnOiBub3JtYWxfZnJhZywKICAgIAlub3JtYWxfdmVydDogbm9ybWFsX3ZlcnQsCiAgICAJcG9pbnRzX2ZyYWc6IHBvaW50c19mcmFnLAogICAgCXBvaW50c192ZXJ0OiBwb2ludHNfdmVydCwKICAgIAlzaGFkb3dfZnJhZzogc2hhZG93X2ZyYWcsCiAgICAJc2hhZG93X3ZlcnQ6IHNoYWRvd192ZXJ0LAogICAgCXNwcml0ZV9mcmFnOiBzcHJpdGVfZnJhZywKICAgIAlzcHJpdGVfdmVydDogc3ByaXRlX3ZlcnQKICAgIH07CgogICAgLyoqCiAgICAgKiBVbmlmb3JtcyBsaWJyYXJ5IGZvciBzaGFyZWQgd2ViZ2wgc2hhZGVycwogICAgICovCgogICAgdmFyIFVuaWZvcm1zTGliID0gewoKICAgIAljb21tb246IHsKCiAgICAJCWRpZmZ1c2U6IHsgdmFsdWU6IG5ldyBDb2xvciQ3KCAweGVlZWVlZSApIH0sCiAgICAJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9LAoKICAgIAkJbWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAJCXV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0sCgogICAgCQlhbHBoYU1hcDogeyB2YWx1ZTogbnVsbCB9LAoKICAgIAl9LAoKICAgIAlzcGVjdWxhcm1hcDogewoKICAgIAkJc3BlY3VsYXJNYXA6IHsgdmFsdWU6IG51bGwgfSwKCiAgICAJfSwKCiAgICAJZW52bWFwOiB7CgogICAgCQllbnZNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgIAkJZmxpcEVudk1hcDogeyB2YWx1ZTogLSAxIH0sCiAgICAJCXJlZmxlY3Rpdml0eTogeyB2YWx1ZTogMS4wIH0sCiAgICAJCXJlZnJhY3Rpb25SYXRpbzogeyB2YWx1ZTogMC45OCB9LAogICAgCQltYXhNaXBMZXZlbDogeyB2YWx1ZTogMCB9CgogICAgCX0sCgogICAgCWFvbWFwOiB7CgogICAgCQlhb01hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgCQlhb01hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9CgogICAgCX0sCgogICAgCWxpZ2h0bWFwOiB7CgogICAgCQlsaWdodE1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgCQlsaWdodE1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9CgogICAgCX0sCgogICAgCWVtaXNzaXZlbWFwOiB7CgogICAgCQllbWlzc2l2ZU1hcDogeyB2YWx1ZTogbnVsbCB9CgogICAgCX0sCgogICAgCWJ1bXBtYXA6IHsKCiAgICAJCWJ1bXBNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgIAkJYnVtcFNjYWxlOiB7IHZhbHVlOiAxIH0KCiAgICAJfSwKCiAgICAJbm9ybWFsbWFwOiB7CgogICAgCQlub3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgIAkJbm9ybWFsU2NhbGU6IHsgdmFsdWU6IG5ldyBWZWN0b3IyKCAxLCAxICkgfQoKICAgIAl9LAoKICAgIAlkaXNwbGFjZW1lbnRtYXA6IHsKCiAgICAJCWRpc3BsYWNlbWVudE1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgCQlkaXNwbGFjZW1lbnRTY2FsZTogeyB2YWx1ZTogMSB9LAogICAgCQlkaXNwbGFjZW1lbnRCaWFzOiB7IHZhbHVlOiAwIH0KCiAgICAJfSwKCiAgICAJcm91Z2huZXNzbWFwOiB7CgogICAgCQlyb3VnaG5lc3NNYXA6IHsgdmFsdWU6IG51bGwgfQoKICAgIAl9LAoKICAgIAltZXRhbG5lc3NtYXA6IHsKCiAgICAJCW1ldGFsbmVzc01hcDogeyB2YWx1ZTogbnVsbCB9CgogICAgCX0sCgogICAgCWdyYWRpZW50bWFwOiB7CgogICAgCQlncmFkaWVudE1hcDogeyB2YWx1ZTogbnVsbCB9CgogICAgCX0sCgogICAgCWZvZzogewoKICAgIAkJZm9nRGVuc2l0eTogeyB2YWx1ZTogMC4wMDAyNSB9LAogICAgCQlmb2dOZWFyOiB7IHZhbHVlOiAxIH0sCiAgICAJCWZvZ0ZhcjogeyB2YWx1ZTogMjAwMCB9LAogICAgCQlmb2dDb2xvcjogeyB2YWx1ZTogbmV3IENvbG9yJDcoIDB4ZmZmZmZmICkgfQoKICAgIAl9LAoKICAgIAlsaWdodHM6IHsKCiAgICAJCWFtYmllbnRMaWdodENvbG9yOiB7IHZhbHVlOiBbXSB9LAoKICAgIAkJbGlnaHRQcm9iZTogeyB2YWx1ZTogW10gfSwKCiAgICAJCWRpcmVjdGlvbmFsTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgCQkJZGlyZWN0aW9uOiB7fSwKICAgIAkJCWNvbG9yOiB7fSwKCiAgICAJCQlzaGFkb3c6IHt9LAogICAgCQkJc2hhZG93Qmlhczoge30sCiAgICAJCQlzaGFkb3dSYWRpdXM6IHt9LAogICAgCQkJc2hhZG93TWFwU2l6ZToge30KICAgIAkJfSB9LAoKICAgIAkJZGlyZWN0aW9uYWxTaGFkb3dNYXA6IHsgdmFsdWU6IFtdIH0sCiAgICAJCWRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiB7IHZhbHVlOiBbXSB9LAoKICAgIAkJc3BvdExpZ2h0czogeyB2YWx1ZTogW10sIHByb3BlcnRpZXM6IHsKICAgIAkJCWNvbG9yOiB7fSwKICAgIAkJCXBvc2l0aW9uOiB7fSwKICAgIAkJCWRpcmVjdGlvbjoge30sCiAgICAJCQlkaXN0YW5jZToge30sCiAgICAJCQljb25lQ29zOiB7fSwKICAgIAkJCXBlbnVtYnJhQ29zOiB7fSwKICAgIAkJCWRlY2F5OiB7fSwKCiAgICAJCQlzaGFkb3c6IHt9LAogICAgCQkJc2hhZG93Qmlhczoge30sCiAgICAJCQlzaGFkb3dSYWRpdXM6IHt9LAogICAgCQkJc2hhZG93TWFwU2l6ZToge30KICAgIAkJfSB9LAoKICAgIAkJc3BvdFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKICAgIAkJc3BvdFNoYWRvd01hdHJpeDogeyB2YWx1ZTogW10gfSwKCiAgICAJCXBvaW50TGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgCQkJY29sb3I6IHt9LAogICAgCQkJcG9zaXRpb246IHt9LAogICAgCQkJZGVjYXk6IHt9LAogICAgCQkJZGlzdGFuY2U6IHt9LAoKICAgIAkJCXNoYWRvdzoge30sCiAgICAJCQlzaGFkb3dCaWFzOiB7fSwKICAgIAkJCXNoYWRvd1JhZGl1czoge30sCiAgICAJCQlzaGFkb3dNYXBTaXplOiB7fSwKICAgIAkJCXNoYWRvd0NhbWVyYU5lYXI6IHt9LAogICAgCQkJc2hhZG93Q2FtZXJhRmFyOiB7fQogICAgCQl9IH0sCgogICAgCQlwb2ludFNoYWRvd01hcDogeyB2YWx1ZTogW10gfSwKICAgIAkJcG9pbnRTaGFkb3dNYXRyaXg6IHsgdmFsdWU6IFtdIH0sCgogICAgCQloZW1pc3BoZXJlTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgCQkJZGlyZWN0aW9uOiB7fSwKICAgIAkJCXNreUNvbG9yOiB7fSwKICAgIAkJCWdyb3VuZENvbG9yOiB7fQogICAgCQl9IH0sCgogICAgCQkvLyBUT0RPIChhYmVsbmF0aW9uKTogUmVjdEFyZWFMaWdodCBCUkRGIGRhdGEgbmVlZHMgdG8gYmUgbW92ZWQgZnJvbSBleGFtcGxlIHRvIG1haW4gc3JjCiAgICAJCXJlY3RBcmVhTGlnaHRzOiB7IHZhbHVlOiBbXSwgcHJvcGVydGllczogewogICAgCQkJY29sb3I6IHt9LAogICAgCQkJcG9zaXRpb246IHt9LAogICAgCQkJd2lkdGg6IHt9LAogICAgCQkJaGVpZ2h0OiB7fQogICAgCQl9IH0KCiAgICAJfSwKCiAgICAJcG9pbnRzOiB7CgogICAgCQlkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IkNyggMHhlZWVlZWUgKSB9LAogICAgCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSwKICAgIAkJc2l6ZTogeyB2YWx1ZTogMS4wIH0sCiAgICAJCXNjYWxlOiB7IHZhbHVlOiAxLjAgfSwKICAgIAkJbWFwOiB7IHZhbHVlOiBudWxsIH0sCiAgICAJCXV2VHJhbnNmb3JtOiB7IHZhbHVlOiBuZXcgTWF0cml4MygpIH0KCiAgICAJfSwKCiAgICAJc3ByaXRlOiB7CgogICAgCQlkaWZmdXNlOiB7IHZhbHVlOiBuZXcgQ29sb3IkNyggMHhlZWVlZWUgKSB9LAogICAgCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfSwKICAgIAkJY2VudGVyOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiggMC41LCAwLjUgKSB9LAogICAgCQlyb3RhdGlvbjogeyB2YWx1ZTogMC4wIH0sCiAgICAJCW1hcDogeyB2YWx1ZTogbnVsbCB9LAogICAgCQl1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9CgogICAgCX0KCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLwogICAgICovCgogICAgdmFyIFNoYWRlckxpYiA9IHsKCiAgICAJYmFzaWM6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5jb21tb24sCiAgICAJCQlVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmVudm1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmFvbWFwLAogICAgCQkJVW5pZm9ybXNMaWIubGlnaHRtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5mb2cKICAgIAkJXSApLAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNoYmFzaWNfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hiYXNpY19mcmFnCgogICAgCX0sCgogICAgCWxhbWJlcnQ6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5jb21tb24sCiAgICAJCQlVbmlmb3Jtc0xpYi5zcGVjdWxhcm1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmVudm1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmFvbWFwLAogICAgCQkJVW5pZm9ybXNMaWIubGlnaHRtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmZvZywKICAgIAkJCVVuaWZvcm1zTGliLmxpZ2h0cywKICAgIAkJCXsKICAgIAkJCQllbWlzc2l2ZTogeyB2YWx1ZTogbmV3IENvbG9yJDcoIDB4MDAwMDAwICkgfQogICAgCQkJfQogICAgCQldICksCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hsYW1iZXJ0X3ZlcnQsCiAgICAJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNobGFtYmVydF9mcmFnCgogICAgCX0sCgogICAgCXBob25nOiB7CgogICAgCQl1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggWwogICAgCQkJVW5pZm9ybXNMaWIuY29tbW9uLAogICAgCQkJVW5pZm9ybXNMaWIuc3BlY3VsYXJtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5lbnZtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5hb21hcCwKICAgIAkJCVVuaWZvcm1zTGliLmxpZ2h0bWFwLAogICAgCQkJVW5pZm9ybXNMaWIuZW1pc3NpdmVtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5idW1wbWFwLAogICAgCQkJVW5pZm9ybXNMaWIubm9ybWFsbWFwLAogICAgCQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLAogICAgCQkJVW5pZm9ybXNMaWIuZ3JhZGllbnRtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5mb2csCiAgICAJCQlVbmlmb3Jtc0xpYi5saWdodHMsCiAgICAJCQl7CiAgICAJCQkJZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciQ3KCAweDAwMDAwMCApIH0sCiAgICAJCQkJc3BlY3VsYXI6IHsgdmFsdWU6IG5ldyBDb2xvciQ3KCAweDExMTExMSApIH0sCiAgICAJCQkJc2hpbmluZXNzOiB7IHZhbHVlOiAzMCB9CiAgICAJCQl9CiAgICAJCV0gKSwKCiAgICAJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBob25nX3ZlcnQsCiAgICAJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGhvbmdfZnJhZwoKICAgIAl9LAoKICAgIAlzdGFuZGFyZDogewoKICAgIAkJdW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFsKICAgIAkJCVVuaWZvcm1zTGliLmNvbW1vbiwKICAgIAkJCVVuaWZvcm1zTGliLmVudm1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmFvbWFwLAogICAgCQkJVW5pZm9ybXNMaWIubGlnaHRtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5lbWlzc2l2ZW1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmJ1bXBtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5ub3JtYWxtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5yb3VnaG5lc3NtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5tZXRhbG5lc3NtYXAsCiAgICAJCQlVbmlmb3Jtc0xpYi5mb2csCiAgICAJCQlVbmlmb3Jtc0xpYi5saWdodHMsCiAgICAJCQl7CiAgICAJCQkJZW1pc3NpdmU6IHsgdmFsdWU6IG5ldyBDb2xvciQ3KCAweDAwMDAwMCApIH0sCiAgICAJCQkJcm91Z2huZXNzOiB7IHZhbHVlOiAwLjUgfSwKICAgIAkJCQltZXRhbG5lc3M6IHsgdmFsdWU6IDAuNSB9LAogICAgCQkJCWVudk1hcEludGVuc2l0eTogeyB2YWx1ZTogMSB9IC8vIHRlbXBvcmFyeQogICAgCQkJfQogICAgCQldICksCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2hwaHlzaWNhbF92ZXJ0LAogICAgCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWcKCiAgICAJfSwKCiAgICAJbWF0Y2FwOiB7CgogICAgCQl1bmlmb3JtczogbWVyZ2VVbmlmb3JtcyggWwogICAgCQkJVW5pZm9ybXNMaWIuY29tbW9uLAogICAgCQkJVW5pZm9ybXNMaWIuYnVtcG1hcCwKICAgIAkJCVVuaWZvcm1zTGliLm5vcm1hbG1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmRpc3BsYWNlbWVudG1hcCwKICAgIAkJCVVuaWZvcm1zTGliLmZvZywKICAgIAkJCXsKICAgIAkJCQltYXRjYXA6IHsgdmFsdWU6IG51bGwgfQogICAgCQkJfQogICAgCQldICksCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLm1lc2htYXRjYXBfZnJhZwoKICAgIAl9LAoKICAgIAlwb2ludHM6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5wb2ludHMsCiAgICAJCQlVbmlmb3Jtc0xpYi5mb2cKICAgIAkJXSApLAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5wb2ludHNfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnBvaW50c19mcmFnCgogICAgCX0sCgogICAgCWRhc2hlZDogewoKICAgIAkJdW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFsKICAgIAkJCVVuaWZvcm1zTGliLmNvbW1vbiwKICAgIAkJCVVuaWZvcm1zTGliLmZvZywKICAgIAkJCXsKICAgIAkJCQlzY2FsZTogeyB2YWx1ZTogMSB9LAogICAgCQkJCWRhc2hTaXplOiB7IHZhbHVlOiAxIH0sCiAgICAJCQkJdG90YWxTaXplOiB7IHZhbHVlOiAyIH0KICAgIAkJCX0KICAgIAkJXSApLAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX3ZlcnQsCiAgICAJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5saW5lZGFzaGVkX2ZyYWcKCiAgICAJfSwKCiAgICAJZGVwdGg6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5jb21tb24sCiAgICAJCQlVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAKICAgIAkJXSApLAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5kZXB0aF92ZXJ0LAogICAgCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZGVwdGhfZnJhZwoKICAgIAl9LAoKICAgIAlub3JtYWw6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5jb21tb24sCiAgICAJCQlVbmlmb3Jtc0xpYi5idW1wbWFwLAogICAgCQkJVW5pZm9ybXNMaWIubm9ybWFsbWFwLAogICAgCQkJVW5pZm9ybXNMaWIuZGlzcGxhY2VtZW50bWFwLAogICAgCQkJewogICAgCQkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CiAgICAJCQl9CiAgICAJCV0gKSwKCiAgICAJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsubm9ybWFsX3ZlcnQsCiAgICAJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5ub3JtYWxfZnJhZwoKICAgIAl9LAoKICAgIAlzcHJpdGU6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5zcHJpdGUsCiAgICAJCQlVbmlmb3Jtc0xpYi5mb2cKICAgIAkJXSApLAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zcHJpdGVfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNwcml0ZV9mcmFnCgogICAgCX0sCgogICAgCWJhY2tncm91bmQ6IHsKCiAgICAJCXVuaWZvcm1zOiB7CiAgICAJCQl1dlRyYW5zZm9ybTogeyB2YWx1ZTogbmV3IE1hdHJpeDMoKSB9LAogICAgCQkJdDJEOiB7IHZhbHVlOiBudWxsIH0sCiAgICAJCX0sCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmJhY2tncm91bmRfZnJhZwoKICAgIAl9LAogICAgCS8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgIAkvLwlDdWJlIG1hcCBzaGFkZXIKICAgIAkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKICAgIAljdWJlOiB7CgogICAgCQl1bmlmb3JtczogewogICAgCQkJdEN1YmU6IHsgdmFsdWU6IG51bGwgfSwKICAgIAkJCXRGbGlwOiB7IHZhbHVlOiAtIDEgfSwKICAgIAkJCW9wYWNpdHk6IHsgdmFsdWU6IDEuMCB9CiAgICAJCX0sCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLmN1YmVfZnJhZwoKICAgIAl9LAoKICAgIAllcXVpcmVjdDogewoKICAgIAkJdW5pZm9ybXM6IHsKICAgIAkJCXRFcXVpcmVjdDogeyB2YWx1ZTogbnVsbCB9LAogICAgCQl9LAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5lcXVpcmVjdF92ZXJ0LAogICAgCQlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsuZXF1aXJlY3RfZnJhZwoKICAgIAl9LAoKICAgIAlkaXN0YW5jZVJHQkE6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5jb21tb24sCiAgICAJCQlVbmlmb3Jtc0xpYi5kaXNwbGFjZW1lbnRtYXAsCiAgICAJCQl7CiAgICAJCQkJcmVmZXJlbmNlUG9zaXRpb246IHsgdmFsdWU6IG5ldyBWZWN0b3IzKCkgfSwKICAgIAkJCQluZWFyRGlzdGFuY2U6IHsgdmFsdWU6IDEgfSwKICAgIAkJCQlmYXJEaXN0YW5jZTogeyB2YWx1ZTogMTAwMCB9CiAgICAJCQl9CiAgICAJCV0gKSwKCiAgICAJCXZlcnRleFNoYWRlcjogU2hhZGVyQ2h1bmsuZGlzdGFuY2VSR0JBX3ZlcnQsCiAgICAJCWZyYWdtZW50U2hhZGVyOiBTaGFkZXJDaHVuay5kaXN0YW5jZVJHQkFfZnJhZwoKICAgIAl9LAoKICAgIAlzaGFkb3c6IHsKCiAgICAJCXVuaWZvcm1zOiBtZXJnZVVuaWZvcm1zKCBbCiAgICAJCQlVbmlmb3Jtc0xpYi5saWdodHMsCiAgICAJCQlVbmlmb3Jtc0xpYi5mb2csCiAgICAJCQl7CiAgICAJCQkJY29sb3I6IHsgdmFsdWU6IG5ldyBDb2xvciQ3KCAweDAwMDAwICkgfSwKICAgIAkJCQlvcGFjaXR5OiB7IHZhbHVlOiAxLjAgfQogICAgCQkJfSwKICAgIAkJXSApLAoKICAgIAkJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5zaGFkb3dfdmVydCwKICAgIAkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckNodW5rLnNoYWRvd19mcmFnCgogICAgCX0KCiAgICB9OwoKICAgIFNoYWRlckxpYi5waHlzaWNhbCA9IHsKCiAgICAJdW5pZm9ybXM6IG1lcmdlVW5pZm9ybXMoIFsKICAgIAkJU2hhZGVyTGliLnN0YW5kYXJkLnVuaWZvcm1zLAogICAgCQl7CiAgICAJCQl0cmFuc3BhcmVuY3k6IHsgdmFsdWU6IDAgfSwKICAgIAkJCWNsZWFyY29hdDogeyB2YWx1ZTogMCB9LAogICAgCQkJY2xlYXJjb2F0Um91Z2huZXNzOiB7IHZhbHVlOiAwIH0sCiAgICAJCQlzaGVlbjogeyB2YWx1ZTogbmV3IENvbG9yJDcoIDB4MDAwMDAwICkgfSwKICAgIAkJCWNsZWFyY29hdE5vcm1hbFNjYWxlOiB7IHZhbHVlOiBuZXcgVmVjdG9yMiggMSwgMSApIH0sCiAgICAJCQljbGVhcmNvYXROb3JtYWxNYXA6IHsgdmFsdWU6IG51bGwgfSwKICAgIAkJfQogICAgCV0gKSwKCiAgICAJdmVydGV4U2hhZGVyOiBTaGFkZXJDaHVuay5tZXNocGh5c2ljYWxfdmVydCwKICAgIAlmcmFnbWVudFNoYWRlcjogU2hhZGVyQ2h1bmsubWVzaHBoeXNpY2FsX2ZyYWcKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMQW5pbWF0aW9uKCkgewoKICAgIAl2YXIgY29udGV4dCA9IG51bGw7CiAgICAJdmFyIGlzQW5pbWF0aW5nID0gZmFsc2U7CiAgICAJdmFyIGFuaW1hdGlvbkxvb3AgPSBudWxsOwoKICAgIAlmdW5jdGlvbiBvbkFuaW1hdGlvbkZyYW1lKCB0aW1lLCBmcmFtZSApIHsKCiAgICAJCWlmICggaXNBbmltYXRpbmcgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJYW5pbWF0aW9uTG9vcCggdGltZSwgZnJhbWUgKTsKCiAgICAJCWNvbnRleHQucmVxdWVzdEFuaW1hdGlvbkZyYW1lKCBvbkFuaW1hdGlvbkZyYW1lICk7CgogICAgCX0KCiAgICAJcmV0dXJuIHsKCiAgICAJCXN0YXJ0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJaWYgKCBpc0FuaW1hdGluZyA9PT0gdHJ1ZSApIHJldHVybjsKICAgIAkJCWlmICggYW5pbWF0aW9uTG9vcCA9PT0gbnVsbCApIHJldHVybjsKCiAgICAJCQljb250ZXh0LnJlcXVlc3RBbmltYXRpb25GcmFtZSggb25BbmltYXRpb25GcmFtZSApOwoKICAgIAkJCWlzQW5pbWF0aW5nID0gdHJ1ZTsKCiAgICAJCX0sCgogICAgCQlzdG9wOiBmdW5jdGlvbiAoKSB7CgogICAgCQkJaXNBbmltYXRpbmcgPSBmYWxzZTsKCiAgICAJCX0sCgogICAgCQlzZXRBbmltYXRpb25Mb29wOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgewoKICAgIAkJCWFuaW1hdGlvbkxvb3AgPSBjYWxsYmFjazsKCiAgICAJCX0sCgogICAgCQlzZXRDb250ZXh0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnRleHQgPSB2YWx1ZTsKCiAgICAJCX0KCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xBdHRyaWJ1dGVzKCBnbCApIHsKCiAgICAJdmFyIGJ1ZmZlcnMgPSBuZXcgV2Vha01hcCgpOwoKICAgIAlmdW5jdGlvbiBjcmVhdGVCdWZmZXIoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHsKCiAgICAJCXZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKICAgIAkJdmFyIHVzYWdlID0gYXR0cmlidXRlLmR5bmFtaWMgPyAzNTA0OCA6IDM1MDQ0OwoKICAgIAkJdmFyIGJ1ZmZlciA9IGdsLmNyZWF0ZUJ1ZmZlcigpOwoKICAgIAkJZ2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7CiAgICAJCWdsLmJ1ZmZlckRhdGEoIGJ1ZmZlclR5cGUsIGFycmF5LCB1c2FnZSApOwoKICAgIAkJYXR0cmlidXRlLm9uVXBsb2FkQ2FsbGJhY2soKTsKCiAgICAJCXZhciB0eXBlID0gNTEyNjsKCiAgICAJCWlmICggYXJyYXkgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgKSB7CgogICAgCQkJdHlwZSA9IDUxMjY7CgogICAgCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTEF0dHJpYnV0ZXM6IFVuc3VwcG9ydGVkIGRhdGEgYnVmZmVyIGZvcm1hdDogRmxvYXQ2NEFycmF5LicgKTsKCiAgICAJCX0gZWxzZSBpZiAoIGFycmF5IGluc3RhbmNlb2YgVWludDE2QXJyYXkgKSB7CgogICAgCQkJdHlwZSA9IDUxMjM7CgogICAgCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIEludDE2QXJyYXkgKSB7CgogICAgCQkJdHlwZSA9IDUxMjI7CgogICAgCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQzMkFycmF5ICkgewoKICAgIAkJCXR5cGUgPSA1MTI1OwoKICAgIAkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQzMkFycmF5ICkgewoKICAgIAkJCXR5cGUgPSA1MTI0OwoKICAgIAkJfSBlbHNlIGlmICggYXJyYXkgaW5zdGFuY2VvZiBJbnQ4QXJyYXkgKSB7CgogICAgCQkJdHlwZSA9IDUxMjA7CgogICAgCQl9IGVsc2UgaWYgKCBhcnJheSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkgKSB7CgogICAgCQkJdHlwZSA9IDUxMjE7CgogICAgCQl9CgogICAgCQlyZXR1cm4gewogICAgCQkJYnVmZmVyOiBidWZmZXIsCiAgICAJCQl0eXBlOiB0eXBlLAogICAgCQkJYnl0ZXNQZXJFbGVtZW50OiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCwKICAgIAkJCXZlcnNpb246IGF0dHJpYnV0ZS52ZXJzaW9uCiAgICAJCX07CgogICAgCX0KCiAgICAJZnVuY3Rpb24gdXBkYXRlQnVmZmVyKCBidWZmZXIsIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHsKCiAgICAJCXZhciBhcnJheSA9IGF0dHJpYnV0ZS5hcnJheTsKICAgIAkJdmFyIHVwZGF0ZVJhbmdlID0gYXR0cmlidXRlLnVwZGF0ZVJhbmdlOwoKICAgIAkJZ2wuYmluZEJ1ZmZlciggYnVmZmVyVHlwZSwgYnVmZmVyICk7CgogICAgCQlpZiAoIGF0dHJpYnV0ZS5keW5hbWljID09PSBmYWxzZSApIHsKCiAgICAJCQlnbC5idWZmZXJEYXRhKCBidWZmZXJUeXBlLCBhcnJheSwgMzUwNDQgKTsKCiAgICAJCX0gZWxzZSBpZiAoIHVwZGF0ZVJhbmdlLmNvdW50ID09PSAtIDEgKSB7CgogICAgCQkJLy8gTm90IHVzaW5nIHVwZGF0ZSByYW5nZXMKCiAgICAJCQlnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCAwLCBhcnJheSApOwoKICAgIAkJfSBlbHNlIGlmICggdXBkYXRlUmFuZ2UuY291bnQgPT09IDAgKSB7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMT2JqZWN0cy51cGRhdGVCdWZmZXI6IGR5bmFtaWMgVEhSRUUuQnVmZmVyQXR0cmlidXRlIG1hcmtlZCBhcyBuZWVkc1VwZGF0ZSBidXQgdXBkYXRlUmFuZ2UuY291bnQgaXMgMCwgZW5zdXJlIHlvdSBhcmUgdXNpbmcgc2V0IG1ldGhvZHMgb3IgdXBkYXRpbmcgbWFudWFsbHkuJyApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlnbC5idWZmZXJTdWJEYXRhKCBidWZmZXJUeXBlLCB1cGRhdGVSYW5nZS5vZmZzZXQgKiBhcnJheS5CWVRFU19QRVJfRUxFTUVOVCwKICAgIAkJCQlhcnJheS5zdWJhcnJheSggdXBkYXRlUmFuZ2Uub2Zmc2V0LCB1cGRhdGVSYW5nZS5vZmZzZXQgKyB1cGRhdGVSYW5nZS5jb3VudCApICk7CgogICAgCQkJdXBkYXRlUmFuZ2UuY291bnQgPSAtIDE7IC8vIHJlc2V0IHJhbmdlCgogICAgCQl9CgogICAgCX0KCiAgICAJLy8KCiAgICAJZnVuY3Rpb24gZ2V0KCBhdHRyaWJ1dGUgKSB7CgogICAgCQlpZiAoIGF0dHJpYnV0ZS5pc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlICkgYXR0cmlidXRlID0gYXR0cmlidXRlLmRhdGE7CgogICAgCQlyZXR1cm4gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlbW92ZSggYXR0cmlidXRlICkgewoKICAgIAkJaWYgKCBhdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZS5kYXRhOwoKICAgIAkJdmFyIGRhdGEgPSBidWZmZXJzLmdldCggYXR0cmlidXRlICk7CgogICAgCQlpZiAoIGRhdGEgKSB7CgogICAgCQkJZ2wuZGVsZXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciApOwoKICAgIAkJCWJ1ZmZlcnMuZGVsZXRlKCBhdHRyaWJ1dGUgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiB1cGRhdGUoIGF0dHJpYnV0ZSwgYnVmZmVyVHlwZSApIHsKCiAgICAJCWlmICggYXR0cmlidXRlLmlzSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUgKSBhdHRyaWJ1dGUgPSBhdHRyaWJ1dGUuZGF0YTsKCiAgICAJCXZhciBkYXRhID0gYnVmZmVycy5nZXQoIGF0dHJpYnV0ZSApOwoKICAgIAkJaWYgKCBkYXRhID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJYnVmZmVycy5zZXQoIGF0dHJpYnV0ZSwgY3JlYXRlQnVmZmVyKCBhdHRyaWJ1dGUsIGJ1ZmZlclR5cGUgKSApOwoKICAgIAkJfSBlbHNlIGlmICggZGF0YS52ZXJzaW9uIDwgYXR0cmlidXRlLnZlcnNpb24gKSB7CgogICAgCQkJdXBkYXRlQnVmZmVyKCBkYXRhLmJ1ZmZlciwgYXR0cmlidXRlLCBidWZmZXJUeXBlICk7CgogICAgCQkJZGF0YS52ZXJzaW9uID0gYXR0cmlidXRlLnZlcnNpb247CgogICAgCQl9CgogICAgCX0KCiAgICAJcmV0dXJuIHsKCiAgICAJCWdldDogZ2V0LAogICAgCQlyZW1vdmU6IHJlbW92ZSwKICAgIAkJdXBkYXRlOiB1cGRhdGUKCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIC8vIFBsYW5lR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBQbGFuZUdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUGxhbmVHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJd2lkdGg6IHdpZHRoLAogICAgCQloZWlnaHQ6IGhlaWdodCwKICAgIAkJd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKICAgIAkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzCiAgICAJfTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCB3aWR0aCwgaGVpZ2h0LCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cyApICk7CiAgICAJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgogICAgfQoKICAgIFBsYW5lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBQbGFuZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBsYW5lR2VvbWV0cnk7CgogICAgLy8gUGxhbmVCdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFBsYW5lQnVmZmVyR2VvbWV0cnkoIHdpZHRoLCBoZWlnaHQsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzICkgewoKICAgIAlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdQbGFuZUJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQl3aWR0aDogd2lkdGgsCiAgICAJCWhlaWdodDogaGVpZ2h0LAogICAgCQl3aWR0aFNlZ21lbnRzOiB3aWR0aFNlZ21lbnRzLAogICAgCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMKICAgIAl9OwoKICAgIAl3aWR0aCA9IHdpZHRoIHx8IDE7CiAgICAJaGVpZ2h0ID0gaGVpZ2h0IHx8IDE7CgogICAgCXZhciB3aWR0aF9oYWxmID0gd2lkdGggLyAyOwogICAgCXZhciBoZWlnaHRfaGFsZiA9IGhlaWdodCAvIDI7CgogICAgCXZhciBncmlkWCA9IE1hdGguZmxvb3IoIHdpZHRoU2VnbWVudHMgKSB8fCAxOwogICAgCXZhciBncmlkWSA9IE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgMTsKCiAgICAJdmFyIGdyaWRYMSA9IGdyaWRYICsgMTsKICAgIAl2YXIgZ3JpZFkxID0gZ3JpZFkgKyAxOwoKICAgIAl2YXIgc2VnbWVudF93aWR0aCA9IHdpZHRoIC8gZ3JpZFg7CiAgICAJdmFyIHNlZ21lbnRfaGVpZ2h0ID0gaGVpZ2h0IC8gZ3JpZFk7CgogICAgCXZhciBpeCwgaXk7CgogICAgCS8vIGJ1ZmZlcnMKCiAgICAJdmFyIGluZGljZXMgPSBbXTsKICAgIAl2YXIgdmVydGljZXMgPSBbXTsKICAgIAl2YXIgbm9ybWFscyA9IFtdOwogICAgCXZhciB1dnMgPSBbXTsKCiAgICAJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cwoKICAgIAlmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFkxOyBpeSArKyApIHsKCiAgICAJCXZhciB5ID0gaXkgKiBzZWdtZW50X2hlaWdodCAtIGhlaWdodF9oYWxmOwoKICAgIAkJZm9yICggaXggPSAwOyBpeCA8IGdyaWRYMTsgaXggKysgKSB7CgogICAgCQkJdmFyIHggPSBpeCAqIHNlZ21lbnRfd2lkdGggLSB3aWR0aF9oYWxmOwoKICAgIAkJCXZlcnRpY2VzLnB1c2goIHgsIC0geSwgMCApOwoKICAgIAkJCW5vcm1hbHMucHVzaCggMCwgMCwgMSApOwoKICAgIAkJCXV2cy5wdXNoKCBpeCAvIGdyaWRYICk7CiAgICAJCQl1dnMucHVzaCggMSAtICggaXkgLyBncmlkWSApICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gaW5kaWNlcwoKICAgIAlmb3IgKCBpeSA9IDA7IGl5IDwgZ3JpZFk7IGl5ICsrICkgewoKICAgIAkJZm9yICggaXggPSAwOyBpeCA8IGdyaWRYOyBpeCArKyApIHsKCiAgICAJCQl2YXIgYSA9IGl4ICsgZ3JpZFgxICogaXk7CiAgICAJCQl2YXIgYiA9IGl4ICsgZ3JpZFgxICogKCBpeSArIDEgKTsKICAgIAkJCXZhciBjID0gKCBpeCArIDEgKSArIGdyaWRYMSAqICggaXkgKyAxICk7CiAgICAJCQl2YXIgZCA9ICggaXggKyAxICkgKyBncmlkWDEgKiBpeTsKCiAgICAJCQkvLyBmYWNlcwoKICAgIAkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwogICAgCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCiAgICB9CgogICAgUGxhbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIFBsYW5lQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGxhbmVCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBXZWJHTEJhY2tncm91bmQoIHJlbmRlcmVyLCBzdGF0ZSwgb2JqZWN0cywgcHJlbXVsdGlwbGllZEFscGhhICkgewoKICAgIAl2YXIgY2xlYXJDb2xvciA9IG5ldyBDb2xvciQ3KCAweDAwMDAwMCApOwogICAgCXZhciBjbGVhckFscGhhID0gMDsKCiAgICAJdmFyIHBsYW5lTWVzaDsKICAgIAl2YXIgYm94TWVzaDsKICAgIAkvLyBTdG9yZSB0aGUgY3VycmVudCBiYWNrZ3JvdW5kIHRleHR1cmUgYW5kIGl0cyBgdmVyc2lvbmAKICAgIAkvLyBzbyB3ZSBjYW4gcmVjb21waWxlIHRoZSBtYXRlcmlhbCBhY2NvcmRpbmdseS4KICAgIAl2YXIgY3VycmVudEJhY2tncm91bmQgPSBudWxsOwogICAgCXZhciBjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSAwOwoKICAgIAlmdW5jdGlvbiByZW5kZXIoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIGZvcmNlQ2xlYXIgKSB7CgogICAgCQl2YXIgYmFja2dyb3VuZCA9IHNjZW5lLmJhY2tncm91bmQ7CgogICAgCQkvLyBJZ25vcmUgYmFja2dyb3VuZCBpbiBBUgogICAgCQkvLyBUT0RPOiBSZWNvbnNpZGVyIHRoaXMuCgogICAgCQl2YXIgdnIgPSByZW5kZXJlci52cjsKICAgIAkJdmFyIHNlc3Npb24gPSB2ci5nZXRTZXNzaW9uICYmIHZyLmdldFNlc3Npb24oKTsKCiAgICAJCWlmICggc2Vzc2lvbiAmJiBzZXNzaW9uLmVudmlyb25tZW50QmxlbmRNb2RlID09PSAnYWRkaXRpdmUnICkgewoKICAgIAkJCWJhY2tncm91bmQgPSBudWxsOwoKICAgIAkJfQoKICAgIAkJaWYgKCBiYWNrZ3JvdW5kID09PSBudWxsICkgewoKICAgIAkJCXNldENsZWFyKCBjbGVhckNvbG9yLCBjbGVhckFscGhhICk7CiAgICAJCQljdXJyZW50QmFja2dyb3VuZCA9IG51bGw7CiAgICAJCQljdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSAwOwoKICAgIAkJfSBlbHNlIGlmICggYmFja2dyb3VuZCAmJiBiYWNrZ3JvdW5kLmlzQ29sb3IgKSB7CgogICAgCQkJc2V0Q2xlYXIoIGJhY2tncm91bmQsIDEgKTsKICAgIAkJCWZvcmNlQ2xlYXIgPSB0cnVlOwogICAgCQkJY3VycmVudEJhY2tncm91bmQgPSBudWxsOwogICAgCQkJY3VycmVudEJhY2tncm91bmRWZXJzaW9uID0gMDsKCiAgICAJCX0KCiAgICAJCWlmICggcmVuZGVyZXIuYXV0b0NsZWFyIHx8IGZvcmNlQ2xlYXIgKSB7CgogICAgCQkJcmVuZGVyZXIuY2xlYXIoIHJlbmRlcmVyLmF1dG9DbGVhckNvbG9yLCByZW5kZXJlci5hdXRvQ2xlYXJEZXB0aCwgcmVuZGVyZXIuYXV0b0NsZWFyU3RlbmNpbCApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBiYWNrZ3JvdW5kICYmICggYmFja2dyb3VuZC5pc0N1YmVUZXh0dXJlIHx8IGJhY2tncm91bmQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSApIHsKCiAgICAJCQlpZiAoIGJveE1lc2ggPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJYm94TWVzaCA9IG5ldyBNZXNoKAogICAgCQkJCQluZXcgQm94QnVmZmVyR2VvbWV0cnkoIDEsIDEsIDEgKSwKICAgIAkJCQkJbmV3IFNoYWRlck1hdGVyaWFsKCB7CiAgICAJCQkJCQl0eXBlOiAnQmFja2dyb3VuZEN1YmVNYXRlcmlhbCcsCiAgICAJCQkJCQl1bmlmb3JtczogY2xvbmVVbmlmb3JtcyggU2hhZGVyTGliLmN1YmUudW5pZm9ybXMgKSwKICAgIAkJCQkJCXZlcnRleFNoYWRlcjogU2hhZGVyTGliLmN1YmUudmVydGV4U2hhZGVyLAogICAgCQkJCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5jdWJlLmZyYWdtZW50U2hhZGVyLAogICAgCQkJCQkJc2lkZTogQmFja1NpZGUsCiAgICAJCQkJCQlkZXB0aFRlc3Q6IGZhbHNlLAogICAgCQkJCQkJZGVwdGhXcml0ZTogZmFsc2UsCiAgICAJCQkJCQlmb2c6IGZhbHNlCiAgICAJCQkJCX0gKQogICAgCQkJCSk7CgogICAgCQkJCWJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbm9ybWFsJyApOwogICAgCQkJCWJveE1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAndXYnICk7CgogICAgCQkJCWJveE1lc2gub25CZWZvcmVSZW5kZXIgPSBmdW5jdGlvbiAoIHJlbmRlcmVyLCBzY2VuZSwgY2FtZXJhICkgewoKICAgIAkJCQkJdGhpcy5tYXRyaXhXb3JsZC5jb3B5UG9zaXRpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOwoKICAgIAkJCQl9OwoKICAgIAkJCQkvLyBlbmFibGUgY29kZSBpbmplY3Rpb24gZm9yIG5vbi1idWlsdC1pbiBtYXRlcmlhbAogICAgCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggYm94TWVzaC5tYXRlcmlhbCwgJ21hcCcsIHsKCiAgICAJCQkJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCQkJCXJldHVybiB0aGlzLnVuaWZvcm1zLnRDdWJlLnZhbHVlOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9ICk7CgogICAgCQkJCW9iamVjdHMudXBkYXRlKCBib3hNZXNoICk7CgogICAgCQkJfQoKICAgIAkJCXZhciB0ZXh0dXJlID0gYmFja2dyb3VuZC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA/IGJhY2tncm91bmQudGV4dHVyZSA6IGJhY2tncm91bmQ7CiAgICAJCQlib3hNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLnRDdWJlLnZhbHVlID0gdGV4dHVyZTsKICAgIAkJCWJveE1lc2gubWF0ZXJpYWwudW5pZm9ybXMudEZsaXAudmFsdWUgPSAoIGJhY2tncm91bmQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSA/IDEgOiAtIDE7CgogICAgCQkJaWYgKCBjdXJyZW50QmFja2dyb3VuZCAhPT0gYmFja2dyb3VuZCB8fAogICAgCQkJICAgICBjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHsKCiAgICAJCQkJYm94TWVzaC5tYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJCWN1cnJlbnRCYWNrZ3JvdW5kID0gYmFja2dyb3VuZDsKICAgIAkJCQljdXJyZW50QmFja2dyb3VuZFZlcnNpb24gPSB0ZXh0dXJlLnZlcnNpb247CgogICAgCQkJfQoKICAgIAkJCS8vIHB1c2ggdG8gdGhlIHByZS1zb3J0ZWQgb3BhcXVlIHJlbmRlciBsaXN0CiAgICAJCQlyZW5kZXJMaXN0LnVuc2hpZnQoIGJveE1lc2gsIGJveE1lc2guZ2VvbWV0cnksIGJveE1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwgKTsKCiAgICAJCX0gZWxzZSBpZiAoIGJhY2tncm91bmQgJiYgYmFja2dyb3VuZC5pc1RleHR1cmUgKSB7CgogICAgCQkJaWYgKCBwbGFuZU1lc2ggPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJcGxhbmVNZXNoID0gbmV3IE1lc2goCiAgICAJCQkJCW5ldyBQbGFuZUJ1ZmZlckdlb21ldHJ5KCAyLCAyICksCiAgICAJCQkJCW5ldyBTaGFkZXJNYXRlcmlhbCggewogICAgCQkJCQkJdHlwZTogJ0JhY2tncm91bmRNYXRlcmlhbCcsCiAgICAJCQkJCQl1bmlmb3JtczogY2xvbmVVbmlmb3JtcyggU2hhZGVyTGliLmJhY2tncm91bmQudW5pZm9ybXMgKSwKICAgIAkJCQkJCXZlcnRleFNoYWRlcjogU2hhZGVyTGliLmJhY2tncm91bmQudmVydGV4U2hhZGVyLAogICAgCQkJCQkJZnJhZ21lbnRTaGFkZXI6IFNoYWRlckxpYi5iYWNrZ3JvdW5kLmZyYWdtZW50U2hhZGVyLAogICAgCQkJCQkJc2lkZTogRnJvbnRTaWRlLAogICAgCQkJCQkJZGVwdGhUZXN0OiBmYWxzZSwKICAgIAkJCQkJCWRlcHRoV3JpdGU6IGZhbHNlLAogICAgCQkJCQkJZm9nOiBmYWxzZQogICAgCQkJCQl9ICkKICAgIAkJCQkpOwoKICAgIAkJCQlwbGFuZU1lc2guZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbm9ybWFsJyApOwoKICAgIAkJCQkvLyBlbmFibGUgY29kZSBpbmplY3Rpb24gZm9yIG5vbi1idWlsdC1pbiBtYXRlcmlhbAogICAgCQkJCU9iamVjdC5kZWZpbmVQcm9wZXJ0eSggcGxhbmVNZXNoLm1hdGVyaWFsLCAnbWFwJywgewoKICAgIAkJCQkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJCQkJcmV0dXJuIHRoaXMudW5pZm9ybXMudDJELnZhbHVlOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9ICk7CgogICAgCQkJCW9iamVjdHMudXBkYXRlKCBwbGFuZU1lc2ggKTsKCiAgICAJCQl9CgogICAgCQkJcGxhbmVNZXNoLm1hdGVyaWFsLnVuaWZvcm1zLnQyRC52YWx1ZSA9IGJhY2tncm91bmQ7CgogICAgCQkJaWYgKCBiYWNrZ3JvdW5kLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7CgogICAgCQkJCWJhY2tncm91bmQudXBkYXRlTWF0cml4KCk7CgogICAgCQkJfQoKICAgIAkJCXBsYW5lTWVzaC5tYXRlcmlhbC51bmlmb3Jtcy51dlRyYW5zZm9ybS52YWx1ZS5jb3B5KCBiYWNrZ3JvdW5kLm1hdHJpeCApOwoKICAgIAkJCWlmICggY3VycmVudEJhY2tncm91bmQgIT09IGJhY2tncm91bmQgfHwKICAgIAkJCQkgICBjdXJyZW50QmFja2dyb3VuZFZlcnNpb24gIT09IGJhY2tncm91bmQudmVyc2lvbiApIHsKCiAgICAJCQkJcGxhbmVNZXNoLm1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQkJY3VycmVudEJhY2tncm91bmQgPSBiYWNrZ3JvdW5kOwogICAgCQkJCWN1cnJlbnRCYWNrZ3JvdW5kVmVyc2lvbiA9IGJhY2tncm91bmQudmVyc2lvbjsKCiAgICAJCQl9CgoKICAgIAkJCS8vIHB1c2ggdG8gdGhlIHByZS1zb3J0ZWQgb3BhcXVlIHJlbmRlciBsaXN0CiAgICAJCQlyZW5kZXJMaXN0LnVuc2hpZnQoIHBsYW5lTWVzaCwgcGxhbmVNZXNoLmdlb21ldHJ5LCBwbGFuZU1lc2gubWF0ZXJpYWwsIDAsIDAsIG51bGwgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBzZXRDbGVhciggY29sb3IsIGFscGhhICkgewoKICAgIAkJc3RhdGUuYnVmZmVycy5jb2xvci5zZXRDbGVhciggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiwgYWxwaGEsIHByZW11bHRpcGxpZWRBbHBoYSApOwoKICAgIAl9CgogICAgCXJldHVybiB7CgogICAgCQlnZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoKSB7CgogICAgCQkJcmV0dXJuIGNsZWFyQ29sb3I7CgogICAgCQl9LAogICAgCQlzZXRDbGVhckNvbG9yOiBmdW5jdGlvbiAoIGNvbG9yLCBhbHBoYSApIHsKCiAgICAJCQljbGVhckNvbG9yLnNldCggY29sb3IgKTsKICAgIAkJCWNsZWFyQWxwaGEgPSBhbHBoYSAhPT0gdW5kZWZpbmVkID8gYWxwaGEgOiAxOwogICAgCQkJc2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsKCiAgICAJCX0sCiAgICAJCWdldENsZWFyQWxwaGE6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gY2xlYXJBbHBoYTsKCiAgICAJCX0sCiAgICAJCXNldENsZWFyQWxwaGE6IGZ1bmN0aW9uICggYWxwaGEgKSB7CgogICAgCQkJY2xlYXJBbHBoYSA9IGFscGhhOwogICAgCQkJc2V0Q2xlYXIoIGNsZWFyQ29sb3IsIGNsZWFyQWxwaGEgKTsKCiAgICAJCX0sCiAgICAJCXJlbmRlcjogcmVuZGVyCgogICAgCX07CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKSB7CgogICAgCXZhciBtb2RlOwoKICAgIAlmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHsKCiAgICAJCW1vZGUgPSB2YWx1ZTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZW5kZXIoIHN0YXJ0LCBjb3VudCApIHsKCiAgICAJCWdsLmRyYXdBcnJheXMoIG1vZGUsIHN0YXJ0LCBjb3VudCApOwoKICAgIAkJaW5mby51cGRhdGUoIGNvdW50LCBtb2RlICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcmVuZGVySW5zdGFuY2VzKCBnZW9tZXRyeSwgc3RhcnQsIGNvdW50ICkgewoKICAgIAkJdmFyIGV4dGVuc2lvbiwgbWV0aG9kTmFtZTsKCiAgICAJCWlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgewoKICAgIAkJCWV4dGVuc2lvbiA9IGdsOwogICAgCQkJbWV0aG9kTmFtZSA9ICdkcmF3QXJyYXlzSW5zdGFuY2VkJzsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOwogICAgCQkJbWV0aG9kTmFtZSA9ICdkcmF3QXJyYXlzSW5zdGFuY2VkQU5HTEUnOwoKICAgIAkJCWlmICggZXh0ZW5zaW9uID09PSBudWxsICkgewoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApOwogICAgCQkJCXJldHVybjsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlleHRlbnNpb25bIG1ldGhvZE5hbWUgXSggbW9kZSwgc3RhcnQsIGNvdW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOwoKICAgIAkJaW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOwoKICAgIAl9CgogICAgCS8vCgogICAgCXRoaXMuc2V0TW9kZSA9IHNldE1vZGU7CiAgICAJdGhpcy5yZW5kZXIgPSByZW5kZXI7CiAgICAJdGhpcy5yZW5kZXJJbnN0YW5jZXMgPSByZW5kZXJJbnN0YW5jZXM7CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMQ2FwYWJpbGl0aWVzKCBnbCwgZXh0ZW5zaW9ucywgcGFyYW1ldGVycyApIHsKCiAgICAJdmFyIG1heEFuaXNvdHJvcHk7CgogICAgCWZ1bmN0aW9uIGdldE1heEFuaXNvdHJvcHkoKSB7CgogICAgCQlpZiAoIG1heEFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHJldHVybiBtYXhBbmlzb3Ryb3B5OwoKICAgIAkJdmFyIGV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApOwoKICAgIAkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7CgogICAgCQkJbWF4QW5pc290cm9weSA9IGdsLmdldFBhcmFtZXRlciggZXh0ZW5zaW9uLk1BWF9URVhUVVJFX01BWF9BTklTT1RST1BZX0VYVCApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQltYXhBbmlzb3Ryb3B5ID0gMDsKCiAgICAJCX0KCiAgICAJCXJldHVybiBtYXhBbmlzb3Ryb3B5OwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdldE1heFByZWNpc2lvbiggcHJlY2lzaW9uICkgewoKICAgIAkJaWYgKCBwcmVjaXNpb24gPT09ICdoaWdocCcgKSB7CgogICAgCQkJaWYgKCBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMzLCAzNjMzOCApLnByZWNpc2lvbiA+IDAgJiYKICAgIAkJCSAgICAgZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0KCAzNTYzMiwgMzYzMzggKS5wcmVjaXNpb24gPiAwICkgewoKICAgIAkJCQlyZXR1cm4gJ2hpZ2hwJzsKCiAgICAJCQl9CgogICAgCQkJcHJlY2lzaW9uID0gJ21lZGl1bXAnOwoKICAgIAkJfQoKICAgIAkJaWYgKCBwcmVjaXNpb24gPT09ICdtZWRpdW1wJyApIHsKCiAgICAJCQlpZiAoIGdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCggMzU2MzMsIDM2MzM3ICkucHJlY2lzaW9uID4gMCAmJgogICAgCQkJICAgICBnbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQoIDM1NjMyLCAzNjMzNyApLnByZWNpc2lvbiA+IDAgKSB7CgogICAgCQkJCXJldHVybiAnbWVkaXVtcCc7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuICdsb3dwJzsKCiAgICAJfQoKICAgIAl2YXIgaXNXZWJHTDIgPSB0eXBlb2YgV2ViR0wyUmVuZGVyaW5nQ29udGV4dCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2wgaW5zdGFuY2VvZiBXZWJHTDJSZW5kZXJpbmdDb250ZXh0OwoKICAgIAl2YXIgcHJlY2lzaW9uID0gcGFyYW1ldGVycy5wcmVjaXNpb24gIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlY2lzaW9uIDogJ2hpZ2hwJzsKICAgIAl2YXIgbWF4UHJlY2lzaW9uID0gZ2V0TWF4UHJlY2lzaW9uKCBwcmVjaXNpb24gKTsKCiAgICAJaWYgKCBtYXhQcmVjaXNpb24gIT09IHByZWNpc2lvbiApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6JywgcHJlY2lzaW9uLCAnbm90IHN1cHBvcnRlZCwgdXNpbmcnLCBtYXhQcmVjaXNpb24sICdpbnN0ZWFkLicgKTsKICAgIAkJcHJlY2lzaW9uID0gbWF4UHJlY2lzaW9uOwoKICAgIAl9CgogICAgCXZhciBsb2dhcml0aG1pY0RlcHRoQnVmZmVyID0gcGFyYW1ldGVycy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyID09PSB0cnVlOwoKICAgIAl2YXIgbWF4VGV4dHVyZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM0OTMwICk7CiAgICAJdmFyIG1heFZlcnRleFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNTY2MCApOwogICAgCXZhciBtYXhUZXh0dXJlU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzM3OSApOwogICAgCXZhciBtYXhDdWJlbWFwU2l6ZSA9IGdsLmdldFBhcmFtZXRlciggMzQwNzYgKTsKCiAgICAJdmFyIG1heEF0dHJpYnV0ZXMgPSBnbC5nZXRQYXJhbWV0ZXIoIDM0OTIxICk7CiAgICAJdmFyIG1heFZlcnRleFVuaWZvcm1zID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNjM0NyApOwogICAgCXZhciBtYXhWYXJ5aW5ncyA9IGdsLmdldFBhcmFtZXRlciggMzYzNDggKTsKICAgIAl2YXIgbWF4RnJhZ21lbnRVbmlmb3JtcyA9IGdsLmdldFBhcmFtZXRlciggMzYzNDkgKTsKCiAgICAJdmFyIHZlcnRleFRleHR1cmVzID0gbWF4VmVydGV4VGV4dHVyZXMgPiAwOwogICAgCXZhciBmbG9hdEZyYWdtZW50VGV4dHVyZXMgPSBpc1dlYkdMMiB8fCAhISBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApOwogICAgCXZhciBmbG9hdFZlcnRleFRleHR1cmVzID0gdmVydGV4VGV4dHVyZXMgJiYgZmxvYXRGcmFnbWVudFRleHR1cmVzOwoKICAgIAl2YXIgbWF4U2FtcGxlcyA9IGlzV2ViR0wyID8gZ2wuZ2V0UGFyYW1ldGVyKCAzNjE4MyApIDogMDsKCiAgICAJcmV0dXJuIHsKCiAgICAJCWlzV2ViR0wyOiBpc1dlYkdMMiwKCiAgICAJCWdldE1heEFuaXNvdHJvcHk6IGdldE1heEFuaXNvdHJvcHksCiAgICAJCWdldE1heFByZWNpc2lvbjogZ2V0TWF4UHJlY2lzaW9uLAoKICAgIAkJcHJlY2lzaW9uOiBwcmVjaXNpb24sCiAgICAJCWxvZ2FyaXRobWljRGVwdGhCdWZmZXI6IGxvZ2FyaXRobWljRGVwdGhCdWZmZXIsCgogICAgCQltYXhUZXh0dXJlczogbWF4VGV4dHVyZXMsCiAgICAJCW1heFZlcnRleFRleHR1cmVzOiBtYXhWZXJ0ZXhUZXh0dXJlcywKICAgIAkJbWF4VGV4dHVyZVNpemU6IG1heFRleHR1cmVTaXplLAogICAgCQltYXhDdWJlbWFwU2l6ZTogbWF4Q3ViZW1hcFNpemUsCgogICAgCQltYXhBdHRyaWJ1dGVzOiBtYXhBdHRyaWJ1dGVzLAogICAgCQltYXhWZXJ0ZXhVbmlmb3JtczogbWF4VmVydGV4VW5pZm9ybXMsCiAgICAJCW1heFZhcnlpbmdzOiBtYXhWYXJ5aW5ncywKICAgIAkJbWF4RnJhZ21lbnRVbmlmb3JtczogbWF4RnJhZ21lbnRVbmlmb3JtcywKCiAgICAJCXZlcnRleFRleHR1cmVzOiB2ZXJ0ZXhUZXh0dXJlcywKICAgIAkJZmxvYXRGcmFnbWVudFRleHR1cmVzOiBmbG9hdEZyYWdtZW50VGV4dHVyZXMsCiAgICAJCWZsb2F0VmVydGV4VGV4dHVyZXM6IGZsb2F0VmVydGV4VGV4dHVyZXMsCgogICAgCQltYXhTYW1wbGVzOiBtYXhTYW1wbGVzCgogICAgCX07CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciB0c2NodwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xDbGlwcGluZygpIHsKCiAgICAJdmFyIHNjb3BlID0gdGhpcywKCiAgICAJCWdsb2JhbFN0YXRlID0gbnVsbCwKICAgIAkJbnVtR2xvYmFsUGxhbmVzID0gMCwKICAgIAkJbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSwKICAgIAkJcmVuZGVyaW5nU2hhZG93cyA9IGZhbHNlLAoKICAgIAkJcGxhbmUgPSBuZXcgUGxhbmUoKSwKICAgIAkJdmlld05vcm1hbE1hdHJpeCA9IG5ldyBNYXRyaXgzKCksCgogICAgCQl1bmlmb3JtID0geyB2YWx1ZTogbnVsbCwgbmVlZHNVcGRhdGU6IGZhbHNlIH07CgogICAgCXRoaXMudW5pZm9ybSA9IHVuaWZvcm07CiAgICAJdGhpcy5udW1QbGFuZXMgPSAwOwogICAgCXRoaXMubnVtSW50ZXJzZWN0aW9uID0gMDsKCiAgICAJdGhpcy5pbml0ID0gZnVuY3Rpb24gKCBwbGFuZXMsIGVuYWJsZUxvY2FsQ2xpcHBpbmcsIGNhbWVyYSApIHsKCiAgICAJCXZhciBlbmFibGVkID0KICAgIAkJCXBsYW5lcy5sZW5ndGggIT09IDAgfHwKICAgIAkJCWVuYWJsZUxvY2FsQ2xpcHBpbmcgfHwKICAgIAkJCS8vIGVuYWJsZSBzdGF0ZSBvZiBwcmV2aW91cyBmcmFtZSAtIHRoZSBjbGlwcGluZyBjb2RlIGhhcyB0bwogICAgCQkJLy8gcnVuIGFub3RoZXIgZnJhbWUgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHN0YXRlOgogICAgCQkJbnVtR2xvYmFsUGxhbmVzICE9PSAwIHx8CiAgICAJCQlsb2NhbENsaXBwaW5nRW5hYmxlZDsKCiAgICAJCWxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZW5hYmxlTG9jYWxDbGlwcGluZzsKCiAgICAJCWdsb2JhbFN0YXRlID0gcHJvamVjdFBsYW5lcyggcGxhbmVzLCBjYW1lcmEsIDAgKTsKICAgIAkJbnVtR2xvYmFsUGxhbmVzID0gcGxhbmVzLmxlbmd0aDsKCiAgICAJCXJldHVybiBlbmFibGVkOwoKICAgIAl9OwoKICAgIAl0aGlzLmJlZ2luU2hhZG93cyA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJlbmRlcmluZ1NoYWRvd3MgPSB0cnVlOwogICAgCQlwcm9qZWN0UGxhbmVzKCBudWxsICk7CgogICAgCX07CgogICAgCXRoaXMuZW5kU2hhZG93cyA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJlbmRlcmluZ1NoYWRvd3MgPSBmYWxzZTsKICAgIAkJcmVzZXRHbG9iYWxTdGF0ZSgpOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldFN0YXRlID0gZnVuY3Rpb24gKCBwbGFuZXMsIGNsaXBJbnRlcnNlY3Rpb24sIGNsaXBTaGFkb3dzLCBjYW1lcmEsIGNhY2hlLCBmcm9tQ2FjaGUgKSB7CgogICAgCQlpZiAoICEgbG9jYWxDbGlwcGluZ0VuYWJsZWQgfHwgcGxhbmVzID09PSBudWxsIHx8IHBsYW5lcy5sZW5ndGggPT09IDAgfHwgcmVuZGVyaW5nU2hhZG93cyAmJiAhIGNsaXBTaGFkb3dzICkgewoKICAgIAkJCS8vIHRoZXJlJ3Mgbm8gbG9jYWwgY2xpcHBpbmcKCiAgICAJCQlpZiAoIHJlbmRlcmluZ1NoYWRvd3MgKSB7CgogICAgCQkJCS8vIHRoZXJlJ3Mgbm8gZ2xvYmFsIGNsaXBwaW5nCgogICAgCQkJCXByb2plY3RQbGFuZXMoIG51bGwgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlyZXNldEdsb2JhbFN0YXRlKCk7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl2YXIgbkdsb2JhbCA9IHJlbmRlcmluZ1NoYWRvd3MgPyAwIDogbnVtR2xvYmFsUGxhbmVzLAogICAgCQkJCWxHbG9iYWwgPSBuR2xvYmFsICogNCwKCiAgICAJCQkJZHN0QXJyYXkgPSBjYWNoZS5jbGlwcGluZ1N0YXRlIHx8IG51bGw7CgogICAgCQkJdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OyAvLyBlbnN1cmUgdW5pcXVlIHN0YXRlCgogICAgCQkJZHN0QXJyYXkgPSBwcm9qZWN0UGxhbmVzKCBwbGFuZXMsIGNhbWVyYSwgbEdsb2JhbCwgZnJvbUNhY2hlICk7CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBsR2xvYmFsOyArKyBpICkgewoKICAgIAkJCQlkc3RBcnJheVsgaSBdID0gZ2xvYmFsU3RhdGVbIGkgXTsKCiAgICAJCQl9CgogICAgCQkJY2FjaGUuY2xpcHBpbmdTdGF0ZSA9IGRzdEFycmF5OwogICAgCQkJdGhpcy5udW1JbnRlcnNlY3Rpb24gPSBjbGlwSW50ZXJzZWN0aW9uID8gdGhpcy5udW1QbGFuZXMgOiAwOwogICAgCQkJdGhpcy5udW1QbGFuZXMgKz0gbkdsb2JhbDsKCiAgICAJCX0KCgogICAgCX07CgogICAgCWZ1bmN0aW9uIHJlc2V0R2xvYmFsU3RhdGUoKSB7CgogICAgCQlpZiAoIHVuaWZvcm0udmFsdWUgIT09IGdsb2JhbFN0YXRlICkgewoKICAgIAkJCXVuaWZvcm0udmFsdWUgPSBnbG9iYWxTdGF0ZTsKICAgIAkJCXVuaWZvcm0ubmVlZHNVcGRhdGUgPSBudW1HbG9iYWxQbGFuZXMgPiAwOwoKICAgIAkJfQoKICAgIAkJc2NvcGUubnVtUGxhbmVzID0gbnVtR2xvYmFsUGxhbmVzOwogICAgCQlzY29wZS5udW1JbnRlcnNlY3Rpb24gPSAwOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHByb2plY3RQbGFuZXMoIHBsYW5lcywgY2FtZXJhLCBkc3RPZmZzZXQsIHNraXBUcmFuc2Zvcm0gKSB7CgogICAgCQl2YXIgblBsYW5lcyA9IHBsYW5lcyAhPT0gbnVsbCA/IHBsYW5lcy5sZW5ndGggOiAwLAogICAgCQkJZHN0QXJyYXkgPSBudWxsOwoKICAgIAkJaWYgKCBuUGxhbmVzICE9PSAwICkgewoKICAgIAkJCWRzdEFycmF5ID0gdW5pZm9ybS52YWx1ZTsKCiAgICAJCQlpZiAoIHNraXBUcmFuc2Zvcm0gIT09IHRydWUgfHwgZHN0QXJyYXkgPT09IG51bGwgKSB7CgogICAgCQkJCXZhciBmbGF0U2l6ZSA9IGRzdE9mZnNldCArIG5QbGFuZXMgKiA0LAogICAgCQkJCQl2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTsKCiAgICAJCQkJdmlld05vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIHZpZXdNYXRyaXggKTsKCiAgICAJCQkJaWYgKCBkc3RBcnJheSA9PT0gbnVsbCB8fCBkc3RBcnJheS5sZW5ndGggPCBmbGF0U2l6ZSApIHsKCiAgICAJCQkJCWRzdEFycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggZmxhdFNpemUgKTsKCiAgICAJCQkJfQoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDAsIGk0ID0gZHN0T2Zmc2V0OyBpICE9PSBuUGxhbmVzOyArKyBpLCBpNCArPSA0ICkgewoKICAgIAkJCQkJcGxhbmUuY29weSggcGxhbmVzWyBpIF0gKS5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXgsIHZpZXdOb3JtYWxNYXRyaXggKTsKCiAgICAJCQkJCXBsYW5lLm5vcm1hbC50b0FycmF5KCBkc3RBcnJheSwgaTQgKTsKICAgIAkJCQkJZHN0QXJyYXlbIGk0ICsgMyBdID0gcGxhbmUuY29uc3RhbnQ7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJdW5pZm9ybS52YWx1ZSA9IGRzdEFycmF5OwogICAgCQkJdW5pZm9ybS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQl9CgogICAgCQlzY29wZS5udW1QbGFuZXMgPSBuUGxhbmVzOwoKICAgIAkJcmV0dXJuIGRzdEFycmF5OwoKICAgIAl9CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMRXh0ZW5zaW9ucyggZ2wgKSB7CgogICAgCXZhciBleHRlbnNpb25zID0ge307CgogICAgCXJldHVybiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICggbmFtZSApIHsKCiAgICAJCQlpZiAoIGV4dGVuc2lvbnNbIG5hbWUgXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlyZXR1cm4gZXh0ZW5zaW9uc1sgbmFtZSBdOwoKICAgIAkJCX0KCiAgICAJCQl2YXIgZXh0ZW5zaW9uOwoKICAgIAkJCXN3aXRjaCAoIG5hbWUgKSB7CgogICAgCQkJCWNhc2UgJ1dFQkdMX2RlcHRoX3RleHR1cmUnOgogICAgCQkJCQlleHRlbnNpb24gPSBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9XRUJHTF9kZXB0aF90ZXh0dXJlJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9kZXB0aF90ZXh0dXJlJyApOwogICAgCQkJCQlicmVhazsKCiAgICAJCQkJY2FzZSAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJzoKICAgIAkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnRVhUX3RleHR1cmVfZmlsdGVyX2FuaXNvdHJvcGljJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ01PWl9FWFRfdGV4dHVyZV9maWx0ZXJfYW5pc290cm9waWMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCS0lUX0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJzoKICAgIAkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwgZ2wuZ2V0RXh0ZW5zaW9uKCAnTU9aX1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjJyApIHx8IGdsLmdldEV4dGVuc2lvbiggJ1dFQktJVF9XRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfczN0YycgKTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0Yyc6CiAgICAJCQkJCWV4dGVuc2lvbiA9IGdsLmdldEV4dGVuc2lvbiggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKSB8fCBnbC5nZXRFeHRlbnNpb24oICdXRUJLSVRfV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApOwogICAgCQkJCQlicmVhazsKCiAgICAJCQkJZGVmYXVsdDoKICAgIAkJCQkJZXh0ZW5zaW9uID0gZ2wuZ2V0RXh0ZW5zaW9uKCBuYW1lICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggZXh0ZW5zaW9uID09PSBudWxsICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgbmFtZSArICcgZXh0ZW5zaW9uIG5vdCBzdXBwb3J0ZWQuJyApOwoKICAgIAkJCX0KCiAgICAJCQlleHRlbnNpb25zWyBuYW1lIF0gPSBleHRlbnNpb247CgogICAgCQkJcmV0dXJuIGV4dGVuc2lvbjsKCiAgICAJCX0KCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xHZW9tZXRyaWVzKCBnbCwgYXR0cmlidXRlcywgaW5mbyApIHsKCiAgICAJdmFyIGdlb21ldHJpZXMgPSBuZXcgV2Vha01hcCgpOwogICAgCXZhciB3aXJlZnJhbWVBdHRyaWJ1dGVzID0gbmV3IFdlYWtNYXAoKTsKCiAgICAJZnVuY3Rpb24gb25HZW9tZXRyeURpc3Bvc2UoIGV2ZW50ICkgewoKICAgIAkJdmFyIGdlb21ldHJ5ID0gZXZlbnQudGFyZ2V0OwogICAgCQl2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggZ2VvbWV0cnkgKTsKCiAgICAJCWlmICggYnVmZmVyZ2VvbWV0cnkuaW5kZXggIT09IG51bGwgKSB7CgogICAgCQkJYXR0cmlidXRlcy5yZW1vdmUoIGJ1ZmZlcmdlb21ldHJ5LmluZGV4ICk7CgogICAgCQl9CgogICAgCQlmb3IgKCB2YXIgbmFtZSBpbiBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzICkgewoKICAgIAkJCWF0dHJpYnV0ZXMucmVtb3ZlKCBidWZmZXJnZW9tZXRyeS5hdHRyaWJ1dGVzWyBuYW1lIF0gKTsKCiAgICAJCX0KCiAgICAJCWdlb21ldHJ5LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25HZW9tZXRyeURpc3Bvc2UgKTsKCiAgICAJCWdlb21ldHJpZXMuZGVsZXRlKCBnZW9tZXRyeSApOwoKICAgIAkJdmFyIGF0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBidWZmZXJnZW9tZXRyeSApOwoKICAgIAkJaWYgKCBhdHRyaWJ1dGUgKSB7CgogICAgCQkJYXR0cmlidXRlcy5yZW1vdmUoIGF0dHJpYnV0ZSApOwogICAgCQkJd2lyZWZyYW1lQXR0cmlidXRlcy5kZWxldGUoIGJ1ZmZlcmdlb21ldHJ5ICk7CgogICAgCQl9CgogICAgCQkvLwoKICAgIAkJaW5mby5tZW1vcnkuZ2VvbWV0cmllcyAtLTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZXQoIG9iamVjdCwgZ2VvbWV0cnkgKSB7CgogICAgCQl2YXIgYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyaWVzLmdldCggZ2VvbWV0cnkgKTsKCiAgICAJCWlmICggYnVmZmVyZ2VvbWV0cnkgKSByZXR1cm4gYnVmZmVyZ2VvbWV0cnk7CgogICAgCQlnZW9tZXRyeS5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uR2VvbWV0cnlEaXNwb3NlICk7CgogICAgCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgogICAgCQkJYnVmZmVyZ2VvbWV0cnkgPSBnZW9tZXRyeTsKCiAgICAJCX0gZWxzZSBpZiAoIGdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CgogICAgCQkJaWYgKCBnZW9tZXRyeS5fYnVmZmVyR2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCkuc2V0RnJvbU9iamVjdCggb2JqZWN0ICk7CgogICAgCQkJfQoKICAgIAkJCWJ1ZmZlcmdlb21ldHJ5ID0gZ2VvbWV0cnkuX2J1ZmZlckdlb21ldHJ5OwoKICAgIAkJfQoKICAgIAkJZ2VvbWV0cmllcy5zZXQoIGdlb21ldHJ5LCBidWZmZXJnZW9tZXRyeSApOwoKICAgIAkJaW5mby5tZW1vcnkuZ2VvbWV0cmllcyArKzsKCiAgICAJCXJldHVybiBidWZmZXJnZW9tZXRyeTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiB1cGRhdGUoIGdlb21ldHJ5ICkgewoKICAgIAkJdmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICAJCXZhciBnZW9tZXRyeUF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwoKICAgIAkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKCiAgICAJCQlhdHRyaWJ1dGVzLnVwZGF0ZSggaW5kZXgsIDM0OTYzICk7CgogICAgCQl9CgogICAgCQlmb3IgKCB2YXIgbmFtZSBpbiBnZW9tZXRyeUF0dHJpYnV0ZXMgKSB7CgogICAgCQkJYXR0cmlidXRlcy51cGRhdGUoIGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdLCAzNDk2MiApOwoKICAgIAkJfQoKICAgIAkJLy8gbW9ycGggdGFyZ2V0cwoKICAgIAkJdmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlczsKCiAgICAJCWZvciAoIHZhciBuYW1lIGluIG1vcnBoQXR0cmlidXRlcyApIHsKCiAgICAJCQl2YXIgYXJyYXkgPSBtb3JwaEF0dHJpYnV0ZXNbIG5hbWUgXTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQlhdHRyaWJ1dGVzLnVwZGF0ZSggYXJyYXlbIGkgXSwgMzQ5NjIgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gdXBkYXRlV2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHsKCiAgICAJCXZhciBpbmRpY2VzID0gW107CgogICAgCQl2YXIgZ2VvbWV0cnlJbmRleCA9IGdlb21ldHJ5LmluZGV4OwogICAgCQl2YXIgZ2VvbWV0cnlQb3NpdGlvbiA9IGdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CiAgICAJCXZhciB2ZXJzaW9uID0gMDsKCiAgICAJCWlmICggZ2VvbWV0cnlJbmRleCAhPT0gbnVsbCApIHsKCiAgICAJCQl2YXIgYXJyYXkgPSBnZW9tZXRyeUluZGV4LmFycmF5OwogICAgCQkJdmVyc2lvbiA9IGdlb21ldHJ5SW5kZXgudmVyc2lvbjsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBhcnJheS5sZW5ndGg7IGkgPCBsOyBpICs9IDMgKSB7CgogICAgCQkJCXZhciBhID0gYXJyYXlbIGkgKyAwIF07CiAgICAJCQkJdmFyIGIgPSBhcnJheVsgaSArIDEgXTsKICAgIAkJCQl2YXIgYyA9IGFycmF5WyBpICsgMiBdOwoKICAgIAkJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGIsIGMsIGMsIGEgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXZhciBhcnJheSA9IGdlb21ldHJ5UG9zaXRpb24uYXJyYXk7CiAgICAJCQl2ZXJzaW9uID0gZ2VvbWV0cnlQb3NpdGlvbi52ZXJzaW9uOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbCA9ICggYXJyYXkubGVuZ3RoIC8gMyApIC0gMTsgaSA8IGw7IGkgKz0gMyApIHsKCiAgICAJCQkJdmFyIGEgPSBpICsgMDsKICAgIAkJCQl2YXIgYiA9IGkgKyAxOwogICAgCQkJCXZhciBjID0gaSArIDI7CgogICAgCQkJCWluZGljZXMucHVzaCggYSwgYiwgYiwgYywgYywgYSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBhdHRyaWJ1dGUgPSBuZXcgKCBhcnJheU1heCggaW5kaWNlcyApID4gNjU1MzUgPyBVaW50MzJCdWZmZXJBdHRyaWJ1dGUgOiBVaW50MTZCdWZmZXJBdHRyaWJ1dGUgKSggaW5kaWNlcywgMSApOwogICAgCQlhdHRyaWJ1dGUudmVyc2lvbiA9IHZlcnNpb247CgogICAgCQlhdHRyaWJ1dGVzLnVwZGF0ZSggYXR0cmlidXRlLCAzNDk2MyApOwoKICAgIAkJLy8KCiAgICAJCXZhciBwcmV2aW91c0F0dHJpYnV0ZSA9IHdpcmVmcmFtZUF0dHJpYnV0ZXMuZ2V0KCBnZW9tZXRyeSApOwoKICAgIAkJaWYgKCBwcmV2aW91c0F0dHJpYnV0ZSApIGF0dHJpYnV0ZXMucmVtb3ZlKCBwcmV2aW91c0F0dHJpYnV0ZSApOwoKICAgIAkJLy8KCiAgICAJCXdpcmVmcmFtZUF0dHJpYnV0ZXMuc2V0KCBnZW9tZXRyeSwgYXR0cmlidXRlICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZ2V0V2lyZWZyYW1lQXR0cmlidXRlKCBnZW9tZXRyeSApIHsKCiAgICAJCXZhciBjdXJyZW50QXR0cmlidXRlID0gd2lyZWZyYW1lQXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5ICk7CgogICAgCQlpZiAoIGN1cnJlbnRBdHRyaWJ1dGUgKSB7CgogICAgCQkJdmFyIGdlb21ldHJ5SW5kZXggPSBnZW9tZXRyeS5pbmRleDsKCiAgICAJCQlpZiAoIGdlb21ldHJ5SW5kZXggIT09IG51bGwgKSB7CgogICAgCQkJCS8vIGlmIHRoZSBhdHRyaWJ1dGUgaXMgb2Jzb2xldGUsIGNyZWF0ZSBhIG5ldyBvbmUKCiAgICAJCQkJaWYgKCBjdXJyZW50QXR0cmlidXRlLnZlcnNpb24gPCBnZW9tZXRyeUluZGV4LnZlcnNpb24gKSB7CgogICAgCQkJCQl1cGRhdGVXaXJlZnJhbWVBdHRyaWJ1dGUoIGdlb21ldHJ5ICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXVwZGF0ZVdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB3aXJlZnJhbWVBdHRyaWJ1dGVzLmdldCggZ2VvbWV0cnkgKTsKCiAgICAJfQoKICAgIAlyZXR1cm4gewoKICAgIAkJZ2V0OiBnZXQsCiAgICAJCXVwZGF0ZTogdXBkYXRlLAoKICAgIAkJZ2V0V2lyZWZyYW1lQXR0cmlidXRlOiBnZXRXaXJlZnJhbWVBdHRyaWJ1dGUKCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xJbmRleGVkQnVmZmVyUmVuZGVyZXIoIGdsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKSB7CgogICAgCXZhciBtb2RlOwoKICAgIAlmdW5jdGlvbiBzZXRNb2RlKCB2YWx1ZSApIHsKCiAgICAJCW1vZGUgPSB2YWx1ZTsKCiAgICAJfQoKICAgIAl2YXIgdHlwZSwgYnl0ZXNQZXJFbGVtZW50OwoKICAgIAlmdW5jdGlvbiBzZXRJbmRleCggdmFsdWUgKSB7CgogICAgCQl0eXBlID0gdmFsdWUudHlwZTsKICAgIAkJYnl0ZXNQZXJFbGVtZW50ID0gdmFsdWUuYnl0ZXNQZXJFbGVtZW50OwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlbmRlciggc3RhcnQsIGNvdW50ICkgewoKICAgIAkJZ2wuZHJhd0VsZW1lbnRzKCBtb2RlLCBjb3VudCwgdHlwZSwgc3RhcnQgKiBieXRlc1BlckVsZW1lbnQgKTsKCiAgICAJCWluZm8udXBkYXRlKCBjb3VudCwgbW9kZSApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlbmRlckluc3RhbmNlcyggZ2VvbWV0cnksIHN0YXJ0LCBjb3VudCApIHsKCiAgICAJCXZhciBleHRlbnNpb24sIG1ldGhvZE5hbWU7CgogICAgCQlpZiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiApIHsKCiAgICAJCQlleHRlbnNpb24gPSBnbDsKICAgIAkJCW1ldGhvZE5hbWUgPSAnZHJhd0VsZW1lbnRzSW5zdGFuY2VkJzsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOwogICAgCQkJbWV0aG9kTmFtZSA9ICdkcmF3RWxlbWVudHNJbnN0YW5jZWRBTkdMRSc7CgogICAgCQkJaWYgKCBleHRlbnNpb24gPT09IG51bGwgKSB7CgogICAgCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlcjogdXNpbmcgVEhSRUUuSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgYnV0IGhhcmR3YXJlIGRvZXMgbm90IHN1cHBvcnQgZXh0ZW5zaW9uIEFOR0xFX2luc3RhbmNlZF9hcnJheXMuJyApOwogICAgCQkJCXJldHVybjsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlleHRlbnNpb25bIG1ldGhvZE5hbWUgXSggbW9kZSwgY291bnQsIHR5cGUsIHN0YXJ0ICogYnl0ZXNQZXJFbGVtZW50LCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOwoKICAgIAkJaW5mby51cGRhdGUoIGNvdW50LCBtb2RlLCBnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCApOwoKICAgIAl9CgogICAgCS8vCgogICAgCXRoaXMuc2V0TW9kZSA9IHNldE1vZGU7CiAgICAJdGhpcy5zZXRJbmRleCA9IHNldEluZGV4OwogICAgCXRoaXMucmVuZGVyID0gcmVuZGVyOwogICAgCXRoaXMucmVuZGVySW5zdGFuY2VzID0gcmVuZGVySW5zdGFuY2VzOwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBXZWJHTEluZm8oIGdsICkgewoKICAgIAl2YXIgbWVtb3J5ID0gewogICAgCQlnZW9tZXRyaWVzOiAwLAogICAgCQl0ZXh0dXJlczogMAogICAgCX07CgogICAgCXZhciByZW5kZXIgPSB7CiAgICAJCWZyYW1lOiAwLAogICAgCQljYWxsczogMCwKICAgIAkJdHJpYW5nbGVzOiAwLAogICAgCQlwb2ludHM6IDAsCiAgICAJCWxpbmVzOiAwCiAgICAJfTsKCiAgICAJZnVuY3Rpb24gdXBkYXRlKCBjb3VudCwgbW9kZSwgaW5zdGFuY2VDb3VudCApIHsKCiAgICAJCWluc3RhbmNlQ291bnQgPSBpbnN0YW5jZUNvdW50IHx8IDE7CgogICAgCQlyZW5kZXIuY2FsbHMgKys7CgogICAgCQlzd2l0Y2ggKCBtb2RlICkgewoKICAgIAkJCWNhc2UgNDoKICAgIAkJCQlyZW5kZXIudHJpYW5nbGVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC8gMyApOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgNToKICAgIAkJCWNhc2UgNjoKICAgIAkJCQlyZW5kZXIudHJpYW5nbGVzICs9IGluc3RhbmNlQ291bnQgKiAoIGNvdW50IC0gMiApOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgMToKICAgIAkJCQlyZW5kZXIubGluZXMgKz0gaW5zdGFuY2VDb3VudCAqICggY291bnQgLyAyICk7CiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAzOgogICAgCQkJCXJlbmRlci5saW5lcyArPSBpbnN0YW5jZUNvdW50ICogKCBjb3VudCAtIDEgKTsKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIDI6CiAgICAJCQkJcmVuZGVyLmxpbmVzICs9IGluc3RhbmNlQ291bnQgKiBjb3VudDsKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIDA6CiAgICAJCQkJcmVuZGVyLnBvaW50cyArPSBpbnN0YW5jZUNvdW50ICogY291bnQ7CiAgICAJCQkJYnJlYWs7CgogICAgCQkJZGVmYXVsdDoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xJbmZvOiBVbmtub3duIGRyYXcgbW9kZTonLCBtb2RlICk7CiAgICAJCQkJYnJlYWs7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcmVzZXQoKSB7CgogICAgCQlyZW5kZXIuZnJhbWUgKys7CiAgICAJCXJlbmRlci5jYWxscyA9IDA7CiAgICAJCXJlbmRlci50cmlhbmdsZXMgPSAwOwogICAgCQlyZW5kZXIucG9pbnRzID0gMDsKICAgIAkJcmVuZGVyLmxpbmVzID0gMDsKCiAgICAJfQoKICAgIAlyZXR1cm4gewogICAgCQltZW1vcnk6IG1lbW9yeSwKICAgIAkJcmVuZGVyOiByZW5kZXIsCiAgICAJCXByb2dyYW1zOiBudWxsLAogICAgCQlhdXRvUmVzZXQ6IHRydWUsCiAgICAJCXJlc2V0OiByZXNldCwKICAgIAkJdXBkYXRlOiB1cGRhdGUKICAgIAl9OwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBhYnNOdW1lcmljYWxTb3J0KCBhLCBiICkgewoKICAgIAlyZXR1cm4gTWF0aC5hYnMoIGJbIDEgXSApIC0gTWF0aC5hYnMoIGFbIDEgXSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBXZWJHTE1vcnBodGFyZ2V0cyggZ2wgKSB7CgogICAgCXZhciBpbmZsdWVuY2VzTGlzdCA9IHt9OwogICAgCXZhciBtb3JwaEluZmx1ZW5jZXMgPSBuZXcgRmxvYXQzMkFycmF5KCA4ICk7CgogICAgCWZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIHByb2dyYW0gKSB7CgogICAgCQl2YXIgb2JqZWN0SW5mbHVlbmNlcyA9IG9iamVjdC5tb3JwaFRhcmdldEluZmx1ZW5jZXM7CgogICAgCQl2YXIgbGVuZ3RoID0gb2JqZWN0SW5mbHVlbmNlcy5sZW5ndGg7CgogICAgCQl2YXIgaW5mbHVlbmNlcyA9IGluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdOwoKICAgIAkJaWYgKCBpbmZsdWVuY2VzID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gaW5pdGlhbGlzZSBsaXN0CgogICAgCQkJaW5mbHVlbmNlcyA9IFtdOwoKICAgIAkJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJaW5mbHVlbmNlc1sgaSBdID0gWyBpLCAwIF07CgogICAgCQkJfQoKICAgIAkJCWluZmx1ZW5jZXNMaXN0WyBnZW9tZXRyeS5pZCBdID0gaW5mbHVlbmNlczsKCiAgICAJCX0KCiAgICAJCXZhciBtb3JwaFRhcmdldHMgPSBtYXRlcmlhbC5tb3JwaFRhcmdldHMgJiYgZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCQl2YXIgbW9ycGhOb3JtYWxzID0gbWF0ZXJpYWwubW9ycGhOb3JtYWxzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5ub3JtYWw7CgogICAgCQkvLyBSZW1vdmUgY3VycmVudCBtb3JwaEF0dHJpYnV0ZXMKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgaW5mbHVlbmNlID0gaW5mbHVlbmNlc1sgaSBdOwoKICAgIAkJCWlmICggaW5mbHVlbmNlWyAxIF0gIT09IDAgKSB7CgogICAgCQkJCWlmICggbW9ycGhUYXJnZXRzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhUYXJnZXQnICsgaSApOwogICAgCQkJCWlmICggbW9ycGhOb3JtYWxzICkgZ2VvbWV0cnkucmVtb3ZlQXR0cmlidXRlKCAnbW9ycGhOb3JtYWwnICsgaSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vIENvbGxlY3QgaW5mbHVlbmNlcwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICsrICkgewoKICAgIAkJCXZhciBpbmZsdWVuY2UgPSBpbmZsdWVuY2VzWyBpIF07CgogICAgCQkJaW5mbHVlbmNlWyAwIF0gPSBpOwogICAgCQkJaW5mbHVlbmNlWyAxIF0gPSBvYmplY3RJbmZsdWVuY2VzWyBpIF07CgogICAgCQl9CgogICAgCQlpbmZsdWVuY2VzLnNvcnQoIGFic051bWVyaWNhbFNvcnQgKTsKCiAgICAJCS8vIEFkZCBtb3JwaEF0dHJpYnV0ZXMKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDg7IGkgKysgKSB7CgogICAgCQkJdmFyIGluZmx1ZW5jZSA9IGluZmx1ZW5jZXNbIGkgXTsKCiAgICAJCQlpZiAoIGluZmx1ZW5jZSApIHsKCiAgICAJCQkJdmFyIGluZGV4ID0gaW5mbHVlbmNlWyAwIF07CiAgICAJCQkJdmFyIHZhbHVlID0gaW5mbHVlbmNlWyAxIF07CgogICAgCQkJCWlmICggdmFsdWUgKSB7CgogICAgCQkJCQlpZiAoIG1vcnBoVGFyZ2V0cyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoVGFyZ2V0JyArIGksIG1vcnBoVGFyZ2V0c1sgaW5kZXggXSApOwogICAgCQkJCQlpZiAoIG1vcnBoTm9ybWFscyApIGdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ21vcnBoTm9ybWFsJyArIGksIG1vcnBoTm9ybWFsc1sgaW5kZXggXSApOwoKICAgIAkJCQkJbW9ycGhJbmZsdWVuY2VzWyBpIF0gPSB2YWx1ZTsKICAgIAkJCQkJY29udGludWU7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJbW9ycGhJbmZsdWVuY2VzWyBpIF0gPSAwOwoKICAgIAkJfQoKICAgIAkJcHJvZ3JhbS5nZXRVbmlmb3JtcygpLnNldFZhbHVlKCBnbCwgJ21vcnBoVGFyZ2V0SW5mbHVlbmNlcycsIG1vcnBoSW5mbHVlbmNlcyApOwoKICAgIAl9CgogICAgCXJldHVybiB7CgogICAgCQl1cGRhdGU6IHVwZGF0ZQoKICAgIAl9OwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKSB7CgogICAgCXZhciB1cGRhdGVMaXN0ID0ge307CgogICAgCWZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0ICkgewoKICAgIAkJdmFyIGZyYW1lID0gaW5mby5yZW5kZXIuZnJhbWU7CgogICAgCQl2YXIgZ2VvbWV0cnkgPSBvYmplY3QuZ2VvbWV0cnk7CiAgICAJCXZhciBidWZmZXJnZW9tZXRyeSA9IGdlb21ldHJpZXMuZ2V0KCBvYmplY3QsIGdlb21ldHJ5ICk7CgogICAgCQkvLyBVcGRhdGUgb25jZSBwZXIgZnJhbWUKCiAgICAJCWlmICggdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSAhPT0gZnJhbWUgKSB7CgogICAgCQkJaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKICAgIAkJCQlidWZmZXJnZW9tZXRyeS51cGRhdGVGcm9tT2JqZWN0KCBvYmplY3QgKTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cmllcy51cGRhdGUoIGJ1ZmZlcmdlb21ldHJ5ICk7CgogICAgCQkJdXBkYXRlTGlzdFsgYnVmZmVyZ2VvbWV0cnkuaWQgXSA9IGZyYW1lOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGJ1ZmZlcmdlb21ldHJ5OwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGRpc3Bvc2UoKSB7CgogICAgCQl1cGRhdGVMaXN0ID0ge307CgogICAgCX0KCiAgICAJcmV0dXJuIHsKCiAgICAJCXVwZGF0ZTogdXBkYXRlLAogICAgCQlkaXNwb3NlOiBkaXNwb3NlCgogICAgCX07CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIEN1YmVUZXh0dXJlKCBpbWFnZXMsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKSB7CgogICAgCWltYWdlcyA9IGltYWdlcyAhPT0gdW5kZWZpbmVkID8gaW1hZ2VzIDogW107CiAgICAJbWFwcGluZyA9IG1hcHBpbmcgIT09IHVuZGVmaW5lZCA/IG1hcHBpbmcgOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmc7CiAgICAJZm9ybWF0ID0gZm9ybWF0ICE9PSB1bmRlZmluZWQgPyBmb3JtYXQgOiBSR0JGb3JtYXQ7CgogICAgCVRleHR1cmUuY2FsbCggdGhpcywgaW1hZ2VzLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHksIGVuY29kaW5nICk7CgogICAgCXRoaXMuZmxpcFkgPSBmYWxzZTsKCiAgICB9CgogICAgQ3ViZVRleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKTsKICAgIEN1YmVUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEN1YmVUZXh0dXJlOwoKICAgIEN1YmVUZXh0dXJlLnByb3RvdHlwZS5pc0N1YmVUZXh0dXJlID0gdHJ1ZTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIEN1YmVUZXh0dXJlLnByb3RvdHlwZSwgJ2ltYWdlcycsIHsKCiAgICAJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5pbWFnZTsKCiAgICAJfSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5pbWFnZSA9IHZhbHVlOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBUYWthaGlybyBodHRwczovL2dpdGh1Yi5jb20vdGFrYWhpcm94CiAgICAgKi8KCiAgICBmdW5jdGlvbiBEYXRhVGV4dHVyZTJEQXJyYXkoIGRhdGEsIHdpZHRoLCBoZWlnaHQsIGRlcHRoICkgewoKICAgIAlUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwgKTsKCiAgICAJdGhpcy5pbWFnZSA9IHsgZGF0YTogZGF0YSwgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCwgZGVwdGg6IGRlcHRoIH07CgogICAgCXRoaXMubWFnRmlsdGVyID0gTmVhcmVzdEZpbHRlcjsKICAgIAl0aGlzLm1pbkZpbHRlciA9IE5lYXJlc3RGaWx0ZXI7CgogICAgCXRoaXMud3JhcFIgPSBDbGFtcFRvRWRnZVdyYXBwaW5nOwoKICAgIAl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgCXRoaXMuZmxpcFkgPSBmYWxzZTsKCiAgICB9CgogICAgRGF0YVRleHR1cmUyREFycmF5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CiAgICBEYXRhVGV4dHVyZTJEQXJyYXkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRGF0YVRleHR1cmUyREFycmF5OwogICAgRGF0YVRleHR1cmUyREFycmF5LnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlMkRBcnJheSA9IHRydWU7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIEFydHVyIFRyemVzaW9rCiAgICAgKi8KCiAgICBmdW5jdGlvbiBEYXRhVGV4dHVyZTNEKCBkYXRhLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCApIHsKCiAgICAJLy8gV2UncmUgZ29pbmcgdG8gYWRkIC5zZXRYWFgoKSBtZXRob2RzIGZvciBzZXR0aW5nIHByb3BlcnRpZXMgbGF0ZXIuCiAgICAJLy8gVXNlcnMgY2FuIHN0aWxsIHNldCBpbiBEYXRhVGV4dHVyZTNEIGRpcmVjdGx5LgogICAgCS8vCiAgICAJLy8JdmFyIHRleHR1cmUgPSBuZXcgVEhSRUUuRGF0YVRleHR1cmUzRCggZGF0YSwgd2lkdGgsIGhlaWdodCwgZGVwdGggKTsKICAgIAkvLyAJdGV4dHVyZS5hbmlzb3Ryb3B5ID0gMTY7CiAgICAJLy8KICAgIAkvLyBTZWUgIzE0ODM5CgogICAgCVRleHR1cmUuY2FsbCggdGhpcywgbnVsbCApOwoKICAgIAl0aGlzLmltYWdlID0geyBkYXRhOiBkYXRhLCB3aWR0aDogd2lkdGgsIGhlaWdodDogaGVpZ2h0LCBkZXB0aDogZGVwdGggfTsKCiAgICAJdGhpcy5tYWdGaWx0ZXIgPSBOZWFyZXN0RmlsdGVyOwogICAgCXRoaXMubWluRmlsdGVyID0gTmVhcmVzdEZpbHRlcjsKCiAgICAJdGhpcy53cmFwUiA9IENsYW1wVG9FZGdlV3JhcHBpbmc7CgogICAgCXRoaXMuZ2VuZXJhdGVNaXBtYXBzID0gZmFsc2U7CiAgICAJdGhpcy5mbGlwWSA9IGZhbHNlOwoKICAgIH0KCiAgICBEYXRhVGV4dHVyZTNELnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CiAgICBEYXRhVGV4dHVyZTNELnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERhdGFUZXh0dXJlM0Q7CiAgICBEYXRhVGV4dHVyZTNELnByb3RvdHlwZS5pc0RhdGFUZXh0dXJlM0QgPSB0cnVlOwoKICAgIC8qKgogICAgICogQGF1dGhvciB0c2NodwogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKgogICAgICogVW5pZm9ybXMgb2YgYSBwcm9ncmFtLgogICAgICogVGhvc2UgZm9ybSBhIHRyZWUgc3RydWN0dXJlIHdpdGggYSBzcGVjaWFsIHRvcC1sZXZlbCBjb250YWluZXIgZm9yIHRoZSByb290LAogICAgICogd2hpY2ggeW91IGdldCBieSBjYWxsaW5nICduZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0gKScuCiAgICAgKgogICAgICoKICAgICAqIFByb3BlcnRpZXMgb2YgaW5uZXIgbm9kZXMgaW5jbHVkaW5nIHRoZSB0b3AtbGV2ZWwgY29udGFpbmVyOgogICAgICoKICAgICAqIC5zZXEgLSBhcnJheSBvZiBuZXN0ZWQgdW5pZm9ybXMKICAgICAqIC5tYXAgLSBuZXN0ZWQgdW5pZm9ybXMgYnkgbmFtZQogICAgICoKICAgICAqCiAgICAgKiBNZXRob2RzIG9mIGFsbCBub2RlcyBleGNlcHQgdGhlIHRvcC1sZXZlbCBjb250YWluZXI6CiAgICAgKgogICAgICogLnNldFZhbHVlKCBnbCwgdmFsdWUsIFt0ZXh0dXJlc10gKQogICAgICoKICAgICAqIAkJdXBsb2FkcyBhIHVuaWZvcm0gdmFsdWUocykKICAgICAqICAJdGhlICd0ZXh0dXJlcycgcGFyYW1ldGVyIGlzIG5lZWRlZCBmb3Igc2FtcGxlciB1bmlmb3JtcwogICAgICoKICAgICAqCiAgICAgKiBTdGF0aWMgbWV0aG9kcyBvZiB0aGUgdG9wLWxldmVsIGNvbnRhaW5lciAodGV4dHVyZXMgZmFjdG9yaXphdGlvbnMpOgogICAgICoKICAgICAqIC51cGxvYWQoIGdsLCBzZXEsIHZhbHVlcywgdGV4dHVyZXMgKQogICAgICoKICAgICAqIAkJc2V0cyB1bmlmb3JtcyBpbiAnc2VxJyB0byAndmFsdWVzW2lkXS52YWx1ZScKICAgICAqCiAgICAgKiAuc2VxV2l0aFZhbHVlKCBzZXEsIHZhbHVlcyApIDogZmlsdGVyZWRTZXEKICAgICAqCiAgICAgKiAJCWZpbHRlcnMgJ3NlcScgZW50cmllcyB3aXRoIGNvcnJlc3BvbmRpbmcgZW50cnkgaW4gdmFsdWVzCiAgICAgKgogICAgICoKICAgICAqIE1ldGhvZHMgb2YgdGhlIHRvcC1sZXZlbCBjb250YWluZXIgKHRleHR1cmVzIGZhY3Rvcml6YXRpb25zKToKICAgICAqCiAgICAgKiAuc2V0VmFsdWUoIGdsLCBuYW1lLCB2YWx1ZSwgdGV4dHVyZXMgKQogICAgICoKICAgICAqIAkJc2V0cyB1bmlmb3JtIHdpdGggIG5hbWUgJ25hbWUnIHRvICd2YWx1ZScKICAgICAqCiAgICAgKiAuc2V0T3B0aW9uYWwoIGdsLCBvYmosIHByb3AgKQogICAgICoKICAgICAqIAkJbGlrZSAuc2V0IGZvciBhbiBvcHRpb25hbCBwcm9wZXJ0eSBvZiB0aGUgb2JqZWN0CiAgICAgKgogICAgICovCgogICAgdmFyIGVtcHR5VGV4dHVyZSA9IG5ldyBUZXh0dXJlKCk7CiAgICB2YXIgZW1wdHlUZXh0dXJlMmRBcnJheSA9IG5ldyBEYXRhVGV4dHVyZTJEQXJyYXkoKTsKICAgIHZhciBlbXB0eVRleHR1cmUzZCA9IG5ldyBEYXRhVGV4dHVyZTNEKCk7CiAgICB2YXIgZW1wdHlDdWJlVGV4dHVyZSA9IG5ldyBDdWJlVGV4dHVyZSgpOwoKICAgIC8vIC0tLSBVdGlsaXRpZXMgLS0tCgogICAgLy8gQXJyYXkgQ2FjaGVzIChwcm92aWRlIHR5cGVkIGFycmF5cyBmb3IgdGVtcG9yYXJ5IGJ5IHNpemUpCgogICAgdmFyIGFycmF5Q2FjaGVGMzIgPSBbXTsKICAgIHZhciBhcnJheUNhY2hlSTMyID0gW107CgogICAgLy8gRmxvYXQzMkFycmF5IGNhY2hlcyB1c2VkIGZvciB1cGxvYWRpbmcgTWF0cml4IHVuaWZvcm1zCgogICAgdmFyIG1hdDRhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDE2ICk7CiAgICB2YXIgbWF0M2FycmF5ID0gbmV3IEZsb2F0MzJBcnJheSggOSApOwogICAgdmFyIG1hdDJhcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIDQgKTsKCiAgICAvLyBGbGF0dGVuaW5nIGZvciBhcnJheXMgb2YgdmVjdG9ycyBhbmQgbWF0cmljZXMKCiAgICBmdW5jdGlvbiBmbGF0dGVuJDEoIGFycmF5LCBuQmxvY2tzLCBibG9ja1NpemUgKSB7CgogICAgCXZhciBmaXJzdEVsZW0gPSBhcnJheVsgMCBdOwoKICAgIAlpZiAoIGZpcnN0RWxlbSA8PSAwIHx8IGZpcnN0RWxlbSA+IDAgKSByZXR1cm4gYXJyYXk7CiAgICAJLy8gdW5vcHRpbWl6ZWQ6ICEgaXNOYU4oIGZpcnN0RWxlbSApCiAgICAJLy8gc2VlIGh0dHA6Ly9qYWNrc29uZHVuc3Rhbi5jb20vYXJ0aWNsZXMvOTgzCgogICAgCXZhciBuID0gbkJsb2NrcyAqIGJsb2NrU2l6ZSwKICAgIAkJciA9IGFycmF5Q2FjaGVGMzJbIG4gXTsKCiAgICAJaWYgKCByID09PSB1bmRlZmluZWQgKSB7CgogICAgCQlyID0gbmV3IEZsb2F0MzJBcnJheSggbiApOwogICAgCQlhcnJheUNhY2hlRjMyWyBuIF0gPSByOwoKICAgIAl9CgogICAgCWlmICggbkJsb2NrcyAhPT0gMCApIHsKCiAgICAJCWZpcnN0RWxlbS50b0FycmF5KCByLCAwICk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDEsIG9mZnNldCA9IDA7IGkgIT09IG5CbG9ja3M7ICsrIGkgKSB7CgogICAgCQkJb2Zmc2V0ICs9IGJsb2NrU2l6ZTsKICAgIAkJCWFycmF5WyBpIF0udG9BcnJheSggciwgb2Zmc2V0ICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJcmV0dXJuIHI7CgogICAgfQoKICAgIGZ1bmN0aW9uIGFycmF5c0VxdWFsKCBhLCBiICkgewoKICAgIAlpZiAoIGEubGVuZ3RoICE9PSBiLmxlbmd0aCApIHJldHVybiBmYWxzZTsKCiAgICAJZm9yICggdmFyIGkgPSAwLCBsID0gYS5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJaWYgKCBhWyBpIF0gIT09IGJbIGkgXSApIHJldHVybiBmYWxzZTsKCiAgICAJfQoKICAgIAlyZXR1cm4gdHJ1ZTsKCiAgICB9CgogICAgZnVuY3Rpb24gY29weUFycmF5JDEoIGEsIGIgKSB7CgogICAgCWZvciAoIHZhciBpID0gMCwgbCA9IGIubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCWFbIGkgXSA9IGJbIGkgXTsKCiAgICAJfQoKICAgIH0KCiAgICAvLyBUZXh0dXJlIHVuaXQgYWxsb2NhdGlvbgoKICAgIGZ1bmN0aW9uIGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICkgewoKICAgIAl2YXIgciA9IGFycmF5Q2FjaGVJMzJbIG4gXTsKCiAgICAJaWYgKCByID09PSB1bmRlZmluZWQgKSB7CgogICAgCQlyID0gbmV3IEludDMyQXJyYXkoIG4gKTsKICAgIAkJYXJyYXlDYWNoZUkzMlsgbiBdID0gcjsKCiAgICAJfQoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG47ICsrIGkgKQogICAgCQlyWyBpIF0gPSB0ZXh0dXJlcy5hbGxvY2F0ZVRleHR1cmVVbml0KCk7CgogICAgCXJldHVybiByOwoKICAgIH0KCiAgICAvLyAtLS0gU2V0dGVycyAtLS0KCiAgICAvLyBOb3RlOiBEZWZpbmluZyB0aGVzZSBtZXRob2RzIGV4dGVybmFsbHksIGJlY2F1c2UgdGhleSBjb21lIGluIGEgYnVuY2gKICAgIC8vIGFuZCB0aGlzIHdheSB0aGVpciBuYW1lcyBtaW5pZnkuCgogICAgLy8gU2luZ2xlIHNjYWxhcgoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVjFmKCBnbCwgdiApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKCiAgICAJaWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuOwoKICAgIAlnbC51bmlmb3JtMWYoIHRoaXMuYWRkciwgdiApOwoKICAgIAljYWNoZVsgMCBdID0gdjsKCiAgICB9CgogICAgLy8gU2luZ2xlIGZsb2F0IHZlY3RvciAoZnJvbSBmbGF0IGFycmF5IG9yIFRIUkVFLlZlY3Rvck4pCgogICAgZnVuY3Rpb24gc2V0VmFsdWVWMmYoIGdsLCB2ICkgewoKICAgIAl2YXIgY2FjaGUgPSB0aGlzLmNhY2hlOwoKICAgIAlpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJaWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55ICkgewoKICAgIAkJCWdsLnVuaWZvcm0yZiggdGhpcy5hZGRyLCB2LngsIHYueSApOwoKICAgIAkJCWNhY2hlWyAwIF0gPSB2Lng7CiAgICAJCQljYWNoZVsgMSBdID0gdi55OwoKICAgIAkJfQoKICAgIAl9IGVsc2UgewoKICAgIAkJaWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjsKCiAgICAJCWdsLnVuaWZvcm0yZnYoIHRoaXMuYWRkciwgdiApOwoKICAgIAkJY29weUFycmF5JDEoIGNhY2hlLCB2ICk7CgogICAgCX0KCiAgICB9CgogICAgZnVuY3Rpb24gc2V0VmFsdWVWM2YoIGdsLCB2ICkgewoKICAgIAl2YXIgY2FjaGUgPSB0aGlzLmNhY2hlOwoKICAgIAlpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJaWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiApIHsKCiAgICAJCQlnbC51bmlmb3JtM2YoIHRoaXMuYWRkciwgdi54LCB2LnksIHYueiApOwoKICAgIAkJCWNhY2hlWyAwIF0gPSB2Lng7CiAgICAJCQljYWNoZVsgMSBdID0gdi55OwogICAgCQkJY2FjaGVbIDIgXSA9IHYuejsKCiAgICAJCX0KCiAgICAJfSBlbHNlIGlmICggdi5yICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQlpZiAoIGNhY2hlWyAwIF0gIT09IHYuciB8fCBjYWNoZVsgMSBdICE9PSB2LmcgfHwgY2FjaGVbIDIgXSAhPT0gdi5iICkgewoKICAgIAkJCWdsLnVuaWZvcm0zZiggdGhpcy5hZGRyLCB2LnIsIHYuZywgdi5iICk7CgogICAgCQkJY2FjaGVbIDAgXSA9IHYucjsKICAgIAkJCWNhY2hlWyAxIF0gPSB2Lmc7CiAgICAJCQljYWNoZVsgMiBdID0gdi5iOwoKICAgIAkJfQoKICAgIAl9IGVsc2UgewoKICAgIAkJaWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjsKCiAgICAJCWdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgdiApOwoKICAgIAkJY29weUFycmF5JDEoIGNhY2hlLCB2ICk7CgogICAgCX0KCiAgICB9CgogICAgZnVuY3Rpb24gc2V0VmFsdWVWNGYoIGdsLCB2ICkgewoKICAgIAl2YXIgY2FjaGUgPSB0aGlzLmNhY2hlOwoKICAgIAlpZiAoIHYueCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJaWYgKCBjYWNoZVsgMCBdICE9PSB2LnggfHwgY2FjaGVbIDEgXSAhPT0gdi55IHx8IGNhY2hlWyAyIF0gIT09IHYueiB8fCBjYWNoZVsgMyBdICE9PSB2LncgKSB7CgogICAgCQkJZ2wudW5pZm9ybTRmKCB0aGlzLmFkZHIsIHYueCwgdi55LCB2LnosIHYudyApOwoKICAgIAkJCWNhY2hlWyAwIF0gPSB2Lng7CiAgICAJCQljYWNoZVsgMSBdID0gdi55OwogICAgCQkJY2FjaGVbIDIgXSA9IHYuejsKICAgIAkJCWNhY2hlWyAzIF0gPSB2Lnc7CgogICAgCQl9CgogICAgCX0gZWxzZSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuOwoKICAgIAkJZ2wudW5pZm9ybTRmdiggdGhpcy5hZGRyLCB2ICk7CgogICAgCQljb3B5QXJyYXkkMSggY2FjaGUsIHYgKTsKCiAgICAJfQoKICAgIH0KCiAgICAvLyBTaW5nbGUgbWF0cml4IChmcm9tIGZsYXQgYXJyYXkgb3IgTWF0cml4TikKCiAgICBmdW5jdGlvbiBzZXRWYWx1ZU0yKCBnbCwgdiApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgZWxlbWVudHMgPSB2LmVsZW1lbnRzOwoKICAgIAlpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuOwoKICAgIAkJZ2wudW5pZm9ybU1hdHJpeDJmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApOwoKICAgIAkJY29weUFycmF5JDEoIGNhY2hlLCB2ICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjsKCiAgICAJCW1hdDJhcnJheS5zZXQoIGVsZW1lbnRzICk7CgogICAgCQlnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQyYXJyYXkgKTsKCiAgICAJCWNvcHlBcnJheSQxKCBjYWNoZSwgZWxlbWVudHMgKTsKCiAgICAJfQoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZU0zKCBnbCwgdiApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgZWxlbWVudHMgPSB2LmVsZW1lbnRzOwoKICAgIAlpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuOwoKICAgIAkJZ2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApOwoKICAgIAkJY29weUFycmF5JDEoIGNhY2hlLCB2ICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjsKCiAgICAJCW1hdDNhcnJheS5zZXQoIGVsZW1lbnRzICk7CgogICAgCQlnbC51bmlmb3JtTWF0cml4M2Z2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQzYXJyYXkgKTsKCiAgICAJCWNvcHlBcnJheSQxKCBjYWNoZSwgZWxlbWVudHMgKTsKCiAgICAJfQoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZU00KCBnbCwgdiApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgZWxlbWVudHMgPSB2LmVsZW1lbnRzOwoKICAgIAlpZiAoIGVsZW1lbnRzID09PSB1bmRlZmluZWQgKSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuOwoKICAgIAkJZ2wudW5pZm9ybU1hdHJpeDRmdiggdGhpcy5hZGRyLCBmYWxzZSwgdiApOwoKICAgIAkJY29weUFycmF5JDEoIGNhY2hlLCB2ICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgZWxlbWVudHMgKSApIHJldHVybjsKCiAgICAJCW1hdDRhcnJheS5zZXQoIGVsZW1lbnRzICk7CgogICAgCQlnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBtYXQ0YXJyYXkgKTsKCiAgICAJCWNvcHlBcnJheSQxKCBjYWNoZSwgZWxlbWVudHMgKTsKCiAgICAJfQoKICAgIH0KCiAgICAvLyBTaW5nbGUgdGV4dHVyZSAoMkQgLyBDdWJlKQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVDEoIGdsLCB2LCB0ZXh0dXJlcyApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKCiAgICAJaWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkgewoKICAgIAkJZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKICAgIAkJY2FjaGVbIDAgXSA9IHVuaXQ7CgogICAgCX0KCiAgICAJdGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRCggdiB8fCBlbXB0eVRleHR1cmUsIHVuaXQgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gc2V0VmFsdWVUMkRBcnJheTEoIGdsLCB2LCB0ZXh0dXJlcyApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKCiAgICAJaWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkgewoKICAgIAkJZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKICAgIAkJY2FjaGVbIDAgXSA9IHVuaXQ7CgogICAgCX0KCiAgICAJdGV4dHVyZXMuc2V0VGV4dHVyZTJEQXJyYXkoIHYgfHwgZW1wdHlUZXh0dXJlMmRBcnJheSwgdW5pdCApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZVQzRDEoIGdsLCB2LCB0ZXh0dXJlcyApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKCiAgICAJaWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkgewoKICAgIAkJZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKICAgIAkJY2FjaGVbIDAgXSA9IHVuaXQ7CgogICAgCX0KCiAgICAJdGV4dHVyZXMuc2V0VGV4dHVyZTNEKCB2IHx8IGVtcHR5VGV4dHVyZTNkLCB1bml0ICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVDYoIGdsLCB2LCB0ZXh0dXJlcyApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKICAgIAl2YXIgdW5pdCA9IHRleHR1cmVzLmFsbG9jYXRlVGV4dHVyZVVuaXQoKTsKCiAgICAJaWYgKCBjYWNoZVsgMCBdICE9PSB1bml0ICkgewoKICAgIAkJZ2wudW5pZm9ybTFpKCB0aGlzLmFkZHIsIHVuaXQgKTsKICAgIAkJY2FjaGVbIDAgXSA9IHVuaXQ7CgogICAgCX0KCiAgICAJdGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlKCB2IHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXQgKTsKCiAgICB9CgogICAgLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVjFpKCBnbCwgdiApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKCiAgICAJaWYgKCBjYWNoZVsgMCBdID09PSB2ICkgcmV0dXJuOwoKICAgIAlnbC51bmlmb3JtMWkoIHRoaXMuYWRkciwgdiApOwoKICAgIAljYWNoZVsgMCBdID0gdjsKCiAgICB9CgogICAgZnVuY3Rpb24gc2V0VmFsdWVWMmkoIGdsLCB2ICkgewoKICAgIAl2YXIgY2FjaGUgPSB0aGlzLmNhY2hlOwoKICAgIAlpZiAoIGFycmF5c0VxdWFsKCBjYWNoZSwgdiApICkgcmV0dXJuOwoKICAgIAlnbC51bmlmb3JtMml2KCB0aGlzLmFkZHIsIHYgKTsKCiAgICAJY29weUFycmF5JDEoIGNhY2hlLCB2ICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVjNpKCBnbCwgdiApIHsKCiAgICAJdmFyIGNhY2hlID0gdGhpcy5jYWNoZTsKCiAgICAJaWYgKCBhcnJheXNFcXVhbCggY2FjaGUsIHYgKSApIHJldHVybjsKCiAgICAJZ2wudW5pZm9ybTNpdiggdGhpcy5hZGRyLCB2ICk7CgogICAgCWNvcHlBcnJheSQxKCBjYWNoZSwgdiApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZVY0aSggZ2wsIHYgKSB7CgogICAgCXZhciBjYWNoZSA9IHRoaXMuY2FjaGU7CgogICAgCWlmICggYXJyYXlzRXF1YWwoIGNhY2hlLCB2ICkgKSByZXR1cm47CgogICAgCWdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApOwoKICAgIAljb3B5QXJyYXkkMSggY2FjaGUsIHYgKTsKCiAgICB9CgogICAgLy8gSGVscGVyIHRvIHBpY2sgdGhlIHJpZ2h0IHNldHRlciBmb3IgdGhlIHNpbmd1bGFyIGNhc2UKCiAgICBmdW5jdGlvbiBnZXRTaW5ndWxhclNldHRlciggdHlwZSApIHsKCiAgICAJc3dpdGNoICggdHlwZSApIHsKCiAgICAJCWNhc2UgMHgxNDA2OiByZXR1cm4gc2V0VmFsdWVWMWY7IC8vIEZMT0FUCiAgICAJCWNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmY7IC8vIF9WRUMyCiAgICAJCWNhc2UgMHg4YjUxOiByZXR1cm4gc2V0VmFsdWVWM2Y7IC8vIF9WRUMzCiAgICAJCWNhc2UgMHg4YjUyOiByZXR1cm4gc2V0VmFsdWVWNGY7IC8vIF9WRUM0CgogICAgCQljYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTI7IC8vIF9NQVQyCiAgICAJCWNhc2UgMHg4YjViOiByZXR1cm4gc2V0VmFsdWVNMzsgLy8gX01BVDMKICAgIAkJY2FzZSAweDhiNWM6IHJldHVybiBzZXRWYWx1ZU00OyAvLyBfTUFUNAoKICAgIAkJY2FzZSAweDhiNWU6IGNhc2UgMHg4ZDY2OiByZXR1cm4gc2V0VmFsdWVUMTsgLy8gU0FNUExFUl8yRCwgU0FNUExFUl9FWFRFUk5BTF9PRVMKICAgIAkJY2FzZSAweDhiNWY6IHJldHVybiBzZXRWYWx1ZVQzRDE7IC8vIFNBTVBMRVJfM0QKICAgIAkJY2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2OyAvLyBTQU1QTEVSX0NVQkUKICAgIAkJY2FzZSAweDhEQzE6IHJldHVybiBzZXRWYWx1ZVQyREFycmF5MTsgLy8gU0FNUExFUl8yRF9BUlJBWQoKICAgIAkJY2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWk7IC8vIElOVCwgQk9PTAogICAgCQljYXNlIDB4OGI1MzogY2FzZSAweDhiNTc6IHJldHVybiBzZXRWYWx1ZVYyaTsgLy8gX1ZFQzIKICAgIAkJY2FzZSAweDhiNTQ6IGNhc2UgMHg4YjU4OiByZXR1cm4gc2V0VmFsdWVWM2k7IC8vIF9WRUMzCiAgICAJCWNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpOyAvLyBfVkVDNAoKICAgIAl9CgogICAgfQoKICAgIC8vIEFycmF5IG9mIHNjYWxhcnMKICAgIGZ1bmN0aW9uIHNldFZhbHVlVjFmQXJyYXkoIGdsLCB2ICkgewoKICAgIAlnbC51bmlmb3JtMWZ2KCB0aGlzLmFkZHIsIHYgKTsKCiAgICB9CgogICAgLy8gSW50ZWdlciAvIEJvb2xlYW4gdmVjdG9ycyBvciBhcnJheXMgdGhlcmVvZiAoYWx3YXlzIGZsYXQgYXJyYXlzKQogICAgZnVuY3Rpb24gc2V0VmFsdWVWMWlBcnJheSggZ2wsIHYgKSB7CgogICAgCWdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdiApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZVYyaUFycmF5KCBnbCwgdiApIHsKCiAgICAJZ2wudW5pZm9ybTJpdiggdGhpcy5hZGRyLCB2ICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVjNpQXJyYXkoIGdsLCB2ICkgewoKICAgIAlnbC51bmlmb3JtM2l2KCB0aGlzLmFkZHIsIHYgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gc2V0VmFsdWVWNGlBcnJheSggZ2wsIHYgKSB7CgogICAgCWdsLnVuaWZvcm00aXYoIHRoaXMuYWRkciwgdiApOwoKICAgIH0KCgogICAgLy8gQXJyYXkgb2YgdmVjdG9ycyAoZmxhdCBvciBmcm9tIFRIUkVFIGNsYXNzZXMpCgogICAgZnVuY3Rpb24gc2V0VmFsdWVWMmZBcnJheSggZ2wsIHYgKSB7CgogICAgCXZhciBkYXRhID0gZmxhdHRlbiQxKCB2LCB0aGlzLnNpemUsIDIgKTsKCiAgICAJZ2wudW5pZm9ybTJmdiggdGhpcy5hZGRyLCBkYXRhICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVjNmQXJyYXkoIGdsLCB2ICkgewoKICAgIAl2YXIgZGF0YSA9IGZsYXR0ZW4kMSggdiwgdGhpcy5zaXplLCAzICk7CgogICAgCWdsLnVuaWZvcm0zZnYoIHRoaXMuYWRkciwgZGF0YSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZVY0ZkFycmF5KCBnbCwgdiApIHsKCiAgICAJdmFyIGRhdGEgPSBmbGF0dGVuJDEoIHYsIHRoaXMuc2l6ZSwgNCApOwoKICAgIAlnbC51bmlmb3JtNGZ2KCB0aGlzLmFkZHIsIGRhdGEgKTsKCiAgICB9CgogICAgLy8gQXJyYXkgb2YgbWF0cmljZXMgKGZsYXQgb3IgZnJvbSBUSFJFRSBjbGFzZXMpCgogICAgZnVuY3Rpb24gc2V0VmFsdWVNMkFycmF5KCBnbCwgdiApIHsKCiAgICAJdmFyIGRhdGEgPSBmbGF0dGVuJDEoIHYsIHRoaXMuc2l6ZSwgNCApOwoKICAgIAlnbC51bmlmb3JtTWF0cml4MmZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlTTNBcnJheSggZ2wsIHYgKSB7CgogICAgCXZhciBkYXRhID0gZmxhdHRlbiQxKCB2LCB0aGlzLnNpemUsIDkgKTsKCiAgICAJZ2wudW5pZm9ybU1hdHJpeDNmdiggdGhpcy5hZGRyLCBmYWxzZSwgZGF0YSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBzZXRWYWx1ZU00QXJyYXkoIGdsLCB2ICkgewoKICAgIAl2YXIgZGF0YSA9IGZsYXR0ZW4kMSggdiwgdGhpcy5zaXplLCAxNiApOwoKICAgIAlnbC51bmlmb3JtTWF0cml4NGZ2KCB0aGlzLmFkZHIsIGZhbHNlLCBkYXRhICk7CgogICAgfQoKICAgIC8vIEFycmF5IG9mIHRleHR1cmVzICgyRCAvIEN1YmUpCgogICAgZnVuY3Rpb24gc2V0VmFsdWVUMUFycmF5KCBnbCwgdiwgdGV4dHVyZXMgKSB7CgogICAgCXZhciBuID0gdi5sZW5ndGg7CgogICAgCXZhciB1bml0cyA9IGFsbG9jVGV4VW5pdHMoIHRleHR1cmVzLCBuICk7CgogICAgCWdsLnVuaWZvcm0xaXYoIHRoaXMuYWRkciwgdW5pdHMgKTsKCiAgICAJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJdGV4dHVyZXMuc2FmZVNldFRleHR1cmUyRCggdlsgaSBdIHx8IGVtcHR5VGV4dHVyZSwgdW5pdHNbIGkgXSApOwoKICAgIAl9CgogICAgfQoKICAgIGZ1bmN0aW9uIHNldFZhbHVlVDZBcnJheSggZ2wsIHYsIHRleHR1cmVzICkgewoKICAgIAl2YXIgbiA9IHYubGVuZ3RoOwoKICAgIAl2YXIgdW5pdHMgPSBhbGxvY1RleFVuaXRzKCB0ZXh0dXJlcywgbiApOwoKICAgIAlnbC51bmlmb3JtMWl2KCB0aGlzLmFkZHIsIHVuaXRzICk7CgogICAgCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCXRleHR1cmVzLnNhZmVTZXRUZXh0dXJlQ3ViZSggdlsgaSBdIHx8IGVtcHR5Q3ViZVRleHR1cmUsIHVuaXRzWyBpIF0gKTsKCiAgICAJfQoKICAgIH0KCiAgICAvLyBIZWxwZXIgdG8gcGljayB0aGUgcmlnaHQgc2V0dGVyIGZvciBhIHB1cmUgKGJvdHRvbS1sZXZlbCkgYXJyYXkKCiAgICBmdW5jdGlvbiBnZXRQdXJlQXJyYXlTZXR0ZXIoIHR5cGUgKSB7CgogICAgCXN3aXRjaCAoIHR5cGUgKSB7CgogICAgCQljYXNlIDB4MTQwNjogcmV0dXJuIHNldFZhbHVlVjFmQXJyYXk7IC8vIEZMT0FUCiAgICAJCWNhc2UgMHg4YjUwOiByZXR1cm4gc2V0VmFsdWVWMmZBcnJheTsgLy8gX1ZFQzIKICAgIAkJY2FzZSAweDhiNTE6IHJldHVybiBzZXRWYWx1ZVYzZkFycmF5OyAvLyBfVkVDMwogICAgCQljYXNlIDB4OGI1MjogcmV0dXJuIHNldFZhbHVlVjRmQXJyYXk7IC8vIF9WRUM0CgogICAgCQljYXNlIDB4OGI1YTogcmV0dXJuIHNldFZhbHVlTTJBcnJheTsgLy8gX01BVDIKICAgIAkJY2FzZSAweDhiNWI6IHJldHVybiBzZXRWYWx1ZU0zQXJyYXk7IC8vIF9NQVQzCiAgICAJCWNhc2UgMHg4YjVjOiByZXR1cm4gc2V0VmFsdWVNNEFycmF5OyAvLyBfTUFUNAoKICAgIAkJY2FzZSAweDhiNWU6IHJldHVybiBzZXRWYWx1ZVQxQXJyYXk7IC8vIFNBTVBMRVJfMkQKICAgIAkJY2FzZSAweDhiNjA6IHJldHVybiBzZXRWYWx1ZVQ2QXJyYXk7IC8vIFNBTVBMRVJfQ1VCRQoKICAgIAkJY2FzZSAweDE0MDQ6IGNhc2UgMHg4YjU2OiByZXR1cm4gc2V0VmFsdWVWMWlBcnJheTsgLy8gSU5ULCBCT09MCiAgICAJCWNhc2UgMHg4YjUzOiBjYXNlIDB4OGI1NzogcmV0dXJuIHNldFZhbHVlVjJpQXJyYXk7IC8vIF9WRUMyCiAgICAJCWNhc2UgMHg4YjU0OiBjYXNlIDB4OGI1ODogcmV0dXJuIHNldFZhbHVlVjNpQXJyYXk7IC8vIF9WRUMzCiAgICAJCWNhc2UgMHg4YjU1OiBjYXNlIDB4OGI1OTogcmV0dXJuIHNldFZhbHVlVjRpQXJyYXk7IC8vIF9WRUM0CgogICAgCX0KCiAgICB9CgogICAgLy8gLS0tIFVuaWZvcm0gQ2xhc3NlcyAtLS0KCiAgICBmdW5jdGlvbiBTaW5nbGVVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApIHsKCiAgICAJdGhpcy5pZCA9IGlkOwogICAgCXRoaXMuYWRkciA9IGFkZHI7CiAgICAJdGhpcy5jYWNoZSA9IFtdOwogICAgCXRoaXMuc2V0VmFsdWUgPSBnZXRTaW5ndWxhclNldHRlciggYWN0aXZlSW5mby50eXBlICk7CgogICAgCS8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUcKCiAgICB9CgogICAgZnVuY3Rpb24gUHVyZUFycmF5VW5pZm9ybSggaWQsIGFjdGl2ZUluZm8sIGFkZHIgKSB7CgogICAgCXRoaXMuaWQgPSBpZDsKICAgIAl0aGlzLmFkZHIgPSBhZGRyOwogICAgCXRoaXMuY2FjaGUgPSBbXTsKICAgIAl0aGlzLnNpemUgPSBhY3RpdmVJbmZvLnNpemU7CiAgICAJdGhpcy5zZXRWYWx1ZSA9IGdldFB1cmVBcnJheVNldHRlciggYWN0aXZlSW5mby50eXBlICk7CgogICAgCS8vIHRoaXMucGF0aCA9IGFjdGl2ZUluZm8ubmFtZTsgLy8gREVCVUcKCiAgICB9CgogICAgUHVyZUFycmF5VW5pZm9ybS5wcm90b3R5cGUudXBkYXRlQ2FjaGUgPSBmdW5jdGlvbiAoIGRhdGEgKSB7CgogICAgCXZhciBjYWNoZSA9IHRoaXMuY2FjaGU7CgogICAgCWlmICggZGF0YSBpbnN0YW5jZW9mIEZsb2F0MzJBcnJheSAmJiBjYWNoZS5sZW5ndGggIT09IGRhdGEubGVuZ3RoICkgewoKICAgIAkJdGhpcy5jYWNoZSA9IG5ldyBGbG9hdDMyQXJyYXkoIGRhdGEubGVuZ3RoICk7CgogICAgCX0KCiAgICAJY29weUFycmF5JDEoIGNhY2hlLCBkYXRhICk7CgogICAgfTsKCiAgICBmdW5jdGlvbiBTdHJ1Y3R1cmVkVW5pZm9ybSggaWQgKSB7CgogICAgCXRoaXMuaWQgPSBpZDsKCiAgICAJdGhpcy5zZXEgPSBbXTsKICAgIAl0aGlzLm1hcCA9IHt9OwoKICAgIH0KCiAgICBTdHJ1Y3R1cmVkVW5pZm9ybS5wcm90b3R5cGUuc2V0VmFsdWUgPSBmdW5jdGlvbiAoIGdsLCB2YWx1ZSwgdGV4dHVyZXMgKSB7CgogICAgCXZhciBzZXEgPSB0aGlzLnNlcTsKCiAgICAJZm9yICggdmFyIGkgPSAwLCBuID0gc2VxLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCXZhciB1ID0gc2VxWyBpIF07CiAgICAJCXUuc2V0VmFsdWUoIGdsLCB2YWx1ZVsgdS5pZCBdLCB0ZXh0dXJlcyApOwoKICAgIAl9CgogICAgfTsKCiAgICAvLyAtLS0gVG9wLWxldmVsIC0tLQoKICAgIC8vIFBhcnNlciAtIGJ1aWxkcyB1cCB0aGUgcHJvcGVydHkgdHJlZSBmcm9tIHRoZSBwYXRoIHN0cmluZ3MKCiAgICB2YXIgUmVQYXRoUGFydCA9IC8oW1x3XGRfXSspKFxdKT8oXFt8XC4pPy9nOwoKICAgIC8vIGV4dHJhY3RzCiAgICAvLyAJLSB0aGUgaWRlbnRpZmllciAobWVtYmVyIG5hbWUgb3IgYXJyYXkgaW5kZXgpCiAgICAvLyAgLSBmb2xsb3dlZCBieSBhbiBvcHRpb25hbCByaWdodCBicmFja2V0IChmb3VuZCB3aGVuIGFycmF5IGluZGV4KQogICAgLy8gIC0gZm9sbG93ZWQgYnkgYW4gb3B0aW9uYWwgbGVmdCBicmFja2V0IG9yIGRvdCAodHlwZSBvZiBzdWJzY3JpcHQpCiAgICAvLwogICAgLy8gTm90ZTogVGhlc2UgcG9ydGlvbnMgY2FuIGJlIHJlYWQgaW4gYSBub24tb3ZlcmxhcHBpbmcgZmFzaGlvbiBhbmQKICAgIC8vIGFsbG93IHN0cmFpZ2h0Zm9yd2FyZCBwYXJzaW5nIG9mIHRoZSBoaWVyYXJjaHkgdGhhdCBXZWJHTCBlbmNvZGVzCiAgICAvLyBpbiB0aGUgdW5pZm9ybSBuYW1lcy4KCiAgICBmdW5jdGlvbiBhZGRVbmlmb3JtKCBjb250YWluZXIsIHVuaWZvcm1PYmplY3QgKSB7CgogICAgCWNvbnRhaW5lci5zZXEucHVzaCggdW5pZm9ybU9iamVjdCApOwogICAgCWNvbnRhaW5lci5tYXBbIHVuaWZvcm1PYmplY3QuaWQgXSA9IHVuaWZvcm1PYmplY3Q7CgogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVW5pZm9ybSggYWN0aXZlSW5mbywgYWRkciwgY29udGFpbmVyICkgewoKICAgIAl2YXIgcGF0aCA9IGFjdGl2ZUluZm8ubmFtZSwKICAgIAkJcGF0aExlbmd0aCA9IHBhdGgubGVuZ3RoOwoKICAgIAkvLyByZXNldCBSZWdFeHAgb2JqZWN0LCBiZWNhdXNlIG9mIHRoZSBlYXJseSBleGl0IG9mIGEgcHJldmlvdXMgcnVuCiAgICAJUmVQYXRoUGFydC5sYXN0SW5kZXggPSAwOwoKICAgIAl3aGlsZSAoIHRydWUgKSB7CgogICAgCQl2YXIgbWF0Y2ggPSBSZVBhdGhQYXJ0LmV4ZWMoIHBhdGggKSwKICAgIAkJCW1hdGNoRW5kID0gUmVQYXRoUGFydC5sYXN0SW5kZXgsCgogICAgCQkJaWQgPSBtYXRjaFsgMSBdLAogICAgCQkJaWRJc0luZGV4ID0gbWF0Y2hbIDIgXSA9PT0gJ10nLAogICAgCQkJc3Vic2NyaXB0ID0gbWF0Y2hbIDMgXTsKCiAgICAJCWlmICggaWRJc0luZGV4ICkgaWQgPSBpZCB8IDA7IC8vIGNvbnZlcnQgdG8gaW50ZWdlcgoKICAgIAkJaWYgKCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCB8fCBzdWJzY3JpcHQgPT09ICdbJyAmJiBtYXRjaEVuZCArIDIgPT09IHBhdGhMZW5ndGggKSB7CgogICAgCQkJLy8gYmFyZSBuYW1lIG9yICJwdXJlIiBib3R0b20tbGV2ZWwgYXJyYXkgIlswXSIgc3VmZml4CgogICAgCQkJYWRkVW5pZm9ybSggY29udGFpbmVyLCBzdWJzY3JpcHQgPT09IHVuZGVmaW5lZCA/CiAgICAJCQkJbmV3IFNpbmdsZVVuaWZvcm0oIGlkLCBhY3RpdmVJbmZvLCBhZGRyICkgOgogICAgCQkJCW5ldyBQdXJlQXJyYXlVbmlmb3JtKCBpZCwgYWN0aXZlSW5mbywgYWRkciApICk7CgogICAgCQkJYnJlYWs7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIHN0ZXAgaW50byBpbm5lciBub2RlIC8gY3JlYXRlIGl0IGluIGNhc2UgaXQgZG9lc24ndCBleGlzdAoKICAgIAkJCXZhciBtYXAgPSBjb250YWluZXIubWFwLCBuZXh0ID0gbWFwWyBpZCBdOwoKICAgIAkJCWlmICggbmV4dCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQluZXh0ID0gbmV3IFN0cnVjdHVyZWRVbmlmb3JtKCBpZCApOwogICAgCQkJCWFkZFVuaWZvcm0oIGNvbnRhaW5lciwgbmV4dCApOwoKICAgIAkJCX0KCiAgICAJCQljb250YWluZXIgPSBuZXh0OwoKICAgIAkJfQoKICAgIAl9CgogICAgfQoKICAgIC8vIFJvb3QgQ29udGFpbmVyCgogICAgZnVuY3Rpb24gV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0gKSB7CgogICAgCXRoaXMuc2VxID0gW107CiAgICAJdGhpcy5tYXAgPSB7fTsKCiAgICAJdmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcxOCApOwoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyArKyBpICkgewoKICAgIAkJdmFyIGluZm8gPSBnbC5nZXRBY3RpdmVVbmlmb3JtKCBwcm9ncmFtLCBpICksCiAgICAJCQlhZGRyID0gZ2wuZ2V0VW5pZm9ybUxvY2F0aW9uKCBwcm9ncmFtLCBpbmZvLm5hbWUgKTsKCiAgICAJCXBhcnNlVW5pZm9ybSggaW5mbywgYWRkciwgdGhpcyApOwoKICAgIAl9CgogICAgfQoKICAgIFdlYkdMVW5pZm9ybXMucHJvdG90eXBlLnNldFZhbHVlID0gZnVuY3Rpb24gKCBnbCwgbmFtZSwgdmFsdWUsIHRleHR1cmVzICkgewoKICAgIAl2YXIgdSA9IHRoaXMubWFwWyBuYW1lIF07CgogICAgCWlmICggdSAhPT0gdW5kZWZpbmVkICkgdS5zZXRWYWx1ZSggZ2wsIHZhbHVlLCB0ZXh0dXJlcyApOwoKICAgIH07CgogICAgV2ViR0xVbmlmb3Jtcy5wcm90b3R5cGUuc2V0T3B0aW9uYWwgPSBmdW5jdGlvbiAoIGdsLCBvYmplY3QsIG5hbWUgKSB7CgogICAgCXZhciB2ID0gb2JqZWN0WyBuYW1lIF07CgogICAgCWlmICggdiAhPT0gdW5kZWZpbmVkICkgdGhpcy5zZXRWYWx1ZSggZ2wsIG5hbWUsIHYgKTsKCiAgICB9OwoKCiAgICAvLyBTdGF0aWMgaW50ZXJmYWNlCgogICAgV2ViR0xVbmlmb3Jtcy51cGxvYWQgPSBmdW5jdGlvbiAoIGdsLCBzZXEsIHZhbHVlcywgdGV4dHVyZXMgKSB7CgogICAgCWZvciAoIHZhciBpID0gMCwgbiA9IHNlcS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQl2YXIgdSA9IHNlcVsgaSBdLAogICAgCQkJdiA9IHZhbHVlc1sgdS5pZCBdOwoKICAgIAkJaWYgKCB2Lm5lZWRzVXBkYXRlICE9PSBmYWxzZSApIHsKCiAgICAJCQkvLyBub3RlOiBhbHdheXMgdXBkYXRpbmcgd2hlbiAubmVlZHNVcGRhdGUgaXMgdW5kZWZpbmVkCiAgICAJCQl1LnNldFZhbHVlKCBnbCwgdi52YWx1ZSwgdGV4dHVyZXMgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH07CgogICAgV2ViR0xVbmlmb3Jtcy5zZXFXaXRoVmFsdWUgPSBmdW5jdGlvbiAoIHNlcSwgdmFsdWVzICkgewoKICAgIAl2YXIgciA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIG4gPSBzZXEubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJdmFyIHUgPSBzZXFbIGkgXTsKICAgIAkJaWYgKCB1LmlkIGluIHZhbHVlcyApIHIucHVzaCggdSApOwoKICAgIAl9CgogICAgCXJldHVybiByOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xTaGFkZXIoIGdsLCB0eXBlLCBzdHJpbmcgKSB7CgogICAgCXZhciBzaGFkZXIgPSBnbC5jcmVhdGVTaGFkZXIoIHR5cGUgKTsKCiAgICAJZ2wuc2hhZGVyU291cmNlKCBzaGFkZXIsIHN0cmluZyApOwogICAgCWdsLmNvbXBpbGVTaGFkZXIoIHNoYWRlciApOwoKICAgIAlyZXR1cm4gc2hhZGVyOwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICB2YXIgcHJvZ3JhbUlkQ291bnQgPSAwOwoKICAgIGZ1bmN0aW9uIGFkZExpbmVOdW1iZXJzKCBzdHJpbmcgKSB7CgogICAgCXZhciBsaW5lcyA9IHN0cmluZy5zcGxpdCggJ1xuJyApOwoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgPCBsaW5lcy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQlsaW5lc1sgaSBdID0gKCBpICsgMSApICsgJzogJyArIGxpbmVzWyBpIF07CgogICAgCX0KCiAgICAJcmV0dXJuIGxpbmVzLmpvaW4oICdcbicgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApIHsKCiAgICAJc3dpdGNoICggZW5jb2RpbmcgKSB7CgogICAgCQljYXNlIExpbmVhckVuY29kaW5nOgogICAgCQkJcmV0dXJuIFsgJ0xpbmVhcicsICcoIHZhbHVlICknIF07CiAgICAJCWNhc2Ugc1JHQkVuY29kaW5nOgogICAgCQkJcmV0dXJuIFsgJ3NSR0InLCAnKCB2YWx1ZSApJyBdOwogICAgCQljYXNlIFJHQkVFbmNvZGluZzoKICAgIAkJCXJldHVybiBbICdSR0JFJywgJyggdmFsdWUgKScgXTsKICAgIAkJY2FzZSBSR0JNN0VuY29kaW5nOgogICAgCQkJcmV0dXJuIFsgJ1JHQk0nLCAnKCB2YWx1ZSwgNy4wICknIF07CiAgICAJCWNhc2UgUkdCTTE2RW5jb2Rpbmc6CiAgICAJCQlyZXR1cm4gWyAnUkdCTScsICcoIHZhbHVlLCAxNi4wICknIF07CiAgICAJCWNhc2UgUkdCREVuY29kaW5nOgogICAgCQkJcmV0dXJuIFsgJ1JHQkQnLCAnKCB2YWx1ZSwgMjU2LjAgKScgXTsKICAgIAkJY2FzZSBHYW1tYUVuY29kaW5nOgogICAgCQkJcmV0dXJuIFsgJ0dhbW1hJywgJyggdmFsdWUsIGZsb2F0KCBHQU1NQV9GQUNUT1IgKSApJyBdOwogICAgCQljYXNlIExvZ0x1dkVuY29kaW5nOgogICAgCQkJcmV0dXJuIFsgJ0xvZ0x1dicsICcoIHZhbHVlICknIF07CiAgICAJCWRlZmF1bHQ6CiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoICd1bnN1cHBvcnRlZCBlbmNvZGluZzogJyArIGVuY29kaW5nICk7CgogICAgCX0KCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgc2hhZGVyLCB0eXBlICkgewoKICAgIAl2YXIgc3RhdHVzID0gZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKCBzaGFkZXIsIDM1NzEzICk7CiAgICAJdmFyIGxvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIHNoYWRlciApLnRyaW0oKTsKCiAgICAJaWYgKCBzdGF0dXMgJiYgbG9nID09PSAnJyApIHJldHVybiAnJzsKCiAgICAJLy8gLS1lbmFibGUtcHJpdmlsZWdlZC13ZWJnbC1leHRlbnNpb24KICAgIAkvLyBjb25zb2xlLmxvZyggJyoqJyArIHR5cGUgKyAnKionLCBnbC5nZXRFeHRlbnNpb24oICdXRUJHTF9kZWJ1Z19zaGFkZXJzJyApLmdldFRyYW5zbGF0ZWRTaGFkZXJTb3VyY2UoIHNoYWRlciApICk7CgogICAgCXZhciBzb3VyY2UgPSBnbC5nZXRTaGFkZXJTb3VyY2UoIHNoYWRlciApOwoKICAgIAlyZXR1cm4gJ1RIUkVFLldlYkdMU2hhZGVyOiBnbC5nZXRTaGFkZXJJbmZvTG9nKCkgJyArIHR5cGUgKyAnXG4nICsgbG9nICsgYWRkTGluZU51bWJlcnMoIHNvdXJjZSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgZW5jb2RpbmcgKSB7CgogICAgCXZhciBjb21wb25lbnRzID0gZ2V0RW5jb2RpbmdDb21wb25lbnRzKCBlbmNvZGluZyApOwogICAgCXJldHVybiAndmVjNCAnICsgZnVuY3Rpb25OYW1lICsgJyggdmVjNCB2YWx1ZSApIHsgcmV0dXJuICcgKyBjb21wb25lbnRzWyAwIF0gKyAnVG9MaW5lYXInICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7CgogICAgfQoKICAgIGZ1bmN0aW9uIGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggZnVuY3Rpb25OYW1lLCBlbmNvZGluZyApIHsKCiAgICAJdmFyIGNvbXBvbmVudHMgPSBnZXRFbmNvZGluZ0NvbXBvbmVudHMoIGVuY29kaW5nICk7CiAgICAJcmV0dXJuICd2ZWM0ICcgKyBmdW5jdGlvbk5hbWUgKyAnKCB2ZWM0IHZhbHVlICkgeyByZXR1cm4gTGluZWFyVG8nICsgY29tcG9uZW50c1sgMCBdICsgY29tcG9uZW50c1sgMSBdICsgJzsgfSc7CgogICAgfQoKICAgIGZ1bmN0aW9uIGdldFRvbmVNYXBwaW5nRnVuY3Rpb24oIGZ1bmN0aW9uTmFtZSwgdG9uZU1hcHBpbmcgKSB7CgogICAgCXZhciB0b25lTWFwcGluZ05hbWU7CgogICAgCXN3aXRjaCAoIHRvbmVNYXBwaW5nICkgewoKICAgIAkJY2FzZSBMaW5lYXJUb25lTWFwcGluZzoKICAgIAkJCXRvbmVNYXBwaW5nTmFtZSA9ICdMaW5lYXInOwogICAgCQkJYnJlYWs7CgogICAgCQljYXNlIFJlaW5oYXJkVG9uZU1hcHBpbmc6CiAgICAJCQl0b25lTWFwcGluZ05hbWUgPSAnUmVpbmhhcmQnOwogICAgCQkJYnJlYWs7CgogICAgCQljYXNlIFVuY2hhcnRlZDJUb25lTWFwcGluZzoKICAgIAkJCXRvbmVNYXBwaW5nTmFtZSA9ICdVbmNoYXJ0ZWQyJzsKICAgIAkJCWJyZWFrOwoKICAgIAkJY2FzZSBDaW5lb25Ub25lTWFwcGluZzoKICAgIAkJCXRvbmVNYXBwaW5nTmFtZSA9ICdPcHRpbWl6ZWRDaW5lb24nOwogICAgCQkJYnJlYWs7CgogICAgCQljYXNlIEFDRVNGaWxtaWNUb25lTWFwcGluZzoKICAgIAkJCXRvbmVNYXBwaW5nTmFtZSA9ICdBQ0VTRmlsbWljJzsKICAgIAkJCWJyZWFrOwoKICAgIAkJZGVmYXVsdDoKICAgIAkJCXRocm93IG5ldyBFcnJvciggJ3Vuc3VwcG9ydGVkIHRvbmVNYXBwaW5nOiAnICsgdG9uZU1hcHBpbmcgKTsKCiAgICAJfQoKICAgIAlyZXR1cm4gJ3ZlYzMgJyArIGZ1bmN0aW9uTmFtZSArICcoIHZlYzMgY29sb3IgKSB7IHJldHVybiAnICsgdG9uZU1hcHBpbmdOYW1lICsgJ1RvbmVNYXBwaW5nKCBjb2xvciApOyB9JzsKCiAgICB9CgogICAgZnVuY3Rpb24gZ2VuZXJhdGVFeHRlbnNpb25zKCBleHRlbnNpb25zLCBwYXJhbWV0ZXJzLCByZW5kZXJlckV4dGVuc2lvbnMgKSB7CgogICAgCWV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IHt9OwoKICAgIAl2YXIgY2h1bmtzID0gWwogICAgCQkoIGV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMgfHwgcGFyYW1ldGVycy5lbnZNYXBDdWJlVVYgfHwgcGFyYW1ldGVycy5idW1wTWFwIHx8IHBhcmFtZXRlcnMudGFuZ2VudFNwYWNlTm9ybWFsTWFwIHx8IHBhcmFtZXRlcnMuY2xlYXJjb2F0Tm9ybWFsTWFwIHx8IHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgKSA/ICcjZXh0ZW5zaW9uIEdMX09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcyA6IGVuYWJsZScgOiAnJywKICAgIAkJKCBleHRlbnNpb25zLmZyYWdEZXB0aCB8fCBwYXJhbWV0ZXJzLmxvZ2FyaXRobWljRGVwdGhCdWZmZXIgKSAmJiByZW5kZXJlckV4dGVuc2lvbnMuZ2V0KCAnRVhUX2ZyYWdfZGVwdGgnICkgPyAnI2V4dGVuc2lvbiBHTF9FWFRfZnJhZ19kZXB0aCA6IGVuYWJsZScgOiAnJywKICAgIAkJKCBleHRlbnNpb25zLmRyYXdCdWZmZXJzICkgJiYgcmVuZGVyZXJFeHRlbnNpb25zLmdldCggJ1dFQkdMX2RyYXdfYnVmZmVycycgKSA/ICcjZXh0ZW5zaW9uIEdMX0VYVF9kcmF3X2J1ZmZlcnMgOiByZXF1aXJlJyA6ICcnLAogICAgCQkoIGV4dGVuc2lvbnMuc2hhZGVyVGV4dHVyZUxPRCB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmIHJlbmRlcmVyRXh0ZW5zaW9ucy5nZXQoICdFWFRfc2hhZGVyX3RleHR1cmVfbG9kJyApID8gJyNleHRlbnNpb24gR0xfRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCA6IGVuYWJsZScgOiAnJwogICAgCV07CgogICAgCXJldHVybiBjaHVua3MuZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXG4nICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIGdlbmVyYXRlRGVmaW5lcyggZGVmaW5lcyApIHsKCiAgICAJdmFyIGNodW5rcyA9IFtdOwoKICAgIAlmb3IgKCB2YXIgbmFtZSBpbiBkZWZpbmVzICkgewoKICAgIAkJdmFyIHZhbHVlID0gZGVmaW5lc1sgbmFtZSBdOwoKICAgIAkJaWYgKCB2YWx1ZSA9PT0gZmFsc2UgKSBjb250aW51ZTsKCiAgICAJCWNodW5rcy5wdXNoKCAnI2RlZmluZSAnICsgbmFtZSArICcgJyArIHZhbHVlICk7CgogICAgCX0KCiAgICAJcmV0dXJuIGNodW5rcy5qb2luKCAnXG4nICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIGZldGNoQXR0cmlidXRlTG9jYXRpb25zKCBnbCwgcHJvZ3JhbSApIHsKCiAgICAJdmFyIGF0dHJpYnV0ZXMgPSB7fTsKCiAgICAJdmFyIG4gPSBnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKCBwcm9ncmFtLCAzNTcyMSApOwoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgPCBuOyBpICsrICkgewoKICAgIAkJdmFyIGluZm8gPSBnbC5nZXRBY3RpdmVBdHRyaWIoIHByb2dyYW0sIGkgKTsKICAgIAkJdmFyIG5hbWUgPSBpbmZvLm5hbWU7CgogICAgCQkvLyBjb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUHJvZ3JhbTogQUNUSVZFIFZFUlRFWCBBVFRSSUJVVEU6JywgbmFtZSwgaSApOwoKICAgIAkJYXR0cmlidXRlc1sgbmFtZSBdID0gZ2wuZ2V0QXR0cmliTG9jYXRpb24oIHByb2dyYW0sIG5hbWUgKTsKCiAgICAJfQoKICAgIAlyZXR1cm4gYXR0cmlidXRlczsKCiAgICB9CgogICAgZnVuY3Rpb24gZmlsdGVyRW1wdHlMaW5lKCBzdHJpbmcgKSB7CgogICAgCXJldHVybiBzdHJpbmcgIT09ICcnOwoKICAgIH0KCiAgICBmdW5jdGlvbiByZXBsYWNlTGlnaHROdW1zKCBzdHJpbmcsIHBhcmFtZXRlcnMgKSB7CgogICAgCXJldHVybiBzdHJpbmcKICAgIAkJLnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bURpckxpZ2h0cyApCiAgICAJCS5yZXBsYWNlKCAvTlVNX1NQT1RfTElHSFRTL2csIHBhcmFtZXRlcnMubnVtU3BvdExpZ2h0cyApCiAgICAJCS5yZXBsYWNlKCAvTlVNX1JFQ1RfQVJFQV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1SZWN0QXJlYUxpZ2h0cyApCiAgICAJCS5yZXBsYWNlKCAvTlVNX1BPSU5UX0xJR0hUUy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRzICkKICAgIAkJLnJlcGxhY2UoIC9OVU1fSEVNSV9MSUdIVFMvZywgcGFyYW1ldGVycy5udW1IZW1pTGlnaHRzICkKICAgIAkJLnJlcGxhY2UoIC9OVU1fRElSX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1EaXJMaWdodFNoYWRvd3MgKQogICAgCQkucmVwbGFjZSggL05VTV9TUE9UX0xJR0hUX1NIQURPV1MvZywgcGFyYW1ldGVycy5udW1TcG90TGlnaHRTaGFkb3dzICkKICAgIAkJLnJlcGxhY2UoIC9OVU1fUE9JTlRfTElHSFRfU0hBRE9XUy9nLCBwYXJhbWV0ZXJzLm51bVBvaW50TGlnaHRTaGFkb3dzICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggc3RyaW5nLCBwYXJhbWV0ZXJzICkgewoKICAgIAlyZXR1cm4gc3RyaW5nCiAgICAJCS5yZXBsYWNlKCAvTlVNX0NMSVBQSU5HX1BMQU5FUy9nLCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzICkKICAgIAkJLnJlcGxhY2UoIC9VTklPTl9DTElQUElOR19QTEFORVMvZywgKCBwYXJhbWV0ZXJzLm51bUNsaXBwaW5nUGxhbmVzIC0gcGFyYW1ldGVycy5udW1DbGlwSW50ZXJzZWN0aW9uICkgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gcGFyc2VJbmNsdWRlcyggc3RyaW5nICkgewoKICAgIAl2YXIgcGF0dGVybiA9IC9eWyBcdF0qI2luY2x1ZGUgKzwoW1x3XGQuL10rKT4vZ207CgogICAgCWZ1bmN0aW9uIHJlcGxhY2UoIG1hdGNoLCBpbmNsdWRlICkgewoKICAgIAkJdmFyIHJlcGxhY2UgPSBTaGFkZXJDaHVua1sgaW5jbHVkZSBdOwoKICAgIAkJaWYgKCByZXBsYWNlID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJdGhyb3cgbmV3IEVycm9yKCAnQ2FuIG5vdCByZXNvbHZlICNpbmNsdWRlIDwnICsgaW5jbHVkZSArICc+JyApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHBhcnNlSW5jbHVkZXMoIHJlcGxhY2UgKTsKCiAgICAJfQoKICAgIAlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gdW5yb2xsTG9vcHMoIHN0cmluZyApIHsKCiAgICAJdmFyIHBhdHRlcm4gPSAvI3ByYWdtYSB1bnJvbGxfbG9vcFtcc10rP2ZvciBcKCBpbnQgaSBcPSAoXGQrKVw7IGkgPCAoXGQrKVw7IGkgXCtcKyBcKSBceyhbXHNcU10rPykoPz1cfSlcfS9nOwoKICAgIAlmdW5jdGlvbiByZXBsYWNlKCBtYXRjaCwgc3RhcnQsIGVuZCwgc25pcHBldCApIHsKCiAgICAJCXZhciB1bnJvbGwgPSAnJzsKCiAgICAJCWZvciAoIHZhciBpID0gcGFyc2VJbnQoIHN0YXJ0ICk7IGkgPCBwYXJzZUludCggZW5kICk7IGkgKysgKSB7CgogICAgCQkJdW5yb2xsICs9IHNuaXBwZXQKICAgIAkJCQkucmVwbGFjZSggL1xbIGkgXF0vZywgJ1sgJyArIGkgKyAnIF0nICkKICAgIAkJCQkucmVwbGFjZSggL1VOUk9MTEVEX0xPT1BfSU5ERVgvZywgaSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHVucm9sbDsKCiAgICAJfQoKICAgIAlyZXR1cm4gc3RyaW5nLnJlcGxhY2UoIHBhdHRlcm4sIHJlcGxhY2UgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gV2ViR0xQcm9ncmFtKCByZW5kZXJlciwgZXh0ZW5zaW9ucywgY29kZSwgbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycywgY2FwYWJpbGl0aWVzICkgewoKICAgIAl2YXIgZ2wgPSByZW5kZXJlci5nZXRDb250ZXh0KCk7CgogICAgCXZhciBkZWZpbmVzID0gbWF0ZXJpYWwuZGVmaW5lczsKCiAgICAJdmFyIHZlcnRleFNoYWRlciA9IHNoYWRlci52ZXJ0ZXhTaGFkZXI7CiAgICAJdmFyIGZyYWdtZW50U2hhZGVyID0gc2hhZGVyLmZyYWdtZW50U2hhZGVyOwoKICAgIAl2YXIgc2hhZG93TWFwVHlwZURlZmluZSA9ICdTSEFET1dNQVBfVFlQRV9CQVNJQyc7CgogICAgCWlmICggcGFyYW1ldGVycy5zaGFkb3dNYXBUeXBlID09PSBQQ0ZTaGFkb3dNYXAgKSB7CgogICAgCQlzaGFkb3dNYXBUeXBlRGVmaW5lID0gJ1NIQURPV01BUF9UWVBFX1BDRic7CgogICAgCX0gZWxzZSBpZiAoIHBhcmFtZXRlcnMuc2hhZG93TWFwVHlwZSA9PT0gUENGU29mdFNoYWRvd01hcCApIHsKCiAgICAJCXNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfUENGX1NPRlQnOwoKICAgIAl9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRvd01hcFR5cGUgPT09IFZTTVNoYWRvd01hcCApIHsKCiAgICAJCXNoYWRvd01hcFR5cGVEZWZpbmUgPSAnU0hBRE9XTUFQX1RZUEVfVlNNJzsKCiAgICAJfQoKICAgIAl2YXIgZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJzsKICAgIAl2YXIgZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZMRUNUSU9OJzsKICAgIAl2YXIgZW52TWFwQmxlbmRpbmdEZWZpbmUgPSAnRU5WTUFQX0JMRU5ESU5HX01VTFRJUExZJzsKCiAgICAJaWYgKCBwYXJhbWV0ZXJzLmVudk1hcCApIHsKCiAgICAJCXN3aXRjaCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nICkgewoKICAgIAkJCWNhc2UgQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOgogICAgCQkJY2FzZSBDdWJlUmVmcmFjdGlvbk1hcHBpbmc6CiAgICAJCQkJZW52TWFwVHlwZURlZmluZSA9ICdFTlZNQVBfVFlQRV9DVUJFJzsKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nOgogICAgCQkJY2FzZSBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZzoKICAgIAkJCQllbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX0NVQkVfVVYnOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6CiAgICAJCQljYXNlIEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOgogICAgCQkJCWVudk1hcFR5cGVEZWZpbmUgPSAnRU5WTUFQX1RZUEVfRVFVSVJFQyc7CiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSBTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzoKICAgIAkJCQllbnZNYXBUeXBlRGVmaW5lID0gJ0VOVk1BUF9UWVBFX1NQSEVSRSc7CiAgICAJCQkJYnJlYWs7CgogICAgCQl9CgogICAgCQlzd2l0Y2ggKCBtYXRlcmlhbC5lbnZNYXAubWFwcGluZyApIHsKCiAgICAJCQljYXNlIEN1YmVSZWZyYWN0aW9uTWFwcGluZzoKICAgIAkJCWNhc2UgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6CiAgICAJCQkJZW52TWFwTW9kZURlZmluZSA9ICdFTlZNQVBfTU9ERV9SRUZSQUNUSU9OJzsKICAgIAkJCQlicmVhazsKCiAgICAJCX0KCiAgICAJCXN3aXRjaCAoIG1hdGVyaWFsLmNvbWJpbmUgKSB7CgogICAgCQkJY2FzZSBNdWx0aXBseU9wZXJhdGlvbjoKICAgIAkJCQllbnZNYXBCbGVuZGluZ0RlZmluZSA9ICdFTlZNQVBfQkxFTkRJTkdfTVVMVElQTFknOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgTWl4T3BlcmF0aW9uOgogICAgCQkJCWVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19NSVgnOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgQWRkT3BlcmF0aW9uOgogICAgCQkJCWVudk1hcEJsZW5kaW5nRGVmaW5lID0gJ0VOVk1BUF9CTEVORElOR19BREQnOwogICAgCQkJCWJyZWFrOwoKICAgIAkJfQoKICAgIAl9CgogICAgCXZhciBnYW1tYUZhY3RvckRlZmluZSA9ICggcmVuZGVyZXIuZ2FtbWFGYWN0b3IgPiAwICkgPyByZW5kZXJlci5nYW1tYUZhY3RvciA6IDEuMDsKCiAgICAJLy8gY29uc29sZS5sb2coICdidWlsZGluZyBuZXcgcHJvZ3JhbSAnICk7CgogICAgCS8vCgogICAgCXZhciBjdXN0b21FeHRlbnNpb25zID0gY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJycgOiBnZW5lcmF0ZUV4dGVuc2lvbnMoIG1hdGVyaWFsLmV4dGVuc2lvbnMsIHBhcmFtZXRlcnMsIGV4dGVuc2lvbnMgKTsKCiAgICAJdmFyIGN1c3RvbURlZmluZXMgPSBnZW5lcmF0ZURlZmluZXMoIGRlZmluZXMgKTsKCiAgICAJLy8KCiAgICAJdmFyIHByb2dyYW0gPSBnbC5jcmVhdGVQcm9ncmFtKCk7CgogICAgCXZhciBwcmVmaXhWZXJ0ZXgsIHByZWZpeEZyYWdtZW50OwoKICAgIAlpZiAoIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgKSB7CgogICAgCQlwcmVmaXhWZXJ0ZXggPSBbCgogICAgCQkJY3VzdG9tRGVmaW5lcwoKICAgIAkJXS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKCiAgICAJCWlmICggcHJlZml4VmVydGV4Lmxlbmd0aCA+IDAgKSB7CgogICAgCQkJcHJlZml4VmVydGV4ICs9ICdcbic7CgogICAgCQl9CgogICAgCQlwcmVmaXhGcmFnbWVudCA9IFsKCiAgICAJCQljdXN0b21FeHRlbnNpb25zLAogICAgCQkJY3VzdG9tRGVmaW5lcwoKICAgIAkJXS5maWx0ZXIoIGZpbHRlckVtcHR5TGluZSApLmpvaW4oICdcbicgKTsKCiAgICAJCWlmICggcHJlZml4RnJhZ21lbnQubGVuZ3RoID4gMCApIHsKCiAgICAJCQlwcmVmaXhGcmFnbWVudCArPSAnXG4nOwoKICAgIAkJfQoKICAgIAl9IGVsc2UgewoKICAgIAkJcHJlZml4VmVydGV4ID0gWwoKICAgIAkJCSdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLAogICAgCQkJJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLAoKICAgIAkJCSggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdoaWdocCcgKSA/ICcjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OJyA6ICcnLAoKICAgIAkJCScjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSwKCiAgICAJCQljdXN0b21EZWZpbmVzLAoKICAgIAkJCXBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFZFUlRFWF9URVhUVVJFUycgOiAnJywKCiAgICAJCQknI2RlZmluZSBHQU1NQV9GQUNUT1IgJyArIGdhbW1hRmFjdG9yRGVmaW5lLAoKICAgIAkJCScjZGVmaW5lIE1BWF9CT05FUyAnICsgcGFyYW1ldGVycy5tYXhCb25lcywKICAgIAkJCSggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2cgKSA/ICcjZGVmaW5lIFVTRV9GT0cnIDogJycsCiAgICAJCQkoIHBhcmFtZXRlcnMudXNlRm9nICYmIHBhcmFtZXRlcnMuZm9nRXhwMiApID8gJyNkZWZpbmUgRk9HX0VYUDInIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5tYXAgPyAnI2RlZmluZSBVU0VfTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSBVU0VfRU5WTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5lbnZNYXAgPyAnI2RlZmluZSAnICsgZW52TWFwTW9kZURlZmluZSA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsCiAgICAJCQkoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJywKICAgIAkJCSggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5jbGVhcmNvYXROb3JtYWxNYXAgPyAnI2RlZmluZSBVU0VfQ0xFQVJDT0FUX05PUk1BTE1BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuZGlzcGxhY2VtZW50TWFwICYmIHBhcmFtZXRlcnMuc3VwcG9ydHNWZXJ0ZXhUZXh0dXJlcyA/ICcjZGVmaW5lIFVTRV9ESVNQTEFDRU1FTlRNQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLnNwZWN1bGFyTWFwID8gJyNkZWZpbmUgVVNFX1NQRUNVTEFSTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5yb3VnaG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfUk9VR0hORVNTTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5tZXRhbG5lc3NNYXAgPyAnI2RlZmluZSBVU0VfTUVUQUxORVNTTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5hbHBoYU1hcCA/ICcjZGVmaW5lIFVTRV9BTFBIQU1BUCcgOiAnJywKCiAgICAJCQlwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMudmVydGV4VXZzID8gJyNkZWZpbmUgVVNFX1VWJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPyAnI2RlZmluZSBGTEFUX1NIQURFRCcgOiAnJywKCiAgICAJCQlwYXJhbWV0ZXJzLnNraW5uaW5nID8gJyNkZWZpbmUgVVNFX1NLSU5OSU5HJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy51c2VWZXJ0ZXhUZXh0dXJlID8gJyNkZWZpbmUgQk9ORV9URVhUVVJFJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMubW9ycGhUYXJnZXRzID8gJyNkZWZpbmUgVVNFX01PUlBIVEFSR0VUUycgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMubW9ycGhOb3JtYWxzICYmIHBhcmFtZXRlcnMuZmxhdFNoYWRpbmcgPT09IGZhbHNlID8gJyNkZWZpbmUgVVNFX01PUlBITk9STUFMUycgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5zaXplQXR0ZW51YXRpb24gPyAnI2RlZmluZSBVU0VfU0laRUFUVEVOVUFUSU9OJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLAoKICAgIAkJCSd1bmlmb3JtIG1hdDQgbW9kZWxNYXRyaXg7JywKICAgIAkJCSd1bmlmb3JtIG1hdDQgbW9kZWxWaWV3TWF0cml4OycsCiAgICAJCQkndW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7JywKICAgIAkJCSd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLAogICAgCQkJJ3VuaWZvcm0gbWF0MyBub3JtYWxNYXRyaXg7JywKICAgIAkJCSd1bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247JywKCiAgICAJCQknYXR0cmlidXRlIHZlYzMgcG9zaXRpb247JywKICAgIAkJCSdhdHRyaWJ1dGUgdmVjMyBub3JtYWw7JywKICAgIAkJCSdhdHRyaWJ1dGUgdmVjMiB1djsnLAoKICAgIAkJCScjaWZkZWYgVVNFX1RBTkdFTlQnLAoKICAgIAkJCScJYXR0cmlidXRlIHZlYzQgdGFuZ2VudDsnLAoKICAgIAkJCScjZW5kaWYnLAoKICAgIAkJCScjaWZkZWYgVVNFX0NPTE9SJywKCiAgICAJCQknCWF0dHJpYnV0ZSB2ZWMzIGNvbG9yOycsCgogICAgCQkJJyNlbmRpZicsCgogICAgCQkJJyNpZmRlZiBVU0VfTU9SUEhUQVJHRVRTJywKCiAgICAJCQknCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MDsnLAogICAgCQkJJwlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDE7JywKICAgIAkJCScJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQyOycsCiAgICAJCQknCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0MzsnLAoKICAgIAkJCScJI2lmZGVmIFVTRV9NT1JQSE5PUk1BTFMnLAoKICAgIAkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMDsnLAogICAgCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhOb3JtYWwxOycsCiAgICAJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaE5vcm1hbDI7JywKICAgIAkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoTm9ybWFsMzsnLAoKICAgIAkJCScJI2Vsc2UnLAoKICAgIAkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NDsnLAogICAgCQkJJwkJYXR0cmlidXRlIHZlYzMgbW9ycGhUYXJnZXQ1OycsCiAgICAJCQknCQlhdHRyaWJ1dGUgdmVjMyBtb3JwaFRhcmdldDY7JywKICAgIAkJCScJCWF0dHJpYnV0ZSB2ZWMzIG1vcnBoVGFyZ2V0NzsnLAoKICAgIAkJCScJI2VuZGlmJywKCiAgICAJCQknI2VuZGlmJywKCiAgICAJCQknI2lmZGVmIFVTRV9TS0lOTklORycsCgogICAgCQkJJwlhdHRyaWJ1dGUgdmVjNCBza2luSW5kZXg7JywKICAgIAkJCScJYXR0cmlidXRlIHZlYzQgc2tpbldlaWdodDsnLAoKICAgIAkJCScjZW5kaWYnLAoKICAgIAkJCSdcbicKCiAgICAJCV0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXG4nICk7CgogICAgCQlwcmVmaXhGcmFnbWVudCA9IFsKCiAgICAJCQljdXN0b21FeHRlbnNpb25zLAoKICAgIAkJCSdwcmVjaXNpb24gJyArIHBhcmFtZXRlcnMucHJlY2lzaW9uICsgJyBmbG9hdDsnLAogICAgCQkJJ3ByZWNpc2lvbiAnICsgcGFyYW1ldGVycy5wcmVjaXNpb24gKyAnIGludDsnLAoKICAgIAkJCSggcGFyYW1ldGVycy5wcmVjaXNpb24gPT09ICdoaWdocCcgKSA/ICcjZGVmaW5lIEhJR0hfUFJFQ0lTSU9OJyA6ICcnLAoKICAgIAkJCScjZGVmaW5lIFNIQURFUl9OQU1FICcgKyBzaGFkZXIubmFtZSwKCiAgICAJCQljdXN0b21EZWZpbmVzLAoKICAgIAkJCXBhcmFtZXRlcnMuYWxwaGFUZXN0ID8gJyNkZWZpbmUgQUxQSEFURVNUICcgKyBwYXJhbWV0ZXJzLmFscGhhVGVzdCArICggcGFyYW1ldGVycy5hbHBoYVRlc3QgJSAxID8gJycgOiAnLjAnICkgOiAnJywgLy8gYWRkICcuMCcgaWYgaW50ZWdlcgoKICAgIAkJCScjZGVmaW5lIEdBTU1BX0ZBQ1RPUiAnICsgZ2FtbWFGYWN0b3JEZWZpbmUsCgogICAgCQkJKCBwYXJhbWV0ZXJzLnVzZUZvZyAmJiBwYXJhbWV0ZXJzLmZvZyApID8gJyNkZWZpbmUgVVNFX0ZPRycgOiAnJywKICAgIAkJCSggcGFyYW1ldGVycy51c2VGb2cgJiYgcGFyYW1ldGVycy5mb2dFeHAyICkgPyAnI2RlZmluZSBGT0dfRVhQMicgOiAnJywKCiAgICAJCQlwYXJhbWV0ZXJzLm1hcCA/ICcjZGVmaW5lIFVTRV9NQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLm1hdGNhcCA/ICcjZGVmaW5lIFVTRV9NQVRDQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lIFVTRV9FTlZNQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBUeXBlRGVmaW5lIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBNb2RlRGVmaW5lIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVudk1hcCA/ICcjZGVmaW5lICcgKyBlbnZNYXBCbGVuZGluZ0RlZmluZSA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5saWdodE1hcCA/ICcjZGVmaW5lIFVTRV9MSUdIVE1BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuYW9NYXAgPyAnI2RlZmluZSBVU0VfQU9NQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwID8gJyNkZWZpbmUgVVNFX0VNSVNTSVZFTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5idW1wTWFwID8gJyNkZWZpbmUgVVNFX0JVTVBNQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLm5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9OT1JNQUxNQVAnIDogJycsCiAgICAJCQkoIHBhcmFtZXRlcnMubm9ybWFsTWFwICYmIHBhcmFtZXRlcnMub2JqZWN0U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIE9CSkVDVFNQQUNFX05PUk1BTE1BUCcgOiAnJywKICAgIAkJCSggcGFyYW1ldGVycy5ub3JtYWxNYXAgJiYgcGFyYW1ldGVycy50YW5nZW50U3BhY2VOb3JtYWxNYXAgKSA/ICcjZGVmaW5lIFRBTkdFTlRTUEFDRV9OT1JNQUxNQVAnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmNsZWFyY29hdE5vcm1hbE1hcCA/ICcjZGVmaW5lIFVTRV9DTEVBUkNPQVRfTk9STUFMTUFQJyA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5zcGVjdWxhck1hcCA/ICcjZGVmaW5lIFVTRV9TUEVDVUxBUk1BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMucm91Z2huZXNzTWFwID8gJyNkZWZpbmUgVVNFX1JPVUdITkVTU01BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMubWV0YWxuZXNzTWFwID8gJyNkZWZpbmUgVVNFX01FVEFMTkVTU01BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuYWxwaGFNYXAgPyAnI2RlZmluZSBVU0VfQUxQSEFNQVAnIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5zaGVlbiA/ICcjZGVmaW5lIFVTRV9TSEVFTicgOiAnJywKCiAgICAJCQlwYXJhbWV0ZXJzLnZlcnRleFRhbmdlbnRzID8gJyNkZWZpbmUgVVNFX1RBTkdFTlQnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLnZlcnRleENvbG9ycyA/ICcjZGVmaW5lIFVTRV9DT0xPUicgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMudmVydGV4VXZzID8gJyNkZWZpbmUgVVNFX1VWJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMuZ3JhZGllbnRNYXAgPyAnI2RlZmluZSBVU0VfR1JBRElFTlRNQVAnIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5mbGF0U2hhZGluZyA/ICcjZGVmaW5lIEZMQVRfU0hBREVEJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMuZG91YmxlU2lkZWQgPyAnI2RlZmluZSBET1VCTEVfU0lERUQnIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmZsaXBTaWRlZCA/ICcjZGVmaW5lIEZMSVBfU0lERUQnIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5zaGFkb3dNYXBFbmFibGVkID8gJyNkZWZpbmUgVVNFX1NIQURPV01BUCcgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuc2hhZG93TWFwRW5hYmxlZCA/ICcjZGVmaW5lICcgKyBzaGFkb3dNYXBUeXBlRGVmaW5lIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgPyAnI2RlZmluZSBQUkVNVUxUSVBMSUVEX0FMUEhBJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMucGh5c2ljYWxseUNvcnJlY3RMaWdodHMgPyAnI2RlZmluZSBQSFlTSUNBTExZX0NPUlJFQ1RfTElHSFRTJyA6ICcnLAoKICAgIAkJCXBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciA/ICcjZGVmaW5lIFVTRV9MT0dERVBUSEJVRicgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ0VYVF9mcmFnX2RlcHRoJyApICkgPyAnI2RlZmluZSBVU0VfTE9HREVQVEhCVUZfRVhUJyA6ICcnLAoKICAgIAkJCSggKCBtYXRlcmlhbC5leHRlbnNpb25zID8gbWF0ZXJpYWwuZXh0ZW5zaW9ucy5zaGFkZXJUZXh0dXJlTE9EIDogZmFsc2UgKSB8fCBwYXJhbWV0ZXJzLmVudk1hcCApICYmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyIHx8IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX3NoYWRlcl90ZXh0dXJlX2xvZCcgKSApID8gJyNkZWZpbmUgVEVYVFVSRV9MT0RfRVhUJyA6ICcnLAoKICAgIAkJCSd1bmlmb3JtIG1hdDQgdmlld01hdHJpeDsnLAogICAgCQkJJ3VuaWZvcm0gdmVjMyBjYW1lcmFQb3NpdGlvbjsnLAoKICAgIAkJCSggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gJyNkZWZpbmUgVE9ORV9NQVBQSU5HJyA6ICcnLAogICAgCQkJKCBwYXJhbWV0ZXJzLnRvbmVNYXBwaW5nICE9PSBOb1RvbmVNYXBwaW5nICkgPyBTaGFkZXJDaHVua1sgJ3RvbmVtYXBwaW5nX3BhcnNfZnJhZ21lbnQnIF0gOiAnJywgLy8gdGhpcyBjb2RlIGlzIHJlcXVpcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGJ5IHRoZSB0b25lTWFwcGluZygpIGZ1bmN0aW9uIGRlZmluZWQgYmVsb3cKICAgIAkJCSggcGFyYW1ldGVycy50b25lTWFwcGluZyAhPT0gTm9Ub25lTWFwcGluZyApID8gZ2V0VG9uZU1hcHBpbmdGdW5jdGlvbiggJ3RvbmVNYXBwaW5nJywgcGFyYW1ldGVycy50b25lTWFwcGluZyApIDogJycsCgogICAgCQkJcGFyYW1ldGVycy5kaXRoZXJpbmcgPyAnI2RlZmluZSBESVRIRVJJTkcnIDogJycsCgogICAgCQkJKCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nIHx8IHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgfHwgcGFyYW1ldGVycy5tYXRjYXBFbmNvZGluZyB8fCBwYXJhbWV0ZXJzLmVudk1hcEVuY29kaW5nIHx8IHBhcmFtZXRlcnMuZW1pc3NpdmVNYXBFbmNvZGluZyApID8KICAgIAkJCQlTaGFkZXJDaHVua1sgJ2VuY29kaW5nc19wYXJzX2ZyYWdtZW50JyBdIDogJycsIC8vIHRoaXMgY29kZSBpcyByZXF1aXJlZCBoZXJlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSB0aGUgdmFyaW91cyBlbmNvZGluZy9kZWNvZGluZyBmdW5jdGlvbiBkZWZpbmVkIGJlbG93CiAgICAJCQlwYXJhbWV0ZXJzLm1hcEVuY29kaW5nID8gZ2V0VGV4ZWxEZWNvZGluZ0Z1bmN0aW9uKCAnbWFwVGV4ZWxUb0xpbmVhcicsIHBhcmFtZXRlcnMubWFwRW5jb2RpbmcgKSA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5tYXRjYXBFbmNvZGluZyA/IGdldFRleGVsRGVjb2RpbmdGdW5jdGlvbiggJ21hdGNhcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLm1hdGNhcEVuY29kaW5nICkgOiAnJywKICAgIAkJCXBhcmFtZXRlcnMuZW52TWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbnZNYXBUZXhlbFRvTGluZWFyJywgcGFyYW1ldGVycy5lbnZNYXBFbmNvZGluZyApIDogJycsCiAgICAJCQlwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgPyBnZXRUZXhlbERlY29kaW5nRnVuY3Rpb24oICdlbWlzc2l2ZU1hcFRleGVsVG9MaW5lYXInLCBwYXJhbWV0ZXJzLmVtaXNzaXZlTWFwRW5jb2RpbmcgKSA6ICcnLAogICAgCQkJcGFyYW1ldGVycy5vdXRwdXRFbmNvZGluZyA/IGdldFRleGVsRW5jb2RpbmdGdW5jdGlvbiggJ2xpbmVhclRvT3V0cHV0VGV4ZWwnLCBwYXJhbWV0ZXJzLm91dHB1dEVuY29kaW5nICkgOiAnJywKCiAgICAJCQlwYXJhbWV0ZXJzLmRlcHRoUGFja2luZyA/ICcjZGVmaW5lIERFUFRIX1BBQ0tJTkcgJyArIG1hdGVyaWFsLmRlcHRoUGFja2luZyA6ICcnLAoKICAgIAkJCSdcbicKCiAgICAJCV0uZmlsdGVyKCBmaWx0ZXJFbXB0eUxpbmUgKS5qb2luKCAnXG4nICk7CgogICAgCX0KCiAgICAJdmVydGV4U2hhZGVyID0gcGFyc2VJbmNsdWRlcyggdmVydGV4U2hhZGVyICk7CiAgICAJdmVydGV4U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggdmVydGV4U2hhZGVyLCBwYXJhbWV0ZXJzICk7CiAgICAJdmVydGV4U2hhZGVyID0gcmVwbGFjZUNsaXBwaW5nUGxhbmVOdW1zKCB2ZXJ0ZXhTaGFkZXIsIHBhcmFtZXRlcnMgKTsKCiAgICAJZnJhZ21lbnRTaGFkZXIgPSBwYXJzZUluY2x1ZGVzKCBmcmFnbWVudFNoYWRlciApOwogICAgCWZyYWdtZW50U2hhZGVyID0gcmVwbGFjZUxpZ2h0TnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTsKICAgIAlmcmFnbWVudFNoYWRlciA9IHJlcGxhY2VDbGlwcGluZ1BsYW5lTnVtcyggZnJhZ21lbnRTaGFkZXIsIHBhcmFtZXRlcnMgKTsKCiAgICAJdmVydGV4U2hhZGVyID0gdW5yb2xsTG9vcHMoIHZlcnRleFNoYWRlciApOwogICAgCWZyYWdtZW50U2hhZGVyID0gdW5yb2xsTG9vcHMoIGZyYWdtZW50U2hhZGVyICk7CgogICAgCWlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICYmICEgbWF0ZXJpYWwuaXNSYXdTaGFkZXJNYXRlcmlhbCApIHsKCiAgICAJCXZhciBpc0dMU0wzU2hhZGVyTWF0ZXJpYWwgPSBmYWxzZTsKCiAgICAJCXZhciB2ZXJzaW9uUmVnZXggPSAvXlxzKiN2ZXJzaW9uXHMrMzAwXHMrZXNccypcbi87CgogICAgCQlpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYKICAgIAkJCXZlcnRleFNoYWRlci5tYXRjaCggdmVyc2lvblJlZ2V4ICkgIT09IG51bGwgJiYKICAgIAkJCWZyYWdtZW50U2hhZGVyLm1hdGNoKCB2ZXJzaW9uUmVnZXggKSAhPT0gbnVsbCApIHsKCiAgICAJCQlpc0dMU0wzU2hhZGVyTWF0ZXJpYWwgPSB0cnVlOwoKICAgIAkJCXZlcnRleFNoYWRlciA9IHZlcnRleFNoYWRlci5yZXBsYWNlKCB2ZXJzaW9uUmVnZXgsICcnICk7CiAgICAJCQlmcmFnbWVudFNoYWRlciA9IGZyYWdtZW50U2hhZGVyLnJlcGxhY2UoIHZlcnNpb25SZWdleCwgJycgKTsKCiAgICAJCX0KCiAgICAJCS8vIEdMU0wgMy4wIGNvbnZlcnNpb24KICAgIAkJcHJlZml4VmVydGV4ID0gWwogICAgCQkJJyN2ZXJzaW9uIDMwMCBlc1xuJywKICAgIAkJCScjZGVmaW5lIGF0dHJpYnV0ZSBpbicsCiAgICAJCQknI2RlZmluZSB2YXJ5aW5nIG91dCcsCiAgICAJCQknI2RlZmluZSB0ZXh0dXJlMkQgdGV4dHVyZScKICAgIAkJXS5qb2luKCAnXG4nICkgKyAnXG4nICsgcHJlZml4VmVydGV4OwoKICAgIAkJcHJlZml4RnJhZ21lbnQgPSBbCiAgICAJCQknI3ZlcnNpb24gMzAwIGVzXG4nLAogICAgCQkJJyNkZWZpbmUgdmFyeWluZyBpbicsCiAgICAJCQlpc0dMU0wzU2hhZGVyTWF0ZXJpYWwgPyAnJyA6ICdvdXQgaGlnaHAgdmVjNCBwY19mcmFnQ29sb3I7JywKICAgIAkJCWlzR0xTTDNTaGFkZXJNYXRlcmlhbCA/ICcnIDogJyNkZWZpbmUgZ2xfRnJhZ0NvbG9yIHBjX2ZyYWdDb2xvcicsCiAgICAJCQknI2RlZmluZSBnbF9GcmFnRGVwdGhFWFQgZ2xfRnJhZ0RlcHRoJywKICAgIAkJCScjZGVmaW5lIHRleHR1cmUyRCB0ZXh0dXJlJywKICAgIAkJCScjZGVmaW5lIHRleHR1cmVDdWJlIHRleHR1cmUnLAogICAgCQkJJyNkZWZpbmUgdGV4dHVyZTJEUHJvaiB0ZXh0dXJlUHJvaicsCiAgICAJCQknI2RlZmluZSB0ZXh0dXJlMkRMb2RFWFQgdGV4dHVyZUxvZCcsCiAgICAJCQknI2RlZmluZSB0ZXh0dXJlMkRQcm9qTG9kRVhUIHRleHR1cmVQcm9qTG9kJywKICAgIAkJCScjZGVmaW5lIHRleHR1cmVDdWJlTG9kRVhUIHRleHR1cmVMb2QnLAogICAgCQkJJyNkZWZpbmUgdGV4dHVyZTJER3JhZEVYVCB0ZXh0dXJlR3JhZCcsCiAgICAJCQknI2RlZmluZSB0ZXh0dXJlMkRQcm9qR3JhZEVYVCB0ZXh0dXJlUHJvakdyYWQnLAogICAgCQkJJyNkZWZpbmUgdGV4dHVyZUN1YmVHcmFkRVhUIHRleHR1cmVHcmFkJwogICAgCQldLmpvaW4oICdcbicgKSArICdcbicgKyBwcmVmaXhGcmFnbWVudDsKCiAgICAJfQoKICAgIAl2YXIgdmVydGV4R2xzbCA9IHByZWZpeFZlcnRleCArIHZlcnRleFNoYWRlcjsKICAgIAl2YXIgZnJhZ21lbnRHbHNsID0gcHJlZml4RnJhZ21lbnQgKyBmcmFnbWVudFNoYWRlcjsKCiAgICAJLy8gY29uc29sZS5sb2coICcqVkVSVEVYKicsIHZlcnRleEdsc2wgKTsKICAgIAkvLyBjb25zb2xlLmxvZyggJypGUkFHTUVOVConLCBmcmFnbWVudEdsc2wgKTsKCiAgICAJdmFyIGdsVmVydGV4U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMywgdmVydGV4R2xzbCApOwogICAgCXZhciBnbEZyYWdtZW50U2hhZGVyID0gV2ViR0xTaGFkZXIoIGdsLCAzNTYzMiwgZnJhZ21lbnRHbHNsICk7CgogICAgCWdsLmF0dGFjaFNoYWRlciggcHJvZ3JhbSwgZ2xWZXJ0ZXhTaGFkZXIgKTsKICAgIAlnbC5hdHRhY2hTaGFkZXIoIHByb2dyYW0sIGdsRnJhZ21lbnRTaGFkZXIgKTsKCiAgICAJLy8gRm9yY2UgYSBwYXJ0aWN1bGFyIGF0dHJpYnV0ZSB0byBpbmRleCAwLgoKICAgIAlpZiAoIG1hdGVyaWFsLmluZGV4MEF0dHJpYnV0ZU5hbWUgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCWdsLmJpbmRBdHRyaWJMb2NhdGlvbiggcHJvZ3JhbSwgMCwgbWF0ZXJpYWwuaW5kZXgwQXR0cmlidXRlTmFtZSApOwoKICAgIAl9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLm1vcnBoVGFyZ2V0cyA9PT0gdHJ1ZSApIHsKCiAgICAJCS8vIHByb2dyYW1zIHdpdGggbW9ycGhUYXJnZXRzIGRpc3BsYWNlIHBvc2l0aW9uIG91dCBvZiBhdHRyaWJ1dGUgMAogICAgCQlnbC5iaW5kQXR0cmliTG9jYXRpb24oIHByb2dyYW0sIDAsICdwb3NpdGlvbicgKTsKCiAgICAJfQoKICAgIAlnbC5saW5rUHJvZ3JhbSggcHJvZ3JhbSApOwoKICAgIAkvLyBjaGVjayBmb3IgbGluayBlcnJvcnMKICAgIAlpZiAoIHJlbmRlcmVyLmRlYnVnLmNoZWNrU2hhZGVyRXJyb3JzICkgewoKICAgIAkJdmFyIHByb2dyYW1Mb2cgPSBnbC5nZXRQcm9ncmFtSW5mb0xvZyggcHJvZ3JhbSApLnRyaW0oKTsKICAgIAkJdmFyIHZlcnRleExvZyA9IGdsLmdldFNoYWRlckluZm9Mb2coIGdsVmVydGV4U2hhZGVyICkudHJpbSgpOwogICAgCQl2YXIgZnJhZ21lbnRMb2cgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKCBnbEZyYWdtZW50U2hhZGVyICkudHJpbSgpOwoKICAgIAkJdmFyIHJ1bm5hYmxlID0gdHJ1ZTsKICAgIAkJdmFyIGhhdmVEaWFnbm9zdGljcyA9IHRydWU7CgogICAgCQlpZiAoIGdsLmdldFByb2dyYW1QYXJhbWV0ZXIoIHByb2dyYW0sIDM1NzE0ICkgPT09IGZhbHNlICkgewoKICAgIAkJCXJ1bm5hYmxlID0gZmFsc2U7CgogICAgCQkJdmFyIHZlcnRleEVycm9ycyA9IGdldFNoYWRlckVycm9ycyggZ2wsIGdsVmVydGV4U2hhZGVyLCAndmVydGV4JyApOwogICAgCQkJdmFyIGZyYWdtZW50RXJyb3JzID0gZ2V0U2hhZGVyRXJyb3JzKCBnbCwgZ2xGcmFnbWVudFNoYWRlciwgJ2ZyYWdtZW50JyApOwoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFByb2dyYW06IHNoYWRlciBlcnJvcjogJywgZ2wuZ2V0RXJyb3IoKSwgJzM1NzE1JywgZ2wuZ2V0UHJvZ3JhbVBhcmFtZXRlciggcHJvZ3JhbSwgMzU3MTUgKSwgJ2dsLmdldFByb2dyYW1JbmZvTG9nJywgcHJvZ3JhbUxvZywgdmVydGV4RXJyb3JzLCBmcmFnbWVudEVycm9ycyApOwoKICAgIAkJfSBlbHNlIGlmICggcHJvZ3JhbUxvZyAhPT0gJycgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xQcm9ncmFtOiBnbC5nZXRQcm9ncmFtSW5mb0xvZygpJywgcHJvZ3JhbUxvZyApOwoKICAgIAkJfSBlbHNlIGlmICggdmVydGV4TG9nID09PSAnJyB8fCBmcmFnbWVudExvZyA9PT0gJycgKSB7CgogICAgCQkJaGF2ZURpYWdub3N0aWNzID0gZmFsc2U7CgogICAgCQl9CgogICAgCQlpZiAoIGhhdmVEaWFnbm9zdGljcyApIHsKCiAgICAJCQl0aGlzLmRpYWdub3N0aWNzID0gewoKICAgIAkJCQlydW5uYWJsZTogcnVubmFibGUsCiAgICAJCQkJbWF0ZXJpYWw6IG1hdGVyaWFsLAoKICAgIAkJCQlwcm9ncmFtTG9nOiBwcm9ncmFtTG9nLAoKICAgIAkJCQl2ZXJ0ZXhTaGFkZXI6IHsKCiAgICAJCQkJCWxvZzogdmVydGV4TG9nLAogICAgCQkJCQlwcmVmaXg6IHByZWZpeFZlcnRleAoKICAgIAkJCQl9LAoKICAgIAkJCQlmcmFnbWVudFNoYWRlcjogewoKICAgIAkJCQkJbG9nOiBmcmFnbWVudExvZywKICAgIAkJCQkJcHJlZml4OiBwcmVmaXhGcmFnbWVudAoKICAgIAkJCQl9CgogICAgCQkJfTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyBjbGVhbiB1cAoKICAgIAlnbC5kZWxldGVTaGFkZXIoIGdsVmVydGV4U2hhZGVyICk7CiAgICAJZ2wuZGVsZXRlU2hhZGVyKCBnbEZyYWdtZW50U2hhZGVyICk7CgogICAgCS8vIHNldCB1cCBjYWNoaW5nIGZvciB1bmlmb3JtIGxvY2F0aW9ucwoKICAgIAl2YXIgY2FjaGVkVW5pZm9ybXM7CgogICAgCXRoaXMuZ2V0VW5pZm9ybXMgPSBmdW5jdGlvbiAoKSB7CgogICAgCQlpZiAoIGNhY2hlZFVuaWZvcm1zID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY2FjaGVkVW5pZm9ybXMgPSBuZXcgV2ViR0xVbmlmb3JtcyggZ2wsIHByb2dyYW0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBjYWNoZWRVbmlmb3JtczsKCiAgICAJfTsKCiAgICAJLy8gc2V0IHVwIGNhY2hpbmcgZm9yIGF0dHJpYnV0ZSBsb2NhdGlvbnMKCiAgICAJdmFyIGNhY2hlZEF0dHJpYnV0ZXM7CgogICAgCXRoaXMuZ2V0QXR0cmlidXRlcyA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCWlmICggY2FjaGVkQXR0cmlidXRlcyA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNhY2hlZEF0dHJpYnV0ZXMgPSBmZXRjaEF0dHJpYnV0ZUxvY2F0aW9ucyggZ2wsIHByb2dyYW0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBjYWNoZWRBdHRyaWJ1dGVzOwoKICAgIAl9OwoKICAgIAkvLyBmcmVlIHJlc291cmNlCgogICAgCXRoaXMuZGVzdHJveSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCWdsLmRlbGV0ZVByb2dyYW0oIHByb2dyYW0gKTsKICAgIAkJdGhpcy5wcm9ncmFtID0gdW5kZWZpbmVkOwoKICAgIAl9OwoKICAgIAkvLwoKICAgIAl0aGlzLm5hbWUgPSBzaGFkZXIubmFtZTsKICAgIAl0aGlzLmlkID0gcHJvZ3JhbUlkQ291bnQgKys7CiAgICAJdGhpcy5jb2RlID0gY29kZTsKICAgIAl0aGlzLnVzZWRUaW1lcyA9IDE7CiAgICAJdGhpcy5wcm9ncmFtID0gcHJvZ3JhbTsKICAgIAl0aGlzLnZlcnRleFNoYWRlciA9IGdsVmVydGV4U2hhZGVyOwogICAgCXRoaXMuZnJhZ21lbnRTaGFkZXIgPSBnbEZyYWdtZW50U2hhZGVyOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xQcm9ncmFtcyggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNhcGFiaWxpdGllcyApIHsKCiAgICAJdmFyIHByb2dyYW1zID0gW107CgogICAgCXZhciBzaGFkZXJJRHMgPSB7CiAgICAJCU1lc2hEZXB0aE1hdGVyaWFsOiAnZGVwdGgnLAogICAgCQlNZXNoRGlzdGFuY2VNYXRlcmlhbDogJ2Rpc3RhbmNlUkdCQScsCiAgICAJCU1lc2hOb3JtYWxNYXRlcmlhbDogJ25vcm1hbCcsCiAgICAJCU1lc2hCYXNpY01hdGVyaWFsOiAnYmFzaWMnLAogICAgCQlNZXNoTGFtYmVydE1hdGVyaWFsOiAnbGFtYmVydCcsCiAgICAJCU1lc2hQaG9uZ01hdGVyaWFsOiAncGhvbmcnLAogICAgCQlNZXNoVG9vbk1hdGVyaWFsOiAncGhvbmcnLAogICAgCQlNZXNoU3RhbmRhcmRNYXRlcmlhbDogJ3BoeXNpY2FsJywKICAgIAkJTWVzaFBoeXNpY2FsTWF0ZXJpYWw6ICdwaHlzaWNhbCcsCiAgICAJCU1lc2hNYXRjYXBNYXRlcmlhbDogJ21hdGNhcCcsCiAgICAJCUxpbmVCYXNpY01hdGVyaWFsOiAnYmFzaWMnLAogICAgCQlMaW5lRGFzaGVkTWF0ZXJpYWw6ICdkYXNoZWQnLAogICAgCQlQb2ludHNNYXRlcmlhbDogJ3BvaW50cycsCiAgICAJCVNoYWRvd01hdGVyaWFsOiAnc2hhZG93JywKICAgIAkJU3ByaXRlTWF0ZXJpYWw6ICdzcHJpdGUnCiAgICAJfTsKCiAgICAJdmFyIHBhcmFtZXRlck5hbWVzID0gWwogICAgCQkicHJlY2lzaW9uIiwgInN1cHBvcnRzVmVydGV4VGV4dHVyZXMiLCAibWFwIiwgIm1hcEVuY29kaW5nIiwgIm1hdGNhcCIsICJtYXRjYXBFbmNvZGluZyIsICJlbnZNYXAiLCAiZW52TWFwTW9kZSIsICJlbnZNYXBFbmNvZGluZyIsCiAgICAJCSJsaWdodE1hcCIsICJhb01hcCIsICJlbWlzc2l2ZU1hcCIsICJlbWlzc2l2ZU1hcEVuY29kaW5nIiwgImJ1bXBNYXAiLCAibm9ybWFsTWFwIiwgIm9iamVjdFNwYWNlTm9ybWFsTWFwIiwgInRhbmdlbnRTcGFjZU5vcm1hbE1hcCIsICJjbGVhcmNvYXROb3JtYWxNYXAiLCAiZGlzcGxhY2VtZW50TWFwIiwgInNwZWN1bGFyTWFwIiwKICAgIAkJInJvdWdobmVzc01hcCIsICJtZXRhbG5lc3NNYXAiLCAiZ3JhZGllbnRNYXAiLAogICAgCQkiYWxwaGFNYXAiLCAiY29tYmluZSIsICJ2ZXJ0ZXhDb2xvcnMiLCAidmVydGV4VGFuZ2VudHMiLCAiZm9nIiwgInVzZUZvZyIsICJmb2dFeHAyIiwKICAgIAkJImZsYXRTaGFkaW5nIiwgInNpemVBdHRlbnVhdGlvbiIsICJsb2dhcml0aG1pY0RlcHRoQnVmZmVyIiwgInNraW5uaW5nIiwKICAgIAkJIm1heEJvbmVzIiwgInVzZVZlcnRleFRleHR1cmUiLCAibW9ycGhUYXJnZXRzIiwgIm1vcnBoTm9ybWFscyIsCiAgICAJCSJtYXhNb3JwaFRhcmdldHMiLCAibWF4TW9ycGhOb3JtYWxzIiwgInByZW11bHRpcGxpZWRBbHBoYSIsCiAgICAJCSJudW1EaXJMaWdodHMiLCAibnVtUG9pbnRMaWdodHMiLCAibnVtU3BvdExpZ2h0cyIsICJudW1IZW1pTGlnaHRzIiwgIm51bVJlY3RBcmVhTGlnaHRzIiwKICAgIAkJInNoYWRvd01hcEVuYWJsZWQiLCAic2hhZG93TWFwVHlwZSIsICJ0b25lTWFwcGluZyIsICdwaHlzaWNhbGx5Q29ycmVjdExpZ2h0cycsCiAgICAJCSJhbHBoYVRlc3QiLCAiZG91YmxlU2lkZWQiLCAiZmxpcFNpZGVkIiwgIm51bUNsaXBwaW5nUGxhbmVzIiwgIm51bUNsaXBJbnRlcnNlY3Rpb24iLCAiZGVwdGhQYWNraW5nIiwgImRpdGhlcmluZyIsCiAgICAJCSJzaGVlbiIKICAgIAldOwoKCiAgICAJZnVuY3Rpb24gYWxsb2NhdGVCb25lcyggb2JqZWN0ICkgewoKICAgIAkJdmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uOwogICAgCQl2YXIgYm9uZXMgPSBza2VsZXRvbi5ib25lczsKCiAgICAJCWlmICggY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMgKSB7CgogICAgCQkJcmV0dXJuIDEwMjQ7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGRlZmF1bHQgZm9yIHdoZW4gb2JqZWN0IGlzIG5vdCBzcGVjaWZpZWQKICAgIAkJCS8vICggZm9yIGV4YW1wbGUgd2hlbiBwcmVidWlsZGluZyBzaGFkZXIgdG8gYmUgdXNlZCB3aXRoIG11bHRpcGxlIG9iamVjdHMgKQogICAgCQkJLy8KICAgIAkJCS8vICAtIGxlYXZlIHNvbWUgZXh0cmEgc3BhY2UgZm9yIG90aGVyIHVuaWZvcm1zCiAgICAJCQkvLyAgLSBsaW1pdCBoZXJlIGlzIEFOR0xFJ3MgMjU0IG1heCB1bmlmb3JtIHZlY3RvcnMKICAgIAkJCS8vICAgICh1cCB0byA1NCBzaG91bGQgYmUgc2FmZSkKCiAgICAJCQl2YXIgblZlcnRleFVuaWZvcm1zID0gY2FwYWJpbGl0aWVzLm1heFZlcnRleFVuaWZvcm1zOwogICAgCQkJdmFyIG5WZXJ0ZXhNYXRyaWNlcyA9IE1hdGguZmxvb3IoICggblZlcnRleFVuaWZvcm1zIC0gMjAgKSAvIDQgKTsKCiAgICAJCQl2YXIgbWF4Qm9uZXMgPSBNYXRoLm1pbiggblZlcnRleE1hdHJpY2VzLCBib25lcy5sZW5ndGggKTsKCiAgICAJCQlpZiAoIG1heEJvbmVzIDwgYm9uZXMubGVuZ3RoICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBTa2VsZXRvbiBoYXMgJyArIGJvbmVzLmxlbmd0aCArICcgYm9uZXMuIFRoaXMgR1BVIHN1cHBvcnRzICcgKyBtYXhCb25lcyArICcuJyApOwogICAgCQkJCXJldHVybiAwOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gbWF4Qm9uZXM7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWFwLCBnYW1tYU92ZXJyaWRlTGluZWFyICkgewoKICAgIAkJdmFyIGVuY29kaW5nOwoKICAgIAkJaWYgKCAhIG1hcCApIHsKCiAgICAJCQllbmNvZGluZyA9IExpbmVhckVuY29kaW5nOwoKICAgIAkJfSBlbHNlIGlmICggbWFwLmlzVGV4dHVyZSApIHsKCiAgICAJCQllbmNvZGluZyA9IG1hcC5lbmNvZGluZzsKCiAgICAJCX0gZWxzZSBpZiAoIG1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggIlRIUkVFLldlYkdMUHJvZ3JhbXMuZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcDogZG9uJ3QgdXNlIHJlbmRlciB0YXJnZXRzIGFzIHRleHR1cmVzLiBVc2UgdGhlaXIgLnRleHR1cmUgcHJvcGVydHkgaW5zdGVhZC4iICk7CiAgICAJCQllbmNvZGluZyA9IG1hcC50ZXh0dXJlLmVuY29kaW5nOwoKICAgIAkJfQoKICAgIAkJLy8gYWRkIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGZvciBXZWJHTFJlbmRlcmVyLmdhbW1hSW5wdXQvZ2FtbWFPdXRwdXQgcGFyYW1ldGVyLCBzaG91bGQgcHJvYmFibHkgYmUgcmVtb3ZlZCBhdCBzb21lIHBvaW50LgogICAgCQlpZiAoIGVuY29kaW5nID09PSBMaW5lYXJFbmNvZGluZyAmJiBnYW1tYU92ZXJyaWRlTGluZWFyICkgewoKICAgIAkJCWVuY29kaW5nID0gR2FtbWFFbmNvZGluZzsKCiAgICAJCX0KCiAgICAJCXJldHVybiBlbmNvZGluZzsKCiAgICAJfQoKICAgIAl0aGlzLmdldFBhcmFtZXRlcnMgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBsaWdodHMsIHNoYWRvd3MsIGZvZywgbkNsaXBQbGFuZXMsIG5DbGlwSW50ZXJzZWN0aW9uLCBvYmplY3QgKSB7CgogICAgCQl2YXIgc2hhZGVySUQgPSBzaGFkZXJJRHNbIG1hdGVyaWFsLnR5cGUgXTsKCiAgICAJCS8vIGhldXJpc3RpY3MgdG8gY3JlYXRlIHNoYWRlciBwYXJhbWV0ZXJzIGFjY29yZGluZyB0byBsaWdodHMgaW4gdGhlIHNjZW5lCiAgICAJCS8vIChub3QgdG8gYmxvdyBvdmVyIG1heExpZ2h0cyBidWRnZXQpCgogICAgCQl2YXIgbWF4Qm9uZXMgPSBvYmplY3QuaXNTa2lubmVkTWVzaCA/IGFsbG9jYXRlQm9uZXMoIG9iamVjdCApIDogMDsKICAgIAkJdmFyIHByZWNpc2lvbiA9IGNhcGFiaWxpdGllcy5wcmVjaXNpb247CgogICAgCQlpZiAoIG1hdGVyaWFsLnByZWNpc2lvbiAhPT0gbnVsbCApIHsKCiAgICAJCQlwcmVjaXNpb24gPSBjYXBhYmlsaXRpZXMuZ2V0TWF4UHJlY2lzaW9uKCBtYXRlcmlhbC5wcmVjaXNpb24gKTsKCiAgICAJCQlpZiAoIHByZWNpc2lvbiAhPT0gbWF0ZXJpYWwucHJlY2lzaW9uICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFByb2dyYW0uZ2V0UGFyYW1ldGVyczonLCBtYXRlcmlhbC5wcmVjaXNpb24sICdub3Qgc3VwcG9ydGVkLCB1c2luZycsIHByZWNpc2lvbiwgJ2luc3RlYWQuJyApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBjdXJyZW50UmVuZGVyVGFyZ2V0ID0gcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7CgogICAgCQl2YXIgcGFyYW1ldGVycyA9IHsKCiAgICAJCQlzaGFkZXJJRDogc2hhZGVySUQsCgogICAgCQkJcHJlY2lzaW9uOiBwcmVjaXNpb24sCiAgICAJCQlzdXBwb3J0c1ZlcnRleFRleHR1cmVzOiBjYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMsCiAgICAJCQlvdXRwdXRFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggKCAhIGN1cnJlbnRSZW5kZXJUYXJnZXQgKSA/IG51bGwgOiBjdXJyZW50UmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICksCiAgICAJCQltYXA6ICEhIG1hdGVyaWFsLm1hcCwKICAgIAkJCW1hcEVuY29kaW5nOiBnZXRUZXh0dXJlRW5jb2RpbmdGcm9tTWFwKCBtYXRlcmlhbC5tYXAsIHJlbmRlcmVyLmdhbW1hSW5wdXQgKSwKICAgIAkJCW1hdGNhcDogISEgbWF0ZXJpYWwubWF0Y2FwLAogICAgCQkJbWF0Y2FwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLm1hdGNhcCwgcmVuZGVyZXIuZ2FtbWFJbnB1dCApLAogICAgCQkJZW52TWFwOiAhISBtYXRlcmlhbC5lbnZNYXAsCiAgICAJCQllbnZNYXBNb2RlOiBtYXRlcmlhbC5lbnZNYXAgJiYgbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcsCiAgICAJCQllbnZNYXBFbmNvZGluZzogZ2V0VGV4dHVyZUVuY29kaW5nRnJvbU1hcCggbWF0ZXJpYWwuZW52TWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksCiAgICAJCQllbnZNYXBDdWJlVVY6ICggISEgbWF0ZXJpYWwuZW52TWFwICkgJiYgKCAoIG1hdGVyaWFsLmVudk1hcC5tYXBwaW5nID09PSBDdWJlVVZSZWZsZWN0aW9uTWFwcGluZyApIHx8ICggbWF0ZXJpYWwuZW52TWFwLm1hcHBpbmcgPT09IEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nICkgKSwKICAgIAkJCWxpZ2h0TWFwOiAhISBtYXRlcmlhbC5saWdodE1hcCwKICAgIAkJCWFvTWFwOiAhISBtYXRlcmlhbC5hb01hcCwKICAgIAkJCWVtaXNzaXZlTWFwOiAhISBtYXRlcmlhbC5lbWlzc2l2ZU1hcCwKICAgIAkJCWVtaXNzaXZlTWFwRW5jb2Rpbmc6IGdldFRleHR1cmVFbmNvZGluZ0Zyb21NYXAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwLCByZW5kZXJlci5nYW1tYUlucHV0ICksCiAgICAJCQlidW1wTWFwOiAhISBtYXRlcmlhbC5idW1wTWFwLAogICAgCQkJbm9ybWFsTWFwOiAhISBtYXRlcmlhbC5ub3JtYWxNYXAsCiAgICAJCQlvYmplY3RTcGFjZU5vcm1hbE1hcDogbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9PT0gT2JqZWN0U3BhY2VOb3JtYWxNYXAsCiAgICAJCQl0YW5nZW50U3BhY2VOb3JtYWxNYXA6IG1hdGVyaWFsLm5vcm1hbE1hcFR5cGUgPT09IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCwKICAgIAkJCWNsZWFyY29hdE5vcm1hbE1hcDogISEgbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwLAogICAgCQkJZGlzcGxhY2VtZW50TWFwOiAhISBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAsCiAgICAJCQlyb3VnaG5lc3NNYXA6ICEhIG1hdGVyaWFsLnJvdWdobmVzc01hcCwKICAgIAkJCW1ldGFsbmVzc01hcDogISEgbWF0ZXJpYWwubWV0YWxuZXNzTWFwLAogICAgCQkJc3BlY3VsYXJNYXA6ICEhIG1hdGVyaWFsLnNwZWN1bGFyTWFwLAogICAgCQkJYWxwaGFNYXA6ICEhIG1hdGVyaWFsLmFscGhhTWFwLAoKICAgIAkJCWdyYWRpZW50TWFwOiAhISBtYXRlcmlhbC5ncmFkaWVudE1hcCwKCiAgICAJCQlzaGVlbjogISEgbWF0ZXJpYWwuc2hlZW4sCgogICAgCQkJY29tYmluZTogbWF0ZXJpYWwuY29tYmluZSwKCiAgICAJCQl2ZXJ0ZXhUYW5nZW50czogKCBtYXRlcmlhbC5ub3JtYWxNYXAgJiYgbWF0ZXJpYWwudmVydGV4VGFuZ2VudHMgKSwKICAgIAkJCXZlcnRleENvbG9yczogbWF0ZXJpYWwudmVydGV4Q29sb3JzLAogICAgCQkJdmVydGV4VXZzOiAhISBtYXRlcmlhbC5tYXAgfHwgISEgbWF0ZXJpYWwuYnVtcE1hcCB8fCAhISBtYXRlcmlhbC5ub3JtYWxNYXAgfHwgISEgbWF0ZXJpYWwuc3BlY3VsYXJNYXAgfHwgISEgbWF0ZXJpYWwuYWxwaGFNYXAgfHwgISEgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgfHwgISEgbWF0ZXJpYWwucm91Z2huZXNzTWFwIHx8ICEhIG1hdGVyaWFsLm1ldGFsbmVzc01hcCB8fCAhISBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAsCgogICAgCQkJZm9nOiAhISBmb2csCiAgICAJCQl1c2VGb2c6IG1hdGVyaWFsLmZvZywKICAgIAkJCWZvZ0V4cDI6ICggZm9nICYmIGZvZy5pc0ZvZ0V4cDIgKSwKCiAgICAJCQlmbGF0U2hhZGluZzogbWF0ZXJpYWwuZmxhdFNoYWRpbmcsCgogICAgCQkJc2l6ZUF0dGVudWF0aW9uOiBtYXRlcmlhbC5zaXplQXR0ZW51YXRpb24sCiAgICAJCQlsb2dhcml0aG1pY0RlcHRoQnVmZmVyOiBjYXBhYmlsaXRpZXMubG9nYXJpdGhtaWNEZXB0aEJ1ZmZlciwKCiAgICAJCQlza2lubmluZzogbWF0ZXJpYWwuc2tpbm5pbmcgJiYgbWF4Qm9uZXMgPiAwLAogICAgCQkJbWF4Qm9uZXM6IG1heEJvbmVzLAogICAgCQkJdXNlVmVydGV4VGV4dHVyZTogY2FwYWJpbGl0aWVzLmZsb2F0VmVydGV4VGV4dHVyZXMsCgogICAgCQkJbW9ycGhUYXJnZXRzOiBtYXRlcmlhbC5tb3JwaFRhcmdldHMsCiAgICAJCQltb3JwaE5vcm1hbHM6IG1hdGVyaWFsLm1vcnBoTm9ybWFscywKICAgIAkJCW1heE1vcnBoVGFyZ2V0czogcmVuZGVyZXIubWF4TW9ycGhUYXJnZXRzLAogICAgCQkJbWF4TW9ycGhOb3JtYWxzOiByZW5kZXJlci5tYXhNb3JwaE5vcm1hbHMsCgogICAgCQkJbnVtRGlyTGlnaHRzOiBsaWdodHMuZGlyZWN0aW9uYWwubGVuZ3RoLAogICAgCQkJbnVtUG9pbnRMaWdodHM6IGxpZ2h0cy5wb2ludC5sZW5ndGgsCiAgICAJCQludW1TcG90TGlnaHRzOiBsaWdodHMuc3BvdC5sZW5ndGgsCiAgICAJCQludW1SZWN0QXJlYUxpZ2h0czogbGlnaHRzLnJlY3RBcmVhLmxlbmd0aCwKICAgIAkJCW51bUhlbWlMaWdodHM6IGxpZ2h0cy5oZW1pLmxlbmd0aCwKCiAgICAJCQludW1EaXJMaWdodFNoYWRvd3M6IGxpZ2h0cy5kaXJlY3Rpb25hbFNoYWRvd01hcC5sZW5ndGgsCiAgICAJCQludW1Qb2ludExpZ2h0U2hhZG93czogbGlnaHRzLnBvaW50U2hhZG93TWFwLmxlbmd0aCwKICAgIAkJCW51bVNwb3RMaWdodFNoYWRvd3M6IGxpZ2h0cy5zcG90U2hhZG93TWFwLmxlbmd0aCwKCiAgICAJCQludW1DbGlwcGluZ1BsYW5lczogbkNsaXBQbGFuZXMsCiAgICAJCQludW1DbGlwSW50ZXJzZWN0aW9uOiBuQ2xpcEludGVyc2VjdGlvbiwKCiAgICAJCQlkaXRoZXJpbmc6IG1hdGVyaWFsLmRpdGhlcmluZywKCiAgICAJCQlzaGFkb3dNYXBFbmFibGVkOiByZW5kZXJlci5zaGFkb3dNYXAuZW5hYmxlZCAmJiBvYmplY3QucmVjZWl2ZVNoYWRvdyAmJiBzaGFkb3dzLmxlbmd0aCA+IDAsCiAgICAJCQlzaGFkb3dNYXBUeXBlOiByZW5kZXJlci5zaGFkb3dNYXAudHlwZSwKCiAgICAJCQl0b25lTWFwcGluZzogbWF0ZXJpYWwudG9uZU1hcHBlZCA/IHJlbmRlcmVyLnRvbmVNYXBwaW5nIDogTm9Ub25lTWFwcGluZywKICAgIAkJCXBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzOiByZW5kZXJlci5waHlzaWNhbGx5Q29ycmVjdExpZ2h0cywKCiAgICAJCQlwcmVtdWx0aXBsaWVkQWxwaGE6IG1hdGVyaWFsLnByZW11bHRpcGxpZWRBbHBoYSwKCiAgICAJCQlhbHBoYVRlc3Q6IG1hdGVyaWFsLmFscGhhVGVzdCwKICAgIAkJCWRvdWJsZVNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBEb3VibGVTaWRlLAogICAgCQkJZmxpcFNpZGVkOiBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSwKCiAgICAJCQlkZXB0aFBhY2tpbmc6ICggbWF0ZXJpYWwuZGVwdGhQYWNraW5nICE9PSB1bmRlZmluZWQgKSA/IG1hdGVyaWFsLmRlcHRoUGFja2luZyA6IGZhbHNlCgogICAgCQl9OwoKICAgIAkJcmV0dXJuIHBhcmFtZXRlcnM7CgogICAgCX07CgogICAgCXRoaXMuZ2V0UHJvZ3JhbUNvZGUgPSBmdW5jdGlvbiAoIG1hdGVyaWFsLCBwYXJhbWV0ZXJzICkgewoKICAgIAkJdmFyIGFycmF5ID0gW107CgogICAgCQlpZiAoIHBhcmFtZXRlcnMuc2hhZGVySUQgKSB7CgogICAgCQkJYXJyYXkucHVzaCggcGFyYW1ldGVycy5zaGFkZXJJRCApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlhcnJheS5wdXNoKCBtYXRlcmlhbC5mcmFnbWVudFNoYWRlciApOwogICAgCQkJYXJyYXkucHVzaCggbWF0ZXJpYWwudmVydGV4U2hhZGVyICk7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmRlZmluZXMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlmb3IgKCB2YXIgbmFtZSBpbiBtYXRlcmlhbC5kZWZpbmVzICkgewoKICAgIAkJCQlhcnJheS5wdXNoKCBuYW1lICk7CiAgICAJCQkJYXJyYXkucHVzaCggbWF0ZXJpYWwuZGVmaW5lc1sgbmFtZSBdICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgcGFyYW1ldGVyTmFtZXMubGVuZ3RoOyBpICsrICkgewoKICAgIAkJCWFycmF5LnB1c2goIHBhcmFtZXRlcnNbIHBhcmFtZXRlck5hbWVzWyBpIF0gXSApOwoKICAgIAkJfQoKICAgIAkJYXJyYXkucHVzaCggbWF0ZXJpYWwub25CZWZvcmVDb21waWxlLnRvU3RyaW5nKCkgKTsKCiAgICAJCWFycmF5LnB1c2goIHJlbmRlcmVyLmdhbW1hT3V0cHV0ICk7CgogICAgCQlhcnJheS5wdXNoKCByZW5kZXJlci5nYW1tYUZhY3RvciApOwoKICAgIAkJcmV0dXJuIGFycmF5LmpvaW4oKTsKCiAgICAJfTsKCiAgICAJdGhpcy5hY3F1aXJlUHJvZ3JhbSA9IGZ1bmN0aW9uICggbWF0ZXJpYWwsIHNoYWRlciwgcGFyYW1ldGVycywgY29kZSApIHsKCiAgICAJCXZhciBwcm9ncmFtOwoKICAgIAkJLy8gQ2hlY2sgaWYgY29kZSBoYXMgYmVlbiBhbHJlYWR5IGNvbXBpbGVkCiAgICAJCWZvciAoIHZhciBwID0gMCwgcGwgPSBwcm9ncmFtcy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHsKCiAgICAJCQl2YXIgcHJvZ3JhbUluZm8gPSBwcm9ncmFtc1sgcCBdOwoKICAgIAkJCWlmICggcHJvZ3JhbUluZm8uY29kZSA9PT0gY29kZSApIHsKCiAgICAJCQkJcHJvZ3JhbSA9IHByb2dyYW1JbmZvOwogICAgCQkJCSsrIHByb2dyYW0udXNlZFRpbWVzOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIHByb2dyYW0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlwcm9ncmFtID0gbmV3IFdlYkdMUHJvZ3JhbSggcmVuZGVyZXIsIGV4dGVuc2lvbnMsIGNvZGUsIG1hdGVyaWFsLCBzaGFkZXIsIHBhcmFtZXRlcnMsIGNhcGFiaWxpdGllcyApOwogICAgCQkJcHJvZ3JhbXMucHVzaCggcHJvZ3JhbSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHByb2dyYW07CgogICAgCX07CgogICAgCXRoaXMucmVsZWFzZVByb2dyYW0gPSBmdW5jdGlvbiAoIHByb2dyYW0gKSB7CgogICAgCQlpZiAoIC0tIHByb2dyYW0udXNlZFRpbWVzID09PSAwICkgewoKICAgIAkJCS8vIFJlbW92ZSBmcm9tIHVub3JkZXJlZCBzZXQKICAgIAkJCXZhciBpID0gcHJvZ3JhbXMuaW5kZXhPZiggcHJvZ3JhbSApOwogICAgCQkJcHJvZ3JhbXNbIGkgXSA9IHByb2dyYW1zWyBwcm9ncmFtcy5sZW5ndGggLSAxIF07CiAgICAJCQlwcm9ncmFtcy5wb3AoKTsKCiAgICAJCQkvLyBGcmVlIFdlYkdMIHJlc291cmNlcwogICAgCQkJcHJvZ3JhbS5kZXN0cm95KCk7CgogICAgCQl9CgogICAgCX07CgogICAgCS8vIEV4cG9zZWQgZm9yIHJlc291cmNlIG1vbml0b3JpbmcgJiBlcnJvciBmZWVkYmFjayB2aWEgcmVuZGVyZXIuaW5mbzoKICAgIAl0aGlzLnByb2dyYW1zID0gcHJvZ3JhbXM7CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBmb3JkYWNpb3VzIC8gZm9yZGFjaW91cy5naXRodWIuaW8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMUHJvcGVydGllcygpIHsKCiAgICAJdmFyIHByb3BlcnRpZXMgPSBuZXcgV2Vha01hcCgpOwoKICAgIAlmdW5jdGlvbiBnZXQoIG9iamVjdCApIHsKCiAgICAJCXZhciBtYXAgPSBwcm9wZXJ0aWVzLmdldCggb2JqZWN0ICk7CgogICAgCQlpZiAoIG1hcCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCW1hcCA9IHt9OwogICAgCQkJcHJvcGVydGllcy5zZXQoIG9iamVjdCwgbWFwICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gbWFwOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlbW92ZSggb2JqZWN0ICkgewoKICAgIAkJcHJvcGVydGllcy5kZWxldGUoIG9iamVjdCApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHVwZGF0ZSggb2JqZWN0LCBrZXksIHZhbHVlICkgewoKICAgIAkJcHJvcGVydGllcy5nZXQoIG9iamVjdCApWyBrZXkgXSA9IHZhbHVlOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGRpc3Bvc2UoKSB7CgogICAgCQlwcm9wZXJ0aWVzID0gbmV3IFdlYWtNYXAoKTsKCiAgICAJfQoKICAgIAlyZXR1cm4gewogICAgCQlnZXQ6IGdldCwKICAgIAkJcmVtb3ZlOiByZW1vdmUsCiAgICAJCXVwZGF0ZTogdXBkYXRlLAogICAgCQlkaXNwb3NlOiBkaXNwb3NlCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gcGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7CgogICAgCWlmICggYS5ncm91cE9yZGVyICE9PSBiLmdyb3VwT3JkZXIgKSB7CgogICAgCQlyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyOwoKICAgIAl9IGVsc2UgaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkgewoKICAgIAkJcmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyOwoKICAgIAl9IGVsc2UgaWYgKCBhLnByb2dyYW0gIT09IGIucHJvZ3JhbSApIHsKCiAgICAJCXJldHVybiBhLnByb2dyYW0uaWQgLSBiLnByb2dyYW0uaWQ7CgogICAgCX0gZWxzZSBpZiAoIGEubWF0ZXJpYWwuaWQgIT09IGIubWF0ZXJpYWwuaWQgKSB7CgogICAgCQlyZXR1cm4gYS5tYXRlcmlhbC5pZCAtIGIubWF0ZXJpYWwuaWQ7CgogICAgCX0gZWxzZSBpZiAoIGEueiAhPT0gYi56ICkgewoKICAgIAkJcmV0dXJuIGEueiAtIGIuejsKCiAgICAJfSBlbHNlIHsKCiAgICAJCXJldHVybiBhLmlkIC0gYi5pZDsKCiAgICAJfQoKICAgIH0KCiAgICBmdW5jdGlvbiByZXZlcnNlUGFpbnRlclNvcnRTdGFibGUoIGEsIGIgKSB7CgogICAgCWlmICggYS5ncm91cE9yZGVyICE9PSBiLmdyb3VwT3JkZXIgKSB7CgogICAgCQlyZXR1cm4gYS5ncm91cE9yZGVyIC0gYi5ncm91cE9yZGVyOwoKICAgIAl9IGVsc2UgaWYgKCBhLnJlbmRlck9yZGVyICE9PSBiLnJlbmRlck9yZGVyICkgewoKICAgIAkJcmV0dXJuIGEucmVuZGVyT3JkZXIgLSBiLnJlbmRlck9yZGVyOwoKICAgIAl9IGVsc2UgaWYgKCBhLnogIT09IGIueiApIHsKCiAgICAJCXJldHVybiBiLnogLSBhLno7CgogICAgCX0gZWxzZSB7CgogICAgCQlyZXR1cm4gYS5pZCAtIGIuaWQ7CgogICAgCX0KCiAgICB9CgoKICAgIGZ1bmN0aW9uIFdlYkdMUmVuZGVyTGlzdCgpIHsKCiAgICAJdmFyIHJlbmRlckl0ZW1zID0gW107CiAgICAJdmFyIHJlbmRlckl0ZW1zSW5kZXggPSAwOwoKICAgIAl2YXIgb3BhcXVlID0gW107CiAgICAJdmFyIHRyYW5zcGFyZW50ID0gW107CgogICAgCXZhciBkZWZhdWx0UHJvZ3JhbSA9IHsgaWQ6IC0gMSB9OwoKICAgIAlmdW5jdGlvbiBpbml0KCkgewoKICAgIAkJcmVuZGVySXRlbXNJbmRleCA9IDA7CgogICAgCQlvcGFxdWUubGVuZ3RoID0gMDsKICAgIAkJdHJhbnNwYXJlbnQubGVuZ3RoID0gMDsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZXROZXh0UmVuZGVySXRlbSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICkgewoKICAgIAkJdmFyIHJlbmRlckl0ZW0gPSByZW5kZXJJdGVtc1sgcmVuZGVySXRlbXNJbmRleCBdOwoKICAgIAkJaWYgKCByZW5kZXJJdGVtID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJcmVuZGVySXRlbSA9IHsKICAgIAkJCQlpZDogb2JqZWN0LmlkLAogICAgCQkJCW9iamVjdDogb2JqZWN0LAogICAgCQkJCWdlb21ldHJ5OiBnZW9tZXRyeSwKICAgIAkJCQltYXRlcmlhbDogbWF0ZXJpYWwsCiAgICAJCQkJcHJvZ3JhbTogbWF0ZXJpYWwucHJvZ3JhbSB8fCBkZWZhdWx0UHJvZ3JhbSwKICAgIAkJCQlncm91cE9yZGVyOiBncm91cE9yZGVyLAogICAgCQkJCXJlbmRlck9yZGVyOiBvYmplY3QucmVuZGVyT3JkZXIsCiAgICAJCQkJejogeiwKICAgIAkJCQlncm91cDogZ3JvdXAKICAgIAkJCX07CgogICAgCQkJcmVuZGVySXRlbXNbIHJlbmRlckl0ZW1zSW5kZXggXSA9IHJlbmRlckl0ZW07CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXJlbmRlckl0ZW0uaWQgPSBvYmplY3QuaWQ7CiAgICAJCQlyZW5kZXJJdGVtLm9iamVjdCA9IG9iamVjdDsKICAgIAkJCXJlbmRlckl0ZW0uZ2VvbWV0cnkgPSBnZW9tZXRyeTsKICAgIAkJCXJlbmRlckl0ZW0ubWF0ZXJpYWwgPSBtYXRlcmlhbDsKICAgIAkJCXJlbmRlckl0ZW0ucHJvZ3JhbSA9IG1hdGVyaWFsLnByb2dyYW0gfHwgZGVmYXVsdFByb2dyYW07CiAgICAJCQlyZW5kZXJJdGVtLmdyb3VwT3JkZXIgPSBncm91cE9yZGVyOwogICAgCQkJcmVuZGVySXRlbS5yZW5kZXJPcmRlciA9IG9iamVjdC5yZW5kZXJPcmRlcjsKICAgIAkJCXJlbmRlckl0ZW0ueiA9IHo7CiAgICAJCQlyZW5kZXJJdGVtLmdyb3VwID0gZ3JvdXA7CgogICAgCQl9CgogICAgCQlyZW5kZXJJdGVtc0luZGV4ICsrOwoKICAgIAkJcmV0dXJuIHJlbmRlckl0ZW07CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICkgewoKICAgIAkJdmFyIHJlbmRlckl0ZW0gPSBnZXROZXh0UmVuZGVySXRlbSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICk7CgogICAgCQkoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlID8gdHJhbnNwYXJlbnQgOiBvcGFxdWUgKS5wdXNoKCByZW5kZXJJdGVtICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gdW5zaGlmdCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICkgewoKICAgIAkJdmFyIHJlbmRlckl0ZW0gPSBnZXROZXh0UmVuZGVySXRlbSggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIHosIGdyb3VwICk7CgogICAgCQkoIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSB0cnVlID8gdHJhbnNwYXJlbnQgOiBvcGFxdWUgKS51bnNoaWZ0KCByZW5kZXJJdGVtICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc29ydCgpIHsKCiAgICAJCWlmICggb3BhcXVlLmxlbmd0aCA+IDEgKSBvcGFxdWUuc29ydCggcGFpbnRlclNvcnRTdGFibGUgKTsKICAgIAkJaWYgKCB0cmFuc3BhcmVudC5sZW5ndGggPiAxICkgdHJhbnNwYXJlbnQuc29ydCggcmV2ZXJzZVBhaW50ZXJTb3J0U3RhYmxlICk7CgogICAgCX0KCiAgICAJcmV0dXJuIHsKICAgIAkJb3BhcXVlOiBvcGFxdWUsCiAgICAJCXRyYW5zcGFyZW50OiB0cmFuc3BhcmVudCwKCiAgICAJCWluaXQ6IGluaXQsCiAgICAJCXB1c2g6IHB1c2gsCiAgICAJCXVuc2hpZnQ6IHVuc2hpZnQsCgogICAgCQlzb3J0OiBzb3J0CiAgICAJfTsKCiAgICB9CgogICAgZnVuY3Rpb24gV2ViR0xSZW5kZXJMaXN0cygpIHsKCiAgICAJdmFyIGxpc3RzID0gbmV3IFdlYWtNYXAoKTsKCiAgICAJZnVuY3Rpb24gb25TY2VuZURpc3Bvc2UoIGV2ZW50ICkgewoKICAgIAkJdmFyIHNjZW5lID0gZXZlbnQudGFyZ2V0OwoKICAgIAkJc2NlbmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblNjZW5lRGlzcG9zZSApOwoKICAgIAkJbGlzdHMuZGVsZXRlKCBzY2VuZSApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdldCggc2NlbmUsIGNhbWVyYSApIHsKCiAgICAJCXZhciBjYW1lcmFzID0gbGlzdHMuZ2V0KCBzY2VuZSApOwogICAgCQl2YXIgbGlzdDsKICAgIAkJaWYgKCBjYW1lcmFzID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJbGlzdCA9IG5ldyBXZWJHTFJlbmRlckxpc3QoKTsKICAgIAkJCWxpc3RzLnNldCggc2NlbmUsIG5ldyBXZWFrTWFwKCkgKTsKICAgIAkJCWxpc3RzLmdldCggc2NlbmUgKS5zZXQoIGNhbWVyYSwgbGlzdCApOwoKICAgIAkJCXNjZW5lLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25TY2VuZURpc3Bvc2UgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJbGlzdCA9IGNhbWVyYXMuZ2V0KCBjYW1lcmEgKTsKICAgIAkJCWlmICggbGlzdCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlsaXN0ID0gbmV3IFdlYkdMUmVuZGVyTGlzdCgpOwogICAgCQkJCWNhbWVyYXMuc2V0KCBjYW1lcmEsIGxpc3QgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gbGlzdDsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBkaXNwb3NlKCkgewoKICAgIAkJbGlzdHMgPSBuZXcgV2Vha01hcCgpOwoKICAgIAl9CgogICAgCXJldHVybiB7CiAgICAJCWdldDogZ2V0LAogICAgCQlkaXNwb3NlOiBkaXNwb3NlCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gVW5pZm9ybXNDYWNoZSgpIHsKCiAgICAJdmFyIGxpZ2h0cyA9IHt9OwoKICAgIAlyZXR1cm4gewoKICAgIAkJZ2V0OiBmdW5jdGlvbiAoIGxpZ2h0ICkgewoKICAgIAkJCWlmICggbGlnaHRzWyBsaWdodC5pZCBdICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCXJldHVybiBsaWdodHNbIGxpZ2h0LmlkIF07CgogICAgCQkJfQoKICAgIAkJCXZhciB1bmlmb3JtczsKCiAgICAJCQlzd2l0Y2ggKCBsaWdodC50eXBlICkgewoKICAgIAkJCQljYXNlICdEaXJlY3Rpb25hbExpZ2h0JzoKICAgIAkJCQkJdW5pZm9ybXMgPSB7CiAgICAJCQkJCQlkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksCiAgICAJCQkJCQljb2xvcjogbmV3IENvbG9yJDcoKSwKCiAgICAJCQkJCQlzaGFkb3c6IGZhbHNlLAogICAgCQkJCQkJc2hhZG93QmlhczogMCwKICAgIAkJCQkJCXNoYWRvd1JhZGl1czogMSwKICAgIAkJCQkJCXNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCkKICAgIAkJCQkJfTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgJ1Nwb3RMaWdodCc6CiAgICAJCQkJCXVuaWZvcm1zID0gewogICAgCQkJCQkJcG9zaXRpb246IG5ldyBWZWN0b3IzKCksCiAgICAJCQkJCQlkaXJlY3Rpb246IG5ldyBWZWN0b3IzKCksCiAgICAJCQkJCQljb2xvcjogbmV3IENvbG9yJDcoKSwKICAgIAkJCQkJCWRpc3RhbmNlOiAwLAogICAgCQkJCQkJY29uZUNvczogMCwKICAgIAkJCQkJCXBlbnVtYnJhQ29zOiAwLAogICAgCQkJCQkJZGVjYXk6IDAsCgogICAgCQkJCQkJc2hhZG93OiBmYWxzZSwKICAgIAkJCQkJCXNoYWRvd0JpYXM6IDAsCiAgICAJCQkJCQlzaGFkb3dSYWRpdXM6IDEsCiAgICAJCQkJCQlzaGFkb3dNYXBTaXplOiBuZXcgVmVjdG9yMigpCiAgICAJCQkJCX07CiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQljYXNlICdQb2ludExpZ2h0JzoKICAgIAkJCQkJdW5pZm9ybXMgPSB7CiAgICAJCQkJCQlwb3NpdGlvbjogbmV3IFZlY3RvcjMoKSwKICAgIAkJCQkJCWNvbG9yOiBuZXcgQ29sb3IkNygpLAogICAgCQkJCQkJZGlzdGFuY2U6IDAsCiAgICAJCQkJCQlkZWNheTogMCwKCiAgICAJCQkJCQlzaGFkb3c6IGZhbHNlLAogICAgCQkJCQkJc2hhZG93QmlhczogMCwKICAgIAkJCQkJCXNoYWRvd1JhZGl1czogMSwKICAgIAkJCQkJCXNoYWRvd01hcFNpemU6IG5ldyBWZWN0b3IyKCksCiAgICAJCQkJCQlzaGFkb3dDYW1lcmFOZWFyOiAxLAogICAgCQkJCQkJc2hhZG93Q2FtZXJhRmFyOiAxMDAwCiAgICAJCQkJCX07CiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQljYXNlICdIZW1pc3BoZXJlTGlnaHQnOgogICAgCQkJCQl1bmlmb3JtcyA9IHsKICAgIAkJCQkJCWRpcmVjdGlvbjogbmV3IFZlY3RvcjMoKSwKICAgIAkJCQkJCXNreUNvbG9yOiBuZXcgQ29sb3IkNygpLAogICAgCQkJCQkJZ3JvdW5kQ29sb3I6IG5ldyBDb2xvciQ3KCkKICAgIAkJCQkJfTsKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgJ1JlY3RBcmVhTGlnaHQnOgogICAgCQkJCQl1bmlmb3JtcyA9IHsKICAgIAkJCQkJCWNvbG9yOiBuZXcgQ29sb3IkNygpLAogICAgCQkJCQkJcG9zaXRpb246IG5ldyBWZWN0b3IzKCksCiAgICAJCQkJCQloYWxmV2lkdGg6IG5ldyBWZWN0b3IzKCksCiAgICAJCQkJCQloYWxmSGVpZ2h0OiBuZXcgVmVjdG9yMygpCiAgICAJCQkJCQkvLyBUT0RPIChhYmVsbmF0aW9uKTogc2V0IFJlY3RBcmVhTGlnaHQgc2hhZG93IHVuaWZvcm1zCiAgICAJCQkJCX07CiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCX0KCiAgICAJCQlsaWdodHNbIGxpZ2h0LmlkIF0gPSB1bmlmb3JtczsKCiAgICAJCQlyZXR1cm4gdW5pZm9ybXM7CgogICAgCQl9CgogICAgCX07CgogICAgfQoKICAgIHZhciBuZXh0VmVyc2lvbiA9IDA7CgogICAgZnVuY3Rpb24gc2hhZG93Q2FzdGluZ0xpZ2h0c0ZpcnN0KCBsaWdodEEsIGxpZ2h0QiApIHsKCiAgICAJcmV0dXJuICggbGlnaHRCLmNhc3RTaGFkb3cgPyAxIDogMCApIC0gKCBsaWdodEEuY2FzdFNoYWRvdyA/IDEgOiAwICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIFdlYkdMTGlnaHRzKCkgewoKICAgIAl2YXIgY2FjaGUgPSBuZXcgVW5pZm9ybXNDYWNoZSgpOwoKICAgIAl2YXIgc3RhdGUgPSB7CgogICAgCQl2ZXJzaW9uOiAwLAoKICAgIAkJaGFzaDogewogICAgCQkJZGlyZWN0aW9uYWxMZW5ndGg6IC0gMSwKICAgIAkJCXBvaW50TGVuZ3RoOiAtIDEsCiAgICAJCQlzcG90TGVuZ3RoOiAtIDEsCiAgICAJCQlyZWN0QXJlYUxlbmd0aDogLSAxLAogICAgCQkJaGVtaUxlbmd0aDogLSAxLAoKICAgIAkJCW51bURpcmVjdGlvbmFsU2hhZG93czogLSAxLAogICAgCQkJbnVtUG9pbnRTaGFkb3dzOiAtIDEsCiAgICAJCQludW1TcG90U2hhZG93czogLSAxLAogICAgCQl9LAoKICAgIAkJYW1iaWVudDogWyAwLCAwLCAwIF0sCiAgICAJCXByb2JlOiBbXSwKICAgIAkJZGlyZWN0aW9uYWw6IFtdLAogICAgCQlkaXJlY3Rpb25hbFNoYWRvd01hcDogW10sCiAgICAJCWRpcmVjdGlvbmFsU2hhZG93TWF0cml4OiBbXSwKICAgIAkJc3BvdDogW10sCiAgICAJCXNwb3RTaGFkb3dNYXA6IFtdLAogICAgCQlzcG90U2hhZG93TWF0cml4OiBbXSwKICAgIAkJcmVjdEFyZWE6IFtdLAogICAgCQlwb2ludDogW10sCiAgICAJCXBvaW50U2hhZG93TWFwOiBbXSwKICAgIAkJcG9pbnRTaGFkb3dNYXRyaXg6IFtdLAogICAgCQloZW1pOiBbXSwKCiAgICAJCW51bURpcmVjdGlvbmFsU2hhZG93czogLSAxLAogICAgCQludW1Qb2ludFNoYWRvd3M6IC0gMSwKICAgIAkJbnVtU3BvdFNoYWRvd3M6IC0gMQoKICAgIAl9OwoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkgc3RhdGUucHJvYmUucHVzaCggbmV3IFZlY3RvcjMoKSApOwoKICAgIAl2YXIgdmVjdG9yMyA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIG1hdHJpeDQgPSBuZXcgTWF0cml4NCgpOwogICAgCXZhciBtYXRyaXg0MiA9IG5ldyBNYXRyaXg0KCk7CgogICAgCWZ1bmN0aW9uIHNldHVwKCBsaWdodHMsIHNoYWRvd3MsIGNhbWVyYSApIHsKCiAgICAJCXZhciByID0gMCwgZyA9IDAsIGIgPSAwOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHN0YXRlLnByb2JlWyBpIF0uc2V0KCAwLCAwLCAwICk7CgogICAgCQl2YXIgZGlyZWN0aW9uYWxMZW5ndGggPSAwOwogICAgCQl2YXIgcG9pbnRMZW5ndGggPSAwOwogICAgCQl2YXIgc3BvdExlbmd0aCA9IDA7CiAgICAJCXZhciByZWN0QXJlYUxlbmd0aCA9IDA7CiAgICAJCXZhciBoZW1pTGVuZ3RoID0gMDsKCiAgICAJCXZhciBudW1EaXJlY3Rpb25hbFNoYWRvd3MgPSAwOwogICAgCQl2YXIgbnVtUG9pbnRTaGFkb3dzID0gMDsKICAgIAkJdmFyIG51bVNwb3RTaGFkb3dzID0gMDsKCiAgICAJCXZhciB2aWV3TWF0cml4ID0gY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZTsKCiAgICAJCWxpZ2h0cy5zb3J0KCBzaGFkb3dDYXN0aW5nTGlnaHRzRmlyc3QgKTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBsaWdodCA9IGxpZ2h0c1sgaSBdOwoKICAgIAkJCXZhciBjb2xvciA9IGxpZ2h0LmNvbG9yOwogICAgCQkJdmFyIGludGVuc2l0eSA9IGxpZ2h0LmludGVuc2l0eTsKICAgIAkJCXZhciBkaXN0YW5jZSA9IGxpZ2h0LmRpc3RhbmNlOwoKICAgIAkJCXZhciBzaGFkb3dNYXAgPSAoIGxpZ2h0LnNoYWRvdyAmJiBsaWdodC5zaGFkb3cubWFwICkgPyBsaWdodC5zaGFkb3cubWFwLnRleHR1cmUgOiBudWxsOwoKICAgIAkJCWlmICggbGlnaHQuaXNBbWJpZW50TGlnaHQgKSB7CgogICAgCQkJCXIgKz0gY29sb3IuciAqIGludGVuc2l0eTsKICAgIAkJCQlnICs9IGNvbG9yLmcgKiBpbnRlbnNpdHk7CiAgICAJCQkJYiArPSBjb2xvci5iICogaW50ZW5zaXR5OwoKICAgIAkJCX0gZWxzZSBpZiAoIGxpZ2h0LmlzTGlnaHRQcm9iZSApIHsKCiAgICAJCQkJZm9yICggdmFyIGogPSAwOyBqIDwgOTsgaiArKyApIHsKCiAgICAJCQkJCXN0YXRlLnByb2JlWyBqIF0uYWRkU2NhbGVkVmVjdG9yKCBsaWdodC5zaC5jb2VmZmljaWVudHNbIGogXSwgaW50ZW5zaXR5ICk7CgogICAgCQkJCX0KCiAgICAJCQl9IGVsc2UgaWYgKCBsaWdodC5pc0RpcmVjdGlvbmFsTGlnaHQgKSB7CgogICAgCQkJCXZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTsKCiAgICAJCQkJdW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7CiAgICAJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKICAgIAkJCQl2ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQudGFyZ2V0Lm1hdHJpeFdvcmxkICk7CiAgICAJCQkJdW5pZm9ybXMuZGlyZWN0aW9uLnN1YiggdmVjdG9yMyApOwogICAgCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKCiAgICAJCQkJdW5pZm9ybXMuc2hhZG93ID0gbGlnaHQuY2FzdFNoYWRvdzsKCiAgICAJCQkJaWYgKCBsaWdodC5jYXN0U2hhZG93ICkgewoKICAgIAkJCQkJdmFyIHNoYWRvdyA9IGxpZ2h0LnNoYWRvdzsKCiAgICAJCQkJCXVuaWZvcm1zLnNoYWRvd0JpYXMgPSBzaGFkb3cuYmlhczsKICAgIAkJCQkJdW5pZm9ybXMuc2hhZG93UmFkaXVzID0gc2hhZG93LnJhZGl1czsKICAgIAkJCQkJdW5pZm9ybXMuc2hhZG93TWFwU2l6ZSA9IHNoYWRvdy5tYXBTaXplOwoKICAgIAkJCQkJc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXBbIGRpcmVjdGlvbmFsTGVuZ3RoIF0gPSBzaGFkb3dNYXA7CiAgICAJCQkJCXN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWF0cml4WyBkaXJlY3Rpb25hbExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKCiAgICAJCQkJCW51bURpcmVjdGlvbmFsU2hhZG93cyArKzsKCiAgICAJCQkJfQoKICAgIAkJCQlzdGF0ZS5kaXJlY3Rpb25hbFsgZGlyZWN0aW9uYWxMZW5ndGggXSA9IHVuaWZvcm1zOwoKICAgIAkJCQlkaXJlY3Rpb25hbExlbmd0aCArKzsKCiAgICAJCQl9IGVsc2UgaWYgKCBsaWdodC5pc1Nwb3RMaWdodCApIHsKCiAgICAJCQkJdmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApOwoKICAgIAkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CiAgICAJCQkJdW5pZm9ybXMucG9zaXRpb24uYXBwbHlNYXRyaXg0KCB2aWV3TWF0cml4ICk7CgogICAgCQkJCXVuaWZvcm1zLmNvbG9yLmNvcHkoIGNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOwogICAgCQkJCXVuaWZvcm1zLmRpc3RhbmNlID0gZGlzdGFuY2U7CgogICAgCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CiAgICAJCQkJdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApOwogICAgCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi5zdWIoIHZlY3RvcjMgKTsKICAgIAkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24udHJhbnNmb3JtRGlyZWN0aW9uKCB2aWV3TWF0cml4ICk7CgogICAgCQkJCXVuaWZvcm1zLmNvbmVDb3MgPSBNYXRoLmNvcyggbGlnaHQuYW5nbGUgKTsKICAgIAkJCQl1bmlmb3Jtcy5wZW51bWJyYUNvcyA9IE1hdGguY29zKCBsaWdodC5hbmdsZSAqICggMSAtIGxpZ2h0LnBlbnVtYnJhICkgKTsKICAgIAkJCQl1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5OwoKICAgIAkJCQl1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93OwoKICAgIAkJCQlpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CgogICAgCQkJCQl2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93OwoKICAgIAkJCQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOwogICAgCQkJCQl1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzOwogICAgCQkJCQl1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CgogICAgCQkJCQlzdGF0ZS5zcG90U2hhZG93TWFwWyBzcG90TGVuZ3RoIF0gPSBzaGFkb3dNYXA7CiAgICAJCQkJCXN0YXRlLnNwb3RTaGFkb3dNYXRyaXhbIHNwb3RMZW5ndGggXSA9IGxpZ2h0LnNoYWRvdy5tYXRyaXg7CgogICAgCQkJCQludW1TcG90U2hhZG93cyArKzsKCiAgICAJCQkJfQoKICAgIAkJCQlzdGF0ZS5zcG90WyBzcG90TGVuZ3RoIF0gPSB1bmlmb3JtczsKCiAgICAJCQkJc3BvdExlbmd0aCArKzsKCiAgICAJCQl9IGVsc2UgaWYgKCBsaWdodC5pc1JlY3RBcmVhTGlnaHQgKSB7CgogICAgCQkJCXZhciB1bmlmb3JtcyA9IGNhY2hlLmdldCggbGlnaHQgKTsKCiAgICAJCQkJLy8gKGEpIGludGVuc2l0eSBpcyB0aGUgdG90YWwgdmlzaWJsZSBsaWdodCBlbWl0dGVkCiAgICAJCQkJLy91bmlmb3Jtcy5jb2xvci5jb3B5KCBjb2xvciApLm11bHRpcGx5U2NhbGFyKCBpbnRlbnNpdHkgLyAoIGxpZ2h0LndpZHRoICogbGlnaHQuaGVpZ2h0ICogTWF0aC5QSSApICk7CgogICAgCQkJCS8vIChiKSBpbnRlbnNpdHkgaXMgdGhlIGJyaWdodG5lc3Mgb2YgdGhlIGxpZ2h0CiAgICAJCQkJdW5pZm9ybXMuY29sb3IuY29weSggY29sb3IgKS5tdWx0aXBseVNjYWxhciggaW50ZW5zaXR5ICk7CgogICAgCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKICAgIAkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTsKCiAgICAJCQkJLy8gZXh0cmFjdCBsb2NhbCByb3RhdGlvbiBvZiBsaWdodCB0byBkZXJpdmUgd2lkdGgvaGVpZ2h0IGhhbGYgdmVjdG9ycwogICAgCQkJCW1hdHJpeDQyLmlkZW50aXR5KCk7CiAgICAJCQkJbWF0cml4NC5jb3B5KCBsaWdodC5tYXRyaXhXb3JsZCApOwogICAgCQkJCW1hdHJpeDQucHJlbXVsdGlwbHkoIHZpZXdNYXRyaXggKTsKICAgIAkJCQltYXRyaXg0Mi5leHRyYWN0Um90YXRpb24oIG1hdHJpeDQgKTsKCiAgICAJCQkJdW5pZm9ybXMuaGFsZldpZHRoLnNldCggbGlnaHQud2lkdGggKiAwLjUsIDAuMCwgMC4wICk7CiAgICAJCQkJdW5pZm9ybXMuaGFsZkhlaWdodC5zZXQoIDAuMCwgbGlnaHQuaGVpZ2h0ICogMC41LCAwLjAgKTsKCiAgICAJCQkJdW5pZm9ybXMuaGFsZldpZHRoLmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTsKICAgIAkJCQl1bmlmb3Jtcy5oYWxmSGVpZ2h0LmFwcGx5TWF0cml4NCggbWF0cml4NDIgKTsKCiAgICAJCQkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IFJlY3RBcmVhTGlnaHQgZGlzdGFuY2U/CiAgICAJCQkJLy8gdW5pZm9ybXMuZGlzdGFuY2UgPSBkaXN0YW5jZTsKCiAgICAJCQkJc3RhdGUucmVjdEFyZWFbIHJlY3RBcmVhTGVuZ3RoIF0gPSB1bmlmb3JtczsKCiAgICAJCQkJcmVjdEFyZWFMZW5ndGggKys7CgogICAgCQkJfSBlbHNlIGlmICggbGlnaHQuaXNQb2ludExpZ2h0ICkgewoKICAgIAkJCQl2YXIgdW5pZm9ybXMgPSBjYWNoZS5nZXQoIGxpZ2h0ICk7CgogICAgCQkJCXVuaWZvcm1zLnBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKICAgIAkJCQl1bmlmb3Jtcy5wb3NpdGlvbi5hcHBseU1hdHJpeDQoIHZpZXdNYXRyaXggKTsKCiAgICAJCQkJdW5pZm9ybXMuY29sb3IuY29weSggbGlnaHQuY29sb3IgKS5tdWx0aXBseVNjYWxhciggbGlnaHQuaW50ZW5zaXR5ICk7CiAgICAJCQkJdW5pZm9ybXMuZGlzdGFuY2UgPSBsaWdodC5kaXN0YW5jZTsKICAgIAkJCQl1bmlmb3Jtcy5kZWNheSA9IGxpZ2h0LmRlY2F5OwoKICAgIAkJCQl1bmlmb3Jtcy5zaGFkb3cgPSBsaWdodC5jYXN0U2hhZG93OwoKICAgIAkJCQlpZiAoIGxpZ2h0LmNhc3RTaGFkb3cgKSB7CgogICAgCQkJCQl2YXIgc2hhZG93ID0gbGlnaHQuc2hhZG93OwoKICAgIAkJCQkJdW5pZm9ybXMuc2hhZG93QmlhcyA9IHNoYWRvdy5iaWFzOwogICAgCQkJCQl1bmlmb3Jtcy5zaGFkb3dSYWRpdXMgPSBzaGFkb3cucmFkaXVzOwogICAgCQkJCQl1bmlmb3Jtcy5zaGFkb3dNYXBTaXplID0gc2hhZG93Lm1hcFNpemU7CiAgICAJCQkJCXVuaWZvcm1zLnNoYWRvd0NhbWVyYU5lYXIgPSBzaGFkb3cuY2FtZXJhLm5lYXI7CiAgICAJCQkJCXVuaWZvcm1zLnNoYWRvd0NhbWVyYUZhciA9IHNoYWRvdy5jYW1lcmEuZmFyOwoKICAgIAkJCQkJc3RhdGUucG9pbnRTaGFkb3dNYXBbIHBvaW50TGVuZ3RoIF0gPSBzaGFkb3dNYXA7CiAgICAJCQkJCXN0YXRlLnBvaW50U2hhZG93TWF0cml4WyBwb2ludExlbmd0aCBdID0gbGlnaHQuc2hhZG93Lm1hdHJpeDsKCiAgICAJCQkJCW51bVBvaW50U2hhZG93cyArKzsKCiAgICAJCQkJfQoKICAgIAkJCQlzdGF0ZS5wb2ludFsgcG9pbnRMZW5ndGggXSA9IHVuaWZvcm1zOwoKICAgIAkJCQlwb2ludExlbmd0aCArKzsKCiAgICAJCQl9IGVsc2UgaWYgKCBsaWdodC5pc0hlbWlzcGhlcmVMaWdodCApIHsKCiAgICAJCQkJdmFyIHVuaWZvcm1zID0gY2FjaGUuZ2V0KCBsaWdodCApOwoKICAgIAkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24uc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApOwogICAgCQkJCXVuaWZvcm1zLmRpcmVjdGlvbi50cmFuc2Zvcm1EaXJlY3Rpb24oIHZpZXdNYXRyaXggKTsKICAgIAkJCQl1bmlmb3Jtcy5kaXJlY3Rpb24ubm9ybWFsaXplKCk7CgogICAgCQkJCXVuaWZvcm1zLnNreUNvbG9yLmNvcHkoIGxpZ2h0LmNvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOwogICAgCQkJCXVuaWZvcm1zLmdyb3VuZENvbG9yLmNvcHkoIGxpZ2h0Lmdyb3VuZENvbG9yICkubXVsdGlwbHlTY2FsYXIoIGludGVuc2l0eSApOwoKICAgIAkJCQlzdGF0ZS5oZW1pWyBoZW1pTGVuZ3RoIF0gPSB1bmlmb3JtczsKCiAgICAJCQkJaGVtaUxlbmd0aCArKzsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlzdGF0ZS5hbWJpZW50WyAwIF0gPSByOwogICAgCQlzdGF0ZS5hbWJpZW50WyAxIF0gPSBnOwogICAgCQlzdGF0ZS5hbWJpZW50WyAyIF0gPSBiOwoKICAgIAkJdmFyIGhhc2ggPSBzdGF0ZS5oYXNoOwoKICAgIAkJaWYgKCBoYXNoLmRpcmVjdGlvbmFsTGVuZ3RoICE9PSBkaXJlY3Rpb25hbExlbmd0aCB8fAogICAgCQkJaGFzaC5wb2ludExlbmd0aCAhPT0gcG9pbnRMZW5ndGggfHwKICAgIAkJCWhhc2guc3BvdExlbmd0aCAhPT0gc3BvdExlbmd0aCB8fAogICAgCQkJaGFzaC5yZWN0QXJlYUxlbmd0aCAhPT0gcmVjdEFyZWFMZW5ndGggfHwKICAgIAkJCWhhc2guaGVtaUxlbmd0aCAhPT0gaGVtaUxlbmd0aCB8fAogICAgCQkJaGFzaC5udW1EaXJlY3Rpb25hbFNoYWRvd3MgIT09IG51bURpcmVjdGlvbmFsU2hhZG93cyB8fAogICAgCQkJaGFzaC5udW1Qb2ludFNoYWRvd3MgIT09IG51bVBvaW50U2hhZG93cyB8fAogICAgCQkJaGFzaC5udW1TcG90U2hhZG93cyAhPT0gbnVtU3BvdFNoYWRvd3MgKSB7CgogICAgCQkJc3RhdGUuZGlyZWN0aW9uYWwubGVuZ3RoID0gZGlyZWN0aW9uYWxMZW5ndGg7CiAgICAJCQlzdGF0ZS5zcG90Lmxlbmd0aCA9IHNwb3RMZW5ndGg7CiAgICAJCQlzdGF0ZS5yZWN0QXJlYS5sZW5ndGggPSByZWN0QXJlYUxlbmd0aDsKICAgIAkJCXN0YXRlLnBvaW50Lmxlbmd0aCA9IHBvaW50TGVuZ3RoOwogICAgCQkJc3RhdGUuaGVtaS5sZW5ndGggPSBoZW1pTGVuZ3RoOwoKICAgIAkJCXN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwLmxlbmd0aCA9IG51bURpcmVjdGlvbmFsU2hhZG93czsKICAgIAkJCXN0YXRlLnBvaW50U2hhZG93TWFwLmxlbmd0aCA9IG51bVBvaW50U2hhZG93czsKICAgIAkJCXN0YXRlLnNwb3RTaGFkb3dNYXAubGVuZ3RoID0gbnVtU3BvdFNoYWRvd3M7CiAgICAJCQlzdGF0ZS5kaXJlY3Rpb25hbFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1EaXJlY3Rpb25hbFNoYWRvd3M7CiAgICAJCQlzdGF0ZS5wb2ludFNoYWRvd01hdHJpeC5sZW5ndGggPSBudW1Qb2ludFNoYWRvd3M7CiAgICAJCQlzdGF0ZS5zcG90U2hhZG93TWF0cml4Lmxlbmd0aCA9IG51bVNwb3RTaGFkb3dzOwoKICAgIAkJCWhhc2guZGlyZWN0aW9uYWxMZW5ndGggPSBkaXJlY3Rpb25hbExlbmd0aDsKICAgIAkJCWhhc2gucG9pbnRMZW5ndGggPSBwb2ludExlbmd0aDsKICAgIAkJCWhhc2guc3BvdExlbmd0aCA9IHNwb3RMZW5ndGg7CiAgICAJCQloYXNoLnJlY3RBcmVhTGVuZ3RoID0gcmVjdEFyZWFMZW5ndGg7CiAgICAJCQloYXNoLmhlbWlMZW5ndGggPSBoZW1pTGVuZ3RoOwoKICAgIAkJCWhhc2gubnVtRGlyZWN0aW9uYWxTaGFkb3dzID0gbnVtRGlyZWN0aW9uYWxTaGFkb3dzOwogICAgCQkJaGFzaC5udW1Qb2ludFNoYWRvd3MgPSBudW1Qb2ludFNoYWRvd3M7CiAgICAJCQloYXNoLm51bVNwb3RTaGFkb3dzID0gbnVtU3BvdFNoYWRvd3M7CgogICAgCQkJc3RhdGUudmVyc2lvbiA9IG5leHRWZXJzaW9uICsrOwoKICAgIAkJfQoKICAgIAl9CgogICAgCXJldHVybiB7CiAgICAJCXNldHVwOiBzZXR1cCwKICAgIAkJc3RhdGU6IHN0YXRlCiAgICAJfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xSZW5kZXJTdGF0ZSgpIHsKCiAgICAJdmFyIGxpZ2h0cyA9IG5ldyBXZWJHTExpZ2h0cygpOwoKICAgIAl2YXIgbGlnaHRzQXJyYXkgPSBbXTsKICAgIAl2YXIgc2hhZG93c0FycmF5ID0gW107CgogICAgCWZ1bmN0aW9uIGluaXQoKSB7CgogICAgCQlsaWdodHNBcnJheS5sZW5ndGggPSAwOwogICAgCQlzaGFkb3dzQXJyYXkubGVuZ3RoID0gMDsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBwdXNoTGlnaHQoIGxpZ2h0ICkgewoKICAgIAkJbGlnaHRzQXJyYXkucHVzaCggbGlnaHQgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBwdXNoU2hhZG93KCBzaGFkb3dMaWdodCApIHsKCiAgICAJCXNoYWRvd3NBcnJheS5wdXNoKCBzaGFkb3dMaWdodCApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHNldHVwTGlnaHRzKCBjYW1lcmEgKSB7CgogICAgCQlsaWdodHMuc2V0dXAoIGxpZ2h0c0FycmF5LCBzaGFkb3dzQXJyYXksIGNhbWVyYSApOwoKICAgIAl9CgogICAgCXZhciBzdGF0ZSA9IHsKICAgIAkJbGlnaHRzQXJyYXk6IGxpZ2h0c0FycmF5LAogICAgCQlzaGFkb3dzQXJyYXk6IHNoYWRvd3NBcnJheSwKCiAgICAJCWxpZ2h0czogbGlnaHRzCiAgICAJfTsKCiAgICAJcmV0dXJuIHsKICAgIAkJaW5pdDogaW5pdCwKICAgIAkJc3RhdGU6IHN0YXRlLAogICAgCQlzZXR1cExpZ2h0czogc2V0dXBMaWdodHMsCgogICAgCQlwdXNoTGlnaHQ6IHB1c2hMaWdodCwKICAgIAkJcHVzaFNoYWRvdzogcHVzaFNoYWRvdwogICAgCX07CgogICAgfQoKICAgIGZ1bmN0aW9uIFdlYkdMUmVuZGVyU3RhdGVzKCkgewoKICAgIAl2YXIgcmVuZGVyU3RhdGVzID0gbmV3IFdlYWtNYXAoKTsKCiAgICAJZnVuY3Rpb24gb25TY2VuZURpc3Bvc2UoIGV2ZW50ICkgewoKICAgIAkJdmFyIHNjZW5lID0gZXZlbnQudGFyZ2V0OwoKICAgIAkJc2NlbmUucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2Rpc3Bvc2UnLCBvblNjZW5lRGlzcG9zZSApOwoKICAgIAkJcmVuZGVyU3RhdGVzLmRlbGV0ZSggc2NlbmUgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZXQoIHNjZW5lLCBjYW1lcmEgKSB7CgogICAgCQl2YXIgcmVuZGVyU3RhdGU7CgogICAgCQlpZiAoIHJlbmRlclN0YXRlcy5oYXMoIHNjZW5lICkgPT09IGZhbHNlICkgewoKICAgIAkJCXJlbmRlclN0YXRlID0gbmV3IFdlYkdMUmVuZGVyU3RhdGUoKTsKICAgIAkJCXJlbmRlclN0YXRlcy5zZXQoIHNjZW5lLCBuZXcgV2Vha01hcCgpICk7CiAgICAJCQlyZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApLnNldCggY2FtZXJhLCByZW5kZXJTdGF0ZSApOwoKICAgIAkJCXNjZW5lLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25TY2VuZURpc3Bvc2UgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJaWYgKCByZW5kZXJTdGF0ZXMuZ2V0KCBzY2VuZSApLmhhcyggY2FtZXJhICkgPT09IGZhbHNlICkgewoKICAgIAkJCQlyZW5kZXJTdGF0ZSA9IG5ldyBXZWJHTFJlbmRlclN0YXRlKCk7CiAgICAJCQkJcmVuZGVyU3RhdGVzLmdldCggc2NlbmUgKS5zZXQoIGNhbWVyYSwgcmVuZGVyU3RhdGUgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlyZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lICkuZ2V0KCBjYW1lcmEgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gcmVuZGVyU3RhdGU7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZGlzcG9zZSgpIHsKCiAgICAJCXJlbmRlclN0YXRlcyA9IG5ldyBXZWFrTWFwKCk7CgogICAgCX0KCiAgICAJcmV0dXJuIHsKICAgIAkJZ2V0OiBnZXQsCiAgICAJCWRpc3Bvc2U6IGRpc3Bvc2UKICAgIAl9OwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHBzOi8vY2xhcmEuaW8KICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKgogICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCiAgICAgKgogICAgICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKICAgICAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKICAgICAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4KICAgICAqIH0KICAgICAqLwoKICAgIGZ1bmN0aW9uIE1lc2hEZXB0aE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdNZXNoRGVwdGhNYXRlcmlhbCc7CgogICAgCXRoaXMuZGVwdGhQYWNraW5nID0gQmFzaWNEZXB0aFBhY2tpbmc7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwoKICAgIAl0aGlzLm1hcCA9IG51bGw7CgogICAgCXRoaXMuYWxwaGFNYXAgPSBudWxsOwoKICAgIAl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKCiAgICAJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CgogICAgCXRoaXMuZm9nID0gZmFsc2U7CiAgICAJdGhpcy5saWdodHMgPSBmYWxzZTsKCiAgICAJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCiAgICB9CgogICAgTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CiAgICBNZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGVwdGhNYXRlcmlhbDsKCiAgICBNZXNoRGVwdGhNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGVwdGhNYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaERlcHRoTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMuZGVwdGhQYWNraW5nID0gc291cmNlLmRlcHRoUGFja2luZzsKCiAgICAJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CgogICAgCXRoaXMubWFwID0gc291cmNlLm1hcDsKCiAgICAJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCiAgICAJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwogICAgCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CgogICAgCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqCiAgICAgKiBwYXJhbWV0ZXJzID0gewogICAgICoKICAgICAqICByZWZlcmVuY2VQb3NpdGlvbjogPGZsb2F0PiwKICAgICAqICBuZWFyRGlzdGFuY2U6IDxmbG9hdD4sCiAgICAgKiAgZmFyRGlzdGFuY2U6IDxmbG9hdD4sCiAgICAgKgogICAgICogIHNraW5uaW5nOiA8Ym9vbD4sCiAgICAgKiAgbW9ycGhUYXJnZXRzOiA8Ym9vbD4sCiAgICAgKgogICAgICogIG1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgYWxwaGFNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKICAgICAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+CiAgICAgKgogICAgICogfQogICAgICovCgogICAgZnVuY3Rpb24gTWVzaERpc3RhbmNlTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ01lc2hEaXN0YW5jZU1hdGVyaWFsJzsKCiAgICAJdGhpcy5yZWZlcmVuY2VQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdGhpcy5uZWFyRGlzdGFuY2UgPSAxOwogICAgCXRoaXMuZmFyRGlzdGFuY2UgPSAxMDAwOwoKICAgIAl0aGlzLnNraW5uaW5nID0gZmFsc2U7CiAgICAJdGhpcy5tb3JwaFRhcmdldHMgPSBmYWxzZTsKCiAgICAJdGhpcy5tYXAgPSBudWxsOwoKICAgIAl0aGlzLmFscGhhTWFwID0gbnVsbDsKCiAgICAJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwogICAgCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CgogICAgCXRoaXMuZm9nID0gZmFsc2U7CiAgICAJdGhpcy5saWdodHMgPSBmYWxzZTsKCiAgICAJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCiAgICB9CgogICAgTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CiAgICBNZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoRGlzdGFuY2VNYXRlcmlhbDsKCiAgICBNZXNoRGlzdGFuY2VNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoRGlzdGFuY2VNYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaERpc3RhbmNlTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMucmVmZXJlbmNlUG9zaXRpb24uY29weSggc291cmNlLnJlZmVyZW5jZVBvc2l0aW9uICk7CiAgICAJdGhpcy5uZWFyRGlzdGFuY2UgPSBzb3VyY2UubmVhckRpc3RhbmNlOwogICAgCXRoaXMuZmFyRGlzdGFuY2UgPSBzb3VyY2UuZmFyRGlzdGFuY2U7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CiAgICAJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwoKICAgIAl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CgogICAgCXRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CgogICAgCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKICAgIAl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwogICAgCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIHZhciB2c21fZnJhZyA9ICJ1bmlmb3JtIHNhbXBsZXIyRCBzaGFkb3dfcGFzcztcbnVuaWZvcm0gdmVjMiByZXNvbHV0aW9uO1xudW5pZm9ybSBmbG9hdCByYWRpdXM7XG4jaW5jbHVkZSA8cGFja2luZz5cbnZvaWQgbWFpbigpIHtcbiAgZmxvYXQgbWVhbiA9IDAuMDtcbiAgZmxvYXQgc3F1YXJlZF9tZWFuID0gMC4wO1xuICBcblx0ZmxvYXQgZGVwdGggPSB1bnBhY2tSR0JBVG9EZXB0aCggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgICkgLyByZXNvbHV0aW9uICkgKTtcbiAgZm9yICggZmxvYXQgaSA9IC0xLjA7IGkgPCAxLjAgOyBpICs9IFNBTVBMRV9SQVRFKSB7XG4gICAgI2lmZGVmIEhPUklaT05BTF9QQVNTXG4gICAgICB2ZWMyIGRpc3RyaWJ1dGlvbiA9IGRlY29kZUhhbGZSR0JBICggdGV4dHVyZTJEKCBzaGFkb3dfcGFzcywgKCBnbF9GcmFnQ29vcmQueHkgKyB2ZWMyKCBpLCAwLjAgKSAqIHJhZGl1cyApIC8gcmVzb2x1dGlvbiApICk7XG4gICAgICBtZWFuICs9IGRpc3RyaWJ1dGlvbi54O1xuICAgICAgc3F1YXJlZF9tZWFuICs9IGRpc3RyaWJ1dGlvbi55ICogZGlzdHJpYnV0aW9uLnkgKyBkaXN0cmlidXRpb24ueCAqIGRpc3RyaWJ1dGlvbi54O1xuICAgICNlbHNlXG4gICAgICBmbG9hdCBkZXB0aCA9IHVucGFja1JHQkFUb0RlcHRoKCB0ZXh0dXJlMkQoIHNoYWRvd19wYXNzLCAoIGdsX0ZyYWdDb29yZC54eSArIHZlYzIoIDAuMCwgIGkgKSAgKiByYWRpdXMgKSAvIHJlc29sdXRpb24gKSApO1xuICAgICAgbWVhbiArPSBkZXB0aDtcbiAgICAgIHNxdWFyZWRfbWVhbiArPSBkZXB0aCAqIGRlcHRoO1xuICAgICNlbmRpZlxuICB9XG4gIG1lYW4gPSBtZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgc3F1YXJlZF9tZWFuID0gc3F1YXJlZF9tZWFuICogSEFMRl9TQU1QTEVfUkFURTtcbiAgZmxvYXQgc3RkX2RldiA9IHBvdyggc3F1YXJlZF9tZWFuIC0gbWVhbiAqIG1lYW4sIDAuNSApO1xuICBnbF9GcmFnQ29sb3IgPSBlbmNvZGVIYWxmUkdCQSggdmVjMiggbWVhbiwgc3RkX2RldiApICk7XG59IjsKCiAgICB2YXIgdnNtX3ZlcnQgPSAidm9pZCBtYWluKCkge1xuXHRnbF9Qb3NpdGlvbiA9IHZlYzQoIHBvc2l0aW9uLCAxLjAgKTtcbn0iOwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBXZWJHTFNoYWRvd01hcCggX3JlbmRlcmVyLCBfb2JqZWN0cywgbWF4VGV4dHVyZVNpemUgKSB7CgogICAgCXZhciBfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksCgogICAgCQlfc2hhZG93TWFwU2l6ZSA9IG5ldyBWZWN0b3IyKCksCiAgICAJCV92aWV3cG9ydFNpemUgPSBuZXcgVmVjdG9yMigpLAoKICAgIAkJX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKSwKCiAgICAJCV9Nb3JwaGluZ0ZsYWcgPSAxLAogICAgCQlfU2tpbm5pbmdGbGFnID0gMiwKCiAgICAJCV9OdW1iZXJPZk1hdGVyaWFsVmFyaWFudHMgPSAoIF9Nb3JwaGluZ0ZsYWcgfCBfU2tpbm5pbmdGbGFnICkgKyAxLAoKICAgIAkJX2RlcHRoTWF0ZXJpYWxzID0gbmV3IEFycmF5KCBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzICksCiAgICAJCV9kaXN0YW5jZU1hdGVyaWFscyA9IG5ldyBBcnJheSggX051bWJlck9mTWF0ZXJpYWxWYXJpYW50cyApLAoKICAgIAkJX21hdGVyaWFsQ2FjaGUgPSB7fTsKCiAgICAJdmFyIHNoYWRvd1NpZGUgPSB7IDA6IEJhY2tTaWRlLCAxOiBGcm9udFNpZGUsIDI6IERvdWJsZVNpZGUgfTsKCiAgICAJdmFyIHNoYWRvd01hdGVyaWFsVmVydGljYWwgPSBuZXcgU2hhZGVyTWF0ZXJpYWwoIHsKCiAgICAJCWRlZmluZXM6IHsKICAgIAkJCVNBTVBMRV9SQVRFOiAyLjAgLyA4LjAsCiAgICAJCQlIQUxGX1NBTVBMRV9SQVRFOiAxLjAgLyA4LjAKICAgIAkJfSwKCiAgICAJCXVuaWZvcm1zOiB7CiAgICAJCQlzaGFkb3dfcGFzczogeyB2YWx1ZTogbnVsbCB9LAogICAgCQkJcmVzb2x1dGlvbjogeyB2YWx1ZTogbmV3IFZlY3RvcjIoKSB9LAogICAgCQkJcmFkaXVzOiB7IHZhbHVlOiA0LjAgfQogICAgCQl9LAoKICAgIAkJdmVydGV4U2hhZGVyOiB2c21fdmVydCwKCiAgICAJCWZyYWdtZW50U2hhZGVyOiB2c21fZnJhZwoKICAgIAl9ICk7CgogICAgCXZhciBzaGFkb3dNYXRlcmlhbEhvcml6b25hbCA9IHNoYWRvd01hdGVyaWFsVmVydGljYWwuY2xvbmUoKTsKICAgIAlzaGFkb3dNYXRlcmlhbEhvcml6b25hbC5kZWZpbmVzLkhPUklaT05BTF9QQVNTID0gMTsKCiAgICAJdmFyIGZ1bGxTY3JlZW5UcmkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlmdWxsU2NyZWVuVHJpLmFkZEF0dHJpYnV0ZSgKICAgIAkJInBvc2l0aW9uIiwKICAgIAkJbmV3IEJ1ZmZlckF0dHJpYnV0ZSgKICAgIAkJCW5ldyBGbG9hdDMyQXJyYXkoIFsgLSAxLCAtIDEsIDAuNSwgMywgLSAxLCAwLjUsIC0gMSwgMywgMC41IF0gKSwKICAgIAkJCTMKICAgIAkJKQogICAgCSk7CgogICAgCXZhciBmdWxsU2NyZWVuTWVzaCA9IG5ldyBNZXNoKCBmdWxsU2NyZWVuVHJpLCBzaGFkb3dNYXRlcmlhbFZlcnRpY2FsICk7CgogICAgCS8vIGluaXQKCiAgICAJZm9yICggdmFyIGkgPSAwOyBpICE9PSBfTnVtYmVyT2ZNYXRlcmlhbFZhcmlhbnRzOyArKyBpICkgewoKICAgIAkJdmFyIHVzZU1vcnBoaW5nID0gKCBpICYgX01vcnBoaW5nRmxhZyApICE9PSAwOwogICAgCQl2YXIgdXNlU2tpbm5pbmcgPSAoIGkgJiBfU2tpbm5pbmdGbGFnICkgIT09IDA7CgogICAgCQl2YXIgZGVwdGhNYXRlcmlhbCA9IG5ldyBNZXNoRGVwdGhNYXRlcmlhbCggewoKICAgIAkJCWRlcHRoUGFja2luZzogUkdCQURlcHRoUGFja2luZywKCiAgICAJCQltb3JwaFRhcmdldHM6IHVzZU1vcnBoaW5nLAogICAgCQkJc2tpbm5pbmc6IHVzZVNraW5uaW5nCgogICAgCQl9ICk7CgogICAgCQlfZGVwdGhNYXRlcmlhbHNbIGkgXSA9IGRlcHRoTWF0ZXJpYWw7CgogICAgCQl2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBNZXNoRGlzdGFuY2VNYXRlcmlhbCggewoKICAgIAkJCW1vcnBoVGFyZ2V0czogdXNlTW9ycGhpbmcsCiAgICAJCQlza2lubmluZzogdXNlU2tpbm5pbmcKCiAgICAJCX0gKTsKCiAgICAJCV9kaXN0YW5jZU1hdGVyaWFsc1sgaSBdID0gZGlzdGFuY2VNYXRlcmlhbDsKCiAgICAJfQoKICAgIAl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAl0aGlzLmVuYWJsZWQgPSBmYWxzZTsKCiAgICAJdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKICAgIAl0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7CgogICAgCXRoaXMudHlwZSA9IFBDRlNoYWRvd01hcDsKCiAgICAJdGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIGxpZ2h0cywgc2NlbmUsIGNhbWVyYSApIHsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CiAgICAJCWlmICggc2NvcGUuYXV0b1VwZGF0ZSA9PT0gZmFsc2UgJiYgc2NvcGUubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJaWYgKCBsaWdodHMubGVuZ3RoID09PSAwICkgcmV0dXJuOwoKICAgIAkJdmFyIGN1cnJlbnRSZW5kZXJUYXJnZXQgPSBfcmVuZGVyZXIuZ2V0UmVuZGVyVGFyZ2V0KCk7CiAgICAJCXZhciBhY3RpdmVDdWJlRmFjZSA9IF9yZW5kZXJlci5nZXRBY3RpdmVDdWJlRmFjZSgpOwogICAgCQl2YXIgYWN0aXZlTWlwbWFwTGV2ZWwgPSBfcmVuZGVyZXIuZ2V0QWN0aXZlTWlwbWFwTGV2ZWwoKTsKCiAgICAJCXZhciBfc3RhdGUgPSBfcmVuZGVyZXIuc3RhdGU7CgogICAgCQkvLyBTZXQgR0wgc3RhdGUgZm9yIGRlcHRoIG1hcC4KICAgIAkJX3N0YXRlLnNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7CiAgICAJCV9zdGF0ZS5idWZmZXJzLmNvbG9yLnNldENsZWFyKCAxLCAxLCAxLCAxICk7CiAgICAJCV9zdGF0ZS5idWZmZXJzLmRlcHRoLnNldFRlc3QoIHRydWUgKTsKICAgIAkJX3N0YXRlLnNldFNjaXNzb3JUZXN0KCBmYWxzZSApOwoKICAgIAkJLy8gcmVuZGVyIGRlcHRoIG1hcAoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGxpZ2h0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl2YXIgbGlnaHQgPSBsaWdodHNbIGkgXTsKICAgIAkJCXZhciBzaGFkb3cgPSBsaWdodC5zaGFkb3c7CgogICAgCQkJaWYgKCBzaGFkb3cgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xTaGFkb3dNYXA6JywgbGlnaHQsICdoYXMgbm8gc2hhZG93LicgKTsKICAgIAkJCQljb250aW51ZTsKCiAgICAJCQl9CgogICAgCQkJX3NoYWRvd01hcFNpemUuY29weSggc2hhZG93Lm1hcFNpemUgKTsKCiAgICAJCQl2YXIgc2hhZG93RnJhbWVFeHRlbnRzID0gc2hhZG93LmdldEZyYW1lRXh0ZW50cygpOwoKICAgIAkJCV9zaGFkb3dNYXBTaXplLm11bHRpcGx5KCBzaGFkb3dGcmFtZUV4dGVudHMgKTsKCiAgICAJCQlfdmlld3BvcnRTaXplLmNvcHkoIHNoYWRvdy5tYXBTaXplICk7CgogICAgCQkJaWYgKCBfc2hhZG93TWFwU2l6ZS54ID4gbWF4VGV4dHVyZVNpemUgfHwgX3NoYWRvd01hcFNpemUueSA+IG1heFRleHR1cmVTaXplICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDonLCBsaWdodCwgJ2hhcyBzaGFkb3cgZXhjZWVkaW5nIG1heCB0ZXh0dXJlIHNpemUsIHJlZHVjaW5nJyApOwoKICAgIAkJCQlpZiAoIF9zaGFkb3dNYXBTaXplLnggPiBtYXhUZXh0dXJlU2l6ZSApIHsKCiAgICAJCQkJCV92aWV3cG9ydFNpemUueCA9IE1hdGguZmxvb3IoIG1heFRleHR1cmVTaXplIC8gc2hhZG93RnJhbWVFeHRlbnRzLnggKTsKICAgIAkJCQkJX3NoYWRvd01hcFNpemUueCA9IF92aWV3cG9ydFNpemUueCAqIHNoYWRvd0ZyYW1lRXh0ZW50cy54OwogICAgCQkJCQlzaGFkb3cubWFwU2l6ZS54ID0gX3ZpZXdwb3J0U2l6ZS54OwoKICAgIAkJCQl9CgogICAgCQkJCWlmICggX3NoYWRvd01hcFNpemUueSA+IG1heFRleHR1cmVTaXplICkgewoKICAgIAkJCQkJX3ZpZXdwb3J0U2l6ZS55ID0gTWF0aC5mbG9vciggbWF4VGV4dHVyZVNpemUgLyBzaGFkb3dGcmFtZUV4dGVudHMueSApOwogICAgCQkJCQlfc2hhZG93TWFwU2l6ZS55ID0gX3ZpZXdwb3J0U2l6ZS55ICogc2hhZG93RnJhbWVFeHRlbnRzLnk7CiAgICAJCQkJCXNoYWRvdy5tYXBTaXplLnkgPSBfdmlld3BvcnRTaXplLnk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJaWYgKCBzaGFkb3cubWFwID09PSBudWxsICYmICEgc2hhZG93LmlzUG9pbnRMaWdodFNoYWRvdyAmJiB0aGlzLnR5cGUgPT09IFZTTVNoYWRvd01hcCApIHsKCiAgICAJCQkJdmFyIHBhcnMgPSB7IG1pbkZpbHRlcjogTGluZWFyRmlsdGVyLCBtYWdGaWx0ZXI6IExpbmVhckZpbHRlciwgZm9ybWF0OiBSR0JBRm9ybWF0IH07CgogICAgCQkJCXNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTsKICAgIAkJCQlzaGFkb3cubWFwLnRleHR1cmUubmFtZSA9IGxpZ2h0Lm5hbWUgKyAiLnNoYWRvd01hcCI7CgogICAgCQkJCXNoYWRvdy5tYXBQYXNzID0gbmV3IFdlYkdMUmVuZGVyVGFyZ2V0KCBfc2hhZG93TWFwU2l6ZS54LCBfc2hhZG93TWFwU2l6ZS55LCBwYXJzICk7CgogICAgCQkJCXNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIHNoYWRvdy5tYXAgPT09IG51bGwgKSB7CgogICAgCQkJCXZhciBwYXJzID0geyBtaW5GaWx0ZXI6IE5lYXJlc3RGaWx0ZXIsIG1hZ0ZpbHRlcjogTmVhcmVzdEZpbHRlciwgZm9ybWF0OiBSR0JBRm9ybWF0IH07CgogICAgCQkJCXNoYWRvdy5tYXAgPSBuZXcgV2ViR0xSZW5kZXJUYXJnZXQoIF9zaGFkb3dNYXBTaXplLngsIF9zaGFkb3dNYXBTaXplLnksIHBhcnMgKTsKICAgIAkJCQlzaGFkb3cubWFwLnRleHR1cmUubmFtZSA9IGxpZ2h0Lm5hbWUgKyAiLnNoYWRvd01hcCI7CgogICAgCQkJCXNoYWRvdy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKICAgIAkJCX0KCiAgICAJCQlfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwICk7CiAgICAJCQlfcmVuZGVyZXIuY2xlYXIoKTsKCiAgICAJCQl2YXIgdmlld3BvcnRDb3VudCA9IHNoYWRvdy5nZXRWaWV3cG9ydENvdW50KCk7CgogICAgCQkJZm9yICggdmFyIHZwID0gMDsgdnAgPCB2aWV3cG9ydENvdW50OyB2cCArKyApIHsKCiAgICAJCQkJdmFyIHZpZXdwb3J0ID0gc2hhZG93LmdldFZpZXdwb3J0KCB2cCApOwoKICAgIAkJCQlfdmlld3BvcnQuc2V0KAogICAgCQkJCQlfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC54LAogICAgCQkJCQlfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC55LAogICAgCQkJCQlfdmlld3BvcnRTaXplLnggKiB2aWV3cG9ydC56LAogICAgCQkJCQlfdmlld3BvcnRTaXplLnkgKiB2aWV3cG9ydC53CiAgICAJCQkJKTsKCiAgICAJCQkJX3N0YXRlLnZpZXdwb3J0KCBfdmlld3BvcnQgKTsKCiAgICAJCQkJc2hhZG93LnVwZGF0ZU1hdHJpY2VzKCBsaWdodCwgY2FtZXJhLCB2cCApOwoKICAgIAkJCQlfZnJ1c3R1bSA9IHNoYWRvdy5nZXRGcnVzdHVtKCk7CgogICAgCQkJCXJlbmRlck9iamVjdCggc2NlbmUsIGNhbWVyYSwgc2hhZG93LmNhbWVyYSwgbGlnaHQsIHRoaXMudHlwZSApOwoKICAgIAkJCX0KCiAgICAJCQkvLyBkbyBibHVyIHBhc3MgZm9yIFZTTQoKICAgIAkJCWlmICggISBzaGFkb3cuaXNQb2ludExpZ2h0U2hhZG93ICYmIHRoaXMudHlwZSA9PT0gVlNNU2hhZG93TWFwICkgewoKICAgIAkJCQlWU01QYXNzKCBzaGFkb3csIGNhbWVyYSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXNjb3BlLm5lZWRzVXBkYXRlID0gZmFsc2U7CgogICAgCQlfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBjdXJyZW50UmVuZGVyVGFyZ2V0LCBhY3RpdmVDdWJlRmFjZSwgYWN0aXZlTWlwbWFwTGV2ZWwgKTsKCiAgICAJfTsKCiAgICAJZnVuY3Rpb24gVlNNUGFzcyggc2hhZG93LCBjYW1lcmEgKSB7CgogICAgCQl2YXIgZ2VvbWV0cnkgPSBfb2JqZWN0cy51cGRhdGUoIGZ1bGxTY3JlZW5NZXNoICk7CgogICAgCQkvLyB2ZXJ0aWNhbCBwYXNzCgogICAgCQlzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLnVuaWZvcm1zLnNoYWRvd19wYXNzLnZhbHVlID0gc2hhZG93Lm1hcC50ZXh0dXJlOwogICAgCQlzaGFkb3dNYXRlcmlhbFZlcnRpY2FsLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBzaGFkb3cubWFwU2l6ZTsKICAgIAkJc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbC51bmlmb3Jtcy5yYWRpdXMudmFsdWUgPSBzaGFkb3cucmFkaXVzOwogICAgCQlfcmVuZGVyZXIuc2V0UmVuZGVyVGFyZ2V0KCBzaGFkb3cubWFwUGFzcyApOwogICAgCQlfcmVuZGVyZXIuY2xlYXIoKTsKICAgIAkJX3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgc2hhZG93TWF0ZXJpYWxWZXJ0aWNhbCwgZnVsbFNjcmVlbk1lc2gsIG51bGwgKTsKCiAgICAJCS8vIGhvcml6b25hbCBwYXNzCgogICAgCQlzaGFkb3dNYXRlcmlhbEhvcml6b25hbC51bmlmb3Jtcy5zaGFkb3dfcGFzcy52YWx1ZSA9IHNoYWRvdy5tYXBQYXNzLnRleHR1cmU7CiAgICAJCXNoYWRvd01hdGVyaWFsSG9yaXpvbmFsLnVuaWZvcm1zLnJlc29sdXRpb24udmFsdWUgPSBzaGFkb3cubWFwU2l6ZTsKICAgIAkJc2hhZG93TWF0ZXJpYWxIb3Jpem9uYWwudW5pZm9ybXMucmFkaXVzLnZhbHVlID0gc2hhZG93LnJhZGl1czsKICAgIAkJX3JlbmRlcmVyLnNldFJlbmRlclRhcmdldCggc2hhZG93Lm1hcCApOwogICAgCQlfcmVuZGVyZXIuY2xlYXIoKTsKICAgIAkJX3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgc2hhZG93TWF0ZXJpYWxIb3Jpem9uYWwsIGZ1bGxTY3JlZW5NZXNoLCBudWxsICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZ2V0RGVwdGhNYXRlcmlhbCggb2JqZWN0LCBtYXRlcmlhbCwgbGlnaHQsIHNoYWRvd0NhbWVyYU5lYXIsIHNoYWRvd0NhbWVyYUZhciwgdHlwZSApIHsKCiAgICAJCXZhciBnZW9tZXRyeSA9IG9iamVjdC5nZW9tZXRyeTsKCiAgICAJCXZhciByZXN1bHQgPSBudWxsOwoKICAgIAkJdmFyIG1hdGVyaWFsVmFyaWFudHMgPSBfZGVwdGhNYXRlcmlhbHM7CiAgICAJCXZhciBjdXN0b21NYXRlcmlhbCA9IG9iamVjdC5jdXN0b21EZXB0aE1hdGVyaWFsOwoKICAgIAkJaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgKSB7CgogICAgCQkJbWF0ZXJpYWxWYXJpYW50cyA9IF9kaXN0YW5jZU1hdGVyaWFsczsKICAgIAkJCWN1c3RvbU1hdGVyaWFsID0gb2JqZWN0LmN1c3RvbURpc3RhbmNlTWF0ZXJpYWw7CgogICAgCQl9CgogICAgCQlpZiAoICEgY3VzdG9tTWF0ZXJpYWwgKSB7CgogICAgCQkJdmFyIHVzZU1vcnBoaW5nID0gZmFsc2U7CgogICAgCQkJaWYgKCBtYXRlcmlhbC5tb3JwaFRhcmdldHMgKSB7CgogICAgCQkJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCiAgICAJCQkJCXVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzICYmIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy5wb3NpdGlvbiAmJiBnZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb24ubGVuZ3RoID4gMDsKCiAgICAJCQkJfSBlbHNlIGlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCQkJCXVzZU1vcnBoaW5nID0gZ2VvbWV0cnkubW9ycGhUYXJnZXRzICYmIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCWlmICggb2JqZWN0LmlzU2tpbm5lZE1lc2ggJiYgbWF0ZXJpYWwuc2tpbm5pbmcgPT09IGZhbHNlICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFNoYWRvd01hcDogVEhSRUUuU2tpbm5lZE1lc2ggd2l0aCBtYXRlcmlhbC5za2lubmluZyBzZXQgdG8gZmFsc2U6Jywgb2JqZWN0ICk7CgogICAgCQkJfQoKICAgIAkJCXZhciB1c2VTa2lubmluZyA9IG9iamVjdC5pc1NraW5uZWRNZXNoICYmIG1hdGVyaWFsLnNraW5uaW5nOwoKICAgIAkJCXZhciB2YXJpYW50SW5kZXggPSAwOwoKICAgIAkJCWlmICggdXNlTW9ycGhpbmcgKSB2YXJpYW50SW5kZXggfD0gX01vcnBoaW5nRmxhZzsKICAgIAkJCWlmICggdXNlU2tpbm5pbmcgKSB2YXJpYW50SW5kZXggfD0gX1NraW5uaW5nRmxhZzsKCiAgICAJCQlyZXN1bHQgPSBtYXRlcmlhbFZhcmlhbnRzWyB2YXJpYW50SW5kZXggXTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJcmVzdWx0ID0gY3VzdG9tTWF0ZXJpYWw7CgogICAgCQl9CgogICAgCQlpZiAoIF9yZW5kZXJlci5sb2NhbENsaXBwaW5nRW5hYmxlZCAmJgogICAgCQkJCW1hdGVyaWFsLmNsaXBTaGFkb3dzID09PSB0cnVlICYmCiAgICAJCQkJbWF0ZXJpYWwuY2xpcHBpbmdQbGFuZXMubGVuZ3RoICE9PSAwICkgewoKICAgIAkJCS8vIGluIHRoaXMgY2FzZSB3ZSBuZWVkIGEgdW5pcXVlIG1hdGVyaWFsIGluc3RhbmNlIHJlZmxlY3RpbmcgdGhlCiAgICAJCQkvLyBhcHByb3ByaWF0ZSBzdGF0ZQoKICAgIAkJCXZhciBrZXlBID0gcmVzdWx0LnV1aWQsIGtleUIgPSBtYXRlcmlhbC51dWlkOwoKICAgIAkJCXZhciBtYXRlcmlhbHNGb3JWYXJpYW50ID0gX21hdGVyaWFsQ2FjaGVbIGtleUEgXTsKCiAgICAJCQlpZiAoIG1hdGVyaWFsc0ZvclZhcmlhbnQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJbWF0ZXJpYWxzRm9yVmFyaWFudCA9IHt9OwogICAgCQkJCV9tYXRlcmlhbENhY2hlWyBrZXlBIF0gPSBtYXRlcmlhbHNGb3JWYXJpYW50OwoKICAgIAkJCX0KCiAgICAJCQl2YXIgY2FjaGVkTWF0ZXJpYWwgPSBtYXRlcmlhbHNGb3JWYXJpYW50WyBrZXlCIF07CgogICAgCQkJaWYgKCBjYWNoZWRNYXRlcmlhbCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQljYWNoZWRNYXRlcmlhbCA9IHJlc3VsdC5jbG9uZSgpOwogICAgCQkJCW1hdGVyaWFsc0ZvclZhcmlhbnRbIGtleUIgXSA9IGNhY2hlZE1hdGVyaWFsOwoKICAgIAkJCX0KCiAgICAJCQlyZXN1bHQgPSBjYWNoZWRNYXRlcmlhbDsKCiAgICAJCX0KCiAgICAJCXJlc3VsdC52aXNpYmxlID0gbWF0ZXJpYWwudmlzaWJsZTsKICAgIAkJcmVzdWx0LndpcmVmcmFtZSA9IG1hdGVyaWFsLndpcmVmcmFtZTsKCiAgICAJCWlmICggdHlwZSA9PT0gVlNNU2hhZG93TWFwICkgewoKICAgIAkJCXJlc3VsdC5zaWRlID0gKCBtYXRlcmlhbC5zaGFkb3dTaWRlICE9IG51bGwgKSA/IG1hdGVyaWFsLnNoYWRvd1NpZGUgOiBtYXRlcmlhbC5zaWRlOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlyZXN1bHQuc2lkZSA9ICggbWF0ZXJpYWwuc2hhZG93U2lkZSAhPSBudWxsICkgPyBtYXRlcmlhbC5zaGFkb3dTaWRlIDogc2hhZG93U2lkZVsgbWF0ZXJpYWwuc2lkZSBdOwoKICAgIAkJfQoKICAgIAkJcmVzdWx0LmNsaXBTaGFkb3dzID0gbWF0ZXJpYWwuY2xpcFNoYWRvd3M7CiAgICAJCXJlc3VsdC5jbGlwcGluZ1BsYW5lcyA9IG1hdGVyaWFsLmNsaXBwaW5nUGxhbmVzOwogICAgCQlyZXN1bHQuY2xpcEludGVyc2VjdGlvbiA9IG1hdGVyaWFsLmNsaXBJbnRlcnNlY3Rpb247CgogICAgCQlyZXN1bHQud2lyZWZyYW1lTGluZXdpZHRoID0gbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoOwogICAgCQlyZXN1bHQubGluZXdpZHRoID0gbWF0ZXJpYWwubGluZXdpZHRoOwoKICAgIAkJaWYgKCBsaWdodC5pc1BvaW50TGlnaHQgJiYgcmVzdWx0LmlzTWVzaERpc3RhbmNlTWF0ZXJpYWwgKSB7CgogICAgCQkJcmVzdWx0LnJlZmVyZW5jZVBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggbGlnaHQubWF0cml4V29ybGQgKTsKICAgIAkJCXJlc3VsdC5uZWFyRGlzdGFuY2UgPSBzaGFkb3dDYW1lcmFOZWFyOwogICAgCQkJcmVzdWx0LmZhckRpc3RhbmNlID0gc2hhZG93Q2FtZXJhRmFyOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHJlc3VsdDsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZW5kZXJPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGxpZ2h0LCB0eXBlICkgewoKICAgIAkJaWYgKCBvYmplY3QudmlzaWJsZSA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQl2YXIgdmlzaWJsZSA9IG9iamVjdC5sYXllcnMudGVzdCggY2FtZXJhLmxheWVycyApOwoKICAgIAkJaWYgKCB2aXNpYmxlICYmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApICkgewoKICAgIAkJCWlmICggKCBvYmplY3QuY2FzdFNoYWRvdyB8fCAoIG9iamVjdC5yZWNlaXZlU2hhZG93ICYmIHR5cGUgPT09IFZTTVNoYWRvd01hcCApICkgJiYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNPYmplY3QoIG9iamVjdCApICkgKSB7CgogICAgCQkJCW9iamVjdC5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSwgb2JqZWN0Lm1hdHJpeFdvcmxkICk7CgogICAgCQkJCXZhciBnZW9tZXRyeSA9IF9vYmplY3RzLnVwZGF0ZSggb2JqZWN0ICk7CiAgICAJCQkJdmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKICAgIAkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7CgogICAgCQkJCQl2YXIgZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKICAgIAkJCQkJZm9yICggdmFyIGsgPSAwLCBrbCA9IGdyb3Vwcy5sZW5ndGg7IGsgPCBrbDsgayArKyApIHsKCiAgICAJCQkJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGsgXTsKICAgIAkJCQkJCXZhciBncm91cE1hdGVyaWFsID0gbWF0ZXJpYWxbIGdyb3VwLm1hdGVyaWFsSW5kZXggXTsKCiAgICAJCQkJCQlpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkgewoKICAgIAkJCQkJCQl2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgZ3JvdXBNYXRlcmlhbCwgbGlnaHQsIHNoYWRvd0NhbWVyYS5uZWFyLCBzaGFkb3dDYW1lcmEuZmFyLCB0eXBlICk7CgogICAgCQkJCQkJCV9yZW5kZXJlci5yZW5kZXJCdWZmZXJEaXJlY3QoIHNoYWRvd0NhbWVyYSwgbnVsbCwgZ2VvbWV0cnksIGRlcHRoTWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKTsKCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgogICAgCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7CgogICAgCQkJCQl2YXIgZGVwdGhNYXRlcmlhbCA9IGdldERlcHRoTWF0ZXJpYWwoIG9iamVjdCwgbWF0ZXJpYWwsIGxpZ2h0LCBzaGFkb3dDYW1lcmEubmVhciwgc2hhZG93Q2FtZXJhLmZhciwgdHlwZSApOwoKICAgIAkJCQkJX3JlbmRlcmVyLnJlbmRlckJ1ZmZlckRpcmVjdCggc2hhZG93Q2FtZXJhLCBudWxsLCBnZW9tZXRyeSwgZGVwdGhNYXRlcmlhbCwgb2JqZWN0LCBudWxsICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQl2YXIgY2hpbGRyZW4gPSBvYmplY3QuY2hpbGRyZW47CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBjaGlsZHJlbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXJlbmRlck9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBzaGFkb3dDYW1lcmEsIGxpZ2h0LCB0eXBlICk7CgogICAgCQl9CgogICAgCX0KCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gV2ViR0xTdGF0ZSggZ2wsIGV4dGVuc2lvbnMsIHV0aWxzLCBjYXBhYmlsaXRpZXMgKSB7CgogICAgCWZ1bmN0aW9uIENvbG9yQnVmZmVyKCkgewoKICAgIAkJdmFyIGxvY2tlZCA9IGZhbHNlOwoKICAgIAkJdmFyIGNvbG9yID0gbmV3IFZlY3RvcjQoKTsKICAgIAkJdmFyIGN1cnJlbnRDb2xvck1hc2sgPSBudWxsOwogICAgCQl2YXIgY3VycmVudENvbG9yQ2xlYXIgPSBuZXcgVmVjdG9yNCggMCwgMCwgMCwgMCApOwoKICAgIAkJcmV0dXJuIHsKCiAgICAJCQlzZXRNYXNrOiBmdW5jdGlvbiAoIGNvbG9yTWFzayApIHsKCiAgICAJCQkJaWYgKCBjdXJyZW50Q29sb3JNYXNrICE9PSBjb2xvck1hc2sgJiYgISBsb2NrZWQgKSB7CgogICAgCQkJCQlnbC5jb2xvck1hc2soIGNvbG9yTWFzaywgY29sb3JNYXNrLCBjb2xvck1hc2ssIGNvbG9yTWFzayApOwogICAgCQkJCQljdXJyZW50Q29sb3JNYXNrID0gY29sb3JNYXNrOwoKICAgIAkJCQl9CgogICAgCQkJfSwKCiAgICAJCQlzZXRMb2NrZWQ6IGZ1bmN0aW9uICggbG9jayApIHsKCiAgICAJCQkJbG9ja2VkID0gbG9jazsKCiAgICAJCQl9LAoKICAgIAkJCXNldENsZWFyOiBmdW5jdGlvbiAoIHIsIGcsIGIsIGEsIHByZW11bHRpcGxpZWRBbHBoYSApIHsKCiAgICAJCQkJaWYgKCBwcmVtdWx0aXBsaWVkQWxwaGEgPT09IHRydWUgKSB7CgogICAgCQkJCQlyICo9IGE7IGcgKj0gYTsgYiAqPSBhOwoKICAgIAkJCQl9CgogICAgCQkJCWNvbG9yLnNldCggciwgZywgYiwgYSApOwoKICAgIAkJCQlpZiAoIGN1cnJlbnRDb2xvckNsZWFyLmVxdWFscyggY29sb3IgKSA9PT0gZmFsc2UgKSB7CgogICAgCQkJCQlnbC5jbGVhckNvbG9yKCByLCBnLCBiLCBhICk7CiAgICAJCQkJCWN1cnJlbnRDb2xvckNsZWFyLmNvcHkoIGNvbG9yICk7CgogICAgCQkJCX0KCiAgICAJCQl9LAoKICAgIAkJCXJlc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJCWxvY2tlZCA9IGZhbHNlOwoKICAgIAkJCQljdXJyZW50Q29sb3JNYXNrID0gbnVsbDsKICAgIAkJCQljdXJyZW50Q29sb3JDbGVhci5zZXQoIC0gMSwgMCwgMCwgMCApOyAvLyBzZXQgdG8gaW52YWxpZCBzdGF0ZQoKICAgIAkJCX0KCiAgICAJCX07CgogICAgCX0KCiAgICAJZnVuY3Rpb24gRGVwdGhCdWZmZXIoKSB7CgogICAgCQl2YXIgbG9ja2VkID0gZmFsc2U7CgogICAgCQl2YXIgY3VycmVudERlcHRoTWFzayA9IG51bGw7CiAgICAJCXZhciBjdXJyZW50RGVwdGhGdW5jID0gbnVsbDsKICAgIAkJdmFyIGN1cnJlbnREZXB0aENsZWFyID0gbnVsbDsKCiAgICAJCXJldHVybiB7CgogICAgCQkJc2V0VGVzdDogZnVuY3Rpb24gKCBkZXB0aFRlc3QgKSB7CgogICAgCQkJCWlmICggZGVwdGhUZXN0ICkgewoKICAgIAkJCQkJZW5hYmxlKCAyOTI5ICk7CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQlkaXNhYmxlKCAyOTI5ICk7CgogICAgCQkJCX0KCiAgICAJCQl9LAoKICAgIAkJCXNldE1hc2s6IGZ1bmN0aW9uICggZGVwdGhNYXNrICkgewoKICAgIAkJCQlpZiAoIGN1cnJlbnREZXB0aE1hc2sgIT09IGRlcHRoTWFzayAmJiAhIGxvY2tlZCApIHsKCiAgICAJCQkJCWdsLmRlcHRoTWFzayggZGVwdGhNYXNrICk7CiAgICAJCQkJCWN1cnJlbnREZXB0aE1hc2sgPSBkZXB0aE1hc2s7CgogICAgCQkJCX0KCiAgICAJCQl9LAoKICAgIAkJCXNldEZ1bmM6IGZ1bmN0aW9uICggZGVwdGhGdW5jICkgewoKICAgIAkJCQlpZiAoIGN1cnJlbnREZXB0aEZ1bmMgIT09IGRlcHRoRnVuYyApIHsKCiAgICAJCQkJCWlmICggZGVwdGhGdW5jICkgewoKICAgIAkJCQkJCXN3aXRjaCAoIGRlcHRoRnVuYyApIHsKCiAgICAJCQkJCQkJY2FzZSBOZXZlckRlcHRoOgoKICAgIAkJCQkJCQkJZ2wuZGVwdGhGdW5jKCA1MTIgKTsKICAgIAkJCQkJCQkJYnJlYWs7CgogICAgCQkJCQkJCWNhc2UgQWx3YXlzRGVwdGg6CgogICAgCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIDUxOSApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJY2FzZSBMZXNzRGVwdGg6CgogICAgCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIDUxMyApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJY2FzZSBMZXNzRXF1YWxEZXB0aDoKCiAgICAJCQkJCQkJCWdsLmRlcHRoRnVuYyggNTE1ICk7CiAgICAJCQkJCQkJCWJyZWFrOwoKICAgIAkJCQkJCQljYXNlIEVxdWFsRGVwdGg6CgogICAgCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIDUxNCApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJY2FzZSBHcmVhdGVyRXF1YWxEZXB0aDoKCiAgICAJCQkJCQkJCWdsLmRlcHRoRnVuYyggNTE4ICk7CiAgICAJCQkJCQkJCWJyZWFrOwoKICAgIAkJCQkJCQljYXNlIEdyZWF0ZXJEZXB0aDoKCiAgICAJCQkJCQkJCWdsLmRlcHRoRnVuYyggNTE2ICk7CiAgICAJCQkJCQkJCWJyZWFrOwoKICAgIAkJCQkJCQljYXNlIE5vdEVxdWFsRGVwdGg6CgogICAgCQkJCQkJCQlnbC5kZXB0aEZ1bmMoIDUxNyApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJZGVmYXVsdDoKCiAgICAJCQkJCQkJCWdsLmRlcHRoRnVuYyggNTE1ICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQlnbC5kZXB0aEZ1bmMoIDUxNSApOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJY3VycmVudERlcHRoRnVuYyA9IGRlcHRoRnVuYzsKCiAgICAJCQkJfQoKICAgIAkJCX0sCgogICAgCQkJc2V0TG9ja2VkOiBmdW5jdGlvbiAoIGxvY2sgKSB7CgogICAgCQkJCWxvY2tlZCA9IGxvY2s7CgogICAgCQkJfSwKCiAgICAJCQlzZXRDbGVhcjogZnVuY3Rpb24gKCBkZXB0aCApIHsKCiAgICAJCQkJaWYgKCBjdXJyZW50RGVwdGhDbGVhciAhPT0gZGVwdGggKSB7CgogICAgCQkJCQlnbC5jbGVhckRlcHRoKCBkZXB0aCApOwogICAgCQkJCQljdXJyZW50RGVwdGhDbGVhciA9IGRlcHRoOwoKICAgIAkJCQl9CgogICAgCQkJfSwKCiAgICAJCQlyZXNldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCQlsb2NrZWQgPSBmYWxzZTsKCiAgICAJCQkJY3VycmVudERlcHRoTWFzayA9IG51bGw7CiAgICAJCQkJY3VycmVudERlcHRoRnVuYyA9IG51bGw7CiAgICAJCQkJY3VycmVudERlcHRoQ2xlYXIgPSBudWxsOwoKICAgIAkJCX0KCiAgICAJCX07CgogICAgCX0KCiAgICAJZnVuY3Rpb24gU3RlbmNpbEJ1ZmZlcigpIHsKCiAgICAJCXZhciBsb2NrZWQgPSBmYWxzZTsKCiAgICAJCXZhciBjdXJyZW50U3RlbmNpbE1hc2sgPSBudWxsOwogICAgCQl2YXIgY3VycmVudFN0ZW5jaWxGdW5jID0gbnVsbDsKICAgIAkJdmFyIGN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDsKICAgIAkJdmFyIGN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBudWxsOwogICAgCQl2YXIgY3VycmVudFN0ZW5jaWxGYWlsID0gbnVsbDsKICAgIAkJdmFyIGN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsOwogICAgCQl2YXIgY3VycmVudFN0ZW5jaWxaUGFzcyA9IG51bGw7CiAgICAJCXZhciBjdXJyZW50U3RlbmNpbENsZWFyID0gbnVsbDsKCiAgICAJCXJldHVybiB7CgogICAgCQkJc2V0VGVzdDogZnVuY3Rpb24gKCBzdGVuY2lsVGVzdCApIHsKCiAgICAJCQkJaWYgKCAhIGxvY2tlZCApIHsKCiAgICAJCQkJCWlmICggc3RlbmNpbFRlc3QgKSB7CgogICAgCQkJCQkJZW5hYmxlKCAyOTYwICk7CgogICAgCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCWRpc2FibGUoIDI5NjAgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0sCgogICAgCQkJc2V0TWFzazogZnVuY3Rpb24gKCBzdGVuY2lsTWFzayApIHsKCiAgICAJCQkJaWYgKCBjdXJyZW50U3RlbmNpbE1hc2sgIT09IHN0ZW5jaWxNYXNrICYmICEgbG9ja2VkICkgewoKICAgIAkJCQkJZ2wuc3RlbmNpbE1hc2soIHN0ZW5jaWxNYXNrICk7CiAgICAJCQkJCWN1cnJlbnRTdGVuY2lsTWFzayA9IHN0ZW5jaWxNYXNrOwoKICAgIAkJCQl9CgogICAgCQkJfSwKCiAgICAJCQlzZXRGdW5jOiBmdW5jdGlvbiAoIHN0ZW5jaWxGdW5jLCBzdGVuY2lsUmVmLCBzdGVuY2lsTWFzayApIHsKCiAgICAJCQkJaWYgKCBjdXJyZW50U3RlbmNpbEZ1bmMgIT09IHN0ZW5jaWxGdW5jIHx8CiAgICAJCQkJICAgICBjdXJyZW50U3RlbmNpbFJlZiAJIT09IHN0ZW5jaWxSZWYgCXx8CiAgICAJCQkJICAgICBjdXJyZW50U3RlbmNpbEZ1bmNNYXNrICE9PSBzdGVuY2lsTWFzayApIHsKCiAgICAJCQkJCWdsLnN0ZW5jaWxGdW5jKCBzdGVuY2lsRnVuYywgc3RlbmNpbFJlZiwgc3RlbmNpbE1hc2sgKTsKCiAgICAJCQkJCWN1cnJlbnRTdGVuY2lsRnVuYyA9IHN0ZW5jaWxGdW5jOwogICAgCQkJCQljdXJyZW50U3RlbmNpbFJlZiA9IHN0ZW5jaWxSZWY7CiAgICAJCQkJCWN1cnJlbnRTdGVuY2lsRnVuY01hc2sgPSBzdGVuY2lsTWFzazsKCiAgICAJCQkJfQoKICAgIAkJCX0sCgogICAgCQkJc2V0T3A6IGZ1bmN0aW9uICggc3RlbmNpbEZhaWwsIHN0ZW5jaWxaRmFpbCwgc3RlbmNpbFpQYXNzICkgewoKICAgIAkJCQlpZiAoIGN1cnJlbnRTdGVuY2lsRmFpbAkgIT09IHN0ZW5jaWxGYWlsIAl8fAogICAgCQkJCSAgICAgY3VycmVudFN0ZW5jaWxaRmFpbCAhPT0gc3RlbmNpbFpGYWlsIHx8CiAgICAJCQkJICAgICBjdXJyZW50U3RlbmNpbFpQYXNzICE9PSBzdGVuY2lsWlBhc3MgKSB7CgogICAgCQkJCQlnbC5zdGVuY2lsT3AoIHN0ZW5jaWxGYWlsLCBzdGVuY2lsWkZhaWwsIHN0ZW5jaWxaUGFzcyApOwoKICAgIAkJCQkJY3VycmVudFN0ZW5jaWxGYWlsID0gc3RlbmNpbEZhaWw7CiAgICAJCQkJCWN1cnJlbnRTdGVuY2lsWkZhaWwgPSBzdGVuY2lsWkZhaWw7CiAgICAJCQkJCWN1cnJlbnRTdGVuY2lsWlBhc3MgPSBzdGVuY2lsWlBhc3M7CgogICAgCQkJCX0KCiAgICAJCQl9LAoKICAgIAkJCXNldExvY2tlZDogZnVuY3Rpb24gKCBsb2NrICkgewoKICAgIAkJCQlsb2NrZWQgPSBsb2NrOwoKICAgIAkJCX0sCgogICAgCQkJc2V0Q2xlYXI6IGZ1bmN0aW9uICggc3RlbmNpbCApIHsKCiAgICAJCQkJaWYgKCBjdXJyZW50U3RlbmNpbENsZWFyICE9PSBzdGVuY2lsICkgewoKICAgIAkJCQkJZ2wuY2xlYXJTdGVuY2lsKCBzdGVuY2lsICk7CiAgICAJCQkJCWN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBzdGVuY2lsOwoKICAgIAkJCQl9CgogICAgCQkJfSwKCiAgICAJCQlyZXNldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCQlsb2NrZWQgPSBmYWxzZTsKCiAgICAJCQkJY3VycmVudFN0ZW5jaWxNYXNrID0gbnVsbDsKICAgIAkJCQljdXJyZW50U3RlbmNpbEZ1bmMgPSBudWxsOwogICAgCQkJCWN1cnJlbnRTdGVuY2lsUmVmID0gbnVsbDsKICAgIAkJCQljdXJyZW50U3RlbmNpbEZ1bmNNYXNrID0gbnVsbDsKICAgIAkJCQljdXJyZW50U3RlbmNpbEZhaWwgPSBudWxsOwogICAgCQkJCWN1cnJlbnRTdGVuY2lsWkZhaWwgPSBudWxsOwogICAgCQkJCWN1cnJlbnRTdGVuY2lsWlBhc3MgPSBudWxsOwogICAgCQkJCWN1cnJlbnRTdGVuY2lsQ2xlYXIgPSBudWxsOwoKICAgIAkJCX0KCiAgICAJCX07CgogICAgCX0KCiAgICAJLy8KCiAgICAJdmFyIGNvbG9yQnVmZmVyID0gbmV3IENvbG9yQnVmZmVyKCk7CiAgICAJdmFyIGRlcHRoQnVmZmVyID0gbmV3IERlcHRoQnVmZmVyKCk7CiAgICAJdmFyIHN0ZW5jaWxCdWZmZXIgPSBuZXcgU3RlbmNpbEJ1ZmZlcigpOwoKICAgIAl2YXIgbWF4VmVydGV4QXR0cmlidXRlcyA9IGdsLmdldFBhcmFtZXRlciggMzQ5MjEgKTsKICAgIAl2YXIgbmV3QXR0cmlidXRlcyA9IG5ldyBVaW50OEFycmF5KCBtYXhWZXJ0ZXhBdHRyaWJ1dGVzICk7CiAgICAJdmFyIGVuYWJsZWRBdHRyaWJ1dGVzID0gbmV3IFVpbnQ4QXJyYXkoIG1heFZlcnRleEF0dHJpYnV0ZXMgKTsKICAgIAl2YXIgYXR0cmlidXRlRGl2aXNvcnMgPSBuZXcgVWludDhBcnJheSggbWF4VmVydGV4QXR0cmlidXRlcyApOwoKICAgIAl2YXIgZW5hYmxlZENhcGFiaWxpdGllcyA9IHt9OwoKICAgIAl2YXIgY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzID0gbnVsbDsKCiAgICAJdmFyIGN1cnJlbnRQcm9ncmFtID0gbnVsbDsKCiAgICAJdmFyIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgPSBudWxsOwogICAgCXZhciBjdXJyZW50QmxlbmRpbmcgPSBudWxsOwogICAgCXZhciBjdXJyZW50QmxlbmRFcXVhdGlvbiA9IG51bGw7CiAgICAJdmFyIGN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CiAgICAJdmFyIGN1cnJlbnRCbGVuZERzdCA9IG51bGw7CiAgICAJdmFyIGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBudWxsOwogICAgCXZhciBjdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7CiAgICAJdmFyIGN1cnJlbnRCbGVuZERzdEFscGhhID0gbnVsbDsKICAgIAl2YXIgY3VycmVudFByZW11bHRpcGxlZEFscGhhID0gZmFsc2U7CgogICAgCXZhciBjdXJyZW50RmxpcFNpZGVkID0gbnVsbDsKICAgIAl2YXIgY3VycmVudEN1bGxGYWNlID0gbnVsbDsKCiAgICAJdmFyIGN1cnJlbnRMaW5lV2lkdGggPSBudWxsOwoKICAgIAl2YXIgY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgPSBudWxsOwogICAgCXZhciBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gbnVsbDsKCiAgICAJdmFyIG1heFRleHR1cmVzID0gZ2wuZ2V0UGFyYW1ldGVyKCAzNTY2MSApOwoKICAgIAl2YXIgbGluZVdpZHRoQXZhaWxhYmxlID0gZmFsc2U7CiAgICAJdmFyIHZlcnNpb24gPSAwOwogICAgCXZhciBnbFZlcnNpb24gPSBnbC5nZXRQYXJhbWV0ZXIoIDc5MzggKTsKCiAgICAJaWYgKCBnbFZlcnNpb24uaW5kZXhPZiggJ1dlYkdMJyApICE9PSAtIDEgKSB7CgogICAgCQl2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15XZWJHTFwgKFswLTldKS8uZXhlYyggZ2xWZXJzaW9uIClbIDEgXSApOwogICAgCQlsaW5lV2lkdGhBdmFpbGFibGUgPSAoIHZlcnNpb24gPj0gMS4wICk7CgogICAgCX0gZWxzZSBpZiAoIGdsVmVyc2lvbi5pbmRleE9mKCAnT3BlbkdMIEVTJyApICE9PSAtIDEgKSB7CgogICAgCQl2ZXJzaW9uID0gcGFyc2VGbG9hdCggL15PcGVuR0xcIEVTXCAoWzAtOV0pLy5leGVjKCBnbFZlcnNpb24gKVsgMSBdICk7CiAgICAJCWxpbmVXaWR0aEF2YWlsYWJsZSA9ICggdmVyc2lvbiA+PSAyLjAgKTsKCiAgICAJfQoKICAgIAl2YXIgY3VycmVudFRleHR1cmVTbG90ID0gbnVsbDsKICAgIAl2YXIgY3VycmVudEJvdW5kVGV4dHVyZXMgPSB7fTsKCiAgICAJdmFyIGN1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKTsKICAgIAl2YXIgY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTsKCiAgICAJZnVuY3Rpb24gY3JlYXRlVGV4dHVyZSggdHlwZSwgdGFyZ2V0LCBjb3VudCApIHsKCiAgICAJCXZhciBkYXRhID0gbmV3IFVpbnQ4QXJyYXkoIDQgKTsgLy8gNCBpcyByZXF1aXJlZCB0byBtYXRjaCBkZWZhdWx0IHVucGFjayBhbGlnbm1lbnQgb2YgNC4KICAgIAkJdmFyIHRleHR1cmUgPSBnbC5jcmVhdGVUZXh0dXJlKCk7CgogICAgCQlnbC5iaW5kVGV4dHVyZSggdHlwZSwgdGV4dHVyZSApOwogICAgCQlnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCAxMDI0MSwgOTcyOCApOwogICAgCQlnbC50ZXhQYXJhbWV0ZXJpKCB0eXBlLCAxMDI0MCwgOTcyOCApOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgY291bnQ7IGkgKysgKSB7CgogICAgCQkJZ2wudGV4SW1hZ2UyRCggdGFyZ2V0ICsgaSwgMCwgNjQwOCwgMSwgMSwgMCwgNjQwOCwgNTEyMSwgZGF0YSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRleHR1cmU7CgogICAgCX0KCiAgICAJdmFyIGVtcHR5VGV4dHVyZXMgPSB7fTsKICAgIAllbXB0eVRleHR1cmVzWyAzNTUzIF0gPSBjcmVhdGVUZXh0dXJlKCAzNTUzLCAzNTUzLCAxICk7CiAgICAJZW1wdHlUZXh0dXJlc1sgMzQwNjcgXSA9IGNyZWF0ZVRleHR1cmUoIDM0MDY3LCAzNDA2OSwgNiApOwoKICAgIAkvLyBpbml0CgogICAgCWNvbG9yQnVmZmVyLnNldENsZWFyKCAwLCAwLCAwLCAxICk7CiAgICAJZGVwdGhCdWZmZXIuc2V0Q2xlYXIoIDEgKTsKICAgIAlzdGVuY2lsQnVmZmVyLnNldENsZWFyKCAwICk7CgogICAgCWVuYWJsZSggMjkyOSApOwogICAgCWRlcHRoQnVmZmVyLnNldEZ1bmMoIExlc3NFcXVhbERlcHRoICk7CgogICAgCXNldEZsaXBTaWRlZCggZmFsc2UgKTsKICAgIAlzZXRDdWxsRmFjZSggQ3VsbEZhY2VCYWNrICk7CiAgICAJZW5hYmxlKCAyODg0ICk7CgogICAgCXNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICk7CgogICAgCS8vCgogICAgCWZ1bmN0aW9uIGluaXRBdHRyaWJ1dGVzKCkgewoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gbmV3QXR0cmlidXRlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCW5ld0F0dHJpYnV0ZXNbIGkgXSA9IDA7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZW5hYmxlQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSB7CgogICAgCQllbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIDAgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBhdHRyaWJ1dGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7CgogICAgCQluZXdBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9IDE7CgogICAgCQlpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBhdHRyaWJ1dGUgXSA9PT0gMCApIHsKCiAgICAJCQlnbC5lbmFibGVWZXJ0ZXhBdHRyaWJBcnJheSggYXR0cmlidXRlICk7CiAgICAJCQllbmFibGVkQXR0cmlidXRlc1sgYXR0cmlidXRlIF0gPSAxOwoKICAgIAkJfQoKICAgIAkJaWYgKCBhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gIT09IG1lc2hQZXJBdHRyaWJ1dGUgKSB7CgogICAgCQkJdmFyIGV4dGVuc2lvbiA9IGNhcGFiaWxpdGllcy5pc1dlYkdMMiA/IGdsIDogZXh0ZW5zaW9ucy5nZXQoICdBTkdMRV9pbnN0YW5jZWRfYXJyYXlzJyApOwoKICAgIAkJCWV4dGVuc2lvblsgY2FwYWJpbGl0aWVzLmlzV2ViR0wyID8gJ3ZlcnRleEF0dHJpYkRpdmlzb3InIDogJ3ZlcnRleEF0dHJpYkRpdmlzb3JBTkdMRScgXSggYXR0cmlidXRlLCBtZXNoUGVyQXR0cmlidXRlICk7CiAgICAJCQlhdHRyaWJ1dGVEaXZpc29yc1sgYXR0cmlidXRlIF0gPSBtZXNoUGVyQXR0cmlidXRlOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGVzKCkgewoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gZW5hYmxlZEF0dHJpYnV0ZXMubGVuZ3RoOyBpICE9PSBsOyArKyBpICkgewoKICAgIAkJCWlmICggZW5hYmxlZEF0dHJpYnV0ZXNbIGkgXSAhPT0gbmV3QXR0cmlidXRlc1sgaSBdICkgewoKICAgIAkJCQlnbC5kaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoIGkgKTsKICAgIAkJCQllbmFibGVkQXR0cmlidXRlc1sgaSBdID0gMDsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZW5hYmxlKCBpZCApIHsKCiAgICAJCWlmICggZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSAhPT0gdHJ1ZSApIHsKCiAgICAJCQlnbC5lbmFibGUoIGlkICk7CiAgICAJCQllbmFibGVkQ2FwYWJpbGl0aWVzWyBpZCBdID0gdHJ1ZTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBkaXNhYmxlKCBpZCApIHsKCiAgICAJCWlmICggZW5hYmxlZENhcGFiaWxpdGllc1sgaWQgXSAhPT0gZmFsc2UgKSB7CgogICAgCQkJZ2wuZGlzYWJsZSggaWQgKTsKICAgIAkJCWVuYWJsZWRDYXBhYmlsaXRpZXNbIGlkIF0gPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKSB7CgogICAgCQlpZiAoIGNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9PT0gbnVsbCApIHsKCiAgICAJCQljb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMgPSBbXTsKCiAgICAJCQlpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3B2cnRjJyApIHx8CiAgICAJCQkgICAgIGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICkgfHwKICAgIAkJCSAgICAgZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKSB8fAogICAgCQkJICAgICBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9hc3RjJyApICkgewoKICAgIAkJCQl2YXIgZm9ybWF0cyA9IGdsLmdldFBhcmFtZXRlciggMzQ0NjcgKTsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZm9ybWF0cy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCQljb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMucHVzaCggZm9ybWF0c1sgaSBdICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gY29tcHJlc3NlZFRleHR1cmVGb3JtYXRzOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHVzZVByb2dyYW0oIHByb2dyYW0gKSB7CgogICAgCQlpZiAoIGN1cnJlbnRQcm9ncmFtICE9PSBwcm9ncmFtICkgewoKICAgIAkJCWdsLnVzZVByb2dyYW0oIHByb2dyYW0gKTsKCiAgICAJCQljdXJyZW50UHJvZ3JhbSA9IHByb2dyYW07CgogICAgCQkJcmV0dXJuIHRydWU7CgogICAgCQl9CgogICAgCQlyZXR1cm4gZmFsc2U7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2V0QmxlbmRpbmcoIGJsZW5kaW5nLCBibGVuZEVxdWF0aW9uLCBibGVuZFNyYywgYmxlbmREc3QsIGJsZW5kRXF1YXRpb25BbHBoYSwgYmxlbmRTcmNBbHBoYSwgYmxlbmREc3RBbHBoYSwgcHJlbXVsdGlwbGllZEFscGhhICkgewoKICAgIAkJaWYgKCBibGVuZGluZyA9PT0gTm9CbGVuZGluZyApIHsKCiAgICAJCQlpZiAoIGN1cnJlbnRCbGVuZGluZ0VuYWJsZWQgKSB7CgogICAgCQkJCWRpc2FibGUoIDMwNDIgKTsKICAgIAkJCQljdXJyZW50QmxlbmRpbmdFbmFibGVkID0gZmFsc2U7CgogICAgCQkJfQoKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCWlmICggISBjdXJyZW50QmxlbmRpbmdFbmFibGVkICkgewoKICAgIAkJCWVuYWJsZSggMzA0MiApOwogICAgCQkJY3VycmVudEJsZW5kaW5nRW5hYmxlZCA9IHRydWU7CgogICAgCQl9CgogICAgCQlpZiAoIGJsZW5kaW5nICE9PSBDdXN0b21CbGVuZGluZyApIHsKCiAgICAJCQlpZiAoIGJsZW5kaW5nICE9PSBjdXJyZW50QmxlbmRpbmcgfHwgcHJlbXVsdGlwbGllZEFscGhhICE9PSBjdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgKSB7CgogICAgCQkJCWlmICggY3VycmVudEJsZW5kRXF1YXRpb24gIT09IEFkZEVxdWF0aW9uIHx8IGN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgIT09IEFkZEVxdWF0aW9uICkgewoKICAgIAkJCQkJZ2wuYmxlbmRFcXVhdGlvbiggMzI3NzQgKTsKCiAgICAJCQkJCWN1cnJlbnRCbGVuZEVxdWF0aW9uID0gQWRkRXF1YXRpb247CiAgICAJCQkJCWN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBBZGRFcXVhdGlvbjsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIHByZW11bHRpcGxpZWRBbHBoYSApIHsKCiAgICAJCQkJCXN3aXRjaCAoIGJsZW5kaW5nICkgewoKICAgIAkJCQkJCWNhc2UgTm9ybWFsQmxlbmRpbmc6CiAgICAJCQkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIDEsIDc3MSwgMSwgNzcxICk7CiAgICAJCQkJCQkJYnJlYWs7CgogICAgCQkJCQkJY2FzZSBBZGRpdGl2ZUJsZW5kaW5nOgogICAgCQkJCQkJCWdsLmJsZW5kRnVuYyggMSwgMSApOwogICAgCQkJCQkJCWJyZWFrOwoKICAgIAkJCQkJCWNhc2UgU3VidHJhY3RpdmVCbGVuZGluZzoKICAgIAkJCQkJCQlnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggMCwgMCwgNzY5LCA3NzEgKTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQljYXNlIE11bHRpcGx5QmxlbmRpbmc6CiAgICAJCQkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIDAsIDc2OCwgMCwgNzcwICk7CiAgICAJCQkJCQkJYnJlYWs7CgogICAgCQkJCQkJZGVmYXVsdDoKICAgIAkJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTogSW52YWxpZCBibGVuZGluZzogJywgYmxlbmRpbmcgKTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCX0KCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXN3aXRjaCAoIGJsZW5kaW5nICkgewoKICAgIAkJCQkJCWNhc2UgTm9ybWFsQmxlbmRpbmc6CiAgICAJCQkJCQkJZ2wuYmxlbmRGdW5jU2VwYXJhdGUoIDc3MCwgNzcxLCAxLCA3NzEgKTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQljYXNlIEFkZGl0aXZlQmxlbmRpbmc6CiAgICAJCQkJCQkJZ2wuYmxlbmRGdW5jKCA3NzAsIDEgKTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQljYXNlIFN1YnRyYWN0aXZlQmxlbmRpbmc6CiAgICAJCQkJCQkJZ2wuYmxlbmRGdW5jKCAwLCA3NjkgKTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQljYXNlIE11bHRpcGx5QmxlbmRpbmc6CiAgICAJCQkJCQkJZ2wuYmxlbmRGdW5jKCAwLCA3NjggKTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQlkZWZhdWx0OgogICAgCQkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFN0YXRlOiBJbnZhbGlkIGJsZW5kaW5nOiAnLCBibGVuZGluZyApOwogICAgCQkJCQkJCWJyZWFrOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJCWN1cnJlbnRCbGVuZFNyYyA9IG51bGw7CiAgICAJCQkJY3VycmVudEJsZW5kRHN0ID0gbnVsbDsKICAgIAkJCQljdXJyZW50QmxlbmRTcmNBbHBoYSA9IG51bGw7CiAgICAJCQkJY3VycmVudEJsZW5kRHN0QWxwaGEgPSBudWxsOwoKICAgIAkJCQljdXJyZW50QmxlbmRpbmcgPSBibGVuZGluZzsKICAgIAkJCQljdXJyZW50UHJlbXVsdGlwbGVkQWxwaGEgPSBwcmVtdWx0aXBsaWVkQWxwaGE7CgogICAgCQkJfQoKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCS8vIGN1c3RvbSBibGVuZGluZwoKICAgIAkJYmxlbmRFcXVhdGlvbkFscGhhID0gYmxlbmRFcXVhdGlvbkFscGhhIHx8IGJsZW5kRXF1YXRpb247CiAgICAJCWJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhIHx8IGJsZW5kU3JjOwogICAgCQlibGVuZERzdEFscGhhID0gYmxlbmREc3RBbHBoYSB8fCBibGVuZERzdDsKCiAgICAJCWlmICggYmxlbmRFcXVhdGlvbiAhPT0gY3VycmVudEJsZW5kRXF1YXRpb24gfHwgYmxlbmRFcXVhdGlvbkFscGhhICE9PSBjdXJyZW50QmxlbmRFcXVhdGlvbkFscGhhICkgewoKICAgIAkJCWdsLmJsZW5kRXF1YXRpb25TZXBhcmF0ZSggdXRpbHMuY29udmVydCggYmxlbmRFcXVhdGlvbiApLCB1dGlscy5jb252ZXJ0KCBibGVuZEVxdWF0aW9uQWxwaGEgKSApOwoKICAgIAkJCWN1cnJlbnRCbGVuZEVxdWF0aW9uID0gYmxlbmRFcXVhdGlvbjsKICAgIAkJCWN1cnJlbnRCbGVuZEVxdWF0aW9uQWxwaGEgPSBibGVuZEVxdWF0aW9uQWxwaGE7CgogICAgCQl9CgogICAgCQlpZiAoIGJsZW5kU3JjICE9PSBjdXJyZW50QmxlbmRTcmMgfHwgYmxlbmREc3QgIT09IGN1cnJlbnRCbGVuZERzdCB8fCBibGVuZFNyY0FscGhhICE9PSBjdXJyZW50QmxlbmRTcmNBbHBoYSB8fCBibGVuZERzdEFscGhhICE9PSBjdXJyZW50QmxlbmREc3RBbHBoYSApIHsKCiAgICAJCQlnbC5ibGVuZEZ1bmNTZXBhcmF0ZSggdXRpbHMuY29udmVydCggYmxlbmRTcmMgKSwgdXRpbHMuY29udmVydCggYmxlbmREc3QgKSwgdXRpbHMuY29udmVydCggYmxlbmRTcmNBbHBoYSApLCB1dGlscy5jb252ZXJ0KCBibGVuZERzdEFscGhhICkgKTsKCiAgICAJCQljdXJyZW50QmxlbmRTcmMgPSBibGVuZFNyYzsKICAgIAkJCWN1cnJlbnRCbGVuZERzdCA9IGJsZW5kRHN0OwogICAgCQkJY3VycmVudEJsZW5kU3JjQWxwaGEgPSBibGVuZFNyY0FscGhhOwogICAgCQkJY3VycmVudEJsZW5kRHN0QWxwaGEgPSBibGVuZERzdEFscGhhOwoKICAgIAkJfQoKICAgIAkJY3VycmVudEJsZW5kaW5nID0gYmxlbmRpbmc7CiAgICAJCWN1cnJlbnRQcmVtdWx0aXBsZWRBbHBoYSA9IG51bGw7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2V0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmcm9udEZhY2VDVyApIHsKCiAgICAJCW1hdGVyaWFsLnNpZGUgPT09IERvdWJsZVNpZGUKICAgIAkJCT8gZGlzYWJsZSggMjg4NCApCiAgICAJCQk6IGVuYWJsZSggMjg4NCApOwoKICAgIAkJdmFyIGZsaXBTaWRlZCA9ICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKTsKICAgIAkJaWYgKCBmcm9udEZhY2VDVyApIGZsaXBTaWRlZCA9ICEgZmxpcFNpZGVkOwoKICAgIAkJc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKTsKCiAgICAJCSggbWF0ZXJpYWwuYmxlbmRpbmcgPT09IE5vcm1hbEJsZW5kaW5nICYmIG1hdGVyaWFsLnRyYW5zcGFyZW50ID09PSBmYWxzZSApCiAgICAJCQk/IHNldEJsZW5kaW5nKCBOb0JsZW5kaW5nICkKICAgIAkJCTogc2V0QmxlbmRpbmcoIG1hdGVyaWFsLmJsZW5kaW5nLCBtYXRlcmlhbC5ibGVuZEVxdWF0aW9uLCBtYXRlcmlhbC5ibGVuZFNyYywgbWF0ZXJpYWwuYmxlbmREc3QsIG1hdGVyaWFsLmJsZW5kRXF1YXRpb25BbHBoYSwgbWF0ZXJpYWwuYmxlbmRTcmNBbHBoYSwgbWF0ZXJpYWwuYmxlbmREc3RBbHBoYSwgbWF0ZXJpYWwucHJlbXVsdGlwbGllZEFscGhhICk7CgogICAgCQlkZXB0aEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5kZXB0aEZ1bmMgKTsKICAgIAkJZGVwdGhCdWZmZXIuc2V0VGVzdCggbWF0ZXJpYWwuZGVwdGhUZXN0ICk7CiAgICAJCWRlcHRoQnVmZmVyLnNldE1hc2soIG1hdGVyaWFsLmRlcHRoV3JpdGUgKTsKICAgIAkJY29sb3JCdWZmZXIuc2V0TWFzayggbWF0ZXJpYWwuY29sb3JXcml0ZSApOwoKICAgIAkJdmFyIHN0ZW5jaWxXcml0ZSA9IG1hdGVyaWFsLnN0ZW5jaWxXcml0ZTsKICAgIAkJc3RlbmNpbEJ1ZmZlci5zZXRUZXN0KCBzdGVuY2lsV3JpdGUgKTsKICAgIAkJaWYgKCBzdGVuY2lsV3JpdGUgKSB7CgogICAgCQkJc3RlbmNpbEJ1ZmZlci5zZXRGdW5jKCBtYXRlcmlhbC5zdGVuY2lsRnVuYywgbWF0ZXJpYWwuc3RlbmNpbFJlZiwgbWF0ZXJpYWwuc3RlbmNpbE1hc2sgKTsKICAgIAkJCXN0ZW5jaWxCdWZmZXIuc2V0T3AoIG1hdGVyaWFsLnN0ZW5jaWxGYWlsLCBtYXRlcmlhbC5zdGVuY2lsWkZhaWwsIG1hdGVyaWFsLnN0ZW5jaWxaUGFzcyApOwoKICAgIAkJfQoKICAgIAkJc2V0UG9seWdvbk9mZnNldCggbWF0ZXJpYWwucG9seWdvbk9mZnNldCwgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciwgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzICk7CgogICAgCX0KCiAgICAJLy8KCiAgICAJZnVuY3Rpb24gc2V0RmxpcFNpZGVkKCBmbGlwU2lkZWQgKSB7CgogICAgCQlpZiAoIGN1cnJlbnRGbGlwU2lkZWQgIT09IGZsaXBTaWRlZCApIHsKCiAgICAJCQlpZiAoIGZsaXBTaWRlZCApIHsKCiAgICAJCQkJZ2wuZnJvbnRGYWNlKCAyMzA0ICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZ2wuZnJvbnRGYWNlKCAyMzA1ICk7CgogICAgCQkJfQoKICAgIAkJCWN1cnJlbnRGbGlwU2lkZWQgPSBmbGlwU2lkZWQ7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2V0Q3VsbEZhY2UoIGN1bGxGYWNlICkgewoKICAgIAkJaWYgKCBjdWxsRmFjZSAhPT0gQ3VsbEZhY2VOb25lICkgewoKICAgIAkJCWVuYWJsZSggMjg4NCApOwoKICAgIAkJCWlmICggY3VsbEZhY2UgIT09IGN1cnJlbnRDdWxsRmFjZSApIHsKCiAgICAJCQkJaWYgKCBjdWxsRmFjZSA9PT0gQ3VsbEZhY2VCYWNrICkgewoKICAgIAkJCQkJZ2wuY3VsbEZhY2UoIDEwMjkgKTsKCiAgICAJCQkJfSBlbHNlIGlmICggY3VsbEZhY2UgPT09IEN1bGxGYWNlRnJvbnQgKSB7CgogICAgCQkJCQlnbC5jdWxsRmFjZSggMTAyOCApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJZ2wuY3VsbEZhY2UoIDEwMzIgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSB7CgogICAgCQkJZGlzYWJsZSggMjg4NCApOwoKICAgIAkJfQoKICAgIAkJY3VycmVudEN1bGxGYWNlID0gY3VsbEZhY2U7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2V0TGluZVdpZHRoKCB3aWR0aCApIHsKCiAgICAJCWlmICggd2lkdGggIT09IGN1cnJlbnRMaW5lV2lkdGggKSB7CgogICAgCQkJaWYgKCBsaW5lV2lkdGhBdmFpbGFibGUgKSBnbC5saW5lV2lkdGgoIHdpZHRoICk7CgogICAgCQkJY3VycmVudExpbmVXaWR0aCA9IHdpZHRoOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHNldFBvbHlnb25PZmZzZXQoIHBvbHlnb25PZmZzZXQsIGZhY3RvciwgdW5pdHMgKSB7CgogICAgCQlpZiAoIHBvbHlnb25PZmZzZXQgKSB7CgogICAgCQkJZW5hYmxlKCAzMjgyMyApOwoKICAgIAkJCWlmICggY3VycmVudFBvbHlnb25PZmZzZXRGYWN0b3IgIT09IGZhY3RvciB8fCBjdXJyZW50UG9seWdvbk9mZnNldFVuaXRzICE9PSB1bml0cyApIHsKCiAgICAJCQkJZ2wucG9seWdvbk9mZnNldCggZmFjdG9yLCB1bml0cyApOwoKICAgIAkJCQljdXJyZW50UG9seWdvbk9mZnNldEZhY3RvciA9IGZhY3RvcjsKICAgIAkJCQljdXJyZW50UG9seWdvbk9mZnNldFVuaXRzID0gdW5pdHM7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlkaXNhYmxlKCAzMjgyMyApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHNldFNjaXNzb3JUZXN0KCBzY2lzc29yVGVzdCApIHsKCiAgICAJCWlmICggc2Npc3NvclRlc3QgKSB7CgogICAgCQkJZW5hYmxlKCAzMDg5ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWRpc2FibGUoIDMwODkgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyB0ZXh0dXJlCgogICAgCWZ1bmN0aW9uIGFjdGl2ZVRleHR1cmUoIHdlYmdsU2xvdCApIHsKCiAgICAJCWlmICggd2ViZ2xTbG90ID09PSB1bmRlZmluZWQgKSB3ZWJnbFNsb3QgPSAzMzk4NCArIG1heFRleHR1cmVzIC0gMTsKCiAgICAJCWlmICggY3VycmVudFRleHR1cmVTbG90ICE9PSB3ZWJnbFNsb3QgKSB7CgogICAgCQkJZ2wuYWN0aXZlVGV4dHVyZSggd2ViZ2xTbG90ICk7CiAgICAJCQljdXJyZW50VGV4dHVyZVNsb3QgPSB3ZWJnbFNsb3Q7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlICkgewoKICAgIAkJaWYgKCBjdXJyZW50VGV4dHVyZVNsb3QgPT09IG51bGwgKSB7CgogICAgCQkJYWN0aXZlVGV4dHVyZSgpOwoKICAgIAkJfQoKICAgIAkJdmFyIGJvdW5kVGV4dHVyZSA9IGN1cnJlbnRCb3VuZFRleHR1cmVzWyBjdXJyZW50VGV4dHVyZVNsb3QgXTsKCiAgICAJCWlmICggYm91bmRUZXh0dXJlID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJYm91bmRUZXh0dXJlID0geyB0eXBlOiB1bmRlZmluZWQsIHRleHR1cmU6IHVuZGVmaW5lZCB9OwogICAgCQkJY3VycmVudEJvdW5kVGV4dHVyZXNbIGN1cnJlbnRUZXh0dXJlU2xvdCBdID0gYm91bmRUZXh0dXJlOwoKICAgIAkJfQoKICAgIAkJaWYgKCBib3VuZFRleHR1cmUudHlwZSAhPT0gd2ViZ2xUeXBlIHx8IGJvdW5kVGV4dHVyZS50ZXh0dXJlICE9PSB3ZWJnbFRleHR1cmUgKSB7CgogICAgCQkJZ2wuYmluZFRleHR1cmUoIHdlYmdsVHlwZSwgd2ViZ2xUZXh0dXJlIHx8IGVtcHR5VGV4dHVyZXNbIHdlYmdsVHlwZSBdICk7CgogICAgCQkJYm91bmRUZXh0dXJlLnR5cGUgPSB3ZWJnbFR5cGU7CiAgICAJCQlib3VuZFRleHR1cmUudGV4dHVyZSA9IHdlYmdsVGV4dHVyZTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBjb21wcmVzc2VkVGV4SW1hZ2UyRCgpIHsKCiAgICAJCXRyeSB7CgogICAgCQkJZ2wuY29tcHJlc3NlZFRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTsKCiAgICAJCX0gY2F0Y2ggKCBlcnJvciApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHRleEltYWdlMkQoKSB7CgogICAgCQl0cnkgewoKICAgIAkJCWdsLnRleEltYWdlMkQuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTsKCiAgICAJCX0gY2F0Y2ggKCBlcnJvciApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHRleEltYWdlM0QoKSB7CgogICAgCQl0cnkgewoKICAgIAkJCWdsLnRleEltYWdlM0QuYXBwbHkoIGdsLCBhcmd1bWVudHMgKTsKCiAgICAJCX0gY2F0Y2ggKCBlcnJvciApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xTdGF0ZTonLCBlcnJvciApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vCgogICAgCWZ1bmN0aW9uIHNjaXNzb3IoIHNjaXNzb3IgKSB7CgogICAgCQlpZiAoIGN1cnJlbnRTY2lzc29yLmVxdWFscyggc2Npc3NvciApID09PSBmYWxzZSApIHsKCiAgICAJCQlnbC5zY2lzc29yKCBzY2lzc29yLngsIHNjaXNzb3IueSwgc2Npc3Nvci56LCBzY2lzc29yLncgKTsKICAgIAkJCWN1cnJlbnRTY2lzc29yLmNvcHkoIHNjaXNzb3IgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiB2aWV3cG9ydCggdmlld3BvcnQgKSB7CgogICAgCQlpZiAoIGN1cnJlbnRWaWV3cG9ydC5lcXVhbHMoIHZpZXdwb3J0ICkgPT09IGZhbHNlICkgewoKICAgIAkJCWdsLnZpZXdwb3J0KCB2aWV3cG9ydC54LCB2aWV3cG9ydC55LCB2aWV3cG9ydC56LCB2aWV3cG9ydC53ICk7CiAgICAJCQljdXJyZW50Vmlld3BvcnQuY29weSggdmlld3BvcnQgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLwoKICAgIAlmdW5jdGlvbiByZXNldCgpIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGVuYWJsZWRBdHRyaWJ1dGVzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQlpZiAoIGVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPT09IDEgKSB7CgogICAgCQkJCWdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheSggaSApOwogICAgCQkJCWVuYWJsZWRBdHRyaWJ1dGVzWyBpIF0gPSAwOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWVuYWJsZWRDYXBhYmlsaXRpZXMgPSB7fTsKCiAgICAJCWNvbXByZXNzZWRUZXh0dXJlRm9ybWF0cyA9IG51bGw7CgogICAgCQljdXJyZW50VGV4dHVyZVNsb3QgPSBudWxsOwogICAgCQljdXJyZW50Qm91bmRUZXh0dXJlcyA9IHt9OwoKICAgIAkJY3VycmVudFByb2dyYW0gPSBudWxsOwoKICAgIAkJY3VycmVudEJsZW5kaW5nID0gbnVsbDsKCiAgICAJCWN1cnJlbnRGbGlwU2lkZWQgPSBudWxsOwogICAgCQljdXJyZW50Q3VsbEZhY2UgPSBudWxsOwoKICAgIAkJY29sb3JCdWZmZXIucmVzZXQoKTsKICAgIAkJZGVwdGhCdWZmZXIucmVzZXQoKTsKICAgIAkJc3RlbmNpbEJ1ZmZlci5yZXNldCgpOwoKICAgIAl9CgogICAgCXJldHVybiB7CgogICAgCQlidWZmZXJzOiB7CiAgICAJCQljb2xvcjogY29sb3JCdWZmZXIsCiAgICAJCQlkZXB0aDogZGVwdGhCdWZmZXIsCiAgICAJCQlzdGVuY2lsOiBzdGVuY2lsQnVmZmVyCiAgICAJCX0sCgogICAgCQlpbml0QXR0cmlidXRlczogaW5pdEF0dHJpYnV0ZXMsCiAgICAJCWVuYWJsZUF0dHJpYnV0ZTogZW5hYmxlQXR0cmlidXRlLAogICAgCQllbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yOiBlbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yLAogICAgCQlkaXNhYmxlVW51c2VkQXR0cmlidXRlczogZGlzYWJsZVVudXNlZEF0dHJpYnV0ZXMsCiAgICAJCWVuYWJsZTogZW5hYmxlLAogICAgCQlkaXNhYmxlOiBkaXNhYmxlLAogICAgCQlnZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHM6IGdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cywKCiAgICAJCXVzZVByb2dyYW06IHVzZVByb2dyYW0sCgogICAgCQlzZXRCbGVuZGluZzogc2V0QmxlbmRpbmcsCiAgICAJCXNldE1hdGVyaWFsOiBzZXRNYXRlcmlhbCwKCiAgICAJCXNldEZsaXBTaWRlZDogc2V0RmxpcFNpZGVkLAogICAgCQlzZXRDdWxsRmFjZTogc2V0Q3VsbEZhY2UsCgogICAgCQlzZXRMaW5lV2lkdGg6IHNldExpbmVXaWR0aCwKICAgIAkJc2V0UG9seWdvbk9mZnNldDogc2V0UG9seWdvbk9mZnNldCwKCiAgICAJCXNldFNjaXNzb3JUZXN0OiBzZXRTY2lzc29yVGVzdCwKCiAgICAJCWFjdGl2ZVRleHR1cmU6IGFjdGl2ZVRleHR1cmUsCiAgICAJCWJpbmRUZXh0dXJlOiBiaW5kVGV4dHVyZSwKICAgIAkJY29tcHJlc3NlZFRleEltYWdlMkQ6IGNvbXByZXNzZWRUZXhJbWFnZTJELAogICAgCQl0ZXhJbWFnZTJEOiB0ZXhJbWFnZTJELAogICAgCQl0ZXhJbWFnZTNEOiB0ZXhJbWFnZTNELAoKICAgIAkJc2Npc3Nvcjogc2Npc3NvciwKICAgIAkJdmlld3BvcnQ6IHZpZXdwb3J0LAoKICAgIAkJcmVzZXQ6IHJlc2V0CgogICAgCX07CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMVGV4dHVyZXMoIF9nbCwgZXh0ZW5zaW9ucywgc3RhdGUsIHByb3BlcnRpZXMsIGNhcGFiaWxpdGllcywgdXRpbHMsIGluZm8gKSB7CgogICAgCXZhciBfdmlkZW9UZXh0dXJlcyA9IG5ldyBXZWFrTWFwKCk7CiAgICAJdmFyIF9jYW52YXM7CgogICAgCS8vCgogICAgCXZhciB1c2VPZmZzY3JlZW5DYW52YXMgPSB0eXBlb2YgT2Zmc2NyZWVuQ2FudmFzICE9PSAndW5kZWZpbmVkJzsKCiAgICAJZnVuY3Rpb24gY3JlYXRlQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICkgewoKICAgIAkJLy8gVXNlIE9mZnNjcmVlbkNhbnZhcyB3aGVuIGF2YWlsYWJsZS4gU3BlY2lhbGx5IG5lZWRlZCBpbiB3ZWIgd29ya2VycwoKICAgIAkJcmV0dXJuIHVzZU9mZnNjcmVlbkNhbnZhcyA/CiAgICAJCQluZXcgT2Zmc2NyZWVuQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICkgOgogICAgCQkJZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKCAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsICdjYW52YXMnICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcmVzaXplSW1hZ2UoIGltYWdlLCBuZWVkc1Bvd2VyT2ZUd28sIG5lZWRzTmV3Q2FudmFzLCBtYXhTaXplICkgewoKICAgIAkJdmFyIHNjYWxlID0gMTsKCiAgICAJCS8vIGhhbmRsZSBjYXNlIGlmIHRleHR1cmUgZXhjZWVkcyBtYXggc2l6ZQoKICAgIAkJaWYgKCBpbWFnZS53aWR0aCA+IG1heFNpemUgfHwgaW1hZ2UuaGVpZ2h0ID4gbWF4U2l6ZSApIHsKCiAgICAJCQlzY2FsZSA9IG1heFNpemUgLyBNYXRoLm1heCggaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCApOwoKICAgIAkJfQoKICAgIAkJLy8gb25seSBwZXJmb3JtIHJlc2l6ZSBpZiBuZWNlc3NhcnkKCiAgICAJCWlmICggc2NhbGUgPCAxIHx8IG5lZWRzUG93ZXJPZlR3byA9PT0gdHJ1ZSApIHsKCiAgICAJCQkvLyBvbmx5IHBlcmZvcm0gcmVzaXplIGZvciBjZXJ0YWluIGltYWdlIHR5cGVzCgogICAgCQkJaWYgKCAoIHR5cGVvZiBIVE1MSW1hZ2VFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgKSB8fAogICAgCQkJCSggdHlwZW9mIEhUTUxDYW52YXNFbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBpbWFnZSBpbnN0YW5jZW9mIEhUTUxDYW52YXNFbGVtZW50ICkgfHwKICAgIAkJCQkoIHR5cGVvZiBJbWFnZUJpdG1hcCAhPT0gJ3VuZGVmaW5lZCcgJiYgaW1hZ2UgaW5zdGFuY2VvZiBJbWFnZUJpdG1hcCApICkgewoKICAgIAkJCQl2YXIgZmxvb3IgPSBuZWVkc1Bvd2VyT2ZUd28gPyBfTWF0aC5mbG9vclBvd2VyT2ZUd28gOiBNYXRoLmZsb29yOwoKICAgIAkJCQl2YXIgd2lkdGggPSBmbG9vciggc2NhbGUgKiBpbWFnZS53aWR0aCApOwogICAgCQkJCXZhciBoZWlnaHQgPSBmbG9vciggc2NhbGUgKiBpbWFnZS5oZWlnaHQgKTsKCiAgICAJCQkJaWYgKCBfY2FudmFzID09PSB1bmRlZmluZWQgKSBfY2FudmFzID0gY3JlYXRlQ2FudmFzKCB3aWR0aCwgaGVpZ2h0ICk7CgogICAgCQkJCS8vIGN1YmUgdGV4dHVyZXMgY2FuJ3QgcmV1c2UgdGhlIHNhbWUgY2FudmFzCgogICAgCQkJCXZhciBjYW52YXMgPSBuZWVkc05ld0NhbnZhcyA/IGNyZWF0ZUNhbnZhcyggd2lkdGgsIGhlaWdodCApIDogX2NhbnZhczsKCiAgICAJCQkJY2FudmFzLndpZHRoID0gd2lkdGg7CiAgICAJCQkJY2FudmFzLmhlaWdodCA9IGhlaWdodDsKCiAgICAJCQkJdmFyIGNvbnRleHQgPSBjYW52YXMuZ2V0Q29udGV4dCggJzJkJyApOwogICAgCQkJCWNvbnRleHQuZHJhd0ltYWdlKCBpbWFnZSwgMCwgMCwgd2lkdGgsIGhlaWdodCApOwoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBUZXh0dXJlIGhhcyBiZWVuIHJlc2l6ZWQgZnJvbSAoJyArIGltYWdlLndpZHRoICsgJ3gnICsgaW1hZ2UuaGVpZ2h0ICsgJykgdG8gKCcgKyB3aWR0aCArICd4JyArIGhlaWdodCArICcpLicgKTsKCiAgICAJCQkJcmV0dXJuIGNhbnZhczsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlpZiAoICdkYXRhJyBpbiBpbWFnZSApIHsKCiAgICAJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEltYWdlIGluIERhdGFUZXh0dXJlIGlzIHRvbyBiaWcgKCcgKyBpbWFnZS53aWR0aCArICd4JyArIGltYWdlLmhlaWdodCArICcpLicgKTsKCiAgICAJCQkJfQoKICAgIAkJCQlyZXR1cm4gaW1hZ2U7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGltYWdlOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGlzUG93ZXJPZlR3byggaW1hZ2UgKSB7CgogICAgCQlyZXR1cm4gX01hdGguaXNQb3dlck9mVHdvKCBpbWFnZS53aWR0aCApICYmIF9NYXRoLmlzUG93ZXJPZlR3byggaW1hZ2UuaGVpZ2h0ICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gdGV4dHVyZU5lZWRzUG93ZXJPZlR3byggdGV4dHVyZSApIHsKCiAgICAJCWlmICggY2FwYWJpbGl0aWVzLmlzV2ViR0wyICkgcmV0dXJuIGZhbHNlOwoKICAgIAkJcmV0dXJuICggdGV4dHVyZS53cmFwUyAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyB8fCB0ZXh0dXJlLndyYXBUICE9PSBDbGFtcFRvRWRnZVdyYXBwaW5nICkgfHwKICAgIAkJCSggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgewoKICAgIAkJcmV0dXJuIHRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzICYmIHN1cHBvcnRzTWlwcyAmJgogICAgCQkJdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlcjsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZW5lcmF0ZU1pcG1hcCggdGFyZ2V0LCB0ZXh0dXJlLCB3aWR0aCwgaGVpZ2h0ICkgewoKICAgIAkJX2dsLmdlbmVyYXRlTWlwbWFwKCB0YXJnZXQgKTsKCiAgICAJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7CgogICAgCQkvLyBOb3RlOiBNYXRoLmxvZyggeCApICogTWF0aC5MT0cyRSB1c2VkIGluc3RlYWQgb2YgTWF0aC5sb2cyKCB4ICkgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBieSBJRTExCiAgICAJCXRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBNYXRoLmxvZyggTWF0aC5tYXgoIHdpZHRoLCBoZWlnaHQgKSApICogTWF0aC5MT0cyRTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZXRJbnRlcm5hbEZvcm1hdCggZ2xGb3JtYXQsIGdsVHlwZSApIHsKCiAgICAJCWlmICggISBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gZ2xGb3JtYXQ7CgogICAgCQl2YXIgaW50ZXJuYWxGb3JtYXQgPSBnbEZvcm1hdDsKCiAgICAJCWlmICggZ2xGb3JtYXQgPT09IDY0MDMgKSB7CgogICAgCQkJaWYgKCBnbFR5cGUgPT09IDUxMjYgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzI2OwogICAgCQkJaWYgKCBnbFR5cGUgPT09IDUxMzEgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzI1OwogICAgCQkJaWYgKCBnbFR5cGUgPT09IDUxMjEgKSBpbnRlcm5hbEZvcm1hdCA9IDMzMzIxOwoKICAgIAkJfQoKICAgIAkJaWYgKCBnbEZvcm1hdCA9PT0gNjQwNyApIHsKCiAgICAJCQlpZiAoIGdsVHlwZSA9PT0gNTEyNiApIGludGVybmFsRm9ybWF0ID0gMzQ4Mzc7CiAgICAJCQlpZiAoIGdsVHlwZSA9PT0gNTEzMSApIGludGVybmFsRm9ybWF0ID0gMzQ4NDM7CiAgICAJCQlpZiAoIGdsVHlwZSA9PT0gNTEyMSApIGludGVybmFsRm9ybWF0ID0gMzI4NDk7CgogICAgCQl9CgogICAgCQlpZiAoIGdsRm9ybWF0ID09PSA2NDA4ICkgewoKICAgIAkJCWlmICggZ2xUeXBlID09PSA1MTI2ICkgaW50ZXJuYWxGb3JtYXQgPSAzNDgzNjsKICAgIAkJCWlmICggZ2xUeXBlID09PSA1MTMxICkgaW50ZXJuYWxGb3JtYXQgPSAzNDg0MjsKICAgIAkJCWlmICggZ2xUeXBlID09PSA1MTIxICkgaW50ZXJuYWxGb3JtYXQgPSAzMjg1NjsKCiAgICAJCX0KCiAgICAJCWlmICggaW50ZXJuYWxGb3JtYXQgPT09IDMzMzI1IHx8IGludGVybmFsRm9ybWF0ID09PSAzMzMyNiB8fAogICAgCQkJaW50ZXJuYWxGb3JtYXQgPT09IDM0ODQyIHx8IGludGVybmFsRm9ybWF0ID09PSAzNDgzNiApIHsKCiAgICAJCQlleHRlbnNpb25zLmdldCggJ0VYVF9jb2xvcl9idWZmZXJfZmxvYXQnICk7CgogICAgCQl9IGVsc2UgaWYgKCBpbnRlcm5hbEZvcm1hdCA9PT0gMzQ4NDMgfHwgaW50ZXJuYWxGb3JtYXQgPT09IDM0ODM3ICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IEZsb2F0aW5nIHBvaW50IHRleHR1cmVzIHdpdGggUkdCIGZvcm1hdCBub3Qgc3VwcG9ydGVkLiBQbGVhc2UgdXNlIFJHQkEgaW5zdGVhZC4nICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gaW50ZXJuYWxGb3JtYXQ7CgogICAgCX0KCiAgICAJLy8gRmFsbGJhY2sgZmlsdGVycyBmb3Igbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXMKCiAgICAJZnVuY3Rpb24gZmlsdGVyRmFsbGJhY2soIGYgKSB7CgogICAgCQlpZiAoIGYgPT09IE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIgfHwgZiA9PT0gTmVhcmVzdE1pcG1hcExpbmVhckZpbHRlciApIHsKCiAgICAJCQlyZXR1cm4gOTcyODsKCiAgICAJCX0KCiAgICAJCXJldHVybiA5NzI5OwoKICAgIAl9CgogICAgCS8vCgogICAgCWZ1bmN0aW9uIG9uVGV4dHVyZURpc3Bvc2UoIGV2ZW50ICkgewoKICAgIAkJdmFyIHRleHR1cmUgPSBldmVudC50YXJnZXQ7CgogICAgCQl0ZXh0dXJlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApOwoKICAgIAkJZGVhbGxvY2F0ZVRleHR1cmUoIHRleHR1cmUgKTsKCiAgICAJCWlmICggdGV4dHVyZS5pc1ZpZGVvVGV4dHVyZSApIHsKCiAgICAJCQlfdmlkZW9UZXh0dXJlcy5kZWxldGUoIHRleHR1cmUgKTsKCiAgICAJCX0KCiAgICAJCWluZm8ubWVtb3J5LnRleHR1cmVzIC0tOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIG9uUmVuZGVyVGFyZ2V0RGlzcG9zZSggZXZlbnQgKSB7CgogICAgCQl2YXIgcmVuZGVyVGFyZ2V0ID0gZXZlbnQudGFyZ2V0OwoKICAgIAkJcmVuZGVyVGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7CgogICAgCQlkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTsKCiAgICAJCWluZm8ubWVtb3J5LnRleHR1cmVzIC0tOwoKICAgIAl9CgogICAgCS8vCgogICAgCWZ1bmN0aW9uIGRlYWxsb2NhdGVUZXh0dXJlKCB0ZXh0dXJlICkgewoKICAgIAkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTsKCiAgICAJCWlmICggdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbEluaXQgPT09IHVuZGVmaW5lZCApIHJldHVybjsKCiAgICAJCV9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoKICAgIAkJcHJvcGVydGllcy5yZW1vdmUoIHRleHR1cmUgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBkZWFsbG9jYXRlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7CgogICAgCQl2YXIgcmVuZGVyVGFyZ2V0UHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKTsKICAgIAkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7CgogICAgCQlpZiAoICEgcmVuZGVyVGFyZ2V0ICkgcmV0dXJuOwoKICAgIAkJaWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCV9nbC5kZWxldGVUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkgewoKICAgIAkJCXJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZGlzcG9zZSgpOwoKICAgIAkJfQoKICAgIAkJaWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKCiAgICAJCQkJX2dsLmRlbGV0ZUZyYW1lYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdICk7CiAgICAJCQkJaWYgKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApIF9nbC5kZWxldGVSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyWyBpIF0gKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCV9nbC5kZWxldGVGcmFtZWJ1ZmZlciggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTsKICAgIAkJCWlmICggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIgKSBfZ2wuZGVsZXRlUmVuZGVyYnVmZmVyKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciApOwoKICAgIAkJfQoKICAgIAkJcHJvcGVydGllcy5yZW1vdmUoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7CiAgICAJCXByb3BlcnRpZXMucmVtb3ZlKCByZW5kZXJUYXJnZXQgKTsKCiAgICAJfQoKICAgIAkvLwoKICAgIAl2YXIgdGV4dHVyZVVuaXRzID0gMDsKCiAgICAJZnVuY3Rpb24gcmVzZXRUZXh0dXJlVW5pdHMoKSB7CgogICAgCQl0ZXh0dXJlVW5pdHMgPSAwOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGFsbG9jYXRlVGV4dHVyZVVuaXQoKSB7CgogICAgCQl2YXIgdGV4dHVyZVVuaXQgPSB0ZXh0dXJlVW5pdHM7CgogICAgCQlpZiAoIHRleHR1cmVVbml0ID49IGNhcGFiaWxpdGllcy5tYXhUZXh0dXJlcyApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFRleHR1cmVzOiBUcnlpbmcgdG8gdXNlICcgKyB0ZXh0dXJlVW5pdCArICcgdGV4dHVyZSB1bml0cyB3aGlsZSB0aGlzIEdQVSBzdXBwb3J0cyBvbmx5ICcgKyBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZXMgKTsKCiAgICAJCX0KCiAgICAJCXRleHR1cmVVbml0cyArPSAxOwoKICAgIAkJcmV0dXJuIHRleHR1cmVVbml0OwoKICAgIAl9CgogICAgCS8vCgogICAgCWZ1bmN0aW9uIHNldFRleHR1cmUyRCggdGV4dHVyZSwgc2xvdCApIHsKCiAgICAJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7CgogICAgCQlpZiAoIHRleHR1cmUuaXNWaWRlb1RleHR1cmUgKSB1cGRhdGVWaWRlb1RleHR1cmUoIHRleHR1cmUgKTsKCiAgICAJCWlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHsKCiAgICAJCQl2YXIgaW1hZ2UgPSB0ZXh0dXJlLmltYWdlOwoKICAgIAkJCWlmICggaW1hZ2UgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgdW5kZWZpbmVkJyApOwoKICAgIAkJCX0gZWxzZSBpZiAoIGltYWdlLmNvbXBsZXRlID09PSBmYWxzZSApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBtYXJrZWQgZm9yIHVwZGF0ZSBidXQgaW1hZ2UgaXMgaW5jb21wbGV0ZScgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQl1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApOwogICAgCQkJCXJldHVybjsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTsKICAgIAkJc3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2V0VGV4dHVyZTJEQXJyYXkoIHRleHR1cmUsIHNsb3QgKSB7CgogICAgCQl2YXIgdGV4dHVyZVByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggdGV4dHVyZSApOwoKICAgIAkJaWYgKCB0ZXh0dXJlLnZlcnNpb24gPiAwICYmIHRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiAhPT0gdGV4dHVyZS52ZXJzaW9uICkgewoKICAgIAkJCXVwbG9hZFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlLCBzbG90ICk7CiAgICAJCQlyZXR1cm47CgogICAgCQl9CgogICAgCQlzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTsKICAgIAkJc3RhdGUuYmluZFRleHR1cmUoIDM1ODY2LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHNldFRleHR1cmUzRCggdGV4dHVyZSwgc2xvdCApIHsKCiAgICAJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICk7CgogICAgCQlpZiAoIHRleHR1cmUudmVyc2lvbiA+IDAgJiYgdGV4dHVyZVByb3BlcnRpZXMuX192ZXJzaW9uICE9PSB0ZXh0dXJlLnZlcnNpb24gKSB7CgogICAgCQkJdXBsb2FkVGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUsIHNsb3QgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApOwogICAgCQlzdGF0ZS5iaW5kVGV4dHVyZSggMzI4NzksIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2V0VGV4dHVyZUN1YmUoIHRleHR1cmUsIHNsb3QgKSB7CgogICAgCQlpZiAoIHRleHR1cmUuaW1hZ2UubGVuZ3RoICE9PSA2ICkgcmV0dXJuOwoKICAgIAkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKTsKCiAgICAJCWlmICggdGV4dHVyZS52ZXJzaW9uID4gMCAmJiB0ZXh0dXJlUHJvcGVydGllcy5fX3ZlcnNpb24gIT09IHRleHR1cmUudmVyc2lvbiApIHsKCiAgICAJCQlpbml0VGV4dHVyZSggdGV4dHVyZVByb3BlcnRpZXMsIHRleHR1cmUgKTsKCiAgICAJCQlzdGF0ZS5hY3RpdmVUZXh0dXJlKCAzMzk4NCArIHNsb3QgKTsKICAgIAkJCXN0YXRlLmJpbmRUZXh0dXJlKCAzNDA2NywgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKCiAgICAJCQlfZ2wucGl4ZWxTdG9yZWkoIDM3NDQwLCB0ZXh0dXJlLmZsaXBZICk7CgogICAgCQkJdmFyIGlzQ29tcHJlc3NlZCA9ICggdGV4dHVyZSAmJiB0ZXh0dXJlLmlzQ29tcHJlc3NlZFRleHR1cmUgKTsKICAgIAkJCXZhciBpc0RhdGFUZXh0dXJlID0gKCB0ZXh0dXJlLmltYWdlWyAwIF0gJiYgdGV4dHVyZS5pbWFnZVsgMCBdLmlzRGF0YVRleHR1cmUgKTsKCiAgICAJCQl2YXIgY3ViZUltYWdlID0gW107CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgNjsgaSArKyApIHsKCiAgICAJCQkJaWYgKCAhIGlzQ29tcHJlc3NlZCAmJiAhIGlzRGF0YVRleHR1cmUgKSB7CgogICAgCQkJCQljdWJlSW1hZ2VbIGkgXSA9IHJlc2l6ZUltYWdlKCB0ZXh0dXJlLmltYWdlWyBpIF0sIGZhbHNlLCB0cnVlLCBjYXBhYmlsaXRpZXMubWF4Q3ViZW1hcFNpemUgKTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCWN1YmVJbWFnZVsgaSBdID0gaXNEYXRhVGV4dHVyZSA/IHRleHR1cmUuaW1hZ2VbIGkgXS5pbWFnZSA6IHRleHR1cmUuaW1hZ2VbIGkgXTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQl2YXIgaW1hZ2UgPSBjdWJlSW1hZ2VbIDAgXSwKICAgIAkJCQlzdXBwb3J0c01pcHMgPSBpc1Bvd2VyT2ZUd28oIGltYWdlICkgfHwgY2FwYWJpbGl0aWVzLmlzV2ViR0wyLAogICAgCQkJCWdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSwKICAgIAkJCQlnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLnR5cGUgKSwKICAgIAkJCQlnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIGdsRm9ybWF0LCBnbFR5cGUgKTsKCiAgICAJCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggMzQwNjcsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApOwoKICAgIAkJCXZhciBtaXBtYXBzOwoKICAgIAkJCWlmICggaXNDb21wcmVzc2VkICkgewoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCQkJbWlwbWFwcyA9IGN1YmVJbWFnZVsgaSBdLm1pcG1hcHM7CgogICAgCQkJCQlmb3IgKCB2YXIgaiA9IDA7IGogPCBtaXBtYXBzLmxlbmd0aDsgaiArKyApIHsKCiAgICAJCQkJCQl2YXIgbWlwbWFwID0gbWlwbWFwc1sgaiBdOwoKICAgIAkJCQkJCWlmICggdGV4dHVyZS5mb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdGV4dHVyZS5mb3JtYXQgIT09IFJHQkZvcm1hdCApIHsKCiAgICAJCQkJCQkJaWYgKCBzdGF0ZS5nZXRDb21wcmVzc2VkVGV4dHVyZUZvcm1hdHMoKS5pbmRleE9mKCBnbEZvcm1hdCApID4gLSAxICkgewoKICAgIAkJCQkJCQkJc3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIDM0MDY5ICsgaSwgaiwgZ2xJbnRlcm5hbEZvcm1hdCwgbWlwbWFwLndpZHRoLCBtaXBtYXAuaGVpZ2h0LCAwLCBtaXBtYXAuZGF0YSApOwoKICAgIAkJCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnNldFRleHR1cmVDdWJlKCknICk7CgogICAgCQkJCQkJCX0KCiAgICAJCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCAzNDA2OSArIGksIGosIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTsKCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQkJdGV4dHVyZVByb3BlcnRpZXMuX19tYXhNaXBMZXZlbCA9IG1pcG1hcHMubGVuZ3RoIC0gMTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQltaXBtYXBzID0gdGV4dHVyZS5taXBtYXBzOwoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCQkJaWYgKCBpc0RhdGFUZXh0dXJlICkgewoKICAgIAkJCQkJCXN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgY3ViZUltYWdlWyBpIF0ud2lkdGgsIGN1YmVJbWFnZVsgaSBdLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgY3ViZUltYWdlWyBpIF0uZGF0YSApOwoKICAgIAkJCQkJCWZvciAoIHZhciBqID0gMDsgaiA8IG1pcG1hcHMubGVuZ3RoOyBqICsrICkgewoKICAgIAkJCQkJCQl2YXIgbWlwbWFwID0gbWlwbWFwc1sgaiBdOwogICAgCQkJCQkJCXZhciBtaXBtYXBJbWFnZSA9IG1pcG1hcC5pbWFnZVsgaSBdLmltYWdlOwoKICAgIAkJCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCAzNDA2OSArIGksIGogKyAxLCBnbEludGVybmFsRm9ybWF0LCBtaXBtYXBJbWFnZS53aWR0aCwgbWlwbWFwSW1hZ2UuaGVpZ2h0LCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXBJbWFnZS5kYXRhICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCAzNDA2OSArIGksIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIGN1YmVJbWFnZVsgaSBdICk7CgogICAgCQkJCQkJZm9yICggdmFyIGogPSAwOyBqIDwgbWlwbWFwcy5sZW5ndGg7IGogKysgKSB7CgogICAgCQkJCQkJCXZhciBtaXBtYXAgPSBtaXBtYXBzWyBqIF07CgogICAgCQkJCQkJCXN0YXRlLnRleEltYWdlMkQoIDM0MDY5ICsgaSwgaiArIDEsIGdsSW50ZXJuYWxGb3JtYXQsIGdsRm9ybWF0LCBnbFR5cGUsIG1pcG1hcC5pbWFnZVsgaSBdICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aDsKCiAgICAJCQl9CgogICAgCQkJaWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkgewoKICAgIAkJCQkvLyBXZSBhc3N1bWUgaW1hZ2VzIGZvciBjdWJlIG1hcCBoYXZlIHRoZSBzYW1lIHNpemUuCiAgICAJCQkJZ2VuZXJhdGVNaXBtYXAoIDM0MDY3LCB0ZXh0dXJlLCBpbWFnZS53aWR0aCwgaW1hZ2UuaGVpZ2h0ICk7CgogICAgCQkJfQoKICAgIAkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjsKCiAgICAJCQlpZiAoIHRleHR1cmUub25VcGRhdGUgKSB0ZXh0dXJlLm9uVXBkYXRlKCB0ZXh0dXJlICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApOwogICAgCQkJc3RhdGUuYmluZFRleHR1cmUoIDM0MDY3LCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHNldFRleHR1cmVDdWJlRHluYW1pYyggdGV4dHVyZSwgc2xvdCApIHsKCiAgICAJCXN0YXRlLmFjdGl2ZVRleHR1cmUoIDMzOTg0ICsgc2xvdCApOwogICAgCQlzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX193ZWJnbFRleHR1cmUgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApIHsKCiAgICAJCXZhciBleHRlbnNpb247CgogICAgCQlpZiAoIHN1cHBvcnRzTWlwcyApIHsKCiAgICAJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQyLCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLndyYXBTICkgKTsKICAgIAkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDMsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUud3JhcFQgKSApOwoKICAgIAkJCWlmICggdGV4dHVyZVR5cGUgPT09IDMyODc5IHx8IHRleHR1cmVUeXBlID09PSAzNTg2NiApIHsKCiAgICAJCQkJX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAzMjg4MiwgdXRpbHMuY29udmVydCggdGV4dHVyZS53cmFwUiApICk7CgogICAgCQkJfQoKICAgIAkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDAsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUubWFnRmlsdGVyICkgKTsKICAgIAkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDEsIHV0aWxzLmNvbnZlcnQoIHRleHR1cmUubWluRmlsdGVyICkgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJX2dsLnRleFBhcmFtZXRlcmkoIHRleHR1cmVUeXBlLCAxMDI0MiwgMzMwNzEgKTsKICAgIAkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDMsIDMzMDcxICk7CgogICAgCQkJaWYgKCB0ZXh0dXJlVHlwZSA9PT0gMzI4NzkgfHwgdGV4dHVyZVR5cGUgPT09IDM1ODY2ICkgewoKICAgIAkJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDMyODgyLCAzMzA3MSApOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIHRleHR1cmUud3JhcFMgIT09IENsYW1wVG9FZGdlV3JhcHBpbmcgfHwgdGV4dHVyZS53cmFwVCAhPT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLndyYXBTIGFuZCBUZXh0dXJlLndyYXBUIHNob3VsZCBiZSBzZXQgdG8gVEhSRUUuQ2xhbXBUb0VkZ2VXcmFwcGluZy4nICk7CgogICAgCQkJfQoKICAgIAkJCV9nbC50ZXhQYXJhbWV0ZXJpKCB0ZXh0dXJlVHlwZSwgMTAyNDAsIGZpbHRlckZhbGxiYWNrKCB0ZXh0dXJlLm1hZ0ZpbHRlciApICk7CiAgICAJCQlfZ2wudGV4UGFyYW1ldGVyaSggdGV4dHVyZVR5cGUsIDEwMjQxLCBmaWx0ZXJGYWxsYmFjayggdGV4dHVyZS5taW5GaWx0ZXIgKSApOwoKICAgIAkJCWlmICggdGV4dHVyZS5taW5GaWx0ZXIgIT09IE5lYXJlc3RGaWx0ZXIgJiYgdGV4dHVyZS5taW5GaWx0ZXIgIT09IExpbmVhckZpbHRlciApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogVGV4dHVyZSBpcyBub3QgcG93ZXIgb2YgdHdvLiBUZXh0dXJlLm1pbkZpbHRlciBzaG91bGQgYmUgc2V0IHRvIFRIUkVFLk5lYXJlc3RGaWx0ZXIgb3IgVEhSRUUuTGluZWFyRmlsdGVyLicgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ0VYVF90ZXh0dXJlX2ZpbHRlcl9hbmlzb3Ryb3BpYycgKTsKCiAgICAJCWlmICggZXh0ZW5zaW9uICkgewoKICAgIAkJCWlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgJiYgZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdF9saW5lYXInICkgPT09IG51bGwgKSByZXR1cm47CiAgICAJCQlpZiAoIHRleHR1cmUudHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRfbGluZWFyJyApICkgPT09IG51bGwgKSByZXR1cm47CgogICAgCQkJaWYgKCB0ZXh0dXJlLmFuaXNvdHJvcHkgPiAxIHx8IHByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSApIHsKCiAgICAJCQkJX2dsLnRleFBhcmFtZXRlcmYoIHRleHR1cmVUeXBlLCBleHRlbnNpb24uVEVYVFVSRV9NQVhfQU5JU09UUk9QWV9FWFQsIE1hdGgubWluKCB0ZXh0dXJlLmFuaXNvdHJvcHksIGNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkgKSApOwogICAgCQkJCXByb3BlcnRpZXMuZ2V0KCB0ZXh0dXJlICkuX19jdXJyZW50QW5pc290cm9weSA9IHRleHR1cmUuYW5pc290cm9weTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaW5pdFRleHR1cmUoIHRleHR1cmVQcm9wZXJ0aWVzLCB0ZXh0dXJlICkgewoKICAgIAkJaWYgKCB0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsSW5pdCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xJbml0ID0gdHJ1ZTsKCiAgICAJCQl0ZXh0dXJlLmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25UZXh0dXJlRGlzcG9zZSApOwoKICAgIAkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlID0gX2dsLmNyZWF0ZVRleHR1cmUoKTsKCiAgICAJCQlpbmZvLm1lbW9yeS50ZXh0dXJlcyArKzsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiB1cGxvYWRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSwgc2xvdCApIHsKCiAgICAJCXZhciB0ZXh0dXJlVHlwZSA9IDM1NTM7CgogICAgCQlpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZTJEQXJyYXkgKSB0ZXh0dXJlVHlwZSA9IDM1ODY2OwogICAgCQlpZiAoIHRleHR1cmUuaXNEYXRhVGV4dHVyZTNEICkgdGV4dHVyZVR5cGUgPSAzMjg3OTsKCiAgICAJCWluaXRUZXh0dXJlKCB0ZXh0dXJlUHJvcGVydGllcywgdGV4dHVyZSApOwoKICAgIAkJc3RhdGUuYWN0aXZlVGV4dHVyZSggMzM5ODQgKyBzbG90ICk7CiAgICAJCXN0YXRlLmJpbmRUZXh0dXJlKCB0ZXh0dXJlVHlwZSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUgKTsKCiAgICAJCV9nbC5waXhlbFN0b3JlaSggMzc0NDAsIHRleHR1cmUuZmxpcFkgKTsKICAgIAkJX2dsLnBpeGVsU3RvcmVpKCAzNzQ0MSwgdGV4dHVyZS5wcmVtdWx0aXBseUFscGhhICk7CiAgICAJCV9nbC5waXhlbFN0b3JlaSggMzMxNywgdGV4dHVyZS51bnBhY2tBbGlnbm1lbnQgKTsKCiAgICAJCXZhciBuZWVkc1Bvd2VyT2ZUd28gPSB0ZXh0dXJlTmVlZHNQb3dlck9mVHdvKCB0ZXh0dXJlICkgJiYgaXNQb3dlck9mVHdvKCB0ZXh0dXJlLmltYWdlICkgPT09IGZhbHNlOwogICAgCQl2YXIgaW1hZ2UgPSByZXNpemVJbWFnZSggdGV4dHVyZS5pbWFnZSwgbmVlZHNQb3dlck9mVHdvLCBmYWxzZSwgY2FwYWJpbGl0aWVzLm1heFRleHR1cmVTaXplICk7CgogICAgCQl2YXIgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCBpbWFnZSApIHx8IGNhcGFiaWxpdGllcy5pc1dlYkdMMiwKICAgIAkJCWdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggdGV4dHVyZS5mb3JtYXQgKSwKICAgIAkJCWdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApLAogICAgCQkJZ2xJbnRlcm5hbEZvcm1hdCA9IGdldEludGVybmFsRm9ybWF0KCBnbEZvcm1hdCwgZ2xUeXBlICk7CgogICAgCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggdGV4dHVyZVR5cGUsIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApOwoKICAgIAkJdmFyIG1pcG1hcCwgbWlwbWFwcyA9IHRleHR1cmUubWlwbWFwczsKCiAgICAJCWlmICggdGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApIHsKCiAgICAJCQkvLyBwb3B1bGF0ZSBkZXB0aCB0ZXh0dXJlIHdpdGggZHVtbXkgZGF0YQoKICAgIAkJCWdsSW50ZXJuYWxGb3JtYXQgPSA2NDAyOwoKICAgIAkJCWlmICggdGV4dHVyZS50eXBlID09PSBGbG9hdFR5cGUgKSB7CgogICAgCQkJCWlmICggISBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB0aHJvdyBuZXcgRXJyb3IoICdGbG9hdCBEZXB0aCBUZXh0dXJlIG9ubHkgc3VwcG9ydGVkIGluIFdlYkdMMi4wJyApOwogICAgCQkJCWdsSW50ZXJuYWxGb3JtYXQgPSAzNjAxMjsKCiAgICAJCQl9IGVsc2UgaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7CgogICAgCQkJCS8vIFdlYkdMIDIuMCByZXF1aXJlcyBzaWduZWQgaW50ZXJuYWxmb3JtYXQgZm9yIGdsVGV4SW1hZ2UyRAogICAgCQkJCWdsSW50ZXJuYWxGb3JtYXQgPSAzMzE4OTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhGb3JtYXQgJiYgZ2xJbnRlcm5hbEZvcm1hdCA9PT0gNjQwMiApIHsKCiAgICAJCQkJLy8gVGhlIGVycm9yIElOVkFMSURfT1BFUkFUSU9OIGlzIGdlbmVyYXRlZCBieSB0ZXhJbWFnZTJEIGlmIGZvcm1hdCBhbmQgaW50ZXJuYWxmb3JtYXQgYXJlCiAgICAJCQkJLy8gREVQVEhfQ09NUE9ORU5UIGFuZCB0eXBlIGlzIG5vdCBVTlNJR05FRF9TSE9SVCBvciBVTlNJR05FRF9JTlQKICAgIAkJCQkvLyAoaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvd2ViZ2wvZXh0ZW5zaW9ucy9XRUJHTF9kZXB0aF90ZXh0dXJlLykKICAgIAkJCQlpZiAoIHRleHR1cmUudHlwZSAhPT0gVW5zaWduZWRTaG9ydFR5cGUgJiYgdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludFR5cGUgKSB7CgogICAgCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRTaG9ydFR5cGUgb3IgVW5zaWduZWRJbnRUeXBlIGZvciBEZXB0aEZvcm1hdCBEZXB0aFRleHR1cmUuJyApOwoKICAgIAkJCQkJdGV4dHVyZS50eXBlID0gVW5zaWduZWRTaG9ydFR5cGU7CiAgICAJCQkJCWdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHRleHR1cmUudHlwZSApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCS8vIERlcHRoIHN0ZW5jaWwgdGV4dHVyZXMgbmVlZCB0aGUgREVQVEhfU1RFTkNJTCBpbnRlcm5hbCBmb3JtYXQKICAgIAkJCS8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKQogICAgCQkJaWYgKCB0ZXh0dXJlLmZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgewoKICAgIAkJCQlnbEludGVybmFsRm9ybWF0ID0gMzQwNDE7CgogICAgCQkJCS8vIFRoZSBlcnJvciBJTlZBTElEX09QRVJBVElPTiBpcyBnZW5lcmF0ZWQgYnkgdGV4SW1hZ2UyRCBpZiBmb3JtYXQgYW5kIGludGVybmFsZm9ybWF0IGFyZQogICAgCQkJCS8vIERFUFRIX1NURU5DSUwgYW5kIHR5cGUgaXMgbm90IFVOU0lHTkVEX0lOVF8yNF84X1dFQkdMLgogICAgCQkJCS8vIChodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS93ZWJnbC9leHRlbnNpb25zL1dFQkdMX2RlcHRoX3RleHR1cmUvKQogICAgCQkJCWlmICggdGV4dHVyZS50eXBlICE9PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7CgogICAgCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBVc2UgVW5zaWduZWRJbnQyNDhUeXBlIGZvciBEZXB0aFN0ZW5jaWxGb3JtYXQgRGVwdGhUZXh0dXJlLicgKTsKCiAgICAJCQkJCXRleHR1cmUudHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTsKICAgIAkJCQkJZ2xUeXBlID0gdXRpbHMuY29udmVydCggdGV4dHVyZS50eXBlICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJc3RhdGUudGV4SW1hZ2UyRCggMzU1MywgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbnVsbCApOwoKICAgIAkJfSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlICkgewoKICAgIAkJCS8vIHVzZSBtYW51YWxseSBjcmVhdGVkIG1pcG1hcHMgaWYgYXZhaWxhYmxlCiAgICAJCQkvLyBpZiB0aGVyZSBhcmUgbm8gbWFudWFsIG1pcG1hcHMKICAgIAkJCS8vIHNldCAwIGxldmVsIG1pcG1hcCBhbmQgdGhlbiB1c2UgR0wgdG8gZ2VuZXJhdGUgb3RoZXIgbWlwbWFwIGxldmVscwoKICAgIAkJCWlmICggbWlwbWFwcy5sZW5ndGggPiAwICYmIHN1cHBvcnRzTWlwcyApIHsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1pcG1hcHMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQltaXBtYXAgPSBtaXBtYXBzWyBpIF07CiAgICAJCQkJCXN0YXRlLnRleEltYWdlMkQoIDM1NTMsIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTsKCiAgICAJCQkJfQoKICAgIAkJCQl0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJc3RhdGUudGV4SW1hZ2UyRCggMzU1MywgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UuZGF0YSApOwogICAgCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwOwoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSBpZiAoIHRleHR1cmUuaXNDb21wcmVzc2VkVGV4dHVyZSApIHsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gbWlwbWFwcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJbWlwbWFwID0gbWlwbWFwc1sgaSBdOwoKICAgIAkJCQlpZiAoIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JBRm9ybWF0ICYmIHRleHR1cmUuZm9ybWF0ICE9PSBSR0JGb3JtYXQgKSB7CgogICAgCQkJCQlpZiAoIHN0YXRlLmdldENvbXByZXNzZWRUZXh0dXJlRm9ybWF0cygpLmluZGV4T2YoIGdsRm9ybWF0ICkgPiAtIDEgKSB7CgogICAgCQkJCQkJc3RhdGUuY29tcHJlc3NlZFRleEltYWdlMkQoIDM1NTMsIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgbWlwbWFwLmRhdGEgKTsKCiAgICAJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogQXR0ZW1wdCB0byBsb2FkIHVuc3VwcG9ydGVkIGNvbXByZXNzZWQgdGV4dHVyZSBmb3JtYXQgaW4gLnVwbG9hZFRleHR1cmUoKScgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXN0YXRlLnRleEltYWdlMkQoIDM1NTMsIGksIGdsSW50ZXJuYWxGb3JtYXQsIG1pcG1hcC53aWR0aCwgbWlwbWFwLmhlaWdodCwgMCwgZ2xGb3JtYXQsIGdsVHlwZSwgbWlwbWFwLmRhdGEgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQl0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gbWlwbWFwcy5sZW5ndGggLSAxOwoKICAgIAkJfSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlMkRBcnJheSApIHsKCiAgICAJCQlzdGF0ZS50ZXhJbWFnZTNEKCAzNTg2NiwgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgaW1hZ2Uud2lkdGgsIGltYWdlLmhlaWdodCwgaW1hZ2UuZGVwdGgsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIGltYWdlLmRhdGEgKTsKICAgIAkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSAwOwoKICAgIAkJfSBlbHNlIGlmICggdGV4dHVyZS5pc0RhdGFUZXh0dXJlM0QgKSB7CgogICAgCQkJc3RhdGUudGV4SW1hZ2UzRCggMzI4NzksIDAsIGdsSW50ZXJuYWxGb3JtYXQsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQsIGltYWdlLmRlcHRoLCAwLCBnbEZvcm1hdCwgZ2xUeXBlLCBpbWFnZS5kYXRhICk7CiAgICAJCQl0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJLy8gcmVndWxhciBUZXh0dXJlIChpbWFnZSwgdmlkZW8sIGNhbnZhcykKCiAgICAJCQkvLyB1c2UgbWFudWFsbHkgY3JlYXRlZCBtaXBtYXBzIGlmIGF2YWlsYWJsZQogICAgCQkJLy8gaWYgdGhlcmUgYXJlIG5vIG1hbnVhbCBtaXBtYXBzCiAgICAJCQkvLyBzZXQgMCBsZXZlbCBtaXBtYXAgYW5kIHRoZW4gdXNlIEdMIHRvIGdlbmVyYXRlIG90aGVyIG1pcG1hcCBsZXZlbHMKCiAgICAJCQlpZiAoIG1pcG1hcHMubGVuZ3RoID4gMCAmJiBzdXBwb3J0c01pcHMgKSB7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBtaXBtYXBzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCQkJbWlwbWFwID0gbWlwbWFwc1sgaSBdOwogICAgCQkJCQlzdGF0ZS50ZXhJbWFnZTJEKCAzNTUzLCBpLCBnbEludGVybmFsRm9ybWF0LCBnbEZvcm1hdCwgZ2xUeXBlLCBtaXBtYXAgKTsKCiAgICAJCQkJfQoKICAgIAkJCQl0ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwogICAgCQkJCXRleHR1cmVQcm9wZXJ0aWVzLl9fbWF4TWlwTGV2ZWwgPSBtaXBtYXBzLmxlbmd0aCAtIDE7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJc3RhdGUudGV4SW1hZ2UyRCggMzU1MywgMCwgZ2xJbnRlcm5hbEZvcm1hdCwgZ2xGb3JtYXQsIGdsVHlwZSwgaW1hZ2UgKTsKICAgIAkJCQl0ZXh0dXJlUHJvcGVydGllcy5fX21heE1pcExldmVsID0gMDsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIHRleHR1cmVOZWVkc0dlbmVyYXRlTWlwbWFwcyggdGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7CgogICAgCQkJZ2VuZXJhdGVNaXBtYXAoIDM1NTMsIHRleHR1cmUsIGltYWdlLndpZHRoLCBpbWFnZS5oZWlnaHQgKTsKCiAgICAJCX0KCiAgICAJCXRleHR1cmVQcm9wZXJ0aWVzLl9fdmVyc2lvbiA9IHRleHR1cmUudmVyc2lvbjsKCiAgICAJCWlmICggdGV4dHVyZS5vblVwZGF0ZSApIHRleHR1cmUub25VcGRhdGUoIHRleHR1cmUgKTsKCiAgICAJfQoKICAgIAkvLyBSZW5kZXIgdGFyZ2V0cwoKICAgIAkvLyBTZXR1cCBzdG9yYWdlIGZvciB0YXJnZXQgdGV4dHVyZSBhbmQgYmluZCBpdCB0byBjb3JyZWN0IGZyYW1lYnVmZmVyCiAgICAJZnVuY3Rpb24gc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIGZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQgKSB7CgogICAgCQl2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS5mb3JtYXQgKTsKICAgIAkJdmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTsKICAgIAkJdmFyIGdsSW50ZXJuYWxGb3JtYXQgPSBnZXRJbnRlcm5hbEZvcm1hdCggZ2xGb3JtYXQsIGdsVHlwZSApOwogICAgCQlzdGF0ZS50ZXhJbWFnZTJEKCB0ZXh0dXJlVGFyZ2V0LCAwLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQsIDAsIGdsRm9ybWF0LCBnbFR5cGUsIG51bGwgKTsKICAgIAkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIGZyYW1lYnVmZmVyICk7CiAgICAJCV9nbC5mcmFtZWJ1ZmZlclRleHR1cmUyRCggMzYxNjAsIGF0dGFjaG1lbnQsIHRleHR1cmVUYXJnZXQsIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApLl9fd2ViZ2xUZXh0dXJlLCAwICk7CiAgICAJCV9nbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBudWxsICk7CgogICAgCX0KCiAgICAJLy8gU2V0dXAgc3RvcmFnZSBmb3IgaW50ZXJuYWwgZGVwdGgvc3RlbmNpbCBidWZmZXJzIGFuZCBiaW5kIHRvIGNvcnJlY3QgZnJhbWVidWZmZXIKICAgIAlmdW5jdGlvbiBzZXR1cFJlbmRlckJ1ZmZlclN0b3JhZ2UoIHJlbmRlcmJ1ZmZlciwgcmVuZGVyVGFyZ2V0LCBpc011bHRpc2FtcGxlICkgewoKICAgIAkJX2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCByZW5kZXJidWZmZXIgKTsKCiAgICAJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmICEgcmVuZGVyVGFyZ2V0LnN0ZW5jaWxCdWZmZXIgKSB7CgogICAgCQkJaWYgKCBpc011bHRpc2FtcGxlICkgewoKICAgIAkJCQl2YXIgc2FtcGxlcyA9IGdldFJlbmRlclRhcmdldFNhbXBsZXMoIHJlbmRlclRhcmdldCApOwoKICAgIAkJCQlfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZU11bHRpc2FtcGxlKCAzNjE2MSwgc2FtcGxlcywgMzMxODksIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCV9nbC5yZW5kZXJidWZmZXJTdG9yYWdlKCAzNjE2MSwgMzMxODksIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoKICAgIAkJCX0KCiAgICAJCQlfZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIoIDM2MTYwLCAzNjA5NiwgMzYxNjEsIHJlbmRlcmJ1ZmZlciApOwoKICAgIAkJfSBlbHNlIGlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICYmIHJlbmRlclRhcmdldC5zdGVuY2lsQnVmZmVyICkgewoKICAgIAkJCWlmICggaXNNdWx0aXNhbXBsZSApIHsKCiAgICAJCQkJdmFyIHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTsKCiAgICAJCQkJX2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIDM1MDU2LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggMzYxNjEsIDM0MDQxLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTsKCiAgICAJCQl9CgoKICAgIAkJCV9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggMzYxNjAsIDMzMzA2LCAzNjE2MSwgcmVuZGVyYnVmZmVyICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXZhciBnbEZvcm1hdCA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLmZvcm1hdCApOwogICAgCQkJdmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIHJlbmRlclRhcmdldC50ZXh0dXJlLnR5cGUgKTsKICAgIAkJCXZhciBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIGdsRm9ybWF0LCBnbFR5cGUgKTsKCiAgICAJCQlpZiAoIGlzTXVsdGlzYW1wbGUgKSB7CgogICAgCQkJCXZhciBzYW1wbGVzID0gZ2V0UmVuZGVyVGFyZ2V0U2FtcGxlcyggcmVuZGVyVGFyZ2V0ICk7CgogICAgCQkJCV9nbC5yZW5kZXJidWZmZXJTdG9yYWdlTXVsdGlzYW1wbGUoIDM2MTYxLCBzYW1wbGVzLCBnbEludGVybmFsRm9ybWF0LCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlfZ2wucmVuZGVyYnVmZmVyU3RvcmFnZSggMzYxNjEsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCV9nbC5iaW5kUmVuZGVyYnVmZmVyKCAzNjE2MSwgbnVsbCApOwoKICAgIAl9CgogICAgCS8vIFNldHVwIHJlc291cmNlcyBmb3IgYSBEZXB0aCBUZXh0dXJlIGZvciBhIEZCTyAobmVlZHMgYW4gZXh0ZW5zaW9uKQogICAgCWZ1bmN0aW9uIHNldHVwRGVwdGhUZXh0dXJlKCBmcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJdmFyIGlzQ3ViZSA9ICggcmVuZGVyVGFyZ2V0ICYmIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSApOwogICAgCQlpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ0RlcHRoIFRleHR1cmUgd2l0aCBjdWJlIHJlbmRlciB0YXJnZXRzIGlzIG5vdCBzdXBwb3J0ZWQnICk7CgogICAgCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTsKCiAgICAJCWlmICggISAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgJiYgcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pc0RlcHRoVGV4dHVyZSApICkgewoKICAgIAkJCXRocm93IG5ldyBFcnJvciggJ3JlbmRlclRhcmdldC5kZXB0aFRleHR1cmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBUSFJFRS5EZXB0aFRleHR1cmUnICk7CgogICAgCQl9CgogICAgCQkvLyB1cGxvYWQgYW4gZW1wdHkgZGVwdGggdGV4dHVyZSB3aXRoIGZyYW1lYnVmZmVyIHNpemUKICAgIAkJaWYgKCAhIHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmUgfHwKICAgIAkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoICE9PSByZW5kZXJUYXJnZXQud2lkdGggfHwKICAgIAkJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLmhlaWdodCAhPT0gcmVuZGVyVGFyZ2V0LmhlaWdodCApIHsKCiAgICAJCQlyZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlLmltYWdlLndpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoOwogICAgCQkJcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5pbWFnZS5oZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0OwogICAgCQkJcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQl9CgogICAgCQlzZXRUZXh0dXJlMkQoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUsIDAgKTsKCiAgICAJCXZhciB3ZWJnbERlcHRoVGV4dHVyZSA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQuZGVwdGhUZXh0dXJlICkuX193ZWJnbFRleHR1cmU7CgogICAgCQlpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aEZvcm1hdCApIHsKCiAgICAJCQlfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCAzNjA5NiwgMzU1Mywgd2ViZ2xEZXB0aFRleHR1cmUsIDAgKTsKCiAgICAJCX0gZWxzZSBpZiAoIHJlbmRlclRhcmdldC5kZXB0aFRleHR1cmUuZm9ybWF0ID09PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7CgogICAgCQkJX2dsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKCAzNjE2MCwgMzMzMDYsIDM1NTMsIHdlYmdsRGVwdGhUZXh0dXJlLCAwICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXRocm93IG5ldyBFcnJvciggJ1Vua25vd24gZGVwdGhUZXh0dXJlIGZvcm1hdCcgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyBTZXR1cCBHTCByZXNvdXJjZXMgZm9yIGEgbm9uLXRleHR1cmUgZGVwdGggYnVmZmVyCiAgICAJZnVuY3Rpb24gc2V0dXBEZXB0aFJlbmRlcmJ1ZmZlciggcmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJdmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CgogICAgCQl2YXIgaXNDdWJlID0gKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPT09IHRydWUgKTsKCiAgICAJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoVGV4dHVyZSApIHsKCiAgICAJCQlpZiAoIGlzQ3ViZSApIHRocm93IG5ldyBFcnJvciggJ3RhcmdldC5kZXB0aFRleHR1cmUgbm90IHN1cHBvcnRlZCBpbiBDdWJlIHJlbmRlciB0YXJnZXRzJyApOwoKICAgIAkJCXNldHVwRGVwdGhUZXh0dXJlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciwgcmVuZGVyVGFyZ2V0ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWlmICggaXNDdWJlICkgewoKICAgIAkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlciA9IFtdOwoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyWyBpIF0gKTsKICAgIAkJCQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXJbIGkgXSA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTsKICAgIAkJCQkJc2V0dXBSZW5kZXJCdWZmZXJTdG9yYWdlKCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aGJ1ZmZlclsgaSBdLCByZW5kZXJUYXJnZXQgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCV9nbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciApOwogICAgCQkJCXJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbERlcHRoYnVmZmVyID0gX2dsLmNyZWF0ZVJlbmRlcmJ1ZmZlcigpOwogICAgCQkJCXNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhidWZmZXIsIHJlbmRlclRhcmdldCApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCV9nbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCBudWxsICk7CgogICAgCX0KCiAgICAJLy8gU2V0IHVwIEdMIHJlc291cmNlcyBmb3IgdGhlIHJlbmRlciB0YXJnZXQKICAgIAlmdW5jdGlvbiBzZXR1cFJlbmRlclRhcmdldCggcmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJdmFyIHJlbmRlclRhcmdldFByb3BlcnRpZXMgPSBwcm9wZXJ0aWVzLmdldCggcmVuZGVyVGFyZ2V0ICk7CiAgICAJCXZhciB0ZXh0dXJlUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQudGV4dHVyZSApOwoKICAgIAkJcmVuZGVyVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoICdkaXNwb3NlJywgb25SZW5kZXJUYXJnZXREaXNwb3NlICk7CgogICAgCQl0ZXh0dXJlUHJvcGVydGllcy5fX3dlYmdsVGV4dHVyZSA9IF9nbC5jcmVhdGVUZXh0dXJlKCk7CgogICAgCQlpbmZvLm1lbW9yeS50ZXh0dXJlcyArKzsKCiAgICAJCXZhciBpc0N1YmUgPSAoIHJlbmRlclRhcmdldC5pc1dlYkdMUmVuZGVyVGFyZ2V0Q3ViZSA9PT0gdHJ1ZSApOwogICAgCQl2YXIgaXNNdWx0aXNhbXBsZSA9ICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xNdWx0aXNhbXBsZVJlbmRlclRhcmdldCA9PT0gdHJ1ZSApOwogICAgCQl2YXIgc3VwcG9ydHNNaXBzID0gaXNQb3dlck9mVHdvKCByZW5kZXJUYXJnZXQgKSB8fCBjYXBhYmlsaXRpZXMuaXNXZWJHTDI7CgogICAgCQkvLyBTZXR1cCBmcmFtZWJ1ZmZlcgoKICAgIAkJaWYgKCBpc0N1YmUgKSB7CgogICAgCQkJcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgPSBbXTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlclsgaSBdID0gX2dsLmNyZWF0ZUZyYW1lYnVmZmVyKCk7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwoKICAgIAkJCWlmICggaXNNdWx0aXNhbXBsZSApIHsKCiAgICAJCQkJaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7CgogICAgCQkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xNdWx0aXNhbXBsZWRGcmFtZWJ1ZmZlciA9IF9nbC5jcmVhdGVGcmFtZWJ1ZmZlcigpOwogICAgCQkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xDb2xvclJlbmRlcmJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTsKCiAgICAJCQkJCV9nbC5iaW5kUmVuZGVyYnVmZmVyKCAzNjE2MSwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIgKTsKICAgIAkJCQkJdmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggcmVuZGVyVGFyZ2V0LnRleHR1cmUuZm9ybWF0ICk7CiAgICAJCQkJCXZhciBnbFR5cGUgPSB1dGlscy5jb252ZXJ0KCByZW5kZXJUYXJnZXQudGV4dHVyZS50eXBlICk7CiAgICAJCQkJCXZhciBnbEludGVybmFsRm9ybWF0ID0gZ2V0SW50ZXJuYWxGb3JtYXQoIGdsRm9ybWF0LCBnbFR5cGUgKTsKICAgIAkJCQkJdmFyIHNhbXBsZXMgPSBnZXRSZW5kZXJUYXJnZXRTYW1wbGVzKCByZW5kZXJUYXJnZXQgKTsKICAgIAkJCQkJX2dsLnJlbmRlcmJ1ZmZlclN0b3JhZ2VNdWx0aXNhbXBsZSggMzYxNjEsIHNhbXBsZXMsIGdsSW50ZXJuYWxGb3JtYXQsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoKICAgIAkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbE11bHRpc2FtcGxlZEZyYW1lYnVmZmVyICk7CiAgICAJCQkJCV9nbC5mcmFtZWJ1ZmZlclJlbmRlcmJ1ZmZlciggMzYxNjAsIDM2MDY0LCAzNjE2MSwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsQ29sb3JSZW5kZXJidWZmZXIgKTsKICAgIAkJCQkJX2dsLmJpbmRSZW5kZXJidWZmZXIoIDM2MTYxLCBudWxsICk7CgogICAgCQkJCQlpZiAoIHJlbmRlclRhcmdldC5kZXB0aEJ1ZmZlciApIHsKCiAgICAJCQkJCQlyZW5kZXJUYXJnZXRQcm9wZXJ0aWVzLl9fd2ViZ2xEZXB0aFJlbmRlcmJ1ZmZlciA9IF9nbC5jcmVhdGVSZW5kZXJidWZmZXIoKTsKICAgIAkJCQkJCXNldHVwUmVuZGVyQnVmZmVyU3RvcmFnZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRGVwdGhSZW5kZXJidWZmZXIsIHJlbmRlclRhcmdldCwgdHJ1ZSApOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIG51bGwgKTsKCgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0IGNhbiBvbmx5IGJlIHVzZWQgd2l0aCBXZWJHTDIuJyApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy8gU2V0dXAgY29sb3IgYnVmZmVyCgogICAgCQlpZiAoIGlzQ3ViZSApIHsKCiAgICAJCQlzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CiAgICAJCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggMzQwNjcsIHJlbmRlclRhcmdldC50ZXh0dXJlLCBzdXBwb3J0c01pcHMgKTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCA2OyBpICsrICkgewoKICAgIAkJCQlzZXR1cEZyYW1lQnVmZmVyVGV4dHVyZSggcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXJbIGkgXSwgcmVuZGVyVGFyZ2V0LCAzNjA2NCwgMzQwNjkgKyBpICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggdGV4dHVyZU5lZWRzR2VuZXJhdGVNaXBtYXBzKCByZW5kZXJUYXJnZXQudGV4dHVyZSwgc3VwcG9ydHNNaXBzICkgKSB7CgogICAgCQkJCWdlbmVyYXRlTWlwbWFwKCAzNDA2NywgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwoKICAgIAkJCX0KCiAgICAJCQlzdGF0ZS5iaW5kVGV4dHVyZSggMzQwNjcsIG51bGwgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJc3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIHRleHR1cmVQcm9wZXJ0aWVzLl9fd2ViZ2xUZXh0dXJlICk7CiAgICAJCQlzZXRUZXh0dXJlUGFyYW1ldGVycyggMzU1MywgcmVuZGVyVGFyZ2V0LnRleHR1cmUsIHN1cHBvcnRzTWlwcyApOwogICAgCQkJc2V0dXBGcmFtZUJ1ZmZlclRleHR1cmUoIHJlbmRlclRhcmdldFByb3BlcnRpZXMuX193ZWJnbEZyYW1lYnVmZmVyLCByZW5kZXJUYXJnZXQsIDM2MDY0LCAzNTUzICk7CgogICAgCQkJaWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHJlbmRlclRhcmdldC50ZXh0dXJlLCBzdXBwb3J0c01pcHMgKSApIHsKCiAgICAJCQkJZ2VuZXJhdGVNaXBtYXAoIDM1NTMsIHJlbmRlclRhcmdldC50ZXh0dXJlLCByZW5kZXJUYXJnZXQud2lkdGgsIHJlbmRlclRhcmdldC5oZWlnaHQgKTsKCiAgICAJCQl9CgogICAgCQkJc3RhdGUuYmluZFRleHR1cmUoIDM1NTMsIG51bGwgKTsKCiAgICAJCX0KCiAgICAJCS8vIFNldHVwIGRlcHRoIGFuZCBzdGVuY2lsIGJ1ZmZlcnMKCiAgICAJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkgewoKICAgIAkJCXNldHVwRGVwdGhSZW5kZXJidWZmZXIoIHJlbmRlclRhcmdldCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHVwZGF0ZVJlbmRlclRhcmdldE1pcG1hcCggcmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJdmFyIHRleHR1cmUgPSByZW5kZXJUYXJnZXQudGV4dHVyZTsKICAgIAkJdmFyIHN1cHBvcnRzTWlwcyA9IGlzUG93ZXJPZlR3byggcmVuZGVyVGFyZ2V0ICkgfHwgY2FwYWJpbGl0aWVzLmlzV2ViR0wyOwoKICAgIAkJaWYgKCB0ZXh0dXJlTmVlZHNHZW5lcmF0ZU1pcG1hcHMoIHRleHR1cmUsIHN1cHBvcnRzTWlwcyApICkgewoKICAgIAkJCXZhciB0YXJnZXQgPSByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgPyAzNDA2NyA6IDM1NTM7CiAgICAJCQl2YXIgd2ViZ2xUZXh0dXJlID0gcHJvcGVydGllcy5nZXQoIHRleHR1cmUgKS5fX3dlYmdsVGV4dHVyZTsKCiAgICAJCQlzdGF0ZS5iaW5kVGV4dHVyZSggdGFyZ2V0LCB3ZWJnbFRleHR1cmUgKTsKICAgIAkJCWdlbmVyYXRlTWlwbWFwKCB0YXJnZXQsIHRleHR1cmUsIHJlbmRlclRhcmdldC53aWR0aCwgcmVuZGVyVGFyZ2V0LmhlaWdodCApOwogICAgCQkJc3RhdGUuYmluZFRleHR1cmUoIHRhcmdldCwgbnVsbCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKSB7CgogICAgCQlpZiAoIHJlbmRlclRhcmdldC5pc1dlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgKSB7CgogICAgCQkJaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7CgogICAgCQkJCXZhciByZW5kZXJUYXJnZXRQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApOwoKICAgIAkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjAwOCwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXIgKTsKICAgIAkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjAwOSwgcmVuZGVyVGFyZ2V0UHJvcGVydGllcy5fX3dlYmdsRnJhbWVidWZmZXIgKTsKCiAgICAJCQkJdmFyIHdpZHRoID0gcmVuZGVyVGFyZ2V0LndpZHRoOwogICAgCQkJCXZhciBoZWlnaHQgPSByZW5kZXJUYXJnZXQuaGVpZ2h0OwogICAgCQkJCXZhciBtYXNrID0gMTYzODQ7CgogICAgCQkJCWlmICggcmVuZGVyVGFyZ2V0LmRlcHRoQnVmZmVyICkgbWFzayB8PSAyNTY7CiAgICAJCQkJaWYgKCByZW5kZXJUYXJnZXQuc3RlbmNpbEJ1ZmZlciApIG1hc2sgfD0gMTAyNDsKCiAgICAJCQkJX2dsLmJsaXRGcmFtZWJ1ZmZlciggMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwgMCwgd2lkdGgsIGhlaWdodCwgbWFzaywgOTcyOCApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IFdlYkdMTXVsdGlzYW1wbGVSZW5kZXJUYXJnZXQgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIFdlYkdMMi4nICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdldFJlbmRlclRhcmdldFNhbXBsZXMoIHJlbmRlclRhcmdldCApIHsKCiAgICAJCXJldHVybiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ICkgPwogICAgCQkJTWF0aC5taW4oIGNhcGFiaWxpdGllcy5tYXhTYW1wbGVzLCByZW5kZXJUYXJnZXQuc2FtcGxlcyApIDogMDsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiB1cGRhdGVWaWRlb1RleHR1cmUoIHRleHR1cmUgKSB7CgogICAgCQl2YXIgZnJhbWUgPSBpbmZvLnJlbmRlci5mcmFtZTsKCiAgICAJCS8vIENoZWNrIHRoZSBsYXN0IGZyYW1lIHdlIHVwZGF0ZWQgdGhlIFZpZGVvVGV4dHVyZQoKICAgIAkJaWYgKCBfdmlkZW9UZXh0dXJlcy5nZXQoIHRleHR1cmUgKSAhPT0gZnJhbWUgKSB7CgogICAgCQkJX3ZpZGVvVGV4dHVyZXMuc2V0KCB0ZXh0dXJlLCBmcmFtZSApOwogICAgCQkJdGV4dHVyZS51cGRhdGUoKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQoKICAgIAl2YXIgd2FybmVkVGV4dHVyZTJEID0gZmFsc2U7CiAgICAJdmFyIHdhcm5lZFRleHR1cmVDdWJlID0gZmFsc2U7CgogICAgCWZ1bmN0aW9uIHNhZmVTZXRUZXh0dXJlMkQoIHRleHR1cmUsIHNsb3QgKSB7CgogICAgCQlpZiAoIHRleHR1cmUgJiYgdGV4dHVyZS5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJCWlmICggd2FybmVkVGV4dHVyZTJEID09PSBmYWxzZSApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAiVEhSRUUuV2ViR0xUZXh0dXJlcy5zYWZlU2V0VGV4dHVyZTJEOiBkb24ndCB1c2UgcmVuZGVyIHRhcmdldHMgYXMgdGV4dHVyZXMuIFVzZSB0aGVpciAudGV4dHVyZSBwcm9wZXJ0eSBpbnN0ZWFkLiIgKTsKICAgIAkJCQl3YXJuZWRUZXh0dXJlMkQgPSB0cnVlOwoKICAgIAkJCX0KCiAgICAJCQl0ZXh0dXJlID0gdGV4dHVyZS50ZXh0dXJlOwoKICAgIAkJfQoKICAgIAkJc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCBzbG90ICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc2FmZVNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICkgewoKICAgIAkJaWYgKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7CgogICAgCQkJaWYgKCB3YXJuZWRUZXh0dXJlQ3ViZSA9PT0gZmFsc2UgKSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggIlRIUkVFLldlYkdMVGV4dHVyZXMuc2FmZVNldFRleHR1cmVDdWJlOiBkb24ndCB1c2UgY3ViZSByZW5kZXIgdGFyZ2V0cyBhcyB0ZXh0dXJlcy4gVXNlIHRoZWlyIC50ZXh0dXJlIHByb3BlcnR5IGluc3RlYWQuIiApOwogICAgCQkJCXdhcm5lZFRleHR1cmVDdWJlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQkJdGV4dHVyZSA9IHRleHR1cmUudGV4dHVyZTsKCiAgICAJCX0KCiAgICAJCS8vIGN1cnJlbnRseSByZWx5aW5nIG9uIHRoZSBmYWN0IHRoYXQgV2ViR0xSZW5kZXJUYXJnZXRDdWJlLnRleHR1cmUgaXMgYSBUZXh0dXJlIGFuZCBOT1QgYSBDdWJlVGV4dHVyZQogICAgCQkvLyBUT0RPOiB1bmlmeSB0aGVzZSBjb2RlIHBhdGhzCiAgICAJCWlmICggKCB0ZXh0dXJlICYmIHRleHR1cmUuaXNDdWJlVGV4dHVyZSApIHx8CiAgICAJCQkoIEFycmF5LmlzQXJyYXkoIHRleHR1cmUuaW1hZ2UgKSAmJiB0ZXh0dXJlLmltYWdlLmxlbmd0aCA9PT0gNiApICkgewoKICAgIAkJCS8vIENvbXByZXNzZWRUZXh0dXJlIGNhbiBoYXZlIEFycmF5IGluIGltYWdlIDovCgogICAgCQkJLy8gdGhpcyBmdW5jdGlvbiBhbG9uZSBzaG91bGQgdGFrZSBjYXJlIG9mIGN1YmUgdGV4dHVyZXMKICAgIAkJCXNldFRleHR1cmVDdWJlKCB0ZXh0dXJlLCBzbG90ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGFzc3VtZWQ6IHRleHR1cmUgcHJvcGVydHkgb2YgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXRDdWJlCiAgICAJCQlzZXRUZXh0dXJlQ3ViZUR5bmFtaWMoIHRleHR1cmUsIHNsb3QgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLwoKICAgIAl0aGlzLmFsbG9jYXRlVGV4dHVyZVVuaXQgPSBhbGxvY2F0ZVRleHR1cmVVbml0OwogICAgCXRoaXMucmVzZXRUZXh0dXJlVW5pdHMgPSByZXNldFRleHR1cmVVbml0czsKCiAgICAJdGhpcy5zZXRUZXh0dXJlMkQgPSBzZXRUZXh0dXJlMkQ7CiAgICAJdGhpcy5zZXRUZXh0dXJlMkRBcnJheSA9IHNldFRleHR1cmUyREFycmF5OwogICAgCXRoaXMuc2V0VGV4dHVyZTNEID0gc2V0VGV4dHVyZTNEOwogICAgCXRoaXMuc2V0VGV4dHVyZUN1YmUgPSBzZXRUZXh0dXJlQ3ViZTsKICAgIAl0aGlzLnNldFRleHR1cmVDdWJlRHluYW1pYyA9IHNldFRleHR1cmVDdWJlRHluYW1pYzsKICAgIAl0aGlzLnNldHVwUmVuZGVyVGFyZ2V0ID0gc2V0dXBSZW5kZXJUYXJnZXQ7CiAgICAJdGhpcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAgPSB1cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXA7CiAgICAJdGhpcy51cGRhdGVNdWx0aXNhbXBsZVJlbmRlclRhcmdldCA9IHVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OwoKICAgIAl0aGlzLnNhZmVTZXRUZXh0dXJlMkQgPSBzYWZlU2V0VGV4dHVyZTJEOwogICAgCXRoaXMuc2FmZVNldFRleHR1cmVDdWJlID0gc2FmZVNldFRleHR1cmVDdWJlOwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgdGhlc3BpdGUgLyBodHRwOi8vd3d3LnR3aXR0ZXIuY29tL3RoZXNwaXRlCiAgICAgKi8KCiAgICBmdW5jdGlvbiBXZWJHTFV0aWxzKCBnbCwgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzICkgewoKICAgIAlmdW5jdGlvbiBjb252ZXJ0KCBwICkgewoKICAgIAkJdmFyIGV4dGVuc2lvbjsKCiAgICAJCWlmICggcCA9PT0gUmVwZWF0V3JhcHBpbmcgKSByZXR1cm4gMTA0OTc7CiAgICAJCWlmICggcCA9PT0gQ2xhbXBUb0VkZ2VXcmFwcGluZyApIHJldHVybiAzMzA3MTsKICAgIAkJaWYgKCBwID09PSBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nICkgcmV0dXJuIDMzNjQ4OwoKICAgIAkJaWYgKCBwID09PSBOZWFyZXN0RmlsdGVyICkgcmV0dXJuIDk3Mjg7CiAgICAJCWlmICggcCA9PT0gTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gOTk4NDsKICAgIAkJaWYgKCBwID09PSBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyICkgcmV0dXJuIDk5ODY7CgogICAgCQlpZiAoIHAgPT09IExpbmVhckZpbHRlciApIHJldHVybiA5NzI5OwogICAgCQlpZiAoIHAgPT09IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIgKSByZXR1cm4gOTk4NTsKICAgIAkJaWYgKCBwID09PSBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIgKSByZXR1cm4gOTk4NzsKCiAgICAJCWlmICggcCA9PT0gVW5zaWduZWRCeXRlVHlwZSApIHJldHVybiA1MTIxOwogICAgCQlpZiAoIHAgPT09IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSApIHJldHVybiAzMjgxOTsKICAgIAkJaWYgKCBwID09PSBVbnNpZ25lZFNob3J0NTU1MVR5cGUgKSByZXR1cm4gMzI4MjA7CiAgICAJCWlmICggcCA9PT0gVW5zaWduZWRTaG9ydDU2NVR5cGUgKSByZXR1cm4gMzM2MzU7CgogICAgCQlpZiAoIHAgPT09IEJ5dGVUeXBlICkgcmV0dXJuIDUxMjA7CiAgICAJCWlmICggcCA9PT0gU2hvcnRUeXBlICkgcmV0dXJuIDUxMjI7CiAgICAJCWlmICggcCA9PT0gVW5zaWduZWRTaG9ydFR5cGUgKSByZXR1cm4gNTEyMzsKICAgIAkJaWYgKCBwID09PSBJbnRUeXBlICkgcmV0dXJuIDUxMjQ7CiAgICAJCWlmICggcCA9PT0gVW5zaWduZWRJbnRUeXBlICkgcmV0dXJuIDUxMjU7CiAgICAJCWlmICggcCA9PT0gRmxvYXRUeXBlICkgcmV0dXJuIDUxMjY7CgogICAgCQlpZiAoIHAgPT09IEhhbGZGbG9hdFR5cGUgKSB7CgogICAgCQkJaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gNTEzMTsKCiAgICAJCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2hhbGZfZmxvYXQnICk7CgogICAgCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSByZXR1cm4gZXh0ZW5zaW9uLkhBTEZfRkxPQVRfT0VTOwoKICAgIAkJfQoKICAgIAkJaWYgKCBwID09PSBBbHBoYUZvcm1hdCApIHJldHVybiA2NDA2OwogICAgCQlpZiAoIHAgPT09IFJHQkZvcm1hdCApIHJldHVybiA2NDA3OwogICAgCQlpZiAoIHAgPT09IFJHQkFGb3JtYXQgKSByZXR1cm4gNjQwODsKICAgIAkJaWYgKCBwID09PSBMdW1pbmFuY2VGb3JtYXQgKSByZXR1cm4gNjQwOTsKICAgIAkJaWYgKCBwID09PSBMdW1pbmFuY2VBbHBoYUZvcm1hdCApIHJldHVybiA2NDEwOwogICAgCQlpZiAoIHAgPT09IERlcHRoRm9ybWF0ICkgcmV0dXJuIDY0MDI7CiAgICAJCWlmICggcCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgcmV0dXJuIDM0MDQxOwogICAgCQlpZiAoIHAgPT09IFJlZEZvcm1hdCApIHJldHVybiA2NDAzOwoKICAgIAkJaWYgKCBwID09PSBBZGRFcXVhdGlvbiApIHJldHVybiAzMjc3NDsKICAgIAkJaWYgKCBwID09PSBTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIDMyNzc4OwogICAgCQlpZiAoIHAgPT09IFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uICkgcmV0dXJuIDMyNzc5OwoKICAgIAkJaWYgKCBwID09PSBaZXJvRmFjdG9yICkgcmV0dXJuIDA7CiAgICAJCWlmICggcCA9PT0gT25lRmFjdG9yICkgcmV0dXJuIDE7CiAgICAJCWlmICggcCA9PT0gU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gNzY4OwogICAgCQlpZiAoIHAgPT09IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IgKSByZXR1cm4gNzY5OwogICAgCQlpZiAoIHAgPT09IFNyY0FscGhhRmFjdG9yICkgcmV0dXJuIDc3MDsKICAgIAkJaWYgKCBwID09PSBPbmVNaW51c1NyY0FscGhhRmFjdG9yICkgcmV0dXJuIDc3MTsKICAgIAkJaWYgKCBwID09PSBEc3RBbHBoYUZhY3RvciApIHJldHVybiA3NzI7CiAgICAJCWlmICggcCA9PT0gT25lTWludXNEc3RBbHBoYUZhY3RvciApIHJldHVybiA3NzM7CgogICAgCQlpZiAoIHAgPT09IERzdENvbG9yRmFjdG9yICkgcmV0dXJuIDc3NDsKICAgIAkJaWYgKCBwID09PSBPbmVNaW51c0RzdENvbG9yRmFjdG9yICkgcmV0dXJuIDc3NTsKICAgIAkJaWYgKCBwID09PSBTcmNBbHBoYVNhdHVyYXRlRmFjdG9yICkgcmV0dXJuIDc3NjsKCiAgICAJCWlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDFfRm9ybWF0IHx8CiAgICAJCQlwID09PSBSR0JBX1MzVENfRFhUM19Gb3JtYXQgfHwgcCA9PT0gUkdCQV9TM1RDX0RYVDVfRm9ybWF0ICkgewoKICAgIAkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7CgogICAgCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7CgogICAgCQkJCWlmICggcCA9PT0gUkdCX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCX1MzVENfRFhUMV9FWFQ7CiAgICAJCQkJaWYgKCBwID09PSBSR0JBX1MzVENfRFhUMV9Gb3JtYXQgKSByZXR1cm4gZXh0ZW5zaW9uLkNPTVBSRVNTRURfUkdCQV9TM1RDX0RYVDFfRVhUOwogICAgCQkJCWlmICggcCA9PT0gUkdCQV9TM1RDX0RYVDNfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUzNUQ19EWFQzX0VYVDsKICAgIAkJCQlpZiAoIHAgPT09IFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1MzVENfRFhUNV9FWFQ7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCB8fCBwID09PSBSR0JfUFZSVENfMkJQUFYxX0Zvcm1hdCB8fAogICAgCQkJcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0IHx8IHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHsKCiAgICAJCQlleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9wdnJ0YycgKTsKCiAgICAJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHsKCiAgICAJCQkJaWYgKCBwID09PSBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfUFZSVENfNEJQUFYxX0lNRzsKICAgIAkJCQlpZiAoIHAgPT09IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQl9QVlJUQ18yQlBQVjFfSU1HOwogICAgCQkJCWlmICggcCA9PT0gUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0ICkgcmV0dXJuIGV4dGVuc2lvbi5DT01QUkVTU0VEX1JHQkFfUFZSVENfNEJQUFYxX0lNRzsKICAgIAkJCQlpZiAoIHAgPT09IFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JBX1BWUlRDXzJCUFBWMV9JTUc7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCBwID09PSBSR0JfRVRDMV9Gb3JtYXQgKSB7CgogICAgCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfZXRjMScgKTsKCiAgICAJCQlpZiAoIGV4dGVuc2lvbiAhPT0gbnVsbCApIHJldHVybiBleHRlbnNpb24uQ09NUFJFU1NFRF9SR0JfRVRDMV9XRUJHTDsKCiAgICAJCX0KCiAgICAJCWlmICggcCA9PT0gUkdCQV9BU1RDXzR4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzV4NV9Gb3JtYXQgfHwKICAgIAkJCXAgPT09IFJHQkFfQVNUQ182eDVfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ182eDZfRm9ybWF0IHx8IHAgPT09IFJHQkFfQVNUQ184eDVfRm9ybWF0IHx8CiAgICAJCQlwID09PSBSR0JBX0FTVENfOHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfOHg4X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4NV9Gb3JtYXQgfHwKICAgIAkJCXAgPT09IFJHQkFfQVNUQ18xMHg2X0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTB4OF9Gb3JtYXQgfHwgcCA9PT0gUkdCQV9BU1RDXzEweDEwX0Zvcm1hdCB8fAogICAgCQkJcCA9PT0gUkdCQV9BU1RDXzEyeDEwX0Zvcm1hdCB8fCBwID09PSBSR0JBX0FTVENfMTJ4MTJfRm9ybWF0ICkgewoKICAgIAkJCWV4dGVuc2lvbiA9IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX2FzdGMnICk7CgogICAgCQkJaWYgKCBleHRlbnNpb24gIT09IG51bGwgKSB7CgogICAgCQkJCXJldHVybiBwOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggcCA9PT0gTWluRXF1YXRpb24gfHwgcCA9PT0gTWF4RXF1YXRpb24gKSB7CgogICAgCQkJaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7CgogICAgCQkJCWlmICggcCA9PT0gTWluRXF1YXRpb24gKSByZXR1cm4gMzI3NzU7CiAgICAJCQkJaWYgKCBwID09PSBNYXhFcXVhdGlvbiApIHJldHVybiAzMjc3NjsKCiAgICAJCQl9CgogICAgCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApOwoKICAgIAkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgewoKICAgIAkJCQlpZiAoIHAgPT09IE1pbkVxdWF0aW9uICkgcmV0dXJuIGV4dGVuc2lvbi5NSU5fRVhUOwogICAgCQkJCWlmICggcCA9PT0gTWF4RXF1YXRpb24gKSByZXR1cm4gZXh0ZW5zaW9uLk1BWF9FWFQ7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCBwID09PSBVbnNpZ25lZEludDI0OFR5cGUgKSB7CgogICAgCQkJaWYgKCBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSByZXR1cm4gMzQwNDI7CgogICAgCQkJZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApOwoKICAgIAkJCWlmICggZXh0ZW5zaW9uICE9PSBudWxsICkgcmV0dXJuIGV4dGVuc2lvbi5VTlNJR05FRF9JTlRfMjRfOF9XRUJHTDsKCiAgICAJCX0KCiAgICAJCXJldHVybiAwOwoKICAgIAl9CgogICAgCXJldHVybiB7IGNvbnZlcnQ6IGNvbnZlcnQgfTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gR3JvdXAoKSB7CgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0dyb3VwJzsKCiAgICB9CgogICAgR3JvdXAucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEdyb3VwLAoKICAgIAlpc0dyb3VwOiB0cnVlCgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIEFycmF5Q2FtZXJhKCBhcnJheSApIHsKCiAgICAJUGVyc3BlY3RpdmVDYW1lcmEuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLmNhbWVyYXMgPSBhcnJheSB8fCBbXTsKCiAgICB9CgogICAgQXJyYXlDYW1lcmEucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEFycmF5Q2FtZXJhLAoKICAgIAlpc0FycmF5Q2FtZXJhOiB0cnVlCgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBqc2FudGVsbCAvIGh0dHBzOi8vd3d3LmpzYW50ZWxsLmNvbS8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICB2YXIgY2FtZXJhTFBvcyA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgY2FtZXJhUlBvcyA9IG5ldyBWZWN0b3IzKCk7CgogICAgLyoqCiAgICAgKiBBc3N1bWVzIDIgY2FtZXJhcyB0aGF0IGFyZSBwYXJhbGxlbCBhbmQgc2hhcmUgYW4gWC1heGlzLCBhbmQgdGhhdAogICAgICogdGhlIGNhbWVyYXMnIHByb2plY3Rpb24gYW5kIHdvcmxkIG1hdHJpY2VzIGhhdmUgYWxyZWFkeSBiZWVuIHNldC4KICAgICAqIEFuZCB0aGF0IG5lYXIgYW5kIGZhciBwbGFuZXMgYXJlIGlkZW50aWNhbCBmb3IgYm90aCBjYW1lcmFzLgogICAgICogVmlzdWFsaXphdGlvbiBvZiB0aGlzIHRlY2huaXF1ZTogaHR0cHM6Ly9jb21wdXRlcmdyYXBoaWNzLnN0YWNrZXhjaGFuZ2UuY29tL2EvNDc2NQogICAgICovCiAgICBmdW5jdGlvbiBzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmEsIGNhbWVyYUwsIGNhbWVyYVIgKSB7CgogICAgCWNhbWVyYUxQb3Muc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmFMLm1hdHJpeFdvcmxkICk7CiAgICAJY2FtZXJhUlBvcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGNhbWVyYVIubWF0cml4V29ybGQgKTsKCiAgICAJdmFyIGlwZCA9IGNhbWVyYUxQb3MuZGlzdGFuY2VUbyggY2FtZXJhUlBvcyApOwoKICAgIAl2YXIgcHJvakwgPSBjYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZWxlbWVudHM7CiAgICAJdmFyIHByb2pSID0gY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzOwoKICAgIAkvLyBWUiBzeXN0ZW1zIHdpbGwgaGF2ZSBpZGVudGljYWwgZmFyIGFuZCBuZWFyIHBsYW5lcywgYW5kCiAgICAJLy8gbW9zdCBsaWtlbHkgaWRlbnRpY2FsIHRvcCBhbmQgYm90dG9tIGZydXN0dW0gZXh0ZW50cy4KICAgIAkvLyBVc2UgdGhlIGxlZnQgY2FtZXJhIGZvciB0aGVzZSB2YWx1ZXMuCiAgICAJdmFyIG5lYXIgPSBwcm9qTFsgMTQgXSAvICggcHJvakxbIDEwIF0gLSAxICk7CiAgICAJdmFyIGZhciA9IHByb2pMWyAxNCBdIC8gKCBwcm9qTFsgMTAgXSArIDEgKTsKICAgIAl2YXIgdG9wRm92ID0gKCBwcm9qTFsgOSBdICsgMSApIC8gcHJvakxbIDUgXTsKICAgIAl2YXIgYm90dG9tRm92ID0gKCBwcm9qTFsgOSBdIC0gMSApIC8gcHJvakxbIDUgXTsKCiAgICAJdmFyIGxlZnRGb3YgPSAoIHByb2pMWyA4IF0gLSAxICkgLyBwcm9qTFsgMCBdOwogICAgCXZhciByaWdodEZvdiA9ICggcHJvalJbIDggXSArIDEgKSAvIHByb2pSWyAwIF07CiAgICAJdmFyIGxlZnQgPSBuZWFyICogbGVmdEZvdjsKICAgIAl2YXIgcmlnaHQgPSBuZWFyICogcmlnaHRGb3Y7CgogICAgCS8vIENhbGN1bGF0ZSB0aGUgbmV3IGNhbWVyYSdzIHBvc2l0aW9uIG9mZnNldCBmcm9tIHRoZQogICAgCS8vIGxlZnQgY2FtZXJhLiB4T2Zmc2V0IHNob3VsZCBiZSByb3VnaGx5IGhhbGYgYGlwZGAuCiAgICAJdmFyIHpPZmZzZXQgPSBpcGQgLyAoIC0gbGVmdEZvdiArIHJpZ2h0Rm92ICk7CiAgICAJdmFyIHhPZmZzZXQgPSB6T2Zmc2V0ICogLSBsZWZ0Rm92OwoKICAgIAkvLyBUT0RPOiBCZXR0ZXIgd2F5IHRvIGFwcGx5IHRoaXMgb2Zmc2V0PwogICAgCWNhbWVyYUwubWF0cml4V29ybGQuZGVjb21wb3NlKCBjYW1lcmEucG9zaXRpb24sIGNhbWVyYS5xdWF0ZXJuaW9uLCBjYW1lcmEuc2NhbGUgKTsKICAgIAljYW1lcmEudHJhbnNsYXRlWCggeE9mZnNldCApOwogICAgCWNhbWVyYS50cmFuc2xhdGVaKCB6T2Zmc2V0ICk7CiAgICAJY2FtZXJhLm1hdHJpeFdvcmxkLmNvbXBvc2UoIGNhbWVyYS5wb3NpdGlvbiwgY2FtZXJhLnF1YXRlcm5pb24sIGNhbWVyYS5zY2FsZSApOwogICAgCWNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UuZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeFdvcmxkICk7CgogICAgCS8vIEZpbmQgdGhlIHVuaW9uIG9mIHRoZSBmcnVzdHVtIHZhbHVlcyBvZiB0aGUgY2FtZXJhcyBhbmQgc2NhbGUKICAgIAkvLyB0aGUgdmFsdWVzIHNvIHRoYXQgdGhlIG5lYXIgcGxhbmUncyBwb3NpdGlvbiBkb2VzIG5vdCBjaGFuZ2UgaW4gd29ybGQgc3BhY2UsCiAgICAJLy8gYWx0aG91Z2ggbXVzdCBub3cgYmUgcmVsYXRpdmUgdG8gdGhlIG5ldyB1bmlvbiBjYW1lcmEuCiAgICAJdmFyIG5lYXIyID0gbmVhciArIHpPZmZzZXQ7CiAgICAJdmFyIGZhcjIgPSBmYXIgKyB6T2Zmc2V0OwogICAgCXZhciBsZWZ0MiA9IGxlZnQgLSB4T2Zmc2V0OwogICAgCXZhciByaWdodDIgPSByaWdodCArICggaXBkIC0geE9mZnNldCApOwogICAgCXZhciB0b3AyID0gdG9wRm92ICogZmFyIC8gZmFyMiAqIG5lYXIyOwogICAgCXZhciBib3R0b20yID0gYm90dG9tRm92ICogZmFyIC8gZmFyMiAqIG5lYXIyOwoKICAgIAljYW1lcmEucHJvamVjdGlvbk1hdHJpeC5tYWtlUGVyc3BlY3RpdmUoIGxlZnQyLCByaWdodDIsIHRvcDIsIGJvdHRvbTIsIG5lYXIyLCBmYXIyICk7CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYlZSTWFuYWdlciggcmVuZGVyZXIgKSB7CgogICAgCXZhciByZW5kZXJXaWR0aCwgcmVuZGVySGVpZ2h0OwogICAgCXZhciBzY29wZSA9IHRoaXM7CgogICAgCXZhciBkZXZpY2UgPSBudWxsOwogICAgCXZhciBmcmFtZURhdGEgPSBudWxsOwoKICAgIAl2YXIgcG9zZVRhcmdldCA9IG51bGw7CgogICAgCXZhciBjb250cm9sbGVycyA9IFtdOwogICAgCXZhciBzdGFuZGluZ01hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CiAgICAJdmFyIHN0YW5kaW5nTWF0cml4SW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7CgogICAgCXZhciBmcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gMS4wOwoKICAgIAl2YXIgcmVmZXJlbmNlU3BhY2VUeXBlID0gJ2xvY2FsLWZsb29yJzsKCiAgICAJaWYgKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiAnVlJGcmFtZURhdGEnIGluIHdpbmRvdyApIHsKCiAgICAJCWZyYW1lRGF0YSA9IG5ldyB3aW5kb3cuVlJGcmFtZURhdGEoKTsKICAgIAkJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICd2cmRpc3BsYXlwcmVzZW50Y2hhbmdlJywgb25WUkRpc3BsYXlQcmVzZW50Q2hhbmdlLCBmYWxzZSApOwoKICAgIAl9CgogICAgCXZhciBtYXRyaXhXb3JsZEludmVyc2UgPSBuZXcgTWF0cml4NCgpOwogICAgCXZhciB0ZW1wUXVhdGVybmlvbiA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICAJdmFyIHRlbXBQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciBjYW1lcmFMID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7CiAgICAJY2FtZXJhTC52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7CiAgICAJY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7CgogICAgCXZhciBjYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7CiAgICAJY2FtZXJhUi52aWV3cG9ydCA9IG5ldyBWZWN0b3I0KCk7CiAgICAJY2FtZXJhUi5sYXllcnMuZW5hYmxlKCAyICk7CgogICAgCXZhciBjYW1lcmFWUiA9IG5ldyBBcnJheUNhbWVyYSggWyBjYW1lcmFMLCBjYW1lcmFSIF0gKTsKICAgIAljYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAxICk7CiAgICAJY2FtZXJhVlIubGF5ZXJzLmVuYWJsZSggMiApOwoKICAgIAkvLwoKICAgIAlmdW5jdGlvbiBpc1ByZXNlbnRpbmcoKSB7CgogICAgCQlyZXR1cm4gZGV2aWNlICE9PSBudWxsICYmIGRldmljZS5pc1ByZXNlbnRpbmcgPT09IHRydWU7CgogICAgCX0KCiAgICAJdmFyIGN1cnJlbnRTaXplID0gbmV3IFZlY3RvcjIoKSwgY3VycmVudFBpeGVsUmF0aW87CgogICAgCWZ1bmN0aW9uIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSgpIHsKCiAgICAJCWlmICggaXNQcmVzZW50aW5nKCkgKSB7CgogICAgCQkJdmFyIGV5ZVBhcmFtZXRlcnMgPSBkZXZpY2UuZ2V0RXllUGFyYW1ldGVycyggJ2xlZnQnICk7CiAgICAJCQlyZW5kZXJXaWR0aCA9IDIgKiBleWVQYXJhbWV0ZXJzLnJlbmRlcldpZHRoICogZnJhbWVidWZmZXJTY2FsZUZhY3RvcjsKICAgIAkJCXJlbmRlckhlaWdodCA9IGV5ZVBhcmFtZXRlcnMucmVuZGVySGVpZ2h0ICogZnJhbWVidWZmZXJTY2FsZUZhY3RvcjsKCiAgICAJCQljdXJyZW50UGl4ZWxSYXRpbyA9IHJlbmRlcmVyLmdldFBpeGVsUmF0aW8oKTsKICAgIAkJCXJlbmRlcmVyLmdldFNpemUoIGN1cnJlbnRTaXplICk7CgogICAgCQkJcmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIHJlbmRlcldpZHRoLCByZW5kZXJIZWlnaHQsIDEgKTsKCiAgICAJCQljYW1lcmFMLnZpZXdwb3J0LnNldCggMCwgMCwgcmVuZGVyV2lkdGggLyAyLCByZW5kZXJIZWlnaHQgKTsKICAgIAkJCWNhbWVyYVIudmlld3BvcnQuc2V0KCByZW5kZXJXaWR0aCAvIDIsIDAsIHJlbmRlcldpZHRoIC8gMiwgcmVuZGVySGVpZ2h0ICk7CgogICAgCQkJYW5pbWF0aW9uLnN0YXJ0KCk7CgogICAgCQkJc2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbnN0YXJ0JyB9ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWlmICggc2NvcGUuZW5hYmxlZCApIHsKCiAgICAJCQkJcmVuZGVyZXIuc2V0RHJhd2luZ0J1ZmZlclNpemUoIGN1cnJlbnRTaXplLndpZHRoLCBjdXJyZW50U2l6ZS5oZWlnaHQsIGN1cnJlbnRQaXhlbFJhdGlvICk7CgogICAgCQkJfQoKICAgIAkJCWFuaW1hdGlvbi5zdG9wKCk7CgogICAgCQkJc2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbmVuZCcgfSApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vCgogICAgCXZhciB0cmlnZ2VycyA9IFtdOwoKICAgIAlmdW5jdGlvbiBmaW5kR2FtZXBhZCggaWQgKSB7CgogICAgCQl2YXIgZ2FtZXBhZHMgPSBuYXZpZ2F0b3IuZ2V0R2FtZXBhZHMgJiYgbmF2aWdhdG9yLmdldEdhbWVwYWRzKCk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGogPSAwLCBsID0gZ2FtZXBhZHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgZ2FtZXBhZCA9IGdhbWVwYWRzWyBpIF07CgogICAgCQkJaWYgKCBnYW1lcGFkICYmICggZ2FtZXBhZC5pZCA9PT0gJ0RheWRyZWFtIENvbnRyb2xsZXInIHx8CiAgICAJCQkJZ2FtZXBhZC5pZCA9PT0gJ0dlYXIgVlIgQ29udHJvbGxlcicgfHwgZ2FtZXBhZC5pZCA9PT0gJ09jdWx1cyBHbyBDb250cm9sbGVyJyB8fAogICAgCQkJCWdhbWVwYWQuaWQgPT09ICdPcGVuVlIgR2FtZXBhZCcgfHwgZ2FtZXBhZC5pZC5zdGFydHNXaXRoKCAnT2N1bHVzIFRvdWNoJyApIHx8CiAgICAJCQkJZ2FtZXBhZC5pZC5zdGFydHNXaXRoKCAnSFRDIFZpdmUgRm9jdXMnICkgfHwKICAgIAkJCQlnYW1lcGFkLmlkLnN0YXJ0c1dpdGgoICdTcGF0aWFsIENvbnRyb2xsZXInICkgKSApIHsKCiAgICAJCQkJaWYgKCBqID09PSBpZCApIHJldHVybiBnYW1lcGFkOwoKICAgIAkJCQlqICsrOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiB1cGRhdGVDb250cm9sbGVycygpIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpIF07CgogICAgCQkJdmFyIGdhbWVwYWQgPSBmaW5kR2FtZXBhZCggaSApOwoKICAgIAkJCWlmICggZ2FtZXBhZCAhPT0gdW5kZWZpbmVkICYmIGdhbWVwYWQucG9zZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlpZiAoIGdhbWVwYWQucG9zZSA9PT0gbnVsbCApIHJldHVybjsKCiAgICAJCQkJLy8gUG9zZQoKICAgIAkJCQl2YXIgcG9zZSA9IGdhbWVwYWQucG9zZTsKCiAgICAJCQkJaWYgKCBwb3NlLmhhc1Bvc2l0aW9uID09PSBmYWxzZSApIGNvbnRyb2xsZXIucG9zaXRpb24uc2V0KCAwLjIsIC0gMC42LCAtIDAuMDUgKTsKCiAgICAJCQkJaWYgKCBwb3NlLnBvc2l0aW9uICE9PSBudWxsICkgY29udHJvbGxlci5wb3NpdGlvbi5mcm9tQXJyYXkoIHBvc2UucG9zaXRpb24gKTsKICAgIAkJCQlpZiAoIHBvc2Uub3JpZW50YXRpb24gIT09IG51bGwgKSBjb250cm9sbGVyLnF1YXRlcm5pb24uZnJvbUFycmF5KCBwb3NlLm9yaWVudGF0aW9uICk7CiAgICAJCQkJY29udHJvbGxlci5tYXRyaXguY29tcG9zZSggY29udHJvbGxlci5wb3NpdGlvbiwgY29udHJvbGxlci5xdWF0ZXJuaW9uLCBjb250cm9sbGVyLnNjYWxlICk7CiAgICAJCQkJY29udHJvbGxlci5tYXRyaXgucHJlbXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4ICk7CiAgICAJCQkJY29udHJvbGxlci5tYXRyaXguZGVjb21wb3NlKCBjb250cm9sbGVyLnBvc2l0aW9uLCBjb250cm9sbGVyLnF1YXRlcm5pb24sIGNvbnRyb2xsZXIuc2NhbGUgKTsKICAgIAkJCQljb250cm9sbGVyLm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwogICAgCQkJCWNvbnRyb2xsZXIudmlzaWJsZSA9IHRydWU7CgogICAgCQkJCS8vIFRyaWdnZXIKCiAgICAJCQkJdmFyIGJ1dHRvbklkID0gZ2FtZXBhZC5pZCA9PT0gJ0RheWRyZWFtIENvbnRyb2xsZXInID8gMCA6IDE7CgogICAgCQkJCWlmICggdHJpZ2dlcnNbIGkgXSA9PT0gdW5kZWZpbmVkICkgdHJpZ2dlcnNbIGkgXSA9IGZhbHNlOwoKICAgIAkJCQlpZiAoIHRyaWdnZXJzWyBpIF0gIT09IGdhbWVwYWQuYnV0dG9uc1sgYnV0dG9uSWQgXS5wcmVzc2VkICkgewoKICAgIAkJCQkJdHJpZ2dlcnNbIGkgXSA9IGdhbWVwYWQuYnV0dG9uc1sgYnV0dG9uSWQgXS5wcmVzc2VkOwoKICAgIAkJCQkJaWYgKCB0cmlnZ2Vyc1sgaSBdID09PSB0cnVlICkgewoKICAgIAkJCQkJCWNvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2VsZWN0c3RhcnQnIH0gKTsKCiAgICAJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJY29udHJvbGxlci5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZWxlY3RlbmQnIH0gKTsKICAgIAkJCQkJCWNvbnRyb2xsZXIuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2VsZWN0JyB9ICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQljb250cm9sbGVyLnZpc2libGUgPSBmYWxzZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gdXBkYXRlVmlld3BvcnRGcm9tQm91bmRzKCB2aWV3cG9ydCwgYm91bmRzICkgewoKICAgIAkJaWYgKCBib3VuZHMgIT09IG51bGwgJiYgYm91bmRzLmxlbmd0aCA9PT0gNCApIHsKCiAgICAJCQl2aWV3cG9ydC5zZXQoIGJvdW5kc1sgMCBdICogcmVuZGVyV2lkdGgsIGJvdW5kc1sgMSBdICogcmVuZGVySGVpZ2h0LCBib3VuZHNbIDIgXSAqIHJlbmRlcldpZHRoLCBib3VuZHNbIDMgXSAqIHJlbmRlckhlaWdodCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vCgogICAgCXRoaXMuZW5hYmxlZCA9IGZhbHNlOwoKICAgIAl0aGlzLmdldENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoIGlkICkgewoKICAgIAkJdmFyIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaWQgXTsKCiAgICAJCWlmICggY29udHJvbGxlciA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnRyb2xsZXIgPSBuZXcgR3JvdXAoKTsKICAgIAkJCWNvbnRyb2xsZXIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgCQkJY29udHJvbGxlci52aXNpYmxlID0gZmFsc2U7CgogICAgCQkJY29udHJvbGxlcnNbIGlkIF0gPSBjb250cm9sbGVyOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGNvbnRyb2xsZXI7CgogICAgCX07CgogICAgCXRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIGRldmljZTsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXREZXZpY2UgPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgZGV2aWNlID0gdmFsdWU7CgogICAgCQlhbmltYXRpb24uc2V0Q29udGV4dCggdmFsdWUgKTsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWZyYW1lYnVmZmVyU2NhbGVGYWN0b3IgPSB2YWx1ZTsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGUgPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJcmVmZXJlbmNlU3BhY2VUeXBlID0gdmFsdWU7CgogICAgCX07CgogICAgCXRoaXMuc2V0UG9zZVRhcmdldCA9IGZ1bmN0aW9uICggb2JqZWN0ICkgewoKICAgIAkJaWYgKCBvYmplY3QgIT09IHVuZGVmaW5lZCApIHBvc2VUYXJnZXQgPSBvYmplY3Q7CgogICAgCX07CgogICAgCXRoaXMuZ2V0Q2FtZXJhID0gZnVuY3Rpb24gKCBjYW1lcmEgKSB7CgogICAgCQl2YXIgdXNlckhlaWdodCA9IHJlZmVyZW5jZVNwYWNlVHlwZSA9PT0gJ2xvY2FsLWZsb29yJyA/IDEuNiA6IDA7CgogICAgCQlpZiAoIGlzUHJlc2VudGluZygpID09PSBmYWxzZSApIHsKCiAgICAJCQljYW1lcmEucG9zaXRpb24uc2V0KCAwLCB1c2VySGVpZ2h0LCAwICk7CiAgICAJCQljYW1lcmEucm90YXRpb24uc2V0KCAwLCAwLCAwICk7CgogICAgCQkJcmV0dXJuIGNhbWVyYTsKCiAgICAJCX0KCiAgICAJCWRldmljZS5kZXB0aE5lYXIgPSBjYW1lcmEubmVhcjsKICAgIAkJZGV2aWNlLmRlcHRoRmFyID0gY2FtZXJhLmZhcjsKCiAgICAJCWRldmljZS5nZXRGcmFtZURhdGEoIGZyYW1lRGF0YSApOwoKICAgIAkJLy8KCiAgICAJCWlmICggcmVmZXJlbmNlU3BhY2VUeXBlID09PSAnbG9jYWwtZmxvb3InICkgewoKICAgIAkJCXZhciBzdGFnZVBhcmFtZXRlcnMgPSBkZXZpY2Uuc3RhZ2VQYXJhbWV0ZXJzOwoKICAgIAkJCWlmICggc3RhZ2VQYXJhbWV0ZXJzICkgewoKICAgIAkJCQlzdGFuZGluZ01hdHJpeC5mcm9tQXJyYXkoIHN0YWdlUGFyYW1ldGVycy5zaXR0aW5nVG9TdGFuZGluZ1RyYW5zZm9ybSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXN0YW5kaW5nTWF0cml4Lm1ha2VUcmFuc2xhdGlvbiggMCwgdXNlckhlaWdodCwgMCApOwoKICAgIAkJCX0KCiAgICAJCX0KCgogICAgCQl2YXIgcG9zZSA9IGZyYW1lRGF0YS5wb3NlOwogICAgCQl2YXIgcG9zZU9iamVjdCA9IHBvc2VUYXJnZXQgIT09IG51bGwgPyBwb3NlVGFyZ2V0IDogY2FtZXJhOwoKICAgIAkJLy8gV2Ugd2FudCB0byBtYW5pcHVsYXRlIHBvc2VPYmplY3QgYnkgaXRzIHBvc2l0aW9uIGFuZCBxdWF0ZXJuaW9uIGNvbXBvbmVudHMgc2luY2UgdXNlcnMgbWF5IHJlbHkgb24gdGhlbS4KICAgIAkJcG9zZU9iamVjdC5tYXRyaXguY29weSggc3RhbmRpbmdNYXRyaXggKTsKICAgIAkJcG9zZU9iamVjdC5tYXRyaXguZGVjb21wb3NlKCBwb3NlT2JqZWN0LnBvc2l0aW9uLCBwb3NlT2JqZWN0LnF1YXRlcm5pb24sIHBvc2VPYmplY3Quc2NhbGUgKTsKCiAgICAJCWlmICggcG9zZS5vcmllbnRhdGlvbiAhPT0gbnVsbCApIHsKCiAgICAJCQl0ZW1wUXVhdGVybmlvbi5mcm9tQXJyYXkoIHBvc2Uub3JpZW50YXRpb24gKTsKICAgIAkJCXBvc2VPYmplY3QucXVhdGVybmlvbi5tdWx0aXBseSggdGVtcFF1YXRlcm5pb24gKTsKCiAgICAJCX0KCiAgICAJCWlmICggcG9zZS5wb3NpdGlvbiAhPT0gbnVsbCApIHsKCiAgICAJCQl0ZW1wUXVhdGVybmlvbi5zZXRGcm9tUm90YXRpb25NYXRyaXgoIHN0YW5kaW5nTWF0cml4ICk7CiAgICAJCQl0ZW1wUG9zaXRpb24uZnJvbUFycmF5KCBwb3NlLnBvc2l0aW9uICk7CiAgICAJCQl0ZW1wUG9zaXRpb24uYXBwbHlRdWF0ZXJuaW9uKCB0ZW1wUXVhdGVybmlvbiApOwogICAgCQkJcG9zZU9iamVjdC5wb3NpdGlvbi5hZGQoIHRlbXBQb3NpdGlvbiApOwoKICAgIAkJfQoKICAgIAkJcG9zZU9iamVjdC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKICAgIAkJLy8KCiAgICAJCWNhbWVyYUwubmVhciA9IGNhbWVyYS5uZWFyOwogICAgCQljYW1lcmFSLm5lYXIgPSBjYW1lcmEubmVhcjsKCiAgICAJCWNhbWVyYUwuZmFyID0gY2FtZXJhLmZhcjsKICAgIAkJY2FtZXJhUi5mYXIgPSBjYW1lcmEuZmFyOwoKICAgIAkJY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFZpZXdNYXRyaXggKTsKICAgIAkJY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UuZnJvbUFycmF5KCBmcmFtZURhdGEucmlnaHRWaWV3TWF0cml4ICk7CgogICAgCQkvLyBUT0RPIChtcmRvb2IpIERvdWJsZSBjaGVjayB0aGlzIGNvZGUKCiAgICAJCXN0YW5kaW5nTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCBzdGFuZGluZ01hdHJpeCApOwoKICAgIAkJaWYgKCByZWZlcmVuY2VTcGFjZVR5cGUgPT09ICdsb2NhbC1mbG9vcicgKSB7CgogICAgCQkJY2FtZXJhTC5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApOwogICAgCQkJY2FtZXJhUi5tYXRyaXhXb3JsZEludmVyc2UubXVsdGlwbHkoIHN0YW5kaW5nTWF0cml4SW52ZXJzZSApOwoKICAgIAkJfQoKICAgIAkJdmFyIHBhcmVudCA9IHBvc2VPYmplY3QucGFyZW50OwoKICAgIAkJaWYgKCBwYXJlbnQgIT09IG51bGwgKSB7CgogICAgCQkJbWF0cml4V29ybGRJbnZlcnNlLmdldEludmVyc2UoIHBhcmVudC5tYXRyaXhXb3JsZCApOwoKICAgIAkJCWNhbWVyYUwubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTsKICAgIAkJCWNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlLm11bHRpcGx5KCBtYXRyaXhXb3JsZEludmVyc2UgKTsKCiAgICAJCX0KCiAgICAJCS8vIGVudk1hcCBhbmQgTWlycm9yIG5lZWRzIGNhbWVyYS5tYXRyaXhXb3JsZAoKICAgIAkJY2FtZXJhTC5tYXRyaXhXb3JsZC5nZXRJbnZlcnNlKCBjYW1lcmFMLm1hdHJpeFdvcmxkSW52ZXJzZSApOwogICAgCQljYW1lcmFSLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIGNhbWVyYVIubWF0cml4V29ybGRJbnZlcnNlICk7CgogICAgCQljYW1lcmFMLnByb2plY3Rpb25NYXRyaXguZnJvbUFycmF5KCBmcmFtZURhdGEubGVmdFByb2plY3Rpb25NYXRyaXggKTsKICAgIAkJY2FtZXJhUi5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheSggZnJhbWVEYXRhLnJpZ2h0UHJvamVjdGlvbk1hdHJpeCApOwoKICAgIAkJc2V0UHJvamVjdGlvbkZyb21VbmlvbiggY2FtZXJhVlIsIGNhbWVyYUwsIGNhbWVyYVIgKTsKCiAgICAJCS8vCgogICAgCQl2YXIgbGF5ZXJzID0gZGV2aWNlLmdldExheWVycygpOwoKICAgIAkJaWYgKCBsYXllcnMubGVuZ3RoICkgewoKICAgIAkJCXZhciBsYXllciA9IGxheWVyc1sgMCBdOwoKICAgIAkJCXVwZGF0ZVZpZXdwb3J0RnJvbUJvdW5kcyggY2FtZXJhTC52aWV3cG9ydCwgbGF5ZXIubGVmdEJvdW5kcyApOwogICAgCQkJdXBkYXRlVmlld3BvcnRGcm9tQm91bmRzKCBjYW1lcmFSLnZpZXdwb3J0LCBsYXllci5yaWdodEJvdW5kcyApOwoKICAgIAkJfQoKICAgIAkJdXBkYXRlQ29udHJvbGxlcnMoKTsKCiAgICAJCXJldHVybiBjYW1lcmFWUjsKCiAgICAJfTsKCiAgICAJdGhpcy5nZXRTdGFuZGluZ01hdHJpeCA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBzdGFuZGluZ01hdHJpeDsKCiAgICAJfTsKCiAgICAJdGhpcy5pc1ByZXNlbnRpbmcgPSBpc1ByZXNlbnRpbmc7CgogICAgCS8vIEFuaW1hdGlvbiBMb29wCgogICAgCXZhciBhbmltYXRpb24gPSBuZXcgV2ViR0xBbmltYXRpb24oKTsKCiAgICAJdGhpcy5zZXRBbmltYXRpb25Mb29wID0gZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCiAgICAJCWFuaW1hdGlvbi5zZXRBbmltYXRpb25Mb29wKCBjYWxsYmFjayApOwoKICAgIAkJaWYgKCBpc1ByZXNlbnRpbmcoKSApIGFuaW1hdGlvbi5zdGFydCgpOwoKICAgIAl9OwoKICAgIAl0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkgewoKICAgIAkJaWYgKCBpc1ByZXNlbnRpbmcoKSApIGRldmljZS5zdWJtaXRGcmFtZSgpOwoKICAgIAl9OwoKICAgIAl0aGlzLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CgogICAgCQlpZiAoIHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICkgewoKICAgIAkJCXdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCAndnJkaXNwbGF5cHJlc2VudGNoYW5nZScsIG9uVlJEaXNwbGF5UHJlc2VudENoYW5nZSApOwoKICAgIAkJfQoKICAgIAl9OwoKICAgIAkvLyBERVBSRUNBVEVECgogICAgCXRoaXMuc2V0RnJhbWVPZlJlZmVyZW5jZVR5cGUgPSBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJWUk1hbmFnZXI6IHNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4nICk7CgogICAgCX07CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFdlYlZSTWFuYWdlci5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBXZWJYUk1hbmFnZXIoIHJlbmRlcmVyLCBnbCApIHsKCiAgICAJdmFyIHNjb3BlID0gdGhpczsKCiAgICAJdmFyIHNlc3Npb24gPSBudWxsOwoKICAgIAl2YXIgcmVmZXJlbmNlU3BhY2UgPSBudWxsOwogICAgCXZhciByZWZlcmVuY2VTcGFjZVR5cGUgPSAnbG9jYWwtZmxvb3InOwoKICAgIAl2YXIgcG9zZSA9IG51bGw7CgogICAgCXZhciBjb250cm9sbGVycyA9IFtdOwogICAgCXZhciBpbnB1dFNvdXJjZXMgPSBbXTsKCiAgICAJZnVuY3Rpb24gaXNQcmVzZW50aW5nKCkgewoKICAgIAkJcmV0dXJuIHNlc3Npb24gIT09IG51bGwgJiYgcmVmZXJlbmNlU3BhY2UgIT09IG51bGw7CgogICAgCX0KCiAgICAJLy8KCiAgICAJdmFyIGNhbWVyYUwgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTsKICAgIAljYW1lcmFMLmxheWVycy5lbmFibGUoIDEgKTsKICAgIAljYW1lcmFMLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTsKCiAgICAJdmFyIGNhbWVyYVIgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoKTsKICAgIAljYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTsKICAgIAljYW1lcmFSLnZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKTsKCiAgICAJdmFyIGNhbWVyYVZSID0gbmV3IEFycmF5Q2FtZXJhKCBbIGNhbWVyYUwsIGNhbWVyYVIgXSApOwogICAgCWNhbWVyYVZSLmxheWVycy5lbmFibGUoIDEgKTsKICAgIAljYW1lcmFWUi5sYXllcnMuZW5hYmxlKCAyICk7CgogICAgCS8vCgogICAgCXRoaXMuZW5hYmxlZCA9IGZhbHNlOwoKICAgIAl0aGlzLmdldENvbnRyb2xsZXIgPSBmdW5jdGlvbiAoIGlkICkgewoKICAgIAkJdmFyIGNvbnRyb2xsZXIgPSBjb250cm9sbGVyc1sgaWQgXTsKCiAgICAJCWlmICggY29udHJvbGxlciA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnRyb2xsZXIgPSBuZXcgR3JvdXAoKTsKICAgIAkJCWNvbnRyb2xsZXIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgCQkJY29udHJvbGxlci52aXNpYmxlID0gZmFsc2U7CgogICAgCQkJY29udHJvbGxlcnNbIGlkIF0gPSBjb250cm9sbGVyOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGNvbnRyb2xsZXI7CgogICAgCX07CgogICAgCS8vCgogICAgCWZ1bmN0aW9uIG9uU2Vzc2lvbkV2ZW50KCBldmVudCApIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQlpZiAoIGlucHV0U291cmNlc1sgaSBdID09PSBldmVudC5pbnB1dFNvdXJjZSApIHsKCiAgICAJCQkJY29udHJvbGxlcnNbIGkgXS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6IGV2ZW50LnR5cGUgfSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBvblNlc3Npb25FbmQoKSB7CgogICAgCQlyZW5kZXJlci5zZXRGcmFtZWJ1ZmZlciggbnVsbCApOwogICAgCQlyZW5kZXJlci5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlcmVyLmdldFJlbmRlclRhcmdldCgpICk7IC8vIEhhY2sgIzE1ODMwCiAgICAJCWFuaW1hdGlvbi5zdG9wKCk7CgogICAgCQlzY29wZS5kaXNwYXRjaEV2ZW50KCB7IHR5cGU6ICdzZXNzaW9uZW5kJyB9ICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25SZXF1ZXN0UmVmZXJlbmNlU3BhY2UoIHZhbHVlICkgewoKICAgIAkJcmVmZXJlbmNlU3BhY2UgPSB2YWx1ZTsKCiAgICAJCWFuaW1hdGlvbi5zZXRDb250ZXh0KCBzZXNzaW9uICk7CiAgICAJCWFuaW1hdGlvbi5zdGFydCgpOwoKICAgIAkJc2NvcGUuZGlzcGF0Y2hFdmVudCggeyB0eXBlOiAnc2Vzc2lvbnN0YXJ0JyB9ICk7CgogICAgCX0KCiAgICAJdGhpcy5zZXRGcmFtZWJ1ZmZlclNjYWxlRmFjdG9yID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRSZWZlcmVuY2VTcGFjZVR5cGUgPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJcmVmZXJlbmNlU3BhY2VUeXBlID0gdmFsdWU7CgogICAgCX07CgogICAgCXRoaXMuZ2V0U2Vzc2lvbiA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBzZXNzaW9uOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldFNlc3Npb24gPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJc2Vzc2lvbiA9IHZhbHVlOwoKICAgIAkJaWYgKCBzZXNzaW9uICE9PSBudWxsICkgewoKICAgIAkJCXNlc3Npb24uYWRkRXZlbnRMaXN0ZW5lciggJ3NlbGVjdCcsIG9uU2Vzc2lvbkV2ZW50ICk7CiAgICAJCQlzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RzdGFydCcsIG9uU2Vzc2lvbkV2ZW50ICk7CiAgICAJCQlzZXNzaW9uLmFkZEV2ZW50TGlzdGVuZXIoICdzZWxlY3RlbmQnLCBvblNlc3Npb25FdmVudCApOwogICAgCQkJc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnZW5kJywgb25TZXNzaW9uRW5kICk7CgogICAgCQkJc2Vzc2lvbi51cGRhdGVSZW5kZXJTdGF0ZSggeyBiYXNlTGF5ZXI6IG5ldyBYUldlYkdMTGF5ZXIoIHNlc3Npb24sIGdsICkgfSApOwoKICAgIAkJCXNlc3Npb24ucmVxdWVzdFJlZmVyZW5jZVNwYWNlKCByZWZlcmVuY2VTcGFjZVR5cGUgKS50aGVuKCBvblJlcXVlc3RSZWZlcmVuY2VTcGFjZSApOwoKICAgIAkJCS8vCgogICAgCQkJaW5wdXRTb3VyY2VzID0gc2Vzc2lvbi5pbnB1dFNvdXJjZXM7CgogICAgCQkJc2Vzc2lvbi5hZGRFdmVudExpc3RlbmVyKCAnaW5wdXRzb3VyY2VzY2hhbmdlJywgZnVuY3Rpb24gKCkgewoKICAgIAkJCQlpbnB1dFNvdXJjZXMgPSBzZXNzaW9uLmlucHV0U291cmNlczsKICAgIAkJCQljb25zb2xlLmxvZyggaW5wdXRTb3VyY2VzICk7CgogICAgCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJCXZhciBjb250cm9sbGVyID0gY29udHJvbGxlcnNbIGkgXTsKICAgIAkJCQkJY29udHJvbGxlci51c2VyRGF0YS5pbnB1dFNvdXJjZSA9IGlucHV0U291cmNlc1sgaSBdOwoKICAgIAkJCQl9CgogICAgCQkJfSApOwoKICAgIAkJfQoKICAgIAl9OwoKICAgIAlmdW5jdGlvbiB1cGRhdGVDYW1lcmEoIGNhbWVyYSwgcGFyZW50ICkgewoKICAgIAkJaWYgKCBwYXJlbnQgPT09IG51bGwgKSB7CgogICAgCQkJY2FtZXJhLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXggKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJY2FtZXJhLm1hdHJpeFdvcmxkLm11bHRpcGx5TWF0cmljZXMoIHBhcmVudC5tYXRyaXhXb3JsZCwgY2FtZXJhLm1hdHJpeCApOwoKICAgIAkJfQoKICAgIAkJY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZS5nZXRJbnZlcnNlKCBjYW1lcmEubWF0cml4V29ybGQgKTsKCiAgICAJfQoKICAgIAl0aGlzLmdldENhbWVyYSA9IGZ1bmN0aW9uICggY2FtZXJhICkgewoKICAgIAkJaWYgKCBpc1ByZXNlbnRpbmcoKSApIHsKCiAgICAJCQl2YXIgcGFyZW50ID0gY2FtZXJhLnBhcmVudDsKICAgIAkJCXZhciBjYW1lcmFzID0gY2FtZXJhVlIuY2FtZXJhczsKCiAgICAJCQl1cGRhdGVDYW1lcmEoIGNhbWVyYVZSLCBwYXJlbnQgKTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjYW1lcmFzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJdXBkYXRlQ2FtZXJhKCBjYW1lcmFzWyBpIF0sIHBhcmVudCApOwoKICAgIAkJCX0KCiAgICAJCQkvLyB1cGRhdGUgY2FtZXJhIGFuZCBpdHMgY2hpbGRyZW4KCiAgICAJCQljYW1lcmEubWF0cml4V29ybGQuY29weSggY2FtZXJhVlIubWF0cml4V29ybGQgKTsKCiAgICAJCQl2YXIgY2hpbGRyZW4gPSBjYW1lcmEuY2hpbGRyZW47CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJY2hpbGRyZW5bIGkgXS51cGRhdGVNYXRyaXhXb3JsZCggdHJ1ZSApOwoKICAgIAkJCX0KCiAgICAJCQlzZXRQcm9qZWN0aW9uRnJvbVVuaW9uKCBjYW1lcmFWUiwgY2FtZXJhTCwgY2FtZXJhUiApOwoKICAgIAkJCXJldHVybiBjYW1lcmFWUjsKCiAgICAJCX0KCiAgICAJCXJldHVybiBjYW1lcmE7CgogICAgCX07CgogICAgCXRoaXMuaXNQcmVzZW50aW5nID0gaXNQcmVzZW50aW5nOwoKICAgIAkvLyBBbmltYXRpb24gTG9vcAoKICAgIAl2YXIgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDsKCiAgICAJZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZSggdGltZSwgZnJhbWUgKSB7CgogICAgCQlwb3NlID0gZnJhbWUuZ2V0Vmlld2VyUG9zZSggcmVmZXJlbmNlU3BhY2UgKTsKCiAgICAJCWlmICggcG9zZSAhPT0gbnVsbCApIHsKCiAgICAJCQl2YXIgdmlld3MgPSBwb3NlLnZpZXdzOwogICAgCQkJdmFyIGJhc2VMYXllciA9IHNlc3Npb24ucmVuZGVyU3RhdGUuYmFzZUxheWVyOwoKICAgIAkJCXJlbmRlcmVyLnNldEZyYW1lYnVmZmVyKCBiYXNlTGF5ZXIuZnJhbWVidWZmZXIgKTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB2aWV3cy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCXZhciB2aWV3ID0gdmlld3NbIGkgXTsKICAgIAkJCQl2YXIgdmlld3BvcnQgPSBiYXNlTGF5ZXIuZ2V0Vmlld3BvcnQoIHZpZXcgKTsKICAgIAkJCQl2YXIgdmlld01hdHJpeCA9IHZpZXcudHJhbnNmb3JtLmludmVyc2UubWF0cml4OwoKICAgIAkJCQl2YXIgY2FtZXJhID0gY2FtZXJhVlIuY2FtZXJhc1sgaSBdOwogICAgCQkJCWNhbWVyYS5tYXRyaXguZnJvbUFycmF5KCB2aWV3TWF0cml4ICkuZ2V0SW52ZXJzZSggY2FtZXJhLm1hdHJpeCApOwogICAgCQkJCWNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LmZyb21BcnJheSggdmlldy5wcm9qZWN0aW9uTWF0cml4ICk7CiAgICAJCQkJY2FtZXJhLnZpZXdwb3J0LnNldCggdmlld3BvcnQueCwgdmlld3BvcnQueSwgdmlld3BvcnQud2lkdGgsIHZpZXdwb3J0LmhlaWdodCApOwoKICAgIAkJCQlpZiAoIGkgPT09IDAgKSB7CgogICAgCQkJCQljYW1lcmFWUi5tYXRyaXguY29weSggY2FtZXJhLm1hdHJpeCApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRyb2xsZXJzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgY29udHJvbGxlciA9IGNvbnRyb2xsZXJzWyBpIF07CgogICAgCQkJdmFyIGlucHV0U291cmNlID0gaW5wdXRTb3VyY2VzWyBpIF07CgogICAgCQkJaWYgKCBpbnB1dFNvdXJjZSApIHsKCiAgICAJCQkJdmFyIGlucHV0UG9zZSA9IGZyYW1lLmdldFBvc2UoIGlucHV0U291cmNlLnRhcmdldFJheVNwYWNlLCByZWZlcmVuY2VTcGFjZSApOwoKICAgIAkJCQlpZiAoIGlucHV0UG9zZSAhPT0gbnVsbCApIHsKCiAgICAJCQkJCWNvbnRyb2xsZXIubWF0cml4LmZyb21BcnJheSggaW5wdXRQb3NlLnRyYW5zZm9ybS5tYXRyaXggKTsKICAgIAkJCQkJY29udHJvbGxlci5tYXRyaXguZGVjb21wb3NlKCBjb250cm9sbGVyLnBvc2l0aW9uLCBjb250cm9sbGVyLnJvdGF0aW9uLCBjb250cm9sbGVyLnNjYWxlICk7CiAgICAJCQkJCWNvbnRyb2xsZXIudmlzaWJsZSA9IHRydWU7CgogICAgCQkJCQljb250aW51ZTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQljb250cm9sbGVyLnZpc2libGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCWlmICggb25BbmltYXRpb25GcmFtZUNhbGxiYWNrICkgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrKCB0aW1lICk7CgogICAgCX0KCiAgICAJdmFyIGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpOwogICAgCWFuaW1hdGlvbi5zZXRBbmltYXRpb25Mb29wKCBvbkFuaW1hdGlvbkZyYW1lICk7CgogICAgCXRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CgogICAgCQlvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjazsKCiAgICAJfTsKCiAgICAJdGhpcy5kaXNwb3NlID0gZnVuY3Rpb24gKCkge307CgogICAgCS8vIERFUFJFQ0FURUQKCiAgICAJdGhpcy5nZXRTdGFuZGluZ01hdHJpeCA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYlhSTWFuYWdlcjogZ2V0U3RhbmRpbmdNYXRyaXgoKSBpcyBubyBsb25nZXIgbmVlZGVkLicgKTsKICAgIAkJcmV0dXJuIG5ldyBNYXRyaXg0KCk7CgogICAgCX07CgogICAgCXRoaXMuZ2V0RGV2aWNlID0gZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBnZXREZXZpY2UoKSBoYXMgYmVlbiBkZXByZWNhdGVkLicgKTsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXREZXZpY2UgPSBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJYUk1hbmFnZXI6IHNldERldmljZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuJyApOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldEZyYW1lT2ZSZWZlcmVuY2VUeXBlID0gZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViWFJNYW5hZ2VyOiBzZXRGcmFtZU9mUmVmZXJlbmNlVHlwZSgpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuJyApOwoKICAgIAl9OwoKICAgIAl0aGlzLnN1Ym1pdEZyYW1lID0gZnVuY3Rpb24gKCkge307CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFdlYlhSTWFuYWdlci5wcm90b3R5cGUsIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKTsKCiAgICAvKioKICAgICAqIEBhdXRob3Igc3VwZXJlZ2diZXJ0IC8gaHR0cDovL3d3dy5wYXVsYnJ1bnQuY28udWsvCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3Igc3ppbWVrIC8gaHR0cHM6Ly9naXRodWIuY29tL3N6aW1lay8KICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqLwoKICAgIGZ1bmN0aW9uIFdlYkdMUmVuZGVyZXIoIHBhcmFtZXRlcnMgKSB7CgogICAgCXBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzIHx8IHt9OwoKICAgIAl2YXIgX2NhbnZhcyA9IHBhcmFtZXRlcnMuY2FudmFzICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmNhbnZhcyA6IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnY2FudmFzJyApLAogICAgCQlfY29udGV4dCA9IHBhcmFtZXRlcnMuY29udGV4dCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5jb250ZXh0IDogbnVsbCwKCiAgICAJCV9hbHBoYSA9IHBhcmFtZXRlcnMuYWxwaGEgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYWxwaGEgOiBmYWxzZSwKICAgIAkJX2RlcHRoID0gcGFyYW1ldGVycy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5kZXB0aCA6IHRydWUsCiAgICAJCV9zdGVuY2lsID0gcGFyYW1ldGVycy5zdGVuY2lsICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLnN0ZW5jaWwgOiB0cnVlLAogICAgCQlfYW50aWFsaWFzID0gcGFyYW1ldGVycy5hbnRpYWxpYXMgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMuYW50aWFsaWFzIDogZmFsc2UsCiAgICAJCV9wcmVtdWx0aXBsaWVkQWxwaGEgPSBwYXJhbWV0ZXJzLnByZW11bHRpcGxpZWRBbHBoYSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wcmVtdWx0aXBsaWVkQWxwaGEgOiB0cnVlLAogICAgCQlfcHJlc2VydmVEcmF3aW5nQnVmZmVyID0gcGFyYW1ldGVycy5wcmVzZXJ2ZURyYXdpbmdCdWZmZXIgIT09IHVuZGVmaW5lZCA/IHBhcmFtZXRlcnMucHJlc2VydmVEcmF3aW5nQnVmZmVyIDogZmFsc2UsCiAgICAJCV9wb3dlclByZWZlcmVuY2UgPSBwYXJhbWV0ZXJzLnBvd2VyUHJlZmVyZW5jZSAhPT0gdW5kZWZpbmVkID8gcGFyYW1ldGVycy5wb3dlclByZWZlcmVuY2UgOiAnZGVmYXVsdCcsCiAgICAJCV9mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ID0gcGFyYW1ldGVycy5mYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmZhaWxJZk1ham9yUGVyZm9ybWFuY2VDYXZlYXQgOiBmYWxzZTsKCiAgICAJdmFyIGN1cnJlbnRSZW5kZXJMaXN0ID0gbnVsbDsKICAgIAl2YXIgY3VycmVudFJlbmRlclN0YXRlID0gbnVsbDsKCiAgICAJLy8gcHVibGljIHByb3BlcnRpZXMKCiAgICAJdGhpcy5kb21FbGVtZW50ID0gX2NhbnZhczsKCiAgICAJLy8gRGVidWcgY29uZmlndXJhdGlvbiBjb250YWluZXIKICAgIAl0aGlzLmRlYnVnID0gewoKICAgIAkJLyoqCiAgICAJCSAqIEVuYWJsZXMgZXJyb3IgY2hlY2tpbmcgYW5kIHJlcG9ydGluZyB3aGVuIHNoYWRlciBwcm9ncmFtcyBhcmUgYmVpbmcgY29tcGlsZWQKICAgIAkJICogQHR5cGUge2Jvb2xlYW59CiAgICAJCSAqLwogICAgCQljaGVja1NoYWRlckVycm9yczogdHJ1ZQogICAgCX07CgogICAgCS8vIGNsZWFyaW5nCgogICAgCXRoaXMuYXV0b0NsZWFyID0gdHJ1ZTsKICAgIAl0aGlzLmF1dG9DbGVhckNvbG9yID0gdHJ1ZTsKICAgIAl0aGlzLmF1dG9DbGVhckRlcHRoID0gdHJ1ZTsKICAgIAl0aGlzLmF1dG9DbGVhclN0ZW5jaWwgPSB0cnVlOwoKICAgIAkvLyBzY2VuZSBncmFwaAoKICAgIAl0aGlzLnNvcnRPYmplY3RzID0gdHJ1ZTsKCiAgICAJLy8gdXNlci1kZWZpbmVkIGNsaXBwaW5nCgogICAgCXRoaXMuY2xpcHBpbmdQbGFuZXMgPSBbXTsKICAgIAl0aGlzLmxvY2FsQ2xpcHBpbmdFbmFibGVkID0gZmFsc2U7CgogICAgCS8vIHBoeXNpY2FsbHkgYmFzZWQgc2hhZGluZwoKICAgIAl0aGlzLmdhbW1hRmFjdG9yID0gMi4wOwkvLyBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgIAl0aGlzLmdhbW1hSW5wdXQgPSBmYWxzZTsKICAgIAl0aGlzLmdhbW1hT3V0cHV0ID0gZmFsc2U7CgogICAgCS8vIHBoeXNpY2FsIGxpZ2h0cwoKICAgIAl0aGlzLnBoeXNpY2FsbHlDb3JyZWN0TGlnaHRzID0gZmFsc2U7CgogICAgCS8vIHRvbmUgbWFwcGluZwoKICAgIAl0aGlzLnRvbmVNYXBwaW5nID0gTGluZWFyVG9uZU1hcHBpbmc7CiAgICAJdGhpcy50b25lTWFwcGluZ0V4cG9zdXJlID0gMS4wOwogICAgCXRoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50ID0gMS4wOwoKICAgIAkvLyBtb3JwaHMKCiAgICAJdGhpcy5tYXhNb3JwaFRhcmdldHMgPSA4OwogICAgCXRoaXMubWF4TW9ycGhOb3JtYWxzID0gNDsKCiAgICAJLy8gaW50ZXJuYWwgcHJvcGVydGllcwoKICAgIAl2YXIgX3RoaXMgPSB0aGlzLAoKICAgIAkJX2lzQ29udGV4dExvc3QgPSBmYWxzZSwKCiAgICAJCS8vIGludGVybmFsIHN0YXRlIGNhY2hlCgogICAgCQlfZnJhbWVidWZmZXIgPSBudWxsLAoKICAgIAkJX2N1cnJlbnRBY3RpdmVDdWJlRmFjZSA9IDAsCiAgICAJCV9jdXJyZW50QWN0aXZlTWlwbWFwTGV2ZWwgPSAwLAogICAgCQlfY3VycmVudFJlbmRlclRhcmdldCA9IG51bGwsCiAgICAJCV9jdXJyZW50RnJhbWVidWZmZXIgPSBudWxsLAogICAgCQlfY3VycmVudE1hdGVyaWFsSWQgPSAtIDEsCgogICAgCQkvLyBnZW9tZXRyeSBhbmQgcHJvZ3JhbSBjYWNoaW5nCgogICAgCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbSA9IHsKICAgIAkJCWdlb21ldHJ5OiBudWxsLAogICAgCQkJcHJvZ3JhbTogbnVsbCwKICAgIAkJCXdpcmVmcmFtZTogZmFsc2UKICAgIAkJfSwKCiAgICAJCV9jdXJyZW50Q2FtZXJhID0gbnVsbCwKICAgIAkJX2N1cnJlbnRBcnJheUNhbWVyYSA9IG51bGwsCgogICAgCQlfY3VycmVudFZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoKSwKICAgIAkJX2N1cnJlbnRTY2lzc29yID0gbmV3IFZlY3RvcjQoKSwKICAgIAkJX2N1cnJlbnRTY2lzc29yVGVzdCA9IG51bGwsCgogICAgCQkvLwoKICAgIAkJX3dpZHRoID0gX2NhbnZhcy53aWR0aCwKICAgIAkJX2hlaWdodCA9IF9jYW52YXMuaGVpZ2h0LAoKICAgIAkJX3BpeGVsUmF0aW8gPSAxLAoKICAgIAkJX3ZpZXdwb3J0ID0gbmV3IFZlY3RvcjQoIDAsIDAsIF93aWR0aCwgX2hlaWdodCApLAogICAgCQlfc2Npc3NvciA9IG5ldyBWZWN0b3I0KCAwLCAwLCBfd2lkdGgsIF9oZWlnaHQgKSwKICAgIAkJX3NjaXNzb3JUZXN0ID0gZmFsc2UsCgogICAgCQkvLyBmcnVzdHVtCgogICAgCQlfZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCksCgogICAgCQkvLyBjbGlwcGluZwoKICAgIAkJX2NsaXBwaW5nID0gbmV3IFdlYkdMQ2xpcHBpbmcoKSwKICAgIAkJX2NsaXBwaW5nRW5hYmxlZCA9IGZhbHNlLAogICAgCQlfbG9jYWxDbGlwcGluZ0VuYWJsZWQgPSBmYWxzZSwKCiAgICAJCS8vIGNhbWVyYSBtYXRyaWNlcyBjYWNoZQoKICAgIAkJX3Byb2pTY3JlZW5NYXRyaXggPSBuZXcgTWF0cml4NCgpLAoKICAgIAkJX3ZlY3RvcjMgPSBuZXcgVmVjdG9yMygpOwoKICAgIAlmdW5jdGlvbiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgewoKICAgIAkJcmV0dXJuIF9jdXJyZW50UmVuZGVyVGFyZ2V0ID09PSBudWxsID8gX3BpeGVsUmF0aW8gOiAxOwoKICAgIAl9CgogICAgCS8vIGluaXRpYWxpemUKCiAgICAJdmFyIF9nbDsKCiAgICAJdHJ5IHsKCiAgICAJCXZhciBjb250ZXh0QXR0cmlidXRlcyA9IHsKICAgIAkJCWFscGhhOiBfYWxwaGEsCiAgICAJCQlkZXB0aDogX2RlcHRoLAogICAgCQkJc3RlbmNpbDogX3N0ZW5jaWwsCiAgICAJCQlhbnRpYWxpYXM6IF9hbnRpYWxpYXMsCiAgICAJCQlwcmVtdWx0aXBsaWVkQWxwaGE6IF9wcmVtdWx0aXBsaWVkQWxwaGEsCiAgICAJCQlwcmVzZXJ2ZURyYXdpbmdCdWZmZXI6IF9wcmVzZXJ2ZURyYXdpbmdCdWZmZXIsCiAgICAJCQlwb3dlclByZWZlcmVuY2U6IF9wb3dlclByZWZlcmVuY2UsCiAgICAJCQlmYWlsSWZNYWpvclBlcmZvcm1hbmNlQ2F2ZWF0OiBfZmFpbElmTWFqb3JQZXJmb3JtYW5jZUNhdmVhdCwKICAgIAkJCXhyQ29tcGF0aWJsZTogdHJ1ZQogICAgCQl9OwoKICAgIAkJLy8gZXZlbnQgbGlzdGVuZXJzIG11c3QgYmUgcmVnaXN0ZXJlZCBiZWZvcmUgV2ViR0wgY29udGV4dCBpcyBjcmVhdGVkLCBzZWUgIzEyNzUzCgogICAgCQlfY2FudmFzLmFkZEV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRsb3N0Jywgb25Db250ZXh0TG9zdCwgZmFsc2UgKTsKICAgIAkJX2NhbnZhcy5hZGRFdmVudExpc3RlbmVyKCAnd2ViZ2xjb250ZXh0cmVzdG9yZWQnLCBvbkNvbnRleHRSZXN0b3JlLCBmYWxzZSApOwoKICAgIAkJX2dsID0gX2NvbnRleHQgfHwgX2NhbnZhcy5nZXRDb250ZXh0KCAnd2ViZ2wnLCBjb250ZXh0QXR0cmlidXRlcyApIHx8IF9jYW52YXMuZ2V0Q29udGV4dCggJ2V4cGVyaW1lbnRhbC13ZWJnbCcsIGNvbnRleHRBdHRyaWJ1dGVzICk7CgogICAgCQlpZiAoIF9nbCA9PT0gbnVsbCApIHsKCiAgICAJCQlpZiAoIF9jYW52YXMuZ2V0Q29udGV4dCggJ3dlYmdsJyApICE9PSBudWxsICkgewoKICAgIAkJCQl0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0IHdpdGggeW91ciBzZWxlY3RlZCBhdHRyaWJ1dGVzLicgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQl0aHJvdyBuZXcgRXJyb3IoICdFcnJvciBjcmVhdGluZyBXZWJHTCBjb250ZXh0LicgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBTb21lIGV4cGVyaW1lbnRhbC13ZWJnbCBpbXBsZW1lbnRhdGlvbnMgZG8gbm90IGhhdmUgZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0CgogICAgCQlpZiAoIF9nbC5nZXRTaGFkZXJQcmVjaXNpb25Gb3JtYXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlfZ2wuZ2V0U2hhZGVyUHJlY2lzaW9uRm9ybWF0ID0gZnVuY3Rpb24gKCkgewoKICAgIAkJCQlyZXR1cm4geyAncmFuZ2VNaW4nOiAxLCAncmFuZ2VNYXgnOiAxLCAncHJlY2lzaW9uJzogMSB9OwoKICAgIAkJCX07CgogICAgCQl9CgogICAgCX0gY2F0Y2ggKCBlcnJvciApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAnICsgZXJyb3IubWVzc2FnZSApOwogICAgCQl0aHJvdyBlcnJvcjsKCiAgICAJfQoKICAgIAl2YXIgZXh0ZW5zaW9ucywgY2FwYWJpbGl0aWVzLCBzdGF0ZSwgaW5mbzsKICAgIAl2YXIgcHJvcGVydGllcywgdGV4dHVyZXMsIGF0dHJpYnV0ZXMsIGdlb21ldHJpZXMsIG9iamVjdHM7CiAgICAJdmFyIHByb2dyYW1DYWNoZSwgcmVuZGVyTGlzdHMsIHJlbmRlclN0YXRlczsKCiAgICAJdmFyIGJhY2tncm91bmQsIG1vcnBodGFyZ2V0cywgYnVmZmVyUmVuZGVyZXIsIGluZGV4ZWRCdWZmZXJSZW5kZXJlcjsKCiAgICAJdmFyIHV0aWxzOwoKICAgIAlmdW5jdGlvbiBpbml0R0xDb250ZXh0KCkgewoKICAgIAkJZXh0ZW5zaW9ucyA9IG5ldyBXZWJHTEV4dGVuc2lvbnMoIF9nbCApOwoKICAgIAkJY2FwYWJpbGl0aWVzID0gbmV3IFdlYkdMQ2FwYWJpbGl0aWVzKCBfZ2wsIGV4dGVuc2lvbnMsIHBhcmFtZXRlcnMgKTsKCiAgICAJCWlmICggISBjYXBhYmlsaXRpZXMuaXNXZWJHTDIgKSB7CgogICAgCQkJZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9kZXB0aF90ZXh0dXJlJyApOwogICAgCQkJZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9mbG9hdCcgKTsKICAgIAkJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdCcgKTsKICAgIAkJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfaGFsZl9mbG9hdF9saW5lYXInICk7CiAgICAJCQlleHRlbnNpb25zLmdldCggJ09FU19zdGFuZGFyZF9kZXJpdmF0aXZlcycgKTsKICAgIAkJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX2VsZW1lbnRfaW5kZXhfdWludCcgKTsKICAgIAkJCWV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKTsKCiAgICAJCX0KCiAgICAJCWV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXRfbGluZWFyJyApOwoKICAgIAkJdXRpbHMgPSBuZXcgV2ViR0xVdGlscyggX2dsLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTsKCiAgICAJCXN0YXRlID0gbmV3IFdlYkdMU3RhdGUoIF9nbCwgZXh0ZW5zaW9ucywgdXRpbHMsIGNhcGFiaWxpdGllcyApOwogICAgCQlzdGF0ZS5zY2lzc29yKCBfY3VycmVudFNjaXNzb3IuY29weSggX3NjaXNzb3IgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpICk7CiAgICAJCXN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0LmNvcHkoIF92aWV3cG9ydCApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCkgKTsKCiAgICAJCWluZm8gPSBuZXcgV2ViR0xJbmZvKCBfZ2wgKTsKICAgIAkJcHJvcGVydGllcyA9IG5ldyBXZWJHTFByb3BlcnRpZXMoKTsKICAgIAkJdGV4dHVyZXMgPSBuZXcgV2ViR0xUZXh0dXJlcyggX2dsLCBleHRlbnNpb25zLCBzdGF0ZSwgcHJvcGVydGllcywgY2FwYWJpbGl0aWVzLCB1dGlscywgaW5mbyApOwogICAgCQlhdHRyaWJ1dGVzID0gbmV3IFdlYkdMQXR0cmlidXRlcyggX2dsICk7CiAgICAJCWdlb21ldHJpZXMgPSBuZXcgV2ViR0xHZW9tZXRyaWVzKCBfZ2wsIGF0dHJpYnV0ZXMsIGluZm8gKTsKICAgIAkJb2JqZWN0cyA9IG5ldyBXZWJHTE9iamVjdHMoIGdlb21ldHJpZXMsIGluZm8gKTsKICAgIAkJbW9ycGh0YXJnZXRzID0gbmV3IFdlYkdMTW9ycGh0YXJnZXRzKCBfZ2wgKTsKICAgIAkJcHJvZ3JhbUNhY2hlID0gbmV3IFdlYkdMUHJvZ3JhbXMoIF90aGlzLCBleHRlbnNpb25zLCBjYXBhYmlsaXRpZXMgKTsKICAgIAkJcmVuZGVyTGlzdHMgPSBuZXcgV2ViR0xSZW5kZXJMaXN0cygpOwogICAgCQlyZW5kZXJTdGF0ZXMgPSBuZXcgV2ViR0xSZW5kZXJTdGF0ZXMoKTsKCiAgICAJCWJhY2tncm91bmQgPSBuZXcgV2ViR0xCYWNrZ3JvdW5kKCBfdGhpcywgc3RhdGUsIG9iamVjdHMsIF9wcmVtdWx0aXBsaWVkQWxwaGEgKTsKCiAgICAJCWJ1ZmZlclJlbmRlcmVyID0gbmV3IFdlYkdMQnVmZmVyUmVuZGVyZXIoIF9nbCwgZXh0ZW5zaW9ucywgaW5mbywgY2FwYWJpbGl0aWVzICk7CiAgICAJCWluZGV4ZWRCdWZmZXJSZW5kZXJlciA9IG5ldyBXZWJHTEluZGV4ZWRCdWZmZXJSZW5kZXJlciggX2dsLCBleHRlbnNpb25zLCBpbmZvLCBjYXBhYmlsaXRpZXMgKTsKCiAgICAJCWluZm8ucHJvZ3JhbXMgPSBwcm9ncmFtQ2FjaGUucHJvZ3JhbXM7CgogICAgCQlfdGhpcy5jYXBhYmlsaXRpZXMgPSBjYXBhYmlsaXRpZXM7CiAgICAJCV90aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwogICAgCQlfdGhpcy5wcm9wZXJ0aWVzID0gcHJvcGVydGllczsKICAgIAkJX3RoaXMucmVuZGVyTGlzdHMgPSByZW5kZXJMaXN0czsKICAgIAkJX3RoaXMuc3RhdGUgPSBzdGF0ZTsKICAgIAkJX3RoaXMuaW5mbyA9IGluZm87CgogICAgCX0KCiAgICAJaW5pdEdMQ29udGV4dCgpOwoKICAgIAkvLyB2cgoKICAgIAl2YXIgdnIgPSAoIHR5cGVvZiBuYXZpZ2F0b3IgIT09ICd1bmRlZmluZWQnICYmICd4cicgaW4gbmF2aWdhdG9yICYmICdzdXBwb3J0c1Nlc3Npb24nIGluIG5hdmlnYXRvci54ciApID8gbmV3IFdlYlhSTWFuYWdlciggX3RoaXMsIF9nbCApIDogbmV3IFdlYlZSTWFuYWdlciggX3RoaXMgKTsKCiAgICAJdGhpcy52ciA9IHZyOwoKICAgIAkvLyBzaGFkb3cgbWFwCgogICAgCXZhciBzaGFkb3dNYXAgPSBuZXcgV2ViR0xTaGFkb3dNYXAoIF90aGlzLCBvYmplY3RzLCBjYXBhYmlsaXRpZXMubWF4VGV4dHVyZVNpemUgKTsKCiAgICAJdGhpcy5zaGFkb3dNYXAgPSBzaGFkb3dNYXA7CgogICAgCS8vIEFQSQoKICAgIAl0aGlzLmdldENvbnRleHQgPSBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gX2dsOwoKICAgIAl9OwoKICAgIAl0aGlzLmdldENvbnRleHRBdHRyaWJ1dGVzID0gZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIF9nbC5nZXRDb250ZXh0QXR0cmlidXRlcygpOwoKICAgIAl9OwoKICAgIAl0aGlzLmZvcmNlQ29udGV4dExvc3MgPSBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZXh0ZW5zaW9uID0gZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9sb3NlX2NvbnRleHQnICk7CiAgICAJCWlmICggZXh0ZW5zaW9uICkgZXh0ZW5zaW9uLmxvc2VDb250ZXh0KCk7CgogICAgCX07CgogICAgCXRoaXMuZm9yY2VDb250ZXh0UmVzdG9yZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBleHRlbnNpb24gPSBleHRlbnNpb25zLmdldCggJ1dFQkdMX2xvc2VfY29udGV4dCcgKTsKICAgIAkJaWYgKCBleHRlbnNpb24gKSBleHRlbnNpb24ucmVzdG9yZUNvbnRleHQoKTsKCiAgICAJfTsKCiAgICAJdGhpcy5nZXRQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIF9waXhlbFJhdGlvOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldFBpeGVsUmF0aW8gPSBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOwoKICAgIAkJX3BpeGVsUmF0aW8gPSB2YWx1ZTsKCiAgICAJCXRoaXMuc2V0U2l6ZSggX3dpZHRoLCBfaGVpZ2h0LCBmYWxzZSApOwoKICAgIAl9OwoKICAgIAl0aGlzLmdldFNpemUgPSBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldHNpemUoKSBub3cgcmVxdWlyZXMgYSBWZWN0b3IyIGFzIGFuIGFyZ3VtZW50JyApOwoKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IyKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGFyZ2V0LnNldCggX3dpZHRoLCBfaGVpZ2h0ICk7CgogICAgCX07CgogICAgCXRoaXMuc2V0U2l6ZSA9IGZ1bmN0aW9uICggd2lkdGgsIGhlaWdodCwgdXBkYXRlU3R5bGUgKSB7CgogICAgCQlpZiAoIHZyLmlzUHJlc2VudGluZygpICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENhblwndCBjaGFuZ2Ugc2l6ZSB3aGlsZSBWUiBkZXZpY2UgaXMgcHJlc2VudGluZy4nICk7CiAgICAJCQlyZXR1cm47CgogICAgCQl9CgogICAgCQlfd2lkdGggPSB3aWR0aDsKICAgIAkJX2hlaWdodCA9IGhlaWdodDsKCiAgICAJCV9jYW52YXMud2lkdGggPSBNYXRoLmZsb29yKCB3aWR0aCAqIF9waXhlbFJhdGlvICk7CiAgICAJCV9jYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaGVpZ2h0ICogX3BpeGVsUmF0aW8gKTsKCiAgICAJCWlmICggdXBkYXRlU3R5bGUgIT09IGZhbHNlICkgewoKICAgIAkJCV9jYW52YXMuc3R5bGUud2lkdGggPSB3aWR0aCArICdweCc7CiAgICAJCQlfY2FudmFzLnN0eWxlLmhlaWdodCA9IGhlaWdodCArICdweCc7CgogICAgCQl9CgogICAgCQl0aGlzLnNldFZpZXdwb3J0KCAwLCAwLCB3aWR0aCwgaGVpZ2h0ICk7CgogICAgCX07CgogICAgCXRoaXMuZ2V0RHJhd2luZ0J1ZmZlclNpemUgPSBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnV2ViR0xSZW5kZXJlcjogLmdldGRyYXdpbmdCdWZmZXJTaXplKCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yMiBhcyBhbiBhcmd1bWVudCcgKTsKCiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMigpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5zZXQoIF93aWR0aCAqIF9waXhlbFJhdGlvLCBfaGVpZ2h0ICogX3BpeGVsUmF0aW8gKS5mbG9vcigpOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldERyYXdpbmdCdWZmZXJTaXplID0gZnVuY3Rpb24gKCB3aWR0aCwgaGVpZ2h0LCBwaXhlbFJhdGlvICkgewoKICAgIAkJX3dpZHRoID0gd2lkdGg7CiAgICAJCV9oZWlnaHQgPSBoZWlnaHQ7CgogICAgCQlfcGl4ZWxSYXRpbyA9IHBpeGVsUmF0aW87CgogICAgCQlfY2FudmFzLndpZHRoID0gTWF0aC5mbG9vciggd2lkdGggKiBwaXhlbFJhdGlvICk7CiAgICAJCV9jYW52YXMuaGVpZ2h0ID0gTWF0aC5mbG9vciggaGVpZ2h0ICogcGl4ZWxSYXRpbyApOwoKICAgIAkJdGhpcy5zZXRWaWV3cG9ydCggMCwgMCwgd2lkdGgsIGhlaWdodCApOwoKICAgIAl9OwoKICAgIAl0aGlzLmdldEN1cnJlbnRWaWV3cG9ydCA9IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdXZWJHTFJlbmRlcmVyOiAuZ2V0Q3VycmVudFZpZXdwb3J0KCkgbm93IHJlcXVpcmVzIGEgVmVjdG9yNCBhcyBhbiBhcmd1bWVudCcgKTsKCiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yNCgpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5jb3B5KCBfY3VycmVudFZpZXdwb3J0ICk7CgogICAgCX07CgogICAgCXRoaXMuZ2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHRhcmdldCApIHsKCiAgICAJCXJldHVybiB0YXJnZXQuY29weSggX3ZpZXdwb3J0ICk7CgogICAgCX07CgogICAgCXRoaXMuc2V0Vmlld3BvcnQgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7CgogICAgCQlpZiAoIHguaXNWZWN0b3I0ICkgewoKICAgIAkJCV92aWV3cG9ydC5zZXQoIHgueCwgeC55LCB4LnosIHgudyApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlfdmlld3BvcnQuc2V0KCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7CgogICAgCQl9CgogICAgCQlzdGF0ZS52aWV3cG9ydCggX2N1cnJlbnRWaWV3cG9ydC5jb3B5KCBfdmlld3BvcnQgKS5tdWx0aXBseVNjYWxhciggX3BpeGVsUmF0aW8gKS5mbG9vcigpICk7CgogICAgCX07CgogICAgCXRoaXMuZ2V0U2Npc3NvciA9IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJcmV0dXJuIHRhcmdldC5jb3B5KCBfc2Npc3NvciApOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldFNjaXNzb3IgPSBmdW5jdGlvbiAoIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7CgogICAgCQlpZiAoIHguaXNWZWN0b3I0ICkgewoKICAgIAkJCV9zY2lzc29yLnNldCggeC54LCB4LnksIHgueiwgeC53ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCV9zY2lzc29yLnNldCggeCwgeSwgd2lkdGgsIGhlaWdodCApOwoKICAgIAkJfQoKICAgIAkJc3RhdGUuc2Npc3NvciggX2N1cnJlbnRTY2lzc29yLmNvcHkoIF9zY2lzc29yICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKSApOwoKICAgIAl9OwoKICAgIAl0aGlzLmdldFNjaXNzb3JUZXN0ID0gZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIF9zY2lzc29yVGVzdDsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRTY2lzc29yVGVzdCA9IGZ1bmN0aW9uICggYm9vbGVhbiApIHsKCiAgICAJCXN0YXRlLnNldFNjaXNzb3JUZXN0KCBfc2Npc3NvclRlc3QgPSBib29sZWFuICk7CgogICAgCX07CgogICAgCS8vIENsZWFyaW5nCgogICAgCXRoaXMuZ2V0Q2xlYXJDb2xvciA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBiYWNrZ3JvdW5kLmdldENsZWFyQ29sb3IoKTsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRDbGVhckNvbG9yID0gZnVuY3Rpb24gKCkgewoKICAgIAkJYmFja2dyb3VuZC5zZXRDbGVhckNvbG9yLmFwcGx5KCBiYWNrZ3JvdW5kLCBhcmd1bWVudHMgKTsKCiAgICAJfTsKCiAgICAJdGhpcy5nZXRDbGVhckFscGhhID0gZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIGJhY2tncm91bmQuZ2V0Q2xlYXJBbHBoYSgpOwoKICAgIAl9OwoKICAgIAl0aGlzLnNldENsZWFyQWxwaGEgPSBmdW5jdGlvbiAoKSB7CgogICAgCQliYWNrZ3JvdW5kLnNldENsZWFyQWxwaGEuYXBwbHkoIGJhY2tncm91bmQsIGFyZ3VtZW50cyApOwoKICAgIAl9OwoKICAgIAl0aGlzLmNsZWFyID0gZnVuY3Rpb24gKCBjb2xvciwgZGVwdGgsIHN0ZW5jaWwgKSB7CgogICAgCQl2YXIgYml0cyA9IDA7CgogICAgCQlpZiAoIGNvbG9yID09PSB1bmRlZmluZWQgfHwgY29sb3IgKSBiaXRzIHw9IDE2Mzg0OwogICAgCQlpZiAoIGRlcHRoID09PSB1bmRlZmluZWQgfHwgZGVwdGggKSBiaXRzIHw9IDI1NjsKICAgIAkJaWYgKCBzdGVuY2lsID09PSB1bmRlZmluZWQgfHwgc3RlbmNpbCApIGJpdHMgfD0gMTAyNDsKCiAgICAJCV9nbC5jbGVhciggYml0cyApOwoKICAgIAl9OwoKICAgIAl0aGlzLmNsZWFyQ29sb3IgPSBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLmNsZWFyKCB0cnVlLCBmYWxzZSwgZmFsc2UgKTsKCiAgICAJfTsKCiAgICAJdGhpcy5jbGVhckRlcHRoID0gZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5jbGVhciggZmFsc2UsIHRydWUsIGZhbHNlICk7CgogICAgCX07CgogICAgCXRoaXMuY2xlYXJTdGVuY2lsID0gZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5jbGVhciggZmFsc2UsIGZhbHNlLCB0cnVlICk7CgogICAgCX07CgogICAgCS8vCgogICAgCXRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCV9jYW52YXMucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3dlYmdsY29udGV4dGxvc3QnLCBvbkNvbnRleHRMb3N0LCBmYWxzZSApOwogICAgCQlfY2FudmFzLnJlbW92ZUV2ZW50TGlzdGVuZXIoICd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsIG9uQ29udGV4dFJlc3RvcmUsIGZhbHNlICk7CgogICAgCQlyZW5kZXJMaXN0cy5kaXNwb3NlKCk7CiAgICAJCXJlbmRlclN0YXRlcy5kaXNwb3NlKCk7CiAgICAJCXByb3BlcnRpZXMuZGlzcG9zZSgpOwogICAgCQlvYmplY3RzLmRpc3Bvc2UoKTsKCiAgICAJCXZyLmRpc3Bvc2UoKTsKCiAgICAJCWFuaW1hdGlvbi5zdG9wKCk7CgogICAgCX07CgogICAgCS8vIEV2ZW50cwoKICAgIAlmdW5jdGlvbiBvbkNvbnRleHRMb3N0KCBldmVudCApIHsKCiAgICAJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgogICAgCQljb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgTG9zdC4nICk7CgogICAgCQlfaXNDb250ZXh0TG9zdCA9IHRydWU7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25Db250ZXh0UmVzdG9yZSggLyogZXZlbnQgKi8gKSB7CgogICAgCQljb25zb2xlLmxvZyggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IENvbnRleHQgUmVzdG9yZWQuJyApOwoKICAgIAkJX2lzQ29udGV4dExvc3QgPSBmYWxzZTsKCiAgICAJCWluaXRHTENvbnRleHQoKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBvbk1hdGVyaWFsRGlzcG9zZSggZXZlbnQgKSB7CgogICAgCQl2YXIgbWF0ZXJpYWwgPSBldmVudC50YXJnZXQ7CgogICAgCQltYXRlcmlhbC5yZW1vdmVFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7CgogICAgCQlkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICk7CgogICAgCX0KCiAgICAJLy8gQnVmZmVyIGRlYWxsb2NhdGlvbgoKICAgIAlmdW5jdGlvbiBkZWFsbG9jYXRlTWF0ZXJpYWwoIG1hdGVyaWFsICkgewoKICAgIAkJcmVsZWFzZU1hdGVyaWFsUHJvZ3JhbVJlZmVyZW5jZSggbWF0ZXJpYWwgKTsKCiAgICAJCXByb3BlcnRpZXMucmVtb3ZlKCBtYXRlcmlhbCApOwoKICAgIAl9CgoKICAgIAlmdW5jdGlvbiByZWxlYXNlTWF0ZXJpYWxQcm9ncmFtUmVmZXJlbmNlKCBtYXRlcmlhbCApIHsKCiAgICAJCXZhciBwcm9ncmFtSW5mbyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApLnByb2dyYW07CgogICAgCQltYXRlcmlhbC5wcm9ncmFtID0gdW5kZWZpbmVkOwoKICAgIAkJaWYgKCBwcm9ncmFtSW5mbyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXByb2dyYW1DYWNoZS5yZWxlYXNlUHJvZ3JhbSggcHJvZ3JhbUluZm8gKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyBCdWZmZXIgcmVuZGVyaW5nCgogICAgCWZ1bmN0aW9uIHJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICkgewoKICAgIAkJb2JqZWN0LnJlbmRlciggZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCQkJX3RoaXMucmVuZGVyQnVmZmVySW1tZWRpYXRlKCBvYmplY3QsIHByb2dyYW0gKTsKCiAgICAJCX0gKTsKCiAgICAJfQoKICAgIAl0aGlzLnJlbmRlckJ1ZmZlckltbWVkaWF0ZSA9IGZ1bmN0aW9uICggb2JqZWN0LCBwcm9ncmFtICkgewoKICAgIAkJc3RhdGUuaW5pdEF0dHJpYnV0ZXMoKTsKCiAgICAJCXZhciBidWZmZXJzID0gcHJvcGVydGllcy5nZXQoIG9iamVjdCApOwoKICAgIAkJaWYgKCBvYmplY3QuaGFzUG9zaXRpb25zICYmICEgYnVmZmVycy5wb3NpdGlvbiApIGJ1ZmZlcnMucG9zaXRpb24gPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CiAgICAJCWlmICggb2JqZWN0Lmhhc05vcm1hbHMgJiYgISBidWZmZXJzLm5vcm1hbCApIGJ1ZmZlcnMubm9ybWFsID0gX2dsLmNyZWF0ZUJ1ZmZlcigpOwogICAgCQlpZiAoIG9iamVjdC5oYXNVdnMgJiYgISBidWZmZXJzLnV2ICkgYnVmZmVycy51diA9IF9nbC5jcmVhdGVCdWZmZXIoKTsKICAgIAkJaWYgKCBvYmplY3QuaGFzQ29sb3JzICYmICEgYnVmZmVycy5jb2xvciApIGJ1ZmZlcnMuY29sb3IgPSBfZ2wuY3JlYXRlQnVmZmVyKCk7CgogICAgCQl2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTsKCiAgICAJCWlmICggb2JqZWN0Lmhhc1Bvc2l0aW9ucyApIHsKCiAgICAJCQlfZ2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlcnMucG9zaXRpb24gKTsKICAgIAkJCV9nbC5idWZmZXJEYXRhKCAzNDk2Miwgb2JqZWN0LnBvc2l0aW9uQXJyYXksIDM1MDQ4ICk7CgogICAgCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy5wb3NpdGlvbiApOwogICAgCQkJX2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnBvc2l0aW9uLCAzLCA1MTI2LCBmYWxzZSwgMCwgMCApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBvYmplY3QuaGFzTm9ybWFscyApIHsKCiAgICAJCQlfZ2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlcnMubm9ybWFsICk7CiAgICAJCQlfZ2wuYnVmZmVyRGF0YSggMzQ5NjIsIG9iamVjdC5ub3JtYWxBcnJheSwgMzUwNDggKTsKCiAgICAJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCApOwogICAgCQkJX2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLm5vcm1hbCwgMywgNTEyNiwgZmFsc2UsIDAsIDAgKTsKCiAgICAJCX0KCiAgICAJCWlmICggb2JqZWN0Lmhhc1V2cyApIHsKCiAgICAJCQlfZ2wuYmluZEJ1ZmZlciggMzQ5NjIsIGJ1ZmZlcnMudXYgKTsKICAgIAkJCV9nbC5idWZmZXJEYXRhKCAzNDk2Miwgb2JqZWN0LnV2QXJyYXksIDM1MDQ4ICk7CgogICAgCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlcy51diApOwogICAgCQkJX2dsLnZlcnRleEF0dHJpYlBvaW50ZXIoIHByb2dyYW1BdHRyaWJ1dGVzLnV2LCAyLCA1MTI2LCBmYWxzZSwgMCwgMCApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBvYmplY3QuaGFzQ29sb3JzICkgewoKICAgIAkJCV9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVycy5jb2xvciApOwogICAgCQkJX2dsLmJ1ZmZlckRhdGEoIDM0OTYyLCBvYmplY3QuY29sb3JBcnJheSwgMzUwNDggKTsKCiAgICAJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGVzLmNvbG9yICk7CiAgICAJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZXMuY29sb3IsIDMsIDUxMjYsIGZhbHNlLCAwLCAwICk7CgogICAgCQl9CgogICAgCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOwoKICAgIAkJX2dsLmRyYXdBcnJheXMoIDQsIDAsIG9iamVjdC5jb3VudCApOwoKICAgIAkJb2JqZWN0LmNvdW50ID0gMDsKCiAgICAJfTsKCiAgICAJdGhpcy5yZW5kZXJCdWZmZXJEaXJlY3QgPSBmdW5jdGlvbiAoIGNhbWVyYSwgZm9nLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG9iamVjdCwgZ3JvdXAgKSB7CgogICAgCQl2YXIgZnJvbnRGYWNlQ1cgPSAoIG9iamVjdC5pc01lc2ggJiYgb2JqZWN0Lm1hdHJpeFdvcmxkLmRldGVybWluYW50KCkgPCAwICk7CgogICAgCQlzdGF0ZS5zZXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZyb250RmFjZUNXICk7CgogICAgCQl2YXIgcHJvZ3JhbSA9IHNldFByb2dyYW0oIGNhbWVyYSwgZm9nLCBtYXRlcmlhbCwgb2JqZWN0ICk7CgogICAgCQl2YXIgdXBkYXRlQnVmZmVycyA9IGZhbHNlOwoKICAgIAkJaWYgKCBfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSAhPT0gZ2VvbWV0cnkuaWQgfHwKICAgIAkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLnByb2dyYW0gIT09IHByb2dyYW0uaWQgfHwKICAgIAkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLndpcmVmcmFtZSAhPT0gKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSApIHsKCiAgICAJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IGdlb21ldHJ5LmlkOwogICAgCQkJX2N1cnJlbnRHZW9tZXRyeVByb2dyYW0ucHJvZ3JhbSA9IHByb2dyYW0uaWQ7CiAgICAJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS53aXJlZnJhbWUgPSBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWU7CiAgICAJCQl1cGRhdGVCdWZmZXJzID0gdHJ1ZTsKCiAgICAJCX0KCiAgICAJCWlmICggb2JqZWN0Lm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyApIHsKCiAgICAJCQltb3JwaHRhcmdldHMudXBkYXRlKCBvYmplY3QsIGdlb21ldHJ5LCBtYXRlcmlhbCwgcHJvZ3JhbSApOwoKICAgIAkJCXVwZGF0ZUJ1ZmZlcnMgPSB0cnVlOwoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCXZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OwogICAgCQl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCQl2YXIgcmFuZ2VGYWN0b3IgPSAxOwoKICAgIAkJaWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7CgogICAgCQkJaW5kZXggPSBnZW9tZXRyaWVzLmdldFdpcmVmcmFtZUF0dHJpYnV0ZSggZ2VvbWV0cnkgKTsKICAgIAkJCXJhbmdlRmFjdG9yID0gMjsKCiAgICAJCX0KCiAgICAJCXZhciBhdHRyaWJ1dGU7CiAgICAJCXZhciByZW5kZXJlciA9IGJ1ZmZlclJlbmRlcmVyOwoKICAgIAkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKCiAgICAJCQlhdHRyaWJ1dGUgPSBhdHRyaWJ1dGVzLmdldCggaW5kZXggKTsKCiAgICAJCQlyZW5kZXJlciA9IGluZGV4ZWRCdWZmZXJSZW5kZXJlcjsKICAgIAkJCXJlbmRlcmVyLnNldEluZGV4KCBhdHRyaWJ1dGUgKTsKCiAgICAJCX0KCiAgICAJCWlmICggdXBkYXRlQnVmZmVycyApIHsKCiAgICAJCQlzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApOwoKICAgIAkJCWlmICggaW5kZXggIT09IG51bGwgKSB7CgogICAgCQkJCV9nbC5iaW5kQnVmZmVyKCAzNDk2MywgYXR0cmlidXRlLmJ1ZmZlciApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vCgogICAgCQl2YXIgZGF0YUNvdW50ID0gSW5maW5pdHk7CgogICAgCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKICAgIAkJCWRhdGFDb3VudCA9IGluZGV4LmNvdW50OwoKICAgIAkJfSBlbHNlIGlmICggcG9zaXRpb24gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlkYXRhQ291bnQgPSBwb3NpdGlvbi5jb3VudDsKCiAgICAJCX0KCiAgICAJCXZhciByYW5nZVN0YXJ0ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLnN0YXJ0ICogcmFuZ2VGYWN0b3I7CiAgICAJCXZhciByYW5nZUNvdW50ID0gZ2VvbWV0cnkuZHJhd1JhbmdlLmNvdW50ICogcmFuZ2VGYWN0b3I7CgogICAgCQl2YXIgZ3JvdXBTdGFydCA9IGdyb3VwICE9PSBudWxsID8gZ3JvdXAuc3RhcnQgKiByYW5nZUZhY3RvciA6IDA7CiAgICAJCXZhciBncm91cENvdW50ID0gZ3JvdXAgIT09IG51bGwgPyBncm91cC5jb3VudCAqIHJhbmdlRmFjdG9yIDogSW5maW5pdHk7CgogICAgCQl2YXIgZHJhd1N0YXJ0ID0gTWF0aC5tYXgoIHJhbmdlU3RhcnQsIGdyb3VwU3RhcnQgKTsKICAgIAkJdmFyIGRyYXdFbmQgPSBNYXRoLm1pbiggZGF0YUNvdW50LCByYW5nZVN0YXJ0ICsgcmFuZ2VDb3VudCwgZ3JvdXBTdGFydCArIGdyb3VwQ291bnQgKSAtIDE7CgogICAgCQl2YXIgZHJhd0NvdW50ID0gTWF0aC5tYXgoIDAsIGRyYXdFbmQgLSBkcmF3U3RhcnQgKyAxICk7CgogICAgCQlpZiAoIGRyYXdDb3VudCA9PT0gMCApIHJldHVybjsKCiAgICAJCS8vCgogICAgCQlpZiAoIG9iamVjdC5pc01lc2ggKSB7CgogICAgCQkJaWYgKCBtYXRlcmlhbC53aXJlZnJhbWUgPT09IHRydWUgKSB7CgogICAgCQkJCXN0YXRlLnNldExpbmVXaWR0aCggbWF0ZXJpYWwud2lyZWZyYW1lTGluZXdpZHRoICogZ2V0VGFyZ2V0UGl4ZWxSYXRpbygpICk7CiAgICAJCQkJcmVuZGVyZXIuc2V0TW9kZSggMSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXN3aXRjaCAoIG9iamVjdC5kcmF3TW9kZSApIHsKCiAgICAJCQkJCWNhc2UgVHJpYW5nbGVzRHJhd01vZGU6CiAgICAJCQkJCQlyZW5kZXJlci5zZXRNb2RlKCA0ICk7CiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgVHJpYW5nbGVTdHJpcERyYXdNb2RlOgogICAgCQkJCQkJcmVuZGVyZXIuc2V0TW9kZSggNSApOwogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlIFRyaWFuZ2xlRmFuRHJhd01vZGU6CiAgICAJCQkJCQlyZW5kZXJlci5zZXRNb2RlKCA2ICk7CiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJfQoKICAgIAkJCX0KCgogICAgCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNMaW5lICkgewoKICAgIAkJCXZhciBsaW5lV2lkdGggPSBtYXRlcmlhbC5saW5ld2lkdGg7CgogICAgCQkJaWYgKCBsaW5lV2lkdGggPT09IHVuZGVmaW5lZCApIGxpbmVXaWR0aCA9IDE7IC8vIE5vdCB1c2luZyBMaW5lKk1hdGVyaWFsCgogICAgCQkJc3RhdGUuc2V0TGluZVdpZHRoKCBsaW5lV2lkdGggKiBnZXRUYXJnZXRQaXhlbFJhdGlvKCkgKTsKCiAgICAJCQlpZiAoIG9iamVjdC5pc0xpbmVTZWdtZW50cyApIHsKCiAgICAJCQkJcmVuZGVyZXIuc2V0TW9kZSggMSApOwoKICAgIAkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc0xpbmVMb29wICkgewoKICAgIAkJCQlyZW5kZXJlci5zZXRNb2RlKCAyICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJcmVuZGVyZXIuc2V0TW9kZSggMyApOwoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSBpZiAoIG9iamVjdC5pc1BvaW50cyApIHsKCiAgICAJCQlyZW5kZXJlci5zZXRNb2RlKCAwICk7CgogICAgCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNTcHJpdGUgKSB7CgogICAgCQkJcmVuZGVyZXIuc2V0TW9kZSggNCApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ICkgewoKICAgIAkJCWlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPiAwICkgewoKICAgIAkJCQlyZW5kZXJlci5yZW5kZXJJbnN0YW5jZXMoIGdlb21ldHJ5LCBkcmF3U3RhcnQsIGRyYXdDb3VudCApOwoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSB7CgogICAgCQkJcmVuZGVyZXIucmVuZGVyKCBkcmF3U3RhcnQsIGRyYXdDb3VudCApOwoKICAgIAkJfQoKICAgIAl9OwoKICAgIAlmdW5jdGlvbiBzZXR1cFZlcnRleEF0dHJpYnV0ZXMoIG1hdGVyaWFsLCBwcm9ncmFtLCBnZW9tZXRyeSApIHsKCiAgICAJCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSAmJiAhIGNhcGFiaWxpdGllcy5pc1dlYkdMMiApIHsKCiAgICAJCQlpZiAoIGV4dGVuc2lvbnMuZ2V0KCAnQU5HTEVfaW5zdGFuY2VkX2FycmF5cycgKSA9PT0gbnVsbCApIHsKCiAgICAJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIuc2V0dXBWZXJ0ZXhBdHRyaWJ1dGVzOiB1c2luZyBUSFJFRS5JbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSBidXQgaGFyZHdhcmUgZG9lcyBub3Qgc3VwcG9ydCBleHRlbnNpb24gQU5HTEVfaW5zdGFuY2VkX2FycmF5cy4nICk7CiAgICAJCQkJcmV0dXJuOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXN0YXRlLmluaXRBdHRyaWJ1dGVzKCk7CgogICAgCQl2YXIgZ2VvbWV0cnlBdHRyaWJ1dGVzID0gZ2VvbWV0cnkuYXR0cmlidXRlczsKCiAgICAJCXZhciBwcm9ncmFtQXR0cmlidXRlcyA9IHByb2dyYW0uZ2V0QXR0cmlidXRlcygpOwoKICAgIAkJdmFyIG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlcyA9IG1hdGVyaWFsLmRlZmF1bHRBdHRyaWJ1dGVWYWx1ZXM7CgogICAgCQlmb3IgKCB2YXIgbmFtZSBpbiBwcm9ncmFtQXR0cmlidXRlcyApIHsKCiAgICAJCQl2YXIgcHJvZ3JhbUF0dHJpYnV0ZSA9IHByb2dyYW1BdHRyaWJ1dGVzWyBuYW1lIF07CgogICAgCQkJaWYgKCBwcm9ncmFtQXR0cmlidXRlID49IDAgKSB7CgogICAgCQkJCXZhciBnZW9tZXRyeUF0dHJpYnV0ZSA9IGdlb21ldHJ5QXR0cmlidXRlc1sgbmFtZSBdOwoKICAgIAkJCQlpZiAoIGdlb21ldHJ5QXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQl2YXIgbm9ybWFsaXplZCA9IGdlb21ldHJ5QXR0cmlidXRlLm5vcm1hbGl6ZWQ7CiAgICAJCQkJCXZhciBzaXplID0gZ2VvbWV0cnlBdHRyaWJ1dGUuaXRlbVNpemU7CgogICAgCQkJCQl2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlcy5nZXQoIGdlb21ldHJ5QXR0cmlidXRlICk7CgogICAgCQkJCQkvLyBUT0RPIEF0dHJpYnV0ZSBtYXkgbm90IGJlIGF2YWlsYWJsZSBvbiBjb250ZXh0IHJlc3RvcmUKCiAgICAJCQkJCWlmICggYXR0cmlidXRlID09PSB1bmRlZmluZWQgKSBjb250aW51ZTsKCiAgICAJCQkJCXZhciBidWZmZXIgPSBhdHRyaWJ1dGUuYnVmZmVyOwogICAgCQkJCQl2YXIgdHlwZSA9IGF0dHJpYnV0ZS50eXBlOwogICAgCQkJCQl2YXIgYnl0ZXNQZXJFbGVtZW50ID0gYXR0cmlidXRlLmJ5dGVzUGVyRWxlbWVudDsKCiAgICAJCQkJCWlmICggZ2VvbWV0cnlBdHRyaWJ1dGUuaXNJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZSApIHsKCiAgICAJCQkJCQl2YXIgZGF0YSA9IGdlb21ldHJ5QXR0cmlidXRlLmRhdGE7CiAgICAJCQkJCQl2YXIgc3RyaWRlID0gZGF0YS5zdHJpZGU7CiAgICAJCQkJCQl2YXIgb2Zmc2V0ID0gZ2VvbWV0cnlBdHRyaWJ1dGUub2Zmc2V0OwoKICAgIAkJCQkJCWlmICggZGF0YSAmJiBkYXRhLmlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIgKSB7CgogICAgCQkJCQkJCXN0YXRlLmVuYWJsZUF0dHJpYnV0ZUFuZERpdmlzb3IoIHByb2dyYW1BdHRyaWJ1dGUsIGRhdGEubWVzaFBlckF0dHJpYnV0ZSApOwoKICAgIAkJCQkJCQlpZiAoIGdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJCQlnZW9tZXRyeS5tYXhJbnN0YW5jZWRDb3VudCA9IGRhdGEubWVzaFBlckF0dHJpYnV0ZSAqIGRhdGEuY291bnQ7CgogICAgCQkJCQkJCX0KCiAgICAJCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGUoIHByb2dyYW1BdHRyaWJ1dGUgKTsKCiAgICAJCQkJCQl9CgogICAgCQkJCQkJX2dsLmJpbmRCdWZmZXIoIDM0OTYyLCBidWZmZXIgKTsKICAgIAkJCQkJCV9nbC52ZXJ0ZXhBdHRyaWJQb2ludGVyKCBwcm9ncmFtQXR0cmlidXRlLCBzaXplLCB0eXBlLCBub3JtYWxpemVkLCBzdHJpZGUgKiBieXRlc1BlckVsZW1lbnQsIG9mZnNldCAqIGJ5dGVzUGVyRWxlbWVudCApOwoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQlpZiAoIGdlb21ldHJ5QXR0cmlidXRlLmlzSW5zdGFuY2VkQnVmZmVyQXR0cmlidXRlICkgewoKICAgIAkJCQkJCQlzdGF0ZS5lbmFibGVBdHRyaWJ1dGVBbmREaXZpc29yKCBwcm9ncmFtQXR0cmlidXRlLCBnZW9tZXRyeUF0dHJpYnV0ZS5tZXNoUGVyQXR0cmlidXRlICk7CgogICAgCQkJCQkJCWlmICggZ2VvbWV0cnkubWF4SW5zdGFuY2VkQ291bnQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCQkJCWdlb21ldHJ5Lm1heEluc3RhbmNlZENvdW50ID0gZ2VvbWV0cnlBdHRyaWJ1dGUubWVzaFBlckF0dHJpYnV0ZSAqIGdlb21ldHJ5QXR0cmlidXRlLmNvdW50OwoKICAgIAkJCQkJCQl9CgogICAgCQkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQkJc3RhdGUuZW5hYmxlQXR0cmlidXRlKCBwcm9ncmFtQXR0cmlidXRlICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJCV9nbC5iaW5kQnVmZmVyKCAzNDk2MiwgYnVmZmVyICk7CiAgICAJCQkJCQlfZ2wudmVydGV4QXR0cmliUG9pbnRlciggcHJvZ3JhbUF0dHJpYnV0ZSwgc2l6ZSwgdHlwZSwgbm9ybWFsaXplZCwgMCwgMCApOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbERlZmF1bHRBdHRyaWJ1dGVWYWx1ZXMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCXZhciB2YWx1ZSA9IG1hdGVyaWFsRGVmYXVsdEF0dHJpYnV0ZVZhbHVlc1sgbmFtZSBdOwoKICAgIAkJCQkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJCXN3aXRjaCAoIHZhbHVlLmxlbmd0aCApIHsKCiAgICAJCQkJCQkJY2FzZSAyOgogICAgCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliMmZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJY2FzZSAzOgogICAgCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliM2Z2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJY2FzZSA0OgogICAgCQkJCQkJCQlfZ2wudmVydGV4QXR0cmliNGZ2KCBwcm9ncmFtQXR0cmlidXRlLCB2YWx1ZSApOwogICAgCQkJCQkJCQlicmVhazsKCiAgICAJCQkJCQkJZGVmYXVsdDoKICAgIAkJCQkJCQkJX2dsLnZlcnRleEF0dHJpYjFmdiggcHJvZ3JhbUF0dHJpYnV0ZSwgdmFsdWUgKTsKCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlzdGF0ZS5kaXNhYmxlVW51c2VkQXR0cmlidXRlcygpOwoKICAgIAl9CgogICAgCS8vIENvbXBpbGUKCiAgICAJdGhpcy5jb21waWxlID0gZnVuY3Rpb24gKCBzY2VuZSwgY2FtZXJhICkgewoKICAgIAkJY3VycmVudFJlbmRlclN0YXRlID0gcmVuZGVyU3RhdGVzLmdldCggc2NlbmUsIGNhbWVyYSApOwogICAgCQljdXJyZW50UmVuZGVyU3RhdGUuaW5pdCgpOwoKICAgIAkJc2NlbmUudHJhdmVyc2UoIGZ1bmN0aW9uICggb2JqZWN0ICkgewoKICAgIAkJCWlmICggb2JqZWN0LmlzTGlnaHQgKSB7CgogICAgCQkJCWN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoTGlnaHQoIG9iamVjdCApOwoKICAgIAkJCQlpZiAoIG9iamVjdC5jYXN0U2hhZG93ICkgewoKICAgIAkJCQkJY3VycmVudFJlbmRlclN0YXRlLnB1c2hTaGFkb3coIG9iamVjdCApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfSApOwoKICAgIAkJY3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCBjYW1lcmEgKTsKCiAgICAJCXNjZW5lLnRyYXZlcnNlKCBmdW5jdGlvbiAoIG9iamVjdCApIHsKCiAgICAJCQlpZiAoIG9iamVjdC5tYXRlcmlhbCApIHsKCiAgICAJCQkJaWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3QubWF0ZXJpYWwgKSApIHsKCiAgICAJCQkJCWZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5tYXRlcmlhbC5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCQkJaW5pdE1hdGVyaWFsKCBvYmplY3QubWF0ZXJpYWxbIGkgXSwgc2NlbmUuZm9nLCBvYmplY3QgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCWluaXRNYXRlcmlhbCggb2JqZWN0Lm1hdGVyaWFsLCBzY2VuZS5mb2csIG9iamVjdCApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfSApOwoKICAgIAl9OwoKICAgIAkvLyBBbmltYXRpb24gTG9vcAoKICAgIAl2YXIgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrID0gbnVsbDsKCiAgICAJZnVuY3Rpb24gb25BbmltYXRpb25GcmFtZSggdGltZSApIHsKCiAgICAJCWlmICggdnIuaXNQcmVzZW50aW5nKCkgKSByZXR1cm47CiAgICAJCWlmICggb25BbmltYXRpb25GcmFtZUNhbGxiYWNrICkgb25BbmltYXRpb25GcmFtZUNhbGxiYWNrKCB0aW1lICk7CgogICAgCX0KCiAgICAJdmFyIGFuaW1hdGlvbiA9IG5ldyBXZWJHTEFuaW1hdGlvbigpOwogICAgCWFuaW1hdGlvbi5zZXRBbmltYXRpb25Mb29wKCBvbkFuaW1hdGlvbkZyYW1lICk7CgogICAgCWlmICggdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgKSBhbmltYXRpb24uc2V0Q29udGV4dCggd2luZG93ICk7CgogICAgCXRoaXMuc2V0QW5pbWF0aW9uTG9vcCA9IGZ1bmN0aW9uICggY2FsbGJhY2sgKSB7CgogICAgCQlvbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2sgPSBjYWxsYmFjazsKICAgIAkJdnIuc2V0QW5pbWF0aW9uTG9vcCggY2FsbGJhY2sgKTsKCiAgICAJCWFuaW1hdGlvbi5zdGFydCgpOwoKICAgIAl9OwoKICAgIAkvLyBSZW5kZXJpbmcKCiAgICAJdGhpcy5yZW5kZXIgPSBmdW5jdGlvbiAoIHNjZW5lLCBjYW1lcmEgKSB7CgogICAgCQl2YXIgcmVuZGVyVGFyZ2V0LCBmb3JjZUNsZWFyOwoKICAgIAkJaWYgKCBhcmd1bWVudHNbIDIgXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSByZW5kZXJUYXJnZXQgYXJndW1lbnQgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5zZXRSZW5kZXJUYXJnZXQoKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJlbmRlclRhcmdldCA9IGFyZ3VtZW50c1sgMiBdOwoKICAgIAkJfQoKICAgIAkJaWYgKCBhcmd1bWVudHNbIDMgXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVuZGVyKCk6IHRoZSBmb3JjZUNsZWFyIGFyZ3VtZW50IGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuY2xlYXIoKSBpbnN0ZWFkLicgKTsKICAgIAkJCWZvcmNlQ2xlYXIgPSBhcmd1bWVudHNbIDMgXTsKCiAgICAJCX0KCiAgICAJCWlmICggISAoIGNhbWVyYSAmJiBjYW1lcmEuaXNDYW1lcmEgKSApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuV2ViR0xSZW5kZXJlci5yZW5kZXI6IGNhbWVyYSBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuQ2FtZXJhLicgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCWlmICggX2lzQ29udGV4dExvc3QgKSByZXR1cm47CgogICAgCQkvLyByZXNldCBjYWNoaW5nIGZvciB0aGlzIGZyYW1lCgogICAgCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IG51bGw7CiAgICAJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLnByb2dyYW0gPSBudWxsOwogICAgCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS53aXJlZnJhbWUgPSBmYWxzZTsKICAgIAkJX2N1cnJlbnRNYXRlcmlhbElkID0gLSAxOwogICAgCQlfY3VycmVudENhbWVyYSA9IG51bGw7CgogICAgCQkvLyB1cGRhdGUgc2NlbmUgZ3JhcGgKCiAgICAJCWlmICggc2NlbmUuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHNjZW5lLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgogICAgCQkvLyB1cGRhdGUgY2FtZXJhIG1hdHJpY2VzIGFuZCBmcnVzdHVtCgogICAgCQlpZiAoIGNhbWVyYS5wYXJlbnQgPT09IG51bGwgKSBjYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTsKCiAgICAJCWlmICggdnIuZW5hYmxlZCApIHsKCiAgICAJCQljYW1lcmEgPSB2ci5nZXRDYW1lcmEoIGNhbWVyYSApOwoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCWN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBjYW1lcmEgKTsKICAgIAkJY3VycmVudFJlbmRlclN0YXRlLmluaXQoKTsKCiAgICAJCXNjZW5lLm9uQmVmb3JlUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSwgcmVuZGVyVGFyZ2V0IHx8IF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7CgogICAgCQlfcHJvalNjcmVlbk1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEucHJvamVjdGlvbk1hdHJpeCwgY2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOwogICAgCQlfZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBfcHJvalNjcmVlbk1hdHJpeCApOwoKICAgIAkJX2xvY2FsQ2xpcHBpbmdFbmFibGVkID0gdGhpcy5sb2NhbENsaXBwaW5nRW5hYmxlZDsKICAgIAkJX2NsaXBwaW5nRW5hYmxlZCA9IF9jbGlwcGluZy5pbml0KCB0aGlzLmNsaXBwaW5nUGxhbmVzLCBfbG9jYWxDbGlwcGluZ0VuYWJsZWQsIGNhbWVyYSApOwoKICAgIAkJY3VycmVudFJlbmRlckxpc3QgPSByZW5kZXJMaXN0cy5nZXQoIHNjZW5lLCBjYW1lcmEgKTsKICAgIAkJY3VycmVudFJlbmRlckxpc3QuaW5pdCgpOwoKICAgIAkJcHJvamVjdE9iamVjdCggc2NlbmUsIGNhbWVyYSwgMCwgX3RoaXMuc29ydE9iamVjdHMgKTsKCiAgICAJCWlmICggX3RoaXMuc29ydE9iamVjdHMgPT09IHRydWUgKSB7CgogICAgCQkJY3VycmVudFJlbmRlckxpc3Quc29ydCgpOwoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCWlmICggX2NsaXBwaW5nRW5hYmxlZCApIF9jbGlwcGluZy5iZWdpblNoYWRvd3MoKTsKCiAgICAJCXZhciBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5OwoKICAgIAkJc2hhZG93TWFwLnJlbmRlciggc2hhZG93c0FycmF5LCBzY2VuZSwgY2FtZXJhICk7CgogICAgCQljdXJyZW50UmVuZGVyU3RhdGUuc2V0dXBMaWdodHMoIGNhbWVyYSApOwoKICAgIAkJaWYgKCBfY2xpcHBpbmdFbmFibGVkICkgX2NsaXBwaW5nLmVuZFNoYWRvd3MoKTsKCiAgICAJCS8vCgogICAgCQlpZiAoIHRoaXMuaW5mby5hdXRvUmVzZXQgKSB0aGlzLmluZm8ucmVzZXQoKTsKCiAgICAJCWlmICggcmVuZGVyVGFyZ2V0ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJdGhpcy5zZXRSZW5kZXJUYXJnZXQoIHJlbmRlclRhcmdldCApOwoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCWJhY2tncm91bmQucmVuZGVyKCBjdXJyZW50UmVuZGVyTGlzdCwgc2NlbmUsIGNhbWVyYSwgZm9yY2VDbGVhciApOwoKICAgIAkJLy8gcmVuZGVyIHNjZW5lCgogICAgCQl2YXIgb3BhcXVlT2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0Lm9wYXF1ZTsKICAgIAkJdmFyIHRyYW5zcGFyZW50T2JqZWN0cyA9IGN1cnJlbnRSZW5kZXJMaXN0LnRyYW5zcGFyZW50OwoKICAgIAkJaWYgKCBzY2VuZS5vdmVycmlkZU1hdGVyaWFsICkgewoKICAgIAkJCXZhciBvdmVycmlkZU1hdGVyaWFsID0gc2NlbmUub3ZlcnJpZGVNYXRlcmlhbDsKCiAgICAJCQlpZiAoIG9wYXF1ZU9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggb3BhcXVlT2JqZWN0cywgc2NlbmUsIGNhbWVyYSwgb3ZlcnJpZGVNYXRlcmlhbCApOwogICAgCQkJaWYgKCB0cmFuc3BhcmVudE9iamVjdHMubGVuZ3RoICkgcmVuZGVyT2JqZWN0cyggdHJhbnNwYXJlbnRPYmplY3RzLCBzY2VuZSwgY2FtZXJhLCBvdmVycmlkZU1hdGVyaWFsICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIG9wYXF1ZSBwYXNzIChmcm9udC10by1iYWNrIG9yZGVyKQoKICAgIAkJCWlmICggb3BhcXVlT2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCBvcGFxdWVPYmplY3RzLCBzY2VuZSwgY2FtZXJhICk7CgogICAgCQkJLy8gdHJhbnNwYXJlbnQgcGFzcyAoYmFjay10by1mcm9udCBvcmRlcikKCiAgICAJCQlpZiAoIHRyYW5zcGFyZW50T2JqZWN0cy5sZW5ndGggKSByZW5kZXJPYmplY3RzKCB0cmFuc3BhcmVudE9iamVjdHMsIHNjZW5lLCBjYW1lcmEgKTsKCiAgICAJCX0KCiAgICAJCS8vCgogICAgCQlzY2VuZS5vbkFmdGVyUmVuZGVyKCBfdGhpcywgc2NlbmUsIGNhbWVyYSApOwoKICAgIAkJLy8KCiAgICAJCWlmICggX2N1cnJlbnRSZW5kZXJUYXJnZXQgIT09IG51bGwgKSB7CgogICAgCQkJLy8gR2VuZXJhdGUgbWlwbWFwIGlmIHdlJ3JlIHVzaW5nIGFueSBraW5kIG9mIG1pcG1hcCBmaWx0ZXJpbmcKCiAgICAJCQl0ZXh0dXJlcy51cGRhdGVSZW5kZXJUYXJnZXRNaXBtYXAoIF9jdXJyZW50UmVuZGVyVGFyZ2V0ICk7CgogICAgCQkJLy8gcmVzb2x2ZSBtdWx0aXNhbXBsZSByZW5kZXJidWZmZXJzIHRvIGEgc2luZ2xlLXNhbXBsZSB0ZXh0dXJlIGlmIG5lY2Vzc2FyeQoKICAgIAkJCXRleHR1cmVzLnVwZGF0ZU11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0KCBfY3VycmVudFJlbmRlclRhcmdldCApOwoKICAgIAkJfQoKICAgIAkJLy8gRW5zdXJlIGRlcHRoIGJ1ZmZlciB3cml0aW5nIGlzIGVuYWJsZWQgc28gaXQgY2FuIGJlIGNsZWFyZWQgb24gbmV4dCByZW5kZXIKCiAgICAJCXN0YXRlLmJ1ZmZlcnMuZGVwdGguc2V0VGVzdCggdHJ1ZSApOwogICAgCQlzdGF0ZS5idWZmZXJzLmRlcHRoLnNldE1hc2soIHRydWUgKTsKICAgIAkJc3RhdGUuYnVmZmVycy5jb2xvci5zZXRNYXNrKCB0cnVlICk7CgogICAgCQlzdGF0ZS5zZXRQb2x5Z29uT2Zmc2V0KCBmYWxzZSApOwoKICAgIAkJaWYgKCB2ci5lbmFibGVkICkgewoKICAgIAkJCXZyLnN1Ym1pdEZyYW1lKCk7CgogICAgCQl9CgogICAgCQkvLyBfZ2wuZmluaXNoKCk7CgogICAgCQljdXJyZW50UmVuZGVyTGlzdCA9IG51bGw7CiAgICAJCWN1cnJlbnRSZW5kZXJTdGF0ZSA9IG51bGw7CgogICAgCX07CgogICAgCWZ1bmN0aW9uIHByb2plY3RPYmplY3QoIG9iamVjdCwgY2FtZXJhLCBncm91cE9yZGVyLCBzb3J0T2JqZWN0cyApIHsKCiAgICAJCWlmICggb2JqZWN0LnZpc2libGUgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJdmFyIHZpc2libGUgPSBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYS5sYXllcnMgKTsKCiAgICAJCWlmICggdmlzaWJsZSApIHsKCiAgICAJCQlpZiAoIG9iamVjdC5pc0dyb3VwICkgewoKICAgIAkJCQlncm91cE9yZGVyID0gb2JqZWN0LnJlbmRlck9yZGVyOwoKICAgIAkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc0xPRCApIHsKCiAgICAJCQkJaWYgKCBvYmplY3QuYXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIG9iamVjdC51cGRhdGUoIGNhbWVyYSApOwoKICAgIAkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc0xpZ2h0ICkgewoKICAgIAkJCQljdXJyZW50UmVuZGVyU3RhdGUucHVzaExpZ2h0KCBvYmplY3QgKTsKCiAgICAJCQkJaWYgKCBvYmplY3QuY2FzdFNoYWRvdyApIHsKCiAgICAJCQkJCWN1cnJlbnRSZW5kZXJTdGF0ZS5wdXNoU2hhZG93KCBvYmplY3QgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSBpZiAoIG9iamVjdC5pc1Nwcml0ZSApIHsKCiAgICAJCQkJaWYgKCAhIG9iamVjdC5mcnVzdHVtQ3VsbGVkIHx8IF9mcnVzdHVtLmludGVyc2VjdHNTcHJpdGUoIG9iamVjdCApICkgewoKICAgIAkJCQkJaWYgKCBzb3J0T2JqZWN0cyApIHsKCiAgICAJCQkJCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApCiAgICAJCQkJCQkJLmFwcGx5TWF0cml4NCggX3Byb2pTY3JlZW5NYXRyaXggKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCXZhciBnZW9tZXRyeSA9IG9iamVjdHMudXBkYXRlKCBvYmplY3QgKTsKICAgIAkJCQkJdmFyIG1hdGVyaWFsID0gb2JqZWN0Lm1hdGVyaWFsOwoKICAgIAkJCQkJaWYgKCBtYXRlcmlhbC52aXNpYmxlICkgewoKICAgIAkJCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgZ2VvbWV0cnksIG1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yMy56LCBudWxsICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9IGVsc2UgaWYgKCBvYmplY3QuaXNJbW1lZGlhdGVSZW5kZXJPYmplY3QgKSB7CgogICAgCQkJCWlmICggc29ydE9iamVjdHMgKSB7CgogICAgCQkJCQlfdmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG9iamVjdC5tYXRyaXhXb3JsZCApCiAgICAJCQkJCQkuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApOwoKICAgIAkJCQl9CgogICAgCQkJCWN1cnJlbnRSZW5kZXJMaXN0LnB1c2goIG9iamVjdCwgbnVsbCwgb2JqZWN0Lm1hdGVyaWFsLCBncm91cE9yZGVyLCBfdmVjdG9yMy56LCBudWxsICk7CgogICAgCQkJfSBlbHNlIGlmICggb2JqZWN0LmlzTWVzaCB8fCBvYmplY3QuaXNMaW5lIHx8IG9iamVjdC5pc1BvaW50cyApIHsKCiAgICAJCQkJaWYgKCBvYmplY3QuaXNTa2lubmVkTWVzaCApIHsKCiAgICAJCQkJCW9iamVjdC5za2VsZXRvbi51cGRhdGUoKTsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoICEgb2JqZWN0LmZydXN0dW1DdWxsZWQgfHwgX2ZydXN0dW0uaW50ZXJzZWN0c09iamVjdCggb2JqZWN0ICkgKSB7CgogICAgCQkJCQlpZiAoIHNvcnRPYmplY3RzICkgewoKICAgIAkJCQkJCV92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggb2JqZWN0Lm1hdHJpeFdvcmxkICkKICAgIAkJCQkJCQkuYXBwbHlNYXRyaXg0KCBfcHJvalNjcmVlbk1hdHJpeCApOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJdmFyIGdlb21ldHJ5ID0gb2JqZWN0cy51cGRhdGUoIG9iamVjdCApOwogICAgCQkJCQl2YXIgbWF0ZXJpYWwgPSBvYmplY3QubWF0ZXJpYWw7CgogICAgCQkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG1hdGVyaWFsICkgKSB7CgogICAgCQkJCQkJdmFyIGdyb3VwcyA9IGdlb21ldHJ5Lmdyb3VwczsKCiAgICAJCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBncm91cHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJCQkJdmFyIGdyb3VwID0gZ3JvdXBzWyBpIF07CiAgICAJCQkJCQkJdmFyIGdyb3VwTWF0ZXJpYWwgPSBtYXRlcmlhbFsgZ3JvdXAubWF0ZXJpYWxJbmRleCBdOwoKICAgIAkJCQkJCQlpZiAoIGdyb3VwTWF0ZXJpYWwgJiYgZ3JvdXBNYXRlcmlhbC52aXNpYmxlICkgewoKICAgIAkJCQkJCQkJY3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgZ3JvdXBNYXRlcmlhbCwgZ3JvdXBPcmRlciwgX3ZlY3RvcjMueiwgZ3JvdXAgKTsKCiAgICAJCQkJCQkJfQoKICAgIAkJCQkJCX0KCiAgICAJCQkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLnZpc2libGUgKSB7CgogICAgCQkJCQkJY3VycmVudFJlbmRlckxpc3QucHVzaCggb2JqZWN0LCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwT3JkZXIsIF92ZWN0b3IzLnosIG51bGwgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJcHJvamVjdE9iamVjdCggY2hpbGRyZW5bIGkgXSwgY2FtZXJhLCBncm91cE9yZGVyLCBzb3J0T2JqZWN0cyApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlbmRlck9iamVjdHMoIHJlbmRlckxpc3QsIHNjZW5lLCBjYW1lcmEsIG92ZXJyaWRlTWF0ZXJpYWwgKSB7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSByZW5kZXJMaXN0Lmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIHJlbmRlckl0ZW0gPSByZW5kZXJMaXN0WyBpIF07CgogICAgCQkJdmFyIG9iamVjdCA9IHJlbmRlckl0ZW0ub2JqZWN0OwogICAgCQkJdmFyIGdlb21ldHJ5ID0gcmVuZGVySXRlbS5nZW9tZXRyeTsKICAgIAkJCXZhciBtYXRlcmlhbCA9IG92ZXJyaWRlTWF0ZXJpYWwgPT09IHVuZGVmaW5lZCA/IHJlbmRlckl0ZW0ubWF0ZXJpYWwgOiBvdmVycmlkZU1hdGVyaWFsOwogICAgCQkJdmFyIGdyb3VwID0gcmVuZGVySXRlbS5ncm91cDsKCiAgICAJCQlpZiAoIGNhbWVyYS5pc0FycmF5Q2FtZXJhICkgewoKICAgIAkJCQlfY3VycmVudEFycmF5Q2FtZXJhID0gY2FtZXJhOwoKICAgIAkJCQl2YXIgY2FtZXJhcyA9IGNhbWVyYS5jYW1lcmFzOwoKICAgIAkJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gY2FtZXJhcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJCXZhciBjYW1lcmEyID0gY2FtZXJhc1sgaiBdOwoKICAgIAkJCQkJaWYgKCBvYmplY3QubGF5ZXJzLnRlc3QoIGNhbWVyYTIubGF5ZXJzICkgKSB7CgogICAgCQkJCQkJc3RhdGUudmlld3BvcnQoIF9jdXJyZW50Vmlld3BvcnQuY29weSggY2FtZXJhMi52aWV3cG9ydCApICk7CgogICAgCQkJCQkJY3VycmVudFJlbmRlclN0YXRlLnNldHVwTGlnaHRzKCBjYW1lcmEyICk7CgogICAgCQkJCQkJcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEyLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlfY3VycmVudEFycmF5Q2FtZXJhID0gbnVsbDsKCiAgICAJCQkJcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcmVuZGVyT2JqZWN0KCBvYmplY3QsIHNjZW5lLCBjYW1lcmEsIGdlb21ldHJ5LCBtYXRlcmlhbCwgZ3JvdXAgKSB7CgogICAgCQlvYmplY3Qub25CZWZvcmVSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7CiAgICAJCWN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBfY3VycmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApOwoKICAgIAkJb2JqZWN0Lm1vZGVsVmlld01hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlLCBvYmplY3QubWF0cml4V29ybGQgKTsKICAgIAkJb2JqZWN0Lm5vcm1hbE1hdHJpeC5nZXROb3JtYWxNYXRyaXgoIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTsKCiAgICAJCWlmICggb2JqZWN0LmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ICkgewoKICAgIAkJCXN0YXRlLnNldE1hdGVyaWFsKCBtYXRlcmlhbCApOwoKICAgIAkJCXZhciBwcm9ncmFtID0gc2V0UHJvZ3JhbSggY2FtZXJhLCBzY2VuZS5mb2csIG1hdGVyaWFsLCBvYmplY3QgKTsKCiAgICAJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5nZW9tZXRyeSA9IG51bGw7CiAgICAJCQlfY3VycmVudEdlb21ldHJ5UHJvZ3JhbS5wcm9ncmFtID0gbnVsbDsKICAgIAkJCV9jdXJyZW50R2VvbWV0cnlQcm9ncmFtLndpcmVmcmFtZSA9IGZhbHNlOwoKICAgIAkJCXJlbmRlck9iamVjdEltbWVkaWF0ZSggb2JqZWN0LCBwcm9ncmFtICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCV90aGlzLnJlbmRlckJ1ZmZlckRpcmVjdCggY2FtZXJhLCBzY2VuZS5mb2csIGdlb21ldHJ5LCBtYXRlcmlhbCwgb2JqZWN0LCBncm91cCApOwoKICAgIAkJfQoKICAgIAkJb2JqZWN0Lm9uQWZ0ZXJSZW5kZXIoIF90aGlzLCBzY2VuZSwgY2FtZXJhLCBnZW9tZXRyeSwgbWF0ZXJpYWwsIGdyb3VwICk7CiAgICAJCWN1cnJlbnRSZW5kZXJTdGF0ZSA9IHJlbmRlclN0YXRlcy5nZXQoIHNjZW5lLCBfY3VycmVudEFycmF5Q2FtZXJhIHx8IGNhbWVyYSApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGluaXRNYXRlcmlhbCggbWF0ZXJpYWwsIGZvZywgb2JqZWN0ICkgewoKICAgIAkJdmFyIG1hdGVyaWFsUHJvcGVydGllcyA9IHByb3BlcnRpZXMuZ2V0KCBtYXRlcmlhbCApOwoKICAgIAkJdmFyIGxpZ2h0cyA9IGN1cnJlbnRSZW5kZXJTdGF0ZS5zdGF0ZS5saWdodHM7CiAgICAJCXZhciBzaGFkb3dzQXJyYXkgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUuc2hhZG93c0FycmF5OwoKICAgIAkJdmFyIGxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0cy5zdGF0ZS52ZXJzaW9uOwoKICAgIAkJdmFyIHBhcmFtZXRlcnMgPSBwcm9ncmFtQ2FjaGUuZ2V0UGFyYW1ldGVycygKICAgIAkJCW1hdGVyaWFsLCBsaWdodHMuc3RhdGUsIHNoYWRvd3NBcnJheSwgZm9nLCBfY2xpcHBpbmcubnVtUGxhbmVzLCBfY2xpcHBpbmcubnVtSW50ZXJzZWN0aW9uLCBvYmplY3QgKTsKCiAgICAJCXZhciBjb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApOwoKICAgIAkJdmFyIHByb2dyYW0gPSBtYXRlcmlhbFByb3BlcnRpZXMucHJvZ3JhbTsKICAgIAkJdmFyIHByb2dyYW1DaGFuZ2UgPSB0cnVlOwoKICAgIAkJaWYgKCBwcm9ncmFtID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gbmV3IG1hdGVyaWFsCiAgICAJCQltYXRlcmlhbC5hZGRFdmVudExpc3RlbmVyKCAnZGlzcG9zZScsIG9uTWF0ZXJpYWxEaXNwb3NlICk7CgogICAgCQl9IGVsc2UgaWYgKCBwcm9ncmFtLmNvZGUgIT09IGNvZGUgKSB7CgogICAgCQkJLy8gY2hhbmdlZCBnbHNsIG9yIHBhcmFtZXRlcnMKICAgIAkJCXJlbGVhc2VNYXRlcmlhbFByb2dyYW1SZWZlcmVuY2UoIG1hdGVyaWFsICk7CgogICAgCQl9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubGlnaHRzU3RhdGVWZXJzaW9uICE9PSBsaWdodHNTdGF0ZVZlcnNpb24gKSB7CgogICAgCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0c1N0YXRlVmVyc2lvbjsKCiAgICAJCQlwcm9ncmFtQ2hhbmdlID0gZmFsc2U7CgogICAgCQl9IGVsc2UgaWYgKCBwYXJhbWV0ZXJzLnNoYWRlcklEICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gc2FtZSBnbHNsIGFuZCB1bmlmb3JtIGxpc3QKICAgIAkJCXJldHVybjsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJLy8gb25seSByZWJ1aWxkIHVuaWZvcm0gbGlzdAogICAgCQkJcHJvZ3JhbUNoYW5nZSA9IGZhbHNlOwoKICAgIAkJfQoKICAgIAkJaWYgKCBwcm9ncmFtQ2hhbmdlICkgewoKICAgIAkJCWlmICggcGFyYW1ldGVycy5zaGFkZXJJRCApIHsKCiAgICAJCQkJdmFyIHNoYWRlciA9IFNoYWRlckxpYlsgcGFyYW1ldGVycy5zaGFkZXJJRCBdOwoKICAgIAkJCQltYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyID0gewogICAgCQkJCQluYW1lOiBtYXRlcmlhbC50eXBlLAogICAgCQkJCQl1bmlmb3JtczogY2xvbmVVbmlmb3Jtcyggc2hhZGVyLnVuaWZvcm1zICksCiAgICAJCQkJCXZlcnRleFNoYWRlcjogc2hhZGVyLnZlcnRleFNoYWRlciwKICAgIAkJCQkJZnJhZ21lbnRTaGFkZXI6IHNoYWRlci5mcmFnbWVudFNoYWRlcgogICAgCQkJCX07CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlciA9IHsKICAgIAkJCQkJbmFtZTogbWF0ZXJpYWwudHlwZSwKICAgIAkJCQkJdW5pZm9ybXM6IG1hdGVyaWFsLnVuaWZvcm1zLAogICAgCQkJCQl2ZXJ0ZXhTaGFkZXI6IG1hdGVyaWFsLnZlcnRleFNoYWRlciwKICAgIAkJCQkJZnJhZ21lbnRTaGFkZXI6IG1hdGVyaWFsLmZyYWdtZW50U2hhZGVyCiAgICAJCQkJfTsKCiAgICAJCQl9CgogICAgCQkJbWF0ZXJpYWwub25CZWZvcmVDb21waWxlKCBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLCBfdGhpcyApOwoKICAgIAkJCS8vIENvbXB1dGluZyBjb2RlIGFnYWluIGFzIG9uQmVmb3JlQ29tcGlsZSBtYXkgaGF2ZSBjaGFuZ2VkIHRoZSBzaGFkZXJzCiAgICAJCQljb2RlID0gcHJvZ3JhbUNhY2hlLmdldFByb2dyYW1Db2RlKCBtYXRlcmlhbCwgcGFyYW1ldGVycyApOwoKICAgIAkJCXByb2dyYW0gPSBwcm9ncmFtQ2FjaGUuYWNxdWlyZVByb2dyYW0oIG1hdGVyaWFsLCBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLCBwYXJhbWV0ZXJzLCBjb2RlICk7CgogICAgCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPSBwcm9ncmFtOwogICAgCQkJbWF0ZXJpYWwucHJvZ3JhbSA9IHByb2dyYW07CgogICAgCQl9CgogICAgCQl2YXIgcHJvZ3JhbUF0dHJpYnV0ZXMgPSBwcm9ncmFtLmdldEF0dHJpYnV0ZXMoKTsKCiAgICAJCWlmICggbWF0ZXJpYWwubW9ycGhUYXJnZXRzICkgewoKICAgIAkJCW1hdGVyaWFsLm51bVN1cHBvcnRlZE1vcnBoVGFyZ2V0cyA9IDA7CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgX3RoaXMubWF4TW9ycGhUYXJnZXRzOyBpICsrICkgewoKICAgIAkJCQlpZiAoIHByb2dyYW1BdHRyaWJ1dGVzWyAnbW9ycGhUYXJnZXQnICsgaSBdID49IDAgKSB7CgogICAgCQkJCQltYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaFRhcmdldHMgKys7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLm1vcnBoTm9ybWFscyApIHsKCiAgICAJCQltYXRlcmlhbC5udW1TdXBwb3J0ZWRNb3JwaE5vcm1hbHMgPSAwOwoKICAgIAkJCWZvciAoIHZhciBpID0gMDsgaSA8IF90aGlzLm1heE1vcnBoTm9ybWFsczsgaSArKyApIHsKCiAgICAJCQkJaWYgKCBwcm9ncmFtQXR0cmlidXRlc1sgJ21vcnBoTm9ybWFsJyArIGkgXSA+PSAwICkgewoKICAgIAkJCQkJbWF0ZXJpYWwubnVtU3VwcG9ydGVkTW9ycGhOb3JtYWxzICsrOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJdmFyIHVuaWZvcm1zID0gbWF0ZXJpYWxQcm9wZXJ0aWVzLnNoYWRlci51bmlmb3JtczsKCiAgICAJCWlmICggISBtYXRlcmlhbC5pc1NoYWRlck1hdGVyaWFsICYmCiAgICAJCQkhIG1hdGVyaWFsLmlzUmF3U2hhZGVyTWF0ZXJpYWwgfHwKICAgIAkJCW1hdGVyaWFsLmNsaXBwaW5nID09PSB0cnVlICkgewoKICAgIAkJCW1hdGVyaWFsUHJvcGVydGllcy5udW1DbGlwcGluZ1BsYW5lcyA9IF9jbGlwcGluZy5udW1QbGFuZXM7CiAgICAJCQltYXRlcmlhbFByb3BlcnRpZXMubnVtSW50ZXJzZWN0aW9uID0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbjsKICAgIAkJCXVuaWZvcm1zLmNsaXBwaW5nUGxhbmVzID0gX2NsaXBwaW5nLnVuaWZvcm07CgogICAgCQl9CgogICAgCQltYXRlcmlhbFByb3BlcnRpZXMuZm9nID0gZm9nOwoKICAgIAkJLy8gc3RvcmUgdGhlIGxpZ2h0IHNldHVwIGl0IHdhcyBjcmVhdGVkIGZvcgoKICAgIAkJbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiA9IGxpZ2h0c1N0YXRlVmVyc2lvbjsKCiAgICAJCWlmICggbWF0ZXJpYWwubGlnaHRzICkgewoKICAgIAkJCS8vIHdpcmUgdXAgdGhlIG1hdGVyaWFsIHRvIHRoaXMgcmVuZGVyZXIncyBsaWdodGluZyBzdGF0ZQoKICAgIAkJCXVuaWZvcm1zLmFtYmllbnRMaWdodENvbG9yLnZhbHVlID0gbGlnaHRzLnN0YXRlLmFtYmllbnQ7CiAgICAJCQl1bmlmb3Jtcy5saWdodFByb2JlLnZhbHVlID0gbGlnaHRzLnN0YXRlLnByb2JlOwogICAgCQkJdW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWw7CiAgICAJCQl1bmlmb3Jtcy5zcG90TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3Q7CiAgICAJCQl1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5yZWN0QXJlYTsKICAgIAkJCXVuaWZvcm1zLnBvaW50TGlnaHRzLnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50OwogICAgCQkJdW5pZm9ybXMuaGVtaXNwaGVyZUxpZ2h0cy52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5oZW1pOwoKICAgIAkJCXVuaWZvcm1zLmRpcmVjdGlvbmFsU2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLmRpcmVjdGlvbmFsU2hhZG93TWFwOwogICAgCQkJdW5pZm9ybXMuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXgudmFsdWUgPSBsaWdodHMuc3RhdGUuZGlyZWN0aW9uYWxTaGFkb3dNYXRyaXg7CiAgICAJCQl1bmlmb3Jtcy5zcG90U2hhZG93TWFwLnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXA7CiAgICAJCQl1bmlmb3Jtcy5zcG90U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnNwb3RTaGFkb3dNYXRyaXg7CiAgICAJCQl1bmlmb3Jtcy5wb2ludFNoYWRvd01hcC52YWx1ZSA9IGxpZ2h0cy5zdGF0ZS5wb2ludFNoYWRvd01hcDsKICAgIAkJCXVuaWZvcm1zLnBvaW50U2hhZG93TWF0cml4LnZhbHVlID0gbGlnaHRzLnN0YXRlLnBvaW50U2hhZG93TWF0cml4OwogICAgCQkJLy8gVE9ETyAoYWJlbG5hdGlvbik6IGFkZCBhcmVhIGxpZ2h0cyBzaGFkb3cgaW5mbyB0byB1bmlmb3JtcwoKICAgIAkJfQoKICAgIAkJdmFyIHByb2dVbmlmb3JtcyA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLmdldFVuaWZvcm1zKCksCiAgICAJCQl1bmlmb3Jtc0xpc3QgPQogICAgCQkJCVdlYkdMVW5pZm9ybXMuc2VxV2l0aFZhbHVlKCBwcm9nVW5pZm9ybXMuc2VxLCB1bmlmb3JtcyApOwoKICAgIAkJbWF0ZXJpYWxQcm9wZXJ0aWVzLnVuaWZvcm1zTGlzdCA9IHVuaWZvcm1zTGlzdDsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBzZXRQcm9ncmFtKCBjYW1lcmEsIGZvZywgbWF0ZXJpYWwsIG9iamVjdCApIHsKCiAgICAJCXRleHR1cmVzLnJlc2V0VGV4dHVyZVVuaXRzKCk7CgogICAgCQl2YXIgbWF0ZXJpYWxQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsICk7CiAgICAJCXZhciBsaWdodHMgPSBjdXJyZW50UmVuZGVyU3RhdGUuc3RhdGUubGlnaHRzOwoKICAgIAkJaWYgKCBfY2xpcHBpbmdFbmFibGVkICkgewoKICAgIAkJCWlmICggX2xvY2FsQ2xpcHBpbmdFbmFibGVkIHx8IGNhbWVyYSAhPT0gX2N1cnJlbnRDYW1lcmEgKSB7CgogICAgCQkJCXZhciB1c2VDYWNoZSA9CiAgICAJCQkJCWNhbWVyYSA9PT0gX2N1cnJlbnRDYW1lcmEgJiYKICAgIAkJCQkJbWF0ZXJpYWwuaWQgPT09IF9jdXJyZW50TWF0ZXJpYWxJZDsKCiAgICAJCQkJLy8gd2UgbWlnaHQgd2FudCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gd2l0aCBzb21lIENsaXBwaW5nR3JvdXAKICAgIAkJCQkvLyBvYmplY3QgaW5zdGVhZCBvZiB0aGUgbWF0ZXJpYWwsIG9uY2UgaXQgYmVjb21lcyBmZWFzaWJsZQogICAgCQkJCS8vICgjODQ2NSwgIzgzNzkpCiAgICAJCQkJX2NsaXBwaW5nLnNldFN0YXRlKAogICAgCQkJCQltYXRlcmlhbC5jbGlwcGluZ1BsYW5lcywgbWF0ZXJpYWwuY2xpcEludGVyc2VjdGlvbiwgbWF0ZXJpYWwuY2xpcFNoYWRvd3MsCiAgICAJCQkJCWNhbWVyYSwgbWF0ZXJpYWxQcm9wZXJ0aWVzLCB1c2VDYWNoZSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggbWF0ZXJpYWwubmVlZHNVcGRhdGUgPT09IGZhbHNlICkgewoKICAgIAkJCWlmICggbWF0ZXJpYWxQcm9wZXJ0aWVzLnByb2dyYW0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmZvZyAmJiBtYXRlcmlhbFByb3BlcnRpZXMuZm9nICE9PSBmb2cgKSB7CgogICAgCQkJCW1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5saWdodHMgJiYgbWF0ZXJpYWxQcm9wZXJ0aWVzLmxpZ2h0c1N0YXRlVmVyc2lvbiAhPT0gbGlnaHRzLnN0YXRlLnZlcnNpb24gKSB7CgogICAgCQkJCW1hdGVyaWFsLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbFByb3BlcnRpZXMubnVtQ2xpcHBpbmdQbGFuZXMgIT09IHVuZGVmaW5lZCAmJgogICAgCQkJCSggbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUNsaXBwaW5nUGxhbmVzICE9PSBfY2xpcHBpbmcubnVtUGxhbmVzIHx8CiAgICAJCQkJbWF0ZXJpYWxQcm9wZXJ0aWVzLm51bUludGVyc2VjdGlvbiAhPT0gX2NsaXBwaW5nLm51bUludGVyc2VjdGlvbiApICkgewoKICAgIAkJCQltYXRlcmlhbC5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5uZWVkc1VwZGF0ZSApIHsKCiAgICAJCQlpbml0TWF0ZXJpYWwoIG1hdGVyaWFsLCBmb2csIG9iamVjdCApOwogICAgCQkJbWF0ZXJpYWwubmVlZHNVcGRhdGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCXZhciByZWZyZXNoUHJvZ3JhbSA9IGZhbHNlOwogICAgCQl2YXIgcmVmcmVzaE1hdGVyaWFsID0gZmFsc2U7CiAgICAJCXZhciByZWZyZXNoTGlnaHRzID0gZmFsc2U7CgogICAgCQl2YXIgcHJvZ3JhbSA9IG1hdGVyaWFsUHJvcGVydGllcy5wcm9ncmFtLAogICAgCQkJcF91bmlmb3JtcyA9IHByb2dyYW0uZ2V0VW5pZm9ybXMoKSwKICAgIAkJCW1fdW5pZm9ybXMgPSBtYXRlcmlhbFByb3BlcnRpZXMuc2hhZGVyLnVuaWZvcm1zOwoKICAgIAkJaWYgKCBzdGF0ZS51c2VQcm9ncmFtKCBwcm9ncmFtLnByb2dyYW0gKSApIHsKCiAgICAJCQlyZWZyZXNoUHJvZ3JhbSA9IHRydWU7CiAgICAJCQlyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOwogICAgCQkJcmVmcmVzaExpZ2h0cyA9IHRydWU7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmlkICE9PSBfY3VycmVudE1hdGVyaWFsSWQgKSB7CgogICAgCQkJX2N1cnJlbnRNYXRlcmlhbElkID0gbWF0ZXJpYWwuaWQ7CgogICAgCQkJcmVmcmVzaE1hdGVyaWFsID0gdHJ1ZTsKCiAgICAJCX0KCiAgICAJCWlmICggcmVmcmVzaFByb2dyYW0gfHwgX2N1cnJlbnRDYW1lcmEgIT09IGNhbWVyYSApIHsKCiAgICAJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdwcm9qZWN0aW9uTWF0cml4JywgY2FtZXJhLnByb2plY3Rpb25NYXRyaXggKTsKCiAgICAJCQlpZiAoIGNhcGFiaWxpdGllcy5sb2dhcml0aG1pY0RlcHRoQnVmZmVyICkgewoKICAgIAkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdsb2dEZXB0aEJ1ZkZDJywKICAgIAkJCQkJMi4wIC8gKCBNYXRoLmxvZyggY2FtZXJhLmZhciArIDEuMCApIC8gTWF0aC5MTjIgKSApOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIF9jdXJyZW50Q2FtZXJhICE9PSBjYW1lcmEgKSB7CgogICAgCQkJCV9jdXJyZW50Q2FtZXJhID0gY2FtZXJhOwoKICAgIAkJCQkvLyBsaWdodGluZyB1bmlmb3JtcyBkZXBlbmQgb24gdGhlIGNhbWVyYSBzbyBlbmZvcmNlIGFuIHVwZGF0ZQogICAgCQkJCS8vIG5vdywgaW4gY2FzZSB0aGlzIG1hdGVyaWFsIHN1cHBvcnRzIGxpZ2h0cyAtIG9yIGxhdGVyLCB3aGVuCiAgICAJCQkJLy8gdGhlIG5leHQgbWF0ZXJpYWwgdGhhdCBkb2VzIGdldHMgYWN0aXZhdGVkOgoKICAgIAkJCQlyZWZyZXNoTWF0ZXJpYWwgPSB0cnVlOwkJLy8gc2V0IHRvIHRydWUgb24gbWF0ZXJpYWwgY2hhbmdlCiAgICAJCQkJcmVmcmVzaExpZ2h0cyA9IHRydWU7CQkvLyByZW1haW5zIHNldCB1bnRpbCB1cGRhdGUgZG9uZQoKICAgIAkJCX0KCiAgICAJCQkvLyBsb2FkIG1hdGVyaWFsIHNwZWNpZmljIHVuaWZvcm1zCiAgICAJCQkvLyAoc2hhZGVyIG1hdGVyaWFsIGFsc28gZ2V0cyB0aGVtIGZvciB0aGUgc2FrZSBvZiBnZW5lcmljaXR5KQoKICAgIAkJCWlmICggbWF0ZXJpYWwuaXNTaGFkZXJNYXRlcmlhbCB8fAogICAgCQkJCW1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwKICAgIAkJCQltYXRlcmlhbC5pc01lc2hTdGFuZGFyZE1hdGVyaWFsIHx8CiAgICAJCQkJbWF0ZXJpYWwuZW52TWFwICkgewoKICAgIAkJCQl2YXIgdUNhbVBvcyA9IHBfdW5pZm9ybXMubWFwLmNhbWVyYVBvc2l0aW9uOwoKICAgIAkJCQlpZiAoIHVDYW1Qb3MgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCXVDYW1Qb3Muc2V0VmFsdWUoIF9nbCwKICAgIAkJCQkJCV92ZWN0b3IzLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICkgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQlpZiAoIG1hdGVyaWFsLmlzTWVzaFBob25nTWF0ZXJpYWwgfHwKICAgIAkJCQltYXRlcmlhbC5pc01lc2hMYW1iZXJ0TWF0ZXJpYWwgfHwKICAgIAkJCQltYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsIHx8CiAgICAJCQkJbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCB8fAogICAgCQkJCW1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgfHwKICAgIAkJCQltYXRlcmlhbC5za2lubmluZyApIHsKCiAgICAJCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndmlld01hdHJpeCcsIGNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBza2lubmluZyB1bmlmb3JtcyBtdXN0IGJlIHNldCBldmVuIGlmIG1hdGVyaWFsIGRpZG4ndCBjaGFuZ2UKICAgIAkJLy8gYXV0by1zZXR0aW5nIG9mIHRleHR1cmUgdW5pdCBmb3IgYm9uZSB0ZXh0dXJlIG11c3QgZ28gYmVmb3JlIG90aGVyIHRleHR1cmVzCiAgICAJCS8vIG5vdCBzdXJlIHdoeSwgYnV0IG90aGVyd2lzZSB3ZWlyZCB0aGluZ3MgaGFwcGVuCgogICAgCQlpZiAoIG1hdGVyaWFsLnNraW5uaW5nICkgewoKICAgIAkJCXBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeCcgKTsKICAgIAkJCXBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgb2JqZWN0LCAnYmluZE1hdHJpeEludmVyc2UnICk7CgogICAgCQkJdmFyIHNrZWxldG9uID0gb2JqZWN0LnNrZWxldG9uOwoKICAgIAkJCWlmICggc2tlbGV0b24gKSB7CgogICAgCQkJCXZhciBib25lcyA9IHNrZWxldG9uLmJvbmVzOwoKICAgIAkJCQlpZiAoIGNhcGFiaWxpdGllcy5mbG9hdFZlcnRleFRleHR1cmVzICkgewoKICAgIAkJCQkJaWYgKCBza2VsZXRvbi5ib25lVGV4dHVyZSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJCS8vIGxheW91dCAoMSBtYXRyaXggPSA0IHBpeGVscykKICAgIAkJCQkJCS8vICAgICAgUkdCQSBSR0JBIFJHQkEgUkdCQSAoPT4gY29sdW1uMSwgY29sdW1uMiwgY29sdW1uMywgY29sdW1uNCkKICAgIAkJCQkJCS8vICB3aXRoICA4eDggIHBpeGVsIHRleHR1cmUgbWF4ICAgMTYgYm9uZXMgKiA0IHBpeGVscyA9ICAoOCAqIDgpCiAgICAJCQkJCQkvLyAgICAgICAxNngxNiBwaXhlbCB0ZXh0dXJlIG1heCAgIDY0IGJvbmVzICogNCBwaXhlbHMgPSAoMTYgKiAxNikKICAgIAkJCQkJCS8vICAgICAgIDMyeDMyIHBpeGVsIHRleHR1cmUgbWF4ICAyNTYgYm9uZXMgKiA0IHBpeGVscyA9ICgzMiAqIDMyKQogICAgCQkJCQkJLy8gICAgICAgNjR4NjQgcGl4ZWwgdGV4dHVyZSBtYXggMTAyNCBib25lcyAqIDQgcGl4ZWxzID0gKDY0ICogNjQpCgoKICAgIAkJCQkJCXZhciBzaXplID0gTWF0aC5zcXJ0KCBib25lcy5sZW5ndGggKiA0ICk7IC8vIDQgcGl4ZWxzIG5lZWRlZCBmb3IgMSBtYXRyaXgKICAgIAkJCQkJCXNpemUgPSBfTWF0aC5jZWlsUG93ZXJPZlR3byggc2l6ZSApOwogICAgCQkJCQkJc2l6ZSA9IE1hdGgubWF4KCBzaXplLCA0ICk7CgogICAgCQkJCQkJdmFyIGJvbmVNYXRyaWNlcyA9IG5ldyBGbG9hdDMyQXJyYXkoIHNpemUgKiBzaXplICogNCApOyAvLyA0IGZsb2F0cyBwZXIgUkdCQSBwaXhlbAogICAgCQkJCQkJYm9uZU1hdHJpY2VzLnNldCggc2tlbGV0b24uYm9uZU1hdHJpY2VzICk7IC8vIGNvcHkgY3VycmVudCB2YWx1ZXMKCiAgICAJCQkJCQl2YXIgYm9uZVRleHR1cmUgPSBuZXcgRGF0YVRleHR1cmUoIGJvbmVNYXRyaWNlcywgc2l6ZSwgc2l6ZSwgUkdCQUZvcm1hdCwgRmxvYXRUeXBlICk7CiAgICAJCQkJCQlib25lVGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJCQkJc2tlbGV0b24uYm9uZU1hdHJpY2VzID0gYm9uZU1hdHJpY2VzOwogICAgCQkJCQkJc2tlbGV0b24uYm9uZVRleHR1cmUgPSBib25lVGV4dHVyZTsKICAgIAkJCQkJCXNrZWxldG9uLmJvbmVUZXh0dXJlU2l6ZSA9IHNpemU7CgogICAgCQkJCQl9CgogICAgCQkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZScsIHNrZWxldG9uLmJvbmVUZXh0dXJlLCB0ZXh0dXJlcyApOwogICAgCQkJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdib25lVGV4dHVyZVNpemUnLCBza2VsZXRvbi5ib25lVGV4dHVyZVNpemUgKTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXBfdW5pZm9ybXMuc2V0T3B0aW9uYWwoIF9nbCwgc2tlbGV0b24sICdib25lTWF0cmljZXMnICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIHJlZnJlc2hNYXRlcmlhbCApIHsKCiAgICAJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICd0b25lTWFwcGluZ0V4cG9zdXJlJywgX3RoaXMudG9uZU1hcHBpbmdFeHBvc3VyZSApOwogICAgCQkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAndG9uZU1hcHBpbmdXaGl0ZVBvaW50JywgX3RoaXMudG9uZU1hcHBpbmdXaGl0ZVBvaW50ICk7CgogICAgCQkJaWYgKCBtYXRlcmlhbC5saWdodHMgKSB7CgogICAgCQkJCS8vIHRoZSBjdXJyZW50IG1hdGVyaWFsIHJlcXVpcmVzIGxpZ2h0aW5nIGluZm8KCiAgICAJCQkJLy8gbm90ZTogYWxsIGxpZ2h0aW5nIHVuaWZvcm1zIGFyZSBhbHdheXMgc2V0IGNvcnJlY3RseQogICAgCQkJCS8vIHRoZXkgc2ltcGx5IHJlZmVyZW5jZSB0aGUgcmVuZGVyZXIncyBzdGF0ZSBmb3IgdGhlaXIKICAgIAkJCQkvLyB2YWx1ZXMKICAgIAkJCQkvLwogICAgCQkJCS8vIHVzZSB0aGUgY3VycmVudCBtYXRlcmlhbCdzIC5uZWVkc1VwZGF0ZSBmbGFncyB0byBzZXQKICAgIAkJCQkvLyB0aGUgR0wgc3RhdGUgd2hlbiByZXF1aXJlZAoKICAgIAkJCQltYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggbV91bmlmb3JtcywgcmVmcmVzaExpZ2h0cyApOwoKICAgIAkJCX0KCiAgICAJCQkvLyByZWZyZXNoIHVuaWZvcm1zIGNvbW1vbiB0byBzZXZlcmFsIG1hdGVyaWFscwoKICAgIAkJCWlmICggZm9nICYmIG1hdGVyaWFsLmZvZyApIHsKCiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zRm9nKCBtX3VuaWZvcm1zLCBmb2cgKTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCBtYXRlcmlhbC5pc01lc2hCYXNpY01hdGVyaWFsICkgewoKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgogICAgCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTGFtYmVydE1hdGVyaWFsICkgewoKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zTGFtYmVydCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hQaG9uZ01hdGVyaWFsICkgewoKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgogICAgCQkJCWlmICggbWF0ZXJpYWwuaXNNZXNoVG9vbk1hdGVyaWFsICkgewoKICAgIAkJCQkJcmVmcmVzaFVuaWZvcm1zVG9vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXJlZnJlc2hVbmlmb3Jtc1Bob25nKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoU3RhbmRhcmRNYXRlcmlhbCApIHsKCiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoKICAgIAkJCQlpZiAoIG1hdGVyaWFsLmlzTWVzaFBoeXNpY2FsTWF0ZXJpYWwgKSB7CgogICAgCQkJCQlyZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXJlZnJlc2hVbmlmb3Jtc1N0YW5kYXJkKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTWF0Y2FwTWF0ZXJpYWwgKSB7CgogICAgCQkJCXJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zTWF0Y2FwKCBtX3VuaWZvcm1zLCBtYXRlcmlhbCApOwoKICAgIAkJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmlzTWVzaERlcHRoTWF0ZXJpYWwgKSB7CgogICAgCQkJCXJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNEZXB0aCggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc01lc2hEaXN0YW5jZU1hdGVyaWFsICkgewoKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNDb21tb24oIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zRGlzdGFuY2UoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgogICAgCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNNZXNoTm9ybWFsTWF0ZXJpYWwgKSB7CgogICAgCQkJCXJlZnJlc2hVbmlmb3Jtc0NvbW1vbiggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNOb3JtYWwoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgogICAgCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNMaW5lQmFzaWNNYXRlcmlhbCApIHsKCiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zTGluZSggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQkJaWYgKCBtYXRlcmlhbC5pc0xpbmVEYXNoZWRNYXRlcmlhbCApIHsKCiAgICAJCQkJCXJlZnJlc2hVbmlmb3Jtc0Rhc2goIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgogICAgCQkJCX0KCiAgICAJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1BvaW50c01hdGVyaWFsICkgewoKICAgIAkJCQlyZWZyZXNoVW5pZm9ybXNQb2ludHMoIG1fdW5pZm9ybXMsIG1hdGVyaWFsICk7CgogICAgCQkJfSBlbHNlIGlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHsKCiAgICAJCQkJcmVmcmVzaFVuaWZvcm1zU3ByaXRlcyggbV91bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5pc1NoYWRvd01hdGVyaWFsICkgewoKICAgIAkJCQltX3VuaWZvcm1zLmNvbG9yLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7CiAgICAJCQkJbV91bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKCiAgICAJCQl9CgogICAgCQkJLy8gUmVjdEFyZWFMaWdodCBUZXh0dXJlCiAgICAJCQkvLyBUT0RPIChtcmRvb2IpOiBGaW5kIGEgbmljZXIgaW1wbGVtZW50YXRpb24KCiAgICAJCQlpZiAoIG1fdW5pZm9ybXMubHRjXzEgIT09IHVuZGVmaW5lZCApIG1fdW5pZm9ybXMubHRjXzEudmFsdWUgPSBVbmlmb3Jtc0xpYi5MVENfMTsKICAgIAkJCWlmICggbV91bmlmb3Jtcy5sdGNfMiAhPT0gdW5kZWZpbmVkICkgbV91bmlmb3Jtcy5sdGNfMi52YWx1ZSA9IFVuaWZvcm1zTGliLkxUQ18yOwoKICAgIAkJCVdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIHRleHR1cmVzICk7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmlzU2hhZGVyTWF0ZXJpYWwgJiYgbWF0ZXJpYWwudW5pZm9ybXNOZWVkVXBkYXRlID09PSB0cnVlICkgewoKICAgIAkJCVdlYkdMVW5pZm9ybXMudXBsb2FkKCBfZ2wsIG1hdGVyaWFsUHJvcGVydGllcy51bmlmb3Jtc0xpc3QsIG1fdW5pZm9ybXMsIHRleHR1cmVzICk7CiAgICAJCQltYXRlcmlhbC51bmlmb3Jtc05lZWRVcGRhdGUgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCWlmICggbWF0ZXJpYWwuaXNTcHJpdGVNYXRlcmlhbCApIHsKCiAgICAJCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdjZW50ZXInLCBvYmplY3QuY2VudGVyICk7CgogICAgCQl9CgogICAgCQkvLyBjb21tb24gbWF0cmljZXMKCiAgICAJCXBfdW5pZm9ybXMuc2V0VmFsdWUoIF9nbCwgJ21vZGVsVmlld01hdHJpeCcsIG9iamVjdC5tb2RlbFZpZXdNYXRyaXggKTsKICAgIAkJcF91bmlmb3Jtcy5zZXRWYWx1ZSggX2dsLCAnbm9ybWFsTWF0cml4Jywgb2JqZWN0Lm5vcm1hbE1hdHJpeCApOwogICAgCQlwX3VuaWZvcm1zLnNldFZhbHVlKCBfZ2wsICdtb2RlbE1hdHJpeCcsIG9iamVjdC5tYXRyaXhXb3JsZCApOwoKICAgIAkJcmV0dXJuIHByb2dyYW07CgogICAgCX0KCiAgICAJLy8gVW5pZm9ybXMgKHJlZnJlc2ggdW5pZm9ybXMgb2JqZWN0cykKCiAgICAJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zQ29tbW9uKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CgogICAgCQl1bmlmb3Jtcy5vcGFjaXR5LnZhbHVlID0gbWF0ZXJpYWwub3BhY2l0eTsKCiAgICAJCWlmICggbWF0ZXJpYWwuY29sb3IgKSB7CgogICAgCQkJdW5pZm9ybXMuZGlmZnVzZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jb2xvciApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZSApIHsKCiAgICAJCQl1bmlmb3Jtcy5lbWlzc2l2ZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5lbWlzc2l2ZSApLm11bHRpcGx5U2NhbGFyKCBtYXRlcmlhbC5lbWlzc2l2ZUludGVuc2l0eSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5tYXAgKSB7CgogICAgCQkJdW5pZm9ybXMubWFwLnZhbHVlID0gbWF0ZXJpYWwubWFwOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5hbHBoYU1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5hbHBoYU1hcC52YWx1ZSA9IG1hdGVyaWFsLmFscGhhTWFwOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5zcGVjdWxhck1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5zcGVjdWxhck1hcC52YWx1ZSA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5lbnZNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuZW52TWFwLnZhbHVlID0gbWF0ZXJpYWwuZW52TWFwOwoKICAgIAkJCS8vIGRvbid0IGZsaXAgQ3ViZVRleHR1cmUgZW52TWFwcywgZmxpcCBldmVyeXRoaW5nIGVsc2U6CiAgICAJCQkvLyAgV2ViR0xSZW5kZXJUYXJnZXRDdWJlIHdpbGwgYmUgZmxpcHBlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgIAkJCS8vICBXZWJHTFJlbmRlclRhcmdldEN1YmUudGV4dHVyZSB3aWxsIGJlIGZsaXBwZWQgYmVjYXVzZSBpdCdzIGEgVGV4dHVyZSBhbmQgTk9UIGEgQ3ViZVRleHR1cmUKICAgIAkJCS8vIHRoaXMgY2hlY2sgbXVzdCBiZSBoYW5kbGVkIGRpZmZlcmVudGx5LCBvciByZW1vdmVkIGVudGlyZWx5LCBpZiBXZWJHTFJlbmRlclRhcmdldEN1YmUgdXNlcyBhIEN1YmVUZXh0dXJlIGluIHRoZSBmdXR1cmUKICAgIAkJCXVuaWZvcm1zLmZsaXBFbnZNYXAudmFsdWUgPSBtYXRlcmlhbC5lbnZNYXAuaXNDdWJlVGV4dHVyZSA/IC0gMSA6IDE7CgogICAgCQkJdW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5OwogICAgCQkJdW5pZm9ybXMucmVmcmFjdGlvblJhdGlvLnZhbHVlID0gbWF0ZXJpYWwucmVmcmFjdGlvblJhdGlvOwoKICAgIAkJCXVuaWZvcm1zLm1heE1pcExldmVsLnZhbHVlID0gcHJvcGVydGllcy5nZXQoIG1hdGVyaWFsLmVudk1hcCApLl9fbWF4TWlwTGV2ZWw7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmxpZ2h0TWFwICkgewoKICAgIAkJCXVuaWZvcm1zLmxpZ2h0TWFwLnZhbHVlID0gbWF0ZXJpYWwubGlnaHRNYXA7CiAgICAJCQl1bmlmb3Jtcy5saWdodE1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmxpZ2h0TWFwSW50ZW5zaXR5OwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5hb01hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5hb01hcC52YWx1ZSA9IG1hdGVyaWFsLmFvTWFwOwogICAgCQkJdW5pZm9ybXMuYW9NYXBJbnRlbnNpdHkudmFsdWUgPSBtYXRlcmlhbC5hb01hcEludGVuc2l0eTsKCiAgICAJCX0KCiAgICAJCS8vIHV2IHJlcGVhdCBhbmQgb2Zmc2V0IHNldHRpbmcgcHJpb3JpdGllcwogICAgCQkvLyAxLiBjb2xvciBtYXAKICAgIAkJLy8gMi4gc3BlY3VsYXIgbWFwCiAgICAJCS8vIDMuIG5vcm1hbCBtYXAKICAgIAkJLy8gNC4gYnVtcCBtYXAKICAgIAkJLy8gNS4gYWxwaGEgbWFwCiAgICAJCS8vIDYuIGVtaXNzaXZlIG1hcAoKICAgIAkJdmFyIHV2U2NhbGVNYXA7CgogICAgCQlpZiAoIG1hdGVyaWFsLm1hcCApIHsKCiAgICAJCQl1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWFwOwoKICAgIAkJfSBlbHNlIGlmICggbWF0ZXJpYWwuc3BlY3VsYXJNYXAgKSB7CgogICAgCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLnNwZWN1bGFyTWFwOwoKICAgIAkJfSBlbHNlIGlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgewoKICAgIAkJCXV2U2NhbGVNYXAgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CgogICAgCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7CgogICAgCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKCiAgICAJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CgogICAgCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLmJ1bXBNYXA7CgogICAgCQl9IGVsc2UgaWYgKCBtYXRlcmlhbC5yb3VnaG5lc3NNYXAgKSB7CgogICAgCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLnJvdWdobmVzc01hcDsKCiAgICAJCX0gZWxzZSBpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHsKCiAgICAJCQl1dlNjYWxlTWFwID0gbWF0ZXJpYWwubWV0YWxuZXNzTWFwOwoKICAgIAkJfSBlbHNlIGlmICggbWF0ZXJpYWwuYWxwaGFNYXAgKSB7CgogICAgCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLmFscGhhTWFwOwoKICAgIAkJfSBlbHNlIGlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CgogICAgCQkJdXZTY2FsZU1hcCA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwOwoKICAgIAkJfQoKICAgIAkJaWYgKCB1dlNjYWxlTWFwICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkKICAgIAkJCWlmICggdXZTY2FsZU1hcC5pc1dlYkdMUmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJCQl1dlNjYWxlTWFwID0gdXZTY2FsZU1hcC50ZXh0dXJlOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIHV2U2NhbGVNYXAubWF0cml4QXV0b1VwZGF0ZSA9PT0gdHJ1ZSApIHsKCiAgICAJCQkJdXZTY2FsZU1hcC51cGRhdGVNYXRyaXgoKTsKCiAgICAJCQl9CgogICAgCQkJdW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggdXZTY2FsZU1hcC5tYXRyaXggKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNMaW5lKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CgogICAgCQl1bmlmb3Jtcy5kaWZmdXNlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLmNvbG9yICk7CiAgICAJCXVuaWZvcm1zLm9wYWNpdHkudmFsdWUgPSBtYXRlcmlhbC5vcGFjaXR5OwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rhc2goIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCiAgICAJCXVuaWZvcm1zLmRhc2hTaXplLnZhbHVlID0gbWF0ZXJpYWwuZGFzaFNpemU7CiAgICAJCXVuaWZvcm1zLnRvdGFsU2l6ZS52YWx1ZSA9IG1hdGVyaWFsLmRhc2hTaXplICsgbWF0ZXJpYWwuZ2FwU2l6ZTsKICAgIAkJdW5pZm9ybXMuc2NhbGUudmFsdWUgPSBtYXRlcmlhbC5zY2FsZTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQb2ludHMoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCiAgICAJCXVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTsKICAgIAkJdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CiAgICAJCXVuaWZvcm1zLnNpemUudmFsdWUgPSBtYXRlcmlhbC5zaXplICogX3BpeGVsUmF0aW87CiAgICAJCXVuaWZvcm1zLnNjYWxlLnZhbHVlID0gX2hlaWdodCAqIDAuNTsKCiAgICAJCXVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKCiAgICAJCWlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkgewoKICAgIAkJCWlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7CgogICAgCQkJCW1hdGVyaWFsLm1hcC51cGRhdGVNYXRyaXgoKTsKCiAgICAJCQl9CgogICAgCQkJdW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggbWF0ZXJpYWwubWFwLm1hdHJpeCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Nwcml0ZXMoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCiAgICAJCXVuaWZvcm1zLmRpZmZ1c2UudmFsdWUuY29weSggbWF0ZXJpYWwuY29sb3IgKTsKICAgIAkJdW5pZm9ybXMub3BhY2l0eS52YWx1ZSA9IG1hdGVyaWFsLm9wYWNpdHk7CiAgICAJCXVuaWZvcm1zLnJvdGF0aW9uLnZhbHVlID0gbWF0ZXJpYWwucm90YXRpb247CiAgICAJCXVuaWZvcm1zLm1hcC52YWx1ZSA9IG1hdGVyaWFsLm1hcDsKCiAgICAJCWlmICggbWF0ZXJpYWwubWFwICE9PSBudWxsICkgewoKICAgIAkJCWlmICggbWF0ZXJpYWwubWFwLm1hdHJpeEF1dG9VcGRhdGUgPT09IHRydWUgKSB7CgogICAgCQkJCW1hdGVyaWFsLm1hcC51cGRhdGVNYXRyaXgoKTsKCiAgICAJCQl9CgogICAgCQkJdW5pZm9ybXMudXZUcmFuc2Zvcm0udmFsdWUuY29weSggbWF0ZXJpYWwubWFwLm1hdHJpeCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0ZvZyggdW5pZm9ybXMsIGZvZyApIHsKCiAgICAJCXVuaWZvcm1zLmZvZ0NvbG9yLnZhbHVlLmNvcHkoIGZvZy5jb2xvciApOwoKICAgIAkJaWYgKCBmb2cuaXNGb2cgKSB7CgogICAgCQkJdW5pZm9ybXMuZm9nTmVhci52YWx1ZSA9IGZvZy5uZWFyOwogICAgCQkJdW5pZm9ybXMuZm9nRmFyLnZhbHVlID0gZm9nLmZhcjsKCiAgICAJCX0gZWxzZSBpZiAoIGZvZy5pc0ZvZ0V4cDIgKSB7CgogICAgCQkJdW5pZm9ybXMuZm9nRGVuc2l0eS52YWx1ZSA9IGZvZy5kZW5zaXR5OwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0xhbWJlcnQoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCiAgICAJCWlmICggbWF0ZXJpYWwuZW1pc3NpdmVNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuZW1pc3NpdmVNYXAudmFsdWUgPSBtYXRlcmlhbC5lbWlzc2l2ZU1hcDsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaG9uZyggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKICAgIAkJdW5pZm9ybXMuc3BlY3VsYXIudmFsdWUuY29weSggbWF0ZXJpYWwuc3BlY3VsYXIgKTsKICAgIAkJdW5pZm9ybXMuc2hpbmluZXNzLnZhbHVlID0gTWF0aC5tYXgoIG1hdGVyaWFsLnNoaW5pbmVzcywgMWUtNCApOyAvLyB0byBwcmV2ZW50IHBvdyggMC4wLCAwLjAgKQoKICAgIAkJaWYgKCBtYXRlcmlhbC5lbWlzc2l2ZU1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5lbWlzc2l2ZU1hcC52YWx1ZSA9IG1hdGVyaWFsLmVtaXNzaXZlTWFwOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5idW1wTWFwICkgewoKICAgIAkJCXVuaWZvcm1zLmJ1bXBNYXAudmFsdWUgPSBtYXRlcmlhbC5idW1wTWFwOwogICAgCQkJdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuYnVtcFNjYWxlOwogICAgCQkJaWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSAqPSAtIDE7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLm5vcm1hbE1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5ub3JtYWxNYXAudmFsdWUgPSBtYXRlcmlhbC5ub3JtYWxNYXA7CiAgICAJCQl1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5ub3JtYWxTY2FsZSApOwogICAgCQkJaWYgKCBtYXRlcmlhbC5zaWRlID09PSBCYWNrU2lkZSApIHVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOwogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKICAgIAkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc1Rvb24oIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCiAgICAJCXJlZnJlc2hVbmlmb3Jtc1Bob25nKCB1bmlmb3JtcywgbWF0ZXJpYWwgKTsKCiAgICAJCWlmICggbWF0ZXJpYWwuZ3JhZGllbnRNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuZ3JhZGllbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5ncmFkaWVudE1hcDsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNTdGFuZGFyZCggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKICAgIAkJdW5pZm9ybXMucm91Z2huZXNzLnZhbHVlID0gbWF0ZXJpYWwucm91Z2huZXNzOwogICAgCQl1bmlmb3Jtcy5tZXRhbG5lc3MudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3M7CgogICAgCQlpZiAoIG1hdGVyaWFsLnJvdWdobmVzc01hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5yb3VnaG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5yb3VnaG5lc3NNYXA7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLm1ldGFsbmVzc01hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5tZXRhbG5lc3NNYXAudmFsdWUgPSBtYXRlcmlhbC5tZXRhbG5lc3NNYXA7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmVtaXNzaXZlTWFwICkgewoKICAgIAkJCXVuaWZvcm1zLmVtaXNzaXZlTWFwLnZhbHVlID0gbWF0ZXJpYWwuZW1pc3NpdmVNYXA7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7CiAgICAJCQl1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7CiAgICAJCQlpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTsKCiAgICAJCX0KCiAgICAJCWlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkgewoKICAgIAkJCXVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKICAgIAkJCXVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7CiAgICAJCQlpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlOwogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmVudk1hcCApIHsKCiAgICAJCQkvL3VuaWZvcm1zLmVudk1hcC52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcDsgLy8gcGFydCBvZiB1bmlmb3JtcyBjb21tb24KICAgIAkJCXVuaWZvcm1zLmVudk1hcEludGVuc2l0eS52YWx1ZSA9IG1hdGVyaWFsLmVudk1hcEludGVuc2l0eTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNQaHlzaWNhbCggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKICAgIAkJcmVmcmVzaFVuaWZvcm1zU3RhbmRhcmQoIHVuaWZvcm1zLCBtYXRlcmlhbCApOwoKICAgIAkJdW5pZm9ybXMucmVmbGVjdGl2aXR5LnZhbHVlID0gbWF0ZXJpYWwucmVmbGVjdGl2aXR5OyAvLyBhbHNvIHBhcnQgb2YgdW5pZm9ybXMgY29tbW9uCgogICAgCQl1bmlmb3Jtcy5jbGVhcmNvYXQudmFsdWUgPSBtYXRlcmlhbC5jbGVhcmNvYXQ7CiAgICAJCXVuaWZvcm1zLmNsZWFyY29hdFJvdWdobmVzcy52YWx1ZSA9IG1hdGVyaWFsLmNsZWFyY29hdFJvdWdobmVzczsKICAgIAkJaWYgKCBtYXRlcmlhbC5zaGVlbiApIHVuaWZvcm1zLnNoZWVuLnZhbHVlLmNvcHkoIG1hdGVyaWFsLnNoZWVuICk7CgogICAgCQlpZiAoIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbE1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5jbGVhcmNvYXROb3JtYWxTY2FsZS52YWx1ZS5jb3B5KCBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxTY2FsZSApOwogICAgCQkJdW5pZm9ybXMuY2xlYXJjb2F0Tm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwuY2xlYXJjb2F0Tm9ybWFsTWFwOwoKICAgIAkJCWlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB7CgogICAgCQkJCXVuaWZvcm1zLmNsZWFyY29hdE5vcm1hbFNjYWxlLnZhbHVlLm5lZ2F0ZSgpOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXVuaWZvcm1zLnRyYW5zcGFyZW5jeS52YWx1ZSA9IG1hdGVyaWFsLnRyYW5zcGFyZW5jeTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNNYXRjYXAoIHVuaWZvcm1zLCBtYXRlcmlhbCApIHsKCiAgICAJCWlmICggbWF0ZXJpYWwubWF0Y2FwICkgewoKICAgIAkJCXVuaWZvcm1zLm1hdGNhcC52YWx1ZSA9IG1hdGVyaWFsLm1hdGNhcDsKCiAgICAJCX0KCiAgICAJCWlmICggbWF0ZXJpYWwuYnVtcE1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5idW1wTWFwLnZhbHVlID0gbWF0ZXJpYWwuYnVtcE1hcDsKICAgIAkJCXVuaWZvcm1zLmJ1bXBTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBTY2FsZTsKICAgIAkJCWlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgKj0gLSAxOwoKICAgIAkJfQoKICAgIAkJaWYgKCBtYXRlcmlhbC5ub3JtYWxNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMubm9ybWFsTWFwLnZhbHVlID0gbWF0ZXJpYWwubm9ybWFsTWFwOwogICAgCQkJdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUuY29weSggbWF0ZXJpYWwubm9ybWFsU2NhbGUgKTsKICAgIAkJCWlmICggbWF0ZXJpYWwuc2lkZSA9PT0gQmFja1NpZGUgKSB1bmlmb3Jtcy5ub3JtYWxTY2FsZS52YWx1ZS5uZWdhdGUoKTsKCiAgICAJCX0KCiAgICAJCWlmICggbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwICkgewoKICAgIAkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudE1hcC52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcDsKICAgIAkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudFNjYWxlLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50U2NhbGU7CiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRCaWFzLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50QmlhczsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiByZWZyZXNoVW5pZm9ybXNEZXB0aCggdW5pZm9ybXMsIG1hdGVyaWFsICkgewoKICAgIAkJaWYgKCBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50TWFwLnZhbHVlID0gbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwOwogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50U2NhbGUudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZTsKICAgIAkJCXVuaWZvcm1zLmRpc3BsYWNlbWVudEJpYXMudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIHJlZnJlc2hVbmlmb3Jtc0Rpc3RhbmNlKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CgogICAgCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlOwogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7CgogICAgCQl9CgogICAgCQl1bmlmb3Jtcy5yZWZlcmVuY2VQb3NpdGlvbi52YWx1ZS5jb3B5KCBtYXRlcmlhbC5yZWZlcmVuY2VQb3NpdGlvbiApOwogICAgCQl1bmlmb3Jtcy5uZWFyRGlzdGFuY2UudmFsdWUgPSBtYXRlcmlhbC5uZWFyRGlzdGFuY2U7CiAgICAJCXVuaWZvcm1zLmZhckRpc3RhbmNlLnZhbHVlID0gbWF0ZXJpYWwuZmFyRGlzdGFuY2U7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcmVmcmVzaFVuaWZvcm1zTm9ybWFsKCB1bmlmb3JtcywgbWF0ZXJpYWwgKSB7CgogICAgCQlpZiAoIG1hdGVyaWFsLmJ1bXBNYXAgKSB7CgogICAgCQkJdW5pZm9ybXMuYnVtcE1hcC52YWx1ZSA9IG1hdGVyaWFsLmJ1bXBNYXA7CiAgICAJCQl1bmlmb3Jtcy5idW1wU2NhbGUudmFsdWUgPSBtYXRlcmlhbC5idW1wU2NhbGU7CiAgICAJCQlpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMuYnVtcFNjYWxlLnZhbHVlICo9IC0gMTsKCiAgICAJCX0KCiAgICAJCWlmICggbWF0ZXJpYWwubm9ybWFsTWFwICkgewoKICAgIAkJCXVuaWZvcm1zLm5vcm1hbE1hcC52YWx1ZSA9IG1hdGVyaWFsLm5vcm1hbE1hcDsKICAgIAkJCXVuaWZvcm1zLm5vcm1hbFNjYWxlLnZhbHVlLmNvcHkoIG1hdGVyaWFsLm5vcm1hbFNjYWxlICk7CiAgICAJCQlpZiAoIG1hdGVyaWFsLnNpZGUgPT09IEJhY2tTaWRlICkgdW5pZm9ybXMubm9ybWFsU2NhbGUudmFsdWUubmVnYXRlKCk7CgogICAgCQl9CgogICAgCQlpZiAoIG1hdGVyaWFsLmRpc3BsYWNlbWVudE1hcCApIHsKCiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRNYXAudmFsdWUgPSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRNYXA7CiAgICAJCQl1bmlmb3Jtcy5kaXNwbGFjZW1lbnRTY2FsZS52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudFNjYWxlOwogICAgCQkJdW5pZm9ybXMuZGlzcGxhY2VtZW50Qmlhcy52YWx1ZSA9IG1hdGVyaWFsLmRpc3BsYWNlbWVudEJpYXM7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gSWYgdW5pZm9ybXMgYXJlIG1hcmtlZCBhcyBjbGVhbiwgdGhleSBkb24ndCBuZWVkIHRvIGJlIGxvYWRlZCB0byB0aGUgR1BVLgoKICAgIAlmdW5jdGlvbiBtYXJrVW5pZm9ybXNMaWdodHNOZWVkc1VwZGF0ZSggdW5pZm9ybXMsIHZhbHVlICkgewoKICAgIAkJdW5pZm9ybXMuYW1iaWVudExpZ2h0Q29sb3IubmVlZHNVcGRhdGUgPSB2YWx1ZTsKICAgIAkJdW5pZm9ybXMubGlnaHRQcm9iZS5uZWVkc1VwZGF0ZSA9IHZhbHVlOwoKICAgIAkJdW5pZm9ybXMuZGlyZWN0aW9uYWxMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKICAgIAkJdW5pZm9ybXMucG9pbnRMaWdodHMubmVlZHNVcGRhdGUgPSB2YWx1ZTsKICAgIAkJdW5pZm9ybXMuc3BvdExpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgCQl1bmlmb3Jtcy5yZWN0QXJlYUxpZ2h0cy5uZWVkc1VwZGF0ZSA9IHZhbHVlOwogICAgCQl1bmlmb3Jtcy5oZW1pc3BoZXJlTGlnaHRzLm5lZWRzVXBkYXRlID0gdmFsdWU7CgogICAgCX0KCiAgICAJLy8KICAgIAl0aGlzLnNldEZyYW1lYnVmZmVyID0gZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWlmICggX2ZyYW1lYnVmZmVyICE9PSB2YWx1ZSApIF9nbC5iaW5kRnJhbWVidWZmZXIoIDM2MTYwLCB2YWx1ZSApOwoKICAgIAkJX2ZyYW1lYnVmZmVyID0gdmFsdWU7CgogICAgCX07CgogICAgCXRoaXMuZ2V0QWN0aXZlQ3ViZUZhY2UgPSBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gX2N1cnJlbnRBY3RpdmVDdWJlRmFjZTsKCiAgICAJfTsKCiAgICAJdGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbCA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBfY3VycmVudEFjdGl2ZU1pcG1hcExldmVsOwoKICAgIAl9OwoKICAgIAl0aGlzLmdldFJlbmRlclRhcmdldCA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBfY3VycmVudFJlbmRlclRhcmdldDsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRSZW5kZXJUYXJnZXQgPSBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgYWN0aXZlQ3ViZUZhY2UsIGFjdGl2ZU1pcG1hcExldmVsICkgewoKICAgIAkJX2N1cnJlbnRSZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CiAgICAJCV9jdXJyZW50QWN0aXZlQ3ViZUZhY2UgPSBhY3RpdmVDdWJlRmFjZTsKICAgIAkJX2N1cnJlbnRBY3RpdmVNaXBtYXBMZXZlbCA9IGFjdGl2ZU1pcG1hcExldmVsOwoKICAgIAkJaWYgKCByZW5kZXJUYXJnZXQgJiYgcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlciA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXRleHR1cmVzLnNldHVwUmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTsKCiAgICAJCX0KCiAgICAJCXZhciBmcmFtZWJ1ZmZlciA9IF9mcmFtZWJ1ZmZlcjsKICAgIAkJdmFyIGlzQ3ViZSA9IGZhbHNlOwoKICAgIAkJaWYgKCByZW5kZXJUYXJnZXQgKSB7CgogICAgCQkJdmFyIF9fd2ViZ2xGcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsRnJhbWVidWZmZXI7CgogICAgCQkJaWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldEN1YmUgKSB7CgogICAgCQkJCWZyYW1lYnVmZmVyID0gX193ZWJnbEZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZSB8fCAwIF07CiAgICAJCQkJaXNDdWJlID0gdHJ1ZTsKCiAgICAJCQl9IGVsc2UgaWYgKCByZW5kZXJUYXJnZXQuaXNXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0ICkgewoKICAgIAkJCQlmcmFtZWJ1ZmZlciA9IHByb3BlcnRpZXMuZ2V0KCByZW5kZXJUYXJnZXQgKS5fX3dlYmdsTXVsdGlzYW1wbGVkRnJhbWVidWZmZXI7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZnJhbWVidWZmZXIgPSBfX3dlYmdsRnJhbWVidWZmZXI7CgogICAgCQkJfQoKICAgIAkJCV9jdXJyZW50Vmlld3BvcnQuY29weSggcmVuZGVyVGFyZ2V0LnZpZXdwb3J0ICk7CiAgICAJCQlfY3VycmVudFNjaXNzb3IuY29weSggcmVuZGVyVGFyZ2V0LnNjaXNzb3IgKTsKICAgIAkJCV9jdXJyZW50U2Npc3NvclRlc3QgPSByZW5kZXJUYXJnZXQuc2Npc3NvclRlc3Q7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCV9jdXJyZW50Vmlld3BvcnQuY29weSggX3ZpZXdwb3J0ICkubXVsdGlwbHlTY2FsYXIoIF9waXhlbFJhdGlvICkuZmxvb3IoKTsKICAgIAkJCV9jdXJyZW50U2Npc3Nvci5jb3B5KCBfc2Npc3NvciApLm11bHRpcGx5U2NhbGFyKCBfcGl4ZWxSYXRpbyApLmZsb29yKCk7CiAgICAJCQlfY3VycmVudFNjaXNzb3JUZXN0ID0gX3NjaXNzb3JUZXN0OwoKICAgIAkJfQoKICAgIAkJaWYgKCBfY3VycmVudEZyYW1lYnVmZmVyICE9PSBmcmFtZWJ1ZmZlciApIHsKCiAgICAJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgZnJhbWVidWZmZXIgKTsKICAgIAkJCV9jdXJyZW50RnJhbWVidWZmZXIgPSBmcmFtZWJ1ZmZlcjsKCiAgICAJCX0KCiAgICAJCXN0YXRlLnZpZXdwb3J0KCBfY3VycmVudFZpZXdwb3J0ICk7CiAgICAJCXN0YXRlLnNjaXNzb3IoIF9jdXJyZW50U2Npc3NvciApOwogICAgCQlzdGF0ZS5zZXRTY2lzc29yVGVzdCggX2N1cnJlbnRTY2lzc29yVGVzdCApOwoKICAgIAkJaWYgKCBpc0N1YmUgKSB7CgogICAgCQkJdmFyIHRleHR1cmVQcm9wZXJ0aWVzID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldC50ZXh0dXJlICk7CiAgICAJCQlfZ2wuZnJhbWVidWZmZXJUZXh0dXJlMkQoIDM2MTYwLCAzNjA2NCwgMzQwNjkgKyAoIGFjdGl2ZUN1YmVGYWNlIHx8IDAgKSwgdGV4dHVyZVByb3BlcnRpZXMuX193ZWJnbFRleHR1cmUsIGFjdGl2ZU1pcG1hcExldmVsIHx8IDAgKTsKCiAgICAJCX0KCiAgICAJfTsKCiAgICAJdGhpcy5yZWFkUmVuZGVyVGFyZ2V0UGl4ZWxzID0gZnVuY3Rpb24gKCByZW5kZXJUYXJnZXQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGJ1ZmZlciwgYWN0aXZlQ3ViZUZhY2VJbmRleCApIHsKCiAgICAJCWlmICggISAoIHJlbmRlclRhcmdldCAmJiByZW5kZXJUYXJnZXQuaXNXZWJHTFJlbmRlclRhcmdldCApICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQuJyApOwogICAgCQkJcmV0dXJuOwoKICAgIAkJfQoKICAgIAkJdmFyIGZyYW1lYnVmZmVyID0gcHJvcGVydGllcy5nZXQoIHJlbmRlclRhcmdldCApLl9fd2ViZ2xGcmFtZWJ1ZmZlcjsKCiAgICAJCWlmICggcmVuZGVyVGFyZ2V0LmlzV2ViR0xSZW5kZXJUYXJnZXRDdWJlICYmIGFjdGl2ZUN1YmVGYWNlSW5kZXggIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlmcmFtZWJ1ZmZlciA9IGZyYW1lYnVmZmVyWyBhY3RpdmVDdWJlRmFjZUluZGV4IF07CgogICAgCQl9CgogICAgCQlpZiAoIGZyYW1lYnVmZmVyICkgewoKICAgIAkJCXZhciByZXN0b3JlID0gZmFsc2U7CgogICAgCQkJaWYgKCBmcmFtZWJ1ZmZlciAhPT0gX2N1cnJlbnRGcmFtZWJ1ZmZlciApIHsKCiAgICAJCQkJX2dsLmJpbmRGcmFtZWJ1ZmZlciggMzYxNjAsIGZyYW1lYnVmZmVyICk7CgogICAgCQkJCXJlc3RvcmUgPSB0cnVlOwoKICAgIAkJCX0KCiAgICAJCQl0cnkgewoKICAgIAkJCQl2YXIgdGV4dHVyZSA9IHJlbmRlclRhcmdldC50ZXh0dXJlOwogICAgCQkJCXZhciB0ZXh0dXJlRm9ybWF0ID0gdGV4dHVyZS5mb3JtYXQ7CiAgICAJCQkJdmFyIHRleHR1cmVUeXBlID0gdGV4dHVyZS50eXBlOwoKICAgIAkJCQlpZiAoIHRleHR1cmVGb3JtYXQgIT09IFJHQkFGb3JtYXQgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZUZvcm1hdCApICE9PSBfZ2wuZ2V0UGFyYW1ldGVyKCAzNTczOSApICkgewoKICAgIAkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVuZGVyVGFyZ2V0IGlzIG5vdCBpbiBSR0JBIG9yIGltcGxlbWVudGF0aW9uIGRlZmluZWQgZm9ybWF0LicgKTsKICAgIAkJCQkJcmV0dXJuOwoKICAgIAkJCQl9CgogICAgCQkJCWlmICggdGV4dHVyZVR5cGUgIT09IFVuc2lnbmVkQnl0ZVR5cGUgJiYgdXRpbHMuY29udmVydCggdGV4dHVyZVR5cGUgKSAhPT0gX2dsLmdldFBhcmFtZXRlciggMzU3MzggKSAmJiAvLyBJRTExLCBFZGdlIGFuZCBDaHJvbWUgTWFjIDwgNTIgKCM5NTEzKQogICAgCQkJCQkhICggdGV4dHVyZVR5cGUgPT09IEZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiB8fCBleHRlbnNpb25zLmdldCggJ09FU190ZXh0dXJlX2Zsb2F0JyApIHx8IGV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29sb3JfYnVmZmVyX2Zsb2F0JyApICkgKSAmJiAvLyBDaHJvbWUgTWFjID49IDUyIGFuZCBGaXJlZm94CiAgICAJCQkJCSEgKCB0ZXh0dXJlVHlwZSA9PT0gSGFsZkZsb2F0VHlwZSAmJiAoIGNhcGFiaWxpdGllcy5pc1dlYkdMMiA/IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9mbG9hdCcgKSA6IGV4dGVuc2lvbnMuZ2V0KCAnRVhUX2NvbG9yX2J1ZmZlcl9oYWxmX2Zsb2F0JyApICkgKSApIHsKCiAgICAJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5XZWJHTFJlbmRlcmVyLnJlYWRSZW5kZXJUYXJnZXRQaXhlbHM6IHJlbmRlclRhcmdldCBpcyBub3QgaW4gVW5zaWduZWRCeXRlVHlwZSBvciBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIHR5cGUuJyApOwogICAgCQkJCQlyZXR1cm47CgogICAgCQkJCX0KCiAgICAJCQkJaWYgKCBfZ2wuY2hlY2tGcmFtZWJ1ZmZlclN0YXR1cyggMzYxNjAgKSA9PT0gMzYwNTMgKSB7CgogICAgCQkJCQkvLyB0aGUgZm9sbG93aW5nIGlmIHN0YXRlbWVudCBlbnN1cmVzIHZhbGlkIHJlYWQgcmVxdWVzdHMgKG5vIG91dC1vZi1ib3VuZHMgcGl4ZWxzLCBzZWUgIzg2MDQpCgogICAgCQkJCQlpZiAoICggeCA+PSAwICYmIHggPD0gKCByZW5kZXJUYXJnZXQud2lkdGggLSB3aWR0aCApICkgJiYgKCB5ID49IDAgJiYgeSA8PSAoIHJlbmRlclRhcmdldC5oZWlnaHQgLSBoZWlnaHQgKSApICkgewoKICAgIAkJCQkJCV9nbC5yZWFkUGl4ZWxzKCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlRm9ybWF0ICksIHV0aWxzLmNvbnZlcnQoIHRleHR1cmVUeXBlICksIGJ1ZmZlciApOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLldlYkdMUmVuZGVyZXIucmVhZFJlbmRlclRhcmdldFBpeGVsczogcmVhZFBpeGVscyBmcm9tIHJlbmRlclRhcmdldCBmYWlsZWQuIEZyYW1lYnVmZmVyIG5vdCBjb21wbGV0ZS4nICk7CgogICAgCQkJCX0KCiAgICAJCQl9IGZpbmFsbHkgewoKICAgIAkJCQlpZiAoIHJlc3RvcmUgKSB7CgogICAgCQkJCQlfZ2wuYmluZEZyYW1lYnVmZmVyKCAzNjE2MCwgX2N1cnJlbnRGcmFtZWJ1ZmZlciApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9OwoKICAgIAl0aGlzLmNvcHlGcmFtZWJ1ZmZlclRvVGV4dHVyZSA9IGZ1bmN0aW9uICggcG9zaXRpb24sIHRleHR1cmUsIGxldmVsICkgewoKICAgIAkJdmFyIHdpZHRoID0gdGV4dHVyZS5pbWFnZS53aWR0aDsKICAgIAkJdmFyIGhlaWdodCA9IHRleHR1cmUuaW1hZ2UuaGVpZ2h0OwogICAgCQl2YXIgZ2xGb3JtYXQgPSB1dGlscy5jb252ZXJ0KCB0ZXh0dXJlLmZvcm1hdCApOwoKICAgIAkJdGV4dHVyZXMuc2V0VGV4dHVyZTJEKCB0ZXh0dXJlLCAwICk7CgogICAgCQlfZ2wuY29weVRleEltYWdlMkQoIDM1NTMsIGxldmVsIHx8IDAsIGdsRm9ybWF0LCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCB3aWR0aCwgaGVpZ2h0LCAwICk7CgogICAgCX07CgogICAgCXRoaXMuY29weVRleHR1cmVUb1RleHR1cmUgPSBmdW5jdGlvbiAoIHBvc2l0aW9uLCBzcmNUZXh0dXJlLCBkc3RUZXh0dXJlLCBsZXZlbCApIHsKCiAgICAJCXZhciB3aWR0aCA9IHNyY1RleHR1cmUuaW1hZ2Uud2lkdGg7CiAgICAJCXZhciBoZWlnaHQgPSBzcmNUZXh0dXJlLmltYWdlLmhlaWdodDsKICAgIAkJdmFyIGdsRm9ybWF0ID0gdXRpbHMuY29udmVydCggZHN0VGV4dHVyZS5mb3JtYXQgKTsKICAgIAkJdmFyIGdsVHlwZSA9IHV0aWxzLmNvbnZlcnQoIGRzdFRleHR1cmUudHlwZSApOwoKICAgIAkJdGV4dHVyZXMuc2V0VGV4dHVyZTJEKCBkc3RUZXh0dXJlLCAwICk7CgogICAgCQlpZiAoIHNyY1RleHR1cmUuaXNEYXRhVGV4dHVyZSApIHsKCiAgICAJCQlfZ2wudGV4U3ViSW1hZ2UyRCggMzU1MywgbGV2ZWwgfHwgMCwgcG9zaXRpb24ueCwgcG9zaXRpb24ueSwgd2lkdGgsIGhlaWdodCwgZ2xGb3JtYXQsIGdsVHlwZSwgc3JjVGV4dHVyZS5pbWFnZS5kYXRhICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCV9nbC50ZXhTdWJJbWFnZTJEKCAzNTUzLCBsZXZlbCB8fCAwLCBwb3NpdGlvbi54LCBwb3NpdGlvbi55LCBnbEZvcm1hdCwgZ2xUeXBlLCBzcmNUZXh0dXJlLmltYWdlICk7CgogICAgCQl9CgogICAgCX07CgogICAgCWlmICggdHlwZW9mIF9fVEhSRUVfREVWVE9PTFNfXyAhPT0gJ3VuZGVmaW5lZCcgKSB7CgogICAgCQlfX1RIUkVFX0RFVlRPT0xTX18uZGlzcGF0Y2hFdmVudCggbmV3IEN1c3RvbUV2ZW50KCAnb2JzZXJ2ZScsIHsgZGV0YWlsOiB0aGlzIH0gKSApOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmCgogICAgCX0KCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIEZvZ0V4cDIoIGNvbG9yLCBkZW5zaXR5ICkgewoKICAgIAl0aGlzLm5hbWUgPSAnJzsKCiAgICAJdGhpcy5jb2xvciA9IG5ldyBDb2xvciQ3KCBjb2xvciApOwogICAgCXRoaXMuZGVuc2l0eSA9ICggZGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgPyBkZW5zaXR5IDogMC4wMDAyNTsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggRm9nRXhwMi5wcm90b3R5cGUsIHsKCiAgICAJaXNGb2dFeHAyOiB0cnVlLAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyBGb2dFeHAyKCB0aGlzLmNvbG9yLCB0aGlzLmRlbnNpdHkgKTsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7CgogICAgCQlyZXR1cm4gewogICAgCQkJdHlwZTogJ0ZvZ0V4cDInLAogICAgCQkJY29sb3I6IHRoaXMuY29sb3IuZ2V0SGV4KCksCiAgICAJCQlkZW5zaXR5OiB0aGlzLmRlbnNpdHkKICAgIAkJfTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gRm9nKCBjb2xvciwgbmVhciwgZmFyICkgewoKICAgIAl0aGlzLm5hbWUgPSAnJzsKCiAgICAJdGhpcy5jb2xvciA9IG5ldyBDb2xvciQ3KCBjb2xvciApOwoKICAgIAl0aGlzLm5lYXIgPSAoIG5lYXIgIT09IHVuZGVmaW5lZCApID8gbmVhciA6IDE7CiAgICAJdGhpcy5mYXIgPSAoIGZhciAhPT0gdW5kZWZpbmVkICkgPyBmYXIgOiAxMDAwOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBGb2cucHJvdG90eXBlLCB7CgogICAgCWlzRm9nOiB0cnVlLAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyBGb2coIHRoaXMuY29sb3IsIHRoaXMubmVhciwgdGhpcy5mYXIgKTsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoIC8qIG1ldGEgKi8gKSB7CgogICAgCQlyZXR1cm4gewogICAgCQkJdHlwZTogJ0ZvZycsCiAgICAJCQljb2xvcjogdGhpcy5jb2xvci5nZXRIZXgoKSwKICAgIAkJCW5lYXI6IHRoaXMubmVhciwKICAgIAkJCWZhcjogdGhpcy5mYXIKICAgIAkJfTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwogICAgICovCgogICAgZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUgKSB7CgogICAgCXRoaXMuYXJyYXkgPSBhcnJheTsKICAgIAl0aGlzLnN0cmlkZSA9IHN0cmlkZTsKICAgIAl0aGlzLmNvdW50ID0gYXJyYXkgIT09IHVuZGVmaW5lZCA/IGFycmF5Lmxlbmd0aCAvIHN0cmlkZSA6IDA7CgogICAgCXRoaXMuZHluYW1pYyA9IGZhbHNlOwogICAgCXRoaXMudXBkYXRlUmFuZ2UgPSB7IG9mZnNldDogMCwgY291bnQ6IC0gMSB9OwoKICAgIAl0aGlzLnZlcnNpb24gPSAwOwoKICAgIH0KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgJ25lZWRzVXBkYXRlJywgewoKICAgIAlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQlpZiAoIHZhbHVlID09PSB0cnVlICkgdGhpcy52ZXJzaW9uICsrOwoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyLnByb3RvdHlwZSwgewoKICAgIAlpc0ludGVybGVhdmVkQnVmZmVyOiB0cnVlLAoKICAgIAlvblVwbG9hZENhbGxiYWNrOiBmdW5jdGlvbiAoKSB7fSwKCiAgICAJc2V0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXkgKSB7CgogICAgCQlpZiAoIEFycmF5LmlzQXJyYXkoIGFycmF5ICkgKSB7CgogICAgCQkJdGhyb3cgbmV3IFR5cGVFcnJvciggJ1RIUkVFLkJ1ZmZlckF0dHJpYnV0ZTogYXJyYXkgc2hvdWxkIGJlIGEgVHlwZWQgQXJyYXkuJyApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5jb3VudCA9IGFycmF5ICE9PSB1bmRlZmluZWQgPyBhcnJheS5sZW5ndGggLyB0aGlzLnN0cmlkZSA6IDA7CiAgICAJCXRoaXMuYXJyYXkgPSBhcnJheTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXREeW5hbWljOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5keW5hbWljID0gdmFsdWU7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQl0aGlzLmFycmF5ID0gbmV3IHNvdXJjZS5hcnJheS5jb25zdHJ1Y3Rvciggc291cmNlLmFycmF5ICk7CiAgICAJCXRoaXMuY291bnQgPSBzb3VyY2UuY291bnQ7CiAgICAJCXRoaXMuc3RyaWRlID0gc291cmNlLnN0cmlkZTsKICAgIAkJdGhpcy5keW5hbWljID0gc291cmNlLmR5bmFtaWM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29weUF0OiBmdW5jdGlvbiAoIGluZGV4MSwgYXR0cmlidXRlLCBpbmRleDIgKSB7CgogICAgCQlpbmRleDEgKj0gdGhpcy5zdHJpZGU7CiAgICAJCWluZGV4MiAqPSBhdHRyaWJ1dGUuc3RyaWRlOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5zdHJpZGU7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXRoaXMuYXJyYXlbIGluZGV4MSArIGkgXSA9IGF0dHJpYnV0ZS5hcnJheVsgaW5kZXgyICsgaSBdOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldDogZnVuY3Rpb24gKCB2YWx1ZSwgb2Zmc2V0ICkgewoKICAgIAkJaWYgKCBvZmZzZXQgPT09IHVuZGVmaW5lZCApIG9mZnNldCA9IDA7CgogICAgCQl0aGlzLmFycmF5LnNldCggdmFsdWUsIG9mZnNldCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCW9uVXBsb2FkOiBmdW5jdGlvbiAoIGNhbGxiYWNrICkgewoKICAgIAkJdGhpcy5vblVwbG9hZENhbGxiYWNrID0gY2FsbGJhY2s7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwogICAgICovCgogICAgZnVuY3Rpb24gSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCBpdGVtU2l6ZSwgb2Zmc2V0LCBub3JtYWxpemVkICkgewoKICAgIAl0aGlzLmRhdGEgPSBpbnRlcmxlYXZlZEJ1ZmZlcjsKICAgIAl0aGlzLml0ZW1TaXplID0gaXRlbVNpemU7CiAgICAJdGhpcy5vZmZzZXQgPSBvZmZzZXQ7CgogICAgCXRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQgPT09IHRydWU7CgogICAgfQoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBJbnRlcmxlYXZlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUsIHsKCiAgICAJY291bnQ6IHsKCiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCXJldHVybiB0aGlzLmRhdGEuY291bnQ7CgogICAgCQl9CgogICAgCX0sCgogICAgCWFycmF5OiB7CgogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy5kYXRhLmFycmF5OwoKICAgIAkJfQoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZSwgewoKICAgIAlpc0ludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlOiB0cnVlLAoKICAgIAlzZXRYOiBmdW5jdGlvbiAoIGluZGV4LCB4ICkgewoKICAgIAkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCBdID0geDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRZOiBmdW5jdGlvbiAoIGluZGV4LCB5ICkgewoKICAgIAkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDEgXSA9IHk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0WjogZnVuY3Rpb24gKCBpbmRleCwgeiApIHsKCiAgICAJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF0gPSB6OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFc6IGZ1bmN0aW9uICggaW5kZXgsIHcgKSB7CgogICAgCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMyBdID0gdzsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRYOiBmdW5jdGlvbiAoIGluZGV4ICkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgXTsKCiAgICAJfSwKCiAgICAJZ2V0WTogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCXJldHVybiB0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0ICsgMSBdOwoKICAgIAl9LAoKICAgIAlnZXRaOiBmdW5jdGlvbiAoIGluZGV4ICkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGF0YS5hcnJheVsgaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQgKyAyIF07CgogICAgCX0sCgogICAgCWdldFc6IGZ1bmN0aW9uICggaW5kZXggKSB7CgogICAgCQlyZXR1cm4gdGhpcy5kYXRhLmFycmF5WyBpbmRleCAqIHRoaXMuZGF0YS5zdHJpZGUgKyB0aGlzLm9mZnNldCArIDMgXTsKCiAgICAJfSwKCiAgICAJc2V0WFk6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHkgKSB7CgogICAgCQlpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OwoKICAgIAkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CiAgICAJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFhZWjogZnVuY3Rpb24gKCBpbmRleCwgeCwgeSwgeiApIHsKCiAgICAJCWluZGV4ID0gaW5kZXggKiB0aGlzLmRhdGEuc3RyaWRlICsgdGhpcy5vZmZzZXQ7CgogICAgCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMCBdID0geDsKICAgIAkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDEgXSA9IHk7CiAgICAJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAyIF0gPSB6OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFhZWlc6IGZ1bmN0aW9uICggaW5kZXgsIHgsIHksIHosIHcgKSB7CgogICAgCQlpbmRleCA9IGluZGV4ICogdGhpcy5kYXRhLnN0cmlkZSArIHRoaXMub2Zmc2V0OwoKICAgIAkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDAgXSA9IHg7CiAgICAJCXRoaXMuZGF0YS5hcnJheVsgaW5kZXggKyAxIF0gPSB5OwogICAgCQl0aGlzLmRhdGEuYXJyYXlbIGluZGV4ICsgMiBdID0gejsKICAgIAkJdGhpcy5kYXRhLmFycmF5WyBpbmRleCArIDMgXSA9IHc7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBjb2xvcjogPGhleD4sCiAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogIHJvdGF0aW9uOiA8ZmxvYXQ+LAogICAgICogIHNpemVBdHRlbnVhdGlvbjogPGJvb2w+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBTcHJpdGVNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCiAgICAJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnU3ByaXRlTWF0ZXJpYWwnOwoKICAgIAl0aGlzLmNvbG9yID0gbmV3IENvbG9yJDcoIDB4ZmZmZmZmICk7CiAgICAJdGhpcy5tYXAgPSBudWxsOwoKICAgIAl0aGlzLnJvdGF0aW9uID0gMDsKCiAgICAJdGhpcy5zaXplQXR0ZW51YXRpb24gPSB0cnVlOwoKICAgIAl0aGlzLmxpZ2h0cyA9IGZhbHNlOwogICAgCXRoaXMudHJhbnNwYXJlbnQgPSB0cnVlOwoKICAgIAl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKICAgIH0KCiAgICBTcHJpdGVNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIFNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwcml0ZU1hdGVyaWFsOwogICAgU3ByaXRlTWF0ZXJpYWwucHJvdG90eXBlLmlzU3ByaXRlTWF0ZXJpYWwgPSB0cnVlOwoKICAgIFNwcml0ZU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwogICAgCXRoaXMubWFwID0gc291cmNlLm1hcDsKCiAgICAJdGhpcy5yb3RhdGlvbiA9IHNvdXJjZS5yb3RhdGlvbjsKCiAgICAJdGhpcy5zaXplQXR0ZW51YXRpb24gPSBzb3VyY2Uuc2l6ZUF0dGVudWF0aW9uOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKi8KCiAgICB2YXIgX2dlb21ldHJ5OwoKICAgIHZhciBfaW50ZXJzZWN0UG9pbnQgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF93b3JsZFNjYWxlID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbXZQb3NpdGlvbiA9IG5ldyBWZWN0b3IzKCk7CgogICAgdmFyIF9hbGlnbmVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMigpOwogICAgdmFyIF9yb3RhdGVkUG9zaXRpb24gPSBuZXcgVmVjdG9yMigpOwogICAgdmFyIF92aWV3V29ybGRNYXRyaXggPSBuZXcgTWF0cml4NCgpOwoKICAgIHZhciBfdkEkMSA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3ZCJDEgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF92QyQxID0gbmV3IFZlY3RvcjMoKTsKCiAgICB2YXIgX3V2QSQxID0gbmV3IFZlY3RvcjIoKTsKICAgIHZhciBfdXZCJDEgPSBuZXcgVmVjdG9yMigpOwogICAgdmFyIF91dkMkMSA9IG5ldyBWZWN0b3IyKCk7CgogICAgZnVuY3Rpb24gU3ByaXRlKCBtYXRlcmlhbCApIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnU3ByaXRlJzsKCiAgICAJaWYgKCBfZ2VvbWV0cnkgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCV9nZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoKICAgIAkJdmFyIGZsb2F0MzJBcnJheSA9IG5ldyBGbG9hdDMyQXJyYXkoIFsKICAgIAkJCS0gMC41LCAtIDAuNSwgMCwgMCwgMCwKICAgIAkJCTAuNSwgLSAwLjUsIDAsIDEsIDAsCiAgICAJCQkwLjUsIDAuNSwgMCwgMSwgMSwKICAgIAkJCS0gMC41LCAwLjUsIDAsIDAsIDEKICAgIAkJXSApOwoKICAgIAkJdmFyIGludGVybGVhdmVkQnVmZmVyID0gbmV3IEludGVybGVhdmVkQnVmZmVyKCBmbG9hdDMyQXJyYXksIDUgKTsKCiAgICAJCV9nZW9tZXRyeS5zZXRJbmRleCggWyAwLCAxLCAyLAkwLCAyLCAzIF0gKTsKICAgIAkJX2dlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlKCBpbnRlcmxlYXZlZEJ1ZmZlciwgMywgMCwgZmFsc2UgKSApOwogICAgCQlfZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGUoIGludGVybGVhdmVkQnVmZmVyLCAyLCAzLCBmYWxzZSApICk7CgogICAgCX0KCiAgICAJdGhpcy5nZW9tZXRyeSA9IF9nZW9tZXRyeTsKICAgIAl0aGlzLm1hdGVyaWFsID0gKCBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkICkgPyBtYXRlcmlhbCA6IG5ldyBTcHJpdGVNYXRlcmlhbCgpOwoKICAgIAl0aGlzLmNlbnRlciA9IG5ldyBWZWN0b3IyKCAwLjUsIDAuNSApOwoKICAgIH0KCiAgICBTcHJpdGUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFNwcml0ZSwKCiAgICAJaXNTcHJpdGU6IHRydWUsCgogICAgCXJheWNhc3Q6IGZ1bmN0aW9uICggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgewoKICAgIAkJaWYgKCByYXljYXN0ZXIuY2FtZXJhID09PSBudWxsICkgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcHJpdGU6ICJSYXljYXN0ZXIuY2FtZXJhIiBuZWVkcyB0byBiZSBzZXQgaW4gb3JkZXIgdG8gcmF5Y2FzdCBhZ2FpbnN0IHNwcml0ZXMuJyApOwoKICAgIAkJfQoKICAgIAkJX3dvcmxkU2NhbGUuc2V0RnJvbU1hdHJpeFNjYWxlKCB0aGlzLm1hdHJpeFdvcmxkICk7CgogICAgCQlfdmlld1dvcmxkTWF0cml4LmNvcHkoIHJheWNhc3Rlci5jYW1lcmEubWF0cml4V29ybGQgKTsKICAgIAkJdGhpcy5tb2RlbFZpZXdNYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggcmF5Y2FzdGVyLmNhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UsIHRoaXMubWF0cml4V29ybGQgKTsKCiAgICAJCV9tdlBvc2l0aW9uLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tb2RlbFZpZXdNYXRyaXggKTsKCiAgICAJCWlmICggcmF5Y2FzdGVyLmNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICYmIHRoaXMubWF0ZXJpYWwuc2l6ZUF0dGVudWF0aW9uID09PSBmYWxzZSApIHsKCiAgICAJCQlfd29ybGRTY2FsZS5tdWx0aXBseVNjYWxhciggLSBfbXZQb3NpdGlvbi56ICk7CgogICAgCQl9CgogICAgCQl2YXIgcm90YXRpb24gPSB0aGlzLm1hdGVyaWFsLnJvdGF0aW9uOwogICAgCQl2YXIgc2luLCBjb3M7CiAgICAJCWlmICggcm90YXRpb24gIT09IDAgKSB7CgogICAgCQkJY29zID0gTWF0aC5jb3MoIHJvdGF0aW9uICk7CiAgICAJCQlzaW4gPSBNYXRoLnNpbiggcm90YXRpb24gKTsKCiAgICAJCX0KCiAgICAJCXZhciBjZW50ZXIgPSB0aGlzLmNlbnRlcjsKCiAgICAJCXRyYW5zZm9ybVZlcnRleCggX3ZBJDEuc2V0KCAtIDAuNSwgLSAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7CiAgICAJCXRyYW5zZm9ybVZlcnRleCggX3ZCJDEuc2V0KCAwLjUsIC0gMC41LCAwICksIF9tdlBvc2l0aW9uLCBjZW50ZXIsIF93b3JsZFNjYWxlLCBzaW4sIGNvcyApOwogICAgCQl0cmFuc2Zvcm1WZXJ0ZXgoIF92QyQxLnNldCggMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7CgogICAgCQlfdXZBJDEuc2V0KCAwLCAwICk7CiAgICAJCV91dkIkMS5zZXQoIDEsIDAgKTsKICAgIAkJX3V2QyQxLnNldCggMSwgMSApOwoKICAgIAkJLy8gY2hlY2sgZmlyc3QgdHJpYW5nbGUKICAgIAkJdmFyIGludGVyc2VjdCA9IHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0VHJpYW5nbGUoIF92QSQxLCBfdkIkMSwgX3ZDJDEsIGZhbHNlLCBfaW50ZXJzZWN0UG9pbnQgKTsKCiAgICAJCWlmICggaW50ZXJzZWN0ID09PSBudWxsICkgewoKICAgIAkJCS8vIGNoZWNrIHNlY29uZCB0cmlhbmdsZQogICAgCQkJdHJhbnNmb3JtVmVydGV4KCBfdkIkMS5zZXQoIC0gMC41LCAwLjUsIDAgKSwgX212UG9zaXRpb24sIGNlbnRlciwgX3dvcmxkU2NhbGUsIHNpbiwgY29zICk7CiAgICAJCQlfdXZCJDEuc2V0KCAwLCAxICk7CgogICAgCQkJaW50ZXJzZWN0ID0gcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RUcmlhbmdsZSggX3ZBJDEsIF92QyQxLCBfdkIkMSwgZmFsc2UsIF9pbnRlcnNlY3RQb2ludCApOwogICAgCQkJaWYgKCBpbnRlcnNlY3QgPT09IG51bGwgKSB7CgogICAgCQkJCXJldHVybjsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfaW50ZXJzZWN0UG9pbnQgKTsKCiAgICAJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47CgogICAgCQlpbnRlcnNlY3RzLnB1c2goIHsKCiAgICAJCQlkaXN0YW5jZTogZGlzdGFuY2UsCiAgICAJCQlwb2ludDogX2ludGVyc2VjdFBvaW50LmNsb25lKCksCiAgICAJCQl1djogVHJpYW5nbGUuZ2V0VVYoIF9pbnRlcnNlY3RQb2ludCwgX3ZBJDEsIF92QiQxLCBfdkMkMSwgX3V2QSQxLCBfdXZCJDEsIF91dkMkMSwgbmV3IFZlY3RvcjIoKSApLAogICAgCQkJZmFjZTogbnVsbCwKICAgIAkJCW9iamVjdDogdGhpcwoKICAgIAkJfSApOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAkJaWYgKCBzb3VyY2UuY2VudGVyICE9PSB1bmRlZmluZWQgKSB0aGlzLmNlbnRlci5jb3B5KCBzb3VyY2UuY2VudGVyICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKCiAgICB9ICk7CgogICAgZnVuY3Rpb24gdHJhbnNmb3JtVmVydGV4KCB2ZXJ0ZXhQb3NpdGlvbiwgbXZQb3NpdGlvbiwgY2VudGVyLCBzY2FsZSwgc2luLCBjb3MgKSB7CgogICAgCS8vIGNvbXB1dGUgcG9zaXRpb24gaW4gY2FtZXJhIHNwYWNlCiAgICAJX2FsaWduZWRQb3NpdGlvbi5zdWJWZWN0b3JzKCB2ZXJ0ZXhQb3NpdGlvbiwgY2VudGVyICkuYWRkU2NhbGFyKCAwLjUgKS5tdWx0aXBseSggc2NhbGUgKTsKCiAgICAJLy8gdG8gY2hlY2sgaWYgcm90YXRpb24gaXMgbm90IHplcm8KICAgIAlpZiAoIHNpbiAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJX3JvdGF0ZWRQb3NpdGlvbi54ID0gKCBjb3MgKiBfYWxpZ25lZFBvc2l0aW9uLnggKSAtICggc2luICogX2FsaWduZWRQb3NpdGlvbi55ICk7CiAgICAJCV9yb3RhdGVkUG9zaXRpb24ueSA9ICggc2luICogX2FsaWduZWRQb3NpdGlvbi54ICkgKyAoIGNvcyAqIF9hbGlnbmVkUG9zaXRpb24ueSApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJX3JvdGF0ZWRQb3NpdGlvbi5jb3B5KCBfYWxpZ25lZFBvc2l0aW9uICk7CgogICAgCX0KCgogICAgCXZlcnRleFBvc2l0aW9uLmNvcHkoIG12UG9zaXRpb24gKTsKICAgIAl2ZXJ0ZXhQb3NpdGlvbi54ICs9IF9yb3RhdGVkUG9zaXRpb24ueDsKICAgIAl2ZXJ0ZXhQb3NpdGlvbi55ICs9IF9yb3RhdGVkUG9zaXRpb24ueTsKCiAgICAJLy8gdHJhbnNmb3JtIHRvIHdvcmxkIHNwYWNlCiAgICAJdmVydGV4UG9zaXRpb24uYXBwbHlNYXRyaXg0KCBfdmlld1dvcmxkTWF0cml4ICk7CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgdmFyIF92MSQ0ID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfdjIkMiA9IG5ldyBWZWN0b3IzKCk7CgogICAgZnVuY3Rpb24gTE9EKCkgewoKICAgIAlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdMT0QnOwoKICAgIAlPYmplY3QuZGVmaW5lUHJvcGVydGllcyggdGhpcywgewogICAgCQlsZXZlbHM6IHsKICAgIAkJCWVudW1lcmFibGU6IHRydWUsCiAgICAJCQl2YWx1ZTogW10KICAgIAkJfQogICAgCX0gKTsKCiAgICAJdGhpcy5hdXRvVXBkYXRlID0gdHJ1ZTsKCiAgICB9CgogICAgTE9ELnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBMT0QsCgogICAgCWlzTE9EOiB0cnVlLAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTsKCiAgICAJCXZhciBsZXZlbHMgPSBzb3VyY2UubGV2ZWxzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gbGV2ZWxzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGxldmVsID0gbGV2ZWxzWyBpIF07CgogICAgCQkJdGhpcy5hZGRMZXZlbCggbGV2ZWwub2JqZWN0LmNsb25lKCksIGxldmVsLmRpc3RhbmNlICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJYWRkTGV2ZWw6IGZ1bmN0aW9uICggb2JqZWN0LCBkaXN0YW5jZSApIHsKCiAgICAJCWlmICggZGlzdGFuY2UgPT09IHVuZGVmaW5lZCApIGRpc3RhbmNlID0gMDsKCiAgICAJCWRpc3RhbmNlID0gTWF0aC5hYnMoIGRpc3RhbmNlICk7CgogICAgCQl2YXIgbGV2ZWxzID0gdGhpcy5sZXZlbHM7CgogICAgCQlmb3IgKCB2YXIgbCA9IDA7IGwgPCBsZXZlbHMubGVuZ3RoOyBsICsrICkgewoKICAgIAkJCWlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGwgXS5kaXN0YW5jZSApIHsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJbGV2ZWxzLnNwbGljZSggbCwgMCwgeyBkaXN0YW5jZTogZGlzdGFuY2UsIG9iamVjdDogb2JqZWN0IH0gKTsKCiAgICAJCXRoaXMuYWRkKCBvYmplY3QgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRPYmplY3RGb3JEaXN0YW5jZTogZnVuY3Rpb24gKCBkaXN0YW5jZSApIHsKCiAgICAJCXZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKCiAgICAJCWZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCWlmICggZGlzdGFuY2UgPCBsZXZlbHNbIGkgXS5kaXN0YW5jZSApIHsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGxldmVsc1sgaSAtIDEgXS5vYmplY3Q7CgogICAgCX0sCgogICAgCXJheWNhc3Q6IGZ1bmN0aW9uICggcmF5Y2FzdGVyLCBpbnRlcnNlY3RzICkgewoKICAgIAkJX3YxJDQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLm1hdHJpeFdvcmxkICk7CgogICAgCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBfdjEkNCApOwoKICAgIAkJdGhpcy5nZXRPYmplY3RGb3JEaXN0YW5jZSggZGlzdGFuY2UgKS5yYXljYXN0KCByYXljYXN0ZXIsIGludGVyc2VjdHMgKTsKCiAgICAJfSwKCiAgICAJdXBkYXRlOiBmdW5jdGlvbiAoIGNhbWVyYSApIHsKCiAgICAJCXZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKCiAgICAJCWlmICggbGV2ZWxzLmxlbmd0aCA+IDEgKSB7CgogICAgCQkJX3YxJDQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBjYW1lcmEubWF0cml4V29ybGQgKTsKICAgIAkJCV92MiQyLnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5tYXRyaXhXb3JsZCApOwoKICAgIAkJCXZhciBkaXN0YW5jZSA9IF92MSQ0LmRpc3RhbmNlVG8oIF92MiQyICk7CgogICAgCQkJbGV2ZWxzWyAwIF0ub2JqZWN0LnZpc2libGUgPSB0cnVlOwoKICAgIAkJCWZvciAoIHZhciBpID0gMSwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQlpZiAoIGRpc3RhbmNlID49IGxldmVsc1sgaSBdLmRpc3RhbmNlICkgewoKICAgIAkJCQkJbGV2ZWxzWyBpIC0gMSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7CiAgICAJCQkJCWxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gdHJ1ZTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCWZvciAoIDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCWxldmVsc1sgaSBdLm9iamVjdC52aXNpYmxlID0gZmFsc2U7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCiAgICAJCXZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQlkYXRhLm9iamVjdC5sZXZlbHMgPSBbXTsKCiAgICAJCXZhciBsZXZlbHMgPSB0aGlzLmxldmVsczsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGxldmVscy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBsZXZlbCA9IGxldmVsc1sgaSBdOwoKICAgIAkJCWRhdGEub2JqZWN0LmxldmVscy5wdXNoKCB7CiAgICAJCQkJb2JqZWN0OiBsZXZlbC5vYmplY3QudXVpZCwKICAgIAkJCQlkaXN0YW5jZTogbGV2ZWwuZGlzdGFuY2UKICAgIAkJCX0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtaWthZWwgZW10aW5nZXIgLyBodHRwOi8vZ29tby5zZS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KICAgICAqLwoKICAgIGZ1bmN0aW9uIFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CgogICAgCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Ta2lubmVkTWVzaCBubyBsb25nZXIgc3VwcG9ydHMgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTsKCiAgICAJfQoKICAgIAlNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKICAgIAl0aGlzLnR5cGUgPSAnU2tpbm5lZE1lc2gnOwoKICAgIAl0aGlzLmJpbmRNb2RlID0gJ2F0dGFjaGVkJzsKICAgIAl0aGlzLmJpbmRNYXRyaXggPSBuZXcgTWF0cml4NCgpOwogICAgCXRoaXMuYmluZE1hdHJpeEludmVyc2UgPSBuZXcgTWF0cml4NCgpOwoKICAgIH0KCiAgICBTa2lubmVkTWVzaC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBNZXNoLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBTa2lubmVkTWVzaCwKCiAgICAJaXNTa2lubmVkTWVzaDogdHJ1ZSwKCiAgICAJYmluZDogZnVuY3Rpb24gKCBza2VsZXRvbiwgYmluZE1hdHJpeCApIHsKCiAgICAJCXRoaXMuc2tlbGV0b24gPSBza2VsZXRvbjsKCiAgICAJCWlmICggYmluZE1hdHJpeCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXRoaXMudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCiAgICAJCQl0aGlzLnNrZWxldG9uLmNhbGN1bGF0ZUludmVyc2VzKCk7CgogICAgCQkJYmluZE1hdHJpeCA9IHRoaXMubWF0cml4V29ybGQ7CgogICAgCQl9CgogICAgCQl0aGlzLmJpbmRNYXRyaXguY29weSggYmluZE1hdHJpeCApOwogICAgCQl0aGlzLmJpbmRNYXRyaXhJbnZlcnNlLmdldEludmVyc2UoIGJpbmRNYXRyaXggKTsKCiAgICAJfSwKCiAgICAJcG9zZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5za2VsZXRvbi5wb3NlKCk7CgogICAgCX0sCgogICAgCW5vcm1hbGl6ZVNraW5XZWlnaHRzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdmVjdG9yID0gbmV3IFZlY3RvcjQoKTsKCiAgICAJCXZhciBza2luV2VpZ2h0ID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnNraW5XZWlnaHQ7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBza2luV2VpZ2h0LmNvdW50OyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2ZWN0b3IueCA9IHNraW5XZWlnaHQuZ2V0WCggaSApOwogICAgCQkJdmVjdG9yLnkgPSBza2luV2VpZ2h0LmdldFkoIGkgKTsKICAgIAkJCXZlY3Rvci56ID0gc2tpbldlaWdodC5nZXRaKCBpICk7CiAgICAJCQl2ZWN0b3IudyA9IHNraW5XZWlnaHQuZ2V0VyggaSApOwoKICAgIAkJCXZhciBzY2FsZSA9IDEuMCAvIHZlY3Rvci5tYW5oYXR0YW5MZW5ndGgoKTsKCiAgICAJCQlpZiAoIHNjYWxlICE9PSBJbmZpbml0eSApIHsKCiAgICAJCQkJdmVjdG9yLm11bHRpcGx5U2NhbGFyKCBzY2FsZSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXZlY3Rvci5zZXQoIDEsIDAsIDAsIDAgKTsgLy8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGUKCiAgICAJCQl9CgogICAgCQkJc2tpbldlaWdodC5zZXRYWVpXKCBpLCB2ZWN0b3IueCwgdmVjdG9yLnksIHZlY3Rvci56LCB2ZWN0b3IudyApOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl1cGRhdGVNYXRyaXhXb3JsZDogZnVuY3Rpb24gKCBmb3JjZSApIHsKCiAgICAJCU1lc2gucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgogICAgCQlpZiAoIHRoaXMuYmluZE1vZGUgPT09ICdhdHRhY2hlZCcgKSB7CgogICAgCQkJdGhpcy5iaW5kTWF0cml4SW52ZXJzZS5nZXRJbnZlcnNlKCB0aGlzLm1hdHJpeFdvcmxkICk7CgogICAgCQl9IGVsc2UgaWYgKCB0aGlzLmJpbmRNb2RlID09PSAnZGV0YWNoZWQnICkgewoKICAgIAkJCXRoaXMuYmluZE1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5iaW5kTWF0cml4ICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNraW5uZWRNZXNoOiBVbnJlY29nbml6ZWQgYmluZE1vZGU6ICcgKyB0aGlzLmJpbmRNb2RlICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgbWljaGFlbCBndWVycmVybyAvIGh0dHA6Ly9yZWFsaXR5bWVsdGRvd24uY29tCiAgICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KICAgICAqLwoKICAgIHZhciBfb2Zmc2V0TWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKICAgIHZhciBfaWRlbnRpdHlNYXRyaXggPSBuZXcgTWF0cml4NCgpOwoKICAgIGZ1bmN0aW9uIFNrZWxldG9uKCBib25lcywgYm9uZUludmVyc2VzICkgewoKICAgIAkvLyBjb3B5IHRoZSBib25lIGFycmF5CgogICAgCWJvbmVzID0gYm9uZXMgfHwgW107CgogICAgCXRoaXMuYm9uZXMgPSBib25lcy5zbGljZSggMCApOwogICAgCXRoaXMuYm9uZU1hdHJpY2VzID0gbmV3IEZsb2F0MzJBcnJheSggdGhpcy5ib25lcy5sZW5ndGggKiAxNiApOwoKICAgIAkvLyB1c2UgdGhlIHN1cHBsaWVkIGJvbmUgaW52ZXJzZXMgb3IgY2FsY3VsYXRlIHRoZSBpbnZlcnNlcwoKICAgIAlpZiAoIGJvbmVJbnZlcnNlcyA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJdGhpcy5jYWxjdWxhdGVJbnZlcnNlcygpOwoKICAgIAl9IGVsc2UgewoKICAgIAkJaWYgKCB0aGlzLmJvbmVzLmxlbmd0aCA9PT0gYm9uZUludmVyc2VzLmxlbmd0aCApIHsKCiAgICAJCQl0aGlzLmJvbmVJbnZlcnNlcyA9IGJvbmVJbnZlcnNlcy5zbGljZSggMCApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbiBib25lSW52ZXJzZXMgaXMgdGhlIHdyb25nIGxlbmd0aC4nICk7CgogICAgCQkJdGhpcy5ib25lSW52ZXJzZXMgPSBbXTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJdGhpcy5ib25lSW52ZXJzZXMucHVzaCggbmV3IE1hdHJpeDQoKSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfQoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBTa2VsZXRvbi5wcm90b3R5cGUsIHsKCiAgICAJY2FsY3VsYXRlSW52ZXJzZXM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMuYm9uZUludmVyc2VzID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl2YXIgaW52ZXJzZSA9IG5ldyBNYXRyaXg0KCk7CgogICAgCQkJaWYgKCB0aGlzLmJvbmVzWyBpIF0gKSB7CgogICAgCQkJCWludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5ib25lc1sgaSBdLm1hdHJpeFdvcmxkICk7CgogICAgCQkJfQoKICAgIAkJCXRoaXMuYm9uZUludmVyc2VzLnB1c2goIGludmVyc2UgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJcG9zZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGJvbmUsIGksIGlsOwoKICAgIAkJLy8gcmVjb3ZlciB0aGUgYmluZC10aW1lIHdvcmxkIG1hdHJpY2VzCgogICAgCQlmb3IgKCBpID0gMCwgaWwgPSB0aGlzLmJvbmVzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCWJvbmUgPSB0aGlzLmJvbmVzWyBpIF07CgogICAgCQkJaWYgKCBib25lICkgewoKICAgIAkJCQlib25lLm1hdHJpeFdvcmxkLmdldEludmVyc2UoIHRoaXMuYm9uZUludmVyc2VzWyBpIF0gKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBjb21wdXRlIHRoZSBsb2NhbCBtYXRyaWNlcywgcG9zaXRpb25zLCByb3RhdGlvbnMgYW5kIHNjYWxlcwoKICAgIAkJZm9yICggaSA9IDAsIGlsID0gdGhpcy5ib25lcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQlib25lID0gdGhpcy5ib25lc1sgaSBdOwoKICAgIAkJCWlmICggYm9uZSApIHsKCiAgICAJCQkJaWYgKCBib25lLnBhcmVudCAmJiBib25lLnBhcmVudC5pc0JvbmUgKSB7CgogICAgCQkJCQlib25lLm1hdHJpeC5nZXRJbnZlcnNlKCBib25lLnBhcmVudC5tYXRyaXhXb3JsZCApOwogICAgCQkJCQlib25lLm1hdHJpeC5tdWx0aXBseSggYm9uZS5tYXRyaXhXb3JsZCApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJYm9uZS5tYXRyaXguY29weSggYm9uZS5tYXRyaXhXb3JsZCApOwoKICAgIAkJCQl9CgogICAgCQkJCWJvbmUubWF0cml4LmRlY29tcG9zZSggYm9uZS5wb3NpdGlvbiwgYm9uZS5xdWF0ZXJuaW9uLCBib25lLnNjYWxlICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9LAoKICAgIAl1cGRhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBib25lcyA9IHRoaXMuYm9uZXM7CiAgICAJCXZhciBib25lSW52ZXJzZXMgPSB0aGlzLmJvbmVJbnZlcnNlczsKICAgIAkJdmFyIGJvbmVNYXRyaWNlcyA9IHRoaXMuYm9uZU1hdHJpY2VzOwogICAgCQl2YXIgYm9uZVRleHR1cmUgPSB0aGlzLmJvbmVUZXh0dXJlOwoKICAgIAkJLy8gZmxhdHRlbiBib25lIG1hdHJpY2VzIHRvIGFycmF5CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJLy8gY29tcHV0ZSB0aGUgb2Zmc2V0IGJldHdlZW4gdGhlIGN1cnJlbnQgYW5kIHRoZSBvcmlnaW5hbCB0cmFuc2Zvcm0KCiAgICAJCQl2YXIgbWF0cml4ID0gYm9uZXNbIGkgXSA/IGJvbmVzWyBpIF0ubWF0cml4V29ybGQgOiBfaWRlbnRpdHlNYXRyaXg7CgogICAgCQkJX29mZnNldE1hdHJpeC5tdWx0aXBseU1hdHJpY2VzKCBtYXRyaXgsIGJvbmVJbnZlcnNlc1sgaSBdICk7CiAgICAJCQlfb2Zmc2V0TWF0cml4LnRvQXJyYXkoIGJvbmVNYXRyaWNlcywgaSAqIDE2ICk7CgogICAgCQl9CgogICAgCQlpZiAoIGJvbmVUZXh0dXJlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJYm9uZVRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyBTa2VsZXRvbiggdGhpcy5ib25lcywgdGhpcy5ib25lSW52ZXJzZXMgKTsKCiAgICAJfSwKCiAgICAJZ2V0Qm9uZUJ5TmFtZTogZnVuY3Rpb24gKCBuYW1lICkgewoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHRoaXMuYm9uZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJdmFyIGJvbmUgPSB0aGlzLmJvbmVzWyBpIF07CgogICAgCQkJaWYgKCBib25lLm5hbWUgPT09IG5hbWUgKSB7CgogICAgCQkJCXJldHVybiBib25lOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiB1bmRlZmluZWQ7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1pa2FlbCBlbXRpbmdlciAvIGh0dHA6Ly9nb21vLnNlLwogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgaWtlcnIgLyBodHRwOi8vdmVyb2xkLmNvbQogICAgICovCgogICAgZnVuY3Rpb24gQm9uZSgpIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnQm9uZSc7CgogICAgfQoKICAgIEJvbmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEJvbmUsCgogICAgCWlzQm9uZTogdHJ1ZQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKiAgY29sb3I6IDxoZXg+LAogICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCiAgICAgKgogICAgICogIGxpbmV3aWR0aDogPGZsb2F0PiwKICAgICAqICBsaW5lY2FwOiAicm91bmQiLAogICAgICogIGxpbmVqb2luOiAicm91bmQiCiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBMaW5lQmFzaWNNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCiAgICAJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnTGluZUJhc2ljTWF0ZXJpYWwnOwoKICAgIAl0aGlzLmNvbG9yID0gbmV3IENvbG9yJDcoIDB4ZmZmZmZmICk7CgogICAgCXRoaXMubGluZXdpZHRoID0gMTsKICAgIAl0aGlzLmxpbmVjYXAgPSAncm91bmQnOwogICAgCXRoaXMubGluZWpvaW4gPSAncm91bmQnOwoKICAgIAl0aGlzLmxpZ2h0cyA9IGZhbHNlOwoKICAgIAl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKICAgIH0KCiAgICBMaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IExpbmVCYXNpY01hdGVyaWFsOwoKICAgIExpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVCYXNpY01hdGVyaWFsID0gdHJ1ZTsKCiAgICBMaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy5jb2xvci5jb3B5KCBzb3VyY2UuY29sb3IgKTsKCiAgICAJdGhpcy5saW5ld2lkdGggPSBzb3VyY2UubGluZXdpZHRoOwogICAgCXRoaXMubGluZWNhcCA9IHNvdXJjZS5saW5lY2FwOwogICAgCXRoaXMubGluZWpvaW4gPSBzb3VyY2UubGluZWpvaW47CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgdmFyIF9zdGFydCA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX2VuZCA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX2ludmVyc2VNYXRyaXgkMSA9IG5ldyBNYXRyaXg0KCk7CiAgICB2YXIgX3JheSQxID0gbmV3IFJheSgpOwogICAgdmFyIF9zcGhlcmUkMiA9IG5ldyBTcGhlcmUoKTsKCiAgICBmdW5jdGlvbiBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwsIG1vZGUgKSB7CgogICAgCWlmICggbW9kZSA9PT0gMSApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5MaW5lOiBwYXJhbWV0ZXIgVEhSRUUuTGluZVBpZWNlcyBubyBsb25nZXIgc3VwcG9ydGVkLiBVc2UgVEhSRUUuTGluZVNlZ21lbnRzIGluc3RlYWQuJyApOwoKICAgIAl9CgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0xpbmUnOwoKICAgIAl0aGlzLmdlb21ldHJ5ID0gZ2VvbWV0cnkgIT09IHVuZGVmaW5lZCA/IGdlb21ldHJ5IDogbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CiAgICAJdGhpcy5tYXRlcmlhbCA9IG1hdGVyaWFsICE9PSB1bmRlZmluZWQgPyBtYXRlcmlhbCA6IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogTWF0aC5yYW5kb20oKSAqIDB4ZmZmZmZmIH0gKTsKCiAgICB9CgogICAgTGluZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogTGluZSwKCiAgICAJaXNMaW5lOiB0cnVlLAoKICAgIAljb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKCiAgICAJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCiAgICAJCQkvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnkKCiAgICAJCQlpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkgewoKICAgIAkJCQl2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCQkJCXZhciBsaW5lRGlzdGFuY2VzID0gWyAwIF07CgogICAgCQkJCWZvciAoIHZhciBpID0gMSwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJCV9zdGFydC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSAtIDEgKTsKICAgIAkJCQkJX2VuZC5mcm9tQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbkF0dHJpYnV0ZSwgaSApOwoKICAgIAkJCQkJbGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTsKICAgIAkJCQkJbGluZURpc3RhbmNlc1sgaSBdICs9IF9zdGFydC5kaXN0YW5jZVRvKCBfZW5kICk7CgogICAgCQkJCX0KCiAgICAJCQkJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnbGluZURpc3RhbmNlJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGxpbmVEaXN0YW5jZXMsIDEgKSApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKICAgIAkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwogICAgCQkJdmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzOwoKICAgIAkJCWxpbmVEaXN0YW5jZXNbIDAgXSA9IDA7CgogICAgCQkJZm9yICggdmFyIGkgPSAxLCBsID0gdmVydGljZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJbGluZURpc3RhbmNlc1sgaSBdID0gbGluZURpc3RhbmNlc1sgaSAtIDEgXTsKICAgIAkJCQlsaW5lRGlzdGFuY2VzWyBpIF0gKz0gdmVydGljZXNbIGkgLSAxIF0uZGlzdGFuY2VUbyggdmVydGljZXNbIGkgXSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlyYXljYXN0OiBmdW5jdGlvbiAoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApIHsKCiAgICAJCXZhciBwcmVjaXNpb24gPSByYXljYXN0ZXIubGluZVByZWNpc2lvbjsKCiAgICAJCXZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAJCXZhciBtYXRyaXhXb3JsZCA9IHRoaXMubWF0cml4V29ybGQ7CgogICAgCQkvLyBDaGVja2luZyBib3VuZGluZ1NwaGVyZSBkaXN0YW5jZSB0byByYXkKCiAgICAJCWlmICggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPT09IG51bGwgKSBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKCiAgICAJCV9zcGhlcmUkMi5jb3B5KCBnZW9tZXRyeS5ib3VuZGluZ1NwaGVyZSApOwogICAgCQlfc3BoZXJlJDIuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOwogICAgCQlfc3BoZXJlJDIucmFkaXVzICs9IHByZWNpc2lvbjsKCiAgICAJCWlmICggcmF5Y2FzdGVyLnJheS5pbnRlcnNlY3RzU3BoZXJlKCBfc3BoZXJlJDIgKSA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkvLwoKICAgIAkJX2ludmVyc2VNYXRyaXgkMS5nZXRJbnZlcnNlKCBtYXRyaXhXb3JsZCApOwogICAgCQlfcmF5JDEuY29weSggcmF5Y2FzdGVyLnJheSApLmFwcGx5TWF0cml4NCggX2ludmVyc2VNYXRyaXgkMSApOwoKICAgIAkJdmFyIGxvY2FsUHJlY2lzaW9uID0gcHJlY2lzaW9uIC8gKCAoIHRoaXMuc2NhbGUueCArIHRoaXMuc2NhbGUueSArIHRoaXMuc2NhbGUueiApIC8gMyApOwogICAgCQl2YXIgbG9jYWxQcmVjaXNpb25TcSA9IGxvY2FsUHJlY2lzaW9uICogbG9jYWxQcmVjaXNpb247CgogICAgCQl2YXIgdlN0YXJ0ID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJdmFyIHZFbmQgPSBuZXcgVmVjdG9yMygpOwogICAgCQl2YXIgaW50ZXJTZWdtZW50ID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJdmFyIGludGVyUmF5ID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJdmFyIHN0ZXAgPSAoIHRoaXMgJiYgdGhpcy5pc0xpbmVTZWdtZW50cyApID8gMiA6IDE7CgogICAgCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgogICAgCQkJdmFyIGluZGV4ID0gZ2VvbWV0cnkuaW5kZXg7CiAgICAJCQl2YXIgYXR0cmlidXRlcyA9IGdlb21ldHJ5LmF0dHJpYnV0ZXM7CiAgICAJCQl2YXIgcG9zaXRpb25zID0gYXR0cmlidXRlcy5wb3NpdGlvbi5hcnJheTsKCiAgICAJCQlpZiAoIGluZGV4ICE9PSBudWxsICkgewoKICAgIAkJCQl2YXIgaW5kaWNlcyA9IGluZGV4LmFycmF5OwoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBpbmRpY2VzLmxlbmd0aCAtIDE7IGkgPCBsOyBpICs9IHN0ZXAgKSB7CgogICAgCQkJCQl2YXIgYSA9IGluZGljZXNbIGkgXTsKICAgIAkJCQkJdmFyIGIgPSBpbmRpY2VzWyBpICsgMSBdOwoKICAgIAkJCQkJdlN0YXJ0LmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApOwogICAgCQkJCQl2RW5kLmZyb21BcnJheSggcG9zaXRpb25zLCBiICogMyApOwoKICAgIAkJCQkJdmFyIGRpc3RTcSA9IF9yYXkkMS5kaXN0YW5jZVNxVG9TZWdtZW50KCB2U3RhcnQsIHZFbmQsIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTsKCiAgICAJCQkJCWlmICggZGlzdFNxID4gbG9jYWxQcmVjaXNpb25TcSApIGNvbnRpbnVlOwoKICAgIAkJCQkJaW50ZXJSYXkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICk7IC8vTW92ZSBiYWNrIHRvIHdvcmxkIHNwYWNlIGZvciBkaXN0YW5jZSBjYWxjdWxhdGlvbgoKICAgIAkJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTsKCiAgICAJCQkJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSBjb250aW51ZTsKCiAgICAJCQkJCWludGVyc2VjdHMucHVzaCggewoKICAgIAkJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKICAgIAkJCQkJCS8vIFdoYXQgZG8gd2Ugd2FudD8gaW50ZXJzZWN0aW9uIHBvaW50IG9uIHRoZSByYXkgb3Igb24gdGhlIHNlZ21lbnQ/PwogICAgCQkJCQkJLy8gcG9pbnQ6IHJheWNhc3Rlci5yYXkuYXQoIGRpc3RhbmNlICksCiAgICAJCQkJCQlwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksCiAgICAJCQkJCQlpbmRleDogaSwKICAgIAkJCQkJCWZhY2U6IG51bGwsCiAgICAJCQkJCQlmYWNlSW5kZXg6IG51bGwsCiAgICAJCQkJCQlvYmplY3Q6IHRoaXMKCiAgICAJCQkJCX0gKTsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9ucy5sZW5ndGggLyAzIC0gMTsgaSA8IGw7IGkgKz0gc3RlcCApIHsKCiAgICAJCQkJCXZTdGFydC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKTsKICAgIAkJCQkJdkVuZC5mcm9tQXJyYXkoIHBvc2l0aW9ucywgMyAqIGkgKyAzICk7CgogICAgCQkJCQl2YXIgZGlzdFNxID0gX3JheSQxLmRpc3RhbmNlU3FUb1NlZ21lbnQoIHZTdGFydCwgdkVuZCwgaW50ZXJSYXksIGludGVyU2VnbWVudCApOwoKICAgIAkJCQkJaWYgKCBkaXN0U3EgPiBsb2NhbFByZWNpc2lvblNxICkgY29udGludWU7CgogICAgCQkJCQlpbnRlclJheS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKTsgLy9Nb3ZlIGJhY2sgdG8gd29ybGQgc3BhY2UgZm9yIGRpc3RhbmNlIGNhbGN1bGF0aW9uCgogICAgCQkJCQl2YXIgZGlzdGFuY2UgPSByYXljYXN0ZXIucmF5Lm9yaWdpbi5kaXN0YW5jZVRvKCBpbnRlclJheSApOwoKICAgIAkJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlOwoKICAgIAkJCQkJaW50ZXJzZWN0cy5wdXNoKCB7CgogICAgCQkJCQkJZGlzdGFuY2U6IGRpc3RhbmNlLAogICAgCQkJCQkJLy8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/CiAgICAJCQkJCQkvLyBwb2ludDogcmF5Y2FzdGVyLnJheS5hdCggZGlzdGFuY2UgKSwKICAgIAkJCQkJCXBvaW50OiBpbnRlclNlZ21lbnQuY2xvbmUoKS5hcHBseU1hdHJpeDQoIHRoaXMubWF0cml4V29ybGQgKSwKICAgIAkJCQkJCWluZGV4OiBpLAogICAgCQkJCQkJZmFjZTogbnVsbCwKICAgIAkJCQkJCWZhY2VJbmRleDogbnVsbCwKICAgIAkJCQkJCW9iamVjdDogdGhpcwoKICAgIAkJCQkJfSApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIGlmICggZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCQl2YXIgdmVydGljZXMgPSBnZW9tZXRyeS52ZXJ0aWNlczsKICAgIAkJCXZhciBuYlZlcnRpY2VzID0gdmVydGljZXMubGVuZ3RoOwoKICAgIAkJCWZvciAoIHZhciBpID0gMDsgaSA8IG5iVmVydGljZXMgLSAxOyBpICs9IHN0ZXAgKSB7CgogICAgCQkJCXZhciBkaXN0U3EgPSBfcmF5JDEuZGlzdGFuY2VTcVRvU2VnbWVudCggdmVydGljZXNbIGkgXSwgdmVydGljZXNbIGkgKyAxIF0sIGludGVyUmF5LCBpbnRlclNlZ21lbnQgKTsKCiAgICAJCQkJaWYgKCBkaXN0U3EgPiBsb2NhbFByZWNpc2lvblNxICkgY29udGludWU7CgogICAgCQkJCWludGVyUmF5LmFwcGx5TWF0cml4NCggdGhpcy5tYXRyaXhXb3JsZCApOyAvL01vdmUgYmFjayB0byB3b3JsZCBzcGFjZSBmb3IgZGlzdGFuY2UgY2FsY3VsYXRpb24KCiAgICAJCQkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJSYXkgKTsKCiAgICAJCQkJaWYgKCBkaXN0YW5jZSA8IHJheWNhc3Rlci5uZWFyIHx8IGRpc3RhbmNlID4gcmF5Y2FzdGVyLmZhciApIGNvbnRpbnVlOwoKICAgIAkJCQlpbnRlcnNlY3RzLnB1c2goIHsKCiAgICAJCQkJCWRpc3RhbmNlOiBkaXN0YW5jZSwKICAgIAkJCQkJLy8gV2hhdCBkbyB3ZSB3YW50PyBpbnRlcnNlY3Rpb24gcG9pbnQgb24gdGhlIHJheSBvciBvbiB0aGUgc2VnbWVudD8/CiAgICAJCQkJCS8vIHBvaW50OiByYXljYXN0ZXIucmF5LmF0KCBkaXN0YW5jZSApLAogICAgCQkJCQlwb2ludDogaW50ZXJTZWdtZW50LmNsb25lKCkuYXBwbHlNYXRyaXg0KCB0aGlzLm1hdHJpeFdvcmxkICksCiAgICAJCQkJCWluZGV4OiBpLAogICAgCQkJCQlmYWNlOiBudWxsLAogICAgCQkJCQlmYWNlSW5kZXg6IG51bGwsCiAgICAJCQkJCW9iamVjdDogdGhpcwoKICAgIAkJCQl9ICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCB0aGlzLmdlb21ldHJ5LCB0aGlzLm1hdGVyaWFsICkuY29weSggdGhpcyApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBfc3RhcnQkMSA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX2VuZCQxID0gbmV3IFZlY3RvcjMoKTsKCiAgICBmdW5jdGlvbiBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCiAgICAJTGluZS5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICAJdGhpcy50eXBlID0gJ0xpbmVTZWdtZW50cyc7CgogICAgfQoKICAgIExpbmVTZWdtZW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBMaW5lU2VnbWVudHMsCgogICAgCWlzTGluZVNlZ21lbnRzOiB0cnVlLAoKICAgIAljb21wdXRlTGluZURpc3RhbmNlczogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKCiAgICAJCWlmICggZ2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCiAgICAJCQkvLyB3ZSBhc3N1bWUgbm9uLWluZGV4ZWQgZ2VvbWV0cnkKCiAgICAJCQlpZiAoIGdlb21ldHJ5LmluZGV4ID09PSBudWxsICkgewoKICAgIAkJCQl2YXIgcG9zaXRpb25BdHRyaWJ1dGUgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCQkJCXZhciBsaW5lRGlzdGFuY2VzID0gW107CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgbCA9IHBvc2l0aW9uQXR0cmlidXRlLmNvdW50OyBpIDwgbDsgaSArPSAyICkgewoKICAgIAkJCQkJX3N0YXJ0JDEuZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25BdHRyaWJ1dGUsIGkgKTsKICAgIAkJCQkJX2VuZCQxLmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uQXR0cmlidXRlLCBpICsgMSApOwoKICAgIAkJCQkJbGluZURpc3RhbmNlc1sgaSBdID0gKCBpID09PSAwICkgPyAwIDogbGluZURpc3RhbmNlc1sgaSAtIDEgXTsKICAgIAkJCQkJbGluZURpc3RhbmNlc1sgaSArIDEgXSA9IGxpbmVEaXN0YW5jZXNbIGkgXSArIF9zdGFydCQxLmRpc3RhbmNlVG8oIF9lbmQkMSApOwoKICAgIAkJCQl9CgogICAgCQkJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2xpbmVEaXN0YW5jZScsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBsaW5lRGlzdGFuY2VzLCAxICkgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaW5lU2VnbWVudHMuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKTogQ29tcHV0YXRpb24gb25seSBwb3NzaWJsZSB3aXRoIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5LicgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgaWYgKCBnZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKICAgIAkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwogICAgCQkJdmFyIGxpbmVEaXN0YW5jZXMgPSBnZW9tZXRyeS5saW5lRGlzdGFuY2VzOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKz0gMiApIHsKCiAgICAJCQkJX3N0YXJ0JDEuY29weSggdmVydGljZXNbIGkgXSApOwogICAgCQkJCV9lbmQkMS5jb3B5KCB2ZXJ0aWNlc1sgaSArIDEgXSApOwoKICAgIAkJCQlsaW5lRGlzdGFuY2VzWyBpIF0gPSAoIGkgPT09IDAgKSA/IDAgOiBsaW5lRGlzdGFuY2VzWyBpIC0gMSBdOwogICAgCQkJCWxpbmVEaXN0YW5jZXNbIGkgKyAxIF0gPSBsaW5lRGlzdGFuY2VzWyBpIF0gKyBfc3RhcnQkMS5kaXN0YW5jZVRvKCBfZW5kJDEgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbWdyZXRlciAvIGh0dHA6Ly9naXRodWIuY29tL21ncmV0ZXIKICAgICAqLwoKICAgIGZ1bmN0aW9uIExpbmVMb29wKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKSB7CgogICAgCUxpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CgogICAgCXRoaXMudHlwZSA9ICdMaW5lTG9vcCc7CgogICAgfQoKICAgIExpbmVMb29wLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IExpbmVMb29wLAoKICAgIAlpc0xpbmVMb29wOiB0cnVlLAoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKiAgY29sb3I6IDxoZXg+LAogICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCiAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBzaXplOiA8ZmxvYXQ+LAogICAgICogIHNpemVBdHRlbnVhdGlvbjogPGJvb2w+CiAgICAgKgogICAgICogIG1vcnBoVGFyZ2V0czogPGJvb2w+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCiAgICAJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUG9pbnRzTWF0ZXJpYWwnOwoKICAgIAl0aGlzLmNvbG9yID0gbmV3IENvbG9yJDcoIDB4ZmZmZmZmICk7CgogICAgCXRoaXMubWFwID0gbnVsbDsKCiAgICAJdGhpcy5zaXplID0gMTsKICAgIAl0aGlzLnNpemVBdHRlbnVhdGlvbiA9IHRydWU7CgogICAgCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CgogICAgCXRoaXMubGlnaHRzID0gZmFsc2U7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIFBvaW50c01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwogICAgUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRzTWF0ZXJpYWw7CgogICAgUG9pbnRzTWF0ZXJpYWwucHJvdG90eXBlLmlzUG9pbnRzTWF0ZXJpYWwgPSB0cnVlOwoKICAgIFBvaW50c01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKICAgIAl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CgogICAgCXRoaXMuc2l6ZSA9IHNvdXJjZS5zaXplOwogICAgCXRoaXMuc2l6ZUF0dGVudWF0aW9uID0gc291cmNlLnNpemVBdHRlbnVhdGlvbjsKCiAgICAJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIHZhciBfaW52ZXJzZU1hdHJpeCQyID0gbmV3IE1hdHJpeDQoKTsKICAgIHZhciBfcmF5JDIgPSBuZXcgUmF5KCk7CiAgICB2YXIgX3NwaGVyZSQzID0gbmV3IFNwaGVyZSgpOwogICAgdmFyIF9wb3NpdGlvbiQxID0gbmV3IFZlY3RvcjMoKTsKCiAgICBmdW5jdGlvbiBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUG9pbnRzJzsKCiAgICAJdGhpcy5nZW9tZXRyeSA9IGdlb21ldHJ5ICE9PSB1bmRlZmluZWQgPyBnZW9tZXRyeSA6IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwogICAgCXRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbCAhPT0gdW5kZWZpbmVkID8gbWF0ZXJpYWwgOiBuZXcgUG9pbnRzTWF0ZXJpYWwoIHsgY29sb3I6IE1hdGgucmFuZG9tKCkgKiAweGZmZmZmZiB9ICk7CgogICAgCXRoaXMudXBkYXRlTW9ycGhUYXJnZXRzKCk7CgogICAgfQoKICAgIFBvaW50cy5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogUG9pbnRzLAoKICAgIAlpc1BvaW50czogdHJ1ZSwKCiAgICAJcmF5Y2FzdDogZnVuY3Rpb24gKCByYXljYXN0ZXIsIGludGVyc2VjdHMgKSB7CgogICAgCQl2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgCQl2YXIgbWF0cml4V29ybGQgPSB0aGlzLm1hdHJpeFdvcmxkOwogICAgCQl2YXIgdGhyZXNob2xkID0gcmF5Y2FzdGVyLnBhcmFtcy5Qb2ludHMudGhyZXNob2xkOwoKICAgIAkJLy8gQ2hlY2tpbmcgYm91bmRpbmdTcGhlcmUgZGlzdGFuY2UgdG8gcmF5CgogICAgCQlpZiAoIGdlb21ldHJ5LmJvdW5kaW5nU3BoZXJlID09PSBudWxsICkgZ2VvbWV0cnkuY29tcHV0ZUJvdW5kaW5nU3BoZXJlKCk7CgogICAgCQlfc3BoZXJlJDMuY29weSggZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgKTsKICAgIAkJX3NwaGVyZSQzLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKICAgIAkJX3NwaGVyZSQzLnJhZGl1cyArPSB0aHJlc2hvbGQ7CgogICAgCQlpZiAoIHJheWNhc3Rlci5yYXkuaW50ZXJzZWN0c1NwaGVyZSggX3NwaGVyZSQzICkgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJLy8KCiAgICAJCV9pbnZlcnNlTWF0cml4JDIuZ2V0SW52ZXJzZSggbWF0cml4V29ybGQgKTsKICAgIAkJX3JheSQyLmNvcHkoIHJheWNhc3Rlci5yYXkgKS5hcHBseU1hdHJpeDQoIF9pbnZlcnNlTWF0cml4JDIgKTsKCiAgICAJCXZhciBsb2NhbFRocmVzaG9sZCA9IHRocmVzaG9sZCAvICggKCB0aGlzLnNjYWxlLnggKyB0aGlzLnNjYWxlLnkgKyB0aGlzLnNjYWxlLnogKSAvIDMgKTsKICAgIAkJdmFyIGxvY2FsVGhyZXNob2xkU3EgPSBsb2NhbFRocmVzaG9sZCAqIGxvY2FsVGhyZXNob2xkOwoKICAgIAkJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgewoKICAgIAkJCXZhciBpbmRleCA9IGdlb21ldHJ5LmluZGV4OwogICAgCQkJdmFyIGF0dHJpYnV0ZXMgPSBnZW9tZXRyeS5hdHRyaWJ1dGVzOwogICAgCQkJdmFyIHBvc2l0aW9ucyA9IGF0dHJpYnV0ZXMucG9zaXRpb24uYXJyYXk7CgogICAgCQkJaWYgKCBpbmRleCAhPT0gbnVsbCApIHsKCiAgICAJCQkJdmFyIGluZGljZXMgPSBpbmRleC5hcnJheTsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGluZGljZXMubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQl2YXIgYSA9IGluZGljZXNbIGkgXTsKCiAgICAJCQkJCV9wb3NpdGlvbiQxLmZyb21BcnJheSggcG9zaXRpb25zLCBhICogMyApOwoKICAgIAkJCQkJdGVzdFBvaW50KCBfcG9zaXRpb24kMSwgYSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9zaXRpb25zLmxlbmd0aCAvIDM7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQkJX3Bvc2l0aW9uJDEuZnJvbUFycmF5KCBwb3NpdGlvbnMsIGkgKiAzICk7CgogICAgCQkJCQl0ZXN0UG9pbnQoIF9wb3NpdGlvbiQxLCBpLCBsb2NhbFRocmVzaG9sZFNxLCBtYXRyaXhXb3JsZCwgcmF5Y2FzdGVyLCBpbnRlcnNlY3RzLCB0aGlzICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXZhciB2ZXJ0aWNlcyA9IGdlb21ldHJ5LnZlcnRpY2VzOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbCA9IHZlcnRpY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCXRlc3RQb2ludCggdmVydGljZXNbIGkgXSwgaSwgbG9jYWxUaHJlc2hvbGRTcSwgbWF0cml4V29ybGQsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgdGhpcyApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfSwKCiAgICAJdXBkYXRlTW9ycGhUYXJnZXRzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZ2VvbWV0cnkgPSB0aGlzLmdlb21ldHJ5OwogICAgCQl2YXIgbSwgbWwsIG5hbWU7CgogICAgCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgKSB7CgogICAgCQkJdmFyIG1vcnBoQXR0cmlidXRlcyA9IGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlczsKICAgIAkJCXZhciBrZXlzID0gT2JqZWN0LmtleXMoIG1vcnBoQXR0cmlidXRlcyApOwoKICAgIAkJCWlmICgga2V5cy5sZW5ndGggPiAwICkgewoKICAgIAkJCQl2YXIgbW9ycGhBdHRyaWJ1dGUgPSBtb3JwaEF0dHJpYnV0ZXNbIGtleXNbIDAgXSBdOwoKICAgIAkJCQlpZiAoIG1vcnBoQXR0cmlidXRlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyA9IFtdOwogICAgCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeSA9IHt9OwoKICAgIAkJCQkJZm9yICggbSA9IDAsIG1sID0gbW9ycGhBdHRyaWJ1dGUubGVuZ3RoOyBtIDwgbWw7IG0gKysgKSB7CgogICAgCQkJCQkJbmFtZSA9IG1vcnBoQXR0cmlidXRlWyBtIF0ubmFtZSB8fCBTdHJpbmcoIG0gKTsKCiAgICAJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0SW5mbHVlbmNlcy5wdXNoKCAwICk7CiAgICAJCQkJCQl0aGlzLm1vcnBoVGFyZ2V0RGljdGlvbmFyeVsgbmFtZSBdID0gbTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdmFyIG1vcnBoVGFyZ2V0cyA9IGdlb21ldHJ5Lm1vcnBoVGFyZ2V0czsKCiAgICAJCQlpZiAoIG1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICYmIG1vcnBoVGFyZ2V0cy5sZW5ndGggPiAwICkgewoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUG9pbnRzLnVwZGF0ZU1vcnBoVGFyZ2V0cygpIGRvZXMgbm90IHN1cHBvcnQgVEhSRUUuR2VvbWV0cnkuIFVzZSBUSFJFRS5CdWZmZXJHZW9tZXRyeSBpbnN0ZWFkLicgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoIHRoaXMuZ2VvbWV0cnksIHRoaXMubWF0ZXJpYWwgKS5jb3B5KCB0aGlzICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgZnVuY3Rpb24gdGVzdFBvaW50KCBwb2ludCwgaW5kZXgsIGxvY2FsVGhyZXNob2xkU3EsIG1hdHJpeFdvcmxkLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIG9iamVjdCApIHsKCiAgICAJdmFyIHJheVBvaW50RGlzdGFuY2VTcSA9IF9yYXkkMi5kaXN0YW5jZVNxVG9Qb2ludCggcG9pbnQgKTsKCiAgICAJaWYgKCByYXlQb2ludERpc3RhbmNlU3EgPCBsb2NhbFRocmVzaG9sZFNxICkgewoKICAgIAkJdmFyIGludGVyc2VjdFBvaW50ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCV9yYXkkMi5jbG9zZXN0UG9pbnRUb1BvaW50KCBwb2ludCwgaW50ZXJzZWN0UG9pbnQgKTsKICAgIAkJaW50ZXJzZWN0UG9pbnQuYXBwbHlNYXRyaXg0KCBtYXRyaXhXb3JsZCApOwoKICAgIAkJdmFyIGRpc3RhbmNlID0gcmF5Y2FzdGVyLnJheS5vcmlnaW4uZGlzdGFuY2VUbyggaW50ZXJzZWN0UG9pbnQgKTsKCiAgICAJCWlmICggZGlzdGFuY2UgPCByYXljYXN0ZXIubmVhciB8fCBkaXN0YW5jZSA+IHJheWNhc3Rlci5mYXIgKSByZXR1cm47CgogICAgCQlpbnRlcnNlY3RzLnB1c2goIHsKCiAgICAJCQlkaXN0YW5jZTogZGlzdGFuY2UsCiAgICAJCQlkaXN0YW5jZVRvUmF5OiBNYXRoLnNxcnQoIHJheVBvaW50RGlzdGFuY2VTcSApLAogICAgCQkJcG9pbnQ6IGludGVyc2VjdFBvaW50LAogICAgCQkJaW5kZXg6IGluZGV4LAogICAgCQkJZmFjZTogbnVsbCwKICAgIAkJCW9iamVjdDogb2JqZWN0CgogICAgCQl9ICk7CgogICAgCX0KCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gVmlkZW9UZXh0dXJlKCB2aWRlbywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkgewoKICAgIAlUZXh0dXJlLmNhbGwoIHRoaXMsIHZpZGVvLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTsKCiAgICAJdGhpcy5mb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IFJHQkZvcm1hdDsKCiAgICAJdGhpcy5taW5GaWx0ZXIgPSBtaW5GaWx0ZXIgIT09IHVuZGVmaW5lZCA/IG1pbkZpbHRlciA6IExpbmVhckZpbHRlcjsKICAgIAl0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTGluZWFyRmlsdGVyOwoKICAgIAl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwoKICAgIH0KCiAgICBWaWRlb1RleHR1cmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggVGV4dHVyZS5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogVmlkZW9UZXh0dXJlLAoKICAgIAlpc1ZpZGVvVGV4dHVyZTogdHJ1ZSwKCiAgICAJdXBkYXRlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdmlkZW8gPSB0aGlzLmltYWdlOwoKICAgIAkJaWYgKCB2aWRlby5yZWFkeVN0YXRlID49IHZpZGVvLkhBVkVfQ1VSUkVOVF9EQVRBICkgewoKICAgIAkJCXRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJfQoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIENvbXByZXNzZWRUZXh0dXJlKCBtaXBtYXBzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHR5cGUsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGFuaXNvdHJvcHksIGVuY29kaW5nICkgewoKICAgIAlUZXh0dXJlLmNhbGwoIHRoaXMsIG51bGwsIG1hcHBpbmcsIHdyYXBTLCB3cmFwVCwgbWFnRmlsdGVyLCBtaW5GaWx0ZXIsIGZvcm1hdCwgdHlwZSwgYW5pc290cm9weSwgZW5jb2RpbmcgKTsKCiAgICAJdGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9OwogICAgCXRoaXMubWlwbWFwcyA9IG1pcG1hcHM7CgogICAgCS8vIG5vIGZsaXBwaW5nIGZvciBjdWJlIHRleHR1cmVzCiAgICAJLy8gKGFsc28gZmxpcHBpbmcgZG9lc24ndCB3b3JrIGZvciBjb21wcmVzc2VkIHRleHR1cmVzICkKCiAgICAJdGhpcy5mbGlwWSA9IGZhbHNlOwoKICAgIAkvLyBjYW4ndCBnZW5lcmF0ZSBtaXBtYXBzIGZvciBjb21wcmVzc2VkIHRleHR1cmVzCiAgICAJLy8gbWlwcyBtdXN0IGJlIGVtYmVkZGVkIGluIEREUyBmaWxlcwoKICAgIAl0aGlzLmdlbmVyYXRlTWlwbWFwcyA9IGZhbHNlOwoKICAgIH0KCiAgICBDb21wcmVzc2VkVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApOwogICAgQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ29tcHJlc3NlZFRleHR1cmU7CgogICAgQ29tcHJlc3NlZFRleHR1cmUucHJvdG90eXBlLmlzQ29tcHJlc3NlZFRleHR1cmUgPSB0cnVlOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIENhbnZhc1RleHR1cmUoIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICkgewoKICAgIAlUZXh0dXJlLmNhbGwoIHRoaXMsIGNhbnZhcywgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgZm9ybWF0LCB0eXBlLCBhbmlzb3Ryb3B5ICk7CgogICAgCXRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIH0KCiAgICBDYW52YXNUZXh0dXJlLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFRleHR1cmUucHJvdG90eXBlICk7CiAgICBDYW52YXNUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbnZhc1RleHR1cmU7CiAgICBDYW52YXNUZXh0dXJlLnByb3RvdHlwZS5pc0NhbnZhc1RleHR1cmUgPSB0cnVlOwoKICAgIC8qKgogICAgICogQGF1dGhvciBNYXR0IERlc0xhdXJpZXJzIC8gQG1hdHRkZXNsCiAgICAgKiBAYXV0aG9yIGF0aXggLyBhcnRodXJzaWxiZXIuZGUKICAgICAqLwoKICAgIGZ1bmN0aW9uIERlcHRoVGV4dHVyZSggd2lkdGgsIGhlaWdodCwgdHlwZSwgbWFwcGluZywgd3JhcFMsIHdyYXBULCBtYWdGaWx0ZXIsIG1pbkZpbHRlciwgYW5pc290cm9weSwgZm9ybWF0ICkgewoKICAgIAlmb3JtYXQgPSBmb3JtYXQgIT09IHVuZGVmaW5lZCA/IGZvcm1hdCA6IERlcHRoRm9ybWF0OwoKICAgIAlpZiAoIGZvcm1hdCAhPT0gRGVwdGhGb3JtYXQgJiYgZm9ybWF0ICE9PSBEZXB0aFN0ZW5jaWxGb3JtYXQgKSB7CgogICAgCQl0aHJvdyBuZXcgRXJyb3IoICdEZXB0aFRleHR1cmUgZm9ybWF0IG11c3QgYmUgZWl0aGVyIFRIUkVFLkRlcHRoRm9ybWF0IG9yIFRIUkVFLkRlcHRoU3RlbmNpbEZvcm1hdCcgKTsKCiAgICAJfQoKICAgIAlpZiAoIHR5cGUgPT09IHVuZGVmaW5lZCAmJiBmb3JtYXQgPT09IERlcHRoRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkU2hvcnRUeXBlOwogICAgCWlmICggdHlwZSA9PT0gdW5kZWZpbmVkICYmIGZvcm1hdCA9PT0gRGVwdGhTdGVuY2lsRm9ybWF0ICkgdHlwZSA9IFVuc2lnbmVkSW50MjQ4VHlwZTsKCiAgICAJVGV4dHVyZS5jYWxsKCB0aGlzLCBudWxsLCBtYXBwaW5nLCB3cmFwUywgd3JhcFQsIG1hZ0ZpbHRlciwgbWluRmlsdGVyLCBmb3JtYXQsIHR5cGUsIGFuaXNvdHJvcHkgKTsKCiAgICAJdGhpcy5pbWFnZSA9IHsgd2lkdGg6IHdpZHRoLCBoZWlnaHQ6IGhlaWdodCB9OwoKICAgIAl0aGlzLm1hZ0ZpbHRlciA9IG1hZ0ZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWFnRmlsdGVyIDogTmVhcmVzdEZpbHRlcjsKICAgIAl0aGlzLm1pbkZpbHRlciA9IG1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gbWluRmlsdGVyIDogTmVhcmVzdEZpbHRlcjsKCiAgICAJdGhpcy5mbGlwWSA9IGZhbHNlOwogICAgCXRoaXMuZ2VuZXJhdGVNaXBtYXBzCT0gZmFsc2U7CgogICAgfQoKICAgIERlcHRoVGV4dHVyZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBUZXh0dXJlLnByb3RvdHlwZSApOwogICAgRGVwdGhUZXh0dXJlLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERlcHRoVGV4dHVyZTsKICAgIERlcHRoVGV4dHVyZS5wcm90b3R5cGUuaXNEZXB0aFRleHR1cmUgPSB0cnVlOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBXaXJlZnJhbWVHZW9tZXRyeSggZ2VvbWV0cnkgKSB7CgogICAgCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1dpcmVmcmFtZUdlb21ldHJ5JzsKCiAgICAJLy8gYnVmZmVyCgogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwoKICAgIAkvLyBoZWxwZXIgdmFyaWFibGVzCgogICAgCXZhciBpLCBqLCBsLCBvLCBvbDsKICAgIAl2YXIgZWRnZSA9IFsgMCwgMCBdLCBlZGdlcyA9IHt9LCBlLCBlZGdlMSwgZWRnZTI7CiAgICAJdmFyIGtleSwga2V5cyA9IFsgJ2EnLCAnYicsICdjJyBdOwogICAgCXZhciB2ZXJ0ZXg7CgogICAgCS8vIGRpZmZlcmVudCBsb2dpYyBmb3IgR2VvbWV0cnkgYW5kIEJ1ZmZlckdlb21ldHJ5CgogICAgCWlmICggZ2VvbWV0cnkgJiYgZ2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCS8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVkZ2VzIHdpdGhvdXQgZHVwbGljYXRlcwoKICAgIAkJdmFyIGZhY2VzID0gZ2VvbWV0cnkuZmFjZXM7CgogICAgCQlmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOwoKICAgIAkJCWZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHsKCiAgICAJCQkJZWRnZTEgPSBmYWNlWyBrZXlzWyBqIF0gXTsKICAgIAkJCQllZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdOwogICAgCQkJCWVkZ2VbIDAgXSA9IE1hdGgubWluKCBlZGdlMSwgZWRnZTIgKTsgLy8gc29ydGluZyBwcmV2ZW50cyBkdXBsaWNhdGVzCiAgICAJCQkJZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApOwoKICAgIAkJCQlrZXkgPSBlZGdlWyAwIF0gKyAnLCcgKyBlZGdlWyAxIF07CgogICAgCQkJCWlmICggZWRnZXNbIGtleSBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQllZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9OwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy8gZ2VuZXJhdGUgdmVydGljZXMKCiAgICAJCWZvciAoIGtleSBpbiBlZGdlcyApIHsKCiAgICAJCQllID0gZWRnZXNbIGtleSBdOwoKICAgIAkJCXZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MSBdOwogICAgCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKICAgIAkJCXZlcnRleCA9IGdlb21ldHJ5LnZlcnRpY2VzWyBlLmluZGV4MiBdOwogICAgCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKICAgIAkJfQoKICAgIAl9IGVsc2UgaWYgKCBnZW9tZXRyeSAmJiBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgewoKICAgIAkJdmFyIHBvc2l0aW9uLCBpbmRpY2VzLCBncm91cHM7CiAgICAJCXZhciBncm91cCwgc3RhcnQsIGNvdW50OwogICAgCQl2YXIgaW5kZXgxLCBpbmRleDI7CgogICAgCQl2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJaWYgKCBnZW9tZXRyeS5pbmRleCAhPT0gbnVsbCApIHsKCiAgICAJCQkvLyBpbmRleGVkIEJ1ZmZlckdlb21ldHJ5CgogICAgCQkJcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCQkJaW5kaWNlcyA9IGdlb21ldHJ5LmluZGV4OwogICAgCQkJZ3JvdXBzID0gZ2VvbWV0cnkuZ3JvdXBzOwoKICAgIAkJCWlmICggZ3JvdXBzLmxlbmd0aCA9PT0gMCApIHsKCiAgICAJCQkJZ3JvdXBzID0gWyB7IHN0YXJ0OiAwLCBjb3VudDogaW5kaWNlcy5jb3VudCwgbWF0ZXJpYWxJbmRleDogMCB9IF07CgogICAgCQkJfQoKICAgIAkJCS8vIGNyZWF0ZSBhIGRhdGEgc3RydWN0dXJlIHRoYXQgY29udGFpbnMgYWxsIGVnZXMgd2l0aG91dCBkdXBsaWNhdGVzCgogICAgCQkJZm9yICggbyA9IDAsIG9sID0gZ3JvdXBzLmxlbmd0aDsgbyA8IG9sOyArKyBvICkgewoKICAgIAkJCQlncm91cCA9IGdyb3Vwc1sgbyBdOwoKICAgIAkJCQlzdGFydCA9IGdyb3VwLnN0YXJ0OwogICAgCQkJCWNvdW50ID0gZ3JvdXAuY291bnQ7CgogICAgCQkJCWZvciAoIGkgPSBzdGFydCwgbCA9ICggc3RhcnQgKyBjb3VudCApOyBpIDwgbDsgaSArPSAzICkgewoKICAgIAkJCQkJZm9yICggaiA9IDA7IGogPCAzOyBqICsrICkgewoKICAgIAkJCQkJCWVkZ2UxID0gaW5kaWNlcy5nZXRYKCBpICsgaiApOwogICAgCQkJCQkJZWRnZTIgPSBpbmRpY2VzLmdldFgoIGkgKyAoIGogKyAxICkgJSAzICk7CiAgICAJCQkJCQllZGdlWyAwIF0gPSBNYXRoLm1pbiggZWRnZTEsIGVkZ2UyICk7IC8vIHNvcnRpbmcgcHJldmVudHMgZHVwbGljYXRlcwogICAgCQkJCQkJZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApOwoKICAgIAkJCQkJCWtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTsKCiAgICAJCQkJCQlpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJCQllZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSB9OwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcwoKICAgIAkJCWZvciAoIGtleSBpbiBlZGdlcyApIHsKCiAgICAJCQkJZSA9IGVkZ2VzWyBrZXkgXTsKCiAgICAJCQkJdmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MSApOwogICAgCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJCQkJdmVydGV4LmZyb21CdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uLCBlLmluZGV4MiApOwogICAgCQkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIG5vbi1pbmRleGVkIEJ1ZmZlckdlb21ldHJ5CgogICAgCQkJcG9zaXRpb24gPSBnZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwoKICAgIAkJCWZvciAoIGkgPSAwLCBsID0gKCBwb3NpdGlvbi5jb3VudCAvIDMgKTsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCWZvciAoIGogPSAwOyBqIDwgMzsgaiArKyApIHsKCiAgICAJCQkJCS8vIHRocmVlIGVkZ2VzIHBlciB0cmlhbmdsZSwgYW4gZWRnZSBpcyByZXByZXNlbnRlZCBhcyAoaW5kZXgxLCBpbmRleDIpCiAgICAJCQkJCS8vIGUuZy4gdGhlIGZpcnN0IHRyaWFuZ2xlIGhhcyB0aGUgZm9sbG93aW5nIGVkZ2VzOiAoMCwxKSwoMSwyKSwoMiwwKQoKICAgIAkJCQkJaW5kZXgxID0gMyAqIGkgKyBqOwogICAgCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MSApOwogICAgCQkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJCQlpbmRleDIgPSAzICogaSArICggKCBqICsgMSApICUgMyApOwogICAgCQkJCQl2ZXJ0ZXguZnJvbUJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb24sIGluZGV4MiApOwogICAgCQkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CgogICAgfQoKICAgIFdpcmVmcmFtZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgV2lyZWZyYW1lR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gV2lyZWZyYW1lR2VvbWV0cnk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqCiAgICAgKiBQYXJhbWV0cmljIFN1cmZhY2VzIEdlb21ldHJ5CiAgICAgKiBiYXNlZCBvbiB0aGUgYnJpbGxpYW50IGFydGljbGUgYnkgQHByaWRlb3V0IGh0dHA6Ly9wcmlkZW91dC5uZXQvYmxvZy8/cD00NAogICAgICovCgogICAgLy8gUGFyYW1ldHJpY0dlb21ldHJ5CgogICAgZnVuY3Rpb24gUGFyYW1ldHJpY0dlb21ldHJ5KCBmdW5jLCBzbGljZXMsIHN0YWNrcyApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUGFyYW1ldHJpY0dlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlmdW5jOiBmdW5jLAogICAgCQlzbGljZXM6IHNsaWNlcywKICAgIAkJc3RhY2tzOiBzdGFja3MKICAgIAl9OwoKICAgIAl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBQYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBQYXJhbWV0cmljR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUGFyYW1ldHJpY0dlb21ldHJ5OwoKICAgIC8vIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSggZnVuYywgc2xpY2VzLCBzdGFja3MgKSB7CgogICAgCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1BhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJZnVuYzogZnVuYywKICAgIAkJc2xpY2VzOiBzbGljZXMsCiAgICAJCXN0YWNrczogc3RhY2tzCiAgICAJfTsKCiAgICAJLy8gYnVmZmVycwoKICAgIAl2YXIgaW5kaWNlcyA9IFtdOwogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwogICAgCXZhciBub3JtYWxzID0gW107CiAgICAJdmFyIHV2cyA9IFtdOwoKICAgIAl2YXIgRVBTID0gMC4wMDAwMTsKCiAgICAJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciBwMCA9IG5ldyBWZWN0b3IzKCksIHAxID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgcHUgPSBuZXcgVmVjdG9yMygpLCBwdiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciBpLCBqOwoKICAgIAlpZiAoIGZ1bmMubGVuZ3RoIDwgMyApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5QYXJhbWV0cmljR2VvbWV0cnk6IEZ1bmN0aW9uIG11c3Qgbm93IG1vZGlmeSBhIFZlY3RvcjMgYXMgdGhpcmQgcGFyYW1ldGVyLicgKTsKCiAgICAJfQoKICAgIAkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgogICAgCXZhciBzbGljZUNvdW50ID0gc2xpY2VzICsgMTsKCiAgICAJZm9yICggaSA9IDA7IGkgPD0gc3RhY2tzOyBpICsrICkgewoKICAgIAkJdmFyIHYgPSBpIC8gc3RhY2tzOwoKICAgIAkJZm9yICggaiA9IDA7IGogPD0gc2xpY2VzOyBqICsrICkgewoKICAgIAkJCXZhciB1ID0gaiAvIHNsaWNlczsKCiAgICAJCQkvLyB2ZXJ0ZXgKCiAgICAJCQlmdW5jKCB1LCB2LCBwMCApOwogICAgCQkJdmVydGljZXMucHVzaCggcDAueCwgcDAueSwgcDAueiApOwoKICAgIAkJCS8vIG5vcm1hbAoKICAgIAkJCS8vIGFwcHJveGltYXRlIHRhbmdlbnQgdmVjdG9ycyB2aWEgZmluaXRlIGRpZmZlcmVuY2VzCgogICAgCQkJaWYgKCB1IC0gRVBTID49IDAgKSB7CgogICAgCQkJCWZ1bmMoIHUgLSBFUFMsIHYsIHAxICk7CiAgICAJCQkJcHUuc3ViVmVjdG9ycyggcDAsIHAxICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZnVuYyggdSArIEVQUywgdiwgcDEgKTsKICAgIAkJCQlwdS5zdWJWZWN0b3JzKCBwMSwgcDAgKTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCB2IC0gRVBTID49IDAgKSB7CgogICAgCQkJCWZ1bmMoIHUsIHYgLSBFUFMsIHAxICk7CiAgICAJCQkJcHYuc3ViVmVjdG9ycyggcDAsIHAxICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJZnVuYyggdSwgdiArIEVQUywgcDEgKTsKICAgIAkJCQlwdi5zdWJWZWN0b3JzKCBwMSwgcDAgKTsKCiAgICAJCQl9CgogICAgCQkJLy8gY3Jvc3MgcHJvZHVjdCBvZiB0YW5nZW50IHZlY3RvcnMgcmV0dXJucyBzdXJmYWNlIG5vcm1hbAoKICAgIAkJCW5vcm1hbC5jcm9zc1ZlY3RvcnMoIHB1LCBwdiApLm5vcm1hbGl6ZSgpOwogICAgCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgogICAgCQkJLy8gdXYKCiAgICAJCQl1dnMucHVzaCggdSwgdiApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vIGdlbmVyYXRlIGluZGljZXMKCiAgICAJZm9yICggaSA9IDA7IGkgPCBzdGFja3M7IGkgKysgKSB7CgogICAgCQlmb3IgKCBqID0gMDsgaiA8IHNsaWNlczsgaiArKyApIHsKCiAgICAJCQl2YXIgYSA9IGkgKiBzbGljZUNvdW50ICsgajsKICAgIAkJCXZhciBiID0gaSAqIHNsaWNlQ291bnQgKyBqICsgMTsKICAgIAkJCXZhciBjID0gKCBpICsgMSApICogc2xpY2VDb3VudCArIGogKyAxOwogICAgCQkJdmFyIGQgPSAoIGkgKyAxICkgKiBzbGljZUNvdW50ICsgajsKCiAgICAJCQkvLyBmYWNlcyBvbmUgYW5kIHR3bwoKICAgIAkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwogICAgCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCiAgICB9CgogICAgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgUGFyYW1ldHJpY0J1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgY2xvY2t3b3JrZ2VlayAvIGh0dHBzOi8vZ2l0aHViLmNvbS9jbG9ja3dvcmtnZWVrCiAgICAgKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICAvLyBQb2x5aGVkcm9uR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBQb2x5aGVkcm9uR2VvbWV0cnkoIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUG9seWhlZHJvbkdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQl2ZXJ0aWNlczogdmVydGljZXMsCiAgICAJCWluZGljZXM6IGluZGljZXMsCiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQlkZXRhaWw6IGRldGFpbAogICAgCX07CgogICAgCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCB2ZXJ0aWNlcywgaW5kaWNlcywgcmFkaXVzLCBkZXRhaWwgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBQb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBQb2x5aGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9seWhlZHJvbkdlb21ldHJ5OwoKICAgIC8vIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeSggdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICkgewoKICAgIAlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXZlcnRpY2VzOiB2ZXJ0aWNlcywKICAgIAkJaW5kaWNlczogaW5kaWNlcywKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCWRldGFpbDogZGV0YWlsCiAgICAJfTsKCiAgICAJcmFkaXVzID0gcmFkaXVzIHx8IDE7CiAgICAJZGV0YWlsID0gZGV0YWlsIHx8IDA7CgogICAgCS8vIGRlZmF1bHQgYnVmZmVyIGRhdGEKCiAgICAJdmFyIHZlcnRleEJ1ZmZlciA9IFtdOwogICAgCXZhciB1dkJ1ZmZlciA9IFtdOwoKICAgIAkvLyB0aGUgc3ViZGl2aXNpb24gY3JlYXRlcyB0aGUgdmVydGV4IGJ1ZmZlciBkYXRhCgogICAgCXN1YmRpdmlkZSggZGV0YWlsICk7CgogICAgCS8vIGFsbCB2ZXJ0aWNlcyBzaG91bGQgbGllIG9uIGEgY29uY2VwdHVhbCBzcGhlcmUgd2l0aCBhIGdpdmVuIHJhZGl1cwoKICAgIAlhcHBseVJhZGl1cyggcmFkaXVzICk7CgogICAgCS8vIGZpbmFsbHksIGNyZWF0ZSB0aGUgdXYgZGF0YQoKICAgIAlnZW5lcmF0ZVVWcygpOwoKICAgIAkvLyBidWlsZCBub24taW5kZXhlZCBnZW9tZXRyeQoKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRleEJ1ZmZlciwgMyApICk7CiAgICAJdGhpcy5hZGRBdHRyaWJ1dGUoICdub3JtYWwnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGV4QnVmZmVyLnNsaWNlKCksIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZCdWZmZXIsIDIgKSApOwoKICAgIAlpZiAoIGRldGFpbCA9PT0gMCApIHsKCiAgICAJCXRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsgLy8gZmxhdCBub3JtYWxzCgogICAgCX0gZWxzZSB7CgogICAgCQl0aGlzLm5vcm1hbGl6ZU5vcm1hbHMoKTsgLy8gc21vb3RoIG5vcm1hbHMKCiAgICAJfQoKICAgIAkvLyBoZWxwZXIgZnVuY3Rpb25zCgogICAgCWZ1bmN0aW9uIHN1YmRpdmlkZSggZGV0YWlsICkgewoKICAgIAkJdmFyIGEgPSBuZXcgVmVjdG9yMygpOwogICAgCQl2YXIgYiA9IG5ldyBWZWN0b3IzKCk7CiAgICAJCXZhciBjID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCS8vIGl0ZXJhdGUgb3ZlciBhbGwgZmFjZXMgYW5kIGFwcGx5IGEgc3ViZGl2aXNvbiB3aXRoIHRoZSBnaXZlbiBkZXRhaWwgdmFsdWUKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGluZGljZXMubGVuZ3RoOyBpICs9IDMgKSB7CgogICAgCQkJLy8gZ2V0IHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZmFjZQoKICAgIAkJCWdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAwIF0sIGEgKTsKICAgIAkJCWdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAxIF0sIGIgKTsKICAgIAkJCWdldFZlcnRleEJ5SW5kZXgoIGluZGljZXNbIGkgKyAyIF0sIGMgKTsKCiAgICAJCQkvLyBwZXJmb3JtIHN1YmRpdmlzaW9uCgogICAgCQkJc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gc3ViZGl2aWRlRmFjZSggYSwgYiwgYywgZGV0YWlsICkgewoKICAgIAkJdmFyIGNvbHMgPSBNYXRoLnBvdyggMiwgZGV0YWlsICk7CgogICAgCQkvLyB3ZSB1c2UgdGhpcyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGFzIGEgZGF0YSBzdHJ1Y3R1cmUgZm9yIGNyZWF0aW5nIHRoZSBzdWJkaXZpc2lvbgoKICAgIAkJdmFyIHYgPSBbXTsKCiAgICAJCXZhciBpLCBqOwoKICAgIAkJLy8gY29uc3RydWN0IGFsbCBvZiB0aGUgdmVydGljZXMgZm9yIHRoaXMgc3ViZGl2aXNpb24KCiAgICAJCWZvciAoIGkgPSAwOyBpIDw9IGNvbHM7IGkgKysgKSB7CgogICAgCQkJdlsgaSBdID0gW107CgogICAgCQkJdmFyIGFqID0gYS5jbG9uZSgpLmxlcnAoIGMsIGkgLyBjb2xzICk7CiAgICAJCQl2YXIgYmogPSBiLmNsb25lKCkubGVycCggYywgaSAvIGNvbHMgKTsKCiAgICAJCQl2YXIgcm93cyA9IGNvbHMgLSBpOwoKICAgIAkJCWZvciAoIGogPSAwOyBqIDw9IHJvd3M7IGogKysgKSB7CgogICAgCQkJCWlmICggaiA9PT0gMCAmJiBpID09PSBjb2xzICkgewoKICAgIAkJCQkJdlsgaSBdWyBqIF0gPSBhajsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXZbIGkgXVsgaiBdID0gYWouY2xvbmUoKS5sZXJwKCBiaiwgaiAvIHJvd3MgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vIGNvbnN0cnVjdCBhbGwgb2YgdGhlIGZhY2VzCgogICAgCQlmb3IgKCBpID0gMDsgaSA8IGNvbHM7IGkgKysgKSB7CgogICAgCQkJZm9yICggaiA9IDA7IGogPCAyICogKCBjb2xzIC0gaSApIC0gMTsgaiArKyApIHsKCiAgICAJCQkJdmFyIGsgPSBNYXRoLmZsb29yKCBqIC8gMiApOwoKICAgIAkJCQlpZiAoIGogJSAyID09PSAwICkgewoKICAgIAkJCQkJcHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7CiAgICAJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgXSApOwogICAgCQkJCQlwdXNoVmVydGV4KCB2WyBpIF1bIGsgXSApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJcHVzaFZlcnRleCggdlsgaSBdWyBrICsgMSBdICk7CiAgICAJCQkJCXB1c2hWZXJ0ZXgoIHZbIGkgKyAxIF1bIGsgKyAxIF0gKTsKICAgIAkJCQkJcHVzaFZlcnRleCggdlsgaSArIDEgXVsgayBdICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gYXBwbHlSYWRpdXMoIHJhZGl1cyApIHsKCiAgICAJCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJLy8gaXRlcmF0ZSBvdmVyIHRoZSBlbnRpcmUgYnVmZmVyIGFuZCBhcHBseSB0aGUgcmFkaXVzIHRvIGVhY2ggdmVydGV4CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7CgogICAgCQkJdmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07CiAgICAJCQl2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTsKICAgIAkJCXZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdOwoKICAgIAkJCXZlcnRleC5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggcmFkaXVzICk7CgogICAgCQkJdmVydGV4QnVmZmVyWyBpICsgMCBdID0gdmVydGV4Lng7CiAgICAJCQl2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0gPSB2ZXJ0ZXgueTsKICAgIAkJCXZlcnRleEJ1ZmZlclsgaSArIDIgXSA9IHZlcnRleC56OwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkgewoKICAgIAkJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDMgKSB7CgogICAgCQkJdmVydGV4LnggPSB2ZXJ0ZXhCdWZmZXJbIGkgKyAwIF07CiAgICAJCQl2ZXJ0ZXgueSA9IHZlcnRleEJ1ZmZlclsgaSArIDEgXTsKICAgIAkJCXZlcnRleC56ID0gdmVydGV4QnVmZmVyWyBpICsgMiBdOwoKICAgIAkJCXZhciB1ID0gYXppbXV0aCggdmVydGV4ICkgLyAyIC8gTWF0aC5QSSArIDAuNTsKICAgIAkJCXZhciB2ID0gaW5jbGluYXRpb24oIHZlcnRleCApIC8gTWF0aC5QSSArIDAuNTsKICAgIAkJCXV2QnVmZmVyLnB1c2goIHUsIDEgLSB2ICk7CgogICAgCQl9CgogICAgCQljb3JyZWN0VVZzKCk7CgogICAgCQljb3JyZWN0U2VhbSgpOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGNvcnJlY3RTZWFtKCkgewoKICAgIAkJLy8gaGFuZGxlIGNhc2Ugd2hlbiBmYWNlIHN0cmFkZGxlcyB0aGUgc2VhbSwgc2VlICMzMjY5CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB1dkJ1ZmZlci5sZW5ndGg7IGkgKz0gNiApIHsKCiAgICAJCQkvLyB1diBkYXRhIG9mIGEgc2luZ2xlIGZhY2UKCiAgICAJCQl2YXIgeDAgPSB1dkJ1ZmZlclsgaSArIDAgXTsKICAgIAkJCXZhciB4MSA9IHV2QnVmZmVyWyBpICsgMiBdOwogICAgCQkJdmFyIHgyID0gdXZCdWZmZXJbIGkgKyA0IF07CgogICAgCQkJdmFyIG1heCA9IE1hdGgubWF4KCB4MCwgeDEsIHgyICk7CiAgICAJCQl2YXIgbWluID0gTWF0aC5taW4oIHgwLCB4MSwgeDIgKTsKCiAgICAJCQkvLyAwLjkgaXMgc29tZXdoYXQgYXJiaXRyYXJ5CgogICAgCQkJaWYgKCBtYXggPiAwLjkgJiYgbWluIDwgMC4xICkgewoKICAgIAkJCQlpZiAoIHgwIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAwIF0gKz0gMTsKICAgIAkJCQlpZiAoIHgxIDwgMC4yICkgdXZCdWZmZXJbIGkgKyAyIF0gKz0gMTsKICAgIAkJCQlpZiAoIHgyIDwgMC4yICkgdXZCdWZmZXJbIGkgKyA0IF0gKz0gMTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcHVzaFZlcnRleCggdmVydGV4ICkgewoKICAgIAkJdmVydGV4QnVmZmVyLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBnZXRWZXJ0ZXhCeUluZGV4KCBpbmRleCwgdmVydGV4ICkgewoKICAgIAkJdmFyIHN0cmlkZSA9IGluZGV4ICogMzsKCiAgICAJCXZlcnRleC54ID0gdmVydGljZXNbIHN0cmlkZSArIDAgXTsKICAgIAkJdmVydGV4LnkgPSB2ZXJ0aWNlc1sgc3RyaWRlICsgMSBdOwogICAgCQl2ZXJ0ZXgueiA9IHZlcnRpY2VzWyBzdHJpZGUgKyAyIF07CgogICAgCX0KCiAgICAJZnVuY3Rpb24gY29ycmVjdFVWcygpIHsKCiAgICAJCXZhciBhID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJdmFyIGIgPSBuZXcgVmVjdG9yMygpOwogICAgCQl2YXIgYyA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl2YXIgY2VudHJvaWQgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJdmFyIHV2QSA9IG5ldyBWZWN0b3IyKCk7CiAgICAJCXZhciB1dkIgPSBuZXcgVmVjdG9yMigpOwogICAgCQl2YXIgdXZDID0gbmV3IFZlY3RvcjIoKTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgaiA9IDA7IGkgPCB2ZXJ0ZXhCdWZmZXIubGVuZ3RoOyBpICs9IDksIGogKz0gNiApIHsKCiAgICAJCQlhLnNldCggdmVydGV4QnVmZmVyWyBpICsgMCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyAxIF0sIHZlcnRleEJ1ZmZlclsgaSArIDIgXSApOwogICAgCQkJYi5zZXQoIHZlcnRleEJ1ZmZlclsgaSArIDMgXSwgdmVydGV4QnVmZmVyWyBpICsgNCBdLCB2ZXJ0ZXhCdWZmZXJbIGkgKyA1IF0gKTsKICAgIAkJCWMuc2V0KCB2ZXJ0ZXhCdWZmZXJbIGkgKyA2IF0sIHZlcnRleEJ1ZmZlclsgaSArIDcgXSwgdmVydGV4QnVmZmVyWyBpICsgOCBdICk7CgogICAgCQkJdXZBLnNldCggdXZCdWZmZXJbIGogKyAwIF0sIHV2QnVmZmVyWyBqICsgMSBdICk7CiAgICAJCQl1dkIuc2V0KCB1dkJ1ZmZlclsgaiArIDIgXSwgdXZCdWZmZXJbIGogKyAzIF0gKTsKICAgIAkJCXV2Qy5zZXQoIHV2QnVmZmVyWyBqICsgNCBdLCB1dkJ1ZmZlclsgaiArIDUgXSApOwoKICAgIAkJCWNlbnRyb2lkLmNvcHkoIGEgKS5hZGQoIGIgKS5hZGQoIGMgKS5kaXZpZGVTY2FsYXIoIDMgKTsKCiAgICAJCQl2YXIgYXppID0gYXppbXV0aCggY2VudHJvaWQgKTsKCiAgICAJCQljb3JyZWN0VVYoIHV2QSwgaiArIDAsIGEsIGF6aSApOwogICAgCQkJY29ycmVjdFVWKCB1dkIsIGogKyAyLCBiLCBhemkgKTsKICAgIAkJCWNvcnJlY3RVViggdXZDLCBqICsgNCwgYywgYXppICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gY29ycmVjdFVWKCB1diwgc3RyaWRlLCB2ZWN0b3IsIGF6aW11dGggKSB7CgogICAgCQlpZiAoICggYXppbXV0aCA8IDAgKSAmJiAoIHV2LnggPT09IDEgKSApIHsKCiAgICAJCQl1dkJ1ZmZlclsgc3RyaWRlIF0gPSB1di54IC0gMTsKCiAgICAJCX0KCiAgICAJCWlmICggKCB2ZWN0b3IueCA9PT0gMCApICYmICggdmVjdG9yLnogPT09IDAgKSApIHsKCiAgICAJCQl1dkJ1ZmZlclsgc3RyaWRlIF0gPSBhemltdXRoIC8gMiAvIE1hdGguUEkgKyAwLjU7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gQW5nbGUgYXJvdW5kIHRoZSBZIGF4aXMsIGNvdW50ZXItY2xvY2t3aXNlIHdoZW4gbG9va2luZyBmcm9tIGFib3ZlLgoKICAgIAlmdW5jdGlvbiBhemltdXRoKCB2ZWN0b3IgKSB7CgogICAgCQlyZXR1cm4gTWF0aC5hdGFuMiggdmVjdG9yLnosIC0gdmVjdG9yLnggKTsKCiAgICAJfQoKCiAgICAJLy8gQW5nbGUgYWJvdmUgdGhlIFhaIHBsYW5lLgoKICAgIAlmdW5jdGlvbiBpbmNsaW5hdGlvbiggdmVjdG9yICkgewoKICAgIAkJcmV0dXJuIE1hdGguYXRhbjIoIC0gdmVjdG9yLnksIE1hdGguc3FydCggKCB2ZWN0b3IueCAqIHZlY3Rvci54ICkgKyAoIHZlY3Rvci56ICogdmVjdG9yLnogKSApICk7CgogICAgCX0KCiAgICB9CgogICAgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgdGltb3RoeXByYXRsZXkgLyBodHRwczovL2dpdGh1Yi5jb20vdGltb3RoeXByYXRsZXkKICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICAvLyBUZXRyYWhlZHJvbkdlb21ldHJ5CgogICAgZnVuY3Rpb24gVGV0cmFoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1RldHJhaGVkcm9uR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQlkZXRhaWw6IGRldGFpbAogICAgCX07CgogICAgCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBUZXRyYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgVGV0cmFoZWRyb25HZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXRyYWhlZHJvbkdlb21ldHJ5OwoKICAgIC8vIFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCiAgICAJdmFyIHZlcnRpY2VzID0gWwogICAgCQkxLCAxLCAxLCAJLSAxLCAtIDEsIDEsIAktIDEsIDEsIC0gMSwgCTEsIC0gMSwgLSAxCiAgICAJXTsKCiAgICAJdmFyIGluZGljZXMgPSBbCiAgICAJCTIsIDEsIDAsIAkwLCAzLCAyLAkxLCAzLCAwLAkyLCAzLCAxCiAgICAJXTsKCiAgICAJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApOwoKICAgIAl0aGlzLnR5cGUgPSAnVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCWRldGFpbDogZGV0YWlsCiAgICAJfTsKCiAgICB9CgogICAgVGV0cmFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHRpbW90aHlwcmF0bGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL3RpbW90aHlwcmF0bGV5CiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICovCgogICAgLy8gT2N0YWhlZHJvbkdlb21ldHJ5CgogICAgZnVuY3Rpb24gT2N0YWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnT2N0YWhlZHJvbkdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlyYWRpdXM6IHJhZGl1cywKICAgIAkJZGV0YWlsOiBkZXRhaWwKICAgIAl9OwoKICAgIAl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBPY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBPY3RhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkdlb21ldHJ5OwoKICAgIC8vIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CgogICAgCXZhciB2ZXJ0aWNlcyA9IFsKICAgIAkJMSwgMCwgMCwgCS0gMSwgMCwgMCwJMCwgMSwgMCwKICAgIAkJMCwgLSAxLCAwLCAJMCwgMCwgMSwJMCwgMCwgLSAxCiAgICAJXTsKCiAgICAJdmFyIGluZGljZXMgPSBbCiAgICAJCTAsIDIsIDQsCTAsIDQsIDMsCTAsIDMsIDUsCiAgICAJCTAsIDUsIDIsCTEsIDIsIDUsCTEsIDUsIDMsCiAgICAJCTEsIDMsIDQsCTEsIDQsIDIKICAgIAldOwoKICAgIAlQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7CgogICAgCXRoaXMudHlwZSA9ICdPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQlkZXRhaWw6IGRldGFpbAogICAgCX07CgogICAgfQoKICAgIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OwoKICAgIC8qKgogICAgICogQGF1dGhvciB0aW1vdGh5cHJhdGxleSAvIGh0dHBzOi8vZ2l0aHViLmNvbS90aW1vdGh5cHJhdGxleQogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIC8vIEljb3NhaGVkcm9uR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBJY29zYWhlZHJvbkdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnSWNvc2FoZWRyb25HZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCWRldGFpbDogZGV0YWlsCiAgICAJfTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CiAgICAJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgogICAgfQoKICAgIEljb3NhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBJY29zYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEljb3NhaGVkcm9uR2VvbWV0cnk7CgogICAgLy8gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgZGV0YWlsICkgewoKICAgIAl2YXIgdCA9ICggMSArIE1hdGguc3FydCggNSApICkgLyAyOwoKICAgIAl2YXIgdmVydGljZXMgPSBbCiAgICAJCS0gMSwgdCwgMCwgCTEsIHQsIDAsIAktIDEsIC0gdCwgMCwgCTEsIC0gdCwgMCwKICAgIAkJIDAsIC0gMSwgdCwgCTAsIDEsIHQsCTAsIC0gMSwgLSB0LCAJMCwgMSwgLSB0LAogICAgCQkgdCwgMCwgLSAxLCAJdCwgMCwgMSwgCS0gdCwgMCwgLSAxLCAJLSB0LCAwLCAxCiAgICAJXTsKCiAgICAJdmFyIGluZGljZXMgPSBbCiAgICAJCSAwLCAxMSwgNSwgCTAsIDUsIDEsIAkwLCAxLCA3LCAJMCwgNywgMTAsIAkwLCAxMCwgMTEsCiAgICAJCSAxLCA1LCA5LCAJNSwgMTEsIDQsCTExLCAxMCwgMiwJMTAsIDcsIDYsCTcsIDEsIDgsCiAgICAJCSAzLCA5LCA0LCAJMywgNCwgMiwJMywgMiwgNiwJMywgNiwgOCwJMywgOCwgOSwKICAgIAkJIDQsIDksIDUsIAkyLCA0LCAxMSwJNiwgMiwgMTAsCTgsIDYsIDcsCTksIDgsIDEKICAgIAldOwoKICAgIAlQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcywgdmVydGljZXMsIGluZGljZXMsIHJhZGl1cywgZGV0YWlsICk7CgogICAgCXRoaXMudHlwZSA9ICdJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlyYWRpdXM6IHJhZGl1cywKICAgIAkJZGV0YWlsOiBkZXRhaWwKICAgIAl9OwoKICAgIH0KCiAgICBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgQWJlIFBhem9zIC8gaHR0cHM6Ly9oYW1vaWQuY29tCiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICovCgogICAgLy8gRG9kZWNhaGVkcm9uR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBEb2RlY2FoZWRyb25HZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlyYWRpdXM6IHJhZGl1cywKICAgIAkJZGV0YWlsOiBkZXRhaWwKICAgIAl9OwoKICAgIAl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGRldGFpbCApICk7CiAgICAJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgogICAgfQoKICAgIERvZGVjYWhlZHJvbkdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgRG9kZWNhaGVkcm9uR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRG9kZWNhaGVkcm9uR2VvbWV0cnk7CgogICAgLy8gRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeSggcmFkaXVzLCBkZXRhaWwgKSB7CgogICAgCXZhciB0ID0gKCAxICsgTWF0aC5zcXJ0KCA1ICkgKSAvIDI7CiAgICAJdmFyIHIgPSAxIC8gdDsKCiAgICAJdmFyIHZlcnRpY2VzID0gWwoKICAgIAkJLy8gKMKxMSwgwrExLCDCsTEpCiAgICAJCS0gMSwgLSAxLCAtIDEsCS0gMSwgLSAxLCAxLAogICAgCQktIDEsIDEsIC0gMSwgLSAxLCAxLCAxLAogICAgCQkxLCAtIDEsIC0gMSwgMSwgLSAxLCAxLAogICAgCQkxLCAxLCAtIDEsIDEsIDEsIDEsCgogICAgCQkvLyAoMCwgwrExL8+GLCDCsc+GKQogICAgCQkgMCwgLSByLCAtIHQsIDAsIC0gciwgdCwKICAgIAkJIDAsIHIsIC0gdCwgMCwgciwgdCwKCiAgICAJCS8vICjCsTEvz4YsIMKxz4YsIDApCiAgICAJCS0gciwgLSB0LCAwLCAtIHIsIHQsIDAsCiAgICAJCSByLCAtIHQsIDAsIHIsIHQsIDAsCgogICAgCQkvLyAowrHPhiwgMCwgwrExL8+GKQogICAgCQktIHQsIDAsIC0gciwgdCwgMCwgLSByLAogICAgCQktIHQsIDAsIHIsIHQsIDAsIHIKICAgIAldOwoKICAgIAl2YXIgaW5kaWNlcyA9IFsKICAgIAkJMywgMTEsIDcsIAkzLCA3LCAxNSwgCTMsIDE1LCAxMywKICAgIAkJNywgMTksIDE3LCAJNywgMTcsIDYsIAk3LCA2LCAxNSwKICAgIAkJMTcsIDQsIDgsIAkxNywgOCwgMTAsIAkxNywgMTAsIDYsCiAgICAJCTgsIDAsIDE2LCAJOCwgMTYsIDIsIAk4LCAyLCAxMCwKICAgIAkJMCwgMTIsIDEsIAkwLCAxLCAxOCwgCTAsIDE4LCAxNiwKICAgIAkJNiwgMTAsIDIsIAk2LCAyLCAxMywgCTYsIDEzLCAxNSwKICAgIAkJMiwgMTYsIDE4LCAJMiwgMTgsIDMsIAkyLCAzLCAxMywKICAgIAkJMTgsIDEsIDksIAkxOCwgOSwgMTEsIAkxOCwgMTEsIDMsCiAgICAJCTQsIDE0LCAxMiwgCTQsIDEyLCAwLCAJNCwgMCwgOCwKICAgIAkJMTEsIDksIDUsIAkxMSwgNSwgMTksIAkxMSwgMTksIDcsCiAgICAJCTE5LCA1LCAxNCwgCTE5LCAxNCwgNCwgCTE5LCA0LCAxNywKICAgIAkJMSwgMTIsIDE0LCAJMSwgMTQsIDUsIAkxLCA1LCA5CiAgICAJXTsKCiAgICAJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHZlcnRpY2VzLCBpbmRpY2VzLCByYWRpdXMsIGRldGFpbCApOwoKICAgIAl0aGlzLnR5cGUgPSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQlkZXRhaWw6IGRldGFpbAogICAgCX07CgogICAgfQoKICAgIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFBvbHloZWRyb25CdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERvZGVjYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OwoKICAgIC8qKgogICAgICogQGF1dGhvciBvb3Ntb3hpZWNvZGUgLyBodHRwczovL2dpdGh1Yi5jb20vb29zbW94aWVjb2RlCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cHM6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQogICAgICogQGF1dGhvciBtaW5pbmdvbGQgLyBodHRwczovL2dpdGh1Yi5jb20vbWluaW5nb2xkCiAgICAgKiBAYXV0aG9yIGpvbm9icjEgLyBodHRwczovL2dpdGh1Yi5jb20vam9ub2JyMQogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqCiAgICAgKi8KCiAgICAvLyBUdWJlR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBUdWJlR2VvbWV0cnkoIHBhdGgsIHR1YnVsYXJTZWdtZW50cywgcmFkaXVzLCByYWRpYWxTZWdtZW50cywgY2xvc2VkLCB0YXBlciApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnVHViZUdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlwYXRoOiBwYXRoLAogICAgCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKICAgIAkJY2xvc2VkOiBjbG9zZWQKICAgIAl9OwoKICAgIAlpZiAoIHRhcGVyICE9PSB1bmRlZmluZWQgKSBjb25zb2xlLndhcm4oICdUSFJFRS5UdWJlR2VvbWV0cnk6IHRhcGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl2YXIgYnVmZmVyR2VvbWV0cnkgPSBuZXcgVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApOwoKICAgIAkvLyBleHBvc2UgaW50ZXJuYWxzCgogICAgCXRoaXMudGFuZ2VudHMgPSBidWZmZXJHZW9tZXRyeS50YW5nZW50czsKICAgIAl0aGlzLm5vcm1hbHMgPSBidWZmZXJHZW9tZXRyeS5ub3JtYWxzOwogICAgCXRoaXMuYmlub3JtYWxzID0gYnVmZmVyR2VvbWV0cnkuYmlub3JtYWxzOwoKICAgIAkvLyBjcmVhdGUgZ2VvbWV0cnkKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIGJ1ZmZlckdlb21ldHJ5ICk7CiAgICAJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgogICAgfQoKICAgIFR1YmVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIFR1YmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUdWJlR2VvbWV0cnk7CgogICAgLy8gVHViZUJ1ZmZlckdlb21ldHJ5CgogICAgZnVuY3Rpb24gVHViZUJ1ZmZlckdlb21ldHJ5KCBwYXRoLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGl1cywgcmFkaWFsU2VnbWVudHMsIGNsb3NlZCApIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnVHViZUJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlwYXRoOiBwYXRoLAogICAgCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKICAgIAkJY2xvc2VkOiBjbG9zZWQKICAgIAl9OwoKICAgIAl0dWJ1bGFyU2VnbWVudHMgPSB0dWJ1bGFyU2VnbWVudHMgfHwgNjQ7CiAgICAJcmFkaXVzID0gcmFkaXVzIHx8IDE7CiAgICAJcmFkaWFsU2VnbWVudHMgPSByYWRpYWxTZWdtZW50cyB8fCA4OwogICAgCWNsb3NlZCA9IGNsb3NlZCB8fCBmYWxzZTsKCiAgICAJdmFyIGZyYW1lcyA9IHBhdGguY29tcHV0ZUZyZW5ldEZyYW1lcyggdHVidWxhclNlZ21lbnRzLCBjbG9zZWQgKTsKCiAgICAJLy8gZXhwb3NlIGludGVybmFscwoKICAgIAl0aGlzLnRhbmdlbnRzID0gZnJhbWVzLnRhbmdlbnRzOwogICAgCXRoaXMubm9ybWFscyA9IGZyYW1lcy5ub3JtYWxzOwogICAgCXRoaXMuYmlub3JtYWxzID0gZnJhbWVzLmJpbm9ybWFsczsKCiAgICAJLy8gaGVscGVyIHZhcmlhYmxlcwoKICAgIAl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOwogICAgCXZhciBQID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJdmFyIGksIGo7CgogICAgCS8vIGJ1ZmZlcgoKICAgIAl2YXIgdmVydGljZXMgPSBbXTsKICAgIAl2YXIgbm9ybWFscyA9IFtdOwogICAgCXZhciB1dnMgPSBbXTsKICAgIAl2YXIgaW5kaWNlcyA9IFtdOwoKICAgIAkvLyBjcmVhdGUgYnVmZmVyIGRhdGEKCiAgICAJZ2VuZXJhdGVCdWZmZXJEYXRhKCk7CgogICAgCS8vIGJ1aWxkIGdlb21ldHJ5CgogICAgCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgogICAgCS8vIGZ1bmN0aW9ucwoKICAgIAlmdW5jdGlvbiBnZW5lcmF0ZUJ1ZmZlckRhdGEoKSB7CgogICAgCQlmb3IgKCBpID0gMDsgaSA8IHR1YnVsYXJTZWdtZW50czsgaSArKyApIHsKCiAgICAJCQlnZW5lcmF0ZVNlZ21lbnQoIGkgKTsKCiAgICAJCX0KCiAgICAJCS8vIGlmIHRoZSBnZW9tZXRyeSBpcyBub3QgY2xvc2VkLCBnZW5lcmF0ZSB0aGUgbGFzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMKICAgIAkJLy8gYXQgdGhlIHJlZ3VsYXIgcG9zaXRpb24gb24gdGhlIGdpdmVuIHBhdGgKICAgIAkJLy8KICAgIAkJLy8gaWYgdGhlIGdlb21ldHJ5IGlzIGNsb3NlZCwgZHVwbGljYXRlIHRoZSBmaXJzdCByb3cgb2YgdmVydGljZXMgYW5kIG5vcm1hbHMgKHV2cyB3aWxsIGRpZmZlcikKCiAgICAJCWdlbmVyYXRlU2VnbWVudCggKCBjbG9zZWQgPT09IGZhbHNlICkgPyB0dWJ1bGFyU2VnbWVudHMgOiAwICk7CgogICAgCQkvLyB1dnMgYXJlIGdlbmVyYXRlZCBpbiBhIHNlcGFyYXRlIGZ1bmN0aW9uLgogICAgCQkvLyB0aGlzIG1ha2VzIGl0IGVhc3kgY29tcHV0ZSBjb3JyZWN0IHZhbHVlcyBmb3IgY2xvc2VkIGdlb21ldHJpZXMKCiAgICAJCWdlbmVyYXRlVVZzKCk7CgogICAgCQkvLyBmaW5hbGx5IGNyZWF0ZSBmYWNlcwoKICAgIAkJZ2VuZXJhdGVJbmRpY2VzKCk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBpICkgewoKICAgIAkJLy8gd2UgdXNlIGdldFBvaW50QXQgdG8gc2FtcGxlIGV2ZW5seSBkaXN0cmlidXRlZCBwb2ludHMgZnJvbSB0aGUgZ2l2ZW4gcGF0aAoKICAgIAkJUCA9IHBhdGguZ2V0UG9pbnRBdCggaSAvIHR1YnVsYXJTZWdtZW50cywgUCApOwoKICAgIAkJLy8gcmV0cmlldmUgY29ycmVzcG9uZGluZyBub3JtYWwgYW5kIGJpbm9ybWFsCgogICAgCQl2YXIgTiA9IGZyYW1lcy5ub3JtYWxzWyBpIF07CiAgICAJCXZhciBCID0gZnJhbWVzLmJpbm9ybWFsc1sgaSBdOwoKICAgIAkJLy8gZ2VuZXJhdGUgbm9ybWFscyBhbmQgdmVydGljZXMgZm9yIHRoZSBjdXJyZW50IHNlZ21lbnQKCiAgICAJCWZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkgewoKICAgIAkJCXZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7CgogICAgCQkJdmFyIHNpbiA9IE1hdGguc2luKCB2ICk7CiAgICAJCQl2YXIgY29zID0gLSBNYXRoLmNvcyggdiApOwoKICAgIAkJCS8vIG5vcm1hbAoKICAgIAkJCW5vcm1hbC54ID0gKCBjb3MgKiBOLnggKyBzaW4gKiBCLnggKTsKICAgIAkJCW5vcm1hbC55ID0gKCBjb3MgKiBOLnkgKyBzaW4gKiBCLnkgKTsKICAgIAkJCW5vcm1hbC56ID0gKCBjb3MgKiBOLnogKyBzaW4gKiBCLnogKTsKICAgIAkJCW5vcm1hbC5ub3JtYWxpemUoKTsKCiAgICAJCQlub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKCiAgICAJCQkvLyB2ZXJ0ZXgKCiAgICAJCQl2ZXJ0ZXgueCA9IFAueCArIHJhZGl1cyAqIG5vcm1hbC54OwogICAgCQkJdmVydGV4LnkgPSBQLnkgKyByYWRpdXMgKiBub3JtYWwueTsKICAgIAkJCXZlcnRleC56ID0gUC56ICsgcmFkaXVzICogbm9ybWFsLno7CgogICAgCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCB2ZXJ0ZXgueiApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdlbmVyYXRlSW5kaWNlcygpIHsKCiAgICAJCWZvciAoIGogPSAxOyBqIDw9IHR1YnVsYXJTZWdtZW50czsgaiArKyApIHsKCiAgICAJCQlmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHsKCiAgICAJCQkJdmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApOwogICAgCQkJCXZhciBiID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyAoIGkgLSAxICk7CiAgICAJCQkJdmFyIGMgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArIGk7CiAgICAJCQkJdmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTsKCiAgICAJCQkJLy8gZmFjZXMKCiAgICAJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CiAgICAJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdlbmVyYXRlVVZzKCkgewoKICAgIAkJZm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkgewoKICAgIAkJCWZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkgewoKICAgIAkJCQl1di54ID0gaSAvIHR1YnVsYXJTZWdtZW50czsKICAgIAkJCQl1di55ID0gaiAvIHJhZGlhbFNlZ21lbnRzOwoKICAgIAkJCQl1dnMucHVzaCggdXYueCwgdXYueSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfQoKICAgIH0KCiAgICBUdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBUdWJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVHViZUJ1ZmZlckdlb21ldHJ5OwoKICAgIFR1YmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKICAgIAl2YXIgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKICAgIAlkYXRhLnBhdGggPSB0aGlzLnBhcmFtZXRlcnMucGF0aC50b0pTT04oKTsKCiAgICAJcmV0dXJuIGRhdGE7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3Igb29zbW94aWVjb2RlCiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICoKICAgICAqIGJhc2VkIG9uIGh0dHA6Ly93d3cuYmxhY2twYXduLmNvbS90ZXh0cy9wcXRvcnVzLwogICAgICovCgogICAgLy8gVG9ydXNLbm90R2VvbWV0cnkKCiAgICBmdW5jdGlvbiBUb3J1c0tub3RHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxLCBoZWlnaHRTY2FsZSApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnVG9ydXNLbm90R2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQl0dWJlOiB0dWJlLAogICAgCQl0dWJ1bGFyU2VnbWVudHM6IHR1YnVsYXJTZWdtZW50cywKICAgIAkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAogICAgCQlwOiBwLAogICAgCQlxOiBxCiAgICAJfTsKCiAgICAJaWYgKCBoZWlnaHRTY2FsZSAhPT0gdW5kZWZpbmVkICkgY29uc29sZS53YXJuKCAnVEhSRUUuVG9ydXNLbm90R2VvbWV0cnk6IGhlaWdodFNjYWxlIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSAuc2NhbGUoIHgsIHksIHogKSBpbnN0ZWFkLicgKTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCB0dWJ1bGFyU2VnbWVudHMsIHJhZGlhbFNlZ21lbnRzLCBwLCBxICkgKTsKICAgIAl0aGlzLm1lcmdlVmVydGljZXMoKTsKCiAgICB9CgogICAgVG9ydXNLbm90R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBUb3J1c0tub3RHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0tub3RHZW9tZXRyeTsKCiAgICAvLyBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHR1YnVsYXJTZWdtZW50cywgcmFkaWFsU2VnbWVudHMsIHAsIHEgKSB7CgogICAgCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1RvcnVzS25vdEJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlyYWRpdXM6IHJhZGl1cywKICAgIAkJdHViZTogdHViZSwKICAgIAkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsCiAgICAJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKICAgIAkJcDogcCwKICAgIAkJcTogcQogICAgCX07CgogICAgCXJhZGl1cyA9IHJhZGl1cyB8fCAxOwogICAgCXR1YmUgPSB0dWJlIHx8IDAuNDsKICAgIAl0dWJ1bGFyU2VnbWVudHMgPSBNYXRoLmZsb29yKCB0dWJ1bGFyU2VnbWVudHMgKSB8fCA2NDsKICAgIAlyYWRpYWxTZWdtZW50cyA9IE1hdGguZmxvb3IoIHJhZGlhbFNlZ21lbnRzICkgfHwgODsKICAgIAlwID0gcCB8fCAyOwogICAgCXEgPSBxIHx8IDM7CgogICAgCS8vIGJ1ZmZlcnMKCiAgICAJdmFyIGluZGljZXMgPSBbXTsKICAgIAl2YXIgdmVydGljZXMgPSBbXTsKICAgIAl2YXIgbm9ybWFscyA9IFtdOwogICAgCXZhciB1dnMgPSBbXTsKCiAgICAJLy8gaGVscGVyIHZhcmlhYmxlcwoKICAgIAl2YXIgaSwgajsKCiAgICAJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciBQMSA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIFAyID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJdmFyIEIgPSBuZXcgVmVjdG9yMygpOwogICAgCXZhciBUID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgTiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKCiAgICAJZm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyArKyBpICkgewoKICAgIAkJLy8gdGhlIHJhZGlhbiAidSIgaXMgdXNlZCB0byBjYWxjdWxhdGUgdGhlIHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZSBvZiB0aGUgY3VycmVudCB0dWJ1bGFyIHNlZ2VtZW50CgogICAgCQl2YXIgdSA9IGkgLyB0dWJ1bGFyU2VnbWVudHMgKiBwICogTWF0aC5QSSAqIDI7CgogICAgCQkvLyBub3cgd2UgY2FsY3VsYXRlIHR3byBwb2ludHMuIFAxIGlzIG91ciBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSBjdXJ2ZSwgUDIgaXMgYSBsaXR0bGUgZmFydGhlciBhaGVhZC4KICAgIAkJLy8gdGhlc2UgcG9pbnRzIGFyZSB1c2VkIHRvIGNyZWF0ZSBhIHNwZWNpYWwgImNvb3JkaW5hdGUgc3BhY2UiLCB3aGljaCBpcyBuZWNlc3NhcnkgdG8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHZlcnRleCBwb3NpdGlvbnMKCiAgICAJCWNhbGN1bGF0ZVBvc2l0aW9uT25DdXJ2ZSggdSwgcCwgcSwgcmFkaXVzLCBQMSApOwogICAgCQljYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUgKyAwLjAxLCBwLCBxLCByYWRpdXMsIFAyICk7CgogICAgCQkvLyBjYWxjdWxhdGUgb3J0aG9ub3JtYWwgYmFzaXMKCiAgICAJCVQuc3ViVmVjdG9ycyggUDIsIFAxICk7CiAgICAJCU4uYWRkVmVjdG9ycyggUDIsIFAxICk7CiAgICAJCUIuY3Jvc3NWZWN0b3JzKCBULCBOICk7CiAgICAJCU4uY3Jvc3NWZWN0b3JzKCBCLCBUICk7CgogICAgCQkvLyBub3JtYWxpemUgQiwgTi4gVCBjYW4gYmUgaWdub3JlZCwgd2UgZG9uJ3QgdXNlIGl0CgogICAgCQlCLm5vcm1hbGl6ZSgpOwogICAgCQlOLm5vcm1hbGl6ZSgpOwoKICAgIAkJZm9yICggaiA9IDA7IGogPD0gcmFkaWFsU2VnbWVudHM7ICsrIGogKSB7CgogICAgCQkJLy8gbm93IGNhbGN1bGF0ZSB0aGUgdmVydGljZXMuIHRoZXkgYXJlIG5vdGhpbmcgbW9yZSB0aGFuIGFuIGV4dHJ1c2lvbiBvZiB0aGUgdG9ydXMgY3VydmUuCiAgICAJCQkvLyBiZWNhdXNlIHdlIGV4dHJ1ZGUgYSBzaGFwZSBpbiB0aGUgeHktcGxhbmUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gY2FsY3VsYXRlIGEgei12YWx1ZS4KCiAgICAJCQl2YXIgdiA9IGogLyByYWRpYWxTZWdtZW50cyAqIE1hdGguUEkgKiAyOwogICAgCQkJdmFyIGN4ID0gLSB0dWJlICogTWF0aC5jb3MoIHYgKTsKICAgIAkJCXZhciBjeSA9IHR1YmUgKiBNYXRoLnNpbiggdiApOwoKICAgIAkJCS8vIG5vdyBjYWxjdWxhdGUgdGhlIGZpbmFsIHZlcnRleCBwb3NpdGlvbi4KICAgIAkJCS8vIGZpcnN0IHdlIG9yaWVudCB0aGUgZXh0cnVzaW9uIHdpdGggb3VyIGJhc2lzIHZlY3RvcywgdGhlbiB3ZSBhZGQgaXQgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gb24gdGhlIGN1cnZlCgogICAgCQkJdmVydGV4LnggPSBQMS54ICsgKCBjeCAqIE4ueCArIGN5ICogQi54ICk7CiAgICAJCQl2ZXJ0ZXgueSA9IFAxLnkgKyAoIGN4ICogTi55ICsgY3kgKiBCLnkgKTsKICAgIAkJCXZlcnRleC56ID0gUDEueiArICggY3ggKiBOLnogKyBjeSAqIEIueiApOwoKICAgIAkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJCQkvLyBub3JtYWwgKFAxIGlzIGFsd2F5cyB0aGUgY2VudGVyL29yaWdpbiBvZiB0aGUgZXh0cnVzaW9uLCB0aHVzIHdlIGNhbiB1c2UgaXQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwpCgogICAgCQkJbm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgUDEgKS5ub3JtYWxpemUoKTsKCiAgICAJCQlub3JtYWxzLnB1c2goIG5vcm1hbC54LCBub3JtYWwueSwgbm9ybWFsLnogKTsKCiAgICAJCQkvLyB1dgoKICAgIAkJCXV2cy5wdXNoKCBpIC8gdHVidWxhclNlZ21lbnRzICk7CiAgICAJCQl1dnMucHVzaCggaiAvIHJhZGlhbFNlZ21lbnRzICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gZ2VuZXJhdGUgaW5kaWNlcwoKICAgIAlmb3IgKCBqID0gMTsgaiA8PSB0dWJ1bGFyU2VnbWVudHM7IGogKysgKSB7CgogICAgCQlmb3IgKCBpID0gMTsgaSA8PSByYWRpYWxTZWdtZW50czsgaSArKyApIHsKCiAgICAJCQkvLyBpbmRpY2VzCgogICAgCQkJdmFyIGEgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgKCBpIC0gMSApOwogICAgCQkJdmFyIGIgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogaiArICggaSAtIDEgKTsKICAgIAkJCXZhciBjID0gKCByYWRpYWxTZWdtZW50cyArIDEgKSAqIGogKyBpOwogICAgCQkJdmFyIGQgPSAoIHJhZGlhbFNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTsKCiAgICAJCQkvLyBmYWNlcwoKICAgIAkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwogICAgCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCiAgICAJLy8gdGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjdXJyZW50IHBvc2l0aW9uIG9uIHRoZSB0b3J1cyBjdXJ2ZQoKICAgIAlmdW5jdGlvbiBjYWxjdWxhdGVQb3NpdGlvbk9uQ3VydmUoIHUsIHAsIHEsIHJhZGl1cywgcG9zaXRpb24gKSB7CgogICAgCQl2YXIgY3UgPSBNYXRoLmNvcyggdSApOwogICAgCQl2YXIgc3UgPSBNYXRoLnNpbiggdSApOwogICAgCQl2YXIgcXVPdmVyUCA9IHEgLyBwICogdTsKICAgIAkJdmFyIGNzID0gTWF0aC5jb3MoIHF1T3ZlclAgKTsKCiAgICAJCXBvc2l0aW9uLnggPSByYWRpdXMgKiAoIDIgKyBjcyApICogMC41ICogY3U7CiAgICAJCXBvc2l0aW9uLnkgPSByYWRpdXMgKiAoIDIgKyBjcyApICogc3UgKiAwLjU7CiAgICAJCXBvc2l0aW9uLnogPSByYWRpdXMgKiBNYXRoLnNpbiggcXVPdmVyUCApICogMC41OwoKICAgIAl9CgogICAgfQoKICAgIFRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgVG9ydXNLbm90QnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNLbm90QnVmZmVyR2VvbWV0cnk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG9vc21veGllY29kZQogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICAvLyBUb3J1c0dlb21ldHJ5CgogICAgZnVuY3Rpb24gVG9ydXNHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1RvcnVzR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQl0dWJlOiB0dWJlLAogICAgCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCiAgICAJCXR1YnVsYXJTZWdtZW50czogdHVidWxhclNlZ21lbnRzLAogICAgCQlhcmM6IGFyYwogICAgCX07CgogICAgCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgVG9ydXNCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB0dWJlLCByYWRpYWxTZWdtZW50cywgdHVidWxhclNlZ21lbnRzLCBhcmMgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBUb3J1c0dlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgVG9ydXNHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUb3J1c0dlb21ldHJ5OwoKICAgIC8vIFRvcnVzQnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBUb3J1c0J1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHR1YmUsIHJhZGlhbFNlZ21lbnRzLCB0dWJ1bGFyU2VnbWVudHMsIGFyYyApIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnVG9ydXNCdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCXR1YmU6IHR1YmUsCiAgICAJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKICAgIAkJdHVidWxhclNlZ21lbnRzOiB0dWJ1bGFyU2VnbWVudHMsCiAgICAJCWFyYzogYXJjCiAgICAJfTsKCiAgICAJcmFkaXVzID0gcmFkaXVzIHx8IDE7CiAgICAJdHViZSA9IHR1YmUgfHwgMC40OwogICAgCXJhZGlhbFNlZ21lbnRzID0gTWF0aC5mbG9vciggcmFkaWFsU2VnbWVudHMgKSB8fCA4OwogICAgCXR1YnVsYXJTZWdtZW50cyA9IE1hdGguZmxvb3IoIHR1YnVsYXJTZWdtZW50cyApIHx8IDY7CiAgICAJYXJjID0gYXJjIHx8IE1hdGguUEkgKiAyOwoKICAgIAkvLyBidWZmZXJzCgogICAgCXZhciBpbmRpY2VzID0gW107CiAgICAJdmFyIHZlcnRpY2VzID0gW107CiAgICAJdmFyIG5vcm1hbHMgPSBbXTsKICAgIAl2YXIgdXZzID0gW107CgogICAgCS8vIGhlbHBlciB2YXJpYWJsZXMKCiAgICAJdmFyIGNlbnRlciA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciBqLCBpOwoKICAgIAkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgogICAgCWZvciAoIGogPSAwOyBqIDw9IHJhZGlhbFNlZ21lbnRzOyBqICsrICkgewoKICAgIAkJZm9yICggaSA9IDA7IGkgPD0gdHVidWxhclNlZ21lbnRzOyBpICsrICkgewoKICAgIAkJCXZhciB1ID0gaSAvIHR1YnVsYXJTZWdtZW50cyAqIGFyYzsKICAgIAkJCXZhciB2ID0gaiAvIHJhZGlhbFNlZ21lbnRzICogTWF0aC5QSSAqIDI7CgogICAgCQkJLy8gdmVydGV4CgogICAgCQkJdmVydGV4LnggPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLmNvcyggdSApOwogICAgCQkJdmVydGV4LnkgPSAoIHJhZGl1cyArIHR1YmUgKiBNYXRoLmNvcyggdiApICkgKiBNYXRoLnNpbiggdSApOwogICAgCQkJdmVydGV4LnogPSB0dWJlICogTWF0aC5zaW4oIHYgKTsKCiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJLy8gbm9ybWFsCgogICAgCQkJY2VudGVyLnggPSByYWRpdXMgKiBNYXRoLmNvcyggdSApOwogICAgCQkJY2VudGVyLnkgPSByYWRpdXMgKiBNYXRoLnNpbiggdSApOwogICAgCQkJbm9ybWFsLnN1YlZlY3RvcnMoIHZlcnRleCwgY2VudGVyICkubm9ybWFsaXplKCk7CgogICAgCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgogICAgCQkJLy8gdXYKCiAgICAJCQl1dnMucHVzaCggaSAvIHR1YnVsYXJTZWdtZW50cyApOwogICAgCQkJdXZzLnB1c2goIGogLyByYWRpYWxTZWdtZW50cyApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vIGdlbmVyYXRlIGluZGljZXMKCiAgICAJZm9yICggaiA9IDE7IGogPD0gcmFkaWFsU2VnbWVudHM7IGogKysgKSB7CgogICAgCQlmb3IgKCBpID0gMTsgaSA8PSB0dWJ1bGFyU2VnbWVudHM7IGkgKysgKSB7CgogICAgCQkJLy8gaW5kaWNlcwoKICAgIAkJCXZhciBhID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaSAtIDE7CiAgICAJCQl2YXIgYiA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaSAtIDE7CiAgICAJCQl2YXIgYyA9ICggdHVidWxhclNlZ21lbnRzICsgMSApICogKCBqIC0gMSApICsgaTsKICAgIAkJCXZhciBkID0gKCB0dWJ1bGFyU2VnbWVudHMgKyAxICkgKiBqICsgaTsKCiAgICAJCQkvLyBmYWNlcwoKICAgIAkJCWluZGljZXMucHVzaCggYSwgYiwgZCApOwogICAgCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCiAgICB9CgogICAgVG9ydXNCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIFRvcnVzQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVG9ydXNCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKiBQb3J0IGZyb20gaHR0cHM6Ly9naXRodWIuY29tL21hcGJveC9lYXJjdXQgKHYyLjEuNSkKICAgICAqLwoKICAgIHZhciBFYXJjdXQgPSB7CgogICAgCXRyaWFuZ3VsYXRlOiBmdW5jdGlvbiAoIGRhdGEsIGhvbGVJbmRpY2VzLCBkaW0gKSB7CgogICAgCQlkaW0gPSBkaW0gfHwgMjsKCiAgICAJCXZhciBoYXNIb2xlcyA9IGhvbGVJbmRpY2VzICYmIGhvbGVJbmRpY2VzLmxlbmd0aCwKICAgIAkJCW91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1sgMCBdICogZGltIDogZGF0YS5sZW5ndGgsCiAgICAJCQlvdXRlck5vZGUgPSBsaW5rZWRMaXN0KCBkYXRhLCAwLCBvdXRlckxlbiwgZGltLCB0cnVlICksCiAgICAJCQl0cmlhbmdsZXMgPSBbXTsKCiAgICAJCWlmICggISBvdXRlck5vZGUgfHwgb3V0ZXJOb2RlLm5leHQgPT09IG91dGVyTm9kZS5wcmV2ICkgcmV0dXJuIHRyaWFuZ2xlczsKCiAgICAJCXZhciBtaW5YLCBtaW5ZLCBtYXhYLCBtYXhZLCB4LCB5LCBpbnZTaXplOwoKICAgIAkJaWYgKCBoYXNIb2xlcyApIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKCBkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0gKTsKCiAgICAJCS8vIGlmIHRoZSBzaGFwZSBpcyBub3QgdG9vIHNpbXBsZSwgd2UnbGwgdXNlIHotb3JkZXIgY3VydmUgaGFzaCBsYXRlcjsgY2FsY3VsYXRlIHBvbHlnb24gYmJveAogICAgCQlpZiAoIGRhdGEubGVuZ3RoID4gODAgKiBkaW0gKSB7CgogICAgCQkJbWluWCA9IG1heFggPSBkYXRhWyAwIF07CiAgICAJCQltaW5ZID0gbWF4WSA9IGRhdGFbIDEgXTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IGRpbTsgaSA8IG91dGVyTGVuOyBpICs9IGRpbSApIHsKCiAgICAJCQkJeCA9IGRhdGFbIGkgXTsKICAgIAkJCQl5ID0gZGF0YVsgaSArIDEgXTsKICAgIAkJCQlpZiAoIHggPCBtaW5YICkgbWluWCA9IHg7CiAgICAJCQkJaWYgKCB5IDwgbWluWSApIG1pblkgPSB5OwogICAgCQkJCWlmICggeCA+IG1heFggKSBtYXhYID0geDsKICAgIAkJCQlpZiAoIHkgPiBtYXhZICkgbWF4WSA9IHk7CgogICAgCQkJfQoKICAgIAkJCS8vIG1pblgsIG1pblkgYW5kIGludlNpemUgYXJlIGxhdGVyIHVzZWQgdG8gdHJhbnNmb3JtIGNvb3JkcyBpbnRvIGludGVnZXJzIGZvciB6LW9yZGVyIGNhbGN1bGF0aW9uCiAgICAJCQlpbnZTaXplID0gTWF0aC5tYXgoIG1heFggLSBtaW5YLCBtYXhZIC0gbWluWSApOwogICAgCQkJaW52U2l6ZSA9IGludlNpemUgIT09IDAgPyAxIC8gaW52U2l6ZSA6IDA7CgogICAgCQl9CgogICAgCQllYXJjdXRMaW5rZWQoIG91dGVyTm9kZSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTsKCiAgICAJCXJldHVybiB0cmlhbmdsZXM7CgogICAgCX0KCiAgICB9OwoKICAgIC8vIGNyZWF0ZSBhIGNpcmN1bGFyIGRvdWJseSBsaW5rZWQgbGlzdCBmcm9tIHBvbHlnb24gcG9pbnRzIGluIHRoZSBzcGVjaWZpZWQgd2luZGluZyBvcmRlcgogICAgZnVuY3Rpb24gbGlua2VkTGlzdCggZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UgKSB7CgogICAgCXZhciBpLCBsYXN0OwoKICAgIAlpZiAoIGNsb2Nrd2lzZSA9PT0gKCBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSA+IDAgKSApIHsKCiAgICAJCWZvciAoIGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0gKSBsYXN0ID0gaW5zZXJ0Tm9kZSggaSwgZGF0YVsgaSBdLCBkYXRhWyBpICsgMSBdLCBsYXN0ICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlmb3IgKCBpID0gZW5kIC0gZGltOyBpID49IHN0YXJ0OyBpIC09IGRpbSApIGxhc3QgPSBpbnNlcnROb2RlKCBpLCBkYXRhWyBpIF0sIGRhdGFbIGkgKyAxIF0sIGxhc3QgKTsKCiAgICAJfQoKICAgIAlpZiAoIGxhc3QgJiYgZXF1YWxzJDEoIGxhc3QsIGxhc3QubmV4dCApICkgewoKICAgIAkJcmVtb3ZlTm9kZSQxKCBsYXN0ICk7CiAgICAJCWxhc3QgPSBsYXN0Lm5leHQ7CgogICAgCX0KCiAgICAJcmV0dXJuIGxhc3Q7CgogICAgfQoKICAgIC8vIGVsaW1pbmF0ZSBjb2xpbmVhciBvciBkdXBsaWNhdGUgcG9pbnRzCiAgICBmdW5jdGlvbiBmaWx0ZXJQb2ludHMoIHN0YXJ0LCBlbmQgKSB7CgogICAgCWlmICggISBzdGFydCApIHJldHVybiBzdGFydDsKICAgIAlpZiAoICEgZW5kICkgZW5kID0gc3RhcnQ7CgogICAgCXZhciBwID0gc3RhcnQsCiAgICAJCWFnYWluOwogICAgCWRvIHsKCiAgICAJCWFnYWluID0gZmFsc2U7CgogICAgCQlpZiAoICEgcC5zdGVpbmVyICYmICggZXF1YWxzJDEoIHAsIHAubmV4dCApIHx8IGFyZWEkNyggcC5wcmV2LCBwLCBwLm5leHQgKSA9PT0gMCApICkgewoKICAgIAkJCXJlbW92ZU5vZGUkMSggcCApOwogICAgCQkJcCA9IGVuZCA9IHAucHJldjsKICAgIAkJCWlmICggcCA9PT0gcC5uZXh0ICkgYnJlYWs7CiAgICAJCQlhZ2FpbiA9IHRydWU7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXAgPSBwLm5leHQ7CgogICAgCQl9CgogICAgCX0gd2hpbGUgKCBhZ2FpbiB8fCBwICE9PSBlbmQgKTsKCiAgICAJcmV0dXJuIGVuZDsKCiAgICB9CgogICAgLy8gbWFpbiBlYXIgc2xpY2luZyBsb29wIHdoaWNoIHRyaWFuZ3VsYXRlcyBhIHBvbHlnb24gKGdpdmVuIGFzIGEgbGlua2VkIGxpc3QpCiAgICBmdW5jdGlvbiBlYXJjdXRMaW5rZWQoIGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUsIHBhc3MgKSB7CgogICAgCWlmICggISBlYXIgKSByZXR1cm47CgogICAgCS8vIGludGVybGluayBwb2x5Z29uIG5vZGVzIGluIHotb3JkZXIKICAgIAlpZiAoICEgcGFzcyAmJiBpbnZTaXplICkgaW5kZXhDdXJ2ZSggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7CgogICAgCXZhciBzdG9wID0gZWFyLAogICAgCQlwcmV2LCBuZXh0OwoKICAgIAkvLyBpdGVyYXRlIHRocm91Z2ggZWFycywgc2xpY2luZyB0aGVtIG9uZSBieSBvbmUKICAgIAl3aGlsZSAoIGVhci5wcmV2ICE9PSBlYXIubmV4dCApIHsKCiAgICAJCXByZXYgPSBlYXIucHJldjsKICAgIAkJbmV4dCA9IGVhci5uZXh0OwoKICAgIAkJaWYgKCBpbnZTaXplID8gaXNFYXJIYXNoZWQoIGVhciwgbWluWCwgbWluWSwgaW52U2l6ZSApIDogaXNFYXIoIGVhciApICkgewoKICAgIAkJCS8vIGN1dCBvZmYgdGhlIHRyaWFuZ2xlCiAgICAJCQl0cmlhbmdsZXMucHVzaCggcHJldi5pIC8gZGltICk7CiAgICAJCQl0cmlhbmdsZXMucHVzaCggZWFyLmkgLyBkaW0gKTsKICAgIAkJCXRyaWFuZ2xlcy5wdXNoKCBuZXh0LmkgLyBkaW0gKTsKCiAgICAJCQlyZW1vdmVOb2RlJDEoIGVhciApOwoKICAgIAkJCS8vIHNraXBwaW5nIHRoZSBuZXh0IHZlcnRleCBsZWFkcyB0byBsZXNzIHNsaXZlciB0cmlhbmdsZXMKICAgIAkJCWVhciA9IG5leHQubmV4dDsKICAgIAkJCXN0b3AgPSBuZXh0Lm5leHQ7CgogICAgCQkJY29udGludWU7CgogICAgCQl9CgogICAgCQllYXIgPSBuZXh0OwoKICAgIAkJLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnMKICAgIAkJaWYgKCBlYXIgPT09IHN0b3AgKSB7CgogICAgCQkJLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW4KICAgIAkJCWlmICggISBwYXNzICkgewoKICAgIAkJCQllYXJjdXRMaW5rZWQoIGZpbHRlclBvaW50cyggZWFyICksIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplLCAxICk7CgogICAgCQkJCS8vIGlmIHRoaXMgZGlkbid0IHdvcmssIHRyeSBjdXJpbmcgYWxsIHNtYWxsIHNlbGYtaW50ZXJzZWN0aW9ucyBsb2NhbGx5CgogICAgCQkJfSBlbHNlIGlmICggcGFzcyA9PT0gMSApIHsKCiAgICAJCQkJZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyggZWFyLCB0cmlhbmdsZXMsIGRpbSApOwogICAgCQkJCWVhcmN1dExpbmtlZCggZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSwgMiApOwoKICAgIAkJCQkvLyBhcyBhIGxhc3QgcmVzb3J0LCB0cnkgc3BsaXR0aW5nIHRoZSByZW1haW5pbmcgcG9seWdvbiBpbnRvIHR3bwoKICAgIAkJCX0gZWxzZSBpZiAoIHBhc3MgPT09IDIgKSB7CgogICAgCQkJCXNwbGl0RWFyY3V0KCBlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICk7CgogICAgCQkJfQoKICAgIAkJCWJyZWFrOwoKICAgIAkJfQoKICAgIAl9CgogICAgfQoKICAgIC8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2RlcwogICAgZnVuY3Rpb24gaXNFYXIoIGVhciApIHsKCiAgICAJdmFyIGEgPSBlYXIucHJldiwKICAgIAkJYiA9IGVhciwKICAgIAkJYyA9IGVhci5uZXh0OwoKICAgIAlpZiAoIGFyZWEkNyggYSwgYiwgYyApID49IDAgKSByZXR1cm4gZmFsc2U7IC8vIHJlZmxleCwgY2FuJ3QgYmUgYW4gZWFyCgogICAgCS8vIG5vdyBtYWtlIHN1cmUgd2UgZG9uJ3QgaGF2ZSBvdGhlciBwb2ludHMgaW5zaWRlIHRoZSBwb3RlbnRpYWwgZWFyCiAgICAJdmFyIHAgPSBlYXIubmV4dC5uZXh0OwoKICAgIAl3aGlsZSAoIHAgIT09IGVhci5wcmV2ICkgewoKICAgIAkJaWYgKCBwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiYKICAgIAkJCWFyZWEkNyggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlOwogICAgCQlwID0gcC5uZXh0OwoKICAgIAl9CgogICAgCXJldHVybiB0cnVlOwoKICAgIH0KCiAgICBmdW5jdGlvbiBpc0Vhckhhc2hlZCggZWFyLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkgewoKICAgIAl2YXIgYSA9IGVhci5wcmV2LAogICAgCQliID0gZWFyLAogICAgCQljID0gZWFyLm5leHQ7CgogICAgCWlmICggYXJlYSQ3KCBhLCBiLCBjICkgPj0gMCApIHJldHVybiBmYWxzZTsgLy8gcmVmbGV4LCBjYW4ndCBiZSBhbiBlYXIKCiAgICAJLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWQKICAgIAl2YXIgbWluVFggPSBhLnggPCBiLnggPyAoIGEueCA8IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPCBjLnggPyBiLnggOiBjLnggKSwKICAgIAkJbWluVFkgPSBhLnkgPCBiLnkgPyAoIGEueSA8IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPCBjLnkgPyBiLnkgOiBjLnkgKSwKICAgIAkJbWF4VFggPSBhLnggPiBiLnggPyAoIGEueCA+IGMueCA/IGEueCA6IGMueCApIDogKCBiLnggPiBjLnggPyBiLnggOiBjLnggKSwKICAgIAkJbWF4VFkgPSBhLnkgPiBiLnkgPyAoIGEueSA+IGMueSA/IGEueSA6IGMueSApIDogKCBiLnkgPiBjLnkgPyBiLnkgOiBjLnkgKTsKCiAgICAJLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDsKICAgIAl2YXIgbWluWiA9IHpPcmRlciggbWluVFgsIG1pblRZLCBtaW5YLCBtaW5ZLCBpbnZTaXplICksCiAgICAJCW1heFogPSB6T3JkZXIoIG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgaW52U2l6ZSApOwoKICAgIAl2YXIgcCA9IGVhci5wcmV2WiwKICAgIAkJbiA9IGVhci5uZXh0WjsKCiAgICAJLy8gbG9vayBmb3IgcG9pbnRzIGluc2lkZSB0aGUgdHJpYW5nbGUgaW4gYm90aCBkaXJlY3Rpb25zCiAgICAJd2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICYmIG4gJiYgbi56IDw9IG1heFogKSB7CgogICAgCQlpZiAoIHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmCiAgICAJCQlwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55ICkgJiYKICAgIAkJCWFyZWEkNyggcC5wcmV2LCBwLCBwLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlOwogICAgCQlwID0gcC5wcmV2WjsKCiAgICAJCWlmICggbiAhPT0gZWFyLnByZXYgJiYgbiAhPT0gZWFyLm5leHQgJiYKICAgIAkJCXBvaW50SW5UcmlhbmdsZSggYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgbi54LCBuLnkgKSAmJgogICAgCQkJYXJlYSQ3KCBuLnByZXYsIG4sIG4ubmV4dCApID49IDAgKSByZXR1cm4gZmFsc2U7CiAgICAJCW4gPSBuLm5leHRaOwoKICAgIAl9CgogICAgCS8vIGxvb2sgZm9yIHJlbWFpbmluZyBwb2ludHMgaW4gZGVjcmVhc2luZyB6LW9yZGVyCiAgICAJd2hpbGUgKCBwICYmIHAueiA+PSBtaW5aICkgewoKICAgIAkJaWYgKCBwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJgogICAgCQkJcG9pbnRJblRyaWFuZ2xlKCBhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSApICYmCiAgICAJCQlhcmVhJDcoIHAucHJldiwgcCwgcC5uZXh0ICkgPj0gMCApIHJldHVybiBmYWxzZTsKICAgIAkJcCA9IHAucHJldlo7CgogICAgCX0KCiAgICAJLy8gbG9vayBmb3IgcmVtYWluaW5nIHBvaW50cyBpbiBpbmNyZWFzaW5nIHotb3JkZXIKICAgIAl3aGlsZSAoIG4gJiYgbi56IDw9IG1heFogKSB7CgogICAgCQlpZiAoIG4gIT09IGVhci5wcmV2ICYmIG4gIT09IGVhci5uZXh0ICYmCiAgICAJCQlwb2ludEluVHJpYW5nbGUoIGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIG4ueCwgbi55ICkgJiYKICAgIAkJCWFyZWEkNyggbi5wcmV2LCBuLCBuLm5leHQgKSA+PSAwICkgcmV0dXJuIGZhbHNlOwogICAgCQluID0gbi5uZXh0WjsKCiAgICAJfQoKICAgIAlyZXR1cm4gdHJ1ZTsKCiAgICB9CgogICAgLy8gZ28gdGhyb3VnaCBhbGwgcG9seWdvbiBub2RlcyBhbmQgY3VyZSBzbWFsbCBsb2NhbCBzZWxmLWludGVyc2VjdGlvbnMKICAgIGZ1bmN0aW9uIGN1cmVMb2NhbEludGVyc2VjdGlvbnMoIHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSApIHsKCiAgICAJdmFyIHAgPSBzdGFydDsKICAgIAlkbyB7CgogICAgCQl2YXIgYSA9IHAucHJldiwKICAgIAkJCWIgPSBwLm5leHQubmV4dDsKCiAgICAJCWlmICggISBlcXVhbHMkMSggYSwgYiApICYmIGludGVyc2VjdHMkMiggYSwgcCwgcC5uZXh0LCBiICkgJiYgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSApIHsKCiAgICAJCQl0cmlhbmdsZXMucHVzaCggYS5pIC8gZGltICk7CiAgICAJCQl0cmlhbmdsZXMucHVzaCggcC5pIC8gZGltICk7CiAgICAJCQl0cmlhbmdsZXMucHVzaCggYi5pIC8gZGltICk7CgogICAgCQkJLy8gcmVtb3ZlIHR3byBub2RlcyBpbnZvbHZlZAogICAgCQkJcmVtb3ZlTm9kZSQxKCBwICk7CiAgICAJCQlyZW1vdmVOb2RlJDEoIHAubmV4dCApOwoKICAgIAkJCXAgPSBzdGFydCA9IGI7CgogICAgCQl9CgogICAgCQlwID0gcC5uZXh0OwoKICAgIAl9IHdoaWxlICggcCAhPT0gc3RhcnQgKTsKCiAgICAJcmV0dXJuIHA7CgogICAgfQoKICAgIC8vIHRyeSBzcGxpdHRpbmcgcG9seWdvbiBpbnRvIHR3byBhbmQgdHJpYW5ndWxhdGUgdGhlbSBpbmRlcGVuZGVudGx5CiAgICBmdW5jdGlvbiBzcGxpdEVhcmN1dCggc3RhcnQsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBpbnZTaXplICkgewoKICAgIAkvLyBsb29rIGZvciBhIHZhbGlkIGRpYWdvbmFsIHRoYXQgZGl2aWRlcyB0aGUgcG9seWdvbiBpbnRvIHR3bwogICAgCXZhciBhID0gc3RhcnQ7CiAgICAJZG8gewoKICAgIAkJdmFyIGIgPSBhLm5leHQubmV4dDsKICAgIAkJd2hpbGUgKCBiICE9PSBhLnByZXYgKSB7CgogICAgCQkJaWYgKCBhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoIGEsIGIgKSApIHsKCiAgICAJCQkJLy8gc3BsaXQgdGhlIHBvbHlnb24gaW4gdHdvIGJ5IHRoZSBkaWFnb25hbAogICAgCQkJCXZhciBjID0gc3BsaXRQb2x5Z29uKCBhLCBiICk7CgogICAgCQkJCS8vIGZpbHRlciBjb2xpbmVhciBwb2ludHMgYXJvdW5kIHRoZSBjdXRzCiAgICAJCQkJYSA9IGZpbHRlclBvaW50cyggYSwgYS5uZXh0ICk7CiAgICAJCQkJYyA9IGZpbHRlclBvaW50cyggYywgYy5uZXh0ICk7CgogICAgCQkJCS8vIHJ1biBlYXJjdXQgb24gZWFjaCBoYWxmCiAgICAJCQkJZWFyY3V0TGlua2VkKCBhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgaW52U2l6ZSApOwogICAgCQkJCWVhcmN1dExpbmtlZCggYywgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIGludlNpemUgKTsKICAgIAkJCQlyZXR1cm47CgogICAgCQkJfQoKICAgIAkJCWIgPSBiLm5leHQ7CgogICAgCQl9CgogICAgCQlhID0gYS5uZXh0OwoKICAgIAl9IHdoaWxlICggYSAhPT0gc3RhcnQgKTsKCiAgICB9CgogICAgLy8gbGluayBldmVyeSBob2xlIGludG8gdGhlIG91dGVyIGxvb3AsIHByb2R1Y2luZyBhIHNpbmdsZS1yaW5nIHBvbHlnb24gd2l0aG91dCBob2xlcwogICAgZnVuY3Rpb24gZWxpbWluYXRlSG9sZXMoIGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSApIHsKCiAgICAJdmFyIHF1ZXVlID0gW10sCiAgICAJCWksIGxlbiwgc3RhcnQsIGVuZCwgbGlzdDsKCiAgICAJZm9yICggaSA9IDAsIGxlbiA9IGhvbGVJbmRpY2VzLmxlbmd0aDsgaSA8IGxlbjsgaSArKyApIHsKCiAgICAJCXN0YXJ0ID0gaG9sZUluZGljZXNbIGkgXSAqIGRpbTsKICAgIAkJZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1sgaSArIDEgXSAqIGRpbSA6IGRhdGEubGVuZ3RoOwogICAgCQlsaXN0ID0gbGlua2VkTGlzdCggZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSApOwogICAgCQlpZiAoIGxpc3QgPT09IGxpc3QubmV4dCApIGxpc3Quc3RlaW5lciA9IHRydWU7CiAgICAJCXF1ZXVlLnB1c2goIGdldExlZnRtb3N0KCBsaXN0ICkgKTsKCiAgICAJfQoKICAgIAlxdWV1ZS5zb3J0KCBjb21wYXJlWCApOwoKICAgIAkvLyBwcm9jZXNzIGhvbGVzIGZyb20gbGVmdCB0byByaWdodAogICAgCWZvciAoIGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpICsrICkgewoKICAgIAkJZWxpbWluYXRlSG9sZSggcXVldWVbIGkgXSwgb3V0ZXJOb2RlICk7CiAgICAJCW91dGVyTm9kZSA9IGZpbHRlclBvaW50cyggb3V0ZXJOb2RlLCBvdXRlck5vZGUubmV4dCApOwoKICAgIAl9CgogICAgCXJldHVybiBvdXRlck5vZGU7CgogICAgfQoKICAgIGZ1bmN0aW9uIGNvbXBhcmVYKCBhLCBiICkgewoKICAgIAlyZXR1cm4gYS54IC0gYi54OwoKICAgIH0KCiAgICAvLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXQKICAgIGZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoIGhvbGUsIG91dGVyTm9kZSApIHsKCiAgICAJb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoIGhvbGUsIG91dGVyTm9kZSApOwogICAgCWlmICggb3V0ZXJOb2RlICkgewoKICAgIAkJdmFyIGIgPSBzcGxpdFBvbHlnb24oIG91dGVyTm9kZSwgaG9sZSApOwogICAgCQlmaWx0ZXJQb2ludHMoIGIsIGIubmV4dCApOwoKICAgIAl9CgogICAgfQoKICAgIC8vIERhdmlkIEViZXJseSdzIGFsZ29yaXRobSBmb3IgZmluZGluZyBhIGJyaWRnZSBiZXR3ZWVuIGhvbGUgYW5kIG91dGVyIHBvbHlnb24KICAgIGZ1bmN0aW9uIGZpbmRIb2xlQnJpZGdlKCBob2xlLCBvdXRlck5vZGUgKSB7CgogICAgCXZhciBwID0gb3V0ZXJOb2RlLAogICAgCQloeCA9IGhvbGUueCwKICAgIAkJaHkgPSBob2xlLnksCiAgICAJCXF4ID0gLSBJbmZpbml0eSwKICAgIAkJbTsKCiAgICAJLy8gZmluZCBhIHNlZ21lbnQgaW50ZXJzZWN0ZWQgYnkgYSByYXkgZnJvbSB0aGUgaG9sZSdzIGxlZnRtb3N0IHBvaW50IHRvIHRoZSBsZWZ0OwogICAgCS8vIHNlZ21lbnQncyBlbmRwb2ludCB3aXRoIGxlc3NlciB4IHdpbGwgYmUgcG90ZW50aWFsIGNvbm5lY3Rpb24gcG9pbnQKICAgIAlkbyB7CgogICAgCQlpZiAoIGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSAmJiBwLm5leHQueSAhPT0gcC55ICkgewoKICAgIAkJCXZhciB4ID0gcC54ICsgKCBoeSAtIHAueSApICogKCBwLm5leHQueCAtIHAueCApIC8gKCBwLm5leHQueSAtIHAueSApOwogICAgCQkJaWYgKCB4IDw9IGh4ICYmIHggPiBxeCApIHsKCiAgICAJCQkJcXggPSB4OwogICAgCQkJCWlmICggeCA9PT0gaHggKSB7CgogICAgCQkJCQlpZiAoIGh5ID09PSBwLnkgKSByZXR1cm4gcDsKICAgIAkJCQkJaWYgKCBoeSA9PT0gcC5uZXh0LnkgKSByZXR1cm4gcC5uZXh0OwoKICAgIAkJCQl9CgogICAgCQkJCW0gPSBwLnggPCBwLm5leHQueCA/IHAgOiBwLm5leHQ7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcCA9IHAubmV4dDsKCiAgICAJfSB3aGlsZSAoIHAgIT09IG91dGVyTm9kZSApOwoKICAgIAlpZiAoICEgbSApIHJldHVybiBudWxsOwoKICAgIAlpZiAoIGh4ID09PSBxeCApIHJldHVybiBtLnByZXY7IC8vIGhvbGUgdG91Y2hlcyBvdXRlciBzZWdtZW50OyBwaWNrIGxvd2VyIGVuZHBvaW50CgogICAgCS8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDsKICAgIAkvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjsKICAgIAkvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludAoKICAgIAl2YXIgc3RvcCA9IG0sCiAgICAJCW14ID0gbS54LAogICAgCQlteSA9IG0ueSwKICAgIAkJdGFuTWluID0gSW5maW5pdHksCiAgICAJCXRhbjsKCiAgICAJcCA9IG0ubmV4dDsKCiAgICAJd2hpbGUgKCBwICE9PSBzdG9wICkgewoKICAgIAkJaWYgKCBoeCA+PSBwLnggJiYgcC54ID49IG14ICYmIGh4ICE9PSBwLnggJiYKICAgIAkJCQlwb2ludEluVHJpYW5nbGUoIGh5IDwgbXkgPyBoeCA6IHF4LCBoeSwgbXgsIG15LCBoeSA8IG15ID8gcXggOiBoeCwgaHksIHAueCwgcC55ICkgKSB7CgogICAgCQkJdGFuID0gTWF0aC5hYnMoIGh5IC0gcC55ICkgLyAoIGh4IC0gcC54ICk7IC8vIHRhbmdlbnRpYWwKCiAgICAJCQlpZiAoICggdGFuIDwgdGFuTWluIHx8ICggdGFuID09PSB0YW5NaW4gJiYgcC54ID4gbS54ICkgKSAmJiBsb2NhbGx5SW5zaWRlKCBwLCBob2xlICkgKSB7CgogICAgCQkJCW0gPSBwOwogICAgCQkJCXRhbk1pbiA9IHRhbjsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlwID0gcC5uZXh0OwoKICAgIAl9CgogICAgCXJldHVybiBtOwoKICAgIH0KCiAgICAvLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyCiAgICBmdW5jdGlvbiBpbmRleEN1cnZlKCBzdGFydCwgbWluWCwgbWluWSwgaW52U2l6ZSApIHsKCiAgICAJdmFyIHAgPSBzdGFydDsKICAgIAlkbyB7CgogICAgCQlpZiAoIHAueiA9PT0gbnVsbCApIHAueiA9IHpPcmRlciggcC54LCBwLnksIG1pblgsIG1pblksIGludlNpemUgKTsKICAgIAkJcC5wcmV2WiA9IHAucHJldjsKICAgIAkJcC5uZXh0WiA9IHAubmV4dDsKICAgIAkJcCA9IHAubmV4dDsKCiAgICAJfSB3aGlsZSAoIHAgIT09IHN0YXJ0ICk7CgogICAgCXAucHJldloubmV4dFogPSBudWxsOwogICAgCXAucHJldlogPSBudWxsOwoKICAgIAlzb3J0TGlua2VkKCBwICk7CgogICAgfQoKICAgIC8vIFNpbW9uIFRhdGhhbSdzIGxpbmtlZCBsaXN0IG1lcmdlIHNvcnQgYWxnb3JpdGhtCiAgICAvLyBodHRwOi8vd3d3LmNoaWFyay5ncmVlbmVuZC5vcmcudWsvfnNndGF0aGFtL2FsZ29yaXRobXMvbGlzdHNvcnQuaHRtbAogICAgZnVuY3Rpb24gc29ydExpbmtlZCggbGlzdCApIHsKCiAgICAJdmFyIGksIHAsIHEsIGUsIHRhaWwsIG51bU1lcmdlcywgcFNpemUsIHFTaXplLAogICAgCQlpblNpemUgPSAxOwoKICAgIAlkbyB7CgogICAgCQlwID0gbGlzdDsKICAgIAkJbGlzdCA9IG51bGw7CiAgICAJCXRhaWwgPSBudWxsOwogICAgCQludW1NZXJnZXMgPSAwOwoKICAgIAkJd2hpbGUgKCBwICkgewoKICAgIAkJCW51bU1lcmdlcyArKzsKICAgIAkJCXEgPSBwOwogICAgCQkJcFNpemUgPSAwOwogICAgCQkJZm9yICggaSA9IDA7IGkgPCBpblNpemU7IGkgKysgKSB7CgogICAgCQkJCXBTaXplICsrOwogICAgCQkJCXEgPSBxLm5leHRaOwogICAgCQkJCWlmICggISBxICkgYnJlYWs7CgogICAgCQkJfQoKICAgIAkJCXFTaXplID0gaW5TaXplOwoKICAgIAkJCXdoaWxlICggcFNpemUgPiAwIHx8ICggcVNpemUgPiAwICYmIHEgKSApIHsKCiAgICAJCQkJaWYgKCBwU2l6ZSAhPT0gMCAmJiAoIHFTaXplID09PSAwIHx8ICEgcSB8fCBwLnogPD0gcS56ICkgKSB7CgogICAgCQkJCQllID0gcDsKICAgIAkJCQkJcCA9IHAubmV4dFo7CiAgICAJCQkJCXBTaXplIC0tOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJZSA9IHE7CiAgICAJCQkJCXEgPSBxLm5leHRaOwogICAgCQkJCQlxU2l6ZSAtLTsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIHRhaWwgKSB0YWlsLm5leHRaID0gZTsKICAgIAkJCQllbHNlIGxpc3QgPSBlOwoKICAgIAkJCQllLnByZXZaID0gdGFpbDsKICAgIAkJCQl0YWlsID0gZTsKCiAgICAJCQl9CgogICAgCQkJcCA9IHE7CgogICAgCQl9CgogICAgCQl0YWlsLm5leHRaID0gbnVsbDsKICAgIAkJaW5TaXplICo9IDI7CgogICAgCX0gd2hpbGUgKCBudW1NZXJnZXMgPiAxICk7CgogICAgCXJldHVybiBsaXN0OwoKICAgIH0KCiAgICAvLyB6LW9yZGVyIG9mIGEgcG9pbnQgZ2l2ZW4gY29vcmRzIGFuZCBpbnZlcnNlIG9mIHRoZSBsb25nZXIgc2lkZSBvZiBkYXRhIGJib3gKICAgIGZ1bmN0aW9uIHpPcmRlciggeCwgeSwgbWluWCwgbWluWSwgaW52U2l6ZSApIHsKCiAgICAJLy8gY29vcmRzIGFyZSB0cmFuc2Zvcm1lZCBpbnRvIG5vbi1uZWdhdGl2ZSAxNS1iaXQgaW50ZWdlciByYW5nZQogICAgCXggPSAzMjc2NyAqICggeCAtIG1pblggKSAqIGludlNpemU7CiAgICAJeSA9IDMyNzY3ICogKCB5IC0gbWluWSApICogaW52U2l6ZTsKCiAgICAJeCA9ICggeCB8ICggeCA8PCA4ICkgKSAmIDB4MDBGRjAwRkY7CiAgICAJeCA9ICggeCB8ICggeCA8PCA0ICkgKSAmIDB4MEYwRjBGMEY7CiAgICAJeCA9ICggeCB8ICggeCA8PCAyICkgKSAmIDB4MzMzMzMzMzM7CiAgICAJeCA9ICggeCB8ICggeCA8PCAxICkgKSAmIDB4NTU1NTU1NTU7CgogICAgCXkgPSAoIHkgfCAoIHkgPDwgOCApICkgJiAweDAwRkYwMEZGOwogICAgCXkgPSAoIHkgfCAoIHkgPDwgNCApICkgJiAweDBGMEYwRjBGOwogICAgCXkgPSAoIHkgfCAoIHkgPDwgMiApICkgJiAweDMzMzMzMzMzOwogICAgCXkgPSAoIHkgfCAoIHkgPDwgMSApICkgJiAweDU1NTU1NTU1OwoKICAgIAlyZXR1cm4geCB8ICggeSA8PCAxICk7CgogICAgfQoKICAgIC8vIGZpbmQgdGhlIGxlZnRtb3N0IG5vZGUgb2YgYSBwb2x5Z29uIHJpbmcKICAgIGZ1bmN0aW9uIGdldExlZnRtb3N0KCBzdGFydCApIHsKCiAgICAJdmFyIHAgPSBzdGFydCwKICAgIAkJbGVmdG1vc3QgPSBzdGFydDsKICAgIAlkbyB7CgogICAgCQlpZiAoIHAueCA8IGxlZnRtb3N0LnggfHwgKCBwLnggPT09IGxlZnRtb3N0LnggJiYgcC55IDwgbGVmdG1vc3QueSApICkgbGVmdG1vc3QgPSBwOwogICAgCQlwID0gcC5uZXh0OwoKICAgIAl9IHdoaWxlICggcCAhPT0gc3RhcnQgKTsKCiAgICAJcmV0dXJuIGxlZnRtb3N0OwoKICAgIH0KCiAgICAvLyBjaGVjayBpZiBhIHBvaW50IGxpZXMgd2l0aGluIGEgY29udmV4IHRyaWFuZ2xlCiAgICBmdW5jdGlvbiBwb2ludEluVHJpYW5nbGUoIGF4LCBheSwgYngsIGJ5LCBjeCwgY3ksIHB4LCBweSApIHsKCiAgICAJcmV0dXJuICggY3ggLSBweCApICogKCBheSAtIHB5ICkgLSAoIGF4IC0gcHggKSAqICggY3kgLSBweSApID49IDAgJiYKICAgIAkJICAgKCBheCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSAtICggYnggLSBweCApICogKCBheSAtIHB5ICkgPj0gMCAmJgogICAgCQkgICAoIGJ4IC0gcHggKSAqICggY3kgLSBweSApIC0gKCBjeCAtIHB4ICkgKiAoIGJ5IC0gcHkgKSA+PSAwOwoKICAgIH0KCiAgICAvLyBjaGVjayBpZiBhIGRpYWdvbmFsIGJldHdlZW4gdHdvIHBvbHlnb24gbm9kZXMgaXMgdmFsaWQgKGxpZXMgaW4gcG9seWdvbiBpbnRlcmlvcikKICAgIGZ1bmN0aW9uIGlzVmFsaWREaWFnb25hbCggYSwgYiApIHsKCiAgICAJcmV0dXJuIGEubmV4dC5pICE9PSBiLmkgJiYgYS5wcmV2LmkgIT09IGIuaSAmJiAhIGludGVyc2VjdHNQb2x5Z29uKCBhLCBiICkgJiYKICAgIAkJICAgbG9jYWxseUluc2lkZSggYSwgYiApICYmIGxvY2FsbHlJbnNpZGUoIGIsIGEgKSAmJiBtaWRkbGVJbnNpZGUoIGEsIGIgKTsKCiAgICB9CgogICAgLy8gc2lnbmVkIGFyZWEgb2YgYSB0cmlhbmdsZQogICAgZnVuY3Rpb24gYXJlYSQ3KCBwLCBxLCByICkgewoKICAgIAlyZXR1cm4gKCBxLnkgLSBwLnkgKSAqICggci54IC0gcS54ICkgLSAoIHEueCAtIHAueCApICogKCByLnkgLSBxLnkgKTsKCiAgICB9CgogICAgLy8gY2hlY2sgaWYgdHdvIHBvaW50cyBhcmUgZXF1YWwKICAgIGZ1bmN0aW9uIGVxdWFscyQxKCBwMSwgcDIgKSB7CgogICAgCXJldHVybiBwMS54ID09PSBwMi54ICYmIHAxLnkgPT09IHAyLnk7CgogICAgfQoKICAgIC8vIGNoZWNrIGlmIHR3byBzZWdtZW50cyBpbnRlcnNlY3QKICAgIGZ1bmN0aW9uIGludGVyc2VjdHMkMiggcDEsIHExLCBwMiwgcTIgKSB7CgogICAgCWlmICggKCBlcXVhbHMkMSggcDEsIHAyICkgJiYgZXF1YWxzJDEoIHExLCBxMiApICkgfHwKICAgIAkJKCBlcXVhbHMkMSggcDEsIHEyICkgJiYgZXF1YWxzJDEoIHAyLCBxMSApICkgKSByZXR1cm4gdHJ1ZTsKICAgIAlyZXR1cm4gYXJlYSQ3KCBwMSwgcTEsIHAyICkgPiAwICE9PSBhcmVhJDcoIHAxLCBxMSwgcTIgKSA+IDAgJiYKICAgIAkJICAgYXJlYSQ3KCBwMiwgcTIsIHAxICkgPiAwICE9PSBhcmVhJDcoIHAyLCBxMiwgcTEgKSA+IDA7CgogICAgfQoKICAgIC8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpbnRlcnNlY3RzIGFueSBwb2x5Z29uIHNlZ21lbnRzCiAgICBmdW5jdGlvbiBpbnRlcnNlY3RzUG9seWdvbiggYSwgYiApIHsKCiAgICAJdmFyIHAgPSBhOwogICAgCWRvIHsKCiAgICAJCWlmICggcC5pICE9PSBhLmkgJiYgcC5uZXh0LmkgIT09IGEuaSAmJiBwLmkgIT09IGIuaSAmJiBwLm5leHQuaSAhPT0gYi5pICYmCiAgICAJCQkJaW50ZXJzZWN0cyQyKCBwLCBwLm5leHQsIGEsIGIgKSApIHJldHVybiB0cnVlOwogICAgCQlwID0gcC5uZXh0OwoKICAgIAl9IHdoaWxlICggcCAhPT0gYSApOwoKICAgIAlyZXR1cm4gZmFsc2U7CgogICAgfQoKICAgIC8vIGNoZWNrIGlmIGEgcG9seWdvbiBkaWFnb25hbCBpcyBsb2NhbGx5IGluc2lkZSB0aGUgcG9seWdvbgogICAgZnVuY3Rpb24gbG9jYWxseUluc2lkZSggYSwgYiApIHsKCiAgICAJcmV0dXJuIGFyZWEkNyggYS5wcmV2LCBhLCBhLm5leHQgKSA8IDAgPwogICAgCQlhcmVhJDcoIGEsIGIsIGEubmV4dCApID49IDAgJiYgYXJlYSQ3KCBhLCBhLnByZXYsIGIgKSA+PSAwIDoKICAgIAkJYXJlYSQ3KCBhLCBiLCBhLnByZXYgKSA8IDAgfHwgYXJlYSQ3KCBhLCBhLm5leHQsIGIgKSA8IDA7CgogICAgfQoKICAgIC8vIGNoZWNrIGlmIHRoZSBtaWRkbGUgcG9pbnQgb2YgYSBwb2x5Z29uIGRpYWdvbmFsIGlzIGluc2lkZSB0aGUgcG9seWdvbgogICAgZnVuY3Rpb24gbWlkZGxlSW5zaWRlKCBhLCBiICkgewoKICAgIAl2YXIgcCA9IGEsCiAgICAJCWluc2lkZSA9IGZhbHNlLAogICAgCQlweCA9ICggYS54ICsgYi54ICkgLyAyLAogICAgCQlweSA9ICggYS55ICsgYi55ICkgLyAyOwogICAgCWRvIHsKCiAgICAJCWlmICggKCAoIHAueSA+IHB5ICkgIT09ICggcC5uZXh0LnkgPiBweSApICkgJiYgcC5uZXh0LnkgIT09IHAueSAmJgogICAgCQkJCSggcHggPCAoIHAubmV4dC54IC0gcC54ICkgKiAoIHB5IC0gcC55ICkgLyAoIHAubmV4dC55IC0gcC55ICkgKyBwLnggKSApCiAgICAJCQlpbnNpZGUgPSAhIGluc2lkZTsKICAgIAkJcCA9IHAubmV4dDsKCiAgICAJfSB3aGlsZSAoIHAgIT09IGEgKTsKCiAgICAJcmV0dXJuIGluc2lkZTsKCiAgICB9CgogICAgLy8gbGluayB0d28gcG9seWdvbiB2ZXJ0aWNlcyB3aXRoIGEgYnJpZGdlOyBpZiB0aGUgdmVydGljZXMgYmVsb25nIHRvIHRoZSBzYW1lIHJpbmcsIGl0IHNwbGl0cyBwb2x5Z29uIGludG8gdHdvOwogICAgLy8gaWYgb25lIGJlbG9uZ3MgdG8gdGhlIG91dGVyIHJpbmcgYW5kIGFub3RoZXIgdG8gYSBob2xlLCBpdCBtZXJnZXMgaXQgaW50byBhIHNpbmdsZSByaW5nCiAgICBmdW5jdGlvbiBzcGxpdFBvbHlnb24oIGEsIGIgKSB7CgogICAgCXZhciBhMiA9IG5ldyBOb2RlJDUoIGEuaSwgYS54LCBhLnkgKSwKICAgIAkJYjIgPSBuZXcgTm9kZSQ1KCBiLmksIGIueCwgYi55ICksCiAgICAJCWFuID0gYS5uZXh0LAogICAgCQlicCA9IGIucHJldjsKCiAgICAJYS5uZXh0ID0gYjsKICAgIAliLnByZXYgPSBhOwoKICAgIAlhMi5uZXh0ID0gYW47CiAgICAJYW4ucHJldiA9IGEyOwoKICAgIAliMi5uZXh0ID0gYTI7CiAgICAJYTIucHJldiA9IGIyOwoKICAgIAlicC5uZXh0ID0gYjI7CiAgICAJYjIucHJldiA9IGJwOwoKICAgIAlyZXR1cm4gYjI7CgogICAgfQoKICAgIC8vIGNyZWF0ZSBhIG5vZGUgYW5kIG9wdGlvbmFsbHkgbGluayBpdCB3aXRoIHByZXZpb3VzIG9uZSAoaW4gYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QpCiAgICBmdW5jdGlvbiBpbnNlcnROb2RlKCBpLCB4LCB5LCBsYXN0ICkgewoKICAgIAl2YXIgcCA9IG5ldyBOb2RlJDUoIGksIHgsIHkgKTsKCiAgICAJaWYgKCAhIGxhc3QgKSB7CgogICAgCQlwLnByZXYgPSBwOwogICAgCQlwLm5leHQgPSBwOwoKICAgIAl9IGVsc2UgewoKICAgIAkJcC5uZXh0ID0gbGFzdC5uZXh0OwogICAgCQlwLnByZXYgPSBsYXN0OwogICAgCQlsYXN0Lm5leHQucHJldiA9IHA7CiAgICAJCWxhc3QubmV4dCA9IHA7CgogICAgCX0KCiAgICAJcmV0dXJuIHA7CgogICAgfQoKICAgIGZ1bmN0aW9uIHJlbW92ZU5vZGUkMSggcCApIHsKCiAgICAJcC5uZXh0LnByZXYgPSBwLnByZXY7CiAgICAJcC5wcmV2Lm5leHQgPSBwLm5leHQ7CgogICAgCWlmICggcC5wcmV2WiApIHAucHJldloubmV4dFogPSBwLm5leHRaOwogICAgCWlmICggcC5uZXh0WiApIHAubmV4dFoucHJldlogPSBwLnByZXZaOwoKICAgIH0KCiAgICBmdW5jdGlvbiBOb2RlJDUoIGksIHgsIHkgKSB7CgogICAgCS8vIHZlcnRleCBpbmRleCBpbiBjb29yZGluYXRlcyBhcnJheQogICAgCXRoaXMuaSA9IGk7CgogICAgCS8vIHZlcnRleCBjb29yZGluYXRlcwogICAgCXRoaXMueCA9IHg7CiAgICAJdGhpcy55ID0geTsKCiAgICAJLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGV4IG5vZGVzIGluIGEgcG9seWdvbiByaW5nCiAgICAJdGhpcy5wcmV2ID0gbnVsbDsKICAgIAl0aGlzLm5leHQgPSBudWxsOwoKICAgIAkvLyB6LW9yZGVyIGN1cnZlIHZhbHVlCiAgICAJdGhpcy56ID0gbnVsbDsKCiAgICAJLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlcgogICAgCXRoaXMucHJldlogPSBudWxsOwogICAgCXRoaXMubmV4dFogPSBudWxsOwoKICAgIAkvLyBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGlzIGEgc3RlaW5lciBwb2ludAogICAgCXRoaXMuc3RlaW5lciA9IGZhbHNlOwoKICAgIH0KCiAgICBmdW5jdGlvbiBzaWduZWRBcmVhKCBkYXRhLCBzdGFydCwgZW5kLCBkaW0gKSB7CgogICAgCXZhciBzdW0gPSAwOwogICAgCWZvciAoIHZhciBpID0gc3RhcnQsIGogPSBlbmQgLSBkaW07IGkgPCBlbmQ7IGkgKz0gZGltICkgewoKICAgIAkJc3VtICs9ICggZGF0YVsgaiBdIC0gZGF0YVsgaSBdICkgKiAoIGRhdGFbIGkgKyAxIF0gKyBkYXRhWyBqICsgMSBdICk7CiAgICAJCWogPSBpOwoKICAgIAl9CgogICAgCXJldHVybiBzdW07CgogICAgfQoKICAgIC8qKgogICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwogICAgICovCgogICAgdmFyIFNoYXBlVXRpbHMgPSB7CgogICAgCS8vIGNhbGN1bGF0ZSBhcmVhIG9mIHRoZSBjb250b3VyIHBvbHlnb24KCiAgICAJYXJlYTogZnVuY3Rpb24gKCBjb250b3VyICkgewoKICAgIAkJdmFyIG4gPSBjb250b3VyLmxlbmd0aDsKICAgIAkJdmFyIGEgPSAwLjA7CgogICAgCQlmb3IgKCB2YXIgcCA9IG4gLSAxLCBxID0gMDsgcSA8IG47IHAgPSBxICsrICkgewoKICAgIAkJCWEgKz0gY29udG91clsgcCBdLnggKiBjb250b3VyWyBxIF0ueSAtIGNvbnRvdXJbIHEgXS54ICogY29udG91clsgcCBdLnk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gYSAqIDAuNTsKCiAgICAJfSwKCiAgICAJaXNDbG9ja1dpc2U6IGZ1bmN0aW9uICggcHRzICkgewoKICAgIAkJcmV0dXJuIFNoYXBlVXRpbHMuYXJlYSggcHRzICkgPCAwOwoKICAgIAl9LAoKICAgIAl0cmlhbmd1bGF0ZVNoYXBlOiBmdW5jdGlvbiAoIGNvbnRvdXIsIGhvbGVzICkgewoKICAgIAkJdmFyIHZlcnRpY2VzID0gW107IC8vIGZsYXQgYXJyYXkgb2YgdmVydGljZXMgbGlrZSBbIHgwLHkwLCB4MSx5MSwgeDIseTIsIC4uLiBdCiAgICAJCXZhciBob2xlSW5kaWNlcyA9IFtdOyAvLyBhcnJheSBvZiBob2xlIGluZGljZXMKICAgIAkJdmFyIGZhY2VzID0gW107IC8vIGZpbmFsIGFycmF5IG9mIHZlcnRleCBpbmRpY2VzIGxpa2UgWyBbIGEsYixkIF0sIFsgYixjLGQgXSBdCgogICAgCQlyZW1vdmVEdXBFbmRQdHMoIGNvbnRvdXIgKTsKICAgIAkJYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKTsKCiAgICAJCS8vCgogICAgCQl2YXIgaG9sZUluZGV4ID0gY29udG91ci5sZW5ndGg7CgogICAgCQlob2xlcy5mb3JFYWNoKCByZW1vdmVEdXBFbmRQdHMgKTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGhvbGVzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQlob2xlSW5kaWNlcy5wdXNoKCBob2xlSW5kZXggKTsKICAgIAkJCWhvbGVJbmRleCArPSBob2xlc1sgaSBdLmxlbmd0aDsKICAgIAkJCWFkZENvbnRvdXIoIHZlcnRpY2VzLCBob2xlc1sgaSBdICk7CgogICAgCQl9CgogICAgCQkvLwoKICAgIAkJdmFyIHRyaWFuZ2xlcyA9IEVhcmN1dC50cmlhbmd1bGF0ZSggdmVydGljZXMsIGhvbGVJbmRpY2VzICk7CgogICAgCQkvLwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgdHJpYW5nbGVzLmxlbmd0aDsgaSArPSAzICkgewoKICAgIAkJCWZhY2VzLnB1c2goIHRyaWFuZ2xlcy5zbGljZSggaSwgaSArIDMgKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGZhY2VzOwoKICAgIAl9CgogICAgfTsKCiAgICBmdW5jdGlvbiByZW1vdmVEdXBFbmRQdHMoIHBvaW50cyApIHsKCiAgICAJdmFyIGwgPSBwb2ludHMubGVuZ3RoOwoKICAgIAlpZiAoIGwgPiAyICYmIHBvaW50c1sgbCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7CgogICAgCQlwb2ludHMucG9wKCk7CgogICAgCX0KCiAgICB9CgogICAgZnVuY3Rpb24gYWRkQ29udG91ciggdmVydGljZXMsIGNvbnRvdXIgKSB7CgogICAgCWZvciAoIHZhciBpID0gMDsgaSA8IGNvbnRvdXIubGVuZ3RoOyBpICsrICkgewoKICAgIAkJdmVydGljZXMucHVzaCggY29udG91clsgaSBdLnggKTsKICAgIAkJdmVydGljZXMucHVzaCggY29udG91clsgaSBdLnkgKTsKCiAgICAJfQoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKICAgICAqCiAgICAgKiBDcmVhdGVzIGV4dHJ1ZGVkIGdlb21ldHJ5IGZyb20gYSBwYXRoIHNoYXBlLgogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKgogICAgICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXMKICAgICAqICBzdGVwczogPGludD4sIC8vIG51bWJlciBvZiBwb2ludHMgZm9yIHotc2lkZSBleHRydXNpb25zIC8gdXNlZCBmb3Igc3ViZGl2aWRpbmcgc2VnbWVudHMgb2YgZXh0cnVkZSBzcGxpbmUgdG9vCiAgICAgKiAgZGVwdGg6IDxmbG9hdD4sIC8vIERlcHRoIHRvIGV4dHJ1ZGUgdGhlIHNoYXBlCiAgICAgKgogICAgICogIGJldmVsRW5hYmxlZDogPGJvb2w+LCAvLyB0dXJuIG9uIGJldmVsCiAgICAgKiAgYmV2ZWxUaGlja25lc3M6IDxmbG9hdD4sIC8vIGhvdyBkZWVwIGludG8gdGhlIG9yaWdpbmFsIHNoYXBlIGJldmVsIGdvZXMKICAgICAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIChpbmNsdWRpbmcgYmV2ZWxPZmZzZXQpIGlzIGJldmVsCiAgICAgKiAgYmV2ZWxPZmZzZXQ6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSBzaGFwZSBvdXRsaW5lIGRvZXMgYmV2ZWwgc3RhcnQKICAgICAqICBiZXZlbFNlZ21lbnRzOiA8aW50PiwgLy8gbnVtYmVyIG9mIGJldmVsIGxheWVycwogICAgICoKICAgICAqICBleHRydWRlUGF0aDogPFRIUkVFLkN1cnZlPiAvLyBjdXJ2ZSB0byBleHRydWRlIHNoYXBlIGFsb25nCiAgICAgKgogICAgICogIFVWR2VuZXJhdG9yOiA8T2JqZWN0PiAvLyBvYmplY3QgdGhhdCBwcm92aWRlcyBVViBnZW5lcmF0b3IgZnVuY3Rpb25zCiAgICAgKgogICAgICogfQogICAgICovCgogICAgLy8gRXh0cnVkZUdlb21ldHJ5CgogICAgZnVuY3Rpb24gRXh0cnVkZUdlb21ldHJ5KCBzaGFwZXMsIG9wdGlvbnMgKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0V4dHJ1ZGVHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJc2hhcGVzOiBzaGFwZXMsCiAgICAJCW9wdGlvbnM6IG9wdGlvbnMKICAgIAl9OwoKICAgIAl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBvcHRpb25zICkgKTsKICAgIAl0aGlzLm1lcmdlVmVydGljZXMoKTsKCiAgICB9CgogICAgRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgRXh0cnVkZUdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEV4dHJ1ZGVHZW9tZXRyeTsKCiAgICBFeHRydWRlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdmFyIGRhdGEgPSBHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJdmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7CiAgICAJdmFyIG9wdGlvbnMgPSB0aGlzLnBhcmFtZXRlcnMub3B0aW9uczsKCiAgICAJcmV0dXJuIHRvSlNPTiggc2hhcGVzLCBvcHRpb25zLCBkYXRhICk7CgogICAgfTsKCiAgICAvLyBFeHRydWRlQnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBFeHRydWRlQnVmZmVyR2VvbWV0cnkoIHNoYXBlcywgb3B0aW9ucyApIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnRXh0cnVkZUJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlzaGFwZXM6IHNoYXBlcywKICAgIAkJb3B0aW9uczogb3B0aW9ucwogICAgCX07CgogICAgCXNoYXBlcyA9IEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID8gc2hhcGVzIDogWyBzaGFwZXMgXTsKCiAgICAJdmFyIHNjb3BlID0gdGhpczsKCiAgICAJdmFyIHZlcnRpY2VzQXJyYXkgPSBbXTsKICAgIAl2YXIgdXZBcnJheSA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCXZhciBzaGFwZSA9IHNoYXBlc1sgaSBdOwogICAgCQlhZGRTaGFwZSggc2hhcGUgKTsKCiAgICAJfQoKICAgIAkvLyBidWlsZCBnZW9tZXRyeQoKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzQXJyYXksIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZBcnJheSwgMiApICk7CgogICAgCXRoaXMuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKCiAgICAJLy8gZnVuY3Rpb25zCgogICAgCWZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHsKCiAgICAJCXZhciBwbGFjZWhvbGRlciA9IFtdOwoKICAgIAkJLy8gb3B0aW9ucwoKICAgIAkJdmFyIGN1cnZlU2VnbWVudHMgPSBvcHRpb25zLmN1cnZlU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuY3VydmVTZWdtZW50cyA6IDEyOwogICAgCQl2YXIgc3RlcHMgPSBvcHRpb25zLnN0ZXBzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLnN0ZXBzIDogMTsKICAgIAkJdmFyIGRlcHRoID0gb3B0aW9ucy5kZXB0aCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5kZXB0aCA6IDEwMDsKCiAgICAJCXZhciBiZXZlbEVuYWJsZWQgPSBvcHRpb25zLmJldmVsRW5hYmxlZCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbEVuYWJsZWQgOiB0cnVlOwogICAgCQl2YXIgYmV2ZWxUaGlja25lc3MgPSBvcHRpb25zLmJldmVsVGhpY2tuZXNzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsVGhpY2tuZXNzIDogNjsKICAgIAkJdmFyIGJldmVsU2l6ZSA9IG9wdGlvbnMuYmV2ZWxTaXplICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2l6ZSA6IGJldmVsVGhpY2tuZXNzIC0gMjsKICAgIAkJdmFyIGJldmVsT2Zmc2V0ID0gb3B0aW9ucy5iZXZlbE9mZnNldCAhPT0gdW5kZWZpbmVkID8gb3B0aW9ucy5iZXZlbE9mZnNldCA6IDA7CiAgICAJCXZhciBiZXZlbFNlZ21lbnRzID0gb3B0aW9ucy5iZXZlbFNlZ21lbnRzICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJldmVsU2VnbWVudHMgOiAzOwoKICAgIAkJdmFyIGV4dHJ1ZGVQYXRoID0gb3B0aW9ucy5leHRydWRlUGF0aDsKCiAgICAJCXZhciB1dmdlbiA9IG9wdGlvbnMuVVZHZW5lcmF0b3IgIT09IHVuZGVmaW5lZCA/IG9wdGlvbnMuVVZHZW5lcmF0b3IgOiBXb3JsZFVWR2VuZXJhdG9yOwoKICAgIAkJLy8gZGVwcmVjYXRlZCBvcHRpb25zCgogICAgCQlpZiAoIG9wdGlvbnMuYW1vdW50ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiBhbW91bnQgaGFzIGJlZW4gcmVuYW1lZCB0byBkZXB0aC4nICk7CiAgICAJCQlkZXB0aCA9IG9wdGlvbnMuYW1vdW50OwoKICAgIAkJfQoKICAgIAkJLy8KCiAgICAJCXZhciBleHRydWRlUHRzLCBleHRydWRlQnlQYXRoID0gZmFsc2U7CiAgICAJCXZhciBzcGxpbmVUdWJlLCBiaW5vcm1hbCwgbm9ybWFsLCBwb3NpdGlvbjI7CgogICAgCQlpZiAoIGV4dHJ1ZGVQYXRoICkgewoKICAgIAkJCWV4dHJ1ZGVQdHMgPSBleHRydWRlUGF0aC5nZXRTcGFjZWRQb2ludHMoIHN0ZXBzICk7CgogICAgCQkJZXh0cnVkZUJ5UGF0aCA9IHRydWU7CiAgICAJCQliZXZlbEVuYWJsZWQgPSBmYWxzZTsgLy8gYmV2ZWxzIG5vdCBzdXBwb3J0ZWQgZm9yIHBhdGggZXh0cnVzaW9uCgogICAgCQkJLy8gU0VUVVAgVE5CIHZhcmlhYmxlcwoKICAgIAkJCS8vIFRPRE8xIC0gaGF2ZSBhIC5pc0Nsb3NlZCBpbiBzcGxpbmU/CgogICAgCQkJc3BsaW5lVHViZSA9IGV4dHJ1ZGVQYXRoLmNvbXB1dGVGcmVuZXRGcmFtZXMoIHN0ZXBzLCBmYWxzZSApOwoKICAgIAkJCS8vIGNvbnNvbGUubG9nKHNwbGluZVR1YmUsICdzcGxpbmVUdWJlJywgc3BsaW5lVHViZS5ub3JtYWxzLmxlbmd0aCwgJ3N0ZXBzJywgc3RlcHMsICdleHRydWRlUHRzJywgZXh0cnVkZVB0cy5sZW5ndGgpOwoKICAgIAkJCWJpbm9ybWFsID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJCW5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CiAgICAJCQlwb3NpdGlvbjIgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJfQoKICAgIAkJLy8gU2FmZWd1YXJkcyBpZiBiZXZlbHMgYXJlIG5vdCBlbmFibGVkCgogICAgCQlpZiAoICEgYmV2ZWxFbmFibGVkICkgewoKICAgIAkJCWJldmVsU2VnbWVudHMgPSAwOwogICAgCQkJYmV2ZWxUaGlja25lc3MgPSAwOwogICAgCQkJYmV2ZWxTaXplID0gMDsKICAgIAkJCWJldmVsT2Zmc2V0ID0gMDsKCiAgICAJCX0KCiAgICAJCS8vIFZhcmlhYmxlcyBpbml0aWFsaXphdGlvbgoKICAgIAkJdmFyIGFob2xlLCBoLCBobDsgLy8gbG9vcGluZyBvZiBob2xlcwoKICAgIAkJdmFyIHNoYXBlUG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApOwoKICAgIAkJdmFyIHZlcnRpY2VzID0gc2hhcGVQb2ludHMuc2hhcGU7CiAgICAJCXZhciBob2xlcyA9IHNoYXBlUG9pbnRzLmhvbGVzOwoKICAgIAkJdmFyIHJldmVyc2UgPSAhIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHZlcnRpY2VzICk7CgogICAgCQlpZiAoIHJldmVyc2UgKSB7CgogICAgCQkJdmVydGljZXMgPSB2ZXJ0aWNlcy5yZXZlcnNlKCk7CgogICAgCQkJLy8gTWF5YmUgd2Ugc2hvdWxkIGFsc28gY2hlY2sgaWYgaG9sZXMgYXJlIGluIHRoZSBvcHBvc2l0ZSBkaXJlY3Rpb24sIGp1c3QgdG8gYmUgc2FmZSAuLi4KCiAgICAJCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKCiAgICAJCQkJYWhvbGUgPSBob2xlc1sgaCBdOwoKICAgIAkJCQlpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIGFob2xlICkgKSB7CgogICAgCQkJCQlob2xlc1sgaCBdID0gYWhvbGUucmV2ZXJzZSgpOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKCiAgICAJCXZhciBmYWNlcyA9IFNoYXBlVXRpbHMudHJpYW5ndWxhdGVTaGFwZSggdmVydGljZXMsIGhvbGVzICk7CgogICAgCQkvKiBWZXJ0aWNlcyAqLwoKICAgIAkJdmFyIGNvbnRvdXIgPSB2ZXJ0aWNlczsgLy8gdmVydGljZXMgaGFzIGFsbCBwb2ludHMgYnV0IGNvbnRvdXIgaGFzIG9ubHkgcG9pbnRzIG9mIGNpcmN1bWZlcmVuY2UKCiAgICAJCWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgewoKICAgIAkJCWFob2xlID0gaG9sZXNbIGggXTsKCiAgICAJCQl2ZXJ0aWNlcyA9IHZlcnRpY2VzLmNvbmNhdCggYWhvbGUgKTsKCiAgICAJCX0KCgogICAgCQlmdW5jdGlvbiBzY2FsZVB0MiggcHQsIHZlYywgc2l6ZSApIHsKCiAgICAJCQlpZiAoICEgdmVjICkgY29uc29sZS5lcnJvciggIlRIUkVFLkV4dHJ1ZGVHZW9tZXRyeTogdmVjIGRvZXMgbm90IGV4aXN0IiApOwoKICAgIAkJCXJldHVybiB2ZWMuY2xvbmUoKS5tdWx0aXBseVNjYWxhciggc2l6ZSApLmFkZCggcHQgKTsKCiAgICAJCX0KCiAgICAJCXZhciBiLCBicywgdCwgeiwKICAgIAkJCXZlcnQsIHZsZW4gPSB2ZXJ0aWNlcy5sZW5ndGgsCiAgICAJCQlmYWNlLCBmbGVuID0gZmFjZXMubGVuZ3RoOwoKCiAgICAJCS8vIEZpbmQgZGlyZWN0aW9ucyBmb3IgcG9pbnQgbW92ZW1lbnQKCgogICAgCQlmdW5jdGlvbiBnZXRCZXZlbFZlYyggaW5QdCwgaW5QcmV2LCBpbk5leHQgKSB7CgogICAgCQkJLy8gY29tcHV0ZXMgZm9yIGluUHQgdGhlIGNvcnJlc3BvbmRpbmcgcG9pbnQgaW5QdCcgb24gYSBuZXcgY29udG91cgogICAgCQkJLy8gICBzaGlmdGVkIGJ5IDEgdW5pdCAobGVuZ3RoIG9mIG5vcm1hbGl6ZWQgdmVjdG9yKSB0byB0aGUgbGVmdAogICAgCQkJLy8gaWYgd2Ugd2FsayBhbG9uZyBjb250b3VyIGNsb2Nrd2lzZSwgdGhpcyBuZXcgY29udG91ciBpcyBvdXRzaWRlIHRoZSBvbGQgb25lCiAgICAJCQkvLwogICAgCQkJLy8gaW5QdCcgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpbmVzIHBhcmFsbGVsIHRvIHRoZSB0d28KICAgIAkJCS8vICBhZGphY2VudCBlZGdlcyBvZiBpblB0IGF0IGEgZGlzdGFuY2Ugb2YgMSB1bml0IG9uIHRoZSBsZWZ0IHNpZGUuCgogICAgCQkJdmFyIHZfdHJhbnNfeCwgdl90cmFuc195LCBzaHJpbmtfYnk7IC8vIHJlc3VsdGluZyB0cmFuc2xhdGlvbiB2ZWN0b3IgZm9yIGluUHQKCiAgICAJCQkvLyBnb29kIHJlYWRpbmcgZm9yIGdlb21ldHJ5IGFsZ29yaXRobXMgKGhlcmU6IGxpbmUtbGluZSBpbnRlcnNlY3Rpb24pCiAgICAJCQkvLyBodHRwOi8vZ2VvbWFsZ29yaXRobXMuY29tL2EwNS1faW50ZXJzZWN0LTEuaHRtbAoKICAgIAkJCXZhciB2X3ByZXZfeCA9IGluUHQueCAtIGluUHJldi54LAogICAgCQkJCXZfcHJldl95ID0gaW5QdC55IC0gaW5QcmV2Lnk7CiAgICAJCQl2YXIgdl9uZXh0X3ggPSBpbk5leHQueCAtIGluUHQueCwKICAgIAkJCQl2X25leHRfeSA9IGluTmV4dC55IC0gaW5QdC55OwoKICAgIAkJCXZhciB2X3ByZXZfbGVuc3EgPSAoIHZfcHJldl94ICogdl9wcmV2X3ggKyB2X3ByZXZfeSAqIHZfcHJldl95ICk7CgogICAgCQkJLy8gY2hlY2sgZm9yIGNvbGxpbmVhciBlZGdlcwogICAgCQkJdmFyIGNvbGxpbmVhcjAgPSAoIHZfcHJldl94ICogdl9uZXh0X3kgLSB2X3ByZXZfeSAqIHZfbmV4dF94ICk7CgogICAgCQkJaWYgKCBNYXRoLmFicyggY29sbGluZWFyMCApID4gTnVtYmVyLkVQU0lMT04gKSB7CgogICAgCQkJCS8vIG5vdCBjb2xsaW5lYXIKCiAgICAJCQkJLy8gbGVuZ3RoIG9mIHZlY3RvcnMgZm9yIG5vcm1hbGl6aW5nCgogICAgCQkJCXZhciB2X3ByZXZfbGVuID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTsKICAgIAkJCQl2YXIgdl9uZXh0X2xlbiA9IE1hdGguc3FydCggdl9uZXh0X3ggKiB2X25leHRfeCArIHZfbmV4dF95ICogdl9uZXh0X3kgKTsKCiAgICAJCQkJLy8gc2hpZnQgYWRqYWNlbnQgcG9pbnRzIGJ5IHVuaXQgdmVjdG9ycyB0byB0aGUgbGVmdAoKICAgIAkJCQl2YXIgcHRQcmV2U2hpZnRfeCA9ICggaW5QcmV2LnggLSB2X3ByZXZfeSAvIHZfcHJldl9sZW4gKTsKICAgIAkJCQl2YXIgcHRQcmV2U2hpZnRfeSA9ICggaW5QcmV2LnkgKyB2X3ByZXZfeCAvIHZfcHJldl9sZW4gKTsKCiAgICAJCQkJdmFyIHB0TmV4dFNoaWZ0X3ggPSAoIGluTmV4dC54IC0gdl9uZXh0X3kgLyB2X25leHRfbGVuICk7CiAgICAJCQkJdmFyIHB0TmV4dFNoaWZ0X3kgPSAoIGluTmV4dC55ICsgdl9uZXh0X3ggLyB2X25leHRfbGVuICk7CgogICAgCQkJCS8vIHNjYWxpbmcgZmFjdG9yIGZvciB2X3ByZXYgdG8gaW50ZXJzZWN0aW9uIHBvaW50CgogICAgCQkJCXZhciBzZiA9ICggKCBwdE5leHRTaGlmdF94IC0gcHRQcmV2U2hpZnRfeCApICogdl9uZXh0X3kgLQogICAgCQkJCQkJKCBwdE5leHRTaGlmdF95IC0gcHRQcmV2U2hpZnRfeSApICogdl9uZXh0X3ggKSAvCiAgICAJCQkJCSggdl9wcmV2X3ggKiB2X25leHRfeSAtIHZfcHJldl95ICogdl9uZXh0X3ggKTsKCiAgICAJCQkJLy8gdmVjdG9yIGZyb20gaW5QdCB0byBpbnRlcnNlY3Rpb24gcG9pbnQKCiAgICAJCQkJdl90cmFuc194ID0gKCBwdFByZXZTaGlmdF94ICsgdl9wcmV2X3ggKiBzZiAtIGluUHQueCApOwogICAgCQkJCXZfdHJhbnNfeSA9ICggcHRQcmV2U2hpZnRfeSArIHZfcHJldl95ICogc2YgLSBpblB0LnkgKTsKCiAgICAJCQkJLy8gRG9uJ3Qgbm9ybWFsaXplISwgb3RoZXJ3aXNlIHNoYXJwIGNvcm5lcnMgYmVjb21lIHVnbHkKICAgIAkJCQkvLyAgYnV0IHByZXZlbnQgY3Jhenkgc3Bpa2VzCiAgICAJCQkJdmFyIHZfdHJhbnNfbGVuc3EgPSAoIHZfdHJhbnNfeCAqIHZfdHJhbnNfeCArIHZfdHJhbnNfeSAqIHZfdHJhbnNfeSApOwogICAgCQkJCWlmICggdl90cmFuc19sZW5zcSA8PSAyICkgewoKICAgIAkJCQkJcmV0dXJuIG5ldyBWZWN0b3IyKCB2X3RyYW5zX3gsIHZfdHJhbnNfeSApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJc2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3RyYW5zX2xlbnNxIC8gMiApOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJLy8gaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBjb2xsaW5lYXIgZWRnZXMKCiAgICAJCQkJdmFyIGRpcmVjdGlvbl9lcSA9IGZhbHNlOyAvLyBhc3N1bWVzOiBvcHBvc2l0ZQogICAgCQkJCWlmICggdl9wcmV2X3ggPiBOdW1iZXIuRVBTSUxPTiApIHsKCiAgICAJCQkJCWlmICggdl9uZXh0X3ggPiBOdW1iZXIuRVBTSUxPTiApIHsKCiAgICAJCQkJCQlkaXJlY3Rpb25fZXEgPSB0cnVlOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJaWYgKCB2X3ByZXZfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7CgogICAgCQkJCQkJaWYgKCB2X25leHRfeCA8IC0gTnVtYmVyLkVQU0lMT04gKSB7CgogICAgCQkJCQkJCWRpcmVjdGlvbl9lcSA9IHRydWU7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQlpZiAoIE1hdGguc2lnbiggdl9wcmV2X3kgKSA9PT0gTWF0aC5zaWduKCB2X25leHRfeSApICkgewoKICAgIAkJCQkJCQlkaXJlY3Rpb25fZXEgPSB0cnVlOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIGRpcmVjdGlvbl9lcSApIHsKCiAgICAJCQkJCS8vIGNvbnNvbGUubG9nKCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzZXF1ZW5jZSIpOwogICAgCQkJCQl2X3RyYW5zX3ggPSAtIHZfcHJldl95OwogICAgCQkJCQl2X3RyYW5zX3kgPSB2X3ByZXZfeDsKICAgIAkJCQkJc2hyaW5rX2J5ID0gTWF0aC5zcXJ0KCB2X3ByZXZfbGVuc3EgKTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCS8vIGNvbnNvbGUubG9nKCJXYXJuaW5nOiBsaW5lcyBhcmUgYSBzdHJhaWdodCBzcGlrZSIpOwogICAgCQkJCQl2X3RyYW5zX3ggPSB2X3ByZXZfeDsKICAgIAkJCQkJdl90cmFuc195ID0gdl9wcmV2X3k7CiAgICAJCQkJCXNocmlua19ieSA9IE1hdGguc3FydCggdl9wcmV2X2xlbnNxIC8gMiApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCXJldHVybiBuZXcgVmVjdG9yMiggdl90cmFuc194IC8gc2hyaW5rX2J5LCB2X3RyYW5zX3kgLyBzaHJpbmtfYnkgKTsKCiAgICAJCX0KCgogICAgCQl2YXIgY29udG91ck1vdmVtZW50cyA9IFtdOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNvbnRvdXIubGVuZ3RoLCBqID0gaWwgLSAxLCBrID0gaSArIDE7IGkgPCBpbDsgaSArKywgaiArKywgayArKyApIHsKCiAgICAJCQlpZiAoIGogPT09IGlsICkgaiA9IDA7CiAgICAJCQlpZiAoIGsgPT09IGlsICkgayA9IDA7CgogICAgCQkJLy8gIChqKS0tLShpKS0tLShrKQogICAgCQkJLy8gY29uc29sZS5sb2coJ2ksaixrJywgaSwgaiAsIGspCgogICAgCQkJY29udG91ck1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGNvbnRvdXJbIGkgXSwgY29udG91clsgaiBdLCBjb250b3VyWyBrIF0gKTsKCiAgICAJCX0KCiAgICAJCXZhciBob2xlc01vdmVtZW50cyA9IFtdLAogICAgCQkJb25lSG9sZU1vdmVtZW50cywgdmVydGljZXNNb3ZlbWVudHMgPSBjb250b3VyTW92ZW1lbnRzLmNvbmNhdCgpOwoKICAgIAkJZm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CgogICAgCQkJYWhvbGUgPSBob2xlc1sgaCBdOwoKICAgIAkJCW9uZUhvbGVNb3ZlbWVudHMgPSBbXTsKCiAgICAJCQlmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGgsIGogPSBpbCAtIDEsIGsgPSBpICsgMTsgaSA8IGlsOyBpICsrLCBqICsrLCBrICsrICkgewoKICAgIAkJCQlpZiAoIGogPT09IGlsICkgaiA9IDA7CiAgICAJCQkJaWYgKCBrID09PSBpbCApIGsgPSAwOwoKICAgIAkJCQkvLyAgKGopLS0tKGkpLS0tKGspCiAgICAJCQkJb25lSG9sZU1vdmVtZW50c1sgaSBdID0gZ2V0QmV2ZWxWZWMoIGFob2xlWyBpIF0sIGFob2xlWyBqIF0sIGFob2xlWyBrIF0gKTsKCiAgICAJCQl9CgogICAgCQkJaG9sZXNNb3ZlbWVudHMucHVzaCggb25lSG9sZU1vdmVtZW50cyApOwogICAgCQkJdmVydGljZXNNb3ZlbWVudHMgPSB2ZXJ0aWNlc01vdmVtZW50cy5jb25jYXQoIG9uZUhvbGVNb3ZlbWVudHMgKTsKCiAgICAJCX0KCgogICAgCQkvLyBMb29wIGJldmVsU2VnbWVudHMsIDEgZm9yIHRoZSBmcm9udCwgMSBmb3IgdGhlIGJhY2sKCiAgICAJCWZvciAoIGIgPSAwOyBiIDwgYmV2ZWxTZWdtZW50czsgYiArKyApIHsKCiAgICAJCQkvL2ZvciAoIGIgPSBiZXZlbFNlZ21lbnRzOyBiID4gMDsgYiAtLSApIHsKCiAgICAJCQl0ID0gYiAvIGJldmVsU2VnbWVudHM7CiAgICAJCQl6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7CiAgICAJCQlicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0OwoKICAgIAkJCS8vIGNvbnRyYWN0IHNoYXBlCgogICAgCQkJZm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTsKCiAgICAJCQkJdiggdmVydC54LCB2ZXJ0LnksIC0geiApOwoKICAgIAkJCX0KCiAgICAJCQkvLyBleHBhbmQgaG9sZXMKCiAgICAJCQlmb3IgKCBoID0gMCwgaGwgPSBob2xlcy5sZW5ndGg7IGggPCBobDsgaCArKyApIHsKCiAgICAJCQkJYWhvbGUgPSBob2xlc1sgaCBdOwogICAgCQkJCW9uZUhvbGVNb3ZlbWVudHMgPSBob2xlc01vdmVtZW50c1sgaCBdOwoKICAgIAkJCQlmb3IgKCBpID0gMCwgaWwgPSBhaG9sZS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJCXZlcnQgPSBzY2FsZVB0MiggYWhvbGVbIGkgXSwgb25lSG9sZU1vdmVtZW50c1sgaSBdLCBicyApOwoKICAgIAkJCQkJdiggdmVydC54LCB2ZXJ0LnksIC0geiApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJYnMgPSBiZXZlbFNpemUgKyBiZXZlbE9mZnNldDsKCiAgICAJCS8vIEJhY2sgZmFjaW5nIHZlcnRpY2VzCgogICAgCQlmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7CgogICAgCQkJdmVydCA9IGJldmVsRW5hYmxlZCA/IHNjYWxlUHQyKCB2ZXJ0aWNlc1sgaSBdLCB2ZXJ0aWNlc01vdmVtZW50c1sgaSBdLCBicyApIDogdmVydGljZXNbIGkgXTsKCiAgICAJCQlpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsKCiAgICAJCQkJdiggdmVydC54LCB2ZXJ0LnksIDAgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQkvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIDAgXS55LCBleHRydWRlUHRzWyAwIF0ueCApOwoKICAgIAkJCQlub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyAwIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7CiAgICAJCQkJYmlub3JtYWwuY29weSggc3BsaW5lVHViZS5iaW5vcm1hbHNbIDAgXSApLm11bHRpcGx5U2NhbGFyKCB2ZXJ0LnkgKTsKCiAgICAJCQkJcG9zaXRpb24yLmNvcHkoIGV4dHJ1ZGVQdHNbIDAgXSApLmFkZCggbm9ybWFsICkuYWRkKCBiaW5vcm1hbCApOwoKICAgIAkJCQl2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy8gQWRkIHN0ZXBwZWQgdmVydGljZXMuLi4KICAgIAkJLy8gSW5jbHVkaW5nIGZyb250IGZhY2luZyB2ZXJ0aWNlcwoKICAgIAkJdmFyIHM7CgogICAgCQlmb3IgKCBzID0gMTsgcyA8PSBzdGVwczsgcyArKyApIHsKCiAgICAJCQlmb3IgKCBpID0gMDsgaSA8IHZsZW47IGkgKysgKSB7CgogICAgCQkJCXZlcnQgPSBiZXZlbEVuYWJsZWQgPyBzY2FsZVB0MiggdmVydGljZXNbIGkgXSwgdmVydGljZXNNb3ZlbWVudHNbIGkgXSwgYnMgKSA6IHZlcnRpY2VzWyBpIF07CgogICAgCQkJCWlmICggISBleHRydWRlQnlQYXRoICkgewoKICAgIAkJCQkJdiggdmVydC54LCB2ZXJ0LnksIGRlcHRoIC8gc3RlcHMgKiBzICk7CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQkvLyB2KCB2ZXJ0LngsIHZlcnQueSArIGV4dHJ1ZGVQdHNbIHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgcyAtIDEgXS54ICk7CgogICAgCQkJCQlub3JtYWwuY29weSggc3BsaW5lVHViZS5ub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC54ICk7CiAgICAJCQkJCWJpbm9ybWFsLmNvcHkoIHNwbGluZVR1YmUuYmlub3JtYWxzWyBzIF0gKS5tdWx0aXBseVNjYWxhciggdmVydC55ICk7CgogICAgCQkJCQlwb3NpdGlvbjIuY29weSggZXh0cnVkZVB0c1sgcyBdICkuYWRkKCBub3JtYWwgKS5hZGQoIGJpbm9ybWFsICk7CgogICAgCQkJCQl2KCBwb3NpdGlvbjIueCwgcG9zaXRpb24yLnksIHBvc2l0aW9uMi56ICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgoKICAgIAkJLy8gQWRkIGJldmVsIHNlZ21lbnRzIHBsYW5lcwoKICAgIAkJLy9mb3IgKCBiID0gMTsgYiA8PSBiZXZlbFNlZ21lbnRzOyBiICsrICkgewogICAgCQlmb3IgKCBiID0gYmV2ZWxTZWdtZW50cyAtIDE7IGIgPj0gMDsgYiAtLSApIHsKCiAgICAJCQl0ID0gYiAvIGJldmVsU2VnbWVudHM7CiAgICAJCQl6ID0gYmV2ZWxUaGlja25lc3MgKiBNYXRoLmNvcyggdCAqIE1hdGguUEkgLyAyICk7CiAgICAJCQlicyA9IGJldmVsU2l6ZSAqIE1hdGguc2luKCB0ICogTWF0aC5QSSAvIDIgKSArIGJldmVsT2Zmc2V0OwoKICAgIAkJCS8vIGNvbnRyYWN0IHNoYXBlCgogICAgCQkJZm9yICggaSA9IDAsIGlsID0gY29udG91ci5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJdmVydCA9IHNjYWxlUHQyKCBjb250b3VyWyBpIF0sIGNvbnRvdXJNb3ZlbWVudHNbIGkgXSwgYnMgKTsKICAgIAkJCQl2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggKyB6ICk7CgogICAgCQkJfQoKICAgIAkJCS8vIGV4cGFuZCBob2xlcwoKICAgIAkJCWZvciAoIGggPSAwLCBobCA9IGhvbGVzLmxlbmd0aDsgaCA8IGhsOyBoICsrICkgewoKICAgIAkJCQlhaG9sZSA9IGhvbGVzWyBoIF07CiAgICAJCQkJb25lSG9sZU1vdmVtZW50cyA9IGhvbGVzTW92ZW1lbnRzWyBoIF07CgogICAgCQkJCWZvciAoIGkgPSAwLCBpbCA9IGFob2xlLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCQkJdmVydCA9IHNjYWxlUHQyKCBhaG9sZVsgaSBdLCBvbmVIb2xlTW92ZW1lbnRzWyBpIF0sIGJzICk7CgogICAgCQkJCQlpZiAoICEgZXh0cnVkZUJ5UGF0aCApIHsKCiAgICAJCQkJCQl2KCB2ZXJ0LngsIHZlcnQueSwgZGVwdGggKyB6ICk7CgogICAgCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCXYoIHZlcnQueCwgdmVydC55ICsgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueSwgZXh0cnVkZVB0c1sgc3RlcHMgLSAxIF0ueCArIHogKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8qIEZhY2VzICovCgogICAgCQkvLyBUb3AgYW5kIGJvdHRvbSBmYWNlcwoKICAgIAkJYnVpbGRMaWRGYWNlcygpOwoKICAgIAkJLy8gU2lkZXMgZmFjZXMKCiAgICAJCWJ1aWxkU2lkZUZhY2VzKCk7CgoKICAgIAkJLy8vLy8gIEludGVybmFsIGZ1bmN0aW9ucwoKICAgIAkJZnVuY3Rpb24gYnVpbGRMaWRGYWNlcygpIHsKCiAgICAJCQl2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7CgogICAgCQkJaWYgKCBiZXZlbEVuYWJsZWQgKSB7CgogICAgCQkJCXZhciBsYXllciA9IDA7IC8vIHN0ZXBzICsgMQogICAgCQkJCXZhciBvZmZzZXQgPSB2bGVuICogbGF5ZXI7CgogICAgCQkJCS8vIEJvdHRvbSBmYWNlcwoKICAgIAkJCQlmb3IgKCBpID0gMDsgaSA8IGZsZW47IGkgKysgKSB7CgogICAgCQkJCQlmYWNlID0gZmFjZXNbIGkgXTsKICAgIAkJCQkJZjMoIGZhY2VbIDIgXSArIG9mZnNldCwgZmFjZVsgMSBdICsgb2Zmc2V0LCBmYWNlWyAwIF0gKyBvZmZzZXQgKTsKCiAgICAJCQkJfQoKICAgIAkJCQlsYXllciA9IHN0ZXBzICsgYmV2ZWxTZWdtZW50cyAqIDI7CiAgICAJCQkJb2Zmc2V0ID0gdmxlbiAqIGxheWVyOwoKICAgIAkJCQkvLyBUb3AgZmFjZXMKCiAgICAJCQkJZm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkgewoKICAgIAkJCQkJZmFjZSA9IGZhY2VzWyBpIF07CiAgICAJCQkJCWYzKCBmYWNlWyAwIF0gKyBvZmZzZXQsIGZhY2VbIDEgXSArIG9mZnNldCwgZmFjZVsgMiBdICsgb2Zmc2V0ICk7CgogICAgCQkJCX0KCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQkvLyBCb3R0b20gZmFjZXMKCiAgICAJCQkJZm9yICggaSA9IDA7IGkgPCBmbGVuOyBpICsrICkgewoKICAgIAkJCQkJZmFjZSA9IGZhY2VzWyBpIF07CiAgICAJCQkJCWYzKCBmYWNlWyAyIF0sIGZhY2VbIDEgXSwgZmFjZVsgMCBdICk7CgogICAgCQkJCX0KCiAgICAJCQkJLy8gVG9wIGZhY2VzCgogICAgCQkJCWZvciAoIGkgPSAwOyBpIDwgZmxlbjsgaSArKyApIHsKCiAgICAJCQkJCWZhY2UgPSBmYWNlc1sgaSBdOwogICAgCQkJCQlmMyggZmFjZVsgMCBdICsgdmxlbiAqIHN0ZXBzLCBmYWNlWyAxIF0gKyB2bGVuICogc3RlcHMsIGZhY2VbIDIgXSArIHZsZW4gKiBzdGVwcyApOwoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJCXNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDAgKTsKCiAgICAJCX0KCiAgICAJCS8vIENyZWF0ZSBmYWNlcyBmb3IgdGhlIHotc2lkZXMgb2YgdGhlIHNoYXBlCgogICAgCQlmdW5jdGlvbiBidWlsZFNpZGVGYWNlcygpIHsKCiAgICAJCQl2YXIgc3RhcnQgPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7CiAgICAJCQl2YXIgbGF5ZXJvZmZzZXQgPSAwOwogICAgCQkJc2lkZXdhbGxzKCBjb250b3VyLCBsYXllcm9mZnNldCApOwogICAgCQkJbGF5ZXJvZmZzZXQgKz0gY29udG91ci5sZW5ndGg7CgogICAgCQkJZm9yICggaCA9IDAsIGhsID0gaG9sZXMubGVuZ3RoOyBoIDwgaGw7IGggKysgKSB7CgogICAgCQkJCWFob2xlID0gaG9sZXNbIGggXTsKICAgIAkJCQlzaWRld2FsbHMoIGFob2xlLCBsYXllcm9mZnNldCApOwoKICAgIAkJCQkvLywgdHJ1ZQogICAgCQkJCWxheWVyb2Zmc2V0ICs9IGFob2xlLmxlbmd0aDsKCiAgICAJCQl9CgoKICAgIAkJCXNjb3BlLmFkZEdyb3VwKCBzdGFydCwgdmVydGljZXNBcnJheS5sZW5ndGggLyAzIC0gc3RhcnQsIDEgKTsKCgogICAgCQl9CgogICAgCQlmdW5jdGlvbiBzaWRld2FsbHMoIGNvbnRvdXIsIGxheWVyb2Zmc2V0ICkgewoKICAgIAkJCXZhciBqLCBrOwogICAgCQkJaSA9IGNvbnRvdXIubGVuZ3RoOwoKICAgIAkJCXdoaWxlICggLS0gaSA+PSAwICkgewoKICAgIAkJCQlqID0gaTsKICAgIAkJCQlrID0gaSAtIDE7CiAgICAJCQkJaWYgKCBrIDwgMCApIGsgPSBjb250b3VyLmxlbmd0aCAtIDE7CgogICAgCQkJCS8vY29uc29sZS5sb2coJ2InLCBpLGosIGktMSwgayx2ZXJ0aWNlcy5sZW5ndGgpOwoKICAgIAkJCQl2YXIgcyA9IDAsCiAgICAJCQkJCXNsID0gc3RlcHMgKyBiZXZlbFNlZ21lbnRzICogMjsKCiAgICAJCQkJZm9yICggcyA9IDA7IHMgPCBzbDsgcyArKyApIHsKCiAgICAJCQkJCXZhciBzbGVuMSA9IHZsZW4gKiBzOwogICAgCQkJCQl2YXIgc2xlbjIgPSB2bGVuICogKCBzICsgMSApOwoKICAgIAkJCQkJdmFyIGEgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMSwKICAgIAkJCQkJCWIgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMSwKICAgIAkJCQkJCWMgPSBsYXllcm9mZnNldCArIGsgKyBzbGVuMiwKICAgIAkJCQkJCWQgPSBsYXllcm9mZnNldCArIGogKyBzbGVuMjsKCiAgICAJCQkJCWY0KCBhLCBiLCBjLCBkICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlmdW5jdGlvbiB2KCB4LCB5LCB6ICkgewoKICAgIAkJCXBsYWNlaG9sZGVyLnB1c2goIHggKTsKICAgIAkJCXBsYWNlaG9sZGVyLnB1c2goIHkgKTsKICAgIAkJCXBsYWNlaG9sZGVyLnB1c2goIHogKTsKCiAgICAJCX0KCgogICAgCQlmdW5jdGlvbiBmMyggYSwgYiwgYyApIHsKCiAgICAJCQlhZGRWZXJ0ZXgoIGEgKTsKICAgIAkJCWFkZFZlcnRleCggYiApOwogICAgCQkJYWRkVmVydGV4KCBjICk7CgogICAgCQkJdmFyIG5leHRJbmRleCA9IHZlcnRpY2VzQXJyYXkubGVuZ3RoIC8gMzsKICAgIAkJCXZhciB1dnMgPSB1dmdlbi5nZW5lcmF0ZVRvcFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApOwoKICAgIAkJCWFkZFVWKCB1dnNbIDAgXSApOwogICAgCQkJYWRkVVYoIHV2c1sgMSBdICk7CiAgICAJCQlhZGRVViggdXZzWyAyIF0gKTsKCiAgICAJCX0KCiAgICAJCWZ1bmN0aW9uIGY0KCBhLCBiLCBjLCBkICkgewoKICAgIAkJCWFkZFZlcnRleCggYSApOwogICAgCQkJYWRkVmVydGV4KCBiICk7CiAgICAJCQlhZGRWZXJ0ZXgoIGQgKTsKCiAgICAJCQlhZGRWZXJ0ZXgoIGIgKTsKICAgIAkJCWFkZFZlcnRleCggYyApOwogICAgCQkJYWRkVmVydGV4KCBkICk7CgoKICAgIAkJCXZhciBuZXh0SW5kZXggPSB2ZXJ0aWNlc0FycmF5Lmxlbmd0aCAvIDM7CiAgICAJCQl2YXIgdXZzID0gdXZnZW4uZ2VuZXJhdGVTaWRlV2FsbFVWKCBzY29wZSwgdmVydGljZXNBcnJheSwgbmV4dEluZGV4IC0gNiwgbmV4dEluZGV4IC0gMywgbmV4dEluZGV4IC0gMiwgbmV4dEluZGV4IC0gMSApOwoKICAgIAkJCWFkZFVWKCB1dnNbIDAgXSApOwogICAgCQkJYWRkVVYoIHV2c1sgMSBdICk7CiAgICAJCQlhZGRVViggdXZzWyAzIF0gKTsKCiAgICAJCQlhZGRVViggdXZzWyAxIF0gKTsKICAgIAkJCWFkZFVWKCB1dnNbIDIgXSApOwogICAgCQkJYWRkVVYoIHV2c1sgMyBdICk7CgogICAgCQl9CgogICAgCQlmdW5jdGlvbiBhZGRWZXJ0ZXgoIGluZGV4ICkgewoKICAgIAkJCXZlcnRpY2VzQXJyYXkucHVzaCggcGxhY2Vob2xkZXJbIGluZGV4ICogMyArIDAgXSApOwogICAgCQkJdmVydGljZXNBcnJheS5wdXNoKCBwbGFjZWhvbGRlclsgaW5kZXggKiAzICsgMSBdICk7CiAgICAJCQl2ZXJ0aWNlc0FycmF5LnB1c2goIHBsYWNlaG9sZGVyWyBpbmRleCAqIDMgKyAyIF0gKTsKCiAgICAJCX0KCgogICAgCQlmdW5jdGlvbiBhZGRVViggdmVjdG9yMiApIHsKCiAgICAJCQl1dkFycmF5LnB1c2goIHZlY3RvcjIueCApOwogICAgCQkJdXZBcnJheS5wdXNoKCB2ZWN0b3IyLnkgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0KCiAgICBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBFeHRydWRlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OwoKICAgIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKICAgIAl2YXIgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKICAgIAl2YXIgc2hhcGVzID0gdGhpcy5wYXJhbWV0ZXJzLnNoYXBlczsKICAgIAl2YXIgb3B0aW9ucyA9IHRoaXMucGFyYW1ldGVycy5vcHRpb25zOwoKICAgIAlyZXR1cm4gdG9KU09OKCBzaGFwZXMsIG9wdGlvbnMsIGRhdGEgKTsKCiAgICB9OwoKICAgIC8vCgogICAgdmFyIFdvcmxkVVZHZW5lcmF0b3IgPSB7CgogICAgCWdlbmVyYXRlVG9wVVY6IGZ1bmN0aW9uICggZ2VvbWV0cnksIHZlcnRpY2VzLCBpbmRleEEsIGluZGV4QiwgaW5kZXhDICkgewoKICAgIAkJdmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07CiAgICAJCXZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTsKICAgIAkJdmFyIGJfeCA9IHZlcnRpY2VzWyBpbmRleEIgKiAzIF07CiAgICAJCXZhciBiX3kgPSB2ZXJ0aWNlc1sgaW5kZXhCICogMyArIDEgXTsKICAgIAkJdmFyIGNfeCA9IHZlcnRpY2VzWyBpbmRleEMgKiAzIF07CiAgICAJCXZhciBjX3kgPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDEgXTsKCiAgICAJCXJldHVybiBbCiAgICAJCQluZXcgVmVjdG9yMiggYV94LCBhX3kgKSwKICAgIAkJCW5ldyBWZWN0b3IyKCBiX3gsIGJfeSApLAogICAgCQkJbmV3IFZlY3RvcjIoIGNfeCwgY195ICkKICAgIAkJXTsKCiAgICAJfSwKCiAgICAJZ2VuZXJhdGVTaWRlV2FsbFVWOiBmdW5jdGlvbiAoIGdlb21ldHJ5LCB2ZXJ0aWNlcywgaW5kZXhBLCBpbmRleEIsIGluZGV4QywgaW5kZXhEICkgewoKICAgIAkJdmFyIGFfeCA9IHZlcnRpY2VzWyBpbmRleEEgKiAzIF07CiAgICAJCXZhciBhX3kgPSB2ZXJ0aWNlc1sgaW5kZXhBICogMyArIDEgXTsKICAgIAkJdmFyIGFfeiA9IHZlcnRpY2VzWyBpbmRleEEgKiAzICsgMiBdOwogICAgCQl2YXIgYl94ID0gdmVydGljZXNbIGluZGV4QiAqIDMgXTsKICAgIAkJdmFyIGJfeSA9IHZlcnRpY2VzWyBpbmRleEIgKiAzICsgMSBdOwogICAgCQl2YXIgYl96ID0gdmVydGljZXNbIGluZGV4QiAqIDMgKyAyIF07CiAgICAJCXZhciBjX3ggPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyBdOwogICAgCQl2YXIgY195ID0gdmVydGljZXNbIGluZGV4QyAqIDMgKyAxIF07CiAgICAJCXZhciBjX3ogPSB2ZXJ0aWNlc1sgaW5kZXhDICogMyArIDIgXTsKICAgIAkJdmFyIGRfeCA9IHZlcnRpY2VzWyBpbmRleEQgKiAzIF07CiAgICAJCXZhciBkX3kgPSB2ZXJ0aWNlc1sgaW5kZXhEICogMyArIDEgXTsKICAgIAkJdmFyIGRfeiA9IHZlcnRpY2VzWyBpbmRleEQgKiAzICsgMiBdOwoKICAgIAkJaWYgKCBNYXRoLmFicyggYV95IC0gYl95ICkgPCAwLjAxICkgewoKICAgIAkJCXJldHVybiBbCiAgICAJCQkJbmV3IFZlY3RvcjIoIGFfeCwgMSAtIGFfeiApLAogICAgCQkJCW5ldyBWZWN0b3IyKCBiX3gsIDEgLSBiX3ogKSwKICAgIAkJCQluZXcgVmVjdG9yMiggY194LCAxIC0gY196ICksCiAgICAJCQkJbmV3IFZlY3RvcjIoIGRfeCwgMSAtIGRfeiApCiAgICAJCQldOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlyZXR1cm4gWwogICAgCQkJCW5ldyBWZWN0b3IyKCBhX3ksIDEgLSBhX3ogKSwKICAgIAkJCQluZXcgVmVjdG9yMiggYl95LCAxIC0gYl96ICksCiAgICAJCQkJbmV3IFZlY3RvcjIoIGNfeSwgMSAtIGNfeiApLAogICAgCQkJCW5ldyBWZWN0b3IyKCBkX3ksIDEgLSBkX3ogKQogICAgCQkJXTsKCiAgICAJCX0KCiAgICAJfQogICAgfTsKCiAgICBmdW5jdGlvbiB0b0pTT04oIHNoYXBlcywgb3B0aW9ucywgZGF0YSApIHsKCiAgICAJLy8KCiAgICAJZGF0YS5zaGFwZXMgPSBbXTsKCiAgICAJaWYgKCBBcnJheS5pc0FycmF5KCBzaGFwZXMgKSApIHsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IHNoYXBlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBzaGFwZSA9IHNoYXBlc1sgaSBdOwoKICAgIAkJCWRhdGEuc2hhcGVzLnB1c2goIHNoYXBlLnV1aWQgKTsKCiAgICAJCX0KCiAgICAJfSBlbHNlIHsKCiAgICAJCWRhdGEuc2hhcGVzLnB1c2goIHNoYXBlcy51dWlkICk7CgogICAgCX0KCiAgICAJLy8KCiAgICAJaWYgKCBvcHRpb25zLmV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSBkYXRhLm9wdGlvbnMuZXh0cnVkZVBhdGggPSBvcHRpb25zLmV4dHJ1ZGVQYXRoLnRvSlNPTigpOwoKICAgIAlyZXR1cm4gZGF0YTsKCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICoKICAgICAqIFRleHQgPSAzRCBUZXh0CiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBmb250OiA8VEhSRUUuRm9udD4sIC8vIGZvbnQKICAgICAqCiAgICAgKiAgc2l6ZTogPGZsb2F0PiwgLy8gc2l6ZSBvZiB0aGUgdGV4dAogICAgICogIGhlaWdodDogPGZsb2F0PiwgLy8gdGhpY2tuZXNzIHRvIGV4dHJ1ZGUgdGV4dAogICAgICogIGN1cnZlU2VnbWVudHM6IDxpbnQ+LCAvLyBudW1iZXIgb2YgcG9pbnRzIG9uIHRoZSBjdXJ2ZXMKICAgICAqCiAgICAgKiAgYmV2ZWxFbmFibGVkOiA8Ym9vbD4sIC8vIHR1cm4gb24gYmV2ZWwKICAgICAqICBiZXZlbFRoaWNrbmVzczogPGZsb2F0PiwgLy8gaG93IGRlZXAgaW50byB0ZXh0IGJldmVsIGdvZXMKICAgICAqICBiZXZlbFNpemU6IDxmbG9hdD4sIC8vIGhvdyBmYXIgZnJvbSB0ZXh0IG91dGxpbmUgKGluY2x1ZGluZyBiZXZlbE9mZnNldCkgaXMgYmV2ZWwKICAgICAqICBiZXZlbE9mZnNldDogPGZsb2F0PiAvLyBob3cgZmFyIGZyb20gdGV4dCBvdXRsaW5lIGRvZXMgYmV2ZWwgc3RhcnQKICAgICAqIH0KICAgICAqLwoKICAgIC8vIFRleHRHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFRleHRHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnVGV4dEdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQl0ZXh0OiB0ZXh0LAogICAgCQlwYXJhbWV0ZXJzOiBwYXJhbWV0ZXJzCiAgICAJfTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBUZXh0QnVmZmVyR2VvbWV0cnkoIHRleHQsIHBhcmFtZXRlcnMgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBUZXh0R2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBUZXh0R2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVGV4dEdlb21ldHJ5OwoKICAgIC8vIFRleHRCdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFRleHRCdWZmZXJHZW9tZXRyeSggdGV4dCwgcGFyYW1ldGVycyApIHsKCiAgICAJcGFyYW1ldGVycyA9IHBhcmFtZXRlcnMgfHwge307CgogICAgCXZhciBmb250ID0gcGFyYW1ldGVycy5mb250OwoKICAgIAlpZiAoICEgKCBmb250ICYmIGZvbnQuaXNGb250ICkgKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuVGV4dEdlb21ldHJ5OiBmb250IHBhcmFtZXRlciBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVEhSRUUuRm9udC4nICk7CiAgICAJCXJldHVybiBuZXcgR2VvbWV0cnkoKTsKCiAgICAJfQoKICAgIAl2YXIgc2hhcGVzID0gZm9udC5nZW5lcmF0ZVNoYXBlcyggdGV4dCwgcGFyYW1ldGVycy5zaXplICk7CgogICAgCS8vIHRyYW5zbGF0ZSBwYXJhbWV0ZXJzIHRvIEV4dHJ1ZGVHZW9tZXRyeSBBUEkKCiAgICAJcGFyYW1ldGVycy5kZXB0aCA9IHBhcmFtZXRlcnMuaGVpZ2h0ICE9PSB1bmRlZmluZWQgPyBwYXJhbWV0ZXJzLmhlaWdodCA6IDUwOwoKICAgIAkvLyBkZWZhdWx0cwoKICAgIAlpZiAoIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPT09IHVuZGVmaW5lZCApIHBhcmFtZXRlcnMuYmV2ZWxUaGlja25lc3MgPSAxMDsKICAgIAlpZiAoIHBhcmFtZXRlcnMuYmV2ZWxTaXplID09PSB1bmRlZmluZWQgKSBwYXJhbWV0ZXJzLmJldmVsU2l6ZSA9IDg7CiAgICAJaWYgKCBwYXJhbWV0ZXJzLmJldmVsRW5hYmxlZCA9PT0gdW5kZWZpbmVkICkgcGFyYW1ldGVycy5iZXZlbEVuYWJsZWQgPSBmYWxzZTsKCiAgICAJRXh0cnVkZUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIHNoYXBlcywgcGFyYW1ldGVycyApOwoKICAgIAl0aGlzLnR5cGUgPSAnVGV4dEJ1ZmZlckdlb21ldHJ5JzsKCiAgICB9CgogICAgVGV4dEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIFRleHRCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBUZXh0QnVmZmVyR2VvbWV0cnk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICovCgogICAgLy8gU3BoZXJlR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBTcGhlcmVHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1NwaGVyZUdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlyYWRpdXM6IHJhZGl1cywKICAgIAkJd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKICAgIAkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAogICAgCQlwaGlTdGFydDogcGhpU3RhcnQsCiAgICAJCXBoaUxlbmd0aDogcGhpTGVuZ3RoLAogICAgCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAogICAgCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKICAgIAl9OwoKICAgIAl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFNwaGVyZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHdpZHRoU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApICk7CiAgICAJdGhpcy5tZXJnZVZlcnRpY2VzKCk7CgogICAgfQoKICAgIFNwaGVyZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgU3BoZXJlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU3BoZXJlR2VvbWV0cnk7CgogICAgLy8gU3BoZXJlQnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBTcGhlcmVCdWZmZXJHZW9tZXRyeSggcmFkaXVzLCB3aWR0aFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgogICAgCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1NwaGVyZUJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlyYWRpdXM6IHJhZGl1cywKICAgIAkJd2lkdGhTZWdtZW50czogd2lkdGhTZWdtZW50cywKICAgIAkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAogICAgCQlwaGlTdGFydDogcGhpU3RhcnQsCiAgICAJCXBoaUxlbmd0aDogcGhpTGVuZ3RoLAogICAgCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAogICAgCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKICAgIAl9OwoKICAgIAlyYWRpdXMgPSByYWRpdXMgfHwgMTsKCiAgICAJd2lkdGhTZWdtZW50cyA9IE1hdGgubWF4KCAzLCBNYXRoLmZsb29yKCB3aWR0aFNlZ21lbnRzICkgfHwgOCApOwogICAgCWhlaWdodFNlZ21lbnRzID0gTWF0aC5tYXgoIDIsIE1hdGguZmxvb3IoIGhlaWdodFNlZ21lbnRzICkgfHwgNiApOwoKICAgIAlwaGlTdGFydCA9IHBoaVN0YXJ0ICE9PSB1bmRlZmluZWQgPyBwaGlTdGFydCA6IDA7CiAgICAJcGhpTGVuZ3RoID0gcGhpTGVuZ3RoICE9PSB1bmRlZmluZWQgPyBwaGlMZW5ndGggOiBNYXRoLlBJICogMjsKCiAgICAJdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwOwogICAgCXRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSTsKCiAgICAJdmFyIHRoZXRhRW5kID0gTWF0aC5taW4oIHRoZXRhU3RhcnQgKyB0aGV0YUxlbmd0aCwgTWF0aC5QSSApOwoKICAgIAl2YXIgaXgsIGl5OwoKICAgIAl2YXIgaW5kZXggPSAwOwogICAgCXZhciBncmlkID0gW107CgogICAgCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwogICAgCXZhciBub3JtYWwgPSBuZXcgVmVjdG9yMygpOwoKICAgIAkvLyBidWZmZXJzCgogICAgCXZhciBpbmRpY2VzID0gW107CiAgICAJdmFyIHZlcnRpY2VzID0gW107CiAgICAJdmFyIG5vcm1hbHMgPSBbXTsKICAgIAl2YXIgdXZzID0gW107CgogICAgCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKCiAgICAJZm9yICggaXkgPSAwOyBpeSA8PSBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7CgogICAgCQl2YXIgdmVydGljZXNSb3cgPSBbXTsKCiAgICAJCXZhciB2ID0gaXkgLyBoZWlnaHRTZWdtZW50czsKCiAgICAJCS8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlIHBvbGVzCgogICAgCQl2YXIgdU9mZnNldCA9IDA7CgogICAgCQlpZiAoIGl5ID09IDAgJiYgdGhldGFTdGFydCA9PSAwICkgewoKICAgIAkJCXVPZmZzZXQgPSAwLjUgLyB3aWR0aFNlZ21lbnRzOwoKICAgIAkJfSBlbHNlIGlmICggaXkgPT0gaGVpZ2h0U2VnbWVudHMgJiYgdGhldGFFbmQgPT0gTWF0aC5QSSApIHsKCiAgICAJCQl1T2Zmc2V0ID0gLSAwLjUgLyB3aWR0aFNlZ21lbnRzOwoKICAgIAkJfQoKICAgIAkJZm9yICggaXggPSAwOyBpeCA8PSB3aWR0aFNlZ21lbnRzOyBpeCArKyApIHsKCiAgICAJCQl2YXIgdSA9IGl4IC8gd2lkdGhTZWdtZW50czsKCiAgICAJCQkvLyB2ZXJ0ZXgKCiAgICAJCQl2ZXJ0ZXgueCA9IC0gcmFkaXVzICogTWF0aC5jb3MoIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKICAgIAkJCXZlcnRleC55ID0gcmFkaXVzICogTWF0aC5jb3MoIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKICAgIAkJCXZlcnRleC56ID0gcmFkaXVzICogTWF0aC5zaW4oIHBoaVN0YXJ0ICsgdSAqIHBoaUxlbmd0aCApICogTWF0aC5zaW4oIHRoZXRhU3RhcnQgKyB2ICogdGhldGFMZW5ndGggKTsKCiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJLy8gbm9ybWFsCgogICAgCQkJbm9ybWFsLmNvcHkoIHZlcnRleCApLm5vcm1hbGl6ZSgpOwogICAgCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgogICAgCQkJLy8gdXYKCiAgICAJCQl1dnMucHVzaCggdSArIHVPZmZzZXQsIDEgLSB2ICk7CgogICAgCQkJdmVydGljZXNSb3cucHVzaCggaW5kZXggKysgKTsKCiAgICAJCX0KCiAgICAJCWdyaWQucHVzaCggdmVydGljZXNSb3cgKTsKCiAgICAJfQoKICAgIAkvLyBpbmRpY2VzCgogICAgCWZvciAoIGl5ID0gMDsgaXkgPCBoZWlnaHRTZWdtZW50czsgaXkgKysgKSB7CgogICAgCQlmb3IgKCBpeCA9IDA7IGl4IDwgd2lkdGhTZWdtZW50czsgaXggKysgKSB7CgogICAgCQkJdmFyIGEgPSBncmlkWyBpeSBdWyBpeCArIDEgXTsKICAgIAkJCXZhciBiID0gZ3JpZFsgaXkgXVsgaXggXTsKICAgIAkJCXZhciBjID0gZ3JpZFsgaXkgKyAxIF1bIGl4IF07CiAgICAJCQl2YXIgZCA9IGdyaWRbIGl5ICsgMSBdWyBpeCArIDEgXTsKCiAgICAJCQlpZiAoIGl5ICE9PSAwIHx8IHRoZXRhU3RhcnQgPiAwICkgaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CiAgICAJCQlpZiAoIGl5ICE9PSBoZWlnaHRTZWdtZW50cyAtIDEgfHwgdGhldGFFbmQgPCBNYXRoLlBJICkgaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCiAgICB9CgogICAgU3BoZXJlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBTcGhlcmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGhlcmVCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgS2FsZWIgTXVycGh5CiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICovCgogICAgLy8gUmluZ0dlb21ldHJ5CgogICAgZnVuY3Rpb24gUmluZ0dlb21ldHJ5KCBpbm5lclJhZGl1cywgb3V0ZXJSYWRpdXMsIHRoZXRhU2VnbWVudHMsIHBoaVNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUmluZ0dlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlpbm5lclJhZGl1czogaW5uZXJSYWRpdXMsCiAgICAJCW91dGVyUmFkaXVzOiBvdXRlclJhZGl1cywKICAgIAkJdGhldGFTZWdtZW50czogdGhldGFTZWdtZW50cywKICAgIAkJcGhpU2VnbWVudHM6IHBoaVNlZ21lbnRzLAogICAgCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAogICAgCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKICAgIAl9OwoKICAgIAl0aGlzLmZyb21CdWZmZXJHZW9tZXRyeSggbmV3IFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBSaW5nR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBSaW5nR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmluZ0dlb21ldHJ5OwoKICAgIC8vIFJpbmdCdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIFJpbmdCdWZmZXJHZW9tZXRyeSggaW5uZXJSYWRpdXMsIG91dGVyUmFkaXVzLCB0aGV0YVNlZ21lbnRzLCBwaGlTZWdtZW50cywgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgogICAgCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1JpbmdCdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJaW5uZXJSYWRpdXM6IGlubmVyUmFkaXVzLAogICAgCQlvdXRlclJhZGl1czogb3V0ZXJSYWRpdXMsCiAgICAJCXRoZXRhU2VnbWVudHM6IHRoZXRhU2VnbWVudHMsCiAgICAJCXBoaVNlZ21lbnRzOiBwaGlTZWdtZW50cywKICAgIAkJdGhldGFTdGFydDogdGhldGFTdGFydCwKICAgIAkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCiAgICAJfTsKCiAgICAJaW5uZXJSYWRpdXMgPSBpbm5lclJhZGl1cyB8fCAwLjU7CiAgICAJb3V0ZXJSYWRpdXMgPSBvdXRlclJhZGl1cyB8fCAxOwoKICAgIAl0aGV0YVN0YXJ0ID0gdGhldGFTdGFydCAhPT0gdW5kZWZpbmVkID8gdGhldGFTdGFydCA6IDA7CiAgICAJdGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjsKCiAgICAJdGhldGFTZWdtZW50cyA9IHRoZXRhU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCB0aGV0YVNlZ21lbnRzICkgOiA4OwogICAgCXBoaVNlZ21lbnRzID0gcGhpU2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAxLCBwaGlTZWdtZW50cyApIDogMTsKCiAgICAJLy8gYnVmZmVycwoKICAgIAl2YXIgaW5kaWNlcyA9IFtdOwogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwogICAgCXZhciBub3JtYWxzID0gW107CiAgICAJdmFyIHV2cyA9IFtdOwoKICAgIAkvLyBzb21lIGhlbHBlciB2YXJpYWJsZXMKCiAgICAJdmFyIHNlZ21lbnQ7CiAgICAJdmFyIHJhZGl1cyA9IGlubmVyUmFkaXVzOwogICAgCXZhciByYWRpdXNTdGVwID0gKCAoIG91dGVyUmFkaXVzIC0gaW5uZXJSYWRpdXMgKSAvIHBoaVNlZ21lbnRzICk7CiAgICAJdmFyIHZlcnRleCA9IG5ldyBWZWN0b3IzKCk7CiAgICAJdmFyIHV2ID0gbmV3IFZlY3RvcjIoKTsKICAgIAl2YXIgaiwgaTsKCiAgICAJLy8gZ2VuZXJhdGUgdmVydGljZXMsIG5vcm1hbHMgYW5kIHV2cwoKICAgIAlmb3IgKCBqID0gMDsgaiA8PSBwaGlTZWdtZW50czsgaiArKyApIHsKCiAgICAJCWZvciAoIGkgPSAwOyBpIDw9IHRoZXRhU2VnbWVudHM7IGkgKysgKSB7CgogICAgCQkJLy8gdmFsdWVzIGFyZSBnZW5lcmF0ZSBmcm9tIHRoZSBpbnNpZGUgb2YgdGhlIHJpbmcgdG8gdGhlIG91dHNpZGUKCiAgICAJCQlzZWdtZW50ID0gdGhldGFTdGFydCArIGkgLyB0aGV0YVNlZ21lbnRzICogdGhldGFMZW5ndGg7CgogICAgCQkJLy8gdmVydGV4CgogICAgCQkJdmVydGV4LnggPSByYWRpdXMgKiBNYXRoLmNvcyggc2VnbWVudCApOwogICAgCQkJdmVydGV4LnkgPSByYWRpdXMgKiBNYXRoLnNpbiggc2VnbWVudCApOwoKICAgIAkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJCQkvLyBub3JtYWwKCiAgICAJCQlub3JtYWxzLnB1c2goIDAsIDAsIDEgKTsKCiAgICAJCQkvLyB1dgoKICAgIAkJCXV2LnggPSAoIHZlcnRleC54IC8gb3V0ZXJSYWRpdXMgKyAxICkgLyAyOwogICAgCQkJdXYueSA9ICggdmVydGV4LnkgLyBvdXRlclJhZGl1cyArIDEgKSAvIDI7CgogICAgCQkJdXZzLnB1c2goIHV2LngsIHV2LnkgKTsKCiAgICAJCX0KCiAgICAJCS8vIGluY3JlYXNlIHRoZSByYWRpdXMgZm9yIG5leHQgcm93IG9mIHZlcnRpY2VzCgogICAgCQlyYWRpdXMgKz0gcmFkaXVzU3RlcDsKCiAgICAJfQoKICAgIAkvLyBpbmRpY2VzCgogICAgCWZvciAoIGogPSAwOyBqIDwgcGhpU2VnbWVudHM7IGogKysgKSB7CgogICAgCQl2YXIgdGhldGFTZWdtZW50TGV2ZWwgPSBqICogKCB0aGV0YVNlZ21lbnRzICsgMSApOwoKICAgIAkJZm9yICggaSA9IDA7IGkgPCB0aGV0YVNlZ21lbnRzOyBpICsrICkgewoKICAgIAkJCXNlZ21lbnQgPSBpICsgdGhldGFTZWdtZW50TGV2ZWw7CgogICAgCQkJdmFyIGEgPSBzZWdtZW50OwogICAgCQkJdmFyIGIgPSBzZWdtZW50ICsgdGhldGFTZWdtZW50cyArIDE7CiAgICAJCQl2YXIgYyA9IHNlZ21lbnQgKyB0aGV0YVNlZ21lbnRzICsgMjsKICAgIAkJCXZhciBkID0gc2VnbWVudCArIDE7CgogICAgCQkJLy8gZmFjZXMKCiAgICAJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKICAgIAkJCWluZGljZXMucHVzaCggYiwgYywgZCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vIGJ1aWxkIGdlb21ldHJ5CgogICAgCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgogICAgfQoKICAgIFJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIFJpbmdCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBSaW5nQnVmZmVyR2VvbWV0cnk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwczovL2dpdGh1Yi5jb20veno4NQogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIC8vIExhdGhlR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBMYXRoZUdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgewoKICAgIAlHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdMYXRoZUdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlwb2ludHM6IHBvaW50cywKICAgIAkJc2VnbWVudHM6IHNlZ21lbnRzLAogICAgCQlwaGlTdGFydDogcGhpU3RhcnQsCiAgICAJCXBoaUxlbmd0aDogcGhpTGVuZ3RoCiAgICAJfTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBMYXRoZUJ1ZmZlckdlb21ldHJ5KCBwb2ludHMsIHNlZ21lbnRzLCBwaGlTdGFydCwgcGhpTGVuZ3RoICkgKTsKICAgIAl0aGlzLm1lcmdlVmVydGljZXMoKTsKCiAgICB9CgogICAgTGF0aGVHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIExhdGhlR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVHZW9tZXRyeTsKCiAgICAvLyBMYXRoZUJ1ZmZlckdlb21ldHJ5CgogICAgZnVuY3Rpb24gTGF0aGVCdWZmZXJHZW9tZXRyeSggcG9pbnRzLCBzZWdtZW50cywgcGhpU3RhcnQsIHBoaUxlbmd0aCApIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnTGF0aGVCdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJcG9pbnRzOiBwb2ludHMsCiAgICAJCXNlZ21lbnRzOiBzZWdtZW50cywKICAgIAkJcGhpU3RhcnQ6IHBoaVN0YXJ0LAogICAgCQlwaGlMZW5ndGg6IHBoaUxlbmd0aAogICAgCX07CgogICAgCXNlZ21lbnRzID0gTWF0aC5mbG9vciggc2VnbWVudHMgKSB8fCAxMjsKICAgIAlwaGlTdGFydCA9IHBoaVN0YXJ0IHx8IDA7CiAgICAJcGhpTGVuZ3RoID0gcGhpTGVuZ3RoIHx8IE1hdGguUEkgKiAyOwoKICAgIAkvLyBjbGFtcCBwaGlMZW5ndGggc28gaXQncyBpbiByYW5nZSBvZiBbIDAsIDJQSSBdCgogICAgCXBoaUxlbmd0aCA9IF9NYXRoLmNsYW1wKCBwaGlMZW5ndGgsIDAsIE1hdGguUEkgKiAyICk7CgoKICAgIAkvLyBidWZmZXJzCgogICAgCXZhciBpbmRpY2VzID0gW107CiAgICAJdmFyIHZlcnRpY2VzID0gW107CiAgICAJdmFyIHV2cyA9IFtdOwoKICAgIAkvLyBoZWxwZXIgdmFyaWFibGVzCgogICAgCXZhciBiYXNlOwogICAgCXZhciBpbnZlcnNlU2VnbWVudHMgPSAxLjAgLyBzZWdtZW50czsKICAgIAl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOwogICAgCXZhciBpLCBqOwoKICAgIAkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcyBhbmQgdXZzCgogICAgCWZvciAoIGkgPSAwOyBpIDw9IHNlZ21lbnRzOyBpICsrICkgewoKICAgIAkJdmFyIHBoaSA9IHBoaVN0YXJ0ICsgaSAqIGludmVyc2VTZWdtZW50cyAqIHBoaUxlbmd0aDsKCiAgICAJCXZhciBzaW4gPSBNYXRoLnNpbiggcGhpICk7CiAgICAJCXZhciBjb3MgPSBNYXRoLmNvcyggcGhpICk7CgogICAgCQlmb3IgKCBqID0gMDsgaiA8PSAoIHBvaW50cy5sZW5ndGggLSAxICk7IGogKysgKSB7CgogICAgCQkJLy8gdmVydGV4CgogICAgCQkJdmVydGV4LnggPSBwb2ludHNbIGogXS54ICogc2luOwogICAgCQkJdmVydGV4LnkgPSBwb2ludHNbIGogXS55OwogICAgCQkJdmVydGV4LnogPSBwb2ludHNbIGogXS54ICogY29zOwoKICAgIAkJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJCQkvLyB1dgoKICAgIAkJCXV2LnggPSBpIC8gc2VnbWVudHM7CiAgICAJCQl1di55ID0gaiAvICggcG9pbnRzLmxlbmd0aCAtIDEgKTsKCiAgICAJCQl1dnMucHVzaCggdXYueCwgdXYueSApOwoKCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyBpbmRpY2VzCgogICAgCWZvciAoIGkgPSAwOyBpIDwgc2VnbWVudHM7IGkgKysgKSB7CgogICAgCQlmb3IgKCBqID0gMDsgaiA8ICggcG9pbnRzLmxlbmd0aCAtIDEgKTsgaiArKyApIHsKCiAgICAJCQliYXNlID0gaiArIGkgKiBwb2ludHMubGVuZ3RoOwoKICAgIAkJCXZhciBhID0gYmFzZTsKICAgIAkJCXZhciBiID0gYmFzZSArIHBvaW50cy5sZW5ndGg7CiAgICAJCQl2YXIgYyA9IGJhc2UgKyBwb2ludHMubGVuZ3RoICsgMTsKICAgIAkJCXZhciBkID0gYmFzZSArIDE7CgogICAgCQkJLy8gZmFjZXMKCiAgICAJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGQgKTsKICAgIAkJCWluZGljZXMucHVzaCggYiwgYywgZCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vIGJ1aWxkIGdlb21ldHJ5CgogICAgCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgogICAgCS8vIGdlbmVyYXRlIG5vcm1hbHMKCiAgICAJdGhpcy5jb21wdXRlVmVydGV4Tm9ybWFscygpOwoKICAgIAkvLyBpZiB0aGUgZ2VvbWV0cnkgaXMgY2xvc2VkLCB3ZSBuZWVkIHRvIGF2ZXJhZ2UgdGhlIG5vcm1hbHMgYWxvbmcgdGhlIHNlYW0uCiAgICAJLy8gYmVjYXVzZSB0aGUgY29ycmVzcG9uZGluZyB2ZXJ0aWNlcyBhcmUgaWRlbnRpY2FsIChidXQgc3RpbGwgaGF2ZSBkaWZmZXJlbnQgVVZzKS4KCiAgICAJaWYgKCBwaGlMZW5ndGggPT09IE1hdGguUEkgKiAyICkgewoKICAgIAkJdmFyIG5vcm1hbHMgPSB0aGlzLmF0dHJpYnV0ZXMubm9ybWFsLmFycmF5OwogICAgCQl2YXIgbjEgPSBuZXcgVmVjdG9yMygpOwogICAgCQl2YXIgbjIgPSBuZXcgVmVjdG9yMygpOwogICAgCQl2YXIgbiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQkvLyB0aGlzIGlzIHRoZSBidWZmZXIgb2Zmc2V0IGZvciB0aGUgbGFzdCBsaW5lIG9mIHZlcnRpY2VzCgogICAgCQliYXNlID0gc2VnbWVudHMgKiBwb2ludHMubGVuZ3RoICogMzsKCiAgICAJCWZvciAoIGkgPSAwLCBqID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7IGkgKyssIGogKz0gMyApIHsKCiAgICAJCQkvLyBzZWxlY3QgdGhlIG5vcm1hbCBvZiB0aGUgdmVydGV4IGluIHRoZSBmaXJzdCBsaW5lCgogICAgCQkJbjEueCA9IG5vcm1hbHNbIGogKyAwIF07CiAgICAJCQluMS55ID0gbm9ybWFsc1sgaiArIDEgXTsKICAgIAkJCW4xLnogPSBub3JtYWxzWyBqICsgMiBdOwoKICAgIAkJCS8vIHNlbGVjdCB0aGUgbm9ybWFsIG9mIHRoZSB2ZXJ0ZXggaW4gdGhlIGxhc3QgbGluZQoKICAgIAkJCW4yLnggPSBub3JtYWxzWyBiYXNlICsgaiArIDAgXTsKICAgIAkJCW4yLnkgPSBub3JtYWxzWyBiYXNlICsgaiArIDEgXTsKICAgIAkJCW4yLnogPSBub3JtYWxzWyBiYXNlICsgaiArIDIgXTsKCiAgICAJCQkvLyBhdmVyYWdlIG5vcm1hbHMKCiAgICAJCQluLmFkZFZlY3RvcnMoIG4xLCBuMiApLm5vcm1hbGl6ZSgpOwoKICAgIAkJCS8vIGFzc2lnbiB0aGUgbmV3IHZhbHVlcyB0byBib3RoIG5vcm1hbHMKCiAgICAJCQlub3JtYWxzWyBqICsgMCBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAwIF0gPSBuLng7CiAgICAJCQlub3JtYWxzWyBqICsgMSBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAxIF0gPSBuLnk7CiAgICAJCQlub3JtYWxzWyBqICsgMiBdID0gbm9ybWFsc1sgYmFzZSArIGogKyAyIF0gPSBuLno7CgogICAgCQl9CgogICAgCX0KCiAgICB9CgogICAgTGF0aGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIExhdGhlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGF0aGVCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3Igam9ub2JyMSAvIGh0dHA6Ly9qb25vYnIxLmNvbQogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIC8vIFNoYXBlR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBTaGFwZUdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ1NoYXBlR2VvbWV0cnknOwoKICAgIAlpZiAoIHR5cGVvZiBjdXJ2ZVNlZ21lbnRzID09PSAnb2JqZWN0JyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlR2VvbWV0cnk6IE9wdGlvbnMgcGFyYW1ldGVyIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAkJY3VydmVTZWdtZW50cyA9IGN1cnZlU2VnbWVudHMuY3VydmVTZWdtZW50czsKCiAgICAJfQoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXNoYXBlczogc2hhcGVzLAogICAgCQljdXJ2ZVNlZ21lbnRzOiBjdXJ2ZVNlZ21lbnRzCiAgICAJfTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBTaGFwZUJ1ZmZlckdlb21ldHJ5KCBzaGFwZXMsIGN1cnZlU2VnbWVudHMgKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBTaGFwZUdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgU2hhcGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUdlb21ldHJ5OwoKICAgIFNoYXBlR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdmFyIGRhdGEgPSBHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJdmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7CgogICAgCXJldHVybiB0b0pTT04kMSggc2hhcGVzLCBkYXRhICk7CgogICAgfTsKCiAgICAvLyBTaGFwZUJ1ZmZlckdlb21ldHJ5CgogICAgZnVuY3Rpb24gU2hhcGVCdWZmZXJHZW9tZXRyeSggc2hhcGVzLCBjdXJ2ZVNlZ21lbnRzICkgewoKICAgIAlCdWZmZXJHZW9tZXRyeS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdTaGFwZUJ1ZmZlckdlb21ldHJ5JzsKCiAgICAJdGhpcy5wYXJhbWV0ZXJzID0gewogICAgCQlzaGFwZXM6IHNoYXBlcywKICAgIAkJY3VydmVTZWdtZW50czogY3VydmVTZWdtZW50cwogICAgCX07CgogICAgCWN1cnZlU2VnbWVudHMgPSBjdXJ2ZVNlZ21lbnRzIHx8IDEyOwoKICAgIAkvLyBidWZmZXJzCgogICAgCXZhciBpbmRpY2VzID0gW107CiAgICAJdmFyIHZlcnRpY2VzID0gW107CiAgICAJdmFyIG5vcm1hbHMgPSBbXTsKICAgIAl2YXIgdXZzID0gW107CgogICAgCS8vIGhlbHBlciB2YXJpYWJsZXMKCiAgICAJdmFyIGdyb3VwU3RhcnQgPSAwOwogICAgCXZhciBncm91cENvdW50ID0gMDsKCiAgICAJLy8gYWxsb3cgc2luZ2xlIGFuZCBhcnJheSB2YWx1ZXMgZm9yICJzaGFwZXMiIHBhcmFtZXRlcgoKICAgIAlpZiAoIEFycmF5LmlzQXJyYXkoIHNoYXBlcyApID09PSBmYWxzZSApIHsKCiAgICAJCWFkZFNoYXBlKCBzaGFwZXMgKTsKCiAgICAJfSBlbHNlIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHNoYXBlcy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJYWRkU2hhcGUoIHNoYXBlc1sgaSBdICk7CgogICAgCQkJdGhpcy5hZGRHcm91cCggZ3JvdXBTdGFydCwgZ3JvdXBDb3VudCwgaSApOyAvLyBlbmFibGVzIE11bHRpTWF0ZXJpYWwgc3VwcG9ydAoKICAgIAkJCWdyb3VwU3RhcnQgKz0gZ3JvdXBDb3VudDsKICAgIAkJCWdyb3VwQ291bnQgPSAwOwoKICAgIAkJfQoKICAgIAl9CgogICAgCS8vIGJ1aWxkIGdlb21ldHJ5CgogICAgCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgoKICAgIAkvLyBoZWxwZXIgZnVuY3Rpb25zCgogICAgCWZ1bmN0aW9uIGFkZFNoYXBlKCBzaGFwZSApIHsKCiAgICAJCXZhciBpLCBsLCBzaGFwZUhvbGU7CgogICAgCQl2YXIgaW5kZXhPZmZzZXQgPSB2ZXJ0aWNlcy5sZW5ndGggLyAzOwogICAgCQl2YXIgcG9pbnRzID0gc2hhcGUuZXh0cmFjdFBvaW50cyggY3VydmVTZWdtZW50cyApOwoKICAgIAkJdmFyIHNoYXBlVmVydGljZXMgPSBwb2ludHMuc2hhcGU7CiAgICAJCXZhciBzaGFwZUhvbGVzID0gcG9pbnRzLmhvbGVzOwoKICAgIAkJLy8gY2hlY2sgZGlyZWN0aW9uIG9mIHZlcnRpY2VzCgogICAgCQlpZiAoIFNoYXBlVXRpbHMuaXNDbG9ja1dpc2UoIHNoYXBlVmVydGljZXMgKSA9PT0gZmFsc2UgKSB7CgogICAgCQkJc2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMucmV2ZXJzZSgpOwoKICAgIAkJfQoKICAgIAkJZm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJc2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdOwoKICAgIAkJCWlmICggU2hhcGVVdGlscy5pc0Nsb2NrV2lzZSggc2hhcGVIb2xlICkgPT09IHRydWUgKSB7CgogICAgCQkJCXNoYXBlSG9sZXNbIGkgXSA9IHNoYXBlSG9sZS5yZXZlcnNlKCk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJdmFyIGZhY2VzID0gU2hhcGVVdGlscy50cmlhbmd1bGF0ZVNoYXBlKCBzaGFwZVZlcnRpY2VzLCBzaGFwZUhvbGVzICk7CgogICAgCQkvLyBqb2luIHZlcnRpY2VzIG9mIGlubmVyIGFuZCBvdXRlciBwYXRocyB0byBhIHNpbmdsZSBhcnJheQoKICAgIAkJZm9yICggaSA9IDAsIGwgPSBzaGFwZUhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJc2hhcGVIb2xlID0gc2hhcGVIb2xlc1sgaSBdOwogICAgCQkJc2hhcGVWZXJ0aWNlcyA9IHNoYXBlVmVydGljZXMuY29uY2F0KCBzaGFwZUhvbGUgKTsKCiAgICAJCX0KCiAgICAJCS8vIHZlcnRpY2VzLCBub3JtYWxzLCB1dnMKCiAgICAJCWZvciAoIGkgPSAwLCBsID0gc2hhcGVWZXJ0aWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciB2ZXJ0ZXggPSBzaGFwZVZlcnRpY2VzWyBpIF07CgogICAgCQkJdmVydGljZXMucHVzaCggdmVydGV4LngsIHZlcnRleC55LCAwICk7CiAgICAJCQlub3JtYWxzLnB1c2goIDAsIDAsIDEgKTsKICAgIAkJCXV2cy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnkgKTsgLy8gd29ybGQgdXZzCgogICAgCQl9CgogICAgCQkvLyBpbmNpZGVzCgogICAgCQlmb3IgKCBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGZhY2UgPSBmYWNlc1sgaSBdOwoKICAgIAkJCXZhciBhID0gZmFjZVsgMCBdICsgaW5kZXhPZmZzZXQ7CiAgICAJCQl2YXIgYiA9IGZhY2VbIDEgXSArIGluZGV4T2Zmc2V0OwogICAgCQkJdmFyIGMgPSBmYWNlWyAyIF0gKyBpbmRleE9mZnNldDsKCiAgICAJCQlpbmRpY2VzLnB1c2goIGEsIGIsIGMgKTsKICAgIAkJCWdyb3VwQ291bnQgKz0gMzsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0KCiAgICBTaGFwZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgU2hhcGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTaGFwZUJ1ZmZlckdlb21ldHJ5OwoKICAgIFNoYXBlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdmFyIGRhdGEgPSBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJdmFyIHNoYXBlcyA9IHRoaXMucGFyYW1ldGVycy5zaGFwZXM7CgogICAgCXJldHVybiB0b0pTT04kMSggc2hhcGVzLCBkYXRhICk7CgogICAgfTsKCiAgICAvLwoKICAgIGZ1bmN0aW9uIHRvSlNPTiQxKCBzaGFwZXMsIGRhdGEgKSB7CgogICAgCWRhdGEuc2hhcGVzID0gW107CgogICAgCWlmICggQXJyYXkuaXNBcnJheSggc2hhcGVzICkgKSB7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzaGFwZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgc2hhcGUgPSBzaGFwZXNbIGkgXTsKCiAgICAJCQlkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZS51dWlkICk7CgogICAgCQl9CgogICAgCX0gZWxzZSB7CgogICAgCQlkYXRhLnNoYXBlcy5wdXNoKCBzaGFwZXMudXVpZCApOwoKICAgIAl9CgogICAgCXJldHVybiBkYXRhOwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIGZ1bmN0aW9uIEVkZ2VzR2VvbWV0cnkoIGdlb21ldHJ5LCB0aHJlc2hvbGRBbmdsZSApIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnRWRnZXNHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJdGhyZXNob2xkQW5nbGU6IHRocmVzaG9sZEFuZ2xlCiAgICAJfTsKCiAgICAJdGhyZXNob2xkQW5nbGUgPSAoIHRocmVzaG9sZEFuZ2xlICE9PSB1bmRlZmluZWQgKSA/IHRocmVzaG9sZEFuZ2xlIDogMTsKCiAgICAJLy8gYnVmZmVyCgogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwoKICAgIAkvLyBoZWxwZXIgdmFyaWFibGVzCgogICAgCXZhciB0aHJlc2hvbGREb3QgPSBNYXRoLmNvcyggX01hdGguREVHMlJBRCAqIHRocmVzaG9sZEFuZ2xlICk7CiAgICAJdmFyIGVkZ2UgPSBbIDAsIDAgXSwgZWRnZXMgPSB7fSwgZWRnZTEsIGVkZ2UyOwogICAgCXZhciBrZXksIGtleXMgPSBbICdhJywgJ2InLCAnYycgXTsKCiAgICAJLy8gcHJlcGFyZSBzb3VyY2UgZ2VvbWV0cnkKCiAgICAJdmFyIGdlb21ldHJ5MjsKCiAgICAJaWYgKCBnZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgewoKICAgIAkJZ2VvbWV0cnkyID0gbmV3IEdlb21ldHJ5KCk7CiAgICAJCWdlb21ldHJ5Mi5mcm9tQnVmZmVyR2VvbWV0cnkoIGdlb21ldHJ5ICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlnZW9tZXRyeTIgPSBnZW9tZXRyeS5jbG9uZSgpOwoKICAgIAl9CgogICAgCWdlb21ldHJ5Mi5tZXJnZVZlcnRpY2VzKCk7CiAgICAJZ2VvbWV0cnkyLmNvbXB1dGVGYWNlTm9ybWFscygpOwoKICAgIAl2YXIgc291cmNlVmVydGljZXMgPSBnZW9tZXRyeTIudmVydGljZXM7CiAgICAJdmFyIGZhY2VzID0gZ2VvbWV0cnkyLmZhY2VzOwoKICAgIAkvLyBub3cgY3JlYXRlIGEgZGF0YSBzdHJ1Y3R1cmUgd2hlcmUgZWFjaCBlbnRyeSByZXByZXNlbnRzIGFuIGVkZ2Ugd2l0aCBpdHMgYWRqb2luaW5nIGZhY2VzCgogICAgCWZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgogICAgCQlmb3IgKCB2YXIgaiA9IDA7IGogPCAzOyBqICsrICkgewoKICAgIAkJCWVkZ2UxID0gZmFjZVsga2V5c1sgaiBdIF07CiAgICAJCQllZGdlMiA9IGZhY2VbIGtleXNbICggaiArIDEgKSAlIDMgXSBdOwogICAgCQkJZWRnZVsgMCBdID0gTWF0aC5taW4oIGVkZ2UxLCBlZGdlMiApOwogICAgCQkJZWRnZVsgMSBdID0gTWF0aC5tYXgoIGVkZ2UxLCBlZGdlMiApOwoKICAgIAkJCWtleSA9IGVkZ2VbIDAgXSArICcsJyArIGVkZ2VbIDEgXTsKCiAgICAJCQlpZiAoIGVkZ2VzWyBrZXkgXSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQllZGdlc1sga2V5IF0gPSB7IGluZGV4MTogZWRnZVsgMCBdLCBpbmRleDI6IGVkZ2VbIDEgXSwgZmFjZTE6IGksIGZhY2UyOiB1bmRlZmluZWQgfTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQllZGdlc1sga2V5IF0uZmFjZTIgPSBpOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfQoKICAgIAkvLyBnZW5lcmF0ZSB2ZXJ0aWNlcwoKICAgIAlmb3IgKCBrZXkgaW4gZWRnZXMgKSB7CgogICAgCQl2YXIgZSA9IGVkZ2VzWyBrZXkgXTsKCiAgICAJCS8vIGFuIGVkZ2UgaXMgb25seSByZW5kZXJlZCBpZiB0aGUgYW5nbGUgKGluIGRlZ3JlZXMpIGJldHdlZW4gdGhlIGZhY2Ugbm9ybWFscyBvZiB0aGUgYWRqb2luaW5nIGZhY2VzIGV4Y2VlZHMgdGhpcyB2YWx1ZS4gZGVmYXVsdCA9IDEgZGVncmVlLgoKICAgIAkJaWYgKCBlLmZhY2UyID09PSB1bmRlZmluZWQgfHwgZmFjZXNbIGUuZmFjZTEgXS5ub3JtYWwuZG90KCBmYWNlc1sgZS5mYWNlMiBdLm5vcm1hbCApIDw9IHRocmVzaG9sZERvdCApIHsKCiAgICAJCQl2YXIgdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgxIF07CiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJdmVydGV4ID0gc291cmNlVmVydGljZXNbIGUuaW5kZXgyIF07CiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CgogICAgfQoKICAgIEVkZ2VzR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBFZGdlc0dlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEVkZ2VzR2VvbWV0cnk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIC8vIEN5bGluZGVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBDeWxpbmRlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgogICAgCUdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0N5bGluZGVyR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1c1RvcDogcmFkaXVzVG9wLAogICAgCQlyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSwKICAgIAkJaGVpZ2h0OiBoZWlnaHQsCiAgICAJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKICAgIAkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAogICAgCQlvcGVuRW5kZWQ6IG9wZW5FbmRlZCwKICAgIAkJdGhldGFTdGFydDogdGhldGFTdGFydCwKICAgIAkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCiAgICAJfTsKCiAgICAJdGhpcy5mcm9tQnVmZmVyR2VvbWV0cnkoIG5ldyBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSApOwogICAgCXRoaXMubWVyZ2VWZXJ0aWNlcygpOwoKICAgIH0KCiAgICBDeWxpbmRlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDeWxpbmRlckdlb21ldHJ5OwoKICAgIC8vIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkKCiAgICBmdW5jdGlvbiBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5KCByYWRpdXNUb3AsIHJhZGl1c0JvdHRvbSwgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKSB7CgogICAgCUJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1c1RvcDogcmFkaXVzVG9wLAogICAgCQlyYWRpdXNCb3R0b206IHJhZGl1c0JvdHRvbSwKICAgIAkJaGVpZ2h0OiBoZWlnaHQsCiAgICAJCXJhZGlhbFNlZ21lbnRzOiByYWRpYWxTZWdtZW50cywKICAgIAkJaGVpZ2h0U2VnbWVudHM6IGhlaWdodFNlZ21lbnRzLAogICAgCQlvcGVuRW5kZWQ6IG9wZW5FbmRlZCwKICAgIAkJdGhldGFTdGFydDogdGhldGFTdGFydCwKICAgIAkJdGhldGFMZW5ndGg6IHRoZXRhTGVuZ3RoCiAgICAJfTsKCiAgICAJdmFyIHNjb3BlID0gdGhpczsKCiAgICAJcmFkaXVzVG9wID0gcmFkaXVzVG9wICE9PSB1bmRlZmluZWQgPyByYWRpdXNUb3AgOiAxOwogICAgCXJhZGl1c0JvdHRvbSA9IHJhZGl1c0JvdHRvbSAhPT0gdW5kZWZpbmVkID8gcmFkaXVzQm90dG9tIDogMTsKICAgIAloZWlnaHQgPSBoZWlnaHQgfHwgMTsKCiAgICAJcmFkaWFsU2VnbWVudHMgPSBNYXRoLmZsb29yKCByYWRpYWxTZWdtZW50cyApIHx8IDg7CiAgICAJaGVpZ2h0U2VnbWVudHMgPSBNYXRoLmZsb29yKCBoZWlnaHRTZWdtZW50cyApIHx8IDE7CgogICAgCW9wZW5FbmRlZCA9IG9wZW5FbmRlZCAhPT0gdW5kZWZpbmVkID8gb3BlbkVuZGVkIDogZmFsc2U7CiAgICAJdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwLjA7CiAgICAJdGhldGFMZW5ndGggPSB0aGV0YUxlbmd0aCAhPT0gdW5kZWZpbmVkID8gdGhldGFMZW5ndGggOiBNYXRoLlBJICogMjsKCiAgICAJLy8gYnVmZmVycwoKICAgIAl2YXIgaW5kaWNlcyA9IFtdOwogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwogICAgCXZhciBub3JtYWxzID0gW107CiAgICAJdmFyIHV2cyA9IFtdOwoKICAgIAkvLyBoZWxwZXIgdmFyaWFibGVzCgogICAgCXZhciBpbmRleCA9IDA7CiAgICAJdmFyIGluZGV4QXJyYXkgPSBbXTsKICAgIAl2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7CiAgICAJdmFyIGdyb3VwU3RhcnQgPSAwOwoKICAgIAkvLyBnZW5lcmF0ZSBnZW9tZXRyeQoKICAgIAlnZW5lcmF0ZVRvcnNvKCk7CgogICAgCWlmICggb3BlbkVuZGVkID09PSBmYWxzZSApIHsKCiAgICAJCWlmICggcmFkaXVzVG9wID4gMCApIGdlbmVyYXRlQ2FwKCB0cnVlICk7CiAgICAJCWlmICggcmFkaXVzQm90dG9tID4gMCApIGdlbmVyYXRlQ2FwKCBmYWxzZSApOwoKICAgIAl9CgogICAgCS8vIGJ1aWxkIGdlb21ldHJ5CgogICAgCXRoaXMuc2V0SW5kZXgoIGluZGljZXMgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ25vcm1hbCcsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBub3JtYWxzLCAzICkgKTsKICAgIAl0aGlzLmFkZEF0dHJpYnV0ZSggJ3V2JywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHV2cywgMiApICk7CgogICAgCWZ1bmN0aW9uIGdlbmVyYXRlVG9yc28oKSB7CgogICAgCQl2YXIgeCwgeTsKICAgIAkJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CiAgICAJCXZhciB2ZXJ0ZXggPSBuZXcgVmVjdG9yMygpOwoKICAgIAkJdmFyIGdyb3VwQ291bnQgPSAwOwoKICAgIAkJLy8gdGhpcyB3aWxsIGJlIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBub3JtYWwKICAgIAkJdmFyIHNsb3BlID0gKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSAvIGhlaWdodDsKCiAgICAJCS8vIGdlbmVyYXRlIHZlcnRpY2VzLCBub3JtYWxzIGFuZCB1dnMKCiAgICAJCWZvciAoIHkgPSAwOyB5IDw9IGhlaWdodFNlZ21lbnRzOyB5ICsrICkgewoKICAgIAkJCXZhciBpbmRleFJvdyA9IFtdOwoKICAgIAkJCXZhciB2ID0geSAvIGhlaWdodFNlZ21lbnRzOwoKICAgIAkJCS8vIGNhbGN1bGF0ZSB0aGUgcmFkaXVzIG9mIHRoZSBjdXJyZW50IHJvdwoKICAgIAkJCXZhciByYWRpdXMgPSB2ICogKCByYWRpdXNCb3R0b20gLSByYWRpdXNUb3AgKSArIHJhZGl1c1RvcDsKCiAgICAJCQlmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHsKCiAgICAJCQkJdmFyIHUgPSB4IC8gcmFkaWFsU2VnbWVudHM7CgogICAgCQkJCXZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7CgogICAgCQkJCXZhciBzaW5UaGV0YSA9IE1hdGguc2luKCB0aGV0YSApOwogICAgCQkJCXZhciBjb3NUaGV0YSA9IE1hdGguY29zKCB0aGV0YSApOwoKICAgIAkJCQkvLyB2ZXJ0ZXgKCiAgICAJCQkJdmVydGV4LnggPSByYWRpdXMgKiBzaW5UaGV0YTsKICAgIAkJCQl2ZXJ0ZXgueSA9IC0gdiAqIGhlaWdodCArIGhhbGZIZWlnaHQ7CiAgICAJCQkJdmVydGV4LnogPSByYWRpdXMgKiBjb3NUaGV0YTsKICAgIAkJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJCS8vIG5vcm1hbAoKICAgIAkJCQlub3JtYWwuc2V0KCBzaW5UaGV0YSwgc2xvcGUsIGNvc1RoZXRhICkubm9ybWFsaXplKCk7CiAgICAJCQkJbm9ybWFscy5wdXNoKCBub3JtYWwueCwgbm9ybWFsLnksIG5vcm1hbC56ICk7CgogICAgCQkJCS8vIHV2CgogICAgCQkJCXV2cy5wdXNoKCB1LCAxIC0gdiApOwoKICAgIAkJCQkvLyBzYXZlIGluZGV4IG9mIHZlcnRleCBpbiByZXNwZWN0aXZlIHJvdwoKICAgIAkJCQlpbmRleFJvdy5wdXNoKCBpbmRleCArKyApOwoKICAgIAkJCX0KCiAgICAJCQkvLyBub3cgc2F2ZSB2ZXJ0aWNlcyBvZiB0aGUgcm93IGluIG91ciBpbmRleCBhcnJheQoKICAgIAkJCWluZGV4QXJyYXkucHVzaCggaW5kZXhSb3cgKTsKCiAgICAJCX0KCiAgICAJCS8vIGdlbmVyYXRlIGluZGljZXMKCiAgICAJCWZvciAoIHggPSAwOyB4IDwgcmFkaWFsU2VnbWVudHM7IHggKysgKSB7CgogICAgCQkJZm9yICggeSA9IDA7IHkgPCBoZWlnaHRTZWdtZW50czsgeSArKyApIHsKCiAgICAJCQkJLy8gd2UgdXNlIHRoZSBpbmRleCBhcnJheSB0byBhY2Nlc3MgdGhlIGNvcnJlY3QgaW5kaWNlcwoKICAgIAkJCQl2YXIgYSA9IGluZGV4QXJyYXlbIHkgXVsgeCBdOwogICAgCQkJCXZhciBiID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCBdOwogICAgCQkJCXZhciBjID0gaW5kZXhBcnJheVsgeSArIDEgXVsgeCArIDEgXTsKICAgIAkJCQl2YXIgZCA9IGluZGV4QXJyYXlbIHkgXVsgeCArIDEgXTsKCiAgICAJCQkJLy8gZmFjZXMKCiAgICAJCQkJaW5kaWNlcy5wdXNoKCBhLCBiLCBkICk7CiAgICAJCQkJaW5kaWNlcy5wdXNoKCBiLCBjLCBkICk7CgogICAgCQkJCS8vIHVwZGF0ZSBncm91cCBjb3VudGVyCgogICAgCQkJCWdyb3VwQ291bnQgKz0gNjsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBhZGQgYSBncm91cCB0byB0aGUgZ2VvbWV0cnkuIHRoaXMgd2lsbCBlbnN1cmUgbXVsdGkgbWF0ZXJpYWwgc3VwcG9ydAoKICAgIAkJc2NvcGUuYWRkR3JvdXAoIGdyb3VwU3RhcnQsIGdyb3VwQ291bnQsIDAgKTsKCiAgICAJCS8vIGNhbGN1bGF0ZSBuZXcgc3RhcnQgdmFsdWUgZm9yIGdyb3VwcwoKICAgIAkJZ3JvdXBTdGFydCArPSBncm91cENvdW50OwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdlbmVyYXRlQ2FwKCB0b3AgKSB7CgogICAgCQl2YXIgeCwgY2VudGVySW5kZXhTdGFydCwgY2VudGVySW5kZXhFbmQ7CgogICAgCQl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOwogICAgCQl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCXZhciBncm91cENvdW50ID0gMDsKCiAgICAJCXZhciByYWRpdXMgPSAoIHRvcCA9PT0gdHJ1ZSApID8gcmFkaXVzVG9wIDogcmFkaXVzQm90dG9tOwogICAgCQl2YXIgc2lnbiA9ICggdG9wID09PSB0cnVlICkgPyAxIDogLSAxOwoKICAgIAkJLy8gc2F2ZSB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IGNlbnRlciB2ZXJ0ZXgKICAgIAkJY2VudGVySW5kZXhTdGFydCA9IGluZGV4OwoKICAgIAkJLy8gZmlyc3Qgd2UgZ2VuZXJhdGUgdGhlIGNlbnRlciB2ZXJ0ZXggZGF0YSBvZiB0aGUgY2FwLgogICAgCQkvLyBiZWNhdXNlIHRoZSBnZW9tZXRyeSBuZWVkcyBvbmUgc2V0IG9mIHV2cyBwZXIgZmFjZSwKICAgIAkJLy8gd2UgbXVzdCBnZW5lcmF0ZSBhIGNlbnRlciB2ZXJ0ZXggcGVyIGZhY2Uvc2VnbWVudAoKICAgIAkJZm9yICggeCA9IDE7IHggPD0gcmFkaWFsU2VnbWVudHM7IHggKysgKSB7CgogICAgCQkJLy8gdmVydGV4CgogICAgCQkJdmVydGljZXMucHVzaCggMCwgaGFsZkhlaWdodCAqIHNpZ24sIDAgKTsKCiAgICAJCQkvLyBub3JtYWwKCiAgICAJCQlub3JtYWxzLnB1c2goIDAsIHNpZ24sIDAgKTsKCiAgICAJCQkvLyB1dgoKICAgIAkJCXV2cy5wdXNoKCAwLjUsIDAuNSApOwoKICAgIAkJCS8vIGluY3JlYXNlIGluZGV4CgogICAgCQkJaW5kZXggKys7CgogICAgCQl9CgogICAgCQkvLyBzYXZlIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBjZW50ZXIgdmVydGV4CgogICAgCQljZW50ZXJJbmRleEVuZCA9IGluZGV4OwoKICAgIAkJLy8gbm93IHdlIGdlbmVyYXRlIHRoZSBzdXJyb3VuZGluZyB2ZXJ0aWNlcywgbm9ybWFscyBhbmQgdXZzCgogICAgCQlmb3IgKCB4ID0gMDsgeCA8PSByYWRpYWxTZWdtZW50czsgeCArKyApIHsKCiAgICAJCQl2YXIgdSA9IHggLyByYWRpYWxTZWdtZW50czsKICAgIAkJCXZhciB0aGV0YSA9IHUgKiB0aGV0YUxlbmd0aCArIHRoZXRhU3RhcnQ7CgogICAgCQkJdmFyIGNvc1RoZXRhID0gTWF0aC5jb3MoIHRoZXRhICk7CiAgICAJCQl2YXIgc2luVGhldGEgPSBNYXRoLnNpbiggdGhldGEgKTsKCiAgICAJCQkvLyB2ZXJ0ZXgKCiAgICAJCQl2ZXJ0ZXgueCA9IHJhZGl1cyAqIHNpblRoZXRhOwogICAgCQkJdmVydGV4LnkgPSBoYWxmSGVpZ2h0ICogc2lnbjsKICAgIAkJCXZlcnRleC56ID0gcmFkaXVzICogY29zVGhldGE7CiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB2ZXJ0ZXgueCwgdmVydGV4LnksIHZlcnRleC56ICk7CgogICAgCQkJLy8gbm9ybWFsCgogICAgCQkJbm9ybWFscy5wdXNoKCAwLCBzaWduLCAwICk7CgogICAgCQkJLy8gdXYKCiAgICAJCQl1di54ID0gKCBjb3NUaGV0YSAqIDAuNSApICsgMC41OwogICAgCQkJdXYueSA9ICggc2luVGhldGEgKiAwLjUgKiBzaWduICkgKyAwLjU7CiAgICAJCQl1dnMucHVzaCggdXYueCwgdXYueSApOwoKICAgIAkJCS8vIGluY3JlYXNlIGluZGV4CgogICAgCQkJaW5kZXggKys7CgogICAgCQl9CgogICAgCQkvLyBnZW5lcmF0ZSBpbmRpY2VzCgogICAgCQlmb3IgKCB4ID0gMDsgeCA8IHJhZGlhbFNlZ21lbnRzOyB4ICsrICkgewoKICAgIAkJCXZhciBjID0gY2VudGVySW5kZXhTdGFydCArIHg7CiAgICAJCQl2YXIgaSA9IGNlbnRlckluZGV4RW5kICsgeDsKCiAgICAJCQlpZiAoIHRvcCA9PT0gdHJ1ZSApIHsKCiAgICAJCQkJLy8gZmFjZSB0b3AKCiAgICAJCQkJaW5kaWNlcy5wdXNoKCBpLCBpICsgMSwgYyApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCS8vIGZhY2UgYm90dG9tCgogICAgCQkJCWluZGljZXMucHVzaCggaSArIDEsIGksIGMgKTsKCiAgICAJCQl9CgogICAgCQkJZ3JvdXBDb3VudCArPSAzOwoKICAgIAkJfQoKICAgIAkJLy8gYWRkIGEgZ3JvdXAgdG8gdGhlIGdlb21ldHJ5LiB0aGlzIHdpbGwgZW5zdXJlIG11bHRpIG1hdGVyaWFsIHN1cHBvcnQKCiAgICAJCXNjb3BlLmFkZEdyb3VwKCBncm91cFN0YXJ0LCBncm91cENvdW50LCB0b3AgPT09IHRydWUgPyAxIDogMiApOwoKICAgIAkJLy8gY2FsY3VsYXRlIG5ldyBzdGFydCB2YWx1ZSBmb3IgZ3JvdXBzCgogICAgCQlncm91cFN0YXJ0ICs9IGdyb3VwQ291bnQ7CgogICAgCX0KCiAgICB9CgogICAgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIEN5bGluZGVyQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb24KICAgICAqLwoKICAgIC8vIENvbmVHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIENvbmVHZW9tZXRyeSggcmFkaXVzLCBoZWlnaHQsIHJhZGlhbFNlZ21lbnRzLCBoZWlnaHRTZWdtZW50cywgb3BlbkVuZGVkLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCiAgICAJQ3lsaW5kZXJHZW9tZXRyeS5jYWxsKCB0aGlzLCAwLCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICk7CgogICAgCXRoaXMudHlwZSA9ICdDb25lR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQloZWlnaHQ6IGhlaWdodCwKICAgIAkJcmFkaWFsU2VnbWVudHM6IHJhZGlhbFNlZ21lbnRzLAogICAgCQloZWlnaHRTZWdtZW50czogaGVpZ2h0U2VnbWVudHMsCiAgICAJCW9wZW5FbmRlZDogb3BlbkVuZGVkLAogICAgCQl0aGV0YVN0YXJ0OiB0aGV0YVN0YXJ0LAogICAgCQl0aGV0YUxlbmd0aDogdGhldGFMZW5ndGgKICAgIAl9OwoKICAgIH0KCiAgICBDb25lR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3lsaW5kZXJHZW9tZXRyeS5wcm90b3R5cGUgKTsKICAgIENvbmVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDb25lR2VvbWV0cnk7CgogICAgLy8gQ29uZUJ1ZmZlckdlb21ldHJ5CgogICAgZnVuY3Rpb24gQ29uZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIGhlaWdodCwgcmFkaWFsU2VnbWVudHMsIGhlaWdodFNlZ21lbnRzLCBvcGVuRW5kZWQsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgewoKICAgIAlDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LmNhbGwoIHRoaXMsIDAsIHJhZGl1cywgaGVpZ2h0LCByYWRpYWxTZWdtZW50cywgaGVpZ2h0U2VnbWVudHMsIG9wZW5FbmRlZCwgdGhldGFTdGFydCwgdGhldGFMZW5ndGggKTsKCiAgICAJdGhpcy50eXBlID0gJ0NvbmVCdWZmZXJHZW9tZXRyeSc7CgogICAgCXRoaXMucGFyYW1ldGVycyA9IHsKICAgIAkJcmFkaXVzOiByYWRpdXMsCiAgICAJCWhlaWdodDogaGVpZ2h0LAogICAgCQlyYWRpYWxTZWdtZW50czogcmFkaWFsU2VnbWVudHMsCiAgICAJCWhlaWdodFNlZ21lbnRzOiBoZWlnaHRTZWdtZW50cywKICAgIAkJb3BlbkVuZGVkOiBvcGVuRW5kZWQsCiAgICAJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCiAgICAJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAogICAgCX07CgogICAgfQoKICAgIENvbmVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDeWxpbmRlckJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApOwogICAgQ29uZUJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENvbmVCdWZmZXJHZW9tZXRyeTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqIEBhdXRob3IgaHVnaGVzCiAgICAgKi8KCiAgICAvLyBDaXJjbGVHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIENpcmNsZUdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCiAgICAJR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnQ2lyY2xlR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQlzZWdtZW50czogc2VnbWVudHMsCiAgICAJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCiAgICAJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAogICAgCX07CgogICAgCXRoaXMuZnJvbUJ1ZmZlckdlb21ldHJ5KCBuZXcgQ2lyY2xlQnVmZmVyR2VvbWV0cnkoIHJhZGl1cywgc2VnbWVudHMsIHRoZXRhU3RhcnQsIHRoZXRhTGVuZ3RoICkgKTsKICAgIAl0aGlzLm1lcmdlVmVydGljZXMoKTsKCiAgICB9CgogICAgQ2lyY2xlR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBDaXJjbGVHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVHZW9tZXRyeTsKCiAgICAvLyBDaXJjbGVCdWZmZXJHZW9tZXRyeQoKICAgIGZ1bmN0aW9uIENpcmNsZUJ1ZmZlckdlb21ldHJ5KCByYWRpdXMsIHNlZ21lbnRzLCB0aGV0YVN0YXJ0LCB0aGV0YUxlbmd0aCApIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnQ2lyY2xlQnVmZmVyR2VvbWV0cnknOwoKICAgIAl0aGlzLnBhcmFtZXRlcnMgPSB7CiAgICAJCXJhZGl1czogcmFkaXVzLAogICAgCQlzZWdtZW50czogc2VnbWVudHMsCiAgICAJCXRoZXRhU3RhcnQ6IHRoZXRhU3RhcnQsCiAgICAJCXRoZXRhTGVuZ3RoOiB0aGV0YUxlbmd0aAogICAgCX07CgogICAgCXJhZGl1cyA9IHJhZGl1cyB8fCAxOwogICAgCXNlZ21lbnRzID0gc2VnbWVudHMgIT09IHVuZGVmaW5lZCA/IE1hdGgubWF4KCAzLCBzZWdtZW50cyApIDogODsKCiAgICAJdGhldGFTdGFydCA9IHRoZXRhU3RhcnQgIT09IHVuZGVmaW5lZCA/IHRoZXRhU3RhcnQgOiAwOwogICAgCXRoZXRhTGVuZ3RoID0gdGhldGFMZW5ndGggIT09IHVuZGVmaW5lZCA/IHRoZXRhTGVuZ3RoIDogTWF0aC5QSSAqIDI7CgogICAgCS8vIGJ1ZmZlcnMKCiAgICAJdmFyIGluZGljZXMgPSBbXTsKICAgIAl2YXIgdmVydGljZXMgPSBbXTsKICAgIAl2YXIgbm9ybWFscyA9IFtdOwogICAgCXZhciB1dnMgPSBbXTsKCiAgICAJLy8gaGVscGVyIHZhcmlhYmxlcwoKICAgIAl2YXIgaSwgczsKICAgIAl2YXIgdmVydGV4ID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgdXYgPSBuZXcgVmVjdG9yMigpOwoKICAgIAkvLyBjZW50ZXIgcG9pbnQKCiAgICAJdmVydGljZXMucHVzaCggMCwgMCwgMCApOwogICAgCW5vcm1hbHMucHVzaCggMCwgMCwgMSApOwogICAgCXV2cy5wdXNoKCAwLjUsIDAuNSApOwoKICAgIAlmb3IgKCBzID0gMCwgaSA9IDM7IHMgPD0gc2VnbWVudHM7IHMgKyssIGkgKz0gMyApIHsKCiAgICAJCXZhciBzZWdtZW50ID0gdGhldGFTdGFydCArIHMgLyBzZWdtZW50cyAqIHRoZXRhTGVuZ3RoOwoKICAgIAkJLy8gdmVydGV4CgogICAgCQl2ZXJ0ZXgueCA9IHJhZGl1cyAqIE1hdGguY29zKCBzZWdtZW50ICk7CiAgICAJCXZlcnRleC55ID0gcmFkaXVzICogTWF0aC5zaW4oIHNlZ21lbnQgKTsKCiAgICAJCXZlcnRpY2VzLnB1c2goIHZlcnRleC54LCB2ZXJ0ZXgueSwgdmVydGV4LnogKTsKCiAgICAJCS8vIG5vcm1hbAoKICAgIAkJbm9ybWFscy5wdXNoKCAwLCAwLCAxICk7CgogICAgCQkvLyB1dnMKCiAgICAJCXV2LnggPSAoIHZlcnRpY2VzWyBpIF0gLyByYWRpdXMgKyAxICkgLyAyOwogICAgCQl1di55ID0gKCB2ZXJ0aWNlc1sgaSArIDEgXSAvIHJhZGl1cyArIDEgKSAvIDI7CgogICAgCQl1dnMucHVzaCggdXYueCwgdXYueSApOwoKICAgIAl9CgogICAgCS8vIGluZGljZXMKCiAgICAJZm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CgogICAgCQlpbmRpY2VzLnB1c2goIGksIGkgKyAxLCAwICk7CgogICAgCX0KCiAgICAJLy8gYnVpbGQgZ2VvbWV0cnkKCiAgICAJdGhpcy5zZXRJbmRleCggaW5kaWNlcyApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAnbm9ybWFsJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIG5vcm1hbHMsIDMgKSApOwogICAgCXRoaXMuYWRkQXR0cmlidXRlKCAndXYnLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdXZzLCAyICkgKTsKCiAgICB9CgogICAgQ2lyY2xlQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlICk7CiAgICBDaXJjbGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBDaXJjbGVCdWZmZXJHZW9tZXRyeTsKCgoKICAgIHZhciBHZW9tZXRyaWVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgCVdpcmVmcmFtZUdlb21ldHJ5OiBXaXJlZnJhbWVHZW9tZXRyeSwKICAgIAlQYXJhbWV0cmljR2VvbWV0cnk6IFBhcmFtZXRyaWNHZW9tZXRyeSwKICAgIAlQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwKICAgIAlUZXRyYWhlZHJvbkdlb21ldHJ5OiBUZXRyYWhlZHJvbkdlb21ldHJ5LAogICAgCVRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IFRldHJhaGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAJT2N0YWhlZHJvbkdlb21ldHJ5OiBPY3RhaGVkcm9uR2VvbWV0cnksCiAgICAJT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAJSWNvc2FoZWRyb25HZW9tZXRyeTogSWNvc2FoZWRyb25HZW9tZXRyeSwKICAgIAlJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBJY29zYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAogICAgCURvZGVjYWhlZHJvbkdlb21ldHJ5OiBEb2RlY2FoZWRyb25HZW9tZXRyeSwKICAgIAlEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTogRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAJUG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksCiAgICAJUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAJVHViZUdlb21ldHJ5OiBUdWJlR2VvbWV0cnksCiAgICAJVHViZUJ1ZmZlckdlb21ldHJ5OiBUdWJlQnVmZmVyR2VvbWV0cnksCiAgICAJVG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LAogICAgCVRvcnVzS25vdEJ1ZmZlckdlb21ldHJ5OiBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSwKICAgIAlUb3J1c0dlb21ldHJ5OiBUb3J1c0dlb21ldHJ5LAogICAgCVRvcnVzQnVmZmVyR2VvbWV0cnk6IFRvcnVzQnVmZmVyR2VvbWV0cnksCiAgICAJVGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnksCiAgICAJVGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksCiAgICAJU3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LAogICAgCVNwaGVyZUJ1ZmZlckdlb21ldHJ5OiBTcGhlcmVCdWZmZXJHZW9tZXRyeSwKICAgIAlSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSwKICAgIAlSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdCdWZmZXJHZW9tZXRyeSwKICAgIAlQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LAogICAgCVBsYW5lQnVmZmVyR2VvbWV0cnk6IFBsYW5lQnVmZmVyR2VvbWV0cnksCiAgICAJTGF0aGVHZW9tZXRyeTogTGF0aGVHZW9tZXRyeSwKICAgIAlMYXRoZUJ1ZmZlckdlb21ldHJ5OiBMYXRoZUJ1ZmZlckdlb21ldHJ5LAogICAgCVNoYXBlR2VvbWV0cnk6IFNoYXBlR2VvbWV0cnksCiAgICAJU2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVCdWZmZXJHZW9tZXRyeSwKICAgIAlFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSwKICAgIAlFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwKICAgIAlFZGdlc0dlb21ldHJ5OiBFZGdlc0dlb21ldHJ5LAogICAgCUNvbmVHZW9tZXRyeTogQ29uZUdlb21ldHJ5LAogICAgCUNvbmVCdWZmZXJHZW9tZXRyeTogQ29uZUJ1ZmZlckdlb21ldHJ5LAogICAgCUN5bGluZGVyR2VvbWV0cnk6IEN5bGluZGVyR2VvbWV0cnksCiAgICAJQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTogQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSwKICAgIAlDaXJjbGVHZW9tZXRyeTogQ2lyY2xlR2VvbWV0cnksCiAgICAJQ2lyY2xlQnVmZmVyR2VvbWV0cnk6IENpcmNsZUJ1ZmZlckdlb21ldHJ5LAogICAgCUJveEdlb21ldHJ5OiBCb3hHZW9tZXRyeSwKICAgIAlCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnkKICAgIH0pOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqCiAgICAgKiBwYXJhbWV0ZXJzID0gewogICAgICogIGNvbG9yOiA8VEhSRUUuQ29sb3I+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBTaGFkb3dNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCiAgICAJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnU2hhZG93TWF0ZXJpYWwnOwoKICAgIAl0aGlzLmNvbG9yID0gbmV3IENvbG9yJDcoIDB4MDAwMDAwICk7CiAgICAJdGhpcy50cmFuc3BhcmVudCA9IHRydWU7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIFNoYWRvd01hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwogICAgU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gU2hhZG93TWF0ZXJpYWw7CgogICAgU2hhZG93TWF0ZXJpYWwucHJvdG90eXBlLmlzU2hhZG93TWF0ZXJpYWwgPSB0cnVlOwoKICAgIFNoYWRvd01hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFJhd1NoYWRlck1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAlTaGFkZXJNYXRlcmlhbC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJzICk7CgogICAgCXRoaXMudHlwZSA9ICdSYXdTaGFkZXJNYXRlcmlhbCc7CgogICAgfQoKICAgIFJhd1NoYWRlck1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSApOwogICAgUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmF3U2hhZGVyTWF0ZXJpYWw7CgogICAgUmF3U2hhZGVyTWF0ZXJpYWwucHJvdG90eXBlLmlzUmF3U2hhZGVyTWF0ZXJpYWwgPSB0cnVlOwoKICAgIC8qKgogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBjb2xvcjogPGhleD4sCiAgICAgKiAgcm91Z2huZXNzOiA8ZmxvYXQ+LAogICAgICogIG1ldGFsbmVzczogPGZsb2F0PiwKICAgICAqICBvcGFjaXR5OiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGxpZ2h0TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogIGxpZ2h0TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CiAgICAgKgogICAgICogIGFvTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogIGFvTWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CiAgICAgKgogICAgICogIGVtaXNzaXZlOiA8aGV4PiwKICAgICAqICBlbWlzc2l2ZUludGVuc2l0eTogPGZsb2F0PgogICAgICogIGVtaXNzaXZlTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBidW1wTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogIGJ1bXBTY2FsZTogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgbm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogIG5vcm1hbE1hcFR5cGU6IFRIUkVFLlRhbmdlbnRTcGFjZU5vcm1hbE1hcCwKICAgICAqICBub3JtYWxTY2FsZTogPFZlY3RvcjI+LAogICAgICoKICAgICAqICBkaXNwbGFjZW1lbnRNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKiAgZGlzcGxhY2VtZW50U2NhbGU6IDxmbG9hdD4sCiAgICAgKiAgZGlzcGxhY2VtZW50QmlhczogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgcm91Z2huZXNzTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBtZXRhbG5lc3NNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksCiAgICAgKiAgZW52TWFwSW50ZW5zaXR5OiA8ZmxvYXQ+CiAgICAgKgogICAgICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCiAgICAgKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBza2lubmluZzogPGJvb2w+LAogICAgICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAogICAgICogIG1vcnBoTm9ybWFsczogPGJvb2w+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBNZXNoU3RhbmRhcmRNYXRlcmlhbCggcGFyYW1ldGVycyApIHsKCiAgICAJTWF0ZXJpYWwuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07CgogICAgCXRoaXMudHlwZSA9ICdNZXNoU3RhbmRhcmRNYXRlcmlhbCc7CgogICAgCXRoaXMuY29sb3IgPSBuZXcgQ29sb3IkNyggMHhmZmZmZmYgKTsgLy8gZGlmZnVzZQogICAgCXRoaXMucm91Z2huZXNzID0gMC41OwogICAgCXRoaXMubWV0YWxuZXNzID0gMC41OwoKICAgIAl0aGlzLm1hcCA9IG51bGw7CgogICAgCXRoaXMubGlnaHRNYXAgPSBudWxsOwogICAgCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSAxLjA7CgogICAgCXRoaXMuYW9NYXAgPSBudWxsOwogICAgCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSAxLjA7CgogICAgCXRoaXMuZW1pc3NpdmUgPSBuZXcgQ29sb3IkNyggMHgwMDAwMDAgKTsKICAgIAl0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gMS4wOwogICAgCXRoaXMuZW1pc3NpdmVNYXAgPSBudWxsOwoKICAgIAl0aGlzLmJ1bXBNYXAgPSBudWxsOwogICAgCXRoaXMuYnVtcFNjYWxlID0gMTsKCiAgICAJdGhpcy5ub3JtYWxNYXAgPSBudWxsOwogICAgCXRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDsKICAgIAl0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKCiAgICAJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwogICAgCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CgogICAgCXRoaXMucm91Z2huZXNzTWFwID0gbnVsbDsKCiAgICAJdGhpcy5tZXRhbG5lc3NNYXAgPSBudWxsOwoKICAgIAl0aGlzLmFscGhhTWFwID0gbnVsbDsKCiAgICAJdGhpcy5lbnZNYXAgPSBudWxsOwogICAgCXRoaXMuZW52TWFwSW50ZW5zaXR5ID0gMS4wOwoKICAgIAl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CgogICAgCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwogICAgCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwogICAgCXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1hdGVyaWFsLnByb3RvdHlwZSApOwogICAgTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWVzaFN0YW5kYXJkTWF0ZXJpYWw7CgogICAgTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFN0YW5kYXJkTWF0ZXJpYWwgPSB0cnVlOwoKICAgIE1lc2hTdGFuZGFyZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmRlZmluZXMgPSB7ICdTVEFOREFSRCc6ICcnIH07CgogICAgCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CiAgICAJdGhpcy5yb3VnaG5lc3MgPSBzb3VyY2Uucm91Z2huZXNzOwogICAgCXRoaXMubWV0YWxuZXNzID0gc291cmNlLm1ldGFsbmVzczsKCiAgICAJdGhpcy5tYXAgPSBzb3VyY2UubWFwOwoKICAgIAl0aGlzLmxpZ2h0TWFwID0gc291cmNlLmxpZ2h0TWFwOwogICAgCXRoaXMubGlnaHRNYXBJbnRlbnNpdHkgPSBzb3VyY2UubGlnaHRNYXBJbnRlbnNpdHk7CgogICAgCXRoaXMuYW9NYXAgPSBzb3VyY2UuYW9NYXA7CiAgICAJdGhpcy5hb01hcEludGVuc2l0eSA9IHNvdXJjZS5hb01hcEludGVuc2l0eTsKCiAgICAJdGhpcy5lbWlzc2l2ZS5jb3B5KCBzb3VyY2UuZW1pc3NpdmUgKTsKICAgIAl0aGlzLmVtaXNzaXZlTWFwID0gc291cmNlLmVtaXNzaXZlTWFwOwogICAgCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSBzb3VyY2UuZW1pc3NpdmVJbnRlbnNpdHk7CgogICAgCXRoaXMuYnVtcE1hcCA9IHNvdXJjZS5idW1wTWFwOwogICAgCXRoaXMuYnVtcFNjYWxlID0gc291cmNlLmJ1bXBTY2FsZTsKCiAgICAJdGhpcy5ub3JtYWxNYXAgPSBzb3VyY2Uubm9ybWFsTWFwOwogICAgCXRoaXMubm9ybWFsTWFwVHlwZSA9IHNvdXJjZS5ub3JtYWxNYXBUeXBlOwogICAgCXRoaXMubm9ybWFsU2NhbGUuY29weSggc291cmNlLm5vcm1hbFNjYWxlICk7CgogICAgCXRoaXMuZGlzcGxhY2VtZW50TWFwID0gc291cmNlLmRpc3BsYWNlbWVudE1hcDsKICAgIAl0aGlzLmRpc3BsYWNlbWVudFNjYWxlID0gc291cmNlLmRpc3BsYWNlbWVudFNjYWxlOwogICAgCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IHNvdXJjZS5kaXNwbGFjZW1lbnRCaWFzOwoKICAgIAl0aGlzLnJvdWdobmVzc01hcCA9IHNvdXJjZS5yb3VnaG5lc3NNYXA7CgogICAgCXRoaXMubWV0YWxuZXNzTWFwID0gc291cmNlLm1ldGFsbmVzc01hcDsKCiAgICAJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCiAgICAJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwogICAgCXRoaXMuZW52TWFwSW50ZW5zaXR5ID0gc291cmNlLmVudk1hcEludGVuc2l0eTsKCiAgICAJdGhpcy5yZWZyYWN0aW9uUmF0aW8gPSBzb3VyY2UucmVmcmFjdGlvblJhdGlvOwoKICAgIAl0aGlzLndpcmVmcmFtZSA9IHNvdXJjZS53aXJlZnJhbWU7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSBzb3VyY2Uud2lyZWZyYW1lTGluZXdpZHRoOwogICAgCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9IHNvdXJjZS53aXJlZnJhbWVMaW5lY2FwOwogICAgCXRoaXMud2lyZWZyYW1lTGluZWpvaW4gPSBzb3VyY2Uud2lyZWZyYW1lTGluZWpvaW47CgogICAgCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CiAgICAJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwogICAgCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+CiAgICAgKiAgY2xlYXJjb2F0OiA8ZmxvYXQ+CiAgICAgKiAgY2xlYXJjb2F0Um91Z2huZXNzOiA8ZmxvYXQ+CiAgICAgKgogICAgICogIHNoZWVuOiA8Q29sb3I+CiAgICAgKgogICAgICogIGNsZWFyY29hdE5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sCiAgICAgKiAgY2xlYXJjb2F0Tm9ybWFsTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogfQogICAgICovCgogICAgZnVuY3Rpb24gTWVzaFBoeXNpY2FsTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCU1lc2hTdGFuZGFyZE1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy5kZWZpbmVzID0gewoKICAgIAkJJ1NUQU5EQVJEJzogJycsCiAgICAJCSdQSFlTSUNBTCc6ICcnCgogICAgCX07CgogICAgCXRoaXMudHlwZSA9ICdNZXNoUGh5c2ljYWxNYXRlcmlhbCc7CgogICAgCXRoaXMucmVmbGVjdGl2aXR5ID0gMC41OyAvLyBtYXBzIHRvIEYwID0gMC4wNAoKICAgIAl0aGlzLmNsZWFyY29hdCA9IDAuMDsKICAgIAl0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IDAuMDsKCiAgICAJdGhpcy5zaGVlbiA9IG51bGw7IC8vIG51bGwgd2lsbCBkaXNhYmxlIHNoZWVuIGJzZGYKCiAgICAJdGhpcy5jbGVhcmNvYXROb3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCAxLCAxICk7CiAgICAJdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBudWxsOwoKICAgIAl0aGlzLnRyYW5zcGFyZW5jeSA9IDAuMDsKCiAgICAJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCiAgICB9CgogICAgTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlICk7CiAgICBNZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGh5c2ljYWxNYXRlcmlhbDsKCiAgICBNZXNoUGh5c2ljYWxNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGh5c2ljYWxNYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaFBoeXNpY2FsTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJTWVzaFN0YW5kYXJkTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMuZGVmaW5lcyA9IHsKCiAgICAJCSdTVEFOREFSRCc6ICcnLAogICAgCQknUEhZU0lDQUwnOiAnJwoKICAgIAl9OwoKICAgIAl0aGlzLnJlZmxlY3Rpdml0eSA9IHNvdXJjZS5yZWZsZWN0aXZpdHk7CgogICAgCXRoaXMuY2xlYXJjb2F0ID0gc291cmNlLmNsZWFyY29hdDsKICAgIAl0aGlzLmNsZWFyY29hdFJvdWdobmVzcyA9IHNvdXJjZS5jbGVhcmNvYXRSb3VnaG5lc3M7CgogICAgCWlmICggc291cmNlLnNoZWVuICkgdGhpcy5zaGVlbiA9ICggdGhpcy5zaGVlbiB8fCBuZXcgQ29sb3IkNygpICkuY29weSggc291cmNlLnNoZWVuICk7CiAgICAJZWxzZSB0aGlzLnNoZWVuID0gbnVsbDsKCiAgICAJdGhpcy5jbGVhcmNvYXROb3JtYWxNYXAgPSBzb3VyY2UuY2xlYXJjb2F0Tm9ybWFsTWFwOwogICAgCXRoaXMuY2xlYXJjb2F0Tm9ybWFsU2NhbGUuY29weSggc291cmNlLmNsZWFyY29hdE5vcm1hbFNjYWxlICk7CgogICAgCXRoaXMudHJhbnNwYXJlbmN5ID0gc291cmNlLnRyYW5zcGFyZW5jeTsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICoKICAgICAqIHBhcmFtZXRlcnMgPSB7CiAgICAgKiAgY29sb3I6IDxoZXg+LAogICAgICogIHNwZWN1bGFyOiA8aGV4PiwKICAgICAqICBzaGluaW5lc3M6IDxmbG9hdD4sCiAgICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PgogICAgICoKICAgICAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PgogICAgICoKICAgICAqICBlbWlzc2l2ZTogPGhleD4sCiAgICAgKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD4KICAgICAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgYnVtcE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBidW1wU2NhbGU6IDxmbG9hdD4sCiAgICAgKgogICAgICogIG5vcm1hbE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBub3JtYWxNYXBUeXBlOiBUSFJFRS5UYW5nZW50U3BhY2VOb3JtYWxNYXAsCiAgICAgKiAgbm9ybWFsU2NhbGU6IDxWZWN0b3IyPiwKICAgICAqCiAgICAgKiAgZGlzcGxhY2VtZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICogIGRpc3BsYWNlbWVudFNjYWxlOiA8ZmxvYXQ+LAogICAgICogIGRpc3BsYWNlbWVudEJpYXM6IDxmbG9hdD4sCiAgICAgKgogICAgICogIHNwZWN1bGFyTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgZW52TWFwOiBuZXcgVEhSRUUuQ3ViZVRleHR1cmUoIFtwb3N4LCBuZWd4LCBwb3N5LCBuZWd5LCBwb3N6LCBuZWd6XSApLAogICAgICogIGNvbWJpbmU6IFRIUkVFLk11bHRpcGx5LAogICAgICogIHJlZmxlY3Rpdml0eTogPGZsb2F0PiwKICAgICAqICByZWZyYWN0aW9uUmF0aW86IDxmbG9hdD4sCiAgICAgKgogICAgICogIHdpcmVmcmFtZTogPGJvb2xlYW4+LAogICAgICogIHdpcmVmcmFtZUxpbmV3aWR0aDogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgc2tpbm5pbmc6IDxib29sPiwKICAgICAqICBtb3JwaFRhcmdldHM6IDxib29sPiwKICAgICAqICBtb3JwaE5vcm1hbHM6IDxib29sPgogICAgICogfQogICAgICovCgogICAgZnVuY3Rpb24gTWVzaFBob25nTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCU1hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ01lc2hQaG9uZ01hdGVyaWFsJzsKCiAgICAJdGhpcy5jb2xvciA9IG5ldyBDb2xvciQ3KCAweGZmZmZmZiApOyAvLyBkaWZmdXNlCiAgICAJdGhpcy5zcGVjdWxhciA9IG5ldyBDb2xvciQ3KCAweDExMTExMSApOwogICAgCXRoaXMuc2hpbmluZXNzID0gMzA7CgogICAgCXRoaXMubWFwID0gbnVsbDsKCiAgICAJdGhpcy5saWdodE1hcCA9IG51bGw7CiAgICAJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDsKCiAgICAJdGhpcy5hb01hcCA9IG51bGw7CiAgICAJdGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDsKCiAgICAJdGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciQ3KCAweDAwMDAwMCApOwogICAgCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7CiAgICAJdGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7CgogICAgCXRoaXMuYnVtcE1hcCA9IG51bGw7CiAgICAJdGhpcy5idW1wU2NhbGUgPSAxOwoKICAgIAl0aGlzLm5vcm1hbE1hcCA9IG51bGw7CiAgICAJdGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwOwogICAgCXRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApOwoKICAgIAl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKCiAgICAJdGhpcy5zcGVjdWxhck1hcCA9IG51bGw7CgogICAgCXRoaXMuYWxwaGFNYXAgPSBudWxsOwoKICAgIAl0aGlzLmVudk1hcCA9IG51bGw7CiAgICAJdGhpcy5jb21iaW5lID0gTXVsdGlwbHlPcGVyYXRpb247CiAgICAJdGhpcy5yZWZsZWN0aXZpdHkgPSAxOwogICAgCXRoaXMucmVmcmFjdGlvblJhdGlvID0gMC45ODsKCiAgICAJdGhpcy53aXJlZnJhbWUgPSBmYWxzZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IDE7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gJ3JvdW5kJzsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmVqb2luID0gJ3JvdW5kJzsKCiAgICAJdGhpcy5za2lubmluZyA9IGZhbHNlOwogICAgCXRoaXMubW9ycGhUYXJnZXRzID0gZmFsc2U7CiAgICAJdGhpcy5tb3JwaE5vcm1hbHMgPSBmYWxzZTsKCiAgICAJdGhpcy5zZXRWYWx1ZXMoIHBhcmFtZXRlcnMgKTsKCiAgICB9CgogICAgTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CiAgICBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoUGhvbmdNYXRlcmlhbDsKCiAgICBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoUGhvbmdNYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaFBob25nTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJTWF0ZXJpYWwucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CiAgICAJdGhpcy5zcGVjdWxhci5jb3B5KCBzb3VyY2Uuc3BlY3VsYXIgKTsKICAgIAl0aGlzLnNoaW5pbmVzcyA9IHNvdXJjZS5zaGluaW5lc3M7CgogICAgCXRoaXMubWFwID0gc291cmNlLm1hcDsKCiAgICAJdGhpcy5saWdodE1hcCA9IHNvdXJjZS5saWdodE1hcDsKICAgIAl0aGlzLmxpZ2h0TWFwSW50ZW5zaXR5ID0gc291cmNlLmxpZ2h0TWFwSW50ZW5zaXR5OwoKICAgIAl0aGlzLmFvTWFwID0gc291cmNlLmFvTWFwOwogICAgCXRoaXMuYW9NYXBJbnRlbnNpdHkgPSBzb3VyY2UuYW9NYXBJbnRlbnNpdHk7CgogICAgCXRoaXMuZW1pc3NpdmUuY29weSggc291cmNlLmVtaXNzaXZlICk7CiAgICAJdGhpcy5lbWlzc2l2ZU1hcCA9IHNvdXJjZS5lbWlzc2l2ZU1hcDsKICAgIAl0aGlzLmVtaXNzaXZlSW50ZW5zaXR5ID0gc291cmNlLmVtaXNzaXZlSW50ZW5zaXR5OwoKICAgIAl0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKICAgIAl0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7CgogICAgCXRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDsKICAgIAl0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTsKICAgIAl0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApOwoKICAgIAl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKICAgIAl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKCiAgICAJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKCiAgICAJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCiAgICAJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwogICAgCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwogICAgCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKICAgIAl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CgogICAgCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKCiAgICAJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CiAgICAJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciB0YWthaGlyb3ggLyBodHRwOi8vZ2l0aHViLmNvbS90YWthaGlyb3gKICAgICAqCiAgICAgKiBwYXJhbWV0ZXJzID0gewogICAgICogIGdyYWRpZW50TWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApCiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBNZXNoVG9vbk1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAlNZXNoUGhvbmdNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMuZGVmaW5lcyA9IHsgJ1RPT04nOiAnJyB9OwoKICAgIAl0aGlzLnR5cGUgPSAnTWVzaFRvb25NYXRlcmlhbCc7CgogICAgCXRoaXMuZ3JhZGllbnRNYXAgPSBudWxsOwoKICAgIAl0aGlzLnNldFZhbHVlcyggcGFyYW1ldGVycyApOwoKICAgIH0KCiAgICBNZXNoVG9vbk1hdGVyaWFsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE1lc2hQaG9uZ01hdGVyaWFsLnByb3RvdHlwZSApOwogICAgTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoVG9vbk1hdGVyaWFsOwoKICAgIE1lc2hUb29uTWF0ZXJpYWwucHJvdG90eXBlLmlzTWVzaFRvb25NYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaFRvb25NYXRlcmlhbC5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy5ncmFkaWVudE1hcCA9IHNvdXJjZS5ncmFkaWVudE1hcDsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqCiAgICAgKiBwYXJhbWV0ZXJzID0gewogICAgICogIG9wYWNpdHk6IDxmbG9hdD4sCiAgICAgKgogICAgICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKiAgbm9ybWFsTWFwVHlwZTogVEhSRUUuVGFuZ2VudFNwYWNlTm9ybWFsTWFwLAogICAgICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sCiAgICAgKgogICAgICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKICAgICAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICB3aXJlZnJhbWU6IDxib29sZWFuPiwKICAgICAqICB3aXJlZnJhbWVMaW5ld2lkdGg6IDxmbG9hdD4KICAgICAqCiAgICAgKiAgc2tpbm5pbmc6IDxib29sPiwKICAgICAqICBtb3JwaFRhcmdldHM6IDxib29sPiwKICAgICAqICBtb3JwaE5vcm1hbHM6IDxib29sPgogICAgICogfQogICAgICovCgogICAgZnVuY3Rpb24gTWVzaE5vcm1hbE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdNZXNoTm9ybWFsTWF0ZXJpYWwnOwoKICAgIAl0aGlzLmJ1bXBNYXAgPSBudWxsOwogICAgCXRoaXMuYnVtcFNjYWxlID0gMTsKCiAgICAJdGhpcy5ub3JtYWxNYXAgPSBudWxsOwogICAgCXRoaXMubm9ybWFsTWFwVHlwZSA9IFRhbmdlbnRTcGFjZU5vcm1hbE1hcDsKICAgIAl0aGlzLm5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKCiAgICAJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBudWxsOwogICAgCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSAxOwogICAgCXRoaXMuZGlzcGxhY2VtZW50QmlhcyA9IDA7CgogICAgCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwoKICAgIAl0aGlzLmZvZyA9IGZhbHNlOwogICAgCXRoaXMubGlnaHRzID0gZmFsc2U7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwogICAgCXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIE1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIE1lc2hOb3JtYWxNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTm9ybWFsTWF0ZXJpYWw7CgogICAgTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hOb3JtYWxNYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaE5vcm1hbE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmJ1bXBNYXAgPSBzb3VyY2UuYnVtcE1hcDsKICAgIAl0aGlzLmJ1bXBTY2FsZSA9IHNvdXJjZS5idW1wU2NhbGU7CgogICAgCXRoaXMubm9ybWFsTWFwID0gc291cmNlLm5vcm1hbE1hcDsKICAgIAl0aGlzLm5vcm1hbE1hcFR5cGUgPSBzb3VyY2Uubm9ybWFsTWFwVHlwZTsKICAgIAl0aGlzLm5vcm1hbFNjYWxlLmNvcHkoIHNvdXJjZS5ub3JtYWxTY2FsZSApOwoKICAgIAl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IHNvdXJjZS5kaXNwbGFjZW1lbnRNYXA7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IHNvdXJjZS5kaXNwbGFjZW1lbnRTY2FsZTsKICAgIAl0aGlzLmRpc3BsYWNlbWVudEJpYXMgPSBzb3VyY2UuZGlzcGxhY2VtZW50QmlhczsKCiAgICAJdGhpcy53aXJlZnJhbWUgPSBzb3VyY2Uud2lyZWZyYW1lOwogICAgCXRoaXMud2lyZWZyYW1lTGluZXdpZHRoID0gc291cmNlLndpcmVmcmFtZUxpbmV3aWR0aDsKCiAgICAJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CiAgICAJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBjb2xvcjogPGhleD4sCiAgICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgbWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBsaWdodE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBsaWdodE1hcEludGVuc2l0eTogPGZsb2F0PgogICAgICoKICAgICAqICBhb01hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBhb01hcEludGVuc2l0eTogPGZsb2F0PgogICAgICoKICAgICAqICBlbWlzc2l2ZTogPGhleD4sCiAgICAgKiAgZW1pc3NpdmVJbnRlbnNpdHk6IDxmbG9hdD4KICAgICAqICBlbWlzc2l2ZU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgc3BlY3VsYXJNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGFscGhhTWFwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBlbnZNYXA6IG5ldyBUSFJFRS5DdWJlVGV4dHVyZSggW3Bvc3gsIG5lZ3gsIHBvc3ksIG5lZ3ksIHBvc3osIG5lZ3pdICksCiAgICAgKiAgY29tYmluZTogVEhSRUUuTXVsdGlwbHksCiAgICAgKiAgcmVmbGVjdGl2aXR5OiA8ZmxvYXQ+LAogICAgICogIHJlZnJhY3Rpb25SYXRpbzogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgd2lyZWZyYW1lOiA8Ym9vbGVhbj4sCiAgICAgKiAgd2lyZWZyYW1lTGluZXdpZHRoOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBza2lubmluZzogPGJvb2w+LAogICAgICogIG1vcnBoVGFyZ2V0czogPGJvb2w+LAogICAgICogIG1vcnBoTm9ybWFsczogPGJvb2w+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBNZXNoTGFtYmVydE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdNZXNoTGFtYmVydE1hdGVyaWFsJzsKCiAgICAJdGhpcy5jb2xvciA9IG5ldyBDb2xvciQ3KCAweGZmZmZmZiApOyAvLyBkaWZmdXNlCgogICAgCXRoaXMubWFwID0gbnVsbDsKCiAgICAJdGhpcy5saWdodE1hcCA9IG51bGw7CiAgICAJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IDEuMDsKCiAgICAJdGhpcy5hb01hcCA9IG51bGw7CiAgICAJdGhpcy5hb01hcEludGVuc2l0eSA9IDEuMDsKCiAgICAJdGhpcy5lbWlzc2l2ZSA9IG5ldyBDb2xvciQ3KCAweDAwMDAwMCApOwogICAgCXRoaXMuZW1pc3NpdmVJbnRlbnNpdHkgPSAxLjA7CiAgICAJdGhpcy5lbWlzc2l2ZU1hcCA9IG51bGw7CgogICAgCXRoaXMuc3BlY3VsYXJNYXAgPSBudWxsOwoKICAgIAl0aGlzLmFscGhhTWFwID0gbnVsbDsKCiAgICAJdGhpcy5lbnZNYXAgPSBudWxsOwogICAgCXRoaXMuY29tYmluZSA9IE11bHRpcGx5T3BlcmF0aW9uOwogICAgCXRoaXMucmVmbGVjdGl2aXR5ID0gMTsKICAgIAl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IDAuOTg7CgogICAgCXRoaXMud2lyZWZyYW1lID0gZmFsc2U7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5ld2lkdGggPSAxOwogICAgCXRoaXMud2lyZWZyYW1lTGluZWNhcCA9ICdyb3VuZCc7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9ICdyb3VuZCc7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwogICAgCXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIE1lc2hMYW1iZXJ0TWF0ZXJpYWwucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWF0ZXJpYWwucHJvdG90eXBlICk7CiAgICBNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IE1lc2hMYW1iZXJ0TWF0ZXJpYWw7CgogICAgTWVzaExhbWJlcnRNYXRlcmlhbC5wcm90b3R5cGUuaXNNZXNoTGFtYmVydE1hdGVyaWFsID0gdHJ1ZTsKCiAgICBNZXNoTGFtYmVydE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKICAgIAl0aGlzLm1hcCA9IHNvdXJjZS5tYXA7CgogICAgCXRoaXMubGlnaHRNYXAgPSBzb3VyY2UubGlnaHRNYXA7CiAgICAJdGhpcy5saWdodE1hcEludGVuc2l0eSA9IHNvdXJjZS5saWdodE1hcEludGVuc2l0eTsKCiAgICAJdGhpcy5hb01hcCA9IHNvdXJjZS5hb01hcDsKICAgIAl0aGlzLmFvTWFwSW50ZW5zaXR5ID0gc291cmNlLmFvTWFwSW50ZW5zaXR5OwoKICAgIAl0aGlzLmVtaXNzaXZlLmNvcHkoIHNvdXJjZS5lbWlzc2l2ZSApOwogICAgCXRoaXMuZW1pc3NpdmVNYXAgPSBzb3VyY2UuZW1pc3NpdmVNYXA7CiAgICAJdGhpcy5lbWlzc2l2ZUludGVuc2l0eSA9IHNvdXJjZS5lbWlzc2l2ZUludGVuc2l0eTsKCiAgICAJdGhpcy5zcGVjdWxhck1hcCA9IHNvdXJjZS5zcGVjdWxhck1hcDsKCiAgICAJdGhpcy5hbHBoYU1hcCA9IHNvdXJjZS5hbHBoYU1hcDsKCiAgICAJdGhpcy5lbnZNYXAgPSBzb3VyY2UuZW52TWFwOwogICAgCXRoaXMuY29tYmluZSA9IHNvdXJjZS5jb21iaW5lOwogICAgCXRoaXMucmVmbGVjdGl2aXR5ID0gc291cmNlLnJlZmxlY3Rpdml0eTsKICAgIAl0aGlzLnJlZnJhY3Rpb25SYXRpbyA9IHNvdXJjZS5yZWZyYWN0aW9uUmF0aW87CgogICAgCXRoaXMud2lyZWZyYW1lID0gc291cmNlLndpcmVmcmFtZTsKICAgIAl0aGlzLndpcmVmcmFtZUxpbmV3aWR0aCA9IHNvdXJjZS53aXJlZnJhbWVMaW5ld2lkdGg7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lY2FwID0gc291cmNlLndpcmVmcmFtZUxpbmVjYXA7CiAgICAJdGhpcy53aXJlZnJhbWVMaW5lam9pbiA9IHNvdXJjZS53aXJlZnJhbWVMaW5lam9pbjsKCiAgICAJdGhpcy5za2lubmluZyA9IHNvdXJjZS5za2lubmluZzsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IHNvdXJjZS5tb3JwaFRhcmdldHM7CiAgICAJdGhpcy5tb3JwaE5vcm1hbHMgPSBzb3VyY2UubW9ycGhOb3JtYWxzOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBjb2xvcjogPGhleD4sCiAgICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgbWF0Y2FwOiBuZXcgVEhSRUUuVGV4dHVyZSggPEltYWdlPiApLAogICAgICoKICAgICAqICBtYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKgogICAgICogIGJ1bXBNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKiAgYnVtcFNjYWxlOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBub3JtYWxNYXA6IG5ldyBUSFJFRS5UZXh0dXJlKCA8SW1hZ2U+ICksCiAgICAgKiAgbm9ybWFsTWFwVHlwZTogVEhSRUUuVGFuZ2VudFNwYWNlTm9ybWFsTWFwLAogICAgICogIG5vcm1hbFNjYWxlOiA8VmVjdG9yMj4sCiAgICAgKgogICAgICogIGRpc3BsYWNlbWVudE1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqICBkaXNwbGFjZW1lbnRTY2FsZTogPGZsb2F0PiwKICAgICAqICBkaXNwbGFjZW1lbnRCaWFzOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBhbHBoYU1hcDogbmV3IFRIUkVFLlRleHR1cmUoIDxJbWFnZT4gKSwKICAgICAqCiAgICAgKiAgc2tpbm5pbmc6IDxib29sPiwKICAgICAqICBtb3JwaFRhcmdldHM6IDxib29sPiwKICAgICAqICBtb3JwaE5vcm1hbHM6IDxib29sPgogICAgICogfQogICAgICovCgogICAgZnVuY3Rpb24gTWVzaE1hdGNhcE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAlNYXRlcmlhbC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMuZGVmaW5lcyA9IHsgJ01BVENBUCc6ICcnIH07CgogICAgCXRoaXMudHlwZSA9ICdNZXNoTWF0Y2FwTWF0ZXJpYWwnOwoKICAgIAl0aGlzLmNvbG9yID0gbmV3IENvbG9yJDcoIDB4ZmZmZmZmICk7IC8vIGRpZmZ1c2UKCiAgICAJdGhpcy5tYXRjYXAgPSBudWxsOwoKICAgIAl0aGlzLm1hcCA9IG51bGw7CgogICAgCXRoaXMuYnVtcE1hcCA9IG51bGw7CiAgICAJdGhpcy5idW1wU2NhbGUgPSAxOwoKICAgIAl0aGlzLm5vcm1hbE1hcCA9IG51bGw7CiAgICAJdGhpcy5ub3JtYWxNYXBUeXBlID0gVGFuZ2VudFNwYWNlTm9ybWFsTWFwOwogICAgCXRoaXMubm9ybWFsU2NhbGUgPSBuZXcgVmVjdG9yMiggMSwgMSApOwoKICAgIAl0aGlzLmRpc3BsYWNlbWVudE1hcCA9IG51bGw7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRTY2FsZSA9IDE7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gMDsKCiAgICAJdGhpcy5hbHBoYU1hcCA9IG51bGw7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBmYWxzZTsKICAgIAl0aGlzLm1vcnBoVGFyZ2V0cyA9IGZhbHNlOwogICAgCXRoaXMubW9ycGhOb3JtYWxzID0gZmFsc2U7CgogICAgCXRoaXMubGlnaHRzID0gZmFsc2U7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIE1lc2hNYXRjYXBNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIE1lc2hNYXRjYXBNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBNZXNoTWF0Y2FwTWF0ZXJpYWw7CgogICAgTWVzaE1hdGNhcE1hdGVyaWFsLnByb3RvdHlwZS5pc01lc2hNYXRjYXBNYXRlcmlhbCA9IHRydWU7CgogICAgTWVzaE1hdGNhcE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU1hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLmRlZmluZXMgPSB7ICdNQVRDQVAnOiAnJyB9OwoKICAgIAl0aGlzLmNvbG9yLmNvcHkoIHNvdXJjZS5jb2xvciApOwoKICAgIAl0aGlzLm1hdGNhcCA9IHNvdXJjZS5tYXRjYXA7CgogICAgCXRoaXMubWFwID0gc291cmNlLm1hcDsKCiAgICAJdGhpcy5idW1wTWFwID0gc291cmNlLmJ1bXBNYXA7CiAgICAJdGhpcy5idW1wU2NhbGUgPSBzb3VyY2UuYnVtcFNjYWxlOwoKICAgIAl0aGlzLm5vcm1hbE1hcCA9IHNvdXJjZS5ub3JtYWxNYXA7CiAgICAJdGhpcy5ub3JtYWxNYXBUeXBlID0gc291cmNlLm5vcm1hbE1hcFR5cGU7CiAgICAJdGhpcy5ub3JtYWxTY2FsZS5jb3B5KCBzb3VyY2Uubm9ybWFsU2NhbGUgKTsKCiAgICAJdGhpcy5kaXNwbGFjZW1lbnRNYXAgPSBzb3VyY2UuZGlzcGxhY2VtZW50TWFwOwogICAgCXRoaXMuZGlzcGxhY2VtZW50U2NhbGUgPSBzb3VyY2UuZGlzcGxhY2VtZW50U2NhbGU7CiAgICAJdGhpcy5kaXNwbGFjZW1lbnRCaWFzID0gc291cmNlLmRpc3BsYWNlbWVudEJpYXM7CgogICAgCXRoaXMuYWxwaGFNYXAgPSBzb3VyY2UuYWxwaGFNYXA7CgogICAgCXRoaXMuc2tpbm5pbmcgPSBzb3VyY2Uuc2tpbm5pbmc7CiAgICAJdGhpcy5tb3JwaFRhcmdldHMgPSBzb3VyY2UubW9ycGhUYXJnZXRzOwogICAgCXRoaXMubW9ycGhOb3JtYWxzID0gc291cmNlLm1vcnBoTm9ybWFsczsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKgogICAgICogcGFyYW1ldGVycyA9IHsKICAgICAqICBjb2xvcjogPGhleD4sCiAgICAgKiAgb3BhY2l0eTogPGZsb2F0PiwKICAgICAqCiAgICAgKiAgbGluZXdpZHRoOiA8ZmxvYXQ+LAogICAgICoKICAgICAqICBzY2FsZTogPGZsb2F0PiwKICAgICAqICBkYXNoU2l6ZTogPGZsb2F0PiwKICAgICAqICBnYXBTaXplOiA8ZmxvYXQ+CiAgICAgKiB9CiAgICAgKi8KCiAgICBmdW5jdGlvbiBMaW5lRGFzaGVkTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCUxpbmVCYXNpY01hdGVyaWFsLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0xpbmVEYXNoZWRNYXRlcmlhbCc7CgogICAgCXRoaXMuc2NhbGUgPSAxOwogICAgCXRoaXMuZGFzaFNpemUgPSAzOwogICAgCXRoaXMuZ2FwU2l6ZSA9IDE7CgogICAgCXRoaXMuc2V0VmFsdWVzKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIExpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lQmFzaWNNYXRlcmlhbC5wcm90b3R5cGUgKTsKICAgIExpbmVEYXNoZWRNYXRlcmlhbC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBMaW5lRGFzaGVkTWF0ZXJpYWw7CgogICAgTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5pc0xpbmVEYXNoZWRNYXRlcmlhbCA9IHRydWU7CgogICAgTGluZURhc2hlZE1hdGVyaWFsLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCUxpbmVCYXNpY01hdGVyaWFsLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLnNjYWxlID0gc291cmNlLnNjYWxlOwogICAgCXRoaXMuZGFzaFNpemUgPSBzb3VyY2UuZGFzaFNpemU7CiAgICAJdGhpcy5nYXBTaXplID0gc291cmNlLmdhcFNpemU7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgoKCiAgICB2YXIgTWF0ZXJpYWxzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgCVNoYWRvd01hdGVyaWFsOiBTaGFkb3dNYXRlcmlhbCwKICAgIAlTcHJpdGVNYXRlcmlhbDogU3ByaXRlTWF0ZXJpYWwsCiAgICAJUmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLAogICAgCVNoYWRlck1hdGVyaWFsOiBTaGFkZXJNYXRlcmlhbCwKICAgIAlQb2ludHNNYXRlcmlhbDogUG9pbnRzTWF0ZXJpYWwsCiAgICAJTWVzaFBoeXNpY2FsTWF0ZXJpYWw6IE1lc2hQaHlzaWNhbE1hdGVyaWFsLAogICAgCU1lc2hTdGFuZGFyZE1hdGVyaWFsOiBNZXNoU3RhbmRhcmRNYXRlcmlhbCwKICAgIAlNZXNoUGhvbmdNYXRlcmlhbDogTWVzaFBob25nTWF0ZXJpYWwsCiAgICAJTWVzaFRvb25NYXRlcmlhbDogTWVzaFRvb25NYXRlcmlhbCwKICAgIAlNZXNoTm9ybWFsTWF0ZXJpYWw6IE1lc2hOb3JtYWxNYXRlcmlhbCwKICAgIAlNZXNoTGFtYmVydE1hdGVyaWFsOiBNZXNoTGFtYmVydE1hdGVyaWFsLAogICAgCU1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCwKICAgIAlNZXNoRGlzdGFuY2VNYXRlcmlhbDogTWVzaERpc3RhbmNlTWF0ZXJpYWwsCiAgICAJTWVzaEJhc2ljTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsLAogICAgCU1lc2hNYXRjYXBNYXRlcmlhbDogTWVzaE1hdGNhcE1hdGVyaWFsLAogICAgCUxpbmVEYXNoZWRNYXRlcmlhbDogTGluZURhc2hlZE1hdGVyaWFsLAogICAgCUxpbmVCYXNpY01hdGVyaWFsOiBMaW5lQmFzaWNNYXRlcmlhbCwKICAgIAlNYXRlcmlhbDogTWF0ZXJpYWwKICAgIH0pOwoKICAgIC8qKgogICAgICogQGF1dGhvciB0c2NodwogICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwogICAgICovCgogICAgdmFyIEFuaW1hdGlvblV0aWxzID0gewoKICAgIAkvLyBzYW1lIGFzIEFycmF5LnByb3RvdHlwZS5zbGljZSwgYnV0IGFsc28gd29ya3Mgb24gdHlwZWQgYXJyYXlzCiAgICAJYXJyYXlTbGljZTogZnVuY3Rpb24gKCBhcnJheSwgZnJvbSwgdG8gKSB7CgogICAgCQlpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggYXJyYXkgKSApIHsKCiAgICAJCQkvLyBpbiBpb3M5IGFycmF5LnN1YmFycmF5KGZyb20sIHVuZGVmaW5lZCkgd2lsbCByZXR1cm4gZW1wdHkgYXJyYXkKICAgIAkJCS8vIGJ1dCBhcnJheS5zdWJhcnJheShmcm9tKSBvciBhcnJheS5zdWJhcnJheShmcm9tLCBsZW4pIGlzIGNvcnJlY3QKICAgIAkJCXJldHVybiBuZXcgYXJyYXkuY29uc3RydWN0b3IoIGFycmF5LnN1YmFycmF5KCBmcm9tLCB0byAhPT0gdW5kZWZpbmVkID8gdG8gOiBhcnJheS5sZW5ndGggKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGFycmF5LnNsaWNlKCBmcm9tLCB0byApOwoKICAgIAl9LAoKICAgIAkvLyBjb252ZXJ0cyBhbiBhcnJheSB0byBhIHNwZWNpZmljIHR5cGUKICAgIAljb252ZXJ0QXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIHR5cGUsIGZvcmNlQ2xvbmUgKSB7CgogICAgCQlpZiAoICEgYXJyYXkgfHwgLy8gbGV0ICd1bmRlZmluZWQnIGFuZCAnbnVsbCcgcGFzcwogICAgCQkJISBmb3JjZUNsb25lICYmIGFycmF5LmNvbnN0cnVjdG9yID09PSB0eXBlICkgcmV0dXJuIGFycmF5OwoKICAgIAkJaWYgKCB0eXBlb2YgdHlwZS5CWVRFU19QRVJfRUxFTUVOVCA9PT0gJ251bWJlcicgKSB7CgogICAgCQkJcmV0dXJuIG5ldyB0eXBlKCBhcnJheSApOyAvLyBjcmVhdGUgdHlwZWQgYXJyYXkKCiAgICAJCX0KCiAgICAJCXJldHVybiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJyYXkgKTsgLy8gY3JlYXRlIEFycmF5CgogICAgCX0sCgogICAgCWlzVHlwZWRBcnJheTogZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCQlyZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KCBvYmplY3QgKSAmJgogICAgCQkJISAoIG9iamVjdCBpbnN0YW5jZW9mIERhdGFWaWV3ICk7CgogICAgCX0sCgogICAgCS8vIHJldHVybnMgYW4gYXJyYXkgYnkgd2hpY2ggdGltZXMgYW5kIHZhbHVlcyBjYW4gYmUgc29ydGVkCiAgICAJZ2V0S2V5ZnJhbWVPcmRlcjogZnVuY3Rpb24gKCB0aW1lcyApIHsKCiAgICAJCWZ1bmN0aW9uIGNvbXBhcmVUaW1lKCBpLCBqICkgewoKICAgIAkJCXJldHVybiB0aW1lc1sgaSBdIC0gdGltZXNbIGogXTsKCiAgICAJCX0KCiAgICAJCXZhciBuID0gdGltZXMubGVuZ3RoOwogICAgCQl2YXIgcmVzdWx0ID0gbmV3IEFycmF5KCBuICk7CiAgICAJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gbjsgKysgaSApIHJlc3VsdFsgaSBdID0gaTsKCiAgICAJCXJlc3VsdC5zb3J0KCBjb21wYXJlVGltZSApOwoKICAgIAkJcmV0dXJuIHJlc3VsdDsKCiAgICAJfSwKCiAgICAJLy8gdXNlcyB0aGUgYXJyYXkgcHJldmlvdXNseSByZXR1cm5lZCBieSAnZ2V0S2V5ZnJhbWVPcmRlcicgdG8gc29ydCBkYXRhCiAgICAJc29ydGVkQXJyYXk6IGZ1bmN0aW9uICggdmFsdWVzLCBzdHJpZGUsIG9yZGVyICkgewoKICAgIAkJdmFyIG5WYWx1ZXMgPSB2YWx1ZXMubGVuZ3RoOwogICAgCQl2YXIgcmVzdWx0ID0gbmV3IHZhbHVlcy5jb25zdHJ1Y3RvciggblZhbHVlcyApOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBkc3RPZmZzZXQgPSAwOyBkc3RPZmZzZXQgIT09IG5WYWx1ZXM7ICsrIGkgKSB7CgogICAgCQkJdmFyIHNyY09mZnNldCA9IG9yZGVyWyBpIF0gKiBzdHJpZGU7CgogICAgCQkJZm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7CgogICAgCQkJCXJlc3VsdFsgZHN0T2Zmc2V0ICsrIF0gPSB2YWx1ZXNbIHNyY09mZnNldCArIGogXTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gcmVzdWx0OwoKICAgIAl9LAoKICAgIAkvLyBmdW5jdGlvbiBmb3IgcGFyc2luZyBBT1Mga2V5ZnJhbWUgZm9ybWF0cwogICAgCWZsYXR0ZW5KU09OOiBmdW5jdGlvbiAoIGpzb25LZXlzLCB0aW1lcywgdmFsdWVzLCB2YWx1ZVByb3BlcnR5TmFtZSApIHsKCiAgICAJCXZhciBpID0gMSwga2V5ID0ganNvbktleXNbIDAgXTsKCiAgICAJCXdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgJiYga2V5WyB2YWx1ZVByb3BlcnR5TmFtZSBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJa2V5ID0ganNvbktleXNbIGkgKysgXTsKCiAgICAJCX0KCiAgICAJCWlmICgga2V5ID09PSB1bmRlZmluZWQgKSByZXR1cm47IC8vIG5vIGRhdGEKCiAgICAJCXZhciB2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKICAgIAkJaWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBubyBkYXRhCgogICAgCQlpZiAoIEFycmF5LmlzQXJyYXkoIHZhbHVlICkgKSB7CgogICAgCQkJZG8gewoKICAgIAkJCQl2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKCiAgICAJCQkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJdGltZXMucHVzaCgga2V5LnRpbWUgKTsKICAgIAkJCQkJdmFsdWVzLnB1c2guYXBwbHkoIHZhbHVlcywgdmFsdWUgKTsgLy8gcHVzaCBhbGwgZWxlbWVudHMKCiAgICAJCQkJfQoKICAgIAkJCQlrZXkgPSBqc29uS2V5c1sgaSArKyBdOwoKICAgIAkJCX0gd2hpbGUgKCBrZXkgIT09IHVuZGVmaW5lZCApOwoKICAgIAkJfSBlbHNlIGlmICggdmFsdWUudG9BcnJheSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCS8vIC4uLmFzc3VtZSBUSFJFRS5NYXRoLWlzaAoKICAgIAkJCWRvIHsKCiAgICAJCQkJdmFsdWUgPSBrZXlbIHZhbHVlUHJvcGVydHlOYW1lIF07CgogICAgCQkJCWlmICggdmFsdWUgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCXRpbWVzLnB1c2goIGtleS50aW1lICk7CiAgICAJCQkJCXZhbHVlLnRvQXJyYXkoIHZhbHVlcywgdmFsdWVzLmxlbmd0aCApOwoKICAgIAkJCQl9CgogICAgCQkJCWtleSA9IGpzb25LZXlzWyBpICsrIF07CgogICAgCQkJfSB3aGlsZSAoIGtleSAhPT0gdW5kZWZpbmVkICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIG90aGVyd2lzZSBwdXNoIGFzLWlzCgogICAgCQkJZG8gewoKICAgIAkJCQl2YWx1ZSA9IGtleVsgdmFsdWVQcm9wZXJ0eU5hbWUgXTsKCiAgICAJCQkJaWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJdGltZXMucHVzaCgga2V5LnRpbWUgKTsKICAgIAkJCQkJdmFsdWVzLnB1c2goIHZhbHVlICk7CgogICAgCQkJCX0KCiAgICAJCQkJa2V5ID0ganNvbktleXNbIGkgKysgXTsKCiAgICAJCQl9IHdoaWxlICgga2V5ICE9PSB1bmRlZmluZWQgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH07CgogICAgLyoqCiAgICAgKiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGludGVycG9sYW50cyBvdmVyIHBhcmFtZXRyaWMgc2FtcGxlcy4KICAgICAqCiAgICAgKiBUaGUgcGFyYW1ldGVyIGRvbWFpbiBpcyBvbmUgZGltZW5zaW9uYWwsIHR5cGljYWxseSB0aGUgdGltZSBvciBhIHBhdGgKICAgICAqIGFsb25nIGEgY3VydmUgZGVmaW5lZCBieSB0aGUgZGF0YS4KICAgICAqCiAgICAgKiBUaGUgc2FtcGxlIHZhbHVlcyBjYW4gaGF2ZSBhbnkgZGltZW5zaW9uYWxpdHkgYW5kIGRlcml2ZWQgY2xhc3NlcyBtYXkKICAgICAqIGFwcGx5IHNwZWNpYWwgaW50ZXJwcmV0YXRpb25zIHRvIHRoZSBkYXRhLgogICAgICoKICAgICAqIFRoaXMgY2xhc3MgcHJvdmlkZXMgdGhlIGludGVydmFsIHNlZWsgaW4gYSBUZW1wbGF0ZSBNZXRob2QsIGRlZmVycmluZwogICAgICogdGhlIGFjdHVhbCBpbnRlcnBvbGF0aW9uIHRvIGRlcml2ZWQgY2xhc3Nlcy4KICAgICAqCiAgICAgKiBUaW1lIGNvbXBsZXhpdHkgaXMgTygxKSBmb3IgbGluZWFyIGFjY2VzcyBjcm9zc2luZyBhdCBtb3N0IHR3byBwb2ludHMKICAgICAqIGFuZCBPKGxvZyBOKSBmb3IgcmFuZG9tIGFjY2Vzcywgd2hlcmUgTiBpcyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucy4KICAgICAqCiAgICAgKiBSZWZlcmVuY2VzOgogICAgICoKICAgICAqIAkJaHR0cDovL3d3dy5vb2Rlc2lnbi5jb20vdGVtcGxhdGUtbWV0aG9kLXBhdHRlcm4uaHRtbAogICAgICoKICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqLwoKICAgIGZ1bmN0aW9uIEludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkgewoKICAgIAl0aGlzLnBhcmFtZXRlclBvc2l0aW9ucyA9IHBhcmFtZXRlclBvc2l0aW9uczsKICAgIAl0aGlzLl9jYWNoZWRJbmRleCA9IDA7CgogICAgCXRoaXMucmVzdWx0QnVmZmVyID0gcmVzdWx0QnVmZmVyICE9PSB1bmRlZmluZWQgPwogICAgCQlyZXN1bHRCdWZmZXIgOiBuZXcgc2FtcGxlVmFsdWVzLmNvbnN0cnVjdG9yKCBzYW1wbGVTaXplICk7CiAgICAJdGhpcy5zYW1wbGVWYWx1ZXMgPSBzYW1wbGVWYWx1ZXM7CiAgICAJdGhpcy52YWx1ZVNpemUgPSBzYW1wbGVTaXplOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBJbnRlcnBvbGFudC5wcm90b3R5cGUsIHsKCiAgICAJZXZhbHVhdGU6IGZ1bmN0aW9uICggdCApIHsKCiAgICAJCXZhciBwcCA9IHRoaXMucGFyYW1ldGVyUG9zaXRpb25zLAogICAgCQkJaTEgPSB0aGlzLl9jYWNoZWRJbmRleCwKCiAgICAJCQl0MSA9IHBwWyBpMSBdLAogICAgCQkJdDAgPSBwcFsgaTEgLSAxIF07CgogICAgCQl2YWxpZGF0ZV9pbnRlcnZhbDogewoKICAgIAkJCXNlZWs6IHsKCiAgICAJCQkJdmFyIHJpZ2h0OwoKICAgIAkJCQlsaW5lYXJfc2NhbjogewoKICAgIAkJCQkJLy8tIFNlZSBodHRwOi8vanNwZXJmLmNvbS9jb21wYXJpc29uLXRvLXVuZGVmaW5lZC8zCiAgICAJCQkJCS8vLSBzbG93ZXIgY29kZToKICAgIAkJCQkJLy8tCiAgICAJCQkJCS8vLSAJCQkJaWYgKCB0ID49IHQxIHx8IHQxID09PSB1bmRlZmluZWQgKSB7CiAgICAJCQkJCWZvcndhcmRfc2NhbjogaWYgKCAhICggdCA8IHQxICkgKSB7CgogICAgCQkJCQkJZm9yICggdmFyIGdpdmVVcEF0ID0gaTEgKyAyOyA7ICkgewoKICAgIAkJCQkJCQlpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJCQlpZiAoIHQgPCB0MCApIGJyZWFrIGZvcndhcmRfc2NhbjsKCiAgICAJCQkJCQkJCS8vIGFmdGVyIGVuZAoKICAgIAkJCQkJCQkJaTEgPSBwcC5sZW5ndGg7CiAgICAJCQkJCQkJCXRoaXMuX2NhY2hlZEluZGV4ID0gaTE7CiAgICAJCQkJCQkJCXJldHVybiB0aGlzLmFmdGVyRW5kXyggaTEgLSAxLCB0LCB0MCApOwoKICAgIAkJCQkJCQl9CgogICAgCQkJCQkJCWlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcAoKICAgIAkJCQkJCQl0MCA9IHQxOwogICAgCQkJCQkJCXQxID0gcHBbICsrIGkxIF07CgogICAgCQkJCQkJCWlmICggdCA8IHQxICkgewoKICAgIAkJCQkJCQkJLy8gd2UgaGF2ZSBhcnJpdmVkIGF0IHRoZSBzb3VnaHQgaW50ZXJ2YWwKICAgIAkJCQkJCQkJYnJlYWsgc2VlazsKCiAgICAJCQkJCQkJfQoKICAgIAkJCQkJCX0KCiAgICAJCQkJCQkvLyBwcmVwYXJlIGJpbmFyeSBzZWFyY2ggb24gdGhlIHJpZ2h0IHNpZGUgb2YgdGhlIGluZGV4CiAgICAJCQkJCQlyaWdodCA9IHBwLmxlbmd0aDsKICAgIAkJCQkJCWJyZWFrIGxpbmVhcl9zY2FuOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJLy8tIHNsb3dlciBjb2RlOgogICAgCQkJCQkvLy0JCQkJCWlmICggdCA8IHQwIHx8IHQwID09PSB1bmRlZmluZWQgKSB7CiAgICAJCQkJCWlmICggISAoIHQgPj0gdDAgKSApIHsKCiAgICAJCQkJCQkvLyBsb29waW5nPwoKICAgIAkJCQkJCXZhciB0MWdsb2JhbCA9IHBwWyAxIF07CgogICAgCQkJCQkJaWYgKCB0IDwgdDFnbG9iYWwgKSB7CgogICAgCQkJCQkJCWkxID0gMjsgLy8gKyAxLCB1c2luZyB0aGUgc2NhbiBmb3IgdGhlIGRldGFpbHMKICAgIAkJCQkJCQl0MCA9IHQxZ2xvYmFsOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCQkvLyBsaW5lYXIgcmV2ZXJzZSBzY2FuCgogICAgCQkJCQkJZm9yICggdmFyIGdpdmVVcEF0ID0gaTEgLSAyOyA7ICkgewoKICAgIAkJCQkJCQlpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJCQkvLyBiZWZvcmUgc3RhcnQKCiAgICAJCQkJCQkJCXRoaXMuX2NhY2hlZEluZGV4ID0gMDsKICAgIAkJCQkJCQkJcmV0dXJuIHRoaXMuYmVmb3JlU3RhcnRfKCAwLCB0LCB0MSApOwoKICAgIAkJCQkJCQl9CgogICAgCQkJCQkJCWlmICggaTEgPT09IGdpdmVVcEF0ICkgYnJlYWs7IC8vIHRoaXMgbG9vcAoKICAgIAkJCQkJCQl0MSA9IHQwOwogICAgCQkJCQkJCXQwID0gcHBbIC0tIGkxIC0gMSBdOwoKICAgIAkJCQkJCQlpZiAoIHQgPj0gdDAgKSB7CgogICAgCQkJCQkJCQkvLyB3ZSBoYXZlIGFycml2ZWQgYXQgdGhlIHNvdWdodCBpbnRlcnZhbAogICAgCQkJCQkJCQlicmVhayBzZWVrOwoKICAgIAkJCQkJCQl9CgogICAgCQkJCQkJfQoKICAgIAkJCQkJCS8vIHByZXBhcmUgYmluYXJ5IHNlYXJjaCBvbiB0aGUgbGVmdCBzaWRlIG9mIHRoZSBpbmRleAogICAgCQkJCQkJcmlnaHQgPSBpMTsKICAgIAkJCQkJCWkxID0gMDsKICAgIAkJCQkJCWJyZWFrIGxpbmVhcl9zY2FuOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJLy8gdGhlIGludGVydmFsIGlzIHZhbGlkCgogICAgCQkJCQlicmVhayB2YWxpZGF0ZV9pbnRlcnZhbDsKCiAgICAJCQkJfSAvLyBsaW5lYXIgc2NhbgoKICAgIAkJCQkvLyBiaW5hcnkgc2VhcmNoCgogICAgCQkJCXdoaWxlICggaTEgPCByaWdodCApIHsKCiAgICAJCQkJCXZhciBtaWQgPSAoIGkxICsgcmlnaHQgKSA+Pj4gMTsKCiAgICAJCQkJCWlmICggdCA8IHBwWyBtaWQgXSApIHsKCiAgICAJCQkJCQlyaWdodCA9IG1pZDsKCiAgICAJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJaTEgPSBtaWQgKyAxOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJCXQxID0gcHBbIGkxIF07CiAgICAJCQkJdDAgPSBwcFsgaTEgLSAxIF07CgogICAgCQkJCS8vIGNoZWNrIGJvdW5kYXJ5IGNhc2VzLCBhZ2FpbgoKICAgIAkJCQlpZiAoIHQwID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQl0aGlzLl9jYWNoZWRJbmRleCA9IDA7CiAgICAJCQkJCXJldHVybiB0aGlzLmJlZm9yZVN0YXJ0XyggMCwgdCwgdDEgKTsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIHQxID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQlpMSA9IHBwLmxlbmd0aDsKICAgIAkJCQkJdGhpcy5fY2FjaGVkSW5kZXggPSBpMTsKICAgIAkJCQkJcmV0dXJuIHRoaXMuYWZ0ZXJFbmRfKCBpMSAtIDEsIHQwLCB0ICk7CgogICAgCQkJCX0KCiAgICAJCQl9IC8vIHNlZWsKCiAgICAJCQl0aGlzLl9jYWNoZWRJbmRleCA9IGkxOwoKICAgIAkJCXRoaXMuaW50ZXJ2YWxDaGFuZ2VkXyggaTEsIHQwLCB0MSApOwoKICAgIAkJfSAvLyB2YWxpZGF0ZV9pbnRlcnZhbAoKICAgIAkJcmV0dXJuIHRoaXMuaW50ZXJwb2xhdGVfKCBpMSwgdDAsIHQsIHQxICk7CgogICAgCX0sCgogICAgCXNldHRpbmdzOiBudWxsLCAvLyBvcHRpb25hbCwgc3ViY2xhc3Mtc3BlY2lmaWMgc2V0dGluZ3Mgc3RydWN0dXJlCiAgICAJLy8gTm90ZTogVGhlIGluZGlyZWN0aW9uIGFsbG93cyBjZW50cmFsIGNvbnRyb2wgb2YgbWFueSBpbnRlcnBvbGFudHMuCgogICAgCS8vIC0tLSBQcm90ZWN0ZWQgaW50ZXJmYWNlCgogICAgCURlZmF1bHRTZXR0aW5nc186IHt9LAoKICAgIAlnZXRTZXR0aW5nc186IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLnNldHRpbmdzIHx8IHRoaXMuRGVmYXVsdFNldHRpbmdzXzsKCiAgICAJfSwKCiAgICAJY29weVNhbXBsZVZhbHVlXzogZnVuY3Rpb24gKCBpbmRleCApIHsKCiAgICAJCS8vIGNvcGllcyBhIHNhbXBsZSB2YWx1ZSB0byB0aGUgcmVzdWx0IGJ1ZmZlcgoKICAgIAkJdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLAogICAgCQkJdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsCiAgICAJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKICAgIAkJCW9mZnNldCA9IGluZGV4ICogc3RyaWRlOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CgogICAgCQkJcmVzdWx0WyBpIF0gPSB2YWx1ZXNbIG9mZnNldCArIGkgXTsKCiAgICAJCX0KCiAgICAJCXJldHVybiByZXN1bHQ7CgogICAgCX0sCgogICAgCS8vIFRlbXBsYXRlIG1ldGhvZHMgZm9yIGRlcml2ZWQgY2xhc3NlczoKCiAgICAJaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdCwgdDEgKi8gKSB7CgogICAgCQl0aHJvdyBuZXcgRXJyb3IoICdjYWxsIHRvIGFic3RyYWN0IG1ldGhvZCcgKTsKICAgIAkJLy8gaW1wbGVtZW50YXRpb25zIHNoYWxsIHJldHVybiB0aGlzLnJlc3VsdEJ1ZmZlcgoKICAgIAl9LAoKICAgIAlpbnRlcnZhbENoYW5nZWRfOiBmdW5jdGlvbiAoIC8qIGkxLCB0MCwgdDEgKi8gKSB7CgogICAgCQkvLyBlbXB0eQoKICAgIAl9CgogICAgfSApOwoKICAgIC8vIVwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICEKICAgIE9iamVjdC5hc3NpZ24oIEludGVycG9sYW50LnByb3RvdHlwZSwgewoKICAgIAkvLyggMCwgdCwgdDAgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlcgogICAgCWJlZm9yZVN0YXJ0XzogSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sCgogICAgCS8vKCBOLTEsIHROLTEsIHQgKSwgcmV0dXJucyB0aGlzLnJlc3VsdEJ1ZmZlcgogICAgCWFmdGVyRW5kXzogSW50ZXJwb2xhbnQucHJvdG90eXBlLmNvcHlTYW1wbGVWYWx1ZV8sCgogICAgfSApOwoKICAgIC8qKgogICAgICogRmFzdCBhbmQgc2ltcGxlIGN1YmljIHNwbGluZSBpbnRlcnBvbGFudC4KICAgICAqCiAgICAgKiBJdCB3YXMgZGVyaXZlZCBmcm9tIGEgSGVybWl0aWFuIGNvbnN0cnVjdGlvbiBzZXR0aW5nIHRoZSBmaXJzdCBkZXJpdmF0aXZlCiAgICAgKiBhdCBlYWNoIHNhbXBsZSBwb3NpdGlvbiB0byB0aGUgbGluZWFyIHNsb3BlIGJldHdlZW4gbmVpZ2hib3JpbmcgcG9zaXRpb25zCiAgICAgKiBvdmVyIHRoZWlyIHBhcmFtZXRlciBpbnRlcnZhbC4KICAgICAqCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBDdWJpY0ludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkgewoKICAgIAlJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7CgogICAgCXRoaXMuX3dlaWdodFByZXYgPSAtIDA7CiAgICAJdGhpcy5fb2Zmc2V0UHJldiA9IC0gMDsKICAgIAl0aGlzLl93ZWlnaHROZXh0ID0gLSAwOwogICAgCXRoaXMuX29mZnNldE5leHQgPSAtIDA7CgogICAgfQoKICAgIEN1YmljSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEN1YmljSW50ZXJwb2xhbnQsCgogICAgCURlZmF1bHRTZXR0aW5nc186IHsKCiAgICAJCWVuZGluZ1N0YXJ0OiBaZXJvQ3VydmF0dXJlRW5kaW5nLAogICAgCQllbmRpbmdFbmQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcKCiAgICAJfSwKCiAgICAJaW50ZXJ2YWxDaGFuZ2VkXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQxICkgewoKICAgIAkJdmFyIHBwID0gdGhpcy5wYXJhbWV0ZXJQb3NpdGlvbnMsCiAgICAJCQlpUHJldiA9IGkxIC0gMiwKICAgIAkJCWlOZXh0ID0gaTEgKyAxLAoKICAgIAkJCXRQcmV2ID0gcHBbIGlQcmV2IF0sCiAgICAJCQl0TmV4dCA9IHBwWyBpTmV4dCBdOwoKICAgIAkJaWYgKCB0UHJldiA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXN3aXRjaCAoIHRoaXMuZ2V0U2V0dGluZ3NfKCkuZW5kaW5nU3RhcnQgKSB7CgogICAgCQkJCWNhc2UgWmVyb1Nsb3BlRW5kaW5nOgoKICAgIAkJCQkJLy8gZicodDApID0gMAogICAgCQkJCQlpUHJldiA9IGkxOwogICAgCQkJCQl0UHJldiA9IDIgKiB0MCAtIHQxOwoKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgV3JhcEFyb3VuZEVuZGluZzoKCiAgICAJCQkJCS8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQogICAgCQkJCQlpUHJldiA9IHBwLmxlbmd0aCAtIDI7CiAgICAJCQkJCXRQcmV2ID0gdDAgKyBwcFsgaVByZXYgXSAtIHBwWyBpUHJldiArIDEgXTsKCiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQlkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCgogICAgCQkJCQkvLyBmJycodDApID0gMCBhLmsuYS4gTmF0dXJhbCBTcGxpbmUKICAgIAkJCQkJaVByZXYgPSBpMTsKICAgIAkJCQkJdFByZXYgPSB0MTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIHROZXh0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJc3dpdGNoICggdGhpcy5nZXRTZXR0aW5nc18oKS5lbmRpbmdFbmQgKSB7CgogICAgCQkJCWNhc2UgWmVyb1Nsb3BlRW5kaW5nOgoKICAgIAkJCQkJLy8gZicodE4pID0gMAogICAgCQkJCQlpTmV4dCA9IGkxOwogICAgCQkJCQl0TmV4dCA9IDIgKiB0MSAtIHQwOwoKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgV3JhcEFyb3VuZEVuZGluZzoKCiAgICAJCQkJCS8vIHVzZSB0aGUgb3RoZXIgZW5kIG9mIHRoZSBjdXJ2ZQogICAgCQkJCQlpTmV4dCA9IDE7CiAgICAJCQkJCXROZXh0ID0gdDEgKyBwcFsgMSBdIC0gcHBbIDAgXTsKCiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQlkZWZhdWx0OiAvLyBaZXJvQ3VydmF0dXJlRW5kaW5nCgogICAgCQkJCQkvLyBmJycodE4pID0gMCwgYS5rLmEuIE5hdHVyYWwgU3BsaW5lCiAgICAJCQkJCWlOZXh0ID0gaTEgLSAxOwogICAgCQkJCQl0TmV4dCA9IHQwOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBoYWxmRHQgPSAoIHQxIC0gdDAgKSAqIDAuNSwKICAgIAkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplOwoKICAgIAkJdGhpcy5fd2VpZ2h0UHJldiA9IGhhbGZEdCAvICggdDAgLSB0UHJldiApOwogICAgCQl0aGlzLl93ZWlnaHROZXh0ID0gaGFsZkR0IC8gKCB0TmV4dCAtIHQxICk7CiAgICAJCXRoaXMuX29mZnNldFByZXYgPSBpUHJldiAqIHN0cmlkZTsKICAgIAkJdGhpcy5fb2Zmc2V0TmV4dCA9IGlOZXh0ICogc3RyaWRlOwoKICAgIAl9LAoKICAgIAlpbnRlcnBvbGF0ZV86IGZ1bmN0aW9uICggaTEsIHQwLCB0LCB0MSApIHsKCiAgICAJCXZhciByZXN1bHQgPSB0aGlzLnJlc3VsdEJ1ZmZlciwKICAgIAkJCXZhbHVlcyA9IHRoaXMuc2FtcGxlVmFsdWVzLAogICAgCQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCgogICAgCQkJbzEgPSBpMSAqIHN0cmlkZSwJCW8wID0gbzEgLSBzdHJpZGUsCiAgICAJCQlvUCA9IHRoaXMuX29mZnNldFByZXYsIAlvTiA9IHRoaXMuX29mZnNldE5leHQsCiAgICAJCQl3UCA9IHRoaXMuX3dlaWdodFByZXYsCXdOID0gdGhpcy5fd2VpZ2h0TmV4dCwKCiAgICAJCQlwID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLAogICAgCQkJcHAgPSBwICogcCwKICAgIAkJCXBwcCA9IHBwICogcDsKCiAgICAJCS8vIGV2YWx1YXRlIHBvbHlub21pYWxzCgogICAgCQl2YXIgc1AgPSAtIHdQICogcHBwICsgMiAqIHdQICogcHAgLSB3UCAqIHA7CiAgICAJCXZhciBzMCA9ICggMSArIHdQICkgKiBwcHAgKyAoIC0gMS41IC0gMiAqIHdQICkgKiBwcCArICggLSAwLjUgKyB3UCApICogcCArIDE7CiAgICAJCXZhciBzMSA9ICggLSAxIC0gd04gKSAqIHBwcCArICggMS41ICsgd04gKSAqIHBwICsgMC41ICogcDsKICAgIAkJdmFyIHNOID0gd04gKiBwcHAgLSB3TiAqIHBwOwoKICAgIAkJLy8gY29tYmluZSBkYXRhIGxpbmVhcmx5CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHsKCiAgICAJCQlyZXN1bHRbIGkgXSA9CiAgICAJCQkJCXNQICogdmFsdWVzWyBvUCArIGkgXSArCiAgICAJCQkJCXMwICogdmFsdWVzWyBvMCArIGkgXSArCiAgICAJCQkJCXMxICogdmFsdWVzWyBvMSArIGkgXSArCiAgICAJCQkJCXNOICogdmFsdWVzWyBvTiArIGkgXTsKCiAgICAJCX0KCiAgICAJCXJldHVybiByZXN1bHQ7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBMaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKCiAgICAJSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOwoKICAgIH0KCiAgICBMaW5lYXJJbnRlcnBvbGFudC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcnBvbGFudC5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogTGluZWFySW50ZXJwb2xhbnQsCgogICAgCWludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSwgdDAsIHQsIHQxICkgewoKICAgIAkJdmFyIHJlc3VsdCA9IHRoaXMucmVzdWx0QnVmZmVyLAogICAgCQkJdmFsdWVzID0gdGhpcy5zYW1wbGVWYWx1ZXMsCiAgICAJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKCiAgICAJCQlvZmZzZXQxID0gaTEgKiBzdHJpZGUsCiAgICAJCQlvZmZzZXQwID0gb2Zmc2V0MSAtIHN0cmlkZSwKCiAgICAJCQl3ZWlnaHQxID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApLAogICAgCQkJd2VpZ2h0MCA9IDEgLSB3ZWlnaHQxOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CgogICAgCQkJcmVzdWx0WyBpIF0gPQogICAgCQkJCQl2YWx1ZXNbIG9mZnNldDAgKyBpIF0gKiB3ZWlnaHQwICsKICAgIAkJCQkJdmFsdWVzWyBvZmZzZXQxICsgaSBdICogd2VpZ2h0MTsKCiAgICAJCX0KCiAgICAJCXJldHVybiByZXN1bHQ7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogSW50ZXJwb2xhbnQgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIHNhbXBsZSB2YWx1ZSBhdCB0aGUgcG9zaXRpb24gcHJlY2VlZGluZwogICAgICogdGhlIHBhcmFtZXRlci4KICAgICAqCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBEaXNjcmV0ZUludGVycG9sYW50KCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICkgewoKICAgIAlJbnRlcnBvbGFudC5jYWxsKCB0aGlzLCBwYXJhbWV0ZXJQb3NpdGlvbnMsIHNhbXBsZVZhbHVlcywgc2FtcGxlU2l6ZSwgcmVzdWx0QnVmZmVyICk7CgogICAgfQoKICAgIERpc2NyZXRlSW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IERpc2NyZXRlSW50ZXJwb2xhbnQsCgogICAgCWludGVycG9sYXRlXzogZnVuY3Rpb24gKCBpMSAvKiwgdDAsIHQsIHQxICovICkgewoKICAgIAkJcmV0dXJuIHRoaXMuY29weVNhbXBsZVZhbHVlXyggaTEgLSAxICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogQSB0aW1lZCBzZXF1ZW5jZSBvZiBrZXlmcmFtZXMgZm9yIGEgc3BlY2lmaWMgcHJvcGVydHkuCiAgICAgKgogICAgICoKICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCiAgICAgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqLwoKICAgIGZ1bmN0aW9uIEtleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKSB7CgogICAgCWlmICggbmFtZSA9PT0gdW5kZWZpbmVkICkgdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogdHJhY2sgbmFtZSBpcyB1bmRlZmluZWQnICk7CiAgICAJaWYgKCB0aW1lcyA9PT0gdW5kZWZpbmVkIHx8IHRpbWVzLmxlbmd0aCA9PT0gMCApIHRocm93IG5ldyBFcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IG5vIGtleWZyYW1lcyBpbiB0cmFjayBuYW1lZCAnICsgbmFtZSApOwoKICAgIAl0aGlzLm5hbWUgPSBuYW1lOwoKICAgIAl0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB0aW1lcywgdGhpcy5UaW1lQnVmZmVyVHlwZSApOwogICAgCXRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuY29udmVydEFycmF5KCB2YWx1ZXMsIHRoaXMuVmFsdWVCdWZmZXJUeXBlICk7CgogICAgCXRoaXMuc2V0SW50ZXJwb2xhdGlvbiggaW50ZXJwb2xhdGlvbiB8fCB0aGlzLkRlZmF1bHRJbnRlcnBvbGF0aW9uICk7CgogICAgfQoKICAgIC8vIFN0YXRpYyBtZXRob2RzCgogICAgT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjaywgewoKICAgIAkvLyBTZXJpYWxpemF0aW9uIChpbiBzdGF0aWMgY29udGV4dCwgYmVjYXVzZSBvZiBjb25zdHJ1Y3RvciBpbnZvY2F0aW9uCiAgICAJLy8gYW5kIGF1dG9tYXRpYyBpbnZvY2F0aW9uIG9mIC50b0pTT04pOgoKICAgIAl0b0pTT046IGZ1bmN0aW9uICggdHJhY2sgKSB7CgogICAgCQl2YXIgdHJhY2tUeXBlID0gdHJhY2suY29uc3RydWN0b3I7CgogICAgCQl2YXIganNvbjsKCiAgICAJCS8vIGRlcml2ZWQgY2xhc3NlcyBjYW4gZGVmaW5lIGEgc3RhdGljIHRvSlNPTiBtZXRob2QKICAgIAkJaWYgKCB0cmFja1R5cGUudG9KU09OICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJanNvbiA9IHRyYWNrVHlwZS50b0pTT04oIHRyYWNrICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGJ5IGRlZmF1bHQsIHdlIGFzc3VtZSB0aGUgZGF0YSBjYW4gYmUgc2VyaWFsaXplZCBhcy1pcwogICAgCQkJanNvbiA9IHsKCiAgICAJCQkJJ25hbWUnOiB0cmFjay5uYW1lLAogICAgCQkJCSd0aW1lcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudGltZXMsIEFycmF5ICksCiAgICAJCQkJJ3ZhbHVlcyc6IEFuaW1hdGlvblV0aWxzLmNvbnZlcnRBcnJheSggdHJhY2sudmFsdWVzLCBBcnJheSApCgogICAgCQkJfTsKCiAgICAJCQl2YXIgaW50ZXJwb2xhdGlvbiA9IHRyYWNrLmdldEludGVycG9sYXRpb24oKTsKCiAgICAJCQlpZiAoIGludGVycG9sYXRpb24gIT09IHRyYWNrLkRlZmF1bHRJbnRlcnBvbGF0aW9uICkgewoKICAgIAkJCQlqc29uLmludGVycG9sYXRpb24gPSBpbnRlcnBvbGF0aW9uOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWpzb24udHlwZSA9IHRyYWNrLlZhbHVlVHlwZU5hbWU7IC8vIG1hbmRhdG9yeQoKICAgIAkJcmV0dXJuIGpzb247CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUsIHsKCiAgICAJY29uc3RydWN0b3I6IEtleWZyYW1lVHJhY2ssCgogICAgCVRpbWVCdWZmZXJUeXBlOiBGbG9hdDMyQXJyYXksCgogICAgCVZhbHVlQnVmZmVyVHlwZTogRmxvYXQzMkFycmF5LAoKICAgIAlEZWZhdWx0SW50ZXJwb2xhdGlvbjogSW50ZXJwb2xhdGVMaW5lYXIsCgogICAgCUludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOiBmdW5jdGlvbiAoIHJlc3VsdCApIHsKCiAgICAJCXJldHVybiBuZXcgRGlzY3JldGVJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApOwoKICAgIAl9LAoKICAgIAlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkgewoKICAgIAkJcmV0dXJuIG5ldyBMaW5lYXJJbnRlcnBvbGFudCggdGhpcy50aW1lcywgdGhpcy52YWx1ZXMsIHRoaXMuZ2V0VmFsdWVTaXplKCksIHJlc3VsdCApOwoKICAgIAl9LAoKICAgIAlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IGZ1bmN0aW9uICggcmVzdWx0ICkgewoKICAgIAkJcmV0dXJuIG5ldyBDdWJpY0ludGVycG9sYW50KCB0aGlzLnRpbWVzLCB0aGlzLnZhbHVlcywgdGhpcy5nZXRWYWx1ZVNpemUoKSwgcmVzdWx0ICk7CgogICAgCX0sCgogICAgCXNldEludGVycG9sYXRpb246IGZ1bmN0aW9uICggaW50ZXJwb2xhdGlvbiApIHsKCiAgICAJCXZhciBmYWN0b3J5TWV0aG9kOwoKICAgIAkJc3dpdGNoICggaW50ZXJwb2xhdGlvbiApIHsKCiAgICAJCQljYXNlIEludGVycG9sYXRlRGlzY3JldGU6CgogICAgCQkJCWZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZERpc2NyZXRlOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIEludGVycG9sYXRlTGluZWFyOgoKICAgIAkJCQlmYWN0b3J5TWV0aG9kID0gdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgSW50ZXJwb2xhdGVTbW9vdGg6CgogICAgCQkJCWZhY3RvcnlNZXRob2QgPSB0aGlzLkludGVycG9sYW50RmFjdG9yeU1ldGhvZFNtb290aDsKCiAgICAJCQkJYnJlYWs7CgogICAgCQl9CgogICAgCQlpZiAoIGZhY3RvcnlNZXRob2QgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl2YXIgbWVzc2FnZSA9ICJ1bnN1cHBvcnRlZCBpbnRlcnBvbGF0aW9uIGZvciAiICsKICAgIAkJCQl0aGlzLlZhbHVlVHlwZU5hbWUgKyAiIGtleWZyYW1lIHRyYWNrIG5hbWVkICIgKyB0aGlzLm5hbWU7CgogICAgCQkJaWYgKCB0aGlzLmNyZWF0ZUludGVycG9sYW50ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCS8vIGZhbGwgYmFjayB0byBkZWZhdWx0LCB1bmxlc3MgdGhlIGRlZmF1bHQgaXRzZWxmIGlzIG1lc3NlZCB1cAogICAgCQkJCWlmICggaW50ZXJwb2xhdGlvbiAhPT0gdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApIHsKCiAgICAJCQkJCXRoaXMuc2V0SW50ZXJwb2xhdGlvbiggdGhpcy5EZWZhdWx0SW50ZXJwb2xhdGlvbiApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJdGhyb3cgbmV3IEVycm9yKCBtZXNzYWdlICk7IC8vIGZhdGFsLCBpbiB0aGlzIGNhc2UKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5LZXlmcmFtZVRyYWNrOicsIG1lc3NhZ2UgKTsKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQoKICAgIAkJdGhpcy5jcmVhdGVJbnRlcnBvbGFudCA9IGZhY3RvcnlNZXRob2Q7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0SW50ZXJwb2xhdGlvbjogZnVuY3Rpb24gKCkgewoKICAgIAkJc3dpdGNoICggdGhpcy5jcmVhdGVJbnRlcnBvbGFudCApIHsKCiAgICAJCQljYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kRGlzY3JldGU6CgogICAgCQkJCXJldHVybiBJbnRlcnBvbGF0ZURpc2NyZXRlOwoKICAgIAkJCWNhc2UgdGhpcy5JbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6CgogICAgCQkJCXJldHVybiBJbnRlcnBvbGF0ZUxpbmVhcjsKCiAgICAJCQljYXNlIHRoaXMuSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOgoKICAgIAkJCQlyZXR1cm4gSW50ZXJwb2xhdGVTbW9vdGg7CgogICAgCQl9CgogICAgCX0sCgogICAgCWdldFZhbHVlU2l6ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aCAvIHRoaXMudGltZXMubGVuZ3RoOwoKICAgIAl9LAoKICAgIAkvLyBtb3ZlIGFsbCBrZXlmcmFtZXMgZWl0aGVyIGZvcndhcmRzIG9yIGJhY2t3YXJkcyBpbiB0aW1lCiAgICAJc2hpZnQ6IGZ1bmN0aW9uICggdGltZU9mZnNldCApIHsKCiAgICAJCWlmICggdGltZU9mZnNldCAhPT0gMC4wICkgewoKICAgIAkJCXZhciB0aW1lcyA9IHRoaXMudGltZXM7CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCQl0aW1lc1sgaSBdICs9IHRpbWVPZmZzZXQ7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCS8vIHNjYWxlIGFsbCBrZXlmcmFtZSB0aW1lcyBieSBhIGZhY3RvciAodXNlZnVsIGZvciBmcmFtZSA8LT4gc2Vjb25kcyBjb252ZXJzaW9ucykKICAgIAlzY2FsZTogZnVuY3Rpb24gKCB0aW1lU2NhbGUgKSB7CgogICAgCQlpZiAoIHRpbWVTY2FsZSAhPT0gMS4wICkgewoKICAgIAkJCXZhciB0aW1lcyA9IHRoaXMudGltZXM7CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBuID0gdGltZXMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCQl0aW1lc1sgaSBdICo9IHRpbWVTY2FsZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJLy8gcmVtb3ZlcyBrZXlmcmFtZXMgYmVmb3JlIGFuZCBhZnRlciBhbmltYXRpb24gd2l0aG91dCBjaGFuZ2luZyBhbnkgdmFsdWVzIHdpdGhpbiB0aGUgcmFuZ2UgW3N0YXJ0VGltZSwgZW5kVGltZV0uCiAgICAJLy8gSU1QT1JUQU5UOiBXZSBkbyBub3Qgc2hpZnQgYXJvdW5kIGtleXMgdG8gdGhlIHN0YXJ0IG9mIHRoZSB0cmFjayB0aW1lLCBiZWNhdXNlIGZvciBpbnRlcnBvbGF0ZWQga2V5cyB0aGlzIHdpbGwgY2hhbmdlIHRoZWlyIHZhbHVlcwogICAgCXRyaW06IGZ1bmN0aW9uICggc3RhcnRUaW1lLCBlbmRUaW1lICkgewoKICAgIAkJdmFyIHRpbWVzID0gdGhpcy50aW1lcywKICAgIAkJCW5LZXlzID0gdGltZXMubGVuZ3RoLAogICAgCQkJZnJvbSA9IDAsCiAgICAJCQl0byA9IG5LZXlzIC0gMTsKCiAgICAJCXdoaWxlICggZnJvbSAhPT0gbktleXMgJiYgdGltZXNbIGZyb20gXSA8IHN0YXJ0VGltZSApIHsKCiAgICAJCQkrKyBmcm9tOwoKICAgIAkJfQoKICAgIAkJd2hpbGUgKCB0byAhPT0gLSAxICYmIHRpbWVzWyB0byBdID4gZW5kVGltZSApIHsKCiAgICAJCQktLSB0bzsKCiAgICAJCX0KCiAgICAJCSsrIHRvOyAvLyBpbmNsdXNpdmUgLT4gZXhjbHVzaXZlIGJvdW5kCgogICAgCQlpZiAoIGZyb20gIT09IDAgfHwgdG8gIT09IG5LZXlzICkgewoKICAgIAkJCS8vIGVtcHR5IHRyYWNrcyBhcmUgZm9yYmlkZGVuLCBzbyBrZWVwIGF0IGxlYXN0IG9uZSBrZXlmcmFtZQogICAgCQkJaWYgKCBmcm9tID49IHRvICkgdG8gPSBNYXRoLm1heCggdG8sIDEgKSwgZnJvbSA9IHRvIC0gMTsKCiAgICAJCQl2YXIgc3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKTsKICAgIAkJCXRoaXMudGltZXMgPSBBbmltYXRpb25VdGlscy5hcnJheVNsaWNlKCB0aW1lcywgZnJvbSwgdG8gKTsKICAgIAkJCXRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGhpcy52YWx1ZXMsIGZyb20gKiBzdHJpZGUsIHRvICogc3RyaWRlICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJLy8gZW5zdXJlIHdlIGRvIG5vdCBnZXQgYSBHYXJiYWdlSW5HYXJiYWdlT3V0IHNpdHVhdGlvbiwgbWFrZSBzdXJlIHRyYWNrcyBhcmUgYXQgbGVhc3QgbWluaW1hbGx5IHZpYWJsZQogICAgCXZhbGlkYXRlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdmFsaWQgPSB0cnVlOwoKICAgIAkJdmFyIHZhbHVlU2l6ZSA9IHRoaXMuZ2V0VmFsdWVTaXplKCk7CiAgICAJCWlmICggdmFsdWVTaXplIC0gTWF0aC5mbG9vciggdmFsdWVTaXplICkgIT09IDAgKSB7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IEludmFsaWQgdmFsdWUgc2l6ZSBpbiB0cmFjay4nLCB0aGlzICk7CiAgICAJCQl2YWxpZCA9IGZhbHNlOwoKICAgIAkJfQoKICAgIAkJdmFyIHRpbWVzID0gdGhpcy50aW1lcywKICAgIAkJCXZhbHVlcyA9IHRoaXMudmFsdWVzLAoKICAgIAkJCW5LZXlzID0gdGltZXMubGVuZ3RoOwoKICAgIAkJaWYgKCBuS2V5cyA9PT0gMCApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVHJhY2sgaXMgZW1wdHkuJywgdGhpcyApOwogICAgCQkJdmFsaWQgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCXZhciBwcmV2VGltZSA9IG51bGw7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5LZXlzOyBpICsrICkgewoKICAgIAkJCXZhciBjdXJyVGltZSA9IHRpbWVzWyBpIF07CgogICAgCQkJaWYgKCB0eXBlb2YgY3VyclRpbWUgPT09ICdudW1iZXInICYmIGlzTmFOKCBjdXJyVGltZSApICkgewoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVGltZSBpcyBub3QgYSB2YWxpZCBudW1iZXIuJywgdGhpcywgaSwgY3VyclRpbWUgKTsKICAgIAkJCQl2YWxpZCA9IGZhbHNlOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCX0KCiAgICAJCQlpZiAoIHByZXZUaW1lICE9PSBudWxsICYmIHByZXZUaW1lID4gY3VyclRpbWUgKSB7CgogICAgCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiBPdXQgb2Ygb3JkZXIga2V5cy4nLCB0aGlzLCBpLCBjdXJyVGltZSwgcHJldlRpbWUgKTsKICAgIAkJCQl2YWxpZCA9IGZhbHNlOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCX0KCiAgICAJCQlwcmV2VGltZSA9IGN1cnJUaW1lOwoKICAgIAkJfQoKICAgIAkJaWYgKCB2YWx1ZXMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlpZiAoIEFuaW1hdGlvblV0aWxzLmlzVHlwZWRBcnJheSggdmFsdWVzICkgKSB7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IHZhbHVlcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJCQl2YXIgdmFsdWUgPSB2YWx1ZXNbIGkgXTsKCiAgICAJCQkJCWlmICggaXNOYU4oIHZhbHVlICkgKSB7CgogICAgCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLktleWZyYW1lVHJhY2s6IFZhbHVlIGlzIG5vdCBhIHZhbGlkIG51bWJlci4nLCB0aGlzLCBpLCB2YWx1ZSApOwogICAgCQkJCQkJdmFsaWQgPSBmYWxzZTsKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHZhbGlkOwoKICAgIAl9LAoKICAgIAkvLyByZW1vdmVzIGVxdWl2YWxlbnQgc2VxdWVudGlhbCBrZXlzIGFzIGNvbW1vbiBpbiBtb3JwaCB0YXJnZXQgc2VxdWVuY2VzCiAgICAJLy8gKDAsMCwwLDAsMSwxLDEsMCwwLDAsMCwwLDAsMCkgLS0+ICgwLDAsMSwxLDAsMCkKICAgIAlvcHRpbWl6ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIHRpbWVzID0gdGhpcy50aW1lcywKICAgIAkJCXZhbHVlcyA9IHRoaXMudmFsdWVzLAogICAgCQkJc3RyaWRlID0gdGhpcy5nZXRWYWx1ZVNpemUoKSwKCiAgICAJCQlzbW9vdGhJbnRlcnBvbGF0aW9uID0gdGhpcy5nZXRJbnRlcnBvbGF0aW9uKCkgPT09IEludGVycG9sYXRlU21vb3RoLAoKICAgIAkJCXdyaXRlSW5kZXggPSAxLAogICAgCQkJbGFzdEluZGV4ID0gdGltZXMubGVuZ3RoIC0gMTsKCiAgICAJCWZvciAoIHZhciBpID0gMTsgaSA8IGxhc3RJbmRleDsgKysgaSApIHsKCiAgICAJCQl2YXIga2VlcCA9IGZhbHNlOwoKICAgIAkJCXZhciB0aW1lID0gdGltZXNbIGkgXTsKICAgIAkJCXZhciB0aW1lTmV4dCA9IHRpbWVzWyBpICsgMSBdOwoKICAgIAkJCS8vIHJlbW92ZSBhZGphY2VudCBrZXlmcmFtZXMgc2NoZWR1bGVkIGF0IHRoZSBzYW1lIHRpbWUKCiAgICAJCQlpZiAoIHRpbWUgIT09IHRpbWVOZXh0ICYmICggaSAhPT0gMSB8fCB0aW1lICE9PSB0aW1lWyAwIF0gKSApIHsKCiAgICAJCQkJaWYgKCAhIHNtb290aEludGVycG9sYXRpb24gKSB7CgogICAgCQkJCQkvLyByZW1vdmUgdW5uZWNlc3Nhcnkga2V5ZnJhbWVzIHNhbWUgYXMgdGhlaXIgbmVpZ2hib3JzCgogICAgCQkJCQl2YXIgb2Zmc2V0ID0gaSAqIHN0cmlkZSwKICAgIAkJCQkJCW9mZnNldFAgPSBvZmZzZXQgLSBzdHJpZGUsCiAgICAJCQkJCQlvZmZzZXROID0gb2Zmc2V0ICsgc3RyaWRlOwoKICAgIAkJCQkJZm9yICggdmFyIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7CgogICAgCQkJCQkJdmFyIHZhbHVlID0gdmFsdWVzWyBvZmZzZXQgKyBqIF07CgogICAgCQkJCQkJaWYgKCB2YWx1ZSAhPT0gdmFsdWVzWyBvZmZzZXRQICsgaiBdIHx8CiAgICAJCQkJCQkJdmFsdWUgIT09IHZhbHVlc1sgb2Zmc2V0TiArIGogXSApIHsKCiAgICAJCQkJCQkJa2VlcCA9IHRydWU7CiAgICAJCQkJCQkJYnJlYWs7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJa2VlcCA9IHRydWU7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJLy8gaW4tcGxhY2UgY29tcGFjdGlvbgoKICAgIAkJCWlmICgga2VlcCApIHsKCiAgICAJCQkJaWYgKCBpICE9PSB3cml0ZUluZGV4ICkgewoKICAgIAkJCQkJdGltZXNbIHdyaXRlSW5kZXggXSA9IHRpbWVzWyBpIF07CgogICAgCQkJCQl2YXIgcmVhZE9mZnNldCA9IGkgKiBzdHJpZGUsCiAgICAJCQkJCQl3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGU7CgogICAgCQkJCQlmb3IgKCB2YXIgaiA9IDA7IGogIT09IHN0cmlkZTsgKysgaiApIHsKCiAgICAJCQkJCQl2YWx1ZXNbIHdyaXRlT2Zmc2V0ICsgaiBdID0gdmFsdWVzWyByZWFkT2Zmc2V0ICsgaiBdOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJCSsrIHdyaXRlSW5kZXg7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy8gZmx1c2ggbGFzdCBrZXlmcmFtZSAoY29tcGFjdGlvbiBsb29rcyBhaGVhZCkKCiAgICAJCWlmICggbGFzdEluZGV4ID4gMCApIHsKCiAgICAJCQl0aW1lc1sgd3JpdGVJbmRleCBdID0gdGltZXNbIGxhc3RJbmRleCBdOwoKICAgIAkJCWZvciAoIHZhciByZWFkT2Zmc2V0ID0gbGFzdEluZGV4ICogc3RyaWRlLCB3cml0ZU9mZnNldCA9IHdyaXRlSW5kZXggKiBzdHJpZGUsIGogPSAwOyBqICE9PSBzdHJpZGU7ICsrIGogKSB7CgogICAgCQkJCXZhbHVlc1sgd3JpdGVPZmZzZXQgKyBqIF0gPSB2YWx1ZXNbIHJlYWRPZmZzZXQgKyBqIF07CgogICAgCQkJfQoKICAgIAkJCSsrIHdyaXRlSW5kZXg7CgogICAgCQl9CgogICAgCQlpZiAoIHdyaXRlSW5kZXggIT09IHRpbWVzLmxlbmd0aCApIHsKCiAgICAJCQl0aGlzLnRpbWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdGltZXMsIDAsIHdyaXRlSW5kZXggKTsKICAgIAkJCXRoaXMudmFsdWVzID0gQW5pbWF0aW9uVXRpbHMuYXJyYXlTbGljZSggdmFsdWVzLCAwLCB3cml0ZUluZGV4ICogc3RyaWRlICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciB0aW1lcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudGltZXMsIDAgKTsKICAgIAkJdmFyIHZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLmFycmF5U2xpY2UoIHRoaXMudmFsdWVzLCAwICk7CgogICAgCQl2YXIgVHlwZWRLZXlmcmFtZVRyYWNrID0gdGhpcy5jb25zdHJ1Y3RvcjsKICAgIAkJdmFyIHRyYWNrID0gbmV3IFR5cGVkS2V5ZnJhbWVUcmFjayggdGhpcy5uYW1lLCB0aW1lcywgdmFsdWVzICk7CgogICAgCQkvLyBJbnRlcnBvbGFudCBhcmd1bWVudCB0byBjb25zdHJ1Y3RvciBpcyBub3Qgc2F2ZWQsIHNvIGNvcHkgdGhlIGZhY3RvcnkgbWV0aG9kIGRpcmVjdGx5LgogICAgCQl0cmFjay5jcmVhdGVJbnRlcnBvbGFudCA9IHRoaXMuY3JlYXRlSW50ZXJwb2xhbnQ7CgogICAgCQlyZXR1cm4gdHJhY2s7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogQSBUcmFjayBvZiBCb29sZWFuIGtleWZyYW1lIHZhbHVlcy4KICAgICAqCiAgICAgKgogICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwogICAgICogQGF1dGhvciB0c2NodwogICAgICovCgogICAgZnVuY3Rpb24gQm9vbGVhbktleWZyYW1lVHJhY2soIG5hbWUsIHRpbWVzLCB2YWx1ZXMgKSB7CgogICAgCUtleWZyYW1lVHJhY2suY2FsbCggdGhpcywgbmFtZSwgdGltZXMsIHZhbHVlcyApOwoKICAgIH0KCiAgICBCb29sZWFuS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBCb29sZWFuS2V5ZnJhbWVUcmFjaywKCiAgICAJVmFsdWVUeXBlTmFtZTogJ2Jvb2wnLAogICAgCVZhbHVlQnVmZmVyVHlwZTogQXJyYXksCgogICAgCURlZmF1bHRJbnRlcnBvbGF0aW9uOiBJbnRlcnBvbGF0ZURpc2NyZXRlLAoKICAgIAlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IHVuZGVmaW5lZCwKICAgIAlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZAoKICAgIAkvLyBOb3RlOiBBY3R1YWxseSB0aGlzIHRyYWNrIGNvdWxkIGhhdmUgYSBvcHRpbWl6ZWQgLyBjb21wcmVzc2VkCiAgICAJLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgdmFsdWUgYW5kIGEgY3VzdG9tIGludGVycG9sYW50IHRoYXQKICAgIAkvLyBjb21wdXRlcyAiZmlyc3RWYWx1ZSBeIGlzT2RkKCBpbmRleCApIi4KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogQSBUcmFjayBvZiBrZXlmcmFtZSB2YWx1ZXMgdGhhdCByZXByZXNlbnQgY29sb3IuCiAgICAgKgogICAgICoKICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCiAgICAgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqLwoKICAgIGZ1bmN0aW9uIENvbG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKCiAgICAJS2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CgogICAgfQoKICAgIENvbG9yS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBDb2xvcktleWZyYW1lVHJhY2ssCgogICAgCVZhbHVlVHlwZU5hbWU6ICdjb2xvcicKCiAgICAJLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAoKICAgIAkvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWQKCiAgICAJLy8gTm90ZTogVmVyeSBiYXNpYyBpbXBsZW1lbnRhdGlvbiBhbmQgbm90aGluZyBzcGVjaWFsIHlldC4KICAgIAkvLyBIb3dldmVyLCB0aGlzIGlzIHRoZSBwbGFjZSBmb3IgY29sb3Igc3BhY2UgcGFyYW1ldGVyaXphdGlvbi4KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogQSBUcmFjayBvZiBudW1lcmljIGtleWZyYW1lIHZhbHVlcy4KICAgICAqCiAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwogICAgICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBOdW1iZXJLZXlmcmFtZVRyYWNrKCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICkgewoKICAgIAlLZXlmcmFtZVRyYWNrLmNhbGwoIHRoaXMsIG5hbWUsIHRpbWVzLCB2YWx1ZXMsIGludGVycG9sYXRpb24gKTsKCiAgICB9CgogICAgTnVtYmVyS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBLZXlmcmFtZVRyYWNrLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBOdW1iZXJLZXlmcmFtZVRyYWNrLAoKICAgIAlWYWx1ZVR5cGVOYW1lOiAnbnVtYmVyJwoKICAgIAkvLyBWYWx1ZUJ1ZmZlclR5cGUgaXMgaW5oZXJpdGVkCgogICAgCS8vIERlZmF1bHRJbnRlcnBvbGF0aW9uIGlzIGluaGVyaXRlZAoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIFNwaGVyaWNhbCBsaW5lYXIgdW5pdCBxdWF0ZXJuaW9uIGludGVycG9sYW50LgogICAgICoKICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqLwoKICAgIGZ1bmN0aW9uIFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCggcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApIHsKCiAgICAJSW50ZXJwb2xhbnQuY2FsbCggdGhpcywgcGFyYW1ldGVyUG9zaXRpb25zLCBzYW1wbGVWYWx1ZXMsIHNhbXBsZVNpemUsIHJlc3VsdEJ1ZmZlciApOwoKICAgIH0KCiAgICBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggSW50ZXJwb2xhbnQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFF1YXRlcm5pb25MaW5lYXJJbnRlcnBvbGFudCwKCiAgICAJaW50ZXJwb2xhdGVfOiBmdW5jdGlvbiAoIGkxLCB0MCwgdCwgdDEgKSB7CgogICAgCQl2YXIgcmVzdWx0ID0gdGhpcy5yZXN1bHRCdWZmZXIsCiAgICAJCQl2YWx1ZXMgPSB0aGlzLnNhbXBsZVZhbHVlcywKICAgIAkJCXN0cmlkZSA9IHRoaXMudmFsdWVTaXplLAoKICAgIAkJCW9mZnNldCA9IGkxICogc3RyaWRlLAoKICAgIAkJCWFscGhhID0gKCB0IC0gdDAgKSAvICggdDEgLSB0MCApOwoKICAgIAkJZm9yICggdmFyIGVuZCA9IG9mZnNldCArIHN0cmlkZTsgb2Zmc2V0ICE9PSBlbmQ7IG9mZnNldCArPSA0ICkgewoKICAgIAkJCVF1YXRlcm5pb24uc2xlcnBGbGF0KCByZXN1bHQsIDAsIHZhbHVlcywgb2Zmc2V0IC0gc3RyaWRlLCB2YWx1ZXMsIG9mZnNldCwgYWxwaGEgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiByZXN1bHQ7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogQSBUcmFjayBvZiBxdWF0ZXJuaW9uIGtleWZyYW1lIHZhbHVlcy4KICAgICAqCiAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwogICAgICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKCiAgICAJS2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CgogICAgfQoKICAgIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEtleWZyYW1lVHJhY2sucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLAoKICAgIAlWYWx1ZVR5cGVOYW1lOiAncXVhdGVybmlvbicsCgogICAgCS8vIFZhbHVlQnVmZmVyVHlwZSBpcyBpbmhlcml0ZWQKCiAgICAJRGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlTGluZWFyLAoKICAgIAlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RMaW5lYXI6IGZ1bmN0aW9uICggcmVzdWx0ICkgewoKICAgIAkJcmV0dXJuIG5ldyBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQoIHRoaXMudGltZXMsIHRoaXMudmFsdWVzLCB0aGlzLmdldFZhbHVlU2l6ZSgpLCByZXN1bHQgKTsKCiAgICAJfSwKCiAgICAJSW50ZXJwb2xhbnRGYWN0b3J5TWV0aG9kU21vb3RoOiB1bmRlZmluZWQgLy8gbm90IHlldCBpbXBsZW1lbnRlZAoKICAgIH0gKTsKCiAgICAvKioKICAgICAqCiAgICAgKiBBIFRyYWNrIHRoYXQgaW50ZXJwb2xhdGVzIFN0cmluZ3MKICAgICAqCiAgICAgKgogICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwogICAgICogQGF1dGhvciB0c2NodwogICAgICovCgogICAgZnVuY3Rpb24gU3RyaW5nS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKCiAgICAJS2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CgogICAgfQoKICAgIFN0cmluZ0tleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogU3RyaW5nS2V5ZnJhbWVUcmFjaywKCiAgICAJVmFsdWVUeXBlTmFtZTogJ3N0cmluZycsCiAgICAJVmFsdWVCdWZmZXJUeXBlOiBBcnJheSwKCiAgICAJRGVmYXVsdEludGVycG9sYXRpb246IEludGVycG9sYXRlRGlzY3JldGUsCgogICAgCUludGVycG9sYW50RmFjdG9yeU1ldGhvZExpbmVhcjogdW5kZWZpbmVkLAoKICAgIAlJbnRlcnBvbGFudEZhY3RvcnlNZXRob2RTbW9vdGg6IHVuZGVmaW5lZAoKICAgIH0gKTsKCiAgICAvKioKICAgICAqCiAgICAgKiBBIFRyYWNrIG9mIHZlY3RvcmVkIGtleWZyYW1lIHZhbHVlcy4KICAgICAqCiAgICAgKgogICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwogICAgICogQGF1dGhvciB0c2NodwogICAgICovCgogICAgZnVuY3Rpb24gVmVjdG9yS2V5ZnJhbWVUcmFjayggbmFtZSwgdGltZXMsIHZhbHVlcywgaW50ZXJwb2xhdGlvbiApIHsKCiAgICAJS2V5ZnJhbWVUcmFjay5jYWxsKCB0aGlzLCBuYW1lLCB0aW1lcywgdmFsdWVzLCBpbnRlcnBvbGF0aW9uICk7CgogICAgfQoKICAgIFZlY3RvcktleWZyYW1lVHJhY2sucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggS2V5ZnJhbWVUcmFjay5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogVmVjdG9yS2V5ZnJhbWVUcmFjaywKCiAgICAJVmFsdWVUeXBlTmFtZTogJ3ZlY3RvcicKCiAgICAJLy8gVmFsdWVCdWZmZXJUeXBlIGlzIGluaGVyaXRlZAoKICAgIAkvLyBEZWZhdWx0SW50ZXJwb2xhdGlvbiBpcyBpbmhlcml0ZWQKCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogUmV1c2FibGUgc2V0IG9mIFRyYWNrcyB0aGF0IHJlcHJlc2VudCBhbiBhbmltYXRpb24uCiAgICAgKgogICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwogICAgICovCgogICAgZnVuY3Rpb24gQW5pbWF0aW9uQ2xpcCggbmFtZSwgZHVyYXRpb24sIHRyYWNrcyApIHsKCiAgICAJdGhpcy5uYW1lID0gbmFtZTsKICAgIAl0aGlzLnRyYWNrcyA9IHRyYWNrczsKICAgIAl0aGlzLmR1cmF0aW9uID0gKCBkdXJhdGlvbiAhPT0gdW5kZWZpbmVkICkgPyBkdXJhdGlvbiA6IC0gMTsKCiAgICAJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgogICAgCS8vIHRoaXMgbWVhbnMgaXQgc2hvdWxkIGZpZ3VyZSBvdXQgaXRzIGR1cmF0aW9uIGJ5IHNjYW5uaW5nIHRoZSB0cmFja3MKICAgIAlpZiAoIHRoaXMuZHVyYXRpb24gPCAwICkgewoKICAgIAkJdGhpcy5yZXNldER1cmF0aW9uKCk7CgogICAgCX0KCiAgICB9CgogICAgZnVuY3Rpb24gZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSggdHlwZU5hbWUgKSB7CgogICAgCXN3aXRjaCAoIHR5cGVOYW1lLnRvTG93ZXJDYXNlKCkgKSB7CgogICAgCQljYXNlICdzY2FsYXInOgogICAgCQljYXNlICdkb3VibGUnOgogICAgCQljYXNlICdmbG9hdCc6CiAgICAJCWNhc2UgJ251bWJlcic6CiAgICAJCWNhc2UgJ2ludGVnZXInOgoKICAgIAkJCXJldHVybiBOdW1iZXJLZXlmcmFtZVRyYWNrOwoKICAgIAkJY2FzZSAndmVjdG9yJzoKICAgIAkJY2FzZSAndmVjdG9yMic6CiAgICAJCWNhc2UgJ3ZlY3RvcjMnOgogICAgCQljYXNlICd2ZWN0b3I0JzoKCiAgICAJCQlyZXR1cm4gVmVjdG9yS2V5ZnJhbWVUcmFjazsKCiAgICAJCWNhc2UgJ2NvbG9yJzoKCiAgICAJCQlyZXR1cm4gQ29sb3JLZXlmcmFtZVRyYWNrOwoKICAgIAkJY2FzZSAncXVhdGVybmlvbic6CgogICAgCQkJcmV0dXJuIFF1YXRlcm5pb25LZXlmcmFtZVRyYWNrOwoKICAgIAkJY2FzZSAnYm9vbCc6CiAgICAJCWNhc2UgJ2Jvb2xlYW4nOgoKICAgIAkJCXJldHVybiBCb29sZWFuS2V5ZnJhbWVUcmFjazsKCiAgICAJCWNhc2UgJ3N0cmluZyc6CgogICAgCQkJcmV0dXJuIFN0cmluZ0tleWZyYW1lVHJhY2s7CgogICAgCX0KCiAgICAJdGhyb3cgbmV3IEVycm9yKCAnVEhSRUUuS2V5ZnJhbWVUcmFjazogVW5zdXBwb3J0ZWQgdHlwZU5hbWU6ICcgKyB0eXBlTmFtZSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZUtleWZyYW1lVHJhY2soIGpzb24gKSB7CgogICAgCWlmICgganNvbi50eXBlID09PSB1bmRlZmluZWQgKSB7CgogICAgCQl0aHJvdyBuZXcgRXJyb3IoICdUSFJFRS5LZXlmcmFtZVRyYWNrOiB0cmFjayB0eXBlIHVuZGVmaW5lZCwgY2FuIG5vdCBwYXJzZScgKTsKCiAgICAJfQoKICAgIAl2YXIgdHJhY2tUeXBlID0gZ2V0VHJhY2tUeXBlRm9yVmFsdWVUeXBlTmFtZSgganNvbi50eXBlICk7CgogICAgCWlmICgganNvbi50aW1lcyA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJdmFyIHRpbWVzID0gW10sIHZhbHVlcyA9IFtdOwoKICAgIAkJQW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGpzb24ua2V5cywgdGltZXMsIHZhbHVlcywgJ3ZhbHVlJyApOwoKICAgIAkJanNvbi50aW1lcyA9IHRpbWVzOwogICAgCQlqc29uLnZhbHVlcyA9IHZhbHVlczsKCiAgICAJfQoKICAgIAkvLyBkZXJpdmVkIGNsYXNzZXMgY2FuIGRlZmluZSBhIHN0YXRpYyBwYXJzZSBtZXRob2QKICAgIAlpZiAoIHRyYWNrVHlwZS5wYXJzZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJcmV0dXJuIHRyYWNrVHlwZS5wYXJzZSgganNvbiApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJLy8gYnkgZGVmYXVsdCwgd2UgYXNzdW1lIGEgY29uc3RydWN0b3IgY29tcGF0aWJsZSB3aXRoIHRoZSBiYXNlCiAgICAJCXJldHVybiBuZXcgdHJhY2tUeXBlKCBqc29uLm5hbWUsIGpzb24udGltZXMsIGpzb24udmFsdWVzLCBqc29uLmludGVycG9sYXRpb24gKTsKCiAgICAJfQoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLCB7CgogICAgCXBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCQl2YXIgdHJhY2tzID0gW10sCiAgICAJCQlqc29uVHJhY2tzID0ganNvbi50cmFja3MsCiAgICAJCQlmcmFtZVRpbWUgPSAxLjAgLyAoIGpzb24uZnBzIHx8IDEuMCApOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBuID0ganNvblRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJdHJhY2tzLnB1c2goIHBhcnNlS2V5ZnJhbWVUcmFjaygganNvblRyYWNrc1sgaSBdICkuc2NhbGUoIGZyYW1lVGltZSApICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gbmV3IEFuaW1hdGlvbkNsaXAoIGpzb24ubmFtZSwganNvbi5kdXJhdGlvbiwgdHJhY2tzICk7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCBjbGlwICkgewoKICAgIAkJdmFyIHRyYWNrcyA9IFtdLAogICAgCQkJY2xpcFRyYWNrcyA9IGNsaXAudHJhY2tzOwoKICAgIAkJdmFyIGpzb24gPSB7CgogICAgCQkJJ25hbWUnOiBjbGlwLm5hbWUsCiAgICAJCQknZHVyYXRpb24nOiBjbGlwLmR1cmF0aW9uLAogICAgCQkJJ3RyYWNrcyc6IHRyYWNrcywKICAgIAkJCSd1dWlkJzogY2xpcC51dWlkCgogICAgCQl9OwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBuID0gY2xpcFRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJdHJhY2tzLnB1c2goIEtleWZyYW1lVHJhY2sudG9KU09OKCBjbGlwVHJhY2tzWyBpIF0gKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGpzb247CgogICAgCX0sCgogICAgCUNyZWF0ZUZyb21Nb3JwaFRhcmdldFNlcXVlbmNlOiBmdW5jdGlvbiAoIG5hbWUsIG1vcnBoVGFyZ2V0U2VxdWVuY2UsIGZwcywgbm9Mb29wICkgewoKICAgIAkJdmFyIG51bU1vcnBoVGFyZ2V0cyA9IG1vcnBoVGFyZ2V0U2VxdWVuY2UubGVuZ3RoOwogICAgCQl2YXIgdHJhY2tzID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBudW1Nb3JwaFRhcmdldHM7IGkgKysgKSB7CgogICAgCQkJdmFyIHRpbWVzID0gW107CiAgICAJCQl2YXIgdmFsdWVzID0gW107CgogICAgCQkJdGltZXMucHVzaCgKICAgIAkJCQkoIGkgKyBudW1Nb3JwaFRhcmdldHMgLSAxICkgJSBudW1Nb3JwaFRhcmdldHMsCiAgICAJCQkJaSwKICAgIAkJCQkoIGkgKyAxICkgJSBudW1Nb3JwaFRhcmdldHMgKTsKCiAgICAJCQl2YWx1ZXMucHVzaCggMCwgMSwgMCApOwoKICAgIAkJCXZhciBvcmRlciA9IEFuaW1hdGlvblV0aWxzLmdldEtleWZyYW1lT3JkZXIoIHRpbWVzICk7CiAgICAJCQl0aW1lcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB0aW1lcywgMSwgb3JkZXIgKTsKICAgIAkJCXZhbHVlcyA9IEFuaW1hdGlvblV0aWxzLnNvcnRlZEFycmF5KCB2YWx1ZXMsIDEsIG9yZGVyICk7CgogICAgCQkJLy8gaWYgdGhlcmUgaXMgYSBrZXkgYXQgdGhlIGZpcnN0IGZyYW1lLCBkdXBsaWNhdGUgaXQgYXMgdGhlCiAgICAJCQkvLyBsYXN0IGZyYW1lIGFzIHdlbGwgZm9yIHBlcmZlY3QgbG9vcC4KICAgIAkJCWlmICggISBub0xvb3AgJiYgdGltZXNbIDAgXSA9PT0gMCApIHsKCiAgICAJCQkJdGltZXMucHVzaCggbnVtTW9ycGhUYXJnZXRzICk7CiAgICAJCQkJdmFsdWVzLnB1c2goIHZhbHVlc1sgMCBdICk7CgogICAgCQkJfQoKICAgIAkJCXRyYWNrcy5wdXNoKAogICAgCQkJCW5ldyBOdW1iZXJLZXlmcmFtZVRyYWNrKAogICAgCQkJCQknLm1vcnBoVGFyZ2V0SW5mbHVlbmNlc1snICsgbW9ycGhUYXJnZXRTZXF1ZW5jZVsgaSBdLm5hbWUgKyAnXScsCiAgICAJCQkJCXRpbWVzLCB2YWx1ZXMKICAgIAkJCQkpLnNjYWxlKCAxLjAgLyBmcHMgKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCBuYW1lLCAtIDEsIHRyYWNrcyApOwoKICAgIAl9LAoKICAgIAlmaW5kQnlOYW1lOiBmdW5jdGlvbiAoIG9iamVjdE9yQ2xpcEFycmF5LCBuYW1lICkgewoKICAgIAkJdmFyIGNsaXBBcnJheSA9IG9iamVjdE9yQ2xpcEFycmF5OwoKICAgIAkJaWYgKCAhIEFycmF5LmlzQXJyYXkoIG9iamVjdE9yQ2xpcEFycmF5ICkgKSB7CgogICAgCQkJdmFyIG8gPSBvYmplY3RPckNsaXBBcnJheTsKICAgIAkJCWNsaXBBcnJheSA9IG8uZ2VvbWV0cnkgJiYgby5nZW9tZXRyeS5hbmltYXRpb25zIHx8IG8uYW5pbWF0aW9uczsKCiAgICAJCX0KCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGNsaXBBcnJheS5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJaWYgKCBjbGlwQXJyYXlbIGkgXS5uYW1lID09PSBuYW1lICkgewoKICAgIAkJCQlyZXR1cm4gY2xpcEFycmF5WyBpIF07CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIG51bGw7CgogICAgCX0sCgogICAgCUNyZWF0ZUNsaXBzRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2VzOiBmdW5jdGlvbiAoIG1vcnBoVGFyZ2V0cywgZnBzLCBub0xvb3AgKSB7CgogICAgCQl2YXIgYW5pbWF0aW9uVG9Nb3JwaFRhcmdldHMgPSB7fTsKCiAgICAJCS8vIHRlc3RlZCB3aXRoIGh0dHBzOi8vcmVnZXgxMDEuY29tLyBvbiB0cmljayBzZXF1ZW5jZXMKICAgIAkJLy8gc3VjaCBmbGFtaW5nb19mbHlBXzAwMywgZmxhbWluZ29fcnVuMV8wMDMsIGNyZGVhdGgwMDU5CiAgICAJCXZhciBwYXR0ZXJuID0gL14oW1x3LV0qPykoW1xkXSspJC87CgogICAgCQkvLyBzb3J0IG1vcnBoIHRhcmdldCBuYW1lcyBpbnRvIGFuaW1hdGlvbiBncm91cHMgYmFzZWQKICAgIAkJLy8gcGF0dGVybnMgbGlrZSBXYWxrXzAwMSwgV2Fsa18wMDIsIFJ1bl8wMDEsIFJ1bl8wMDIKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG1vcnBoVGFyZ2V0cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl2YXIgbW9ycGhUYXJnZXQgPSBtb3JwaFRhcmdldHNbIGkgXTsKICAgIAkJCXZhciBwYXJ0cyA9IG1vcnBoVGFyZ2V0Lm5hbWUubWF0Y2goIHBhdHRlcm4gKTsKCiAgICAJCQlpZiAoIHBhcnRzICYmIHBhcnRzLmxlbmd0aCA+IDEgKSB7CgogICAgCQkJCXZhciBuYW1lID0gcGFydHNbIDEgXTsKCiAgICAJCQkJdmFyIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyA9IGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF07CiAgICAJCQkJaWYgKCAhIGFuaW1hdGlvbk1vcnBoVGFyZ2V0cyApIHsKCiAgICAJCQkJCWFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0gPSBhbmltYXRpb25Nb3JwaFRhcmdldHMgPSBbXTsKCiAgICAJCQkJfQoKICAgIAkJCQlhbmltYXRpb25Nb3JwaFRhcmdldHMucHVzaCggbW9ycGhUYXJnZXQgKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQl2YXIgY2xpcHMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBuYW1lIGluIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzICkgewoKICAgIAkJCWNsaXBzLnB1c2goIEFuaW1hdGlvbkNsaXAuQ3JlYXRlRnJvbU1vcnBoVGFyZ2V0U2VxdWVuY2UoIG5hbWUsIGFuaW1hdGlvblRvTW9ycGhUYXJnZXRzWyBuYW1lIF0sIGZwcywgbm9Mb29wICkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBjbGlwczsKCiAgICAJfSwKCiAgICAJLy8gcGFyc2UgdGhlIGFuaW1hdGlvbi5oaWVyYXJjaHkgZm9ybWF0CiAgICAJcGFyc2VBbmltYXRpb246IGZ1bmN0aW9uICggYW5pbWF0aW9uLCBib25lcyApIHsKCiAgICAJCWlmICggISBhbmltYXRpb24gKSB7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLkFuaW1hdGlvbkNsaXA6IE5vIGFuaW1hdGlvbiBpbiBKU09OTG9hZGVyIGRhdGEuJyApOwogICAgCQkJcmV0dXJuIG51bGw7CgogICAgCQl9CgogICAgCQl2YXIgYWRkTm9uZW1wdHlUcmFjayA9IGZ1bmN0aW9uICggdHJhY2tUeXBlLCB0cmFja05hbWUsIGFuaW1hdGlvbktleXMsIHByb3BlcnR5TmFtZSwgZGVzdFRyYWNrcyApIHsKCiAgICAJCQkvLyBvbmx5IHJldHVybiB0cmFjayBpZiB0aGVyZSBhcmUgYWN0dWFsbHkga2V5cy4KICAgIAkJCWlmICggYW5pbWF0aW9uS2V5cy5sZW5ndGggIT09IDAgKSB7CgogICAgCQkJCXZhciB0aW1lcyA9IFtdOwogICAgCQkJCXZhciB2YWx1ZXMgPSBbXTsKCiAgICAJCQkJQW5pbWF0aW9uVXRpbHMuZmxhdHRlbkpTT04oIGFuaW1hdGlvbktleXMsIHRpbWVzLCB2YWx1ZXMsIHByb3BlcnR5TmFtZSApOwoKICAgIAkJCQkvLyBlbXB0eSBrZXlzIGFyZSBmaWx0ZXJlZCBvdXQsIHNvIGNoZWNrIGFnYWluCiAgICAJCQkJaWYgKCB0aW1lcy5sZW5ndGggIT09IDAgKSB7CgogICAgCQkJCQlkZXN0VHJhY2tzLnB1c2goIG5ldyB0cmFja1R5cGUoIHRyYWNrTmFtZSwgdGltZXMsIHZhbHVlcyApICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9OwoKICAgIAkJdmFyIHRyYWNrcyA9IFtdOwoKICAgIAkJdmFyIGNsaXBOYW1lID0gYW5pbWF0aW9uLm5hbWUgfHwgJ2RlZmF1bHQnOwogICAgCQkvLyBhdXRvbWF0aWMgbGVuZ3RoIGRldGVybWluYXRpb24gaW4gQW5pbWF0aW9uQ2xpcC4KICAgIAkJdmFyIGR1cmF0aW9uID0gYW5pbWF0aW9uLmxlbmd0aCB8fCAtIDE7CiAgICAJCXZhciBmcHMgPSBhbmltYXRpb24uZnBzIHx8IDMwOwoKICAgIAkJdmFyIGhpZXJhcmNoeVRyYWNrcyA9IGFuaW1hdGlvbi5oaWVyYXJjaHkgfHwgW107CgogICAgCQlmb3IgKCB2YXIgaCA9IDA7IGggPCBoaWVyYXJjaHlUcmFja3MubGVuZ3RoOyBoICsrICkgewoKICAgIAkJCXZhciBhbmltYXRpb25LZXlzID0gaGllcmFyY2h5VHJhY2tzWyBoIF0ua2V5czsKCiAgICAJCQkvLyBza2lwIGVtcHR5IHRyYWNrcwogICAgCQkJaWYgKCAhIGFuaW1hdGlvbktleXMgfHwgYW5pbWF0aW9uS2V5cy5sZW5ndGggPT09IDAgKSBjb250aW51ZTsKCiAgICAJCQkvLyBwcm9jZXNzIG1vcnBoIHRhcmdldHMKICAgIAkJCWlmICggYW5pbWF0aW9uS2V5c1sgMCBdLm1vcnBoVGFyZ2V0cyApIHsKCiAgICAJCQkJLy8gZmlndXJlIG91dCBhbGwgbW9ycGggdGFyZ2V0cyB1c2VkIGluIHRoaXMgdHJhY2sKICAgIAkJCQl2YXIgbW9ycGhUYXJnZXROYW1lcyA9IHt9OwoKICAgIAkJCQlmb3IgKCB2YXIgayA9IDA7IGsgPCBhbmltYXRpb25LZXlzLmxlbmd0aDsgayArKyApIHsKCiAgICAJCQkJCWlmICggYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cyApIHsKCiAgICAJCQkJCQlmb3IgKCB2YXIgbSA9IDA7IG0gPCBhbmltYXRpb25LZXlzWyBrIF0ubW9ycGhUYXJnZXRzLmxlbmd0aDsgbSArKyApIHsKCiAgICAJCQkJCQkJbW9ycGhUYXJnZXROYW1lc1sgYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0c1sgbSBdIF0gPSAtIDE7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJCS8vIGNyZWF0ZSBhIHRyYWNrIGZvciBlYWNoIG1vcnBoIHRhcmdldCB3aXRoIGFsbCB6ZXJvCiAgICAJCQkJLy8gbW9ycGhUYXJnZXRJbmZsdWVuY2VzIGV4Y2VwdCBmb3IgdGhlIGtleXMgaW4gd2hpY2gKICAgIAkJCQkvLyB0aGUgbW9ycGhUYXJnZXQgaXMgbmFtZWQuCiAgICAJCQkJZm9yICggdmFyIG1vcnBoVGFyZ2V0TmFtZSBpbiBtb3JwaFRhcmdldE5hbWVzICkgewoKICAgIAkJCQkJdmFyIHRpbWVzID0gW107CiAgICAJCQkJCXZhciB2YWx1ZXMgPSBbXTsKCiAgICAJCQkJCWZvciAoIHZhciBtID0gMDsgbSAhPT0gYW5pbWF0aW9uS2V5c1sgayBdLm1vcnBoVGFyZ2V0cy5sZW5ndGg7ICsrIG0gKSB7CgogICAgCQkJCQkJdmFyIGFuaW1hdGlvbktleSA9IGFuaW1hdGlvbktleXNbIGsgXTsKCiAgICAJCQkJCQl0aW1lcy5wdXNoKCBhbmltYXRpb25LZXkudGltZSApOwogICAgCQkJCQkJdmFsdWVzLnB1c2goICggYW5pbWF0aW9uS2V5Lm1vcnBoVGFyZ2V0ID09PSBtb3JwaFRhcmdldE5hbWUgKSA/IDEgOiAwICk7CgogICAgCQkJCQl9CgogICAgCQkJCQl0cmFja3MucHVzaCggbmV3IE51bWJlcktleWZyYW1lVHJhY2soICcubW9ycGhUYXJnZXRJbmZsdWVuY2VbJyArIG1vcnBoVGFyZ2V0TmFtZSArICddJywgdGltZXMsIHZhbHVlcyApICk7CgogICAgCQkJCX0KCiAgICAJCQkJZHVyYXRpb24gPSBtb3JwaFRhcmdldE5hbWVzLmxlbmd0aCAqICggZnBzIHx8IDEuMCApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCS8vIC4uLmFzc3VtZSBza2VsZXRhbCBhbmltYXRpb24KCiAgICAJCQkJdmFyIGJvbmVOYW1lID0gJy5ib25lc1snICsgYm9uZXNbIGggXS5uYW1lICsgJ10nOwoKICAgIAkJCQlhZGROb25lbXB0eVRyYWNrKAogICAgCQkJCQlWZWN0b3JLZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucG9zaXRpb24nLAogICAgCQkJCQlhbmltYXRpb25LZXlzLCAncG9zJywgdHJhY2tzICk7CgogICAgCQkJCWFkZE5vbmVtcHR5VHJhY2soCiAgICAJCQkJCVF1YXRlcm5pb25LZXlmcmFtZVRyYWNrLCBib25lTmFtZSArICcucXVhdGVybmlvbicsCiAgICAJCQkJCWFuaW1hdGlvbktleXMsICdyb3QnLCB0cmFja3MgKTsKCiAgICAJCQkJYWRkTm9uZW1wdHlUcmFjaygKICAgIAkJCQkJVmVjdG9yS2V5ZnJhbWVUcmFjaywgYm9uZU5hbWUgKyAnLnNjYWxlJywKICAgIAkJCQkJYW5pbWF0aW9uS2V5cywgJ3NjbCcsIHRyYWNrcyApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggdHJhY2tzLmxlbmd0aCA9PT0gMCApIHsKCiAgICAJCQlyZXR1cm4gbnVsbDsKCiAgICAJCX0KCiAgICAJCXZhciBjbGlwID0gbmV3IEFuaW1hdGlvbkNsaXAoIGNsaXBOYW1lLCBkdXJhdGlvbiwgdHJhY2tzICk7CgogICAgCQlyZXR1cm4gY2xpcDsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBBbmltYXRpb25DbGlwLnByb3RvdHlwZSwgewoKICAgIAlyZXNldER1cmF0aW9uOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdHJhY2tzID0gdGhpcy50cmFja3MsIGR1cmF0aW9uID0gMDsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbiA9IHRyYWNrcy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJdmFyIHRyYWNrID0gdGhpcy50cmFja3NbIGkgXTsKCiAgICAJCQlkdXJhdGlvbiA9IE1hdGgubWF4KCBkdXJhdGlvbiwgdHJhY2sudGltZXNbIHRyYWNrLnRpbWVzLmxlbmd0aCAtIDEgXSApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRyaW06IGZ1bmN0aW9uICgpIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl0aGlzLnRyYWNrc1sgaSBdLnRyaW0oIDAsIHRoaXMuZHVyYXRpb24gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl2YWxpZGF0ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIHZhbGlkID0gdHJ1ZTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YWxpZCA9IHZhbGlkICYmIHRoaXMudHJhY2tzWyBpIF0udmFsaWRhdGUoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB2YWxpZDsKCiAgICAJfSwKCiAgICAJb3B0aW1pemU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHRoaXMudHJhY2tzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl0aGlzLnRyYWNrc1sgaSBdLm9wdGltaXplKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdHJhY2tzID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLnRyYWNrcy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJdHJhY2tzLnB1c2goIHRoaXMudHJhY2tzWyBpIF0uY2xvbmUoKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIG5ldyBBbmltYXRpb25DbGlwKCB0aGlzLm5hbWUsIHRoaXMuZHVyYXRpb24sIHRyYWNrcyApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBDYWNoZSA9IHsKCiAgICAJZW5hYmxlZDogZmFsc2UsCgogICAgCWZpbGVzOiB7fSwKCiAgICAJYWRkOiBmdW5jdGlvbiAoIGtleSwgZmlsZSApIHsKCiAgICAJCWlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCS8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQWRkaW5nIGtleTonLCBrZXkgKTsKCiAgICAJCXRoaXMuZmlsZXNbIGtleSBdID0gZmlsZTsKCiAgICAJfSwKCiAgICAJZ2V0OiBmdW5jdGlvbiAoIGtleSApIHsKCiAgICAJCWlmICggdGhpcy5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCS8vIGNvbnNvbGUubG9nKCAnVEhSRUUuQ2FjaGUnLCAnQ2hlY2tpbmcga2V5OicsIGtleSApOwoKICAgIAkJcmV0dXJuIHRoaXMuZmlsZXNbIGtleSBdOwoKICAgIAl9LAoKICAgIAlyZW1vdmU6IGZ1bmN0aW9uICgga2V5ICkgewoKICAgIAkJZGVsZXRlIHRoaXMuZmlsZXNbIGtleSBdOwoKICAgIAl9LAoKICAgIAljbGVhcjogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5maWxlcyA9IHt9OwoKICAgIAl9CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBMb2FkaW5nTWFuYWdlciggb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKICAgIAl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAl2YXIgaXNMb2FkaW5nID0gZmFsc2U7CiAgICAJdmFyIGl0ZW1zTG9hZGVkID0gMDsKICAgIAl2YXIgaXRlbXNUb3RhbCA9IDA7CiAgICAJdmFyIHVybE1vZGlmaWVyID0gdW5kZWZpbmVkOwoKICAgIAkvLyBSZWZlciB0byAjNTY4OSBmb3IgdGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3Qgc2V0IC5vblN0YXJ0CiAgICAJLy8gaW4gdGhlIGNvbnN0cnVjdG9yCgogICAgCXRoaXMub25TdGFydCA9IHVuZGVmaW5lZDsKICAgIAl0aGlzLm9uTG9hZCA9IG9uTG9hZDsKICAgIAl0aGlzLm9uUHJvZ3Jlc3MgPSBvblByb2dyZXNzOwogICAgCXRoaXMub25FcnJvciA9IG9uRXJyb3I7CgogICAgCXRoaXMuaXRlbVN0YXJ0ID0gZnVuY3Rpb24gKCB1cmwgKSB7CgogICAgCQlpdGVtc1RvdGFsICsrOwoKICAgIAkJaWYgKCBpc0xvYWRpbmcgPT09IGZhbHNlICkgewoKICAgIAkJCWlmICggc2NvcGUub25TdGFydCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlzY29wZS5vblN0YXJ0KCB1cmwsIGl0ZW1zTG9hZGVkLCBpdGVtc1RvdGFsICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaXNMb2FkaW5nID0gdHJ1ZTsKCiAgICAJfTsKCiAgICAJdGhpcy5pdGVtRW5kID0gZnVuY3Rpb24gKCB1cmwgKSB7CgogICAgCQlpdGVtc0xvYWRlZCArKzsKCiAgICAJCWlmICggc2NvcGUub25Qcm9ncmVzcyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXNjb3BlLm9uUHJvZ3Jlc3MoIHVybCwgaXRlbXNMb2FkZWQsIGl0ZW1zVG90YWwgKTsKCiAgICAJCX0KCiAgICAJCWlmICggaXRlbXNMb2FkZWQgPT09IGl0ZW1zVG90YWwgKSB7CgogICAgCQkJaXNMb2FkaW5nID0gZmFsc2U7CgogICAgCQkJaWYgKCBzY29wZS5vbkxvYWQgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJc2NvcGUub25Mb2FkKCk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9OwoKICAgIAl0aGlzLml0ZW1FcnJvciA9IGZ1bmN0aW9uICggdXJsICkgewoKICAgIAkJaWYgKCBzY29wZS5vbkVycm9yICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJc2NvcGUub25FcnJvciggdXJsICk7CgogICAgCQl9CgogICAgCX07CgogICAgCXRoaXMucmVzb2x2ZVVSTCA9IGZ1bmN0aW9uICggdXJsICkgewoKICAgIAkJaWYgKCB1cmxNb2RpZmllciApIHsKCiAgICAJCQlyZXR1cm4gdXJsTW9kaWZpZXIoIHVybCApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHVybDsKCiAgICAJfTsKCiAgICAJdGhpcy5zZXRVUkxNb2RpZmllciA9IGZ1bmN0aW9uICggdHJhbnNmb3JtICkgewoKICAgIAkJdXJsTW9kaWZpZXIgPSB0cmFuc2Zvcm07CiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9OwoKICAgIH0KCiAgICB2YXIgRGVmYXVsdExvYWRpbmdNYW5hZ2VyID0gbmV3IExvYWRpbmdNYW5hZ2VyKCk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gTG9hZGVyKCBtYW5hZ2VyICkgewoKICAgIAl0aGlzLm1hbmFnZXIgPSAoIG1hbmFnZXIgIT09IHVuZGVmaW5lZCApID8gbWFuYWdlciA6IERlZmF1bHRMb2FkaW5nTWFuYWdlcjsKCiAgICAJdGhpcy5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnOwogICAgCXRoaXMucGF0aCA9ICcnOwogICAgCXRoaXMucmVzb3VyY2VQYXRoID0gJyc7CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIExvYWRlci5wcm90b3R5cGUsIHsKCiAgICAJbG9hZDogZnVuY3Rpb24gKCAvKiB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciAqLyApIHt9LAoKICAgIAlwYXJzZTogZnVuY3Rpb24gKCAvKiBkYXRhICovICkge30sCgogICAgCXNldENyb3NzT3JpZ2luOiBmdW5jdGlvbiAoIGNyb3NzT3JpZ2luICkgewoKICAgIAkJdGhpcy5jcm9zc09yaWdpbiA9IGNyb3NzT3JpZ2luOwogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0UGF0aDogZnVuY3Rpb24gKCBwYXRoICkgewoKICAgIAkJdGhpcy5wYXRoID0gcGF0aDsKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFJlc291cmNlUGF0aDogZnVuY3Rpb24gKCByZXNvdXJjZVBhdGggKSB7CgogICAgCQl0aGlzLnJlc291cmNlUGF0aCA9IHJlc291cmNlUGF0aDsKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLy8KCiAgICBMb2FkZXIuSGFuZGxlcnMgPSB7CgogICAgCWhhbmRsZXJzOiBbXSwKCiAgICAJYWRkOiBmdW5jdGlvbiAoIHJlZ2V4LCBsb2FkZXIgKSB7CgogICAgCQl0aGlzLmhhbmRsZXJzLnB1c2goIHJlZ2V4LCBsb2FkZXIgKTsKCiAgICAJfSwKCiAgICAJZ2V0OiBmdW5jdGlvbiAoIGZpbGUgKSB7CgogICAgCQl2YXIgaGFuZGxlcnMgPSB0aGlzLmhhbmRsZXJzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gaGFuZGxlcnMubGVuZ3RoOyBpIDwgbDsgaSArPSAyICkgewoKICAgIAkJCXZhciByZWdleCA9IGhhbmRsZXJzWyBpIF07CiAgICAJCQl2YXIgbG9hZGVyID0gaGFuZGxlcnNbIGkgKyAxIF07CgogICAgCQkJaWYgKCByZWdleC50ZXN0KCBmaWxlICkgKSB7CgogICAgCQkJCXJldHVybiBsb2FkZXI7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIG51bGw7CgogICAgCX0KCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBsb2FkaW5nID0ge307CgogICAgZnVuY3Rpb24gRmlsZUxvYWRlciggbWFuYWdlciApIHsKCiAgICAJTG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTsKCiAgICB9CgogICAgRmlsZUxvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEZpbGVMb2FkZXIsCgogICAgCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgogICAgCQlpZiAoIHVybCA9PT0gdW5kZWZpbmVkICkgdXJsID0gJyc7CgogICAgCQlpZiAoIHRoaXMucGF0aCAhPT0gdW5kZWZpbmVkICkgdXJsID0gdGhpcy5wYXRoICsgdXJsOwoKICAgIAkJdXJsID0gdGhpcy5tYW5hZ2VyLnJlc29sdmVVUkwoIHVybCApOwoKICAgIAkJdmFyIHNjb3BlID0gdGhpczsKCiAgICAJCXZhciBjYWNoZWQgPSBDYWNoZS5nZXQoIHVybCApOwoKICAgIAkJaWYgKCBjYWNoZWQgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CgogICAgCQkJc2V0VGltZW91dCggZnVuY3Rpb24gKCkgewoKICAgIAkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggY2FjaGVkICk7CgogICAgCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgogICAgCQkJfSwgMCApOwoKICAgIAkJCXJldHVybiBjYWNoZWQ7CgogICAgCQl9CgogICAgCQkvLyBDaGVjayBpZiByZXF1ZXN0IGlzIGR1cGxpY2F0ZQoKICAgIAkJaWYgKCBsb2FkaW5nWyB1cmwgXSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWxvYWRpbmdbIHVybCBdLnB1c2goIHsKCiAgICAJCQkJb25Mb2FkOiBvbkxvYWQsCiAgICAJCQkJb25Qcm9ncmVzczogb25Qcm9ncmVzcywKICAgIAkJCQlvbkVycm9yOiBvbkVycm9yCgogICAgCQkJfSApOwoKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCS8vIENoZWNrIGZvciBkYXRhOiBVUkkKICAgIAkJdmFyIGRhdGFVcmlSZWdleCA9IC9eZGF0YTooLio/KSg7YmFzZTY0KT8sKC4qKSQvOwogICAgCQl2YXIgZGF0YVVyaVJlZ2V4UmVzdWx0ID0gdXJsLm1hdGNoKCBkYXRhVXJpUmVnZXggKTsKCiAgICAJCS8vIFNhZmFyaSBjYW4gbm90IGhhbmRsZSBEYXRhIFVSSXMgdGhyb3VnaCBYTUxIdHRwUmVxdWVzdCBzbyBwcm9jZXNzIG1hbnVhbGx5CiAgICAJCWlmICggZGF0YVVyaVJlZ2V4UmVzdWx0ICkgewoKICAgIAkJCXZhciBtaW1lVHlwZSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMSBdOwogICAgCQkJdmFyIGlzQmFzZTY0ID0gISEgZGF0YVVyaVJlZ2V4UmVzdWx0WyAyIF07CiAgICAJCQl2YXIgZGF0YSA9IGRhdGFVcmlSZWdleFJlc3VsdFsgMyBdOwoKICAgIAkJCWRhdGEgPSBkZWNvZGVVUklDb21wb25lbnQoIGRhdGEgKTsKCiAgICAJCQlpZiAoIGlzQmFzZTY0ICkgZGF0YSA9IGF0b2IoIGRhdGEgKTsKCiAgICAJCQl0cnkgewoKICAgIAkJCQl2YXIgcmVzcG9uc2U7CiAgICAJCQkJdmFyIHJlc3BvbnNlVHlwZSA9ICggdGhpcy5yZXNwb25zZVR5cGUgfHwgJycgKS50b0xvd2VyQ2FzZSgpOwoKICAgIAkJCQlzd2l0Y2ggKCByZXNwb25zZVR5cGUgKSB7CgogICAgCQkJCQljYXNlICdhcnJheWJ1ZmZlcic6CiAgICAJCQkJCWNhc2UgJ2Jsb2InOgoKICAgIAkJCQkJCXZhciB2aWV3ID0gbmV3IFVpbnQ4QXJyYXkoIGRhdGEubGVuZ3RoICk7CgogICAgCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgZGF0YS5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCQkJCXZpZXdbIGkgXSA9IGRhdGEuY2hhckNvZGVBdCggaSApOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCQlpZiAoIHJlc3BvbnNlVHlwZSA9PT0gJ2Jsb2InICkgewoKICAgIAkJCQkJCQlyZXNwb25zZSA9IG5ldyBCbG9iKCBbIHZpZXcuYnVmZmVyIF0sIHsgdHlwZTogbWltZVR5cGUgfSApOwoKICAgIAkJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJCXJlc3BvbnNlID0gdmlldy5idWZmZXI7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnZG9jdW1lbnQnOgoKICAgIAkJCQkJCXZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7CiAgICAJCQkJCQlyZXNwb25zZSA9IHBhcnNlci5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIG1pbWVUeXBlICk7CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICdqc29uJzoKCiAgICAJCQkJCQlyZXNwb25zZSA9IEpTT04ucGFyc2UoIGRhdGEgKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWRlZmF1bHQ6IC8vICd0ZXh0JyBvciBvdGhlcgoKICAgIAkJCQkJCXJlc3BvbnNlID0gZGF0YTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJfQoKICAgIAkJCQkvLyBXYWl0IGZvciBuZXh0IGJyb3dzZXIgdGljayBsaWtlIHN0YW5kYXJkIFhNTEh0dHBSZXF1ZXN0IGV2ZW50IGRpc3BhdGNoaW5nIGRvZXMKICAgIAkJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7CgogICAgCQkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggcmVzcG9uc2UgKTsKCiAgICAJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgogICAgCQkJCX0sIDAgKTsKCiAgICAJCQl9IGNhdGNoICggZXJyb3IgKSB7CgogICAgCQkJCS8vIFdhaXQgZm9yIG5leHQgYnJvd3NlciB0aWNrIGxpa2Ugc3RhbmRhcmQgWE1MSHR0cFJlcXVlc3QgZXZlbnQgZGlzcGF0Y2hpbmcgZG9lcwogICAgCQkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsKCiAgICAJCQkJCWlmICggb25FcnJvciApIG9uRXJyb3IoIGVycm9yICk7CgogICAgCQkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CiAgICAJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgogICAgCQkJCX0sIDAgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIEluaXRpYWxpc2UgYXJyYXkgZm9yIGR1cGxpY2F0ZSByZXF1ZXN0cwoKICAgIAkJCWxvYWRpbmdbIHVybCBdID0gW107CgogICAgCQkJbG9hZGluZ1sgdXJsIF0ucHVzaCggewoKICAgIAkJCQlvbkxvYWQ6IG9uTG9hZCwKICAgIAkJCQlvblByb2dyZXNzOiBvblByb2dyZXNzLAogICAgCQkJCW9uRXJyb3I6IG9uRXJyb3IKCiAgICAJCQl9ICk7CgogICAgCQkJdmFyIHJlcXVlc3QgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKCiAgICAJCQlyZXF1ZXN0Lm9wZW4oICdHRVQnLCB1cmwsIHRydWUgKTsKCiAgICAJCQlyZXF1ZXN0LmFkZEV2ZW50TGlzdGVuZXIoICdsb2FkJywgZnVuY3Rpb24gKCBldmVudCApIHsKCiAgICAJCQkJdmFyIHJlc3BvbnNlID0gdGhpcy5yZXNwb25zZTsKCiAgICAJCQkJQ2FjaGUuYWRkKCB1cmwsIHJlc3BvbnNlICk7CgogICAgCQkJCXZhciBjYWxsYmFja3MgPSBsb2FkaW5nWyB1cmwgXTsKCiAgICAJCQkJZGVsZXRlIGxvYWRpbmdbIHVybCBdOwoKICAgIAkJCQlpZiAoIHRoaXMuc3RhdHVzID09PSAyMDAgfHwgdGhpcy5zdGF0dXMgPT09IDAgKSB7CgogICAgCQkJCQkvLyBTb21lIGJyb3dzZXJzIHJldHVybiBIVFRQIFN0YXR1cyAwIHdoZW4gdXNpbmcgbm9uLWh0dHAgcHJvdG9jb2wKICAgIAkJCQkJLy8gZS5nLiAnZmlsZTovLycgb3IgJ2RhdGE6Ly8nLiBIYW5kbGUgYXMgc3VjY2Vzcy4KCiAgICAJCQkJCWlmICggdGhpcy5zdGF0dXMgPT09IDAgKSBjb25zb2xlLndhcm4oICdUSFJFRS5GaWxlTG9hZGVyOiBIVFRQIFN0YXR1cyAwIHJlY2VpdmVkLicgKTsKCiAgICAJCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQkJdmFyIGNhbGxiYWNrID0gY2FsbGJhY2tzWyBpIF07CiAgICAJCQkJCQlpZiAoIGNhbGxiYWNrLm9uTG9hZCApIGNhbGxiYWNrLm9uTG9hZCggcmVzcG9uc2UgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gY2FsbGJhY2tzLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCQkJCXZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdOwogICAgCQkJCQkJaWYgKCBjYWxsYmFjay5vbkVycm9yICkgY2FsbGJhY2sub25FcnJvciggZXZlbnQgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsKICAgIAkJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0sIGZhbHNlICk7CgogICAgCQkJcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAncHJvZ3Jlc3MnLCBmdW5jdGlvbiAoIGV2ZW50ICkgewoKICAgIAkJCQl2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBjYWxsYmFja3MubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQl2YXIgY2FsbGJhY2sgPSBjYWxsYmFja3NbIGkgXTsKICAgIAkJCQkJaWYgKCBjYWxsYmFjay5vblByb2dyZXNzICkgY2FsbGJhY2sub25Qcm9ncmVzcyggZXZlbnQgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0sIGZhbHNlICk7CgogICAgCQkJcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBmdW5jdGlvbiAoIGV2ZW50ICkgewoKICAgIAkJCQl2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07CgogICAgCQkJCWRlbGV0ZSBsb2FkaW5nWyB1cmwgXTsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJCXZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdOwogICAgCQkJCQlpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApOwoKICAgIAkJCQl9CgogICAgCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsKICAgIAkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKICAgIAkJCX0sIGZhbHNlICk7CgogICAgCQkJcmVxdWVzdC5hZGRFdmVudExpc3RlbmVyKCAnYWJvcnQnLCBmdW5jdGlvbiAoIGV2ZW50ICkgewoKICAgIAkJCQl2YXIgY2FsbGJhY2tzID0gbG9hZGluZ1sgdXJsIF07CgogICAgCQkJCWRlbGV0ZSBsb2FkaW5nWyB1cmwgXTsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkJCXZhciBjYWxsYmFjayA9IGNhbGxiYWNrc1sgaSBdOwogICAgCQkJCQlpZiAoIGNhbGxiYWNrLm9uRXJyb3IgKSBjYWxsYmFjay5vbkVycm9yKCBldmVudCApOwoKICAgIAkJCQl9CgogICAgCQkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsKICAgIAkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKICAgIAkJCX0sIGZhbHNlICk7CgogICAgCQkJaWYgKCB0aGlzLnJlc3BvbnNlVHlwZSAhPT0gdW5kZWZpbmVkICkgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSB0aGlzLnJlc3BvbnNlVHlwZTsKICAgIAkJCWlmICggdGhpcy53aXRoQ3JlZGVudGlhbHMgIT09IHVuZGVmaW5lZCApIHJlcXVlc3Qud2l0aENyZWRlbnRpYWxzID0gdGhpcy53aXRoQ3JlZGVudGlhbHM7CgogICAgCQkJaWYgKCByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUgKSByZXF1ZXN0Lm92ZXJyaWRlTWltZVR5cGUoIHRoaXMubWltZVR5cGUgIT09IHVuZGVmaW5lZCA/IHRoaXMubWltZVR5cGUgOiAndGV4dC9wbGFpbicgKTsKCiAgICAJCQlmb3IgKCB2YXIgaGVhZGVyIGluIHRoaXMucmVxdWVzdEhlYWRlciApIHsKCiAgICAJCQkJcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCBoZWFkZXIsIHRoaXMucmVxdWVzdEhlYWRlclsgaGVhZGVyIF0gKTsKCiAgICAJCQl9CgogICAgCQkJcmVxdWVzdC5zZW5kKCBudWxsICk7CgogICAgCQl9CgogICAgCQlzY29wZS5tYW5hZ2VyLml0ZW1TdGFydCggdXJsICk7CgogICAgCQlyZXR1cm4gcmVxdWVzdDsKCiAgICAJfSwKCiAgICAJc2V0UmVzcG9uc2VUeXBlOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5yZXNwb25zZVR5cGUgPSB2YWx1ZTsKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFdpdGhDcmVkZW50aWFsczogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCXRoaXMud2l0aENyZWRlbnRpYWxzID0gdmFsdWU7CiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRNaW1lVHlwZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCXRoaXMubWltZVR5cGUgPSB2YWx1ZTsKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldFJlcXVlc3RIZWFkZXI6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQl0aGlzLnJlcXVlc3RIZWFkZXIgPSB2YWx1ZTsKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGJob3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwogICAgICovCgogICAgZnVuY3Rpb24gQW5pbWF0aW9uTG9hZGVyKCBtYW5hZ2VyICkgewoKICAgIAlMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApOwoKICAgIH0KCiAgICBBbmltYXRpb25Mb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBBbmltYXRpb25Mb2FkZXIsCgogICAgCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgogICAgCQl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7CiAgICAJCWxvYWRlci5zZXRQYXRoKCBzY29wZS5wYXRoICk7CiAgICAJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKCiAgICAJCQlvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApOwoKICAgIAkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKICAgIAl9LAoKICAgIAlwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgewoKICAgIAkJdmFyIGFuaW1hdGlvbnMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IGpzb24ubGVuZ3RoOyBpICsrICkgewoKICAgIAkJCXZhciBjbGlwID0gQW5pbWF0aW9uQ2xpcC5wYXJzZSgganNvblsgaSBdICk7CgogICAgCQkJYW5pbWF0aW9ucy5wdXNoKCBjbGlwICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gYW5pbWF0aW9uczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKgogICAgICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBibG9jayBiYXNlZCB0ZXh0dXJlcyBsb2FkZXIgKGRkcywgcHZyLCAuLi4pCiAgICAgKi8KCiAgICBmdW5jdGlvbiBDb21wcmVzc2VkVGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKCiAgICAJTG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTsKCiAgICAJLy8gb3ZlcnJpZGUgaW4gc3ViIGNsYXNzZXMKICAgIAl0aGlzLl9wYXJzZXIgPSBudWxsOwoKICAgIH0KCiAgICBDb21wcmVzc2VkVGV4dHVyZUxvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IENvbXByZXNzZWRUZXh0dXJlTG9hZGVyLAoKICAgIAlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKICAgIAkJdmFyIHNjb3BlID0gdGhpczsKCiAgICAJCXZhciBpbWFnZXMgPSBbXTsKCiAgICAJCXZhciB0ZXh0dXJlID0gbmV3IENvbXByZXNzZWRUZXh0dXJlKCk7CiAgICAJCXRleHR1cmUuaW1hZ2UgPSBpbWFnZXM7CgogICAgCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOwogICAgCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CiAgICAJCWxvYWRlci5zZXRSZXNwb25zZVR5cGUoICdhcnJheWJ1ZmZlcicgKTsKCiAgICAJCWZ1bmN0aW9uIGxvYWRUZXh0dXJlKCBpICkgewoKICAgIAkJCWxvYWRlci5sb2FkKCB1cmxbIGkgXSwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CgogICAgCQkJCXZhciB0ZXhEYXRhcyA9IHNjb3BlLl9wYXJzZXIoIGJ1ZmZlciwgdHJ1ZSApOwoKICAgIAkJCQlpbWFnZXNbIGkgXSA9IHsKICAgIAkJCQkJd2lkdGg6IHRleERhdGFzLndpZHRoLAogICAgCQkJCQloZWlnaHQ6IHRleERhdGFzLmhlaWdodCwKICAgIAkJCQkJZm9ybWF0OiB0ZXhEYXRhcy5mb3JtYXQsCiAgICAJCQkJCW1pcG1hcHM6IHRleERhdGFzLm1pcG1hcHMKICAgIAkJCQl9OwoKICAgIAkJCQlsb2FkZWQgKz0gMTsKCiAgICAJCQkJaWYgKCBsb2FkZWQgPT09IDYgKSB7CgogICAgCQkJCQlpZiAoIHRleERhdGFzLm1pcG1hcENvdW50ID09PSAxICkKICAgIAkJCQkJCXRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyOwoKICAgIAkJCQkJdGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhcy5mb3JtYXQ7CiAgICAJCQkJCXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCiAgICAJCX0KCiAgICAJCWlmICggQXJyYXkuaXNBcnJheSggdXJsICkgKSB7CgogICAgCQkJdmFyIGxvYWRlZCA9IDA7CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHVybC5sZW5ndGg7IGkgPCBpbDsgKysgaSApIHsKCiAgICAJCQkJbG9hZFRleHR1cmUoIGkgKTsKCiAgICAJCQl9CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGNvbXByZXNzZWQgY3ViZW1hcCB0ZXh0dXJlIHN0b3JlZCBpbiBhIHNpbmdsZSBERFMgZmlsZQoKICAgIAkJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkgewoKICAgIAkJCQl2YXIgdGV4RGF0YXMgPSBzY29wZS5fcGFyc2VyKCBidWZmZXIsIHRydWUgKTsKCiAgICAJCQkJaWYgKCB0ZXhEYXRhcy5pc0N1YmVtYXAgKSB7CgogICAgCQkJCQl2YXIgZmFjZXMgPSB0ZXhEYXRhcy5taXBtYXBzLmxlbmd0aCAvIHRleERhdGFzLm1pcG1hcENvdW50OwoKICAgIAkJCQkJZm9yICggdmFyIGYgPSAwOyBmIDwgZmFjZXM7IGYgKysgKSB7CgogICAgCQkJCQkJaW1hZ2VzWyBmIF0gPSB7IG1pcG1hcHM6IFtdIH07CgogICAgCQkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGV4RGF0YXMubWlwbWFwQ291bnQ7IGkgKysgKSB7CgogICAgCQkJCQkJCWltYWdlc1sgZiBdLm1pcG1hcHMucHVzaCggdGV4RGF0YXMubWlwbWFwc1sgZiAqIHRleERhdGFzLm1pcG1hcENvdW50ICsgaSBdICk7CiAgICAJCQkJCQkJaW1hZ2VzWyBmIF0uZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0OwogICAgCQkJCQkJCWltYWdlc1sgZiBdLndpZHRoID0gdGV4RGF0YXMud2lkdGg7CiAgICAJCQkJCQkJaW1hZ2VzWyBmIF0uaGVpZ2h0ID0gdGV4RGF0YXMuaGVpZ2h0OwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCX0KCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXRleHR1cmUuaW1hZ2Uud2lkdGggPSB0ZXhEYXRhcy53aWR0aDsKICAgIAkJCQkJdGV4dHVyZS5pbWFnZS5oZWlnaHQgPSB0ZXhEYXRhcy5oZWlnaHQ7CiAgICAJCQkJCXRleHR1cmUubWlwbWFwcyA9IHRleERhdGFzLm1pcG1hcHM7CgogICAgCQkJCX0KCiAgICAJCQkJaWYgKCB0ZXhEYXRhcy5taXBtYXBDb3VudCA9PT0gMSApIHsKCiAgICAJCQkJCXRleHR1cmUubWluRmlsdGVyID0gTGluZWFyRmlsdGVyOwoKICAgIAkJCQl9CgogICAgCQkJCXRleHR1cmUuZm9ybWF0ID0gdGV4RGF0YXMuZm9ybWF0OwogICAgCQkJCXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggdGV4dHVyZSApOwoKICAgIAkJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0ZXh0dXJlOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBOaWtvcyBNLiAvIGh0dHBzOi8vZ2l0aHViLmNvbS9mb28xMjMvCiAgICAgKgogICAgICogQWJzdHJhY3QgQmFzZSBjbGFzcyB0byBsb2FkIGdlbmVyaWMgYmluYXJ5IHRleHR1cmVzIGZvcm1hdHMgKHJnYmUsIGhkciwgLi4uKQogICAgICovCgogICAgZnVuY3Rpb24gRGF0YVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7CgogICAgCUxvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7CgogICAgCS8vIG92ZXJyaWRlIGluIHN1YiBjbGFzc2VzCiAgICAJdGhpcy5fcGFyc2VyID0gbnVsbDsKCiAgICB9CgogICAgRGF0YVRleHR1cmVMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBEYXRhVGV4dHVyZUxvYWRlciwKCiAgICAJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCiAgICAJCXZhciBzY29wZSA9IHRoaXM7CgogICAgCQl2YXIgdGV4dHVyZSA9IG5ldyBEYXRhVGV4dHVyZSgpOwoKICAgIAkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCB0aGlzLm1hbmFnZXIgKTsKICAgIAkJbG9hZGVyLnNldFJlc3BvbnNlVHlwZSggJ2FycmF5YnVmZmVyJyApOwogICAgCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CiAgICAJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggYnVmZmVyICkgewoKICAgIAkJCXZhciB0ZXhEYXRhID0gc2NvcGUuX3BhcnNlciggYnVmZmVyICk7CgogICAgCQkJaWYgKCAhIHRleERhdGEgKSByZXR1cm47CgogICAgCQkJaWYgKCB0ZXhEYXRhLmltYWdlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCXRleHR1cmUuaW1hZ2UgPSB0ZXhEYXRhLmltYWdlOwoKICAgIAkJCX0gZWxzZSBpZiAoIHRleERhdGEuZGF0YSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQl0ZXh0dXJlLmltYWdlLndpZHRoID0gdGV4RGF0YS53aWR0aDsKICAgIAkJCQl0ZXh0dXJlLmltYWdlLmhlaWdodCA9IHRleERhdGEuaGVpZ2h0OwogICAgCQkJCXRleHR1cmUuaW1hZ2UuZGF0YSA9IHRleERhdGEuZGF0YTsKCiAgICAJCQl9CgogICAgCQkJdGV4dHVyZS53cmFwUyA9IHRleERhdGEud3JhcFMgIT09IHVuZGVmaW5lZCA/IHRleERhdGEud3JhcFMgOiBDbGFtcFRvRWRnZVdyYXBwaW5nOwogICAgCQkJdGV4dHVyZS53cmFwVCA9IHRleERhdGEud3JhcFQgIT09IHVuZGVmaW5lZCA/IHRleERhdGEud3JhcFQgOiBDbGFtcFRvRWRnZVdyYXBwaW5nOwoKICAgIAkJCXRleHR1cmUubWFnRmlsdGVyID0gdGV4RGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCA/IHRleERhdGEubWFnRmlsdGVyIDogTGluZWFyRmlsdGVyOwogICAgCQkJdGV4dHVyZS5taW5GaWx0ZXIgPSB0ZXhEYXRhLm1pbkZpbHRlciAhPT0gdW5kZWZpbmVkID8gdGV4RGF0YS5taW5GaWx0ZXIgOiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXI7CgogICAgCQkJdGV4dHVyZS5hbmlzb3Ryb3B5ID0gdGV4RGF0YS5hbmlzb3Ryb3B5ICE9PSB1bmRlZmluZWQgPyB0ZXhEYXRhLmFuaXNvdHJvcHkgOiAxOwoKICAgIAkJCWlmICggdGV4RGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJdGV4dHVyZS5mb3JtYXQgPSB0ZXhEYXRhLmZvcm1hdDsKCiAgICAJCQl9CiAgICAJCQlpZiAoIHRleERhdGEudHlwZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQl0ZXh0dXJlLnR5cGUgPSB0ZXhEYXRhLnR5cGU7CgogICAgCQkJfQoKICAgIAkJCWlmICggdGV4RGF0YS5taXBtYXBzICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCXRleHR1cmUubWlwbWFwcyA9IHRleERhdGEubWlwbWFwczsKCiAgICAJCQl9CgogICAgCQkJaWYgKCB0ZXhEYXRhLm1pcG1hcENvdW50ID09PSAxICkgewoKICAgIAkJCQl0ZXh0dXJlLm1pbkZpbHRlciA9IExpbmVhckZpbHRlcjsKCiAgICAJCQl9CgogICAgCQkJdGV4dHVyZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIHRleHR1cmUsIHRleERhdGEgKTsKCiAgICAJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCgogICAgCQlyZXR1cm4gdGV4dHVyZTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBJbWFnZUxvYWRlciggbWFuYWdlciApIHsKCiAgICAJTG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTsKCiAgICB9CgogICAgSW1hZ2VMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBJbWFnZUxvYWRlciwKCiAgICAJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCiAgICAJCWlmICggdGhpcy5wYXRoICE9PSB1bmRlZmluZWQgKSB1cmwgPSB0aGlzLnBhdGggKyB1cmw7CgogICAgCQl1cmwgPSB0aGlzLm1hbmFnZXIucmVzb2x2ZVVSTCggdXJsICk7CgogICAgCQl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAkJdmFyIGNhY2hlZCA9IENhY2hlLmdldCggdXJsICk7CgogICAgCQlpZiAoIGNhY2hlZCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKCiAgICAJCQlzZXRUaW1lb3V0KCBmdW5jdGlvbiAoKSB7CgogICAgCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCBjYWNoZWQgKTsKCiAgICAJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCiAgICAJCQl9LCAwICk7CgogICAgCQkJcmV0dXJuIGNhY2hlZDsKCiAgICAJCX0KCiAgICAJCXZhciBpbWFnZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyggJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwnLCAnaW1nJyApOwoKICAgIAkJZnVuY3Rpb24gb25JbWFnZUxvYWQoKSB7CgogICAgCQkJaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTsKICAgIAkJCWltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTsKCiAgICAJCQlDYWNoZS5hZGQoIHVybCwgdGhpcyApOwoKICAgIAkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0aGlzICk7CgogICAgCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCiAgICAJCX0KCiAgICAJCWZ1bmN0aW9uIG9uSW1hZ2VFcnJvciggZXZlbnQgKSB7CgogICAgCQkJaW1hZ2UucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCBvbkltYWdlTG9hZCwgZmFsc2UgKTsKICAgIAkJCWltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIG9uSW1hZ2VFcnJvciwgZmFsc2UgKTsKCiAgICAJCQlpZiAoIG9uRXJyb3IgKSBvbkVycm9yKCBldmVudCApOwoKICAgIAkJCXNjb3BlLm1hbmFnZXIuaXRlbUVycm9yKCB1cmwgKTsKICAgIAkJCXNjb3BlLm1hbmFnZXIuaXRlbUVuZCggdXJsICk7CgogICAgCQl9CgogICAgCQlpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIG9uSW1hZ2VMb2FkLCBmYWxzZSApOwogICAgCQlpbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCBvbkltYWdlRXJyb3IsIGZhbHNlICk7CgogICAgCQlpZiAoIHVybC5zdWJzdHIoIDAsIDUgKSAhPT0gJ2RhdGE6JyApIHsKCiAgICAJCQlpZiAoIHRoaXMuY3Jvc3NPcmlnaW4gIT09IHVuZGVmaW5lZCApIGltYWdlLmNyb3NzT3JpZ2luID0gdGhpcy5jcm9zc09yaWdpbjsKCiAgICAJCX0KCiAgICAJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKCiAgICAJCWltYWdlLnNyYyA9IHVybDsKCiAgICAJCXJldHVybiBpbWFnZTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCgogICAgZnVuY3Rpb24gQ3ViZVRleHR1cmVMb2FkZXIoIG1hbmFnZXIgKSB7CgogICAgCUxvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7CgogICAgfQoKICAgIEN1YmVUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQ3ViZVRleHR1cmVMb2FkZXIsCgogICAgCWxvYWQ6IGZ1bmN0aW9uICggdXJscywgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKICAgIAkJdmFyIHRleHR1cmUgPSBuZXcgQ3ViZVRleHR1cmUoKTsKCiAgICAJCXZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApOwogICAgCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKICAgIAkJbG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApOwoKICAgIAkJdmFyIGxvYWRlZCA9IDA7CgogICAgCQlmdW5jdGlvbiBsb2FkVGV4dHVyZSggaSApIHsKCiAgICAJCQlsb2FkZXIubG9hZCggdXJsc1sgaSBdLCBmdW5jdGlvbiAoIGltYWdlICkgewoKICAgIAkJCQl0ZXh0dXJlLmltYWdlc1sgaSBdID0gaW1hZ2U7CgogICAgCQkJCWxvYWRlZCArKzsKCiAgICAJCQkJaWYgKCBsb2FkZWQgPT09IDYgKSB7CgogICAgCQkJCQl0ZXh0dXJlLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQkJCWlmICggb25Mb2FkICkgb25Mb2FkKCB0ZXh0dXJlICk7CgogICAgCQkJCX0KCiAgICAJCQl9LCB1bmRlZmluZWQsIG9uRXJyb3IgKTsKCiAgICAJCX0KCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IHVybHMubGVuZ3RoOyArKyBpICkgewoKICAgIAkJCWxvYWRUZXh0dXJlKCBpICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGV4dHVyZTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICkgewoKICAgIAlMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApOwoKICAgIH0KCiAgICBUZXh0dXJlTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogVGV4dHVyZUxvYWRlciwKCiAgICAJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCiAgICAJCXZhciB0ZXh0dXJlID0gbmV3IFRleHR1cmUoKTsKCiAgICAJCXZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIHRoaXMubWFuYWdlciApOwogICAgCQlsb2FkZXIuc2V0Q3Jvc3NPcmlnaW4oIHRoaXMuY3Jvc3NPcmlnaW4gKTsKICAgIAkJbG9hZGVyLnNldFBhdGgoIHRoaXMucGF0aCApOwoKICAgIAkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBpbWFnZSApIHsKCiAgICAJCQl0ZXh0dXJlLmltYWdlID0gaW1hZ2U7CgogICAgCQkJLy8gSlBFR3MgY2FuJ3QgaGF2ZSBhbiBhbHBoYSBjaGFubmVsLCBzbyBtZW1vcnkgY2FuIGJlIHNhdmVkIGJ5IHN0b3JpbmcgdGhlbSBhcyBSR0IuCiAgICAJCQl2YXIgaXNKUEVHID0gdXJsLnNlYXJjaCggL1wuanBlP2coJHxcPykvaSApID4gMCB8fCB1cmwuc2VhcmNoKCAvXmRhdGFcOmltYWdlXC9qcGVnLyApID09PSAwOwoKICAgIAkJCXRleHR1cmUuZm9ybWF0ID0gaXNKUEVHID8gUkdCRm9ybWF0IDogUkdCQUZvcm1hdDsKICAgIAkJCXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJCWlmICggb25Mb2FkICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCW9uTG9hZCggdGV4dHVyZSApOwoKICAgIAkJCX0KCiAgICAJCX0sIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKTsKCiAgICAJCXJldHVybiB0ZXh0dXJlOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwogICAgICogRXh0ZW5zaWJsZSBjdXJ2ZSBvYmplY3QKICAgICAqCiAgICAgKiBTb21lIGNvbW1vbiBvZiBjdXJ2ZSBtZXRob2RzOgogICAgICogLmdldFBvaW50KCB0LCBvcHRpb25hbFRhcmdldCApLCAuZ2V0VGFuZ2VudCggdCApCiAgICAgKiAuZ2V0UG9pbnRBdCggdSwgb3B0aW9uYWxUYXJnZXQgKSwgLmdldFRhbmdlbnRBdCggdSApCiAgICAgKiAuZ2V0UG9pbnRzKCksIC5nZXRTcGFjZWRQb2ludHMoKQogICAgICogLmdldExlbmd0aCgpCiAgICAgKiAudXBkYXRlQXJjTGVuZ3RocygpCiAgICAgKgogICAgICogVGhpcyBmb2xsb3dpbmcgY3VydmVzIGluaGVyaXQgZnJvbSBUSFJFRS5DdXJ2ZToKICAgICAqCiAgICAgKiAtLSAyRCBjdXJ2ZXMgLS0KICAgICAqIFRIUkVFLkFyY0N1cnZlCiAgICAgKiBUSFJFRS5DdWJpY0JlemllckN1cnZlCiAgICAgKiBUSFJFRS5FbGxpcHNlQ3VydmUKICAgICAqIFRIUkVFLkxpbmVDdXJ2ZQogICAgICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUKICAgICAqIFRIUkVFLlNwbGluZUN1cnZlCiAgICAgKgogICAgICogLS0gM0QgY3VydmVzIC0tCiAgICAgKiBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzCiAgICAgKiBUSFJFRS5DdWJpY0JlemllckN1cnZlMwogICAgICogVEhSRUUuTGluZUN1cnZlMwogICAgICogVEhSRUUuUXVhZHJhdGljQmV6aWVyQ3VydmUzCiAgICAgKgogICAgICogQSBzZXJpZXMgb2YgY3VydmVzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIFRIUkVFLkN1cnZlUGF0aC4KICAgICAqCiAgICAgKiovCgogICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgKglBYnN0cmFjdCBDdXJ2ZSBiYXNlIGNsYXNzCiAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgogICAgZnVuY3Rpb24gQ3VydmUoKSB7CgogICAgCXRoaXMudHlwZSA9ICdDdXJ2ZSc7CgogICAgCXRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zID0gMjAwOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBDdXJ2ZS5wcm90b3R5cGUsIHsKCiAgICAJLy8gVmlydHVhbCBiYXNlIGNsYXNzIG1ldGhvZCB0byBvdmVyd3JpdGUgYW5kIGltcGxlbWVudCBpbiBzdWJjbGFzc2VzCiAgICAJLy8JLSB0IFswIC4uIDFdCgogICAgCWdldFBvaW50OiBmdW5jdGlvbiAoIC8qIHQsIG9wdGlvbmFsVGFyZ2V0ICovICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuQ3VydmU6IC5nZXRQb2ludCgpIG5vdCBpbXBsZW1lbnRlZC4nICk7CiAgICAJCXJldHVybiBudWxsOwoKICAgIAl9LAoKICAgIAkvLyBHZXQgcG9pbnQgYXQgcmVsYXRpdmUgcG9zaXRpb24gaW4gY3VydmUgYWNjb3JkaW5nIHRvIGFyYyBsZW5ndGgKICAgIAkvLyAtIHUgWzAgLi4gMV0KCiAgICAJZ2V0UG9pbnRBdDogZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJCXZhciB0ID0gdGhpcy5nZXRVdG9UbWFwcGluZyggdSApOwogICAgCQlyZXR1cm4gdGhpcy5nZXRQb2ludCggdCwgb3B0aW9uYWxUYXJnZXQgKTsKCiAgICAJfSwKCiAgICAJLy8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludCggdCApCgogICAgCWdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgogICAgCQlpZiAoIGRpdmlzaW9ucyA9PT0gdW5kZWZpbmVkICkgZGl2aXNpb25zID0gNTsKCiAgICAJCXZhciBwb2ludHMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBkID0gMDsgZCA8PSBkaXZpc2lvbnM7IGQgKysgKSB7CgogICAgCQkJcG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGQgLyBkaXZpc2lvbnMgKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHBvaW50czsKCiAgICAJfSwKCiAgICAJLy8gR2V0IHNlcXVlbmNlIG9mIHBvaW50cyB1c2luZyBnZXRQb2ludEF0KCB1ICkKCiAgICAJZ2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKCiAgICAJCWlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA1OwoKICAgIAkJdmFyIHBvaW50cyA9IFtdOwoKICAgIAkJZm9yICggdmFyIGQgPSAwOyBkIDw9IGRpdmlzaW9uczsgZCArKyApIHsKCiAgICAJCQlwb2ludHMucHVzaCggdGhpcy5nZXRQb2ludEF0KCBkIC8gZGl2aXNpb25zICkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBwb2ludHM7CgogICAgCX0sCgogICAgCS8vIEdldCB0b3RhbCBjdXJ2ZSBhcmMgbGVuZ3RoCgogICAgCWdldExlbmd0aDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGxlbmd0aHMgPSB0aGlzLmdldExlbmd0aHMoKTsKICAgIAkJcmV0dXJuIGxlbmd0aHNbIGxlbmd0aHMubGVuZ3RoIC0gMSBdOwoKICAgIAl9LAoKICAgIAkvLyBHZXQgbGlzdCBvZiBjdW11bGF0aXZlIHNlZ21lbnQgbGVuZ3RocwoKICAgIAlnZXRMZW5ndGhzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKCiAgICAJCWlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9uczsKCiAgICAJCWlmICggdGhpcy5jYWNoZUFyY0xlbmd0aHMgJiYKICAgIAkJCSggdGhpcy5jYWNoZUFyY0xlbmd0aHMubGVuZ3RoID09PSBkaXZpc2lvbnMgKyAxICkgJiYKICAgIAkJCSEgdGhpcy5uZWVkc1VwZGF0ZSApIHsKCiAgICAJCQlyZXR1cm4gdGhpcy5jYWNoZUFyY0xlbmd0aHM7CgogICAgCQl9CgogICAgCQl0aGlzLm5lZWRzVXBkYXRlID0gZmFsc2U7CgogICAgCQl2YXIgY2FjaGUgPSBbXTsKICAgIAkJdmFyIGN1cnJlbnQsIGxhc3QgPSB0aGlzLmdldFBvaW50KCAwICk7CiAgICAJCXZhciBwLCBzdW0gPSAwOwoKICAgIAkJY2FjaGUucHVzaCggMCApOwoKICAgIAkJZm9yICggcCA9IDE7IHAgPD0gZGl2aXNpb25zOyBwICsrICkgewoKICAgIAkJCWN1cnJlbnQgPSB0aGlzLmdldFBvaW50KCBwIC8gZGl2aXNpb25zICk7CiAgICAJCQlzdW0gKz0gY3VycmVudC5kaXN0YW5jZVRvKCBsYXN0ICk7CiAgICAJCQljYWNoZS5wdXNoKCBzdW0gKTsKICAgIAkJCWxhc3QgPSBjdXJyZW50OwoKICAgIAkJfQoKICAgIAkJdGhpcy5jYWNoZUFyY0xlbmd0aHMgPSBjYWNoZTsKCiAgICAJCXJldHVybiBjYWNoZTsgLy8geyBzdW1zOiBjYWNoZSwgc3VtOiBzdW0gfTsgU3VtIGlzIGluIHRoZSBsYXN0IGVsZW1lbnQuCgogICAgCX0sCgogICAgCXVwZGF0ZUFyY0xlbmd0aHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMubmVlZHNVcGRhdGUgPSB0cnVlOwogICAgCQl0aGlzLmdldExlbmd0aHMoKTsKCiAgICAJfSwKCiAgICAJLy8gR2l2ZW4gdSAoIDAgLi4gMSApLCBnZXQgYSB0IHRvIGZpbmQgcC4gVGhpcyBnaXZlcyB5b3UgcG9pbnRzIHdoaWNoIGFyZSBlcXVpZGlzdGFudAoKICAgIAlnZXRVdG9UbWFwcGluZzogZnVuY3Rpb24gKCB1LCBkaXN0YW5jZSApIHsKCiAgICAJCXZhciBhcmNMZW5ndGhzID0gdGhpcy5nZXRMZW5ndGhzKCk7CgogICAgCQl2YXIgaSA9IDAsIGlsID0gYXJjTGVuZ3Rocy5sZW5ndGg7CgogICAgCQl2YXIgdGFyZ2V0QXJjTGVuZ3RoOyAvLyBUaGUgdGFyZ2V0ZWQgdSBkaXN0YW5jZSB2YWx1ZSB0byBnZXQKCiAgICAJCWlmICggZGlzdGFuY2UgKSB7CgogICAgCQkJdGFyZ2V0QXJjTGVuZ3RoID0gZGlzdGFuY2U7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXRhcmdldEFyY0xlbmd0aCA9IHUgKiBhcmNMZW5ndGhzWyBpbCAtIDEgXTsKCiAgICAJCX0KCiAgICAJCS8vIGJpbmFyeSBzZWFyY2ggZm9yIHRoZSBpbmRleCB3aXRoIGxhcmdlc3QgdmFsdWUgc21hbGxlciB0aGFuIHRhcmdldCB1IGRpc3RhbmNlCgogICAgCQl2YXIgbG93ID0gMCwgaGlnaCA9IGlsIC0gMSwgY29tcGFyaXNvbjsKCiAgICAJCXdoaWxlICggbG93IDw9IGhpZ2ggKSB7CgogICAgCQkJaSA9IE1hdGguZmxvb3IoIGxvdyArICggaGlnaCAtIGxvdyApIC8gMiApOyAvLyBsZXNzIGxpa2VseSB0byBvdmVyZmxvdywgdGhvdWdoIHByb2JhYmx5IG5vdCBpc3N1ZSBoZXJlLCBKUyBkb2Vzbid0IHJlYWxseSBoYXZlIGludGVnZXJzLCBhbGwgbnVtYmVycyBhcmUgZmxvYXRzCgogICAgCQkJY29tcGFyaXNvbiA9IGFyY0xlbmd0aHNbIGkgXSAtIHRhcmdldEFyY0xlbmd0aDsKCiAgICAJCQlpZiAoIGNvbXBhcmlzb24gPCAwICkgewoKICAgIAkJCQlsb3cgPSBpICsgMTsKCiAgICAJCQl9IGVsc2UgaWYgKCBjb21wYXJpc29uID4gMCApIHsKCiAgICAJCQkJaGlnaCA9IGkgLSAxOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCWhpZ2ggPSBpOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCQkvLyBET05FCgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaSA9IGhpZ2g7CgogICAgCQlpZiAoIGFyY0xlbmd0aHNbIGkgXSA9PT0gdGFyZ2V0QXJjTGVuZ3RoICkgewoKICAgIAkJCXJldHVybiBpIC8gKCBpbCAtIDEgKTsKCiAgICAJCX0KCiAgICAJCS8vIHdlIGNvdWxkIGdldCBmaW5lciBncmFpbiBhdCBsZW5ndGhzLCBvciB1c2Ugc2ltcGxlIGludGVycG9sYXRpb24gYmV0d2VlbiB0d28gcG9pbnRzCgogICAgCQl2YXIgbGVuZ3RoQmVmb3JlID0gYXJjTGVuZ3Roc1sgaSBdOwogICAgCQl2YXIgbGVuZ3RoQWZ0ZXIgPSBhcmNMZW5ndGhzWyBpICsgMSBdOwoKICAgIAkJdmFyIHNlZ21lbnRMZW5ndGggPSBsZW5ndGhBZnRlciAtIGxlbmd0aEJlZm9yZTsKCiAgICAJCS8vIGRldGVybWluZSB3aGVyZSB3ZSBhcmUgYmV0d2VlbiB0aGUgJ2JlZm9yZScgYW5kICdhZnRlcicgcG9pbnRzCgogICAgCQl2YXIgc2VnbWVudEZyYWN0aW9uID0gKCB0YXJnZXRBcmNMZW5ndGggLSBsZW5ndGhCZWZvcmUgKSAvIHNlZ21lbnRMZW5ndGg7CgogICAgCQkvLyBhZGQgdGhhdCBmcmFjdGlvbmFsIGFtb3VudCB0byB0CgogICAgCQl2YXIgdCA9ICggaSArIHNlZ21lbnRGcmFjdGlvbiApIC8gKCBpbCAtIDEgKTsKCiAgICAJCXJldHVybiB0OwoKICAgIAl9LAoKICAgIAkvLyBSZXR1cm5zIGEgdW5pdCB2ZWN0b3IgdGFuZ2VudCBhdCB0CiAgICAJLy8gSW4gY2FzZSBhbnkgc3ViIGN1cnZlIGRvZXMgbm90IGltcGxlbWVudCBpdHMgdGFuZ2VudCBkZXJpdmF0aW9uLAogICAgCS8vIDIgcG9pbnRzIGEgc21hbGwgZGVsdGEgYXBhcnQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgaXRzIGdyYWRpZW50CiAgICAJLy8gd2hpY2ggc2VlbXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgYXBwcm94aW1hdGlvbgoKICAgIAlnZXRUYW5nZW50OiBmdW5jdGlvbiAoIHQgKSB7CgogICAgCQl2YXIgZGVsdGEgPSAwLjAwMDE7CiAgICAJCXZhciB0MSA9IHQgLSBkZWx0YTsKICAgIAkJdmFyIHQyID0gdCArIGRlbHRhOwoKICAgIAkJLy8gQ2FwcGluZyBpbiBjYXNlIG9mIGRhbmdlcgoKICAgIAkJaWYgKCB0MSA8IDAgKSB0MSA9IDA7CiAgICAJCWlmICggdDIgPiAxICkgdDIgPSAxOwoKICAgIAkJdmFyIHB0MSA9IHRoaXMuZ2V0UG9pbnQoIHQxICk7CiAgICAJCXZhciBwdDIgPSB0aGlzLmdldFBvaW50KCB0MiApOwoKICAgIAkJdmFyIHZlYyA9IHB0Mi5jbG9uZSgpLnN1YiggcHQxICk7CiAgICAJCXJldHVybiB2ZWMubm9ybWFsaXplKCk7CgogICAgCX0sCgogICAgCWdldFRhbmdlbnRBdDogZnVuY3Rpb24gKCB1ICkgewoKICAgIAkJdmFyIHQgPSB0aGlzLmdldFV0b1RtYXBwaW5nKCB1ICk7CiAgICAJCXJldHVybiB0aGlzLmdldFRhbmdlbnQoIHQgKTsKCiAgICAJfSwKCiAgICAJY29tcHV0ZUZyZW5ldEZyYW1lczogZnVuY3Rpb24gKCBzZWdtZW50cywgY2xvc2VkICkgewoKICAgIAkJLy8gc2VlIGh0dHA6Ly93d3cuY3MuaW5kaWFuYS5lZHUvcHViL3RlY2hyZXBvcnRzL1RSNDI1LnBkZgoKICAgIAkJdmFyIG5vcm1hbCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl2YXIgdGFuZ2VudHMgPSBbXTsKICAgIAkJdmFyIG5vcm1hbHMgPSBbXTsKICAgIAkJdmFyIGJpbm9ybWFscyA9IFtdOwoKICAgIAkJdmFyIHZlYyA9IG5ldyBWZWN0b3IzKCk7CiAgICAJCXZhciBtYXQgPSBuZXcgTWF0cml4NCgpOwoKICAgIAkJdmFyIGksIHUsIHRoZXRhOwoKICAgIAkJLy8gY29tcHV0ZSB0aGUgdGFuZ2VudCB2ZWN0b3JzIGZvciBlYWNoIHNlZ21lbnQgb24gdGhlIGN1cnZlCgogICAgCQlmb3IgKCBpID0gMDsgaSA8PSBzZWdtZW50czsgaSArKyApIHsKCiAgICAJCQl1ID0gaSAvIHNlZ21lbnRzOwoKICAgIAkJCXRhbmdlbnRzWyBpIF0gPSB0aGlzLmdldFRhbmdlbnRBdCggdSApOwogICAgCQkJdGFuZ2VudHNbIGkgXS5ub3JtYWxpemUoKTsKCiAgICAJCX0KCiAgICAJCS8vIHNlbGVjdCBhbiBpbml0aWFsIG5vcm1hbCB2ZWN0b3IgcGVycGVuZGljdWxhciB0byB0aGUgZmlyc3QgdGFuZ2VudCB2ZWN0b3IsCiAgICAJCS8vIGFuZCBpbiB0aGUgZGlyZWN0aW9uIG9mIHRoZSBtaW5pbXVtIHRhbmdlbnQgeHl6IGNvbXBvbmVudAoKICAgIAkJbm9ybWFsc1sgMCBdID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJYmlub3JtYWxzWyAwIF0gPSBuZXcgVmVjdG9yMygpOwogICAgCQl2YXIgbWluID0gTnVtYmVyLk1BWF9WQUxVRTsKICAgIAkJdmFyIHR4ID0gTWF0aC5hYnMoIHRhbmdlbnRzWyAwIF0ueCApOwogICAgCQl2YXIgdHkgPSBNYXRoLmFicyggdGFuZ2VudHNbIDAgXS55ICk7CiAgICAJCXZhciB0eiA9IE1hdGguYWJzKCB0YW5nZW50c1sgMCBdLnogKTsKCiAgICAJCWlmICggdHggPD0gbWluICkgewoKICAgIAkJCW1pbiA9IHR4OwogICAgCQkJbm9ybWFsLnNldCggMSwgMCwgMCApOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0eSA8PSBtaW4gKSB7CgogICAgCQkJbWluID0gdHk7CiAgICAJCQlub3JtYWwuc2V0KCAwLCAxLCAwICk7CgogICAgCQl9CgogICAgCQlpZiAoIHR6IDw9IG1pbiApIHsKCiAgICAJCQlub3JtYWwuc2V0KCAwLCAwLCAxICk7CgogICAgCQl9CgogICAgCQl2ZWMuY3Jvc3NWZWN0b3JzKCB0YW5nZW50c1sgMCBdLCBub3JtYWwgKS5ub3JtYWxpemUoKTsKCiAgICAJCW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIHZlYyApOwogICAgCQliaW5vcm1hbHNbIDAgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyAwIF0sIG5vcm1hbHNbIDAgXSApOwoKCiAgICAJCS8vIGNvbXB1dGUgdGhlIHNsb3dseS12YXJ5aW5nIG5vcm1hbCBhbmQgYmlub3JtYWwgdmVjdG9ycyBmb3IgZWFjaCBzZWdtZW50IG9uIHRoZSBjdXJ2ZQoKICAgIAkJZm9yICggaSA9IDE7IGkgPD0gc2VnbWVudHM7IGkgKysgKSB7CgogICAgCQkJbm9ybWFsc1sgaSBdID0gbm9ybWFsc1sgaSAtIDEgXS5jbG9uZSgpOwoKICAgIAkJCWJpbm9ybWFsc1sgaSBdID0gYmlub3JtYWxzWyBpIC0gMSBdLmNsb25lKCk7CgogICAgCQkJdmVjLmNyb3NzVmVjdG9ycyggdGFuZ2VudHNbIGkgLSAxIF0sIHRhbmdlbnRzWyBpIF0gKTsKCiAgICAJCQlpZiAoIHZlYy5sZW5ndGgoKSA+IE51bWJlci5FUFNJTE9OICkgewoKICAgIAkJCQl2ZWMubm9ybWFsaXplKCk7CgogICAgCQkJCXRoZXRhID0gTWF0aC5hY29zKCBfTWF0aC5jbGFtcCggdGFuZ2VudHNbIGkgLSAxIF0uZG90KCB0YW5nZW50c1sgaSBdICksIC0gMSwgMSApICk7IC8vIGNsYW1wIGZvciBmbG9hdGluZyBwdCBlcnJvcnMKCiAgICAJCQkJbm9ybWFsc1sgaSBdLmFwcGx5TWF0cml4NCggbWF0Lm1ha2VSb3RhdGlvbkF4aXMoIHZlYywgdGhldGEgKSApOwoKICAgIAkJCX0KCiAgICAJCQliaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApOwoKICAgIAkJfQoKICAgIAkJLy8gaWYgdGhlIGN1cnZlIGlzIGNsb3NlZCwgcG9zdHByb2Nlc3MgdGhlIHZlY3RvcnMgc28gdGhlIGZpcnN0IGFuZCBsYXN0IG5vcm1hbCB2ZWN0b3JzIGFyZSB0aGUgc2FtZQoKICAgIAkJaWYgKCBjbG9zZWQgPT09IHRydWUgKSB7CgogICAgCQkJdGhldGEgPSBNYXRoLmFjb3MoIF9NYXRoLmNsYW1wKCBub3JtYWxzWyAwIF0uZG90KCBub3JtYWxzWyBzZWdtZW50cyBdICksIC0gMSwgMSApICk7CiAgICAJCQl0aGV0YSAvPSBzZWdtZW50czsKCiAgICAJCQlpZiAoIHRhbmdlbnRzWyAwIF0uZG90KCB2ZWMuY3Jvc3NWZWN0b3JzKCBub3JtYWxzWyAwIF0sIG5vcm1hbHNbIHNlZ21lbnRzIF0gKSApID4gMCApIHsKCiAgICAJCQkJdGhldGEgPSAtIHRoZXRhOwoKICAgIAkJCX0KCiAgICAJCQlmb3IgKCBpID0gMTsgaSA8PSBzZWdtZW50czsgaSArKyApIHsKCiAgICAJCQkJLy8gdHdpc3QgYSBsaXR0bGUuLi4KICAgIAkJCQlub3JtYWxzWyBpIF0uYXBwbHlNYXRyaXg0KCBtYXQubWFrZVJvdGF0aW9uQXhpcyggdGFuZ2VudHNbIGkgXSwgdGhldGEgKiBpICkgKTsKICAgIAkJCQliaW5vcm1hbHNbIGkgXS5jcm9zc1ZlY3RvcnMoIHRhbmdlbnRzWyBpIF0sIG5vcm1hbHNbIGkgXSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiB7CiAgICAJCQl0YW5nZW50czogdGFuZ2VudHMsCiAgICAJCQlub3JtYWxzOiBub3JtYWxzLAogICAgCQkJYmlub3JtYWxzOiBiaW5vcm1hbHMKICAgIAkJfTsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQl0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHNvdXJjZS5hcmNMZW5ndGhEaXZpc2lvbnM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZGF0YSA9IHsKICAgIAkJCW1ldGFkYXRhOiB7CiAgICAJCQkJdmVyc2lvbjogNC41LAogICAgCQkJCXR5cGU6ICdDdXJ2ZScsCiAgICAJCQkJZ2VuZXJhdG9yOiAnQ3VydmUudG9KU09OJwogICAgCQkJfQogICAgCQl9OwoKICAgIAkJZGF0YS5hcmNMZW5ndGhEaXZpc2lvbnMgPSB0aGlzLmFyY0xlbmd0aERpdmlzaW9uczsKICAgIAkJZGF0YS50eXBlID0gdGhpcy50eXBlOwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0sCgogICAgCWZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCQl0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IGpzb24uYXJjTGVuZ3RoRGl2aXNpb25zOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgZnVuY3Rpb24gRWxsaXBzZUN1cnZlKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHsKCiAgICAJQ3VydmUuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnRWxsaXBzZUN1cnZlJzsKCiAgICAJdGhpcy5hWCA9IGFYIHx8IDA7CiAgICAJdGhpcy5hWSA9IGFZIHx8IDA7CgogICAgCXRoaXMueFJhZGl1cyA9IHhSYWRpdXMgfHwgMTsKICAgIAl0aGlzLnlSYWRpdXMgPSB5UmFkaXVzIHx8IDE7CgogICAgCXRoaXMuYVN0YXJ0QW5nbGUgPSBhU3RhcnRBbmdsZSB8fCAwOwogICAgCXRoaXMuYUVuZEFuZ2xlID0gYUVuZEFuZ2xlIHx8IDIgKiBNYXRoLlBJOwoKICAgIAl0aGlzLmFDbG9ja3dpc2UgPSBhQ2xvY2t3aXNlIHx8IGZhbHNlOwoKICAgIAl0aGlzLmFSb3RhdGlvbiA9IGFSb3RhdGlvbiB8fCAwOwoKICAgIH0KCiAgICBFbGxpcHNlQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CiAgICBFbGxpcHNlQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRWxsaXBzZUN1cnZlOwoKICAgIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuaXNFbGxpcHNlQ3VydmUgPSB0cnVlOwoKICAgIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkgewoKICAgIAl2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOwoKICAgIAl2YXIgdHdvUGkgPSBNYXRoLlBJICogMjsKICAgIAl2YXIgZGVsdGFBbmdsZSA9IHRoaXMuYUVuZEFuZ2xlIC0gdGhpcy5hU3RhcnRBbmdsZTsKICAgIAl2YXIgc2FtZVBvaW50cyA9IE1hdGguYWJzKCBkZWx0YUFuZ2xlICkgPCBOdW1iZXIuRVBTSUxPTjsKCiAgICAJLy8gZW5zdXJlcyB0aGF0IGRlbHRhQW5nbGUgaXMgMCAuLiAyIFBJCiAgICAJd2hpbGUgKCBkZWx0YUFuZ2xlIDwgMCApIGRlbHRhQW5nbGUgKz0gdHdvUGk7CiAgICAJd2hpbGUgKCBkZWx0YUFuZ2xlID4gdHdvUGkgKSBkZWx0YUFuZ2xlIC09IHR3b1BpOwoKICAgIAlpZiAoIGRlbHRhQW5nbGUgPCBOdW1iZXIuRVBTSUxPTiApIHsKCiAgICAJCWlmICggc2FtZVBvaW50cyApIHsKCiAgICAJCQlkZWx0YUFuZ2xlID0gMDsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJZGVsdGFBbmdsZSA9IHR3b1BpOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWlmICggdGhpcy5hQ2xvY2t3aXNlID09PSB0cnVlICYmICEgc2FtZVBvaW50cyApIHsKCiAgICAJCWlmICggZGVsdGFBbmdsZSA9PT0gdHdvUGkgKSB7CgogICAgCQkJZGVsdGFBbmdsZSA9IC0gdHdvUGk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWRlbHRhQW5nbGUgPSBkZWx0YUFuZ2xlIC0gdHdvUGk7CgogICAgCQl9CgogICAgCX0KCiAgICAJdmFyIGFuZ2xlID0gdGhpcy5hU3RhcnRBbmdsZSArIHQgKiBkZWx0YUFuZ2xlOwogICAgCXZhciB4ID0gdGhpcy5hWCArIHRoaXMueFJhZGl1cyAqIE1hdGguY29zKCBhbmdsZSApOwogICAgCXZhciB5ID0gdGhpcy5hWSArIHRoaXMueVJhZGl1cyAqIE1hdGguc2luKCBhbmdsZSApOwoKICAgIAlpZiAoIHRoaXMuYVJvdGF0aW9uICE9PSAwICkgewoKICAgIAkJdmFyIGNvcyA9IE1hdGguY29zKCB0aGlzLmFSb3RhdGlvbiApOwogICAgCQl2YXIgc2luID0gTWF0aC5zaW4oIHRoaXMuYVJvdGF0aW9uICk7CgogICAgCQl2YXIgdHggPSB4IC0gdGhpcy5hWDsKICAgIAkJdmFyIHR5ID0geSAtIHRoaXMuYVk7CgogICAgCQkvLyBSb3RhdGUgdGhlIHBvaW50IGFib3V0IHRoZSBjZW50ZXIgb2YgdGhlIGVsbGlwc2UuCiAgICAJCXggPSB0eCAqIGNvcyAtIHR5ICogc2luICsgdGhpcy5hWDsKICAgIAkJeSA9IHR4ICogc2luICsgdHkgKiBjb3MgKyB0aGlzLmFZOwoKICAgIAl9CgogICAgCXJldHVybiBwb2ludC5zZXQoIHgsIHkgKTsKCiAgICB9OwoKICAgIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy5hWCA9IHNvdXJjZS5hWDsKICAgIAl0aGlzLmFZID0gc291cmNlLmFZOwoKICAgIAl0aGlzLnhSYWRpdXMgPSBzb3VyY2UueFJhZGl1czsKICAgIAl0aGlzLnlSYWRpdXMgPSBzb3VyY2UueVJhZGl1czsKCiAgICAJdGhpcy5hU3RhcnRBbmdsZSA9IHNvdXJjZS5hU3RhcnRBbmdsZTsKICAgIAl0aGlzLmFFbmRBbmdsZSA9IHNvdXJjZS5hRW5kQW5nbGU7CgogICAgCXRoaXMuYUNsb2Nrd2lzZSA9IHNvdXJjZS5hQ2xvY2t3aXNlOwoKICAgIAl0aGlzLmFSb3RhdGlvbiA9IHNvdXJjZS5hUm90YXRpb247CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgoKICAgIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKICAgIAl2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKICAgIAlkYXRhLmFYID0gdGhpcy5hWDsKICAgIAlkYXRhLmFZID0gdGhpcy5hWTsKCiAgICAJZGF0YS54UmFkaXVzID0gdGhpcy54UmFkaXVzOwogICAgCWRhdGEueVJhZGl1cyA9IHRoaXMueVJhZGl1czsKCiAgICAJZGF0YS5hU3RhcnRBbmdsZSA9IHRoaXMuYVN0YXJ0QW5nbGU7CiAgICAJZGF0YS5hRW5kQW5nbGUgPSB0aGlzLmFFbmRBbmdsZTsKCiAgICAJZGF0YS5hQ2xvY2t3aXNlID0gdGhpcy5hQ2xvY2t3aXNlOwoKICAgIAlkYXRhLmFSb3RhdGlvbiA9IHRoaXMuYVJvdGF0aW9uOwoKICAgIAlyZXR1cm4gZGF0YTsKCiAgICB9OwoKICAgIEVsbGlwc2VDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgogICAgCXRoaXMuYVggPSBqc29uLmFYOwogICAgCXRoaXMuYVkgPSBqc29uLmFZOwoKICAgIAl0aGlzLnhSYWRpdXMgPSBqc29uLnhSYWRpdXM7CiAgICAJdGhpcy55UmFkaXVzID0ganNvbi55UmFkaXVzOwoKICAgIAl0aGlzLmFTdGFydEFuZ2xlID0ganNvbi5hU3RhcnRBbmdsZTsKICAgIAl0aGlzLmFFbmRBbmdsZSA9IGpzb24uYUVuZEFuZ2xlOwoKICAgIAl0aGlzLmFDbG9ja3dpc2UgPSBqc29uLmFDbG9ja3dpc2U7CgogICAgCXRoaXMuYVJvdGF0aW9uID0ganNvbi5hUm90YXRpb247CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgZnVuY3Rpb24gQXJjQ3VydmUoIGFYLCBhWSwgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApIHsKCiAgICAJRWxsaXBzZUN1cnZlLmNhbGwoIHRoaXMsIGFYLCBhWSwgYVJhZGl1cywgYVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApOwoKICAgIAl0aGlzLnR5cGUgPSAnQXJjQ3VydmUnOwoKICAgIH0KCiAgICBBcmNDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFbGxpcHNlQ3VydmUucHJvdG90eXBlICk7CiAgICBBcmNDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBBcmNDdXJ2ZTsKCiAgICBBcmNDdXJ2ZS5wcm90b3R5cGUuaXNBcmNDdXJ2ZSA9IHRydWU7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHp6ODUgaHR0cHM6Ly9naXRodWIuY29tL3p6ODUKICAgICAqCiAgICAgKiBDZW50cmlwZXRhbCBDYXRtdWxsUm9tIEN1cnZlIC0gd2hpY2ggaXMgdXNlZnVsIGZvciBhdm9pZGluZwogICAgICogY3VzcHMgYW5kIHNlbGYtaW50ZXJzZWN0aW9ucyBpbiBub24tdW5pZm9ybSBjYXRtdWxsIHJvbSBjdXJ2ZXMuCiAgICAgKiBodHRwOi8vd3d3LmNlbXl1a3NlbC5jb20vcmVzZWFyY2gvY2F0bXVsbHJvbV9wYXJhbS9jYXRtdWxscm9tLnBkZgogICAgICoKICAgICAqIGN1cnZlLnR5cGUgYWNjZXB0cyBjZW50cmlwZXRhbChkZWZhdWx0KSwgY2hvcmRhbCBhbmQgY2F0bXVsbHJvbQogICAgICogY3VydmUudGVuc2lvbiBpcyB1c2VkIGZvciBjYXRtdWxscm9tIHdoaWNoIGRlZmF1bHRzIHRvIDAuNQogICAgICovCgoKICAgIC8qCiAgICBCYXNlZCBvbiBhbiBvcHRpbWl6ZWQgYysrIHNvbHV0aW9uIGluCiAgICAgLSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzk0ODk3MzYvY2F0bXVsbC1yb20tY3VydmUtd2l0aC1uby1jdXNwcy1hbmQtbm8tc2VsZi1pbnRlcnNlY3Rpb25zLwogICAgIC0gaHR0cDovL2lkZW9uZS5jb20vTm9FYlZNCgogICAgVGhpcyBDdWJpY1BvbHkgY2xhc3MgY291bGQgYmUgdXNlZCBmb3IgcmV1c2luZyBzb21lIHZhcmlhYmxlcyBhbmQgY2FsY3VsYXRpb25zLAogICAgYnV0IGZvciB0aHJlZS5qcyBjdXJ2ZSB1c2UsIGl0IGNvdWxkIGJlIHBvc3NpYmxlIGlubGluZWQgYW5kIGZsYXR0ZW4gaW50byBhIHNpbmdsZSBmdW5jdGlvbiBjYWxsCiAgICB3aGljaCBjYW4gYmUgcGxhY2VkIGluIEN1cnZlVXRpbHMuCiAgICAqLwoKICAgIGZ1bmN0aW9uIEN1YmljUG9seSgpIHsKCiAgICAJdmFyIGMwID0gMCwgYzEgPSAwLCBjMiA9IDAsIGMzID0gMDsKCiAgICAJLyoKICAgIAkgKiBDb21wdXRlIGNvZWZmaWNpZW50cyBmb3IgYSBjdWJpYyBwb2x5bm9taWFsCiAgICAJICogICBwKHMpID0gYzAgKyBjMSpzICsgYzIqc14yICsgYzMqc14zCiAgICAJICogc3VjaCB0aGF0CiAgICAJICogICBwKDApID0geDAsIHAoMSkgPSB4MQogICAgCSAqICBhbmQKICAgIAkgKiAgIHAnKDApID0gdDAsIHAnKDEpID0gdDEuCiAgICAJICovCiAgICAJZnVuY3Rpb24gaW5pdCggeDAsIHgxLCB0MCwgdDEgKSB7CgogICAgCQljMCA9IHgwOwogICAgCQljMSA9IHQwOwogICAgCQljMiA9IC0gMyAqIHgwICsgMyAqIHgxIC0gMiAqIHQwIC0gdDE7CiAgICAJCWMzID0gMiAqIHgwIC0gMiAqIHgxICsgdDAgKyB0MTsKCiAgICAJfQoKICAgIAlyZXR1cm4gewoKICAgIAkJaW5pdENhdG11bGxSb206IGZ1bmN0aW9uICggeDAsIHgxLCB4MiwgeDMsIHRlbnNpb24gKSB7CgogICAgCQkJaW5pdCggeDEsIHgyLCB0ZW5zaW9uICogKCB4MiAtIHgwICksIHRlbnNpb24gKiAoIHgzIC0geDEgKSApOwoKICAgIAkJfSwKCiAgICAJCWluaXROb251bmlmb3JtQ2F0bXVsbFJvbTogZnVuY3Rpb24gKCB4MCwgeDEsIHgyLCB4MywgZHQwLCBkdDEsIGR0MiApIHsKCiAgICAJCQkvLyBjb21wdXRlIHRhbmdlbnRzIHdoZW4gcGFyYW1ldGVyaXplZCBpbiBbdDEsdDJdCiAgICAJCQl2YXIgdDEgPSAoIHgxIC0geDAgKSAvIGR0MCAtICggeDIgLSB4MCApIC8gKCBkdDAgKyBkdDEgKSArICggeDIgLSB4MSApIC8gZHQxOwogICAgCQkJdmFyIHQyID0gKCB4MiAtIHgxICkgLyBkdDEgLSAoIHgzIC0geDEgKSAvICggZHQxICsgZHQyICkgKyAoIHgzIC0geDIgKSAvIGR0MjsKCiAgICAJCQkvLyByZXNjYWxlIHRhbmdlbnRzIGZvciBwYXJhbWV0cml6YXRpb24gaW4gWzAsMV0KICAgIAkJCXQxICo9IGR0MTsKICAgIAkJCXQyICo9IGR0MTsKCiAgICAJCQlpbml0KCB4MSwgeDIsIHQxLCB0MiApOwoKICAgIAkJfSwKCiAgICAJCWNhbGM6IGZ1bmN0aW9uICggdCApIHsKCiAgICAJCQl2YXIgdDIgPSB0ICogdDsKICAgIAkJCXZhciB0MyA9IHQyICogdDsKICAgIAkJCXJldHVybiBjMCArIGMxICogdCArIGMyICogdDIgKyBjMyAqIHQzOwoKICAgIAkJfQoKICAgIAl9OwoKICAgIH0KCiAgICAvLwoKICAgIHZhciB0bXAgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIHB4ID0gbmV3IEN1YmljUG9seSgpLCBweSA9IG5ldyBDdWJpY1BvbHkoKSwgcHogPSBuZXcgQ3ViaWNQb2x5KCk7CgogICAgZnVuY3Rpb24gQ2F0bXVsbFJvbUN1cnZlMyggcG9pbnRzLCBjbG9zZWQsIGN1cnZlVHlwZSwgdGVuc2lvbiApIHsKCiAgICAJQ3VydmUuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnQ2F0bXVsbFJvbUN1cnZlMyc7CgogICAgCXRoaXMucG9pbnRzID0gcG9pbnRzIHx8IFtdOwogICAgCXRoaXMuY2xvc2VkID0gY2xvc2VkIHx8IGZhbHNlOwogICAgCXRoaXMuY3VydmVUeXBlID0gY3VydmVUeXBlIHx8ICdjZW50cmlwZXRhbCc7CiAgICAJdGhpcy50ZW5zaW9uID0gdGVuc2lvbiB8fCAwLjU7CgogICAgfQoKICAgIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CiAgICBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhdG11bGxSb21DdXJ2ZTM7CgogICAgQ2F0bXVsbFJvbUN1cnZlMy5wcm90b3R5cGUuaXNDYXRtdWxsUm9tQ3VydmUzID0gdHJ1ZTsKCiAgICBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7CgogICAgCXZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciBwb2ludHMgPSB0aGlzLnBvaW50czsKICAgIAl2YXIgbCA9IHBvaW50cy5sZW5ndGg7CgogICAgCXZhciBwID0gKCBsIC0gKCB0aGlzLmNsb3NlZCA/IDAgOiAxICkgKSAqIHQ7CiAgICAJdmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApOwogICAgCXZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7CgogICAgCWlmICggdGhpcy5jbG9zZWQgKSB7CgogICAgCQlpbnRQb2ludCArPSBpbnRQb2ludCA+IDAgPyAwIDogKCBNYXRoLmZsb29yKCBNYXRoLmFicyggaW50UG9pbnQgKSAvIGwgKSArIDEgKSAqIGw7CgogICAgCX0gZWxzZSBpZiAoIHdlaWdodCA9PT0gMCAmJiBpbnRQb2ludCA9PT0gbCAtIDEgKSB7CgogICAgCQlpbnRQb2ludCA9IGwgLSAyOwogICAgCQl3ZWlnaHQgPSAxOwoKICAgIAl9CgogICAgCXZhciBwMCwgcDEsIHAyLCBwMzsgLy8gNCBwb2ludHMKCiAgICAJaWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCA+IDAgKSB7CgogICAgCQlwMCA9IHBvaW50c1sgKCBpbnRQb2ludCAtIDEgKSAlIGwgXTsKCiAgICAJfSBlbHNlIHsKCiAgICAJCS8vIGV4dHJhcG9sYXRlIGZpcnN0IHBvaW50CiAgICAJCXRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIDAgXSwgcG9pbnRzWyAxIF0gKS5hZGQoIHBvaW50c1sgMCBdICk7CiAgICAJCXAwID0gdG1wOwoKICAgIAl9CgogICAgCXAxID0gcG9pbnRzWyBpbnRQb2ludCAlIGwgXTsKICAgIAlwMiA9IHBvaW50c1sgKCBpbnRQb2ludCArIDEgKSAlIGwgXTsKCiAgICAJaWYgKCB0aGlzLmNsb3NlZCB8fCBpbnRQb2ludCArIDIgPCBsICkgewoKICAgIAkJcDMgPSBwb2ludHNbICggaW50UG9pbnQgKyAyICkgJSBsIF07CgogICAgCX0gZWxzZSB7CgogICAgCQkvLyBleHRyYXBvbGF0ZSBsYXN0IHBvaW50CiAgICAJCXRtcC5zdWJWZWN0b3JzKCBwb2ludHNbIGwgLSAxIF0sIHBvaW50c1sgbCAtIDIgXSApLmFkZCggcG9pbnRzWyBsIC0gMSBdICk7CiAgICAJCXAzID0gdG1wOwoKICAgIAl9CgogICAgCWlmICggdGhpcy5jdXJ2ZVR5cGUgPT09ICdjZW50cmlwZXRhbCcgfHwgdGhpcy5jdXJ2ZVR5cGUgPT09ICdjaG9yZGFsJyApIHsKCiAgICAJCS8vIGluaXQgQ2VudHJpcGV0YWwgLyBDaG9yZGFsIENhdG11bGwtUm9tCiAgICAJCXZhciBwb3cgPSB0aGlzLmN1cnZlVHlwZSA9PT0gJ2Nob3JkYWwnID8gMC41IDogMC4yNTsKICAgIAkJdmFyIGR0MCA9IE1hdGgucG93KCBwMC5kaXN0YW5jZVRvU3F1YXJlZCggcDEgKSwgcG93ICk7CiAgICAJCXZhciBkdDEgPSBNYXRoLnBvdyggcDEuZGlzdGFuY2VUb1NxdWFyZWQoIHAyICksIHBvdyApOwogICAgCQl2YXIgZHQyID0gTWF0aC5wb3coIHAyLmRpc3RhbmNlVG9TcXVhcmVkKCBwMyApLCBwb3cgKTsKCiAgICAJCS8vIHNhZmV0eSBjaGVjayBmb3IgcmVwZWF0ZWQgcG9pbnRzCiAgICAJCWlmICggZHQxIDwgMWUtNCApIGR0MSA9IDEuMDsKICAgIAkJaWYgKCBkdDAgPCAxZS00ICkgZHQwID0gZHQxOwogICAgCQlpZiAoIGR0MiA8IDFlLTQgKSBkdDIgPSBkdDE7CgogICAgCQlweC5pbml0Tm9udW5pZm9ybUNhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIGR0MCwgZHQxLCBkdDIgKTsKICAgIAkJcHkuaW5pdE5vbnVuaWZvcm1DYXRtdWxsUm9tKCBwMC55LCBwMS55LCBwMi55LCBwMy55LCBkdDAsIGR0MSwgZHQyICk7CiAgICAJCXB6LmluaXROb251bmlmb3JtQ2F0bXVsbFJvbSggcDAueiwgcDEueiwgcDIueiwgcDMueiwgZHQwLCBkdDEsIGR0MiApOwoKICAgIAl9IGVsc2UgaWYgKCB0aGlzLmN1cnZlVHlwZSA9PT0gJ2NhdG11bGxyb20nICkgewoKICAgIAkJcHguaW5pdENhdG11bGxSb20oIHAwLngsIHAxLngsIHAyLngsIHAzLngsIHRoaXMudGVuc2lvbiApOwogICAgCQlweS5pbml0Q2F0bXVsbFJvbSggcDAueSwgcDEueSwgcDIueSwgcDMueSwgdGhpcy50ZW5zaW9uICk7CiAgICAJCXB6LmluaXRDYXRtdWxsUm9tKCBwMC56LCBwMS56LCBwMi56LCBwMy56LCB0aGlzLnRlbnNpb24gKTsKCiAgICAJfQoKICAgIAlwb2ludC5zZXQoCiAgICAJCXB4LmNhbGMoIHdlaWdodCApLAogICAgCQlweS5jYWxjKCB3ZWlnaHQgKSwKICAgIAkJcHouY2FsYyggd2VpZ2h0ICkKICAgIAkpOwoKICAgIAlyZXR1cm4gcG9pbnQ7CgogICAgfTsKCiAgICBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLnBvaW50cyA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQl2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07CgogICAgCQl0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7CgogICAgCX0KCiAgICAJdGhpcy5jbG9zZWQgPSBzb3VyY2UuY2xvc2VkOwogICAgCXRoaXMuY3VydmVUeXBlID0gc291cmNlLmN1cnZlVHlwZTsKICAgIAl0aGlzLnRlbnNpb24gPSBzb3VyY2UudGVuc2lvbjsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgogICAgCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgogICAgCWRhdGEucG9pbnRzID0gW107CgogICAgCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQl2YXIgcG9pbnQgPSB0aGlzLnBvaW50c1sgaSBdOwogICAgCQlkYXRhLnBvaW50cy5wdXNoKCBwb2ludC50b0FycmF5KCkgKTsKCiAgICAJfQoKICAgIAlkYXRhLmNsb3NlZCA9IHRoaXMuY2xvc2VkOwogICAgCWRhdGEuY3VydmVUeXBlID0gdGhpcy5jdXJ2ZVR5cGU7CiAgICAJZGF0YS50ZW5zaW9uID0gdGhpcy50ZW5zaW9uOwoKICAgIAlyZXR1cm4gZGF0YTsKCiAgICB9OwoKICAgIENhdG11bGxSb21DdXJ2ZTMucHJvdG90eXBlLmZyb21KU09OID0gZnVuY3Rpb24gKCBqc29uICkgewoKICAgIAlDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApOwoKICAgIAl0aGlzLnBvaW50cyA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJdmFyIHBvaW50ID0ganNvbi5wb2ludHNbIGkgXTsKICAgIAkJdGhpcy5wb2ludHMucHVzaCggbmV3IFZlY3RvcjMoKS5mcm9tQXJyYXkoIHBvaW50ICkgKTsKCiAgICAJfQoKICAgIAl0aGlzLmNsb3NlZCA9IGpzb24uY2xvc2VkOwogICAgCXRoaXMuY3VydmVUeXBlID0ganNvbi5jdXJ2ZVR5cGU7CiAgICAJdGhpcy50ZW5zaW9uID0ganNvbi50ZW5zaW9uOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwogICAgICoKICAgICAqIEJlemllciBDdXJ2ZXMgZm9ybXVsYXMgb2J0YWluZWQgZnJvbQogICAgICogaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9Cw6l6aWVyX2N1cnZlCiAgICAgKi8KCiAgICBmdW5jdGlvbiBDYXRtdWxsUm9tJDIoIHQsIHAwLCBwMSwgcDIsIHAzICkgewoKICAgIAl2YXIgdjAgPSAoIHAyIC0gcDAgKSAqIDAuNTsKICAgIAl2YXIgdjEgPSAoIHAzIC0gcDEgKSAqIDAuNTsKICAgIAl2YXIgdDIgPSB0ICogdDsKICAgIAl2YXIgdDMgPSB0ICogdDI7CiAgICAJcmV0dXJuICggMiAqIHAxIC0gMiAqIHAyICsgdjAgKyB2MSApICogdDMgKyAoIC0gMyAqIHAxICsgMyAqIHAyIC0gMiAqIHYwIC0gdjEgKSAqIHQyICsgdjAgKiB0ICsgcDE7CgogICAgfQoKICAgIC8vCgogICAgZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDAoIHQsIHAgKSB7CgogICAgCXZhciBrID0gMSAtIHQ7CiAgICAJcmV0dXJuIGsgKiBrICogcDsKCiAgICB9CgogICAgZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyUDEoIHQsIHAgKSB7CgogICAgCXJldHVybiAyICogKCAxIC0gdCApICogdCAqIHA7CgogICAgfQoKICAgIGZ1bmN0aW9uIFF1YWRyYXRpY0JlemllclAyKCB0LCBwICkgewoKICAgIAlyZXR1cm4gdCAqIHQgKiBwOwoKICAgIH0KCiAgICBmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXIoIHQsIHAwLCBwMSwgcDIgKSB7CgogICAgCXJldHVybiBRdWFkcmF0aWNCZXppZXJQMCggdCwgcDAgKSArIFF1YWRyYXRpY0JlemllclAxKCB0LCBwMSApICsKICAgIAkJUXVhZHJhdGljQmV6aWVyUDIoIHQsIHAyICk7CgogICAgfQoKICAgIC8vCgogICAgZnVuY3Rpb24gQ3ViaWNCZXppZXJQMCggdCwgcCApIHsKCiAgICAJdmFyIGsgPSAxIC0gdDsKICAgIAlyZXR1cm4gayAqIGsgKiBrICogcDsKCiAgICB9CgogICAgZnVuY3Rpb24gQ3ViaWNCZXppZXJQMSggdCwgcCApIHsKCiAgICAJdmFyIGsgPSAxIC0gdDsKICAgIAlyZXR1cm4gMyAqIGsgKiBrICogdCAqIHA7CgogICAgfQoKICAgIGZ1bmN0aW9uIEN1YmljQmV6aWVyUDIoIHQsIHAgKSB7CgogICAgCXJldHVybiAzICogKCAxIC0gdCApICogdCAqIHQgKiBwOwoKICAgIH0KCiAgICBmdW5jdGlvbiBDdWJpY0JlemllclAzKCB0LCBwICkgewoKICAgIAlyZXR1cm4gdCAqIHQgKiB0ICogcDsKCiAgICB9CgogICAgZnVuY3Rpb24gQ3ViaWNCZXppZXIoIHQsIHAwLCBwMSwgcDIsIHAzICkgewoKICAgIAlyZXR1cm4gQ3ViaWNCZXppZXJQMCggdCwgcDAgKSArIEN1YmljQmV6aWVyUDEoIHQsIHAxICkgKyBDdWJpY0JlemllclAyKCB0LCBwMiApICsKICAgIAkJQ3ViaWNCZXppZXJQMyggdCwgcDMgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gQ3ViaWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiwgdjMgKSB7CgogICAgCUN1cnZlLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUnOwoKICAgIAl0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTsKICAgIAl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTsKICAgIAl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTsKICAgIAl0aGlzLnYzID0gdjMgfHwgbmV3IFZlY3RvcjIoKTsKCiAgICB9CgogICAgQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKICAgIEN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTsKCiAgICBDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5pc0N1YmljQmV6aWVyQ3VydmUgPSB0cnVlOwoKICAgIEN1YmljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCiAgICAJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjIsIHYzID0gdGhpcy52MzsKCiAgICAJcG9pbnQuc2V0KAogICAgCQlDdWJpY0JlemllciggdCwgdjAueCwgdjEueCwgdjIueCwgdjMueCApLAogICAgCQlDdWJpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSwgdjMueSApCiAgICAJKTsKCiAgICAJcmV0dXJuIHBvaW50OwoKICAgIH07CgogICAgQ3ViaWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTsKICAgIAl0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApOwogICAgCXRoaXMudjIuY29weSggc291cmNlLnYyICk7CiAgICAJdGhpcy52My5jb3B5KCBzb3VyY2UudjMgKTsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgogICAgCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgogICAgCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgIAlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CiAgICAJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwogICAgCWRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTsKCiAgICAJcmV0dXJuIGRhdGE7CgogICAgfTsKCiAgICBDdWJpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHsKCiAgICAJQ3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCiAgICAJdGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTsKICAgIAl0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApOwogICAgCXRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7CiAgICAJdGhpcy52My5mcm9tQXJyYXkoIGpzb24udjMgKTsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBmdW5jdGlvbiBDdWJpY0JlemllckN1cnZlMyggdjAsIHYxLCB2MiwgdjMgKSB7CgogICAgCUN1cnZlLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0N1YmljQmV6aWVyQ3VydmUzJzsKCiAgICAJdGhpcy52MCA9IHYwIHx8IG5ldyBWZWN0b3IzKCk7CiAgICAJdGhpcy52MSA9IHYxIHx8IG5ldyBWZWN0b3IzKCk7CiAgICAJdGhpcy52MiA9IHYyIHx8IG5ldyBWZWN0b3IzKCk7CiAgICAJdGhpcy52MyA9IHYzIHx8IG5ldyBWZWN0b3IzKCk7CgogICAgfQoKICAgIEN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOwogICAgQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQ3ViaWNCZXppZXJDdXJ2ZTM7CgogICAgQ3ViaWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzQ3ViaWNCZXppZXJDdXJ2ZTMgPSB0cnVlOwoKICAgIEN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5nZXRQb2ludCA9IGZ1bmN0aW9uICggdCwgb3B0aW9uYWxUYXJnZXQgKSB7CgogICAgCXZhciBwb2ludCA9IG9wdGlvbmFsVGFyZ2V0IHx8IG5ldyBWZWN0b3IzKCk7CgogICAgCXZhciB2MCA9IHRoaXMudjAsIHYxID0gdGhpcy52MSwgdjIgPSB0aGlzLnYyLCB2MyA9IHRoaXMudjM7CgogICAgCXBvaW50LnNldCgKICAgIAkJQ3ViaWNCZXppZXIoIHQsIHYwLngsIHYxLngsIHYyLngsIHYzLnggKSwKICAgIAkJQ3ViaWNCZXppZXIoIHQsIHYwLnksIHYxLnksIHYyLnksIHYzLnkgKSwKICAgIAkJQ3ViaWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnosIHYzLnogKQogICAgCSk7CgogICAgCXJldHVybiBwb2ludDsKCiAgICB9OwoKICAgIEN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLnYwLmNvcHkoIHNvdXJjZS52MCApOwogICAgCXRoaXMudjEuY29weSggc291cmNlLnYxICk7CiAgICAJdGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTsKICAgIAl0aGlzLnYzLmNvcHkoIHNvdXJjZS52MyApOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIEN1YmljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgogICAgCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgogICAgCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgIAlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CiAgICAJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwogICAgCWRhdGEudjMgPSB0aGlzLnYzLnRvQXJyYXkoKTsKCiAgICAJcmV0dXJuIGRhdGE7CgogICAgfTsKCiAgICBDdWJpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgogICAgCXRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7CiAgICAJdGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTsKICAgIAl0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApOwogICAgCXRoaXMudjMuZnJvbUFycmF5KCBqc29uLnYzICk7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgZnVuY3Rpb24gTGluZUN1cnZlKCB2MSwgdjIgKSB7CgogICAgCUN1cnZlLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0xpbmVDdXJ2ZSc7CgogICAgCXRoaXMudjEgPSB2MSB8fCBuZXcgVmVjdG9yMigpOwogICAgCXRoaXMudjIgPSB2MiB8fCBuZXcgVmVjdG9yMigpOwoKICAgIH0KCiAgICBMaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CiAgICBMaW5lQ3VydmUucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlOwoKICAgIExpbmVDdXJ2ZS5wcm90b3R5cGUuaXNMaW5lQ3VydmUgPSB0cnVlOwoKICAgIExpbmVDdXJ2ZS5wcm90b3R5cGUuZ2V0UG9pbnQgPSBmdW5jdGlvbiAoIHQsIG9wdGlvbmFsVGFyZ2V0ICkgewoKICAgIAl2YXIgcG9pbnQgPSBvcHRpb25hbFRhcmdldCB8fCBuZXcgVmVjdG9yMigpOwoKICAgIAlpZiAoIHQgPT09IDEgKSB7CgogICAgCQlwb2ludC5jb3B5KCB0aGlzLnYyICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlwb2ludC5jb3B5KCB0aGlzLnYyICkuc3ViKCB0aGlzLnYxICk7CiAgICAJCXBvaW50Lm11bHRpcGx5U2NhbGFyKCB0ICkuYWRkKCB0aGlzLnYxICk7CgogICAgCX0KCiAgICAJcmV0dXJuIHBvaW50OwoKICAgIH07CgogICAgLy8gTGluZSBjdXJ2ZSBpcyBsaW5lYXIsIHNvIHdlIGNhbiBvdmVyd3JpdGUgZGVmYXVsdCBnZXRQb2ludEF0CgogICAgTGluZUN1cnZlLnByb3RvdHlwZS5nZXRQb2ludEF0ID0gZnVuY3Rpb24gKCB1LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJcmV0dXJuIHRoaXMuZ2V0UG9pbnQoIHUsIG9wdGlvbmFsVGFyZ2V0ICk7CgogICAgfTsKCiAgICBMaW5lQ3VydmUucHJvdG90eXBlLmdldFRhbmdlbnQgPSBmdW5jdGlvbiAoIC8qIHQgKi8gKSB7CgogICAgCXZhciB0YW5nZW50ID0gdGhpcy52Mi5jbG9uZSgpLnN1YiggdGhpcy52MSApOwoKICAgIAlyZXR1cm4gdGFuZ2VudC5ub3JtYWxpemUoKTsKCiAgICB9OwoKICAgIExpbmVDdXJ2ZS5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTsKICAgIAl0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIExpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKICAgIAl2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKICAgIAlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CiAgICAJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoKICAgIAlyZXR1cm4gZGF0YTsKCiAgICB9OwoKICAgIExpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgogICAgCXRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7CiAgICAJdGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBmdW5jdGlvbiBMaW5lQ3VydmUzKCB2MSwgdjIgKSB7CgogICAgCUN1cnZlLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0xpbmVDdXJ2ZTMnOwoKICAgIAl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTsKICAgIAl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTsKCiAgICB9CgogICAgTGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDdXJ2ZS5wcm90b3R5cGUgKTsKICAgIExpbmVDdXJ2ZTMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGluZUN1cnZlMzsKCiAgICBMaW5lQ3VydmUzLnByb3RvdHlwZS5pc0xpbmVDdXJ2ZTMgPSB0cnVlOwoKICAgIExpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCiAgICAJaWYgKCB0ID09PSAxICkgewoKICAgIAkJcG9pbnQuY29weSggdGhpcy52MiApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJcG9pbnQuY29weSggdGhpcy52MiApLnN1YiggdGhpcy52MSApOwogICAgCQlwb2ludC5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy52MSApOwoKICAgIAl9CgogICAgCXJldHVybiBwb2ludDsKCiAgICB9OwoKICAgIC8vIExpbmUgY3VydmUgaXMgbGluZWFyLCBzbyB3ZSBjYW4gb3ZlcndyaXRlIGRlZmF1bHQgZ2V0UG9pbnRBdAoKICAgIExpbmVDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50QXQgPSBmdW5jdGlvbiAoIHUsIG9wdGlvbmFsVGFyZ2V0ICkgewoKICAgIAlyZXR1cm4gdGhpcy5nZXRQb2ludCggdSwgb3B0aW9uYWxUYXJnZXQgKTsKCiAgICB9OwoKICAgIExpbmVDdXJ2ZTMucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMudjEuY29weSggc291cmNlLnYxICk7CiAgICAJdGhpcy52Mi5jb3B5KCBzb3VyY2UudjIgKTsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBMaW5lQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgogICAgCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgogICAgCWRhdGEudjEgPSB0aGlzLnYxLnRvQXJyYXkoKTsKICAgIAlkYXRhLnYyID0gdGhpcy52Mi50b0FycmF5KCk7CgogICAgCXJldHVybiBkYXRhOwoKICAgIH07CgogICAgTGluZUN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgogICAgCXRoaXMudjEuZnJvbUFycmF5KCBqc29uLnYxICk7CiAgICAJdGhpcy52Mi5mcm9tQXJyYXkoIGpzb24udjIgKTsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBmdW5jdGlvbiBRdWFkcmF0aWNCZXppZXJDdXJ2ZSggdjAsIHYxLCB2MiApIHsKCiAgICAJQ3VydmUuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUXVhZHJhdGljQmV6aWVyQ3VydmUnOwoKICAgIAl0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjIoKTsKICAgIAl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjIoKTsKICAgIAl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjIoKTsKCiAgICB9CgogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CiAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBRdWFkcmF0aWNCZXppZXJDdXJ2ZTsKCiAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZS5wcm90b3R5cGUuaXNRdWFkcmF0aWNCZXppZXJDdXJ2ZSA9IHRydWU7CgogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCiAgICAJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7CgogICAgCXBvaW50LnNldCgKICAgIAkJUXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksCiAgICAJCVF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApCiAgICAJKTsKCiAgICAJcmV0dXJuIHBvaW50OwoKICAgIH07CgogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUucHJvdG90eXBlLmNvcHkgPSBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJQ3VydmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMudjAuY29weSggc291cmNlLnYwICk7CiAgICAJdGhpcy52MS5jb3B5KCBzb3VyY2UudjEgKTsKICAgIAl0aGlzLnYyLmNvcHkoIHNvdXJjZS52MiApOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIFF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgogICAgCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgogICAgCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgIAlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CiAgICAJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoKICAgIAlyZXR1cm4gZGF0YTsKCiAgICB9OwoKICAgIFF1YWRyYXRpY0JlemllckN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTiA9IGZ1bmN0aW9uICgganNvbiApIHsKCiAgICAJQ3VydmUucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCiAgICAJdGhpcy52MC5mcm9tQXJyYXkoIGpzb24udjAgKTsKICAgIAl0aGlzLnYxLmZyb21BcnJheSgganNvbi52MSApOwogICAgCXRoaXMudjIuZnJvbUFycmF5KCBqc29uLnYyICk7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgZnVuY3Rpb24gUXVhZHJhdGljQmV6aWVyQ3VydmUzKCB2MCwgdjEsIHYyICkgewoKICAgIAlDdXJ2ZS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdRdWFkcmF0aWNCZXppZXJDdXJ2ZTMnOwoKICAgIAl0aGlzLnYwID0gdjAgfHwgbmV3IFZlY3RvcjMoKTsKICAgIAl0aGlzLnYxID0gdjEgfHwgbmV3IFZlY3RvcjMoKTsKICAgIAl0aGlzLnYyID0gdjIgfHwgbmV3IFZlY3RvcjMoKTsKCiAgICB9CgogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOwogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFF1YWRyYXRpY0JlemllckN1cnZlMzsKCiAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmlzUXVhZHJhdGljQmV6aWVyQ3VydmUzID0gdHJ1ZTsKCiAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjMoKTsKCiAgICAJdmFyIHYwID0gdGhpcy52MCwgdjEgPSB0aGlzLnYxLCB2MiA9IHRoaXMudjI7CgogICAgCXBvaW50LnNldCgKICAgIAkJUXVhZHJhdGljQmV6aWVyKCB0LCB2MC54LCB2MS54LCB2Mi54ICksCiAgICAJCVF1YWRyYXRpY0JlemllciggdCwgdjAueSwgdjEueSwgdjIueSApLAogICAgCQlRdWFkcmF0aWNCZXppZXIoIHQsIHYwLnosIHYxLnosIHYyLnogKQogICAgCSk7CgogICAgCXJldHVybiBwb2ludDsKCiAgICB9OwoKICAgIFF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlDdXJ2ZS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJdGhpcy52MC5jb3B5KCBzb3VyY2UudjAgKTsKICAgIAl0aGlzLnYxLmNvcHkoIHNvdXJjZS52MSApOwogICAgCXRoaXMudjIuY29weSggc291cmNlLnYyICk7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgUXVhZHJhdGljQmV6aWVyQ3VydmUzLnByb3RvdHlwZS50b0pTT04gPSBmdW5jdGlvbiAoKSB7CgogICAgCXZhciBkYXRhID0gQ3VydmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzICk7CgogICAgCWRhdGEudjAgPSB0aGlzLnYwLnRvQXJyYXkoKTsKICAgIAlkYXRhLnYxID0gdGhpcy52MS50b0FycmF5KCk7CiAgICAJZGF0YS52MiA9IHRoaXMudjIudG9BcnJheSgpOwoKICAgIAlyZXR1cm4gZGF0YTsKCiAgICB9OwoKICAgIFF1YWRyYXRpY0JlemllckN1cnZlMy5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgogICAgCXRoaXMudjAuZnJvbUFycmF5KCBqc29uLnYwICk7CiAgICAJdGhpcy52MS5mcm9tQXJyYXkoIGpzb24udjEgKTsKICAgIAl0aGlzLnYyLmZyb21BcnJheSgganNvbi52MiApOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIGZ1bmN0aW9uIFNwbGluZUN1cnZlKCBwb2ludHMgLyogYXJyYXkgb2YgVmVjdG9yMiAqLyApIHsKCiAgICAJQ3VydmUuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnU3BsaW5lQ3VydmUnOwoKICAgIAl0aGlzLnBvaW50cyA9IHBvaW50cyB8fCBbXTsKCiAgICB9CgogICAgU3BsaW5lQ3VydmUucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggQ3VydmUucHJvdG90eXBlICk7CiAgICBTcGxpbmVDdXJ2ZS5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTcGxpbmVDdXJ2ZTsKCiAgICBTcGxpbmVDdXJ2ZS5wcm90b3R5cGUuaXNTcGxpbmVDdXJ2ZSA9IHRydWU7CgogICAgU3BsaW5lQ3VydmUucHJvdG90eXBlLmdldFBvaW50ID0gZnVuY3Rpb24gKCB0LCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJdmFyIHBvaW50ID0gb3B0aW9uYWxUYXJnZXQgfHwgbmV3IFZlY3RvcjIoKTsKCiAgICAJdmFyIHBvaW50cyA9IHRoaXMucG9pbnRzOwogICAgCXZhciBwID0gKCBwb2ludHMubGVuZ3RoIC0gMSApICogdDsKCiAgICAJdmFyIGludFBvaW50ID0gTWF0aC5mbG9vciggcCApOwogICAgCXZhciB3ZWlnaHQgPSBwIC0gaW50UG9pbnQ7CgogICAgCXZhciBwMCA9IHBvaW50c1sgaW50UG9pbnQgPT09IDAgPyBpbnRQb2ludCA6IGludFBvaW50IC0gMSBdOwogICAgCXZhciBwMSA9IHBvaW50c1sgaW50UG9pbnQgXTsKICAgIAl2YXIgcDIgPSBwb2ludHNbIGludFBvaW50ID4gcG9pbnRzLmxlbmd0aCAtIDIgPyBwb2ludHMubGVuZ3RoIC0gMSA6IGludFBvaW50ICsgMSBdOwogICAgCXZhciBwMyA9IHBvaW50c1sgaW50UG9pbnQgPiBwb2ludHMubGVuZ3RoIC0gMyA/IHBvaW50cy5sZW5ndGggLSAxIDogaW50UG9pbnQgKyAyIF07CgogICAgCXBvaW50LnNldCgKICAgIAkJQ2F0bXVsbFJvbSQyKCB3ZWlnaHQsIHAwLngsIHAxLngsIHAyLngsIHAzLnggKSwKICAgIAkJQ2F0bXVsbFJvbSQyKCB3ZWlnaHQsIHAwLnksIHAxLnksIHAyLnksIHAzLnkgKQogICAgCSk7CgogICAgCXJldHVybiBwb2ludDsKCiAgICB9OwoKICAgIFNwbGluZUN1cnZlLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAl0aGlzLnBvaW50cyA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQl2YXIgcG9pbnQgPSBzb3VyY2UucG9pbnRzWyBpIF07CgogICAgCQl0aGlzLnBvaW50cy5wdXNoKCBwb2ludC5jbG9uZSgpICk7CgogICAgCX0KCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBTcGxpbmVDdXJ2ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewoKICAgIAl2YXIgZGF0YSA9IEN1cnZlLnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKICAgIAlkYXRhLnBvaW50cyA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLnBvaW50cy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJdmFyIHBvaW50ID0gdGhpcy5wb2ludHNbIGkgXTsKICAgIAkJZGF0YS5wb2ludHMucHVzaCggcG9pbnQudG9BcnJheSgpICk7CgogICAgCX0KCiAgICAJcmV0dXJuIGRhdGE7CgogICAgfTsKCiAgICBTcGxpbmVDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04gPSBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCUN1cnZlLnByb3RvdHlwZS5mcm9tSlNPTi5jYWxsKCB0aGlzLCBqc29uICk7CgogICAgCXRoaXMucG9pbnRzID0gW107CgogICAgCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ucG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQl2YXIgcG9pbnQgPSBqc29uLnBvaW50c1sgaSBdOwogICAgCQl0aGlzLnBvaW50cy5wdXNoKCBuZXcgVmVjdG9yMigpLmZyb21BcnJheSggcG9pbnQgKSApOwoKICAgIAl9CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgoKCiAgICB2YXIgQ3VydmVzID0gLyojX19QVVJFX18qL09iamVjdC5mcmVlemUoewogICAgCUFyY0N1cnZlOiBBcmNDdXJ2ZSwKICAgIAlDYXRtdWxsUm9tQ3VydmUzOiBDYXRtdWxsUm9tQ3VydmUzLAogICAgCUN1YmljQmV6aWVyQ3VydmU6IEN1YmljQmV6aWVyQ3VydmUsCiAgICAJQ3ViaWNCZXppZXJDdXJ2ZTM6IEN1YmljQmV6aWVyQ3VydmUzLAogICAgCUVsbGlwc2VDdXJ2ZTogRWxsaXBzZUN1cnZlLAogICAgCUxpbmVDdXJ2ZTogTGluZUN1cnZlLAogICAgCUxpbmVDdXJ2ZTM6IExpbmVDdXJ2ZTMsCiAgICAJUXVhZHJhdGljQmV6aWVyQ3VydmU6IFF1YWRyYXRpY0JlemllckN1cnZlLAogICAgCVF1YWRyYXRpY0JlemllckN1cnZlMzogUXVhZHJhdGljQmV6aWVyQ3VydmUzLAogICAgCVNwbGluZUN1cnZlOiBTcGxpbmVDdXJ2ZQogICAgfSk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHp6ODUgLyBodHRwOi8vd3d3LmxhYjRnYW1lcy5uZXQveno4NS9ibG9nCiAgICAgKgogICAgICoqLwoKICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgICoJQ3VydmVkIFBhdGggLSBhIGN1cnZlIHBhdGggaXMgc2ltcGx5IGEgYXJyYXkgb2YgY29ubmVjdGVkCiAgICAgKiAgY3VydmVzLCBidXQgcmV0YWlucyB0aGUgYXBpIG9mIGEgY3VydmUKICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiAgICBmdW5jdGlvbiBDdXJ2ZVBhdGgoKSB7CgogICAgCUN1cnZlLmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0N1cnZlUGF0aCc7CgogICAgCXRoaXMuY3VydmVzID0gW107CiAgICAJdGhpcy5hdXRvQ2xvc2UgPSBmYWxzZTsgLy8gQXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHBhdGgKCiAgICB9CgogICAgQ3VydmVQYXRoLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBDdXJ2ZVBhdGgsCgogICAgCWFkZDogZnVuY3Rpb24gKCBjdXJ2ZSApIHsKCiAgICAJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7CgogICAgCX0sCgogICAgCWNsb3NlUGF0aDogZnVuY3Rpb24gKCkgewoKICAgIAkJLy8gQWRkIGEgbGluZSBjdXJ2ZSBpZiBzdGFydCBhbmQgZW5kIG9mIGxpbmVzIGFyZSBub3QgY29ubmVjdGVkCiAgICAJCXZhciBzdGFydFBvaW50ID0gdGhpcy5jdXJ2ZXNbIDAgXS5nZXRQb2ludCggMCApOwogICAgCQl2YXIgZW5kUG9pbnQgPSB0aGlzLmN1cnZlc1sgdGhpcy5jdXJ2ZXMubGVuZ3RoIC0gMSBdLmdldFBvaW50KCAxICk7CgogICAgCQlpZiAoICEgc3RhcnRQb2ludC5lcXVhbHMoIGVuZFBvaW50ICkgKSB7CgogICAgCQkJdGhpcy5jdXJ2ZXMucHVzaCggbmV3IExpbmVDdXJ2ZSggZW5kUG9pbnQsIHN0YXJ0UG9pbnQgKSApOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAkvLyBUbyBnZXQgYWNjdXJhdGUgcG9pbnQgd2l0aCByZWZlcmVuY2UgdG8KICAgIAkvLyBlbnRpcmUgcGF0aCBkaXN0YW5jZSBhdCB0aW1lIHQsCiAgICAJLy8gZm9sbG93aW5nIGhhcyB0byBiZSBkb25lOgoKICAgIAkvLyAxLiBMZW5ndGggb2YgZWFjaCBzdWIgcGF0aCBoYXZlIHRvIGJlIGtub3duCiAgICAJLy8gMi4gTG9jYXRlIGFuZCBpZGVudGlmeSB0eXBlIG9mIGN1cnZlCiAgICAJLy8gMy4gR2V0IHQgZm9yIHRoZSBjdXJ2ZQogICAgCS8vIDQuIFJldHVybiBjdXJ2ZS5nZXRQb2ludEF0KHQnKQoKICAgIAlnZXRQb2ludDogZnVuY3Rpb24gKCB0ICkgewoKICAgIAkJdmFyIGQgPSB0ICogdGhpcy5nZXRMZW5ndGgoKTsKICAgIAkJdmFyIGN1cnZlTGVuZ3RocyA9IHRoaXMuZ2V0Q3VydmVMZW5ndGhzKCk7CiAgICAJCXZhciBpID0gMDsKCiAgICAJCS8vIFRvIHRoaW5rIGFib3V0IGJvdW5kYXJpZXMgcG9pbnRzLgoKICAgIAkJd2hpbGUgKCBpIDwgY3VydmVMZW5ndGhzLmxlbmd0aCApIHsKCiAgICAJCQlpZiAoIGN1cnZlTGVuZ3Roc1sgaSBdID49IGQgKSB7CgogICAgCQkJCXZhciBkaWZmID0gY3VydmVMZW5ndGhzWyBpIF0gLSBkOwogICAgCQkJCXZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07CgogICAgCQkJCXZhciBzZWdtZW50TGVuZ3RoID0gY3VydmUuZ2V0TGVuZ3RoKCk7CiAgICAJCQkJdmFyIHUgPSBzZWdtZW50TGVuZ3RoID09PSAwID8gMCA6IDEgLSBkaWZmIC8gc2VnbWVudExlbmd0aDsKCiAgICAJCQkJcmV0dXJuIGN1cnZlLmdldFBvaW50QXQoIHUgKTsKCiAgICAJCQl9CgogICAgCQkJaSArKzsKCiAgICAJCX0KCiAgICAJCXJldHVybiBudWxsOwoKICAgIAkJLy8gbG9vcCB3aGVyZSBzdW0gIT0gMCwgc3VtID4gZCAsIHN1bSsxIDxkCgogICAgCX0sCgogICAgCS8vIFdlIGNhbm5vdCB1c2UgdGhlIGRlZmF1bHQgVEhSRUUuQ3VydmUgZ2V0UG9pbnQoKSB3aXRoIGdldExlbmd0aCgpIGJlY2F1c2UgaW4KICAgIAkvLyBUSFJFRS5DdXJ2ZSwgZ2V0TGVuZ3RoKCkgZGVwZW5kcyBvbiBnZXRQb2ludCgpIGJ1dCBpbiBUSFJFRS5DdXJ2ZVBhdGgKICAgIAkvLyBnZXRQb2ludCgpIGRlcGVuZHMgb24gZ2V0TGVuZ3RoCgogICAgCWdldExlbmd0aDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGxlbnMgPSB0aGlzLmdldEN1cnZlTGVuZ3RocygpOwogICAgCQlyZXR1cm4gbGVuc1sgbGVucy5sZW5ndGggLSAxIF07CgogICAgCX0sCgogICAgCS8vIGNhY2hlTGVuZ3RocyBtdXN0IGJlIHJlY2FsY3VsYXRlZC4KICAgIAl1cGRhdGVBcmNMZW5ndGhzOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLm5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIAkJdGhpcy5jYWNoZUxlbmd0aHMgPSBudWxsOwogICAgCQl0aGlzLmdldEN1cnZlTGVuZ3RocygpOwoKICAgIAl9LAoKICAgIAkvLyBDb21wdXRlIGxlbmd0aHMgYW5kIGNhY2hlIHRoZW0KICAgIAkvLyBXZSBjYW5ub3Qgb3ZlcndyaXRlIGdldExlbmd0aHMoKSBiZWNhdXNlIFV0b1QgbWFwcGluZyB1c2VzIGl0LgoKICAgIAlnZXRDdXJ2ZUxlbmd0aHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCS8vIFdlIHVzZSBjYWNoZSB2YWx1ZXMgaWYgY3VydmVzIGFuZCBjYWNoZSBhcnJheSBhcmUgc2FtZSBsZW5ndGgKCiAgICAJCWlmICggdGhpcy5jYWNoZUxlbmd0aHMgJiYgdGhpcy5jYWNoZUxlbmd0aHMubGVuZ3RoID09PSB0aGlzLmN1cnZlcy5sZW5ndGggKSB7CgogICAgCQkJcmV0dXJuIHRoaXMuY2FjaGVMZW5ndGhzOwoKICAgIAkJfQoKICAgIAkJLy8gR2V0IGxlbmd0aCBvZiBzdWItY3VydmUKICAgIAkJLy8gUHVzaCBzdW1zIGludG8gY2FjaGVkIGFycmF5CgogICAgCQl2YXIgbGVuZ3RocyA9IFtdLCBzdW1zID0gMDsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJc3VtcyArPSB0aGlzLmN1cnZlc1sgaSBdLmdldExlbmd0aCgpOwogICAgCQkJbGVuZ3Rocy5wdXNoKCBzdW1zICk7CgogICAgCQl9CgogICAgCQl0aGlzLmNhY2hlTGVuZ3RocyA9IGxlbmd0aHM7CgogICAgCQlyZXR1cm4gbGVuZ3RoczsKCiAgICAJfSwKCiAgICAJZ2V0U3BhY2VkUG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKCiAgICAJCWlmICggZGl2aXNpb25zID09PSB1bmRlZmluZWQgKSBkaXZpc2lvbnMgPSA0MDsKCiAgICAJCXZhciBwb2ludHMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8PSBkaXZpc2lvbnM7IGkgKysgKSB7CgogICAgCQkJcG9pbnRzLnB1c2goIHRoaXMuZ2V0UG9pbnQoIGkgLyBkaXZpc2lvbnMgKSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLmF1dG9DbG9zZSApIHsKCiAgICAJCQlwb2ludHMucHVzaCggcG9pbnRzWyAwIF0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBwb2ludHM7CgogICAgCX0sCgogICAgCWdldFBvaW50czogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgogICAgCQlkaXZpc2lvbnMgPSBkaXZpc2lvbnMgfHwgMTI7CgogICAgCQl2YXIgcG9pbnRzID0gW10sIGxhc3Q7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGN1cnZlcyA9IHRoaXMuY3VydmVzOyBpIDwgY3VydmVzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgY3VydmUgPSBjdXJ2ZXNbIGkgXTsKICAgIAkJCXZhciByZXNvbHV0aW9uID0gKCBjdXJ2ZSAmJiBjdXJ2ZS5pc0VsbGlwc2VDdXJ2ZSApID8gZGl2aXNpb25zICogMgogICAgCQkJCTogKCBjdXJ2ZSAmJiAoIGN1cnZlLmlzTGluZUN1cnZlIHx8IGN1cnZlLmlzTGluZUN1cnZlMyApICkgPyAxCiAgICAJCQkJCTogKCBjdXJ2ZSAmJiBjdXJ2ZS5pc1NwbGluZUN1cnZlICkgPyBkaXZpc2lvbnMgKiBjdXJ2ZS5wb2ludHMubGVuZ3RoCiAgICAJCQkJCQk6IGRpdmlzaW9uczsKCiAgICAJCQl2YXIgcHRzID0gY3VydmUuZ2V0UG9pbnRzKCByZXNvbHV0aW9uICk7CgogICAgCQkJZm9yICggdmFyIGogPSAwOyBqIDwgcHRzLmxlbmd0aDsgaiArKyApIHsKCiAgICAJCQkJdmFyIHBvaW50ID0gcHRzWyBqIF07CgogICAgCQkJCWlmICggbGFzdCAmJiBsYXN0LmVxdWFscyggcG9pbnQgKSApIGNvbnRpbnVlOyAvLyBlbnN1cmVzIG5vIGNvbnNlY3V0aXZlIHBvaW50cyBhcmUgZHVwbGljYXRlcwoKICAgIAkJCQlwb2ludHMucHVzaCggcG9pbnQgKTsKICAgIAkJCQlsYXN0ID0gcG9pbnQ7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLmF1dG9DbG9zZSAmJiBwb2ludHMubGVuZ3RoID4gMSAmJiAhIHBvaW50c1sgcG9pbnRzLmxlbmd0aCAtIDEgXS5lcXVhbHMoIHBvaW50c1sgMCBdICkgKSB7CgogICAgCQkJcG9pbnRzLnB1c2goIHBvaW50c1sgMCBdICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gcG9pbnRzOwoKICAgIAl9LAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJCUN1cnZlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAkJdGhpcy5jdXJ2ZXMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IHNvdXJjZS5jdXJ2ZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgY3VydmUgPSBzb3VyY2UuY3VydmVzWyBpIF07CgogICAgCQkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUuY2xvbmUoKSApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5hdXRvQ2xvc2UgPSBzb3VyY2UuYXV0b0Nsb3NlOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGRhdGEgPSBDdXJ2ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJCWRhdGEuYXV0b0Nsb3NlID0gdGhpcy5hdXRvQ2xvc2U7CiAgICAJCWRhdGEuY3VydmVzID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSB0aGlzLmN1cnZlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBjdXJ2ZSA9IHRoaXMuY3VydmVzWyBpIF07CiAgICAJCQlkYXRhLmN1cnZlcy5wdXNoKCBjdXJ2ZS50b0pTT04oKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0sCgogICAgCWZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCQlDdXJ2ZS5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApOwoKICAgIAkJdGhpcy5hdXRvQ2xvc2UgPSBqc29uLmF1dG9DbG9zZTsKICAgIAkJdGhpcy5jdXJ2ZXMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24uY3VydmVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGN1cnZlID0ganNvbi5jdXJ2ZXNbIGkgXTsKICAgIAkJCXRoaXMuY3VydmVzLnB1c2goIG5ldyBDdXJ2ZXNbIGN1cnZlLnR5cGUgXSgpLmZyb21KU09OKCBjdXJ2ZSApICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKICAgICAqIENyZWF0ZXMgZnJlZSBmb3JtIDJkIHBhdGggdXNpbmcgc2VyaWVzIG9mIHBvaW50cywgbGluZXMgb3IgY3VydmVzLgogICAgICoqLwoKICAgIGZ1bmN0aW9uIFBhdGgkNCggcG9pbnRzICkgewoKICAgIAlDdXJ2ZVBhdGguY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnUGF0aCc7CgogICAgCXRoaXMuY3VycmVudFBvaW50ID0gbmV3IFZlY3RvcjIoKTsKCiAgICAJaWYgKCBwb2ludHMgKSB7CgogICAgCQl0aGlzLnNldEZyb21Qb2ludHMoIHBvaW50cyApOwoKICAgIAl9CgogICAgfQoKICAgIFBhdGgkNC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDdXJ2ZVBhdGgucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFBhdGgkNCwKCiAgICAJc2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7CgogICAgCQl0aGlzLm1vdmVUbyggcG9pbnRzWyAwIF0ueCwgcG9pbnRzWyAwIF0ueSApOwoKICAgIAkJZm9yICggdmFyIGkgPSAxLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdGhpcy5saW5lVG8oIHBvaW50c1sgaSBdLngsIHBvaW50c1sgaSBdLnkgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJbW92ZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7CgogICAgCQl0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsgLy8gVE9ETyBjb25zaWRlciByZWZlcmVuY2luZyB2ZWN0b3JzIGluc3RlYWQgb2YgY29weWluZz8KCiAgICAJfSwKCiAgICAJbGluZVRvOiBmdW5jdGlvbiAoIHgsIHkgKSB7CgogICAgCQl2YXIgY3VydmUgPSBuZXcgTGluZUN1cnZlKCB0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLCBuZXcgVmVjdG9yMiggeCwgeSApICk7CiAgICAJCXRoaXMuY3VydmVzLnB1c2goIGN1cnZlICk7CgogICAgCQl0aGlzLmN1cnJlbnRQb2ludC5zZXQoIHgsIHkgKTsKCiAgICAJfSwKCiAgICAJcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7CgogICAgCQl2YXIgY3VydmUgPSBuZXcgUXVhZHJhdGljQmV6aWVyQ3VydmUoCiAgICAJCQl0aGlzLmN1cnJlbnRQb2ludC5jbG9uZSgpLAogICAgCQkJbmV3IFZlY3RvcjIoIGFDUHgsIGFDUHkgKSwKICAgIAkJCW5ldyBWZWN0b3IyKCBhWCwgYVkgKQogICAgCQkpOwoKICAgIAkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKCiAgICAJCXRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7CgogICAgCX0sCgogICAgCWJlemllckN1cnZlVG86IGZ1bmN0aW9uICggYUNQMXgsIGFDUDF5LCBhQ1AyeCwgYUNQMnksIGFYLCBhWSApIHsKCiAgICAJCXZhciBjdXJ2ZSA9IG5ldyBDdWJpY0JlemllckN1cnZlKAogICAgCQkJdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSwKICAgIAkJCW5ldyBWZWN0b3IyKCBhQ1AxeCwgYUNQMXkgKSwKICAgIAkJCW5ldyBWZWN0b3IyKCBhQ1AyeCwgYUNQMnkgKSwKICAgIAkJCW5ldyBWZWN0b3IyKCBhWCwgYVkgKQogICAgCQkpOwoKICAgIAkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKCiAgICAJCXRoaXMuY3VycmVudFBvaW50LnNldCggYVgsIGFZICk7CgogICAgCX0sCgogICAgCXNwbGluZVRocnU6IGZ1bmN0aW9uICggcHRzIC8qQXJyYXkgb2YgVmVjdG9yKi8gKSB7CgogICAgCQl2YXIgbnB0cyA9IFsgdGhpcy5jdXJyZW50UG9pbnQuY2xvbmUoKSBdLmNvbmNhdCggcHRzICk7CgogICAgCQl2YXIgY3VydmUgPSBuZXcgU3BsaW5lQ3VydmUoIG5wdHMgKTsKICAgIAkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKCiAgICAJCXRoaXMuY3VycmVudFBvaW50LmNvcHkoIHB0c1sgcHRzLmxlbmd0aCAtIDEgXSApOwoKICAgIAl9LAoKICAgIAlhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkgewoKICAgIAkJdmFyIHgwID0gdGhpcy5jdXJyZW50UG9pbnQueDsKICAgIAkJdmFyIHkwID0gdGhpcy5jdXJyZW50UG9pbnQueTsKCiAgICAJCXRoaXMuYWJzYXJjKCBhWCArIHgwLCBhWSArIHkwLCBhUmFkaXVzLAogICAgCQkJYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSApOwoKICAgIAl9LAoKICAgIAlhYnNhcmM6IGZ1bmN0aW9uICggYVgsIGFZLCBhUmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlICkgewoKICAgIAkJdGhpcy5hYnNlbGxpcHNlKCBhWCwgYVksIGFSYWRpdXMsIGFSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UgKTsKCiAgICAJfSwKCiAgICAJZWxsaXBzZTogZnVuY3Rpb24gKCBhWCwgYVksIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApIHsKCiAgICAJCXZhciB4MCA9IHRoaXMuY3VycmVudFBvaW50Lng7CiAgICAJCXZhciB5MCA9IHRoaXMuY3VycmVudFBvaW50Lnk7CgogICAgCQl0aGlzLmFic2VsbGlwc2UoIGFYICsgeDAsIGFZICsgeTAsIHhSYWRpdXMsIHlSYWRpdXMsIGFTdGFydEFuZ2xlLCBhRW5kQW5nbGUsIGFDbG9ja3dpc2UsIGFSb3RhdGlvbiApOwoKICAgIAl9LAoKICAgIAlhYnNlbGxpcHNlOiBmdW5jdGlvbiAoIGFYLCBhWSwgeFJhZGl1cywgeVJhZGl1cywgYVN0YXJ0QW5nbGUsIGFFbmRBbmdsZSwgYUNsb2Nrd2lzZSwgYVJvdGF0aW9uICkgewoKICAgIAkJdmFyIGN1cnZlID0gbmV3IEVsbGlwc2VDdXJ2ZSggYVgsIGFZLCB4UmFkaXVzLCB5UmFkaXVzLCBhU3RhcnRBbmdsZSwgYUVuZEFuZ2xlLCBhQ2xvY2t3aXNlLCBhUm90YXRpb24gKTsKCiAgICAJCWlmICggdGhpcy5jdXJ2ZXMubGVuZ3RoID4gMCApIHsKCiAgICAJCQkvLyBpZiBhIHByZXZpb3VzIGN1cnZlIGlzIHByZXNlbnQsIGF0dGVtcHQgdG8gam9pbgogICAgCQkJdmFyIGZpcnN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMCApOwoKICAgIAkJCWlmICggISBmaXJzdFBvaW50LmVxdWFscyggdGhpcy5jdXJyZW50UG9pbnQgKSApIHsKCiAgICAJCQkJdGhpcy5saW5lVG8oIGZpcnN0UG9pbnQueCwgZmlyc3RQb2ludC55ICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJdGhpcy5jdXJ2ZXMucHVzaCggY3VydmUgKTsKCiAgICAJCXZhciBsYXN0UG9pbnQgPSBjdXJ2ZS5nZXRQb2ludCggMSApOwogICAgCQl0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBsYXN0UG9pbnQgKTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQlDdXJ2ZVBhdGgucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLmN1cnJlbnRQb2ludC5jb3B5KCBzb3VyY2UuY3VycmVudFBvaW50ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZGF0YSA9IEN1cnZlUGF0aC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJCWRhdGEuY3VycmVudFBvaW50ID0gdGhpcy5jdXJyZW50UG9pbnQudG9BcnJheSgpOwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0sCgogICAgCWZyb21KU09OOiBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCQlDdXJ2ZVBhdGgucHJvdG90eXBlLmZyb21KU09OLmNhbGwoIHRoaXMsIGpzb24gKTsKCiAgICAJCXRoaXMuY3VycmVudFBvaW50LmZyb21BcnJheSgganNvbi5jdXJyZW50UG9pbnQgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwogICAgICogRGVmaW5lcyBhIDJkIHNoYXBlIHBsYW5lIHVzaW5nIHBhdGhzLgogICAgICoqLwoKICAgIC8vIFNURVAgMSBDcmVhdGUgYSBwYXRoLgogICAgLy8gU1RFUCAyIFR1cm4gcGF0aCBpbnRvIHNoYXBlLgogICAgLy8gU1RFUCAzIEV4dHJ1ZGVHZW9tZXRyeSB0YWtlcyBpbiBTaGFwZS9TaGFwZXMKICAgIC8vIFNURVAgM2EgLSBFeHRyYWN0IHBvaW50cyBmcm9tIGVhY2ggc2hhcGUsIHR1cm4gdG8gdmVydGljZXMKICAgIC8vIFNURVAgM2IgLSBUcmlhbmd1bGF0ZSBlYWNoIHNoYXBlLCBhZGQgZmFjZXMuCgogICAgZnVuY3Rpb24gU2hhcGUoIHBvaW50cyApIHsKCiAgICAJUGF0aCQ0LmNhbGwoIHRoaXMsIHBvaW50cyApOwoKICAgIAl0aGlzLnV1aWQgPSBfTWF0aC5nZW5lcmF0ZVVVSUQoKTsKCiAgICAJdGhpcy50eXBlID0gJ1NoYXBlJzsKCiAgICAJdGhpcy5ob2xlcyA9IFtdOwoKICAgIH0KCiAgICBTaGFwZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBQYXRoJDQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFNoYXBlLAoKICAgIAlnZXRQb2ludHNIb2xlczogZnVuY3Rpb24gKCBkaXZpc2lvbnMgKSB7CgogICAgCQl2YXIgaG9sZXNQdHMgPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IHRoaXMuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQlob2xlc1B0c1sgaSBdID0gdGhpcy5ob2xlc1sgaSBdLmdldFBvaW50cyggZGl2aXNpb25zICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gaG9sZXNQdHM7CgogICAgCX0sCgogICAgCS8vIGdldCBwb2ludHMgb2Ygc2hhcGUgYW5kIGhvbGVzIChrZXlwb2ludHMgYmFzZWQgb24gc2VnbWVudHMgcGFyYW1ldGVyKQoKICAgIAlleHRyYWN0UG9pbnRzOiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKCiAgICAJCXJldHVybiB7CgogICAgCQkJc2hhcGU6IHRoaXMuZ2V0UG9pbnRzKCBkaXZpc2lvbnMgKSwKICAgIAkJCWhvbGVzOiB0aGlzLmdldFBvaW50c0hvbGVzKCBkaXZpc2lvbnMgKQoKICAgIAkJfTsKCiAgICAJfSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQlQYXRoJDQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLmhvbGVzID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBzb3VyY2UuaG9sZXMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgaG9sZSA9IHNvdXJjZS5ob2xlc1sgaSBdOwoKICAgIAkJCXRoaXMuaG9sZXMucHVzaCggaG9sZS5jbG9uZSgpICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZGF0YSA9IFBhdGgkNC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJCWRhdGEudXVpZCA9IHRoaXMudXVpZDsKICAgIAkJZGF0YS5ob2xlcyA9IFtdOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gdGhpcy5ob2xlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBob2xlID0gdGhpcy5ob2xlc1sgaSBdOwogICAgCQkJZGF0YS5ob2xlcy5wdXNoKCBob2xlLnRvSlNPTigpICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gZGF0YTsKCiAgICAJfSwKCiAgICAJZnJvbUpTT046IGZ1bmN0aW9uICgganNvbiApIHsKCiAgICAJCVBhdGgkNC5wcm90b3R5cGUuZnJvbUpTT04uY2FsbCggdGhpcywganNvbiApOwoKICAgIAkJdGhpcy51dWlkID0ganNvbi51dWlkOwogICAgCQl0aGlzLmhvbGVzID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmhvbGVzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIGhvbGUgPSBqc29uLmhvbGVzWyBpIF07CiAgICAJCQl0aGlzLmhvbGVzLnB1c2goIG5ldyBQYXRoJDQoKS5mcm9tSlNPTiggaG9sZSApICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHkgKSB7CgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0xpZ2h0JzsKCiAgICAJdGhpcy5jb2xvciA9IG5ldyBDb2xvciQ3KCBjb2xvciApOwogICAgCXRoaXMuaW50ZW5zaXR5ID0gaW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgPyBpbnRlbnNpdHkgOiAxOwoKICAgIAl0aGlzLnJlY2VpdmVTaGFkb3cgPSB1bmRlZmluZWQ7CgogICAgfQoKICAgIExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBMaWdodCwKCiAgICAJaXNMaWdodDogdHJ1ZSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQlPYmplY3QzRC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJCXRoaXMuY29sb3IuY29weSggc291cmNlLmNvbG9yICk7CiAgICAJCXRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCiAgICAJCXZhciBkYXRhID0gT2JqZWN0M0QucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQlkYXRhLm9iamVjdC5jb2xvciA9IHRoaXMuY29sb3IuZ2V0SGV4KCk7CiAgICAJCWRhdGEub2JqZWN0LmludGVuc2l0eSA9IHRoaXMuaW50ZW5zaXR5OwoKICAgIAkJaWYgKCB0aGlzLmdyb3VuZENvbG9yICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5ncm91bmRDb2xvciA9IHRoaXMuZ3JvdW5kQ29sb3IuZ2V0SGV4KCk7CgogICAgCQlpZiAoIHRoaXMuZGlzdGFuY2UgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LmRpc3RhbmNlID0gdGhpcy5kaXN0YW5jZTsKICAgIAkJaWYgKCB0aGlzLmFuZ2xlICE9PSB1bmRlZmluZWQgKSBkYXRhLm9iamVjdC5hbmdsZSA9IHRoaXMuYW5nbGU7CiAgICAJCWlmICggdGhpcy5kZWNheSAhPT0gdW5kZWZpbmVkICkgZGF0YS5vYmplY3QuZGVjYXkgPSB0aGlzLmRlY2F5OwogICAgCQlpZiAoIHRoaXMucGVudW1icmEgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnBlbnVtYnJhID0gdGhpcy5wZW51bWJyYTsKCiAgICAJCWlmICggdGhpcy5zaGFkb3cgIT09IHVuZGVmaW5lZCApIGRhdGEub2JqZWN0LnNoYWRvdyA9IHRoaXMuc2hhZG93LnRvSlNPTigpOwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gSGVtaXNwaGVyZUxpZ2h0KCBza3lDb2xvciwgZ3JvdW5kQ29sb3IsIGludGVuc2l0eSApIHsKCiAgICAJTGlnaHQuY2FsbCggdGhpcywgc2t5Q29sb3IsIGludGVuc2l0eSApOwoKICAgIAl0aGlzLnR5cGUgPSAnSGVtaXNwaGVyZUxpZ2h0JzsKCiAgICAJdGhpcy5jYXN0U2hhZG93ID0gdW5kZWZpbmVkOwoKICAgIAl0aGlzLnBvc2l0aW9uLmNvcHkoIE9iamVjdDNELkRlZmF1bHRVcCApOwogICAgCXRoaXMudXBkYXRlTWF0cml4KCk7CgogICAgCXRoaXMuZ3JvdW5kQ29sb3IgPSBuZXcgQ29sb3IkNyggZ3JvdW5kQ29sb3IgKTsKCiAgICB9CgogICAgSGVtaXNwaGVyZUxpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHQsCgogICAgCWlzSGVtaXNwaGVyZUxpZ2h0OiB0cnVlLAoKICAgIAljb3B5OiBmdW5jdGlvbiAoIHNvdXJjZSApIHsKCiAgICAJCUxpZ2h0LnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAkJdGhpcy5ncm91bmRDb2xvci5jb3B5KCBzb3VyY2UuZ3JvdW5kQ29sb3IgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIExpZ2h0U2hhZG93KCBjYW1lcmEgKSB7CgogICAgCXRoaXMuY2FtZXJhID0gY2FtZXJhOwoKICAgIAl0aGlzLmJpYXMgPSAwOwogICAgCXRoaXMucmFkaXVzID0gMTsKCiAgICAJdGhpcy5tYXBTaXplID0gbmV3IFZlY3RvcjIoIDUxMiwgNTEyICk7CgogICAgCXRoaXMubWFwID0gbnVsbDsKICAgIAl0aGlzLm1hcFBhc3MgPSBudWxsOwogICAgCXRoaXMubWF0cml4ID0gbmV3IE1hdHJpeDQoKTsKCiAgICAJdGhpcy5fZnJ1c3R1bSA9IG5ldyBGcnVzdHVtKCk7CiAgICAJdGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDEsIDEgKTsKCiAgICAJdGhpcy5fdmlld3BvcnRDb3VudCA9IDE7CgogICAgCXRoaXMuX3ZpZXdwb3J0cyA9IFsKCiAgICAJCW5ldyBWZWN0b3I0KCAwLCAwLCAxLCAxICkKCiAgICAJXTsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggTGlnaHRTaGFkb3cucHJvdG90eXBlLCB7CgogICAgCV9wcm9qU2NyZWVuTWF0cml4OiBuZXcgTWF0cml4NCgpLAoKICAgIAlfbGlnaHRQb3NpdGlvbldvcmxkOiBuZXcgVmVjdG9yMygpLAoKICAgIAlfbG9va1RhcmdldDogbmV3IFZlY3RvcjMoKSwKCiAgICAJZ2V0Vmlld3BvcnRDb3VudDogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuX3ZpZXdwb3J0Q291bnQ7CgogICAgCX0sCgogICAgCWdldEZydXN0dW06IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLl9mcnVzdHVtOwoKICAgIAl9LAoKICAgIAl1cGRhdGVNYXRyaWNlczogZnVuY3Rpb24gKCBsaWdodCApIHsKCiAgICAJCXZhciBzaGFkb3dDYW1lcmEgPSB0aGlzLmNhbWVyYSwKICAgIAkJCXNoYWRvd01hdHJpeCA9IHRoaXMubWF0cml4LAogICAgCQkJcHJvalNjcmVlbk1hdHJpeCA9IHRoaXMuX3Byb2pTY3JlZW5NYXRyaXgsCiAgICAJCQlsb29rVGFyZ2V0ID0gdGhpcy5fbG9va1RhcmdldCwKICAgIAkJCWxpZ2h0UG9zaXRpb25Xb3JsZCA9IHRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZDsKCiAgICAJCWxpZ2h0UG9zaXRpb25Xb3JsZC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIGxpZ2h0Lm1hdHJpeFdvcmxkICk7CiAgICAJCXNoYWRvd0NhbWVyYS5wb3NpdGlvbi5jb3B5KCBsaWdodFBvc2l0aW9uV29ybGQgKTsKCiAgICAJCWxvb2tUYXJnZXQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC50YXJnZXQubWF0cml4V29ybGQgKTsKICAgIAkJc2hhZG93Q2FtZXJhLmxvb2tBdCggbG9va1RhcmdldCApOwogICAgCQlzaGFkb3dDYW1lcmEudXBkYXRlTWF0cml4V29ybGQoKTsKCiAgICAJCXByb2pTY3JlZW5NYXRyaXgubXVsdGlwbHlNYXRyaWNlcyggc2hhZG93Q2FtZXJhLnByb2plY3Rpb25NYXRyaXgsIHNoYWRvd0NhbWVyYS5tYXRyaXhXb3JsZEludmVyc2UgKTsKICAgIAkJdGhpcy5fZnJ1c3R1bS5zZXRGcm9tTWF0cml4KCBwcm9qU2NyZWVuTWF0cml4ICk7CgogICAgCQlzaGFkb3dNYXRyaXguc2V0KAogICAgCQkJMC41LCAwLjAsIDAuMCwgMC41LAogICAgCQkJMC4wLCAwLjUsIDAuMCwgMC41LAogICAgCQkJMC4wLCAwLjAsIDAuNSwgMC41LAogICAgCQkJMC4wLCAwLjAsIDAuMCwgMS4wCiAgICAJCSk7CgogICAgCQlzaGFkb3dNYXRyaXgubXVsdGlwbHkoIHNoYWRvd0NhbWVyYS5wcm9qZWN0aW9uTWF0cml4ICk7CiAgICAJCXNoYWRvd01hdHJpeC5tdWx0aXBseSggc2hhZG93Q2FtZXJhLm1hdHJpeFdvcmxkSW52ZXJzZSApOwoKICAgIAl9LAoKICAgIAlnZXRWaWV3cG9ydDogZnVuY3Rpb24gKCB2aWV3cG9ydEluZGV4ICkgewoKICAgIAkJcmV0dXJuIHRoaXMuX3ZpZXdwb3J0c1sgdmlld3BvcnRJbmRleCBdOwoKICAgIAl9LAoKICAgIAlnZXRGcmFtZUV4dGVudHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLl9mcmFtZUV4dGVudHM7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJdGhpcy5jYW1lcmEgPSBzb3VyY2UuY2FtZXJhLmNsb25lKCk7CgogICAgCQl0aGlzLmJpYXMgPSBzb3VyY2UuYmlhczsKICAgIAkJdGhpcy5yYWRpdXMgPSBzb3VyY2UucmFkaXVzOwoKICAgIAkJdGhpcy5tYXBTaXplLmNvcHkoIHNvdXJjZS5tYXBTaXplICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgb2JqZWN0ID0ge307CgogICAgCQlpZiAoIHRoaXMuYmlhcyAhPT0gMCApIG9iamVjdC5iaWFzID0gdGhpcy5iaWFzOwogICAgCQlpZiAoIHRoaXMucmFkaXVzICE9PSAxICkgb2JqZWN0LnJhZGl1cyA9IHRoaXMucmFkaXVzOwogICAgCQlpZiAoIHRoaXMubWFwU2l6ZS54ICE9PSA1MTIgfHwgdGhpcy5tYXBTaXplLnkgIT09IDUxMiApIG9iamVjdC5tYXBTaXplID0gdGhpcy5tYXBTaXplLnRvQXJyYXkoKTsKCiAgICAJCW9iamVjdC5jYW1lcmEgPSB0aGlzLmNhbWVyYS50b0pTT04oIGZhbHNlICkub2JqZWN0OwogICAgCQlkZWxldGUgb2JqZWN0LmNhbWVyYS5tYXRyaXg7CgogICAgCQlyZXR1cm4gb2JqZWN0OwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFNwb3RMaWdodFNoYWRvdygpIHsKCiAgICAJTGlnaHRTaGFkb3cuY2FsbCggdGhpcywgbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCA1MCwgMSwgMC41LCA1MDAgKSApOwoKICAgIH0KCiAgICBTcG90TGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFNwb3RMaWdodFNoYWRvdywKCiAgICAJaXNTcG90TGlnaHRTaGFkb3c6IHRydWUsCgogICAgCXVwZGF0ZU1hdHJpY2VzOiBmdW5jdGlvbiAoIGxpZ2h0LCB2aWV3Q2FtZXJhLCB2aWV3cG9ydEluZGV4ICkgewoKICAgIAkJdmFyIGNhbWVyYSA9IHRoaXMuY2FtZXJhOwoKICAgIAkJdmFyIGZvdiA9IF9NYXRoLlJBRDJERUcgKiAyICogbGlnaHQuYW5nbGU7CiAgICAJCXZhciBhc3BlY3QgPSB0aGlzLm1hcFNpemUud2lkdGggLyB0aGlzLm1hcFNpemUuaGVpZ2h0OwogICAgCQl2YXIgZmFyID0gbGlnaHQuZGlzdGFuY2UgfHwgY2FtZXJhLmZhcjsKCiAgICAJCWlmICggZm92ICE9PSBjYW1lcmEuZm92IHx8IGFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCB8fCBmYXIgIT09IGNhbWVyYS5mYXIgKSB7CgogICAgCQkJY2FtZXJhLmZvdiA9IGZvdjsKICAgIAkJCWNhbWVyYS5hc3BlY3QgPSBhc3BlY3Q7CiAgICAJCQljYW1lcmEuZmFyID0gZmFyOwogICAgCQkJY2FtZXJhLnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKCiAgICAJCX0KCiAgICAJCUxpZ2h0U2hhZG93LnByb3RvdHlwZS51cGRhdGVNYXRyaWNlcy5jYWxsKCB0aGlzLCBsaWdodCwgdmlld0NhbWVyYSwgdmlld3BvcnRJbmRleCApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFNwb3RMaWdodCggY29sb3IsIGludGVuc2l0eSwgZGlzdGFuY2UsIGFuZ2xlLCBwZW51bWJyYSwgZGVjYXkgKSB7CgogICAgCUxpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTsKCiAgICAJdGhpcy50eXBlID0gJ1Nwb3RMaWdodCc7CgogICAgCXRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7CiAgICAJdGhpcy51cGRhdGVNYXRyaXgoKTsKCiAgICAJdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTsKCiAgICAJT2JqZWN0LmRlZmluZVByb3BlcnR5KCB0aGlzLCAncG93ZXInLCB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCS8vIGludGVuc2l0eSA9IHBvd2VyIHBlciBzb2xpZCBhbmdsZS4KICAgIAkJCS8vIHJlZjogZXF1YXRpb24gKDE3KSBmcm9tIGh0dHBzOi8vc2VibGFnYXJkZS5maWxlcy53b3JkcHJlc3MuY29tLzIwMTUvMDcvY291cnNlX25vdGVzX21vdmluZ19mcm9zdGJpdGVfdG9fcGJyX3YzMi5wZGYKICAgIAkJCXJldHVybiB0aGlzLmludGVuc2l0eSAqIE1hdGguUEk7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7CgogICAgCQkJLy8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLgogICAgCQkJLy8gcmVmOiBlcXVhdGlvbiAoMTcpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZgogICAgCQkJdGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvIE1hdGguUEk7CgogICAgCQl9CiAgICAJfSApOwoKICAgIAl0aGlzLmRpc3RhbmNlID0gKCBkaXN0YW5jZSAhPT0gdW5kZWZpbmVkICkgPyBkaXN0YW5jZSA6IDA7CiAgICAJdGhpcy5hbmdsZSA9ICggYW5nbGUgIT09IHVuZGVmaW5lZCApID8gYW5nbGUgOiBNYXRoLlBJIC8gMzsKICAgIAl0aGlzLnBlbnVtYnJhID0gKCBwZW51bWJyYSAhPT0gdW5kZWZpbmVkICkgPyBwZW51bWJyYSA6IDA7CiAgICAJdGhpcy5kZWNheSA9ICggZGVjYXkgIT09IHVuZGVmaW5lZCApID8gZGVjYXkgOiAxOwkvLyBmb3IgcGh5c2ljYWxseSBjb3JyZWN0IGxpZ2h0cywgc2hvdWxkIGJlIDIuCgogICAgCXRoaXMuc2hhZG93ID0gbmV3IFNwb3RMaWdodFNoYWRvdygpOwoKICAgIH0KCiAgICBTcG90TGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFNwb3RMaWdodCwKCiAgICAJaXNTcG90TGlnaHQ6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlOwogICAgCQl0aGlzLmFuZ2xlID0gc291cmNlLmFuZ2xlOwogICAgCQl0aGlzLnBlbnVtYnJhID0gc291cmNlLnBlbnVtYnJhOwogICAgCQl0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5OwoKICAgIAkJdGhpcy50YXJnZXQgPSBzb3VyY2UudGFyZ2V0LmNsb25lKCk7CgogICAgCQl0aGlzLnNoYWRvdyA9IHNvdXJjZS5zaGFkb3cuY2xvbmUoKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIGZ1bmN0aW9uIFBvaW50TGlnaHRTaGFkb3coKSB7CgogICAgCUxpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSggOTAsIDEsIDAuNSwgNTAwICkgKTsKCiAgICAJdGhpcy5fZnJhbWVFeHRlbnRzID0gbmV3IFZlY3RvcjIoIDQsIDIgKTsKCiAgICAJdGhpcy5fdmlld3BvcnRDb3VudCA9IDY7CgogICAgCXRoaXMuX3ZpZXdwb3J0cyA9IFsKICAgIAkJLy8gVGhlc2Ugdmlld3BvcnRzIG1hcCBhIGN1YmUtbWFwIG9udG8gYSAyRCB0ZXh0dXJlIHdpdGggdGhlCiAgICAJCS8vIGZvbGxvd2luZyBvcmllbnRhdGlvbjoKICAgIAkJLy8KICAgIAkJLy8gIHh6WFoKICAgIAkJLy8gICB5IFkKICAgIAkJLy8KICAgIAkJLy8gWCAtIFBvc2l0aXZlIHggZGlyZWN0aW9uCiAgICAJCS8vIHggLSBOZWdhdGl2ZSB4IGRpcmVjdGlvbgogICAgCQkvLyBZIC0gUG9zaXRpdmUgeSBkaXJlY3Rpb24KICAgIAkJLy8geSAtIE5lZ2F0aXZlIHkgZGlyZWN0aW9uCiAgICAJCS8vIFogLSBQb3NpdGl2ZSB6IGRpcmVjdGlvbgogICAgCQkvLyB6IC0gTmVnYXRpdmUgeiBkaXJlY3Rpb24KCiAgICAJCS8vIHBvc2l0aXZlIFgKICAgIAkJbmV3IFZlY3RvcjQoIDIsIDEsIDEsIDEgKSwKICAgIAkJLy8gbmVnYXRpdmUgWAogICAgCQluZXcgVmVjdG9yNCggMCwgMSwgMSwgMSApLAogICAgCQkvLyBwb3NpdGl2ZSBaCiAgICAJCW5ldyBWZWN0b3I0KCAzLCAxLCAxLCAxICksCiAgICAJCS8vIG5lZ2F0aXZlIFoKICAgIAkJbmV3IFZlY3RvcjQoIDEsIDEsIDEsIDEgKSwKICAgIAkJLy8gcG9zaXRpdmUgWQogICAgCQluZXcgVmVjdG9yNCggMywgMCwgMSwgMSApLAogICAgCQkvLyBuZWdhdGl2ZSBZCiAgICAJCW5ldyBWZWN0b3I0KCAxLCAwLCAxLCAxICkKICAgIAldOwoKICAgIAl0aGlzLl9jdWJlRGlyZWN0aW9ucyA9IFsKICAgIAkJbmV3IFZlY3RvcjMoIDEsIDAsIDAgKSwgbmV3IFZlY3RvcjMoIC0gMSwgMCwgMCApLCBuZXcgVmVjdG9yMyggMCwgMCwgMSApLAogICAgCQluZXcgVmVjdG9yMyggMCwgMCwgLSAxICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAtIDEsIDAgKQogICAgCV07CgogICAgCXRoaXMuX2N1YmVVcHMgPSBbCiAgICAJCW5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAxLCAwICksCiAgICAJCW5ldyBWZWN0b3IzKCAwLCAxLCAwICksIG5ldyBWZWN0b3IzKCAwLCAwLCAxICksCW5ldyBWZWN0b3IzKCAwLCAwLCAtIDEgKQogICAgCV07CgogICAgfQoKICAgIFBvaW50TGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFBvaW50TGlnaHRTaGFkb3csCgogICAgCWlzUG9pbnRMaWdodFNoYWRvdzogdHJ1ZSwKCiAgICAJdXBkYXRlTWF0cmljZXM6IGZ1bmN0aW9uICggbGlnaHQsIHZpZXdDYW1lcmEsIHZpZXdwb3J0SW5kZXggKSB7CgogICAgCQl2YXIgY2FtZXJhID0gdGhpcy5jYW1lcmEsCiAgICAJCQlzaGFkb3dNYXRyaXggPSB0aGlzLm1hdHJpeCwKICAgIAkJCWxpZ2h0UG9zaXRpb25Xb3JsZCA9IHRoaXMuX2xpZ2h0UG9zaXRpb25Xb3JsZCwKICAgIAkJCWxvb2tUYXJnZXQgPSB0aGlzLl9sb29rVGFyZ2V0LAogICAgCQkJcHJvalNjcmVlbk1hdHJpeCA9IHRoaXMuX3Byb2pTY3JlZW5NYXRyaXg7CgogICAgCQlsaWdodFBvc2l0aW9uV29ybGQuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCBsaWdodC5tYXRyaXhXb3JsZCApOwogICAgCQljYW1lcmEucG9zaXRpb24uY29weSggbGlnaHRQb3NpdGlvbldvcmxkICk7CgogICAgCQlsb29rVGFyZ2V0LmNvcHkoIGNhbWVyYS5wb3NpdGlvbiApOwogICAgCQlsb29rVGFyZ2V0LmFkZCggdGhpcy5fY3ViZURpcmVjdGlvbnNbIHZpZXdwb3J0SW5kZXggXSApOwogICAgCQljYW1lcmEudXAuY29weSggdGhpcy5fY3ViZVVwc1sgdmlld3BvcnRJbmRleCBdICk7CiAgICAJCWNhbWVyYS5sb29rQXQoIGxvb2tUYXJnZXQgKTsKICAgIAkJY2FtZXJhLnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgogICAgCQlzaGFkb3dNYXRyaXgubWFrZVRyYW5zbGF0aW9uKCAtIGxpZ2h0UG9zaXRpb25Xb3JsZC54LCAtIGxpZ2h0UG9zaXRpb25Xb3JsZC55LCAtIGxpZ2h0UG9zaXRpb25Xb3JsZC56ICk7CgogICAgCQlwcm9qU2NyZWVuTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIGNhbWVyYS5wcm9qZWN0aW9uTWF0cml4LCBjYW1lcmEubWF0cml4V29ybGRJbnZlcnNlICk7CiAgICAJCXRoaXMuX2ZydXN0dW0uc2V0RnJvbU1hdHJpeCggcHJvalNjcmVlbk1hdHJpeCApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKCiAgICBmdW5jdGlvbiBQb2ludExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5LCBkaXN0YW5jZSwgZGVjYXkgKSB7CgogICAgCUxpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTsKCiAgICAJdGhpcy50eXBlID0gJ1BvaW50TGlnaHQnOwoKICAgIAlPYmplY3QuZGVmaW5lUHJvcGVydHkoIHRoaXMsICdwb3dlcicsIHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJLy8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLgogICAgCQkJLy8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZgogICAgCQkJcmV0dXJuIHRoaXMuaW50ZW5zaXR5ICogNCAqIE1hdGguUEk7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggcG93ZXIgKSB7CgogICAgCQkJLy8gaW50ZW5zaXR5ID0gcG93ZXIgcGVyIHNvbGlkIGFuZ2xlLgogICAgCQkJLy8gcmVmOiBlcXVhdGlvbiAoMTUpIGZyb20gaHR0cHM6Ly9zZWJsYWdhcmRlLmZpbGVzLndvcmRwcmVzcy5jb20vMjAxNS8wNy9jb3Vyc2Vfbm90ZXNfbW92aW5nX2Zyb3N0Yml0ZV90b19wYnJfdjMyLnBkZgogICAgCQkJdGhpcy5pbnRlbnNpdHkgPSBwb3dlciAvICggNCAqIE1hdGguUEkgKTsKCiAgICAJCX0KICAgIAl9ICk7CgogICAgCXRoaXMuZGlzdGFuY2UgPSAoIGRpc3RhbmNlICE9PSB1bmRlZmluZWQgKSA/IGRpc3RhbmNlIDogMDsKICAgIAl0aGlzLmRlY2F5ID0gKCBkZWNheSAhPT0gdW5kZWZpbmVkICkgPyBkZWNheSA6IDE7CS8vIGZvciBwaHlzaWNhbGx5IGNvcnJlY3QgbGlnaHRzLCBzaG91bGQgYmUgMi4KCiAgICAJdGhpcy5zaGFkb3cgPSBuZXcgUG9pbnRMaWdodFNoYWRvdygpOwoKICAgIH0KCiAgICBQb2ludExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBQb2ludExpZ2h0LAoKICAgIAlpc1BvaW50TGlnaHQ6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLmRpc3RhbmNlID0gc291cmNlLmRpc3RhbmNlOwogICAgCQl0aGlzLmRlY2F5ID0gc291cmNlLmRlY2F5OwoKICAgIAkJdGhpcy5zaGFkb3cgPSBzb3VyY2Uuc2hhZG93LmNsb25lKCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIGFyb3NlIC8gaHR0cDovL2dpdGh1Yi5jb20vYXJvc2UKICAgICAqLwoKICAgIGZ1bmN0aW9uIE9ydGhvZ3JhcGhpY0NhbWVyYSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSB7CgogICAgCUNhbWVyYS5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMudHlwZSA9ICdPcnRob2dyYXBoaWNDYW1lcmEnOwoKICAgIAl0aGlzLnpvb20gPSAxOwogICAgCXRoaXMudmlldyA9IG51bGw7CgogICAgCXRoaXMubGVmdCA9ICggbGVmdCAhPT0gdW5kZWZpbmVkICkgPyBsZWZ0IDogLSAxOwogICAgCXRoaXMucmlnaHQgPSAoIHJpZ2h0ICE9PSB1bmRlZmluZWQgKSA/IHJpZ2h0IDogMTsKICAgIAl0aGlzLnRvcCA9ICggdG9wICE9PSB1bmRlZmluZWQgKSA/IHRvcCA6IDE7CiAgICAJdGhpcy5ib3R0b20gPSAoIGJvdHRvbSAhPT0gdW5kZWZpbmVkICkgPyBib3R0b20gOiAtIDE7CgogICAgCXRoaXMubmVhciA9ICggbmVhciAhPT0gdW5kZWZpbmVkICkgPyBuZWFyIDogMC4xOwogICAgCXRoaXMuZmFyID0gKCBmYXIgIT09IHVuZGVmaW5lZCApID8gZmFyIDogMjAwMDsKCiAgICAJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CgogICAgfQoKICAgIE9ydGhvZ3JhcGhpY0NhbWVyYS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBDYW1lcmEucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IE9ydGhvZ3JhcGhpY0NhbWVyYSwKCiAgICAJaXNPcnRob2dyYXBoaWNDYW1lcmE6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlLCByZWN1cnNpdmUgKSB7CgogICAgCQlDYW1lcmEucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlLCByZWN1cnNpdmUgKTsKCiAgICAJCXRoaXMubGVmdCA9IHNvdXJjZS5sZWZ0OwogICAgCQl0aGlzLnJpZ2h0ID0gc291cmNlLnJpZ2h0OwogICAgCQl0aGlzLnRvcCA9IHNvdXJjZS50b3A7CiAgICAJCXRoaXMuYm90dG9tID0gc291cmNlLmJvdHRvbTsKICAgIAkJdGhpcy5uZWFyID0gc291cmNlLm5lYXI7CiAgICAJCXRoaXMuZmFyID0gc291cmNlLmZhcjsKCiAgICAJCXRoaXMuem9vbSA9IHNvdXJjZS56b29tOwogICAgCQl0aGlzLnZpZXcgPSBzb3VyY2UudmlldyA9PT0gbnVsbCA/IG51bGwgOiBPYmplY3QuYXNzaWduKCB7fSwgc291cmNlLnZpZXcgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRWaWV3T2Zmc2V0OiBmdW5jdGlvbiAoIGZ1bGxXaWR0aCwgZnVsbEhlaWdodCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHsKCiAgICAJCWlmICggdGhpcy52aWV3ID09PSBudWxsICkgewoKICAgIAkJCXRoaXMudmlldyA9IHsKICAgIAkJCQllbmFibGVkOiB0cnVlLAogICAgCQkJCWZ1bGxXaWR0aDogMSwKICAgIAkJCQlmdWxsSGVpZ2h0OiAxLAogICAgCQkJCW9mZnNldFg6IDAsCiAgICAJCQkJb2Zmc2V0WTogMCwKICAgIAkJCQl3aWR0aDogMSwKICAgIAkJCQloZWlnaHQ6IDEKICAgIAkJCX07CgogICAgCQl9CgogICAgCQl0aGlzLnZpZXcuZW5hYmxlZCA9IHRydWU7CiAgICAJCXRoaXMudmlldy5mdWxsV2lkdGggPSBmdWxsV2lkdGg7CiAgICAJCXRoaXMudmlldy5mdWxsSGVpZ2h0ID0gZnVsbEhlaWdodDsKICAgIAkJdGhpcy52aWV3Lm9mZnNldFggPSB4OwogICAgCQl0aGlzLnZpZXcub2Zmc2V0WSA9IHk7CiAgICAJCXRoaXMudmlldy53aWR0aCA9IHdpZHRoOwogICAgCQl0aGlzLnZpZXcuaGVpZ2h0ID0gaGVpZ2h0OwoKICAgIAkJdGhpcy51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CgogICAgCX0sCgogICAgCWNsZWFyVmlld09mZnNldDogZnVuY3Rpb24gKCkgewoKICAgIAkJaWYgKCB0aGlzLnZpZXcgIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy52aWV3LmVuYWJsZWQgPSBmYWxzZTsKCiAgICAJCX0KCiAgICAJCXRoaXMudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKICAgIAl9LAoKICAgIAl1cGRhdGVQcm9qZWN0aW9uTWF0cml4OiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZHggPSAoIHRoaXMucmlnaHQgLSB0aGlzLmxlZnQgKSAvICggMiAqIHRoaXMuem9vbSApOwogICAgCQl2YXIgZHkgPSAoIHRoaXMudG9wIC0gdGhpcy5ib3R0b20gKSAvICggMiAqIHRoaXMuem9vbSApOwogICAgCQl2YXIgY3ggPSAoIHRoaXMucmlnaHQgKyB0aGlzLmxlZnQgKSAvIDI7CiAgICAJCXZhciBjeSA9ICggdGhpcy50b3AgKyB0aGlzLmJvdHRvbSApIC8gMjsKCiAgICAJCXZhciBsZWZ0ID0gY3ggLSBkeDsKICAgIAkJdmFyIHJpZ2h0ID0gY3ggKyBkeDsKICAgIAkJdmFyIHRvcCA9IGN5ICsgZHk7CiAgICAJCXZhciBib3R0b20gPSBjeSAtIGR5OwoKICAgIAkJaWYgKCB0aGlzLnZpZXcgIT09IG51bGwgJiYgdGhpcy52aWV3LmVuYWJsZWQgKSB7CgogICAgCQkJdmFyIHpvb21XID0gdGhpcy56b29tIC8gKCB0aGlzLnZpZXcud2lkdGggLyB0aGlzLnZpZXcuZnVsbFdpZHRoICk7CiAgICAJCQl2YXIgem9vbUggPSB0aGlzLnpvb20gLyAoIHRoaXMudmlldy5oZWlnaHQgLyB0aGlzLnZpZXcuZnVsbEhlaWdodCApOwogICAgCQkJdmFyIHNjYWxlVyA9ICggdGhpcy5yaWdodCAtIHRoaXMubGVmdCApIC8gdGhpcy52aWV3LndpZHRoOwogICAgCQkJdmFyIHNjYWxlSCA9ICggdGhpcy50b3AgLSB0aGlzLmJvdHRvbSApIC8gdGhpcy52aWV3LmhlaWdodDsKCiAgICAJCQlsZWZ0ICs9IHNjYWxlVyAqICggdGhpcy52aWV3Lm9mZnNldFggLyB6b29tVyApOwogICAgCQkJcmlnaHQgPSBsZWZ0ICsgc2NhbGVXICogKCB0aGlzLnZpZXcud2lkdGggLyB6b29tVyApOwogICAgCQkJdG9wIC09IHNjYWxlSCAqICggdGhpcy52aWV3Lm9mZnNldFkgLyB6b29tSCApOwogICAgCQkJYm90dG9tID0gdG9wIC0gc2NhbGVIICogKCB0aGlzLnZpZXcuaGVpZ2h0IC8gem9vbUggKTsKCiAgICAJCX0KCiAgICAJCXRoaXMucHJvamVjdGlvbk1hdHJpeC5tYWtlT3J0aG9ncmFwaGljKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIHRoaXMubmVhciwgdGhpcy5mYXIgKTsKCiAgICAJCXRoaXMucHJvamVjdGlvbk1hdHJpeEludmVyc2UuZ2V0SW52ZXJzZSggdGhpcy5wcm9qZWN0aW9uTWF0cml4ICk7CgogICAgCX0sCgogICAgCXRvSlNPTjogZnVuY3Rpb24gKCBtZXRhICkgewoKICAgIAkJdmFyIGRhdGEgPSBPYmplY3QzRC5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMsIG1ldGEgKTsKCiAgICAJCWRhdGEub2JqZWN0Lnpvb20gPSB0aGlzLnpvb207CiAgICAJCWRhdGEub2JqZWN0LmxlZnQgPSB0aGlzLmxlZnQ7CiAgICAJCWRhdGEub2JqZWN0LnJpZ2h0ID0gdGhpcy5yaWdodDsKICAgIAkJZGF0YS5vYmplY3QudG9wID0gdGhpcy50b3A7CiAgICAJCWRhdGEub2JqZWN0LmJvdHRvbSA9IHRoaXMuYm90dG9tOwogICAgCQlkYXRhLm9iamVjdC5uZWFyID0gdGhpcy5uZWFyOwogICAgCQlkYXRhLm9iamVjdC5mYXIgPSB0aGlzLmZhcjsKCiAgICAJCWlmICggdGhpcy52aWV3ICE9PSBudWxsICkgZGF0YS5vYmplY3QudmlldyA9IE9iamVjdC5hc3NpZ24oIHt9LCB0aGlzLnZpZXcgKTsKCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIERpcmVjdGlvbmFsTGlnaHRTaGFkb3coKSB7CgogICAgCUxpZ2h0U2hhZG93LmNhbGwoIHRoaXMsIG5ldyBPcnRob2dyYXBoaWNDYW1lcmEoIC0gNSwgNSwgNSwgLSA1LCAwLjUsIDUwMCApICk7CgogICAgfQoKICAgIERpcmVjdGlvbmFsTGlnaHRTaGFkb3cucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRTaGFkb3cucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3csCgogICAgCWlzRGlyZWN0aW9uYWxMaWdodFNoYWRvdzogdHJ1ZSwKCiAgICAJdXBkYXRlTWF0cmljZXM6IGZ1bmN0aW9uICggbGlnaHQsIHZpZXdDYW1lcmEsIHZpZXdwb3J0SW5kZXggKSB7CgogICAgCQlMaWdodFNoYWRvdy5wcm90b3R5cGUudXBkYXRlTWF0cmljZXMuY2FsbCggdGhpcywgbGlnaHQsIHZpZXdDYW1lcmEsIHZpZXdwb3J0SW5kZXggKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gRGlyZWN0aW9uYWxMaWdodCggY29sb3IsIGludGVuc2l0eSApIHsKCiAgICAJTGlnaHQuY2FsbCggdGhpcywgY29sb3IsIGludGVuc2l0eSApOwoKICAgIAl0aGlzLnR5cGUgPSAnRGlyZWN0aW9uYWxMaWdodCc7CgogICAgCXRoaXMucG9zaXRpb24uY29weSggT2JqZWN0M0QuRGVmYXVsdFVwICk7CiAgICAJdGhpcy51cGRhdGVNYXRyaXgoKTsKCiAgICAJdGhpcy50YXJnZXQgPSBuZXcgT2JqZWN0M0QoKTsKCiAgICAJdGhpcy5zaGFkb3cgPSBuZXcgRGlyZWN0aW9uYWxMaWdodFNoYWRvdygpOwoKICAgIH0KCiAgICBEaXJlY3Rpb25hbExpZ2h0LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExpZ2h0LnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBEaXJlY3Rpb25hbExpZ2h0LAoKICAgIAlpc0RpcmVjdGlvbmFsTGlnaHQ6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJTGlnaHQucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLnRhcmdldCA9IHNvdXJjZS50YXJnZXQuY2xvbmUoKTsKCiAgICAJCXRoaXMuc2hhZG93ID0gc291cmNlLnNoYWRvdy5jbG9uZSgpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gQW1iaWVudExpZ2h0KCBjb2xvciwgaW50ZW5zaXR5ICkgewoKICAgIAlMaWdodC5jYWxsKCB0aGlzLCBjb2xvciwgaW50ZW5zaXR5ICk7CgogICAgCXRoaXMudHlwZSA9ICdBbWJpZW50TGlnaHQnOwoKICAgIAl0aGlzLmNhc3RTaGFkb3cgPSB1bmRlZmluZWQ7CgogICAgfQoKICAgIEFtYmllbnRMaWdodC5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodC5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQW1iaWVudExpZ2h0LAoKICAgIAlpc0FtYmllbnRMaWdodDogdHJ1ZQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWJlbG5hdGlvbiAvIGh0dHA6Ly9naXRodWIuY29tL2FiZWxuYXRpb24KICAgICAqLwoKICAgIGZ1bmN0aW9uIFJlY3RBcmVhTGlnaHQoIGNvbG9yLCBpbnRlbnNpdHksIHdpZHRoLCBoZWlnaHQgKSB7CgogICAgCUxpZ2h0LmNhbGwoIHRoaXMsIGNvbG9yLCBpbnRlbnNpdHkgKTsKCiAgICAJdGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHQnOwoKICAgIAl0aGlzLndpZHRoID0gKCB3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyB3aWR0aCA6IDEwOwogICAgCXRoaXMuaGVpZ2h0ID0gKCBoZWlnaHQgIT09IHVuZGVmaW5lZCApID8gaGVpZ2h0IDogMTA7CgogICAgfQoKICAgIFJlY3RBcmVhTGlnaHQucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IFJlY3RBcmVhTGlnaHQsCgogICAgCWlzUmVjdEFyZWFMaWdodDogdHJ1ZSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQlMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJCXRoaXMud2lkdGggPSBzb3VyY2Uud2lkdGg7CiAgICAJCXRoaXMuaGVpZ2h0ID0gc291cmNlLmhlaWdodDsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCiAgICAJCXZhciBkYXRhID0gTGlnaHQucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQlkYXRhLm9iamVjdC53aWR0aCA9IHRoaXMud2lkdGg7CiAgICAJCWRhdGEub2JqZWN0LmhlaWdodCA9IHRoaXMuaGVpZ2h0OwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gTWF0ZXJpYWxMb2FkZXIoIG1hbmFnZXIgKSB7CgogICAgCUxvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7CgogICAgCXRoaXMudGV4dHVyZXMgPSB7fTsKCiAgICB9CgogICAgTWF0ZXJpYWxMb2FkZXIucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTG9hZGVyLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBNYXRlcmlhbExvYWRlciwKCiAgICAJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCiAgICAJCXZhciBzY29wZSA9IHRoaXM7CgogICAgCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHNjb3BlLm1hbmFnZXIgKTsKICAgIAkJbG9hZGVyLnNldFBhdGgoIHNjb3BlLnBhdGggKTsKICAgIAkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCB0ZXh0ICkgewoKICAgIAkJCW9uTG9hZCggc2NvcGUucGFyc2UoIEpTT04ucGFyc2UoIHRleHQgKSApICk7CgogICAgCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CgogICAgCX0sCgogICAgCXBhcnNlOiBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCQl2YXIgdGV4dHVyZXMgPSB0aGlzLnRleHR1cmVzOwoKICAgIAkJZnVuY3Rpb24gZ2V0VGV4dHVyZSggbmFtZSApIHsKCiAgICAJCQlpZiAoIHRleHR1cmVzWyBuYW1lIF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWxMb2FkZXI6IFVuZGVmaW5lZCB0ZXh0dXJlJywgbmFtZSApOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gdGV4dHVyZXNbIG5hbWUgXTsKCiAgICAJCX0KCiAgICAJCXZhciBtYXRlcmlhbCA9IG5ldyBNYXRlcmlhbHNbIGpzb24udHlwZSBdKCk7CgogICAgCQlpZiAoIGpzb24udXVpZCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudXVpZCA9IGpzb24udXVpZDsKICAgIAkJaWYgKCBqc29uLm5hbWUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm5hbWUgPSBqc29uLm5hbWU7CiAgICAJCWlmICgganNvbi5jb2xvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3Iuc2V0SGV4KCBqc29uLmNvbG9yICk7CiAgICAJCWlmICgganNvbi5yb3VnaG5lc3MgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdWdobmVzcyA9IGpzb24ucm91Z2huZXNzOwogICAgCQlpZiAoIGpzb24ubWV0YWxuZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5tZXRhbG5lc3MgPSBqc29uLm1ldGFsbmVzczsKICAgIAkJaWYgKCBqc29uLmVtaXNzaXZlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5lbWlzc2l2ZS5zZXRIZXgoIGpzb24uZW1pc3NpdmUgKTsKICAgIAkJaWYgKCBqc29uLnNwZWN1bGFyICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhci5zZXRIZXgoIGpzb24uc3BlY3VsYXIgKTsKICAgIAkJaWYgKCBqc29uLnNoaW5pbmVzcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2hpbmluZXNzID0ganNvbi5zaGluaW5lc3M7CiAgICAJCWlmICgganNvbi5jbGVhcmNvYXQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdCA9IGpzb24uY2xlYXJjb2F0OwogICAgCQlpZiAoIGpzb24uY2xlYXJjb2F0Um91Z2huZXNzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXRSb3VnaG5lc3MgPSBqc29uLmNsZWFyY29hdFJvdWdobmVzczsKICAgIAkJaWYgKCBqc29uLnZlcnRleENvbG9ycyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4Q29sb3JzID0ganNvbi52ZXJ0ZXhDb2xvcnM7CiAgICAJCWlmICgganNvbi5mb2cgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZvZyA9IGpzb24uZm9nOwogICAgCQlpZiAoIGpzb24uZmxhdFNoYWRpbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmZsYXRTaGFkaW5nID0ganNvbi5mbGF0U2hhZGluZzsKICAgIAkJaWYgKCBqc29uLmJsZW5kaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ibGVuZGluZyA9IGpzb24uYmxlbmRpbmc7CiAgICAJCWlmICgganNvbi5jb21iaW5lICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jb21iaW5lID0ganNvbi5jb21iaW5lOwogICAgCQlpZiAoIGpzb24uc2lkZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuc2lkZSA9IGpzb24uc2lkZTsKICAgIAkJaWYgKCBqc29uLm9wYWNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm9wYWNpdHkgPSBqc29uLm9wYWNpdHk7CiAgICAJCWlmICgganNvbi50cmFuc3BhcmVudCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSBqc29uLnRyYW5zcGFyZW50OwogICAgCQlpZiAoIGpzb24uYWxwaGFUZXN0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5hbHBoYVRlc3QgPSBqc29uLmFscGhhVGVzdDsKICAgIAkJaWYgKCBqc29uLmRlcHRoVGVzdCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVwdGhUZXN0ID0ganNvbi5kZXB0aFRlc3Q7CiAgICAJCWlmICgganNvbi5kZXB0aFdyaXRlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kZXB0aFdyaXRlID0ganNvbi5kZXB0aFdyaXRlOwogICAgCQlpZiAoIGpzb24uY29sb3JXcml0ZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuY29sb3JXcml0ZSA9IGpzb24uY29sb3JXcml0ZTsKICAgIAkJaWYgKCBqc29uLndpcmVmcmFtZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lID0ganNvbi53aXJlZnJhbWU7CiAgICAJCWlmICgganNvbi53aXJlZnJhbWVMaW5ld2lkdGggIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLndpcmVmcmFtZUxpbmV3aWR0aCA9IGpzb24ud2lyZWZyYW1lTGluZXdpZHRoOwogICAgCQlpZiAoIGpzb24ud2lyZWZyYW1lTGluZWNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwud2lyZWZyYW1lTGluZWNhcCA9IGpzb24ud2lyZWZyYW1lTGluZWNhcDsKICAgIAkJaWYgKCBqc29uLndpcmVmcmFtZUxpbmVqb2luICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC53aXJlZnJhbWVMaW5lam9pbiA9IGpzb24ud2lyZWZyYW1lTGluZWpvaW47CgogICAgCQlpZiAoIGpzb24ucm90YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJvdGF0aW9uID0ganNvbi5yb3RhdGlvbjsKCiAgICAJCWlmICgganNvbi5saW5ld2lkdGggIT09IDEgKSBtYXRlcmlhbC5saW5ld2lkdGggPSBqc29uLmxpbmV3aWR0aDsKICAgIAkJaWYgKCBqc29uLmRhc2hTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kYXNoU2l6ZSA9IGpzb24uZGFzaFNpemU7CiAgICAJCWlmICgganNvbi5nYXBTaXplICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5nYXBTaXplID0ganNvbi5nYXBTaXplOwogICAgCQlpZiAoIGpzb24uc2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNjYWxlID0ganNvbi5zY2FsZTsKCiAgICAJCWlmICgganNvbi5wb2x5Z29uT2Zmc2V0ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5wb2x5Z29uT2Zmc2V0ID0ganNvbi5wb2x5Z29uT2Zmc2V0OwogICAgCQlpZiAoIGpzb24ucG9seWdvbk9mZnNldEZhY3RvciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldEZhY3RvciA9IGpzb24ucG9seWdvbk9mZnNldEZhY3RvcjsKICAgIAkJaWYgKCBqc29uLnBvbHlnb25PZmZzZXRVbml0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucG9seWdvbk9mZnNldFVuaXRzID0ganNvbi5wb2x5Z29uT2Zmc2V0VW5pdHM7CgogICAgCQlpZiAoIGpzb24uc2tpbm5pbmcgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNraW5uaW5nID0ganNvbi5za2lubmluZzsKICAgIAkJaWYgKCBqc29uLm1vcnBoVGFyZ2V0cyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubW9ycGhUYXJnZXRzID0ganNvbi5tb3JwaFRhcmdldHM7CiAgICAJCWlmICgganNvbi5tb3JwaE5vcm1hbHMgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLm1vcnBoTm9ybWFscyA9IGpzb24ubW9ycGhOb3JtYWxzOwogICAgCQlpZiAoIGpzb24uZGl0aGVyaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXRoZXJpbmcgPSBqc29uLmRpdGhlcmluZzsKCiAgICAJCWlmICgganNvbi52aXNpYmxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC52aXNpYmxlID0ganNvbi52aXNpYmxlOwoKICAgIAkJaWYgKCBqc29uLnRvbmVNYXBwZWQgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnRvbmVNYXBwZWQgPSBqc29uLnRvbmVNYXBwZWQ7CgogICAgCQlpZiAoIGpzb24udXNlckRhdGEgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnVzZXJEYXRhID0ganNvbi51c2VyRGF0YTsKCiAgICAJCS8vIFNoYWRlciBNYXRlcmlhbAoKICAgIAkJaWYgKCBqc29uLnVuaWZvcm1zICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJZm9yICggdmFyIG5hbWUgaW4ganNvbi51bmlmb3JtcyApIHsKCiAgICAJCQkJdmFyIHVuaWZvcm0gPSBqc29uLnVuaWZvcm1zWyBuYW1lIF07CgogICAgCQkJCW1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0gPSB7fTsKCiAgICAJCQkJc3dpdGNoICggdW5pZm9ybS50eXBlICkgewoKICAgIAkJCQkJY2FzZSAndCc6CiAgICAJCQkJCQltYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gZ2V0VGV4dHVyZSggdW5pZm9ybS52YWx1ZSApOwogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICdjJzoKICAgIAkJCQkJCW1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgQ29sb3IkNygpLnNldEhleCggdW5pZm9ybS52YWx1ZSApOwogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICd2Mic6CiAgICAJCQkJCQltYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTsKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAndjMnOgogICAgCQkJCQkJbWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IG5ldyBWZWN0b3IzKCkuZnJvbUFycmF5KCB1bmlmb3JtLnZhbHVlICk7CiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ3Y0JzoKICAgIAkJCQkJCW1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgVmVjdG9yNCgpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApOwogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICdtMyc6CiAgICAJCQkJCQltYXRlcmlhbC51bmlmb3Jtc1sgbmFtZSBdLnZhbHVlID0gbmV3IE1hdHJpeDMoKS5mcm9tQXJyYXkoIHVuaWZvcm0udmFsdWUgKTsKCiAgICAJCQkJCWNhc2UgJ200JzoKICAgIAkJCQkJCW1hdGVyaWFsLnVuaWZvcm1zWyBuYW1lIF0udmFsdWUgPSBuZXcgTWF0cml4NCgpLmZyb21BcnJheSggdW5pZm9ybS52YWx1ZSApOwogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQlkZWZhdWx0OgogICAgCQkJCQkJbWF0ZXJpYWwudW5pZm9ybXNbIG5hbWUgXS52YWx1ZSA9IHVuaWZvcm0udmFsdWU7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlpZiAoIGpzb24uZGVmaW5lcyAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGVmaW5lcyA9IGpzb24uZGVmaW5lczsKICAgIAkJaWYgKCBqc29uLnZlcnRleFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwudmVydGV4U2hhZGVyID0ganNvbi52ZXJ0ZXhTaGFkZXI7CiAgICAJCWlmICgganNvbi5mcmFnbWVudFNoYWRlciAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZnJhZ21lbnRTaGFkZXIgPSBqc29uLmZyYWdtZW50U2hhZGVyOwoKICAgIAkJaWYgKCBqc29uLmV4dGVuc2lvbnMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlmb3IgKCB2YXIga2V5IGluIGpzb24uZXh0ZW5zaW9ucyApIHsKCiAgICAJCQkJbWF0ZXJpYWwuZXh0ZW5zaW9uc1sga2V5IF0gPSBqc29uLmV4dGVuc2lvbnNbIGtleSBdOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vIERlcHJlY2F0ZWQKCiAgICAJCWlmICgganNvbi5zaGFkaW5nICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5mbGF0U2hhZGluZyA9IGpzb24uc2hhZGluZyA9PT0gMTsgLy8gVEhSRUUuRmxhdFNoYWRpbmcKCiAgICAJCS8vIGZvciBQb2ludHNNYXRlcmlhbAoKICAgIAkJaWYgKCBqc29uLnNpemUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemUgPSBqc29uLnNpemU7CiAgICAJCWlmICgganNvbi5zaXplQXR0ZW51YXRpb24gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnNpemVBdHRlbnVhdGlvbiA9IGpzb24uc2l6ZUF0dGVudWF0aW9uOwoKICAgIAkJLy8gbWFwcwoKICAgIAkJaWYgKCBqc29uLm1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWFwID0gZ2V0VGV4dHVyZSgganNvbi5tYXAgKTsKICAgIAkJaWYgKCBqc29uLm1hdGNhcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWF0Y2FwID0gZ2V0VGV4dHVyZSgganNvbi5tYXRjYXAgKTsKCiAgICAJCWlmICgganNvbi5hbHBoYU1hcCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCW1hdGVyaWFsLmFscGhhTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hbHBoYU1hcCApOwogICAgCQkJbWF0ZXJpYWwudHJhbnNwYXJlbnQgPSB0cnVlOwoKICAgIAkJfQoKICAgIAkJaWYgKCBqc29uLmJ1bXBNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmJ1bXBNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmJ1bXBNYXAgKTsKICAgIAkJaWYgKCBqc29uLmJ1bXBTY2FsZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuYnVtcFNjYWxlID0ganNvbi5idW1wU2NhbGU7CgogICAgCQlpZiAoIGpzb24ubm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5ub3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLm5vcm1hbE1hcCApOwogICAgCQlpZiAoIGpzb24ubm9ybWFsTWFwVHlwZSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubm9ybWFsTWFwVHlwZSA9IGpzb24ubm9ybWFsTWFwVHlwZTsKICAgIAkJaWYgKCBqc29uLm5vcm1hbFNjYWxlICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJdmFyIG5vcm1hbFNjYWxlID0ganNvbi5ub3JtYWxTY2FsZTsKCiAgICAJCQlpZiAoIEFycmF5LmlzQXJyYXkoIG5vcm1hbFNjYWxlICkgPT09IGZhbHNlICkgewoKICAgIAkJCQkvLyBCbGVuZGVyIGV4cG9ydGVyIHVzZWQgdG8gZXhwb3J0IGEgc2NhbGFyLiBTZWUgIzc0NTkKCiAgICAJCQkJbm9ybWFsU2NhbGUgPSBbIG5vcm1hbFNjYWxlLCBub3JtYWxTY2FsZSBdOwoKICAgIAkJCX0KCiAgICAJCQltYXRlcmlhbC5ub3JtYWxTY2FsZSA9IG5ldyBWZWN0b3IyKCkuZnJvbUFycmF5KCBub3JtYWxTY2FsZSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBqc29uLmRpc3BsYWNlbWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZGlzcGxhY2VtZW50TWFwID0gZ2V0VGV4dHVyZSgganNvbi5kaXNwbGFjZW1lbnRNYXAgKTsKICAgIAkJaWYgKCBqc29uLmRpc3BsYWNlbWVudFNjYWxlICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRTY2FsZSA9IGpzb24uZGlzcGxhY2VtZW50U2NhbGU7CiAgICAJCWlmICgganNvbi5kaXNwbGFjZW1lbnRCaWFzICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5kaXNwbGFjZW1lbnRCaWFzID0ganNvbi5kaXNwbGFjZW1lbnRCaWFzOwoKICAgIAkJaWYgKCBqc29uLnJvdWdobmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucm91Z2huZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5yb3VnaG5lc3NNYXAgKTsKICAgIAkJaWYgKCBqc29uLm1ldGFsbmVzc01hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwubWV0YWxuZXNzTWFwID0gZ2V0VGV4dHVyZSgganNvbi5tZXRhbG5lc3NNYXAgKTsKCiAgICAJCWlmICgganNvbi5lbWlzc2l2ZU1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmVtaXNzaXZlTWFwICk7CiAgICAJCWlmICgganNvbi5lbWlzc2l2ZUludGVuc2l0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZW1pc3NpdmVJbnRlbnNpdHkgPSBqc29uLmVtaXNzaXZlSW50ZW5zaXR5OwoKICAgIAkJaWYgKCBqc29uLnNwZWN1bGFyTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5zcGVjdWxhck1hcCA9IGdldFRleHR1cmUoIGpzb24uc3BlY3VsYXJNYXAgKTsKCiAgICAJCWlmICgganNvbi5lbnZNYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcCA9IGdldFRleHR1cmUoIGpzb24uZW52TWFwICk7CiAgICAJCWlmICgganNvbi5lbnZNYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmVudk1hcEludGVuc2l0eSA9IGpzb24uZW52TWFwSW50ZW5zaXR5OwoKICAgIAkJaWYgKCBqc29uLnJlZmxlY3Rpdml0eSAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwucmVmbGVjdGl2aXR5ID0ganNvbi5yZWZsZWN0aXZpdHk7CiAgICAJCWlmICgganNvbi5yZWZyYWN0aW9uUmF0aW8gIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLnJlZnJhY3Rpb25SYXRpbyA9IGpzb24ucmVmcmFjdGlvblJhdGlvOwoKICAgIAkJaWYgKCBqc29uLmxpZ2h0TWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcCA9IGdldFRleHR1cmUoIGpzb24ubGlnaHRNYXAgKTsKICAgIAkJaWYgKCBqc29uLmxpZ2h0TWFwSW50ZW5zaXR5ICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5saWdodE1hcEludGVuc2l0eSA9IGpzb24ubGlnaHRNYXBJbnRlbnNpdHk7CgogICAgCQlpZiAoIGpzb24uYW9NYXAgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwID0gZ2V0VGV4dHVyZSgganNvbi5hb01hcCApOwogICAgCQlpZiAoIGpzb24uYW9NYXBJbnRlbnNpdHkgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmFvTWFwSW50ZW5zaXR5ID0ganNvbi5hb01hcEludGVuc2l0eTsKCiAgICAJCWlmICgganNvbi5ncmFkaWVudE1hcCAhPT0gdW5kZWZpbmVkICkgbWF0ZXJpYWwuZ3JhZGllbnRNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmdyYWRpZW50TWFwICk7CgogICAgCQlpZiAoIGpzb24uY2xlYXJjb2F0Tm9ybWFsTWFwICE9PSB1bmRlZmluZWQgKSBtYXRlcmlhbC5jbGVhcmNvYXROb3JtYWxNYXAgPSBnZXRUZXh0dXJlKCBqc29uLmNsZWFyY29hdE5vcm1hbE1hcCApOwogICAgCQlpZiAoIGpzb24uY2xlYXJjb2F0Tm9ybWFsU2NhbGUgIT09IHVuZGVmaW5lZCApIG1hdGVyaWFsLmNsZWFyY29hdE5vcm1hbFNjYWxlID0gbmV3IFZlY3RvcjIoKS5mcm9tQXJyYXkoIGpzb24uY2xlYXJjb2F0Tm9ybWFsU2NhbGUgKTsKCiAgICAJCXJldHVybiBtYXRlcmlhbDsKCiAgICAJfSwKCiAgICAJc2V0VGV4dHVyZXM6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQl0aGlzLnRleHR1cmVzID0gdmFsdWU7CiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBEb24gTWNDdXJkeSAvIGh0dHBzOi8vd3d3LmRvbm1jY3VyZHkuY29tCiAgICAgKi8KCiAgICB2YXIgTG9hZGVyVXRpbHMgPSB7CgogICAgCWRlY29kZVRleHQ6IGZ1bmN0aW9uICggYXJyYXkgKSB7CgogICAgCQlpZiAoIHR5cGVvZiBUZXh0RGVjb2RlciAhPT0gJ3VuZGVmaW5lZCcgKSB7CgogICAgCQkJcmV0dXJuIG5ldyBUZXh0RGVjb2RlcigpLmRlY29kZSggYXJyYXkgKTsKCiAgICAJCX0KCiAgICAJCS8vIEF2b2lkIHRoZSBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5KSBzaG9ydGN1dCwgd2hpY2gKICAgIAkJLy8gdGhyb3dzIGEgIm1heGltdW0gY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkIiBlcnJvciBmb3IgbGFyZ2UgYXJyYXlzLgoKICAgIAkJdmFyIHMgPSAnJzsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgaWwgPSBhcnJheS5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQkvLyBJbXBsaWNpdGx5IGFzc3VtZXMgbGl0dGxlLWVuZGlhbi4KICAgIAkJCXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZSggYXJyYXlbIGkgXSApOwoKICAgIAkJfQoKICAgIAkJdHJ5IHsKCiAgICAJCQkvLyBtZXJnZXMgbXVsdGktYnl0ZSB1dGYtOCBjaGFyYWN0ZXJzLgoKICAgIAkJCXJldHVybiBkZWNvZGVVUklDb21wb25lbnQoIGVzY2FwZSggcyApICk7CgogICAgCQl9IGNhdGNoICggZSApIHsgLy8gc2VlICMxNjM1OAoKICAgIAkJCXJldHVybiBzOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAlleHRyYWN0VXJsQmFzZTogZnVuY3Rpb24gKCB1cmwgKSB7CgogICAgCQl2YXIgaW5kZXggPSB1cmwubGFzdEluZGV4T2YoICcvJyApOwoKICAgIAkJaWYgKCBpbmRleCA9PT0gLSAxICkgcmV0dXJuICcuLyc7CgogICAgCQlyZXR1cm4gdXJsLnN1YnN0ciggMCwgaW5kZXggKyAxICk7CgogICAgCX0KCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBiZW5hYWRhbXMgLyBodHRwczovL3R3aXR0ZXIuY29tL2Jlbl9hX2FkYW1zCiAgICAgKi8KCiAgICBmdW5jdGlvbiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSgpIHsKCiAgICAJQnVmZmVyR2VvbWV0cnkuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnknOwogICAgCXRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSB1bmRlZmluZWQ7CgogICAgfQoKICAgIEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeSwKCiAgICAJaXNJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogdHJ1ZSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQlCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJCXRoaXMubWF4SW5zdGFuY2VkQ291bnQgPSBzb3VyY2UubWF4SW5zdGFuY2VkQ291bnQ7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY2xvbmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBuZXcgdGhpcy5jb25zdHJ1Y3RvcigpLmNvcHkoIHRoaXMgKTsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZGF0YSA9IEJ1ZmZlckdlb21ldHJ5LnByb3RvdHlwZS50b0pTT04uY2FsbCggdGhpcyApOwoKICAgIAkJZGF0YS5tYXhJbnN0YW5jZWRDb3VudCA9IHRoaXMubWF4SW5zdGFuY2VkQ291bnQ7CgogICAgCQlkYXRhLmlzSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnkgPSB0cnVlOwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGJlbmFhZGFtcyAvIGh0dHBzOi8vdHdpdHRlci5jb20vYmVuX2FfYWRhbXMKICAgICAqLwoKICAgIGZ1bmN0aW9uIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplLCBub3JtYWxpemVkLCBtZXNoUGVyQXR0cmlidXRlICkgewoKICAgIAlpZiAoIHR5cGVvZiAoIG5vcm1hbGl6ZWQgKSA9PT0gJ251bWJlcicgKSB7CgogICAgCQltZXNoUGVyQXR0cmlidXRlID0gbm9ybWFsaXplZDsKCiAgICAJCW5vcm1hbGl6ZWQgPSBmYWxzZTsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5JbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IFRoZSBjb25zdHJ1Y3RvciBub3cgZXhwZWN0cyBub3JtYWxpemVkIGFzIHRoZSB0aGlyZCBhcmd1bWVudC4nICk7CgogICAgCX0KCiAgICAJQnVmZmVyQXR0cmlidXRlLmNhbGwoIHRoaXMsIGFycmF5LCBpdGVtU2l6ZSwgbm9ybWFsaXplZCApOwoKICAgIAl0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBtZXNoUGVyQXR0cmlidXRlIHx8IDE7CgogICAgfQoKICAgIEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwKCiAgICAJaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJQnVmZmVyQXR0cmlidXRlLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAkJdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gc291cmNlLm1lc2hQZXJBdHRyaWJ1dGU7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoKQl7CgogICAgCQl2YXIgZGF0YSA9IEJ1ZmZlckF0dHJpYnV0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoIHRoaXMgKTsKCiAgICAJCWRhdGEubWVzaFBlckF0dHJpYnV0ZSA9IHRoaXMubWVzaFBlckF0dHJpYnV0ZTsKCiAgICAJCWRhdGEuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPSB0cnVlOwoKICAgIAkJcmV0dXJuIGRhdGE7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gQnVmZmVyR2VvbWV0cnlMb2FkZXIoIG1hbmFnZXIgKSB7CgogICAgCUxvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7CgogICAgfQoKICAgIEJ1ZmZlckdlb21ldHJ5TG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQnVmZmVyR2VvbWV0cnlMb2FkZXIsCgogICAgCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgogICAgCQl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAkJdmFyIGxvYWRlciA9IG5ldyBGaWxlTG9hZGVyKCBzY29wZS5tYW5hZ2VyICk7CiAgICAJCWxvYWRlci5zZXRQYXRoKCBzY29wZS5wYXRoICk7CiAgICAJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKCiAgICAJCQlvbkxvYWQoIHNjb3BlLnBhcnNlKCBKU09OLnBhcnNlKCB0ZXh0ICkgKSApOwoKICAgIAkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKICAgIAl9LAoKICAgIAlwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgewoKICAgIAkJdmFyIGdlb21ldHJ5ID0ganNvbi5pc0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5ID8gbmV3IEluc3RhbmNlZEJ1ZmZlckdlb21ldHJ5KCkgOiBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCiAgICAJCXZhciBpbmRleCA9IGpzb24uZGF0YS5pbmRleDsKCiAgICAJCWlmICggaW5kZXggIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl2YXIgdHlwZWRBcnJheSA9IG5ldyBUWVBFRF9BUlJBWVNbIGluZGV4LnR5cGUgXSggaW5kZXguYXJyYXkgKTsKICAgIAkJCWdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCAxICkgKTsKCiAgICAJCX0KCiAgICAJCXZhciBhdHRyaWJ1dGVzID0ganNvbi5kYXRhLmF0dHJpYnV0ZXM7CgogICAgCQlmb3IgKCB2YXIga2V5IGluIGF0dHJpYnV0ZXMgKSB7CgogICAgCQkJdmFyIGF0dHJpYnV0ZSA9IGF0dHJpYnV0ZXNbIGtleSBdOwogICAgCQkJdmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBhdHRyaWJ1dGUudHlwZSBdKCBhdHRyaWJ1dGUuYXJyYXkgKTsKICAgIAkJCXZhciBidWZmZXJBdHRyaWJ1dGVDb25zdHIgPSBhdHRyaWJ1dGUuaXNJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgPyBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGUgOiBCdWZmZXJBdHRyaWJ1dGU7CiAgICAJCQl2YXIgYnVmZmVyQXR0cmlidXRlID0gbmV3IGJ1ZmZlckF0dHJpYnV0ZUNvbnN0ciggdHlwZWRBcnJheSwgYXR0cmlidXRlLml0ZW1TaXplLCBhdHRyaWJ1dGUubm9ybWFsaXplZCApOwogICAgCQkJaWYgKCBhdHRyaWJ1dGUubmFtZSAhPT0gdW5kZWZpbmVkICkgYnVmZmVyQXR0cmlidXRlLm5hbWUgPSBhdHRyaWJ1dGUubmFtZTsKICAgIAkJCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSgga2V5LCBidWZmZXJBdHRyaWJ1dGUgKTsKCiAgICAJCX0KCiAgICAJCXZhciBtb3JwaEF0dHJpYnV0ZXMgPSBqc29uLmRhdGEubW9ycGhBdHRyaWJ1dGVzOwoKICAgIAkJaWYgKCBtb3JwaEF0dHJpYnV0ZXMgKSB7CgogICAgCQkJZm9yICggdmFyIGtleSBpbiBtb3JwaEF0dHJpYnV0ZXMgKSB7CgogICAgCQkJCXZhciBhdHRyaWJ1dGVBcnJheSA9IG1vcnBoQXR0cmlidXRlc1sga2V5IF07CgogICAgCQkJCXZhciBhcnJheSA9IFtdOwoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDAsIGlsID0gYXR0cmlidXRlQXJyYXkubGVuZ3RoOyBpIDwgaWw7IGkgKysgKSB7CgogICAgCQkJCQl2YXIgYXR0cmlidXRlID0gYXR0cmlidXRlQXJyYXlbIGkgXTsKICAgIAkJCQkJdmFyIHR5cGVkQXJyYXkgPSBuZXcgVFlQRURfQVJSQVlTWyBhdHRyaWJ1dGUudHlwZSBdKCBhdHRyaWJ1dGUuYXJyYXkgKTsKCiAgICAJCQkJCXZhciBidWZmZXJBdHRyaWJ1dGUgPSBuZXcgQnVmZmVyQXR0cmlidXRlKCB0eXBlZEFycmF5LCBhdHRyaWJ1dGUuaXRlbVNpemUsIGF0dHJpYnV0ZS5ub3JtYWxpemVkICk7CiAgICAJCQkJCWlmICggYXR0cmlidXRlLm5hbWUgIT09IHVuZGVmaW5lZCApIGJ1ZmZlckF0dHJpYnV0ZS5uYW1lID0gYXR0cmlidXRlLm5hbWU7CiAgICAJCQkJCWFycmF5LnB1c2goIGJ1ZmZlckF0dHJpYnV0ZSApOwoKICAgIAkJCQl9CgogICAgCQkJCWdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlc1sga2V5IF0gPSBhcnJheTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQl2YXIgZ3JvdXBzID0ganNvbi5kYXRhLmdyb3VwcyB8fCBqc29uLmRhdGEuZHJhd2NhbGxzIHx8IGpzb24uZGF0YS5vZmZzZXRzOwoKICAgIAkJaWYgKCBncm91cHMgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBncm91cHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCQl2YXIgZ3JvdXAgPSBncm91cHNbIGkgXTsKCiAgICAJCQkJZ2VvbWV0cnkuYWRkR3JvdXAoIGdyb3VwLnN0YXJ0LCBncm91cC5jb3VudCwgZ3JvdXAubWF0ZXJpYWxJbmRleCApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBib3VuZGluZ1NwaGVyZSA9IGpzb24uZGF0YS5ib3VuZGluZ1NwaGVyZTsKCiAgICAJCWlmICggYm91bmRpbmdTcGhlcmUgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQl2YXIgY2VudGVyID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCQlpZiAoIGJvdW5kaW5nU3BoZXJlLmNlbnRlciAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQljZW50ZXIuZnJvbUFycmF5KCBib3VuZGluZ1NwaGVyZS5jZW50ZXIgKTsKCiAgICAJCQl9CgogICAgCQkJZ2VvbWV0cnkuYm91bmRpbmdTcGhlcmUgPSBuZXcgU3BoZXJlKCBjZW50ZXIsIGJvdW5kaW5nU3BoZXJlLnJhZGl1cyApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBqc29uLm5hbWUgKSBnZW9tZXRyeS5uYW1lID0ganNvbi5uYW1lOwogICAgCQlpZiAoIGpzb24udXNlckRhdGEgKSBnZW9tZXRyeS51c2VyRGF0YSA9IGpzb24udXNlckRhdGE7CgogICAgCQlyZXR1cm4gZ2VvbWV0cnk7CgogICAgCX0KCiAgICB9ICk7CgogICAgdmFyIFRZUEVEX0FSUkFZUyA9IHsKICAgIAlJbnQ4QXJyYXk6IEludDhBcnJheSwKICAgIAlVaW50OEFycmF5OiBVaW50OEFycmF5LAogICAgCS8vIFdvcmthcm91bmQgZm9yIElFMTEgcHJlIEtCMjkyOTQzNy4gU2VlICMxMTQ0MAogICAgCVVpbnQ4Q2xhbXBlZEFycmF5OiB0eXBlb2YgVWludDhDbGFtcGVkQXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhDbGFtcGVkQXJyYXkgOiBVaW50OEFycmF5LAogICAgCUludDE2QXJyYXk6IEludDE2QXJyYXksCiAgICAJVWludDE2QXJyYXk6IFVpbnQxNkFycmF5LAogICAgCUludDMyQXJyYXk6IEludDMyQXJyYXksCiAgICAJVWludDMyQXJyYXk6IFVpbnQzMkFycmF5LAogICAgCUZsb2F0MzJBcnJheTogRmxvYXQzMkFycmF5LAogICAgCUZsb2F0NjRBcnJheTogRmxvYXQ2NEFycmF5CiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIE9iamVjdExvYWRlciggbWFuYWdlciApIHsKCiAgICAJTG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTsKCiAgICB9CgogICAgT2JqZWN0TG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogT2JqZWN0TG9hZGVyLAoKICAgIAlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKICAgIAkJdmFyIHNjb3BlID0gdGhpczsKCiAgICAJCXZhciBwYXRoID0gKCB0aGlzLnBhdGggPT09ICcnICkgPyBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICkgOiB0aGlzLnBhdGg7CiAgICAJCXRoaXMucmVzb3VyY2VQYXRoID0gdGhpcy5yZXNvdXJjZVBhdGggfHwgcGF0aDsKCiAgICAJCXZhciBsb2FkZXIgPSBuZXcgRmlsZUxvYWRlciggc2NvcGUubWFuYWdlciApOwogICAgCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CiAgICAJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKCiAgICAJCQl2YXIganNvbiA9IG51bGw7CgogICAgCQkJdHJ5IHsKCiAgICAJCQkJanNvbiA9IEpTT04ucGFyc2UoIHRleHQgKTsKCiAgICAJCQl9IGNhdGNoICggZXJyb3IgKSB7CgogICAgCQkJCWlmICggb25FcnJvciAhPT0gdW5kZWZpbmVkICkgb25FcnJvciggZXJyb3IgKTsKCiAgICAJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFOk9iamVjdExvYWRlcjogQ2FuXCd0IHBhcnNlICcgKyB1cmwgKyAnLicsIGVycm9yLm1lc3NhZ2UgKTsKCiAgICAJCQkJcmV0dXJuOwoKICAgIAkJCX0KCiAgICAJCQl2YXIgbWV0YWRhdGEgPSBqc29uLm1ldGFkYXRhOwoKICAgIAkJCWlmICggbWV0YWRhdGEgPT09IHVuZGVmaW5lZCB8fCBtZXRhZGF0YS50eXBlID09PSB1bmRlZmluZWQgfHwgbWV0YWRhdGEudHlwZS50b0xvd2VyQ2FzZSgpID09PSAnZ2VvbWV0cnknICkgewoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBDYW5cJ3QgbG9hZCAnICsgdXJsICk7CiAgICAJCQkJcmV0dXJuOwoKICAgIAkJCX0KCiAgICAJCQlzY29wZS5wYXJzZSgganNvbiwgb25Mb2FkICk7CgogICAgCQl9LCBvblByb2dyZXNzLCBvbkVycm9yICk7CgogICAgCX0sCgogICAgCXBhcnNlOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHsKCiAgICAJCXZhciBzaGFwZXMgPSB0aGlzLnBhcnNlU2hhcGUoIGpzb24uc2hhcGVzICk7CiAgICAJCXZhciBnZW9tZXRyaWVzID0gdGhpcy5wYXJzZUdlb21ldHJpZXMoIGpzb24uZ2VvbWV0cmllcywgc2hhcGVzICk7CgogICAgCQl2YXIgaW1hZ2VzID0gdGhpcy5wYXJzZUltYWdlcygganNvbi5pbWFnZXMsIGZ1bmN0aW9uICgpIHsKCiAgICAJCQlpZiAoIG9uTG9hZCAhPT0gdW5kZWZpbmVkICkgb25Mb2FkKCBvYmplY3QgKTsKCiAgICAJCX0gKTsKCiAgICAJCXZhciB0ZXh0dXJlcyA9IHRoaXMucGFyc2VUZXh0dXJlcygganNvbi50ZXh0dXJlcywgaW1hZ2VzICk7CiAgICAJCXZhciBtYXRlcmlhbHMgPSB0aGlzLnBhcnNlTWF0ZXJpYWxzKCBqc29uLm1hdGVyaWFscywgdGV4dHVyZXMgKTsKCiAgICAJCXZhciBvYmplY3QgPSB0aGlzLnBhcnNlT2JqZWN0KCBqc29uLm9iamVjdCwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICk7CgogICAgCQlpZiAoIGpzb24uYW5pbWF0aW9ucyApIHsKCiAgICAJCQlvYmplY3QuYW5pbWF0aW9ucyA9IHRoaXMucGFyc2VBbmltYXRpb25zKCBqc29uLmFuaW1hdGlvbnMgKTsKCiAgICAJCX0KCiAgICAJCWlmICgganNvbi5pbWFnZXMgPT09IHVuZGVmaW5lZCB8fCBqc29uLmltYWdlcy5sZW5ndGggPT09IDAgKSB7CgogICAgCQkJaWYgKCBvbkxvYWQgIT09IHVuZGVmaW5lZCApIG9uTG9hZCggb2JqZWN0ICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gb2JqZWN0OwoKICAgIAl9LAoKICAgIAlwYXJzZVNoYXBlOiBmdW5jdGlvbiAoIGpzb24gKSB7CgogICAgCQl2YXIgc2hhcGVzID0ge307CgogICAgCQlpZiAoIGpzb24gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCXZhciBzaGFwZSA9IG5ldyBTaGFwZSgpLmZyb21KU09OKCBqc29uWyBpIF0gKTsKCiAgICAJCQkJc2hhcGVzWyBzaGFwZS51dWlkIF0gPSBzaGFwZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gc2hhcGVzOwoKICAgIAl9LAoKICAgIAlwYXJzZUdlb21ldHJpZXM6IGZ1bmN0aW9uICgganNvbiwgc2hhcGVzICkgewoKICAgIAkJdmFyIGdlb21ldHJpZXMgPSB7fTsKCiAgICAJCWlmICgganNvbiAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBidWZmZXJHZW9tZXRyeUxvYWRlciA9IG5ldyBCdWZmZXJHZW9tZXRyeUxvYWRlcigpOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbCA9IGpzb24ubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQkJdmFyIGdlb21ldHJ5OwogICAgCQkJCXZhciBkYXRhID0ganNvblsgaSBdOwoKICAgIAkJCQlzd2l0Y2ggKCBkYXRhLnR5cGUgKSB7CgogICAgCQkJCQljYXNlICdQbGFuZUdlb21ldHJ5JzoKICAgIAkJCQkJY2FzZSAnUGxhbmVCdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJZGF0YS53aWR0aCwKICAgIAkJCQkJCQlkYXRhLmhlaWdodCwKICAgIAkJCQkJCQlkYXRhLndpZHRoU2VnbWVudHMsCiAgICAJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cwogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ0JveEdlb21ldHJ5JzoKICAgIAkJCQkJY2FzZSAnQm94QnVmZmVyR2VvbWV0cnknOgogICAgCQkJCQljYXNlICdDdWJlR2VvbWV0cnknOiAvLyBiYWNrd2FyZHMgY29tcGF0aWJsZQoKICAgIAkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAogICAgCQkJCQkJCWRhdGEud2lkdGgsCiAgICAJCQkJCQkJZGF0YS5oZWlnaHQsCiAgICAJCQkJCQkJZGF0YS5kZXB0aCwKICAgIAkJCQkJCQlkYXRhLndpZHRoU2VnbWVudHMsCiAgICAJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cywKICAgIAkJCQkJCQlkYXRhLmRlcHRoU2VnbWVudHMKICAgIAkJCQkJCSk7CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICdDaXJjbGVHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ0NpcmNsZUJ1ZmZlckdlb21ldHJ5JzoKCiAgICAJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKICAgIAkJCQkJCQlkYXRhLnJhZGl1cywKICAgIAkJCQkJCQlkYXRhLnNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEudGhldGFTdGFydCwKICAgIAkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCiAgICAJCQkJCQkpOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnQ3lsaW5kZXJHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ0N5bGluZGVyQnVmZmVyR2VvbWV0cnknOgoKICAgIAkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAogICAgCQkJCQkJCWRhdGEucmFkaXVzVG9wLAogICAgCQkJCQkJCWRhdGEucmFkaXVzQm90dG9tLAogICAgCQkJCQkJCWRhdGEuaGVpZ2h0LAogICAgCQkJCQkJCWRhdGEucmFkaWFsU2VnbWVudHMsCiAgICAJCQkJCQkJZGF0YS5oZWlnaHRTZWdtZW50cywKICAgIAkJCQkJCQlkYXRhLm9wZW5FbmRlZCwKICAgIAkJCQkJCQlkYXRhLnRoZXRhU3RhcnQsCiAgICAJCQkJCQkJZGF0YS50aGV0YUxlbmd0aAogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ0NvbmVHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ0NvbmVCdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJZGF0YS5yYWRpdXMsCiAgICAJCQkJCQkJZGF0YS5oZWlnaHQsCiAgICAJCQkJCQkJZGF0YS5yYWRpYWxTZWdtZW50cywKICAgIAkJCQkJCQlkYXRhLmhlaWdodFNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEub3BlbkVuZGVkLAogICAgCQkJCQkJCWRhdGEudGhldGFTdGFydCwKICAgIAkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCiAgICAJCQkJCQkpOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnU3BoZXJlR2VvbWV0cnknOgogICAgCQkJCQljYXNlICdTcGhlcmVCdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJZGF0YS5yYWRpdXMsCiAgICAJCQkJCQkJZGF0YS53aWR0aFNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEuaGVpZ2h0U2VnbWVudHMsCiAgICAJCQkJCQkJZGF0YS5waGlTdGFydCwKICAgIAkJCQkJCQlkYXRhLnBoaUxlbmd0aCwKICAgIAkJCQkJCQlkYXRhLnRoZXRhU3RhcnQsCiAgICAJCQkJCQkJZGF0YS50aGV0YUxlbmd0aAogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ0RvZGVjYWhlZHJvbkdlb21ldHJ5JzoKICAgIAkJCQkJY2FzZSAnRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnknOgogICAgCQkJCQljYXNlICdJY29zYWhlZHJvbkdlb21ldHJ5JzoKICAgIAkJCQkJY2FzZSAnSWNvc2FoZWRyb25CdWZmZXJHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ09jdGFoZWRyb25HZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ09jdGFoZWRyb25CdWZmZXJHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ1RldHJhaGVkcm9uR2VvbWV0cnknOgogICAgCQkJCQljYXNlICdUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5JzoKCiAgICAJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKICAgIAkJCQkJCQlkYXRhLnJhZGl1cywKICAgIAkJCQkJCQlkYXRhLmRldGFpbAogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ1JpbmdHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ1JpbmdCdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJZGF0YS5pbm5lclJhZGl1cywKICAgIAkJCQkJCQlkYXRhLm91dGVyUmFkaXVzLAogICAgCQkJCQkJCWRhdGEudGhldGFTZWdtZW50cywKICAgIAkJCQkJCQlkYXRhLnBoaVNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEudGhldGFTdGFydCwKICAgIAkJCQkJCQlkYXRhLnRoZXRhTGVuZ3RoCiAgICAJCQkJCQkpOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnVG9ydXNHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ1RvcnVzQnVmZmVyR2VvbWV0cnknOgoKICAgIAkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAogICAgCQkJCQkJCWRhdGEucmFkaXVzLAogICAgCQkJCQkJCWRhdGEudHViZSwKICAgIAkJCQkJCQlkYXRhLnJhZGlhbFNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEudHVidWxhclNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEuYXJjCiAgICAJCQkJCQkpOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnVG9ydXNLbm90R2VvbWV0cnknOgogICAgCQkJCQljYXNlICdUb3J1c0tub3RCdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJZGF0YS5yYWRpdXMsCiAgICAJCQkJCQkJZGF0YS50dWJlLAogICAgCQkJCQkJCWRhdGEudHVidWxhclNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEucmFkaWFsU2VnbWVudHMsCiAgICAJCQkJCQkJZGF0YS5wLAogICAgCQkJCQkJCWRhdGEucQogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ1R1YmVHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ1R1YmVCdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJLy8gVGhpcyBvbmx5IHdvcmtzIGZvciBidWlsdC1pbiBjdXJ2ZXMgKGUuZy4gQ2F0bXVsbFJvbUN1cnZlMykuCiAgICAJCQkJCQkvLyBVc2VyIGRlZmluZWQgY3VydmVzIG9yIGluc3RhbmNlcyBvZiBDdXJ2ZVBhdGggd2lsbCBub3QgYmUgZGVzZXJpYWxpemVkLgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJbmV3IEN1cnZlc1sgZGF0YS5wYXRoLnR5cGUgXSgpLmZyb21KU09OKCBkYXRhLnBhdGggKSwKICAgIAkJCQkJCQlkYXRhLnR1YnVsYXJTZWdtZW50cywKICAgIAkJCQkJCQlkYXRhLnJhZGl1cywKICAgIAkJCQkJCQlkYXRhLnJhZGlhbFNlZ21lbnRzLAogICAgCQkJCQkJCWRhdGEuY2xvc2VkCiAgICAJCQkJCQkpOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnTGF0aGVHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ0xhdGhlQnVmZmVyR2VvbWV0cnknOgoKICAgIAkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAogICAgCQkJCQkJCWRhdGEucG9pbnRzLAogICAgCQkJCQkJCWRhdGEuc2VnbWVudHMsCiAgICAJCQkJCQkJZGF0YS5waGlTdGFydCwKICAgIAkJCQkJCQlkYXRhLnBoaUxlbmd0aAogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgJ1BvbHloZWRyb25HZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ1BvbHloZWRyb25CdWZmZXJHZW9tZXRyeSc6CgogICAgCQkJCQkJZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cmllc1sgZGF0YS50eXBlIF0oCiAgICAJCQkJCQkJZGF0YS52ZXJ0aWNlcywKICAgIAkJCQkJCQlkYXRhLmluZGljZXMsCiAgICAJCQkJCQkJZGF0YS5yYWRpdXMsCiAgICAJCQkJCQkJZGF0YS5kZXRhaWxzCiAgICAJCQkJCQkpOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSAnU2hhcGVHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ1NoYXBlQnVmZmVyR2VvbWV0cnknOgoKICAgIAkJCQkJCXZhciBnZW9tZXRyeVNoYXBlcyA9IFtdOwoKICAgIAkJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJCQkJdmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07CgogICAgCQkJCQkJCWdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJCWdlb21ldHJ5ID0gbmV3IEdlb21ldHJpZXNbIGRhdGEudHlwZSBdKAogICAgCQkJCQkJCWdlb21ldHJ5U2hhcGVzLAogICAgCQkJCQkJCWRhdGEuY3VydmVTZWdtZW50cwogICAgCQkJCQkJKTsKCiAgICAJCQkJCQlicmVhazsKCgogICAgCQkJCQljYXNlICdFeHRydWRlR2VvbWV0cnknOgogICAgCQkJCQljYXNlICdFeHRydWRlQnVmZmVyR2VvbWV0cnknOgoKICAgIAkJCQkJCXZhciBnZW9tZXRyeVNoYXBlcyA9IFtdOwoKICAgIAkJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSBkYXRhLnNoYXBlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJCQkJdmFyIHNoYXBlID0gc2hhcGVzWyBkYXRhLnNoYXBlc1sgaiBdIF07CgogICAgCQkJCQkJCWdlb21ldHJ5U2hhcGVzLnB1c2goIHNoYXBlICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJCXZhciBleHRydWRlUGF0aCA9IGRhdGEub3B0aW9ucy5leHRydWRlUGF0aDsKCiAgICAJCQkJCQlpZiAoIGV4dHJ1ZGVQYXRoICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJCWRhdGEub3B0aW9ucy5leHRydWRlUGF0aCA9IG5ldyBDdXJ2ZXNbIGV4dHJ1ZGVQYXRoLnR5cGUgXSgpLmZyb21KU09OKCBleHRydWRlUGF0aCApOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCQlnZW9tZXRyeSA9IG5ldyBHZW9tZXRyaWVzWyBkYXRhLnR5cGUgXSgKICAgIAkJCQkJCQlnZW9tZXRyeVNoYXBlcywKICAgIAkJCQkJCQlkYXRhLm9wdGlvbnMKICAgIAkJCQkJCSk7CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICdCdWZmZXJHZW9tZXRyeSc6CiAgICAJCQkJCWNhc2UgJ0luc3RhbmNlZEJ1ZmZlckdlb21ldHJ5JzoKCiAgICAJCQkJCQlnZW9tZXRyeSA9IGJ1ZmZlckdlb21ldHJ5TG9hZGVyLnBhcnNlKCBkYXRhICk7CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlICdHZW9tZXRyeSc6CgogICAgCQkJCQkJaWYgKCAnVEhSRUUnIGluIHdpbmRvdyAmJiAnTGVnYWN5SlNPTkxvYWRlcicgaW4gVEhSRUUgKSB7CgogICAgCQkJCQkJCXZhciBnZW9tZXRyeUxvYWRlciA9IG5ldyBUSFJFRS5MZWdhY3lKU09OTG9hZGVyKCk7CiAgICAJCQkJCQkJZ2VvbWV0cnkgPSBnZW9tZXRyeUxvYWRlci5wYXJzZSggZGF0YSwgdGhpcy5yZXNvdXJjZVBhdGggKS5nZW9tZXRyeTsKCgogICAgCQkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLk9iamVjdExvYWRlcjogWW91IGhhdmUgdG8gaW1wb3J0IExlZ2FjeUpTT05Mb2FkZXIgaW4gb3JkZXIgbG9hZCBnZW9tZXRyeSBkYXRhIG9mIHR5cGUgIkdlb21ldHJ5Ii4nICk7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJZGVmYXVsdDoKCiAgICAJCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuc3VwcG9ydGVkIGdlb21ldHJ5IHR5cGUgIicgKyBkYXRhLnR5cGUgKyAnIicgKTsKCiAgICAJCQkJCQljb250aW51ZTsKCiAgICAJCQkJfQoKICAgIAkJCQlnZW9tZXRyeS51dWlkID0gZGF0YS51dWlkOwoKICAgIAkJCQlpZiAoIGRhdGEubmFtZSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkubmFtZSA9IGRhdGEubmFtZTsKICAgIAkJCQlpZiAoIGdlb21ldHJ5LmlzQnVmZmVyR2VvbWV0cnkgPT09IHRydWUgJiYgZGF0YS51c2VyRGF0YSAhPT0gdW5kZWZpbmVkICkgZ2VvbWV0cnkudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhOwoKICAgIAkJCQlnZW9tZXRyaWVzWyBkYXRhLnV1aWQgXSA9IGdlb21ldHJ5OwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiBnZW9tZXRyaWVzOwoKICAgIAl9LAoKICAgIAlwYXJzZU1hdGVyaWFsczogZnVuY3Rpb24gKCBqc29uLCB0ZXh0dXJlcyApIHsKCiAgICAJCXZhciBjYWNoZSA9IHt9OyAvLyBNdWx0aU1hdGVyaWFsCiAgICAJCXZhciBtYXRlcmlhbHMgPSB7fTsKCiAgICAJCWlmICgganNvbiAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBsb2FkZXIgPSBuZXcgTWF0ZXJpYWxMb2FkZXIoKTsKICAgIAkJCWxvYWRlci5zZXRUZXh0dXJlcyggdGV4dHVyZXMgKTsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBqc29uLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCXZhciBkYXRhID0ganNvblsgaSBdOwoKICAgIAkJCQlpZiAoIGRhdGEudHlwZSA9PT0gJ011bHRpTWF0ZXJpYWwnICkgewoKICAgIAkJCQkJLy8gRGVwcmVjYXRlZAoKICAgIAkJCQkJdmFyIGFycmF5ID0gW107CgogICAgCQkJCQlmb3IgKCB2YXIgaiA9IDA7IGogPCBkYXRhLm1hdGVyaWFscy5sZW5ndGg7IGogKysgKSB7CgogICAgCQkJCQkJdmFyIG1hdGVyaWFsID0gZGF0YS5tYXRlcmlhbHNbIGogXTsKCiAgICAJCQkJCQlpZiAoIGNhY2hlWyBtYXRlcmlhbC51dWlkIF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCQkJY2FjaGVbIG1hdGVyaWFsLnV1aWQgXSA9IGxvYWRlci5wYXJzZSggbWF0ZXJpYWwgKTsKCiAgICAJCQkJCQl9CgogICAgCQkJCQkJYXJyYXkucHVzaCggY2FjaGVbIG1hdGVyaWFsLnV1aWQgXSApOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJbWF0ZXJpYWxzWyBkYXRhLnV1aWQgXSA9IGFycmF5OwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJaWYgKCBjYWNoZVsgZGF0YS51dWlkIF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCQljYWNoZVsgZGF0YS51dWlkIF0gPSBsb2FkZXIucGFyc2UoIGRhdGEgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCW1hdGVyaWFsc1sgZGF0YS51dWlkIF0gPSBjYWNoZVsgZGF0YS51dWlkIF07CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gbWF0ZXJpYWxzOwoKICAgIAl9LAoKICAgIAlwYXJzZUFuaW1hdGlvbnM6IGZ1bmN0aW9uICgganNvbiApIHsKCiAgICAJCXZhciBhbmltYXRpb25zID0gW107CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBqc29uLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YXIgZGF0YSA9IGpzb25bIGkgXTsKCiAgICAJCQl2YXIgY2xpcCA9IEFuaW1hdGlvbkNsaXAucGFyc2UoIGRhdGEgKTsKCiAgICAJCQlpZiAoIGRhdGEudXVpZCAhPT0gdW5kZWZpbmVkICkgY2xpcC51dWlkID0gZGF0YS51dWlkOwoKICAgIAkJCWFuaW1hdGlvbnMucHVzaCggY2xpcCApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGFuaW1hdGlvbnM7CgogICAgCX0sCgogICAgCXBhcnNlSW1hZ2VzOiBmdW5jdGlvbiAoIGpzb24sIG9uTG9hZCApIHsKCiAgICAJCXZhciBzY29wZSA9IHRoaXM7CiAgICAJCXZhciBpbWFnZXMgPSB7fTsKCiAgICAJCWZ1bmN0aW9uIGxvYWRJbWFnZSggdXJsICkgewoKICAgIAkJCXNjb3BlLm1hbmFnZXIuaXRlbVN0YXJ0KCB1cmwgKTsKCiAgICAJCQlyZXR1cm4gbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCkgewoKICAgIAkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKICAgIAkJCX0sIHVuZGVmaW5lZCwgZnVuY3Rpb24gKCkgewoKICAgIAkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CiAgICAJCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCiAgICAJCQl9ICk7CgogICAgCQl9CgogICAgCQlpZiAoIGpzb24gIT09IHVuZGVmaW5lZCAmJiBqc29uLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJdmFyIG1hbmFnZXIgPSBuZXcgTG9hZGluZ01hbmFnZXIoIG9uTG9hZCApOwoKICAgIAkJCXZhciBsb2FkZXIgPSBuZXcgSW1hZ2VMb2FkZXIoIG1hbmFnZXIgKTsKICAgIAkJCWxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApOwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgaWwgPSBqc29uLmxlbmd0aDsgaSA8IGlsOyBpICsrICkgewoKICAgIAkJCQl2YXIgaW1hZ2UgPSBqc29uWyBpIF07CiAgICAJCQkJdmFyIHVybCA9IGltYWdlLnVybDsKCiAgICAJCQkJaWYgKCBBcnJheS5pc0FycmF5KCB1cmwgKSApIHsKCiAgICAJCQkJCS8vIGxvYWQgYXJyYXkgb2YgaW1hZ2VzIGUuZyBDdWJlVGV4dHVyZQoKICAgIAkJCQkJaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBbXTsKCiAgICAJCQkJCWZvciAoIHZhciBqID0gMCwgamwgPSB1cmwubGVuZ3RoOyBqIDwgamw7IGogKysgKSB7CgogICAgCQkJCQkJdmFyIGN1cnJlbnRVcmwgPSB1cmxbIGogXTsKCiAgICAJCQkJCQl2YXIgcGF0aCA9IC9eKFwvXC8pfChbYS16XSs6KFwvXC8pPykvaS50ZXN0KCBjdXJyZW50VXJsICkgPyBjdXJyZW50VXJsIDogc2NvcGUucmVzb3VyY2VQYXRoICsgY3VycmVudFVybDsKCiAgICAJCQkJCQlpbWFnZXNbIGltYWdlLnV1aWQgXS5wdXNoKCBsb2FkSW1hZ2UoIHBhdGggKSApOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJLy8gbG9hZCBzaW5nbGUgaW1hZ2UKCiAgICAJCQkJCXZhciBwYXRoID0gL14oXC9cLyl8KFthLXpdKzooXC9cLyk/KS9pLnRlc3QoIGltYWdlLnVybCApID8gaW1hZ2UudXJsIDogc2NvcGUucmVzb3VyY2VQYXRoICsgaW1hZ2UudXJsOwoKICAgIAkJCQkJaW1hZ2VzWyBpbWFnZS51dWlkIF0gPSBsb2FkSW1hZ2UoIHBhdGggKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiBpbWFnZXM7CgogICAgCX0sCgogICAgCXBhcnNlVGV4dHVyZXM6IGZ1bmN0aW9uICgganNvbiwgaW1hZ2VzICkgewoKICAgIAkJZnVuY3Rpb24gcGFyc2VDb25zdGFudCggdmFsdWUsIHR5cGUgKSB7CgogICAgCQkJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICkgcmV0dXJuIHZhbHVlOwoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlci5wYXJzZVRleHR1cmU6IENvbnN0YW50IHNob3VsZCBiZSBpbiBudW1lcmljIGZvcm0uJywgdmFsdWUgKTsKCiAgICAJCQlyZXR1cm4gdHlwZVsgdmFsdWUgXTsKCiAgICAJCX0KCiAgICAJCXZhciB0ZXh0dXJlcyA9IHt9OwoKICAgIAkJaWYgKCBqc29uICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBsID0ganNvbi5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQl2YXIgZGF0YSA9IGpzb25bIGkgXTsKCiAgICAJCQkJaWYgKCBkYXRhLmltYWdlID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IE5vICJpbWFnZSIgc3BlY2lmaWVkIGZvcicsIGRhdGEudXVpZCApOwoKICAgIAkJCQl9CgogICAgCQkJCWlmICggaW1hZ2VzWyBkYXRhLmltYWdlIF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGltYWdlJywgZGF0YS5pbWFnZSApOwoKICAgIAkJCQl9CgogICAgCQkJCXZhciB0ZXh0dXJlOwoKICAgIAkJCQlpZiAoIEFycmF5LmlzQXJyYXkoIGltYWdlc1sgZGF0YS5pbWFnZSBdICkgKSB7CgogICAgCQkJCQl0ZXh0dXJlID0gbmV3IEN1YmVUZXh0dXJlKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJdGV4dHVyZSA9IG5ldyBUZXh0dXJlKCBpbWFnZXNbIGRhdGEuaW1hZ2UgXSApOwoKICAgIAkJCQl9CgogICAgCQkJCXRleHR1cmUubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJCQl0ZXh0dXJlLnV1aWQgPSBkYXRhLnV1aWQ7CgogICAgCQkJCWlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm5hbWUgPSBkYXRhLm5hbWU7CgogICAgCQkJCWlmICggZGF0YS5tYXBwaW5nICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1hcHBpbmcgPSBwYXJzZUNvbnN0YW50KCBkYXRhLm1hcHBpbmcsIFRFWFRVUkVfTUFQUElORyApOwoKICAgIAkJCQlpZiAoIGRhdGEub2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm9mZnNldC5mcm9tQXJyYXkoIGRhdGEub2Zmc2V0ICk7CiAgICAJCQkJaWYgKCBkYXRhLnJlcGVhdCAhPT0gdW5kZWZpbmVkICkgdGV4dHVyZS5yZXBlYXQuZnJvbUFycmF5KCBkYXRhLnJlcGVhdCApOwogICAgCQkJCWlmICggZGF0YS5jZW50ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuY2VudGVyLmZyb21BcnJheSggZGF0YS5jZW50ZXIgKTsKICAgIAkJCQlpZiAoIGRhdGEucm90YXRpb24gIT09IHVuZGVmaW5lZCApIHRleHR1cmUucm90YXRpb24gPSBkYXRhLnJvdGF0aW9uOwoKICAgIAkJCQlpZiAoIGRhdGEud3JhcCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJdGV4dHVyZS53cmFwUyA9IHBhcnNlQ29uc3RhbnQoIGRhdGEud3JhcFsgMCBdLCBURVhUVVJFX1dSQVBQSU5HICk7CiAgICAJCQkJCXRleHR1cmUud3JhcFQgPSBwYXJzZUNvbnN0YW50KCBkYXRhLndyYXBbIDEgXSwgVEVYVFVSRV9XUkFQUElORyApOwoKICAgIAkJCQl9CgogICAgCQkJCWlmICggZGF0YS5mb3JtYXQgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZm9ybWF0ID0gZGF0YS5mb3JtYXQ7CiAgICAJCQkJaWYgKCBkYXRhLnR5cGUgIT09IHVuZGVmaW5lZCApIHRleHR1cmUudHlwZSA9IGRhdGEudHlwZTsKICAgIAkJCQlpZiAoIGRhdGEuZW5jb2RpbmcgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuZW5jb2RpbmcgPSBkYXRhLmVuY29kaW5nOwoKICAgIAkJCQlpZiAoIGRhdGEubWluRmlsdGVyICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLm1pbkZpbHRlciA9IHBhcnNlQ29uc3RhbnQoIGRhdGEubWluRmlsdGVyLCBURVhUVVJFX0ZJTFRFUiApOwogICAgCQkJCWlmICggZGF0YS5tYWdGaWx0ZXIgIT09IHVuZGVmaW5lZCApIHRleHR1cmUubWFnRmlsdGVyID0gcGFyc2VDb25zdGFudCggZGF0YS5tYWdGaWx0ZXIsIFRFWFRVUkVfRklMVEVSICk7CiAgICAJCQkJaWYgKCBkYXRhLmFuaXNvdHJvcHkgIT09IHVuZGVmaW5lZCApIHRleHR1cmUuYW5pc290cm9weSA9IGRhdGEuYW5pc290cm9weTsKCiAgICAJCQkJaWYgKCBkYXRhLmZsaXBZICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLmZsaXBZID0gZGF0YS5mbGlwWTsKCiAgICAJCQkJaWYgKCBkYXRhLnByZW11bHRpcGx5QWxwaGEgIT09IHVuZGVmaW5lZCApIHRleHR1cmUucHJlbXVsdGlwbHlBbHBoYSA9IGRhdGEucHJlbXVsdGlwbHlBbHBoYTsKICAgIAkJCQlpZiAoIGRhdGEudW5wYWNrQWxpZ25tZW50ICE9PSB1bmRlZmluZWQgKSB0ZXh0dXJlLnVucGFja0FsaWdubWVudCA9IGRhdGEudW5wYWNrQWxpZ25tZW50OwoKICAgIAkJCQl0ZXh0dXJlc1sgZGF0YS51dWlkIF0gPSB0ZXh0dXJlOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiB0ZXh0dXJlczsKCiAgICAJfSwKCiAgICAJcGFyc2VPYmplY3Q6IGZ1bmN0aW9uICggZGF0YSwgZ2VvbWV0cmllcywgbWF0ZXJpYWxzICkgewoKICAgIAkJdmFyIG9iamVjdDsKCiAgICAJCWZ1bmN0aW9uIGdldEdlb21ldHJ5KCBuYW1lICkgewoKICAgIAkJCWlmICggZ2VvbWV0cmllc1sgbmFtZSBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdExvYWRlcjogVW5kZWZpbmVkIGdlb21ldHJ5JywgbmFtZSApOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gZ2VvbWV0cmllc1sgbmFtZSBdOwoKICAgIAkJfQoKICAgIAkJZnVuY3Rpb24gZ2V0TWF0ZXJpYWwoIG5hbWUgKSB7CgogICAgCQkJaWYgKCBuYW1lID09PSB1bmRlZmluZWQgKSByZXR1cm4gdW5kZWZpbmVkOwoKICAgIAkJCWlmICggQXJyYXkuaXNBcnJheSggbmFtZSApICkgewoKICAgIAkJCQl2YXIgYXJyYXkgPSBbXTsKCiAgICAJCQkJZm9yICggdmFyIGkgPSAwLCBsID0gbmFtZS5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQkJdmFyIHV1aWQgPSBuYW1lWyBpIF07CgogICAgCQkJCQlpZiAoIG1hdGVyaWFsc1sgdXVpZCBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0TG9hZGVyOiBVbmRlZmluZWQgbWF0ZXJpYWwnLCB1dWlkICk7CgogICAgCQkJCQl9CgogICAgCQkJCQlhcnJheS5wdXNoKCBtYXRlcmlhbHNbIHV1aWQgXSApOwoKICAgIAkJCQl9CgogICAgCQkJCXJldHVybiBhcnJheTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCBtYXRlcmlhbHNbIG5hbWUgXSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IFVuZGVmaW5lZCBtYXRlcmlhbCcsIG5hbWUgKTsKCiAgICAJCQl9CgogICAgCQkJcmV0dXJuIG1hdGVyaWFsc1sgbmFtZSBdOwoKICAgIAkJfQoKICAgIAkJc3dpdGNoICggZGF0YS50eXBlICkgewoKICAgIAkJCWNhc2UgJ1NjZW5lJzoKCiAgICAJCQkJb2JqZWN0ID0gbmV3IFNjZW5lKCk7CgogICAgCQkJCWlmICggZGF0YS5iYWNrZ3JvdW5kICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQlpZiAoIE51bWJlci5pc0ludGVnZXIoIGRhdGEuYmFja2dyb3VuZCApICkgewoKICAgIAkJCQkJCW9iamVjdC5iYWNrZ3JvdW5kID0gbmV3IENvbG9yJDcoIGRhdGEuYmFja2dyb3VuZCApOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9CgogICAgCQkJCWlmICggZGF0YS5mb2cgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCWlmICggZGF0YS5mb2cudHlwZSA9PT0gJ0ZvZycgKSB7CgogICAgCQkJCQkJb2JqZWN0LmZvZyA9IG5ldyBGb2coIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5uZWFyLCBkYXRhLmZvZy5mYXIgKTsKCiAgICAJCQkJCX0gZWxzZSBpZiAoIGRhdGEuZm9nLnR5cGUgPT09ICdGb2dFeHAyJyApIHsKCiAgICAJCQkJCQlvYmplY3QuZm9nID0gbmV3IEZvZ0V4cDIoIGRhdGEuZm9nLmNvbG9yLCBkYXRhLmZvZy5kZW5zaXR5ICk7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnUGVyc3BlY3RpdmVDYW1lcmEnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgUGVyc3BlY3RpdmVDYW1lcmEoIGRhdGEuZm92LCBkYXRhLmFzcGVjdCwgZGF0YS5uZWFyLCBkYXRhLmZhciApOwoKICAgIAkJCQlpZiAoIGRhdGEuZm9jdXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5mb2N1cyA9IGRhdGEuZm9jdXM7CiAgICAJCQkJaWYgKCBkYXRhLnpvb20gIT09IHVuZGVmaW5lZCApIG9iamVjdC56b29tID0gZGF0YS56b29tOwogICAgCQkJCWlmICggZGF0YS5maWxtR2F1Z2UgIT09IHVuZGVmaW5lZCApIG9iamVjdC5maWxtR2F1Z2UgPSBkYXRhLmZpbG1HYXVnZTsKICAgIAkJCQlpZiAoIGRhdGEuZmlsbU9mZnNldCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZpbG1PZmZzZXQgPSBkYXRhLmZpbG1PZmZzZXQ7CiAgICAJCQkJaWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlICdPcnRob2dyYXBoaWNDYW1lcmEnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgT3J0aG9ncmFwaGljQ2FtZXJhKCBkYXRhLmxlZnQsIGRhdGEucmlnaHQsIGRhdGEudG9wLCBkYXRhLmJvdHRvbSwgZGF0YS5uZWFyLCBkYXRhLmZhciApOwoKICAgIAkJCQlpZiAoIGRhdGEuem9vbSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lnpvb20gPSBkYXRhLnpvb207CiAgICAJCQkJaWYgKCBkYXRhLnZpZXcgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aWV3ID0gT2JqZWN0LmFzc2lnbigge30sIGRhdGEudmlldyApOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlICdBbWJpZW50TGlnaHQnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgQW1iaWVudExpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSApOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlICdEaXJlY3Rpb25hbExpZ2h0JzoKCiAgICAJCQkJb2JqZWN0ID0gbmV3IERpcmVjdGlvbmFsTGlnaHQoIGRhdGEuY29sb3IsIGRhdGEuaW50ZW5zaXR5ICk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgJ1BvaW50TGlnaHQnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgUG9pbnRMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuZGVjYXkgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnUmVjdEFyZWFMaWdodCc6CgogICAgCQkJCW9iamVjdCA9IG5ldyBSZWN0QXJlYUxpZ2h0KCBkYXRhLmNvbG9yLCBkYXRhLmludGVuc2l0eSwgZGF0YS53aWR0aCwgZGF0YS5oZWlnaHQgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnU3BvdExpZ2h0JzoKCiAgICAJCQkJb2JqZWN0ID0gbmV3IFNwb3RMaWdodCggZGF0YS5jb2xvciwgZGF0YS5pbnRlbnNpdHksIGRhdGEuZGlzdGFuY2UsIGRhdGEuYW5nbGUsIGRhdGEucGVudW1icmEsIGRhdGEuZGVjYXkgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnSGVtaXNwaGVyZUxpZ2h0JzoKCiAgICAJCQkJb2JqZWN0ID0gbmV3IEhlbWlzcGhlcmVMaWdodCggZGF0YS5jb2xvciwgZGF0YS5ncm91bmRDb2xvciwgZGF0YS5pbnRlbnNpdHkgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnU2tpbm5lZE1lc2gnOgoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXIucGFyc2VPYmplY3QoKSBkb2VzIG5vdCBzdXBwb3J0IFNraW5uZWRNZXNoIHlldC4nICk7CgogICAgCQkJY2FzZSAnTWVzaCc6CgogICAgCQkJCXZhciBnZW9tZXRyeSA9IGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICk7CiAgICAJCQkJdmFyIG1hdGVyaWFsID0gZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKTsKCiAgICAJCQkJaWYgKCBnZW9tZXRyeS5ib25lcyAmJiBnZW9tZXRyeS5ib25lcy5sZW5ndGggPiAwICkgewoKICAgIAkJCQkJb2JqZWN0ID0gbmV3IFNraW5uZWRNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCW9iamVjdCA9IG5ldyBNZXNoKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIGRhdGEuZHJhd01vZGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zZXREcmF3TW9kZSggZGF0YS5kcmF3TW9kZSApOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlICdMT0QnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgTE9EKCk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgJ0xpbmUnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgTGluZSggZ2V0R2VvbWV0cnkoIGRhdGEuZ2VvbWV0cnkgKSwgZ2V0TWF0ZXJpYWwoIGRhdGEubWF0ZXJpYWwgKSwgZGF0YS5tb2RlICk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgJ0xpbmVMb29wJzoKCiAgICAJCQkJb2JqZWN0ID0gbmV3IExpbmVMb29wKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgJ0xpbmVTZWdtZW50cyc6CgogICAgCQkJCW9iamVjdCA9IG5ldyBMaW5lU2VnbWVudHMoIGdldEdlb21ldHJ5KCBkYXRhLmdlb21ldHJ5ICksIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnUG9pbnRDbG91ZCc6CiAgICAJCQljYXNlICdQb2ludHMnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgUG9pbnRzKCBnZXRHZW9tZXRyeSggZGF0YS5nZW9tZXRyeSApLCBnZXRNYXRlcmlhbCggZGF0YS5tYXRlcmlhbCApICk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgJ1Nwcml0ZSc6CgogICAgCQkJCW9iamVjdCA9IG5ldyBTcHJpdGUoIGdldE1hdGVyaWFsKCBkYXRhLm1hdGVyaWFsICkgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSAnR3JvdXAnOgoKICAgIAkJCQlvYmplY3QgPSBuZXcgR3JvdXAoKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJZGVmYXVsdDoKCiAgICAJCQkJb2JqZWN0ID0gbmV3IE9iamVjdDNEKCk7CgogICAgCQl9CgogICAgCQlvYmplY3QudXVpZCA9IGRhdGEudXVpZDsKCiAgICAJCWlmICggZGF0YS5uYW1lICE9PSB1bmRlZmluZWQgKSBvYmplY3QubmFtZSA9IGRhdGEubmFtZTsKCiAgICAJCWlmICggZGF0YS5tYXRyaXggIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlvYmplY3QubWF0cml4LmZyb21BcnJheSggZGF0YS5tYXRyaXggKTsKCiAgICAJCQlpZiAoIGRhdGEubWF0cml4QXV0b1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgb2JqZWN0Lm1hdHJpeEF1dG9VcGRhdGUgPSBkYXRhLm1hdHJpeEF1dG9VcGRhdGU7CiAgICAJCQlpZiAoIG9iamVjdC5tYXRyaXhBdXRvVXBkYXRlICkgb2JqZWN0Lm1hdHJpeC5kZWNvbXBvc2UoIG9iamVjdC5wb3NpdGlvbiwgb2JqZWN0LnF1YXRlcm5pb24sIG9iamVjdC5zY2FsZSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlpZiAoIGRhdGEucG9zaXRpb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5wb3NpdGlvbi5mcm9tQXJyYXkoIGRhdGEucG9zaXRpb24gKTsKICAgIAkJCWlmICggZGF0YS5yb3RhdGlvbiAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJvdGF0aW9uLmZyb21BcnJheSggZGF0YS5yb3RhdGlvbiApOwogICAgCQkJaWYgKCBkYXRhLnF1YXRlcm5pb24gIT09IHVuZGVmaW5lZCApIG9iamVjdC5xdWF0ZXJuaW9uLmZyb21BcnJheSggZGF0YS5xdWF0ZXJuaW9uICk7CiAgICAJCQlpZiAoIGRhdGEuc2NhbGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zY2FsZS5mcm9tQXJyYXkoIGRhdGEuc2NhbGUgKTsKCiAgICAJCX0KCiAgICAJCWlmICggZGF0YS5jYXN0U2hhZG93ICE9PSB1bmRlZmluZWQgKSBvYmplY3QuY2FzdFNoYWRvdyA9IGRhdGEuY2FzdFNoYWRvdzsKICAgIAkJaWYgKCBkYXRhLnJlY2VpdmVTaGFkb3cgIT09IHVuZGVmaW5lZCApIG9iamVjdC5yZWNlaXZlU2hhZG93ID0gZGF0YS5yZWNlaXZlU2hhZG93OwoKICAgIAkJaWYgKCBkYXRhLnNoYWRvdyApIHsKCiAgICAJCQlpZiAoIGRhdGEuc2hhZG93LmJpYXMgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cuYmlhcyA9IGRhdGEuc2hhZG93LmJpYXM7CiAgICAJCQlpZiAoIGRhdGEuc2hhZG93LnJhZGl1cyAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnNoYWRvdy5yYWRpdXMgPSBkYXRhLnNoYWRvdy5yYWRpdXM7CiAgICAJCQlpZiAoIGRhdGEuc2hhZG93Lm1hcFNpemUgIT09IHVuZGVmaW5lZCApIG9iamVjdC5zaGFkb3cubWFwU2l6ZS5mcm9tQXJyYXkoIGRhdGEuc2hhZG93Lm1hcFNpemUgKTsKICAgIAkJCWlmICggZGF0YS5zaGFkb3cuY2FtZXJhICE9PSB1bmRlZmluZWQgKSBvYmplY3Quc2hhZG93LmNhbWVyYSA9IHRoaXMucGFyc2VPYmplY3QoIGRhdGEuc2hhZG93LmNhbWVyYSApOwoKICAgIAkJfQoKICAgIAkJaWYgKCBkYXRhLnZpc2libGUgIT09IHVuZGVmaW5lZCApIG9iamVjdC52aXNpYmxlID0gZGF0YS52aXNpYmxlOwogICAgCQlpZiAoIGRhdGEuZnJ1c3R1bUN1bGxlZCAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LmZydXN0dW1DdWxsZWQgPSBkYXRhLmZydXN0dW1DdWxsZWQ7CiAgICAJCWlmICggZGF0YS5yZW5kZXJPcmRlciAhPT0gdW5kZWZpbmVkICkgb2JqZWN0LnJlbmRlck9yZGVyID0gZGF0YS5yZW5kZXJPcmRlcjsKICAgIAkJaWYgKCBkYXRhLnVzZXJEYXRhICE9PSB1bmRlZmluZWQgKSBvYmplY3QudXNlckRhdGEgPSBkYXRhLnVzZXJEYXRhOwogICAgCQlpZiAoIGRhdGEubGF5ZXJzICE9PSB1bmRlZmluZWQgKSBvYmplY3QubGF5ZXJzLm1hc2sgPSBkYXRhLmxheWVyczsKCiAgICAJCWlmICggZGF0YS5jaGlsZHJlbiAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBjaGlsZHJlbiA9IGRhdGEuY2hpbGRyZW47CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpICsrICkgewoKICAgIAkJCQlvYmplY3QuYWRkKCB0aGlzLnBhcnNlT2JqZWN0KCBjaGlsZHJlblsgaSBdLCBnZW9tZXRyaWVzLCBtYXRlcmlhbHMgKSApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCWlmICggZGF0YS50eXBlID09PSAnTE9EJyApIHsKCiAgICAJCQl2YXIgbGV2ZWxzID0gZGF0YS5sZXZlbHM7CgogICAgCQkJZm9yICggdmFyIGwgPSAwOyBsIDwgbGV2ZWxzLmxlbmd0aDsgbCArKyApIHsKCiAgICAJCQkJdmFyIGxldmVsID0gbGV2ZWxzWyBsIF07CiAgICAJCQkJdmFyIGNoaWxkID0gb2JqZWN0LmdldE9iamVjdEJ5UHJvcGVydHkoICd1dWlkJywgbGV2ZWwub2JqZWN0ICk7CgogICAgCQkJCWlmICggY2hpbGQgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJCW9iamVjdC5hZGRMZXZlbCggY2hpbGQsIGxldmVsLmRpc3RhbmNlICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gb2JqZWN0OwoKICAgIAl9CgogICAgfSApOwoKICAgIHZhciBURVhUVVJFX01BUFBJTkcgPSB7CiAgICAJVVZNYXBwaW5nOiBVVk1hcHBpbmcsCiAgICAJQ3ViZVJlZmxlY3Rpb25NYXBwaW5nOiBDdWJlUmVmbGVjdGlvbk1hcHBpbmcsCiAgICAJQ3ViZVJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlUmVmcmFjdGlvbk1hcHBpbmcsCiAgICAJRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZmxlY3Rpb25NYXBwaW5nLAogICAgCUVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nOiBFcXVpcmVjdGFuZ3VsYXJSZWZyYWN0aW9uTWFwcGluZywKICAgIAlTcGhlcmljYWxSZWZsZWN0aW9uTWFwcGluZzogU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmcsCiAgICAJQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLAogICAgCUN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZwogICAgfTsKCiAgICB2YXIgVEVYVFVSRV9XUkFQUElORyA9IHsKICAgIAlSZXBlYXRXcmFwcGluZzogUmVwZWF0V3JhcHBpbmcsCiAgICAJQ2xhbXBUb0VkZ2VXcmFwcGluZzogQ2xhbXBUb0VkZ2VXcmFwcGluZywKICAgIAlNaXJyb3JlZFJlcGVhdFdyYXBwaW5nOiBNaXJyb3JlZFJlcGVhdFdyYXBwaW5nCiAgICB9OwoKICAgIHZhciBURVhUVVJFX0ZJTFRFUiA9IHsKICAgIAlOZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLAogICAgCU5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0TWlwbWFwTmVhcmVzdEZpbHRlciwKICAgIAlOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyOiBOZWFyZXN0TWlwbWFwTGluZWFyRmlsdGVyLAogICAgCUxpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLAogICAgCUxpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsCiAgICAJTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyOiBMaW5lYXJNaXBtYXBMaW5lYXJGaWx0ZXIKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIHRoZXNwaXRlIC8gaHR0cDovL2NsaWNrdG9yZWxlYXNlLmNvbS8KICAgICAqLwoKCiAgICBmdW5jdGlvbiBJbWFnZUJpdG1hcExvYWRlciggbWFuYWdlciApIHsKCiAgICAJaWYgKCB0eXBlb2YgY3JlYXRlSW1hZ2VCaXRtYXAgPT09ICd1bmRlZmluZWQnICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGNyZWF0ZUltYWdlQml0bWFwKCkgbm90IHN1cHBvcnRlZC4nICk7CgogICAgCX0KCiAgICAJaWYgKCB0eXBlb2YgZmV0Y2ggPT09ICd1bmRlZmluZWQnICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuSW1hZ2VCaXRtYXBMb2FkZXI6IGZldGNoKCkgbm90IHN1cHBvcnRlZC4nICk7CgogICAgCX0KCiAgICAJTG9hZGVyLmNhbGwoIHRoaXMsIG1hbmFnZXIgKTsKCiAgICAJdGhpcy5vcHRpb25zID0gdW5kZWZpbmVkOwoKICAgIH0KCiAgICBJbWFnZUJpdG1hcExvYWRlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMb2FkZXIucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEltYWdlQml0bWFwTG9hZGVyLAoKICAgIAlzZXRPcHRpb25zOiBmdW5jdGlvbiBzZXRPcHRpb25zKCBvcHRpb25zICkgewoKICAgIAkJdGhpcy5vcHRpb25zID0gb3B0aW9uczsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlsb2FkOiBmdW5jdGlvbiAoIHVybCwgb25Mb2FkLCBvblByb2dyZXNzLCBvbkVycm9yICkgewoKICAgIAkJaWYgKCB1cmwgPT09IHVuZGVmaW5lZCApIHVybCA9ICcnOwoKICAgIAkJaWYgKCB0aGlzLnBhdGggIT09IHVuZGVmaW5lZCApIHVybCA9IHRoaXMucGF0aCArIHVybDsKCiAgICAJCXVybCA9IHRoaXMubWFuYWdlci5yZXNvbHZlVVJMKCB1cmwgKTsKCiAgICAJCXZhciBzY29wZSA9IHRoaXM7CgogICAgCQl2YXIgY2FjaGVkID0gQ2FjaGUuZ2V0KCB1cmwgKTsKCiAgICAJCWlmICggY2FjaGVkICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOwoKICAgIAkJCXNldFRpbWVvdXQoIGZ1bmN0aW9uICgpIHsKCiAgICAJCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIGNhY2hlZCApOwoKICAgIAkJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKICAgIAkJCX0sIDAgKTsKCiAgICAJCQlyZXR1cm4gY2FjaGVkOwoKICAgIAkJfQoKICAgIAkJZmV0Y2goIHVybCApLnRoZW4oIGZ1bmN0aW9uICggcmVzICkgewoKICAgIAkJCXJldHVybiByZXMuYmxvYigpOwoKICAgIAkJfSApLnRoZW4oIGZ1bmN0aW9uICggYmxvYiApIHsKCiAgICAJCQlpZiAoIHNjb3BlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJLy8gV29ya2Fyb3VuZCBmb3IgRmlyZUZveC4gSXQgY2F1c2VzIGFuIGVycm9yIGlmIHlvdSBwYXNzIG9wdGlvbnMuCiAgICAJCQkJcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKCBibG9iICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJcmV0dXJuIGNyZWF0ZUltYWdlQml0bWFwKCBibG9iLCBzY29wZS5vcHRpb25zICk7CgogICAgCQkJfQoKICAgIAkJfSApLnRoZW4oIGZ1bmN0aW9uICggaW1hZ2VCaXRtYXAgKSB7CgogICAgCQkJQ2FjaGUuYWRkKCB1cmwsIGltYWdlQml0bWFwICk7CgogICAgCQkJaWYgKCBvbkxvYWQgKSBvbkxvYWQoIGltYWdlQml0bWFwICk7CgogICAgCQkJc2NvcGUubWFuYWdlci5pdGVtRW5kKCB1cmwgKTsKCiAgICAJCX0gKS5jYXRjaCggZnVuY3Rpb24gKCBlICkgewoKICAgIAkJCWlmICggb25FcnJvciApIG9uRXJyb3IoIGUgKTsKCiAgICAJCQlzY29wZS5tYW5hZ2VyLml0ZW1FcnJvciggdXJsICk7CiAgICAJCQlzY29wZS5tYW5hZ2VyLml0ZW1FbmQoIHVybCApOwoKICAgIAkJfSApOwoKICAgIAkJc2NvcGUubWFuYWdlci5pdGVtU3RhcnQoIHVybCApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciB6ejg1IC8gaHR0cDovL3d3dy5sYWI0Z2FtZXMubmV0L3p6ODUvYmxvZwogICAgICogbWluaW1hbCBjbGFzcyBmb3IgcHJveGluZyBmdW5jdGlvbnMgdG8gUGF0aC4gUmVwbGFjZXMgb2xkICJleHRyYWN0U3VicGF0aHMoKSIKICAgICAqKi8KCiAgICBmdW5jdGlvbiBTaGFwZVBhdGgoKSB7CgogICAgCXRoaXMudHlwZSA9ICdTaGFwZVBhdGgnOwoKICAgIAl0aGlzLmNvbG9yID0gbmV3IENvbG9yJDcoKTsKCiAgICAJdGhpcy5zdWJQYXRocyA9IFtdOwogICAgCXRoaXMuY3VycmVudFBhdGggPSBudWxsOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBTaGFwZVBhdGgucHJvdG90eXBlLCB7CgogICAgCW1vdmVUbzogZnVuY3Rpb24gKCB4LCB5ICkgewoKICAgIAkJdGhpcy5jdXJyZW50UGF0aCA9IG5ldyBQYXRoJDQoKTsKICAgIAkJdGhpcy5zdWJQYXRocy5wdXNoKCB0aGlzLmN1cnJlbnRQYXRoICk7CiAgICAJCXRoaXMuY3VycmVudFBhdGgubW92ZVRvKCB4LCB5ICk7CgogICAgCX0sCgogICAgCWxpbmVUbzogZnVuY3Rpb24gKCB4LCB5ICkgewoKICAgIAkJdGhpcy5jdXJyZW50UGF0aC5saW5lVG8oIHgsIHkgKTsKCiAgICAJfSwKCiAgICAJcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24gKCBhQ1B4LCBhQ1B5LCBhWCwgYVkgKSB7CgogICAgCQl0aGlzLmN1cnJlbnRQYXRoLnF1YWRyYXRpY0N1cnZlVG8oIGFDUHgsIGFDUHksIGFYLCBhWSApOwoKICAgIAl9LAoKICAgIAliZXppZXJDdXJ2ZVRvOiBmdW5jdGlvbiAoIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKSB7CgogICAgCQl0aGlzLmN1cnJlbnRQYXRoLmJlemllckN1cnZlVG8oIGFDUDF4LCBhQ1AxeSwgYUNQMngsIGFDUDJ5LCBhWCwgYVkgKTsKCiAgICAJfSwKCiAgICAJc3BsaW5lVGhydTogZnVuY3Rpb24gKCBwdHMgKSB7CgogICAgCQl0aGlzLmN1cnJlbnRQYXRoLnNwbGluZVRocnUoIHB0cyApOwoKICAgIAl9LAoKICAgIAl0b1NoYXBlczogZnVuY3Rpb24gKCBpc0NDVywgbm9Ib2xlcyApIHsKCiAgICAJCWZ1bmN0aW9uIHRvU2hhcGVzTm9Ib2xlcyggaW5TdWJwYXRocyApIHsKCiAgICAJCQl2YXIgc2hhcGVzID0gW107CgogICAgCQkJZm9yICggdmFyIGkgPSAwLCBsID0gaW5TdWJwYXRocy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQl2YXIgdG1wUGF0aCA9IGluU3VicGF0aHNbIGkgXTsKCiAgICAJCQkJdmFyIHRtcFNoYXBlID0gbmV3IFNoYXBlKCk7CiAgICAJCQkJdG1wU2hhcGUuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7CgogICAgCQkJCXNoYXBlcy5wdXNoKCB0bXBTaGFwZSApOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gc2hhcGVzOwoKICAgIAkJfQoKICAgIAkJZnVuY3Rpb24gaXNQb2ludEluc2lkZVBvbHlnb24oIGluUHQsIGluUG9seWdvbiApIHsKCiAgICAJCQl2YXIgcG9seUxlbiA9IGluUG9seWdvbi5sZW5ndGg7CgogICAgCQkJLy8gaW5QdCBvbiBwb2x5Z29uIGNvbnRvdXIgPT4gaW1tZWRpYXRlIHN1Y2Nlc3MgICAgb3IKICAgIAkJCS8vIHRvZ2dsaW5nIG9mIGluc2lkZS9vdXRzaWRlIGF0IGV2ZXJ5IHNpbmdsZSEgaW50ZXJzZWN0aW9uIHBvaW50IG9mIGFuIGVkZ2UKICAgIAkJCS8vICB3aXRoIHRoZSBob3Jpem9udGFsIGxpbmUgdGhyb3VnaCBpblB0LCBsZWZ0IG9mIGluUHQKICAgIAkJCS8vICBub3QgY291bnRpbmcgbG93ZXJZIGVuZHBvaW50cyBvZiBlZGdlcyBhbmQgd2hvbGUgZWRnZXMgb24gdGhhdCBsaW5lCiAgICAJCQl2YXIgaW5zaWRlID0gZmFsc2U7CiAgICAJCQlmb3IgKCB2YXIgcCA9IHBvbHlMZW4gLSAxLCBxID0gMDsgcSA8IHBvbHlMZW47IHAgPSBxICsrICkgewoKICAgIAkJCQl2YXIgZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBwIF07CiAgICAJCQkJdmFyIGVkZ2VIaWdoUHQgPSBpblBvbHlnb25bIHEgXTsKCiAgICAJCQkJdmFyIGVkZ2VEeCA9IGVkZ2VIaWdoUHQueCAtIGVkZ2VMb3dQdC54OwogICAgCQkJCXZhciBlZGdlRHkgPSBlZGdlSGlnaFB0LnkgLSBlZGdlTG93UHQueTsKCiAgICAJCQkJaWYgKCBNYXRoLmFicyggZWRnZUR5ICkgPiBOdW1iZXIuRVBTSUxPTiApIHsKCiAgICAJCQkJCS8vIG5vdCBwYXJhbGxlbAogICAgCQkJCQlpZiAoIGVkZ2VEeSA8IDAgKSB7CgogICAgCQkJCQkJZWRnZUxvd1B0ID0gaW5Qb2x5Z29uWyBxIF07IGVkZ2VEeCA9IC0gZWRnZUR4OwogICAgCQkJCQkJZWRnZUhpZ2hQdCA9IGluUG9seWdvblsgcCBdOyBlZGdlRHkgPSAtIGVkZ2VEeTsKCiAgICAJCQkJCX0KICAgIAkJCQkJaWYgKCAoIGluUHQueSA8IGVkZ2VMb3dQdC55ICkgfHwgKCBpblB0LnkgPiBlZGdlSGlnaFB0LnkgKSApIAkJY29udGludWU7CgogICAgCQkJCQlpZiAoIGluUHQueSA9PT0gZWRnZUxvd1B0LnkgKSB7CgogICAgCQkJCQkJaWYgKCBpblB0LnggPT09IGVkZ2VMb3dQdC54ICkJCXJldHVybgl0cnVlOwkJLy8gaW5QdCBpcyBvbiBjb250b3VyID8KICAgIAkJCQkJCS8vIGNvbnRpbnVlOwkJCQkvLyBubyBpbnRlcnNlY3Rpb24gb3IgZWRnZUxvd1B0ID0+IGRvZXNuJ3QgY291bnQgISEhCgogICAgCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCXZhciBwZXJwRWRnZSA9IGVkZ2VEeSAqICggaW5QdC54IC0gZWRnZUxvd1B0LnggKSAtIGVkZ2VEeCAqICggaW5QdC55IC0gZWRnZUxvd1B0LnkgKTsKICAgIAkJCQkJCWlmICggcGVycEVkZ2UgPT09IDAgKQkJCQlyZXR1cm4JdHJ1ZTsJCS8vIGluUHQgaXMgb24gY29udG91ciA/CiAgICAJCQkJCQlpZiAoIHBlcnBFZGdlIDwgMCApIAkJCQljb250aW51ZTsKICAgIAkJCQkJCWluc2lkZSA9ICEgaW5zaWRlOwkJLy8gdHJ1ZSBpbnRlcnNlY3Rpb24gbGVmdCBvZiBpblB0CgogICAgCQkJCQl9CgogICAgCQkJCX0gZWxzZSB7CgogICAgCQkJCQkvLyBwYXJhbGxlbCBvciBjb2xsaW5lYXIKICAgIAkJCQkJaWYgKCBpblB0LnkgIT09IGVkZ2VMb3dQdC55ICkgCQljb250aW51ZTsJCQkvLyBwYXJhbGxlbAogICAgCQkJCQkvLyBlZGdlIGxpZXMgb24gdGhlIHNhbWUgaG9yaXpvbnRhbCBsaW5lIGFzIGluUHQKICAgIAkJCQkJaWYgKCAoICggZWRnZUhpZ2hQdC54IDw9IGluUHQueCApICYmICggaW5QdC54IDw9IGVkZ2VMb3dQdC54ICkgKSB8fAogICAgCQkJCQkJICggKCBlZGdlTG93UHQueCA8PSBpblB0LnggKSAmJiAoIGluUHQueCA8PSBlZGdlSGlnaFB0LnggKSApICkJCXJldHVybgl0cnVlOwkvLyBpblB0OiBQb2ludCBvbiBjb250b3VyICEKICAgIAkJCQkJLy8gY29udGludWU7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJcmV0dXJuCWluc2lkZTsKCiAgICAJCX0KCiAgICAJCXZhciBpc0Nsb2NrV2lzZSA9IFNoYXBlVXRpbHMuaXNDbG9ja1dpc2U7CgogICAgCQl2YXIgc3ViUGF0aHMgPSB0aGlzLnN1YlBhdGhzOwogICAgCQlpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMCApIHJldHVybiBbXTsKCiAgICAJCWlmICggbm9Ib2xlcyA9PT0gdHJ1ZSApCXJldHVybgl0b1NoYXBlc05vSG9sZXMoIHN1YlBhdGhzICk7CgoKICAgIAkJdmFyIHNvbGlkLCB0bXBQYXRoLCB0bXBTaGFwZSwgc2hhcGVzID0gW107CgogICAgCQlpZiAoIHN1YlBhdGhzLmxlbmd0aCA9PT0gMSApIHsKCiAgICAJCQl0bXBQYXRoID0gc3ViUGF0aHNbIDAgXTsKICAgIAkJCXRtcFNoYXBlID0gbmV3IFNoYXBlKCk7CiAgICAJCQl0bXBTaGFwZS5jdXJ2ZXMgPSB0bXBQYXRoLmN1cnZlczsKICAgIAkJCXNoYXBlcy5wdXNoKCB0bXBTaGFwZSApOwogICAgCQkJcmV0dXJuIHNoYXBlczsKCiAgICAJCX0KCiAgICAJCXZhciBob2xlc0ZpcnN0ID0gISBpc0Nsb2NrV2lzZSggc3ViUGF0aHNbIDAgXS5nZXRQb2ludHMoKSApOwogICAgCQlob2xlc0ZpcnN0ID0gaXNDQ1cgPyAhIGhvbGVzRmlyc3QgOiBob2xlc0ZpcnN0OwoKICAgIAkJLy8gY29uc29sZS5sb2coIkhvbGVzIGZpcnN0IiwgaG9sZXNGaXJzdCk7CgogICAgCQl2YXIgYmV0dGVyU2hhcGVIb2xlcyA9IFtdOwogICAgCQl2YXIgbmV3U2hhcGVzID0gW107CiAgICAJCXZhciBuZXdTaGFwZUhvbGVzID0gW107CiAgICAJCXZhciBtYWluSWR4ID0gMDsKICAgIAkJdmFyIHRtcFBvaW50czsKCiAgICAJCW5ld1NoYXBlc1sgbWFpbklkeCBdID0gdW5kZWZpbmVkOwogICAgCQluZXdTaGFwZUhvbGVzWyBtYWluSWR4IF0gPSBbXTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IHN1YlBhdGhzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdG1wUGF0aCA9IHN1YlBhdGhzWyBpIF07CiAgICAJCQl0bXBQb2ludHMgPSB0bXBQYXRoLmdldFBvaW50cygpOwogICAgCQkJc29saWQgPSBpc0Nsb2NrV2lzZSggdG1wUG9pbnRzICk7CiAgICAJCQlzb2xpZCA9IGlzQ0NXID8gISBzb2xpZCA6IHNvbGlkOwoKICAgIAkJCWlmICggc29saWQgKSB7CgogICAgCQkJCWlmICggKCAhIGhvbGVzRmlyc3QgKSAmJiAoIG5ld1NoYXBlc1sgbWFpbklkeCBdICkgKQltYWluSWR4ICsrOwoKICAgIAkJCQluZXdTaGFwZXNbIG1haW5JZHggXSA9IHsgczogbmV3IFNoYXBlKCksIHA6IHRtcFBvaW50cyB9OwogICAgCQkJCW5ld1NoYXBlc1sgbWFpbklkeCBdLnMuY3VydmVzID0gdG1wUGF0aC5jdXJ2ZXM7CgogICAgCQkJCWlmICggaG9sZXNGaXJzdCApCW1haW5JZHggKys7CiAgICAJCQkJbmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdID0gW107CgogICAgCQkJCS8vY29uc29sZS5sb2coJ2N3JywgaSk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJbmV3U2hhcGVIb2xlc1sgbWFpbklkeCBdLnB1c2goIHsgaDogdG1wUGF0aCwgcDogdG1wUG9pbnRzWyAwIF0gfSApOwoKICAgIAkJCQkvL2NvbnNvbGUubG9nKCdjY3cnLCBpKTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBvbmx5IEhvbGVzPyAtPiBwcm9iYWJseSBhbGwgU2hhcGVzIHdpdGggd3Jvbmcgb3JpZW50YXRpb24KICAgIAkJaWYgKCAhIG5ld1NoYXBlc1sgMCBdICkJcmV0dXJuCXRvU2hhcGVzTm9Ib2xlcyggc3ViUGF0aHMgKTsKCgogICAgCQlpZiAoIG5ld1NoYXBlcy5sZW5ndGggPiAxICkgewoKICAgIAkJCXZhciBhbWJpZ3VvdXMgPSBmYWxzZTsKICAgIAkJCXZhciB0b0NoYW5nZSA9IFtdOwoKICAgIAkJCWZvciAoIHZhciBzSWR4ID0gMCwgc0xlbiA9IG5ld1NoYXBlcy5sZW5ndGg7IHNJZHggPCBzTGVuOyBzSWR4ICsrICkgewoKICAgIAkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0gPSBbXTsKCiAgICAJCQl9CgogICAgCQkJZm9yICggdmFyIHNJZHggPSAwLCBzTGVuID0gbmV3U2hhcGVzLmxlbmd0aDsgc0lkeCA8IHNMZW47IHNJZHggKysgKSB7CgogICAgCQkJCXZhciBzaG8gPSBuZXdTaGFwZUhvbGVzWyBzSWR4IF07CgogICAgCQkJCWZvciAoIHZhciBoSWR4ID0gMDsgaElkeCA8IHNoby5sZW5ndGg7IGhJZHggKysgKSB7CgogICAgCQkJCQl2YXIgaG8gPSBzaG9bIGhJZHggXTsKICAgIAkJCQkJdmFyIGhvbGVfdW5hc3NpZ25lZCA9IHRydWU7CgogICAgCQkJCQlmb3IgKCB2YXIgczJJZHggPSAwOyBzMklkeCA8IG5ld1NoYXBlcy5sZW5ndGg7IHMySWR4ICsrICkgewoKICAgIAkJCQkJCWlmICggaXNQb2ludEluc2lkZVBvbHlnb24oIGhvLnAsIG5ld1NoYXBlc1sgczJJZHggXS5wICkgKSB7CgogICAgCQkJCQkJCWlmICggc0lkeCAhPT0gczJJZHggKQl0b0NoYW5nZS5wdXNoKCB7IGZyb21zOiBzSWR4LCB0b3M6IHMySWR4LCBob2xlOiBoSWR4IH0gKTsKICAgIAkJCQkJCQlpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHsKCiAgICAJCQkJCQkJCWhvbGVfdW5hc3NpZ25lZCA9IGZhbHNlOwogICAgCQkJCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzMklkeCBdLnB1c2goIGhvICk7CgogICAgCQkJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJCQlhbWJpZ3VvdXMgPSB0cnVlOwoKICAgIAkJCQkJCQl9CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfQogICAgCQkJCQlpZiAoIGhvbGVfdW5hc3NpZ25lZCApIHsKCiAgICAJCQkJCQliZXR0ZXJTaGFwZUhvbGVzWyBzSWR4IF0ucHVzaCggaG8gKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfQoKICAgIAkJCX0KICAgIAkJCS8vIGNvbnNvbGUubG9nKCJhbWJpZ3VvdXM6ICIsIGFtYmlndW91cyk7CiAgICAJCQlpZiAoIHRvQ2hhbmdlLmxlbmd0aCA+IDAgKSB7CgogICAgCQkJCS8vIGNvbnNvbGUubG9nKCJ0byBjaGFuZ2U6ICIsIHRvQ2hhbmdlKTsKICAgIAkJCQlpZiAoICEgYW1iaWd1b3VzICkJbmV3U2hhcGVIb2xlcyA9IGJldHRlclNoYXBlSG9sZXM7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJdmFyIHRtcEhvbGVzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IG5ld1NoYXBlcy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl0bXBTaGFwZSA9IG5ld1NoYXBlc1sgaSBdLnM7CiAgICAJCQlzaGFwZXMucHVzaCggdG1wU2hhcGUgKTsKICAgIAkJCXRtcEhvbGVzID0gbmV3U2hhcGVIb2xlc1sgaSBdOwoKICAgIAkJCWZvciAoIHZhciBqID0gMCwgamwgPSB0bXBIb2xlcy5sZW5ndGg7IGogPCBqbDsgaiArKyApIHsKCiAgICAJCQkJdG1wU2hhcGUuaG9sZXMucHVzaCggdG1wSG9sZXNbIGogXS5oICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJLy9jb25zb2xlLmxvZygic2hhcGUiLCBzaGFwZXMpOwoKICAgIAkJcmV0dXJuIHNoYXBlczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly93d3cubGFiNGdhbWVzLm5ldC96ejg1L2Jsb2cKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCgogICAgZnVuY3Rpb24gRm9udCggZGF0YSApIHsKCiAgICAJdGhpcy50eXBlID0gJ0ZvbnQnOwoKICAgIAl0aGlzLmRhdGEgPSBkYXRhOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBGb250LnByb3RvdHlwZSwgewoKICAgIAlpc0ZvbnQ6IHRydWUsCgogICAgCWdlbmVyYXRlU2hhcGVzOiBmdW5jdGlvbiAoIHRleHQsIHNpemUgKSB7CgogICAgCQlpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxMDA7CgogICAgCQl2YXIgc2hhcGVzID0gW107CiAgICAJCXZhciBwYXRocyA9IGNyZWF0ZVBhdGhzKCB0ZXh0LCBzaXplLCB0aGlzLmRhdGEgKTsKCiAgICAJCWZvciAoIHZhciBwID0gMCwgcGwgPSBwYXRocy5sZW5ndGg7IHAgPCBwbDsgcCArKyApIHsKCiAgICAJCQlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseSggc2hhcGVzLCBwYXRoc1sgcCBdLnRvU2hhcGVzKCkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBzaGFwZXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgZnVuY3Rpb24gY3JlYXRlUGF0aHMoIHRleHQsIHNpemUsIGRhdGEgKSB7CgogICAgCXZhciBjaGFycyA9IEFycmF5LmZyb20gPyBBcnJheS5mcm9tKCB0ZXh0ICkgOiBTdHJpbmcoIHRleHQgKS5zcGxpdCggJycgKTsgLy8gc2VlICMxMzk4OAogICAgCXZhciBzY2FsZSA9IHNpemUgLyBkYXRhLnJlc29sdXRpb247CiAgICAJdmFyIGxpbmVfaGVpZ2h0ID0gKCBkYXRhLmJvdW5kaW5nQm94LnlNYXggLSBkYXRhLmJvdW5kaW5nQm94LnlNaW4gKyBkYXRhLnVuZGVybGluZVRoaWNrbmVzcyApICogc2NhbGU7CgogICAgCXZhciBwYXRocyA9IFtdOwoKICAgIAl2YXIgb2Zmc2V0WCA9IDAsIG9mZnNldFkgPSAwOwoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGFycy5sZW5ndGg7IGkgKysgKSB7CgogICAgCQl2YXIgY2hhciA9IGNoYXJzWyBpIF07CgogICAgCQlpZiAoIGNoYXIgPT09ICdcbicgKSB7CgogICAgCQkJb2Zmc2V0WCA9IDA7CiAgICAJCQlvZmZzZXRZIC09IGxpbmVfaGVpZ2h0OwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl2YXIgcmV0ID0gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKTsKICAgIAkJCW9mZnNldFggKz0gcmV0Lm9mZnNldFg7CiAgICAJCQlwYXRocy5wdXNoKCByZXQucGF0aCApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCXJldHVybiBwYXRoczsKCiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRlUGF0aCggY2hhciwgc2NhbGUsIG9mZnNldFgsIG9mZnNldFksIGRhdGEgKSB7CgogICAgCXZhciBnbHlwaCA9IGRhdGEuZ2x5cGhzWyBjaGFyIF0gfHwgZGF0YS5nbHlwaHNbICc/JyBdOwoKICAgIAlpZiAoICEgZ2x5cGggKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuRm9udDogY2hhcmFjdGVyICInICsgY2hhciArICciIGRvZXMgbm90IGV4aXN0cyBpbiBmb250IGZhbWlseSAnICsgZGF0YS5mYW1pbHlOYW1lICsgJy4nICk7CgogICAgCQlyZXR1cm47CgogICAgCX0KCiAgICAJdmFyIHBhdGggPSBuZXcgU2hhcGVQYXRoKCk7CgogICAgCXZhciB4LCB5LCBjcHgsIGNweSwgY3B4MSwgY3B5MSwgY3B4MiwgY3B5MjsKCiAgICAJaWYgKCBnbHlwaC5vICkgewoKICAgIAkJdmFyIG91dGxpbmUgPSBnbHlwaC5fY2FjaGVkT3V0bGluZSB8fCAoIGdseXBoLl9jYWNoZWRPdXRsaW5lID0gZ2x5cGguby5zcGxpdCggJyAnICkgKTsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IG91dGxpbmUubGVuZ3RoOyBpIDwgbDsgKSB7CgogICAgCQkJdmFyIGFjdGlvbiA9IG91dGxpbmVbIGkgKysgXTsKCiAgICAJCQlzd2l0Y2ggKCBhY3Rpb24gKSB7CgogICAgCQkJCWNhc2UgJ20nOiAvLyBtb3ZlVG8KCiAgICAJCQkJCXggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CiAgICAJCQkJCXkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CgogICAgCQkJCQlwYXRoLm1vdmVUbyggeCwgeSApOwoKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgJ2wnOiAvLyBsaW5lVG8KCiAgICAJCQkJCXggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CiAgICAJCQkJCXkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CgogICAgCQkJCQlwYXRoLmxpbmVUbyggeCwgeSApOwoKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWNhc2UgJ3EnOiAvLyBxdWFkcmF0aWNDdXJ2ZVRvCgogICAgCQkJCQljcHggPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CiAgICAJCQkJCWNweSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKICAgIAkJCQkJY3B4MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WDsKICAgIAkJCQkJY3B5MSA9IG91dGxpbmVbIGkgKysgXSAqIHNjYWxlICsgb2Zmc2V0WTsKCiAgICAJCQkJCXBhdGgucXVhZHJhdGljQ3VydmVUbyggY3B4MSwgY3B5MSwgY3B4LCBjcHkgKTsKCiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQljYXNlICdiJzogLy8gYmV6aWVyQ3VydmVUbwoKICAgIAkJCQkJY3B4ID0gb3V0bGluZVsgaSArKyBdICogc2NhbGUgKyBvZmZzZXRYOwogICAgCQkJCQljcHkgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CiAgICAJCQkJCWNweDEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CiAgICAJCQkJCWNweTEgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CiAgICAJCQkJCWNweDIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFg7CiAgICAJCQkJCWNweTIgPSBvdXRsaW5lWyBpICsrIF0gKiBzY2FsZSArIG9mZnNldFk7CgogICAgCQkJCQlwYXRoLmJlemllckN1cnZlVG8oIGNweDEsIGNweTEsIGNweDIsIGNweTIsIGNweCwgY3B5ICk7CgogICAgCQkJCQlicmVhazsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0KCiAgICAJcmV0dXJuIHsgb2Zmc2V0WDogZ2x5cGguaGEgKiBzY2FsZSwgcGF0aDogcGF0aCB9OwoKICAgIH0KCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBGb250TG9hZGVyKCBtYW5hZ2VyICkgewoKICAgIAlMb2FkZXIuY2FsbCggdGhpcywgbWFuYWdlciApOwoKICAgIH0KCiAgICBGb250TG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogRm9udExvYWRlciwKCiAgICAJbG9hZDogZnVuY3Rpb24gKCB1cmwsIG9uTG9hZCwgb25Qcm9ncmVzcywgb25FcnJvciApIHsKCiAgICAJCXZhciBzY29wZSA9IHRoaXM7CgogICAgCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOwogICAgCQlsb2FkZXIuc2V0UGF0aCggdGhpcy5wYXRoICk7CiAgICAJCWxvYWRlci5sb2FkKCB1cmwsIGZ1bmN0aW9uICggdGV4dCApIHsKCiAgICAJCQl2YXIganNvbjsKCiAgICAJCQl0cnkgewoKICAgIAkJCQlqc29uID0gSlNPTi5wYXJzZSggdGV4dCApOwoKICAgIAkJCX0gY2F0Y2ggKCBlICkgewoKICAgIAkJCQljb25zb2xlLndhcm4oICdUSFJFRS5Gb250TG9hZGVyOiB0eXBlZmFjZS5qcyBzdXBwb3J0IGlzIGJlaW5nIGRlcHJlY2F0ZWQuIFVzZSB0eXBlZmFjZS5qc29uIGluc3RlYWQuJyApOwogICAgCQkJCWpzb24gPSBKU09OLnBhcnNlKCB0ZXh0LnN1YnN0cmluZyggNjUsIHRleHQubGVuZ3RoIC0gMiApICk7CgogICAgCQkJfQoKICAgIAkJCXZhciBmb250ID0gc2NvcGUucGFyc2UoIGpzb24gKTsKCiAgICAJCQlpZiAoIG9uTG9hZCApIG9uTG9hZCggZm9udCApOwoKICAgIAkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKICAgIAl9LAoKICAgIAlwYXJzZTogZnVuY3Rpb24gKCBqc29uICkgewoKICAgIAkJcmV0dXJuIG5ldyBGb250KCBqc29uICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgdmFyIF9jb250ZXh0OwoKICAgIHZhciBBdWRpb0NvbnRleHQgPSB7CgogICAgCWdldENvbnRleHQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWlmICggX2NvbnRleHQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlfY29udGV4dCA9IG5ldyAoIHdpbmRvdy5BdWRpb0NvbnRleHQgfHwgd2luZG93LndlYmtpdEF1ZGlvQ29udGV4dCApKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gX2NvbnRleHQ7CgogICAgCX0sCgogICAgCXNldENvbnRleHQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQlfY29udGV4dCA9IHZhbHVlOwoKICAgIAl9CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgUmVlY2UgQWFyb24gTGVjcml2YWluIC8gaHR0cDovL3JlZWNlbm90ZXMuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gQXVkaW9Mb2FkZXIoIG1hbmFnZXIgKSB7CgogICAgCUxvYWRlci5jYWxsKCB0aGlzLCBtYW5hZ2VyICk7CgogICAgfQoKICAgIEF1ZGlvTG9hZGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIExvYWRlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQXVkaW9Mb2FkZXIsCgogICAgCWxvYWQ6IGZ1bmN0aW9uICggdXJsLCBvbkxvYWQsIG9uUHJvZ3Jlc3MsIG9uRXJyb3IgKSB7CgogICAgCQl2YXIgbG9hZGVyID0gbmV3IEZpbGVMb2FkZXIoIHRoaXMubWFuYWdlciApOwogICAgCQlsb2FkZXIuc2V0UmVzcG9uc2VUeXBlKCAnYXJyYXlidWZmZXInICk7CiAgICAJCWxvYWRlci5zZXRQYXRoKCB0aGlzLnBhdGggKTsKICAgIAkJbG9hZGVyLmxvYWQoIHVybCwgZnVuY3Rpb24gKCBidWZmZXIgKSB7CgogICAgCQkJLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgYnVmZmVyLiBUaGUgYGRlY29kZUF1ZGlvRGF0YWAgbWV0aG9kCiAgICAJCQkvLyBkZXRhY2hlcyB0aGUgYnVmZmVyIHdoZW4gY29tcGxldGUsIHByZXZlbnRpbmcgcmV1c2UuCiAgICAJCQl2YXIgYnVmZmVyQ29weSA9IGJ1ZmZlci5zbGljZSggMCApOwoKICAgIAkJCXZhciBjb250ZXh0ID0gQXVkaW9Db250ZXh0LmdldENvbnRleHQoKTsKICAgIAkJCWNvbnRleHQuZGVjb2RlQXVkaW9EYXRhKCBidWZmZXJDb3B5LCBmdW5jdGlvbiAoIGF1ZGlvQnVmZmVyICkgewoKICAgIAkJCQlvbkxvYWQoIGF1ZGlvQnVmZmVyICk7CgogICAgCQkJfSApOwoKICAgIAkJfSwgb25Qcm9ncmVzcywgb25FcnJvciApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKgogICAgICogUHJpbWFyeSByZWZlcmVuY2U6CiAgICAgKiAgIGh0dHBzOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L3BhcGVycy9lbnZtYXAvZW52bWFwLnBkZgogICAgICoKICAgICAqIFNlY29uZGFyeSByZWZlcmVuY2U6CiAgICAgKiAgIGh0dHBzOi8vd3d3LnBwc2xvYW4ub3JnL3B1YmxpY2F0aW9ucy9TdHVwaWRTSDM2LnBkZgogICAgICovCgogICAgLy8gMy1iYW5kIFNIIGRlZmluZWQgYnkgOSBjb2VmZmljaWVudHMKCiAgICBmdW5jdGlvbiBTcGhlcmljYWxIYXJtb25pY3MzKCkgewoKICAgIAl0aGlzLmNvZWZmaWNpZW50cyA9IFtdOwoKICAgIAlmb3IgKCB2YXIgaSA9IDA7IGkgPCA5OyBpICsrICkgewoKICAgIAkJdGhpcy5jb2VmZmljaWVudHMucHVzaCggbmV3IFZlY3RvcjMoKSApOwoKICAgIAl9CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbEhhcm1vbmljczMucHJvdG90eXBlLCB7CgogICAgCWlzU3BoZXJpY2FsSGFybW9uaWNzMzogdHJ1ZSwKCiAgICAJc2V0OiBmdW5jdGlvbiAoIGNvZWZmaWNpZW50cyApIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CgogICAgCQkJdGhpcy5jb2VmZmljaWVudHNbIGkgXS5jb3B5KCBjb2VmZmljaWVudHNbIGkgXSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXplcm86IGZ1bmN0aW9uICgpIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CgogICAgCQkJdGhpcy5jb2VmZmljaWVudHNbIGkgXS5zZXQoIDAsIDAsIDAgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAkvLyBnZXQgdGhlIHJhZGlhbmNlIGluIHRoZSBkaXJlY3Rpb24gb2YgdGhlIG5vcm1hbAogICAgCS8vIHRhcmdldCBpcyBhIFZlY3RvcjMKICAgIAlnZXRBdDogZnVuY3Rpb24gKCBub3JtYWwsIHRhcmdldCApIHsKCiAgICAJCS8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoCgogICAgCQl2YXIgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejsKCiAgICAJCXZhciBjb2VmZiA9IHRoaXMuY29lZmZpY2llbnRzOwoKICAgIAkJLy8gYmFuZCAwCiAgICAJCXRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuMjgyMDk1ICk7CgogICAgCQkvLyBiYW5kIDEKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgMSBdLCAwLjQ4ODYwMyAqIHkgKTsKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgMiBdLCAwLjQ4ODYwMyAqIHogKTsKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgMyBdLCAwLjQ4ODYwMyAqIHggKTsKCiAgICAJCS8vIGJhbmQgMgogICAgCQl0YXJnZXQuYWRkU2NhbGUoIGNvZWZmWyA0IF0sIDEuMDkyNTQ4ICogKCB4ICogeSApICk7CiAgICAJCXRhcmdldC5hZGRTY2FsZSggY29lZmZbIDUgXSwgMS4wOTI1NDggKiAoIHkgKiB6ICkgKTsKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgNiBdLCAwLjMxNTM5MiAqICggMy4wICogeiAqIHogLSAxLjAgKSApOwogICAgCQl0YXJnZXQuYWRkU2NhbGUoIGNvZWZmWyA3IF0sIDEuMDkyNTQ4ICogKCB4ICogeiApICk7CiAgICAJCXRhcmdldC5hZGRTY2FsZSggY29lZmZbIDggXSwgMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKSApOwoKICAgIAkJcmV0dXJuIHRhcmdldDsKCiAgICAJfSwKCiAgICAJLy8gZ2V0IHRoZSBpcnJhZGlhbmNlIChyYWRpYW5jZSBjb252b2x2ZWQgd2l0aCBjb3NpbmUgbG9iZSkgaW4gdGhlIGRpcmVjdGlvbiBvZiB0aGUgbm9ybWFsCiAgICAJLy8gdGFyZ2V0IGlzIGEgVmVjdG9yMwogICAgCS8vIGh0dHBzOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L3BhcGVycy9lbnZtYXAvZW52bWFwLnBkZgogICAgCWdldElycmFkaWFuY2VBdDogZnVuY3Rpb24gKCBub3JtYWwsIHRhcmdldCApIHsKCiAgICAJCS8vIG5vcm1hbCBpcyBhc3N1bWVkIHRvIGJlIHVuaXQgbGVuZ3RoCgogICAgCQl2YXIgeCA9IG5vcm1hbC54LCB5ID0gbm9ybWFsLnksIHogPSBub3JtYWwuejsKCiAgICAJCXZhciBjb2VmZiA9IHRoaXMuY29lZmZpY2llbnRzOwoKICAgIAkJLy8gYmFuZCAwCiAgICAJCXRhcmdldC5jb3B5KCBjb2VmZlsgMCBdICkubXVsdGlwbHlTY2FsYXIoIDAuODg2MjI3ICk7IC8vIM+AICogMC4yODIwOTUKCiAgICAJCS8vIGJhbmQgMQogICAgCQl0YXJnZXQuYWRkU2NhbGUoIGNvZWZmWyAxIF0sIDIuMCAqIDAuNTExNjY0ICogeSApOyAvLyAoIDIgKiDPgCAvIDMgKSAqIDAuNDg4NjAzCiAgICAJCXRhcmdldC5hZGRTY2FsZSggY29lZmZbIDIgXSwgMi4wICogMC41MTE2NjQgKiB6ICk7CiAgICAJCXRhcmdldC5hZGRTY2FsZSggY29lZmZbIDMgXSwgMi4wICogMC41MTE2NjQgKiB4ICk7CgogICAgCQkvLyBiYW5kIDIKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgNCBdLCAyLjAgKiAwLjQyOTA0MyAqIHggKiB5ICk7IC8vICggz4AgLyA0ICkgKiAxLjA5MjU0OAogICAgCQl0YXJnZXQuYWRkU2NhbGUoIGNvZWZmWyA1IF0sIDIuMCAqIDAuNDI5MDQzICogeSAqIHogKTsKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgNiBdLCAwLjc0MzEyNSAqIHogKiB6IC0gMC4yNDc3MDggKTsgLy8gKCDPgCAvIDQgKSAqIDAuMzE1MzkyICogMwogICAgCQl0YXJnZXQuYWRkU2NhbGUoIGNvZWZmWyA3IF0sIDIuMCAqIDAuNDI5MDQzICogeCAqIHogKTsKICAgIAkJdGFyZ2V0LmFkZFNjYWxlKCBjb2VmZlsgOCBdLCAwLjQyOTA0MyAqICggeCAqIHggLSB5ICogeSApICk7IC8vICggz4AgLyA0ICkgKiAwLjU0NjI3NAoKICAgIAkJcmV0dXJuIHRhcmdldDsKCiAgICAJfSwKCiAgICAJYWRkOiBmdW5jdGlvbiAoIHNoICkgewoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHsKCiAgICAJCQl0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmFkZCggc2guY29lZmZpY2llbnRzWyBpIF0gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKCiAgICAJc2NhbGU6IGZ1bmN0aW9uICggcyApIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CgogICAgCQkJdGhpcy5jb2VmZmljaWVudHNbIGkgXS5tdWx0aXBseVNjYWxhciggcyApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWxlcnA6IGZ1bmN0aW9uICggc2gsIGFscGhhICkgewoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHsKCiAgICAJCQl0aGlzLmNvZWZmaWNpZW50c1sgaSBdLmxlcnAoIHNoLmNvZWZmaWNpZW50c1sgaSBdLCBhbHBoYSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWVxdWFsczogZnVuY3Rpb24gKCBzaCApIHsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CgogICAgCQkJaWYgKCAhIHRoaXMuY29lZmZpY2llbnRzWyBpIF0uZXF1YWxzKCBzaC5jb2VmZmljaWVudHNbIGkgXSApICkgewoKICAgIAkJCQlyZXR1cm4gZmFsc2U7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRydWU7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc2ggKSB7CgogICAgCQlyZXR1cm4gdGhpcy5zZXQoIHNoLmNvZWZmaWNpZW50cyApOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9LAoKICAgIAlmcm9tQXJyYXk6IGZ1bmN0aW9uICggYXJyYXksIG9mZnNldCApIHsKCiAgICAJCWlmICggb2Zmc2V0ID09PSB1bmRlZmluZWQgKSBvZmZzZXQgPSAwOwoKICAgIAkJdmFyIGNvZWZmaWNpZW50cyA9IHRoaXMuY29lZmZpY2llbnRzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpIDwgOTsgaSArKyApIHsKCiAgICAJCQljb2VmZmljaWVudHNbIGkgXS5mcm9tQXJyYXkoIGFycmF5LCBvZmZzZXQgKyAoIGkgKiAzICkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0FycmF5OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQlpZiAoIGFycmF5ID09PSB1bmRlZmluZWQgKSBhcnJheSA9IFtdOwogICAgCQlpZiAoIG9mZnNldCA9PT0gdW5kZWZpbmVkICkgb2Zmc2V0ID0gMDsKCiAgICAJCXZhciBjb2VmZmljaWVudHMgPSB0aGlzLmNvZWZmaWNpZW50czsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSA8IDk7IGkgKysgKSB7CgogICAgCQkJY29lZmZpY2llbnRzWyBpIF0udG9BcnJheSggYXJyYXksIG9mZnNldCArICggaSAqIDMgKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGFycmF5OwoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbEhhcm1vbmljczMsIHsKCiAgICAJLy8gZXZhbHVhdGUgdGhlIGJhc2lzIGZ1bmN0aW9ucwogICAgCS8vIHNoQmFzaXMgaXMgYW4gQXJyYXlbIDkgXQogICAgCWdldEJhc2lzQXQ6IGZ1bmN0aW9uICggbm9ybWFsLCBzaEJhc2lzICkgewoKICAgIAkJLy8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gYmUgdW5pdCBsZW5ndGgKCiAgICAJCXZhciB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OwoKICAgIAkJLy8gYmFuZCAwCiAgICAJCXNoQmFzaXNbIDAgXSA9IDAuMjgyMDk1OwoKICAgIAkJLy8gYmFuZCAxCiAgICAJCXNoQmFzaXNbIDEgXSA9IDAuNDg4NjAzICogeTsKICAgIAkJc2hCYXNpc1sgMiBdID0gMC40ODg2MDMgKiB6OwogICAgCQlzaEJhc2lzWyAzIF0gPSAwLjQ4ODYwMyAqIHg7CgogICAgCQkvLyBiYW5kIDIKICAgIAkJc2hCYXNpc1sgNCBdID0gMS4wOTI1NDggKiB4ICogeTsKICAgIAkJc2hCYXNpc1sgNSBdID0gMS4wOTI1NDggKiB5ICogejsKICAgIAkJc2hCYXNpc1sgNiBdID0gMC4zMTUzOTIgKiAoIDMgKiB6ICogeiAtIDEgKTsKICAgIAkJc2hCYXNpc1sgNyBdID0gMS4wOTI1NDggKiB4ICogejsKICAgIAkJc2hCYXNpc1sgOCBdID0gMC41NDYyNzQgKiAoIHggKiB4IC0geSAqIHkgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgICoKICAgICAqIEEgTGlnaHRQcm9iZSBpcyBhIHNvdXJjZSBvZiBpbmRpcmVjdC1kaWZmdXNlIGxpZ2h0CiAgICAgKi8KCiAgICBmdW5jdGlvbiBMaWdodFByb2JlKCBzaCwgaW50ZW5zaXR5ICkgewoKICAgIAlMaWdodC5jYWxsKCB0aGlzLCB1bmRlZmluZWQsIGludGVuc2l0eSApOwoKICAgIAl0aGlzLnNoID0gKCBzaCAhPT0gdW5kZWZpbmVkICkgPyBzaCA6IG5ldyBTcGhlcmljYWxIYXJtb25pY3MzKCk7CgogICAgfQoKICAgIExpZ2h0UHJvYmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHQucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IExpZ2h0UHJvYmUsCgogICAgCWlzTGlnaHRQcm9iZTogdHJ1ZSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCQlMaWdodC5wcm90b3R5cGUuY29weS5jYWxsKCB0aGlzLCBzb3VyY2UgKTsKCiAgICAJCXRoaXMuc2guY29weSggc291cmNlLnNoICk7CiAgICAJCXRoaXMuaW50ZW5zaXR5ID0gc291cmNlLmludGVuc2l0eTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl0b0pTT046IGZ1bmN0aW9uICggbWV0YSApIHsKCiAgICAJCXZhciBkYXRhID0gTGlnaHQucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQkvLyBkYXRhLnNoID0gdGhpcy5zaC50b0FycmF5KCk7IC8vIHRvZG8KCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICBmdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRQcm9iZSggc2t5Q29sb3IsIGdyb3VuZENvbG9yLCBpbnRlbnNpdHkgKSB7CgogICAgCUxpZ2h0UHJvYmUuY2FsbCggdGhpcywgdW5kZWZpbmVkLCBpbnRlbnNpdHkgKTsKCiAgICAJdmFyIGNvbG9yMSA9IG5ldyBDb2xvciQ3KCkuc2V0KCBza3lDb2xvciApOwogICAgCXZhciBjb2xvcjIgPSBuZXcgQ29sb3IkNygpLnNldCggZ3JvdW5kQ29sb3IgKTsKCiAgICAJdmFyIHNreSA9IG5ldyBWZWN0b3IzKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7CiAgICAJdmFyIGdyb3VuZCA9IG5ldyBWZWN0b3IzKCBjb2xvcjIuciwgY29sb3IyLmcsIGNvbG9yMi5iICk7CgogICAgCS8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHNob3VsZCA9IDEgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTsKICAgIAl2YXIgYzAgPSBNYXRoLnNxcnQoIE1hdGguUEkgKTsKICAgIAl2YXIgYzEgPSBjMCAqIE1hdGguc3FydCggMC43NSApOwoKICAgIAl0aGlzLnNoLmNvZWZmaWNpZW50c1sgMCBdLmNvcHkoIHNreSApLmFkZCggZ3JvdW5kICkubXVsdGlwbHlTY2FsYXIoIGMwICk7CiAgICAJdGhpcy5zaC5jb2VmZmljaWVudHNbIDEgXS5jb3B5KCBza3kgKS5zdWIoIGdyb3VuZCApLm11bHRpcGx5U2NhbGFyKCBjMSApOwoKICAgIH0KCiAgICBIZW1pc3BoZXJlTGlnaHRQcm9iZS5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaWdodFByb2JlLnByb3RvdHlwZSApLCB7CgogICAgCWNvbnN0cnVjdG9yOiBIZW1pc3BoZXJlTGlnaHRQcm9iZSwKCiAgICAJaXNIZW1pc3BoZXJlTGlnaHRQcm9iZTogdHJ1ZSwKCiAgICAJY29weTogZnVuY3Rpb24gKCBzb3VyY2UgKSB7IC8vIG1vZGlmeWluZyBjb2xvcnMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKCiAgICAJCUxpZ2h0UHJvYmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgogICAgCQl2YXIgZGF0YSA9IExpZ2h0UHJvYmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQkvLyBkYXRhLnNoID0gdGhpcy5zaC50b0FycmF5KCk7IC8vIHRvZG8KCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICBmdW5jdGlvbiBBbWJpZW50TGlnaHRQcm9iZSggY29sb3IsIGludGVuc2l0eSApIHsKCiAgICAJTGlnaHRQcm9iZS5jYWxsKCB0aGlzLCB1bmRlZmluZWQsIGludGVuc2l0eSApOwoKICAgIAl2YXIgY29sb3IxID0gbmV3IENvbG9yJDcoKS5zZXQoIGNvbG9yICk7CgogICAgCS8vIHdpdGhvdXQgZXh0cmEgZmFjdG9yIG9mIFBJIGluIHRoZSBzaGFkZXIsIHdvdWxkIGJlIDIgLyBNYXRoLnNxcnQoIE1hdGguUEkgKTsKICAgIAl0aGlzLnNoLmNvZWZmaWNpZW50c1sgMCBdLnNldCggY29sb3IxLnIsIGNvbG9yMS5nLCBjb2xvcjEuYiApLm11bHRpcGx5U2NhbGFyKCAyICogTWF0aC5zcXJ0KCBNYXRoLlBJICkgKTsKCiAgICB9CgogICAgQW1iaWVudExpZ2h0UHJvYmUucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggTGlnaHRQcm9iZS5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQW1iaWVudExpZ2h0UHJvYmUsCgogICAgCWlzQW1iaWVudExpZ2h0UHJvYmU6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgeyAvLyBtb2RpZnlpbmcgY29sb3Igbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQKCiAgICAJCUxpZ2h0UHJvYmUucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdG9KU09OOiBmdW5jdGlvbiAoIG1ldGEgKSB7CgogICAgCQl2YXIgZGF0YSA9IExpZ2h0UHJvYmUucHJvdG90eXBlLnRvSlNPTi5jYWxsKCB0aGlzLCBtZXRhICk7CgogICAgCQkvLyBkYXRhLnNoID0gdGhpcy5zaC50b0FycmF5KCk7IC8vIHRvZG8KCiAgICAJCXJldHVybiBkYXRhOwoKICAgIAl9CgogICAgfSApOwoKICAgIHZhciBfZXllUmlnaHQgPSBuZXcgTWF0cml4NCgpOwogICAgdmFyIF9leWVMZWZ0ID0gbmV3IE1hdHJpeDQoKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBTdGVyZW9DYW1lcmEoKSB7CgogICAgCXRoaXMudHlwZSA9ICdTdGVyZW9DYW1lcmEnOwoKICAgIAl0aGlzLmFzcGVjdCA9IDE7CgogICAgCXRoaXMuZXllU2VwID0gMC4wNjQ7CgogICAgCXRoaXMuY2FtZXJhTCA9IG5ldyBQZXJzcGVjdGl2ZUNhbWVyYSgpOwogICAgCXRoaXMuY2FtZXJhTC5sYXllcnMuZW5hYmxlKCAxICk7CiAgICAJdGhpcy5jYW1lcmFMLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCiAgICAJdGhpcy5jYW1lcmFSID0gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKCk7CiAgICAJdGhpcy5jYW1lcmFSLmxheWVycy5lbmFibGUoIDIgKTsKICAgIAl0aGlzLmNhbWVyYVIubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKICAgIAl0aGlzLl9jYWNoZSA9IHsKICAgIAkJZm9jdXM6IG51bGwsCiAgICAJCWZvdjogbnVsbCwKICAgIAkJYXNwZWN0OiBudWxsLAogICAgCQluZWFyOiBudWxsLAogICAgCQlmYXI6IG51bGwsCiAgICAJCXpvb206IG51bGwsCiAgICAJCWV5ZVNlcDogbnVsbAogICAgCX07CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFN0ZXJlb0NhbWVyYS5wcm90b3R5cGUsIHsKCiAgICAJdXBkYXRlOiBmdW5jdGlvbiAoIGNhbWVyYSApIHsKCiAgICAJCXZhciBjYWNoZSA9IHRoaXMuX2NhY2hlOwoKICAgIAkJdmFyIG5lZWRzVXBkYXRlID0gY2FjaGUuZm9jdXMgIT09IGNhbWVyYS5mb2N1cyB8fCBjYWNoZS5mb3YgIT09IGNhbWVyYS5mb3YgfHwKICAgIAkJCWNhY2hlLmFzcGVjdCAhPT0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0IHx8IGNhY2hlLm5lYXIgIT09IGNhbWVyYS5uZWFyIHx8CiAgICAJCQljYWNoZS5mYXIgIT09IGNhbWVyYS5mYXIgfHwgY2FjaGUuem9vbSAhPT0gY2FtZXJhLnpvb20gfHwgY2FjaGUuZXllU2VwICE9PSB0aGlzLmV5ZVNlcDsKCiAgICAJCWlmICggbmVlZHNVcGRhdGUgKSB7CgogICAgCQkJY2FjaGUuZm9jdXMgPSBjYW1lcmEuZm9jdXM7CiAgICAJCQljYWNoZS5mb3YgPSBjYW1lcmEuZm92OwogICAgCQkJY2FjaGUuYXNwZWN0ID0gY2FtZXJhLmFzcGVjdCAqIHRoaXMuYXNwZWN0OwogICAgCQkJY2FjaGUubmVhciA9IGNhbWVyYS5uZWFyOwogICAgCQkJY2FjaGUuZmFyID0gY2FtZXJhLmZhcjsKICAgIAkJCWNhY2hlLnpvb20gPSBjYW1lcmEuem9vbTsKICAgIAkJCWNhY2hlLmV5ZVNlcCA9IHRoaXMuZXllU2VwOwoKICAgIAkJCS8vIE9mZi1heGlzIHN0ZXJlb3Njb3BpYyBlZmZlY3QgYmFzZWQgb24KICAgIAkJCS8vIGh0dHA6Ly9wYXVsYm91cmtlLm5ldC9zdGVyZW9ncmFwaGljcy9zdGVyZW9yZW5kZXIvCgogICAgCQkJdmFyIHByb2plY3Rpb25NYXRyaXggPSBjYW1lcmEucHJvamVjdGlvbk1hdHJpeC5jbG9uZSgpOwogICAgCQkJdmFyIGV5ZVNlcEhhbGYgPSBjYWNoZS5leWVTZXAgLyAyOwogICAgCQkJdmFyIGV5ZVNlcE9uUHJvamVjdGlvbiA9IGV5ZVNlcEhhbGYgKiBjYWNoZS5uZWFyIC8gY2FjaGUuZm9jdXM7CiAgICAJCQl2YXIgeW1heCA9ICggY2FjaGUubmVhciAqIE1hdGgudGFuKCBfTWF0aC5ERUcyUkFEICogY2FjaGUuZm92ICogMC41ICkgKSAvIGNhY2hlLnpvb207CiAgICAJCQl2YXIgeG1pbiwgeG1heDsKCiAgICAJCQkvLyB0cmFuc2xhdGUgeE9mZnNldAoKICAgIAkJCV9leWVMZWZ0LmVsZW1lbnRzWyAxMiBdID0gLSBleWVTZXBIYWxmOwogICAgCQkJX2V5ZVJpZ2h0LmVsZW1lbnRzWyAxMiBdID0gZXllU2VwSGFsZjsKCiAgICAJCQkvLyBmb3IgbGVmdCBleWUKCiAgICAJCQl4bWluID0gLSB5bWF4ICogY2FjaGUuYXNwZWN0ICsgZXllU2VwT25Qcm9qZWN0aW9uOwogICAgCQkJeG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgKyBleWVTZXBPblByb2plY3Rpb247CgogICAgCQkJcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIGNhY2hlLm5lYXIgLyAoIHhtYXggLSB4bWluICk7CiAgICAJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7CgogICAgCQkJdGhpcy5jYW1lcmFMLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApOwoKICAgIAkJCS8vIGZvciByaWdodCBleWUKCiAgICAJCQl4bWluID0gLSB5bWF4ICogY2FjaGUuYXNwZWN0IC0gZXllU2VwT25Qcm9qZWN0aW9uOwogICAgCQkJeG1heCA9IHltYXggKiBjYWNoZS5hc3BlY3QgLSBleWVTZXBPblByb2plY3Rpb247CgogICAgCQkJcHJvamVjdGlvbk1hdHJpeC5lbGVtZW50c1sgMCBdID0gMiAqIGNhY2hlLm5lYXIgLyAoIHhtYXggLSB4bWluICk7CiAgICAJCQlwcm9qZWN0aW9uTWF0cml4LmVsZW1lbnRzWyA4IF0gPSAoIHhtYXggKyB4bWluICkgLyAoIHhtYXggLSB4bWluICk7CgogICAgCQkJdGhpcy5jYW1lcmFSLnByb2plY3Rpb25NYXRyaXguY29weSggcHJvamVjdGlvbk1hdHJpeCApOwoKICAgIAkJfQoKICAgIAkJdGhpcy5jYW1lcmFMLm1hdHJpeFdvcmxkLmNvcHkoIGNhbWVyYS5tYXRyaXhXb3JsZCApLm11bHRpcGx5KCBfZXllTGVmdCApOwogICAgCQl0aGlzLmNhbWVyYVIubWF0cml4V29ybGQuY29weSggY2FtZXJhLm1hdHJpeFdvcmxkICkubXVsdGlwbHkoIF9leWVSaWdodCApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIENsb2NrKCBhdXRvU3RhcnQgKSB7CgogICAgCXRoaXMuYXV0b1N0YXJ0ID0gKCBhdXRvU3RhcnQgIT09IHVuZGVmaW5lZCApID8gYXV0b1N0YXJ0IDogdHJ1ZTsKCiAgICAJdGhpcy5zdGFydFRpbWUgPSAwOwogICAgCXRoaXMub2xkVGltZSA9IDA7CiAgICAJdGhpcy5lbGFwc2VkVGltZSA9IDA7CgogICAgCXRoaXMucnVubmluZyA9IGZhbHNlOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBDbG9jay5wcm90b3R5cGUsIHsKCiAgICAJc3RhcnQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMuc3RhcnRUaW1lID0gKCB0eXBlb2YgcGVyZm9ybWFuY2UgPT09ICd1bmRlZmluZWQnID8gRGF0ZSA6IHBlcmZvcm1hbmNlICkubm93KCk7IC8vIHNlZSAjMTA3MzIKCiAgICAJCXRoaXMub2xkVGltZSA9IHRoaXMuc3RhcnRUaW1lOwogICAgCQl0aGlzLmVsYXBzZWRUaW1lID0gMDsKICAgIAkJdGhpcy5ydW5uaW5nID0gdHJ1ZTsKCiAgICAJfSwKCiAgICAJc3RvcDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5nZXRFbGFwc2VkVGltZSgpOwogICAgCQl0aGlzLnJ1bm5pbmcgPSBmYWxzZTsKICAgIAkJdGhpcy5hdXRvU3RhcnQgPSBmYWxzZTsKCiAgICAJfSwKCiAgICAJZ2V0RWxhcHNlZFRpbWU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXRoaXMuZ2V0RGVsdGEoKTsKICAgIAkJcmV0dXJuIHRoaXMuZWxhcHNlZFRpbWU7CgogICAgCX0sCgogICAgCWdldERlbHRhOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgZGlmZiA9IDA7CgogICAgCQlpZiAoIHRoaXMuYXV0b1N0YXJ0ICYmICEgdGhpcy5ydW5uaW5nICkgewoKICAgIAkJCXRoaXMuc3RhcnQoKTsKICAgIAkJCXJldHVybiAwOwoKICAgIAkJfQoKICAgIAkJaWYgKCB0aGlzLnJ1bm5pbmcgKSB7CgogICAgCQkJdmFyIG5ld1RpbWUgPSAoIHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gJ3VuZGVmaW5lZCcgPyBEYXRlIDogcGVyZm9ybWFuY2UgKS5ub3coKTsKCiAgICAJCQlkaWZmID0gKCBuZXdUaW1lIC0gdGhpcy5vbGRUaW1lICkgLyAxMDAwOwogICAgCQkJdGhpcy5vbGRUaW1lID0gbmV3VGltZTsKCiAgICAJCQl0aGlzLmVsYXBzZWRUaW1lICs9IGRpZmY7CgogICAgCQl9CgogICAgCQlyZXR1cm4gZGlmZjsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICB2YXIgX3Bvc2l0aW9uJDIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9xdWF0ZXJuaW9uJDMgPSBuZXcgUXVhdGVybmlvbigpOwogICAgdmFyIF9zY2FsZSQxID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfb3JpZW50YXRpb24gPSBuZXcgVmVjdG9yMygpOwoKICAgIGZ1bmN0aW9uIEF1ZGlvTGlzdGVuZXIoKSB7CgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy50eXBlID0gJ0F1ZGlvTGlzdGVuZXInOwoKICAgIAl0aGlzLmNvbnRleHQgPSBBdWRpb0NvbnRleHQuZ2V0Q29udGV4dCgpOwoKICAgIAl0aGlzLmdhaW4gPSB0aGlzLmNvbnRleHQuY3JlYXRlR2FpbigpOwogICAgCXRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKCiAgICAJdGhpcy5maWx0ZXIgPSBudWxsOwoKICAgIAl0aGlzLnRpbWVEZWx0YSA9IDA7CgogICAgCS8vIHByaXZhdGUKCiAgICAJdGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2soKTsKCiAgICB9CgogICAgQXVkaW9MaXN0ZW5lci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQXVkaW9MaXN0ZW5lciwKCiAgICAJZ2V0SW5wdXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmdhaW47CgogICAgCX0sCgogICAgCXJlbW92ZUZpbHRlcjogZnVuY3Rpb24gKCApIHsKCiAgICAJCWlmICggdGhpcy5maWx0ZXIgIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5nYWluLmRpc2Nvbm5lY3QoIHRoaXMuZmlsdGVyICk7CiAgICAJCQl0aGlzLmZpbHRlci5kaXNjb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKICAgIAkJCXRoaXMuZ2Fpbi5jb25uZWN0KCB0aGlzLmNvbnRleHQuZGVzdGluYXRpb24gKTsKICAgIAkJCXRoaXMuZmlsdGVyID0gbnVsbDsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmZpbHRlcjsKCiAgICAJfSwKCiAgICAJc2V0RmlsdGVyOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJaWYgKCB0aGlzLmZpbHRlciAhPT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5maWx0ZXIgKTsKICAgIAkJCXRoaXMuZmlsdGVyLmRpc2Nvbm5lY3QoIHRoaXMuY29udGV4dC5kZXN0aW5hdGlvbiApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0aGlzLmdhaW4uZGlzY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7CgogICAgCQl9CgogICAgCQl0aGlzLmZpbHRlciA9IHZhbHVlOwogICAgCQl0aGlzLmdhaW4uY29ubmVjdCggdGhpcy5maWx0ZXIgKTsKICAgIAkJdGhpcy5maWx0ZXIuY29ubmVjdCggdGhpcy5jb250ZXh0LmRlc3RpbmF0aW9uICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZ2V0TWFzdGVyVm9sdW1lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5nYWluLmdhaW4udmFsdWU7CgogICAgCX0sCgogICAgCXNldE1hc3RlclZvbHVtZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCXRoaXMuZ2Fpbi5nYWluLnNldFRhcmdldEF0VGltZSggdmFsdWUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXVwZGF0ZU1hdHJpeFdvcmxkOiBmdW5jdGlvbiAoIGZvcmNlICkgewoKICAgIAkJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgogICAgCQl2YXIgbGlzdGVuZXIgPSB0aGlzLmNvbnRleHQubGlzdGVuZXI7CiAgICAJCXZhciB1cCA9IHRoaXMudXA7CgogICAgCQl0aGlzLnRpbWVEZWx0YSA9IHRoaXMuX2Nsb2NrLmdldERlbHRhKCk7CgogICAgCQl0aGlzLm1hdHJpeFdvcmxkLmRlY29tcG9zZSggX3Bvc2l0aW9uJDIsIF9xdWF0ZXJuaW9uJDMsIF9zY2FsZSQxICk7CgogICAgCQlfb3JpZW50YXRpb24uc2V0KCAwLCAwLCAtIDEgKS5hcHBseVF1YXRlcm5pb24oIF9xdWF0ZXJuaW9uJDMgKTsKCiAgICAJCWlmICggbGlzdGVuZXIucG9zaXRpb25YICkgewoKICAgIAkJCS8vIGNvZGUgcGF0aCBmb3IgQ2hyb21lIChzZWUgIzE0MzkzKQoKICAgIAkJCXZhciBlbmRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lICsgdGhpcy50aW1lRGVsdGE7CgogICAgCQkJbGlzdGVuZXIucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMi54LCBlbmRUaW1lICk7CiAgICAJCQlsaXN0ZW5lci5wb3NpdGlvblkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9wb3NpdGlvbiQyLnksIGVuZFRpbWUgKTsKICAgIAkJCWxpc3RlbmVyLnBvc2l0aW9uWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX3Bvc2l0aW9uJDIueiwgZW5kVGltZSApOwogICAgCQkJbGlzdGVuZXIuZm9yd2FyZFgubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIF9vcmllbnRhdGlvbi54LCBlbmRUaW1lICk7CiAgICAJCQlsaXN0ZW5lci5mb3J3YXJkWS5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggX29yaWVudGF0aW9uLnksIGVuZFRpbWUgKTsKICAgIAkJCWxpc3RlbmVyLmZvcndhcmRaLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24ueiwgZW5kVGltZSApOwogICAgCQkJbGlzdGVuZXIudXBYLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCB1cC54LCBlbmRUaW1lICk7CiAgICAJCQlsaXN0ZW5lci51cFkubGluZWFyUmFtcFRvVmFsdWVBdFRpbWUoIHVwLnksIGVuZFRpbWUgKTsKICAgIAkJCWxpc3RlbmVyLnVwWi5saW5lYXJSYW1wVG9WYWx1ZUF0VGltZSggdXAueiwgZW5kVGltZSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQlsaXN0ZW5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uJDIueCwgX3Bvc2l0aW9uJDIueSwgX3Bvc2l0aW9uJDIueiApOwogICAgCQkJbGlzdGVuZXIuc2V0T3JpZW50YXRpb24oIF9vcmllbnRhdGlvbi54LCBfb3JpZW50YXRpb24ueSwgX29yaWVudGF0aW9uLnosIHVwLngsIHVwLnksIHVwLnogKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIFJlZWNlIEFhcm9uIExlY3JpdmFpbiAvIGh0dHA6Ly9yZWVjZW5vdGVzLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIEF1ZGlvKCBsaXN0ZW5lciApIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLnR5cGUgPSAnQXVkaW8nOwoKICAgIAl0aGlzLmxpc3RlbmVyID0gbGlzdGVuZXI7CiAgICAJdGhpcy5jb250ZXh0ID0gbGlzdGVuZXIuY29udGV4dDsKCiAgICAJdGhpcy5nYWluID0gdGhpcy5jb250ZXh0LmNyZWF0ZUdhaW4oKTsKICAgIAl0aGlzLmdhaW4uY29ubmVjdCggbGlzdGVuZXIuZ2V0SW5wdXQoKSApOwoKICAgIAl0aGlzLmF1dG9wbGF5ID0gZmFsc2U7CgogICAgCXRoaXMuYnVmZmVyID0gbnVsbDsKICAgIAl0aGlzLmRldHVuZSA9IDA7CiAgICAJdGhpcy5sb29wID0gZmFsc2U7CiAgICAJdGhpcy5zdGFydFRpbWUgPSAwOwogICAgCXRoaXMub2Zmc2V0ID0gMDsKICAgIAl0aGlzLmR1cmF0aW9uID0gdW5kZWZpbmVkOwogICAgCXRoaXMucGxheWJhY2tSYXRlID0gMTsKICAgIAl0aGlzLmlzUGxheWluZyA9IGZhbHNlOwogICAgCXRoaXMuaGFzUGxheWJhY2tDb250cm9sID0gdHJ1ZTsKICAgIAl0aGlzLnNvdXJjZVR5cGUgPSAnZW1wdHknOwoKICAgIAl0aGlzLmZpbHRlcnMgPSBbXTsKCiAgICB9CgogICAgQXVkaW8ucHJvdG90eXBlID0gT2JqZWN0LmFzc2lnbiggT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEF1ZGlvLAoKICAgIAlnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmdhaW47CgogICAgCX0sCgogICAgCXNldE5vZGVTb3VyY2U6IGZ1bmN0aW9uICggYXVkaW9Ob2RlICkgewoKICAgIAkJdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTsKICAgIAkJdGhpcy5zb3VyY2VUeXBlID0gJ2F1ZGlvTm9kZSc7CiAgICAJCXRoaXMuc291cmNlID0gYXVkaW9Ob2RlOwogICAgCQl0aGlzLmNvbm5lY3QoKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXRNZWRpYUVsZW1lbnRTb3VyY2U6IGZ1bmN0aW9uICggbWVkaWFFbGVtZW50ICkgewoKICAgIAkJdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPSBmYWxzZTsKICAgIAkJdGhpcy5zb3VyY2VUeXBlID0gJ21lZGlhTm9kZSc7CiAgICAJCXRoaXMuc291cmNlID0gdGhpcy5jb250ZXh0LmNyZWF0ZU1lZGlhRWxlbWVudFNvdXJjZSggbWVkaWFFbGVtZW50ICk7CiAgICAJCXRoaXMuY29ubmVjdCgpOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEJ1ZmZlcjogZnVuY3Rpb24gKCBhdWRpb0J1ZmZlciApIHsKCiAgICAJCXRoaXMuYnVmZmVyID0gYXVkaW9CdWZmZXI7CiAgICAJCXRoaXMuc291cmNlVHlwZSA9ICdidWZmZXInOwoKICAgIAkJaWYgKCB0aGlzLmF1dG9wbGF5ICkgdGhpcy5wbGF5KCk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJcGxheTogZnVuY3Rpb24gKCkgewoKICAgIAkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogQXVkaW8gaXMgYWxyZWFkeSBwbGF5aW5nLicgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCXZhciBzb3VyY2UgPSB0aGlzLmNvbnRleHQuY3JlYXRlQnVmZmVyU291cmNlKCk7CgogICAgCQlzb3VyY2UuYnVmZmVyID0gdGhpcy5idWZmZXI7CiAgICAJCXNvdXJjZS5sb29wID0gdGhpcy5sb29wOwogICAgCQlzb3VyY2Uub25lbmRlZCA9IHRoaXMub25FbmRlZC5iaW5kKCB0aGlzICk7CiAgICAJCXRoaXMuc3RhcnRUaW1lID0gdGhpcy5jb250ZXh0LmN1cnJlbnRUaW1lOwogICAgCQlzb3VyY2Uuc3RhcnQoIHRoaXMuc3RhcnRUaW1lLCB0aGlzLm9mZnNldCwgdGhpcy5kdXJhdGlvbiApOwoKICAgIAkJdGhpcy5pc1BsYXlpbmcgPSB0cnVlOwoKICAgIAkJdGhpcy5zb3VyY2UgPSBzb3VyY2U7CgogICAgCQl0aGlzLnNldERldHVuZSggdGhpcy5kZXR1bmUgKTsKICAgIAkJdGhpcy5zZXRQbGF5YmFja1JhdGUoIHRoaXMucGxheWJhY2tSYXRlICk7CgogICAgCQlyZXR1cm4gdGhpcy5jb25uZWN0KCk7CgogICAgCX0sCgogICAgCXBhdXNlOiBmdW5jdGlvbiAoKSB7CgogICAgCQlpZiAoIHRoaXMuaGFzUGxheWJhY2tDb250cm9sID09PSBmYWxzZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5BdWRpbzogdGhpcyBBdWRpbyBoYXMgbm8gcGxheWJhY2sgY29udHJvbC4nICk7CiAgICAJCQlyZXR1cm47CgogICAgCQl9CgogICAgCQlpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkgewoKICAgIAkJCXRoaXMuc291cmNlLnN0b3AoKTsKICAgIAkJCXRoaXMuc291cmNlLm9uZW5kZWQgPSBudWxsOwogICAgCQkJdGhpcy5vZmZzZXQgKz0gKCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgLSB0aGlzLnN0YXJ0VGltZSApICogdGhpcy5wbGF5YmFja1JhdGU7CiAgICAJCQl0aGlzLmlzUGxheWluZyA9IGZhbHNlOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXN0b3A6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCXRoaXMuc291cmNlLnN0b3AoKTsKICAgIAkJdGhpcy5zb3VyY2Uub25lbmRlZCA9IG51bGw7CiAgICAJCXRoaXMub2Zmc2V0ID0gMDsKICAgIAkJdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljb25uZWN0OiBmdW5jdGlvbiAoKSB7CgogICAgCQlpZiAoIHRoaXMuZmlsdGVycy5sZW5ndGggPiAwICkgewoKICAgIAkJCXRoaXMuc291cmNlLmNvbm5lY3QoIHRoaXMuZmlsdGVyc1sgMCBdICk7CgogICAgCQkJZm9yICggdmFyIGkgPSAxLCBsID0gdGhpcy5maWx0ZXJzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJCXRoaXMuZmlsdGVyc1sgaSAtIDEgXS5jb25uZWN0KCB0aGlzLmZpbHRlcnNbIGkgXSApOwoKICAgIAkJCX0KCiAgICAJCQl0aGlzLmZpbHRlcnNbIHRoaXMuZmlsdGVycy5sZW5ndGggLSAxIF0uY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0aGlzLnNvdXJjZS5jb25uZWN0KCB0aGlzLmdldE91dHB1dCgpICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZGlzY29ubmVjdDogZnVuY3Rpb24gKCkgewoKICAgIAkJaWYgKCB0aGlzLmZpbHRlcnMubGVuZ3RoID4gMCApIHsKCiAgICAJCQl0aGlzLnNvdXJjZS5kaXNjb25uZWN0KCB0aGlzLmZpbHRlcnNbIDAgXSApOwoKICAgIAkJCWZvciAoIHZhciBpID0gMSwgbCA9IHRoaXMuZmlsdGVycy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCQl0aGlzLmZpbHRlcnNbIGkgLSAxIF0uZGlzY29ubmVjdCggdGhpcy5maWx0ZXJzWyBpIF0gKTsKCiAgICAJCQl9CgogICAgCQkJdGhpcy5maWx0ZXJzWyB0aGlzLmZpbHRlcnMubGVuZ3RoIC0gMSBdLmRpc2Nvbm5lY3QoIHRoaXMuZ2V0T3V0cHV0KCkgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdGhpcy5zb3VyY2UuZGlzY29ubmVjdCggdGhpcy5nZXRPdXRwdXQoKSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldEZpbHRlcnM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmZpbHRlcnM7CgogICAgCX0sCgogICAgCXNldEZpbHRlcnM6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQlpZiAoICEgdmFsdWUgKSB2YWx1ZSA9IFtdOwoKICAgIAkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKCiAgICAJCQl0aGlzLmRpc2Nvbm5lY3QoKTsKICAgIAkJCXRoaXMuZmlsdGVycyA9IHZhbHVlOwogICAgCQkJdGhpcy5jb25uZWN0KCk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXRoaXMuZmlsdGVycyA9IHZhbHVlOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldERldHVuZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCXRoaXMuZGV0dW5lID0gdmFsdWU7CgogICAgCQlpZiAoIHRoaXMuc291cmNlLmRldHVuZSA9PT0gdW5kZWZpbmVkICkgcmV0dXJuOyAvLyBvbmx5IHNldCBkZXR1bmUgd2hlbiBhdmFpbGFibGUKCiAgICAJCWlmICggdGhpcy5pc1BsYXlpbmcgPT09IHRydWUgKSB7CgogICAgCQkJdGhpcy5zb3VyY2UuZGV0dW5lLnNldFRhcmdldEF0VGltZSggdGhpcy5kZXR1bmUsIHRoaXMuY29udGV4dC5jdXJyZW50VGltZSwgMC4wMSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldERldHVuZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuZGV0dW5lOwoKICAgIAl9LAoKICAgIAlnZXRGaWx0ZXI6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLmdldEZpbHRlcnMoKVsgMCBdOwoKICAgIAl9LAoKICAgIAlzZXRGaWx0ZXI6IGZ1bmN0aW9uICggZmlsdGVyICkgewoKICAgIAkJcmV0dXJuIHRoaXMuc2V0RmlsdGVycyggZmlsdGVyID8gWyBmaWx0ZXIgXSA6IFtdICk7CgogICAgCX0sCgogICAgCXNldFBsYXliYWNrUmF0ZTogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCXRoaXMucGxheWJhY2tSYXRlID0gdmFsdWU7CgogICAgCQlpZiAoIHRoaXMuaXNQbGF5aW5nID09PSB0cnVlICkgewoKICAgIAkJCXRoaXMuc291cmNlLnBsYXliYWNrUmF0ZS5zZXRUYXJnZXRBdFRpbWUoIHRoaXMucGxheWJhY2tSYXRlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlnZXRQbGF5YmFja1JhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLnBsYXliYWNrUmF0ZTsKCiAgICAJfSwKCiAgICAJb25FbmRlZDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5pc1BsYXlpbmcgPSBmYWxzZTsKCiAgICAJfSwKCiAgICAJZ2V0TG9vcDogZnVuY3Rpb24gKCkgewoKICAgIAkJaWYgKCB0aGlzLmhhc1BsYXliYWNrQ29udHJvbCA9PT0gZmFsc2UgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQXVkaW86IHRoaXMgQXVkaW8gaGFzIG5vIHBsYXliYWNrIGNvbnRyb2wuJyApOwogICAgCQkJcmV0dXJuIGZhbHNlOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXMubG9vcDsKCiAgICAJfSwKCiAgICAJc2V0TG9vcDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IGZhbHNlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiB0aGlzIEF1ZGlvIGhhcyBubyBwbGF5YmFjayBjb250cm9sLicgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCXRoaXMubG9vcCA9IHZhbHVlOwoKICAgIAkJaWYgKCB0aGlzLmlzUGxheWluZyA9PT0gdHJ1ZSApIHsKCiAgICAJCQl0aGlzLnNvdXJjZS5sb29wID0gdGhpcy5sb29wOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldFZvbHVtZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuZ2Fpbi5nYWluLnZhbHVlOwoKICAgIAl9LAoKICAgIAlzZXRWb2x1bWU6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQl0aGlzLmdhaW4uZ2Fpbi5zZXRUYXJnZXRBdFRpbWUoIHZhbHVlLCB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUsIDAuMDEgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqLwoKICAgIHZhciBfcG9zaXRpb24kMyA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3F1YXRlcm5pb24kNCA9IG5ldyBRdWF0ZXJuaW9uKCk7CiAgICB2YXIgX3NjYWxlJDIgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9vcmllbnRhdGlvbiQxID0gbmV3IFZlY3RvcjMoKTsKCiAgICBmdW5jdGlvbiBQb3NpdGlvbmFsQXVkaW8oIGxpc3RlbmVyICkgewoKICAgIAlBdWRpby5jYWxsKCB0aGlzLCBsaXN0ZW5lciApOwoKICAgIAl0aGlzLnBhbm5lciA9IHRoaXMuY29udGV4dC5jcmVhdGVQYW5uZXIoKTsKICAgIAl0aGlzLnBhbm5lci5wYW5uaW5nTW9kZWwgPSAnSFJURic7CiAgICAJdGhpcy5wYW5uZXIuY29ubmVjdCggdGhpcy5nYWluICk7CgogICAgfQoKICAgIFBvc2l0aW9uYWxBdWRpby5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBBdWRpby5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogUG9zaXRpb25hbEF1ZGlvLAoKICAgIAlnZXRPdXRwdXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLnBhbm5lcjsKCiAgICAJfSwKCiAgICAJZ2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLnBhbm5lci5yZWZEaXN0YW5jZTsKCiAgICAJfSwKCiAgICAJc2V0UmVmRGlzdGFuY2U6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQl0aGlzLnBhbm5lci5yZWZEaXN0YW5jZSA9IHZhbHVlOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldFJvbGxvZmZGYWN0b3I6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLnBhbm5lci5yb2xsb2ZmRmFjdG9yOwoKICAgIAl9LAoKICAgIAlzZXRSb2xsb2ZmRmFjdG9yOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5wYW5uZXIucm9sbG9mZkZhY3RvciA9IHZhbHVlOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldERpc3RhbmNlTW9kZWw6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLnBhbm5lci5kaXN0YW5jZU1vZGVsOwoKICAgIAl9LAoKICAgIAlzZXREaXN0YW5jZU1vZGVsOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5wYW5uZXIuZGlzdGFuY2VNb2RlbCA9IHZhbHVlOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5wYW5uZXIubWF4RGlzdGFuY2U7CgogICAgCX0sCgogICAgCXNldE1heERpc3RhbmNlOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJdGhpcy5wYW5uZXIubWF4RGlzdGFuY2UgPSB2YWx1ZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzZXREaXJlY3Rpb25hbENvbmU6IGZ1bmN0aW9uICggY29uZUlubmVyQW5nbGUsIGNvbmVPdXRlckFuZ2xlLCBjb25lT3V0ZXJHYWluICkgewoKICAgIAkJdGhpcy5wYW5uZXIuY29uZUlubmVyQW5nbGUgPSBjb25lSW5uZXJBbmdsZTsKICAgIAkJdGhpcy5wYW5uZXIuY29uZU91dGVyQW5nbGUgPSBjb25lT3V0ZXJBbmdsZTsKICAgIAkJdGhpcy5wYW5uZXIuY29uZU91dGVyR2FpbiA9IGNvbmVPdXRlckdhaW47CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdXBkYXRlTWF0cml4V29ybGQ6IGZ1bmN0aW9uICggZm9yY2UgKSB7CgogICAgCQlPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTsKCiAgICAJCWlmICggdGhpcy5oYXNQbGF5YmFja0NvbnRyb2wgPT09IHRydWUgJiYgdGhpcy5pc1BsYXlpbmcgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJdGhpcy5tYXRyaXhXb3JsZC5kZWNvbXBvc2UoIF9wb3NpdGlvbiQzLCBfcXVhdGVybmlvbiQ0LCBfc2NhbGUkMiApOwoKICAgIAkJX29yaWVudGF0aW9uJDEuc2V0KCAwLCAwLCAxICkuYXBwbHlRdWF0ZXJuaW9uKCBfcXVhdGVybmlvbiQ0ICk7CgogICAgCQl2YXIgcGFubmVyID0gdGhpcy5wYW5uZXI7CgogICAgCQlpZiAoIHBhbm5lci5wb3NpdGlvblggKSB7CgogICAgCQkJLy8gY29kZSBwYXRoIGZvciBDaHJvbWUgYW5kIEZpcmVmb3ggKHNlZSAjMTQzOTMpCgogICAgCQkJdmFyIGVuZFRpbWUgPSB0aGlzLmNvbnRleHQuY3VycmVudFRpbWUgKyB0aGlzLmxpc3RlbmVyLnRpbWVEZWx0YTsKCiAgICAJCQlwYW5uZXIucG9zaXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMy54LCBlbmRUaW1lICk7CiAgICAJCQlwYW5uZXIucG9zaXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMy55LCBlbmRUaW1lICk7CiAgICAJCQlwYW5uZXIucG9zaXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfcG9zaXRpb24kMy56LCBlbmRUaW1lICk7CiAgICAJCQlwYW5uZXIub3JpZW50YXRpb25YLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24kMS54LCBlbmRUaW1lICk7CiAgICAJCQlwYW5uZXIub3JpZW50YXRpb25ZLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24kMS55LCBlbmRUaW1lICk7CiAgICAJCQlwYW5uZXIub3JpZW50YXRpb25aLmxpbmVhclJhbXBUb1ZhbHVlQXRUaW1lKCBfb3JpZW50YXRpb24kMS56LCBlbmRUaW1lICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXBhbm5lci5zZXRQb3NpdGlvbiggX3Bvc2l0aW9uJDMueCwgX3Bvc2l0aW9uJDMueSwgX3Bvc2l0aW9uJDMueiApOwogICAgCQkJcGFubmVyLnNldE9yaWVudGF0aW9uKCBfb3JpZW50YXRpb24kMS54LCBfb3JpZW50YXRpb24kMS55LCBfb3JpZW50YXRpb24kMS56ICk7CgogICAgCQl9CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gQXVkaW9BbmFseXNlciggYXVkaW8sIGZmdFNpemUgKSB7CgogICAgCXRoaXMuYW5hbHlzZXIgPSBhdWRpby5jb250ZXh0LmNyZWF0ZUFuYWx5c2VyKCk7CiAgICAJdGhpcy5hbmFseXNlci5mZnRTaXplID0gZmZ0U2l6ZSAhPT0gdW5kZWZpbmVkID8gZmZ0U2l6ZSA6IDIwNDg7CgogICAgCXRoaXMuZGF0YSA9IG5ldyBVaW50OEFycmF5KCB0aGlzLmFuYWx5c2VyLmZyZXF1ZW5jeUJpbkNvdW50ICk7CgogICAgCWF1ZGlvLmdldE91dHB1dCgpLmNvbm5lY3QoIHRoaXMuYW5hbHlzZXIgKTsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggQXVkaW9BbmFseXNlci5wcm90b3R5cGUsIHsKCiAgICAJZ2V0RnJlcXVlbmN5RGF0YTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5hbmFseXNlci5nZXRCeXRlRnJlcXVlbmN5RGF0YSggdGhpcy5kYXRhICk7CgogICAgCQlyZXR1cm4gdGhpcy5kYXRhOwoKICAgIAl9LAoKICAgIAlnZXRBdmVyYWdlRnJlcXVlbmN5OiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdmFsdWUgPSAwLCBkYXRhID0gdGhpcy5nZXRGcmVxdWVuY3lEYXRhKCk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQl2YWx1ZSArPSBkYXRhWyBpIF07CgogICAgCQl9CgogICAgCQlyZXR1cm4gdmFsdWUgLyBkYXRhLmxlbmd0aDsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqCiAgICAgKiBCdWZmZXJlZCBzY2VuZSBncmFwaCBwcm9wZXJ0eSB0aGF0IGFsbG93cyB3ZWlnaHRlZCBhY2N1bXVsYXRpb24uCiAgICAgKgogICAgICoKICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCiAgICAgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqLwoKICAgIGZ1bmN0aW9uIFByb3BlcnR5TWl4ZXIoIGJpbmRpbmcsIHR5cGVOYW1lLCB2YWx1ZVNpemUgKSB7CgogICAgCXRoaXMuYmluZGluZyA9IGJpbmRpbmc7CiAgICAJdGhpcy52YWx1ZVNpemUgPSB2YWx1ZVNpemU7CgogICAgCXZhciBidWZmZXJUeXBlID0gRmxvYXQ2NEFycmF5LAogICAgCQltaXhGdW5jdGlvbjsKCiAgICAJc3dpdGNoICggdHlwZU5hbWUgKSB7CgogICAgCQljYXNlICdxdWF0ZXJuaW9uJzoKICAgIAkJCW1peEZ1bmN0aW9uID0gdGhpcy5fc2xlcnA7CiAgICAJCQlicmVhazsKCiAgICAJCWNhc2UgJ3N0cmluZyc6CiAgICAJCWNhc2UgJ2Jvb2wnOgogICAgCQkJYnVmZmVyVHlwZSA9IEFycmF5OwogICAgCQkJbWl4RnVuY3Rpb24gPSB0aGlzLl9zZWxlY3Q7CiAgICAJCQlicmVhazsKCiAgICAJCWRlZmF1bHQ6CiAgICAJCQltaXhGdW5jdGlvbiA9IHRoaXMuX2xlcnA7CgogICAgCX0KCiAgICAJdGhpcy5idWZmZXIgPSBuZXcgYnVmZmVyVHlwZSggdmFsdWVTaXplICogNCApOwogICAgCS8vIGxheW91dDogWyBpbmNvbWluZyB8IGFjY3UwIHwgYWNjdTEgfCBvcmlnIF0KICAgIAkvLwogICAgCS8vIGludGVycG9sYXRvcnMgY2FuIHVzZSAuYnVmZmVyIGFzIHRoZWlyIC5yZXN1bHQKICAgIAkvLyB0aGUgZGF0YSB0aGVuIGdvZXMgdG8gJ2luY29taW5nJwogICAgCS8vCiAgICAJLy8gJ2FjY3UwJyBhbmQgJ2FjY3UxJyBhcmUgdXNlZCBmcmFtZS1pbnRlcmxlYXZlZCBmb3IKICAgIAkvLyB0aGUgY3VtdWxhdGl2ZSByZXN1bHQgYW5kIGFyZSBjb21wYXJlZCB0byBkZXRlY3QKICAgIAkvLyBjaGFuZ2VzCiAgICAJLy8KICAgIAkvLyAnb3JpZycgc3RvcmVzIHRoZSBvcmlnaW5hbCBzdGF0ZSBvZiB0aGUgcHJvcGVydHkKCiAgICAJdGhpcy5fbWl4QnVmZmVyUmVnaW9uID0gbWl4RnVuY3Rpb247CgogICAgCXRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7CgogICAgCXRoaXMudXNlQ291bnQgPSAwOwogICAgCXRoaXMucmVmZXJlbmNlQ291bnQgPSAwOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBQcm9wZXJ0eU1peGVyLnByb3RvdHlwZSwgewoKICAgIAkvLyBhY2N1bXVsYXRlIGRhdGEgaW4gdGhlICdpbmNvbWluZycgcmVnaW9uIGludG8gJ2FjY3U8aT4nCiAgICAJYWNjdW11bGF0ZTogZnVuY3Rpb24gKCBhY2N1SW5kZXgsIHdlaWdodCApIHsKCiAgICAJCS8vIG5vdGU6IGhhcHBpbHkgYWNjdW11bGF0aW5nIG5vdGhpbmcgd2hlbiB3ZWlnaHQgPSAwLCB0aGUgY2FsbGVyIGtub3dzCiAgICAJCS8vIHRoZSB3ZWlnaHQgYW5kIHNob3VsZG4ndCBoYXZlIG1hZGUgdGhlIGNhbGwgaW4gdGhlIGZpcnN0IHBsYWNlCgogICAgCQl2YXIgYnVmZmVyID0gdGhpcy5idWZmZXIsCiAgICAJCQlzdHJpZGUgPSB0aGlzLnZhbHVlU2l6ZSwKICAgIAkJCW9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSwKCiAgICAJCQljdXJyZW50V2VpZ2h0ID0gdGhpcy5jdW11bGF0aXZlV2VpZ2h0OwoKICAgIAkJaWYgKCBjdXJyZW50V2VpZ2h0ID09PSAwICkgewoKICAgIAkJCS8vIGFjY3VOIDo9IGluY29taW5nICogd2VpZ2h0CgogICAgCQkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBzdHJpZGU7ICsrIGkgKSB7CgogICAgCQkJCWJ1ZmZlclsgb2Zmc2V0ICsgaSBdID0gYnVmZmVyWyBpIF07CgogICAgCQkJfQoKICAgIAkJCWN1cnJlbnRXZWlnaHQgPSB3ZWlnaHQ7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGFjY3VOIDo9IGFjY3VOICsgaW5jb21pbmcgKiB3ZWlnaHQKCiAgICAJCQljdXJyZW50V2VpZ2h0ICs9IHdlaWdodDsKICAgIAkJCXZhciBtaXggPSB3ZWlnaHQgLyBjdXJyZW50V2VpZ2h0OwogICAgCQkJdGhpcy5fbWl4QnVmZmVyUmVnaW9uKCBidWZmZXIsIG9mZnNldCwgMCwgbWl4LCBzdHJpZGUgKTsKCiAgICAJCX0KCiAgICAJCXRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IGN1cnJlbnRXZWlnaHQ7CgogICAgCX0sCgogICAgCS8vIGFwcGx5IHRoZSBzdGF0ZSBvZiAnYWNjdTxpPicgdG8gdGhlIGJpbmRpbmcgd2hlbiBhY2N1cyBkaWZmZXIKICAgIAlhcHBseTogZnVuY3Rpb24gKCBhY2N1SW5kZXggKSB7CgogICAgCQl2YXIgc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCiAgICAJCQlidWZmZXIgPSB0aGlzLmJ1ZmZlciwKICAgIAkJCW9mZnNldCA9IGFjY3VJbmRleCAqIHN0cmlkZSArIHN0cmlkZSwKCiAgICAJCQl3ZWlnaHQgPSB0aGlzLmN1bXVsYXRpdmVXZWlnaHQsCgogICAgCQkJYmluZGluZyA9IHRoaXMuYmluZGluZzsKCiAgICAJCXRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7CgogICAgCQlpZiAoIHdlaWdodCA8IDEgKSB7CgogICAgCQkJLy8gYWNjdU4gOj0gYWNjdU4gKyBvcmlnaW5hbCAqICggMSAtIGN1bXVsYXRpdmVXZWlnaHQgKQoKICAgIAkJCXZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gc3RyaWRlICogMzsKCiAgICAJCQl0aGlzLl9taXhCdWZmZXJSZWdpb24oCiAgICAJCQkJYnVmZmVyLCBvZmZzZXQsIG9yaWdpbmFsVmFsdWVPZmZzZXQsIDEgLSB3ZWlnaHQsIHN0cmlkZSApOwoKICAgIAkJfQoKICAgIAkJZm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBzdHJpZGUgKyBzdHJpZGU7IGkgIT09IGU7ICsrIGkgKSB7CgogICAgCQkJaWYgKCBidWZmZXJbIGkgXSAhPT0gYnVmZmVyWyBpICsgc3RyaWRlIF0gKSB7CgogICAgCQkJCS8vIHZhbHVlIGhhcyBjaGFuZ2VkIC0+IHVwZGF0ZSBzY2VuZSBncmFwaAoKICAgIAkJCQliaW5kaW5nLnNldFZhbHVlKCBidWZmZXIsIG9mZnNldCApOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfSwKCiAgICAJLy8gcmVtZW1iZXIgdGhlIHN0YXRlIG9mIHRoZSBib3VuZCBwcm9wZXJ0eSBhbmQgY29weSBpdCB0byBib3RoIGFjY3VzCiAgICAJc2F2ZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBiaW5kaW5nID0gdGhpcy5iaW5kaW5nOwoKICAgIAkJdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyLAogICAgCQkJc3RyaWRlID0gdGhpcy52YWx1ZVNpemUsCgogICAgCQkJb3JpZ2luYWxWYWx1ZU9mZnNldCA9IHN0cmlkZSAqIDM7CgogICAgCQliaW5kaW5nLmdldFZhbHVlKCBidWZmZXIsIG9yaWdpbmFsVmFsdWVPZmZzZXQgKTsKCiAgICAJCS8vIGFjY3VbMC4uMV0gOj0gb3JpZyAtLSBpbml0aWFsbHkgZGV0ZWN0IGNoYW5nZXMgYWdhaW5zdCB0aGUgb3JpZ2luYWwKICAgIAkJZm9yICggdmFyIGkgPSBzdHJpZGUsIGUgPSBvcmlnaW5hbFZhbHVlT2Zmc2V0OyBpICE9PSBlOyArKyBpICkgewoKICAgIAkJCWJ1ZmZlclsgaSBdID0gYnVmZmVyWyBvcmlnaW5hbFZhbHVlT2Zmc2V0ICsgKCBpICUgc3RyaWRlICkgXTsKCiAgICAJCX0KCiAgICAJCXRoaXMuY3VtdWxhdGl2ZVdlaWdodCA9IDA7CgogICAgCX0sCgogICAgCS8vIGFwcGx5IHRoZSBzdGF0ZSBwcmV2aW91c2x5IHRha2VuIHZpYSAnc2F2ZU9yaWdpbmFsU3RhdGUnIHRvIHRoZSBiaW5kaW5nCiAgICAJcmVzdG9yZU9yaWdpbmFsU3RhdGU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBvcmlnaW5hbFZhbHVlT2Zmc2V0ID0gdGhpcy52YWx1ZVNpemUgKiAzOwogICAgCQl0aGlzLmJpbmRpbmcuc2V0VmFsdWUoIHRoaXMuYnVmZmVyLCBvcmlnaW5hbFZhbHVlT2Zmc2V0ICk7CgogICAgCX0sCgoKICAgIAkvLyBtaXggZnVuY3Rpb25zCgogICAgCV9zZWxlY3Q6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkgewoKICAgIAkJaWYgKCB0ID49IDAuNSApIHsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IHN0cmlkZTsgKysgaSApIHsKCiAgICAJCQkJYnVmZmVyWyBkc3RPZmZzZXQgKyBpIF0gPSBidWZmZXJbIHNyY09mZnNldCArIGkgXTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCV9zbGVycDogZnVuY3Rpb24gKCBidWZmZXIsIGRzdE9mZnNldCwgc3JjT2Zmc2V0LCB0ICkgewoKICAgIAkJUXVhdGVybmlvbi5zbGVycEZsYXQoIGJ1ZmZlciwgZHN0T2Zmc2V0LCBidWZmZXIsIGRzdE9mZnNldCwgYnVmZmVyLCBzcmNPZmZzZXQsIHQgKTsKCiAgICAJfSwKCiAgICAJX2xlcnA6IGZ1bmN0aW9uICggYnVmZmVyLCBkc3RPZmZzZXQsIHNyY09mZnNldCwgdCwgc3RyaWRlICkgewoKICAgIAkJdmFyIHMgPSAxIC0gdDsKCiAgICAJCWZvciAoIHZhciBpID0gMDsgaSAhPT0gc3RyaWRlOyArKyBpICkgewoKICAgIAkJCXZhciBqID0gZHN0T2Zmc2V0ICsgaTsKCiAgICAJCQlidWZmZXJbIGogXSA9IGJ1ZmZlclsgaiBdICogcyArIGJ1ZmZlclsgc3JjT2Zmc2V0ICsgaSBdICogdDsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqCiAgICAgKiBBIHJlZmVyZW5jZSB0byBhIHJlYWwgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoLgogICAgICoKICAgICAqCiAgICAgKiBAYXV0aG9yIEJlbiBIb3VzdG9uIC8gaHR0cDovL2NsYXJhLmlvLwogICAgICogQGF1dGhvciBEYXZpZCBTYXJubyAvIGh0dHA6Ly9saWdodGhhdXMudXMvCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICAvLyBDaGFyYWN0ZXJzIFtdLjovIGFyZSByZXNlcnZlZCBmb3IgdHJhY2sgYmluZGluZyBzeW50YXguCiAgICB2YXIgX1JFU0VSVkVEX0NIQVJTX1JFID0gJ1xcW1xcXVxcLjpcXC8nOwogICAgdmFyIF9yZXNlcnZlZFJlID0gbmV3IFJlZ0V4cCggJ1snICsgX1JFU0VSVkVEX0NIQVJTX1JFICsgJ10nLCAnZycgKTsKCiAgICAvLyBBdHRlbXB0cyB0byBhbGxvdyBub2RlIG5hbWVzIGZyb20gYW55IGxhbmd1YWdlLiBFUzUncyBgXHdgIHJlZ2V4cCBtYXRjaGVzCiAgICAvLyBvbmx5IGxhdGluIGNoYXJhY3RlcnMsIGFuZCB0aGUgdW5pY29kZSBccHtMfSBpcyBub3QgeWV0IHN1cHBvcnRlZC4gU28KICAgIC8vIGluc3RlYWQsIHdlIGV4Y2x1ZGUgcmVzZXJ2ZWQgY2hhcmFjdGVycyBhbmQgbWF0Y2ggZXZlcnl0aGluZyBlbHNlLgogICAgdmFyIF93b3JkQ2hhciA9ICdbXicgKyBfUkVTRVJWRURfQ0hBUlNfUkUgKyAnXSc7CiAgICB2YXIgX3dvcmRDaGFyT3JEb3QgPSAnW14nICsgX1JFU0VSVkVEX0NIQVJTX1JFLnJlcGxhY2UoICdcXC4nLCAnJyApICsgJ10nOwoKICAgIC8vIFBhcmVudCBkaXJlY3RvcmllcywgZGVsaW1pdGVkIGJ5ICcvJyBvciAnOicuIEN1cnJlbnRseSB1bnVzZWQsIGJ1dCBtdXN0CiAgICAvLyBiZSBtYXRjaGVkIHRvIHBhcnNlIHRoZSByZXN0IG9mIHRoZSB0cmFjayBuYW1lLgogICAgdmFyIF9kaXJlY3RvcnlSZSA9IC8oKD86V0MrW1wvOl0pKikvLnNvdXJjZS5yZXBsYWNlKCAnV0MnLCBfd29yZENoYXIgKTsKCiAgICAvLyBUYXJnZXQgbm9kZS4gTWF5IGNvbnRhaW4gd29yZCBjaGFyYWN0ZXJzIChhLXpBLVowLTlfKSBhbmQgJy4nIG9yICctJy4KICAgIHZhciBfbm9kZVJlID0gLyhXQ09EKyk/Ly5zb3VyY2UucmVwbGFjZSggJ1dDT0QnLCBfd29yZENoYXJPckRvdCApOwoKICAgIC8vIE9iamVjdCBvbiB0YXJnZXQgbm9kZSwgYW5kIGFjY2Vzc29yLiBNYXkgbm90IGNvbnRhaW4gcmVzZXJ2ZWQKICAgIC8vIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heSBjb250YWluIGFueSBjaGFyYWN0ZXIgZXhjZXB0IGNsb3NpbmcgYnJhY2tldC4KICAgIHZhciBfb2JqZWN0UmUgPSAvKD86XC4oV0MrKSg/OlxbKC4rKVxdKT8pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApOwoKICAgIC8vIFByb3BlcnR5IGFuZCBhY2Nlc3Nvci4gTWF5IG5vdCBjb250YWluIHJlc2VydmVkIGNoYXJhY3RlcnMuIEFjY2Vzc29yIG1heQogICAgLy8gY29udGFpbiBhbnkgbm9uLWJyYWNrZXQgY2hhcmFjdGVycy4KICAgIHZhciBfcHJvcGVydHlSZSA9IC9cLihXQyspKD86XFsoLispXF0pPy8uc291cmNlLnJlcGxhY2UoICdXQycsIF93b3JkQ2hhciApOwoKICAgIHZhciBfdHJhY2tSZSA9IG5ldyBSZWdFeHAoICcnCiAgICAJKyAnXicKICAgIAkrIF9kaXJlY3RvcnlSZQogICAgCSsgX25vZGVSZQogICAgCSsgX29iamVjdFJlCiAgICAJKyBfcHJvcGVydHlSZQogICAgCSsgJyQnCiAgICApOwoKICAgIHZhciBfc3VwcG9ydGVkT2JqZWN0TmFtZXMgPSBbICdtYXRlcmlhbCcsICdtYXRlcmlhbHMnLCAnYm9uZXMnIF07CgogICAgZnVuY3Rpb24gQ29tcG9zaXRlKCB0YXJnZXRHcm91cCwgcGF0aCwgb3B0aW9uYWxQYXJzZWRQYXRoICkgewoKICAgIAl2YXIgcGFyc2VkUGF0aCA9IG9wdGlvbmFsUGFyc2VkUGF0aCB8fCBQcm9wZXJ0eUJpbmRpbmcucGFyc2VUcmFja05hbWUoIHBhdGggKTsKCiAgICAJdGhpcy5fdGFyZ2V0R3JvdXAgPSB0YXJnZXRHcm91cDsKICAgIAl0aGlzLl9iaW5kaW5ncyA9IHRhcmdldEdyb3VwLnN1YnNjcmliZV8oIHBhdGgsIHBhcnNlZFBhdGggKTsKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggQ29tcG9zaXRlLnByb3RvdHlwZSwgewoKICAgIAlnZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJdGhpcy5iaW5kKCk7IC8vIGJpbmQgYWxsIGJpbmRpbmcKCiAgICAJCXZhciBmaXJzdFZhbGlkSW5kZXggPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sCiAgICAJCQliaW5kaW5nID0gdGhpcy5fYmluZGluZ3NbIGZpcnN0VmFsaWRJbmRleCBdOwoKICAgIAkJLy8gYW5kIG9ubHkgY2FsbCAuZ2V0VmFsdWUgb24gdGhlIGZpcnN0CiAgICAJCWlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgYmluZGluZy5nZXRWYWx1ZSggYXJyYXksIG9mZnNldCApOwoKICAgIAl9LAoKICAgIAlzZXRWYWx1ZTogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CgogICAgCQlmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCQliaW5kaW5nc1sgaSBdLnNldFZhbHVlKCBhcnJheSwgb2Zmc2V0ICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCWJpbmQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwoKICAgIAkJZm9yICggdmFyIGkgPSB0aGlzLl90YXJnZXRHcm91cC5uQ2FjaGVkT2JqZWN0c18sIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJYmluZGluZ3NbIGkgXS5iaW5kKCk7CgogICAgCQl9CgogICAgCX0sCgogICAgCXVuYmluZDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CgogICAgCQlmb3IgKCB2YXIgaSA9IHRoaXMuX3RhcmdldEdyb3VwLm5DYWNoZWRPYmplY3RzXywgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCQliaW5kaW5nc1sgaSBdLnVuYmluZCgpOwoKICAgIAkJfQoKICAgIAl9CgogICAgfSApOwoKCiAgICBmdW5jdGlvbiBQcm9wZXJ0eUJpbmRpbmcoIHJvb3ROb2RlLCBwYXRoLCBwYXJzZWRQYXRoICkgewoKICAgIAl0aGlzLnBhdGggPSBwYXRoOwogICAgCXRoaXMucGFyc2VkUGF0aCA9IHBhcnNlZFBhdGggfHwgUHJvcGVydHlCaW5kaW5nLnBhcnNlVHJhY2tOYW1lKCBwYXRoICk7CgogICAgCXRoaXMubm9kZSA9IFByb3BlcnR5QmluZGluZy5maW5kTm9kZSggcm9vdE5vZGUsIHRoaXMucGFyc2VkUGF0aC5ub2RlTmFtZSApIHx8IHJvb3ROb2RlOwoKICAgIAl0aGlzLnJvb3ROb2RlID0gcm9vdE5vZGU7CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZywgewoKICAgIAlDb21wb3NpdGU6IENvbXBvc2l0ZSwKCiAgICAJY3JlYXRlOiBmdW5jdGlvbiAoIHJvb3QsIHBhdGgsIHBhcnNlZFBhdGggKSB7CgogICAgCQlpZiAoICEgKCByb290ICYmIHJvb3QuaXNBbmltYXRpb25PYmplY3RHcm91cCApICkgewoKICAgIAkJCXJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nKCByb290LCBwYXRoLCBwYXJzZWRQYXRoICk7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXJldHVybiBuZXcgUHJvcGVydHlCaW5kaW5nLkNvbXBvc2l0ZSggcm9vdCwgcGF0aCwgcGFyc2VkUGF0aCApOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAkvKioKICAgIAkgKiBSZXBsYWNlcyBzcGFjZXMgd2l0aCB1bmRlcnNjb3JlcyBhbmQgcmVtb3ZlcyB1bnN1cHBvcnRlZCBjaGFyYWN0ZXJzIGZyb20KICAgIAkgKiBub2RlIG5hbWVzLCB0byBlbnN1cmUgY29tcGF0aWJpbGl0eSB3aXRoIHBhcnNlVHJhY2tOYW1lKCkuCiAgICAJICoKICAgIAkgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOb2RlIG5hbWUgdG8gYmUgc2FuaXRpemVkLgogICAgCSAqIEByZXR1cm4ge3N0cmluZ30KICAgIAkgKi8KICAgIAlzYW5pdGl6ZU5vZGVOYW1lOiBmdW5jdGlvbiAoIG5hbWUgKSB7CgogICAgCQlyZXR1cm4gbmFtZS5yZXBsYWNlKCAvXHMvZywgJ18nICkucmVwbGFjZSggX3Jlc2VydmVkUmUsICcnICk7CgogICAgCX0sCgogICAgCXBhcnNlVHJhY2tOYW1lOiBmdW5jdGlvbiAoIHRyYWNrTmFtZSApIHsKCiAgICAJCXZhciBtYXRjaGVzID0gX3RyYWNrUmUuZXhlYyggdHJhY2tOYW1lICk7CgogICAgCQlpZiAoICEgbWF0Y2hlcyApIHsKCiAgICAJCQl0aHJvdyBuZXcgRXJyb3IoICdQcm9wZXJ0eUJpbmRpbmc6IENhbm5vdCBwYXJzZSB0cmFja05hbWU6ICcgKyB0cmFja05hbWUgKTsKCiAgICAJCX0KCiAgICAJCXZhciByZXN1bHRzID0gewogICAgCQkJLy8gZGlyZWN0b3J5TmFtZTogbWF0Y2hlc1sgMSBdLCAvLyAodHNjaHcpIGN1cnJlbnRseSB1bnVzZWQKICAgIAkJCW5vZGVOYW1lOiBtYXRjaGVzWyAyIF0sCiAgICAJCQlvYmplY3ROYW1lOiBtYXRjaGVzWyAzIF0sCiAgICAJCQlvYmplY3RJbmRleDogbWF0Y2hlc1sgNCBdLAogICAgCQkJcHJvcGVydHlOYW1lOiBtYXRjaGVzWyA1IF0sIC8vIHJlcXVpcmVkCiAgICAJCQlwcm9wZXJ0eUluZGV4OiBtYXRjaGVzWyA2IF0KICAgIAkJfTsKCiAgICAJCXZhciBsYXN0RG90ID0gcmVzdWx0cy5ub2RlTmFtZSAmJiByZXN1bHRzLm5vZGVOYW1lLmxhc3RJbmRleE9mKCAnLicgKTsKCiAgICAJCWlmICggbGFzdERvdCAhPT0gdW5kZWZpbmVkICYmIGxhc3REb3QgIT09IC0gMSApIHsKCiAgICAJCQl2YXIgb2JqZWN0TmFtZSA9IHJlc3VsdHMubm9kZU5hbWUuc3Vic3RyaW5nKCBsYXN0RG90ICsgMSApOwoKICAgIAkJCS8vIE9iamVjdCBuYW1lcyBtdXN0IGJlIGNoZWNrZWQgYWdhaW5zdCBhIHdoaXRlbGlzdC4gT3RoZXJ3aXNlLCB0aGVyZQogICAgCQkJLy8gaXMgbm8gd2F5IHRvIHBhcnNlICdmb28uYmFyLmJheic6ICdiYXonIG11c3QgYmUgYSBwcm9wZXJ0eSwgYnV0CiAgICAJCQkvLyAnYmFyJyBjb3VsZCBiZSB0aGUgb2JqZWN0TmFtZSwgb3IgcGFydCBvZiBhIG5vZGVOYW1lICh3aGljaCBjYW4KICAgIAkJCS8vIGluY2x1ZGUgJy4nIGNoYXJhY3RlcnMpLgogICAgCQkJaWYgKCBfc3VwcG9ydGVkT2JqZWN0TmFtZXMuaW5kZXhPZiggb2JqZWN0TmFtZSApICE9PSAtIDEgKSB7CgogICAgCQkJCXJlc3VsdHMubm9kZU5hbWUgPSByZXN1bHRzLm5vZGVOYW1lLnN1YnN0cmluZyggMCwgbGFzdERvdCApOwogICAgCQkJCXJlc3VsdHMub2JqZWN0TmFtZSA9IG9iamVjdE5hbWU7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAkJaWYgKCByZXN1bHRzLnByb3BlcnR5TmFtZSA9PT0gbnVsbCB8fCByZXN1bHRzLnByb3BlcnR5TmFtZS5sZW5ndGggPT09IDAgKSB7CgogICAgCQkJdGhyb3cgbmV3IEVycm9yKCAnUHJvcGVydHlCaW5kaW5nOiBjYW4gbm90IHBhcnNlIHByb3BlcnR5TmFtZSBmcm9tIHRyYWNrTmFtZTogJyArIHRyYWNrTmFtZSApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHJlc3VsdHM7CgogICAgCX0sCgogICAgCWZpbmROb2RlOiBmdW5jdGlvbiAoIHJvb3QsIG5vZGVOYW1lICkgewoKICAgIAkJaWYgKCAhIG5vZGVOYW1lIHx8IG5vZGVOYW1lID09PSAiIiB8fCBub2RlTmFtZSA9PT0gInJvb3QiIHx8IG5vZGVOYW1lID09PSAiLiIgfHwgbm9kZU5hbWUgPT09IC0gMSB8fCBub2RlTmFtZSA9PT0gcm9vdC5uYW1lIHx8IG5vZGVOYW1lID09PSByb290LnV1aWQgKSB7CgogICAgCQkJcmV0dXJuIHJvb3Q7CgogICAgCQl9CgogICAgCQkvLyBzZWFyY2ggaW50byBza2VsZXRvbiBib25lcy4KICAgIAkJaWYgKCByb290LnNrZWxldG9uICkgewoKICAgIAkJCXZhciBib25lID0gcm9vdC5za2VsZXRvbi5nZXRCb25lQnlOYW1lKCBub2RlTmFtZSApOwoKICAgIAkJCWlmICggYm9uZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlyZXR1cm4gYm9uZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQkvLyBzZWFyY2ggaW50byBub2RlIHN1YnRyZWUuCiAgICAJCWlmICggcm9vdC5jaGlsZHJlbiApIHsKCiAgICAJCQl2YXIgc2VhcmNoTm9kZVN1YnRyZWUgPSBmdW5jdGlvbiAoIGNoaWxkcmVuICkgewoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CgogICAgCQkJCQl2YXIgY2hpbGROb2RlID0gY2hpbGRyZW5bIGkgXTsKCiAgICAJCQkJCWlmICggY2hpbGROb2RlLm5hbWUgPT09IG5vZGVOYW1lIHx8IGNoaWxkTm9kZS51dWlkID09PSBub2RlTmFtZSApIHsKCiAgICAJCQkJCQlyZXR1cm4gY2hpbGROb2RlOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJdmFyIHJlc3VsdCA9IHNlYXJjaE5vZGVTdWJ0cmVlKCBjaGlsZE5vZGUuY2hpbGRyZW4gKTsKCiAgICAJCQkJCWlmICggcmVzdWx0ICkgcmV0dXJuIHJlc3VsdDsKCiAgICAJCQkJfQoKICAgIAkJCQlyZXR1cm4gbnVsbDsKCiAgICAJCQl9OwoKICAgIAkJCXZhciBzdWJUcmVlTm9kZSA9IHNlYXJjaE5vZGVTdWJ0cmVlKCByb290LmNoaWxkcmVuICk7CgogICAgCQkJaWYgKCBzdWJUcmVlTm9kZSApIHsKCiAgICAJCQkJcmV0dXJuIHN1YlRyZWVOb2RlOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXJldHVybiBudWxsOwoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHsgLy8gcHJvdG90eXBlLCBjb250aW51ZWQKCiAgICAJLy8gdGhlc2UgYXJlIHVzZWQgdG8gImJpbmQiIGEgbm9uZXhpc3RlbnQgcHJvcGVydHkKICAgIAlfZ2V0VmFsdWVfdW5hdmFpbGFibGU6IGZ1bmN0aW9uICgpIHt9LAogICAgCV9zZXRWYWx1ZV91bmF2YWlsYWJsZTogZnVuY3Rpb24gKCkge30sCgogICAgCUJpbmRpbmdUeXBlOiB7CiAgICAJCURpcmVjdDogMCwKICAgIAkJRW50aXJlQXJyYXk6IDEsCiAgICAJCUFycmF5RWxlbWVudDogMiwKICAgIAkJSGFzRnJvbVRvQXJyYXk6IDMKICAgIAl9LAoKICAgIAlWZXJzaW9uaW5nOiB7CiAgICAJCU5vbmU6IDAsCiAgICAJCU5lZWRzVXBkYXRlOiAxLAogICAgCQlNYXRyaXhXb3JsZE5lZWRzVXBkYXRlOiAyCiAgICAJfSwKCiAgICAJR2V0dGVyQnlCaW5kaW5nVHlwZTogWwoKICAgIAkJZnVuY3Rpb24gZ2V0VmFsdWVfZGlyZWN0KCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQlidWZmZXJbIG9mZnNldCBdID0gdGhpcy5ub2RlWyB0aGlzLnByb3BlcnR5TmFtZSBdOwoKICAgIAkJfSwKCiAgICAJCWZ1bmN0aW9uIGdldFZhbHVlX2FycmF5KCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQl2YXIgc291cmNlID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OwoKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbiA9IHNvdXJjZS5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJCWJ1ZmZlclsgb2Zmc2V0ICsrIF0gPSBzb3VyY2VbIGkgXTsKCiAgICAJCQl9CgogICAgCQl9LAoKICAgIAkJZnVuY3Rpb24gZ2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQlidWZmZXJbIG9mZnNldCBdID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXTsKCiAgICAJCX0sCgogICAgCQlmdW5jdGlvbiBnZXRWYWx1ZV90b0FycmF5KCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQl0aGlzLnJlc29sdmVkUHJvcGVydHkudG9BcnJheSggYnVmZmVyLCBvZmZzZXQgKTsKCiAgICAJCX0KCiAgICAJXSwKCiAgICAJU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmc6IFsKCiAgICAJCVsKICAgIAkJCS8vIERpcmVjdAoKICAgIAkJCWZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdCggYnVmZmVyLCBvZmZzZXQgKSB7CgogICAgCQkJCXRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTsKCiAgICAJCQl9LAoKICAgIAkJCWZ1bmN0aW9uIHNldFZhbHVlX2RpcmVjdF9zZXROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CgogICAgCQkJCXRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTsKICAgIAkJCQl0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJfSwKCiAgICAJCQlmdW5jdGlvbiBzZXRWYWx1ZV9kaXJlY3Rfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CgogICAgCQkJCXRoaXMudGFyZ2V0T2JqZWN0WyB0aGlzLnByb3BlcnR5TmFtZSBdID0gYnVmZmVyWyBvZmZzZXQgXTsKICAgIAkJCQl0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQldLCBbCgogICAgCQkJLy8gRW50aXJlQXJyYXkKCiAgICAJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7CgogICAgCQkJCXZhciBkZXN0ID0gdGhpcy5yZXNvbHZlZFByb3BlcnR5OwoKICAgIAkJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBkZXN0Lmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCQkJCWRlc3RbIGkgXSA9IGJ1ZmZlclsgb2Zmc2V0ICsrIF07CgogICAgCQkJCX0KCiAgICAJCQl9LAoKICAgIAkJCWZ1bmN0aW9uIHNldFZhbHVlX2FycmF5X3NldE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQkJdmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCQkJZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTsKCiAgICAJCQkJfQoKICAgIAkJCQl0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJfSwKCiAgICAJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQkJdmFyIGRlc3QgPSB0aGlzLnJlc29sdmVkUHJvcGVydHk7CgogICAgCQkJCWZvciAoIHZhciBpID0gMCwgbiA9IGRlc3QubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCQkJZGVzdFsgaSBdID0gYnVmZmVyWyBvZmZzZXQgKysgXTsKCiAgICAJCQkJfQoKICAgIAkJCQl0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQldLCBbCgogICAgCQkJLy8gQXJyYXlFbGVtZW50CgogICAgCQkJZnVuY3Rpb24gc2V0VmFsdWVfYXJyYXlFbGVtZW50KCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5WyB0aGlzLnByb3BlcnR5SW5kZXggXSA9IGJ1ZmZlclsgb2Zmc2V0IF07CgogICAgCQkJfSwKCiAgICAJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKICAgIAkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHlbIHRoaXMucHJvcGVydHlJbmRleCBdID0gYnVmZmVyWyBvZmZzZXQgXTsKICAgIAkJCQl0aGlzLnRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCQkJfSwKCiAgICAJCQlmdW5jdGlvbiBzZXRWYWx1ZV9hcnJheUVsZW1lbnRfc2V0TWF0cml4V29ybGROZWVkc1VwZGF0ZSggYnVmZmVyLCBvZmZzZXQgKSB7CgogICAgCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eVsgdGhpcy5wcm9wZXJ0eUluZGV4IF0gPSBidWZmZXJbIG9mZnNldCBdOwogICAgCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm1hdHJpeFdvcmxkTmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAkJCX0KCiAgICAJCV0sIFsKCiAgICAJCQkvLyBIYXNUb0Zyb21BcnJheQoKICAgIAkJCWZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKSB7CgogICAgCQkJCXRoaXMucmVzb2x2ZWRQcm9wZXJ0eS5mcm9tQXJyYXkoIGJ1ZmZlciwgb2Zmc2V0ICk7CgogICAgCQkJfSwKCiAgICAJCQlmdW5jdGlvbiBzZXRWYWx1ZV9mcm9tQXJyYXlfc2V0TmVlZHNVcGRhdGUoIGJ1ZmZlciwgb2Zmc2V0ICkgewoKICAgIAkJCQl0aGlzLnJlc29sdmVkUHJvcGVydHkuZnJvbUFycmF5KCBidWZmZXIsIG9mZnNldCApOwogICAgCQkJCXRoaXMudGFyZ2V0T2JqZWN0Lm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9LAoKICAgIAkJCWZ1bmN0aW9uIHNldFZhbHVlX2Zyb21BcnJheV9zZXRNYXRyaXhXb3JsZE5lZWRzVXBkYXRlKCBidWZmZXIsIG9mZnNldCApIHsKCiAgICAJCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5LmZyb21BcnJheSggYnVmZmVyLCBvZmZzZXQgKTsKICAgIAkJCQl0aGlzLnRhcmdldE9iamVjdC5tYXRyaXhXb3JsZE5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJCQl9CgogICAgCQldCgogICAgCV0sCgogICAgCWdldFZhbHVlOiBmdW5jdGlvbiBnZXRWYWx1ZV91bmJvdW5kKCB0YXJnZXRBcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJdGhpcy5iaW5kKCk7CiAgICAJCXRoaXMuZ2V0VmFsdWUoIHRhcmdldEFycmF5LCBvZmZzZXQgKTsKCiAgICAJCS8vIE5vdGU6IFRoaXMgY2xhc3MgdXNlcyBhIFN0YXRlIHBhdHRlcm4gb24gYSBwZXItbWV0aG9kIGJhc2lzOgogICAgCQkvLyAnYmluZCcgc2V0cyAndGhpcy5nZXRWYWx1ZScgLyAnc2V0VmFsdWUnIGFuZCBzaGFkb3dzIHRoZQogICAgCQkvLyBwcm90b3R5cGUgdmVyc2lvbiBvZiB0aGVzZSBtZXRob2RzIHdpdGggb25lIHRoYXQgcmVwcmVzZW50cwogICAgCQkvLyB0aGUgYm91bmQgc3RhdGUuIFdoZW4gdGhlIHByb3BlcnR5IGlzIG5vdCBmb3VuZCwgdGhlIG1ldGhvZHMKICAgIAkJLy8gYmVjb21lIG5vLW9wcy4KCiAgICAJfSwKCiAgICAJc2V0VmFsdWU6IGZ1bmN0aW9uIGdldFZhbHVlX3VuYm91bmQoIHNvdXJjZUFycmF5LCBvZmZzZXQgKSB7CgogICAgCQl0aGlzLmJpbmQoKTsKICAgIAkJdGhpcy5zZXRWYWx1ZSggc291cmNlQXJyYXksIG9mZnNldCApOwoKICAgIAl9LAoKICAgIAkvLyBjcmVhdGUgZ2V0dGVyIC8gc2V0dGVyIHBhaXIgZm9yIGEgcHJvcGVydHkgaW4gdGhlIHNjZW5lIGdyYXBoCiAgICAJYmluZDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIHRhcmdldE9iamVjdCA9IHRoaXMubm9kZSwKICAgIAkJCXBhcnNlZFBhdGggPSB0aGlzLnBhcnNlZFBhdGgsCgogICAgCQkJb2JqZWN0TmFtZSA9IHBhcnNlZFBhdGgub2JqZWN0TmFtZSwKICAgIAkJCXByb3BlcnR5TmFtZSA9IHBhcnNlZFBhdGgucHJvcGVydHlOYW1lLAogICAgCQkJcHJvcGVydHlJbmRleCA9IHBhcnNlZFBhdGgucHJvcGVydHlJbmRleDsKCiAgICAJCWlmICggISB0YXJnZXRPYmplY3QgKSB7CgogICAgCQkJdGFyZ2V0T2JqZWN0ID0gUHJvcGVydHlCaW5kaW5nLmZpbmROb2RlKCB0aGlzLnJvb3ROb2RlLCBwYXJzZWRQYXRoLm5vZGVOYW1lICkgfHwgdGhpcy5yb290Tm9kZTsKCiAgICAJCQl0aGlzLm5vZGUgPSB0YXJnZXRPYmplY3Q7CgogICAgCQl9CgogICAgCQkvLyBzZXQgZmFpbCBzdGF0ZSBzbyB3ZSBjYW4ganVzdCAncmV0dXJuJyBvbiBlcnJvcgogICAgCQl0aGlzLmdldFZhbHVlID0gdGhpcy5fZ2V0VmFsdWVfdW5hdmFpbGFibGU7CiAgICAJCXRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmF2YWlsYWJsZTsKCiAgICAJCS8vIGVuc3VyZSB0aGVyZSBpcyBhIHZhbHVlIG5vZGUKICAgIAkJaWYgKCAhIHRhcmdldE9iamVjdCApIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gdXBkYXRlIG5vZGUgZm9yIHRyYWNrOiAnICsgdGhpcy5wYXRoICsgJyBidXQgaXQgd2FzblwndCBmb3VuZC4nICk7CiAgICAJCQlyZXR1cm47CgogICAgCQl9CgogICAgCQlpZiAoIG9iamVjdE5hbWUgKSB7CgogICAgCQkJdmFyIG9iamVjdEluZGV4ID0gcGFyc2VkUGF0aC5vYmplY3RJbmRleDsKCiAgICAJCQkvLyBzcGVjaWFsIGNhc2VzIHdlcmUgd2UgbmVlZCB0byByZWFjaCBkZWVwZXIgaW50byB0aGUgaGllcmFyY2h5IHRvIGdldCB0aGUgZmFjZSBtYXRlcmlhbHMuLi4uCiAgICAJCQlzd2l0Y2ggKCBvYmplY3ROYW1lICkgewoKICAgIAkJCQljYXNlICdtYXRlcmlhbHMnOgoKICAgIAkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbCApIHsKCiAgICAJCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBDYW4gbm90IGJpbmQgdG8gbWF0ZXJpYWwgYXMgbm9kZSBkb2VzIG5vdCBoYXZlIGEgbWF0ZXJpYWwuJywgdGhpcyApOwogICAgCQkJCQkJcmV0dXJuOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5tYXRlcmlhbC5tYXRlcmlhbHMgKSB7CgogICAgCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1hdGVyaWFsLm1hdGVyaWFscyBhcyBub2RlLm1hdGVyaWFsIGRvZXMgbm90IGhhdmUgYSBtYXRlcmlhbHMgYXJyYXkuJywgdGhpcyApOwogICAgCQkJCQkJcmV0dXJuOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0Lm1hdGVyaWFsLm1hdGVyaWFsczsKCiAgICAJCQkJCWJyZWFrOwoKICAgIAkJCQljYXNlICdib25lcyc6CgogICAgCQkJCQlpZiAoICEgdGFyZ2V0T2JqZWN0LnNrZWxldG9uICkgewoKICAgIAkJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBib25lcyBhcyBub2RlIGRvZXMgbm90IGhhdmUgYSBza2VsZXRvbi4nLCB0aGlzICk7CiAgICAJCQkJCQlyZXR1cm47CgogICAgCQkJCQl9CgogICAgCQkJCQkvLyBwb3RlbnRpYWwgZnV0dXJlIG9wdGltaXphdGlvbjogc2tpcCB0aGlzIGlmIHByb3BlcnR5SW5kZXggaXMgYWxyZWFkeSBhbiBpbnRlZ2VyCiAgICAJCQkJCS8vIGFuZCBjb252ZXJ0IHRoZSBpbnRlZ2VyIHN0cmluZyB0byBhIHRydWUgaW50ZWdlci4KCiAgICAJCQkJCXRhcmdldE9iamVjdCA9IHRhcmdldE9iamVjdC5za2VsZXRvbi5ib25lczsKCiAgICAJCQkJCS8vIHN1cHBvcnQgcmVzb2x2aW5nIG1vcnBoVGFyZ2V0IG5hbWVzIGludG8gaW5kaWNlcy4KICAgIAkJCQkJZm9yICggdmFyIGkgPSAwOyBpIDwgdGFyZ2V0T2JqZWN0Lmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJCQlpZiAoIHRhcmdldE9iamVjdFsgaSBdLm5hbWUgPT09IG9iamVjdEluZGV4ICkgewoKICAgIAkJCQkJCQlvYmplY3RJbmRleCA9IGk7CiAgICAJCQkJCQkJYnJlYWs7CgogICAgCQkJCQkJfQoKICAgIAkJCQkJfQoKICAgIAkJCQkJYnJlYWs7CgogICAgCQkJCWRlZmF1bHQ6CgogICAgCQkJCQlpZiAoIHRhcmdldE9iamVjdFsgb2JqZWN0TmFtZSBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG9iamVjdE5hbWUgb2Ygbm9kZSB1bmRlZmluZWQuJywgdGhpcyApOwogICAgCQkJCQkJcmV0dXJuOwoKICAgIAkJCQkJfQoKICAgIAkJCQkJdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3ROYW1lIF07CgogICAgCQkJfQoKCiAgICAJCQlpZiAoIG9iamVjdEluZGV4ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCWlmICggdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuUHJvcGVydHlCaW5kaW5nOiBUcnlpbmcgdG8gYmluZCB0byBvYmplY3RJbmRleCBvZiBvYmplY3ROYW1lLCBidXQgaXMgdW5kZWZpbmVkLicsIHRoaXMsIHRhcmdldE9iamVjdCApOwogICAgCQkJCQlyZXR1cm47CgogICAgCQkJCX0KCiAgICAJCQkJdGFyZ2V0T2JqZWN0ID0gdGFyZ2V0T2JqZWN0WyBvYmplY3RJbmRleCBdOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCS8vIHJlc29sdmUgcHJvcGVydHkKICAgIAkJdmFyIG5vZGVQcm9wZXJ0eSA9IHRhcmdldE9iamVjdFsgcHJvcGVydHlOYW1lIF07CgogICAgCQlpZiAoIG5vZGVQcm9wZXJ0eSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBub2RlTmFtZSA9IHBhcnNlZFBhdGgubm9kZU5hbWU7CgogICAgCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogVHJ5aW5nIHRvIHVwZGF0ZSBwcm9wZXJ0eSBmb3IgdHJhY2s6ICcgKyBub2RlTmFtZSArCiAgICAJCQkJJy4nICsgcHJvcGVydHlOYW1lICsgJyBidXQgaXQgd2FzblwndCBmb3VuZC4nLCB0YXJnZXRPYmplY3QgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCS8vIGRldGVybWluZSB2ZXJzaW9uaW5nIHNjaGVtZQogICAgCQl2YXIgdmVyc2lvbmluZyA9IHRoaXMuVmVyc2lvbmluZy5Ob25lOwoKICAgIAkJdGhpcy50YXJnZXRPYmplY3QgPSB0YXJnZXRPYmplY3Q7CgogICAgCQlpZiAoIHRhcmdldE9iamVjdC5uZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBtYXRlcmlhbAoKICAgIAkJCXZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTmVlZHNVcGRhdGU7CgogICAgCQl9IGVsc2UgaWYgKCB0YXJnZXRPYmplY3QubWF0cml4V29ybGROZWVkc1VwZGF0ZSAhPT0gdW5kZWZpbmVkICkgeyAvLyBub2RlIHRyYW5zZm9ybQoKICAgIAkJCXZlcnNpb25pbmcgPSB0aGlzLlZlcnNpb25pbmcuTWF0cml4V29ybGROZWVkc1VwZGF0ZTsKCiAgICAJCX0KCiAgICAJCS8vIGRldGVybWluZSBob3cgdGhlIHByb3BlcnR5IGdldHMgYm91bmQKICAgIAkJdmFyIGJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5EaXJlY3Q7CgogICAgCQlpZiAoIHByb3BlcnR5SW5kZXggIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkvLyBhY2Nlc3MgYSBzdWIgZWxlbWVudCBvZiB0aGUgcHJvcGVydHkgYXJyYXkgKG9ubHkgcHJpbWl0aXZlcyBhcmUgc3VwcG9ydGVkIHJpZ2h0IG5vdykKCiAgICAJCQlpZiAoIHByb3BlcnR5TmFtZSA9PT0gIm1vcnBoVGFyZ2V0SW5mbHVlbmNlcyIgKSB7CgogICAgCQkJCS8vIHBvdGVudGlhbCBvcHRpbWl6YXRpb24sIHNraXAgdGhpcyBpZiBwcm9wZXJ0eUluZGV4IGlzIGFscmVhZHkgYW4gaW50ZWdlciwgYW5kIGNvbnZlcnQgdGhlIGludGVnZXIgc3RyaW5nIHRvIGEgdHJ1ZSBpbnRlZ2VyLgoKICAgIAkJCQkvLyBzdXBwb3J0IHJlc29sdmluZyBtb3JwaFRhcmdldCBuYW1lcyBpbnRvIGluZGljZXMuCiAgICAJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeSApIHsKCiAgICAJCQkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5Qcm9wZXJ0eUJpbmRpbmc6IENhbiBub3QgYmluZCB0byBtb3JwaFRhcmdldEluZmx1ZW5jZXMgYmVjYXVzZSBub2RlIGRvZXMgbm90IGhhdmUgYSBnZW9tZXRyeS4nLCB0aGlzICk7CiAgICAJCQkJCXJldHVybjsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5pc0J1ZmZlckdlb21ldHJ5ICkgewoKICAgIAkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMgKSB7CgogICAgCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoQXR0cmlidXRlcy4nLCB0aGlzICk7CiAgICAJCQkJCQlyZXR1cm47CgogICAgCQkJCQl9CgogICAgCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhBdHRyaWJ1dGVzLnBvc2l0aW9uLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJCQlpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaEF0dHJpYnV0ZXMucG9zaXRpb25bIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkgewoKICAgIAkJCQkJCQlwcm9wZXJ0eUluZGV4ID0gaTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJaWYgKCAhIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHMgKSB7CgogICAgCQkJCQkJY29uc29sZS5lcnJvciggJ1RIUkVFLlByb3BlcnR5QmluZGluZzogQ2FuIG5vdCBiaW5kIHRvIG1vcnBoVGFyZ2V0SW5mbHVlbmNlcyBiZWNhdXNlIG5vZGUgZG9lcyBub3QgaGF2ZSBhIGdlb21ldHJ5Lm1vcnBoVGFyZ2V0cy4nLCB0aGlzICk7CiAgICAJCQkJCQlyZXR1cm47CgogICAgCQkJCQl9CgogICAgCQkJCQlmb3IgKCB2YXIgaSA9IDA7IGkgPCB0aGlzLm5vZGUuZ2VvbWV0cnkubW9ycGhUYXJnZXRzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCQkJCQlpZiAoIHRhcmdldE9iamVjdC5nZW9tZXRyeS5tb3JwaFRhcmdldHNbIGkgXS5uYW1lID09PSBwcm9wZXJ0eUluZGV4ICkgewoKICAgIAkJCQkJCQlwcm9wZXJ0eUluZGV4ID0gaTsKICAgIAkJCQkJCQlicmVhazsKCiAgICAJCQkJCQl9CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJYmluZGluZ1R5cGUgPSB0aGlzLkJpbmRpbmdUeXBlLkFycmF5RWxlbWVudDsKCiAgICAJCQl0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CiAgICAJCQl0aGlzLnByb3BlcnR5SW5kZXggPSBwcm9wZXJ0eUluZGV4OwoKICAgIAkJfSBlbHNlIGlmICggbm9kZVByb3BlcnR5LmZyb21BcnJheSAhPT0gdW5kZWZpbmVkICYmIG5vZGVQcm9wZXJ0eS50b0FycmF5ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gbXVzdCB1c2UgY29weSBmb3IgT2JqZWN0M0QuRXVsZXIvUXVhdGVybmlvbgoKICAgIAkJCWJpbmRpbmdUeXBlID0gdGhpcy5CaW5kaW5nVHlwZS5IYXNGcm9tVG9BcnJheTsKCiAgICAJCQl0aGlzLnJlc29sdmVkUHJvcGVydHkgPSBub2RlUHJvcGVydHk7CgogICAgCQl9IGVsc2UgaWYgKCBBcnJheS5pc0FycmF5KCBub2RlUHJvcGVydHkgKSApIHsKCiAgICAJCQliaW5kaW5nVHlwZSA9IHRoaXMuQmluZGluZ1R5cGUuRW50aXJlQXJyYXk7CgogICAgCQkJdGhpcy5yZXNvbHZlZFByb3BlcnR5ID0gbm9kZVByb3BlcnR5OwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl0aGlzLnByb3BlcnR5TmFtZSA9IHByb3BlcnR5TmFtZTsKCiAgICAJCX0KCiAgICAJCS8vIHNlbGVjdCBnZXR0ZXIgLyBzZXR0ZXIKICAgIAkJdGhpcy5nZXRWYWx1ZSA9IHRoaXMuR2V0dGVyQnlCaW5kaW5nVHlwZVsgYmluZGluZ1R5cGUgXTsKICAgIAkJdGhpcy5zZXRWYWx1ZSA9IHRoaXMuU2V0dGVyQnlCaW5kaW5nVHlwZUFuZFZlcnNpb25pbmdbIGJpbmRpbmdUeXBlIF1bIHZlcnNpb25pbmcgXTsKCiAgICAJfSwKCiAgICAJdW5iaW5kOiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLm5vZGUgPSBudWxsOwoKICAgIAkJLy8gYmFjayB0byB0aGUgcHJvdG90eXBlIHZlcnNpb24gb2YgZ2V0VmFsdWUgLyBzZXRWYWx1ZQogICAgCQkvLyBub3RlOiBhdm9pZGluZyB0byBtdXRhdGUgdGhlIHNoYXBlIG9mICd0aGlzJyB2aWEgJ2RlbGV0ZScKICAgIAkJdGhpcy5nZXRWYWx1ZSA9IHRoaXMuX2dldFZhbHVlX3VuYm91bmQ7CiAgICAJCXRoaXMuc2V0VmFsdWUgPSB0aGlzLl9zZXRWYWx1ZV91bmJvdW5kOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8vIVwgREVDTEFSRSBBTElBUyBBRlRFUiBhc3NpZ24gcHJvdG90eXBlICEKICAgIE9iamVjdC5hc3NpZ24oIFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUsIHsKCiAgICAJLy8gaW5pdGlhbCBzdGF0ZSBvZiB0aGVzZSBtZXRob2RzIHRoYXQgY2FsbHMgJ2JpbmQnCiAgICAJX2dldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuZ2V0VmFsdWUsCiAgICAJX3NldFZhbHVlX3VuYm91bmQ6IFByb3BlcnR5QmluZGluZy5wcm90b3R5cGUuc2V0VmFsdWUsCgogICAgfSApOwoKICAgIC8qKgogICAgICoKICAgICAqIEEgZ3JvdXAgb2Ygb2JqZWN0cyB0aGF0IHJlY2VpdmVzIGEgc2hhcmVkIGFuaW1hdGlvbiBzdGF0ZS4KICAgICAqCiAgICAgKiBVc2FnZToKICAgICAqCiAgICAgKiAgLSBBZGQgb2JqZWN0cyB5b3Ugd291bGQgb3RoZXJ3aXNlIHBhc3MgYXMgJ3Jvb3QnIHRvIHRoZQogICAgICogICAgY29uc3RydWN0b3Igb3IgdGhlIC5jbGlwQWN0aW9uIG1ldGhvZCBvZiBBbmltYXRpb25NaXhlci4KICAgICAqCiAgICAgKiAgLSBJbnN0ZWFkIHBhc3MgdGhpcyBvYmplY3QgYXMgJ3Jvb3QnLgogICAgICoKICAgICAqICAtIFlvdSBjYW4gYWxzbyBhZGQgYW5kIHJlbW92ZSBvYmplY3RzIGxhdGVyIHdoZW4gdGhlIG1peGVyCiAgICAgKiAgICBpcyBydW5uaW5nLgogICAgICoKICAgICAqIE5vdGU6CiAgICAgKgogICAgICogICAgT2JqZWN0cyBvZiB0aGlzIGNsYXNzIGFwcGVhciBhcyBvbmUgb2JqZWN0IHRvIHRoZSBtaXhlciwKICAgICAqICAgIHNvIGNhY2hlIGNvbnRyb2wgb2YgdGhlIGluZGl2aWR1YWwgb2JqZWN0cyBtdXN0IGJlIGRvbmUKICAgICAqICAgIG9uIHRoZSBncm91cC4KICAgICAqCiAgICAgKiBMaW1pdGF0aW9uOgogICAgICoKICAgICAqICAtIFRoZSBhbmltYXRlZCBwcm9wZXJ0aWVzIG11c3QgYmUgY29tcGF0aWJsZSBhbW9uZyB0aGUKICAgICAqICAgIGFsbCBvYmplY3RzIGluIHRoZSBncm91cC4KICAgICAqCiAgICAgKiAgLSBBIHNpbmdsZSBwcm9wZXJ0eSBjYW4gZWl0aGVyIGJlIGNvbnRyb2xsZWQgdGhyb3VnaCBhCiAgICAgKiAgICB0YXJnZXQgZ3JvdXAgb3IgZGlyZWN0bHksIGJ1dCBub3QgYm90aC4KICAgICAqCiAgICAgKiBAYXV0aG9yIHRzY2h3CiAgICAgKi8KCiAgICBmdW5jdGlvbiBBbmltYXRpb25PYmplY3RHcm91cCgpIHsKCiAgICAJdGhpcy51dWlkID0gX01hdGguZ2VuZXJhdGVVVUlEKCk7CgogICAgCS8vIGNhY2hlZCBvYmplY3RzIGZvbGxvd2VkIGJ5IHRoZSBhY3RpdmUgb25lcwogICAgCXRoaXMuX29iamVjdHMgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCggYXJndW1lbnRzICk7CgogICAgCXRoaXMubkNhY2hlZE9iamVjdHNfID0gMDsgLy8gdGhyZXNob2xkCiAgICAJLy8gbm90ZTogcmVhZCBieSBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlCgogICAgCXZhciBpbmRpY2VzID0ge307CiAgICAJdGhpcy5faW5kaWNlc0J5VVVJRCA9IGluZGljZXM7IC8vIGZvciBib29ra2VlcGluZwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJaW5kaWNlc1sgYXJndW1lbnRzWyBpIF0udXVpZCBdID0gaTsKCiAgICAJfQoKICAgIAl0aGlzLl9wYXRocyA9IFtdOyAvLyBpbnNpZGU6IHN0cmluZwogICAgCXRoaXMuX3BhcnNlZFBhdGhzID0gW107IC8vIGluc2lkZTogeyB3ZSBkb24ndCBjYXJlLCBoZXJlIH0KICAgIAl0aGlzLl9iaW5kaW5ncyA9IFtdOyAvLyBpbnNpZGU6IEFycmF5PCBQcm9wZXJ0eUJpbmRpbmcgPgogICAgCXRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCA9IHt9OyAvLyBpbnNpZGU6IGluZGljZXMgaW4gdGhlc2UgYXJyYXlzCgogICAgCXZhciBzY29wZSA9IHRoaXM7CgogICAgCXRoaXMuc3RhdHMgPSB7CgogICAgCQlvYmplY3RzOiB7CiAgICAJCQlnZXQgdG90YWwoKSB7CgogICAgCQkJCXJldHVybiBzY29wZS5fb2JqZWN0cy5sZW5ndGg7CgogICAgCQkJfSwKICAgIAkJCWdldCBpblVzZSgpIHsKCiAgICAJCQkJcmV0dXJuIHRoaXMudG90YWwgLSBzY29wZS5uQ2FjaGVkT2JqZWN0c187CgogICAgCQkJfQogICAgCQl9LAogICAgCQlnZXQgYmluZGluZ3NQZXJPYmplY3QoKSB7CgogICAgCQkJcmV0dXJuIHNjb3BlLl9iaW5kaW5ncy5sZW5ndGg7CgogICAgCQl9CgogICAgCX07CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIEFuaW1hdGlvbk9iamVjdEdyb3VwLnByb3RvdHlwZSwgewoKICAgIAlpc0FuaW1hdGlvbk9iamVjdEdyb3VwOiB0cnVlLAoKICAgIAlhZGQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBvYmplY3RzID0gdGhpcy5fb2JqZWN0cywKICAgIAkJCW5PYmplY3RzID0gb2JqZWN0cy5sZW5ndGgsCiAgICAJCQluQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLAogICAgCQkJaW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsCiAgICAJCQlwYXRocyA9IHRoaXMuX3BhdGhzLAogICAgCQkJcGFyc2VkUGF0aHMgPSB0aGlzLl9wYXJzZWRQYXRocywKICAgIAkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCiAgICAJCQluQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGgsCiAgICAJCQlrbm93bk9iamVjdCA9IHVuZGVmaW5lZDsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbiA9IGFyZ3VtZW50cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJdmFyIG9iamVjdCA9IGFyZ3VtZW50c1sgaSBdLAogICAgCQkJCXV1aWQgPSBvYmplY3QudXVpZCwKICAgIAkJCQlpbmRleCA9IGluZGljZXNCeVVVSURbIHV1aWQgXTsKCiAgICAJCQlpZiAoIGluZGV4ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCS8vIHVua25vd24gb2JqZWN0IC0+IGFkZCBpdCB0byB0aGUgQUNUSVZFIHJlZ2lvbgoKICAgIAkJCQlpbmRleCA9IG5PYmplY3RzICsrOwogICAgCQkJCWluZGljZXNCeVVVSURbIHV1aWQgXSA9IGluZGV4OwogICAgCQkJCW9iamVjdHMucHVzaCggb2JqZWN0ICk7CgogICAgCQkJCS8vIGFjY291bnRpbmcgaXMgZG9uZSwgbm93IGRvIHRoZSBzYW1lIGZvciBhbGwgYmluZGluZ3MKCiAgICAJCQkJZm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkgewoKICAgIAkJCQkJYmluZGluZ3NbIGogXS5wdXNoKCBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKSApOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIGlmICggaW5kZXggPCBuQ2FjaGVkT2JqZWN0cyApIHsKCiAgICAJCQkJa25vd25PYmplY3QgPSBvYmplY3RzWyBpbmRleCBdOwoKICAgIAkJCQkvLyBtb3ZlIGV4aXN0aW5nIG9iamVjdCB0byB0aGUgQUNUSVZFIHJlZ2lvbgoKICAgIAkJCQl2YXIgZmlyc3RBY3RpdmVJbmRleCA9IC0tIG5DYWNoZWRPYmplY3RzLAogICAgCQkJCQlsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdOwoKICAgIAkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4OwogICAgCQkJCW9iamVjdHNbIGluZGV4IF0gPSBsYXN0Q2FjaGVkT2JqZWN0OwoKICAgIAkJCQlpbmRpY2VzQnlVVUlEWyB1dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4OwogICAgCQkJCW9iamVjdHNbIGZpcnN0QWN0aXZlSW5kZXggXSA9IG9iamVjdDsKCiAgICAJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncwoKICAgIAkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CgogICAgCQkJCQl2YXIgYmluZGluZ3NGb3JQYXRoID0gYmluZGluZ3NbIGogXSwKICAgIAkJCQkJCWxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSwKICAgIAkJCQkJCWJpbmRpbmcgPSBiaW5kaW5nc0ZvclBhdGhbIGluZGV4IF07CgogICAgCQkJCQliaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkOwoKICAgIAkJCQkJaWYgKCBiaW5kaW5nID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJCQkJLy8gc2luY2Ugd2UgZG8gbm90IGJvdGhlciB0byBjcmVhdGUgbmV3IGJpbmRpbmdzCiAgICAJCQkJCQkvLyBmb3Igb2JqZWN0cyB0aGF0IGFyZSBjYWNoZWQsIHRoZSBiaW5kaW5nIG1heQogICAgCQkJCQkJLy8gb3IgbWF5IG5vdCBleGlzdAoKICAgIAkJCQkJCWJpbmRpbmcgPSBuZXcgUHJvcGVydHlCaW5kaW5nKCBvYmplY3QsIHBhdGhzWyBqIF0sIHBhcnNlZFBhdGhzWyBqIF0gKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCWJpbmRpbmdzRm9yUGF0aFsgZmlyc3RBY3RpdmVJbmRleCBdID0gYmluZGluZzsKCiAgICAJCQkJfQoKICAgIAkJCX0gZWxzZSBpZiAoIG9iamVjdHNbIGluZGV4IF0gIT09IGtub3duT2JqZWN0ICkgewoKICAgIAkJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQW5pbWF0aW9uT2JqZWN0R3JvdXA6IERpZmZlcmVudCBvYmplY3RzIHdpdGggdGhlIHNhbWUgVVVJRCAnICsKICAgIAkJCQkJJ2RldGVjdGVkLiBDbGVhbiB0aGUgY2FjaGVzIG9yIHJlY3JlYXRlIHlvdXIgaW5mcmFzdHJ1Y3R1cmUgd2hlbiByZWxvYWRpbmcgc2NlbmVzLicgKTsKCiAgICAJCQl9IC8vIGVsc2UgdGhlIG9iamVjdCBpcyBhbHJlYWR5IHdoZXJlIHdlIHdhbnQgaXQgdG8gYmUKCiAgICAJCX0gLy8gZm9yIGFyZ3VtZW50cwoKICAgIAkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKCiAgICAJfSwKCiAgICAJcmVtb3ZlOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsCiAgICAJCQluQ2FjaGVkT2JqZWN0cyA9IHRoaXMubkNhY2hlZE9iamVjdHNfLAogICAgCQkJaW5kaWNlc0J5VVVJRCA9IHRoaXMuX2luZGljZXNCeVVVSUQsCiAgICAJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAogICAgCQkJbkJpbmRpbmdzID0gYmluZGluZ3MubGVuZ3RoOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCQl2YXIgb2JqZWN0ID0gYXJndW1lbnRzWyBpIF0sCiAgICAJCQkJdXVpZCA9IG9iamVjdC51dWlkLAogICAgCQkJCWluZGV4ID0gaW5kaWNlc0J5VVVJRFsgdXVpZCBdOwoKICAgIAkJCWlmICggaW5kZXggIT09IHVuZGVmaW5lZCAmJiBpbmRleCA+PSBuQ2FjaGVkT2JqZWN0cyApIHsKCiAgICAJCQkJLy8gbW92ZSBleGlzdGluZyBvYmplY3QgaW50byB0aGUgQ0FDSEVEIHJlZ2lvbgoKICAgIAkJCQl2YXIgbGFzdENhY2hlZEluZGV4ID0gbkNhY2hlZE9iamVjdHMgKyssCiAgICAJCQkJCWZpcnN0QWN0aXZlT2JqZWN0ID0gb2JqZWN0c1sgbGFzdENhY2hlZEluZGV4IF07CgogICAgCQkJCWluZGljZXNCeVVVSURbIGZpcnN0QWN0aXZlT2JqZWN0LnV1aWQgXSA9IGluZGV4OwogICAgCQkJCW9iamVjdHNbIGluZGV4IF0gPSBmaXJzdEFjdGl2ZU9iamVjdDsKCiAgICAJCQkJaW5kaWNlc0J5VVVJRFsgdXVpZCBdID0gbGFzdENhY2hlZEluZGV4OwogICAgCQkJCW9iamVjdHNbIGxhc3RDYWNoZWRJbmRleCBdID0gb2JqZWN0OwoKICAgIAkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCgogICAgCQkJCWZvciAoIHZhciBqID0gMCwgbSA9IG5CaW5kaW5nczsgaiAhPT0gbTsgKysgaiApIHsKCiAgICAJCQkJCXZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAogICAgCQkJCQkJZmlyc3RBY3RpdmUgPSBiaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdLAogICAgCQkJCQkJYmluZGluZyA9IGJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXTsKCiAgICAJCQkJCWJpbmRpbmdzRm9yUGF0aFsgaW5kZXggXSA9IGZpcnN0QWN0aXZlOwogICAgCQkJCQliaW5kaW5nc0ZvclBhdGhbIGxhc3RDYWNoZWRJbmRleCBdID0gYmluZGluZzsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCX0gLy8gZm9yIGFyZ3VtZW50cwoKICAgIAkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKCiAgICAJfSwKCiAgICAJLy8gcmVtb3ZlICYgZm9yZ2V0CiAgICAJdW5jYWNoZTogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIG9iamVjdHMgPSB0aGlzLl9vYmplY3RzLAogICAgCQkJbk9iamVjdHMgPSBvYmplY3RzLmxlbmd0aCwKICAgIAkJCW5DYWNoZWRPYmplY3RzID0gdGhpcy5uQ2FjaGVkT2JqZWN0c18sCiAgICAJCQlpbmRpY2VzQnlVVUlEID0gdGhpcy5faW5kaWNlc0J5VVVJRCwKICAgIAkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCiAgICAJCQluQmluZGluZ3MgPSBiaW5kaW5ncy5sZW5ndGg7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCXZhciBvYmplY3QgPSBhcmd1bWVudHNbIGkgXSwKICAgIAkJCQl1dWlkID0gb2JqZWN0LnV1aWQsCiAgICAJCQkJaW5kZXggPSBpbmRpY2VzQnlVVUlEWyB1dWlkIF07CgogICAgCQkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQlkZWxldGUgaW5kaWNlc0J5VVVJRFsgdXVpZCBdOwoKICAgIAkJCQlpZiAoIGluZGV4IDwgbkNhY2hlZE9iamVjdHMgKSB7CgogICAgCQkJCQkvLyBvYmplY3QgaXMgY2FjaGVkLCBzaHJpbmsgdGhlIENBQ0hFRCByZWdpb24KCiAgICAJCQkJCXZhciBmaXJzdEFjdGl2ZUluZGV4ID0gLS0gbkNhY2hlZE9iamVjdHMsCiAgICAJCQkJCQlsYXN0Q2FjaGVkT2JqZWN0ID0gb2JqZWN0c1sgZmlyc3RBY3RpdmVJbmRleCBdLAogICAgCQkJCQkJbGFzdEluZGV4ID0gLS0gbk9iamVjdHMsCiAgICAJCQkJCQlsYXN0T2JqZWN0ID0gb2JqZWN0c1sgbGFzdEluZGV4IF07CgogICAgCQkJCQkvLyBsYXN0IGNhY2hlZCBvYmplY3QgdGFrZXMgdGhpcyBvYmplY3QncyBwbGFjZQogICAgCQkJCQlpbmRpY2VzQnlVVUlEWyBsYXN0Q2FjaGVkT2JqZWN0LnV1aWQgXSA9IGluZGV4OwogICAgCQkJCQlvYmplY3RzWyBpbmRleCBdID0gbGFzdENhY2hlZE9iamVjdDsKCiAgICAJCQkJCS8vIGxhc3Qgb2JqZWN0IGdvZXMgdG8gdGhlIGFjdGl2YXRlZCBzbG90IGFuZCBwb3AKICAgIAkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBmaXJzdEFjdGl2ZUluZGV4OwogICAgCQkJCQlvYmplY3RzWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0T2JqZWN0OwogICAgCQkJCQlvYmplY3RzLnBvcCgpOwoKICAgIAkJCQkJLy8gYWNjb3VudGluZyBpcyBkb25lLCBub3cgZG8gdGhlIHNhbWUgZm9yIGFsbCBiaW5kaW5ncwoKICAgIAkJCQkJZm9yICggdmFyIGogPSAwLCBtID0gbkJpbmRpbmdzOyBqICE9PSBtOyArKyBqICkgewoKICAgIAkJCQkJCXZhciBiaW5kaW5nc0ZvclBhdGggPSBiaW5kaW5nc1sgaiBdLAogICAgCQkJCQkJCWxhc3RDYWNoZWQgPSBiaW5kaW5nc0ZvclBhdGhbIGZpcnN0QWN0aXZlSW5kZXggXSwKICAgIAkJCQkJCQlsYXN0ID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTsKCiAgICAJCQkJCQliaW5kaW5nc0ZvclBhdGhbIGluZGV4IF0gPSBsYXN0Q2FjaGVkOwogICAgCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBmaXJzdEFjdGl2ZUluZGV4IF0gPSBsYXN0OwogICAgCQkJCQkJYmluZGluZ3NGb3JQYXRoLnBvcCgpOwoKICAgIAkJCQkJfQoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJLy8gb2JqZWN0IGlzIGFjdGl2ZSwganVzdCBzd2FwIHdpdGggdGhlIGxhc3QgYW5kIHBvcAoKICAgIAkJCQkJdmFyIGxhc3RJbmRleCA9IC0tIG5PYmplY3RzLAogICAgCQkJCQkJbGFzdE9iamVjdCA9IG9iamVjdHNbIGxhc3RJbmRleCBdOwoKICAgIAkJCQkJaW5kaWNlc0J5VVVJRFsgbGFzdE9iamVjdC51dWlkIF0gPSBpbmRleDsKICAgIAkJCQkJb2JqZWN0c1sgaW5kZXggXSA9IGxhc3RPYmplY3Q7CiAgICAJCQkJCW9iamVjdHMucG9wKCk7CgogICAgCQkJCQkvLyBhY2NvdW50aW5nIGlzIGRvbmUsIG5vdyBkbyB0aGUgc2FtZSBmb3IgYWxsIGJpbmRpbmdzCgogICAgCQkJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBuQmluZGluZ3M7IGogIT09IG07ICsrIGogKSB7CgogICAgCQkJCQkJdmFyIGJpbmRpbmdzRm9yUGF0aCA9IGJpbmRpbmdzWyBqIF07CgogICAgCQkJCQkJYmluZGluZ3NGb3JQYXRoWyBpbmRleCBdID0gYmluZGluZ3NGb3JQYXRoWyBsYXN0SW5kZXggXTsKICAgIAkJCQkJCWJpbmRpbmdzRm9yUGF0aC5wb3AoKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJfSAvLyBjYWNoZWQgb3IgYWN0aXZlCgogICAgCQkJfSAvLyBpZiBvYmplY3QgaXMga25vd24KCiAgICAJCX0gLy8gZm9yIGFyZ3VtZW50cwoKICAgIAkJdGhpcy5uQ2FjaGVkT2JqZWN0c18gPSBuQ2FjaGVkT2JqZWN0czsKCiAgICAJfSwKCiAgICAJLy8gSW50ZXJuYWwgaW50ZXJmYWNlIHVzZWQgYnkgYmVmcmllbmRlZCBQcm9wZXJ0eUJpbmRpbmcuQ29tcG9zaXRlOgoKICAgIAlzdWJzY3JpYmVfOiBmdW5jdGlvbiAoIHBhdGgsIHBhcnNlZFBhdGggKSB7CgogICAgCQkvLyByZXR1cm5zIGFuIGFycmF5IG9mIGJpbmRpbmdzIGZvciB0aGUgZ2l2ZW4gcGF0aCB0aGF0IGlzIGNoYW5nZWQKICAgIAkJLy8gYWNjb3JkaW5nIHRvIHRoZSBjb250YWluZWQgb2JqZWN0cyBpbiB0aGUgZ3JvdXAKCiAgICAJCXZhciBpbmRpY2VzQnlQYXRoID0gdGhpcy5fYmluZGluZ3NJbmRpY2VzQnlQYXRoLAogICAgCQkJaW5kZXggPSBpbmRpY2VzQnlQYXRoWyBwYXRoIF0sCiAgICAJCQliaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzOwoKICAgIAkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgcmV0dXJuIGJpbmRpbmdzWyBpbmRleCBdOwoKICAgIAkJdmFyIHBhdGhzID0gdGhpcy5fcGF0aHMsCiAgICAJCQlwYXJzZWRQYXRocyA9IHRoaXMuX3BhcnNlZFBhdGhzLAogICAgCQkJb2JqZWN0cyA9IHRoaXMuX29iamVjdHMsCiAgICAJCQluT2JqZWN0cyA9IG9iamVjdHMubGVuZ3RoLAogICAgCQkJbkNhY2hlZE9iamVjdHMgPSB0aGlzLm5DYWNoZWRPYmplY3RzXywKICAgIAkJCWJpbmRpbmdzRm9yUGF0aCA9IG5ldyBBcnJheSggbk9iamVjdHMgKTsKCiAgICAJCWluZGV4ID0gYmluZGluZ3MubGVuZ3RoOwoKICAgIAkJaW5kaWNlc0J5UGF0aFsgcGF0aCBdID0gaW5kZXg7CgogICAgCQlwYXRocy5wdXNoKCBwYXRoICk7CiAgICAJCXBhcnNlZFBhdGhzLnB1c2goIHBhcnNlZFBhdGggKTsKICAgIAkJYmluZGluZ3MucHVzaCggYmluZGluZ3NGb3JQYXRoICk7CgogICAgCQlmb3IgKCB2YXIgaSA9IG5DYWNoZWRPYmplY3RzLCBuID0gb2JqZWN0cy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJdmFyIG9iamVjdCA9IG9iamVjdHNbIGkgXTsKICAgIAkJCWJpbmRpbmdzRm9yUGF0aFsgaSBdID0gbmV3IFByb3BlcnR5QmluZGluZyggb2JqZWN0LCBwYXRoLCBwYXJzZWRQYXRoICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gYmluZGluZ3NGb3JQYXRoOwoKICAgIAl9LAoKICAgIAl1bnN1YnNjcmliZV86IGZ1bmN0aW9uICggcGF0aCApIHsKCiAgICAJCS8vIHRlbGxzIHRoZSBncm91cCB0byBmb3JnZXQgYWJvdXQgYSBwcm9wZXJ0eSBwYXRoIGFuZCBubyBsb25nZXIKICAgIAkJLy8gdXBkYXRlIHRoZSBhcnJheSBwcmV2aW91c2x5IG9idGFpbmVkIHdpdGggJ3N1YnNjcmliZV8nCgogICAgCQl2YXIgaW5kaWNlc0J5UGF0aCA9IHRoaXMuX2JpbmRpbmdzSW5kaWNlc0J5UGF0aCwKICAgIAkJCWluZGV4ID0gaW5kaWNlc0J5UGF0aFsgcGF0aCBdOwoKICAgIAkJaWYgKCBpbmRleCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCXZhciBwYXRocyA9IHRoaXMuX3BhdGhzLAogICAgCQkJCXBhcnNlZFBhdGhzID0gdGhpcy5fcGFyc2VkUGF0aHMsCiAgICAJCQkJYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncywKICAgIAkJCQlsYXN0QmluZGluZ3NJbmRleCA9IGJpbmRpbmdzLmxlbmd0aCAtIDEsCiAgICAJCQkJbGFzdEJpbmRpbmdzID0gYmluZGluZ3NbIGxhc3RCaW5kaW5nc0luZGV4IF0sCiAgICAJCQkJbGFzdEJpbmRpbmdzUGF0aCA9IHBhdGhbIGxhc3RCaW5kaW5nc0luZGV4IF07CgogICAgCQkJaW5kaWNlc0J5UGF0aFsgbGFzdEJpbmRpbmdzUGF0aCBdID0gaW5kZXg7CgogICAgCQkJYmluZGluZ3NbIGluZGV4IF0gPSBsYXN0QmluZGluZ3M7CiAgICAJCQliaW5kaW5ncy5wb3AoKTsKCiAgICAJCQlwYXJzZWRQYXRoc1sgaW5kZXggXSA9IHBhcnNlZFBhdGhzWyBsYXN0QmluZGluZ3NJbmRleCBdOwogICAgCQkJcGFyc2VkUGF0aHMucG9wKCk7CgogICAgCQkJcGF0aHNbIGluZGV4IF0gPSBwYXRoc1sgbGFzdEJpbmRpbmdzSW5kZXggXTsKICAgIAkJCXBhdGhzLnBvcCgpOwoKICAgIAkJfQoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICoKICAgICAqIEFjdGlvbiBwcm92aWRlZCBieSBBbmltYXRpb25NaXhlciBmb3Igc2NoZWR1bGluZyBjbGlwIHBsYXliYWNrIG9uIHNwZWNpZmljCiAgICAgKiBvYmplY3RzLgogICAgICoKICAgICAqIEBhdXRob3IgQmVuIEhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCiAgICAgKiBAYXV0aG9yIERhdmlkIFNhcm5vIC8gaHR0cDovL2xpZ2h0aGF1cy51cy8KICAgICAqIEBhdXRob3IgdHNjaHcKICAgICAqCiAgICAgKi8KCiAgICBmdW5jdGlvbiBBbmltYXRpb25BY3Rpb24oIG1peGVyLCBjbGlwLCBsb2NhbFJvb3QgKSB7CgogICAgCXRoaXMuX21peGVyID0gbWl4ZXI7CiAgICAJdGhpcy5fY2xpcCA9IGNsaXA7CiAgICAJdGhpcy5fbG9jYWxSb290ID0gbG9jYWxSb290IHx8IG51bGw7CgogICAgCXZhciB0cmFja3MgPSBjbGlwLnRyYWNrcywKICAgIAkJblRyYWNrcyA9IHRyYWNrcy5sZW5ndGgsCiAgICAJCWludGVycG9sYW50cyA9IG5ldyBBcnJheSggblRyYWNrcyApOwoKICAgIAl2YXIgaW50ZXJwb2xhbnRTZXR0aW5ncyA9IHsKICAgIAkJZW5kaW5nU3RhcnQ6IFplcm9DdXJ2YXR1cmVFbmRpbmcsCiAgICAJCWVuZGluZ0VuZDogWmVyb0N1cnZhdHVyZUVuZGluZwogICAgCX07CgogICAgCWZvciAoIHZhciBpID0gMDsgaSAhPT0gblRyYWNrczsgKysgaSApIHsKCiAgICAJCXZhciBpbnRlcnBvbGFudCA9IHRyYWNrc1sgaSBdLmNyZWF0ZUludGVycG9sYW50KCBudWxsICk7CiAgICAJCWludGVycG9sYW50c1sgaSBdID0gaW50ZXJwb2xhbnQ7CiAgICAJCWludGVycG9sYW50LnNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKCiAgICAJfQoKICAgIAl0aGlzLl9pbnRlcnBvbGFudFNldHRpbmdzID0gaW50ZXJwb2xhbnRTZXR0aW5nczsKCiAgICAJdGhpcy5faW50ZXJwb2xhbnRzID0gaW50ZXJwb2xhbnRzOyAvLyBib3VuZCBieSB0aGUgbWl4ZXIKCiAgICAJLy8gaW5zaWRlOiBQcm9wZXJ0eU1peGVyIChtYW5hZ2VkIGJ5IHRoZSBtaXhlcikKICAgIAl0aGlzLl9wcm9wZXJ0eUJpbmRpbmdzID0gbmV3IEFycmF5KCBuVHJhY2tzICk7CgogICAgCXRoaXMuX2NhY2hlSW5kZXggPSBudWxsOyAvLyBmb3IgdGhlIG1lbW9yeSBtYW5hZ2VyCiAgICAJdGhpcy5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7IC8vIGZvciB0aGUgbWVtb3J5IG1hbmFnZXIKCiAgICAJdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQgPSBudWxsOwogICAgCXRoaXMuX3dlaWdodEludGVycG9sYW50ID0gbnVsbDsKCiAgICAJdGhpcy5sb29wID0gTG9vcFJlcGVhdDsKICAgIAl0aGlzLl9sb29wQ291bnQgPSAtIDE7CgogICAgCS8vIGdsb2JhbCBtaXhlciB0aW1lIHdoZW4gdGhlIGFjdGlvbiBpcyB0byBiZSBzdGFydGVkCiAgICAJLy8gaXQncyBzZXQgYmFjayB0byAnbnVsbCcgdXBvbiBzdGFydCBvZiB0aGUgYWN0aW9uCiAgICAJdGhpcy5fc3RhcnRUaW1lID0gbnVsbDsKCiAgICAJLy8gc2NhbGVkIGxvY2FsIHRpbWUgb2YgdGhlIGFjdGlvbgogICAgCS8vIGdldHMgY2xhbXBlZCBvciB3cmFwcGVkIHRvIDAuLmNsaXAuZHVyYXRpb24gYWNjb3JkaW5nIHRvIGxvb3AKICAgIAl0aGlzLnRpbWUgPSAwOwoKICAgIAl0aGlzLnRpbWVTY2FsZSA9IDE7CiAgICAJdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlID0gMTsKCiAgICAJdGhpcy53ZWlnaHQgPSAxOwogICAgCXRoaXMuX2VmZmVjdGl2ZVdlaWdodCA9IDE7CgogICAgCXRoaXMucmVwZXRpdGlvbnMgPSBJbmZpbml0eTsgLy8gbm8uIG9mIHJlcGV0aXRpb25zIHdoZW4gbG9vcGluZwoKICAgIAl0aGlzLnBhdXNlZCA9IGZhbHNlOyAvLyB0cnVlIC0+IHplcm8gZWZmZWN0aXZlIHRpbWUgc2NhbGUKICAgIAl0aGlzLmVuYWJsZWQgPSB0cnVlOyAvLyBmYWxzZSAtPiB6ZXJvIGVmZmVjdGl2ZSB3ZWlnaHQKCiAgICAJdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCA9IGZhbHNlOy8vIGtlZXAgZmVlZGluZyB0aGUgbGFzdCBmcmFtZT8KCiAgICAJdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID0gdHJ1ZTsvLyBmb3Igc21vb3RoIGludGVycG9sYXRpb24gdy9vIHNlcGFyYXRlCiAgICAJdGhpcy56ZXJvU2xvcGVBdEVuZCA9IHRydWU7Ly8gY2xpcHMgZm9yIHN0YXJ0LCBsb29wIGFuZCBlbmQKCiAgICB9CgogICAgT2JqZWN0LmFzc2lnbiggQW5pbWF0aW9uQWN0aW9uLnByb3RvdHlwZSwgewoKICAgIAkvLyBTdGF0ZSAmIFNjaGVkdWxpbmcKCiAgICAJcGxheTogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5fbWl4ZXIuX2FjdGl2YXRlQWN0aW9uKCB0aGlzICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc3RvcDogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5fbWl4ZXIuX2RlYWN0aXZhdGVBY3Rpb24oIHRoaXMgKTsKCiAgICAJCXJldHVybiB0aGlzLnJlc2V0KCk7CgogICAgCX0sCgogICAgCXJlc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLnBhdXNlZCA9IGZhbHNlOwogICAgCQl0aGlzLmVuYWJsZWQgPSB0cnVlOwoKICAgIAkJdGhpcy50aW1lID0gMDsgLy8gcmVzdGFydCBjbGlwCiAgICAJCXRoaXMuX2xvb3BDb3VudCA9IC0gMTsvLyBmb3JnZXQgcHJldmlvdXMgbG9vcHMKICAgIAkJdGhpcy5fc3RhcnRUaW1lID0gbnVsbDsvLyBmb3JnZXQgc2NoZWR1bGluZwoKICAgIAkJcmV0dXJuIHRoaXMuc3RvcEZhZGluZygpLnN0b3BXYXJwaW5nKCk7CgogICAgCX0sCgogICAgCWlzUnVubmluZzogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuZW5hYmxlZCAmJiAhIHRoaXMucGF1c2VkICYmIHRoaXMudGltZVNjYWxlICE9PSAwICYmCiAgICAJCQl0aGlzLl9zdGFydFRpbWUgPT09IG51bGwgJiYgdGhpcy5fbWl4ZXIuX2lzQWN0aXZlQWN0aW9uKCB0aGlzICk7CgogICAgCX0sCgogICAgCS8vIHJldHVybiB0cnVlIHdoZW4gcGxheSBoYXMgYmVlbiBjYWxsZWQKICAgIAlpc1NjaGVkdWxlZDogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuX21peGVyLl9pc0FjdGl2ZUFjdGlvbiggdGhpcyApOwoKICAgIAl9LAoKICAgIAlzdGFydEF0OiBmdW5jdGlvbiAoIHRpbWUgKSB7CgogICAgCQl0aGlzLl9zdGFydFRpbWUgPSB0aW1lOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldExvb3A6IGZ1bmN0aW9uICggbW9kZSwgcmVwZXRpdGlvbnMgKSB7CgogICAgCQl0aGlzLmxvb3AgPSBtb2RlOwogICAgCQl0aGlzLnJlcGV0aXRpb25zID0gcmVwZXRpdGlvbnM7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJLy8gV2VpZ2h0CgogICAgCS8vIHNldCB0aGUgd2VpZ2h0IHN0b3BwaW5nIGFueSBzY2hlZHVsZWQgZmFkaW5nCiAgICAJLy8gYWx0aG91Z2ggLmVuYWJsZWQgPSBmYWxzZSB5aWVsZHMgYW4gZWZmZWN0aXZlIHdlaWdodCBvZiB6ZXJvLCB0aGlzCiAgICAJLy8gbWV0aG9kIGRvZXMgKm5vdCogY2hhbmdlIC5lbmFibGVkLCBiZWNhdXNlIGl0IHdvdWxkIGJlIGNvbmZ1c2luZwogICAgCXNldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCB3ZWlnaHQgKSB7CgogICAgCQl0aGlzLndlaWdodCA9IHdlaWdodDsKCiAgICAJCS8vIG5vdGU6IHNhbWUgbG9naWMgYXMgd2hlbiB1cGRhdGVkIGF0IHJ1bnRpbWUKICAgIAkJdGhpcy5fZWZmZWN0aXZlV2VpZ2h0ID0gdGhpcy5lbmFibGVkID8gd2VpZ2h0IDogMDsKCiAgICAJCXJldHVybiB0aGlzLnN0b3BGYWRpbmcoKTsKCiAgICAJfSwKCiAgICAJLy8gcmV0dXJuIHRoZSB3ZWlnaHQgY29uc2lkZXJpbmcgZmFkaW5nIGFuZCAuZW5hYmxlZAogICAgCWdldEVmZmVjdGl2ZVdlaWdodDogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuX2VmZmVjdGl2ZVdlaWdodDsKCiAgICAJfSwKCiAgICAJZmFkZUluOiBmdW5jdGlvbiAoIGR1cmF0aW9uICkgewoKICAgIAkJcmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMCwgMSApOwoKICAgIAl9LAoKICAgIAlmYWRlT3V0OiBmdW5jdGlvbiAoIGR1cmF0aW9uICkgewoKICAgIAkJcmV0dXJuIHRoaXMuX3NjaGVkdWxlRmFkaW5nKCBkdXJhdGlvbiwgMSwgMCApOwoKICAgIAl9LAoKICAgIAljcm9zc0ZhZGVGcm9tOiBmdW5jdGlvbiAoIGZhZGVPdXRBY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkgewoKICAgIAkJZmFkZU91dEFjdGlvbi5mYWRlT3V0KCBkdXJhdGlvbiApOwogICAgCQl0aGlzLmZhZGVJbiggZHVyYXRpb24gKTsKCiAgICAJCWlmICggd2FycCApIHsKCiAgICAJCQl2YXIgZmFkZUluRHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uLAogICAgCQkJCWZhZGVPdXREdXJhdGlvbiA9IGZhZGVPdXRBY3Rpb24uX2NsaXAuZHVyYXRpb24sCgogICAgCQkJCXN0YXJ0RW5kUmF0aW8gPSBmYWRlT3V0RHVyYXRpb24gLyBmYWRlSW5EdXJhdGlvbiwKICAgIAkJCQllbmRTdGFydFJhdGlvID0gZmFkZUluRHVyYXRpb24gLyBmYWRlT3V0RHVyYXRpb247CgogICAgCQkJZmFkZU91dEFjdGlvbi53YXJwKCAxLjAsIHN0YXJ0RW5kUmF0aW8sIGR1cmF0aW9uICk7CiAgICAJCQl0aGlzLndhcnAoIGVuZFN0YXJ0UmF0aW8sIDEuMCwgZHVyYXRpb24gKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljcm9zc0ZhZGVUbzogZnVuY3Rpb24gKCBmYWRlSW5BY3Rpb24sIGR1cmF0aW9uLCB3YXJwICkgewoKICAgIAkJcmV0dXJuIGZhZGVJbkFjdGlvbi5jcm9zc0ZhZGVGcm9tKCB0aGlzLCBkdXJhdGlvbiwgd2FycCApOwoKICAgIAl9LAoKICAgIAlzdG9wRmFkaW5nOiBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgd2VpZ2h0SW50ZXJwb2xhbnQgPSB0aGlzLl93ZWlnaHRJbnRlcnBvbGFudDsKCiAgICAJCWlmICggd2VpZ2h0SW50ZXJwb2xhbnQgIT09IG51bGwgKSB7CgogICAgCQkJdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQgPSBudWxsOwogICAgCQkJdGhpcy5fbWl4ZXIuX3Rha2VCYWNrQ29udHJvbEludGVycG9sYW50KCB3ZWlnaHRJbnRlcnBvbGFudCApOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCS8vIFRpbWUgU2NhbGUgQ29udHJvbAoKICAgIAkvLyBzZXQgdGhlIHRpbWUgc2NhbGUgc3RvcHBpbmcgYW55IHNjaGVkdWxlZCB3YXJwaW5nCiAgICAJLy8gYWx0aG91Z2ggLnBhdXNlZCA9IHRydWUgeWllbGRzIGFuIGVmZmVjdGl2ZSB0aW1lIHNjYWxlIG9mIHplcm8sIHRoaXMKICAgIAkvLyBtZXRob2QgZG9lcyAqbm90KiBjaGFuZ2UgLnBhdXNlZCwgYmVjYXVzZSBpdCB3b3VsZCBiZSBjb25mdXNpbmcKICAgIAlzZXRFZmZlY3RpdmVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZVNjYWxlICkgewoKICAgIAkJdGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7CiAgICAJCXRoaXMuX2VmZmVjdGl2ZVRpbWVTY2FsZSA9IHRoaXMucGF1c2VkID8gMCA6IHRpbWVTY2FsZTsKCiAgICAJCXJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7CgogICAgCX0sCgogICAgCS8vIHJldHVybiB0aGUgdGltZSBzY2FsZSBjb25zaWRlcmluZyB3YXJwaW5nIGFuZCAucGF1c2VkCiAgICAJZ2V0RWZmZWN0aXZlVGltZVNjYWxlOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5fZWZmZWN0aXZlVGltZVNjYWxlOwoKICAgIAl9LAoKICAgIAlzZXREdXJhdGlvbjogZnVuY3Rpb24gKCBkdXJhdGlvbiApIHsKCiAgICAJCXRoaXMudGltZVNjYWxlID0gdGhpcy5fY2xpcC5kdXJhdGlvbiAvIGR1cmF0aW9uOwoKICAgIAkJcmV0dXJuIHRoaXMuc3RvcFdhcnBpbmcoKTsKCiAgICAJfSwKCiAgICAJc3luY1dpdGg6IGZ1bmN0aW9uICggYWN0aW9uICkgewoKICAgIAkJdGhpcy50aW1lID0gYWN0aW9uLnRpbWU7CiAgICAJCXRoaXMudGltZVNjYWxlID0gYWN0aW9uLnRpbWVTY2FsZTsKCiAgICAJCXJldHVybiB0aGlzLnN0b3BXYXJwaW5nKCk7CgogICAgCX0sCgogICAgCWhhbHQ6IGZ1bmN0aW9uICggZHVyYXRpb24gKSB7CgogICAgCQlyZXR1cm4gdGhpcy53YXJwKCB0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUsIDAsIGR1cmF0aW9uICk7CgogICAgCX0sCgogICAgCXdhcnA6IGZ1bmN0aW9uICggc3RhcnRUaW1lU2NhbGUsIGVuZFRpbWVTY2FsZSwgZHVyYXRpb24gKSB7CgogICAgCQl2YXIgbWl4ZXIgPSB0aGlzLl9taXhlciwgbm93ID0gbWl4ZXIudGltZSwKICAgIAkJCWludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQsCgogICAgCQkJdGltZVNjYWxlID0gdGhpcy50aW1lU2NhbGU7CgogICAgCQlpZiAoIGludGVycG9sYW50ID09PSBudWxsICkgewoKICAgIAkJCWludGVycG9sYW50ID0gbWl4ZXIuX2xlbmRDb250cm9sSW50ZXJwb2xhbnQoKTsKICAgIAkJCXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gaW50ZXJwb2xhbnQ7CgogICAgCQl9CgogICAgCQl2YXIgdGltZXMgPSBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnMsCiAgICAJCQl2YWx1ZXMgPSBpbnRlcnBvbGFudC5zYW1wbGVWYWx1ZXM7CgogICAgCQl0aW1lc1sgMCBdID0gbm93OwogICAgCQl0aW1lc1sgMSBdID0gbm93ICsgZHVyYXRpb247CgogICAgCQl2YWx1ZXNbIDAgXSA9IHN0YXJ0VGltZVNjYWxlIC8gdGltZVNjYWxlOwogICAgCQl2YWx1ZXNbIDEgXSA9IGVuZFRpbWVTY2FsZSAvIHRpbWVTY2FsZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlzdG9wV2FycGluZzogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIHRpbWVTY2FsZUludGVycG9sYW50ID0gdGhpcy5fdGltZVNjYWxlSW50ZXJwb2xhbnQ7CgogICAgCQlpZiAoIHRpbWVTY2FsZUludGVycG9sYW50ICE9PSBudWxsICkgewoKICAgIAkJCXRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50ID0gbnVsbDsKICAgIAkJCXRoaXMuX21peGVyLl90YWtlQmFja0NvbnRyb2xJbnRlcnBvbGFudCggdGltZVNjYWxlSW50ZXJwb2xhbnQgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAkvLyBPYmplY3QgQWNjZXNzb3JzCgogICAgCWdldE1peGVyOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5fbWl4ZXI7CgogICAgCX0sCgogICAgCWdldENsaXA6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiB0aGlzLl9jbGlwOwoKICAgIAl9LAoKICAgIAlnZXRSb290OiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5fbG9jYWxSb290IHx8IHRoaXMuX21peGVyLl9yb290OwoKICAgIAl9LAoKICAgIAkvLyBJbnRlcm5hCgogICAgCV91cGRhdGU6IGZ1bmN0aW9uICggdGltZSwgZGVsdGFUaW1lLCB0aW1lRGlyZWN0aW9uLCBhY2N1SW5kZXggKSB7CgogICAgCQkvLyBjYWxsZWQgYnkgdGhlIG1peGVyCgogICAgCQlpZiAoICEgdGhpcy5lbmFibGVkICkgewoKICAgIAkJCS8vIGNhbGwgLl91cGRhdGVXZWlnaHQoKSB0byB1cGRhdGUgLl9lZmZlY3RpdmVXZWlnaHQKCiAgICAJCQl0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTsKICAgIAkJCXJldHVybjsKCiAgICAJCX0KCiAgICAJCXZhciBzdGFydFRpbWUgPSB0aGlzLl9zdGFydFRpbWU7CgogICAgCQlpZiAoIHN0YXJ0VGltZSAhPT0gbnVsbCApIHsKCiAgICAJCQkvLyBjaGVjayBmb3Igc2NoZWR1bGVkIHN0YXJ0IG9mIGFjdGlvbgoKICAgIAkJCXZhciB0aW1lUnVubmluZyA9ICggdGltZSAtIHN0YXJ0VGltZSApICogdGltZURpcmVjdGlvbjsKICAgIAkJCWlmICggdGltZVJ1bm5pbmcgPCAwIHx8IHRpbWVEaXJlY3Rpb24gPT09IDAgKSB7CgogICAgCQkJCXJldHVybjsgLy8geWV0IHRvIGNvbWUgLyBkb24ndCBkZWNpZGUgd2hlbiBkZWx0YSA9IDAKCiAgICAJCQl9CgogICAgCQkJLy8gc3RhcnQKCiAgICAJCQl0aGlzLl9zdGFydFRpbWUgPSBudWxsOyAvLyB1bnNjaGVkdWxlCiAgICAJCQlkZWx0YVRpbWUgPSB0aW1lRGlyZWN0aW9uICogdGltZVJ1bm5pbmc7CgogICAgCQl9CgogICAgCQkvLyBhcHBseSB0aW1lIHNjYWxlIGFuZCBhZHZhbmNlIHRpbWUKCiAgICAJCWRlbHRhVGltZSAqPSB0aGlzLl91cGRhdGVUaW1lU2NhbGUoIHRpbWUgKTsKICAgIAkJdmFyIGNsaXBUaW1lID0gdGhpcy5fdXBkYXRlVGltZSggZGVsdGFUaW1lICk7CgogICAgCQkvLyBub3RlOiBfdXBkYXRlVGltZSBtYXkgZGlzYWJsZSB0aGUgYWN0aW9uIHJlc3VsdGluZyBpbgogICAgCQkvLyBhbiBlZmZlY3RpdmUgd2VpZ2h0IG9mIDAKCiAgICAJCXZhciB3ZWlnaHQgPSB0aGlzLl91cGRhdGVXZWlnaHQoIHRpbWUgKTsKCiAgICAJCWlmICggd2VpZ2h0ID4gMCApIHsKCiAgICAJCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5faW50ZXJwb2xhbnRzOwogICAgCQkJdmFyIHByb3BlcnR5TWl4ZXJzID0gdGhpcy5fcHJvcGVydHlCaW5kaW5nczsKCiAgICAJCQlmb3IgKCB2YXIgaiA9IDAsIG0gPSBpbnRlcnBvbGFudHMubGVuZ3RoOyBqICE9PSBtOyArKyBqICkgewoKICAgIAkJCQlpbnRlcnBvbGFudHNbIGogXS5ldmFsdWF0ZSggY2xpcFRpbWUgKTsKICAgIAkJCQlwcm9wZXJ0eU1peGVyc1sgaiBdLmFjY3VtdWxhdGUoIGFjY3VJbmRleCwgd2VpZ2h0ICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9LAoKICAgIAlfdXBkYXRlV2VpZ2h0OiBmdW5jdGlvbiAoIHRpbWUgKSB7CgogICAgCQl2YXIgd2VpZ2h0ID0gMDsKCiAgICAJCWlmICggdGhpcy5lbmFibGVkICkgewoKICAgIAkJCXdlaWdodCA9IHRoaXMud2VpZ2h0OwogICAgCQkJdmFyIGludGVycG9sYW50ID0gdGhpcy5fd2VpZ2h0SW50ZXJwb2xhbnQ7CgogICAgCQkJaWYgKCBpbnRlcnBvbGFudCAhPT0gbnVsbCApIHsKCiAgICAJCQkJdmFyIGludGVycG9sYW50VmFsdWUgPSBpbnRlcnBvbGFudC5ldmFsdWF0ZSggdGltZSApWyAwIF07CgogICAgCQkJCXdlaWdodCAqPSBpbnRlcnBvbGFudFZhbHVlOwoKICAgIAkJCQlpZiAoIHRpbWUgPiBpbnRlcnBvbGFudC5wYXJhbWV0ZXJQb3NpdGlvbnNbIDEgXSApIHsKCiAgICAJCQkJCXRoaXMuc3RvcEZhZGluZygpOwoKICAgIAkJCQkJaWYgKCBpbnRlcnBvbGFudFZhbHVlID09PSAwICkgewoKICAgIAkJCQkJCS8vIGZhZGVkIG91dCwgZGlzYWJsZQogICAgCQkJCQkJdGhpcy5lbmFibGVkID0gZmFsc2U7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQl0aGlzLl9lZmZlY3RpdmVXZWlnaHQgPSB3ZWlnaHQ7CiAgICAJCXJldHVybiB3ZWlnaHQ7CgogICAgCX0sCgogICAgCV91cGRhdGVUaW1lU2NhbGU6IGZ1bmN0aW9uICggdGltZSApIHsKCiAgICAJCXZhciB0aW1lU2NhbGUgPSAwOwoKICAgIAkJaWYgKCAhIHRoaXMucGF1c2VkICkgewoKICAgIAkJCXRpbWVTY2FsZSA9IHRoaXMudGltZVNjYWxlOwoKICAgIAkJCXZhciBpbnRlcnBvbGFudCA9IHRoaXMuX3RpbWVTY2FsZUludGVycG9sYW50OwoKICAgIAkJCWlmICggaW50ZXJwb2xhbnQgIT09IG51bGwgKSB7CgogICAgCQkJCXZhciBpbnRlcnBvbGFudFZhbHVlID0gaW50ZXJwb2xhbnQuZXZhbHVhdGUoIHRpbWUgKVsgMCBdOwoKICAgIAkJCQl0aW1lU2NhbGUgKj0gaW50ZXJwb2xhbnRWYWx1ZTsKCiAgICAJCQkJaWYgKCB0aW1lID4gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zWyAxIF0gKSB7CgogICAgCQkJCQl0aGlzLnN0b3BXYXJwaW5nKCk7CgogICAgCQkJCQlpZiAoIHRpbWVTY2FsZSA9PT0gMCApIHsKCiAgICAJCQkJCQkvLyBtb3Rpb24gaGFzIGhhbHRlZCwgcGF1c2UKICAgIAkJCQkJCXRoaXMucGF1c2VkID0gdHJ1ZTsKCiAgICAJCQkJCX0gZWxzZSB7CgogICAgCQkJCQkJLy8gd2FycCBkb25lIC0gYXBwbHkgZmluYWwgdGltZSBzY2FsZQogICAgCQkJCQkJdGhpcy50aW1lU2NhbGUgPSB0aW1lU2NhbGU7CgogICAgCQkJCQl9CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQl9CgogICAgCQl0aGlzLl9lZmZlY3RpdmVUaW1lU2NhbGUgPSB0aW1lU2NhbGU7CiAgICAJCXJldHVybiB0aW1lU2NhbGU7CgogICAgCX0sCgogICAgCV91cGRhdGVUaW1lOiBmdW5jdGlvbiAoIGRlbHRhVGltZSApIHsKCiAgICAJCXZhciB0aW1lID0gdGhpcy50aW1lICsgZGVsdGFUaW1lOwogICAgCQl2YXIgZHVyYXRpb24gPSB0aGlzLl9jbGlwLmR1cmF0aW9uOwogICAgCQl2YXIgbG9vcCA9IHRoaXMubG9vcDsKICAgIAkJdmFyIGxvb3BDb3VudCA9IHRoaXMuX2xvb3BDb3VudDsKCiAgICAJCXZhciBwaW5nUG9uZyA9ICggbG9vcCA9PT0gTG9vcFBpbmdQb25nICk7CgogICAgCQlpZiAoIGRlbHRhVGltZSA9PT0gMCApIHsKCiAgICAJCQlpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkgcmV0dXJuIHRpbWU7CgogICAgCQkJcmV0dXJuICggcGluZ1BvbmcgJiYgKCBsb29wQ291bnQgJiAxICkgPT09IDEgKSA/IGR1cmF0aW9uIC0gdGltZSA6IHRpbWU7CgogICAgCQl9CgogICAgCQlpZiAoIGxvb3AgPT09IExvb3BPbmNlICkgewoKICAgIAkJCWlmICggbG9vcENvdW50ID09PSAtIDEgKSB7CgogICAgCQkJCS8vIGp1c3Qgc3RhcnRlZAoKICAgIAkJCQl0aGlzLl9sb29wQ291bnQgPSAwOwogICAgCQkJCXRoaXMuX3NldEVuZGluZ3MoIHRydWUsIHRydWUsIGZhbHNlICk7CgogICAgCQkJfQoKICAgIAkJCWhhbmRsZV9zdG9wOiB7CgogICAgCQkJCWlmICggdGltZSA+PSBkdXJhdGlvbiApIHsKCiAgICAJCQkJCXRpbWUgPSBkdXJhdGlvbjsKCiAgICAJCQkJfSBlbHNlIGlmICggdGltZSA8IDAgKSB7CgogICAgCQkJCQl0aW1lID0gMDsKCiAgICAJCQkJfSBlbHNlIHsKCiAgICAJCQkJCXRoaXMudGltZSA9IHRpbWU7CgogICAgCQkJCQlicmVhayBoYW5kbGVfc3RvcDsKCiAgICAJCQkJfQoKICAgIAkJCQlpZiAoIHRoaXMuY2xhbXBXaGVuRmluaXNoZWQgKSB0aGlzLnBhdXNlZCA9IHRydWU7CiAgICAJCQkJZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTsKCiAgICAJCQkJdGhpcy50aW1lID0gdGltZTsKCiAgICAJCQkJdGhpcy5fbWl4ZXIuZGlzcGF0Y2hFdmVudCggewogICAgCQkJCQl0eXBlOiAnZmluaXNoZWQnLCBhY3Rpb246IHRoaXMsCiAgICAJCQkJCWRpcmVjdGlvbjogZGVsdGFUaW1lIDwgMCA/IC0gMSA6IDEKICAgIAkJCQl9ICk7CgogICAgCQkJfQoKICAgIAkJfSBlbHNlIHsgLy8gcmVwZXRpdGl2ZSBSZXBlYXQgb3IgUGluZ1BvbmcKCiAgICAJCQlpZiAoIGxvb3BDb3VudCA9PT0gLSAxICkgewoKICAgIAkJCQkvLyBqdXN0IHN0YXJ0ZWQKCiAgICAJCQkJaWYgKCBkZWx0YVRpbWUgPj0gMCApIHsKCiAgICAJCQkJCWxvb3BDb3VudCA9IDA7CgogICAgCQkJCQl0aGlzLl9zZXRFbmRpbmdzKCB0cnVlLCB0aGlzLnJlcGV0aXRpb25zID09PSAwLCBwaW5nUG9uZyApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJLy8gd2hlbiBsb29waW5nIGluIHJldmVyc2UgZGlyZWN0aW9uLCB0aGUgaW5pdGlhbAogICAgCQkJCQkvLyB0cmFuc2l0aW9uIHRocm91Z2ggemVybyBjb3VudHMgYXMgYSByZXBldGl0aW9uLAogICAgCQkJCQkvLyBzbyBsZWF2ZSBsb29wQ291bnQgYXQgLTEKCiAgICAJCQkJCXRoaXMuX3NldEVuZGluZ3MoIHRoaXMucmVwZXRpdGlvbnMgPT09IDAsIHRydWUsIHBpbmdQb25nICk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJaWYgKCB0aW1lID49IGR1cmF0aW9uIHx8IHRpbWUgPCAwICkgewoKICAgIAkJCQkvLyB3cmFwIGFyb3VuZAoKICAgIAkJCQl2YXIgbG9vcERlbHRhID0gTWF0aC5mbG9vciggdGltZSAvIGR1cmF0aW9uICk7IC8vIHNpZ25lZAogICAgCQkJCXRpbWUgLT0gZHVyYXRpb24gKiBsb29wRGVsdGE7CgogICAgCQkJCWxvb3BDb3VudCArPSBNYXRoLmFicyggbG9vcERlbHRhICk7CgogICAgCQkJCXZhciBwZW5kaW5nID0gdGhpcy5yZXBldGl0aW9ucyAtIGxvb3BDb3VudDsKCiAgICAJCQkJaWYgKCBwZW5kaW5nIDw9IDAgKSB7CgogICAgCQkJCQkvLyBoYXZlIHRvIHN0b3AgKHN3aXRjaCBzdGF0ZSwgY2xhbXAgdGltZSwgZmlyZSBldmVudCkKCiAgICAJCQkJCWlmICggdGhpcy5jbGFtcFdoZW5GaW5pc2hlZCApIHRoaXMucGF1c2VkID0gdHJ1ZTsKICAgIAkJCQkJZWxzZSB0aGlzLmVuYWJsZWQgPSBmYWxzZTsKCiAgICAJCQkJCXRpbWUgPSBkZWx0YVRpbWUgPiAwID8gZHVyYXRpb24gOiAwOwoKICAgIAkJCQkJdGhpcy50aW1lID0gdGltZTsKCiAgICAJCQkJCXRoaXMuX21peGVyLmRpc3BhdGNoRXZlbnQoIHsKICAgIAkJCQkJCXR5cGU6ICdmaW5pc2hlZCcsIGFjdGlvbjogdGhpcywKICAgIAkJCQkJCWRpcmVjdGlvbjogZGVsdGFUaW1lID4gMCA/IDEgOiAtIDEKICAgIAkJCQkJfSApOwoKICAgIAkJCQl9IGVsc2UgewoKICAgIAkJCQkJLy8ga2VlcCBydW5uaW5nCgogICAgCQkJCQlpZiAoIHBlbmRpbmcgPT09IDEgKSB7CgogICAgCQkJCQkJLy8gZW50ZXJpbmcgdGhlIGxhc3Qgcm91bmQKCiAgICAJCQkJCQl2YXIgYXRTdGFydCA9IGRlbHRhVGltZSA8IDA7CiAgICAJCQkJCQl0aGlzLl9zZXRFbmRpbmdzKCBhdFN0YXJ0LCAhIGF0U3RhcnQsIHBpbmdQb25nICk7CgogICAgCQkJCQl9IGVsc2UgewoKICAgIAkJCQkJCXRoaXMuX3NldEVuZGluZ3MoIGZhbHNlLCBmYWxzZSwgcGluZ1BvbmcgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCXRoaXMuX2xvb3BDb3VudCA9IGxvb3BDb3VudDsKCiAgICAJCQkJCXRoaXMudGltZSA9IHRpbWU7CgogICAgCQkJCQl0aGlzLl9taXhlci5kaXNwYXRjaEV2ZW50KCB7CiAgICAJCQkJCQl0eXBlOiAnbG9vcCcsIGFjdGlvbjogdGhpcywgbG9vcERlbHRhOiBsb29wRGVsdGEKICAgIAkJCQkJfSApOwoKICAgIAkJCQl9CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdGhpcy50aW1lID0gdGltZTsKCiAgICAJCQl9CgogICAgCQkJaWYgKCBwaW5nUG9uZyAmJiAoIGxvb3BDb3VudCAmIDEgKSA9PT0gMSApIHsKCiAgICAJCQkJLy8gaW52ZXJ0IHRpbWUgZm9yIHRoZSAicG9uZyByb3VuZCIKCiAgICAJCQkJcmV0dXJuIGR1cmF0aW9uIC0gdGltZTsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGltZTsKCiAgICAJfSwKCiAgICAJX3NldEVuZGluZ3M6IGZ1bmN0aW9uICggYXRTdGFydCwgYXRFbmQsIHBpbmdQb25nICkgewoKICAgIAkJdmFyIHNldHRpbmdzID0gdGhpcy5faW50ZXJwb2xhbnRTZXR0aW5nczsKCiAgICAJCWlmICggcGluZ1BvbmcgKSB7CgogICAgCQkJc2V0dGluZ3MuZW5kaW5nU3RhcnQgPSBaZXJvU2xvcGVFbmRpbmc7CiAgICAJCQlzZXR0aW5ncy5lbmRpbmdFbmQgPSBaZXJvU2xvcGVFbmRpbmc7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCS8vIGFzc3VtaW5nIGZvciBMb29wT25jZSBhdFN0YXJ0ID09IGF0RW5kID09IHRydWUKCiAgICAJCQlpZiAoIGF0U3RhcnQgKSB7CgogICAgCQkJCXNldHRpbmdzLmVuZGluZ1N0YXJ0ID0gdGhpcy56ZXJvU2xvcGVBdFN0YXJ0ID8gWmVyb1Nsb3BlRW5kaW5nIDogWmVyb0N1cnZhdHVyZUVuZGluZzsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlzZXR0aW5ncy5lbmRpbmdTdGFydCA9IFdyYXBBcm91bmRFbmRpbmc7CgogICAgCQkJfQoKICAgIAkJCWlmICggYXRFbmQgKSB7CgogICAgCQkJCXNldHRpbmdzLmVuZGluZ0VuZCA9IHRoaXMuemVyb1Nsb3BlQXRFbmQgPyBaZXJvU2xvcGVFbmRpbmcgOiBaZXJvQ3VydmF0dXJlRW5kaW5nOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXNldHRpbmdzLmVuZGluZ0VuZCAJID0gV3JhcEFyb3VuZEVuZGluZzsKCiAgICAJCQl9CgogICAgCQl9CgogICAgCX0sCgogICAgCV9zY2hlZHVsZUZhZGluZzogZnVuY3Rpb24gKCBkdXJhdGlvbiwgd2VpZ2h0Tm93LCB3ZWlnaHRUaGVuICkgewoKICAgIAkJdmFyIG1peGVyID0gdGhpcy5fbWl4ZXIsIG5vdyA9IG1peGVyLnRpbWUsCiAgICAJCQlpbnRlcnBvbGFudCA9IHRoaXMuX3dlaWdodEludGVycG9sYW50OwoKICAgIAkJaWYgKCBpbnRlcnBvbGFudCA9PT0gbnVsbCApIHsKCiAgICAJCQlpbnRlcnBvbGFudCA9IG1peGVyLl9sZW5kQ29udHJvbEludGVycG9sYW50KCk7CiAgICAJCQl0aGlzLl93ZWlnaHRJbnRlcnBvbGFudCA9IGludGVycG9sYW50OwoKICAgIAkJfQoKICAgIAkJdmFyIHRpbWVzID0gaW50ZXJwb2xhbnQucGFyYW1ldGVyUG9zaXRpb25zLAogICAgCQkJdmFsdWVzID0gaW50ZXJwb2xhbnQuc2FtcGxlVmFsdWVzOwoKICAgIAkJdGltZXNbIDAgXSA9IG5vdzsKICAgIAkJdmFsdWVzWyAwIF0gPSB3ZWlnaHROb3c7CiAgICAJCXRpbWVzWyAxIF0gPSBub3cgKyBkdXJhdGlvbjsKICAgIAkJdmFsdWVzWyAxIF0gPSB3ZWlnaHRUaGVuOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0KCiAgICB9ICk7CgogICAgLyoqCiAgICAgKgogICAgICogUGxheWVyIGZvciBBbmltYXRpb25DbGlwcy4KICAgICAqCiAgICAgKgogICAgICogQGF1dGhvciBCZW4gSG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pby8KICAgICAqIEBhdXRob3IgRGF2aWQgU2Fybm8gLyBodHRwOi8vbGlnaHRoYXVzLnVzLwogICAgICogQGF1dGhvciB0c2NodwogICAgICovCgogICAgZnVuY3Rpb24gQW5pbWF0aW9uTWl4ZXIoIHJvb3QgKSB7CgogICAgCXRoaXMuX3Jvb3QgPSByb290OwogICAgCXRoaXMuX2luaXRNZW1vcnlNYW5hZ2VyKCk7CiAgICAJdGhpcy5fYWNjdUluZGV4ID0gMDsKCiAgICAJdGhpcy50aW1lID0gMDsKCiAgICAJdGhpcy50aW1lU2NhbGUgPSAxLjA7CgogICAgfQoKICAgIEFuaW1hdGlvbk1peGVyLnByb3RvdHlwZSA9IE9iamVjdC5hc3NpZ24oIE9iamVjdC5jcmVhdGUoIEV2ZW50RGlzcGF0Y2hlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogQW5pbWF0aW9uTWl4ZXIsCgogICAgCV9iaW5kQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgcHJvdG90eXBlQWN0aW9uICkgewoKICAgIAkJdmFyIHJvb3QgPSBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290LAogICAgCQkJdHJhY2tzID0gYWN0aW9uLl9jbGlwLnRyYWNrcywKICAgIAkJCW5UcmFja3MgPSB0cmFja3MubGVuZ3RoLAogICAgCQkJYmluZGluZ3MgPSBhY3Rpb24uX3Byb3BlcnR5QmluZGluZ3MsCiAgICAJCQlpbnRlcnBvbGFudHMgPSBhY3Rpb24uX2ludGVycG9sYW50cywKICAgIAkJCXJvb3RVdWlkID0gcm9vdC51dWlkLAogICAgCQkJYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCiAgICAJCQliaW5kaW5nc0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdOwoKICAgIAkJaWYgKCBiaW5kaW5nc0J5TmFtZSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWJpbmRpbmdzQnlOYW1lID0ge307CiAgICAJCQliaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdzQnlOYW1lOwoKICAgIAkJfQoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuVHJhY2tzOyArKyBpICkgewoKICAgIAkJCXZhciB0cmFjayA9IHRyYWNrc1sgaSBdLAogICAgCQkJCXRyYWNrTmFtZSA9IHRyYWNrLm5hbWUsCiAgICAJCQkJYmluZGluZyA9IGJpbmRpbmdzQnlOYW1lWyB0cmFja05hbWUgXTsKCiAgICAJCQlpZiAoIGJpbmRpbmcgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJYmluZGluZ3NbIGkgXSA9IGJpbmRpbmc7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJYmluZGluZyA9IGJpbmRpbmdzWyBpIF07CgogICAgCQkJCWlmICggYmluZGluZyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCQkJLy8gZXhpc3RpbmcgYmluZGluZywgbWFrZSBzdXJlIHRoZSBjYWNoZSBrbm93cwoKICAgIAkJCQkJaWYgKCBiaW5kaW5nLl9jYWNoZUluZGV4ID09PSBudWxsICkgewoKICAgIAkJCQkJCSsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7CiAgICAJCQkJCQl0aGlzLl9hZGRJbmFjdGl2ZUJpbmRpbmcoIGJpbmRpbmcsIHJvb3RVdWlkLCB0cmFja05hbWUgKTsKCiAgICAJCQkJCX0KCiAgICAJCQkJCWNvbnRpbnVlOwoKICAgIAkJCQl9CgogICAgCQkJCXZhciBwYXRoID0gcHJvdG90eXBlQWN0aW9uICYmIHByb3RvdHlwZUFjdGlvbi4KICAgIAkJCQkJX3Byb3BlcnR5QmluZGluZ3NbIGkgXS5iaW5kaW5nLnBhcnNlZFBhdGg7CgogICAgCQkJCWJpbmRpbmcgPSBuZXcgUHJvcGVydHlNaXhlcigKICAgIAkJCQkJUHJvcGVydHlCaW5kaW5nLmNyZWF0ZSggcm9vdCwgdHJhY2tOYW1lLCBwYXRoICksCiAgICAJCQkJCXRyYWNrLlZhbHVlVHlwZU5hbWUsIHRyYWNrLmdldFZhbHVlU2l6ZSgpICk7CgogICAgCQkJCSsrIGJpbmRpbmcucmVmZXJlbmNlQ291bnQ7CiAgICAJCQkJdGhpcy5fYWRkSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICk7CgogICAgCQkJCWJpbmRpbmdzWyBpIF0gPSBiaW5kaW5nOwoKICAgIAkJCX0KCiAgICAJCQlpbnRlcnBvbGFudHNbIGkgXS5yZXN1bHRCdWZmZXIgPSBiaW5kaW5nLmJ1ZmZlcjsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJX2FjdGl2YXRlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCiAgICAJCWlmICggISB0aGlzLl9pc0FjdGl2ZUFjdGlvbiggYWN0aW9uICkgKSB7CgogICAgCQkJaWYgKCBhY3Rpb24uX2NhY2hlSW5kZXggPT09IG51bGwgKSB7CgogICAgCQkJCS8vIHRoaXMgYWN0aW9uIGhhcyBiZWVuIGZvcmdvdHRlbiBieSB0aGUgY2FjaGUsIGJ1dCB0aGUgdXNlcgogICAgCQkJCS8vIGFwcGVhcnMgdG8gYmUgc3RpbGwgdXNpbmcgaXQgLT4gcmViaW5kCgogICAgCQkJCXZhciByb290VXVpZCA9ICggYWN0aW9uLl9sb2NhbFJvb3QgfHwgdGhpcy5fcm9vdCApLnV1aWQsCiAgICAJCQkJCWNsaXBVdWlkID0gYWN0aW9uLl9jbGlwLnV1aWQsCiAgICAJCQkJCWFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXTsKCiAgICAJCQkJdGhpcy5fYmluZEFjdGlvbiggYWN0aW9uLAogICAgCQkJCQlhY3Rpb25zRm9yQ2xpcCAmJiBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXSApOwoKICAgIAkJCQl0aGlzLl9hZGRJbmFjdGl2ZUFjdGlvbiggYWN0aW9uLCBjbGlwVXVpZCwgcm9vdFV1aWQgKTsKCiAgICAJCQl9CgogICAgCQkJdmFyIGJpbmRpbmdzID0gYWN0aW9uLl9wcm9wZXJ0eUJpbmRpbmdzOwoKICAgIAkJCS8vIGluY3JlbWVudCByZWZlcmVuY2UgY291bnRzIC8gc29ydCBvdXQgc3RhdGUKICAgIAkJCWZvciAoIHZhciBpID0gMCwgbiA9IGJpbmRpbmdzLmxlbmd0aDsgaSAhPT0gbjsgKysgaSApIHsKCiAgICAJCQkJdmFyIGJpbmRpbmcgPSBiaW5kaW5nc1sgaSBdOwoKICAgIAkJCQlpZiAoIGJpbmRpbmcudXNlQ291bnQgKysgPT09IDAgKSB7CgogICAgCQkJCQl0aGlzLl9sZW5kQmluZGluZyggYmluZGluZyApOwogICAgCQkJCQliaW5kaW5nLnNhdmVPcmlnaW5hbFN0YXRlKCk7CgogICAgCQkJCX0KCiAgICAJCQl9CgogICAgCQkJdGhpcy5fbGVuZEFjdGlvbiggYWN0aW9uICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCV9kZWFjdGl2YXRlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCiAgICAJCWlmICggdGhpcy5faXNBY3RpdmVBY3Rpb24oIGFjdGlvbiApICkgewoKICAgIAkJCXZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsKCiAgICAJCQkvLyBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50cyAvIHNvcnQgb3V0IHN0YXRlCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBiaW5kaW5ncy5sZW5ndGg7IGkgIT09IG47ICsrIGkgKSB7CgogICAgCQkJCXZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTsKCiAgICAJCQkJaWYgKCAtLSBiaW5kaW5nLnVzZUNvdW50ID09PSAwICkgewoKICAgIAkJCQkJYmluZGluZy5yZXN0b3JlT3JpZ2luYWxTdGF0ZSgpOwogICAgCQkJCQl0aGlzLl90YWtlQmFja0JpbmRpbmcoIGJpbmRpbmcgKTsKCiAgICAJCQkJfQoKICAgIAkJCX0KCiAgICAJCQl0aGlzLl90YWtlQmFja0FjdGlvbiggYWN0aW9uICk7CgogICAgCQl9CgogICAgCX0sCgogICAgCS8vIE1lbW9yeSBtYW5hZ2VyCgogICAgCV9pbml0TWVtb3J5TWFuYWdlcjogZnVuY3Rpb24gKCkgewoKICAgIAkJdGhpcy5fYWN0aW9ucyA9IFtdOyAvLyAnbkFjdGl2ZUFjdGlvbnMnIGZvbGxvd2VkIGJ5IGluYWN0aXZlIG9uZXMKICAgIAkJdGhpcy5fbkFjdGl2ZUFjdGlvbnMgPSAwOwoKICAgIAkJdGhpcy5fYWN0aW9uc0J5Q2xpcCA9IHt9OwogICAgCQkvLyBpbnNpZGU6CiAgICAJCS8vIHsKICAgIAkJLy8gCWtub3duQWN0aW9uczogQXJyYXk8IEFuaW1hdGlvbkFjdGlvbiA+IC0gdXNlZCBhcyBwcm90b3R5cGVzCiAgICAJCS8vIAlhY3Rpb25CeVJvb3Q6IEFuaW1hdGlvbkFjdGlvbiAtIGxvb2t1cAogICAgCQkvLyB9CgoKICAgIAkJdGhpcy5fYmluZGluZ3MgPSBbXTsgLy8gJ25BY3RpdmVCaW5kaW5ncycgZm9sbG93ZWQgYnkgaW5hY3RpdmUgb25lcwogICAgCQl0aGlzLl9uQWN0aXZlQmluZGluZ3MgPSAwOwoKICAgIAkJdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lID0ge307IC8vIGluc2lkZTogTWFwPCBuYW1lLCBQcm9wZXJ0eU1peGVyID4KCgogICAgCQl0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzID0gW107IC8vIHNhbWUgZ2FtZSBhcyBhYm92ZQogICAgCQl0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyA9IDA7CgogICAgCQl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAkJdGhpcy5zdGF0cyA9IHsKCiAgICAJCQlhY3Rpb25zOiB7CiAgICAJCQkJZ2V0IHRvdGFsKCkgewoKICAgIAkJCQkJcmV0dXJuIHNjb3BlLl9hY3Rpb25zLmxlbmd0aDsKCiAgICAJCQkJfSwKICAgIAkJCQlnZXQgaW5Vc2UoKSB7CgogICAgCQkJCQlyZXR1cm4gc2NvcGUuX25BY3RpdmVBY3Rpb25zOwoKICAgIAkJCQl9CiAgICAJCQl9LAogICAgCQkJYmluZGluZ3M6IHsKICAgIAkJCQlnZXQgdG90YWwoKSB7CgogICAgCQkJCQlyZXR1cm4gc2NvcGUuX2JpbmRpbmdzLmxlbmd0aDsKCiAgICAJCQkJfSwKICAgIAkJCQlnZXQgaW5Vc2UoKSB7CgogICAgCQkJCQlyZXR1cm4gc2NvcGUuX25BY3RpdmVCaW5kaW5nczsKCiAgICAJCQkJfQogICAgCQkJfSwKICAgIAkJCWNvbnRyb2xJbnRlcnBvbGFudHM6IHsKICAgIAkJCQlnZXQgdG90YWwoKSB7CgogICAgCQkJCQlyZXR1cm4gc2NvcGUuX2NvbnRyb2xJbnRlcnBvbGFudHMubGVuZ3RoOwoKICAgIAkJCQl9LAogICAgCQkJCWdldCBpblVzZSgpIHsKCiAgICAJCQkJCXJldHVybiBzY29wZS5fbkFjdGl2ZUNvbnRyb2xJbnRlcnBvbGFudHM7CgogICAgCQkJCX0KICAgIAkJCX0KCiAgICAJCX07CgogICAgCX0sCgogICAgCS8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBBbmltYXRpb25BY3Rpb24gb2JqZWN0cwoKICAgIAlfaXNBY3RpdmVBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgewoKICAgIAkJdmFyIGluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4OwogICAgCQlyZXR1cm4gaW5kZXggIT09IG51bGwgJiYgaW5kZXggPCB0aGlzLl9uQWN0aXZlQWN0aW9uczsKCiAgICAJfSwKCiAgICAJX2FkZEluYWN0aXZlQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiwgY2xpcFV1aWQsIHJvb3RVdWlkICkgewoKICAgIAkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAogICAgCQkJYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsCiAgICAJCQlhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgogICAgCQlpZiAoIGFjdGlvbnNGb3JDbGlwID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJYWN0aW9uc0ZvckNsaXAgPSB7CgogICAgCQkJCWtub3duQWN0aW9uczogWyBhY3Rpb24gXSwKICAgIAkJCQlhY3Rpb25CeVJvb3Q6IHt9CgogICAgCQkJfTsKCiAgICAJCQlhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSAwOwoKICAgIAkJCWFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0gPSBhY3Rpb25zRm9yQ2xpcDsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdmFyIGtub3duQWN0aW9ucyA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uczsKCiAgICAJCQlhY3Rpb24uX2J5Q2xpcENhY2hlSW5kZXggPSBrbm93bkFjdGlvbnMubGVuZ3RoOwogICAgCQkJa25vd25BY3Rpb25zLnB1c2goIGFjdGlvbiApOwoKICAgIAkJfQoKICAgIAkJYWN0aW9uLl9jYWNoZUluZGV4ID0gYWN0aW9ucy5sZW5ndGg7CiAgICAJCWFjdGlvbnMucHVzaCggYWN0aW9uICk7CgogICAgCQlhY3Rpb25zRm9yQ2xpcC5hY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF0gPSBhY3Rpb247CgogICAgCX0sCgogICAgCV9yZW1vdmVJbmFjdGl2ZUFjdGlvbjogZnVuY3Rpb24gKCBhY3Rpb24gKSB7CgogICAgCQl2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCiAgICAJCQlsYXN0SW5hY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBhY3Rpb25zLmxlbmd0aCAtIDEgXSwKICAgIAkJCWNhY2hlSW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXg7CgogICAgCQlsYXN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4OwogICAgCQlhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247CiAgICAJCWFjdGlvbnMucG9wKCk7CgogICAgCQlhY3Rpb24uX2NhY2hlSW5kZXggPSBudWxsOwoKCiAgICAJCXZhciBjbGlwVXVpZCA9IGFjdGlvbi5fY2xpcC51dWlkLAogICAgCQkJYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsCiAgICAJCQlhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF0sCiAgICAJCQlrbm93bkFjdGlvbnNGb3JDbGlwID0gYWN0aW9uc0ZvckNsaXAua25vd25BY3Rpb25zLAoKICAgIAkJCWxhc3RLbm93bkFjdGlvbiA9CiAgICAJCQkJa25vd25BY3Rpb25zRm9yQ2xpcFsga25vd25BY3Rpb25zRm9yQ2xpcC5sZW5ndGggLSAxIF0sCgogICAgCQkJYnlDbGlwQ2FjaGVJbmRleCA9IGFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleDsKCiAgICAJCWxhc3RLbm93bkFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IGJ5Q2xpcENhY2hlSW5kZXg7CiAgICAJCWtub3duQWN0aW9uc0ZvckNsaXBbIGJ5Q2xpcENhY2hlSW5kZXggXSA9IGxhc3RLbm93bkFjdGlvbjsKICAgIAkJa25vd25BY3Rpb25zRm9yQ2xpcC5wb3AoKTsKCiAgICAJCWFjdGlvbi5fYnlDbGlwQ2FjaGVJbmRleCA9IG51bGw7CgoKICAgIAkJdmFyIGFjdGlvbkJ5Um9vdCA9IGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdCwKICAgIAkJCXJvb3RVdWlkID0gKCBhY3Rpb24uX2xvY2FsUm9vdCB8fCB0aGlzLl9yb290ICkudXVpZDsKCiAgICAJCWRlbGV0ZSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07CgogICAgCQlpZiAoIGtub3duQWN0aW9uc0ZvckNsaXAubGVuZ3RoID09PSAwICkgewoKICAgIAkJCWRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdOwoKICAgIAkJfQoKICAgIAkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7CgogICAgCX0sCgogICAgCV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmdzRm9yQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCiAgICAJCXZhciBiaW5kaW5ncyA9IGFjdGlvbi5fcHJvcGVydHlCaW5kaW5nczsKICAgIAkJZm9yICggdmFyIGkgPSAwLCBuID0gYmluZGluZ3MubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCXZhciBiaW5kaW5nID0gYmluZGluZ3NbIGkgXTsKCiAgICAJCQlpZiAoIC0tIGJpbmRpbmcucmVmZXJlbmNlQ291bnQgPT09IDAgKSB7CgogICAgCQkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQmluZGluZyggYmluZGluZyApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfSwKCiAgICAJX2xlbmRBY3Rpb246IGZ1bmN0aW9uICggYWN0aW9uICkgewoKICAgIAkJLy8gWyBhY3RpdmUgYWN0aW9ucyB8ICBpbmFjdGl2ZSBhY3Rpb25zICBdCiAgICAJCS8vIFsgIGFjdGl2ZSBhY3Rpb25zID58IGluYWN0aXZlIGFjdGlvbnMgXQogICAgCQkvLyAgICAgICAgICAgICAgICAgcyAgICAgICAgYQogICAgCQkvLyAgICAgICAgICAgICAgICAgIDwtc3dhcC0+CiAgICAJCS8vICAgICAgICAgICAgICAgICBhICAgICAgICBzCgogICAgCQl2YXIgYWN0aW9ucyA9IHRoaXMuX2FjdGlvbnMsCiAgICAJCQlwcmV2SW5kZXggPSBhY3Rpb24uX2NhY2hlSW5kZXgsCgogICAgCQkJbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUFjdGlvbnMgKyssCgogICAgCQkJZmlyc3RJbmFjdGl2ZUFjdGlvbiA9IGFjdGlvbnNbIGxhc3RBY3RpdmVJbmRleCBdOwoKICAgIAkJYWN0aW9uLl9jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4OwogICAgCQlhY3Rpb25zWyBsYXN0QWN0aXZlSW5kZXggXSA9IGFjdGlvbjsKCiAgICAJCWZpcnN0SW5hY3RpdmVBY3Rpb24uX2NhY2hlSW5kZXggPSBwcmV2SW5kZXg7CiAgICAJCWFjdGlvbnNbIHByZXZJbmRleCBdID0gZmlyc3RJbmFjdGl2ZUFjdGlvbjsKCiAgICAJfSwKCiAgICAJX3Rha2VCYWNrQWN0aW9uOiBmdW5jdGlvbiAoIGFjdGlvbiApIHsKCiAgICAJCS8vIFsgIGFjdGl2ZSBhY3Rpb25zICB8IGluYWN0aXZlIGFjdGlvbnMgXQogICAgCQkvLyBbIGFjdGl2ZSBhY3Rpb25zIHw8IGluYWN0aXZlIGFjdGlvbnMgIF0KICAgIAkJLy8gICAgICAgIGEgICAgICAgIHMKICAgIAkJLy8gICAgICAgICA8LXN3YXAtPgogICAgCQkvLyAgICAgICAgcyAgICAgICAgYQoKICAgIAkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAogICAgCQkJcHJldkluZGV4ID0gYWN0aW9uLl9jYWNoZUluZGV4LAoKICAgIAkJCWZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVBY3Rpb25zLAoKICAgIAkJCWxhc3RBY3RpdmVBY3Rpb24gPSBhY3Rpb25zWyBmaXJzdEluYWN0aXZlSW5kZXggXTsKCiAgICAJCWFjdGlvbi5fY2FjaGVJbmRleCA9IGZpcnN0SW5hY3RpdmVJbmRleDsKICAgIAkJYWN0aW9uc1sgZmlyc3RJbmFjdGl2ZUluZGV4IF0gPSBhY3Rpb247CgogICAgCQlsYXN0QWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gcHJldkluZGV4OwogICAgCQlhY3Rpb25zWyBwcmV2SW5kZXggXSA9IGxhc3RBY3RpdmVBY3Rpb247CgogICAgCX0sCgogICAgCS8vIE1lbW9yeSBtYW5hZ2VtZW50IGZvciBQcm9wZXJ0eU1peGVyIG9iamVjdHMKCiAgICAJX2FkZEluYWN0aXZlQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nLCByb290VXVpZCwgdHJhY2tOYW1lICkgewoKICAgIAkJdmFyIGJpbmRpbmdzQnlSb290ID0gdGhpcy5fYmluZGluZ3NCeVJvb3RBbmROYW1lLAogICAgCQkJYmluZGluZ0J5TmFtZSA9IGJpbmRpbmdzQnlSb290WyByb290VXVpZCBdLAoKICAgIAkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3M7CgogICAgCQlpZiAoIGJpbmRpbmdCeU5hbWUgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQliaW5kaW5nQnlOYW1lID0ge307CiAgICAJCQliaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXSA9IGJpbmRpbmdCeU5hbWU7CgogICAgCQl9CgogICAgCQliaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXSA9IGJpbmRpbmc7CgogICAgCQliaW5kaW5nLl9jYWNoZUluZGV4ID0gYmluZGluZ3MubGVuZ3RoOwogICAgCQliaW5kaW5ncy5wdXNoKCBiaW5kaW5nICk7CgogICAgCX0sCgogICAgCV9yZW1vdmVJbmFjdGl2ZUJpbmRpbmc6IGZ1bmN0aW9uICggYmluZGluZyApIHsKCiAgICAJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAogICAgCQkJcHJvcEJpbmRpbmcgPSBiaW5kaW5nLmJpbmRpbmcsCiAgICAJCQlyb290VXVpZCA9IHByb3BCaW5kaW5nLnJvb3ROb2RlLnV1aWQsCiAgICAJCQl0cmFja05hbWUgPSBwcm9wQmluZGluZy5wYXRoLAogICAgCQkJYmluZGluZ3NCeVJvb3QgPSB0aGlzLl9iaW5kaW5nc0J5Um9vdEFuZE5hbWUsCiAgICAJCQliaW5kaW5nQnlOYW1lID0gYmluZGluZ3NCeVJvb3RbIHJvb3RVdWlkIF0sCgogICAgCQkJbGFzdEluYWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBiaW5kaW5ncy5sZW5ndGggLSAxIF0sCiAgICAJCQljYWNoZUluZGV4ID0gYmluZGluZy5fY2FjaGVJbmRleDsKCiAgICAJCWxhc3RJbmFjdGl2ZUJpbmRpbmcuX2NhY2hlSW5kZXggPSBjYWNoZUluZGV4OwogICAgCQliaW5kaW5nc1sgY2FjaGVJbmRleCBdID0gbGFzdEluYWN0aXZlQmluZGluZzsKICAgIAkJYmluZGluZ3MucG9wKCk7CgogICAgCQlkZWxldGUgYmluZGluZ0J5TmFtZVsgdHJhY2tOYW1lIF07CgogICAgCQlpZiAoIE9iamVjdC5rZXlzKCBiaW5kaW5nQnlOYW1lICkubGVuZ3RoID09PSAwICkgewoKICAgIAkJCWRlbGV0ZSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJX2xlbmRCaW5kaW5nOiBmdW5jdGlvbiAoIGJpbmRpbmcgKSB7CgogICAgCQl2YXIgYmluZGluZ3MgPSB0aGlzLl9iaW5kaW5ncywKICAgIAkJCXByZXZJbmRleCA9IGJpbmRpbmcuX2NhY2hlSW5kZXgsCgogICAgCQkJbGFzdEFjdGl2ZUluZGV4ID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzICsrLAoKICAgIAkJCWZpcnN0SW5hY3RpdmVCaW5kaW5nID0gYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdOwoKICAgIAkJYmluZGluZy5fY2FjaGVJbmRleCA9IGxhc3RBY3RpdmVJbmRleDsKICAgIAkJYmluZGluZ3NbIGxhc3RBY3RpdmVJbmRleCBdID0gYmluZGluZzsKCiAgICAJCWZpcnN0SW5hY3RpdmVCaW5kaW5nLl9jYWNoZUluZGV4ID0gcHJldkluZGV4OwogICAgCQliaW5kaW5nc1sgcHJldkluZGV4IF0gPSBmaXJzdEluYWN0aXZlQmluZGluZzsKCiAgICAJfSwKCiAgICAJX3Rha2VCYWNrQmluZGluZzogZnVuY3Rpb24gKCBiaW5kaW5nICkgewoKICAgIAkJdmFyIGJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCiAgICAJCQlwcmV2SW5kZXggPSBiaW5kaW5nLl9jYWNoZUluZGV4LAoKICAgIAkJCWZpcnN0SW5hY3RpdmVJbmRleCA9IC0tIHRoaXMuX25BY3RpdmVCaW5kaW5ncywKCiAgICAJCQlsYXN0QWN0aXZlQmluZGluZyA9IGJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXTsKCiAgICAJCWJpbmRpbmcuX2NhY2hlSW5kZXggPSBmaXJzdEluYWN0aXZlSW5kZXg7CiAgICAJCWJpbmRpbmdzWyBmaXJzdEluYWN0aXZlSW5kZXggXSA9IGJpbmRpbmc7CgogICAgCQlsYXN0QWN0aXZlQmluZGluZy5fY2FjaGVJbmRleCA9IHByZXZJbmRleDsKICAgIAkJYmluZGluZ3NbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUJpbmRpbmc7CgogICAgCX0sCgoKICAgIAkvLyBNZW1vcnkgbWFuYWdlbWVudCBvZiBJbnRlcnBvbGFudHMgZm9yIHdlaWdodCBhbmQgdGltZSBzY2FsZQoKICAgIAlfbGVuZENvbnRyb2xJbnRlcnBvbGFudDogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGludGVycG9sYW50cyA9IHRoaXMuX2NvbnRyb2xJbnRlcnBvbGFudHMsCiAgICAJCQlsYXN0QWN0aXZlSW5kZXggPSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cyArKywKICAgIAkJCWludGVycG9sYW50ID0gaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXTsKCiAgICAJCWlmICggaW50ZXJwb2xhbnQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlpbnRlcnBvbGFudCA9IG5ldyBMaW5lYXJJbnRlcnBvbGFudCgKICAgIAkJCQluZXcgRmxvYXQzMkFycmF5KCAyICksIG5ldyBGbG9hdDMyQXJyYXkoIDIgKSwKICAgIAkJCQkxLCB0aGlzLl9jb250cm9sSW50ZXJwb2xhbnRzUmVzdWx0QnVmZmVyICk7CgogICAgCQkJaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gbGFzdEFjdGl2ZUluZGV4OwogICAgCQkJaW50ZXJwb2xhbnRzWyBsYXN0QWN0aXZlSW5kZXggXSA9IGludGVycG9sYW50OwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIGludGVycG9sYW50OwoKICAgIAl9LAoKICAgIAlfdGFrZUJhY2tDb250cm9sSW50ZXJwb2xhbnQ6IGZ1bmN0aW9uICggaW50ZXJwb2xhbnQgKSB7CgogICAgCQl2YXIgaW50ZXJwb2xhbnRzID0gdGhpcy5fY29udHJvbEludGVycG9sYW50cywKICAgIAkJCXByZXZJbmRleCA9IGludGVycG9sYW50Ll9fY2FjaGVJbmRleCwKCiAgICAJCQlmaXJzdEluYWN0aXZlSW5kZXggPSAtLSB0aGlzLl9uQWN0aXZlQ29udHJvbEludGVycG9sYW50cywKCiAgICAJCQlsYXN0QWN0aXZlSW50ZXJwb2xhbnQgPSBpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdOwoKICAgIAkJaW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gZmlyc3RJbmFjdGl2ZUluZGV4OwogICAgCQlpbnRlcnBvbGFudHNbIGZpcnN0SW5hY3RpdmVJbmRleCBdID0gaW50ZXJwb2xhbnQ7CgogICAgCQlsYXN0QWN0aXZlSW50ZXJwb2xhbnQuX19jYWNoZUluZGV4ID0gcHJldkluZGV4OwogICAgCQlpbnRlcnBvbGFudHNbIHByZXZJbmRleCBdID0gbGFzdEFjdGl2ZUludGVycG9sYW50OwoKICAgIAl9LAoKICAgIAlfY29udHJvbEludGVycG9sYW50c1Jlc3VsdEJ1ZmZlcjogbmV3IEZsb2F0MzJBcnJheSggMSApLAoKICAgIAkvLyByZXR1cm4gYW4gYWN0aW9uIGZvciBhIGNsaXAgb3B0aW9uYWxseSB1c2luZyBhIGN1c3RvbSByb290IHRhcmdldAogICAgCS8vIG9iamVjdCAodGhpcyBtZXRob2QgYWxsb2NhdGVzIGEgbG90IG9mIGR5bmFtaWMgbWVtb3J5IGluIGNhc2UgYQogICAgCS8vIHByZXZpb3VzbHkgdW5rbm93biBjbGlwL3Jvb3QgY29tYmluYXRpb24gaXMgc3BlY2lmaWVkKQogICAgCWNsaXBBY3Rpb246IGZ1bmN0aW9uICggY2xpcCwgb3B0aW9uYWxSb290ICkgewoKICAgIAkJdmFyIHJvb3QgPSBvcHRpb25hbFJvb3QgfHwgdGhpcy5fcm9vdCwKICAgIAkJCXJvb3RVdWlkID0gcm9vdC51dWlkLAoKICAgIAkJCWNsaXBPYmplY3QgPSB0eXBlb2YgY2xpcCA9PT0gJ3N0cmluZycgPwogICAgCQkJCUFuaW1hdGlvbkNsaXAuZmluZEJ5TmFtZSggcm9vdCwgY2xpcCApIDogY2xpcCwKCiAgICAJCQljbGlwVXVpZCA9IGNsaXBPYmplY3QgIT09IG51bGwgPyBjbGlwT2JqZWN0LnV1aWQgOiBjbGlwLAoKICAgIAkJCWFjdGlvbnNGb3JDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcFsgY2xpcFV1aWQgXSwKICAgIAkJCXByb3RvdHlwZUFjdGlvbiA9IG51bGw7CgogICAgCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJdmFyIGV4aXN0aW5nQWN0aW9uID0KICAgIAkJCQkJYWN0aW9uc0ZvckNsaXAuYWN0aW9uQnlSb290WyByb290VXVpZCBdOwoKICAgIAkJCWlmICggZXhpc3RpbmdBY3Rpb24gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJcmV0dXJuIGV4aXN0aW5nQWN0aW9uOwoKICAgIAkJCX0KCiAgICAJCQkvLyB3ZSBrbm93IHRoZSBjbGlwLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHBhcnNlIGFsbAogICAgCQkJLy8gdGhlIGJpbmRpbmdzIGFnYWluIGJ1dCBjYW4ganVzdCBjb3B5CiAgICAJCQlwcm90b3R5cGVBY3Rpb24gPSBhY3Rpb25zRm9yQ2xpcC5rbm93bkFjdGlvbnNbIDAgXTsKCiAgICAJCQkvLyBhbHNvLCB0YWtlIHRoZSBjbGlwIGZyb20gdGhlIHByb3RvdHlwZSBhY3Rpb24KICAgIAkJCWlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApCiAgICAJCQkJY2xpcE9iamVjdCA9IHByb3RvdHlwZUFjdGlvbi5fY2xpcDsKCiAgICAJCX0KCiAgICAJCS8vIGNsaXAgbXVzdCBiZSBrbm93biB3aGVuIHNwZWNpZmllZCB2aWEgc3RyaW5nCiAgICAJCWlmICggY2xpcE9iamVjdCA9PT0gbnVsbCApIHJldHVybiBudWxsOwoKICAgIAkJLy8gYWxsb2NhdGUgYWxsIHJlc291cmNlcyByZXF1aXJlZCB0byBydW4gaXQKICAgIAkJdmFyIG5ld0FjdGlvbiA9IG5ldyBBbmltYXRpb25BY3Rpb24oIHRoaXMsIGNsaXBPYmplY3QsIG9wdGlvbmFsUm9vdCApOwoKICAgIAkJdGhpcy5fYmluZEFjdGlvbiggbmV3QWN0aW9uLCBwcm90b3R5cGVBY3Rpb24gKTsKCiAgICAJCS8vIGFuZCBtYWtlIHRoZSBhY3Rpb24ga25vd24gdG8gdGhlIG1lbW9yeSBtYW5hZ2VyCiAgICAJCXRoaXMuX2FkZEluYWN0aXZlQWN0aW9uKCBuZXdBY3Rpb24sIGNsaXBVdWlkLCByb290VXVpZCApOwoKICAgIAkJcmV0dXJuIG5ld0FjdGlvbjsKCiAgICAJfSwKCiAgICAJLy8gZ2V0IGFuIGV4aXN0aW5nIGFjdGlvbgogICAgCWV4aXN0aW5nQWN0aW9uOiBmdW5jdGlvbiAoIGNsaXAsIG9wdGlvbmFsUm9vdCApIHsKCiAgICAJCXZhciByb290ID0gb3B0aW9uYWxSb290IHx8IHRoaXMuX3Jvb3QsCiAgICAJCQlyb290VXVpZCA9IHJvb3QudXVpZCwKCiAgICAJCQljbGlwT2JqZWN0ID0gdHlwZW9mIGNsaXAgPT09ICdzdHJpbmcnID8KICAgIAkJCQlBbmltYXRpb25DbGlwLmZpbmRCeU5hbWUoIHJvb3QsIGNsaXAgKSA6IGNsaXAsCgogICAgCQkJY2xpcFV1aWQgPSBjbGlwT2JqZWN0ID8gY2xpcE9iamVjdC51dWlkIDogY2xpcCwKCiAgICAJCQlhY3Rpb25zRm9yQ2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgogICAgCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJcmV0dXJuIGFjdGlvbnNGb3JDbGlwLmFjdGlvbkJ5Um9vdFsgcm9vdFV1aWQgXSB8fCBudWxsOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIG51bGw7CgogICAgCX0sCgogICAgCS8vIGRlYWN0aXZhdGVzIGFsbCBwcmV2aW91c2x5IHNjaGVkdWxlZCBhY3Rpb25zCiAgICAJc3RvcEFsbEFjdGlvbjogZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAogICAgCQkJbkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucywKICAgIAkJCWJpbmRpbmdzID0gdGhpcy5fYmluZGluZ3MsCiAgICAJCQluQmluZGluZ3MgPSB0aGlzLl9uQWN0aXZlQmluZGluZ3M7CgogICAgCQl0aGlzLl9uQWN0aXZlQWN0aW9ucyA9IDA7CiAgICAJCXRoaXMuX25BY3RpdmVCaW5kaW5ncyA9IDA7CgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkgewoKICAgIAkJCWFjdGlvbnNbIGkgXS5yZXNldCgpOwoKICAgIAkJfQoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7CgogICAgCQkJYmluZGluZ3NbIGkgXS51c2VDb3VudCA9IDA7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJLy8gYWR2YW5jZSB0aGUgdGltZSBhbmQgdXBkYXRlIGFwcGx5IHRoZSBhbmltYXRpb24KICAgIAl1cGRhdGU6IGZ1bmN0aW9uICggZGVsdGFUaW1lICkgewoKICAgIAkJZGVsdGFUaW1lICo9IHRoaXMudGltZVNjYWxlOwoKICAgIAkJdmFyIGFjdGlvbnMgPSB0aGlzLl9hY3Rpb25zLAogICAgCQkJbkFjdGlvbnMgPSB0aGlzLl9uQWN0aXZlQWN0aW9ucywKCiAgICAJCQl0aW1lID0gdGhpcy50aW1lICs9IGRlbHRhVGltZSwKICAgIAkJCXRpbWVEaXJlY3Rpb24gPSBNYXRoLnNpZ24oIGRlbHRhVGltZSApLAoKICAgIAkJCWFjY3VJbmRleCA9IHRoaXMuX2FjY3VJbmRleCBePSAxOwoKICAgIAkJLy8gcnVuIGFjdGl2ZSBhY3Rpb25zCgogICAgCQlmb3IgKCB2YXIgaSA9IDA7IGkgIT09IG5BY3Rpb25zOyArKyBpICkgewoKICAgIAkJCXZhciBhY3Rpb24gPSBhY3Rpb25zWyBpIF07CgogICAgCQkJYWN0aW9uLl91cGRhdGUoIHRpbWUsIGRlbHRhVGltZSwgdGltZURpcmVjdGlvbiwgYWNjdUluZGV4ICk7CgogICAgCQl9CgogICAgCQkvLyB1cGRhdGUgc2NlbmUgZ3JhcGgKCiAgICAJCXZhciBiaW5kaW5ncyA9IHRoaXMuX2JpbmRpbmdzLAogICAgCQkJbkJpbmRpbmdzID0gdGhpcy5fbkFjdGl2ZUJpbmRpbmdzOwoKICAgIAkJZm9yICggdmFyIGkgPSAwOyBpICE9PSBuQmluZGluZ3M7ICsrIGkgKSB7CgogICAgCQkJYmluZGluZ3NbIGkgXS5hcHBseSggYWNjdUluZGV4ICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJLy8gcmV0dXJuIHRoaXMgbWl4ZXIncyByb290IHRhcmdldCBvYmplY3QKICAgIAlnZXRSb290OiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5fcm9vdDsKCiAgICAJfSwKCiAgICAJLy8gZnJlZSBhbGwgcmVzb3VyY2VzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBjbGlwCiAgICAJdW5jYWNoZUNsaXA6IGZ1bmN0aW9uICggY2xpcCApIHsKCiAgICAJCXZhciBhY3Rpb25zID0gdGhpcy5fYWN0aW9ucywKICAgIAkJCWNsaXBVdWlkID0gY2xpcC51dWlkLAogICAgCQkJYWN0aW9uc0J5Q2xpcCA9IHRoaXMuX2FjdGlvbnNCeUNsaXAsCiAgICAJCQlhY3Rpb25zRm9yQ2xpcCA9IGFjdGlvbnNCeUNsaXBbIGNsaXBVdWlkIF07CgogICAgCQlpZiAoIGFjdGlvbnNGb3JDbGlwICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJLy8gbm90ZToganVzdCBjYWxsaW5nIF9yZW1vdmVJbmFjdGl2ZUFjdGlvbiB3b3VsZCBtZXNzIHVwIHRoZQogICAgCQkJLy8gaXRlcmF0aW9uIHN0YXRlIGFuZCBhbHNvIHJlcXVpcmUgdXBkYXRpbmcgdGhlIHN0YXRlIHdlIGNhbgogICAgCQkJLy8ganVzdCB0aHJvdyBhd2F5CgogICAgCQkJdmFyIGFjdGlvbnNUb1JlbW92ZSA9IGFjdGlvbnNGb3JDbGlwLmtub3duQWN0aW9uczsKCiAgICAJCQlmb3IgKCB2YXIgaSA9IDAsIG4gPSBhY3Rpb25zVG9SZW1vdmUubGVuZ3RoOyBpICE9PSBuOyArKyBpICkgewoKICAgIAkJCQl2YXIgYWN0aW9uID0gYWN0aW9uc1RvUmVtb3ZlWyBpIF07CgogICAgCQkJCXRoaXMuX2RlYWN0aXZhdGVBY3Rpb24oIGFjdGlvbiApOwoKICAgIAkJCQl2YXIgY2FjaGVJbmRleCA9IGFjdGlvbi5fY2FjaGVJbmRleCwKICAgIAkJCQkJbGFzdEluYWN0aXZlQWN0aW9uID0gYWN0aW9uc1sgYWN0aW9ucy5sZW5ndGggLSAxIF07CgogICAgCQkJCWFjdGlvbi5fY2FjaGVJbmRleCA9IG51bGw7CiAgICAJCQkJYWN0aW9uLl9ieUNsaXBDYWNoZUluZGV4ID0gbnVsbDsKCiAgICAJCQkJbGFzdEluYWN0aXZlQWN0aW9uLl9jYWNoZUluZGV4ID0gY2FjaGVJbmRleDsKICAgIAkJCQlhY3Rpb25zWyBjYWNoZUluZGV4IF0gPSBsYXN0SW5hY3RpdmVBY3Rpb247CiAgICAJCQkJYWN0aW9ucy5wb3AoKTsKCiAgICAJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nc0ZvckFjdGlvbiggYWN0aW9uICk7CgogICAgCQkJfQoKICAgIAkJCWRlbGV0ZSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdOwoKICAgIAkJfQoKICAgIAl9LAoKICAgIAkvLyBmcmVlIGFsbCByZXNvdXJjZXMgc3BlY2lmaWMgdG8gYSBwYXJ0aWN1bGFyIHJvb3QgdGFyZ2V0IG9iamVjdAogICAgCXVuY2FjaGVSb290OiBmdW5jdGlvbiAoIHJvb3QgKSB7CgogICAgCQl2YXIgcm9vdFV1aWQgPSByb290LnV1aWQsCiAgICAJCQlhY3Rpb25zQnlDbGlwID0gdGhpcy5fYWN0aW9uc0J5Q2xpcDsKCiAgICAJCWZvciAoIHZhciBjbGlwVXVpZCBpbiBhY3Rpb25zQnlDbGlwICkgewoKICAgIAkJCXZhciBhY3Rpb25CeVJvb3QgPSBhY3Rpb25zQnlDbGlwWyBjbGlwVXVpZCBdLmFjdGlvbkJ5Um9vdCwKICAgIAkJCQlhY3Rpb24gPSBhY3Rpb25CeVJvb3RbIHJvb3RVdWlkIF07CgogICAgCQkJaWYgKCBhY3Rpb24gIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQkJdGhpcy5fZGVhY3RpdmF0ZUFjdGlvbiggYWN0aW9uICk7CiAgICAJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVBY3Rpb24oIGFjdGlvbiApOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJCXZhciBiaW5kaW5nc0J5Um9vdCA9IHRoaXMuX2JpbmRpbmdzQnlSb290QW5kTmFtZSwKICAgIAkJCWJpbmRpbmdCeU5hbWUgPSBiaW5kaW5nc0J5Um9vdFsgcm9vdFV1aWQgXTsKCiAgICAJCWlmICggYmluZGluZ0J5TmFtZSAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWZvciAoIHZhciB0cmFja05hbWUgaW4gYmluZGluZ0J5TmFtZSApIHsKCiAgICAJCQkJdmFyIGJpbmRpbmcgPSBiaW5kaW5nQnlOYW1lWyB0cmFja05hbWUgXTsKICAgIAkJCQliaW5kaW5nLnJlc3RvcmVPcmlnaW5hbFN0YXRlKCk7CiAgICAJCQkJdGhpcy5fcmVtb3ZlSW5hY3RpdmVCaW5kaW5nKCBiaW5kaW5nICk7CgogICAgCQkJfQoKICAgIAkJfQoKICAgIAl9LAoKICAgIAkvLyByZW1vdmUgYSB0YXJnZXRlZCBjbGlwIGZyb20gdGhlIGNhY2hlCiAgICAJdW5jYWNoZUFjdGlvbjogZnVuY3Rpb24gKCBjbGlwLCBvcHRpb25hbFJvb3QgKSB7CgogICAgCQl2YXIgYWN0aW9uID0gdGhpcy5leGlzdGluZ0FjdGlvbiggY2xpcCwgb3B0aW9uYWxSb290ICk7CgogICAgCQlpZiAoIGFjdGlvbiAhPT0gbnVsbCApIHsKCiAgICAJCQl0aGlzLl9kZWFjdGl2YXRlQWN0aW9uKCBhY3Rpb24gKTsKICAgIAkJCXRoaXMuX3JlbW92ZUluYWN0aXZlQWN0aW9uKCBhY3Rpb24gKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBVbmlmb3JtKCB2YWx1ZSApIHsKCiAgICAJaWYgKCB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVW5pZm9ybTogVHlwZSBwYXJhbWV0ZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZC4nICk7CiAgICAJCXZhbHVlID0gYXJndW1lbnRzWyAxIF07CgogICAgCX0KCiAgICAJdGhpcy52YWx1ZSA9IHZhbHVlOwoKICAgIH0KCiAgICBVbmlmb3JtLnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJcmV0dXJuIG5ldyBVbmlmb3JtKCB0aGlzLnZhbHVlLmNsb25lID09PSB1bmRlZmluZWQgPyB0aGlzLnZhbHVlIDogdGhpcy52YWx1ZS5jbG9uZSgpICk7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmVuYWFkYW1zIC8gaHR0cHM6Ly90d2l0dGVyLmNvbS9iZW5fYV9hZGFtcwogICAgICovCgogICAgZnVuY3Rpb24gSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIoIGFycmF5LCBzdHJpZGUsIG1lc2hQZXJBdHRyaWJ1dGUgKSB7CgogICAgCUludGVybGVhdmVkQnVmZmVyLmNhbGwoIHRoaXMsIGFycmF5LCBzdHJpZGUgKTsKCiAgICAJdGhpcy5tZXNoUGVyQXR0cmlidXRlID0gbWVzaFBlckF0dHJpYnV0ZSB8fCAxOwoKICAgIH0KCiAgICBJbnN0YW5jZWRJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBJbnRlcmxlYXZlZEJ1ZmZlci5wcm90b3R5cGUgKSwgewoKICAgIAljb25zdHJ1Y3RvcjogSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXIsCgogICAgCWlzSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IHRydWUsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJSW50ZXJsZWF2ZWRCdWZmZXIucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCQl0aGlzLm1lc2hQZXJBdHRyaWJ1dGUgPSBzb3VyY2UubWVzaFBlckF0dHJpYnV0ZTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8vCiAgICAgKiBAYXV0aG9yIHN0ZXBob21pIC8gaHR0cDovL3N0ZXBoYW5lZ2luaWVyLmNvbS8KICAgICAqLwoKICAgIGZ1bmN0aW9uIFJheWNhc3Rlciggb3JpZ2luLCBkaXJlY3Rpb24sIG5lYXIsIGZhciApIHsKCiAgICAJdGhpcy5yYXkgPSBuZXcgUmF5KCBvcmlnaW4sIGRpcmVjdGlvbiApOwogICAgCS8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpCgogICAgCXRoaXMubmVhciA9IG5lYXIgfHwgMDsKICAgIAl0aGlzLmZhciA9IGZhciB8fCBJbmZpbml0eTsKICAgIAl0aGlzLmNhbWVyYSA9IG51bGw7CgogICAgCXRoaXMucGFyYW1zID0gewogICAgCQlNZXNoOiB7fSwKICAgIAkJTGluZToge30sCiAgICAJCUxPRDoge30sCiAgICAJCVBvaW50czogeyB0aHJlc2hvbGQ6IDEgfSwKICAgIAkJU3ByaXRlOiB7fQogICAgCX07CgogICAgCU9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCB0aGlzLnBhcmFtcywgewogICAgCQlQb2ludENsb3VkOiB7CiAgICAJCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQkJY29uc29sZS53YXJuKCAnVEhSRUUuUmF5Y2FzdGVyOiBwYXJhbXMuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIHBhcmFtcy5Qb2ludHMuJyApOwogICAgCQkJCXJldHVybiB0aGlzLlBvaW50czsKCiAgICAJCQl9CiAgICAJCX0KICAgIAl9ICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIGFzY1NvcnQoIGEsIGIgKSB7CgogICAgCXJldHVybiBhLmRpc3RhbmNlIC0gYi5kaXN0YW5jZTsKCiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJzZWN0T2JqZWN0KCBvYmplY3QsIHJheWNhc3RlciwgaW50ZXJzZWN0cywgcmVjdXJzaXZlICkgewoKICAgIAlpZiAoIG9iamVjdC52aXNpYmxlID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJb2JqZWN0LnJheWNhc3QoIHJheWNhc3RlciwgaW50ZXJzZWN0cyApOwoKICAgIAlpZiAoIHJlY3Vyc2l2ZSA9PT0gdHJ1ZSApIHsKCiAgICAJCXZhciBjaGlsZHJlbiA9IG9iamVjdC5jaGlsZHJlbjsKCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IGNoaWxkcmVuLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJaW50ZXJzZWN0T2JqZWN0KCBjaGlsZHJlblsgaSBdLCByYXljYXN0ZXIsIGludGVyc2VjdHMsIHRydWUgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBSYXljYXN0ZXIucHJvdG90eXBlLCB7CgogICAgCWxpbmVQcmVjaXNpb246IDEsCgogICAgCXNldDogZnVuY3Rpb24gKCBvcmlnaW4sIGRpcmVjdGlvbiApIHsKCiAgICAJCS8vIGRpcmVjdGlvbiBpcyBhc3N1bWVkIHRvIGJlIG5vcm1hbGl6ZWQgKGZvciBhY2N1cmF0ZSBkaXN0YW5jZSBjYWxjdWxhdGlvbnMpCgogICAgCQl0aGlzLnJheS5zZXQoIG9yaWdpbiwgZGlyZWN0aW9uICk7CgogICAgCX0sCgogICAgCXNldEZyb21DYW1lcmE6IGZ1bmN0aW9uICggY29vcmRzLCBjYW1lcmEgKSB7CgogICAgCQlpZiAoICggY2FtZXJhICYmIGNhbWVyYS5pc1BlcnNwZWN0aXZlQ2FtZXJhICkgKSB7CgogICAgCQkJdGhpcy5yYXkub3JpZ2luLnNldEZyb21NYXRyaXhQb3NpdGlvbiggY2FtZXJhLm1hdHJpeFdvcmxkICk7CiAgICAJCQl0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCBjb29yZHMueCwgY29vcmRzLnksIDAuNSApLnVucHJvamVjdCggY2FtZXJhICkuc3ViKCB0aGlzLnJheS5vcmlnaW4gKS5ub3JtYWxpemUoKTsKICAgIAkJCXRoaXMuY2FtZXJhID0gY2FtZXJhOwoKICAgIAkJfSBlbHNlIGlmICggKCBjYW1lcmEgJiYgY2FtZXJhLmlzT3J0aG9ncmFwaGljQ2FtZXJhICkgKSB7CgogICAgCQkJdGhpcy5yYXkub3JpZ2luLnNldCggY29vcmRzLngsIGNvb3Jkcy55LCAoIGNhbWVyYS5uZWFyICsgY2FtZXJhLmZhciApIC8gKCBjYW1lcmEubmVhciAtIGNhbWVyYS5mYXIgKSApLnVucHJvamVjdCggY2FtZXJhICk7IC8vIHNldCBvcmlnaW4gaW4gcGxhbmUgb2YgY2FtZXJhCiAgICAJCQl0aGlzLnJheS5kaXJlY3Rpb24uc2V0KCAwLCAwLCAtIDEgKS50cmFuc2Zvcm1EaXJlY3Rpb24oIGNhbWVyYS5tYXRyaXhXb3JsZCApOwogICAgCQkJdGhpcy5jYW1lcmEgPSBjYW1lcmE7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5SYXljYXN0ZXI6IFVuc3VwcG9ydGVkIGNhbWVyYSB0eXBlLicgKTsKCiAgICAJCX0KCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0T2JqZWN0OiBmdW5jdGlvbiAoIG9iamVjdCwgcmVjdXJzaXZlLCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJCXZhciBpbnRlcnNlY3RzID0gb3B0aW9uYWxUYXJnZXQgfHwgW107CgogICAgCQlpbnRlcnNlY3RPYmplY3QoIG9iamVjdCwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7CgogICAgCQlpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTsKCiAgICAJCXJldHVybiBpbnRlcnNlY3RzOwoKICAgIAl9LAoKICAgIAlpbnRlcnNlY3RPYmplY3RzOiBmdW5jdGlvbiAoIG9iamVjdHMsIHJlY3Vyc2l2ZSwgb3B0aW9uYWxUYXJnZXQgKSB7CgogICAgCQl2YXIgaW50ZXJzZWN0cyA9IG9wdGlvbmFsVGFyZ2V0IHx8IFtdOwoKICAgIAkJaWYgKCBBcnJheS5pc0FycmF5KCBvYmplY3RzICkgPT09IGZhbHNlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheWNhc3Rlci5pbnRlcnNlY3RPYmplY3RzOiBvYmplY3RzIGlzIG5vdCBhbiBBcnJheS4nICk7CiAgICAJCQlyZXR1cm4gaW50ZXJzZWN0czsKCiAgICAJCX0KCiAgICAJCWZvciAoIHZhciBpID0gMCwgbCA9IG9iamVjdHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQlpbnRlcnNlY3RPYmplY3QoIG9iamVjdHNbIGkgXSwgdGhpcywgaW50ZXJzZWN0cywgcmVjdXJzaXZlICk7CgogICAgCQl9CgogICAgCQlpbnRlcnNlY3RzLnNvcnQoIGFzY1NvcnQgKTsKCiAgICAJCXJldHVybiBpbnRlcnNlY3RzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBiaG91c3RvbiAvIGh0dHA6Ly9jbGFyYS5pbwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKgogICAgICogUmVmOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9TcGhlcmljYWxfY29vcmRpbmF0ZV9zeXN0ZW0KICAgICAqCiAgICAgKiBUaGUgcG9sYXIgYW5nbGUgKHBoaSkgaXMgbWVhc3VyZWQgZnJvbSB0aGUgcG9zaXRpdmUgeS1heGlzLiBUaGUgcG9zaXRpdmUgeS1heGlzIGlzIHVwLgogICAgICogVGhlIGF6aW11dGhhbCBhbmdsZSAodGhldGEpIGlzIG1lYXN1cmVkIGZyb20gdGhlIHBvc2l0aXZlIHotYXhpei4KICAgICAqLwoKICAgIGZ1bmN0aW9uIFNwaGVyaWNhbCggcmFkaXVzLCBwaGksIHRoZXRhICkgewoKICAgIAl0aGlzLnJhZGl1cyA9ICggcmFkaXVzICE9PSB1bmRlZmluZWQgKSA/IHJhZGl1cyA6IDEuMDsKICAgIAl0aGlzLnBoaSA9ICggcGhpICE9PSB1bmRlZmluZWQgKSA/IHBoaSA6IDA7IC8vIHBvbGFyIGFuZ2xlCiAgICAJdGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBhemltdXRoYWwgYW5nbGUKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIFNwaGVyaWNhbC5wcm90b3R5cGUsIHsKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgcGhpLCB0aGV0YSApIHsKCiAgICAJCXRoaXMucmFkaXVzID0gcmFkaXVzOwogICAgCQl0aGlzLnBoaSA9IHBoaTsKICAgIAkJdGhpcy50aGV0YSA9IHRoZXRhOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7CgogICAgCQl0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1czsKICAgIAkJdGhpcy5waGkgPSBvdGhlci5waGk7CiAgICAJCXRoaXMudGhldGEgPSBvdGhlci50aGV0YTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAkvLyByZXN0cmljdCBwaGkgdG8gYmUgYmV0d2VlIEVQUyBhbmQgUEktRVBTCiAgICAJbWFrZVNhZmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCXZhciBFUFMgPSAwLjAwMDAwMTsKICAgIAkJdGhpcy5waGkgPSBNYXRoLm1heCggRVBTLCBNYXRoLm1pbiggTWF0aC5QSSAtIEVQUywgdGhpcy5waGkgKSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKCB2LngsIHYueSwgdi56ICk7CgogICAgCX0sCgogICAgCXNldEZyb21DYXJ0ZXNpYW5Db29yZHM6IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKCiAgICAJCXRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHkgKiB5ICsgeiAqIHogKTsKCiAgICAJCWlmICggdGhpcy5yYWRpdXMgPT09IDAgKSB7CgogICAgCQkJdGhpcy50aGV0YSA9IDA7CiAgICAJCQl0aGlzLnBoaSA9IDA7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCXRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB4LCB6ICk7CiAgICAJCQl0aGlzLnBoaSA9IE1hdGguYWNvcyggX01hdGguY2xhbXAoIHkgLyB0aGlzLnJhZGl1cywgLSAxLCAxICkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cHM6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqCiAgICAgKiBSZWY6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0N5bGluZHJpY2FsX2Nvb3JkaW5hdGVfc3lzdGVtCiAgICAgKgogICAgICovCgogICAgZnVuY3Rpb24gQ3lsaW5kcmljYWwoIHJhZGl1cywgdGhldGEsIHkgKSB7CgogICAgCXRoaXMucmFkaXVzID0gKCByYWRpdXMgIT09IHVuZGVmaW5lZCApID8gcmFkaXVzIDogMS4wOyAvLyBkaXN0YW5jZSBmcm9tIHRoZSBvcmlnaW4gdG8gYSBwb2ludCBpbiB0aGUgeC16IHBsYW5lCiAgICAJdGhpcy50aGV0YSA9ICggdGhldGEgIT09IHVuZGVmaW5lZCApID8gdGhldGEgOiAwOyAvLyBjb3VudGVyY2xvY2t3aXNlIGFuZ2xlIGluIHRoZSB4LXogcGxhbmUgbWVhc3VyZWQgaW4gcmFkaWFucyBmcm9tIHRoZSBwb3NpdGl2ZSB6LWF4aXMKICAgIAl0aGlzLnkgPSAoIHkgIT09IHVuZGVmaW5lZCApID8geSA6IDA7IC8vIGhlaWdodCBhYm92ZSB0aGUgeC16IHBsYW5lCgogICAgCXJldHVybiB0aGlzOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBDeWxpbmRyaWNhbC5wcm90b3R5cGUsIHsKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHJhZGl1cywgdGhldGEsIHkgKSB7CgogICAgCQl0aGlzLnJhZGl1cyA9IHJhZGl1czsKICAgIAkJdGhpcy50aGV0YSA9IHRoZXRhOwogICAgCQl0aGlzLnkgPSB5OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggb3RoZXIgKSB7CgogICAgCQl0aGlzLnJhZGl1cyA9IG90aGVyLnJhZGl1czsKICAgIAkJdGhpcy50aGV0YSA9IG90aGVyLnRoZXRhOwogICAgCQl0aGlzLnkgPSBvdGhlci55OwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCXNldEZyb21WZWN0b3IzOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQlyZXR1cm4gdGhpcy5zZXRGcm9tQ2FydGVzaWFuQ29vcmRzKCB2LngsIHYueSwgdi56ICk7CgogICAgCX0sCgogICAgCXNldEZyb21DYXJ0ZXNpYW5Db29yZHM6IGZ1bmN0aW9uICggeCwgeSwgeiApIHsKCiAgICAJCXRoaXMucmFkaXVzID0gTWF0aC5zcXJ0KCB4ICogeCArIHogKiB6ICk7CiAgICAJCXRoaXMudGhldGEgPSBNYXRoLmF0YW4yKCB4LCB6ICk7CiAgICAJCXRoaXMueSA9IHk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KICAgICAqLwoKICAgIHZhciBfdmVjdG9yJDYgPSBuZXcgVmVjdG9yMigpOwoKICAgIGZ1bmN0aW9uIEJveDIoIG1pbiwgbWF4ICkgewoKICAgIAl0aGlzLm1pbiA9ICggbWluICE9PSB1bmRlZmluZWQgKSA/IG1pbiA6IG5ldyBWZWN0b3IyKCArIEluZmluaXR5LCArIEluZmluaXR5ICk7CiAgICAJdGhpcy5tYXggPSAoIG1heCAhPT0gdW5kZWZpbmVkICkgPyBtYXggOiBuZXcgVmVjdG9yMiggLSBJbmZpbml0eSwgLSBJbmZpbml0eSApOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBCb3gyLnByb3RvdHlwZSwgewoKICAgIAlzZXQ6IGZ1bmN0aW9uICggbWluLCBtYXggKSB7CgogICAgCQl0aGlzLm1pbi5jb3B5KCBtaW4gKTsKICAgIAkJdGhpcy5tYXguY29weSggbWF4ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7CgogICAgCQl0aGlzLm1ha2VFbXB0eSgpOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBpbCA9IHBvaW50cy5sZW5ndGg7IGkgPCBpbDsgaSArKyApIHsKCiAgICAJCQl0aGlzLmV4cGFuZEJ5UG9pbnQoIHBvaW50c1sgaSBdICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJc2V0RnJvbUNlbnRlckFuZFNpemU6IGZ1bmN0aW9uICggY2VudGVyLCBzaXplICkgewoKICAgIAkJdmFyIGhhbGZTaXplID0gX3ZlY3RvciQ2LmNvcHkoIHNpemUgKS5tdWx0aXBseVNjYWxhciggMC41ICk7CiAgICAJCXRoaXMubWluLmNvcHkoIGNlbnRlciApLnN1YiggaGFsZlNpemUgKTsKICAgIAkJdGhpcy5tYXguY29weSggY2VudGVyICkuYWRkKCBoYWxmU2l6ZSApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggYm94ICkgewoKICAgIAkJdGhpcy5taW4uY29weSggYm94Lm1pbiApOwogICAgCQl0aGlzLm1heC5jb3B5KCBib3gubWF4ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJbWFrZUVtcHR5OiBmdW5jdGlvbiAoKSB7CgogICAgCQl0aGlzLm1pbi54ID0gdGhpcy5taW4ueSA9ICsgSW5maW5pdHk7CiAgICAJCXRoaXMubWF4LnggPSB0aGlzLm1heC55ID0gLSBJbmZpbml0eTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlpc0VtcHR5OiBmdW5jdGlvbiAoKSB7CgogICAgCQkvLyB0aGlzIGlzIGEgbW9yZSByb2J1c3QgY2hlY2sgZm9yIGVtcHR5IHRoYW4gKCB2b2x1bWUgPD0gMCApIGJlY2F1c2Ugdm9sdW1lIGNhbiBnZXQgcG9zaXRpdmUgd2l0aCB0d28gbmVnYXRpdmUgYXhlcwoKICAgIAkJcmV0dXJuICggdGhpcy5tYXgueCA8IHRoaXMubWluLnggKSB8fCAoIHRoaXMubWF4LnkgPCB0aGlzLm1pbi55ICk7CgogICAgCX0sCgogICAgCWdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5nZXRDZW50ZXIoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjIoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzLmlzRW1wdHkoKSA/IHRhcmdldC5zZXQoIDAsIDAgKSA6IHRhcmdldC5hZGRWZWN0b3JzKCB0aGlzLm1pbiwgdGhpcy5tYXggKS5tdWx0aXBseVNjYWxhciggMC41ICk7CgogICAgCX0sCgogICAgCWdldFNpemU6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJaWYgKCB0YXJnZXQgPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZ2V0U2l6ZSgpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMigpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRoaXMuaXNFbXB0eSgpID8gdGFyZ2V0LnNldCggMCwgMCApIDogdGFyZ2V0LnN1YlZlY3RvcnMoIHRoaXMubWF4LCB0aGlzLm1pbiApOwoKICAgIAl9LAoKICAgIAlleHBhbmRCeVBvaW50OiBmdW5jdGlvbiAoIHBvaW50ICkgewoKICAgIAkJdGhpcy5taW4ubWluKCBwb2ludCApOwogICAgCQl0aGlzLm1heC5tYXgoIHBvaW50ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXhwYW5kQnlWZWN0b3I6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKICAgIAkJdGhpcy5taW4uc3ViKCB2ZWN0b3IgKTsKICAgIAkJdGhpcy5tYXguYWRkKCB2ZWN0b3IgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAlleHBhbmRCeVNjYWxhcjogZnVuY3Rpb24gKCBzY2FsYXIgKSB7CgogICAgCQl0aGlzLm1pbi5hZGRTY2FsYXIoIC0gc2NhbGFyICk7CiAgICAJCXRoaXMubWF4LmFkZFNjYWxhciggc2NhbGFyICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJY29udGFpbnNQb2ludDogZnVuY3Rpb24gKCBwb2ludCApIHsKCiAgICAJCXJldHVybiBwb2ludC54IDwgdGhpcy5taW4ueCB8fCBwb2ludC54ID4gdGhpcy5tYXgueCB8fAogICAgCQkJcG9pbnQueSA8IHRoaXMubWluLnkgfHwgcG9pbnQueSA+IHRoaXMubWF4LnkgPyBmYWxzZSA6IHRydWU7CgogICAgCX0sCgogICAgCWNvbnRhaW5zQm94OiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXJldHVybiB0aGlzLm1pbi54IDw9IGJveC5taW4ueCAmJiBib3gubWF4LnggPD0gdGhpcy5tYXgueCAmJgogICAgCQkJdGhpcy5taW4ueSA8PSBib3gubWluLnkgJiYgYm94Lm1heC55IDw9IHRoaXMubWF4Lnk7CgogICAgCX0sCgogICAgCWdldFBhcmFtZXRlcjogZnVuY3Rpb24gKCBwb2ludCwgdGFyZ2V0ICkgewoKICAgIAkJLy8gVGhpcyBjYW4gcG90ZW50aWFsbHkgaGF2ZSBhIGRpdmlkZSBieSB6ZXJvIGlmIHRoZSBib3gKICAgIAkJLy8gaGFzIGEgc2l6ZSBkaW1lbnNpb24gb2YgMC4KCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmdldFBhcmFtZXRlcigpIHRhcmdldCBpcyBub3cgcmVxdWlyZWQnICk7CiAgICAJCQl0YXJnZXQgPSBuZXcgVmVjdG9yMigpOwoKICAgIAkJfQoKICAgIAkJcmV0dXJuIHRhcmdldC5zZXQoCiAgICAJCQkoIHBvaW50LnggLSB0aGlzLm1pbi54ICkgLyAoIHRoaXMubWF4LnggLSB0aGlzLm1pbi54ICksCiAgICAJCQkoIHBvaW50LnkgLSB0aGlzLm1pbi55ICkgLyAoIHRoaXMubWF4LnkgLSB0aGlzLm1pbi55ICkKICAgIAkJKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0c0JveDogZnVuY3Rpb24gKCBib3ggKSB7CgogICAgCQkvLyB1c2luZyA0IHNwbGl0dGluZyBwbGFuZXMgdG8gcnVsZSBvdXQgaW50ZXJzZWN0aW9ucwoKICAgIAkJcmV0dXJuIGJveC5tYXgueCA8IHRoaXMubWluLnggfHwgYm94Lm1pbi54ID4gdGhpcy5tYXgueCB8fAogICAgCQkJYm94Lm1heC55IDwgdGhpcy5taW4ueSB8fCBib3gubWluLnkgPiB0aGlzLm1heC55ID8gZmFsc2UgOiB0cnVlOwoKICAgIAl9LAoKICAgIAljbGFtcFBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5jbGFtcFBvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IyKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGFyZ2V0LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApOwoKICAgIAl9LAoKICAgIAlkaXN0YW5jZVRvUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQgKSB7CgogICAgCQl2YXIgY2xhbXBlZFBvaW50ID0gX3ZlY3RvciQ2LmNvcHkoIHBvaW50ICkuY2xhbXAoIHRoaXMubWluLCB0aGlzLm1heCApOwogICAgCQlyZXR1cm4gY2xhbXBlZFBvaW50LnN1YiggcG9pbnQgKS5sZW5ndGgoKTsKCiAgICAJfSwKCiAgICAJaW50ZXJzZWN0OiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXRoaXMubWluLm1heCggYm94Lm1pbiApOwogICAgCQl0aGlzLm1heC5taW4oIGJveC5tYXggKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAl1bmlvbjogZnVuY3Rpb24gKCBib3ggKSB7CgogICAgCQl0aGlzLm1pbi5taW4oIGJveC5taW4gKTsKICAgIAkJdGhpcy5tYXgubWF4KCBib3gubWF4ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJdHJhbnNsYXRlOiBmdW5jdGlvbiAoIG9mZnNldCApIHsKCiAgICAJCXRoaXMubWluLmFkZCggb2Zmc2V0ICk7CiAgICAJCXRoaXMubWF4LmFkZCggb2Zmc2V0ICk7CgogICAgCQlyZXR1cm4gdGhpczsKCiAgICAJfSwKCiAgICAJZXF1YWxzOiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCXJldHVybiBib3gubWluLmVxdWFscyggdGhpcy5taW4gKSAmJiBib3gubWF4LmVxdWFscyggdGhpcy5tYXggKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KICAgICAqLwoKICAgIHZhciBfc3RhcnRQID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfc3RhcnRFbmQgPSBuZXcgVmVjdG9yMygpOwoKICAgIGZ1bmN0aW9uIExpbmUzKCBzdGFydCwgZW5kICkgewoKICAgIAl0aGlzLnN0YXJ0ID0gKCBzdGFydCAhPT0gdW5kZWZpbmVkICkgPyBzdGFydCA6IG5ldyBWZWN0b3IzKCk7CiAgICAJdGhpcy5lbmQgPSAoIGVuZCAhPT0gdW5kZWZpbmVkICkgPyBlbmQgOiBuZXcgVmVjdG9yMygpOwoKICAgIH0KCiAgICBPYmplY3QuYXNzaWduKCBMaW5lMy5wcm90b3R5cGUsIHsKCiAgICAJc2V0OiBmdW5jdGlvbiAoIHN0YXJ0LCBlbmQgKSB7CgogICAgCQl0aGlzLnN0YXJ0LmNvcHkoIHN0YXJ0ICk7CiAgICAJCXRoaXMuZW5kLmNvcHkoIGVuZCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWNsb25lOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgCX0sCgogICAgCWNvcHk6IGZ1bmN0aW9uICggbGluZSApIHsKCiAgICAJCXRoaXMuc3RhcnQuY29weSggbGluZS5zdGFydCApOwogICAgCQl0aGlzLmVuZC5jb3B5KCBsaW5lLmVuZCApOwoKICAgIAkJcmV0dXJuIHRoaXM7CgogICAgCX0sCgogICAgCWdldENlbnRlcjogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZ2V0Q2VudGVyKCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGFyZ2V0LmFkZFZlY3RvcnMoIHRoaXMuc3RhcnQsIHRoaXMuZW5kICkubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKICAgIAl9LAoKICAgIAlkZWx0YTogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuZGVsdGEoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0YXJnZXQuc3ViVmVjdG9ycyggdGhpcy5lbmQsIHRoaXMuc3RhcnQgKTsKCiAgICAJfSwKCiAgICAJZGlzdGFuY2VTcTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIHRoaXMuc3RhcnQuZGlzdGFuY2VUb1NxdWFyZWQoIHRoaXMuZW5kICk7CgogICAgCX0sCgogICAgCWRpc3RhbmNlOiBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gdGhpcy5zdGFydC5kaXN0YW5jZVRvKCB0aGlzLmVuZCApOwoKICAgIAl9LAoKICAgIAlhdDogZnVuY3Rpb24gKCB0LCB0YXJnZXQgKSB7CgogICAgCQlpZiAoIHRhcmdldCA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpbmUzOiAuYXQoKSB0YXJnZXQgaXMgbm93IHJlcXVpcmVkJyApOwogICAgCQkJdGFyZ2V0ID0gbmV3IFZlY3RvcjMoKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiB0aGlzLmRlbHRhKCB0YXJnZXQgKS5tdWx0aXBseVNjYWxhciggdCApLmFkZCggdGhpcy5zdGFydCApOwoKICAgIAl9LAoKICAgIAljbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyOiBmdW5jdGlvbiAoIHBvaW50LCBjbGFtcFRvTGluZSApIHsKCiAgICAJCV9zdGFydFAuc3ViVmVjdG9ycyggcG9pbnQsIHRoaXMuc3RhcnQgKTsKICAgIAkJX3N0YXJ0RW5kLnN1YlZlY3RvcnMoIHRoaXMuZW5kLCB0aGlzLnN0YXJ0ICk7CgogICAgCQl2YXIgc3RhcnRFbmQyID0gX3N0YXJ0RW5kLmRvdCggX3N0YXJ0RW5kICk7CiAgICAJCXZhciBzdGFydEVuZF9zdGFydFAgPSBfc3RhcnRFbmQuZG90KCBfc3RhcnRQICk7CgogICAgCQl2YXIgdCA9IHN0YXJ0RW5kX3N0YXJ0UCAvIHN0YXJ0RW5kMjsKCiAgICAJCWlmICggY2xhbXBUb0xpbmUgKSB7CgogICAgCQkJdCA9IF9NYXRoLmNsYW1wKCB0LCAwLCAxICk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdDsKCiAgICAJfSwKCiAgICAJY2xvc2VzdFBvaW50VG9Qb2ludDogZnVuY3Rpb24gKCBwb2ludCwgY2xhbXBUb0xpbmUsIHRhcmdldCApIHsKCiAgICAJCXZhciB0ID0gdGhpcy5jbG9zZXN0UG9pbnRUb1BvaW50UGFyYW1ldGVyKCBwb2ludCwgY2xhbXBUb0xpbmUgKTsKCiAgICAJCWlmICggdGFyZ2V0ID09PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jbG9zZXN0UG9pbnRUb1BvaW50KCkgdGFyZ2V0IGlzIG5vdyByZXF1aXJlZCcgKTsKICAgIAkJCXRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQl9CgogICAgCQlyZXR1cm4gdGhpcy5kZWx0YSggdGFyZ2V0ICkubXVsdGlwbHlTY2FsYXIoIHQgKS5hZGQoIHRoaXMuc3RhcnQgKTsKCiAgICAJfSwKCiAgICAJYXBwbHlNYXRyaXg0OiBmdW5jdGlvbiAoIG1hdHJpeCApIHsKCiAgICAJCXRoaXMuc3RhcnQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKICAgIAkJdGhpcy5lbmQuYXBwbHlNYXRyaXg0KCBtYXRyaXggKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAllcXVhbHM6IGZ1bmN0aW9uICggbGluZSApIHsKCiAgICAJCXJldHVybiBsaW5lLnN0YXJ0LmVxdWFscyggdGhpcy5zdGFydCApICYmIGxpbmUuZW5kLmVxdWFscyggdGhpcy5lbmQgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBJbW1lZGlhdGVSZW5kZXJPYmplY3QoIG1hdGVyaWFsICkgewoKICAgIAlPYmplY3QzRC5jYWxsKCB0aGlzICk7CgogICAgCXRoaXMubWF0ZXJpYWwgPSBtYXRlcmlhbDsKICAgIAl0aGlzLnJlbmRlciA9IGZ1bmN0aW9uICggLyogcmVuZGVyQ2FsbGJhY2sgKi8gKSB7fTsKCiAgICB9CgogICAgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApOwogICAgSW1tZWRpYXRlUmVuZGVyT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEltbWVkaWF0ZVJlbmRlck9iamVjdDsKCiAgICBJbW1lZGlhdGVSZW5kZXJPYmplY3QucHJvdG90eXBlLmlzSW1tZWRpYXRlUmVuZGVyT2JqZWN0ID0gdHJ1ZTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqLwoKICAgIHZhciBfdjEkNSA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3YyJDMgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9ub3JtYWxNYXRyaXgkMSA9IG5ldyBNYXRyaXgzKCk7CiAgICB2YXIgX2tleXMgPSBbICdhJywgJ2InLCAnYycgXTsKCiAgICBmdW5jdGlvbiBWZXJ0ZXhOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkgewoKICAgIAl0aGlzLm9iamVjdCA9IG9iamVjdDsKCiAgICAJdGhpcy5zaXplID0gKCBzaXplICE9PSB1bmRlZmluZWQgKSA/IHNpemUgOiAxOwoKICAgIAl2YXIgY29sb3IgPSAoIGhleCAhPT0gdW5kZWZpbmVkICkgPyBoZXggOiAweGZmMDAwMDsKCiAgICAJdmFyIHdpZHRoID0gKCBsaW5ld2lkdGggIT09IHVuZGVmaW5lZCApID8gbGluZXdpZHRoIDogMTsKCiAgICAJLy8KCiAgICAJdmFyIG5Ob3JtYWxzID0gMDsKCiAgICAJdmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CgogICAgCWlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNHZW9tZXRyeSApIHsKCiAgICAJCW5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuZmFjZXMubGVuZ3RoICogMzsKCiAgICAJfSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCiAgICAJCW5Ob3JtYWxzID0gb2JqR2VvbWV0cnkuYXR0cmlidXRlcy5ub3JtYWwuY291bnQ7CgogICAgCX0KCiAgICAJLy8KCiAgICAJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgogICAgCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggbk5vcm1hbHMgKiAyICogMywgMyApOwoKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIHBvc2l0aW9ucyApOwoKICAgIAlMaW5lU2VnbWVudHMuY2FsbCggdGhpcywgZ2VvbWV0cnksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIGxpbmV3aWR0aDogd2lkdGggfSApICk7CgogICAgCS8vCgogICAgCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKICAgIAl0aGlzLnVwZGF0ZSgpOwoKICAgIH0KCiAgICBWZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKICAgIFZlcnRleE5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gVmVydGV4Tm9ybWFsc0hlbHBlcjsKCiAgICBWZXJ0ZXhOb3JtYWxzSGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CgogICAgCXRoaXMub2JqZWN0LnVwZGF0ZU1hdHJpeFdvcmxkKCB0cnVlICk7CgogICAgCV9ub3JtYWxNYXRyaXgkMS5nZXROb3JtYWxNYXRyaXgoIHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkICk7CgogICAgCXZhciBtYXRyaXhXb3JsZCA9IHRoaXMub2JqZWN0Lm1hdHJpeFdvcmxkOwoKICAgIAl2YXIgcG9zaXRpb24gPSB0aGlzLmdlb21ldHJ5LmF0dHJpYnV0ZXMucG9zaXRpb247CgogICAgCS8vCgogICAgCXZhciBvYmpHZW9tZXRyeSA9IHRoaXMub2JqZWN0Lmdlb21ldHJ5OwoKICAgIAlpZiAoIG9iakdlb21ldHJ5ICYmIG9iakdlb21ldHJ5LmlzR2VvbWV0cnkgKSB7CgogICAgCQl2YXIgdmVydGljZXMgPSBvYmpHZW9tZXRyeS52ZXJ0aWNlczsKCiAgICAJCXZhciBmYWNlcyA9IG9iakdlb21ldHJ5LmZhY2VzOwoKICAgIAkJdmFyIGlkeCA9IDA7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBmYWNlcy5sZW5ndGg7IGkgPCBsOyBpICsrICkgewoKICAgIAkJCXZhciBmYWNlID0gZmFjZXNbIGkgXTsKCiAgICAJCQlmb3IgKCB2YXIgaiA9IDAsIGpsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzLmxlbmd0aDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCQl2YXIgdmVydGV4ID0gdmVydGljZXNbIGZhY2VbIF9rZXlzWyBqIF0gXSBdOwoKICAgIAkJCQl2YXIgbm9ybWFsID0gZmFjZS52ZXJ0ZXhOb3JtYWxzWyBqIF07CgogICAgCQkJCV92MSQ1LmNvcHkoIHZlcnRleCApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKCiAgICAJCQkJX3YyJDMuY29weSggbm9ybWFsICkuYXBwbHlNYXRyaXgzKCBfbm9ybWFsTWF0cml4JDEgKS5ub3JtYWxpemUoKS5tdWx0aXBseVNjYWxhciggdGhpcy5zaXplICkuYWRkKCBfdjEkNSApOwoKICAgIAkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgX3YxJDUueCwgX3YxJDUueSwgX3YxJDUueiApOwoKICAgIAkJCQlpZHggPSBpZHggKyAxOwoKICAgIAkJCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgX3YyJDMueCwgX3YyJDMueSwgX3YyJDMueiApOwoKICAgIAkJCQlpZHggPSBpZHggKyAxOwoKICAgIAkJCX0KCiAgICAJCX0KCiAgICAJfSBlbHNlIGlmICggb2JqR2VvbWV0cnkgJiYgb2JqR2VvbWV0cnkuaXNCdWZmZXJHZW9tZXRyeSApIHsKCiAgICAJCXZhciBvYmpQb3MgPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwoKICAgIAkJdmFyIG9iak5vcm0gPSBvYmpHZW9tZXRyeS5hdHRyaWJ1dGVzLm5vcm1hbDsKCiAgICAJCXZhciBpZHggPSAwOwoKICAgIAkJLy8gZm9yIHNpbXBsaWNpdHksIGlnbm9yZSBpbmRleCBhbmQgZHJhd2NhbGxzLCBhbmQgcmVuZGVyIGV2ZXJ5IG5vcm1hbAoKICAgIAkJZm9yICggdmFyIGogPSAwLCBqbCA9IG9ialBvcy5jb3VudDsgaiA8IGpsOyBqICsrICkgewoKICAgIAkJCV92MSQ1LnNldCggb2JqUG9zLmdldFgoIGogKSwgb2JqUG9zLmdldFkoIGogKSwgb2JqUG9zLmdldFooIGogKSApLmFwcGx5TWF0cml4NCggbWF0cml4V29ybGQgKTsKCiAgICAJCQlfdjIkMy5zZXQoIG9iak5vcm0uZ2V0WCggaiApLCBvYmpOb3JtLmdldFkoIGogKSwgb2JqTm9ybS5nZXRaKCBqICkgKTsKCiAgICAJCQlfdjIkMy5hcHBseU1hdHJpeDMoIF9ub3JtYWxNYXRyaXgkMSApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIF92MSQ1ICk7CgogICAgCQkJcG9zaXRpb24uc2V0WFlaKCBpZHgsIF92MSQ1LngsIF92MSQ1LnksIF92MSQ1LnogKTsKCiAgICAJCQlpZHggPSBpZHggKyAxOwoKICAgIAkJCXBvc2l0aW9uLnNldFhZWiggaWR4LCBfdjIkMy54LCBfdjIkMy55LCBfdjIkMy56ICk7CgogICAgCQkJaWR4ID0gaWR4ICsgMTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlwb3NpdGlvbi5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICB2YXIgX3ZlY3RvciQ3ID0gbmV3IFZlY3RvcjMoKTsKCiAgICBmdW5jdGlvbiBTcG90TGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLmxpZ2h0ID0gbGlnaHQ7CiAgICAJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKICAgIAl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOwogICAgCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKICAgIAl0aGlzLmNvbG9yID0gY29sb3I7CgogICAgCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwoKICAgIAl2YXIgcG9zaXRpb25zID0gWwogICAgCQkwLCAwLCAwLCAJMCwgMCwgMSwKICAgIAkJMCwgMCwgMCwgCTEsIDAsIDEsCiAgICAJCTAsIDAsIDAsCS0gMSwgMCwgMSwKICAgIAkJMCwgMCwgMCwgCTAsIDEsIDEsCiAgICAJCTAsIDAsIDAsIAkwLCAtIDEsIDEKICAgIAldOwoKICAgIAlmb3IgKCB2YXIgaSA9IDAsIGogPSAxLCBsID0gMzI7IGkgPCBsOyBpICsrLCBqICsrICkgewoKICAgIAkJdmFyIHAxID0gKCBpIC8gbCApICogTWF0aC5QSSAqIDI7CiAgICAJCXZhciBwMiA9ICggaiAvIGwgKSAqIE1hdGguUEkgKiAyOwoKICAgIAkJcG9zaXRpb25zLnB1c2goCiAgICAJCQlNYXRoLmNvcyggcDEgKSwgTWF0aC5zaW4oIHAxICksIDEsCiAgICAJCQlNYXRoLmNvcyggcDIgKSwgTWF0aC5zaW4oIHAyICksIDEKICAgIAkJKTsKCiAgICAJfQoKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApOwoKICAgIAl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7CgogICAgCXRoaXMuY29uZSA9IG5ldyBMaW5lU2VnbWVudHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApOwogICAgCXRoaXMuYWRkKCB0aGlzLmNvbmUgKTsKCiAgICAJdGhpcy51cGRhdGUoKTsKCiAgICB9CgogICAgU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIE9iamVjdDNELnByb3RvdHlwZSApOwogICAgU3BvdExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNwb3RMaWdodEhlbHBlcjsKCiAgICBTcG90TGlnaHRIZWxwZXIucHJvdG90eXBlLmRpc3Bvc2UgPSBmdW5jdGlvbiAoKSB7CgogICAgCXRoaXMuY29uZS5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAJdGhpcy5jb25lLm1hdGVyaWFsLmRpc3Bvc2UoKTsKCiAgICB9OwoKICAgIFNwb3RMaWdodEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgewoKICAgIAl0aGlzLmxpZ2h0LnVwZGF0ZU1hdHJpeFdvcmxkKCk7CgogICAgCXZhciBjb25lTGVuZ3RoID0gdGhpcy5saWdodC5kaXN0YW5jZSA/IHRoaXMubGlnaHQuZGlzdGFuY2UgOiAxMDAwOwogICAgCXZhciBjb25lV2lkdGggPSBjb25lTGVuZ3RoICogTWF0aC50YW4oIHRoaXMubGlnaHQuYW5nbGUgKTsKCiAgICAJdGhpcy5jb25lLnNjYWxlLnNldCggY29uZVdpZHRoLCBjb25lV2lkdGgsIGNvbmVMZW5ndGggKTsKCiAgICAJX3ZlY3RvciQ3LnNldEZyb21NYXRyaXhQb3NpdGlvbiggdGhpcy5saWdodC50YXJnZXQubWF0cml4V29ybGQgKTsKCiAgICAJdGhpcy5jb25lLmxvb2tBdCggX3ZlY3RvciQ3ICk7CgogICAgCWlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKCiAgICAJfQoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIFNlYW4gR3JpZmZpbiAvIGh0dHA6Ly90d2l0dGVyLmNvbS9zZ3JpZgogICAgICogQGF1dGhvciBNaWNoYWVsIEd1ZXJyZXJvIC8gaHR0cDovL3JlYWxpdHltZWx0ZG93bi5jb20KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIGlrZXJyIC8gaHR0cDovL3Zlcm9sZC5jb20KICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICB2YXIgX3ZlY3RvciQ4ID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfYm9uZU1hdHJpeCA9IG5ldyBNYXRyaXg0KCk7CiAgICB2YXIgX21hdHJpeFdvcmxkSW52ID0gbmV3IE1hdHJpeDQoKTsKCiAgICBmdW5jdGlvbiBnZXRCb25lTGlzdCggb2JqZWN0ICkgewoKICAgIAl2YXIgYm9uZUxpc3QgPSBbXTsKCiAgICAJaWYgKCBvYmplY3QgJiYgb2JqZWN0LmlzQm9uZSApIHsKCiAgICAJCWJvbmVMaXN0LnB1c2goIG9iamVjdCApOwoKICAgIAl9CgogICAgCWZvciAoIHZhciBpID0gMDsgaSA8IG9iamVjdC5jaGlsZHJlbi5sZW5ndGg7IGkgKysgKSB7CgogICAgCQlib25lTGlzdC5wdXNoLmFwcGx5KCBib25lTGlzdCwgZ2V0Qm9uZUxpc3QoIG9iamVjdC5jaGlsZHJlblsgaSBdICkgKTsKCiAgICAJfQoKICAgIAlyZXR1cm4gYm9uZUxpc3Q7CgogICAgfQoKICAgIGZ1bmN0aW9uIFNrZWxldG9uSGVscGVyKCBvYmplY3QgKSB7CgogICAgCXZhciBib25lcyA9IGdldEJvbmVMaXN0KCBvYmplY3QgKTsKCiAgICAJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwogICAgCXZhciBjb2xvcnMgPSBbXTsKCiAgICAJdmFyIGNvbG9yMSA9IG5ldyBDb2xvciQ3KCAwLCAwLCAxICk7CiAgICAJdmFyIGNvbG9yMiA9IG5ldyBDb2xvciQ3KCAwLCAxLCAwICk7CgogICAgCWZvciAoIHZhciBpID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCXZhciBib25lID0gYm9uZXNbIGkgXTsKCiAgICAJCWlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkgewoKICAgIAkJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKICAgIAkJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKICAgIAkJCWNvbG9ycy5wdXNoKCBjb2xvcjEuciwgY29sb3IxLmcsIGNvbG9yMS5iICk7CiAgICAJCQljb2xvcnMucHVzaCggY29sb3IyLnIsIGNvbG9yMi5nLCBjb2xvcjIuYiApOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHZlcnRpY2VzLCAzICkgKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdjb2xvcicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBjb2xvcnMsIDMgKSApOwoKICAgIAl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgdmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsIGRlcHRoVGVzdDogZmFsc2UsIGRlcHRoV3JpdGU6IGZhbHNlLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7CgogICAgCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICAJdGhpcy5yb290ID0gb2JqZWN0OwogICAgCXRoaXMuYm9uZXMgPSBib25lczsKCiAgICAJdGhpcy5tYXRyaXggPSBvYmplY3QubWF0cml4V29ybGQ7CiAgICAJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CgogICAgfQoKICAgIFNrZWxldG9uSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKICAgIFNrZWxldG9uSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFNrZWxldG9uSGVscGVyOwoKICAgIFNrZWxldG9uSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7CgogICAgCXZhciBib25lcyA9IHRoaXMuYm9uZXM7CgogICAgCXZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7CgogICAgCV9tYXRyaXhXb3JsZEludi5nZXRJbnZlcnNlKCB0aGlzLnJvb3QubWF0cml4V29ybGQgKTsKCiAgICAJZm9yICggdmFyIGkgPSAwLCBqID0gMDsgaSA8IGJvbmVzLmxlbmd0aDsgaSArKyApIHsKCiAgICAJCXZhciBib25lID0gYm9uZXNbIGkgXTsKCiAgICAJCWlmICggYm9uZS5wYXJlbnQgJiYgYm9uZS5wYXJlbnQuaXNCb25lICkgewoKICAgIAkJCV9ib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIF9tYXRyaXhXb3JsZEludiwgYm9uZS5tYXRyaXhXb3JsZCApOwogICAgCQkJX3ZlY3RvciQ4LnNldEZyb21NYXRyaXhQb3NpdGlvbiggX2JvbmVNYXRyaXggKTsKICAgIAkJCXBvc2l0aW9uLnNldFhZWiggaiwgX3ZlY3RvciQ4LngsIF92ZWN0b3IkOC55LCBfdmVjdG9yJDgueiApOwoKICAgIAkJCV9ib25lTWF0cml4Lm11bHRpcGx5TWF0cmljZXMoIF9tYXRyaXhXb3JsZEludiwgYm9uZS5wYXJlbnQubWF0cml4V29ybGQgKTsKICAgIAkJCV92ZWN0b3IkOC5zZXRGcm9tTWF0cml4UG9zaXRpb24oIF9ib25lTWF0cml4ICk7CiAgICAJCQlwb3NpdGlvbi5zZXRYWVooIGogKyAxLCBfdmVjdG9yJDgueCwgX3ZlY3RvciQ4LnksIF92ZWN0b3IkOC56ICk7CgogICAgCQkJaiArPSAyOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJyApLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICAJT2JqZWN0M0QucHJvdG90eXBlLnVwZGF0ZU1hdHJpeFdvcmxkLmNhbGwoIHRoaXMsIGZvcmNlICk7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gUG9pbnRMaWdodEhlbHBlciggbGlnaHQsIHNwaGVyZVNpemUsIGNvbG9yICkgewoKICAgIAl0aGlzLmxpZ2h0ID0gbGlnaHQ7CiAgICAJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKICAgIAl0aGlzLmNvbG9yID0gY29sb3I7CgogICAgCXZhciBnZW9tZXRyeSA9IG5ldyBTcGhlcmVCdWZmZXJHZW9tZXRyeSggc3BoZXJlU2l6ZSwgNCwgMiApOwogICAgCXZhciBtYXRlcmlhbCA9IG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyB3aXJlZnJhbWU6IHRydWUsIGZvZzogZmFsc2UgfSApOwoKICAgIAlNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKICAgIAl0aGlzLm1hdHJpeCA9IHRoaXMubGlnaHQubWF0cml4V29ybGQ7CiAgICAJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CgogICAgCXRoaXMudXBkYXRlKCk7CgoKICAgIAkvKgogICAgCXZhciBkaXN0YW5jZUdlb21ldHJ5ID0gbmV3IFRIUkVFLkljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIDEsIDIgKTsKICAgIAl2YXIgZGlzdGFuY2VNYXRlcmlhbCA9IG5ldyBUSFJFRS5NZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4Q29sb3IsIGZvZzogZmFsc2UsIHdpcmVmcmFtZTogdHJ1ZSwgb3BhY2l0eTogMC4xLCB0cmFuc3BhcmVudDogdHJ1ZSB9ICk7CgogICAgCXRoaXMubGlnaHRTcGhlcmUgPSBuZXcgVEhSRUUuTWVzaCggYnVsYkdlb21ldHJ5LCBidWxiTWF0ZXJpYWwgKTsKICAgIAl0aGlzLmxpZ2h0RGlzdGFuY2UgPSBuZXcgVEhSRUUuTWVzaCggZGlzdGFuY2VHZW9tZXRyeSwgZGlzdGFuY2VNYXRlcmlhbCApOwoKICAgIAl2YXIgZCA9IGxpZ2h0LmRpc3RhbmNlOwoKICAgIAlpZiAoIGQgPT09IDAuMCApIHsKCiAgICAJCXRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gZmFsc2U7CgogICAgCX0gZWxzZSB7CgogICAgCQl0aGlzLmxpZ2h0RGlzdGFuY2Uuc2NhbGUuc2V0KCBkLCBkLCBkICk7CgogICAgCX0KCiAgICAJdGhpcy5hZGQoIHRoaXMubGlnaHREaXN0YW5jZSApOwogICAgCSovCgogICAgfQoKICAgIFBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTsKICAgIFBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9pbnRMaWdodEhlbHBlcjsKCiAgICBQb2ludExpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgewoKICAgIAl0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgIAl0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKCiAgICB9OwoKICAgIFBvaW50TGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJaWYgKCB0aGlzLmNvbG9yICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQl0aGlzLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJdGhpcy5tYXRlcmlhbC5jb2xvci5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7CgogICAgCX0KCiAgICAJLyoKICAgIAl2YXIgZCA9IHRoaXMubGlnaHQuZGlzdGFuY2U7CgogICAgCWlmICggZCA9PT0gMC4wICkgewoKICAgIAkJdGhpcy5saWdodERpc3RhbmNlLnZpc2libGUgPSBmYWxzZTsKCiAgICAJfSBlbHNlIHsKCiAgICAJCXRoaXMubGlnaHREaXN0YW5jZS52aXNpYmxlID0gdHJ1ZTsKICAgIAkJdGhpcy5saWdodERpc3RhbmNlLnNjYWxlLnNldCggZCwgZCwgZCApOwoKICAgIAl9CiAgICAJKi8KCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBhYmVsbmF0aW9uIC8gaHR0cDovL2dpdGh1Yi5jb20vYWJlbG5hdGlvbgogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKgogICAgICogIFRoaXMgaGVscGVyIG11c3QgYmUgYWRkZWQgYXMgYSBjaGlsZCBvZiB0aGUgbGlnaHQKICAgICAqLwoKICAgIGZ1bmN0aW9uIFJlY3RBcmVhTGlnaHRIZWxwZXIoIGxpZ2h0LCBjb2xvciApIHsKCiAgICAJdGhpcy50eXBlID0gJ1JlY3RBcmVhTGlnaHRIZWxwZXInOwoKICAgIAl0aGlzLmxpZ2h0ID0gbGlnaHQ7CgogICAgCXRoaXMuY29sb3IgPSBjb2xvcjsgLy8gb3B0aW9uYWwgaGFyZHdpcmVkIGNvbG9yIGZvciB0aGUgaGVscGVyCgogICAgCXZhciBwb3NpdGlvbnMgPSBbIDEsIDEsIDAsIC0gMSwgMSwgMCwgLSAxLCAtIDEsIDAsIDEsIC0gMSwgMCwgMSwgMSwgMCBdOwoKICAgIAl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApOwogICAgCWdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKICAgIAl2YXIgbWF0ZXJpYWwgPSBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgZm9nOiBmYWxzZSB9ICk7CgogICAgCUxpbmUuY2FsbCggdGhpcywgZ2VvbWV0cnksIG1hdGVyaWFsICk7CgogICAgCS8vCgogICAgCXZhciBwb3NpdGlvbnMyID0gWyAxLCAxLCAwLCAtIDEsIDEsIDAsIC0gMSwgLSAxLCAwLCAxLCAxLCAwLCAtIDEsIC0gMSwgMCwgMSwgLSAxLCAwIF07CgogICAgCXZhciBnZW9tZXRyeTIgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlnZW9tZXRyeTIuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zMiwgMyApICk7CiAgICAJZ2VvbWV0cnkyLmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKICAgIAl0aGlzLmFkZCggbmV3IE1lc2goIGdlb21ldHJ5MiwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IHNpZGU6IEJhY2tTaWRlLCBmb2c6IGZhbHNlIH0gKSApICk7CgogICAgCXRoaXMudXBkYXRlKCk7CgogICAgfQoKICAgIFJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZS5wcm90b3R5cGUgKTsKICAgIFJlY3RBcmVhTGlnaHRIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUmVjdEFyZWFMaWdodEhlbHBlcjsKCiAgICBSZWN0QXJlYUxpZ2h0SGVscGVyLnByb3RvdHlwZS51cGRhdGUgPSBmdW5jdGlvbiAoKSB7CgogICAgCXRoaXMuc2NhbGUuc2V0KCAwLjUgKiB0aGlzLmxpZ2h0LndpZHRoLCAwLjUgKiB0aGlzLmxpZ2h0LmhlaWdodCwgMSApOwoKICAgIAlpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCXRoaXMubWF0ZXJpYWwuY29sb3Iuc2V0KCB0aGlzLmNvbG9yICk7CiAgICAJCXRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTsKCiAgICAJfSBlbHNlIHsKCiAgICAJCXRoaXMubWF0ZXJpYWwuY29sb3IuY29weSggdGhpcy5saWdodC5jb2xvciApLm11bHRpcGx5U2NhbGFyKCB0aGlzLmxpZ2h0LmludGVuc2l0eSApOwoKICAgIAkJLy8gcHJldmVudCBodWUgc2hpZnQKICAgIAkJdmFyIGMgPSB0aGlzLm1hdGVyaWFsLmNvbG9yOwogICAgCQl2YXIgbWF4ID0gTWF0aC5tYXgoIGMuciwgYy5nLCBjLmIgKTsKICAgIAkJaWYgKCBtYXggPiAxICkgYy5tdWx0aXBseVNjYWxhciggMSAvIG1heCApOwoKICAgIAkJdGhpcy5jaGlsZHJlblsgMCBdLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubWF0ZXJpYWwuY29sb3IgKTsKCiAgICAJfQoKICAgIH07CgogICAgUmVjdEFyZWFMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAJdGhpcy5tYXRlcmlhbC5kaXNwb3NlKCk7CiAgICAJdGhpcy5jaGlsZHJlblsgMCBdLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgIAl0aGlzLmNoaWxkcmVuWyAwIF0ubWF0ZXJpYWwuZGlzcG9zZSgpOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIGFsdGVyZWRxIC8gaHR0cDovL2FsdGVyZWRxdWFsaWEuY29tLwogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHBzOi8vZ2l0aHViLmNvbS9NdWdlbjg3CiAgICAgKi8KCiAgICB2YXIgX3ZlY3RvciQ5ID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfY29sb3IxID0gbmV3IENvbG9yJDcoKTsKICAgIHZhciBfY29sb3IyID0gbmV3IENvbG9yJDcoKTsKCiAgICBmdW5jdGlvbiBIZW1pc3BoZXJlTGlnaHRIZWxwZXIoIGxpZ2h0LCBzaXplLCBjb2xvciApIHsKCiAgICAJT2JqZWN0M0QuY2FsbCggdGhpcyApOwoKICAgIAl0aGlzLmxpZ2h0ID0gbGlnaHQ7CiAgICAJdGhpcy5saWdodC51cGRhdGVNYXRyaXhXb3JsZCgpOwoKICAgIAl0aGlzLm1hdHJpeCA9IGxpZ2h0Lm1hdHJpeFdvcmxkOwogICAgCXRoaXMubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwoKICAgIAl0aGlzLmNvbG9yID0gY29sb3I7CgogICAgCXZhciBnZW9tZXRyeSA9IG5ldyBPY3RhaGVkcm9uQnVmZmVyR2VvbWV0cnkoIHNpemUgKTsKICAgIAlnZW9tZXRyeS5yb3RhdGVZKCBNYXRoLlBJICogMC41ICk7CgogICAgCXRoaXMubWF0ZXJpYWwgPSBuZXcgTWVzaEJhc2ljTWF0ZXJpYWwoIHsgd2lyZWZyYW1lOiB0cnVlLCBmb2c6IGZhbHNlIH0gKTsKICAgIAlpZiAoIHRoaXMuY29sb3IgPT09IHVuZGVmaW5lZCApIHRoaXMubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzOwoKICAgIAl2YXIgcG9zaXRpb24gPSBnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKTsKICAgIAl2YXIgY29sb3JzID0gbmV3IEZsb2F0MzJBcnJheSggcG9zaXRpb24uY291bnQgKiAzICk7CgogICAgCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKCiAgICAJdGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeSwgdGhpcy5tYXRlcmlhbCApICk7CgogICAgCXRoaXMudXBkYXRlKCk7CgogICAgfQoKICAgIEhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKICAgIEhlbWlzcGhlcmVMaWdodEhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBIZW1pc3BoZXJlTGlnaHRIZWxwZXI7CgogICAgSGVtaXNwaGVyZUxpZ2h0SGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgewoKICAgIAl0aGlzLmNoaWxkcmVuWyAwIF0uZ2VvbWV0cnkuZGlzcG9zZSgpOwogICAgCXRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5kaXNwb3NlKCk7CgogICAgfTsKCiAgICBIZW1pc3BoZXJlTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdmFyIG1lc2ggPSB0aGlzLmNoaWxkcmVuWyAwIF07CgogICAgCWlmICggdGhpcy5jb2xvciAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJdGhpcy5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTsKCiAgICAJfSBlbHNlIHsKCiAgICAJCXZhciBjb2xvcnMgPSBtZXNoLmdlb21ldHJ5LmdldEF0dHJpYnV0ZSggJ2NvbG9yJyApOwoKICAgIAkJX2NvbG9yMS5jb3B5KCB0aGlzLmxpZ2h0LmNvbG9yICk7CiAgICAJCV9jb2xvcjIuY29weSggdGhpcy5saWdodC5ncm91bmRDb2xvciApOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gY29sb3JzLmNvdW50OyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQl2YXIgY29sb3IgPSAoIGkgPCAoIGwgLyAyICkgKSA/IF9jb2xvcjEgOiBfY29sb3IyOwoKICAgIAkJCWNvbG9ycy5zZXRYWVooIGksIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCiAgICAJCX0KCiAgICAJCWNvbG9ycy5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCX0KCiAgICAJbWVzaC5sb29rQXQoIF92ZWN0b3IkOS5zZXRGcm9tTWF0cml4UG9zaXRpb24oIHRoaXMubGlnaHQubWF0cml4V29ybGQgKS5uZWdhdGUoKSApOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqLwoKICAgIGZ1bmN0aW9uIExpZ2h0UHJvYmVIZWxwZXIoIGxpZ2h0UHJvYmUsIHNpemUgKSB7CgogICAgCXRoaXMubGlnaHRQcm9iZSA9IGxpZ2h0UHJvYmU7CgogICAgCXRoaXMuc2l6ZSA9IHNpemU7CgogICAgCXZhciBkZWZpbmVzID0ge307CiAgICAJZGVmaW5lc1sgJ0dBTU1BX09VVFBVVCcgXSA9ICIiOwoKICAgIAkvLyBtYXRlcmlhbAogICAgCXZhciBtYXRlcmlhbCA9IG5ldyBTaGFkZXJNYXRlcmlhbCggewoKICAgIAkJZGVmaW5lczogZGVmaW5lcywKCiAgICAJCXVuaWZvcm1zOiB7CgogICAgCQkJc2g6IHsgdmFsdWU6IHRoaXMubGlnaHRQcm9iZS5zaC5jb2VmZmljaWVudHMgfSwgLy8gYnkgcmVmZXJlbmNlCgogICAgCQkJaW50ZW5zaXR5OiB7IHZhbHVlOiB0aGlzLmxpZ2h0UHJvYmUuaW50ZW5zaXR5IH0KCiAgICAJCX0sCgogICAgCQl2ZXJ0ZXhTaGFkZXI6IFsKCiAgICAJCQkndmFyeWluZyB2ZWMzIHZOb3JtYWw7JywKCiAgICAJCQkndm9pZCBtYWluKCkgeycsCgogICAgCQkJJwl2Tm9ybWFsID0gbm9ybWFsaXplKCBub3JtYWxNYXRyaXggKiBub3JtYWwgKTsnLAoKICAgIAkJCScJZ2xfUG9zaXRpb24gPSBwcm9qZWN0aW9uTWF0cml4ICogbW9kZWxWaWV3TWF0cml4ICogdmVjNCggcG9zaXRpb24sIDEuMCApOycsCgogICAgCQkJJ30nLAoKICAgIAkJXS5qb2luKCAnXG4nICksCgogICAgCQlmcmFnbWVudFNoYWRlcjogWwoKICAgIAkJCScjZGVmaW5lIFJFQ0lQUk9DQUxfUEkgMC4zMTgzMDk4ODYnLAoKICAgIAkJCSd2ZWMzIGludmVyc2VUcmFuc2Zvcm1EaXJlY3Rpb24oIGluIHZlYzMgbm9ybWFsLCBpbiBtYXQ0IG1hdHJpeCApIHsnLAoKICAgIAkJCScJLy8gbWF0cml4IGlzIGFzc3VtZWQgdG8gYmUgb3J0aG9nb25hbCcsCgogICAgCQkJJwlyZXR1cm4gbm9ybWFsaXplKCAoIHZlYzQoIG5vcm1hbCwgMC4wICkgKiBtYXRyaXggKS54eXogKTsnLAoKICAgIAkJCSd9JywKCiAgICAJCQkndmVjMyBsaW5lYXJUb091dHB1dCggaW4gdmVjMyBhICkgeycsCgogICAgCQkJJwkjaWZkZWYgR0FNTUFfT1VUUFVUJywKCiAgICAJCQknCQlyZXR1cm4gcG93KCBhLCB2ZWMzKCAxLjAgLyBmbG9hdCggR0FNTUFfRkFDVE9SICkgKSApOycsCgogICAgCQkJJwkjZWxzZScsCgogICAgCQkJJwkJcmV0dXJuIGE7JywKCiAgICAJCQknCSNlbmRpZicsCgogICAgCQkJJ30nLAoKICAgIAkJCScvLyBzb3VyY2U6IGh0dHBzOi8vZ3JhcGhpY3Muc3RhbmZvcmQuZWR1L3BhcGVycy9lbnZtYXAvZW52bWFwLnBkZicsCiAgICAJCQkndmVjMyBzaEdldElycmFkaWFuY2VBdCggaW4gdmVjMyBub3JtYWwsIGluIHZlYzMgc2hDb2VmZmljaWVudHNbIDkgXSApIHsnLAoKICAgIAkJCScJLy8gbm9ybWFsIGlzIGFzc3VtZWQgdG8gaGF2ZSB1bml0IGxlbmd0aCcsCgogICAgCQkJJwlmbG9hdCB4ID0gbm9ybWFsLngsIHkgPSBub3JtYWwueSwgeiA9IG5vcm1hbC56OycsCgogICAgCQkJJwkvLyBiYW5kIDAnLAogICAgCQkJJwl2ZWMzIHJlc3VsdCA9IHNoQ29lZmZpY2llbnRzWyAwIF0gKiAwLjg4NjIyNzsnLAoKICAgIAkJCScJLy8gYmFuZCAxJywKICAgIAkJCScJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAxIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHk7JywKICAgIAkJCScJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAyIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHo7JywKICAgIAkJCScJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyAzIF0gKiAyLjAgKiAwLjUxMTY2NCAqIHg7JywKCiAgICAJCQknCS8vIGJhbmQgMicsCiAgICAJCQknCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNCBdICogMi4wICogMC40MjkwNDMgKiB4ICogeTsnLAogICAgCQkJJwlyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDUgXSAqIDIuMCAqIDAuNDI5MDQzICogeSAqIHo7JywKICAgIAkJCScJcmVzdWx0ICs9IHNoQ29lZmZpY2llbnRzWyA2IF0gKiAoIDAuNzQzMTI1ICogeiAqIHogLSAwLjI0NzcwOCApOycsCiAgICAJCQknCXJlc3VsdCArPSBzaENvZWZmaWNpZW50c1sgNyBdICogMi4wICogMC40MjkwNDMgKiB4ICogejsnLAogICAgCQkJJwlyZXN1bHQgKz0gc2hDb2VmZmljaWVudHNbIDggXSAqIDAuNDI5MDQzICogKCB4ICogeCAtIHkgKiB5ICk7JywKCiAgICAJCQknCXJldHVybiByZXN1bHQ7JywKCiAgICAJCQknfScsCgogICAgCQkJJ3VuaWZvcm0gdmVjMyBzaFsgOSBdOyAvLyBzaCBjb2VmZmljaWVudHMnLAoKICAgIAkJCSd1bmlmb3JtIGZsb2F0IGludGVuc2l0eTsgLy8gbGlnaHQgcHJvYmUgaW50ZW5zaXR5JywKCiAgICAJCQkndmFyeWluZyB2ZWMzIHZOb3JtYWw7JywKCiAgICAJCQkndm9pZCBtYWluKCkgeycsCgogICAgCQkJJwl2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApOycsCgogICAgCQkJJwl2ZWMzIHdvcmxkTm9ybWFsID0gaW52ZXJzZVRyYW5zZm9ybURpcmVjdGlvbiggbm9ybWFsLCB2aWV3TWF0cml4ICk7JywKCiAgICAJCQknCXZlYzMgaXJyYWRpYW5jZSA9IHNoR2V0SXJyYWRpYW5jZUF0KCB3b3JsZE5vcm1hbCwgc2ggKTsnLAoKICAgIAkJCScJdmVjMyBvdXRnb2luZ0xpZ2h0ID0gUkVDSVBST0NBTF9QSSAqIGlycmFkaWFuY2UgKiBpbnRlbnNpdHk7JywKCiAgICAJCQknCW91dGdvaW5nTGlnaHQgPSBsaW5lYXJUb091dHB1dCggb3V0Z29pbmdMaWdodCApOycsCgogICAgCQkJJwlnbF9GcmFnQ29sb3IgPSB2ZWM0KCBvdXRnb2luZ0xpZ2h0LCAxLjAgKTsnLAoKICAgIAkJCSd9JwoKICAgIAkJXS5qb2luKCAnXG4nICkKCiAgICAJfSApOwoKICAgIAl2YXIgZ2VvbWV0cnkgPSBuZXcgU3BoZXJlQnVmZmVyR2VvbWV0cnkoIDEsIDMyLCAxNiApOwoKICAgIAlNZXNoLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKICAgIAl0aGlzLm9uQmVmb3JlUmVuZGVyKCk7CgogICAgfQoKICAgIExpZ2h0UHJvYmVIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTWVzaC5wcm90b3R5cGUgKTsKICAgIExpZ2h0UHJvYmVIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTGlnaHRQcm9iZUhlbHBlcjsKCiAgICBMaWdodFByb2JlSGVscGVyLnByb3RvdHlwZS5kaXNwb3NlID0gZnVuY3Rpb24gKCkgewoKICAgIAl0aGlzLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgIAl0aGlzLm1hdGVyaWFsLmRpc3Bvc2UoKTsKCiAgICB9OwoKICAgIExpZ2h0UHJvYmVIZWxwZXIucHJvdG90eXBlLm9uQmVmb3JlUmVuZGVyID0gZnVuY3Rpb24gKCkgewoKICAgIAl0aGlzLnBvc2l0aW9uLmNvcHkoIHRoaXMubGlnaHRQcm9iZS5wb3NpdGlvbiApOwoKICAgIAl0aGlzLnNjYWxlLnNldCggMSwgMSwgMSApLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKTsKCiAgICAJdGhpcy5tYXRlcmlhbC51bmlmb3Jtcy5pbnRlbnNpdHkudmFsdWUgPSB0aGlzLmxpZ2h0UHJvYmUuaW50ZW5zaXR5OwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gR3JpZEhlbHBlciggc2l6ZSwgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHsKCiAgICAJc2l6ZSA9IHNpemUgfHwgMTA7CiAgICAJZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDEwOwogICAgCWNvbG9yMSA9IG5ldyBDb2xvciQ3KCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7CiAgICAJY29sb3IyID0gbmV3IENvbG9yJDcoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTsKCiAgICAJdmFyIGNlbnRlciA9IGRpdmlzaW9ucyAvIDI7CiAgICAJdmFyIHN0ZXAgPSBzaXplIC8gZGl2aXNpb25zOwogICAgCXZhciBoYWxmU2l6ZSA9IHNpemUgLyAyOwoKICAgIAl2YXIgdmVydGljZXMgPSBbXSwgY29sb3JzID0gW107CgogICAgCWZvciAoIHZhciBpID0gMCwgaiA9IDAsIGsgPSAtIGhhbGZTaXplOyBpIDw9IGRpdmlzaW9uczsgaSArKywgayArPSBzdGVwICkgewoKICAgIAkJdmVydGljZXMucHVzaCggLSBoYWxmU2l6ZSwgMCwgaywgaGFsZlNpemUsIDAsIGsgKTsKICAgIAkJdmVydGljZXMucHVzaCggaywgMCwgLSBoYWxmU2l6ZSwgaywgMCwgaGFsZlNpemUgKTsKCiAgICAJCXZhciBjb2xvciA9IGkgPT09IGNlbnRlciA/IGNvbG9yMSA6IGNvbG9yMjsKCiAgICAJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CiAgICAJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CiAgICAJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CiAgICAJCWNvbG9yLnRvQXJyYXkoIGNvbG9ycywgaiApOyBqICs9IDM7CgogICAgCX0KCiAgICAJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CiAgICAJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CgogICAgCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7CgogICAgCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICB9CgogICAgR3JpZEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuYXNzaWduKCBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICksIHsKCiAgICAJY29uc3RydWN0b3I6IEdyaWRIZWxwZXIsCgogICAgCWNvcHk6IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAkJTGluZVNlZ21lbnRzLnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSApOwoKICAgIAkJdGhpcy5nZW9tZXRyeS5jb3B5KCBzb3VyY2UuZ2VvbWV0cnkgKTsKICAgIAkJdGhpcy5tYXRlcmlhbC5jb3B5KCBzb3VyY2UubWF0ZXJpYWwgKTsKCiAgICAJCXJldHVybiB0aGlzOwoKICAgIAl9LAoKICAgIAljbG9uZTogZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG5ldyB0aGlzLmNvbnN0cnVjdG9yKCkuY29weSggdGhpcyApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8qKgogICAgICogQGF1dGhvciBtcmRvb2IgLyBodHRwOi8vbXJkb29iLmNvbS8KICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqIEBhdXRob3IgSGVjdGF0ZSAvIGh0dHA6Ly93d3cuZ2l0aHViLmNvbS9IZWN0YXRlCiAgICAgKi8KCiAgICBmdW5jdGlvbiBQb2xhckdyaWRIZWxwZXIoIHJhZGl1cywgcmFkaWFscywgY2lyY2xlcywgZGl2aXNpb25zLCBjb2xvcjEsIGNvbG9yMiApIHsKCiAgICAJcmFkaXVzID0gcmFkaXVzIHx8IDEwOwogICAgCXJhZGlhbHMgPSByYWRpYWxzIHx8IDE2OwogICAgCWNpcmNsZXMgPSBjaXJjbGVzIHx8IDg7CiAgICAJZGl2aXNpb25zID0gZGl2aXNpb25zIHx8IDY0OwogICAgCWNvbG9yMSA9IG5ldyBDb2xvciQ3KCBjb2xvcjEgIT09IHVuZGVmaW5lZCA/IGNvbG9yMSA6IDB4NDQ0NDQ0ICk7CiAgICAJY29sb3IyID0gbmV3IENvbG9yJDcoIGNvbG9yMiAhPT0gdW5kZWZpbmVkID8gY29sb3IyIDogMHg4ODg4ODggKTsKCiAgICAJdmFyIHZlcnRpY2VzID0gW107CiAgICAJdmFyIGNvbG9ycyA9IFtdOwoKICAgIAl2YXIgeCwgejsKICAgIAl2YXIgdiwgaSwgaiwgciwgY29sb3I7CgogICAgCS8vIGNyZWF0ZSB0aGUgcmFkaWFscwoKICAgIAlmb3IgKCBpID0gMDsgaSA8PSByYWRpYWxzOyBpICsrICkgewoKICAgIAkJdiA9ICggaSAvIHJhZGlhbHMgKSAqICggTWF0aC5QSSAqIDIgKTsKCiAgICAJCXggPSBNYXRoLnNpbiggdiApICogcmFkaXVzOwogICAgCQl6ID0gTWF0aC5jb3MoIHYgKSAqIHJhZGl1czsKCiAgICAJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKICAgIAkJdmVydGljZXMucHVzaCggeCwgMCwgeiApOwoKICAgIAkJY29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7CgogICAgCQljb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApOwogICAgCQljb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApOwoKICAgIAl9CgogICAgCS8vIGNyZWF0ZSB0aGUgY2lyY2xlcwoKICAgIAlmb3IgKCBpID0gMDsgaSA8PSBjaXJjbGVzOyBpICsrICkgewoKICAgIAkJY29sb3IgPSAoIGkgJiAxICkgPyBjb2xvcjEgOiBjb2xvcjI7CgogICAgCQlyID0gcmFkaXVzIC0gKCByYWRpdXMgLyBjaXJjbGVzICogaSApOwoKICAgIAkJZm9yICggaiA9IDA7IGogPCBkaXZpc2lvbnM7IGogKysgKSB7CgogICAgCQkJLy8gZmlyc3QgdmVydGV4CgogICAgCQkJdiA9ICggaiAvIGRpdmlzaW9ucyApICogKCBNYXRoLlBJICogMiApOwoKICAgIAkJCXggPSBNYXRoLnNpbiggdiApICogcjsKICAgIAkJCXogPSBNYXRoLmNvcyggdiApICogcjsKCiAgICAJCQl2ZXJ0aWNlcy5wdXNoKCB4LCAwLCB6ICk7CiAgICAJCQljb2xvcnMucHVzaCggY29sb3IuciwgY29sb3IuZywgY29sb3IuYiApOwoKICAgIAkJCS8vIHNlY29uZCB2ZXJ0ZXgKCiAgICAJCQl2ID0gKCAoIGogKyAxICkgLyBkaXZpc2lvbnMgKSAqICggTWF0aC5QSSAqIDIgKTsKCiAgICAJCQl4ID0gTWF0aC5zaW4oIHYgKSAqIHI7CiAgICAJCQl6ID0gTWF0aC5jb3MoIHYgKSAqIHI7CgogICAgCQkJdmVydGljZXMucHVzaCggeCwgMCwgeiApOwogICAgCQkJY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCB2ZXJ0aWNlcywgMyApICk7CiAgICAJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAnY29sb3InLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggY29sb3JzLCAzICkgKTsKCiAgICAJdmFyIG1hdGVyaWFsID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IHZlcnRleENvbG9yczogVmVydGV4Q29sb3JzIH0gKTsKCiAgICAJTGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKICAgIH0KCiAgICBQb2xhckdyaWRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwogICAgUG9sYXJHcmlkSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFBvbGFyR3JpZEhlbHBlcjsKCiAgICAvKioKICAgICAqIEBhdXRob3IgTXVnZW44NyAvIGh0dHA6Ly9naXRodWIuY29tL011Z2VuODcKICAgICAqLwoKICAgIGZ1bmN0aW9uIFBvc2l0aW9uYWxBdWRpb0hlbHBlciggYXVkaW8sIHJhbmdlLCBkaXZpc2lvbnNJbm5lckFuZ2xlLCBkaXZpc2lvbnNPdXRlckFuZ2xlICkgewoKICAgIAl0aGlzLmF1ZGlvID0gYXVkaW87CiAgICAJdGhpcy5yYW5nZSA9IHJhbmdlIHx8IDE7CiAgICAJdGhpcy5kaXZpc2lvbnNJbm5lckFuZ2xlID0gZGl2aXNpb25zSW5uZXJBbmdsZSB8fCAxNjsKICAgIAl0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUgPSBkaXZpc2lvbnNPdXRlckFuZ2xlIHx8IDI7CgogICAgCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwogICAgCXZhciBkaXZpc2lvbnMgPSB0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGUgKyB0aGlzLmRpdmlzaW9uc091dGVyQW5nbGUgKiAyOwogICAgCXZhciBwb3NpdGlvbnMgPSBuZXcgRmxvYXQzMkFycmF5KCAoIGRpdmlzaW9ucyAqIDMgKyAzICkgKiAzICk7CiAgICAJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApOwoKICAgIAl2YXIgbWF0ZXJpYWxJbm5lckFuZ2xlID0gbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiAweDAwZmYwMCB9ICk7CiAgICAJdmFyIG1hdGVyaWFsT3V0ZXJBbmdsZSA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmMDAgfSApOwoKICAgIAlMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBbIG1hdGVyaWFsT3V0ZXJBbmdsZSwgbWF0ZXJpYWxJbm5lckFuZ2xlIF0gKTsKCiAgICAJdGhpcy51cGRhdGUoKTsKCiAgICB9CgogICAgUG9zaXRpb25hbEF1ZGlvSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICk7CiAgICBQb3NpdGlvbmFsQXVkaW9IZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gUG9zaXRpb25hbEF1ZGlvSGVscGVyOwoKICAgIFBvc2l0aW9uYWxBdWRpb0hlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCkgewoKICAgIAl2YXIgYXVkaW8gPSB0aGlzLmF1ZGlvOwogICAgCXZhciByYW5nZSA9IHRoaXMucmFuZ2U7CiAgICAJdmFyIGRpdmlzaW9uc0lubmVyQW5nbGUgPSB0aGlzLmRpdmlzaW9uc0lubmVyQW5nbGU7CiAgICAJdmFyIGRpdmlzaW9uc091dGVyQW5nbGUgPSB0aGlzLmRpdmlzaW9uc091dGVyQW5nbGU7CgogICAgCXZhciBjb25lSW5uZXJBbmdsZSA9IF9NYXRoLmRlZ1RvUmFkKCBhdWRpby5wYW5uZXIuY29uZUlubmVyQW5nbGUgKTsKICAgIAl2YXIgY29uZU91dGVyQW5nbGUgPSBfTWF0aC5kZWdUb1JhZCggYXVkaW8ucGFubmVyLmNvbmVPdXRlckFuZ2xlICk7CgogICAgCXZhciBoYWxmQ29uZUlubmVyQW5nbGUgPSBjb25lSW5uZXJBbmdsZSAvIDI7CiAgICAJdmFyIGhhbGZDb25lT3V0ZXJBbmdsZSA9IGNvbmVPdXRlckFuZ2xlIC8gMjsKCiAgICAJdmFyIHN0YXJ0ID0gMDsKICAgIAl2YXIgY291bnQgPSAwOwogICAgCXZhciBpLCBzdHJpZGU7CgogICAgCXZhciBnZW9tZXRyeSA9IHRoaXMuZ2VvbWV0cnk7CiAgICAJdmFyIHBvc2l0aW9uQXR0cmlidXRlID0gZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCiAgICAJZ2VvbWV0cnkuY2xlYXJHcm91cHMoKTsKCiAgICAJLy8KCiAgICAJZnVuY3Rpb24gZ2VuZXJhdGVTZWdtZW50KCBmcm9tLCB0bywgZGl2aXNpb25zLCBtYXRlcmlhbEluZGV4ICkgewoKICAgIAkJdmFyIHN0ZXAgPSAoIHRvIC0gZnJvbSApIC8gZGl2aXNpb25zOwoKICAgIAkJcG9zaXRpb25BdHRyaWJ1dGUuc2V0WFlaKCBzdGFydCwgMCwgMCwgMCApOwogICAgCQljb3VudCArKzsKCiAgICAJCWZvciAoIGkgPSBmcm9tOyBpIDwgdG87IGkgKz0gc3RlcCApIHsKCiAgICAJCQlzdHJpZGUgPSBzdGFydCArIGNvdW50OwoKICAgIAkJCXBvc2l0aW9uQXR0cmlidXRlLnNldFhZWiggc3RyaWRlLCBNYXRoLnNpbiggaSApICogcmFuZ2UsIDAsIE1hdGguY29zKCBpICkgKiByYW5nZSApOwogICAgCQkJcG9zaXRpb25BdHRyaWJ1dGUuc2V0WFlaKCBzdHJpZGUgKyAxLCBNYXRoLnNpbiggTWF0aC5taW4oIGkgKyBzdGVwLCB0byApICkgKiByYW5nZSwgMCwgTWF0aC5jb3MoIE1hdGgubWluKCBpICsgc3RlcCwgdG8gKSApICogcmFuZ2UgKTsKICAgIAkJCXBvc2l0aW9uQXR0cmlidXRlLnNldFhZWiggc3RyaWRlICsgMiwgMCwgMCwgMCApOwoKICAgIAkJCWNvdW50ICs9IDM7CgogICAgCQl9CgogICAgCQlnZW9tZXRyeS5hZGRHcm91cCggc3RhcnQsIGNvdW50LCBtYXRlcmlhbEluZGV4ICk7CgogICAgCQlzdGFydCArPSBjb3VudDsKICAgIAkJY291bnQgPSAwOwoKICAgIAl9CgogICAgCS8vCgogICAgCWdlbmVyYXRlU2VnbWVudCggLSBoYWxmQ29uZU91dGVyQW5nbGUsIC0gaGFsZkNvbmVJbm5lckFuZ2xlLCBkaXZpc2lvbnNPdXRlckFuZ2xlLCAwICk7CiAgICAJZ2VuZXJhdGVTZWdtZW50KCAtIGhhbGZDb25lSW5uZXJBbmdsZSwgaGFsZkNvbmVJbm5lckFuZ2xlLCBkaXZpc2lvbnNJbm5lckFuZ2xlLCAxICk7CiAgICAJZ2VuZXJhdGVTZWdtZW50KCBoYWxmQ29uZUlubmVyQW5nbGUsIGhhbGZDb25lT3V0ZXJBbmdsZSwgZGl2aXNpb25zT3V0ZXJBbmdsZSwgMCApOwoKICAgIAkvLwoKICAgIAlwb3NpdGlvbkF0dHJpYnV0ZS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgCWlmICggY29uZUlubmVyQW5nbGUgPT09IGNvbmVPdXRlckFuZ2xlICkgdGhpcy5tYXRlcmlhbFsgMCBdLnZpc2libGUgPSBmYWxzZTsKCiAgICB9OwoKICAgIFBvc2l0aW9uYWxBdWRpb0hlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdGhpcy5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAJdGhpcy5tYXRlcmlhbFsgMCBdLmRpc3Bvc2UoKTsKICAgIAl0aGlzLm1hdGVyaWFsWyAxIF0uZGlzcG9zZSgpOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICB2YXIgX3YxJDYgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF92MiQ0ID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbm9ybWFsTWF0cml4JDIgPSBuZXcgTWF0cml4MygpOwoKICAgIGZ1bmN0aW9uIEZhY2VOb3JtYWxzSGVscGVyKCBvYmplY3QsIHNpemUsIGhleCwgbGluZXdpZHRoICkgewoKICAgIAkvLyBGYWNlTm9ybWFsc0hlbHBlciBvbmx5IHN1cHBvcnRzIFRIUkVFLkdlb21ldHJ5CgogICAgCXRoaXMub2JqZWN0ID0gb2JqZWN0OwoKICAgIAl0aGlzLnNpemUgPSAoIHNpemUgIT09IHVuZGVmaW5lZCApID8gc2l6ZSA6IDE7CgogICAgCXZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwOwoKICAgIAl2YXIgd2lkdGggPSAoIGxpbmV3aWR0aCAhPT0gdW5kZWZpbmVkICkgPyBsaW5ld2lkdGggOiAxOwoKICAgIAkvLwoKICAgIAl2YXIgbk5vcm1hbHMgPSAwOwoKICAgIAl2YXIgb2JqR2VvbWV0cnkgPSB0aGlzLm9iamVjdC5nZW9tZXRyeTsKCiAgICAJaWYgKCBvYmpHZW9tZXRyeSAmJiBvYmpHZW9tZXRyeS5pc0dlb21ldHJ5ICkgewoKICAgIAkJbk5vcm1hbHMgPSBvYmpHZW9tZXRyeS5mYWNlcy5sZW5ndGg7CgogICAgCX0gZWxzZSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5GYWNlTm9ybWFsc0hlbHBlcjogb25seSBUSFJFRS5HZW9tZXRyeSBpcyBzdXBwb3J0ZWQuIFVzZSBUSFJFRS5WZXJ0ZXhOb3JtYWxzSGVscGVyLCBpbnN0ZWFkLicgKTsKCiAgICAJfQoKICAgIAkvLwoKICAgIAl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKCiAgICAJdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBuTm9ybWFscyAqIDIgKiAzLCAzICk7CgogICAgCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgcG9zaXRpb25zICk7CgogICAgCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciwgbGluZXdpZHRoOiB3aWR0aCB9ICkgKTsKCiAgICAJLy8KCiAgICAJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CiAgICAJdGhpcy51cGRhdGUoKTsKCiAgICB9CgogICAgRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwogICAgRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gRmFjZU5vcm1hbHNIZWxwZXI7CgogICAgRmFjZU5vcm1hbHNIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdGhpcy5vYmplY3QudXBkYXRlTWF0cml4V29ybGQoIHRydWUgKTsKCiAgICAJX25vcm1hbE1hdHJpeCQyLmdldE5vcm1hbE1hdHJpeCggdGhpcy5vYmplY3QubWF0cml4V29ybGQgKTsKCiAgICAJdmFyIG1hdHJpeFdvcmxkID0gdGhpcy5vYmplY3QubWF0cml4V29ybGQ7CgogICAgCXZhciBwb3NpdGlvbiA9IHRoaXMuZ2VvbWV0cnkuYXR0cmlidXRlcy5wb3NpdGlvbjsKCiAgICAJLy8KCiAgICAJdmFyIG9iakdlb21ldHJ5ID0gdGhpcy5vYmplY3QuZ2VvbWV0cnk7CgogICAgCXZhciB2ZXJ0aWNlcyA9IG9iakdlb21ldHJ5LnZlcnRpY2VzOwoKICAgIAl2YXIgZmFjZXMgPSBvYmpHZW9tZXRyeS5mYWNlczsKCiAgICAJdmFyIGlkeCA9IDA7CgogICAgCWZvciAoIHZhciBpID0gMCwgbCA9IGZhY2VzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQl2YXIgZmFjZSA9IGZhY2VzWyBpIF07CgogICAgCQl2YXIgbm9ybWFsID0gZmFjZS5ub3JtYWw7CgogICAgCQlfdjEkNi5jb3B5KCB2ZXJ0aWNlc1sgZmFjZS5hIF0gKQogICAgCQkJLmFkZCggdmVydGljZXNbIGZhY2UuYiBdICkKICAgIAkJCS5hZGQoIHZlcnRpY2VzWyBmYWNlLmMgXSApCiAgICAJCQkuZGl2aWRlU2NhbGFyKCAzICkKICAgIAkJCS5hcHBseU1hdHJpeDQoIG1hdHJpeFdvcmxkICk7CgogICAgCQlfdjIkNC5jb3B5KCBub3JtYWwgKS5hcHBseU1hdHJpeDMoIF9ub3JtYWxNYXRyaXgkMiApLm5vcm1hbGl6ZSgpLm11bHRpcGx5U2NhbGFyKCB0aGlzLnNpemUgKS5hZGQoIF92MSQ2ICk7CgogICAgCQlwb3NpdGlvbi5zZXRYWVooIGlkeCwgX3YxJDYueCwgX3YxJDYueSwgX3YxJDYueiApOwoKICAgIAkJaWR4ID0gaWR4ICsgMTsKCiAgICAJCXBvc2l0aW9uLnNldFhZWiggaWR4LCBfdjIkNC54LCBfdjIkNC55LCBfdjIkNC56ICk7CgogICAgCQlpZHggPSBpZHggKyAxOwoKICAgIAl9CgogICAgCXBvc2l0aW9uLm5lZWRzVXBkYXRlID0gdHJ1ZTsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBhbHRlcmVkcSAvIGh0dHA6Ly9hbHRlcmVkcXVhbGlhLmNvbS8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqLwoKICAgIHZhciBfdjEkNyA9IG5ldyBWZWN0b3IzKCk7CiAgICB2YXIgX3YyJDUgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF92MyQxID0gbmV3IFZlY3RvcjMoKTsKCiAgICBmdW5jdGlvbiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyKCBsaWdodCwgc2l6ZSwgY29sb3IgKSB7CgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJdGhpcy5saWdodCA9IGxpZ2h0OwogICAgCXRoaXMubGlnaHQudXBkYXRlTWF0cml4V29ybGQoKTsKCiAgICAJdGhpcy5tYXRyaXggPSBsaWdodC5tYXRyaXhXb3JsZDsKICAgIAl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCiAgICAJdGhpcy5jb2xvciA9IGNvbG9yOwoKICAgIAlpZiAoIHNpemUgPT09IHVuZGVmaW5lZCApIHNpemUgPSAxOwoKICAgIAl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbCiAgICAJCS0gc2l6ZSwgc2l6ZSwgMCwKICAgIAkJc2l6ZSwgc2l6ZSwgMCwKICAgIAkJc2l6ZSwgLSBzaXplLCAwLAogICAgCQktIHNpemUsIC0gc2l6ZSwgMCwKICAgIAkJLSBzaXplLCBzaXplLCAwCiAgICAJXSwgMyApICk7CgogICAgCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBmb2c6IGZhbHNlIH0gKTsKCiAgICAJdGhpcy5saWdodFBsYW5lID0gbmV3IExpbmUoIGdlb21ldHJ5LCBtYXRlcmlhbCApOwogICAgCXRoaXMuYWRkKCB0aGlzLmxpZ2h0UGxhbmUgKTsKCiAgICAJZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBbIDAsIDAsIDAsIDAsIDAsIDEgXSwgMyApICk7CgogICAgCXRoaXMudGFyZ2V0TGluZSA9IG5ldyBMaW5lKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKICAgIAl0aGlzLmFkZCggdGhpcy50YXJnZXRMaW5lICk7CgogICAgCXRoaXMudXBkYXRlKCk7CgogICAgfQoKICAgIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggT2JqZWN0M0QucHJvdG90eXBlICk7CiAgICBEaXJlY3Rpb25hbExpZ2h0SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IERpcmVjdGlvbmFsTGlnaHRIZWxwZXI7CgogICAgRGlyZWN0aW9uYWxMaWdodEhlbHBlci5wcm90b3R5cGUuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdGhpcy5saWdodFBsYW5lLmdlb21ldHJ5LmRpc3Bvc2UoKTsKICAgIAl0aGlzLmxpZ2h0UGxhbmUubWF0ZXJpYWwuZGlzcG9zZSgpOwogICAgCXRoaXMudGFyZ2V0TGluZS5nZW9tZXRyeS5kaXNwb3NlKCk7CiAgICAJdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmRpc3Bvc2UoKTsKCiAgICB9OwoKICAgIERpcmVjdGlvbmFsTGlnaHRIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJX3YxJDcuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0Lm1hdHJpeFdvcmxkICk7CiAgICAJX3YyJDUuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCB0aGlzLmxpZ2h0LnRhcmdldC5tYXRyaXhXb3JsZCApOwogICAgCV92MyQxLnN1YlZlY3RvcnMoIF92MiQ1LCBfdjEkNyApOwoKICAgIAl0aGlzLmxpZ2h0UGxhbmUubG9va0F0KCBfdjIkNSApOwoKICAgIAlpZiAoIHRoaXMuY29sb3IgIT09IHVuZGVmaW5lZCApIHsKCiAgICAJCXRoaXMubGlnaHRQbGFuZS5tYXRlcmlhbC5jb2xvci5zZXQoIHRoaXMuY29sb3IgKTsKICAgIAkJdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLnNldCggdGhpcy5jb2xvciApOwoKICAgIAl9IGVsc2UgewoKICAgIAkJdGhpcy5saWdodFBsYW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKICAgIAkJdGhpcy50YXJnZXRMaW5lLm1hdGVyaWFsLmNvbG9yLmNvcHkoIHRoaXMubGlnaHQuY29sb3IgKTsKCiAgICAJfQoKICAgIAl0aGlzLnRhcmdldExpbmUubG9va0F0KCBfdjIkNSApOwogICAgCXRoaXMudGFyZ2V0TGluZS5zY2FsZS56ID0gX3YzJDEubGVuZ3RoKCk7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIE11Z2VuODcgLyBodHRwczovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICoKICAgICAqCS0gc2hvd3MgZnJ1c3R1bSwgbGluZSBvZiBzaWdodCBhbmQgdXAgb2YgdGhlIGNhbWVyYQogICAgICoJLSBzdWl0YWJsZSBmb3IgZmFzdCB1cGRhdGVzCiAgICAgKiAJLSBiYXNlZCBvbiBmcnVzdHVtIHZpc3VhbGl6YXRpb24gaW4gbGlnaHRnbC5qcyBzaGFkb3dtYXAgZXhhbXBsZQogICAgICoJCWh0dHA6Ly9ldmFudy5naXRodWIuY29tL2xpZ2h0Z2wuanMvdGVzdHMvc2hhZG93bWFwLmh0bWwKICAgICAqLwoKICAgIHZhciBfdmVjdG9yJGEgPSBuZXcgVmVjdG9yMygpOwogICAgdmFyIF9jYW1lcmEgPSBuZXcgQ2FtZXJhKCk7CgogICAgZnVuY3Rpb24gQ2FtZXJhSGVscGVyKCBjYW1lcmEgKSB7CgogICAgCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwogICAgCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogMHhmZmZmZmYsIHZlcnRleENvbG9yczogRmFjZUNvbG9ycyB9ICk7CgogICAgCXZhciB2ZXJ0aWNlcyA9IFtdOwogICAgCXZhciBjb2xvcnMgPSBbXTsKCiAgICAJdmFyIHBvaW50TWFwID0ge307CgogICAgCS8vIGNvbG9ycwoKICAgIAl2YXIgY29sb3JGcnVzdHVtID0gbmV3IENvbG9yJDcoIDB4ZmZhYTAwICk7CiAgICAJdmFyIGNvbG9yQ29uZSA9IG5ldyBDb2xvciQ3KCAweGZmMDAwMCApOwogICAgCXZhciBjb2xvclVwID0gbmV3IENvbG9yJDcoIDB4MDBhYWZmICk7CiAgICAJdmFyIGNvbG9yVGFyZ2V0ID0gbmV3IENvbG9yJDcoIDB4ZmZmZmZmICk7CiAgICAJdmFyIGNvbG9yQ3Jvc3MgPSBuZXcgQ29sb3IkNyggMHgzMzMzMzMgKTsKCiAgICAJLy8gbmVhcgoKICAgIAlhZGRMaW5lKCAnbjEnLCAnbjInLCBjb2xvckZydXN0dW0gKTsKICAgIAlhZGRMaW5lKCAnbjInLCAnbjQnLCBjb2xvckZydXN0dW0gKTsKICAgIAlhZGRMaW5lKCAnbjQnLCAnbjMnLCBjb2xvckZydXN0dW0gKTsKICAgIAlhZGRMaW5lKCAnbjMnLCAnbjEnLCBjb2xvckZydXN0dW0gKTsKCiAgICAJLy8gZmFyCgogICAgCWFkZExpbmUoICdmMScsICdmMicsIGNvbG9yRnJ1c3R1bSApOwogICAgCWFkZExpbmUoICdmMicsICdmNCcsIGNvbG9yRnJ1c3R1bSApOwogICAgCWFkZExpbmUoICdmNCcsICdmMycsIGNvbG9yRnJ1c3R1bSApOwogICAgCWFkZExpbmUoICdmMycsICdmMScsIGNvbG9yRnJ1c3R1bSApOwoKICAgIAkvLyBzaWRlcwoKICAgIAlhZGRMaW5lKCAnbjEnLCAnZjEnLCBjb2xvckZydXN0dW0gKTsKICAgIAlhZGRMaW5lKCAnbjInLCAnZjInLCBjb2xvckZydXN0dW0gKTsKICAgIAlhZGRMaW5lKCAnbjMnLCAnZjMnLCBjb2xvckZydXN0dW0gKTsKICAgIAlhZGRMaW5lKCAnbjQnLCAnZjQnLCBjb2xvckZydXN0dW0gKTsKCiAgICAJLy8gY29uZQoKICAgIAlhZGRMaW5lKCAncCcsICduMScsIGNvbG9yQ29uZSApOwogICAgCWFkZExpbmUoICdwJywgJ24yJywgY29sb3JDb25lICk7CiAgICAJYWRkTGluZSggJ3AnLCAnbjMnLCBjb2xvckNvbmUgKTsKICAgIAlhZGRMaW5lKCAncCcsICduNCcsIGNvbG9yQ29uZSApOwoKICAgIAkvLyB1cAoKICAgIAlhZGRMaW5lKCAndTEnLCAndTInLCBjb2xvclVwICk7CiAgICAJYWRkTGluZSggJ3UyJywgJ3UzJywgY29sb3JVcCApOwogICAgCWFkZExpbmUoICd1MycsICd1MScsIGNvbG9yVXAgKTsKCiAgICAJLy8gdGFyZ2V0CgogICAgCWFkZExpbmUoICdjJywgJ3QnLCBjb2xvclRhcmdldCApOwogICAgCWFkZExpbmUoICdwJywgJ2MnLCBjb2xvckNyb3NzICk7CgogICAgCS8vIGNyb3NzCgogICAgCWFkZExpbmUoICdjbjEnLCAnY24yJywgY29sb3JDcm9zcyApOwogICAgCWFkZExpbmUoICdjbjMnLCAnY240JywgY29sb3JDcm9zcyApOwoKICAgIAlhZGRMaW5lKCAnY2YxJywgJ2NmMicsIGNvbG9yQ3Jvc3MgKTsKICAgIAlhZGRMaW5lKCAnY2YzJywgJ2NmNCcsIGNvbG9yQ3Jvc3MgKTsKCiAgICAJZnVuY3Rpb24gYWRkTGluZSggYSwgYiwgY29sb3IgKSB7CgogICAgCQlhZGRQb2ludCggYSwgY29sb3IgKTsKICAgIAkJYWRkUG9pbnQoIGIsIGNvbG9yICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gYWRkUG9pbnQoIGlkLCBjb2xvciApIHsKCiAgICAJCXZlcnRpY2VzLnB1c2goIDAsIDAsIDAgKTsKICAgIAkJY29sb3JzLnB1c2goIGNvbG9yLnIsIGNvbG9yLmcsIGNvbG9yLmIgKTsKCiAgICAJCWlmICggcG9pbnRNYXBbIGlkIF0gPT09IHVuZGVmaW5lZCApIHsKCiAgICAJCQlwb2ludE1hcFsgaWQgXSA9IFtdOwoKICAgIAkJfQoKICAgIAkJcG9pbnRNYXBbIGlkIF0ucHVzaCggKCB2ZXJ0aWNlcy5sZW5ndGggLyAzICkgLSAxICk7CgogICAgCX0KCiAgICAJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CgogICAgCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICAJdGhpcy5jYW1lcmEgPSBjYW1lcmE7CiAgICAJaWYgKCB0aGlzLmNhbWVyYS51cGRhdGVQcm9qZWN0aW9uTWF0cml4ICkgdGhpcy5jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwoKICAgIAl0aGlzLm1hdHJpeCA9IGNhbWVyYS5tYXRyaXhXb3JsZDsKICAgIAl0aGlzLm1hdHJpeEF1dG9VcGRhdGUgPSBmYWxzZTsKCiAgICAJdGhpcy5wb2ludE1hcCA9IHBvaW50TWFwOwoKICAgIAl0aGlzLnVwZGF0ZSgpOwoKICAgIH0KCiAgICBDYW1lcmFIZWxwZXIucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggTGluZVNlZ21lbnRzLnByb3RvdHlwZSApOwogICAgQ2FtZXJhSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IENhbWVyYUhlbHBlcjsKCiAgICBDYW1lcmFIZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJdmFyIGdlb21ldHJ5ID0gdGhpcy5nZW9tZXRyeTsKICAgIAl2YXIgcG9pbnRNYXAgPSB0aGlzLnBvaW50TWFwOwoKICAgIAl2YXIgdyA9IDEsIGggPSAxOwoKICAgIAkvLyB3ZSBuZWVkIGp1c3QgY2FtZXJhIHByb2plY3Rpb24gbWF0cml4IGludmVyc2UKICAgIAkvLyB3b3JsZCBtYXRyaXggbXVzdCBiZSBpZGVudGl0eQoKICAgIAlfY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlLmNvcHkoIHRoaXMuY2FtZXJhLnByb2plY3Rpb25NYXRyaXhJbnZlcnNlICk7CgogICAgCS8vIGNlbnRlciAvIHRhcmdldAoKICAgIAlzZXRQb2ludCggJ2MnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIDAsIC0gMSApOwogICAgCXNldFBvaW50KCAndCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgMCwgMSApOwoKICAgIAkvLyBuZWFyCgogICAgCXNldFBvaW50KCAnbjEnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgLSBoLCAtIDEgKTsKICAgIAlzZXRQb2ludCggJ24yJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCB3LCAtIGgsIC0gMSApOwogICAgCXNldFBvaW50KCAnbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgLSAxICk7CiAgICAJc2V0UG9pbnQoICduNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgaCwgLSAxICk7CgogICAgCS8vIGZhcgoKICAgIAlzZXRQb2ludCggJ2YxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIC0gaCwgMSApOwogICAgCXNldFBvaW50KCAnZjInLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIC0gaCwgMSApOwogICAgCXNldFBvaW50KCAnZjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIC0gdywgaCwgMSApOwogICAgCXNldFBvaW50KCAnZjQnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIHcsIGgsIDEgKTsKCiAgICAJLy8gdXAKCiAgICAJc2V0UG9pbnQoICd1MScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdyAqIDAuNywgaCAqIDEuMSwgLSAxICk7CiAgICAJc2V0UG9pbnQoICd1MicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3ICogMC43LCBoICogMS4xLCAtIDEgKTsKICAgIAlzZXRQb2ludCggJ3UzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCBoICogMiwgLSAxICk7CgogICAgCS8vIGNyb3NzCgogICAgCXNldFBvaW50KCAnY2YxJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAtIHcsIDAsIDEgKTsKICAgIAlzZXRQb2ludCggJ2NmMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgMSApOwogICAgCXNldFBvaW50KCAnY2YzJywgcG9pbnRNYXAsIGdlb21ldHJ5LCBfY2FtZXJhLCAwLCAtIGgsIDEgKTsKICAgIAlzZXRQb2ludCggJ2NmNCcsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgMCwgaCwgMSApOwoKICAgIAlzZXRQb2ludCggJ2NuMScsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgLSB3LCAwLCAtIDEgKTsKICAgIAlzZXRQb2ludCggJ2NuMicsIHBvaW50TWFwLCBnZW9tZXRyeSwgX2NhbWVyYSwgdywgMCwgLSAxICk7CiAgICAJc2V0UG9pbnQoICdjbjMnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIC0gaCwgLSAxICk7CiAgICAJc2V0UG9pbnQoICdjbjQnLCBwb2ludE1hcCwgZ2VvbWV0cnksIF9jYW1lcmEsIDAsIGgsIC0gMSApOwoKICAgIAlnZW9tZXRyeS5nZXRBdHRyaWJ1dGUoICdwb3NpdGlvbicgKS5uZWVkc1VwZGF0ZSA9IHRydWU7CgogICAgfTsKCiAgICBmdW5jdGlvbiBzZXRQb2ludCggcG9pbnQsIHBvaW50TWFwLCBnZW9tZXRyeSwgY2FtZXJhLCB4LCB5LCB6ICkgewoKICAgIAlfdmVjdG9yJGEuc2V0KCB4LCB5LCB6ICkudW5wcm9qZWN0KCBjYW1lcmEgKTsKCiAgICAJdmFyIHBvaW50cyA9IHBvaW50TWFwWyBwb2ludCBdOwoKICAgIAlpZiAoIHBvaW50cyAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJdmFyIHBvc2l0aW9uID0gZ2VvbWV0cnkuZ2V0QXR0cmlidXRlKCAncG9zaXRpb24nICk7CgogICAgCQlmb3IgKCB2YXIgaSA9IDAsIGwgPSBwb2ludHMubGVuZ3RoOyBpIDwgbDsgaSArKyApIHsKCiAgICAJCQlwb3NpdGlvbi5zZXRYWVooIHBvaW50c1sgaSBdLCBfdmVjdG9yJGEueCwgX3ZlY3RvciRhLnksIF92ZWN0b3IkYS56ICk7CgogICAgCQl9CgogICAgCX0KCiAgICB9CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICogQGF1dGhvciBNdWdlbjg3IC8gaHR0cDovL2dpdGh1Yi5jb20vTXVnZW44NwogICAgICovCgogICAgdmFyIF9ib3gkMiA9IG5ldyBCb3gzKCk7CgogICAgZnVuY3Rpb24gQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICkgewoKICAgIAl0aGlzLm9iamVjdCA9IG9iamVjdDsKCiAgICAJaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDsKCiAgICAJdmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7CiAgICAJdmFyIHBvc2l0aW9ucyA9IG5ldyBGbG9hdDMyQXJyYXkoIDggKiAzICk7CgogICAgCXZhciBnZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwogICAgCWdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9ucywgMyApICk7CgogICAgCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTsKCiAgICAJdGhpcy5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CgogICAgCXRoaXMudXBkYXRlKCk7CgogICAgfQoKICAgIEJveEhlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CiAgICBCb3hIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94SGVscGVyOwoKICAgIEJveEhlbHBlci5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24gKCBvYmplY3QgKSB7CgogICAgCWlmICggb2JqZWN0ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3hIZWxwZXI6IC51cGRhdGUoKSBoYXMgbm8gbG9uZ2VyIGFyZ3VtZW50cy4nICk7CgogICAgCX0KCiAgICAJaWYgKCB0aGlzLm9iamVjdCAhPT0gdW5kZWZpbmVkICkgewoKICAgIAkJX2JveCQyLnNldEZyb21PYmplY3QoIHRoaXMub2JqZWN0ICk7CgogICAgCX0KCiAgICAJaWYgKCBfYm94JDIuaXNFbXB0eSgpICkgcmV0dXJuOwoKICAgIAl2YXIgbWluID0gX2JveCQyLm1pbjsKICAgIAl2YXIgbWF4ID0gX2JveCQyLm1heDsKCiAgICAJLyoKICAgIAkgIDVfX19fNAogICAgCTEvX19fMC98CiAgICAJfCA2X198XzcKICAgIAkyL19fXzMvCgogICAgCTA6IG1heC54LCBtYXgueSwgbWF4LnoKICAgIAkxOiBtaW4ueCwgbWF4LnksIG1heC56CiAgICAJMjogbWluLngsIG1pbi55LCBtYXguegogICAgCTM6IG1heC54LCBtaW4ueSwgbWF4LnoKICAgIAk0OiBtYXgueCwgbWF4LnksIG1pbi56CiAgICAJNTogbWluLngsIG1heC55LCBtaW4uegogICAgCTY6IG1pbi54LCBtaW4ueSwgbWluLnoKICAgIAk3OiBtYXgueCwgbWluLnksIG1pbi56CiAgICAJKi8KCiAgICAJdmFyIHBvc2l0aW9uID0gdGhpcy5nZW9tZXRyeS5hdHRyaWJ1dGVzLnBvc2l0aW9uOwogICAgCXZhciBhcnJheSA9IHBvc2l0aW9uLmFycmF5OwoKICAgIAlhcnJheVsgMCBdID0gbWF4Lng7IGFycmF5WyAxIF0gPSBtYXgueTsgYXJyYXlbIDIgXSA9IG1heC56OwogICAgCWFycmF5WyAzIF0gPSBtaW4ueDsgYXJyYXlbIDQgXSA9IG1heC55OyBhcnJheVsgNSBdID0gbWF4Lno7CiAgICAJYXJyYXlbIDYgXSA9IG1pbi54OyBhcnJheVsgNyBdID0gbWluLnk7IGFycmF5WyA4IF0gPSBtYXguejsKICAgIAlhcnJheVsgOSBdID0gbWF4Lng7IGFycmF5WyAxMCBdID0gbWluLnk7IGFycmF5WyAxMSBdID0gbWF4Lno7CiAgICAJYXJyYXlbIDEyIF0gPSBtYXgueDsgYXJyYXlbIDEzIF0gPSBtYXgueTsgYXJyYXlbIDE0IF0gPSBtaW4uejsKICAgIAlhcnJheVsgMTUgXSA9IG1pbi54OyBhcnJheVsgMTYgXSA9IG1heC55OyBhcnJheVsgMTcgXSA9IG1pbi56OwogICAgCWFycmF5WyAxOCBdID0gbWluLng7IGFycmF5WyAxOSBdID0gbWluLnk7IGFycmF5WyAyMCBdID0gbWluLno7CiAgICAJYXJyYXlbIDIxIF0gPSBtYXgueDsgYXJyYXlbIDIyIF0gPSBtaW4ueTsgYXJyYXlbIDIzIF0gPSBtaW4uejsKCiAgICAJcG9zaXRpb24ubmVlZHNVcGRhdGUgPSB0cnVlOwoKICAgIAl0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKCiAgICB9OwoKICAgIEJveEhlbHBlci5wcm90b3R5cGUuc2V0RnJvbU9iamVjdCA9IGZ1bmN0aW9uICggb2JqZWN0ICkgewoKICAgIAl0aGlzLm9iamVjdCA9IG9iamVjdDsKICAgIAl0aGlzLnVwZGF0ZSgpOwoKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIEJveEhlbHBlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uICggc291cmNlICkgewoKICAgIAlMaW5lU2VnbWVudHMucHJvdG90eXBlLmNvcHkuY2FsbCggdGhpcywgc291cmNlICk7CgogICAgCXRoaXMub2JqZWN0ID0gc291cmNlLm9iamVjdDsKCiAgICAJcmV0dXJuIHRoaXM7CgogICAgfTsKCiAgICBCb3hIZWxwZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewoKICAgIAlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3IgV2VzdExhbmdsZXkgLyBodHRwOi8vZ2l0aHViLmNvbS9XZXN0TGFuZ2xleQogICAgICovCgogICAgZnVuY3Rpb24gQm94M0hlbHBlciggYm94LCBjb2xvciApIHsKCiAgICAJdGhpcy50eXBlID0gJ0JveDNIZWxwZXInOwoKICAgIAl0aGlzLmJveCA9IGJveDsKCiAgICAJY29sb3IgPSBjb2xvciB8fCAweGZmZmYwMDsKCiAgICAJdmFyIGluZGljZXMgPSBuZXcgVWludDE2QXJyYXkoIFsgMCwgMSwgMSwgMiwgMiwgMywgMywgMCwgNCwgNSwgNSwgNiwgNiwgNywgNywgNCwgMCwgNCwgMSwgNSwgMiwgNiwgMywgNyBdICk7CgogICAgCXZhciBwb3NpdGlvbnMgPSBbIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIC0gMSwgLSAxLCAtIDEsIC0gMSwgMSwgLSAxLCAtIDEgXTsKCiAgICAJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CgogICAgCWdlb21ldHJ5LnNldEluZGV4KCBuZXcgQnVmZmVyQXR0cmlidXRlKCBpbmRpY2VzLCAxICkgKTsKCiAgICAJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggcG9zaXRpb25zLCAzICkgKTsKCiAgICAJTGluZVNlZ21lbnRzLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApOwoKICAgIAl0aGlzLmdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKICAgIH0KCiAgICBCb3gzSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmVTZWdtZW50cy5wcm90b3R5cGUgKTsKICAgIEJveDNIZWxwZXIucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gQm94M0hlbHBlcjsKCiAgICBCb3gzSGVscGVyLnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZCA9IGZ1bmN0aW9uICggZm9yY2UgKSB7CgogICAgCXZhciBib3ggPSB0aGlzLmJveDsKCiAgICAJaWYgKCBib3guaXNFbXB0eSgpICkgcmV0dXJuOwoKICAgIAlib3guZ2V0Q2VudGVyKCB0aGlzLnBvc2l0aW9uICk7CgogICAgCWJveC5nZXRTaXplKCB0aGlzLnNjYWxlICk7CgogICAgCXRoaXMuc2NhbGUubXVsdGlwbHlTY2FsYXIoIDAuNSApOwoKICAgIAlPYmplY3QzRC5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQuY2FsbCggdGhpcywgZm9yY2UgKTsKCiAgICB9OwoKICAgIC8qKgogICAgICogQGF1dGhvciBXZXN0TGFuZ2xleSAvIGh0dHA6Ly9naXRodWIuY29tL1dlc3RMYW5nbGV5CiAgICAgKi8KCiAgICBmdW5jdGlvbiBQbGFuZUhlbHBlciggcGxhbmUsIHNpemUsIGhleCApIHsKCiAgICAJdGhpcy50eXBlID0gJ1BsYW5lSGVscGVyJzsKCiAgICAJdGhpcy5wbGFuZSA9IHBsYW5lOwoKICAgIAl0aGlzLnNpemUgPSAoIHNpemUgPT09IHVuZGVmaW5lZCApID8gMSA6IHNpemU7CgogICAgCXZhciBjb2xvciA9ICggaGV4ICE9PSB1bmRlZmluZWQgKSA/IGhleCA6IDB4ZmZmZjAwOwoKICAgIAl2YXIgcG9zaXRpb25zID0gWyAxLCAtIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIDEsIDEsIC0gMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSwgMSwgMSwgMSwgMCwgMCwgMSwgMCwgMCwgMCBdOwoKICAgIAl2YXIgZ2VvbWV0cnkgPSBuZXcgQnVmZmVyR2VvbWV0cnkoKTsKICAgIAlnZW9tZXRyeS5hZGRBdHRyaWJ1dGUoICdwb3NpdGlvbicsIG5ldyBGbG9hdDMyQnVmZmVyQXR0cmlidXRlKCBwb3NpdGlvbnMsIDMgKSApOwogICAgCWdlb21ldHJ5LmNvbXB1dGVCb3VuZGluZ1NwaGVyZSgpOwoKICAgIAlMaW5lLmNhbGwoIHRoaXMsIGdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApOwoKICAgIAkvLwoKICAgIAl2YXIgcG9zaXRpb25zMiA9IFsgMSwgMSwgMSwgLSAxLCAxLCAxLCAtIDEsIC0gMSwgMSwgMSwgMSwgMSwgLSAxLCAtIDEsIDEsIDEsIC0gMSwgMSBdOwoKICAgIAl2YXIgZ2VvbWV0cnkyID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CiAgICAJZ2VvbWV0cnkyLmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIHBvc2l0aW9uczIsIDMgKSApOwogICAgCWdlb21ldHJ5Mi5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKCiAgICAJdGhpcy5hZGQoIG5ldyBNZXNoKCBnZW9tZXRyeTIsIG5ldyBNZXNoQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogY29sb3IsIG9wYWNpdHk6IDAuMiwgdHJhbnNwYXJlbnQ6IHRydWUsIGRlcHRoV3JpdGU6IGZhbHNlIH0gKSApICk7CgogICAgfQoKICAgIFBsYW5lSGVscGVyLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExpbmUucHJvdG90eXBlICk7CiAgICBQbGFuZUhlbHBlci5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBQbGFuZUhlbHBlcjsKCiAgICBQbGFuZUhlbHBlci5wcm90b3R5cGUudXBkYXRlTWF0cml4V29ybGQgPSBmdW5jdGlvbiAoIGZvcmNlICkgewoKICAgIAl2YXIgc2NhbGUgPSAtIHRoaXMucGxhbmUuY29uc3RhbnQ7CgogICAgCWlmICggTWF0aC5hYnMoIHNjYWxlICkgPCAxZS04ICkgc2NhbGUgPSAxZS04OyAvLyBzaWduIGRvZXMgbm90IG1hdHRlcgoKICAgIAl0aGlzLnNjYWxlLnNldCggMC41ICogdGhpcy5zaXplLCAwLjUgKiB0aGlzLnNpemUsIHNjYWxlICk7CgogICAgCXRoaXMuY2hpbGRyZW5bIDAgXS5tYXRlcmlhbC5zaWRlID0gKCBzY2FsZSA8IDAgKSA/IEJhY2tTaWRlIDogRnJvbnRTaWRlOyAvLyByZW5kZXJlciBmbGlwcyBzaWRlIHdoZW4gZGV0ZXJtaW5hbnQgPCAwOyBmbGlwcGluZyBub3Qgd2FudGVkIGhlcmUKCiAgICAJdGhpcy5sb29rQXQoIHRoaXMucGxhbmUubm9ybWFsICk7CgogICAgCU9iamVjdDNELnByb3RvdHlwZS51cGRhdGVNYXRyaXhXb3JsZC5jYWxsKCB0aGlzLCBmb3JjZSApOwoKICAgIH07CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqIEBhdXRob3Igeno4NSAvIGh0dHA6Ly9naXRodWIuY29tL3p6ODUKICAgICAqIEBhdXRob3IgYmhvdXN0b24gLyBodHRwOi8vY2xhcmEuaW8KICAgICAqCiAgICAgKiBDcmVhdGVzIGFuIGFycm93IGZvciB2aXN1YWxpemluZyBkaXJlY3Rpb25zCiAgICAgKgogICAgICogUGFyYW1ldGVyczoKICAgICAqICBkaXIgLSBWZWN0b3IzCiAgICAgKiAgb3JpZ2luIC0gVmVjdG9yMwogICAgICogIGxlbmd0aCAtIE51bWJlcgogICAgICogIGNvbG9yIC0gY29sb3IgaW4gaGV4IHZhbHVlCiAgICAgKiAgaGVhZExlbmd0aCAtIE51bWJlcgogICAgICogIGhlYWRXaWR0aCAtIE51bWJlcgogICAgICovCgogICAgdmFyIF9heGlzID0gbmV3IFZlY3RvcjMoKTsKICAgIHZhciBfbGluZUdlb21ldHJ5LCBfY29uZUdlb21ldHJ5OwoKICAgIGZ1bmN0aW9uIEFycm93SGVscGVyKCBkaXIsIG9yaWdpbiwgbGVuZ3RoLCBjb2xvciwgaGVhZExlbmd0aCwgaGVhZFdpZHRoICkgewoKICAgIAkvLyBkaXIgaXMgYXNzdW1lZCB0byBiZSBub3JtYWxpemVkCgogICAgCU9iamVjdDNELmNhbGwoIHRoaXMgKTsKCiAgICAJaWYgKCBkaXIgPT09IHVuZGVmaW5lZCApIGRpciA9IG5ldyBWZWN0b3IzKCAwLCAwLCAxICk7CiAgICAJaWYgKCBvcmlnaW4gPT09IHVuZGVmaW5lZCApIG9yaWdpbiA9IG5ldyBWZWN0b3IzKCAwLCAwLCAwICk7CiAgICAJaWYgKCBsZW5ndGggPT09IHVuZGVmaW5lZCApIGxlbmd0aCA9IDE7CiAgICAJaWYgKCBjb2xvciA9PT0gdW5kZWZpbmVkICkgY29sb3IgPSAweGZmZmYwMDsKICAgIAlpZiAoIGhlYWRMZW5ndGggPT09IHVuZGVmaW5lZCApIGhlYWRMZW5ndGggPSAwLjIgKiBsZW5ndGg7CiAgICAJaWYgKCBoZWFkV2lkdGggPT09IHVuZGVmaW5lZCApIGhlYWRXaWR0aCA9IDAuMiAqIGhlYWRMZW5ndGg7CgogICAgCWlmICggX2xpbmVHZW9tZXRyeSA9PT0gdW5kZWZpbmVkICkgewoKICAgIAkJX2xpbmVHZW9tZXRyeSA9IG5ldyBCdWZmZXJHZW9tZXRyeSgpOwogICAgCQlfbGluZUdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ3Bvc2l0aW9uJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIFsgMCwgMCwgMCwgMCwgMSwgMCBdLCAzICkgKTsKCiAgICAJCV9jb25lR2VvbWV0cnkgPSBuZXcgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSggMCwgMC41LCAxLCA1LCAxICk7CiAgICAJCV9jb25lR2VvbWV0cnkudHJhbnNsYXRlKCAwLCAtIDAuNSwgMCApOwoKICAgIAl9CgogICAgCXRoaXMucG9zaXRpb24uY29weSggb3JpZ2luICk7CgogICAgCXRoaXMubGluZSA9IG5ldyBMaW5lKCBfbGluZUdlb21ldHJ5LCBuZXcgTGluZUJhc2ljTWF0ZXJpYWwoIHsgY29sb3I6IGNvbG9yIH0gKSApOwogICAgCXRoaXMubGluZS5tYXRyaXhBdXRvVXBkYXRlID0gZmFsc2U7CiAgICAJdGhpcy5hZGQoIHRoaXMubGluZSApOwoKICAgIAl0aGlzLmNvbmUgPSBuZXcgTWVzaCggX2NvbmVHZW9tZXRyeSwgbmV3IE1lc2hCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBjb2xvciB9ICkgKTsKICAgIAl0aGlzLmNvbmUubWF0cml4QXV0b1VwZGF0ZSA9IGZhbHNlOwogICAgCXRoaXMuYWRkKCB0aGlzLmNvbmUgKTsKCiAgICAJdGhpcy5zZXREaXJlY3Rpb24oIGRpciApOwogICAgCXRoaXMuc2V0TGVuZ3RoKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApOwoKICAgIH0KCiAgICBBcnJvd0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBPYmplY3QzRC5wcm90b3R5cGUgKTsKICAgIEFycm93SGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEFycm93SGVscGVyOwoKICAgIEFycm93SGVscGVyLnByb3RvdHlwZS5zZXREaXJlY3Rpb24gPSBmdW5jdGlvbiAoIGRpciApIHsKCiAgICAJLy8gZGlyIGlzIGFzc3VtZWQgdG8gYmUgbm9ybWFsaXplZAoKICAgIAlpZiAoIGRpci55ID4gMC45OTk5OSApIHsKCiAgICAJCXRoaXMucXVhdGVybmlvbi5zZXQoIDAsIDAsIDAsIDEgKTsKCiAgICAJfSBlbHNlIGlmICggZGlyLnkgPCAtIDAuOTk5OTkgKSB7CgogICAgCQl0aGlzLnF1YXRlcm5pb24uc2V0KCAxLCAwLCAwLCAwICk7CgogICAgCX0gZWxzZSB7CgogICAgCQlfYXhpcy5zZXQoIGRpci56LCAwLCAtIGRpci54ICkubm9ybWFsaXplKCk7CgogICAgCQl2YXIgcmFkaWFucyA9IE1hdGguYWNvcyggZGlyLnkgKTsKCiAgICAJCXRoaXMucXVhdGVybmlvbi5zZXRGcm9tQXhpc0FuZ2xlKCBfYXhpcywgcmFkaWFucyApOwoKICAgIAl9CgogICAgfTsKCiAgICBBcnJvd0hlbHBlci5wcm90b3R5cGUuc2V0TGVuZ3RoID0gZnVuY3Rpb24gKCBsZW5ndGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApIHsKCiAgICAJaWYgKCBoZWFkTGVuZ3RoID09PSB1bmRlZmluZWQgKSBoZWFkTGVuZ3RoID0gMC4yICogbGVuZ3RoOwogICAgCWlmICggaGVhZFdpZHRoID09PSB1bmRlZmluZWQgKSBoZWFkV2lkdGggPSAwLjIgKiBoZWFkTGVuZ3RoOwoKICAgIAl0aGlzLmxpbmUuc2NhbGUuc2V0KCAxLCBNYXRoLm1heCggMCwgbGVuZ3RoIC0gaGVhZExlbmd0aCApLCAxICk7CiAgICAJdGhpcy5saW5lLnVwZGF0ZU1hdHJpeCgpOwoKICAgIAl0aGlzLmNvbmUuc2NhbGUuc2V0KCBoZWFkV2lkdGgsIGhlYWRMZW5ndGgsIGhlYWRXaWR0aCApOwogICAgCXRoaXMuY29uZS5wb3NpdGlvbi55ID0gbGVuZ3RoOwogICAgCXRoaXMuY29uZS51cGRhdGVNYXRyaXgoKTsKCiAgICB9OwoKICAgIEFycm93SGVscGVyLnByb3RvdHlwZS5zZXRDb2xvciA9IGZ1bmN0aW9uICggY29sb3IgKSB7CgogICAgCXRoaXMubGluZS5tYXRlcmlhbC5jb2xvci5zZXQoIGNvbG9yICk7CiAgICAJdGhpcy5jb25lLm1hdGVyaWFsLmNvbG9yLnNldCggY29sb3IgKTsKCiAgICB9OwoKICAgIEFycm93SGVscGVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gKCBzb3VyY2UgKSB7CgogICAgCU9iamVjdDNELnByb3RvdHlwZS5jb3B5LmNhbGwoIHRoaXMsIHNvdXJjZSwgZmFsc2UgKTsKCiAgICAJdGhpcy5saW5lLmNvcHkoIHNvdXJjZS5saW5lICk7CiAgICAJdGhpcy5jb25lLmNvcHkoIHNvdXJjZS5jb25lICk7CgogICAgCXJldHVybiB0aGlzOwoKICAgIH07CgogICAgQXJyb3dIZWxwZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24gKCkgewoKICAgIAlyZXR1cm4gbmV3IHRoaXMuY29uc3RydWN0b3IoKS5jb3B5KCB0aGlzICk7CgogICAgfTsKCiAgICAvKioKICAgICAqIEBhdXRob3Igc3JvdWNoZXJheSAvIGh0dHA6Ly9zcm91Y2hlcmF5Lm9yZy8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20vCiAgICAgKi8KCiAgICBmdW5jdGlvbiBBeGVzSGVscGVyKCBzaXplICkgewoKICAgIAlzaXplID0gc2l6ZSB8fCAxOwoKICAgIAl2YXIgdmVydGljZXMgPSBbCiAgICAJCTAsIDAsIDAsCXNpemUsIDAsIDAsCiAgICAJCTAsIDAsIDAsCTAsIHNpemUsIDAsCiAgICAJCTAsIDAsIDAsCTAsIDAsIHNpemUKICAgIAldOwoKICAgIAl2YXIgY29sb3JzID0gWwogICAgCQkxLCAwLCAwLAkxLCAwLjYsIDAsCiAgICAJCTAsIDEsIDAsCTAuNiwgMSwgMCwKICAgIAkJMCwgMCwgMSwJMCwgMC42LCAxCiAgICAJXTsKCiAgICAJdmFyIGdlb21ldHJ5ID0gbmV3IEJ1ZmZlckdlb21ldHJ5KCk7CiAgICAJZ2VvbWV0cnkuYWRkQXR0cmlidXRlKCAncG9zaXRpb24nLCBuZXcgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSggdmVydGljZXMsIDMgKSApOwogICAgCWdlb21ldHJ5LmFkZEF0dHJpYnV0ZSggJ2NvbG9yJywgbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGNvbG9ycywgMyApICk7CgogICAgCXZhciBtYXRlcmlhbCA9IG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyB2ZXJ0ZXhDb2xvcnM6IFZlcnRleENvbG9ycyB9ICk7CgogICAgCUxpbmVTZWdtZW50cy5jYWxsKCB0aGlzLCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICB9CgogICAgQXhlc0hlbHBlci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBMaW5lU2VnbWVudHMucHJvdG90eXBlICk7CiAgICBBeGVzSGVscGVyLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IEF4ZXNIZWxwZXI7CgogICAgLyoqCiAgICAgKiBAYXV0aG9yIG1yZG9vYiAvIGh0dHA6Ly9tcmRvb2IuY29tLwogICAgICovCgogICAgZnVuY3Rpb24gRmFjZTQoIGEsIGIsIGMsIGQsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkZhY2U0IGhhcyBiZWVuIHJlbW92ZWQuIEEgVEhSRUUuRmFjZTMgd2lsbCBiZSBjcmVhdGVkIGluc3RlYWQuJyApOwogICAgCXJldHVybiBuZXcgRmFjZTMoIGEsIGIsIGMsIG5vcm1hbCwgY29sb3IsIG1hdGVyaWFsSW5kZXggKTsKCiAgICB9CgogICAgdmFyIExpbmVTdHJpcCA9IDA7CgogICAgdmFyIExpbmVQaWVjZXMgPSAxOwoKICAgIGZ1bmN0aW9uIE1lc2hGYWNlTWF0ZXJpYWwoIG1hdGVyaWFscyApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaEZhY2VNYXRlcmlhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgYW4gQXJyYXkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG1hdGVyaWFsczsKCiAgICB9CgogICAgZnVuY3Rpb24gTXVsdGlNYXRlcmlhbCggbWF0ZXJpYWxzICkgewoKICAgIAlpZiAoIG1hdGVyaWFscyA9PT0gdW5kZWZpbmVkICkgbWF0ZXJpYWxzID0gW107CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLk11bHRpTWF0ZXJpYWwgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGFuIEFycmF5IGluc3RlYWQuJyApOwogICAgCW1hdGVyaWFscy5pc011bHRpTWF0ZXJpYWwgPSB0cnVlOwogICAgCW1hdGVyaWFscy5tYXRlcmlhbHMgPSBtYXRlcmlhbHM7CiAgICAJbWF0ZXJpYWxzLmNsb25lID0gZnVuY3Rpb24gKCkgewoKICAgIAkJcmV0dXJuIG1hdGVyaWFscy5zbGljZSgpOwoKICAgIAl9OwogICAgCXJldHVybiBtYXRlcmlhbHM7CgogICAgfQoKICAgIGZ1bmN0aW9uIFBvaW50Q2xvdWQoIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuUG9pbnRDbG91ZCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50cy4nICk7CiAgICAJcmV0dXJuIG5ldyBQb2ludHMoIGdlb21ldHJ5LCBtYXRlcmlhbCApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBQYXJ0aWNsZSggbWF0ZXJpYWwgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlIGhhcyBiZWVuIHJlbmFtZWQgdG8gVEhSRUUuU3ByaXRlLicgKTsKICAgIAlyZXR1cm4gbmV3IFNwcml0ZSggbWF0ZXJpYWwgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gUGFydGljbGVTeXN0ZW0oIGdlb21ldHJ5LCBtYXRlcmlhbCApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuUGFydGljbGVTeXN0ZW0gaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHMuJyApOwogICAgCXJldHVybiBuZXcgUG9pbnRzKCBnZW9tZXRyeSwgbWF0ZXJpYWwgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gUG9pbnRDbG91ZE1hdGVyaWFsKCBwYXJhbWV0ZXJzICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5Qb2ludENsb3VkTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7CiAgICAJcmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlQmFzaWNNYXRlcmlhbCBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLlBvaW50c01hdGVyaWFsLicgKTsKICAgIAlyZXR1cm4gbmV3IFBvaW50c01hdGVyaWFsKCBwYXJhbWV0ZXJzICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwoIHBhcmFtZXRlcnMgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5Qb2ludHNNYXRlcmlhbC4nICk7CiAgICAJcmV0dXJuIG5ldyBQb2ludHNNYXRlcmlhbCggcGFyYW1ldGVycyApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBWZXJ0ZXgoIHgsIHksIHogKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlcnRleCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuVmVjdG9yMyBpbnN0ZWFkLicgKTsKICAgIAlyZXR1cm4gbmV3IFZlY3RvcjMoIHgsIHksIHogKTsKCiAgICB9CgogICAgLy8KCiAgICBmdW5jdGlvbiBEeW5hbWljQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkR5bmFtaWNCdWZmZXJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5CdWZmZXJBdHRyaWJ1dGUoKS5zZXREeW5hbWljKCB0cnVlICkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG5ldyBCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApLnNldER5bmFtaWMoIHRydWUgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gSW50OEF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5JbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuSW50OEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwogICAgCXJldHVybiBuZXcgSW50OEJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIFVpbnQ4QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQ4QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDhCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKICAgIAlyZXR1cm4gbmV3IFVpbnQ4QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gVWludDhDbGFtcGVkQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLlVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwogICAgCXJldHVybiBuZXcgVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gSW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuSW50MTZBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5JbnQxNkJ1ZmZlckF0dHJpYnV0ZSgpIGluc3RlYWQuJyApOwogICAgCXJldHVybiBuZXcgSW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBVaW50MTZBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuVWludDE2QXR0cmlidXRlIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuVWludDE2QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG5ldyBVaW50MTZCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBJbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5JbnQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkludDMyQnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG5ldyBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIFVpbnQzMkF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5VaW50MzJBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5VaW50MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKICAgIAlyZXR1cm4gbmV3IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSggYXJyYXksIGl0ZW1TaXplICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIEZsb2F0MzJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuRmxvYXQzMkF0dHJpYnV0ZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoKSBpbnN0ZWFkLicgKTsKICAgIAlyZXR1cm4gbmV3IEZsb2F0MzJCdWZmZXJBdHRyaWJ1dGUoIGFycmF5LCBpdGVtU2l6ZSApOwoKICAgIH0KCiAgICBmdW5jdGlvbiBGbG9hdDY0QXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkZsb2F0NjRBdHRyaWJ1dGUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5GbG9hdDY0QnVmZmVyQXR0cmlidXRlKCkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG5ldyBGbG9hdDY0QnVmZmVyQXR0cmlidXRlKCBhcnJheSwgaXRlbVNpemUgKTsKCiAgICB9CgogICAgLy8KCiAgICBDdXJ2ZS5jcmVhdGUgPSBmdW5jdGlvbiAoIGNvbnN0cnVjdCwgZ2V0UG9pbnQgKSB7CgogICAgCWNvbnNvbGUubG9nKCAnVEhSRUUuQ3VydmUuY3JlYXRlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZCcgKTsKCiAgICAJY29uc3RydWN0LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIEN1cnZlLnByb3RvdHlwZSApOwogICAgCWNvbnN0cnVjdC5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3Q7CiAgICAJY29uc3RydWN0LnByb3RvdHlwZS5nZXRQb2ludCA9IGdldFBvaW50OwoKICAgIAlyZXR1cm4gY29uc3RydWN0OwoKICAgIH07CgogICAgLy8KCiAgICBPYmplY3QuYXNzaWduKCBDdXJ2ZVBhdGgucHJvdG90eXBlLCB7CgogICAgCWNyZWF0ZVBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApOwoKICAgIAkJLy8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBwYXRoIHBvaW50cyAoZm9yIExpbmUgb3IgUG9pbnRzIG9iamVjdHMpCgogICAgCQl2YXIgcHRzID0gdGhpcy5nZXRQb2ludHMoIGRpdmlzaW9ucyApOwogICAgCQlyZXR1cm4gdGhpcy5jcmVhdGVHZW9tZXRyeSggcHRzICk7CgogICAgCX0sCgogICAgCWNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5OiBmdW5jdGlvbiAoIGRpdmlzaW9ucyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlUGF0aDogLmNyZWF0ZVNwYWNlZFBvaW50c0dlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG5ldyBUSFJFRS5HZW9tZXRyeSgpLnNldEZyb21Qb2ludHMoIHBvaW50cyApIGluc3RlYWQuJyApOwoKICAgIAkJLy8gZ2VuZXJhdGUgZ2VvbWV0cnkgZnJvbSBlcXVpZGlzdGFudCBzYW1wbGluZyBhbG9uZyB0aGUgcGF0aAoKICAgIAkJdmFyIHB0cyA9IHRoaXMuZ2V0U3BhY2VkUG9pbnRzKCBkaXZpc2lvbnMgKTsKICAgIAkJcmV0dXJuIHRoaXMuY3JlYXRlR2VvbWV0cnkoIHB0cyApOwoKICAgIAl9LAoKICAgIAljcmVhdGVHZW9tZXRyeTogZnVuY3Rpb24gKCBwb2ludHMgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZVBhdGg6IC5jcmVhdGVHZW9tZXRyeSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBuZXcgVEhSRUUuR2VvbWV0cnkoKS5zZXRGcm9tUG9pbnRzKCBwb2ludHMgKSBpbnN0ZWFkLicgKTsKCiAgICAJCXZhciBnZW9tZXRyeSA9IG5ldyBHZW9tZXRyeSgpOwoKICAgIAkJZm9yICggdmFyIGkgPSAwLCBsID0gcG9pbnRzLmxlbmd0aDsgaSA8IGw7IGkgKysgKSB7CgogICAgCQkJdmFyIHBvaW50ID0gcG9pbnRzWyBpIF07CiAgICAJCQlnZW9tZXRyeS52ZXJ0aWNlcy5wdXNoKCBuZXcgVmVjdG9yMyggcG9pbnQueCwgcG9pbnQueSwgcG9pbnQueiB8fCAwICkgKTsKCiAgICAJCX0KCiAgICAJCXJldHVybiBnZW9tZXRyeTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvLwoKICAgIE9iamVjdC5hc3NpZ24oIFBhdGgkNC5wcm90b3R5cGUsIHsKCiAgICAJZnJvbVBvaW50czogZnVuY3Rpb24gKCBwb2ludHMgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5QYXRoOiAuZnJvbVBvaW50cygpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEZyb21Qb2ludHMoKS4nICk7CiAgICAJCXRoaXMuc2V0RnJvbVBvaW50cyggcG9pbnRzICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLy8KCiAgICBmdW5jdGlvbiBDbG9zZWRTcGxpbmVDdXJ2ZTMoIHBvaW50cyApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuQ2xvc2VkU3BsaW5lQ3VydmUzIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBUSFJFRS5DYXRtdWxsUm9tQ3VydmUzIGluc3RlYWQuJyApOwoKICAgIAlDYXRtdWxsUm9tQ3VydmUzLmNhbGwoIHRoaXMsIHBvaW50cyApOwogICAgCXRoaXMudHlwZSA9ICdjYXRtdWxscm9tJzsKICAgIAl0aGlzLmNsb3NlZCA9IHRydWU7CgogICAgfQoKICAgIENsb3NlZFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOwoKICAgIC8vCgogICAgZnVuY3Rpb24gU3BsaW5lQ3VydmUzKCBwb2ludHMgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZUN1cnZlMyBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKCiAgICAJQ2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTsKICAgIAl0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7CgogICAgfQoKICAgIFNwbGluZUN1cnZlMy5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOwoKICAgIC8vCgogICAgZnVuY3Rpb24gU3BsaW5lKCBwb2ludHMgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlNwbGluZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuQ2F0bXVsbFJvbUN1cnZlMyBpbnN0ZWFkLicgKTsKCiAgICAJQ2F0bXVsbFJvbUN1cnZlMy5jYWxsKCB0aGlzLCBwb2ludHMgKTsKICAgIAl0aGlzLnR5cGUgPSAnY2F0bXVsbHJvbSc7CgogICAgfQoKICAgIFNwbGluZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBDYXRtdWxsUm9tQ3VydmUzLnByb3RvdHlwZSApOwoKICAgIE9iamVjdC5hc3NpZ24oIFNwbGluZS5wcm90b3R5cGUsIHsKCiAgICAJaW5pdEZyb21BcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLlNwbGluZTogLmluaXRGcm9tQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfSwKICAgIAlnZXRDb250cm9sUG9pbnRzQXJyYXk6IGZ1bmN0aW9uICggLyogb3B0aW9uYWxUYXJnZXQgKi8gKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU3BsaW5lOiAuZ2V0Q29udHJvbFBvaW50c0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJcmVwYXJhbWV0cml6ZUJ5QXJjTGVuZ3RoOiBmdW5jdGlvbiAoIC8qIHNhbXBsaW5nQ29lZiAqLyApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5TcGxpbmU6IC5yZXBhcmFtZXRyaXplQnlBcmNMZW5ndGgoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICAvLwoKICAgIGZ1bmN0aW9uIEF4aXNIZWxwZXIoIHNpemUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkF4aXNIZWxwZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5BeGVzSGVscGVyLicgKTsKICAgIAlyZXR1cm4gbmV3IEF4ZXNIZWxwZXIoIHNpemUgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gQm91bmRpbmdCb3hIZWxwZXIoIG9iamVjdCwgY29sb3IgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkJvdW5kaW5nQm94SGVscGVyIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIENyZWF0aW5nIGEgVEhSRUUuQm94SGVscGVyIGluc3RlYWQuJyApOwogICAgCXJldHVybiBuZXcgQm94SGVscGVyKCBvYmplY3QsIGNvbG9yICk7CgogICAgfQoKICAgIGZ1bmN0aW9uIEVkZ2VzSGVscGVyKCBvYmplY3QsIGhleCApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuRWRnZXNIZWxwZXIgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkVkZ2VzR2VvbWV0cnkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBFZGdlc0dlb21ldHJ5KCBvYmplY3QuZ2VvbWV0cnkgKSwgbmV3IExpbmVCYXNpY01hdGVyaWFsKCB7IGNvbG9yOiBoZXggIT09IHVuZGVmaW5lZCA/IGhleCA6IDB4ZmZmZmZmIH0gKSApOwoKICAgIH0KCiAgICBHcmlkSGVscGVyLnByb3RvdHlwZS5zZXRDb2xvcnMgPSBmdW5jdGlvbiAoKSB7CgogICAgCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5HcmlkSGVscGVyOiBzZXRDb2xvcnMoKSBoYXMgYmVlbiBkZXByZWNhdGVkLCBwYXNzIHRoZW0gaW4gdGhlIGNvbnN0cnVjdG9yIGluc3RlYWQuJyApOwoKICAgIH07CgogICAgU2tlbGV0b25IZWxwZXIucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJY29uc29sZS5lcnJvciggJ1RIUkVFLlNrZWxldG9uSGVscGVyOiB1cGRhdGUoKSBubyBsb25nZXIgbmVlZHMgdG8gYmUgY2FsbGVkLicgKTsKCiAgICB9OwoKICAgIGZ1bmN0aW9uIFdpcmVmcmFtZUhlbHBlciggb2JqZWN0LCBoZXggKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLldpcmVmcmFtZUhlbHBlciBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuV2lyZWZyYW1lR2VvbWV0cnkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIG5ldyBMaW5lU2VnbWVudHMoIG5ldyBXaXJlZnJhbWVHZW9tZXRyeSggb2JqZWN0Lmdlb21ldHJ5ICksIG5ldyBMaW5lQmFzaWNNYXRlcmlhbCggeyBjb2xvcjogaGV4ICE9PSB1bmRlZmluZWQgPyBoZXggOiAweGZmZmZmZiB9ICkgKTsKCiAgICB9CgogICAgLy8KCiAgICBPYmplY3QuYXNzaWduKCBMb2FkZXIucHJvdG90eXBlLCB7CgogICAgCWV4dHJhY3RVcmxCYXNlOiBmdW5jdGlvbiAoIHVybCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxvYWRlcjogLmV4dHJhY3RVcmxCYXNlKCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLkxvYWRlclV0aWxzLmV4dHJhY3RVcmxCYXNlKCkgaW5zdGVhZC4nICk7CiAgICAJCXJldHVybiBMb2FkZXJVdGlscy5leHRyYWN0VXJsQmFzZSggdXJsICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgZnVuY3Rpb24gWEhSTG9hZGVyKCBtYW5hZ2VyICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5YSFJMb2FkZXIgaGFzIGJlZW4gcmVuYW1lZCB0byBUSFJFRS5GaWxlTG9hZGVyLicgKTsKICAgIAlyZXR1cm4gbmV3IEZpbGVMb2FkZXIoIG1hbmFnZXIgKTsKCiAgICB9CgogICAgZnVuY3Rpb24gQmluYXJ5VGV4dHVyZUxvYWRlciggbWFuYWdlciApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuQmluYXJ5VGV4dHVyZUxvYWRlciBoYXMgYmVlbiByZW5hbWVkIHRvIFRIUkVFLkRhdGFUZXh0dXJlTG9hZGVyLicgKTsKICAgIAlyZXR1cm4gbmV3IERhdGFUZXh0dXJlTG9hZGVyKCBtYW5hZ2VyICk7CgogICAgfQoKICAgIE9iamVjdC5hc3NpZ24oIE9iamVjdExvYWRlci5wcm90b3R5cGUsIHsKCiAgICAJc2V0VGV4dHVyZVBhdGg6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3RMb2FkZXI6IC5zZXRUZXh0dXJlUGF0aCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldFJlc291cmNlUGF0aCgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuc2V0UmVzb3VyY2VQYXRoKCB2YWx1ZSApOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgT2JqZWN0LmFzc2lnbiggQm94Mi5wcm90b3R5cGUsIHsKCiAgICAJY2VudGVyOiBmdW5jdGlvbiAoIG9wdGlvbmFsVGFyZ2V0ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmNlbnRlcigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldENlbnRlcigpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApOwoKICAgIAl9LAogICAgCWVtcHR5OiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gyOiAuZW1wdHkoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pc0VtcHR5KCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5pc0VtcHR5KCk7CgogICAgCX0sCiAgICAJaXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MjogLmlzSW50ZXJzZWN0aW9uQm94KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0JveCgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0JveCggYm94ICk7CgogICAgCX0sCiAgICAJc2l6ZTogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDI6IC5zaXplKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0U2l6ZSgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuZ2V0U2l6ZSggb3B0aW9uYWxUYXJnZXQgKTsKCiAgICAJfQogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIEJveDMucHJvdG90eXBlLCB7CgogICAgCWNlbnRlcjogZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmdldENlbnRlciggb3B0aW9uYWxUYXJnZXQgKTsKCiAgICAJfSwKICAgIAllbXB0eTogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuQm94MzogLmVtcHR5KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaXNFbXB0eSgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuaXNFbXB0eSgpOwoKICAgIAl9LAogICAgCWlzSW50ZXJzZWN0aW9uQm94OiBmdW5jdGlvbiAoIGJveCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvbkJveCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNCb3goKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmludGVyc2VjdHNCb3goIGJveCApOwoKICAgIAl9LAogICAgCWlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJveDM6IC5pc0ludGVyc2VjdGlvblNwaGVyZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNTcGhlcmUoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmludGVyc2VjdHNTcGhlcmUoIHNwaGVyZSApOwoKICAgIAl9LAogICAgCXNpemU6IGZ1bmN0aW9uICggb3B0aW9uYWxUYXJnZXQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5Cb3gzOiAuc2l6ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFNpemUoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmdldFNpemUoIG9wdGlvbmFsVGFyZ2V0ICk7CgogICAgCX0KICAgIH0gKTsKCiAgICBMaW5lMy5wcm90b3R5cGUuY2VudGVyID0gZnVuY3Rpb24gKCBvcHRpb25hbFRhcmdldCApIHsKCiAgICAJY29uc29sZS53YXJuKCAnVEhSRUUuTGluZTM6IC5jZW50ZXIoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRDZW50ZXIoKS4nICk7CiAgICAJcmV0dXJuIHRoaXMuZ2V0Q2VudGVyKCBvcHRpb25hbFRhcmdldCApOwoKICAgIH07CgogICAgT2JqZWN0LmFzc2lnbiggX01hdGgsIHsKCiAgICAJcmFuZG9tMTY6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGg6IC5yYW5kb20xNigpIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIFVzZSBNYXRoLnJhbmRvbSgpIGluc3RlYWQuJyApOwogICAgCQlyZXR1cm4gTWF0aC5yYW5kb20oKTsKCiAgICAJfSwKCiAgICAJbmVhcmVzdFBvd2VyT2ZUd286IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRoOiAubmVhcmVzdFBvd2VyT2ZUd28oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mbG9vclBvd2VyT2ZUd28oKS4nICk7CiAgICAJCXJldHVybiBfTWF0aC5mbG9vclBvd2VyT2ZUd28oIHZhbHVlICk7CgogICAgCX0sCgogICAgCW5leHRQb3dlck9mVHdvOiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0aDogLm5leHRQb3dlck9mVHdvKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuY2VpbFBvd2VyT2ZUd28oKS4nICk7CiAgICAJCXJldHVybiBfTWF0aC5jZWlsUG93ZXJPZlR3byggdmFsdWUgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBNYXRyaXgzLnByb3RvdHlwZSwgewoKICAgIAlmbGF0dGVuVG9BcnJheU9mZnNldDogZnVuY3Rpb24gKCBhcnJheSwgb2Zmc2V0ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAiVEhSRUUuTWF0cml4MzogLmZsYXR0ZW5Ub0FycmF5T2Zmc2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC50b0FycmF5KCkgaW5zdGVhZC4iICk7CiAgICAJCXJldHVybiB0aGlzLnRvQXJyYXkoIGFycmF5LCBvZmZzZXQgKTsKCiAgICAJfSwKICAgIAltdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4MzogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXgzKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDMoIHRoaXMgKTsKCiAgICAJfSwKICAgIAltdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDM6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCWFwcGx5VG9CdWZmZXI6IGZ1bmN0aW9uICggYnVmZmVyIC8qLCBvZmZzZXQsIGxlbmd0aCAqLyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDM6IC5hcHBseVRvQnVmZmVyKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIG1hdHJpeC5hcHBseVRvQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUgKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYnVmZmVyICk7CgogICAgCX0sCiAgICAJYXBwbHlUb1ZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhcnJheSwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4MzogLmFwcGx5VG9WZWN0b3IzQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBNYXRyaXg0LnByb3RvdHlwZSwgewoKICAgIAlleHRyYWN0UG9zaXRpb246IGZ1bmN0aW9uICggbSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5leHRyYWN0UG9zaXRpb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5jb3B5UG9zaXRpb24oKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmNvcHlQb3NpdGlvbiggbSApOwoKICAgIAl9LAogICAgCWZsYXR0ZW5Ub0FycmF5T2Zmc2V0OiBmdW5jdGlvbiAoIGFycmF5LCBvZmZzZXQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICJUSFJFRS5NYXRyaXg0OiAuZmxhdHRlblRvQXJyYXlPZmZzZXQoKSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgLnRvQXJyYXkoKSBpbnN0ZWFkLiIgKTsKICAgIAkJcmV0dXJuIHRoaXMudG9BcnJheSggYXJyYXksIG9mZnNldCApOwoKICAgIAl9LAogICAgCWdldFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuZ2V0UG9zaXRpb24oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVmVjdG9yMy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG1hdHJpeCApIGluc3RlYWQuJyApOwogICAgCQlyZXR1cm4gbmV3IFZlY3RvcjMoKS5zZXRGcm9tTWF0cml4Q29sdW1uKCB0aGlzLCAzICk7CgogICAgCX0sCiAgICAJc2V0Um90YXRpb25Gcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCBxICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLnNldFJvdGF0aW9uRnJvbVF1YXRlcm5pb24oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYWtlUm90YXRpb25Gcm9tUXVhdGVybmlvbigpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMubWFrZVJvdGF0aW9uRnJvbVF1YXRlcm5pb24oIHEgKTsKCiAgICAJfSwKICAgIAltdWx0aXBseVRvQXJyYXk6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVRvQXJyYXkoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfSwKICAgIAltdWx0aXBseVZlY3RvcjM6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yMygpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTsKCiAgICAJfSwKICAgIAltdWx0aXBseVZlY3RvcjQ6IGZ1bmN0aW9uICggdmVjdG9yICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0cml4NDogLm11bHRpcGx5VmVjdG9yNCgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB2ZWN0b3IuYXBwbHlNYXRyaXg0KCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIHZlY3Rvci5hcHBseU1hdHJpeDQoIHRoaXMgKTsKCiAgICAJfSwKICAgIAltdWx0aXBseVZlY3RvcjNBcnJheTogZnVuY3Rpb24gKCAvKiBhICovICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5tdWx0aXBseVZlY3RvcjNBcnJheSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXJvdGF0ZUF4aXM6IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVBeGlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFZlY3RvcjMudHJhbnNmb3JtRGlyZWN0aW9uKCBtYXRyaXggKSBpbnN0ZWFkLicgKTsKICAgIAkJdi50cmFuc2Zvcm1EaXJlY3Rpb24oIHRoaXMgKTsKCiAgICAJfSwKICAgIAljcm9zc1ZlY3RvcjogZnVuY3Rpb24gKCB2ZWN0b3IgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuY3Jvc3NWZWN0b3IoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgdmVjdG9yLmFwcGx5TWF0cml4NCggbWF0cml4ICkgaW5zdGVhZC4nICk7CiAgICAJCXJldHVybiB2ZWN0b3IuYXBwbHlNYXRyaXg0KCB0aGlzICk7CgogICAgCX0sCiAgICAJdHJhbnNsYXRlOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuTWF0cml4NDogLnRyYW5zbGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXJvdGF0ZVg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXJvdGF0ZVk6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXJvdGF0ZVo6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5NYXRyaXg0OiAucm90YXRlWigpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXJvdGF0ZUJ5QXhpczogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5yb3RhdGVCeUF4aXMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfSwKICAgIAlhcHBseVRvQnVmZmVyOiBmdW5jdGlvbiAoIGJ1ZmZlciAvKiwgb2Zmc2V0LCBsZW5ndGggKi8gKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAuYXBwbHlUb0J1ZmZlcigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBtYXRyaXguYXBwbHlUb0J1ZmZlckF0dHJpYnV0ZSggYXR0cmlidXRlICkgaW5zdGVhZC4nICk7CiAgICAJCXJldHVybiB0aGlzLmFwcGx5VG9CdWZmZXJBdHRyaWJ1dGUoIGJ1ZmZlciApOwoKICAgIAl9LAogICAgCWFwcGx5VG9WZWN0b3IzQXJyYXk6IGZ1bmN0aW9uICggLyogYXJyYXksIG9mZnNldCwgbGVuZ3RoICovICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLk1hdHJpeDQ6IC5hcHBseVRvVmVjdG9yM0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJbWFrZUZydXN0dW06IGZ1bmN0aW9uICggbGVmdCwgcmlnaHQsIGJvdHRvbSwgdG9wLCBuZWFyLCBmYXIgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRyaXg0OiAubWFrZUZydXN0dW0oKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLm1ha2VQZXJzcGVjdGl2ZSggbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCBuZWFyLCBmYXIgKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIHRoaXMubWFrZVBlcnNwZWN0aXZlKCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIG5lYXIsIGZhciApOwoKICAgIAl9CgogICAgfSApOwoKICAgIFBsYW5lLnByb3RvdHlwZS5pc0ludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoIGxpbmUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLlBsYW5lOiAuaXNJbnRlcnNlY3Rpb25MaW5lKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c0xpbmUoKS4nICk7CiAgICAJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c0xpbmUoIGxpbmUgKTsKCiAgICB9OwoKICAgIFF1YXRlcm5pb24ucHJvdG90eXBlLm11bHRpcGx5VmVjdG9yMyA9IGZ1bmN0aW9uICggdmVjdG9yICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5RdWF0ZXJuaW9uOiAubXVsdGlwbHlWZWN0b3IzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGlzIG5vdyB2ZWN0b3IuYXBwbHlRdWF0ZXJuaW9uKCBxdWF0ZXJuaW9uICkgaW5zdGVhZC4nICk7CiAgICAJcmV0dXJuIHZlY3Rvci5hcHBseVF1YXRlcm5pb24oIHRoaXMgKTsKCiAgICB9OwoKICAgIE9iamVjdC5hc3NpZ24oIFJheS5wcm90b3R5cGUsIHsKCiAgICAJaXNJbnRlcnNlY3Rpb25Cb3g6IGZ1bmN0aW9uICggYm94ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25Cb3goKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5pbnRlcnNlY3RzQm94KCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5pbnRlcnNlY3RzQm94KCBib3ggKTsKCiAgICAJfSwKICAgIAlpc0ludGVyc2VjdGlvblBsYW5lOiBmdW5jdGlvbiAoIHBsYW5lICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuUmF5OiAuaXNJbnRlcnNlY3Rpb25QbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmludGVyc2VjdHNQbGFuZSgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1BsYW5lKCBwbGFuZSApOwoKICAgIAl9LAogICAgCWlzSW50ZXJzZWN0aW9uU3BoZXJlOiBmdW5jdGlvbiAoIHNwaGVyZSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlJheTogLmlzSW50ZXJzZWN0aW9uU3BoZXJlKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuaW50ZXJzZWN0c1NwaGVyZSgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuaW50ZXJzZWN0c1NwaGVyZSggc3BoZXJlICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUucHJvdG90eXBlLCB7CgogICAgCWFyZWE6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYXJlYSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEFyZWEoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmdldEFyZWEoKTsKCiAgICAJfSwKICAgIAliYXJ5Y29vcmRGcm9tUG9pbnQ6IGZ1bmN0aW9uICggcG9pbnQsIHRhcmdldCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlRyaWFuZ2xlOiAuYmFyeWNvb3JkRnJvbVBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0QmFyeWNvb3JkKCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5nZXRCYXJ5Y29vcmQoIHBvaW50LCB0YXJnZXQgKTsKCiAgICAJfSwKICAgIAltaWRwb2ludDogZnVuY3Rpb24gKCB0YXJnZXQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm1pZHBvaW50KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ2V0TWlkcG9pbnQoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmdldE1pZHBvaW50KCB0YXJnZXQgKTsKCiAgICAJfSwKICAgIAlub3JtYWw6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5ub3JtYWwoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXROb3JtYWwoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmdldE5vcm1hbCggdGFyZ2V0ICk7CgogICAgCX0sCiAgICAJcGxhbmU6IGZ1bmN0aW9uICggdGFyZ2V0ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVHJpYW5nbGU6IC5wbGFuZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldFBsYW5lKCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5nZXRQbGFuZSggdGFyZ2V0ICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggVHJpYW5nbGUsIHsKCiAgICAJYmFyeWNvb3JkRnJvbVBvaW50OiBmdW5jdGlvbiAoIHBvaW50LCBhLCBiLCBjLCB0YXJnZXQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLmJhcnljb29yZEZyb21Qb2ludCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldEJhcnljb29yZCgpLicgKTsKICAgIAkJcmV0dXJuIFRyaWFuZ2xlLmdldEJhcnljb29yZCggcG9pbnQsIGEsIGIsIGMsIHRhcmdldCApOwoKICAgIAl9LAogICAgCW5vcm1hbDogZnVuY3Rpb24gKCBhLCBiLCBjLCB0YXJnZXQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5UcmlhbmdsZTogLm5vcm1hbCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdldE5vcm1hbCgpLicgKTsKICAgIAkJcmV0dXJuIFRyaWFuZ2xlLmdldE5vcm1hbCggYSwgYiwgYywgdGFyZ2V0ICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggU2hhcGUucHJvdG90eXBlLCB7CgogICAgCWV4dHJhY3RBbGxQb2ludHM6IGZ1bmN0aW9uICggZGl2aXNpb25zICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuU2hhcGU6IC5leHRyYWN0QWxsUG9pbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC5leHRyYWN0UG9pbnRzKCkgaW5zdGVhZC4nICk7CiAgICAJCXJldHVybiB0aGlzLmV4dHJhY3RQb2ludHMoIGRpdmlzaW9ucyApOwoKICAgIAl9LAogICAgCWV4dHJ1ZGU6IGZ1bmN0aW9uICggb3B0aW9ucyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAuZXh0cnVkZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBFeHRydWRlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIG5ldyBFeHRydWRlR2VvbWV0cnkoIHRoaXMsIG9wdGlvbnMgKTsKCiAgICAJfSwKICAgIAltYWtlR2VvbWV0cnk6IGZ1bmN0aW9uICggb3B0aW9ucyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlNoYXBlOiAubWFrZUdlb21ldHJ5KCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFNoYXBlR2VvbWV0cnkoKSBpbnN0ZWFkLicgKTsKICAgIAkJcmV0dXJuIG5ldyBTaGFwZUdlb21ldHJ5KCB0aGlzLCBvcHRpb25zICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggVmVjdG9yMi5wcm90b3R5cGUsIHsKCiAgICAJZnJvbUF0dHJpYnV0ZTogZnVuY3Rpb24gKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IyOiAuZnJvbUF0dHJpYnV0ZSgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmZyb21CdWZmZXJBdHRyaWJ1dGUoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmZyb21CdWZmZXJBdHRyaWJ1dGUoIGF0dHJpYnV0ZSwgaW5kZXgsIG9mZnNldCApOwoKICAgIAl9LAogICAgCWRpc3RhbmNlVG9NYW5oYXR0YW46IGZ1bmN0aW9uICggdiApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjI6IC5kaXN0YW5jZVRvTWFuaGF0dGFuKCkgaGFzIGJlZW4gcmVuYW1lZCB0byAubWFuaGF0dGFuRGlzdGFuY2VUbygpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMubWFuaGF0dGFuRGlzdGFuY2VUbyggdiApOwoKICAgIAl9LAogICAgCWxlbmd0aE1hbmhhdHRhbjogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMjogLmxlbmd0aE1hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkxlbmd0aCgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMubWFuaGF0dGFuTGVuZ3RoKCk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggVmVjdG9yMy5wcm90b3R5cGUsIHsKCiAgICAJc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXg6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5WZWN0b3IzOiAuc2V0RXVsZXJGcm9tUm90YXRpb25NYXRyaXgoKSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgRXVsZXIuc2V0RnJvbVJvdGF0aW9uTWF0cml4KCkgaW5zdGVhZC4nICk7CgogICAgCX0sCiAgICAJc2V0RXVsZXJGcm9tUXVhdGVybmlvbjogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLlZlY3RvcjM6IC5zZXRFdWxlckZyb21RdWF0ZXJuaW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIEV1bGVyLnNldEZyb21RdWF0ZXJuaW9uKCkgaW5zdGVhZC4nICk7CgogICAgCX0sCiAgICAJZ2V0UG9zaXRpb25Gcm9tTWF0cml4OiBmdW5jdGlvbiAoIG0gKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZ2V0UG9zaXRpb25Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeFBvc2l0aW9uKCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5zZXRGcm9tTWF0cml4UG9zaXRpb24oIG0gKTsKCiAgICAJfSwKICAgIAlnZXRTY2FsZUZyb21NYXRyaXg6IGZ1bmN0aW9uICggbSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRTY2FsZUZyb21NYXRyaXgoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5zZXRGcm9tTWF0cml4U2NhbGUoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLnNldEZyb21NYXRyaXhTY2FsZSggbSApOwoKICAgIAl9LAogICAgCWdldENvbHVtbkZyb21NYXRyaXg6IGZ1bmN0aW9uICggaW5kZXgsIG1hdHJpeCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5nZXRDb2x1bW5Gcm9tTWF0cml4KCkgaGFzIGJlZW4gcmVuYW1lZCB0byAuc2V0RnJvbU1hdHJpeENvbHVtbigpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuc2V0RnJvbU1hdHJpeENvbHVtbiggbWF0cml4LCBpbmRleCApOwoKICAgIAl9LAogICAgCWFwcGx5UHJvamVjdGlvbjogZnVuY3Rpb24gKCBtICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmFwcGx5UHJvamVjdGlvbigpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAuYXBwbHlNYXRyaXg0KCBtICkgaW5zdGVhZC4nICk7CiAgICAJCXJldHVybiB0aGlzLmFwcGx5TWF0cml4NCggbSApOwoKICAgIAl9LAogICAgCWZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yMzogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKCiAgICAJfSwKICAgIAlkaXN0YW5jZVRvTWFuaGF0dGFuOiBmdW5jdGlvbiAoIHYgKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5WZWN0b3IzOiAuZGlzdGFuY2VUb01hbmhhdHRhbigpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLm1hbmhhdHRhbkRpc3RhbmNlVG8oKS4nICk7CiAgICAJCXJldHVybiB0aGlzLm1hbmhhdHRhbkRpc3RhbmNlVG8oIHYgKTsKCiAgICAJfSwKICAgIAlsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjM6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpOwoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5hc3NpZ24oIFZlY3RvcjQucHJvdG90eXBlLCB7CgogICAgCWZyb21BdHRyaWJ1dGU6IGZ1bmN0aW9uICggYXR0cmlidXRlLCBpbmRleCwgb2Zmc2V0ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuVmVjdG9yNDogLmZyb21BdHRyaWJ1dGUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5mcm9tQnVmZmVyQXR0cmlidXRlKCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5mcm9tQnVmZmVyQXR0cmlidXRlKCBhdHRyaWJ1dGUsIGluZGV4LCBvZmZzZXQgKTsKCiAgICAJfSwKICAgIAlsZW5ndGhNYW5oYXR0YW46IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLlZlY3RvcjQ6IC5sZW5ndGhNYW5oYXR0YW4oKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5tYW5oYXR0YW5MZW5ndGgoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLm1hbmhhdHRhbkxlbmd0aCgpOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgT2JqZWN0LmFzc2lnbiggR2VvbWV0cnkucHJvdG90eXBlLCB7CgogICAgCWNvbXB1dGVUYW5nZW50czogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLkdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJY29tcHV0ZUxpbmVEaXN0YW5jZXM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5HZW9tZXRyeTogLmNvbXB1dGVMaW5lRGlzdGFuY2VzKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkxpbmUuY29tcHV0ZUxpbmVEaXN0YW5jZXMoKSBpbnN0ZWFkLicgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuYXNzaWduKCBPYmplY3QzRC5wcm90b3R5cGUsIHsKCiAgICAJZ2V0Q2hpbGRCeU5hbWU6IGZ1bmN0aW9uICggbmFtZSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZ2V0Q2hpbGRCeU5hbWUoKSBoYXMgYmVlbiByZW5hbWVkIHRvIC5nZXRPYmplY3RCeU5hbWUoKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmdldE9iamVjdEJ5TmFtZSggbmFtZSApOwoKICAgIAl9LAogICAgCXJlbmRlckRlcHRoOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5PYmplY3QzRDogLnJlbmRlckRlcHRoIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSAucmVuZGVyT3JkZXIsIGluc3RlYWQuJyApOwoKICAgIAl9LAogICAgCXRyYW5zbGF0ZTogZnVuY3Rpb24gKCBkaXN0YW5jZSwgYXhpcyApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAudHJhbnNsYXRlKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIC50cmFuc2xhdGVPbkF4aXMoIGF4aXMsIGRpc3RhbmNlICkgaW5zdGVhZC4nICk7CiAgICAJCXJldHVybiB0aGlzLnRyYW5zbGF0ZU9uQXhpcyggYXhpcywgZGlzdGFuY2UgKTsKCiAgICAJfSwKICAgIAlnZXRXb3JsZFJvdGF0aW9uOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuT2JqZWN0M0Q6IC5nZXRXb3JsZFJvdGF0aW9uKCkgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLk9iamVjdDNELmdldFdvcmxkUXVhdGVybmlvbiggdGFyZ2V0ICkgaW5zdGVhZC4nICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIE9iamVjdDNELnByb3RvdHlwZSwgewoKICAgIAlldWxlck9yZGVyOiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTsKICAgIAkJCXJldHVybiB0aGlzLnJvdGF0aW9uLm9yZGVyOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk9iamVjdDNEOiAuZXVsZXJPcmRlciBpcyBub3cgLnJvdGF0aW9uLm9yZGVyLicgKTsKICAgIAkJCXRoaXMucm90YXRpb24ub3JkZXIgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCXVzZVF1YXRlcm5pb246IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuT2JqZWN0M0Q6IC51c2VRdWF0ZXJuaW9uIGhhcyBiZWVuIHJlbW92ZWQuIFRoZSBsaWJyYXJ5IG5vdyB1c2VzIHF1YXRlcm5pb25zIGJ5IGRlZmF1bHQuJyApOwoKICAgIAkJfQogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExPRC5wcm90b3R5cGUsIHsKCiAgICAJb2JqZWN0czogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5MT0Q6IC5vYmplY3RzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmxldmVscy4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy5sZXZlbHM7CgogICAgCQl9CiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoIFNrZWxldG9uLnByb3RvdHlwZSwgJ3VzZVZlcnRleFRleHR1cmUnLCB7CgogICAgCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuU2tlbGV0b246IHVzZVZlcnRleFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5Ta2VsZXRvbjogdXNlVmVydGV4VGV4dHVyZSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBTa2lubmVkTWVzaC5wcm90b3R5cGUuaW5pdEJvbmVzID0gZnVuY3Rpb24gKCkgewoKICAgIAljb25zb2xlLmVycm9yKCAnVEhSRUUuU2tpbm5lZE1lc2g6IGluaXRCb25lcygpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIH07CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KCBDdXJ2ZS5wcm90b3R5cGUsICdfX2FyY0xlbmd0aERpdmlzaW9ucycsIHsKCiAgICAJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5DdXJ2ZTogLl9fYXJjTGVuZ3RoRGl2aXNpb25zIGlzIG5vdyAuYXJjTGVuZ3RoRGl2aXNpb25zLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuYXJjTGVuZ3RoRGl2aXNpb25zOwoKICAgIAl9LAogICAgCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkN1cnZlOiAuX19hcmNMZW5ndGhEaXZpc2lvbnMgaXMgbm93IC5hcmNMZW5ndGhEaXZpc2lvbnMuJyApOwogICAgCQl0aGlzLmFyY0xlbmd0aERpdmlzaW9ucyA9IHZhbHVlOwoKICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgUGVyc3BlY3RpdmVDYW1lcmEucHJvdG90eXBlLnNldExlbnMgPSBmdW5jdGlvbiAoIGZvY2FsTGVuZ3RoLCBmaWxtR2F1Z2UgKSB7CgogICAgCWNvbnNvbGUud2FybiggIlRIUkVFLlBlcnNwZWN0aXZlQ2FtZXJhLnNldExlbnMgaXMgZGVwcmVjYXRlZC4gIiArCiAgICAJCQkiVXNlIC5zZXRGb2NhbExlbmd0aCBhbmQgLmZpbG1HYXVnZSBmb3IgYSBwaG90b2dyYXBoaWMgc2V0dXAuIiApOwoKICAgIAlpZiAoIGZpbG1HYXVnZSAhPT0gdW5kZWZpbmVkICkgdGhpcy5maWxtR2F1Z2UgPSBmaWxtR2F1Z2U7CiAgICAJdGhpcy5zZXRGb2NhbExlbmd0aCggZm9jYWxMZW5ndGggKTsKCiAgICB9OwoKICAgIC8vCgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIExpZ2h0LnByb3RvdHlwZSwgewogICAgCW9ubHlTaGFkb3c6IHsKICAgIAkJc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5vbmx5U2hhZG93IGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93Q2FtZXJhRm92OiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYUZvdiBpcyBub3cgLnNoYWRvdy5jYW1lcmEuZm92LicgKTsKICAgIAkJCXRoaXMuc2hhZG93LmNhbWVyYS5mb3YgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCXNoYWRvd0NhbWVyYUxlZnQ6IHsKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhTGVmdCBpcyBub3cgLnNoYWRvdy5jYW1lcmEubGVmdC4nICk7CiAgICAJCQl0aGlzLnNoYWRvdy5jYW1lcmEubGVmdCA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93Q2FtZXJhUmlnaHQ6IHsKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhUmlnaHQgaXMgbm93IC5zaGFkb3cuY2FtZXJhLnJpZ2h0LicgKTsKICAgIAkJCXRoaXMuc2hhZG93LmNhbWVyYS5yaWdodCA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93Q2FtZXJhVG9wOiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYVRvcCBpcyBub3cgLnNoYWRvdy5jYW1lcmEudG9wLicgKTsKICAgIAkJCXRoaXMuc2hhZG93LmNhbWVyYS50b3AgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCXNoYWRvd0NhbWVyYUJvdHRvbTogewogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFCb3R0b20gaXMgbm93IC5zaGFkb3cuY2FtZXJhLmJvdHRvbS4nICk7CiAgICAJCQl0aGlzLnNoYWRvdy5jYW1lcmEuYm90dG9tID0gdmFsdWU7CgogICAgCQl9CiAgICAJfSwKICAgIAlzaGFkb3dDYW1lcmFOZWFyOiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd0NhbWVyYU5lYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLm5lYXIuJyApOwogICAgCQkJdGhpcy5zaGFkb3cuY2FtZXJhLm5lYXIgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCXNoYWRvd0NhbWVyYUZhcjogewogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dDYW1lcmFGYXIgaXMgbm93IC5zaGFkb3cuY2FtZXJhLmZhci4nICk7CiAgICAJCQl0aGlzLnNoYWRvdy5jYW1lcmEuZmFyID0gdmFsdWU7CgogICAgCQl9CiAgICAJfSwKICAgIAlzaGFkb3dDYW1lcmFWaXNpYmxlOiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLkxpZ2h0OiAuc2hhZG93Q2FtZXJhVmlzaWJsZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgbmV3IFRIUkVFLkNhbWVyYUhlbHBlciggbGlnaHQuc2hhZG93LmNhbWVyYSApIGluc3RlYWQuJyApOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93QmlhczogewogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dCaWFzIGlzIG5vdyAuc2hhZG93LmJpYXMuJyApOwogICAgCQkJdGhpcy5zaGFkb3cuYmlhcyA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93RGFya25lc3M6IHsKICAgIAkJc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTGlnaHQ6IC5zaGFkb3dEYXJrbmVzcyBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJCX0KICAgIAl9LAogICAgCXNoYWRvd01hcFdpZHRoOiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcFdpZHRoIGlzIG5vdyAuc2hhZG93Lm1hcFNpemUud2lkdGguJyApOwogICAgCQkJdGhpcy5zaGFkb3cubWFwU2l6ZS53aWR0aCA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93TWFwSGVpZ2h0OiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5MaWdodDogLnNoYWRvd01hcEhlaWdodCBpcyBub3cgLnNoYWRvdy5tYXBTaXplLmhlaWdodC4nICk7CiAgICAJCQl0aGlzLnNoYWRvdy5tYXBTaXplLmhlaWdodCA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0KICAgIH0gKTsKCiAgICAvLwoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBCdWZmZXJBdHRyaWJ1dGUucHJvdG90eXBlLCB7CgogICAgCWxlbmd0aDogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5sZW5ndGggaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5jb3VudCBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzLmFycmF5Lmxlbmd0aDsKCiAgICAJCX0KICAgIAl9LAogICAgCWNvcHlJbmRpY2VzQXJyYXk6IGZ1bmN0aW9uICggLyogaW5kaWNlcyAqLyApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5CdWZmZXJBdHRyaWJ1dGU6IC5jb3B5SW5kaWNlc0FycmF5KCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmFzc2lnbiggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7CgogICAgCWFkZEluZGV4OiBmdW5jdGlvbiAoIGluZGV4ICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGRJbmRleCgpIGhhcyBiZWVuIHJlbmFtZWQgdG8gLnNldEluZGV4KCkuJyApOwogICAgCQl0aGlzLnNldEluZGV4KCBpbmRleCApOwoKICAgIAl9LAogICAgCWFkZERyYXdDYWxsOiBmdW5jdGlvbiAoIHN0YXJ0LCBjb3VudCwgaW5kZXhPZmZzZXQgKSB7CgogICAgCQlpZiAoIGluZGV4T2Zmc2V0ICE9PSB1bmRlZmluZWQgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5hZGREcmF3Q2FsbCgpIG5vIGxvbmdlciBzdXBwb3J0cyBpbmRleE9mZnNldC4nICk7CgogICAgCQl9CiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuYWRkRHJhd0NhbGwoKSBpcyBub3cgLmFkZEdyb3VwKCkuJyApOwogICAgCQl0aGlzLmFkZEdyb3VwKCBzdGFydCwgY291bnQgKTsKCiAgICAJfSwKICAgIAljbGVhckRyYXdDYWxsczogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5jbGVhckRyYXdDYWxscygpIGlzIG5vdyAuY2xlYXJHcm91cHMoKS4nICk7CiAgICAJCXRoaXMuY2xlYXJHcm91cHMoKTsKCiAgICAJfSwKICAgIAljb21wdXRlVGFuZ2VudHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZVRhbmdlbnRzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJY29tcHV0ZU9mZnNldHM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkJ1ZmZlckdlb21ldHJ5OiAuY29tcHV0ZU9mZnNldHMoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfQoKICAgIH0gKTsKCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggQnVmZmVyR2VvbWV0cnkucHJvdG90eXBlLCB7CgogICAgCWRyYXdjYWxsczogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5kcmF3Y2FsbHMgaGFzIGJlZW4gcmVuYW1lZCB0byAuZ3JvdXBzLicgKTsKICAgIAkJCXJldHVybiB0aGlzLmdyb3VwczsKCiAgICAJCX0KICAgIAl9LAogICAgCW9mZnNldHM6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuQnVmZmVyR2VvbWV0cnk6IC5vZmZzZXRzIGhhcyBiZWVuIHJlbmFtZWQgdG8gLmdyb3Vwcy4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy5ncm91cHM7CgogICAgCQl9CiAgICAJfQoKICAgIH0gKTsKCiAgICAvLwoKICAgIE9iamVjdC5hc3NpZ24oIEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeS5wcm90b3R5cGUsIHsKCiAgICAJZ2V0QXJyYXlzOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuRXh0cnVkZUJ1ZmZlckdlb21ldHJ5OiAuZ2V0QXJyYXlzKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCgogICAgCWFkZFNoYXBlTGlzdDogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlTGlzdCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAoKICAgIAlhZGRTaGFwZTogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLkV4dHJ1ZGVCdWZmZXJHZW9tZXRyeTogLmFkZFNoYXBlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0KCiAgICB9ICk7CgogICAgLy8KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggVW5pZm9ybS5wcm90b3R5cGUsIHsKCiAgICAJZHluYW1pYzogewogICAgCQlzZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5Vbmlmb3JtOiAuZHluYW1pYyBoYXMgYmVlbiByZW1vdmVkLiBVc2Ugb2JqZWN0Lm9uQmVmb3JlUmVuZGVyKCkgaW5zdGVhZC4nICk7CgogICAgCQl9CiAgICAJfSwKICAgIAlvblVwZGF0ZTogewogICAgCQl2YWx1ZTogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLlVuaWZvcm06IC5vblVwZGF0ZSgpIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBvYmplY3Qub25CZWZvcmVSZW5kZXIoKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzOwoKICAgIAkJfQogICAgCX0KCiAgICB9ICk7CgogICAgLy8KCiAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyggTWF0ZXJpYWwucHJvdG90eXBlLCB7CgogICAgCXdyYXBBcm91bmQ6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwQXJvdW5kIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAkJfQogICAgCX0sCgogICAgCW92ZXJkcmF3OiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLk1hdGVyaWFsOiAub3ZlcmRyYXcgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5NYXRlcmlhbDogLm92ZXJkcmF3IGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAkJfQogICAgCX0sCgogICAgCXdyYXBSR0I6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWF0ZXJpYWw6IC53cmFwUkdCIGhhcyBiZWVuIHJlbW92ZWQuJyApOwogICAgCQkJcmV0dXJuIG5ldyBDb2xvciQ3KCk7CgogICAgCQl9CiAgICAJfSwKCiAgICAJc2hhZGluZzogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLmVycm9yKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuJyArIHRoaXMudHlwZSArICc6IC5zaGFkaW5nIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSB0aGUgYm9vbGVhbiAuZmxhdFNoYWRpbmcgaW5zdGVhZC4nICk7CiAgICAJCQl0aGlzLmZsYXRTaGFkaW5nID0gKCB2YWx1ZSA9PT0gRmxhdFNoYWRpbmcgKTsKCiAgICAJCX0KICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBNZXNoUGhvbmdNYXRlcmlhbC5wcm90b3R5cGUsIHsKCiAgICAJbWV0YWw6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuTWVzaFBob25nTWF0ZXJpYWw6IC5tZXRhbCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuTWVzaFN0YW5kYXJkTWF0ZXJpYWwgaW5zdGVhZC4nICk7CiAgICAJCQlyZXR1cm4gZmFsc2U7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5NZXNoUGhvbmdNYXRlcmlhbDogLm1ldGFsIGhhcyBiZWVuIHJlbW92ZWQuIFVzZSBUSFJFRS5NZXNoU3RhbmRhcmRNYXRlcmlhbCBpbnN0ZWFkJyApOwoKICAgIAkJfQogICAgCX0KCiAgICB9ICk7CgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFNoYWRlck1hdGVyaWFsLnByb3RvdHlwZSwgewoKICAgIAlkZXJpdmF0aXZlczogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5TaGFkZXJNYXRlcmlhbDogLmRlcml2YXRpdmVzIGhhcyBiZWVuIG1vdmVkIHRvIC5leHRlbnNpb25zLmRlcml2YXRpdmVzLicgKTsKICAgIAkJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXM7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuIFNoYWRlck1hdGVyaWFsOiAuZGVyaXZhdGl2ZXMgaGFzIGJlZW4gbW92ZWQgdG8gLmV4dGVuc2lvbnMuZGVyaXZhdGl2ZXMuJyApOwogICAgCQkJdGhpcy5leHRlbnNpb25zLmRlcml2YXRpdmVzID0gdmFsdWU7CgogICAgCQl9CiAgICAJfQoKICAgIH0gKTsKCiAgICAvLwoKICAgIE9iamVjdC5hc3NpZ24oIFdlYkdMUmVuZGVyZXIucHJvdG90eXBlLCB7CgogICAgCWNsZWFyVGFyZ2V0OiBmdW5jdGlvbiAoIHJlbmRlclRhcmdldCwgY29sb3IsIGRlcHRoLCBzdGVuY2lsICkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmNsZWFyVGFyZ2V0KCkgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIC5zZXRSZW5kZXJUYXJnZXQoKSBhbmQgLmNsZWFyKCkgaW5zdGVhZC4nICk7CiAgICAJCXRoaXMuc2V0UmVuZGVyVGFyZ2V0KCByZW5kZXJUYXJnZXQgKTsKICAgIAkJdGhpcy5jbGVhciggY29sb3IsIGRlcHRoLCBzdGVuY2lsICk7CgogICAgCX0sCiAgICAJYW5pbWF0ZTogZnVuY3Rpb24gKCBjYWxsYmFjayApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hbmltYXRlKCkgaXMgbm93IC5zZXRBbmltYXRpb25Mb29wKCkuJyApOwogICAgCQl0aGlzLnNldEFuaW1hdGlvbkxvb3AoIGNhbGxiYWNrICk7CgogICAgCX0sCiAgICAJZ2V0Q3VycmVudFJlbmRlclRhcmdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldEN1cnJlbnRSZW5kZXJUYXJnZXQoKSBpcyBub3cgLmdldFJlbmRlclRhcmdldCgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuZ2V0UmVuZGVyVGFyZ2V0KCk7CgogICAgCX0sCiAgICAJZ2V0TWF4QW5pc290cm9weTogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldE1heEFuaXNvdHJvcHkoKSBpcyBub3cgLmNhcGFiaWxpdGllcy5nZXRNYXhBbmlzb3Ryb3B5KCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMuZ2V0TWF4QW5pc290cm9weSgpOwoKICAgIAl9LAogICAgCWdldFByZWNpc2lvbjogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLmdldFByZWNpc2lvbigpIGlzIG5vdyAuY2FwYWJpbGl0aWVzLnByZWNpc2lvbi4nICk7CiAgICAJCXJldHVybiB0aGlzLmNhcGFiaWxpdGllcy5wcmVjaXNpb247CgogICAgCX0sCiAgICAJcmVzZXRHTFN0YXRlOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAucmVzZXRHTFN0YXRlKCkgaXMgbm93IC5zdGF0ZS5yZXNldCgpLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuc3RhdGUucmVzZXQoKTsKCiAgICAJfSwKICAgIAlzdXBwb3J0c0Zsb2F0VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0Zsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ09FU190ZXh0dXJlX2Zsb2F0XCcgKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3RleHR1cmVfZmxvYXQnICk7CgogICAgCX0sCiAgICAJc3VwcG9ydHNIYWxmRmxvYXRUZXh0dXJlczogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzSGFsZkZsb2F0VGV4dHVyZXMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ09FU190ZXh0dXJlX2hhbGZfZmxvYXRcJyApLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdPRVNfdGV4dHVyZV9oYWxmX2Zsb2F0JyApOwoKICAgIAl9LAogICAgCXN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlczogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzU3RhbmRhcmREZXJpdmF0aXZlcygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzXCcgKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnT0VTX3N0YW5kYXJkX2Rlcml2YXRpdmVzJyApOwoKICAgIAl9LAogICAgCXN1cHBvcnRzQ29tcHJlc3NlZFRleHR1cmVTM1RDOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVMzVEMoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ1dFQkdMX2NvbXByZXNzZWRfdGV4dHVyZV9zM3RjXCcgKS4nICk7CiAgICAJCXJldHVybiB0aGlzLmV4dGVuc2lvbnMuZ2V0KCAnV0VCR0xfY29tcHJlc3NlZF90ZXh0dXJlX3MzdGMnICk7CgogICAgCX0sCiAgICAJc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc3VwcG9ydHNDb21wcmVzc2VkVGV4dHVyZVBWUlRDKCkgaXMgbm93IC5leHRlbnNpb25zLmdldCggXCdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGNcJyApLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdXRUJHTF9jb21wcmVzc2VkX3RleHR1cmVfcHZydGMnICk7CgogICAgCX0sCiAgICAJc3VwcG9ydHNCbGVuZE1pbk1heDogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnN1cHBvcnRzQmxlbmRNaW5NYXgoKSBpcyBub3cgLmV4dGVuc2lvbnMuZ2V0KCBcJ0VYVF9ibGVuZF9taW5tYXhcJyApLicgKTsKICAgIAkJcmV0dXJuIHRoaXMuZXh0ZW5zaW9ucy5nZXQoICdFWFRfYmxlbmRfbWlubWF4JyApOwoKICAgIAl9LAogICAgCXN1cHBvcnRzVmVydGV4VGV4dHVyZXM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c1ZlcnRleFRleHR1cmVzKCkgaXMgbm93IC5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXMuJyApOwogICAgCQlyZXR1cm4gdGhpcy5jYXBhYmlsaXRpZXMudmVydGV4VGV4dHVyZXM7CgogICAgCX0sCiAgICAJc3VwcG9ydHNJbnN0YW5jZWRBcnJheXM6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zdXBwb3J0c0luc3RhbmNlZEFycmF5cygpIGlzIG5vdyAuZXh0ZW5zaW9ucy5nZXQoIFwnQU5HTEVfaW5zdGFuY2VkX2FycmF5c1wnICkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5leHRlbnNpb25zLmdldCggJ0FOR0xFX2luc3RhbmNlZF9hcnJheXMnICk7CgogICAgCX0sCiAgICAJZW5hYmxlU2Npc3NvclRlc3Q6IGZ1bmN0aW9uICggYm9vbGVhbiApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5lbmFibGVTY2lzc29yVGVzdCgpIGlzIG5vdyAuc2V0U2Npc3NvclRlc3QoKS4nICk7CiAgICAJCXRoaXMuc2V0U2Npc3NvclRlc3QoIGJvb2xlYW4gKTsKCiAgICAJfSwKICAgIAlpbml0TWF0ZXJpYWw6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5pbml0TWF0ZXJpYWwoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfSwKICAgIAlhZGRQcmVQbHVnaW46IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5hZGRQcmVQbHVnaW4oKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfSwKICAgIAlhZGRQb3N0UGx1Z2luOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWRkUG9zdFBsdWdpbigpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXVwZGF0ZVNoYWRvd01hcDogZnVuY3Rpb24gKCkgewoKICAgIAkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnVwZGF0ZVNoYWRvd01hcCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXNldEZhY2VDdWxsaW5nOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0RmFjZUN1bGxpbmcoKSBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJfSwKICAgIAlhbGxvY1RleHR1cmVVbml0OiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuYWxsb2NUZXh0dXJlVW5pdCgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCXNldFRleHR1cmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJc2V0VGV4dHVyZTJEOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2V0VGV4dHVyZTJEKCkgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgCX0sCiAgICAJc2V0VGV4dHVyZUN1YmU6IGZ1bmN0aW9uICgpIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zZXRUZXh0dXJlQ3ViZSgpIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAl9LAogICAgCWdldEFjdGl2ZU1pcE1hcExldmVsOiBmdW5jdGlvbiAoKSB7CgogICAgCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuZ2V0QWN0aXZlTWlwTWFwTGV2ZWwoKSBpcyBub3cgLmdldEFjdGl2ZU1pcG1hcExldmVsKCkuJyApOwogICAgCQlyZXR1cm4gdGhpcy5nZXRBY3RpdmVNaXBtYXBMZXZlbCgpOwoKICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFJlbmRlcmVyLnByb3RvdHlwZSwgewoKICAgIAlzaGFkb3dNYXBFbmFibGVkOiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCXJldHVybiB0aGlzLnNoYWRvd01hcC5lbmFibGVkOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBFbmFibGVkIGlzIG5vdyAuc2hhZG93TWFwLmVuYWJsZWQuJyApOwogICAgCQkJdGhpcy5zaGFkb3dNYXAuZW5hYmxlZCA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJc2hhZG93TWFwVHlwZTogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQlyZXR1cm4gdGhpcy5zaGFkb3dNYXAudHlwZTsKCiAgICAJCX0sCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwVHlwZSBpcyBub3cgLnNoYWRvd01hcC50eXBlLicgKTsKICAgIAkJCXRoaXMuc2hhZG93TWFwLnR5cGUgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCXNoYWRvd01hcEN1bGxGYWNlOiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXBDdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB1bmRlZmluZWQ7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcEN1bGxGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIFNldCBNYXRlcmlhbC5zaGFkb3dTaWRlIGluc3RlYWQuJyApOwoKICAgIAkJfQogICAgCX0sCiAgICAJY29udGV4dDogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuY29udGV4dCBoYXMgYmVlbiByZW1vdmVkLiBVc2UgLmdldENvbnRleHQoKSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB0aGlzLmdldENvbnRleHQoKTsKCiAgICAJCX0KICAgIAl9CgogICAgfSApOwoKICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKCBXZWJHTFNoYWRvd01hcC5wcm90b3R5cGUsIHsKCiAgICAJY3VsbEZhY2U6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB1bmRlZmluZWQ7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggLyogY3VsbEZhY2UgKi8gKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5jdWxsRmFjZSBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTsKCiAgICAJCX0KICAgIAl9LAogICAgCXJlbmRlclJldmVyc2VTaWRlZDogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTsKICAgIAkJCXJldHVybiB1bmRlZmluZWQ7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlcmVyOiAuc2hhZG93TWFwLnJlbmRlclJldmVyc2VTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTsKCiAgICAJCX0KICAgIAl9LAogICAgCXJlbmRlclNpbmdsZVNpZGVkOiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyZXI6IC5zaGFkb3dNYXAucmVuZGVyU2luZ2xlU2lkZWQgaGFzIGJlZW4gcmVtb3ZlZC4gU2V0IE1hdGVyaWFsLnNoYWRvd1NpZGUgaW5zdGVhZC4nICk7CiAgICAJCQlyZXR1cm4gdW5kZWZpbmVkOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJlcjogLnNoYWRvd01hcC5yZW5kZXJTaW5nbGVTaWRlZCBoYXMgYmVlbiByZW1vdmVkLiBTZXQgTWF0ZXJpYWwuc2hhZG93U2lkZSBpbnN0ZWFkLicgKTsKCiAgICAJCX0KICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZS5wcm90b3R5cGUsIHsKCiAgICAJYWN0aXZlQ3ViZUZhY2U6IHsKICAgIAkJc2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0Q3ViZTogLmFjdGl2ZUN1YmVGYWNlIGhhcyBiZWVuIHJlbW92ZWQuIEl0IGlzIG5vdyB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLicgKTsKCiAgICAJCX0KICAgIAl9LAogICAgCWFjdGl2ZU1pcE1hcExldmVsOiB7CiAgICAJCXNldDogZnVuY3Rpb24gKCAvKiB2YWx1ZSAqLyApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldEN1YmU6IC5hY3RpdmVNaXBNYXBMZXZlbCBoYXMgYmVlbiByZW1vdmVkLiBJdCBpcyBub3cgdGhlIHRoaXJkIHBhcmFtZXRlciBvZiBXZWJHTFJlbmRlcmVyLnNldFJlbmRlclRhcmdldCgpLicgKTsKCiAgICAJCX0KICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYkdMUmVuZGVyVGFyZ2V0LnByb3RvdHlwZSwgewoKICAgIAl3cmFwUzogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBTIGlzIG5vdyAudGV4dHVyZS53cmFwUy4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLndyYXBTOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAud3JhcFMgaXMgbm93IC50ZXh0dXJlLndyYXBTLicgKTsKICAgIAkJCXRoaXMudGV4dHVyZS53cmFwUyA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJd3JhcFQ6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC53cmFwVCBpcyBub3cgLnRleHR1cmUud3JhcFQuJyApOwogICAgCQkJcmV0dXJuIHRoaXMudGV4dHVyZS53cmFwVDsKCiAgICAJCX0sCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLndyYXBUIGlzIG5vdyAudGV4dHVyZS53cmFwVC4nICk7CiAgICAJCQl0aGlzLnRleHR1cmUud3JhcFQgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCW1hZ0ZpbHRlcjogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm1hZ0ZpbHRlciBpcyBub3cgLnRleHR1cmUubWFnRmlsdGVyLicgKTsKICAgIAkJCXJldHVybiB0aGlzLnRleHR1cmUubWFnRmlsdGVyOwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWFnRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5tYWdGaWx0ZXIuJyApOwogICAgCQkJdGhpcy50ZXh0dXJlLm1hZ0ZpbHRlciA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJbWluRmlsdGVyOiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAubWluRmlsdGVyIGlzIG5vdyAudGV4dHVyZS5taW5GaWx0ZXIuJyApOwogICAgCQkJcmV0dXJuIHRoaXMudGV4dHVyZS5taW5GaWx0ZXI7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5taW5GaWx0ZXIgaXMgbm93IC50ZXh0dXJlLm1pbkZpbHRlci4nICk7CiAgICAJCQl0aGlzLnRleHR1cmUubWluRmlsdGVyID0gdmFsdWU7CgogICAgCQl9CiAgICAJfSwKICAgIAlhbmlzb3Ryb3B5OiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuYW5pc290cm9weSBpcyBub3cgLnRleHR1cmUuYW5pc290cm9weS4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLmFuaXNvdHJvcHk7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5hbmlzb3Ryb3B5IGlzIG5vdyAudGV4dHVyZS5hbmlzb3Ryb3B5LicgKTsKICAgIAkJCXRoaXMudGV4dHVyZS5hbmlzb3Ryb3B5ID0gdmFsdWU7CgogICAgCQl9CiAgICAJfSwKICAgIAlvZmZzZXQ6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5vZmZzZXQgaXMgbm93IC50ZXh0dXJlLm9mZnNldC4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLm9mZnNldDsKCiAgICAJCX0sCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLm9mZnNldCBpcyBub3cgLnRleHR1cmUub2Zmc2V0LicgKTsKICAgIAkJCXRoaXMudGV4dHVyZS5vZmZzZXQgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9LAogICAgCXJlcGVhdDogewogICAgCQlnZXQ6IGZ1bmN0aW9uICgpIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLnJlcGVhdCBpcyBub3cgLnRleHR1cmUucmVwZWF0LicgKTsKICAgIAkJCXJldHVybiB0aGlzLnRleHR1cmUucmVwZWF0OwoKICAgIAkJfSwKICAgIAkJc2V0OiBmdW5jdGlvbiAoIHZhbHVlICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAucmVwZWF0IGlzIG5vdyAudGV4dHVyZS5yZXBlYXQuJyApOwogICAgCQkJdGhpcy50ZXh0dXJlLnJlcGVhdCA9IHZhbHVlOwoKICAgIAkJfQogICAgCX0sCiAgICAJZm9ybWF0OiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAuZm9ybWF0IGlzIG5vdyAudGV4dHVyZS5mb3JtYXQuJyApOwogICAgCQkJcmV0dXJuIHRoaXMudGV4dHVyZS5mb3JtYXQ7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5mb3JtYXQgaXMgbm93IC50ZXh0dXJlLmZvcm1hdC4nICk7CiAgICAJCQl0aGlzLnRleHR1cmUuZm9ybWF0ID0gdmFsdWU7CgogICAgCQl9CiAgICAJfSwKICAgIAl0eXBlOiB7CiAgICAJCWdldDogZnVuY3Rpb24gKCkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYkdMUmVuZGVyVGFyZ2V0OiAudHlwZSBpcyBub3cgLnRleHR1cmUudHlwZS4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLnR5cGU7CgogICAgCQl9LAogICAgCQlzZXQ6IGZ1bmN0aW9uICggdmFsdWUgKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC50eXBlIGlzIG5vdyAudGV4dHVyZS50eXBlLicgKTsKICAgIAkJCXRoaXMudGV4dHVyZS50eXBlID0gdmFsdWU7CgogICAgCQl9CiAgICAJfSwKICAgIAlnZW5lcmF0ZU1pcG1hcHM6IHsKICAgIAkJZ2V0OiBmdW5jdGlvbiAoKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViR0xSZW5kZXJUYXJnZXQ6IC5nZW5lcmF0ZU1pcG1hcHMgaXMgbm93IC50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwcy4nICk7CiAgICAJCQlyZXR1cm4gdGhpcy50ZXh0dXJlLmdlbmVyYXRlTWlwbWFwczsKCiAgICAJCX0sCiAgICAJCXNldDogZnVuY3Rpb24gKCB2YWx1ZSApIHsKCiAgICAJCQljb25zb2xlLndhcm4oICdUSFJFRS5XZWJHTFJlbmRlclRhcmdldDogLmdlbmVyYXRlTWlwbWFwcyBpcyBub3cgLnRleHR1cmUuZ2VuZXJhdGVNaXBtYXBzLicgKTsKICAgIAkJCXRoaXMudGV4dHVyZS5nZW5lcmF0ZU1pcG1hcHMgPSB2YWx1ZTsKCiAgICAJCX0KICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoIFdlYlZSTWFuYWdlci5wcm90b3R5cGUsIHsKCiAgICAJc3RhbmRpbmc6IHsKICAgIAkJc2V0OiBmdW5jdGlvbiAoIC8qIHZhbHVlICovICkgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1RIUkVFLldlYlZSTWFuYWdlcjogLnN0YW5kaW5nIGhhcyBiZWVuIHJlbW92ZWQuJyApOwoKICAgIAkJfQogICAgCX0sCiAgICAJdXNlckhlaWdodDogewogICAgCQlzZXQ6IGZ1bmN0aW9uICggLyogdmFsdWUgKi8gKSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnVEhSRUUuV2ViVlJNYW5hZ2VyOiAudXNlckhlaWdodCBoYXMgYmVlbiByZW1vdmVkLicgKTsKCiAgICAJCX0KICAgIAl9CgogICAgfSApOwoKICAgIC8vCgogICAgQXVkaW8ucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbiAoIGZpbGUgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvOiAubG9hZCBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQXVkaW9Mb2FkZXIgaW5zdGVhZC4nICk7CiAgICAJdmFyIHNjb3BlID0gdGhpczsKICAgIAl2YXIgYXVkaW9Mb2FkZXIgPSBuZXcgQXVkaW9Mb2FkZXIoKTsKICAgIAlhdWRpb0xvYWRlci5sb2FkKCBmaWxlLCBmdW5jdGlvbiAoIGJ1ZmZlciApIHsKCiAgICAJCXNjb3BlLnNldEJ1ZmZlciggYnVmZmVyICk7CgogICAgCX0gKTsKICAgIAlyZXR1cm4gdGhpczsKCiAgICB9OwoKICAgIEF1ZGlvQW5hbHlzZXIucHJvdG90eXBlLmdldERhdGEgPSBmdW5jdGlvbiAoKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkF1ZGlvQW5hbHlzZXI6IC5nZXREYXRhKCkgaXMgbm93IC5nZXRGcmVxdWVuY3lEYXRhKCkuJyApOwogICAgCXJldHVybiB0aGlzLmdldEZyZXF1ZW5jeURhdGEoKTsKCiAgICB9OwoKICAgIC8vCgogICAgQ3ViZUNhbWVyYS5wcm90b3R5cGUudXBkYXRlQ3ViZU1hcCA9IGZ1bmN0aW9uICggcmVuZGVyZXIsIHNjZW5lICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5DdWJlQ2FtZXJhOiAudXBkYXRlQ3ViZU1hcCgpIGlzIG5vdyAudXBkYXRlKCkuJyApOwogICAgCXJldHVybiB0aGlzLnVwZGF0ZSggcmVuZGVyZXIsIHNjZW5lICk7CgogICAgfTsKCiAgICAvLwoKICAgIHZhciBHZW9tZXRyeVV0aWxzID0gewoKICAgIAltZXJnZTogZnVuY3Rpb24gKCBnZW9tZXRyeTEsIGdlb21ldHJ5MiwgbWF0ZXJpYWxJbmRleE9mZnNldCApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5tZXJnZSgpIGhhcyBiZWVuIG1vdmVkIHRvIEdlb21ldHJ5LiBVc2UgZ2VvbWV0cnkubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICkgaW5zdGVhZC4nICk7CiAgICAJCXZhciBtYXRyaXg7CgogICAgCQlpZiAoIGdlb21ldHJ5Mi5pc01lc2ggKSB7CgogICAgCQkJZ2VvbWV0cnkyLm1hdHJpeEF1dG9VcGRhdGUgJiYgZ2VvbWV0cnkyLnVwZGF0ZU1hdHJpeCgpOwoKICAgIAkJCW1hdHJpeCA9IGdlb21ldHJ5Mi5tYXRyaXg7CiAgICAJCQlnZW9tZXRyeTIgPSBnZW9tZXRyeTIuZ2VvbWV0cnk7CgogICAgCQl9CgogICAgCQlnZW9tZXRyeTEubWVyZ2UoIGdlb21ldHJ5MiwgbWF0cml4LCBtYXRlcmlhbEluZGV4T2Zmc2V0ICk7CgogICAgCX0sCgogICAgCWNlbnRlcjogZnVuY3Rpb24gKCBnZW9tZXRyeSApIHsKCiAgICAJCWNvbnNvbGUud2FybiggJ1RIUkVFLkdlb21ldHJ5VXRpbHM6IC5jZW50ZXIoKSBoYXMgYmVlbiBtb3ZlZCB0byBHZW9tZXRyeS4gVXNlIGdlb21ldHJ5LmNlbnRlcigpIGluc3RlYWQuJyApOwogICAgCQlyZXR1cm4gZ2VvbWV0cnkuY2VudGVyKCk7CgogICAgCX0KCiAgICB9OwoKICAgIEltYWdlVXRpbHMuY3Jvc3NPcmlnaW4gPSB1bmRlZmluZWQ7CgogICAgSW1hZ2VVdGlscy5sb2FkVGV4dHVyZSA9IGZ1bmN0aW9uICggdXJsLCBtYXBwaW5nLCBvbkxvYWQsIG9uRXJyb3IgKSB7CgogICAgCWNvbnNvbGUud2FybiggJ1RIUkVFLkltYWdlVXRpbHMubG9hZFRleHR1cmUgaGFzIGJlZW4gZGVwcmVjYXRlZC4gVXNlIFRIUkVFLlRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTsKCiAgICAJdmFyIGxvYWRlciA9IG5ldyBUZXh0dXJlTG9hZGVyKCk7CiAgICAJbG9hZGVyLnNldENyb3NzT3JpZ2luKCB0aGlzLmNyb3NzT3JpZ2luICk7CgogICAgCXZhciB0ZXh0dXJlID0gbG9hZGVyLmxvYWQoIHVybCwgb25Mb2FkLCB1bmRlZmluZWQsIG9uRXJyb3IgKTsKCiAgICAJaWYgKCBtYXBwaW5nICkgdGV4dHVyZS5tYXBwaW5nID0gbWFwcGluZzsKCiAgICAJcmV0dXJuIHRleHR1cmU7CgogICAgfTsKCiAgICBJbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSA9IGZ1bmN0aW9uICggdXJscywgbWFwcGluZywgb25Mb2FkLCBvbkVycm9yICkgewoKICAgIAljb25zb2xlLndhcm4oICdUSFJFRS5JbWFnZVV0aWxzLmxvYWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiBkZXByZWNhdGVkLiBVc2UgVEhSRUUuQ3ViZVRleHR1cmVMb2FkZXIoKSBpbnN0ZWFkLicgKTsKCiAgICAJdmFyIGxvYWRlciA9IG5ldyBDdWJlVGV4dHVyZUxvYWRlcigpOwogICAgCWxvYWRlci5zZXRDcm9zc09yaWdpbiggdGhpcy5jcm9zc09yaWdpbiApOwoKICAgIAl2YXIgdGV4dHVyZSA9IGxvYWRlci5sb2FkKCB1cmxzLCBvbkxvYWQsIHVuZGVmaW5lZCwgb25FcnJvciApOwoKICAgIAlpZiAoIG1hcHBpbmcgKSB0ZXh0dXJlLm1hcHBpbmcgPSBtYXBwaW5nOwoKICAgIAlyZXR1cm4gdGV4dHVyZTsKCiAgICB9OwoKICAgIEltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlID0gZnVuY3Rpb24gKCkgewoKICAgIAljb25zb2xlLmVycm9yKCAnVEhSRUUuSW1hZ2VVdGlscy5sb2FkQ29tcHJlc3NlZFRleHR1cmUgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIFRIUkVFLkREU0xvYWRlciBpbnN0ZWFkLicgKTsKCiAgICB9OwoKICAgIEltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJY29uc29sZS5lcnJvciggJ1RIUkVFLkltYWdlVXRpbHMubG9hZENvbXByZXNzZWRUZXh0dXJlQ3ViZSBoYXMgYmVlbiByZW1vdmVkLiBVc2UgVEhSRUUuRERTTG9hZGVyIGluc3RlYWQuJyApOwoKICAgIH07CgogICAgLy8KCiAgICBmdW5jdGlvbiBDYW52YXNSZW5kZXJlcigpIHsKCiAgICAJY29uc29sZS5lcnJvciggJ1RIUkVFLkNhbnZhc1JlbmRlcmVyIGhhcyBiZWVuIHJlbW92ZWQnICk7CgogICAgfQoKICAgIC8vCgogICAgZnVuY3Rpb24gSlNPTkxvYWRlcigpIHsKCiAgICAJY29uc29sZS5lcnJvciggJ1RIUkVFLkpTT05Mb2FkZXIgaGFzIGJlZW4gcmVtb3ZlZC4nICk7CgogICAgfQoKICAgIC8vCgogICAgdmFyIFNjZW5lVXRpbHMgPSB7CgogICAgCWNyZWF0ZU11bHRpTWF0ZXJpYWxPYmplY3Q6IGZ1bmN0aW9uICggLyogZ2VvbWV0cnksIG1hdGVyaWFscyAqLyApIHsKCiAgICAJCWNvbnNvbGUuZXJyb3IoICdUSFJFRS5TY2VuZVV0aWxzIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy91dGlscy9TY2VuZVV0aWxzLmpzJyApOwoKICAgIAl9LAoKICAgIAlkZXRhY2g6IGZ1bmN0aW9uICggLyogY2hpbGQsIHBhcmVudCwgc2NlbmUgKi8gKSB7CgogICAgCQljb25zb2xlLmVycm9yKCAnVEhSRUUuU2NlbmVVdGlscyBoYXMgYmVlbiBtb3ZlZCB0byAvZXhhbXBsZXMvanMvdXRpbHMvU2NlbmVVdGlscy5qcycgKTsKCiAgICAJfSwKCiAgICAJYXR0YWNoOiBmdW5jdGlvbiAoIC8qIGNoaWxkLCBzY2VuZSwgcGFyZW50ICovICkgewoKICAgIAkJY29uc29sZS5lcnJvciggJ1RIUkVFLlNjZW5lVXRpbHMgaGFzIGJlZW4gbW92ZWQgdG8gL2V4YW1wbGVzL2pzL3V0aWxzL1NjZW5lVXRpbHMuanMnICk7CgogICAgCX0KCiAgICB9OwoKICAgIC8vCgogICAgZnVuY3Rpb24gTGVuc0ZsYXJlKCkgewoKICAgIAljb25zb2xlLmVycm9yKCAnVEhSRUUuTGVuc0ZsYXJlIGhhcyBiZWVuIG1vdmVkIHRvIC9leGFtcGxlcy9qcy9vYmplY3RzL0xlbnNmbGFyZS5qcycgKTsKCiAgICB9CgogICAgdmFyIFRIUkVFJDEgPSAvKiNfX1BVUkVfXyovT2JqZWN0LmZyZWV6ZSh7CiAgICAgICAgX19wcm90b19fOiBudWxsLAogICAgICAgIEFDRVNGaWxtaWNUb25lTWFwcGluZzogQUNFU0ZpbG1pY1RvbmVNYXBwaW5nLAogICAgICAgIEFkZEVxdWF0aW9uOiBBZGRFcXVhdGlvbiwKICAgICAgICBBZGRPcGVyYXRpb246IEFkZE9wZXJhdGlvbiwKICAgICAgICBBZGRpdGl2ZUJsZW5kaW5nOiBBZGRpdGl2ZUJsZW5kaW5nLAogICAgICAgIEFscGhhRm9ybWF0OiBBbHBoYUZvcm1hdCwKICAgICAgICBBbHdheXNEZXB0aDogQWx3YXlzRGVwdGgsCiAgICAgICAgQWx3YXlzU3RlbmNpbEZ1bmM6IEFsd2F5c1N0ZW5jaWxGdW5jLAogICAgICAgIEFtYmllbnRMaWdodDogQW1iaWVudExpZ2h0LAogICAgICAgIEFtYmllbnRMaWdodFByb2JlOiBBbWJpZW50TGlnaHRQcm9iZSwKICAgICAgICBBbmltYXRpb25DbGlwOiBBbmltYXRpb25DbGlwLAogICAgICAgIEFuaW1hdGlvbkxvYWRlcjogQW5pbWF0aW9uTG9hZGVyLAogICAgICAgIEFuaW1hdGlvbk1peGVyOiBBbmltYXRpb25NaXhlciwKICAgICAgICBBbmltYXRpb25PYmplY3RHcm91cDogQW5pbWF0aW9uT2JqZWN0R3JvdXAsCiAgICAgICAgQW5pbWF0aW9uVXRpbHM6IEFuaW1hdGlvblV0aWxzLAogICAgICAgIEFyY0N1cnZlOiBBcmNDdXJ2ZSwKICAgICAgICBBcnJheUNhbWVyYTogQXJyYXlDYW1lcmEsCiAgICAgICAgQXJyb3dIZWxwZXI6IEFycm93SGVscGVyLAogICAgICAgIEF1ZGlvOiBBdWRpbywKICAgICAgICBBdWRpb0FuYWx5c2VyOiBBdWRpb0FuYWx5c2VyLAogICAgICAgIEF1ZGlvQ29udGV4dDogQXVkaW9Db250ZXh0LAogICAgICAgIEF1ZGlvTGlzdGVuZXI6IEF1ZGlvTGlzdGVuZXIsCiAgICAgICAgQXVkaW9Mb2FkZXI6IEF1ZGlvTG9hZGVyLAogICAgICAgIEF4ZXNIZWxwZXI6IEF4ZXNIZWxwZXIsCiAgICAgICAgQXhpc0hlbHBlcjogQXhpc0hlbHBlciwKICAgICAgICBCYWNrU2lkZTogQmFja1NpZGUsCiAgICAgICAgQmFzaWNEZXB0aFBhY2tpbmc6IEJhc2ljRGVwdGhQYWNraW5nLAogICAgICAgIEJhc2ljU2hhZG93TWFwOiBCYXNpY1NoYWRvd01hcCwKICAgICAgICBCaW5hcnlUZXh0dXJlTG9hZGVyOiBCaW5hcnlUZXh0dXJlTG9hZGVyLAogICAgICAgIEJvbmU6IEJvbmUsCiAgICAgICAgQm9vbGVhbktleWZyYW1lVHJhY2s6IEJvb2xlYW5LZXlmcmFtZVRyYWNrLAogICAgICAgIEJvdW5kaW5nQm94SGVscGVyOiBCb3VuZGluZ0JveEhlbHBlciwKICAgICAgICBCb3gyOiBCb3gyLAogICAgICAgIEJveDM6IEJveDMsCiAgICAgICAgQm94M0hlbHBlcjogQm94M0hlbHBlciwKICAgICAgICBCb3hCdWZmZXJHZW9tZXRyeTogQm94QnVmZmVyR2VvbWV0cnksCiAgICAgICAgQm94R2VvbWV0cnk6IEJveEdlb21ldHJ5LAogICAgICAgIEJveEhlbHBlcjogQm94SGVscGVyLAogICAgICAgIEJ1ZmZlckF0dHJpYnV0ZTogQnVmZmVyQXR0cmlidXRlLAogICAgICAgIEJ1ZmZlckdlb21ldHJ5OiBCdWZmZXJHZW9tZXRyeSwKICAgICAgICBCdWZmZXJHZW9tZXRyeUxvYWRlcjogQnVmZmVyR2VvbWV0cnlMb2FkZXIsCiAgICAgICAgQnl0ZVR5cGU6IEJ5dGVUeXBlLAogICAgICAgIENhY2hlOiBDYWNoZSwKICAgICAgICBDYW1lcmE6IENhbWVyYSwKICAgICAgICBDYW1lcmFIZWxwZXI6IENhbWVyYUhlbHBlciwKICAgICAgICBDYW52YXNSZW5kZXJlcjogQ2FudmFzUmVuZGVyZXIsCiAgICAgICAgQ2FudmFzVGV4dHVyZTogQ2FudmFzVGV4dHVyZSwKICAgICAgICBDYXRtdWxsUm9tQ3VydmUzOiBDYXRtdWxsUm9tQ3VydmUzLAogICAgICAgIENpbmVvblRvbmVNYXBwaW5nOiBDaW5lb25Ub25lTWFwcGluZywKICAgICAgICBDaXJjbGVCdWZmZXJHZW9tZXRyeTogQ2lyY2xlQnVmZmVyR2VvbWV0cnksCiAgICAgICAgQ2lyY2xlR2VvbWV0cnk6IENpcmNsZUdlb21ldHJ5LAogICAgICAgIENsYW1wVG9FZGdlV3JhcHBpbmc6IENsYW1wVG9FZGdlV3JhcHBpbmcsCiAgICAgICAgQ2xvY2s6IENsb2NrLAogICAgICAgIENsb3NlZFNwbGluZUN1cnZlMzogQ2xvc2VkU3BsaW5lQ3VydmUzLAogICAgICAgIENvbG9yOiBDb2xvciQ3LAogICAgICAgIENvbG9yS2V5ZnJhbWVUcmFjazogQ29sb3JLZXlmcmFtZVRyYWNrLAogICAgICAgIENvbXByZXNzZWRUZXh0dXJlOiBDb21wcmVzc2VkVGV4dHVyZSwKICAgICAgICBDb21wcmVzc2VkVGV4dHVyZUxvYWRlcjogQ29tcHJlc3NlZFRleHR1cmVMb2FkZXIsCiAgICAgICAgQ29uZUJ1ZmZlckdlb21ldHJ5OiBDb25lQnVmZmVyR2VvbWV0cnksCiAgICAgICAgQ29uZUdlb21ldHJ5OiBDb25lR2VvbWV0cnksCiAgICAgICAgQ3ViZUNhbWVyYTogQ3ViZUNhbWVyYSwKICAgICAgICBDdWJlR2VvbWV0cnk6IEJveEdlb21ldHJ5LAogICAgICAgIEN1YmVSZWZsZWN0aW9uTWFwcGluZzogQ3ViZVJlZmxlY3Rpb25NYXBwaW5nLAogICAgICAgIEN1YmVSZWZyYWN0aW9uTWFwcGluZzogQ3ViZVJlZnJhY3Rpb25NYXBwaW5nLAogICAgICAgIEN1YmVUZXh0dXJlOiBDdWJlVGV4dHVyZSwKICAgICAgICBDdWJlVGV4dHVyZUxvYWRlcjogQ3ViZVRleHR1cmVMb2FkZXIsCiAgICAgICAgQ3ViZVVWUmVmbGVjdGlvbk1hcHBpbmc6IEN1YmVVVlJlZmxlY3Rpb25NYXBwaW5nLAogICAgICAgIEN1YmVVVlJlZnJhY3Rpb25NYXBwaW5nOiBDdWJlVVZSZWZyYWN0aW9uTWFwcGluZywKICAgICAgICBDdWJpY0JlemllckN1cnZlOiBDdWJpY0JlemllckN1cnZlLAogICAgICAgIEN1YmljQmV6aWVyQ3VydmUzOiBDdWJpY0JlemllckN1cnZlMywKICAgICAgICBDdWJpY0ludGVycG9sYW50OiBDdWJpY0ludGVycG9sYW50LAogICAgICAgIEN1bGxGYWNlQmFjazogQ3VsbEZhY2VCYWNrLAogICAgICAgIEN1bGxGYWNlRnJvbnQ6IEN1bGxGYWNlRnJvbnQsCiAgICAgICAgQ3VsbEZhY2VGcm9udEJhY2s6IEN1bGxGYWNlRnJvbnRCYWNrLAogICAgICAgIEN1bGxGYWNlTm9uZTogQ3VsbEZhY2VOb25lLAogICAgICAgIEN1cnZlOiBDdXJ2ZSwKICAgICAgICBDdXJ2ZVBhdGg6IEN1cnZlUGF0aCwKICAgICAgICBDdXN0b21CbGVuZGluZzogQ3VzdG9tQmxlbmRpbmcsCiAgICAgICAgQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeTogQ3lsaW5kZXJCdWZmZXJHZW9tZXRyeSwKICAgICAgICBDeWxpbmRlckdlb21ldHJ5OiBDeWxpbmRlckdlb21ldHJ5LAogICAgICAgIEN5bGluZHJpY2FsOiBDeWxpbmRyaWNhbCwKICAgICAgICBEYXRhVGV4dHVyZTogRGF0YVRleHR1cmUsCiAgICAgICAgRGF0YVRleHR1cmUyREFycmF5OiBEYXRhVGV4dHVyZTJEQXJyYXksCiAgICAgICAgRGF0YVRleHR1cmUzRDogRGF0YVRleHR1cmUzRCwKICAgICAgICBEYXRhVGV4dHVyZUxvYWRlcjogRGF0YVRleHR1cmVMb2FkZXIsCiAgICAgICAgRGVjcmVtZW50U3RlbmNpbE9wOiBEZWNyZW1lbnRTdGVuY2lsT3AsCiAgICAgICAgRGVjcmVtZW50V3JhcFN0ZW5jaWxPcDogRGVjcmVtZW50V3JhcFN0ZW5jaWxPcCwKICAgICAgICBEZWZhdWx0TG9hZGluZ01hbmFnZXI6IERlZmF1bHRMb2FkaW5nTWFuYWdlciwKICAgICAgICBEZXB0aEZvcm1hdDogRGVwdGhGb3JtYXQsCiAgICAgICAgRGVwdGhTdGVuY2lsRm9ybWF0OiBEZXB0aFN0ZW5jaWxGb3JtYXQsCiAgICAgICAgRGVwdGhUZXh0dXJlOiBEZXB0aFRleHR1cmUsCiAgICAgICAgRGlyZWN0aW9uYWxMaWdodDogRGlyZWN0aW9uYWxMaWdodCwKICAgICAgICBEaXJlY3Rpb25hbExpZ2h0SGVscGVyOiBEaXJlY3Rpb25hbExpZ2h0SGVscGVyLAogICAgICAgIERpcmVjdGlvbmFsTGlnaHRTaGFkb3c6IERpcmVjdGlvbmFsTGlnaHRTaGFkb3csCiAgICAgICAgRGlzY3JldGVJbnRlcnBvbGFudDogRGlzY3JldGVJbnRlcnBvbGFudCwKICAgICAgICBEb2RlY2FoZWRyb25CdWZmZXJHZW9tZXRyeTogRG9kZWNhaGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAgICAgRG9kZWNhaGVkcm9uR2VvbWV0cnk6IERvZGVjYWhlZHJvbkdlb21ldHJ5LAogICAgICAgIERvdWJsZVNpZGU6IERvdWJsZVNpZGUsCiAgICAgICAgRHN0QWxwaGFGYWN0b3I6IERzdEFscGhhRmFjdG9yLAogICAgICAgIERzdENvbG9yRmFjdG9yOiBEc3RDb2xvckZhY3RvciwKICAgICAgICBEeW5hbWljQnVmZmVyQXR0cmlidXRlOiBEeW5hbWljQnVmZmVyQXR0cmlidXRlLAogICAgICAgIEVkZ2VzR2VvbWV0cnk6IEVkZ2VzR2VvbWV0cnksCiAgICAgICAgRWRnZXNIZWxwZXI6IEVkZ2VzSGVscGVyLAogICAgICAgIEVsbGlwc2VDdXJ2ZTogRWxsaXBzZUN1cnZlLAogICAgICAgIEVxdWFsRGVwdGg6IEVxdWFsRGVwdGgsCiAgICAgICAgRXF1YWxTdGVuY2lsRnVuYzogRXF1YWxTdGVuY2lsRnVuYywKICAgICAgICBFcXVpcmVjdGFuZ3VsYXJSZWZsZWN0aW9uTWFwcGluZzogRXF1aXJlY3Rhbmd1bGFyUmVmbGVjdGlvbk1hcHBpbmcsCiAgICAgICAgRXF1aXJlY3Rhbmd1bGFyUmVmcmFjdGlvbk1hcHBpbmc6IEVxdWlyZWN0YW5ndWxhclJlZnJhY3Rpb25NYXBwaW5nLAogICAgICAgIEV1bGVyOiBFdWxlciwKICAgICAgICBFdmVudERpc3BhdGNoZXI6IEV2ZW50RGlzcGF0Y2hlciwKICAgICAgICBFeHRydWRlQnVmZmVyR2VvbWV0cnk6IEV4dHJ1ZGVCdWZmZXJHZW9tZXRyeSwKICAgICAgICBFeHRydWRlR2VvbWV0cnk6IEV4dHJ1ZGVHZW9tZXRyeSwKICAgICAgICBGYWNlMzogRmFjZTMsCiAgICAgICAgRmFjZTQ6IEZhY2U0LAogICAgICAgIEZhY2VDb2xvcnM6IEZhY2VDb2xvcnMsCiAgICAgICAgRmFjZU5vcm1hbHNIZWxwZXI6IEZhY2VOb3JtYWxzSGVscGVyLAogICAgICAgIEZpbGVMb2FkZXI6IEZpbGVMb2FkZXIsCiAgICAgICAgRmxhdFNoYWRpbmc6IEZsYXRTaGFkaW5nLAogICAgICAgIEZsb2F0MzJBdHRyaWJ1dGU6IEZsb2F0MzJBdHRyaWJ1dGUsCiAgICAgICAgRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZTogRmxvYXQzMkJ1ZmZlckF0dHJpYnV0ZSwKICAgICAgICBGbG9hdDY0QXR0cmlidXRlOiBGbG9hdDY0QXR0cmlidXRlLAogICAgICAgIEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGU6IEZsb2F0NjRCdWZmZXJBdHRyaWJ1dGUsCiAgICAgICAgRmxvYXRUeXBlOiBGbG9hdFR5cGUsCiAgICAgICAgRm9nOiBGb2csCiAgICAgICAgRm9nRXhwMjogRm9nRXhwMiwKICAgICAgICBGb250OiBGb250LAogICAgICAgIEZvbnRMb2FkZXI6IEZvbnRMb2FkZXIsCiAgICAgICAgRnJvbnRGYWNlRGlyZWN0aW9uQ0NXOiBGcm9udEZhY2VEaXJlY3Rpb25DQ1csCiAgICAgICAgRnJvbnRGYWNlRGlyZWN0aW9uQ1c6IEZyb250RmFjZURpcmVjdGlvbkNXLAogICAgICAgIEZyb250U2lkZTogRnJvbnRTaWRlLAogICAgICAgIEZydXN0dW06IEZydXN0dW0sCiAgICAgICAgR2FtbWFFbmNvZGluZzogR2FtbWFFbmNvZGluZywKICAgICAgICBHZW9tZXRyeTogR2VvbWV0cnksCiAgICAgICAgR2VvbWV0cnlVdGlsczogR2VvbWV0cnlVdGlscywKICAgICAgICBHcmVhdGVyRGVwdGg6IEdyZWF0ZXJEZXB0aCwKICAgICAgICBHcmVhdGVyRXF1YWxEZXB0aDogR3JlYXRlckVxdWFsRGVwdGgsCiAgICAgICAgR3JlYXRlckVxdWFsU3RlbmNpbEZ1bmM6IEdyZWF0ZXJFcXVhbFN0ZW5jaWxGdW5jLAogICAgICAgIEdyZWF0ZXJTdGVuY2lsRnVuYzogR3JlYXRlclN0ZW5jaWxGdW5jLAogICAgICAgIEdyaWRIZWxwZXI6IEdyaWRIZWxwZXIsCiAgICAgICAgR3JvdXA6IEdyb3VwLAogICAgICAgIEhhbGZGbG9hdFR5cGU6IEhhbGZGbG9hdFR5cGUsCiAgICAgICAgSGVtaXNwaGVyZUxpZ2h0OiBIZW1pc3BoZXJlTGlnaHQsCiAgICAgICAgSGVtaXNwaGVyZUxpZ2h0SGVscGVyOiBIZW1pc3BoZXJlTGlnaHRIZWxwZXIsCiAgICAgICAgSGVtaXNwaGVyZUxpZ2h0UHJvYmU6IEhlbWlzcGhlcmVMaWdodFByb2JlLAogICAgICAgIEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnk6IEljb3NhaGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAgICAgSWNvc2FoZWRyb25HZW9tZXRyeTogSWNvc2FoZWRyb25HZW9tZXRyeSwKICAgICAgICBJbWFnZUJpdG1hcExvYWRlcjogSW1hZ2VCaXRtYXBMb2FkZXIsCiAgICAgICAgSW1hZ2VMb2FkZXI6IEltYWdlTG9hZGVyLAogICAgICAgIEltYWdlVXRpbHM6IEltYWdlVXRpbHMsCiAgICAgICAgSW1tZWRpYXRlUmVuZGVyT2JqZWN0OiBJbW1lZGlhdGVSZW5kZXJPYmplY3QsCiAgICAgICAgSW5jcmVtZW50U3RlbmNpbE9wOiBJbmNyZW1lbnRTdGVuY2lsT3AsCiAgICAgICAgSW5jcmVtZW50V3JhcFN0ZW5jaWxPcDogSW5jcmVtZW50V3JhcFN0ZW5jaWxPcCwKICAgICAgICBJbnN0YW5jZWRCdWZmZXJBdHRyaWJ1dGU6IEluc3RhbmNlZEJ1ZmZlckF0dHJpYnV0ZSwKICAgICAgICBJbnN0YW5jZWRCdWZmZXJHZW9tZXRyeTogSW5zdGFuY2VkQnVmZmVyR2VvbWV0cnksCiAgICAgICAgSW5zdGFuY2VkSW50ZXJsZWF2ZWRCdWZmZXI6IEluc3RhbmNlZEludGVybGVhdmVkQnVmZmVyLAogICAgICAgIEludDE2QXR0cmlidXRlOiBJbnQxNkF0dHJpYnV0ZSwKICAgICAgICBJbnQxNkJ1ZmZlckF0dHJpYnV0ZTogSW50MTZCdWZmZXJBdHRyaWJ1dGUsCiAgICAgICAgSW50MzJBdHRyaWJ1dGU6IEludDMyQXR0cmlidXRlLAogICAgICAgIEludDMyQnVmZmVyQXR0cmlidXRlOiBJbnQzMkJ1ZmZlckF0dHJpYnV0ZSwKICAgICAgICBJbnQ4QXR0cmlidXRlOiBJbnQ4QXR0cmlidXRlLAogICAgICAgIEludDhCdWZmZXJBdHRyaWJ1dGU6IEludDhCdWZmZXJBdHRyaWJ1dGUsCiAgICAgICAgSW50VHlwZTogSW50VHlwZSwKICAgICAgICBJbnRlcmxlYXZlZEJ1ZmZlcjogSW50ZXJsZWF2ZWRCdWZmZXIsCiAgICAgICAgSW50ZXJsZWF2ZWRCdWZmZXJBdHRyaWJ1dGU6IEludGVybGVhdmVkQnVmZmVyQXR0cmlidXRlLAogICAgICAgIEludGVycG9sYW50OiBJbnRlcnBvbGFudCwKICAgICAgICBJbnRlcnBvbGF0ZURpc2NyZXRlOiBJbnRlcnBvbGF0ZURpc2NyZXRlLAogICAgICAgIEludGVycG9sYXRlTGluZWFyOiBJbnRlcnBvbGF0ZUxpbmVhciwKICAgICAgICBJbnRlcnBvbGF0ZVNtb290aDogSW50ZXJwb2xhdGVTbW9vdGgsCiAgICAgICAgSW52ZXJ0U3RlbmNpbE9wOiBJbnZlcnRTdGVuY2lsT3AsCiAgICAgICAgSlNPTkxvYWRlcjogSlNPTkxvYWRlciwKICAgICAgICBLZWVwU3RlbmNpbE9wOiBLZWVwU3RlbmNpbE9wLAogICAgICAgIEtleWZyYW1lVHJhY2s6IEtleWZyYW1lVHJhY2ssCiAgICAgICAgTE9EOiBMT0QsCiAgICAgICAgTGF0aGVCdWZmZXJHZW9tZXRyeTogTGF0aGVCdWZmZXJHZW9tZXRyeSwKICAgICAgICBMYXRoZUdlb21ldHJ5OiBMYXRoZUdlb21ldHJ5LAogICAgICAgIExheWVyczogTGF5ZXJzLAogICAgICAgIExlbnNGbGFyZTogTGVuc0ZsYXJlLAogICAgICAgIExlc3NEZXB0aDogTGVzc0RlcHRoLAogICAgICAgIExlc3NFcXVhbERlcHRoOiBMZXNzRXF1YWxEZXB0aCwKICAgICAgICBMZXNzRXF1YWxTdGVuY2lsRnVuYzogTGVzc0VxdWFsU3RlbmNpbEZ1bmMsCiAgICAgICAgTGVzc1N0ZW5jaWxGdW5jOiBMZXNzU3RlbmNpbEZ1bmMsCiAgICAgICAgTGlnaHQ6IExpZ2h0LAogICAgICAgIExpZ2h0UHJvYmU6IExpZ2h0UHJvYmUsCiAgICAgICAgTGlnaHRQcm9iZUhlbHBlcjogTGlnaHRQcm9iZUhlbHBlciwKICAgICAgICBMaWdodFNoYWRvdzogTGlnaHRTaGFkb3csCiAgICAgICAgTGluZTogTGluZSwKICAgICAgICBMaW5lMzogTGluZTMsCiAgICAgICAgTGluZUJhc2ljTWF0ZXJpYWw6IExpbmVCYXNpY01hdGVyaWFsLAogICAgICAgIExpbmVDdXJ2ZTogTGluZUN1cnZlLAogICAgICAgIExpbmVDdXJ2ZTM6IExpbmVDdXJ2ZTMsCiAgICAgICAgTGluZURhc2hlZE1hdGVyaWFsOiBMaW5lRGFzaGVkTWF0ZXJpYWwsCiAgICAgICAgTGluZUxvb3A6IExpbmVMb29wLAogICAgICAgIExpbmVQaWVjZXM6IExpbmVQaWVjZXMsCiAgICAgICAgTGluZVNlZ21lbnRzOiBMaW5lU2VnbWVudHMsCiAgICAgICAgTGluZVN0cmlwOiBMaW5lU3RyaXAsCiAgICAgICAgTGluZWFyRW5jb2Rpbmc6IExpbmVhckVuY29kaW5nLAogICAgICAgIExpbmVhckZpbHRlcjogTGluZWFyRmlsdGVyLAogICAgICAgIExpbmVhckludGVycG9sYW50OiBMaW5lYXJJbnRlcnBvbGFudCwKICAgICAgICBMaW5lYXJNaXBNYXBMaW5lYXJGaWx0ZXI6IExpbmVhck1pcE1hcExpbmVhckZpbHRlciwKICAgICAgICBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyOiBMaW5lYXJNaXBNYXBOZWFyZXN0RmlsdGVyLAogICAgICAgIExpbmVhck1pcG1hcExpbmVhckZpbHRlcjogTGluZWFyTWlwbWFwTGluZWFyRmlsdGVyLAogICAgICAgIExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXI6IExpbmVhck1pcG1hcE5lYXJlc3RGaWx0ZXIsCiAgICAgICAgTGluZWFyVG9uZU1hcHBpbmc6IExpbmVhclRvbmVNYXBwaW5nLAogICAgICAgIExvYWRlcjogTG9hZGVyLAogICAgICAgIExvYWRlclV0aWxzOiBMb2FkZXJVdGlscywKICAgICAgICBMb2FkaW5nTWFuYWdlcjogTG9hZGluZ01hbmFnZXIsCiAgICAgICAgTG9nTHV2RW5jb2Rpbmc6IExvZ0x1dkVuY29kaW5nLAogICAgICAgIExvb3BPbmNlOiBMb29wT25jZSwKICAgICAgICBMb29wUGluZ1Bvbmc6IExvb3BQaW5nUG9uZywKICAgICAgICBMb29wUmVwZWF0OiBMb29wUmVwZWF0LAogICAgICAgIEx1bWluYW5jZUFscGhhRm9ybWF0OiBMdW1pbmFuY2VBbHBoYUZvcm1hdCwKICAgICAgICBMdW1pbmFuY2VGb3JtYXQ6IEx1bWluYW5jZUZvcm1hdCwKICAgICAgICBNT1VTRTogTU9VU0UsCiAgICAgICAgTWF0ZXJpYWw6IE1hdGVyaWFsLAogICAgICAgIE1hdGVyaWFsTG9hZGVyOiBNYXRlcmlhbExvYWRlciwKICAgICAgICBNYXRoOiBfTWF0aCwKICAgICAgICBNYXRyaXgzOiBNYXRyaXgzLAogICAgICAgIE1hdHJpeDQ6IE1hdHJpeDQsCiAgICAgICAgTWF4RXF1YXRpb246IE1heEVxdWF0aW9uLAogICAgICAgIE1lc2g6IE1lc2gsCiAgICAgICAgTWVzaEJhc2ljTWF0ZXJpYWw6IE1lc2hCYXNpY01hdGVyaWFsLAogICAgICAgIE1lc2hEZXB0aE1hdGVyaWFsOiBNZXNoRGVwdGhNYXRlcmlhbCwKICAgICAgICBNZXNoRGlzdGFuY2VNYXRlcmlhbDogTWVzaERpc3RhbmNlTWF0ZXJpYWwsCiAgICAgICAgTWVzaEZhY2VNYXRlcmlhbDogTWVzaEZhY2VNYXRlcmlhbCwKICAgICAgICBNZXNoTGFtYmVydE1hdGVyaWFsOiBNZXNoTGFtYmVydE1hdGVyaWFsLAogICAgICAgIE1lc2hNYXRjYXBNYXRlcmlhbDogTWVzaE1hdGNhcE1hdGVyaWFsLAogICAgICAgIE1lc2hOb3JtYWxNYXRlcmlhbDogTWVzaE5vcm1hbE1hdGVyaWFsLAogICAgICAgIE1lc2hQaG9uZ01hdGVyaWFsOiBNZXNoUGhvbmdNYXRlcmlhbCwKICAgICAgICBNZXNoUGh5c2ljYWxNYXRlcmlhbDogTWVzaFBoeXNpY2FsTWF0ZXJpYWwsCiAgICAgICAgTWVzaFN0YW5kYXJkTWF0ZXJpYWw6IE1lc2hTdGFuZGFyZE1hdGVyaWFsLAogICAgICAgIE1lc2hUb29uTWF0ZXJpYWw6IE1lc2hUb29uTWF0ZXJpYWwsCiAgICAgICAgTWluRXF1YXRpb246IE1pbkVxdWF0aW9uLAogICAgICAgIE1pcnJvcmVkUmVwZWF0V3JhcHBpbmc6IE1pcnJvcmVkUmVwZWF0V3JhcHBpbmcsCiAgICAgICAgTWl4T3BlcmF0aW9uOiBNaXhPcGVyYXRpb24sCiAgICAgICAgTXVsdGlNYXRlcmlhbDogTXVsdGlNYXRlcmlhbCwKICAgICAgICBNdWx0aXBseUJsZW5kaW5nOiBNdWx0aXBseUJsZW5kaW5nLAogICAgICAgIE11bHRpcGx5T3BlcmF0aW9uOiBNdWx0aXBseU9wZXJhdGlvbiwKICAgICAgICBOZWFyZXN0RmlsdGVyOiBOZWFyZXN0RmlsdGVyLAogICAgICAgIE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBNYXBMaW5lYXJGaWx0ZXIsCiAgICAgICAgTmVhcmVzdE1pcE1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBNYXBOZWFyZXN0RmlsdGVyLAogICAgICAgIE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXI6IE5lYXJlc3RNaXBtYXBMaW5lYXJGaWx0ZXIsCiAgICAgICAgTmVhcmVzdE1pcG1hcE5lYXJlc3RGaWx0ZXI6IE5lYXJlc3RNaXBtYXBOZWFyZXN0RmlsdGVyLAogICAgICAgIE5ldmVyRGVwdGg6IE5ldmVyRGVwdGgsCiAgICAgICAgTmV2ZXJTdGVuY2lsRnVuYzogTmV2ZXJTdGVuY2lsRnVuYywKICAgICAgICBOb0JsZW5kaW5nOiBOb0JsZW5kaW5nLAogICAgICAgIE5vQ29sb3JzOiBOb0NvbG9ycywKICAgICAgICBOb1RvbmVNYXBwaW5nOiBOb1RvbmVNYXBwaW5nLAogICAgICAgIE5vcm1hbEJsZW5kaW5nOiBOb3JtYWxCbGVuZGluZywKICAgICAgICBOb3RFcXVhbERlcHRoOiBOb3RFcXVhbERlcHRoLAogICAgICAgIE5vdEVxdWFsU3RlbmNpbEZ1bmM6IE5vdEVxdWFsU3RlbmNpbEZ1bmMsCiAgICAgICAgTnVtYmVyS2V5ZnJhbWVUcmFjazogTnVtYmVyS2V5ZnJhbWVUcmFjaywKICAgICAgICBPYmplY3QzRDogT2JqZWN0M0QsCiAgICAgICAgT2JqZWN0TG9hZGVyOiBPYmplY3RMb2FkZXIsCiAgICAgICAgT2JqZWN0U3BhY2VOb3JtYWxNYXA6IE9iamVjdFNwYWNlTm9ybWFsTWFwLAogICAgICAgIE9jdGFoZWRyb25CdWZmZXJHZW9tZXRyeTogT2N0YWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAogICAgICAgIE9jdGFoZWRyb25HZW9tZXRyeTogT2N0YWhlZHJvbkdlb21ldHJ5LAogICAgICAgIE9uZUZhY3RvcjogT25lRmFjdG9yLAogICAgICAgIE9uZU1pbnVzRHN0QWxwaGFGYWN0b3I6IE9uZU1pbnVzRHN0QWxwaGFGYWN0b3IsCiAgICAgICAgT25lTWludXNEc3RDb2xvckZhY3RvcjogT25lTWludXNEc3RDb2xvckZhY3RvciwKICAgICAgICBPbmVNaW51c1NyY0FscGhhRmFjdG9yOiBPbmVNaW51c1NyY0FscGhhRmFjdG9yLAogICAgICAgIE9uZU1pbnVzU3JjQ29sb3JGYWN0b3I6IE9uZU1pbnVzU3JjQ29sb3JGYWN0b3IsCiAgICAgICAgT3J0aG9ncmFwaGljQ2FtZXJhOiBPcnRob2dyYXBoaWNDYW1lcmEsCiAgICAgICAgUENGU2hhZG93TWFwOiBQQ0ZTaGFkb3dNYXAsCiAgICAgICAgUENGU29mdFNoYWRvd01hcDogUENGU29mdFNoYWRvd01hcCwKICAgICAgICBQYXJhbWV0cmljQnVmZmVyR2VvbWV0cnk6IFBhcmFtZXRyaWNCdWZmZXJHZW9tZXRyeSwKICAgICAgICBQYXJhbWV0cmljR2VvbWV0cnk6IFBhcmFtZXRyaWNHZW9tZXRyeSwKICAgICAgICBQYXJ0aWNsZTogUGFydGljbGUsCiAgICAgICAgUGFydGljbGVCYXNpY01hdGVyaWFsOiBQYXJ0aWNsZUJhc2ljTWF0ZXJpYWwsCiAgICAgICAgUGFydGljbGVTeXN0ZW06IFBhcnRpY2xlU3lzdGVtLAogICAgICAgIFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWw6IFBhcnRpY2xlU3lzdGVtTWF0ZXJpYWwsCiAgICAgICAgUGF0aDogUGF0aCQ0LAogICAgICAgIFBlcnNwZWN0aXZlQ2FtZXJhOiBQZXJzcGVjdGl2ZUNhbWVyYSwKICAgICAgICBQbGFuZTogUGxhbmUsCiAgICAgICAgUGxhbmVCdWZmZXJHZW9tZXRyeTogUGxhbmVCdWZmZXJHZW9tZXRyeSwKICAgICAgICBQbGFuZUdlb21ldHJ5OiBQbGFuZUdlb21ldHJ5LAogICAgICAgIFBsYW5lSGVscGVyOiBQbGFuZUhlbHBlciwKICAgICAgICBQb2ludENsb3VkOiBQb2ludENsb3VkLAogICAgICAgIFBvaW50Q2xvdWRNYXRlcmlhbDogUG9pbnRDbG91ZE1hdGVyaWFsLAogICAgICAgIFBvaW50TGlnaHQ6IFBvaW50TGlnaHQsCiAgICAgICAgUG9pbnRMaWdodEhlbHBlcjogUG9pbnRMaWdodEhlbHBlciwKICAgICAgICBQb2ludHM6IFBvaW50cywKICAgICAgICBQb2ludHNNYXRlcmlhbDogUG9pbnRzTWF0ZXJpYWwsCiAgICAgICAgUG9sYXJHcmlkSGVscGVyOiBQb2xhckdyaWRIZWxwZXIsCiAgICAgICAgUG9seWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBQb2x5aGVkcm9uQnVmZmVyR2VvbWV0cnksCiAgICAgICAgUG9seWhlZHJvbkdlb21ldHJ5OiBQb2x5aGVkcm9uR2VvbWV0cnksCiAgICAgICAgUG9zaXRpb25hbEF1ZGlvOiBQb3NpdGlvbmFsQXVkaW8sCiAgICAgICAgUG9zaXRpb25hbEF1ZGlvSGVscGVyOiBQb3NpdGlvbmFsQXVkaW9IZWxwZXIsCiAgICAgICAgUHJvcGVydHlCaW5kaW5nOiBQcm9wZXJ0eUJpbmRpbmcsCiAgICAgICAgUHJvcGVydHlNaXhlcjogUHJvcGVydHlNaXhlciwKICAgICAgICBRdWFkcmF0aWNCZXppZXJDdXJ2ZTogUXVhZHJhdGljQmV6aWVyQ3VydmUsCiAgICAgICAgUXVhZHJhdGljQmV6aWVyQ3VydmUzOiBRdWFkcmF0aWNCZXppZXJDdXJ2ZTMsCiAgICAgICAgUXVhdGVybmlvbjogUXVhdGVybmlvbiwKICAgICAgICBRdWF0ZXJuaW9uS2V5ZnJhbWVUcmFjazogUXVhdGVybmlvbktleWZyYW1lVHJhY2ssCiAgICAgICAgUXVhdGVybmlvbkxpbmVhckludGVycG9sYW50OiBRdWF0ZXJuaW9uTGluZWFySW50ZXJwb2xhbnQsCiAgICAgICAgUkVWSVNJT046IFJFVklTSU9OLAogICAgICAgIFJHQkFEZXB0aFBhY2tpbmc6IFJHQkFEZXB0aFBhY2tpbmcsCiAgICAgICAgUkdCQUZvcm1hdDogUkdCQUZvcm1hdCwKICAgICAgICBSR0JBX0FTVENfMTB4MTBfRm9ybWF0OiBSR0JBX0FTVENfMTB4MTBfRm9ybWF0LAogICAgICAgIFJHQkFfQVNUQ18xMHg1X0Zvcm1hdDogUkdCQV9BU1RDXzEweDVfRm9ybWF0LAogICAgICAgIFJHQkFfQVNUQ18xMHg2X0Zvcm1hdDogUkdCQV9BU1RDXzEweDZfRm9ybWF0LAogICAgICAgIFJHQkFfQVNUQ18xMHg4X0Zvcm1hdDogUkdCQV9BU1RDXzEweDhfRm9ybWF0LAogICAgICAgIFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQ6IFJHQkFfQVNUQ18xMngxMF9Gb3JtYXQsCiAgICAgICAgUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdDogUkdCQV9BU1RDXzEyeDEyX0Zvcm1hdCwKICAgICAgICBSR0JBX0FTVENfNHg0X0Zvcm1hdDogUkdCQV9BU1RDXzR4NF9Gb3JtYXQsCiAgICAgICAgUkdCQV9BU1RDXzV4NF9Gb3JtYXQ6IFJHQkFfQVNUQ181eDRfRm9ybWF0LAogICAgICAgIFJHQkFfQVNUQ181eDVfRm9ybWF0OiBSR0JBX0FTVENfNXg1X0Zvcm1hdCwKICAgICAgICBSR0JBX0FTVENfNng1X0Zvcm1hdDogUkdCQV9BU1RDXzZ4NV9Gb3JtYXQsCiAgICAgICAgUkdCQV9BU1RDXzZ4Nl9Gb3JtYXQ6IFJHQkFfQVNUQ182eDZfRm9ybWF0LAogICAgICAgIFJHQkFfQVNUQ184eDVfRm9ybWF0OiBSR0JBX0FTVENfOHg1X0Zvcm1hdCwKICAgICAgICBSR0JBX0FTVENfOHg2X0Zvcm1hdDogUkdCQV9BU1RDXzh4Nl9Gb3JtYXQsCiAgICAgICAgUkdCQV9BU1RDXzh4OF9Gb3JtYXQ6IFJHQkFfQVNUQ184eDhfRm9ybWF0LAogICAgICAgIFJHQkFfUFZSVENfMkJQUFYxX0Zvcm1hdDogUkdCQV9QVlJUQ18yQlBQVjFfRm9ybWF0LAogICAgICAgIFJHQkFfUFZSVENfNEJQUFYxX0Zvcm1hdDogUkdCQV9QVlJUQ180QlBQVjFfRm9ybWF0LAogICAgICAgIFJHQkFfUzNUQ19EWFQxX0Zvcm1hdDogUkdCQV9TM1RDX0RYVDFfRm9ybWF0LAogICAgICAgIFJHQkFfUzNUQ19EWFQzX0Zvcm1hdDogUkdCQV9TM1RDX0RYVDNfRm9ybWF0LAogICAgICAgIFJHQkFfUzNUQ19EWFQ1X0Zvcm1hdDogUkdCQV9TM1RDX0RYVDVfRm9ybWF0LAogICAgICAgIFJHQkRFbmNvZGluZzogUkdCREVuY29kaW5nLAogICAgICAgIFJHQkVFbmNvZGluZzogUkdCRUVuY29kaW5nLAogICAgICAgIFJHQkVGb3JtYXQ6IFJHQkVGb3JtYXQsCiAgICAgICAgUkdCRm9ybWF0OiBSR0JGb3JtYXQsCiAgICAgICAgUkdCTTE2RW5jb2Rpbmc6IFJHQk0xNkVuY29kaW5nLAogICAgICAgIFJHQk03RW5jb2Rpbmc6IFJHQk03RW5jb2RpbmcsCiAgICAgICAgUkdCX0VUQzFfRm9ybWF0OiBSR0JfRVRDMV9Gb3JtYXQsCiAgICAgICAgUkdCX1BWUlRDXzJCUFBWMV9Gb3JtYXQ6IFJHQl9QVlJUQ18yQlBQVjFfRm9ybWF0LAogICAgICAgIFJHQl9QVlJUQ180QlBQVjFfRm9ybWF0OiBSR0JfUFZSVENfNEJQUFYxX0Zvcm1hdCwKICAgICAgICBSR0JfUzNUQ19EWFQxX0Zvcm1hdDogUkdCX1MzVENfRFhUMV9Gb3JtYXQsCiAgICAgICAgUmF3U2hhZGVyTWF0ZXJpYWw6IFJhd1NoYWRlck1hdGVyaWFsLAogICAgICAgIFJheTogUmF5LAogICAgICAgIFJheWNhc3RlcjogUmF5Y2FzdGVyLAogICAgICAgIFJlY3RBcmVhTGlnaHQ6IFJlY3RBcmVhTGlnaHQsCiAgICAgICAgUmVjdEFyZWFMaWdodEhlbHBlcjogUmVjdEFyZWFMaWdodEhlbHBlciwKICAgICAgICBSZWRGb3JtYXQ6IFJlZEZvcm1hdCwKICAgICAgICBSZWluaGFyZFRvbmVNYXBwaW5nOiBSZWluaGFyZFRvbmVNYXBwaW5nLAogICAgICAgIFJlcGVhdFdyYXBwaW5nOiBSZXBlYXRXcmFwcGluZywKICAgICAgICBSZXBsYWNlU3RlbmNpbE9wOiBSZXBsYWNlU3RlbmNpbE9wLAogICAgICAgIFJldmVyc2VTdWJ0cmFjdEVxdWF0aW9uOiBSZXZlcnNlU3VidHJhY3RFcXVhdGlvbiwKICAgICAgICBSaW5nQnVmZmVyR2VvbWV0cnk6IFJpbmdCdWZmZXJHZW9tZXRyeSwKICAgICAgICBSaW5nR2VvbWV0cnk6IFJpbmdHZW9tZXRyeSwKICAgICAgICBTY2VuZTogU2NlbmUsCiAgICAgICAgU2NlbmVVdGlsczogU2NlbmVVdGlscywKICAgICAgICBTaGFkZXJDaHVuazogU2hhZGVyQ2h1bmssCiAgICAgICAgU2hhZGVyTGliOiBTaGFkZXJMaWIsCiAgICAgICAgU2hhZGVyTWF0ZXJpYWw6IFNoYWRlck1hdGVyaWFsLAogICAgICAgIFNoYWRvd01hdGVyaWFsOiBTaGFkb3dNYXRlcmlhbCwKICAgICAgICBTaGFwZTogU2hhcGUsCiAgICAgICAgU2hhcGVCdWZmZXJHZW9tZXRyeTogU2hhcGVCdWZmZXJHZW9tZXRyeSwKICAgICAgICBTaGFwZUdlb21ldHJ5OiBTaGFwZUdlb21ldHJ5LAogICAgICAgIFNoYXBlUGF0aDogU2hhcGVQYXRoLAogICAgICAgIFNoYXBlVXRpbHM6IFNoYXBlVXRpbHMsCiAgICAgICAgU2hvcnRUeXBlOiBTaG9ydFR5cGUsCiAgICAgICAgU2tlbGV0b246IFNrZWxldG9uLAogICAgICAgIFNrZWxldG9uSGVscGVyOiBTa2VsZXRvbkhlbHBlciwKICAgICAgICBTa2lubmVkTWVzaDogU2tpbm5lZE1lc2gsCiAgICAgICAgU21vb3RoU2hhZGluZzogU21vb3RoU2hhZGluZywKICAgICAgICBTcGhlcmU6IFNwaGVyZSwKICAgICAgICBTcGhlcmVCdWZmZXJHZW9tZXRyeTogU3BoZXJlQnVmZmVyR2VvbWV0cnksCiAgICAgICAgU3BoZXJlR2VvbWV0cnk6IFNwaGVyZUdlb21ldHJ5LAogICAgICAgIFNwaGVyaWNhbDogU3BoZXJpY2FsLAogICAgICAgIFNwaGVyaWNhbEhhcm1vbmljczM6IFNwaGVyaWNhbEhhcm1vbmljczMsCiAgICAgICAgU3BoZXJpY2FsUmVmbGVjdGlvbk1hcHBpbmc6IFNwaGVyaWNhbFJlZmxlY3Rpb25NYXBwaW5nLAogICAgICAgIFNwbGluZTogU3BsaW5lLAogICAgICAgIFNwbGluZUN1cnZlOiBTcGxpbmVDdXJ2ZSwKICAgICAgICBTcGxpbmVDdXJ2ZTM6IFNwbGluZUN1cnZlMywKICAgICAgICBTcG90TGlnaHQ6IFNwb3RMaWdodCwKICAgICAgICBTcG90TGlnaHRIZWxwZXI6IFNwb3RMaWdodEhlbHBlciwKICAgICAgICBTcG90TGlnaHRTaGFkb3c6IFNwb3RMaWdodFNoYWRvdywKICAgICAgICBTcHJpdGU6IFNwcml0ZSwKICAgICAgICBTcHJpdGVNYXRlcmlhbDogU3ByaXRlTWF0ZXJpYWwsCiAgICAgICAgU3JjQWxwaGFGYWN0b3I6IFNyY0FscGhhRmFjdG9yLAogICAgICAgIFNyY0FscGhhU2F0dXJhdGVGYWN0b3I6IFNyY0FscGhhU2F0dXJhdGVGYWN0b3IsCiAgICAgICAgU3JjQ29sb3JGYWN0b3I6IFNyY0NvbG9yRmFjdG9yLAogICAgICAgIFN0ZXJlb0NhbWVyYTogU3RlcmVvQ2FtZXJhLAogICAgICAgIFN0cmluZ0tleWZyYW1lVHJhY2s6IFN0cmluZ0tleWZyYW1lVHJhY2ssCiAgICAgICAgU3VidHJhY3RFcXVhdGlvbjogU3VidHJhY3RFcXVhdGlvbiwKICAgICAgICBTdWJ0cmFjdGl2ZUJsZW5kaW5nOiBTdWJ0cmFjdGl2ZUJsZW5kaW5nLAogICAgICAgIFRPVUNIOiBUT1VDSCwKICAgICAgICBUYW5nZW50U3BhY2VOb3JtYWxNYXA6IFRhbmdlbnRTcGFjZU5vcm1hbE1hcCwKICAgICAgICBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5OiBUZXRyYWhlZHJvbkJ1ZmZlckdlb21ldHJ5LAogICAgICAgIFRldHJhaGVkcm9uR2VvbWV0cnk6IFRldHJhaGVkcm9uR2VvbWV0cnksCiAgICAgICAgVGV4dEJ1ZmZlckdlb21ldHJ5OiBUZXh0QnVmZmVyR2VvbWV0cnksCiAgICAgICAgVGV4dEdlb21ldHJ5OiBUZXh0R2VvbWV0cnksCiAgICAgICAgVGV4dHVyZTogVGV4dHVyZSwKICAgICAgICBUZXh0dXJlTG9hZGVyOiBUZXh0dXJlTG9hZGVyLAogICAgICAgIFRvcnVzQnVmZmVyR2VvbWV0cnk6IFRvcnVzQnVmZmVyR2VvbWV0cnksCiAgICAgICAgVG9ydXNHZW9tZXRyeTogVG9ydXNHZW9tZXRyeSwKICAgICAgICBUb3J1c0tub3RCdWZmZXJHZW9tZXRyeTogVG9ydXNLbm90QnVmZmVyR2VvbWV0cnksCiAgICAgICAgVG9ydXNLbm90R2VvbWV0cnk6IFRvcnVzS25vdEdlb21ldHJ5LAogICAgICAgIFRyaWFuZ2xlOiBUcmlhbmdsZSwKICAgICAgICBUcmlhbmdsZUZhbkRyYXdNb2RlOiBUcmlhbmdsZUZhbkRyYXdNb2RlLAogICAgICAgIFRyaWFuZ2xlU3RyaXBEcmF3TW9kZTogVHJpYW5nbGVTdHJpcERyYXdNb2RlLAogICAgICAgIFRyaWFuZ2xlc0RyYXdNb2RlOiBUcmlhbmdsZXNEcmF3TW9kZSwKICAgICAgICBUdWJlQnVmZmVyR2VvbWV0cnk6IFR1YmVCdWZmZXJHZW9tZXRyeSwKICAgICAgICBUdWJlR2VvbWV0cnk6IFR1YmVHZW9tZXRyeSwKICAgICAgICBVVk1hcHBpbmc6IFVWTWFwcGluZywKICAgICAgICBVaW50MTZBdHRyaWJ1dGU6IFVpbnQxNkF0dHJpYnV0ZSwKICAgICAgICBVaW50MTZCdWZmZXJBdHRyaWJ1dGU6IFVpbnQxNkJ1ZmZlckF0dHJpYnV0ZSwKICAgICAgICBVaW50MzJBdHRyaWJ1dGU6IFVpbnQzMkF0dHJpYnV0ZSwKICAgICAgICBVaW50MzJCdWZmZXJBdHRyaWJ1dGU6IFVpbnQzMkJ1ZmZlckF0dHJpYnV0ZSwKICAgICAgICBVaW50OEF0dHJpYnV0ZTogVWludDhBdHRyaWJ1dGUsCiAgICAgICAgVWludDhCdWZmZXJBdHRyaWJ1dGU6IFVpbnQ4QnVmZmVyQXR0cmlidXRlLAogICAgICAgIFVpbnQ4Q2xhbXBlZEF0dHJpYnV0ZTogVWludDhDbGFtcGVkQXR0cmlidXRlLAogICAgICAgIFVpbnQ4Q2xhbXBlZEJ1ZmZlckF0dHJpYnV0ZTogVWludDhDbGFtcGVkQnVmZmVyQXR0cmlidXRlLAogICAgICAgIFVuY2hhcnRlZDJUb25lTWFwcGluZzogVW5jaGFydGVkMlRvbmVNYXBwaW5nLAogICAgICAgIFVuaWZvcm06IFVuaWZvcm0sCiAgICAgICAgVW5pZm9ybXNMaWI6IFVuaWZvcm1zTGliLAogICAgICAgIFVuaWZvcm1zVXRpbHM6IFVuaWZvcm1zVXRpbHMsCiAgICAgICAgVW5zaWduZWRCeXRlVHlwZTogVW5zaWduZWRCeXRlVHlwZSwKICAgICAgICBVbnNpZ25lZEludDI0OFR5cGU6IFVuc2lnbmVkSW50MjQ4VHlwZSwKICAgICAgICBVbnNpZ25lZEludFR5cGU6IFVuc2lnbmVkSW50VHlwZSwKICAgICAgICBVbnNpZ25lZFNob3J0NDQ0NFR5cGU6IFVuc2lnbmVkU2hvcnQ0NDQ0VHlwZSwKICAgICAgICBVbnNpZ25lZFNob3J0NTU1MVR5cGU6IFVuc2lnbmVkU2hvcnQ1NTUxVHlwZSwKICAgICAgICBVbnNpZ25lZFNob3J0NTY1VHlwZTogVW5zaWduZWRTaG9ydDU2NVR5cGUsCiAgICAgICAgVW5zaWduZWRTaG9ydFR5cGU6IFVuc2lnbmVkU2hvcnRUeXBlLAogICAgICAgIFZTTVNoYWRvd01hcDogVlNNU2hhZG93TWFwLAogICAgICAgIFZlY3RvcjI6IFZlY3RvcjIsCiAgICAgICAgVmVjdG9yMzogVmVjdG9yMywKICAgICAgICBWZWN0b3I0OiBWZWN0b3I0LAogICAgICAgIFZlY3RvcktleWZyYW1lVHJhY2s6IFZlY3RvcktleWZyYW1lVHJhY2ssCiAgICAgICAgVmVydGV4OiBWZXJ0ZXgsCiAgICAgICAgVmVydGV4Q29sb3JzOiBWZXJ0ZXhDb2xvcnMsCiAgICAgICAgVmVydGV4Tm9ybWFsc0hlbHBlcjogVmVydGV4Tm9ybWFsc0hlbHBlciwKICAgICAgICBWaWRlb1RleHR1cmU6IFZpZGVvVGV4dHVyZSwKICAgICAgICBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0OiBXZWJHTE11bHRpc2FtcGxlUmVuZGVyVGFyZ2V0LAogICAgICAgIFdlYkdMUmVuZGVyVGFyZ2V0OiBXZWJHTFJlbmRlclRhcmdldCwKICAgICAgICBXZWJHTFJlbmRlclRhcmdldEN1YmU6IFdlYkdMUmVuZGVyVGFyZ2V0Q3ViZSwKICAgICAgICBXZWJHTFJlbmRlcmVyOiBXZWJHTFJlbmRlcmVyLAogICAgICAgIFdlYkdMVXRpbHM6IFdlYkdMVXRpbHMsCiAgICAgICAgV2lyZWZyYW1lR2VvbWV0cnk6IFdpcmVmcmFtZUdlb21ldHJ5LAogICAgICAgIFdpcmVmcmFtZUhlbHBlcjogV2lyZWZyYW1lSGVscGVyLAogICAgICAgIFdyYXBBcm91bmRFbmRpbmc6IFdyYXBBcm91bmRFbmRpbmcsCiAgICAgICAgWEhSTG9hZGVyOiBYSFJMb2FkZXIsCiAgICAgICAgWmVyb0N1cnZhdHVyZUVuZGluZzogWmVyb0N1cnZhdHVyZUVuZGluZywKICAgICAgICBaZXJvRmFjdG9yOiBaZXJvRmFjdG9yLAogICAgICAgIFplcm9TbG9wZUVuZGluZzogWmVyb1Nsb3BlRW5kaW5nLAogICAgICAgIFplcm9TdGVuY2lsT3A6IFplcm9TdGVuY2lsT3AsCiAgICAgICAgc1JHQkVuY29kaW5nOiBzUkdCRW5jb2RpbmcKICAgIH0pOwoKICAgIC8qKgogICAgICogQGF1dGhvciBxaWFvIC8gaHR0cHM6Ly9naXRodWIuY29tL3FpYW8KICAgICAqIEBhdXRob3IgbXJkb29iIC8gaHR0cDovL21yZG9vYi5jb20KICAgICAqIEBhdXRob3IgYWx0ZXJlZHEgLyBodHRwOi8vYWx0ZXJlZHF1YWxpYS5jb20vCiAgICAgKiBAYXV0aG9yIFdlc3RMYW5nbGV5IC8gaHR0cDovL2dpdGh1Yi5jb20vV2VzdExhbmdsZXkKICAgICAqIEBhdXRob3IgZXJpY2g2NjYgLyBodHRwOi8vZXJpY2hhaW5lcy5jb20KICAgICAqIEBhdXRob3IgU2NpZUNvZGUgLyBodHRwOi8vZ2l0aHViLmNvbS9zY2llY29kZQogICAgICovCgogICAgLy8gVGhpcyBzZXQgb2YgY29udHJvbHMgcGVyZm9ybXMgb3JiaXRpbmcsIGRvbGx5aW5nICh6b29taW5nKSwgYW5kIHBhbm5pbmcuCiAgICAvLyBVbmxpa2UgVHJhY2tiYWxsQ29udHJvbHMsIGl0IG1haW50YWlucyB0aGUgInVwIiBkaXJlY3Rpb24gb2JqZWN0LnVwICgrWSBieSBkZWZhdWx0KS4KICAgIC8vCiAgICAvLyAgICBPcmJpdCAtIGxlZnQgbW91c2UgLyB0b3VjaDogb25lLWZpbmdlciBtb3ZlCiAgICAvLyAgICBab29tIC0gbWlkZGxlIG1vdXNlLCBvciBtb3VzZXdoZWVsIC8gdG91Y2g6IHR3by1maW5nZXIgc3ByZWFkIG9yIHNxdWlzaAogICAgLy8gICAgUGFuIC0gcmlnaHQgbW91c2UsIG9yIGxlZnQgbW91c2UgKyBjdHJsL21ldGEvc2hpZnRLZXksIG9yIGFycm93IGtleXMgLyB0b3VjaDogdHdvLWZpbmdlciBtb3ZlCgogICAgdmFyIE9yYml0Q29udHJvbHMgPSBmdW5jdGlvbiAoIG9iamVjdCwgZG9tRWxlbWVudCApIHsKCiAgICAJdGhpcy5vYmplY3QgPSBvYmplY3Q7CgogICAgCXRoaXMuZG9tRWxlbWVudCA9ICggZG9tRWxlbWVudCAhPT0gdW5kZWZpbmVkICkgPyBkb21FbGVtZW50IDogZG9jdW1lbnQ7CgogICAgCS8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHRoaXMgY29udHJvbAogICAgCXRoaXMuZW5hYmxlZCA9IHRydWU7CgogICAgCS8vICJ0YXJnZXQiIHNldHMgdGhlIGxvY2F0aW9uIG9mIGZvY3VzLCB3aGVyZSB0aGUgb2JqZWN0IG9yYml0cyBhcm91bmQKICAgIAl0aGlzLnRhcmdldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCS8vIEhvdyBmYXIgeW91IGNhbiBkb2xseSBpbiBhbmQgb3V0ICggUGVyc3BlY3RpdmVDYW1lcmEgb25seSApCiAgICAJdGhpcy5taW5EaXN0YW5jZSA9IDA7CiAgICAJdGhpcy5tYXhEaXN0YW5jZSA9IEluZmluaXR5OwoKICAgIAkvLyBIb3cgZmFyIHlvdSBjYW4gem9vbSBpbiBhbmQgb3V0ICggT3J0aG9ncmFwaGljQ2FtZXJhIG9ubHkgKQogICAgCXRoaXMubWluWm9vbSA9IDA7CiAgICAJdGhpcy5tYXhab29tID0gSW5maW5pdHk7CgogICAgCS8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCB2ZXJ0aWNhbGx5LCB1cHBlciBhbmQgbG93ZXIgbGltaXRzLgogICAgCS8vIFJhbmdlIGlzIDAgdG8gTWF0aC5QSSByYWRpYW5zLgogICAgCXRoaXMubWluUG9sYXJBbmdsZSA9IDA7IC8vIHJhZGlhbnMKICAgIAl0aGlzLm1heFBvbGFyQW5nbGUgPSBNYXRoLlBJOyAvLyByYWRpYW5zCgogICAgCS8vIEhvdyBmYXIgeW91IGNhbiBvcmJpdCBob3Jpem9udGFsbHksIHVwcGVyIGFuZCBsb3dlciBsaW1pdHMuCiAgICAJLy8gSWYgc2V0LCBtdXN0IGJlIGEgc3ViLWludGVydmFsIG9mIHRoZSBpbnRlcnZhbCBbIC0gTWF0aC5QSSwgTWF0aC5QSSBdLgogICAgCXRoaXMubWluQXppbXV0aEFuZ2xlID0gLSBJbmZpbml0eTsgLy8gcmFkaWFucwogICAgCXRoaXMubWF4QXppbXV0aEFuZ2xlID0gSW5maW5pdHk7IC8vIHJhZGlhbnMKCiAgICAJLy8gU2V0IHRvIHRydWUgdG8gZW5hYmxlIGRhbXBpbmcgKGluZXJ0aWEpCiAgICAJLy8gSWYgZGFtcGluZyBpcyBlbmFibGVkLCB5b3UgbXVzdCBjYWxsIGNvbnRyb2xzLnVwZGF0ZSgpIGluIHlvdXIgYW5pbWF0aW9uIGxvb3AKICAgIAl0aGlzLmVuYWJsZURhbXBpbmcgPSBmYWxzZTsKICAgIAl0aGlzLmRhbXBpbmdGYWN0b3IgPSAwLjA1OwoKICAgIAkvLyBUaGlzIG9wdGlvbiBhY3R1YWxseSBlbmFibGVzIGRvbGx5aW5nIGluIGFuZCBvdXQ7IGxlZnQgYXMgInpvb20iIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgIAkvLyBTZXQgdG8gZmFsc2UgdG8gZGlzYWJsZSB6b29taW5nCiAgICAJdGhpcy5lbmFibGVab29tID0gdHJ1ZTsKICAgIAl0aGlzLnpvb21TcGVlZCA9IDEuMDsKCiAgICAJLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcm90YXRpbmcKICAgIAl0aGlzLmVuYWJsZVJvdGF0ZSA9IHRydWU7CiAgICAJdGhpcy5yb3RhdGVTcGVlZCA9IDEuMDsKCiAgICAJLy8gU2V0IHRvIGZhbHNlIHRvIGRpc2FibGUgcGFubmluZwogICAgCXRoaXMuZW5hYmxlUGFuID0gdHJ1ZTsKICAgIAl0aGlzLnBhblNwZWVkID0gMS4wOwogICAgCXRoaXMuc2NyZWVuU3BhY2VQYW5uaW5nID0gZmFsc2U7IC8vIGlmIHRydWUsIHBhbiBpbiBzY3JlZW4tc3BhY2UKICAgIAl0aGlzLmtleVBhblNwZWVkID0gNy4wOwkvLyBwaXhlbHMgbW92ZWQgcGVyIGFycm93IGtleSBwdXNoCgogICAgCS8vIFNldCB0byB0cnVlIHRvIGF1dG9tYXRpY2FsbHkgcm90YXRlIGFyb3VuZCB0aGUgdGFyZ2V0CiAgICAJLy8gSWYgYXV0by1yb3RhdGUgaXMgZW5hYmxlZCwgeW91IG11c3QgY2FsbCBjb250cm9scy51cGRhdGUoKSBpbiB5b3VyIGFuaW1hdGlvbiBsb29wCiAgICAJdGhpcy5hdXRvUm90YXRlID0gZmFsc2U7CiAgICAJdGhpcy5hdXRvUm90YXRlU3BlZWQgPSAyLjA7IC8vIDMwIHNlY29uZHMgcGVyIHJvdW5kIHdoZW4gZnBzIGlzIDYwCgogICAgCS8vIFNldCB0byBmYWxzZSB0byBkaXNhYmxlIHVzZSBvZiB0aGUga2V5cwogICAgCXRoaXMuZW5hYmxlS2V5cyA9IHRydWU7CgogICAgCS8vIFRoZSBmb3VyIGFycm93IGtleXMKICAgIAl0aGlzLmtleXMgPSB7IExFRlQ6IDM3LCBVUDogMzgsIFJJR0hUOiAzOSwgQk9UVE9NOiA0MCB9OwoKICAgIAkvLyBNb3VzZSBidXR0b25zCiAgICAJdGhpcy5tb3VzZUJ1dHRvbnMgPSB7IExFRlQ6IE1PVVNFLlJPVEFURSwgTUlERExFOiBNT1VTRS5ET0xMWSwgUklHSFQ6IE1PVVNFLlBBTiB9OwoKICAgIAkvLyBUb3VjaCBmaW5nZXJzCiAgICAJdGhpcy50b3VjaGVzID0geyBPTkU6IFRPVUNILlJPVEFURSwgVFdPOiBUT1VDSC5ET0xMWV9QQU4gfTsKCiAgICAJLy8gZm9yIHJlc2V0CiAgICAJdGhpcy50YXJnZXQwID0gdGhpcy50YXJnZXQuY2xvbmUoKTsKICAgIAl0aGlzLnBvc2l0aW9uMCA9IHRoaXMub2JqZWN0LnBvc2l0aW9uLmNsb25lKCk7CiAgICAJdGhpcy56b29tMCA9IHRoaXMub2JqZWN0Lnpvb207CgogICAgCS8vCiAgICAJLy8gcHVibGljIG1ldGhvZHMKICAgIAkvLwoKICAgIAl0aGlzLmdldFBvbGFyQW5nbGUgPSBmdW5jdGlvbiAoKSB7CgogICAgCQlyZXR1cm4gc3BoZXJpY2FsLnBoaTsKCiAgICAJfTsKCiAgICAJdGhpcy5nZXRBemltdXRoYWxBbmdsZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXJldHVybiBzcGhlcmljYWwudGhldGE7CgogICAgCX07CgogICAgCXRoaXMuc2F2ZVN0YXRlID0gZnVuY3Rpb24gKCkgewoKICAgIAkJc2NvcGUudGFyZ2V0MC5jb3B5KCBzY29wZS50YXJnZXQgKTsKICAgIAkJc2NvcGUucG9zaXRpb24wLmNvcHkoIHNjb3BlLm9iamVjdC5wb3NpdGlvbiApOwogICAgCQlzY29wZS56b29tMCA9IHNjb3BlLm9iamVjdC56b29tOwoKICAgIAl9OwoKICAgIAl0aGlzLnJlc2V0ID0gZnVuY3Rpb24gKCkgewoKICAgIAkJc2NvcGUudGFyZ2V0LmNvcHkoIHNjb3BlLnRhcmdldDAgKTsKICAgIAkJc2NvcGUub2JqZWN0LnBvc2l0aW9uLmNvcHkoIHNjb3BlLnBvc2l0aW9uMCApOwogICAgCQlzY29wZS5vYmplY3Quem9vbSA9IHNjb3BlLnpvb20wOwoKICAgIAkJc2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgIAkJc2NvcGUuZGlzcGF0Y2hFdmVudCggY2hhbmdlRXZlbnQgKTsKCiAgICAJCXNjb3BlLnVwZGF0ZSgpOwoKICAgIAkJc3RhdGUgPSBTVEFURS5OT05FOwoKICAgIAl9OwoKICAgIAkvLyB0aGlzIG1ldGhvZCBpcyBleHBvc2VkLCBidXQgcGVyaGFwcyBpdCB3b3VsZCBiZSBiZXR0ZXIgaWYgd2UgY2FuIG1ha2UgaXQgcHJpdmF0ZS4uLgogICAgCXRoaXMudXBkYXRlID0gZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQkvLyBzbyBjYW1lcmEudXAgaXMgdGhlIG9yYml0IGF4aXMKICAgIAkJdmFyIHF1YXQgPSBuZXcgUXVhdGVybmlvbigpLnNldEZyb21Vbml0VmVjdG9ycyggb2JqZWN0LnVwLCBuZXcgVmVjdG9yMyggMCwgMSwgMCApICk7CiAgICAJCXZhciBxdWF0SW52ZXJzZSA9IHF1YXQuY2xvbmUoKS5pbnZlcnNlKCk7CgogICAgCQl2YXIgbGFzdFBvc2l0aW9uID0gbmV3IFZlY3RvcjMoKTsKICAgIAkJdmFyIGxhc3RRdWF0ZXJuaW9uID0gbmV3IFF1YXRlcm5pb24oKTsKCiAgICAJCXJldHVybiBmdW5jdGlvbiB1cGRhdGUoKSB7CgogICAgCQkJdmFyIHBvc2l0aW9uID0gc2NvcGUub2JqZWN0LnBvc2l0aW9uOwoKICAgIAkJCW9mZnNldC5jb3B5KCBwb3NpdGlvbiApLnN1Yiggc2NvcGUudGFyZ2V0ICk7CgogICAgCQkJLy8gcm90YXRlIG9mZnNldCB0byAieS1heGlzLWlzLXVwIiBzcGFjZQogICAgCQkJb2Zmc2V0LmFwcGx5UXVhdGVybmlvbiggcXVhdCApOwoKICAgIAkJCS8vIGFuZ2xlIGZyb20gei1heGlzIGFyb3VuZCB5LWF4aXMKICAgIAkJCXNwaGVyaWNhbC5zZXRGcm9tVmVjdG9yMyggb2Zmc2V0ICk7CgogICAgCQkJaWYgKCBzY29wZS5hdXRvUm90YXRlICYmIHN0YXRlID09PSBTVEFURS5OT05FICkgewoKICAgIAkJCQlyb3RhdGVMZWZ0KCBnZXRBdXRvUm90YXRpb25BbmdsZSgpICk7CgogICAgCQkJfQoKICAgIAkJCWlmICggc2NvcGUuZW5hYmxlRGFtcGluZyApIHsKCiAgICAJCQkJc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhICogc2NvcGUuZGFtcGluZ0ZhY3RvcjsKICAgIAkJCQlzcGhlcmljYWwucGhpICs9IHNwaGVyaWNhbERlbHRhLnBoaSAqIHNjb3BlLmRhbXBpbmdGYWN0b3I7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJc3BoZXJpY2FsLnRoZXRhICs9IHNwaGVyaWNhbERlbHRhLnRoZXRhOwogICAgCQkJCXNwaGVyaWNhbC5waGkgKz0gc3BoZXJpY2FsRGVsdGEucGhpOwoKICAgIAkJCX0KCiAgICAJCQkvLyByZXN0cmljdCB0aGV0YSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzCiAgICAJCQlzcGhlcmljYWwudGhldGEgPSBNYXRoLm1heCggc2NvcGUubWluQXppbXV0aEFuZ2xlLCBNYXRoLm1pbiggc2NvcGUubWF4QXppbXV0aEFuZ2xlLCBzcGhlcmljYWwudGhldGEgKSApOwoKICAgIAkJCS8vIHJlc3RyaWN0IHBoaSB0byBiZSBiZXR3ZWVuIGRlc2lyZWQgbGltaXRzCiAgICAJCQlzcGhlcmljYWwucGhpID0gTWF0aC5tYXgoIHNjb3BlLm1pblBvbGFyQW5nbGUsIE1hdGgubWluKCBzY29wZS5tYXhQb2xhckFuZ2xlLCBzcGhlcmljYWwucGhpICkgKTsKCiAgICAJCQlzcGhlcmljYWwubWFrZVNhZmUoKTsKCgogICAgCQkJc3BoZXJpY2FsLnJhZGl1cyAqPSBzY2FsZTsKCiAgICAJCQkvLyByZXN0cmljdCByYWRpdXMgdG8gYmUgYmV0d2VlbiBkZXNpcmVkIGxpbWl0cwogICAgCQkJc3BoZXJpY2FsLnJhZGl1cyA9IE1hdGgubWF4KCBzY29wZS5taW5EaXN0YW5jZSwgTWF0aC5taW4oIHNjb3BlLm1heERpc3RhbmNlLCBzcGhlcmljYWwucmFkaXVzICkgKTsKCiAgICAJCQkvLyBtb3ZlIHRhcmdldCB0byBwYW5uZWQgbG9jYXRpb24KCiAgICAJCQlpZiAoIHNjb3BlLmVuYWJsZURhbXBpbmcgPT09IHRydWUgKSB7CgogICAgCQkJCXNjb3BlLnRhcmdldC5hZGRTY2FsZWRWZWN0b3IoIHBhbk9mZnNldCwgc2NvcGUuZGFtcGluZ0ZhY3RvciApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCXNjb3BlLnRhcmdldC5hZGQoIHBhbk9mZnNldCApOwoKICAgIAkJCX0KCiAgICAJCQlvZmZzZXQuc2V0RnJvbVNwaGVyaWNhbCggc3BoZXJpY2FsICk7CgogICAgCQkJLy8gcm90YXRlIG9mZnNldCBiYWNrIHRvICJjYW1lcmEtdXAtdmVjdG9yLWlzLXVwIiBzcGFjZQogICAgCQkJb2Zmc2V0LmFwcGx5UXVhdGVybmlvbiggcXVhdEludmVyc2UgKTsKCiAgICAJCQlwb3NpdGlvbi5jb3B5KCBzY29wZS50YXJnZXQgKS5hZGQoIG9mZnNldCApOwoKICAgIAkJCXNjb3BlLm9iamVjdC5sb29rQXQoIHNjb3BlLnRhcmdldCApOwoKICAgIAkJCWlmICggc2NvcGUuZW5hYmxlRGFtcGluZyA9PT0gdHJ1ZSApIHsKCiAgICAJCQkJc3BoZXJpY2FsRGVsdGEudGhldGEgKj0gKCAxIC0gc2NvcGUuZGFtcGluZ0ZhY3RvciApOwogICAgCQkJCXNwaGVyaWNhbERlbHRhLnBoaSAqPSAoIDEgLSBzY29wZS5kYW1waW5nRmFjdG9yICk7CgogICAgCQkJCXBhbk9mZnNldC5tdWx0aXBseVNjYWxhciggMSAtIHNjb3BlLmRhbXBpbmdGYWN0b3IgKTsKCiAgICAJCQl9IGVsc2UgewoKICAgIAkJCQlzcGhlcmljYWxEZWx0YS5zZXQoIDAsIDAsIDAgKTsKCiAgICAJCQkJcGFuT2Zmc2V0LnNldCggMCwgMCwgMCApOwoKICAgIAkJCX0KCiAgICAJCQlzY2FsZSA9IDE7CgogICAgCQkJLy8gdXBkYXRlIGNvbmRpdGlvbiBpczoKICAgIAkJCS8vIG1pbihjYW1lcmEgZGlzcGxhY2VtZW50LCBjYW1lcmEgcm90YXRpb24gaW4gcmFkaWFucyleMiA+IEVQUwogICAgCQkJLy8gdXNpbmcgc21hbGwtYW5nbGUgYXBwcm94aW1hdGlvbiBjb3MoeC8yKSA9IDEgLSB4XjIgLyA4CgogICAgCQkJaWYgKCB6b29tQ2hhbmdlZCB8fAogICAgCQkJCWxhc3RQb3NpdGlvbi5kaXN0YW5jZVRvU3F1YXJlZCggc2NvcGUub2JqZWN0LnBvc2l0aW9uICkgPiBFUFMgfHwKICAgIAkJCQk4ICogKCAxIC0gbGFzdFF1YXRlcm5pb24uZG90KCBzY29wZS5vYmplY3QucXVhdGVybmlvbiApICkgPiBFUFMgKSB7CgogICAgCQkJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGNoYW5nZUV2ZW50ICk7CgogICAgCQkJCWxhc3RQb3NpdGlvbi5jb3B5KCBzY29wZS5vYmplY3QucG9zaXRpb24gKTsKICAgIAkJCQlsYXN0UXVhdGVybmlvbi5jb3B5KCBzY29wZS5vYmplY3QucXVhdGVybmlvbiApOwogICAgCQkJCXpvb21DaGFuZ2VkID0gZmFsc2U7CgogICAgCQkJCXJldHVybiB0cnVlOwoKICAgIAkJCX0KCiAgICAJCQlyZXR1cm4gZmFsc2U7CgogICAgCQl9OwoKICAgIAl9KCk7CgogICAgCXRoaXMuZGlzcG9zZSA9IGZ1bmN0aW9uICgpIHsKCiAgICAJCXNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2NvbnRleHRtZW51Jywgb25Db250ZXh0TWVudSwgZmFsc2UgKTsKICAgIAkJc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2Vkb3duJywgb25Nb3VzZURvd24sIGZhbHNlICk7CiAgICAJCXNjb3BlLmRvbUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3doZWVsJywgb25Nb3VzZVdoZWVsLCBmYWxzZSApOwoKICAgIAkJc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAndG91Y2hzdGFydCcsIG9uVG91Y2hTdGFydCwgZmFsc2UgKTsKICAgIAkJc2NvcGUuZG9tRWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAndG91Y2hlbmQnLCBvblRvdWNoRW5kLCBmYWxzZSApOwogICAgCQlzY29wZS5kb21FbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UgKTsKCiAgICAJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UgKTsKICAgIAkJZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ21vdXNldXAnLCBvbk1vdXNlVXAsIGZhbHNlICk7CgogICAgCQl3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2tleWRvd24nLCBvbktleURvd24sIGZhbHNlICk7CgogICAgCQkvL3Njb3BlLmRpc3BhdGNoRXZlbnQoIHsgdHlwZTogJ2Rpc3Bvc2UnIH0gKTsgLy8gc2hvdWxkIHRoaXMgYmUgYWRkZWQgaGVyZT8KCiAgICAJfTsKCiAgICAJLy8KICAgIAkvLyBpbnRlcm5hbHMKICAgIAkvLwoKICAgIAl2YXIgc2NvcGUgPSB0aGlzOwoKICAgIAl2YXIgY2hhbmdlRXZlbnQgPSB7IHR5cGU6ICdjaGFuZ2UnIH07CiAgICAJdmFyIHN0YXJ0RXZlbnQgPSB7IHR5cGU6ICdzdGFydCcgfTsKICAgIAl2YXIgZW5kRXZlbnQgPSB7IHR5cGU6ICdlbmQnIH07CgogICAgCXZhciBTVEFURSA9IHsKICAgIAkJTk9ORTogLSAxLAogICAgCQlST1RBVEU6IDAsCiAgICAJCURPTExZOiAxLAogICAgCQlQQU46IDIsCiAgICAJCVRPVUNIX1JPVEFURTogMywKICAgIAkJVE9VQ0hfUEFOOiA0LAogICAgCQlUT1VDSF9ET0xMWV9QQU46IDUsCiAgICAJCVRPVUNIX0RPTExZX1JPVEFURTogNgogICAgCX07CgogICAgCXZhciBzdGF0ZSA9IFNUQVRFLk5PTkU7CgogICAgCXZhciBFUFMgPSAwLjAwMDAwMTsKCiAgICAJLy8gY3VycmVudCBwb3NpdGlvbiBpbiBzcGhlcmljYWwgY29vcmRpbmF0ZXMKICAgIAl2YXIgc3BoZXJpY2FsID0gbmV3IFNwaGVyaWNhbCgpOwogICAgCXZhciBzcGhlcmljYWxEZWx0YSA9IG5ldyBTcGhlcmljYWwoKTsKCiAgICAJdmFyIHNjYWxlID0gMTsKICAgIAl2YXIgcGFuT2Zmc2V0ID0gbmV3IFZlY3RvcjMoKTsKICAgIAl2YXIgem9vbUNoYW5nZWQgPSBmYWxzZTsKCiAgICAJdmFyIHJvdGF0ZVN0YXJ0ID0gbmV3IFZlY3RvcjIoKTsKICAgIAl2YXIgcm90YXRlRW5kID0gbmV3IFZlY3RvcjIoKTsKICAgIAl2YXIgcm90YXRlRGVsdGEgPSBuZXcgVmVjdG9yMigpOwoKICAgIAl2YXIgcGFuU3RhcnQgPSBuZXcgVmVjdG9yMigpOwogICAgCXZhciBwYW5FbmQgPSBuZXcgVmVjdG9yMigpOwogICAgCXZhciBwYW5EZWx0YSA9IG5ldyBWZWN0b3IyKCk7CgogICAgCXZhciBkb2xseVN0YXJ0ID0gbmV3IFZlY3RvcjIoKTsKICAgIAl2YXIgZG9sbHlFbmQgPSBuZXcgVmVjdG9yMigpOwogICAgCXZhciBkb2xseURlbHRhID0gbmV3IFZlY3RvcjIoKTsKCiAgICAJZnVuY3Rpb24gZ2V0QXV0b1JvdGF0aW9uQW5nbGUoKSB7CgogICAgCQlyZXR1cm4gMiAqIE1hdGguUEkgLyA2MCAvIDYwICogc2NvcGUuYXV0b1JvdGF0ZVNwZWVkOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGdldFpvb21TY2FsZSgpIHsKCiAgICAJCXJldHVybiBNYXRoLnBvdyggMC45NSwgc2NvcGUuem9vbVNwZWVkICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gcm90YXRlTGVmdCggYW5nbGUgKSB7CgogICAgCQlzcGhlcmljYWxEZWx0YS50aGV0YSAtPSBhbmdsZTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiByb3RhdGVVcCggYW5nbGUgKSB7CgogICAgCQlzcGhlcmljYWxEZWx0YS5waGkgLT0gYW5nbGU7CgogICAgCX0KCiAgICAJdmFyIHBhbkxlZnQgPSBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQlyZXR1cm4gZnVuY3Rpb24gcGFuTGVmdCggZGlzdGFuY2UsIG9iamVjdE1hdHJpeCApIHsKCiAgICAJCQl2LnNldEZyb21NYXRyaXhDb2x1bW4oIG9iamVjdE1hdHJpeCwgMCApOyAvLyBnZXQgWCBjb2x1bW4gb2Ygb2JqZWN0TWF0cml4CiAgICAJCQl2Lm11bHRpcGx5U2NhbGFyKCAtIGRpc3RhbmNlICk7CgogICAgCQkJcGFuT2Zmc2V0LmFkZCggdiApOwoKICAgIAkJfTsKCiAgICAJfSgpOwoKICAgIAl2YXIgcGFuVXAgPSBmdW5jdGlvbiAoKSB7CgogICAgCQl2YXIgdiA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQlyZXR1cm4gZnVuY3Rpb24gcGFuVXAoIGRpc3RhbmNlLCBvYmplY3RNYXRyaXggKSB7CgogICAgCQkJaWYgKCBzY29wZS5zY3JlZW5TcGFjZVBhbm5pbmcgPT09IHRydWUgKSB7CgogICAgCQkJCXYuc2V0RnJvbU1hdHJpeENvbHVtbiggb2JqZWN0TWF0cml4LCAxICk7CgogICAgCQkJfSBlbHNlIHsKCiAgICAJCQkJdi5zZXRGcm9tTWF0cml4Q29sdW1uKCBvYmplY3RNYXRyaXgsIDAgKTsKICAgIAkJCQl2LmNyb3NzVmVjdG9ycyggc2NvcGUub2JqZWN0LnVwLCB2ICk7CgogICAgCQkJfQoKICAgIAkJCXYubXVsdGlwbHlTY2FsYXIoIGRpc3RhbmNlICk7CgogICAgCQkJcGFuT2Zmc2V0LmFkZCggdiApOwoKICAgIAkJfTsKCiAgICAJfSgpOwoKICAgIAkvLyBkZWx0YVggYW5kIGRlbHRhWSBhcmUgaW4gcGl4ZWxzOyByaWdodCBhbmQgZG93biBhcmUgcG9zaXRpdmUKICAgIAl2YXIgcGFuID0gZnVuY3Rpb24gKCkgewoKICAgIAkJdmFyIG9mZnNldCA9IG5ldyBWZWN0b3IzKCk7CgogICAgCQlyZXR1cm4gZnVuY3Rpb24gcGFuKCBkZWx0YVgsIGRlbHRhWSApIHsKCiAgICAJCQl2YXIgZWxlbWVudCA9IHNjb3BlLmRvbUVsZW1lbnQgPT09IGRvY3VtZW50ID8gc2NvcGUuZG9tRWxlbWVudC5ib2R5IDogc2NvcGUuZG9tRWxlbWVudDsKCiAgICAJCQlpZiAoIHNjb3BlLm9iamVjdC5pc1BlcnNwZWN0aXZlQ2FtZXJhICkgewoKICAgIAkJCQkvLyBwZXJzcGVjdGl2ZQogICAgCQkJCXZhciBwb3NpdGlvbiA9IHNjb3BlLm9iamVjdC5wb3NpdGlvbjsKICAgIAkJCQlvZmZzZXQuY29weSggcG9zaXRpb24gKS5zdWIoIHNjb3BlLnRhcmdldCApOwogICAgCQkJCXZhciB0YXJnZXREaXN0YW5jZSA9IG9mZnNldC5sZW5ndGgoKTsKCiAgICAJCQkJLy8gaGFsZiBvZiB0aGUgZm92IGlzIGNlbnRlciB0byB0b3Agb2Ygc2NyZWVuCiAgICAJCQkJdGFyZ2V0RGlzdGFuY2UgKj0gTWF0aC50YW4oICggc2NvcGUub2JqZWN0LmZvdiAvIDIgKSAqIE1hdGguUEkgLyAxODAuMCApOwoKICAgIAkJCQkvLyB3ZSB1c2Ugb25seSBjbGllbnRIZWlnaHQgaGVyZSBzbyBhc3BlY3QgcmF0aW8gZG9lcyBub3QgZGlzdG9ydCBzcGVlZAogICAgCQkJCXBhbkxlZnQoIDIgKiBkZWx0YVggKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4ICk7CiAgICAJCQkJcGFuVXAoIDIgKiBkZWx0YVkgKiB0YXJnZXREaXN0YW5jZSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0LCBzY29wZS5vYmplY3QubWF0cml4ICk7CgogICAgCQkJfSBlbHNlIGlmICggc2NvcGUub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhICkgewoKICAgIAkJCQkvLyBvcnRob2dyYXBoaWMKICAgIAkJCQlwYW5MZWZ0KCBkZWx0YVggKiAoIHNjb3BlLm9iamVjdC5yaWdodCAtIHNjb3BlLm9iamVjdC5sZWZ0ICkgLyBzY29wZS5vYmplY3Quem9vbSAvIGVsZW1lbnQuY2xpZW50V2lkdGgsIHNjb3BlLm9iamVjdC5tYXRyaXggKTsKICAgIAkJCQlwYW5VcCggZGVsdGFZICogKCBzY29wZS5vYmplY3QudG9wIC0gc2NvcGUub2JqZWN0LmJvdHRvbSApIC8gc2NvcGUub2JqZWN0Lnpvb20gLyBlbGVtZW50LmNsaWVudEhlaWdodCwgc2NvcGUub2JqZWN0Lm1hdHJpeCApOwoKICAgIAkJCX0gZWxzZSB7CgogICAgCQkJCS8vIGNhbWVyYSBuZWl0aGVyIG9ydGhvZ3JhcGhpYyBub3IgcGVyc3BlY3RpdmUKICAgIAkJCQljb25zb2xlLndhcm4oICdXQVJOSU5HOiBPcmJpdENvbnRyb2xzLmpzIGVuY291bnRlcmVkIGFuIHVua25vd24gY2FtZXJhIHR5cGUgLSBwYW4gZGlzYWJsZWQuJyApOwogICAgCQkJCXNjb3BlLmVuYWJsZVBhbiA9IGZhbHNlOwoKICAgIAkJCX0KCiAgICAJCX07CgogICAgCX0oKTsKCiAgICAJZnVuY3Rpb24gZG9sbHlJbiggZG9sbHlTY2FsZSApIHsKCiAgICAJCWlmICggc2NvcGUub2JqZWN0LmlzUGVyc3BlY3RpdmVDYW1lcmEgKSB7CgogICAgCQkJc2NhbGUgLz0gZG9sbHlTY2FsZTsKCiAgICAJCX0gZWxzZSBpZiAoIHNjb3BlLm9iamVjdC5pc09ydGhvZ3JhcGhpY0NhbWVyYSApIHsKCiAgICAJCQlzY29wZS5vYmplY3Quem9vbSA9IE1hdGgubWF4KCBzY29wZS5taW5ab29tLCBNYXRoLm1pbiggc2NvcGUubWF4Wm9vbSwgc2NvcGUub2JqZWN0Lnpvb20gKiBkb2xseVNjYWxlICkgKTsKICAgIAkJCXNjb3BlLm9iamVjdC51cGRhdGVQcm9qZWN0aW9uTWF0cml4KCk7CiAgICAJCQl6b29tQ2hhbmdlZCA9IHRydWU7CgogICAgCQl9IGVsc2UgewoKICAgIAkJCWNvbnNvbGUud2FybiggJ1dBUk5JTkc6IE9yYml0Q29udHJvbHMuanMgZW5jb3VudGVyZWQgYW4gdW5rbm93biBjYW1lcmEgdHlwZSAtIGRvbGx5L3pvb20gZGlzYWJsZWQuJyApOwogICAgCQkJc2NvcGUuZW5hYmxlWm9vbSA9IGZhbHNlOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGRvbGx5T3V0KCBkb2xseVNjYWxlICkgewoKICAgIAkJaWYgKCBzY29wZS5vYmplY3QuaXNQZXJzcGVjdGl2ZUNhbWVyYSApIHsKCiAgICAJCQlzY2FsZSAqPSBkb2xseVNjYWxlOwoKICAgIAkJfSBlbHNlIGlmICggc2NvcGUub2JqZWN0LmlzT3J0aG9ncmFwaGljQ2FtZXJhICkgewoKICAgIAkJCXNjb3BlLm9iamVjdC56b29tID0gTWF0aC5tYXgoIHNjb3BlLm1pblpvb20sIE1hdGgubWluKCBzY29wZS5tYXhab29tLCBzY29wZS5vYmplY3Quem9vbSAvIGRvbGx5U2NhbGUgKSApOwogICAgCQkJc2NvcGUub2JqZWN0LnVwZGF0ZVByb2plY3Rpb25NYXRyaXgoKTsKICAgIAkJCXpvb21DaGFuZ2VkID0gdHJ1ZTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJY29uc29sZS53YXJuKCAnV0FSTklORzogT3JiaXRDb250cm9scy5qcyBlbmNvdW50ZXJlZCBhbiB1bmtub3duIGNhbWVyYSB0eXBlIC0gZG9sbHkvem9vbSBkaXNhYmxlZC4nICk7CiAgICAJCQlzY29wZS5lbmFibGVab29tID0gZmFsc2U7CgogICAgCQl9CgogICAgCX0KCiAgICAJLy8KICAgIAkvLyBldmVudCBjYWxsYmFja3MgLSB1cGRhdGUgdGhlIG9iamVjdCBzdGF0ZQogICAgCS8vCgogICAgCWZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blJvdGF0ZSggZXZlbnQgKSB7CgogICAgCQlyb3RhdGVTdGFydC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBoYW5kbGVNb3VzZURvd25Eb2xseSggZXZlbnQgKSB7CgogICAgCQlkb2xseVN0YXJ0LnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGhhbmRsZU1vdXNlRG93blBhbiggZXZlbnQgKSB7CgogICAgCQlwYW5TdGFydC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBoYW5kbGVNb3VzZU1vdmVSb3RhdGUoIGV2ZW50ICkgewoKICAgIAkJcm90YXRlRW5kLnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOwoKICAgIAkJcm90YXRlRGVsdGEuc3ViVmVjdG9ycyggcm90YXRlRW5kLCByb3RhdGVTdGFydCApLm11bHRpcGx5U2NhbGFyKCBzY29wZS5yb3RhdGVTcGVlZCApOwoKICAgIAkJdmFyIGVsZW1lbnQgPSBzY29wZS5kb21FbGVtZW50ID09PSBkb2N1bWVudCA/IHNjb3BlLmRvbUVsZW1lbnQuYm9keSA6IHNjb3BlLmRvbUVsZW1lbnQ7CgogICAgCQlyb3RhdGVMZWZ0KCAyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnggLyBlbGVtZW50LmNsaWVudEhlaWdodCApOyAvLyB5ZXMsIGhlaWdodAoKICAgIAkJcm90YXRlVXAoIDIgKiBNYXRoLlBJICogcm90YXRlRGVsdGEueSAvIGVsZW1lbnQuY2xpZW50SGVpZ2h0ICk7CgogICAgCQlyb3RhdGVTdGFydC5jb3B5KCByb3RhdGVFbmQgKTsKCiAgICAJCXNjb3BlLnVwZGF0ZSgpOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGhhbmRsZU1vdXNlTW92ZURvbGx5KCBldmVudCApIHsKCiAgICAJCWRvbGx5RW5kLnNldCggZXZlbnQuY2xpZW50WCwgZXZlbnQuY2xpZW50WSApOwoKICAgIAkJZG9sbHlEZWx0YS5zdWJWZWN0b3JzKCBkb2xseUVuZCwgZG9sbHlTdGFydCApOwoKICAgIAkJaWYgKCBkb2xseURlbHRhLnkgPiAwICkgewoKICAgIAkJCWRvbGx5SW4oIGdldFpvb21TY2FsZSgpICk7CgogICAgCQl9IGVsc2UgaWYgKCBkb2xseURlbHRhLnkgPCAwICkgewoKICAgIAkJCWRvbGx5T3V0KCBnZXRab29tU2NhbGUoKSApOwoKICAgIAkJfQoKICAgIAkJZG9sbHlTdGFydC5jb3B5KCBkb2xseUVuZCApOwoKICAgIAkJc2NvcGUudXBkYXRlKCk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlTW91c2VNb3ZlUGFuKCBldmVudCApIHsKCiAgICAJCXBhbkVuZC5zZXQoIGV2ZW50LmNsaWVudFgsIGV2ZW50LmNsaWVudFkgKTsKCiAgICAJCXBhbkRlbHRhLnN1YlZlY3RvcnMoIHBhbkVuZCwgcGFuU3RhcnQgKS5tdWx0aXBseVNjYWxhciggc2NvcGUucGFuU3BlZWQgKTsKCiAgICAJCXBhbiggcGFuRGVsdGEueCwgcGFuRGVsdGEueSApOwoKICAgIAkJcGFuU3RhcnQuY29weSggcGFuRW5kICk7CgogICAgCQlzY29wZS51cGRhdGUoKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBoYW5kbGVNb3VzZVdoZWVsKCBldmVudCApIHsKCiAgICAJCWlmICggZXZlbnQuZGVsdGFZIDwgMCApIHsKCiAgICAJCQlkb2xseU91dCggZ2V0Wm9vbVNjYWxlKCkgKTsKCiAgICAJCX0gZWxzZSBpZiAoIGV2ZW50LmRlbHRhWSA+IDAgKSB7CgogICAgCQkJZG9sbHlJbiggZ2V0Wm9vbVNjYWxlKCkgKTsKCiAgICAJCX0KCiAgICAJCXNjb3BlLnVwZGF0ZSgpOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGhhbmRsZUtleURvd24oIGV2ZW50ICkgewoKICAgIAkJdmFyIG5lZWRzVXBkYXRlID0gZmFsc2U7CgogICAgCQlzd2l0Y2ggKCBldmVudC5rZXlDb2RlICkgewoKICAgIAkJCWNhc2Ugc2NvcGUua2V5cy5VUDoKICAgIAkJCQlwYW4oIDAsIHNjb3BlLmtleVBhblNwZWVkICk7CiAgICAJCQkJbmVlZHNVcGRhdGUgPSB0cnVlOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2Ugc2NvcGUua2V5cy5CT1RUT006CiAgICAJCQkJcGFuKCAwLCAtIHNjb3BlLmtleVBhblNwZWVkICk7CiAgICAJCQkJbmVlZHNVcGRhdGUgPSB0cnVlOwogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2Ugc2NvcGUua2V5cy5MRUZUOgogICAgCQkJCXBhbiggc2NvcGUua2V5UGFuU3BlZWQsIDAgKTsKICAgIAkJCQluZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSBzY29wZS5rZXlzLlJJR0hUOgogICAgCQkJCXBhbiggLSBzY29wZS5rZXlQYW5TcGVlZCwgMCApOwogICAgCQkJCW5lZWRzVXBkYXRlID0gdHJ1ZTsKICAgIAkJCQlicmVhazsKCiAgICAJCX0KCiAgICAJCWlmICggbmVlZHNVcGRhdGUgKSB7CgogICAgCQkJLy8gcHJldmVudCB0aGUgYnJvd3NlciBmcm9tIHNjcm9sbGluZyBvbiBjdXJzb3Iga2V5cwogICAgCQkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCiAgICAJCQlzY29wZS51cGRhdGUoKTsKCiAgICAJCX0KCgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFJvdGF0ZSggZXZlbnQgKSB7CgogICAgCQlpZiAoIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09IDEgKSB7CgogICAgCQkJcm90YXRlU3RhcnQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl2YXIgeCA9IDAuNSAqICggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYICsgZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VYICk7CiAgICAJCQl2YXIgeSA9IDAuNSAqICggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZICsgZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VZICk7CgogICAgCQkJcm90YXRlU3RhcnQuc2V0KCB4LCB5ICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydFBhbiggZXZlbnQgKSB7CgogICAgCQlpZiAoIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09IDEgKSB7CgogICAgCQkJcGFuU3RhcnQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl2YXIgeCA9IDAuNSAqICggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYICsgZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VYICk7CiAgICAJCQl2YXIgeSA9IDAuNSAqICggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZICsgZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VZICk7CgogICAgCQkJcGFuU3RhcnQuc2V0KCB4LCB5ICk7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydERvbGx5KCBldmVudCApIHsKCiAgICAJCXZhciBkeCA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWCAtIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWDsKICAgIAkJdmFyIGR5ID0gZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZIC0gZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VZOwoKICAgIAkJdmFyIGRpc3RhbmNlID0gTWF0aC5zcXJ0KCBkeCAqIGR4ICsgZHkgKiBkeSApOwoKICAgIAkJZG9sbHlTdGFydC5zZXQoIDAsIGRpc3RhbmNlICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlVG91Y2hTdGFydERvbGx5UGFuKCBldmVudCApIHsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlWm9vbSApIGhhbmRsZVRvdWNoU3RhcnREb2xseSggZXZlbnQgKTsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlUGFuICkgaGFuZGxlVG91Y2hTdGFydFBhbiggZXZlbnQgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBoYW5kbGVUb3VjaFN0YXJ0RG9sbHlSb3RhdGUoIGV2ZW50ICkgewoKICAgIAkJaWYgKCBzY29wZS5lbmFibGVab29tICkgaGFuZGxlVG91Y2hTdGFydERvbGx5KCBldmVudCApOwoKICAgIAkJaWYgKCBzY29wZS5lbmFibGVSb3RhdGUgKSBoYW5kbGVUb3VjaFN0YXJ0Um90YXRlKCBldmVudCApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZSggZXZlbnQgKSB7CgogICAgCQlpZiAoIGV2ZW50LnRvdWNoZXMubGVuZ3RoID09IDEgKSB7CgogICAgCQkJcm90YXRlRW5kLnNldCggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYLCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVkgKTsKCiAgICAJCX0gZWxzZSB7CgogICAgCQkJdmFyIHggPSAwLjUgKiAoIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWCArIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWCApOwogICAgCQkJdmFyIHkgPSAwLjUgKiAoIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSArIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWSApOwoKICAgIAkJCXJvdGF0ZUVuZC5zZXQoIHgsIHkgKTsKCiAgICAJCX0KCiAgICAJCXJvdGF0ZURlbHRhLnN1YlZlY3RvcnMoIHJvdGF0ZUVuZCwgcm90YXRlU3RhcnQgKS5tdWx0aXBseVNjYWxhciggc2NvcGUucm90YXRlU3BlZWQgKTsKCiAgICAJCXZhciBlbGVtZW50ID0gc2NvcGUuZG9tRWxlbWVudCA9PT0gZG9jdW1lbnQgPyBzY29wZS5kb21FbGVtZW50LmJvZHkgOiBzY29wZS5kb21FbGVtZW50OwoKICAgIAkJcm90YXRlTGVmdCggMiAqIE1hdGguUEkgKiByb3RhdGVEZWx0YS54IC8gZWxlbWVudC5jbGllbnRIZWlnaHQgKTsgLy8geWVzLCBoZWlnaHQKCiAgICAJCXJvdGF0ZVVwKCAyICogTWF0aC5QSSAqIHJvdGF0ZURlbHRhLnkgLyBlbGVtZW50LmNsaWVudEhlaWdodCApOwoKICAgIAkJcm90YXRlU3RhcnQuY29weSggcm90YXRlRW5kICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlUGFuKCBldmVudCApIHsKCiAgICAJCWlmICggZXZlbnQudG91Y2hlcy5sZW5ndGggPT0gMSApIHsKCiAgICAJCQlwYW5FbmQuc2V0KCBldmVudC50b3VjaGVzWyAwIF0ucGFnZVgsIGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSApOwoKICAgIAkJfSBlbHNlIHsKCiAgICAJCQl2YXIgeCA9IDAuNSAqICggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VYICsgZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VYICk7CiAgICAJCQl2YXIgeSA9IDAuNSAqICggZXZlbnQudG91Y2hlc1sgMCBdLnBhZ2VZICsgZXZlbnQudG91Y2hlc1sgMSBdLnBhZ2VZICk7CgogICAgCQkJcGFuRW5kLnNldCggeCwgeSApOwoKICAgIAkJfQoKICAgIAkJcGFuRGVsdGEuc3ViVmVjdG9ycyggcGFuRW5kLCBwYW5TdGFydCApLm11bHRpcGx5U2NhbGFyKCBzY29wZS5wYW5TcGVlZCApOwoKICAgIAkJcGFuKCBwYW5EZWx0YS54LCBwYW5EZWx0YS55ICk7CgogICAgCQlwYW5TdGFydC5jb3B5KCBwYW5FbmQgKTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBoYW5kbGVUb3VjaE1vdmVEb2xseSggZXZlbnQgKSB7CgogICAgCQl2YXIgZHggPSBldmVudC50b3VjaGVzWyAwIF0ucGFnZVggLSBldmVudC50b3VjaGVzWyAxIF0ucGFnZVg7CiAgICAJCXZhciBkeSA9IGV2ZW50LnRvdWNoZXNbIDAgXS5wYWdlWSAtIGV2ZW50LnRvdWNoZXNbIDEgXS5wYWdlWTsKCiAgICAJCXZhciBkaXN0YW5jZSA9IE1hdGguc3FydCggZHggKiBkeCArIGR5ICogZHkgKTsKCiAgICAJCWRvbGx5RW5kLnNldCggMCwgZGlzdGFuY2UgKTsKCiAgICAJCWRvbGx5RGVsdGEuc2V0KCAwLCBNYXRoLnBvdyggZG9sbHlFbmQueSAvIGRvbGx5U3RhcnQueSwgc2NvcGUuem9vbVNwZWVkICkgKTsKCiAgICAJCWRvbGx5SW4oIGRvbGx5RGVsdGEueSApOwoKICAgIAkJZG9sbHlTdGFydC5jb3B5KCBkb2xseUVuZCApOwoKICAgIAl9CgogICAgCWZ1bmN0aW9uIGhhbmRsZVRvdWNoTW92ZURvbGx5UGFuKCBldmVudCApIHsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlWm9vbSApIGhhbmRsZVRvdWNoTW92ZURvbGx5KCBldmVudCApOwoKICAgIAkJaWYgKCBzY29wZS5lbmFibGVQYW4gKSBoYW5kbGVUb3VjaE1vdmVQYW4oIGV2ZW50ICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gaGFuZGxlVG91Y2hNb3ZlRG9sbHlSb3RhdGUoIGV2ZW50ICkgewoKICAgIAkJaWYgKCBzY29wZS5lbmFibGVab29tICkgaGFuZGxlVG91Y2hNb3ZlRG9sbHkoIGV2ZW50ICk7CgogICAgCQlpZiAoIHNjb3BlLmVuYWJsZVJvdGF0ZSApIGhhbmRsZVRvdWNoTW92ZVJvdGF0ZSggZXZlbnQgKTsKCiAgICAJfQoKICAgIAkvLwogICAgCS8vIGV2ZW50IGhhbmRsZXJzIC0gRlNNOiBsaXN0ZW4gZm9yIGV2ZW50cyBhbmQgcmVzZXQgc3RhdGUKICAgIAkvLwoKICAgIAlmdW5jdGlvbiBvbk1vdXNlRG93biggZXZlbnQgKSB7CgogICAgCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJLy8gUHJldmVudCB0aGUgYnJvd3NlciBmcm9tIHNjcm9sbGluZy4KCiAgICAJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CgogICAgCQkvLyBNYW51YWxseSBzZXQgdGhlIGZvY3VzIHNpbmNlIGNhbGxpbmcgcHJldmVudERlZmF1bHQgYWJvdmUKICAgIAkJLy8gcHJldmVudHMgdGhlIGJyb3dzZXIgZnJvbSBzZXR0aW5nIGl0IGF1dG9tYXRpY2FsbHkuCgogICAgCQlzY29wZS5kb21FbGVtZW50LmZvY3VzID8gc2NvcGUuZG9tRWxlbWVudC5mb2N1cygpIDogd2luZG93LmZvY3VzKCk7CgogICAgCQlzd2l0Y2ggKCBldmVudC5idXR0b24gKSB7CgogICAgCQkJY2FzZSAwOgoKICAgIAkJCQlzd2l0Y2ggKCBzY29wZS5tb3VzZUJ1dHRvbnMuTEVGVCApIHsKCiAgICAJCQkJCWNhc2UgTU9VU0UuUk9UQVRFOgoKICAgIAkJCQkJCWlmICggZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5ICkgewoKICAgIAkJCQkJCQlpZiAoIHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCQkJCWhhbmRsZU1vdXNlRG93blBhbiggZXZlbnQgKTsKCiAgICAJCQkJCQkJc3RhdGUgPSBTVEFURS5QQU47CgogICAgCQkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQkJaWYgKCBzY29wZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQkJCQloYW5kbGVNb3VzZURvd25Sb3RhdGUoIGV2ZW50ICk7CgogICAgCQkJCQkJCXN0YXRlID0gU1RBVEUuUk9UQVRFOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgTU9VU0UuUEFOOgoKICAgIAkJCQkJCWlmICggZXZlbnQuY3RybEtleSB8fCBldmVudC5tZXRhS2V5IHx8IGV2ZW50LnNoaWZ0S2V5ICkgewoKICAgIAkJCQkJCQlpZiAoIHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCQkJCWhhbmRsZU1vdXNlRG93blJvdGF0ZSggZXZlbnQgKTsKCiAgICAJCQkJCQkJc3RhdGUgPSBTVEFURS5ST1RBVEU7CgogICAgCQkJCQkJfSBlbHNlIHsKCiAgICAJCQkJCQkJaWYgKCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQkJCQloYW5kbGVNb3VzZURvd25QYW4oIGV2ZW50ICk7CgogICAgCQkJCQkJCXN0YXRlID0gU1RBVEUuUEFOOwoKICAgIAkJCQkJCX0KCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWRlZmF1bHQ6CgogICAgCQkJCQkJc3RhdGUgPSBTVEFURS5OT05FOwoKICAgIAkJCQl9CgogICAgCQkJCWJyZWFrOwoKCiAgICAJCQljYXNlIDE6CgogICAgCQkJCXN3aXRjaCAoIHNjb3BlLm1vdXNlQnV0dG9ucy5NSURETEUgKSB7CgogICAgCQkJCQljYXNlIE1PVVNFLkRPTExZOgoKICAgIAkJCQkJCWlmICggc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCQkJaGFuZGxlTW91c2VEb3duRG9sbHkoIGV2ZW50ICk7CgogICAgCQkJCQkJc3RhdGUgPSBTVEFURS5ET0xMWTsKCiAgICAJCQkJCQlicmVhazsKCgogICAgCQkJCQlkZWZhdWx0OgoKICAgIAkJCQkJCXN0YXRlID0gU1RBVEUuTk9ORTsKCiAgICAJCQkJfQoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIDI6CgogICAgCQkJCXN3aXRjaCAoIHNjb3BlLm1vdXNlQnV0dG9ucy5SSUdIVCApIHsKCiAgICAJCQkJCWNhc2UgTU9VU0UuUk9UQVRFOgoKICAgIAkJCQkJCWlmICggc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCQkJCQloYW5kbGVNb3VzZURvd25Sb3RhdGUoIGV2ZW50ICk7CgogICAgCQkJCQkJc3RhdGUgPSBTVEFURS5ST1RBVEU7CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQljYXNlIE1PVVNFLlBBTjoKCiAgICAJCQkJCQlpZiAoIHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCQkJaGFuZGxlTW91c2VEb3duUGFuKCBldmVudCApOwoKICAgIAkJCQkJCXN0YXRlID0gU1RBVEUuUEFOOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJZGVmYXVsdDoKCiAgICAJCQkJCQlzdGF0ZSA9IFNUQVRFLk5PTkU7CgogICAgCQkJCX0KCiAgICAJCQkJYnJlYWs7CgogICAgCQl9CgogICAgCQlpZiAoIHN0YXRlICE9PSBTVEFURS5OT05FICkgewoKICAgIAkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZW1vdmUnLCBvbk1vdXNlTW92ZSwgZmFsc2UgKTsKICAgIAkJCWRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSApOwoKICAgIAkJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIHN0YXJ0RXZlbnQgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBvbk1vdXNlTW92ZSggZXZlbnQgKSB7CgogICAgCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCiAgICAJCXN3aXRjaCAoIHN0YXRlICkgewoKICAgIAkJCWNhc2UgU1RBVEUuUk9UQVRFOgoKICAgIAkJCQlpZiAoIHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCWhhbmRsZU1vdXNlTW92ZVJvdGF0ZSggZXZlbnQgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJY2FzZSBTVEFURS5ET0xMWToKCiAgICAJCQkJaWYgKCBzY29wZS5lbmFibGVab29tID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCQkJaGFuZGxlTW91c2VNb3ZlRG9sbHkoIGV2ZW50ICk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgU1RBVEUuUEFOOgoKICAgIAkJCQlpZiAoIHNjb3BlLmVuYWJsZVBhbiA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCWhhbmRsZU1vdXNlTW92ZVBhbiggZXZlbnQgKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQl9CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25Nb3VzZVVwKCBldmVudCApIHsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQlkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCAnbW91c2Vtb3ZlJywgb25Nb3VzZU1vdmUsIGZhbHNlICk7CiAgICAJCWRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoICdtb3VzZXVwJywgb25Nb3VzZVVwLCBmYWxzZSApOwoKICAgIAkJc2NvcGUuZGlzcGF0Y2hFdmVudCggZW5kRXZlbnQgKTsKCiAgICAJCXN0YXRlID0gU1RBVEUuTk9ORTsKCiAgICAJfQoKICAgIAlmdW5jdGlvbiBvbk1vdXNlV2hlZWwoIGV2ZW50ICkgewoKICAgIAkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSB8fCBzY29wZS5lbmFibGVab29tID09PSBmYWxzZSB8fCAoIHN0YXRlICE9PSBTVEFURS5OT05FICYmIHN0YXRlICE9PSBTVEFURS5ST1RBVEUgKSApIHJldHVybjsKCiAgICAJCWV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAJCWV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwoKICAgIAkJc2NvcGUuZGlzcGF0Y2hFdmVudCggc3RhcnRFdmVudCApOwoKICAgIAkJaGFuZGxlTW91c2VXaGVlbCggZXZlbnQgKTsKCiAgICAJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGVuZEV2ZW50ICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25LZXlEb3duKCBldmVudCApIHsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgfHwgc2NvcGUuZW5hYmxlS2V5cyA9PT0gZmFsc2UgfHwgc2NvcGUuZW5hYmxlUGFuID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCWhhbmRsZUtleURvd24oIGV2ZW50ICk7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25Ub3VjaFN0YXJ0KCBldmVudCApIHsKCiAgICAJCWlmICggc2NvcGUuZW5hYmxlZCA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQlldmVudC5wcmV2ZW50RGVmYXVsdCgpOwoKICAgIAkJc3dpdGNoICggZXZlbnQudG91Y2hlcy5sZW5ndGggKSB7CgogICAgCQkJY2FzZSAxOgoKICAgIAkJCQlzd2l0Y2ggKCBzY29wZS50b3VjaGVzLk9ORSApIHsKCiAgICAJCQkJCWNhc2UgVE9VQ0guUk9UQVRFOgoKICAgIAkJCQkJCWlmICggc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCQkJCQloYW5kbGVUb3VjaFN0YXJ0Um90YXRlKCBldmVudCApOwoKICAgIAkJCQkJCXN0YXRlID0gU1RBVEUuVE9VQ0hfUk9UQVRFOwoKICAgIAkJCQkJCWJyZWFrOwoKICAgIAkJCQkJY2FzZSBUT1VDSC5QQU46CgogICAgCQkJCQkJaWYgKCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQkJCWhhbmRsZVRvdWNoU3RhcnRQYW4oIGV2ZW50ICk7CgogICAgCQkJCQkJc3RhdGUgPSBTVEFURS5UT1VDSF9QQU47CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQlkZWZhdWx0OgoKICAgIAkJCQkJCXN0YXRlID0gU1RBVEUuTk9ORTsKCiAgICAJCQkJfQoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIDI6CgogICAgCQkJCXN3aXRjaCAoIHNjb3BlLnRvdWNoZXMuVFdPICkgewoKICAgIAkJCQkJY2FzZSBUT1VDSC5ET0xMWV9QQU46CgogICAgCQkJCQkJaWYgKCBzY29wZS5lbmFibGVab29tID09PSBmYWxzZSAmJiBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQkJCWhhbmRsZVRvdWNoU3RhcnREb2xseVBhbiggZXZlbnQgKTsKCiAgICAJCQkJCQlzdGF0ZSA9IFNUQVRFLlRPVUNIX0RPTExZX1BBTjsKCiAgICAJCQkJCQlicmVhazsKCiAgICAJCQkJCWNhc2UgVE9VQ0guRE9MTFlfUk9UQVRFOgoKICAgIAkJCQkJCWlmICggc2NvcGUuZW5hYmxlWm9vbSA9PT0gZmFsc2UgJiYgc2NvcGUuZW5hYmxlUm90YXRlID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCQkJCQloYW5kbGVUb3VjaFN0YXJ0RG9sbHlSb3RhdGUoIGV2ZW50ICk7CgogICAgCQkJCQkJc3RhdGUgPSBTVEFURS5UT1VDSF9ET0xMWV9ST1RBVEU7CgogICAgCQkJCQkJYnJlYWs7CgogICAgCQkJCQlkZWZhdWx0OgoKICAgIAkJCQkJCXN0YXRlID0gU1RBVEUuTk9ORTsKCiAgICAJCQkJfQoKICAgIAkJCQlicmVhazsKCiAgICAJCQlkZWZhdWx0OgoKICAgIAkJCQlzdGF0ZSA9IFNUQVRFLk5PTkU7CgogICAgCQl9CgogICAgCQlpZiAoIHN0YXRlICE9PSBTVEFURS5OT05FICkgewoKICAgIAkJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIHN0YXJ0RXZlbnQgKTsKCiAgICAJCX0KCiAgICAJfQoKICAgIAlmdW5jdGlvbiBvblRvdWNoTW92ZSggZXZlbnQgKSB7CgogICAgCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgIAkJZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CgogICAgCQlzd2l0Y2ggKCBzdGF0ZSApIHsKCiAgICAJCQljYXNlIFNUQVRFLlRPVUNIX1JPVEFURToKCiAgICAJCQkJaWYgKCBzY29wZS5lbmFibGVSb3RhdGUgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQloYW5kbGVUb3VjaE1vdmVSb3RhdGUoIGV2ZW50ICk7CgogICAgCQkJCXNjb3BlLnVwZGF0ZSgpOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIFNUQVRFLlRPVUNIX1BBTjoKCiAgICAJCQkJaWYgKCBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQloYW5kbGVUb3VjaE1vdmVQYW4oIGV2ZW50ICk7CgogICAgCQkJCXNjb3BlLnVwZGF0ZSgpOwoKICAgIAkJCQlicmVhazsKCiAgICAJCQljYXNlIFNUQVRFLlRPVUNIX0RPTExZX1BBTjoKCiAgICAJCQkJaWYgKCBzY29wZS5lbmFibGVab29tID09PSBmYWxzZSAmJiBzY29wZS5lbmFibGVQYW4gPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJCQloYW5kbGVUb3VjaE1vdmVEb2xseVBhbiggZXZlbnQgKTsKCiAgICAJCQkJc2NvcGUudXBkYXRlKCk7CgogICAgCQkJCWJyZWFrOwoKICAgIAkJCWNhc2UgU1RBVEUuVE9VQ0hfRE9MTFlfUk9UQVRFOgoKICAgIAkJCQlpZiAoIHNjb3BlLmVuYWJsZVpvb20gPT09IGZhbHNlICYmIHNjb3BlLmVuYWJsZVJvdGF0ZSA9PT0gZmFsc2UgKSByZXR1cm47CgogICAgCQkJCWhhbmRsZVRvdWNoTW92ZURvbGx5Um90YXRlKCBldmVudCApOwoKICAgIAkJCQlzY29wZS51cGRhdGUoKTsKCiAgICAJCQkJYnJlYWs7CgogICAgCQkJZGVmYXVsdDoKCiAgICAJCQkJc3RhdGUgPSBTVEFURS5OT05FOwoKICAgIAkJfQoKICAgIAl9CgogICAgCWZ1bmN0aW9uIG9uVG91Y2hFbmQoIGV2ZW50ICkgewoKICAgIAkJaWYgKCBzY29wZS5lbmFibGVkID09PSBmYWxzZSApIHJldHVybjsKCiAgICAJCXNjb3BlLmRpc3BhdGNoRXZlbnQoIGVuZEV2ZW50ICk7CgogICAgCQlzdGF0ZSA9IFNUQVRFLk5PTkU7CgogICAgCX0KCiAgICAJZnVuY3Rpb24gb25Db250ZXh0TWVudSggZXZlbnQgKSB7CgogICAgCQlpZiAoIHNjb3BlLmVuYWJsZWQgPT09IGZhbHNlICkgcmV0dXJuOwoKICAgIAkJZXZlbnQucHJldmVudERlZmF1bHQoKTsKCiAgICAJfQoKICAgIAkvLwoKICAgIAlzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdjb250ZXh0bWVudScsIG9uQ29udGV4dE1lbnUsIGZhbHNlICk7CgogICAgCXNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ21vdXNlZG93bicsIG9uTW91c2VEb3duLCBmYWxzZSApOwogICAgCXNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3doZWVsJywgb25Nb3VzZVdoZWVsLCBmYWxzZSApOwoKICAgIAlzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaHN0YXJ0Jywgb25Ub3VjaFN0YXJ0LCBmYWxzZSApOwogICAgCXNjb3BlLmRvbUVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lciggJ3RvdWNoZW5kJywgb25Ub3VjaEVuZCwgZmFsc2UgKTsKICAgIAlzY29wZS5kb21FbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoICd0b3VjaG1vdmUnLCBvblRvdWNoTW92ZSwgZmFsc2UgKTsKCiAgICAJd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdrZXlkb3duJywgb25LZXlEb3duLCBmYWxzZSApOwoKICAgIAkvLyBmb3JjZSBhbiB1cGRhdGUgYXQgc3RhcnQKCiAgICAJdGhpcy51cGRhdGUoKTsKCiAgICB9OwoKICAgIE9yYml0Q29udHJvbHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApOwogICAgT3JiaXRDb250cm9scy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBPcmJpdENvbnRyb2xzOwoKCiAgICAvLyBUaGlzIHNldCBvZiBjb250cm9scyBwZXJmb3JtcyBvcmJpdGluZywgZG9sbHlpbmcgKHpvb21pbmcpLCBhbmQgcGFubmluZy4KICAgIC8vIFVubGlrZSBUcmFja2JhbGxDb250cm9scywgaXQgbWFpbnRhaW5zIHRoZSAidXAiIGRpcmVjdGlvbiBvYmplY3QudXAgKCtZIGJ5IGRlZmF1bHQpLgogICAgLy8gVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gT3JiaXRDb250cm9scywgYW5vdGhlciBzZXQgb2YgdG91Y2ggYmVoYXZpb3IKICAgIC8vCiAgICAvLyAgICBPcmJpdCAtIHJpZ2h0IG1vdXNlLCBvciBsZWZ0IG1vdXNlICsgY3RybC9tZXRhL3NoaWZ0S2V5IC8gdG91Y2g6IHR3by1maW5nZXIgcm90YXRlCiAgICAvLyAgICBab29tIC0gbWlkZGxlIG1vdXNlLCBvciBtb3VzZXdoZWVsIC8gdG91Y2g6IHR3by1maW5nZXIgc3ByZWFkIG9yIHNxdWlzaAogICAgLy8gICAgUGFuIC0gbGVmdCBtb3VzZSwgb3IgYXJyb3cga2V5cyAvIHRvdWNoOiBvbmUtZmluZ2VyIG1vdmUKCiAgICB2YXIgTWFwQ29udHJvbHMgPSBmdW5jdGlvbiAoIG9iamVjdCwgZG9tRWxlbWVudCApIHsKCiAgICAJT3JiaXRDb250cm9scy5jYWxsKCB0aGlzLCBvYmplY3QsIGRvbUVsZW1lbnQgKTsKCiAgICAJdGhpcy5tb3VzZUJ1dHRvbnMuTEVGVCA9IE1PVVNFLlBBTjsKICAgIAl0aGlzLm1vdXNlQnV0dG9ucy5SSUdIVCA9IE1PVVNFLlJPVEFURTsKCiAgICAJdGhpcy50b3VjaGVzLk9ORSA9IFRPVUNILlBBTjsKICAgIAl0aGlzLnRvdWNoZXMuVFdPID0gVE9VQ0guRE9MTFlfUk9UQVRFOwoKICAgIH07CgogICAgTWFwQ29udHJvbHMucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZlbnREaXNwYXRjaGVyLnByb3RvdHlwZSApOwogICAgTWFwQ29udHJvbHMucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gTWFwQ29udHJvbHM7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBNZXNoVmlld2VyIGV4dGVuZHMgRXZlbnREaXNwYXRjaGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBNZXNoVmlld2VyIGNvbnN0cnVjdG9yLiBJbml0aWFsaXplcyB0aGUgY29tcG9uZW50IGFuZCB1bmRlcmx5aW5nIG9iamVjdHMuCiAgICAgICAgICogQHBhcmFtIHtzdHJpbmd9IHJ1bkNvbG9yIFJ1biBjb2xvciB0byB1c2UgaW4gY2FzZSB3aGVuIGNvbG9ycyBhcmUgYWJzZW50LgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHJ1bkNvbG9yKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX2xhc3RNZXNoID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fY2xvY2sgPSBuZXcgQ2xvY2soKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHshT2JqZWN0fSBDb250YWlucyB3aWR0aCBhbmQgaGVpZ2h0IG9mIHRoZSBjYW52YXMuICovCiAgICAgICAgICAgIHRoaXMuX2NhbnZhc1NpemUgPSBudWxsOwogICAgICAgICAgICAvKiogQHR5cGUgeyFPYmplY3R9IERlc2NyaWJlcyB3aGF0IGxheWVycyBtdXN0IGJlIHJlbmRlcmVkIGluIGFkZGl0aW9uCiAgICAgICAgICAgICB0byBhIG1lc2ggb3IgYSBwb2ludCBjbG91ZCBsYXllcnMuICovCiAgICAgICAgICAgIHRoaXMuX2xheWVyc0NvbmZpZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3J1bkNvbG9yID0gcnVuQ29sb3I7CiAgICAgICAgfQogICAgICAgIC8vIFRPRE8oYi8xMzAwMzAzMTQpIHJlcGxhY2Ugd2l0aCBzb21lIHRoaXJkcGFydHkgbGlicmFyeSBjYWxsLgogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGFuIG9iamVjdC4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbCBWYXJpYWJsZSB0byB0ZXN0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7Ym9vbGVhbn0gV2hldGhlciB2YXJpYWJsZSBpcyBhbiBvYmplY3QuCiAgICAgICAgICovCiAgICAgICAgX2lzT2JqZWN0KHZhbCkgewogICAgICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiB2YWw7CiAgICAgICAgICAgIC8vIFdlJ3JlIGludGVyZXN0ZWQgaW4gb2JqZWN0cyByZXByZXNlbnRpbmcgZGljdGlvbmFyaWVzIG9ubHkuIEV2ZXJ5dGhpbmcKICAgICAgICAgICAgLy8gZWxzZSBpcyAibm90IG1lcmdlYWJsZSIsIHNvIHdlIGNvbnNpZGVyIGl0IGFzIHByaW1pdGl2ZSB0eXBlcy4KICAgICAgICAgICAgcmV0dXJuIHR5cGUgPT0gJ29iamVjdCcgJiYgdmFsICE9IG51bGwgJiYgIUFycmF5LmlzQXJyYXkodmFsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWVyZ2VzIHR3byBjb25maWdzIHRvZ2V0aGVyLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gdXNlckNvbmZpZyBVc2VyIGNvbmZpZ3VyYXRpb24gaGFzIGhpZ2hlciBwcmlvcml0eS4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGRlZmF1bHRDb25maWcgRGVmYXVsdCBjb25maWd1cmF0aW9uIGhhcyBsb3dlciBwcmlvcml0eSBhbmQKICAgICAgICAgKiAgIHdpbGwgYmUgb3ZlcnJpZGRlbiBieSBhbnkgY29uZmxpY3Rpbmcga2V5cyBmcm9tIHVzZXJDb25maWcuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHshT2JqZWN0fSBNZXJnZWQgZGljdGlvbmFyeSBmcm9tIHR3byBjb25maWd1cmF0aW9uIGRpY3Rpb25hcmllcy4KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlEZWZhdWx0cyh1c2VyQ29uZmlnLCBkZWZhdWx0Q29uZmlnKSB7CiAgICAgICAgICAgIGxldCBtZXJnZWRDb25maWcgPSB7fTsKICAgICAgICAgICAgY29uc3QgY29uZmlncyA9IFt1c2VyQ29uZmlnLCBkZWZhdWx0Q29uZmlnXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb25maWdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSBjb25maWdzW2ldOwogICAgICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGNvbmZpZykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzX2tleV9wcmVzZW50ID0ga2V5IGluIG1lcmdlZENvbmZpZzsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNPYmplY3QoY29uZmlnW2tleV0pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlZENvbmZpZ1trZXldID0gdGhpcy5fYXBwbHlEZWZhdWx0cyhtZXJnZWRDb25maWdba2V5XSB8fCB7fSwgY29uZmlnW2tleV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNfa2V5X3ByZXNlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWVyZ2VkQ29uZmlnW2tleV0gPSBjb25maWdba2V5XTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG1lcmdlZENvbmZpZzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhZGRpdGlvbmFsIGxheWVycyB0byByZW5kZXIgb24gdG9wIG9mIGEgbWVzaCBvciBhIHBvaW50IGNsb3VkCiAgICAgICAgICogbGF5ZXJzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUxheWVycygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9sYXllcnNDb25maWcgfHwgIXRoaXMuX3NjZW5lIHx8ICF0aGlzLl9sYXN0TWVzaCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgaWYgKHRoaXMuX2xheWVyc0NvbmZpZy5zaG93Qm91bmRpbmdCb3gpIHsKICAgICAgICAgICAgICAgIHZhciBib3ggPSBuZXcgQm94SGVscGVyKHRoaXMuX2xhc3RNZXNoLCBuZXcgQ29sb3IkNygncmdiKDAsIDAsIDI1NSknKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9zY2VuZS5hZGQoYm94KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fbGF5ZXJzQ29uZmlnLnNob3dBeGVzKSB7CiAgICAgICAgICAgICAgICB2YXIgYXhlc0hlbHBlciA9IG5ldyBBeGVzSGVscGVyKDUpOwogICAgICAgICAgICAgICAgdGhpcy5fc2NlbmUuYWRkKGF4ZXNIZWxwZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgbGF5ZXJzIGNvbmZpZy4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGxheWVyc0NvbmZpZyBDb25maWcgb2JqZWN0IGRlc2NyaWJpbmcgd2hhdCBsYXllcnMgc2hvdWxkCiAgICAgICAgICogIGJlIHJlbmRlcmVkLgogICAgICAgICAqLwogICAgICAgIHNldExheWVyc0NvbmZpZyhsYXllcnNDb25maWcpIHsKICAgICAgICAgICAgdGhpcy5fbGF5ZXJzQ29uZmlnID0gdGhpcy5fYXBwbHlEZWZhdWx0cyhsYXllcnNDb25maWcsIHRoaXMuX2xheWVyc0NvbmZpZyB8fCB7fSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgc2NlbmUsIGNhbWVyYSBhbmQgcmVuZGVyZXIuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjb25maWcgU2NlbmUgcmVuZGVyaW5nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICogQHBhcmFtIHshSFRNTERPTUVsZW1lbnR9IGRvbUVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB1c2VkIGZvciBldmVudCBsaXN0ZW5lcnMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlV29ybGQoY29uZmlnLCBkb21FbGVtZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVhZHkoKSkgewogICAgICAgICAgICAgICAgLy8ga2VlcCB3b3JsZCBvYmplY3RzIGFzIHNpbmdsZXRvbiBvYmplY3RzLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NjZW5lID0gbmV3IFNjZW5lKCk7CiAgICAgICAgICAgIHZhciBjYW1lcmEgPSBuZXcgVEhSRUUkMVtjb25maWcuY2FtZXJhLmNsc10oY29uZmlnLmNhbWVyYS5mb3YsIHRoaXMuX2NhbnZhc1NpemUud2lkdGggLyB0aGlzLl9jYW52YXNTaXplLmhlaWdodCwgY29uZmlnLmNhbWVyYS5uZWFyLCBjb25maWcuY2FtZXJhLmZhcik7CiAgICAgICAgICAgIHRoaXMuX2NhbWVyYSA9IGNhbWVyYTsKICAgICAgICAgICAgdmFyIGNhbUNvbnRyb2xzID0gbmV3IE9yYml0Q29udHJvbHMoY2FtZXJhLCBkb21FbGVtZW50KTsKICAgICAgICAgICAgY29uc3QgYW55Q2FtQ29udHJvbHMgPSBjYW1Db250cm9sczsKICAgICAgICAgICAgLy8gVE9ETyh0ZW5zb3Jib2FyZC10ZWFtKTogY2hlY2sgd2hldGhlciB0aGVzZSBhcmUgZGVwcmVhY3RlZDsgdGhleSBubyBsb25nZXIgZXhpc3QKICAgICAgICAgICAgLy8gaW4gQVBJIGRvY3MuCiAgICAgICAgICAgIGFueUNhbUNvbnRyb2xzLmxvb2tTcGVlZCA9IDAuNDsKICAgICAgICAgICAgYW55Q2FtQ29udHJvbHMubW92ZW1lbnRTcGVlZCA9IDIwOwogICAgICAgICAgICBhbnlDYW1Db250cm9scy5ub0ZseSA9IHRydWU7CiAgICAgICAgICAgIGFueUNhbUNvbnRyb2xzLmxvb2tWZXJ0aWNhbCA9IHRydWU7CiAgICAgICAgICAgIGFueUNhbUNvbnRyb2xzLmNvbnN0cmFpblZlcnRpY2FsID0gdHJ1ZTsKICAgICAgICAgICAgYW55Q2FtQ29udHJvbHMudmVydGljYWxNaW4gPSAxOwogICAgICAgICAgICBhbnlDYW1Db250cm9scy52ZXJ0aWNhbE1heCA9IDI7CiAgICAgICAgICAgIGFueUNhbUNvbnRyb2xzLmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIHRoaXMuX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2UuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIHRoaXMuX2NhbWVyYUNvbnRyb2xzID0gY2FtQ29udHJvbHM7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gbmV3IFdlYkdMUmVuZGVyZXIoeyBhbnRpYWxpYXM6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFBpeGVsUmF0aW8od2luZG93LmRldmljZVBpeGVsUmF0aW8pOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsIHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0Q2xlYXJDb2xvcigweGZmZmZmZiwgMSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyBzY2VuZSBmcm9tIGFueSAzRCBnZW9tZXRyeS4KICAgICAgICAgKi8KICAgICAgICBfY2xlYXJTY2VuZSgpIHsKICAgICAgICAgICAgd2hpbGUgKHRoaXMuX3NjZW5lLmNoaWxkcmVuLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NjZW5lLnJlbW92ZSh0aGlzLl9zY2VuZS5jaGlsZHJlblswXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB1bmRlcmx5aW5nIHJlbmRlcmVyLgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBnZXRSZW5kZXJlcigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHVuZGVybHlpbmcgY2FtZXJhIGNvbnRyb2xzLgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBnZXRDYW1lcmFDb250cm9scygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbWVyYUNvbnRyb2xzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgd2hlbiBhbGwgdW5kZXJseWluZyBjb21wb25lbnRzIHdlcmUgaW5pdGlhbGl6ZWQuCiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIGlzUmVhZHkoKSB7CiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuX2NhbWVyYSAmJiAhIXRoaXMuX2NhbWVyYUNvbnRyb2xzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGN1cnJlbnQgY2FtZXJhIHBvc2l0aW9uLgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBnZXRDYW1lcmFQb3NpdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGZhcjogdGhpcy5fY2FtZXJhLmZhciwKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiB0aGlzLl9jYW1lcmEucG9zaXRpb24uY2xvbmUoKSwKICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcy5fY2FtZXJhQ29udHJvbHMudGFyZ2V0LmNsb25lKCksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgbmV3IGNhbnZhcyBzaXplLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY2FudmFzU2l6ZSBDb250YWlucyBjdXJyZW50IGNhbnZhcyB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBzZXRDYW52YXNTaXplKGNhbnZhc1NpemUpIHsKICAgICAgICAgICAgdGhpcy5fY2FudmFzU2l6ZSA9IGNhbnZhc1NpemU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgY29tcG9uZW50IGludG8gdGhlIGJyb3dzZXIuCiAgICAgICAgICogQHB1YmxpYwogICAgICAgICAqLwogICAgICAgIGRyYXcoKSB7CiAgICAgICAgICAgIC8vIENhbmNlbCBhbnkgcHJldmlvdXMgcmVxdWVzdHMgdG8gcGVyZm9ybSByZWRyYXcuCiAgICAgICAgICAgIGlmICh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KSB7CiAgICAgICAgICAgICAgICBjYW5jZWxBbmltYXRpb25GcmFtZSh0aGlzLl9hbmltYXRpb25GcmFtZUluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jYW1lcmEuYXNwZWN0ID0gdGhpcy5fY2FudmFzU2l6ZS53aWR0aCAvIHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0OwogICAgICAgICAgICB0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRTaXplKHRoaXMuX2NhbnZhc1NpemUud2lkdGgsIHRoaXMuX2NhbnZhc1NpemUuaGVpZ2h0KTsKICAgICAgICAgICAgY29uc3QgYW5pbWF0ZSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IHRoaXMuX2Nsb2NrLmdldERlbHRhKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoZGVsdGEpOwogICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uRnJhbWVJbmRleCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZShhbmltYXRlKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbmRlcih0aGlzLl9zY2VuZSwgdGhpcy5fY2FtZXJhKTsKICAgICAgICAgICAgfS5iaW5kKHRoaXMpOwogICAgICAgICAgICBhbmltYXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHNjZW5lLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY3VycmVudFN0ZXAgU3RlcCBkYXR1bS4KICAgICAgICAgKiBAcGFyYW0geyFIVE1MRE9NRWxlbWVudH0gZG9tRWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHVzZWQgZm9yIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgKiBAcHVibGljCiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU2NlbmUoY3VycmVudFN0ZXAsIGRvbUVsZW1lbnQpIHsKICAgICAgICAgICAgbGV0IGNvbmZpZyA9IHt9OwogICAgICAgICAgICBpZiAoJ2NvbmZpZycgaW4gY3VycmVudFN0ZXAgJiYgY3VycmVudFN0ZXAuY29uZmlnKSB7CiAgICAgICAgICAgICAgICBjb25maWcgPSBKU09OLnBhcnNlKGN1cnJlbnRTdGVwLmNvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhpcyBldmVudCBpcyBhbiBvcHBvcnR1bml0eSBmb3IgVUktcmVzcG9uc2libGUgY29tcG9uZW50IChwYXJlbnQpIHRvIHNldAogICAgICAgICAgICAvLyBwcm9wZXIgY2FudmFzIHNpemUuCiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdiZWZvcmVVcGRhdGVTY2VuZScgfSk7CiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRfY29uZmlnID0gewogICAgICAgICAgICAgICAgY2FtZXJhOiB7IGNsczogJ1BlcnNwZWN0aXZlQ2FtZXJhJywgZm92OiA3NSwgbmVhcjogMC4xLCBmYXI6IDEwMDAgfSwKICAgICAgICAgICAgICAgIGxpZ2h0czogWwogICAgICAgICAgICAgICAgICAgIHsgY2xzOiAnQW1iaWVudExpZ2h0JywgY29sb3I6ICcjZmZmZmZmJywgaW50ZW5zaXR5OiAwLjc1IH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBjbHM6ICdEaXJlY3Rpb25hbExpZ2h0JywKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3I6ICcjZmZmZmZmJywKICAgICAgICAgICAgICAgICAgICAgICAgaW50ZW5zaXR5OiAwLjc1LAogICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogWzAsIC0xLCAyXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgY29uZmlnID0gdGhpcy5fYXBwbHlEZWZhdWx0cyhjb25maWcsIGRlZmF1bHRfY29uZmlnKTsKICAgICAgICAgICAgdGhpcy5fY3JlYXRlV29ybGQoY29uZmlnLCBkb21FbGVtZW50KTsKICAgICAgICAgICAgdGhpcy5fY2xlYXJTY2VuZSgpOwogICAgICAgICAgICB0aGlzLl9jcmVhdGVMaWdodHModGhpcy5fc2NlbmUsIGNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUdlb21ldHJ5KGN1cnJlbnRTdGVwLCBjb25maWcpOwogICAgICAgICAgICB0aGlzLl9jcmVhdGVMYXllcnMoKTsKICAgICAgICAgICAgdGhpcy5kcmF3KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgY2FtZXJhIHRvIGRlZmF1bHQgcG9zaXRpb24gYW5kIHpvb20uCiAgICAgICAgICogQHBhcmFtIHs/VEhSRUUuTWVzaH0gbWVzaCBNZXNoIHRvIGZpdCBpbnRvIHZpZXdwb3J0LgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICByZXNldFZpZXcobWVzaCkgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNSZWFkeSgpKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9jYW1lcmFDb250cm9scy5yZXNldCgpOwogICAgICAgICAgICBsZXQgbmV4dE1lc2g7CiAgICAgICAgICAgIGlmICghbWVzaCAmJiB0aGlzLl9sYXN0TWVzaCkgewogICAgICAgICAgICAgICAgbmV4dE1lc2ggPSB0aGlzLl9sYXN0TWVzaDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV4dE1lc2gpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpdE9iamVjdFRvVmlld3BvcnQobmV4dE1lc2gpOwogICAgICAgICAgICAgICAgLy8gU3RvcmUgbGFzdCBtZXNoIGluIGNhc2Ugb2YgcmVzZXRWaWV3IG1ldGhvZCBjYWxsZWQgZHVlIHRvIHNvbWUgZXZlbnRzLgogICAgICAgICAgICAgICAgdGhpcy5fbGFzdE1lc2ggPSBuZXh0TWVzaDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jYW1lcmFDb250cm9scy51cGRhdGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBnZW9tZXRyeSBmb3IgY3VycmVudCBzdGVwIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjdXJyZW50U3RlcCBTdGVwIGRhdHVtLgogICAgICAgICAqIEBwYXJhbSB7IU9iamVjdH0gY29uZmlnIFNjZW5lIHJlbmRlcmluZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUdlb21ldHJ5KGN1cnJlbnRTdGVwLCBjb25maWcpIHsKICAgICAgICAgICAgY29uc3QgbWVzaCA9IGN1cnJlbnRTdGVwLm1lc2g7CiAgICAgICAgICAgIGlmIChtZXNoLnZlcnRpY2VzICYmIG1lc2guZmFjZXMgJiYgbWVzaC5mYWNlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU1lc2gobWVzaCwgY29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVBvaW50Q2xvdWQobWVzaCwgY29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIHBvaW50IGNsb3VkIGdlb21ldHJ5IGZvciBjdXJyZW50IHN0ZXAgZGF0YS4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IHBvaW50Q2xvdWREYXRhIE9iamVjdCB3aXRoIHBvaW50IGNsb3VkIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHshT2JqZWN0fSBjb25maWcgU2NlbmUgcmVuZGVyaW5nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUG9pbnRDbG91ZChwb2ludENsb3VkRGF0YSwgY29uZmlnKSB7CiAgICAgICAgICAgIGNvbnN0IHBvaW50cyA9IHBvaW50Q2xvdWREYXRhLnZlcnRpY2VzOwogICAgICAgICAgICBjb25zdCBjb2xvcnMgPSBwb2ludENsb3VkRGF0YS5jb2xvcnM7CiAgICAgICAgICAgIGxldCBkZWZhdWx0Q29uZmlnID0gewogICAgICAgICAgICAgICAgbWF0ZXJpYWw6IHsKICAgICAgICAgICAgICAgICAgICBjbHM6ICdQb2ludHNNYXRlcmlhbCcsCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogMC4wMDUsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hhdCBjb2xvcnMgd2lsbCBiZSB1c2VkLgogICAgICAgICAgICBpZiAoY29sb3JzICYmIGNvbG9ycy5sZW5ndGggPT0gcG9pbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZy5tYXRlcmlhbFsndmVydGV4Q29sb3JzJ10gPSBWZXJ0ZXhDb2xvcnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnLm1hdGVyaWFsWydjb2xvciddID0gdGhpcy5fcnVuQ29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGNfY29uZmlnID0gdGhpcy5fYXBwbHlEZWZhdWx0cyhjb25maWcsIGRlZmF1bHRDb25maWcpOwogICAgICAgICAgICB2YXIgZ2VvbWV0cnkgPSBuZXcgR2VvbWV0cnkoKTsKICAgICAgICAgICAgcG9pbnRzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgICAgICAgICB2YXIgcCA9IG5ldyBWZWN0b3IzKHBvaW50WzBdLCBwb2ludFsxXSwgcG9pbnRbMl0pOwogICAgICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAxOwogICAgICAgICAgICAgICAgcC54ID0gcG9pbnRbMF0gKiBzY2FsZTsKICAgICAgICAgICAgICAgIHAueSA9IHBvaW50WzFdICogc2NhbGU7CiAgICAgICAgICAgICAgICBwLnogPSBwb2ludFsyXSAqIHNjYWxlOwogICAgICAgICAgICAgICAgZ2VvbWV0cnkudmVydGljZXMucHVzaChwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGlmIChjb2xvcnMgJiYgY29sb3JzLmxlbmd0aCA9PSBwb2ludHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb2xvcnMuZm9yRWFjaChmdW5jdGlvbiAoY29sb3IpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjID0gbmV3IENvbG9yJDcoY29sb3JbMF0gLyAyNTUsIGNvbG9yWzFdIC8gMjU1LCBjb2xvclsyXSAvIDI1NSk7CiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29sb3JzLnB1c2goYyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgbWF0ZXJpYWwgPSBuZXcgVEhSRUUkMVtwY19jb25maWcubWF0ZXJpYWwuY2xzXShwY19jb25maWcubWF0ZXJpYWwpOwogICAgICAgICAgICB2YXIgbWVzaCA9IG5ldyBQb2ludHMoZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgICAgICAgdGhpcy5fc2NlbmUuYWRkKG1lc2gpOwogICAgICAgICAgICB0aGlzLl9sYXN0TWVzaCA9IG1lc2g7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgbWVzaCBnZW9tZXRyeSBmb3IgY3VycmVudCBzdGVwIGRhdGEuCiAgICAgICAgICogQHBhcmFtIHshVEhSRUUuVmVjdG9yM30gcG9zaXRpb24gUG9zaXRpb24gb2YgdGhlIGNhbWVyYS4KICAgICAgICAgKiBAcGFyYW0ge251bWJlcn0gZmFyIENhbWVyYSBmcnVzdHVtIGZhciBwbGFuZS4KICAgICAgICAgKiBAcGFyYW0geyFUSFJFRS5WZWN0b3IzfSB0YXJnZXQgUG9pbnQgaW4gc3BhY2UgZm9yIGNhbWVyYSB0byBsb29rIGF0LgogICAgICAgICAqIEBwdWJsaWMKICAgICAgICAgKi8KICAgICAgICBzZXRDYW1lcmFWaWV3cG9pbnQocG9zaXRpb24sIGZhciwgdGFyZ2V0KSB7CiAgICAgICAgICAgIHRoaXMuX3NpbGVudCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2NhbWVyYS5mYXIgPSBmYXI7CiAgICAgICAgICAgIHRoaXMuX2NhbWVyYS5wb3NpdGlvbi5zZXQocG9zaXRpb24ueCwgcG9zaXRpb24ueSwgcG9zaXRpb24ueik7CiAgICAgICAgICAgIHRoaXMuX2NhbWVyYS5sb29rQXQodGFyZ2V0LmNsb25lKCkpOwogICAgICAgICAgICB0aGlzLl9jYW1lcmEudXBkYXRlUHJvamVjdGlvbk1hdHJpeCgpOwogICAgICAgICAgICB0aGlzLl9jYW1lcmFDb250cm9scy50YXJnZXQgPSB0YXJnZXQuY2xvbmUoKTsKICAgICAgICAgICAgdGhpcy5fY2FtZXJhQ29udHJvbHMudXBkYXRlKCk7CiAgICAgICAgICAgIHRoaXMuX3NpbGVudCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VyZWQgd2hlbiBjYW1lcmEgcG9zaXRpb24gY2hhbmdlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlKGV2ZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zaWxlbnQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuZGlzcGF0Y2hFdmVudCh7IHR5cGU6ICdjYW1lcmFQb3NpdGlvbkNoYW5nZScsIGV2ZW50OiBldmVudCB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUG9zaXRpb25zIGNhbWVyYSBvbiBzdWNoIGRpc3RhbmNlIGZyb20gdGhlIG9iamVjdCB0aGF0IHRoZSB3aG9sZSBvYmplY3QgaXMKICAgICAgICAgKiB2aXNpYmxlLgogICAgICAgICAqIEBwYXJhbSB7IVRIUkVFLk1lc2h9IG1lc2ggTWVzaCB0byBmaXQgaW50byB2aWV3cG9ydC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9maXRPYmplY3RUb1ZpZXdwb3J0KG1lc2gpIHsKICAgICAgICAgICAgLy8gU21hbGwgb2Zmc2V0IG11bHRpcGxpY2F0b3IgdG8gYXZvaWQgZWRnZXMgb2YgbWVzaCB0b3VjaGluZyBlZGdlcyBvZgogICAgICAgICAgICAvLyB2aWV3cG9ydC4KICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gMS4yNTsKICAgICAgICAgICAgY29uc3QgYm91bmRpbmdCb3ggPSBuZXcgQm94MygpOwogICAgICAgICAgICBjb25zdCBjZW50ZXIgPSBuZXcgVmVjdG9yMygpOwogICAgICAgICAgICBjb25zdCBzaXplID0gbmV3IFZlY3RvcjMoKTsKICAgICAgICAgICAgYm91bmRpbmdCb3guc2V0RnJvbU9iamVjdChtZXNoKTsKICAgICAgICAgICAgYm91bmRpbmdCb3guZ2V0Q2VudGVyKGNlbnRlcik7CiAgICAgICAgICAgIGJvdW5kaW5nQm94LmdldFNpemUoc2l6ZSk7CiAgICAgICAgICAgIGNvbnN0IG1heF9kaW0gPSBNYXRoLm1heChzaXplLngsIHNpemUueSwgc2l6ZS56KTsKICAgICAgICAgICAgY29uc3QgZm92ID0gdGhpcy5fY2FtZXJhLmZvdiAqIChNYXRoLlBJIC8gMTgwKTsKICAgICAgICAgICAgbGV0IGNhbWVyYV96ID0gTWF0aC5hYnMobWF4X2RpbSAvICgyICogTWF0aC50YW4oZm92IC8gMikpKSAqIG9mZnNldDsKICAgICAgICAgICAgY29uc3QgbWluX3ogPSBib3VuZGluZ0JveC5taW4uejsKICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgZXZlbiBhZnRlciBhcmJpdHJhcnkgcm90YXRpb24gbWVzaCB3b24ndCBiZSBjbGlwcGVkLgogICAgICAgICAgICBjb25zdCBjYW1lcmFfdG9fZmFyX2VkZ2UgPSBtaW5feiA8IDAgPyAtbWluX3ogKyBjYW1lcmFfeiA6IGNhbWVyYV96IC0gbWluX3o7CiAgICAgICAgICAgIC8vIFNldCBjYW1lcmEgcG9zaXRpb24gYW5kIG9yaWVudGF0aW9uLgogICAgICAgICAgICB0aGlzLnNldENhbWVyYVZpZXdwb2ludCh7IHg6IGNlbnRlci54LCB5OiBjZW50ZXIueSwgejogY2FtZXJhX3ogfSwgY2FtZXJhX3RvX2Zhcl9lZGdlICogMywgY2VudGVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBtZXNoIGdlb21ldHJ5IGZvciBjdXJyZW50IHN0ZXAgZGF0YS4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IG1lc2hEYXRhIE9iamVjdCB3aXRoIG1lc2ggZGF0YS4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNvbmZpZyBTY2VuZSByZW5kZXJpbmcgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVNZXNoKG1lc2hEYXRhLCBjb25maWcpIHsKICAgICAgICAgICAgY29uc3QgdmVydGljZXMgPSBtZXNoRGF0YS52ZXJ0aWNlczsKICAgICAgICAgICAgY29uc3QgZmFjZXMgPSBtZXNoRGF0YS5mYWNlczsKICAgICAgICAgICAgY29uc3QgY29sb3JzID0gbWVzaERhdGEuY29sb3JzOwogICAgICAgICAgICBjb25zdCBtZXNoX2NvbmZpZyA9IHRoaXMuX2FwcGx5RGVmYXVsdHMoY29uZmlnLCB7CiAgICAgICAgICAgICAgICBtYXRlcmlhbDogewogICAgICAgICAgICAgICAgICAgIGNsczogJ01lc2hTdGFuZGFyZE1hdGVyaWFsJywKICAgICAgICAgICAgICAgICAgICBjb2xvcjogJyNhMGEwYTAnLAogICAgICAgICAgICAgICAgICAgIHJvdWdobmVzczogMSwKICAgICAgICAgICAgICAgICAgICBtZXRhbG5lc3M6IDAsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGV0IGdlb21ldHJ5ID0gbmV3IEdlb21ldHJ5KCk7CiAgICAgICAgICAgIHZlcnRpY2VzLmZvckVhY2goZnVuY3Rpb24gKHBvaW50KSB7CiAgICAgICAgICAgICAgICBsZXQgcCA9IG5ldyBWZWN0b3IzKHBvaW50WzBdLCBwb2ludFsxXSwgcG9pbnRbMl0pOwogICAgICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSAxOwogICAgICAgICAgICAgICAgcC54ID0gcG9pbnRbMF0gKiBzY2FsZTsKICAgICAgICAgICAgICAgIHAueSA9IHBvaW50WzFdICogc2NhbGU7CiAgICAgICAgICAgICAgICBwLnogPSBwb2ludFsyXSAqIHNjYWxlOwogICAgICAgICAgICAgICAgZ2VvbWV0cnkudmVydGljZXMucHVzaChwKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIGZhY2VzLmZvckVhY2goZnVuY3Rpb24gKGZhY2VfaW5kaWNlcykgewogICAgICAgICAgICAgICAgbGV0IGZhY2UgPSBuZXcgRmFjZTMoZmFjZV9pbmRpY2VzWzBdLCBmYWNlX2luZGljZXNbMV0sIGZhY2VfaW5kaWNlc1syXSk7CiAgICAgICAgICAgICAgICBpZiAoY29sb3JzICYmIGNvbG9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBmYWNlX2NvbG9ycyA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgY29sb3JzW2ZhY2VfaW5kaWNlc1swXV0sCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbG9yc1tmYWNlX2luZGljZXNbMV1dLAogICAgICAgICAgICAgICAgICAgICAgICBjb2xvcnNbZmFjZV9pbmRpY2VzWzJdXSwKICAgICAgICAgICAgICAgICAgICBdOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmFjZV9jb2xvcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVydGV4X2NvbG9yID0gZmFjZV9jb2xvcnNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBjb2xvciA9IG5ldyBDb2xvciQ3KHZlcnRleF9jb2xvclswXSAvIDI1NSwgdmVydGV4X2NvbG9yWzFdIC8gMjU1LCB2ZXJ0ZXhfY29sb3JbMl0gLyAyNTUpOwogICAgICAgICAgICAgICAgICAgICAgICBmYWNlLnZlcnRleENvbG9ycy5wdXNoKGNvbG9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBnZW9tZXRyeS5mYWNlcy5wdXNoKGZhY2UpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKGNvbG9ycyAmJiBjb2xvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBtZXNoX2NvbmZpZy5tYXRlcmlhbCA9IG1lc2hfY29uZmlnLm1hdGVyaWFsIHx8IHt9OwogICAgICAgICAgICAgICAgbWVzaF9jb25maWcubWF0ZXJpYWwudmVydGV4Q29sb3JzID0gVmVydGV4Q29sb3JzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGdlb21ldHJ5LmNlbnRlcigpOwogICAgICAgICAgICBnZW9tZXRyeS5jb21wdXRlQm91bmRpbmdTcGhlcmUoKTsKICAgICAgICAgICAgZ2VvbWV0cnkuY29tcHV0ZVZlcnRleE5vcm1hbHMoKTsKICAgICAgICAgICAgbGV0IG1hdGVyaWFsID0gbmV3IFRIUkVFJDFbbWVzaF9jb25maWcubWF0ZXJpYWwuY2xzXShtZXNoX2NvbmZpZy5tYXRlcmlhbCk7CiAgICAgICAgICAgIGxldCBtZXNoID0gbmV3IE1lc2goZ2VvbWV0cnksIG1hdGVyaWFsKTsKICAgICAgICAgICAgbWVzaC5jYXN0U2hhZG93ID0gdHJ1ZTsKICAgICAgICAgICAgbWVzaC5yZWNlaXZlU2hhZG93ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fc2NlbmUuYWRkKG1lc2gpOwogICAgICAgICAgICB0aGlzLl9sYXN0TWVzaCA9IG1lc2g7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgbGlnaHRzIGZvciBhIGdpdmVuIHNjZW5lIGJhc2VkIG9uIHBhc3NlZCBjb25maWd1cmF0aW9uLgogICAgICAgICAqIEBwYXJhbSB7IVNjZW5lfSBzY2VuZSBTY2VuZSBvYmplY3QgdG8gYWRkIGxpZ2h0cyB0by4KICAgICAgICAgKiBAcGFyYW0geyFPYmplY3R9IGNvbmZpZyBTY2VuZSByZW5kZXJpbmcgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVMaWdodHMoc2NlbmUsIGNvbmZpZykgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbmZpZy5saWdodHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IGxpZ2h0X2NvbmZpZyA9IGNvbmZpZy5saWdodHNbaV07CiAgICAgICAgICAgICAgICBsZXQgbGlnaHQgPSBuZXcgVEhSRUUkMVtsaWdodF9jb25maWcuY2xzXShsaWdodF9jb25maWcuY29sb3IsIGxpZ2h0X2NvbmZpZy5pbnRlbnNpdHkpOwogICAgICAgICAgICAgICAgaWYgKGxpZ2h0X2NvbmZpZy5wb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgIGxpZ2h0LnBvc2l0aW9uLnNldChsaWdodF9jb25maWcucG9zaXRpb25bMF0sIGxpZ2h0X2NvbmZpZy5wb3NpdGlvblsxXSwgbGlnaHRfY29uZmlnLnBvc2l0aW9uWzJdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHNjZW5lLmFkZChsaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgbGV0IFRmTWVzaExvYWRlckltcGwgPSBjbGFzcyBUZk1lc2hMb2FkZXJJbXBsIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRWaWV3ID0gJ2FsbCc7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbiA9IHJ1bnNDb2xvclNjYWxlOwogICAgICAgICAgICB0aGlzLl9zdGVwcyA9IFtdOwogICAgICAgICAgICB0aGlzLl9tZXNoVmlld2VyQXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9pc01lc2hMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGdldCBfcnVuQ29sb3IoKSB7CiAgICAgICAgICAgIHZhciBydW4gPSB0aGlzLnJ1bjsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbG9yU2NhbGVGdW5jdGlvbihydW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxsZWQgYnkgcGFyZW50IHdoZW4gY29tcG9uZW50IGF0dGFjaGVkIHRvIERPTS4KICAgICAgICAgKiBAcHVibGljCiAgICAgICAgICovCiAgICAgICAgY29ubmVjdGVkQ2FsbGJhY2soKSB7CiAgICAgICAgICAgIHN1cGVyLmNvbm5lY3RlZENhbGxiYWNrKCk7CiAgICAgICAgICAgIC8vIERlZmVyIHJlbG9hZGluZyB1bnRpbCBhZnRlciB3ZSdyZSBhdHRhY2hlZCwgYmVjYXVzZSB0aGF0IGVuc3VyZXMgdGhhdAogICAgICAgICAgICAvLyB0aGUgcmVxdWVzdE1hbmFnZXIgaGFzIGJlZW4gc2V0IGZyb20gYWJvdmUuIChQb2x5bWVyIGlzIHRyaWNreQogICAgICAgICAgICAvLyBzb21ldGltZXMpCiAgICAgICAgICAgIHRoaXMuX2RhdGFQcm92aWRlciA9IG5ldyBBcnJheUJ1ZmZlckRhdGFQcm92aWRlcih0aGlzLnJlcXVlc3RNYW5hZ2VyKTsKICAgICAgICAgICAgY29uc3QgbWVzaFZpZXdlciA9IG5ldyBNZXNoVmlld2VyKHRoaXMuX3J1bkNvbG9yKTsKICAgICAgICAgICAgbWVzaFZpZXdlci5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmVVcGRhdGVTY2VuZScsIHRoaXMuX3VwZGF0ZUNhbnZhc1NpemUuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIG1lc2hWaWV3ZXIuYWRkRXZlbnRMaXN0ZW5lcignY2FtZXJhUG9zaXRpb25DaGFuZ2UnLCB0aGlzLl9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlLmJpbmQodGhpcykpOwogICAgICAgICAgICB0aGlzLl9tZXNoVmlld2VyID0gbWVzaFZpZXdlcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRnVuY3Rpb24gdG8gY2FsbCB3aGVuIGNvbXBvbmVudCBtdXN0IGJlIHJlbG9hZGVkLgogICAgICAgICAqLwogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmFjdGl2ZSB8fCAhdGhpcy5fZGF0YVByb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNNZXNoTG9hZGluZyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2RhdGFQcm92aWRlcgogICAgICAgICAgICAgICAgLnJlbG9hZCh0aGlzLnJ1biwgdGhpcy50YWcsIHRoaXMuc2FtcGxlKQogICAgICAgICAgICAgICAgLnRoZW4oKHN0ZXBzKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXN0ZXBzKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gSGFwcGVucyB3aGVuIHJlcXVlc3Qgd2FzIGNhbmNlbGxlZCBhdCBzb21lIHBvaW50LgogICAgICAgICAgICAgICAgdGhpcy5fc3RlcHMgPSBzdGVwczsKICAgICAgICAgICAgICAgIHRoaXMuX3N0ZXBJbmRleCA9IHN0ZXBzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIWVycm9yIHx8ICFlcnJvci5jb2RlIHx8IGVycm9yLmNvZGUgIT0gRXJyb3JDb2Rlcy5DQU5DRUxMRUQpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGVycm9yIHx8ICdSZXNwb25zZSBwcm9jZXNzaW5nIGZhaWxlZC4nOwogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlcnJvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzY2VuZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVTY2VuZSgpIHsKICAgICAgICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLl9jdXJyZW50U3RlcDsKICAgICAgICAgICAgLy8gTWVzaCBkYXRhIGlzIG5vdCBmZXRjaGVkIHlldC4gUGxlYXNlIHNlZSBgX21heWJlRmV0Y2hNZXNoYC4KICAgICAgICAgICAgaWYgKCFjdXJyZW50U3RlcCB8fCAhY3VycmVudFN0ZXAubWVzaCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdGhpcy5fbWVzaFZpZXdlci51cGRhdGVTY2VuZShjdXJyZW50U3RlcCwgdGhpcyk7CiAgICAgICAgICAgIGlmICghdGhpcy5fY2FtZXJhUG9zaXRpb25Jbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgdGhpcy5fbWVzaFZpZXdlci5yZXNldFZpZXcoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5fbWVzaFZpZXdlckF0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICAvLyBNZXNoIHZpZXdlciBzaG91bGQgYmUgYWRkZWQgdG8gdGhlIGRvbSBvbmNlLgogICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290LmFwcGVuZENoaWxkKHRoaXMuX21lc2hWaWV3ZXIuZ2V0UmVuZGVyZXIoKS5kb21FbGVtZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuX21lc2hWaWV3ZXJBdHRhY2hlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2RlYm91bmNlZEZldGNoTWVzaCgpIHsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZSgnZmV0Y2hNZXNoJywgKCkgPT4gdGhpcy5fbWF5YmVGZXRjaE1lc2goKSwgMTAwKTsKICAgICAgICB9CiAgICAgICAgX21heWJlRmV0Y2hNZXNoKCkgewogICAgICAgICAgICByZXR1cm4gX19hd2FpdGVyKHRoaXMsIHZvaWQgMCwgdm9pZCAwLCBmdW5jdGlvbiogKCkgewogICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFN0ZXAgPSB0aGlzLl9jdXJyZW50U3RlcDsKICAgICAgICAgICAgICAgIGlmICghY3VycmVudFN0ZXAgfHwgY3VycmVudFN0ZXAubWVzaCB8fCBjdXJyZW50U3RlcC5tZXNoRmV0Y2hpbmcpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY3VycmVudFN0ZXAubWVzaEZldGNoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2lzTWVzaExvYWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXNoRGF0YSA9IHlpZWxkIHRoaXMuX2RhdGFQcm92aWRlci5mZXRjaERhdGEoY3VycmVudFN0ZXAsIHRoaXMucnVuLCB0aGlzLnRhZywgdGhpcy5zYW1wbGUpOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRTdGVwLm1lc2ggPSBtZXNoRGF0YVswXTsKICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmeVBhdGgoJ19jdXJyZW50U3RlcC5tZXNoJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWVycm9yIHx8ICFlcnJvci5jb2RlIHx8IGVycm9yLmNvZGUgIT0gRXJyb3JDb2Rlcy5DQU5DRUxMRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgPSBlcnJvciB8fCAnUmVzcG9uc2UgcHJvY2Vzc2luZyBmYWlsZWQuJzsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc01lc2hMb2FkaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudFN0ZXAubWVzaEZldGNoaW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9wYWdhdGVzIGNhbWVyYSBwb3NpdGlvbiBjaGFuZ2UgZXZlbnQgb3V0c2lkZSBvZiB0aGUgbG9hZGVyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICovCiAgICAgICAgX29uQ2FtZXJhUG9zaXRpb25DaGFuZ2UoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fbWVzaFZpZXdlci5pc1JlYWR5KCkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gbmV3IEN1c3RvbUV2ZW50KCdjYW1lcmEtcG9zaXRpb24tY2hhbmdlJywgewogICAgICAgICAgICAgICAgZGV0YWlsOiB0aGlzLl9tZXNoVmlld2VyLmdldENhbWVyYVBvc2l0aW9uKCksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIG1lc2ggZ2VvbWV0cnkgZm9yIGN1cnJlbnQgc3RlcCBkYXRhLgogICAgICAgICAqIEBwYXJhbSBwb3NpdGlvbiBQb3NpdGlvbiBvZiB0aGUgY2FtZXJhLgogICAgICAgICAqIEBwYXJhbSBmYXIgQ2FtZXJhIGZydXN0dW0gZmFyIHBsYW5lLgogICAgICAgICAqIEBwYXJhbSB0YXJnZXQgUG9pbnQgaW4gc3BhY2UgZm9yIGNhbWVyYSB0byBsb29rIGF0LgogICAgICAgICAqLwogICAgICAgIHNldENhbWVyYVZpZXdwb2ludChwb3NpdGlvbiwgZmFyLCB0YXJnZXQpIHsKICAgICAgICAgICAgdGhpcy5fbWVzaFZpZXdlci5zZXRDYW1lcmFWaWV3cG9pbnQocG9zaXRpb24sIGZhciwgdGFyZ2V0KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyBzaXplIG9mIHRoZSBjYW52YXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlQ2FudmFzU2l6ZSgpIHsKICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLm9mZnNldFdpZHRoOwogICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB3aWR0aDsgLy8gS2VlcCB0aGUgd2hvbGUgbWVzaCB2aWV3ZXIgc3F1YXJlIGF0IGFsbCB0aW1lcy4KICAgICAgICAgICAgY29uc3QgaGVhZGVySGVpZ2h0ID0gdGhpcy4kJCgnLnRmLW1lc2gtbG9hZGVyLWhlYWRlcicpCiAgICAgICAgICAgICAgICAub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICBjb25zdCBjYW52YXNTaXplID0gewogICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSBoZWFkZXJIZWlnaHQsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHRoaXMuX21lc2hWaWV3ZXIuc2V0Q2FudmFzU2l6ZShjYW52YXNTaXplKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmUtcmVuZGVycyBjb21wb25lbnQgaW4gdGhlIGJyb3dzZXIuCiAgICAgICAgICovCiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVDYW52YXNTaXplKCk7CiAgICAgICAgICAgIC8vIERvIG5vdCByZW5kZXIgaWYgbm90IGluIHRoZSBET00uCiAgICAgICAgICAgIGlmICghdGhpcy5pc0Nvbm5lY3RlZCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdGhpcy5fbWVzaFZpZXdlci5kcmF3KCk7CiAgICAgICAgfQogICAgICAgIF9oYXNBdExlYXN0T25lU3RlcChzdGVwcykgewogICAgICAgICAgICByZXR1cm4gISFzdGVwcyAmJiBzdGVwcy5sZW5ndGggPiAwOwogICAgICAgIH0KICAgICAgICBfaGFzTXVsdGlwbGVTdGVwcyhzdGVwcykgewogICAgICAgICAgICByZXR1cm4gISFzdGVwcyAmJiBzdGVwcy5sZW5ndGggPiAxOwogICAgICAgIH0KICAgICAgICBnZXQgX2N1cnJlbnRTdGVwKCkgewogICAgICAgICAgICB2YXIgc3RlcHMgPSB0aGlzLl9zdGVwczsKICAgICAgICAgICAgdmFyIHN0ZXBJbmRleCA9IHRoaXMuX3N0ZXBJbmRleDsKICAgICAgICAgICAgcmV0dXJuIHN0ZXBzW3N0ZXBJbmRleF0gfHwgbnVsbDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9zdGVwVmFsdWUoKSB7CiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTdGVwID0gdGhpcy5fY3VycmVudFN0ZXA7CiAgICAgICAgICAgIGlmICghY3VycmVudFN0ZXApCiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRTdGVwLnN0ZXA7CiAgICAgICAgfQogICAgICAgIGdldCBfY3VycmVudFdhbGxUaW1lKCkgewogICAgICAgICAgICBjb25zdCBjdXJyZW50U3RlcCA9IHRoaXMuX2N1cnJlbnRTdGVwOwogICAgICAgICAgICBpZiAoIWN1cnJlbnRTdGVwKQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSQxKGN1cnJlbnRTdGVwLndhbGxfdGltZSk7CiAgICAgICAgfQogICAgICAgIF9nZXRNYXhTdGVwSW5kZXgoc3RlcHMpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ZXBzLmxlbmd0aCAtIDE7CiAgICAgICAgfQogICAgICAgIF9nZXRTYW1wbGVUZXh0KHNhbXBsZSkgewogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHNhbXBsZSArIDEpOwogICAgICAgIH0KICAgICAgICBfaGFzTXVsdGlwbGVTYW1wbGVzKG9mU2FtcGxlcykgewogICAgICAgICAgICByZXR1cm4gb2ZTYW1wbGVzID4gMTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZVZpZXcoKSB7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZFZpZXcgPSB0aGlzLnNlbGVjdGVkVmlldzsKICAgICAgICAgICAgaWYgKHRoaXMuX21lc2hWaWV3ZXIgJiYgc2VsZWN0ZWRWaWV3ID09ICdhbGwnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tZXNoVmlld2VyLnJlc2V0VmlldygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRvTG9jYWxlU3RyaW5nXyhudW1iZXIpIHsKICAgICAgICAgICAgLy8gU2hvd3MgY29tbWFzIChvciBsb2NhbGUtYXBwcm9wcmlhdGUgcHVuY3R1YXRpb24pIGZvciBsYXJnZSBudW1iZXJzLgogICAgICAgICAgICByZXR1cm4gbnVtYmVyLnRvTG9jYWxlU3RyaW5nKCk7CiAgICAgICAgfQogICAgfTsKICAgIFRmTWVzaExvYWRlckltcGwudGVtcGxhdGUgPSBodG1sIGAKICAgIDx0Zi1jYXJkLWhlYWRpbmcgY29sb3I9IltbX3J1bkNvbG9yXV0iIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1oZWFkZXIiPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU2FtcGxlcyhvZlNhbXBsZXMpXV0iPgogICAgICAgIDxkaXY+c2FtcGxlOiBbW19nZXRTYW1wbGVUZXh0KHNhbXBsZSldXSBvZiBbW29mU2FtcGxlc11dPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfaGFzQXRMZWFzdE9uZVN0ZXAoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLXJvdyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIj4KICAgICAgICAgICAgc3RlcAogICAgICAgICAgICA8c3BhbiBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiCiAgICAgICAgICAgICAgPltbdG9Mb2NhbGVTdHJpbmdfKF9zdGVwVmFsdWUpXV08L3NwYW4KICAgICAgICAgICAgPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJoZWFkaW5nLWxhYmVsIGhlYWRpbmctcmlnaHQiPgogICAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2N1cnJlbnRXYWxsVGltZV1dIj4KICAgICAgICAgICAgICBbW19jdXJyZW50V2FsbFRpbWVdXQogICAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJsYWJlbCByaWdodCI+CiAgICAgICAgICAgIDxwYXBlci1zcGlubmVyLWxpdGUgYWN0aXZlIGhpZGRlbiQ9IltbIV9pc01lc2hMb2FkaW5nXV0iPgogICAgICAgICAgICA8L3BhcGVyLXNwaW5uZXItbGl0ZT4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICA8L3RlbXBsYXRlPgogICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2hhc011bHRpcGxlU3RlcHMoX3N0ZXBzKV1dIj4KICAgICAgICA8ZGl2PgogICAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgICBpZD0ic3RlcHMiCiAgICAgICAgICAgIGltbWVkaWF0ZS12YWx1ZT0ie3tfc3RlcEluZGV4fX0iCiAgICAgICAgICAgIG1heD0iW1tfZ2V0TWF4U3RlcEluZGV4KF9zdGVwcyldXSIKICAgICAgICAgICAgbWF4LW1hcmtlcnM9IltbX2dldE1heFN0ZXBJbmRleChfc3RlcHMpXV0iCiAgICAgICAgICAgIHNuYXBzCiAgICAgICAgICAgIHN0ZXA9IjEiCiAgICAgICAgICAgIHZhbHVlPSJ7e19zdGVwSW5kZXh9fSIKICAgICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC90ZW1wbGF0ZT4KICAgIDwvdGYtY2FyZC1oZWFkaW5nPgogICAgPHN0eWxlPgogICAgICBwYXBlci1zbGlkZXIgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxcHg7CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxcHg7CiAgICAgIH0KICAgICAgLnRmLW1lc2gtbG9hZGVyLWhlYWRlciB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDVweDsKICAgICAgfQogICAgICBbaGlkZGVuXSB7CiAgICAgICAgZGlzcGxheTogbm9uZTsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgInJ1biIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAidGFnIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogTnVtYmVyIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbC5wcm90b3R5cGUsICJzYW1wbGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBOdW1iZXIgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIm9mU2FtcGxlcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IFN0cmluZyB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAic2VsZWN0ZWRWaWV3Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgImFjdGl2ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbC5wcm90b3R5cGUsICJyZXF1ZXN0TWFuYWdlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE1lc2hWaWV3ZXIpCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl9tZXNoVmlld2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXlCdWZmZXJEYXRhUHJvdmlkZXIpCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl9kYXRhUHJvdmlkZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl9jb2xvclNjYWxlRnVuY3Rpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBBcnJheSwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl9zdGVwcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgTnVtYmVyKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbC5wcm90b3R5cGUsICJfc3RlcEluZGV4Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl9tZXNoVmlld2VyQXR0YWNoZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAiX2NhbWVyYVBvc2l0aW9uSW5pdGlhbGl6ZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAiX2lzTWVzaExvYWRpbmciLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ3J1bicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbC5wcm90b3R5cGUsICJfcnVuQ29sb3IiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ3J1bicsICd0YWcnLCAnYWN0aXZlJywgJ19kYXRhUHJvdmlkZXInLCAnX21lc2hWaWV3ZXInKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAicmVsb2FkIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdfY3VycmVudFN0ZXAuKicsICdfbWVzaFZpZXdlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbC5wcm90b3R5cGUsICJfdXBkYXRlU2NlbmUiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19jdXJyZW50U3RlcCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbC5wcm90b3R5cGUsICJfZGVib3VuY2VkRmV0Y2hNZXNoIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3N0ZXBzJywgJ19zdGVwSW5kZXgnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAiX2N1cnJlbnRTdGVwIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX2N1cnJlbnRTdGVwJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl9zdGVwVmFsdWUiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfY3VycmVudFN0ZXAnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmTWVzaExvYWRlckltcGwucHJvdG90eXBlLCAiX2N1cnJlbnRXYWxsVGltZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnc2VsZWN0ZWRWaWV3JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZk1lc2hMb2FkZXJJbXBsLnByb3RvdHlwZSwgIl91cGRhdGVWaWV3IiwgbnVsbCk7CiAgICBUZk1lc2hMb2FkZXJJbXBsID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtbWVzaC1sb2FkZXInKQogICAgXSwgVGZNZXNoTG9hZGVySW1wbCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgTWVzaERhc2hib2FyZCA9IGNsYXNzIE1lc2hEYXNoYm9hcmQgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkT25SZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3RhZ0ZpbHRlciA9ICcuKic7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVmlldyA9ICdhbGwnOwogICAgICAgICAgICB0aGlzLl9yZXF1ZXN0TWFuYWdlciA9IG5ldyBSZXF1ZXN0TWFuYWdlcigpOwogICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncmVzaXplJywgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlV2luZG93UmVzaXplKCk7CiAgICAgICAgICAgIH0sIGZhbHNlKTsKICAgICAgICAgICAgaWYgKHRoaXMucmVsb2FkT25SZWFkeSkKICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIF9nZXRBbGxDaGlsZHJlbigpIHsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5zaGFkb3dSb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RmLW1lc2gtbG9hZGVyJykpOwogICAgICAgIH0KICAgICAgICBfb25DYW1lcmFQb3NpdGlvbkNoYW5nZWQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkVmlldyA9PSAnc2hhcmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRBbGxDaGlsZHJlbigpLmZvckVhY2goKGcpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZlbnQudGFyZ2V0ID09IGcpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsgLy8gRG8gbm90IHVwZGF0ZSB0cmlnZ2VyIGNhbWVyYS4KICAgICAgICAgICAgICAgICAgICBnLnNldENhbWVyYVZpZXdwb2ludChldmVudC5kZXRhaWwucG9zaXRpb24sIGV2ZW50LmRldGFpbC5mYXIsIGV2ZW50LmRldGFpbC50YXJnZXQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3Nob3VsZE9wZW4oaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4IDw9IDI7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgdGhpcy5fZmV0Y2hUYWdzKCkudGhlbih0aGlzLl9yZWxvYWRNZXNoZXMuYmluZCh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIF9oYW5kbGVXaW5kb3dSZXNpemUoKSB7CiAgICAgICAgICAgIHRoaXMuX2dldEFsbENoaWxkcmVuKCkuZm9yRWFjaCgoZykgPT4gewogICAgICAgICAgICAgICAgZy5yZWRyYXcoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9mZXRjaFRhZ3MoKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLnBsdWdpblJvdXRlKCdtZXNoJywgJy90YWdzJyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXF1ZXN0TWFuYWdlci5yZXF1ZXN0KHVybCkudGhlbigocnVuVG9UYWdJbmZvKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobG9kYXNoLmlzRXF1YWwocnVuVG9UYWdJbmZvLCB0aGlzLl9ydW5Ub1RhZ0luZm8pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB1cGRhdGUgYW55dGhpbmcgaWYgdGhlcmUgYXJlIG5vIGNoYW5nZXMuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgcnVuVG9UYWcgPSBsb2Rhc2gubWFwVmFsdWVzKHJ1blRvVGFnSW5mbywgKHgpID0+IE9iamVjdC5rZXlzKHgpKTsKICAgICAgICAgICAgICAgIGNvbnN0IHRhZ3MgPSBnZXRUYWdzKHJ1blRvVGFnKTsKICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFOb3RGb3VuZCA9IHRhZ3MubGVuZ3RoID09PSAwOwogICAgICAgICAgICAgICAgdGhpcy5fcnVuVG9UYWdJbmZvID0gcnVuVG9UYWdJbmZvOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3JlbG9hZE1lc2hlcygpIHsKICAgICAgICAgICAgdGhpcy5fZ2V0QWxsQ2hpbGRyZW4oKS5mb3JFYWNoKChnKSA9PiB7CiAgICAgICAgICAgICAgICBnLnJlbG9hZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9jYXRlZ29yaWVzKCkgewogICAgICAgICAgICB2YXIgcnVuVG9UYWdJbmZvID0gdGhpcy5fcnVuVG9UYWdJbmZvOwogICAgICAgICAgICB2YXIgc2VsZWN0ZWRSdW5zID0gdGhpcy5fc2VsZWN0ZWRSdW5zOwogICAgICAgICAgICB2YXIgdGFnRmlsdGVyID0gdGhpcy5fdGFnRmlsdGVyOwogICAgICAgICAgICBjb25zdCBydW5Ub1RhZyA9IGxvZGFzaC5tYXBWYWx1ZXMocnVuVG9UYWdJbmZvLCAoeCkgPT4gT2JqZWN0LmtleXMoeCkpOwogICAgICAgICAgICBjb25zdCBiYXNlQ2F0ZWdvcmllcyA9IGNhdGVnb3JpemVSdW5UYWdDb21iaW5hdGlvbnMocnVuVG9UYWcsIHNlbGVjdGVkUnVucywgdGFnRmlsdGVyKTsKICAgICAgICAgICAgZnVuY3Rpb24gZXhwbG9kZUl0ZW0oaXRlbSkgewogICAgICAgICAgICAgICAgY29uc3Qgc2FtcGxlcyA9IHJ1blRvVGFnSW5mb1tpdGVtLnJ1bl1baXRlbS50YWddLnNhbXBsZXM7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9kYXNoLnJhbmdlKHNhbXBsZXMpLm1hcCgoaSkgPT4gT2JqZWN0LmFzc2lnbih7fSwgaXRlbSwgewogICAgICAgICAgICAgICAgICAgIHNhbXBsZTogaSwKICAgICAgICAgICAgICAgICAgICBvZlNhbXBsZXM6IHNhbXBsZXMsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgd2l0aFNhbXBsZXMgPSBiYXNlQ2F0ZWdvcmllcy5tYXAoKGNhdGVnb3J5KSA9PiBPYmplY3QuYXNzaWduKHt9LCBjYXRlZ29yeSwgewogICAgICAgICAgICAgICAgaXRlbXM6IFtdLmNvbmNhdC5hcHBseShbXSwgY2F0ZWdvcnkuaXRlbXMubWFwKGV4cGxvZGVJdGVtKSksCiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHdpdGhTYW1wbGVzOwogICAgICAgIH0KICAgIH07CiAgICBNZXNoRGFzaGJvYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBzbG90PSJzaWRlYmFyIiBjbGFzcz0iYWxsLWNvbnRyb2xzIj4KICAgICAgICA8ZGl2IGNsYXNzPSJzZXR0aW5ncyI+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJzaWRlYmFyLXNlY3Rpb24gdmlldy1jb250cm9sIj4KICAgICAgICAgICAgPGgzIGNsYXNzPSJ0aXRsZSI+UG9pbnQgb2YgdmlldzwvaDM+CiAgICAgICAgICAgIDxkaXY+CiAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWdyb3VwCiAgICAgICAgICAgICAgICBpZD0idmlldy1yYWRpby1ncm91cCIKICAgICAgICAgICAgICAgIHNlbGVjdGVkPSJ7e19zZWxlY3RlZFZpZXd9fSIKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICA8cGFwZXItcmFkaW8tYnV0dG9uIGlkPSJhbGwtcmFkaW8tYnV0dG9uIiBuYW1lPSJhbGwiPgogICAgICAgICAgICAgICAgICBEaXNwbGF5IGFsbCBwb2ludHMKICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICBmb3I9ImFsbC1yYWRpby1idXR0b24iCiAgICAgICAgICAgICAgICAgIHBvc2l0aW9uPSJyaWdodCIKICAgICAgICAgICAgICAgICAgb2Zmc2V0PSIwIgogICAgICAgICAgICAgICAgPgogICAgICAgICAgICAgICAgICBab29tIGFuZCBjZW50ZXIgY2FtZXJhIHRvIGRpc3BsYXkgYWxsIHBvaW50cyBhdCBvbmNlLiBOb3RlLAogICAgICAgICAgICAgICAgICB0aGF0IHNvbWUgcG9pbnRzIGNvdWxkIGJlIHRvbyBmYXIgKGkuZS4gdG9vIHNtYWxsKSB0byBiZQogICAgICAgICAgICAgICAgICB2aXNpYmxlLgogICAgICAgICAgICAgICAgPC9wYXBlci10b29sdGlwPgogICAgICAgICAgICAgICAgPHBhcGVyLXJhZGlvLWJ1dHRvbiBpZD0idXNlci1yYWRpby1idXR0b24iIG5hbWU9InVzZXIiPgogICAgICAgICAgICAgICAgICBDdXJyZW50IHZpZXcKICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICBmb3I9InVzZXItcmFkaW8tYnV0dG9uIgogICAgICAgICAgICAgICAgICBwb3NpdGlvbj0icmlnaHQiCiAgICAgICAgICAgICAgICAgIG9mZnNldD0iMCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgS2VlcCBjdXJyZW50IGNhbWVyYSBwb3NpdGlvbiBhbmQgem9vbSBsZXZlbC4KICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICAgIDxwYXBlci1yYWRpby1idXR0b24gaWQ9InNoYXJlLXJhZGlvLWJ1dHRvbiIgbmFtZT0ic2hhcmUiPgogICAgICAgICAgICAgICAgICBTaGFyZSB2aWV3cG9pbnQKICAgICAgICAgICAgICAgIDwvcGFwZXItcmFkaW8tYnV0dG9uPgogICAgICAgICAgICAgICAgPHBhcGVyLXRvb2x0aXAKICAgICAgICAgICAgICAgICAgYW5pbWF0aW9uLWRlbGF5PSIwIgogICAgICAgICAgICAgICAgICBmb3I9InNoYXJlLXJhZGlvLWJ1dHRvbiIKICAgICAgICAgICAgICAgICAgcG9zaXRpb249InJpZ2h0IgogICAgICAgICAgICAgICAgICBvZmZzZXQ9IjAiCiAgICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgICAgIFNoYXJlIHZpZXdwb2ludCBhbW9uZyBhbGwgY2FtZXJhcy4KICAgICAgICAgICAgICAgIDwvcGFwZXItdG9vbHRpcD4KICAgICAgICAgICAgICA8L3BhcGVyLXJhZGlvLWdyb3VwPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyBwb2ludCBjbG91ZCBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBwb2ludCBjbG91ZCBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuCiAgICAgICAgICAgICAgPC9saT4KICAgICAgICAgICAgICA8bGk+VGVuc29yQm9hcmQgY2Fu4oCZdCBmaW5kIHlvdXIgZXZlbnQgZmlsZXMuPC9saT4KICAgICAgICAgICAgPC91bD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdeKAmXJlIG5ldyB0byB1c2luZyBUZW5zb3JCb2FyZCwgYW5kIHdhbnQgdG8gZmluZCBvdXQgaG93IHRvCiAgICAgICAgICAgICAgYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCIKICAgICAgICAgICAgICAgID5SRUFETUU8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIHBlcmhhcHMgdGhlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vd3d3LnRlbnNvcmZsb3cub3JnL2dldF9zdGFydGVkL3N1bW1hcmllc19hbmRfdGVuc29yYm9hcmQiCiAgICAgICAgICAgICAgICA+VGVuc29yQm9hcmQgdHV0b3JpYWw8L2EKICAgICAgICAgICAgICA+LgogICAgICAgICAgICA8L3A+CgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3UgdGhpbmsgVGVuc29yQm9hcmQgaXMgY29uZmlndXJlZCBwcm9wZXJseSwgcGxlYXNlIHNlZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQjbXktdGVuc29yYm9hcmQtaXNudC1zaG93aW5nLWFueS1kYXRhLXdoYXRzLXdyb25nIgogICAgICAgICAgICAgICAgPnRoZSBzZWN0aW9uIG9mIHRoZSBSRUFETUUgZGV2b3RlZCB0byBtaXNzaW5nIGRhdGEgcHJvYmxlbXM8L2EKICAgICAgICAgICAgICA+CiAgICAgICAgICAgICAgYW5kIGNvbnNpZGVyIGZpbGluZyBhbiBpc3N1ZSBvbiBHaXRIdWIuCiAgICAgICAgICAgIDwvcD4KICAgICAgICAgIDwvZGl2PgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20taWYiIGlmPSJbWyFfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPHRmLXRhZy1maWx0ZXJlciB0YWctZmlsdGVyPSJ7e190YWdGaWx0ZXJ9fSI+PC90Zi10YWctZmlsdGVyZXI+CiAgICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1yZXBlYXQiIGl0ZW1zPSJbW19jYXRlZ29yaWVzXV0iIGFzPSJjYXRlZ29yeSI+CiAgICAgICAgICAgIDx0Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldwogICAgICAgICAgICAgIGNhdGVnb3J5PSJbW2NhdGVnb3J5XV0iCiAgICAgICAgICAgICAgaW5pdGlhbC1vcGVuZWQ9IltbX3Nob3VsZE9wZW4oaW5kZXgpXV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtbWVzaC1sb2FkZXIKICAgICAgICAgICAgICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgICAgICAgICAgICAgICBzZWxlY3RlZC12aWV3PSJbW19zZWxlY3RlZFZpZXddXSIKICAgICAgICAgICAgICAgICAgcnVuPSJbW2l0ZW0ucnVuXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICBzYW1wbGU9IltbaXRlbS5zYW1wbGVdXSIKICAgICAgICAgICAgICAgICAgb2Ytc2FtcGxlcz0iW1tpdGVtLm9mU2FtcGxlc11dIgogICAgICAgICAgICAgICAgICByZXF1ZXN0LW1hbmFnZXI9IltbX3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgICAgICAgICAgICAgIGNsYXNzPSJ0Zi1tZXNoLWxvYWRlci1jb250YWluZXIiCiAgICAgICAgICAgICAgICAgIG9uLWNhbWVyYS1wb3NpdGlvbi1jaGFuZ2U9Il9vbkNhbWVyYVBvc2l0aW9uQ2hhbmdlZCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDwvdGYtbWVzaC1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KICAgICAgcGFwZXItcmFkaW8tYnV0dG9uIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nOiA1cHg7CiAgICAgIH0KICAgICAgLnNpZGViYXItc2VjdGlvbiBoMy50aXRsZSB7CiAgICAgICAgY29sb3I6IHZhcigtLXBhcGVyLWdyZXktODAwKTsKICAgICAgICBtYXJnaW46IDA7CiAgICAgICAgZm9udC13ZWlnaHQ6IG5vcm1hbDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogNXB4OwogICAgICB9CgogICAgICAucnVucy1zZWxlY3RvciB7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICB9CgogICAgICB0Zi1ydW5zLXNlbGVjdG9yIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIHsKICAgICAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50OwogICAgICB9CgogICAgICAudmlldy1jb250cm9sIGgzLnRpdGxlIHsKICAgICAgICBwYWRkaW5nLXRvcDogMTZweDsKICAgICAgICBwYWRkaW5nLWJvdHRvbTogMTZweDsKICAgICAgfQoKICAgICAgLmFsbGNvbnRyb2xzIC52aWV3LWNvbnRyb2wgcGFwZXItcmFkaW8tZ3JvdXAgewogICAgICAgIG1hcmdpbi10b3A6IDVweDsKICAgICAgfQogICAgICAvKiBMYXlvdXQgbXVzdCBiZSBob3Jpem9udGFsLCBpLmUuIGl0ZW1zIGFycmFuZ2VkIGluIGEgcm93LiBJZiBpdGVtcyBjYW5ub3QgZml0IGluIGEgcm93LAogICAgICAgKiB0aGV5IHNob3VsZCBiZSBtb3ZlZCB0byBuZXh0IGxpbmUuIEFsbCBpdGVtcyBtdXN0IGJlIHNxdWFyZSBhdCBhbGwgdGltZXMuIE1pbmltdW0gc2l6ZSBvZgogICAgICAgKiB0aGUgaXRlbSBpcyA0ODBweC4gVGhpcyBtZWFucyB0aGF0IG1heGltdW0gc2l6ZSBvZiB0aGUgaXRlbSBtdXN0IGJlIDQ4MHB4ICsgNDc5cHggPSA5NTlweC4KICAgICAgICogKi8KICAgICAgLmhvcml6b250YWwgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IHJvdzsKICAgICAgICBmbGV4LXdyYXA6IHdyYXA7CiAgICAgIH0KICAgICAgdGYtbWVzaC1sb2FkZXIgewogICAgICAgIHdpZHRoOiA0ODBweDsKICAgICAgICBmbGV4LWJhc2lzOiA0ODBweDsKICAgICAgICBmbGV4LWdyb3c6IDE7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBNZXNoRGFzaGJvYXJkLnByb3RvdHlwZSwgInJlbG9hZE9uUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgTWVzaERhc2hib2FyZC5wcm90b3R5cGUsICJfc2VsZWN0ZWRSdW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgTWVzaERhc2hib2FyZC5wcm90b3R5cGUsICJfcnVuVG9UYWdJbmZvIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBNZXNoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kYXRhTm90Rm91bmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBNZXNoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBTdHJpbmcsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFN0cmluZykKICAgIF0sIE1lc2hEYXNoYm9hcmQucHJvdG90eXBlLCAiX3NlbGVjdGVkVmlldyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIE1lc2hEYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfcnVuVG9UYWdJbmZvJywgJ19zZWxlY3RlZFJ1bnMnLCAnX3RhZ0ZpbHRlcicpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBNZXNoRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYXRlZ29yaWVzIiwgbnVsbCk7CiAgICBNZXNoRGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgnbWVzaC1kYXNoYm9hcmQnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgTWVzaERhc2hib2FyZCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZQckN1cnZlQ2FyZCA9IGNsYXNzIFRmUHJDdXJ2ZUNhcmQgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX2V4cGFuZGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5ID0ge307CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkgPSB7fTsKICAgICAgICAgICAgdGhpcy5fY29sb3JTY2FsZUZ1bmN0aW9uID0geyBzY2FsZTogcnVuc0NvbG9yU2NhbGUgfTsKICAgICAgICAgICAgdGhpcy5fY2FuY2VsbGVyID0gbmV3IENhbmNlbGxlcigpOwogICAgICAgICAgICB0aGlzLl94Q29tcG9uZW50c0NyZWF0aW9uTWV0aG9kID0gKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSBuZXcgc3JjJDIuU2NhbGVzLkxpbmVhcigpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBzY2FsZTogc2NhbGUsCiAgICAgICAgICAgICAgICAgICAgYXhpczogbmV3IHNyYyQyLkF4ZXMuTnVtZXJpYyhzY2FsZSwgJ2JvdHRvbScpLAogICAgICAgICAgICAgICAgICAgIGFjY2Vzc29yOiAoZCkgPT4gZC5yZWNhbGwsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl95VmFsdWVBY2Nlc3NvciA9IChkKSA9PiBkLnByZWNpc2lvbjsKICAgICAgICAgICAgdGhpcy5fdG9vbHRpcENvbHVtbnMgPSAoKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgdmFsdWVGb3JtYXR0ZXIgPSBtdWx0aXNjYWxlRm9ybWF0dGVyKFlfVE9PTFRJUF9GT1JNQVRURVJfUFJFQ0lTSU9OKTsKICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdFZhbHVlT3JOYU4gPSAoeCkgPT4gKGlzTmFOKHgpID8gJ05hTicgOiB2YWx1ZUZvcm1hdHRlcih4KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdSdW4nLAogICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IGQuZGF0YXNldC5tZXRhZGF0YSgpLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnVGhyZXNob2xkJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBmb3JtYXRWYWx1ZU9yTmFOKGQuZGF0dW0udGhyZXNob2xkcyksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUHJlY2lzaW9uJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBmb3JtYXRWYWx1ZU9yTmFOKGQuZGF0dW0ucHJlY2lzaW9uKSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdSZWNhbGwnLAogICAgICAgICAgICAgICAgICAgICAgICBldmFsdWF0ZTogKGQpID0+IGZvcm1hdFZhbHVlT3JOYU4oZC5kYXR1bS5yZWNhbGwpLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ1RQJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBkLmRhdHVtLnRydWVfcG9zaXRpdmVzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogJ0ZQJywKICAgICAgICAgICAgICAgICAgICAgICAgZXZhbHVhdGU6IChkKSA9PiBkLmRhdHVtLmZhbHNlX3Bvc2l0aXZlcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdUTicsCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlOiAoZCkgPT4gZC5kYXR1bS50cnVlX25lZ2F0aXZlcywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGU6ICdGTicsCiAgICAgICAgICAgICAgICAgICAgICAgIGV2YWx1YXRlOiAoZCkgPT4gZC5kYXR1bS5mYWxzZV9uZWdhdGl2ZXMsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgIH0pKCk7CiAgICAgICAgICAgIHRoaXMuX3Nlcmllc0RhdGFGaWVsZHMgPSBbCiAgICAgICAgICAgICAgICAndGhyZXNob2xkcycsCiAgICAgICAgICAgICAgICAncHJlY2lzaW9uJywKICAgICAgICAgICAgICAgICdyZWNhbGwnLAogICAgICAgICAgICAgICAgJ3RydWVfcG9zaXRpdmVzJywKICAgICAgICAgICAgICAgICdmYWxzZV9wb3NpdGl2ZXMnLAogICAgICAgICAgICAgICAgJ3RydWVfbmVnYXRpdmVzJywKICAgICAgICAgICAgICAgICdmYWxzZV9uZWdhdGl2ZXMnLAogICAgICAgICAgICBdOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0WFJhbmdlID0gWy0wLjA1LCAxLjA1XTsKICAgICAgICAgICAgdGhpcy5fZGVmYXVsdFlSYW5nZSA9IFstMC4wNSwgMS4wNV07CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3REYXRhID0gKGl0ZW1zLCBvbkxvYWQsIG9uRmluaXNoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZXIgPSBnZXRSb3V0ZXIoKTsKICAgICAgICAgICAgICAgIGNvbnN0IGJhc2VVcmwgPSByb3V0ZXIucGx1Z2luUm91dGUoJ3ByX2N1cnZlcycsICcvcHJfY3VydmVzJyk7CiAgICAgICAgICAgICAgICBQcm9taXNlLmFsbChpdGVtcy5tYXAoKGl0ZW0pID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBydW4gPSBpdGVtOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZyA9IHRoaXMudGFnOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGFkZFBhcmFtcyhiYXNlVXJsLCB7IHRhZywgcnVuIH0pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3RNYW5hZ2VyCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1ZXN0KHVybCkKICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4oKGRhdGEpID0+IHZvaWQgb25Mb2FkKHsgaXRlbSwgZGF0YSB9KSk7CiAgICAgICAgICAgICAgICB9KSkuZmluYWxseSgoKSA9PiB2b2lkIG9uRmluaXNoKCkpOwogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9zbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIF9jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCkgewogICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGRhdGEgaXMgcmVjZWl2ZWQgZnJvbSB0aGUgYmFja2VuZC4KICAgICAgICAgICAgcmV0dXJuIChjaGFydCwgcnVuLCBkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBUaGUgZGF0YSBtYXBzIGEgc2luZ2xlIHJ1biB0byBhIHNlcmllcyBvZiBkYXRhLiBXZSBtZXJnZSB0aGF0IGRhdGEKICAgICAgICAgICAgICAgIC8vIHdpdGggdGhlIGRhdGEgYWxyZWFkeSBmZXRjaGVkLgogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19ydW5Ub0RhdGFPdmVyVGltZScsIE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3J1blRvRGF0YU92ZXJUaW1lLCBkYXRhKSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlUnVuQ29sb3IocnVuKSB7CiAgICAgICAgICAgIHJldHVybiBydW5zQ29sb3JTY2FsZShydW4pOwogICAgICAgIH0KICAgICAgICBjb25uZWN0ZWRDYWxsYmFjaygpIHsKICAgICAgICAgICAgc3VwZXIuY29ubmVjdGVkQ2FsbGJhY2soKTsKICAgICAgICAgICAgLy8gRGVmZXIgcmVsb2FkaW5nIHVudGlsIGFmdGVyIHdlJ3JlIGF0dGFjaGVkLCBiZWNhdXNlIHRoYXQgZW5zdXJlcyB0aGF0CiAgICAgICAgICAgIC8vIHRoZSByZXF1ZXN0TWFuYWdlciBoYXMgYmVlbiBzZXQgZnJvbSBhYm92ZS4gKFBvbHltZXIgaXMgdHJpY2t5CiAgICAgICAgICAgIC8vIHNvbWV0aW1lcykKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICBfZ2V0Q2hhcnREYXRhTG9hZGVyKCkgewogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW5uZWNlc3NhcnktdHlwZS1hc3NlcnRpb24KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc2hhZG93Um9vdC5xdWVyeVNlbGVjdG9yKCd0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyJyk7IC8vIFRmTGluZUNoYXJ0RGF0YUxvYWRlcgogICAgICAgIH0KICAgICAgICByZWxvYWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fYXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5ydW5zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgLy8gVGhlcmUgYXJlIG5vIHNlbGVjdGVkIHJ1bnMuCiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3J1blRvRGF0YU92ZXJUaW1lJywge30pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICBfc2V0Q2hhcnREYXRhKCkgewogICAgICAgICAgICB2YXIgcnVuVG9QckN1cnZlRW50cnkgPSB0aGlzLl9ydW5Ub1ByQ3VydmVFbnRyeTsKICAgICAgICAgICAgdmFyIHByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkgPSB0aGlzLl9wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5OwogICAgICAgICAgICB2YXIgc2V0T2ZSZWxldmFudFJ1bnMgPSB0aGlzLl9zZXRPZlJlbGV2YW50UnVuczsKICAgICAgICAgICAgbG9kYXNoLmZvck93bihydW5Ub1ByQ3VydmVFbnRyeSwgKGVudHJ5LCBydW4pID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzRW50cnkgPSBwcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5W3J1bl07CiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNFbnRyeSAmJiBydW5Ub1ByQ3VydmVFbnRyeVtydW5dLnN0ZXAgPT09IHByZXZpb3VzRW50cnkuc3RlcCkgewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBQUiBjdXJ2ZSBmb3IgdGhpcyBydW4gZG9lcyBub3QgbmVlZCB0byBiZSB1cGRhdGVkLgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghc2V0T2ZSZWxldmFudFJ1bnNbcnVuXSkgewogICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoaXMgZGF0YXNldCAtIHRoZSB1c2VyIGhhcyB1bnNlbGVjdGVkIGl0LgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU2VyaWVzRGF0YShydW4pOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVNlcmllc0RhdGFGb3JSdW4ocnVuLCBlbnRyeSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfdXBkYXRlU2VyaWVzRGF0YUZvclJ1bihydW4sIGVudHJ5Rm9yT25lU3RlcCkgewogICAgICAgICAgICAvLyBSZXZlcnNlIHRoZSB2YWx1ZXMgc28gdGhleSBhcmUgcGxvdHRlZCBpbiBvcmRlci4gVGhlIGxvZ2ljIHdpdGhpbgogICAgICAgICAgICAvLyB0aGUgbGluZSBjaGFydCBmb3IgYXNzb2NpYXRpbmcgaW5mb3JtYXRpb24gdG8gc2hvdyBpbiB0aGUgdG9vbHRpcAogICAgICAgICAgICAvLyB3aXRoIHBvaW50cyBpbiB0aGUgY2hhcnQgYXNzdW1lcyB0aGF0IHRoZSBzZXJpZXMgZGF0YSBpcyBvcmRlcmVkCiAgICAgICAgICAgIC8vIGJ5IHRoZSB2YXJpYWJsZSBvbiB0aGUgWCBheGlzLiBJZiB0aGUgdmFsdWVzIGFyZSBub3QgaW4gb3JkZXIsCiAgICAgICAgICAgIC8vIHRvb2x0aXBzIHdpbGwgbm90IHdvcmsgYmVjYXVzZSB0aGUgdG9vbHRpcCB3aWxsIGFsd2F5cyBiZSBzdHVjayBvbgogICAgICAgICAgICAvLyBvbmUgc2lkZSBvZiB0aGUgY2hhcnQuCiAgICAgICAgICAgIGNvbnN0IGZpZWxkc1RvRGF0YSA9IGxvZGFzaC5yZWR1Y2UodGhpcy5fc2VyaWVzRGF0YUZpZWxkcywgKHJlc3VsdCwgZmllbGQpID0+IHsKICAgICAgICAgICAgICAgIHJlc3VsdFtmaWVsZF0gPSBlbnRyeUZvck9uZVN0ZXBbZmllbGRdLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgfSwge30pOwogICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHNlcmllcyBkYXRhIGlzIGVxdWFsIHRvIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBhbnkgb2YKICAgICAgICAgICAgLy8gdGhlIGZpZWxkcy4gV2UganVzdCB1c2UgdGhlIGZpcnN0IGZpZWxkIHRvIGdhdWdlIHRoZSBsZW5ndGguCiAgICAgICAgICAgIGNvbnN0IHNlcmllc0RhdGEgPSBuZXcgQXJyYXkoZmllbGRzVG9EYXRhW3RoaXMuX3Nlcmllc0RhdGFGaWVsZHNbMF1dLmxlbmd0aCk7CiAgICAgICAgICAgIC8vIENyZWF0ZSBhIGxpc3Qgb2YgZGF0YSBmb3IgdmlzdWFsaXphdGlvbi4KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZXJpZXNEYXRhLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzZXJpZXNEYXRhW2ldID0gbG9kYXNoLm1hcFZhbHVlcyhmaWVsZHNUb0RhdGEsICh2YWx1ZXMpID0+IHZhbHVlc1tpXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbG9hZGVyID0gdGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCk7CiAgICAgICAgICAgIGxvYWRlci5zZXRTZXJpZXNEYXRhKHJ1biwgc2VyaWVzRGF0YSk7CiAgICAgICAgICAgIGxvYWRlci5jb21taXRDaGFuZ2VzKCk7CiAgICAgICAgfQogICAgICAgIF9jbGVhclNlcmllc0RhdGEocnVuKSB7CiAgICAgICAgICAgIC8vIENsZWFycyBkYXRhIGZvciBhIHJ1biBpbiB0aGUgY2hhcnQuCiAgICAgICAgICAgIGNvbnN0IGxvYWRlciA9IHRoaXMuX2dldENoYXJ0RGF0YUxvYWRlcigpOwogICAgICAgICAgICBsb2FkZXIuc2V0U2VyaWVzRGF0YShydW4sIFtdKTsKICAgICAgICAgICAgbG9hZGVyLmNvbW1pdENoYW5nZXMoKTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZVJ1blRvUHJDdXJ2ZUVudHJ5KCkgewogICAgICAgICAgICB2YXIgcnVuVG9EYXRhT3ZlclRpbWUgPSB0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZTsKICAgICAgICAgICAgdmFyIHJ1blRvU3RlcENhcCA9IHRoaXMucnVuVG9TdGVwQ2FwOwogICAgICAgICAgICBjb25zdCBydW5Ub0VudHJ5ID0ge307CiAgICAgICAgICAgIGxvZGFzaC5mb3JPd24ocnVuVG9EYXRhT3ZlclRpbWUsIChlbnRyaWVzLCBydW4pID0+IHsKICAgICAgICAgICAgICAgIGlmICghZW50cmllcyB8fCAhZW50cmllcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBydW5Ub0VudHJ5W3J1bl0gPSB0aGlzLl9jb21wdXRlRW50cnlDbG9zZXN0T3JFcXVhbFRvU3RlcENhcChydW5Ub1N0ZXBDYXBbcnVuXSwgZW50cmllcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBTZXQgdGhlIHByZXZpb3VzIFBSIGN1cnZlIGVudHJ5IHNvIHdlIGNhbiBsYXRlciBjb21wYXJlIGFuZCBvbmx5CiAgICAgICAgICAgIC8vIHJlZHJhdyBmb3IgcnVucyB0aGF0IGNoYW5nZWQgaW4gc3RlcC4KICAgICAgICAgICAgdGhpcy5zZXQoJ19wcmV2aW91c1J1blRvUHJDdXJ2ZUVudHJ5JywgdGhpcy5fcnVuVG9QckN1cnZlRW50cnkpOwogICAgICAgICAgICB0aGlzLnNldCgnX3J1blRvUHJDdXJ2ZUVudHJ5JywgcnVuVG9FbnRyeSk7CiAgICAgICAgfQogICAgICAgIF9ub3RpZnlEYXRhQ2hhbmdlKCkgewogICAgICAgICAgICB2YXIgcnVuVG9EYXRhT3ZlclRpbWUgPSB0aGlzLl9ydW5Ub0RhdGFPdmVyVGltZTsKICAgICAgICAgICAgaWYgKHRoaXMub25EYXRhQ2hhbmdlKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uRGF0YUNoYW5nZShydW5Ub0RhdGFPdmVyVGltZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVFbnRyeUNsb3Nlc3RPckVxdWFsVG9TdGVwQ2FwKHN0ZXBDYXAsIGVudHJpZXMpIHsKICAgICAgICAgICAgY29uc3QgZW50cnlJbmRleCA9IE1hdGgubWluKGxvZGFzaC5zb3J0ZWRJbmRleChlbnRyaWVzLm1hcCgoZW50cnkpID0+IGVudHJ5LnN0ZXApLCBzdGVwQ2FwKSwgZW50cmllcy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgcmV0dXJuIGVudHJpZXNbZW50cnlJbmRleF07CiAgICAgICAgfQogICAgICAgIGdldCBfcnVuc1dpdGhTdGVwQXZhaWxhYmxlKCkgewogICAgICAgICAgICB2YXIgcnVucyA9IHRoaXMucnVuczsKICAgICAgICAgICAgdmFyIGFjdHVhbFByQ3VydmVFbnRyeVBlclJ1biA9IHRoaXMuX3J1blRvUHJDdXJ2ZUVudHJ5OwogICAgICAgICAgICByZXR1cm4gbG9kYXNoLmZpbHRlcihydW5zLCAocnVuKSA9PiBhY3R1YWxQckN1cnZlRW50cnlQZXJSdW5bcnVuXSkuc29ydCgpOwogICAgICAgIH0KICAgICAgICBnZXQgX3NldE9mUmVsZXZhbnRSdW5zKCkgewogICAgICAgICAgICB2YXIgcnVuc1dpdGhTdGVwQXZhaWxhYmxlID0gdGhpcy5fcnVuc1dpdGhTdGVwQXZhaWxhYmxlOwogICAgICAgICAgICBjb25zdCBzZXRPZlJlbGV2YW50UnVucyA9IHt9OwogICAgICAgICAgICBsb2Rhc2guZm9yRWFjaChydW5zV2l0aFN0ZXBBdmFpbGFibGUsIChydW4pID0+IHsKICAgICAgICAgICAgICAgIHNldE9mUmVsZXZhbnRSdW5zW3J1bl0gPSB0cnVlOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHNldE9mUmVsZXZhbnRSdW5zOwogICAgICAgIH0KICAgICAgICBfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKHJ1blRvUHJDdXJ2ZUVudHJ5LCBydW4pIHsKICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBmb3IgdGhlIHJ1biwgdGhlbiB0aGUgcnVuIGlzIG5vdCBiZWluZyBzaG93biwgc28KICAgICAgICAgICAgLy8gdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC4gV2UgcmV0dXJuIG51bGwgYXMgYSByZWFzb25hYmxlIHZhbHVlLgogICAgICAgICAgICBjb25zdCBlbnRyeSA9IHJ1blRvUHJDdXJ2ZUVudHJ5W3J1bl07CiAgICAgICAgICAgIHJldHVybiBlbnRyeSA/IGVudHJ5LnN0ZXAgOiBudWxsOwogICAgICAgIH0KICAgICAgICBfY29tcHV0ZUN1cnJlbnRXYWxsVGltZUZvclJ1bihydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKSB7CiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gcnVuVG9QckN1cnZlRW50cnlbcnVuXTsKICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gZGF0YSBmb3IgdGhlIHJ1biwgdGhlbiB0aGUgcnVuIGlzIG5vdCBiZWluZyBzaG93biwgc28KICAgICAgICAgICAgLy8gdGhlIHJldHVybiB2YWx1ZSBpcyBub3QgdXNlZC4gV2UgcmV0dXJuIG51bGwgYXMgYSByZWFzb25hYmxlIHZhbHVlLgogICAgICAgICAgICBpZiAoIWVudHJ5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IERhdGUoZW50cnkud2FsbF90aW1lICogMTAwMCkudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgX3RvZ2dsZUV4cGFuZGVkKGUpIHsKICAgICAgICAgICAgdGhpcy5zZXQoJ19leHBhbmRlZCcsICF0aGlzLl9leHBhbmRlZCk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIF9yZXNldERvbWFpbigpIHsKICAgICAgICAgICAgdGhpcy5fZ2V0Q2hhcnREYXRhTG9hZGVyKCkucmVzZXREb21haW4oKTsKICAgICAgICB9CiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLl9nZXRDaGFydERhdGFMb2FkZXIoKS5yZWRyYXcoKTsKICAgICAgICB9CiAgICB9OwogICAgVGZQckN1cnZlQ2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZwogICAgICB0YWc9IltbdGFnXV0iCiAgICAgIGRpc3BsYXktbmFtZT0iW1t0YWdNZXRhZGF0YS5kaXNwbGF5TmFtZV1dIgogICAgICBkZXNjcmlwdGlvbj0iW1t0YWdNZXRhZGF0YS5kZXNjcmlwdGlvbl1dIgogICAgPjwvdGYtY2FyZC1oZWFkaW5nPgoKICAgIDx0Zi1saW5lLWNoYXJ0LWRhdGEtbG9hZGVyCiAgICAgIHgtY29tcG9uZW50cy1jcmVhdGlvbi1tZXRob2Q9IltbX3hDb21wb25lbnRzQ3JlYXRpb25NZXRob2RdXSIKICAgICAgeS12YWx1ZS1hY2Nlc3Nvcj0iW1tfeVZhbHVlQWNjZXNzb3JdXSIKICAgICAgdG9vbHRpcC1jb2x1bW5zPSJbW190b29sdGlwQ29sdW1uc11dIgogICAgICBjb2xvci1zY2FsZT0iW1tfY29sb3JTY2FsZUZ1bmN0aW9uXV0iCiAgICAgIGRlZmF1bHQteC1yYW5nZT0iW1tfZGVmYXVsdFhSYW5nZV1dIgogICAgICBkZWZhdWx0LXktcmFuZ2U9IltbX2RlZmF1bHRZUmFuZ2VdXSIKICAgICAgc21vb3RoaW5nLWVuYWJsZWQ9IltbX3Ntb290aGluZ0VuYWJsZWRdXSIKICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW3JlcXVlc3RNYW5hZ2VyXV0iCiAgICAgIGRhdGEtdG8tbG9hZD0iW1tydW5zXV0iCiAgICAgIGRhdGEtc2VyaWVzPSJbW3J1bnNdXSIKICAgICAgbG9hZC1rZXk9IltbdGFnXV0iCiAgICAgIHJlcXVlc3QtZGF0YT0iW1tfcmVxdWVzdERhdGFdXSIKICAgICAgbG9hZC1kYXRhLWNhbGxiYWNrPSJbW19jcmVhdGVQcm9jZXNzRGF0YUZ1bmN0aW9uKCldXSIKICAgICAgYWN0aXZlPSJbW2FjdGl2ZV1dIgogICAgPjwvdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlcj4KCiAgICA8ZGl2IGlkPSJidXR0b25zLXJvdyI+CiAgICAgIDxwYXBlci1pY29uLWJ1dHRvbgogICAgICAgIHNlbGVjdGVkJD0iW1tfZXhwYW5kZWRdXSIKICAgICAgICBpY29uPSJmdWxsc2NyZWVuIgogICAgICAgIG9uLXRhcD0iX3RvZ2dsZUV4cGFuZGVkIgogICAgICA+PC9wYXBlci1pY29uLWJ1dHRvbj4KICAgICAgPHBhcGVyLWljb24tYnV0dG9uCiAgICAgICAgaWNvbj0ic2V0dGluZ3Mtb3ZlcnNjYW4iCiAgICAgICAgb24tdGFwPSJfcmVzZXREb21haW4iCiAgICAgICAgdGl0bGU9IlJlc2V0IGF4ZXMgdG8gWzAsIDFdLiIKICAgICAgPjwvcGFwZXItaWNvbi1idXR0b24+CiAgICA8L2Rpdj4KCiAgICA8ZGl2IGlkPSJzdGVwLWxlZ2VuZCI+CiAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX3J1bnNXaXRoU3RlcEF2YWlsYWJsZV1dIiBhcz0icnVuIj4KICAgICAgICA8ZGl2IGNsYXNzPSJsZWdlbmQtcm93Ij4KICAgICAgICAgIDxkaXYKICAgICAgICAgICAgY2xhc3M9ImNvbG9yLWJveCIKICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQ6IFtbX2NvbXB1dGVSdW5Db2xvcihydW4pXV07IgogICAgICAgICAgPjwvZGl2PgogICAgICAgICAgW1tydW5dXSBpcyBhdAogICAgICAgICAgPHNwYW4gY2xhc3M9InN0ZXAtbGFiZWwtdGV4dCI+CiAgICAgICAgICAgIHN0ZXAgW1tfY29tcHV0ZUN1cnJlbnRTdGVwRm9yUnVuKF9ydW5Ub1ByQ3VydmVFbnRyeSwgcnVuKV1dIDwvc3BhbgogICAgICAgICAgPjxiciAvPgogICAgICAgICAgPHNwYW4gY2xhc3M9IndhbGwtdGltZS1sYWJlbC10ZXh0Ij4KICAgICAgICAgICAgKFtbX2NvbXB1dGVDdXJyZW50V2FsbFRpbWVGb3JSdW4oX3J1blRvUHJDdXJ2ZUVudHJ5LCBydW4pXV0pCiAgICAgICAgICA8L3NwYW4+CiAgICAgICAgPC9kaXY+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgd2lkdGg6IDUwMHB4OwogICAgICAgIG1hcmdpbi1yaWdodDogMTBweDsKICAgICAgICBtYXJnaW4tYm90dG9tOiAyNXB4OwogICAgICB9CiAgICAgIDpob3N0KFtfZXhwYW5kZWRdKSB7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgdGYtbGluZS1jaGFydC1kYXRhLWxvYWRlciB7CiAgICAgICAgaGVpZ2h0OiAzMDBweDsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgOmhvc3QoW19leHBhbmRlZF0pIHRmLWxpbmUtY2hhcnQtZGF0YS1sb2FkZXIgewogICAgICAgIGhlaWdodDogNjAwcHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiByb3c7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uIHsKICAgICAgICBjb2xvcjogIzIxOTZmMzsKICAgICAgICBib3JkZXItcmFkaXVzOiAxMDAlOwogICAgICAgIHdpZHRoOiAzMnB4OwogICAgICAgIGhlaWdodDogMzJweDsKICAgICAgICBwYWRkaW5nOiA0cHg7CiAgICAgIH0KICAgICAgI2J1dHRvbnMtcm93IHBhcGVyLWljb24tYnV0dG9uW3NlbGVjdGVkXSB7CiAgICAgICAgYmFja2dyb3VuZDogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgfQogICAgICAjc3RlcC1sZWdlbmQgewogICAgICAgIGJveC1zaXppbmc6IGJvcmRlci1ib3g7CiAgICAgICAgZm9udC1zaXplOiAwLjhlbTsKICAgICAgICBtYXgtaGVpZ2h0OiAyMDBweDsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICAgIHBhZGRpbmc6IDAgMCAwIDEwcHg7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmxlZ2VuZC1yb3cgewogICAgICAgIG1hcmdpbjogNXB4IDAgNXB4IDA7CiAgICAgICAgd2lkdGg6IDEwMCU7CiAgICAgIH0KICAgICAgLmNvbG9yLWJveCB7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDFweDsKICAgICAgICB3aWR0aDogMTBweDsKICAgICAgICBoZWlnaHQ6IDEwcHg7CiAgICAgIH0KICAgICAgLnN0ZXAtbGFiZWwtdGV4dCB7CiAgICAgICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICAgIH0KICAgICAgLndhbGwtdGltZS1sYWJlbC10ZXh0IHsKICAgICAgICBjb2xvcjogIzg4ODsKICAgICAgICBmb250LXNpemU6IDAuOGVtOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgInJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgInRhZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAidGFnTWV0YWRhdGEiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgInJ1blRvU3RlcENhcCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJyZXF1ZXN0TWFuYWdlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJhY3RpdmUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICByZWZsZWN0VG9BdHRyaWJ1dGU6IHRydWUsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJfZXhwYW5kZWQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgIl9ydW5Ub1ByQ3VydmVFbnRyeSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3ByZXZpb3VzUnVuVG9QckN1cnZlRW50cnkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgIl9ydW5Ub0RhdGFPdmVyVGltZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJvbkRhdGFDaGFuZ2UiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgIl9jb2xvclNjYWxlRnVuY3Rpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBDYW5jZWxsZXIpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgIl9jYW5jZWxsZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX2F0dGFjaGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJfeENvbXBvbmVudHNDcmVhdGlvbk1ldGhvZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3lWYWx1ZUFjY2Vzc29yIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3Rvb2x0aXBDb2x1bW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3Nlcmllc0RhdGFGaWVsZHMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJfZGVmYXVsdFhSYW5nZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgIl9kZWZhdWx0WVJhbmdlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pCiAgICBdLCBUZlByQ3VydmVDYXJkLnByb3RvdHlwZSwgIl9yZXF1ZXN0RGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJfc21vb3RoaW5nRW5hYmxlZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdydW5zJywgJ3RhZycpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJyZWxvYWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19ydW5Ub1ByQ3VydmVFbnRyeScsICdfcHJldmlvdXNSdW5Ub1ByQ3VydmVFbnRyeScsICdfc2V0T2ZSZWxldmFudFJ1bnMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3NldENoYXJ0RGF0YSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgb2JzZXJ2ZSgnX3J1blRvRGF0YU92ZXJUaW1lJywgJ3J1blRvU3RlcENhcCcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJfdXBkYXRlUnVuVG9QckN1cnZlRW50cnkiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19ydW5Ub0RhdGFPdmVyVGltZScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgRnVuY3Rpb24pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpyZXR1cm50eXBlIiwgdm9pZCAwKQogICAgXSwgVGZQckN1cnZlQ2FyZC5wcm90b3R5cGUsICJfbm90aWZ5RGF0YUNoYW5nZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ3J1bnMnLCAnX3J1blRvUHJDdXJ2ZUVudHJ5JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3J1bnNXaXRoU3RlcEF2YWlsYWJsZSIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ19ydW5zV2l0aFN0ZXBBdmFpbGFibGUnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSkKICAgIF0sIFRmUHJDdXJ2ZUNhcmQucHJvdG90eXBlLCAiX3NldE9mUmVsZXZhbnRSdW5zIiwgbnVsbCk7CiAgICBUZlByQ3VydmVDYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtcHItY3VydmUtY2FyZCcpCiAgICBdLCBUZlByQ3VydmVDYXJkKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZlByQ3VydmVTdGVwc1NlbGVjdG9yID0gCiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLXZhcmlhYmxlCiAgICBjbGFzcyBUZlByQ3VydmVTdGVwc1NlbGVjdG9yIGV4dGVuZHMgUG9seW1lckVsZW1lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLl9ydW5Ub1N0ZXBJbmRleCA9IHt9OwogICAgICAgIH0KICAgICAgICBfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bikgewogICAgICAgICAgICByZXR1cm4gcnVuc0NvbG9yU2NhbGUocnVuKTsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVUaW1lVGV4dEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW5Ub1N0ZXBJbmRleCwgcnVuLCB0aW1lRGlzcGxheVR5cGUpIHsKICAgICAgICAgICAgY29uc3Qgc3RlcEluZGV4ID0gcnVuVG9TdGVwSW5kZXhbcnVuXTsKICAgICAgICAgICAgaWYgKCFsb2Rhc2guaXNOdW1iZXIoc3RlcEluZGV4KSkgewogICAgICAgICAgICAgICAgLy8gVGhlIHN0ZXAgaXMgbm90IGtub3duIHlldC4KICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc1tydW5dOwogICAgICAgICAgICBpZiAoIWVudHJpZXMpIHsKICAgICAgICAgICAgICAgIC8vIE5vIFBSIGN1cnZlIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQgZnJvbSB0aGUgc2VydmVyIHlldC4KICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGVudHJpZXNbc3RlcEluZGV4XVt0aW1lRGlzcGxheVR5cGVdOwogICAgICAgICAgICBpZiAodGltZURpc3BsYXlUeXBlID09PSAnc3RlcCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBgc3RlcCAke3ZhbHVlfWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGltZURpc3BsYXlUeXBlID09PSAncmVsYXRpdmUnKSB7CiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHRpbWUgdXNpbmcgdGhlIHVuaXRzIHRoYXQgYXJlIG1vc3QgYXB0LgogICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBgJHsodmFsdWUgKiAxMDAwKS50b0ZpeGVkKDIpfSBtc2A7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gYCR7dmFsdWUudG9GaXhlZCgyKX0gc2A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGltZURpc3BsYXlUeXBlID09PSAnd2FsbF90aW1lJykgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKHZhbHVlICogMTAwMCkudG9TdHJpbmcoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBkaXNwbGF5IHR5cGUgb2YgJHt0aW1lRGlzcGxheVR5cGV9IGlzIG5vdCByZWNvZ25pemVkLmApOwogICAgICAgIH0KICAgICAgICBfc2xpZGVyVmFsdWVDaGFuZ2VkKGV2ZW50KSB7CiAgICAgICAgICAgIGNvbnN0IHJ1biA9IGV2ZW50LnRhcmdldC5kYXRhc2V0LnJ1bjsKICAgICAgICAgICAgY29uc3QgdmFsID0gZXZlbnQudGFyZ2V0LmltbWVkaWF0ZVZhbHVlOwogICAgICAgICAgICBjb25zdCBuZXdSdW5Ub1N0ZXBJbmRleCA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3J1blRvU3RlcEluZGV4KTsKICAgICAgICAgICAgLy8gU2xpZGVyIGVtaXRzIGEgY2hhbmdlZCBldmVudCBiZWZvcmUgaXQgZ29lcyBhd2F5IHdpdGggYW4KICAgICAgICAgICAgLy8gaW1tZWRpYXRlVmFsdWUgb2YgTmFOLgogICAgICAgICAgICBpZiAoaXNOYU4odmFsKSkgewogICAgICAgICAgICAgICAgZGVsZXRlIG5ld1J1blRvU3RlcEluZGV4W3J1bl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXdSdW5Ub1N0ZXBJbmRleFtydW5dID0gZXZlbnQudGFyZ2V0LmltbWVkaWF0ZVZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3J1blRvU3RlcEluZGV4ID0gbmV3UnVuVG9TdGVwSW5kZXg7CiAgICAgICAgfQogICAgICAgIF9jb21wdXRlTWF4U3RlcEluZGV4Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIHJ1bikgewogICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc1tydW5dOwogICAgICAgICAgICByZXR1cm4gZW50cmllcyAmJiBlbnRyaWVzLmxlbmd0aCA/IGVudHJpZXMubGVuZ3RoIC0gMSA6IDA7CiAgICAgICAgfQogICAgICAgIF91cGRhdGVTdGVwc0Zvck5ld1J1bnMoKSB7CiAgICAgICAgICAgIHZhciBydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzID0gdGhpcy5ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzOwogICAgICAgICAgICAvLyBUaGUgbWFwcGluZyBmcm9tIHJ1biB0byBhdmFpbGFibGUgdGltZSBlbnRyaWVzIGp1c3QgY2hhbmdlZC4KICAgICAgICAgICAgY29uc3QgbmV3UnVuVG9TdGVwSW5kZXggPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLl9ydW5Ub1N0ZXBJbmRleCk7CiAgICAgICAgICAgIGxvZGFzaC5mb3JPd24ocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgKGVudHJpZXMsIHJ1bikgPT4gewogICAgICAgICAgICAgICAgaWYgKCFsb2Rhc2guaXNOdW1iZXIobmV3UnVuVG9TdGVwSW5kZXhbcnVuXSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIHJ1biBoYWQgcHJldmlvdXNseSBsYWNrZWQgYSBzbGlkZXIuIEluaXRpYWxseSBzZXQgdGhlIHNsaWRlcgogICAgICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgcnVuIHRvIHBvaW50IHRvIHRoZSBsYXN0IHN0ZXAuCiAgICAgICAgICAgICAgICAgICAgbmV3UnVuVG9TdGVwSW5kZXhbcnVuXSA9IGVudHJpZXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX3J1blRvU3RlcEluZGV4ID0gbmV3UnVuVG9TdGVwSW5kZXg7CiAgICAgICAgfQogICAgICAgIF9nZXRTdGVwKHJ1blRvU3RlcEluZGV4LCBydW4pIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9ydW5Ub1N0ZXBJbmRleCkKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcnVuVG9TdGVwSW5kZXhbcnVuXTsKICAgICAgICB9CiAgICAgICAgX2NvbXB1dGVSdW5Ub1N0ZXAocnVuVG9BdmFpbGFibGVUaW1lRW50cmllcywgcnVuVG9TdGVwSW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgcnVuVG9TdGVwID0ge307CiAgICAgICAgICAgIGxvZGFzaC5mb3JPd24ocnVuVG9TdGVwSW5kZXgsIChpbmRleCwgcnVuKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBlbnRyaWVzID0gcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc1tydW5dOwogICAgICAgICAgICAgICAgaWYgKCFlbnRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcnVuVG9TdGVwW3J1bl0gPSBlbnRyaWVzW2luZGV4XS5zdGVwOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgcmV0dXJuIHJ1blRvU3RlcDsKICAgICAgICB9CiAgICAgICAgZ2V0IF9ydW5zV2l0aFNsaWRlcnMoKSB7CiAgICAgICAgICAgIHZhciBydW5zID0gdGhpcy5ydW5zOwogICAgICAgICAgICB2YXIgcnVuVG9BdmFpbGFibGVUaW1lRW50cmllcyA9IHRoaXMucnVuVG9BdmFpbGFibGVUaW1lRW50cmllczsKICAgICAgICAgICAgLy8gT25seSBjcmVhdGUgc2xpZGVycyBmb3Igc2VsZWN0ZWQgcnVucyB3aXRoIHN0ZXBzIGF2YWlsYWJsZS4KICAgICAgICAgICAgcmV0dXJuIHJ1bnMuZmlsdGVyKChyKSA9PiBydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzW3JdKTsKICAgICAgICB9CiAgICB9OwogICAgVGZQckN1cnZlU3RlcHNTZWxlY3Rvci50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfcnVuc1dpdGhTbGlkZXJzXV0iIGFzPSJydW4iPgogICAgICA8ZGl2IGNsYXNzPSJydW4td2lkZ2V0Ij4KICAgICAgICA8ZGl2IGNsYXNzPSJydW4tZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgPGRpdgogICAgICAgICAgICBjbGFzcz0icnVuLWNvbG9yLWJveCIKICAgICAgICAgICAgc3R5bGU9ImJhY2tncm91bmQ6W1tfY29tcHV0ZUNvbG9yRm9yUnVuKHJ1bildXTsiCiAgICAgICAgICA+PC9kaXY+CiAgICAgICAgICA8ZGl2IGNsYXNzPSJydW4tdGV4dCI+W1tydW5dXTwvZGl2PgogICAgICAgIDwvZGl2PgogICAgICAgIDxkaXYgY2xhc3M9InN0ZXAtZGlzcGxheS1jb250YWluZXIiPgogICAgICAgICAgW1tfY29tcHV0ZVRpbWVUZXh0Rm9yUnVuKHJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMsIF9ydW5Ub1N0ZXBJbmRleCwKICAgICAgICAgIHJ1biwgdGltZURpc3BsYXlUeXBlKV1dCiAgICAgICAgPC9kaXY+CiAgICAgICAgPHBhcGVyLXNsaWRlcgogICAgICAgICAgZGF0YS1ydW4kPSJbW3J1bl1dIgogICAgICAgICAgc3RlcD0iMSIKICAgICAgICAgIHR5cGU9Im51bWJlciIKICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgIG1heD0iW1tfY29tcHV0ZU1heFN0ZXBJbmRleEZvclJ1bihydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBydW4pXV0iCiAgICAgICAgICB2YWx1ZT0iW1tfZ2V0U3RlcChfcnVuVG9TdGVwSW5kZXgsIHJ1bildXSIKICAgICAgICAgIG9uLWltbWVkaWF0ZS12YWx1ZS1jaGFuZ2VkPSJfc2xpZGVyVmFsdWVDaGFuZ2VkIgogICAgICAgID48L3BhcGVyLXNsaWRlcj4KICAgICAgPC9kaXY+CiAgICA8L3RlbXBsYXRlPgogICAgPHN0eWxlPgogICAgICAucnVuLXdpZGdldCB7CiAgICAgICAgbWFyZ2luOiAxMHB4IDAgMCAwOwogICAgICB9CiAgICAgIHBhcGVyLXNsaWRlciB7CiAgICAgICAgbWFyZ2luOiAtOHB4IDAgMCAtMTVweDsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQogICAgICAuc3RlcC1kaXNwbGF5LWNvbnRhaW5lciB7CiAgICAgICAgZm9udC1zaXplOiAwLjllbTsKICAgICAgICBtYXJnaW46IDAgMTVweCAwIDA7CiAgICAgIH0KICAgICAgLnJ1bi10ZXh0IHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgICAgLnJ1bi1jb2xvci1ib3ggewogICAgICAgIHdpZHRoOiAxMnB4OwogICAgICAgIGhlaWdodDogMTJweDsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZlByQ3VydmVTdGVwc1NlbGVjdG9yLnByb3RvdHlwZSwgInJ1bnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlByQ3VydmVTdGVwc1NlbGVjdG9yLnByb3RvdHlwZSwgInJ1blRvQXZhaWxhYmxlVGltZUVudHJpZXMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBPYmplY3QsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICAgICAgY29tcHV0ZWQ6ICdfY29tcHV0ZVJ1blRvU3RlcChydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzLCBfcnVuVG9TdGVwSW5kZXgpJywKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmUHJDdXJ2ZVN0ZXBzU2VsZWN0b3IucHJvdG90eXBlLCAicnVuVG9TdGVwIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZQckN1cnZlU3RlcHNTZWxlY3Rvci5wcm90b3R5cGUsICJ0aW1lRGlzcGxheVR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlByQ3VydmVTdGVwc1NlbGVjdG9yLnByb3RvdHlwZSwgIl9ydW5Ub1N0ZXBJbmRleCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBGdW5jdGlvbiksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnBhcmFtdHlwZXMiLCBbXSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnJldHVybnR5cGUiLCB2b2lkIDApCiAgICBdLCBUZlByQ3VydmVTdGVwc1NlbGVjdG9yLnByb3RvdHlwZSwgIl91cGRhdGVTdGVwc0Zvck5ld1J1bnMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdydW5zJywgJ3J1blRvQXZhaWxhYmxlVGltZUVudHJpZXMnKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZQckN1cnZlU3RlcHNTZWxlY3Rvci5wcm90b3R5cGUsICJfcnVuc1dpdGhTbGlkZXJzIiwgbnVsbCk7CiAgICBUZlByQ3VydmVTdGVwc1NlbGVjdG9yID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3InKQogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtdmFyaWFibGUKICAgIF0sIFRmUHJDdXJ2ZVN0ZXBzU2VsZWN0b3IpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGV0IFRmUHJDdXJ2ZURhc2hib2FyZCA9IAogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXVudXNlZC12YXJpYWJsZQogICAgY2xhc3MgVGZQckN1cnZlRGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkT25SZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3RpbWVEaXNwbGF5VHlwZSA9ICdzdGVwJzsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRSdW5zID0gW107CiAgICAgICAgICAgIHRoaXMuX3J1blRvVGFnSW5mbyA9IHt9OwogICAgICAgICAgICB0aGlzLl90YWdUb1J1blRvRGF0YSA9IHt9OwogICAgICAgICAgICB0aGlzLl9nZXRDYXRlZ29yeUl0ZW1LZXkgPSAoaXRlbSkgPT4gaXRlbS50YWc7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKCk7CiAgICAgICAgICAgIHRoaXMuX3N0ZXAgPSAwOwogICAgICAgIH0KICAgICAgICByZWFkeSgpIHsKICAgICAgICAgICAgc3VwZXIucmVhZHkoKTsKICAgICAgICAgICAgaWYgKHRoaXMucmVsb2FkT25SZWFkeSkKICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgUHJvbWlzZS5hbGwoW3RoaXMuX2ZldGNoVGFncygpXSkudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWxvYWRDYXJkcygpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3Nob3VsZE9wZW4oaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4IDw9IDI7CiAgICAgICAgfQogICAgICAgIF9mZXRjaFRhZ3MoKSB7CiAgICAgICAgICAgIGNvbnN0IHVybCA9IGdldFJvdXRlcigpLnBsdWdpblJvdXRlKCdwcl9jdXJ2ZXMnLCAnL3RhZ3MnKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKChydW5Ub1RhZ0luZm8pID0+IHsKICAgICAgICAgICAgICAgIGlmIChsb2Rhc2guaXNFcXVhbChydW5Ub1RhZ0luZm8sIHRoaXMuX3J1blRvVGFnSW5mbykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHVwZGF0ZSBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcy4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBydW5Ub1RhZyA9IGxvZGFzaC5tYXBWYWx1ZXMocnVuVG9UYWdJbmZvLCAobykgPT4gbG9kYXNoLmtleXMobykpOwogICAgICAgICAgICAgICAgY29uc3QgdGFncyA9IGdldFRhZ3MocnVuVG9UYWcpOwogICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19kYXRhTm90Rm91bmQnLCB0YWdzLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3J1blRvVGFnSW5mbycsIHJ1blRvVGFnSW5mbyk7CiAgICAgICAgICAgICAgICB0aGlzLmFzeW5jKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYF9jYXRlZ29yaWVzRG9tUmVhZHlgLgogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfY2F0ZWdvcmllc0RvbVJlYWR5JywgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9yZWxvYWRDYXJkcygpIHsKICAgICAgICAgICAgbG9kYXNoLmZvckVhY2godGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RmLXByLWN1cnZlLWNhcmQnKSwgKGNhcmQpID0+IHsKICAgICAgICAgICAgICAgIGNhcmQucmVsb2FkKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBnZXQgX2NhdGVnb3JpZXMoKSB7CiAgICAgICAgICAgIHZhciBydW5Ub1RhZ0luZm8gPSB0aGlzLl9ydW5Ub1RhZ0luZm87CiAgICAgICAgICAgIHZhciBzZWxlY3RlZFJ1bnMgPSB0aGlzLl9zZWxlY3RlZFJ1bnM7CiAgICAgICAgICAgIHZhciB0YWdGaWx0ZXIgPSB0aGlzLl90YWdGaWx0ZXI7CiAgICAgICAgICAgIGNvbnN0IHJ1blRvVGFnID0gbG9kYXNoLm1hcFZhbHVlcyhydW5Ub1RhZ0luZm8sICh4KSA9PiBPYmplY3Qua2V5cyh4KSk7CiAgICAgICAgICAgIHJldHVybiBjYXRlZ29yaXplVGFncyhydW5Ub1RhZywgc2VsZWN0ZWRSdW5zLCB0YWdGaWx0ZXIpOwogICAgICAgIH0KICAgICAgICBnZXQgX3JlbGV2YW50U2VsZWN0ZWRSdW5zKCkgewogICAgICAgICAgICB2YXIgc2VsZWN0ZWRSdW5zID0gdGhpcy5fc2VsZWN0ZWRSdW5zOwogICAgICAgICAgICB2YXIgcnVuVG9UYWdJbmZvID0gdGhpcy5fcnVuVG9UYWdJbmZvOwogICAgICAgICAgICByZXR1cm4gc2VsZWN0ZWRSdW5zLmZpbHRlcigocnVuKSA9PiBydW5Ub1RhZ0luZm9bcnVuXSk7CiAgICAgICAgfQogICAgICAgIF90YWdNZXRhZGF0YShydW5Ub1RhZ3NJbmZvLCBydW5zLCB0YWcpIHsKICAgICAgICAgICAgY29uc3QgcnVuVG9UYWdJbmZvID0ge307CiAgICAgICAgICAgIHJ1bnMuZm9yRWFjaCgocnVuKSA9PiB7CiAgICAgICAgICAgICAgICBydW5Ub1RhZ0luZm9bcnVuXSA9IHJ1blRvVGFnc0luZm9bcnVuXVt0YWddOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gQWxsIFBSIGN1cnZlIHRhZ3MgaW5jbHVkZSB0aGUgYC9wcl9jdXJ2ZXNgIHN1ZmZpeC4gV2UgY2FuIHRyaW0KICAgICAgICAgICAgLy8gdGhhdCBmcm9tIHRoZSBkaXNwbGF5IG5hbWUuCiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHREaXNwbGF5TmFtZSA9IHRhZy5yZXBsYWNlKC9cL3ByX2N1cnZlcyQvLCAnJyk7CiAgICAgICAgICAgIHJldHVybiBhZ2dyZWdhdGVUYWdJbmZvKHJ1blRvVGFnSW5mbywgZGVmYXVsdERpc3BsYXlOYW1lKTsKICAgICAgICB9CiAgICAgICAgX2NyZWF0ZURhdGFDaGFuZ2VDYWxsYmFjayh0YWcpIHsKICAgICAgICAgICAgcmV0dXJuIChydW5Ub0RhdGEpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfdGFnVG9SdW5Ub0RhdGEnLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX3RhZ1RvUnVuVG9EYXRhKSwgeyBbdGFnXTogcnVuVG9EYXRhIH0pKTsKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzKCkgewogICAgICAgICAgICB2YXIgdGFnVG9SdW5Ub0RhdGEgPSB0aGlzLl90YWdUb1J1blRvRGF0YTsKICAgICAgICAgICAgY29uc3QgY2Fub25pY2FsVGFnID0ge307IC8vIG1hcCBmcm9tIHJ1biB0byBjYW5vbmljYWwgdGFnIG5hbWUKICAgICAgICAgICAgZm9yIChjb25zdCBbdGFnLCBydW5Ub0RhdGFdIG9mIE9iamVjdC5lbnRyaWVzKHRhZ1RvUnVuVG9EYXRhKSkgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCBbcnVuXSBvZiBPYmplY3QuZW50cmllcyhydW5Ub0RhdGEpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gYXJiaXRyYXJ5IHN0YWJsZSBvcmRlcmluZzogc21hbGxlc3QgdGFnIG5hbWUgaXMgY2Fub25pY2FsCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbm9uaWNhbFRhZ1tydW5dID09IG51bGwgfHwgdGFnIDwgY2Fub25pY2FsVGFnW3J1bl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2Fub25pY2FsVGFnW3J1bl0gPSB0YWc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgICAgICAgICBmb3IgKGNvbnN0IFtydW4sIHRhZ10gb2YgT2JqZWN0LmVudHJpZXMoY2Fub25pY2FsVGFnKSkgewogICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRhZ1RvUnVuVG9EYXRhW3RhZ11bcnVuXTsKICAgICAgICAgICAgICAgIHJlc3VsdFtydW5dID0gZGF0YS5tYXAoKGQpID0+ICh7CiAgICAgICAgICAgICAgICAgICAgc3RlcDogZC5zdGVwLAogICAgICAgICAgICAgICAgICAgIHdhbGxfdGltZTogZC53YWxsX3RpbWUsCiAgICAgICAgICAgICAgICAgICAgcmVsYXRpdmU6IGQud2FsbF90aW1lIC0gZGF0YVswXS53YWxsX3RpbWUsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICB9OwogICAgVGZQckN1cnZlRGFzaGJvYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPHRmLW9wdGlvbi1zZWxlY3RvcgogICAgICAgICAgICAgIGlkPSJ0aW1lLXR5cGUtc2VsZWN0b3IiCiAgICAgICAgICAgICAgbmFtZT0iVGltZSBEaXNwbGF5IFR5cGUiCiAgICAgICAgICAgICAgc2VsZWN0ZWQtaWQ9Int7X3RpbWVEaXNwbGF5VHlwZX19IgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0ic3RlcCI+c3RlcDwvcGFwZXItYnV0dG9uPgogICAgICAgICAgICAgIDwhLS0KICAgICAgICAgICAgLS0+CiAgICAgICAgICAgICAgPHBhcGVyLWJ1dHRvbiBpZD0icmVsYXRpdmUiPnJlbGF0aXZlPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgICAgPCEtLQogICAgICAgICAgICAtLT4KICAgICAgICAgICAgICA8cGFwZXItYnV0dG9uIGlkPSJ3YWxsX3RpbWUiPndhbGw8L3BhcGVyLWJ1dHRvbj4KICAgICAgICAgICAgPC90Zi1vcHRpb24tc2VsZWN0b3I+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIiBpZD0ic3RlcHMtc2VsZWN0b3ItY29udGFpbmVyIj4KICAgICAgICAgICAgICA8dGYtcHItY3VydmUtc3RlcHMtc2VsZWN0b3IKICAgICAgICAgICAgICAgIHJ1bnM9IltbX3JlbGV2YW50U2VsZWN0ZWRSdW5zXV0iCiAgICAgICAgICAgICAgICBydW4tdG8tc3RlcD0ie3tfcnVuVG9TdGVwfX0iCiAgICAgICAgICAgICAgICBydW4tdG8tYXZhaWxhYmxlLXRpbWUtZW50cmllcz0iW1tfcnVuVG9BdmFpbGFibGVUaW1lRW50cmllc11dIgogICAgICAgICAgICAgICAgdGltZS1kaXNwbGF5LXR5cGU9IltbX3RpbWVEaXNwbGF5VHlwZV1dIgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICA8L3RmLXByLWN1cnZlLXN0ZXBzLXNlbGVjdG9yPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHByZWNpc2lvbuKAk3JlY2FsbCBjdXJ2ZSBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPgogICAgICAgICAgICAgICAgWW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSBwcmVjaXNpb27igJNyZWNhbGwgZGF0YSB0byB5b3VyIGV2ZW50CiAgICAgICAgICAgICAgICBmaWxlcy4KICAgICAgICAgICAgICA8L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgogICAgICAgICAgICA8cD4KICAgICAgICAgICAgICBJZiB5b3XigJlyZSBuZXcgdG8gdXNpbmcgVGVuc29yQm9hcmQsIGFuZCB3YW50IHRvIGZpbmQgb3V0IGhvdyB0bwogICAgICAgICAgICAgIGFkZCBkYXRhIGFuZCBzZXQgdXAgeW91ciBldmVudCBmaWxlcywgY2hlY2sgb3V0IHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVuc29yZmxvdy90ZW5zb3Jib2FyZC9ibG9iL21hc3Rlci9SRUFETUUubWQiCiAgICAgICAgICAgICAgICA+UkVBRE1FPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBwZXJoYXBzIHRoZQogICAgICAgICAgICAgIDxhCiAgICAgICAgICAgICAgICBocmVmPSJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9nZXRfc3RhcnRlZC9zdW1tYXJpZXNfYW5kX3RlbnNvcmJvYXJkIgogICAgICAgICAgICAgICAgPlRlbnNvckJvYXJkIHR1dG9yaWFsPC9hCiAgICAgICAgICAgICAgPi4KICAgICAgICAgICAgPC9wPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyIKICAgICAgICAgICAgICAgID50aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zPC9hCiAgICAgICAgICAgICAgPgogICAgICAgICAgICAgIGFuZCBjb25zaWRlciBmaWxpbmcgYW4gaXNzdWUgb24gR2l0SHViLgogICAgICAgICAgICA8L3A+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1shX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDx0Zi10YWctZmlsdGVyZXIgdGFnLWZpbHRlcj0ie3tfdGFnRmlsdGVyfX0iPjwvdGYtdGFnLWZpbHRlcmVyPgogICAgICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfY2F0ZWdvcmllc11dIiBhcz0iY2F0ZWdvcnkiPgogICAgICAgICAgICA8dGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXcKICAgICAgICAgICAgICBjYXRlZ29yeT0iW1tjYXRlZ29yeV1dIgogICAgICAgICAgICAgIGluaXRpYWwtb3BlbmVkPSJbW19zaG91bGRPcGVuKGluZGV4KV1dIgogICAgICAgICAgICAgIGdldC1jYXRlZ29yeS1pdGVtLWtleT0iW1tfZ2V0Q2F0ZWdvcnlJdGVtS2V5XV0iCiAgICAgICAgICAgID4KICAgICAgICAgICAgICA8dGVtcGxhdGU+CiAgICAgICAgICAgICAgICA8dGYtcHItY3VydmUtY2FyZAogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHJ1bnM9IltbaXRlbS5ydW5zXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICB0YWctbWV0YWRhdGE9IltbX3RhZ01ldGFkYXRhKF9ydW5Ub1RhZ0luZm8sIGl0ZW0ucnVucywgaXRlbS50YWcpXV0iCiAgICAgICAgICAgICAgICAgIHJlcXVlc3QtbWFuYWdlcj0iW1tfcmVxdWVzdE1hbmFnZXJdXSIKICAgICAgICAgICAgICAgICAgcnVuLXRvLXN0ZXAtY2FwPSJbW19ydW5Ub1N0ZXBdXSIKICAgICAgICAgICAgICAgICAgb24tZGF0YS1jaGFuZ2U9IltbX2NyZWF0ZURhdGFDaGFuZ2VDYWxsYmFjayhpdGVtLnRhZyldXSIKICAgICAgICAgICAgICAgID48L3RmLXByLWN1cnZlLWNhcmQ+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CgogICAgPHN0eWxlIGluY2x1ZGU9ImRhc2hib2FyZC1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgLm5vLWRhdGEtd2FybmluZyB7CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgIH0KCiAgICAgIC8qKiBEbyBub3QgbGV0IHRoZSBzdGVwcyBzZWxlY3RvciBvY2NsdWRlIHRoZSBydW4gc2VsZWN0b3IuICovCiAgICAgICNzdGVwcy1zZWxlY3Rvci1jb250YWluZXIgewogICAgICAgIG1heC1oZWlnaHQ6IDYwJTsKICAgICAgICBvdmVyZmxvdy15OiBhdXRvOwogICAgICB9CiAgICA8L3N0eWxlPgogIGA7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgInJlbG9hZE9uUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlByQ3VydmVEYXNoYm9hcmQucHJvdG90eXBlLCAiX3RpbWVEaXNwbGF5VHlwZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZlByQ3VydmVEYXNoYm9hcmQucHJvdG90eXBlLCAiX3NlbGVjdGVkUnVucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmUHJDdXJ2ZURhc2hib2FyZC5wcm90b3R5cGUsICJfcnVuVG9UYWdJbmZvIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl90YWdUb1J1blRvRGF0YSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE9iamVjdCwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9ydW5Ub1N0ZXAiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmUHJDdXJ2ZURhc2hib2FyZC5wcm90b3R5cGUsICJfZGF0YU5vdEZvdW5kIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl90YWdGaWx0ZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmUHJDdXJ2ZURhc2hib2FyZC5wcm90b3R5cGUsICJfY2F0ZWdvcmllc0RvbVJlYWR5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9nZXRDYXRlZ29yeUl0ZW1LZXkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBSZXF1ZXN0TWFuYWdlcikKICAgIF0sIFRmUHJDdXJ2ZURhc2hib2FyZC5wcm90b3R5cGUsICJfcmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBOdW1iZXIsCiAgICAgICAgICAgIG5vdGlmeTogdHJ1ZSwKICAgICAgICB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE51bWJlcikKICAgIF0sIFRmUHJDdXJ2ZURhc2hib2FyZC5wcm90b3R5cGUsICJfc3RlcCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgnX3J1blRvVGFnSW5mbycsICdfc2VsZWN0ZWRSdW5zJywgJ190YWdGaWx0ZXInLCAnX2NhdGVnb3JpZXNEb21SZWFkeScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZlByQ3VydmVEYXNoYm9hcmQucHJvdG90eXBlLCAiX2NhdGVnb3JpZXMiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfc2VsZWN0ZWRSdW5zJywgJ19ydW5Ub1RhZ0luZm8nKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9yZWxldmFudFNlbGVjdGVkUnVucyIsIG51bGwpOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgY29tcHV0ZWQoJ190YWdUb1J1blRvRGF0YScpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZQckN1cnZlRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9ydW5Ub0F2YWlsYWJsZVRpbWVFbnRyaWVzIiwgbnVsbCk7CiAgICBUZlByQ3VydmVEYXNoYm9hcmQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1wci1jdXJ2ZS1kYXNoYm9hcmQnKQogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtdmFyaWFibGUKICAgIF0sIFRmUHJDdXJ2ZURhc2hib2FyZCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEEgZnJvbnRlbmQgdGhhdCBkaXJlY3RzIHVzZXJzIHRvIHVwZ3JhZGUgdG8gdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZSBwcm9maWxlCiAgICAgKiBwbHVnaW4sIG5vdyBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGZyb20gVGVuc29yQm9hcmQuCiAgICAgKi8KICAgIGxldCBUZlByb2ZpbGVSZWRpcmVjdERhc2hib2FyZCA9IGNsYXNzIFRmUHJvZmlsZVJlZGlyZWN0RGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX2luc3RhbGxDb21tYW5kID0gJ3BpcCBpbnN0YWxsIC1VIHRlbnNvcmJvYXJkLXBsdWdpbi1wcm9maWxlJzsKICAgICAgICB9CiAgICAgICAgX2NvcHlJbnN0YWxsQ29tbWFuZCgpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGRvQ29weSA9ICgpID0+IF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0YXJlYSA9IHRoaXMuJC5jb21tYW5kVGV4dGFyZWE7CiAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuc2VsZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgeWllbGQgbmF2aWdhdG9yLmNsaXBib2FyZC53cml0ZVRleHQodGhpcy5faW5zdGFsbENvbW1hbmQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2sgYXBwcm9hY2guCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIGNvbnN0IGNvcGllZE1lc3NhZ2VFbGVtZW50ID0gdGhpcy4kLmNvcGllZE1lc3NhZ2U7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHlpZWxkIGRvQ29weSgpOwogICAgICAgICAgICAgICAgICAgIGNvcGllZE1lc3NhZ2VFbGVtZW50LmlubmVyVGV4dCA9ICdDb3BpZWQuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgY29waWVkTWVzc2FnZUVsZW1lbnQuaW5uZXJUZXh0ID0gJ0ZhaWxlZCB0byBjb3B5IHRvIGNsaXBib2FyZC4nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3JlbW92ZUNvcGllZE1lc3NhZ2UoKSB7CiAgICAgICAgICAgIGNvbnN0IGNvcGllZE1lc3NhZ2VFbGVtZW50ID0gdGhpcy4kLmNvcGllZE1lc3NhZ2U7CiAgICAgICAgICAgIGNvcGllZE1lc3NhZ2VFbGVtZW50LmlubmVyVGV4dCA9ICcnOwogICAgICAgIH0KICAgIH07CiAgICBUZlByb2ZpbGVSZWRpcmVjdERhc2hib2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPGRpdiBjbGFzcz0ibWVzc2FnZSI+CiAgICAgIDxoMz5UaGUgcHJvZmlsZSBwbHVnaW4gaGFzIG1vdmVkLjwvaDM+CiAgICAgIDxwPgogICAgICAgIFBsZWFzZSBpbnN0YWxsIHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcHJvZmlsZSBwbHVnaW4gZnJvbSBQeVBJIGJ5CiAgICAgICAgcnVubmluZyB0aGUgZm9sbG93aW5nIGNvbW1hbmQgZnJvbSB0aGUgbWFjaGluZSBydW5uaW5nIFRlbnNvckJvYXJkOgogICAgICA8L3A+CiAgICAgIDx0ZXh0YXJlYQogICAgICAgIGlkPSJjb21tYW5kVGV4dGFyZWEiCiAgICAgICAgcmVhZG9ubHk9IiIKICAgICAgICByb3dzPSIxIgogICAgICAgIG9uLWJsdXI9Il9yZW1vdmVDb3BpZWRNZXNzYWdlIgogICAgICA+CltbX2luc3RhbGxDb21tYW5kXV08L3RleHRhcmVhCiAgICAgID4KICAgICAgPGRpdiBpZD0iY29weUNvbnRhaW5lciI+CiAgICAgICAgPHNwYW4gaWQ9ImNvcGllZE1lc3NhZ2UiPjwvc3Bhbj4KICAgICAgICA8cGFwZXItYnV0dG9uIHJhaXNlZD0iIiBvbi10YXA9Il9jb3B5SW5zdGFsbENvbW1hbmQiCiAgICAgICAgICA+Q29weSB0byBjbGlwYm9hcmQ8L3BhcGVyLWJ1dHRvbgogICAgICAgID4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KCiAgICA8c3R5bGU+CiAgICAgIC5tZXNzYWdlIHsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwIGF1dG87CiAgICAgICAgbWF4LXdpZHRoOiA1NDBweDsKICAgICAgfQogICAgICAjY29tbWFuZFRleHRhcmVhIHsKICAgICAgICBtYXJnaW4tdG9wOiAxZXg7CiAgICAgICAgcGFkZGluZzogMWV4IDFlbTsKICAgICAgICByZXNpemU6IHZlcnRpY2FsOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICAgICNjb3B5Q29udGFpbmVyIHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICAgICNjb3BpZWRNZXNzYWdlIHsKICAgICAgICBhbGlnbi1zZWxmOiBjZW50ZXI7CiAgICAgICAgZmxleC1ncm93OiAxOwogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgICBwYWRkaW5nLXJpZ2h0OiAxZW07CiAgICAgICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICAgIH0KICAgIDwvc3R5bGU+CiAgYDsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZQcm9maWxlUmVkaXJlY3REYXNoYm9hcmQucHJvdG90eXBlLCAiX2luc3RhbGxDb21tYW5kIiwgdm9pZCAwKTsKICAgIFRmUHJvZmlsZVJlZGlyZWN0RGFzaGJvYXJkID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtcHJvZmlsZS1yZWRpcmVjdC1kYXNoYm9hcmQnKQogICAgXSwgVGZQcm9maWxlUmVkaXJlY3REYXNoYm9hcmQpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBBIGZyb250ZW5kIHRoYXQgZGlzcGxheXMgYSBzZXQgb2YgdGYtc2NhbGFyLWNoYXJ0cywgZWFjaCBvZiB3aGljaAogICAgICogcmVwcmVzZW50cyB0aGUgdGltZSBzZXJpZXMgZm9yIGEgcGFydGljdWxhciB0YWcuIFRoaXMgZGFzaGJvYXJkCiAgICAgKiBwcm92aWRlcyBhIGNhdGVnb3JpemVyLCBydW4gc2VsZWN0b3IsIGFuZCBhYmNpc3NhIHNlbGVjdG9yLCBieSB3aGljaAogICAgICogdGhlIHVzZXIgY2FuIGN1c3RvbWl6ZSBob3cgZGF0YSBpcyBvcmdhbml6ZWQgYW5kIGRpc3BsYXllZC4KICAgICAqLwogICAgbGV0IFRmU2NhbGFyRGFzaGJvYXJkID0gCiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLXZhcmlhYmxlCiAgICBjbGFzcyBUZlNjYWxhckRhc2hib2FyZCBleHRlbmRzIExlZ2FjeUVsZW1lbnRNaXhpbihBcnJheVVwZGF0ZUhlbHBlcikgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLnJlbG9hZE9uUmVhZHkgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9zaG93RG93bmxvYWRMaW5rcyA9IGdldEJvb2xlYW5Jbml0aWFsaXplcignX3Nob3dEb3dubG9hZExpbmtzJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiBmYWxzZSwKICAgICAgICAgICAgICAgIHVzZUxvY2FsU3RvcmFnZTogdHJ1ZSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl9zbW9vdGhpbmdXZWlnaHQgPSBnZXROdW1iZXJJbml0aWFsaXplcignX3Ntb290aGluZ1dlaWdodCcsIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogMC42LAogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2lnbm9yZVlPdXRsaWVycyA9IGdldEJvb2xlYW5Jbml0aWFsaXplcignX2lnbm9yZVlPdXRsaWVycycsIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZTogdHJ1ZSwKICAgICAgICAgICAgICAgIHVzZUxvY2FsU3RvcmFnZTogdHJ1ZSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIC5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLl94VHlwZSA9IFhUeXBlLlNURVA7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkUnVucyA9IFtdOwogICAgICAgICAgICB0aGlzLl90YWdGaWx0ZXIgPSAnJzsKICAgICAgICAgICAgdGhpcy5fY2F0ZWdvcmllcyA9IFtdOwogICAgICAgICAgICAvLyBJdGVtcyBzaG93IG11bHRpcGxlIHJ1bnMsIHNvIGV4Y2x1ZGUgcnVucyBmcm9tIGNhdGVnb3J5IGl0ZW0ga2V5cyBmb3IKICAgICAgICAgICAgLy8gZWZmaWNpZW50IHRlbXBsYXRlIHJldXNlLgogICAgICAgICAgICB0aGlzLl9nZXRDYXRlZ29yeUl0ZW1LZXkgPSAoaXRlbSkgPT4gaXRlbS50YWc7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKDUwKTsKICAgICAgICAgICAgdGhpcy5fc2hvd0Rvd25sb2FkTGlua3NPYnNlcnZlciA9IGdldEJvb2xlYW5PYnNlcnZlcignX3Nob3dEb3dubG9hZExpbmtzJywgeyBkZWZhdWx0VmFsdWU6IGZhbHNlLCB1c2VMb2NhbFN0b3JhZ2U6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMuX3Ntb290aGluZ1dlaWdodE9ic2VydmVyID0gZ2V0TnVtYmVyT2JzZXJ2ZXIoJ19zbW9vdGhpbmdXZWlnaHQnLCB7CiAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWU6IDAuNiwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX2lnbm9yZVlPdXRsaWVyc09ic2VydmVyID0gZ2V0Qm9vbGVhbk9ic2VydmVyKCdfaWdub3JlWU91dGxpZXJzJywgewogICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiB0cnVlLAogICAgICAgICAgICAgICAgdXNlTG9jYWxTdG9yYWdlOiB0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9zbW9vdGhpbmdFbmFibGVkKCkgewogICAgICAgICAgICB2YXIgX3Ntb290aGluZ1dlaWdodCA9IHRoaXMuX3Ntb290aGluZ1dlaWdodDsKICAgICAgICAgICAgcmV0dXJuIF9zbW9vdGhpbmdXZWlnaHQgPiAwOwogICAgICAgIH0KICAgICAgICBfZ2V0Q2F0ZWdvcnlLZXkoY2F0ZWdvcnkpIHsKICAgICAgICAgICAgcmV0dXJuIGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUgPT0KICAgICAgICAgICAgICAgIENhdGVnb3J5VHlwZS5TRUFSQ0hfUkVTVUxUUwogICAgICAgICAgICAgICAgPyAnJwogICAgICAgICAgICAgICAgOiBjYXRlZ29yeS5uYW1lOwogICAgICAgIH0KICAgICAgICBfc2hvdWxkT3BlbihpbmRleCkgewogICAgICAgICAgICByZXR1cm4gaW5kZXggPD0gMjsKICAgICAgICB9CiAgICAgICAgcmVhZHkoKSB7CiAgICAgICAgICAgIHN1cGVyLnJlYWR5KCk7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbG9hZE9uUmVhZHkpCiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZCgpOwogICAgICAgIH0KICAgICAgICByZWxvYWQoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZldGNoVGFncygpLnRoZW4oKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fcmVsb2FkQ2hhcnRzKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfZmV0Y2hUYWdzKCkgewogICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSb3V0ZXIoKS5wbHVnaW5Sb3V0ZSgnc2NhbGFycycsICcvdGFncycpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVxdWVzdE1hbmFnZXIucmVxdWVzdCh1cmwpLnRoZW4oKHJ1blRvVGFnSW5mbykgPT4gewogICAgICAgICAgICAgICAgaWYgKGxvZGFzaC5pc0VxdWFsKHJ1blRvVGFnSW5mbywgdGhpcy5fcnVuVG9UYWdJbmZvKSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gdXBkYXRlIGFueXRoaW5nIGlmIHRoZXJlIGFyZSBubyBjaGFuZ2VzLgogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHJ1blRvVGFnID0gbG9kYXNoLm1hcFZhbHVlcyhydW5Ub1RhZ0luZm8sICh4KSA9PiBPYmplY3Qua2V5cyh4KSk7CiAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gZ2V0VGFncyhydW5Ub1RhZyk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2RhdGFOb3RGb3VuZCcsIHRhZ3MubGVuZ3RoID09PSAwKTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfcnVuVG9UYWdJbmZvJywgcnVuVG9UYWdJbmZvKTsKICAgICAgICAgICAgICAgIHRoaXMuYXN5bmMoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFNlZSB0aGUgY29tbWVudCBhYm92ZSBgX2NhdGVnb3JpZXNEb21SZWFkeWAuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXQoJ19jYXRlZ29yaWVzRG9tUmVhZHknLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3JlbG9hZENoYXJ0cygpIHsKICAgICAgICAgICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RmLXNjYWxhci1jYXJkJykuZm9yRWFjaCgoY2hhcnQpID0+IHsKICAgICAgICAgICAgICAgIGNoYXJ0LnJlbG9hZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgX3VwZGF0ZUNhdGVnb3JpZXMoKSB7CiAgICAgICAgICAgIHZhciBydW5Ub1RhZ0luZm8gPSB0aGlzLl9ydW5Ub1RhZ0luZm87CiAgICAgICAgICAgIHZhciBzZWxlY3RlZFJ1bnMgPSB0aGlzLl9zZWxlY3RlZFJ1bnM7CiAgICAgICAgICAgIHZhciB0YWdGaWx0ZXIgPSB0aGlzLl90YWdGaWx0ZXI7CiAgICAgICAgICAgIGxldCBjYXRlZ29yaWVzOwogICAgICAgICAgICBsZXQgcXVlcnkgPSB0YWdGaWx0ZXI7CiAgICAgICAgICAgIGNvbnN0IHJ1blRvVGFnID0gbG9kYXNoLm1hcFZhbHVlcyhydW5Ub1RhZ0luZm8sICh4KSA9PiBPYmplY3Qua2V5cyh4KSk7CiAgICAgICAgICAgIGNhdGVnb3JpZXMgPSBjYXRlZ29yaXplVGFncyhydW5Ub1RhZywgc2VsZWN0ZWRSdW5zLCBxdWVyeSk7CiAgICAgICAgICAgIGNhdGVnb3JpZXMuZm9yRWFjaCgoY2F0ZWdvcnkpID0+IHsKICAgICAgICAgICAgICAgIGNhdGVnb3J5Lml0ZW1zID0gY2F0ZWdvcnkuaXRlbXMubWFwKChpdGVtKSA9PiAoewogICAgICAgICAgICAgICAgICAgIHRhZzogaXRlbS50YWcsCiAgICAgICAgICAgICAgICAgICAgc2VyaWVzOiBpdGVtLnJ1bnMubWFwKChydW4pID0+ICh7IHJ1biwgdGFnOiBpdGVtLnRhZyB9KSksCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnVwZGF0ZUFycmF5UHJvcCgnX2NhdGVnb3JpZXMnLCBjYXRlZ29yaWVzLCB0aGlzLl9nZXRDYXRlZ29yeUtleSk7CiAgICAgICAgfQogICAgICAgIF90YWdNZXRhZGF0YShjYXRlZ29yeSwgcnVuVG9UYWdzSW5mbywgaXRlbSkgewogICAgICAgICAgICBjb25zdCBjYXRlZ29yeU5hbWUgPSBjYXRlZ29yeS5uYW1lOwogICAgICAgICAgICBjb25zdCB0YWcgPSBpdGVtLnRhZzsKICAgICAgICAgICAgY29uc3QgcnVuVG9UYWdJbmZvID0ge307CiAgICAgICAgICAgIGl0ZW0uc2VyaWVzLmZvckVhY2goKHsgcnVuIH0pID0+IHsKICAgICAgICAgICAgICAgIHJ1blRvVGFnSW5mb1tydW5dID0gcnVuVG9UYWdzSW5mb1tydW5dW3RhZ107CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvLyBBbGwgbmV3LXN0eWxlIHNjYWxhciB0YWdzIGluY2x1ZGUgdGhlIGAvc2NhbGFyX3N1bW1hcnlgCiAgICAgICAgICAgIC8vIHN1ZmZpeC4gV2UgY2FuIHRyaW0gdGhhdCBmcm9tIHRoZSBkaXNwbGF5IG5hbWUuCiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHREaXNwbGF5TmFtZSA9IHRhZy5yZXBsYWNlKC9cL3NjYWxhcl9zdW1tYXJ5JC8sICcnKTsKICAgICAgICAgICAgbGV0IHsgZGVzY3JpcHRpb24sIGRpc3BsYXlOYW1lIH0gPSBhZ2dyZWdhdGVUYWdJbmZvKHJ1blRvVGFnSW5mbywgZGVmYXVsdERpc3BsYXlOYW1lKTsKICAgICAgICAgICAgLy8gSWYgY2F0ZWdvcnkgbmFtZSBpcyBhIHByZWZpeCBncm91cCwgc3RyaXAgdGhlIHByZWZpeCBmcm9tIHRoZSBuYW1lCiAgICAgICAgICAgIC8vIG9mIHRoZSBzY2FsYXItY2FyZCBpZiBuYW1lICE9IHByZWZpeC4KICAgICAgICAgICAgaWYgKGNhdGVnb3J5Lm1ldGFkYXRhLnR5cGUgPT0KICAgICAgICAgICAgICAgIENhdGVnb3J5VHlwZS5QUkVGSVhfR1JPVVAgJiYKICAgICAgICAgICAgICAgIGRpc3BsYXlOYW1lLnN0YXJ0c1dpdGgoY2F0ZWdvcnlOYW1lICsgJy8nKSkgewogICAgICAgICAgICAgICAgLy8gKyAxIHRvIHN0cmlwIG9mZiB0aGUgc2VwYXJhdG9yLgogICAgICAgICAgICAgICAgZGlzcGxheU5hbWUgPSBkaXNwbGF5TmFtZS5zbGljZShjYXRlZ29yeU5hbWUubGVuZ3RoICsgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsgZGVzY3JpcHRpb24sIGRpc3BsYXlOYW1lIH07CiAgICAgICAgfQogICAgfTsKICAgIFRmU2NhbGFyRGFzaGJvYXJkLnRlbXBsYXRlID0gaHRtbCBgCiAgICA8dGYtZGFzaGJvYXJkLWxheW91dD4KICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhciIgc2xvdD0ic2lkZWJhciI+CiAgICAgICAgPGRpdiBjbGFzcz0ic2V0dGluZ3MiPgogICAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICAgIGlkPSJzaG93LWRvd25sb2FkLWxpbmtzIgogICAgICAgICAgICAgICAgY2hlY2tlZD0ie3tfc2hvd0Rvd25sb2FkTGlua3N9fSIKICAgICAgICAgICAgICAgID5TaG93IGRhdGEgZG93bmxvYWQgbGlua3M8L3BhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBjbGFzcz0ibGluZS1pdGVtIj4KICAgICAgICAgICAgICA8cGFwZXItY2hlY2tib3gKICAgICAgICAgICAgICAgIGlkPSJpZ25vcmUteS1vdXRsaWVyIgogICAgICAgICAgICAgICAgY2hlY2tlZD0ie3tfaWdub3JlWU91dGxpZXJzfX0iCiAgICAgICAgICAgICAgICA+SWdub3JlIG91dGxpZXJzIGluIGNoYXJ0IHNjYWxpbmc8L3BhcGVyLWNoZWNrYm94CiAgICAgICAgICAgICAgPgogICAgICAgICAgICA8L2Rpdj4KICAgICAgICAgICAgPGRpdiBpZD0idG9vbHRpcC1zb3J0aW5nIj4KICAgICAgICAgICAgICA8ZGl2PlRvb2x0aXAgc29ydGluZyBtZXRob2Q6PC9kaXY+CiAgICAgICAgICAgICAgPHBhcGVyLWRyb3Bkb3duLW1lbnUKICAgICAgICAgICAgICAgIG5vLWxhYmVsLWZsb2F0CiAgICAgICAgICAgICAgICBzZWxlY3RlZC1pdGVtLWxhYmVsPSJ7e190b29sdGlwU29ydGluZ01ldGhvZH19IgogICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgIDxwYXBlci1saXN0Ym94CiAgICAgICAgICAgICAgICAgIGNsYXNzPSJkcm9wZG93bi1jb250ZW50IgogICAgICAgICAgICAgICAgICBzZWxlY3RlZD0iMCIKICAgICAgICAgICAgICAgICAgc2xvdD0iZHJvcGRvd24tY29udGVudCIKICAgICAgICAgICAgICAgID4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVmYXVsdDwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+ZGVzY2VuZGluZzwvcGFwZXItaXRlbT4KICAgICAgICAgICAgICAgICAgPHBhcGVyLWl0ZW0+YXNjZW5kaW5nPC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgICA8cGFwZXItaXRlbT5uZWFyZXN0PC9wYXBlci1pdGVtPgogICAgICAgICAgICAgICAgPC9wYXBlci1saXN0Ym94PgogICAgICAgICAgICAgIDwvcGFwZXItZHJvcGRvd24tbWVudT4KICAgICAgICAgICAgPC9kaXY+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1zbW9vdGhpbmctaW5wdXQKICAgICAgICAgICAgICB3ZWlnaHQ9Int7X3Ntb290aGluZ1dlaWdodH19IgogICAgICAgICAgICAgIHN0ZXA9IjAuMDAxIgogICAgICAgICAgICAgIG1pbj0iMCIKICAgICAgICAgICAgICBtYXg9IjAuOTk5IgogICAgICAgICAgICA+PC90Zi1zbW9vdGhpbmctaW5wdXQ+CiAgICAgICAgICA8L2Rpdj4KICAgICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiI+CiAgICAgICAgICAgIDx0Zi1vcHRpb24tc2VsZWN0b3IKICAgICAgICAgICAgICBpZD0ieC10eXBlLXNlbGVjdG9yIgogICAgICAgICAgICAgIG5hbWU9Ikhvcml6b250YWwgQXhpcyIKICAgICAgICAgICAgICBzZWxlY3RlZC1pZD0ie3tfeFR5cGV9fSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDxwYXBlci1idXR0b24gaWQ9InN0ZXAiPnN0ZXA8L3BhcGVyLWJ1dHRvbgogICAgICAgICAgICAgID48IS0tCiAgICAgICAgICAgIC0tPjxwYXBlci1idXR0b24gaWQ9InJlbGF0aXZlIj5yZWxhdGl2ZTwvcGFwZXItYnV0dG9uCiAgICAgICAgICAgICAgPjwhLS0KICAgICAgICAgICAgLS0+PHBhcGVyLWJ1dHRvbiBpZD0id2FsbF90aW1lIj53YWxsPC9wYXBlci1idXR0b24+CiAgICAgICAgICAgIDwvdGYtb3B0aW9uLXNlbGVjdG9yPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC9kaXY+CiAgICAgICAgPGRpdiBjbGFzcz0ic2lkZWJhci1zZWN0aW9uIHJ1bnMtc2VsZWN0b3IiPgogICAgICAgICAgPHRmLXJ1bnMtc2VsZWN0b3Igc2VsZWN0ZWQtcnVucz0ie3tfc2VsZWN0ZWRSdW5zfX0iPgogICAgICAgICAgPC90Zi1ydW5zLXNlbGVjdG9yPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgICAgPGRpdiBjbGFzcz0iY2VudGVyIiBzbG90PSJjZW50ZXIiPgogICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLWlmIiBpZj0iW1tfZGF0YU5vdEZvdW5kXV0iPgogICAgICAgICAgPGRpdiBjbGFzcz0ibm8tZGF0YS13YXJuaW5nIj4KICAgICAgICAgICAgPGgzPk5vIHNjYWxhciBkYXRhIHdhcyBmb3VuZC48L2gzPgogICAgICAgICAgICA8cD5Qcm9iYWJsZSBjYXVzZXM6PC9wPgogICAgICAgICAgICA8dWw+CiAgICAgICAgICAgICAgPGxpPllvdSBoYXZlbuKAmXQgd3JpdHRlbiBhbnkgc2NhbGFyIGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgICBnZXQtY2F0ZWdvcnktaXRlbS1rZXk9IltbX2dldENhdGVnb3J5SXRlbUtleV1dIgogICAgICAgICAgICA+CiAgICAgICAgICAgICAgPHRlbXBsYXRlPgogICAgICAgICAgICAgICAgPHRmLXNjYWxhci1jYXJkCiAgICAgICAgICAgICAgICAgIGFjdGl2ZT0iW1thY3RpdmVdXSIKICAgICAgICAgICAgICAgICAgZGF0YS10by1sb2FkPSJbW2l0ZW0uc2VyaWVzXV0iCiAgICAgICAgICAgICAgICAgIGlnbm9yZS15LW91dGxpZXJzPSJbW19pZ25vcmVZT3V0bGllcnNdXSIKICAgICAgICAgICAgICAgICAgbXVsdGktZXhwZXJpbWVudHM9IltbX2dldE11bHRpRXhwZXJpbWVudHMoZGF0YVNlbGVjdGlvbildXSIKICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgICBzaG93LWRvd25sb2FkLWxpbmtzPSJbW19zaG93RG93bmxvYWRMaW5rc11dIgogICAgICAgICAgICAgICAgICBzbW9vdGhpbmctZW5hYmxlZD0iW1tfc21vb3RoaW5nRW5hYmxlZF1dIgogICAgICAgICAgICAgICAgICBzbW9vdGhpbmctd2VpZ2h0PSJbW19zbW9vdGhpbmdXZWlnaHRdXSIKICAgICAgICAgICAgICAgICAgdGFnLW1ldGFkYXRhPSJbW190YWdNZXRhZGF0YShjYXRlZ29yeSwgX3J1blRvVGFnSW5mbywgaXRlbSldXSIKICAgICAgICAgICAgICAgICAgdGFnPSJbW2l0ZW0udGFnXV0iCiAgICAgICAgICAgICAgICAgIHRvb2x0aXAtc29ydGluZy1tZXRob2Q9IltbX3Rvb2x0aXBTb3J0aW5nTWV0aG9kXV0iCiAgICAgICAgICAgICAgICAgIHgtdHlwZT0iW1tfeFR5cGVdXSIKICAgICAgICAgICAgICAgID48L3RmLXNjYWxhci1jYXJkPgogICAgICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgICAgIDwvdGYtY2F0ZWdvcnktcGFnaW5hdGVkLXZpZXc+CiAgICAgICAgICA8L3RlbXBsYXRlPgogICAgICAgIDwvdGVtcGxhdGU+CiAgICAgIDwvZGl2PgogICAgPC90Zi1kYXNoYm9hcmQtbGF5b3V0PgoKICAgIDxzdHlsZSBpbmNsdWRlPSJkYXNoYm9hcmQtc3R5bGUiPjwvc3R5bGU+CiAgICA8c3R5bGU+CiAgICAgICN0b29sdGlwLXNvcnRpbmcgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmb250LXNpemU6IDE0cHg7CiAgICAgICAgbWFyZ2luLXRvcDogMTVweDsKICAgICAgfQoKICAgICAgI3Rvb2x0aXAtc29ydGluZyBwYXBlci1kcm9wZG93bi1tZW51IHsKICAgICAgICBtYXJnaW4tbGVmdDogMTBweDsKICAgICAgICAtLXBhcGVyLWlucHV0LWNvbnRhaW5lci1mb2N1cy1jb2xvcjogdmFyKC0tdGItb3JhbmdlLXN0cm9uZyk7CiAgICAgICAgd2lkdGg6IDEwNXB4OwogICAgICB9CgogICAgICAubGluZS1pdGVtIHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwYWRkaW5nLXRvcDogNXB4OwogICAgICB9CiAgICAgIC5uby1kYXRhLXdhcm5pbmcgewogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgICAgbWFyZ2luOiA4MHB4IGF1dG8gMCBhdXRvOwogICAgICB9CiAgICAgIC5jZW50ZXIgewogICAgICAgIG92ZXJmbG93LXg6IGhpZGRlbjsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgInJlbG9hZE9uUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoewogICAgICAgICAgICB0eXBlOiBCb29sZWFuLAogICAgICAgICAgICBub3RpZnk6IHRydWUsCiAgICAgICAgICAgIG9ic2VydmVyOiAnX3Nob3dEb3dubG9hZExpbmtzT2JzZXJ2ZXInLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9zaG93RG93bmxvYWRMaW5rcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7CiAgICAgICAgICAgIHR5cGU6IE51bWJlciwKICAgICAgICAgICAgbm90aWZ5OiB0cnVlLAogICAgICAgICAgICBvYnNlcnZlcjogJ19zbW9vdGhpbmdXZWlnaHRPYnNlcnZlcicsCiAgICAgICAgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBOdW1iZXIpCiAgICBdLCBUZlNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfc21vb3RoaW5nV2VpZ2h0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsKICAgICAgICAgICAgdHlwZTogQm9vbGVhbiwKICAgICAgICAgICAgb2JzZXJ2ZXI6ICdfaWdub3JlWU91dGxpZXJzT2JzZXJ2ZXInLAogICAgICAgIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9pZ25vcmVZT3V0bGllcnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfeFR5cGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBBcnJheSB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KQogICAgXSwgVGZTY2FsYXJEYXNoYm9hcmQucHJvdG90eXBlLCAiX3NlbGVjdGVkUnVucyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIE9iamVjdCkKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9ydW5Ub1RhZ0luZm8iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kYXRhTm90Rm91bmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfdGFnRmlsdGVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQm9vbGVhbiB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEJvb2xlYW4pCiAgICBdLCBUZlNjYWxhckRhc2hib2FyZC5wcm90b3R5cGUsICJfY2F0ZWdvcmllc0RvbVJlYWR5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYXRlZ29yaWVzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZTY2FsYXJEYXNoYm9hcmQucHJvdG90eXBlLCAiX2dldENhdGVnb3J5SXRlbUtleSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IE9iamVjdCB9KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIFJlcXVlc3RNYW5hZ2VyKQogICAgXSwgVGZTY2FsYXJEYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfc21vb3RoaW5nV2VpZ2h0JyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZTY2FsYXJEYXNoYm9hcmQucHJvdG90eXBlLCAiX3Ntb290aGluZ0VuYWJsZWQiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIG9ic2VydmUoJ19ydW5Ub1RhZ0luZm8nLCAnX3NlbGVjdGVkUnVucycsICdfdGFnRmlsdGVyJywgJ19jYXRlZ29yaWVzRG9tUmVhZHknKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkLnByb3RvdHlwZSwgIl91cGRhdGVDYXRlZ29yaWVzIiwgbnVsbCk7CiAgICBUZlNjYWxhckRhc2hib2FyZCA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLXNjYWxhci1kYXNoYm9hcmQnKQogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby11bnVzZWQtdmFyaWFibGUKICAgIF0sIFRmU2NhbGFyRGFzaGJvYXJkKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxNyBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8vIHRmLXRleHQtbG9hZGVyIGRpc3BsYXlzIG1hcmtkb3duIHRleHQgZGF0YSBmcm9tIHRoZSBUZXh0IHBsdWdpbi4KICAgIGxldCBUZlRleHRMb2FkZXIgPSBjbGFzcyBUZlRleHRMb2FkZXIgZXh0ZW5kcyBMZWdhY3lFbGVtZW50TWl4aW4oUG9seW1lckVsZW1lbnQpIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTsKICAgICAgICAgICAgLy8gT3JkZXJlZCBmcm9tIG5ld2VzdCB0byBvbGRlc3QuCiAgICAgICAgICAgIHRoaXMuX3RleHRzID0gW107CiAgICAgICAgICAgIHRoaXMuX2NhbmNlbGxlciA9IG5ldyBDYW5jZWxsZXIoKTsKICAgICAgICB9CiAgICAgICAgZ2V0IF9ydW5Db2xvcigpIHsKICAgICAgICAgICAgdmFyIHJ1biA9IHRoaXMucnVuOwogICAgICAgICAgICByZXR1cm4gcnVuc0NvbG9yU2NhbGUocnVuKTsKICAgICAgICB9CiAgICAgICAgX2NoYW5nZVJ1bkNvbG9yKCkgewogICAgICAgICAgICB2YXIgcnVuQ29sb3IgPSB0aGlzLl9ydW5Db2xvcjsKICAgICAgICAgICAgdGhpcy51cGRhdGVTdHlsZXMoewogICAgICAgICAgICAgICAgJy0tdGItdGV4dC1sb2FkZXItb3V0bGluZSc6IHJ1bkNvbG9yLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgYXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMucmVsb2FkKCk7CiAgICAgICAgfQogICAgICAgIHJlbG9hZCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jYW5jZWxsZXIuY2FuY2VsQWxsKCk7CiAgICAgICAgICAgIGNvbnN0IHJvdXRlciA9IGdldFJvdXRlcigpOwogICAgICAgICAgICBjb25zdCB1cmwgPSBhZGRQYXJhbXMocm91dGVyLnBsdWdpblJvdXRlKCd0ZXh0JywgJy90ZXh0JyksIHsKICAgICAgICAgICAgICAgIHRhZzogdGhpcy50YWcsCiAgICAgICAgICAgICAgICBydW46IHRoaXMucnVuLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgY29uc3QgdXBkYXRlVGV4dHMgPSB0aGlzLl9jYW5jZWxsZXIuY2FuY2VsbGFibGUoKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdC5jYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gcmVzdWx0LnZhbHVlLm1hcCgoZGF0dW0pID0+ICh7CiAgICAgICAgICAgICAgICAgICAgd2FsbF90aW1lOiBuZXcgRGF0ZShkYXR1bS53YWxsX3RpbWUgKiAxMDAwKSwKICAgICAgICAgICAgICAgICAgICBzdGVwOiBkYXR1bS5zdGVwLAogICAgICAgICAgICAgICAgICAgIHRleHQ6IGRhdHVtLnRleHQsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX3RleHRzJywgZGF0YS5zbGljZSgpLnJldmVyc2UoKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLnJlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKHVwZGF0ZVRleHRzKTsKICAgICAgICB9CiAgICAgICAgX2Zvcm1hdFN0ZXAobikgewogICAgICAgICAgICByZXR1cm4gZm9ybWF0KCcsJykobik7CiAgICAgICAgfQogICAgfTsKICAgIFRmVGV4dExvYWRlci50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWNhcmQtaGVhZGluZyBydW49IltbcnVuXV0iIHRhZz0iW1t0YWddXSIgY29sb3I9IltbX3J1bkNvbG9yXV0iPgogICAgPC90Zi1jYXJkLWhlYWRpbmc+CiAgICA8cGFwZXItbWF0ZXJpYWwKICAgICAgZWxldmF0aW9uPSIxIgogICAgICBpZD0ic3RlcHMtY29udGFpbmVyIgogICAgICBjbGFzcz0iY29udGFpbmVyIHNjcm9sbGJhciIKICAgID4KICAgICAgPHRlbXBsYXRlIGlzPSJkb20tcmVwZWF0IiBpdGVtcz0iW1tfdGV4dHNdXSI+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InN0ZXAtY29udGFpbmVyIj4KICAgICAgICAgIHN0ZXAgPHNwYW4gY2xhc3M9InN0ZXAtdmFsdWUiPltbX2Zvcm1hdFN0ZXAoaXRlbS5zdGVwKV1dPC9zcGFuPgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgICAgPHBhcGVyLW1hdGVyaWFsIGVsZXZhdGlvbj0iMSIgY2xhc3M9InRleHQiPgogICAgICAgICAgPHRmLW1hcmtkb3duLXZpZXcgaHRtbD0iW1tpdGVtLnRleHRdXSI+PC90Zi1tYXJrZG93bi12aWV3PgogICAgICAgIDwvcGFwZXItbWF0ZXJpYWw+CiAgICAgIDwvdGVtcGxhdGU+CiAgICA8L3BhcGVyLW1hdGVyaWFsPgogICAgPHN0eWxlIGluY2x1ZGU9InNjcm9sbGJhci1zdHlsZSI+PC9zdHlsZT4KICAgIDxzdHlsZT4KICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgICBoZWlnaHQ6IGF1dG87CiAgICAgICAgbWFyZ2luLXJpZ2h0OiAxMHB4OwogICAgICAgIG1hcmdpbi1ib3R0b206IDE1cHg7CiAgICAgIH0KICAgICAgLnNjcm9sbGJhciB7CiAgICAgICAgd2lsbC1jaGFuZ2U6IHRyYW5zZm9ybTsKICAgICAgfQogICAgICAjc3RlcHMtY29udGFpbmVyIHsKICAgICAgICBib3JkZXItcmFkaXVzOiAzcHg7CiAgICAgICAgYm9yZGVyOiAycHggc29saWQgLyogY29sb3IgY29tcHV0ZWQgYW5kIHNldCBhcyBpbmxpbmUgc3R5bGUgKi87CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgbWF4LWhlaWdodDogNTAwcHg7CiAgICAgICAgb3ZlcmZsb3c6IGF1dG87CiAgICAgICAgcGFkZGluZzogMTBweDsKICAgICAgICBib3JkZXItY29sb3I6IHZhcigtLXRiLXRleHQtbG9hZGVyLW91dGxpbmUpOwogICAgICB9CiAgICAgIC50ZXh0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiB3aGl0ZTsKICAgICAgICBib3JkZXItcmFkaXVzOiAwIDNweCAzcHggM3B4OwogICAgICAgIHBhZGRpbmc6IDVweDsKICAgICAgICB3b3JkLWJyZWFrOiBicmVhay13b3JkOwogICAgICB9CiAgICAgIC5zdGVwLWNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tdGItdWktbGlnaHQtYWNjZW50KTsKICAgICAgICBib3JkZXItYm90dG9tOiBub25lOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDNweCAzcHggMCAwOwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjY2M7CiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrOwogICAgICAgIGZvbnQtc2l6ZTogMTJweDsKICAgICAgICBmb250LXN0eWxlOiBpdGFsaWM7CiAgICAgICAgbWFyZ2luLWxlZnQ6IC0xcHg7IC8qIHRvIGNvcnJlY3QgZm9yIGJvcmRlciAqLwogICAgICAgIHBhZGRpbmc6IDNweDsKICAgICAgfQogICAgICAuc3RlcC1jb250YWluZXI6bm90KDpmaXJzdC1jaGlsZCkgewogICAgICAgIG1hcmdpbi10b3A6IDE1cHg7CiAgICAgIH0KCiAgICAgIHRmLWNhcmQtaGVhZGluZyB7CiAgICAgICAgbWFyZ2luLWJvdHRvbTogMTBweDsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlRleHRMb2FkZXIucHJvdG90eXBlLCAicnVuIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogU3RyaW5nIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgU3RyaW5nKQogICAgXSwgVGZUZXh0TG9hZGVyLnByb3RvdHlwZSwgInRhZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEFycmF5IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQXJyYXkpCiAgICBdLCBUZlRleHRMb2FkZXIucHJvdG90eXBlLCAiX3RleHRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgUmVxdWVzdE1hbmFnZXIpCiAgICBdLCBUZlRleHRMb2FkZXIucHJvdG90eXBlLCAicmVxdWVzdE1hbmFnZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBDYW5jZWxsZXIpCiAgICBdLCBUZlRleHRMb2FkZXIucHJvdG90eXBlLCAiX2NhbmNlbGxlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBjb21wdXRlZCgncnVuJyksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjpwYXJhbXR5cGVzIiwgW10pCiAgICBdLCBUZlRleHRMb2FkZXIucHJvdG90eXBlLCAiX3J1bkNvbG9yIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBvYnNlcnZlKCdfcnVuQ29sb3InKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEZ1bmN0aW9uKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cmV0dXJudHlwZSIsIHZvaWQgMCkKICAgIF0sIFRmVGV4dExvYWRlci5wcm90b3R5cGUsICJfY2hhbmdlUnVuQ29sb3IiLCBudWxsKTsKICAgIFRmVGV4dExvYWRlciA9IF9fZGVjb3JhdGUoWwogICAgICAgIGN1c3RvbUVsZW1lbnQoJ3RmLXRleHQtbG9hZGVyJykKICAgIF0sIFRmVGV4dExvYWRlcik7CgogICAgLyogQ29weXJpZ2h0IDIwMTcgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsZXQgVGZUZXh0RGFzaGJvYXJkID0gY2xhc3MgVGZUZXh0RGFzaGJvYXJkIGV4dGVuZHMgTGVnYWN5RWxlbWVudE1peGluKFBvbHltZXJFbGVtZW50KSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkT25SZWFkeSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX3JlcXVlc3RNYW5hZ2VyID0gbmV3IFJlcXVlc3RNYW5hZ2VyKCk7CiAgICAgICAgfQogICAgICAgIHJlYWR5KCkgewogICAgICAgICAgICBzdXBlci5yZWFkeSgpOwogICAgICAgICAgICBpZiAodGhpcy5yZWxvYWRPblJlYWR5KQogICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQoKTsKICAgICAgICB9CiAgICAgICAgcmVsb2FkKCkgewogICAgICAgICAgICB0aGlzLl9mZXRjaFRhZ3MoKS50aGVuKCgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbG9hZFRleHRzKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfc2hvdWxkT3BlbihpbmRleCkgewogICAgICAgICAgICByZXR1cm4gaW5kZXggPD0gMjsKICAgICAgICB9CiAgICAgICAgX2ZldGNoVGFncygpIHsKICAgICAgICAgICAgY29uc3QgdXJsID0gZ2V0Um91dGVyKCkucGx1Z2luUm91dGUoJ3RleHQnLCAnL3RhZ3MnKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVlc3RNYW5hZ2VyLnJlcXVlc3QodXJsKS50aGVuKChydW5Ub1RhZykgPT4gewogICAgICAgICAgICAgICAgaWYgKGxvZGFzaC5pc0VxdWFsKHJ1blRvVGFnLCB0aGlzLl9ydW5Ub1RhZykpIHsKICAgICAgICAgICAgICAgICAgICAvLyBObyBuZWVkIHRvIHVwZGF0ZSBhbnl0aGluZyBpZiB0aGVyZSBhcmUgbm8gY2hhbmdlcy4KICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB0YWdzID0gZ2V0VGFncyhydW5Ub1RhZyk7CiAgICAgICAgICAgICAgICB0aGlzLnNldCgnX2RhdGFOb3RGb3VuZCcsIHRhZ3MubGVuZ3RoID09PSAwKTsKICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfcnVuVG9UYWcnLCBydW5Ub1RhZyk7CiAgICAgICAgICAgICAgICB0aGlzLmFzeW5jKCgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBTZWUgdGhlIGNvbW1lbnQgYWJvdmUgYF9jYXRlZ29yaWVzRG9tUmVhZHlgLgogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0KCdfY2F0ZWdvcmllc0RvbVJlYWR5JywgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIF9yZWxvYWRUZXh0cygpIHsKICAgICAgICAgICAgdGhpcy5yb290LnF1ZXJ5U2VsZWN0b3JBbGwoJ3RmLXRleHQtbG9hZGVyJykuZm9yRWFjaCgodGV4dExvYWRlcikgPT4gewogICAgICAgICAgICAgICAgdGV4dExvYWRlci5yZWxvYWQoKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGdldCBfY2F0ZWdvcmllcygpIHsKICAgICAgICAgICAgdmFyIHJ1blRvVGFnID0gdGhpcy5fcnVuVG9UYWc7CiAgICAgICAgICAgIHZhciBzZWxlY3RlZFJ1bnMgPSB0aGlzLl9zZWxlY3RlZFJ1bnM7CiAgICAgICAgICAgIHZhciB0YWdGaWx0ZXIgPSB0aGlzLl90YWdGaWx0ZXI7CiAgICAgICAgICAgIHJldHVybiBjYXRlZ29yaXplUnVuVGFnQ29tYmluYXRpb25zKHJ1blRvVGFnLCBzZWxlY3RlZFJ1bnMsIHRhZ0ZpbHRlcik7CiAgICAgICAgfQogICAgfTsKICAgIFRmVGV4dERhc2hib2FyZC50ZW1wbGF0ZSA9IGh0bWwgYAogICAgPHRmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICAgIDxkaXYgY2xhc3M9InNpZGViYXIiIHNsb3Q9InNpZGViYXIiPgogICAgICAgIDxkaXYgY2xhc3M9InNpZGViYXItc2VjdGlvbiBydW5zLXNlbGVjdG9yIj4KICAgICAgICAgIDx0Zi1ydW5zLXNlbGVjdG9yIHNlbGVjdGVkLXJ1bnM9Int7X3NlbGVjdGVkUnVuc319Ij4KICAgICAgICAgIDwvdGYtcnVucy1zZWxlY3Rvcj4KICAgICAgICA8L2Rpdj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYgY2xhc3M9ImNlbnRlciIgc2xvdD0iY2VudGVyIj4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbX2RhdGFOb3RGb3VuZF1dIj4KICAgICAgICAgIDxkaXYgY2xhc3M9Im5vLWRhdGEtd2FybmluZyI+CiAgICAgICAgICAgIDxoMz5ObyB0ZXh0IGRhdGEgd2FzIGZvdW5kLjwvaDM+CiAgICAgICAgICAgIDxwPlByb2JhYmxlIGNhdXNlczo8L3A+CiAgICAgICAgICAgIDx1bD4KICAgICAgICAgICAgICA8bGk+WW91IGhhdmVu4oCZdCB3cml0dGVuIGFueSB0ZXh0IGRhdGEgdG8geW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICAgIDxsaT5UZW5zb3JCb2FyZCBjYW7igJl0IGZpbmQgeW91ciBldmVudCBmaWxlcy48L2xpPgogICAgICAgICAgICA8L3VsPgoKICAgICAgICAgICAgPHA+CiAgICAgICAgICAgICAgSWYgeW914oCZcmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8KICAgICAgICAgICAgICBhZGQgZGF0YSBhbmQgc2V0IHVwIHlvdXIgZXZlbnQgZmlsZXMsIGNoZWNrIG91dCB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgICAgICAgICAgPlJFQURNRTwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgcGVyaGFwcyB0aGUKICAgICAgICAgICAgICA8YQogICAgICAgICAgICAgICAgaHJlZj0iaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCIKICAgICAgICAgICAgICAgID5UZW5zb3JCb2FyZCB0dXRvcmlhbDwvYQogICAgICAgICAgICAgID4uCiAgICAgICAgICAgIDwvcD4KCiAgICAgICAgICAgIDxwPgogICAgICAgICAgICAgIElmIHlvdSB0aGluayBUZW5zb3JCb2FyZCBpcyBjb25maWd1cmVkIHByb3Blcmx5LCBwbGVhc2Ugc2VlCiAgICAgICAgICAgICAgPGEKICAgICAgICAgICAgICAgIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCNteS10ZW5zb3Jib2FyZC1pc250LXNob3dpbmctYW55LWRhdGEtd2hhdHMtd3JvbmciCiAgICAgICAgICAgICAgICA+dGhlIHNlY3Rpb24gb2YgdGhlIFJFQURNRSBkZXZvdGVkIHRvIG1pc3NpbmcgZGF0YSBwcm9ibGVtczwvYQogICAgICAgICAgICAgID4KICAgICAgICAgICAgICBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4KICAgICAgICAgICAgPC9wPgogICAgICAgICAgPC9kaXY+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICA8dGVtcGxhdGUgaXM9ImRvbS1pZiIgaWY9IltbIV9kYXRhTm90Rm91bmRdXSI+CiAgICAgICAgICA8dGYtdGFnLWZpbHRlcmVyIHRhZy1maWx0ZXI9Int7X3RhZ0ZpbHRlcn19Ij48L3RmLXRhZy1maWx0ZXJlcj4KICAgICAgICAgIDx0ZW1wbGF0ZSBpcz0iZG9tLXJlcGVhdCIgaXRlbXM9IltbX2NhdGVnb3JpZXNdXSIgYXM9ImNhdGVnb3J5Ij4KICAgICAgICAgICAgPHRmLWNhdGVnb3J5LXBhZ2luYXRlZC12aWV3CiAgICAgICAgICAgICAgY2F0ZWdvcnk9IltbY2F0ZWdvcnldXSIKICAgICAgICAgICAgICBpbml0aWFsLW9wZW5lZD0iW1tfc2hvdWxkT3BlbihpbmRleCldXSIKICAgICAgICAgICAgPgogICAgICAgICAgICAgIDx0ZW1wbGF0ZT4KICAgICAgICAgICAgICAgIDx0Zi10ZXh0LWxvYWRlcgogICAgICAgICAgICAgICAgICBhY3RpdmU9IltbYWN0aXZlXV0iCiAgICAgICAgICAgICAgICAgIHRhZz0iW1tpdGVtLnRhZ11dIgogICAgICAgICAgICAgICAgICBydW49IltbaXRlbS5ydW5dXSIKICAgICAgICAgICAgICAgICAgcmVxdWVzdC1tYW5hZ2VyPSJbW19yZXF1ZXN0TWFuYWdlcl1dIgogICAgICAgICAgICAgICAgPjwvdGYtdGV4dC1sb2FkZXI+CiAgICAgICAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgICAgICAgPC90Zi1jYXRlZ29yeS1wYWdpbmF0ZWQtdmlldz4KICAgICAgICAgIDwvdGVtcGxhdGU+CiAgICAgICAgPC90ZW1wbGF0ZT4KICAgICAgPC9kaXY+CiAgICA8L3RmLWRhc2hib2FyZC1sYXlvdXQ+CiAgICA8c3R5bGUgaW5jbHVkZT0iZGFzaGJvYXJkLXN0eWxlIj48L3N0eWxlPgogICAgPHN0eWxlPgogICAgICAubm8tZGF0YS13YXJuaW5nIHsKICAgICAgICBtYXgtd2lkdGg6IDU0MHB4OwogICAgICAgIG1hcmdpbjogODBweCBhdXRvIDAgYXV0bzsKICAgICAgfQogICAgPC9zdHlsZT4KICBgOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBCb29sZWFuIH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgQm9vbGVhbikKICAgIF0sIFRmVGV4dERhc2hib2FyZC5wcm90b3R5cGUsICJyZWxvYWRPblJlYWR5Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogQXJyYXkgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBBcnJheSkKICAgIF0sIFRmVGV4dERhc2hib2FyZC5wcm90b3R5cGUsICJfc2VsZWN0ZWRSdW5zIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIHByb3BlcnR5KHsgdHlwZTogT2JqZWN0IH0pLAogICAgICAgIF9fbWV0YWRhdGEoImRlc2lnbjp0eXBlIiwgT2JqZWN0KQogICAgXSwgVGZUZXh0RGFzaGJvYXJkLnByb3RvdHlwZSwgIl9ydW5Ub1RhZyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZUZXh0RGFzaGJvYXJkLnByb3RvdHlwZSwgIl9kYXRhTm90Rm91bmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBTdHJpbmcgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBTdHJpbmcpCiAgICBdLCBUZlRleHREYXNoYm9hcmQucHJvdG90eXBlLCAiX3RhZ0ZpbHRlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBwcm9wZXJ0eSh7IHR5cGU6IEJvb2xlYW4gfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBCb29sZWFuKQogICAgXSwgVGZUZXh0RGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYXRlZ29yaWVzRG9tUmVhZHkiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgcHJvcGVydHkoeyB0eXBlOiBPYmplY3QgfSksCiAgICAgICAgX19tZXRhZGF0YSgiZGVzaWduOnR5cGUiLCBPYmplY3QpCiAgICBdLCBUZlRleHREYXNoYm9hcmQucHJvdG90eXBlLCAiX3JlcXVlc3RNYW5hZ2VyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIGNvbXB1dGVkKCdfcnVuVG9UYWcnLCAnX3NlbGVjdGVkUnVucycsICdfdGFnRmlsdGVyJywgJ19jYXRlZ29yaWVzRG9tUmVhZHknKSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246dHlwZSIsIEFycmF5KSwKICAgICAgICBfX21ldGFkYXRhKCJkZXNpZ246cGFyYW10eXBlcyIsIFtdKQogICAgXSwgVGZUZXh0RGFzaGJvYXJkLnByb3RvdHlwZSwgIl9jYXRlZ29yaWVzIiwgbnVsbCk7CiAgICBUZlRleHREYXNoYm9hcmQgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi10ZXh0LWRhc2hib2FyZCcpCiAgICBdLCBUZlRleHREYXNoYm9hcmQpOwoKICAgIGNsYXNzIElQQyB7CiAgICAgICAgY29uc3RydWN0b3IocG9ydCkgewogICAgICAgICAgICB0aGlzLnBvcnQgPSBwb3J0OwogICAgICAgICAgICB0aGlzLmlkID0gMDsKICAgICAgICAgICAgdGhpcy5yZXNwb25zZVdhaXRzID0gbmV3IE1hcCgpOwogICAgICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5wb3J0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCAoZXZlbnQpID0+IHRoaXMub25NZXNzYWdlKGV2ZW50KSk7CiAgICAgICAgfQogICAgICAgIGxpc3Rlbih0eXBlLCBjYWxsYmFjaykgewogICAgICAgICAgICB0aGlzLmxpc3RlbmVycy5zZXQodHlwZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICB1bmxpc3Rlbih0eXBlKSB7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJzLmRlbGV0ZSh0eXBlKTsKICAgICAgICB9CiAgICAgICAgb25NZXNzYWdlKGV2ZW50KSB7CiAgICAgICAgICAgIHJldHVybiBfX2F3YWl0ZXIodGhpcywgdm9pZCAwLCB2b2lkIDAsIGZ1bmN0aW9uKiAoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gSlNPTi5wYXJzZShldmVudC5kYXRhKTsKICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBzZWUgWzFdIGZvciByZWFzb24gd2h5IHdlIHVzZSBzdHJpbmcgdG8gYWNjZXNzIHRoZSBwcm9wZXJ0eS4KICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBtZXNzYWdlWyd0eXBlJ107CiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IG1lc3NhZ2VbJ2lkJ107CiAgICAgICAgICAgICAgICBjb25zdCBwYXlsb2FkID0gbWVzc2FnZVsncGF5bG9hZCddOwogICAgICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBtZXNzYWdlWydlcnJvciddOwogICAgICAgICAgICAgICAgY29uc3QgaXNSZXBseSA9IG1lc3NhZ2VbJ2lzUmVwbHknXTsKICAgICAgICAgICAgICAgIGlmIChpc1JlcGx5KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnJlc3BvbnNlV2FpdHMuaGFzKGlkKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmVzb2x2ZSwgcmVqZWN0IH0gPSB0aGlzLnJlc3BvbnNlV2FpdHMuZ2V0KGlkKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlV2FpdHMuZGVsZXRlKGlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihlcnJvcikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShwYXlsb2FkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGV0IHJlcGx5UGF5bG9hZCA9IG51bGw7CiAgICAgICAgICAgICAgICBsZXQgcmVwbHlFcnJvciA9IG51bGw7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5saXN0ZW5lcnMuaGFzKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSB0aGlzLmxpc3RlbmVycy5nZXQodHlwZSk7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geWllbGQgY2FsbGJhY2socGF5bG9hZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5UGF5bG9hZCA9IHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvciA9IGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gUGxlYXNlIHNlZSBbMV0gZm9yIHJlYXNvbiB3aHkgd2UgdXNlIHN0cmluZyB0byBhY2Nlc3MgdGhlIHByb3BlcnR5LgogICAgICAgICAgICAgICAgY29uc3QgcmVwbHlNZXNzYWdlID0gewogICAgICAgICAgICAgICAgICAgIFsndHlwZSddOiB0eXBlLAogICAgICAgICAgICAgICAgICAgIFsnaWQnXTogaWQsCiAgICAgICAgICAgICAgICAgICAgWydwYXlsb2FkJ106IHJlcGx5UGF5bG9hZCwKICAgICAgICAgICAgICAgICAgICBbJ2Vycm9yJ106IHJlcGx5RXJyb3IsCiAgICAgICAgICAgICAgICAgICAgWydpc1JlcGx5J106IHRydWUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdGhpcy5wb3N0TWVzc2FnZShyZXBseU1lc3NhZ2UpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcG9zdE1lc3NhZ2UobWVzc2FnZSkgewogICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UoSlNPTi5zdHJpbmdpZnkobWVzc2FnZSkpOwogICAgICAgIH0KICAgICAgICBzZW5kTWVzc2FnZSh0eXBlLCBwYXlsb2FkKSB7CiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5pZCsrOwogICAgICAgICAgICBjb25zdCBtZXNzYWdlID0geyB0eXBlLCBpZCwgcGF5bG9hZCwgZXJyb3I6IG51bGwsIGlzUmVwbHk6IGZhbHNlIH07CiAgICAgICAgICAgIHRoaXMucG9zdE1lc3NhZ2UobWVzc2FnZSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnJlc3BvbnNlV2FpdHMuc2V0KGlkLCB7IHJlc29sdmUsIHJlamVjdCB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgcGx1Z2luIGlmcmFtZSB1cG9uIGNyZWF0aW9uLiBQbHVnaW5zCiAgICAgKiByZWdpc3RlcmVkIHdpdGggdGhpcyBkbyBub3QgbmVjZXNzYXJpbHkgdXNlIElQQy4KICAgICAqLwogICAgZnVuY3Rpb24gcmVnaXN0ZXJQbHVnaW5JZnJhbWUoZnJhbWUsIHBsdWdpbk5hbWUpIHsKICAgICAgICBwbHVnaW5NZXRhZGF0YS5zZXQoZnJhbWUsIHsgcGx1Z2luTmFtZSB9KTsKICAgIH0KICAgIGNvbnN0IHBsdWdpbk1ldGFkYXRhID0gbmV3IFdlYWtNYXAoKTsKICAgIGNvbnN0IHBvcnRJUENzID0gbmV3IFNldCgpOwogICAgY29uc3QgVkVSU0lPTiA9ICdleHBlcmltZW50YWwnOwogICAgY29uc3QgbGlzdGVuZXJzJDEgPSBuZXcgTWFwKCk7CiAgICAvLyBUT0RPKEBwc3lidXp6KTogcmVwbGFjZSB0aGlzIGFuZCB0aGUgcG9ydCBjbGVhbnVwIGxvZ2ljIGluIGJyb2FkY2FzdCgpIHdpdGgKICAgIC8vIGEgTXV0YXRpb25PYnNlcnZlciB0byBub3RpZnkgdXMgd2hlbiBpZnJhbWVzIGRpc2Nvbm5lY3QuCiAgICBjb25zdCBpcGNUb0ZyYW1lID0gbmV3IE1hcCgpOwogICAgLy8gVGhlIGluaXRpYWwgV2luZG93LWxldmVsIGxpc3RlbmVyIGlzIG5lZWRlZCB0byBib290c3RyYXAgb25seS4KICAgIC8vIEFsbCBmdXJ0aGVyIGNvbW11bmljYXRpb24gaXMgZG9uZSBvdmVyIE1lc3NhZ2VQb3J0cy4KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgKGV2ZW50KSA9PiB7CiAgICAgICAgaWYgKGV2ZW50LmRhdGEgIT09IGAke1ZFUlNJT059LmJvb3RzdHJhcGApCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBjb25zdCBwb3J0ID0gZXZlbnQucG9ydHNbMF07CiAgICAgICAgaWYgKCFwb3J0KQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgY29uc3QgZnJhbWUgPSBldmVudC5zb3VyY2UgPyBldmVudC5zb3VyY2UuZnJhbWVFbGVtZW50IDogbnVsbDsKICAgICAgICBpZiAoIWZyYW1lKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgb25Cb290c3RyYXAocG9ydCwgZnJhbWUpOwogICAgfSk7CiAgICBmdW5jdGlvbiBvbkJvb3RzdHJhcChwb3J0LCBmcmFtZSkgewogICAgICAgIGNvbnN0IHBvcnRJUEMgPSBuZXcgSVBDKHBvcnQpOwogICAgICAgIHBvcnRJUENzLmFkZChwb3J0SVBDKTsKICAgICAgICBpcGNUb0ZyYW1lLnNldChwb3J0SVBDLCBmcmFtZSk7CiAgICAgICAgcG9ydC5zdGFydCgpOwogICAgICAgIGZvciAoY29uc3QgW3R5cGUsIGNhbGxiYWNrXSBvZiBsaXN0ZW5lcnMkMSkgewogICAgICAgICAgICBjb25zdCBjYWxsYmFja1dpdGhDb250ZXh0ID0gd3JhcENhbGxiYWNrV2l0aENvbnRleHQoY2FsbGJhY2ssIHBvcnRJUEMpOwogICAgICAgICAgICBwb3J0SVBDLmxpc3Rlbih0eXBlLCBjYWxsYmFja1dpdGhDb250ZXh0KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFByb3ZpZGVzIGNvbnRleHQgZGF0YSBmcm9tIHRoZSBJUEMgdG8gdGhlIGNhbGxiYWNrLgogICAgICovCiAgICBmdW5jdGlvbiB3cmFwQ2FsbGJhY2tXaXRoQ29udGV4dChjYWxsYmFjaywgaXBjKSB7CiAgICAgICAgcmV0dXJuIChwYXlsb2FkKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGZyYW1lID0gaXBjVG9GcmFtZS5nZXQoaXBjKTsKICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHBsdWdpbk1ldGFkYXRhLmdldChmcmFtZSkgfHwgbnVsbDsKICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKGNvbnRleHQsIHBheWxvYWQpOwogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFNlbmRzIGEgbWVzc2FnZSB0byBhbGwgZnJhbWVzLiBJbmRpdmlkdWFsIGZyYW1lcyBkZWNpZGUgd2hldGhlciBvciBub3QgdG8KICAgICAqIGxpc3Rlbi4KICAgICAqIEByZXR1cm4gUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBsaXN0IG9mIHBheWxvYWRzIGZyb20gZWFjaCBwbHVnaW4ncwogICAgICogICAgICAgICByZXNwb25zZSAob3IgbnVsbCkgdG8gdGhlIG1lc3NhZ2UuCiAgICAgKgogICAgICogQGV4YW1wbGUKICAgICAqIGNvbnN0IHNvbWVMaXN0ID0gYXdhaXQgYnJvYWRjYXN0KCd2MS5zb21lLnR5cGUuZ3Vlc3QudW5kZXJzdGFuZHMnKTsKICAgICAqIC8vIGRvIGZ1biB0aGluZ3Mgd2l0aCBzb21lTGlzdC4KICAgICAqLwogICAgZnVuY3Rpb24gYnJvYWRjYXN0KHR5cGUsIHBheWxvYWQpIHsKICAgICAgICBmb3IgKGNvbnN0IGlwYyBvZiBwb3J0SVBDcykgewogICAgICAgICAgICBpZiAoIWlwY1RvRnJhbWUuZ2V0KGlwYykuaXNDb25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgIHBvcnRJUENzLmRlbGV0ZShpcGMpOwogICAgICAgICAgICAgICAgaXBjVG9GcmFtZS5kZWxldGUoaXBjKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBwcm9taXNlcyA9IFsuLi5wb3J0SVBDc10ubWFwKChpcGMpID0+IGlwYy5zZW5kTWVzc2FnZSh0eXBlLCBwYXlsb2FkKSk7CiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzKTsKICAgIH0KICAgIC8qKgogICAgICogU3Vic2NyaWJlcyB0byBtZXNzYWdlcyBvZiBhIHR5cGUgc3BlY2lmaWVkIGZvciBhbGwgZnJhbWVzLgogICAgICovCiAgICBmdW5jdGlvbiBsaXN0ZW4odHlwZSwgY2FsbGJhY2spIHsKICAgICAgICBsaXN0ZW5lcnMkMS5zZXQodHlwZSwgY2FsbGJhY2spOwogICAgICAgIGZvciAoY29uc3QgaXBjIG9mIHBvcnRJUENzKSB7CiAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrV2l0aENvbnRleHQgPSB3cmFwQ2FsbGJhY2tXaXRoQ29udGV4dChjYWxsYmFjaywgaXBjKTsKICAgICAgICAgICAgaXBjLmxpc3Rlbih0eXBlLCBjYWxsYmFja1dpdGhDb250ZXh0KTsKICAgICAgICB9CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBsaXN0ZW4oJ2V4cGVyaW1lbnRhbC5HZXRVUkxQbHVnaW5EYXRhJywgKGNvbnRleHQpID0+IHsKICAgICAgICBpZiAoIWNvbnRleHQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBjb25zdCBwcmVmaXggPSBgcC4ke2NvbnRleHQucGx1Z2luTmFtZX0uYDsKICAgICAgICBjb25zdCByZXN1bHQgPSB7fTsKICAgICAgICBjb25zdCB1cmxEaWN0ID0gZ2V0VXJsRGljdCgpOwogICAgICAgIGZvciAobGV0IGtleSBpbiB1cmxEaWN0KSB7CiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aChwcmVmaXgpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5LZXkgPSBrZXkuc3Vic3RyaW5nKHByZWZpeC5sZW5ndGgpOwogICAgICAgICAgICAgICAgcmVzdWx0W3BsdWdpbktleV0gPSB1cmxEaWN0W2tleV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDE3IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgbGlzdGVuKCdleHBlcmltZW50YWwuR2V0UnVucycsICgpID0+IHsKICAgICAgICByZXR1cm4gcnVuc1N0b3JlLmdldFJ1bnMoKTsKICAgIH0pOwogICAgcnVuc1N0b3JlLmFkZExpc3RlbmVyKCgpID0+IHsKICAgICAgICByZXR1cm4gYnJvYWRjYXN0KCdleHBlcmltZW50YWwuUnVuc0NoYW5nZWQnLCBydW5zU3RvcmUuZ2V0UnVucygpKTsKICAgIH0pOwoKICAgIC8vIEhBQ0s6IHRoaXMgUG9seW1lciBjb21wb25lbnQgYWxsb3dzIHRoZSBleHBlcmltZW50YWwgcGx1Z2luIGhvc3QgQVBJcwogICAgLy8gdG8gYmUgYWNjZXNzaWJsZSBhY3Jvc3MgYnVuZGxlIGJpbmFyeS4KICAgIGxldCBUZkV4cGVyaW1lbnRhbFBsdWdpbkhvc3RMaWIgPSBjbGFzcyBUZkV4cGVyaW1lbnRhbFBsdWdpbkhvc3RMaWIgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5yZWdpc3RlclBsdWdpbklmcmFtZSA9IHJlZ2lzdGVyUGx1Z2luSWZyYW1lOwogICAgICAgIH0KICAgIH07CiAgICBUZkV4cGVyaW1lbnRhbFBsdWdpbkhvc3RMaWIgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1leHBlcmltZW50YWwtcGx1Z2luLWhvc3QtbGliJykKICAgIF0sIFRmRXhwZXJpbWVudGFsUGx1Z2luSG9zdExpYik7CgogICAgLy8gSEFDSzogdGhpcyBQb2x5bWVyIGNvbXBvbmVudCBhbGxvd3Mgc3RvcmVzIHRvIGJlIGFjY2Vzc2libGUgZnJvbQogICAgLy8gdGYtbmctdGVuc29yYm9hcmQgYnkgZXhwb3Npbmcgb3RoZXJ3aXNlIG1hbmdsZWQgc215Ym9scy4KICAgIGxldCBUZkJhY2tlbmQgPSBjbGFzcyBUZkJhY2tlbmQgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy50Zl9iYWNrZW5kID0gdGZfYmFja2VuZDsKICAgICAgICB9CiAgICB9OwogICAgVGZCYWNrZW5kID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtYmFja2VuZCcpCiAgICBdLCBUZkJhY2tlbmQpOwoKICAgIGxldCBUZkdsb2JhbHMgPSBjbGFzcyBUZkdsb2JhbHMgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy50Zl9nbG9iYWxzID0gdGZfZ2xvYmFsczsKICAgICAgICB9CiAgICB9OwogICAgVGZHbG9iYWxzID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtZ2xvYmFscycpCiAgICBdLCBUZkdsb2JhbHMpOwoKICAgIGxldCBUZlN0b3JhZ2UgPSBjbGFzcyBUZlN0b3JhZ2UgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy50Zl9zdG9yYWdlID0gdGZfc3RvcmFnZTsKICAgICAgICB9CiAgICB9OwogICAgVGZTdG9yYWdlID0gX19kZWNvcmF0ZShbCiAgICAgICAgY3VzdG9tRWxlbWVudCgndGYtc3RvcmFnZScpCiAgICBdLCBUZlN0b3JhZ2UpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwoKICAgIHZhciB0Zl9wYWdpbmF0ZWRfdmlldyA9IC8qI19fUFVSRV9fKi9PYmplY3QuZnJlZXplKHsKICAgICAgICBfX3Byb3RvX186IG51bGwsCiAgICAgICAgYWRkTGltaXRMaXN0ZW5lcjogYWRkTGltaXRMaXN0ZW5lciwKICAgICAgICByZW1vdmVMaW1pdExpc3RlbmVyOiByZW1vdmVMaW1pdExpc3RlbmVyLAogICAgICAgIGdldExpbWl0OiBnZXRMaW1pdCwKICAgICAgICBzZXRMaW1pdDogc2V0TGltaXQsCiAgICAgICAgVGZEb21SZXBlYXQ6IFRmRG9tUmVwZWF0CiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGxldCBUZlBhZ2luYXRlZFZpZXdTdG9yZSA9IGNsYXNzIFRmUGFnaW5hdGVkVmlld1N0b3JlIGV4dGVuZHMgUG9seW1lckVsZW1lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMudGZfcGFnaW5hdGVkX3ZpZXcgPSB0Zl9wYWdpbmF0ZWRfdmlldzsKICAgICAgICB9CiAgICB9OwogICAgVGZQYWdpbmF0ZWRWaWV3U3RvcmUgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1wYWdpbmF0ZWQtdmlldy1zdG9yZScpCiAgICBdLCBUZlBhZ2luYXRlZFZpZXdTdG9yZSk7CgogICAgLy8gSEFDSzogdGhpcyBQb2x5bWVyIGNvbXBvbmVudCBhbGxvd3Mgc3RvcmVzIHRvIGJlIGFjY2Vzc2libGUgZnJvbQogICAgLy8gdGYtbmctdGVuc29yYm9hcmQgYnkgZXhwb3Npbmcgb3RoZXJ3aXNlIG1hbmdsZWQgc215Ym9scy4KICAgIGxldCBUZkNvbG9yU2NhbGUgPSBjbGFzcyBUZkNvbG9yU2NhbGUgZXh0ZW5kcyBQb2x5bWVyRWxlbWVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5ydW5zQ29sb3JTY2FsZSA9IHJ1bnNDb2xvclNjYWxlOwogICAgICAgIH0KICAgIH07CiAgICBUZkNvbG9yU2NhbGUgPSBfX2RlY29yYXRlKFsKICAgICAgICBjdXN0b21FbGVtZW50KCd0Zi1jb2xvci1zY2FsZScpCiAgICBdLCBUZkNvbG9yU2NhbGUpOwoKfSgpKTsKCgoKKGZ1bmN0aW9uICgpIHsKCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uKHgpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHggPT09ICdmdW5jdGlvbic7CiAgICB9CgogICAgbGV0IF9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5ncyA9IGZhbHNlOwogICAgY29uc3QgY29uZmlnID0gewogICAgICAgIFByb21pc2U6IHVuZGVmaW5lZCwKICAgICAgICBzZXQgdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyh2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKCk7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0RFUFJFQ0FURUQhIFJ4SlMgd2FzIHNldCB0byB1c2UgZGVwcmVjYXRlZCBzeW5jaHJvbm91cyBlcnJvciBoYW5kbGluZyBiZWhhdmlvciBieSBjb2RlIGF0OiBcbicgKyBlcnJvci5zdGFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoX2VuYWJsZV9zdXBlcl9ncm9zc19tb2RlX3RoYXRfd2lsbF9jYXVzZV9iYWRfdGhpbmdzKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnUnhKUzogQmFjayB0byBhIGJldHRlciBlcnJvciBiZWhhdmlvci4gVGhhbmsgeW91LiA8MycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIF9lbmFibGVfc3VwZXJfZ3Jvc3NfbW9kZV90aGF0X3dpbGxfY2F1c2VfYmFkX3RoaW5ncyA9IHZhbHVlOwogICAgICAgIH0sCiAgICAgICAgZ2V0IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiBfZW5hYmxlX3N1cGVyX2dyb3NzX21vZGVfdGhhdF93aWxsX2NhdXNlX2JhZF90aGluZ3M7CiAgICAgICAgfSwKICAgIH07CgogICAgZnVuY3Rpb24gaG9zdFJlcG9ydEVycm9yKGVycikgewogICAgICAgIHNldFRpbWVvdXQoKCkgPT4geyB0aHJvdyBlcnI7IH0sIDApOwogICAgfQoKICAgIGNvbnN0IGVtcHR5ID0gewogICAgICAgIGNsb3NlZDogdHJ1ZSwKICAgICAgICBuZXh0KHZhbHVlKSB7IH0sCiAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgIGNvbXBsZXRlKCkgeyB9CiAgICB9OwoKICAgIGNvbnN0IGlzQXJyYXkgPSAoKCkgPT4gQXJyYXkuaXNBcnJheSB8fCAoKHgpID0+IHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSAnbnVtYmVyJykpKCk7CgogICAgZnVuY3Rpb24gaXNPYmplY3QoeCkgewogICAgICAgIHJldHVybiB4ICE9PSBudWxsICYmIHR5cGVvZiB4ID09PSAnb2JqZWN0JzsKICAgIH0KCiAgICBjb25zdCBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbCA9ICgoKSA9PiB7CiAgICAgICAgZnVuY3Rpb24gVW5zdWJzY3JpcHRpb25FcnJvckltcGwoZXJyb3JzKSB7CiAgICAgICAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGVycm9ycyA/CiAgICAgICAgICAgICAgICBgJHtlcnJvcnMubGVuZ3RofSBlcnJvcnMgb2NjdXJyZWQgZHVyaW5nIHVuc3Vic2NyaXB0aW9uOgoke2Vycm9ycy5tYXAoKGVyciwgaSkgPT4gYCR7aSArIDF9KSAke2Vyci50b1N0cmluZygpfWApLmpvaW4oJ1xuICAnKX1gIDogJyc7CiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdVbnN1YnNjcmlwdGlvbkVycm9yJzsKICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0KICAgICAgICBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgcmV0dXJuIFVuc3Vic2NyaXB0aW9uRXJyb3JJbXBsOwogICAgfSkoKTsKICAgIGNvbnN0IFVuc3Vic2NyaXB0aW9uRXJyb3IgPSBVbnN1YnNjcmlwdGlvbkVycm9ySW1wbDsKCiAgICBjbGFzcyBTdWJzY3JpcHRpb24gewogICAgICAgIGNvbnN0cnVjdG9yKHVuc3Vic2NyaWJlKSB7CiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudE9yUGFyZW50cyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMgPSBudWxsOwogICAgICAgICAgICBpZiAodW5zdWJzY3JpYmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gdW5zdWJzY3JpYmU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgICAgIGxldCBlcnJvcnM7CiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCB7IF9wYXJlbnRPclBhcmVudHMsIF91bnN1YnNjcmliZSwgX3N1YnNjcmlwdGlvbnMgfSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fcGFyZW50T3JQYXJlbnRzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9ucyA9IG51bGw7CiAgICAgICAgICAgIGlmIChfcGFyZW50T3JQYXJlbnRzIGluc3RhbmNlb2YgU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICBfcGFyZW50T3JQYXJlbnRzLnJlbW92ZSh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChfcGFyZW50T3JQYXJlbnRzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgX3BhcmVudE9yUGFyZW50cy5sZW5ndGg7ICsraW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBfcGFyZW50T3JQYXJlbnRzW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlKHRoaXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKF91bnN1YnNjcmliZSkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgX3Vuc3Vic2NyaWJlLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIGVycm9ycyA9IGUgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yID8gZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGUuZXJyb3JzKSA6IFtlXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNBcnJheShfc3Vic2NyaXB0aW9ucykpIHsKICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IC0xOwogICAgICAgICAgICAgICAgbGV0IGxlbiA9IF9zdWJzY3JpcHRpb25zLmxlbmd0aDsKICAgICAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3ViID0gX3N1YnNjcmlwdGlvbnNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGlmIChpc09iamVjdChzdWIpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzID0gZXJyb3JzLmNvbmNhdChmbGF0dGVuVW5zdWJzY3JpcHRpb25FcnJvcnMoZS5lcnJvcnMpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlcnJvcnMpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1YnNjcmlwdGlvbkVycm9yKGVycm9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgYWRkKHRlYXJkb3duKSB7CiAgICAgICAgICAgIGxldCBzdWJzY3JpcHRpb24gPSB0ZWFyZG93bjsKICAgICAgICAgICAgaWYgKCF0ZWFyZG93bikgewogICAgICAgICAgICAgICAgcmV0dXJuIFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKHR5cGVvZiB0ZWFyZG93bikgewogICAgICAgICAgICAgICAgY2FzZSAnZnVuY3Rpb24nOgogICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24odGVhcmRvd24pOwogICAgICAgICAgICAgICAgY2FzZSAnb2JqZWN0JzoKICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uID09PSB0aGlzIHx8IHN1YnNjcmlwdGlvbi5jbG9zZWQgfHwgdHlwZW9mIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIShzdWJzY3JpcHRpb24gaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRtcCA9IHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uX3N1YnNjcmlwdGlvbnMgPSBbdG1wXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlY29nbml6ZWQgdGVhcmRvd24gJyArIHRlYXJkb3duICsgJyBhZGRlZCB0byBTdWJzY3JpcHRpb24uJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHsgX3BhcmVudE9yUGFyZW50cyB9ID0gc3Vic2NyaXB0aW9uOwogICAgICAgICAgICBpZiAoX3BhcmVudE9yUGFyZW50cyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLl9wYXJlbnRPclBhcmVudHMgPSB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKF9wYXJlbnRPclBhcmVudHMgaW5zdGFuY2VvZiBTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIGlmIChfcGFyZW50T3JQYXJlbnRzID09PSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5fcGFyZW50T3JQYXJlbnRzID0gW19wYXJlbnRPclBhcmVudHMsIHRoaXNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKF9wYXJlbnRPclBhcmVudHMuaW5kZXhPZih0aGlzKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIF9wYXJlbnRPclBhcmVudHMucHVzaCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9ucyA9IHRoaXMuX3N1YnNjcmlwdGlvbnM7CiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb25zID0gW3N1YnNjcmlwdGlvbl07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnB1c2goc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICAgIH0KICAgICAgICByZW1vdmUoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbnMgPSB0aGlzLl9zdWJzY3JpcHRpb25zOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9ucykgewogICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uSW5kZXggPSBzdWJzY3JpcHRpb25zLmluZGV4T2Yoc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25JbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb25zLnNwbGljZShzdWJzY3JpcHRpb25JbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBTdWJzY3JpcHRpb24uRU1QVFkgPSAoZnVuY3Rpb24gKGVtcHR5KSB7CiAgICAgICAgZW1wdHkuY2xvc2VkID0gdHJ1ZTsKICAgICAgICByZXR1cm4gZW1wdHk7CiAgICB9KG5ldyBTdWJzY3JpcHRpb24oKSkpOwogICAgZnVuY3Rpb24gZmxhdHRlblVuc3Vic2NyaXB0aW9uRXJyb3JzKGVycm9ycykgewogICAgICAgIHJldHVybiBlcnJvcnMucmVkdWNlKChlcnJzLCBlcnIpID0+IGVycnMuY29uY2F0KChlcnIgaW5zdGFuY2VvZiBVbnN1YnNjcmlwdGlvbkVycm9yKSA/IGVyci5lcnJvcnMgOiBlcnIpLCBbXSk7CiAgICB9CgogICAgY29uc3QgcnhTdWJzY3JpYmVyID0gKCgpID0+IHR5cGVvZiBTeW1ib2wgPT09ICdmdW5jdGlvbicKICAgICAgICA/IFN5bWJvbCgncnhTdWJzY3JpYmVyJykKICAgICAgICA6ICdAQHJ4U3Vic2NyaWJlcl8nICsgTWF0aC5yYW5kb20oKSkoKTsKCiAgICBjbGFzcyBTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbk9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuc3luY0Vycm9yVmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93biA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZW1wdHk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFkZXN0aW5hdGlvbk9yTmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uID0gZW1wdHk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRlc3RpbmF0aW9uT3JOZXh0ID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdGluYXRpb25Pck5leHQgaW5zdGFuY2VvZiBTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN5bmNFcnJvclRocm93YWJsZSA9IGRlc3RpbmF0aW9uT3JOZXh0LnN5bmNFcnJvclRocm93YWJsZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbk9yTmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uT3JOZXh0LmFkZCh0aGlzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3luY0Vycm9yVGhyb3dhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIodGhpcywgZGVzdGluYXRpb25Pck5leHQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zeW5jRXJyb3JUaHJvd2FibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBuZXcgU2FmZVN1YnNjcmliZXIodGhpcywgZGVzdGluYXRpb25Pck5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgW3J4U3Vic2NyaWJlcl0oKSB7IHJldHVybiB0aGlzOyB9CiAgICAgICAgc3RhdGljIGNyZWF0ZShuZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJlciA9IG5ldyBTdWJzY3JpYmVyKG5leHQsIGVycm9yLCBjb21wbGV0ZSk7CiAgICAgICAgICAgIHN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlID0gZmFsc2U7CiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyOwogICAgICAgIH0KICAgICAgICBuZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX25leHQodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVycm9yKGVycikgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbXBsZXRlKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICAgIHN1cGVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIF9lcnJvcihlcnIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIF91bnN1YnNjcmliZUFuZFJlY3ljbGUoKSB7CiAgICAgICAgICAgIGNvbnN0IHsgX3BhcmVudE9yUGFyZW50cyB9ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fcGFyZW50T3JQYXJlbnRzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLmNsb3NlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRPclBhcmVudHMgPSBfcGFyZW50T3JQYXJlbnRzOwogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTYWZlU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKF9wYXJlbnRTdWJzY3JpYmVyLCBvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudFN1YnNjcmliZXIgPSBfcGFyZW50U3Vic2NyaWJlcjsKICAgICAgICAgICAgbGV0IG5leHQ7CiAgICAgICAgICAgIGxldCBjb250ZXh0ID0gdGhpczsKICAgICAgICAgICAgaWYgKGlzRnVuY3Rpb24ob2JzZXJ2ZXJPck5leHQpKSB7CiAgICAgICAgICAgICAgICBuZXh0ID0gb2JzZXJ2ZXJPck5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAob2JzZXJ2ZXJPck5leHQpIHsKICAgICAgICAgICAgICAgIG5leHQgPSBvYnNlcnZlck9yTmV4dC5uZXh0OwogICAgICAgICAgICAgICAgZXJyb3IgPSBvYnNlcnZlck9yTmV4dC5lcnJvcjsKICAgICAgICAgICAgICAgIGNvbXBsZXRlID0gb2JzZXJ2ZXJPck5leHQuY29tcGxldGU7CiAgICAgICAgICAgICAgICBpZiAob2JzZXJ2ZXJPck5leHQgIT09IGVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dCA9IE9iamVjdC5jcmVhdGUob2JzZXJ2ZXJPck5leHQpOwogICAgICAgICAgICAgICAgICAgIGlmIChpc0Z1bmN0aW9uKGNvbnRleHQudW5zdWJzY3JpYmUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKGNvbnRleHQudW5zdWJzY3JpYmUuYmluZChjb250ZXh0KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbnRleHQudW5zdWJzY3JpYmUgPSB0aGlzLnVuc3Vic2NyaWJlLmJpbmQodGhpcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgICAgIHRoaXMuX25leHQgPSBuZXh0OwogICAgICAgICAgICB0aGlzLl9lcnJvciA9IGVycm9yOwogICAgICAgICAgICB0aGlzLl9jb21wbGV0ZSA9IGNvbXBsZXRlOwogICAgICAgIH0KICAgICAgICBuZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQgJiYgdGhpcy5fbmV4dCkgewogICAgICAgICAgICAgICAgY29uc3QgeyBfcGFyZW50U3Vic2NyaWJlciB9ID0gdGhpczsKICAgICAgICAgICAgICAgIGlmICghY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgfHwgIV9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93YWJsZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclVuc3ViKHRoaXMuX25leHQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX190cnlPclNldEVycm9yKF9wYXJlbnRTdWJzY3JpYmVyLCB0aGlzLl9uZXh0LCB2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgX3BhcmVudFN1YnNjcmliZXIgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICBjb25zdCB7IHVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgfSA9IGNvbmZpZzsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lcnJvcikgewogICAgICAgICAgICAgICAgICAgIGlmICghdXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZyB8fCAhX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX190cnlPclVuc3ViKHRoaXMuX2Vycm9yLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgdGhpcy5fZXJyb3IsIGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3dhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICh1c2VEZXByZWNhdGVkU3luY2hyb25vdXNFcnJvckhhbmRsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGVycjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaG9zdFJlcG9ydEVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgICAgICAgICBfcGFyZW50U3Vic2NyaWJlci5zeW5jRXJyb3JWYWx1ZSA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgX3BhcmVudFN1YnNjcmliZXIuc3luY0Vycm9yVGhyb3duID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RSZXBvcnRFcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29tcGxldGUoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgX3BhcmVudFN1YnNjcmliZXIgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29tcGxldGUpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB3cmFwcGVkQ29tcGxldGUgPSAoKSA9PiB0aGlzLl9jb21wbGV0ZS5jYWxsKHRoaXMuX2NvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIGlmICghY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgfHwgIV9wYXJlbnRTdWJzY3JpYmVyLnN5bmNFcnJvclRocm93YWJsZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JVbnN1Yih3cmFwcGVkQ29tcGxldGUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9fdHJ5T3JTZXRFcnJvcihfcGFyZW50U3Vic2NyaWJlciwgd3JhcHBlZENvbXBsZXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfX3RyeU9yVW5zdWIoZm4sIHZhbHVlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBmbi5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBob3N0UmVwb3J0RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfX3RyeU9yU2V0RXJyb3IocGFyZW50LCBmbiwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKCFjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiYWQgY2FsbCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBmbi5jYWxsKHRoaXMuX2NvbnRleHQsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnQuc3luY0Vycm9yVmFsdWUgPSBlcnI7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnN5bmNFcnJvclRocm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBob3N0UmVwb3J0RXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIF91bnN1YnNjcmliZSgpIHsKICAgICAgICAgICAgY29uc3QgeyBfcGFyZW50U3Vic2NyaWJlciB9ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5fY29udGV4dCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudFN1YnNjcmliZXIgPSBudWxsOwogICAgICAgICAgICBfcGFyZW50U3Vic2NyaWJlci51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjYW5SZXBvcnRFcnJvcihvYnNlcnZlcikgewogICAgICAgIHdoaWxlIChvYnNlcnZlcikgewogICAgICAgICAgICBjb25zdCB7IGNsb3NlZCwgZGVzdGluYXRpb24sIGlzU3RvcHBlZCB9ID0gb2JzZXJ2ZXI7CiAgICAgICAgICAgIGlmIChjbG9zZWQgfHwgaXNTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24gaW5zdGFuY2VvZiBTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgICAgICBvYnNlcnZlciA9IGRlc3RpbmF0aW9uOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgb2JzZXJ2ZXIgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0cnVlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRvU3Vic2NyaWJlcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgaWYgKG5leHRPck9ic2VydmVyKSB7CiAgICAgICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciBpbnN0YW5jZW9mIFN1YnNjcmliZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBuZXh0T3JPYnNlcnZlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV4dE9yT2JzZXJ2ZXJbcnhTdWJzY3JpYmVyXSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRPck9ic2VydmVyW3J4U3Vic2NyaWJlcl0oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoIW5leHRPck9ic2VydmVyICYmICFlcnJvciAmJiAhY29tcGxldGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpYmVyKGVtcHR5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBTdWJzY3JpYmVyKG5leHRPck9ic2VydmVyLCBlcnJvciwgY29tcGxldGUpOwogICAgfQoKICAgIGNvbnN0IG9ic2VydmFibGUgPSAoKCkgPT4gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiBTeW1ib2wub2JzZXJ2YWJsZSB8fCAnQEBvYnNlcnZhYmxlJykoKTsKCiAgICBmdW5jdGlvbiBpZGVudGl0eSh4KSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgZnVuY3Rpb24gcGlwZUZyb21BcnJheShmbnMpIHsKICAgICAgICBpZiAoZm5zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gaWRlbnRpdHk7CiAgICAgICAgfQogICAgICAgIGlmIChmbnMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIHJldHVybiBmbnNbMF07CiAgICAgICAgfQogICAgICAgIHJldHVybiBmdW5jdGlvbiBwaXBlZChpbnB1dCkgewogICAgICAgICAgICByZXR1cm4gZm5zLnJlZHVjZSgocHJldiwgZm4pID0+IGZuKHByZXYpLCBpbnB1dCk7CiAgICAgICAgfTsKICAgIH0KCiAgICAvKiEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4NCg0KICAgIFBlcm1pc3Npb24gdG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMgc29mdHdhcmUgZm9yIGFueQ0KICAgIHB1cnBvc2Ugd2l0aCBvciB3aXRob3V0IGZlZSBpcyBoZXJlYnkgZ3JhbnRlZC4NCg0KICAgIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiIEFORCBUSEUgQVVUSE9SIERJU0NMQUlNUyBBTEwgV0FSUkFOVElFUyBXSVRIDQogICAgUkVHQVJEIFRPIFRISVMgU09GVFdBUkUgSU5DTFVESU5HIEFMTCBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZDQogICAgQU5EIEZJVE5FU1MuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1IgQkUgTElBQkxFIEZPUiBBTlkgU1BFQ0lBTCwgRElSRUNULA0KICAgIElORElSRUNULCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgT1IgQU5ZIERBTUFHRVMgV0hBVFNPRVZFUiBSRVNVTFRJTkcgRlJPTQ0KICAgIExPU1MgT0YgVVNFLCBEQVRBIE9SIFBST0ZJVFMsIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBORUdMSUdFTkNFIE9SDQogICAgT1RIRVIgVE9SVElPVVMgQUNUSU9OLCBBUklTSU5HIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFVTRSBPUg0KICAgIFBFUkZPUk1BTkNFIE9GIFRISVMgU09GVFdBUkUuDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8NCg0KICAgIGZ1bmN0aW9uIF9fcmVzdChzLCBlKSB7DQogICAgICAgIHZhciB0ID0ge307DQogICAgICAgIGZvciAodmFyIHAgaW4gcykgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChzLCBwKSAmJiBlLmluZGV4T2YocCkgPCAwKQ0KICAgICAgICAgICAgdFtwXSA9IHNbcF07DQogICAgICAgIGlmIChzICE9IG51bGwgJiYgdHlwZW9mIE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPT09ICJmdW5jdGlvbiIpDQogICAgICAgICAgICBmb3IgKHZhciBpID0gMCwgcCA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eVN5bWJvbHMocyk7IGkgPCBwLmxlbmd0aDsgaSsrKSB7DQogICAgICAgICAgICAgICAgaWYgKGUuaW5kZXhPZihwW2ldKSA8IDAgJiYgT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZS5jYWxsKHMsIHBbaV0pKQ0KICAgICAgICAgICAgICAgICAgICB0W3BbaV1dID0gc1twW2ldXTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgcmV0dXJuIHQ7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYykgew0KICAgICAgICB2YXIgYyA9IGFyZ3VtZW50cy5sZW5ndGgsIHIgPSBjIDwgMyA/IHRhcmdldCA6IGRlc2MgPT09IG51bGwgPyBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkgOiBkZXNjLCBkOw0KICAgICAgICBpZiAodHlwZW9mIFJlZmxlY3QgPT09ICJvYmplY3QiICYmIHR5cGVvZiBSZWZsZWN0LmRlY29yYXRlID09PSAiZnVuY3Rpb24iKSByID0gUmVmbGVjdC5kZWNvcmF0ZShkZWNvcmF0b3JzLCB0YXJnZXQsIGtleSwgZGVzYyk7DQogICAgICAgIGVsc2UgZm9yICh2YXIgaSA9IGRlY29yYXRvcnMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIGlmIChkID0gZGVjb3JhdG9yc1tpXSkgciA9IChjIDwgMyA/IGQocikgOiBjID4gMyA/IGQodGFyZ2V0LCBrZXksIHIpIDogZCh0YXJnZXQsIGtleSkpIHx8IHI7DQogICAgICAgIHJldHVybiBjID4gMyAmJiByICYmIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgciksIHI7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19hd2FpdGVyKHRoaXNBcmcsIF9hcmd1bWVudHMsIFAsIGdlbmVyYXRvcikgew0KICAgICAgICBmdW5jdGlvbiBhZG9wdCh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBQID8gdmFsdWUgOiBuZXcgUChmdW5jdGlvbiAocmVzb2x2ZSkgeyByZXNvbHZlKHZhbHVlKTsgfSk7IH0NCiAgICAgICAgcmV0dXJuIG5ldyAoUCB8fCAoUCA9IFByb21pc2UpKShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7DQogICAgICAgICAgICBmdW5jdGlvbiBmdWxmaWxsZWQodmFsdWUpIHsgdHJ5IHsgc3RlcChnZW5lcmF0b3IubmV4dCh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiByZWplY3RlZCh2YWx1ZSkgeyB0cnkgeyBzdGVwKGdlbmVyYXRvclsidGhyb3ciXSh2YWx1ZSkpOyB9IGNhdGNoIChlKSB7IHJlamVjdChlKTsgfSB9DQogICAgICAgICAgICBmdW5jdGlvbiBzdGVwKHJlc3VsdCkgeyByZXN1bHQuZG9uZSA/IHJlc29sdmUocmVzdWx0LnZhbHVlKSA6IGFkb3B0KHJlc3VsdC52YWx1ZSkudGhlbihmdWxmaWxsZWQsIHJlamVjdGVkKTsgfQ0KICAgICAgICAgICAgc3RlcCgoZ2VuZXJhdG9yID0gZ2VuZXJhdG9yLmFwcGx5KHRoaXNBcmcsIF9hcmd1bWVudHMgfHwgW10pKS5uZXh0KCkpOw0KICAgICAgICB9KTsNCiAgICB9DQoNCiAgICBmdW5jdGlvbiBfX3ZhbHVlcyhvKSB7DQogICAgICAgIHZhciBzID0gdHlwZW9mIFN5bWJvbCA9PT0gImZ1bmN0aW9uIiAmJiBTeW1ib2wuaXRlcmF0b3IsIG0gPSBzICYmIG9bc10sIGkgPSAwOw0KICAgICAgICBpZiAobSkgcmV0dXJuIG0uY2FsbChvKTsNCiAgICAgICAgaWYgKG8gJiYgdHlwZW9mIG8ubGVuZ3RoID09PSAibnVtYmVyIikgcmV0dXJuIHsNCiAgICAgICAgICAgIG5leHQ6IGZ1bmN0aW9uICgpIHsNCiAgICAgICAgICAgICAgICBpZiAobyAmJiBpID49IG8ubGVuZ3RoKSBvID0gdm9pZCAwOw0KICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBvICYmIG9baSsrXSwgZG9uZTogIW8gfTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfTsNCiAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihzID8gIk9iamVjdCBpcyBub3QgaXRlcmFibGUuIiA6ICJTeW1ib2wuaXRlcmF0b3IgaXMgbm90IGRlZmluZWQuIik7DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19hd2FpdCh2KSB7DQogICAgICAgIHJldHVybiB0aGlzIGluc3RhbmNlb2YgX19hd2FpdCA/ICh0aGlzLnYgPSB2LCB0aGlzKSA6IG5ldyBfX2F3YWl0KHYpOw0KICAgIH0NCg0KICAgIGZ1bmN0aW9uIF9fYXN5bmNHZW5lcmF0b3IodGhpc0FyZywgX2FyZ3VtZW50cywgZ2VuZXJhdG9yKSB7DQogICAgICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOw0KICAgICAgICB2YXIgZyA9IGdlbmVyYXRvci5hcHBseSh0aGlzQXJnLCBfYXJndW1lbnRzIHx8IFtdKSwgaSwgcSA9IFtdOw0KICAgICAgICByZXR1cm4gaSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGk7DQogICAgICAgIGZ1bmN0aW9uIHZlcmIobikgeyBpZiAoZ1tuXSkgaVtuXSA9IGZ1bmN0aW9uICh2KSB7IHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbiAoYSwgYikgeyBxLnB1c2goW24sIHYsIGEsIGJdKSA+IDEgfHwgcmVzdW1lKG4sIHYpOyB9KTsgfTsgfQ0KICAgICAgICBmdW5jdGlvbiByZXN1bWUobiwgdikgeyB0cnkgeyBzdGVwKGdbbl0odikpOyB9IGNhdGNoIChlKSB7IHNldHRsZShxWzBdWzNdLCBlKTsgfSB9DQogICAgICAgIGZ1bmN0aW9uIHN0ZXAocikgeyByLnZhbHVlIGluc3RhbmNlb2YgX19hd2FpdCA/IFByb21pc2UucmVzb2x2ZShyLnZhbHVlLnYpLnRoZW4oZnVsZmlsbCwgcmVqZWN0KSA6IHNldHRsZShxWzBdWzJdLCByKTsgfQ0KICAgICAgICBmdW5jdGlvbiBmdWxmaWxsKHZhbHVlKSB7IHJlc3VtZSgibmV4dCIsIHZhbHVlKTsgfQ0KICAgICAgICBmdW5jdGlvbiByZWplY3QodmFsdWUpIHsgcmVzdW1lKCJ0aHJvdyIsIHZhbHVlKTsgfQ0KICAgICAgICBmdW5jdGlvbiBzZXR0bGUoZiwgdikgeyBpZiAoZih2KSwgcS5zaGlmdCgpLCBxLmxlbmd0aCkgcmVzdW1lKHFbMF1bMF0sIHFbMF1bMV0pOyB9DQogICAgfQ0KDQogICAgZnVuY3Rpb24gX19hc3luY1ZhbHVlcyhvKSB7DQogICAgICAgIGlmICghU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHRocm93IG5ldyBUeXBlRXJyb3IoIlN5bWJvbC5hc3luY0l0ZXJhdG9yIGlzIG5vdCBkZWZpbmVkLiIpOw0KICAgICAgICB2YXIgbSA9IG9bU3ltYm9sLmFzeW5jSXRlcmF0b3JdLCBpOw0KICAgICAgICByZXR1cm4gbSA/IG0uY2FsbChvKSA6IChvID0gdHlwZW9mIF9fdmFsdWVzID09PSAiZnVuY3Rpb24iID8gX192YWx1ZXMobykgOiBvW1N5bWJvbC5pdGVyYXRvcl0oKSwgaSA9IHt9LCB2ZXJiKCJuZXh0IiksIHZlcmIoInRocm93IiksIHZlcmIoInJldHVybiIpLCBpW1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0sIGkpOw0KICAgICAgICBmdW5jdGlvbiB2ZXJiKG4pIHsgaVtuXSA9IG9bbl0gJiYgZnVuY3Rpb24gKHYpIHsgcmV0dXJuIG5ldyBQcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHsgdiA9IG9bbl0odiksIHNldHRsZShyZXNvbHZlLCByZWplY3QsIHYuZG9uZSwgdi52YWx1ZSk7IH0pOyB9OyB9DQogICAgICAgIGZ1bmN0aW9uIHNldHRsZShyZXNvbHZlLCByZWplY3QsIGQsIHYpIHsgUHJvbWlzZS5yZXNvbHZlKHYpLnRoZW4oZnVuY3Rpb24odikgeyByZXNvbHZlKHsgdmFsdWU6IHYsIGRvbmU6IGQgfSk7IH0sIHJlamVjdCk7IH0NCiAgICB9CgogICAgY2xhc3MgRGVmZXJyZWQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLnJlc29sdmUgPSBudWxsOwogICAgICAgICAgICB0aGlzLnJlamVjdCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucHJvbWlzZSA9IG5ldyBQcm9taXNlKChhLCBiKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmUgPSBhOwogICAgICAgICAgICAgICAgdGhpcy5yZWplY3QgPSBiOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYXN5bmNJdGVyYXRvckZyb20oc291cmNlKSB7CiAgICAgICAgcmV0dXJuIGNvcm91dGluZShzb3VyY2UpOwogICAgfQogICAgZnVuY3Rpb24gY29yb3V0aW5lKHNvdXJjZSkgewogICAgICAgIHJldHVybiBfX2FzeW5jR2VuZXJhdG9yKHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24qIGNvcm91dGluZV8xKCkgewogICAgICAgICAgICBjb25zdCBkZWZlcnJlZHMgPSBbXTsKICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gW107CiAgICAgICAgICAgIGxldCBoYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICBsZXQgZXJyb3IgPSBudWxsOwogICAgICAgICAgICBsZXQgY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnN0IHN1YnMgPSBzb3VyY2Uuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6IHZhbHVlID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVmZXJyZWRzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmZXJyZWRzLnNoaWZ0KCkucmVzb2x2ZSh7IHZhbHVlLCBkb25lOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgZXJyb3I6IGVyciA9PiB7CiAgICAgICAgICAgICAgICAgICAgaGFzRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGVycm9yID0gZXJyOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZWZlcnJlZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZHMuc2hpZnQoKS5yZWplY3QoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgY29tcGxldGU6ICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHdoaWxlIChkZWZlcnJlZHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBkZWZlcnJlZHMuc2hpZnQoKS5yZXNvbHZlKHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQodmFsdWVzLnNoaWZ0KCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQodm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGFzRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkID0gbmV3IERlZmVycmVkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZmVycmVkcy5wdXNoKGQpOwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB5aWVsZCBfX2F3YWl0KGQucHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHlpZWxkIF9fYXdhaXQodm9pZCAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlpZWxkIHlpZWxkIF9fYXdhaXQocmVzdWx0LnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICBzdWJzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICBjbGFzcyBPYnNlcnZhYmxlIHsKICAgICAgICBjb25zdHJ1Y3RvcihzdWJzY3JpYmUpIHsKICAgICAgICAgICAgdGhpcy5faXNTY2FsYXIgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHN1YnNjcmliZSkgewogICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlID0gc3Vic2NyaWJlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGxpZnQob3BlcmF0b3IpIHsKICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgIG9ic2VydmFibGUuc291cmNlID0gdGhpczsKICAgICAgICAgICAgb2JzZXJ2YWJsZS5vcGVyYXRvciA9IG9wZXJhdG9yOwogICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTsKICAgICAgICB9CiAgICAgICAgc3Vic2NyaWJlKG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICAgICAgY29uc3QgeyBvcGVyYXRvciB9ID0gdGhpczsKICAgICAgICAgICAgY29uc3Qgc2luayA9IHRvU3Vic2NyaWJlcihvYnNlcnZlck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgICAgICAgaWYgKG9wZXJhdG9yKSB7CiAgICAgICAgICAgICAgICBzaW5rLmFkZChvcGVyYXRvci5jYWxsKHNpbmssIHRoaXMuc291cmNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzaW5rLmFkZCh0aGlzLnNvdXJjZSB8fCAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcgJiYgIXNpbmsuc3luY0Vycm9yVGhyb3dhYmxlKSA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKHNpbmspIDoKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cnlTdWJzY3JpYmUoc2luaykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb25maWcudXNlRGVwcmVjYXRlZFN5bmNocm9ub3VzRXJyb3JIYW5kbGluZykgewogICAgICAgICAgICAgICAgaWYgKHNpbmsuc3luY0Vycm9yVGhyb3dhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JUaHJvd2FibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2luay5zeW5jRXJyb3JUaHJvd24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgc2luay5zeW5jRXJyb3JWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNpbms7CiAgICAgICAgfQogICAgICAgIF90cnlTdWJzY3JpYmUoc2luaykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1YnNjcmliZShzaW5rKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBpZiAoY29uZmlnLnVzZURlcHJlY2F0ZWRTeW5jaHJvbm91c0Vycm9ySGFuZGxpbmcpIHsKICAgICAgICAgICAgICAgICAgICBzaW5rLnN5bmNFcnJvclRocm93biA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgc2luay5zeW5jRXJyb3JWYWx1ZSA9IGVycjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjYW5SZXBvcnRFcnJvcihzaW5rKSkgewogICAgICAgICAgICAgICAgICAgIHNpbmsuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZvckVhY2gobmV4dCwgcHJvbWlzZUN0b3IpIHsKICAgICAgICAgICAgcHJvbWlzZUN0b3IgPSBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3Rvcik7CiAgICAgICAgICAgIHJldHVybiBuZXcgcHJvbWlzZUN0b3IoKHJlc29sdmUsIHJlamVjdCkgPT4gewogICAgICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbjsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IHRoaXMuc3Vic2NyaWJlKCh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdChlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0sIHJlamVjdCwgcmVzb2x2ZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICAgICAgY29uc3QgeyBzb3VyY2UgfSA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UgJiYgc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB9CiAgICAgICAgW29ic2VydmFibGVdKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgcGlwZSguLi5vcGVyYXRpb25zKSB7CiAgICAgICAgICAgIGlmIChvcGVyYXRpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBpcGVGcm9tQXJyYXkob3BlcmF0aW9ucykodGhpcyk7CiAgICAgICAgfQogICAgICAgIHRvUHJvbWlzZShwcm9taXNlQ3RvcikgewogICAgICAgICAgICBwcm9taXNlQ3RvciA9IGdldFByb21pc2VDdG9yKHByb21pc2VDdG9yKTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBwcm9taXNlQ3RvcigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICBsZXQgdmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLnN1YnNjcmliZSgoeCkgPT4gdmFsdWUgPSB4LCAoZXJyKSA9PiByZWplY3QoZXJyKSwgKCkgPT4gcmVzb2x2ZSh2YWx1ZSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBPYnNlcnZhYmxlLmNyZWF0ZSA9IChzdWJzY3JpYmUpID0+IHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlKTsKICAgIH07CiAgICBmdW5jdGlvbiBnZXRQcm9taXNlQ3Rvcihwcm9taXNlQ3RvcikgewogICAgICAgIGlmICghcHJvbWlzZUN0b3IpIHsKICAgICAgICAgICAgcHJvbWlzZUN0b3IgPSAgUHJvbWlzZTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwcm9taXNlQ3RvcikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ25vIFByb21pc2UgaW1wbCBmb3VuZCcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvbWlzZUN0b3I7CiAgICB9CiAgICAoZnVuY3Rpb24gKCkgewogICAgICAgIGlmIChTeW1ib2wgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IpIHsKICAgICAgICAgICAgT2JzZXJ2YWJsZS5wcm90b3R5cGVbU3ltYm9sLmFzeW5jSXRlcmF0b3JdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGFzeW5jSXRlcmF0b3JGcm9tKHRoaXMpOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0pKCk7CgogICAgY29uc3QgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3JJbXBsID0gKCgpID0+IHsKICAgICAgICBmdW5jdGlvbiBPYmplY3RVbnN1YnNjcmliZWRFcnJvckltcGwoKSB7CiAgICAgICAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICdvYmplY3QgdW5zdWJzY3JpYmVkJzsKICAgICAgICAgICAgdGhpcy5uYW1lID0gJ09iamVjdFVuc3Vic2NyaWJlZEVycm9yJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgcmV0dXJuIE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbDsKICAgIH0pKCk7CiAgICBjb25zdCBPYmplY3RVbnN1YnNjcmliZWRFcnJvciA9IE9iamVjdFVuc3Vic2NyaWJlZEVycm9ySW1wbDsKCiAgICBjbGFzcyBTdWJqZWN0U3Vic2NyaXB0aW9uIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihzdWJqZWN0LCBzdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuc3ViamVjdCA9IHN1YmplY3Q7CiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlciA9IHN1YnNjcmliZXI7CiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNsb3NlZCA9IHRydWU7CiAgICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLnN1YmplY3Q7CiAgICAgICAgICAgIGNvbnN0IG9ic2VydmVycyA9IHN1YmplY3Qub2JzZXJ2ZXJzOwogICAgICAgICAgICB0aGlzLnN1YmplY3QgPSBudWxsOwogICAgICAgICAgICBpZiAoIW9ic2VydmVycyB8fCBvYnNlcnZlcnMubGVuZ3RoID09PSAwIHx8IHN1YmplY3QuaXNTdG9wcGVkIHx8IHN1YmplY3QuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgc3Vic2NyaWJlckluZGV4ID0gb2JzZXJ2ZXJzLmluZGV4T2YodGhpcy5zdWJzY3JpYmVyKTsKICAgICAgICAgICAgaWYgKHN1YnNjcmliZXJJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIG9ic2VydmVycy5zcGxpY2Uoc3Vic2NyaWJlckluZGV4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBTdWJqZWN0U3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFN1YmplY3QgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5pc1N0b3BwZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnRocm93bkVycm9yID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgW3J4U3Vic2NyaWJlcl0oKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmliZXIodGhpcyk7CiAgICAgICAgfQogICAgICAgIGxpZnQob3BlcmF0b3IpIHsKICAgICAgICAgICAgY29uc3Qgc3ViamVjdCA9IG5ldyBBbm9ueW1vdXNTdWJqZWN0KHRoaXMsIHRoaXMpOwogICAgICAgICAgICBzdWJqZWN0Lm9wZXJhdG9yID0gb3BlcmF0b3I7CiAgICAgICAgICAgIHJldHVybiBzdWJqZWN0OwogICAgICAgIH0KICAgICAgICBuZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICBjb25zdCBsZW4gPSBvYnNlcnZlcnMubGVuZ3RoOwogICAgICAgICAgICAgICAgY29uc3QgY29weSA9IG9ic2VydmVycy5zbGljZSgpOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgICAgIGNvcHlbaV0ubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5oYXNFcnJvciA9IHRydWU7CiAgICAgICAgICAgIHRoaXMudGhyb3duRXJyb3IgPSBlcnI7CiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG9ic2VydmVycy5sZW5ndGg7CiAgICAgICAgICAgIGNvbnN0IGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgY29weVtpXS5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICAgIGNvbXBsZXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaXNTdG9wcGVkID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgeyBvYnNlcnZlcnMgfSA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG9ic2VydmVycy5sZW5ndGg7CiAgICAgICAgICAgIGNvbnN0IGNvcHkgPSBvYnNlcnZlcnMuc2xpY2UoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgY29weVtpXS5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub2JzZXJ2ZXJzLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgICAgICB0aGlzLmlzU3RvcHBlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuY2xvc2VkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMgPSBudWxsOwogICAgICAgIH0KICAgICAgICBfdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5fdHJ5U3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9zdWJzY3JpYmUoc3Vic2NyaWJlcikgewogICAgICAgICAgICBpZiAodGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBPYmplY3RVbnN1YnNjcmliZWRFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaGFzRXJyb3IpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IodGhpcy50aHJvd25FcnJvcik7CiAgICAgICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChzdWJzY3JpYmVyKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3ViamVjdFN1YnNjcmlwdGlvbih0aGlzLCBzdWJzY3JpYmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhc09ic2VydmFibGUoKSB7CiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICBvYnNlcnZhYmxlLnNvdXJjZSA9IHRoaXM7CiAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlOwogICAgICAgIH0KICAgIH0KICAgIFN1YmplY3QuY3JlYXRlID0gKGRlc3RpbmF0aW9uLCBzb3VyY2UpID0+IHsKICAgICAgICByZXR1cm4gbmV3IEFub255bW91c1N1YmplY3QoZGVzdGluYXRpb24sIHNvdXJjZSk7CiAgICB9OwogICAgY2xhc3MgQW5vbnltb3VzU3ViamVjdCBleHRlbmRzIFN1YmplY3QgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbiA9IGRlc3RpbmF0aW9uOwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICB9CiAgICAgICAgbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCB7IGRlc3RpbmF0aW9uIH0gPSB0aGlzOwogICAgICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24ubmV4dCkgewogICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIGNvbnN0IHsgZGVzdGluYXRpb24gfSA9IHRoaXM7CiAgICAgICAgICAgIGlmIChkZXN0aW5hdGlvbiAmJiBkZXN0aW5hdGlvbi5lcnJvcikgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbXBsZXRlKCkgewogICAgICAgICAgICBjb25zdCB7IGRlc3RpbmF0aW9uIH0gPSB0aGlzOwogICAgICAgICAgICBpZiAoZGVzdGluYXRpb24gJiYgZGVzdGluYXRpb24uY29tcGxldGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICAgICAgY29uc3QgeyBzb3VyY2UgfSA9IHRoaXM7CiAgICAgICAgICAgIGlmIChzb3VyY2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvdXJjZS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHJlZkNvdW50KCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiByZWZDb3VudE9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgUmVmQ291bnRPcGVyYXRvcihzb3VyY2UpKTsKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgUmVmQ291bnRPcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IoY29ubmVjdGFibGUpIHsKICAgICAgICAgICAgdGhpcy5jb25uZWN0YWJsZSA9IGNvbm5lY3RhYmxlOwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICBjb25zdCB7IGNvbm5lY3RhYmxlIH0gPSB0aGlzOwogICAgICAgICAgICBjb25uZWN0YWJsZS5fcmVmQ291bnQrKzsKICAgICAgICAgICAgY29uc3QgcmVmQ291bnRlciA9IG5ldyBSZWZDb3VudFN1YnNjcmliZXIoc3Vic2NyaWJlciwgY29ubmVjdGFibGUpOwogICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKHJlZkNvdW50ZXIpOwogICAgICAgICAgICBpZiAoIXJlZkNvdW50ZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICByZWZDb3VudGVyLmNvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5jb25uZWN0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBSZWZDb3VudFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgY29ubmVjdGFibGUpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gY29ubmVjdGFibGU7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIF91bnN1YnNjcmliZSgpIHsKICAgICAgICAgICAgY29uc3QgeyBjb25uZWN0YWJsZSB9ID0gdGhpczsKICAgICAgICAgICAgaWYgKCFjb25uZWN0YWJsZSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvbm5lY3RhYmxlID0gbnVsbDsKICAgICAgICAgICAgY29uc3QgcmVmQ291bnQgPSBjb25uZWN0YWJsZS5fcmVmQ291bnQ7CiAgICAgICAgICAgIGlmIChyZWZDb3VudCA8PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb24gPSBudWxsOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9yZWZDb3VudCA9IHJlZkNvdW50IC0gMTsKICAgICAgICAgICAgaWYgKHJlZkNvdW50ID4gMSkgewogICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB7IGNvbm5lY3Rpb24gfSA9IHRoaXM7CiAgICAgICAgICAgIGNvbnN0IHNoYXJlZENvbm5lY3Rpb24gPSBjb25uZWN0YWJsZS5fY29ubmVjdGlvbjsKICAgICAgICAgICAgdGhpcy5jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgaWYgKHNoYXJlZENvbm5lY3Rpb24gJiYgKCFjb25uZWN0aW9uIHx8IHNoYXJlZENvbm5lY3Rpb24gPT09IGNvbm5lY3Rpb24pKSB7CiAgICAgICAgICAgICAgICBzaGFyZWRDb25uZWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgQ29ubmVjdGFibGVPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICAgICAgY29uc3RydWN0b3Ioc291cmNlLCBzdWJqZWN0RmFjdG9yeSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgdGhpcy5zdWJqZWN0RmFjdG9yeSA9IHN1YmplY3RGYWN0b3J5OwogICAgICAgICAgICB0aGlzLl9yZWZDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuX2lzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX3N1YnNjcmliZShzdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN1YmplY3QoKS5zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgfQogICAgICAgIGdldFN1YmplY3QoKSB7CiAgICAgICAgICAgIGNvbnN0IHN1YmplY3QgPSB0aGlzLl9zdWJqZWN0OwogICAgICAgICAgICBpZiAoIXN1YmplY3QgfHwgc3ViamVjdC5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSB0aGlzLnN1YmplY3RGYWN0b3J5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N1YmplY3Q7CiAgICAgICAgfQogICAgICAgIGNvbm5lY3QoKSB7CiAgICAgICAgICAgIGxldCBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbjsKICAgICAgICAgICAgaWYgKCFjb25uZWN0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pc0NvbXBsZXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gdGhpcy5fY29ubmVjdGlvbiA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uYWRkKHRoaXMuc291cmNlCiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZShuZXcgQ29ubmVjdGFibGVTdWJzY3JpYmVyKHRoaXMuZ2V0U3ViamVjdCgpLCB0aGlzKSkpOwogICAgICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24uY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29ubmVjdGlvbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbjsKICAgICAgICB9CiAgICAgICAgcmVmQ291bnQoKSB7CiAgICAgICAgICAgIHJldHVybiByZWZDb3VudCgpKHRoaXMpOwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IgPSAoKCkgPT4gewogICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlUHJvdG8gPSBDb25uZWN0YWJsZU9ic2VydmFibGUucHJvdG90eXBlOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIG9wZXJhdG9yOiB7IHZhbHVlOiBudWxsIH0sCiAgICAgICAgICAgIF9yZWZDb3VudDogeyB2YWx1ZTogMCwgd3JpdGFibGU6IHRydWUgfSwKICAgICAgICAgICAgX3N1YmplY3Q6IHsgdmFsdWU6IG51bGwsIHdyaXRhYmxlOiB0cnVlIH0sCiAgICAgICAgICAgIF9jb25uZWN0aW9uOiB7IHZhbHVlOiBudWxsLCB3cml0YWJsZTogdHJ1ZSB9LAogICAgICAgICAgICBfc3Vic2NyaWJlOiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLl9zdWJzY3JpYmUgfSwKICAgICAgICAgICAgX2lzQ29tcGxldGU6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uX2lzQ29tcGxldGUsIHdyaXRhYmxlOiB0cnVlIH0sCiAgICAgICAgICAgIGdldFN1YmplY3Q6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8uZ2V0U3ViamVjdCB9LAogICAgICAgICAgICBjb25uZWN0OiB7IHZhbHVlOiBjb25uZWN0YWJsZVByb3RvLmNvbm5lY3QgfSwKICAgICAgICAgICAgcmVmQ291bnQ6IHsgdmFsdWU6IGNvbm5lY3RhYmxlUHJvdG8ucmVmQ291bnQgfQogICAgICAgIH07CiAgICB9KSgpOwogICAgY2xhc3MgQ29ubmVjdGFibGVTdWJzY3JpYmVyIGV4dGVuZHMgU3ViamVjdFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjb25uZWN0YWJsZSkgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBjb25uZWN0YWJsZTsKICAgICAgICB9CiAgICAgICAgX2Vycm9yKGVycikgewogICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpOwogICAgICAgICAgICBzdXBlci5fZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgICAgX2NvbXBsZXRlKCkgewogICAgICAgICAgICB0aGlzLmNvbm5lY3RhYmxlLl9pc0NvbXBsZXRlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgc3VwZXIuX2NvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIF91bnN1YnNjcmliZSgpIHsKICAgICAgICAgICAgY29uc3QgY29ubmVjdGFibGUgPSB0aGlzLmNvbm5lY3RhYmxlOwogICAgICAgICAgICBpZiAoY29ubmVjdGFibGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29ubmVjdGFibGUgPSBudWxsOwogICAgICAgICAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNvbm5lY3RhYmxlLl9jb25uZWN0aW9uOwogICAgICAgICAgICAgICAgY29ubmVjdGFibGUuX3JlZkNvdW50ID0gMDsKICAgICAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9zdWJqZWN0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGNvbm5lY3RhYmxlLl9jb25uZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmIChjb25uZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGdyb3VwQnkoa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBHcm91cEJ5T3BlcmF0b3Ioa2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSk7CiAgICB9CiAgICBjbGFzcyBHcm91cEJ5T3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKGtleVNlbGVjdG9yLCBlbGVtZW50U2VsZWN0b3IsIGR1cmF0aW9uU2VsZWN0b3IsIHN1YmplY3RTZWxlY3RvcikgewogICAgICAgICAgICB0aGlzLmtleVNlbGVjdG9yID0ga2V5U2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFNlbGVjdG9yID0gZWxlbWVudFNlbGVjdG9yOwogICAgICAgICAgICB0aGlzLmR1cmF0aW9uU2VsZWN0b3IgPSBkdXJhdGlvblNlbGVjdG9yOwogICAgICAgICAgICB0aGlzLnN1YmplY3RTZWxlY3RvciA9IHN1YmplY3RTZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEdyb3VwQnlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMua2V5U2VsZWN0b3IsIHRoaXMuZWxlbWVudFNlbGVjdG9yLCB0aGlzLmR1cmF0aW9uU2VsZWN0b3IsIHRoaXMuc3ViamVjdFNlbGVjdG9yKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgR3JvdXBCeVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwga2V5U2VsZWN0b3IsIGVsZW1lbnRTZWxlY3RvciwgZHVyYXRpb25TZWxlY3Rvciwgc3ViamVjdFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5rZXlTZWxlY3RvciA9IGtleVNlbGVjdG9yOwogICAgICAgICAgICB0aGlzLmVsZW1lbnRTZWxlY3RvciA9IGVsZW1lbnRTZWxlY3RvcjsKICAgICAgICAgICAgdGhpcy5kdXJhdGlvblNlbGVjdG9yID0gZHVyYXRpb25TZWxlY3RvcjsKICAgICAgICAgICAgdGhpcy5zdWJqZWN0U2VsZWN0b3IgPSBzdWJqZWN0U2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMuZ3JvdXBzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5hdHRlbXB0ZWRUb1Vuc3Vic2NyaWJlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuY291bnQgPSAwOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBsZXQga2V5OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAga2V5ID0gdGhpcy5rZXlTZWxlY3Rvcih2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgdGhpcy5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2dyb3VwKHZhbHVlLCBrZXkpOwogICAgICAgIH0KICAgICAgICBfZ3JvdXAodmFsdWUsIGtleSkgewogICAgICAgICAgICBsZXQgZ3JvdXBzID0gdGhpcy5ncm91cHM7CiAgICAgICAgICAgIGlmICghZ3JvdXBzKSB7CiAgICAgICAgICAgICAgICBncm91cHMgPSB0aGlzLmdyb3VwcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgZ3JvdXAgPSBncm91cHMuZ2V0KGtleSk7CiAgICAgICAgICAgIGxldCBlbGVtZW50OwogICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50U2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IHRoaXMuZWxlbWVudFNlbGVjdG9yKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlbGVtZW50ID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFncm91cCkgewogICAgICAgICAgICAgICAgZ3JvdXAgPSAodGhpcy5zdWJqZWN0U2VsZWN0b3IgPyB0aGlzLnN1YmplY3RTZWxlY3RvcigpIDogbmV3IFN1YmplY3QoKSk7CiAgICAgICAgICAgICAgICBncm91cHMuc2V0KGtleSwgZ3JvdXApOwogICAgICAgICAgICAgICAgY29uc3QgZ3JvdXBlZE9ic2VydmFibGUgPSBuZXcgR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cCwgdGhpcyk7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoZ3JvdXBlZE9ic2VydmFibGUpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgICAgICAgICAgICAgIGxldCBkdXJhdGlvbjsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IHRoaXMuZHVyYXRpb25TZWxlY3RvcihuZXcgR3JvdXBlZE9ic2VydmFibGUoa2V5LCBncm91cCkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZChkdXJhdGlvbi5zdWJzY3JpYmUobmV3IEdyb3VwRHVyYXRpb25TdWJzY3JpYmVyKGtleSwgZ3JvdXAsIHRoaXMpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFncm91cC5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIGdyb3VwLm5leHQoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2Vycm9yKGVycikgewogICAgICAgICAgICBjb25zdCBncm91cHMgPSB0aGlzLmdyb3VwczsKICAgICAgICAgICAgaWYgKGdyb3VwcykgewogICAgICAgICAgICAgICAgZ3JvdXBzLmZvckVhY2goKGdyb3VwLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgICAgICBncm91cC5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXBzID0gdGhpcy5ncm91cHM7CiAgICAgICAgICAgIGlmIChncm91cHMpIHsKICAgICAgICAgICAgICAgIGdyb3Vwcy5mb3JFYWNoKChncm91cCwga2V5KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZ3JvdXAuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgZ3JvdXBzLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICByZW1vdmVHcm91cChrZXkpIHsKICAgICAgICAgICAgdGhpcy5ncm91cHMuZGVsZXRlKGtleSk7CiAgICAgICAgfQogICAgICAgIHVuc3Vic2NyaWJlKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICBzdXBlci51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgR3JvdXBEdXJhdGlvblN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihrZXksIGdyb3VwLCBwYXJlbnQpIHsKICAgICAgICAgICAgc3VwZXIoZ3JvdXApOwogICAgICAgICAgICB0aGlzLmtleSA9IGtleTsKICAgICAgICAgICAgdGhpcy5ncm91cCA9IGdyb3VwOwogICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICBfdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgICAgIGNvbnN0IHsgcGFyZW50LCBrZXkgfSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMua2V5ID0gdGhpcy5wYXJlbnQgPSBudWxsOwogICAgICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgICAgICBwYXJlbnQucmVtb3ZlR3JvdXAoa2V5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEdyb3VwZWRPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICAgICAgY29uc3RydWN0b3Ioa2V5LCBncm91cFN1YmplY3QsIHJlZkNvdW50U3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMua2V5ID0ga2V5OwogICAgICAgICAgICB0aGlzLmdyb3VwU3ViamVjdCA9IGdyb3VwU3ViamVjdDsKICAgICAgICAgICAgdGhpcy5yZWZDb3VudFN1YnNjcmlwdGlvbiA9IHJlZkNvdW50U3Vic2NyaXB0aW9uOwogICAgICAgIH0KICAgICAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICBjb25zdCB7IHJlZkNvdW50U3Vic2NyaXB0aW9uLCBncm91cFN1YmplY3QgfSA9IHRoaXM7CiAgICAgICAgICAgIGlmIChyZWZDb3VudFN1YnNjcmlwdGlvbiAmJiAhcmVmQ291bnRTdWJzY3JpcHRpb24uY2xvc2VkKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKG5ldyBJbm5lclJlZkNvdW50U3Vic2NyaXB0aW9uKHJlZkNvdW50U3Vic2NyaXB0aW9uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3Vic2NyaXB0aW9uLmFkZChncm91cFN1YmplY3Quc3Vic2NyaWJlKHN1YnNjcmliZXIpKTsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBJbm5lclJlZkNvdW50U3Vic2NyaXB0aW9uIGV4dGVuZHMgU3Vic2NyaXB0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHBhcmVudC5jb3VudCsrOwogICAgICAgIH0KICAgICAgICB1bnN1YnNjcmliZSgpIHsKICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5wYXJlbnQ7CiAgICAgICAgICAgIGlmICghcGFyZW50LmNsb3NlZCAmJiAhdGhpcy5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHN1cGVyLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICBwYXJlbnQuY291bnQgLT0gMTsKICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuY291bnQgPT09IDAgJiYgcGFyZW50LmF0dGVtcHRlZFRvVW5zdWJzY3JpYmUpIHsKICAgICAgICAgICAgICAgICAgICBwYXJlbnQudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBCZWhhdmlvclN1YmplY3QgZXh0ZW5kcyBTdWJqZWN0IHsKICAgICAgICBjb25zdHJ1Y3RvcihfdmFsdWUpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSBfdmFsdWU7CiAgICAgICAgfQogICAgICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0VmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgX3N1YnNjcmliZShzdWJzY3JpYmVyKSB7CiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHN1cGVyLl9zdWJzY3JpYmUoc3Vic2NyaWJlcik7CiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gJiYgIXN1YnNjcmlwdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh0aGlzLl92YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmlwdGlvbjsKICAgICAgICB9CiAgICAgICAgZ2V0VmFsdWUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICB0aHJvdyB0aGlzLnRocm93bkVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgT2JqZWN0VW5zdWJzY3JpYmVkRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIHN1cGVyLm5leHQodGhpcy5fdmFsdWUgPSB2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIEFjdGlvbiBleHRlbmRzIFN1YnNjcmlwdGlvbiB7CiAgICAgICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgfQogICAgICAgIHNjaGVkdWxlKHN0YXRlLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIEFzeW5jQWN0aW9uIGV4dGVuZHMgQWN0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICAgICAgc3VwZXIoc2NoZWR1bGVyLCB3b3JrKTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgICAgIHRoaXMud29yayA9IHdvcms7CiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZShzdGF0ZSwgZGVsYXkgPSAwKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7CiAgICAgICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuaWQgfHwgdGhpcy5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIHRoaXMuaWQsIGRlbGF5KTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgICAgICByZXR1cm4gc2V0SW50ZXJ2YWwoc2NoZWR1bGVyLmZsdXNoLmJpbmQoc2NoZWR1bGVyLCB0aGlzKSwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICByZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgaWYgKGRlbGF5ICE9PSBudWxsICYmIHRoaXMuZGVsYXkgPT09IGRlbGF5ICYmIHRoaXMucGVuZGluZyA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbGVhckludGVydmFsKGlkKTsKICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgZXhlY3V0ZShzdGF0ZSwgZGVsYXkpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKCdleGVjdXRpbmcgYSBjYW5jZWxsZWQgYWN0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICAgIGNvbnN0IGVycm9yID0gdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkpOwogICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBlbmRpbmcgPT09IGZhbHNlICYmIHRoaXMuaWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMucmVjeWNsZUFzeW5jSWQodGhpcy5zY2hlZHVsZXIsIHRoaXMuaWQsIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9leGVjdXRlKHN0YXRlLCBkZWxheSkgewogICAgICAgICAgICBsZXQgZXJyb3JlZCA9IGZhbHNlOwogICAgICAgICAgICBsZXQgZXJyb3JWYWx1ZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHRoaXMud29yayhzdGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIGVycm9yZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgZXJyb3JWYWx1ZSA9ICEhZSAmJiBlIHx8IG5ldyBFcnJvcihlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXJyb3JlZCkgewogICAgICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGVycm9yVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgICAgICBjb25zdCBpZCA9IHRoaXMuaWQ7CiAgICAgICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgICAgICBjb25zdCBhY3Rpb25zID0gc2NoZWR1bGVyLmFjdGlvbnM7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gYWN0aW9ucy5pbmRleE9mKHRoaXMpOwogICAgICAgICAgICB0aGlzLndvcmsgPSBudWxsOwogICAgICAgICAgICB0aGlzLnN0YXRlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5wZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gbnVsbDsKICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgYWN0aW9ucy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpZCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlbGF5ID0gbnVsbDsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUXVldWVBY3Rpb24gZXh0ZW5kcyBBc3luY0FjdGlvbiB7CiAgICAgICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgICAgIHN1cGVyKHNjaGVkdWxlciwgd29yayk7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgICAgICB0aGlzLndvcmsgPSB3b3JrOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZShzdGF0ZSwgZGVsYXkgPSAwKSB7CiAgICAgICAgICAgIGlmIChkZWxheSA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5zY2hlZHVsZShzdGF0ZSwgZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHN0YXRlOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlci5mbHVzaCh0aGlzKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIGV4ZWN1dGUoc3RhdGUsIGRlbGF5KSB7CiAgICAgICAgICAgIHJldHVybiAoZGVsYXkgPiAwIHx8IHRoaXMuY2xvc2VkKSA/CiAgICAgICAgICAgICAgICBzdXBlci5leGVjdXRlKHN0YXRlLCBkZWxheSkgOgogICAgICAgICAgICAgICAgdGhpcy5fZXhlY3V0ZShzdGF0ZSwgZGVsYXkpOwogICAgICAgIH0KICAgICAgICByZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgaWYgKChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHx8IChkZWxheSA9PT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlci5mbHVzaCh0aGlzKTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgU2NoZWR1bGVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihTY2hlZHVsZXJBY3Rpb24sIG5vdyA9IFNjaGVkdWxlci5ub3cpIHsKICAgICAgICAgICAgdGhpcy5TY2hlZHVsZXJBY3Rpb24gPSBTY2hlZHVsZXJBY3Rpb247CiAgICAgICAgICAgIHRoaXMubm93ID0gbm93OwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZSh3b3JrLCBkZWxheSA9IDAsIHN0YXRlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgdGhpcy5TY2hlZHVsZXJBY3Rpb24odGhpcywgd29yaykuc2NoZWR1bGUoc3RhdGUsIGRlbGF5KTsKICAgICAgICB9CiAgICB9CiAgICBTY2hlZHVsZXIubm93ID0gKCkgPT4gRGF0ZS5ub3coKTsKCiAgICBjbGFzcyBBc3luY1NjaGVkdWxlciBleHRlbmRzIFNjaGVkdWxlciB7CiAgICAgICAgY29uc3RydWN0b3IoU2NoZWR1bGVyQWN0aW9uLCBub3cgPSBTY2hlZHVsZXIubm93KSB7CiAgICAgICAgICAgIHN1cGVyKFNjaGVkdWxlckFjdGlvbiwgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICYmIEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlICE9PSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlLm5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5vdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5hY3Rpb25zID0gW107CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZSh3b3JrLCBkZWxheSA9IDAsIHN0YXRlKSB7CiAgICAgICAgICAgIGlmIChBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAmJiBBc3luY1NjaGVkdWxlci5kZWxlZ2F0ZSAhPT0gdGhpcykgewogICAgICAgICAgICAgICAgcmV0dXJuIEFzeW5jU2NoZWR1bGVyLmRlbGVnYXRlLnNjaGVkdWxlKHdvcmssIGRlbGF5LCBzdGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuc2NoZWR1bGUod29yaywgZGVsYXksIHN0YXRlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmbHVzaChhY3Rpb24pIHsKICAgICAgICAgICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzOwogICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUpIHsKICAgICAgICAgICAgICAgIGFjdGlvbnMucHVzaChhY3Rpb24pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBlcnJvcjsKICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgPSBhY3Rpb24uZXhlY3V0ZShhY3Rpb24uc3RhdGUsIGFjdGlvbi5kZWxheSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKTsKICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICB3aGlsZSAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSB7CiAgICAgICAgICAgICAgICAgICAgYWN0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBRdWV1ZVNjaGVkdWxlciBleHRlbmRzIEFzeW5jU2NoZWR1bGVyIHsKICAgIH0KCiAgICBjb25zdCBxdWV1ZSA9IG5ldyBRdWV1ZVNjaGVkdWxlcihRdWV1ZUFjdGlvbik7CgogICAgY29uc3QgRU1QVFkgPSBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHN1YnNjcmliZXIuY29tcGxldGUoKSk7CgogICAgZnVuY3Rpb24gaXNTY2hlZHVsZXIodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnNjaGVkdWxlID09PSAnZnVuY3Rpb24nOwogICAgfQoKICAgIGNvbnN0IHN1YnNjcmliZVRvQXJyYXkgPSAoYXJyYXkpID0+IChzdWJzY3JpYmVyKSA9PiB7CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDsgaSA8IGxlbiAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykgewogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoYXJyYXlbaV0pOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICB9OwoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlQXJyYXkoaW5wdXQsIHNjaGVkdWxlcikgewogICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmIChpID09PSBpbnB1dC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGlucHV0W2krK10pOwogICAgICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICAgICAgICAgIHN1Yi5hZGQodGhpcy5zY2hlZHVsZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gc3ViOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGZyb21BcnJheShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgICAgaWYgKCFzY2hlZHVsZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZVRvQXJyYXkoaW5wdXQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZUFycmF5KGlucHV0LCBzY2hlZHVsZXIpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBvZiguLi5hcmdzKSB7CiAgICAgICAgbGV0IHNjaGVkdWxlciA9IGFyZ3NbYXJncy5sZW5ndGggLSAxXTsKICAgICAgICBpZiAoaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSkgewogICAgICAgICAgICBhcmdzLnBvcCgpOwogICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVBcnJheShhcmdzLCBzY2hlZHVsZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21BcnJheShhcmdzKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdGhyb3dFcnJvcihlcnJvciwgc2NoZWR1bGVyKSB7CiAgICAgICAgaWYgKCFzY2hlZHVsZXIpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gc3Vic2NyaWJlci5lcnJvcihlcnJvcikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoLCAwLCB7IGVycm9yLCBzdWJzY3JpYmVyIH0pKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkaXNwYXRjaCh7IGVycm9yLCBzdWJzY3JpYmVyIH0pIHsKICAgICAgICBzdWJzY3JpYmVyLmVycm9yKGVycm9yKTsKICAgIH0KCiAgICB2YXIgTm90aWZpY2F0aW9uS2luZDsKICAgIChmdW5jdGlvbiAoTm90aWZpY2F0aW9uS2luZCkgewogICAgICAgIE5vdGlmaWNhdGlvbktpbmRbIk5FWFQiXSA9ICJOIjsKICAgICAgICBOb3RpZmljYXRpb25LaW5kWyJFUlJPUiJdID0gIkUiOwogICAgICAgIE5vdGlmaWNhdGlvbktpbmRbIkNPTVBMRVRFIl0gPSAiQyI7CiAgICB9KShOb3RpZmljYXRpb25LaW5kIHx8IChOb3RpZmljYXRpb25LaW5kID0ge30pKTsKICAgIGNsYXNzIE5vdGlmaWNhdGlvbiB7CiAgICAgICAgY29uc3RydWN0b3Ioa2luZCwgdmFsdWUsIGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMua2luZCA9IGtpbmQ7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0ga2luZCA9PT0gJ04nOwogICAgICAgIH0KICAgICAgICBvYnNlcnZlKG9ic2VydmVyKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5raW5kKSB7CiAgICAgICAgICAgICAgICBjYXNlICdOJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JzZXJ2ZXIubmV4dCAmJiBvYnNlcnZlci5uZXh0KHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmVycm9yICYmIG9ic2VydmVyLmVycm9yKHRoaXMuZXJyb3IpOwogICAgICAgICAgICAgICAgY2FzZSAnQyc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9ic2VydmVyLmNvbXBsZXRlICYmIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZG8obmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSB0aGlzLmtpbmQ7CiAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgICAgICAgICAgY2FzZSAnTic6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQgJiYgbmV4dCh0aGlzLnZhbHVlKTsKICAgICAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnJvciAmJiBlcnJvcih0aGlzLmVycm9yKTsKICAgICAgICAgICAgICAgIGNhc2UgJ0MnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wbGV0ZSAmJiBjb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGFjY2VwdChuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgICAgIGlmIChuZXh0T3JPYnNlcnZlciAmJiB0eXBlb2YgbmV4dE9yT2JzZXJ2ZXIubmV4dCA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub2JzZXJ2ZShuZXh0T3JPYnNlcnZlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kbyhuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0b09ic2VydmFibGUoKSB7CiAgICAgICAgICAgIGNvbnN0IGtpbmQgPSB0aGlzLmtpbmQ7CiAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewogICAgICAgICAgICAgICAgY2FzZSAnTic6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9mKHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgY2FzZSAnRSc6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IodGhpcy5lcnJvcik7CiAgICAgICAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gRU1QVFk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmV4cGVjdGVkIG5vdGlmaWNhdGlvbiBraW5kIHZhbHVlJyk7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBjcmVhdGVOZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE5vdGlmaWNhdGlvbignTicsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTm90aWZpY2F0aW9uLnVuZGVmaW5lZFZhbHVlTm90aWZpY2F0aW9uOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgY3JlYXRlRXJyb3IoZXJyKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTm90aWZpY2F0aW9uKCdFJywgdW5kZWZpbmVkLCBlcnIpOwogICAgICAgIH0KICAgICAgICBzdGF0aWMgY3JlYXRlQ29tcGxldGUoKSB7CiAgICAgICAgICAgIHJldHVybiBOb3RpZmljYXRpb24uY29tcGxldGVOb3RpZmljYXRpb247CiAgICAgICAgfQogICAgfQogICAgTm90aWZpY2F0aW9uLmNvbXBsZXRlTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbignQycpOwogICAgTm90aWZpY2F0aW9uLnVuZGVmaW5lZFZhbHVlTm90aWZpY2F0aW9uID0gbmV3IE5vdGlmaWNhdGlvbignTicsIHVuZGVmaW5lZCk7CgogICAgZnVuY3Rpb24gb2JzZXJ2ZU9uKHNjaGVkdWxlciwgZGVsYXkgPSAwKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG9ic2VydmVPbk9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgT2JzZXJ2ZU9uT3BlcmF0b3Ioc2NoZWR1bGVyLCBkZWxheSkpOwogICAgICAgIH07CiAgICB9CiAgICBjbGFzcyBPYnNlcnZlT25PcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE9ic2VydmVPblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5zY2hlZHVsZXIsIHRoaXMuZGVsYXkpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBPYnNlcnZlT25TdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNjaGVkdWxlciwgZGVsYXkgPSAwKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICB9CiAgICAgICAgc3RhdGljIGRpc3BhdGNoKGFyZykgewogICAgICAgICAgICBjb25zdCB7IG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24gfSA9IGFyZzsKICAgICAgICAgICAgbm90aWZpY2F0aW9uLm9ic2VydmUoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIHNjaGVkdWxlTWVzc2FnZShub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICBkZXN0aW5hdGlvbi5hZGQodGhpcy5zY2hlZHVsZXIuc2NoZWR1bGUoT2JzZXJ2ZU9uU3Vic2NyaWJlci5kaXNwYXRjaCwgdGhpcy5kZWxheSwgbmV3IE9ic2VydmVPbk1lc3NhZ2Uobm90aWZpY2F0aW9uLCB0aGlzLmRlc3RpbmF0aW9uKSkpOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnNjaGVkdWxlTWVzc2FnZShOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpOwogICAgICAgIH0KICAgICAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVNZXNzYWdlKE5vdGlmaWNhdGlvbi5jcmVhdGVFcnJvcihlcnIpKTsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVNZXNzYWdlKE5vdGlmaWNhdGlvbi5jcmVhdGVDb21wbGV0ZSgpKTsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIE9ic2VydmVPbk1lc3NhZ2UgewogICAgICAgIGNvbnN0cnVjdG9yKG5vdGlmaWNhdGlvbiwgZGVzdGluYXRpb24pIHsKICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb24gPSBub3RpZmljYXRpb247CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24gPSBkZXN0aW5hdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgUmVwbGF5U3ViamVjdCBleHRlbmRzIFN1YmplY3QgewogICAgICAgIGNvbnN0cnVjdG9yKGJ1ZmZlclNpemUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHdpbmRvd1RpbWUgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksIHNjaGVkdWxlcikgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICAgICAgdGhpcy5fZXZlbnRzID0gW107CiAgICAgICAgICAgIHRoaXMuX2luZmluaXRlVGltZVdpbmRvdyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9idWZmZXJTaXplID0gYnVmZmVyU2l6ZSA8IDEgPyAxIDogYnVmZmVyU2l6ZTsKICAgICAgICAgICAgdGhpcy5fd2luZG93VGltZSA9IHdpbmRvd1RpbWUgPCAxID8gMSA6IHdpbmRvd1RpbWU7CiAgICAgICAgICAgIGlmICh3aW5kb3dUaW1lID09PSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2luZmluaXRlVGltZVdpbmRvdyA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLm5leHRJbmZpbml0ZVRpbWVXaW5kb3c7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLm5leHQgPSB0aGlzLm5leHRUaW1lV2luZG93OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5leHRJbmZpbml0ZVRpbWVXaW5kb3codmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgX2V2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgICAgX2V2ZW50cy5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgaWYgKF9ldmVudHMubGVuZ3RoID4gdGhpcy5fYnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgICAgX2V2ZW50cy5zaGlmdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1cGVyLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgICAgICBuZXh0VGltZVdpbmRvdyh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9ldmVudHMucHVzaChuZXcgUmVwbGF5RXZlbnQodGhpcy5fZ2V0Tm93KCksIHZhbHVlKSk7CiAgICAgICAgICAgIHRoaXMuX3RyaW1CdWZmZXJUaGVuR2V0RXZlbnRzKCk7CiAgICAgICAgICAgIHN1cGVyLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgICAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICAgICAgY29uc3QgX2luZmluaXRlVGltZVdpbmRvdyA9IHRoaXMuX2luZmluaXRlVGltZVdpbmRvdzsKICAgICAgICAgICAgY29uc3QgX2V2ZW50cyA9IF9pbmZpbml0ZVRpbWVXaW5kb3cgPyB0aGlzLl9ldmVudHMgOiB0aGlzLl90cmltQnVmZmVyVGhlbkdldEV2ZW50cygpOwogICAgICAgICAgICBjb25zdCBzY2hlZHVsZXIgPSB0aGlzLnNjaGVkdWxlcjsKICAgICAgICAgICAgY29uc3QgbGVuID0gX2V2ZW50cy5sZW5ndGg7CiAgICAgICAgICAgIGxldCBzdWJzY3JpcHRpb247CiAgICAgICAgICAgIGlmICh0aGlzLmNsb3NlZCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IE9iamVjdFVuc3Vic2NyaWJlZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5pc1N0b3BwZWQgfHwgdGhpcy5oYXNFcnJvcikgewogICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5vYnNlcnZlcnMucHVzaChzdWJzY3JpYmVyKTsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBTdWJqZWN0U3Vic2NyaXB0aW9uKHRoaXMsIHN1YnNjcmliZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzY2hlZHVsZXIpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHN1YnNjcmliZXIgPSBuZXcgT2JzZXJ2ZU9uU3Vic2NyaWJlcihzdWJzY3JpYmVyLCBzY2hlZHVsZXIpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoX2luZmluaXRlVGltZVdpbmRvdykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW4gJiYgIXN1YnNjcmliZXIuY2xvc2VkOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoX2V2ZW50c1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbiAmJiAhc3Vic2NyaWJlci5jbG9zZWQ7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dChfZXZlbnRzW2ldLnZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5oYXNFcnJvcikgewogICAgICAgICAgICAgICAgc3Vic2NyaWJlci5lcnJvcih0aGlzLnRocm93bkVycm9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpcHRpb247CiAgICAgICAgfQogICAgICAgIF9nZXROb3coKSB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5zY2hlZHVsZXIgfHwgcXVldWUpLm5vdygpOwogICAgICAgIH0KICAgICAgICBfdHJpbUJ1ZmZlclRoZW5HZXRFdmVudHMoKSB7CiAgICAgICAgICAgIGNvbnN0IG5vdyA9IHRoaXMuX2dldE5vdygpOwogICAgICAgICAgICBjb25zdCBfYnVmZmVyU2l6ZSA9IHRoaXMuX2J1ZmZlclNpemU7CiAgICAgICAgICAgIGNvbnN0IF93aW5kb3dUaW1lID0gdGhpcy5fd2luZG93VGltZTsKICAgICAgICAgICAgY29uc3QgX2V2ZW50cyA9IHRoaXMuX2V2ZW50czsKICAgICAgICAgICAgY29uc3QgZXZlbnRzQ291bnQgPSBfZXZlbnRzLmxlbmd0aDsKICAgICAgICAgICAgbGV0IHNwbGljZUNvdW50ID0gMDsKICAgICAgICAgICAgd2hpbGUgKHNwbGljZUNvdW50IDwgZXZlbnRzQ291bnQpIHsKICAgICAgICAgICAgICAgIGlmICgobm93IC0gX2V2ZW50c1tzcGxpY2VDb3VudF0udGltZSkgPCBfd2luZG93VGltZSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3BsaWNlQ291bnQrKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXZlbnRzQ291bnQgPiBfYnVmZmVyU2l6ZSkgewogICAgICAgICAgICAgICAgc3BsaWNlQ291bnQgPSBNYXRoLm1heChzcGxpY2VDb3VudCwgZXZlbnRzQ291bnQgLSBfYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNwbGljZUNvdW50ID4gMCkgewogICAgICAgICAgICAgICAgX2V2ZW50cy5zcGxpY2UoMCwgc3BsaWNlQ291bnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBfZXZlbnRzOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFJlcGxheUV2ZW50IHsKICAgICAgICBjb25zdHJ1Y3Rvcih0aW1lLCB2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnRpbWUgPSB0aW1lOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIGxldCBuZXh0SGFuZGxlID0gMTsKICAgIGxldCByZXNvbHZlZDsKICAgIGNvbnN0IGFjdGl2ZUhhbmRsZXMgPSB7fTsKICAgIGZ1bmN0aW9uIGZpbmRBbmRDbGVhckhhbmRsZShoYW5kbGUpIHsKICAgICAgICBpZiAoaGFuZGxlIGluIGFjdGl2ZUhhbmRsZXMpIHsKICAgICAgICAgICAgZGVsZXRlIGFjdGl2ZUhhbmRsZXNbaGFuZGxlXTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIGNvbnN0IEltbWVkaWF0ZSA9IHsKICAgICAgICBzZXRJbW1lZGlhdGUoY2IpIHsKICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gbmV4dEhhbmRsZSsrOwogICAgICAgICAgICBhY3RpdmVIYW5kbGVzW2hhbmRsZV0gPSB0cnVlOwogICAgICAgICAgICBpZiAoIXJlc29sdmVkKSB7CiAgICAgICAgICAgICAgICByZXNvbHZlZCA9IFByb21pc2UucmVzb2x2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc29sdmVkLnRoZW4oKCkgPT4gZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSkgJiYgY2IoKSk7CiAgICAgICAgICAgIHJldHVybiBoYW5kbGU7CiAgICAgICAgfSwKICAgICAgICBjbGVhckltbWVkaWF0ZShoYW5kbGUpIHsKICAgICAgICAgICAgZmluZEFuZENsZWFySGFuZGxlKGhhbmRsZSk7CiAgICAgICAgfSwKICAgIH07CgogICAgY2xhc3MgQXNhcEFjdGlvbiBleHRlbmRzIEFzeW5jQWN0aW9uIHsKICAgICAgICBjb25zdHJ1Y3RvcihzY2hlZHVsZXIsIHdvcmspIHsKICAgICAgICAgICAgc3VwZXIoc2NoZWR1bGVyLCB3b3JrKTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgICAgIHRoaXMud29yayA9IHdvcms7CiAgICAgICAgfQogICAgICAgIHJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5ID0gMCkgewogICAgICAgICAgICBpZiAoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVxdWVzdEFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNjaGVkdWxlci5hY3Rpb25zLnB1c2godGhpcyk7CiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGVkIHx8IChzY2hlZHVsZXIuc2NoZWR1bGVkID0gSW1tZWRpYXRlLnNldEltbWVkaWF0ZShzY2hlZHVsZXIuZmx1c2guYmluZChzY2hlZHVsZXIsIHVuZGVmaW5lZCkpKTsKICAgICAgICB9CiAgICAgICAgcmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkgPSAwKSB7CiAgICAgICAgICAgIGlmICgoZGVsYXkgIT09IG51bGwgJiYgZGVsYXkgPiAwKSB8fCAoZGVsYXkgPT09IG51bGwgJiYgdGhpcy5kZWxheSA+IDApKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIucmVjeWNsZUFzeW5jSWQoc2NoZWR1bGVyLCBpZCwgZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzY2hlZHVsZXIuYWN0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIEltbWVkaWF0ZS5jbGVhckltbWVkaWF0ZShpZCk7CiAgICAgICAgICAgICAgICBzY2hlZHVsZXIuc2NoZWR1bGVkID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgfQoKICAgIGNsYXNzIEFzYXBTY2hlZHVsZXIgZXh0ZW5kcyBBc3luY1NjaGVkdWxlciB7CiAgICAgICAgZmx1c2goYWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZWQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIGNvbnN0IHsgYWN0aW9ucyB9ID0gdGhpczsKICAgICAgICAgICAgbGV0IGVycm9yOwogICAgICAgICAgICBsZXQgaW5kZXggPSAtMTsKICAgICAgICAgICAgbGV0IGNvdW50ID0gYWN0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgIGFjdGlvbiA9IGFjdGlvbiB8fCBhY3Rpb25zLnNoaWZ0KCk7CiAgICAgICAgICAgIGRvIHsKICAgICAgICAgICAgICAgIGlmIChlcnJvciA9IGFjdGlvbi5leGVjdXRlKGFjdGlvbi5zdGF0ZSwgYWN0aW9uLmRlbGF5KSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9IHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpOwogICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHdoaWxlICgrK2luZGV4IDwgY291bnQgJiYgKGFjdGlvbiA9IGFjdGlvbnMuc2hpZnQoKSkpIHsKICAgICAgICAgICAgICAgICAgICBhY3Rpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IGFzYXAgPSBuZXcgQXNhcFNjaGVkdWxlcihBc2FwQWN0aW9uKTsKCiAgICBjb25zdCBhc3luYyA9IG5ldyBBc3luY1NjaGVkdWxlcihBc3luY0FjdGlvbik7CgogICAgY2xhc3MgQW5pbWF0aW9uRnJhbWVBY3Rpb24gZXh0ZW5kcyBBc3luY0FjdGlvbiB7CiAgICAgICAgY29uc3RydWN0b3Ioc2NoZWR1bGVyLCB3b3JrKSB7CiAgICAgICAgICAgIHN1cGVyKHNjaGVkdWxlciwgd29yayk7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgICAgICB0aGlzLndvcmsgPSB3b3JrOwogICAgICAgIH0KICAgICAgICByZXF1ZXN0QXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgaWYgKGRlbGF5ICE9PSBudWxsICYmIGRlbGF5ID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN1cGVyLnJlcXVlc3RBc3luY0lkKHNjaGVkdWxlciwgaWQsIGRlbGF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzY2hlZHVsZXIuYWN0aW9ucy5wdXNoKHRoaXMpOwogICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVyLnNjaGVkdWxlZCB8fCAoc2NoZWR1bGVyLnNjaGVkdWxlZCA9IHJlcXVlc3RBbmltYXRpb25GcmFtZSgoKSA9PiBzY2hlZHVsZXIuZmx1c2godW5kZWZpbmVkKSkpOwogICAgICAgIH0KICAgICAgICByZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgaWYgKChkZWxheSAhPT0gbnVsbCAmJiBkZWxheSA+IDApIHx8IChkZWxheSA9PT0gbnVsbCAmJiB0aGlzLmRlbGF5ID4gMCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5yZWN5Y2xlQXN5bmNJZChzY2hlZHVsZXIsIGlkLCBkZWxheSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNjaGVkdWxlci5hY3Rpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgY2FuY2VsQW5pbWF0aW9uRnJhbWUoaWQpOwogICAgICAgICAgICAgICAgc2NoZWR1bGVyLnNjaGVkdWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBBbmltYXRpb25GcmFtZVNjaGVkdWxlciBleHRlbmRzIEFzeW5jU2NoZWR1bGVyIHsKICAgICAgICBmbHVzaChhY3Rpb24pIHsKICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlZCA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgY29uc3QgeyBhY3Rpb25zIH0gPSB0aGlzOwogICAgICAgICAgICBsZXQgZXJyb3I7CiAgICAgICAgICAgIGxldCBpbmRleCA9IC0xOwogICAgICAgICAgICBsZXQgY291bnQgPSBhY3Rpb25zLmxlbmd0aDsKICAgICAgICAgICAgYWN0aW9uID0gYWN0aW9uIHx8IGFjdGlvbnMuc2hpZnQoKTsKICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGVycm9yID0gYWN0aW9uLmV4ZWN1dGUoYWN0aW9uLnN0YXRlLCBhY3Rpb24uZGVsYXkpKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0gd2hpbGUgKCsraW5kZXggPCBjb3VudCAmJiAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSk7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gZmFsc2U7CiAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgd2hpbGUgKCsraW5kZXggPCBjb3VudCAmJiAoYWN0aW9uID0gYWN0aW9ucy5zaGlmdCgpKSkgewogICAgICAgICAgICAgICAgICAgIGFjdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgY29uc3QgYW5pbWF0aW9uRnJhbWUgPSBuZXcgQW5pbWF0aW9uRnJhbWVTY2hlZHVsZXIoQW5pbWF0aW9uRnJhbWVBY3Rpb24pOwoKICAgIGZ1bmN0aW9uIG5vb3AoKSB7IH0KCiAgICBmdW5jdGlvbiBpc09ic2VydmFibGUob2JqKSB7CiAgICAgICAgcmV0dXJuICEhb2JqICYmIChvYmogaW5zdGFuY2VvZiBPYnNlcnZhYmxlIHx8ICh0eXBlb2Ygb2JqLmxpZnQgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zdWJzY3JpYmUgPT09ICdmdW5jdGlvbicpKTsKICAgIH0KCiAgICBjb25zdCBFbXB0eUVycm9ySW1wbCA9ICgoKSA9PiB7CiAgICAgICAgZnVuY3Rpb24gRW1wdHlFcnJvckltcGwoKSB7CiAgICAgICAgICAgIEVycm9yLmNhbGwodGhpcyk7CiAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9ICdubyBlbGVtZW50cyBpbiBzZXF1ZW5jZSc7CiAgICAgICAgICAgIHRoaXMubmFtZSA9ICdFbXB0eUVycm9yJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIEVtcHR5RXJyb3JJbXBsLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoRXJyb3IucHJvdG90eXBlKTsKICAgICAgICByZXR1cm4gRW1wdHlFcnJvckltcGw7CiAgICB9KSgpOwogICAgY29uc3QgRW1wdHlFcnJvciA9IEVtcHR5RXJyb3JJbXBsOwoKICAgIGNvbnN0IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbCA9ICgoKSA9PiB7CiAgICAgICAgZnVuY3Rpb24gQXJndW1lbnRPdXRPZlJhbmdlRXJyb3JJbXBsKCkgewogICAgICAgICAgICBFcnJvci5jYWxsKHRoaXMpOwogICAgICAgICAgICB0aGlzLm1lc3NhZ2UgPSAnYXJndW1lbnQgb3V0IG9mIHJhbmdlJzsKICAgICAgICAgICAgdGhpcy5uYW1lID0gJ0FyZ3VtZW50T3V0T2ZSYW5nZUVycm9yJzsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbC5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7CiAgICAgICAgcmV0dXJuIEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbDsKICAgIH0pKCk7CiAgICBjb25zdCBBcmd1bWVudE91dE9mUmFuZ2VFcnJvciA9IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9ySW1wbDsKCiAgICBmdW5jdGlvbiBtYXAocHJvamVjdCwgdGhpc0FyZykgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBtYXBPcGVyYXRpb24oc291cmNlKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvamVjdCAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYXJndW1lbnQgaXMgbm90IGEgZnVuY3Rpb24uIEFyZSB5b3UgbG9va2luZyBmb3IgYG1hcFRvKClgPycpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTWFwT3BlcmF0b3IocHJvamVjdCwgdGhpc0FyZykpOwogICAgICAgIH07CiAgICB9CiAgICBjbGFzcyBNYXBPcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IocHJvamVjdCwgdGhpc0FyZykgewogICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgTWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QsIHRoaXMudGhpc0FyZykpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIE1hcFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcHJvamVjdCwgdGhpc0FyZykgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgICAgIHRoaXMuY291bnQgPSAwOwogICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnIHx8IHRoaXM7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QuY2FsbCh0aGlzLnRoaXNBcmcsIHZhbHVlLCB0aGlzLmNvdW50KyspOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgT3V0ZXJTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoaW5uZXJWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIG5vdGlmeUVycm9yKGVycm9yLCBpbm5lclN1YikgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycm9yKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBjbGFzcyBJbm5lclN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIG91dGVyVmFsdWUsIG91dGVySW5kZXgpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHRoaXMub3V0ZXJWYWx1ZSA9IG91dGVyVmFsdWU7CiAgICAgICAgICAgIHRoaXMub3V0ZXJJbmRleCA9IG91dGVySW5kZXg7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlOZXh0KHRoaXMub3V0ZXJWYWx1ZSwgdmFsdWUsIHRoaXMub3V0ZXJJbmRleCwgdGhpcy5pbmRleCsrLCB0aGlzKTsKICAgICAgICB9CiAgICAgICAgX2Vycm9yKGVycm9yKSB7CiAgICAgICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUVycm9yKGVycm9yLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIHRoaXMucGFyZW50Lm5vdGlmeUNvbXBsZXRlKHRoaXMpOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgfQoKICAgIGNvbnN0IHN1YnNjcmliZVRvUHJvbWlzZSA9IChwcm9taXNlKSA9PiAoc3Vic2NyaWJlcikgPT4gewogICAgICAgIHByb21pc2UudGhlbigodmFsdWUpID0+IHsKICAgICAgICAgICAgaWYgKCFzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0sIChlcnIpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSkKICAgICAgICAgICAgLnRoZW4obnVsbCwgaG9zdFJlcG9ydEVycm9yKTsKICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjsKICAgIH07CgogICAgZnVuY3Rpb24gZ2V0U3ltYm9sSXRlcmF0b3IoKSB7CiAgICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicgfHwgIVN5bWJvbC5pdGVyYXRvcikgewogICAgICAgICAgICByZXR1cm4gJ0BAaXRlcmF0b3InOwogICAgICAgIH0KICAgICAgICByZXR1cm4gU3ltYm9sLml0ZXJhdG9yOwogICAgfQogICAgY29uc3QgaXRlcmF0b3IgPSBnZXRTeW1ib2xJdGVyYXRvcigpOwoKICAgIGNvbnN0IHN1YnNjcmliZVRvSXRlcmFibGUgPSAoaXRlcmFibGUpID0+IChzdWJzY3JpYmVyKSA9PiB7CiAgICAgICAgY29uc3QgaXRlcmF0b3IkMSA9IGl0ZXJhYmxlW2l0ZXJhdG9yXSgpOwogICAgICAgIGRvIHsKICAgICAgICAgICAgY29uc3QgaXRlbSA9IGl0ZXJhdG9yJDEubmV4dCgpOwogICAgICAgICAgICBpZiAoaXRlbS5kb25lKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoaXRlbS52YWx1ZSk7CiAgICAgICAgICAgIGlmIChzdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9IHdoaWxlICh0cnVlKTsKICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yJDEucmV0dXJuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKCgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciQxLnJldHVybikgewogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yJDEucmV0dXJuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3Vic2NyaWJlcjsKICAgIH07CgogICAgY29uc3Qgc3Vic2NyaWJlVG9PYnNlcnZhYmxlID0gKG9iaikgPT4gKHN1YnNjcmliZXIpID0+IHsKICAgICAgICBjb25zdCBvYnMgPSBvYmpbb2JzZXJ2YWJsZV0oKTsKICAgICAgICBpZiAodHlwZW9mIG9icy5zdWJzY3JpYmUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUHJvdmlkZWQgb2JqZWN0IGRvZXMgbm90IGNvcnJlY3RseSBpbXBsZW1lbnQgU3ltYm9sLm9ic2VydmFibGUnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBvYnMuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgIH0KICAgIH07CgogICAgY29uc3QgaXNBcnJheUxpa2UgPSAoKHgpID0+IHggJiYgdHlwZW9mIHgubGVuZ3RoID09PSAnbnVtYmVyJyAmJiB0eXBlb2YgeCAhPT0gJ2Z1bmN0aW9uJyk7CgogICAgZnVuY3Rpb24gaXNQcm9taXNlKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuICEhdmFsdWUgJiYgdHlwZW9mIHZhbHVlLnN1YnNjcmliZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgdmFsdWUudGhlbiA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0KCiAgICBmdW5jdGlvbiBzdWJzY3JpYmVUb0FzeW5jSXRlcmFibGUoYXN5bmNJdGVyYWJsZSkgewogICAgICAgIHJldHVybiAoc3Vic2NyaWJlcikgPT4gewogICAgICAgICAgICBwcm9jZXNzJDEoYXN5bmNJdGVyYWJsZSwgc3Vic2NyaWJlcikuY2F0Y2goZXJyID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSk7CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIHByb2Nlc3MkMShhc3luY0l0ZXJhYmxlLCBzdWJzY3JpYmVyKSB7CiAgICAgICAgdmFyIGFzeW5jSXRlcmFibGVfMSwgYXN5bmNJdGVyYWJsZV8xXzE7CiAgICAgICAgdmFyIGVfMSwgX2E7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGZvciAoYXN5bmNJdGVyYWJsZV8xID0gX19hc3luY1ZhbHVlcyhhc3luY0l0ZXJhYmxlKTsgYXN5bmNJdGVyYWJsZV8xXzEgPSB5aWVsZCBhc3luY0l0ZXJhYmxlXzEubmV4dCgpLCAhYXN5bmNJdGVyYWJsZV8xXzEuZG9uZTspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGFzeW5jSXRlcmFibGVfMV8xLnZhbHVlOwogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVfMV8xKSB7IGVfMSA9IHsgZXJyb3I6IGVfMV8xIH07IH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIGlmIChhc3luY0l0ZXJhYmxlXzFfMSAmJiAhYXN5bmNJdGVyYWJsZV8xXzEuZG9uZSAmJiAoX2EgPSBhc3luY0l0ZXJhYmxlXzEucmV0dXJuKSkgeWllbGQgX2EuY2FsbChhc3luY0l0ZXJhYmxlXzEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmluYWxseSB7IGlmIChlXzEpIHRocm93IGVfMS5lcnJvcjsgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBjb25zdCBzdWJzY3JpYmVUbyA9IChyZXN1bHQpID0+IHsKICAgICAgICBpZiAoISFyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdFtvYnNlcnZhYmxlXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9PYnNlcnZhYmxlKHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzQXJyYXlMaWtlKHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvQXJyYXkocmVzdWx0KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNQcm9taXNlKHJlc3VsdCkpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvUHJvbWlzZShyZXN1bHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICghIXJlc3VsdCAmJiB0eXBlb2YgcmVzdWx0W2l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9JdGVyYWJsZShyZXN1bHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChTeW1ib2wgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYKICAgICAgICAgICAgISFyZXN1bHQgJiYgdHlwZW9mIHJlc3VsdFtTeW1ib2wuYXN5bmNJdGVyYXRvcl0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZVRvQXN5bmNJdGVyYWJsZShyZXN1bHQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpc09iamVjdChyZXN1bHQpID8gJ2FuIGludmFsaWQgb2JqZWN0JyA6IGAnJHtyZXN1bHR9J2A7CiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBZb3UgcHJvdmlkZWQgJHt2YWx1ZX0gd2hlcmUgYSBzdHJlYW0gd2FzIGV4cGVjdGVkLmAKICAgICAgICAgICAgICAgICsgJyBZb3UgY2FuIHByb3ZpZGUgYW4gT2JzZXJ2YWJsZSwgUHJvbWlzZSwgQXJyYXksIG9yIEl0ZXJhYmxlLic7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IobXNnKTsKICAgICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHN1YnNjcmliZVRvUmVzdWx0KG91dGVyU3Vic2NyaWJlciwgcmVzdWx0LCBvdXRlclZhbHVlLCBvdXRlckluZGV4LCBpbm5lclN1YnNjcmliZXIgPSBuZXcgSW5uZXJTdWJzY3JpYmVyKG91dGVyU3Vic2NyaWJlciwgb3V0ZXJWYWx1ZSwgb3V0ZXJJbmRleCkpIHsKICAgICAgICBpZiAoaW5uZXJTdWJzY3JpYmVyLmNsb3NlZCkgewogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgT2JzZXJ2YWJsZSkgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0LnN1YnNjcmliZShpbm5lclN1YnNjcmliZXIpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG8ocmVzdWx0KShpbm5lclN1YnNjcmliZXIpOwogICAgfQoKICAgIGNvbnN0IE5PTkUgPSB7fTsKICAgIGZ1bmN0aW9uIGNvbWJpbmVMYXRlc3QoLi4ub2JzZXJ2YWJsZXMpIHsKICAgICAgICBsZXQgcmVzdWx0U2VsZWN0b3IgPSB1bmRlZmluZWQ7CiAgICAgICAgbGV0IHNjaGVkdWxlciA9IHVuZGVmaW5lZDsKICAgICAgICBpZiAoaXNTY2hlZHVsZXIob2JzZXJ2YWJsZXNbb2JzZXJ2YWJsZXMubGVuZ3RoIC0gMV0pKSB7CiAgICAgICAgICAgIHNjaGVkdWxlciA9IG9ic2VydmFibGVzLnBvcCgpOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHJlc3VsdFNlbGVjdG9yID0gb2JzZXJ2YWJsZXMucG9wKCk7CiAgICAgICAgfQogICAgICAgIGlmIChvYnNlcnZhYmxlcy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShvYnNlcnZhYmxlc1swXSkpIHsKICAgICAgICAgICAgb2JzZXJ2YWJsZXMgPSBvYnNlcnZhYmxlc1swXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZyb21BcnJheShvYnNlcnZhYmxlcywgc2NoZWR1bGVyKS5saWZ0KG5ldyBDb21iaW5lTGF0ZXN0T3BlcmF0b3IocmVzdWx0U2VsZWN0b3IpKTsKICAgIH0KICAgIGNsYXNzIENvbWJpbmVMYXRlc3RPcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IocmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICAgICAgdGhpcy5yZXN1bHRTZWxlY3RvciA9IHJlc3VsdFNlbGVjdG9yOwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgQ29tYmluZUxhdGVzdFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5yZXN1bHRTZWxlY3RvcikpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIENvbWJpbmVMYXRlc3RTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLnJlc3VsdFNlbGVjdG9yID0gcmVzdWx0U2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gMDsKICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5vYnNlcnZhYmxlcyA9IFtdOwogICAgICAgIH0KICAgICAgICBfbmV4dChvYnNlcnZhYmxlKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWVzLnB1c2goTk9ORSk7CiAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZXMucHVzaChvYnNlcnZhYmxlKTsKICAgICAgICB9CiAgICAgICAgX2NvbXBsZXRlKCkgewogICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IHRoaXMub2JzZXJ2YWJsZXM7CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG9ic2VydmFibGVzLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBsZW47CiAgICAgICAgICAgICAgICB0aGlzLnRvUmVzcG9uZCA9IGxlbjsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlID0gb2JzZXJ2YWJsZXNbaV07CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgb2JzZXJ2YWJsZSwgb2JzZXJ2YWJsZSwgaSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdGlmeUNvbXBsZXRlKHVudXNlZCkgewogICAgICAgICAgICBpZiAoKHRoaXMuYWN0aXZlIC09IDEpID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLnZhbHVlczsKICAgICAgICAgICAgY29uc3Qgb2xkVmFsID0gdmFsdWVzW291dGVySW5kZXhdOwogICAgICAgICAgICBjb25zdCB0b1Jlc3BvbmQgPSAhdGhpcy50b1Jlc3BvbmQKICAgICAgICAgICAgICAgID8gMAogICAgICAgICAgICAgICAgOiBvbGRWYWwgPT09IE5PTkUgPyAtLXRoaXMudG9SZXNwb25kIDogdGhpcy50b1Jlc3BvbmQ7CiAgICAgICAgICAgIHZhbHVlc1tvdXRlckluZGV4XSA9IGlubmVyVmFsdWU7CiAgICAgICAgICAgIGlmICh0b1Jlc3BvbmQgPT09IDApIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJ5UmVzdWx0U2VsZWN0b3IodmFsdWVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZXMuc2xpY2UoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX3RyeVJlc3VsdFNlbGVjdG9yKHZhbHVlcykgewogICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5yZXN1bHRTZWxlY3Rvci5hcHBseSh0aGlzLCB2YWx1ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc2NoZWR1bGVPYnNlcnZhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgICAgIGNvbnN0IHN1YiA9IG5ldyBTdWJzY3JpcHRpb24oKTsKICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gewogICAgICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSQxID0gaW5wdXRbb2JzZXJ2YWJsZV0oKTsKICAgICAgICAgICAgICAgIHN1Yi5hZGQob2JzZXJ2YWJsZSQxLnN1YnNjcmliZSh7CiAgICAgICAgICAgICAgICAgICAgbmV4dCh2YWx1ZSkgeyBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLm5leHQodmFsdWUpKSk7IH0sCiAgICAgICAgICAgICAgICAgICAgZXJyb3IoZXJyKSB7IHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IHN1YnNjcmliZXIuZXJyb3IoZXJyKSkpOyB9LAogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCkgeyBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLmNvbXBsZXRlKCkpKTsgfSwKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gc3ViOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlUHJvbWlzZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gewogICAgICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgICAgIHN1Yi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKCgpID0+IGlucHV0LnRoZW4odmFsdWUgPT4gewogICAgICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoKCkgPT4gc3Vic2NyaWJlci5jb21wbGV0ZSgpKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0sIGVyciA9PiB7CiAgICAgICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiBzdWJzY3JpYmVyLmVycm9yKGVycikpKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgcmV0dXJuIHN1YjsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzY2hlZHVsZUl0ZXJhYmxlKGlucHV0LCBzY2hlZHVsZXIpIHsKICAgICAgICBpZiAoIWlucHV0KSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSXRlcmFibGUgY2Fubm90IGJlIG51bGwnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gewogICAgICAgICAgICBjb25zdCBzdWIgPSBuZXcgU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgICAgIGxldCBpdGVyYXRvciQxOwogICAgICAgICAgICBzdWIuYWRkKCgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChpdGVyYXRvciQxICYmIHR5cGVvZiBpdGVyYXRvciQxLnJldHVybiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yJDEucmV0dXJuKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiB7CiAgICAgICAgICAgICAgICBpdGVyYXRvciQxID0gaW5wdXRbaXRlcmF0b3JdKCk7CiAgICAgICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnNjcmliZXIuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGxldCBkb25lOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IGl0ZXJhdG9yJDEubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHJlc3VsdC52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgZG9uZSA9IHJlc3VsdC5kb25lOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiBzdWI7CiAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaXNJbnRlcm9wT2JzZXJ2YWJsZShpbnB1dCkgewogICAgICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbb2JzZXJ2YWJsZV0gPT09ICdmdW5jdGlvbic7CiAgICB9CgogICAgZnVuY3Rpb24gaXNJdGVyYWJsZShpbnB1dCkgewogICAgICAgIHJldHVybiBpbnB1dCAmJiB0eXBlb2YgaW5wdXRbaXRlcmF0b3JdID09PSAnZnVuY3Rpb24nOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgICAgaWYgKCFpbnB1dCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0l0ZXJhYmxlIGNhbm5vdCBiZSBudWxsJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICAgICAgY29uc3Qgc3ViID0gbmV3IFN1YnNjcmlwdGlvbigpOwogICAgICAgICAgICBzdWIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZSgoKSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCBpdGVyYXRvciA9IGlucHV0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSgpOwogICAgICAgICAgICAgICAgc3ViLmFkZChzY2hlZHVsZXIuc2NoZWR1bGUoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yLm5leHQoKS50aGVuKHJlc3VsdCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuZG9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KHJlc3VsdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjaGVkdWxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gc3ViOwogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHNjaGVkdWxlZChpbnB1dCwgc2NoZWR1bGVyKSB7CiAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpIHsKICAgICAgICAgICAgaWYgKGlzSW50ZXJvcE9ic2VydmFibGUoaW5wdXQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVPYnNlcnZhYmxlKGlucHV0LCBzY2hlZHVsZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzUHJvbWlzZShpbnB1dCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZVByb21pc2UoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJheUxpa2UoaW5wdXQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVBcnJheShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc0l0ZXJhYmxlKGlucHV0KSB8fCB0eXBlb2YgaW5wdXQgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChTeW1ib2wgJiYgU3ltYm9sLmFzeW5jSXRlcmF0b3IgJiYgdHlwZW9mIGlucHV0W1N5bWJvbC5hc3luY0l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHNjaGVkdWxlQXN5bmNJdGVyYWJsZShpbnB1dCwgc2NoZWR1bGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKChpbnB1dCAhPT0gbnVsbCAmJiB0eXBlb2YgaW5wdXQgfHwgaW5wdXQpICsgJyBpcyBub3Qgb2JzZXJ2YWJsZScpOwogICAgfQoKICAgIGZ1bmN0aW9uIGZyb20oaW5wdXQsIHNjaGVkdWxlcikgewogICAgICAgIGlmICghc2NoZWR1bGVyKSB7CiAgICAgICAgICAgIGlmIChpbnB1dCBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlVG8oaW5wdXQpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZWQoaW5wdXQsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIG1lcmdlTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yLCBjb25jdXJyZW50ID0gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKSB7CiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLnBpcGUobWVyZ2VNYXAoKGEsIGkpID0+IGZyb20ocHJvamVjdChhLCBpKSkucGlwZShtYXAoKGIsIGlpKSA9PiByZXN1bHRTZWxlY3RvcihhLCBiLCBpLCBpaSkpKSwgY29uY3VycmVudCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0eXBlb2YgcmVzdWx0U2VsZWN0b3IgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIGNvbmN1cnJlbnQgPSByZXN1bHRTZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBNZXJnZU1hcE9wZXJhdG9yKHByb2plY3QsIGNvbmN1cnJlbnQpKTsKICAgIH0KICAgIGNsYXNzIE1lcmdlTWFwT3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKHByb2plY3QsIGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpIHsKICAgICAgICAgICAgdGhpcy5wcm9qZWN0ID0gcHJvamVjdDsKICAgICAgICAgICAgdGhpcy5jb25jdXJyZW50ID0gY29uY3VycmVudDsKICAgICAgICB9CiAgICAgICAgY2FsbChvYnNlcnZlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBNZXJnZU1hcFN1YnNjcmliZXIob2JzZXJ2ZXIsIHRoaXMucHJvamVjdCwgdGhpcy5jb25jdXJyZW50KSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTWVyZ2VNYXBTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcHJvamVjdCwgY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgICAgIHRoaXMuY29uY3VycmVudCA9IGNvbmN1cnJlbnQ7CiAgICAgICAgICAgIHRoaXMuaGFzQ29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gW107CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gMDsKICAgICAgICAgICAgdGhpcy5pbmRleCA9IDA7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSA8IHRoaXMuY29uY3VycmVudCkgewogICAgICAgICAgICAgICAgdGhpcy5fdHJ5TmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmJ1ZmZlci5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfdHJ5TmV4dCh2YWx1ZSkgewogICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdCh2YWx1ZSwgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmFjdGl2ZSsrOwogICAgICAgICAgICB0aGlzLl9pbm5lclN1YihyZXN1bHQsIHZhbHVlLCBpbmRleCk7CiAgICAgICAgfQogICAgICAgIF9pbm5lclN1Yihpc2gsIHZhbHVlLCBpbmRleCkgewogICAgICAgICAgICBjb25zdCBpbm5lclN1YnNjcmliZXIgPSBuZXcgSW5uZXJTdWJzY3JpYmVyKHRoaXMsIHZhbHVlLCBpbmRleCk7CiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgICAgIGNvbnN0IGlubmVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgaXNoLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICAgICAgaWYgKGlubmVyU3Vic2NyaXB0aW9uICE9PSBpbm5lclN1YnNjcmliZXIpIHsKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChpbm5lclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX2NvbXBsZXRlKCkgewogICAgICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCAmJiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KGlubmVyVmFsdWUpOwogICAgICAgIH0KICAgICAgICBub3RpZnlDb21wbGV0ZShpbm5lclN1YikgewogICAgICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKICAgICAgICAgICAgdGhpcy5yZW1vdmUoaW5uZXJTdWIpOwogICAgICAgICAgICB0aGlzLmFjdGl2ZS0tOwogICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX25leHQoYnVmZmVyLnNoaWZ0KCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYWN0aXZlID09PSAwICYmIHRoaXMuaGFzQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbWVyZ2VBbGwoY29uY3VycmVudCA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSkgewogICAgICAgIHJldHVybiBtZXJnZU1hcChpZGVudGl0eSwgY29uY3VycmVudCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uY2F0QWxsKCkgewogICAgICAgIHJldHVybiBtZXJnZUFsbCgxKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb25jYXQoLi4ub2JzZXJ2YWJsZXMpIHsKICAgICAgICByZXR1cm4gY29uY2F0QWxsKCkob2YoLi4ub2JzZXJ2YWJsZXMpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBkZWZlcihvYnNlcnZhYmxlRmFjdG9yeSkgewogICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICAgICAgbGV0IGlucHV0OwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgaW5wdXQgPSBvYnNlcnZhYmxlRmFjdG9yeSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3Qgc291cmNlID0gaW5wdXQgPyBmcm9tKGlucHV0KSA6IEVNUFRZOwogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShzdWJzY3JpYmVyKTsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JrSm9pbiguLi5zb3VyY2VzKSB7CiAgICAgICAgaWYgKHNvdXJjZXMubGVuZ3RoID09PSAxKSB7CiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc291cmNlc1swXTsKICAgICAgICAgICAgaWYgKGlzQXJyYXkoZmlyc3QpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ya0pvaW5JbnRlcm5hbChmaXJzdCwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzT2JqZWN0KGZpcnN0KSAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZmlyc3QpID09PSBPYmplY3QucHJvdG90eXBlKSB7CiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZmlyc3QpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luSW50ZXJuYWwoa2V5cy5tYXAoa2V5ID0+IGZpcnN0W2tleV0pLCBrZXlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHNvdXJjZXNbc291cmNlcy5sZW5ndGggLSAxXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICBjb25zdCByZXN1bHRTZWxlY3RvciA9IHNvdXJjZXMucG9wKCk7CiAgICAgICAgICAgIHNvdXJjZXMgPSAoc291cmNlcy5sZW5ndGggPT09IDEgJiYgaXNBcnJheShzb3VyY2VzWzBdKSkgPyBzb3VyY2VzWzBdIDogc291cmNlczsKICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luSW50ZXJuYWwoc291cmNlcywgbnVsbCkucGlwZShtYXAoKGFyZ3MpID0+IHJlc3VsdFNlbGVjdG9yKC4uLmFyZ3MpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb3JrSm9pbkludGVybmFsKHNvdXJjZXMsIG51bGwpOwogICAgfQogICAgZnVuY3Rpb24gZm9ya0pvaW5JbnRlcm5hbChzb3VyY2VzLCBrZXlzKSB7CiAgICAgICAgcmV0dXJuIG5ldyBPYnNlcnZhYmxlKHN1YnNjcmliZXIgPT4gewogICAgICAgICAgICBjb25zdCBsZW4gPSBzb3VyY2VzLmxlbmd0aDsKICAgICAgICAgICAgaWYgKGxlbiA9PT0gMCkgewogICAgICAgICAgICAgICAgc3Vic2NyaWJlci5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IG5ldyBBcnJheShsZW4pOwogICAgICAgICAgICBsZXQgY29tcGxldGVkID0gMDsKICAgICAgICAgICAgbGV0IGVtaXR0ZWQgPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBmcm9tKHNvdXJjZXNbaV0pOwogICAgICAgICAgICAgICAgbGV0IGhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLmFkZChzb3VyY2Uuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgICAgICBuZXh0OiB2YWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaGFzVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtaXR0ZWQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIGVycm9yOiBlcnIgPT4gc3Vic2NyaWJlci5lcnJvcihlcnIpLAogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlOiAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlZCsrOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGxldGVkID09PSBsZW4gfHwgIWhhc1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZW1pdHRlZCA9PT0gbGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic2NyaWJlci5uZXh0KGtleXMgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlzLnJlZHVjZSgocmVzdWx0LCBrZXksIGkpID0+IChyZXN1bHRba2V5XSA9IHZhbHVlc1tpXSwgcmVzdWx0KSwge30pIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGZyb21FdmVudCh0YXJnZXQsIGV2ZW50TmFtZSwgb3B0aW9ucywgcmVzdWx0U2VsZWN0b3IpIHsKICAgICAgICBpZiAoaXNGdW5jdGlvbihvcHRpb25zKSkgewogICAgICAgICAgICByZXN1bHRTZWxlY3RvciA9IG9wdGlvbnM7CiAgICAgICAgICAgIG9wdGlvbnMgPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChyZXN1bHRTZWxlY3RvcikgewogICAgICAgICAgICByZXR1cm4gZnJvbUV2ZW50KHRhcmdldCwgZXZlbnROYW1lLCBvcHRpb25zKS5waXBlKG1hcChhcmdzID0+IGlzQXJyYXkoYXJncykgPyByZXN1bHRTZWxlY3RvciguLi5hcmdzKSA6IHJlc3VsdFNlbGVjdG9yKGFyZ3MpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZShzdWJzY3JpYmVyID0+IHsKICAgICAgICAgICAgZnVuY3Rpb24gaGFuZGxlcihlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0dXBTdWJzY3JpcHRpb24odGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gc2V0dXBTdWJzY3JpcHRpb24oc291cmNlT2JqLCBldmVudE5hbWUsIGhhbmRsZXIsIHN1YnNjcmliZXIsIG9wdGlvbnMpIHsKICAgICAgICBsZXQgdW5zdWJzY3JpYmU7CiAgICAgICAgaWYgKGlzRXZlbnRUYXJnZXQoc291cmNlT2JqKSkgewogICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzb3VyY2VPYmo7CiAgICAgICAgICAgIHNvdXJjZU9iai5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlciwgb3B0aW9ucyk7CiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4gc291cmNlLnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBoYW5kbGVyLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNKUXVlcnlTdHlsZUV2ZW50RW1pdHRlcihzb3VyY2VPYmopKSB7CiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZU9iajsKICAgICAgICAgICAgc291cmNlT2JqLm9uKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4gc291cmNlLm9mZihldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc05vZGVTdHlsZUV2ZW50RW1pdHRlcihzb3VyY2VPYmopKSB7CiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IHNvdXJjZU9iajsKICAgICAgICAgICAgc291cmNlT2JqLmFkZExpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICAgIHVuc3Vic2NyaWJlID0gKCkgPT4gc291cmNlLnJlbW92ZUxpc3RlbmVyKGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHNvdXJjZU9iaiAmJiBzb3VyY2VPYmoubGVuZ3RoKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSBzb3VyY2VPYmoubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIHNldHVwU3Vic2NyaXB0aW9uKHNvdXJjZU9ialtpXSwgZXZlbnROYW1lLCBoYW5kbGVyLCBzdWJzY3JpYmVyLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBldmVudCB0YXJnZXQnKTsKICAgICAgICB9CiAgICAgICAgc3Vic2NyaWJlci5hZGQodW5zdWJzY3JpYmUpOwogICAgfQogICAgZnVuY3Rpb24gaXNOb2RlU3R5bGVFdmVudEVtaXR0ZXIoc291cmNlT2JqKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZU9iaiAmJiB0eXBlb2Ygc291cmNlT2JqLmFkZExpc3RlbmVyID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBzb3VyY2VPYmoucmVtb3ZlTGlzdGVuZXIgPT09ICdmdW5jdGlvbic7CiAgICB9CiAgICBmdW5jdGlvbiBpc0pRdWVyeVN0eWxlRXZlbnRFbWl0dGVyKHNvdXJjZU9iaikgewogICAgICAgIHJldHVybiBzb3VyY2VPYmogJiYgdHlwZW9mIHNvdXJjZU9iai5vbiA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2Ygc291cmNlT2JqLm9mZiA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0KICAgIGZ1bmN0aW9uIGlzRXZlbnRUYXJnZXQoc291cmNlT2JqKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZU9iaiAmJiB0eXBlb2Ygc291cmNlT2JqLmFkZEV2ZW50TGlzdGVuZXIgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIHNvdXJjZU9iai5yZW1vdmVFdmVudExpc3RlbmVyID09PSAnZnVuY3Rpb24nOwogICAgfQoKICAgIGZ1bmN0aW9uIGlzTnVtZXJpYyh2YWwpIHsKICAgICAgICByZXR1cm4gIWlzQXJyYXkodmFsKSAmJiAodmFsIC0gcGFyc2VGbG9hdCh2YWwpICsgMSkgPj0gMDsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnZhbChwZXJpb2QgPSAwLCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgICAgIGlmICghaXNOdW1lcmljKHBlcmlvZCkgfHwgcGVyaW9kIDwgMCkgewogICAgICAgICAgICBwZXJpb2QgPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoIXNjaGVkdWxlciB8fCB0eXBlb2Ygc2NoZWR1bGVyLnNjaGVkdWxlICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHNjaGVkdWxlciA9IGFzeW5jOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgICAgIHN1YnNjcmliZXIuYWRkKHNjaGVkdWxlci5zY2hlZHVsZShkaXNwYXRjaCQxLCBwZXJpb2QsIHsgc3Vic2NyaWJlciwgY291bnRlcjogMCwgcGVyaW9kIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHN1YnNjcmliZXI7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBkaXNwYXRjaCQxKHN0YXRlKSB7CiAgICAgICAgY29uc3QgeyBzdWJzY3JpYmVyLCBjb3VudGVyLCBwZXJpb2QgfSA9IHN0YXRlOwogICAgICAgIHN1YnNjcmliZXIubmV4dChjb3VudGVyKTsKICAgICAgICB0aGlzLnNjaGVkdWxlKHsgc3Vic2NyaWJlciwgY291bnRlcjogY291bnRlciArIDEsIHBlcmlvZCB9LCBwZXJpb2QpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1lcmdlKC4uLm9ic2VydmFibGVzKSB7CiAgICAgICAgbGV0IGNvbmN1cnJlbnQgPSBOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFk7CiAgICAgICAgbGV0IHNjaGVkdWxlciA9IHVuZGVmaW5lZDsKICAgICAgICBsZXQgbGFzdCA9IG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdOwogICAgICAgIGlmIChpc1NjaGVkdWxlcihsYXN0KSkgewogICAgICAgICAgICBzY2hlZHVsZXIgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICAgICAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA+IDEgJiYgdHlwZW9mIG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgY29uY3VycmVudCA9IG9ic2VydmFibGVzLnBvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBsYXN0ID09PSAnbnVtYmVyJykgewogICAgICAgICAgICBjb25jdXJyZW50ID0gb2JzZXJ2YWJsZXMucG9wKCk7CiAgICAgICAgfQogICAgICAgIGlmICghc2NoZWR1bGVyICYmIG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSAmJiBvYnNlcnZhYmxlc1swXSBpbnN0YW5jZW9mIE9ic2VydmFibGUpIHsKICAgICAgICAgICAgcmV0dXJuIG9ic2VydmFibGVzWzBdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWVyZ2VBbGwoY29uY3VycmVudCkoZnJvbUFycmF5KG9ic2VydmFibGVzLCBzY2hlZHVsZXIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBmaWx0ZXIocHJlZGljYXRlLCB0aGlzQXJnKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGZpbHRlck9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgRmlsdGVyT3BlcmF0b3IocHJlZGljYXRlLCB0aGlzQXJnKSk7CiAgICAgICAgfTsKICAgIH0KICAgIGNsYXNzIEZpbHRlck9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihwcmVkaWNhdGUsIHRoaXNBcmcpIHsKICAgICAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CiAgICAgICAgICAgIHRoaXMudGhpc0FyZyA9IHRoaXNBcmc7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBGaWx0ZXJTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMucHJlZGljYXRlLCB0aGlzLnRoaXNBcmcpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBGaWx0ZXJTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHByZWRpY2F0ZSwgdGhpc0FyZykgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMucHJlZGljYXRlID0gcHJlZGljYXRlOwogICAgICAgICAgICB0aGlzLnRoaXNBcmcgPSB0aGlzQXJnOwogICAgICAgICAgICB0aGlzLmNvdW50ID0gMDsKICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJlZGljYXRlLmNhbGwodGhpcy50aGlzQXJnLCB2YWx1ZSwgdGhpcy5jb3VudCsrKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lcihkdWVUaW1lID0gMCwgcGVyaW9kT3JTY2hlZHVsZXIsIHNjaGVkdWxlcikgewogICAgICAgIGxldCBwZXJpb2QgPSAtMTsKICAgICAgICBpZiAoaXNOdW1lcmljKHBlcmlvZE9yU2NoZWR1bGVyKSkgewogICAgICAgICAgICBwZXJpb2QgPSBOdW1iZXIocGVyaW9kT3JTY2hlZHVsZXIpIDwgMSAmJiAxIHx8IE51bWJlcihwZXJpb2RPclNjaGVkdWxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzU2NoZWR1bGVyKHBlcmlvZE9yU2NoZWR1bGVyKSkgewogICAgICAgICAgICBzY2hlZHVsZXIgPSBwZXJpb2RPclNjaGVkdWxlcjsKICAgICAgICB9CiAgICAgICAgaWYgKCFpc1NjaGVkdWxlcihzY2hlZHVsZXIpKSB7CiAgICAgICAgICAgIHNjaGVkdWxlciA9IGFzeW5jOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoc3Vic2NyaWJlciA9PiB7CiAgICAgICAgICAgIGNvbnN0IGR1ZSA9IGlzTnVtZXJpYyhkdWVUaW1lKQogICAgICAgICAgICAgICAgPyBkdWVUaW1lCiAgICAgICAgICAgICAgICA6ICgrZHVlVGltZSAtIHNjaGVkdWxlci5ub3coKSk7CiAgICAgICAgICAgIHJldHVybiBzY2hlZHVsZXIuc2NoZWR1bGUoZGlzcGF0Y2gkMiwgZHVlLCB7CiAgICAgICAgICAgICAgICBpbmRleDogMCwgcGVyaW9kLCBzdWJzY3JpYmVyCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gZGlzcGF0Y2gkMihzdGF0ZSkgewogICAgICAgIGNvbnN0IHsgaW5kZXgsIHBlcmlvZCwgc3Vic2NyaWJlciB9ID0gc3RhdGU7CiAgICAgICAgc3Vic2NyaWJlci5uZXh0KGluZGV4KTsKICAgICAgICBpZiAoc3Vic2NyaWJlci5jbG9zZWQpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwZXJpb2QgPT09IC0xKSB7CiAgICAgICAgICAgIHJldHVybiBzdWJzY3JpYmVyLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIHN0YXRlLmluZGV4ID0gaW5kZXggKyAxOwogICAgICAgIHRoaXMuc2NoZWR1bGUoc3RhdGUsIHBlcmlvZCk7CiAgICB9CgogICAgZnVuY3Rpb24gemlwKC4uLm9ic2VydmFibGVzKSB7CiAgICAgICAgY29uc3QgbGFzdCA9IG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdOwogICAgICAgIGxldCByZXN1bHRTZWxlY3RvciA9IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIGxhc3QgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmVzdWx0U2VsZWN0b3IgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZyb21BcnJheShvYnNlcnZhYmxlcywgdW5kZWZpbmVkKS5saWZ0KG5ldyBaaXBPcGVyYXRvcihyZXN1bHRTZWxlY3RvcikpOwogICAgfQogICAgY2xhc3MgWmlwT3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFppcFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5yZXN1bHRTZWxlY3RvcikpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFppcFN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcmVzdWx0U2VsZWN0b3IsIHZhbHVlcyA9IE9iamVjdC5jcmVhdGUobnVsbCkpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLml0ZXJhdG9ycyA9IFtdOwogICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IDA7CiAgICAgICAgICAgIHRoaXMucmVzdWx0U2VsZWN0b3IgPSByZXN1bHRTZWxlY3RvcjsKICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSB2YWx1ZXM7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9ycyA9IHRoaXMuaXRlcmF0b3JzOwogICAgICAgICAgICBpZiAoaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIGl0ZXJhdG9ycy5wdXNoKG5ldyBTdGF0aWNBcnJheUl0ZXJhdG9yKHZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlW2l0ZXJhdG9yXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgaXRlcmF0b3JzLnB1c2gobmV3IFN0YXRpY0l0ZXJhdG9yKHZhbHVlW2l0ZXJhdG9yXSgpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpdGVyYXRvcnMucHVzaChuZXcgWmlwQnVmZmVySXRlcmF0b3IodGhpcy5kZXN0aW5hdGlvbiwgdGhpcywgdmFsdWUpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIGNvbnN0IGl0ZXJhdG9ycyA9IHRoaXMuaXRlcmF0b3JzOwogICAgICAgICAgICBjb25zdCBsZW4gPSBpdGVyYXRvcnMubGVuZ3RoOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIGlmIChsZW4gPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmFjdGl2ZSA9IGxlbjsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgbGV0IGl0ZXJhdG9yID0gaXRlcmF0b3JzW2ldOwogICAgICAgICAgICAgICAgaWYgKGl0ZXJhdG9yLnN0aWxsVW5zdWJzY3JpYmVkKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChpdGVyYXRvci5zdWJzY3JpYmUoaXRlcmF0b3IsIGkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlLS07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbm90aWZ5SW5hY3RpdmUoKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlLS07CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNoZWNrSXRlcmF0b3JzKCkgewogICAgICAgICAgICBjb25zdCBpdGVyYXRvcnMgPSB0aGlzLml0ZXJhdG9yczsKICAgICAgICAgICAgY29uc3QgbGVuID0gaXRlcmF0b3JzLmxlbmd0aDsKICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgaXRlcmF0b3IgPSBpdGVyYXRvcnNbaV07CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGl0ZXJhdG9yLmhhc1ZhbHVlID09PSAnZnVuY3Rpb24nICYmICFpdGVyYXRvci5oYXNWYWx1ZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBzaG91bGRDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgICAgICBjb25zdCBhcmdzID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIGxldCBpdGVyYXRvciA9IGl0ZXJhdG9yc1tpXTsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgICAgICAgICBpZiAoaXRlcmF0b3IuaGFzQ29tcGxldGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICBzaG91bGRDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocmVzdWx0LmRvbmUpIHsKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGFyZ3MucHVzaChyZXN1bHQudmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLnJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cnlyZXN1bHRTZWxlY3RvcihhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNob3VsZENvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF90cnlyZXN1bHRTZWxlY3RvcihhcmdzKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnJlc3VsdFNlbGVjdG9yLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTdGF0aWNJdGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IoaXRlcmF0b3IpIHsKICAgICAgICAgICAgdGhpcy5pdGVyYXRvciA9IGl0ZXJhdG9yOwogICAgICAgICAgICB0aGlzLm5leHRSZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIGhhc1ZhbHVlKCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgbmV4dCgpIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5uZXh0UmVzdWx0OwogICAgICAgICAgICB0aGlzLm5leHRSZXN1bHQgPSB0aGlzLml0ZXJhdG9yLm5leHQoKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgaGFzQ29tcGxldGVkKCkgewogICAgICAgICAgICBjb25zdCBuZXh0UmVzdWx0ID0gdGhpcy5uZXh0UmVzdWx0OwogICAgICAgICAgICByZXR1cm4gbmV4dFJlc3VsdCAmJiAhIW5leHRSZXN1bHQuZG9uZTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTdGF0aWNBcnJheUl0ZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihhcnJheSkgewogICAgICAgICAgICB0aGlzLmFycmF5ID0gYXJyYXk7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIHRoaXMubGVuZ3RoID0gYXJyYXkubGVuZ3RoOwogICAgICAgIH0KICAgICAgICBbaXRlcmF0b3JdKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCBpID0gdGhpcy5pbmRleCsrOwogICAgICAgICAgICBjb25zdCBhcnJheSA9IHRoaXMuYXJyYXk7CiAgICAgICAgICAgIHJldHVybiBpIDwgdGhpcy5sZW5ndGggPyB7IHZhbHVlOiBhcnJheVtpXSwgZG9uZTogZmFsc2UgfSA6IHsgdmFsdWU6IG51bGwsIGRvbmU6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgaGFzVmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFycmF5Lmxlbmd0aCA+IHRoaXMuaW5kZXg7CiAgICAgICAgfQogICAgICAgIGhhc0NvbXBsZXRlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXJyYXkubGVuZ3RoID09PSB0aGlzLmluZGV4OwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFppcEJ1ZmZlckl0ZXJhdG9yIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcGFyZW50LCBvYnNlcnZhYmxlKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHRoaXMub2JzZXJ2YWJsZSA9IG9ic2VydmFibGU7CiAgICAgICAgICAgIHRoaXMuc3RpbGxVbnN1YnNjcmliZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IFtdOwogICAgICAgICAgICB0aGlzLmlzQ29tcGxldGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgW2l0ZXJhdG9yXSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIG5leHQoKSB7CiAgICAgICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwogICAgICAgICAgICBpZiAoYnVmZmVyLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmlzQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiBudWxsLCBkb25lOiB0cnVlIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogYnVmZmVyLnNoaWZ0KCksIGRvbmU6IGZhbHNlIH07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaGFzVmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGggPiAwOwogICAgICAgIH0KICAgICAgICBoYXNDb21wbGV0ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1ZmZlci5sZW5ndGggPT09IDAgJiYgdGhpcy5pc0NvbXBsZXRlOwogICAgICAgIH0KICAgICAgICBub3RpZnlDb21wbGV0ZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuYnVmZmVyLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuaXNDb21wbGV0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLnBhcmVudC5ub3RpZnlJbmFjdGl2ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy5idWZmZXIucHVzaChpbm5lclZhbHVlKTsKICAgICAgICAgICAgdGhpcy5wYXJlbnQuY2hlY2tJdGVyYXRvcnMoKTsKICAgICAgICB9CiAgICAgICAgc3Vic2NyaWJlKHZhbHVlLCBpbmRleCkgewogICAgICAgICAgICByZXR1cm4gc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgdGhpcy5vYnNlcnZhYmxlLCB0aGlzLCBpbmRleCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGF1ZGl0KGR1cmF0aW9uU2VsZWN0b3IpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gYXVkaXRPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IEF1ZGl0T3BlcmF0b3IoZHVyYXRpb25TZWxlY3RvcikpOwogICAgICAgIH07CiAgICB9CiAgICBjbGFzcyBBdWRpdE9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihkdXJhdGlvblNlbGVjdG9yKSB7CiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBBdWRpdFN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgQXVkaXRTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMudGhyb3R0bGVkID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKCF0aGlzLnRocm90dGxlZCkgewogICAgICAgICAgICAgICAgbGV0IGR1cmF0aW9uOwogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB7IGR1cmF0aW9uU2VsZWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkdXJhdGlvblNlbGVjdG9yKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbik7CiAgICAgICAgICAgICAgICBpZiAoIWlubmVyU3Vic2NyaXB0aW9uIHx8IGlubmVyU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJUaHJvdHRsZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGQodGhpcy50aHJvdHRsZWQgPSBpbm5lclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2xlYXJUaHJvdHRsZSgpIHsKICAgICAgICAgICAgY29uc3QgeyB2YWx1ZSwgaGFzVmFsdWUsIHRocm90dGxlZCB9ID0gdGhpczsKICAgICAgICAgICAgaWYgKHRocm90dGxlZCkgewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUodGhyb3R0bGVkKTsKICAgICAgICAgICAgICAgIHRoaXMudGhyb3R0bGVkID0gbnVsbDsKICAgICAgICAgICAgICAgIHRocm90dGxlZC51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChoYXNWYWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG51bGw7CiAgICAgICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCkgewogICAgICAgICAgICB0aGlzLmNsZWFyVGhyb3R0bGUoKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29tcGxldGUoKSB7CiAgICAgICAgICAgIHRoaXMuY2xlYXJUaHJvdHRsZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBhdWRpdFRpbWUoZHVyYXRpb24sIHNjaGVkdWxlciA9IGFzeW5jKSB7CiAgICAgICAgcmV0dXJuIGF1ZGl0KCgpID0+IHRpbWVyKGR1cmF0aW9uLCBzY2hlZHVsZXIpKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjYXRjaEVycm9yKHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGNhdGNoRXJyb3JPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICBjb25zdCBvcGVyYXRvciA9IG5ldyBDYXRjaE9wZXJhdG9yKHNlbGVjdG9yKTsKICAgICAgICAgICAgY29uc3QgY2F1Z2h0ID0gc291cmNlLmxpZnQob3BlcmF0b3IpOwogICAgICAgICAgICByZXR1cm4gKG9wZXJhdG9yLmNhdWdodCA9IGNhdWdodCk7CiAgICAgICAgfTsKICAgIH0KICAgIGNsYXNzIENhdGNoT3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKHNlbGVjdG9yKSB7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IENhdGNoU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnNlbGVjdG9yLCB0aGlzLmNhdWdodCkpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIENhdGNoU3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHNlbGVjdG9yLCBjYXVnaHQpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLnNlbGVjdG9yID0gc2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMuY2F1Z2h0ID0gY2F1Z2h0OwogICAgICAgIH0KICAgICAgICBlcnJvcihlcnIpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzU3RvcHBlZCkgewogICAgICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5zZWxlY3RvcihlcnIsIHRoaXMuY2F1Z2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIyKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIuZXJyb3IoZXJyMik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fdW5zdWJzY3JpYmVBbmRSZWN5Y2xlKCk7CiAgICAgICAgICAgICAgICBjb25zdCBpbm5lclN1YnNjcmliZXIgPSBuZXcgSW5uZXJTdWJzY3JpYmVyKHRoaXMsIHVuZGVmaW5lZCwgdW5kZWZpbmVkKTsKICAgICAgICAgICAgICAgIHRoaXMuYWRkKGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgICAgICAgICBjb25zdCBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJlc3VsdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgICAgICAgICBpZiAoaW5uZXJTdWJzY3JpcHRpb24gIT09IGlubmVyU3Vic2NyaWJlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkKGlubmVyU3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0JDEoLi4ub2JzZXJ2YWJsZXMpIHsKICAgICAgICBsZXQgcHJvamVjdCA9IHVuZGVmaW5lZDsKICAgICAgICBpZiAodHlwZW9mIG9ic2VydmFibGVzW29ic2VydmFibGVzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgIHByb2plY3QgPSBvYnNlcnZhYmxlcy5wb3AoKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9ic2VydmFibGVzLmxlbmd0aCA9PT0gMSAmJiBpc0FycmF5KG9ic2VydmFibGVzWzBdKSkgewogICAgICAgICAgICBvYnNlcnZhYmxlcyA9IG9ic2VydmFibGVzWzBdLnNsaWNlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdC5jYWxsKGZyb20oW3NvdXJjZSwgLi4ub2JzZXJ2YWJsZXNdKSwgbmV3IENvbWJpbmVMYXRlc3RPcGVyYXRvcihwcm9qZWN0KSk7CiAgICB9CiAgICBmdW5jdGlvbiBjb21iaW5lTGF0ZXN0V2l0aCguLi5vdGhlclNvdXJjZXMpIHsKICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdCQxKC4uLm90aGVyU291cmNlcyk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uY2F0TWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gbWVyZ2VNYXAocHJvamVjdCwgcmVzdWx0U2VsZWN0b3IsIDEpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWVyZ2VNYXAocHJvamVjdCwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVib3VuY2UoZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRGVib3VuY2VPcGVyYXRvcihkdXJhdGlvblNlbGVjdG9yKSk7CiAgICB9CiAgICBjbGFzcyBEZWJvdW5jZU9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihkdXJhdGlvblNlbGVjdG9yKSB7CiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWJvdW5jZVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kdXJhdGlvblNlbGVjdG9yKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgRGVib3VuY2VTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZHVyYXRpb25TZWxlY3RvcikgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25TZWxlY3RvciA9IGR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5kdXJhdGlvblNlbGVjdG9yLmNhbGwodGhpcywgdmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyeU5leHQodmFsdWUsIHJlc3VsdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgdGhpcy5lbWl0VmFsdWUoKTsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICBfdHJ5TmV4dCh2YWx1ZSwgZHVyYXRpb24pIHsKICAgICAgICAgICAgbGV0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb247CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBzdWJzY3JpYmVUb1Jlc3VsdCh0aGlzLCBkdXJhdGlvbik7CiAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb24gJiYgIXN1YnNjcmlwdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWRkKHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb24gPSBzdWJzY3JpcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy5lbWl0VmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29tcGxldGUoKSB7CiAgICAgICAgICAgIHRoaXMuZW1pdFZhbHVlKCk7CiAgICAgICAgfQogICAgICAgIGVtaXRWYWx1ZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzVmFsdWUpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuZHVyYXRpb25TdWJzY3JpcHRpb247CiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kdXJhdGlvblN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5oYXNWYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3VwZXIuX25leHQodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlYm91bmNlVGltZShkdWVUaW1lLCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRGVib3VuY2VUaW1lT3BlcmF0b3IoZHVlVGltZSwgc2NoZWR1bGVyKSk7CiAgICB9CiAgICBjbGFzcyBEZWJvdW5jZVRpbWVPcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IoZHVlVGltZSwgc2NoZWR1bGVyKSB7CiAgICAgICAgICAgIHRoaXMuZHVlVGltZSA9IGR1ZVRpbWU7CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVib3VuY2VUaW1lU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLmR1ZVRpbWUsIHRoaXMuc2NoZWR1bGVyKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgRGVib3VuY2VUaW1lU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBkdWVUaW1lLCBzY2hlZHVsZXIpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLmR1ZVRpbWUgPSBkdWVUaW1lOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgICAgICB0aGlzLmxhc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5jbGVhckRlYm91bmNlKCk7CiAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmFkZCh0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTmV4dCwgdGhpcy5kdWVUaW1lLCB0aGlzKSk7CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgdGhpcy5kZWJvdW5jZWROZXh0KCk7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgZGVib3VuY2VkTmV4dCgpIHsKICAgICAgICAgICAgdGhpcy5jbGVhckRlYm91bmNlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLmhhc1ZhbHVlKSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IGxhc3RWYWx1ZSB9ID0gdGhpczsKICAgICAgICAgICAgICAgIHRoaXMubGFzdFZhbHVlID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChsYXN0VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNsZWFyRGVib3VuY2UoKSB7CiAgICAgICAgICAgIGNvbnN0IGRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IHRoaXMuZGVib3VuY2VkU3Vic2NyaXB0aW9uOwogICAgICAgICAgICBpZiAoZGVib3VuY2VkU3Vic2NyaXB0aW9uICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZShkZWJvdW5jZWRTdWJzY3JpcHRpb24pOwogICAgICAgICAgICAgICAgZGVib3VuY2VkU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmRlYm91bmNlZFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkaXNwYXRjaE5leHQoc3Vic2NyaWJlcikgewogICAgICAgIHN1YnNjcmliZXIuZGVib3VuY2VkTmV4dCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSA9IG51bGwpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IERlZmF1bHRJZkVtcHR5T3BlcmF0b3IoZGVmYXVsdFZhbHVlKSk7CiAgICB9CiAgICBjbGFzcyBEZWZhdWx0SWZFbXB0eU9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kZWZhdWx0VmFsdWUpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBEZWZhdWx0SWZFbXB0eVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7CiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuaXNFbXB0eSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRW1wdHkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLmRlZmF1bHRWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBpc0RhdGUodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBEYXRlICYmICFpc05hTigrdmFsdWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlbGF5KGRlbGF5LCBzY2hlZHVsZXIgPSBhc3luYykgewogICAgICAgIGNvbnN0IGFic29sdXRlRGVsYXkgPSBpc0RhdGUoZGVsYXkpOwogICAgICAgIGNvbnN0IGRlbGF5Rm9yID0gYWJzb2x1dGVEZWxheSA/ICgrZGVsYXkgLSBzY2hlZHVsZXIubm93KCkpIDogTWF0aC5hYnMoZGVsYXkpOwogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRGVsYXlPcGVyYXRvcihkZWxheUZvciwgc2NoZWR1bGVyKSk7CiAgICB9CiAgICBjbGFzcyBEZWxheU9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZWxheSwgc2NoZWR1bGVyKSB7CiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBEZWxheVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kZWxheSwgdGhpcy5zY2hlZHVsZXIpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBEZWxheVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZGVsYXksIHNjaGVkdWxlcikgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuZGVsYXkgPSBkZWxheTsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZXIgPSBzY2hlZHVsZXI7CiAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTsKICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5lcnJvcmVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIHN0YXRpYyBkaXNwYXRjaChzdGF0ZSkgewogICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBzdGF0ZS5zb3VyY2U7CiAgICAgICAgICAgIGNvbnN0IHF1ZXVlID0gc291cmNlLnF1ZXVlOwogICAgICAgICAgICBjb25zdCBzY2hlZHVsZXIgPSBzdGF0ZS5zY2hlZHVsZXI7CiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gc3RhdGUuZGVzdGluYXRpb247CiAgICAgICAgICAgIHdoaWxlIChxdWV1ZS5sZW5ndGggPiAwICYmIChxdWV1ZVswXS50aW1lIC0gc2NoZWR1bGVyLm5vdygpKSA8PSAwKSB7CiAgICAgICAgICAgICAgICBxdWV1ZS5zaGlmdCgpLm5vdGlmaWNhdGlvbi5vYnNlcnZlKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBNYXRoLm1heCgwLCBxdWV1ZVswXS50aW1lIC0gc2NoZWR1bGVyLm5vdygpKTsKICAgICAgICAgICAgICAgIHRoaXMuc2NoZWR1bGUoc3RhdGUsIGRlbGF5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzb3VyY2UuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICBzb3VyY2UuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIHNvdXJjZS5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHNvdXJjZS5hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfc2NoZWR1bGUoc2NoZWR1bGVyKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gdHJ1ZTsKICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICBkZXN0aW5hdGlvbi5hZGQoc2NoZWR1bGVyLnNjaGVkdWxlKERlbGF5U3Vic2NyaWJlci5kaXNwYXRjaCwgdGhpcy5kZWxheSwgewogICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLCBkZXN0aW5hdGlvbjogdGhpcy5kZXN0aW5hdGlvbiwgc2NoZWR1bGVyOiBzY2hlZHVsZXIKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBzY2hlZHVsZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb24pIHsKICAgICAgICAgICAgaWYgKHRoaXMuZXJyb3JlZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHNjaGVkdWxlciA9IHRoaXMuc2NoZWR1bGVyOwogICAgICAgICAgICBjb25zdCBtZXNzYWdlID0gbmV3IERlbGF5TWVzc2FnZShzY2hlZHVsZXIubm93KCkgKyB0aGlzLmRlbGF5LCBub3RpZmljYXRpb24pOwogICAgICAgICAgICB0aGlzLnF1ZXVlLnB1c2gobWVzc2FnZSk7CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlKHNjaGVkdWxlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5zY2hlZHVsZU5vdGlmaWNhdGlvbihOb3RpZmljYXRpb24uY3JlYXRlTmV4dCh2YWx1ZSkpOwogICAgICAgIH0KICAgICAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZXJyb3JlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMucXVldWUgPSBbXTsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucXVldWUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIERlbGF5TWVzc2FnZSB7CiAgICAgICAgY29uc3RydWN0b3IodGltZSwgbm90aWZpY2F0aW9uKSB7CiAgICAgICAgICAgIHRoaXMudGltZSA9IHRpbWU7CiAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uID0gbm90aWZpY2F0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkZWxheVdoZW4oZGVsYXlEdXJhdGlvblNlbGVjdG9yLCBzdWJzY3JpcHRpb25EZWxheSkgewogICAgICAgIGlmIChzdWJzY3JpcHRpb25EZWxheSkgewogICAgICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gbmV3IFN1YnNjcmlwdGlvbkRlbGF5T2JzZXJ2YWJsZShzb3VyY2UsIHN1YnNjcmlwdGlvbkRlbGF5KQogICAgICAgICAgICAgICAgLmxpZnQobmV3IERlbGF5V2hlbk9wZXJhdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IERlbGF5V2hlbk9wZXJhdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikpOwogICAgfQogICAgY2xhc3MgRGVsYXlXaGVuT3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKGRlbGF5RHVyYXRpb25TZWxlY3RvcikgewogICAgICAgICAgICB0aGlzLmRlbGF5RHVyYXRpb25TZWxlY3RvciA9IGRlbGF5RHVyYXRpb25TZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IERlbGF5V2hlblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5kZWxheUR1cmF0aW9uU2VsZWN0b3IpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBEZWxheVdoZW5TdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgZGVsYXlEdXJhdGlvblNlbGVjdG9yKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5kZWxheUR1cmF0aW9uU2VsZWN0b3IgPSBkZWxheUR1cmF0aW9uU2VsZWN0b3I7CiAgICAgICAgICAgIHRoaXMuY29tcGxldGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5pbmRleCA9IDA7CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KG91dGVyVmFsdWUpOwogICAgICAgICAgICB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihpbm5lclN1Yik7CiAgICAgICAgICAgIHRoaXMudHJ5Q29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5RXJyb3IoZXJyb3IsIGlubmVyU3ViKSB7CiAgICAgICAgICAgIHRoaXMuX2Vycm9yKGVycm9yKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLnJlbW92ZVN1YnNjcmlwdGlvbihpbm5lclN1Yik7CiAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnRyeUNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCsrOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgY29uc3QgZGVsYXlOb3RpZmllciA9IHRoaXMuZGVsYXlEdXJhdGlvblNlbGVjdG9yKHZhbHVlLCBpbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoZGVsYXlOb3RpZmllcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMudHJ5RGVsYXkoZGVsYXlOb3RpZmllciwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIHRoaXMuY29tcGxldGVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy50cnlDb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIHJlbW92ZVN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbklkeCA9IHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMuaW5kZXhPZihzdWJzY3JpcHRpb24pOwogICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uSWR4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgdGhpcy5kZWxheU5vdGlmaWVyU3Vic2NyaXB0aW9ucy5zcGxpY2Uoc3Vic2NyaXB0aW9uSWR4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uLm91dGVyVmFsdWU7CiAgICAgICAgfQogICAgICAgIHRyeURlbGF5KGRlbGF5Tm90aWZpZXIsIHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IG5vdGlmaWVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgZGVsYXlOb3RpZmllciwgdmFsdWUpOwogICAgICAgICAgICBpZiAobm90aWZpZXJTdWJzY3JpcHRpb24gJiYgIW5vdGlmaWVyU3Vic2NyaXB0aW9uLmNsb3NlZCkgewogICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKG5vdGlmaWVyU3Vic2NyaXB0aW9uKTsKICAgICAgICAgICAgICAgIHRoaXMuZGVsYXlOb3RpZmllclN1YnNjcmlwdGlvbnMucHVzaChub3RpZmllclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdHJ5Q29tcGxldGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbXBsZXRlZCAmJiB0aGlzLmRlbGF5Tm90aWZpZXJTdWJzY3JpcHRpb25zLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgU3Vic2NyaXB0aW9uRGVsYXlPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICAgICAgY29uc3RydWN0b3Ioc291cmNlLCBzdWJzY3JpcHRpb25EZWxheSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25EZWxheSA9IHN1YnNjcmlwdGlvbkRlbGF5OwogICAgICAgIH0KICAgICAgICBfc3Vic2NyaWJlKHN1YnNjcmliZXIpIHsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpcHRpb25EZWxheS5zdWJzY3JpYmUobmV3IFN1YnNjcmlwdGlvbkRlbGF5U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnNvdXJjZSkpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFN1YnNjcmlwdGlvbkRlbGF5U3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgc291cmNlKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgdGhpcy5zb3VyY2VTdWJzY3JpYmVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHVudXNlZCkgewogICAgICAgICAgICB0aGlzLnN1YnNjcmliZVRvU291cmNlKCk7CiAgICAgICAgfQogICAgICAgIF9lcnJvcihlcnIpIHsKICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLnBhcmVudC5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1NvdXJjZSgpOwogICAgICAgIH0KICAgICAgICBzdWJzY3JpYmVUb1NvdXJjZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNvdXJjZVN1YnNjcmliZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc291cmNlU3Vic2NyaWJlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZS5zdWJzY3JpYmUodGhpcy5wYXJlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlbWF0ZXJpYWxpemUoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGRlbWF0ZXJpYWxpemVPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IERlTWF0ZXJpYWxpemVPcGVyYXRvcigpKTsKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgRGVNYXRlcmlhbGl6ZU9wZXJhdG9yIHsKICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGVNYXRlcmlhbGl6ZVN1YnNjcmliZXIoc3Vic2NyaWJlcikpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIERlTWF0ZXJpYWxpemVTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24pIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICB2YWx1ZS5vYnNlcnZlKHRoaXMuZGVzdGluYXRpb24pOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBkaXN0aW5jdFVudGlsQ2hhbmdlZChjb21wYXJlLCBrZXlTZWxlY3RvcikgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRGlzdGluY3RVbnRpbENoYW5nZWRPcGVyYXRvcihjb21wYXJlLCBrZXlTZWxlY3RvcikpOwogICAgfQogICAgY2xhc3MgRGlzdGluY3RVbnRpbENoYW5nZWRPcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IoY29tcGFyZSwga2V5U2VsZWN0b3IpIHsKICAgICAgICAgICAgdGhpcy5jb21wYXJlID0gY29tcGFyZTsKICAgICAgICAgICAgdGhpcy5rZXlTZWxlY3RvciA9IGtleVNlbGVjdG9yOwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgRGlzdGluY3RVbnRpbENoYW5nZWRTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY29tcGFyZSwgdGhpcy5rZXlTZWxlY3RvcikpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIERpc3RpbmN0VW50aWxDaGFuZ2VkU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjb21wYXJlLCBrZXlTZWxlY3RvcikgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMua2V5U2VsZWN0b3IgPSBrZXlTZWxlY3RvcjsKICAgICAgICAgICAgdGhpcy5oYXNLZXkgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBjb21wYXJlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbXBhcmUgPSBjb21wYXJlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbXBhcmUoeCwgeSkgewogICAgICAgICAgICByZXR1cm4geCA9PT0geTsKICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgbGV0IGtleTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGNvbnN0IHsga2V5U2VsZWN0b3IgfSA9IHRoaXM7CiAgICAgICAgICAgICAgICBrZXkgPSBrZXlTZWxlY3RvciA/IGtleVNlbGVjdG9yKHZhbHVlKSA6IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IHJlc3VsdCA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5oYXNLZXkpIHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBjb21wYXJlIH0gPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNvbXBhcmUodGhpcy5rZXksIGtleSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuaGFzS2V5ID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRocm93SWZFbXB0eShlcnJvckZhY3RvcnkgPSBkZWZhdWx0RXJyb3JGYWN0b3J5KSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBUaHJvd0lmRW1wdHlPcGVyYXRvcihlcnJvckZhY3RvcnkpKTsKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgVGhyb3dJZkVtcHR5T3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKGVycm9yRmFjdG9yeSkgewogICAgICAgICAgICB0aGlzLmVycm9yRmFjdG9yeSA9IGVycm9yRmFjdG9yeTsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRocm93SWZFbXB0eVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5lcnJvckZhY3RvcnkpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUaHJvd0lmRW1wdHlTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIGVycm9yRmFjdG9yeSkgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuZXJyb3JGYWN0b3J5ID0gZXJyb3JGYWN0b3J5OwogICAgICAgICAgICB0aGlzLmhhc1ZhbHVlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuaGFzVmFsdWUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5oYXNWYWx1ZSkgewogICAgICAgICAgICAgICAgbGV0IGVycjsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gdGhpcy5lcnJvckZhY3RvcnkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgZXJyID0gZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkZWZhdWx0RXJyb3JGYWN0b3J5KCkgewogICAgICAgIHJldHVybiBuZXcgRW1wdHlFcnJvcigpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRha2UoY291bnQpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gewogICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgVGFrZU9wZXJhdG9yKGNvdW50KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgY2xhc3MgVGFrZU9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3Rvcih0b3RhbCkgewogICAgICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICAgICAgICAgIGlmICh0aGlzLnRvdGFsIDwgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYWtlU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnRvdGFsKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgVGFrZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgdG90YWwpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLnRvdGFsID0gdG90YWw7CiAgICAgICAgICAgIHRoaXMuY291bnQgPSAwOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCB0b3RhbCA9IHRoaXMudG90YWw7CiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gKyt0aGlzLmNvdW50OwogICAgICAgICAgICBpZiAoY291bnQgPD0gdG90YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAoY291bnQgPT09IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBleGhhdXN0TWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgaWYgKHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UucGlwZShleGhhdXN0TWFwKChhLCBpKSA9PiBmcm9tKHByb2plY3QoYSwgaSkpLnBpcGUobWFwKChiLCBpaSkgPT4gcmVzdWx0U2VsZWN0b3IoYSwgYiwgaSwgaWkpKSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBFeGhhdXN0TWFwT3BlcmF0b3IocHJvamVjdCkpOwogICAgfQogICAgY2xhc3MgRXhoYXVzdE1hcE9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3Rvcihwcm9qZWN0KSB7CiAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBFeGhhdXN0TWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBFeGhhdXN0TWFwU3Vic2NyaWJlciBleHRlbmRzIE91dGVyU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHByb2plY3QpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgICAgICAgICB0aGlzLmhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmhhc0NvbXBsZXRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmluZGV4ID0gMDsKICAgICAgICB9CiAgICAgICAgX25leHQodmFsdWUpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1N1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy50cnlOZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB0cnlOZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5pbmRleCsrOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gdGhpcy5wcm9qZWN0KHZhbHVlLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuaGFzU3Vic2NyaXB0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5faW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBfaW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcih0aGlzLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChpbm5lclN1YnNjcmliZXIpOwogICAgICAgICAgICBjb25zdCBpbm5lclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJlc3VsdCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIGlubmVyU3Vic2NyaWJlcik7CiAgICAgICAgICAgIGlmIChpbm5lclN1YnNjcmlwdGlvbiAhPT0gaW5uZXJTdWJzY3JpYmVyKSB7CiAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5hZGQoaW5uZXJTdWJzY3JpcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgdGhpcy5oYXNDb21wbGV0ZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAoIXRoaXMuaGFzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5RXJyb3IoZXJyKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICBkZXN0aW5hdGlvbi5yZW1vdmUoaW5uZXJTdWIpOwogICAgICAgICAgICB0aGlzLmhhc1N1YnNjcmlwdGlvbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5oYXNDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBmaW5hbGl6ZShjYWxsYmFjaykgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgRmluYWxseU9wZXJhdG9yKGNhbGxiYWNrKSk7CiAgICB9CiAgICBjbGFzcyBGaW5hbGx5T3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IEZpbmFsbHlTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuY2FsbGJhY2spKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBGaW5hbGx5U3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBjYWxsYmFjaykgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuYWRkKG5ldyBTdWJzY3JpcHRpb24oY2FsbGJhY2spKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaWdub3JlRWxlbWVudHMoKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIGlnbm9yZUVsZW1lbnRzT3BlcmF0b3JGdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBJZ25vcmVFbGVtZW50c09wZXJhdG9yKCkpOwogICAgICAgIH07CiAgICB9CiAgICBjbGFzcyBJZ25vcmVFbGVtZW50c09wZXJhdG9yIHsKICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgSWdub3JlRWxlbWVudHNTdWJzY3JpYmVyKHN1YnNjcmliZXIpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBJZ25vcmVFbGVtZW50c1N1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBfbmV4dCh1bnVzZWQpIHsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdGFrZUxhc3QoY291bnQpIHsKICAgICAgICByZXR1cm4gZnVuY3Rpb24gdGFrZUxhc3RPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICBpZiAoY291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgVGFrZUxhc3RPcGVyYXRvcihjb3VudCkpOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGNsYXNzIFRha2VMYXN0T3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKHRvdGFsKSB7CiAgICAgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDsKICAgICAgICAgICAgaWYgKHRoaXMudG90YWwgPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXJyb3I7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFRha2VMYXN0U3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnRvdGFsKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgVGFrZUxhc3RTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIHRvdGFsKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy50b3RhbCA9IHRvdGFsOwogICAgICAgICAgICB0aGlzLnJpbmcgPSBuZXcgQXJyYXkoKTsKICAgICAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IHJpbmcgPSB0aGlzLnJpbmc7CiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy50b3RhbDsKICAgICAgICAgICAgY29uc3QgY291bnQgPSB0aGlzLmNvdW50Kys7CiAgICAgICAgICAgIGlmIChyaW5nLmxlbmd0aCA8IHRvdGFsKSB7CiAgICAgICAgICAgICAgICByaW5nLnB1c2godmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjb3VudCAlIHRvdGFsOwogICAgICAgICAgICAgICAgcmluZ1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICAgICAgbGV0IGNvdW50ID0gdGhpcy5jb3VudDsKICAgICAgICAgICAgaWYgKGNvdW50ID4gMCkgewogICAgICAgICAgICAgICAgY29uc3QgdG90YWwgPSB0aGlzLmNvdW50ID49IHRoaXMudG90YWwgPyB0aGlzLnRvdGFsIDogdGhpcy5jb3VudDsKICAgICAgICAgICAgICAgIGNvbnN0IHJpbmcgPSB0aGlzLnJpbmc7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRvdGFsOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSAoY291bnQrKykgJSB0b3RhbDsKICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5uZXh0KHJpbmdbaWR4XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gbGFzdChwcmVkaWNhdGUsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIGNvbnN0IGhhc0RlZmF1bHRWYWx1ZSA9IGFyZ3VtZW50cy5sZW5ndGggPj0gMjsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLnBpcGUocHJlZGljYXRlID8gZmlsdGVyKCh2LCBpKSA9PiBwcmVkaWNhdGUodiwgaSwgc291cmNlKSkgOiBpZGVudGl0eSwgdGFrZUxhc3QoMSksIGhhc0RlZmF1bHRWYWx1ZSA/IGRlZmF1bHRJZkVtcHR5KGRlZmF1bHRWYWx1ZSkgOiB0aHJvd0lmRW1wdHkoKCkgPT4gbmV3IEVtcHR5RXJyb3IoKSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIG1hdGVyaWFsaXplKCkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBtYXRlcmlhbGl6ZU9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgTWF0ZXJpYWxpemVPcGVyYXRvcigpKTsKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgTWF0ZXJpYWxpemVPcGVyYXRvciB7CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IE1hdGVyaWFsaXplU3Vic2NyaWJlcihzdWJzY3JpYmVyKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTWF0ZXJpYWxpemVTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24pIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQoTm90aWZpY2F0aW9uLmNyZWF0ZU5leHQodmFsdWUpKTsKICAgICAgICB9CiAgICAgICAgX2Vycm9yKGVycikgewogICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQoTm90aWZpY2F0aW9uLmNyZWF0ZUVycm9yKGVycikpOwogICAgICAgICAgICBkZXN0aW5hdGlvbi5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICBfY29tcGxldGUoKSB7CiAgICAgICAgICAgIGNvbnN0IGRlc3RpbmF0aW9uID0gdGhpcy5kZXN0aW5hdGlvbjsKICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dChOb3RpZmljYXRpb24uY3JlYXRlQ29tcGxldGUoKSk7CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNjYW4oYWNjdW11bGF0b3IsIHNlZWQpIHsKICAgICAgICBsZXQgaGFzU2VlZCA9IGZhbHNlOwogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHsKICAgICAgICAgICAgaGFzU2VlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmdW5jdGlvbiBzY2FuT3BlcmF0b3JGdW5jdGlvbihzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5saWZ0KG5ldyBTY2FuT3BlcmF0b3IoYWNjdW11bGF0b3IsIHNlZWQsIGhhc1NlZWQpKTsKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgU2Nhbk9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihhY2N1bXVsYXRvciwgc2VlZCwgaGFzU2VlZCA9IGZhbHNlKSB7CiAgICAgICAgICAgIHRoaXMuYWNjdW11bGF0b3IgPSBhY2N1bXVsYXRvcjsKICAgICAgICAgICAgdGhpcy5zZWVkID0gc2VlZDsKICAgICAgICAgICAgdGhpcy5oYXNTZWVkID0gaGFzU2VlZDsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNjYW5TdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuYWNjdW11bGF0b3IsIHRoaXMuc2VlZCwgdGhpcy5oYXNTZWVkKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgU2NhblN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgYWNjdW11bGF0b3IsIF9zdGF0ZSwgX2hhc1N0YXRlKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5hY2N1bXVsYXRvciA9IGFjY3VtdWxhdG9yOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IF9zdGF0ZTsKICAgICAgICAgICAgdGhpcy5faGFzU3RhdGUgPSBfaGFzU3RhdGU7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCB7IGRlc3RpbmF0aW9uIH0gPSB0aGlzOwogICAgICAgICAgICBpZiAoIXRoaXMuX2hhc1N0YXRlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgdGhpcy5faGFzU3RhdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMuYWNjdW11bGF0b3IodGhpcy5fc3RhdGUsIHZhbHVlLCBpbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IHJlc3VsdDsKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uLm5leHQocmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBtdWx0aWNhc3Qoc3ViamVjdE9yU3ViamVjdEZhY3RvcnksIHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIG11bHRpY2FzdE9wZXJhdG9yRnVuY3Rpb24oc291cmNlKSB7CiAgICAgICAgICAgIGxldCBzdWJqZWN0RmFjdG9yeTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBzdWJqZWN0T3JTdWJqZWN0RmFjdG9yeSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgc3ViamVjdEZhY3RvcnkgPSBzdWJqZWN0T3JTdWJqZWN0RmFjdG9yeTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHN1YmplY3RGYWN0b3J5ID0gZnVuY3Rpb24gc3ViamVjdEZhY3RvcnkoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1YmplY3RPclN1YmplY3RGYWN0b3J5OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIHNlbGVjdG9yID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IE11bHRpY2FzdE9wZXJhdG9yKHN1YmplY3RGYWN0b3J5LCBzZWxlY3RvcikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IGNvbm5lY3RhYmxlID0gT2JqZWN0LmNyZWF0ZShzb3VyY2UsIGNvbm5lY3RhYmxlT2JzZXJ2YWJsZURlc2NyaXB0b3IpOwogICAgICAgICAgICBjb25uZWN0YWJsZS5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgIGNvbm5lY3RhYmxlLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7CiAgICAgICAgICAgIHJldHVybiBjb25uZWN0YWJsZTsKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgTXVsdGljYXN0T3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKHN1YmplY3RGYWN0b3J5LCBzZWxlY3RvcikgewogICAgICAgICAgICB0aGlzLnN1YmplY3RGYWN0b3J5ID0gc3ViamVjdEZhY3Rvcnk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IgPSBzZWxlY3RvcjsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgY29uc3QgeyBzZWxlY3RvciB9ID0gdGhpczsKICAgICAgICAgICAgY29uc3Qgc3ViamVjdCA9IHRoaXMuc3ViamVjdEZhY3RvcnkoKTsKICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc2VsZWN0b3Ioc3ViamVjdCkuc3Vic2NyaWJlKHN1YnNjcmliZXIpOwogICAgICAgICAgICBzdWJzY3JpcHRpb24uYWRkKHNvdXJjZS5zdWJzY3JpYmUoc3ViamVjdCkpOwogICAgICAgICAgICByZXR1cm4gc3Vic2NyaXB0aW9uOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwYWlyd2lzZSgpIHsKICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLmxpZnQobmV3IFBhaXJ3aXNlT3BlcmF0b3IoKSk7CiAgICB9CiAgICBjbGFzcyBQYWlyd2lzZU9wZXJhdG9yIHsKICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUGFpcndpc2VTdWJzY3JpYmVyKHN1YnNjcmliZXIpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBQYWlyd2lzZVN1YnNjcmliZXIgZXh0ZW5kcyBTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbikgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuaGFzUHJldiA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBsZXQgcGFpcjsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzUHJldikgewogICAgICAgICAgICAgICAgcGFpciA9IFt0aGlzLnByZXYsIHZhbHVlXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuaGFzUHJldiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5wcmV2ID0gdmFsdWU7CiAgICAgICAgICAgIGlmIChwYWlyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQocGFpcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gcGx1Y2soLi4ucHJvcGVydGllcykgewogICAgICAgIGNvbnN0IGxlbmd0aCA9IHByb3BlcnRpZXMubGVuZ3RoOwogICAgICAgIGlmIChsZW5ndGggPT09IDApIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsaXN0IG9mIHByb3BlcnRpZXMgY2Fubm90IGJlIGVtcHR5LicpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFwKCh4KSA9PiB7CiAgICAgICAgICAgIGxldCBjdXJyZW50UHJvcCA9IHg7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IHAgPSBjdXJyZW50UHJvcFtwcm9wZXJ0aWVzW2ldXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50UHJvcCA9IHA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50UHJvcDsKICAgICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZXBlYXRXaGVuKG5vdGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBSZXBlYXRXaGVuT3BlcmF0b3Iobm90aWZpZXIpKTsKICAgIH0KICAgIGNsYXNzIFJlcGVhdFdoZW5PcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3Iobm90aWZpZXIpIHsKICAgICAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgUmVwZWF0V2hlblN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5ub3RpZmllciwgc291cmNlKSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUmVwZWF0V2hlblN1YnNjcmliZXIgZXh0ZW5kcyBPdXRlclN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCBub3RpZmllciwgc291cmNlKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5ub3RpZmllciA9IG5vdGlmaWVyOwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTsKICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5yZXRyaWVzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5zb3VyY2VJc0JlaW5nU3Vic2NyaWJlZFRvID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgbm90aWZ5TmV4dChvdXRlclZhbHVlLCBpbm5lclZhbHVlLCBvdXRlckluZGV4LCBpbm5lckluZGV4LCBpbm5lclN1YikgewogICAgICAgICAgICB0aGlzLnNvdXJjZUlzQmVpbmdTdWJzY3JpYmVkVG8gPSB0cnVlOwogICAgICAgICAgICB0aGlzLnNvdXJjZS5zdWJzY3JpYmUodGhpcyk7CiAgICAgICAgfQogICAgICAgIG5vdGlmeUNvbXBsZXRlKGlubmVyU3ViKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNvdXJjZUlzQmVpbmdTdWJzY3JpYmVkVG8gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb21wbGV0ZSgpIHsKICAgICAgICAgICAgdGhpcy5zb3VyY2VJc0JlaW5nU3Vic2NyaWJlZFRvID0gZmFsc2U7CiAgICAgICAgICAgIGlmICghdGhpcy5pc1N0b3BwZWQpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZXRyaWVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdWJzY3JpYmVUb1JldHJpZXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZXRyaWVzU3Vic2NyaXB0aW9uIHx8IHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3VwZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlQW5kUmVjeWNsZSgpOwogICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfdW5zdWJzY3JpYmUoKSB7CiAgICAgICAgICAgIGNvbnN0IHsgbm90aWZpY2F0aW9ucywgcmV0cmllc1N1YnNjcmlwdGlvbiB9ID0gdGhpczsKICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbnMpIHsKICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbnMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9ucyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJldHJpZXNTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHJldHJpZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5yZXRyaWVzID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgX3Vuc3Vic2NyaWJlQW5kUmVjeWNsZSgpIHsKICAgICAgICAgICAgY29uc3QgeyBfdW5zdWJzY3JpYmUgfSA9IHRoaXM7CiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlID0gbnVsbDsKICAgICAgICAgICAgc3VwZXIuX3Vuc3Vic2NyaWJlQW5kUmVjeWNsZSgpOwogICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSA9IF91bnN1YnNjcmliZTsKICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfQogICAgICAgIHN1YnNjcmliZVRvUmV0cmllcygpIHsKICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgbGV0IHJldHJpZXM7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IG5vdGlmaWVyIH0gPSB0aGlzOwogICAgICAgICAgICAgICAgcmV0cmllcyA9IG5vdGlmaWVyKHRoaXMubm90aWZpY2F0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmV0cmllcyA9IHJldHJpZXM7CiAgICAgICAgICAgIHRoaXMucmV0cmllc1N1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRoaXMsIHJldHJpZXMpOwogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzaGFyZVN1YmplY3RGYWN0b3J5KCkgewogICAgICAgIHJldHVybiBuZXcgU3ViamVjdCgpOwogICAgfQogICAgZnVuY3Rpb24gc2hhcmUoKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHJlZkNvdW50KCkobXVsdGljYXN0KHNoYXJlU3ViamVjdEZhY3RvcnkpKHNvdXJjZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNoYXJlUmVwbGF5KGNvbmZpZ09yQnVmZmVyU2l6ZSwgd2luZG93VGltZSwgc2NoZWR1bGVyKSB7CiAgICAgICAgbGV0IGNvbmZpZzsKICAgICAgICBpZiAoY29uZmlnT3JCdWZmZXJTaXplICYmIHR5cGVvZiBjb25maWdPckJ1ZmZlclNpemUgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IGNvbmZpZ09yQnVmZmVyU2l6ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGNvbmZpZyA9IHsKICAgICAgICAgICAgICAgIGJ1ZmZlclNpemU6IGNvbmZpZ09yQnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgIHdpbmRvd1RpbWUsCiAgICAgICAgICAgICAgICByZWZDb3VudDogZmFsc2UsCiAgICAgICAgICAgICAgICBzY2hlZHVsZXIKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KHNoYXJlUmVwbGF5T3BlcmF0b3IoY29uZmlnKSk7CiAgICB9CiAgICBmdW5jdGlvbiBzaGFyZVJlcGxheU9wZXJhdG9yKHsgYnVmZmVyU2l6ZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgd2luZG93VGltZSA9IE51bWJlci5QT1NJVElWRV9JTkZJTklUWSwgcmVmQ291bnQ6IHVzZVJlZkNvdW50LCBzY2hlZHVsZXIgfSkgewogICAgICAgIGxldCBzdWJqZWN0OwogICAgICAgIGxldCByZWZDb3VudCA9IDA7CiAgICAgICAgbGV0IHN1YnNjcmlwdGlvbjsKICAgICAgICBsZXQgaGFzRXJyb3IgPSBmYWxzZTsKICAgICAgICBsZXQgaXNDb21wbGV0ZSA9IGZhbHNlOwogICAgICAgIHJldHVybiBmdW5jdGlvbiBzaGFyZVJlcGxheU9wZXJhdGlvbihzb3VyY2UpIHsKICAgICAgICAgICAgcmVmQ291bnQrKzsKICAgICAgICAgICAgaWYgKCFzdWJqZWN0IHx8IGhhc0Vycm9yKSB7CiAgICAgICAgICAgICAgICBoYXNFcnJvciA9IGZhbHNlOwogICAgICAgICAgICAgICAgc3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0KGJ1ZmZlclNpemUsIHdpbmRvd1RpbWUsIHNjaGVkdWxlcik7CiAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSBzb3VyY2Uuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgICAgICBuZXh0KHZhbHVlKSB7IHN1YmplY3QubmV4dCh2YWx1ZSk7IH0sCiAgICAgICAgICAgICAgICAgICAgZXJyb3IoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0Vycm9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgc3ViamVjdC5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY29tcGxldGUoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ29tcGxldGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24gPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHN1YmplY3QuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaW5uZXJTdWIgPSBzdWJqZWN0LnN1YnNjcmliZSh0aGlzKTsKICAgICAgICAgICAgdGhpcy5hZGQoKCkgPT4gewogICAgICAgICAgICAgICAgcmVmQ291bnQtLTsKICAgICAgICAgICAgICAgIGlubmVyU3ViLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICBpZiAoc3Vic2NyaXB0aW9uICYmICFpc0NvbXBsZXRlICYmIHVzZVJlZkNvdW50ICYmIHJlZkNvdW50ID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgc3Vic2NyaXB0aW9uID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgIHN1YmplY3QgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2tpcChjb3VudCkgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgU2tpcE9wZXJhdG9yKGNvdW50KSk7CiAgICB9CiAgICBjbGFzcyBTa2lwT3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKHRvdGFsKSB7CiAgICAgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zdWJzY3JpYmUobmV3IFNraXBTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMudG90YWwpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTa2lwU3Vic2NyaWJlciBleHRlbmRzIFN1YnNjcmliZXIgewogICAgICAgIGNvbnN0cnVjdG9yKGRlc3RpbmF0aW9uLCB0b3RhbCkgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMudG90YWwgPSB0b3RhbDsKICAgICAgICAgICAgdGhpcy5jb3VudCA9IDA7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHgpIHsKICAgICAgICAgICAgaWYgKCsrdGhpcy5jb3VudCA+IHRoaXMudG90YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzdGFydFdpdGgoLi4udmFsdWVzKSB7CiAgICAgICAgY29uc3Qgc2NoZWR1bGVyID0gdmFsdWVzW3ZhbHVlcy5sZW5ndGggLSAxXTsKICAgICAgICBpZiAoaXNTY2hlZHVsZXIoc2NoZWR1bGVyKSkgewogICAgICAgICAgICB2YWx1ZXMucG9wKCk7CiAgICAgICAgICAgIHJldHVybiAoc291cmNlKSA9PiBjb25jYXQodmFsdWVzLCBzb3VyY2UsIHNjaGVkdWxlcik7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gY29uY2F0KHZhbHVlcywgc291cmNlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gc3dpdGNoTWFwKHByb2plY3QsIHJlc3VsdFNlbGVjdG9yKSB7CiAgICAgICAgaWYgKHR5cGVvZiByZXN1bHRTZWxlY3RvciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gKHNvdXJjZSkgPT4gc291cmNlLnBpcGUoc3dpdGNoTWFwKChhLCBpKSA9PiBmcm9tKHByb2plY3QoYSwgaSkpLnBpcGUobWFwKChiLCBpaSkgPT4gcmVzdWx0U2VsZWN0b3IoYSwgYiwgaSwgaWkpKSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBTd2l0Y2hNYXBPcGVyYXRvcihwcm9qZWN0KSk7CiAgICB9CiAgICBjbGFzcyBTd2l0Y2hNYXBPcGVyYXRvciB7CiAgICAgICAgY29uc3RydWN0b3IocHJvamVjdCkgewogICAgICAgICAgICB0aGlzLnByb2plY3QgPSBwcm9qZWN0OwogICAgICAgIH0KICAgICAgICBjYWxsKHN1YnNjcmliZXIsIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZShuZXcgU3dpdGNoTWFwU3Vic2NyaWJlcihzdWJzY3JpYmVyLCB0aGlzLnByb2plY3QpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTd2l0Y2hNYXBTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgcHJvamVjdCkgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgICAgIHRoaXMuaW5kZXggPSAwOwogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuaW5kZXgrKzsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IHRoaXMucHJvamVjdCh2YWx1ZSwgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnJvcik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICBfaW5uZXJTdWIocmVzdWx0LCB2YWx1ZSwgaW5kZXgpIHsKICAgICAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpcHRpb24gPSB0aGlzLmlubmVyU3Vic2NyaXB0aW9uOwogICAgICAgICAgICBpZiAoaW5uZXJTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIGlubmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgaW5uZXJTdWJzY3JpYmVyID0gbmV3IElubmVyU3Vic2NyaWJlcih0aGlzLCB2YWx1ZSwgaW5kZXgpOwogICAgICAgICAgICBjb25zdCBkZXN0aW5hdGlvbiA9IHRoaXMuZGVzdGluYXRpb247CiAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZChpbm5lclN1YnNjcmliZXIpOwogICAgICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgcmVzdWx0LCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgaW5uZXJTdWJzY3JpYmVyKTsKICAgICAgICAgICAgaWYgKHRoaXMuaW5uZXJTdWJzY3JpcHRpb24gIT09IGlubmVyU3Vic2NyaWJlcikgewogICAgICAgICAgICAgICAgZGVzdGluYXRpb24uYWRkKHRoaXMuaW5uZXJTdWJzY3JpcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgY29uc3QgeyBpbm5lclN1YnNjcmlwdGlvbiB9ID0gdGhpczsKICAgICAgICAgICAgaWYgKCFpbm5lclN1YnNjcmlwdGlvbiB8fCBpbm5lclN1YnNjcmlwdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHN1cGVyLl9jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgX3Vuc3Vic2NyaWJlKCkgewogICAgICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgbm90aWZ5Q29tcGxldGUoaW5uZXJTdWIpIHsKICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb24gPSB0aGlzLmRlc3RpbmF0aW9uOwogICAgICAgICAgICBkZXN0aW5hdGlvbi5yZW1vdmUoaW5uZXJTdWIpOwogICAgICAgICAgICB0aGlzLmlubmVyU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgaWYgKHRoaXMuaXNTdG9wcGVkKSB7CiAgICAgICAgICAgICAgICBzdXBlci5fY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBub3RpZnlOZXh0KG91dGVyVmFsdWUsIGlubmVyVmFsdWUsIG91dGVySW5kZXgsIGlubmVySW5kZXgsIGlubmVyU3ViKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChpbm5lclZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gdGFrZVVudGlsKG5vdGlmaWVyKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHNvdXJjZS5saWZ0KG5ldyBUYWtlVW50aWxPcGVyYXRvcihub3RpZmllcikpOwogICAgfQogICAgY2xhc3MgVGFrZVVudGlsT3BlcmF0b3IgewogICAgICAgIGNvbnN0cnVjdG9yKG5vdGlmaWVyKSB7CiAgICAgICAgICAgIHRoaXMubm90aWZpZXIgPSBub3RpZmllcjsKICAgICAgICB9CiAgICAgICAgY2FsbChzdWJzY3JpYmVyLCBzb3VyY2UpIHsKICAgICAgICAgICAgY29uc3QgdGFrZVVudGlsU3Vic2NyaWJlciA9IG5ldyBUYWtlVW50aWxTdWJzY3JpYmVyKHN1YnNjcmliZXIpOwogICAgICAgICAgICBjb25zdCBub3RpZmllclN1YnNjcmlwdGlvbiA9IHN1YnNjcmliZVRvUmVzdWx0KHRha2VVbnRpbFN1YnNjcmliZXIsIHRoaXMubm90aWZpZXIpOwogICAgICAgICAgICBpZiAobm90aWZpZXJTdWJzY3JpcHRpb24gJiYgIXRha2VVbnRpbFN1YnNjcmliZXIuc2VlblZhbHVlKSB7CiAgICAgICAgICAgICAgICB0YWtlVW50aWxTdWJzY3JpYmVyLmFkZChub3RpZmllclN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlLnN1YnNjcmliZSh0YWtlVW50aWxTdWJzY3JpYmVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGFrZVVudGlsU3Vic2NyaWJlcjsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUYWtlVW50aWxTdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbikgewogICAgICAgICAgICBzdXBlcihkZXN0aW5hdGlvbik7CiAgICAgICAgICAgIHRoaXMuc2VlblZhbHVlID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy5zZWVuVmFsdWUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIG5vdGlmeUNvbXBsZXRlKCkgewogICAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB0YXAobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkgewogICAgICAgIHJldHVybiBmdW5jdGlvbiB0YXBPcGVyYXRvckZ1bmN0aW9uKHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gc291cmNlLmxpZnQobmV3IERvT3BlcmF0b3IobmV4dE9yT2JzZXJ2ZXIsIGVycm9yLCBjb21wbGV0ZSkpOwogICAgICAgIH07CiAgICB9CiAgICBjbGFzcyBEb09wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihuZXh0T3JPYnNlcnZlciwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgICAgIHRoaXMubmV4dE9yT2JzZXJ2ZXIgPSBuZXh0T3JPYnNlcnZlcjsKICAgICAgICAgICAgdGhpcy5lcnJvciA9IGVycm9yOwogICAgICAgICAgICB0aGlzLmNvbXBsZXRlID0gY29tcGxldGU7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUYXBTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMubmV4dE9yT2JzZXJ2ZXIsIHRoaXMuZXJyb3IsIHRoaXMuY29tcGxldGUpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUYXBTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIG9ic2VydmVyT3JOZXh0LCBlcnJvciwgY29tcGxldGUpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLl90YXBOZXh0ID0gbm9vcDsKICAgICAgICAgICAgdGhpcy5fdGFwRXJyb3IgPSBub29wOwogICAgICAgICAgICB0aGlzLl90YXBDb21wbGV0ZSA9IG5vb3A7CiAgICAgICAgICAgIHRoaXMuX3RhcEVycm9yID0gZXJyb3IgfHwgbm9vcDsKICAgICAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUgPSBjb21wbGV0ZSB8fCBub29wOwogICAgICAgICAgICBpZiAoaXNGdW5jdGlvbihvYnNlcnZlck9yTmV4dCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbnRleHQgPSB0aGlzOwogICAgICAgICAgICAgICAgdGhpcy5fdGFwTmV4dCA9IG9ic2VydmVyT3JOZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG9ic2VydmVyT3JOZXh0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gb2JzZXJ2ZXJPck5leHQ7CiAgICAgICAgICAgICAgICB0aGlzLl90YXBOZXh0ID0gb2JzZXJ2ZXJPck5leHQubmV4dCB8fCBub29wOwogICAgICAgICAgICAgICAgdGhpcy5fdGFwRXJyb3IgPSBvYnNlcnZlck9yTmV4dC5lcnJvciB8fCBub29wOwogICAgICAgICAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUgPSBvYnNlcnZlck9yTmV4dC5jb21wbGV0ZSB8fCBub29wOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB0aGlzLl90YXBOZXh0LmNhbGwodGhpcy5fY29udGV4dCwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLm5leHQodmFsdWUpOwogICAgICAgIH0KICAgICAgICBfZXJyb3IoZXJyKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB0aGlzLl90YXBFcnJvci5jYWxsKHRoaXMuX2NvbnRleHQsIGVycik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uZXJyb3IoZXJyKTsKICAgICAgICB9CiAgICAgICAgX2NvbXBsZXRlKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhpcy5fdGFwQ29tcGxldGUuY2FsbCh0aGlzLl9jb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3RpbmF0aW9uLmVycm9yKGVycik7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CgogICAgY29uc3QgZGVmYXVsdFRocm90dGxlQ29uZmlnID0gewogICAgICAgIGxlYWRpbmc6IHRydWUsCiAgICAgICAgdHJhaWxpbmc6IGZhbHNlCiAgICB9OwoKICAgIGZ1bmN0aW9uIHRocm90dGxlVGltZShkdXJhdGlvbiwgc2NoZWR1bGVyID0gYXN5bmMsIGNvbmZpZyA9IGRlZmF1bHRUaHJvdHRsZUNvbmZpZykgewogICAgICAgIHJldHVybiAoc291cmNlKSA9PiBzb3VyY2UubGlmdChuZXcgVGhyb3R0bGVUaW1lT3BlcmF0b3IoZHVyYXRpb24sIHNjaGVkdWxlciwgISFjb25maWcubGVhZGluZywgISFjb25maWcudHJhaWxpbmcpKTsKICAgIH0KICAgIGNsYXNzIFRocm90dGxlVGltZU9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihkdXJhdGlvbiwgc2NoZWR1bGVyLCBsZWFkaW5nLCB0cmFpbGluZykgewogICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gZHVyYXRpb247CiAgICAgICAgICAgIHRoaXMuc2NoZWR1bGVyID0gc2NoZWR1bGVyOwogICAgICAgICAgICB0aGlzLmxlYWRpbmcgPSBsZWFkaW5nOwogICAgICAgICAgICB0aGlzLnRyYWlsaW5nID0gdHJhaWxpbmc7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBUaHJvdHRsZVRpbWVTdWJzY3JpYmVyKHN1YnNjcmliZXIsIHRoaXMuZHVyYXRpb24sIHRoaXMuc2NoZWR1bGVyLCB0aGlzLmxlYWRpbmcsIHRoaXMudHJhaWxpbmcpKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUaHJvdHRsZVRpbWVTdWJzY3JpYmVyIGV4dGVuZHMgU3Vic2NyaWJlciB7CiAgICAgICAgY29uc3RydWN0b3IoZGVzdGluYXRpb24sIGR1cmF0aW9uLCBzY2hlZHVsZXIsIGxlYWRpbmcsIHRyYWlsaW5nKSB7CiAgICAgICAgICAgIHN1cGVyKGRlc3RpbmF0aW9uKTsKICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IGR1cmF0aW9uOwogICAgICAgICAgICB0aGlzLnNjaGVkdWxlciA9IHNjaGVkdWxlcjsKICAgICAgICAgICAgdGhpcy5sZWFkaW5nID0gbGVhZGluZzsKICAgICAgICAgICAgdGhpcy50cmFpbGluZyA9IHRyYWlsaW5nOwogICAgICAgICAgICB0aGlzLnRocm90dGxlZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2hhc1RyYWlsaW5nVmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fdHJhaWxpbmdWYWx1ZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIF9uZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRocm90dGxlZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhaWxpbmcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFpbGluZ1ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVHJhaWxpbmdWYWx1ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmFkZCh0aGlzLnRocm90dGxlZCA9IHRoaXMuc2NoZWR1bGVyLnNjaGVkdWxlKGRpc3BhdGNoTmV4dCQxLCB0aGlzLmR1cmF0aW9uLCB7IHN1YnNjcmliZXI6IHRoaXMgfSkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMubGVhZGluZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnRyYWlsaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJhaWxpbmdWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1RyYWlsaW5nVmFsdWUgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIF9jb21wbGV0ZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc1RyYWlsaW5nVmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLl90cmFpbGluZ1ZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24uY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjbGVhclRocm90dGxlKCkgewogICAgICAgICAgICBjb25zdCB0aHJvdHRsZWQgPSB0aGlzLnRocm90dGxlZDsKICAgICAgICAgICAgaWYgKHRocm90dGxlZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMudHJhaWxpbmcgJiYgdGhpcy5faGFzVHJhaWxpbmdWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dCh0aGlzLl90cmFpbGluZ1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFpbGluZ1ZhbHVlID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUcmFpbGluZ1ZhbHVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aHJvdHRsZWQudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRocm90dGxlZCk7CiAgICAgICAgICAgICAgICB0aGlzLnRocm90dGxlZCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBkaXNwYXRjaE5leHQkMShhcmcpIHsKICAgICAgICBjb25zdCB7IHN1YnNjcmliZXIgfSA9IGFyZzsKICAgICAgICBzdWJzY3JpYmVyLmNsZWFyVGhyb3R0bGUoKTsKICAgIH0KCiAgICBmdW5jdGlvbiB3aXRoTGF0ZXN0RnJvbSguLi5hcmdzKSB7CiAgICAgICAgcmV0dXJuIChzb3VyY2UpID0+IHsKICAgICAgICAgICAgbGV0IHByb2plY3Q7CiAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1thcmdzLmxlbmd0aCAtIDFdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBwcm9qZWN0ID0gYXJncy5wb3AoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IGFyZ3M7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2UubGlmdChuZXcgV2l0aExhdGVzdEZyb21PcGVyYXRvcihvYnNlcnZhYmxlcywgcHJvamVjdCkpOwogICAgICAgIH07CiAgICB9CiAgICBjbGFzcyBXaXRoTGF0ZXN0RnJvbU9wZXJhdG9yIHsKICAgICAgICBjb25zdHJ1Y3RvcihvYnNlcnZhYmxlcywgcHJvamVjdCkgewogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXM7CiAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgfQogICAgICAgIGNhbGwoc3Vic2NyaWJlciwgc291cmNlKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2Uuc3Vic2NyaWJlKG5ldyBXaXRoTGF0ZXN0RnJvbVN1YnNjcmliZXIoc3Vic2NyaWJlciwgdGhpcy5vYnNlcnZhYmxlcywgdGhpcy5wcm9qZWN0KSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgV2l0aExhdGVzdEZyb21TdWJzY3JpYmVyIGV4dGVuZHMgT3V0ZXJTdWJzY3JpYmVyIHsKICAgICAgICBjb25zdHJ1Y3RvcihkZXN0aW5hdGlvbiwgb2JzZXJ2YWJsZXMsIHByb2plY3QpIHsKICAgICAgICAgICAgc3VwZXIoZGVzdGluYXRpb24pOwogICAgICAgICAgICB0aGlzLm9ic2VydmFibGVzID0gb2JzZXJ2YWJsZXM7CiAgICAgICAgICAgIHRoaXMucHJvamVjdCA9IHByb2plY3Q7CiAgICAgICAgICAgIHRoaXMudG9SZXNwb25kID0gW107CiAgICAgICAgICAgIGNvbnN0IGxlbiA9IG9ic2VydmFibGVzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy52YWx1ZXMgPSBuZXcgQXJyYXkobGVuKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsZW47IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy50b1Jlc3BvbmQucHVzaChpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICBsZXQgb2JzZXJ2YWJsZSA9IG9ic2VydmFibGVzW2ldOwogICAgICAgICAgICAgICAgdGhpcy5hZGQoc3Vic2NyaWJlVG9SZXN1bHQodGhpcywgb2JzZXJ2YWJsZSwgb2JzZXJ2YWJsZSwgaSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdGlmeU5leHQob3V0ZXJWYWx1ZSwgaW5uZXJWYWx1ZSwgb3V0ZXJJbmRleCwgaW5uZXJJbmRleCwgaW5uZXJTdWIpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZXNbb3V0ZXJJbmRleF0gPSBpbm5lclZhbHVlOwogICAgICAgICAgICBjb25zdCB0b1Jlc3BvbmQgPSB0aGlzLnRvUmVzcG9uZDsKICAgICAgICAgICAgaWYgKHRvUmVzcG9uZC5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBmb3VuZCA9IHRvUmVzcG9uZC5pbmRleE9mKG91dGVySW5kZXgpOwogICAgICAgICAgICAgICAgaWYgKGZvdW5kICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHRvUmVzcG9uZC5zcGxpY2UoZm91bmQsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5vdGlmeUNvbXBsZXRlKCkgewogICAgICAgIH0KICAgICAgICBfbmV4dCh2YWx1ZSkgewogICAgICAgICAgICBpZiAodGhpcy50b1Jlc3BvbmQubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhcmdzID0gW3ZhbHVlLCAuLi50aGlzLnZhbHVlc107CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm9qZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdHJ5UHJvamVjdChhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChhcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBfdHJ5UHJvamVjdChhcmdzKSB7CiAgICAgICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSB0aGlzLnByb2plY3QuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0aW5hdGlvbi5lcnJvcihlcnIpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGVzdGluYXRpb24ubmV4dChyZXN1bHQpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjkuMS4xMgogICAgICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogQ29udmluY2UgY2xvc3VyZSBjb21waWxlciB0aGF0IHRoZSB3cmFwcGVkIGZ1bmN0aW9uIGhhcyBubyBzaWRlLWVmZmVjdHMuCiAgICAgKgogICAgICogQ2xvc3VyZSBjb21waWxlciBhbHdheXMgYXNzdW1lcyB0aGF0IGB0b1N0cmluZ2AgaGFzIG5vIHNpZGUtZWZmZWN0cy4gV2UgdXNlIHRoaXMgcXVpcmsgdG8KICAgICAqIGFsbG93IHVzIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBidXQgaGF2ZSBjbG9zdXJlIGNvbXBpbGVyIG1hcmsgdGhlIGNhbGwgYXMgbm8tc2lkZS1lZmZlY3RzLgogICAgICogSXQgaXMgaW1wb3J0YW50IHRoYXQgdGhlIHJldHVybiB2YWx1ZSBmb3IgdGhlIGBub1NpZGVFZmZlY3RzYCBmdW5jdGlvbiBiZSBhc3NpZ25lZAogICAgICogdG8gc29tZXRoaW5nIHdoaWNoIGlzIHJldGFpbmVkIG90aGVyd2lzZSB0aGUgY2FsbCB0byBgbm9TaWRlRWZmZWN0c2Agd2lsbCBiZSByZW1vdmVkIGJ5IGNsb3N1cmUKICAgICAqIGNvbXBpbGVyLgogICAgICovCiAgICBmdW5jdGlvbiBub1NpZGVFZmZlY3RzKGZuKSB7CiAgICAgICAgcmV0dXJuIHsgdG9TdHJpbmc6IGZuIH0udG9TdHJpbmcoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICBjb25zdCBBTk5PVEFUSU9OUyA9ICdfX2Fubm90YXRpb25zX18nOwogICAgY29uc3QgUEFSQU1FVEVSUyA9ICdfX3BhcmFtZXRlcnNfXyc7CiAgICBjb25zdCBQUk9QX01FVEFEQVRBID0gJ19fcHJvcF9fbWV0YWRhdGFfXyc7CiAgICAvKioKICAgICAqIEBzdXBwcmVzcyB7Z2xvYmFsVGhpc30KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZURlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGFkZGl0aW9uYWxQcm9jZXNzaW5nLCB0eXBlRm4pIHsKICAgICAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1ldGFDdG9yID0gbWFrZU1ldGFkYXRhQ3Rvcihwcm9wcyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIERlY29yYXRvckZhY3RvcnkoLi4uYXJncykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBEZWNvcmF0b3JGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgbWV0YUN0b3IuY2FsbCh0aGlzLCAuLi5hcmdzKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25JbnN0YW5jZSA9IG5ldyBEZWNvcmF0b3JGYWN0b3J5KC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIFR5cGVEZWNvcmF0b3IoY2xzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVGbikKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZUZuKGNscywgLi4uYXJncyk7CiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBpbXBvcnRhbnQgc2luY2UgaXQgY3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB3aGljaAogICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnRzIHRoZSBwcm9wZXJ0eSBpcyBjb3BpZWQgZHVyaW5nIHN1YmNsYXNzaW5nLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25zID0gY2xzLmhhc093blByb3BlcnR5KEFOTk9UQVRJT05TKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIGNsc1tBTk5PVEFUSU9OU10gOgogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoY2xzLCBBTk5PVEFUSU9OUywgeyB2YWx1ZTogW10gfSlbQU5OT1RBVElPTlNdOwogICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWRkaXRpb25hbFByb2Nlc3NpbmcpCiAgICAgICAgICAgICAgICAgICAgICAgIGFkZGl0aW9uYWxQcm9jZXNzaW5nKGNscyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsczsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmVudENsYXNzKSB7CiAgICAgICAgICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBEZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZS5uZ01ldGFkYXRhTmFtZSA9IG5hbWU7CiAgICAgICAgICAgIERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IERlY29yYXRvckZhY3Rvcnk7CiAgICAgICAgICAgIHJldHVybiBEZWNvcmF0b3JGYWN0b3J5OwogICAgICAgIH0pOwogICAgfQogICAgZnVuY3Rpb24gbWFrZU1ldGFkYXRhQ3Rvcihwcm9wcykgewogICAgICAgIHJldHVybiBmdW5jdGlvbiBjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgaWYgKHByb3BzKSB7CiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBwcm9wcyguLi5hcmdzKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gdmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wTmFtZV0gPSB2YWx1ZXNbcHJvcE5hbWVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIGZ1bmN0aW9uIG1ha2VQYXJhbURlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MpIHsKICAgICAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IG1ldGFDdG9yID0gbWFrZU1ldGFkYXRhQ3Rvcihwcm9wcyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFBhcmFtRGVjb3JhdG9yRmFjdG9yeSkgewogICAgICAgICAgICAgICAgICAgIG1ldGFDdG9yLmFwcGx5KHRoaXMsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkluc3RhbmNlID0gbmV3IFBhcmFtRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKTsKICAgICAgICAgICAgICAgIFBhcmFtRGVjb3JhdG9yLmFubm90YXRpb24gPSBhbm5vdGF0aW9uSW5zdGFuY2U7CiAgICAgICAgICAgICAgICByZXR1cm4gUGFyYW1EZWNvcmF0b3I7CiAgICAgICAgICAgICAgICBmdW5jdGlvbiBQYXJhbURlY29yYXRvcihjbHMsIHVudXNlZEtleSwgaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAvLyBVc2Ugb2YgT2JqZWN0LmRlZmluZVByb3BlcnR5IGlzIGltcG9ydGFudCBzaW5jZSBpdCBjcmVhdGVzIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5IHdoaWNoCiAgICAgICAgICAgICAgICAgICAgLy8gcHJldmVudHMgdGhlIHByb3BlcnR5IGlzIGNvcGllZCBkdXJpbmcgc3ViY2xhc3NpbmcuCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyYW1ldGVycyA9IGNscy5oYXNPd25Qcm9wZXJ0eShQQVJBTUVURVJTKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIGNsc1tQQVJBTUVURVJTXSA6CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShjbHMsIFBBUkFNRVRFUlMsIHsgdmFsdWU6IFtdIH0pW1BBUkFNRVRFUlNdOwogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIG1pZ2h0IGJlIGdhcHMgaWYgc29tZSBpbiBiZXR3ZWVuIHBhcmFtZXRlcnMgZG8gbm90IGhhdmUgYW5ub3RhdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGFkIHdpdGggbnVsbHMuCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmFtZXRlcnMubGVuZ3RoIDw9IGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMucHVzaChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKHBhcmFtZXRlcnNbaW5kZXhdID0gcGFyYW1ldGVyc1tpbmRleF0gfHwgW10pLnB1c2goYW5ub3RhdGlvbkluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2xzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXJlbnRDbGFzcykgewogICAgICAgICAgICAgICAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUocGFyZW50Q2xhc3MucHJvdG90eXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBQYXJhbURlY29yYXRvckZhY3RvcnkucHJvdG90eXBlLm5nTWV0YWRhdGFOYW1lID0gbmFtZTsKICAgICAgICAgICAgUGFyYW1EZWNvcmF0b3JGYWN0b3J5LmFubm90YXRpb25DbHMgPSBQYXJhbURlY29yYXRvckZhY3Rvcnk7CiAgICAgICAgICAgIHJldHVybiBQYXJhbURlY29yYXRvckZhY3Rvcnk7CiAgICAgICAgfSk7CiAgICB9CiAgICBmdW5jdGlvbiBtYWtlUHJvcERlY29yYXRvcihuYW1lLCBwcm9wcywgcGFyZW50Q2xhc3MsIGFkZGl0aW9uYWxQcm9jZXNzaW5nKSB7CiAgICAgICAgcmV0dXJuIG5vU2lkZUVmZmVjdHMoKCkgPT4gewogICAgICAgICAgICBjb25zdCBtZXRhQ3RvciA9IG1ha2VNZXRhZGF0YUN0b3IocHJvcHMpOwogICAgICAgICAgICBmdW5jdGlvbiBQcm9wRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIFByb3BEZWNvcmF0b3JGYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgbWV0YUN0b3IuYXBwbHkodGhpcywgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0b3JJbnN0YW5jZSA9IG5ldyBQcm9wRGVjb3JhdG9yRmFjdG9yeSguLi5hcmdzKTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFByb3BEZWNvcmF0b3IodGFyZ2V0LCBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3RydWN0b3IgPSB0YXJnZXQuY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG9mIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSBpcyBpbXBvcnRhbnQgc2luY2UgaXQgY3JlYXRlcyBub24tZW51bWVyYWJsZSBwcm9wZXJ0eSB3aGljaAogICAgICAgICAgICAgICAgICAgIC8vIHByZXZlbnRzIHRoZSBwcm9wZXJ0eSBpcyBjb3BpZWQgZHVyaW5nIHN1YmNsYXNzaW5nLgogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBjb25zdHJ1Y3Rvci5oYXNPd25Qcm9wZXJ0eShQUk9QX01FVEFEQVRBKSA/CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yW1BST1BfTUVUQURBVEFdIDoKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KGNvbnN0cnVjdG9yLCBQUk9QX01FVEFEQVRBLCB7IHZhbHVlOiB7fSB9KVtQUk9QX01FVEFEQVRBXTsKICAgICAgICAgICAgICAgICAgICBtZXRhW25hbWVdID0gbWV0YS5oYXNPd25Qcm9wZXJ0eShuYW1lKSAmJiBtZXRhW25hbWVdIHx8IFtdOwogICAgICAgICAgICAgICAgICAgIG1ldGFbbmFtZV0udW5zaGlmdChkZWNvcmF0b3JJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFkZGl0aW9uYWxQcm9jZXNzaW5nKQogICAgICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbmFsUHJvY2Vzc2luZyh0YXJnZXQsIG5hbWUsIC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFByb3BEZWNvcmF0b3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHBhcmVudENsYXNzKSB7CiAgICAgICAgICAgICAgICBQcm9wRGVjb3JhdG9yRmFjdG9yeS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudENsYXNzLnByb3RvdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgUHJvcERlY29yYXRvckZhY3RvcnkucHJvdG90eXBlLm5nTWV0YWRhdGFOYW1lID0gbmFtZTsKICAgICAgICAgICAgUHJvcERlY29yYXRvckZhY3RvcnkuYW5ub3RhdGlvbkNscyA9IFByb3BEZWNvcmF0b3JGYWN0b3J5OwogICAgICAgICAgICByZXR1cm4gUHJvcERlY29yYXRvckZhY3Rvcnk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CiAgICBjb25zdCDJtTAgPSAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICh0b2tlbikgPT4gKHsgdG9rZW4gfSk7CiAgICAvKioKICAgICAqIEluamVjdCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogICAgICoKICAgICAqIFxAQW5ub3RhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBJbmplY3QgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ0luamVjdCcsICjJtTApKTsKICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIC8qKgogICAgICogT3B0aW9uYWwgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICAgICAqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgT3B0aW9uYWwgPSBtYWtlUGFyYW1EZWNvcmF0b3IoJ09wdGlvbmFsJyk7CiAgICAvLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CiAgICAvKioKICAgICAqIFNlbGYgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICAgICAqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgU2VsZiA9IG1ha2VQYXJhbURlY29yYXRvcignU2VsZicpOwogICAgLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAogICAgLyoqCiAgICAgKiBTa2lwU2VsZiBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogICAgICoKICAgICAqIFxAQW5ub3RhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBTa2lwU2VsZiA9IG1ha2VQYXJhbURlY29yYXRvcignU2tpcFNlbGYnKTsKICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIC8qKgogICAgICogSG9zdCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogICAgICoKICAgICAqIFxAQW5ub3RhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBIb3N0ID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdIb3N0Jyk7CiAgICAvLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CiAgICBjb25zdCDJtTEgPSAvKioKICAgICAqIEBwYXJhbSB7Pz19IGF0dHJpYnV0ZU5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChhdHRyaWJ1dGVOYW1lKSA9PiAoeyBhdHRyaWJ1dGVOYW1lIH0pOwogICAgLyoqCiAgICAgKiBBdHRyaWJ1dGUgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICAgICAqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQXR0cmlidXRlID0gbWFrZVBhcmFtRGVjb3JhdG9yKCdBdHRyaWJ1dGUnLCAoybUxKSk7CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gZmxhZ3MgZm9yIERJLgogICAgICoKICAgICAqIEBwdWJsaWNBcGkKICAgICAqLwogICAgdmFyIEluamVjdEZsYWdzOwogICAgKGZ1bmN0aW9uIChJbmplY3RGbGFncykgewogICAgICAgIC8vIFRPRE8oYWx4aHViKTogbWFrZSB0aGlzICdjb25zdCcgd2hlbiBuZ2Mgbm8gbG9uZ2VyIHdyaXRlcyBleHBvcnRzIG9mIGl0IGludG8gbmdmYWN0b3J5IGZpbGVzLgogICAgICAgIC8qKiBDaGVjayBzZWxmIGFuZCBjaGVjayBwYXJlbnQgaW5qZWN0b3IgaWYgbmVlZGVkICovCiAgICAgICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIkRlZmF1bHQiXSA9IDBdID0gIkRlZmF1bHQiOwogICAgICAgIC8qKgogICAgICAgICAqIFNwZWNpZmllcyB0aGF0IGFuIGluamVjdG9yIHNob3VsZCByZXRyaWV2ZSBhIGRlcGVuZGVuY3kgZnJvbSBhbnkgaW5qZWN0b3IgdW50aWwgcmVhY2hpbmcgdGhlCiAgICAgICAgICogaG9zdCBlbGVtZW50IG9mIHRoZSBjdXJyZW50IGNvbXBvbmVudC4gKE9ubHkgdXNlZCB3aXRoIEVsZW1lbnQgSW5qZWN0b3IpCiAgICAgICAgICovCiAgICAgICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIkhvc3QiXSA9IDFdID0gIkhvc3QiOwogICAgICAgIC8qKiBEb24ndCBhc2NlbmQgdG8gYW5jZXN0b3JzIG9mIHRoZSBub2RlIHJlcXVlc3RpbmcgaW5qZWN0aW9uLiAqLwogICAgICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJTZWxmIl0gPSAyXSA9ICJTZWxmIjsKICAgICAgICAvKiogU2tpcCB0aGUgbm9kZSB0aGF0IGlzIHJlcXVlc3RpbmcgaW5qZWN0aW9uLiAqLwogICAgICAgIEluamVjdEZsYWdzW0luamVjdEZsYWdzWyJTa2lwU2VsZiJdID0gNF0gPSAiU2tpcFNlbGYiOwogICAgICAgIC8qKiBJbmplY3QgYGRlZmF1bHRWYWx1ZWAgaW5zdGVhZCBpZiB0b2tlbiBub3QgZm91bmQuICovCiAgICAgICAgSW5qZWN0RmxhZ3NbSW5qZWN0RmxhZ3NbIk9wdGlvbmFsIl0gPSA4XSA9ICJPcHRpb25hbCI7CiAgICB9KShJbmplY3RGbGFncyB8fCAoSW5qZWN0RmxhZ3MgPSB7fSkpOwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENsb3N1cmVTYWZlUHJvcGVydHkob2JqV2l0aFByb3BlcnR5VG9FeHRyYWN0KSB7CiAgICAgICAgZm9yIChsZXQga2V5IGluIG9ialdpdGhQcm9wZXJ0eVRvRXh0cmFjdCkgewogICAgICAgICAgICBpZiAob2JqV2l0aFByb3BlcnR5VG9FeHRyYWN0W2tleV0gPT09IGdldENsb3N1cmVTYWZlUHJvcGVydHkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBrZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3cgRXJyb3IoJ0NvdWxkIG5vdCBmaW5kIHJlbmFtZWQgcHJvcGVydHkgb24gdGFyZ2V0IG9iamVjdC4nKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyBwcm9wZXJ0aWVzIG9uIGEgdGFyZ2V0IG9iamVjdCBmcm9tIGEgc291cmNlIG9iamVjdCwgYnV0IG9ubHkgaWYKICAgICAqIHRoZSBwcm9wZXJ0eSBkb2Vzbid0IGFscmVhZHkgZXhpc3Qgb24gdGhlIHRhcmdldCBvYmplY3QuCiAgICAgKiBAcGFyYW0gdGFyZ2V0IFRoZSB0YXJnZXQgdG8gc2V0IHByb3BlcnRpZXMgb24KICAgICAqIEBwYXJhbSBzb3VyY2UgVGhlIHNvdXJjZSBvZiB0aGUgcHJvcGVydHkga2V5cyBhbmQgdmFsdWVzIHRvIHNldAogICAgICovCiAgICBmdW5jdGlvbiBmaWxsUHJvcGVydGllcyh0YXJnZXQsIHNvdXJjZSkgewogICAgICAgIGZvciAoY29uc3Qga2V5IGluIHNvdXJjZSkgewogICAgICAgICAgICBpZiAoc291cmNlLmhhc093blByb3BlcnR5KGtleSkgJiYgIXRhcmdldC5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogQ29uc3RydWN0IGFuIGBJbmplY3RhYmxlRGVmYCB3aGljaCBkZWZpbmVzIGhvdyBhIHRva2VuIHdpbGwgYmUgY29uc3RydWN0ZWQgYnkgdGhlIERJIHN5c3RlbSwgYW5kCiAgICAgKiBpbiB3aGljaCBpbmplY3RvcnMgKGlmIGFueSkgaXQgd2lsbCBiZSBhdmFpbGFibGUuCiAgICAgKgogICAgICogVGhpcyBzaG91bGQgYmUgYXNzaWduZWQgdG8gYSBzdGF0aWMgYMm1cHJvdmAgZmllbGQgb24gYSB0eXBlLCB3aGljaCB3aWxsIHRoZW4gYmUgYW4KICAgICAqIGBJbmplY3RhYmxlVHlwZWAuCiAgICAgKgogICAgICogT3B0aW9uczoKICAgICAqICogYHByb3ZpZGVkSW5gIGRldGVybWluZXMgd2hpY2ggaW5qZWN0b3JzIHdpbGwgaW5jbHVkZSB0aGUgaW5qZWN0YWJsZSwgYnkgZWl0aGVyIGFzc29jaWF0aW5nIGl0CiAgICAgKiAgIHdpdGggYW4gYEBOZ01vZHVsZWAgb3Igb3RoZXIgYEluamVjdG9yVHlwZWAsIG9yIGJ5IHNwZWNpZnlpbmcgdGhhdCB0aGlzIGluamVjdGFibGUgc2hvdWxkIGJlCiAgICAgKiAgIHByb3ZpZGVkIGluIHRoZSBgJ3Jvb3QnYCBpbmplY3Rvciwgd2hpY2ggd2lsbCBiZSB0aGUgYXBwbGljYXRpb24tbGV2ZWwgaW5qZWN0b3IgaW4gbW9zdCBhcHBzLgogICAgICogKiBgZmFjdG9yeWAgZ2l2ZXMgdGhlIHplcm8gYXJndW1lbnQgZnVuY3Rpb24gd2hpY2ggd2lsbCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIGluamVjdGFibGUuCiAgICAgKiAgIFRoZSBmYWN0b3J5IGNhbiBjYWxsIGBpbmplY3RgIHRvIGFjY2VzcyB0aGUgYEluamVjdG9yYCBhbmQgcmVxdWVzdCBpbmplY3Rpb24gb2YgZGVwZW5kZW5jaWVzLgogICAgICoKICAgICAqIEBjb2RlR2VuQXBpCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVkZWZpbmVJbmplY3RhYmxlKG9wdHMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0b2tlbjogb3B0cy50b2tlbiwKICAgICAgICAgICAgcHJvdmlkZWRJbjogb3B0cy5wcm92aWRlZEluIHx8IG51bGwsCiAgICAgICAgICAgIGZhY3Rvcnk6IG9wdHMuZmFjdG9yeSwKICAgICAgICAgICAgdmFsdWU6IHVuZGVmaW5lZCwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3QgYW4gYEluamVjdG9yRGVmYCB3aGljaCBjb25maWd1cmVzIGFuIGluamVjdG9yLgogICAgICoKICAgICAqIFRoaXMgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIGEgc3RhdGljIGluamVjdG9yIGRlZiAoYMm1aW5qYCkgZmllbGQgb24gYSB0eXBlLCB3aGljaCB3aWxsIHRoZW4gYmUgYW4KICAgICAqIGBJbmplY3RvclR5cGVgLgogICAgICoKICAgICAqIE9wdGlvbnM6CiAgICAgKgogICAgICogKiBgZmFjdG9yeWA6IGFuIGBJbmplY3RvclR5cGVgIGlzIGFuIGluc3RhbnRpYWJsZSB0eXBlLCBzbyBhIHplcm8gYXJndW1lbnQgYGZhY3RvcnlgIGZ1bmN0aW9uIHRvCiAgICAgKiAgIGNyZWF0ZSB0aGUgdHlwZSBtdXN0IGJlIHByb3ZpZGVkLiBJZiB0aGF0IGZhY3RvcnkgZnVuY3Rpb24gbmVlZHMgdG8gaW5qZWN0IGFyZ3VtZW50cywgaXQgY2FuCiAgICAgKiAgIHVzZSB0aGUgYGluamVjdGAgZnVuY3Rpb24uCiAgICAgKiAqIGBwcm92aWRlcnNgOiBhbiBvcHRpb25hbCBhcnJheSBvZiBwcm92aWRlcnMgdG8gYWRkIHRvIHRoZSBpbmplY3Rvci4gRWFjaCBwcm92aWRlciBtdXN0CiAgICAgKiAgIGVpdGhlciBoYXZlIGEgZmFjdG9yeSBvciBwb2ludCB0byBhIHR5cGUgd2hpY2ggaGFzIGEgYMm1cHJvdmAgc3RhdGljIHByb3BlcnR5ICh0aGUKICAgICAqICAgdHlwZSBtdXN0IGJlIGFuIGBJbmplY3RhYmxlVHlwZWApLgogICAgICogKiBgaW1wb3J0c2A6IGFuIG9wdGlvbmFsIGFycmF5IG9mIGltcG9ydHMgb2Ygb3RoZXIgYEluamVjdG9yVHlwZWBzIG9yIGBJbmplY3RvclR5cGVXaXRoTW9kdWxlYHMKICAgICAqICAgd2hvc2UgcHJvdmlkZXJzIHdpbGwgYWxzbyBiZSBhZGRlZCB0byB0aGUgaW5qZWN0b3IuIExvY2FsbHkgcHJvdmlkZWQgdHlwZXMgd2lsbCBvdmVycmlkZQogICAgICogICBwcm92aWRlcnMgZnJvbSBpbXBvcnRzLgogICAgICoKICAgICAqIEBwdWJsaWNBcGkKICAgICAqLwogICAgZnVuY3Rpb24gybXJtWRlZmluZUluamVjdG9yKG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBmYWN0b3J5OiBvcHRpb25zLmZhY3RvcnksCiAgICAgICAgICAgIHByb3ZpZGVyczogb3B0aW9ucy5wcm92aWRlcnMgfHwgW10sCiAgICAgICAgICAgIGltcG9ydHM6IG9wdGlvbnMuaW1wb3J0cyB8fCBbXSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBSZWFkIHRoZSBpbmplY3RhYmxlIGRlZiAoYMm1cHJvdmApIGZvciBgdHlwZWAgaW4gYSB3YXkgd2hpY2ggaXMgaW1tdW5lIHRvIGFjY2lkZW50YWxseSByZWFkaW5nCiAgICAgKiBpbmhlcml0ZWQgdmFsdWUuCiAgICAgKgogICAgICogQHBhcmFtIHR5cGUgQSB0eXBlIHdoaWNoIG1heSBoYXZlIGl0cyBvd24gKG5vbi1pbmhlcml0ZWQpIGDJtXByb3ZgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRJbmplY3RhYmxlRGVmKHR5cGUpIHsKICAgICAgICByZXR1cm4gZ2V0T3duRGVmaW5pdGlvbih0eXBlLCB0eXBlW05HX1BST1ZfREVGXSkgfHwKICAgICAgICAgICAgZ2V0T3duRGVmaW5pdGlvbih0eXBlLCB0eXBlW05HX0lOSkVDVEFCTEVfREVGXSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiBgZGVmYCBvbmx5IGlmIGl0IGlzIGRlZmluZWQgZGlyZWN0bHkgb24gYHR5cGVgIGFuZCBpcyBub3QgaW5oZXJpdGVkIGZyb20gYSBiYXNlCiAgICAgKiBjbGFzcyBvZiBgdHlwZWAuCiAgICAgKgogICAgICogVGhlIGZ1bmN0aW9uIGBPYmplY3QuaGFzT3duUHJvcGVydHlgIGlzIG5vdCBzdWZmaWNpZW50IHRvIGRpc3Rpbmd1aXNoIHRoaXMgY2FzZSBiZWNhdXNlIGluIG9sZGVyCiAgICAgKiBicm93c2VycyAoZS5nLiBJRTEwKSBzdGF0aWMgcHJvcGVydHkgaW5oZXJpdGFuY2UgaXMgaW1wbGVtZW50ZWQgYnkgY29weWluZyB0aGUgcHJvcGVydGllcy4KICAgICAqCiAgICAgKiBJbnN0ZWFkLCB0aGUgZGVmaW5pdGlvbidzIGB0b2tlbmAgaXMgY29tcGFyZWQgdG8gdGhlIGB0eXBlYCwgYW5kIGlmIHRoZXkgZG9uJ3QgbWF0Y2ggdGhlbiB0aGUKICAgICAqIHByb3BlcnR5IHdhcyBub3QgZGVmaW5lZCBkaXJlY3RseSBvbiB0aGUgdHlwZSBpdHNlbGYsIGFuZCB3YXMgbGlrZWx5IGluaGVyaXRlZC4gVGhlIGRlZmluaXRpb24KICAgICAqIGlzIG9ubHkgcmV0dXJuZWQgaWYgdGhlIGB0eXBlYCBtYXRjaGVzIHRoZSBgZGVmLnRva2VuYC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T3duRGVmaW5pdGlvbih0eXBlLCBkZWYpIHsKICAgICAgICByZXR1cm4gZGVmICYmIGRlZi50b2tlbiA9PT0gdHlwZSA/IGRlZiA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJlYWQgdGhlIGluamVjdGFibGUgZGVmIChgybVwcm92YCkgZm9yIGB0eXBlYCBvciByZWFkIHRoZSBgybVwcm92YCBmcm9tIG9uZSBvZiBpdHMgYW5jZXN0b3JzLgogICAgICoKICAgICAqIEBwYXJhbSB0eXBlIEEgdHlwZSB3aGljaCBtYXkgaGF2ZSBgybVwcm92YCwgdmlhIGluaGVyaXRhbmNlLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIFdpbGwgYmUgcmVtb3ZlZCBpbiB2MTAsIHdoZXJlIGFuIGVycm9yIHdpbGwgb2NjdXIgaW4gdGhlIHNjZW5hcmlvIGlmIHdlIGZpbmQgdGhlCiAgICAgKiBgybVwcm92YCBvbiBhbiBhbmNlc3RvciBvbmx5LgogICAgICovCiAgICBmdW5jdGlvbiBnZXRJbmhlcml0ZWRJbmplY3RhYmxlRGVmKHR5cGUpIHsKICAgICAgICAvLyBTZWUgYGppdC9pbmplY3RhYmxlLnRzI2NvbXBpbGVJbmplY3RhYmxlYCBmb3IgY29udGV4dCBvbiBOR19QUk9WX0RFRl9GQUxMQkFDSy4KICAgICAgICBjb25zdCBkZWYgPSB0eXBlICYmCiAgICAgICAgICAgICh0eXBlW05HX1BST1ZfREVGXSB8fCB0eXBlW05HX0lOSkVDVEFCTEVfREVGXSB8fAogICAgICAgICAgICAgICAgKHR5cGVbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdICYmIHR5cGVbTkdfUFJPVl9ERUZfRkFMTEJBQ0tdKCkpKTsKICAgICAgICBpZiAoZGVmKSB7CiAgICAgICAgICAgIGNvbnN0IHR5cGVOYW1lID0gZ2V0VHlwZU5hbWUodHlwZSk7CiAgICAgICAgICAgIC8vIFRPRE8oRlctMTMwNyk6IFJlLWFkZCBuZ0Rldk1vZGUgd2hlbiBjbG9zdXJlIGNhbiBoYW5kbGUgaXQKICAgICAgICAgICAgLy8gbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGNvbnNvbGUud2FybihgREVQUkVDQVRFRDogREkgaXMgaW5zdGFudGlhdGluZyBhIHRva2VuICIke3R5cGVOYW1lfSIgdGhhdCBpbmhlcml0cyBpdHMgQEluamVjdGFibGUgZGVjb3JhdG9yIGJ1dCBkb2VzIG5vdCBwcm92aWRlIG9uZSBpdHNlbGYuXG5gICsKICAgICAgICAgICAgICAgIGBUaGlzIHdpbGwgYmVjb21lIGFuIGVycm9yIGluIHYxMC4gUGxlYXNlIGFkZCBASW5qZWN0YWJsZSgpIHRvIHRoZSAiJHt0eXBlTmFtZX0iIGNsYXNzLmApOwogICAgICAgICAgICByZXR1cm4gZGVmOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqIEdldHMgdGhlIG5hbWUgb2YgYSB0eXBlLCBhY2NvdW50aW5nIGZvciBzb21lIGNyb3NzLWJyb3dzZXIgZGlmZmVyZW5jZXMuICovCiAgICBmdW5jdGlvbiBnZXRUeXBlTmFtZSh0eXBlKSB7CiAgICAgICAgLy8gYEZ1bmN0aW9uLnByb3RvdHlwZS5uYW1lYCBiZWhhdmVzIGRpZmZlcmVudGx5IGJldHdlZW4gSUUgYW5kIG90aGVyIGJyb3dzZXJzLiBJbiBtb3N0IGJyb3dzZXJzCiAgICAgICAgLy8gaXQnbGwgYWx3YXlzIHJldHVybiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gaXRzZWxmLCBubyBtYXR0ZXIgaG93IG1hbnkgb3RoZXIgZnVuY3Rpb25zIGl0CiAgICAgICAgLy8gaW5oZXJpdHMgZnJvbS4gT24gSUUgdGhlIGZ1bmN0aW9uIGRvZXNuJ3QgaGF2ZSBpdHMgb3duIGBuYW1lYCBwcm9wZXJ0eSwgYnV0IGl0IHRha2VzIGl0IGZyb20KICAgICAgICAvLyB0aGUgbG93ZXN0IGxldmVsIGluIHRoZSBwcm90b3R5cGUgY2hhaW4uIEUuZy4gaWYgd2UgaGF2ZSBgY2xhc3MgRm9vIGV4dGVuZHMgUGFyZW50YCBtb3N0CiAgICAgICAgLy8gYnJvd3NlcnMgd2lsbCBldmFsdWF0ZSBgRm9vLm5hbWVgIHRvIGBGb29gIHdoaWxlIElFIHdpbGwgcmV0dXJuIGBQYXJlbnRgLiBXZSB3b3JrIGFyb3VuZAogICAgICAgIC8vIHRoZSBpc3N1ZSBieSBjb252ZXJ0aW5nIHRoZSBmdW5jdGlvbiB0byBhIHN0cmluZyBhbmQgcGFyc2luZyBpdHMgbmFtZSBvdXQgdGhhdCB3YXkgdmlhIGEgcmVnZXguCiAgICAgICAgaWYgKHR5cGUuaGFzT3duUHJvcGVydHkoJ25hbWUnKSkgewogICAgICAgICAgICByZXR1cm4gdHlwZS5uYW1lOwogICAgICAgIH0KICAgICAgICBjb25zdCBtYXRjaCA9ICgnJyArIHR5cGUpLm1hdGNoKC9eZnVuY3Rpb25ccyooW15ccyhdKykvKTsKICAgICAgICByZXR1cm4gbWF0Y2ggPT09IG51bGwgPyAnJyA6IG1hdGNoWzFdOwogICAgfQogICAgLyoqCiAgICAgKiBSZWFkIHRoZSBpbmplY3RvciBkZWYgdHlwZSBpbiBhIHdheSB3aGljaCBpcyBpbW11bmUgdG8gYWNjaWRlbnRhbGx5IHJlYWRpbmcgaW5oZXJpdGVkIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSB0eXBlIHR5cGUgd2hpY2ggbWF5IGhhdmUgYW4gaW5qZWN0b3IgZGVmIChgybVpbmpgKQogICAgICovCiAgICBmdW5jdGlvbiBnZXRJbmplY3RvckRlZih0eXBlKSB7CiAgICAgICAgcmV0dXJuIHR5cGUgJiYgKHR5cGUuaGFzT3duUHJvcGVydHkoTkdfSU5KX0RFRikgfHwgdHlwZS5oYXNPd25Qcm9wZXJ0eShOR19JTkpFQ1RPUl9ERUYpKSA/CiAgICAgICAgICAgIHR5cGVbTkdfSU5KX0RFRl0gOgogICAgICAgICAgICBudWxsOwogICAgfQogICAgY29uc3QgTkdfUFJPVl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVwcm92OiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwogICAgY29uc3QgTkdfSU5KX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWluajogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKICAgIC8vIE9uIElFMTAgcHJvcGVydGllcyBkZWZpbmVkIHZpYSBgZGVmaW5lUHJvcGVydHlgIHdvbid0IGJlIGluaGVyaXRlZCBieSBjaGlsZCBjbGFzc2VzLAogICAgLy8gd2hpY2ggd2lsbCBicmVhayBpbmhlcml0aW5nIHRoZSBpbmplY3RhYmxlIGRlZmluaXRpb24gZnJvbSBhIGdyYW5kcGFyZW50IHRocm91Z2ggYW4KICAgIC8vIHVuZGVjb3JhdGVkIHBhcmVudCBjbGFzcy4gV2Ugd29yayBhcm91bmQgaXQgYnkgZGVmaW5pbmcgYSBmYWxsYmFjayBtZXRob2Qgd2hpY2ggd2lsbCBiZQogICAgLy8gdXNlZCB0byByZXRyaWV2ZSB0aGUgZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSBhIHByb2JsZW0gaW4gSklUIG1vZGUsIGJlY2F1c2UgaW4KICAgIC8vIEFPVCBUeXBlU2NyaXB0IHNlZW1zIHRvIGhhdmUgYSB3b3JrYXJvdW5kIGZvciBzdGF0aWMgcHJvcGVydGllcy4gV2hlbiBpbmhlcml0aW5nIGZyb20gYW4KICAgIC8vIHVuZGVjb3JhdGVkIHBhcmVudCBpcyBubyBsb25nZXIgc3VwcG9ydGVkIGluIHYxMCwgdGhpcyBjYW4gc2FmZWx5IGJlIHJlbW92ZWQuCiAgICBjb25zdCBOR19QUk9WX0RFRl9GQUxMQkFDSyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtXByb3ZGYWxsYmFjazogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKICAgIC8vIFdlIG5lZWQgdG8ga2VlcCB0aGVzZSBhcm91bmQgc28gd2UgY2FuIHJlYWQgb2ZmIG9sZCBkZWZzIGlmIG5ldyBkZWZzIGFyZSB1bmF2YWlsYWJsZQogICAgY29uc3QgTkdfSU5KRUNUQUJMRV9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgbmdJbmplY3RhYmxlRGVmOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwogICAgY29uc3QgTkdfSU5KRUNUT1JfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IG5nSW5qZWN0b3JEZWY6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gc3RyaW5naWZ5KHRva2VuKSB7CiAgICAgICAgaWYgKHR5cGVvZiB0b2tlbiA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgcmV0dXJuIHRva2VuOwogICAgICAgIH0KICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0b2tlbikpIHsKICAgICAgICAgICAgcmV0dXJuICdbJyArIHRva2VuLm1hcChzdHJpbmdpZnkpLmpvaW4oJywgJykgKyAnXSc7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbiA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAnJyArIHRva2VuOwogICAgICAgIH0KICAgICAgICBpZiAodG9rZW4ub3ZlcnJpZGRlbk5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIGAke3Rva2VuLm92ZXJyaWRkZW5OYW1lfWA7CiAgICAgICAgfQogICAgICAgIGlmICh0b2tlbi5uYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBgJHt0b2tlbi5uYW1lfWA7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlcyA9IHRva2VuLnRvU3RyaW5nKCk7CiAgICAgICAgaWYgKHJlcyA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAnJyArIHJlczsKICAgICAgICB9CiAgICAgICAgY29uc3QgbmV3TGluZUluZGV4ID0gcmVzLmluZGV4T2YoJ1xuJyk7CiAgICAgICAgcmV0dXJuIG5ld0xpbmVJbmRleCA9PT0gLTEgPyByZXMgOiByZXMuc3Vic3RyaW5nKDAsIG5ld0xpbmVJbmRleCk7CiAgICB9CiAgICAvKioKICAgICAqIENvbmNhdGVuYXRlcyB0d28gc3RyaW5ncyB3aXRoIHNlcGFyYXRvciwgYWxsb2NhdGluZyBuZXcgc3RyaW5ncyBvbmx5IHdoZW4gbmVjZXNzYXJ5LgogICAgICoKICAgICAqIEBwYXJhbSBiZWZvcmUgYmVmb3JlIHN0cmluZy4KICAgICAqIEBwYXJhbSBzZXBhcmF0b3Igc2VwYXJhdG9yIHN0cmluZy4KICAgICAqIEBwYXJhbSBhZnRlciBhZnRlciBzdHJpbmcuCiAgICAgKiBAcmV0dXJucyBjb25jYXRlbmF0ZWQgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKGJlZm9yZSwgYWZ0ZXIpIHsKICAgICAgICByZXR1cm4gKGJlZm9yZSA9PSBudWxsIHx8IGJlZm9yZSA9PT0gJycpID8KICAgICAgICAgICAgKGFmdGVyID09PSBudWxsID8gJycgOiBhZnRlcikgOgogICAgICAgICAgICAoKGFmdGVyID09IG51bGwgfHwgYWZ0ZXIgPT09ICcnKSA/IGJlZm9yZSA6IGJlZm9yZSArICcgJyArIGFmdGVyKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9fZm9yd2FyZF9yZWZfXyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBfX2ZvcndhcmRfcmVmX186IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CiAgICAvKioKICAgICAqIEFsbG93cyB0byByZWZlciB0byByZWZlcmVuY2VzIHdoaWNoIGFyZSBub3QgeWV0IGRlZmluZWQuCiAgICAgKgogICAgICogRm9yIGluc3RhbmNlLCBgZm9yd2FyZFJlZmAgaXMgdXNlZCB3aGVuIHRoZSBgdG9rZW5gIHdoaWNoIHdlIG5lZWQgdG8gcmVmZXIgdG8gZm9yIHRoZSBwdXJwb3NlcyBvZgogICAgICogREkgaXMgZGVjbGFyZWQsIGJ1dCBub3QgeWV0IGRlZmluZWQuIEl0IGlzIGFsc28gdXNlZCB3aGVuIHRoZSBgdG9rZW5gIHdoaWNoIHdlIHVzZSB3aGVuIGNyZWF0aW5nCiAgICAgKiBhIHF1ZXJ5IGlzIG5vdCB5ZXQgZGVmaW5lZC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvZm9yd2FyZF9yZWYvZm9yd2FyZF9yZWZfc3BlYy50cyByZWdpb249J2ZvcndhcmRfcmVmJ30KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IGZvcndhcmRSZWZGbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZm9yd2FyZFJlZihmb3J3YXJkUmVmRm4pIHsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGZvcndhcmRSZWZGbikpKS5fX2ZvcndhcmRfcmVmX18gPSBmb3J3YXJkUmVmOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZm9yd2FyZFJlZkZuKSkpLnRvU3RyaW5nID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICByZXR1cm4gc3RyaW5naWZ5KHRoaXMoKSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGZvcndhcmRSZWZGbikpKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBMYXppbHkgcmV0cmlldmVzIHRoZSByZWZlcmVuY2UgdmFsdWUgZnJvbSBhIGZvcndhcmRSZWYuCiAgICAgKgogICAgICogQWN0cyBhcyB0aGUgaWRlbnRpdHkgZnVuY3Rpb24gd2hlbiBnaXZlbiBhIG5vbi1mb3J3YXJkLXJlZiB2YWx1ZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2ZvcndhcmRfcmVmL2ZvcndhcmRfcmVmX3NwZWMudHMgcmVnaW9uPSdyZXNvbHZlX2ZvcndhcmRfcmVmJ30KICAgICAqCiAgICAgKiBAc2VlIGBmb3J3YXJkUmVmYAogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpIHsKICAgICAgICByZXR1cm4gaXNGb3J3YXJkUmVmKHR5cGUpID8gdHlwZSgpIDogdHlwZTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgYSBmdW5jdGlvbiBpcyB3cmFwcGVkIGJ5IGEgYGZvcndhcmRSZWZgLgogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNGb3J3YXJkUmVmKGZuKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBmbiA9PT0gJ2Z1bmN0aW9uJyAmJiBmbi5oYXNPd25Qcm9wZXJ0eShfX2ZvcndhcmRfcmVmX18pICYmCiAgICAgICAgICAgIGZuLl9fZm9yd2FyZF9yZWZfXyA9PT0gZm9yd2FyZFJlZjsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICBjb25zdCBfX2dsb2JhbFRoaXMgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsVGhpczsKICAgIGNvbnN0IF9fd2luZG93ID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93OwogICAgY29uc3QgX19zZWxmID0gdHlwZW9mIHNlbGYgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBXb3JrZXJHbG9iYWxTY29wZSAhPT0gJ3VuZGVmaW5lZCcgJiYKICAgICAgICBzZWxmIGluc3RhbmNlb2YgV29ya2VyR2xvYmFsU2NvcGUgJiYgc2VsZjsKICAgIGNvbnN0IF9fZ2xvYmFsID0gdHlwZW9mIGdsb2JhbCAhPT0gJ3VuZGVmaW5lZCcgJiYgZ2xvYmFsOwogICAgLy8gQWx3YXlzIHVzZSBfX2dsb2JhbFRoaXMgaWYgYXZhaWxhYmxlLCB3aGljaCBpcyB0aGUgc3BlYy1kZWZpbmVkIGdsb2JhbCB2YXJpYWJsZSBhY3Jvc3MgYWxsCiAgICAvLyBlbnZpcm9ubWVudHMsIHRoZW4gZmFsbGJhY2sgdG8gX19nbG9iYWwgZmlyc3QsIGJlY2F1c2UgaW4gTm9kZSB0ZXN0cyBib3RoIF9fZ2xvYmFsIGFuZAogICAgLy8gX193aW5kb3cgbWF5IGJlIGRlZmluZWQgYW5kIF9nbG9iYWwgc2hvdWxkIGJlIF9fZ2xvYmFsIGluIHRoYXQgY2FzZS4KICAgIGNvbnN0IF9nbG9iYWwgPSBfX2dsb2JhbFRoaXMgfHwgX19nbG9iYWwgfHwgX193aW5kb3cgfHwgX19zZWxmOwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIHZhciBSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGU7CiAgICAoZnVuY3Rpb24gKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSkgewogICAgICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbIlRva2VuIl0gPSAwXSA9ICJUb2tlbiI7CiAgICAgICAgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlW1IzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVsiQXR0cmlidXRlIl0gPSAxXSA9ICJBdHRyaWJ1dGUiOwogICAgICAgIFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVtSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGVbIkNoYW5nZURldGVjdG9yUmVmIl0gPSAyXSA9ICJDaGFuZ2VEZXRlY3RvclJlZiI7CiAgICAgICAgUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlW1IzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZVsiSW52YWxpZCJdID0gM10gPSAiSW52YWxpZCI7CiAgICB9KShSM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUgfHwgKFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZSA9IHt9KSk7CiAgICB2YXIgUjNGYWN0b3J5VGFyZ2V0OwogICAgKGZ1bmN0aW9uIChSM0ZhY3RvcnlUYXJnZXQpIHsKICAgICAgICBSM0ZhY3RvcnlUYXJnZXRbUjNGYWN0b3J5VGFyZ2V0WyJEaXJlY3RpdmUiXSA9IDBdID0gIkRpcmVjdGl2ZSI7CiAgICAgICAgUjNGYWN0b3J5VGFyZ2V0W1IzRmFjdG9yeVRhcmdldFsiQ29tcG9uZW50Il0gPSAxXSA9ICJDb21wb25lbnQiOwogICAgICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIkluamVjdGFibGUiXSA9IDJdID0gIkluamVjdGFibGUiOwogICAgICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIlBpcGUiXSA9IDNdID0gIlBpcGUiOwogICAgICAgIFIzRmFjdG9yeVRhcmdldFtSM0ZhY3RvcnlUYXJnZXRbIk5nTW9kdWxlIl0gPSA0XSA9ICJOZ01vZHVsZSI7CiAgICB9KShSM0ZhY3RvcnlUYXJnZXQgfHwgKFIzRmFjdG9yeVRhcmdldCA9IHt9KSk7CiAgICB2YXIgVmlld0VuY2Fwc3VsYXRpb247CiAgICAoZnVuY3Rpb24gKFZpZXdFbmNhcHN1bGF0aW9uKSB7CiAgICAgICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIkVtdWxhdGVkIl0gPSAwXSA9ICJFbXVsYXRlZCI7CiAgICAgICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIk5hdGl2ZSJdID0gMV0gPSAiTmF0aXZlIjsKICAgICAgICBWaWV3RW5jYXBzdWxhdGlvbltWaWV3RW5jYXBzdWxhdGlvblsiTm9uZSJdID0gMl0gPSAiTm9uZSI7CiAgICAgICAgVmlld0VuY2Fwc3VsYXRpb25bVmlld0VuY2Fwc3VsYXRpb25bIlNoYWRvd0RvbSJdID0gM10gPSAiU2hhZG93RG9tIjsKICAgIH0pKFZpZXdFbmNhcHN1bGF0aW9uIHx8IChWaWV3RW5jYXBzdWxhdGlvbiA9IHt9KSk7CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q29tcGlsZXJGYWNhZGUoKSB7CiAgICAgICAgY29uc3QgZ2xvYmFsTmcgPSBfZ2xvYmFsWyduZyddOwogICAgICAgIGlmICghZ2xvYmFsTmcgfHwgIWdsb2JhbE5nLsm1Y29tcGlsZXJGYWNhZGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBbmd1bGFyIEpJVCBjb21waWxhdGlvbiBmYWlsZWQ6ICdAYW5ndWxhci9jb21waWxlcicgbm90IGxvYWRlZCFcbmAgKwogICAgICAgICAgICAgICAgYCAgLSBKSVQgY29tcGlsYXRpb24gaXMgZGlzY291cmFnZWQgZm9yIHByb2R1Y3Rpb24gdXNlLWNhc2VzISBDb25zaWRlciBBT1QgbW9kZSBpbnN0ZWFkLlxuYCArCiAgICAgICAgICAgICAgICBgICAtIERpZCB5b3UgYm9vdHN0cmFwIHVzaW5nICdAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyLWR5bmFtaWMnIG9yICdAYW5ndWxhci9wbGF0Zm9ybS1zZXJ2ZXInP1xuYCArCiAgICAgICAgICAgICAgICBgICAtIEFsdGVybmF0aXZlbHkgcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCAnaW1wb3J0ICJAYW5ndWxhci9jb21waWxlciI7JyBiZWZvcmUgYm9vdHN0cmFwcGluZy5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdsb2JhbE5nLsm1Y29tcGlsZXJGYWNhZGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ZpZWxkcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOR19DT01QX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWNtcDogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5HX0RJUl9ERUYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgybVkaXI6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOR19QSVBFX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtXBpcGU6IGdldENsb3N1cmVTYWZlUHJvcGVydHkgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOR19NT0RfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IMm1bW9kOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTkdfTE9DX0lEX0RFRiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyDJtWxvYzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5HX0ZBQ1RPUllfREVGID0gZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSh7IMm1ZmFjOiBnZXRDbG9zdXJlU2FmZVByb3BlcnR5IH0pOwogICAgLy8gVE9ETyhtaXNrbyk6IFRoaXMgaXMgd3JvbmcuIFRoZSBOR19FTEVNRU5UX0lEIHNob3VsZCBuZXZlciBiZSBtaW5pZmllZC4KICAgIC8qKgogICAgICogSWYgYSBkaXJlY3RpdmUgaXMgZGlQdWJsaWMsIGJsb29tQWRkIHNldHMgYSBwcm9wZXJ0eSBvbiB0aGUgdHlwZSB3aXRoIHRoaXMgY29uc3RhbnQgYXMKICAgICAqIHRoZSBrZXkgYW5kIHRoZSBkaXJlY3RpdmUncyB1bmlxdWUgSUQgYXMgdGhlIHZhbHVlLiBUaGlzIGFsbG93cyB1cyB0byBtYXAgZGlyZWN0aXZlcyB0byB0aGVpcgogICAgICogYmxvb20gZmlsdGVyIGJpdCBmb3IgREkuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTkdfRUxFTUVOVF9JRCA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBfX05HX0VMRU1FTlRfSURfXzogZ2V0Q2xvc3VyZVNhZmVQcm9wZXJ0eSB9KTsKCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICBmdW5jdGlvbiBuZ0Rldk1vZGVSZXNldFBlcmZDb3VudGVycygpIHsKICAgICAgICBjb25zdCBsb2NhdGlvblN0cmluZyA9IHR5cGVvZiBsb2NhdGlvbiAhPT0gJ3VuZGVmaW5lZCcgPyBsb2NhdGlvbi50b1N0cmluZygpIDogJyc7CiAgICAgICAgY29uc3QgbmV3Q291bnRlcnMgPSB7CiAgICAgICAgICAgIG5hbWVkQ29uc3RydWN0b3JzOiBsb2NhdGlvblN0cmluZy5pbmRleE9mKCduZ0Rldk1vZGU9bmFtZWRDb25zdHJ1Y3RvcnMnKSAhPSAtMSwKICAgICAgICAgICAgZmlyc3RDcmVhdGVQYXNzOiAwLAogICAgICAgICAgICB0Tm9kZTogMCwKICAgICAgICAgICAgdFZpZXc6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyQ3JlYXRlVGV4dE5vZGU6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyU2V0VGV4dDogMCwKICAgICAgICAgICAgcmVuZGVyZXJDcmVhdGVFbGVtZW50OiAwLAogICAgICAgICAgICByZW5kZXJlckFkZEV2ZW50TGlzdGVuZXI6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyU2V0QXR0cmlidXRlOiAwLAogICAgICAgICAgICByZW5kZXJlclJlbW92ZUF0dHJpYnV0ZTogMCwKICAgICAgICAgICAgcmVuZGVyZXJTZXRQcm9wZXJ0eTogMCwKICAgICAgICAgICAgcmVuZGVyZXJTZXRDbGFzc05hbWU6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyQWRkQ2xhc3M6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyUmVtb3ZlQ2xhc3M6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyU2V0U3R5bGU6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyUmVtb3ZlU3R5bGU6IDAsCiAgICAgICAgICAgIHJlbmRlcmVyRGVzdHJveTogMCwKICAgICAgICAgICAgcmVuZGVyZXJEZXN0cm95Tm9kZTogMCwKICAgICAgICAgICAgcmVuZGVyZXJNb3ZlTm9kZTogMCwKICAgICAgICAgICAgcmVuZGVyZXJSZW1vdmVOb2RlOiAwLAogICAgICAgICAgICByZW5kZXJlckFwcGVuZENoaWxkOiAwLAogICAgICAgICAgICByZW5kZXJlckluc2VydEJlZm9yZTogMCwKICAgICAgICAgICAgcmVuZGVyZXJDcmVhdGVDb21tZW50OiAwLAogICAgICAgIH07CiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIHJlZmVyIHRvIG5nRGV2TW9kZSBhcyBbJ25nRGV2TW9kZSddIGZvciBjbG9zdXJlLgogICAgICAgIGNvbnN0IGFsbG93TmdEZXZNb2RlVHJ1ZSA9IGxvY2F0aW9uU3RyaW5nLmluZGV4T2YoJ25nRGV2TW9kZT1mYWxzZScpID09PSAtMTsKICAgICAgICBfZ2xvYmFsWyduZ0Rldk1vZGUnXSA9IGFsbG93TmdEZXZNb2RlVHJ1ZSAmJiBuZXdDb3VudGVyczsKICAgICAgICByZXR1cm4gbmV3Q291bnRlcnM7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgYG5nRGV2TW9kZWAgaGFzIGJlZW4gc2V0LiBJZiB5ZXMsCiAgICAgKiB0aGVuIHdlIGhvbm9yIGl0LCBvdGhlcndpc2Ugd2UgZGVmYXVsdCB0byBkZXYgbW9kZSB3aXRoIGFkZGl0aW9uYWwgY2hlY2tzLgogICAgICoKICAgICAqIFRoZSBpZGVhIGlzIHRoYXQgdW5sZXNzIHdlIGFyZSBkb2luZyBwcm9kdWN0aW9uIGJ1aWxkIHdoZXJlIHdlIGV4cGxpY2l0bHkKICAgICAqIHNldCBgbmdEZXZNb2RlID09IGZhbHNlYCB3ZSBzaG91bGQgYmUgaGVscGluZyB0aGUgZGV2ZWxvcGVyIGJ5IHByb3ZpZGluZwogICAgICogYXMgbXVjaCBlYXJseSB3YXJuaW5nIGFuZCBlcnJvcnMgYXMgcG9zc2libGUuCiAgICAgKgogICAgICogYMm1ybVkZWZpbmVDb21wb25lbnRgIGlzIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGNhbGxlZCBiZWZvcmUgYW55IGNvbXBvbmVudCB0ZW1wbGF0ZSBmdW5jdGlvbnMKICAgICAqIChhbmQgdGh1cyBJdnkgaW5zdHJ1Y3Rpb25zKSwgc28gYSBzaW5nbGUgaW5pdGlhbGl6YXRpb24gdGhlcmUgaXMgc3VmZmljaWVudCB0byBlbnN1cmUgbmdEZXZNb2RlCiAgICAgKiBpcyBkZWZpbmVkIGZvciB0aGUgZW50aXJlIGluc3RydWN0aW9uIHNldC4KICAgICAqCiAgICAgKiBXaGVuIHVzaW5nIGNoZWNraW5nIGBuZ0Rldk1vZGVgIG9uIHRvcGxldmVsLCBhbHdheXMgaW5pdCBpdCBiZWZvcmUgcmVmZXJlbmNpbmcgaXQKICAgICAqIChlLmcuIGAoKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgJiYgaW5pdE5nRGV2TW9kZSgpKWApLCBvdGhlcndpc2UgeW91IGNhbgogICAgICogIGdldCBhIGBSZWZlcmVuY2VFcnJvcmAgbGlrZSBpbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMTU5NS4KICAgICAqCiAgICAgKiBEZXRhaWxzIG9uIHBvc3NpYmxlIHZhbHVlcyBmb3IgYG5nRGV2TW9kZWAgY2FuIGJlIGZvdW5kIG9uIGl0cyBkb2NzdHJpbmcuCiAgICAgKgogICAgICogTk9URToKICAgICAqIC0gY2hhbmdlcyB0byB0aGUgYG5nRGV2TW9kZWAgbmFtZSBtdXN0IGJlIHN5bmNlZCB3aXRoIGBjb21waWxlci1jbGkvc3JjL3Rvb2xpbmcudHNgLgogICAgICovCiAgICBmdW5jdGlvbiBpbml0TmdEZXZNb2RlKCkgewogICAgICAgIC8vIFRoZSBiZWxvdyBjaGVja3MgYXJlIHRvIGVuc3VyZSB0aGF0IGNhbGxpbmcgYGluaXROZ0Rldk1vZGVgIG11bHRpcGxlIHRpbWVzIGRvZXMgbm90CiAgICAgICAgLy8gcmVzZXQgdGhlIGNvdW50ZXJzLgogICAgICAgIC8vIElmIHRoZSBgbmdEZXZNb2RlYCBpcyBub3QgYW4gb2JqZWN0LCB0aGVuIGl0IG1lYW5zIHdlIGhhdmUgbm90IGNyZWF0ZWQgdGhlIHBlcmYgY291bnRlcnMKICAgICAgICAvLyB5ZXQuCiAgICAgICAgaWYgKHR5cGVvZiBuZ0Rldk1vZGUgPT09ICd1bmRlZmluZWQnIHx8IG5nRGV2TW9kZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIG5nRGV2TW9kZSAhPT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZVJlc2V0UGVyZkNvdW50ZXJzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICEhbmdEZXZNb2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9pbmplY3Rpb25fdG9rZW4udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCBpbiBhIERJIFByb3ZpZGVyLgogICAgICoKICAgICAqIFVzZSBhbiBgSW5qZWN0aW9uVG9rZW5gIHdoZW5ldmVyIHRoZSB0eXBlIHlvdSBhcmUgaW5qZWN0aW5nIGlzIG5vdCByZWlmaWVkIChkb2VzIG5vdCBoYXZlIGEKICAgICAqIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24pIHN1Y2ggYXMgd2hlbiBpbmplY3RpbmcgYW4gaW50ZXJmYWNlLCBjYWxsYWJsZSB0eXBlLCBhcnJheSBvcgogICAgICogcGFyYW1ldGVyaXplZCB0eXBlLgogICAgICoKICAgICAqIGBJbmplY3Rpb25Ub2tlbmAgaXMgcGFyYW1ldGVyaXplZCBvbiBgVGAgd2hpY2ggaXMgdGhlIHR5cGUgb2Ygb2JqZWN0IHdoaWNoIHdpbGwgYmUgcmV0dXJuZWQgYnkKICAgICAqIHRoZSBgSW5qZWN0b3JgLiBUaGlzIHByb3ZpZGVzIGFkZGl0aW9uYWwgbGV2ZWwgb2YgdHlwZSBzYWZldHkuCiAgICAgKgogICAgICogYGBgCiAgICAgKiBpbnRlcmZhY2UgTXlJbnRlcmZhY2Ugey4uLn0KICAgICAqIHZhciBteUludGVyZmFjZSA9IGluamVjdG9yLmdldChuZXcgSW5qZWN0aW9uVG9rZW48TXlJbnRlcmZhY2U+KCdTb21lVG9rZW4nKSk7CiAgICAgKiAvLyBteUludGVyZmFjZSBpcyBpbmZlcnJlZCB0byBiZSBNeUludGVyZmFjZS4KICAgICAqIGBgYAogICAgICoKICAgICAqIFdoZW4gY3JlYXRpbmcgYW4gYEluamVjdGlvblRva2VuYCwgeW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBmYWN0b3J5IGZ1bmN0aW9uIHdoaWNoIHJldHVybnMKICAgICAqIChwb3NzaWJseSBieSBjcmVhdGluZykgYSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBwYXJhbWV0ZXJpemVkIHR5cGUgYFRgLiBUaGlzIHNldHMgdXAgdGhlCiAgICAgKiBgSW5qZWN0aW9uVG9rZW5gIHVzaW5nIHRoaXMgZmFjdG9yeSBhcyBhIHByb3ZpZGVyIGFzIGlmIGl0IHdhcyBkZWZpbmVkIGV4cGxpY2l0bHkgaW4gdGhlCiAgICAgKiBhcHBsaWNhdGlvbidzIHJvb3QgaW5qZWN0b3IuIElmIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLCB3aGljaCB0YWtlcyB6ZXJvIGFyZ3VtZW50cywgbmVlZHMgdG8gaW5qZWN0CiAgICAgKiBkZXBlbmRlbmNpZXMsIGl0IGNhbiBkbyBzbyB1c2luZyB0aGUgYGluamVjdGAgZnVuY3Rpb24uIFNlZSBiZWxvdyBmb3IgYW4gZXhhbXBsZS4KICAgICAqCiAgICAgKiBBZGRpdGlvbmFsbHksIGlmIGEgYGZhY3RvcnlgIGlzIHNwZWNpZmllZCB5b3UgY2FuIGFsc28gc3BlY2lmeSB0aGUgYHByb3ZpZGVkSW5gIG9wdGlvbiwgd2hpY2gKICAgICAqIG92ZXJyaWRlcyB0aGUgYWJvdmUgYmVoYXZpb3IgYW5kIG1hcmtzIHRoZSB0b2tlbiBhcyBiZWxvbmdpbmcgdG8gYSBwYXJ0aWN1bGFyIGBcQE5nTW9kdWxlYC4gQXMKICAgICAqIG1lbnRpb25lZCBhYm92ZSwgYCdyb290J2AgaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGBwcm92aWRlZEluYC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBCYXNpYyBFeGFtcGxlCiAgICAgKgogICAgICogIyMjIFBsYWluIEluamVjdGlvblRva2VuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdJbmplY3Rpb25Ub2tlbid9CiAgICAgKgogICAgICogIyMjIFRyZWUtc2hha2FibGUgSW5qZWN0aW9uVG9rZW4KICAgICAqCiAgICAgKiB7XEBleGFtcGxlIGNvcmUvZGkvdHMvaW5qZWN0b3Jfc3BlYy50cyByZWdpb249J1NoYWthYmxlSW5qZWN0aW9uVG9rZW4nfQogICAgICoKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgSW5qZWN0aW9uVG9rZW4gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2Rlc2MKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2Rlc2MsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fZGVzYyA9IF9kZXNjOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5uZ01ldGFkYXRhTmFtZSA9ICdJbmplY3Rpb25Ub2tlbic7CiAgICAgICAgICAgIHRoaXMuybVwcm92ID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAodHlwZW9mIG9wdGlvbnMgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBzcGVjaWFsIGhhY2sgdG8gYXNzaWduIF9fTkdfRUxFTUVOVF9JRF9fIHRvIHRoaXMgaW5zdGFuY2UuCiAgICAgICAgICAgICAgICAvLyBfX05HX0VMRU1FTlRfSURfXyBpcyBVc2VkIGJ5IEl2eSB0byBkZXRlcm1pbmUgYmxvb20gZmlsdGVyIGlkLgogICAgICAgICAgICAgICAgLy8gV2UgYXJlIHVzaW5nIGl0IHRvIGFzc2lnbiBgLTFgIHdoaWNoIGlzIHVzZWQgdG8gaWRlbnRpZnkgYEluamVjdG9yYC4KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5fX05HX0VMRU1FTlRfSURfXyA9IG9wdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgICAgICAgICAgICAgICAgICB0b2tlbjogdGhpcywKICAgICAgICAgICAgICAgICAgICBwcm92aWRlZEluOiBvcHRpb25zLnByb3ZpZGVkSW4gfHwgJ3Jvb3QnLAogICAgICAgICAgICAgICAgICAgIGZhY3Rvcnk6IG9wdGlvbnMuZmFjdG9yeSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiBgSW5qZWN0aW9uVG9rZW4gJHt0aGlzLl9kZXNjfWA7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvaW5qZWN0b3JfY29tcGF0aWJpbGl0eS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuIEluamVjdGlvblRva2VuIHRoYXQgZ2V0cyB0aGUgY3VycmVudCBgSW5qZWN0b3JgIGZvciBgY3JlYXRlSW5qZWN0b3IoKWAtc3R5bGUgaW5qZWN0b3JzLgogICAgICoKICAgICAqIFJlcXVlc3RpbmcgdGhpcyB0b2tlbiBpbnN0ZWFkIG9mIGBJbmplY3RvcmAgYWxsb3dzIGBTdGF0aWNJbmplY3RvcmAgdG8gYmUgdHJlZS1zaGFrZW4gZnJvbSBhCiAgICAgKiBwcm9qZWN0LgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSU5KRUNUT1IgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0lOSkVDVE9SJywgKC8qKiBAdHlwZSB7P30gKi8gKC0xKSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX1RIUk9XX0lGX05PVF9GT1VORCA9IHt9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVEhST1dfSUZfTk9UX0ZPVU5EID0gX1RIUk9XX0lGX05PVF9GT1VORDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5HX1RFTVBfVE9LRU5fUEFUSCA9ICduZ1RlbXBUb2tlblBhdGgnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTkdfVE9LRU5fUEFUSCA9ICduZ1Rva2VuUGF0aCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBORVdfTElORSA9IC9cbi9nbTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5PX05FV19MSU5FID0gJ8m1JzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNPVVJDRSA9ICdfX3NvdXJjZSc7CiAgICBjb25zdCDJtTAkMSA9IGdldENsb3N1cmVTYWZlUHJvcGVydHk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBVU0VfVkFMVUUgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgcHJvdmlkZTogU3RyaW5nLCB1c2VWYWx1ZTogybUwJDEgfSk7CiAgICAvKioKICAgICAqIEN1cnJlbnQgaW5qZWN0b3IgdmFsdWUgdXNlZCBieSBgaW5qZWN0YC4KICAgICAqIC0gYHVuZGVmaW5lZGA6IGl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYGluamVjdGAKICAgICAqIC0gYG51bGxgOiBgaW5qZWN0YCBjYW4gYmUgY2FsbGVkIGJ1dCB0aGVyZSBpcyBubyBpbmplY3RvciAobGltcC1tb2RlKS4KICAgICAqIC0gSW5qZWN0b3IgaW5zdGFuY2U6IFVzZSB0aGUgaW5qZWN0b3IgZm9yIHJlc29sdXRpb24uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgbGV0IF9jdXJyZW50SW5qZWN0b3IgPSB1bmRlZmluZWQ7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEN1cnJlbnRJbmplY3RvcihpbmplY3RvcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmb3JtZXIgPSBfY3VycmVudEluamVjdG9yOwogICAgICAgIF9jdXJyZW50SW5qZWN0b3IgPSBpbmplY3RvcjsKICAgICAgICByZXR1cm4gZm9ybWVyOwogICAgfQogICAgLyoqCiAgICAgKiBDdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIGluamVjdC4KICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCBpdCBpcyBgaW5qZWN0SW5qZWN0b3JPbmx5YCwgd2hpY2ggbWFrZXMgaXQgYEluamVjdG9yYC1vbmx5IGF3YXJlLiBJdCBjYW4gYmUgY2hhbmdlZAogICAgICogdG8gYGRpcmVjdGl2ZUluamVjdGAsIHdoaWNoIGJyaW5ncyBpbiB0aGUgYE5vZGVJbmplY3RvcmAgc3lzdGVtIG9mIGl2eS4gSXQgaXMgZGVzaWduZWQgdGhpcwogICAgICogd2F5IGZvciB0d28gcmVhc29uczoKICAgICAqICAxLiBgSW5qZWN0b3JgIHNob3VsZCBub3QgZGVwZW5kIG9uIGl2eSBsb2dpYy4KICAgICAqICAyLiBUbyBtYWludGFpbiB0cmVlIHNoYWtlLWFiaWxpdHkgd2UgZG9uJ3Qgd2FudCB0byBicmluZyBpbiB1bm5lY2Vzc2FyeSBjb2RlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBfaW5qZWN0SW1wbGVtZW50YXRpb247CiAgICAvKioKICAgICAqIFNldHMgdGhlIGN1cnJlbnQgaW5qZWN0IGltcGxlbWVudGF0aW9uLgogICAgICogQHBhcmFtIHs/fSBpbXBsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihpbXBsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZpb3VzID0gX2luamVjdEltcGxlbWVudGF0aW9uOwogICAgICAgIF9pbmplY3RJbXBsZW1lbnRhdGlvbiA9IGltcGw7CiAgICAgICAgcmV0dXJuIHByZXZpb3VzOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHBhcmFtIHs/PX0gZmxhZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdEluamVjdG9yT25seSh0b2tlbiwgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICAgICAgaWYgKF9jdXJyZW50SW5qZWN0b3IgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGluamVjdCgpIG11c3QgYmUgY2FsbGVkIGZyb20gYW4gaW5qZWN0aW9uIGNvbnRleHRgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoX2N1cnJlbnRJbmplY3RvciA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gaW5qZWN0Um9vdExpbXBNb2RlKHRva2VuLCB1bmRlZmluZWQsIGZsYWdzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBfY3VycmVudEluamVjdG9yLmdldCh0b2tlbiwgZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCA/IG51bGwgOiB1bmRlZmluZWQsIGZsYWdzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez89fSBmbGFncwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWluamVjdCh0b2tlbiwgZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICAgICAgcmV0dXJuIChfaW5qZWN0SW1wbGVtZW50YXRpb24gfHwgaW5qZWN0SW5qZWN0b3JPbmx5KShyZXNvbHZlRm9yd2FyZFJlZih0b2tlbiksIGZsYWdzKTsKICAgIH0KICAgIC8qKgogICAgICogVGhyb3dzIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCBhIGZhY3RvcnkgZnVuY3Rpb24gY291bGQgbm90IGJlIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIgZm9yIGEKICAgICAqIHBhcnRpY3VsYXIgY2xhc3MuCiAgICAgKgogICAgICogVGhpcyBpbnN0cnVjdGlvbiBhbGxvd3MgdGhlIGFjdHVhbCBlcnJvciBtZXNzYWdlIHRvIGJlIG9wdGltaXplZCBhd2F5IHdoZW4gbmdEZXZNb2RlIGlzIHR1cm5lZAogICAgICogb2ZmLCBzYXZpbmcgYnl0ZXMgb2YgZ2VuZXJhdGVkIGNvZGUgd2hpbGUgc3RpbGwgcHJvdmlkaW5nIGEgZ29vZCBleHBlcmllbmNlIGluIGRldiBtb2RlLgogICAgICoKICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjbGFzcyBpcyBub3QgbWVudGlvbmVkIGhlcmUsIGJ1dCB3aWxsIGJlIGluIHRoZSBnZW5lcmF0ZWQgZmFjdG9yeSBmdW5jdGlvbiBuYW1lCiAgICAgKiBhbmQgdGh1cyBpbiB0aGUgc3RhY2sgdHJhY2UuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1aW52YWxpZEZhY3RvcnlEZXAoaW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbXNnID0gbmdEZXZNb2RlID8KICAgICAgICAgICAgYFRoaXMgY29uc3RydWN0b3IgaXMgbm90IGNvbXBhdGlibGUgd2l0aCBBbmd1bGFyIERlcGVuZGVuY3kgSW5qZWN0aW9uIGJlY2F1c2UgaXRzIGRlcGVuZGVuY3kgYXQgaW5kZXggJHtpbmRleH0gb2YgdGhlIHBhcmFtZXRlciBsaXN0IGlzIGludmFsaWQuClRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgZGVwZW5kZW5jeSB0eXBlIGlzIGEgcHJpbWl0aXZlIGxpa2UgYSBzdHJpbmcgb3IgaWYgYW4gYW5jZXN0b3Igb2YgdGhpcyBjbGFzcyBpcyBtaXNzaW5nIGFuIEFuZ3VsYXIgZGVjb3JhdG9yLgoKUGxlYXNlIGNoZWNrIHRoYXQgMSkgdGhlIHR5cGUgZm9yIHRoZSBwYXJhbWV0ZXIgYXQgaW5kZXggJHtpbmRleH0gaXMgY29ycmVjdCBhbmQgMikgdGhlIGNvcnJlY3QgQW5ndWxhciBkZWNvcmF0b3JzIGFyZSBkZWZpbmVkIGZvciB0aGlzIGNsYXNzIGFuZCBpdHMgYW5jZXN0b3JzLmAgOgogICAgICAgICAgICAnaW52YWxpZCc7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICB9CiAgICAvKioKICAgICAqIEluamVjdHMgYSB0b2tlbiBmcm9tIHRoZSBjdXJyZW50bHkgYWN0aXZlIGluamVjdG9yLgogICAgICoKICAgICAqIE11c3QgYmUgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIGZhY3RvcnkgZnVuY3Rpb24gc3VjaCBhcyBvbmUgZGVmaW5lZCBmb3IgYW4KICAgICAqIGBJbmplY3Rpb25Ub2tlbmAuIFRocm93cyBhbiBlcnJvciBpZiBub3QgY2FsbGVkIGZyb20gc3VjaCBhIGNvbnRleHQuCiAgICAgKgogICAgICogV2l0aGluIHN1Y2ggYSBmYWN0b3J5IGZ1bmN0aW9uLCB1c2luZyB0aGlzIGZ1bmN0aW9uIHRvIHJlcXVlc3QgaW5qZWN0aW9uIG9mIGEgZGVwZW5kZW5jeQogICAgICogaXMgZmFzdGVyIGFuZCBtb3JlIHR5cGUtc2FmZSB0aGFuIHByb3ZpZGluZyBhbiBhZGRpdGlvbmFsIGFycmF5IG9mIGRlcGVuZGVuY2llcwogICAgICogKGFzIGhhcyBiZWVuIGNvbW1vbiB3aXRoIGB1c2VGYWN0b3J5YCBwcm92aWRlcnMpLgogICAgICoKICAgICAqIFxAcGFyYW0gdG9rZW4gVGhlIGluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGRlcGVuZGVuY3kgdG8gYmUgaW5qZWN0ZWQuCiAgICAgKiBcQHBhcmFtIGZsYWdzIE9wdGlvbmFsIGZsYWdzIHRoYXQgY29udHJvbCBob3cgaW5qZWN0aW9uIGlzIGV4ZWN1dGVkLgogICAgICogVGhlIGZsYWdzIGNvcnJlc3BvbmQgdG8gaW5qZWN0aW9uIHN0cmF0ZWdpZXMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIHdpdGgKICAgICAqIHBhcmFtZXRlciBkZWNvcmF0b3JzIGBcQEhvc3RgLCBgXEBTZWxmYCwgYFxAU2tpcFNlZmAsIGFuZCBgXEBPcHRpb25hbGAuCiAgICAgKiBcQHJldHVybiBUcnVlIGlmIGluamVjdGlvbiBpcyBzdWNjZXNzZnVsLCBudWxsIG90aGVyd2lzZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0nU2hha2FibGVJbmplY3Rpb25Ub2tlbid9CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBpbmplY3QgPSDJtcm1aW5qZWN0OwogICAgLyoqCiAgICAgKiBJbmplY3RzIGByb290YCB0b2tlbnMgaW4gbGltcCBtb2RlLgogICAgICoKICAgICAqIElmIG5vIGluamVjdG9yIGV4aXN0cywgd2UgY2FuIHN0aWxsIGluamVjdCB0cmVlLXNoYWthYmxlIHByb3ZpZGVycyB3aGljaCBoYXZlIGBwcm92aWRlZEluYCBzZXQgdG8KICAgICAqIGAicm9vdCJgLiBUaGlzIGlzIGtub3duIGFzIHRoZSBsaW1wIG1vZGUgaW5qZWN0aW9uLiBJbiBzdWNoIGNhc2UgdGhlIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUKICAgICAqIGBJbmplY3RhYmxlRGVmYC4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez99IG5vdEZvdW5kVmFsdWUKICAgICAqIEBwYXJhbSB7P30gZmxhZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdFJvb3RMaW1wTW9kZSh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgZmxhZ3MpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5qZWN0YWJsZURlZiA9IGdldEluamVjdGFibGVEZWYodG9rZW4pOwogICAgICAgIGlmIChpbmplY3RhYmxlRGVmICYmIGluamVjdGFibGVEZWYucHJvdmlkZWRJbiA9PSAncm9vdCcpIHsKICAgICAgICAgICAgcmV0dXJuIGluamVjdGFibGVEZWYudmFsdWUgPT09IHVuZGVmaW5lZCA/IGluamVjdGFibGVEZWYudmFsdWUgPSBpbmplY3RhYmxlRGVmLmZhY3RvcnkoKSA6CiAgICAgICAgICAgICAgICBpbmplY3RhYmxlRGVmLnZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKG5vdEZvdW5kVmFsdWUgIT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbmplY3RvcjogTk9UX0ZPVU5EIFske3N0cmluZ2lmeSh0b2tlbil9XWApOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbmplY3RBcmdzKHR5cGVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFyZ3MgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXJnID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZXNbaV0pOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShhcmcpKSB7CiAgICAgICAgICAgICAgICBpZiAoYXJnLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXJndW1lbnRzIGFycmF5IG11c3QgaGF2ZSBhcmd1bWVudHMuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQ7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGFyZy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gYXJnW2pdOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRhIGluc3RhbmNlb2YgT3B0aW9uYWwgfHwgbWV0YS5uZ01ldGFkYXRhTmFtZSA9PT0gJ09wdGlvbmFsJyB8fCBtZXRhID09PSBPcHRpb25hbCkgewogICAgICAgICAgICAgICAgICAgICAgICBmbGFncyB8PSBJbmplY3RGbGFncy5PcHRpb25hbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobWV0YSBpbnN0YW5jZW9mIFNraXBTZWxmIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdTa2lwU2VsZicgfHwgbWV0YSA9PT0gU2tpcFNlbGYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgfD0gSW5qZWN0RmxhZ3MuU2tpcFNlbGY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBTZWxmIHx8IG1ldGEubmdNZXRhZGF0YU5hbWUgPT09ICdTZWxmJyB8fCBtZXRhID09PSBTZWxmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IEluamVjdEZsYWdzLlNlbGY7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldGEgaW5zdGFuY2VvZiBJbmplY3QgfHwgbWV0YSA9PT0gSW5qZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBtZXRhLnRva2VuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9IG1ldGE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgYXJncy5wdXNoKMm1ybVpbmplY3QoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSwgZmxhZ3MpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGFyZ3MucHVzaCjJtcm1aW5qZWN0KGFyZykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcmdzOwogICAgfQogICAgY2xhc3MgTnVsbEluamVjdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlID0gVEhST1dfSUZfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgIGlmIChub3RGb3VuZFZhbHVlID09PSBUSFJPV19JRl9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgbGVmdCBiZWhpbmQ6IFdpdGggZGV2IHRvb2xzIG9wZW4gdGhlIGRlYnVnZ2VyIHdpbGwgc3RvcCBoZXJlLiBUaGVyZSBpcyBubwogICAgICAgICAgICAgICAgLy8gcmVhc29uIHdoeSBjb3JyZWN0bHkgd3JpdHRlbiBhcHBsaWNhdGlvbiBzaG91bGQgY2F1c2UgdGhpcyBleGNlcHRpb24uCiAgICAgICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogdW5jb21tZW50IHRoZSBuZXh0IGxpbmUgb25jZSBgbmdEZXZNb2RlYCB3b3JrcyB3aXRoIGNsb3N1cmUuCiAgICAgICAgICAgICAgICAvLyBpZiAobmdEZXZNb2RlKSBkZWJ1Z2dlcjsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBOdWxsSW5qZWN0b3JFcnJvcjogTm8gcHJvdmlkZXIgZm9yICR7c3RyaW5naWZ5KHRva2VuKX0hYCk7CiAgICAgICAgICAgICAgICBlcnJvci5uYW1lID0gJ051bGxJbmplY3RvckVycm9yJzsKICAgICAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBub3RGb3VuZFZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlCiAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9yRXJyb3JOYW1lCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2F0Y2hJbmplY3RvckVycm9yKGUsIHRva2VuLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRva2VuUGF0aCA9IGVbTkdfVEVNUF9UT0tFTl9QQVRIXTsKICAgICAgICBpZiAodG9rZW5bU09VUkNFXSkgewogICAgICAgICAgICB0b2tlblBhdGgudW5zaGlmdCh0b2tlbltTT1VSQ0VdKTsKICAgICAgICB9CiAgICAgICAgZS5tZXNzYWdlID0gZm9ybWF0RXJyb3IoJ1xuJyArIGUubWVzc2FnZSwgdG9rZW5QYXRoLCBpbmplY3RvckVycm9yTmFtZSwgc291cmNlKTsKICAgICAgICBlW05HX1RPS0VOX1BBVEhdID0gdG9rZW5QYXRoOwogICAgICAgIGVbTkdfVEVNUF9UT0tFTl9QQVRIXSA9IG51bGw7CiAgICAgICAgdGhyb3cgZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0ZXh0CiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHBhcmFtIHs/fSBpbmplY3RvckVycm9yTmFtZQogICAgICogQHBhcmFtIHs/PX0gc291cmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmb3JtYXRFcnJvcih0ZXh0LCBvYmosIGluamVjdG9yRXJyb3JOYW1lLCBzb3VyY2UgPSBudWxsKSB7CiAgICAgICAgdGV4dCA9IHRleHQgJiYgdGV4dC5jaGFyQXQoMCkgPT09ICdcbicgJiYgdGV4dC5jaGFyQXQoMSkgPT0gTk9fTkVXX0xJTkUgPyB0ZXh0LnN1YnN0cigyKSA6IHRleHQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb250ZXh0ID0gc3RyaW5naWZ5KG9iaik7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqKSkgewogICAgICAgICAgICBjb250ZXh0ID0gb2JqLm1hcChzdHJpbmdpZnkpLmpvaW4oJyAtPiAnKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGFydHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKTsKICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIG9iaikgewogICAgICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCB2YWx1ZSA9IG9ialtrZXldOwogICAgICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goa2V5ICsgJzonICsgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgOiBzdHJpbmdpZnkodmFsdWUpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dCA9IGB7JHtwYXJ0cy5qb2luKCcsICcpfX1gOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYCR7aW5qZWN0b3JFcnJvck5hbWV9JHtzb3VyY2UgPyAnKCcgKyBzb3VyY2UgKyAnKScgOiAnJ31bJHtjb250ZXh0fV06ICR7dGV4dC5yZXBsYWNlKE5FV19MSU5FLCAnXG4gICcpfWA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9qaXQvZW52aXJvbm1lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBIG1hcHBpbmcgb2YgdGhlIFxAYW5ndWxhci9jb3JlIEFQSSBzdXJmYWNlIHVzZWQgaW4gZ2VuZXJhdGVkIGV4cHJlc3Npb25zIHRvIHRoZSBhY3R1YWwgc3ltYm9scy4KICAgICAqCiAgICAgKiBUaGlzIHNob3VsZCBiZSBrZXB0IHVwIHRvIGRhdGUgd2l0aCB0aGUgcHVibGljIGV4cG9ydHMgb2YgXEBhbmd1bGFyL2NvcmUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgYW5ndWxhckNvcmVEaUVudiA9IHsKICAgICAgICAnybXJtWRlZmluZUluamVjdGFibGUnOiDJtcm1ZGVmaW5lSW5qZWN0YWJsZSwKICAgICAgICAnybXJtWRlZmluZUluamVjdG9yJzogybXJtWRlZmluZUluamVjdG9yLAogICAgICAgICfJtcm1aW5qZWN0JzogybXJtWluamVjdCwKICAgICAgICAnybXJtWdldEZhY3RvcnlPZic6IGdldEZhY3RvcnlPZiwKICAgICAgICAnybXJtWludmFsaWRGYWN0b3J5RGVwJzogybXJtWludmFsaWRGYWN0b3J5RGVwLAogICAgfTsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RmFjdG9yeU9mKHR5cGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdHlwZUFueSA9ICgvKiogQHR5cGUgez99ICovICh0eXBlKSk7CiAgICAgICAgaWYgKGlzRm9yd2FyZFJlZih0eXBlKSkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gZ2V0RmFjdG9yeU9mKHJlc29sdmVGb3J3YXJkUmVmKHR5cGVBbnkpKTsKICAgICAgICAgICAgICAgIHJldHVybiBmYWN0b3J5ID8gZmFjdG9yeSgpIDogbnVsbDsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWYgPSBnZXRJbmplY3RhYmxlRGVmKHR5cGVBbnkpIHx8IGdldEluamVjdG9yRGVmKHR5cGVBbnkpOwogICAgICAgIGlmICghZGVmIHx8IGRlZi5mYWN0b3J5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZWYuZmFjdG9yeTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFJlcHJlc2VudHMgYW4gaW5zdGFuY2Ugb2YgYW4gTmdNb2R1bGUgY3JlYXRlZCB2aWEgYSB7XEBsaW5rIE5nTW9kdWxlRmFjdG9yeX0uCiAgICAgKgogICAgICogYE5nTW9kdWxlUmVmYCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIE5nTW9kdWxlIEluc3RhbmNlIGFzIHdlbGwgb3RoZXIgb2JqZWN0cyByZWxhdGVkIHRvIHRoaXMKICAgICAqIE5nTW9kdWxlIEluc3RhbmNlLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIE5nTW9kdWxlUmVmIHsKICAgIH0KICAgIC8qKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgTmdNb2R1bGVGYWN0b3J5IHsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnROdW1iZXIoYWN0dWFsLCBtc2cpIHsKICAgICAgICBpZiAoISh0eXBlb2YgYWN0dWFsID09PSAnbnVtYmVyJykpIHsKICAgICAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgdHlwZW9mIGFjdHVhbCwgJ251bWJlcicsICc9PT0nKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBhc3NlcnROdW1iZXJJblJhbmdlKGFjdHVhbCwgbWluSW5jbHVzaXZlLCBtYXhJbmNsdXNpdmUpIHsKICAgICAgICBhc3NlcnROdW1iZXIoYWN0dWFsLCAnRXhwZWN0ZWQgYSBudW1iZXInKTsKICAgICAgICBhc3NlcnRMZXNzVGhhbk9yRXF1YWwoYWN0dWFsLCBtYXhJbmNsdXNpdmUsICdFeHBlY3RlZCBudW1iZXIgdG8gYmUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvJyk7CiAgICAgICAgYXNzZXJ0R3JlYXRlclRoYW5PckVxdWFsKGFjdHVhbCwgbWluSW5jbHVzaXZlLCAnRXhwZWN0ZWQgbnVtYmVyIHRvIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bycpOwogICAgfQogICAgZnVuY3Rpb24gYXNzZXJ0U3RyaW5nKGFjdHVhbCwgbXNnKSB7CiAgICAgICAgaWYgKCEodHlwZW9mIGFjdHVhbCA9PT0gJ3N0cmluZycpKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCA9PT0gbnVsbCA/ICdudWxsJyA6IHR5cGVvZiBhY3R1YWwsICdzdHJpbmcnLCAnPT09Jyk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gYXNzZXJ0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICAgICAgaWYgKCEoYWN0dWFsID09IGV4cGVjdGVkKSkgewogICAgICAgICAgICB0aHJvd0Vycm9yJDEobXNnLCBhY3R1YWwsIGV4cGVjdGVkLCAnPT0nKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiBhc3NlcnROb3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgICAgICBpZiAoIShhY3R1YWwgIT0gZXhwZWN0ZWQpKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICchPScpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICAgICAgaWYgKCEoYWN0dWFsID09PSBleHBlY3RlZCkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJz09PScpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydE5vdFNhbWUoYWN0dWFsLCBleHBlY3RlZCwgbXNnKSB7CiAgICAgICAgaWYgKCEoYWN0dWFsICE9PSBleHBlY3RlZCkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBleHBlY3RlZCwgJyE9PScpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydExlc3NUaGFuKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykgewogICAgICAgIGlmICghKGFjdHVhbCA8IGV4cGVjdGVkKSkgewogICAgICAgICAgICB0aHJvd0Vycm9yJDEobXNnLCBhY3R1YWwsIGV4cGVjdGVkLCAnPCcpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydExlc3NUaGFuT3JFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgICAgICBpZiAoIShhY3R1YWwgPD0gZXhwZWN0ZWQpKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICc8PScpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydEdyZWF0ZXJUaGFuKGFjdHVhbCwgZXhwZWN0ZWQsIG1zZykgewogICAgICAgIGlmICghKGFjdHVhbCA+IGV4cGVjdGVkKSkgewogICAgICAgICAgICB0aHJvd0Vycm9yJDEobXNnLCBhY3R1YWwsIGV4cGVjdGVkLCAnPicpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydEdyZWF0ZXJUaGFuT3JFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtc2cpIHsKICAgICAgICBpZiAoIShhY3R1YWwgPj0gZXhwZWN0ZWQpKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IkMShtc2csIGFjdHVhbCwgZXhwZWN0ZWQsICc+PScpOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydERlZmluZWQoYWN0dWFsLCBtc2cpIHsKICAgICAgICBpZiAoYWN0dWFsID09IG51bGwpIHsKICAgICAgICAgICAgdGhyb3dFcnJvciQxKG1zZywgYWN0dWFsLCBudWxsLCAnIT0nKTsKICAgICAgICB9CiAgICB9CiAgICBmdW5jdGlvbiB0aHJvd0Vycm9yJDEobXNnLCBhY3R1YWwsIGV4cGVjdGVkLCBjb21wYXJpc29uKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBU1NFUlRJT04gRVJST1I6ICR7bXNnfWAgKwogICAgICAgICAgICAoY29tcGFyaXNvbiA9PSBudWxsID8gJycgOiBgIFtFeHBlY3RlZD0+ICR7ZXhwZWN0ZWR9ICR7Y29tcGFyaXNvbn0gJHthY3R1YWx9IDw9QWN0dWFsXWApKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFzc2VydERvbU5vZGUobm9kZSkgewogICAgICAgIC8vIElmIHdlJ3JlIGluIGEgd29ya2VyLCBgTm9kZWAgd2lsbCBub3QgYmUgZGVmaW5lZC4KICAgICAgICBhc3NlcnRFcXVhbCgodHlwZW9mIE5vZGUgIT09ICd1bmRlZmluZWQnICYmIG5vZGUgaW5zdGFuY2VvZiBOb2RlKSB8fAogICAgICAgICAgICAodHlwZW9mIG5vZGUgPT09ICdvYmplY3QnICYmIG5vZGUgIT0gbnVsbCAmJgogICAgICAgICAgICAgICAgbm9kZS5jb25zdHJ1Y3Rvci5uYW1lID09PSAnV2ViV29ya2VyUmVuZGVyTm9kZScpLCB0cnVlLCBgVGhlIHByb3ZpZGVkIHZhbHVlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YgYSBET00gTm9kZSBidXQgZ290ICR7c3RyaW5naWZ5KG5vZGUpfWApOwogICAgfQogICAgZnVuY3Rpb24gYXNzZXJ0RGF0YUluUmFuZ2UoYXJyLCBpbmRleCkgewogICAgICAgIGNvbnN0IG1heExlbiA9IGFyciA/IGFyci5sZW5ndGggOiAwOwogICAgICAgIGFzc2VydExlc3NUaGFuKGluZGV4LCBtYXhMZW4sIGBJbmRleCBleHBlY3RlZCB0byBiZSBsZXNzIHRoYW4gJHttYXhMZW59IGJ1dCBnb3QgJHtpbmRleH1gKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIEVxdWl2YWxlbnQgdG8gRVM2IHNwcmVhZCwgYWRkIGVhY2ggaXRlbSB0byBhbiBhcnJheS4KICAgICAqCiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGl0ZW1zIHRvIGFkZAogICAgICogQHBhcmFtIGFyciBUaGUgYXJyYXkgdG8gd2hpY2ggeW91IHdhbnQgdG8gYWRkIHRoZSBpdGVtcwogICAgICovCiAgICBmdW5jdGlvbiBhZGRBbGxUb0FycmF5KGl0ZW1zLCBhcnIpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGFyci5wdXNoKGl0ZW1zW2ldKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEZsYXR0ZW5zIGFuIGFycmF5LgogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuKGxpc3QsIGRzdCkgewogICAgICAgIGlmIChkc3QgPT09IHVuZGVmaW5lZCkKICAgICAgICAgICAgZHN0ID0gbGlzdDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgbGV0IGl0ZW0gPSBsaXN0W2ldOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShpdGVtKSkgewogICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBpbmxpbmUgaXQuCiAgICAgICAgICAgICAgICBpZiAoZHN0ID09PSBsaXN0KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gT3VyIGFzc3VtcHRpb24gdGhhdCB0aGUgbGlzdCB3YXMgYWxyZWFkeSBmbGF0IHdhcyB3cm9uZyBhbmQKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNsb25lIGZsYXQgc2luY2Ugd2UgbmVlZCB0byB3cml0ZSB0byBpdC4KICAgICAgICAgICAgICAgICAgICBkc3QgPSBsaXN0LnNsaWNlKDAsIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmxhdHRlbihpdGVtLCBkc3QpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGRzdCAhPT0gbGlzdCkgewogICAgICAgICAgICAgICAgZHN0LnB1c2goaXRlbSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRzdDsKICAgIH0KICAgIGZ1bmN0aW9uIGRlZXBGb3JFYWNoKGlucHV0LCBmbikgewogICAgICAgIGlucHV0LmZvckVhY2godmFsdWUgPT4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyBkZWVwRm9yRWFjaCh2YWx1ZSwgZm4pIDogZm4odmFsdWUpKTsKICAgIH0KICAgIGZ1bmN0aW9uIGFkZFRvQXJyYXkoYXJyLCBpbmRleCwgdmFsdWUpIHsKICAgICAgICAvLyBwZXJmOiBhcnJheS5wdXNoIGlzIGZhc3RlciB0aGFuIGFycmF5LnNwbGljZSEKICAgICAgICBpZiAoaW5kZXggPj0gYXJyLmxlbmd0aCkgewogICAgICAgICAgICBhcnIucHVzaCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBhcnIuc3BsaWNlKGluZGV4LCAwLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gcmVtb3ZlRnJvbUFycmF5KGFyciwgaW5kZXgpIHsKICAgICAgICAvLyBwZXJmOiBhcnJheS5wb3AgaXMgZmFzdGVyIHRoYW4gYXJyYXkuc3BsaWNlIQogICAgICAgIGlmIChpbmRleCA+PSBhcnIubGVuZ3RoIC0gMSkgewogICAgICAgICAgICByZXR1cm4gYXJyLnBvcCgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGFyci5zcGxpY2UoaW5kZXgsIDEpWzBdOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIG5ld0FycmF5KHNpemUsIHZhbHVlKSB7CiAgICAgICAgY29uc3QgbGlzdCA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICAgICAgIGxpc3QucHVzaCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBsaXN0OwogICAgfQogICAgLyoqCiAgICAgKiBTYW1lIGFzIGBBcnJheS5zcGxpY2UyKGluZGV4LCAwLCB2YWx1ZTEsIHZhbHVlMilgIGJ1dCBmYXN0ZXIuCiAgICAgKgogICAgICogYEFycmF5LnNwbGljZSgpYCBpcyBub3QgZmFzdCBiZWNhdXNlIGl0IGhhcyB0byBhbGxvY2F0ZSBhbiBhcnJheSBmb3IgdGhlIGVsZW1lbnRzIHdoaWNoIHdlcmUKICAgICAqIHJlbW92ZWQuIFRoaXMgY2F1c2VzIG1lbW9yeSBwcmVzc3VyZSBhbmQgc2xvd3MgZG93biBjb2RlIHdoZW4gbW9zdCBvZiB0aGUgdGltZSB3ZSBkb24ndAogICAgICogY2FyZSBhYm91dCB0aGUgZGVsZXRlZCBpdGVtcyBhcnJheS4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgQXJyYXkgdG8gc3BsaWNlLgogICAgICogQHBhcmFtIGluZGV4IEluZGV4IGluIGFycmF5IHdoZXJlIHRoZSBgdmFsdWVgIHNob3VsZCBiZSBhZGRlZC4KICAgICAqIEBwYXJhbSB2YWx1ZTEgVmFsdWUgdG8gYWRkIHRvIGFycmF5LgogICAgICogQHBhcmFtIHZhbHVlMiBWYWx1ZSB0byBhZGQgdG8gYXJyYXkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGFycmF5SW5zZXJ0MihhcnJheSwgaW5kZXgsIHZhbHVlMSwgdmFsdWUyKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExlc3NUaGFuT3JFcXVhbChpbmRleCwgYXJyYXkubGVuZ3RoLCAnQ2FuXCd0IGluc2VydCBwYXN0IGFycmF5IGVuZC4nKTsKICAgICAgICBsZXQgZW5kID0gYXJyYXkubGVuZ3RoOwogICAgICAgIGlmIChlbmQgPT0gaW5kZXgpIHsKICAgICAgICAgICAgLy8gaW5zZXJ0aW5nIGF0IHRoZSBlbmQuCiAgICAgICAgICAgIGFycmF5LnB1c2godmFsdWUxLCB2YWx1ZTIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChlbmQgPT09IDEpIHsKICAgICAgICAgICAgLy8gY29ybmVyIGNhc2Ugd2hlbiB3ZSBoYXZlIGxlc3MgaXRlbXMgaW4gYXJyYXkgdGhhbiB3ZSBoYXZlIGl0ZW1zIHRvIGluc2VydC4KICAgICAgICAgICAgYXJyYXkucHVzaCh2YWx1ZTIsIGFycmF5WzBdKTsKICAgICAgICAgICAgYXJyYXlbMF0gPSB2YWx1ZTE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBlbmQtLTsKICAgICAgICAgICAgYXJyYXkucHVzaChhcnJheVtlbmQgLSAxXSwgYXJyYXlbZW5kXSk7CiAgICAgICAgICAgIHdoaWxlIChlbmQgPiBpbmRleCkgewogICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbmQgPSBlbmQgLSAyOwogICAgICAgICAgICAgICAgYXJyYXlbZW5kXSA9IGFycmF5W3ByZXZpb3VzRW5kXTsKICAgICAgICAgICAgICAgIGVuZC0tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGFycmF5W2luZGV4XSA9IHZhbHVlMTsKICAgICAgICAgICAgYXJyYXlbaW5kZXggKyAxXSA9IHZhbHVlMjsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhIGB2YWx1ZWAgZm9yIGEgYGtleWAuCiAgICAgKgogICAgICogQHBhcmFtIGtleVZhbHVlQXJyYXkgdG8gbW9kaWZ5LgogICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvY2F0ZSBvciBjcmVhdGUuCiAgICAgKiBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIHNldCBmb3IgYSBga2V5YC4KICAgICAqIEByZXR1cm5zIGluZGV4IChhbHdheXMgZXZlbikgb2Ygd2hlcmUgdGhlIHZhbHVlIHZhcyBzZXQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwga2V5LCB2YWx1ZSkgewogICAgICAgIGxldCBpbmRleCA9IGtleVZhbHVlQXJyYXlJbmRleE9mKGtleVZhbHVlQXJyYXksIGtleSk7CiAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgaXQgc2V0IGl0LgogICAgICAgICAgICBrZXlWYWx1ZUFycmF5W2luZGV4IHwgMV0gPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGluZGV4ID0gfmluZGV4OwogICAgICAgICAgICBhcnJheUluc2VydDIoa2V5VmFsdWVBcnJheSwgaW5kZXgsIGtleSwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlIGEgYHZhbHVlYCBmb3IgYSBga2V5YCAob24gYHVuZGVmaW5lZGAgaWYgbm90IGZvdW5kLikKICAgICAqCiAgICAgKiBAcGFyYW0ga2V5VmFsdWVBcnJheSB0byBzZWFyY2guCiAgICAgKiBAcGFyYW0ga2V5IFRoZSBrZXkgdG8gbG9jYXRlLgogICAgICogQHJldHVybiBUaGUgYHZhbHVlYCBzdG9yZWQgYXQgdGhlIGBrZXlgIGxvY2F0aW9uIG9yIGB1bmRlZmluZWQgaWYgbm90IGZvdW5kLgogICAgICovCiAgICBmdW5jdGlvbiBrZXlWYWx1ZUFycmF5R2V0KGtleVZhbHVlQXJyYXksIGtleSkgewogICAgICAgIGNvbnN0IGluZGV4ID0ga2V5VmFsdWVBcnJheUluZGV4T2Yoa2V5VmFsdWVBcnJheSwga2V5KTsKICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAvLyBpZiB3ZSBmb3VuZCBpdCByZXRyaWV2ZSBpdC4KICAgICAgICAgICAgcmV0dXJuIGtleVZhbHVlQXJyYXlbaW5kZXggfCAxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmUgYSBga2V5YCBpbmRleCB2YWx1ZSBpbiB0aGUgYXJyYXkgb3IgYC0xYCBpZiBub3QgZm91bmQuCiAgICAgKgogICAgICogQHBhcmFtIGtleVZhbHVlQXJyYXkgdG8gc2VhcmNoLgogICAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGxvY2F0ZS4KICAgICAqIEByZXR1cm5zIGluZGV4IG9mIHdoZXJlIHRoZSBrZXkgaXMgKG9yIHNob3VsZCBoYXZlIGJlZW4uKQogICAgICogICAtIHBvc2l0aXZlIChldmVuKSBpbmRleCBpZiBrZXkgZm91bmQuCiAgICAgKiAgIC0gbmVnYXRpdmUgaW5kZXggaWYga2V5IG5vdCBmb3VuZC4gKGB+aW5kZXhgIChldmVuKSB0byBnZXQgdGhlIGluZGV4IHdoZXJlIGl0IHNob3VsZCBoYXZlCiAgICAgKiAgICAgYmVlbiBpbnNlcnRlZC4pCiAgICAgKi8KICAgIGZ1bmN0aW9uIGtleVZhbHVlQXJyYXlJbmRleE9mKGtleVZhbHVlQXJyYXksIGtleSkgewogICAgICAgIHJldHVybiBfYXJyYXlJbmRleE9mU29ydGVkKGtleVZhbHVlQXJyYXksIGtleSwgMSk7CiAgICB9CiAgICAvKioKICAgICAqIElOVEVSTkFMOiBHZXQgYW4gaW5kZXggb2YgYW4gYHZhbHVlYCBpbiBhIHNvcnRlZCBgYXJyYXlgIGJ5IGdyb3VwaW5nIHNlYXJjaCBieSBgc2hpZnRgLgogICAgICoKICAgICAqIE5PVEU6CiAgICAgKiAtIFRoaXMgdXNlcyBiaW5hcnkgc2VhcmNoIGFsZ29yaXRobSBmb3IgZmFzdCByZW1vdmFscy4KICAgICAqCiAgICAgKiBAcGFyYW0gYXJyYXkgQSBzb3J0ZWQgYXJyYXkgdG8gYmluYXJ5IHNlYXJjaC4KICAgICAqIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gbG9vayBmb3IuCiAgICAgKiBAcGFyYW0gc2hpZnQgZ3JvdXBpbmcgc2hpZnQuCiAgICAgKiAgIC0gYDBgIG1lYW5zIGxvb2sgYXQgZXZlcnkgbG9jYXRpb24KICAgICAqICAgLSBgMWAgbWVhbnMgb25seSBsb29rIGF0IGV2ZXJ5IG90aGVyIChldmVuKSBsb2NhdGlvbiAodGhlIG9kZCBsb2NhdGlvbnMgYXJlIHRvIGJlIGlnbm9yZWQgYXMKICAgICAqICAgICAgICAgdGhleSBhcmUgdmFsdWVzLikKICAgICAqIEByZXR1cm5zIGluZGV4IG9mIHRoZSB2YWx1ZS4KICAgICAqICAgLSBwb3NpdGl2ZSBpbmRleCBpZiB2YWx1ZSBmb3VuZC4KICAgICAqICAgLSBuZWdhdGl2ZSBpbmRleCBpZiB2YWx1ZSBub3QgZm91bmQuIChgfmluZGV4YCB0byBnZXQgdGhlIHZhbHVlIHdoZXJlIGl0IHNob3VsZCBoYXZlIGJlZW4KICAgICAqIGluc2VydGVkKQogICAgICovCiAgICBmdW5jdGlvbiBfYXJyYXlJbmRleE9mU29ydGVkKGFycmF5LCB2YWx1ZSwgc2hpZnQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwoQXJyYXkuaXNBcnJheShhcnJheSksIHRydWUsICdFeHBlY3RpbmcgYW4gYXJyYXknKTsKICAgICAgICBsZXQgc3RhcnQgPSAwOwogICAgICAgIGxldCBlbmQgPSBhcnJheS5sZW5ndGggPj4gc2hpZnQ7CiAgICAgICAgd2hpbGUgKGVuZCAhPT0gc3RhcnQpIHsKICAgICAgICAgICAgY29uc3QgbWlkZGxlID0gc3RhcnQgKyAoKGVuZCAtIHN0YXJ0KSA+PiAxKTsgLy8gZmluZCB0aGUgbWlkZGxlLgogICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gYXJyYXlbbWlkZGxlIDw8IHNoaWZ0XTsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSBjdXJyZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKG1pZGRsZSA8PCBzaGlmdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudCA+IHZhbHVlKSB7CiAgICAgICAgICAgICAgICBlbmQgPSBtaWRkbGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdGFydCA9IG1pZGRsZSArIDE7IC8vIFdlIGFscmVhZHkgc2VhcmNoZWQgbWlkZGxlIHNvIG1ha2UgaXQgbm9uLWluY2x1c2l2ZSBieSBhZGRpbmcgMQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB+KGVuZCA8PCBzaGlmdCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uL2NvbnN0YW50cy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IENoYW5nZURldGVjdGlvblN0cmF0ZWd5ID0gewogICAgICAgIC8qKgogICAgICAgICAqIFVzZSB0aGUgYENoZWNrT25jZWAgc3RyYXRlZ3ksIG1lYW5pbmcgdGhhdCBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiBpcyBkZWFjdGl2YXRlZAogICAgICAgICAqIHVudGlsIHJlYWN0aXZhdGVkIGJ5IHNldHRpbmcgdGhlIHN0cmF0ZWd5IHRvIGBEZWZhdWx0YCAoYENoZWNrQWx3YXlzYCkuCiAgICAgICAgICogQ2hhbmdlIGRldGVjdGlvbiBjYW4gc3RpbGwgYmUgZXhwbGljaXRseSBpbnZva2VkLgogICAgICAgICAqIFRoaXMgc3RyYXRlZ3kgYXBwbGllcyB0byBhbGwgY2hpbGQgZGlyZWN0aXZlcyBhbmQgY2Fubm90IGJlIG92ZXJyaWRkZW4uCiAgICAgICAgICovCiAgICAgICAgT25QdXNoOiAwLAogICAgICAgIC8qKgogICAgICAgICAqIFVzZSB0aGUgZGVmYXVsdCBgQ2hlY2tBbHdheXNgIHN0cmF0ZWd5LCBpbiB3aGljaCBjaGFuZ2UgZGV0ZWN0aW9uIGlzIGF1dG9tYXRpYyB1bnRpbAogICAgICAgICAqIGV4cGxpY2l0bHkgZGVhY3RpdmF0ZWQuCiAgICAgICAgICovCiAgICAgICAgRGVmYXVsdDogMSwKICAgIH07CiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2hdID0gJ09uUHVzaCc7CiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneVtDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5EZWZhdWx0XSA9ICdEZWZhdWx0JzsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL21ldGFkYXRhL3ZpZXcudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBWaWV3RW5jYXBzdWxhdGlvbiQxID0gewogICAgICAgIC8qKgogICAgICAgICAqIEVtdWxhdGUgYE5hdGl2ZWAgc2NvcGluZyBvZiBzdHlsZXMgYnkgYWRkaW5nIGFuIGF0dHJpYnV0ZSBjb250YWluaW5nIHN1cnJvZ2F0ZSBpZCB0byB0aGUgSG9zdAogICAgICAgICAqIEVsZW1lbnQgYW5kIHByZS1wcm9jZXNzaW5nIHRoZSBzdHlsZSBydWxlcyBwcm92aWRlZCB2aWEge0BsaW5rIENvbXBvbmVudCNzdHlsZXMgc3R5bGVzfSBvcgogICAgICAgICAqIHtAbGluayBDb21wb25lbnQjc3R5bGVVcmxzIHN0eWxlVXJsc30sIGFuZCBhZGRpbmcgdGhlIG5ldyBIb3N0IEVsZW1lbnQgYXR0cmlidXRlIHRvIGFsbAogICAgICAgICAqIHNlbGVjdG9ycy4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgaXMgdGhlIGRlZmF1bHQgb3B0aW9uLgogICAgICAgICAqLwogICAgICAgIEVtdWxhdGVkOiAwLAogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIHY2LjEuMCAtIHVzZSB7Vmlld0VuY2Fwc3VsYXRpb24uU2hhZG93RG9tfSBpbnN0ZWFkLgogICAgICAgICAqIFVzZSB0aGUgbmF0aXZlIGVuY2Fwc3VsYXRpb24gbWVjaGFuaXNtIG9mIHRoZSByZW5kZXJlci4KICAgICAgICAgKgogICAgICAgICAqIEZvciB0aGUgRE9NIHRoaXMgbWVhbnMgdXNpbmcgdGhlIGRlcHJlY2F0ZWQgW1NoYWRvdyBET00KICAgICAgICAgKiB2MF0oaHR0cHM6Ly93M2MuZ2l0aHViLmlvL3dlYmNvbXBvbmVudHMvc3BlYy9zaGFkb3cvKSBhbmQKICAgICAgICAgKiBjcmVhdGluZyBhIFNoYWRvd1Jvb3QgZm9yIENvbXBvbmVudCdzIEhvc3QgRWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBOYXRpdmU6IDEsCiAgICAgICAgLyoqCiAgICAgICAgICogRG9uJ3QgcHJvdmlkZSBhbnkgdGVtcGxhdGUgb3Igc3R5bGUgZW5jYXBzdWxhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBOb25lOiAyLAogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBTaGFkb3cgRE9NIHRvIGVuY2Fwc3VsYXRlIHN0eWxlcy4KICAgICAgICAgKgogICAgICAgICAqIEZvciB0aGUgRE9NIHRoaXMgbWVhbnMgdXNpbmcgbW9kZXJuIFtTaGFkb3cKICAgICAgICAgKiBET01dKGh0dHBzOi8vdzNjLmdpdGh1Yi5pby93ZWJjb21wb25lbnRzL3NwZWMvc2hhZG93LykgYW5kCiAgICAgICAgICogY3JlYXRpbmcgYSBTaGFkb3dSb290IGZvciBDb21wb25lbnQncyBIb3N0IEVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgU2hhZG93RG9tOiAzLAogICAgfTsKICAgIFZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5FbXVsYXRlZF0gPSAnRW11bGF0ZWQnOwogICAgVmlld0VuY2Fwc3VsYXRpb24kMVtWaWV3RW5jYXBzdWxhdGlvbiQxLk5hdGl2ZV0gPSAnTmF0aXZlJzsKICAgIFZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5Ob25lXSA9ICdOb25lJzsKICAgIFZpZXdFbmNhcHN1bGF0aW9uJDFbVmlld0VuY2Fwc3VsYXRpb24kMS5TaGFkb3dEb21dID0gJ1NoYWRvd0RvbSc7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2VtcHR5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhpcyBmaWxlIGNvbnRhaW5zIHJldXNlYWJsZSAiZW1wdHkiIHN5bWJvbHMgdGhhdCBjYW4gYmUgdXNlZCBhcyBkZWZhdWx0IHJldHVybiB2YWx1ZXMKICAgICAqIGluIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgcmVuZGVyaW5nIGNvZGUuIEJlY2F1c2UgdGhlIHNhbWUgc3ltYm9scyBhcmUgcmV0dXJuZWQsIHRoaXMKICAgICAqIGFsbG93cyBmb3IgaWRlbnRpdHkgY2hlY2tzIGFnYWluc3QgdGhlc2UgdmFsdWVzIHRvIGJlIGNvbnNpc3RlbnRseSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsKICAgICAqIGNvZGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgRU1QVFlfT0JKID0ge307CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBFTVBUWV9BUlJBWSA9IFtdOwogICAgLy8gZnJlZXppbmcgdGhlIHZhbHVlcyBwcmV2ZW50cyBhbnkgY29kZSBmcm9tIGFjY2lkZW50YWxseSBpbnNlcnRpbmcgbmV3IHZhbHVlcyBpbgogICAgaWYgKCh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSkgewogICAgICAgIC8vIFRoZXNlIHByb3BlcnR5IGFjY2Vzc2VzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2UgbmdEZXZNb2RlIHdpbGwgYmUgc2V0IHRvIGZhbHNlCiAgICAgICAgLy8gd2hlbiBvcHRpbWl6aW5nIGNvZGUgYW5kIHRoZSB3aG9sZSBpZiBzdGF0ZW1lbnQgd2lsbCBiZSBkcm9wcGVkLgogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgICAgICBPYmplY3QuZnJlZXplKEVNUFRZX09CSik7CiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRvcGxldmVsLXByb3BlcnR5LWFjY2VzcwogICAgICAgIE9iamVjdC5mcmVlemUoRU1QVFlfQVJSQVkpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9kZWZpbml0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBfcmVuZGVyQ29tcENvdW50ID0gMDsKICAgIC8qKgogICAgICogQ3JlYXRlIGEgY29tcG9uZW50IGRlZmluaXRpb24gb2JqZWN0LgogICAgICoKICAgICAqCiAgICAgKiAjIEV4YW1wbGUKICAgICAqIGBgYAogICAgICogY2xhc3MgTXlEaXJlY3RpdmUgewogICAgICogICAvLyBHZW5lcmF0ZWQgYnkgQW5ndWxhciBUZW1wbGF0ZSBDb21waWxlcgogICAgICogICAvLyBbU3ltYm9sXSBzeW50YXggd2lsbCBub3QgYmUgc3VwcG9ydGVkIGJ5IFR5cGVTY3JpcHQgdW50aWwgdjIuNwogICAgICogICBzdGF0aWMgybVjbXAgPSBkZWZpbmVDb21wb25lbnQoewogICAgICogICAgIC4uLgogICAgICogICB9KTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnREZWZpbml0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1ZGVmaW5lQ29tcG9uZW50KGNvbXBvbmVudERlZmluaXRpb24pIHsKICAgICAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgbmdEZXZNb2RlLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiDJtcm1ZGVmaW5lQ29tcG9uZW50LgogICAgICAgICAgICAvLyBTZWUgdGhlIGBpbml0TmdEZXZNb2RlYCBkb2NzdHJpbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0eXBlID0gY29tcG9uZW50RGVmaW5pdGlvbi50eXBlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHR5cGVQcm90b3R5cGUgPSB0eXBlLnByb3RvdHlwZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWNsYXJlZElucHV0cyA9ICgvKiogQHR5cGUgez99ICovICh7fSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZiA9IHsKICAgICAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgICAgICBwcm92aWRlcnNSZXNvbHZlcjogbnVsbCwKICAgICAgICAgICAgICAgIGRlY2xzOiBjb21wb25lbnREZWZpbml0aW9uLmRlY2xzLAogICAgICAgICAgICAgICAgdmFyczogY29tcG9uZW50RGVmaW5pdGlvbi52YXJzLAogICAgICAgICAgICAgICAgZmFjdG9yeTogbnVsbCwKICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBjb21wb25lbnREZWZpbml0aW9uLnRlbXBsYXRlIHx8ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgICAgICBjb25zdHM6IGNvbXBvbmVudERlZmluaXRpb24uY29uc3RzIHx8IG51bGwsCiAgICAgICAgICAgICAgICBuZ0NvbnRlbnRTZWxlY3RvcnM6IGNvbXBvbmVudERlZmluaXRpb24ubmdDb250ZW50U2VsZWN0b3JzLAogICAgICAgICAgICAgICAgaG9zdEJpbmRpbmdzOiBjb21wb25lbnREZWZpbml0aW9uLmhvc3RCaW5kaW5ncyB8fCBudWxsLAogICAgICAgICAgICAgICAgaG9zdFZhcnM6IGNvbXBvbmVudERlZmluaXRpb24uaG9zdFZhcnMgfHwgMCwKICAgICAgICAgICAgICAgIGhvc3RBdHRyczogY29tcG9uZW50RGVmaW5pdGlvbi5ob3N0QXR0cnMgfHwgbnVsbCwKICAgICAgICAgICAgICAgIGNvbnRlbnRRdWVyaWVzOiBjb21wb25lbnREZWZpbml0aW9uLmNvbnRlbnRRdWVyaWVzIHx8IG51bGwsCiAgICAgICAgICAgICAgICBkZWNsYXJlZElucHV0czogZGVjbGFyZWRJbnB1dHMsCiAgICAgICAgICAgICAgICBpbnB1dHM6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgICAgICAvLyBhc3NpZ25lZCBpbiBub1NpZGVFZmZlY3RzCiAgICAgICAgICAgICAgICBvdXRwdXRzOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAgICAgLy8gYXNzaWduZWQgaW4gbm9TaWRlRWZmZWN0cwogICAgICAgICAgICAgICAgZXhwb3J0QXM6IGNvbXBvbmVudERlZmluaXRpb24uZXhwb3J0QXMgfHwgbnVsbCwKICAgICAgICAgICAgICAgIG9uQ2hhbmdlczogbnVsbCwKICAgICAgICAgICAgICAgIG9uSW5pdDogdHlwZVByb3RvdHlwZS5uZ09uSW5pdCB8fCBudWxsLAogICAgICAgICAgICAgICAgZG9DaGVjazogdHlwZVByb3RvdHlwZS5uZ0RvQ2hlY2sgfHwgbnVsbCwKICAgICAgICAgICAgICAgIGFmdGVyQ29udGVudEluaXQ6IHR5cGVQcm90b3R5cGUubmdBZnRlckNvbnRlbnRJbml0IHx8IG51bGwsCiAgICAgICAgICAgICAgICBhZnRlckNvbnRlbnRDaGVja2VkOiB0eXBlUHJvdG90eXBlLm5nQWZ0ZXJDb250ZW50Q2hlY2tlZCB8fCBudWxsLAogICAgICAgICAgICAgICAgYWZ0ZXJWaWV3SW5pdDogdHlwZVByb3RvdHlwZS5uZ0FmdGVyVmlld0luaXQgfHwgbnVsbCwKICAgICAgICAgICAgICAgIGFmdGVyVmlld0NoZWNrZWQ6IHR5cGVQcm90b3R5cGUubmdBZnRlclZpZXdDaGVja2VkIHx8IG51bGwsCiAgICAgICAgICAgICAgICBvbkRlc3Ryb3k6IHR5cGVQcm90b3R5cGUubmdPbkRlc3Ryb3kgfHwgbnVsbCwKICAgICAgICAgICAgICAgIG9uUHVzaDogY29tcG9uZW50RGVmaW5pdGlvbi5jaGFuZ2VEZXRlY3Rpb24gPT09IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIGRpcmVjdGl2ZURlZnM6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgICAgICAvLyBhc3NpZ25lZCBpbiBub1NpZGVFZmZlY3RzCiAgICAgICAgICAgICAgICBwaXBlRGVmczogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgICAgIC8vIGFzc2lnbmVkIGluIG5vU2lkZUVmZmVjdHMKICAgICAgICAgICAgICAgIHNlbGVjdG9yczogY29tcG9uZW50RGVmaW5pdGlvbi5zZWxlY3RvcnMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgICAgICAgICB2aWV3UXVlcnk6IGNvbXBvbmVudERlZmluaXRpb24udmlld1F1ZXJ5IHx8IG51bGwsCiAgICAgICAgICAgICAgICBmZWF0dXJlczogKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudERlZmluaXRpb24uZmVhdHVyZXMpKSB8fCBudWxsLAogICAgICAgICAgICAgICAgZGF0YTogY29tcG9uZW50RGVmaW5pdGlvbi5kYXRhIHx8IHt9LAogICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGNvbnZlcnQgVmlld0VuY2Fwc3VsYXRpb24gaW50byBjb25zdCBlbnVtIHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgZGlyZWN0bHkgaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBuZXh0IGxpbmUuIEFsc28gYE5vbmVgIHNob3VsZCBiZSAwIG5vdCAyLgogICAgICAgICAgICAgICAgZW5jYXBzdWxhdGlvbjogY29tcG9uZW50RGVmaW5pdGlvbi5lbmNhcHN1bGF0aW9uIHx8IFZpZXdFbmNhcHN1bGF0aW9uJDEuRW11bGF0ZWQsCiAgICAgICAgICAgICAgICBpZDogJ2MnLAogICAgICAgICAgICAgICAgc3R5bGVzOiBjb21wb25lbnREZWZpbml0aW9uLnN0eWxlcyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICAgICAgICAgIF86ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgICAgICBzZXRJbnB1dDogbnVsbCwKICAgICAgICAgICAgICAgIHNjaGVtYXM6IGNvbXBvbmVudERlZmluaXRpb24uc2NoZW1hcyB8fCBudWxsLAogICAgICAgICAgICAgICAgdFZpZXc6IG51bGwsCiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlVHlwZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50RGVmaW5pdGlvbi5kaXJlY3RpdmVzKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGNvbXBvbmVudERlZmluaXRpb24uZmVhdHVyZXM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGlwZVR5cGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudERlZmluaXRpb24ucGlwZXMpKTsKICAgICAgICAgICAgZGVmLmlkICs9IF9yZW5kZXJDb21wQ291bnQrKzsKICAgICAgICAgICAgZGVmLmlucHV0cyA9IGludmVydE9iamVjdChjb21wb25lbnREZWZpbml0aW9uLmlucHV0cywgZGVjbGFyZWRJbnB1dHMpLAogICAgICAgICAgICAgICAgZGVmLm91dHB1dHMgPSBpbnZlcnRPYmplY3QoY29tcG9uZW50RGVmaW5pdGlvbi5vdXRwdXRzKSwKICAgICAgICAgICAgICAgIGZlYXR1cmUgJiYgZmVhdHVyZS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChmbikgPT4gZm4oZGVmKSkpOwogICAgICAgICAgICBkZWYuZGlyZWN0aXZlRGVmcyA9IGRpcmVjdGl2ZVR5cGVzID8KICAgICAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+ICh0eXBlb2YgZGlyZWN0aXZlVHlwZXMgPT09ICdmdW5jdGlvbicgPyBkaXJlY3RpdmVUeXBlcygpIDogZGlyZWN0aXZlVHlwZXMpCiAgICAgICAgICAgICAgICAgICAgLm1hcChleHRyYWN0RGlyZWN0aXZlRGVmKSkgOgogICAgICAgICAgICAgICAgbnVsbDsKICAgICAgICAgICAgZGVmLnBpcGVEZWZzID0gcGlwZVR5cGVzID8KICAgICAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+ICh0eXBlb2YgcGlwZVR5cGVzID09PSAnZnVuY3Rpb24nID8gcGlwZVR5cGVzKCkgOiBwaXBlVHlwZXMpLm1hcChleHRyYWN0UGlwZURlZikpIDoKICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVzCiAgICAgKiBAcGFyYW0gez99IHBpcGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c2V0Q29tcG9uZW50U2NvcGUodHlwZSwgZGlyZWN0aXZlcywgcGlwZXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gKCgvKiogQHR5cGUgez99ICovICh0eXBlLsm1Y21wKSkpOwogICAgICAgIGRlZi5kaXJlY3RpdmVEZWZzID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gZGlyZWN0aXZlcy5tYXAoZXh0cmFjdERpcmVjdGl2ZURlZikpOwogICAgICAgIGRlZi5waXBlRGVmcyA9ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHBpcGVzLm1hcChleHRyYWN0UGlwZURlZikpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4dHJhY3REaXJlY3RpdmVEZWYodHlwZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWYgPSBnZXRDb21wb25lbnREZWYodHlwZSkgfHwgZ2V0RGlyZWN0aXZlRGVmKHR5cGUpOwogICAgICAgIGlmIChuZ0Rldk1vZGUgJiYgIWRlZikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3R5cGUubmFtZX0nIGlzIG5laXRoZXIgJ0NvbXBvbmVudFR5cGUnIG9yICdEaXJlY3RpdmVUeXBlJy5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChkZWYpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBleHRyYWN0UGlwZURlZih0eXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZiA9IGdldFBpcGVEZWYodHlwZSk7CiAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiAhZGVmKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7dHlwZS5uYW1lfScgaXMgbm90IGEgJ1BpcGVUeXBlJy5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChkZWYpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGF1dG9SZWdpc3Rlck1vZHVsZUJ5SWQgPSB7fTsKICAgIC8qKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVkZWZpbmVOZ01vZHVsZShkZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzID0gewogICAgICAgICAgICB0eXBlOiBkZWYudHlwZSwKICAgICAgICAgICAgYm9vdHN0cmFwOiBkZWYuYm9vdHN0cmFwIHx8IEVNUFRZX0FSUkFZLAogICAgICAgICAgICBkZWNsYXJhdGlvbnM6IGRlZi5kZWNsYXJhdGlvbnMgfHwgRU1QVFlfQVJSQVksCiAgICAgICAgICAgIGltcG9ydHM6IGRlZi5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZLAogICAgICAgICAgICBleHBvcnRzOiBkZWYuZXhwb3J0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICAgICAgdHJhbnNpdGl2ZUNvbXBpbGVTY29wZXM6IG51bGwsCiAgICAgICAgICAgIHNjaGVtYXM6IGRlZi5zY2hlbWFzIHx8IG51bGwsCiAgICAgICAgICAgIGlkOiBkZWYuaWQgfHwgbnVsbCwKICAgICAgICB9OwogICAgICAgIGlmIChkZWYuaWQgIT0gbnVsbCkgewogICAgICAgICAgICBub1NpZGVFZmZlY3RzKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGF1dG9SZWdpc3Rlck1vZHVsZUJ5SWRbKC8qKiBAdHlwZSB7P30gKi8gKGRlZi5pZCkpXSA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLnR5cGUpKSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAocmVzKSk7CiAgICB9CiAgICAvKioKICAgICAqIEFkZHMgdGhlIG1vZHVsZSBtZXRhZGF0YSB0aGF0IGlzIG5lY2Vzc2FyeSB0byBjb21wdXRlIHRoZSBtb2R1bGUncyB0cmFuc2l0aXZlIHNjb3BlIHRvIGFuCiAgICAgKiBleGlzdGluZyBtb2R1bGUgZGVmaW5pdGlvbi4KICAgICAqCiAgICAgKiBTY29wZSBtZXRhZGF0YSBvZiBtb2R1bGVzIGlzIG5vdCB1c2VkIGluIHByb2R1Y3Rpb24gYnVpbGRzLCBzbyBjYWxscyB0byB0aGlzIGZ1bmN0aW9uIGNhbiBiZQogICAgICogbWFya2VkIHB1cmUgdG8gdHJlZS1zaGFrZSBpdCBmcm9tIHRoZSBidW5kbGUsIGFsbG93aW5nIGZvciBhbGwgcmVmZXJlbmNlZCBkZWNsYXJhdGlvbnMKICAgICAqIHRvIGJlY29tZSBlbGlnaWJsZSBmb3IgdHJlZS1zaGFraW5nIGFzIHdlbGwuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gc2NvcGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzZXROZ01vZHVsZVNjb3BlKHR5cGUsIHNjb3BlKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChub1NpZGVFZmZlY3RzKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZ01vZHVsZURlZiA9IGdldE5nTW9kdWxlRGVmKHR5cGUsIHRydWUpOwogICAgICAgICAgICBuZ01vZHVsZURlZi5kZWNsYXJhdGlvbnMgPSBzY29wZS5kZWNsYXJhdGlvbnMgfHwgRU1QVFlfQVJSQVk7CiAgICAgICAgICAgIG5nTW9kdWxlRGVmLmltcG9ydHMgPSBzY29wZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZOwogICAgICAgICAgICBuZ01vZHVsZURlZi5leHBvcnRzID0gc2NvcGUuZXhwb3J0cyB8fCBFTVBUWV9BUlJBWTsKICAgICAgICB9KSkpKTsKICAgIH0KICAgIC8qKgogICAgICogSW52ZXJ0cyBhbiBpbnB1dHMgb3Igb3V0cHV0cyBsb29rdXAgc3VjaCB0aGF0IHRoZSBrZXlzLCB3aGljaCB3ZXJlIHRoZQogICAgICogbWluaWZpZWQga2V5cywgYXJlIHBhcnQgb2YgdGhlIHZhbHVlcywgYW5kIHRoZSB2YWx1ZXMgYXJlIHBhcnNlZCBzbyB0aGF0CiAgICAgKiB0aGUgcHVibGljTmFtZSBvZiB0aGUgcHJvcGVydHkgaXMgdGhlIG5ldyBrZXkKICAgICAqCiAgICAgKiBlLmcuIGZvcgogICAgICoKICAgICAqIGBgYAogICAgICogY2xhc3MgQ29tcCB7CiAgICAgKiBcQElucHV0KCkKICAgICAqICAgcHJvcE5hbWUxOiBzdHJpbmc7CiAgICAgKgogICAgICogXEBJbnB1dCgncHVibGljTmFtZTInKQogICAgICogICBkZWNsYXJlZFByb3BOYW1lMjogbnVtYmVyOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogd2lsbCBiZSBzZXJpYWxpemVkIGFzCiAgICAgKgogICAgICogYGBgCiAgICAgKiB7CiAgICAgKiAgIHByb3BOYW1lMTogJ3Byb3BOYW1lMScsCiAgICAgKiAgIGRlY2xhcmVkUHJvcE5hbWUyOiBbJ3B1YmxpY05hbWUyJywgJ2RlY2xhcmVkUHJvcE5hbWUyJ10sCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiB3aGljaCBpcyB0aGFuIHRyYW5zbGF0ZWQgYnkgdGhlIG1pbmlmaWVyIGFzOgogICAgICoKICAgICAqIGBgYAogICAgICogewogICAgICogICBtaW5pZmllZFByb3BOYW1lMTogJ3Byb3BOYW1lMScsCiAgICAgKiAgIG1pbmlmaWVkUHJvcE5hbWUyOiBbJ3B1YmxpY05hbWUyJywgJ2RlY2xhcmVkUHJvcE5hbWUyJ10sCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBiZWNvbWVzOiAocHVibGljIG5hbWUgPT4gbWluaWZpZWROYW1lKQogICAgICoKICAgICAqIGBgYAogICAgICogewogICAgICogICdwcm9wTmFtZTEnOiAnbWluaWZpZWRQcm9wTmFtZTEnLAogICAgICogICdwdWJsaWNOYW1lMic6ICdtaW5pZmllZFByb3BOYW1lMicsCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBPcHRpb25hbGx5IHRoZSBmdW5jdGlvbiBjYW4gdGFrZSBgc2Vjb25kYXJ5YCB3aGljaCB3aWxsIHJlc3VsdCBpbjogKHB1YmxpYyBuYW1lID0+IGRlY2xhcmVkIG5hbWUpCiAgICAgKgogICAgICogYGBgCiAgICAgKiB7CiAgICAgKiAgJ3Byb3BOYW1lMSc6ICdwcm9wTmFtZTEnLAogICAgICogICdwdWJsaWNOYW1lMic6ICdkZWNsYXJlZFByb3BOYW1lMicsCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/PX0gb2JqCiAgICAgKiBAcGFyYW0gez89fSBzZWNvbmRhcnkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludmVydE9iamVjdChvYmosIHNlY29uZGFyeSkgewogICAgICAgIGlmIChvYmogPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChFTVBUWV9PQkopKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3TG9va3VwID0ge307CiAgICAgICAgZm9yIChjb25zdCBtaW5pZmllZEtleSBpbiBvYmopIHsKICAgICAgICAgICAgaWYgKG9iai5oYXNPd25Qcm9wZXJ0eShtaW5pZmllZEtleSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwdWJsaWNOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKG9ialttaW5pZmllZEtleV0pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBkZWNsYXJlZE5hbWUgPSBwdWJsaWNOYW1lOwogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocHVibGljTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZE5hbWUgPSBwdWJsaWNOYW1lWzFdOwogICAgICAgICAgICAgICAgICAgIHB1YmxpY05hbWUgPSBwdWJsaWNOYW1lWzBdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV3TG9va3VwW3B1YmxpY05hbWVdID0gbWluaWZpZWRLZXk7CiAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5KSB7CiAgICAgICAgICAgICAgICAgICAgKHNlY29uZGFyeVtwdWJsaWNOYW1lXSA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJlZE5hbWUpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld0xvb2t1cDsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIGEgZGlyZWN0aXZlIGRlZmluaXRpb24gb2JqZWN0LgogICAgICoKICAgICAqICMgRXhhbXBsZQogICAgICogYGBgdHMKICAgICAqIGNsYXNzIE15RGlyZWN0aXZlIHsKICAgICAqICAgLy8gR2VuZXJhdGVkIGJ5IEFuZ3VsYXIgVGVtcGxhdGUgQ29tcGlsZXIKICAgICAqICAgLy8gW1N5bWJvbF0gc3ludGF4IHdpbGwgbm90IGJlIHN1cHBvcnRlZCBieSBUeXBlU2NyaXB0IHVudGlsIHYyLjcKICAgICAqICAgc3RhdGljIMm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7CiAgICAgKiAgICAgLi4uCiAgICAgKiAgIH0pOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgybXJtWRlZmluZURpcmVjdGl2ZSA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoybXJtWRlZmluZUNvbXBvbmVudCkpKSk7CiAgICAvKioKICAgICAqIENyZWF0ZSBhIHBpcGUgZGVmaW5pdGlvbiBvYmplY3QuCiAgICAgKgogICAgICogIyBFeGFtcGxlCiAgICAgKiBgYGAKICAgICAqIGNsYXNzIE15UGlwZSBpbXBsZW1lbnRzIFBpcGVUcmFuc2Zvcm0gewogICAgICogICAvLyBHZW5lcmF0ZWQgYnkgQW5ndWxhciBUZW1wbGF0ZSBDb21waWxlcgogICAgICogICBzdGF0aWMgybVwaXBlID0gZGVmaW5lUGlwZSh7CiAgICAgKiAgICAgLi4uCiAgICAgKiAgIH0pOwogICAgICogfQogICAgICogYGBgCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHBpcGVEZWYgUGlwZSBkZWZpbml0aW9uIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIKICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1ZGVmaW5lUGlwZShwaXBlRGVmKSB7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKHsKICAgICAgICAgICAgdHlwZTogcGlwZURlZi50eXBlLAogICAgICAgICAgICBuYW1lOiBwaXBlRGVmLm5hbWUsCiAgICAgICAgICAgIGZhY3Rvcnk6IG51bGwsCiAgICAgICAgICAgIHB1cmU6IHBpcGVEZWYucHVyZSAhPT0gZmFsc2UsCiAgICAgICAgICAgIG9uRGVzdHJveTogcGlwZURlZi50eXBlLnByb3RvdHlwZS5uZ09uRGVzdHJveSB8fCBudWxsCiAgICAgICAgfSkpKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgZm9sbG93aW5nIGdldHRlciBtZXRob2RzIHJldHJpZXZlIHRoZSBkZWZpbml0aW9uIGZvcm0gdGhlIHR5cGUuIEN1cnJlbnRseSB0aGUgcmV0cmlldmFsCiAgICAgKiBob25vcnMgaW5oZXJpdGFuY2UsIGJ1dCBpbiB0aGUgZnV0dXJlIHdlIG1heSBjaGFuZ2UgdGhlIHJ1bGUgdG8gcmVxdWlyZSB0aGF0IGRlZmluaXRpb25zIGFyZQogICAgICogZXhwbGljaXQuIFRoaXMgd291bGQgcmVxdWlyZSBzb21lIHNvcnQgb2YgbWlncmF0aW9uIHN0cmF0ZWd5LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZVtOR19DT01QX0RFRl0gfHwgbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlRGVmKHR5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZVtOR19ESVJfREVGXSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQaXBlRGVmKHR5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZVtOR19QSVBFX0RFRl0gfHwgbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/PX0gdGhyb3dOb3RGb3VuZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RmFjdG9yeURlZih0eXBlLCB0aHJvd05vdEZvdW5kKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhc0ZhY3RvcnlEZWYgPSB0eXBlLmhhc093blByb3BlcnR5KE5HX0ZBQ1RPUllfREVGKTsKICAgICAgICBpZiAoIWhhc0ZhY3RvcnlEZWYgJiYgdGhyb3dOb3RGb3VuZCA9PT0gdHJ1ZSAmJiBuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUeXBlICR7c3RyaW5naWZ5KHR5cGUpfSBkb2VzIG5vdCBoYXZlICfJtWZhYycgcHJvcGVydHkuYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBoYXNGYWN0b3J5RGVmID8gdHlwZVtOR19GQUNUT1JZX0RFRl0gOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez89fSB0aHJvd05vdEZvdW5kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXROZ01vZHVsZURlZih0eXBlLCB0aHJvd05vdEZvdW5kKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gdHlwZVtOR19NT0RfREVGXSB8fCBudWxsOwogICAgICAgIGlmICghbmdNb2R1bGVEZWYgJiYgdGhyb3dOb3RGb3VuZCA9PT0gdHJ1ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFR5cGUgJHtzdHJpbmdpZnkodHlwZSl9IGRvZXMgbm90IGhhdmUgJ8m1bW9kJyBwcm9wZXJ0eS5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5nTW9kdWxlRGVmOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE5nTG9jYWxlSWREZWYodHlwZSkgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSlbTkdfTE9DX0lEX0RFRl0gfHwgbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy92aWV3LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8vIEJlbG93IGFyZSBjb25zdGFudHMgZm9yIExWaWV3IGluZGljZXMgdG8gaGVscCB1cyBsb29rIHVwIExWaWV3IG1lbWJlcnMKICAgIC8vIHdpdGhvdXQgaGF2aW5nIHRvIHJlbWVtYmVyIHRoZSBzcGVjaWZpYyBpbmRpY2VzLgogICAgLy8gVWdsaWZ5IHdpbGwgaW5saW5lIHRoZXNlIHdoZW4gbWluaWZ5aW5nIHNvIHRoZXJlIHNob3VsZG4ndCBiZSBhIGNvc3QuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBIT1NUID0gMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFRWSUVXID0gMTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEZMQUdTID0gMjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBBUkVOVCA9IDM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBORVhUID0gNDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFRSQU5TUExBTlRFRF9WSUVXU19UT19SRUZSRVNIID0gNTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFRfSE9TVCA9IDY7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDTEVBTlVQID0gNzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IENPTlRFWFQgPSA4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSU5KRUNUT1IkMSA9IDk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSRU5ERVJFUl9GQUNUT1JZID0gMTA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSRU5ERVJFUiA9IDExOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU0FOSVRJWkVSID0gMTI7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDSElMRF9IRUFEID0gMTM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDSElMRF9UQUlMID0gMTQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUNMQVJBVElPTl9WSUVXID0gMTU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUNMQVJBVElPTl9DT01QT05FTlRfVklFVyA9IDE2OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREVDTEFSQVRJT05fTENPTlRBSU5FUiA9IDE3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUFJFT1JERVJfSE9PS19GTEFHUyA9IDE4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUVVFUklFUyA9IDE5OwogICAgLyoqCiAgICAgKiBTaXplIG9mIExWaWV3J3MgaGVhZGVyLiBOZWNlc3NhcnkgdG8gYWRqdXN0IGZvciBpdCB3aGVuIHNldHRpbmcgc2xvdHMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSEVBREVSX09GRlNFVCA9IDIwOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnRlcmZhY2VzL2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFNwZWNpYWwgbG9jYXRpb24gd2hpY2ggYWxsb3dzIGVhc3kgaWRlbnRpZmljYXRpb24gb2YgdHlwZS4gSWYgd2UgaGF2ZSBhbiBhcnJheSB3aGljaCB3YXMKICAgICAqIHJldHJpZXZlZCBmcm9tIHRoZSBgTFZpZXdgIGFuZCB0aGF0IGFycmF5IGhhcyBgdHJ1ZWAgYXQgYFRZUEVgIGxvY2F0aW9uLCB3ZSBrbm93IGl0IGlzCiAgICAgKiBgTENvbnRhaW5lcmAuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgVFlQRSA9IDE7CiAgICAvKioKICAgICAqIEZsYWcgdG8gc2lnbmlmeSB0aGF0IHRoaXMgYExDb250YWluZXJgIG1heSBoYXZlIHRyYW5zcGxhbnRlZCB2aWV3cyB3aGljaCBuZWVkIHRvIGJlIGNoYW5nZQogICAgICogZGV0ZWN0ZWQuIChzZWU6IGBMVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV10pYC4KICAgICAqCiAgICAgKiBUaGlzIGZsYWcsIG9uY2Ugc2V0LCBpcyBuZXZlciB1bnNldCBmb3IgdGhlIGBMQ29udGFpbmVyYC4gVGhpcyBtZWFucyB0aGF0IHdoZW4gdW5zZXQgd2UgY2FuIHNraXAKICAgICAqIGEgbG90IG9mIHdvcmsgaW4gYHJlZnJlc2hFbWJlZGRlZFZpZXdzYC4gQnV0IHdoZW4gc2V0IHdlIHN0aWxsIG5lZWQgdG8gdmVyaWZ5CiAgICAgKiB0aGF0IHRoZSBgTU9WRURfVklFV1NgIGFyZSB0cmFuc3BsYW50ZWQgYW5kIG9uLXB1c2guCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSEFTX1RSQU5TUExBTlRFRF9WSUVXUyA9IDI7CiAgICAvLyBQQVJFTlQsIE5FWFQsIFRSQU5TUExBTlRFRF9WSUVXU19UT19SRUZSRVNIIGFyZSBpbmRpY2VzIDMsIDQsIGFuZCA1CiAgICAvLyBBcyB3ZSBhbHJlYWR5IGhhdmUgdGhlc2UgY29uc3RhbnRzIGluIExWaWV3LCB3ZSBkb24ndCBuZWVkIHRvIHJlLWNyZWF0ZSB0aGVtLgogICAgLy8gVF9IT1NUIGlzIGluZGV4IDYKICAgIC8vIFdlIGFscmVhZHkgaGF2ZSB0aGlzIGNvbnN0YW50cyBpbiBMVmlldywgd2UgZG9uJ3QgbmVlZCB0byByZS1jcmVhdGUgaXQuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOQVRJVkUgPSA3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVklFV19SRUZTID0gODsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE1PVkVEX1ZJRVdTID0gOTsKICAgIC8qKgogICAgICogU2l6ZSBvZiBMQ29udGFpbmVyJ3MgaGVhZGVyLiBSZXByZXNlbnRzIHRoZSBpbmRleCBhZnRlciB3aGljaCBhbGwgdmlld3MgaW4gdGhlCiAgICAgKiBjb250YWluZXIgd2lsbCBiZSBpbnNlcnRlZC4gV2UgbmVlZCB0byBrZWVwIGEgcmVjb3JkIG9mIGN1cnJlbnQgdmlld3Mgc28gd2Uga25vdwogICAgICogd2hpY2ggdmlld3MgYXJlIGFscmVhZHkgaW4gdGhlIERPTSAoYW5kIGRvbid0IG5lZWQgdG8gYmUgcmUtYWRkZWQpIGFuZCBzbyB3ZSBjYW4KICAgICAqIHJlbW92ZSB2aWV3cyBmcm9tIHRoZSBET00gd2hlbiB0aGV5IGFyZSBubyBsb25nZXIgcmVxdWlyZWQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQgPSAxMDsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy90eXBlX2NoZWNrcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRydWUgaWYgYHZhbHVlYCBpcyBgTFZpZXdgLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNMVmlldyh2YWx1ZSkgewogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWVbVFlQRV0gPT09ICdvYmplY3QnOwogICAgfQogICAgLyoqCiAgICAgKiBUcnVlIGlmIGB2YWx1ZWAgaXMgYExDb250YWluZXJgLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNMQ29udGFpbmVyKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlW1RZUEVdID09PSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0NvbnRlbnRRdWVyeUhvc3QodE5vZGUpIHsKICAgICAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgOCAvKiBoYXNDb250ZW50UXVlcnkgKi8pICE9PSAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0NvbXBvbmVudEhvc3QodE5vZGUpIHsKICAgICAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8pID09PSAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNEaXJlY3RpdmVIb3N0KHROb2RlKSB7CiAgICAgICAgcmV0dXJuICh0Tm9kZS5mbGFncyAmIDEgLyogaXNEaXJlY3RpdmVIb3N0ICovKSA9PT0gMSAvKiBpc0RpcmVjdGl2ZUhvc3QgKi87CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNDb21wb25lbnREZWYoZGVmKSB7CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSkpLnRlbXBsYXRlICE9PSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNSb290Vmlldyh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gKHRhcmdldFtGTEFHU10gJiA1MTIgLyogSXNSb290ICovKSAhPT0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvYXNzZXJ0LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIFtBc3NlcnQgZnVuY3Rpb25zIGRvIG5vdCBjb25zdHJhaW50IHR5cGUgd2hlbiB0aGV5IGFyZSBndWFyZGVkIGJ5IGEgdHJ1dGh5CiAgICAvLyBleHByZXNzaW9uLl0oaHR0cHM6Ly9naXRodWIuY29tL21pY3Jvc29mdC9UeXBlU2NyaXB0L2lzc3Vlcy8zNzI5NSkKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0VE5vZGVGb3JMVmlldyh0Tm9kZSwgbFZpZXcpIHsKICAgICAgICB0Tm9kZS5oYXNPd25Qcm9wZXJ0eSgndFZpZXdfJykgJiYKICAgICAgICAgICAgYXNzZXJ0RXF1YWwoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSkpKS50Vmlld18sIGxWaWV3W1RWSUVXXSwgJ1RoaXMgVE5vZGUgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgTFZpZXcuJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYWN0dWFsCiAgICAgKiBAcGFyYW0gez89fSBtc2cKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFzc2VydENvbXBvbmVudFR5cGUoYWN0dWFsLCBtc2cgPSAnVHlwZSBwYXNzZWQgaW4gaXMgbm90IENvbXBvbmVudFR5cGUsIGl0IGRvZXMgbm90IGhhdmUgXCfJtWNtcFwnIHByb3BlcnR5LicpIHsKICAgICAgICBpZiAoIWdldENvbXBvbmVudERlZihhY3R1YWwpKSB7CiAgICAgICAgICAgIHRocm93RXJyb3IkMShtc2cpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhY3R1YWwKICAgICAqIEBwYXJhbSB7Pz19IG1zZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0TmdNb2R1bGVUeXBlKGFjdHVhbCwgbXNnID0gJ1R5cGUgcGFzc2VkIGluIGlzIG5vdCBOZ01vZHVsZVR5cGUsIGl0IGRvZXMgbm90IGhhdmUgXCfJtW1vZFwnIHByb3BlcnR5LicpIHsKICAgICAgICBpZiAoIWdldE5nTW9kdWxlRGVmKGFjdHVhbCkpIHsKICAgICAgICAgICAgdGhyb3dFcnJvciQxKG1zZyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnRIYXNQYXJlbnQodE5vZGUpIHsKICAgICAgICBhc3NlcnREZWZpbmVkKHROb2RlLCAncHJldmlvdXNPclBhcmVudFROb2RlIHNob3VsZCBleGlzdCEnKTsKICAgICAgICBhc3NlcnREZWZpbmVkKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLnBhcmVudCwgJ3ByZXZpb3VzT3JQYXJlbnRUTm9kZSBzaG91bGQgaGF2ZSBhIHBhcmVudCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnRMQ29udGFpbmVyKHZhbHVlKSB7CiAgICAgICAgYXNzZXJ0RGVmaW5lZCh2YWx1ZSwgJ0xDb250YWluZXIgbXVzdCBiZSBkZWZpbmVkJyk7CiAgICAgICAgYXNzZXJ0RXF1YWwoaXNMQ29udGFpbmVyKHZhbHVlKSwgdHJ1ZSwgJ0V4cGVjdGluZyBMQ29udGFpbmVyJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFzc2VydExWaWV3T3JVbmRlZmluZWQodmFsdWUpIHsKICAgICAgICB2YWx1ZSAmJiBhc3NlcnRFcXVhbChpc0xWaWV3KHZhbHVlKSwgdHJ1ZSwgJ0V4cGVjdGluZyBMVmlldyBvciB1bmRlZmluZWQgb3IgbnVsbCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnRMVmlldyh2YWx1ZSkgewogICAgICAgIGFzc2VydERlZmluZWQodmFsdWUsICdMVmlldyBtdXN0IGJlIGRlZmluZWQnKTsKICAgICAgICBhc3NlcnRFcXVhbChpc0xWaWV3KHZhbHVlKSwgdHJ1ZSwgJ0V4cGVjdGluZyBMVmlldycpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez89fSBlcnJNZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcsIGVyck1lc3NhZ2UpIHsKICAgICAgICBhc3NlcnRFcXVhbCh0Vmlldy5maXJzdENyZWF0ZVBhc3MsIHRydWUsIGVyck1lc3NhZ2UgfHwgJ1Nob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBmaXJzdCBjcmVhdGUgcGFzcy4nKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/PX0gZXJyTWVzc2FnZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0Rmlyc3RVcGRhdGVQYXNzKHRWaWV3LCBlcnJNZXNzYWdlKSB7CiAgICAgICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RVcGRhdGVQYXNzLCB0cnVlLCBlcnJNZXNzYWdlIHx8ICdTaG91bGQgb25seSBiZSBjYWxsZWQgaW4gZmlyc3QgdXBkYXRlIHBhc3MuJyk7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgaXMgYSBiYXNpYyBzYW5pdHkgY2hlY2sgdGhhdCBhbiBvYmplY3QgaXMgcHJvYmFibHkgYSBkaXJlY3RpdmUgZGVmLiBEaXJlY3RpdmVEZWYgaXMKICAgICAqIGFuIGludGVyZmFjZSwgc28gd2UgY2FuJ3QgZG8gYSBkaXJlY3QgaW5zdGFuY2VvZiBjaGVjay4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0RGlyZWN0aXZlRGVmKG9iaikgewogICAgICAgIGlmIChvYmoudHlwZSA9PT0gdW5kZWZpbmVkIHx8IG9iai5zZWxlY3RvcnMgPT0gdW5kZWZpbmVkIHx8IG9iai5pbnB1dHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0aHJvd0Vycm9yJDEoYEV4cGVjdGVkIGEgRGlyZWN0aXZlRGVmL0NvbXBvbmVudERlZiBhbmQgdGhpcyBvYmplY3QgZG9lcyBub3Qgc2VlbSB0byBoYXZlIHRoZSBleHBlY3RlZCBzaGFwZS5gKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL25hbWVzcGFjZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1ZHX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2Zyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBNQVRIX01MX05BTUVTUEFDRSA9ICdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8nOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnRlcmZhY2VzL2NvbnRleHQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBUaGlzIHByb3BlcnR5IHdpbGwgYmUgbW9ua2V5LXBhdGNoZWQgb24gZWxlbWVudHMsIGNvbXBvbmVudHMgYW5kIGRpcmVjdGl2ZXMKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNT05LRVlfUEFUQ0hfS0VZX05BTUUgPSAnX19uZ0NvbnRleHRfXyc7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ludGVyZmFjZXMvZG9jdW1lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBNb3N0IG9mIHRoZSB1c2Ugb2YgYGRvY3VtZW50YCBpbiBBbmd1bGFyIGlzIGZyb20gd2l0aGluIHRoZSBESSBzeXN0ZW0gc28gaXQgaXMgcG9zc2libGUgdG8gc2ltcGx5CiAgICAgKiBpbmplY3QgdGhlIGBET0NVTUVOVGAgdG9rZW4gYW5kIGFyZSBkb25lLgogICAgICoKICAgICAqIEl2eSBpcyBzcGVjaWFsIGJlY2F1c2UgaXQgZG9lcyBub3QgcmVseSB1cG9uIHRoZSBESSBhbmQgbXVzdCBnZXQgaG9sZCBvZiB0aGUgZG9jdW1lbnQgc29tZSBvdGhlcgogICAgICogd2F5LgogICAgICoKICAgICAqIFRoZSBzb2x1dGlvbiBpcyB0byBkZWZpbmUgYGdldERvY3VtZW50KClgIGFuZCBgc2V0RG9jdW1lbnQoKWAgdG9wLWxldmVsIGZ1bmN0aW9ucyBmb3IgaXZ5LgogICAgICogV2hlcmV2ZXIgaXZ5IG5lZWRzIHRoZSBnbG9iYWwgZG9jdW1lbnQsIGl0IGNhbGxzIGBnZXREb2N1bWVudCgpYCBpbnN0ZWFkLgogICAgICoKICAgICAqIFdoZW4gcnVubmluZyBpdnkgb3V0c2lkZSBvZiBhIGJyb3dzZXIgZW52aXJvbm1lbnQsIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIGBzZXREb2N1bWVudCgpYCB0bwogICAgICogdGVsbCBpdnkgd2hhdCB0aGUgZ2xvYmFsIGBkb2N1bWVudGAgaXMuCiAgICAgKgogICAgICogQW5ndWxhciBkb2VzIHRoaXMgZm9yIHVzIGluIGVhY2ggb2YgdGhlIHN0YW5kYXJkIHBsYXRmb3JtcyAoYEJyb3dzZXJgLCBgU2VydmVyYCwgYW5kIGBXZWJXb3JrZXJgKQogICAgICogYnkgY2FsbGluZyBgc2V0RG9jdW1lbnQoKWAgd2hlbiBwcm92aWRpbmcgdGhlIGBET0NVTUVOVGAgdG9rZW4uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgbGV0IERPQ1VNRU5UID0gdW5kZWZpbmVkOwogICAgLyoqCiAgICAgKiBUZWxsIGl2eSB3aGF0IHRoZSBgZG9jdW1lbnRgIGlzIGZvciB0aGlzIHBsYXRmb3JtLgogICAgICoKICAgICAqIEl0IGlzIG9ubHkgbmVjZXNzYXJ5IHRvIGNhbGwgdGhpcyBpZiB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBub3QgYSBicm93c2VyLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQgVGhlIG9iamVjdCByZXByZXNlbnRpbmcgdGhlIGdsb2JhbCBgZG9jdW1lbnRgIGluIHRoaXMgZW52aXJvbm1lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXREb2N1bWVudChkb2N1bWVudCkgewogICAgICAgIERPQ1VNRU5UID0gZG9jdW1lbnQ7CiAgICB9CiAgICAvKioKICAgICAqIEFjY2VzcyB0aGUgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyB0aGUgYGRvY3VtZW50YCBmb3IgdGhpcyBwbGF0Zm9ybS4KICAgICAqCiAgICAgKiBJdnkgY2FsbHMgdGhpcyB3aGVuZXZlciBpdCBuZWVkcyB0byBhY2Nlc3MgdGhlIGBkb2N1bWVudGAgb2JqZWN0LgogICAgICogRm9yIGV4YW1wbGUgdG8gY3JlYXRlIHRoZSByZW5kZXJlciBvciB0byBkbyBzYW5pdGl6YXRpb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXREb2N1bWVudCgpIHsKICAgICAgICBpZiAoRE9DVU1FTlQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gRE9DVU1FTlQ7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvLyBObyAiZG9jdW1lbnQiIGNhbiBiZSBmb3VuZC4gVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgd2UgYXJlIHJ1bm5pbmcgaXZ5IG91dHNpZGUgQW5ndWxhciBhbmQKICAgICAgICAvLyB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBub3QgYSBicm93c2VyLiBTaW5jZSB0aGlzIGlzIG5vdCBhIHN1cHBvcnRlZCBzY2VuYXJpbyBhdCB0aGUgbW9tZW50CiAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbiBpbiBBbmd1bGFyIGFwcHMuCiAgICAgICAgLy8gT25jZSB3ZSBzdXBwb3J0IHJ1bm5pbmcgaXZ5IG91dHNpZGUgb2YgQW5ndWxhciB3ZSB3aWxsIG5lZWQgdG8gcHVibGlzaCBgc2V0RG9jdW1lbnQoKWAgYXMgYQogICAgICAgIC8vIHB1YmxpYyBBUEkuIE1lYW53aGlsZSB3ZSBqdXN0IHJldHVybiBgdW5kZWZpbmVkYCBhbmQgbGV0IHRoZSBhcHBsaWNhdGlvbiBmYWlsLgogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodW5kZWZpbmVkKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgYHJlbmRlcmVyYCBpcyBhIGBQcm9jZWR1cmFsUmVuZGVyZXIzYAogICAgICogQHBhcmFtIHs/fSByZW5kZXJlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpIHsKICAgICAgICByZXR1cm4gISEoKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5saXN0ZW4pOwogICAgfQogICAgY29uc3QgybUwJDIgPSAvKioKICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXJUeXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoaG9zdEVsZW1lbnQsIHJlbmRlcmVyVHlwZSkgPT4gewogICAgICAgIHJldHVybiBnZXREb2N1bWVudCgpOwogICAgfTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGRvbVJlbmRlcmVyRmFjdG9yeTMgPSB7CiAgICAgICAgY3JlYXRlUmVuZGVyZXI6ICjJtTAkMikKICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3V0aWwvdmlld191dGlscy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEZvciBlZmZpY2llbmN5IHJlYXNvbnMgd2Ugb2Z0ZW4gcHV0IHNldmVyYWwgZGlmZmVyZW50IGRhdGEgdHlwZXMgKGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYCkKICAgICAqIGluIHNhbWUgbG9jYXRpb24gaW4gYExWaWV3YC4gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdG8gcHJlLWFsbG9jYXRlIHNwYWNlIGZvciBpdAogICAgICogYmVjYXVzZSB0aGUgc3RvcmFnZSBpcyBzcGFyc2UuIFRoaXMgZmlsZSBjb250YWlucyB1dGlsaXRpZXMgZm9yIGRlYWxpbmcgd2l0aCBzdWNoIGRhdGEgdHlwZXMuCiAgICAgKgogICAgICogSG93IGRvIHdlIGtub3cgd2hhdCBpcyBzdG9yZWQgYXQgYSBnaXZlbiBsb2NhdGlvbiBpbiBgTFZpZXdgLgogICAgICogLSBgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPT09IGZhbHNlYCA9PiBgUk5vZGVgIChUaGUgbm9ybWFsIHN0b3JhZ2UgdmFsdWUpCiAgICAgKiAtIGBBcnJheS5pc0FycmF5KHZhbHVlKSA9PT0gdHJ1ZWAgPT4gdGhlbiB0aGUgYHZhbHVlWzBdYCByZXByZXNlbnRzIHRoZSB3cmFwcGVkIHZhbHVlLgogICAgICogICAtIGB0eXBlb2YgdmFsdWVbVFlQRV0gPT09ICdvYmplY3QnYCA9PiBgTFZpZXdgCiAgICAgKiAgICAgIC0gVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBhIGNvbXBvbmVudCBhdCBhIGdpdmVuIGxvY2F0aW9uCiAgICAgKiAgIC0gYHR5cGVvZiB2YWx1ZVtUWVBFXSA9PT0gdHJ1ZWAgPT4gYExDb250YWluZXJgCiAgICAgKiAgICAgIC0gVGhpcyBoYXBwZW5zIHdoZW4gd2UgaGF2ZSBgTENvbnRhaW5lcmAgYmluZGluZyBhdCBhIGdpdmVuIGxvY2F0aW9uLgogICAgICoKICAgICAqCiAgICAgKiBOT1RFOiBpdCBpcyBhc3N1bWVkIHRoYXQgYEFycmF5LmlzQXJyYXlgIGFuZCBgdHlwZW9mYCBvcGVyYXRpb25zIGFyZSB2ZXJ5IGVmZmljaWVudC4KICAgICAqLwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGBSTm9kZWAuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIHdyYXBwZWQgdmFsdWUgb2YgYFJOb2RlYCwgYExWaWV3YCwgYExDb250YWluZXJgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB1bndyYXBSTm9kZSh2YWx1ZSkgewogICAgICAgIHdoaWxlIChBcnJheS5pc0FycmF5KHZhbHVlKSkgewogICAgICAgICAgICB2YWx1ZSA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZVtIT1NUXSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYExWaWV3YCBvciBgbnVsbGAgaWYgbm90IGZvdW5kLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSB3cmFwcGVkIHZhbHVlIG9mIGBSTm9kZWAsIGBMVmlld2AsIGBMQ29udGFpbmVyYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdW53cmFwTFZpZXcodmFsdWUpIHsKICAgICAgICB3aGlsZSAoQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgLy8gVGhpcyBjaGVjayBpcyBzYW1lIGFzIGBpc0xWaWV3KClgIGJ1dCB3ZSBkb24ndCBjYWxsIGF0IGFzIHdlIGRvbid0IHdhbnQgdG8gY2FsbAogICAgICAgICAgICAvLyBgQXJyYXkuaXNBcnJheSgpYCB0d2ljZSBhbmQgZ2l2ZSBKSVRlciBtb3JlIHdvcmsgZm9yIGlubGluaW5nLgogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlW1RZUEVdID09PSAnb2JqZWN0JykKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAgICAgdmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWVbSE9TVF0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhbiBlbGVtZW50IHZhbHVlIGZyb20gdGhlIHByb3ZpZGVkIGB2aWV3RGF0YWAsIGJ5IHVud3JhcHBpbmcKICAgICAqIGZyb20gYW55IGNvbnRhaW5lcnMsIGNvbXBvbmVudCB2aWV3cywgb3Igc3R5bGUgY29udGV4dHMuCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldykgewogICAgICAgIHJldHVybiB1bndyYXBSTm9kZShsVmlld1tpbmRleCArIEhFQURFUl9PRkZTRVRdKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmUgYW4gYFJOb2RlYCBmb3IgYSBnaXZlbiBgVE5vZGVgIGFuZCBgTFZpZXdgLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gZ3VhcmFudGVlcyBpbiBkZXYgbW9kZSB0byByZXRyaWV2ZSBhIG5vbi1udWxsIGBSTm9kZWAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0VE5vZGVGb3JMVmlldyh0Tm9kZSwgbFZpZXcpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgdE5vZGUuaW5kZXgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBub2RlID0gdW53cmFwUk5vZGUobFZpZXdbdE5vZGUuaW5kZXhdKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgIWlzUHJvY2VkdXJhbFJlbmRlcmVyKGxWaWV3W1JFTkRFUkVSXSkgJiYgYXNzZXJ0RG9tTm9kZShub2RlKTsKICAgICAgICByZXR1cm4gbm9kZTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmUgYW4gYFJOb2RlYCBvciBgbnVsbGAgZm9yIGEgZ2l2ZW4gYFROb2RlYCBhbmQgYExWaWV3YC4KICAgICAqCiAgICAgKiBTb21lIGBUTm9kZWBzIGRvbid0IGhhdmUgYXNzb2NpYXRlZCBgUk5vZGVgcy4gRm9yIGV4YW1wbGUgYFByb2plY3Rpb25gCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TmF0aXZlQnlUTm9kZU9yTnVsbCh0Tm9kZSwgbFZpZXcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXggPSB0Tm9kZS5pbmRleDsKICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRUTm9kZUZvckxWaWV3KHROb2RlLCBsVmlldyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgbm9kZSA9IHVud3JhcFJOb2RlKGxWaWV3W2luZGV4XSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBub2RlICE9PSBudWxsICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihsVmlld1tSRU5ERVJFUl0pICYmIGFzc2VydERvbU5vZGUobm9kZSk7CiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VE5vZGUodFZpZXcsIGluZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEdyZWF0ZXJUaGFuKGluZGV4LCAtMSwgJ3dyb25nIGluZGV4IGZvciBUTm9kZScpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMZXNzVGhhbihpbmRleCwgdFZpZXcuZGF0YS5sZW5ndGgsICd3cm9uZyBpbmRleCBmb3IgVE5vZGUnKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSkpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgYSB2YWx1ZSBmcm9tIGFueSBgTFZpZXdgIG9yIGBURGF0YWAuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBsb2FkKHZpZXcsIGluZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKHZpZXcsIGluZGV4ICsgSEVBREVSX09GRlNFVCk7CiAgICAgICAgcmV0dXJuIHZpZXdbaW5kZXggKyBIRUFERVJfT0ZGU0VUXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICAgICAqIEBwYXJhbSB7P30gaG9zdFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudExWaWV3QnlJbmRleChub2RlSW5kZXgsIGhvc3RWaWV3KSB7CiAgICAgICAgLy8gQ291bGQgYmUgYW4gTFZpZXcgb3IgYW4gTENvbnRhaW5lci4gSWYgTENvbnRhaW5lciwgdW53cmFwIHRvIGZpbmQgTFZpZXcuCiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGhvc3RWaWV3LCBub2RlSW5kZXgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90VmFsdWUgPSBob3N0Vmlld1tub2RlSW5kZXhdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGlzTFZpZXcoc2xvdFZhbHVlKSA/IHNsb3RWYWx1ZSA6IHNsb3RWYWx1ZVtIT1NUXTsKICAgICAgICByZXR1cm4gbFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIG1vbmtleS1wYXRjaCB2YWx1ZSBkYXRhIHByZXNlbnQgb24gdGhlIHRhcmdldCAod2hpY2ggY291bGQgYmUKICAgICAqIGEgY29tcG9uZW50LCBkaXJlY3RpdmUgb3IgYSBET00gbm9kZSkuCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVhZFBhdGNoZWREYXRhKHRhcmdldCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRhcmdldCwgJ1RhcmdldCBleHBlY3RlZCcpOwogICAgICAgIHJldHVybiB0YXJnZXRbTU9OS0VZX1BBVENIX0tFWV9OQU1FXSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVhZFBhdGNoZWRMVmlldyh0YXJnZXQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmFsdWUgPSByZWFkUGF0Y2hlZERhdGEodGFyZ2V0KTsKICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiAoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpLmxWaWV3OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiB2aWV3IGlzIGluIGNyZWF0aW9uIG1vZGUKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNDcmVhdGlvbk1vZGUodmlldykgewogICAgICAgIHJldHVybiAodmlld1tGTEFHU10gJiA0IC8qIENyZWF0aW9uTW9kZSAqLykgPT09IDQgLyogQ3JlYXRpb25Nb2RlICovOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgYm9vbGVhbiBmb3Igd2hldGhlciB0aGUgdmlldyBpcyBhdHRhY2hlZCB0byB0aGUgY2hhbmdlIGRldGVjdGlvbiB0cmVlLgogICAgICoKICAgICAqIE5vdGU6IFRoaXMgZGV0ZXJtaW5lcyB3aGV0aGVyIGEgdmlldyBzaG91bGQgYmUgY2hlY2tlZCwgbm90IHdoZXRoZXIgaXQncyBpbnNlcnRlZAogICAgICogaW50byBhIGNvbnRhaW5lci4gRm9yIHRoYXQsIHlvdSdsbCB3YW50IGB2aWV3QXR0YWNoZWRUb0NvbnRhaW5lcmAgYmVsb3cuCiAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHZpZXdBdHRhY2hlZFRvQ2hhbmdlRGV0ZWN0b3IodmlldykgewogICAgICAgIHJldHVybiAodmlld1tGTEFHU10gJiAxMjggLyogQXR0YWNoZWQgKi8pID09PSAxMjggLyogQXR0YWNoZWQgKi87CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYSBib29sZWFuIGZvciB3aGV0aGVyIHRoZSB2aWV3IGlzIGF0dGFjaGVkIHRvIGEgY29udGFpbmVyLgogICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2aWV3QXR0YWNoZWRUb0NvbnRhaW5lcih2aWV3KSB7CiAgICAgICAgcmV0dXJuIGlzTENvbnRhaW5lcih2aWV3W1BBUkVOVF0pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgY29uc3RhbnQgZnJvbSBgVENvbnN0YW50c2AgaW5zdGFuY2UuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBjb25zdHMKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbnN0YW50KGNvbnN0cywgaW5kZXgpIHsKICAgICAgICByZXR1cm4gY29uc3RzID09PSBudWxsIHx8IGluZGV4ID09IG51bGwgPyBudWxsIDogKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChjb25zdHNbaW5kZXhdKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzZXRzIHRoZSBwcmUtb3JkZXIgaG9vayBmbGFncyBvZiB0aGUgdmlldy4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIExWaWV3IG9uIHdoaWNoIHRoZSBmbGFncyBhcmUgcmVzZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc2V0UHJlT3JkZXJIb29rRmxhZ3MobFZpZXcpIHsKICAgICAgICBsVmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSA9IDA7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIGBUUkFOU1BMQU5URURfVklFV1NfVE9fUkVGUkVTSGAgY291bnRlciBvbiB0aGUgYExDb250YWluZXJgIGFzIHdlbGwgYXMgdGhlIHBhcmVudHMKICAgICAqIHdob3NlCiAgICAgKiAgMS4gY291bnRlciBnb2VzIGZyb20gMCB0byAxLCBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgaXMgYSBuZXcgY2hpbGQgdGhhdCBoYXMgYSB2aWV3IHRvIHJlZnJlc2gKICAgICAqICBvcgogICAgICogIDIuIGNvdW50ZXIgZ29lcyBmcm9tIDEgdG8gMCwgaW5kaWNhdGluZyB0aGVyZSBhcmUgbm8gbW9yZSBkZXNjZW5kYW50IHZpZXdzIHRvIHJlZnJlc2gKICAgICAqIEBwYXJhbSB7P30gbENvbnRhaW5lcgogICAgICogQHBhcmFtIHs/fSBhbW91bnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHVwZGF0ZVRyYW5zcGxhbnRlZFZpZXdDb3VudChsQ29udGFpbmVyLCBhbW91bnQpIHsKICAgICAgICBsQ29udGFpbmVyW1RSQU5TUExBTlRFRF9WSUVXU19UT19SRUZSRVNIXSArPSBhbW91bnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2aWV3T3JDb250YWluZXIgPSBsQ29udGFpbmVyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyZW50ID0gbENvbnRhaW5lcltQQVJFTlRdOwogICAgICAgIHdoaWxlIChwYXJlbnQgIT09IG51bGwgJiYKICAgICAgICAgICAgKChhbW91bnQgPT09IDEgJiYgdmlld09yQ29udGFpbmVyW1RSQU5TUExBTlRFRF9WSUVXU19UT19SRUZSRVNIXSA9PT0gMSkgfHwKICAgICAgICAgICAgICAgIChhbW91bnQgPT09IC0xICYmIHZpZXdPckNvbnRhaW5lcltUUkFOU1BMQU5URURfVklFV1NfVE9fUkVGUkVTSF0gPT09IDApKSkgewogICAgICAgICAgICBwYXJlbnRbVFJBTlNQTEFOVEVEX1ZJRVdTX1RPX1JFRlJFU0hdICs9IGFtb3VudDsKICAgICAgICAgICAgdmlld09yQ29udGFpbmVyID0gcGFyZW50OwogICAgICAgICAgICBwYXJlbnQgPSBwYXJlbnRbUEFSRU5UXTsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbnN0cnVjdGlvblN0YXRlID0gewogICAgICAgIGxGcmFtZTogY3JlYXRlTEZyYW1lKG51bGwpLAogICAgICAgIGJpbmRpbmdzRW5hYmxlZDogdHJ1ZSwKICAgICAgICBjaGVja05vQ2hhbmdlc01vZGU6IGZhbHNlLAogICAgfTsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RWxlbWVudERlcHRoQ291bnQoKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmVsZW1lbnREZXB0aENvdW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbmNyZWFzZUVsZW1lbnREZXB0aENvdW50KCkgewogICAgICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmVsZW1lbnREZXB0aENvdW50Kys7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuZWxlbWVudERlcHRoQ291bnQtLTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QmluZGluZ3NFbmFibGVkKCkgewogICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmJpbmRpbmdzRW5hYmxlZDsKICAgIH0KICAgIC8qKgogICAgICogRW5hYmxlcyBkaXJlY3RpdmUgbWF0Y2hpbmcgb24gZWxlbWVudHMuCiAgICAgKgogICAgICogICogRXhhbXBsZToKICAgICAqIGBgYAogICAgICogPG15LWNvbXAgbXktZGlyZWN0aXZlPgogICAgICogICBTaG91bGQgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlLgogICAgICogPC9teS1jb21wPgogICAgICogPGRpdiBuZ05vbkJpbmRhYmxlPgogICAgICogICA8IS0tIMm1ybVkaXNhYmxlQmluZGluZ3MoKSAtLT4KICAgICAqICAgPG15LWNvbXAgbXktZGlyZWN0aXZlPgogICAgICogICAgIFNob3VsZCBub3QgbWF0Y2ggY29tcG9uZW50IC8gZGlyZWN0aXZlIGJlY2F1c2Ugd2UgYXJlIGluIG5nTm9uQmluZGFibGUuCiAgICAgKiAgIDwvbXktY29tcD4KICAgICAqICAgPCEtLSDJtcm1ZW5hYmxlQmluZGluZ3MoKSAtLT4KICAgICAqIDwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1ZW5hYmxlQmluZGluZ3MoKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5iaW5kaW5nc0VuYWJsZWQgPSB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBEaXNhYmxlcyBkaXJlY3RpdmUgbWF0Y2hpbmcgb24gZWxlbWVudC4KICAgICAqCiAgICAgKiAgKiBFeGFtcGxlOgogICAgICogYGBgCiAgICAgKiA8bXktY29tcCBteS1kaXJlY3RpdmU+CiAgICAgKiAgIFNob3VsZCBtYXRjaCBjb21wb25lbnQgLyBkaXJlY3RpdmUuCiAgICAgKiA8L215LWNvbXA+CiAgICAgKiA8ZGl2IG5nTm9uQmluZGFibGU+CiAgICAgKiAgIDwhLS0gybXJtWRpc2FibGVCaW5kaW5ncygpIC0tPgogICAgICogICA8bXktY29tcCBteS1kaXJlY3RpdmU+CiAgICAgKiAgICAgU2hvdWxkIG5vdCBtYXRjaCBjb21wb25lbnQgLyBkaXJlY3RpdmUgYmVjYXVzZSB3ZSBhcmUgaW4gbmdOb25CaW5kYWJsZS4KICAgICAqICAgPC9teS1jb21wPgogICAgICogICA8IS0tIMm1ybVlbmFibGVCaW5kaW5ncygpIC0tPgogICAgICogPC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVkaXNhYmxlQmluZGluZ3MoKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5iaW5kaW5nc0VuYWJsZWQgPSBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJuIHRoZSBjdXJyZW50IGBMVmlld2AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRMVmlldygpIHsKICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUubFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiB0aGUgY3VycmVudCBgVFZpZXdgLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VFZpZXcoKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLnRWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBSZXN0b3JlcyBgY29udGV4dFZpZXdEYXRhYCB0byB0aGUgZ2l2ZW4gT3BhcXVlVmlld1N0YXRlIGluc3RhbmNlLgogICAgICoKICAgICAqIFVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgZ2V0Q3VycmVudFZpZXcoKSBpbnN0cnVjdGlvbiB0byBzYXZlIGEgc25hcHNob3QKICAgICAqIG9mIHRoZSBjdXJyZW50IHZpZXcgYW5kIHJlc3RvcmUgaXQgd2hlbiBsaXN0ZW5lcnMgYXJlIGludm9rZWQuIFRoaXMgYWxsb3dzCiAgICAgKiB3YWxraW5nIHRoZSBkZWNsYXJhdGlvbiB2aWV3IHRyZWUgaW4gbGlzdGVuZXJzIHRvIGdldCB2YXJzIGZyb20gcGFyZW50IHZpZXdzLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSB2aWV3VG9SZXN0b3JlIFRoZSBPcGFxdWVWaWV3U3RhdGUgaW5zdGFuY2UgdG8gcmVzdG9yZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cmVzdG9yZVZpZXcodmlld1RvUmVzdG9yZSkgewogICAgICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmNvbnRleHRMVmlldyA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1RvUmVzdG9yZSkpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpIHsKICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUucHJldmlvdXNPclBhcmVudFROb2RlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGlzUGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIGlzUGFyZW50KSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUucHJldmlvdXNPclBhcmVudFROb2RlID0gdE5vZGU7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuaXNQYXJlbnQgPSBpc1BhcmVudDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SXNQYXJlbnQoKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmlzUGFyZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRJc05vdFBhcmVudCgpIHsKICAgICAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5pc1BhcmVudCA9IGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRDb250ZXh0TFZpZXcoKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmNvbnRleHRMVmlldzsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q2hlY2tOb0NoYW5nZXNNb2RlKCkgewogICAgICAgIC8vIFRPRE8obWlza28pOiByZW1vdmUgdGhpcyBmcm9tIHRoZSBMVmlldyBzaW5jZSBpdCBpcyBuZ0Rldk1vZGU9dHJ1ZSBtb2RlIG9ubHkuCiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUuY2hlY2tOb0NoYW5nZXNNb2RlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldENoZWNrTm9DaGFuZ2VzTW9kZShtb2RlKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5jaGVja05vQ2hhbmdlc01vZGUgPSBtb2RlOwogICAgfQogICAgLy8gdG9wIGxldmVsIHZhcmlhYmxlcyBzaG91bGQgbm90IGJlIGV4cG9ydGVkIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIChQRVJGX05PVEVTLm1kKQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRCaW5kaW5nUm9vdCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpbmRleCA9IGxGcmFtZS5iaW5kaW5nUm9vdEluZGV4OwogICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgaW5kZXggPSBsRnJhbWUuYmluZGluZ1Jvb3RJbmRleCA9IGxGcmFtZS50Vmlldy5iaW5kaW5nU3RhcnRJbmRleDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRCaW5kaW5nSW5kZXgoKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmJpbmRpbmdJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0QmluZGluZ0luZGV4KHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmJpbmRpbmdJbmRleCA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBuZXh0QmluZGluZ0luZGV4KCkgewogICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5iaW5kaW5nSW5kZXgrKzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb3VudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW5jcmVtZW50QmluZGluZ0luZGV4KGNvdW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleCA9IGxGcmFtZS5iaW5kaW5nSW5kZXg7CiAgICAgICAgbEZyYW1lLmJpbmRpbmdJbmRleCA9IGxGcmFtZS5iaW5kaW5nSW5kZXggKyBjb3VudDsKICAgICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICAvKioKICAgICAqIFNldCBhIG5ldyBiaW5kaW5nIHJvb3QgaW5kZXggc28gdGhhdCBob3N0IHRlbXBsYXRlIGZ1bmN0aW9ucyBjYW4gZXhlY3V0ZS4KICAgICAqCiAgICAgKiBCaW5kaW5ncyBpbnNpZGUgdGhlIGhvc3QgdGVtcGxhdGUgYXJlIDAgaW5kZXguIEJ1dCBiZWNhdXNlIHdlIGRvbid0IGtub3cgYWhlYWQgb2YgdGltZQogICAgICogaG93IG1hbnkgaG9zdCBiaW5kaW5ncyB3ZSBoYXZlIHdlIGNhbid0IHByZS1jb21wdXRlIHRoZW0uIEZvciB0aGlzIHJlYXNvbiB0aGV5IGFyZSBhbGwKICAgICAqIDAgaW5kZXggYW5kIHdlIGp1c3Qgc2hpZnQgdGhlIHJvb3Qgc28gdGhhdCB0aGV5IG1hdGNoIG5leHQgYXZhaWxhYmxlIGxvY2F0aW9uIGluIHRoZSBMVmlldy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdSb290SW5kZXggUm9vdCBpbmRleCBmb3IgYGhvc3RCaW5kaW5nc2AKICAgICAqIEBwYXJhbSB7P30gY3VycmVudERpcmVjdGl2ZUluZGV4IGBURGF0YVtjdXJyZW50RGlyZWN0aXZlSW5kZXhdYCB3aWxsIHBvaW50IHRvIHRoZSBjdXJyZW50IGRpcmVjdGl2ZQogICAgICogICAgICAgIHdob3NlIGBob3N0QmluZGluZ3NgIGFyZSBiZWluZyBwcm9jZXNzZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRCaW5kaW5nUm9vdEZvckhvc3RCaW5kaW5ncyhiaW5kaW5nUm9vdEluZGV4LCBjdXJyZW50RGlyZWN0aXZlSW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAgICAgbEZyYW1lLmJpbmRpbmdJbmRleCA9IGxGcmFtZS5iaW5kaW5nUm9vdEluZGV4ID0gYmluZGluZ1Jvb3RJbmRleDsKICAgICAgICBzZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoY3VycmVudERpcmVjdGl2ZUluZGV4KTsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiBob3N0IGJpbmRpbmcgaXMgZXhlY3V0aW5nIHRoaXMgcG9pbnRzIHRvIHRoZSBkaXJlY3RpdmUgaW5kZXguCiAgICAgKiBgVFZpZXcuZGF0YVtnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKV1gIGlzIGBEaXJlY3RpdmVEZWZgCiAgICAgKiBgTFZpZXdbZ2V0Q3VycmVudERpcmVjdGl2ZUluZGV4KCldYCBpcyBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKSB7CiAgICAgICAgcmV0dXJuIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyBhbiBpbmRleCBvZiBhIGRpcmVjdGl2ZSB3aG9zZSBgaG9zdEJpbmRpbmdzYCBhcmUgYmVpbmcgcHJvY2Vzc2VkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gY3VycmVudERpcmVjdGl2ZUluZGV4IGBURGF0YWAgaW5kZXggd2hlcmUgY3VycmVudCBkaXJlY3RpdmUgaW5zdGFuY2UgY2FuIGJlIGZvdW5kLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0Q3VycmVudERpcmVjdGl2ZUluZGV4KGN1cnJlbnREaXJlY3RpdmVJbmRleCkgewogICAgICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGN1cnJlbnREaXJlY3RpdmVJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgYERpcmVjdGl2ZURlZmAgd2hpY2ggaXMgYWN0aXZlIHdoZW4gYGhvc3RCaW5kaW5nc2AgaW5zdHJ1Y3Rpb24gaXMgYmVpbmcKICAgICAqIGV4ZWN1dGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdERhdGEgQ3VycmVudCBgVERhdGFgIHdoZXJlIHRoZSBgRGlyZWN0aXZlRGVmYCB3aWxsIGJlIGxvb2tlZCB1cCBhdC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEN1cnJlbnREaXJlY3RpdmVEZWYodERhdGEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3VycmVudERpcmVjdGl2ZUluZGV4ID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudERpcmVjdGl2ZUluZGV4OwogICAgICAgIHJldHVybiBjdXJyZW50RGlyZWN0aXZlSW5kZXggPT09IC0xID8gbnVsbCA6ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJyZW50RGlyZWN0aXZlSW5kZXhdKSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEN1cnJlbnRRdWVyeUluZGV4KCkgewogICAgICAgIHJldHVybiBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50UXVlcnlJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0Q3VycmVudFF1ZXJ5SW5kZXgodmFsdWUpIHsKICAgICAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50UXVlcnlJbmRleCA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBUaGlzIGlzIGEgbGlnaHQgd2VpZ2h0IHZlcnNpb24gb2YgdGhlIGBlbnRlclZpZXdgIHdoaWNoIGlzIG5lZWRlZCBieSB0aGUgREkgc3lzdGVtLgogICAgICogQHBhcmFtIHs/fSBuZXdWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBlbnRlckRJKG5ld1ZpZXcsIHROb2RlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3T3JVbmRlZmluZWQobmV3Vmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld0xGcmFtZSA9IGFsbG9jTEZyYW1lKCk7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUgPSBuZXdMRnJhbWU7CiAgICAgICAgbmV3TEZyYW1lLnByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwogICAgICAgIG5ld0xGcmFtZS5sVmlldyA9IG5ld1ZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIFN3YXAgdGhlIGN1cnJlbnQgbFZpZXcgd2l0aCBhIG5ldyBsVmlldy4KICAgICAqCiAgICAgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucyB3ZSBzdG9yZSB0aGUgbFZpZXcgaW4gdGhlIHRvcCBsZXZlbCBvZiB0aGUgbW9kdWxlLgogICAgICogVGhpcyB3YXkgd2UgbWluaW1pemUgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzIHRvIHJlYWQuIFdoZW5ldmVyIGEgbmV3IHZpZXcKICAgICAqIGlzIGVudGVyZWQgd2UgaGF2ZSB0byBzdG9yZSB0aGUgbFZpZXcgZm9yIGxhdGVyLCBhbmQgd2hlbiB0aGUgdmlldyBpcwogICAgICogZXhpdGVkIHRoZSBzdGF0ZSBoYXMgdG8gYmUgcmVzdG9yZWQKICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5ld1ZpZXcgTmV3IGxWaWV3IHRvIGJlY29tZSBhY3RpdmUKICAgICAqIEBwYXJhbSB7P30gdE5vZGUgRWxlbWVudCB0byB3aGljaCB0aGUgVmlldyBpcyBhIGNoaWxkIG9mCiAgICAgKiBAcmV0dXJuIHs/fSB0aGUgcHJldmlvdXNseSBhY3RpdmUgbFZpZXc7CiAgICAgKi8KICAgIGZ1bmN0aW9uIGVudGVyVmlldyhuZXdWaWV3LCB0Tm9kZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMVmlld09yVW5kZWZpbmVkKG5ld1ZpZXcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdMRnJhbWUgPSBhbGxvY0xGcmFtZSgpOwogICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgYXNzZXJ0RXF1YWwobmV3TEZyYW1lLmlzUGFyZW50LCB0cnVlLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5sVmlldywgbnVsbCwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUudFZpZXcsIG51bGwsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICAgICAgYXNzZXJ0RXF1YWwobmV3TEZyYW1lLnNlbGVjdGVkSW5kZXgsIDAsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICAgICAgYXNzZXJ0RXF1YWwobmV3TEZyYW1lLmVsZW1lbnREZXB0aENvdW50LCAwLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50RGlyZWN0aXZlSW5kZXgsIC0xLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50TmFtZXNwYWNlLCBudWxsLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5jdXJyZW50U2FuaXRpemVyLCBudWxsLCAnRXhwZWN0ZWQgY2xlYW4gTEZyYW1lJyk7CiAgICAgICAgICAgIGFzc2VydEVxdWFsKG5ld0xGcmFtZS5iaW5kaW5nUm9vdEluZGV4LCAtMSwgJ0V4cGVjdGVkIGNsZWFuIExGcmFtZScpOwogICAgICAgICAgICBhc3NlcnRFcXVhbChuZXdMRnJhbWUuY3VycmVudFF1ZXJ5SW5kZXgsIDAsICdFeHBlY3RlZCBjbGVhbiBMRnJhbWUnKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gbmV3Vmlld1tUVklFV107CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUgPSBuZXdMRnJhbWU7CiAgICAgICAgbmV3TEZyYW1lLnByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpOwogICAgICAgIG5ld0xGcmFtZS5sVmlldyA9IG5ld1ZpZXc7CiAgICAgICAgbmV3TEZyYW1lLnRWaWV3ID0gdFZpZXc7CiAgICAgICAgbmV3TEZyYW1lLmNvbnRleHRMVmlldyA9ICgvKiogQHR5cGUgez99ICovIChuZXdWaWV3KSk7CiAgICAgICAgbmV3TEZyYW1lLmJpbmRpbmdJbmRleCA9IHRWaWV3LmJpbmRpbmdTdGFydEluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBBbGxvY2F0ZXMgbmV4dCBmcmVlIExGcmFtZS4gVGhpcyBmdW5jdGlvbiB0cmllcyB0byByZXVzZSB0aGUgYExGcmFtZWBzIHRvIGxvd2VyIG1lbW9yeSBwcmVzc3VyZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFsbG9jTEZyYW1lKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50TEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNoaWxkTEZyYW1lID0gY3VycmVudExGcmFtZSA9PT0gbnVsbCA/IG51bGwgOiBjdXJyZW50TEZyYW1lLmNoaWxkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdMRnJhbWUgPSBjaGlsZExGcmFtZSA9PT0gbnVsbCA/IGNyZWF0ZUxGcmFtZShjdXJyZW50TEZyYW1lKSA6IGNoaWxkTEZyYW1lOwogICAgICAgIHJldHVybiBuZXdMRnJhbWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVMRnJhbWUocGFyZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxGcmFtZSA9IHsKICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLwogICAgICAgICAgICBpc1BhcmVudDogdHJ1ZSwKICAgICAgICAgICAgLy8KICAgICAgICAgICAgbFZpZXc6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIHRWaWV3OiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAvLwogICAgICAgICAgICBzZWxlY3RlZEluZGV4OiAwLAogICAgICAgICAgICAvLwogICAgICAgICAgICBjb250ZXh0TFZpZXc6ICgvKiogQHR5cGUgez99ICovIChudWxsKSksCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIGVsZW1lbnREZXB0aENvdW50OiAwLAogICAgICAgICAgICAvLwogICAgICAgICAgICBjdXJyZW50TmFtZXNwYWNlOiBudWxsLAogICAgICAgICAgICAvLwogICAgICAgICAgICBjdXJyZW50U2FuaXRpemVyOiBudWxsLAogICAgICAgICAgICAvLwogICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlSW5kZXg6IC0xLAogICAgICAgICAgICAvLwogICAgICAgICAgICBiaW5kaW5nUm9vdEluZGV4OiAtMSwKICAgICAgICAgICAgLy8KICAgICAgICAgICAgYmluZGluZ0luZGV4OiAtMSwKICAgICAgICAgICAgLy8KICAgICAgICAgICAgY3VycmVudFF1ZXJ5SW5kZXg6IDAsCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIHBhcmVudDogKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudCkpLAogICAgICAgICAgICAvLwogICAgICAgICAgICBjaGlsZDogbnVsbCwKICAgICAgICB9OwogICAgICAgIHBhcmVudCAhPT0gbnVsbCAmJiAocGFyZW50LmNoaWxkID0gbEZyYW1lKTsgLy8gbGluayB0aGUgbmV3IExGcmFtZSBmb3IgcmV1c2UuCiAgICAgICAgcmV0dXJuIGxGcmFtZTsKICAgIH0KICAgIC8qKgogICAgICogQSBsaWdodHdlaWdodCB2ZXJzaW9uIG9mIGxlYXZlIHdoaWNoIGlzIHVzZWQgd2l0aCBESS4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIG9ubHkgcmVzZXRzIGBwcmV2aW91c09yUGFyZW50VE5vZGVgIGFuZCBgTFZpZXdgIGFzIHRob3NlIGFyZSB0aGUgb25seSBwcm9wZXJ0aWVzCiAgICAgKiB1c2VkIHdpdGggREkgKGBlbnRlckRJKClgKS4KICAgICAqCiAgICAgKiBOT1RFOiBUaGlzIGZ1bmN0aW9uIGlzIHJlZXhwb3J0ZWQgYXMgYGxlYXZlRElgLiBIb3dldmVyIGBsZWF2ZURJYCBoYXMgcmV0dXJuIHR5cGUgb2YgYHZvaWRgIHdoZXJlCiAgICAgKiBhcyBgbGVhdmVWaWV3TGlnaHRgIGhhcyBgTEZyYW1lYC4gVGhpcyBpcyBzbyB0aGF0IGBsZWF2ZVZpZXdMaWdodGAgY2FuIGJlIHVzZWQgaW4gYGxlYXZlVmlld2AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBsZWF2ZVZpZXdMaWdodCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkTEZyYW1lID0gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWU7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUgPSBvbGRMRnJhbWUucGFyZW50OwogICAgICAgIG9sZExGcmFtZS5wcmV2aW91c09yUGFyZW50VE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIG9sZExGcmFtZS5sVmlldyA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgcmV0dXJuIG9sZExGcmFtZTsKICAgIH0KICAgIC8qKgogICAgICogVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IHZlcnNpb24gb2YgdGhlIGBsZWF2ZVZpZXdgIHdoaWNoIGlzIG5lZWRlZCBieSB0aGUgREkgc3lzdGVtLgogICAgICoKICAgICAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgYW4gYWxpYXMgc28gdGhhdCB3ZSBjYW4gY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBmdW5jdGlvbiB0byBoYXZlIGB2b2lkYAogICAgICogcmV0dXJuIHR5cGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgbGVhdmVESSA9IGxlYXZlVmlld0xpZ2h0OwogICAgLyoqCiAgICAgKiBMZWF2ZSB0aGUgY3VycmVudCBgTFZpZXdgCiAgICAgKgogICAgICogVGhpcyBwb3BzIHRoZSBgTEZyYW1lYCB3aXRoIHRoZSBhc3NvY2lhdGVkIGBMVmlld2AgZnJvbSB0aGUgc3RhY2suCiAgICAgKgogICAgICogSU1QT1JUQU5UOiBXZSBtdXN0IHplcm8gb3V0IHRoZSBgTEZyYW1lYCB2YWx1ZXMgaGVyZSBvdGhlcndpc2UgdGhleSB3aWxsIGJlIHJldGFpbmVkLiBUaGlzIGlzCiAgICAgKiBiZWNhdXNlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIHdlIGRvbid0IHJlbGVhc2UgYExGcmFtZWAgYnV0IHJhdGhlciBrZWVwIGl0IGZvciBuZXh0IHVzZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxlYXZlVmlldygpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkTEZyYW1lID0gbGVhdmVWaWV3TGlnaHQoKTsKICAgICAgICBvbGRMRnJhbWUuaXNQYXJlbnQgPSB0cnVlOwogICAgICAgIG9sZExGcmFtZS50VmlldyA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgb2xkTEZyYW1lLnNlbGVjdGVkSW5kZXggPSAwOwogICAgICAgIG9sZExGcmFtZS5jb250ZXh0TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIG9sZExGcmFtZS5lbGVtZW50RGVwdGhDb3VudCA9IDA7CiAgICAgICAgb2xkTEZyYW1lLmN1cnJlbnREaXJlY3RpdmVJbmRleCA9IC0xOwogICAgICAgIG9sZExGcmFtZS5jdXJyZW50TmFtZXNwYWNlID0gbnVsbDsKICAgICAgICBvbGRMRnJhbWUuY3VycmVudFNhbml0aXplciA9IG51bGw7CiAgICAgICAgb2xkTEZyYW1lLmJpbmRpbmdSb290SW5kZXggPSAtMTsKICAgICAgICBvbGRMRnJhbWUuYmluZGluZ0luZGV4ID0gLTE7CiAgICAgICAgb2xkTEZyYW1lLmN1cnJlbnRRdWVyeUluZGV4ID0gMDsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gbGV2ZWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5leHRDb250ZXh0SW1wbChsZXZlbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250ZXh0TFZpZXcgPSBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jb250ZXh0TFZpZXcgPQogICAgICAgICAgICB3YWxrVXBWaWV3cyhsZXZlbCwgKC8qKiBAdHlwZSB7P30gKi8gKGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmNvbnRleHRMVmlldykpKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHRMVmlld1tDT05URVhUXSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5lc3RpbmdMZXZlbAogICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gd2Fsa1VwVmlld3MobmVzdGluZ0xldmVsLCBjdXJyZW50VmlldykgewogICAgICAgIHdoaWxlIChuZXN0aW5nTGV2ZWwgPiAwKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZChjdXJyZW50Vmlld1tERUNMQVJBVElPTl9WSUVXXSwgJ0RlY2xhcmF0aW9uIHZpZXcgc2hvdWxkIGJlIGRlZmluZWQgaWYgbmVzdGluZyBsZXZlbCBpcyBncmVhdGVyIHRoYW4gMC4nKTsKICAgICAgICAgICAgY3VycmVudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudFZpZXdbREVDTEFSQVRJT05fVklFV10pKTsKICAgICAgICAgICAgbmVzdGluZ0xldmVsLS07CiAgICAgICAgfQogICAgICAgIHJldHVybiBjdXJyZW50VmlldzsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgY3VycmVudGx5IHNlbGVjdGVkIGVsZW1lbnQgaW5kZXguCiAgICAgKgogICAgICogVXNlZCB3aXRoIHtcQGxpbmsgcHJvcGVydHl9IGluc3RydWN0aW9uIChhbmQgbW9yZSBpbiB0aGUgZnV0dXJlKSB0byBpZGVudGlmeSB0aGUgaW5kZXggaW4gdGhlCiAgICAgKiBjdXJyZW50IGBMVmlld2AgdG8gYWN0IG9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U2VsZWN0ZWRJbmRleCgpIHsKICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuc2VsZWN0ZWRJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbW9zdCByZWNlbnQgaW5kZXggcGFzc2VkIHRvIHtcQGxpbmsgc2VsZWN0fQogICAgICoKICAgICAqIFVzZWQgd2l0aCB7XEBsaW5rIHByb3BlcnR5fSBpbnN0cnVjdGlvbiAoYW5kIG1vcmUgaW4gdGhlIGZ1dHVyZSkgdG8gaWRlbnRpZnkgdGhlIGluZGV4IGluIHRoZQogICAgICogY3VycmVudCBgTFZpZXdgIHRvIGFjdCBvbi4KICAgICAqCiAgICAgKiAoTm90ZSB0aGF0IGlmIGFuICJleGl0IGZ1bmN0aW9uIiB3YXMgc2V0IGVhcmxpZXIgKHZpYSBgc2V0RWxlbWVudEV4aXRGbigpYCkgdGhlbiB0aGF0IHdpbGwgYmUKICAgICAqIHJ1biBpZiBhbmQgd2hlbiB0aGUgcHJvdmlkZWQgYGluZGV4YCB2YWx1ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBzZWxlY3RlZCBpbmRleCB2YWx1ZS4pCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRTZWxlY3RlZEluZGV4KGluZGV4KSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuc2VsZWN0ZWRJbmRleCA9IGluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBgdE5vZGVgIHRoYXQgcmVwcmVzZW50cyBjdXJyZW50bHkgc2VsZWN0ZWQgZWxlbWVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNlbGVjdGVkVE5vZGUoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgICAgIHJldHVybiBnZXRUTm9kZShsRnJhbWUudFZpZXcsIGxGcmFtZS5zZWxlY3RlZEluZGV4KTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGAnaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmcnYCBpbiBnbG9iYWwgc3RhdGUuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1bmFtZXNwYWNlU1ZHKCkgewogICAgICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBTVkdfTkFNRVNQQUNFOwogICAgfQogICAgLyoqCiAgICAgKiBTZXRzIHRoZSBuYW1lc3BhY2UgdXNlZCB0byBjcmVhdGUgZWxlbWVudHMgdG8gYCdodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGhNTC8nYCBpbiBnbG9iYWwgc3RhdGUuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1bmFtZXNwYWNlTWF0aE1MKCkgewogICAgICAgIGluc3RydWN0aW9uU3RhdGUubEZyYW1lLmN1cnJlbnROYW1lc3BhY2UgPSBNQVRIX01MX05BTUVTUEFDRTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGBudWxsYCwgd2hpY2ggZm9yY2VzIGVsZW1lbnQgY3JlYXRpb24gdG8gdXNlCiAgICAgKiBgY3JlYXRlRWxlbWVudGAgcmF0aGVyIHRoYW4gYGNyZWF0ZUVsZW1lbnROU2AuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1bmFtZXNwYWNlSFRNTCgpIHsKICAgICAgICBuYW1lc3BhY2VIVE1MSW50ZXJuYWwoKTsKICAgIH0KICAgIC8qKgogICAgICogU2V0cyB0aGUgbmFtZXNwYWNlIHVzZWQgdG8gY3JlYXRlIGVsZW1lbnRzIHRvIGBudWxsYCwgd2hpY2ggZm9yY2VzIGVsZW1lbnQgY3JlYXRpb24gdG8gdXNlCiAgICAgKiBgY3JlYXRlRWxlbWVudGAgcmF0aGVyIHRoYW4gYGNyZWF0ZUVsZW1lbnROU2AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBuYW1lc3BhY2VIVE1MSW50ZXJuYWwoKSB7CiAgICAgICAgaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudE5hbWVzcGFjZSA9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE5hbWVzcGFjZSgpIHsKICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25TdGF0ZS5sRnJhbWUuY3VycmVudE5hbWVzcGFjZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzYW5pdGl6ZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEN1cnJlbnRTdHlsZVNhbml0aXplcihzYW5pdGl6ZXIpIHsKICAgICAgICBpbnN0cnVjdGlvblN0YXRlLmxGcmFtZS5jdXJyZW50U2FuaXRpemVyID0gc2FuaXRpemVyOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRDdXJyZW50U3R5bGVTYW5pdGl6ZXIoKSB7CiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IFRoaXMgc2hvdWxkIHRocm93IHdoZW4gdGhlcmUgaXMgbm8gTFZpZXcsIGJ1dCBpdCB0dXJucyBvdXQgd2UgY2FuIGdldCBoZXJlIGZyb20KICAgICAgICAvLyBgTm9kZVN0eWxlRGVidWdgIGhlbmNlIHdlIHJldHVybiBgbnVsbGAuIFRoaXMgc2hvdWxkIGJlIGZpeGVkCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxGcmFtZSA9IGluc3RydWN0aW9uU3RhdGUubEZyYW1lOwogICAgICAgIHJldHVybiBsRnJhbWUgPT09IG51bGwgPyBudWxsIDogbEZyYW1lLmN1cnJlbnRTYW5pdGl6ZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2hvb2tzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQWRkcyBhbGwgZGlyZWN0aXZlIGxpZmVjeWNsZSBob29rcyBmcm9tIHRoZSBnaXZlbiBgRGlyZWN0aXZlRGVmYCB0byB0aGUgZ2l2ZW4gYFRWaWV3YC4KICAgICAqCiAgICAgKiBNdXN0IGJlIHJ1biAqb25seSogb24gdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MuCiAgICAgKgogICAgICogU2V0cyB1cCB0aGUgcHJlLW9yZGVyIGhvb2tzIG9uIHRoZSBwcm92aWRlZCBgdFZpZXdgLAogICAgICogc2VlIHtcQGxpbmsgSG9va0RhdGF9IGZvciBkZXRhaWxzIGFib3V0IHRoZSBkYXRhIHN0cnVjdHVyZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgZGlyZWN0aXZlIGluIExWaWV3CiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZURlZiBUaGUgZGVmaW5pdGlvbiBjb250YWluaW5nIHRoZSBob29rcyB0byBzZXR1cCBpbiB0VmlldwogICAgICogQHBhcmFtIHs/fSB0VmlldyBUaGUgY3VycmVudCBUVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVnaXN0ZXJQcmVPcmRlckhvb2tzKGRpcmVjdGl2ZUluZGV4LCBkaXJlY3RpdmVEZWYsIHRWaWV3KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAgICAgY29uc3QgeyBvbkNoYW5nZXMsIG9uSW5pdCwgZG9DaGVjayB9ID0gZGlyZWN0aXZlRGVmOwogICAgICAgIGlmIChvbkNoYW5nZXMpIHsKICAgICAgICAgICAgKHRWaWV3LnByZU9yZGVySG9va3MgfHwgKHRWaWV3LnByZU9yZGVySG9va3MgPSBbXSkpLnB1c2goZGlyZWN0aXZlSW5kZXgsIG9uQ2hhbmdlcyk7CiAgICAgICAgICAgICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgfHwgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyA9IFtdKSkucHVzaChkaXJlY3RpdmVJbmRleCwgb25DaGFuZ2VzKTsKICAgICAgICB9CiAgICAgICAgaWYgKG9uSW5pdCkgewogICAgICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaCgtZGlyZWN0aXZlSW5kZXgsIG9uSW5pdCk7CiAgICAgICAgfQogICAgICAgIGlmIChkb0NoZWNrKSB7CiAgICAgICAgICAgICh0Vmlldy5wcmVPcmRlckhvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckhvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBkb0NoZWNrKTsKICAgICAgICAgICAgKHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rcyB8fCAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzID0gW10pKS5wdXNoKGRpcmVjdGl2ZUluZGV4LCBkb0NoZWNrKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBMb29wcyB0aHJvdWdoIHRoZSBkaXJlY3RpdmVzIG9uIHRoZSBwcm92aWRlZCBgdE5vZGVgIGFuZCBxdWV1ZXMgaG9va3MgdG8gYmUKICAgICAqIHJ1biB0aGF0IGFyZSBub3QgaW5pdGlhbGl6YXRpb24gaG9va3MuCiAgICAgKgogICAgICogU2hvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBgZWxlbWVudEVuZCgpYCBhbmQgc2ltaWxhciB0bwogICAgICogcHJlc2VydmUgaG9vayBleGVjdXRpb24gb3JkZXIuIENvbnRlbnQsIHZpZXcsIGFuZCBkZXN0cm95IGhvb2tzIGZvciBwcm9qZWN0ZWQKICAgICAqIGNvbXBvbmVudHMgYW5kIGRpcmVjdGl2ZXMgbXVzdCBiZSBjYWxsZWQgKmJlZm9yZSogdGhlaXIgaG9zdHMuCiAgICAgKgogICAgICogU2V0cyB1cCB0aGUgY29udGVudCwgdmlldywgYW5kIGRlc3Ryb3kgaG9va3Mgb24gdGhlIHByb3ZpZGVkIGB0Vmlld2AsCiAgICAgKiBzZWUge1xAbGluayBIb29rRGF0YX0gZm9yIGRldGFpbHMgYWJvdXQgdGhlIGRhdGEgc3RydWN0dXJlLgogICAgICoKICAgICAqIE5PVEU6IFRoaXMgZG9lcyBub3Qgc2V0IHVwIGBvbkNoYW5nZXNgLCBgb25Jbml0YCBvciBgZG9DaGVja2AsIHRob3NlIGFyZSBzZXQgdXAKICAgICAqIHNlcGFyYXRlbHkgYXQgYGVsZW1lbnRTdGFydGAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0VmlldyBUaGUgY3VycmVudCBUVmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBUaGUgVE5vZGUgd2hvc2UgZGlyZWN0aXZlcyBhcmUgdG8gYmUgc2VhcmNoZWQgZm9yIGhvb2tzIHRvIHF1ZXVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZWdpc3RlclBvc3RPcmRlckhvb2tzKHRWaWV3LCB0Tm9kZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcpOwogICAgICAgIC8vIEl0J3MgbmVjZXNzYXJ5IHRvIGxvb3AgdGhyb3VnaCB0aGUgZGlyZWN0aXZlcyBhdCBlbGVtZW50RW5kKCkgKHJhdGhlciB0aGFuIHByb2Nlc3NpbmcgaW4KICAgICAgICAvLyBkaXJlY3RpdmVDcmVhdGUpIHNvIHdlIGNhbiBwcmVzZXJ2ZSB0aGUgY3VycmVudCBob29rIG9yZGVyLiBDb250ZW50LCB2aWV3LCBhbmQgZGVzdHJveQogICAgICAgIC8vIGhvb2tzIGZvciBwcm9qZWN0ZWQgY29tcG9uZW50cyBhbmQgZGlyZWN0aXZlcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiB0aGVpciBob3N0cy4KICAgICAgICBmb3IgKGxldCBpID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQsIGVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsgaSA8IGVuZDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaV0pKTsKICAgICAgICAgICAgaWYgKGRpcmVjdGl2ZURlZi5hZnRlckNvbnRlbnRJbml0KSB7CiAgICAgICAgICAgICAgICAodFZpZXcuY29udGVudEhvb2tzIHx8ICh0Vmlldy5jb250ZW50SG9va3MgPSBbXSkpLnB1c2goLWksIGRpcmVjdGl2ZURlZi5hZnRlckNvbnRlbnRJbml0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyQ29udGVudENoZWNrZWQpIHsKICAgICAgICAgICAgICAgICh0Vmlldy5jb250ZW50SG9va3MgfHwgKHRWaWV3LmNvbnRlbnRIb29rcyA9IFtdKSkucHVzaChpLCBkaXJlY3RpdmVEZWYuYWZ0ZXJDb250ZW50Q2hlY2tlZCk7CiAgICAgICAgICAgICAgICAodFZpZXcuY29udGVudENoZWNrSG9va3MgfHwgKHRWaWV3LmNvbnRlbnRDaGVja0hvb2tzID0gW10pKQogICAgICAgICAgICAgICAgICAgIC5wdXNoKGksIGRpcmVjdGl2ZURlZi5hZnRlckNvbnRlbnRDaGVja2VkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmLmFmdGVyVmlld0luaXQpIHsKICAgICAgICAgICAgICAgICh0Vmlldy52aWV3SG9va3MgfHwgKHRWaWV3LnZpZXdIb29rcyA9IFtdKSkucHVzaCgtaSwgZGlyZWN0aXZlRGVmLmFmdGVyVmlld0luaXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVEZWYuYWZ0ZXJWaWV3Q2hlY2tlZCkgewogICAgICAgICAgICAgICAgKHRWaWV3LnZpZXdIb29rcyB8fCAodFZpZXcudmlld0hvb2tzID0gW10pKS5wdXNoKGksIGRpcmVjdGl2ZURlZi5hZnRlclZpZXdDaGVja2VkKTsKICAgICAgICAgICAgICAgICh0Vmlldy52aWV3Q2hlY2tIb29rcyB8fCAodFZpZXcudmlld0NoZWNrSG9va3MgPSBbXSkpLnB1c2goaSwgZGlyZWN0aXZlRGVmLmFmdGVyVmlld0NoZWNrZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChkaXJlY3RpdmVEZWYub25EZXN0cm95ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICh0Vmlldy5kZXN0cm95SG9va3MgfHwgKHRWaWV3LmRlc3Ryb3lIb29rcyA9IFtdKSkucHVzaChpLCBkaXJlY3RpdmVEZWYub25EZXN0cm95KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRXhlY3V0aW5nIGhvb2tzIHJlcXVpcmVzIGNvbXBsZXggbG9naWMgYXMgd2UgbmVlZCB0byBkZWFsIHdpdGggMiBjb25zdHJhaW50cy4KICAgICAqCiAgICAgKiAxLiBJbml0IGhvb2tzIChuZ09uSW5pdCwgbmdBZnRlckNvbnRlbnRJbml0LCBuZ0FmdGVyVmlld0luaXQpIG11c3QgYWxsIGJlIGV4ZWN1dGVkIG9uY2UgYW5kIG9ubHkKICAgICAqIG9uY2UsIGFjcm9zcyBtYW55IGNoYW5nZSBkZXRlY3Rpb24gY3ljbGVzLiBUaGlzIG11c3QgYmUgdHJ1ZSBldmVuIGlmIHNvbWUgaG9va3MgdGhyb3csIG9yIGlmCiAgICAgKiBzb21lIHJlY3Vyc2l2ZWx5IHRyaWdnZXIgYSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLgogICAgICogVG8gc29sdmUgdGhhdCwgaXQgaXMgcmVxdWlyZWQgdG8gdHJhY2sgdGhlIHN0YXRlIG9mIHRoZSBleGVjdXRpb24gb2YgdGhlc2UgaW5pdCBob29rcy4KICAgICAqIFRoaXMgaXMgZG9uZSBieSBzdG9yaW5nIGFuZCBtYWludGFpbmluZyBmbGFncyBpbiB0aGUgdmlldzogdGhlIHtAbGluayBJbml0UGhhc2VTdGF0ZX0sCiAgICAgKiBhbmQgdGhlIGluZGV4IHdpdGhpbiB0aGF0IHBoYXNlLiBUaGV5IGNhbiBiZSBzZWVuIGFzIGEgY3Vyc29yIGluIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgogICAgICogW1tvbkluaXQxLCBvbkluaXQyXSwgW2FmdGVyQ29udGVudEluaXQxXSwgW2FmdGVyVmlld0luaXQxLCBhZnRlclZpZXdJbml0MiwgYWZ0ZXJWaWV3SW5pdDNdXQogICAgICogVGhleSBhcmUgYXJlIHN0b3JlZCBhcyBmbGFncyBpbiBMVmlld1tGTEFHU10uCiAgICAgKgogICAgICogMi4gUHJlLW9yZGVyIGhvb2tzIGNhbiBiZSBleGVjdXRlZCBpbiBiYXRjaGVzLCBiZWNhdXNlIG9mIHRoZSBzZWxlY3QgaW5zdHJ1Y3Rpb24uCiAgICAgKiBUbyBiZSBhYmxlIHRvIHBhdXNlIGFuZCByZXN1bWUgdGhlaXIgZXhlY3V0aW9uLCB3ZSBhbHNvIG5lZWQgc29tZSBzdGF0ZSBhYm91dCB0aGUgaG9vaydzIGFycmF5CiAgICAgKiB0aGF0IGlzIGJlaW5nIHByb2Nlc3NlZDoKICAgICAqIC0gdGhlIGluZGV4IG9mIHRoZSBuZXh0IGhvb2sgdG8gYmUgZXhlY3V0ZWQKICAgICAqIC0gdGhlIG51bWJlciBvZiBpbml0IGhvb2tzIGFscmVhZHkgZm91bmQgaW4gdGhlIHByb2Nlc3NlZCBwYXJ0IG9mIHRoZSAgYXJyYXkKICAgICAqIFRoZXkgYXJlIGFyZSBzdG9yZWQgYXMgZmxhZ3MgaW4gTFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10uCiAgICAgKi8KICAgIC8qKgogICAgICogRXhlY3V0ZXMgcHJlLW9yZGVyIGNoZWNrIGhvb2tzICggT25DaGFuZ2VzLCBEb0NoYW5nZXMpIGdpdmVuIGEgdmlldyB3aGVyZSBhbGwgdGhlIGluaXQgaG9va3Mgd2VyZQogICAgICogZXhlY3V0ZWQgb25jZS4gVGhpcyBpcyBhIGxpZ2h0IHZlcnNpb24gb2YgZXhlY3V0ZUluaXRBbmRDaGVja1ByZU9yZGVySG9va3Mgd2hlcmUgd2UgY2FuIHNraXAgcmVhZAogICAgICogLyB3cml0ZSBvZiB0aGUgaW5pdC1ob29rcyByZWxhdGVkIGZsYWdzLgogICAgICogQHBhcmFtIHs/fSBsVmlldyBUaGUgTFZpZXcgd2hlcmUgaG9va3MgYXJlIGRlZmluZWQKICAgICAqIEBwYXJhbSB7P30gaG9va3MgSG9va3MgdG8gYmUgcnVuCiAgICAgKiBAcGFyYW0gez89fSBub2RlSW5kZXggMyBjYXNlcyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlOgogICAgICogLSB1bmRlZmluZWQ6IGFsbCBob29rcyBmcm9tIHRoZSBhcnJheSBzaG91bGQgYmUgZXhlY3V0ZWQgKHBvc3Qtb3JkZXIgY2FzZSkKICAgICAqIC0gbnVsbDogZXhlY3V0ZSBob29rcyBvbmx5IGZyb20gdGhlIHNhdmVkIGluZGV4IHVudGlsIHRoZSBlbmQgb2YgdGhlIGFycmF5IChwcmUtb3JkZXIgY2FzZSwgd2hlbgogICAgICogZmx1c2hpbmcgdGhlIHJlbWFpbmluZyBob29rcykKICAgICAqIC0gbnVtYmVyOiBleGVjdXRlIGhvb2tzIG9ubHkgZnJvbSB0aGUgc2F2ZWQgaW5kZXggdW50aWwgdGhhdCBub2RlIGluZGV4IGV4Y2x1c2l2ZSAocHJlLW9yZGVyCiAgICAgKiBjYXNlLCB3aGVuIGV4ZWN1dGluZyBzZWxlY3QobnVtYmVyKSkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCBob29rcywgbm9kZUluZGV4KSB7CiAgICAgICAgY2FsbEhvb2tzKGxWaWV3LCBob29rcywgMyAvKiBJbml0UGhhc2VDb21wbGV0ZWQgKi8sIG5vZGVJbmRleCk7CiAgICB9CiAgICAvKioKICAgICAqIEV4ZWN1dGVzIHBvc3Qtb3JkZXIgaW5pdCBhbmQgY2hlY2sgaG9va3MgKG9uZSBvZiBBZnRlckNvbnRlbnRJbml0LCBBZnRlckNvbnRlbnRDaGVja2VkLAogICAgICogQWZ0ZXJWaWV3SW5pdCwgQWZ0ZXJWaWV3Q2hlY2tlZCkgZ2l2ZW4gYSB2aWV3IHdoZXJlIHRoZXJlIGFyZSBwZW5kaW5nIGluaXQgaG9va3MgdG8gYmUgZXhlY3V0ZWQuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB3aGVyZSBob29rcyBhcmUgZGVmaW5lZAogICAgICogQHBhcmFtIHs/fSBob29rcyBIb29rcyB0byBiZSBydW4KICAgICAqIEBwYXJhbSB7P30gaW5pdFBoYXNlIEEgcGhhc2UgZm9yIHdoaWNoIGhvb2tzIHNob3VsZCBiZSBydW4KICAgICAqIEBwYXJhbSB7Pz19IG5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWU6CiAgICAgKiAtIHVuZGVmaW5lZDogYWxsIGhvb2tzIGZyb20gdGhlIGFycmF5IHNob3VsZCBiZSBleGVjdXRlZCAocG9zdC1vcmRlciBjYXNlKQogICAgICogLSBudWxsOiBleGVjdXRlIGhvb2tzIG9ubHkgZnJvbSB0aGUgc2F2ZWQgaW5kZXggdW50aWwgdGhlIGVuZCBvZiB0aGUgYXJyYXkgKHByZS1vcmRlciBjYXNlLCB3aGVuCiAgICAgKiBmbHVzaGluZyB0aGUgcmVtYWluaW5nIGhvb2tzKQogICAgICogLSBudW1iZXI6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGF0IG5vZGUgaW5kZXggZXhjbHVzaXZlIChwcmUtb3JkZXIKICAgICAqIGNhc2UsIHdoZW4gZXhlY3V0aW5nIHNlbGVjdChudW1iZXIpKQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCBob29rcywgaW5pdFBoYXNlLCBub2RlSW5kZXgpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWwoaW5pdFBoYXNlLCAzIC8qIEluaXRQaGFzZUNvbXBsZXRlZCAqLywgJ0luaXQgcHJlLW9yZGVyIGhvb2tzIHNob3VsZCBub3QgYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlJyk7CiAgICAgICAgaWYgKChsVmlld1tGTEFHU10gJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IGluaXRQaGFzZSkgewogICAgICAgICAgICBjYWxsSG9va3MobFZpZXcsIGhvb2tzLCBpbml0UGhhc2UsIG5vZGVJbmRleCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGluaXRQaGFzZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW5jcmVtZW50SW5pdFBoYXNlRmxhZ3MobFZpZXcsIGluaXRQaGFzZSkgewogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnROb3RFcXVhbChpbml0UGhhc2UsIDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovLCAnSW5pdCBob29rcyBwaGFzZSBzaG91bGQgbm90IGJlIGluY3JlbWVudGVkIGFmdGVyIGFsbCBpbml0IGhvb2tzIGhhdmUgYmVlbiBydW4uJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmbGFncyA9IGxWaWV3W0ZMQUdTXTsKICAgICAgICBpZiAoKGZsYWdzICYgMyAvKiBJbml0UGhhc2VTdGF0ZU1hc2sgKi8pID09PSBpbml0UGhhc2UpIHsKICAgICAgICAgICAgZmxhZ3MgJj0gMjA0NyAvKiBJbmRleFdpdGhpbkluaXRQaGFzZVJlc2V0ICovOwogICAgICAgICAgICBmbGFncyArPSAxIC8qIEluaXRQaGFzZVN0YXRlSW5jcmVtZW50ZXIgKi87CiAgICAgICAgICAgIGxWaWV3W0ZMQUdTXSA9IGZsYWdzOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2FsbHMgbGlmZWN5Y2xlIGhvb2tzIHdpdGggdGhlaXIgY29udGV4dHMsIHNraXBwaW5nIGluaXQgaG9va3MgaWYgaXQncyBub3QKICAgICAqIHRoZSBmaXJzdCBMVmlldyBwYXNzCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmlldyBUaGUgY3VycmVudCB2aWV3CiAgICAgKiBAcGFyYW0gez99IGFyciBUaGUgYXJyYXkgaW4gd2hpY2ggdGhlIGhvb2tzIGFyZSBmb3VuZAogICAgICogQHBhcmFtIHs/fSBpbml0UGhhc2UKICAgICAqIEBwYXJhbSB7P30gY3VycmVudE5vZGVJbmRleCAzIGNhc2VzIGRlcGVuZGluZyBvbiB0aGUgdmFsdWU6CiAgICAgKiAtIHVuZGVmaW5lZDogYWxsIGhvb2tzIGZyb20gdGhlIGFycmF5IHNob3VsZCBiZSBleGVjdXRlZCAocG9zdC1vcmRlciBjYXNlKQogICAgICogLSBudWxsOiBleGVjdXRlIGhvb2tzIG9ubHkgZnJvbSB0aGUgc2F2ZWQgaW5kZXggdW50aWwgdGhlIGVuZCBvZiB0aGUgYXJyYXkgKHByZS1vcmRlciBjYXNlLCB3aGVuCiAgICAgKiBmbHVzaGluZyB0aGUgcmVtYWluaW5nIGhvb2tzKQogICAgICogLSBudW1iZXI6IGV4ZWN1dGUgaG9va3Mgb25seSBmcm9tIHRoZSBzYXZlZCBpbmRleCB1bnRpbCB0aGF0IG5vZGUgaW5kZXggZXhjbHVzaXZlIChwcmUtb3JkZXIKICAgICAqIGNhc2UsIHdoZW4gZXhlY3V0aW5nIHNlbGVjdChudW1iZXIpKQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2FsbEhvb2tzKGN1cnJlbnRWaWV3LCBhcnIsIGluaXRQaGFzZSwgY3VycmVudE5vZGVJbmRleCkgewogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnRFcXVhbChnZXRDaGVja05vQ2hhbmdlc01vZGUoKSwgZmFsc2UsICdIb29rcyBzaG91bGQgbmV2ZXIgYmUgcnVuIGluIHRoZSBjaGVjayBubyBjaGFuZ2VzIG1vZGUuJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBjdXJyZW50Tm9kZUluZGV4ICE9PSB1bmRlZmluZWQgPwogICAgICAgICAgICAoY3VycmVudFZpZXdbUFJFT1JERVJfSE9PS19GTEFHU10gJiA2NTUzNSAvKiBJbmRleE9mVGhlTmV4dFByZU9yZGVySG9va01hc2tNYXNrICovKSA6CiAgICAgICAgICAgIDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGVJbmRleExpbWl0ID0gY3VycmVudE5vZGVJbmRleCAhPSBudWxsID8gY3VycmVudE5vZGVJbmRleCA6IC0xOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbGFzdE5vZGVJbmRleEZvdW5kID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gc3RhcnRJbmRleDsgaSA8IGFyci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhvb2sgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXJyW2kgKyAxXSkpOwogICAgICAgICAgICBpZiAodHlwZW9mIGhvb2sgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBsYXN0Tm9kZUluZGV4Rm91bmQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXJyW2ldKSk7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudE5vZGVJbmRleCAhPSBudWxsICYmIGxhc3ROb2RlSW5kZXhGb3VuZCA+PSBjdXJyZW50Tm9kZUluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc0luaXRIb29rID0gYXJyW2ldIDwgMDsKICAgICAgICAgICAgICAgIGlmIChpc0luaXRIb29rKQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdICs9IDY1NTM2IC8qIE51bWJlck9mSW5pdEhvb2tzQ2FsbGVkSW5jcmVtZW50ZXIgKi87CiAgICAgICAgICAgICAgICBpZiAobGFzdE5vZGVJbmRleEZvdW5kIDwgbm9kZUluZGV4TGltaXQgfHwgbm9kZUluZGV4TGltaXQgPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdID0KICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRWaWV3W1BSRU9SREVSX0hPT0tfRkxBR1NdICYgNDI5NDkwMTc2MCAvKiBOdW1iZXJPZkluaXRIb29rc0NhbGxlZE1hc2sgKi8pICsgaSArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlIG9uZSBob29rIGFnYWluc3QgdGhlIGN1cnJlbnQgYExWaWV3YC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRWaWV3IFRoZSBjdXJyZW50IHZpZXcKICAgICAqIEBwYXJhbSB7P30gaW5pdFBoYXNlCiAgICAgKiBAcGFyYW0gez99IGFyciBUaGUgYXJyYXkgaW4gd2hpY2ggdGhlIGhvb2tzIGFyZSBmb3VuZAogICAgICogQHBhcmFtIHs/fSBpIFRoZSBjdXJyZW50IGluZGV4IHdpdGhpbiB0aGUgaG9vayBkYXRhIGFycmF5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjYWxsSG9vayhjdXJyZW50VmlldywgaW5pdFBoYXNlLCBhcnIsIGkpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNJbml0SG9vayA9IGFycltpXSA8IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhvb2sgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXJyW2kgKyAxXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVJbmRleCA9IGlzSW5pdEhvb2sgPyAtYXJyW2ldIDogKC8qKiBAdHlwZSB7P30gKi8gKGFycltpXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBjdXJyZW50Vmlld1tkaXJlY3RpdmVJbmRleF07CiAgICAgICAgaWYgKGlzSW5pdEhvb2spIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleFdpdGhpbnRJbml0UGhhc2UgPSBjdXJyZW50Vmlld1tGTEFHU10gPj4gMTEgLyogSW5kZXhXaXRoaW5Jbml0UGhhc2VTaGlmdCAqLzsKICAgICAgICAgICAgLy8gVGhlIGluaXQgcGhhc2Ugc3RhdGUgbXVzdCBiZSBhbHdheXMgY2hlY2tlZCBoZXJlIGFzIGl0IG1heSBoYXZlIGJlZW4gcmVjdXJzaXZlbHkKICAgICAgICAgICAgLy8gdXBkYXRlZAogICAgICAgICAgICBpZiAoaW5kZXhXaXRoaW50SW5pdFBoYXNlIDwKICAgICAgICAgICAgICAgIChjdXJyZW50Vmlld1tQUkVPUkRFUl9IT09LX0ZMQUdTXSA+PiAxNiAvKiBOdW1iZXJPZkluaXRIb29rc0NhbGxlZFNoaWZ0ICovKSAmJgogICAgICAgICAgICAgICAgKGN1cnJlbnRWaWV3W0ZMQUdTXSAmIDMgLyogSW5pdFBoYXNlU3RhdGVNYXNrICovKSA9PT0gaW5pdFBoYXNlKSB7CiAgICAgICAgICAgICAgICBjdXJyZW50Vmlld1tGTEFHU10gKz0gMjA0OCAvKiBJbmRleFdpdGhpbkluaXRQaGFzZUluY3JlbWVudGVyICovOwogICAgICAgICAgICAgICAgaG9vay5jYWxsKGRpcmVjdGl2ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGhvb2suY2FsbChkaXJlY3RpdmUpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW50ZXJmYWNlcy9pbmplY3Rvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUTk9ERSA9IDg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBQQVJFTlRfSU5KRUNUT1IgPSA4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSU5KRUNUT1JfQkxPT01fUEFSRU5UX1NJWkUgPSA5OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTk9fUEFSRU5UX0lOSkVDVE9SID0gKC8qKiBAdHlwZSB7P30gKi8gKC0xKSk7CiAgICAvKioKICAgICAqIEVhY2ggaW5qZWN0b3IgaXMgc2F2ZWQgaW4gOSBjb250aWd1b3VzIHNsb3RzIGluIGBMVmlld2AgYW5kIDkgY29udGlndW91cyBzbG90cyBpbgogICAgICogYFRWaWV3LmRhdGFgLiBUaGlzIGFsbG93cyB1cyB0byBzdG9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBub2RlJ3MgdG9rZW5zICh3aGljaAogICAgICogY2FuIGJlIHNoYXJlZCBpbiBgVFZpZXdgKSBhcyB3ZWxsIGFzIHRoZSB0b2tlbnMgb2YgaXRzIGFuY2VzdG9yIG5vZGVzICh3aGljaCBjYW5ub3QgYmUKICAgICAqIHNoYXJlZCwgc28gdGhleSBsaXZlIGluIGBMVmlld2ApLgogICAgICoKICAgICAqIEVhY2ggb2YgdGhlc2Ugc2xvdHMgKGFzaWRlIGZyb20gdGhlIGxhc3Qgc2xvdCkgY29udGFpbnMgYSBibG9vbSBmaWx0ZXIuIFRoaXMgYmxvb20gZmlsdGVyCiAgICAgKiBkZXRlcm1pbmVzIHdoZXRoZXIgYSBkaXJlY3RpdmUgaXMgYXZhaWxhYmxlIG9uIHRoZSBhc3NvY2lhdGVkIG5vZGUgb3Igbm90LiBUaGlzIHByZXZlbnRzIHVzCiAgICAgKiBmcm9tIHNlYXJjaGluZyB0aGUgZGlyZWN0aXZlcyBhcnJheSBhdCB0aGlzIGxldmVsIHVubGVzcyBpdCdzIHByb2JhYmxlIHRoZSBkaXJlY3RpdmUgaXMgaW4gaXQuCiAgICAgKgogICAgICogU2VlOiBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CbG9vbV9maWx0ZXIgZm9yIG1vcmUgYWJvdXQgYmxvb20gZmlsdGVycy4KICAgICAqCiAgICAgKiBCZWNhdXNlIGFsbCBpbmplY3RvcnMgaGF2ZSBiZWVuIGZsYXR0ZW5lZCBpbnRvIGBMVmlld2AgYW5kIGBUVmlld0RhdGFgLCB0aGV5IGNhbm5vdCB0eXBlZAogICAgICogdXNpbmcgaW50ZXJmYWNlcyBhcyB0aGV5IHdlcmUgcHJldmlvdXNseS4gVGhlIHN0YXJ0IGluZGV4IG9mIGVhY2ggYExJbmplY3RvcmAgYW5kIGBUSW5qZWN0b3JgCiAgICAgKiB3aWxsIGRpZmZlciBiYXNlZCBvbiB3aGVyZSBpdCBpcyBmbGF0dGVuZWQgaW50byB0aGUgbWFpbiBhcnJheSwgc28gaXQncyBub3QgcG9zc2libGUgdG8ga25vdwogICAgICogdGhlIGluZGljZXMgYWhlYWQgb2YgdGltZSBhbmQgc2F2ZSB0aGVpciB0eXBlcyBoZXJlLiBUaGUgaW50ZXJmYWNlcyBhcmUgc3RpbGwgaW5jbHVkZWQgaGVyZQogICAgICogZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZXMuCiAgICAgKgogICAgICogZXhwb3J0IGludGVyZmFjZSBMSW5qZWN0b3IgZXh0ZW5kcyBBcnJheTxhbnk+IHsKICAgICAqCiAgICAgKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDAtMzEgIChJRHMgYXJlICUgQkxPT01fU0laRSkKICAgICAqICAgIFswXTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMzItNjMKICAgICAqICAgIFsxXTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgNjQtOTUKICAgICAqICAgIFsyXTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgOTYtMTI3CiAgICAgKiAgICBbM106IG51bWJlcjsKICAgICAqCiAgICAgKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDEyOC0xNTkKICAgICAqICAgIFs0XTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIEN1bXVsYXRpdmUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTYwIC0gMTkxCiAgICAgKiAgICBbNV06IG51bWJlcjsKICAgICAqCiAgICAgKiAgICAvLyBDdW11bGF0aXZlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDE5MiAtIDIyMwogICAgICogICAgWzZdOiBudW1iZXI7CiAgICAgKgogICAgICogICAgLy8gQ3VtdWxhdGl2ZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAyMjQgLSAyNTUKICAgICAqICAgIFs3XTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIFdlIG5lZWQgdG8gc3RvcmUgYSByZWZlcmVuY2UgdG8gdGhlIGluamVjdG9yJ3MgcGFyZW50IHNvIERJIGNhbiBrZWVwIGxvb2tpbmcgdXAKICAgICAqICAgIC8vIHRoZSBpbmplY3RvciB0cmVlIHVudGlsIGl0IGZpbmRzIHRoZSBkZXBlbmRlbmN5IGl0J3MgbG9va2luZyBmb3IuCiAgICAgKiAgICBbUEFSRU5UX0lOSkVDVE9SXTogbnVtYmVyOwogICAgICogfQogICAgICoKICAgICAqIGV4cG9ydCBpbnRlcmZhY2UgVEluamVjdG9yIGV4dGVuZHMgQXJyYXk8YW55PiB7CiAgICAgKgogICAgICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMC0zMSAgKElEcyBhcmUgJSBCTE9PTV9TSVpFKQogICAgICogICAgWzBdOiBudW1iZXI7CiAgICAgKgogICAgICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMzItNjMKICAgICAqICAgIFsxXTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDY0LTk1CiAgICAgKiAgICBbMl06IG51bWJlcjsKICAgICAqCiAgICAgKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyA5Ni0xMjcKICAgICAqICAgIFszXTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDEyOC0xNTkKICAgICAqICAgIFs0XTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIFNoYXJlZCBub2RlIGJsb29tIGZvciBkaXJlY3RpdmUgSURzIDE2MCAtIDE5MQogICAgICogICAgWzVdOiBudW1iZXI7CiAgICAgKgogICAgICogICAgLy8gU2hhcmVkIG5vZGUgYmxvb20gZm9yIGRpcmVjdGl2ZSBJRHMgMTkyIC0gMjIzCiAgICAgKiAgICBbNl06IG51bWJlcjsKICAgICAqCiAgICAgKiAgICAvLyBTaGFyZWQgbm9kZSBibG9vbSBmb3IgZGlyZWN0aXZlIElEcyAyMjQgLSAyNTUKICAgICAqICAgIFs3XTogbnVtYmVyOwogICAgICoKICAgICAqICAgIC8vIE5lY2Vzc2FyeSB0byBmaW5kIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBhIHBhcnRpY3VsYXIgbm9kZS4KICAgICAqICAgIFtUTk9ERV06IFRFbGVtZW50Tm9kZXxURWxlbWVudENvbnRhaW5lck5vZGV8VENvbnRhaW5lck5vZGU7CiAgICAgKiAgfQogICAgICovCiAgICAvKioKICAgICAqIEZhY3RvcnkgZm9yIGNyZWF0aW5nIGluc3RhbmNlcyBvZiBpbmplY3RvcnMgaW4gdGhlIE5vZGVJbmplY3Rvci4KICAgICAqCiAgICAgKiBUaGlzIGZhY3RvcnkgaXMgY29tcGxpY2F0ZWQgYnkgdGhlIGZhY3QgdGhhdCBpdCBjYW4gcmVzb2x2ZSBgbXVsdGlgIGZhY3RvcmllcyBhcyB3ZWxsLgogICAgICoKICAgICAqIE5PVEU6IFNvbWUgb2YgdGhlIGZpZWxkcyBhcmUgb3B0aW9uYWwgd2hpY2ggbWVhbnMgdGhhdCB0aGlzIGNsYXNzIGhhcyB0d28gaGlkZGVuIGNsYXNzZXMuCiAgICAgKiAtIE9uZSB3aXRob3V0IGBtdWx0aWAgc3VwcG9ydCAobW9zdCBjb21tb24pCiAgICAgKiAtIE9uZSB3aXRoIGBtdWx0aWAgdmFsdWVzLCAocmFyZSkuCiAgICAgKgogICAgICogU2luY2UgVk1zIGNhbiBjYWNoZSB1cCB0byA0IGlubGluZSBoaWRkZW4gY2xhc3NlcyB0aGlzIGlzIE9LLgogICAgICoKICAgICAqIC0gU2luZ2xlIGZhY3Rvcnk6IE9ubHkgYHJlc29sdmluZ2AgYW5kIGBmYWN0b3J5YCBpcyBkZWZpbmVkLgogICAgICogLSBgcHJvdmlkZXJzYCBmYWN0b3J5OiBgY29tcG9uZW50UHJvdmlkZXJzYCBpcyBhIG51bWJlciBhbmQgYGluZGV4ID0gLTFgLgogICAgICogLSBgdmlld1Byb3ZpZGVyc2AgZmFjdG9yeTogYGNvbXBvbmVudFByb3ZpZGVyc2AgaXMgYSBudW1iZXIgYW5kIGBpbmRleGAgcG9pbnRzIHRvIGBwcm92aWRlcnNgLgogICAgICovCiAgICBjbGFzcyBOb2RlSW5qZWN0b3JGYWN0b3J5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAgICAgKiBAcGFyYW0gez99IGlzVmlld1Byb3ZpZGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RJbXBsZW1lbnRhdGlvbgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGZhY3RvcnksIAogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0byBgdHJ1ZWAgaWYgdGhlIHRva2VuIGlzIGRlY2xhcmVkIGluIGB2aWV3UHJvdmlkZXJzYCAob3IgaWYgaXQgaXMgY29tcG9uZW50KS4KICAgICAgICAgKi8KICAgICAgICBpc1ZpZXdQcm92aWRlciwgaW5qZWN0SW1wbGVtZW50YXRpb24pIHsKICAgICAgICAgICAgdGhpcy5mYWN0b3J5ID0gZmFjdG9yeTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1hcmtlciBzZXQgdG8gdHJ1ZSBkdXJpbmcgZmFjdG9yeSBpbnZvY2F0aW9uIHRvIHNlZSBpZiB3ZSBnZXQgaW50byByZWN1cnNpdmUgbG9vcC4KICAgICAgICAgICAgICogUmVjdXJzaXZlIGxvb3AgY2F1c2VzIGFuIGVycm9yIHRvIGJlIGRpc3BsYXllZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucmVzb2x2aW5nID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuY2FuU2VlVmlld1Byb3ZpZGVycyA9IGlzVmlld1Byb3ZpZGVyOwogICAgICAgICAgICB0aGlzLmluamVjdEltcGwgPSBpbmplY3RJbXBsZW1lbnRhdGlvbjsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0ZhY3Rvcnkob2JqKSB7CiAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE5vZGVJbmplY3RvckZhY3Rvcnk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL25vZGVfYXNzZXJ0LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnROb2RlVHlwZSh0Tm9kZSwgdHlwZSkgewogICAgICAgIGFzc2VydERlZmluZWQodE5vZGUsICdzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBUTm9kZScpOwogICAgICAgIGFzc2VydEVxdWFsKHROb2RlLnR5cGUsIHR5cGUsIGBzaG91bGQgYmUgYSAke3R5cGVOYW1lKHR5cGUpfWApOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gey4uLj99IHR5cGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAuLi50eXBlcykgewogICAgICAgIGFzc2VydERlZmluZWQodE5vZGUsICdzaG91bGQgYmUgY2FsbGVkIHdpdGggYSBUTm9kZScpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmb3VuZCA9IHR5cGVzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHlwZSA9PiB0Tm9kZS50eXBlID09PSB0eXBlKSk7CiAgICAgICAgYXNzZXJ0RXF1YWwoZm91bmQsIHRydWUsIGBTaG91bGQgYmUgb25lIG9mICR7dHlwZXMubWFwKHR5cGVOYW1lKS5qb2luKCcsICcpfSBidXQgZ290ICR7dHlwZU5hbWUodE5vZGUudHlwZSl9YCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdHlwZU5hbWUodHlwZSkgewogICAgICAgIGlmICh0eXBlID09IDEgLyogUHJvamVjdGlvbiAqLykKICAgICAgICAgICAgcmV0dXJuICdQcm9qZWN0aW9uJzsKICAgICAgICBpZiAodHlwZSA9PSAwIC8qIENvbnRhaW5lciAqLykKICAgICAgICAgICAgcmV0dXJuICdDb250YWluZXInOwogICAgICAgIGlmICh0eXBlID09IDUgLyogSWN1Q29udGFpbmVyICovKQogICAgICAgICAgICByZXR1cm4gJ0ljdUNvbnRhaW5lcic7CiAgICAgICAgaWYgKHR5cGUgPT0gMiAvKiBWaWV3ICovKQogICAgICAgICAgICByZXR1cm4gJ1ZpZXcnOwogICAgICAgIGlmICh0eXBlID09IDMgLyogRWxlbWVudCAqLykKICAgICAgICAgICAgcmV0dXJuICdFbGVtZW50JzsKICAgICAgICBpZiAodHlwZSA9PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8pCiAgICAgICAgICAgIHJldHVybiAnRWxlbWVudENvbnRhaW5lcic7CiAgICAgICAgcmV0dXJuICc8dW5rbm93bj4nOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2F0dHJzX3V0aWxzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQXNzaWducyBhbGwgYXR0cmlidXRlIHZhbHVlcyB0byB0aGUgcHJvdmlkZWQgZWxlbWVudCB2aWEgdGhlIGluZmVycmVkIHJlbmRlcmVyLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gYWNjZXB0cyB0d28gZm9ybXMgb2YgYXR0cmlidXRlIGVudHJpZXM6CiAgICAgKgogICAgICogZGVmYXVsdDogKGtleSwgdmFsdWUpOgogICAgICogIGF0dHJzID0gW2tleTEsIHZhbHVlMSwga2V5MiwgdmFsdWUyXQogICAgICoKICAgICAqIG5hbWVzcGFjZWQ6IChOQU1FU1BBQ0VfTUFSS0VSLCB1cmksIG5hbWUsIHZhbHVlKQogICAgICogIGF0dHJzID0gW05BTUVTUEFDRV9NQVJLRVIsIHVyaSwgbmFtZSwgdmFsdWUsIE5BTUVTUEFDRV9NQVJLRVIsIHVyaSwgbmFtZSwgdmFsdWVdCiAgICAgKgogICAgICogVGhlIGBhdHRyc2AgYXJyYXkgY2FuIGNvbnRhaW4gYSBtaXggb2YgYm90aCB0aGUgZGVmYXVsdCBhbmQgbmFtZXNwYWNlZCBlbnRyaWVzLgogICAgICogVGhlICJkZWZhdWx0IiB2YWx1ZXMgYXJlIHNldCB3aXRob3V0IGEgbWFya2VyLCBidXQgaWYgdGhlIGZ1bmN0aW9uIGNvbWVzIGFjcm9zcwogICAgICogYSBtYXJrZXIgdmFsdWUgdGhlbiBpdCB3aWxsIGF0dGVtcHQgdG8gc2V0IGEgbmFtZXNwYWNlZCB2YWx1ZS4gSWYgdGhlIG1hcmtlciBpcwogICAgICogbm90IG9mIGEgbmFtZXNwYWNlZCB2YWx1ZSB0aGVuIHRoZSBmdW5jdGlvbiB3aWxsIHF1aXQgYW5kIHJldHVybiB0aGUgaW5kZXggdmFsdWUKICAgICAqIHdoZXJlIGl0IHN0b3BwZWQgZHVyaW5nIHRoZSBpdGVyYXRpb24gb2YgdGhlIGF0dHJzIGFycmF5LgogICAgICoKICAgICAqIFNlZSBbQXR0cmlidXRlTWFya2VyXSB0byB1bmRlcnN0YW5kIHdoYXQgdGhlIG5hbWVzcGFjZSBtYXJrZXIgdmFsdWUgaXMuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gZG9lcyBub3Qgc3VwcG9ydCBhc3NpZ25pbmcgc3R5bGUgYW5kIGNsYXNzIHZhbHVlcyB0bwogICAgICogYW4gZWxlbWVudC4gU2VlIGBlbGVtZW50U3RhcnRgIGFuZCBgZWxlbWVudEhvc3RBdHRyc2AgdG8gbGVhcm4gaG93IHN0eWxpbmcgdmFsdWVzCiAgICAgKiBhcmUgYXBwbGllZCB0byBhbiBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlciBUaGUgcmVuZGVyZXIgdG8gYmUgdXNlZAogICAgICogQHBhcmFtIHs/fSBuYXRpdmUgVGhlIGVsZW1lbnQgdGhhdCB0aGUgYXR0cmlidXRlcyB3aWxsIGJlIGFzc2lnbmVkIHRvCiAgICAgKiBAcGFyYW0gez99IGF0dHJzIFRoZSBhdHRyaWJ1dGUgYXJyYXkgb2YgdmFsdWVzIHRoYXQgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgZWxlbWVudAogICAgICogQHJldHVybiB7P30gdGhlIGluZGV4IHZhbHVlIHRoYXQgd2FzIGxhc3QgYWNjZXNzZWQgaW4gdGhlIGF0dHJpYnV0ZXMgYXJyYXkKICAgICAqLwogICAgZnVuY3Rpb24gc2V0VXBBdHRyaWJ1dGVzKHJlbmRlcmVyLCBuYXRpdmUsIGF0dHJzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzUHJvYyA9IGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhdHRyc1tpXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIC8vIG9ubHkgbmFtZXNwYWNlcyBhcmUgc3VwcG9ydGVkLiBPdGhlciB2YWx1ZSB0eXBlcyAoc3VjaCBhcyBzdHlsZS9jbGFzcwogICAgICAgICAgICAgICAgLy8gZW50cmllcykgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gdGhpcyBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gMCAvKiBOYW1lc3BhY2VVUkkgKi8pIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHdlIGp1c3QgbGFuZGVkIG9uIHRoZSBtYXJrZXIgdmFsdWUgLi4uIHRoZXJlZm9yZQogICAgICAgICAgICAgICAgLy8gd2Ugc2hvdWxkIHNraXAgdG8gdGhlIG5leHQgZW50cnkKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZVVSSSA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1tpKytdKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1tpKytdKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyVmFsID0gKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJzW2krK10pKTsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRBdHRyaWJ1dGUrKzsKICAgICAgICAgICAgICAgIGlzUHJvYyA/CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5zZXRBdHRyaWJ1dGUobmF0aXZlLCBhdHRyTmFtZSwgYXR0clZhbCwgbmFtZXNwYWNlVVJJKSA6CiAgICAgICAgICAgICAgICAgICAgbmF0aXZlLnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZVVSSSwgYXR0ck5hbWUsIGF0dHJWYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gYXR0ck5hbWUgaXMgc3RyaW5nOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJWYWwgPSBhdHRyc1srK2ldOwogICAgICAgICAgICAgICAgLy8gU3RhbmRhcmQgYXR0cmlidXRlcwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldEF0dHJpYnV0ZSsrOwogICAgICAgICAgICAgICAgaWYgKGlzQW5pbWF0aW9uUHJvcChhdHRyTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNQcm9jKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0UHJvcGVydHkobmF0aXZlLCBhdHRyTmFtZSwgYXR0clZhbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaXNQcm9jID8KICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5zZXRBdHRyaWJ1dGUobmF0aXZlLCBhdHRyTmFtZSwgKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJWYWwpKSkgOgogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmUuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0clZhbCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBhbm90aGVyIHBpZWNlIG9mIGNvZGUgbWF5IGl0ZXJhdGUgb3ZlciB0aGUgc2FtZSBhdHRyaWJ1dGVzIGFycmF5LiBUaGVyZWZvcmUKICAgICAgICAvLyBpdCBtYXkgYmUgaGVscGZ1bCB0byByZXR1cm4gdGhlIGV4YWN0IHNwb3Qgd2hlcmUgdGhlIGF0dHJpYnV0ZXMgYXJyYXkgZXhpdGVkCiAgICAgICAgLy8gd2hldGhlciBieSBydW5uaW5nIGludG8gYW4gdW5zdXBwb3J0ZWQgbWFya2VyIG9yIGlmIGFsbCB0aGUgc3RhdGljIHZhbHVlcyB3ZXJlCiAgICAgICAgLy8gaXRlcmF0ZWQgb3Zlci4KICAgICAgICByZXR1cm4gaTsKICAgIH0KICAgIC8qKgogICAgICogVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIG1hcmtlciB0aGF0IGluZGljYXRlcyB0aGF0IHRoZSBmb2xsb3dpbmcKICAgICAqIGF0dHJpYnV0ZSB2YWx1ZXMgaW4gYSBgVEF0dHJpYnV0ZXNgIGFycmF5IGFyZSBvbmx5IHRoZSBuYW1lcyBvZiBhdHRyaWJ1dGVzLAogICAgICogYW5kIG5vdCBuYW1lLXZhbHVlIHBhaXJzLgogICAgICogQHBhcmFtIHs/fSBtYXJrZXIgVGhlIGF0dHJpYnV0ZSBtYXJrZXIgdG8gdGVzdC4KICAgICAqIEByZXR1cm4gez99IHRydWUgaWYgdGhlIG1hcmtlciBpcyBhICJuYW1lLW9ubHkiIG1hcmtlciAoZS5nLiBgQmluZGluZ3NgLCBgVGVtcGxhdGVgIG9yIGBJMThuYCkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobWFya2VyKSB7CiAgICAgICAgcmV0dXJuIG1hcmtlciA9PT0gMyAvKiBCaW5kaW5ncyAqLyB8fCBtYXJrZXIgPT09IDQgLyogVGVtcGxhdGUgKi8gfHwKICAgICAgICAgICAgbWFya2VyID09PSA2IC8qIEkxOG4gKi87CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNBbmltYXRpb25Qcm9wKG5hbWUpIHsKICAgICAgICAvLyBQZXJmIG5vdGU6IGFjY2Vzc2luZyBjaGFyQ29kZUF0IHRvIGNoZWNrIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIGEgc3RyaW5nIGlzIGZhc3RlciBhcwogICAgICAgIC8vIGNvbXBhcmVkIHRvIGFjY2Vzc2luZyBhIGNoYXJhY3RlciBhdCBpbmRleCAwIChleC4gbmFtZVswXSkuIFRoZSBtYWluIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0CiAgICAgICAgLy8gY2hhckNvZGVBdCBkb2Vzbid0IGFsbG9jYXRlIG1lbW9yeSB0byByZXR1cm4gYSBzdWJzdHJpbmcuCiAgICAgICAgcmV0dXJuIG5hbWUuY2hhckNvZGVBdCgwKSA9PT0gNjQgLyogQVRfU0lHTiAqLzsKICAgIH0KICAgIC8qKgogICAgICogTWVyZ2VzIGBzcmNgIGBUQXR0cmlidXRlc2AgaW50byBgZHN0YCBgVEF0dHJpYnV0ZXNgIHJlbW92aW5nIGFueSBkdXBsaWNhdGVzIGluIHRoZSBwcm9jZXNzLgogICAgICoKICAgICAqIFRoaXMgbWVyZ2UgZnVuY3Rpb24ga2VlcHMgdGhlIG9yZGVyIG9mIGF0dHJzIHNhbWUuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkc3QgTG9jYXRpb24gb2Ygd2hlcmUgdGhlIG1lcmdlZCBgVEF0dHJpYnV0ZXNgIHNob3VsZCBlbmQgdXAuCiAgICAgKiBAcGFyYW0gez99IHNyYyBgVEF0dHJpYnV0ZXNgIHdoaWNoIHNob3VsZCBiZSBhcHBlbmRlZCB0byBgZHN0YAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWVyZ2VIb3N0QXR0cnMoZHN0LCBzcmMpIHsKICAgICAgICBpZiAoc3JjID09PSBudWxsIHx8IHNyYy5sZW5ndGggPT09IDApIDsKICAgICAgICBlbHNlIGlmIChkc3QgPT09IG51bGwgfHwgZHN0Lmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAvLyBXZSBoYXZlIHNvdXJjZSwgYnV0IGRzdCBpcyBlbXB0eSwganVzdCBtYWtlIGEgY29weS4KICAgICAgICAgICAgZHN0ID0gc3JjLnNsaWNlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzcmNNYXJrZXIgPSAtMSAvKiBJbXBsaWNpdEF0dHJpYnV0ZXMgKi87CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3JjLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gc3JjW2ldOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgIHNyY01hcmtlciA9IGl0ZW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAoc3JjTWFya2VyID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgOwogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY01hcmtlciA9PT0gLTEgLyogSW1wbGljaXRBdHRyaWJ1dGVzICovIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHNyY01hcmtlciA9PT0gMiAvKiBTdHlsZXMgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGNvbnN1bWUgYGtleTFgIGFuZCBgdmFsdWVgIG9ubHkuCiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlSG9zdEF0dHJpYnV0ZShkc3QsIHNyY01hcmtlciwgKC8qKiBAdHlwZSB7P30gKi8gKGl0ZW0pKSwgbnVsbCwgKC8qKiBAdHlwZSB7P30gKi8gKHNyY1srK2ldKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZSB3aGVyZSB3ZSBoYXZlIHRvIGNvbnN1bWUgYGtleTFgIG9ubHkuCiAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlSG9zdEF0dHJpYnV0ZShkc3QsIHNyY01hcmtlciwgKC8qKiBAdHlwZSB7P30gKi8gKGl0ZW0pKSwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkc3Q7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZCBga2V5YC9gdmFsdWVgIHRvIGV4aXN0aW5nIGBUQXR0cmlidXRlc2AgdGFraW5nIHJlZ2lvbiBtYXJrZXIgYW5kIGR1cGxpY2F0ZXMgaW50byBhY2NvdW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZHN0IGBUQXR0cmlidXRlc2AgdG8gYXBwZW5kIHRvLgogICAgICogQHBhcmFtIHs/fSBtYXJrZXIgUmVnaW9uIHdoZXJlIHRoZSBga2V5YC9gdmFsdWVgIHNob3VsZCBiZSBhZGRlZC4KICAgICAqIEBwYXJhbSB7P30ga2V5MSBLZXkgdG8gYWRkIHRvIGBUQXR0cmlidXRlc2AKICAgICAqIEBwYXJhbSB7P30ga2V5MiBLZXkgdG8gYWRkIHRvIGBUQXR0cmlidXRlc2AgKGluIGNhc2Ugb2YgYEF0dHJpYnV0ZU1hcmtlci5OYW1lc3BhY2VVUklgKQogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBWYWx1ZSB0byBhZGQgb3IgdG8gb3ZlcndyaXRlIHRvIGBUQXR0cmlidXRlc2AgT25seSB1c2VkIGlmIGBtYXJrZXJgIGlzIG5vdCBDbGFzcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1lcmdlSG9zdEF0dHJpYnV0ZShkc3QsIG1hcmtlciwga2V5MSwga2V5MiwgdmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIC8vIEFzc3VtZSB0aGF0IG5ldyBtYXJrZXJzIHdpbGwgYmUgaW5zZXJ0ZWQgYXQgdGhlIGVuZC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1hcmtlckluc2VydFBvc2l0aW9uID0gZHN0Lmxlbmd0aDsKICAgICAgICAvLyBzY2FuIHVudGlsIGNvcnJlY3QgdHlwZS4KICAgICAgICBpZiAobWFya2VyID09PSAtMSAvKiBJbXBsaWNpdEF0dHJpYnV0ZXMgKi8pIHsKICAgICAgICAgICAgbWFya2VySW5zZXJ0UG9zaXRpb24gPSAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHdoaWxlIChpIDwgZHN0Lmxlbmd0aCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZHN0VmFsdWUgPSBkc3RbaSsrXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZHN0VmFsdWUgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRzdFZhbHVlID09PSBtYXJrZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFya2VySW5zZXJ0UG9zaXRpb24gPSAtMTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRzdFZhbHVlID4gbWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc2F2ZSB0aGlzIGFzIHdlIHdhbnQgdGhlIG1hcmtlcnMgdG8gYmUgaW5zZXJ0ZWQgaW4gc3BlY2lmaWMgb3JkZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG1hcmtlckluc2VydFBvc2l0aW9uID0gaSAtIDE7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBzZWFyY2ggdW50aWwgeW91IGZpbmQgcGxhY2Ugb2YgaW5zZXJ0aW9uCiAgICAgICAgd2hpbGUgKGkgPCBkc3QubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXRlbSA9IGRzdFtpXTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgLy8gc2luY2UgYGlgIHN0YXJ0ZWQgYXMgdGhlIGluZGV4IGFmdGVyIHRoZSBtYXJrZXIsIHdlIGRpZCBub3QgZmluZCBpdCBpZiB3ZSBhcmUgYXQgdGhlIG5leHQKICAgICAgICAgICAgICAgIC8vIG1hcmtlcgogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0ga2V5MSkgewogICAgICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHNhbWUgdG9rZW4KICAgICAgICAgICAgICAgIGlmIChrZXkyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRzdFtpICsgMV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoa2V5MiA9PT0gZHN0W2kgKyAxXSkgewogICAgICAgICAgICAgICAgICAgIGRzdFtpICsgMl0gPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW5jcmVtZW50IGNvdW50ZXIuCiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaWYgKGtleTIgIT09IG51bGwpCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gbnVsbCkKICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgLy8gaW5zZXJ0IGF0IGxvY2F0aW9uLgogICAgICAgIGlmIChtYXJrZXJJbnNlcnRQb3NpdGlvbiAhPT0gLTEpIHsKICAgICAgICAgICAgZHN0LnNwbGljZShtYXJrZXJJbnNlcnRQb3NpdGlvbiwgMCwgbWFya2VyKTsKICAgICAgICAgICAgaSA9IG1hcmtlckluc2VydFBvc2l0aW9uICsgMTsKICAgICAgICB9CiAgICAgICAgZHN0LnNwbGljZShpKyssIDAsIGtleTEpOwogICAgICAgIGlmIChrZXkyICE9PSBudWxsKSB7CiAgICAgICAgICAgIGRzdC5zcGxpY2UoaSsrLCAwLCBrZXkyKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGRzdC5zcGxpY2UoaSsrLCAwLCB2YWx1ZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2luamVjdG9yX3V0aWxzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vLyBQYXJlbnQgSW5qZWN0b3IgVXRpbHMgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50TG9jYXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc1BhcmVudEluamVjdG9yKHBhcmVudExvY2F0aW9uKSB7CiAgICAgICAgcmV0dXJuIHBhcmVudExvY2F0aW9uICE9PSBOT19QQVJFTlRfSU5KRUNUT1I7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFyZW50TG9jYXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9ySW5kZXgocGFyZW50TG9jYXRpb24pIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50TG9jYXRpb24pKSkpKSAmIDMyNzY3IC8qIEluamVjdG9ySW5kZXhNYXNrICovOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudExvY2F0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRJbmplY3RvclZpZXdPZmZzZXQocGFyZW50TG9jYXRpb24pIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50TG9jYXRpb24pKSkpKSA+PiAxNiAvKiBWaWV3T2Zmc2V0U2hpZnQgKi87CiAgICB9CiAgICAvKioKICAgICAqIFVud3JhcHMgYSBwYXJlbnQgaW5qZWN0b3IgbG9jYXRpb24gbnVtYmVyIHRvIGZpbmQgdGhlIHZpZXcgb2Zmc2V0IGZyb20gdGhlIGN1cnJlbnQgaW5qZWN0b3IsCiAgICAgKiB0aGVuIHdhbGtzIHVwIHRoZSBkZWNsYXJhdGlvbiB2aWV3IHRyZWUgdW50aWwgdGhlIHZpZXcgaXMgZm91bmQgdGhhdCBjb250YWlucyB0aGUgcGFyZW50CiAgICAgKiBpbmplY3Rvci4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uIFRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGluamVjdG9yLCB3aGljaCBjb250YWlucyB0aGUgdmlldyBvZmZzZXQKICAgICAqIEBwYXJhbSB7P30gc3RhcnRWaWV3IFRoZSBMVmlldyBpbnN0YW5jZSBmcm9tIHdoaWNoIHRvIHN0YXJ0IHdhbGtpbmcgdXAgdGhlIHZpZXcgdHJlZQogICAgICogQHJldHVybiB7P30gVGhlIExWaWV3IGluc3RhbmNlIHRoYXQgY29udGFpbnMgdGhlIHBhcmVudCBpbmplY3RvcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRJbmplY3RvclZpZXcobG9jYXRpb24sIHN0YXJ0VmlldykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmlld09mZnNldCA9IGdldFBhcmVudEluamVjdG9yVmlld09mZnNldChsb2NhdGlvbik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwYXJlbnRWaWV3ID0gc3RhcnRWaWV3OwogICAgICAgIC8vIEZvciBtb3N0IGNhc2VzLCB0aGUgcGFyZW50IGluamVjdG9yIGNhbiBiZSBmb3VuZCBvbiB0aGUgaG9zdCBub2RlIChlLmcuIGZvciBjb21wb25lbnQKICAgICAgICAvLyBvciBjb250YWluZXIpLCBidXQgd2UgbXVzdCBrZWVwIHRoZSBsb29wIGhlcmUgdG8gc3VwcG9ydCB0aGUgcmFyZXIgY2FzZSBvZiBkZWVwbHkgbmVzdGVkCiAgICAgICAgLy8gPG5nLXRlbXBsYXRlPiB0YWdzIG9yIGlubGluZSB2aWV3cywgd2hlcmUgdGhlIHBhcmVudCBpbmplY3RvciBtaWdodCBsaXZlIG1hbnkgdmlld3MKICAgICAgICAvLyBhYm92ZSB0aGUgY2hpbGQgaW5qZWN0b3IuCiAgICAgICAgd2hpbGUgKHZpZXdPZmZzZXQgPiAwKSB7CiAgICAgICAgICAgIHBhcmVudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50Vmlld1tERUNMQVJBVElPTl9WSUVXXSkpOwogICAgICAgICAgICB2aWV3T2Zmc2V0LS07CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnRWaWV3OwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL21pc2NfdXRpbHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBVc2VkIGZvciBzdHJpbmdpZnkgcmVuZGVyIG91dHB1dCBpbiBJdnkuCiAgICAgKiBJbXBvcnRhbnQhIFRoaXMgZnVuY3Rpb24gaXMgdmVyeSBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgYW5kIHdlIHNob3VsZAogICAgICogYmUgZXh0cmEgY2FyZWZ1bCBub3QgdG8gaW50cm9kdWNlIG1lZ2Ftb3JwaGljIHJlYWRzIGluIGl0LgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVuZGVyU3RyaW5naWZ5KHZhbHVlKSB7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpCiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIHJldHVybiAnJyArIHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBVc2VkIHRvIHN0cmluZ2lmeSBhIHZhbHVlIHNvIHRoYXQgaXQgY2FuIGJlIGRpc3BsYXllZCBpbiBhbiBlcnJvciBtZXNzYWdlLgogICAgICogSW1wb3J0YW50ISBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIGEgbWVnYW1vcnBoaWMgcmVhZCBhbmQgc2hvdWxkIG9ubHkgYmUKICAgICAqIHVzZWQgZm9yIGVycm9yIG1lc3NhZ2VzLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3RyaW5naWZ5Rm9yRXJyb3IodmFsdWUpIHsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKQogICAgICAgICAgICByZXR1cm4gdmFsdWUubmFtZSB8fCB2YWx1ZS50b1N0cmluZygpOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmIHZhbHVlICE9IG51bGwgJiYgdHlwZW9mIHZhbHVlLnR5cGUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnR5cGUubmFtZSB8fCB2YWx1ZS50eXBlLnRvU3RyaW5nKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZW5kZXJTdHJpbmdpZnkodmFsdWUpOwogICAgfQogICAgY29uc3QgybUwJDMgPSAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+ICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJyAmJgogICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSB8fCAvLyBicm93c2VyIG9ubHkKICAgICAgICBzZXRUaW1lb3V0IC8vIGV2ZXJ5dGhpbmcgZWxzZQogICAgKQogICAgICAgIC5iaW5kKF9nbG9iYWwpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVmYXVsdFNjaGVkdWxlciA9ICgoybUwJDMpKSgpOwogICAgLyoqCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVyZXNvbHZlV2luZG93KGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4geyBuYW1lOiAnd2luZG93JywgdGFyZ2V0OiBlbGVtZW50Lm93bmVyRG9jdW1lbnQuZGVmYXVsdFZpZXcgfTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cmVzb2x2ZURvY3VtZW50KGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4geyBuYW1lOiAnZG9jdW1lbnQnLCB0YXJnZXQ6IGVsZW1lbnQub3duZXJEb2N1bWVudCB9OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVyZXNvbHZlQm9keShlbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIHsgbmFtZTogJ2JvZHknLCB0YXJnZXQ6IGVsZW1lbnQub3duZXJEb2N1bWVudC5ib2R5IH07CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBzcGVjaWFsIGRlbGltaXRlciB3ZSB1c2UgdG8gc2VwYXJhdGUgcHJvcGVydHkgbmFtZXMsIHByZWZpeGVzLCBhbmQgc3VmZml4ZXMKICAgICAqIGluIHByb3BlcnR5IGJpbmRpbmcgbWV0YWRhdGEuIFNlZSBzdG9yZUJpbmRpbmdNZXRhZGF0YSgpLgogICAgICoKICAgICAqIFdlIGludGVudGlvbmFsbHkgdXNlIHRoZSBVbmljb2RlICJSRVBMQUNFTUVOVCBDSEFSQUNURVIiIChVK0ZGRkQpIGFzIGEgZGVsaW1pdGVyCiAgICAgKiBiZWNhdXNlIGl0IGlzIGEgdmVyeSB1bmNvbW1vbiBjaGFyYWN0ZXIgdGhhdCBpcyB1bmxpa2VseSB0byBiZSBwYXJ0IG9mIGEgdXNlcidzCiAgICAgKiBwcm9wZXJ0eSBuYW1lcyBvciBpbnRlcnBvbGF0aW9uIHN0cmluZ3MuIElmIGl0IGlzIGluIGZhY3QgdXNlZCBpbiBhIHByb3BlcnR5CiAgICAgKiBiaW5kaW5nLCBEZWJ1Z0VsZW1lbnQucHJvcGVydGllcyB3aWxsIG5vdCByZXR1cm4gdGhlIGNvcnJlY3QgdmFsdWUgZm9yIHRoYXQKICAgICAqIGJpbmRpbmcuIEhvd2V2ZXIsIHRoZXJlIHNob3VsZCBiZSBubyBydW50aW1lIGVmZmVjdCBmb3IgcmVhbCBhcHBsaWNhdGlvbnMuCiAgICAgKgogICAgICogVGhpcyBjaGFyYWN0ZXIgaXMgdHlwaWNhbGx5IHJlbmRlcmVkIGFzIGEgcXVlc3Rpb24gbWFyayBpbnNpZGUgb2YgYSBkaWFtb25kLgogICAgICogU2VlIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1NwZWNpYWxzXyhVbmljb2RlX2Jsb2NrKQogICAgICoKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiA9IGDvv71gOwogICAgLyoqCiAgICAgKiBVbndyYXAgYSB2YWx1ZSB3aGljaCBtaWdodCBiZSBiZWhpbmQgYSBjbG9zdXJlIChmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbiByZWFzb25zKS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXliZVVud3JhcEZuKHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlKCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9kaS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIERlZmluZXMgaWYgdGhlIGNhbGwgdG8gYGluamVjdGAgc2hvdWxkIGluY2x1ZGUgYHZpZXdQcm92aWRlcnNgIGluIGl0cyByZXNvbHV0aW9uLgogICAgICoKICAgICAqIFRoaXMgaXMgc2V0IHRvIHRydWUgd2hlbiB3ZSB0cnkgdG8gaW5zdGFudGlhdGUgYSBjb21wb25lbnQuIFRoaXMgdmFsdWUgaXMgcmVzZXQgaW4KICAgICAqIGBnZXROb2RlSW5qZWN0YWJsZWAgdG8gYSB2YWx1ZSB3aGljaCBtYXRjaGVzIHRoZSBkZWNsYXJhdGlvbiBsb2NhdGlvbiBvZiB0aGUgdG9rZW4gYWJvdXQgdG8gYmUKICAgICAqIGluc3RhbnRpYXRlZC4gVGhpcyBpcyBkb25lIHNvIHRoYXQgaWYgd2UgYXJlIGluamVjdGluZyBhIHRva2VuIHdoaWNoIHdhcyBkZWNsYXJlZCBvdXRzaWRlIG9mCiAgICAgKiBgdmlld1Byb3ZpZGVyc2Agd2UgZG9uJ3QgYWNjaWRlbnRhbGx5IHB1bGwgYHZpZXdQcm92aWRlcnNgIGluLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBcQEluamVjdGFibGUoKQogICAgICogY2xhc3MgTXlTZXJ2aWNlIHsKICAgICAqICAgY29uc3RydWN0b3IocHVibGljIHZhbHVlOiBTdHJpbmcpIHt9CiAgICAgKiB9CiAgICAgKgogICAgICogXEBDb21wb25lbnQoewogICAgICogICBwcm92aWRlcnM6IFsKICAgICAqICAgICBNeVNlcnZpY2UsCiAgICAgKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICdwcm92aWRlcnMnIH0KICAgICAqICAgXQogICAgICogICB2aWV3UHJvdmlkZXJzOiBbCiAgICAgKiAgICAge3Byb3ZpZGU6IFN0cmluZywgdmFsdWU6ICd2aWV3UHJvdmlkZXJzJ30KICAgICAqICAgXQogICAgICogfSkKICAgICAqIGNsYXNzIE15Q29tcG9uZW50IHsKICAgICAqICAgY29uc3RydWN0b3IobXlTZXJ2aWNlOiBNeVNlcnZpY2UsIHZhbHVlOiBTdHJpbmcpIHsKICAgICAqICAgICAvLyBXZSBleHBlY3QgdGhhdCBDb21wb25lbnQgY2FuIHNlZSBpbnRvIGB2aWV3UHJvdmlkZXJzYC4KICAgICAqICAgICBleHBlY3QodmFsdWUpLnRvRXF1YWwoJ3ZpZXdQcm92aWRlcnMnKTsKICAgICAqICAgICAvLyBgTXlTZXJ2aWNlYCB3YXMgbm90IGRlY2xhcmVkIGluIGB2aWV3UHJvdmlkZXJzYCBoZW5jZSBpdCBjYW4ndCBzZWUgaXQuCiAgICAgKiAgICAgZXhwZWN0KG15U2VydmljZS52YWx1ZSkudG9FcXVhbCgncHJvdmlkZXJzJyk7CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqCiAgICAgKiBgYGAKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBsZXQgaW5jbHVkZVZpZXdQcm92aWRlcnMgPSB0cnVlOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEluY2x1ZGVWaWV3UHJvdmlkZXJzKHYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBpbmNsdWRlVmlld1Byb3ZpZGVyczsKICAgICAgICBpbmNsdWRlVmlld1Byb3ZpZGVycyA9IHY7CiAgICAgICAgcmV0dXJuIG9sZFZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgbnVtYmVyIG9mIHNsb3RzIGluIGVhY2ggYmxvb20gZmlsdGVyICh1c2VkIGJ5IERJKS4gVGhlIGxhcmdlciB0aGlzIG51bWJlciwgdGhlIGZld2VyCiAgICAgKiBkaXJlY3RpdmVzIHRoYXQgd2lsbCBzaGFyZSBzbG90cywgYW5kIHRodXMsIHRoZSBmZXdlciBmYWxzZSBwb3NpdGl2ZXMgd2hlbiBjaGVja2luZyBmb3IKICAgICAqIHRoZSBleGlzdGVuY2Ugb2YgYSBkaXJlY3RpdmUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQkxPT01fU0laRSA9IDI1NjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEJMT09NX01BU0sgPSBCTE9PTV9TSVpFIC0gMTsKICAgIC8qKgogICAgICogQ291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgZm9yIGRpcmVjdGl2ZXMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgbGV0IG5leHROZ0VsZW1lbnRJZCA9IDA7CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyB0aGlzIGRpcmVjdGl2ZSBhcyBwcmVzZW50IGluIGl0cyBub2RlJ3MgaW5qZWN0b3IgYnkgZmxpcHBpbmcgdGhlIGRpcmVjdGl2ZSdzCiAgICAgKiBjb3JyZXNwb25kaW5nIGJpdCBpbiB0aGUgaW5qZWN0b3IncyBibG9vbSBmaWx0ZXIuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvckluZGV4IFRoZSBpbmRleCBvZiB0aGUgbm9kZSBpbmplY3RvciB3aGVyZSB0aGlzIHRva2VuIHNob3VsZCBiZSByZWdpc3RlcmVkCiAgICAgKiBAcGFyYW0gez99IHRWaWV3IFRoZSBUVmlldyBmb3IgdGhlIGluamVjdG9yJ3MgYmxvb20gZmlsdGVycwogICAgICogQHBhcmFtIHs/fSB0eXBlIFRoZSBkaXJlY3RpdmUgdG9rZW4gdG8gcmVnaXN0ZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGJsb29tQWRkKGluamVjdG9ySW5kZXgsIHRWaWV3LCB0eXBlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcywgdHJ1ZSwgJ2V4cGVjdGVkIGZpcnN0Q3JlYXRlUGFzcyB0byBiZSB0cnVlJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpZCA9IHR5cGVvZiB0eXBlICE9PSAnc3RyaW5nJyA/ICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpKVtOR19FTEVNRU5UX0lEXSA6IHR5cGUuY2hhckNvZGVBdCgwKSB8fCAwOwogICAgICAgIC8vIFNldCBhIHVuaXF1ZSBJRCBvbiB0aGUgZGlyZWN0aXZlIHR5cGUsIHNvIGlmIHNvbWV0aGluZyB0cmllcyB0byBpbmplY3QgdGhlIGRpcmVjdGl2ZSwKICAgICAgICAvLyB3ZSBjYW4gZWFzaWx5IHJldHJpZXZlIHRoZSBJRCBhbmQgaGFzaCBpdCBpbnRvIHRoZSBibG9vbSBiaXQgdGhhdCBzaG91bGQgYmUgY2hlY2tlZC4KICAgICAgICBpZiAoaWQgPT0gbnVsbCkgewogICAgICAgICAgICBpZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpKVtOR19FTEVNRU5UX0lEXSA9IG5leHROZ0VsZW1lbnRJZCsrOwogICAgICAgIH0KICAgICAgICAvLyBXZSBvbmx5IGhhdmUgQkxPT01fU0laRSAoMjU2KSBzbG90cyBpbiBvdXIgYmxvb20gZmlsdGVyICg4IGJ1Y2tldHMgKiAzMiBiaXRzIGVhY2gpLAogICAgICAgIC8vIHNvIGFsbCB1bmlxdWUgSURzIG11c3QgYmUgbW9kdWxvLWVkIGludG8gYSBudW1iZXIgZnJvbSAwIC0gMjU1IHRvIGZpdCBpbnRvIHRoZSBmaWx0ZXIuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJsb29tQml0ID0gaWQgJiBCTE9PTV9NQVNLOwogICAgICAgIC8vIENyZWF0ZSBhIG1hc2sgdGhhdCB0YXJnZXRzIHRoZSBzcGVjaWZpYyBiaXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXJlY3RpdmUuCiAgICAgICAgLy8gSlMgYml0IG9wZXJhdGlvbnMgYXJlIDMyIGJpdHMsIHNvIHRoaXMgd2lsbCBiZSBhIG51bWJlciBiZXR3ZWVuIDJeMCBhbmQgMl4zMSwgY29ycmVzcG9uZGluZwogICAgICAgIC8vIHRvIGJpdCBwb3NpdGlvbnMgMCAtIDMxIGluIGEgMzIgYml0IGludGVnZXIuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hc2sgPSAxIDw8IGJsb29tQml0OwogICAgICAgIC8vIFVzZSB0aGUgcmF3IGJsb29tQml0IG51bWJlciB0byBkZXRlcm1pbmUgd2hpY2ggYmxvb20gZmlsdGVyIGJ1Y2tldCB3ZSBzaG91bGQgY2hlY2sKICAgICAgICAvLyBlLmc6IGJmMCA9IFswIC0gMzFdLCBiZjEgPSBbMzIgLSA2M10sIGJmMiA9IFs2NCAtIDk1XSwgYmYzID0gWzk2IC0gMTI3XSwgZXRjCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGI3ID0gYmxvb21CaXQgJiAweDgwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiNiA9IGJsb29tQml0ICYgMHg0MDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYjUgPSBibG9vbUJpdCAmIDB4MjA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHREYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGEpKTsKICAgICAgICBpZiAoYjcpIHsKICAgICAgICAgICAgYjYgPyAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDddIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyA2XSB8PSBtYXNrKSkgOgogICAgICAgICAgICAgICAgKGI1ID8gKHREYXRhW2luamVjdG9ySW5kZXggKyA1XSB8PSBtYXNrKSA6ICh0RGF0YVtpbmplY3RvckluZGV4ICsgNF0gfD0gbWFzaykpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgYjYgPyAoYjUgPyAodERhdGFbaW5qZWN0b3JJbmRleCArIDNdIHw9IG1hc2spIDogKHREYXRhW2luamVjdG9ySW5kZXggKyAyXSB8PSBtYXNrKSkgOgogICAgICAgICAgICAgICAgKGI1ID8gKHREYXRhW2luamVjdG9ySW5kZXggKyAxXSB8PSBtYXNrKSA6ICh0RGF0YVtpbmplY3RvckluZGV4XSB8PSBtYXNrKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIChvciBnZXRzIGFuIGV4aXN0aW5nKSBpbmplY3RvciBmb3IgYSBnaXZlbiBlbGVtZW50IG9yIGNvbnRhaW5lci4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHROb2RlIGZvciB3aGljaCBhbiBpbmplY3RvciBzaG91bGQgYmUgcmV0cmlldmVkIC8gY3JlYXRlZC4KICAgICAqIEBwYXJhbSB7P30gaG9zdFZpZXcgVmlldyB3aGVyZSB0aGUgbm9kZSBpcyBzdG9yZWQKICAgICAqIEByZXR1cm4gez99IE5vZGUgaW5qZWN0b3IKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCBob3N0VmlldykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleGlzdGluZ0luamVjdG9ySW5kZXggPSBnZXRJbmplY3RvckluZGV4KHROb2RlLCBob3N0Vmlldyk7CiAgICAgICAgaWYgKGV4aXN0aW5nSW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIGV4aXN0aW5nSW5qZWN0b3JJbmRleDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gaG9zdFZpZXdbVFZJRVddOwogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgdE5vZGUuaW5qZWN0b3JJbmRleCA9IGhvc3RWaWV3Lmxlbmd0aDsKICAgICAgICAgICAgaW5zZXJ0Qmxvb20odFZpZXcuZGF0YSwgdE5vZGUpOyAvLyBmb3VuZGF0aW9uIGZvciBub2RlIGJsb29tCiAgICAgICAgICAgIGluc2VydEJsb29tKGhvc3RWaWV3LCBudWxsKTsgLy8gZm91bmRhdGlvbiBmb3IgY3VtdWxhdGl2ZSBibG9vbQogICAgICAgICAgICBpbnNlcnRCbG9vbSh0Vmlldy5ibHVlcHJpbnQsIG51bGwpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50TG9jID0gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0Tm9kZSwgaG9zdFZpZXcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmplY3RvckluZGV4ID0gdE5vZGUuaW5qZWN0b3JJbmRleDsKICAgICAgICAvLyBJZiBhIHBhcmVudCBpbmplY3RvciBjYW4ndCBiZSBmb3VuZCwgaXRzIGxvY2F0aW9uIGlzIHNldCB0byAtMS4KICAgICAgICAvLyBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IG5lZWQgdG8gc2V0IHVwIGEgY3VtdWxhdGl2ZSBibG9vbQogICAgICAgIGlmIChoYXNQYXJlbnRJbmplY3RvcihwYXJlbnRMb2MpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50SW5kZXggPSBnZXRQYXJlbnRJbmplY3RvckluZGV4KHBhcmVudExvYyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50TFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jLCBob3N0Vmlldyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50RGF0YSA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRMVmlld1tUVklFV10uZGF0YSkpOwogICAgICAgICAgICAvLyBDcmVhdGVzIGEgY3VtdWxhdGl2ZSBibG9vbSBmaWx0ZXIgdGhhdCBtZXJnZXMgdGhlIHBhcmVudCdzIGJsb29tIGZpbHRlcgogICAgICAgICAgICAvLyBhbmQgaXRzIG93biBjdW11bGF0aXZlIGJsb29tICh3aGljaCBjb250YWlucyB0b2tlbnMgZm9yIGFsbCBhbmNlc3RvcnMpCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgODsgaSsrKSB7CiAgICAgICAgICAgICAgICBob3N0Vmlld1tpbmplY3RvckluZGV4ICsgaV0gPSBwYXJlbnRMVmlld1twYXJlbnRJbmRleCArIGldIHwgcGFyZW50RGF0YVtwYXJlbnRJbmRleCArIGldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhvc3RWaWV3W2luamVjdG9ySW5kZXggKyBQQVJFTlRfSU5KRUNUT1JdID0gcGFyZW50TG9jOwogICAgICAgIHJldHVybiBpbmplY3RvckluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFycgogICAgICogQHBhcmFtIHs/fSBmb290ZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluc2VydEJsb29tKGFyciwgZm9vdGVyKSB7CiAgICAgICAgYXJyLnB1c2goMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgZm9vdGVyKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBob3N0VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SW5qZWN0b3JJbmRleCh0Tm9kZSwgaG9zdFZpZXcpIHsKICAgICAgICBpZiAodE5vZGUuaW5qZWN0b3JJbmRleCA9PT0gLTEgfHwKICAgICAgICAgICAgLy8gSWYgdGhlIGluamVjdG9yIGluZGV4IGlzIHRoZSBzYW1lIGFzIGl0cyBwYXJlbnQncyBpbmplY3RvciBpbmRleCwgdGhlbiB0aGUgaW5kZXggaGFzIGJlZW4KICAgICAgICAgICAgLy8gY29waWVkIGRvd24gZnJvbSB0aGUgcGFyZW50IG5vZGUuIE5vIGluamVjdG9yIGhhcyBiZWVuIGNyZWF0ZWQgeWV0IG9uIHRoaXMgbm9kZS4KICAgICAgICAgICAgKHROb2RlLnBhcmVudCAmJiB0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCA9PT0gdE5vZGUuaW5qZWN0b3JJbmRleCkgfHwKICAgICAgICAgICAgLy8gQWZ0ZXIgdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MsIHRoZSBpbmplY3RvciBpbmRleCBtaWdodCBleGlzdCBidXQgdGhlIHBhcmVudCB2YWx1ZXMKICAgICAgICAgICAgLy8gbWlnaHQgbm90IGhhdmUgYmVlbiBjYWxjdWxhdGVkIHlldCBmb3IgdGhpcyBpbnN0YW5jZQogICAgICAgICAgICBob3N0Vmlld1t0Tm9kZS5pbmplY3RvckluZGV4ICsgUEFSRU5UX0lOSkVDVE9SXSA9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB0Tm9kZS5pbmplY3RvckluZGV4OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRmluZHMgdGhlIGluZGV4IG9mIHRoZSBwYXJlbnQgaW5qZWN0b3IsIHdpdGggYSB2aWV3IG9mZnNldCBpZiBhcHBsaWNhYmxlLiBVc2VkIHRvIHNldCB0aGUKICAgICAqIHBhcmVudCBpbmplY3RvciBpbml0aWFsbHkuCiAgICAgKgogICAgICogUmV0dXJucyBhIGNvbWJpbmF0aW9uIG9mIG51bWJlciBvZiBgVmlld0RhdGFgIHdlIGhhdmUgdG8gZ28gdXAgYW5kIGluZGV4IGluIHRoYXQgYFZpZXdkYXRhYAogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRJbmplY3RvckxvY2F0aW9uKHROb2RlLCB2aWV3KSB7CiAgICAgICAgaWYgKHROb2RlLnBhcmVudCAmJiB0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCkpOyAvLyBWaWV3T2Zmc2V0IGlzIDAKICAgICAgICB9CiAgICAgICAgLy8gRm9yIG1vc3QgY2FzZXMsIHRoZSBwYXJlbnQgaW5qZWN0b3IgaW5kZXggY2FuIGJlIGZvdW5kIG9uIHRoZSBob3N0IG5vZGUgKGUuZy4gZm9yIGNvbXBvbmVudAogICAgICAgIC8vIG9yIGNvbnRhaW5lciksIHNvIHRoaXMgbG9vcCB3aWxsIGJlIHNraXBwZWQsIGJ1dCB3ZSBtdXN0IGtlZXAgdGhlIGxvb3AgaGVyZSB0byBzdXBwb3J0CiAgICAgICAgLy8gdGhlIHJhcmVyIGNhc2Ugb2YgZGVlcGx5IG5lc3RlZCA8bmctdGVtcGxhdGU+IHRhZ3Mgb3IgaW5saW5lIHZpZXdzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaG9zdFROb2RlID0gdmlld1tUX0hPU1RdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmlld09mZnNldCA9IDE7CiAgICAgICAgd2hpbGUgKGhvc3RUTm9kZSAmJiBob3N0VE5vZGUuaW5qZWN0b3JJbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh2aWV3W0RFQ0xBUkFUSU9OX1ZJRVddKSk7CiAgICAgICAgICAgIGhvc3RUTm9kZSA9IHZpZXcgPyB2aWV3W1RfSE9TVF0gOiBudWxsOwogICAgICAgICAgICB2aWV3T2Zmc2V0Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBob3N0VE5vZGUgPwogICAgICAgICAgICBob3N0VE5vZGUuaW5qZWN0b3JJbmRleCB8ICh2aWV3T2Zmc2V0IDw8IDE2IC8qIFZpZXdPZmZzZXRTaGlmdCAqLykgOgogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoLTEpKTsKICAgIH0KICAgIC8qKgogICAgICogTWFrZXMgYSB0eXBlIG9yIGFuIGluamVjdGlvbiB0b2tlbiBwdWJsaWMgdG8gdGhlIERJIHN5c3RlbSBieSBhZGRpbmcgaXQgdG8gYW4KICAgICAqIGluamVjdG9yJ3MgYmxvb20gZmlsdGVyLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JJbmRleAogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0b2tlbiBUaGUgdHlwZSBvciB0aGUgaW5qZWN0aW9uIHRva2VuIHRvIGJlIG1hZGUgcHVibGljCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBkaVB1YmxpY0luSW5qZWN0b3IoaW5qZWN0b3JJbmRleCwgdFZpZXcsIHRva2VuKSB7CiAgICAgICAgYmxvb21BZGQoaW5qZWN0b3JJbmRleCwgdFZpZXcsIHRva2VuKTsKICAgIH0KICAgIC8qKgogICAgICogSW5qZWN0IHN0YXRpYyBhdHRyaWJ1dGUgdmFsdWUgaW50byBkaXJlY3RpdmUgY29uc3RydWN0b3IuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB3aXRoIGBmYWN0b3J5YCBmdW5jdGlvbnMgd2hpY2ggYXJlIGdlbmVyYXRlZCBhcyBwYXJ0IG9mCiAgICAgKiBgZGVmaW5lRGlyZWN0aXZlYCBvciBgZGVmaW5lQ29tcG9uZW50YC4gVGhlIG1ldGhvZCByZXRyaWV2ZXMgdGhlIHN0YXRpYyB2YWx1ZQogICAgICogb2YgYW4gYXR0cmlidXRlLiAoRHluYW1pYyBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkIHNpbmNlIHRoZXkgYXJlIG5vdCByZXNvbHZlZAogICAgICogIGF0IHRoZSB0aW1lIG9mIGluamVjdGlvbiBhbmQgY2FuIGNoYW5nZSBvdmVyIHRpbWUuKQogICAgICoKICAgICAqICMgRXhhbXBsZQogICAgICogR2l2ZW46CiAgICAgKiBgYGAKICAgICAqIFxAQ29tcG9uZW50KC4uLikKICAgICAqIGNsYXNzIE15Q29tcG9uZW50IHsKICAgICAqICAgY29uc3RydWN0b3IoXEBBdHRyaWJ1dGUoJ3RpdGxlJykgdGl0bGU6IHN0cmluZykgeyAuLi4gfQogICAgICogfQogICAgICogYGBgCiAgICAgKiBXaGVuIGluc3RhbnRpYXRlZCB3aXRoCiAgICAgKiBgYGAKICAgICAqIDxteS1jb21wb25lbnQgdGl0bGU9IkhlbGxvIj48L215LWNvbXBvbmVudD4KICAgICAqIGBgYAogICAgICoKICAgICAqIFRoZW4gZmFjdG9yeSBtZXRob2QgZ2VuZXJhdGVkIGlzOgogICAgICogYGBgCiAgICAgKiBNeUNvbXBvbmVudC7JtWNtcCA9IGRlZmluZUNvbXBvbmVudCh7CiAgICAgKiAgIGZhY3Rvcnk6ICgpID0+IG5ldyBNeUNvbXBvbmVudChpbmplY3RBdHRyaWJ1dGUoJ3RpdGxlJykpCiAgICAgKiAgIC4uLgogICAgICogfSkKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lVG9JbmplY3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdEF0dHJpYnV0ZUltcGwodE5vZGUsIGF0dHJOYW1lVG9JbmplY3QpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMCAvKiBDb250YWluZXIgKi8sIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0Tm9kZSwgJ2V4cGVjdGluZyB0Tm9kZScpOwogICAgICAgIGlmIChhdHRyTmFtZVRvSW5qZWN0ID09PSAnY2xhc3MnKSB7CiAgICAgICAgICAgIHJldHVybiB0Tm9kZS5jbGFzc2VzOwogICAgICAgIH0KICAgICAgICBpZiAoYXR0ck5hbWVUb0luamVjdCA9PT0gJ3N0eWxlJykgewogICAgICAgICAgICByZXR1cm4gdE5vZGUuc3R5bGVzOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0cnMgPSB0Tm9kZS5hdHRyczsKICAgICAgICBpZiAoYXR0cnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyc0xlbmd0aCA9IGF0dHJzLmxlbmd0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgICAgIHdoaWxlIChpIDwgYXR0cnNMZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gYXR0cnNbaV07CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoaXQgYSBgQmluZGluZ3NgIG9yIGBUZW1wbGF0ZWAgbWFya2VyIHRoZW4gd2UgYXJlIGRvbmUuCiAgICAgICAgICAgICAgICBpZiAoaXNOYW1lT25seUF0dHJpYnV0ZU1hcmtlcih2YWx1ZSkpCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAvLyBTa2lwIG5hbWVzcGFjZWQgYXR0cmlidXRlcwogICAgICAgICAgICAgICAgaWYgKHZhbHVlID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgewogICAgICAgICAgICAgICAgICAgIC8vIHdlIHNraXAgdGhlIG5leHQgdHdvIHZhbHVlcwogICAgICAgICAgICAgICAgICAgIC8vIGFzIG5hbWVzcGFjZWQgYXR0cmlidXRlcyBsb29rcyBsaWtlCiAgICAgICAgICAgICAgICAgICAgLy8gWy4uLiwgQXR0cmlidXRlTWFya2VyLk5hbWVzcGFjZVVSSSwgJ2h0dHA6Ly9zb21ldXJpLmNvbS90ZXN0JywgJ3Rlc3Q6ZXhpc3QnLAogICAgICAgICAgICAgICAgICAgIC8vICdleGlzdFZhbHVlJywgLi4uXQogICAgICAgICAgICAgICAgICAgIGkgPSBpICsgMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRvIHRoZSBmaXJzdCB2YWx1ZSBvZiB0aGUgbWFya2VkIGF0dHJpYnV0ZS4KICAgICAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBhdHRyc0xlbmd0aCAmJiB0eXBlb2YgYXR0cnNbaV0gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gYXR0ck5hbWVUb0luamVjdCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaSArIDFdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpID0gaSArIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhlIGdpdmVuIHRva2VuIGZyb20gdGhlIE5vZGVJbmplY3RvcnMgPT4gTW9kdWxlSW5qZWN0b3IuCiAgICAgKgogICAgICogTG9vayBmb3IgdGhlIGluamVjdG9yIHByb3ZpZGluZyB0aGUgdG9rZW4gYnkgd2Fsa2luZyB1cCB0aGUgbm9kZSBpbmplY3RvciB0cmVlIGFuZCB0aGVuCiAgICAgKiB0aGUgbW9kdWxlIGluamVjdG9yIHRyZWUuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBwYXRjaGVzIGB0b2tlbmAgd2l0aCBgX19OR19FTEVNRU5UX0lEX19gIHdoaWNoIGNvbnRhaW5zIHRoZSBpZCBmb3IgdGhlIGJsb29tCiAgICAgKiBmaWx0ZXIuIE5lZ2F0aXZlIHZhbHVlcyBhcmUgcmVzZXJ2ZWQgZm9yIHNwZWNpYWwgb2JqZWN0cy4KICAgICAqICAgLSBgLTFgIGlzIHJlc2VydmVkIGZvciBpbmplY3RpbmcgYEluamVjdG9yYCAoaW1wbGVtZW50ZWQgYnkgYE5vZGVJbmplY3RvcmApCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIE5vZGUgd2hlcmUgdGhlIHNlYXJjaCBmb3IgdGhlIGluamVjdG9yIHNob3VsZCBzdGFydAogICAgICogQHBhcmFtIHs/fSBsVmlldyBUaGUgYExWaWV3YCB0aGF0IGNvbnRhaW5zIHRoZSBgdE5vZGVgCiAgICAgKiBAcGFyYW0gez99IHRva2VuIFRoZSB0b2tlbiB0byBsb29rIGZvcgogICAgICogQHBhcmFtIHs/PX0gZmxhZ3MgSW5qZWN0aW9uIGZsYWdzCiAgICAgKiBAcGFyYW0gez89fSBub3RGb3VuZFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gd2hlbiB0aGUgaW5qZWN0aW9uIGZsYWdzIGlzIGBJbmplY3RGbGFncy5PcHRpb25hbGAKICAgICAqIEByZXR1cm4gez99IHRoZSB2YWx1ZSBmcm9tIHRoZSBpbmplY3RvciwgYG51bGxgIHdoZW4gbm90IGZvdW5kLCBvciBgbm90Rm91bmRWYWx1ZWAgaWYgcHJvdmlkZWQKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVJbmplY3RhYmxlKHROb2RlLCBsVmlldywgdG9rZW4sIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCwgbm90Rm91bmRWYWx1ZSkgewogICAgICAgIGlmICh0Tm9kZSAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJsb29tSGFzaCA9IGJsb29tSGFzaEJpdE9yRmFjdG9yeSh0b2tlbik7CiAgICAgICAgICAgIC8vIElmIHRoZSBJRCBzdG9yZWQgaGVyZSBpcyBhIGZ1bmN0aW9uLCB0aGlzIGlzIGEgc3BlY2lhbCBvYmplY3QgbGlrZSBFbGVtZW50UmVmIG9yIFRlbXBsYXRlUmVmCiAgICAgICAgICAgIC8vIHNvIGp1c3QgY2FsbCB0aGUgZmFjdG9yeSBmdW5jdGlvbiB0byBjcmVhdGUgaXQuCiAgICAgICAgICAgIGlmICh0eXBlb2YgYmxvb21IYXNoID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBlbnRlckRJKGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGJsb29tSGFzaCgpOwogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsICYmICEoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwcm92aWRlciBmb3IgJHtzdHJpbmdpZnlGb3JFcnJvcih0b2tlbil9IWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgIGxlYXZlREkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgYmxvb21IYXNoID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBpZiAoYmxvb21IYXNoID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIGAtMWAgaXMgYSBzcGVjaWFsIHZhbHVlIHVzZWQgdG8gaWRlbnRpZnkgYEluamVjdG9yYCB0eXBlcy4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKG5ldyBOb2RlSW5qZWN0b3IodE5vZGUsIGxWaWV3KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHRva2VuIGhhcyBhIGJsb29tIGhhc2gsIHRoZW4gaXQgaXMgYSB0b2tlbiB3aGljaCBjb3VsZCBiZSBpbiBOb2RlSW5qZWN0b3IuCiAgICAgICAgICAgICAgICAvLyBBIHJlZmVyZW5jZSB0byB0aGUgcHJldmlvdXMgaW5qZWN0b3IgVFZpZXcgdGhhdCB3YXMgZm91bmQgd2hpbGUgY2xpbWJpbmcgdGhlIGVsZW1lbnQKICAgICAgICAgICAgICAgIC8vIGluamVjdG9yIHRyZWUuIFRoaXMgaXMgdXNlZCB0byBrbm93IGlmIHZpZXdQcm92aWRlcnMgY2FuIGJlIGFjY2Vzc2VkIG9uIHRoZSBjdXJyZW50CiAgICAgICAgICAgICAgICAvLyBpbmplY3Rvci4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwcmV2aW91c1RWaWV3ID0gbnVsbDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBpbmplY3RvckluZGV4ID0gZ2V0SW5qZWN0b3JJbmRleCh0Tm9kZSwgbFZpZXcpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHBhcmVudExvY2F0aW9uID0gTk9fUEFSRU5UX0lOSkVDVE9SOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGhvc3RURWxlbWVudE5vZGUgPSBmbGFncyAmIEluamVjdEZsYWdzLkhvc3QgPyBsVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV11bVF9IT1NUXSA6IG51bGw7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzaG91bGQgc2tpcCB0aGlzIGluamVjdG9yLCBvciBpZiB0aGVyZSBpcyBubyBpbmplY3RvciBvbiB0aGlzIG5vZGUsIHN0YXJ0IGJ5CiAgICAgICAgICAgICAgICAvLyBzZWFyY2hpbmcKICAgICAgICAgICAgICAgIC8vIHRoZSBwYXJlbnQgaW5qZWN0b3IuCiAgICAgICAgICAgICAgICBpZiAoaW5qZWN0b3JJbmRleCA9PT0gLTEgfHwgZmxhZ3MgJiBJbmplY3RGbGFncy5Ta2lwU2VsZikgewogICAgICAgICAgICAgICAgICAgIHBhcmVudExvY2F0aW9uID0gaW5qZWN0b3JJbmRleCA9PT0gLTEgPyBnZXRQYXJlbnRJbmplY3RvckxvY2F0aW9uKHROb2RlLCBsVmlldykgOgogICAgICAgICAgICAgICAgICAgICAgICBsVmlld1tpbmplY3RvckluZGV4ICsgUEFSRU5UX0lOSkVDVE9SXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNob3VsZFNlYXJjaFBhcmVudChmbGFncywgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9ySW5kZXggPSAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9ySW5kZXggPSBnZXRQYXJlbnRJbmplY3RvckluZGV4KHBhcmVudExvY2F0aW9uKTsKICAgICAgICAgICAgICAgICAgICAgICAgbFZpZXcgPSBnZXRQYXJlbnRJbmplY3RvclZpZXcocGFyZW50TG9jYXRpb24sIGxWaWV3KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUcmF2ZXJzZSB1cCB0aGUgaW5qZWN0b3IgdHJlZSB1bnRpbCB3ZSBmaW5kIGEgcG90ZW50aWFsIG1hdGNoIG9yIHVudGlsIHdlIGtub3cgdGhlcmUKICAgICAgICAgICAgICAgIC8vICppc24ndCogYSBtYXRjaC4KICAgICAgICAgICAgICAgIHdoaWxlIChpbmplY3RvckluZGV4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHBhcmVudExvY2F0aW9uID0gbFZpZXdbaW5qZWN0b3JJbmRleCArIFBBUkVOVF9JTkpFQ1RPUl07CiAgICAgICAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGN1cnJlbnQgaW5qZWN0b3IuIElmIGl0IG1hdGNoZXMsIHNlZSBpZiBpdCBjb250YWlucyB0b2tlbi4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICAgICAgaWYgKGJsb29tSGFzVG9rZW4oYmxvb21IYXNoLCBpbmplY3RvckluZGV4LCB0Vmlldy5kYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50LCB3ZSBoYXZlIGFuIGluamVjdG9yIHdoaWNoICptYXkqIGNvbnRhaW4gdGhlIHRva2VuLCBzbyB3ZSBzdGVwIHRocm91Z2gKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3ZpZGVycyBhbmQgZGlyZWN0aXZlcyBhc3NvY2lhdGVkIHdpdGggdGhlIGluamVjdG9yJ3MgY29ycmVzcG9uZGluZyBub2RlIHRvIGdldAogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgaW5zdGFuY2UuCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSBzZWFyY2hUb2tlbnNPbkluamVjdG9yKGluamVjdG9ySW5kZXgsIGxWaWV3LCB0b2tlbiwgcHJldmlvdXNUVmlldywgZmxhZ3MsIGhvc3RURWxlbWVudE5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdGFuY2UgIT09IE5PVF9GT1VORCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluc3RhbmNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzaG91bGRTZWFyY2hQYXJlbnQoZmxhZ3MsIGxWaWV3W1RWSUVXXS5kYXRhW2luamVjdG9ySW5kZXggKyBUTk9ERV0gPT09IGhvc3RURWxlbWVudE5vZGUpICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGJsb29tSGFzVG9rZW4oYmxvb21IYXNoLCBpbmplY3RvckluZGV4LCBsVmlldykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZiB3YXNuJ3QgZm91bmQgYW55d2hlcmUgb24gdGhpcyBub2RlLCBzbyBpdCB3YXMgYSBmYWxzZSBwb3NpdGl2ZS4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHJhdmVyc2UgdXAgdGhlIHRyZWUgYW5kIGNvbnRpbnVlIHNlYXJjaGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUVmlldyA9IHRWaWV3OwogICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4ID0gZ2V0UGFyZW50SW5qZWN0b3JJbmRleChwYXJlbnRMb2NhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIGxWaWV3ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3KHBhcmVudExvY2F0aW9uLCBsVmlldyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBzaG91bGQgbm90IHNlYXJjaCBwYXJlbnQgT1IgSWYgdGhlIGFuY2VzdG9yIGJsb29tIGZpbHRlciB2YWx1ZSBkb2VzIG5vdCBoYXZlIHRoZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXQgY29ycmVzcG9uZGluZyB0byB0aGUgZGlyZWN0aXZlIHdlIGNhbiBnaXZlIHVwIG9uIHRyYXZlcnNpbmcgdXAgdG8gZmluZCB0aGUgc3BlY2lmaWMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5qZWN0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9ySW5kZXggPSAtMTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwgJiYgbm90Rm91bmRWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgb3IgdGhlIE51bGxJbmplY3RvciB3aWxsIHRocm93IGZvciBvcHRpb25hbCBkZXBzCiAgICAgICAgICAgIG5vdEZvdW5kVmFsdWUgPSBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoKGZsYWdzICYgKEluamVjdEZsYWdzLlNlbGYgfCBJbmplY3RGbGFncy5Ib3N0KSkgPT09IDApIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtb2R1bGVJbmplY3RvciA9IGxWaWV3W0lOSkVDVE9SJDFdOwogICAgICAgICAgICAvLyBzd2l0Y2ggdG8gYGluamVjdEluamVjdG9yT25seWAgaW1wbGVtZW50YXRpb24gZm9yIG1vZHVsZSBpbmplY3Rvciwgc2luY2UgbW9kdWxlIGluamVjdG9yCiAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGF2ZSBhY2Nlc3MgdG8gQ29tcG9uZW50L0RpcmVjdGl2ZSBESSBzY29wZSAodGhhdCBtYXkgaGFwcGVuIHRocm91Z2gKICAgICAgICAgICAgLy8gYGRpcmVjdGl2ZUluamVjdGAgaW1wbGVtZW50YXRpb24pCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmplY3RJbXBsZW1lbnRhdGlvbiA9IHNldEluamVjdEltcGxlbWVudGF0aW9uKHVuZGVmaW5lZCk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpZiAobW9kdWxlSW5qZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlSW5qZWN0b3IuZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlLCBmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmplY3RSb290TGltcE1vZGUodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgc2V0SW5qZWN0SW1wbGVtZW50YXRpb24ocHJldmlvdXNJbmplY3RJbXBsZW1lbnRhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGZsYWdzICYgSW5qZWN0RmxhZ3MuT3B0aW9uYWwpIHsKICAgICAgICAgICAgcmV0dXJuIG5vdEZvdW5kVmFsdWU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vZGVJbmplY3RvcjogTk9UX0ZPVU5EIFske3N0cmluZ2lmeUZvckVycm9yKHRva2VuKX1dYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTk9UX0ZPVU5EID0ge307CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9ySW5kZXgKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7P30gcHJldmlvdXNUVmlldwogICAgICogQHBhcmFtIHs/fSBmbGFncwogICAgICogQHBhcmFtIHs/fSBob3N0VEVsZW1lbnROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZWFyY2hUb2tlbnNPbkluamVjdG9yKGluamVjdG9ySW5kZXgsIGxWaWV3LCB0b2tlbiwgcHJldmlvdXNUVmlldywgZmxhZ3MsIGhvc3RURWxlbWVudE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3VycmVudFRWaWV3ID0gbFZpZXdbVFZJRVddOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50VFZpZXcuZGF0YVtpbmplY3RvckluZGV4ICsgVE5PREVdKSk7CiAgICAgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gZGV0ZXJtaW5lIGlmIHZpZXcgcHJvdmlkZXJzIGNhbiBiZSBhY2Nlc3NlZCBieSB0aGUgc3RhcnRpbmcgZWxlbWVudC4KICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHBvc3NpYml0aWVzCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNhbkFjY2Vzc1ZpZXdQcm92aWRlcnMgPSBwcmV2aW91c1RWaWV3ID09IG51bGwgPwogICAgICAgICAgICAvLyAxKSBUaGlzIGlzIHRoZSBmaXJzdCBpbnZvY2F0aW9uIGBwcmV2aW91c1RWaWV3ID09IG51bGxgIHdoaWNoIG1lYW5zIHRoYXQgd2UgYXJlIGF0IHRoZQogICAgICAgICAgICAvLyBgVE5vZGVgIG9mIHdoZXJlIGluamVjdG9yIGlzIHN0YXJ0aW5nIHRvIGxvb2suIEluIHN1Y2ggYSBjYXNlIHRoZSBvbmx5IHRpbWUgd2UgYXJlIGFsbG93ZWQKICAgICAgICAgICAgLy8gdG8gbG9vayBpbnRvIHRoZSBWaWV3UHJvdmlkZXJzIGlzIGlmOgogICAgICAgICAgICAvLyAtIHdlIGFyZSBvbiBhIGNvbXBvbmVudAogICAgICAgICAgICAvLyAtIEFORCB0aGUgaW5qZWN0b3Igc2V0IGBpbmNsdWRlVmlld1Byb3ZpZGVyc2AgdG8gdHJ1ZSAoaW1wbHlpbmcgdGhhdCB0aGUgdG9rZW4gY2FuIHNlZQogICAgICAgICAgICAvLyBWaWV3UHJvdmlkZXJzIGJlY2F1c2UgaXQgaXMgdGhlIENvbXBvbmVudCBvciBhIFNlcnZpY2Ugd2hpY2ggaXRzZWxmIHdhcyBkZWNsYXJlZCBpbgogICAgICAgICAgICAvLyBWaWV3UHJvdmlkZXJzKQogICAgICAgICAgICAoaXNDb21wb25lbnRIb3N0KHROb2RlKSAmJiBpbmNsdWRlVmlld1Byb3ZpZGVycykgOgogICAgICAgICAgICAvLyAyKSBgcHJldmlvdXNUVmlldyAhPSBudWxsYCB3aGljaCBtZWFucyB0aGF0IHdlIGFyZSBub3cgd2Fsa2luZyBhY3Jvc3MgdGhlIHBhcmVudCBub2Rlcy4KICAgICAgICAgICAgLy8gSW4gc3VjaCBhIGNhc2Ugd2UgYXJlIG9ubHkgYWxsb3dlZCB0byBsb29rIGludG8gdGhlIFZpZXdQcm92aWRlcnMgaWY6CiAgICAgICAgICAgIC8vIC0gV2UganVzdCBjcm9zc2VkIGZyb20gY2hpbGQgVmlldyB0byBQYXJlbnQgVmlldyBgcHJldmlvdXNUVmlldyAhPSBjdXJyZW50VFZpZXdgCiAgICAgICAgICAgIC8vIC0gQU5EIHRoZSBwYXJlbnQgVE5vZGUgaXMgYW4gRWxlbWVudC4KICAgICAgICAgICAgLy8gVGhpcyBtZWFucyB0aGF0IHdlIGp1c3QgY2FtZSBmcm9tIHRoZSBDb21wb25lbnQncyBWaWV3IGFuZCB0aGVyZWZvcmUgYXJlIGFsbG93ZWQgdG8gc2VlCiAgICAgICAgICAgIC8vIGludG8gdGhlIFZpZXdQcm92aWRlcnMuCiAgICAgICAgICAgIChwcmV2aW91c1RWaWV3ICE9IGN1cnJlbnRUVmlldyAmJiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovKSk7CiAgICAgICAgLy8gVGhpcyBzcGVjaWFsIGNhc2UgaGFwcGVucyB3aGVuIHRoZXJlIGlzIGEgQGhvc3Qgb24gdGhlIGluamVjdCBhbmQgd2hlbiB3ZSBhcmUgc2VhcmNoaW5nCiAgICAgICAgLy8gb24gdGhlIGhvc3QgZWxlbWVudCBub2RlLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0hvc3RTcGVjaWFsQ2FzZSA9IChmbGFncyAmIEluamVjdEZsYWdzLkhvc3QpICYmIGhvc3RURWxlbWVudE5vZGUgPT09IHROb2RlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmplY3RhYmxlSWR4ID0gbG9jYXRlRGlyZWN0aXZlT3JQcm92aWRlcih0Tm9kZSwgY3VycmVudFRWaWV3LCB0b2tlbiwgY2FuQWNjZXNzVmlld1Byb3ZpZGVycywgaXNIb3N0U3BlY2lhbENhc2UpOwogICAgICAgIGlmIChpbmplY3RhYmxlSWR4ICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgY3VycmVudFRWaWV3LCBpbmplY3RhYmxlSWR4LCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gTk9UX0ZPVU5EOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2VhcmNoZXMgZm9yIHRoZSBnaXZlbiB0b2tlbiBhbW9uZyB0aGUgbm9kZSdzIGRpcmVjdGl2ZXMgYW5kIHByb3ZpZGVycy4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBUTm9kZSBvbiB3aGljaCBkaXJlY3RpdmVzIGFyZSBwcmVzZW50LgogICAgICogQHBhcmFtIHs/fSB0VmlldyBUaGUgdFZpZXcgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nCiAgICAgKiBAcGFyYW0gez99IHRva2VuIFByb3ZpZGVyIHRva2VuIG9yIHR5cGUgb2YgYSBkaXJlY3RpdmUgdG8gbG9vayBmb3IuCiAgICAgKiBAcGFyYW0gez99IGNhbkFjY2Vzc1ZpZXdQcm92aWRlcnMgV2hldGhlciB2aWV3IHByb3ZpZGVycyBzaG91bGQgYmUgY29uc2lkZXJlZC4KICAgICAqIEBwYXJhbSB7P30gaXNIb3N0U3BlY2lhbENhc2UgV2hldGhlciB0aGUgaG9zdCBzcGVjaWFsIGNhc2UgYXBwbGllcy4KICAgICAqIEByZXR1cm4gez99IEluZGV4IG9mIGEgZm91bmQgZGlyZWN0aXZlIG9yIHByb3ZpZGVyLCBvciBudWxsIHdoZW4gbm9uZSBmb3VuZC4KICAgICAqLwogICAgZnVuY3Rpb24gbG9jYXRlRGlyZWN0aXZlT3JQcm92aWRlcih0Tm9kZSwgdFZpZXcsIHRva2VuLCBjYW5BY2Nlc3NWaWV3UHJvdmlkZXJzLCBpc0hvc3RTcGVjaWFsQ2FzZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBub2RlUHJvdmlkZXJJbmRleGVzID0gdE5vZGUucHJvdmlkZXJJbmRleGVzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0SW5qZWN0YWJsZXMgPSB0Vmlldy5kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmplY3RhYmxlc1N0YXJ0ID0gbm9kZVByb3ZpZGVySW5kZXhlcyAmIDY1NTM1IC8qIFByb3ZpZGVyc1N0YXJ0SW5kZXhNYXNrICovOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVzU3RhcnQgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlyZWN0aXZlRW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjcHRWaWV3UHJvdmlkZXJzQ291bnQgPSBub2RlUHJvdmlkZXJJbmRleGVzID4+IDE2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ICovOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdGFydGluZ0luZGV4ID0gY2FuQWNjZXNzVmlld1Byb3ZpZGVycyA/IGluamVjdGFibGVzU3RhcnQgOiBpbmplY3RhYmxlc1N0YXJ0ICsgY3B0Vmlld1Byb3ZpZGVyc0NvdW50OwogICAgICAgIC8vIFdoZW4gdGhlIGhvc3Qgc3BlY2lhbCBjYXNlIGFwcGxpZXMsIG9ubHkgdGhlIHZpZXdQcm92aWRlcnMgYW5kIHRoZSBjb21wb25lbnQgYXJlIHZpc2libGUKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW5kSW5kZXggPSBpc0hvc3RTcGVjaWFsQ2FzZSA/IGluamVjdGFibGVzU3RhcnQgKyBjcHRWaWV3UHJvdmlkZXJzQ291bnQgOiBkaXJlY3RpdmVFbmQ7CiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0aW5nSW5kZXg7IGkgPCBlbmRJbmRleDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvdmlkZXJUb2tlbk9yRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRJbmplY3RhYmxlc1tpXSkpOwogICAgICAgICAgICBpZiAoaSA8IGRpcmVjdGl2ZXNTdGFydCAmJiB0b2tlbiA9PT0gcHJvdmlkZXJUb2tlbk9yRGVmIHx8CiAgICAgICAgICAgICAgICBpID49IGRpcmVjdGl2ZXNTdGFydCAmJiAoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyVG9rZW5PckRlZikpKS50eXBlID09PSB0b2tlbikgewogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGlzSG9zdFNwZWNpYWxDYXNlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRJbmplY3RhYmxlc1tkaXJlY3RpdmVzU3RhcnRdKSk7CiAgICAgICAgICAgIGlmIChkaXJEZWYgJiYgaXNDb21wb25lbnREZWYoZGlyRGVmKSAmJiBkaXJEZWYudHlwZSA9PT0gdG9rZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBkaXJlY3RpdmVzU3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlIG9yIGluc3RhbnRpYXRlIHRoZSBpbmplY3RhYmxlIGZyb20gdGhlIGBMVmlld2AgYXQgcGFydGljdWxhciBgaW5kZXhgLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgaGFzIGFscmVhZHkgYmVlbiBpbnN0YW50aWF0ZWQgYW5kIGlmIHNvIHJldHVybnMgdGhlCiAgICAgKiBjYWNoZWQgYGluamVjdGFibGVgLiBPdGhlcndpc2UgaWYgaXQgZGV0ZWN0cyB0aGF0IHRoZSB2YWx1ZSBpcyBzdGlsbCBhIGZhY3RvcnkgaXQKICAgICAqIGluc3RhbnRpYXRlcyB0aGUgYGluamVjdGFibGVgIGFuZCBjYWNoZXMgdGhlIHZhbHVlLgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Tm9kZUluamVjdGFibGUobFZpZXcsIHRWaWV3LCBpbmRleCwgdE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHZhbHVlID0gbFZpZXdbaW5kZXhdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0RGF0YSA9IHRWaWV3LmRhdGE7CiAgICAgICAgaWYgKGlzRmFjdG9yeSh2YWx1ZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gdmFsdWU7CiAgICAgICAgICAgIGlmIChmYWN0b3J5LnJlc29sdmluZykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDaXJjdWxhciBkZXAgZm9yICR7c3RyaW5naWZ5Rm9yRXJyb3IodERhdGFbaW5kZXhdKX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5jbHVkZVZpZXdQcm92aWRlcnMgPSBzZXRJbmNsdWRlVmlld1Byb3ZpZGVycyhmYWN0b3J5LmNhblNlZVZpZXdQcm92aWRlcnMpOwogICAgICAgICAgICBmYWN0b3J5LnJlc29sdmluZyA9IHRydWU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb247CiAgICAgICAgICAgIGlmIChmYWN0b3J5LmluamVjdEltcGwpIHsKICAgICAgICAgICAgICAgIHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihmYWN0b3J5LmluamVjdEltcGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVudGVyREkobFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHZhbHVlID0gbFZpZXdbaW5kZXhdID0gZmFjdG9yeS5mYWN0b3J5KHVuZGVmaW5lZCwgdERhdGEsIGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGNvZGUgcGF0aCBpcyBoaXQgZm9yIGJvdGggZGlyZWN0aXZlcyBhbmQgcHJvdmlkZXJzLgogICAgICAgICAgICAgICAgLy8gRm9yIHBlcmYgcmVhc29ucywgd2Ugd2FudCB0byBhdm9pZCBzZWFyY2hpbmcgZm9yIGhvb2tzIG9uIHByb3ZpZGVycy4KICAgICAgICAgICAgICAgIC8vIEl0IGRvZXMgbm8gaGFybSB0byB0cnkgKHRoZSBob29rcyBqdXN0IHdvbid0IGV4aXN0KSwgYnV0IHRoZSBleHRyYQogICAgICAgICAgICAgICAgLy8gY2hlY2tzIGFyZSB1bm5lY2Vzc2FyeSBhbmQgdGhpcyBpcyBhIGhvdCBwYXRoLiBTbyB3ZSBjaGVjayB0byBzZWUKICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBpbmRleCBvZiB0aGUgZGVwZW5kZW5jeSBpcyBpbiB0aGUgZGlyZWN0aXZlIHJhbmdlIGZvciB0aGlzCiAgICAgICAgICAgICAgICAvLyB0Tm9kZS4gSWYgaXQncyBub3QsIHdlIGtub3cgaXQncyBhIHByb3ZpZGVyIGFuZCBza2lwIGhvb2sgcmVnaXN0cmF0aW9uLgogICAgICAgICAgICAgICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyAmJiBpbmRleCA+PSB0Tm9kZS5kaXJlY3RpdmVTdGFydCkgewogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREaXJlY3RpdmVEZWYodERhdGFbaW5kZXhdKTsKICAgICAgICAgICAgICAgICAgICByZWdpc3RlclByZU9yZGVySG9va3MoaW5kZXgsICgvKiogQHR5cGUgez99ICovICh0RGF0YVtpbmRleF0pKSwgdFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgaWYgKGZhY3RvcnkuaW5qZWN0SW1wbCkKICAgICAgICAgICAgICAgICAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgICAgICAgICAgICAgIHNldEluY2x1ZGVWaWV3UHJvdmlkZXJzKHByZXZpb3VzSW5jbHVkZVZpZXdQcm92aWRlcnMpOwogICAgICAgICAgICAgICAgZmFjdG9yeS5yZXNvbHZpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGxlYXZlREkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGJpdCBpbiBhbiBpbmplY3RvcidzIGJsb29tIGZpbHRlciB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdAogICAgICogdGhlIGRpcmVjdGl2ZSBtaWdodCBiZSBwcm92aWRlZCBieSB0aGUgaW5qZWN0b3IuCiAgICAgKgogICAgICogV2hlbiBhIGRpcmVjdGl2ZSBpcyBwdWJsaWMsIGl0IGlzIGFkZGVkIHRvIHRoZSBibG9vbSBmaWx0ZXIgYW5kIGdpdmVuIGEgdW5pcXVlIElEIHRoYXQgY2FuIGJlCiAgICAgKiByZXRyaWV2ZWQgb24gdGhlIFR5cGUuIFdoZW4gdGhlIGRpcmVjdGl2ZSBpc24ndCBwdWJsaWMgb3IgdGhlIHRva2VuIGlzIG5vdCBhIGRpcmVjdGl2ZSBgbnVsbGAKICAgICAqIGlzIHJldHVybmVkIGFzIHRoZSBub2RlIGluamVjdG9yIGNhbiBub3QgcG9zc2libHkgcHJvdmlkZSB0aGF0IHRva2VuLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdG9rZW4gdGhlIGluamVjdGlvbiB0b2tlbgogICAgICogQHJldHVybiB7P30gdGhlIG1hdGNoaW5nIGJpdCB0byBjaGVjayBpbiB0aGUgYmxvb20gZmlsdGVyIG9yIGBudWxsYCBpZiB0aGUgdG9rZW4gaXMgbm90IGtub3duLgogICAgICogICBXaGVuIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBuZWdhdGl2ZSB0aGVuIGl0IHJlcHJlc2VudHMgc3BlY2lhbCB2YWx1ZXMgc3VjaCBhcyBgSW5qZWN0b3JgLgogICAgICovCiAgICBmdW5jdGlvbiBibG9vbUhhc2hCaXRPckZhY3RvcnkodG9rZW4pIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0b2tlbiwgJ3Rva2VuIG11c3QgYmUgZGVmaW5lZCcpOwogICAgICAgIGlmICh0eXBlb2YgdG9rZW4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiB0b2tlbi5jaGFyQ29kZUF0KDApIHx8IDA7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0b2tlbklkID0gKCgvKiogQHR5cGUgez99ICovICh0b2tlbikpKVtOR19FTEVNRU5UX0lEXTsKICAgICAgICAvLyBOZWdhdGl2ZSB0b2tlbiBJRHMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgb2JqZWN0cyBzdWNoIGFzIGBJbmplY3RvcmAKICAgICAgICByZXR1cm4gKHR5cGVvZiB0b2tlbklkID09PSAnbnVtYmVyJyAmJiB0b2tlbklkID4gMCkgPyB0b2tlbklkICYgQkxPT01fTUFTSyA6IHRva2VuSWQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYmxvb21IYXNoCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9ySW5kZXgKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBibG9vbUhhc1Rva2VuKGJsb29tSGFzaCwgaW5qZWN0b3JJbmRleCwgaW5qZWN0b3JWaWV3KSB7CiAgICAgICAgLy8gQ3JlYXRlIGEgbWFzayB0aGF0IHRhcmdldHMgdGhlIHNwZWNpZmljIGJpdCBhc3NvY2lhdGVkIHdpdGggdGhlIGRpcmVjdGl2ZSB3ZSdyZSBsb29raW5nIGZvci4KICAgICAgICAvLyBKUyBiaXQgb3BlcmF0aW9ucyBhcmUgMzIgYml0cywgc28gdGhpcyB3aWxsIGJlIGEgbnVtYmVyIGJldHdlZW4gMl4wIGFuZCAyXjMxLCBjb3JyZXNwb25kaW5nCiAgICAgICAgLy8gdG8gYml0IHBvc2l0aW9ucyAwIC0gMzEgaW4gYSAzMiBiaXQgaW50ZWdlci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWFzayA9IDEgPDwgYmxvb21IYXNoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiNyA9IGJsb29tSGFzaCAmIDB4ODA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGI2ID0gYmxvb21IYXNoICYgMHg0MDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYjUgPSBibG9vbUhhc2ggJiAweDIwOwogICAgICAgIC8vIE91ciBibG9vbSBmaWx0ZXIgc2l6ZSBpcyAyNTYgYml0cywgd2hpY2ggaXMgZWlnaHQgMzItYml0IGJsb29tIGZpbHRlciBidWNrZXRzOgogICAgICAgIC8vIGJmMCA9IFswIC0gMzFdLCBiZjEgPSBbMzIgLSA2M10sIGJmMiA9IFs2NCAtIDk1XSwgYmYzID0gWzk2IC0gMTI3XSwgZXRjLgogICAgICAgIC8vIEdldCB0aGUgYmxvb20gZmlsdGVyIHZhbHVlIGZyb20gdGhlIGFwcHJvcHJpYXRlIGJ1Y2tldCBiYXNlZCBvbiB0aGUgZGlyZWN0aXZlJ3MgYmxvb21CaXQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2YWx1ZTsKICAgICAgICBpZiAoYjcpIHsKICAgICAgICAgICAgdmFsdWUgPSBiNiA/IChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgN10gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDZdKSA6CiAgICAgICAgICAgICAgICAoYjUgPyBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleCArIDVdIDogaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXggKyA0XSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9IGI2ID8gKGI1ID8gaW5qZWN0b3JWaWV3W2luamVjdG9ySW5kZXggKyAzXSA6IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgMl0pIDoKICAgICAgICAgICAgICAgIChiNSA/IGluamVjdG9yVmlld1tpbmplY3RvckluZGV4ICsgMV0gOiBpbmplY3RvclZpZXdbaW5qZWN0b3JJbmRleF0pOwogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgYmxvb20gZmlsdGVyIHZhbHVlIGhhcyB0aGUgYml0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpcmVjdGl2ZSdzIGJsb29tQml0IGZsaXBwZWQgb24sCiAgICAgICAgLy8gdGhpcyBpbmplY3RvciBpcyBhIHBvdGVudGlhbCBtYXRjaC4KICAgICAgICByZXR1cm4gISEodmFsdWUgJiBtYXNrKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0cnVlIGlmIGZsYWdzIHByZXZlbnQgcGFyZW50IGluamVjdG9yIGZyb20gYmVpbmcgc2VhcmNoZWQgZm9yIHRva2VucwogICAgICogQHBhcmFtIHs/fSBmbGFncwogICAgICogQHBhcmFtIHs/fSBpc0ZpcnN0SG9zdFROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzaG91bGRTZWFyY2hQYXJlbnQoZmxhZ3MsIGlzRmlyc3RIb3N0VE5vZGUpIHsKICAgICAgICByZXR1cm4gIShmbGFncyAmIEluamVjdEZsYWdzLlNlbGYpICYmICEoZmxhZ3MgJiBJbmplY3RGbGFncy5Ib3N0ICYmIGlzRmlyc3RIb3N0VE5vZGUpOwogICAgfQogICAgY2xhc3MgTm9kZUluamVjdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF90Tm9kZQogICAgICAgICAqIEBwYXJhbSB7P30gX2xWaWV3CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ROb2RlLCBfbFZpZXcpIHsKICAgICAgICAgICAgdGhpcy5fdE5vZGUgPSBfdE5vZGU7CiAgICAgICAgICAgIHRoaXMuX2xWaWV3ID0gX2xWaWV3OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRPckNyZWF0ZUluamVjdGFibGUodGhpcy5fdE5vZGUsIHRoaXMuX2xWaWV3LCB0b2tlbiwgdW5kZWZpbmVkLCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWdldEZhY3RvcnlPZih0eXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHR5cGVBbnkgPSAoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpOwogICAgICAgIGlmIChpc0ZvcndhcmRSZWYodHlwZSkpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IMm1ybVnZXRGYWN0b3J5T2YocmVzb2x2ZUZvcndhcmRSZWYodHlwZUFueSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkgPyBmYWN0b3J5KCkgOiBudWxsOwogICAgICAgICAgICB9KSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmYWN0b3J5ID0gZ2V0RmFjdG9yeURlZih0eXBlQW55KTsKICAgICAgICBpZiAoZmFjdG9yeSA9PT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yRGVmID0gZ2V0SW5qZWN0b3JEZWYodHlwZUFueSk7CiAgICAgICAgICAgIGZhY3RvcnkgPSBpbmplY3RvckRlZiAmJiBpbmplY3RvckRlZi5mYWN0b3J5OwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFjdG9yeSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KHR5cGUpIHsKICAgICAgICByZXR1cm4gbm9TaWRlRWZmZWN0cygoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3duQ29uc3RydWN0b3IgPSB0eXBlLnByb3RvdHlwZS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvd25GYWN0b3J5ID0gb3duQ29uc3RydWN0b3JbTkdfRkFDVE9SWV9ERUZdIHx8IMm1ybVnZXRGYWN0b3J5T2Yob3duQ29uc3RydWN0b3IpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9iamVjdFByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcmVudCA9IE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkuY29uc3RydWN0b3I7CiAgICAgICAgICAgIC8vIEdvIHVwIHRoZSBwcm90b3R5cGUgdW50aWwgd2UgaGl0IGBPYmplY3RgLgogICAgICAgICAgICB3aGlsZSAocGFyZW50ICYmIHBhcmVudCAhPT0gb2JqZWN0UHJvdG90eXBlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gcGFyZW50W05HX0ZBQ1RPUllfREVGXSB8fCDJtcm1Z2V0RmFjdG9yeU9mKHBhcmVudCk7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoaXQgc29tZXRoaW5nIHRoYXQgaGFzIGEgZmFjdG9yeSBhbmQgdGhlIGZhY3RvcnkgaXNuJ3QgdGhlIHNhbWUgYXMgdGhlIHR5cGUsCiAgICAgICAgICAgICAgICAvLyB3ZSd2ZSBmb3VuZCB0aGUgaW5oZXJpdGVkIGZhY3RvcnkuIE5vdGUgdGhlIGNoZWNrIHRoYXQgdGhlIGZhY3RvcnkgaXNuJ3QgdGhlIHR5cGUncwogICAgICAgICAgICAgICAgLy8gb3duIGZhY3RvcnkgaXMgcmVkdW5kYW50IGluIG1vc3QgY2FzZXMsIGJ1dCBpZiB0aGUgdXNlciBoYXMgY3VzdG9tIGRlY29yYXRvcnMgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBjbGFzcywgdGhpcyBsb29rdXAgd2lsbCBzdGFydCBvbmUgbGV2ZWwgZG93biBpbiB0aGUgcHJvdG90eXBlIGNoYWluLCBjYXVzaW5nIHVzIHRvCiAgICAgICAgICAgICAgICAvLyBmaW5kIHRoZSBvd24gZmFjdG9yeSBmaXJzdCBhbmQgcG90ZW50aWFsbHkgdHJpZ2dlcmluZyBhbiBpbmZpbml0ZSBsb29wIGRvd25zdHJlYW0uCiAgICAgICAgICAgICAgICBpZiAoZmFjdG9yeSAmJiBmYWN0b3J5ICE9PSBvd25GYWN0b3J5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGVyZSBpcyBubyBmYWN0b3J5IGRlZmluZWQuIEVpdGhlciB0aGlzIHdhcyBpbXByb3BlciB1c2FnZSBvZiBpbmhlcml0YW5jZQogICAgICAgICAgICAvLyAobm8gQW5ndWxhciBkZWNvcmF0b3Igb24gdGhlIHN1cGVyY2xhc3MpIG9yIHRoZXJlIGlzIG5vIGNvbnN0cnVjdG9yIGF0IGFsbAogICAgICAgICAgICAvLyBpbiB0aGUgaW5oZXJpdGFuY2UgY2hhaW4uIFNpbmNlIHRoZSB0d28gY2FzZXMgY2Fubm90IGJlIGRpc3Rpbmd1aXNoZWQsIHRoZQogICAgICAgICAgICAvLyBsYXR0ZXIgaGFzIHRvIGJlIGFzc3VtZWQuCiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdCA9PiBuZXcgdCgpKTsKICAgICAgICB9KSk7CiAgICB9CiAgICBjb25zdCBFUlJPUl9ERUJVR19DT05URVhUID0gJ25nRGVidWdDb250ZXh0JzsKICAgIGNvbnN0IEVSUk9SX09SSUdJTkFMX0VSUk9SID0gJ25nT3JpZ2luYWxFcnJvcic7CiAgICBjb25zdCBFUlJPUl9MT0dHRVIgPSAnbmdFcnJvckxvZ2dlcic7CiAgICBmdW5jdGlvbiB3cmFwcGVkRXJyb3IobWVzc2FnZSwgb3JpZ2luYWxFcnJvcikgewogICAgICAgIGNvbnN0IG1zZyA9IGAke21lc3NhZ2V9IGNhdXNlZCBieTogJHtvcmlnaW5hbEVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBvcmlnaW5hbEVycm9yLm1lc3NhZ2UgOiBvcmlnaW5hbEVycm9yfWA7CiAgICAgICAgY29uc3QgZXJyb3IgPSBFcnJvcihtc2cpOwogICAgICAgIGVycm9yW0VSUk9SX09SSUdJTkFMX0VSUk9SXSA9IG9yaWdpbmFsRXJyb3I7CiAgICAgICAgcmV0dXJuIGVycm9yOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXREZWJ1Z0NvbnRleHQoZXJyb3IpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChlcnJvcikpKVtFUlJPUl9ERUJVR19DT05URVhUXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T3JpZ2luYWxFcnJvcihlcnJvcikgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX09SSUdJTkFMX0VSUk9SXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RXJyb3JMb2dnZXIoZXJyb3IpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChlcnJvcikpKVtFUlJPUl9MT0dHRVJdIHx8IGRlZmF1bHRFcnJvckxvZ2dlcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb25zb2xlCiAgICAgKiBAcGFyYW0gey4uLj99IHZhbHVlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGVmYXVsdEVycm9yTG9nZ2VyKGNvbnNvbGUsIC4uLnZhbHVlcykgewogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS5lcnJvcikpKSguLi52YWx1ZXMpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZXJyb3JfaGFuZGxlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFByb3ZpZGVzIGEgaG9vayBmb3IgY2VudHJhbGl6ZWQgZXhjZXB0aW9uIGhhbmRsaW5nLgogICAgICoKICAgICAqIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIGBFcnJvckhhbmRsZXJgIHByaW50cyBlcnJvciBtZXNzYWdlcyB0byB0aGUgYGNvbnNvbGVgLiBUbwogICAgICogaW50ZXJjZXB0IGVycm9yIGhhbmRsaW5nLCB3cml0ZSBhIGN1c3RvbSBleGNlcHRpb24gaGFuZGxlciB0aGF0IHJlcGxhY2VzIHRoaXMgZGVmYXVsdCBhcwogICAgICogYXBwcm9wcmlhdGUgZm9yIHlvdXIgYXBwLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGAKICAgICAqIGNsYXNzIE15RXJyb3JIYW5kbGVyIGltcGxlbWVudHMgRXJyb3JIYW5kbGVyIHsKICAgICAqICAgaGFuZGxlRXJyb3IoZXJyb3IpIHsKICAgICAqICAgICAvLyBkbyBzb21ldGhpbmcgd2l0aCB0aGUgZXhjZXB0aW9uCiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqCiAgICAgKiBcQE5nTW9kdWxlKHsKICAgICAqICAgcHJvdmlkZXJzOiBbe3Byb3ZpZGU6IEVycm9ySGFuZGxlciwgdXNlQ2xhc3M6IE15RXJyb3JIYW5kbGVyfV0KICAgICAqIH0pCiAgICAgKiBjbGFzcyBNeU1vZHVsZSB7fQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgRXJyb3JIYW5kbGVyIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NvbnNvbGUgPSBjb25zb2xlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVFcnJvcihlcnJvcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsRXJyb3IgPSB0aGlzLl9maW5kT3JpZ2luYWxFcnJvcihlcnJvcik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IHRoaXMuX2ZpbmRDb250ZXh0KGVycm9yKTsKICAgICAgICAgICAgLy8gTm90ZTogQnJvd3NlciBjb25zb2xlcyBzaG93IHRoZSBwbGFjZSBmcm9tIHdoZXJlIGNvbnNvbGUuZXJyb3Igd2FzIGNhbGxlZC4KICAgICAgICAgICAgLy8gV2UgY2FuIHVzZSB0aGlzIHRvIGdpdmUgdXNlcnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXJyb3JMb2dnZXIgPSBnZXRFcnJvckxvZ2dlcihlcnJvcik7CiAgICAgICAgICAgIGVycm9yTG9nZ2VyKHRoaXMuX2NvbnNvbGUsIGBFUlJPUmAsIGVycm9yKTsKICAgICAgICAgICAgaWYgKG9yaWdpbmFsRXJyb3IpIHsKICAgICAgICAgICAgICAgIGVycm9yTG9nZ2VyKHRoaXMuX2NvbnNvbGUsIGBPUklHSU5BTCBFUlJPUmAsIG9yaWdpbmFsRXJyb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjb250ZXh0KSB7CiAgICAgICAgICAgICAgICBlcnJvckxvZ2dlcih0aGlzLl9jb25zb2xlLCAnRVJST1IgQ09OVEVYVCcsIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmluZENvbnRleHQoZXJyb3IpIHsKICAgICAgICAgICAgaWYgKGVycm9yKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGVidWdDb250ZXh0KGVycm9yKSA/IGdldERlYnVnQ29udGV4dChlcnJvcikgOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmRDb250ZXh0KGdldE9yaWdpbmFsRXJyb3IoZXJyb3IpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9maW5kT3JpZ2luYWxFcnJvcihlcnJvcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBlID0gZ2V0T3JpZ2luYWxFcnJvcihlcnJvcik7CiAgICAgICAgICAgIHdoaWxlIChlICYmIGdldE9yaWdpbmFsRXJyb3IoZSkpIHsKICAgICAgICAgICAgICAgIGUgPSBnZXRPcmlnaW5hbEVycm9yKGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGVmaW5lcyBhIHNjaGVtYSB0aGF0IGFsbG93cyBhbiBOZ01vZHVsZSB0byBjb250YWluIHRoZSBmb2xsb3dpbmc6CiAgICAgKiAtIE5vbi1Bbmd1bGFyIGVsZW1lbnRzIG5hbWVkIHdpdGggZGFzaCBjYXNlIChgLWApLgogICAgICogLSBFbGVtZW50IHByb3BlcnRpZXMgbmFtZWQgd2l0aCBkYXNoIGNhc2UgKGAtYCkuCiAgICAgKiBEYXNoIGNhc2UgaXMgdGhlIG5hbWluZyBjb252ZW50aW9uIGZvciBjdXN0b20gZWxlbWVudHMuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBDVVNUT01fRUxFTUVOVFNfU0NIRU1BID0gewogICAgICAgIG5hbWU6ICdjdXN0b20tZWxlbWVudHMnCiAgICB9OwogICAgLyoqCiAgICAgKiBEZWZpbmVzIGEgc2NoZW1hIHRoYXQgYWxsb3dzIGFueSBwcm9wZXJ0eSBvbiBhbnkgZWxlbWVudC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE5PX0VSUk9SU19TQ0hFTUEgPSB7CiAgICAgICAgbmFtZTogJ25vLWVycm9ycy1zY2hlbWEnCiAgICB9OwogICAgLyoqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgU2FmZVZhbHVlSW1wbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSkgewogICAgICAgICAgICB0aGlzLmNoYW5naW5nVGhpc0JyZWFrc0FwcGxpY2F0aW9uU2VjdXJpdHkgPSBjaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gYFNhZmVWYWx1ZSBtdXN0IHVzZSBbcHJvcGVydHldPWJpbmRpbmc6ICR7dGhpcy5jaGFuZ2luZ1RoaXNCcmVha3NBcHBsaWNhdGlvblNlY3VyaXR5fWAgKwogICAgICAgICAgICAgICAgYCAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFNhZmVIdG1sSW1wbCBleHRlbmRzIFNhZmVWYWx1ZUltcGwgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0VHlwZU5hbWUoKSB7CiAgICAgICAgICAgIHJldHVybiAiSFRNTCIgLyogSHRtbCAqLzsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTYWZlU3R5bGVJbXBsIGV4dGVuZHMgU2FmZVZhbHVlSW1wbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlTmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuICJTdHlsZSIgLyogU3R5bGUgKi87CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgU2FmZVNjcmlwdEltcGwgZXh0ZW5kcyBTYWZlVmFsdWVJbXBsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFR5cGVOYW1lKCkgewogICAgICAgICAgICByZXR1cm4gIlNjcmlwdCIgLyogU2NyaXB0ICovOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFNhZmVVcmxJbXBsIGV4dGVuZHMgU2FmZVZhbHVlSW1wbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlTmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuICJVUkwiIC8qIFVybCAqLzsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTYWZlUmVzb3VyY2VVcmxJbXBsIGV4dGVuZHMgU2FmZVZhbHVlSW1wbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRUeXBlTmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuICJSZXNvdXJjZVVSTCIgLyogUmVzb3VyY2VVcmwgKi87CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdW53cmFwU2FmZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgU2FmZVZhbHVlSW1wbCA/ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUuY2hhbmdpbmdUaGlzQnJlYWtzQXBwbGljYXRpb25TZWN1cml0eSkpKSkgOgogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHZhbHVlLCB0eXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFjdHVhbFR5cGUgPSBnZXRTYW5pdGl6YXRpb25CeXBhc3NUeXBlKHZhbHVlKTsKICAgICAgICBpZiAoYWN0dWFsVHlwZSAhPSBudWxsICYmIGFjdHVhbFR5cGUgIT09IHR5cGUpIHsKICAgICAgICAgICAgLy8gQWxsb3cgUmVzb3VyY2VVUkxzIGluIFVSTCBjb250ZXh0cywgdGhleSBhcmUgc3RyaWN0bHkgbW9yZSB0cnVzdGVkLgogICAgICAgICAgICBpZiAoYWN0dWFsVHlwZSA9PT0gIlJlc291cmNlVVJMIiAvKiBSZXNvdXJjZVVybCAqLyAmJiB0eXBlID09PSAiVVJMIiAvKiBVcmwgKi8pCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZXF1aXJlZCBhIHNhZmUgJHt0eXBlfSwgZ290IGEgJHthY3R1YWxUeXBlfSAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGFjdHVhbFR5cGUgPT09IHR5cGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNhbml0aXphdGlvbkJ5cGFzc1R5cGUodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBTYWZlVmFsdWVJbXBsICYmICgvKiogQHR5cGUgez99ICovICh2YWx1ZS5nZXRUeXBlTmFtZSgpKSkgfHwgbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogTWFyayBgaHRtbGAgc3RyaW5nIGFzIHRydXN0ZWQuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiB3cmFwcyB0aGUgdHJ1c3RlZCBzdHJpbmcgaW4gYFN0cmluZ2AgYW5kIGJyYW5kcyBpdCBpbiBhIHdheSB3aGljaCBtYWtlcyBpdAogICAgICogcmVjb2duaXphYmxlIHRvIHtcQGxpbmsgaHRtbFNhbml0aXplcn0gdG8gYmUgdHJ1c3RlZCBpbXBsaWNpdGx5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdHJ1c3RlZEh0bWwgYGh0bWxgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBhIGBodG1sYCB3aGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICAgICAqLwogICAgZnVuY3Rpb24gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RIdG1sKHRydXN0ZWRIdG1sKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTYWZlSHRtbEltcGwodHJ1c3RlZEh0bWwpOwogICAgfQogICAgLyoqCiAgICAgKiBNYXJrIGBzdHlsZWAgc3RyaW5nIGFzIHRydXN0ZWQuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiB3cmFwcyB0aGUgdHJ1c3RlZCBzdHJpbmcgaW4gYFN0cmluZ2AgYW5kIGJyYW5kcyBpdCBpbiBhIHdheSB3aGljaCBtYWtlcyBpdAogICAgICogcmVjb2duaXphYmxlIHRvIHtcQGxpbmsgc3R5bGVTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRydXN0ZWRTdHlsZSBgc3R5bGVgIHN0cmluZyB3aGljaCBuZWVkcyB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBhIGBzdHlsZWAgaGljaCBoYXMgYmVlbiBicmFuZGVkIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICAgICAqLwogICAgZnVuY3Rpb24gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZSh0cnVzdGVkU3R5bGUpIHsKICAgICAgICByZXR1cm4gbmV3IFNhZmVTdHlsZUltcGwodHJ1c3RlZFN0eWxlKTsKICAgIH0KICAgIC8qKgogICAgICogTWFyayBgc2NyaXB0YCBzdHJpbmcgYXMgdHJ1c3RlZC4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIHdyYXBzIHRoZSB0cnVzdGVkIHN0cmluZyBpbiBgU3RyaW5nYCBhbmQgYnJhbmRzIGl0IGluIGEgd2F5IHdoaWNoIG1ha2VzIGl0CiAgICAgKiByZWNvZ25pemFibGUgdG8ge1xAbGluayBzY3JpcHRTYW5pdGl6ZXJ9IHRvIGJlIHRydXN0ZWQgaW1wbGljaXRseS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRydXN0ZWRTY3JpcHQgYHNjcmlwdGAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICAgICAqIEByZXR1cm4gez99IGEgYHNjcmlwdGAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0KHRydXN0ZWRTY3JpcHQpIHsKICAgICAgICByZXR1cm4gbmV3IFNhZmVTY3JpcHRJbXBsKHRydXN0ZWRTY3JpcHQpOwogICAgfQogICAgLyoqCiAgICAgKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXQKICAgICAqIHJlY29nbml6YWJsZSB0byB7XEBsaW5rIHVybFNhbml0aXplcn0gdG8gYmUgdHJ1c3RlZCBpbXBsaWNpdGx5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdHJ1c3RlZFVybCBgdXJsYCBzdHJpbmcgd2hpY2ggbmVlZHMgdG8gYmUgaW1wbGljaXRseSB0cnVzdGVkLgogICAgICogQHJldHVybiB7P30gYSBgdXJsYCAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0VXJsKHRydXN0ZWRVcmwpIHsKICAgICAgICByZXR1cm4gbmV3IFNhZmVVcmxJbXBsKHRydXN0ZWRVcmwpOwogICAgfQogICAgLyoqCiAgICAgKiBNYXJrIGB1cmxgIHN0cmluZyBhcyB0cnVzdGVkLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gd3JhcHMgdGhlIHRydXN0ZWQgc3RyaW5nIGluIGBTdHJpbmdgIGFuZCBicmFuZHMgaXQgaW4gYSB3YXkgd2hpY2ggbWFrZXMgaXQKICAgICAqIHJlY29nbml6YWJsZSB0byB7XEBsaW5rIHJlc291cmNlVXJsU2FuaXRpemVyfSB0byBiZSB0cnVzdGVkIGltcGxpY2l0bHkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0cnVzdGVkUmVzb3VyY2VVcmwgYHVybGAgc3RyaW5nIHdoaWNoIG5lZWRzIHRvIGJlIGltcGxpY2l0bHkgdHJ1c3RlZC4KICAgICAqIEByZXR1cm4gez99IGEgYHVybGAgd2hpY2ggaGFzIGJlZW4gYnJhbmRlZCB0byBiZSBpbXBsaWNpdGx5IHRydXN0ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0UmVzb3VyY2VVcmwodHJ1c3RlZFJlc291cmNlVXJsKSB7CiAgICAgICAgcmV0dXJuIG5ldyBTYWZlUmVzb3VyY2VVcmxJbXBsKHRydXN0ZWRSZXNvdXJjZVVybCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBUaGlzIGZpbGUgaXMgdXNlZCB0byBjb250cm9sIGlmIHRoZSBkZWZhdWx0IHJlbmRlcmluZyBwaXBlbGluZSBzaG91bGQgYmUgYFZpZXdFbmdpbmVgIG9yIGBJdnlgLgogICAgICoKICAgICAqIEZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBydW4gYW5kIGRlYnVnIHRlc3RzIHdpdGggZWl0aGVyIEl2eSBvciBWaWV3IEVuZ2luZSAobGVnYWN5KSwKICAgICAqIHBsZWFzZSBzZWUgW0JBWkVMLm1kXSguL2RvY3MvQkFaRUwubWQpLgogICAgICovCiAgICBsZXQgX2Rldk1vZGUgPSB0cnVlOwogICAgbGV0IF9ydW5Nb2RlTG9ja2VkID0gZmFsc2U7CiAgICAvKioKICAgICAqIFJldHVybnMgd2hldGhlciBBbmd1bGFyIGlzIGluIGRldmVsb3BtZW50IG1vZGUuIEFmdGVyIGNhbGxlZCBvbmNlLAogICAgICogdGhlIHZhbHVlIGlzIGxvY2tlZCBhbmQgd29uJ3QgY2hhbmdlIGFueSBtb3JlLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRoaXMgaXMgdHJ1ZSwgdW5sZXNzIGEgdXNlciBjYWxscyBgZW5hYmxlUHJvZE1vZGVgIGJlZm9yZSBjYWxsaW5nIHRoaXMuCiAgICAgKgogICAgICogQHB1YmxpY0FwaQogICAgICovCiAgICBmdW5jdGlvbiBpc0Rldk1vZGUoKSB7CiAgICAgICAgX3J1bk1vZGVMb2NrZWQgPSB0cnVlOwogICAgICAgIHJldHVybiBfZGV2TW9kZTsKICAgIH0KICAgIC8qKgogICAgICogRGlzYWJsZSBBbmd1bGFyJ3MgZGV2ZWxvcG1lbnQgbW9kZSwgd2hpY2ggdHVybnMgb2ZmIGFzc2VydGlvbnMgYW5kIG90aGVyCiAgICAgKiBjaGVja3Mgd2l0aGluIHRoZSBmcmFtZXdvcmsuCiAgICAgKgogICAgICogT25lIGltcG9ydGFudCBhc3NlcnRpb24gdGhpcyBkaXNhYmxlcyB2ZXJpZmllcyB0aGF0IGEgY2hhbmdlIGRldGVjdGlvbiBwYXNzCiAgICAgKiBkb2VzIG5vdCByZXN1bHQgaW4gYWRkaXRpb25hbCBjaGFuZ2VzIHRvIGFueSBiaW5kaW5ncyAoYWxzbyBrbm93biBhcwogICAgICogdW5pZGlyZWN0aW9uYWwgZGF0YSBmbG93KS4KICAgICAqCiAgICAgKiBAcHVibGljQXBpCiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuYWJsZVByb2RNb2RlKCkgewogICAgICAgIGlmIChfcnVuTW9kZUxvY2tlZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBlbmFibGUgcHJvZCBtb2RlIGFmdGVyIHBsYXRmb3JtIHNldHVwLicpOwogICAgICAgIH0KICAgICAgICBfZGV2TW9kZSA9IGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL2luZXJ0X2JvZHkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBUaGlzIGhlbHBlciBjbGFzcyBpcyB1c2VkIHRvIGdldCBob2xkIG9mIGFuIGluZXJ0IHRyZWUgb2YgRE9NIGVsZW1lbnRzIGNvbnRhaW5pbmcgZGlydHkgSFRNTAogICAgICogdGhhdCBuZWVkcyBzYW5pdGl6aW5nLgogICAgICogRGVwZW5kaW5nIHVwb24gYnJvd3NlciBzdXBwb3J0IHdlIG11c3QgdXNlIG9uZSBvZiB0aHJlZSBzdHJhdGVnaWVzIGZvciBkb2luZyB0aGlzLgogICAgICogU3VwcG9ydDogU2FmYXJpIDEwLnggLT4gWEhSIHN0cmF0ZWd5CiAgICAgKiBTdXBwb3J0OiBGaXJlZm94IC0+IERvbVBhcnNlciBzdHJhdGVneQogICAgICogRGVmYXVsdDogSW5lcnREb2N1bWVudCBzdHJhdGVneQogICAgICovCiAgICBjbGFzcyBJbmVydEJvZHlIZWxwZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdERvYwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRlZmF1bHREb2MpIHsKICAgICAgICAgICAgdGhpcy5kZWZhdWx0RG9jID0gZGVmYXVsdERvYzsKICAgICAgICAgICAgdGhpcy5pbmVydERvY3VtZW50ID0gdGhpcy5kZWZhdWx0RG9jLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgnc2FuaXRpemF0aW9uLWluZXJ0Jyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGluZXJ0Qm9keUVsZW1lbnQgPSB0aGlzLmluZXJ0RG9jdW1lbnQuYm9keTsKICAgICAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gdXN1YWxseSB0aGVyZSBzaG91bGQgYmUgb25seSBvbmUgYm9keSBlbGVtZW50IGluIHRoZSBkb2N1bWVudCwgYnV0IElFIGRvZXNuJ3QgaGF2ZSBhbnksIHNvCiAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNyZWF0ZSBvbmUuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmVydEh0bWwgPSB0aGlzLmluZXJ0RG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnaHRtbCcpOwogICAgICAgICAgICAgICAgdGhpcy5pbmVydERvY3VtZW50LmFwcGVuZENoaWxkKGluZXJ0SHRtbCk7CiAgICAgICAgICAgICAgICBpbmVydEJvZHlFbGVtZW50ID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2JvZHknKTsKICAgICAgICAgICAgICAgIGluZXJ0SHRtbC5hcHBlbmRDaGlsZChpbmVydEJvZHlFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpbmVydEJvZHlFbGVtZW50LmlubmVySFRNTCA9ICc8c3ZnPjxnIG9ubG9hZD0idGhpcy5wYXJlbnROb2RlLnJlbW92ZSgpIj48L2c+PC9zdmc+JzsKICAgICAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQucXVlcnlTZWxlY3RvciAmJiAhaW5lcnRCb2R5RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcnKSkgewogICAgICAgICAgICAgICAgLy8gV2UganVzdCBoaXQgdGhlIFNhZmFyaSAxMC4xIGJ1ZyAtIHdoaWNoIGFsbG93cyBKUyB0byBydW4gaW5zaWRlIHRoZSBTVkcgRyBlbGVtZW50CiAgICAgICAgICAgICAgICAvLyBzbyB1c2UgdGhlIFhIUiBzdHJhdGVneS4KICAgICAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9YSFI7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaW5lcnRCb2R5RWxlbWVudC5pbm5lckhUTUwgPSAnPHN2Zz48cD48c3R5bGU+PGltZyBzcmM9Ijwvc3R5bGU+PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpLy8iPic7CiAgICAgICAgICAgIGlmIChpbmVydEJvZHlFbGVtZW50LnF1ZXJ5U2VsZWN0b3IgJiYgaW5lcnRCb2R5RWxlbWVudC5xdWVyeVNlbGVjdG9yKCdzdmcgaW1nJykpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGp1c3QgaGl0IHRoZSBGaXJlZm94IGJ1ZyAtIHdoaWNoIHByZXZlbnRzIHRoZSBpbm5lciBpbWcgSlMgZnJvbSBiZWluZyBzYW5pdGl6ZWQKICAgICAgICAgICAgICAgIC8vIHNvIHVzZSB0aGUgRE9NUGFyc2VyIHN0cmF0ZWd5LCBpZiBpdCBpcyBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgRE9NUGFyc2VyIGlzIG5vdCBhdmFpbGFibGUgdGhlbiB3ZSBhcmUgbm90IGluIEZpcmVmb3ggKFNlcnZlci9XZWJXb3JrZXI/KSBzbyB3ZQogICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoIHRvIHRoZSBkZWZhdWx0IHN0cmF0ZWd5IGJlbG93LgogICAgICAgICAgICAgICAgaWYgKGlzRE9NUGFyc2VyQXZhaWxhYmxlKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmdldEluZXJ0Qm9keUVsZW1lbnQgPSB0aGlzLmdldEluZXJ0Qm9keUVsZW1lbnRfRE9NUGFyc2VyOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBOb25lIG9mIHRoZSBidWdzIHdlcmUgaGl0IHNvIGl0IGlzIHNhZmUgZm9yIHVzIHRvIHVzZSB0aGUgZGVmYXVsdCBJbmVydERvY3VtZW50IHN0cmF0ZWd5CiAgICAgICAgICAgIHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudCA9IHRoaXMuZ2V0SW5lcnRCb2R5RWxlbWVudF9JbmVydERvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVc2UgWEhSIHRvIGNyZWF0ZSBhbmQgZmlsbCBhbiBpbmVydCBib2R5IGVsZW1lbnQgKG9uIFNhZmFyaSAxMC4xKQogICAgICAgICAqIFNlZQogICAgICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9jdXJlNTMvRE9NUHVyaWZ5L2Jsb2IvYTk5MmQzYTc1MDMxY2I4YmIwMzJlNWVhODM5OWJhOTcyYmRmOWE2NS9zcmMvcHVyaWZ5LmpzI0w0MzktTDQ0OQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRJbmVydEJvZHlFbGVtZW50X1hIUihodG1sKSB7CiAgICAgICAgICAgIC8vIFdlIGFkZCB0aGVzZSBleHRyYSBlbGVtZW50cyB0byBlbnN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29udGVudCBpcyBwYXJzZWQgYXMgZXhwZWN0ZWQKICAgICAgICAgICAgLy8gZS5nLiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgbWFpbnRhaW5lZCBhbmQgdGFncyBsaWtlIGA8bWV0YT5gIGRvIG5vdCBnZXQgaG9pc3RlZCB0byB0aGUKICAgICAgICAgICAgLy8gYDxoZWFkPmAgdGFnLgogICAgICAgICAgICBodG1sID0gJzxib2R5PjxyZW1vdmU+PC9yZW1vdmU+JyArIGh0bWwgKyAnPC9ib2R5Pic7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBodG1sID0gZW5jb2RlVVJJKGh0bWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB4aHIgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgeGhyLnJlc3BvbnNlVHlwZSA9ICdkb2N1bWVudCc7CiAgICAgICAgICAgIHhoci5vcGVuKCdHRVQnLCAnZGF0YTp0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCwnICsgaHRtbCwgZmFsc2UpOwogICAgICAgICAgICB4aHIuc2VuZCh1bmRlZmluZWQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSB4aHIucmVzcG9uc2UuYm9keTsKICAgICAgICAgICAgYm9keS5yZW1vdmVDaGlsZCgoLyoqIEB0eXBlIHs/fSAqLyAoYm9keS5maXJzdENoaWxkKSkpOwogICAgICAgICAgICByZXR1cm4gYm9keTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIERPTVBhcnNlciB0byBjcmVhdGUgYW5kIGZpbGwgYW4gaW5lcnQgYm9keSBlbGVtZW50IChvbiBGaXJlZm94KQogICAgICAgICAqIFNlZSBodHRwczovL2dpdGh1Yi5jb20vY3VyZTUzL0RPTVB1cmlmeS9yZWxlYXNlcy90YWcvMC42LjcKICAgICAgICAgKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRJbmVydEJvZHlFbGVtZW50X0RPTVBhcnNlcihodG1sKSB7CiAgICAgICAgICAgIC8vIFdlIGFkZCB0aGVzZSBleHRyYSBlbGVtZW50cyB0byBlbnN1cmUgdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29udGVudCBpcyBwYXJzZWQgYXMgZXhwZWN0ZWQKICAgICAgICAgICAgLy8gZS5nLiBsZWFkaW5nIHdoaXRlc3BhY2UgaXMgbWFpbnRhaW5lZCBhbmQgdGFncyBsaWtlIGA8bWV0YT5gIGRvIG5vdCBnZXQgaG9pc3RlZCB0byB0aGUKICAgICAgICAgICAgLy8gYDxoZWFkPmAgdGFnLgogICAgICAgICAgICBodG1sID0gJzxib2R5PjxyZW1vdmU+PC9yZW1vdmU+JyArIGh0bWwgKyAnPC9ib2R5Pic7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBib2R5ID0gKC8qKiBAdHlwZSB7P30gKi8gKG5ldyAoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5ET01QYXJzZXIoKS5wYXJzZUZyb21TdHJpbmcoaHRtbCwgJ3RleHQvaHRtbCcpLmJvZHkpKTsKICAgICAgICAgICAgICAgIGJvZHkucmVtb3ZlQ2hpbGQoKC8qKiBAdHlwZSB7P30gKi8gKGJvZHkuZmlyc3RDaGlsZCkpKTsKICAgICAgICAgICAgICAgIHJldHVybiBib2R5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIGFuIEhUTUw1IGB0ZW1wbGF0ZWAgZWxlbWVudCwgaWYgc3VwcG9ydGVkLCBvciBhbiBpbmVydCBib2R5IGVsZW1lbnQgY3JlYXRlZCB2aWEKICAgICAgICAgKiBgY3JlYXRlSHRtbERvY3VtZW50YCB0byBjcmVhdGUgYW5kIGZpbGwgYW4gaW5lcnQgRE9NIGVsZW1lbnQuCiAgICAgICAgICogVGhpcyBpcyB0aGUgZGVmYXVsdCBzYW5lIHN0cmF0ZWd5IHRvIHVzZSBpZiB0aGUgYnJvd3NlciBkb2VzIG5vdCByZXF1aXJlIG9uZSBvZiB0aGUgc3BlY2lhbGlzZWQKICAgICAgICAgKiBzdHJhdGVnaWVzIGFib3ZlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBodG1sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRJbmVydEJvZHlFbGVtZW50X0luZXJ0RG9jdW1lbnQoaHRtbCkgewogICAgICAgICAgICAvLyBQcmVmZXIgdXNpbmcgPHRlbXBsYXRlPiBlbGVtZW50IGlmIHN1cHBvcnRlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUVsID0gdGhpcy5pbmVydERvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RlbXBsYXRlJyk7CiAgICAgICAgICAgIGlmICgnY29udGVudCcgaW4gdGVtcGxhdGVFbCkgewogICAgICAgICAgICAgICAgdGVtcGxhdGVFbC5pbm5lckhUTUwgPSBodG1sOwogICAgICAgICAgICAgICAgcmV0dXJuIHRlbXBsYXRlRWw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHByZXZpb3VzbHkgd2UgdXNlZCB0byBkbyBzb21ldGhpbmcgbGlrZSBgdGhpcy5pbmVydERvY3VtZW50LmJvZHkuaW5uZXJIVE1MID0gaHRtbGAKICAgICAgICAgICAgLy8gYW5kIHdlIHJldHVybmVkIHRoZSBpbmVydCBgYm9keWAgbm9kZS4gVGhpcyB3YXMgY2hhbmdlZCwgYmVjYXVzZSBJRSBzZWVtcyB0byB0cmVhdCBzZXR0aW5nCiAgICAgICAgICAgIC8vIGBpbm5lckhUTUxgIG9uIGFuIGluc2VydGVkIGVsZW1lbnQgZGlmZmVyZW50bHksIGNvbXBhcmVkIHRvIG9uZSB0aGF0IGhhc24ndCBiZWVuIGluc2VydGVkCiAgICAgICAgICAgIC8vIHlldC4gSW4gcGFydGljdWxhciwgSUUgYXBwZWFycyB0byBzcGxpdCBzb21lIG9mIHRoZSB0ZXh0IGludG8gbXVsdGlwbGUgdGV4dCBub2RlcyByYXRoZXIKICAgICAgICAgICAgLy8gdGhhbiBrZWVwaW5nIHRoZW0gaW4gYSBzaW5nbGUgb25lIHdoaWNoIGVuZHMgdXAgbWVzc2luZyB3aXRoIEl2eSdzIGkxOG4gcGFyc2luZyBmdXJ0aGVyCiAgICAgICAgICAgIC8vIGRvd24gdGhlIGxpbmUuIFRoaXMgaGFzIGJlZW4gd29ya2VkIGFyb3VuZCBieSBjcmVhdGluZyBhIG5ldyBpbmVydCBgYm9keWAgYW5kIHVzaW5nIGl0IGFzCiAgICAgICAgICAgIC8vIHRoZSByb290IG5vZGUgaW4gd2hpY2ggd2UgaW5zZXJ0IHRoZSBIVE1MLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZXJ0Qm9keSA9IHRoaXMuaW5lcnREb2N1bWVudC5jcmVhdGVFbGVtZW50KCdib2R5Jyk7CiAgICAgICAgICAgIGluZXJ0Qm9keS5pbm5lckhUTUwgPSBodG1sOwogICAgICAgICAgICAvLyBTdXBwb3J0OiBJRSA5LTExIG9ubHkKICAgICAgICAgICAgLy8gc3RyaXAgY3VzdG9tLW5hbWVzcGFjZWQgYXR0cmlidXRlcyBvbiBJRTw9MTEKICAgICAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5kZWZhdWx0RG9jKSkpLmRvY3VtZW50TW9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5zdHJpcEN1c3RvbU5zQXR0cnMoaW5lcnRCb2R5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaW5lcnRCb2R5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIElFOS0xMSBjb21lcyBhY3Jvc3MgYW4gdW5rbm93biBuYW1lc3BhY2VkIGF0dHJpYnV0ZSBlLmcuICd4bGluazpmb28nIGl0IGFkZHMgJ3htbG5zOm5zMScKICAgICAgICAgKiBhdHRyaWJ1dGUgdG8gZGVjbGFyZSBuczEgbmFtZXNwYWNlIGFuZCBwcmVmaXhlcyB0aGUgYXR0cmlidXRlIHdpdGggJ25zMScgKGUuZy4KICAgICAgICAgKiAnbnMxOnhsaW5rOmZvbycpLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyB1bmRlc2lyYWJsZSBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGFsbG93IGFueSBvZiB0aGVzZSBjdXN0b20gYXR0cmlidXRlcy4gVGhpcyBtZXRob2QKICAgICAgICAgKiBzdHJpcHMgdGhlbSBhbGwuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdHJpcEN1c3RvbU5zQXR0cnMoZWwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbEF0dHJzID0gZWwuYXR0cmlidXRlczsKICAgICAgICAgICAgLy8gbG9vcCBiYWNrd2FyZHMgc28gdGhhdCB3ZSBjYW4gc3VwcG9ydCByZW1vdmFscy4KICAgICAgICAgICAgZm9yIChsZXQgaSA9IGVsQXR0cnMubGVuZ3RoIC0gMTsgMCA8IGk7IGktLSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYXR0cmliID0gZWxBdHRycy5pdGVtKGkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cmliKSkubmFtZTsKICAgICAgICAgICAgICAgIGlmIChhdHRyTmFtZSA9PT0gJ3htbG5zOm5zMScgfHwgYXR0ck5hbWUuaW5kZXhPZignbnMxOicpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjaGlsZE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWwuZmlyc3RDaGlsZCkpOwogICAgICAgICAgICB3aGlsZSAoY2hpbGROb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoY2hpbGROb2RlLm5vZGVUeXBlID09PSBOb2RlLkVMRU1FTlRfTk9ERSkKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0cmlwQ3VzdG9tTnNBdHRycygoLyoqIEB0eXBlIHs/fSAqLyAoY2hpbGROb2RlKSkpOwogICAgICAgICAgICAgICAgY2hpbGROb2RlID0gY2hpbGROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXZSBuZWVkIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBET01QYXJzZXIgZXhpc3RzIGluIHRoZSBnbG9iYWwgY29udGV4dC4KICAgICAqIFRoZSB0cnktY2F0Y2ggaXMgYmVjYXVzZSwgb24gc29tZSBicm93c2VycywgdHJ5aW5nIHRvIGFjY2VzcyB0aGlzIHByb3BlcnR5CiAgICAgKiBvbiB3aW5kb3cgY2FuIGFjdHVhbGx5IHRocm93IGFuIGVycm9yLgogICAgICoKICAgICAqIEBzdXBwcmVzcyB7dXNlbGVzc0NvZGV9CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0RPTVBhcnNlckF2YWlsYWJsZSgpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICByZXR1cm4gISEoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5ET01QYXJzZXI7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChfYSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3VybF9zYW5pdGl6ZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBIHBhdHRlcm4gdGhhdCByZWNvZ25pemVzIGEgY29tbW9ubHkgdXNlZnVsIHN1YnNldCBvZiBVUkxzIHRoYXQgYXJlIHNhZmUuCiAgICAgKgogICAgICogVGhpcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlcyBhIHN1YnNldCBvZiBVUkxzIHRoYXQgd2lsbCBub3QgY2F1c2Ugc2NyaXB0CiAgICAgKiBleGVjdXRpb24gaWYgdXNlZCBpbiBVUkwgY29udGV4dCB3aXRoaW4gYSBIVE1MIGRvY3VtZW50LiBTcGVjaWZpY2FsbHksIHRoaXMKICAgICAqIHJlZ3VsYXIgZXhwcmVzc2lvbiBtYXRjaGVzIGlmIChjb21tZW50IGZyb20gaGVyZSBvbiBhbmQgcmVnZXggY29waWVkIGZyb20KICAgICAqIFNveSdzIEVzY2FwaW5nQ29udmVudGlvbnMpOgogICAgICogKDEpIEVpdGhlciBhbiBhbGxvd2VkIHByb3RvY29sIChodHRwLCBodHRwcywgbWFpbHRvIG9yIGZ0cCkuCiAgICAgKiAoMikgb3Igbm8gcHJvdG9jb2wuICBBIHByb3RvY29sIG11c3QgYmUgZm9sbG93ZWQgYnkgYSBjb2xvbi4gVGhlIGJlbG93CiAgICAgKiAgICAgYWxsb3dzIHRoYXQgYnkgYWxsb3dpbmcgY29sb25zIG9ubHkgYWZ0ZXIgb25lIG9mIHRoZSBjaGFyYWN0ZXJzIFsvPyNdLgogICAgICogICAgIEEgY29sb24gYWZ0ZXIgYSBoYXNoICgjKSBtdXN0IGJlIGluIHRoZSBmcmFnbWVudC4KICAgICAqICAgICBPdGhlcndpc2UsIGEgY29sb24gYWZ0ZXIgYSAoPykgbXVzdCBiZSBpbiBhIHF1ZXJ5LgogICAgICogICAgIE90aGVyd2lzZSwgYSBjb2xvbiBhZnRlciBhIHNpbmdsZSBzb2xpZHVzICgvKSBtdXN0IGJlIGluIGEgcGF0aC4KICAgICAqICAgICBPdGhlcndpc2UsIGEgY29sb24gYWZ0ZXIgYSBkb3VibGUgc29saWR1cyAoLy8pIG11c3QgYmUgaW4gdGhlIGF1dGhvcml0eQogICAgICogICAgIChiZWZvcmUgcG9ydCkuCiAgICAgKgogICAgICogVGhlIHBhdHRlcm4gZGlzYWxsb3dzICYsIHVzZWQgaW4gSFRNTCBlbnRpdHkgZGVjbGFyYXRpb25zIGJlZm9yZQogICAgICogb25lIG9mIHRoZSBjaGFyYWN0ZXJzIGluIFsvPyNdLiBUaGlzIGRpc2FsbG93cyBIVE1MIGVudGl0aWVzIHVzZWQgaW4gdGhlCiAgICAgKiBwcm90b2NvbCBuYW1lLCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuLCBlLmcuICJoJiMxMTY7dHAiIGZvciAiaHR0cCIuCiAgICAgKiBJdCBhbHNvIGRpc2FsbG93cyBIVE1MIGVudGl0aWVzIGluIHRoZSBmaXJzdCBwYXRoIHBhcnQgb2YgYSByZWxhdGl2ZSBwYXRoLAogICAgICogZS5nLiAiZm9vJmx0O2Jhci9iYXoiLiAgT3VyIGV4aXN0aW5nIGVzY2FwaW5nIGZ1bmN0aW9ucyBzaG91bGQgbm90IHByb2R1Y2UKICAgICAqIHRoYXQuIE1vcmUgaW1wb3J0YW50bHksIGl0IGRpc2FsbG93cyBtYXNraW5nIG9mIGEgY29sb24sCiAgICAgKiBlLmcuICJqYXZhc2NyaXB0JiM1ODsuLi4iLgogICAgICoKICAgICAqIFRoaXMgcmVndWxhciBleHByZXNzaW9uIHdhcyB0YWtlbiBmcm9tIHRoZSBDbG9zdXJlIHNhbml0aXphdGlvbiBsaWJyYXJ5LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFNBRkVfVVJMX1BBVFRFUk4gPSAvXig/Oig/Omh0dHBzP3xtYWlsdG98ZnRwfHRlbHxmaWxlKTp8W14mOi8/I10qKD86Wy8/I118JCkpL2dpOwogICAgLyoqCiAgICAgKiBBIHBhdHRlcm4gdGhhdCBtYXRjaGVzIHNhZmUgZGF0YSBVUkxzLiBPbmx5IG1hdGNoZXMgaW1hZ2UsIHZpZGVvIGFuZCBhdWRpbyB0eXBlcy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBEQVRBX1VSTF9QQVRURVJOID0gL15kYXRhOig/OmltYWdlXC8oPzpibXB8Z2lmfGpwZWd8anBnfHBuZ3x0aWZmfHdlYnApfHZpZGVvXC8oPzptcGVnfG1wNHxvZ2d8d2VibSl8YXVkaW9cLyg/Om1wM3xvZ2F8b2dnfG9wdXMpKTtiYXNlNjQsW2EtejAtOStcL10rPSokL2k7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfc2FuaXRpemVVcmwodXJsKSB7CiAgICAgICAgdXJsID0gU3RyaW5nKHVybCk7CiAgICAgICAgaWYgKHVybC5tYXRjaChTQUZFX1VSTF9QQVRURVJOKSB8fCB1cmwubWF0Y2goREFUQV9VUkxfUEFUVEVSTikpCiAgICAgICAgICAgIHJldHVybiB1cmw7CiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybihgV0FSTklORzogc2FuaXRpemluZyB1bnNhZmUgVVJMIHZhbHVlICR7dXJsfSAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcylgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICd1bnNhZmU6JyArIHVybDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzcmNzZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNhbml0aXplU3Jjc2V0KHNyY3NldCkgewogICAgICAgIHNyY3NldCA9IFN0cmluZyhzcmNzZXQpOwogICAgICAgIHJldHVybiBzcmNzZXQuc3BsaXQoJywnKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3Jjc2V0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoc3Jjc2V0KSA9PiBfc2FuaXRpemVVcmwoc3Jjc2V0LnRyaW0oKSkpKS5qb2luKCcsICcpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL2h0bWxfc2FuaXRpemVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0YWdTZXQodGFncykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IHQgb2YgdGFncy5zcGxpdCgnLCcpKQogICAgICAgICAgICByZXNbdF0gPSB0cnVlOwogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Li4uP30gc2V0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWVyZ2UkMSguLi5zZXRzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlcyA9IHt9OwogICAgICAgIGZvciAoY29uc3QgcyBvZiBzZXRzKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgdiBpbiBzKSB7CiAgICAgICAgICAgICAgICBpZiAocy5oYXNPd25Qcm9wZXJ0eSh2KSkKICAgICAgICAgICAgICAgICAgICByZXNbdl0gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICAvLyBHb29kIHNvdXJjZSBvZiBpbmZvIGFib3V0IGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzCiAgICAvLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjc2VtYW50aWNzCiAgICAvLyBodHRwOi8vc2ltb24uaHRtbDUub3JnL2h0bWwtZWxlbWVudHMKICAgIC8vIFNhZmUgVm9pZCBFbGVtZW50cyAtIEhUTUw1CiAgICAvLyBodHRwOi8vZGV2LnczLm9yZy9odG1sNS9zcGVjL092ZXJ2aWV3Lmh0bWwjdm9pZC1lbGVtZW50cwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVk9JRF9FTEVNRU5UUyA9IHRhZ1NldCgnYXJlYSxicixjb2wsaHIsaW1nLHdicicpOwogICAgLy8gRWxlbWVudHMgdGhhdCB5b3UgY2FuLCBpbnRlbnRpb25hbGx5LCBsZWF2ZSBvcGVuIChhbmQgd2hpY2ggY2xvc2UgdGhlbXNlbHZlcykKICAgIC8vIGh0dHA6Ly9kZXYudzMub3JnL2h0bWw1L3NwZWMvT3ZlcnZpZXcuaHRtbCNvcHRpb25hbC10YWdzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBPUFRJT05BTF9FTkRfVEFHX0JMT0NLX0VMRU1FTlRTID0gdGFnU2V0KCdjb2xncm91cCxkZCxkdCxsaSxwLHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRyJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBPUFRJT05BTF9FTkRfVEFHX0lOTElORV9FTEVNRU5UUyA9IHRhZ1NldCgncnAscnQnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE9QVElPTkFMX0VORF9UQUdfRUxFTUVOVFMgPSBtZXJnZSQxKE9QVElPTkFMX0VORF9UQUdfSU5MSU5FX0VMRU1FTlRTLCBPUFRJT05BTF9FTkRfVEFHX0JMT0NLX0VMRU1FTlRTKTsKICAgIC8vIFNhZmUgQmxvY2sgRWxlbWVudHMgLSBIVE1MNQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQkxPQ0tfRUxFTUVOVFMgPSBtZXJnZSQxKE9QVElPTkFMX0VORF9UQUdfQkxPQ0tfRUxFTUVOVFMsIHRhZ1NldCgnYWRkcmVzcyxhcnRpY2xlLCcgKwogICAgICAgICdhc2lkZSxibG9ja3F1b3RlLGNhcHRpb24sY2VudGVyLGRlbCxkZXRhaWxzLGRpYWxvZyxkaXIsZGl2LGRsLGZpZ3VyZSxmaWdjYXB0aW9uLGZvb3RlcixoMSxoMixoMyxoNCxoNSwnICsKICAgICAgICAnaDYsaGVhZGVyLGhncm91cCxocixpbnMsbWFpbixtYXAsbWVudSxuYXYsb2wscHJlLHNlY3Rpb24sc3VtbWFyeSx0YWJsZSx1bCcpKTsKICAgIC8vIElubGluZSBFbGVtZW50cyAtIEhUTUw1CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBJTkxJTkVfRUxFTUVOVFMgPSBtZXJnZSQxKE9QVElPTkFMX0VORF9UQUdfSU5MSU5FX0VMRU1FTlRTLCB0YWdTZXQoJ2EsYWJicixhY3JvbnltLGF1ZGlvLGIsJyArCiAgICAgICAgJ2JkaSxiZG8sYmlnLGJyLGNpdGUsY29kZSxkZWwsZGZuLGVtLGZvbnQsaSxpbWcsaW5zLGtiZCxsYWJlbCxtYXAsbWFyayxwaWN0dXJlLHEscnVieSxycCxydCxzLCcgKwogICAgICAgICdzYW1wLHNtYWxsLHNvdXJjZSxzcGFuLHN0cmlrZSxzdHJvbmcsc3ViLHN1cCx0aW1lLHRyYWNrLHR0LHUsdmFyLHZpZGVvJykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVkFMSURfRUxFTUVOVFMgPSBtZXJnZSQxKFZPSURfRUxFTUVOVFMsIEJMT0NLX0VMRU1FTlRTLCBJTkxJTkVfRUxFTUVOVFMsIE9QVElPTkFMX0VORF9UQUdfRUxFTUVOVFMpOwogICAgLy8gQXR0cmlidXRlcyB0aGF0IGhhdmUgaHJlZiBhbmQgaGVuY2UgbmVlZCB0byBiZSBzYW5pdGl6ZWQKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFVSSV9BVFRSUyA9IHRhZ1NldCgnYmFja2dyb3VuZCxjaXRlLGhyZWYsaXRlbXR5cGUsbG9uZ2Rlc2MscG9zdGVyLHNyYyx4bGluazpocmVmJyk7CiAgICAvLyBBdHRyaWJ1dGVzIHRoYXQgaGF2ZSBzcGVjaWFsIGhyZWYgc2V0IGhlbmNlIG5lZWQgdG8gYmUgc2FuaXRpemVkCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTUkNTRVRfQVRUUlMgPSB0YWdTZXQoJ3NyY3NldCcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSFRNTF9BVFRSUyA9IHRhZ1NldCgnYWJicixhY2Nlc3NrZXksYWxpZ24sYWx0LGF1dG9wbGF5LGF4aXMsYmdjb2xvcixib3JkZXIsY2VsbHBhZGRpbmcsY2VsbHNwYWNpbmcsY2xhc3MsY2xlYXIsY29sb3IsY29scyxjb2xzcGFuLCcgKwogICAgICAgICdjb21wYWN0LGNvbnRyb2xzLGNvb3JkcyxkYXRldGltZSxkZWZhdWx0LGRpcixkb3dubG9hZCxmYWNlLGhlYWRlcnMsaGVpZ2h0LGhpZGRlbixocmVmbGFuZyxoc3BhY2UsJyArCiAgICAgICAgJ2lzbWFwLGl0ZW1zY29wZSxpdGVtcHJvcCxraW5kLGxhYmVsLGxhbmcsbGFuZ3VhZ2UsbG9vcCxtZWRpYSxtdXRlZCxub2hyZWYsbm93cmFwLG9wZW4scHJlbG9hZCxyZWwscmV2LHJvbGUscm93cyxyb3dzcGFuLHJ1bGVzLCcgKwogICAgICAgICdzY29wZSxzY3JvbGxpbmcsc2hhcGUsc2l6ZSxzaXplcyxzcGFuLHNyY2xhbmcsc3RhcnQsc3VtbWFyeSx0YWJpbmRleCx0YXJnZXQsdGl0bGUsdHJhbnNsYXRlLHR5cGUsdXNlbWFwLCcgKwogICAgICAgICd2YWxpZ24sdmFsdWUsdnNwYWNlLHdpZHRoJyk7CiAgICAvLyBBY2Nlc3NpYmlsaXR5IGF0dHJpYnV0ZXMgYXMgcGVyIFdBSS1BUklBIDEuMSAoVzNDIFdvcmtpbmcgRHJhZnQgMTQgRGVjZW1iZXIgMjAxOCkKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEFSSUFfQVRUUlMgPSB0YWdTZXQoJ2FyaWEtYWN0aXZlZGVzY2VuZGFudCxhcmlhLWF0b21pYyxhcmlhLWF1dG9jb21wbGV0ZSxhcmlhLWJ1c3ksYXJpYS1jaGVja2VkLGFyaWEtY29sY291bnQsYXJpYS1jb2xpbmRleCwnICsKICAgICAgICAnYXJpYS1jb2xzcGFuLGFyaWEtY29udHJvbHMsYXJpYS1jdXJyZW50LGFyaWEtZGVzY3JpYmVkYnksYXJpYS1kZXRhaWxzLGFyaWEtZGlzYWJsZWQsYXJpYS1kcm9wZWZmZWN0LCcgKwogICAgICAgICdhcmlhLWVycm9ybWVzc2FnZSxhcmlhLWV4cGFuZGVkLGFyaWEtZmxvd3RvLGFyaWEtZ3JhYmJlZCxhcmlhLWhhc3BvcHVwLGFyaWEtaGlkZGVuLGFyaWEtaW52YWxpZCwnICsKICAgICAgICAnYXJpYS1rZXlzaG9ydGN1dHMsYXJpYS1sYWJlbCxhcmlhLWxhYmVsbGVkYnksYXJpYS1sZXZlbCxhcmlhLWxpdmUsYXJpYS1tb2RhbCxhcmlhLW11bHRpbGluZSwnICsKICAgICAgICAnYXJpYS1tdWx0aXNlbGVjdGFibGUsYXJpYS1vcmllbnRhdGlvbixhcmlhLW93bnMsYXJpYS1wbGFjZWhvbGRlcixhcmlhLXBvc2luc2V0LGFyaWEtcHJlc3NlZCxhcmlhLXJlYWRvbmx5LCcgKwogICAgICAgICdhcmlhLXJlbGV2YW50LGFyaWEtcmVxdWlyZWQsYXJpYS1yb2xlZGVzY3JpcHRpb24sYXJpYS1yb3djb3VudCxhcmlhLXJvd2luZGV4LGFyaWEtcm93c3BhbixhcmlhLXNlbGVjdGVkLCcgKwogICAgICAgICdhcmlhLXNldHNpemUsYXJpYS1zb3J0LGFyaWEtdmFsdWVtYXgsYXJpYS12YWx1ZW1pbixhcmlhLXZhbHVlbm93LGFyaWEtdmFsdWV0ZXh0Jyk7CiAgICAvLyBOQjogVGhpcyBjdXJyZW50bHkgY29uc2Npb3VzbHkgZG9lc24ndCBzdXBwb3J0IFNWRy4gU1ZHIHNhbml0aXphdGlvbiBoYXMgaGFkIHNldmVyYWwgc2VjdXJpdHkKICAgIC8vIGlzc3VlcyBpbiB0aGUgcGFzdCwgc28gaXQgc2VlbXMgc2FmZXIgdG8gbGVhdmUgaXQgb3V0IGlmIHBvc3NpYmxlLiBJZiBzdXBwb3J0IGZvciBiaW5kaW5nIFNWRyB2aWEKICAgIC8vIGlubmVySFRNTCBpcyByZXF1aXJlZCwgU1ZHIGF0dHJpYnV0ZXMgc2hvdWxkIGJlIGFkZGVkIGhlcmUuCiAgICAvLyBOQjogU2FuaXRpemF0aW9uIGRvZXMgbm90IGFsbG93IDxmb3JtPiBlbGVtZW50cyBvciBvdGhlciBhY3RpdmUgZWxlbWVudHMgKDxidXR0b24+IGV0YykuIFRob3NlCiAgICAvLyBjYW4gYmUgc2FuaXRpemVkLCBidXQgdGhleSBpbmNyZWFzZSBzZWN1cml0eSBzdXJmYWNlIGFyZWEgd2l0aG91dCBhIGxlZ2l0aW1hdGUgdXNlIGNhc2UsIHNvIHRoZXkKICAgIC8vIGFyZSBsZWZ0IG91dCBoZXJlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVkFMSURfQVRUUlMgPSBtZXJnZSQxKFVSSV9BVFRSUywgU1JDU0VUX0FUVFJTLCBIVE1MX0FUVFJTLCBBUklBX0FUVFJTKTsKICAgIC8vIEVsZW1lbnRzIHdob3NlIGNvbnRlbnQgc2hvdWxkIG5vdCBiZSB0cmF2ZXJzZWQvcHJlc2VydmVkLCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgaW52YWxpZC4KICAgIC8vCiAgICAvLyBUeXBpY2FsbHksIGA8aW52YWxpZD5Tb21lIGNvbnRlbnQ8L2ludmFsaWQ+YCB3b3VsZCB0cmF2ZXJzZSAoYW5kIGluIHRoaXMgY2FzZSBwcmVzZXJ2ZSkKICAgIC8vIGBTb21lIGNvbnRlbnRgLCBidXQgc3RyaXAgYGludmFsaWQtZWxlbWVudGAgb3BlbmluZy9jbG9zaW5nIHRhZ3MuIEZvciBzb21lIGVsZW1lbnRzLCB0aG91Z2gsIHdlCiAgICAvLyBkb24ndCB3YW50IHRvIHByZXNlcnZlIHRoZSBjb250ZW50LCBpZiB0aGUgZWxlbWVudHMgdGhlbXNlbHZlcyBhcmUgZ29pbmcgdG8gYmUgcmVtb3ZlZC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNLSVBfVFJBVkVSU0lOR19DT05URU5UX0lGX0lOVkFMSURfRUxFTUVOVFMgPSB0YWdTZXQoJ3NjcmlwdCxzdHlsZSx0ZW1wbGF0ZScpOwogICAgLyoqCiAgICAgKiBTYW5pdGl6aW5nSHRtbFNlcmlhbGl6ZXIgc2VyaWFsaXplcyBhIERPTSBmcmFnbWVudCwgc3RyaXBwaW5nIG91dCBhbnkgdW5zYWZlIGVsZW1lbnRzIGFuZCB1bnNhZmUKICAgICAqIGF0dHJpYnV0ZXMuCiAgICAgKi8KICAgIGNsYXNzIFNhbml0aXppbmdIdG1sU2VyaWFsaXplciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgdHJhY2sgaWYgc29tZXRoaW5nIHdhcyBzdHJpcHBlZCwgdG8gYXZvaWQgYWNjaWRlbnRhbGx5IHdhcm5pbmcgb2Ygc2FuaXRpemF0aW9uIGp1c3QKICAgICAgICAgICAgLy8gYmVjYXVzZSBjaGFyYWN0ZXJzIHdlcmUgcmUtZW5jb2RlZC4KICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5idWYgPSBbXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2FuaXRpemVDaGlsZHJlbihlbCkgewogICAgICAgICAgICAvLyBUaGlzIGNhbm5vdCB1c2UgYSBUcmVlV2Fsa2VyLCBhcyBpdCBoYXMgdG8gcnVuIG9uIEFuZ3VsYXIncyB2YXJpb3VzIERPTSBhZGFwdGVycy4KICAgICAgICAgICAgLy8gSG93ZXZlciB0aGlzIGNvZGUgbmV2ZXIgYWNjZXNzZXMgcHJvcGVydGllcyBvZmYgb2YgYGRvY3VtZW50YCBiZWZvcmUgZGVsZXRpbmcgaXRzIGNvbnRlbnRzCiAgICAgICAgICAgIC8vIGFnYWluLCBzbyBpdCBzaG91bGRuJ3QgYmUgdnVsbmVyYWJsZSB0byBET00gY2xvYmJlcmluZy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY3VycmVudCA9ICgvKiogQHR5cGUgez99ICovIChlbC5maXJzdENoaWxkKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHRyYXZlcnNlQ29udGVudCA9IHRydWU7CiAgICAgICAgICAgIHdoaWxlIChjdXJyZW50KSB7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgICAgICB0cmF2ZXJzZUNvbnRlbnQgPSB0aGlzLnN0YXJ0RWxlbWVudCgoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1cnJlbnQubm9kZVR5cGUgPT09IE5vZGUuVEVYVF9OT0RFKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGFycygoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudC5ub2RlVmFsdWUpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBTdHJpcCBub24tZWxlbWVudCwgbm9uLXRleHQgbm9kZXMuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zYW5pdGl6ZWRTb21ldGhpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRyYXZlcnNlQ29udGVudCAmJiBjdXJyZW50LmZpcnN0Q2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQuZmlyc3RDaGlsZCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBMZWF2aW5nIHRoZSBlbGVtZW50LiBXYWxrIHVwIGFuZCB0byB0aGUgcmlnaHQsIGNsb3NpbmcgdGFncyBhcyB3ZSBnby4KICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmRFbGVtZW50KCgvKiogQHR5cGUgez99ICovIChjdXJyZW50KSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IG5leHQgPSB0aGlzLmNoZWNrQ2xvYmJlcmVkRWxlbWVudChjdXJyZW50LCAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudC5uZXh0U2libGluZykpKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gbmV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSB0aGlzLmNoZWNrQ2xvYmJlcmVkRWxlbWVudChjdXJyZW50LCAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudC5wYXJlbnROb2RlKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1Zi5qb2luKCcnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2FuaXRpemVzIGFuIG9wZW5pbmcgZWxlbWVudCB0YWcgKGlmIHZhbGlkKSBhbmQgcmV0dXJucyB3aGV0aGVyIHRoZSBlbGVtZW50J3MgY29udGVudHMgc2hvdWxkCiAgICAgICAgICogYmUgdHJhdmVyc2VkLiBFbGVtZW50IGNvbnRlbnQgbXVzdCBhbHdheXMgYmUgdHJhdmVyc2VkIChldmVuIGlmIHRoZSBlbGVtZW50IGl0c2VsZiBpcyBub3QKICAgICAgICAgKiB2YWxpZC9zYWZlKSwgdW5sZXNzIHRoZSBlbGVtZW50IGlzIG9uZSBvZiBgU0tJUF9UUkFWRVJTSU5HX0NPTlRFTlRfSUZfSU5WQUxJRF9FTEVNRU5UU2AuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgZWxlbWVudCB0byBzYW5pdGl6ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoZSBlbGVtZW50J3MgY29udGVudHMgc2hvdWxkIGJlIHRyYXZlcnNlZC4KICAgICAgICAgKi8KICAgICAgICBzdGFydEVsZW1lbnQoZWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGlmICghVkFMSURfRUxFTUVOVFMuaGFzT3duUHJvcGVydHkodGFnTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2FuaXRpemVkU29tZXRoaW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHJldHVybiAhU0tJUF9UUkFWRVJTSU5HX0NPTlRFTlRfSUZfSU5WQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCc8Jyk7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2godGFnTmFtZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxBdHRycyA9IGVsZW1lbnQuYXR0cmlidXRlczsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbEF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbEF0dHIgPSBlbEF0dHJzLml0ZW0oaSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChlbEF0dHIpKS5uYW1lOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbG93ZXIgPSBhdHRyTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9BVFRSUy5oYXNPd25Qcm9wZXJ0eShsb3dlcikpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNhbml0aXplZFNvbWV0aGluZyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWxBdHRyKSkudmFsdWU7CiAgICAgICAgICAgICAgICAvLyBUT0RPKG1hcnRpbnByb2JzdCk6IFNwZWNpYWwgY2FzZSBpbWFnZSBVUklzIGZvciBkYXRhOmltYWdlLy4uLgogICAgICAgICAgICAgICAgaWYgKFVSSV9BVFRSU1tsb3dlcl0pCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBfc2FuaXRpemVVcmwodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlcl0pCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBzYW5pdGl6ZVNyY3NldCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCcgJywgYXR0ck5hbWUsICc9IicsIGVuY29kZUVudGl0aWVzKHZhbHVlKSwgJyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCc+Jyk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZW5kRWxlbWVudChjdXJyZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGFnTmFtZSA9IGN1cnJlbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgaWYgKFZBTElEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpICYmICFWT0lEX0VMRU1FTlRTLmhhc093blByb3BlcnR5KHRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmJ1Zi5wdXNoKCc8LycpOwogICAgICAgICAgICAgICAgdGhpcy5idWYucHVzaCh0YWdOYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goJz4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY2hhcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNoYXJzKGNoYXJzKSB7CiAgICAgICAgICAgIHRoaXMuYnVmLnB1c2goZW5jb2RlRW50aXRpZXMoY2hhcnMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXh0Tm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2hlY2tDbG9iYmVyZWRFbGVtZW50KG5vZGUsIG5leHROb2RlKSB7CiAgICAgICAgICAgIGlmIChuZXh0Tm9kZSAmJgogICAgICAgICAgICAgICAgKG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dE5vZGUpICYKICAgICAgICAgICAgICAgICAgICBOb2RlLkRPQ1VNRU5UX1BPU0lUSU9OX0NPTlRBSU5FRF9CWSkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fQ09OVEFJTkVEX0JZKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBzYW5pdGl6ZSBodG1sIGJlY2F1c2UgdGhlIGVsZW1lbnQgaXMgY2xvYmJlcmVkOiAkeygoLyoqIEB0eXBlIHs/fSAqLyAobm9kZSkpKS5vdXRlckhUTUx9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5leHROb2RlOwogICAgICAgIH0KICAgIH0KICAgIC8vIFJlZ3VsYXIgRXhwcmVzc2lvbnMgZm9yIHBhcnNpbmcgdGFncyBhbmQgYXR0cmlidXRlcwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1VSUk9HQVRFX1BBSVJfUkVHRVhQID0gL1tcdUQ4MDAtXHVEQkZGXVtcdURDMDAtXHVERkZGXS9nOwogICAgLy8gISB0byB+IGlzIHRoZSBBU0NJSSByYW5nZS4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5PTl9BTFBIQU5VTUVSSUNfUkVHRVhQID0gLyhbXlwjLX4gfCFdKS9nOwogICAgLyoqCiAgICAgKiBFc2NhcGVzIGFsbCBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY2hhcmFjdGVycywgc28gdGhhdCB0aGUKICAgICAqIHJlc3VsdGluZyBzdHJpbmcgY2FuIGJlIHNhZmVseSBpbnNlcnRlZCBpbnRvIGF0dHJpYnV0ZSBvcgogICAgICogZWxlbWVudCB0ZXh0LgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZW5jb2RlRW50aXRpZXModmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvJi9nLCAnJmFtcDsnKQogICAgICAgICAgICAucmVwbGFjZShTVVJST0dBVEVfUEFJUl9SRUdFWFAsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1hdGNoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAobWF0Y2gpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoaSA9IG1hdGNoLmNoYXJDb2RlQXQoMCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG93ID0gbWF0Y2guY2hhckNvZGVBdCgxKTsKICAgICAgICAgICAgcmV0dXJuICcmIycgKyAoKChoaSAtIDB4RDgwMCkgKiAweDQwMCkgKyAobG93IC0gMHhEQzAwKSArIDB4MTAwMDApICsgJzsnOwogICAgICAgIH0pKQogICAgICAgICAgICAucmVwbGFjZShOT05fQUxQSEFOVU1FUklDX1JFR0VYUCwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWF0Y2gKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChtYXRjaCkgewogICAgICAgICAgICByZXR1cm4gJyYjJyArIG1hdGNoLmNoYXJDb2RlQXQoMCkgKyAnOyc7CiAgICAgICAgfSkpCiAgICAgICAgICAgIC5yZXBsYWNlKC88L2csICcmbHQ7JykKICAgICAgICAgICAgLnJlcGxhY2UoLz4vZywgJyZndDsnKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpbmVydEJvZHlIZWxwZXI7CiAgICAvKioKICAgICAqIFNhbml0aXplcyB0aGUgZ2l2ZW4gdW5zYWZlLCB1bnRydXN0ZWQgSFRNTCBmcmFnbWVudCwgYW5kIHJldHVybnMgSFRNTCB0ZXh0IHRoYXQgaXMgc2FmZSB0byBhZGQgdG8KICAgICAqIHRoZSBET00gaW4gYSBicm93c2VyIGVudmlyb25tZW50LgogICAgICogQHBhcmFtIHs/fSBkZWZhdWx0RG9jCiAgICAgKiBAcGFyYW0gez99IHVuc2FmZUh0bWxJbnB1dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX3Nhbml0aXplSHRtbChkZWZhdWx0RG9jLCB1bnNhZmVIdG1sSW5wdXQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluZXJ0Qm9keUVsZW1lbnQgPSBudWxsOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGluZXJ0Qm9keUhlbHBlciA9IGluZXJ0Qm9keUhlbHBlciB8fCBuZXcgSW5lcnRCb2R5SGVscGVyKGRlZmF1bHREb2MpOwogICAgICAgICAgICAvLyBNYWtlIHN1cmUgdW5zYWZlSHRtbCBpcyBhY3R1YWxseSBhIHN0cmluZyAoVHlwZVNjcmlwdCB0eXBlcyBhcmUgbm90IGVuZm9yY2VkIGF0IHJ1bnRpbWUpLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB1bnNhZmVIdG1sID0gdW5zYWZlSHRtbElucHV0ID8gU3RyaW5nKHVuc2FmZUh0bWxJbnB1dCkgOiAnJzsKICAgICAgICAgICAgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpOwogICAgICAgICAgICAvLyBtWFNTIHByb3RlY3Rpb24uIFJlcGVhdGVkbHkgcGFyc2UgdGhlIGRvY3VtZW50IHRvIG1ha2Ugc3VyZSBpdCBzdGFiaWxpemVzLCBzbyB0aGF0IGEgYnJvd3NlcgogICAgICAgICAgICAvLyB0cnlpbmcgdG8gYXV0by1jb3JyZWN0IGluY29ycmVjdCBIVE1MIGNhbm5vdCBjYXVzZSBmb3JtZXJseSBpbmVydCBIVE1MIHRvIGJlY29tZSBkYW5nZXJvdXMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1YU1NBdHRlbXB0cyA9IDU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcnNlZEh0bWwgPSB1bnNhZmVIdG1sOwogICAgICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICBpZiAobVhTU0F0dGVtcHRzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gc2FuaXRpemUgaHRtbCBiZWNhdXNlIHRoZSBpbnB1dCBpcyB1bnN0YWJsZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbVhTU0F0dGVtcHRzLS07CiAgICAgICAgICAgICAgICB1bnNhZmVIdG1sID0gcGFyc2VkSHRtbDsKICAgICAgICAgICAgICAgIHBhcnNlZEh0bWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5lcnRCb2R5RWxlbWVudCkpLmlubmVySFRNTDsKICAgICAgICAgICAgICAgIGluZXJ0Qm9keUVsZW1lbnQgPSBpbmVydEJvZHlIZWxwZXIuZ2V0SW5lcnRCb2R5RWxlbWVudCh1bnNhZmVIdG1sKTsKICAgICAgICAgICAgfSB3aGlsZSAodW5zYWZlSHRtbCAhPT0gcGFyc2VkSHRtbCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVyID0gbmV3IFNhbml0aXppbmdIdG1sU2VyaWFsaXplcigpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNhZmVIdG1sID0gc2FuaXRpemVyLnNhbml0aXplQ2hpbGRyZW4oKC8qKiBAdHlwZSB7P30gKi8gKGdldFRlbXBsYXRlQ29udGVudCgoLyoqIEB0eXBlIHs/fSAqLyAoaW5lcnRCb2R5RWxlbWVudCkpKSkpIHx8IGluZXJ0Qm9keUVsZW1lbnQpOwogICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkgJiYgc2FuaXRpemVyLnNhbml0aXplZFNvbWV0aGluZykgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdXQVJOSU5HOiBzYW5pdGl6aW5nIEhUTUwgc3RyaXBwZWQgc29tZSBjb250ZW50LCBzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHNhZmVIdG1sOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgLy8gSW4gY2FzZSBhbnl0aGluZyBnb2VzIHdyb25nLCBjbGVhciBvdXQgaW5lcnRFbGVtZW50IHRvIHJlc2V0IHRoZSBlbnRpcmUgRE9NIHN0cnVjdHVyZS4KICAgICAgICAgICAgaWYgKGluZXJ0Qm9keUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IGdldFRlbXBsYXRlQ29udGVudChpbmVydEJvZHlFbGVtZW50KSB8fCBpbmVydEJvZHlFbGVtZW50OwogICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudC5maXJzdENoaWxkKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKHBhcmVudC5maXJzdENoaWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VGVtcGxhdGVDb250ZW50KGVsKSB7CiAgICAgICAgcmV0dXJuICdjb250ZW50JyBpbiAoKC8qKiBAdHlwZSB7P30gKi8gKGVsKSkpICYmIGlzVGVtcGxhdGVFbGVtZW50KGVsKSA/CiAgICAgICAgICAgIGVsLmNvbnRlbnQgOgogICAgICAgICAgICBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1RlbXBsYXRlRWxlbWVudChlbCkgewogICAgICAgIHJldHVybiBlbC5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREUgJiYgZWwubm9kZU5hbWUgPT09ICdURU1QTEFURSc7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9zYW5pdGl6YXRpb24vc2VjdXJpdHkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBTZWN1cml0eUNvbnRleHQgPSB7CiAgICAgICAgTk9ORTogMCwKICAgICAgICBIVE1MOiAxLAogICAgICAgIFNUWUxFOiAyLAogICAgICAgIFNDUklQVDogMywKICAgICAgICBVUkw6IDQsCiAgICAgICAgUkVTT1VSQ0VfVVJMOiA1LAogICAgfTsKICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHQuTk9ORV0gPSAnTk9ORSc7CiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0LkhUTUxdID0gJ0hUTUwnOwogICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5TVFlMRV0gPSAnU1RZTEUnOwogICAgU2VjdXJpdHlDb250ZXh0W1NlY3VyaXR5Q29udGV4dC5TQ1JJUFRdID0gJ1NDUklQVCc7CiAgICBTZWN1cml0eUNvbnRleHRbU2VjdXJpdHlDb250ZXh0LlVSTF0gPSAnVVJMJzsKICAgIFNlY3VyaXR5Q29udGV4dFtTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMXSA9ICdSRVNPVVJDRV9VUkwnOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3N0eWxlX3Nhbml0aXplci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFJlZ3VsYXIgZXhwcmVzc2lvbiBmb3Igc2FmZSBzdHlsZSB2YWx1ZXMuCiAgICAgKgogICAgICogUXVvdGVzICgiIGFuZCAnKSBhcmUgYWxsb3dlZCwgYnV0IGEgY2hlY2sgbXVzdCBiZSBkb25lIGVsc2V3aGVyZSB0byBlbnN1cmUgdGhleSdyZSBiYWxhbmNlZC4KICAgICAqCiAgICAgKiAnLCcgYWxsb3dzIG11bHRpcGxlIHZhbHVlcyB0byBiZSBhc3NpZ25lZCB0byB0aGUgc2FtZSBwcm9wZXJ0eSAoZS5nLiBiYWNrZ3JvdW5kLWF0dGFjaG1lbnQgb3IKICAgICAqIGZvbnQtZmFtaWx5KSBhbmQgaGVuY2UgY291bGQgYWxsb3cgbXVsdGlwbGUgdmFsdWVzIHRvIGdldCBpbmplY3RlZCwgYnV0IHRoYXQgc2hvdWxkIHBvc2Ugbm8gcmlzawogICAgICogb2YgWFNTLgogICAgICoKICAgICAqIFRoZSBmdW5jdGlvbiBleHByZXNzaW9uIGNoZWNrcyBvbmx5IGZvciBYU1Mgc2FmZXR5LCBub3QgZm9yIENTUyB2YWxpZGl0eS4KICAgICAqCiAgICAgKiBUaGlzIHJlZ3VsYXIgZXhwcmVzc2lvbiB3YXMgdGFrZW4gZnJvbSB0aGUgQ2xvc3VyZSBzYW5pdGl6YXRpb24gbGlicmFyeSwgYW5kIGF1Z21lbnRlZCBmb3IKICAgICAqIHRyYW5zZm9ybWF0aW9uIHZhbHVlcy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBWQUxVRVMgPSAnWy0sLiJcJyVfISMgYS16QS1aMC05XSsnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVFJBTlNGT1JNQVRJT05fRk5TID0gJyg/Om1hdHJpeHx0cmFuc2xhdGV8c2NhbGV8cm90YXRlfHNrZXd8cGVyc3BlY3RpdmUpKD86WHxZfFp8M2QpPyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDT0xPUl9GTlMgPSAnKD86cmdifGhzbClhPyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBHUkFESUVOVFMgPSAnKD86cmVwZWF0aW5nLSk/KD86bGluZWFyfHJhZGlhbCktZ3JhZGllbnQnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQ1NTM19GTlMgPSAnKD86YXR0cnxjYWxjfHZhciknOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRk5fQVJHUyA9ICdcXChbLTAtOS4lLCAjYS16QS1aXStcXCknOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU0FGRV9TVFlMRV9WQUxVRSA9IG5ldyBSZWdFeHAoYF4oJHtWQUxVRVN9fGAgKwogICAgICAgIGAoPzoke1RSQU5TRk9STUFUSU9OX0ZOU318JHtDT0xPUl9GTlN9fCR7R1JBRElFTlRTfXwke0NTUzNfRk5TfSlgICsKICAgICAgICBgJHtGTl9BUkdTfSkkYCwgJ2cnKTsKICAgIC8qKgogICAgICogTWF0Y2hlcyBhIGB1cmwoLi4uKWAgdmFsdWUgd2l0aCBhbiBhcmJpdHJhcnkgYXJndW1lbnQgYXMgbG9uZyBhcyBpdCBkb2VzCiAgICAgKiBub3QgY29udGFpbiBwYXJlbnRoZXNlcy4KICAgICAqCiAgICAgKiBUaGUgVVJMIHZhbHVlIHN0aWxsIG5lZWRzIHRvIGJlIHNhbml0aXplZCBzZXBhcmF0ZWx5LgogICAgICoKICAgICAqIGB1cmwoLi4uKWAgdmFsdWVzIGFyZSBhIHZlcnkgY29tbW9uIHVzZSBjYXNlLCBlLmcuIGZvciBgYmFja2dyb3VuZC1pbWFnZWAuIFdpdGggY2FyZWZ1bGx5IGNyYWZ0ZWQKICAgICAqIENTUyBzdHlsZSBydWxlcywgaXQgaXMgcG9zc2libGUgdG8gY29uc3RydWN0IGFuIGluZm9ybWF0aW9uIGxlYWsgd2l0aCBgdXJsYCB2YWx1ZXMgaW4gQ1NTLCBlLmcuCiAgICAgKiBieSBvYnNlcnZpbmcgd2hldGhlciBzY3JvbGwgYmFycyBhcmUgZGlzcGxheWVkLCBvciBjaGFyYWN0ZXIgcmFuZ2VzIHVzZWQgYnkgYSBmb250IGZhY2UKICAgICAqIGRlZmluaXRpb24uCiAgICAgKgogICAgICogQW5ndWxhciBvbmx5IGFsbG93cyBiaW5kaW5nIENTUyB2YWx1ZXMgKGFzIG9wcG9zZWQgdG8gZW50aXJlIENTUyBydWxlcyksIHNvIGl0IGlzIHVubGlrZWx5IHRoYXQKICAgICAqIGJpbmRpbmcgYSBVUkwgdmFsdWUgd2l0aG91dCBmdXJ0aGVyIGNvb3BlcmF0aW9uIGZyb20gdGhlIHBhZ2Ugd2lsbCBjYXVzZSBhbiBpbmZvcm1hdGlvbiBsZWFrLCBhbmQKICAgICAqIGlmIHNvLCBpdCBpcyBqdXN0IGEgbGVhaywgbm90IGEgZnVsbCBibG93biBYU1MgdnVsbmVyYWJpbGl0eS4KICAgICAqCiAgICAgKiBHaXZlbiB0aGUgY29tbW9uIHVzZSBjYXNlLCBsb3cgbGlrZWxpaG9vZCBvZiBhdHRhY2sgdmVjdG9yLCBhbmQgbG93IGltcGFjdCBvZiBhbiBhdHRhY2ssIHRoaXMKICAgICAqIGNvZGUgaXMgcGVybWlzc2l2ZSBhbmQgYWxsb3dzIFVSTHMgdGhhdCBzYW5pdGl6ZSBvdGhlcndpc2UuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgVVJMX1JFID0gL151cmxcKChbXildKylcKSQvOwogICAgLyoqCiAgICAgKiBDaGVja3MgdGhhdCBxdW90ZXMgKCIgYW5kICcpIGFyZSBwcm9wZXJseSBiYWxhbmNlZCBpbnNpZGUgYSBzdHJpbmcuIEFzc3VtZXMKICAgICAqIHRoYXQgbmVpdGhlciBlc2NhcGUgKFwpIG5vciBhbnkgb3RoZXIgY2hhcmFjdGVyIHRoYXQgY291bGQgcmVzdWx0IGluCiAgICAgKiBicmVha2luZyBvdXQgb2YgYSBzdHJpbmcgcGFyc2luZyBjb250ZXh0IGFyZSBhbGxvd2VkOwogICAgICogc2VlIGh0dHA6Ly93d3cudzMub3JnL1RSL2NzczMtc3ludGF4LyNzdHJpbmctdG9rZW4tZGlhZ3JhbS4KICAgICAqCiAgICAgKiBUaGlzIGNvZGUgd2FzIHRha2VuIGZyb20gdGhlIENsb3N1cmUgc2FuaXRpemF0aW9uIGxpYnJhcnkuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBoYXNCYWxhbmNlZFF1b3Rlcyh2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb3V0c2lkZVNpbmdsZSA9IHRydWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvdXRzaWRlRG91YmxlID0gdHJ1ZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYyA9IHZhbHVlLmNoYXJBdChpKTsKICAgICAgICAgICAgaWYgKGMgPT09ICdcJycgJiYgb3V0c2lkZURvdWJsZSkgewogICAgICAgICAgICAgICAgb3V0c2lkZVNpbmdsZSA9ICFvdXRzaWRlU2luZ2xlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGMgPT09ICciJyAmJiBvdXRzaWRlU2luZ2xlKSB7CiAgICAgICAgICAgICAgICBvdXRzaWRlRG91YmxlID0gIW91dHNpZGVEb3VibGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG91dHNpZGVTaW5nbGUgJiYgb3V0c2lkZURvdWJsZTsKICAgIH0KICAgIC8qKgogICAgICogU2FuaXRpemVzIHRoZSBnaXZlbiB1bnRydXN0ZWQgQ1NTIHN0eWxlIHByb3BlcnR5IHZhbHVlIChpLmUuIG5vdCBhbiBlbnRpcmUgb2JqZWN0LCBqdXN0IGEgc2luZ2xlCiAgICAgKiB2YWx1ZSkgYW5kIHJldHVybnMgYSB2YWx1ZSB0aGF0IGlzIHNhZmUgdG8gdXNlIGluIGEgYnJvd3NlciBlbnZpcm9ubWVudC4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9zYW5pdGl6ZVN0eWxlKHZhbHVlKSB7CiAgICAgICAgdmFsdWUgPSBTdHJpbmcodmFsdWUpLnRyaW0oKTsgLy8gTWFrZSBzdXJlIGl0J3MgYWN0dWFsbHkgYSBzdHJpbmcuCiAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIC8vIFNpbmdsZSB1cmwoLi4uKSB2YWx1ZXMgYXJlIHN1cHBvcnRlZCwgYnV0IG9ubHkgZm9yIFVSTHMgdGhhdCBzYW5pdGl6ZSBjbGVhbmx5LiBTZWUgYWJvdmUgZm9yCiAgICAgICAgLy8gcmVhc29uaW5nIGJlaGluZCB0aGlzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB1cmxNYXRjaCA9IHZhbHVlLm1hdGNoKFVSTF9SRSk7CiAgICAgICAgaWYgKCh1cmxNYXRjaCAmJiBfc2FuaXRpemVVcmwodXJsTWF0Y2hbMV0pID09PSB1cmxNYXRjaFsxXSkgfHwKICAgICAgICAgICAgdmFsdWUubWF0Y2goU0FGRV9TVFlMRV9WQUxVRSkgJiYgaGFzQmFsYW5jZWRRdW90ZXModmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsgLy8gU2FmZSBzdHlsZSB2YWx1ZXMuCiAgICAgICAgfQogICAgICAgIGlmIChpc0Rldk1vZGUoKSkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oYFdBUk5JTkc6IHNhbml0aXppbmcgdW5zYWZlIHN0eWxlIHZhbHVlICR7dmFsdWV9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKS5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICd1bnNhZmUnOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3Nhbml0aXphdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuIGBodG1sYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGBodG1sYCAqKnN0cmluZyoqIGludG8gdHJ1c3RlZCBzdHJpbmcgYnkgcmVtb3ZpbmcKICAgICAqIGRhbmdlcm91cyBjb250ZW50LgogICAgICoKICAgICAqIFRoaXMgbWV0aG9kIHBhcnNlcyB0aGUgYGh0bWxgIGFuZCBsb2NhdGVzIHBvdGVudGlhbGx5IGRhbmdlcm91cyBjb250ZW50IChzdWNoIGFzIHVybHMgYW5kCiAgICAgKiBqYXZhc2NyaXB0KSBhbmQgcmVtb3ZlcyBpdC4KICAgICAqCiAgICAgKiBJdCBpcyBwb3NzaWJsZSB0byBtYXJrIGEgc3RyaW5nIGFzIHRydXN0ZWQgYnkgY2FsbGluZyB7XEBsaW5rIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0SHRtbH0uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdW5zYWZlSHRtbCB1bnRydXN0ZWQgYGh0bWxgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci4KICAgICAqIEByZXR1cm4gez99IGBodG1sYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBkaXNwbGF5IHRvIHVzZXIsIGJlY2F1c2UgYWxsIG9mIHRoZSBkYW5nZXJvdXMgamF2YXNjcmlwdAogICAgICogYW5kIHVybHMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c2FuaXRpemVIdG1sKHVuc2FmZUh0bWwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7CiAgICAgICAgaWYgKHNhbml0aXplcikgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCB1bnNhZmVIdG1sKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlSHRtbCwgIkhUTUwiIC8qIEh0bWwgKi8pKSB7CiAgICAgICAgICAgIHJldHVybiB1bndyYXBTYWZlVmFsdWUodW5zYWZlSHRtbCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfc2FuaXRpemVIdG1sKGdldERvY3VtZW50KCksIHJlbmRlclN0cmluZ2lmeSh1bnNhZmVIdG1sKSk7CiAgICB9CiAgICAvKioKICAgICAqIEEgYHN0eWxlYCBzYW5pdGl6ZXIgd2hpY2ggY29udmVydHMgdW50cnVzdGVkIGBzdHlsZWAgKipzdHJpbmcqKiBpbnRvIHRydXN0ZWQgc3RyaW5nIGJ5IHJlbW92aW5nCiAgICAgKiBkYW5nZXJvdXMgY29udGVudC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBwYXJzZXMgdGhlIGBzdHlsZWAgYW5kIGxvY2F0ZXMgcG90ZW50aWFsbHkgZGFuZ2Vyb3VzIGNvbnRlbnQgKHN1Y2ggYXMgdXJscyBhbmQKICAgICAqIGphdmFzY3JpcHQpIGFuZCByZW1vdmVzIGl0LgogICAgICoKICAgICAqIEl0IGlzIHBvc3NpYmxlIHRvIG1hcmsgYSBzdHJpbmcgYXMgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZX0uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdW5zYWZlU3R5bGUgdW50cnVzdGVkIGBzdHlsZWAsIHR5cGljYWxseSBmcm9tIHRoZSB1c2VyLgogICAgICogQHJldHVybiB7P30gYHN0eWxlYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kIHRvIHRoZSBgc3R5bGVgIHByb3BlcnRpZXMsIGJlY2F1c2UgYWxsIG9mIHRoZQogICAgICogZGFuZ2Vyb3VzIGphdmFzY3JpcHQgYW5kIHVybHMgaGF2ZSBiZWVuIHJlbW92ZWQuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c2FuaXRpemVTdHlsZSh1bnNhZmVTdHlsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzYW5pdGl6ZXIgPSBnZXRTYW5pdGl6ZXIoKTsKICAgICAgICBpZiAoc2FuaXRpemVyKSB7CiAgICAgICAgICAgIHJldHVybiBzYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlNUWUxFLCB1bnNhZmVTdHlsZSkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHVuc2FmZVN0eWxlLCAiU3R5bGUiIC8qIFN0eWxlICovKSkgewogICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHVuc2FmZVN0eWxlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zYW5pdGl6ZVN0eWxlKHJlbmRlclN0cmluZ2lmeSh1bnNhZmVTdHlsZSkpOwogICAgfQogICAgLyoqCiAgICAgKiBBIGB1cmxgIHNhbml0aXplciB3aGljaCBjb252ZXJ0cyB1bnRydXN0ZWQgYHVybGAgKipzdHJpbmcqKiBpbnRvIHRydXN0ZWQgc3RyaW5nIGJ5IHJlbW92aW5nCiAgICAgKiBkYW5nZXJvdXMKICAgICAqIGNvbnRlbnQuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgcGFyc2VzIHRoZSBgdXJsYCBhbmQgbG9jYXRlcyBwb3RlbnRpYWxseSBkYW5nZXJvdXMgY29udGVudCAoc3VjaCBhcyBqYXZhc2NyaXB0KSBhbmQKICAgICAqIHJlbW92ZXMgaXQuCiAgICAgKgogICAgICogSXQgaXMgcG9zc2libGUgdG8gbWFyayBhIHN0cmluZyBhcyB0cnVzdGVkIGJ5IGNhbGxpbmcge1xAbGluayBieXBhc3NTYW5pdGl6YXRpb25UcnVzdFVybH0uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdW5zYWZlVXJsIHVudHJ1c3RlZCBgdXJsYCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuCiAgICAgKiBAcmV0dXJuIHs/fSBgdXJsYCBzdHJpbmcgd2hpY2ggaXMgc2FmZSB0byBiaW5kIHRvIHRoZSBgc3JjYCBwcm9wZXJ0aWVzIHN1Y2ggYXMgYDxpbWcgc3JjPmAsIGJlY2F1c2UKICAgICAqIGFsbCBvZiB0aGUgZGFuZ2Vyb3VzIGphdmFzY3JpcHQgaGFzIGJlZW4gcmVtb3ZlZC4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzYW5pdGl6ZVVybCh1bnNhZmVVcmwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7CiAgICAgICAgaWYgKHNhbml0aXplcikgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5VUkwsIHVuc2FmZVVybCkgfHwgJyc7CiAgICAgICAgfQogICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHVuc2FmZVVybCwgIlVSTCIgLyogVXJsICovKSkgewogICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHVuc2FmZVVybCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBfc2FuaXRpemVVcmwocmVuZGVyU3RyaW5naWZ5KHVuc2FmZVVybCkpOwogICAgfQogICAgLyoqCiAgICAgKiBBIGB1cmxgIHNhbml0aXplciB3aGljaCBvbmx5IGxldHMgdHJ1c3RlZCBgdXJsYHMgdGhyb3VnaC4KICAgICAqCiAgICAgKiBUaGlzIHBhc3NlcyBvbmx5IGB1cmxgcyBtYXJrZWQgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsgYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RSZXNvdXJjZVVybH0uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdW5zYWZlUmVzb3VyY2VVcmwgdW50cnVzdGVkIGB1cmxgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci4KICAgICAqIEByZXR1cm4gez99IGB1cmxgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQgdG8gdGhlIGBzcmNgIHByb3BlcnRpZXMgc3VjaCBhcyBgPGltZyBzcmM+YCwgYmVjYXVzZQogICAgICogb25seSB0cnVzdGVkIGB1cmxgcyBoYXZlIGJlZW4gYWxsb3dlZCB0byBwYXNzLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtXNhbml0aXplUmVzb3VyY2VVcmwodW5zYWZlUmVzb3VyY2VVcmwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2FuaXRpemVyID0gZ2V0U2FuaXRpemVyKCk7CiAgICAgICAgaWYgKHNhbml0aXplcikgewogICAgICAgICAgICByZXR1cm4gc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIHVuc2FmZVJlc291cmNlVXJsKSB8fCAnJzsKICAgICAgICB9CiAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codW5zYWZlUmVzb3VyY2VVcmwsICJSZXNvdXJjZVVSTCIgLyogUmVzb3VyY2VVcmwgKi8pKSB7CiAgICAgICAgICAgIHJldHVybiB1bndyYXBTYWZlVmFsdWUodW5zYWZlUmVzb3VyY2VVcmwpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgcmVzb3VyY2UgVVJMIGNvbnRleHQgKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpJyk7CiAgICB9CiAgICAvKioKICAgICAqIEEgYHNjcmlwdGAgc2FuaXRpemVyIHdoaWNoIG9ubHkgbGV0cyB0cnVzdGVkIGphdmFzY3JpcHQgdGhyb3VnaC4KICAgICAqCiAgICAgKiBUaGlzIHBhc3NlcyBvbmx5IGBzY3JpcHRgcyBtYXJrZWQgdHJ1c3RlZCBieSBjYWxsaW5nIHtcQGxpbmsKICAgICAqIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0fS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSB1bnNhZmVTY3JpcHQgdW50cnVzdGVkIGBzY3JpcHRgLCB0eXBpY2FsbHkgZnJvbSB0aGUgdXNlci4KICAgICAqIEByZXR1cm4gez99IGB1cmxgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQgdG8gdGhlIGA8c2NyaXB0PmAgZWxlbWVudCBzdWNoIGFzIGA8aW1nIHNyYz5gLAogICAgICogYmVjYXVzZSBvbmx5IHRydXN0ZWQgYHNjcmlwdHNgIGhhdmUgYmVlbiBhbGxvd2VkIHRvIHBhc3MuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c2FuaXRpemVTY3JpcHQodW5zYWZlU2NyaXB0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNhbml0aXplciA9IGdldFNhbml0aXplcigpOwogICAgICAgIGlmIChzYW5pdGl6ZXIpIHsKICAgICAgICAgICAgcmV0dXJuIHNhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuU0NSSVBULCB1bnNhZmVTY3JpcHQpIHx8ICcnOwogICAgICAgIH0KICAgICAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh1bnNhZmVTY3JpcHQsICJTY3JpcHQiIC8qIFNjcmlwdCAqLykpIHsKICAgICAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh1bnNhZmVTY3JpcHQpOwogICAgICAgIH0KICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vuc2FmZSB2YWx1ZSB1c2VkIGluIGEgc2NyaXB0IGNvbnRleHQnKTsKICAgIH0KICAgIC8qKgogICAgICogRGV0ZWN0cyB3aGljaCBzYW5pdGl6ZXIgdG8gdXNlIGZvciBVUkwgcHJvcGVydHksIGJhc2VkIG9uIHRhZyBuYW1lIGFuZCBwcm9wIG5hbWUuCiAgICAgKgogICAgICogVGhlIHJ1bGVzIGFyZSBiYXNlZCBvbiB0aGUgUkVTT1VSQ0VfVVJMIGNvbnRleHQgY29uZmlnIGZyb20KICAgICAqIGBwYWNrYWdlcy9jb21waWxlci9zcmMvc2NoZW1hL2RvbV9zZWN1cml0eV9zY2hlbWEudHNgLgogICAgICogSWYgdGFnIGFuZCBwcm9wIG5hbWVzIGRvbid0IG1hdGNoIFJlc291cmNlIFVSTCBzY2hlbWEsIHVzZSBVUkwgc2FuaXRpemVyLgogICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VXJsU2FuaXRpemVyKHRhZywgcHJvcCkgewogICAgICAgIGlmICgocHJvcCA9PT0gJ3NyYycgJiYKICAgICAgICAgICAgKHRhZyA9PT0gJ2VtYmVkJyB8fCB0YWcgPT09ICdmcmFtZScgfHwgdGFnID09PSAnaWZyYW1lJyB8fCB0YWcgPT09ICdtZWRpYScgfHwKICAgICAgICAgICAgICAgIHRhZyA9PT0gJ3NjcmlwdCcpKSB8fAogICAgICAgICAgICAocHJvcCA9PT0gJ2hyZWYnICYmICh0YWcgPT09ICdiYXNlJyB8fCB0YWcgPT09ICdsaW5rJykpKSB7CiAgICAgICAgICAgIHJldHVybiDJtcm1c2FuaXRpemVSZXNvdXJjZVVybDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVVybDsKICAgIH0KICAgIC8qKgogICAgICogU2FuaXRpemVzIFVSTCwgc2VsZWN0aW5nIHNhbml0aXplciBmdW5jdGlvbiBiYXNlZCBvbiB0YWcgYW5kIHByb3BlcnR5IG5hbWVzLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiBjYXNlIHdlIGNhbid0IGRlZmluZSBzZWN1cml0eSBjb250ZXh0IGF0IGNvbXBpbGUgdGltZSwgd2hlbiBvbmx5IHByb3AKICAgICAqIG5hbWUgaXMgYXZhaWxhYmxlLiBUaGlzIGhhcHBlbnMgd2hlbiB3ZSBnZW5lcmF0ZSBob3N0IGJpbmRpbmdzIGZvciBEaXJlY3RpdmVzL0NvbXBvbmVudHMuIFRoZQogICAgICogaG9zdCBlbGVtZW50IGlzIHVua25vd24gYXQgY29tcGlsZSB0aW1lLCBzbyB3ZSBkZWZlciBjYWxjdWxhdGlvbiBvZiBzcGVjaWZpYyBzYW5pdGl6ZXIgdG8KICAgICAqIHJ1bnRpbWUuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdW5zYWZlVXJsIHVudHJ1c3RlZCBgdXJsYCwgdHlwaWNhbGx5IGZyb20gdGhlIHVzZXIuCiAgICAgKiBAcGFyYW0gez99IHRhZyB0YXJnZXQgZWxlbWVudCB0YWcgbmFtZS4KICAgICAqIEBwYXJhbSB7P30gcHJvcCBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0aGF0IGNvbnRhaW5zIHRoZSB2YWx1ZS4KICAgICAqIEByZXR1cm4gez99IGB1cmxgIHN0cmluZyB3aGljaCBpcyBzYWZlIHRvIGJpbmQuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c2FuaXRpemVVcmxPclJlc291cmNlVXJsKHVuc2FmZVVybCwgdGFnLCBwcm9wKSB7CiAgICAgICAgcmV0dXJuIGdldFVybFNhbml0aXplcih0YWcsIHByb3ApKHVuc2FmZVVybCk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBkZWZhdWx0IHN0eWxlIHNhbml0aXplciB3aWxsIGhhbmRsZSBzYW5pdGl6YXRpb24gZm9yIHN0eWxlIHByb3BlcnRpZXMgYnkKICAgICAqIHNhbml0aXppbmcgYW55IENTUyBwcm9wZXJ0eSB0aGF0IGNhbiBpbmNsdWRlIGEgYHVybGAgdmFsdWUgKHVzdWFsbHkgaW1hZ2UtYmFzZWQgcHJvcGVydGllcykKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IMm1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXIgPSAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKioKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/PX0gbW9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKHByb3AsIHZhbHVlLCBtb2RlKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQgJiYgbW9kZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB0aGUgZmFjdCB0aGF0IGBTdHlsZVNhbml0aXplRm5gIHNob3VsZCBub3QgZXhpc3Qgb25jZSBQUiMzNDQ4MAogICAgICAgICAgICAvLyBsYW5kcy4gRm9yIG5vdyB0aGUgYFN0eWxlU2FuaXRpemVGbmAgYW5kIHNob3VsZCBhY3QgbGlrZSBgKHZhbHVlOiBhbnkpID0+IHN0cmluZ2AgYXMgYQogICAgICAgICAgICAvLyB3b3JrIGFyb3VuZC4KICAgICAgICAgICAgcmV0dXJuIMm1ybVzYW5pdGl6ZVN0eWxlKHByb3ApOwogICAgICAgIH0KICAgICAgICBtb2RlID0gbW9kZSB8fCAzIC8qIFZhbGlkYXRlQW5kU2FuaXRpemUgKi87CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkb1Nhbml0aXplVmFsdWUgPSB0cnVlOwogICAgICAgIGlmIChtb2RlICYgMSAvKiBWYWxpZGF0ZVByb3BlcnR5ICovKSB7CiAgICAgICAgICAgIGRvU2FuaXRpemVWYWx1ZSA9IHN0eWxlUHJvcE5lZWRzU2FuaXRpemF0aW9uKHByb3ApOwogICAgICAgIH0KICAgICAgICBpZiAobW9kZSAmIDIgLyogU2FuaXRpemVPbmx5ICovKSB7CiAgICAgICAgICAgIHJldHVybiBkb1Nhbml0aXplVmFsdWUgPyDJtcm1c2FuaXRpemVTdHlsZSh2YWx1ZSkgOiB1bndyYXBTYWZlVmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIGRvU2FuaXRpemVWYWx1ZTsKICAgICAgICB9CiAgICB9KSkpKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdHlsZVByb3BOZWVkc1Nhbml0aXphdGlvbihwcm9wKSB7CiAgICAgICAgcmV0dXJuIHByb3AgPT09ICdiYWNrZ3JvdW5kLWltYWdlJyB8fCBwcm9wID09PSAnYmFja2dyb3VuZEltYWdlJyB8fCBwcm9wID09PSAnYmFja2dyb3VuZCcgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJ2JvcmRlci1pbWFnZScgfHwgcHJvcCA9PT0gJ2JvcmRlckltYWdlJyB8fCBwcm9wID09PSAnYm9yZGVyLWltYWdlLXNvdXJjZScgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJ2JvcmRlckltYWdlU291cmNlJyB8fCBwcm9wID09PSAnZmlsdGVyJyB8fCBwcm9wID09PSAnbGlzdC1zdHlsZScgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJ2xpc3RTdHlsZScgfHwgcHJvcCA9PT0gJ2xpc3Qtc3R5bGUtaW1hZ2UnIHx8IHByb3AgPT09ICdsaXN0U3R5bGVJbWFnZScgfHwKICAgICAgICAgICAgcHJvcCA9PT0gJ2NsaXAtcGF0aCcgfHwgcHJvcCA9PT0gJ2NsaXBQYXRoJzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUFnYWluc3RFdmVudFByb3BlcnRpZXMobmFtZSkgewogICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb24nKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBCaW5kaW5nIHRvIGV2ZW50IHByb3BlcnR5ICcke25hbWV9JyBpcyBkaXNhbGxvd2VkIGZvciBzZWN1cml0eSByZWFzb25zLCBgICsKICAgICAgICAgICAgICAgIGBwbGVhc2UgdXNlICgke25hbWUuc2xpY2UoMil9KT0uLi5gICsKICAgICAgICAgICAgICAgIGBcbklmICcke25hbWV9JyBpcyBhIGRpcmVjdGl2ZSBpbnB1dCwgbWFrZSBzdXJlIHRoZSBkaXJlY3RpdmUgaXMgaW1wb3J0ZWQgYnkgdGhlYCArCiAgICAgICAgICAgICAgICBgIGN1cnJlbnQgbW9kdWxlLmA7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2YWxpZGF0ZUFnYWluc3RFdmVudEF0dHJpYnV0ZXMobmFtZSkgewogICAgICAgIGlmIChuYW1lLnRvTG93ZXJDYXNlKCkuc3RhcnRzV2l0aCgnb24nKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1zZyA9IGBCaW5kaW5nIHRvIGV2ZW50IGF0dHJpYnV0ZSAnJHtuYW1lfScgaXMgZGlzYWxsb3dlZCBmb3Igc2VjdXJpdHkgcmVhc29ucywgYCArCiAgICAgICAgICAgICAgICBgcGxlYXNlIHVzZSAoJHtuYW1lLnNsaWNlKDIpfSk9Li4uYDsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRTYW5pdGl6ZXIoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICByZXR1cm4gbFZpZXcgJiYgbFZpZXdbU0FOSVRJWkVSXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFRISVMgRklMRSBDT05UQUlOUyBDT0RFIFdISUNIIFNIT1VMRCBCRSBUUkVFIFNIQUtFTiBBTkQgTkVWRVIgQ0FMTEVEIEZST00gUFJPRFVDVElPTiBDT0RFISEhCiAgICAgKi8KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBgQXJyYXlgIGNvbnN0cnVjdGlvbiB3aXRoIGEgZ2l2ZW4gbmFtZS4gVGhpcyBpcyB1c2VmdWwgd2hlbgogICAgICogbG9va2luZyBmb3IgbWVtb3J5IGNvbnN1bXB0aW9uIHRvIHNlZSB3aGF0IHRpbWUgb2YgYXJyYXkgaXQgaXMuCiAgICAgKgogICAgICoKICAgICAqIEBwYXJhbSBuYW1lIE5hbWUgdG8gZ2l2ZSB0byB0aGUgY29uc3RydWN0b3IKICAgICAqIEByZXR1cm5zIEEgc3ViY2xhc3Mgb2YgYEFycmF5YCBpZiBwb3NzaWJsZS4gVGhpcyBjYW4gb25seSBiZSBkb25lIGluCiAgICAgKiAgICAgICAgICBlbnZpcm9ubWVudHMgd2hpY2ggc3VwcG9ydCBgY2xhc3NgIGNvbnN0cnVjdC4KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlTmFtZWRBcnJheVR5cGUobmFtZSkgewogICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBpbiBwcm9kIG1vZGUsIHNvIGxldCdzIHZlcmlmeSB0aGF0IGlzIHRoZSBjYXNlLgogICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gaXQgdGhpcyB3YXkgc28gdGhhdCBUeXBlU2NyaXB0IGRvZXMgbm90IGRvd24tbGV2ZWwgdGhlIGJlbG93IGNvZGUuCiAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkNvbnN0cnVjdG9yID0gY3JlYXRlTmFtZWRBcnJheVR5cGUuY29uc3RydWN0b3I7CiAgICAgICAgICAgICAgICByZXR1cm4gKG5ldyBGdW5jdGlvbkNvbnN0cnVjdG9yKCdBcnJheScsIGByZXR1cm4gY2xhc3MgJHtuYW1lfSBleHRlbmRzIEFycmF5e31gKSkoQXJyYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAvLyBJZiBpdCBkb2VzIG5vdCB3b3JrIGp1c3QgZ2l2ZSB1cCBhbmQgZmFsbCBiYWNrIHRvIHJlZ3VsYXIgQXJyYXkuCiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTG9va3MgbGlrZSB3ZSBhcmUgaW4gXCdwcm9kIG1vZGVcJywgYnV0IHdlIGFyZSBjcmVhdGluZyBhIG5hbWVkIEFycmF5IHR5cGUsIHdoaWNoIGlzIHdyb25nISBDaGVjayB5b3VyIGNvZGUnKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gbm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZShuYW1lKSB7CiAgICAgICAgLy8gQXR0cmlidXRlIG5hbWVzIHdpdGggYCRgIChlZyBgeC15JGApIGFyZSB2YWxpZCBwZXIgc3BlYywgYnV0IHVuc3VwcG9ydGVkIGJ5IHNvbWUgYnJvd3NlcnMKICAgICAgICBuYW1lID0gY2FtZWxDYXNlVG9EYXNoQ2FzZShuYW1lLnJlcGxhY2UoL1skQF0vZywgJ18nKSk7CiAgICAgICAgcmV0dXJuIGBuZy1yZWZsZWN0LSR7bmFtZX1gOwogICAgfQogICAgY29uc3QgQ0FNRUxfQ0FTRV9SRUdFWFAgPSAvKFtBLVpdKS9nOwogICAgZnVuY3Rpb24gY2FtZWxDYXNlVG9EYXNoQ2FzZShpbnB1dCkgewogICAgICAgIHJldHVybiBpbnB1dC5yZXBsYWNlKENBTUVMX0NBU0VfUkVHRVhQLCAoLi4ubSkgPT4gJy0nICsgbVsxXS50b0xvd2VyQ2FzZSgpKTsKICAgIH0KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZURlYnVnQmluZGluZ1ZhbHVlKHZhbHVlKSB7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLy8gTGltaXQgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGFzIG90aGVyd2lzZSB0aGUgRE9NIGp1c3QgZ2V0cyBwb2xsdXRlZC4KICAgICAgICAgICAgcmV0dXJuIHZhbHVlICE9IG51bGwgPyB2YWx1ZS50b1N0cmluZygpLnNsaWNlKDAsIDMwKSA6IHZhbHVlOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICByZXR1cm4gJ1tFUlJPUl0gRXhjZXB0aW9uIHdoaWxlIHRyeWluZyB0byBzZXJpYWxpemUgdGhlIHZhbHVlJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2NvbnRleHRfZGlzY292ZXJ5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgbWF0Y2hpbmcgYExDb250ZXh0YCBkYXRhIGZvciBhIGdpdmVuIERPTSBub2RlLCBkaXJlY3RpdmUgb3IgY29tcG9uZW50IGluc3RhbmNlLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gd2lsbCBleGFtaW5lIHRoZSBwcm92aWRlZCBET00gZWxlbWVudCwgY29tcG9uZW50LCBvciBkaXJlY3RpdmUgaW5zdGFuY2VcJ3MKICAgICAqIG1vbmtleS1wYXRjaGVkIHByb3BlcnR5IHRvIGRlcml2ZSB0aGUgYExDb250ZXh0YCBkYXRhLiBPbmNlIGNhbGxlZCB0aGVuIHRoZSBtb25rZXktcGF0Y2hlZAogICAgICogdmFsdWUgd2lsbCBiZSB0aGF0IG9mIHRoZSBuZXdseSBjcmVhdGVkIGBMQ29udGV4dGAuCiAgICAgKgogICAgICogSWYgdGhlIG1vbmtleS1wYXRjaGVkIHZhbHVlIGlzIHRoZSBgTFZpZXdgIGluc3RhbmNlIHRoZW4gdGhlIGNvbnRleHQgdmFsdWUgZm9yIHRoYXQKICAgICAqIHRhcmdldCB3aWxsIGJlIGNyZWF0ZWQgYW5kIHRoZSBtb25rZXktcGF0Y2ggcmVmZXJlbmNlIHdpbGwgYmUgdXBkYXRlZC4gVGhlcmVmb3JlIHdoZW4gdGhpcwogICAgICogZnVuY3Rpb24gaXMgY2FsbGVkIGl0IG1heSBtdXRhdGUgdGhlIHByb3ZpZGVkIGVsZW1lbnRcJ3MsIGNvbXBvbmVudFwncyBvciBhbnkgb2YgdGhlIGFzc29jaWF0ZWQKICAgICAqIGRpcmVjdGl2ZVwncyBtb25rZXktcGF0Y2ggdmFsdWVzLgogICAgICoKICAgICAqIElmIHRoZSBtb25rZXktcGF0Y2ggdmFsdWUgaXMgbm90IGRldGVjdGVkIHRoZW4gdGhlIGNvZGUgd2lsbCB3YWxrIHVwIHRoZSBET00gdW50aWwgYW4gZWxlbWVudAogICAgICogaXMgZm91bmQgd2hpY2ggY29udGFpbnMgYSBtb25rZXktcGF0Y2ggcmVmZXJlbmNlLiBXaGVuIHRoYXQgb2NjdXJzIHRoZW4gdGhlIHByb3ZpZGVkIGVsZW1lbnQKICAgICAqIHdpbGwgYmUgdXBkYXRlZCB3aXRoIGEgbmV3IGNvbnRleHQgKHdoaWNoIGlzIHRoZW4gcmV0dXJuZWQpLiBJZiB0aGUgbW9ua2V5LXBhdGNoIHZhbHVlIGlzIG5vdAogICAgICogZGV0ZWN0ZWQgZm9yIGEgY29tcG9uZW50L2RpcmVjdGl2ZSBpbnN0YW5jZSB0aGVuIGl0IHdpbGwgdGhyb3cgYW4gZXJyb3IgKGFsbCBjb21wb25lbnRzIGFuZAogICAgICogZGlyZWN0aXZlcyBzaG91bGQgYmUgYXV0b21hdGljYWxseSBtb25rZXktcGF0Y2hlZCBieSBpdnkpLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0IENvbXBvbmVudCwgRGlyZWN0aXZlIG9yIERPTSBOb2RlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TENvbnRleHQodGFyZ2V0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtcFZhbHVlID0gcmVhZFBhdGNoZWREYXRhKHRhcmdldCk7CiAgICAgICAgaWYgKG1wVmFsdWUpIHsKICAgICAgICAgICAgLy8gb25seSB3aGVuIGl0J3MgYW4gYXJyYXkgaXMgaXQgY29uc2lkZXJlZCBhbiBMVmlldyBpbnN0YW5jZQogICAgICAgICAgICAvLyAuLi4gb3RoZXJ3aXNlIGl0J3MgYW4gYWxyZWFkeSBjb25zdHJ1Y3RlZCBMQ29udGV4dCBpbnN0YW5jZQogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtcFZhbHVlKSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobXBWYWx1ZSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG5vZGVJbmRleDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBjb21wb25lbnQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgZGlyZWN0aXZlcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudEluc3RhbmNlKHRhcmdldCkpIHsKICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCB0YXJnZXQpOwogICAgICAgICAgICAgICAgICAgIGlmIChub2RlSW5kZXggPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGUgcHJvdmlkZWQgY29tcG9uZW50IHdhcyBub3QgZm91bmQgaW4gdGhlIGFwcGxpY2F0aW9uJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IHRhcmdldDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGlzRGlyZWN0aXZlSW5zdGFuY2UodGFyZ2V0KSkgewogICAgICAgICAgICAgICAgICAgIG5vZGVJbmRleCA9IGZpbmRWaWFEaXJlY3RpdmUobFZpZXcsIHRhcmdldCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVJbmRleCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZSBwcm92aWRlZCBkaXJlY3RpdmUgd2FzIG5vdCBmb3VuZCBpbiB0aGUgYXBwbGljYXRpb24nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlcyA9IGdldERpcmVjdGl2ZXNBdE5vZGVJbmRleChub2RlSW5kZXgsIGxWaWV3LCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXggPSBmaW5kVmlhTmF0aXZlRWxlbWVudChsVmlldywgKC8qKiBAdHlwZSB7P30gKi8gKHRhcmdldCkpKTsKICAgICAgICAgICAgICAgICAgICBpZiAobm9kZUluZGV4ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHRoZSBnb2FsIGlzIG5vdCB0byBmaWxsIHRoZSBlbnRpcmUgY29udGV4dCBmdWxsIG9mIGRhdGEgYmVjYXVzZSB0aGUgbG9va3VwcwogICAgICAgICAgICAgICAgLy8gYXJlIGV4cGVuc2l2ZS4gSW5zdGVhZCwgb25seSB0aGUgdGFyZ2V0IGRhdGEgKHRoZSBlbGVtZW50LCBjb21wb25lbnQsIGNvbnRhaW5lciwgSUNVCiAgICAgICAgICAgICAgICAvLyBleHByZXNzaW9uIG9yIGRpcmVjdGl2ZSBkZXRhaWxzKSBhcmUgZmlsbGVkIGludG8gdGhlIGNvbnRleHQuIElmIGNhbGxlZCBtdWx0aXBsZSB0aW1lcwogICAgICAgICAgICAgICAgLy8gd2l0aCBkaWZmZXJlbnQgdGFyZ2V0IHZhbHVlcyB0aGVuIHRoZSBtaXNzaW5nIHRhcmdldCBkYXRhIHdpbGwgYmUgZmlsbGVkIGluLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlID0gdW53cmFwUk5vZGUobFZpZXdbbm9kZUluZGV4XSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ0N0eCA9IHJlYWRQYXRjaGVkRGF0YShuYXRpdmUpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IChleGlzdGluZ0N0eCAmJiAhQXJyYXkuaXNBcnJheShleGlzdGluZ0N0eCkpID8KICAgICAgICAgICAgICAgICAgICBleGlzdGluZ0N0eCA6CiAgICAgICAgICAgICAgICAgICAgY3JlYXRlTENvbnRleHQobFZpZXcsIG5vZGVJbmRleCwgbmF0aXZlKTsKICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGRpc2NvdmVyZWQgdGhlbiB1cGRhdGUgdGhlIG1vbmtleS1wYXRjaAogICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiBjb250ZXh0LmNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGNvbnRleHQuY29tcG9uZW50LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIG9ubHkgd2hlbiB0aGUgZGlyZWN0aXZlcyBoYXZlIGJlZW4gZGlzY292ZXJlZCB0aGVuIHVwZGF0ZSB0aGUgbW9ua2V5LXBhdGNoCiAgICAgICAgICAgICAgICBpZiAoZGlyZWN0aXZlcyAmJiBjb250ZXh0LmRpcmVjdGl2ZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZGlyZWN0aXZlcyA9IGRpcmVjdGl2ZXM7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkaXJlY3RpdmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShkaXJlY3RpdmVzW2ldLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhdHRhY2hQYXRjaERhdGEoY29udGV4dC5uYXRpdmUsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgbXBWYWx1ZSA9IGNvbnRleHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgckVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGFyZ2V0KSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREb21Ob2RlKHJFbGVtZW50KTsKICAgICAgICAgICAgLy8gaWYgdGhlIGNvbnRleHQgaXMgbm90IGZvdW5kIHRoZW4gd2UgbmVlZCB0byB0cmF2ZXJzZSB1cHdhcmRzIHVwIHRoZSBET00KICAgICAgICAgICAgLy8gdG8gZmluZCB0aGUgbmVhcmVzdCBlbGVtZW50IHRoYXQgaGFzIGFscmVhZHkgYmVlbiBtb25rZXkgcGF0Y2hlZCB3aXRoIGRhdGEKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGFyZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJFbGVtZW50KSk7CiAgICAgICAgICAgIHdoaWxlIChwYXJlbnQgPSBwYXJlbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGFyZW50Q29udGV4dCA9IHJlYWRQYXRjaGVkRGF0YShwYXJlbnQpOwogICAgICAgICAgICAgICAgaWYgKHBhcmVudENvbnRleHQpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IGxWaWV3OwogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhcmVudENvbnRleHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudENvbnRleHQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGxWaWV3ID0gcGFyZW50Q29udGV4dC5sVmlldzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGVkZ2Ugb2YgdGhlIGFwcCB3YXMgYWxzbyByZWFjaGVkIGhlcmUgdGhyb3VnaCBhbm90aGVyIG1lYW5zCiAgICAgICAgICAgICAgICAgICAgLy8gKG1heWJlIGJlY2F1c2UgdGhlIERPTSB3YXMgY2hhbmdlZCBtYW51YWxseSkuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFsVmlldykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZmluZFZpYU5hdGl2ZUVsZW1lbnQobFZpZXcsIHJFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZSA9IHVud3JhcFJOb2RlKGxWaWV3W2luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IGNyZWF0ZUxDb250ZXh0KGxWaWV3LCBpbmRleCwgbmF0aXZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG1wVmFsdWUgPSBjb250ZXh0OwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobXBWYWx1ZSkpKSB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGluc3RhbmNlIG9mIGEgYExDb250ZXh0YCBjb250ZXh0CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleAogICAgICogQHBhcmFtIHs/fSBuYXRpdmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUxDb250ZXh0KGxWaWV3LCBub2RlSW5kZXgsIG5hdGl2ZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGxWaWV3LAogICAgICAgICAgICBub2RlSW5kZXgsCiAgICAgICAgICAgIG5hdGl2ZSwKICAgICAgICAgICAgY29tcG9uZW50OiB1bmRlZmluZWQsCiAgICAgICAgICAgIGRpcmVjdGl2ZXM6IHVuZGVmaW5lZCwKICAgICAgICAgICAgbG9jYWxSZWZzOiB1bmRlZmluZWQsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogVGFrZXMgYSBjb21wb25lbnQgaW5zdGFuY2UgYW5kIHJldHVybnMgdGhlIHZpZXcgZm9yIHRoYXQgY29tcG9uZW50LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50SW5zdGFuY2UKICAgICAqIEByZXR1cm4gez99IFRoZSBjb21wb25lbnQncyB2aWV3CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudFZpZXdCeUluc3RhbmNlKGNvbXBvbmVudEluc3RhbmNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBsVmlldyA9IHJlYWRQYXRjaGVkRGF0YShjb21wb25lbnRJbnN0YW5jZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2aWV3OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KGxWaWV3KSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5vZGVJbmRleCA9IGZpbmRWaWFDb21wb25lbnQobFZpZXcsIGNvbXBvbmVudEluc3RhbmNlKTsKICAgICAgICAgICAgdmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChub2RlSW5kZXgsIGxWaWV3KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gY3JlYXRlTENvbnRleHQobFZpZXcsIG5vZGVJbmRleCwgKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdbSE9TVF0pKSk7CiAgICAgICAgICAgIGNvbnRleHQuY29tcG9uZW50ID0gY29tcG9uZW50SW5zdGFuY2U7CiAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb21wb25lbnRJbnN0YW5jZSwgY29udGV4dCk7CiAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShjb250ZXh0Lm5hdGl2ZSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3KSkpKTsKICAgICAgICAgICAgdmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2aWV3OwogICAgfQogICAgLyoqCiAgICAgKiBBc3NpZ25zIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBnaXZlbiB0YXJnZXQgKHdoaWNoIGNvdWxkIGJlIGEgY29tcG9uZW50LAogICAgICogZGlyZWN0aXZlIG9yIERPTSBub2RlIGluc3RhbmNlKSB1c2luZyBtb25rZXktcGF0Y2hpbmcuCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhdHRhY2hQYXRjaERhdGEodGFyZ2V0LCBkYXRhKSB7CiAgICAgICAgdGFyZ2V0W01PTktFWV9QQVRDSF9LRVlfTkFNRV0gPSBkYXRhOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0NvbXBvbmVudEluc3RhbmNlKGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlLmNvbnN0cnVjdG9yICYmIGluc3RhbmNlLmNvbnN0cnVjdG9yLsm1Y21wOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0RpcmVjdGl2ZUluc3RhbmNlKGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGluc3RhbmNlICYmIGluc3RhbmNlLmNvbnN0cnVjdG9yICYmIGluc3RhbmNlLmNvbnN0cnVjdG9yLsm1ZGlyOwogICAgfQogICAgLyoqCiAgICAgKiBMb2NhdGVzIHRoZSBlbGVtZW50IHdpdGhpbiB0aGUgZ2l2ZW4gTFZpZXcgYW5kIHJldHVybnMgdGhlIG1hdGNoaW5nIGluZGV4CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZmluZFZpYU5hdGl2ZUVsZW1lbnQobFZpZXcsIHRhcmdldCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgICAgICB3aGlsZSAodE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYXRpdmUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZU9yTnVsbCh0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgICAgIGlmIChuYXRpdmUgPT09IHRhcmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHROb2RlLmluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHROb2RlID0gdHJhdmVyc2VOZXh0RWxlbWVudCh0Tm9kZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogTG9jYXRlcyB0aGUgbmV4dCB0Tm9kZSAoY2hpbGQsIHNpYmxpbmcgb3IgcGFyZW50KS4KICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRyYXZlcnNlTmV4dEVsZW1lbnQodE5vZGUpIHsKICAgICAgICBpZiAodE5vZGUuY2hpbGQpIHsKICAgICAgICAgICAgcmV0dXJuIHROb2RlLmNoaWxkOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0Tm9kZS5uZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB0Tm9kZS5uZXh0OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gTGV0J3MgdGFrZSB0aGUgZm9sbG93aW5nIHRlbXBsYXRlOiA8ZGl2PjxzcGFuPnRleHQ8L3NwYW4+PC9kaXY+PGNvbXBvbmVudC8+CiAgICAgICAgICAgIC8vIEFmdGVyIGNoZWNraW5nIHRoZSB0ZXh0IG5vZGUsIHdlIG5lZWQgdG8gZmluZCB0aGUgbmV4dCBwYXJlbnQgdGhhdCBoYXMgYSAibmV4dCIgVE5vZGUsCiAgICAgICAgICAgIC8vIGluIHRoaXMgY2FzZSB0aGUgcGFyZW50IGBkaXZgLCBzbyB0aGF0IHdlIGNhbiBmaW5kIHRoZSBjb21wb25lbnQuCiAgICAgICAgICAgIHdoaWxlICh0Tm9kZS5wYXJlbnQgJiYgIXROb2RlLnBhcmVudC5uZXh0KSB7CiAgICAgICAgICAgICAgICB0Tm9kZSA9IHROb2RlLnBhcmVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdE5vZGUucGFyZW50ICYmIHROb2RlLnBhcmVudC5uZXh0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTG9jYXRlcyB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgZ2l2ZW4gTFZpZXcgYW5kIHJldHVybnMgdGhlIG1hdGNoaW5nIGluZGV4CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudEluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kVmlhQ29tcG9uZW50KGxWaWV3LCBjb21wb25lbnRJbnN0YW5jZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnRJbmRpY2VzID0gbFZpZXdbVFZJRVddLmNvbXBvbmVudHM7CiAgICAgICAgaWYgKGNvbXBvbmVudEluZGljZXMpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRJbmRpY2VzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Q29tcG9uZW50SW5kZXggPSBjb21wb25lbnRJbmRpY2VzW2ldOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChlbGVtZW50Q29tcG9uZW50SW5kZXgsIGxWaWV3KTsKICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRWaWV3W0NPTlRFWFRdID09PSBjb21wb25lbnRJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50Q29tcG9uZW50SW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdENvbXBvbmVudFZpZXcgPSBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgoSEVBREVSX09GRlNFVCwgbFZpZXcpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSByb290Q29tcG9uZW50Vmlld1tDT05URVhUXTsKICAgICAgICAgICAgaWYgKHJvb3RDb21wb25lbnQgPT09IGNvbXBvbmVudEluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgZGVhbGluZyB3aXRoIHRoZSByb290IGVsZW1lbnQgaGVyZSB0aGVyZWZvcmUgd2Uga25vdyB0aGF0IHRoZQogICAgICAgICAgICAgICAgLy8gZWxlbWVudCBpcyB0aGUgdmVyeSBmaXJzdCBlbGVtZW50IGFmdGVyIHRoZSBIRUFERVIgZGF0YSBpbiB0aGUgbFZpZXcKICAgICAgICAgICAgICAgIHJldHVybiBIRUFERVJfT0ZGU0VUOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogTG9jYXRlcyB0aGUgZGlyZWN0aXZlIHdpdGhpbiB0aGUgZ2l2ZW4gTFZpZXcgYW5kIHJldHVybnMgdGhlIG1hdGNoaW5nIGluZGV4CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kVmlhRGlyZWN0aXZlKGxWaWV3LCBkaXJlY3RpdmVJbnN0YW5jZSkgewogICAgICAgIC8vIGlmIGEgZGlyZWN0aXZlIGlzIG1vbmtleSBwYXRjaGVkIHRoZW4gaXQgd2lsbCAoYnkgZGVmYXVsdCkKICAgICAgICAvLyBoYXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBMVmlldyBvZiB0aGUgY3VycmVudCB2aWV3LiBUaGUKICAgICAgICAvLyBlbGVtZW50IGJvdW5kIHRvIHRoZSBkaXJlY3RpdmUgYmVpbmcgc2VhcmNoIGxpdmVzIHNvbWV3aGVyZQogICAgICAgIC8vIGluIHRoZSB2aWV3IGRhdGEuIFdlIGxvb3AgdGhyb3VnaCB0aGUgbm9kZXMgYW5kIGNoZWNrIHRoZWlyCiAgICAgICAgLy8gbGlzdCBvZiBkaXJlY3RpdmVzIGZvciB0aGUgaW5zdGFuY2UuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0Tm9kZSA9IGxWaWV3W1RWSUVXXS5maXJzdENoaWxkOwogICAgICAgIHdoaWxlICh0Tm9kZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZUluZGV4U3RhcnQgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVJbmRleEVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IGRpcmVjdGl2ZUluZGV4U3RhcnQ7IGkgPCBkaXJlY3RpdmVJbmRleEVuZDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAobFZpZXdbaV0gPT09IGRpcmVjdGl2ZUluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHROb2RlLmluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHROb2RlID0gdHJhdmVyc2VOZXh0RWxlbWVudCh0Tm9kZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZGlyZWN0aXZlcyBleHRyYWN0ZWQgZnJvbSB0aGUgZ2l2ZW4gdmlldyBiYXNlZCBvbiB0aGUKICAgICAqIHByb3ZpZGVkIGxpc3Qgb2YgZGlyZWN0aXZlIGluZGV4IHZhbHVlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleCBUaGUgbm9kZSBpbmRleAogICAgICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdGFyZ2V0IHZpZXcgZGF0YQogICAgICogQHBhcmFtIHs/fSBpbmNsdWRlQ29tcG9uZW50cyBXaGV0aGVyIG9yIG5vdCB0byBpbmNsdWRlIGNvbXBvbmVudHMgaW4gcmV0dXJuZWQgZGlyZWN0aXZlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlc0F0Tm9kZUluZGV4KG5vZGVJbmRleCwgbFZpZXcsIGluY2x1ZGVDb21wb25lbnRzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpcmVjdGl2ZVN0YXJ0SW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICBpZiAoZGlyZWN0aXZlU3RhcnRJbmRleCA9PSAwKQogICAgICAgICAgICByZXR1cm4gRU1QVFlfQVJSQVk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpcmVjdGl2ZUVuZEluZGV4ID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgICAgIGlmICghaW5jbHVkZUNvbXBvbmVudHMgJiYgdE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLykKICAgICAgICAgICAgZGlyZWN0aXZlU3RhcnRJbmRleCsrOwogICAgICAgIHJldHVybiBsVmlldy5zbGljZShkaXJlY3RpdmVTdGFydEluZGV4LCBkaXJlY3RpdmVFbmRJbmRleCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbm9kZUluZGV4CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRDb21wb25lbnRBdE5vZGVJbmRleChub2RlSW5kZXgsIGxWaWV3KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RWSUVXXS5kYXRhW25vZGVJbmRleF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpcmVjdGl2ZVN0YXJ0SW5kZXggPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICByZXR1cm4gdE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLyA/IGxWaWV3W2RpcmVjdGl2ZVN0YXJ0SW5kZXhdIDogbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZXJyb3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ2FsbGVkIHdoZW4gZGlyZWN0aXZlcyBpbmplY3QgZWFjaCBvdGhlciAoY3JlYXRpbmcgYSBjaXJjdWxhciBkZXBlbmRlbmN5KQogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdGhyb3dDeWNsaWNEZXBlbmRlbmN5RXJyb3IodG9rZW4pIHsKICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBpbnN0YW50aWF0ZSBjeWNsaWMgZGVwZW5kZW5jeSEgJHt0b2tlbn1gKTsKICAgIH0KICAgIC8qKgogICAgICogQ2FsbGVkIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGNvbXBvbmVudCBzZWxlY3RvcnMgdGhhdCBtYXRjaCBhIGdpdmVuIG5vZGUKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93TXVsdGlwbGVDb21wb25lbnRFcnJvcih0Tm9kZSkgewogICAgICAgIHRocm93IG5ldyBFcnJvcihgTXVsdGlwbGUgY29tcG9uZW50cyBtYXRjaCBub2RlIHdpdGggdGFnbmFtZSAke3ROb2RlLnRhZ05hbWV9YCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93TWl4ZWRNdWx0aVByb3ZpZGVyRXJyb3IoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgbWl4IG11bHRpIHByb3ZpZGVycyBhbmQgcmVndWxhciBwcm92aWRlcnNgKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gbmdNb2R1bGVUeXBlCiAgICAgKiBAcGFyYW0gez89fSBwcm92aWRlcnMKICAgICAqIEBwYXJhbSB7Pz19IHByb3ZpZGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0aHJvd0ludmFsaWRQcm92aWRlckVycm9yKG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzLCBwcm92aWRlcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbmdNb2R1bGVEZXRhaWwgPSAnJzsKICAgICAgICBpZiAobmdNb2R1bGVUeXBlICYmIHByb3ZpZGVycykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyRGV0YWlsID0gcHJvdmlkZXJzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdiA9PiB2ID09IHByb3ZpZGVyID8gJz8nICsgcHJvdmlkZXIgKyAnPycgOiAnLi4uJykpOwogICAgICAgICAgICBuZ01vZHVsZURldGFpbCA9CiAgICAgICAgICAgICAgICBgIC0gb25seSBpbnN0YW5jZXMgb2YgUHJvdmlkZXIgYW5kIFR5cGUgYXJlIGFsbG93ZWQsIGdvdDogWyR7cHJvdmlkZXJEZXRhaWwuam9pbignLCAnKX1dYDsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHByb3ZpZGVyIGZvciB0aGUgTmdNb2R1bGUgJyR7c3RyaW5naWZ5KG5nTW9kdWxlVHlwZSl9J2AgKyBuZ01vZHVsZURldGFpbCk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBFeHByZXNzaW9uQ2hhbmdlZEFmdGVyQ2hlY2tlZCBlcnJvciBpZiBjaGVja05vQ2hhbmdlcyBtb2RlIGlzIG9uLgogICAgICogQHBhcmFtIHs/fSBjcmVhdGlvbk1vZGUKICAgICAqIEBwYXJhbSB7P30gb2xkVmFsdWUKICAgICAqIEBwYXJhbSB7P30gY3VyclZhbHVlCiAgICAgKiBAcGFyYW0gez89fSBwcm9wTmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdGhyb3dFcnJvcklmTm9DaGFuZ2VzTW9kZShjcmVhdGlvbk1vZGUsIG9sZFZhbHVlLCBjdXJyVmFsdWUsIHByb3BOYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpZWxkID0gcHJvcE5hbWUgPyBgIGZvciAnJHtwcm9wTmFtZX0nYCA6ICcnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbXNnID0gYEV4cHJlc3Npb25DaGFuZ2VkQWZ0ZXJJdEhhc0JlZW5DaGVja2VkRXJyb3I6IEV4cHJlc3Npb24gaGFzIGNoYW5nZWQgYWZ0ZXIgaXQgd2FzIGNoZWNrZWQuIFByZXZpb3VzIHZhbHVlJHtmaWVsZH06ICcke29sZFZhbHVlfScuIEN1cnJlbnQgdmFsdWU6ICcke2N1cnJWYWx1ZX0nLmA7CiAgICAgICAgaWYgKGNyZWF0aW9uTW9kZSkgewogICAgICAgICAgICBtc2cgKz0KICAgICAgICAgICAgICAgIGAgSXQgc2VlbXMgbGlrZSB0aGUgdmlldyBoYXMgYmVlbiBjcmVhdGVkIGFmdGVyIGl0cyBwYXJlbnQgYW5kIGl0cyBjaGlsZHJlbiBoYXZlIGJlZW4gZGlydHkgY2hlY2tlZC5gICsKICAgICAgICAgICAgICAgICAgICBgIEhhcyBpdCBiZWVuIGNyZWF0ZWQgaW4gYSBjaGFuZ2UgZGV0ZWN0aW9uIGhvb2s/YDsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETzogaW5jbHVkZSBkZWJ1ZyBjb250ZXh0LCBzZWUgYHZpZXdEZWJ1Z0Vycm9yYCBmdW5jdGlvbiBpbgogICAgICAgIC8vIGBwYWNrYWdlcy9jb3JlL3NyYy92aWV3L2Vycm9ycy50c2AgZm9yIHJlZmVyZW5jZS4KICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSByb290SW5kZXgKICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbkluZGV4CiAgICAgKiBAcGFyYW0gez99IG1ldGEKICAgICAqIEBwYXJhbSB7P30gY2hhbmdlZFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb25zdHJ1Y3REZXRhaWxzRm9ySW50ZXJwb2xhdGlvbihsVmlldywgcm9vdEluZGV4LCBleHByZXNzaW9uSW5kZXgsIG1ldGEsIGNoYW5nZWRWYWx1ZSkgewogICAgICAgIGNvbnN0IFtwcm9wTmFtZSwgcHJlZml4LCAuLi5jaHVua3NdID0gbWV0YS5zcGxpdChJTlRFUlBPTEFUSU9OX0RFTElNSVRFUik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBvbGRWYWx1ZSA9IHByZWZpeDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5ld1ZhbHVlID0gcHJlZml4OwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2h1bmtzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2xvdElkeCA9IHJvb3RJbmRleCArIGk7CiAgICAgICAgICAgIG9sZFZhbHVlICs9IGAke2xWaWV3W3Nsb3RJZHhdfSR7Y2h1bmtzW2ldfWA7CiAgICAgICAgICAgIG5ld1ZhbHVlICs9IGAke3Nsb3RJZHggPT09IGV4cHJlc3Npb25JbmRleCA/IGNoYW5nZWRWYWx1ZSA6IGxWaWV3W3Nsb3RJZHhdfSR7Y2h1bmtzW2ldfWA7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHByb3BOYW1lLCBvbGRWYWx1ZSwgbmV3VmFsdWUgfTsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhbiBvYmplY3QgdGhhdCBjb250YWlucyBkZXRhaWxzIGZvciB0aGUgRXhwcmVzc2lvbkNoYW5nZWRBZnRlckl0SGFzQmVlbkNoZWNrZWRFcnJvcjoKICAgICAqIC0gcHJvcGVydHkgbmFtZSAoZm9yIHByb3BlcnR5IGJpbmRpbmdzIG9yIGludGVycG9sYXRpb25zKQogICAgICogLSBvbGQgYW5kIG5ldyB2YWx1ZXMsIGVucmljaGVkIHVzaW5nIGluZm9ybWF0aW9uIGZyb20gbWV0YWRhdGEKICAgICAqCiAgICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIHRoZSBtZXRhZGF0YSBzdG9yYWdlIGZvcm1hdCBjYW4gYmUgZm91bmQgaW4gYHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGFgCiAgICAgKiBmdW5jdGlvbiBkZXNjcmlwdGlvbi4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4CiAgICAgKiBAcGFyYW0gez99IG9sZFZhbHVlCiAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRFeHByZXNzaW9uQ2hhbmdlZEVycm9yRGV0YWlscyhsVmlldywgYmluZGluZ0luZGV4LCBvbGRWYWx1ZSwgbmV3VmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdERhdGEgPSBsVmlld1tUVklFV10uZGF0YTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSB0RGF0YVtiaW5kaW5nSW5kZXhdOwogICAgICAgIGlmICh0eXBlb2YgbWV0YWRhdGEgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8vIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSBpbnRlcnBvbGF0aW9uCiAgICAgICAgICAgIGlmIChtZXRhZGF0YS5pbmRleE9mKElOVEVSUE9MQVRJT05fREVMSU1JVEVSKSA+IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29uc3RydWN0RGV0YWlsc0ZvckludGVycG9sYXRpb24obFZpZXcsIGJpbmRpbmdJbmRleCwgYmluZGluZ0luZGV4LCBtZXRhZGF0YSwgbmV3VmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG1ldGFkYXRhIGZvciBwcm9wZXJ0eSBiaW5kaW5nCiAgICAgICAgICAgIHJldHVybiB7IHByb3BOYW1lOiBtZXRhZGF0YSwgb2xkVmFsdWUsIG5ld1ZhbHVlIH07CiAgICAgICAgfQogICAgICAgIC8vIG1ldGFkYXRhIGlzIG5vdCBhdmFpbGFibGUgZm9yIHRoaXMgZXhwcmVzc2lvbiwgY2hlY2sgaWYgdGhpcyBleHByZXNzaW9uIGlzIGEgcGFydCBvZiB0aGUKICAgICAgICAvLyBwcm9wZXJ0eSBpbnRlcnBvbGF0aW9uIGJ5IGdvaW5nIGZyb20gdGhlIGN1cnJlbnQgYmluZGluZyBpbmRleCBsZWZ0IGFuZCBsb29rIGZvciBhIHN0cmluZyB0aGF0CiAgICAgICAgLy8gY29udGFpbnMgSU5URVJQT0xBVElPTl9ERUxJTUlURVIsIHRoZSBsYXlvdXQgaW4gdFZpZXcuZGF0YSBmb3IgdGhpcyBjYXNlIHdpbGwgbG9vayBsaWtlIHRoaXM6CiAgICAgICAgLy8gWy4uLiwgJ2lk77+9UHJlZml4IO+/vSBhbmQg77+9IHN1ZmZpeCcsIG51bGwsIG51bGwsIG51bGwsIC4uLl0KICAgICAgICBpZiAobWV0YWRhdGEgPT09IG51bGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaWR4ID0gYmluZGluZ0luZGV4IC0gMTsKICAgICAgICAgICAgd2hpbGUgKHR5cGVvZiB0RGF0YVtpZHhdICE9PSAnc3RyaW5nJyAmJiB0RGF0YVtpZHggKyAxXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWR4LS07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZXRhID0gdERhdGFbaWR4XTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBtZXRhID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWF0Y2hlcyA9IG1ldGEubWF0Y2gobmV3IFJlZ0V4cChJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiwgJ2cnKSk7CiAgICAgICAgICAgICAgICAvLyBmaXJzdCBpbnRlcnBvbGF0aW9uIGRlbGltaXRlciBzZXBhcmF0ZXMgcHJvcGVydHkgbmFtZSBmcm9tIGludGVycG9sYXRpb24gcGFydHMgKGluIGNhc2Ugb2YKICAgICAgICAgICAgICAgIC8vIHByb3BlcnR5IGludGVycG9sYXRpb25zKSwgc28gd2Ugc3VidHJhY3Qgb25lIGZyb20gdG90YWwgbnVtYmVyIG9mIGZvdW5kIGRlbGltaXRlcnMKICAgICAgICAgICAgICAgIGlmIChtYXRjaGVzICYmIChtYXRjaGVzLmxlbmd0aCAtIDEpID4gYmluZGluZ0luZGV4IC0gaWR4KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbnN0cnVjdERldGFpbHNGb3JJbnRlcnBvbGF0aW9uKGxWaWV3LCBpZHgsIGJpbmRpbmdJbmRleCwgbWV0YSwgbmV3VmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHByb3BOYW1lOiB1bmRlZmluZWQsIG9sZFZhbHVlLCBuZXdWYWx1ZSB9OwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGB0cnVlYCBpZiB0aGUgYFROb2RlYCBoYXMgYSBkaXJlY3RpdmUgd2hpY2ggaGFzIGBcQElucHV0KClgIGZvciBgY2xhc3NgIGJpbmRpbmcuCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8ZGl2IG15LWRpciBbY2xhc3NdPSJleHAiPjwvZGl2PgogICAgICogYGBgCiAgICAgKiBhbmQKICAgICAqIGBgYAogICAgICogXEBEaXJlY3RpdmUoewogICAgICogfSkKICAgICAqIGNsYXNzIE15RGlyZWN0aXZlIHsKICAgICAqIFxASW5wdXQoKQogICAgICogICBjbGFzczogc3RyaW5nOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogSW4gdGhlIGFib3ZlIGNhc2UgaXQgaXMgbmVjZXNzYXJ5IHRvIHdyaXRlIHRoZSByZWNvbmNpbGVkIHN0eWxpbmcgaW5mb3JtYXRpb24gaW50byB0aGUKICAgICAqIGRpcmVjdGl2ZSdzIGlucHV0LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc0NsYXNzSW5wdXQodE5vZGUpIHsKICAgICAgICByZXR1cm4gKHROb2RlLmZsYWdzICYgMTYgLyogaGFzQ2xhc3NJbnB1dCAqLykgIT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYHRydWVgIGlmIHRoZSBgVE5vZGVgIGhhcyBhIGRpcmVjdGl2ZSB3aGljaCBoYXMgYFxASW5wdXQoKWAgZm9yIGBzdHlsZWAgYmluZGluZy4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIDxkaXYgbXktZGlyIFtzdHlsZV09ImV4cCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqIGFuZAogICAgICogYGBgCiAgICAgKiBcQERpcmVjdGl2ZSh7CiAgICAgKiB9KQogICAgICogY2xhc3MgTXlEaXJlY3RpdmUgewogICAgICogXEBJbnB1dCgpCiAgICAgKiAgIGNsYXNzOiBzdHJpbmc7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJbiB0aGUgYWJvdmUgY2FzZSBpdCBpcyBuZWNlc3NhcnkgdG8gd3JpdGUgdGhlIHJlY29uY2lsZWQgc3R5bGluZyBpbmZvcm1hdGlvbiBpbnRvIHRoZQogICAgICogZGlyZWN0aXZlJ3MgaW5wdXQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaGFzU3R5bGVJbnB1dCh0Tm9kZSkgewogICAgICAgIHJldHVybiAodE5vZGUuZmxhZ3MgJiAzMiAvKiBoYXNTdHlsZUlucHV0ICovKSAhPT0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvc3R5bGluZy9jbGFzc19kaWZmZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGluZGV4IG9mIGBjbGFzc1RvU2VhcmNoYCBpbiBgY2xhc3NOYW1lYCB0YWtpbmcgdG9rZW4gYm91bmRhcmllcyBpbnRvIGFjY291bnQuCiAgICAgKgogICAgICogYGNsYXNzSW5kZXhPZignQUIgQScsICdBJywgMClgIHdpbGwgYmUgMyAobm90IDAgc2luY2UgYEFCIT09QWApCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWUgQSBzdHJpbmcgY29udGFpbmluZyBjbGFzc2VzICh3aGl0ZXNwYWNlIHNlcGFyYXRlZCkKICAgICAqIEBwYXJhbSB7P30gY2xhc3NUb1NlYXJjaCBBIGNsYXNzIG5hbWUgdG8gbG9jYXRlCiAgICAgKiBAcGFyYW0gez99IHN0YXJ0aW5nSW5kZXggU3RhcnRpbmcgbG9jYXRpb24gb2Ygc2VhcmNoCiAgICAgKiBAcmV0dXJuIHs/fSBhbiBpbmRleCBvZiB0aGUgbG9jYXRlZCBjbGFzcyAob3IgLTEgaWYgbm90IGZvdW5kKQogICAgICovCiAgICBmdW5jdGlvbiBjbGFzc0luZGV4T2YoY2xhc3NOYW1lLCBjbGFzc1RvU2VhcmNoLCBzdGFydGluZ0luZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vdEVxdWFsKGNsYXNzVG9TZWFyY2gsICcnLCAnY2FuIG5vdCBsb29rIGZvciAiIiBzdHJpbmcuJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBlbmQgPSBjbGFzc05hbWUubGVuZ3RoOwogICAgICAgIHdoaWxlICh0cnVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZm91bmRJbmRleCA9IGNsYXNzTmFtZS5pbmRleE9mKGNsYXNzVG9TZWFyY2gsIHN0YXJ0aW5nSW5kZXgpOwogICAgICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpCiAgICAgICAgICAgICAgICByZXR1cm4gZm91bmRJbmRleDsKICAgICAgICAgICAgaWYgKGZvdW5kSW5kZXggPT09IDAgfHwgY2xhc3NOYW1lLmNoYXJDb2RlQXQoZm91bmRJbmRleCAtIDEpIDw9IDMyIC8qIFNQQUNFICovKSB7CiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBpdCBoYXMgbGVhZGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBjbGFzc1RvU2VhcmNoLmxlbmd0aDsKICAgICAgICAgICAgICAgIGlmIChmb3VuZEluZGV4ICsgbGVuZ3RoID09PSBlbmQgfHwKICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWUuY2hhckNvZGVBdChmb3VuZEluZGV4ICsgbGVuZ3RoKSA8PSAzMiAvKiBTUEFDRSAqLykgewogICAgICAgICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IGl0IGhhcyB0cmFpbGluZyB3aGl0ZXNwYWNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kSW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRmFsc2UgcG9zaXRpdmUsIGtlZXAgc2VhcmNoaW5nIGZyb20gd2hlcmUgd2UgbGVmdCBvZmYuCiAgICAgICAgICAgIHN0YXJ0aW5nSW5kZXggPSBmb3VuZEluZGV4ICsgMTsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOR19URU1QTEFURV9TRUxFQ1RPUiA9ICduZy10ZW1wbGF0ZSc7CiAgICAvKioKICAgICAqIFNlYXJjaCB0aGUgYFRBdHRyaWJ1dGVzYCB0byBzZWUgaWYgaXQgY29udGFpbnMgYGNzc0NsYXNzVG9NYXRjaGAgKGNhc2UgaW5zZW5zaXRpdmUpCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBhdHRycyBgVEF0dHJpYnV0ZXNgIHRvIHNlYXJjaCB0aHJvdWdoLgogICAgICogQHBhcmFtIHs/fSBjc3NDbGFzc1RvTWF0Y2ggY2xhc3MgdG8gbWF0Y2ggKGxvd2VyY2FzZSkKICAgICAqIEBwYXJhbSB7P30gaXNQcm9qZWN0aW9uTW9kZSBXaGV0aGVyIG9yIG5vdCBjbGFzcyBtYXRjaGluZyBzaG91bGQgbG9vayBpbnRvIHRoZSBhdHRyaWJ1dGUgYGNsYXNzYCBpbgogICAgICogICAgYWRkaXRpb24gdG8gdGhlIGBBdHRyaWJ1dGVNYXJrZXIuQ2xhc3Nlc2AuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0Nzc0NsYXNzTWF0Y2hpbmcoYXR0cnMsIGNzc0NsYXNzVG9NYXRjaCwgaXNQcm9qZWN0aW9uTW9kZSkgewogICAgICAgIC8vIFRPRE8obWlza28pOiBUaGUgZmFjdCB0aGF0IHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8ga25vdyBhYm91dCBgaXNQcm9qZWN0aW9uTW9kZWAgc2VlbXMgc3VzcGVjdC4KICAgICAgICAvLyBJdCBpcyBzdHJhbmdlIHRvIG1lIHRoYXQgc29tZXRpbWVzIHRoZSBjbGFzcyBpbmZvcm1hdGlvbiBjb21lcyBpbiBmb3JtIG9mIGBjbGFzc2AgYXR0cmlidXRlCiAgICAgICAgLy8gYW5kIHNvbWV0aW1lcyBpbiBmb3JtIG9mIGBBdHRyaWJ1dGVNYXJrZXIuQ2xhc3Nlc2AuIFNvbWUgaW52ZXN0aWdhdGlvbiBpcyBuZWVkZWQgdG8gZGV0ZXJtaW5lCiAgICAgICAgLy8gaWYgdGhhdCBpcyB0aGUgcmlnaHQgYmVoYXZpb3IuCiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKGNzc0NsYXNzVG9NYXRjaCwgY3NzQ2xhc3NUb01hdGNoLnRvTG93ZXJDYXNlKCksICdDbGFzcyBuYW1lIGV4cGVjdGVkIHRvIGJlIGxvd2VyY2FzZS4nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIHdoaWxlIChpIDwgYXR0cnMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGl0ZW0gPSBhdHRyc1tpKytdOwogICAgICAgICAgICBpZiAoaXNQcm9qZWN0aW9uTW9kZSAmJiBpdGVtID09PSAnY2xhc3MnKSB7CiAgICAgICAgICAgICAgICBpdGVtID0gKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJzW2ldKSk7CiAgICAgICAgICAgICAgICBpZiAoY2xhc3NJbmRleE9mKGl0ZW0udG9Mb3dlckNhc2UoKSwgY3NzQ2xhc3NUb01hdGNoLCAwKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpdGVtID09PSAxIC8qIENsYXNzZXMgKi8pIHsKICAgICAgICAgICAgICAgIC8vIFdlIGZvdW5kIHRoZSBjbGFzc2VzIHNlY3Rpb24uIFN0YXJ0IHNlYXJjaGluZyBmb3IgdGhlIGNsYXNzLgogICAgICAgICAgICAgICAgd2hpbGUgKGkgPCBhdHRycy5sZW5ndGggJiYgdHlwZW9mIChpdGVtID0gYXR0cnNbaSsrXSkgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3aGlsZSB3ZSBoYXZlIHN0cmluZ3MKICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbS50b0xvd2VyQ2FzZSgpID09PSBjc3NDbGFzc1RvTWF0Y2gpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGB0Tm9kZWAgcmVwcmVzZW50cyBhbiBpbmxpbmUgdGVtcGxhdGUgKGUuZy4gYCpuZ0ZvcmApLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdE5vZGUgY3VycmVudCBUTm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNJbmxpbmVUZW1wbGF0ZSh0Tm9kZSkgewogICAgICAgIHJldHVybiB0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyAmJiB0Tm9kZS50YWdOYW1lICE9PSBOR19URU1QTEFURV9TRUxFQ1RPUjsKICAgIH0KICAgIC8qKgogICAgICogRnVuY3Rpb24gdGhhdCBjaGVja3Mgd2hldGhlciBhIGdpdmVuIHROb2RlIG1hdGNoZXMgdGFnLWJhc2VkIHNlbGVjdG9yIGFuZCBoYXMgYSB2YWxpZCB0eXBlLgogICAgICoKICAgICAqIE1hdGNoaW5nIGNhbiBiZSBwZXJmb3JtZWQgaW4gMiBtb2RlczogcHJvamVjdGlvbiBtb2RlICh3aGVuIHdlIHByb2plY3Qgbm9kZXMpIGFuZCByZWd1bGFyCiAgICAgKiBkaXJlY3RpdmUgbWF0Y2hpbmcgbW9kZToKICAgICAqIC0gaW4gdGhlICJkaXJlY3RpdmUgbWF0Y2hpbmciIG1vZGUgd2UgZG8gX25vdF8gdGFrZSBUQ29udGFpbmVyJ3MgdGFnTmFtZSBpbnRvIGFjY291bnQgaWYgaXQgaXMKICAgICAqIGRpZmZlcmVudCBmcm9tIE5HX1RFTVBMQVRFX1NFTEVDVE9SICh2YWx1ZSBkaWZmZXJlbnQgZnJvbSBOR19URU1QTEFURV9TRUxFQ1RPUiBpbmRpY2F0ZXMgdGhhdCBhCiAgICAgKiB0YWcgbmFtZSB3YXMgZXh0cmFjdGVkIGZyb20gKiBzeW50YXggc28gd2Ugd291bGQgbWF0Y2ggdGhlIHNhbWUgZGlyZWN0aXZlIHR3aWNlKTsKICAgICAqIC0gaW4gdGhlICJwcm9qZWN0aW9uIiBtb2RlLCB3ZSB1c2UgYSB0YWcgbmFtZSBwb3RlbnRpYWxseSBleHRyYWN0ZWQgZnJvbSB0aGUgKiBzeW50YXggcHJvY2Vzc2luZwogICAgICogKGFwcGxpY2FibGUgdG8gVE5vZGVUeXBlLkNvbnRhaW5lciBvbmx5KS4KICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gY3VycmVudFNlbGVjdG9yCiAgICAgKiBAcGFyYW0gez99IGlzUHJvamVjdGlvbk1vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc1RhZ0FuZFR5cGVNYXRjaCh0Tm9kZSwgY3VycmVudFNlbGVjdG9yLCBpc1Byb2plY3Rpb25Nb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhZ05hbWVUb0NvbXBhcmUgPSB0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyAmJiAhaXNQcm9qZWN0aW9uTW9kZSA/CiAgICAgICAgICAgIE5HX1RFTVBMQVRFX1NFTEVDVE9SIDoKICAgICAgICAgICAgdE5vZGUudGFnTmFtZTsKICAgICAgICByZXR1cm4gY3VycmVudFNlbGVjdG9yID09PSB0YWdOYW1lVG9Db21wYXJlOwogICAgfQogICAgLyoqCiAgICAgKiBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gbWF0Y2ggYW4gSXZ5IG5vZGUgc3RhdGljIGRhdGEgYWdhaW5zdCBhIHNpbXBsZSBDU1Mgc2VsZWN0b3IKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byB0cnkgbWF0Y2hpbmcgYWdhaW5zdCB0aGUgbm9kZS4KICAgICAqIEBwYXJhbSB7P30gaXNQcm9qZWN0aW9uTW9kZSBpZiBgdHJ1ZWAgd2UgYXJlIG1hdGNoaW5nIGZvciBjb250ZW50IHByb2plY3Rpb24sIG90aGVyd2lzZSB3ZSBhcmUgZG9pbmcKICAgICAqIGRpcmVjdGl2ZSBtYXRjaGluZy4KICAgICAqIEByZXR1cm4gez99IHRydWUgaWYgbm9kZSBtYXRjaGVzIHRoZSBzZWxlY3Rvci4KICAgICAqLwogICAgZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3Rvcih0Tm9kZSwgc2VsZWN0b3IsIGlzUHJvamVjdGlvbk1vZGUpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChzZWxlY3RvclswXSwgJ1NlbGVjdG9yIHNob3VsZCBoYXZlIGEgdGFnIG5hbWUnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1vZGUgPSA0IC8qIEVMRU1FTlQgKi87CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGVBdHRycyA9IHROb2RlLmF0dHJzIHx8IFtdOwogICAgICAgIC8vIEZpbmQgdGhlIGluZGV4IG9mIGZpcnN0IGF0dHJpYnV0ZSB0aGF0IGhhcyBubyB2YWx1ZSwgb25seSBhIG5hbWUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5hbWVPbmx5TWFya2VySWR4ID0gZ2V0TmFtZU9ubHlNYXJrZXJJbmRleChub2RlQXR0cnMpOwogICAgICAgIC8vIFdoZW4gcHJvY2Vzc2luZyAiOm5vdCIgc2VsZWN0b3JzLCB3ZSBza2lwIHRvIHRoZSBuZXh0ICI6bm90IiBpZiB0aGUKICAgICAgICAvLyBjdXJyZW50IG9uZSBkb2Vzbid0IG1hdGNoCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBza2lwVG9OZXh0U2VsZWN0b3IgPSBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudCA9IHNlbGVjdG9yW2ldOwogICAgICAgICAgICBpZiAodHlwZW9mIGN1cnJlbnQgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBmaW5pc2ggcHJvY2Vzc2luZyBhIDpub3Qgc2VsZWN0b3IgYW5kIGl0IGhhc24ndCBmYWlsZWQsIHJldHVybiBmYWxzZQogICAgICAgICAgICAgICAgaWYgKCFza2lwVG9OZXh0U2VsZWN0b3IgJiYgIWlzUG9zaXRpdmUobW9kZSkgJiYgIWlzUG9zaXRpdmUoY3VycmVudCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgc2tpcHBpbmcgdG8gdGhlIG5leHQgOm5vdCgpIGFuZCB0aGlzIG1vZGUgZmxhZyBpcyBwb3NpdGl2ZSwKICAgICAgICAgICAgICAgIC8vIGl0J3MgYSBwYXJ0IG9mIHRoZSBjdXJyZW50IDpub3QoKSBzZWxlY3RvciwgYW5kIHdlIHNob3VsZCBrZWVwIHNraXBwaW5nCiAgICAgICAgICAgICAgICBpZiAoc2tpcFRvTmV4dFNlbGVjdG9yICYmIGlzUG9zaXRpdmUoY3VycmVudCkpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICBza2lwVG9OZXh0U2VsZWN0b3IgPSBmYWxzZTsKICAgICAgICAgICAgICAgIG1vZGUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnQpKSkgfCAobW9kZSAmIDEgLyogTk9UICovKTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChza2lwVG9OZXh0U2VsZWN0b3IpCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgaWYgKG1vZGUgJiA0IC8qIEVMRU1FTlQgKi8pIHsKICAgICAgICAgICAgICAgIG1vZGUgPSAyIC8qIEFUVFJJQlVURSAqLyB8IG1vZGUgJiAxIC8qIE5PVCAqLzsKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ICE9PSAnJyAmJiAhaGFzVGFnQW5kVHlwZU1hdGNoKHROb2RlLCBjdXJyZW50LCBpc1Byb2plY3Rpb25Nb2RlKSB8fAogICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPT09ICcnICYmIHNlbGVjdG9yLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yQXR0clZhbHVlID0gbW9kZSAmIDggLyogQ0xBU1MgKi8gPyBjdXJyZW50IDogc2VsZWN0b3JbKytpXTsKICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgbWF0Y2hpbmcgYWdhaW5zdCBjbGFzc2VzIHdoZW4gYSB0Tm9kZSBoYXMgYmVlbiBpbnN0YW50aWF0ZWQgd2l0aAogICAgICAgICAgICAgICAgLy8gY2xhc3MgYW5kIHN0eWxlIHZhbHVlcyBhcyBzZXBhcmF0ZSBhdHRyaWJ1dGUgdmFsdWVzIChlLmcuIFsndGl0bGUnLCBDTEFTUywgJ2ZvbyddKQogICAgICAgICAgICAgICAgaWYgKChtb2RlICYgOCAvKiBDTEFTUyAqLykgJiYgdE5vZGUuYXR0cnMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWlzQ3NzQ2xhc3NNYXRjaGluZyh0Tm9kZS5hdHRycywgKC8qKiBAdHlwZSB7P30gKi8gKHNlbGVjdG9yQXR0clZhbHVlKSksIGlzUHJvamVjdGlvbk1vZGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICBza2lwVG9OZXh0U2VsZWN0b3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gKG1vZGUgJiA4IC8qIENMQVNTICovKSA/ICdjbGFzcycgOiBjdXJyZW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYXR0ckluZGV4SW5Ob2RlID0gZmluZEF0dHJJbmRleEluTm9kZShhdHRyTmFtZSwgbm9kZUF0dHJzLCBpc0lubGluZVRlbXBsYXRlKHROb2RlKSwgaXNQcm9qZWN0aW9uTW9kZSk7CiAgICAgICAgICAgICAgICBpZiAoYXR0ckluZGV4SW5Ob2RlID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIGlmIChpc1Bvc2l0aXZlKG1vZGUpKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgc2tpcFRvTmV4dFNlbGVjdG9yID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvckF0dHJWYWx1ZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IG5vZGVBdHRyVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGF0dHJJbmRleEluTm9kZSA+IG5hbWVPbmx5TWFya2VySWR4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVBdHRyVmFsdWUgPSAnJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0Tm90RXF1YWwobm9kZUF0dHJzW2F0dHJJbmRleEluTm9kZV0sIDAgLyogTmFtZXNwYWNlVVJJICovLCAnV2UgZG8gbm90IG1hdGNoIGRpcmVjdGl2ZXMgb24gbmFtZXNwYWNlZCBhdHRyaWJ1dGVzJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvd2VyY2FzZSB0aGUgYXR0cmlidXRlIHZhbHVlIHRvIGJlIGFibGUgdG8gbWF0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VsZWN0b3JzIHdpdGhvdXQgY2FzZS1zZW5zaXRpdml0eQogICAgICAgICAgICAgICAgICAgICAgICAvLyAoc2VsZWN0b3JzIGFyZSBhbHJlYWR5IGluIGxvd2VyY2FzZSB3aGVuIGdlbmVyYXRlZCkKICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUF0dHJWYWx1ZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAobm9kZUF0dHJzW2F0dHJJbmRleEluTm9kZSArIDFdKSkpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21wYXJlQWdhaW5zdENsYXNzTmFtZSA9IG1vZGUgJiA4IC8qIENMQVNTICovID8gbm9kZUF0dHJWYWx1ZSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBhcmVBZ2FpbnN0Q2xhc3NOYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzSW5kZXhPZihjb21wYXJlQWdhaW5zdENsYXNzTmFtZSwgKC8qKiBAdHlwZSB7P30gKi8gKHNlbGVjdG9yQXR0clZhbHVlKSksIDApICE9PSAtMSB8fAogICAgICAgICAgICAgICAgICAgICAgICBtb2RlICYgMiAvKiBBVFRSSUJVVEUgKi8gJiYgc2VsZWN0b3JBdHRyVmFsdWUgIT09IG5vZGVBdHRyVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUG9zaXRpdmUobW9kZSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBUb05leHRTZWxlY3RvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpc1Bvc2l0aXZlKG1vZGUpIHx8IHNraXBUb05leHRTZWxlY3RvcjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1Bvc2l0aXZlKG1vZGUpIHsKICAgICAgICByZXR1cm4gKG1vZGUgJiAxIC8qIE5PVCAqLykgPT09IDA7CiAgICB9CiAgICAvKioKICAgICAqIEV4YW1pbmVzIHRoZSBhdHRyaWJ1dGUncyBkZWZpbml0aW9uIGFycmF5IGZvciBhIG5vZGUgdG8gZmluZCB0aGUgaW5kZXggb2YgdGhlCiAgICAgKiBhdHRyaWJ1dGUgdGhhdCBtYXRjaGVzIHRoZSBnaXZlbiBgbmFtZWAuCiAgICAgKgogICAgICogTk9URTogVGhpcyB3aWxsIG5vdCBtYXRjaCBuYW1lc3BhY2VkIGF0dHJpYnV0ZXMuCiAgICAgKgogICAgICogQXR0cmlidXRlIG1hdGNoaW5nIGRlcGVuZHMgdXBvbiBgaXNJbmxpbmVUZW1wbGF0ZWAgYW5kIGBpc1Byb2plY3Rpb25Nb2RlYC4KICAgICAqIFRoZSBmb2xsb3dpbmcgdGFibGUgc3VtbWFyaXplcyB3aGljaCB0eXBlcyBvZiBhdHRyaWJ1dGVzIHdlIGF0dGVtcHQgdG8gbWF0Y2g6CiAgICAgKgogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAqIE1vZGVzICAgICAgICAgICAgICAgICAgIHwgTm9ybWFsIEF0dHJpYnV0ZXMgfCBCaW5kaW5ncyBBdHRyaWJ1dGVzIHwgVGVtcGxhdGUgQXR0cmlidXRlcyB8IEkxOG4KICAgICAqIEF0dHJpYnV0ZXMKICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgICAgKiBJbmxpbmUgKyBQcm9qZWN0aW9uICAgICB8IFlFUyAgICAgICAgICAgICAgIHwgWUVTICAgICAgICAgICAgICAgICB8IE5PICAgICAgICAgICAgICAgICAgfCBZRVMKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiBJbmxpbmUgKyBEaXJlY3RpdmUgICAgICB8IE5PICAgICAgICAgICAgICAgIHwgTk8gICAgICAgICAgICAgICAgICB8IFlFUyAgICAgICAgICAgICAgICAgfCBOTwogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqIE5vbi1pbmxpbmUgKyBQcm9qZWN0aW9uIHwgWUVTICAgICAgICAgICAgICAgfCBZRVMgICAgICAgICAgICAgICAgIHwgTk8gICAgICAgICAgICAgICAgICB8IFlFUwogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqIE5vbi1pbmxpbmUgKyBEaXJlY3RpdmUgIHwgWUVTICAgICAgICAgICAgICAgfCBZRVMgICAgICAgICAgICAgICAgIHwgTk8gICAgICAgICAgICAgICAgICB8IFlFUwogICAgICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byBmaW5kCiAgICAgKiBAcGFyYW0gez99IGF0dHJzIHRoZSBhdHRyaWJ1dGUgYXJyYXkgdG8gZXhhbWluZQogICAgICogQHBhcmFtIHs/fSBpc0lubGluZVRlbXBsYXRlIHRydWUgaWYgdGhlIG5vZGUgYmVpbmcgbWF0Y2hlZCBpcyBhbiBpbmxpbmUgdGVtcGxhdGUgKGUuZy4gYCpuZ0ZvcmApCiAgICAgKiByYXRoZXIgdGhhbiBhIG1hbnVhbGx5IGV4cGFuZGVkIHRlbXBsYXRlIG5vZGUgKGUuZyBgPG5nLXRlbXBsYXRlPmApLgogICAgICogQHBhcmFtIHs/fSBpc1Byb2plY3Rpb25Nb2RlIHRydWUgaWYgd2UgYXJlIG1hdGNoaW5nIGFnYWluc3QgY29udGVudCBwcm9qZWN0aW9uIG90aGVyd2lzZSB3ZSBhcmUKICAgICAqIG1hdGNoaW5nIGFnYWluc3QgZGlyZWN0aXZlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRBdHRySW5kZXhJbk5vZGUobmFtZSwgYXR0cnMsIGlzSW5saW5lVGVtcGxhdGUsIGlzUHJvamVjdGlvbk1vZGUpIHsKICAgICAgICBpZiAoYXR0cnMgPT09IG51bGwpCiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSAwOwogICAgICAgIGlmIChpc1Byb2plY3Rpb25Nb2RlIHx8ICFpc0lubGluZVRlbXBsYXRlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGJpbmRpbmdzTW9kZSA9IGZhbHNlOwogICAgICAgICAgICB3aGlsZSAoaSA8IGF0dHJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWF5YmVBdHRyTmFtZSA9IGF0dHJzW2ldOwogICAgICAgICAgICAgICAgaWYgKG1heWJlQXR0ck5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDMgLyogQmluZGluZ3MgKi8gfHwgbWF5YmVBdHRyTmFtZSA9PT0gNiAvKiBJMThuICovKSB7CiAgICAgICAgICAgICAgICAgICAgYmluZGluZ3NNb2RlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDEgLyogQ2xhc3NlcyAqLyB8fCBtYXliZUF0dHJOYW1lID09PSAyIC8qIFN0eWxlcyAqLykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBhdHRyc1srK2ldOwogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBza2lwIGNsYXNzZXMgaGVyZSBiZWNhdXNlIHdlIGhhdmUgYSBzZXBhcmF0ZSBtZWNoYW5pc20gZm9yCiAgICAgICAgICAgICAgICAgICAgLy8gbWF0Y2hpbmcgY2xhc3NlcyBpbiBwcm9qZWN0aW9uIG1vZGUuCiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBhdHRyc1srK2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1heWJlQXR0ck5hbWUgPT09IDQgLyogVGVtcGxhdGUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2FyZSBhYm91dCBUZW1wbGF0ZSBhdHRyaWJ1dGVzIGluIHRoaXMgc2NlbmFyaW8uCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChtYXliZUF0dHJOYW1lID09PSAwIC8qIE5hbWVzcGFjZVVSSSAqLykgewogICAgICAgICAgICAgICAgICAgIC8vIFNraXAgdGhlIHdob2xlIG5hbWVzcGFjZWQgYXR0cmlidXRlIGFuZCB2YWx1ZS4gVGhpcyBpcyBieSBkZXNpZ24uCiAgICAgICAgICAgICAgICAgICAgaSArPSA0OwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSW4gYmluZGluZyBtb2RlIHRoZXJlIGFyZSBvbmx5IG5hbWVzLCByYXRoZXIgdGhhbiBuYW1lLXZhbHVlIHBhaXJzLgogICAgICAgICAgICAgICAgaSArPSBiaW5kaW5nc01vZGUgPyAxIDogMjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBkaWQgbm90IG1hdGNoIHRoZSBhdHRyaWJ1dGUKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoVGVtcGxhdGVBdHRyaWJ1dGUoYXR0cnMsIG5hbWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHBhcmFtIHs/PX0gaXNQcm9qZWN0aW9uTW9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNOb2RlTWF0Y2hpbmdTZWxlY3Rvckxpc3QodE5vZGUsIHNlbGVjdG9yLCBpc1Byb2plY3Rpb25Nb2RlID0gZmFsc2UpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHNlbGVjdG9yLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmIChpc05vZGVNYXRjaGluZ1NlbGVjdG9yKHROb2RlLCBzZWxlY3RvcltpXSwgaXNQcm9qZWN0aW9uTW9kZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UHJvamVjdEFzQXR0clZhbHVlKHROb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGVBdHRycyA9IHROb2RlLmF0dHJzOwogICAgICAgIGlmIChub2RlQXR0cnMgIT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nUHJvamVjdEFzQXR0cklkeCA9IG5vZGVBdHRycy5pbmRleE9mKDUgLyogUHJvamVjdEFzICovKTsKICAgICAgICAgICAgLy8gb25seSBjaGVjayBmb3IgbmdQcm9qZWN0QXMgaW4gYXR0cmlidXRlIG5hbWVzLCBkb24ndCBhY2NpZGVudGFsbHkgbWF0Y2ggYXR0cmlidXRlJ3MgdmFsdWUKICAgICAgICAgICAgLy8gKGF0dHJpYnV0ZSBuYW1lcyBhcmUgc3RvcmVkIGF0IGV2ZW4gaW5kZXhlcykKICAgICAgICAgICAgaWYgKChuZ1Byb2plY3RBc0F0dHJJZHggJiAxKSA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChub2RlQXR0cnNbbmdQcm9qZWN0QXNBdHRySWR4ICsgMV0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlQXR0cnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE5hbWVPbmx5TWFya2VySW5kZXgobm9kZUF0dHJzKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBub2RlQXR0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBub2RlQXR0ciA9IG5vZGVBdHRyc1tpXTsKICAgICAgICAgICAgaWYgKGlzTmFtZU9ubHlBdHRyaWJ1dGVNYXJrZXIobm9kZUF0dHIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbm9kZUF0dHJzLmxlbmd0aDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhdHRycwogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXRjaFRlbXBsYXRlQXR0cmlidXRlKGF0dHJzLCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpID0gYXR0cnMuaW5kZXhPZig0IC8qIFRlbXBsYXRlICovKTsKICAgICAgICBpZiAoaSA+IC0xKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgd2hpbGUgKGkgPCBhdHRycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSBhdHRyc1tpXTsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBpbiBjYXNlIHdlIGNoZWNrZWQgYWxsIHRlbXBsYXRlIGF0dHJzIGFuZCBhcmUgc3dpdGNoaW5nIHRvIHRoZSBuZXh0IHNlY3Rpb24gaW4gdGhlCiAgICAgICAgICAgICAgICAvLyBhdHRycyBhcnJheSAodGhhdCBzdGFydHMgd2l0aCBhIG51bWJlciB0aGF0IHJlcHJlc2VudHMgYW4gYXR0cmlidXRlIG1hcmtlcikuCiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGF0dHIgPT09ICdudW1iZXInKQogICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICAgICAgICAgIGlmIChhdHRyID09PSBuYW1lKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgYSBzZWxlY3RvciBpcyBpbnNpZGUgYSBDc3NTZWxlY3Rvckxpc3QKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IgU2VsZWN0b3IgdG8gYmUgY2hlY2tlZC4KICAgICAqIEBwYXJhbSB7P30gbGlzdCBMaXN0IGluIHdoaWNoIHRvIGxvb2sgZm9yIHRoZSBzZWxlY3Rvci4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzU2VsZWN0b3JJblNlbGVjdG9yTGlzdChzZWxlY3RvciwgbGlzdCkgewogICAgICAgIHNlbGVjdG9yTGlzdExvb3A6IGZvciAobGV0IGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRTZWxlY3RvckluTGlzdCA9IGxpc3RbaV07CiAgICAgICAgICAgIGlmIChzZWxlY3Rvci5sZW5ndGggIT09IGN1cnJlbnRTZWxlY3RvckluTGlzdC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgc2VsZWN0b3IubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgIGlmIChzZWxlY3RvcltqXSAhPT0gY3VycmVudFNlbGVjdG9ySW5MaXN0W2pdKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWUgc2VsZWN0b3JMaXN0TG9vcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlzTmVnYXRpdmVNb2RlCiAgICAgKiBAcGFyYW0gez99IGNodW5rCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXliZVdyYXBJbk5vdFNlbGVjdG9yKGlzTmVnYXRpdmVNb2RlLCBjaHVuaykgewogICAgICAgIHJldHVybiBpc05lZ2F0aXZlTW9kZSA/ICc6bm90KCcgKyBjaHVuay50cmltKCkgKyAnKScgOiBjaHVuazsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3RyaW5naWZ5Q1NTU2VsZWN0b3Ioc2VsZWN0b3IpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc3VsdCA9ICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvclswXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaSA9IDE7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtb2RlID0gMiAvKiBBVFRSSUJVVEUgKi87CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjdXJyZW50Q2h1bmsgPSAnJzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlzTmVnYXRpdmVNb2RlID0gZmFsc2U7CiAgICAgICAgd2hpbGUgKGkgPCBzZWxlY3Rvci5sZW5ndGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmFsdWVPck1hcmtlciA9IHNlbGVjdG9yW2ldOwogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlT3JNYXJrZXIgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAobW9kZSAmIDIgLyogQVRUUklCVVRFICovKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvclsrK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgY3VycmVudENodW5rICs9CiAgICAgICAgICAgICAgICAgICAgICAgICdbJyArIHZhbHVlT3JNYXJrZXIgKyAoYXR0clZhbHVlLmxlbmd0aCA+IDAgPyAnPSInICsgYXR0clZhbHVlICsgJyInIDogJycpICsgJ10nOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSAmIDggLyogQ0xBU1MgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2h1bmsgKz0gJy4nICsgdmFsdWVPck1hcmtlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgJiA0IC8qIEVMRU1FTlQgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50Q2h1bmsgKz0gJyAnICsgdmFsdWVPck1hcmtlcjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBBcHBlbmQgY3VycmVudCBjaHVuayB0byB0aGUgZmluYWwgcmVzdWx0IGluIGNhc2Ugd2UgY29tZSBhY3Jvc3MgU2VsZWN0b3JGbGFnLCB3aGljaAogICAgICAgICAgICAgICAgLy8gaW5kaWNhdGVzIHRoYXQgdGhlIHByZXZpb3VzIHNlY3Rpb24gb2YgYSBzZWxlY3RvciBpcyBvdmVyLiBXZSBuZWVkIHRvIGFjY3VtdWxhdGUgY29udGVudAogICAgICAgICAgICAgICAgLy8gYmV0d2VlbiBmbGFncyB0byBtYWtlIHN1cmUgd2Ugd3JhcCB0aGUgY2h1bmsgbGF0ZXIgaW4gOm5vdCgpIHNlbGVjdG9yIGlmIG5lZWRlZCwgZS5nLgogICAgICAgICAgICAgICAgLy8gYGBgCiAgICAgICAgICAgICAgICAvLyAgWycnLCBGbGFncy5DTEFTUywgJy5jbGFzc0EnLCBGbGFncy5DTEFTUyB8IEZsYWdzLk5PVCwgJy5jbGFzc0InLCAnLmNsYXNzQyddCiAgICAgICAgICAgICAgICAvLyBgYGAKICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSB0cmFuc2Zvcm1lZCB0byBgLmNsYXNzQSA6bm90KC5jbGFzc0IgLmNsYXNzQylgLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIE5vdGU6IGZvciBuZWdhdGl2ZSBzZWxlY3RvciBwYXJ0LCB3ZSBhY2N1bXVsYXRlIGNvbnRlbnQgYmV0d2VlbiBmbGFncyB1bnRpbCB3ZSBmaW5kIHRoZQogICAgICAgICAgICAgICAgLy8gbmV4dCBuZWdhdGl2ZSBmbGFnLiBUaGlzIGlzIG5lZWRlZCB0byBzdXBwb3J0IGEgY2FzZSB3aGVyZSBgOm5vdCgpYCBydWxlIGNvbnRhaW5zIG1vcmUgdGhhbgogICAgICAgICAgICAgICAgLy8gb25lIGNodW5rLCBlLmcuIHRoZSBmb2xsb3dpbmcgc2VsZWN0b3I6CiAgICAgICAgICAgICAgICAvLyBgYGAKICAgICAgICAgICAgICAgIC8vICBbJycsIEZsYWdzLkVMRU1FTlQgfCBGbGFncy5OT1QsICdwJywgRmxhZ3MuQ0xBU1MsICdmb28nLCBGbGFncy5DTEFTUyB8IEZsYWdzLk5PVCwgJ2JhciddCiAgICAgICAgICAgICAgICAvLyBgYGAKICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBzdHJpbmdpZmllZCB0byBgOm5vdChwLmZvbykgOm5vdCguYmFyKWAKICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICBpZiAoY3VycmVudENodW5rICE9PSAnJyAmJiAhaXNQb3NpdGl2ZSh2YWx1ZU9yTWFya2VyKSkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCArPSBtYXliZVdyYXBJbk5vdFNlbGVjdG9yKGlzTmVnYXRpdmVNb2RlLCBjdXJyZW50Q2h1bmspOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRDaHVuayA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbW9kZSA9IHZhbHVlT3JNYXJrZXI7CiAgICAgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gQ3NzU2VsZWN0b3Igc3BlYywgb25jZSB3ZSBjb21lIGFjcm9zcyBgU2VsZWN0b3JGbGFncy5OT1RgIGZsYWcsIHRoZSBuZWdhdGl2ZQogICAgICAgICAgICAgICAgLy8gbW9kZSBpcyBtYWludGFpbmVkIGZvciByZW1haW5pbmcgY2h1bmtzIG9mIGEgc2VsZWN0b3IuCiAgICAgICAgICAgICAgICBpc05lZ2F0aXZlTW9kZSA9IGlzTmVnYXRpdmVNb2RlIHx8ICFpc1Bvc2l0aXZlKG1vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgaWYgKGN1cnJlbnRDaHVuayAhPT0gJycpIHsKICAgICAgICAgICAgcmVzdWx0ICs9IG1heWJlV3JhcEluTm90U2VsZWN0b3IoaXNOZWdhdGl2ZU1vZGUsIGN1cnJlbnRDaHVuayk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIEdlbmVyYXRlcyBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgQ1NTIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtLgogICAgICoKICAgICAqIENvbXBvbmVudERlZiBhbmQgRGlyZWN0aXZlRGVmIGFyZSBnZW5lcmF0ZWQgd2l0aCB0aGUgc2VsZWN0b3IgaW4gcGFyc2VkIGZvcm0gdG8gYXZvaWQgZG9pbmcKICAgICAqIGFkZGl0aW9uYWwgcGFyc2luZyBhdCBydW50aW1lIChmb3IgZXhhbXBsZSwgZm9yIGRpcmVjdGl2ZSBtYXRjaGluZykuIEhvd2V2ZXIgaW4gc29tZSBjYXNlcyAoZm9yCiAgICAgKiBleGFtcGxlLCB3aGlsZSBib290c3RyYXBwaW5nIGEgY29tcG9uZW50KSwgYSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgc2VsZWN0b3IgaXMgcmVxdWlyZWQgdG8gcXVlcnkKICAgICAqIGZvciB0aGUgaG9zdCBlbGVtZW50IG9uIHRoZSBwYWdlLiBUaGlzIGZ1bmN0aW9uIHRha2VzIHRoZSBwYXJzZWQgZm9ybSBvZiBhIHNlbGVjdG9yIGFuZCByZXR1cm5zCiAgICAgKiBpdHMgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JMaXN0IHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtCiAgICAgKiBAcmV0dXJuIHs/fSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYSBnaXZlbiBzZWxlY3RvcgogICAgICovCiAgICBmdW5jdGlvbiBzdHJpbmdpZnlDU1NTZWxlY3Rvckxpc3Qoc2VsZWN0b3JMaXN0KSB7CiAgICAgICAgcmV0dXJuIHNlbGVjdG9yTGlzdC5tYXAoc3RyaW5naWZ5Q1NTU2VsZWN0b3IpLmpvaW4oJywnKTsKICAgIH0KICAgIC8qKgogICAgICogRXh0cmFjdHMgYXR0cmlidXRlcyBhbmQgY2xhc3NlcyBpbmZvcm1hdGlvbiBmcm9tIGEgZ2l2ZW4gQ1NTIHNlbGVjdG9yLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB3aGlsZSBjcmVhdGluZyBhIGNvbXBvbmVudCBkeW5hbWljYWxseS4gSW4gdGhpcyBjYXNlLCB0aGUgaG9zdCBlbGVtZW50CiAgICAgKiAodGhhdCBpcyBjcmVhdGVkIGR5bmFtaWNhbGx5KSBzaG91bGQgY29udGFpbiBhdHRyaWJ1dGVzIGFuZCBjbGFzc2VzIHNwZWNpZmllZCBpbiBjb21wb25lbnQncyBDU1MKICAgICAqIHNlbGVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IgQ1NTIHNlbGVjdG9yIGluIHBhcnNlZCBmb3JtIChpbiBhIGZvcm0gb2YgYXJyYXkpCiAgICAgKiBAcmV0dXJuIHs/fSBvYmplY3Qgd2l0aCBgYXR0cnNgIGFuZCBgY2xhc3Nlc2AgZmllbGRzIHRoYXQgY29udGFpbiBleHRyYWN0ZWQgaW5mb3JtYXRpb24KICAgICAqLwogICAgZnVuY3Rpb24gZXh0cmFjdEF0dHJzQW5kQ2xhc3Nlc0Zyb21TZWxlY3RvcihzZWxlY3RvcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhdHRycyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjbGFzc2VzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpID0gMTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1vZGUgPSAyIC8qIEFUVFJJQlVURSAqLzsKICAgICAgICB3aGlsZSAoaSA8IHNlbGVjdG9yLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB2YWx1ZU9yTWFya2VyID0gc2VsZWN0b3JbaV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWVPck1hcmtlciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAyIC8qIEFUVFJJQlVURSAqLykgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZU9yTWFya2VyICE9PSAnJykgewogICAgICAgICAgICAgICAgICAgICAgICBhdHRycy5wdXNoKHZhbHVlT3JNYXJrZXIsICgvKiogQHR5cGUgez99ICovIChzZWxlY3RvclsrK2ldKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgPT09IDggLyogQ0xBU1MgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2godmFsdWVPck1hcmtlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gQ3NzU2VsZWN0b3Igc3BlYywgb25jZSB3ZSBjb21lIGFjcm9zcyBgU2VsZWN0b3JGbGFncy5OT1RgIGZsYWcsIHRoZSBuZWdhdGl2ZQogICAgICAgICAgICAgICAgLy8gbW9kZSBpcyBtYWludGFpbmVkIGZvciByZW1haW5pbmcgY2h1bmtzIG9mIGEgc2VsZWN0b3IuIFNpbmNlIGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgYXJlCiAgICAgICAgICAgICAgICAvLyBleHRyYWN0ZWQgb25seSBmb3IgInBvc2l0aXZlIiBwYXJ0IG9mIHRoZSBzZWxlY3Rvciwgd2UgY2FuIHN0b3AgaGVyZS4KICAgICAgICAgICAgICAgIGlmICghaXNQb3NpdGl2ZShtb2RlKSkKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIG1vZGUgPSB2YWx1ZU9yTWFya2VyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgYXR0cnMsIGNsYXNzZXMgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdG9rZW5zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIC8qKgogICAgICogQSBzcGVjaWFsIHZhbHVlIHdoaWNoIGRlc2lnbmF0ZXMgdGhhdCBhIHZhbHVlIGhhcyBub3QgY2hhbmdlZC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBOT19DSEFOR0UgPSAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSA/IHsgX19icmFuZF9fOiAnTk9fQ0hBTkdFJyB9IDogKCgvKiogQHR5cGUgez99ICovICh7fSkpKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC92aWV3X3RyYXZlcnNhbF91dGlscy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEdldHMgdGhlIHBhcmVudCBMVmlldyBvZiB0aGUgcGFzc2VkIExWaWV3LCBpZiB0aGUgUEFSRU5UIGlzIGFuIExDb250YWluZXIsIHdpbGwgZ2V0IHRoZSBwYXJlbnQgb2YKICAgICAqIHRoYXQgTENvbnRhaW5lciwgd2hpY2ggaXMgYW4gTFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGxWaWV3IHdob3NlIHBhcmVudCB0byBnZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExWaWV3UGFyZW50KGxWaWV3KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGxWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gbFZpZXdbUEFSRU5UXTsKICAgICAgICByZXR1cm4gaXNMQ29udGFpbmVyKHBhcmVudCkgPyAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50W1BBUkVOVF0pKSA6IHBhcmVudDsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmUgdGhlIHJvb3QgdmlldyBmcm9tIGFueSBjb21wb25lbnQgb3IgYExWaWV3YCBieSB3YWxraW5nIHRoZSBwYXJlbnQgYExWaWV3YCB1bnRpbAogICAgICogcmVhY2hpbmcgdGhlIHJvb3QgYExWaWV3YC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudE9yTFZpZXcgYW55IGNvbXBvbmVudCBvciBgTFZpZXdgCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRSb290Vmlldyhjb21wb25lbnRPckxWaWV3KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoY29tcG9uZW50T3JMVmlldywgJ2NvbXBvbmVudCcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbFZpZXcgPSBpc0xWaWV3KGNvbXBvbmVudE9yTFZpZXcpID8gY29tcG9uZW50T3JMVmlldyA6ICgvKiogQHR5cGUgez99ICovIChyZWFkUGF0Y2hlZExWaWV3KGNvbXBvbmVudE9yTFZpZXcpKSk7CiAgICAgICAgd2hpbGUgKGxWaWV3ICYmICEobFZpZXdbRkxBR1NdICYgNTEyIC8qIElzUm9vdCAqLykpIHsKICAgICAgICAgICAgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TFZpZXdQYXJlbnQobFZpZXcpKSk7CiAgICAgICAgfQogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMVmlldyhsVmlldyk7CiAgICAgICAgcmV0dXJuIGxWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBgUm9vdENvbnRleHRgIGluc3RhbmNlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoCiAgICAgKiB0aGUgYXBwbGljYXRpb24gd2hlcmUgdGhlIHRhcmdldCBpcyBzaXR1YXRlZC4gSXQgZG9lcyB0aGlzIGJ5IHdhbGtpbmcgdGhlIHBhcmVudCB2aWV3cyB1bnRpbCBpdAogICAgICogZ2V0cyB0byB0aGUgcm9vdCB2aWV3LCB0aGVuIGdldHRpbmcgdGhlIGNvbnRleHQgb2ZmIG9mIHRoYXQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB2aWV3T3JDb21wb25lbnQgdGhlIGBMVmlld2Agb3IgY29tcG9uZW50IHRvIGdldCB0aGUgcm9vdCBjb250ZXh0IGZvci4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJvb3RDb250ZXh0KHZpZXdPckNvbXBvbmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290VmlldyA9IGdldFJvb3RWaWV3KHZpZXdPckNvbXBvbmVudCk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydERlZmluZWQocm9vdFZpZXdbQ09OVEVYVF0sICdSb290VmlldyBoYXMgbm8gY29udGV4dC4gUGVyaGFwcyBpdCBpcyBkaXNjb25uZWN0ZWQ/Jyk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyb290Vmlld1tDT05URVhUXSkpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBmaXJzdCBgTENvbnRhaW5lcmAgaW4gdGhlIExWaWV3IG9yIGBudWxsYCBpZiBub25lIGV4aXN0cy4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEZpcnN0TENvbnRhaW5lcihsVmlldykgewogICAgICAgIHJldHVybiBnZXROZWFyZXN0TENvbnRhaW5lcihsVmlld1tDSElMRF9IRUFEXSk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIG5leHQgYExDb250YWluZXJgIHRoYXQgaXMgYSBzaWJsaW5nIG9mIHRoZSBnaXZlbiBjb250YWluZXIuCiAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TmV4dExDb250YWluZXIoY29udGFpbmVyKSB7CiAgICAgICAgcmV0dXJuIGdldE5lYXJlc3RMQ29udGFpbmVyKGNvbnRhaW5lcltORVhUXSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmlld09yQ29udGFpbmVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXROZWFyZXN0TENvbnRhaW5lcih2aWV3T3JDb250YWluZXIpIHsKICAgICAgICB3aGlsZSAodmlld09yQ29udGFpbmVyICE9PSBudWxsICYmICFpc0xDb250YWluZXIodmlld09yQ29udGFpbmVyKSkgewogICAgICAgICAgICB2aWV3T3JDb250YWluZXIgPSB2aWV3T3JDb250YWluZXJbTkVYVF07CiAgICAgICAgfQogICAgICAgIHJldHVybiB2aWV3T3JDb250YWluZXI7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9hZHZhbmNlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQWR2YW5jZXMgdG8gYW4gZWxlbWVudCBmb3IgbGF0ZXIgYmluZGluZyBpbnN0cnVjdGlvbnMuCiAgICAgKgogICAgICogVXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIGluc3RydWN0aW9ucyBsaWtlIHtcQGxpbmsgcHJvcGVydHl9IHRvIGFjdCBvbiBlbGVtZW50cyB3aXRoIHNwZWNpZmllZAogICAgICogaW5kaWNlcywgZm9yIGV4YW1wbGUgdGhvc2UgY3JlYXRlZCB3aXRoIHtcQGxpbmsgZWxlbWVudH0gb3Ige1xAbGluayBlbGVtZW50U3RhcnR9LgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiAocmY6IFJlbmRlckZsYWdzLCBjdHg6IGFueSkgPT4gewogICAgICogICBpZiAocmYgJiAxKSB7CiAgICAgKiAgICAgdGV4dCgwLCAnSGVsbG8nKTsKICAgICAqICAgICB0ZXh0KDEsICdHb29kYnllJykKICAgICAqICAgICBlbGVtZW50KDIsICdkaXYnKTsKICAgICAqICAgfQogICAgICogICBpZiAocmYgJiAyKSB7CiAgICAgKiAgICAgYWR2YW5jZSgyKTsgLy8gQWR2YW5jZSB0d2ljZSB0byB0aGUgPGRpdj4uCiAgICAgKiAgICAgcHJvcGVydHkoJ3RpdGxlJywgJ3Rlc3QnKTsKICAgICAqICAgfQogICAgICogIH0KICAgICAqIGBgYAogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGRlbHRhIE51bWJlciBvZiBlbGVtZW50cyB0byBhZHZhbmNlIGZvcndhcmRzIGJ5LgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhZHZhbmNlKGRlbHRhKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEdyZWF0ZXJUaGFuKGRlbHRhLCAwLCAnQ2FuIG9ubHkgYWR2YW5jZSBmb3J3YXJkJyk7CiAgICAgICAgc2VsZWN0SW5kZXhJbnRlcm5hbChnZXRUVmlldygpLCBnZXRMVmlldygpLCBnZXRTZWxlY3RlZEluZGV4KCkgKyBkZWx0YSwgZ2V0Q2hlY2tOb0NoYW5nZXNNb2RlKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBTZWxlY3RzIGFuIGVsZW1lbnQgZm9yIGxhdGVyIGJpbmRpbmcgaW5zdHJ1Y3Rpb25zLgogICAgICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIGJlaW5nIGdlbmVyYXRlZCwgYnV0IHN0aWxsIHVzZWQgaW4gdW5pdCB0ZXN0cy4KICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXNlbGVjdChpbmRleCkgewogICAgICAgIC8vIFRPRE8obWlza28pOiBSZW1vdmUgdGhpcyBmdW5jdGlvbiBhcyBpdCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZC4KICAgICAgICBzZWxlY3RJbmRleEludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIGluZGV4LCBnZXRDaGVja05vQ2hhbmdlc01vZGUoKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gY2hlY2tOb0NoYW5nZXNNb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RJbmRleEludGVybmFsKHRWaWV3LCBsVmlldywgaW5kZXgsIGNoZWNrTm9DaGFuZ2VzTW9kZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRHcmVhdGVyVGhhbihpbmRleCwgLTEsICdJbnZhbGlkIGluZGV4Jyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCArIEhFQURFUl9PRkZTRVQpOwogICAgICAgIC8vIEZsdXNoIHRoZSBpbml0aWFsIGhvb2tzIGZvciBlbGVtZW50cyBpbiB0aGUgdmlldyB0aGF0IGhhdmUgYmVlbiBhZGRlZCB1cCB0byB0aGlzIHBvaW50LgogICAgICAgIC8vIFBFUkYgV0FSTklORzogZG8gTk9UIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdpdGhvdXQgcnVubmluZyBiZW5jaG1hcmtzCiAgICAgICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBob29rc0luaXRQaGFzZUNvbXBsZXRlZCA9IChsVmlld1tGTEFHU10gJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovOwogICAgICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZU9yZGVyQ2hlY2tIb29rcyA9IHRWaWV3LnByZU9yZGVyQ2hlY2tIb29rczsKICAgICAgICAgICAgICAgIGlmIChwcmVPcmRlckNoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBleGVjdXRlQ2hlY2tIb29rcyhsVmlldywgcHJlT3JkZXJDaGVja0hvb2tzLCBpbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmVPcmRlckhvb2tzID0gdFZpZXcucHJlT3JkZXJIb29rczsKICAgICAgICAgICAgICAgIGlmIChwcmVPcmRlckhvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCBwcmVPcmRlckhvb2tzLCAwIC8qIE9uSW5pdEhvb2tzVG9CZVJ1biAqLywgaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFdlIG11c3Qgc2V0IHRoZSBzZWxlY3RlZCBpbmRleCAqYWZ0ZXIqIHJ1bm5pbmcgdGhlIGhvb2tzLCBiZWNhdXNlIGhvb2tzIG1heSBoYXZlIHNpZGUtZWZmZWN0cwogICAgICAgIC8vIHRoYXQgY2F1c2Ugb3RoZXIgdGVtcGxhdGUgZnVuY3Rpb25zIHRvIHJ1biwgdGh1cyB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgaW5kZXgsIHdoaWNoIGlzIGdsb2JhbAogICAgICAgIC8vIHN0YXRlLiBJZiB3ZSBydW4gYHNldFNlbGVjdGVkSW5kZXhgICpiZWZvcmUqIHdlIHJ1biB0aGUgaG9va3MsIGluIHNvbWUgY2FzZXMgdGhlIHNlbGVjdGVkIGluZGV4CiAgICAgICAgLy8gd2lsbCBiZSBhbHRlcmVkIGJ5IHRoZSB0aW1lIHdlIGxlYXZlIHRoZSBgybXJtWFkdmFuY2VgIGluc3RydWN0aW9uLgogICAgICAgIHNldFNlbGVjdGVkSW5kZXgoaW5kZXgpOwogICAgfQogICAgLyoqCiAgICAgKiBNYXJrcyB0aGF0IHRoZSBuZXh0IHN0cmluZyBpcyBmb3IgZWxlbWVudC4KICAgICAqCiAgICAgKiBTZWUgYEkxOG5NdXRhdGVPcENvZGVzYCBkb2N1bWVudGF0aW9uLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEVMRU1FTlRfTUFSS0VSID0gewogICAgICAgIG1hcmtlcjogJ2VsZW1lbnQnCiAgICB9OwogICAgLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAogICAgLyoqCiAgICAgKiBNYXJrcyB0aGF0IHRoZSBuZXh0IHN0cmluZyBpcyBmb3IgY29tbWVudC4KICAgICAqCiAgICAgKiBTZWUgYEkxOG5NdXRhdGVPcENvZGVzYCBkb2N1bWVudGF0aW9uLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENPTU1FTlRfTUFSS0VSID0gewogICAgICAgIG1hcmtlcjogJ2NvbW1lbnQnCiAgICB9OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByZXYKICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdG9UU3R5bGluZ1JhbmdlKHByZXYsIG5leHQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVySW5SYW5nZShwcmV2LCAwLCAzMjc2NyAvKiBVTlNJR05FRF9NQVNLICovKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVySW5SYW5nZShuZXh0LCAwLCAzMjc2NyAvKiBVTlNJR05FRF9NQVNLICovKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKChwcmV2IDw8IDE3IC8qIFBSRVZfU0hJRlQgKi8gfCBuZXh0IDw8IDIgLyogTkVYVF9TSElGVCAqLykpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRUU3R5bGluZ1JhbmdlUHJldih0U3R5bGluZ1JhbmdlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICAgICAgcmV0dXJuICgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgPj4gMTcgLyogUFJFVl9TSElGVCAqLykgJiAzMjc2NyAvKiBVTlNJR05FRF9NQVNLICovOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRTdHlsaW5nUmFuZ2VQcmV2RHVwbGljYXRlKHRTdHlsaW5nUmFuZ2UpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgICAgICByZXR1cm4gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSAmIDIgLyogUFJFVl9EVVBMSUNBVEUgKi8pID09CiAgICAgICAgICAgIDIgLyogUFJFVl9EVVBMSUNBVEUgKi87CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFN0eWxpbmdSYW5nZQogICAgICogQHBhcmFtIHs/fSBwcmV2aW91cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZVByZXYodFN0eWxpbmdSYW5nZSwgcHJldmlvdXMpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVyKHRTdHlsaW5nUmFuZ2UsICdleHBlY3RlZCBudW1iZXInKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TnVtYmVySW5SYW5nZShwcmV2aW91cywgMCwgMzI3NjcgLyogVU5TSUdORURfTUFTSyAqLyk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSAmIH40Mjk0ODM2MjI0IC8qIFBSRVZfTUFTSyAqLykgfAogICAgICAgICAgICAocHJldmlvdXMgPDwgMTcgLyogUFJFVl9TSElGVCAqLykpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFN0eWxpbmdSYW5nZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUodFN0eWxpbmdSYW5nZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nUmFuZ2UpKSkpKSB8IDIgLyogUFJFVl9EVVBMSUNBVEUgKi8pKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFN0eWxpbmdSYW5nZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdSYW5nZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgICAgIHJldHVybiAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpICYgMTMxMDY4IC8qIE5FWFRfTUFTSyAqLykgPj4gMiAvKiBORVhUX1NISUZUICovOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRTdHlsaW5nUmFuZ2UKICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdSYW5nZSwgbmV4dCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXIodFN0eWxpbmdSYW5nZSwgJ2V4cGVjdGVkIG51bWJlcicpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROdW1iZXJJblJhbmdlKG5leHQsIDAsIDMyNzY3IC8qIFVOU0lHTkVEX01BU0sgKi8pOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgJiB+MTMxMDY4IC8qIE5FWFRfTUFTSyAqLykgfCAvLwogICAgICAgICAgICBuZXh0IDw8IDIgLyogTkVYVF9TSElGVCAqLykpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRUU3R5bGluZ1JhbmdlTmV4dER1cGxpY2F0ZSh0U3R5bGluZ1JhbmdlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICAgICAgcmV0dXJuICgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ1JhbmdlKSkpKSkgJiAxIC8qIE5FWFRfRFVQTElDQVRFICovKSA9PT0KICAgICAgICAgICAgMSAvKiBORVhUX0RVUExJQ0FURSAqLzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0U3R5bGluZ1JhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRUU3R5bGluZ1JhbmdlTmV4dER1cGxpY2F0ZSh0U3R5bGluZ1JhbmdlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE51bWJlcih0U3R5bGluZ1JhbmdlLCAnZXhwZWN0ZWQgbnVtYmVyJyk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodFN0eWxpbmdSYW5nZSkpKSkpIHwgMSAvKiBORVhUX0RVUExJQ0FURSAqLykpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC9kZWJ1Z191dGlscy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAqIEBwYXJhbSB7P30gZGVidWcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGF0dGFjaERlYnVnT2JqZWN0KG9iaiwgZGVidWcpIHsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCAnZGVidWcnLCB7IHZhbHVlOiBkZWJ1ZywgZW51bWVyYWJsZTogZmFsc2UgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9sdmlld19kZWJ1Zy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOR19ERVZfTU9ERSA9ICgodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgISFuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSk7CiAgICAvKgogICAgICogVGhpcyBmaWxlIGNvbnRhaW5zIGNvbmRpdGlvbmFsbHkgYXR0YWNoZWQgY2xhc3NlcyB3aGljaCBwcm92aWRlIGh1bWFuIHJlYWRhYmxlIChkZWJ1ZykgbGV2ZWwKICAgICAqIGluZm9ybWF0aW9uIGZvciBgTFZpZXdgLCBgTENvbnRhaW5lcmAgYW5kIG90aGVyIGludGVybmFsIGRhdGEgc3RydWN0dXJlcy4gVGhlc2UgZGF0YSBzdHJ1Y3R1cmVzCiAgICAgKiBhcmUgc3RvcmVkIGludGVybmFsbHkgYXMgYXJyYXkgd2hpY2ggbWFrZXMgaXQgdmVyeSBkaWZmaWN1bHQgZHVyaW5nIGRlYnVnZ2luZyB0byByZWFzb24gYWJvdXQgdGhlCiAgICAgKiBjdXJyZW50IHN0YXRlIG9mIHRoZSBzeXN0ZW0uCiAgICAgKgogICAgICogUGF0Y2hpbmcgdGhlIGFycmF5IHdpdGggZXh0cmEgcHJvcGVydHkgZG9lcyBjaGFuZ2UgdGhlIGFycmF5J3MgaGlkZGVuIGNsYXNzJyBidXQgaXQgZG9lcyBub3QKICAgICAqIGNoYW5nZSB0aGUgY29zdCBvZiBhY2Nlc3MsIHRoZXJlZm9yZSB0aGlzIHBhdGNoaW5nIHNob3VsZCBub3QgaGF2ZSBzaWduaWZpY2FudCBpZiBhbnkgaW1wYWN0IGluCiAgICAgKiBgbmdEZXZNb2RlYCBtb2RlLiAoc2VlOiBodHRwczovL2pzcGVyZi5jb20vYXJyYXktdnMtbW9ua2V5LXBhdGNoLWFycmF5KQogICAgICoKICAgICAqIFNvIGluc3RlYWQgb2Ygc2VlaW5nOgogICAgICogYGBgCiAgICAgKiBBcnJheSgzMCkgW09iamVjdCwgNjU5LCBudWxsLCDigKZdCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBZb3UgZ2V0IHRvIHNlZToKICAgICAqIGBgYAogICAgICogTFZpZXdEZWJ1ZyB7CiAgICAgKiAgIHZpZXdzOiBbLi4uXSwKICAgICAqICAgZmxhZ3M6IHthdHRhY2hlZDogdHJ1ZSwgLi4ufQogICAgICogICBub2RlczogWwogICAgICogICAgIHtodG1sOiAnPGRpdiBpZD0iMTIzIj4nLCAuLi4sIG5vZGVzOiBbCiAgICAgKiAgICAgICB7aHRtbDogJzxzcGFuPicsIC4uLiwgbm9kZXM6IG51bGx9CiAgICAgKiAgICAgXX0KICAgICAqICAgXQogICAgICogfQogICAgICogYGBgCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBMVklFV19DT01QT05FTlRfQ0FDSEU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgTFZJRVdfRU1CRURERURfQ0FDSEU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgTFZJRVdfUk9PVDsKICAgIC8qKgogICAgICogVGhpcyBmdW5jdGlvbiBjbG9uZXMgYSBibHVlcHJpbnQgYW5kIGNyZWF0ZXMgTFZpZXcuCiAgICAgKgogICAgICogU2ltcGxlIHNsaWNlIHdpbGwga2VlcCB0aGUgc2FtZSB0eXBlLCBhbmQgd2UgbmVlZCBpdCB0byBiZSBMVmlldwogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmVUb0xWaWV3RnJvbVRWaWV3Qmx1ZXByaW50KHRWaWV3KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlYnVnVFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlld1RvQ2xvbmUoZGVidWdUVmlldy50eXBlLCB0Vmlldy50ZW1wbGF0ZSAmJiB0Vmlldy50ZW1wbGF0ZS5uYW1lKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3LmNvbmNhdCh0Vmlldy5ibHVlcHJpbnQpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRMVmlld1RvQ2xvbmUodHlwZSwgbmFtZSkgewogICAgICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAgICBjYXNlIDAgLyogUm9vdCAqLzoKICAgICAgICAgICAgICAgIGlmIChMVklFV19ST09UID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgTFZJRVdfUk9PVCA9IG5ldyAoY3JlYXRlTmFtZWRBcnJheVR5cGUoJ0xSb290VmlldycpKSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIExWSUVXX1JPT1Q7CiAgICAgICAgICAgIGNhc2UgMSAvKiBDb21wb25lbnQgKi86CiAgICAgICAgICAgICAgICBpZiAoTFZJRVdfQ09NUE9ORU5UX0NBQ0hFID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgTFZJRVdfQ09NUE9ORU5UX0NBQ0hFID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGNvbXBvbmVudEFycmF5ID0gTFZJRVdfQ09NUE9ORU5UX0NBQ0hFLmdldChuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChjb21wb25lbnRBcnJheSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50QXJyYXkgPSBuZXcgKGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdMQ29tcG9uZW50VmlldycgKyBuYW1lU3VmZml4KG5hbWUpKSkoKTsKICAgICAgICAgICAgICAgICAgICBMVklFV19DT01QT05FTlRfQ0FDSEUuc2V0KG5hbWUsIGNvbXBvbmVudEFycmF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBjb21wb25lbnRBcnJheTsKICAgICAgICAgICAgY2FzZSAyIC8qIEVtYmVkZGVkICovOgogICAgICAgICAgICAgICAgaWYgKExWSUVXX0VNQkVEREVEX0NBQ0hFID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgTFZJRVdfRU1CRURERURfQ0FDSEUgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgZW1iZWRkZWRBcnJheSA9IExWSUVXX0VNQkVEREVEX0NBQ0hFLmdldChuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChlbWJlZGRlZEFycmF5ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBlbWJlZGRlZEFycmF5ID0gbmV3IChjcmVhdGVOYW1lZEFycmF5VHlwZSgnTEVtYmVkZGVkVmlldycgKyBuYW1lU3VmZml4KG5hbWUpKSkoKTsKICAgICAgICAgICAgICAgICAgICBMVklFV19FTUJFRERFRF9DQUNIRS5zZXQobmFtZSwgZW1iZWRkZWRBcnJheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZW1iZWRkZWRBcnJheTsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnJlYWNoYWJsZSBjb2RlJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbmFtZVN1ZmZpeCh0ZXh0KSB7CiAgICAgICAgaWYgKHRleHQgPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleCA9IHRleHQubGFzdEluZGV4T2YoJ19UZW1wbGF0ZScpOwogICAgICAgIHJldHVybiAnXycgKyAoaW5kZXggPT09IC0xID8gdGV4dCA6IHRleHQuc3Vic3RyKDAsIGluZGV4KSk7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgY2xhc3MgaXMgYSBkZWJ1ZyB2ZXJzaW9uIG9mIE9iamVjdCBsaXRlcmFsIHNvIHRoYXQgd2UgY2FuIGhhdmUgY29uc3RydWN0b3IgbmFtZSBzaG93IHVwCiAgICAgKiBpbgogICAgICogZGVidWcgdG9vbHMgaW4gbmdEZXZNb2RlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFRWaWV3Q29uc3RydWN0b3IgPSBjbGFzcyBUVmlldyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHBhcmFtIHs/fSBpZAogICAgICAgICAqIEBwYXJhbSB7P30gYmx1ZXByaW50CiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcXVlcmllcwogICAgICAgICAqIEBwYXJhbSB7P30gdmlld1F1ZXJ5CiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBiaW5kaW5nU3RhcnRJbmRleAogICAgICAgICAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IGV4cGFuZG9JbnN0cnVjdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IGZpcnN0Q3JlYXRlUGFzcwogICAgICAgICAqIEBwYXJhbSB7P30gZmlyc3RVcGRhdGVQYXNzCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0aWNWaWV3UXVlcmllcwogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGljQ29udGVudFF1ZXJpZXMKICAgICAgICAgKiBAcGFyYW0gez99IHByZU9yZGVySG9va3MKICAgICAgICAgKiBAcGFyYW0gez99IHByZU9yZGVyQ2hlY2tIb29rcwogICAgICAgICAqIEBwYXJhbSB7P30gY29udGVudEhvb2tzCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50Q2hlY2tIb29rcwogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0hvb2tzCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q2hlY2tIb29rcwogICAgICAgICAqIEBwYXJhbSB7P30gZGVzdHJveUhvb2tzCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGVhbnVwCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZW50UXVlcmllcwogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50cwogICAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlUmVnaXN0cnkKICAgICAgICAgKiBAcGFyYW0gez99IHBpcGVSZWdpc3RyeQogICAgICAgICAqIEBwYXJhbSB7P30gZmlyc3RDaGlsZAogICAgICAgICAqIEBwYXJhbSB7P30gc2NoZW1hcwogICAgICAgICAqIEBwYXJhbSB7P30gY29uc3RzCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmNvbXBsZXRlRmlyc3RQYXNzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IodHlwZSwgLy8KICAgICAgICBpZCwgLy8KICAgICAgICBibHVlcHJpbnQsIC8vCiAgICAgICAgdGVtcGxhdGUsIC8vCiAgICAgICAgcXVlcmllcywgLy8KICAgICAgICB2aWV3UXVlcnksIC8vCiAgICAgICAgbm9kZSwgLy8KICAgICAgICBkYXRhLCAvLwogICAgICAgIGJpbmRpbmdTdGFydEluZGV4LCAvLwogICAgICAgIGV4cGFuZG9TdGFydEluZGV4LCAvLwogICAgICAgIGV4cGFuZG9JbnN0cnVjdGlvbnMsIC8vCiAgICAgICAgZmlyc3RDcmVhdGVQYXNzLCAvLwogICAgICAgIGZpcnN0VXBkYXRlUGFzcywgLy8KICAgICAgICBzdGF0aWNWaWV3UXVlcmllcywgLy8KICAgICAgICBzdGF0aWNDb250ZW50UXVlcmllcywgLy8KICAgICAgICBwcmVPcmRlckhvb2tzLCAvLwogICAgICAgIHByZU9yZGVyQ2hlY2tIb29rcywgLy8KICAgICAgICBjb250ZW50SG9va3MsIC8vCiAgICAgICAgY29udGVudENoZWNrSG9va3MsIC8vCiAgICAgICAgdmlld0hvb2tzLCAvLwogICAgICAgIHZpZXdDaGVja0hvb2tzLCAvLwogICAgICAgIGRlc3Ryb3lIb29rcywgLy8KICAgICAgICBjbGVhbnVwLCAvLwogICAgICAgIGNvbnRlbnRRdWVyaWVzLCAvLwogICAgICAgIGNvbXBvbmVudHMsIC8vCiAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnksIC8vCiAgICAgICAgcGlwZVJlZ2lzdHJ5LCAvLwogICAgICAgIGZpcnN0Q2hpbGQsIC8vCiAgICAgICAgc2NoZW1hcywgLy8KICAgICAgICBjb25zdHMsIC8vCiAgICAgICAgaW5jb21wbGV0ZUZpcnN0UGFzcyAvLwogICAgICAgICkgewogICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuYmx1ZXByaW50ID0gYmx1ZXByaW50OwogICAgICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7CiAgICAgICAgICAgIHRoaXMudmlld1F1ZXJ5ID0gdmlld1F1ZXJ5OwogICAgICAgICAgICB0aGlzLm5vZGUgPSBub2RlOwogICAgICAgICAgICB0aGlzLmRhdGEgPSBkYXRhOwogICAgICAgICAgICB0aGlzLmJpbmRpbmdTdGFydEluZGV4ID0gYmluZGluZ1N0YXJ0SW5kZXg7CiAgICAgICAgICAgIHRoaXMuZXhwYW5kb1N0YXJ0SW5kZXggPSBleHBhbmRvU3RhcnRJbmRleDsKICAgICAgICAgICAgdGhpcy5leHBhbmRvSW5zdHJ1Y3Rpb25zID0gZXhwYW5kb0luc3RydWN0aW9uczsKICAgICAgICAgICAgdGhpcy5maXJzdENyZWF0ZVBhc3MgPSBmaXJzdENyZWF0ZVBhc3M7CiAgICAgICAgICAgIHRoaXMuZmlyc3RVcGRhdGVQYXNzID0gZmlyc3RVcGRhdGVQYXNzOwogICAgICAgICAgICB0aGlzLnN0YXRpY1ZpZXdRdWVyaWVzID0gc3RhdGljVmlld1F1ZXJpZXM7CiAgICAgICAgICAgIHRoaXMuc3RhdGljQ29udGVudFF1ZXJpZXMgPSBzdGF0aWNDb250ZW50UXVlcmllczsKICAgICAgICAgICAgdGhpcy5wcmVPcmRlckhvb2tzID0gcHJlT3JkZXJIb29rczsKICAgICAgICAgICAgdGhpcy5wcmVPcmRlckNoZWNrSG9va3MgPSBwcmVPcmRlckNoZWNrSG9va3M7CiAgICAgICAgICAgIHRoaXMuY29udGVudEhvb2tzID0gY29udGVudEhvb2tzOwogICAgICAgICAgICB0aGlzLmNvbnRlbnRDaGVja0hvb2tzID0gY29udGVudENoZWNrSG9va3M7CiAgICAgICAgICAgIHRoaXMudmlld0hvb2tzID0gdmlld0hvb2tzOwogICAgICAgICAgICB0aGlzLnZpZXdDaGVja0hvb2tzID0gdmlld0NoZWNrSG9va3M7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveUhvb2tzID0gZGVzdHJveUhvb2tzOwogICAgICAgICAgICB0aGlzLmNsZWFudXAgPSBjbGVhbnVwOwogICAgICAgICAgICB0aGlzLmNvbnRlbnRRdWVyaWVzID0gY29udGVudFF1ZXJpZXM7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IGNvbXBvbmVudHM7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlUmVnaXN0cnkgPSBkaXJlY3RpdmVSZWdpc3RyeTsKICAgICAgICAgICAgdGhpcy5waXBlUmVnaXN0cnkgPSBwaXBlUmVnaXN0cnk7CiAgICAgICAgICAgIHRoaXMuZmlyc3RDaGlsZCA9IGZpcnN0Q2hpbGQ7CiAgICAgICAgICAgIHRoaXMuc2NoZW1hcyA9IHNjaGVtYXM7CiAgICAgICAgICAgIHRoaXMuY29uc3RzID0gY29uc3RzOwogICAgICAgICAgICB0aGlzLmluY29tcGxldGVGaXJzdFBhc3MgPSBpbmNvbXBsZXRlRmlyc3RQYXNzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0ZW1wbGF0ZV8oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYnVmID0gW107CiAgICAgICAgICAgIHByb2Nlc3NUTm9kZUNoaWxkcmVuKHRoaXMuZmlyc3RDaGlsZCwgYnVmKTsKICAgICAgICAgICAgcmV0dXJuIGJ1Zi5qb2luKCcnKTsKICAgICAgICB9CiAgICB9OwogICAgY2xhc3MgVE5vZGUkMSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0Vmlld18KICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBpbmplY3RvckluZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVTdGFydAogICAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlRW5kCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVTdHlsaW5nTGFzdAogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlCaW5kaW5ncwogICAgICAgICAqIEBwYXJhbSB7P30gZmxhZ3MKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVySW5kZXhlcwogICAgICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gYXR0cnMKICAgICAgICAgKiBAcGFyYW0gez99IG1lcmdlZEF0dHJzCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2NhbE5hbWVzCiAgICAgICAgICogQHBhcmFtIHs/fSBpbml0aWFsSW5wdXRzCiAgICAgICAgICogQHBhcmFtIHs/fSBpbnB1dHMKICAgICAgICAgKiBAcGFyYW0gez99IG91dHB1dHMKICAgICAgICAgKiBAcGFyYW0gez99IHRWaWV3cwogICAgICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICAgICAqIEBwYXJhbSB7P30gcHJvamVjdGlvbk5leHQKICAgICAgICAgKiBAcGFyYW0gez99IGNoaWxkCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IHByb2plY3Rpb24KICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlcwogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzV2l0aG91dEhvc3QKICAgICAgICAgKiBAcGFyYW0gez99IHJlc2lkdWFsU3R5bGVzCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzV2l0aG91dEhvc3QKICAgICAgICAgKiBAcGFyYW0gez99IHJlc2lkdWFsQ2xhc3NlcwogICAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NCaW5kaW5ncwogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVCaW5kaW5ncwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHRWaWV3XywgLy8KICAgICAgICB0eXBlLCAvLwogICAgICAgIGluZGV4LCAvLwogICAgICAgIGluamVjdG9ySW5kZXgsIC8vCiAgICAgICAgZGlyZWN0aXZlU3RhcnQsIC8vCiAgICAgICAgZGlyZWN0aXZlRW5kLCAvLwogICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0LCAvLwogICAgICAgIHByb3BlcnR5QmluZGluZ3MsIC8vCiAgICAgICAgZmxhZ3MsIC8vCiAgICAgICAgcHJvdmlkZXJJbmRleGVzLCAvLwogICAgICAgIHRhZ05hbWUsIC8vCiAgICAgICAgYXR0cnMsIC8vCiAgICAgICAgbWVyZ2VkQXR0cnMsIC8vCiAgICAgICAgbG9jYWxOYW1lcywgLy8KICAgICAgICBpbml0aWFsSW5wdXRzLCAvLwogICAgICAgIGlucHV0cywgLy8KICAgICAgICBvdXRwdXRzLCAvLwogICAgICAgIHRWaWV3cywgLy8KICAgICAgICBuZXh0LCAvLwogICAgICAgIHByb2plY3Rpb25OZXh0LCAvLwogICAgICAgIGNoaWxkLCAvLwogICAgICAgIHBhcmVudCwgLy8KICAgICAgICBwcm9qZWN0aW9uLCAvLwogICAgICAgIHN0eWxlcywgLy8KICAgICAgICBzdHlsZXNXaXRob3V0SG9zdCwgLy8KICAgICAgICByZXNpZHVhbFN0eWxlcywgLy8KICAgICAgICBjbGFzc2VzLCAvLwogICAgICAgIGNsYXNzZXNXaXRob3V0SG9zdCwgLy8KICAgICAgICByZXNpZHVhbENsYXNzZXMsIC8vCiAgICAgICAgY2xhc3NCaW5kaW5ncywgLy8KICAgICAgICBzdHlsZUJpbmRpbmdzKSB7CiAgICAgICAgICAgIHRoaXMudFZpZXdfID0gdFZpZXdfOwogICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICB0aGlzLmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JJbmRleCA9IGluamVjdG9ySW5kZXg7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlU3RhcnQgPSBkaXJlY3RpdmVTdGFydDsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVFbmQgPSBkaXJlY3RpdmVFbmQ7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdDsKICAgICAgICAgICAgdGhpcy5wcm9wZXJ0eUJpbmRpbmdzID0gcHJvcGVydHlCaW5kaW5nczsKICAgICAgICAgICAgdGhpcy5mbGFncyA9IGZsYWdzOwogICAgICAgICAgICB0aGlzLnByb3ZpZGVySW5kZXhlcyA9IHByb3ZpZGVySW5kZXhlczsKICAgICAgICAgICAgdGhpcy50YWdOYW1lID0gdGFnTmFtZTsKICAgICAgICAgICAgdGhpcy5hdHRycyA9IGF0dHJzOwogICAgICAgICAgICB0aGlzLm1lcmdlZEF0dHJzID0gbWVyZ2VkQXR0cnM7CiAgICAgICAgICAgIHRoaXMubG9jYWxOYW1lcyA9IGxvY2FsTmFtZXM7CiAgICAgICAgICAgIHRoaXMuaW5pdGlhbElucHV0cyA9IGluaXRpYWxJbnB1dHM7CiAgICAgICAgICAgIHRoaXMuaW5wdXRzID0gaW5wdXRzOwogICAgICAgICAgICB0aGlzLm91dHB1dHMgPSBvdXRwdXRzOwogICAgICAgICAgICB0aGlzLnRWaWV3cyA9IHRWaWV3czsKICAgICAgICAgICAgdGhpcy5uZXh0ID0gbmV4dDsKICAgICAgICAgICAgdGhpcy5wcm9qZWN0aW9uTmV4dCA9IHByb2plY3Rpb25OZXh0OwogICAgICAgICAgICB0aGlzLmNoaWxkID0gY2hpbGQ7CiAgICAgICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBwcm9qZWN0aW9uOwogICAgICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsKICAgICAgICAgICAgdGhpcy5zdHlsZXNXaXRob3V0SG9zdCA9IHN0eWxlc1dpdGhvdXRIb3N0OwogICAgICAgICAgICB0aGlzLnJlc2lkdWFsU3R5bGVzID0gcmVzaWR1YWxTdHlsZXM7CiAgICAgICAgICAgIHRoaXMuY2xhc3NlcyA9IGNsYXNzZXM7CiAgICAgICAgICAgIHRoaXMuY2xhc3Nlc1dpdGhvdXRIb3N0ID0gY2xhc3Nlc1dpdGhvdXRIb3N0OwogICAgICAgICAgICB0aGlzLnJlc2lkdWFsQ2xhc3NlcyA9IHJlc2lkdWFsQ2xhc3NlczsKICAgICAgICAgICAgdGhpcy5jbGFzc0JpbmRpbmdzID0gY2xhc3NCaW5kaW5nczsKICAgICAgICAgICAgdGhpcy5zdHlsZUJpbmRpbmdzID0gc3R5bGVCaW5kaW5nczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdHlwZV8oKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy50eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogQ29udGFpbmVyICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLkNvbnRhaW5lcic7CiAgICAgICAgICAgICAgICBjYXNlIDMgLyogRWxlbWVudCAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ROb2RlVHlwZS5FbGVtZW50JzsKICAgICAgICAgICAgICAgIGNhc2UgNCAvKiBFbGVtZW50Q29udGFpbmVyICovOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnVE5vZGVUeXBlLkVsZW1lbnRDb250YWluZXInOwogICAgICAgICAgICAgICAgY2FzZSA1IC8qIEljdUNvbnRhaW5lciAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ROb2RlVHlwZS5JY3VDb250YWluZXInOwogICAgICAgICAgICAgICAgY2FzZSAxIC8qIFByb2plY3Rpb24gKi86CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuUHJvamVjdGlvbic7CiAgICAgICAgICAgICAgICBjYXNlIDIgLyogVmlldyAqLzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1ROb2RlVHlwZS5WaWV3JzsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdUTm9kZVR5cGUuPz8/JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmbGFnc18oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmxhZ3MgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxNiAvKiBoYXNDbGFzc0lucHV0ICovKQogICAgICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5oYXNDbGFzc0lucHV0Jyk7CiAgICAgICAgICAgIGlmICh0aGlzLmZsYWdzICYgOCAvKiBoYXNDb250ZW50UXVlcnkgKi8pCiAgICAgICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc0NvbnRlbnRRdWVyeScpOwogICAgICAgICAgICBpZiAodGhpcy5mbGFncyAmIDMyIC8qIGhhc1N0eWxlSW5wdXQgKi8pCiAgICAgICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmhhc1N0eWxlSW5wdXQnKTsKICAgICAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAxMjggLyogaGFzSG9zdEJpbmRpbmdzICovKQogICAgICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5oYXNIb3N0QmluZGluZ3MnKTsKICAgICAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLykKICAgICAgICAgICAgICAgIGZsYWdzLnB1c2goJ1ROb2RlRmxhZ3MuaXNDb21wb25lbnRIb3N0Jyk7CiAgICAgICAgICAgIGlmICh0aGlzLmZsYWdzICYgMSAvKiBpc0RpcmVjdGl2ZUhvc3QgKi8pCiAgICAgICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmlzRGlyZWN0aXZlSG9zdCcpOwogICAgICAgICAgICBpZiAodGhpcy5mbGFncyAmIDY0IC8qIGlzRGV0YWNoZWQgKi8pCiAgICAgICAgICAgICAgICBmbGFncy5wdXNoKCdUTm9kZUZsYWdzLmlzRGV0YWNoZWQnKTsKICAgICAgICAgICAgaWYgKHRoaXMuZmxhZ3MgJiA0IC8qIGlzUHJvamVjdGVkICovKQogICAgICAgICAgICAgICAgZmxhZ3MucHVzaCgnVE5vZGVGbGFncy5pc1Byb2plY3RlZCcpOwogICAgICAgICAgICByZXR1cm4gZmxhZ3Muam9pbignfCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0ZW1wbGF0ZV8oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYnVmID0gW107CiAgICAgICAgICAgIGJ1Zi5wdXNoKCc8JywgdGhpcy50YWdOYW1lIHx8IHRoaXMudHlwZV8pOwogICAgICAgICAgICBpZiAodGhpcy5hdHRycykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmF0dHJzLmxlbmd0aDspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSB0aGlzLmF0dHJzW2krK107CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyTmFtZSA9PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHJWYWx1ZSA9IHRoaXMuYXR0cnNbaSsrXTsKICAgICAgICAgICAgICAgICAgICBidWYucHVzaCgnICcsICgvKiogQHR5cGUgez99ICovIChhdHRyTmFtZSkpLCAnPSInLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0clZhbHVlKSksICciJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYnVmLnB1c2goJz4nKTsKICAgICAgICAgICAgcHJvY2Vzc1ROb2RlQ2hpbGRyZW4odGhpcy5jaGlsZCwgYnVmKTsKICAgICAgICAgICAgYnVmLnB1c2goJzwvJywgdGhpcy50YWdOYW1lIHx8IHRoaXMudHlwZV8sICc+Jyk7CiAgICAgICAgICAgIHJldHVybiBidWYuam9pbignJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHN0eWxlQmluZGluZ3NfKCkgewogICAgICAgICAgICByZXR1cm4gdG9EZWJ1Z1N0eWxlQmluZGluZyh0aGlzLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNsYXNzQmluZGluZ3NfKCkgewogICAgICAgICAgICByZXR1cm4gdG9EZWJ1Z1N0eWxlQmluZGluZyh0aGlzLCB0cnVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUTm9kZURlYnVnID0gVE5vZGUkMTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvRGVidWdTdHlsZUJpbmRpbmcodE5vZGUsIGlzQ2xhc3NCYXNlZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0RGF0YSA9IHROb2RlLnRWaWV3Xy5kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5ncyA9ICgvKiogQHR5cGUgez99ICovIChbXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByYW5nZSA9IGlzQ2xhc3NCYXNlZCA/IHROb2RlLmNsYXNzQmluZGluZ3MgOiB0Tm9kZS5zdHlsZUJpbmRpbmdzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2ID0gZ2V0VFN0eWxpbmdSYW5nZVByZXYocmFuZ2UpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXh0ID0gZ2V0VFN0eWxpbmdSYW5nZU5leHQocmFuZ2UpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaXNUZW1wbGF0ZSA9IG5leHQgIT09IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjdXJzb3IgPSBpc1RlbXBsYXRlID8gbmV4dCA6IHByZXY7CiAgICAgICAgd2hpbGUgKGN1cnNvciAhPT0gMCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW1LZXkgPSAoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbY3Vyc29yXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW1SYW5nZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3IgKyAxXSkpOwogICAgICAgICAgICBiaW5kaW5ncy51bnNoaWZ0KHsKICAgICAgICAgICAgICAgIGtleTogaXRlbUtleSwKICAgICAgICAgICAgICAgIGluZGV4OiBjdXJzb3IsCiAgICAgICAgICAgICAgICBpc1RlbXBsYXRlOiBpc1RlbXBsYXRlLAogICAgICAgICAgICAgICAgcHJldkR1cGxpY2F0ZTogZ2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUoaXRlbVJhbmdlKSwKICAgICAgICAgICAgICAgIG5leHREdXBsaWNhdGU6IGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKGl0ZW1SYW5nZSksCiAgICAgICAgICAgICAgICBuZXh0SW5kZXg6IGdldFRTdHlsaW5nUmFuZ2VOZXh0KGl0ZW1SYW5nZSksCiAgICAgICAgICAgICAgICBwcmV2SW5kZXg6IGdldFRTdHlsaW5nUmFuZ2VQcmV2KGl0ZW1SYW5nZSksCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoY3Vyc29yID09PSBwcmV2KQogICAgICAgICAgICAgICAgaXNUZW1wbGF0ZSA9IGZhbHNlOwogICAgICAgICAgICBjdXJzb3IgPSBnZXRUU3R5bGluZ1JhbmdlUHJldihpdGVtUmFuZ2UpOwogICAgICAgIH0KICAgICAgICBiaW5kaW5ncy5wdXNoKChpc0NsYXNzQmFzZWQgPyB0Tm9kZS5yZXNpZHVhbENsYXNzZXMgOiB0Tm9kZS5yZXNpZHVhbFN0eWxlcykgfHwgbnVsbCk7CiAgICAgICAgcmV0dXJuIGJpbmRpbmdzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGJ1ZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcHJvY2Vzc1ROb2RlQ2hpbGRyZW4odE5vZGUsIGJ1ZikgewogICAgICAgIHdoaWxlICh0Tm9kZSkgewogICAgICAgICAgICBidWYucHVzaCgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpKSkpLnRlbXBsYXRlXyk7CiAgICAgICAgICAgIHROb2RlID0gdE5vZGUubmV4dDsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUVmlld0RhdGEgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnVFZpZXdEYXRhJykgfHwgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBUVklFV0RBVEFfRU1QVFk7CiAgICAvLyBjYW4ndCBpbml0aWFsaXplIGhlcmUgb3IgaXQgd2lsbCBub3QgYmUgdHJlZSBzaGFrZW4sIGJlY2F1c2UKICAgIC8vIGBMVmlld2AgY29uc3RydWN0b3IgY291bGQgaGF2ZSBzaWRlLWVmZmVjdHMuCiAgICAvKioKICAgICAqIFRoaXMgZnVuY3Rpb24gY2xvbmVzIGEgYmx1ZXByaW50IGFuZCBjcmVhdGVzIFREYXRhLgogICAgICoKICAgICAqIFNpbXBsZSBzbGljZSB3aWxsIGtlZXAgdGhlIHNhbWUgdHlwZSwgYW5kIHdlIG5lZWQgaXQgdG8gYmUgVERhdGEKICAgICAqIEBwYXJhbSB7P30gbGlzdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2xvbmVUb1RWaWV3RGF0YShsaXN0KSB7CiAgICAgICAgaWYgKFRWSUVXREFUQV9FTVBUWSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICBUVklFV0RBVEFfRU1QVFkgPSBuZXcgVFZpZXdEYXRhKCk7CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChUVklFV0RBVEFfRU1QVFkuY29uY2F0KGxpc3QpKSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBMVmlld0JsdWVwcmludCA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdMVmlld0JsdWVwcmludCcpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBNYXRjaGVzQXJyYXkgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnTWF0Y2hlc0FycmF5JykgfHwgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFRWaWV3Q29tcG9uZW50cyA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUVmlld0NvbXBvbmVudHMnKSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVE5vZGVMb2NhbE5hbWVzID0gTkdfREVWX01PREUgJiYgY3JlYXRlTmFtZWRBcnJheVR5cGUoJ1ROb2RlTG9jYWxOYW1lcycpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUTm9kZUluaXRpYWxJbnB1dHMgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnVE5vZGVJbml0aWFsSW5wdXRzJykgfHwgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFROb2RlSW5pdGlhbERhdGEgPSBOR19ERVZfTU9ERSAmJiBjcmVhdGVOYW1lZEFycmF5VHlwZSgnVE5vZGVJbml0aWFsRGF0YScpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBMQ2xlYW51cCA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdMQ2xlYW51cCcpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUQ2xlYW51cCA9IE5HX0RFVl9NT0RFICYmIGNyZWF0ZU5hbWVkQXJyYXlUeXBlKCdUQ2xlYW51cCcpIHx8ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGF0dGFjaExWaWV3RGVidWcobFZpZXcpIHsKICAgICAgICBhdHRhY2hEZWJ1Z09iamVjdChsVmlldywgbmV3IExWaWV3RGVidWcobFZpZXcpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsQ29udGFpbmVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhdHRhY2hMQ29udGFpbmVyRGVidWcobENvbnRhaW5lcikgewogICAgICAgIGF0dGFjaERlYnVnT2JqZWN0KGxDb250YWluZXIsIG5ldyBMQ29udGFpbmVyRGVidWcobENvbnRhaW5lcikpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdG9EZWJ1ZyhvYmopIHsKICAgICAgICBpZiAob2JqKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVidWcgPSAoKC8qKiBAdHlwZSB7P30gKi8gKG9iaikpKS5kZWJ1ZzsKICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZChkZWJ1ZywgJ09iamVjdCBkb2VzIG5vdCBoYXZlIGEgZGVidWcgcmVwcmVzZW50YXRpb24uJyk7CiAgICAgICAgICAgIHJldHVybiBkZWJ1ZzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBvYmo7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVc2UgdGhpcyBtZXRob2QgdG8gdW53cmFwIGEgbmF0aXZlIGVsZW1lbnQgaW4gYExWaWV3YCBhbmQgY29udmVydCBpdCBpbnRvIEhUTUwgZm9yIGVhc2llcgogICAgICogcmVhZGluZy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIHBvc3NpYmx5IHdyYXBwZWQgbmF0aXZlIERPTSBub2RlLgogICAgICogQHBhcmFtIHs/PX0gaW5jbHVkZUNoaWxkcmVuIElmIGB0cnVlYCB0aGVuIHRoZSBzZXJpYWxpemVkIEhUTUwgZm9ybSB3aWxsIGluY2x1ZGUgY2hpbGQgZWxlbWVudHMKICAgICAqIChzYW1lCiAgICAgKiBhcyBgb3V0ZXJIVE1MYCkuIElmIGBmYWxzZWAgdGhlbiB0aGUgc2VyaWFsaXplZCBIVE1MIGZvcm0gd2lsbCBvbmx5IGNvbnRhaW4gdGhlIGVsZW1lbnQKICAgICAqIGl0c2VsZgogICAgICogKHdpbGwgbm90IHNlcmlhbGl6ZSBjaGlsZCBlbGVtZW50cykuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0b0h0bWwodmFsdWUsIGluY2x1ZGVDaGlsZHJlbiA9IGZhbHNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwUk5vZGUodmFsdWUpKSk7CiAgICAgICAgaWYgKG5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1RleHROb2RlID0gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5URVhUX05PREU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3V0ZXJIVE1MID0gKGlzVGV4dE5vZGUgPyBub2RlLnRleHRDb250ZW50IDogbm9kZS5vdXRlckhUTUwpIHx8ICcnOwogICAgICAgICAgICBpZiAoaW5jbHVkZUNoaWxkcmVuIHx8IGlzVGV4dE5vZGUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvdXRlckhUTUw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbm5lckhUTUwgPSAnPicgKyBub2RlLmlubmVySFRNTCArICc8JzsKICAgICAgICAgICAgICAgIHJldHVybiAob3V0ZXJIVE1MLnNwbGl0KGlubmVySFRNTClbMF0pICsgJz4nOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBMVmlld0RlYnVnIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9yYXdfbFZpZXcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfcmF3X2xWaWV3KSB7CiAgICAgICAgICAgIHRoaXMuX3Jhd19sVmlldyA9IF9yYXdfbFZpZXc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZsYWdzIGFzc29jaWF0ZWQgd2l0aCB0aGUgYExWaWV3YCB1bnBhY2tlZCBpbnRvIGEgbW9yZSByZWFkYWJsZSBzdGF0ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmbGFncygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmbGFncyA9IHRoaXMuX3Jhd19sVmlld1tGTEFHU107CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBfX3Jhd19fZmxhZ3NfXzogZmxhZ3MsCiAgICAgICAgICAgICAgICBpbml0UGhhc2VTdGF0ZTogZmxhZ3MgJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLywKICAgICAgICAgICAgICAgIGNyZWF0aW9uTW9kZTogISEoZmxhZ3MgJiA0IC8qIENyZWF0aW9uTW9kZSAqLyksCiAgICAgICAgICAgICAgICBmaXJzdFZpZXdQYXNzOiAhIShmbGFncyAmIDggLyogRmlyc3RMVmlld1Bhc3MgKi8pLAogICAgICAgICAgICAgICAgY2hlY2tBbHdheXM6ICEhKGZsYWdzICYgMTYgLyogQ2hlY2tBbHdheXMgKi8pLAogICAgICAgICAgICAgICAgZGlydHk6ICEhKGZsYWdzICYgNjQgLyogRGlydHkgKi8pLAogICAgICAgICAgICAgICAgYXR0YWNoZWQ6ICEhKGZsYWdzICYgMTI4IC8qIEF0dGFjaGVkICovKSwKICAgICAgICAgICAgICAgIGRlc3Ryb3llZDogISEoZmxhZ3MgJiAyNTYgLyogRGVzdHJveWVkICovKSwKICAgICAgICAgICAgICAgIGlzUm9vdDogISEoZmxhZ3MgJiA1MTIgLyogSXNSb290ICovKSwKICAgICAgICAgICAgICAgIGluZGV4V2l0aGluSW5pdFBoYXNlOiBmbGFncyA+PiAxMSAvKiBJbmRleFdpdGhpbkluaXRQaGFzZVNoaWZ0ICovLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwYXJlbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sVmlld1tQQVJFTlRdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaG9zdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRvSHRtbCh0aGlzLl9yYXdfbFZpZXdbSE9TVF0sIHRydWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBodG1sKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMubm9kZXMgfHwgW10pLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiB0b0h0bWwobm9kZS5uYXRpdmUsIHRydWUpKSkuam9pbignJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNvbnRleHQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbQ09OVEVYVF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB0cmVlIG9mIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCBgTFZpZXdgLiBUaGUgbm9kZXMgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgaW50bwogICAgICAgICAqIGEKICAgICAgICAgKiB0cmVlIHN0cnVjdHVyZSB3aXRoIHJlbGV2YW50IGRldGFpbHMgcHVsbGVkIG91dCBmb3IgcmVhZGFiaWxpdHkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbm9kZXMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbFZpZXcgPSB0aGlzLl9yYXdfbFZpZXc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgICAgICAgICAgcmV0dXJuIHRvRGVidWdOb2Rlcyh0Tm9kZSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0VmlldygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sVmlld1tUVklFV107CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNsZWFudXAoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbQ0xFQU5VUF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W0lOSkVDVE9SJDFdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByZW5kZXJlckZhY3RvcnkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbUkVOREVSRVJfRkFDVE9SWV07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJlbmRlcmVyKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W1JFTkRFUkVSXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc2FuaXRpemVyKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W1NBTklUSVpFUl07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNoaWxkSGVhZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W0NISUxEX0hFQURdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmV4dCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRvRGVidWcodGhpcy5fcmF3X2xWaWV3W05FWFRdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2hpbGRUYWlsKCkgewogICAgICAgICAgICByZXR1cm4gdG9EZWJ1Zyh0aGlzLl9yYXdfbFZpZXdbQ0hJTERfVEFJTF0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkZWNsYXJhdGlvblZpZXcoKSB7CiAgICAgICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sVmlld1tERUNMQVJBVElPTl9WSUVXXSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHF1ZXJpZXMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yYXdfbFZpZXdbUVVFUklFU107CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHRIb3N0KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xWaWV3W1RfSE9TVF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE5vcm1hbGl6ZWQgdmlldyBvZiBjaGlsZCB2aWV3cyAoYW5kIGNvbnRhaW5lcnMpIGF0dGFjaGVkIGF0IHRoaXMgbG9jYXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2hpbGRWaWV3cygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaGlsZFZpZXdzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNoaWxkID0gdGhpcy5jaGlsZEhlYWQ7CiAgICAgICAgICAgIHdoaWxlIChjaGlsZCkgewogICAgICAgICAgICAgICAgY2hpbGRWaWV3cy5wdXNoKGNoaWxkKTsKICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQubmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY2hpbGRWaWV3czsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFR1cm5zIGEgZmxhdCBsaXN0IG9mIG5vZGVzIGludG8gYSB0cmVlIGJ5IHdhbGtpbmcgdGhlIGFzc29jaWF0ZWQgYFROb2RlYCB0cmVlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvRGVidWdOb2Rlcyh0Tm9kZSwgbFZpZXcpIHsKICAgICAgICBpZiAodE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWJ1Z05vZGVzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHROb2RlQ3Vyc29yID0gdE5vZGU7CiAgICAgICAgICAgIHdoaWxlICh0Tm9kZUN1cnNvcikgewogICAgICAgICAgICAgICAgZGVidWdOb2Rlcy5wdXNoKGJ1aWxkRGVidWdOb2RlKHROb2RlQ3Vyc29yLCBsVmlldywgdE5vZGVDdXJzb3IuaW5kZXgpKTsKICAgICAgICAgICAgICAgIHROb2RlQ3Vyc29yID0gdE5vZGVDdXJzb3IubmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGVidWdOb2RlczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBub2RlSW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkRGVidWdOb2RlKHROb2RlLCBsVmlldywgbm9kZUluZGV4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJhd1ZhbHVlID0gbFZpZXdbbm9kZUluZGV4XTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmF0aXZlID0gdW53cmFwUk5vZGUocmF3VmFsdWUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnRMVmlld0RlYnVnID0gdG9EZWJ1ZyhyZWFkTFZpZXdWYWx1ZShyYXdWYWx1ZSkpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGh0bWw6IHRvSHRtbChuYXRpdmUpLAogICAgICAgICAgICBuYXRpdmU6ICgvKiogQHR5cGUgez99ICovIChuYXRpdmUpKSwKICAgICAgICAgICAgbm9kZXM6IHRvRGVidWdOb2Rlcyh0Tm9kZS5jaGlsZCwgbFZpZXcpLAogICAgICAgICAgICBjb21wb25lbnQ6IGNvbXBvbmVudExWaWV3RGVidWcsCiAgICAgICAgfTsKICAgIH0KICAgIGNsYXNzIExDb250YWluZXJEZWJ1ZyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmF3X2xDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfcmF3X2xDb250YWluZXIpIHsKICAgICAgICAgICAgdGhpcy5fcmF3X2xDb250YWluZXIgPSBfcmF3X2xDb250YWluZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGhhc1RyYW5zcGxhbnRlZFZpZXdzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbSEFTX1RSQU5TUExBTlRFRF9WSUVXU107CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZpZXdzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXIuc2xpY2UoQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQpCiAgICAgICAgICAgICAgICAubWFwKCgvKiogQHR5cGUgez99ICovICh0b0RlYnVnKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwYXJlbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW1BBUkVOVF0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtb3ZlZFZpZXdzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbTU9WRURfVklFV1NdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBob3N0KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3X2xDb250YWluZXJbSE9TVF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG5hdGl2ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jhd19sQ29udGFpbmVyW05BVElWRV07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG5leHQoKSB7CiAgICAgICAgICAgIHJldHVybiB0b0RlYnVnKHRoaXMuX3Jhd19sQ29udGFpbmVyW05FWFRdKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiBhbiBgTFZpZXdgIHZhbHVlIGlmIGZvdW5kLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgYExWaWV3YCBpZiBhbnkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlYWRMVmlld1ZhbHVlKHZhbHVlKSB7CiAgICAgICAgd2hpbGUgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgY2hlY2sgaXMgbm90IHF1aXRlIHJpZ2h0LCBhcyBpdCBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBgU3R5bGluZ0NvbnRleHRgCiAgICAgICAgICAgIC8vIFRoaXMgaXMgd2h5IGl0IGlzIGluIGRlYnVnLCBub3QgaW4gdXRpbC50cwogICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID49IEhFQURFUl9PRkZTRVQgLSAxKQogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlW0hPU1RdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIGNsYXNzIEkxOE5EZWJ1Z0l0ZW0gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX19yYXdfb3BDb2RlCiAgICAgICAgICogQHBhcmFtIHs/fSBfbFZpZXcKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleAogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9fcmF3X29wQ29kZSwgX2xWaWV3LCBub2RlSW5kZXgsIHR5cGUpIHsKICAgICAgICAgICAgdGhpcy5fX3Jhd19vcENvZGUgPSBfX3Jhd19vcENvZGU7CiAgICAgICAgICAgIHRoaXMuX2xWaWV3ID0gX2xWaWV3OwogICAgICAgICAgICB0aGlzLm5vZGVJbmRleCA9IG5vZGVJbmRleDsKICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdE5vZGUoKSB7CiAgICAgICAgICAgIHJldHVybiBnZXRUTm9kZSh0aGlzLl9sVmlld1tUVklFV10sIHRoaXMubm9kZUluZGV4KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFR1cm5zIGEgbGlzdCBvZiAiQ3JlYXRlIiAmICJVcGRhdGUiIE9wQ29kZXMgaW50byBhIGh1bWFuLXJlYWRhYmxlIGxpc3Qgb2Ygb3BlcmF0aW9ucyBmb3IKICAgICAqIGRlYnVnZ2luZyBwdXJwb3Nlcy4KICAgICAqIEBwYXJhbSB7P30gbXV0YXRlT3BDb2RlcyBtdXRhdGlvbiBvcENvZGVzIHRvIHJlYWQKICAgICAqIEBwYXJhbSB7P30gdXBkYXRlT3BDb2RlcyB1cGRhdGUgb3BDb2RlcyB0byByZWFkCiAgICAgKiBAcGFyYW0gez99IGljdXMgbGlzdCBvZiBJQ1UgZXhwcmVzc2lvbnMKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdGhlIG9wQ29kZXMgYXJlIGFjdGluZyBvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXR0YWNoSTE4bk9wQ29kZXNEZWJ1ZyhtdXRhdGVPcENvZGVzLCB1cGRhdGVPcENvZGVzLCBpY3VzLCBsVmlldykgewogICAgICAgIGF0dGFjaERlYnVnT2JqZWN0KG11dGF0ZU9wQ29kZXMsIG5ldyBJMThuTXV0YXRlT3BDb2Rlc0RlYnVnKG11dGF0ZU9wQ29kZXMsIGxWaWV3KSk7CiAgICAgICAgYXR0YWNoRGVidWdPYmplY3QodXBkYXRlT3BDb2RlcywgbmV3IEkxOG5VcGRhdGVPcENvZGVzRGVidWcodXBkYXRlT3BDb2RlcywgaWN1cywgbFZpZXcpKTsKICAgICAgICBpZiAoaWN1cykgewogICAgICAgICAgICBpY3VzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGljdQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWN1ID0+IHsKICAgICAgICAgICAgICAgIGljdS5jcmVhdGUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGljdUNhc2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGljdUNhc2UgPT4gewogICAgICAgICAgICAgICAgICAgIGF0dGFjaERlYnVnT2JqZWN0KGljdUNhc2UsIG5ldyBJMThuTXV0YXRlT3BDb2Rlc0RlYnVnKGljdUNhc2UsIGxWaWV3KSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBpY3UudXBkYXRlLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpY3VDYXNlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpY3VDYXNlID0+IHsKICAgICAgICAgICAgICAgICAgICBhdHRhY2hEZWJ1Z09iamVjdChpY3VDYXNlLCBuZXcgSTE4blVwZGF0ZU9wQ29kZXNEZWJ1ZyhpY3VDYXNlLCBpY3VzLCBsVmlldykpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgSTE4bk11dGF0ZU9wQ29kZXNEZWJ1ZyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfX3Jhd19vcENvZGVzCiAgICAgICAgICogQHBhcmFtIHs/fSBfX2xWaWV3CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX19yYXdfb3BDb2RlcywgX19sVmlldykgewogICAgICAgICAgICB0aGlzLl9fcmF3X29wQ29kZXMgPSBfX3Jhd19vcENvZGVzOwogICAgICAgICAgICB0aGlzLl9fbFZpZXcgPSBfX2xWaWV3OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGxpc3Qgb2Ygb3BlcmF0aW9uIGluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgT3BDb2RlcyB3aWxsIGFjdCBvbiB0aGUgdmlldy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBvcGVyYXRpb25zKCkgewogICAgICAgICAgICBjb25zdCB7IF9fbFZpZXcsIF9fcmF3X29wQ29kZXMgfSA9IHRoaXM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IF9fcmF3X29wQ29kZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9wQ29kZSA9IF9fcmF3X29wQ29kZXNbaV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcENvZGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0NyZWF0ZSBUZXh0IE5vZGUnLAogICAgICAgICAgICAgICAgICAgICAgICBub2RlSW5kZXg6IF9fcmF3X29wQ29kZXNbKytpXSwKICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wQ29kZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIEFwcGVuZENoaWxkICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Ob2RlSW5kZXggPSBvcENvZGUgPj4+IDE3IC8qIFNISUZUX1BBUkVOVCAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgZGVzdGluYXRpb25Ob2RlSW5kZXgsICdBcHBlbmRDaGlsZCcpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMCAvKiBTZWxlY3QgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBub2RlSW5kZXgsICdTZWxlY3QnKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDUgLyogRWxlbWVudEVuZCAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbGVtZW50SW5kZXggPSBvcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBlbGVtZW50SW5kZXgsICdFbGVtZW50RW5kJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSA0IC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50SW5kZXggPSBvcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEkxOE5EZWJ1Z0l0ZW0ob3BDb2RlLCBfX2xWaWV3LCBlbGVtZW50SW5kZXgsICdBdHRyJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2F0dHJOYW1lJ10gPSBfX3Jhd19vcENvZGVzWysraV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2F0dHJWYWx1ZSddID0gX19yYXdfb3BDb2Rlc1srK2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlRfTUFSS0VSOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdDT01NRU5UX01BUktFUicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudFZhbHVlOiBfX3Jhd19vcENvZGVzWysraV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUluZGV4OiBfX3Jhd19vcENvZGVzWysraV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRUxFTUVOVF9NQVJLRVI6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0VMRU1FTlRfTUFSS0VSJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgX19yYXdfb3BDb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdVbmtub3duIE9wIENvZGUnLAogICAgICAgICAgICAgICAgICAgICAgICBjb2RlOiBvcENvZGUsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChyZXN1bHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEkxOG5VcGRhdGVPcENvZGVzRGVidWcgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX19yYXdfb3BDb2RlcwogICAgICAgICAqIEBwYXJhbSB7P30gaWN1cwogICAgICAgICAqIEBwYXJhbSB7P30gX19sVmlldwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9fcmF3X29wQ29kZXMsIGljdXMsIF9fbFZpZXcpIHsKICAgICAgICAgICAgdGhpcy5fX3Jhd19vcENvZGVzID0gX19yYXdfb3BDb2RlczsKICAgICAgICAgICAgdGhpcy5pY3VzID0gaWN1czsKICAgICAgICAgICAgdGhpcy5fX2xWaWV3ID0gX19sVmlldzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBsaXN0IG9mIG9wZXJhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCBob3cgdGhlIE9wQ29kZXMgd2lsbCBhY3Qgb24gdGhlIHZpZXcuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgb3BlcmF0aW9ucygpIHsKICAgICAgICAgICAgY29uc3QgeyBfX2xWaWV3LCBfX3Jhd19vcENvZGVzLCBpY3VzIH0gPSB0aGlzOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBfX3Jhd19vcENvZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvLyBiaXQgY29kZSB0byBjaGVjayBpZiB3ZSBzaG91bGQgYXBwbHkgdGhlIG5leHQgdXBkYXRlCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGVja0JpdCA9ICgvKiogQHR5cGUgez99ICovIChfX3Jhd19vcENvZGVzW2ldKSk7CiAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2Ygb3BDb2RlcyB0byBza2lwIHVudGlsIG5leHQgc2V0IG9mIHVwZGF0ZSBjb2RlcwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2tpcENvZGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKF9fcmF3X29wQ29kZXNbKytpXSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPD0gKGkgKyBza2lwQ29kZXMpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BDb2RlID0gX19yYXdfb3BDb2Rlc1tqXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wQ29kZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKz0gb3BDb2RlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3BDb2RlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcENvZGUgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCdzIGEgYmluZGluZyBpbmRleCB3aG9zZSB2YWx1ZSBpcyBuZWdhdGl2ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGtub3cgdGhlIHZhbHVlIG9mIHRoZSBiaW5kaW5nIHNvIHdlIG9ubHkgc2hvdyB0aGUgaW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IGDvv70key1vcENvZGUgLSAxfe+/vWA7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDIgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRJY3VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0SWN1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcENvZGUgJiAzIC8qIE1BU0tfT1BDT0RFICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXR0ck5hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoX19yYXdfb3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVGbiA9IF9fcmF3X29wQ29kZXNbKytqXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fcmF3X29wQ29kZTogb3BDb2RlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tCaXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnQXR0cicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyVmFsdWU6IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ck5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW5pdGl6ZUZuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIC8qIFRleHQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX3Jhd19vcENvZGU6IG9wQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrQml0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1RleHQnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dDogdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogSWN1U3dpdGNoICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoX19yYXdfb3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3UgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaWN1cykpW3RJY3VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHJlc3VsdCA9IG5ldyBJMThORGVidWdJdGVtKG9wQ29kZSwgX19sVmlldywgbm9kZUluZGV4LCAnSWN1U3dpdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsndEljdUluZGV4J10gPSB0SWN1SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdFsnY2hlY2tCaXQnXSA9IGNoZWNrQml0OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ21haW5CaW5kaW5nJ10gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd0SWN1J10gPSB0SWN1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAzIC8qIEljdVVwZGF0ZSAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdEljdUluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKF9fcmF3X29wQ29kZXNbKytqXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVt0SWN1SW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgSTE4TkRlYnVnSXRlbShvcENvZGUsIF9fbFZpZXcsIG5vZGVJbmRleCwgJ0ljdVVwZGF0ZScpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ3RJY3VJbmRleCddID0gdEljdUluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRbJ2NoZWNrQml0J10gPSBjaGVja0JpdDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Wyd0SWN1J10gPSB0SWN1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2gocmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpICs9IHNraXBDb2RlczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9zaGFyZWQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY29uc3QgybUwJDQgPSAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIC8qKgogICAgICogQSBwZXJtYW5lbnQgbWFya2VyIHByb21pc2Ugd2hpY2ggc2lnbmlmaWVzIHRoYXQgdGhlIGN1cnJlbnQgQ0QgdHJlZSBpcwogICAgICogY2xlYW4uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgX0NMRUFOX1BST01JU0UgPSAoKMm1MCQ0KSkoKTsKICAgIC8qKgogICAgICogUHJvY2VzcyB0aGUgYFRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnNgLiAoRXhlY3V0ZSB0aGUgYGhvc3RCaW5kaW5nc2AuKQogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgYFRWaWV3YCBjb250YWluaW5nIHRoZSBgZXhwYW5kb0luc3RydWN0aW9uc2AKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgYExWaWV3YCBhc3NvY2lhdGVkIHdpdGggdGhlIGBUVmlld2AKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldEhvc3RCaW5kaW5nc0J5RXhlY3V0aW5nRXhwYW5kb0luc3RydWN0aW9ucyh0VmlldywgbFZpZXcpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0U2FtZSh0VmlldywgbFZpZXdbVFZJRVddLCAnYExWaWV3YCBpcyBub3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBgVFZpZXdgIScpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhwYW5kb0luc3RydWN0aW9ucyA9IHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnM7CiAgICAgICAgICAgIGlmIChleHBhbmRvSW5zdHJ1Y3Rpb25zICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgYmluZGluZ1Jvb3RJbmRleCA9IHRWaWV3LmV4cGFuZG9TdGFydEluZGV4OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IC0xOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGN1cnJlbnRFbGVtZW50SW5kZXggPSAtMTsKICAgICAgICAgICAgICAgIC8vIFRPRE8obWlza28pOiBQRVJGIEl0IGlzIHBvc3NpYmxlIHRvIGdldCBoZXJlIHdpdGggYFRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnNgIGNvbnRhaW5pbmcgbm8KICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9ucyB0byBleGVjdXRlLiBUaGlzIGlzIHdhc3RlZnVsIGFzIHRoZXJlIGlzIG5vIHdvcmsgdG8gYmUgZG9uZSwgYnV0IHdlIHN0aWxsIG5lZWQKICAgICAgICAgICAgICAgIC8vIHRvIGl0ZXJhdGUgb3ZlciB0aGUgaW5zdHJ1Y3Rpb25zLgogICAgICAgICAgICAgICAgLy8gSW4gZXhhbXBsZSBvZiB0aGlzIGlzIGluIHRoaXMgdGVzdDogYGhvc3RfYmluZGluZ19zcGVjLnRzYAogICAgICAgICAgICAgICAgLy8gYGZpdCgnc2hvdWxkIG5vdCBjYXVzZSBwcm9ibGVtcyBpZiBkZXRlY3RDaGFuZ2VzIGlzIGNhbGxlZCB3aGVuIGEgcHJvcGVydHkgdXBkYXRlcycsIC4uLmAKICAgICAgICAgICAgICAgIC8vIEluIHRoZSBhYm92ZSB0ZXN0IHdlIGdldCBoZXJlIHdpdGggZXhwYW5kbyBbMCwgMCwgMV0gd2hpY2ggcmVxdWlyZXMgYSBsb3Qgb2YgcHJvY2Vzc2luZyBidXQKICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGZ1bmN0aW9uIHRvIGV4ZWN1dGUuCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4cGFuZG9JbnN0cnVjdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb24gPSBleHBhbmRvSW5zdHJ1Y3Rpb25zW2ldOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaW5zdHJ1Y3Rpb24gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbnN0cnVjdGlvbiA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBudW1iZXJzIG1lYW4gdGhhdCB3ZSBhcmUgc3RhcnRpbmcgbmV3IEVYUEFORE8gYmxvY2sgYW5kIG5lZWQgdG8gdXBkYXRlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBlbGVtZW50IGFuZCBkaXJlY3RpdmUgaW5kZXguCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbXBvcnRhbnQ6IEluIEpTIGAteGAgYW5kIGAwLXhgIGlzIG5vdCB0aGUgc2FtZSEgSWYgYHg9PT0wYCB0aGVuIGAteGAgd2lsbCBwcm9kdWNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgLTBgIHdoaWNoIHJlcXVpcmVzIG5vbiBzdGFuZGFyZCBtYXRoIGFyaXRobWV0aWMgYW5kIGl0IGNhbiBwcmV2ZW50IFZNIG9wdGltaXphdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgMC0wYCB3aWxsIGFsd2F5cyBwcm9kdWNlIGAwYCBhbmQgd2lsbCBub3QgY2F1c2UgYSBwb3RlbnRpYWwgZGVvcHRpbWl6YXRpb24gaW4gVk0uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogUEVSRiBUaGlzIHNob3VsZCBiZSByZWZhY3RvcmVkIHRvIHVzZSBgfmluc3RydWN0aW9uYCBhcyB0aGF0IGRvZXMgbm90CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWZmZXIgZnJvbSBgLTBgIGFuZCBpdCBpcyBmYXN0ZXIvbW9yZSBjb21wYWN0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudEVsZW1lbnRJbmRleCA9IDAgLSBpbnN0cnVjdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgoY3VycmVudEVsZW1lbnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmplY3RvciBibG9jayBhbmQgcHJvdmlkZXJzIGFyZSB0YWtlbiBpbnRvIGFjY291bnQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm92aWRlckNvdW50ID0gKCgvKiogQHR5cGUgez99ICovIChleHBhbmRvSW5zdHJ1Y3Rpb25zWysraV0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nUm9vdEluZGV4ICs9IElOSkVDVE9SX0JMT09NX1BBUkVOVF9TSVpFICsgcHJvdmlkZXJDb3VudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnREaXJlY3RpdmVJbmRleCA9IGJpbmRpbmdSb290SW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGVpdGhlciB0aGUgaW5qZWN0b3Igc2l6ZSAoc28gdGhlIGJpbmRpbmcgcm9vdCBjYW4gc2tpcCBvdmVyIGRpcmVjdGl2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBnZXQgdG8gdGhlIGZpcnN0IHNldCBvZiBob3N0IGJpbmRpbmdzIG9uIHRoaXMgbm9kZSkgb3IgdGhlIGhvc3QgdmFyIGNvdW50CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAodG8gZ2V0IHRvIHRoZSBuZXh0IHNldCBvZiBob3N0IGJpbmRpbmdzIG9uIHRoaXMgbm9kZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kaW5nUm9vdEluZGV4ICs9IGluc3RydWN0aW9uOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBpdCdzIG5vdCBhIG51bWJlciwgaXQncyBhIGhvc3QgYmluZGluZyBmdW5jdGlvbiB0aGF0IG5lZWRzIHRvIGJlIGV4ZWN1dGVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5zdHJ1Y3Rpb24gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldEJpbmRpbmdSb290Rm9ySG9zdEJpbmRpbmdzKGJpbmRpbmdSb290SW5kZXgsIGN1cnJlbnREaXJlY3RpdmVJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0Q3R4ID0gbFZpZXdbY3VycmVudERpcmVjdGl2ZUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uKDIgLyogVXBkYXRlICovLCBob3N0Q3R4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogUEVSRiBSZWx5aW5nIG9uIGluY3JlbWVudGluZyB0aGUgYGN1cnJlbnREaXJlY3RpdmVJbmRleGAgaGVyZSBpcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzdWItb3B0aW1hbC4gVGhlIGltcGxpY2F0aW9ucyBhcmUgdGhhdCBpZiB3ZSBoYXZlIGEgbG90IG9mIGRpcmVjdGl2ZXMgYnV0IG5vbmUgb2YgdGhlbQogICAgICAgICAgICAgICAgICAgICAgICAvLyBoYXZlIGhvc3QgYmluZGluZ3Mgd2UgbmV2ZXJ0aGVsZXNzIG5lZWQgdG8gaXRlcmF0ZSBvdmVyIHRoZSBleHBhbmRvIGluc3RydWN0aW9ucyB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyB1cGRhdGUgdGhlIGNvdW50ZXIuIEl0IHdvdWxkIGJlIG11Y2ggYmV0dGVyIGlmIHdlIGNvdWxkIGVuY29kZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYGN1cnJlbnREaXJlY3RpdmVJbmRleGAgaW50byB0aGUgYGV4cGFuZG9JbnN0cnVjdGlvbmAgYXJyYXkgc28gdGhhdCB3ZSBvbmx5IG5lZWQgdG8KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXRlcmF0ZSBvdmVyIHRob3NlIGRpcmVjdGl2ZXMgd2hpY2ggYWN0dWFsbHkgaGF2ZSBgaG9zdEJpbmRpbmdzYC4KICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudERpcmVjdGl2ZUluZGV4Kys7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KC0xKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlZnJlc2hlcyBhbGwgY29udGVudCBxdWVyaWVzIGRlY2xhcmVkIGJ5IGRpcmVjdGl2ZXMgaW4gYSBnaXZlbiB2aWV3CiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZWZyZXNoQ29udGVudFF1ZXJpZXModFZpZXcsIGxWaWV3KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRlbnRRdWVyaWVzID0gdFZpZXcuY29udGVudFF1ZXJpZXM7CiAgICAgICAgaWYgKGNvbnRlbnRRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29udGVudFF1ZXJpZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHF1ZXJ5U3RhcnRJZHggPSBjb250ZW50UXVlcmllc1tpXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlZklkeCA9IGNvbnRlbnRRdWVyaWVzW2kgKyAxXTsKICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmVEZWZJZHggIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZURlZiA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2RpcmVjdGl2ZURlZklkeF0pKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZChkaXJlY3RpdmVEZWYuY29udGVudFF1ZXJpZXMsICdjb250ZW50UXVlcmllcyBmdW5jdGlvbiBzaG91bGQgYmUgZGVmaW5lZCcpOwogICAgICAgICAgICAgICAgICAgIHNldEN1cnJlbnRRdWVyeUluZGV4KHF1ZXJ5U3RhcnRJZHgpOwogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChkaXJlY3RpdmVEZWYuY29udGVudFF1ZXJpZXMpKSgyIC8qIFVwZGF0ZSAqLywgbFZpZXdbZGlyZWN0aXZlRGVmSWR4XSwgZGlyZWN0aXZlRGVmSWR4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVmcmVzaGVzIGNoaWxkIGNvbXBvbmVudHMgaW4gdGhlIGN1cnJlbnQgdmlldyAodXBkYXRlIG1vZGUpLgogICAgICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVmcmVzaENoaWxkQ29tcG9uZW50cyhob3N0TFZpZXcsIGNvbXBvbmVudHMpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvbXBvbmVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgcmVmcmVzaENvbXBvbmVudChob3N0TFZpZXcsIGNvbXBvbmVudHNbaV0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmVuZGVycyBjaGlsZCBjb21wb25lbnRzIGluIHRoZSBjdXJyZW50IHZpZXcgKGNyZWF0aW9uIG1vZGUpLgogICAgICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVuZGVyQ2hpbGRDb21wb25lbnRzKGhvc3RMVmlldywgY29tcG9uZW50cykgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICByZW5kZXJDb21wb25lbnQoaG9zdExWaWV3LCBjb21wb25lbnRzW2ldKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuYXRpdmUgZWxlbWVudCBmcm9tIGEgdGFnIG5hbWUsIHVzaW5nIGEgcmVuZGVyZXIuCiAgICAgKiBAcGFyYW0gez99IG5hbWUgdGhlIHRhZyBuYW1lCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyIEEgcmVuZGVyZXIgdG8gdXNlCiAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30gdGhlIGVsZW1lbnQgY3JlYXRlZAogICAgICovCiAgICBmdW5jdGlvbiBlbGVtZW50Q3JlYXRlKG5hbWUsIHJlbmRlcmVyLCBuYW1lc3BhY2UpIHsKICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIHJldHVybiByZW5kZXJlci5jcmVhdGVFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlID09PSBudWxsID8gcmVuZGVyZXIuY3JlYXRlRWxlbWVudChuYW1lKSA6CiAgICAgICAgICAgICAgICByZW5kZXJlci5jcmVhdGVFbGVtZW50TlMobmFtZXNwYWNlLCBuYW1lKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHBhcmVudExWaWV3CiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEBwYXJhbSB7P30gZmxhZ3MKICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICogQHBhcmFtIHs/fSB0SG9zdE5vZGUKICAgICAqIEBwYXJhbSB7Pz19IHJlbmRlcmVyRmFjdG9yeQogICAgICogQHBhcmFtIHs/PX0gcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplcgogICAgICogQHBhcmFtIHs/PX0gaW5qZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUxWaWV3KHBhcmVudExWaWV3LCB0VmlldywgY29udGV4dCwgZmxhZ3MsIGhvc3QsIHRIb3N0Tm9kZSwgcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlciwgc2FuaXRpemVyLCBpbmplY3RvcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IG5nRGV2TW9kZSA/IGNsb25lVG9MVmlld0Zyb21UVmlld0JsdWVwcmludCh0VmlldykgOiAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuYmx1ZXByaW50LnNsaWNlKCkpKTsKICAgICAgICBsVmlld1tIT1NUXSA9IGhvc3Q7CiAgICAgICAgbFZpZXdbRkxBR1NdID0gZmxhZ3MgfCA0IC8qIENyZWF0aW9uTW9kZSAqLyB8IDEyOCAvKiBBdHRhY2hlZCAqLyB8IDggLyogRmlyc3RMVmlld1Bhc3MgKi87CiAgICAgICAgcmVzZXRQcmVPcmRlckhvb2tGbGFncyhsVmlldyk7CiAgICAgICAgbFZpZXdbUEFSRU5UXSA9IGxWaWV3W0RFQ0xBUkFUSU9OX1ZJRVddID0gcGFyZW50TFZpZXc7CiAgICAgICAgbFZpZXdbQ09OVEVYVF0gPSBjb250ZXh0OwogICAgICAgIGxWaWV3W1JFTkRFUkVSX0ZBQ1RPUlldID0gKC8qKiBAdHlwZSB7P30gKi8gKChyZW5kZXJlckZhY3RvcnkgfHwgcGFyZW50TFZpZXcgJiYgcGFyZW50TFZpZXdbUkVOREVSRVJfRkFDVE9SWV0pKSk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobFZpZXdbUkVOREVSRVJfRkFDVE9SWV0sICdSZW5kZXJlckZhY3RvcnkgaXMgcmVxdWlyZWQnKTsKICAgICAgICBsVmlld1tSRU5ERVJFUl0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoKHJlbmRlcmVyIHx8IHBhcmVudExWaWV3ICYmIHBhcmVudExWaWV3W1JFTkRFUkVSXSkpKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChsVmlld1tSRU5ERVJFUl0sICdSZW5kZXJlciBpcyByZXF1aXJlZCcpOwogICAgICAgIGxWaWV3W1NBTklUSVpFUl0gPSBzYW5pdGl6ZXIgfHwgcGFyZW50TFZpZXcgJiYgcGFyZW50TFZpZXdbU0FOSVRJWkVSXSB8fCAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIGxWaWV3WygvKiogQHR5cGUgez99ICovIChJTkpFQ1RPUiQxKSldID0gaW5qZWN0b3IgfHwgcGFyZW50TFZpZXcgJiYgcGFyZW50TFZpZXdbSU5KRUNUT1IkMV0gfHwgbnVsbDsKICAgICAgICBsVmlld1tUX0hPU1RdID0gdEhvc3ROb2RlOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnRFcXVhbCh0Vmlldy50eXBlID09IDIgLyogRW1iZWRkZWQgKi8gPyBwYXJlbnRMVmlldyAhPT0gbnVsbCA6IHRydWUsIHRydWUsICdFbWJlZGRlZCB2aWV3cyBtdXN0IGhhdmUgcGFyZW50TFZpZXcnKTsKICAgICAgICBsVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV10gPQogICAgICAgICAgICB0Vmlldy50eXBlID09IDIgLyogRW1iZWRkZWQgKi8gPyAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50TFZpZXcpKVtERUNMQVJBVElPTl9DT01QT05FTlRfVklFV10gOiBsVmlldzsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXR0YWNoTFZpZXdEZWJ1ZyhsVmlldyk7CiAgICAgICAgcmV0dXJuIGxWaWV3OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHRIb3N0Tm9kZQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gYXR0cnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIHRIb3N0Tm9kZSwgaW5kZXgsIHR5cGUsIG5hbWUsIGF0dHJzKSB7CiAgICAgICAgLy8gS2VlcCB0aGlzIGZ1bmN0aW9uIHNob3J0LCBzbyB0aGF0IHRoZSBWTSB3aWxsIGlubGluZSBpdC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSkpIHx8CiAgICAgICAgICAgIGNyZWF0ZVROb2RlQXRJbmRleCh0VmlldywgdEhvc3ROb2RlLCBhZGp1c3RlZEluZGV4LCB0eXBlLCBuYW1lLCBhdHRycyk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHROb2RlLCB0cnVlKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gdEhvc3ROb2RlCiAgICAgKiBAcGFyYW0gez99IGFkanVzdGVkSW5kZXgKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IGF0dHJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVUTm9kZUF0SW5kZXgodFZpZXcsIHRIb3N0Tm9kZSwgYWRqdXN0ZWRJbmRleCwgdHlwZSwgbmFtZSwgYXR0cnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNPclBhcmVudFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzUGFyZW50ID0gZ2V0SXNQYXJlbnQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50ID0gaXNQYXJlbnQgPyBwcmV2aW91c09yUGFyZW50VE5vZGUgOiBwcmV2aW91c09yUGFyZW50VE5vZGUgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLnBhcmVudDsKICAgICAgICAvLyBQYXJlbnRzIGNhbm5vdCBjcm9zcyBjb21wb25lbnQgYm91bmRhcmllcyBiZWNhdXNlIGNvbXBvbmVudHMgd2lsbCBiZSB1c2VkIGluIG11bHRpcGxlIHBsYWNlcywKICAgICAgICAvLyBzbyBpdCdzIG9ubHkgc2V0IGlmIHRoZSB2aWV3IGlzIHRoZSBzYW1lLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJlbnRJblNhbWVWaWV3ID0gcGFyZW50ICYmIHBhcmVudCAhPT0gdEhvc3ROb2RlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UGFyZW50Tm9kZSA9IHBhcmVudEluU2FtZVZpZXcgPyAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50KSkgOiBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0gPQogICAgICAgICAgICBjcmVhdGVUTm9kZSh0VmlldywgdFBhcmVudE5vZGUsIHR5cGUsIGFkanVzdGVkSW5kZXgsIG5hbWUsIGF0dHJzKTsKICAgICAgICAvLyBBc3NpZ24gYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGlsZCBub2RlIG9mIGEgZ2l2ZW4gdmlldy4gVGhlIGZpcnN0IG5vZGUgaXMgbm90IGFsd2F5cyB0aGUgb25lCiAgICAgICAgLy8gYXQgaW5kZXggMCwgaW4gY2FzZSBvZiBpMThuLCBpbmRleCAwIGNhbiBiZSB0aGUgaW5zdHJ1Y3Rpb24gYGkxOG5TdGFydGAgYW5kIHRoZSBmaXJzdCBub2RlIGhhcwogICAgICAgIC8vIHRoZSBpbmRleCAxIG9yIG1vcmUsIHNvIHdlIGNhbid0IGp1c3QgY2hlY2sgbm9kZSBpbmRleC4KICAgICAgICBpZiAodFZpZXcuZmlyc3RDaGlsZCA9PT0gbnVsbCkgewogICAgICAgICAgICB0Vmlldy5maXJzdENoaWxkID0gdE5vZGU7CiAgICAgICAgfQogICAgICAgIGlmIChwcmV2aW91c09yUGFyZW50VE5vZGUpIHsKICAgICAgICAgICAgaWYgKGlzUGFyZW50ICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5jaGlsZCA9PSBudWxsICYmCiAgICAgICAgICAgICAgICAodE5vZGUucGFyZW50ICE9PSBudWxsIHx8IHByZXZpb3VzT3JQYXJlbnRUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGhlIHNhbWUgdmlldywgd2hpY2ggbWVhbnMgd2UgYXJlIGFkZGluZyBjb250ZW50IG5vZGUgdG8gdGhlIHBhcmVudCB2aWV3LgogICAgICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlLmNoaWxkID0gdE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWlzUGFyZW50KSB7CiAgICAgICAgICAgICAgICBwcmV2aW91c09yUGFyZW50VE5vZGUubmV4dCA9IHROb2RlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Tm9kZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0UGFyZW50Tm9kZQogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzaWduVFZpZXdOb2RlVG9MVmlldyh0VmlldywgdFBhcmVudE5vZGUsIGluZGV4LCBsVmlldykgewogICAgICAgIC8vIFZpZXcgbm9kZXMgYXJlIG5vdCBzdG9yZWQgaW4gZGF0YSBiZWNhdXNlIHRoZXkgY2FuIGJlIGFkZGVkIC8gcmVtb3ZlZCBhdCBydW50aW1lICh3aGljaAogICAgICAgIC8vIHdvdWxkIGNhdXNlIGluZGljZXMgdG8gY2hhbmdlKS4gVGhlaXIgVE5vZGVzIGFyZSBpbnN0ZWFkIHN0b3JlZCBpbiB0Vmlldy5ub2RlLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdE5vZGUgPSB0Vmlldy5ub2RlOwogICAgICAgIGlmICh0Tm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiB0UGFyZW50Tm9kZSAmJgogICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0UGFyZW50Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICAgICAgICAgIHRWaWV3Lm5vZGUgPSB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVUTm9kZSh0VmlldywgKC8qKiBAdHlwZSB7P30gKi8gKHRQYXJlbnROb2RlKSksIC8vCiAgICAgICAgICAgIDIgLyogVmlldyAqLywgaW5kZXgsIG51bGwsIG51bGwpKSk7CiAgICAgICAgfQogICAgICAgIGxWaWV3W1RfSE9TVF0gPSAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKTsKICAgIH0KICAgIC8qKgogICAgICogV2hlbiBlbGVtZW50cyBhcmUgY3JlYXRlZCBkeW5hbWljYWxseSBhZnRlciBhIHZpZXcgYmx1ZXByaW50IGlzIGNyZWF0ZWQgKGUuZy4gdGhyb3VnaAogICAgICogaTE4bkFwcGx5KCkgb3IgQ29tcG9uZW50RmFjdG9yeS5jcmVhdGUpLCB3ZSBuZWVkIHRvIGFkanVzdCB0aGUgYmx1ZXByaW50IGZvciBmdXR1cmUKICAgICAqIHRlbXBsYXRlIHBhc3Nlcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2AgYXNzb2NpYXRlZCB3aXRoIGBMVmlld2AKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gbnVtU2xvdHNUb0FsbG9jIFRoZSBudW1iZXIgb2Ygc2xvdHMgdG8gYWxsb2MgaW4gdGhlIExWaWV3LCBzaG91bGQgYmUgPjAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFsbG9jRXhwYW5kbyh0VmlldywgbFZpZXcsIG51bVNsb3RzVG9BbGxvYykgewogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnRHcmVhdGVyVGhhbihudW1TbG90c1RvQWxsb2MsIDAsICdUaGUgbnVtYmVyIG9mIHNsb3RzIHRvIGFsbG9jIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gMCcpOwogICAgICAgIGlmIChudW1TbG90c1RvQWxsb2MgPiAwKSB7CiAgICAgICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbnVtU2xvdHNUb0FsbG9jOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0Vmlldy5ibHVlcHJpbnQucHVzaChudWxsKTsKICAgICAgICAgICAgICAgICAgICB0Vmlldy5kYXRhLnB1c2gobnVsbCk7CiAgICAgICAgICAgICAgICAgICAgbFZpZXcucHVzaChudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBvbmx5IGluY3JlbWVudCB0aGUgZXhwYW5kbyBzdGFydCBpbmRleCBpZiB0aGVyZSBhcmVuJ3QgYWxyZWFkeSBkaXJlY3RpdmVzCiAgICAgICAgICAgICAgICAvLyBhbmQgaW5qZWN0b3JzIHNhdmVkIGluIHRoZSAiZXhwYW5kbyIgc2VjdGlvbgogICAgICAgICAgICAgICAgaWYgKCF0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgdFZpZXcuZXhwYW5kb1N0YXJ0SW5kZXggKz0gbnVtU2xvdHNUb0FsbG9jOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UncmUgYWRkaW5nIHRoZSBkeW5hbWljIG5vZGVzIGludG8gdGhlIGV4cGFuZG8gc2VjdGlvbiwgd2UgbmVlZCB0byBsZXQgdGhlIGhvc3QKICAgICAgICAgICAgICAgICAgICAvLyBiaW5kaW5ncyBrbm93IHRoYXQgdGhleSBzaG91bGQgc2tpcCB4IHNsb3RzCiAgICAgICAgICAgICAgICAgICAgdFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucy5wdXNoKG51bVNsb3RzVG9BbGxvYyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLyBSZW5kZXIKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvKioKICAgICAqIFByb2Nlc3NlcyBhIHZpZXcgaW4gdGhlIGNyZWF0aW9uIG1vZGUuIFRoaXMgaW5jbHVkZXMgYSBudW1iZXIgb2Ygc3RlcHMgaW4gYSBzcGVjaWZpYyBvcmRlcjoKICAgICAqIC0gY3JlYXRpbmcgdmlldyBxdWVyeSBmdW5jdGlvbnMgKGlmIGFueSk7CiAgICAgKiAtIGV4ZWN1dGluZyBhIHRlbXBsYXRlIGZ1bmN0aW9uIGluIHRoZSBjcmVhdGlvbiBtb2RlOwogICAgICogLSB1cGRhdGluZyBzdGF0aWMgcXVlcmllcyAoaWYgYW55KTsKICAgICAqIC0gY3JlYXRpbmcgY2hpbGQgY29tcG9uZW50cyBkZWZpbmVkIGluIGEgZ2l2ZW4gdmlldy4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbmRlclZpZXcodFZpZXcsIGxWaWV3LCBjb250ZXh0KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGlzQ3JlYXRpb25Nb2RlKGxWaWV3KSwgdHJ1ZSwgJ1Nob3VsZCBiZSBydW4gaW4gY3JlYXRpb24gbW9kZScpOwogICAgICAgIGVudGVyVmlldyhsVmlldywgbFZpZXdbVF9IT1NUXSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3UXVlcnkgPSB0Vmlldy52aWV3UXVlcnk7CiAgICAgICAgICAgIGlmICh2aWV3UXVlcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGV4ZWN1dGVWaWV3UXVlcnlGbigxIC8qIENyZWF0ZSAqLywgdmlld1F1ZXJ5LCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFeGVjdXRlIGEgdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdmlldywgaWYgaXQgZXhpc3RzLiBBIHRlbXBsYXRlIGZ1bmN0aW9uIG1pZ2h0IG5vdCBiZQogICAgICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgcm9vdCBjb21wb25lbnQgdmlld3MuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVGbiA9IHRWaWV3LnRlbXBsYXRlOwogICAgICAgICAgICBpZiAodGVtcGxhdGVGbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlKHRWaWV3LCBsVmlldywgdGVtcGxhdGVGbiwgMSAvKiBDcmVhdGUgKi8sIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBjaGlsZHJlbiBhcmUgcHJvY2Vzc2VkIHRvIHN1cHBvcnQgcmVjdXJzaXZlIGNvbXBvbmVudHMuCiAgICAgICAgICAgIC8vIFRoaXMgbXVzdCBiZSBzZXQgdG8gZmFsc2UgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZpcnN0IGNyZWF0aW9uIHJ1biBiZWNhdXNlIGluIGFuCiAgICAgICAgICAgIC8vIG5nRm9yIGxvb3AsIGFsbCB0aGUgdmlld3Mgd2lsbCBiZSBjcmVhdGVkIHRvZ2V0aGVyIGJlZm9yZSB1cGRhdGUgbW9kZSBydW5zIGFuZCB0dXJucwogICAgICAgICAgICAvLyBvZmYgZmlyc3RDcmVhdGVQYXNzLiBJZiB3ZSBkb24ndCBzZXQgaXQgaGVyZSwgaW5zdGFuY2VzIHdpbGwgcGVyZm9ybSBkaXJlY3RpdmUKICAgICAgICAgICAgLy8gbWF0Y2hpbmcsIGV0YyBhZ2FpbiBhbmQgYWdhaW4uCiAgICAgICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgICAgIHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlIHJlc29sdmUgY29udGVudCBxdWVyaWVzIHNwZWNpZmljYWxseSBtYXJrZWQgYXMgYHN0YXRpY2AgaW4gY3JlYXRpb24gbW9kZS4gRHluYW1pYwogICAgICAgICAgICAvLyBjb250ZW50IHF1ZXJpZXMgYXJlIHJlc29sdmVkIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uIChpLmUuIHVwZGF0ZSBtb2RlKSwgYWZ0ZXIgZW1iZWRkZWQKICAgICAgICAgICAgLy8gdmlld3MgYXJlIHJlZnJlc2hlZCAoc2VlIGJsb2NrIGFib3ZlKS4KICAgICAgICAgICAgaWYgKHRWaWV3LnN0YXRpY0NvbnRlbnRRdWVyaWVzKSB7CiAgICAgICAgICAgICAgICByZWZyZXNoQ29udGVudFF1ZXJpZXModFZpZXcsIGxWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBtdXN0IG1hdGVyaWFsaXplIHF1ZXJ5IHJlc3VsdHMgYmVmb3JlIGNoaWxkIGNvbXBvbmVudHMgYXJlIHByb2Nlc3NlZAogICAgICAgICAgICAvLyBpbiBjYXNlIGEgY2hpbGQgY29tcG9uZW50IGhhcyBwcm9qZWN0ZWQgYSBjb250YWluZXIuIFRoZSBMQ29udGFpbmVyIG5lZWRzCiAgICAgICAgICAgIC8vIHRvIGV4aXN0IHNvIHRoZSBlbWJlZGRlZCB2aWV3cyBhcmUgcHJvcGVybHkgYXR0YWNoZWQgYnkgdGhlIGNvbnRhaW5lci4KICAgICAgICAgICAgaWYgKHRWaWV3LnN0YXRpY1ZpZXdRdWVyaWVzKSB7CiAgICAgICAgICAgICAgICBleGVjdXRlVmlld1F1ZXJ5Rm4oMiAvKiBVcGRhdGUgKi8sICgvKiogQHR5cGUgez99ICovICh0Vmlldy52aWV3UXVlcnkpKSwgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVuZGVyIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdFZpZXcuY29tcG9uZW50czsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlbmRlckNoaWxkQ29tcG9uZW50cyhsVmlldywgY29tcG9uZW50cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgIC8vIElmIHdlIGRpZG4ndCBtYW5hZ2UgdG8gZ2V0IHBhc3QgdGhlIGZpcnN0IHRlbXBsYXRlIHBhc3MgZHVlIHRvCiAgICAgICAgICAgIC8vIGFuIGVycm9yLCBtYXJrIHRoZSB2aWV3IGFzIGNvcnJ1cHRlZCBzbyB3ZSBjYW4gdHJ5IHRvIHJlY292ZXIuCiAgICAgICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgICAgIHRWaWV3LmluY29tcGxldGVGaXJzdFBhc3MgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRocm93IGVycm9yOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgbFZpZXdbRkxBR1NdICY9IH40IC8qIENyZWF0aW9uTW9kZSAqLzsKICAgICAgICAgICAgbGVhdmVWaWV3KCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBQcm9jZXNzZXMgYSB2aWV3IGluIHVwZGF0ZSBtb2RlLiBUaGlzIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHN0ZXBzIGluIGEgc3BlY2lmaWMgb3JkZXI6CiAgICAgKiAtIGV4ZWN1dGluZyBhIHRlbXBsYXRlIGZ1bmN0aW9uIGluIHVwZGF0ZSBtb2RlOwogICAgICogLSBleGVjdXRpbmcgaG9va3M7CiAgICAgKiAtIHJlZnJlc2hpbmcgcXVlcmllczsKICAgICAqIC0gc2V0dGluZyBob3N0IGJpbmRpbmdzOwogICAgICogLSByZWZyZXNoaW5nIGNoaWxkIChlbWJlZGRlZCBhbmQgY29tcG9uZW50KSB2aWV3cy4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlRm4KICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0ZW1wbGF0ZUZuLCBjb250ZXh0KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGlzQ3JlYXRpb25Nb2RlKGxWaWV3KSwgZmFsc2UsICdTaG91bGQgYmUgcnVuIGluIHVwZGF0ZSBtb2RlJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZsYWdzID0gbFZpZXdbRkxBR1NdOwogICAgICAgIGlmICgoZmxhZ3MgJiAyNTYgLyogRGVzdHJveWVkICovKSA9PT0gMjU2IC8qIERlc3Ryb3llZCAqLykKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIGVudGVyVmlldyhsVmlldywgbFZpZXdbVF9IT1NUXSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNoZWNrTm9DaGFuZ2VzTW9kZSA9IGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJlc2V0UHJlT3JkZXJIb29rRmxhZ3MobFZpZXcpOwogICAgICAgICAgICBzZXRCaW5kaW5nSW5kZXgodFZpZXcuYmluZGluZ1N0YXJ0SW5kZXgpOwogICAgICAgICAgICBpZiAodGVtcGxhdGVGbiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgZXhlY3V0ZVRlbXBsYXRlKHRWaWV3LCBsVmlldywgdGVtcGxhdGVGbiwgMiAvKiBVcGRhdGUgKi8sIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG9va3NJbml0UGhhc2VDb21wbGV0ZWQgPSAoZmxhZ3MgJiAzIC8qIEluaXRQaGFzZVN0YXRlTWFzayAqLykgPT09IDMgLyogSW5pdFBoYXNlQ29tcGxldGVkICovOwogICAgICAgICAgICAvLyBleGVjdXRlIHByZS1vcmRlciBob29rcyAoT25Jbml0LCBPbkNoYW5nZXMsIERvQ2hlY2spCiAgICAgICAgICAgIC8vIFBFUkYgV0FSTklORzogZG8gTk9UIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdpdGhvdXQgcnVubmluZyBiZW5jaG1hcmtzCiAgICAgICAgICAgIGlmICghY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJlT3JkZXJDaGVja0hvb2tzID0gdFZpZXcucHJlT3JkZXJDaGVja0hvb2tzOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmVPcmRlckNoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNoZWNrSG9va3MobFZpZXcsIHByZU9yZGVyQ2hlY2tIb29rcywgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZU9yZGVySG9va3MgPSB0Vmlldy5wcmVPcmRlckhvb2tzOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmVPcmRlckhvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJbml0QW5kQ2hlY2tIb29rcyhsVmlldywgcHJlT3JkZXJIb29rcywgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8sIG51bGwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMCAvKiBPbkluaXRIb29rc1RvQmVSdW4gKi8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZpcnN0IG1hcmsgdHJhbnNwbGFudGVkIHZpZXdzIHRoYXQgYXJlIGRlY2xhcmVkIGluIHRoaXMgbFZpZXcgYXMgbmVlZGluZyBhIHJlZnJlc2ggYXQgdGhlaXIKICAgICAgICAgICAgLy8gaW5zZXJ0aW9uIHBvaW50cy4gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgdGhlIHNpdHVhdGlvbiB3aGVyZSB0aGUgdGVtcGxhdGUgaXMgZGVmaW5lZCBpbiB0aGlzCiAgICAgICAgICAgIC8vIGBMVmlld2AgYnV0IGl0cyBkZWNsYXJhdGlvbiBhcHBlYXJzIGFmdGVyIHRoZSBpbnNlcnRpb24gY29tcG9uZW50LgogICAgICAgICAgICBtYXJrVHJhbnNwbGFudGVkVmlld3NGb3JSZWZyZXNoKGxWaWV3KTsKICAgICAgICAgICAgcmVmcmVzaEVtYmVkZGVkVmlld3MobFZpZXcpOwogICAgICAgICAgICAvLyBDb250ZW50IHF1ZXJ5IHJlc3VsdHMgbXVzdCBiZSByZWZyZXNoZWQgYmVmb3JlIGNvbnRlbnQgaG9va3MgYXJlIGNhbGxlZC4KICAgICAgICAgICAgaWYgKHRWaWV3LmNvbnRlbnRRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZWZyZXNoQ29udGVudFF1ZXJpZXModFZpZXcsIGxWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBleGVjdXRlIGNvbnRlbnQgaG9va3MgKEFmdGVyQ29udGVudEluaXQsIEFmdGVyQ29udGVudENoZWNrZWQpCiAgICAgICAgICAgIC8vIFBFUkYgV0FSTklORzogZG8gTk9UIGV4dHJhY3QgdGhpcyB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHdpdGhvdXQgcnVubmluZyBiZW5jaG1hcmtzCiAgICAgICAgICAgIGlmICghY2hlY2tOb0NoYW5nZXNNb2RlKSB7CiAgICAgICAgICAgICAgICBpZiAoaG9va3NJbml0UGhhc2VDb21wbGV0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudENoZWNrSG9va3MgPSB0Vmlldy5jb250ZW50Q2hlY2tIb29rczsKICAgICAgICAgICAgICAgICAgICBpZiAoY29udGVudENoZWNrSG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUNoZWNrSG9va3MobFZpZXcsIGNvbnRlbnRDaGVja0hvb2tzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29udGVudEhvb2tzID0gdFZpZXcuY29udGVudEhvb2tzOwogICAgICAgICAgICAgICAgICAgIGlmIChjb250ZW50SG9va3MgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZUluaXRBbmRDaGVja0hvb2tzKGxWaWV3LCBjb250ZW50SG9va3MsIDEgLyogQWZ0ZXJDb250ZW50SW5pdEhvb2tzVG9CZVJ1biAqLyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGluY3JlbWVudEluaXRQaGFzZUZsYWdzKGxWaWV3LCAxIC8qIEFmdGVyQ29udGVudEluaXRIb29rc1RvQmVSdW4gKi8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHNldEhvc3RCaW5kaW5nc0J5RXhlY3V0aW5nRXhwYW5kb0luc3RydWN0aW9ucyh0VmlldywgbFZpZXcpOwogICAgICAgICAgICAvLyBSZWZyZXNoIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRzID0gdFZpZXcuY29tcG9uZW50czsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJlZnJlc2hDaGlsZENvbXBvbmVudHMobFZpZXcsIGNvbXBvbmVudHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFZpZXcgcXVlcmllcyBtdXN0IGV4ZWN1dGUgYWZ0ZXIgcmVmcmVzaGluZyBjaGlsZCBjb21wb25lbnRzIGJlY2F1c2UgYSB0ZW1wbGF0ZSBpbiB0aGlzIHZpZXcKICAgICAgICAgICAgLy8gY291bGQgYmUgaW5zZXJ0ZWQgaW4gYSBjaGlsZCBjb21wb25lbnQuIElmIHRoZSB2aWV3IHF1ZXJ5IGV4ZWN1dGVzIGJlZm9yZSBjaGlsZCBjb21wb25lbnQKICAgICAgICAgICAgLy8gcmVmcmVzaCwgdGhlIHRlbXBsYXRlIG1pZ2h0IG5vdCB5ZXQgYmUgaW5zZXJ0ZWQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgdmlld1F1ZXJ5ID0gdFZpZXcudmlld1F1ZXJ5OwogICAgICAgICAgICBpZiAodmlld1F1ZXJ5ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBleGVjdXRlVmlld1F1ZXJ5Rm4oMiAvKiBVcGRhdGUgKi8sIHZpZXdRdWVyeSwgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXhlY3V0ZSB2aWV3IGhvb2tzIChBZnRlclZpZXdJbml0LCBBZnRlclZpZXdDaGVja2VkKQogICAgICAgICAgICAvLyBQRVJGIFdBUk5JTkc6IGRvIE5PVCBleHRyYWN0IHRoaXMgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiB3aXRob3V0IHJ1bm5pbmcgYmVuY2htYXJrcwogICAgICAgICAgICBpZiAoIWNoZWNrTm9DaGFuZ2VzTW9kZSkgewogICAgICAgICAgICAgICAgaWYgKGhvb2tzSW5pdFBoYXNlQ29tcGxldGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdDaGVja0hvb2tzID0gdFZpZXcudmlld0NoZWNrSG9va3M7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdDaGVja0hvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVDaGVja0hvb2tzKGxWaWV3LCB2aWV3Q2hlY2tIb29rcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdIb29rcyA9IHRWaWV3LnZpZXdIb29rczsKICAgICAgICAgICAgICAgICAgICBpZiAodmlld0hvb2tzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4ZWN1dGVJbml0QW5kQ2hlY2tIb29rcyhsVmlldywgdmlld0hvb2tzLCAyIC8qIEFmdGVyVmlld0luaXRIb29rc1RvQmVSdW4gKi8pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpbmNyZW1lbnRJbml0UGhhc2VGbGFncyhsVmlldywgMiAvKiBBZnRlclZpZXdJbml0SG9va3NUb0JlUnVuICovKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodFZpZXcuZmlyc3RVcGRhdGVQYXNzID09PSB0cnVlKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIG9ubHkgZmxpcCB0aGUgZmxhZyBvbiBzdWNjZXNzZnVsIGByZWZyZXNoVmlld2Agb25seQogICAgICAgICAgICAgICAgLy8gRG9uJ3QgZG8gdGhpcyBpbiBgZmluYWxseWAgYmxvY2suCiAgICAgICAgICAgICAgICAvLyBJZiB3ZSBkaWQgdGhpcyBpbiBgZmluYWxseWAgYmxvY2sgdGhlbiBhbiBleGNlcHRpb24gY291bGQgYmxvY2sgdGhlIGV4ZWN1dGlvbiBvZiBzdHlsaW5nCiAgICAgICAgICAgICAgICAvLyBpbnN0cnVjdGlvbnMgd2hpY2ggaW4gdHVybiB3b3VsZCBiZSB1bmFibGUgdG8gaW5zZXJ0IHRoZW1zZWx2ZXMgaW50byB0aGUgc3R5bGluZyBsaW5rZWQKICAgICAgICAgICAgICAgIC8vIGxpc3QuIFRoZSByZXN1bHQgb2YgdGhpcyB3b3VsZCBiZSB0aGF0IGlmIHRoZSBleGNlcHRpb24gd291bGQgbm90IGJlIHRocm93IG9uIHN1YnNlcXVlbnQgQ0QKICAgICAgICAgICAgICAgIC8vIHRoZSBzdHlsaW5nIHdvdWxkIGJlIHVuYWJsZSB0byBwcm9jZXNzIGl0IGRhdGEgYW5kIHJlZmxlY3QgdG8gdGhlIERPTS4KICAgICAgICAgICAgICAgIHRWaWV3LmZpcnN0VXBkYXRlUGFzcyA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIERvIG5vdCByZXNldCB0aGUgZGlydHkgc3RhdGUgd2hlbiBydW5uaW5nIGluIGNoZWNrIG5vIGNoYW5nZXMgbW9kZS4gV2UgZG9uJ3Qgd2FudCBjb21wb25lbnRzCiAgICAgICAgICAgIC8vIHRvIGJlaGF2ZSBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciBjaGVjayBubyBjaGFuZ2VzIGlzIGVuYWJsZWQgb3Igbm90LiBGb3IgZXhhbXBsZToKICAgICAgICAgICAgLy8gTWFya2luZyBhbiBPblB1c2ggY29tcG9uZW50IGFzIGRpcnR5IGZyb20gd2l0aGluIHRoZSBgbmdBZnRlclZpZXdJbml0YCBob29rIGluIG9yZGVyIHRvCiAgICAgICAgICAgIC8vIHJlZnJlc2ggYSBgTmdDbGFzc2AgYmluZGluZyBzaG91bGQgd29yay4gSWYgd2Ugd291bGQgcmVzZXQgdGhlIGRpcnR5IHN0YXRlIGluIHRoZSBjaGVjawogICAgICAgICAgICAvLyBubyBjaGFuZ2VzIGN5Y2xlLCB0aGUgY29tcG9uZW50IHdvdWxkIGJlIG5vdCBiZSBkaXJ0eSBmb3IgdGhlIG5leHQgdXBkYXRlIHBhc3MuIFRoaXMgd291bGQKICAgICAgICAgICAgLy8gYmUgZGlmZmVyZW50IGluIHByb2R1Y3Rpb24gbW9kZSB3aGVyZSB0aGUgY29tcG9uZW50IGRpcnR5IHN0YXRlIGlzIG5vdCByZXNldC4KICAgICAgICAgICAgaWYgKCFjaGVja05vQ2hhbmdlc01vZGUpIHsKICAgICAgICAgICAgICAgIGxWaWV3W0ZMQUdTXSAmPSB+KDY0IC8qIERpcnR5ICovIHwgOCAvKiBGaXJzdExWaWV3UGFzcyAqLyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxWaWV3W0ZMQUdTXSAmIDEwMjQgLyogUmVmcmVzaFRyYW5zcGxhbnRlZFZpZXcgKi8pIHsKICAgICAgICAgICAgICAgIGxWaWV3W0ZMQUdTXSAmPSB+MTAyNCAvKiBSZWZyZXNoVHJhbnNwbGFudGVkVmlldyAqLzsKICAgICAgICAgICAgICAgIHVwZGF0ZVRyYW5zcGxhbnRlZFZpZXdDb3VudCgoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUEFSRU5UXSkpLCAtMSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGxlYXZlVmlldygpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbgogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW5kZXJDb21wb25lbnRPclRlbXBsYXRlKHRWaWV3LCBsVmlldywgdGVtcGxhdGVGbiwgY29udGV4dCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZW5kZXJlckZhY3RvcnkgPSBsVmlld1tSRU5ERVJFUl9GQUNUT1JZXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9ybWFsRXhlY3V0aW9uUGF0aCA9ICFnZXRDaGVja05vQ2hhbmdlc01vZGUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3JlYXRpb25Nb2RlSXNBY3RpdmUgPSBpc0NyZWF0aW9uTW9kZShsVmlldyk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgaWYgKG5vcm1hbEV4ZWN1dGlvblBhdGggJiYgIWNyZWF0aW9uTW9kZUlzQWN0aXZlICYmIHJlbmRlcmVyRmFjdG9yeS5iZWdpbikgewogICAgICAgICAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmJlZ2luKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNyZWF0aW9uTW9kZUlzQWN0aXZlKSB7CiAgICAgICAgICAgICAgICByZW5kZXJWaWV3KHRWaWV3LCBsVmlldywgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0ZW1wbGF0ZUZuLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChub3JtYWxFeGVjdXRpb25QYXRoICYmICFjcmVhdGlvbk1vZGVJc0FjdGl2ZSAmJiByZW5kZXJlckZhY3RvcnkuZW5kKSB7CiAgICAgICAgICAgICAgICByZW5kZXJlckZhY3RvcnkuZW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlRm4KICAgICAqIEBwYXJhbSB7P30gcmYKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXhlY3V0ZVRlbXBsYXRlKHRWaWV3LCBsVmlldywgdGVtcGxhdGVGbiwgcmYsIGNvbnRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldlNlbGVjdGVkSW5kZXggPSBnZXRTZWxlY3RlZEluZGV4KCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiAgICAgICAgICAgIGlmIChyZiAmIDIgLyogVXBkYXRlICovICYmIGxWaWV3Lmxlbmd0aCA+IEhFQURFUl9PRkZTRVQpIHsKICAgICAgICAgICAgICAgIC8vIFdoZW4gd2UncmUgdXBkYXRpbmcsIGluaGVyZW50bHkgc2VsZWN0IDAgc28gd2UgZG9uJ3QKICAgICAgICAgICAgICAgIC8vIGhhdmUgdG8gZ2VuZXJhdGUgdGhhdCBpbnN0cnVjdGlvbiBmb3IgbW9zdCB1cGRhdGUgYmxvY2tzLgogICAgICAgICAgICAgICAgc2VsZWN0SW5kZXhJbnRlcm5hbCh0VmlldywgbFZpZXcsIDAsIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0ZW1wbGF0ZUZuKHJmLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgocHJldlNlbGVjdGVkSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vIEVsZW1lbnQKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4ZWN1dGVDb250ZW50UXVlcmllcyh0VmlldywgdE5vZGUsIGxWaWV3KSB7CiAgICAgICAgaWYgKGlzQ29udGVudFF1ZXJ5SG9zdCh0Tm9kZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFydCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgICAgICAgICAgZm9yIChsZXQgZGlyZWN0aXZlSW5kZXggPSBzdGFydDsgZGlyZWN0aXZlSW5kZXggPCBlbmQ7IGRpcmVjdGl2ZUluZGV4KyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRlZiA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2RpcmVjdGl2ZUluZGV4XSkpOwogICAgICAgICAgICAgICAgaWYgKGRlZi5jb250ZW50UXVlcmllcykgewogICAgICAgICAgICAgICAgICAgIGRlZi5jb250ZW50UXVlcmllcygxIC8qIENyZWF0ZSAqLywgbFZpZXdbZGlyZWN0aXZlSW5kZXhdLCBkaXJlY3RpdmVJbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgZGlyZWN0aXZlIGluc3RhbmNlcy4KICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZURpcmVjdGl2ZXNJbnN0YW5jZXModFZpZXcsIGxWaWV3LCB0Tm9kZSkgewogICAgICAgIGlmICghZ2V0QmluZGluZ3NFbmFibGVkKCkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICBpbnN0YW50aWF0ZUFsbERpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpKTsKICAgICAgICBpZiAoKHROb2RlLmZsYWdzICYgMTI4IC8qIGhhc0hvc3RCaW5kaW5ncyAqLykgPT09IDEyOCAvKiBoYXNIb3N0QmluZGluZ3MgKi8pIHsKICAgICAgICAgICAgaW52b2tlRGlyZWN0aXZlc0hvc3RCaW5kaW5ncyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRha2VzIGEgbGlzdCBvZiBsb2NhbCBuYW1lcyBhbmQgaW5kaWNlcyBhbmQgcHVzaGVzIHRoZSByZXNvbHZlZCBsb2NhbCB2YXJpYWJsZSB2YWx1ZXMKICAgICAqIHRvIExWaWV3IGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZXkgYXJlIGxvYWRlZCBpbiB0aGUgdGVtcGxhdGUgd2l0aCBsb2FkKCkuCiAgICAgKiBAcGFyYW0gez99IHZpZXdEYXRhCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez89fSBsb2NhbFJlZkV4dHJhY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKHZpZXdEYXRhLCB0Tm9kZSwgbG9jYWxSZWZFeHRyYWN0b3IgPSBnZXROYXRpdmVCeVROb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxvY2FsTmFtZXMgPSB0Tm9kZS5sb2NhbE5hbWVzOwogICAgICAgIGlmIChsb2NhbE5hbWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGxvY2FsSW5kZXggPSB0Tm9kZS5pbmRleCArIDE7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbG9jYWxOYW1lcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAobG9jYWxOYW1lc1tpICsgMV0pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gaW5kZXggPT09IC0xID8KICAgICAgICAgICAgICAgICAgICBsb2NhbFJlZkV4dHJhY3RvcigoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgdmlld0RhdGEpIDoKICAgICAgICAgICAgICAgICAgICB2aWV3RGF0YVtpbmRleF07CiAgICAgICAgICAgICAgICB2aWV3RGF0YVtsb2NhbEluZGV4KytdID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgVFZpZXcgZnJvbSBhIHRlbXBsYXRlIGZ1bmN0aW9uIG9yIGNyZWF0ZXMgYSBuZXcgVFZpZXcKICAgICAqIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGRlZiBDb21wb25lbnREZWYKICAgICAqIEByZXR1cm4gez99IFRWaWV3CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE9yQ3JlYXRlVENvbXBvbmVudFZpZXcoZGVmKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZGVmLnRWaWV3OwogICAgICAgIC8vIENyZWF0ZSBhIFRWaWV3IGlmIHRoZXJlIGlzbid0IG9uZSwgb3IgcmVjcmVhdGUgaXQgaWYgdGhlIGZpcnN0IGNyZWF0ZSBwYXNzIGRpZG4ndAogICAgICAgIC8vIGNvbXBsZXRlIHN1Y2Nlc3NmdWx5IHNpbmNlIHdlIGNhbid0IGtub3cgZm9yIHN1cmUgd2hldGhlciBpdCdzIGluIGEgdXNhYmxlIHNoYXBlLgogICAgICAgIGlmICh0VmlldyA9PT0gbnVsbCB8fCB0Vmlldy5pbmNvbXBsZXRlRmlyc3RQYXNzKSB7CiAgICAgICAgICAgIHJldHVybiBkZWYudFZpZXcgPSBjcmVhdGVUVmlldygxIC8qIENvbXBvbmVudCAqLywgLTEsIGRlZi50ZW1wbGF0ZSwgZGVmLmRlY2xzLCBkZWYudmFycywgZGVmLmRpcmVjdGl2ZURlZnMsIGRlZi5waXBlRGVmcywgZGVmLnZpZXdRdWVyeSwgZGVmLnNjaGVtYXMsIGRlZi5jb25zdHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdFZpZXc7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBUVmlldyBpbnN0YW5jZQogICAgICoKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSB2aWV3SW5kZXggVGhlIHZpZXdCbG9ja0lkIGZvciBpbmxpbmUgdmlld3MsIG9yIC0xIGlmIGl0J3MgYSBjb21wb25lbnQvZHluYW1pYwogICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZUZuIFRlbXBsYXRlIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gez99IGRlY2xzIFRoZSBudW1iZXIgb2Ygbm9kZXMsIGxvY2FsIHJlZnMsIGFuZCBwaXBlcyBpbiB0aGlzIHRlbXBsYXRlCiAgICAgKiBAcGFyYW0gez99IHZhcnMKICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlcyBSZWdpc3RyeSBvZiBkaXJlY3RpdmVzIGZvciB0aGlzIHZpZXcKICAgICAqIEBwYXJhbSB7P30gcGlwZXMgUmVnaXN0cnkgb2YgcGlwZXMgZm9yIHRoaXMgdmlldwogICAgICogQHBhcmFtIHs/fSB2aWV3UXVlcnkgVmlldyBxdWVyaWVzIGZvciB0aGlzIHZpZXcKICAgICAqIEBwYXJhbSB7P30gc2NoZW1hcyBTY2hlbWFzIGZvciB0aGlzIHZpZXcKICAgICAqIEBwYXJhbSB7P30gY29uc3RzIENvbnN0YW50cyBmb3IgdGhpcyB2aWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVUVmlldyh0eXBlLCB2aWV3SW5kZXgsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCBkaXJlY3RpdmVzLCBwaXBlcywgdmlld1F1ZXJ5LCBzY2hlbWFzLCBjb25zdHMpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnRWaWV3Kys7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdTdGFydEluZGV4ID0gSEVBREVSX09GRlNFVCArIGRlY2xzOwogICAgICAgIC8vIFRoaXMgbGVuZ3RoIGRvZXMgbm90IHlldCBjb250YWluIGhvc3QgYmluZGluZ3MgZnJvbSBjaGlsZCBkaXJlY3RpdmVzIGJlY2F1c2UgYXQgdGhpcyBwb2ludCwKICAgICAgICAvLyB3ZSBkb24ndCBrbm93IHdoaWNoIGRpcmVjdGl2ZXMgYXJlIGFjdGl2ZSBvbiB0aGlzIHRlbXBsYXRlLiBBcyBzb29uIGFzIGEgZGlyZWN0aXZlIGlzIG1hdGNoZWQKICAgICAgICAvLyB0aGF0IGhhcyBhIGhvc3QgYmluZGluZywgd2Ugd2lsbCB1cGRhdGUgdGhlIGJsdWVwcmludCB3aXRoIHRoYXQgZGVmJ3MgaG9zdFZhcnMgY291bnQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaXRpYWxWaWV3TGVuZ3RoID0gYmluZGluZ1N0YXJ0SW5kZXggKyB2YXJzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBibHVlcHJpbnQgPSBjcmVhdGVWaWV3Qmx1ZXByaW50KGJpbmRpbmdTdGFydEluZGV4LCBpbml0aWFsVmlld0xlbmd0aCk7CiAgICAgICAgcmV0dXJuIGJsdWVwcmludFsoLyoqIEB0eXBlIHs/fSAqLyAoVFZJRVcpKV0gPSBuZ0Rldk1vZGUgPwogICAgICAgICAgICBuZXcgVFZpZXdDb25zdHJ1Y3Rvcih0eXBlLCB2aWV3SW5kZXgsIC8vIGlkOiBudW1iZXIsCiAgICAgICAgICAgIGJsdWVwcmludCwgLy8gYmx1ZXByaW50OiBMVmlldywKICAgICAgICAgICAgdGVtcGxhdGVGbiwgLy8gdGVtcGxhdGU6IENvbXBvbmVudFRlbXBsYXRlPHt9PnxudWxsLAogICAgICAgICAgICBudWxsLCAvLyBxdWVyaWVzOiBUUXVlcmllc3xudWxsCiAgICAgICAgICAgIHZpZXdRdWVyeSwgKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwgLy8gbm9kZTogVFZpZXdOb2RlfFRFbGVtZW50Tm9kZXxudWxsLAogICAgICAgICAgICBjbG9uZVRvVFZpZXdEYXRhKGJsdWVwcmludCkuZmlsbChudWxsLCBiaW5kaW5nU3RhcnRJbmRleCksIC8vIGRhdGE6IFREYXRhLAogICAgICAgICAgICBiaW5kaW5nU3RhcnRJbmRleCwgLy8gYmluZGluZ1N0YXJ0SW5kZXg6IG51bWJlciwKICAgICAgICAgICAgaW5pdGlhbFZpZXdMZW5ndGgsIC8vIGV4cGFuZG9TdGFydEluZGV4OiBudW1iZXIsCiAgICAgICAgICAgIG51bGwsIC8vIGV4cGFuZG9JbnN0cnVjdGlvbnM6IEV4cGFuZG9JbnN0cnVjdGlvbnN8bnVsbCwKICAgICAgICAgICAgdHJ1ZSwgLy8gZmlyc3RDcmVhdGVQYXNzOiBib29sZWFuLAogICAgICAgICAgICB0cnVlLCAvLyBmaXJzdFVwZGF0ZVBhc3M6IGJvb2xlYW4sCiAgICAgICAgICAgIGZhbHNlLCAvLyBzdGF0aWNWaWV3UXVlcmllczogYm9vbGVhbiwKICAgICAgICAgICAgZmFsc2UsIC8vIHN0YXRpY0NvbnRlbnRRdWVyaWVzOiBib29sZWFuLAogICAgICAgICAgICBudWxsLCAvLyBwcmVPcmRlckhvb2tzOiBIb29rRGF0YXxudWxsLAogICAgICAgICAgICBudWxsLCAvLyBwcmVPcmRlckNoZWNrSG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgICAgIG51bGwsIC8vIGNvbnRlbnRIb29rczogSG9va0RhdGF8bnVsbCwKICAgICAgICAgICAgbnVsbCwgLy8gY29udGVudENoZWNrSG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgICAgIG51bGwsIC8vIHZpZXdIb29rczogSG9va0RhdGF8bnVsbCwKICAgICAgICAgICAgbnVsbCwgLy8gdmlld0NoZWNrSG9va3M6IEhvb2tEYXRhfG51bGwsCiAgICAgICAgICAgIG51bGwsIC8vIGRlc3Ryb3lIb29rczogRGVzdHJveUhvb2tEYXRhfG51bGwsCiAgICAgICAgICAgIG51bGwsIC8vIGNsZWFudXA6IGFueVtdfG51bGwsCiAgICAgICAgICAgIG51bGwsIC8vIGNvbnRlbnRRdWVyaWVzOiBudW1iZXJbXXxudWxsLAogICAgICAgICAgICBudWxsLCAvLyBjb21wb25lbnRzOiBudW1iZXJbXXxudWxsLAogICAgICAgICAgICB0eXBlb2YgZGlyZWN0aXZlcyA9PT0gJ2Z1bmN0aW9uJyA/CiAgICAgICAgICAgICAgICBkaXJlY3RpdmVzKCkgOgogICAgICAgICAgICAgICAgZGlyZWN0aXZlcywgLy8gZGlyZWN0aXZlUmVnaXN0cnk6IERpcmVjdGl2ZURlZkxpc3R8bnVsbCwKICAgICAgICAgICAgdHlwZW9mIHBpcGVzID09PSAnZnVuY3Rpb24nID8gcGlwZXMoKSA6IHBpcGVzLCAvLyBwaXBlUmVnaXN0cnk6IFBpcGVEZWZMaXN0fG51bGwsCiAgICAgICAgICAgIG51bGwsIC8vIGZpcnN0Q2hpbGQ6IFROb2RlfG51bGwsCiAgICAgICAgICAgIHNjaGVtYXMsIC8vIHNjaGVtYXM6IFNjaGVtYU1ldGFkYXRhW118bnVsbCwKICAgICAgICAgICAgY29uc3RzLCAvLyBjb25zdHM6IFRDb25zdGFudHN8bnVsbAogICAgICAgICAgICBmYWxzZSAvLyBpbmNvbXBsZXRlRmlyc3RQYXNzOiBib29sZWFuCiAgICAgICAgICAgICkgOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICAgICAgaWQ6IHZpZXdJbmRleCwKICAgICAgICAgICAgICAgIGJsdWVwcmludDogYmx1ZXByaW50LAogICAgICAgICAgICAgICAgdGVtcGxhdGU6IHRlbXBsYXRlRm4sCiAgICAgICAgICAgICAgICBxdWVyaWVzOiBudWxsLAogICAgICAgICAgICAgICAgdmlld1F1ZXJ5OiB2aWV3UXVlcnksCiAgICAgICAgICAgICAgICBub2RlOiAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLAogICAgICAgICAgICAgICAgZGF0YTogYmx1ZXByaW50LnNsaWNlKCkuZmlsbChudWxsLCBiaW5kaW5nU3RhcnRJbmRleCksCiAgICAgICAgICAgICAgICBiaW5kaW5nU3RhcnRJbmRleDogYmluZGluZ1N0YXJ0SW5kZXgsCiAgICAgICAgICAgICAgICBleHBhbmRvU3RhcnRJbmRleDogaW5pdGlhbFZpZXdMZW5ndGgsCiAgICAgICAgICAgICAgICBleHBhbmRvSW5zdHJ1Y3Rpb25zOiBudWxsLAogICAgICAgICAgICAgICAgZmlyc3RDcmVhdGVQYXNzOiB0cnVlLAogICAgICAgICAgICAgICAgZmlyc3RVcGRhdGVQYXNzOiB0cnVlLAogICAgICAgICAgICAgICAgc3RhdGljVmlld1F1ZXJpZXM6IGZhbHNlLAogICAgICAgICAgICAgICAgc3RhdGljQ29udGVudFF1ZXJpZXM6IGZhbHNlLAogICAgICAgICAgICAgICAgcHJlT3JkZXJIb29rczogbnVsbCwKICAgICAgICAgICAgICAgIHByZU9yZGVyQ2hlY2tIb29rczogbnVsbCwKICAgICAgICAgICAgICAgIGNvbnRlbnRIb29rczogbnVsbCwKICAgICAgICAgICAgICAgIGNvbnRlbnRDaGVja0hvb2tzOiBudWxsLAogICAgICAgICAgICAgICAgdmlld0hvb2tzOiBudWxsLAogICAgICAgICAgICAgICAgdmlld0NoZWNrSG9va3M6IG51bGwsCiAgICAgICAgICAgICAgICBkZXN0cm95SG9va3M6IG51bGwsCiAgICAgICAgICAgICAgICBjbGVhbnVwOiBudWxsLAogICAgICAgICAgICAgICAgY29udGVudFF1ZXJpZXM6IG51bGwsCiAgICAgICAgICAgICAgICBjb21wb25lbnRzOiBudWxsLAogICAgICAgICAgICAgICAgZGlyZWN0aXZlUmVnaXN0cnk6IHR5cGVvZiBkaXJlY3RpdmVzID09PSAnZnVuY3Rpb24nID8gZGlyZWN0aXZlcygpIDogZGlyZWN0aXZlcywKICAgICAgICAgICAgICAgIHBpcGVSZWdpc3RyeTogdHlwZW9mIHBpcGVzID09PSAnZnVuY3Rpb24nID8gcGlwZXMoKSA6IHBpcGVzLAogICAgICAgICAgICAgICAgZmlyc3RDaGlsZDogbnVsbCwKICAgICAgICAgICAgICAgIHNjaGVtYXM6IHNjaGVtYXMsCiAgICAgICAgICAgICAgICBjb25zdHM6IGNvbnN0cywKICAgICAgICAgICAgICAgIGluY29tcGxldGVGaXJzdFBhc3M6IGZhbHNlCiAgICAgICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYmluZGluZ1N0YXJ0SW5kZXgKICAgICAqIEBwYXJhbSB7P30gaW5pdGlhbFZpZXdMZW5ndGgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVZpZXdCbHVlcHJpbnQoYmluZGluZ1N0YXJ0SW5kZXgsIGluaXRpYWxWaWV3TGVuZ3RoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJsdWVwcmludCA9IG5nRGV2TW9kZSA/IG5ldyBMVmlld0JsdWVwcmludCgpIDogW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbml0aWFsVmlld0xlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGJsdWVwcmludC5wdXNoKGkgPCBiaW5kaW5nU3RhcnRJbmRleCA/IG51bGwgOiBOT19DSEFOR0UpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGJsdWVwcmludCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRleHQKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUVycm9yKHRleHQsIHRva2VuKSB7CiAgICAgICAgcmV0dXJuIG5ldyBFcnJvcihgUmVuZGVyZXI6ICR7dGV4dH0gWyR7c3RyaW5naWZ5Rm9yRXJyb3IodG9rZW4pfV1gKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSByRWxlbWVudAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50T3JTZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0SG9zdE5vZGVFeGlzdHMockVsZW1lbnQsIGVsZW1lbnRPclNlbGVjdG9yKSB7CiAgICAgICAgaWYgKCFyRWxlbWVudCkgewogICAgICAgICAgICBpZiAodHlwZW9mIGVsZW1lbnRPclNlbGVjdG9yID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgdGhyb3cgY3JlYXRlRXJyb3IoJ0hvc3Qgbm9kZSB3aXRoIHNlbGVjdG9yIG5vdCBmb3VuZDonLCBlbGVtZW50T3JTZWxlY3Rvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBjcmVhdGVFcnJvcignSG9zdCBub2RlIGlzIHJlcXVpcmVkOicsIGVsZW1lbnRPclNlbGVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTG9jYXRlcyB0aGUgaG9zdCBuYXRpdmUgZWxlbWVudCwgdXNlZCBmb3IgYm9vdHN0cmFwcGluZyBleGlzdGluZyBub2RlcyBpbnRvIHJlbmRlcmluZyBwaXBlbGluZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPclNlbGVjdG9yIFJlbmRlciBlbGVtZW50IG9yIENTUyBzZWxlY3RvciB0byBsb2NhdGUgdGhlIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gez99IGVuY2Fwc3VsYXRpb24gVmlldyBFbmNhcHN1bGF0aW9uIGRlZmluZWQgZm9yIGNvbXBvbmVudCB0aGF0IHJlcXVlc3RzIGhvc3QgZWxlbWVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvY2F0ZUhvc3RFbGVtZW50KHJlbmRlcmVyLCBlbGVtZW50T3JTZWxlY3RvciwgZW5jYXBzdWxhdGlvbikgewogICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBuYXRpdmUgU2hhZG93IERPTSwgZG8gbm90IGNsZWFyIGhvc3QgZWxlbWVudCB0byBhbGxvdyBuYXRpdmUgc2xvdCBwcm9qZWN0aW9uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlc2VydmVDb250ZW50ID0gZW5jYXBzdWxhdGlvbiA9PT0gVmlld0VuY2Fwc3VsYXRpb24kMS5TaGFkb3dEb207CiAgICAgICAgICAgIHJldHVybiByZW5kZXJlci5zZWxlY3RSb290RWxlbWVudChlbGVtZW50T3JTZWxlY3RvciwgcHJlc2VydmVDb250ZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByRWxlbWVudCA9IHR5cGVvZiBlbGVtZW50T3JTZWxlY3RvciA9PT0gJ3N0cmluZycgPwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIucXVlcnlTZWxlY3RvcihlbGVtZW50T3JTZWxlY3RvcikpKSA6CiAgICAgICAgICAgIGVsZW1lbnRPclNlbGVjdG9yOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRIb3N0Tm9kZUV4aXN0cyhyRWxlbWVudCwgZWxlbWVudE9yU2VsZWN0b3IpOwogICAgICAgIC8vIEFsd2F5cyBjbGVhciBob3N0IGVsZW1lbnQncyBjb250ZW50IHdoZW4gUmVuZGVyZXIzIGlzIGluIHVzZS4gRm9yIHByb2NlZHVyYWwgcmVuZGVyZXIgY2FzZSB3ZQogICAgICAgIC8vIG1ha2UgaXQgZGVwZW5kIG9uIHdoZXRoZXIgU2hhZG93RG9tIGVuY2Fwc3VsYXRpb24gaXMgdXNlZCAoaW4gd2hpY2ggY2FzZSB0aGUgY29udGVudCBzaG91bGQgYmUKICAgICAgICAvLyBwcmVzZXJ2ZWQgdG8gYWxsb3cgbmF0aXZlIHNsb3QgcHJvamVjdGlvbikuIFNoYWRvd0RvbSBlbmNhcHN1bGF0aW9uIHJlcXVpcmVzIHByb2NlZHVyYWwKICAgICAgICAvLyByZW5kZXJlciwgYW5kIHByb2NlZHVyYWwgcmVuZGVyZXIgY2FzZSBpcyBoYW5kbGVkIGFib3ZlLgogICAgICAgIHJFbGVtZW50LnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgcmV0dXJuIHJFbGVtZW50OwogICAgfQogICAgLyoqCiAgICAgKiBTYXZlcyBjb250ZXh0IGZvciB0aGlzIGNsZWFudXAgZnVuY3Rpb24gaW4gTFZpZXcuY2xlYW51cEluc3RhbmNlcy4KICAgICAqCiAgICAgKiBPbiB0aGUgZmlyc3QgdGVtcGxhdGUgcGFzcywgc2F2ZXMgaW4gVFZpZXc6CiAgICAgKiAtIENsZWFudXAgZnVuY3Rpb24KICAgICAqIC0gSW5kZXggb2YgY29udGV4dCB3ZSBqdXN0IHNhdmVkIGluIExWaWV3LmNsZWFudXBJbnN0YW5jZXMKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHBhcmFtIHs/fSBjbGVhbnVwRm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0b3JlQ2xlYW51cFdpdGhDb250ZXh0KHRWaWV3LCBsVmlldywgY29udGV4dCwgY2xlYW51cEZuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxDbGVhbnVwID0gZ2V0TENsZWFudXAobFZpZXcpOwogICAgICAgIGxDbGVhbnVwLnB1c2goY29udGV4dCk7CiAgICAgICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgICAgICBnZXRUVmlld0NsZWFudXAodFZpZXcpLnB1c2goY2xlYW51cEZuLCBsQ2xlYW51cC5sZW5ndGggLSAxKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNhdmVzIHRoZSBjbGVhbnVwIGZ1bmN0aW9uIGl0c2VsZiBpbiBMVmlldy5jbGVhbnVwSW5zdGFuY2VzLgogICAgICoKICAgICAqIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciBmdW5jdGlvbnMgdGhhdCBhcmUgd3JhcHBlZCB3aXRoIHRoZWlyIGNvbnRleHRzLCBsaWtlIGluIHJlbmRlcmVyMgogICAgICogbGlzdGVuZXJzLgogICAgICoKICAgICAqIE9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzLCB0aGUgaW5kZXggb2YgdGhlIGNsZWFudXAgZnVuY3Rpb24gaXMgc2F2ZWQgaW4gVFZpZXcuCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGNsZWFudXBGbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3RvcmVDbGVhbnVwRm4odFZpZXcsIGxWaWV3LCBjbGVhbnVwRm4pIHsKICAgICAgICBnZXRMQ2xlYW51cChsVmlldykucHVzaChjbGVhbnVwRm4pOwogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgZ2V0VFZpZXdDbGVhbnVwKHRWaWV3KS5wdXNoKCgvKiogQHR5cGUgez99ICovIChsVmlld1tDTEVBTlVQXSkpLmxlbmd0aCAtIDEsIG51bGwpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ29uc3RydWN0cyBhIFROb2RlIG9iamVjdCBmcm9tIHRoZSBhcmd1bWVudHMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0VmlldyBgVFZpZXdgIHRvIHdoaWNoIHRoaXMgYFROb2RlYCBiZWxvbmdzICh1c2VkIG9ubHkgaW4gYG5nRGV2TW9kZWApCiAgICAgKiBAcGFyYW0gez99IHRQYXJlbnQKICAgICAqIEBwYXJhbSB7P30gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbm9kZQogICAgICogQHBhcmFtIHs/fSBhZGp1c3RlZEluZGV4IFRoZSBpbmRleCBvZiB0aGUgVE5vZGUgaW4gVFZpZXcuZGF0YSwgYWRqdXN0ZWQgZm9yIEhFQURFUl9PRkZTRVQKICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZSBUaGUgdGFnIG5hbWUgb2YgdGhlIG5vZGUKICAgICAqIEBwYXJhbSB7P30gYXR0cnMgVGhlIGF0dHJpYnV0ZXMgZGVmaW5lZCBvbiB0aGlzIG5vZGUKICAgICAqIEByZXR1cm4gez99IHRoZSBUTm9kZSBvYmplY3QKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVE5vZGUodFZpZXcsIHRQYXJlbnQsIHR5cGUsIGFkanVzdGVkSW5kZXgsIHRhZ05hbWUsIGF0dHJzKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS50Tm9kZSsrOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5qZWN0b3JJbmRleCA9IHRQYXJlbnQgPyB0UGFyZW50LmluamVjdG9ySW5kZXggOiAtMTsKICAgICAgICByZXR1cm4gbmdEZXZNb2RlID8gbmV3IFROb2RlRGVidWcodFZpZXcsIC8vIHRWaWV3XzogVFZpZXcKICAgICAgICB0eXBlLCAvLyB0eXBlOiBUTm9kZVR5cGUKICAgICAgICBhZGp1c3RlZEluZGV4LCAvLyBpbmRleDogbnVtYmVyCiAgICAgICAgaW5qZWN0b3JJbmRleCwgLy8gaW5qZWN0b3JJbmRleDogbnVtYmVyCiAgICAgICAgLTEsIC8vIGRpcmVjdGl2ZVN0YXJ0OiBudW1iZXIKICAgICAgICAtMSwgLy8gZGlyZWN0aXZlRW5kOiBudW1iZXIKICAgICAgICAtMSwgLy8gZGlyZWN0aXZlU3R5bGluZ0xhc3Q6IG51bWJlcgogICAgICAgIG51bGwsIC8vIHByb3BlcnR5QmluZGluZ3M6IG51bWJlcltdfG51bGwKICAgICAgICAwLCAvLyBmbGFnczogVE5vZGVGbGFncwogICAgICAgIDAsIC8vIHByb3ZpZGVySW5kZXhlczogVE5vZGVQcm92aWRlckluZGV4ZXMKICAgICAgICB0YWdOYW1lLCAvLyB0YWdOYW1lOiBzdHJpbmd8bnVsbAogICAgICAgIGF0dHJzLCAvLyBhdHRyczogKHN0cmluZ3xBdHRyaWJ1dGVNYXJrZXJ8KHN0cmluZ3xTZWxlY3RvckZsYWdzKVtdKVtdfG51bGwKICAgICAgICBudWxsLCAvLyBtZXJnZWRBdHRycwogICAgICAgIG51bGwsIC8vIGxvY2FsTmFtZXM6IChzdHJpbmd8bnVtYmVyKVtdfG51bGwKICAgICAgICB1bmRlZmluZWQsIC8vIGluaXRpYWxJbnB1dHM6IChzdHJpbmdbXXxudWxsKVtdfG51bGx8dW5kZWZpbmVkCiAgICAgICAgbnVsbCwgLy8gaW5wdXRzOiBQcm9wZXJ0eUFsaWFzZXN8bnVsbAogICAgICAgIG51bGwsIC8vIG91dHB1dHM6IFByb3BlcnR5QWxpYXNlc3xudWxsCiAgICAgICAgbnVsbCwgLy8gdFZpZXdzOiBJVFZpZXd8SVRWaWV3W118bnVsbAogICAgICAgIG51bGwsIC8vIG5leHQ6IElUTm9kZXxudWxsCiAgICAgICAgbnVsbCwgLy8gcHJvamVjdGlvbk5leHQ6IElUTm9kZXxudWxsCiAgICAgICAgbnVsbCwgLy8gY2hpbGQ6IElUTm9kZXxudWxsCiAgICAgICAgdFBhcmVudCwgLy8gcGFyZW50OiBURWxlbWVudE5vZGV8VENvbnRhaW5lck5vZGV8bnVsbAogICAgICAgIG51bGwsIC8vIHByb2plY3Rpb246IG51bWJlcnwoSVROb2RlfFJOb2RlW10pW118bnVsbAogICAgICAgIG51bGwsIC8vIHN0eWxlczogc3RyaW5nfG51bGwKICAgICAgICBudWxsLCAvLyBzdHlsZXNXaXRob3V0SG9zdDogc3RyaW5nfG51bGwKICAgICAgICB1bmRlZmluZWQsIC8vIHJlc2lkdWFsU3R5bGVzOiBzdHJpbmd8bnVsbAogICAgICAgIG51bGwsIC8vIGNsYXNzZXM6IHN0cmluZ3xudWxsCiAgICAgICAgbnVsbCwgLy8gY2xhc3Nlc1dpdGhvdXRIb3N0OiBzdHJpbmd8bnVsbAogICAgICAgIHVuZGVmaW5lZCwgKC8qKiBAdHlwZSB7P30gKi8gKDApKSwgKC8qKiBAdHlwZSB7P30gKi8gKDApKSkgOgogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICAgICAgaW5kZXg6IGFkanVzdGVkSW5kZXgsCiAgICAgICAgICAgICAgICBpbmplY3RvckluZGV4OiBpbmplY3RvckluZGV4LAogICAgICAgICAgICAgICAgZGlyZWN0aXZlU3RhcnQ6IC0xLAogICAgICAgICAgICAgICAgZGlyZWN0aXZlRW5kOiAtMSwKICAgICAgICAgICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0OiAtMSwKICAgICAgICAgICAgICAgIHByb3BlcnR5QmluZGluZ3M6IG51bGwsCiAgICAgICAgICAgICAgICBmbGFnczogMCwKICAgICAgICAgICAgICAgIHByb3ZpZGVySW5kZXhlczogMCwKICAgICAgICAgICAgICAgIHRhZ05hbWU6IHRhZ05hbWUsCiAgICAgICAgICAgICAgICBhdHRyczogYXR0cnMsCiAgICAgICAgICAgICAgICBtZXJnZWRBdHRyczogbnVsbCwKICAgICAgICAgICAgICAgIGxvY2FsTmFtZXM6IG51bGwsCiAgICAgICAgICAgICAgICBpbml0aWFsSW5wdXRzOiB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICBpbnB1dHM6IG51bGwsCiAgICAgICAgICAgICAgICBvdXRwdXRzOiBudWxsLAogICAgICAgICAgICAgICAgdFZpZXdzOiBudWxsLAogICAgICAgICAgICAgICAgbmV4dDogbnVsbCwKICAgICAgICAgICAgICAgIHByb2plY3Rpb25OZXh0OiBudWxsLAogICAgICAgICAgICAgICAgY2hpbGQ6IG51bGwsCiAgICAgICAgICAgICAgICBwYXJlbnQ6IHRQYXJlbnQsCiAgICAgICAgICAgICAgICBwcm9qZWN0aW9uOiBudWxsLAogICAgICAgICAgICAgICAgc3R5bGVzOiBudWxsLAogICAgICAgICAgICAgICAgc3R5bGVzV2l0aG91dEhvc3Q6IG51bGwsCiAgICAgICAgICAgICAgICByZXNpZHVhbFN0eWxlczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgY2xhc3NlczogbnVsbCwKICAgICAgICAgICAgICAgIGNsYXNzZXNXaXRob3V0SG9zdDogbnVsbCwKICAgICAgICAgICAgICAgIHJlc2lkdWFsQ2xhc3NlczogdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgY2xhc3NCaW5kaW5nczogKC8qKiBAdHlwZSB7P30gKi8gKDApKSwKICAgICAgICAgICAgICAgIHN0eWxlQmluZGluZ3M6ICgvKiogQHR5cGUgez99ICovICgwKSksCiAgICAgICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5wdXRBbGlhc01hcAogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVEZWZJZHgKICAgICAqIEBwYXJhbSB7P30gcHJvcFN0b3JlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZW5lcmF0ZVByb3BlcnR5QWxpYXNlcyhpbnB1dEFsaWFzTWFwLCBkaXJlY3RpdmVEZWZJZHgsIHByb3BTdG9yZSkgewogICAgICAgIGZvciAobGV0IHB1YmxpY05hbWUgaW4gaW5wdXRBbGlhc01hcCkgewogICAgICAgICAgICBpZiAoaW5wdXRBbGlhc01hcC5oYXNPd25Qcm9wZXJ0eShwdWJsaWNOYW1lKSkgewogICAgICAgICAgICAgICAgcHJvcFN0b3JlID0gcHJvcFN0b3JlID09PSBudWxsID8ge30gOiBwcm9wU3RvcmU7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbnRlcm5hbE5hbWUgPSBpbnB1dEFsaWFzTWFwW3B1YmxpY05hbWVdOwogICAgICAgICAgICAgICAgaWYgKHByb3BTdG9yZS5oYXNPd25Qcm9wZXJ0eShwdWJsaWNOYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHByb3BTdG9yZVtwdWJsaWNOYW1lXS5wdXNoKGRpcmVjdGl2ZURlZklkeCwgaW50ZXJuYWxOYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIChwcm9wU3RvcmVbcHVibGljTmFtZV0gPSBbZGlyZWN0aXZlRGVmSWR4LCBpbnRlcm5hbE5hbWVdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJvcFN0b3JlOwogICAgfQogICAgLyoqCiAgICAgKiBJbml0aWFsaXplcyBkYXRhIHN0cnVjdHVyZXMgcmVxdWlyZWQgdG8gd29yayB3aXRoIGRpcmVjdGl2ZSBvdXRwdXRzIGFuZCBvdXRwdXRzLgogICAgICogSW5pdGlhbGl6YXRpb24gaXMgZG9uZSBmb3IgYWxsIGRpcmVjdGl2ZXMgbWF0Y2hlZCBvbiBhIGdpdmVuIFROb2RlLgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW5pdGlhbGl6ZUlucHV0QW5kT3V0cHV0QWxpYXNlcyh0VmlldywgdE5vZGUpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhcnQgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW5kID0gdE5vZGUuZGlyZWN0aXZlRW5kOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWZzID0gdFZpZXcuZGF0YTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGVBdHRycyA9IHROb2RlLmF0dHJzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnB1dHNGcm9tQXR0cnMgPSBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVJbml0aWFsSW5wdXRzKCkgOiBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlucHV0c1N0b3JlID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG91dHB1dHNTdG9yZSA9IG51bGw7CiAgICAgICAgZm9yIChsZXQgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmc1tpXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZUlucHV0cyA9IGRpcmVjdGl2ZURlZi5pbnB1dHM7CiAgICAgICAgICAgIC8vIERvIG5vdCB1c2UgdW5ib3VuZCBhdHRyaWJ1dGVzIGFzIGlucHV0cyB0byBzdHJ1Y3R1cmFsIGRpcmVjdGl2ZXMsIHNpbmNlIHN0cnVjdHVyYWwKICAgICAgICAgICAgLy8gZGlyZWN0aXZlIGlucHV0cyBjYW4gb25seSBiZSBzZXQgdXNpbmcgbWljcm9zeW50YXggKGUuZy4gYDxkaXYgKmRpcj0iZXhwIj5gKS4KICAgICAgICAgICAgLy8gVE9ETyhGVy0xOTMwKTogbWljcm9zeW50YXggZXhwcmVzc2lvbnMgbWF5IGFsc28gY29udGFpbiB1bmJvdW5kL3N0YXRpYyBhdHRyaWJ1dGVzLCB3aGljaAogICAgICAgICAgICAvLyBzaG91bGQgYmUgc2V0IGZvciBpbmxpbmUgdGVtcGxhdGVzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluaXRpYWxJbnB1dHMgPSAodE5vZGVBdHRycyAhPT0gbnVsbCAmJiAhaXNJbmxpbmVUZW1wbGF0ZSh0Tm9kZSkpID8KICAgICAgICAgICAgICAgIGdlbmVyYXRlSW5pdGlhbElucHV0cyhkaXJlY3RpdmVJbnB1dHMsIHROb2RlQXR0cnMpIDoKICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIGlucHV0c0Zyb21BdHRycy5wdXNoKGluaXRpYWxJbnB1dHMpOwogICAgICAgICAgICBpbnB1dHNTdG9yZSA9IGdlbmVyYXRlUHJvcGVydHlBbGlhc2VzKGRpcmVjdGl2ZUlucHV0cywgaSwgaW5wdXRzU3RvcmUpOwogICAgICAgICAgICBvdXRwdXRzU3RvcmUgPSBnZW5lcmF0ZVByb3BlcnR5QWxpYXNlcyhkaXJlY3RpdmVEZWYub3V0cHV0cywgaSwgb3V0cHV0c1N0b3JlKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlucHV0c1N0b3JlICE9PSBudWxsKSB7CiAgICAgICAgICAgIGlmIChpbnB1dHNTdG9yZS5oYXNPd25Qcm9wZXJ0eSgnY2xhc3MnKSkgewogICAgICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gMTYgLyogaGFzQ2xhc3NJbnB1dCAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaW5wdXRzU3RvcmUuaGFzT3duUHJvcGVydHkoJ3N0eWxlJykpIHsKICAgICAgICAgICAgICAgIHROb2RlLmZsYWdzIHw9IDMyIC8qIGhhc1N0eWxlSW5wdXQgKi87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdE5vZGUuaW5pdGlhbElucHV0cyA9IGlucHV0c0Zyb21BdHRyczsKICAgICAgICB0Tm9kZS5pbnB1dHMgPSBpbnB1dHNTdG9yZTsKICAgICAgICB0Tm9kZS5vdXRwdXRzID0gb3V0cHV0c1N0b3JlOwogICAgfQogICAgLyoqCiAgICAgKiBNYXBwaW5nIGJldHdlZW4gYXR0cmlidXRlcyBuYW1lcyB0aGF0IGRvbid0IGNvcnJlc3BvbmQgdG8gdGhlaXIgZWxlbWVudCBwcm9wZXJ0eSBuYW1lcy4KICAgICAqCiAgICAgKiBQZXJmb3JtYW5jZSBub3RlOiB0aGlzIGZ1bmN0aW9uIGlzIHdyaXR0ZW4gYXMgYSBzZXJpZXMgb2YgaWYgY2hlY2tzIChpbnN0ZWFkIG9mLCBzYXksIGEgcHJvcGVydHkKICAgICAqIG9iamVjdCBsb29rdXApIGZvciBwZXJmb3JtYW5jZSByZWFzb25zIC0gdGhlIHNlcmllcyBvZiBgaWZgIGNoZWNrcyBzZWVtcyB0byBiZSB0aGUgZmFzdGVzdCB3YXkgb2YKICAgICAqIG1hcHBpbmcgcHJvcGVydHkgbmFtZXMuIERvIE5PVCBjaGFuZ2Ugd2l0aG91dCBiZW5jaG1hcmtpbmcuCiAgICAgKgogICAgICogTm90ZTogdGhpcyBtYXBwaW5nIGhhcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgZXF1YWxseSBuYW1lZCBtYXBwaW5nIGluIHRoZSB0ZW1wbGF0ZQogICAgICogdHlwZS1jaGVja2luZyBtYWNoaW5lcnkgb2Ygbmd0c2MuCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcFByb3BOYW1lKG5hbWUpIHsKICAgICAgICBpZiAobmFtZSA9PT0gJ2NsYXNzJykKICAgICAgICAgICAgcmV0dXJuICdjbGFzc05hbWUnOwogICAgICAgIGlmIChuYW1lID09PSAnZm9yJykKICAgICAgICAgICAgcmV0dXJuICdodG1sRm9yJzsKICAgICAgICBpZiAobmFtZSA9PT0gJ2Zvcm1hY3Rpb24nKQogICAgICAgICAgICByZXR1cm4gJ2Zvcm1BY3Rpb24nOwogICAgICAgIGlmIChuYW1lID09PSAnaW5uZXJIdG1sJykKICAgICAgICAgICAgcmV0dXJuICdpbm5lckhUTUwnOwogICAgICAgIGlmIChuYW1lID09PSAncmVhZG9ubHknKQogICAgICAgICAgICByZXR1cm4gJ3JlYWRPbmx5JzsKICAgICAgICBpZiAobmFtZSA9PT0gJ3RhYmluZGV4JykKICAgICAgICAgICAgcmV0dXJuICd0YWJJbmRleCc7CiAgICAgICAgcmV0dXJuIG5hbWU7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IHNhbml0aXplcgogICAgICogQHBhcmFtIHs/fSBuYXRpdmVPbmx5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIHJlbmRlcmVyLCBzYW5pdGl6ZXIsIG5hdGl2ZU9ubHkpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm90U2FtZSh2YWx1ZSwgKC8qKiBAdHlwZSB7P30gKi8gKE5PX0NIQU5HRSkpLCAnSW5jb21pbmcgdmFsdWUgc2hvdWxkIG5ldmVyIGJlIE5PX0NIQU5HRS4nKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldykpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlucHV0RGF0YSA9IHROb2RlLmlucHV0czsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRhdGFWYWx1ZTsKICAgICAgICBpZiAoIW5hdGl2ZU9ubHkgJiYgaW5wdXREYXRhICE9IG51bGwgJiYgKGRhdGFWYWx1ZSA9IGlucHV0RGF0YVtwcm9wTmFtZV0pKSB7CiAgICAgICAgICAgIHNldElucHV0c0ZvclByb3BlcnR5KHRWaWV3LCBsVmlldywgZGF0YVZhbHVlLCBwcm9wTmFtZSwgdmFsdWUpOwogICAgICAgICAgICBpZiAoaXNDb21wb25lbnRIb3N0KHROb2RlKSkKICAgICAgICAgICAgICAgIG1hcmtEaXJ0eUlmT25QdXNoKGxWaWV3LCB0Tm9kZS5pbmRleCk7CiAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnRpZXMobFZpZXcsIGVsZW1lbnQsIHROb2RlLnR5cGUsIGRhdGFWYWx1ZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgICAgICBwcm9wTmFtZSA9IG1hcFByb3BOYW1lKHByb3BOYW1lKTsKICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAgICAgdmFsaWRhdGVBZ2FpbnN0RXZlbnRQcm9wZXJ0aWVzKHByb3BOYW1lKTsKICAgICAgICAgICAgICAgIGlmICghdmFsaWRhdGVQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGVsZW1lbnQsIHByb3BOYW1lLCB0Tm9kZSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gaGVyZSBzaW5jZSB3ZSBvbmx5IGxvZyB3YXJuaW5ncyBmb3IgdW5rbm93biBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgICAgIHdhcm5BYm91dFVua25vd25Qcm9wZXJ0eShwcm9wTmFtZSwgdE5vZGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5nRGV2TW9kZS5yZW5kZXJlclNldFByb3BlcnR5Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBzYW5pdGl6ZXIgaXMgb25seSBhZGRlZCB3aGVuIHRoZSBjb21waWxlciBkZXRlcm1pbmVzIHRoYXQgdGhlCiAgICAgICAgICAgIC8vIHByb3BlcnR5IGlzIHJpc2t5LCBzbyBzYW5pdGl6YXRpb24gY2FuIGJlIGRvbmUgd2l0aG91dCBmdXJ0aGVyIGNoZWNrcy4KICAgICAgICAgICAgdmFsdWUgPSBzYW5pdGl6ZXIgIT0gbnVsbCA/ICgoLyoqIEB0eXBlIHs/fSAqLyAoc2FuaXRpemVyKHZhbHVlLCB0Tm9kZS50YWdOYW1lIHx8ICcnLCBwcm9wTmFtZSkpKSkgOiB2YWx1ZTsKICAgICAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkgewogICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0UHJvcGVydHkoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSwgcHJvcE5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghaXNBbmltYXRpb25Qcm9wKHByb3BOYW1lKSkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnNldFByb3BlcnR5ID8gKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnNldFByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSkgOgogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKVtwcm9wTmFtZV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLykgewogICAgICAgICAgICAvLyBJZiB0aGUgbm9kZSBpcyBhIGNvbnRhaW5lciBhbmQgdGhlIHByb3BlcnR5IGRpZG4ndAogICAgICAgICAgICAvLyBtYXRjaCBhbnkgb2YgdGhlIGlucHV0cyBvciBzY2hlbWFzIHdlIHNob3VsZCB0aHJvdy4KICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiAhbWF0Y2hpbmdTY2hlbWFzKHRWaWV3LCBsVmlldywgdE5vZGUudGFnTmFtZSkpIHsKICAgICAgICAgICAgICAgIHdhcm5BYm91dFVua25vd25Qcm9wZXJ0eShwcm9wTmFtZSwgdE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJZiBub2RlIGlzIGFuIE9uUHVzaCBjb21wb25lbnQsIG1hcmtzIGl0cyBMVmlldyBkaXJ0eS4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdmlld0luZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXJrRGlydHlJZk9uUHVzaChsVmlldywgdmlld0luZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGxWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY2hpbGRDb21wb25lbnRMVmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh2aWV3SW5kZXgsIGxWaWV3KTsKICAgICAgICBpZiAoIShjaGlsZENvbXBvbmVudExWaWV3W0ZMQUdTXSAmIDE2IC8qIENoZWNrQWx3YXlzICovKSkgewogICAgICAgICAgICBjaGlsZENvbXBvbmVudExWaWV3W0ZMQUdTXSB8PSA2NCAvKiBEaXJ0eSAqLzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXROZ1JlZmxlY3RQcm9wZXJ0eShsVmlldywgZWxlbWVudCwgdHlwZSwgYXR0ck5hbWUsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgICAgIGF0dHJOYW1lID0gbm9ybWFsaXplRGVidWdCaW5kaW5nTmFtZShhdHRyTmFtZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlYnVnVmFsdWUgPSBub3JtYWxpemVEZWJ1Z0JpbmRpbmdWYWx1ZSh2YWx1ZSk7CiAgICAgICAgaWYgKHR5cGUgPT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKSwgYXR0ck5hbWUpIDoKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSkucmVtb3ZlQXR0cmlidXRlKGF0dHJOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSA/CiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIuc2V0QXR0cmlidXRlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKSwgYXR0ck5hbWUsIGRlYnVnVmFsdWUpIDoKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSkuc2V0QXR0cmlidXRlKGF0dHJOYW1lLCBkZWJ1Z1ZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0Q29udGVudCA9IGBiaW5kaW5ncz0ke0pTT04uc3RyaW5naWZ5KHsgW2F0dHJOYW1lXTogZGVidWdWYWx1ZSB9LCBudWxsLCAyKX1gOwogICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRWYWx1ZSgoKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnQpKSksIHRleHRDb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudCkpKS50ZXh0Q29udGVudCA9IHRleHRDb250ZW50OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBkYXRhVmFsdWUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldE5nUmVmbGVjdFByb3BlcnRpZXMobFZpZXcsIGVsZW1lbnQsIHR5cGUsIGRhdGFWYWx1ZSwgdmFsdWUpIHsKICAgICAgICBpZiAodHlwZSA9PT0gMyAvKiBFbGVtZW50ICovIHx8IHR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBkYXRhVmFsdWUgaXMgYW4gYXJyYXkgY29udGFpbmluZyBydW50aW1lIGlucHV0IG9yIG91dHB1dCBuYW1lcyBmb3IgdGhlIGRpcmVjdGl2ZXM6CiAgICAgICAgICAgICAqIGkrMDogZGlyZWN0aXZlIGluc3RhbmNlIGluZGV4CiAgICAgICAgICAgICAqIGkrMTogcHJpdmF0ZU5hbWUKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogZS5nLiBbMCwgJ2NoYW5nZScsICdjaGFuZ2UtbWluaWZpZWQnXQogICAgICAgICAgICAgKiB3ZSB3YW50IHRvIHNldCB0aGUgcmVmbGVjdGVkIHByb3BlcnR5IHdpdGggdGhlIHByaXZhdGVOYW1lOiBkYXRhVmFsdWVbaSsxXQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhVmFsdWUubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBlbGVtZW50LCB0eXBlLCAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVZhbHVlW2kgKyAxXSkpLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZQogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmFsaWRhdGVQcm9wZXJ0eSh0VmlldywgbFZpZXcsIGVsZW1lbnQsIHByb3BOYW1lLCB0Tm9kZSkgewogICAgICAgIC8vIElmIGBzY2hlbWFzYCBpcyBzZXQgdG8gYG51bGxgLCB0aGF0J3MgYW4gaW5kaWNhdGlvbiB0aGF0IHRoaXMgQ29tcG9uZW50IHdhcyBjb21waWxlZCBpbiBBT1QKICAgICAgICAvLyBtb2RlIHdoZXJlIHRoaXMgY2hlY2sgaGFwcGVucyBhdCBjb21waWxlIHRpbWUuIEluIEpJVCBtb2RlLCBgc2NoZW1hc2AgaXMgYWx3YXlzIHByZXNlbnQgYW5kCiAgICAgICAgLy8gZGVmaW5lZCBhcyBhbiBhcnJheSAoYXMgYW4gZW1wdHkgYXJyYXkgaW4gY2FzZSBgc2NoZW1hc2AgZmllbGQgaXMgbm90IGRlZmluZWQpIGFuZCB3ZSBzaG91bGQKICAgICAgICAvLyBleGVjdXRlIHRoZSBjaGVjayBiZWxvdy4KICAgICAgICBpZiAodFZpZXcuc2NoZW1hcyA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgLy8gVGhlIHByb3BlcnR5IGlzIGNvbnNpZGVyZWQgdmFsaWQgaWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyB0aGUgc2NoZW1hLCBpdCBleGlzdHMgb24gdGhlIGVsZW1lbnQKICAgICAgICAvLyBvciBpdCBpcyBzeW50aGV0aWMsIGFuZCB3ZSBhcmUgaW4gYSBicm93c2VyIGNvbnRleHQgKHdlYiB3b3JrZXIgbm9kZXMgc2hvdWxkIGJlIHNraXBwZWQpLgogICAgICAgIGlmIChtYXRjaGluZ1NjaGVtYXModFZpZXcsIGxWaWV3LCB0Tm9kZS50YWdOYW1lKSB8fCBwcm9wTmFtZSBpbiBlbGVtZW50IHx8CiAgICAgICAgICAgIGlzQW5pbWF0aW9uUHJvcChwcm9wTmFtZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8vIE5vdGU6IGB0eXBlb2YgTm9kZWAgcmV0dXJucyAnZnVuY3Rpb24nIGluIG1vc3QgYnJvd3NlcnMsIGJ1dCBvbiBJRSBpdCBpcyAnb2JqZWN0JyBzbyB3ZQogICAgICAgIC8vIG5lZWQgdG8gYWNjb3VudCBmb3IgYm90aCBoZXJlLCB3aGlsZSBiZWluZyBjYXJlZnVsIGZvciBgdHlwZW9mIG51bGxgIGFsc28gcmV0dXJuaW5nICdvYmplY3QnLgogICAgICAgIHJldHVybiB0eXBlb2YgTm9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgTm9kZSA9PT0gbnVsbCB8fCAhKGVsZW1lbnQgaW5zdGFuY2VvZiBOb2RlKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSB0YWdOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXRjaGluZ1NjaGVtYXModFZpZXcsIGxWaWV3LCB0YWdOYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjaGVtYXMgPSB0Vmlldy5zY2hlbWFzOwogICAgICAgIGlmIChzY2hlbWFzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2NoZW1hcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2NoZW1hID0gc2NoZW1hc1tpXTsKICAgICAgICAgICAgICAgIGlmIChzY2hlbWEgPT09IE5PX0VSUk9SU19TQ0hFTUEgfHwKICAgICAgICAgICAgICAgICAgICBzY2hlbWEgPT09IENVU1RPTV9FTEVNRU5UU19TQ0hFTUEgJiYgdGFnTmFtZSAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBMb2dzIGEgd2FybmluZyB0aGF0IGEgcHJvcGVydHkgaXMgbm90IHN1cHBvcnRlZCBvbiBhbiBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHRoZSBpbnZhbGlkIHByb3BlcnR5LgogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBOb2RlIG9uIHdoaWNoIHdlIGVuY291bnRlcmVkIHRoZSBwcm9wZXJ0eS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdhcm5BYm91dFVua25vd25Qcm9wZXJ0eShwcm9wTmFtZSwgdE5vZGUpIHsKICAgICAgICBjb25zb2xlLndhcm4oYENhbid0IGJpbmQgdG8gJyR7cHJvcE5hbWV9JyBzaW5jZSBpdCBpc24ndCBhIGtub3duIHByb3BlcnR5IG9mICcke3ROb2RlLnRhZ05hbWV9Jy5gKTsKICAgIH0KICAgIC8qKgogICAgICogSW5zdGFudGlhdGUgYSByb290IGNvbXBvbmVudC4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW5zdGFudGlhdGVSb290Q29tcG9uZW50KHRWaWV3LCBsVmlldywgZGVmKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgaWYgKGRlZi5wcm92aWRlcnNSZXNvbHZlcikKICAgICAgICAgICAgICAgIGRlZi5wcm92aWRlcnNSZXNvbHZlcihkZWYpOwogICAgICAgICAgICBnZW5lcmF0ZUV4cGFuZG9JbnN0cnVjdGlvbkJsb2NrKHRWaWV3LCByb290VE5vZGUsIDEpOwogICAgICAgICAgICBiYXNlUmVzb2x2ZURpcmVjdGl2ZSh0VmlldywgbFZpZXcsIGRlZik7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmUgPSBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgdFZpZXcsIGxWaWV3Lmxlbmd0aCAtIDEsICgvKiogQHR5cGUgez99ICovIChyb290VE5vZGUpKSk7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGRpcmVjdGl2ZSwgbFZpZXcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmUgPSBnZXROYXRpdmVCeVROb2RlKHJvb3RUTm9kZSwgbFZpZXcpOwogICAgICAgIGlmIChuYXRpdmUpIHsKICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGlyZWN0aXZlOwogICAgfQogICAgLyoqCiAgICAgKiBSZXNvbHZlIHRoZSBtYXRjaGVkIGRpcmVjdGl2ZXMgb24gYSBub2RlLgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBsb2NhbFJlZnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVEaXJlY3RpdmVzKHRWaWV3LCBsVmlldywgdE5vZGUsIGxvY2FsUmVmcykgewogICAgICAgIC8vIFBsZWFzZSBtYWtlIHN1cmUgdG8gaGF2ZSBleHBsaWNpdCB0eXBlIGZvciBgZXhwb3J0c01hcGAuIEluZmVycmVkIHR5cGUgdHJpZ2dlcnMgYnVnIGluCiAgICAgICAgLy8gdHNpY2tsZS4KICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGhhc0RpcmVjdGl2ZXMgPSBmYWxzZTsKICAgICAgICBpZiAoZ2V0QmluZGluZ3NFbmFibGVkKCkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVEZWZzID0gZmluZERpcmVjdGl2ZURlZk1hdGNoZXModFZpZXcsIGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhwb3J0c01hcCA9IGxvY2FsUmVmcyA9PT0gbnVsbCA/IG51bGwgOiB7ICcnOiAtMSB9OwogICAgICAgICAgICBpZiAoZGlyZWN0aXZlRGVmcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHRvdGFsRGlyZWN0aXZlSG9zdFZhcnMgPSAwOwogICAgICAgICAgICAgICAgaGFzRGlyZWN0aXZlcyA9IHRydWU7CiAgICAgICAgICAgICAgICBpbml0VE5vZGVGbGFncyh0Tm9kZSwgdFZpZXcuZGF0YS5sZW5ndGgsIGRpcmVjdGl2ZURlZnMubGVuZ3RoKTsKICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHNhbWUgdG9rZW4gaXMgcHJvdmlkZWQgYnkgc2V2ZXJhbCBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lIG5vZGUsIHNvbWUgcnVsZXMgYXBwbHkgaW4KICAgICAgICAgICAgICAgIC8vIHRoZSB2aWV3RW5naW5lOgogICAgICAgICAgICAgICAgLy8gLSB2aWV3UHJvdmlkZXJzIGhhdmUgcHJpb3JpdHkgb3ZlciBwcm92aWRlcnMKICAgICAgICAgICAgICAgIC8vIC0gdGhlIGxhc3QgZGlyZWN0aXZlIGluIE5nTW9kdWxlLmRlY2xhcmF0aW9ucyBoYXMgcHJpb3JpdHkgb3ZlciB0aGUgcHJldmlvdXMgb25lCiAgICAgICAgICAgICAgICAvLyBTbyB0byBtYXRjaCB0aGVzZSBydWxlcywgdGhlIG9yZGVyIGluIHdoaWNoIHByb3ZpZGVycyBhcmUgYWRkZWQgaW4gdGhlIGFycmF5cyBpcyB2ZXJ5CiAgICAgICAgICAgICAgICAvLyBpbXBvcnRhbnQuCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRpcmVjdGl2ZURlZnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVmID0gZGlyZWN0aXZlRGVmc1tpXTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVmLnByb3ZpZGVyc1Jlc29sdmVyKQogICAgICAgICAgICAgICAgICAgICAgICBkZWYucHJvdmlkZXJzUmVzb2x2ZXIoZGVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGdlbmVyYXRlRXhwYW5kb0luc3RydWN0aW9uQmxvY2sodFZpZXcsIHROb2RlLCBkaXJlY3RpdmVEZWZzLmxlbmd0aCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcHJlT3JkZXJIb29rc0ZvdW5kID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcHJlT3JkZXJDaGVja0hvb2tzRm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGlyZWN0aXZlRGVmcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWYgPSBkaXJlY3RpdmVEZWZzW2ldOwogICAgICAgICAgICAgICAgICAgIC8vIE1lcmdlIHRoZSBhdHRycyBpbiB0aGUgb3JkZXIgb2YgbWF0Y2hlcy4gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGZpcnN0IGRpcmVjdGl2ZSBpcyB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgaXRzZWxmLCBzbyB0aGF0IHRoZSBjb21wb25lbnQgaGFzIHRoZSBsZWFzdCBwcmlvcml0eS4KICAgICAgICAgICAgICAgICAgICB0Tm9kZS5tZXJnZWRBdHRycyA9IG1lcmdlSG9zdEF0dHJzKHROb2RlLm1lcmdlZEF0dHJzLCBkZWYuaG9zdEF0dHJzKTsKICAgICAgICAgICAgICAgICAgICBiYXNlUmVzb2x2ZURpcmVjdGl2ZSh0VmlldywgbFZpZXcsIGRlZik7CiAgICAgICAgICAgICAgICAgICAgc2F2ZU5hbWVUb0V4cG9ydE1hcCgoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YSkpLmxlbmd0aCAtIDEsIGRlZiwgZXhwb3J0c01hcCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZi5jb250ZW50UXVlcmllcyAhPT0gbnVsbCkKICAgICAgICAgICAgICAgICAgICAgICAgdE5vZGUuZmxhZ3MgfD0gOCAvKiBoYXNDb250ZW50UXVlcnkgKi87CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlZi5ob3N0QmluZGluZ3MgIT09IG51bGwgfHwgZGVmLmhvc3RBdHRycyAhPT0gbnVsbCB8fCBkZWYuaG9zdFZhcnMgIT09IDApCiAgICAgICAgICAgICAgICAgICAgICAgIHROb2RlLmZsYWdzIHw9IDEyOCAvKiBoYXNIb3N0QmluZGluZ3MgKi87CiAgICAgICAgICAgICAgICAgICAgLy8gT25seSBwdXNoIGEgbm9kZSBpbmRleCBpbnRvIHRoZSBwcmVPcmRlckhvb2tzIGFycmF5IGlmIHRoaXMgaXMgdGhlIGZpcnN0CiAgICAgICAgICAgICAgICAgICAgLy8gcHJlLW9yZGVyIGhvb2sgZm91bmQgb24gdGhpcyBub2RlLgogICAgICAgICAgICAgICAgICAgIGlmICghcHJlT3JkZXJIb29rc0ZvdW5kICYmIChkZWYub25DaGFuZ2VzIHx8IGRlZi5vbkluaXQgfHwgZGVmLmRvQ2hlY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgcHVzaCB0aGUgYWN0dWFsIGhvb2sgZnVuY3Rpb24gaW50byB0aGlzIGFycmF5IGxhdGVyIGR1cmluZyBkaXIgaW5zdGFudGlhdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGRvIGl0IG5vdyBiZWNhdXNlIHdlIG11c3QgZW5zdXJlIGhvb2tzIGFyZSByZWdpc3RlcmVkIGluIHRoZSBzYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yZGVyIHRoYXQgZGlyZWN0aXZlcyBhcmUgY3JlYXRlZCAoaS5lLiBpbmplY3Rpb24gb3JkZXIpLgogICAgICAgICAgICAgICAgICAgICAgICAodFZpZXcucHJlT3JkZXJIb29rcyB8fCAodFZpZXcucHJlT3JkZXJIb29rcyA9IFtdKSkucHVzaCh0Tm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmVPcmRlckhvb2tzRm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXByZU9yZGVyQ2hlY2tIb29rc0ZvdW5kICYmIChkZWYub25DaGFuZ2VzIHx8IGRlZi5kb0NoZWNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICAodFZpZXcucHJlT3JkZXJDaGVja0hvb2tzIHx8ICh0Vmlldy5wcmVPcmRlckNoZWNrSG9va3MgPSBbXSkpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAucHVzaCh0Tm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmVPcmRlckNoZWNrSG9va3NGb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGFkZEhvc3RCaW5kaW5nc1RvRXhwYW5kb0luc3RydWN0aW9ucyh0VmlldywgZGVmKTsKICAgICAgICAgICAgICAgICAgICB0b3RhbERpcmVjdGl2ZUhvc3RWYXJzICs9IGRlZi5ob3N0VmFyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluaXRpYWxpemVJbnB1dEFuZE91dHB1dEFsaWFzZXModFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgICAgIGdyb3dIb3N0VmFyc1NwYWNlKHRWaWV3LCBsVmlldywgdG90YWxEaXJlY3RpdmVIb3N0VmFycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGV4cG9ydHNNYXApCiAgICAgICAgICAgICAgICBjYWNoZU1hdGNoaW5nTG9jYWxOYW1lcyh0Tm9kZSwgbG9jYWxSZWZzLCBleHBvcnRzTWFwKTsKICAgICAgICB9CiAgICAgICAgLy8gTWVyZ2UgdGhlIHRlbXBsYXRlIGF0dHJzIGxhc3Qgc28gdGhhdCB0aGV5IGhhdmUgdGhlIGhpZ2hlc3QgcHJpb3JpdHkuCiAgICAgICAgdE5vZGUubWVyZ2VkQXR0cnMgPSBtZXJnZUhvc3RBdHRycyh0Tm9kZS5tZXJnZWRBdHRycywgdE5vZGUuYXR0cnMpOwogICAgICAgIHJldHVybiBoYXNEaXJlY3RpdmVzOwogICAgfQogICAgLyoqCiAgICAgKiBBZGQgYGhvc3RCaW5kaW5nc2AgdG8gdGhlIGBUVmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zYC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2AgdG8gd2hpY2ggdGhlIGBob3N0QmluZGluZ3NgIHNob3VsZCBiZSBhZGRlZC4KICAgICAqIEBwYXJhbSB7P30gZGVmIGBDb21wb25lbnREZWZgL2BEaXJlY3RpdmVEZWZgLCB3aGljaCBjb250YWlucyB0aGUgYGhvc3RWYXJzYC9gaG9zdEJpbmRpbmdzYCB0byBhZGQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRIb3N0QmluZGluZ3NUb0V4cGFuZG9JbnN0cnVjdGlvbnModFZpZXcsIGRlZikgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdENyZWF0ZVBhc3ModFZpZXcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleHBhbmRvID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMpKTsKICAgICAgICAvLyBUT0RPKG1pc2tvKTogUEVSRiB3ZSBhcmUgYWRkaW5nIGBob3N0QmluZGluZ3NgIGV2ZW4gaWYgdGhlcmUgaXMgbm90aGluZyB0byBhZGQhIFRoaXMgaXMKICAgICAgICAvLyBzdWJvcHRpbWFsIGZvciBwZXJmb3JtYW5jZS4gYGRlZi5ob3N0QmluZGluZ3NgIG1heSBiZSBudWxsLAogICAgICAgIC8vIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIHB1c2ggbnVsbCB0byB0aGUgYXJyYXkgYXMgYSBwbGFjZWhvbGRlcgogICAgICAgIC8vIHRvIGVuc3VyZSB0aGUgZGlyZWN0aXZlIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgKHNvIGhvc3QKICAgICAgICAvLyBiaW5kaW5nIGZ1bmN0aW9ucyBhbHdheXMgbGluZSB1cCB3aXRoIHRoZSBjb3JyZWN0aXZlIGRpcmVjdGl2ZSkuCiAgICAgICAgLy8gVGhpcyBpcyBzdWJvcHRpbWFsIGZvciBwZXJmb3JtYW5jZS4gU2VlIGBjdXJyZW50RGlyZWN0aXZlSW5kZXhgCiAgICAgICAgLy8gIGNvbW1lbnQgaW4gYHNldEhvc3RCaW5kaW5nc0J5RXhlY3V0aW5nRXhwYW5kb0luc3RydWN0aW9uc2AgZm9yIG1vcmUKICAgICAgICAvLyBkZXRhaWxzLiAgZXhwYW5kby5wdXNoKGRlZi5ob3N0QmluZGluZ3MpOwogICAgICAgIGV4cGFuZG8ucHVzaChkZWYuaG9zdEJpbmRpbmdzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9zdFZhcnMgPSBkZWYuaG9zdFZhcnM7CiAgICAgICAgaWYgKGhvc3RWYXJzICE9PSAwKSB7CiAgICAgICAgICAgIGV4cGFuZG8ucHVzaChkZWYuaG9zdFZhcnMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR3JvdyB0aGUgYExWaWV3YCwgYmx1ZXByaW50IGFuZCBgVFZpZXcuZGF0YWAgdG8gYWNjb21tb2RhdGUgdGhlIGBob3N0QmluZGluZ3NgLgogICAgICoKICAgICAqIFRvIHN1cHBvcnQgbG9jYWxpdHkgd2UgZG9uJ3Qga25vdyBhaGVhZCBvZiB0aW1lIGhvdyBtYW55IGBob3N0VmFyc2Agb2YgdGhlIGNvbnRhaW5pbmcgZGlyZWN0aXZlcwogICAgICogd2UgbmVlZCB0byBhbGxvY2F0ZS4gRm9yIHRoaXMgcmVhc29uIHdlIGFsbG93IGdyb3dpbmcgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGFzIHdlIGRpc2NvdmVyIG1vcmUKICAgICAqIGRpcmVjdGl2ZXMgdG8gYWNjb21tb2RhdGUgdGhlbS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3IGBUVmlld2Agd2hpY2ggbmVlZHMgdG8gYmUgZ3Jvd24uCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2Agd2hpY2ggbmVlZHMgdG8gYmUgZ3Jvd24uCiAgICAgKiBAcGFyYW0gez99IGNvdW50IFNpemUgYnkgd2hpY2ggd2UgbmVlZCB0byBncm93IHRoZSBkYXRhIHN0cnVjdHVyZXMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBncm93SG9zdFZhcnNTcGFjZSh0VmlldywgbFZpZXcsIGNvdW50KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydFNhbWUodFZpZXcsIGxWaWV3W1RWSUVXXSwgJ2BMVmlld2AgbXVzdCBiZSBhc3NvY2lhdGVkIHdpdGggYFRWaWV3YCEnKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKICAgICAgICAgICAgbFZpZXcucHVzaChOT19DSEFOR0UpOwogICAgICAgICAgICB0Vmlldy5ibHVlcHJpbnQucHVzaChOT19DSEFOR0UpOwogICAgICAgICAgICB0Vmlldy5kYXRhLnB1c2gobnVsbCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJbnN0YW50aWF0ZSBhbGwgdGhlIGRpcmVjdGl2ZXMgdGhhdCB3ZXJlIHByZXZpb3VzbHkgcmVzb2x2ZWQgb24gdGhlIGN1cnJlbnQgbm9kZS4KICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gbmF0aXZlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZUFsbERpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgbmF0aXZlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgICAgICBpZiAoIXRWaWV3LmZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgICAgICBnZXRPckNyZWF0ZU5vZGVJbmplY3RvckZvck5vZGUodE5vZGUsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbml0aWFsSW5wdXRzID0gdE5vZGUuaW5pdGlhbElucHV0czsKICAgICAgICBmb3IgKGxldCBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZiA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2ldKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNDb21wb25lbnQgPSBpc0NvbXBvbmVudERlZihkZWYpOwogICAgICAgICAgICBpZiAoaXNDb21wb25lbnQpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgICAgICAgICAgYWRkQ29tcG9uZW50TG9naWMobFZpZXcsICgvKiogQHR5cGUgez99ICovICh0Tm9kZSkpLCAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyZWN0aXZlID0gZ2V0Tm9kZUluamVjdGFibGUobFZpZXcsIHRWaWV3LCBpLCB0Tm9kZSk7CiAgICAgICAgICAgIGF0dGFjaFBhdGNoRGF0YShkaXJlY3RpdmUsIGxWaWV3KTsKICAgICAgICAgICAgaWYgKGluaXRpYWxJbnB1dHMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHNldElucHV0c0Zyb21BdHRycyhsVmlldywgaSAtIHN0YXJ0LCBkaXJlY3RpdmUsIGRlZiwgdE5vZGUsICgvKiogQHR5cGUgez99ICovIChpbml0aWFsSW5wdXRzKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh0Tm9kZS5pbmRleCwgbFZpZXcpOwogICAgICAgICAgICAgICAgY29tcG9uZW50Vmlld1tDT05URVhUXSA9IGRpcmVjdGl2ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW52b2tlRGlyZWN0aXZlc0hvc3RCaW5kaW5ncyh0VmlldywgbFZpZXcsIHROb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0YXJ0ID0gdE5vZGUuZGlyZWN0aXZlU3RhcnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVuZCA9IHROb2RlLmRpcmVjdGl2ZUVuZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXhwYW5kbyA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5leHBhbmRvSW5zdHJ1Y3Rpb25zKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpcnN0Q3JlYXRlUGFzcyA9IHRWaWV3LmZpcnN0Q3JlYXRlUGFzczsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudEluZGV4ID0gdE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50RGlyZWN0aXZlSW5kZXggPSBnZXRDdXJyZW50RGlyZWN0aXZlSW5kZXgoKTsKICAgICAgICB0cnkgewogICAgICAgICAgICBzZXRTZWxlY3RlZEluZGV4KGVsZW1lbnRJbmRleCk7CiAgICAgICAgICAgIGZvciAobGV0IGRpckluZGV4ID0gc3RhcnQ7IGRpckluZGV4IDwgZW5kOyBkaXJJbmRleCsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtkaXJJbmRleF0pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZSA9IGxWaWV3W2RpckluZGV4XTsKICAgICAgICAgICAgICAgIHNldEN1cnJlbnREaXJlY3RpdmVJbmRleChkaXJJbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoZGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCB8fCBkZWYuaG9zdFZhcnMgIT09IDAgfHwgZGVmLmhvc3RBdHRycyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGludm9rZUhvc3RCaW5kaW5nc0luQ3JlYXRpb25Nb2RlKGRlZiwgZGlyZWN0aXZlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGZpcnN0Q3JlYXRlUGFzcykgewogICAgICAgICAgICAgICAgICAgIGV4cGFuZG8ucHVzaChudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgc2V0U2VsZWN0ZWRJbmRleCgtMSk7CiAgICAgICAgICAgIHNldEN1cnJlbnREaXJlY3RpdmVJbmRleChjdXJyZW50RGlyZWN0aXZlSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogSW52b2tlIHRoZSBob3N0IGJpbmRpbmdzIGluIGNyZWF0aW9uIG1vZGUuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBkZWYgYERpcmVjdGl2ZURlZmAgd2hpY2ggbWF5IGNvbnRhaW4gdGhlIGBob3N0QmluZGluZ3NgIGZ1bmN0aW9uLgogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmUgSW5zdGFuY2Ugb2YgZGlyZWN0aXZlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW52b2tlSG9zdEJpbmRpbmdzSW5DcmVhdGlvbk1vZGUoZGVmLCBkaXJlY3RpdmUpIHsKICAgICAgICBpZiAoZGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLmhvc3RCaW5kaW5ncykpKDEgLyogQ3JlYXRlICovLCBkaXJlY3RpdmUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2VuZXJhdGVzIGEgbmV3IGJsb2NrIGluIFRWaWV3LmV4cGFuZG9JbnN0cnVjdGlvbnMgZm9yIHRoaXMgbm9kZS4KICAgICAqCiAgICAgKiBFYWNoIGV4cGFuZG8gYmxvY2sgc3RhcnRzIHdpdGggdGhlIGVsZW1lbnQgaW5kZXggKHR1cm5lZCBuZWdhdGl2ZSBzbyB3ZSBjYW4gZGlzdGluZ3Vpc2gKICAgICAqIGl0IGZyb20gdGhlIGhvc3RWYXIgY291bnQpIGFuZCB0aGUgZGlyZWN0aXZlIGNvdW50LiBTZWUgbW9yZSBpbiBWSUVXX0RBVEEubWQuCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUNvdW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZW5lcmF0ZUV4cGFuZG9JbnN0cnVjdGlvbkJsb2NrKHRWaWV3LCB0Tm9kZSwgZGlyZWN0aXZlQ291bnQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0RXF1YWwodFZpZXcuZmlyc3RDcmVhdGVQYXNzLCB0cnVlLCAnRXhwYW5kbyBibG9jayBzaG91bGQgb25seSBiZSBnZW5lcmF0ZWQgb24gZmlyc3QgY3JlYXRlIHBhc3MuJyk7CiAgICAgICAgLy8gSW1wb3J0YW50OiBJbiBKUyBgLXhgIGFuZCBgMC14YCBpcyBub3QgdGhlIHNhbWUhIElmIGB4PT09MGAgdGhlbiBgLXhgIHdpbGwgcHJvZHVjZSBgLTBgIHdoaWNoCiAgICAgICAgLy8gcmVxdWlyZXMgbm9uIHN0YW5kYXJkIG1hdGggYXJpdGhtZXRpYyBhbmQgaXQgY2FuIHByZXZlbnQgVk0gb3B0aW1pemF0aW9ucy4KICAgICAgICAvLyBgMC0wYCB3aWxsIGFsd2F5cyBwcm9kdWNlIGAwYCBhbmQgd2lsbCBub3QgY2F1c2UgYSBwb3RlbnRpYWwgZGVvcHRpbWl6YXRpb24gaW4gVk0uCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IEhFQURFUl9PRkZTRVQgLSB0Tm9kZS5pbmRleDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvdmlkZXJTdGFydEluZGV4ID0gdE5vZGUucHJvdmlkZXJJbmRleGVzICYgNjU1MzUgLyogUHJvdmlkZXJzU3RhcnRJbmRleE1hc2sgKi87CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3ZpZGVyQ291bnQgPSB0Vmlldy5kYXRhLmxlbmd0aCAtIHByb3ZpZGVyU3RhcnRJbmRleDsKICAgICAgICAodFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucyB8fCAodFZpZXcuZXhwYW5kb0luc3RydWN0aW9ucyA9IFtdKSkKICAgICAgICAgICAgLnB1c2goZWxlbWVudEluZGV4LCBwcm92aWRlckNvdW50LCBkaXJlY3RpdmVDb3VudCk7CiAgICB9CiAgICAvKioKICAgICAqIE1hdGNoZXMgdGhlIGN1cnJlbnQgbm9kZSBhZ2FpbnN0IGFsbCBhdmFpbGFibGUgc2VsZWN0b3JzLgogICAgICogSWYgYSBjb21wb25lbnQgaXMgbWF0Y2hlZCAoYXQgbW9zdCBvbmUpLCBpdCBpcyByZXR1cm5lZCBpbiBmaXJzdCBwb3NpdGlvbiBpbiB0aGUgYXJyYXkuCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHZpZXdEYXRhCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kRGlyZWN0aXZlRGVmTWF0Y2hlcyh0Vmlldywgdmlld0RhdGEsIHROb2RlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZ2lzdHJ5ID0gdFZpZXcuZGlyZWN0aXZlUmVnaXN0cnk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaGVzID0gbnVsbDsKICAgICAgICBpZiAocmVnaXN0cnkpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZWdpc3RyeS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlZ2lzdHJ5W2ldKSk7CiAgICAgICAgICAgICAgICBpZiAoaXNOb2RlTWF0Y2hpbmdTZWxlY3Rvckxpc3QodE5vZGUsICgvKiogQHR5cGUgez99ICovIChkZWYuc2VsZWN0b3JzKSksIC8qIGlzUHJvamVjdGlvbk1vZGUgKi8gZmFsc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcyB8fCAobWF0Y2hlcyA9IG5nRGV2TW9kZSA/IG5ldyBNYXRjaGVzQXJyYXkoKSA6IFtdKTsKICAgICAgICAgICAgICAgICAgICBkaVB1YmxpY0luSW5qZWN0b3IoZ2V0T3JDcmVhdGVOb2RlSW5qZWN0b3JGb3JOb2RlKHROb2RlLCB2aWV3RGF0YSksIHRWaWV3LCBkZWYudHlwZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHROb2RlLmZsYWdzICYgMiAvKiBpc0NvbXBvbmVudEhvc3QgKi8pCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd011bHRpcGxlQ29tcG9uZW50RXJyb3IodE5vZGUpOwogICAgICAgICAgICAgICAgICAgICAgICBtYXJrQXNDb21wb25lbnRIb3N0KHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZSBjb21wb25lbnQgaXMgYWx3YXlzIHN0b3JlZCBmaXJzdCB3aXRoIGRpcmVjdGl2ZXMgYWZ0ZXIuCiAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoZXMudW5zaGlmdChkZWYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hlcy5wdXNoKGRlZik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBtYXRjaGVzOwogICAgfQogICAgLyoqCiAgICAgKiBNYXJrcyBhIGdpdmVuIFROb2RlIGFzIGEgY29tcG9uZW50J3MgaG9zdC4gVGhpcyBjb25zaXN0cyBvZjoKICAgICAqIC0gc2V0dGluZyBhcHByb3ByaWF0ZSBUTm9kZSBmbGFnczsKICAgICAqIC0gc3RvcmluZyBpbmRleCBvZiBjb21wb25lbnQncyBob3N0IGVsZW1lbnQgc28gaXQgd2lsbCBiZSBxdWV1ZWQgZm9yIHZpZXcgcmVmcmVzaCBkdXJpbmcgQ0QuCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGhvc3RUTm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWFya0FzQ29tcG9uZW50SG9zdCh0VmlldywgaG9zdFROb2RlKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAgICAgaG9zdFROb2RlLmZsYWdzIHw9IDIgLyogaXNDb21wb25lbnRIb3N0ICovOwogICAgICAgICh0Vmlldy5jb21wb25lbnRzIHx8ICh0Vmlldy5jb21wb25lbnRzID0gbmdEZXZNb2RlID8gbmV3IFRWaWV3Q29tcG9uZW50cygpIDogW10pKQogICAgICAgICAgICAucHVzaChob3N0VE5vZGUuaW5kZXgpOwogICAgfQogICAgLyoqCiAgICAgKiBDYWNoZXMgbG9jYWwgbmFtZXMgYW5kIHRoZWlyIG1hdGNoaW5nIGRpcmVjdGl2ZSBpbmRpY2VzIGZvciBxdWVyeSBhbmQgdGVtcGxhdGUgbG9va3Vwcy4KICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gbG9jYWxSZWZzCiAgICAgKiBAcGFyYW0gez99IGV4cG9ydHNNYXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNhY2hlTWF0Y2hpbmdMb2NhbE5hbWVzKHROb2RlLCBsb2NhbFJlZnMsIGV4cG9ydHNNYXApIHsKICAgICAgICBpZiAobG9jYWxSZWZzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXMgPSBuZ0Rldk1vZGUgPyBuZXcgVE5vZGVMb2NhbE5hbWVzKCkgOiBbXTsKICAgICAgICAgICAgLy8gTG9jYWwgbmFtZXMgbXVzdCBiZSBzdG9yZWQgaW4gdE5vZGUgaW4gdGhlIHNhbWUgb3JkZXIgdGhhdCBsb2NhbFJlZnMgYXJlIGRlZmluZWQKICAgICAgICAgICAgLy8gaW4gdGhlIHRlbXBsYXRlIHRvIGVuc3VyZSB0aGUgZGF0YSBpcyBsb2FkZWQgaW4gdGhlIHNhbWUgc2xvdHMgYXMgdGhlaXIgcmVmcwogICAgICAgICAgICAvLyBpbiB0aGUgdGVtcGxhdGUgKGZvciB0ZW1wbGF0ZSBxdWVyaWVzKS4KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbFJlZnMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZXhwb3J0c01hcFtsb2NhbFJlZnNbaSArIDFdXTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA9PSBudWxsKQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwb3J0IG9mIG5hbWUgJyR7bG9jYWxSZWZzW2kgKyAxXX0nIG5vdCBmb3VuZCFgKTsKICAgICAgICAgICAgICAgIGxvY2FsTmFtZXMucHVzaChsb2NhbFJlZnNbaV0sIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQnVpbGRzIHVwIGFuIGV4cG9ydCBtYXAgYXMgZGlyZWN0aXZlcyBhcmUgY3JlYXRlZCwgc28gbG9jYWwgcmVmcyBjYW4gYmUgcXVpY2tseSBtYXBwZWQKICAgICAqIHRvIHRoZWlyIGRpcmVjdGl2ZSBpbnN0YW5jZXMuCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICogQHBhcmFtIHs/fSBleHBvcnRzTWFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzYXZlTmFtZVRvRXhwb3J0TWFwKGluZGV4LCBkZWYsIGV4cG9ydHNNYXApIHsKICAgICAgICBpZiAoZXhwb3J0c01hcCkgewogICAgICAgICAgICBpZiAoZGVmLmV4cG9ydEFzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGRlZi5leHBvcnRBcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIGV4cG9ydHNNYXBbZGVmLmV4cG9ydEFzW2ldXSA9IGluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudERlZihkZWYpKQogICAgICAgICAgICAgICAgZXhwb3J0c01hcFsnJ10gPSBpbmRleDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEluaXRpYWxpemVzIHRoZSBmbGFncyBvbiB0aGUgY3VycmVudCBub2RlLCBzZXR0aW5nIGFsbCBpbmRpY2VzIHRvIHRoZSBpbml0aWFsIGluZGV4LAogICAgICogdGhlIGRpcmVjdGl2ZSBjb3VudCB0byAwLCBhbmQgYWRkaW5nIHRoZSBpc0NvbXBvbmVudCBmbGFnLgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBpbmRleCB0aGUgaW5pdGlhbCBpbmRleAogICAgICogQHBhcmFtIHs/fSBudW1iZXJPZkRpcmVjdGl2ZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluaXRUTm9kZUZsYWdzKHROb2RlLCBpbmRleCwgbnVtYmVyT2ZEaXJlY3RpdmVzKSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vdEVxdWFsKG51bWJlck9mRGlyZWN0aXZlcywgdE5vZGUuZGlyZWN0aXZlRW5kIC0gdE5vZGUuZGlyZWN0aXZlU3RhcnQsICdSZWFjaGVkIHRoZSBtYXggbnVtYmVyIG9mIGRpcmVjdGl2ZXMnKTsKICAgICAgICB0Tm9kZS5mbGFncyB8PSAxIC8qIGlzRGlyZWN0aXZlSG9zdCAqLzsKICAgICAgICAvLyBXaGVuIHRoZSBmaXJzdCBkaXJlY3RpdmUgaXMgY3JlYXRlZCBvbiBhIG5vZGUsIHNhdmUgdGhlIGluZGV4CiAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQgPSBpbmRleDsKICAgICAgICB0Tm9kZS5kaXJlY3RpdmVFbmQgPSBpbmRleCArIG51bWJlck9mRGlyZWN0aXZlczsKICAgICAgICB0Tm9kZS5wcm92aWRlckluZGV4ZXMgPSBpbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gdmlld0RhdGEKICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBiYXNlUmVzb2x2ZURpcmVjdGl2ZSh0Vmlldywgdmlld0RhdGEsIGRlZikgewogICAgICAgIHRWaWV3LmRhdGEucHVzaChkZWYpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVGYWN0b3J5ID0gZGVmLmZhY3RvcnkgfHwgKCgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSkpLmZhY3RvcnkgPSBnZXRGYWN0b3J5RGVmKGRlZi50eXBlLCB0cnVlKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGVJbmplY3RvckZhY3RvcnkgPSBuZXcgTm9kZUluamVjdG9yRmFjdG9yeShkaXJlY3RpdmVGYWN0b3J5LCBpc0NvbXBvbmVudERlZihkZWYpLCBudWxsKTsKICAgICAgICB0Vmlldy5ibHVlcHJpbnQucHVzaChub2RlSW5qZWN0b3JGYWN0b3J5KTsKICAgICAgICB2aWV3RGF0YS5wdXNoKG5vZGVJbmplY3RvckZhY3RvcnkpOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBob3N0VE5vZGUKICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRDb21wb25lbnRMb2dpYyhsVmlldywgaG9zdFROb2RlLCBkZWYpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmF0aXZlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUoaG9zdFROb2RlLCBsVmlldykpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRPckNyZWF0ZVRDb21wb25lbnRWaWV3KGRlZik7CiAgICAgICAgLy8gT25seSBjb21wb25lbnQgdmlld3Mgc2hvdWxkIGJlIGFkZGVkIHRvIHRoZSB2aWV3IHRyZWUgZGlyZWN0bHkuIEVtYmVkZGVkIHZpZXdzIGFyZQogICAgICAgIC8vIGFjY2Vzc2VkIHRocm91Z2ggdGhlaXIgY29udGFpbmVycyBiZWNhdXNlIHRoZXkgbWF5IGJlIHJlbW92ZWQgLyByZS1hZGRlZCBsYXRlci4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXJGYWN0b3J5ID0gbFZpZXdbUkVOREVSRVJfRkFDVE9SWV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBhZGRUb1ZpZXdUcmVlKGxWaWV3LCBjcmVhdGVMVmlldyhsVmlldywgdFZpZXcsIG51bGwsIGRlZi5vblB1c2ggPyA2NCAvKiBEaXJ0eSAqLyA6IDE2IC8qIENoZWNrQWx3YXlzICovLCBuYXRpdmUsICgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgcmVuZGVyZXJGYWN0b3J5LCByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobmF0aXZlLCBkZWYpKSk7CiAgICAgICAgLy8gQ29tcG9uZW50IHZpZXcgd2lsbCBhbHdheXMgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGluamVjdGVkIExDb250YWluZXJzLAogICAgICAgIC8vIHNvIHRoaXMgaXMgYSByZWd1bGFyIGVsZW1lbnQsIHdyYXAgaXQgd2l0aCB0aGUgY29tcG9uZW50IHZpZXcKICAgICAgICBsVmlld1tob3N0VE5vZGUuaW5kZXhdID0gY29tcG9uZW50VmlldzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IHNhbml0aXplcgogICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb3RTYW1lKHZhbHVlLCAoLyoqIEB0eXBlIHs/fSAqLyAoTk9fQ0hBTkdFKSksICdJbmNvbWluZyB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLicpOwogICAgICAgIG5nRGV2TW9kZSAmJiB2YWxpZGF0ZUFnYWluc3RFdmVudEF0dHJpYnV0ZXMobmFtZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgbFZpZXcpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVBdHRyaWJ1dGUrKzsKICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIucmVtb3ZlQXR0cmlidXRlKGVsZW1lbnQsIG5hbWUsIG5hbWVzcGFjZSkgOgogICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyU2V0QXR0cmlidXRlKys7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSBzYW5pdGl6ZXIgPT0gbnVsbCA/IHJlbmRlclN0cmluZ2lmeSh2YWx1ZSkgOiBzYW5pdGl6ZXIodmFsdWUsIHROb2RlLnRhZ05hbWUgfHwgJycsIG5hbWUpOwogICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgbmFtZSwgc3RyVmFsdWUsIG5hbWVzcGFjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuYW1lc3BhY2UgPyBlbGVtZW50LnNldEF0dHJpYnV0ZU5TKG5hbWVzcGFjZSwgbmFtZSwgc3RyVmFsdWUpIDoKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZShuYW1lLCBzdHJWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldHMgaW5pdGlhbCBpbnB1dCBwcm9wZXJ0aWVzIG9uIGRpcmVjdGl2ZSBpbnN0YW5jZXMgZnJvbSBhdHRyaWJ1dGUgZGF0YQogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IEN1cnJlbnQgTFZpZXcgdGhhdCBpcyBiZWluZyBwcm9jZXNzZWQuCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZUluZGV4IEluZGV4IG9mIHRoZSBkaXJlY3RpdmUgaW4gZGlyZWN0aXZlcyBhcnJheQogICAgICogQHBhcmFtIHs/fSBpbnN0YW5jZSBJbnN0YW5jZSBvZiB0aGUgZGlyZWN0aXZlIG9uIHdoaWNoIHRvIHNldCB0aGUgaW5pdGlhbCBpbnB1dHMKICAgICAqIEBwYXJhbSB7P30gZGVmIFRoZSBkaXJlY3RpdmUgZGVmIHRoYXQgY29udGFpbnMgdGhlIGxpc3Qgb2YgaW5wdXRzCiAgICAgKiBAcGFyYW0gez99IHROb2RlIFRoZSBzdGF0aWMgZGF0YSBmb3IgdGhpcyBub2RlCiAgICAgKiBAcGFyYW0gez99IGluaXRpYWxJbnB1dERhdGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldElucHV0c0Zyb21BdHRycyhsVmlldywgZGlyZWN0aXZlSW5kZXgsIGluc3RhbmNlLCBkZWYsIHROb2RlLCBpbml0aWFsSW5wdXREYXRhKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaXRpYWxJbnB1dHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5pdGlhbElucHV0RGF0YSkpW2RpcmVjdGl2ZUluZGV4XTsKICAgICAgICBpZiAoaW5pdGlhbElucHV0cyAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNldElucHV0ID0gZGVmLnNldElucHV0OwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluaXRpYWxJbnB1dHMubGVuZ3RoOykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcHVibGljTmFtZSA9IGluaXRpYWxJbnB1dHNbaSsrXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByaXZhdGVOYW1lID0gaW5pdGlhbElucHV0c1tpKytdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpbml0aWFsSW5wdXRzW2krK107CiAgICAgICAgICAgICAgICBpZiAoc2V0SW5wdXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmLnNldElucHV0KSkoaW5zdGFuY2UsIHZhbHVlLCBwdWJsaWNOYW1lLCBwcml2YXRlTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGluc3RhbmNlKSkpW3ByaXZhdGVOYW1lXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KSkpOwogICAgICAgICAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnR5KGxWaWV3LCBuYXRpdmVFbGVtZW50LCB0Tm9kZS50eXBlLCBwcml2YXRlTmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZW5lcmF0ZXMgaW5pdGlhbElucHV0RGF0YSBmb3IgYSBub2RlIGFuZCBzdG9yZXMgaXQgaW4gdGhlIHRlbXBsYXRlJ3Mgc3RhdGljIHN0b3JhZ2UKICAgICAqIHNvIHN1YnNlcXVlbnQgdGVtcGxhdGUgaW52b2NhdGlvbnMgZG9uJ3QgaGF2ZSB0byByZWNhbGN1bGF0ZSBpdC4KICAgICAqCiAgICAgKiBpbml0aWFsSW5wdXREYXRhIGlzIGFuIGFycmF5IGNvbnRhaW5pbmcgdmFsdWVzIHRoYXQgbmVlZCB0byBiZSBzZXQgYXMgaW5wdXQgcHJvcGVydGllcwogICAgICogZm9yIGRpcmVjdGl2ZXMgb24gdGhpcyBub2RlLCBidXQgb25seSBvbmNlIG9uIGNyZWF0aW9uLiBXZSBuZWVkIHRoaXMgYXJyYXkgdG8gc3VwcG9ydAogICAgICogdGhlIGNhc2Ugd2hlcmUgeW91IHNldCBhbiBcQElucHV0IHByb3BlcnR5IG9mIGEgZGlyZWN0aXZlIHVzaW5nIGF0dHJpYnV0ZS1saWtlIHN5bnRheC4KICAgICAqIGUuZy4gaWYgeW91IGhhdmUgYSBgbmFtZWAgXEBJbnB1dCwgeW91IGNhbiBzZXQgaXQgb25jZSBsaWtlIHRoaXM6CiAgICAgKgogICAgICogPG15LWNvbXBvbmVudCBuYW1lPSJCZXNzIj48L215LWNvbXBvbmVudD4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGlucHV0cyBUaGUgbGlzdCBvZiBpbnB1dHMgZnJvbSB0aGUgZGlyZWN0aXZlIGRlZgogICAgICogQHBhcmFtIHs/fSBhdHRycyBUaGUgc3RhdGljIGF0dHJzIG9uIHRoaXMgbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2VuZXJhdGVJbml0aWFsSW5wdXRzKGlucHV0cywgYXR0cnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlucHV0c1RvU3RvcmUgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgd2hpbGUgKGkgPCBhdHRycy5sZW5ndGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJzW2ldOwogICAgICAgICAgICBpZiAoYXR0ck5hbWUgPT09IDAgLyogTmFtZXNwYWNlVVJJICovKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgYWxsb3cgaW5wdXRzIG9uIG5hbWVzcGFjZWQgYXR0cmlidXRlcy4KICAgICAgICAgICAgICAgIGkgKz0gNDsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGF0dHJOYW1lID09PSA1IC8qIFByb2plY3RBcyAqLykgewogICAgICAgICAgICAgICAgLy8gU2tpcCBvdmVyIHRoZSBgbmdQcm9qZWN0QXNgIHZhbHVlLgogICAgICAgICAgICAgICAgaSArPSAyOwogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgd2UgaGl0IGFueSBvdGhlciBhdHRyaWJ1dGUgbWFya2Vycywgd2UncmUgZG9uZSBhbnl3YXkuIE5vbmUgb2YgdGhvc2UgYXJlIHZhbGlkIGlucHV0cy4KICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyTmFtZSA9PT0gJ251bWJlcicpCiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgaWYgKGlucHV0cy5oYXNPd25Qcm9wZXJ0eSgoLyoqIEB0eXBlIHs/fSAqLyAoYXR0ck5hbWUpKSkpIHsKICAgICAgICAgICAgICAgIGlmIChpbnB1dHNUb1N0b3JlID09PSBudWxsKQogICAgICAgICAgICAgICAgICAgIGlucHV0c1RvU3RvcmUgPSBbXTsKICAgICAgICAgICAgICAgIGlucHV0c1RvU3RvcmUucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAoYXR0ck5hbWUpKSwgaW5wdXRzWygvKiogQHR5cGUgez99ICovIChhdHRyTmFtZSkpXSwgKC8qKiBAdHlwZSB7P30gKi8gKGF0dHJzW2kgKyAxXSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpICs9IDI7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbnB1dHNUb1N0b3JlOwogICAgfQogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vLy8gVmlld0NvbnRhaW5lciAmIFZpZXcKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyBOb3Qgc3VyZSB3aHkgSSBuZWVkIHRvIGRvIGBhbnlgIGhlcmUgYnV0IFRTIGNvbXBsYWlucyBsYXRlci4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IExDb250YWluZXJBcnJheSA9ICgodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCkpICYmCiAgICAgICAgY3JlYXRlTmFtZWRBcnJheVR5cGUoJ0xDb250YWluZXInKTsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIExDb250YWluZXIsIGVpdGhlciBmcm9tIGEgY29udGFpbmVyIGluc3RydWN0aW9uLCBvciBmb3IgYSBWaWV3Q29udGFpbmVyUmVmLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gaG9zdE5hdGl2ZSBUaGUgaG9zdCBlbGVtZW50IGZvciB0aGUgTENvbnRhaW5lcgogICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmlldyBUaGUgcGFyZW50IHZpZXcgb2YgdGhlIExDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gbmF0aXZlIFRoZSBuYXRpdmUgY29tbWVudCBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcmV0dXJuIHs/fSBMQ29udGFpbmVyCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUxDb250YWluZXIoaG9zdE5hdGl2ZSwgY3VycmVudFZpZXcsIG5hdGl2ZSwgdE5vZGUpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcoY3VycmVudFZpZXcpOwogICAgICAgIG5nRGV2TW9kZSAmJiAhaXNQcm9jZWR1cmFsUmVuZGVyZXIoY3VycmVudFZpZXdbUkVOREVSRVJdKSAmJiBhc3NlcnREb21Ob2RlKG5hdGl2ZSk7CiAgICAgICAgLy8gaHR0cHM6Ly9qc3BlcmYuY29tL2FycmF5LWxpdGVyYWwtdnMtbmV3LWFycmF5LXJlYWxseQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsQ29udGFpbmVyID0gbmV3IChuZ0Rldk1vZGUgPyBMQ29udGFpbmVyQXJyYXkgOiBBcnJheSkoaG9zdE5hdGl2ZSwgLy8gaG9zdCBuYXRpdmUKICAgICAgICB0cnVlLCAvLyBCb29sZWFuIGB0cnVlYCBpbiB0aGlzIHBvc2l0aW9uIHNpZ25pZmllcyB0aGF0IHRoaXMgaXMgYW4gYExDb250YWluZXJgCiAgICAgICAgZmFsc2UsIC8vIGhhcyB0cmFuc3BsYW50ZWQgdmlld3MKICAgICAgICBjdXJyZW50VmlldywgLy8gcGFyZW50CiAgICAgICAgbnVsbCwgLy8gbmV4dAogICAgICAgIDAsIC8vIHRyYW5zcGxhbnRlZCB2aWV3cyB0byByZWZyZXNoIGNvdW50CiAgICAgICAgdE5vZGUsIC8vIHRfaG9zdAogICAgICAgIG5hdGl2ZSwgLy8gbmF0aXZlLAogICAgICAgIG51bGwsIC8vIHZpZXcgcmVmcwogICAgICAgIG51bGwpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnRFcXVhbChsQ29udGFpbmVyLmxlbmd0aCwgQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQsICdTaG91bGQgYWxsb2NhdGUgY29ycmVjdCBudW1iZXIgb2Ygc2xvdHMgZm9yIExDb250YWluZXIgaGVhZGVyLicpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhdHRhY2hMQ29udGFpbmVyRGVidWcobENvbnRhaW5lcik7CiAgICAgICAgcmV0dXJuIGxDb250YWluZXI7CiAgICB9CiAgICAvKioKICAgICAqIEdvZXMgb3ZlciBlbWJlZGRlZCB2aWV3cyAob25lcyBjcmVhdGVkIHRocm91Z2ggVmlld0NvbnRhaW5lclJlZiBBUElzKSBhbmQgcmVmcmVzaGVzCiAgICAgKiB0aGVtIGJ5IGV4ZWN1dGluZyBhbiBhc3NvY2lhdGVkIHRlbXBsYXRlIGZ1bmN0aW9uLgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVmcmVzaEVtYmVkZGVkVmlld3MobFZpZXcpIHsKICAgICAgICBmb3IgKGxldCBsQ29udGFpbmVyID0gZ2V0Rmlyc3RMQ29udGFpbmVyKGxWaWV3KTsgbENvbnRhaW5lciAhPT0gbnVsbDsgbENvbnRhaW5lciA9IGdldE5leHRMQ29udGFpbmVyKGxDb250YWluZXIpKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsgaSA8IGxDb250YWluZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBsQ29udGFpbmVyW2ldOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW1iZWRkZWRUVmlldyA9IGVtYmVkZGVkTFZpZXdbVFZJRVddOwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoZW1iZWRkZWRUVmlldywgJ1RWaWV3IG11c3QgYmUgYWxsb2NhdGVkJyk7CiAgICAgICAgICAgICAgICBpZiAodmlld0F0dGFjaGVkVG9DaGFuZ2VEZXRlY3RvcihlbWJlZGRlZExWaWV3KSkgewogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWaWV3KGVtYmVkZGVkVFZpZXcsIGVtYmVkZGVkTFZpZXcsIGVtYmVkZGVkVFZpZXcudGVtcGxhdGUsICgvKiogQHR5cGUgez99ICovIChlbWJlZGRlZExWaWV3W0NPTlRFWFRdKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYXJrIHRyYW5zcGxhbnRlZCB2aWV3cyBhcyBuZWVkaW5nIHRvIGJlIHJlZnJlc2hlZCBhdCB0aGVpciBpbnNlcnRpb24gcG9pbnRzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIGBMVmlld2AgdGhhdCBtYXkgaGF2ZSB0cmFuc3BsYW50ZWQgdmlld3MuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXJrVHJhbnNwbGFudGVkVmlld3NGb3JSZWZyZXNoKGxWaWV3KSB7CiAgICAgICAgZm9yIChsZXQgbENvbnRhaW5lciA9IGdldEZpcnN0TENvbnRhaW5lcihsVmlldyk7IGxDb250YWluZXIgIT09IG51bGw7IGxDb250YWluZXIgPSBnZXROZXh0TENvbnRhaW5lcihsQ29udGFpbmVyKSkgewogICAgICAgICAgICBpZiAoIWxDb250YWluZXJbSEFTX1RSQU5TUExBTlRFRF9WSUVXU10pCiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtb3ZlZFZpZXdzID0gKC8qKiBAdHlwZSB7P30gKi8gKGxDb250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKG1vdmVkVmlld3MsICdUcmFuc3BsYW50ZWQgVmlldyBmbGFncyBzZXQgYnV0IG1pc3NpbmcgTU9WRURfVklFV1MnKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtb3ZlZFZpZXdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlZExWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vdmVkVmlld3NbaV0pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluc2VydGlvbkxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobW92ZWRMVmlld1tQQVJFTlRdKSk7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihpbnNlcnRpb25MQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIGlmIHRoZSBtb3ZlZCBMVmlldyB3YXMgYWxyZWFkeSBtYXJrZWQgZm9yCiAgICAgICAgICAgICAgICAvLyByZWZyZXNoLgogICAgICAgICAgICAgICAgaWYgKChtb3ZlZExWaWV3W0ZMQUdTXSAmIDEwMjQgLyogUmVmcmVzaFRyYW5zcGxhbnRlZFZpZXcgKi8pID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdXBkYXRlVHJhbnNwbGFudGVkVmlld0NvdW50KGluc2VydGlvbkxDb250YWluZXIsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gTm90ZSwgaXQgaXMgcG9zc2libGUgdGhhdCB0aGUgYG1vdmVkVmlld3NgIGlzIHRyYWNraW5nIHZpZXdzIHRoYXQgYXJlIHRyYW5zcGxhbnRlZCAqYW5kKgogICAgICAgICAgICAgICAgLy8gdGhvc2UgdGhhdCBhcmVuJ3QgKGRlY2xhcmF0aW9uIGNvbXBvbmVudCA9PT0gaW5zZXJ0aW9uIGNvbXBvbmVudCkuIEluIHRoZSBsYXR0ZXIgY2FzZSwKICAgICAgICAgICAgICAgIC8vIGl0J3MgZmluZSB0byBhZGQgdGhlIGZsYWcsIGFzIHdlIHdpbGwgY2xlYXIgaXQgaW1tZWRpYXRlbHkgaW4KICAgICAgICAgICAgICAgIC8vIGByZWZyZXNoRW1iZWRkZWRWaWV3c2AgZm9yIHRoZSB2aWV3IGN1cnJlbnRseSBiZWluZyByZWZyZXNoZWQuCiAgICAgICAgICAgICAgICBtb3ZlZExWaWV3W0ZMQUdTXSB8PSAxMDI0IC8qIFJlZnJlc2hUcmFuc3BsYW50ZWRWaWV3ICovOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLy8vLy8vLy8vLy8vLwogICAgLyoqCiAgICAgKiBSZWZyZXNoZXMgY29tcG9uZW50cyBieSBlbnRlcmluZyB0aGUgY29tcG9uZW50IHZpZXcgYW5kIHByb2Nlc3NpbmcgaXRzIGJpbmRpbmdzLCBxdWVyaWVzLCBldGMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBob3N0TFZpZXcKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50SG9zdElkeCAgRWxlbWVudCBpbmRleCBpbiBMVmlld1tdIChhZGp1c3RlZCBmb3IgSEVBREVSX09GRlNFVCkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZnJlc2hDb21wb25lbnQoaG9zdExWaWV3LCBjb21wb25lbnRIb3N0SWR4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGlzQ3JlYXRpb25Nb2RlKGhvc3RMVmlldyksIGZhbHNlLCAnU2hvdWxkIGJlIHJ1biBpbiB1cGRhdGUgbW9kZScpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnRWaWV3ID0gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KGNvbXBvbmVudEhvc3RJZHgsIGhvc3RMVmlldyk7CiAgICAgICAgLy8gT25seSBhdHRhY2hlZCBjb21wb25lbnRzIHRoYXQgYXJlIENoZWNrQWx3YXlzIG9yIE9uUHVzaCBhbmQgZGlydHkgc2hvdWxkIGJlIHJlZnJlc2hlZAogICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKGNvbXBvbmVudFZpZXcpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBjb21wb25lbnRWaWV3W1RWSUVXXTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudFZpZXdbRkxBR1NdICYgKDE2IC8qIENoZWNrQWx3YXlzICovIHwgNjQgLyogRGlydHkgKi8pKSB7CiAgICAgICAgICAgICAgICByZWZyZXNoVmlldyh0VmlldywgY29tcG9uZW50VmlldywgdFZpZXcudGVtcGxhdGUsIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGNvbXBvbmVudFZpZXdbVFJBTlNQTEFOVEVEX1ZJRVdTX1RPX1JFRlJFU0hdID4gMCkgewogICAgICAgICAgICAgICAgLy8gT25seSBhdHRhY2hlZCBjb21wb25lbnRzIHRoYXQgYXJlIENoZWNrQWx3YXlzIG9yIE9uUHVzaCBhbmQgZGlydHkgc2hvdWxkIGJlIHJlZnJlc2hlZAogICAgICAgICAgICAgICAgcmVmcmVzaENvbnRhaW5zRGlydHlWaWV3KGNvbXBvbmVudFZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZWZyZXNoZXMgYWxsIHRyYW5zcGxhbnRlZCB2aWV3cyBtYXJrZWQgd2l0aCBgTFZpZXdGbGFncy5SZWZyZXNoVHJhbnNwbGFudGVkVmlld2AgdGhhdCBhcmUKICAgICAqIGNoaWxkcmVuIG9yIGRlc2NlbmRhbnRzIG9mIHRoZSBnaXZlbiBsVmlldy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSBsVmlldyB3aGljaCBjb250YWlucyBkZXNjZW5kYW50IHRyYW5zcGxhbnRlZCB2aWV3cyB0aGF0IG5lZWQgdG8gYmUgcmVmcmVzaGVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVmcmVzaENvbnRhaW5zRGlydHlWaWV3KGxWaWV3KSB7CiAgICAgICAgZm9yIChsZXQgbENvbnRhaW5lciA9IGdldEZpcnN0TENvbnRhaW5lcihsVmlldyk7IGxDb250YWluZXIgIT09IG51bGw7IGxDb250YWluZXIgPSBnZXROZXh0TENvbnRhaW5lcihsQ29udGFpbmVyKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQ7IGkgPCBsQ29udGFpbmVyLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZExWaWV3ID0gbENvbnRhaW5lcltpXTsKICAgICAgICAgICAgICAgIGlmIChlbWJlZGRlZExWaWV3W0ZMQUdTXSAmIDEwMjQgLyogUmVmcmVzaFRyYW5zcGxhbnRlZFZpZXcgKi8pIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1iZWRkZWRUVmlldyA9IGVtYmVkZGVkTFZpZXdbVFZJRVddOwogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGVtYmVkZGVkVFZpZXcsICdUVmlldyBtdXN0IGJlIGFsbG9jYXRlZCcpOwogICAgICAgICAgICAgICAgICAgIHJlZnJlc2hWaWV3KGVtYmVkZGVkVFZpZXcsIGVtYmVkZGVkTFZpZXcsIGVtYmVkZGVkVFZpZXcudGVtcGxhdGUsICgvKiogQHR5cGUgez99ICovIChlbWJlZGRlZExWaWV3W0NPTlRFWFRdKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZW1iZWRkZWRMVmlld1tUUkFOU1BMQU5URURfVklFV1NfVE9fUkVGUkVTSF0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaENvbnRhaW5zRGlydHlWaWV3KGVtYmVkZGVkTFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGxWaWV3W1RWSUVXXTsKICAgICAgICAvLyBSZWZyZXNoIGNoaWxkIGNvbXBvbmVudCB2aWV3cy4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50cyA9IHRWaWV3LmNvbXBvbmVudHM7CiAgICAgICAgaWYgKGNvbXBvbmVudHMgIT09IG51bGwpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjb21wb25lbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRWaWV3ID0gZ2V0Q29tcG9uZW50TFZpZXdCeUluZGV4KGNvbXBvbmVudHNbaV0sIGxWaWV3KTsKICAgICAgICAgICAgICAgIC8vIE9ubHkgYXR0YWNoZWQgY29tcG9uZW50cyB0aGF0IGFyZSBDaGVja0Fsd2F5cyBvciBPblB1c2ggYW5kIGRpcnR5IHNob3VsZCBiZSByZWZyZXNoZWQKICAgICAgICAgICAgICAgIGlmICh2aWV3QXR0YWNoZWRUb0NoYW5nZURldGVjdG9yKGNvbXBvbmVudFZpZXcpICYmCiAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50Vmlld1tUUkFOU1BMQU5URURfVklFV1NfVE9fUkVGUkVTSF0gPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmVmcmVzaENvbnRhaW5zRGlydHlWaWV3KGNvbXBvbmVudFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGhvc3RMVmlldwogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRIb3N0SWR4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW5kZXJDb21wb25lbnQoaG9zdExWaWV3LCBjb21wb25lbnRIb3N0SWR4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKGlzQ3JlYXRpb25Nb2RlKGhvc3RMVmlldyksIHRydWUsICdTaG91bGQgYmUgcnVuIGluIGNyZWF0aW9uIG1vZGUnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleChjb21wb25lbnRIb3N0SWR4LCBob3N0TFZpZXcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnRUVmlldyA9IGNvbXBvbmVudFZpZXdbVFZJRVddOwogICAgICAgIHN5bmNWaWV3V2l0aEJsdWVwcmludChjb21wb25lbnRUVmlldywgY29tcG9uZW50Vmlldyk7CiAgICAgICAgcmVuZGVyVmlldyhjb21wb25lbnRUVmlldywgY29tcG9uZW50VmlldywgY29tcG9uZW50Vmlld1tDT05URVhUXSk7CiAgICB9CiAgICAvKioKICAgICAqIFN5bmNzIGFuIExWaWV3IGluc3RhbmNlIHdpdGggaXRzIGJsdWVwcmludCBpZiB0aGV5IGhhdmUgZ290dGVuIG91dCBvZiBzeW5jLgogICAgICoKICAgICAqIFR5cGljYWxseSwgYmx1ZXByaW50cyBhbmQgdGhlaXIgdmlldyBpbnN0YW5jZXMgc2hvdWxkIGFsd2F5cyBiZSBpbiBzeW5jLCBzbyB0aGUgbG9vcCBoZXJlCiAgICAgKiB3aWxsIGJlIHNraXBwZWQuIEhvd2V2ZXIsIGNvbnNpZGVyIHRoaXMgY2FzZSBvZiB0d28gY29tcG9uZW50cyBzaWRlLWJ5LXNpZGU6CiAgICAgKgogICAgICogQXBwIHRlbXBsYXRlOgogICAgICogYGBgCiAgICAgKiA8Y29tcD48L2NvbXA+CiAgICAgKiA8Y29tcD48L2NvbXA+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIHdpbGwgaGFwcGVuOgogICAgICogMS4gQXBwIHRlbXBsYXRlIGJlZ2lucyBwcm9jZXNzaW5nLgogICAgICogMi4gRmlyc3QgPGNvbXA+IGlzIG1hdGNoZWQgYXMgYSBjb21wb25lbnQgYW5kIGl0cyBMVmlldyBpcyBjcmVhdGVkLgogICAgICogMy4gU2Vjb25kIDxjb21wPiBpcyBtYXRjaGVkIGFzIGEgY29tcG9uZW50IGFuZCBpdHMgTFZpZXcgaXMgY3JlYXRlZC4KICAgICAqIDQuIEFwcCB0ZW1wbGF0ZSBjb21wbGV0ZXMgcHJvY2Vzc2luZywgc28gaXQncyB0aW1lIHRvIGNoZWNrIGNoaWxkIHRlbXBsYXRlcy4KICAgICAqIDUuIEZpcnN0IDxjb21wPiB0ZW1wbGF0ZSBpcyBjaGVja2VkLiBJdCBoYXMgYSBkaXJlY3RpdmUsIHNvIGl0cyBkZWYgaXMgcHVzaGVkIHRvIGJsdWVwcmludC4KICAgICAqIDYuIFNlY29uZCA8Y29tcD4gdGVtcGxhdGUgaXMgY2hlY2tlZC4gSXRzIGJsdWVwcmludCBoYXMgYmVlbiB1cGRhdGVkIGJ5IHRoZSBmaXJzdAogICAgICogPGNvbXA+IHRlbXBsYXRlLCBidXQgaXRzIExWaWV3IHdhcyBjcmVhdGVkIGJlZm9yZSB0aGlzIHVwZGF0ZSwgc28gaXQgaXMgb3V0IG9mIHN5bmMuCiAgICAgKgogICAgICogTm90ZSB0aGF0IGVtYmVkZGVkIHZpZXdzIGluc2lkZSBuZ0ZvciBsb29wcyB3aWxsIG5ldmVyIGJlIG91dCBvZiBzeW5jIGJlY2F1c2UgdGhlc2Ugdmlld3MKICAgICAqIGFyZSBwcm9jZXNzZWQgYXMgc29vbiBhcyB0aGV5IGFyZSBjcmVhdGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlld2AgdGhhdCBjb250YWlucyB0aGUgYmx1ZXByaW50IGZvciBzeW5jaW5nCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSB2aWV3IHRvIHN5bmMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN5bmNWaWV3V2l0aEJsdWVwcmludCh0VmlldywgbFZpZXcpIHsKICAgICAgICBmb3IgKGxldCBpID0gbFZpZXcubGVuZ3RoOyBpIDwgdFZpZXcuYmx1ZXByaW50Lmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGxWaWV3LnB1c2godFZpZXcuYmx1ZXByaW50W2ldKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEFkZHMgTFZpZXcgb3IgTENvbnRhaW5lciB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHZpZXcgdHJlZS4KICAgICAqCiAgICAgKiBUaGlzIHN0cnVjdHVyZSB3aWxsIGJlIHVzZWQgdG8gdHJhdmVyc2UgdGhyb3VnaCBuZXN0ZWQgdmlld3MgdG8gcmVtb3ZlIGxpc3RlbmVycwogICAgICogYW5kIGNhbGwgb25EZXN0cm95IGNhbGxiYWNrcy4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBsVmlldyBUaGUgdmlldyB3aGVyZSBMVmlldyBvciBMQ29udGFpbmVyIHNob3VsZCBiZSBhZGRlZAogICAgICogQHBhcmFtIHs/fSBsVmlld09yTENvbnRhaW5lciBUaGUgTFZpZXcgb3IgTENvbnRhaW5lciB0byBhZGQgdG8gdGhlIHZpZXcgdHJlZQogICAgICogQHJldHVybiB7P30gVGhlIHN0YXRlIHBhc3NlZCBpbgogICAgICovCiAgICBmdW5jdGlvbiBhZGRUb1ZpZXdUcmVlKGxWaWV3LCBsVmlld09yTENvbnRhaW5lcikgewogICAgICAgIC8vIFRPRE8oYmVubGVzaC9taXNrbyk6IFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaW5jb3JyZWN0LCBiZWNhdXNlIGl0IGFsd2F5cyBhZGRzIHRoZSBMQ29udGFpbmVyCiAgICAgICAgLy8gdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUsIHdoaWNoIG1lYW5zIGlmIHRoZSBkZXZlbG9wZXIgcmV0cmlldmVzIHRoZSBMQ29udGFpbmVycyBmcm9tIFJOb2RlcyBvdXQKICAgICAgICAvLyBvZiBvcmRlciwgdGhlIGNoYW5nZSBkZXRlY3Rpb24gd2lsbCBydW4gb3V0IG9mIG9yZGVyLCBhcyB0aGUgYWN0IG9mIHJldHJpZXZpbmcgdGhlIHRoZQogICAgICAgIC8vIExDb250YWluZXIgZnJvbSB0aGUgUk5vZGUgaXMgd2hhdCBhZGRzIGl0IHRvIHRoZSBxdWV1ZS4KICAgICAgICBpZiAobFZpZXdbQ0hJTERfSEVBRF0pIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NISUxEX1RBSUxdKSlbTkVYVF0gPSBsVmlld09yTENvbnRhaW5lcjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxWaWV3W0NISUxEX0hFQURdID0gbFZpZXdPckxDb250YWluZXI7CiAgICAgICAgfQogICAgICAgIGxWaWV3W0NISUxEX1RBSUxdID0gbFZpZXdPckxDb250YWluZXI7CiAgICAgICAgcmV0dXJuIGxWaWV3T3JMQ29udGFpbmVyOwogICAgfQogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8vLyBDaGFuZ2UgZGV0ZWN0aW9uCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvKioKICAgICAqIE1hcmtzIGN1cnJlbnQgdmlldyBhbmQgYWxsIGFuY2VzdG9ycyBkaXJ0eS4KICAgICAqCiAgICAgKiBSZXR1cm5zIHRoZSByb290IHZpZXcgYmVjYXVzZSBpdCBpcyBmb3VuZCBhcyBhIGJ5cHJvZHVjdCBvZiBtYXJraW5nIHRoZSB2aWV3IHRyZWUKICAgICAqIGRpcnR5LCBhbmQgY2FuIGJlIHVzZWQgYnkgbWV0aG9kcyB0aGF0IGNvbnN1bWUgbWFya1ZpZXdEaXJ0eSgpIHRvIGVhc2lseSBzY2hlZHVsZQogICAgICogY2hhbmdlIGRldGVjdGlvbi4gT3RoZXJ3aXNlLCBzdWNoIG1ldGhvZHMgd291bGQgbmVlZCB0byB0cmF2ZXJzZSB1cCB0aGUgdmlldyB0cmVlCiAgICAgKiBhbiBhZGRpdGlvbmFsIHRpbWUgdG8gZ2V0IHRoZSByb290IHZpZXcgYW5kIHNjaGVkdWxlIGEgdGljayBvbiBpdC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSBzdGFydGluZyBMVmlldyB0byBtYXJrIGRpcnR5CiAgICAgKiBAcmV0dXJuIHs/fSB0aGUgcm9vdCBMVmlldwogICAgICovCiAgICBmdW5jdGlvbiBtYXJrVmlld0RpcnR5KGxWaWV3KSB7CiAgICAgICAgd2hpbGUgKGxWaWV3KSB7CiAgICAgICAgICAgIGxWaWV3W0ZMQUdTXSB8PSA2NCAvKiBEaXJ0eSAqLzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnQgPSBnZXRMVmlld1BhcmVudChsVmlldyk7CiAgICAgICAgICAgIC8vIFN0b3AgdHJhdmVyc2luZyB1cCBhcyBzb29uIGFzIHlvdSBmaW5kIGEgcm9vdCB2aWV3IHRoYXQgd2Fzbid0IGF0dGFjaGVkIHRvIGFueSBjb250YWluZXIKICAgICAgICAgICAgaWYgKGlzUm9vdFZpZXcobFZpZXcpICYmICFwYXJlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBsVmlldzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjb250aW51ZSBvdGhlcndpc2UKICAgICAgICAgICAgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBVc2VkIHRvIHNjaGVkdWxlIGNoYW5nZSBkZXRlY3Rpb24gb24gdGhlIHdob2xlIGFwcGxpY2F0aW9uLgogICAgICoKICAgICAqIFVubGlrZSBgdGlja2AsIGBzY2hlZHVsZVRpY2tgIGNvYWxlc2NlcyBtdWx0aXBsZSBjYWxscyBpbnRvIG9uZSBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bi4KICAgICAqIEl0IGlzIHVzdWFsbHkgY2FsbGVkIGluZGlyZWN0bHkgYnkgY2FsbGluZyBgbWFya0RpcnR5YCB3aGVuIHRoZSB2aWV3IG5lZWRzIHRvIGJlCiAgICAgKiByZS1yZW5kZXJlZC4KICAgICAqCiAgICAgKiBUeXBpY2FsbHkgYHNjaGVkdWxlVGlja2AgdXNlcyBgcmVxdWVzdEFuaW1hdGlvbkZyYW1lYCB0byBjb2FsZXNjZSBtdWx0aXBsZQogICAgICogYHNjaGVkdWxlVGlja2AgcmVxdWVzdHMuIFRoZSBzY2hlZHVsaW5nIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluCiAgICAgKiBgcmVuZGVyQ29tcG9uZW50YCdzIGBzY2hlZHVsZXJgIG9wdGlvbi4KICAgICAqIEBwYXJhbSB7P30gcm9vdENvbnRleHQKICAgICAqIEBwYXJhbSB7P30gZmxhZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGljayhyb290Q29udGV4dCwgZmxhZ3MpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm90aGluZ1NjaGVkdWxlZCA9IHJvb3RDb250ZXh0LmZsYWdzID09PSAwIC8qIEVtcHR5ICovOwogICAgICAgIHJvb3RDb250ZXh0LmZsYWdzIHw9IGZsYWdzOwogICAgICAgIGlmIChub3RoaW5nU2NoZWR1bGVkICYmIHJvb3RDb250ZXh0LmNsZWFuID09IF9DTEVBTl9QUk9NSVNFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlczsKICAgICAgICAgICAgcm9vdENvbnRleHQuY2xlYW4gPSBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHIpID0+IHJlcyA9IHIpKTsKICAgICAgICAgICAgcm9vdENvbnRleHQuc2NoZWR1bGVyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChyb290Q29udGV4dC5mbGFncyAmIDEgLyogRGV0ZWN0Q2hhbmdlcyAqLykgewogICAgICAgICAgICAgICAgICAgIHJvb3RDb250ZXh0LmZsYWdzICY9IH4xIC8qIERldGVjdENoYW5nZXMgKi87CiAgICAgICAgICAgICAgICAgICAgdGlja1Jvb3RDb250ZXh0KHJvb3RDb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChyb290Q29udGV4dC5mbGFncyAmIDIgLyogRmx1c2hQbGF5ZXJzICovKSB7CiAgICAgICAgICAgICAgICAgICAgcm9vdENvbnRleHQuZmxhZ3MgJj0gfjIgLyogRmx1c2hQbGF5ZXJzICovOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJIYW5kbGVyID0gcm9vdENvbnRleHQucGxheWVySGFuZGxlcjsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVySGFuZGxlcikgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJIYW5kbGVyLmZsdXNoUGxheWVycygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJvb3RDb250ZXh0LmNsZWFuID0gX0NMRUFOX1BST01JU0U7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAocmVzKSkobnVsbCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcm9vdENvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRpY2tSb290Q29udGV4dChyb290Q29udGV4dCkgewogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcm9vdENvbnRleHQuY29tcG9uZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3RDb21wb25lbnQgPSByb290Q29udGV4dC5jb21wb25lbnRzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlYWRQYXRjaGVkTFZpZXcocm9vdENvbXBvbmVudCkpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGxWaWV3W1RWSUVXXTsKICAgICAgICAgICAgcmVuZGVyQ29tcG9uZW50T3JUZW1wbGF0ZSh0VmlldywgbFZpZXcsIHRWaWV3LnRlbXBsYXRlLCByb290Q29tcG9uZW50KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRldGVjdENoYW5nZXNJbnRlcm5hbCh0VmlldywgbFZpZXcsIGNvbnRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXJGYWN0b3J5ID0gbFZpZXdbUkVOREVSRVJfRkFDVE9SWV07CiAgICAgICAgaWYgKHJlbmRlcmVyRmFjdG9yeS5iZWdpbikKICAgICAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmJlZ2luKCk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgcmVmcmVzaFZpZXcodFZpZXcsIGxWaWV3LCB0Vmlldy50ZW1wbGF0ZSwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpOwogICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICB9CiAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgIGlmIChyZW5kZXJlckZhY3RvcnkuZW5kKQogICAgICAgICAgICAgICAgcmVuZGVyZXJGYWN0b3J5LmVuZCgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSByb290IHZpZXcgYW5kIGl0cyBjb21wb25lbnRzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgd2hpY2ggdGhlIGNoYW5nZSBkZXRlY3Rpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCBvbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRldGVjdENoYW5nZXNJblJvb3RWaWV3KGxWaWV3KSB7CiAgICAgICAgdGlja1Jvb3RDb250ZXh0KCgvKiogQHR5cGUgez99ICovIChsVmlld1tDT05URVhUXSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja05vQ2hhbmdlc0ludGVybmFsKHRWaWV3LCB2aWV3LCBjb250ZXh0KSB7CiAgICAgICAgc2V0Q2hlY2tOb0NoYW5nZXNNb2RlKHRydWUpOwogICAgICAgIHRyeSB7CiAgICAgICAgICAgIGRldGVjdENoYW5nZXNJbnRlcm5hbCh0VmlldywgdmlldywgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUoZmFsc2UpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHRoZSBjaGFuZ2UgZGV0ZWN0b3Igb24gYSByb290IHZpZXcgYW5kIGl0cyBjb21wb25lbnRzLCBhbmQgdGhyb3dzIGlmIGFueSBjaGFuZ2VzIGFyZQogICAgICogZGV0ZWN0ZWQuCiAgICAgKgogICAgICogVGhpcyBpcyB1c2VkIGluIGRldmVsb3BtZW50IG1vZGUgdG8gdmVyaWZ5IHRoYXQgcnVubmluZyBjaGFuZ2UgZGV0ZWN0aW9uIGRvZXNuJ3QKICAgICAqIGludHJvZHVjZSBvdGhlciBjaGFuZ2VzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgd2hpY2ggdGhlIGNoYW5nZSBkZXRlY3Rpb24gc2hvdWxkIGJlIGNoZWNrZWQgb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja05vQ2hhbmdlc0luUm9vdFZpZXcobFZpZXcpIHsKICAgICAgICBzZXRDaGVja05vQ2hhbmdlc01vZGUodHJ1ZSk7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgZGV0ZWN0Q2hhbmdlc0luUm9vdFZpZXcobFZpZXcpOwogICAgICAgIH0KICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgc2V0Q2hlY2tOb0NoYW5nZXNNb2RlKGZhbHNlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGZsYWdzCiAgICAgKiBAcGFyYW0gez99IHZpZXdRdWVyeUZuCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXhlY3V0ZVZpZXdRdWVyeUZuKGZsYWdzLCB2aWV3UXVlcnlGbiwgY29tcG9uZW50KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodmlld1F1ZXJ5Rm4sICdWaWV3IHF1ZXJpZXMgZnVuY3Rpb24gdG8gZXhlY3V0ZSBtdXN0IGJlIGRlZmluZWQuJyk7CiAgICAgICAgc2V0Q3VycmVudFF1ZXJ5SW5kZXgoMCk7CiAgICAgICAgdmlld1F1ZXJ5Rm4oZmxhZ3MsIGNvbXBvbmVudCk7CiAgICB9CiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLy8vIEJpbmRpbmdzICYgaW50ZXJwb2xhdGlvbnMKICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8qKgogICAgICogU3RvcmVzIG1ldGEtZGF0YSBmb3IgYSBwcm9wZXJ0eSBiaW5kaW5nIHRvIGJlIHVzZWQgYnkgVGVzdEJlZCdzIGBEZWJ1Z0VsZW1lbnQucHJvcGVydGllc2AuCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gc3VwcG9ydCBUZXN0QmVkJ3MgYERlYnVnRWxlbWVudC5wcm9wZXJ0aWVzYCB3ZSBuZWVkIHRvIHNhdmUsIGZvciBlYWNoIGJpbmRpbmc6CiAgICAgKiAtIGEgYm91bmQgcHJvcGVydHkgbmFtZTsKICAgICAqIC0gYSBzdGF0aWMgcGFydHMgb2YgaW50ZXJwb2xhdGVkIHN0cmluZ3M7CiAgICAgKgogICAgICogQSBnaXZlbiBwcm9wZXJ0eSBtZXRhZGF0YSBpcyBzYXZlZCBhdCB0aGUgYmluZGluZydzIGluZGV4IGluIHRoZSBgVFZpZXcuZGF0YWAgKGluIG90aGVyIHdvcmRzLCBhCiAgICAgKiBwcm9wZXJ0eSBiaW5kaW5nIG1ldGFkYXRhIHdpbGwgYmUgc3RvcmVkIGluIGBUVmlldy5kYXRhYCBhdCB0aGUgc2FtZSBpbmRleCBhcyBhIGJvdW5kIHZhbHVlIGluCiAgICAgKiBgTFZpZXdgKS4gTWV0YWRhdGEgYXJlIHJlcHJlc2VudGVkIGFzIGBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUmAtZGVsaW1pdGVkIHN0cmluZyB3aXRoIHRoZQogICAgICogZm9sbG93aW5nIGZvcm1hdDoKICAgICAqIC0gYHByb3BlcnR5TmFtZWAgZm9yIGJvdW5kIHByb3BlcnRpZXM7CiAgICAgKiAtIGBwcm9wZXJ0eU5hbWXvv71wcmVmaXjvv71pbnRlcnBvbGF0aW9uX3N0YXRpY19wYXJ0Me+/vS4uaW50ZXJwb2xhdGlvbl9zdGF0aWNfcGFydE7vv71zdWZmaXhgIGZvcgogICAgICogaW50ZXJwb2xhdGVkIHByb3BlcnRpZXMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0RGF0YSBgVERhdGFgIHdoZXJlIG1ldGEtZGF0YSB3aWxsIGJlIHNhdmVkOwogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIHRoYXQgaXMgYSB0YXJnZXQgb2YgdGhlIGJpbmRpbmc7CiAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZSBib3VuZCBwcm9wZXJ0eSBuYW1lOwogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggYmluZGluZyBpbmRleCBpbiBgTFZpZXdgCiAgICAgKiBAcGFyYW0gey4uLj99IGludGVycG9sYXRpb25QYXJ0cyBzdGF0aWMgaW50ZXJwb2xhdGlvbiBwYXJ0cyAoZm9yIHByb3BlcnR5IGludGVycG9sYXRpb25zKQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0RGF0YSwgdE5vZGUsIHByb3BlcnR5TmFtZSwgYmluZGluZ0luZGV4LCAuLi5pbnRlcnBvbGF0aW9uUGFydHMpIHsKICAgICAgICAvLyBCaW5kaW5nIG1ldGEtZGF0YSBhcmUgc3RvcmVkIG9ubHkgdGhlIGZpcnN0IHRpbWUgYSBnaXZlbiBwcm9wZXJ0eSBpbnN0cnVjdGlvbiBpcyBwcm9jZXNzZWQuCiAgICAgICAgLy8gU2luY2Ugd2UgZG9uJ3QgaGF2ZSBhIGNvbmNlcHQgb2YgdGhlICJmaXJzdCB1cGRhdGUgcGFzcyIgd2UgbmVlZCB0byBjaGVjayBmb3IgcHJlc2VuY2Ugb2YgdGhlCiAgICAgICAgLy8gYmluZGluZyBtZXRhLWRhdGEgdG8gZGVjaWRlIGlmIG9uZSBzaG91bGQgYmUgc3RvcmVkIChvciBpZiB3YXMgc3RvcmVkIGFscmVhZHkpLgogICAgICAgIGlmICh0RGF0YVtiaW5kaW5nSW5kZXhdID09PSBudWxsKSB7CiAgICAgICAgICAgIGlmICh0Tm9kZS5pbnB1dHMgPT0gbnVsbCB8fCAhdE5vZGUuaW5wdXRzW3Byb3BlcnR5TmFtZV0pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByb3BCaW5kaW5nSWR4cyA9IHROb2RlLnByb3BlcnR5QmluZGluZ3MgfHwgKHROb2RlLnByb3BlcnR5QmluZGluZ3MgPSBbXSk7CiAgICAgICAgICAgICAgICBwcm9wQmluZGluZ0lkeHMucHVzaChiaW5kaW5nSW5kZXgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGJpbmRpbmdNZXRhZGF0YSA9IHByb3BlcnR5TmFtZTsKICAgICAgICAgICAgICAgIGlmIChpbnRlcnBvbGF0aW9uUGFydHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgIGJpbmRpbmdNZXRhZGF0YSArPQogICAgICAgICAgICAgICAgICAgICAgICBJTlRFUlBPTEFUSU9OX0RFTElNSVRFUiArIGludGVycG9sYXRpb25QYXJ0cy5qb2luKElOVEVSUE9MQVRJT05fREVMSU1JVEVSKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHREYXRhW2JpbmRpbmdJbmRleF0gPSBiaW5kaW5nTWV0YWRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDTEVBTl9QUk9NSVNFID0gX0NMRUFOX1BST01JU0U7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TENsZWFudXAodmlldykgewogICAgICAgIC8vIHRvcCBsZXZlbCB2YXJpYWJsZXMgc2hvdWxkIG5vdCBiZSBleHBvcnRlZCBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyAoUEVSRl9OT1RFUy5tZCkKICAgICAgICByZXR1cm4gdmlld1tDTEVBTlVQXSB8fCAodmlld1tDTEVBTlVQXSA9IG5nRGV2TW9kZSA/IG5ldyBMQ2xlYW51cCgpIDogW10pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRUVmlld0NsZWFudXAodFZpZXcpIHsKICAgICAgICByZXR1cm4gdFZpZXcuY2xlYW51cCB8fCAodFZpZXcuY2xlYW51cCA9IG5nRGV2TW9kZSA/IG5ldyBUQ2xlYW51cCgpIDogW10pOwogICAgfQogICAgLyoqCiAgICAgKiBUaGVyZSBhcmUgY2FzZXMgd2hlcmUgdGhlIHN1YiBjb21wb25lbnQncyByZW5kZXJlciBuZWVkcyB0byBiZSBpbmNsdWRlZAogICAgICogaW5zdGVhZCBvZiB0aGUgY3VycmVudCByZW5kZXJlciAoc2VlIHRoZSBjb21wb25lbnRTeW50aGV0aWNIb3N0KiBpbnN0cnVjdGlvbnMpLgogICAgICogQHBhcmFtIHs/fSBjdXJyZW50RGVmCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBsb2FkQ29tcG9uZW50UmVuZGVyZXIoY3VycmVudERlZiwgdE5vZGUsIGxWaWV3KSB7CiAgICAgICAgLy8gVE9ETyhGVy0yMDQzKTogdGhlIGBjdXJyZW50RGVmYCBpcyBudWxsIHdoZW4gaG9zdCBiaW5kaW5ncyBhcmUgaW52b2tlZCB3aGlsZSBjcmVhdGluZyByb290CiAgICAgICAgLy8gY29tcG9uZW50IChzZWUgcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9jb21wb25lbnQudHMpLiBUaGlzIGlzIG5vdCBjb25zaXN0ZW50IHdpdGggdGhlIHByb2Nlc3MKICAgICAgICAvLyBvZiBjcmVhdGluZyBpbm5lciBjb21wb25lbnRzLCB3aGVuIGN1cnJlbnQgZGlyZWN0aXZlIGluZGV4IGlzIGF2YWlsYWJsZSBpbiB0aGUgc3RhdGUuIEluIG9yZGVyCiAgICAgICAgLy8gdG8gYXZvaWQgcmVseWluZyBvbiBjdXJyZW50IGRlZiBiZWluZyBgbnVsbGAgKHRodXMgc3BlY2lhbC1jYXNpbmcgcm9vdCBjb21wb25lbnQgY3JlYXRpb24pLCB0aGUKICAgICAgICAvLyBwcm9jZXNzIG9mIGNyZWF0aW5nIHJvb3QgY29tcG9uZW50IHNob3VsZCBiZSB1bmlmaWVkIHdpdGggdGhlIHByb2Nlc3Mgb2YgY3JlYXRpbmcgaW5uZXIKICAgICAgICAvLyBjb21wb25lbnRzLgogICAgICAgIGlmIChjdXJyZW50RGVmID09PSBudWxsIHx8IGlzQ29tcG9uZW50RGVmKGN1cnJlbnREZWYpKSB7CiAgICAgICAgICAgIGxWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHVud3JhcExWaWV3KGxWaWV3W3ROb2RlLmluZGV4XSkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxWaWV3W1JFTkRFUkVSXTsKICAgIH0KICAgIC8qKgogICAgICogSGFuZGxlcyBhbiBlcnJvciB0aHJvd24gaW4gYW4gTFZpZXcuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBoYW5kbGVFcnJvcihsVmlldywgZXJyb3IpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBsVmlld1tJTkpFQ1RPUiQxXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXJyb3JIYW5kbGVyID0gaW5qZWN0b3IgPyBpbmplY3Rvci5nZXQoRXJyb3JIYW5kbGVyLCBudWxsKSA6IG51bGw7CiAgICAgICAgZXJyb3JIYW5kbGVyICYmIGVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUgaW5wdXRzIG9mIGRpcmVjdGl2ZXMgYXQgdGhlIGN1cnJlbnQgbm9kZSB0byBjb3JyZXNwb25kaW5nIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGN1cnJlbnQgVFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGBMVmlld2Agd2hpY2ggY29udGFpbnMgdGhlIGRpcmVjdGl2ZXMuCiAgICAgKiBAcGFyYW0gez99IGlucHV0cyBtYXBwaW5nIGJldHdlZW4gdGhlIHB1YmxpYyAiaW5wdXQiIG5hbWUgYW5kIHByaXZhdGVseS1rbm93biwKICAgICAqICAgICAgICBwb3NzaWJseSBtaW5pZmllZCwgcHJvcGVydHkgbmFtZXMgdG8gd3JpdGUgdG8uCiAgICAgKiBAcGFyYW0gez99IHB1YmxpY05hbWUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVmFsdWUgdG8gc2V0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0SW5wdXRzRm9yUHJvcGVydHkodFZpZXcsIGxWaWV3LCBpbnB1dHMsIHB1YmxpY05hbWUsIHZhbHVlKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dHMubGVuZ3RoOykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKGlucHV0c1tpKytdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJpdmF0ZU5hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5wdXRzW2krK10pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9IGxWaWV3W2luZGV4XTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBpbmRleCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LmRhdGFbaW5kZXhdKSk7CiAgICAgICAgICAgIGlmIChkZWYuc2V0SW5wdXQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChkZWYuc2V0SW5wdXQpKShpbnN0YW5jZSwgdmFsdWUsIHB1YmxpY05hbWUsIHByaXZhdGVOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGluc3RhbmNlW3ByaXZhdGVOYW1lXSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIGEgdGV4dCBiaW5kaW5nIGF0IGEgZ2l2ZW4gaW5kZXggaW4gYSBnaXZlbiBMVmlldy4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGluZGV4LCB2YWx1ZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb3RTYW1lKHZhbHVlLCAoLyoqIEB0eXBlIHs/fSAqLyAoTk9fQ0hBTkdFKSksICd2YWx1ZSBzaG91bGQgbm90IGJlIE5PX0NIQU5HRScpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgaW5kZXggKyBIRUFERVJfT0ZGU0VUKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlJbmRleChpbmRleCwgbFZpZXcpKSkpKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChlbGVtZW50LCAnbmF0aXZlIGVsZW1lbnQgc2hvdWxkIGV4aXN0Jyk7CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIuc2V0VmFsdWUoZWxlbWVudCwgdmFsdWUpIDogZWxlbWVudC50ZXh0Q29udGVudCA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGVtYmVkZGVkVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TENvbnRhaW5lcih0Tm9kZSwgZW1iZWRkZWRWaWV3KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExWaWV3KGVtYmVkZGVkVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChlbWJlZGRlZFZpZXdbUEFSRU5UXSkpOwogICAgICAgIGlmICh0Tm9kZS5pbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGR5bmFtaWNhbGx5IGNyZWF0ZWQgdmlldyBpbnNpZGUgYSBkeW5hbWljIGNvbnRhaW5lci4KICAgICAgICAgICAgLy8gVGhlIHBhcmVudCBpc24ndCBhbiBMQ29udGFpbmVyIGlmIHRoZSBlbWJlZGRlZCB2aWV3IGhhc24ndCBiZWVuIGF0dGFjaGVkIHlldC4KICAgICAgICAgICAgcmV0dXJuIGlzTENvbnRhaW5lcihjb250YWluZXIpID8gY29udGFpbmVyIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGNvbnRhaW5lcik7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBpbmxpbmUgdmlldyBub2RlIChlLmcuIGVtYmVkZGVkVmlld1N0YXJ0KQogICAgICAgICAgICByZXR1cm4gY29udGFpbmVyOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHJlbmRlciBwYXJlbnQgZm9yIGEgZ2l2ZW4gdmlldy4KICAgICAqIE1pZ2h0IGJlIG51bGwgaWYgYSB2aWV3IGlzIG5vdCB5ZXQgYXR0YWNoZWQgdG8gYW55IGNvbnRhaW5lci4KICAgICAqIEBwYXJhbSB7P30gdFZpZXdOb2RlCiAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbnRhaW5lclJlbmRlclBhcmVudCh0Vmlld05vZGUsIHZpZXcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGFpbmVyID0gZ2V0TENvbnRhaW5lcih0Vmlld05vZGUsIHZpZXcpOwogICAgICAgIHJldHVybiBjb250YWluZXIgPyBuYXRpdmVQYXJlbnROb2RlKHZpZXdbUkVOREVSRVJdLCBjb250YWluZXJbTkFUSVZFXSkgOiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBOT1RFOiBmb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlIHBvc3NpYmxlIGFjdGlvbnMgYXJlIGlubGluZWQgd2l0aGluIHRoZSBmdW5jdGlvbiBpbnN0ZWFkIG9mCiAgICAgKiBiZWluZyBwYXNzZWQgYXMgYW4gYXJndW1lbnQuCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gbE5vZGVUb0hhbmRsZQogICAgICogQHBhcmFtIHs/PX0gYmVmb3JlTm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCBwYXJlbnQsIGxOb2RlVG9IYW5kbGUsIGJlZm9yZU5vZGUpIHsKICAgICAgICAvLyBJZiB0aGlzIHNsb3Qgd2FzIGFsbG9jYXRlZCBmb3IgYSB0ZXh0IG5vZGUgZHluYW1pY2FsbHkgY3JlYXRlZCBieSBpMThuLCB0aGUgdGV4dCBub2RlIGl0c2VsZgogICAgICAgIC8vIHdvbid0IGJlIGNyZWF0ZWQgdW50aWwgaTE4bkFwcGx5KCkgaW4gdGhlIHVwZGF0ZSBibG9jaywgc28gdGhpcyBub2RlIHNob3VsZCBiZSBza2lwcGVkLgogICAgICAgIC8vIEZvciBtb3JlIGluZm8sIHNlZSAiSUNVIGV4cHJlc3Npb25zIHNob3VsZCB3b3JrIGluc2lkZSBhbiBuZ1RlbXBsYXRlT3V0bGV0IGluc2lkZSBhbiBuZ0ZvciIKICAgICAgICAvLyBpbiBgaTE4bl9zcGVjLnRzYC4KICAgICAgICBpZiAobE5vZGVUb0hhbmRsZSAhPSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGxDb250YWluZXI7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGlzQ29tcG9uZW50ID0gZmFsc2U7CiAgICAgICAgICAgIC8vIFdlIGFyZSBleHBlY3RpbmcgYW4gUk5vZGUsIGJ1dCBpbiB0aGUgY2FzZSBvZiBhIGNvbXBvbmVudCBvciBMQ29udGFpbmVyIHRoZSBgUk5vZGVgIGlzCiAgICAgICAgICAgIC8vIHdyYXBwZWQgaW4gYW4gYXJyYXkgd2hpY2ggbmVlZHMgdG8gYmUgdW53cmFwcGVkLiBXZSBuZWVkIHRvIGtub3cgaWYgaXQgaXMgYSBjb21wb25lbnQgYW5kIGlmCiAgICAgICAgICAgIC8vIGl0IGhhcyBMQ29udGFpbmVyIHNvIHRoYXQgd2UgY2FuIHByb2Nlc3MgYWxsIG9mIHRob3NlIGNhc2VzIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgIGlmIChpc0xDb250YWluZXIobE5vZGVUb0hhbmRsZSkpIHsKICAgICAgICAgICAgICAgIGxDb250YWluZXIgPSBsTm9kZVRvSGFuZGxlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzTFZpZXcobE5vZGVUb0hhbmRsZSkpIHsKICAgICAgICAgICAgICAgIGlzQ29tcG9uZW50ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGxOb2RlVG9IYW5kbGVbSE9TVF0sICdIT1NUIG11c3QgYmUgZGVmaW5lZCBmb3IgYSBjb21wb25lbnQgTFZpZXcnKTsKICAgICAgICAgICAgICAgIGxOb2RlVG9IYW5kbGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAobE5vZGVUb0hhbmRsZVtIT1NUXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgck5vZGUgPSB1bndyYXBSTm9kZShsTm9kZVRvSGFuZGxlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmICFpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgJiYgYXNzZXJ0RG9tTm9kZShyTm9kZSk7CiAgICAgICAgICAgIGlmIChhY3Rpb24gPT09IDAgLyogQ3JlYXRlICovICYmIHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKGJlZm9yZU5vZGUgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG5hdGl2ZUFwcGVuZENoaWxkKHJlbmRlcmVyLCBwYXJlbnQsIHJOb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5hdGl2ZUluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCByTm9kZSwgYmVmb3JlTm9kZSB8fCBudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChhY3Rpb24gPT09IDEgLyogSW5zZXJ0ICovICYmIHBhcmVudCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCBwYXJlbnQsIHJOb2RlLCBiZWZvcmVOb2RlIHx8IG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGFjdGlvbiA9PT0gMiAvKiBEZXRhY2ggKi8pIHsKICAgICAgICAgICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUocmVuZGVyZXIsIHJOb2RlLCBpc0NvbXBvbmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoYWN0aW9uID09PSAzIC8qIERlc3Ryb3kgKi8pIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJEZXN0cm95Tm9kZSsrOwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuZGVzdHJveU5vZGUpKShyTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxDb250YWluZXIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgYXBwbHlDb250YWluZXIocmVuZGVyZXIsIGFjdGlvbiwgbENvbnRhaW5lciwgcGFyZW50LCBiZWZvcmVOb2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSByZW5kZXJlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGV4dE5vZGUodmFsdWUsIHJlbmRlcmVyKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZVRleHROb2RlKys7CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFRleHQrKzsKICAgICAgICByZXR1cm4gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIuY3JlYXRlVGV4dCh2YWx1ZSkgOgogICAgICAgICAgICByZW5kZXJlci5jcmVhdGVUZXh0Tm9kZSh2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gaW5zZXJ0TW9kZQogICAgICogQHBhcmFtIHs/fSBiZWZvcmVOb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRSZW1vdmVWaWV3RnJvbUNvbnRhaW5lcih0VmlldywgbFZpZXcsIGluc2VydE1vZGUsIGJlZm9yZU5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyUGFyZW50ID0gZ2V0Q29udGFpbmVyUmVuZGVyUGFyZW50KCgvKiogQHR5cGUgez99ICovICh0Vmlldy5ub2RlKSksIGxWaWV3KTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUoKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3Lm5vZGUpKSwgMiAvKiBWaWV3ICovKTsKICAgICAgICBpZiAocmVuZGVyUGFyZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gaW5zZXJ0TW9kZSA/IDEgLyogSW5zZXJ0ICovIDogMiAvKiBEZXRhY2ggKi87CiAgICAgICAgICAgIGFwcGx5Vmlldyh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCBhY3Rpb24sIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXRhY2ggYSBgTFZpZXdgIGZyb20gdGhlIERPTSBieSBkZXRhY2hpbmcgaXRzIG5vZGVzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgb2YgdGhlIGBMVmlld2AgdG8gYmUgZGV0YWNoZWQKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgdGhlIGBMVmlld2AgdG8gYmUgZGV0YWNoZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW5kZXJEZXRhY2hWaWV3KHRWaWV3LCBsVmlldykgewogICAgICAgIGFwcGx5Vmlldyh0VmlldywgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgMiAvKiBEZXRhY2ggKi8sIG51bGwsIG51bGwpOwogICAgfQogICAgLyoqCiAgICAgKiBUcmF2ZXJzZXMgZG93biBhbmQgdXAgdGhlIHRyZWUgb2Ygdmlld3MgYW5kIGNvbnRhaW5lcnMgdG8gcmVtb3ZlIGxpc3RlbmVycyBhbmQKICAgICAqIGNhbGwgb25EZXN0cm95IGNhbGxiYWNrcy4KICAgICAqCiAgICAgKiBOb3RlczoKICAgICAqICAtIEJlY2F1c2UgaXQncyB1c2VkIGZvciBvbkRlc3Ryb3kgY2FsbHMsIGl0IG5lZWRzIHRvIGJlIGJvdHRvbS11cC4KICAgICAqICAtIE11c3QgcHJvY2VzcyBjb250YWluZXJzIGluc3RlYWQgb2YgdGhlaXIgdmlld3MgdG8gYXZvaWQgc3BsaWNpbmcKICAgICAqICB3aGVuIHZpZXdzIGFyZSBkZXN0cm95ZWQgYW5kIHJlLWFkZGVkLgogICAgICogIC0gVXNpbmcgYSB3aGlsZSBsb29wIGJlY2F1c2UgaXQncyBmYXN0ZXIgdGhhbiByZWN1cnNpb24KICAgICAqICAtIERlc3Ryb3kgb25seSBjYWxsZWQgb24gbW92ZW1lbnQgdG8gc2libGluZyBvciBtb3ZlbWVudCB0byBwYXJlbnQgKGxhdGVyYWxseSBvciB1cCkKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJvb3RWaWV3IFRoZSB2aWV3IHRvIGRlc3Ryb3kKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlc3Ryb3lWaWV3VHJlZShyb290VmlldykgewogICAgICAgIC8vIElmIHRoZSB2aWV3IGhhcyBubyBjaGlsZHJlbiwgd2UgY2FuIGNsZWFuIGl0IHVwIGFuZCByZXR1cm4gZWFybHkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBsVmlld09yTENvbnRhaW5lciA9IHJvb3RWaWV3W0NISUxEX0hFQURdOwogICAgICAgIGlmICghbFZpZXdPckxDb250YWluZXIpIHsKICAgICAgICAgICAgcmV0dXJuIGNsZWFuVXBWaWV3KHJvb3RWaWV3W1RWSUVXXSwgcm9vdFZpZXcpOwogICAgICAgIH0KICAgICAgICB3aGlsZSAobFZpZXdPckxDb250YWluZXIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbmV4dCA9IG51bGw7CiAgICAgICAgICAgIGlmIChpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSkgewogICAgICAgICAgICAgICAgLy8gSWYgTFZpZXcsIHRyYXZlcnNlIGRvd24gdG8gY2hpbGQuCiAgICAgICAgICAgICAgICBuZXh0ID0gbFZpZXdPckxDb250YWluZXJbQ0hJTERfSEVBRF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihsVmlld09yTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAvLyBJZiBjb250YWluZXIsIHRyYXZlcnNlIGRvd24gdG8gaXRzIGZpcnN0IExWaWV3LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmlyc3RWaWV3ID0gbFZpZXdPckxDb250YWluZXJbQ09OVEFJTkVSX0hFQURFUl9PRkZTRVRdOwogICAgICAgICAgICAgICAgaWYgKGZpcnN0VmlldykKICAgICAgICAgICAgICAgICAgICBuZXh0ID0gZmlyc3RWaWV3OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghbmV4dCkgewogICAgICAgICAgICAgICAgLy8gT25seSBjbGVhbiB1cCB2aWV3IHdoZW4gbW92aW5nIHRvIHRoZSBzaWRlIG9yIHVwLCBhcyBkZXN0cm95IGhvb2tzCiAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgY2FsbGVkIGluIG9yZGVyIGZyb20gdGhlIGJvdHRvbSB1cC4KICAgICAgICAgICAgICAgIHdoaWxlIChsVmlld09yTENvbnRhaW5lciAmJiAhKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3T3JMQ29udGFpbmVyKSlbTkVYVF0gJiYgbFZpZXdPckxDb250YWluZXIgIT09IHJvb3RWaWV3KSB7CiAgICAgICAgICAgICAgICAgICAgaXNMVmlldyhsVmlld09yTENvbnRhaW5lcikgJiYgY2xlYW5VcFZpZXcobFZpZXdPckxDb250YWluZXJbVFZJRVddLCBsVmlld09yTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgbFZpZXdPckxDb250YWluZXIgPSBnZXRQYXJlbnRTdGF0ZShsVmlld09yTENvbnRhaW5lciwgcm9vdFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGxWaWV3T3JMQ29udGFpbmVyID09PSBudWxsKQogICAgICAgICAgICAgICAgICAgIGxWaWV3T3JMQ29udGFpbmVyID0gcm9vdFZpZXc7CiAgICAgICAgICAgICAgICBpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSAmJiBjbGVhblVwVmlldyhsVmlld09yTENvbnRhaW5lcltUVklFV10sIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIG5leHQgPSBsVmlld09yTENvbnRhaW5lciAmJiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdPckxDb250YWluZXIpKVtORVhUXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsVmlld09yTENvbnRhaW5lciA9IG5leHQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJbnNlcnRzIGEgdmlldyBpbnRvIGEgY29udGFpbmVyLgogICAgICoKICAgICAqIFRoaXMgYWRkcyB0aGUgdmlldyB0byB0aGUgY29udGFpbmVyJ3MgYXJyYXkgb2YgYWN0aXZlIHZpZXdzIGluIHRoZSBjb3JyZWN0CiAgICAgKiBwb3NpdGlvbi4gSXQgYWxzbyBhZGRzIHRoZSB2aWV3J3MgZWxlbWVudHMgdG8gdGhlIERPTSBpZiB0aGUgY29udGFpbmVyIGlzbid0IGEKICAgICAqIHJvb3Qgbm9kZSBvZiBhbm90aGVyIHZpZXcgKGluIHRoYXQgY2FzZSwgdGhlIHZpZXcncyBlbGVtZW50cyB3aWxsIGJlIGFkZGVkIHdoZW4KICAgICAqIHRoZSBjb250YWluZXIncyBwYXJlbnQgdmlldyBpcyBhZGRlZCBsYXRlcikuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3JyBvZiB0aGUgYExWaWV3YCB0byBpbnNlcnQKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdG8gaW5zZXJ0CiAgICAgKiBAcGFyYW0gez99IGxDb250YWluZXIgVGhlIGNvbnRhaW5lciBpbnRvIHdoaWNoIHRoZSB2aWV3IHNob3VsZCBiZSBpbnNlcnRlZAogICAgICogQHBhcmFtIHs/fSBpbmRleCBXaGljaCBpbmRleCBpbiB0aGUgY29udGFpbmVyIHRvIGluc2VydCB0aGUgY2hpbGQgdmlldyBpbnRvCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnNlcnRWaWV3KHRWaWV3LCBsVmlldywgbENvbnRhaW5lciwgaW5kZXgpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGxDb250YWluZXIpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleEluQ29udGFpbmVyID0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQgKyBpbmRleDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGFpbmVyTGVuZ3RoID0gbENvbnRhaW5lci5sZW5ndGg7CiAgICAgICAgaWYgKGluZGV4ID4gMCkgewogICAgICAgICAgICAvLyBUaGlzIGlzIGEgbmV3IHZpZXcsIHdlIG5lZWQgdG8gYWRkIGl0IHRvIHRoZSBjaGlsZHJlbi4KICAgICAgICAgICAgbENvbnRhaW5lcltpbmRleEluQ29udGFpbmVyIC0gMV1bTkVYVF0gPSBsVmlldzsKICAgICAgICB9CiAgICAgICAgaWYgKGluZGV4IDwgY29udGFpbmVyTGVuZ3RoIC0gQ09OVEFJTkVSX0hFQURFUl9PRkZTRVQpIHsKICAgICAgICAgICAgbFZpZXdbTkVYVF0gPSBsQ29udGFpbmVyW2luZGV4SW5Db250YWluZXJdOwogICAgICAgICAgICBhZGRUb0FycmF5KGxDb250YWluZXIsIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUICsgaW5kZXgsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGxDb250YWluZXIucHVzaChsVmlldyk7CiAgICAgICAgICAgIGxWaWV3W05FWFRdID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgbFZpZXdbUEFSRU5UXSA9IGxDb250YWluZXI7CiAgICAgICAgLy8gdHJhY2sgdmlld3Mgd2hlcmUgZGVjbGFyYXRpb24gYW5kIGluc2VydGlvbiBwb2ludHMgYXJlIGRpZmZlcmVudAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSBsVmlld1tERUNMQVJBVElPTl9MQ09OVEFJTkVSXTsKICAgICAgICBpZiAoZGVjbGFyYXRpb25MQ29udGFpbmVyICE9PSBudWxsICYmIGxDb250YWluZXIgIT09IGRlY2xhcmF0aW9uTENvbnRhaW5lcikgewogICAgICAgICAgICB0cmFja01vdmVkVmlldyhkZWNsYXJhdGlvbkxDb250YWluZXIsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgLy8gbm90aWZ5IHF1ZXJ5IHRoYXQgYSBuZXcgdmlldyBoYXMgYmVlbiBhZGRlZAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsUXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdOwogICAgICAgIGlmIChsUXVlcmllcyAhPT0gbnVsbCkgewogICAgICAgICAgICBsUXVlcmllcy5pbnNlcnRWaWV3KHRWaWV3KTsKICAgICAgICB9CiAgICAgICAgLy8gU2V0cyB0aGUgYXR0YWNoZWQgZmxhZwogICAgICAgIGxWaWV3W0ZMQUdTXSB8PSAxMjggLyogQXR0YWNoZWQgKi87CiAgICB9CiAgICAvKioKICAgICAqIFRyYWNrIHZpZXdzIGNyZWF0ZWQgZnJvbSB0aGUgZGVjbGFyYXRpb24gY29udGFpbmVyIChUZW1wbGF0ZVJlZikgYW5kIGluc2VydGVkIGludG8gYQogICAgICogZGlmZmVyZW50IExDb250YWluZXIuCiAgICAgKiBAcGFyYW0gez99IGRlY2xhcmF0aW9uQ29udGFpbmVyCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0cmFja01vdmVkVmlldyhkZWNsYXJhdGlvbkNvbnRhaW5lciwgbFZpZXcpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChsVmlldywgJ0xWaWV3IHJlcXVpcmVkJyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIoZGVjbGFyYXRpb25Db250YWluZXIpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtb3ZlZFZpZXdzID0gZGVjbGFyYXRpb25Db250YWluZXJbTU9WRURfVklFV1NdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnNlcnRlZExDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUEFSRU5UXSkpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGluc2VydGVkTENvbnRhaW5lcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluc2VydGVkQ29tcG9uZW50TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaW5zZXJ0ZWRMQ29udGFpbmVyW1BBUkVOVF0pKVtERUNMQVJBVElPTl9DT01QT05FTlRfVklFV107CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQoaW5zZXJ0ZWRDb21wb25lbnRMVmlldywgJ01pc3NpbmcgaW5zZXJ0ZWRDb21wb25lbnRMVmlldycpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJlZENvbXBvbmVudExWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGRlY2xhcmVkQ29tcG9uZW50TFZpZXcsICdNaXNzaW5nIGRlY2xhcmVkQ29tcG9uZW50TFZpZXcnKTsKICAgICAgICBpZiAoZGVjbGFyZWRDb21wb25lbnRMVmlldyAhPT0gaW5zZXJ0ZWRDb21wb25lbnRMVmlldykgewogICAgICAgICAgICAvLyBBdCB0aGlzIHBvaW50IHRoZSBkZWNsYXJhdGlvbi1jb21wb25lbnQgaXMgbm90IHNhbWUgYXMgaW5zZXJ0aW9uLWNvbXBvbmVudDsgdGhpcyBtZWFucyB0aGF0CiAgICAgICAgICAgIC8vIHRoaXMgaXMgYSB0cmFuc3BsYW50ZWQgdmlldy4gTWFyayB0aGUgZGVjbGFyZWQgbFZpZXcgYXMgaGF2aW5nIHRyYW5zcGxhbnRlZCB2aWV3cyBzbyB0aGF0CiAgICAgICAgICAgIC8vIHRob3NlIHZpZXdzIGNhbiBwYXJ0aWNpcGF0ZSBpbiBDRC4KICAgICAgICAgICAgZGVjbGFyYXRpb25Db250YWluZXJbSEFTX1RSQU5TUExBTlRFRF9WSUVXU10gPSB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAobW92ZWRWaWV3cyA9PT0gbnVsbCkgewogICAgICAgICAgICBkZWNsYXJhdGlvbkNvbnRhaW5lcltNT1ZFRF9WSUVXU10gPSBbbFZpZXddOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbW92ZWRWaWV3cy5wdXNoKGxWaWV3KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZGVjbGFyYXRpb25Db250YWluZXIKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRldGFjaE1vdmVkVmlldyhkZWNsYXJhdGlvbkNvbnRhaW5lciwgbFZpZXcpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihkZWNsYXJhdGlvbkNvbnRhaW5lcik7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydERlZmluZWQoZGVjbGFyYXRpb25Db250YWluZXJbTU9WRURfVklFV1NdLCAnQSBwcm9qZWN0ZWQgdmlldyBzaG91bGQgYmVsb25nIHRvIGEgbm9uLWVtcHR5IHByb2plY3RlZCB2aWV3cyBjb2xsZWN0aW9uJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1vdmVkVmlld3MgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVjbGFyYXRpb25Db250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uVmlld0luZGV4ID0gbW92ZWRWaWV3cy5pbmRleE9mKGxWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5zZXJ0aW9uTENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tQQVJFTlRdKSk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydExDb250YWluZXIoaW5zZXJ0aW9uTENvbnRhaW5lcik7CiAgICAgICAgLy8gSWYgdGhlIHZpZXcgd2FzIG1hcmtlZCBmb3IgcmVmcmVzaCBidXQgdGhlbiBkZXRhY2hlZCBiZWZvcmUgaXQgd2FzIGNoZWNrZWQgKHdoZXJlIHRoZSBmbGFnCiAgICAgICAgLy8gd291bGQgYmUgY2xlYXJlZCBhbmQgdGhlIGNvdW50ZXIgZGVjcmVtZW50ZWQpLCB3ZSBuZWVkIHRvIGRlY3JlbWVudCB0aGUgdmlldyBjb3VudGVyIGhlcmUKICAgICAgICAvLyBpbnN0ZWFkLgogICAgICAgIGlmIChsVmlld1tGTEFHU10gJiAxMDI0IC8qIFJlZnJlc2hUcmFuc3BsYW50ZWRWaWV3ICovKSB7CiAgICAgICAgICAgIHVwZGF0ZVRyYW5zcGxhbnRlZFZpZXdDb3VudChpbnNlcnRpb25MQ29udGFpbmVyLCAtMSk7CiAgICAgICAgfQogICAgICAgIG1vdmVkVmlld3Muc3BsaWNlKGRlY2xhcmF0aW9uVmlld0luZGV4LCAxKTsKICAgIH0KICAgIC8qKgogICAgICogRGV0YWNoZXMgYSB2aWV3IGZyb20gYSBjb250YWluZXIuCiAgICAgKgogICAgICogVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgdmlldyBmcm9tIHRoZSBjb250YWluZXIncyBhcnJheSBvZiBhY3RpdmUgdmlld3MuIEl0IGFsc28KICAgICAqIHJlbW92ZXMgdGhlIHZpZXcncyBlbGVtZW50cyBmcm9tIHRoZSBET00uCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBsQ29udGFpbmVyIFRoZSBjb250YWluZXIgZnJvbSB3aGljaCB0byBkZXRhY2ggYSB2aWV3CiAgICAgKiBAcGFyYW0gez99IHJlbW92ZUluZGV4IFRoZSBpbmRleCBvZiB0aGUgdmlldyB0byBkZXRhY2gKICAgICAqIEByZXR1cm4gez99IERldGFjaGVkIExWaWV3IGluc3RhbmNlLgogICAgICovCiAgICBmdW5jdGlvbiBkZXRhY2hWaWV3KGxDb250YWluZXIsIHJlbW92ZUluZGV4KSB7CiAgICAgICAgaWYgKGxDb250YWluZXIubGVuZ3RoIDw9IENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4SW5Db250YWluZXIgPSBDT05UQUlORVJfSEVBREVSX09GRlNFVCArIHJlbW92ZUluZGV4OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3VG9EZXRhY2ggPSBsQ29udGFpbmVyW2luZGV4SW5Db250YWluZXJdOwogICAgICAgIGlmICh2aWV3VG9EZXRhY2gpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSB2aWV3VG9EZXRhY2hbREVDTEFSQVRJT05fTENPTlRBSU5FUl07CiAgICAgICAgICAgIGlmIChkZWNsYXJhdGlvbkxDb250YWluZXIgIT09IG51bGwgJiYgZGVjbGFyYXRpb25MQ29udGFpbmVyICE9PSBsQ29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICBkZXRhY2hNb3ZlZFZpZXcoZGVjbGFyYXRpb25MQ29udGFpbmVyLCB2aWV3VG9EZXRhY2gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyZW1vdmVJbmRleCA+IDApIHsKICAgICAgICAgICAgICAgIGxDb250YWluZXJbaW5kZXhJbkNvbnRhaW5lciAtIDFdW05FWFRdID0gKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdUb0RldGFjaFtORVhUXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVtb3ZlZExWaWV3ID0gcmVtb3ZlRnJvbUFycmF5KGxDb250YWluZXIsIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUICsgcmVtb3ZlSW5kZXgpOwogICAgICAgICAgICBhZGRSZW1vdmVWaWV3RnJvbUNvbnRhaW5lcih2aWV3VG9EZXRhY2hbVFZJRVddLCB2aWV3VG9EZXRhY2gsIGZhbHNlLCBudWxsKTsKICAgICAgICAgICAgLy8gbm90aWZ5IHF1ZXJ5IHRoYXQgYSB2aWV3IGhhcyBiZWVuIHJlbW92ZWQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsUXVlcmllcyA9IHJlbW92ZWRMVmlld1tRVUVSSUVTXTsKICAgICAgICAgICAgaWYgKGxRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICBsUXVlcmllcy5kZXRhY2hWaWV3KHJlbW92ZWRMVmlld1tUVklFV10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZpZXdUb0RldGFjaFtQQVJFTlRdID0gbnVsbDsKICAgICAgICAgICAgdmlld1RvRGV0YWNoW05FWFRdID0gbnVsbDsKICAgICAgICAgICAgLy8gVW5zZXRzIHRoZSBhdHRhY2hlZCBmbGFnCiAgICAgICAgICAgIHZpZXdUb0RldGFjaFtGTEFHU10gJj0gfjEyOCAvKiBBdHRhY2hlZCAqLzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZpZXdUb0RldGFjaDsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBhIHZpZXcgZnJvbSBhIGNvbnRhaW5lciwgaS5lLiBkZXRhY2hlcyBpdCBhbmQgdGhlbiBkZXN0cm95cyB0aGUgdW5kZXJseWluZyBMVmlldy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxDb250YWluZXIgVGhlIGNvbnRhaW5lciBmcm9tIHdoaWNoIHRvIHJlbW92ZSBhIHZpZXcKICAgICAqIEBwYXJhbSB7P30gcmVtb3ZlSW5kZXggVGhlIGluZGV4IG9mIHRoZSB2aWV3IHRvIHJlbW92ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlVmlldyhsQ29udGFpbmVyLCByZW1vdmVJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZXRhY2hlZFZpZXcgPSBkZXRhY2hWaWV3KGxDb250YWluZXIsIHJlbW92ZUluZGV4KTsKICAgICAgICBkZXRhY2hlZFZpZXcgJiYgZGVzdHJveUxWaWV3KGRldGFjaGVkVmlld1tUVklFV10sIGRldGFjaGVkVmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIEEgc3RhbmRhbG9uZSBmdW5jdGlvbiB3aGljaCBkZXN0cm95cyBhbiBMVmlldywKICAgICAqIGNvbmR1Y3RpbmcgY2xlYW4gdXAgKGUuZy4gcmVtb3ZpbmcgbGlzdGVuZXJzLCBjYWxsaW5nIG9uRGVzdHJveXMpLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgb2YgdGhlIGBMVmlld2AgdG8gYmUgZGVzdHJveWVkCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSB2aWV3IHRvIGJlIGRlc3Ryb3llZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlc3Ryb3lMVmlldyh0VmlldywgbFZpZXcpIHsKICAgICAgICBpZiAoIShsVmlld1tGTEFHU10gJiAyNTYgLyogRGVzdHJveWVkICovKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpICYmIHJlbmRlcmVyLmRlc3Ryb3lOb2RlKSB7CiAgICAgICAgICAgICAgICBhcHBseVZpZXcodFZpZXcsIGxWaWV3LCByZW5kZXJlciwgMyAvKiBEZXN0cm95ICovLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZXN0cm95Vmlld1RyZWUobFZpZXcpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRGV0ZXJtaW5lcyB3aGljaCBMVmlld09yTENvbnRhaW5lciB0byBqdW1wIHRvIHdoZW4gdHJhdmVyc2luZyBiYWNrIHVwIHRoZQogICAgICogdHJlZSBpbiBkZXN0cm95Vmlld1RyZWUuCiAgICAgKgogICAgICogTm9ybWFsbHksIHRoZSB2aWV3J3MgcGFyZW50IExWaWV3IHNob3VsZCBiZSBjaGVja2VkLCBidXQgaW4gdGhlIGNhc2Ugb2YKICAgICAqIGVtYmVkZGVkIHZpZXdzLCB0aGUgY29udGFpbmVyICh3aGljaCBpcyB0aGUgdmlldyBub2RlJ3MgcGFyZW50LCBidXQgbm90IHRoZQogICAgICogTFZpZXcncyBwYXJlbnQpIG5lZWRzIHRvIGJlIGNoZWNrZWQgZm9yIGEgcG9zc2libGUgbmV4dCBwcm9wZXJ0eS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3T3JMQ29udGFpbmVyIFRoZSBMVmlld09yTENvbnRhaW5lciBmb3Igd2hpY2ggd2UgbmVlZCBhIHBhcmVudCBzdGF0ZQogICAgICogQHBhcmFtIHs/fSByb290VmlldyBUaGUgcm9vdFZpZXcsIHNvIHdlIGRvbid0IHByb3BhZ2F0ZSB0b28gZmFyIHVwIHRoZSB2aWV3IHRyZWUKICAgICAqIEByZXR1cm4gez99IFRoZSBjb3JyZWN0IHBhcmVudCBMVmlld09yTENvbnRhaW5lcgogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXJlbnRTdGF0ZShsVmlld09yTENvbnRhaW5lciwgcm9vdFZpZXcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHROb2RlOwogICAgICAgIGlmIChpc0xWaWV3KGxWaWV3T3JMQ29udGFpbmVyKSAmJiAodE5vZGUgPSBsVmlld09yTENvbnRhaW5lcltUX0hPU1RdKSAmJgogICAgICAgICAgICB0Tm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHsKICAgICAgICAgICAgLy8gaWYgaXQncyBhbiBlbWJlZGRlZCB2aWV3LCB0aGUgc3RhdGUgbmVlZHMgdG8gZ28gdXAgdG8gdGhlIGNvbnRhaW5lciwgaW4gY2FzZSB0aGUKICAgICAgICAgICAgLy8gY29udGFpbmVyIGhhcyBhIG5leHQKICAgICAgICAgICAgcmV0dXJuIGdldExDb250YWluZXIoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksIGxWaWV3T3JMQ29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIG90aGVyd2lzZSwgdXNlIHBhcmVudCB2aWV3IGZvciBjb250YWluZXJzIG9yIGNvbXBvbmVudCB2aWV3cwogICAgICAgICAgICByZXR1cm4gbFZpZXdPckxDb250YWluZXJbUEFSRU5UXSA9PT0gcm9vdFZpZXcgPyBudWxsIDogbFZpZXdPckxDb250YWluZXJbUEFSRU5UXTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENhbGxzIG9uRGVzdHJveXMgaG9va3MgZm9yIGFsbCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBpbiBhIGdpdmVuIHZpZXcgYW5kIHRoZW4gcmVtb3ZlcyBhbGwKICAgICAqIGxpc3RlbmVycy4gTGlzdGVuZXJzIGFyZSByZW1vdmVkIGFzIHRoZSBsYXN0IHN0ZXAgc28gZXZlbnRzIGRlbGl2ZXJlZCBpbiB0aGUgb25EZXN0cm95cyBob29rcwogICAgICogY2FuIGJlIHByb3BhZ2F0ZWQgdG8gXEBPdXRwdXQgbGlzdGVuZXJzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgYFRWaWV3YCBmb3IgdGhlIGBMVmlld2AgdG8gY2xlYW4gdXAuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSBMVmlldyB0byBjbGVhbiB1cAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2xlYW5VcFZpZXcodFZpZXcsIGxWaWV3KSB7CiAgICAgICAgaWYgKCEobFZpZXdbRkxBR1NdICYgMjU2IC8qIERlc3Ryb3llZCAqLykpIHsKICAgICAgICAgICAgLy8gVXN1YWxseSB0aGUgQXR0YWNoZWQgZmxhZyBpcyByZW1vdmVkIHdoZW4gdGhlIHZpZXcgaXMgZGV0YWNoZWQgZnJvbSBpdHMgcGFyZW50LCBob3dldmVyCiAgICAgICAgICAgIC8vIGlmIGl0J3MgYSByb290IHZpZXcsIHRoZSBmbGFnIHdvbid0IGJlIHVuc2V0IGhlbmNlIHdoeSB3ZSdyZSBhbHNvIHJlbW92aW5nIG9uIGRlc3Ryb3kuCiAgICAgICAgICAgIGxWaWV3W0ZMQUdTXSAmPSB+MTI4IC8qIEF0dGFjaGVkICovOwogICAgICAgICAgICAvLyBNYXJrIHRoZSBMVmlldyBhcyBkZXN0cm95ZWQgKmJlZm9yZSogZXhlY3V0aW5nIHRoZSBvbkRlc3Ryb3kgaG9va3MuIEFuIG9uRGVzdHJveSBob29rCiAgICAgICAgICAgIC8vIHJ1bnMgYXJiaXRyYXJ5IHVzZXIgY29kZSwgd2hpY2ggY291bGQgaW5jbHVkZSBpdHMgb3duIGB2aWV3UmVmLmRlc3Ryb3koKWAgKG9yIHNpbWlsYXIpLiBJZgogICAgICAgICAgICAvLyBXZSBkb24ndCBmbGFnIHRoZSB2aWV3IGFzIGRlc3Ryb3llZCBiZWZvcmUgdGhlIGhvb2tzLCB0aGlzIGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4KICAgICAgICAgICAgLy8gVGhpcyBhbHNvIGFsaWducyB3aXRoIHRoZSBWaWV3RW5naW5lIGJlaGF2aW9yLiBJdCBhbHNvIG1lYW5zIHRoYXQgdGhlIG9uRGVzdHJveSBob29rIGlzCiAgICAgICAgICAgIC8vIHJlYWxseSBtb3JlIG9mIGFuICJhZnRlckRlc3Ryb3kiIGhvb2sgaWYgeW91IHRoaW5rIGFib3V0IGl0LgogICAgICAgICAgICBsVmlld1tGTEFHU10gfD0gMjU2IC8qIERlc3Ryb3llZCAqLzsKICAgICAgICAgICAgZXhlY3V0ZU9uRGVzdHJveXModFZpZXcsIGxWaWV3KTsKICAgICAgICAgICAgcmVtb3ZlTGlzdGVuZXJzKHRWaWV3LCBsVmlldyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG9zdFROb2RlID0gbFZpZXdbVF9IT1NUXTsKICAgICAgICAgICAgLy8gRm9yIGNvbXBvbmVudCB2aWV3cyBvbmx5LCB0aGUgbG9jYWwgcmVuZGVyZXIgaXMgZGVzdHJveWVkIGFzIGNsZWFuIHVwIHRpbWUuCiAgICAgICAgICAgIGlmIChob3N0VE5vZGUgJiYgaG9zdFROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyAmJgogICAgICAgICAgICAgICAgaXNQcm9jZWR1cmFsUmVuZGVyZXIobFZpZXdbUkVOREVSRVJdKSkgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckRlc3Ryb3krKzsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUkVOREVSRVJdKSkpLmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uQ29udGFpbmVyID0gbFZpZXdbREVDTEFSQVRJT05fTENPTlRBSU5FUl07CiAgICAgICAgICAgIC8vIHdlIGFyZSBkZWFsaW5nIHdpdGggYW4gZW1iZWRkZWQgdmlldyB0aGF0IGlzIHN0aWxsIGluc2VydGVkIGludG8gYSBjb250YWluZXIKICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ29udGFpbmVyICE9PSBudWxsICYmIGlzTENvbnRhaW5lcihsVmlld1tQQVJFTlRdKSkgewogICAgICAgICAgICAgICAgLy8gYW5kIHRoaXMgaXMgYSBwcm9qZWN0ZWQgdmlldwogICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uQ29udGFpbmVyICE9PSBsVmlld1tQQVJFTlRdKSB7CiAgICAgICAgICAgICAgICAgICAgZGV0YWNoTW92ZWRWaWV3KGRlY2xhcmF0aW9uQ29udGFpbmVyLCBsVmlldyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBGb3IgZW1iZWRkZWQgdmlld3Mgc3RpbGwgYXR0YWNoZWQgdG8gYSBjb250YWluZXI6IHJlbW92ZSBxdWVyeSByZXN1bHQgZnJvbSB0aGlzIHZpZXcuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsUXVlcmllcyA9IGxWaWV3W1FVRVJJRVNdOwogICAgICAgICAgICAgICAgaWYgKGxRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgbFF1ZXJpZXMuZGV0YWNoVmlldyh0Vmlldyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgbGlzdGVuZXJzIGFuZCB1bnN1YnNjcmliZXMgZnJvbSBvdXRwdXQgc3Vic2NyaXB0aW9ucwogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlTGlzdGVuZXJzKHRWaWV3LCBsVmlldykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Q2xlYW51cCA9IHRWaWV3LmNsZWFudXA7CiAgICAgICAgaWYgKHRDbGVhbnVwICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbENsZWFudXAgPSAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbQ0xFQU5VUF0pKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGggLSAxOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdENsZWFudXBbaV0gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5hdGl2ZSBET00gbGlzdGVuZXIKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWR4T3JUYXJnZXRHZXR0ZXIgPSB0Q2xlYW51cFtpICsgMV07CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IHR5cGVvZiBpZHhPclRhcmdldEdldHRlciA9PT0gJ2Z1bmN0aW9uJyA/CiAgICAgICAgICAgICAgICAgICAgICAgIGlkeE9yVGFyZ2V0R2V0dGVyKGxWaWV3KSA6CiAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcFJOb2RlKGxWaWV3W2lkeE9yVGFyZ2V0R2V0dGVyXSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gbENsZWFudXBbdENsZWFudXBbaSArIDJdXTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXNlQ2FwdHVyZU9yU3ViSWR4ID0gdENsZWFudXBbaSArIDNdOwogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdXNlQ2FwdHVyZU9yU3ViSWR4ID09PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmF0aXZlIERPTSBsaXN0ZW5lciByZWdpc3RlcmVkIHdpdGggUmVuZGVyZXIzCiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKHRDbGVhbnVwW2ldLCBsaXN0ZW5lciwgdXNlQ2FwdHVyZU9yU3ViSWR4KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1c2VDYXB0dXJlT3JTdWJJZHggPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5yZWdpc3RlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbENsZWFudXBbdXNlQ2FwdHVyZU9yU3ViSWR4XSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU3Vic2NyaXB0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsQ2xlYW51cFstdXNlQ2FwdHVyZU9yU3ViSWR4XS51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBjbGVhbnVwIGZ1bmN0aW9uIHRoYXQgaXMgZ3JvdXBlZCB3aXRoIHRoZSBpbmRleCBvZiBpdHMgY29udGV4dAogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbENsZWFudXBbdENsZWFudXBbaSArIDFdXTsKICAgICAgICAgICAgICAgICAgICB0Q2xlYW51cFtpXS5jYWxsKGNvbnRleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGxWaWV3W0NMRUFOVVBdID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENhbGxzIG9uRGVzdHJveSBob29rcyBmb3IgdGhpcyB2aWV3CiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBleGVjdXRlT25EZXN0cm95cyh0VmlldywgbFZpZXcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRlc3Ryb3lIb29rczsKICAgICAgICBpZiAodFZpZXcgIT0gbnVsbCAmJiAoZGVzdHJveUhvb2tzID0gdFZpZXcuZGVzdHJveUhvb2tzKSAhPSBudWxsKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGVzdHJveUhvb2tzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbFZpZXdbKC8qKiBAdHlwZSB7P30gKi8gKGRlc3Ryb3lIb29rc1tpXSkpXTsKICAgICAgICAgICAgICAgIC8vIE9ubHkgY2FsbCB0aGUgZGVzdHJveSBob29rIGlmIHRoZSBjb250ZXh0IGhhcyBiZWVuIHJlcXVlc3RlZC4KICAgICAgICAgICAgICAgIGlmICghKGNvbnRleHQgaW5zdGFuY2VvZiBOb2RlSW5qZWN0b3JGYWN0b3J5KSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0NhbGwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVzdHJveUhvb2tzW2kgKyAxXSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRvQ2FsbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0b0NhbGwubGVuZ3RoOyBqICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodG9DYWxsW2ogKyAxXSkpKS5jYWxsKGNvbnRleHRbKC8qKiBAdHlwZSB7P30gKi8gKHRvQ2FsbFtqXSkpXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRvQ2FsbC5jYWxsKGNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIG5hdGl2ZSBlbGVtZW50IGlmIGEgbm9kZSBjYW4gYmUgaW5zZXJ0ZWQgaW50byB0aGUgZ2l2ZW4gcGFyZW50LgogICAgICoKICAgICAqIFRoZXJlIGFyZSB0d28gcmVhc29ucyB3aHkgd2UgbWF5IG5vdCBiZSBhYmxlIHRvIGluc2VydCBhIGVsZW1lbnQgaW1tZWRpYXRlbHkuCiAgICAgKiAtIFByb2plY3Rpb246IFdoZW4gY3JlYXRpbmcgYSBjaGlsZCBjb250ZW50IGVsZW1lbnQgb2YgYSBjb21wb25lbnQsIHdlIGhhdmUgdG8gc2tpcCB0aGUKICAgICAqICAgaW5zZXJ0aW9uIGJlY2F1c2UgdGhlIGNvbnRlbnQgb2YgYSBjb21wb25lbnQgd2lsbCBiZSBwcm9qZWN0ZWQuCiAgICAgKiAgIGA8Y29tcG9uZW50Pjxjb250ZW50PmRlbGF5ZWQgZHVlIHRvIHByb2plY3Rpb248L2NvbnRlbnQ+PC9jb21wb25lbnQ+YAogICAgICogLSBQYXJlbnQgY29udGFpbmVyIGlzIGRpc2Nvbm5lY3RlZDogVGhpcyBjYW4gaGFwcGVuIHdoZW4gd2UgYXJlIGluc2VydGluZyBhIHZpZXcgaW50bwogICAgICogICBwYXJlbnQgY29udGFpbmVyLCB3aGljaCBpdHNlbGYgaXMgZGlzY29ubmVjdGVkLiBGb3IgZXhhbXBsZSB0aGUgcGFyZW50IGNvbnRhaW5lciBpcyBwYXJ0CiAgICAgKiAgIG9mIGEgVmlldyB3aGljaCBoYXMgbm90IGJlIGluc2VydGVkIG9yIGlzIG1hZGUgZm9yIHByb2plY3Rpb24gYnV0IGhhcyBub3QgYmVlbiBpbnNlcnRlZAogICAgICogICBpbnRvIGRlc3RpbmF0aW9uLgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UmVuZGVyUGFyZW50KHRWaWV3LCB0Tm9kZSwgY3VycmVudFZpZXcpIHsKICAgICAgICAvLyBTa2lwIG92ZXIgZWxlbWVudCBhbmQgSUNVIGNvbnRhaW5lcnMgYXMgdGhvc2UgYXJlIHJlcHJlc2VudGVkIGJ5IGEgY29tbWVudCBub2RlIGFuZAogICAgICAgIC8vIGNhbid0IGJlIHVzZWQgYXMgYSByZW5kZXIgcGFyZW50LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyZW50VE5vZGUgPSB0Tm9kZS5wYXJlbnQ7CiAgICAgICAgd2hpbGUgKHBhcmVudFROb2RlICE9IG51bGwgJiYKICAgICAgICAgICAgKHBhcmVudFROb2RlLnR5cGUgPT09IDQgLyogRWxlbWVudENvbnRhaW5lciAqLyB8fAogICAgICAgICAgICAgICAgcGFyZW50VE5vZGUudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pKSB7CiAgICAgICAgICAgIHROb2RlID0gcGFyZW50VE5vZGU7CiAgICAgICAgICAgIHBhcmVudFROb2RlID0gdE5vZGUucGFyZW50OwogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgcGFyZW50IHROb2RlIGlzIG51bGwsIHRoZW4gd2UgYXJlIGluc2VydGluZyBhY3Jvc3Mgdmlld3M6IGVpdGhlciBpbnRvIGFuIGVtYmVkZGVkIHZpZXcKICAgICAgICAvLyBvciBhIGNvbXBvbmVudCB2aWV3LgogICAgICAgIGlmIChwYXJlbnRUTm9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG9zdFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRWaWV3W1RfSE9TVF0pKTsKICAgICAgICAgICAgaWYgKGhvc3RUTm9kZS50eXBlID09PSAyIC8qIFZpZXcgKi8pIHsKICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBpbnNlcnRpbmcgYSByb290IGVsZW1lbnQgb2YgYW4gZW1iZWRkZWQgdmlldyBXZSBtaWdodCBkZWxheSBpbnNlcnRpb24gb2YgY2hpbGRyZW4KICAgICAgICAgICAgICAgIC8vIGZvciBhIGdpdmVuIHZpZXcgaWYgaXQgaXMgZGlzY29ubmVjdGVkLiBUaGlzIG1pZ2h0IGhhcHBlbiBmb3IgMiBtYWluIHJlYXNvbnM6CiAgICAgICAgICAgICAgICAvLyAtIHZpZXcgaXMgbm90IGluc2VydGVkIGludG8gYW55IGNvbnRhaW5lcih2aWV3IHdhcyBjcmVhdGVkIGJ1dCBub3QgaW5zZXJ0ZWQgeWV0KQogICAgICAgICAgICAgICAgLy8gLSB2aWV3IGlzIGluc2VydGVkIGludG8gYSBjb250YWluZXIgYnV0IHRoZSBjb250YWluZXIgaXRzZWxmIGlzIG5vdCBpbnNlcnRlZCBpbnRvIHRoZSBET00KICAgICAgICAgICAgICAgIC8vIChjb250YWluZXIgbWlnaHQgYmUgcGFydCBvZiBwcm9qZWN0aW9uIG9yIGNoaWxkIG9mIGEgdmlldyB0aGF0IGlzIG5vdCBpbnNlcnRlZCB5ZXQpLgogICAgICAgICAgICAgICAgLy8gSW4gb3RoZXIgd29yZHMgd2UgY2FuIGluc2VydCBjaGlsZHJlbiBvZiBhIGdpdmVuIHZpZXcgaWYgdGhpcyB2aWV3IHdhcyBpbnNlcnRlZCBpbnRvIGEKICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciBhbmQgdGhlIGNvbnRhaW5lciBpdHNlbGYgaGFzIGl0cyByZW5kZXIgcGFyZW50IGRldGVybWluZWQuCiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Q29udGFpbmVyUmVuZGVyUGFyZW50KCgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgY3VycmVudFZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBhIHJvb3QgZWxlbWVudCBvZiB0aGUgY29tcG9uZW50IHZpZXcgaW50byB0aGUgY29tcG9uZW50IGhvc3QgZWxlbWVudCBhbmQKICAgICAgICAgICAgICAgIC8vIGl0IHNob3VsZCBhbHdheXMgYmUgZWFnZXIuCiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyhob3N0VE5vZGUsIDMgLyogRWxlbWVudCAqLyk7CiAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudFZpZXdbSE9TVF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNJY3VDYXNlID0gdE5vZGUgJiYgdE5vZGUudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi87CiAgICAgICAgICAgIC8vIElmIHRoZSBwYXJlbnQgb2YgdGhpcyBub2RlIGlzIGFuIElDVSBjb250YWluZXIsIHRoZW4gaXQgaXMgcmVwcmVzZW50ZWQgYnkgY29tbWVudCBub2RlIGFuZCB3ZQogICAgICAgICAgICAvLyBuZWVkIHRvIHVzZSBpdCBhcyBhbiBhbmNob3IuIElmIGl0IGlzIHByb2plY3RlZCB0aGVuIGl0J3MgZGlyZWN0IHBhcmVudCBub2RlIGlzIHRoZSByZW5kZXJlci4KICAgICAgICAgICAgaWYgKGlzSWN1Q2FzZSAmJiB0Tm9kZS5mbGFncyAmIDQgLyogaXNQcm9qZWN0ZWQgKi8pIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZSh0Tm9kZSwgY3VycmVudFZpZXcpLnBhcmVudE5vZGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZVR5cGUocGFyZW50VE5vZGUsIDMgLyogRWxlbWVudCAqLyk7CiAgICAgICAgICAgIGlmIChwYXJlbnRUTm9kZS5mbGFncyAmIDIgLyogaXNDb21wb25lbnRIb3N0ICovKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0RGF0YSA9IHRWaWV3LmRhdGE7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtwYXJlbnRUTm9kZS5pbmRleF0pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVuY2Fwc3VsYXRpb24gPSAoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3ROb2RlLmRpcmVjdGl2ZVN0YXJ0XSkpKS5lbmNhcHN1bGF0aW9uOwogICAgICAgICAgICAgICAgLy8gV2UndmUgZ290IGEgcGFyZW50IHdoaWNoIGlzIGFuIGVsZW1lbnQgaW4gdGhlIGN1cnJlbnQgdmlldy4gV2UganVzdCBuZWVkIHRvIHZlcmlmeSBpZiB0aGUKICAgICAgICAgICAgICAgIC8vIHBhcmVudCBlbGVtZW50IGlzIG5vdCBhIGNvbXBvbmVudC4gQ29tcG9uZW50J3MgY29udGVudCBub2RlcyBhcmUgbm90IGluc2VydGVkIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZXkgd2lsbCBiZSBwcm9qZWN0ZWQsIGFuZCBzbyBkb2luZyBpbnNlcnQgYXQgdGhpcyBwb2ludCB3b3VsZCBiZSB3YXN0ZWZ1bC4KICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBwcm9qZWN0aW9uIHdvdWxkIHRoZW4gbW92ZSBpdCB0byBpdHMgZmluYWwgZGVzdGluYXRpb24uIE5vdGUgdGhhdCB3ZSBjYW4ndAogICAgICAgICAgICAgICAgLy8gbWFrZSB0aGlzIGFzc3VtcHRpb24gd2hlbiB1c2luZyB0aGUgU2hhZG93IERPTSwgYmVjYXVzZSB0aGUgbmF0aXZlIHByb2plY3Rpb24gcGxhY2Vob2xkZXJzCiAgICAgICAgICAgICAgICAvLyAoPGNvbnRlbnQ+IG9yIDxzbG90PikgaGF2ZSB0byBiZSBpbiBwbGFjZSBhcyBlbGVtZW50cyBhcmUgYmVpbmcgaW5zZXJ0ZWQuCiAgICAgICAgICAgICAgICBpZiAoZW5jYXBzdWxhdGlvbiAhPT0gVmlld0VuY2Fwc3VsYXRpb24kMS5TaGFkb3dEb20gJiYKICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uICE9PSBWaWV3RW5jYXBzdWxhdGlvbiQxLk5hdGl2ZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlUTm9kZShwYXJlbnRUTm9kZSwgY3VycmVudFZpZXcpKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJbnNlcnRzIGEgbmF0aXZlIG5vZGUgYmVmb3JlIGFub3RoZXIgbmF0aXZlIG5vZGUgZm9yIGEgZ2l2ZW4gcGFyZW50IHVzaW5nIHtcQGxpbmsgUmVuZGVyZXIzfS4KICAgICAqIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgd2hlbiBuYXRpdmUgbm9kZXMgd2VyZSBkZXRlcm1pbmVkIC0gaXQgYWJzdHJhY3RzIGFuCiAgICAgKiBhY3R1YWwgcmVuZGVyZXIgYmVpbmcgdXNlZC4KICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcGFyYW0gez99IGNoaWxkCiAgICAgKiBAcGFyYW0gez99IGJlZm9yZU5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5hdGl2ZUluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgYmVmb3JlTm9kZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJJbnNlcnRCZWZvcmUrKzsKICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIHJlbmRlcmVyLmluc2VydEJlZm9yZShwYXJlbnQsIGNoaWxkLCBiZWZvcmVOb2RlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIGJlZm9yZU5vZGUsIHRydWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gY2hpbGQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5hdGl2ZUFwcGVuZENoaWxkKHJlbmRlcmVyLCBwYXJlbnQsIGNoaWxkKSB7CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFwcGVuZENoaWxkKys7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQocGFyZW50LCAncGFyZW50IG5vZGUgbXVzdCBiZSBkZWZpbmVkJyk7CiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkgewogICAgICAgICAgICByZW5kZXJlci5hcHBlbmRDaGlsZChwYXJlbnQsIGNoaWxkKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChjaGlsZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICogQHBhcmFtIHs/fSBiZWZvcmVOb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgYmVmb3JlTm9kZSkgewogICAgICAgIGlmIChiZWZvcmVOb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgIG5hdGl2ZUluc2VydEJlZm9yZShyZW5kZXJlciwgcGFyZW50LCBjaGlsZCwgYmVmb3JlTm9kZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuYXRpdmVBcHBlbmRDaGlsZChyZW5kZXJlciwgcGFyZW50LCBjaGlsZCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEgbm9kZSBmcm9tIHRoZSBET00gZ2l2ZW4gaXRzIG5hdGl2ZSBwYXJlbnQuCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICogQHBhcmFtIHs/PX0gaXNIb3N0RWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbmF0aXZlUmVtb3ZlQ2hpbGQocmVuZGVyZXIsIHBhcmVudCwgY2hpbGQsIGlzSG9zdEVsZW1lbnQpIHsKICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgIHJlbmRlcmVyLnJlbW92ZUNoaWxkKHBhcmVudCwgY2hpbGQsIGlzSG9zdEVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcGFyZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYSBuYXRpdmUgcGFyZW50IG9mIGEgZ2l2ZW4gbmF0aXZlIG5vZGUuCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5hdGl2ZVBhcmVudE5vZGUocmVuZGVyZXIsIG5vZGUpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikgPyByZW5kZXJlci5wYXJlbnROb2RlKG5vZGUpIDogbm9kZS5wYXJlbnROb2RlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbmF0aXZlIHNpYmxpbmcgb2YgYSBnaXZlbiBuYXRpdmUgbm9kZS4KICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbmF0aXZlTmV4dFNpYmxpbmcocmVuZGVyZXIsIG5vZGUpIHsKICAgICAgICByZXR1cm4gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpID8gcmVuZGVyZXIubmV4dFNpYmxpbmcobm9kZSkgOiBub2RlLm5leHRTaWJsaW5nOwogICAgfQogICAgLyoqCiAgICAgKiBGaW5kcyBhIG5hdGl2ZSAiYW5jaG9yIiBub2RlIGZvciBjYXNlcyB3aGVyZSB3ZSBjYW4ndCBhcHBlbmQgYSBuYXRpdmUgY2hpbGQgZGlyZWN0bHkKICAgICAqIChgYXBwZW5kQ2hpbGRgKSBhbmQgbmVlZCB0byB1c2UgYSByZWZlcmVuY2UgKGFuY2hvcikgbm9kZSBmb3IgdGhlIGBpbnNlcnRCZWZvcmVgIG9wZXJhdGlvbi4KICAgICAqIEBwYXJhbSB7P30gcGFyZW50VE5vZGUKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE5hdGl2ZUFuY2hvck5vZGUocGFyZW50VE5vZGUsIGxWaWV3KSB7CiAgICAgICAgaWYgKHBhcmVudFROb2RlLnR5cGUgPT09IDIgLyogVmlldyAqLykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxDb250YWluZXIgPSBnZXRMQ29udGFpbmVyKCgvKiogQHR5cGUgez99ICovIChwYXJlbnRUTm9kZSkpLCBsVmlldyk7CiAgICAgICAgICAgIGlmIChsQ29udGFpbmVyID09PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSBsQ29udGFpbmVyLmluZGV4T2YobFZpZXcsIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUKSAtIENPTlRBSU5FUl9IRUFERVJfT0ZGU0VUOwogICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoaW5kZXgsIGxDb250YWluZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwYXJlbnRUTm9kZS50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gfHwKICAgICAgICAgICAgcGFyZW50VE5vZGUudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgcmV0dXJuIGdldE5hdGl2ZUJ5VE5vZGUocGFyZW50VE5vZGUsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEFwcGVuZHMgdGhlIGBjaGlsZGAgbmF0aXZlIG5vZGUgKG9yIGEgY29sbGVjdGlvbiBvZiBub2RlcykgdG8gdGhlIGBwYXJlbnRgLgogICAgICoKICAgICAqIFRoZSBlbGVtZW50IGluc2VydGlvbiBtaWdodCBiZSBkZWxheWVkIHtcQGxpbmsgY2FuSW5zZXJ0TmF0aXZlTm9kZX0uCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3JyB0byBiZSBhcHBlbmRlZAogICAgICogQHBhcmFtIHs/fSBsVmlldyBUaGUgY3VycmVudCBMVmlldwogICAgICogQHBhcmFtIHs/fSBjaGlsZEVsIFRoZSBuYXRpdmUgY2hpbGQgKG9yIGNoaWxkcmVuKSB0aGF0IHNob3VsZCBiZSBhcHBlbmRlZAogICAgICogQHBhcmFtIHs/fSBjaGlsZFROb2RlIFRoZSBUTm9kZSBvZiB0aGUgY2hpbGQgZWxlbWVudAogICAgICogQHJldHVybiB7P30gV2hldGhlciBvciBub3QgdGhlIGNoaWxkIHdhcyBhcHBlbmRlZAogICAgICovCiAgICBmdW5jdGlvbiBhcHBlbmRDaGlsZCh0VmlldywgbFZpZXcsIGNoaWxkRWwsIGNoaWxkVE5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyUGFyZW50ID0gZ2V0UmVuZGVyUGFyZW50KHRWaWV3LCBjaGlsZFROb2RlLCBsVmlldyk7CiAgICAgICAgaWYgKHJlbmRlclBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50VE5vZGUgPSBjaGlsZFROb2RlLnBhcmVudCB8fCAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbVF9IT1NUXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuY2hvck5vZGUgPSBnZXROYXRpdmVBbmNob3JOb2RlKHBhcmVudFROb2RlLCBsVmlldyk7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGNoaWxkRWwpKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGNoaWxkRWwubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBuYXRpdmVBcHBlbmRPckluc2VydEJlZm9yZShyZW5kZXJlciwgcmVuZGVyUGFyZW50LCBjaGlsZEVsW2ldLCBhbmNob3JOb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5hdGl2ZUFwcGVuZE9ySW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIGNoaWxkRWwsIGFuY2hvck5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBmaXJzdCBuYXRpdmUgbm9kZSBmb3IgYSBnaXZlbiBMVmlldywgc3RhcnRpbmcgZnJvbSB0aGUgcHJvdmlkZWQgVE5vZGUuCiAgICAgKgogICAgICogTmF0aXZlIG5vZGVzIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhvc2UgYXBwZWFyIGluIHRoZSBuYXRpdmUgdHJlZSAoRE9NKS4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEZpcnN0TmF0aXZlTm9kZShsVmlldywgdE5vZGUpIHsKICAgICAgICBpZiAodE5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICBhc3NlcnROb2RlT2ZQb3NzaWJsZVR5cGVzKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8sIDAgLyogQ29udGFpbmVyICovLCA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8sIDUgLyogSWN1Q29udGFpbmVyICovLCAxIC8qIFByb2plY3Rpb24gKi8pOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlVHlwZSA9IHROb2RlLnR5cGU7CiAgICAgICAgICAgIGlmICh0Tm9kZVR5cGUgPT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIGdldE5hdGl2ZUJ5VE5vZGUodE5vZGUsIGxWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0Tm9kZVR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoLTEsIGxWaWV3W3ROb2RlLmluZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodE5vZGVUeXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gfHwgdE5vZGVUeXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxJY3VDb250YWluZXJDaGlsZCA9IHROb2RlLmNoaWxkOwogICAgICAgICAgICAgICAgaWYgKGVsSWN1Q29udGFpbmVyQ2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0Rmlyc3ROYXRpdmVOb2RlKGxWaWV3LCBlbEljdUNvbnRhaW5lckNoaWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCByTm9kZU9yTENvbnRhaW5lciA9IGxWaWV3W3ROb2RlLmluZGV4XTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNMQ29udGFpbmVyKHJOb2RlT3JMQ29udGFpbmVyKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QmVmb3JlTm9kZUZvclZpZXcoLTEsIHJOb2RlT3JMQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB1bndyYXBSTm9kZShyTm9kZU9yTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGxWaWV3W0RFQ0xBUkFUSU9OX0NPTVBPTkVOVF9WSUVXXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEhvc3QgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50Vmlld1tUX0hPU1RdKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRWaWV3ID0gZ2V0TFZpZXdQYXJlbnQoY29tcG9uZW50Vmlldyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFByb2plY3RlZFROb2RlID0gKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRIb3N0LnByb2plY3Rpb24pKSlbKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlLnByb2plY3Rpb24pKV07CiAgICAgICAgICAgICAgICBpZiAoZmlyc3RQcm9qZWN0ZWRUTm9kZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEZpcnN0TmF0aXZlTm9kZSgoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50VmlldykpLCBmaXJzdFByb2plY3RlZFROb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdE5hdGl2ZU5vZGUobFZpZXcsIHROb2RlLm5leHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZpZXdJbmRleEluQ29udGFpbmVyCiAgICAgKiBAcGFyYW0gez99IGxDb250YWluZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEJlZm9yZU5vZGVGb3JWaWV3KHZpZXdJbmRleEluQ29udGFpbmVyLCBsQ29udGFpbmVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5leHRWaWV3SW5kZXggPSBDT05UQUlORVJfSEVBREVSX09GRlNFVCArIHZpZXdJbmRleEluQ29udGFpbmVyICsgMTsKICAgICAgICBpZiAobmV4dFZpZXdJbmRleCA8IGxDb250YWluZXIubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobENvbnRhaW5lcltuZXh0Vmlld0luZGV4XSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZpcnN0VE5vZGVPZlZpZXcgPSBsVmlld1tUVklFV10uZmlyc3RDaGlsZDsKICAgICAgICAgICAgaWYgKGZpcnN0VE5vZGVPZlZpZXcgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRGaXJzdE5hdGl2ZU5vZGUobFZpZXcsIGZpcnN0VE5vZGVPZlZpZXcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBsQ29udGFpbmVyW05BVElWRV07CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgYSBuYXRpdmUgbm9kZSBpdHNlbGYgdXNpbmcgYSBnaXZlbiByZW5kZXJlci4gVG8gcmVtb3ZlIHRoZSBub2RlIHdlIGFyZSBsb29raW5nIHVwIGl0cwogICAgICogcGFyZW50IGZyb20gdGhlIG5hdGl2ZSB0cmVlIGFzIG5vdCBhbGwgcGxhdGZvcm1zIC8gYnJvd3NlcnMgc3VwcG9ydCB0aGUgZXF1aXZhbGVudCBvZgogICAgICogbm9kZS5yZW1vdmUoKS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyIEEgcmVuZGVyZXIgdG8gYmUgdXNlZAogICAgICogQHBhcmFtIHs/fSByTm9kZSBUaGUgbmF0aXZlIG5vZGUgdGhhdCBzaG91bGQgYmUgcmVtb3ZlZAogICAgICogQHBhcmFtIHs/PX0gaXNIb3N0RWxlbWVudCBBIGZsYWcgaW5kaWNhdGluZyBpZiBhIG5vZGUgdG8gYmUgcmVtb3ZlZCBpcyBhIGhvc3Qgb2YgYSBjb21wb25lbnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBuYXRpdmVSZW1vdmVOb2RlKHJlbmRlcmVyLCByTm9kZSwgaXNIb3N0RWxlbWVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmVQYXJlbnQgPSBuYXRpdmVQYXJlbnROb2RlKHJlbmRlcmVyLCByTm9kZSk7CiAgICAgICAgaWYgKG5hdGl2ZVBhcmVudCkgewogICAgICAgICAgICBuYXRpdmVSZW1vdmVDaGlsZChyZW5kZXJlciwgbmF0aXZlUGFyZW50LCByTm9kZSwgaXNIb3N0RWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBQZXJmb3JtcyB0aGUgb3BlcmF0aW9uIG9mIGBhY3Rpb25gIG9uIHRoZSBub2RlLiBUeXBpY2FsbHkgdGhpcyBpbnZvbHZlcyBpbnNlcnRpbmcgb3IgcmVtb3ZpbmcKICAgICAqIG5vZGVzIG9uIHRoZSBMVmlldyBvciBwcm9qZWN0aW9uIGJvdW5kYXJ5LgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gcmVuZGVyUGFyZW50CiAgICAgKiBAcGFyYW0gez99IGJlZm9yZU5vZGUKICAgICAqIEBwYXJhbSB7P30gaXNQcm9qZWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseU5vZGVzKHJlbmRlcmVyLCBhY3Rpb24sIHROb2RlLCBsVmlldywgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlLCBpc1Byb2plY3Rpb24pIHsKICAgICAgICB3aGlsZSAodE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0VE5vZGVGb3JMVmlldyh0Tm9kZSwgbFZpZXcpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLywgMSAvKiBQcm9qZWN0aW9uICovLCAxIC8qIFByb2plY3Rpb24gKi8sIDUgLyogSWN1Q29udGFpbmVyICovKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByYXdTbG90VmFsdWUgPSBsVmlld1t0Tm9kZS5pbmRleF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGVUeXBlID0gdE5vZGUudHlwZTsKICAgICAgICAgICAgaWYgKGlzUHJvamVjdGlvbikgewogICAgICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gMCAvKiBDcmVhdGUgKi8pIHsKICAgICAgICAgICAgICAgICAgICByYXdTbG90VmFsdWUgJiYgYXR0YWNoUGF0Y2hEYXRhKHVud3JhcFJOb2RlKHJhd1Nsb3RWYWx1ZSksIGxWaWV3KTsKICAgICAgICAgICAgICAgICAgICB0Tm9kZS5mbGFncyB8PSA0IC8qIGlzUHJvamVjdGVkICovOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgodE5vZGUuZmxhZ3MgJiA2NCAvKiBpc0RldGFjaGVkICovKSAhPT0gNjQgLyogaXNEZXRhY2hlZCAqLykgewogICAgICAgICAgICAgICAgaWYgKHROb2RlVHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovIHx8IHROb2RlVHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgICAgICBhcHBseU5vZGVzKHJlbmRlcmVyLCBhY3Rpb24sIHROb2RlLmNoaWxkLCBsVmlldywgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIHJhd1Nsb3RWYWx1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0Tm9kZVR5cGUgPT09IDEgLyogUHJvamVjdGlvbiAqLykgewogICAgICAgICAgICAgICAgICAgIGFwcGx5UHJvamVjdGlvblJlY3Vyc2l2ZShyZW5kZXJlciwgYWN0aW9uLCBsVmlldywgKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLyk7CiAgICAgICAgICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIHJhd1Nsb3RWYWx1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdE5vZGUgPSBpc1Byb2plY3Rpb24gPyB0Tm9kZS5wcm9qZWN0aW9uTmV4dCA6IHROb2RlLm5leHQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBgYXBwbHlWaWV3YCBwZXJmb3JtcyBvcGVyYXRpb24gb24gdGhlIHZpZXcgYXMgc3BlY2lmaWVkIGluIGBhY3Rpb25gIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICAgICAqCiAgICAgKiBJbnNlcnRpbmcgYSB2aWV3IHdpdGhvdXQgcHJvamVjdGlvbiBvciBjb250YWluZXJzIGF0IHRvcCBsZXZlbCBpcyBzaW1wbGUuIEp1c3QgaXRlcmF0ZSBvdmVyIHRoZQogICAgICogcm9vdCBub2RlcyBvZiB0aGUgVmlldywgYW5kIGZvciBlYWNoIG5vZGUgcGVyZm9ybSB0aGUgYGFjdGlvbmAuCiAgICAgKgogICAgICogVGhpbmdzIGdldCBtb3JlIGNvbXBsaWNhdGVkIHdpdGggY29udGFpbmVycyBhbmQgcHJvamVjdGlvbnMuIFRoYXQgaXMgYmVjYXVzZSBjb21pbmcgYWNyb3NzOgogICAgICogLSBDb250YWluZXI6IGltcGxpZXMgdGhhdCB3ZSBoYXZlIHRvIGluc2VydC9yZW1vdmUvZGVzdHJveSB0aGUgdmlld3Mgb2YgdGhhdCBjb250YWluZXIgYXMgd2VsbAogICAgICogICAgICAgICAgICAgIHdoaWNoIGluIHR1cm4gY2FuIGhhdmUgdGhlaXIgb3duIENvbnRhaW5lcnMgYXQgdGhlIFZpZXcgcm9vdHMuCiAgICAgKiAtIFByb2plY3Rpb246IGltcGxpZXMgdGhhdCB3ZSBoYXZlIHRvIGluc2VydC9yZW1vdmUvZGVzdHJveSB0aGUgbm9kZXMgb2YgdGhlIHByb2plY3Rpb24uIFRoZQogICAgICogICAgICAgICAgICAgICBjb21wbGljYXRpb24gaXMgdGhhdCB0aGUgbm9kZXMgd2UgYXJlIHByb2plY3RpbmcgY2FuIHRoZW1zZWx2ZXMgaGF2ZSBDb250YWluZXJzCiAgICAgKiAgICAgICAgICAgICAgIG9yIG90aGVyIFByb2plY3Rpb25zLgogICAgICoKICAgICAqIEFzIHlvdSBjYW4gc2VlIHRoaXMgaXMgYSB2ZXJ5IHJlY3Vyc2l2ZSBwcm9ibGVtLiBZZXMgcmVjdXJzaW9uIGlzIG5vdCBtb3N0IGVmZmljaWVudCBidXQgdGhlCiAgICAgKiBjb2RlIGlzIGNvbXBsaWNhdGVkIGVub3VnaCB0aGF0IHRyeWluZyB0byBpbXBsZW1lbnRlZCB3aXRoIHJlY3Vyc2lvbiBiZWNvbWVzIHVubWFpbnRhaW5hYmxlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgVGhlIGBUVmlldycgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIExWaWV3IHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkLCBkZXRhY2hlZCwgZGVzdHJveWVkLgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uIGFjdGlvbiB0byBwZXJmb3JtIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICAgICAqIEBwYXJhbSB7P30gcmVuZGVyUGFyZW50IHBhcmVudCBET00gZWxlbWVudCBmb3IgaW5zZXJ0aW9uL3JlbW92YWwuCiAgICAgKiBAcGFyYW0gez99IGJlZm9yZU5vZGUgQmVmb3JlIHdoaWNoIG5vZGUgdGhlIGluc2VydGlvbnMgc2hvdWxkIGhhcHBlbi4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5Vmlldyh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCBhY3Rpb24sIHJlbmRlclBhcmVudCwgYmVmb3JlTm9kZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb2RlVHlwZSgoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcubm9kZSkpLCAyIC8qIFZpZXcgKi8pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3Um9vdFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3Lm5vZGUpKS5jaGlsZDsKICAgICAgICBhcHBseU5vZGVzKHJlbmRlcmVyLCBhY3Rpb24sIHZpZXdSb290VE5vZGUsIGxWaWV3LCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUsIGZhbHNlKTsKICAgIH0KICAgIC8qKgogICAgICogYGFwcGx5UHJvamVjdGlvbmAgcGVyZm9ybXMgb3BlcmF0aW9uIG9uIHRoZSBwcm9qZWN0aW9uLgogICAgICoKICAgICAqIEluc2VydGluZyBhIHByb2plY3Rpb24gcmVxdWlyZXMgdXMgdG8gbG9jYXRlIHRoZSBwcm9qZWN0ZWQgbm9kZXMgZnJvbSB0aGUgcGFyZW50IGNvbXBvbmVudC4gVGhlCiAgICAgKiBjb21wbGljYXRpb24gaXMgdGhhdCB0aG9zZSBub2RlcyB0aGVtc2VsdmVzIGNvdWxkIGJlIHJlLXByb2plY3RlZCBmcm9tIHRoZWlyIHBhcmVudCBjb21wb25lbnQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0VmlldyBUaGUgYFRWaWV3YCBvZiBgTFZpZXdgIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkLCBkZXRhY2hlZCwgZGVzdHJveWVkCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IFRoZSBgTFZpZXdgIHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkLCBkZXRhY2hlZCwgZGVzdHJveWVkLgogICAgICogQHBhcmFtIHs/fSB0UHJvamVjdGlvbk5vZGUgbm9kZSB0byBwcm9qZWN0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseVByb2plY3Rpb24odFZpZXcsIGxWaWV3LCB0UHJvamVjdGlvbk5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlclBhcmVudCA9IGdldFJlbmRlclBhcmVudCh0VmlldywgdFByb2plY3Rpb25Ob2RlLCBsVmlldyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudFROb2RlID0gdFByb2plY3Rpb25Ob2RlLnBhcmVudCB8fCAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbVF9IT1NUXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYmVmb3JlTm9kZSA9IGdldE5hdGl2ZUFuY2hvck5vZGUocGFyZW50VE5vZGUsIGxWaWV3KTsKICAgICAgICBhcHBseVByb2plY3Rpb25SZWN1cnNpdmUocmVuZGVyZXIsIDAgLyogQ3JlYXRlICovLCBsVmlldywgdFByb2plY3Rpb25Ob2RlLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpOwogICAgfQogICAgLyoqCiAgICAgKiBgYXBwbHlQcm9qZWN0aW9uUmVjdXJzaXZlYCBwZXJmb3JtcyBvcGVyYXRpb24gb24gdGhlIHByb2plY3Rpb24gc3BlY2lmaWVkIGJ5IGBhY3Rpb25gIChpbnNlcnQsCiAgICAgKiBkZXRhY2gsIGRlc3Ryb3kpCiAgICAgKgogICAgICogSW5zZXJ0aW5nIGEgcHJvamVjdGlvbiByZXF1aXJlcyB1cyB0byBsb2NhdGUgdGhlIHByb2plY3RlZCBub2RlcyBmcm9tIHRoZSBwYXJlbnQgY29tcG9uZW50LiBUaGUKICAgICAqIGNvbXBsaWNhdGlvbiBpcyB0aGF0IHRob3NlIG5vZGVzIHRoZW1zZWx2ZXMgY291bGQgYmUgcmUtcHJvamVjdGVkIGZyb20gdGhlaXIgcGFyZW50IGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyIFJlbmRlciB0byB1c2UKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uIGFjdGlvbiB0byBwZXJmb3JtIChpbnNlcnQsIGRldGFjaCwgZGVzdHJveSkKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIExWaWV3IHdoaWNoIG5lZWRzIHRvIGJlIGluc2VydGVkLCBkZXRhY2hlZCwgZGVzdHJveWVkLgogICAgICogQHBhcmFtIHs/fSB0UHJvamVjdGlvbk5vZGUgbm9kZSB0byBwcm9qZWN0CiAgICAgKiBAcGFyYW0gez99IHJlbmRlclBhcmVudCBwYXJlbnQgRE9NIGVsZW1lbnQgZm9yIGluc2VydGlvbi9yZW1vdmFsLgogICAgICogQHBhcmFtIHs/fSBiZWZvcmVOb2RlIEJlZm9yZSB3aGljaCBub2RlIHRoZSBpbnNlcnRpb25zIHNob3VsZCBoYXBwZW4uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseVByb2plY3Rpb25SZWN1cnNpdmUocmVuZGVyZXIsIGFjdGlvbiwgbFZpZXcsIHRQcm9qZWN0aW9uTm9kZSwgcmVuZGVyUGFyZW50LCBiZWZvcmVOb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudExWaWV3ID0gbFZpZXdbREVDTEFSQVRJT05fQ09NUE9ORU5UX1ZJRVddOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudExWaWV3W1RfSE9TVF0pKTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0RXF1YWwodHlwZW9mIHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uLCAnbnVtYmVyJywgJ2V4cGVjdGluZyBwcm9qZWN0aW9uIGluZGV4Jyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGVUb1Byb2plY3RPclJOb2RlcyA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50Tm9kZS5wcm9qZWN0aW9uKSlbdFByb2plY3Rpb25Ob2RlLnByb2plY3Rpb25dKSk7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobm9kZVRvUHJvamVjdE9yUk5vZGVzKSkgewogICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgZXhpc3QsIGl0IGlzIGEgYml0IG9mIGEgaGFjay4gV2hlbiB3ZSBib290c3RyYXAgYSB0b3AgbGV2ZWwgbm9kZSBhbmQgd2UKICAgICAgICAgICAgLy8gbmVlZCB0byBzdXBwb3J0IHBhc3NpbmcgcHJvamVjdGFibGUgbm9kZXMsIHNvIHdlIGNoZWF0IGFuZCBwdXQgdGhlbSBpbiB0aGUgVE5vZGUKICAgICAgICAgICAgLy8gb2YgdGhlIEhvc3QgVFZpZXcuIChZZXMgd2UgcHV0IGluc3RhbmNlIGluZm8gYXQgdGhlIFQgTGV2ZWwpLiBXZSBjYW4gZ2V0IGF3YXkgd2l0aCBpdAogICAgICAgICAgICAvLyBiZWNhdXNlIHdlIGtub3cgdGhhdCB0aGF0IFRWaWV3IGlzIG5vdCBzaGFyZWQgYW5kIHRoZXJlZm9yZSBpdCB3aWxsIG5vdCBiZSBhIHByb2JsZW0uCiAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlZmFjdG9yZWQgYW5kIGNsZWFuZWQgdXAuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9kZVRvUHJvamVjdE9yUk5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByTm9kZSA9IG5vZGVUb1Byb2plY3RPclJOb2Rlc1tpXTsKICAgICAgICAgICAgICAgIGFwcGx5VG9FbGVtZW50T3JDb250YWluZXIoYWN0aW9uLCByZW5kZXJlciwgcmVuZGVyUGFyZW50LCByTm9kZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG5vZGVUb1Byb2plY3QgPSBub2RlVG9Qcm9qZWN0T3JSTm9kZXM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvamVjdGVkQ29tcG9uZW50TFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50TFZpZXdbUEFSRU5UXSkpOwogICAgICAgICAgICBhcHBseU5vZGVzKHJlbmRlcmVyLCBhY3Rpb24sIG5vZGVUb1Byb2plY3QsIHByb2plY3RlZENvbXBvbmVudExWaWV3LCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUsIHRydWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogYGFwcGx5Q29udGFpbmVyYCBwZXJmb3JtcyBhbiBvcGVyYXRpb24gb24gdGhlIGNvbnRhaW5lciBhbmQgaXRzIHZpZXdzIGFzIHNwZWNpZmllZCBieQogICAgICogYGFjdGlvbmAgKGluc2VydCwgZGV0YWNoLCBkZXN0cm95KQogICAgICoKICAgICAqIEluc2VydGluZyBhIENvbnRhaW5lciBpcyBjb21wbGljYXRlZCBieSB0aGUgZmFjdCB0aGF0IHRoZSBjb250YWluZXIgbWF5IGhhdmUgVmlld3Mgd2hpY2gKICAgICAqIHRoZW1zZWx2ZXMgaGF2ZSBjb250YWluZXJzIG9yIHByb2plY3Rpb25zLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXIgUmVuZGVyZXIgdG8gdXNlCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbiBhY3Rpb24gdG8gcGVyZm9ybSAoaW5zZXJ0LCBkZXRhY2gsIGRlc3Ryb3kpCiAgICAgKiBAcGFyYW0gez99IGxDb250YWluZXIgVGhlIExDb250YWluZXIgd2hpY2ggbmVlZHMgdG8gYmUgaW5zZXJ0ZWQsIGRldGFjaGVkLCBkZXN0cm95ZWQuCiAgICAgKiBAcGFyYW0gez99IHJlbmRlclBhcmVudCBwYXJlbnQgRE9NIGVsZW1lbnQgZm9yIGluc2VydGlvbi9yZW1vdmFsLgogICAgICogQHBhcmFtIHs/fSBiZWZvcmVOb2RlIEJlZm9yZSB3aGljaCBub2RlIHRoZSBpbnNlcnRpb25zIHNob3VsZCBoYXBwZW4uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUNvbnRhaW5lcihyZW5kZXJlciwgYWN0aW9uLCBsQ29udGFpbmVyLCByZW5kZXJQYXJlbnQsIGJlZm9yZU5vZGUpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TENvbnRhaW5lcihsQ29udGFpbmVyKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW5jaG9yID0gbENvbnRhaW5lcltOQVRJVkVdOwogICAgICAgIC8vIExDb250YWluZXIgaGFzIGl0cyBvd24gYmVmb3JlIG5vZGUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5hdGl2ZSA9IHVud3JhcFJOb2RlKGxDb250YWluZXIpOwogICAgICAgIC8vIEFuIExDb250YWluZXIgY2FuIGJlIGNyZWF0ZWQgZHluYW1pY2FsbHkgb24gYW55IG5vZGUgYnkgaW5qZWN0aW5nIFZpZXdDb250YWluZXJSZWYuCiAgICAgICAgLy8gQXNraW5nIGZvciBhIFZpZXdDb250YWluZXJSZWYgb24gYW4gZWxlbWVudCB3aWxsIHJlc3VsdCBpbiBhIGNyZWF0aW9uIG9mIGEgc2VwYXJhdGUgYW5jaG9yIG5vZGUKICAgICAgICAvLyAoY29tbWVudCBpbiB0aGUgRE9NKSB0aGF0IHdpbGwgYmUgZGlmZmVyZW50IGZyb20gdGhlIExDb250YWluZXIncyBob3N0IG5vZGUuIEluIHRoaXMgcGFydGljdWxhcgogICAgICAgIC8vIGNhc2Ugd2UgbmVlZCB0byBleGVjdXRlIGFjdGlvbiBvbiAyIG5vZGVzOgogICAgICAgIC8vIC0gY29udGFpbmVyJ3MgaG9zdCBub2RlICh0aGlzIGlzIGRvbmUgaW4gdGhlIGV4ZWN1dGVBY3Rpb25PbkVsZW1lbnRPckNvbnRhaW5lcikKICAgICAgICAvLyAtIGNvbnRhaW5lcidzIGhvc3Qgbm9kZSAodGhpcyBpcyBkb25lIGhlcmUpCiAgICAgICAgaWYgKGFuY2hvciAhPT0gbmF0aXZlKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgdmVyeSBzdHJhbmdlIHRvIG1lIChNaXNrbykuIEkgd291bGQgZXhwZWN0IHRoYXQgdGhlIG5hdGl2ZSBpcyBzYW1lIGFzIGFuY2hvci4gSSBkb24ndAogICAgICAgICAgICAvLyBzZWUgYSByZWFzb24gd2h5IHRoZXkgc2hvdWxkIGJlIGRpZmZlcmVudCwgYnV0IHRoZXkgYXJlLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyBJZiB0aGV5IGFyZSB3ZSBuZWVkIHRvIHByb2Nlc3MgdGhlIHNlY29uZCBhbmNob3IgYXMgd2VsbC4KICAgICAgICAgICAgYXBwbHlUb0VsZW1lbnRPckNvbnRhaW5lcihhY3Rpb24sIHJlbmRlcmVyLCByZW5kZXJQYXJlbnQsIGFuY2hvciwgYmVmb3JlTm9kZSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsgaSA8IGxDb250YWluZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsVmlldyA9ICgvKiogQHR5cGUgez99ICovIChsQ29udGFpbmVyW2ldKSk7CiAgICAgICAgICAgIGFwcGx5VmlldyhsVmlld1tUVklFV10sIGxWaWV3LCByZW5kZXJlciwgYWN0aW9uLCByZW5kZXJQYXJlbnQsIGFuY2hvcik7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBXcml0ZXMgY2xhc3Mvc3R5bGUgdG8gZWxlbWVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyIFJlbmRlcmVyIHRvIHVzZS4KICAgICAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBpdCBzaG91bGQgYmUgd3JpdHRlbiB0byBgY2xhc3NgIChgZmFsc2VgIHRvIHdyaXRlIHRvIGBzdHlsZWApCiAgICAgKiBAcGFyYW0gez99IHJOb2RlIFRoZSBOb2RlIHRvIHdyaXRlIHRvLgogICAgICogQHBhcmFtIHs/fSBwcm9wIFByb3BlcnR5IHRvIHdyaXRlIHRvLiBUaGlzIHdvdWxkIGJlIHRoZSBjbGFzcy9zdHlsZSBuYW1lLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBWYWx1ZSB0byB3cml0ZS4gSWYgYG51bGxgL2B1bmRlZmluZWRgL2BmYWxzZWAgdGhpcyBpcyBjb25zaWRlcmVkIGEgcmVtb3ZlIChzZXQvYWRkCiAgICAgKiAgICAgICAgb3RoZXJ3aXNlKS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcGx5U3R5bGluZyhyZW5kZXJlciwgaXNDbGFzc0Jhc2VkLCByTm9kZSwgcHJvcCwgdmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNQcm9jZWR1cmFsID0gaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpOwogICAgICAgIGlmIChpc0NsYXNzQmFzZWQpIHsKICAgICAgICAgICAgLy8gV2UgYWN0dWFsbHkgd2FudCBKUyB0cnVlL2ZhbHNlIGhlcmUgYmVjYXVzZSBhbnkgdHJ1dGh5IHZhbHVlIHNob3VsZCBhZGQgdGhlIGNsYXNzCiAgICAgICAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVDbGFzcysrOwogICAgICAgICAgICAgICAgaWYgKGlzUHJvY2VkdXJhbCkgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkucmVtb3ZlQ2xhc3Mock5vZGUsIHByb3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5jbGFzc0xpc3QucmVtb3ZlKHByb3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZENsYXNzKys7CiAgICAgICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsKSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5hZGRDbGFzcyhyTm9kZSwgcHJvcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCgoKC8qKiBAdHlwZSB7P30gKi8gKHJOb2RlKSkpLmNsYXNzTGlzdCwgJ0hUTUxFbGVtZW50IGV4cGVjdGVkJyk7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5jbGFzc0xpc3QuYWRkKHByb3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUT0RPKG1pc2tvKTogQ2FuJ3QgaW1wb3J0IFJlbmRlcmVyU3R5bGVGbGFnczIuRGFzaENhc2UgYXMgaXQgY2F1c2VzIGltcG9ydHMgdG8gYmUgcmVzb2x2ZWQgaW4KICAgICAgICAgICAgLy8gZGlmZmVyZW50IG9yZGVyIHdoaWNoIGNhdXNlcyBmYWlsdXJlcy4gVXNpbmcgZGlyZWN0IGNvbnN0YW50IGFzIHdvcmthcm91bmQgZm9yIG5vdy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmbGFncyA9IHByb3AuaW5kZXhPZignLScpID09IC0xID8gdW5kZWZpbmVkIDogMiAvKiBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlICovOwogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCAvKiogfHwgdmFsdWUgPT09IHVuZGVmaW5lZCAqLykgewogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclJlbW92ZVN0eWxlKys7CiAgICAgICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsKSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5yZW1vdmVTdHlsZShyTm9kZSwgcHJvcCwgZmxhZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyTm9kZSkpKS5zdHlsZS5yZW1vdmVQcm9wZXJ0eShwcm9wKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRTdHlsZSsrOwogICAgICAgICAgICAgICAgaWYgKGlzUHJvY2VkdXJhbCkgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVuZGVyZXIpKSkuc2V0U3R5bGUock5vZGUsIHByb3AsIHZhbHVlLCBmbGFncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCgoKC8qKiBAdHlwZSB7P30gKi8gKHJOb2RlKSkpLnN0eWxlLCAnSFRNTEVsZW1lbnQgZXhwZWN0ZWQnKTsKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHJOb2RlKSkpLnN0eWxlLnNldFByb3BlcnR5KHByb3AsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV3JpdGUgYGNzc1RleHRgIHRvIGBSRWxlbWVudGAuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBkb2VzIGRpcmVjdCB3cml0ZSB3aXRob3V0IGFueSByZWNvbmNpbGlhdGlvbi4gVXNlZCBmb3Igd3JpdGluZyBpbml0aWFsIHZhbHVlcywgc28KICAgICAqIHRoYXQgc3RhdGljIHN0eWxpbmcgdmFsdWVzIGRvIG5vdCBwdWxsIGluIHRoZSBzdHlsZSBwYXJzZXIuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBuZWVkcyB0byBiZSB1cGRhdGVkLgogICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZSBUaGUgbmV3IGNsYXNzIGxpc3QgdG8gd3JpdGUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB3cml0ZURpcmVjdFN0eWxlKHJlbmRlcmVyLCBlbGVtZW50LCBuZXdWYWx1ZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRTdHJpbmcobmV3VmFsdWUsICdcJ25ld1ZhbHVlXCcgc2hvdWxkIGJlIGEgc3RyaW5nJyk7CiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkgewogICAgICAgICAgICByZW5kZXJlci5zZXRBdHRyaWJ1dGUoZWxlbWVudCwgJ3N0eWxlJywgbmV3VmFsdWUpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnN0eWxlLmNzc1RleHQgPSBuZXdWYWx1ZTsKICAgICAgICB9CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlclNldFN0eWxlKys7CiAgICB9CiAgICAvKioKICAgICAqIFdyaXRlIGBjbGFzc05hbWVgIHRvIGBSRWxlbWVudGAuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBkb2VzIGRpcmVjdCB3cml0ZSB3aXRob3V0IGFueSByZWNvbmNpbGlhdGlvbi4gVXNlZCBmb3Igd3JpdGluZyBpbml0aWFsIHZhbHVlcywgc28KICAgICAqIHRoYXQgc3RhdGljIHN0eWxpbmcgdmFsdWVzIGRvIG5vdCBwdWxsIGluIHRoZSBzdHlsZSBwYXJzZXIuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgZWxlbWVudCB3aGljaCBuZWVkcyB0byBiZSB1cGRhdGVkLgogICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZSBUaGUgbmV3IGNsYXNzIGxpc3QgdG8gd3JpdGUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB3cml0ZURpcmVjdENsYXNzKHJlbmRlcmVyLCBlbGVtZW50LCBuZXdWYWx1ZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRTdHJpbmcobmV3VmFsdWUsICdcJ25ld1ZhbHVlXCcgc2hvdWxkIGJlIGEgc3RyaW5nJyk7CiAgICAgICAgaWYgKGlzUHJvY2VkdXJhbFJlbmRlcmVyKHJlbmRlcmVyKSkgewogICAgICAgICAgICBpZiAobmV3VmFsdWUgPT09ICcnKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgdGVzdHMgaW4gYGdvb2dsZTNgIHdoaWNoIGV4cGVjdCBgZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2NsYXNzJylgIHRvIGJlIGBudWxsYC4KICAgICAgICAgICAgICAgIHJlbmRlcmVyLnJlbW92ZUF0dHJpYnV0ZShlbGVtZW50LCAnY2xhc3MnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJlbmRlcmVyLnNldEF0dHJpYnV0ZShlbGVtZW50LCAnY2xhc3MnLCBuZXdWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NOYW1lID0gbmV3VmFsdWU7CiAgICAgICAgfQogICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJTZXRDbGFzc05hbWUrKzsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvbm9kZV91dGlsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSWYgYHN0YXJ0VE5vZGUucGFyZW50YCBleGlzdHMgYW5kIGhhcyBhbiBpbmplY3RvciwgcmV0dXJucyBUTm9kZSBmb3IgdGhhdCBpbmplY3Rvci4KICAgICAqIE90aGVyd2lzZSwgdW53cmFwcyBhIHBhcmVudCBpbmplY3RvciBsb2NhdGlvbiBudW1iZXIgdG8gZmluZCB0aGUgdmlldyBvZmZzZXQgZnJvbSB0aGUgY3VycmVudAogICAgICogaW5qZWN0b3IsIHRoZW4gd2Fsa3MgdXAgdGhlIGRlY2xhcmF0aW9uIHZpZXcgdHJlZSB1bnRpbCB0aGUgVE5vZGUgb2YgdGhlIHBhcmVudCBpbmplY3RvciBpcwogICAgICogZm91bmQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBsb2NhdGlvbiBUaGUgbG9jYXRpb24gb2YgdGhlIHBhcmVudCBpbmplY3Rvciwgd2hpY2ggY29udGFpbnMgdGhlIHZpZXcgb2Zmc2V0CiAgICAgKiBAcGFyYW0gez99IHN0YXJ0VmlldyBUaGUgTFZpZXcgaW5zdGFuY2UgZnJvbSB3aGljaCB0byBzdGFydCB3YWxraW5nIHVwIHRoZSB2aWV3IHRyZWUKICAgICAqIEBwYXJhbSB7P30gc3RhcnRUTm9kZSBUaGUgVE5vZGUgaW5zdGFuY2Ugb2YgdGhlIHN0YXJ0aW5nIGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99IFRoZSBUTm9kZSBvZiB0aGUgcGFyZW50IGluamVjdG9yCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFBhcmVudEluamVjdG9yVE5vZGUobG9jYXRpb24sIHN0YXJ0Vmlldywgc3RhcnRUTm9kZSkgewogICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGluamVjdG9yIG9uIHRoZSBwYXJlbnQgVE5vZGUsIHJldHJpZXZlIHRoZSBUTm9kZSBmb3IgdGhhdCBpbmplY3Rvci4KICAgICAgICBpZiAoc3RhcnRUTm9kZS5wYXJlbnQgJiYgc3RhcnRUTm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgLy8gdmlldyBvZmZzZXQgaXMgMAogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluamVjdG9ySW5kZXggPSBzdGFydFROb2RlLnBhcmVudC5pbmplY3RvckluZGV4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0Tm9kZSA9IHN0YXJ0VE5vZGUucGFyZW50OwogICAgICAgICAgICAvLyBJZiB0Tm9kZS5pbmplY3RvckluZGV4ID09PSB0Tm9kZS5wYXJlbnQuaW5qZWN0b3JJbmRleCwgdGhlbiB0aGUgaW5kZXggYmVsb25ncyB0byBhIHBhcmVudAogICAgICAgICAgICAvLyBpbmplY3Rvci4KICAgICAgICAgICAgd2hpbGUgKHROb2RlLnBhcmVudCAhPSBudWxsICYmIGluamVjdG9ySW5kZXggPT0gdE5vZGUucGFyZW50LmluamVjdG9ySW5kZXgpIHsKICAgICAgICAgICAgICAgIHROb2RlID0gdE5vZGUucGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0Tm9kZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2aWV3T2Zmc2V0ID0gZ2V0UGFyZW50SW5qZWN0b3JWaWV3T2Zmc2V0KGxvY2F0aW9uKTsKICAgICAgICAvLyB2aWV3IG9mZnNldCBpcyAxCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwYXJlbnRWaWV3ID0gc3RhcnRWaWV3OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFyZW50VE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoc3RhcnRWaWV3W1RfSE9TVF0pKTsKICAgICAgICAvLyB2aWV3IG9mZnNldCBpcyBzdXBlcmlvciB0byAxCiAgICAgICAgd2hpbGUgKHZpZXdPZmZzZXQgPiAxKSB7CiAgICAgICAgICAgIHBhcmVudFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50Vmlld1tERUNMQVJBVElPTl9WSUVXXSkpOwogICAgICAgICAgICBwYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRWaWV3W1RfSE9TVF0pKTsKICAgICAgICAgICAgdmlld09mZnNldC0tOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcGFyZW50VE5vZGU7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIFZpZXdSZWYgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2xWaWV3CiAgICAgICAgICogQHBhcmFtIHs/PX0gX2NkUmVmSW5qZWN0aW5nVmlldwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9sVmlldywgX2NkUmVmSW5qZWN0aW5nVmlldykgewogICAgICAgICAgICB0aGlzLl9sVmlldyA9IF9sVmlldzsKICAgICAgICAgICAgdGhpcy5fY2RSZWZJbmplY3RpbmdWaWV3ID0gX2NkUmVmSW5qZWN0aW5nVmlldzsKICAgICAgICAgICAgdGhpcy5fYXBwUmVmID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJvb3ROb2RlcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsVmlldyA9IHRoaXMuX2xWaWV3OwogICAgICAgICAgICBpZiAobFZpZXdbSE9TVF0gPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaG9zdFRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RfSE9TVF0pKTsKICAgICAgICAgICAgICAgIHJldHVybiBjb2xsZWN0TmF0aXZlTm9kZXMobFZpZXdbVFZJRVddLCBsVmlldywgaG9zdFRWaWV3LmNoaWxkLCBbXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250ZXh0KCkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2xWaWV3W0NPTlRFWFRdKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRlc3Ryb3llZCgpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9sVmlld1tGTEFHU10gJiAyNTYgLyogRGVzdHJveWVkICovKSA9PT0gMjU2IC8qIERlc3Ryb3llZCAqLzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fYXBwUmVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBSZWYuZGV0YWNoVmlldyh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl92aWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih0aGlzKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5kZXRhY2goaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVzdHJveUxWaWV3KHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRlc3Ryb3koY2FsbGJhY2spIHsKICAgICAgICAgICAgc3RvcmVDbGVhbnVwRm4odGhpcy5fbFZpZXdbVFZJRVddLCB0aGlzLl9sVmlldywgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyBhIHZpZXcgYW5kIGFsbCBvZiBpdHMgYW5jZXN0b3JzIGRpcnR5LgogICAgICAgICAqCiAgICAgICAgICogSXQgYWxzbyB0cmlnZ2VycyBjaGFuZ2UgZGV0ZWN0aW9uIGJ5IGNhbGxpbmcgYHNjaGVkdWxlVGlja2AgaW50ZXJuYWxseSwgd2hpY2ggY29hbGVzY2VzCiAgICAgICAgICogbXVsdGlwbGUgYG1hcmtGb3JDaGVja2AgY2FsbHMgdG8gaW50byBvbmUgY2hhbmdlIGRldGVjdGlvbiBydW4uCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIHRvIGVuc3VyZSBhbiB7XEBsaW5rIENoYW5nZURldGVjdGlvblN0cmF0ZWd5I09uUHVzaCBPblB1c2h9IGNvbXBvbmVudCBpcwogICAgICAgICAqIGNoZWNrZWQgd2hlbiBpdCBuZWVkcyB0byBiZSByZS1yZW5kZXJlZCBidXQgdGhlIHR3byBub3JtYWwgdHJpZ2dlcnMgaGF2ZW4ndCBtYXJrZWQgaXQKICAgICAgICAgKiBkaXJ0eSAoaS5lLiBpbnB1dHMgaGF2ZW4ndCBjaGFuZ2VkIGFuZCBldmVudHMgaGF2ZW4ndCBmaXJlZCBpbiB0aGUgdmlldykuCiAgICAgICAgICoKICAgICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIE9uUHVzaCBjb21wb25lbnRzIC0tPgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogIyMjIEV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBcQENvbXBvbmVudCh7CiAgICAgICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsCiAgICAgICAgICogICB0ZW1wbGF0ZTogYE51bWJlciBvZiB0aWNrczoge3tudW1iZXJPZlRpY2tzfX1gCiAgICAgICAgICogICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgKiB9KQogICAgICAgICAqIGNsYXNzIEFwcENvbXBvbmVudCB7CiAgICAgICAgICogICBudW1iZXJPZlRpY2tzID0gMDsKICAgICAgICAgKgogICAgICAgICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmKSB7CiAgICAgICAgICogICAgIHNldEludGVydmFsKCgpID0+IHsKICAgICAgICAgKiAgICAgICB0aGlzLm51bWJlck9mVGlja3MrKzsKICAgICAgICAgKiAgICAgICAvLyB0aGUgZm9sbG93aW5nIGlzIHJlcXVpcmVkLCBvdGhlcndpc2UgdGhlIHZpZXcgd2lsbCBub3QgYmUgdXBkYXRlZAogICAgICAgICAqICAgICAgIHRoaXMucmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAqICAgICB9LCAxMDAwKTsKICAgICAgICAgKiAgIH0KICAgICAgICAgKiB9CiAgICAgICAgICogYGBgCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXJrRm9yQ2hlY2soKSB7CiAgICAgICAgICAgIG1hcmtWaWV3RGlydHkodGhpcy5fY2RSZWZJbmplY3RpbmdWaWV3IHx8IHRoaXMuX2xWaWV3KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0YWNoZXMgdGhlIHZpZXcgZnJvbSB0aGUgY2hhbmdlIGRldGVjdGlvbiB0cmVlLgogICAgICAgICAqCiAgICAgICAgICogRGV0YWNoZWQgdmlld3Mgd2lsbCBub3QgYmUgY2hlY2tlZCBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbiBydW5zIHVudGlsIHRoZXkgYXJlCiAgICAgICAgICogcmUtYXR0YWNoZWQsIGV2ZW4gaWYgdGhleSBhcmUgZGlydHkuIGBkZXRhY2hgIGNhbiBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgKICAgICAgICAgKiB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGVjdENoYW5nZXMgZGV0ZWN0Q2hhbmdlc30gdG8gaW1wbGVtZW50IGxvY2FsIGNoYW5nZQogICAgICAgICAqIGRldGVjdGlvbiBjaGVja3MuCiAgICAgICAgICoKICAgICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpbmsgdG8gYSBjaGFwdGVyIG9uIGRldGFjaC9yZWF0dGFjaC9sb2NhbCBkaWdlc3QgLS0+CiAgICAgICAgICogPCEtLSBUT0RPOiBBZGQgYSBsaXZlIGRlbW8gb25jZSByZWYuZGV0ZWN0Q2hhbmdlcyBpcyBtZXJnZWQgaW50byBtYXN0ZXIgLS0+CiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgRXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjb21wb25lbnQgd2l0aCBhIGxhcmdlIGxpc3Qgb2YgcmVhZG9ubHkgZGF0YS4KICAgICAgICAgKiBJbWFnaW5lIHRoZSBkYXRhIGNoYW5nZXMgY29uc3RhbnRseSwgbWFueSB0aW1lcyBwZXIgc2Vjb25kLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKICAgICAgICAgKiB3ZSB3YW50IHRvIGNoZWNrIGFuZCB1cGRhdGUgdGhlIGxpc3QgZXZlcnkgZml2ZSBzZWNvbmRzLiBXZSBjYW4gZG8gdGhhdCBieSBkZXRhY2hpbmcKICAgICAgICAgKiB0aGUgY29tcG9uZW50J3MgY2hhbmdlIGRldGVjdG9yIGFuZCBkb2luZyBhIGxvY2FsIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy4KICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBjbGFzcyBEYXRhUHJvdmlkZXIgewogICAgICAgICAqICAgLy8gaW4gYSByZWFsIGFwcGxpY2F0aW9uIHRoZSByZXR1cm5lZCBkYXRhIHdpbGwgYmUgZGlmZmVyZW50IGV2ZXJ5IHRpbWUKICAgICAgICAgKiAgIGdldCBkYXRhKCkgewogICAgICAgICAqICAgICByZXR1cm4gWzEsMiwzLDQsNV07CiAgICAgICAgICogICB9CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXEBDb21wb25lbnQoewogICAgICAgICAqICAgc2VsZWN0b3I6ICdnaWFudC1saXN0JywKICAgICAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgICAgICogICAgIDxsaSAqbmdGb3I9ImxldCBkIG9mIGRhdGFQcm92aWRlci5kYXRhIj5EYXRhIHt7ZH19PC9saT4KICAgICAgICAgKiAgIGAsCiAgICAgICAgICogfSkKICAgICAgICAgKiBjbGFzcyBHaWFudExpc3QgewogICAgICAgICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyKSB7CiAgICAgICAgICogICAgIHJlZi5kZXRhY2goKTsKICAgICAgICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAqICAgICAgIHRoaXMucmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICAgKiAgICAgfSwgNTAwMCk7CiAgICAgICAgICogICB9CiAgICAgICAgICogfQogICAgICAgICAqICAvCiAgICAgICAgICogICBzZWxlY3RvcjogJ2FwcCcsCiAgICAgICAgICogICBwcm92aWRlcnM6IFtEYXRhUHJvdmlkZXJdLAogICAgICAgICAqICAgdGVtcGxhdGU6IGAKICAgICAgICAgKiAgICAgPGdpYW50LWxpc3Q+PGdpYW50LWxpc3Q+CiAgICAgICAgICogICBgLAogICAgICAgICAqIH0pCiAgICAgICAgICogY2xhc3MgQXBwIHsKICAgICAgICAgKiB9CiAgICAgICAgICogYGBgCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXRhY2goKSB7CiAgICAgICAgICAgIHRoaXMuX2xWaWV3W0ZMQUdTXSAmPSB+MTI4IC8qIEF0dGFjaGVkICovOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZS1hdHRhY2hlcyBhIHZpZXcgdG8gdGhlIGNoYW5nZSBkZXRlY3Rpb24gdHJlZS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgdG8gcmUtYXR0YWNoIHZpZXdzIHRoYXQgd2VyZSBwcmV2aW91c2x5IGRldGFjaGVkIGZyb20gdGhlIHRyZWUKICAgICAgICAgKiB1c2luZyB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9LiBWaWV3cyBhcmUgYXR0YWNoZWQgdG8gdGhlIHRyZWUgYnkgZGVmYXVsdC4KICAgICAgICAgKgogICAgICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byBhIGNoYXB0ZXIgb24gZGV0YWNoL3JlYXR0YWNoL2xvY2FsIGRpZ2VzdCAtLT4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqICMjIyBFeGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIGNvbXBvbmVudCBkaXNwbGF5aW5nIGBsaXZlYCBkYXRhLiBUaGUgY29tcG9uZW50IHdpbGwgZGV0YWNoCiAgICAgICAgICogaXRzIGNoYW5nZSBkZXRlY3RvciBmcm9tIHRoZSBtYWluIGNoYW5nZSBkZXRlY3RvciB0cmVlIHdoZW4gdGhlIGNvbXBvbmVudCdzIGxpdmUgcHJvcGVydHkKICAgICAgICAgKiBpcyBzZXQgdG8gZmFsc2UuCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogY2xhc3MgRGF0YVByb3ZpZGVyIHsKICAgICAgICAgKiAgIGRhdGEgPSAxOwogICAgICAgICAqCiAgICAgICAgICogICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgKiAgICAgc2V0SW50ZXJ2YWwoKCkgPT4gewogICAgICAgICAqICAgICAgIHRoaXMuZGF0YSA9IHRoaXMuZGF0YSAqIDI7CiAgICAgICAgICogICAgIH0sIDUwMCk7CiAgICAgICAgICogICB9CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXEBDb21wb25lbnQoewogICAgICAgICAqICAgc2VsZWN0b3I6ICdsaXZlLWRhdGEnLAogICAgICAgICAqICAgaW5wdXRzOiBbJ2xpdmUnXSwKICAgICAgICAgKiAgIHRlbXBsYXRlOiAnRGF0YToge3tkYXRhUHJvdmlkZXIuZGF0YX19JwogICAgICAgICAqIH0pCiAgICAgICAgICogY2xhc3MgTGl2ZURhdGEgewogICAgICAgICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSByZWY6IENoYW5nZURldGVjdG9yUmVmLCBwcml2YXRlIGRhdGFQcm92aWRlcjogRGF0YVByb3ZpZGVyKSB7fQogICAgICAgICAqCiAgICAgICAgICogICBzZXQgbGl2ZSh2YWx1ZSkgewogICAgICAgICAqICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgKiAgICAgICB0aGlzLnJlZi5yZWF0dGFjaCgpOwogICAgICAgICAqICAgICB9IGVsc2UgewogICAgICAgICAqICAgICAgIHRoaXMucmVmLmRldGFjaCgpOwogICAgICAgICAqICAgICB9CiAgICAgICAgICogICB9CiAgICAgICAgICogfQogICAgICAgICAqICAvCiAgICAgICAgICogICBzZWxlY3RvcjogJ215LWFwcCcsCiAgICAgICAgICogICBwcm92aWRlcnM6IFtEYXRhUHJvdmlkZXJdLAogICAgICAgICAqICAgdGVtcGxhdGU6IGAKICAgICAgICAgKiAgICAgTGl2ZSBVcGRhdGU6IDxpbnB1dCB0eXBlPSJjaGVja2JveCIgWyhuZ01vZGVsKV09ImxpdmUiPgogICAgICAgICAqICAgICA8bGl2ZS1kYXRhIFtsaXZlXT0ibGl2ZSI+PGxpdmUtZGF0YT4KICAgICAgICAgKiAgIGAsCiAgICAgICAgICogfSkKICAgICAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQgewogICAgICAgICAqICAgbGl2ZSA9IHRydWU7CiAgICAgICAgICogfQogICAgICAgICAqIGBgYAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVhdHRhY2goKSB7CiAgICAgICAgICAgIHRoaXMuX2xWaWV3W0ZMQUdTXSB8PSAxMjggLyogQXR0YWNoZWQgKi87CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB0aGUgdmlldyBhbmQgaXRzIGNoaWxkcmVuLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBjYW4gYWxzbyBiZSB1c2VkIGluIGNvbWJpbmF0aW9uIHdpdGgge1xAbGluayBDaGFuZ2VEZXRlY3RvclJlZiNkZXRhY2ggZGV0YWNofSB0byBpbXBsZW1lbnQKICAgICAgICAgKiBsb2NhbCBjaGFuZ2UgZGV0ZWN0aW9uIGNoZWNrcy4KICAgICAgICAgKgogICAgICAgICAqIDwhLS0gVE9ETzogQWRkIGEgbGluayB0byBhIGNoYXB0ZXIgb24gZGV0YWNoL3JlYXR0YWNoL2xvY2FsIGRpZ2VzdCAtLT4KICAgICAgICAgKiA8IS0tIFRPRE86IEFkZCBhIGxpdmUgZGVtbyBvbmNlIHJlZi5kZXRlY3RDaGFuZ2VzIGlzIG1lcmdlZCBpbnRvIG1hc3RlciAtLT4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqICMjIyBFeGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIGNvbXBvbmVudCB3aXRoIGEgbGFyZ2UgbGlzdCBvZiByZWFkb25seSBkYXRhLgogICAgICAgICAqIEltYWdpbmUsIHRoZSBkYXRhIGNoYW5nZXMgY29uc3RhbnRseSwgbWFueSB0aW1lcyBwZXIgc2Vjb25kLiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywKICAgICAgICAgKiB3ZSB3YW50IHRvIGNoZWNrIGFuZCB1cGRhdGUgdGhlIGxpc3QgZXZlcnkgZml2ZSBzZWNvbmRzLgogICAgICAgICAqCiAgICAgICAgICogV2UgY2FuIGRvIHRoYXQgYnkgZGV0YWNoaW5nIHRoZSBjb21wb25lbnQncyBjaGFuZ2UgZGV0ZWN0b3IgYW5kIGRvaW5nIGEgbG9jYWwgY2hhbmdlIGRldGVjdGlvbgogICAgICAgICAqIGNoZWNrIGV2ZXJ5IGZpdmUgc2Vjb25kcy4KICAgICAgICAgKgogICAgICAgICAqIFNlZSB7XEBsaW5rIENoYW5nZURldGVjdG9yUmVmI2RldGFjaCBkZXRhY2h9IGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0ZWN0Q2hhbmdlcygpIHsKICAgICAgICAgICAgZGV0ZWN0Q2hhbmdlc0ludGVybmFsKHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcsIHRoaXMuY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB0aGUgY2hhbmdlIGRldGVjdG9yIGFuZCBpdHMgY2hpbGRyZW4sIGFuZCB0aHJvd3MgaWYgYW55IGNoYW5nZXMgYXJlIGRldGVjdGVkLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyB1c2VkIGluIGRldmVsb3BtZW50IG1vZGUgdG8gdmVyaWZ5IHRoYXQgcnVubmluZyBjaGFuZ2UgZGV0ZWN0aW9uIGRvZXNuJ3QKICAgICAgICAgKiBpbnRyb2R1Y2Ugb3RoZXIgY2hhbmdlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNoZWNrTm9DaGFuZ2VzKCkgewogICAgICAgICAgICBjaGVja05vQ2hhbmdlc0ludGVybmFsKHRoaXMuX2xWaWV3W1RWSUVXXSwgdGhpcy5fbFZpZXcsIHRoaXMuY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmNSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaFRvVmlld0NvbnRhaW5lclJlZih2Y1JlZikgewogICAgICAgICAgICBpZiAodGhpcy5fYXBwUmVmKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoaXMgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIGRpcmVjdGx5IHRvIHRoZSBBcHBsaWNhdGlvblJlZiEnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gdmNSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoRnJvbUFwcFJlZigpIHsKICAgICAgICAgICAgdGhpcy5fYXBwUmVmID0gbnVsbDsKICAgICAgICAgICAgcmVuZGVyRGV0YWNoVmlldyh0aGlzLl9sVmlld1tUVklFV10sIHRoaXMuX2xWaWV3KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhcHBSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaFRvQXBwUmVmKGFwcFJlZikgewogICAgICAgICAgICBpZiAodGhpcy5fdmlld0NvbnRhaW5lclJlZikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIHZpZXcgaXMgYWxyZWFkeSBhdHRhY2hlZCB0byBhIFZpZXdDb250YWluZXIhJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYXBwUmVmID0gYXBwUmVmOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgUm9vdFZpZXdSZWYgZXh0ZW5kcyBWaWV3UmVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZpZXcpIHsKICAgICAgICAgICAgc3VwZXIoX3ZpZXcpOwogICAgICAgICAgICB0aGlzLl92aWV3ID0gX3ZpZXc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0ZWN0Q2hhbmdlcygpIHsKICAgICAgICAgICAgZGV0ZWN0Q2hhbmdlc0luUm9vdFZpZXcodGhpcy5fdmlldyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2hlY2tOb0NoYW5nZXMoKSB7CiAgICAgICAgICAgIGNoZWNrTm9DaGFuZ2VzSW5Sb290Vmlldyh0aGlzLl92aWV3KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY29udGV4dCgpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IHJlc3VsdAogICAgICogQHBhcmFtIHs/PX0gaXNQcm9qZWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb2xsZWN0TmF0aXZlTm9kZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgcmVzdWx0LCBpc1Byb2plY3Rpb24gPSBmYWxzZSkgewogICAgICAgIHdoaWxlICh0Tm9kZSAhPT0gbnVsbCkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXModE5vZGUsIDMgLyogRWxlbWVudCAqLywgMCAvKiBDb250YWluZXIgKi8sIDEgLyogUHJvamVjdGlvbiAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovLCA1IC8qIEljdUNvbnRhaW5lciAqLyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbE5vZGUgPSBsVmlld1t0Tm9kZS5pbmRleF07CiAgICAgICAgICAgIGlmIChsTm9kZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2godW53cmFwUk5vZGUobE5vZGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBIGdpdmVuIGxOb2RlIGNhbiByZXByZXNlbnQgZWl0aGVyIGEgbmF0aXZlIG5vZGUgb3IgYSBMQ29udGFpbmVyICh3aGVuIGl0IGlzIGEgaG9zdCBvZiBhCiAgICAgICAgICAgIC8vIFZpZXdDb250YWluZXJSZWYpLiBXaGVuIHdlIGZpbmQgYSBMQ29udGFpbmVyIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvIGl0IHRvIGNvbGxlY3Qgcm9vdCBub2RlcwogICAgICAgICAgICAvLyBmcm9tIHRoZSB2aWV3cyBpbiB0aGlzIGNvbnRhaW5lci4KICAgICAgICAgICAgaWYgKGlzTENvbnRhaW5lcihsTm9kZSkpIHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsgaSA8IGxOb2RlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxWaWV3SW5BQ29udGFpbmVyID0gbE5vZGVbaV07CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxWaWV3Rmlyc3RDaGlsZFROb2RlID0gbFZpZXdJbkFDb250YWluZXJbVFZJRVddLmZpcnN0Q2hpbGQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxWaWV3Rmlyc3RDaGlsZFROb2RlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3ROYXRpdmVOb2RlcyhsVmlld0luQUNvbnRhaW5lcltUVklFV10sIGxWaWV3SW5BQ29udGFpbmVyLCBsVmlld0ZpcnN0Q2hpbGRUTm9kZSwgcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZVR5cGUgPSB0Tm9kZS50eXBlOwogICAgICAgICAgICBpZiAodE5vZGVUeXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gfHwgdE5vZGVUeXBlID09PSA1IC8qIEljdUNvbnRhaW5lciAqLykgewogICAgICAgICAgICAgICAgY29sbGVjdE5hdGl2ZU5vZGVzKHRWaWV3LCBsVmlldywgdE5vZGUuY2hpbGQsIHJlc3VsdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodE5vZGVUeXBlID09PSAxIC8qIFByb2plY3Rpb24gKi8pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBsVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV107CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRIb3N0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFZpZXdbVF9IT1NUXSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2xvdElkeCA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZS5wcm9qZWN0aW9uKSk7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgICAgICBhc3NlcnREZWZpbmVkKGNvbXBvbmVudEhvc3QucHJvamVjdGlvbiwgJ0NvbXBvbmVudHMgd2l0aCBwcm9qZWN0aW9uIG5vZGVzICg8bmctY29udGVudD4pIG11c3QgaGF2ZSBwcm9qZWN0aW9uIHNsb3RzIGRlZmluZWQuJyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBub2Rlc0luU2xvdCA9ICgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRIb3N0LnByb2plY3Rpb24pKVtzbG90SWR4XTsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vZGVzSW5TbG90KSkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKC4uLm5vZGVzSW5TbG90KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldExWaWV3UGFyZW50KGNvbXBvbmVudFZpZXcpKSk7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQocGFyZW50VmlldywgJ0NvbXBvbmVudCB2aWV3cyBzaG91bGQgYWx3YXlzIGhhdmUgYSBwYXJlbnQgdmlldyAoY29tcG9uZW50XCdzIGhvc3QgdmlldyknKTsKICAgICAgICAgICAgICAgICAgICBjb2xsZWN0TmF0aXZlTm9kZXMocGFyZW50Vmlld1tUVklFV10sIHBhcmVudFZpZXcsIG5vZGVzSW5TbG90LCByZXN1bHQsIHRydWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHROb2RlID0gaXNQcm9qZWN0aW9uID8gdE5vZGUucHJvamVjdGlvbk5leHQgOiB0Tm9kZS5uZXh0OwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy92aWV3X2VuZ2luZV9jb21wYXRpYmlsaXR5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBFbGVtZW50UmVmIGZyb20gdGhlIG1vc3QgcmVjZW50IG5vZGUuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBFbGVtZW50UmVmVG9rZW4KICAgICAqIEByZXR1cm4gez99IFRoZSBFbGVtZW50UmVmIGluc3RhbmNlIHRvIHVzZQogICAgICovCiAgICBmdW5jdGlvbiBpbmplY3RFbGVtZW50UmVmKEVsZW1lbnRSZWZUb2tlbikgewogICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50UmVmKEVsZW1lbnRSZWZUb2tlbiwgZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGdldExWaWV3KCkpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IFIzRWxlbWVudFJlZjsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBFbGVtZW50UmVmIGdpdmVuIGEgbm9kZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IEVsZW1lbnRSZWZUb2tlbiBUaGUgRWxlbWVudFJlZiB0eXBlCiAgICAgKiBAcGFyYW0gez99IHROb2RlIFRoZSBub2RlIGZvciB3aGljaCB5b3UnZCBsaWtlIGFuIEVsZW1lbnRSZWYKICAgICAqIEBwYXJhbSB7P30gdmlldyBUaGUgdmlldyB0byB3aGljaCB0aGUgbm9kZSBiZWxvbmdzCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgRWxlbWVudFJlZiBpbnN0YW5jZSB0byB1c2UKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIHROb2RlLCB2aWV3KSB7CiAgICAgICAgaWYgKCFSM0VsZW1lbnRSZWYpIHsKICAgICAgICAgICAgUjNFbGVtZW50UmVmID0gY2xhc3MgRWxlbWVudFJlZiBleHRlbmRzIEVsZW1lbnRSZWZUb2tlbiB7CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUjNFbGVtZW50UmVmKCgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKHROb2RlLCB2aWV3KSkpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBSM1RlbXBsYXRlUmVmOwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgVGVtcGxhdGVSZWYgZ2l2ZW4gYSBub2RlLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IFRlbXBsYXRlUmVmVG9rZW4KICAgICAqIEBwYXJhbSB7P30gRWxlbWVudFJlZlRva2VuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgVGVtcGxhdGVSZWYgaW5zdGFuY2UgdG8gdXNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdFRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbikgewogICAgICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZlRva2VuLCBFbGVtZW50UmVmVG9rZW4sIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBnZXRMVmlldygpKTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIFRlbXBsYXRlUmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IFRlbXBsYXRlUmVmVG9rZW4gVGhlIFRlbXBsYXRlUmVmIHR5cGUKICAgICAqIEBwYXJhbSB7P30gRWxlbWVudFJlZlRva2VuIFRoZSBFbGVtZW50UmVmIHR5cGUKICAgICAqIEBwYXJhbSB7P30gaG9zdFROb2RlIFRoZSBub2RlIG9uIHdoaWNoIGEgVGVtcGxhdGVSZWYgaXMgcmVxdWVzdGVkCiAgICAgKiBAcGFyYW0gez99IGhvc3RWaWV3IFRoZSB2aWV3IHRvIHdoaWNoIHRoZSBub2RlIGJlbG9uZ3MKICAgICAqIEByZXR1cm4gez99IFRoZSBUZW1wbGF0ZVJlZiBpbnN0YW5jZSBvciBudWxsIGlmIHdlIGNhbid0IGNyZWF0ZSBhIFRlbXBsYXRlUmVmIG9uIGEgZ2l2ZW4gbm9kZSB0eXBlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgaG9zdFROb2RlLCBob3N0VmlldykgewogICAgICAgIGlmICghUjNUZW1wbGF0ZVJlZikgewogICAgICAgICAgICBSM1RlbXBsYXRlUmVmID0gY2xhc3MgVGVtcGxhdGVSZWYgZXh0ZW5kcyBUZW1wbGF0ZVJlZlRva2VuIHsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfZGVjbGFyYXRpb25WaWV3CiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9kZWNsYXJhdGlvblRDb250YWluZXIKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjb25zdHJ1Y3RvcihfZGVjbGFyYXRpb25WaWV3LCBfZGVjbGFyYXRpb25UQ29udGFpbmVyLCBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWNsYXJhdGlvblZpZXcgPSBfZGVjbGFyYXRpb25WaWV3OwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlY2xhcmF0aW9uVENvbnRhaW5lciA9IF9kZWNsYXJhdGlvblRDb250YWluZXI7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZFRWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RlY2xhcmF0aW9uVENvbnRhaW5lci50Vmlld3MpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW1iZWRkZWRMVmlldyA9IGNyZWF0ZUxWaWV3KHRoaXMuX2RlY2xhcmF0aW9uVmlldywgZW1iZWRkZWRUVmlldywgY29udGV4dCwgMTYgLyogQ2hlY2tBbHdheXMgKi8sIG51bGwsIGVtYmVkZGVkVFZpZXcubm9kZSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlY2xhcmF0aW9uTENvbnRhaW5lciA9IHRoaXMuX2RlY2xhcmF0aW9uVmlld1t0aGlzLl9kZWNsYXJhdGlvblRDb250YWluZXIuaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGRlY2xhcmF0aW9uTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgZW1iZWRkZWRMVmlld1tERUNMQVJBVElPTl9MQ09OVEFJTkVSXSA9IGRlY2xhcmF0aW9uTENvbnRhaW5lcjsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVjbGFyYXRpb25WaWV3TFF1ZXJpZXMgPSB0aGlzLl9kZWNsYXJhdGlvblZpZXdbUVVFUklFU107CiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uVmlld0xRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkZGVkTFZpZXdbUVVFUklFU10gPSBkZWNsYXJhdGlvblZpZXdMUXVlcmllcy5jcmVhdGVFbWJlZGRlZFZpZXcoZW1iZWRkZWRUVmlldyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbmRlclZpZXcoZW1iZWRkZWRUVmlldywgZW1iZWRkZWRMVmlldywgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBWaWV3UmVmKGVtYmVkZGVkTFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBpZiAoaG9zdFROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKGhvc3RUTm9kZS50Vmlld3MsICdUVmlldyBtdXN0IGJlIGFsbG9jYXRlZCcpOwogICAgICAgICAgICByZXR1cm4gbmV3IFIzVGVtcGxhdGVSZWYoaG9zdFZpZXcsICgvKiogQHR5cGUgez99ICovIChob3N0VE5vZGUpKSwgY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIGhvc3RUTm9kZSwgaG9zdFZpZXcpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBSM1ZpZXdDb250YWluZXJSZWY7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBWaWV3Q29udGFpbmVyUmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yLiBPciwgaWYgdGhlIFZpZXdDb250YWluZXJSZWYKICAgICAqIGFscmVhZHkgZXhpc3RzLCByZXRyaWV2ZXMgdGhlIGV4aXN0aW5nIFZpZXdDb250YWluZXJSZWYuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBWaWV3Q29udGFpbmVyUmVmVG9rZW4KICAgICAqIEBwYXJhbSB7P30gRWxlbWVudFJlZlRva2VuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgVmlld0NvbnRhaW5lclJlZiBpbnN0YW5jZSB0byB1c2UKICAgICAqLwogICAgZnVuY3Rpb24gaW5qZWN0Vmlld0NvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c1ROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpKSk7CiAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgcHJldmlvdXNUTm9kZSwgZ2V0TFZpZXcoKSk7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBWaWV3Q29udGFpbmVyUmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gVmlld0NvbnRhaW5lclJlZlRva2VuIFRoZSBWaWV3Q29udGFpbmVyUmVmIHR5cGUKICAgICAqIEBwYXJhbSB7P30gRWxlbWVudFJlZlRva2VuIFRoZSBFbGVtZW50UmVmIHR5cGUKICAgICAqIEBwYXJhbSB7P30gaG9zdFROb2RlIFRoZSBub2RlIHRoYXQgaXMgcmVxdWVzdGluZyBhIFZpZXdDb250YWluZXJSZWYKICAgICAqIEBwYXJhbSB7P30gaG9zdFZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncwogICAgICogQHJldHVybiB7P30gVGhlIFZpZXdDb250YWluZXJSZWYgaW5zdGFuY2UgdG8gdXNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmVG9rZW4sIEVsZW1lbnRSZWZUb2tlbiwgaG9zdFROb2RlLCBob3N0VmlldykgewogICAgICAgIGlmICghUjNWaWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgIFIzVmlld0NvbnRhaW5lclJlZiA9IGNsYXNzIFZpZXdDb250YWluZXJSZWYgZXh0ZW5kcyBWaWV3Q29udGFpbmVyUmVmVG9rZW4gewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9sQ29udGFpbmVyCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9ob3N0VE5vZGUKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX2hvc3RWaWV3CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNvbnN0cnVjdG9yKF9sQ29udGFpbmVyLCBfaG9zdFROb2RlLCBfaG9zdFZpZXcpIHsKICAgICAgICAgICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xDb250YWluZXIgPSBfbENvbnRhaW5lcjsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ob3N0VE5vZGUgPSBfaG9zdFROb2RlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hvc3RWaWV3ID0gX2hvc3RWaWV3OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnZXQgZWxlbWVudCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3JlYXRlRWxlbWVudFJlZihFbGVtZW50UmVmVG9rZW4sIHRoaXMuX2hvc3RUTm9kZSwgdGhpcy5faG9zdFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnZXQgaW5qZWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodGhpcy5faG9zdFROb2RlLCB0aGlzLl9ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnZXQgcGFyZW50SW5qZWN0b3IoKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudExvY2F0aW9uID0gZ2V0UGFyZW50SW5qZWN0b3JMb2NhdGlvbih0aGlzLl9ob3N0VE5vZGUsIHRoaXMuX2hvc3RWaWV3KTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50VmlldyA9IGdldFBhcmVudEluamVjdG9yVmlldyhwYXJlbnRMb2NhdGlvbiwgdGhpcy5faG9zdFZpZXcpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRUTm9kZSA9IGdldFBhcmVudEluamVjdG9yVE5vZGUocGFyZW50TG9jYXRpb24sIHRoaXMuX2hvc3RWaWV3LCB0aGlzLl9ob3N0VE5vZGUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAhaGFzUGFyZW50SW5qZWN0b3IocGFyZW50TG9jYXRpb24pIHx8IHBhcmVudFROb2RlID09IG51bGwgPwogICAgICAgICAgICAgICAgICAgICAgICBuZXcgTm9kZUluamVjdG9yKG51bGwsIHRoaXMuX2hvc3RWaWV3KSA6CiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBOb2RlSW5qZWN0b3IocGFyZW50VE5vZGUsIHBhcmVudFZpZXcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAodGhpcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVtb3ZlKHRoaXMubGVuZ3RoIC0gMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBnZXQoaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdICE9PSBudWxsICYmICgvKiogQHR5cGUgez99ICovICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10pKVtpbmRleF0gfHwgbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZ2V0IGxlbmd0aCgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbENvbnRhaW5lci5sZW5ndGggLSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQHRlbXBsYXRlIEMKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHQKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjcmVhdGVFbWJlZGRlZFZpZXcodGVtcGxhdGVSZWYsIGNvbnRleHQsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdSZWYgPSB0ZW1wbGF0ZVJlZi5jcmVhdGVFbWJlZGRlZFZpZXcoY29udGV4dCB8fCAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQodmlld1JlZiwgaW5kZXgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAdGVtcGxhdGUgQwogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3J5CiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gaW5qZWN0b3IKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IHByb2plY3RhYmxlTm9kZXMKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlUmVmCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgaW5kZXgsIGluamVjdG9yLCBwcm9qZWN0YWJsZU5vZGVzLCBuZ01vZHVsZVJlZikgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZXh0SW5qZWN0b3IgPSBpbmplY3RvciB8fCB0aGlzLnBhcmVudEluamVjdG9yOwogICAgICAgICAgICAgICAgICAgIGlmICghbmdNb2R1bGVSZWYgJiYgKCgvKiogQHR5cGUgez99ICovIChjb21wb25lbnRGYWN0b3J5KSkpLm5nTW9kdWxlID09IG51bGwgJiYgY29udGV4dEluamVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIERPIE5PVCBSRUZBQ1RPUi4gVGhlIGNvZGUgaGVyZSB1c2VkIHRvIGhhdmUgYSBgdmFsdWUgfHwgdW5kZWZpbmVkYCBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIHNlZW1zIHRvIGNhdXNlIGludGVybmFsIGdvb2dsZSBhcHBzIHRvIGZhaWwuIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIGludGVybmFsIGJ1ZyBpc3N1ZTogZ28vYi8xNDI5Njc4MDIKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSBjb250ZXh0SW5qZWN0b3IuZ2V0KE5nTW9kdWxlUmVmLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVSZWYgPSByZXN1bHQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudFJlZiA9IGNvbXBvbmVudEZhY3RvcnkuY3JlYXRlKGNvbnRleHRJbmplY3RvciwgcHJvamVjdGFibGVOb2RlcywgdW5kZWZpbmVkLCBuZ01vZHVsZVJlZik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnNlcnQoY29tcG9uZW50UmVmLmhvc3RWaWV3LCBpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBvbmVudFJlZjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3UmVmCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaW5zZXJ0KHZpZXdSZWYsIGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxWaWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1JlZikpKS5fbFZpZXcpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBsVmlld1tUVklFV107CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdSZWYuZGVzdHJveWVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGluc2VydCBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZpZXdBdHRhY2hlZFRvQ29udGFpbmVyKGxWaWV3KSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB2aWV3IGlzIGFscmVhZHkgYXR0YWNoZWQsIGRldGFjaCBpdCBmaXJzdCBzbyB3ZSBjbGVhbiB1cCByZWZlcmVuY2VzIGFwcHJvcHJpYXRlbHkuCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJldklkeCA9IHRoaXMuaW5kZXhPZih2aWV3UmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSB2aWV3IG1pZ2h0IGJlIGF0dGFjaGVkIGVpdGhlciB0byB0aGlzIG9yIGEgZGlmZmVyZW50IGNvbnRhaW5lci4gVGhlIGBwcmV2SWR4YCBmb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhvc2UgY2FzZXMgd2lsbCBiZToKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXF1YWwgdG8gLTEgZm9yIHZpZXdzIGF0dGFjaGVkIHRvIHRoaXMgVmlld0NvbnRhaW5lclJlZgogICAgICAgICAgICAgICAgICAgICAgICAvLyA+PSAwIGZvciB2aWV3cyBhdHRhY2hlZCB0byBhIGRpZmZlcmVudCBWaWV3Q29udGFpbmVyUmVmCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2SWR4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZXRhY2gocHJldklkeCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2TENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChsVmlld1tQQVJFTlRdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbChpc0xDb250YWluZXIocHJldkxDb250YWluZXIpLCB0cnVlLCAnQW4gYXR0YWNoZWQgdmlldyBzaG91bGQgaGF2ZSBpdHMgUEFSRU5UIHBvaW50IHRvIGEgY29udGFpbmVyLicpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZS1jcmVhdGUgYSBSM1ZpZXdDb250YWluZXJSZWYgaW5zdGFuY2Ugc2luY2UgdGhvc2UgYXJlIG5vdCBzdG9yZWQgb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExWaWV3IChub3IgYW55d2hlcmUgZWxzZSkuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcmV2VkNSZWYgPSBuZXcgUjNWaWV3Q29udGFpbmVyUmVmKHByZXZMQ29udGFpbmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAocHJldkxDb250YWluZXJbVF9IT1NUXSkpLCBwcmV2TENvbnRhaW5lcltQQVJFTlRdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXZWQ1JlZi5kZXRhY2gocHJldlZDUmVmLmluZGV4T2Yodmlld1JlZikpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBhZGp1c3RlZElkeCA9IHRoaXMuX2FkanVzdEluZGV4KGluZGV4KTsKICAgICAgICAgICAgICAgICAgICBpbnNlcnRWaWV3KHRWaWV3LCBsVmlldywgdGhpcy5fbENvbnRhaW5lciwgYWRqdXN0ZWRJZHgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBiZWZvcmVOb2RlID0gZ2V0QmVmb3JlTm9kZUZvclZpZXcoYWRqdXN0ZWRJZHgsIHRoaXMuX2xDb250YWluZXIpOwogICAgICAgICAgICAgICAgICAgIGFkZFJlbW92ZVZpZXdGcm9tQ29udGFpbmVyKHRWaWV3LCBsVmlldywgdHJ1ZSwgYmVmb3JlTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh2aWV3UmVmKSkpLmF0dGFjaFRvVmlld0NvbnRhaW5lclJlZih0aGlzKTsKICAgICAgICAgICAgICAgICAgICBhZGRUb0FycmF5KCgvKiogQHR5cGUgez99ICovICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10pKSwgYWRqdXN0ZWRJZHgsIHZpZXdSZWYpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB2aWV3UmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWYKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmV3SW5kZXgKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG1vdmUodmlld1JlZiwgbmV3SW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodmlld1JlZi5kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgbW92ZSBhIGRlc3Ryb3llZCBWaWV3IGluIGEgVmlld0NvbnRhaW5lciEnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5zZXJ0KHZpZXdSZWYsIG5ld0luZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3UmVmCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbmRleE9mKHZpZXdSZWYpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgdmlld1JlZnNBcnIgPSB0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU107CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXdSZWZzQXJyICE9PSBudWxsID8gdmlld1JlZnNBcnIuaW5kZXhPZih2aWV3UmVmKSA6IC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmVtb3ZlKGluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFkanVzdGVkSWR4ID0gdGhpcy5fYWRqdXN0SW5kZXgoaW5kZXgsIC0xKTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVWaWV3KHRoaXMuX2xDb250YWluZXIsIGFkanVzdGVkSWR4KTsKICAgICAgICAgICAgICAgICAgICByZW1vdmVGcm9tQXJyYXkoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2xDb250YWluZXJbVklFV19SRUZTXSkpLCBhZGp1c3RlZElkeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBkZXRhY2goaW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFsbG9jYXRlQ29udGFpbmVySWZOZWVkZWQoKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWRqdXN0ZWRJZHggPSB0aGlzLl9hZGp1c3RJbmRleChpbmRleCwgLTEpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gZGV0YWNoVmlldyh0aGlzLl9sQ29udGFpbmVyLCBhZGp1c3RlZElkeCk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhc0RldGFjaGVkID0gdmlldyAmJiByZW1vdmVGcm9tQXJyYXkoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2xDb250YWluZXJbVklFV19SRUZTXSkpLCBhZGp1c3RlZElkeCkgIT0gbnVsbDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd2FzRGV0YWNoZWQgPyBuZXcgVmlld1JlZigoLyoqIEB0eXBlIHs/fSAqLyAodmlldykpKSA6IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez89fSBpbmRleAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gc2hpZnQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIF9hZGp1c3RJbmRleChpbmRleCwgc2hpZnQgPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMubGVuZ3RoICsgc2hpZnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0R3JlYXRlclRoYW4oaW5kZXgsIC0xLCBgVmlld1JlZiBpbmRleCBtdXN0IGJlIHBvc2l0aXZlLCBnb3QgJHtpbmRleH1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gKzEgYmVjYXVzZSBpdCdzIGxlZ2FsIHRvIGluc2VydCBhdCB0aGUgZW5kLgogICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRMZXNzVGhhbihpbmRleCwgdGhpcy5sZW5ndGggKyAxICsgc2hpZnQsICdpbmRleCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBhbGxvY2F0ZUNvbnRhaW5lcklmTmVlZGVkKCkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9sQ29udGFpbmVyW1ZJRVdfUkVGU10gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbENvbnRhaW5lcltWSUVXX1JFRlNdID0gW107CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyhob3N0VE5vZGUsIDAgLyogQ29udGFpbmVyICovLCAzIC8qIEVsZW1lbnQgKi8sIDQgLyogRWxlbWVudENvbnRhaW5lciAqLyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBsQ29udGFpbmVyOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90VmFsdWUgPSBob3N0Vmlld1tob3N0VE5vZGUuaW5kZXhdOwogICAgICAgIGlmIChpc0xDb250YWluZXIoc2xvdFZhbHVlKSkgewogICAgICAgICAgICAvLyBJZiB0aGUgaG9zdCBpcyBhIGNvbnRhaW5lciwgd2UgZG9uJ3QgbmVlZCB0byBjcmVhdGUgYSBuZXcgTENvbnRhaW5lcgogICAgICAgICAgICBsQ29udGFpbmVyID0gc2xvdFZhbHVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29tbWVudE5vZGU7CiAgICAgICAgICAgIC8vIElmIHRoZSBob3N0IGlzIGFuIGVsZW1lbnQgY29udGFpbmVyLCB0aGUgbmF0aXZlIGhvc3QgZWxlbWVudCBpcyBndWFyYW50ZWVkIHRvIGJlIGEKICAgICAgICAgICAgLy8gY29tbWVudCBhbmQgd2UgY2FuIHJldXNlIHRoYXQgY29tbWVudCBhcyBhbmNob3IgZWxlbWVudCBmb3IgdGhlIG5ldyBMQ29udGFpbmVyLgogICAgICAgICAgICAvLyBUaGUgY29tbWVudCBub2RlIGluIHF1ZXN0aW9uIGlzIGFscmVhZHkgcGFydCBvZiB0aGUgRE9NIHN0cnVjdHVyZSBzbyB3ZSBkb24ndCBuZWVkIHRvIGFwcGVuZAogICAgICAgICAgICAvLyBpdCBhZ2Fpbi4KICAgICAgICAgICAgaWYgKGhvc3RUTm9kZS50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgIGNvbW1lbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHVud3JhcFJOb2RlKHNsb3RWYWx1ZSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7CiAgICAgICAgICAgICAgICBjb21tZW50Tm9kZSA9IGhvc3RWaWV3W1JFTkRFUkVSXS5jcmVhdGVDb21tZW50KG5nRGV2TW9kZSA/ICdjb250YWluZXInIDogJycpOwogICAgICAgICAgICAgICAgLy8gQSBgVmlld0NvbnRhaW5lclJlZmAgY2FuIGJlIGluamVjdGVkIGJ5IHRoZSByb290ICh0b3Btb3N0IC8gYm9vdHN0cmFwcGVkKSBjb21wb25lbnQuIEluCiAgICAgICAgICAgICAgICAvLyB0aGlzIGNhc2Ugd2UgY2FuJ3QgdXNlIFRWaWV3IC8gVE5vZGUgZGF0YSBzdHJ1Y3R1cmVzIHRvIGluc2VydCBjb250YWluZXIncyBtYXJrZXIgbm9kZQogICAgICAgICAgICAgICAgLy8gKGJvdGggYSBwYXJlbnQgb2YgYSBjb21tZW50IG5vZGUgYW5kIHRoZSBjb21tZW50IG5vZGUgaXRzZWxmIGFyZSBub3QgcGFydCBvZiBhbnkgdmlldykuIEluCiAgICAgICAgICAgICAgICAvLyB0aGlzIHNwZWNpZmljIGNhc2Ugd2UgdXNlIGxvdy1sZXZlbCBET00gbWFuaXB1bGF0aW9uIHRvIGluc2VydCBjb250YWluZXIncyBtYXJrZXIgKGNvbW1lbnQpCiAgICAgICAgICAgICAgICAvLyBub2RlLgogICAgICAgICAgICAgICAgaWYgKGlzUm9vdFZpZXcoaG9zdFZpZXcpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcmVyID0gaG9zdFZpZXdbUkVOREVSRVJdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0TmF0aXZlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5VE5vZGUoaG9zdFROb2RlLCBob3N0VmlldykpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFyZW50T2ZIb3N0TmF0aXZlID0gbmF0aXZlUGFyZW50Tm9kZShyZW5kZXJlciwgaG9zdE5hdGl2ZSk7CiAgICAgICAgICAgICAgICAgICAgbmF0aXZlSW5zZXJ0QmVmb3JlKHJlbmRlcmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAocGFyZW50T2ZIb3N0TmF0aXZlKSksIGNvbW1lbnROb2RlLCBuYXRpdmVOZXh0U2libGluZyhyZW5kZXJlciwgaG9zdE5hdGl2ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgYXBwZW5kQ2hpbGQoaG9zdFZpZXdbVFZJRVddLCBob3N0VmlldywgY29tbWVudE5vZGUsIGhvc3RUTm9kZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaG9zdFZpZXdbaG9zdFROb2RlLmluZGV4XSA9IGxDb250YWluZXIgPQogICAgICAgICAgICAgICAgY3JlYXRlTENvbnRhaW5lcihzbG90VmFsdWUsIGhvc3RWaWV3LCBjb21tZW50Tm9kZSwgaG9zdFROb2RlKTsKICAgICAgICAgICAgYWRkVG9WaWV3VHJlZShob3N0VmlldywgbENvbnRhaW5lcik7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXcgUjNWaWV3Q29udGFpbmVyUmVmKGxDb250YWluZXIsIGhvc3RUTm9kZSwgaG9zdFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgQ2hhbmdlRGV0ZWN0b3JSZWYgKGEuay5hLiBhIFZpZXdSZWYpCiAgICAgKiBAcGFyYW0gez89fSBpc1BpcGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdENoYW5nZURldGVjdG9yUmVmKGlzUGlwZSA9IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIGNyZWF0ZVZpZXdSZWYoZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGdldExWaWV3KCksIGlzUGlwZSk7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBWaWV3UmVmIGFuZCBzdG9yZXMgaXQgb24gdGhlIGluamVjdG9yIGFzIENoYW5nZURldGVjdG9yUmVmIChwdWJsaWMgYWxpYXMpLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIG5vZGUgdGhhdCBpcyByZXF1ZXN0aW5nIGEgQ2hhbmdlRGV0ZWN0b3JSZWYKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgVGhlIHZpZXcgdG8gd2hpY2ggdGhlIG5vZGUgYmVsb25ncwogICAgICogQHBhcmFtIHs/fSBpc1BpcGUgV2hldGhlciB0aGUgdmlldyBpcyBiZWluZyBpbmplY3RlZCBpbnRvIGEgcGlwZS4KICAgICAqIEByZXR1cm4gez99IFRoZSBDaGFuZ2VEZXRlY3RvclJlZiB0byB1c2UKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVmlld1JlZih0Tm9kZSwgbFZpZXcsIGlzUGlwZSkgewogICAgICAgIC8vIGBpc0NvbXBvbmVudFZpZXdgIHdpbGwgYmUgdHJ1ZSBmb3IgQ29tcG9uZW50IGFuZCBEaXJlY3RpdmVzIChidXQgbm90IGZvciBQaXBlcykuCiAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvcHVsbC8zMzA3MiBmb3IgcHJvcGVyIGZpeAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0NvbXBvbmVudFZpZXcgPSAhaXNQaXBlICYmIGlzQ29tcG9uZW50SG9zdCh0Tm9kZSk7CiAgICAgICAgaWYgKGlzQ29tcG9uZW50VmlldykgewogICAgICAgICAgICAvLyBUaGUgTFZpZXcgcmVwcmVzZW50cyB0aGUgbG9jYXRpb24gd2hlcmUgdGhlIGNvbXBvbmVudCBpcyBkZWNsYXJlZC4KICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSB3YW50IHRoZSBMVmlldyBmb3IgdGhlIGNvbXBvbmVudCBWaWV3IGFuZCBzbyB3ZSBuZWVkIHRvIGxvb2sgaXQgdXAuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh0Tm9kZS5pbmRleCwgbFZpZXcpOwogICAgICAgICAgICByZXR1cm4gbmV3IFZpZXdSZWYoY29tcG9uZW50VmlldywgY29tcG9uZW50Vmlldyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLyB8fCB0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyB8fAogICAgICAgICAgICB0Tm9kZS50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gfHwgdE5vZGUudHlwZSA9PT0gNSAvKiBJY3VDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgLy8gVGhlIExWaWV3IHJlcHJlc2VudHMgdGhlIGxvY2F0aW9uIHdoZXJlIHRoZSBpbmplY3Rpb24gaXMgcmVxdWVzdGVkIGZyb20uCiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gbG9jYXRlIHRoZSBjb250YWluaW5nIExWaWV3IChpbiBjYXNlIHdoZXJlIHRoZSBgbFZpZXdgIGlzIGFuIGVtYmVkZGVkIHZpZXcpCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG9zdENvbXBvbmVudFZpZXcgPSBsVmlld1tERUNMQVJBVElPTl9DT01QT05FTlRfVklFV107CiAgICAgICAgICAgIHJldHVybiBuZXcgVmlld1JlZihob3N0Q29tcG9uZW50VmlldywgbFZpZXcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIFJlbmRlcmVyMiAob3IgdGhyb3dzIHdoZW4gYXBwbGljYXRpb24gd2FzIGJvb3RzdHJhcHBlZCB3aXRoIFJlbmRlcmVyMykKICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T3JDcmVhdGVSZW5kZXJlcjIodmlldykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZW5kZXJlciA9IHZpZXdbUkVOREVSRVJdOwogICAgICAgIGlmIChpc1Byb2NlZHVyYWxSZW5kZXJlcihyZW5kZXJlcikpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYW5ub3QgaW5qZWN0IFJlbmRlcmVyMiB3aGVuIHRoZSBhcHBsaWNhdGlvbiB1c2VzIFJlbmRlcmVyMyEnKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEluamVjdHMgYSBSZW5kZXJlcjIgZm9yIHRoZSBjdXJyZW50IGNvbXBvbmVudC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdFJlbmRlcmVyMigpIHsKICAgICAgICAvLyBXZSBuZWVkIHRoZSBSZW5kZXJlciB0byBiZSBiYXNlZCBvbiB0aGUgY29tcG9uZW50IHRoYXQgaXQncyBiZWluZyBpbmplY3RlZCBpbnRvLCBob3dldmVyIHNpbmNlCiAgICAgICAgLy8gREkgaGFwcGVucyBiZWZvcmUgd2UndmUgZW50ZXJlZCBpdHMgdmlldywgYGdldExWaWV3YCB3aWxsIHJldHVybiB0aGUgcGFyZW50IHZpZXcgaW5zdGVhZC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBub2RlQXRJbmRleCA9IGdldENvbXBvbmVudExWaWV3QnlJbmRleCh0Tm9kZS5pbmRleCwgbFZpZXcpOwogICAgICAgIHJldHVybiBnZXRPckNyZWF0ZVJlbmRlcmVyMihpc0xWaWV3KG5vZGVBdEluZGV4KSA/IG5vZGVBdEluZGV4IDogbFZpZXcpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0b3JfcmVmLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQmFzZSBjbGFzcyBmb3IgQW5ndWxhciBWaWV3cywgcHJvdmlkZXMgY2hhbmdlIGRldGVjdGlvbiBmdW5jdGlvbmFsaXR5LgogICAgICogQSBjaGFuZ2UtZGV0ZWN0aW9uIHRyZWUgY29sbGVjdHMgYWxsIHZpZXdzIHRoYXQgYXJlIHRvIGJlIGNoZWNrZWQgZm9yIGNoYW5nZXMuCiAgICAgKiBVc2UgdGhlIG1ldGhvZHMgdG8gYWRkIGFuZCByZW1vdmUgdmlld3MgZnJvbSB0aGUgdHJlZSwgaW5pdGlhdGUgY2hhbmdlLWRldGVjdGlvbiwKICAgICAqIGFuZCBleHBsaWNpdGx5IG1hcmsgdmlld3MgYXMgX2RpcnR5XywgbWVhbmluZyB0aGF0IHRoZXkgaGF2ZSBjaGFuZ2VkIGFuZCBuZWVkIHRvIGJlIHJlcmVuZGVyZWQuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlcyBkZW1vbnN0cmF0ZSBob3cgdG8gbW9kaWZ5IGRlZmF1bHQgY2hhbmdlLWRldGVjdGlvbiBiZWhhdmlvcgogICAgICogdG8gcGVyZm9ybSBleHBsaWNpdCBkZXRlY3Rpb24gd2hlbiBuZWVkZWQuCiAgICAgKgogICAgICogIyMjIFVzZSBgbWFya0ZvckNoZWNrKClgIHdpdGggYENoZWNrT25jZWAgc3RyYXRlZ3kKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2V0cyB0aGUgYE9uUHVzaGAgY2hhbmdlLWRldGVjdGlvbiBzdHJhdGVneSBmb3IgYSBjb21wb25lbnQKICAgICAqIChgQ2hlY2tPbmNlYCwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgYENoZWNrQWx3YXlzYCksIHRoZW4gZm9yY2VzIGEgc2Vjb25kIGNoZWNrCiAgICAgKiBhZnRlciBhbiBpbnRlcnZhbC4gU2VlIFtsaXZlIGRlbW9dKGh0dHA6Ly9wbG5rci5jby9lZGl0L0dDNTEyYj9wPXByZXZpZXcpLgogICAgICoKICAgICAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29yZS90cy9jaGFuZ2VfZGV0ZWN0L2NoYW5nZS1kZXRlY3Rpb24udHMiCiAgICAgKiByZWdpb249Im1hcmstZm9yLWNoZWNrIj48L2NvZGUtZXhhbXBsZT4KICAgICAqCiAgICAgKiAjIyMgRGV0YWNoIGNoYW5nZSBkZXRlY3RvciB0byBsaW1pdCBob3cgb2Z0ZW4gY2hlY2sgb2NjdXJzCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGRlZmluZXMgYSBjb21wb25lbnQgd2l0aCBhIGxhcmdlIGxpc3Qgb2YgcmVhZC1vbmx5IGRhdGEKICAgICAqIHRoYXQgaXMgZXhwZWN0ZWQgdG8gY2hhbmdlIGNvbnN0YW50bHksIG1hbnkgdGltZXMgcGVyIHNlY29uZC4KICAgICAqIFRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHdlIHdhbnQgdG8gY2hlY2sgYW5kIHVwZGF0ZSB0aGUgbGlzdAogICAgICogbGVzcyBvZnRlbiB0aGFuIHRoZSBjaGFuZ2VzIGFjdHVhbGx5IG9jY3VyLiBUbyBkbyB0aGF0LCB3ZSBkZXRhY2gKICAgICAqIHRoZSBjb21wb25lbnQncyBjaGFuZ2UgZGV0ZWN0b3IgYW5kIHBlcmZvcm0gYW4gZXhwbGljaXQgbG9jYWwgY2hlY2sgZXZlcnkgZml2ZSBzZWNvbmRzLgogICAgICoKICAgICAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29yZS90cy9jaGFuZ2VfZGV0ZWN0L2NoYW5nZS1kZXRlY3Rpb24udHMiIHJlZ2lvbj0iZGV0YWNoIj48L2NvZGUtZXhhbXBsZT4KICAgICAqCiAgICAgKgogICAgICogIyMjIFJlYXR0YWNoaW5nIGEgZGV0YWNoZWQgY29tcG9uZW50CiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYSBjb21wb25lbnQgZGlzcGxheWluZyBsaXZlIGRhdGEuCiAgICAgKiBUaGUgY29tcG9uZW50IGRldGFjaGVzIGl0cyBjaGFuZ2UgZGV0ZWN0b3IgZnJvbSB0aGUgbWFpbiBjaGFuZ2UgZGV0ZWN0b3IgdHJlZQogICAgICogd2hlbiB0aGUgYGxpdmVgIHByb3BlcnR5IGlzIHNldCB0byBmYWxzZSwgYW5kIHJlYXR0YWNoZXMgaXQgd2hlbiB0aGUgcHJvcGVydHkKICAgICAqIGJlY29tZXMgdHJ1ZS4KICAgICAqCiAgICAgKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvcmUvdHMvY2hhbmdlX2RldGVjdC9jaGFuZ2UtZGV0ZWN0aW9uLnRzIiByZWdpb249InJlYXR0YWNoIj48L2NvZGUtZXhhbXBsZT4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIENoYW5nZURldGVjdG9yUmVmIHsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQG5vY29sbGFwc2UKICAgICAqLwogICAgQ2hhbmdlRGV0ZWN0b3JSZWYuX19OR19FTEVNRU5UX0lEX18gPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZKCkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1dJVENIX0NIQU5HRV9ERVRFQ1RPUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0Q2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfQ0hBTkdFX0RFVEVDVE9SX1JFRl9GQUNUT1JZID0gU1dJVENIX0NIQU5HRV9ERVRFQ1RPUl9SRUZfRkFDVE9SWV9fUE9TVF9SM19fOwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogUmVwcmVzZW50cyBhIHR5cGUgdGhhdCBhIENvbXBvbmVudCBvciBvdGhlciBvYmplY3QgaXMgaW5zdGFuY2VzIG9mLgogICAgICoKICAgICAqIEFuIGV4YW1wbGUgb2YgYSBgVHlwZWAgaXMgYE15Q3VzdG9tQ29tcG9uZW50YCBjbGFzcywgd2hpY2ggaW4gSmF2YVNjcmlwdCBpcyBiZSByZXByZXNlbnRlZCBieQogICAgICogdGhlIGBNeUN1c3RvbUNvbXBvbmVudGAgY29uc3RydWN0b3IgZnVuY3Rpb24uCiAgICAgKgogICAgICogQHB1YmxpY0FwaQogICAgICovCiAgICBjb25zdCBUeXBlID0gRnVuY3Rpb247CiAgICBmdW5jdGlvbiBpc1R5cGUodikgewogICAgICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIEF0dGVudGlvbjogVGhlc2UgcmVnZXggaGFzIHRvIGhvbGQgZXZlbiBpZiB0aGUgY29kZSBpcyBtaW5pZmllZCEKICAgICAqLwogICAgY29uc3QgREVMRUdBVEVfQ1RPUiA9IC9eZnVuY3Rpb25ccytcUytcKFwpXHMqe1tcc1xTXStcLmFwcGx5XCh0aGlzLFxzKmFyZ3VtZW50c1wpLzsKICAgIGNvbnN0IElOSEVSSVRFRF9DTEFTUyA9IC9eY2xhc3NccytbQS1aYS16XGQkX10qXHMqZXh0ZW5kc1xzK1tee10rey87CiAgICBjb25zdCBJTkhFUklURURfQ0xBU1NfV0lUSF9DVE9SID0gL15jbGFzc1xzK1tBLVphLXpcZCRfXSpccypleHRlbmRzXHMrW157XSt7W1xzXFNdKmNvbnN0cnVjdG9yXHMqXCgvOwogICAgY29uc3QgSU5IRVJJVEVEX0NMQVNTX1dJVEhfREVMRUdBVEVfQ1RPUiA9IC9eY2xhc3NccytbQS1aYS16XGQkX10qXHMqZXh0ZW5kc1xzK1tee10re1tcc1xTXSpjb25zdHJ1Y3RvclxzKlwoXClccyp7XHMqc3VwZXJcKFwuXC5cLmFyZ3VtZW50c1wpLzsKICAgIC8qKgogICAgICogRGV0ZXJtaW5lIHdoZXRoZXIgYSBzdHJpbmdpZmllZCB0eXBlIGlzIGEgY2xhc3Mgd2hpY2ggZGVsZWdhdGVzIGl0cyBjb25zdHJ1Y3RvcgogICAgICogdG8gaXRzIHBhcmVudC4KICAgICAqCiAgICAgKiBUaGlzIGlzIG5vdCB0cml2aWFsIHNpbmNlIGNvbXBpbGVkIGNvZGUgY2FuIGFjdHVhbGx5IGNvbnRhaW4gYSBjb25zdHJ1Y3RvciBmdW5jdGlvbgogICAgICogZXZlbiBpZiB0aGUgb3JpZ2luYWwgc291cmNlIGNvZGUgZGlkIG5vdC4gRm9yIGluc3RhbmNlLCB3aGVuIHRoZSBjaGlsZCBjbGFzcyBjb250YWlucwogICAgICogYW4gaW5pdGlhbGl6ZWQgaW5zdGFuY2UgcHJvcGVydHkuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRGVsZWdhdGVDdG9yKHR5cGVTdHIpIHsKICAgICAgICByZXR1cm4gREVMRUdBVEVfQ1RPUi50ZXN0KHR5cGVTdHIpIHx8IElOSEVSSVRFRF9DTEFTU19XSVRIX0RFTEVHQVRFX0NUT1IudGVzdCh0eXBlU3RyKSB8fAogICAgICAgICAgICAoSU5IRVJJVEVEX0NMQVNTLnRlc3QodHlwZVN0cikgJiYgIUlOSEVSSVRFRF9DTEFTU19XSVRIX0NUT1IudGVzdCh0eXBlU3RyKSk7CiAgICB9CiAgICBjbGFzcyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzIHsKICAgICAgICBjb25zdHJ1Y3RvcihyZWZsZWN0KSB7CiAgICAgICAgICAgIHRoaXMuX3JlZmxlY3QgPSByZWZsZWN0IHx8IF9nbG9iYWxbJ1JlZmxlY3QnXTsKICAgICAgICB9CiAgICAgICAgaXNSZWZsZWN0aW9uRW5hYmxlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIGZhY3RvcnkodCkgewogICAgICAgICAgICByZXR1cm4gKC4uLmFyZ3MpID0+IG5ldyB0KC4uLmFyZ3MpOwogICAgICAgIH0KICAgICAgICAvKiogQGludGVybmFsICovCiAgICAgICAgX3ppcFR5cGVzQW5kQW5ub3RhdGlvbnMocGFyYW1UeXBlcywgcGFyYW1Bbm5vdGF0aW9ucykgewogICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICBpZiAodHlwZW9mIHBhcmFtVHlwZXMgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdBcnJheShwYXJhbUFubm90YXRpb25zLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdBcnJheShwYXJhbVR5cGVzLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIFRTIG91dHB1dHMgT2JqZWN0IGZvciBwYXJhbWV0ZXJzIHdpdGhvdXQgdHlwZXMsIHdoaWxlIFRyYWNldXIgb21pdHMKICAgICAgICAgICAgICAgIC8vIHRoZSBhbm5vdGF0aW9ucy4gRm9yIG5vdyB3ZSBwcmVzZXJ2ZSB0aGUgVHJhY2V1ciBiZWhhdmlvciB0byBhaWQKICAgICAgICAgICAgICAgIC8vIG1pZ3JhdGlvbiwgYnV0IHRoaXMgY2FuIGJlIHJldmlzaXRlZC4KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcGFyYW1UeXBlcyA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtVHlwZXNbaV0gJiYgcGFyYW1UeXBlc1tpXSAhPSBPYmplY3QpIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBbcGFyYW1UeXBlc1tpXV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXN1bHRbaV0gPSBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChwYXJhbUFubm90YXRpb25zICYmIHBhcmFtQW5ub3RhdGlvbnNbaV0gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHJlc3VsdFtpXS5jb25jYXQocGFyYW1Bbm5vdGF0aW9uc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgX293blBhcmFtZXRlcnModHlwZSwgcGFyZW50Q3RvcikgewogICAgICAgICAgICBjb25zdCB0eXBlU3RyID0gdHlwZS50b1N0cmluZygpOwogICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIG5vIGRlY29yYXRvcnMsIHdlIG9ubHkgaGF2ZSBmdW5jdGlvbi5sZW5ndGggYXMgbWV0YWRhdGEuCiAgICAgICAgICAgIC8vIEluIHRoYXQgY2FzZSwgdG8gZGV0ZWN0IHdoZXRoZXIgYSBjaGlsZCBjbGFzcyBkZWNsYXJlZCBhbiBvd24gY29uc3RydWN0b3Igb3Igbm90LAogICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGxvb2sgaW5zaWRlIG9mIHRoYXQgY29uc3RydWN0b3IgdG8gY2hlY2sgd2hldGhlciBpdCBpcwogICAgICAgICAgICAvLyBqdXN0IGNhbGxpbmcgdGhlIHBhcmVudC4KICAgICAgICAgICAgLy8gVGhpcyBhbHNvIGhlbHBzIHRvIHdvcmsgYXJvdW5kIGZvciBodHRwczovL2dpdGh1Yi5jb20vTWljcm9zb2Z0L1R5cGVTY3JpcHQvaXNzdWVzLzEyNDM5CiAgICAgICAgICAgIC8vIHRoYXQgc2V0cyAnZGVzaWduOnBhcmFtdHlwZXMnIHRvIFtdCiAgICAgICAgICAgIC8vIGlmIGEgY2xhc3MgaW5oZXJpdHMgZnJvbSBhbm90aGVyIGNsYXNzIGJ1dCBoYXMgbm8gY3RvciBkZWNsYXJlZCBpdHNlbGYuCiAgICAgICAgICAgIGlmIChpc0RlbGVnYXRlQ3Rvcih0eXBlU3RyKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUHJlZmVyIHRoZSBkaXJlY3QgQVBJLgogICAgICAgICAgICBpZiAodHlwZS5wYXJhbWV0ZXJzICYmIHR5cGUucGFyYW1ldGVycyAhPT0gcGFyZW50Q3Rvci5wYXJhbWV0ZXJzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHlwZS5wYXJhbWV0ZXJzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFQSSBvZiB0c2lja2xlIGZvciBsb3dlcmluZyBkZWNvcmF0b3JzIHRvIHByb3BlcnRpZXMgb24gdGhlIGNsYXNzLgogICAgICAgICAgICBjb25zdCB0c2lja2xlQ3RvclBhcmFtcyA9IHR5cGUuY3RvclBhcmFtZXRlcnM7CiAgICAgICAgICAgIGlmICh0c2lja2xlQ3RvclBhcmFtcyAmJiB0c2lja2xlQ3RvclBhcmFtcyAhPT0gcGFyZW50Q3Rvci5jdG9yUGFyYW1ldGVycykgewogICAgICAgICAgICAgICAgLy8gTmV3ZXIgdHNpY2tsZSB1c2VzIGEgZnVuY3Rpb24gY2xvc3VyZQogICAgICAgICAgICAgICAgLy8gUmV0YWluIHRoZSBub24tZnVuY3Rpb24gY2FzZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHRzaWNrbGUKICAgICAgICAgICAgICAgIGNvbnN0IGN0b3JQYXJhbWV0ZXJzID0gdHlwZW9mIHRzaWNrbGVDdG9yUGFyYW1zID09PSAnZnVuY3Rpb24nID8gdHNpY2tsZUN0b3JQYXJhbXMoKSA6IHRzaWNrbGVDdG9yUGFyYW1zOwogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IGN0b3JQYXJhbWV0ZXJzLm1hcCgoY3RvclBhcmFtKSA9PiBjdG9yUGFyYW0gJiYgY3RvclBhcmFtLnR5cGUpOwogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1Bbm5vdGF0aW9ucyA9IGN0b3JQYXJhbWV0ZXJzLm1hcCgoY3RvclBhcmFtKSA9PiBjdG9yUGFyYW0gJiYgY29udmVydFRzaWNrbGVEZWNvcmF0b3JJbnRvTWV0YWRhdGEoY3RvclBhcmFtLmRlY29yYXRvcnMpKTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96aXBUeXBlc0FuZEFubm90YXRpb25zKHBhcmFtVHlwZXMsIHBhcmFtQW5ub3RhdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy4KICAgICAgICAgICAgY29uc3QgcGFyYW1Bbm5vdGF0aW9ucyA9IHR5cGUuaGFzT3duUHJvcGVydHkoUEFSQU1FVEVSUykgJiYgdHlwZVtQQVJBTUVURVJTXTsKICAgICAgICAgICAgY29uc3QgcGFyYW1UeXBlcyA9IHRoaXMuX3JlZmxlY3QgJiYgdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSAmJgogICAgICAgICAgICAgICAgdGhpcy5fcmVmbGVjdC5nZXRPd25NZXRhZGF0YSgnZGVzaWduOnBhcmFtdHlwZXMnLCB0eXBlKTsKICAgICAgICAgICAgaWYgKHBhcmFtVHlwZXMgfHwgcGFyYW1Bbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ppcFR5cGVzQW5kQW5ub3RhdGlvbnMocGFyYW1UeXBlcywgcGFyYW1Bbm5vdGF0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgYSBjbGFzcyBoYXMgbm8gZGVjb3JhdG9ycywgYXQgbGVhc3QgY3JlYXRlIG1ldGFkYXRhCiAgICAgICAgICAgIC8vIGJhc2VkIG9uIGZ1bmN0aW9uLmxlbmd0aC4KICAgICAgICAgICAgLy8gTm90ZTogV2Uga25vdyB0aGF0IHRoaXMgaXMgYSByZWFsIGNvbnN0cnVjdG9yIGFzIHdlIGNoZWNrZWQKICAgICAgICAgICAgLy8gdGhlIGNvbnRlbnQgb2YgdGhlIGNvbnN0cnVjdG9yIGFib3ZlLgogICAgICAgICAgICByZXR1cm4gbmV3QXJyYXkodHlwZS5sZW5ndGgpOwogICAgICAgIH0KICAgICAgICBwYXJhbWV0ZXJzKHR5cGUpIHsKICAgICAgICAgICAgLy8gTm90ZTogb25seSByZXBvcnQgbWV0YWRhdGEgaWYgd2UgaGF2ZSBhdCBsZWFzdCBvbmUgY2xhc3MgZGVjb3JhdG9yCiAgICAgICAgICAgIC8vIHRvIHN0YXkgaW4gc3luYyB3aXRoIHRoZSBzdGF0aWMgcmVmbGVjdG9yLgogICAgICAgICAgICBpZiAoIWlzVHlwZSh0eXBlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHBhcmVudEN0b3IgPSBnZXRQYXJlbnRDdG9yKHR5cGUpOwogICAgICAgICAgICBsZXQgcGFyYW1ldGVycyA9IHRoaXMuX293blBhcmFtZXRlcnModHlwZSwgcGFyZW50Q3Rvcik7CiAgICAgICAgICAgIGlmICghcGFyYW1ldGVycyAmJiBwYXJlbnRDdG9yICE9PSBPYmplY3QpIHsKICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB0aGlzLnBhcmFtZXRlcnMocGFyZW50Q3Rvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhcmFtZXRlcnMgfHwgW107CiAgICAgICAgfQogICAgICAgIF9vd25Bbm5vdGF0aW9ucyh0eXBlT3JGdW5jLCBwYXJlbnRDdG9yKSB7CiAgICAgICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS4KICAgICAgICAgICAgaWYgKHR5cGVPckZ1bmMuYW5ub3RhdGlvbnMgJiYgdHlwZU9yRnVuYy5hbm5vdGF0aW9ucyAhPT0gcGFyZW50Q3Rvci5hbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgbGV0IGFubm90YXRpb25zID0gdHlwZU9yRnVuYy5hbm5vdGF0aW9uczsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYW5ub3RhdGlvbnMgPT09ICdmdW5jdGlvbicgJiYgYW5ub3RhdGlvbnMuYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucyA9IGFubm90YXRpb25zLmFubm90YXRpb25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGFubm90YXRpb25zOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFQSSBvZiB0c2lja2xlIGZvciBsb3dlcmluZyBkZWNvcmF0b3JzIHRvIHByb3BlcnRpZXMgb24gdGhlIGNsYXNzLgogICAgICAgICAgICBpZiAodHlwZU9yRnVuYy5kZWNvcmF0b3JzICYmIHR5cGVPckZ1bmMuZGVjb3JhdG9ycyAhPT0gcGFyZW50Q3Rvci5kZWNvcmF0b3JzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFRzaWNrbGVEZWNvcmF0b3JJbnRvTWV0YWRhdGEodHlwZU9yRnVuYy5kZWNvcmF0b3JzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBUEkgZm9yIG1ldGFkYXRhIGNyZWF0ZWQgYnkgaW52b2tpbmcgdGhlIGRlY29yYXRvcnMuCiAgICAgICAgICAgIGlmICh0eXBlT3JGdW5jLmhhc093blByb3BlcnR5KEFOTk9UQVRJT05TKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHR5cGVPckZ1bmNbQU5OT1RBVElPTlNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBhbm5vdGF0aW9ucyh0eXBlT3JGdW5jKSB7CiAgICAgICAgICAgIGlmICghaXNUeXBlKHR5cGVPckZ1bmMpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcGFyZW50Q3RvciA9IGdldFBhcmVudEN0b3IodHlwZU9yRnVuYyk7CiAgICAgICAgICAgIGNvbnN0IG93bkFubm90YXRpb25zID0gdGhpcy5fb3duQW5ub3RhdGlvbnModHlwZU9yRnVuYywgcGFyZW50Q3RvcikgfHwgW107CiAgICAgICAgICAgIGNvbnN0IHBhcmVudEFubm90YXRpb25zID0gcGFyZW50Q3RvciAhPT0gT2JqZWN0ID8gdGhpcy5hbm5vdGF0aW9ucyhwYXJlbnRDdG9yKSA6IFtdOwogICAgICAgICAgICByZXR1cm4gcGFyZW50QW5ub3RhdGlvbnMuY29uY2F0KG93bkFubm90YXRpb25zKTsKICAgICAgICB9CiAgICAgICAgX293blByb3BNZXRhZGF0YSh0eXBlT3JGdW5jLCBwYXJlbnRDdG9yKSB7CiAgICAgICAgICAgIC8vIFByZWZlciB0aGUgZGlyZWN0IEFQSS4KICAgICAgICAgICAgaWYgKHR5cGVPckZ1bmMucHJvcE1ldGFkYXRhICYmCiAgICAgICAgICAgICAgICB0eXBlT3JGdW5jLnByb3BNZXRhZGF0YSAhPT0gcGFyZW50Q3Rvci5wcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgIGxldCBwcm9wTWV0YWRhdGEgPSB0eXBlT3JGdW5jLnByb3BNZXRhZGF0YTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgcHJvcE1ldGFkYXRhID09PSAnZnVuY3Rpb24nICYmIHByb3BNZXRhZGF0YS5wcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICAgICBwcm9wTWV0YWRhdGEgPSBwcm9wTWV0YWRhdGEucHJvcE1ldGFkYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHByb3BNZXRhZGF0YTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBUEkgb2YgdHNpY2tsZSBmb3IgbG93ZXJpbmcgZGVjb3JhdG9ycyB0byBwcm9wZXJ0aWVzIG9uIHRoZSBjbGFzcy4KICAgICAgICAgICAgaWYgKHR5cGVPckZ1bmMucHJvcERlY29yYXRvcnMgJiYKICAgICAgICAgICAgICAgIHR5cGVPckZ1bmMucHJvcERlY29yYXRvcnMgIT09IHBhcmVudEN0b3IucHJvcERlY29yYXRvcnMpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHByb3BEZWNvcmF0b3JzID0gdHlwZU9yRnVuYy5wcm9wRGVjb3JhdG9yczsKICAgICAgICAgICAgICAgIGNvbnN0IHByb3BNZXRhZGF0YSA9IHt9OwogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMocHJvcERlY29yYXRvcnMpLmZvckVhY2gocHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcE1ldGFkYXRhW3Byb3BdID0gY29udmVydFRzaWNrbGVEZWNvcmF0b3JJbnRvTWV0YWRhdGEocHJvcERlY29yYXRvcnNbcHJvcF0pOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFQSSBmb3IgbWV0YWRhdGEgY3JlYXRlZCBieSBpbnZva2luZyB0aGUgZGVjb3JhdG9ycy4KICAgICAgICAgICAgaWYgKHR5cGVPckZ1bmMuaGFzT3duUHJvcGVydHkoUFJPUF9NRVRBREFUQSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlT3JGdW5jW1BST1BfTUVUQURBVEFdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBwcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgewogICAgICAgICAgICBpZiAoIWlzVHlwZSh0eXBlT3JGdW5jKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHBhcmVudEN0b3IgPSBnZXRQYXJlbnRDdG9yKHR5cGVPckZ1bmMpOwogICAgICAgICAgICBjb25zdCBwcm9wTWV0YWRhdGEgPSB7fTsKICAgICAgICAgICAgaWYgKHBhcmVudEN0b3IgIT09IE9iamVjdCkgewogICAgICAgICAgICAgICAgY29uc3QgcGFyZW50UHJvcE1ldGFkYXRhID0gdGhpcy5wcm9wTWV0YWRhdGEocGFyZW50Q3Rvcik7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJlbnRQcm9wTWV0YWRhdGEpLmZvckVhY2goKHByb3BOYW1lKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcHJvcE1ldGFkYXRhW3Byb3BOYW1lXSA9IHBhcmVudFByb3BNZXRhZGF0YVtwcm9wTmFtZV07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBvd25Qcm9wTWV0YWRhdGEgPSB0aGlzLl9vd25Qcm9wTWV0YWRhdGEodHlwZU9yRnVuYywgcGFyZW50Q3Rvcik7CiAgICAgICAgICAgIGlmIChvd25Qcm9wTWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG93blByb3BNZXRhZGF0YSkuZm9yRWFjaCgocHJvcE5hbWUpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNvcmF0b3JzID0gW107CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BNZXRhZGF0YS5oYXNPd25Qcm9wZXJ0eShwcm9wTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVjb3JhdG9ycy5wdXNoKC4uLnByb3BNZXRhZGF0YVtwcm9wTmFtZV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkZWNvcmF0b3JzLnB1c2goLi4ub3duUHJvcE1ldGFkYXRhW3Byb3BOYW1lXSk7CiAgICAgICAgICAgICAgICAgICAgcHJvcE1ldGFkYXRhW3Byb3BOYW1lXSA9IGRlY29yYXRvcnM7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcHJvcE1ldGFkYXRhOwogICAgICAgIH0KICAgICAgICBvd25Qcm9wTWV0YWRhdGEodHlwZU9yRnVuYykgewogICAgICAgICAgICBpZiAoIWlzVHlwZSh0eXBlT3JGdW5jKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vd25Qcm9wTWV0YWRhdGEodHlwZU9yRnVuYywgZ2V0UGFyZW50Q3Rvcih0eXBlT3JGdW5jKSkgfHwge307CiAgICAgICAgfQogICAgICAgIGhhc0xpZmVjeWNsZUhvb2sodHlwZSwgbGNQcm9wZXJ0eSkgewogICAgICAgICAgICByZXR1cm4gdHlwZSBpbnN0YW5jZW9mIFR5cGUgJiYgbGNQcm9wZXJ0eSBpbiB0eXBlLnByb3RvdHlwZTsKICAgICAgICB9CiAgICAgICAgZ3VhcmRzKHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KICAgICAgICBnZXR0ZXIobmFtZSkgewogICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdvJywgJ3JldHVybiBvLicgKyBuYW1lICsgJzsnKTsKICAgICAgICB9CiAgICAgICAgc2V0dGVyKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbignbycsICd2JywgJ3JldHVybiBvLicgKyBuYW1lICsgJyA9IHY7Jyk7CiAgICAgICAgfQogICAgICAgIG1ldGhvZChuYW1lKSB7CiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uQm9keSA9IGBpZiAoIW8uJHtuYW1lfSkgdGhyb3cgbmV3IEVycm9yKCciJHtuYW1lfSIgaXMgdW5kZWZpbmVkJyk7CiAgICAgICAgcmV0dXJuIG8uJHtuYW1lfS5hcHBseShvLCBhcmdzKTtgOwogICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKCdvJywgJ2FyZ3MnLCBmdW5jdGlvbkJvZHkpOwogICAgICAgIH0KICAgICAgICAvLyBUaGVyZSBpcyBub3QgYSBjb25jZXB0IG9mIGltcG9ydCB1cmkgaW4gSnMsIGJ1dCB0aGlzIGlzIHVzZWZ1bCBpbiBkZXZlbG9waW5nIERhcnQgYXBwbGljYXRpb25zLgogICAgICAgIGltcG9ydFVyaSh0eXBlKSB7CiAgICAgICAgICAgIC8vIFN0YXRpY1N5bWJvbAogICAgICAgICAgICBpZiAodHlwZW9mIHR5cGUgPT09ICdvYmplY3QnICYmIHR5cGVbJ2ZpbGVQYXRoJ10pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlWydmaWxlUGF0aCddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJ1bnRpbWUgdHlwZQogICAgICAgICAgICByZXR1cm4gYC4vJHtzdHJpbmdpZnkodHlwZSl9YDsKICAgICAgICB9CiAgICAgICAgcmVzb3VyY2VVcmkodHlwZSkgewogICAgICAgICAgICByZXR1cm4gYC4vJHtzdHJpbmdpZnkodHlwZSl9YDsKICAgICAgICB9CiAgICAgICAgcmVzb2x2ZUlkZW50aWZpZXIobmFtZSwgbW9kdWxlVXJsLCBtZW1iZXJzLCBydW50aW1lKSB7CiAgICAgICAgICAgIHJldHVybiBydW50aW1lOwogICAgICAgIH0KICAgICAgICByZXNvbHZlRW51bShlbnVtSWRlbnRpZmllciwgbmFtZSkgewogICAgICAgICAgICByZXR1cm4gZW51bUlkZW50aWZpZXJbbmFtZV07CiAgICAgICAgfQogICAgfQogICAgZnVuY3Rpb24gY29udmVydFRzaWNrbGVEZWNvcmF0b3JJbnRvTWV0YWRhdGEoZGVjb3JhdG9ySW52b2NhdGlvbnMpIHsKICAgICAgICBpZiAoIWRlY29yYXRvckludm9jYXRpb25zKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRlY29yYXRvckludm9jYXRpb25zLm1hcChkZWNvcmF0b3JJbnZvY2F0aW9uID0+IHsKICAgICAgICAgICAgY29uc3QgZGVjb3JhdG9yVHlwZSA9IGRlY29yYXRvckludm9jYXRpb24udHlwZTsKICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkNscyA9IGRlY29yYXRvclR5cGUuYW5ub3RhdGlvbkNsczsKICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbkFyZ3MgPSBkZWNvcmF0b3JJbnZvY2F0aW9uLmFyZ3MgPyBkZWNvcmF0b3JJbnZvY2F0aW9uLmFyZ3MgOiBbXTsKICAgICAgICAgICAgcmV0dXJuIG5ldyBhbm5vdGF0aW9uQ2xzKC4uLmFubm90YXRpb25BcmdzKTsKICAgICAgICB9KTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFBhcmVudEN0b3IoY3RvcikgewogICAgICAgIGNvbnN0IHBhcmVudFByb3RvID0gY3Rvci5wcm90b3R5cGUgPyBPYmplY3QuZ2V0UHJvdG90eXBlT2YoY3Rvci5wcm90b3R5cGUpIDogbnVsbDsKICAgICAgICBjb25zdCBwYXJlbnRDdG9yID0gcGFyZW50UHJvdG8gPyBwYXJlbnRQcm90by5jb25zdHJ1Y3RvciA6IG51bGw7CiAgICAgICAgLy8gTm90ZTogV2UgYWx3YXlzIHVzZSBgT2JqZWN0YCBhcyB0aGUgbnVsbCB2YWx1ZQogICAgICAgIC8vIHRvIHNpbXBsaWZ5IGNoZWNraW5nIGxhdGVyIG9uLgogICAgICAgIHJldHVybiBwYXJlbnRDdG9yIHx8IE9iamVjdDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL2ppdC91dGlsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBfcmVmbGVjdCA9IG51bGw7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJlZmxlY3QoKSB7CiAgICAgICAgcmV0dXJuIChfcmVmbGVjdCA9IF9yZWZsZWN0IHx8IG5ldyBSZWZsZWN0aW9uQ2FwYWJpbGl0aWVzKCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSkgewogICAgICAgIHJldHVybiBjb252ZXJ0RGVwZW5kZW5jaWVzKGdldFJlZmxlY3QoKS5wYXJhbWV0ZXJzKHR5cGUpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZXBzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb252ZXJ0RGVwZW5kZW5jaWVzKGRlcHMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpOwogICAgICAgIHJldHVybiBkZXBzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlcCA9PiByZWZsZWN0RGVwZW5kZW5jeShjb21waWxlciwgZGVwKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBpbGVyCiAgICAgKiBAcGFyYW0gez99IGRlcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVmbGVjdERlcGVuZGVuY3koY29tcGlsZXIsIGRlcCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRhID0gewogICAgICAgICAgICB0b2tlbjogbnVsbCwKICAgICAgICAgICAgaG9zdDogZmFsc2UsCiAgICAgICAgICAgIG9wdGlvbmFsOiBmYWxzZSwKICAgICAgICAgICAgcmVzb2x2ZWQ6IGNvbXBpbGVyLlIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5Ub2tlbiwKICAgICAgICAgICAgc2VsZjogZmFsc2UsCiAgICAgICAgICAgIHNraXBTZWxmOiBmYWxzZSwKICAgICAgICB9OwogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHNldFRva2VuQW5kUmVzb2x2ZWRUeXBlKHRva2VuKSB7CiAgICAgICAgICAgIG1ldGEucmVzb2x2ZWQgPSBjb21waWxlci5SM1Jlc29sdmVkRGVwZW5kZW5jeVR5cGUuVG9rZW47CiAgICAgICAgICAgIG1ldGEudG9rZW4gPSB0b2tlbjsKICAgICAgICB9CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVwKSAmJiBkZXAubGVuZ3RoID4gMCkgewogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IGRlcC5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGFyYW0gPSBkZXBbal07CiAgICAgICAgICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtIG1heSBiZSB1bmRlZmluZWQgaWYgdHlwZSBvZiBkZXAgaXMgbm90IHNldCBieSBuZ3RzYwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YocGFyYW0pOwogICAgICAgICAgICAgICAgaWYgKHBhcmFtIGluc3RhbmNlb2YgT3B0aW9uYWwgfHwgcHJvdG8ubmdNZXRhZGF0YU5hbWUgPT09ICdPcHRpb25hbCcpIHsKICAgICAgICAgICAgICAgICAgICBtZXRhLm9wdGlvbmFsID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgU2tpcFNlbGYgfHwgcHJvdG8ubmdNZXRhZGF0YU5hbWUgPT09ICdTa2lwU2VsZicpIHsKICAgICAgICAgICAgICAgICAgICBtZXRhLnNraXBTZWxmID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgU2VsZiB8fCBwcm90by5uZ01ldGFkYXRhTmFtZSA9PT0gJ1NlbGYnKSB7CiAgICAgICAgICAgICAgICAgICAgbWV0YS5zZWxmID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgSG9zdCB8fCBwcm90by5uZ01ldGFkYXRhTmFtZSA9PT0gJ0hvc3QnKSB7CiAgICAgICAgICAgICAgICAgICAgbWV0YS5ob3N0ID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtIGluc3RhbmNlb2YgSW5qZWN0KSB7CiAgICAgICAgICAgICAgICAgICAgbWV0YS50b2tlbiA9IHBhcmFtLnRva2VuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAocGFyYW0gaW5zdGFuY2VvZiBBdHRyaWJ1dGUpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0uYXR0cmlidXRlTmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQXR0cmlidXRlIG5hbWUgbXVzdCBiZSBkZWZpbmVkLmApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtZXRhLnRva2VuID0gcGFyYW0uYXR0cmlidXRlTmFtZTsKICAgICAgICAgICAgICAgICAgICBtZXRhLnJlc29sdmVkID0gY29tcGlsZXIuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLkF0dHJpYnV0ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtID09PSBDaGFuZ2VEZXRlY3RvclJlZikgewogICAgICAgICAgICAgICAgICAgIG1ldGEudG9rZW4gPSBwYXJhbTsKICAgICAgICAgICAgICAgICAgICBtZXRhLnJlc29sdmVkID0gY29tcGlsZXIuUjNSZXNvbHZlZERlcGVuZGVuY3lUeXBlLkNoYW5nZURldGVjdG9yUmVmOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgc2V0VG9rZW5BbmRSZXNvbHZlZFR5cGUocGFyYW0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGRlcCA9PT0gdW5kZWZpbmVkIHx8IChBcnJheS5pc0FycmF5KGRlcCkgJiYgZGVwLmxlbmd0aCA9PT0gMCkpIHsKICAgICAgICAgICAgbWV0YS50b2tlbiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgbWV0YS5yZXNvbHZlZCA9IFIzUmVzb2x2ZWREZXBlbmRlbmN5VHlwZS5JbnZhbGlkOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgc2V0VG9rZW5BbmRSZXNvbHZlZFR5cGUoZGVwKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1ldGE7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9qaXQvaW5qZWN0YWJsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIENvbXBpbGUgYW4gQW5ndWxhciBpbmplY3RhYmxlIGFjY29yZGluZyB0byBpdHMgYEluamVjdGFibGVgIG1ldGFkYXRhLCBhbmQgcGF0Y2ggdGhlIHJlc3VsdGluZwogICAgICogaW5qZWN0YWJsZSBkZWYgKGDJtXByb3ZgKSBvbnRvIHRoZSBpbmplY3RhYmxlIHR5cGUuCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7Pz19IHNyY01ldGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXBpbGVJbmplY3RhYmxlKHR5cGUsIHNyY01ldGEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5nSW5qZWN0YWJsZURlZiA9IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZ0ZhY3RvcnlEZWYgPSBudWxsOwogICAgICAgIC8vIGlmIE5HX1BST1ZfREVGIGlzIGFscmVhZHkgZGVmaW5lZCBvbiB0aGlzIGNsYXNzIHRoZW4gZG9uJ3Qgb3ZlcndyaXRlIGl0CiAgICAgICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX1BST1ZfREVGKSkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfUFJPVl9ERUYsIHsKICAgICAgICAgICAgICAgIGdldDogKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChuZ0luamVjdGFibGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmdJbmplY3RhYmxlRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlSW5qZWN0YWJsZShhbmd1bGFyQ29yZURpRW52LCBgbmc6Ly8vJHt0eXBlLm5hbWV9L8m1cHJvdi5qc2AsIGdldEluamVjdGFibGVNZXRhZGF0YSh0eXBlLCBzcmNNZXRhKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZ0luamVjdGFibGVEZWY7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8vIE9uIElFMTAgcHJvcGVydGllcyBkZWZpbmVkIHZpYSBgZGVmaW5lUHJvcGVydHlgIHdvbid0IGJlIGluaGVyaXRlZCBieSBjaGlsZCBjbGFzc2VzLAogICAgICAgICAgICAvLyB3aGljaCB3aWxsIGJyZWFrIGluaGVyaXRpbmcgdGhlIGluamVjdGFibGUgZGVmaW5pdGlvbiBmcm9tIGEgZ3JhbmRwYXJlbnQgdGhyb3VnaCBhbgogICAgICAgICAgICAvLyB1bmRlY29yYXRlZCBwYXJlbnQgY2xhc3MuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IGRlZmluaW5nIGEgbWV0aG9kIHdoaWNoIHNob3VsZCBiZSB1c2VkCiAgICAgICAgICAgIC8vIGFzIGEgZmFsbGJhY2suIFRoaXMgc2hvdWxkIG9ubHkgYmUgYSBwcm9ibGVtIGluIEpJVCBtb2RlLCBiZWNhdXNlIGluIEFPVCBUeXBlU2NyaXB0CiAgICAgICAgICAgIC8vIHNlZW1zIHRvIGhhdmUgYSB3b3JrYXJvdW5kIGZvciBzdGF0aWMgcHJvcGVydGllcy4gV2hlbiBpbmhlcml0aW5nIGZyb20gYW4gdW5kZWNvcmF0ZWQKICAgICAgICAgICAgLy8gcGFyZW50IGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gdjEwLCB0aGlzIGNhbiBzYWZlbHkgYmUgcmVtb3ZlZC4KICAgICAgICAgICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX1BST1ZfREVGX0ZBTExCQUNLKSkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0eXBlKSkpW05HX1BST1ZfREVGX0ZBTExCQUNLXSA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+ICgoLyoqIEB0eXBlIHs/fSAqLyAodHlwZSkpKVtOR19QUk9WX0RFRl0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIGlmIE5HX0ZBQ1RPUllfREVGIGlzIGFscmVhZHkgZGVmaW5lZCBvbiB0aGlzIGNsYXNzIHRoZW4gZG9uJ3Qgb3ZlcndyaXRlIGl0CiAgICAgICAgaWYgKCF0eXBlLmhhc093blByb3BlcnR5KE5HX0ZBQ1RPUllfREVGKSkgewogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRkFDVE9SWV9ERUYsIHsKICAgICAgICAgICAgICAgIGdldDogKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChuZ0ZhY3RvcnlEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YSA9IGdldEluamVjdGFibGVNZXRhZGF0YSh0eXBlLCBzcmNNZXRhKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5nRmFjdG9yeURlZiA9IGNvbXBpbGVyLmNvbXBpbGVGYWN0b3J5KGFuZ3VsYXJDb3JlRGlFbnYsIGBuZzovLy8ke3R5cGUubmFtZX0vybVmYWMuanNgLCB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtZXRhZGF0YS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbWV0YWRhdGEudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVBcmd1bWVudENvdW50OiBtZXRhZGF0YS50eXBlQXJndW1lbnRDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmplY3RGbjogJ2luamVjdCcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGNvbXBpbGVyLlIzRmFjdG9yeVRhcmdldC5JbmplY3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmdGYWN0b3J5RGVmOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAvLyBMZWF2ZSB0aGlzIGNvbmZpZ3VyYWJsZSBzbyB0aGF0IHRoZSBmYWN0b3JpZXMgZnJvbSBkaXJlY3RpdmVzIG9yIHBpcGVzIGNhbiB0YWtlIHByZWNlZGVuY2UuCiAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgY29uc3QgybUwJDYgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVVNFX1ZBTFVFJDEgPSBnZXRDbG9zdXJlU2FmZVByb3BlcnR5KHsgcHJvdmlkZTogU3RyaW5nLCB1c2VWYWx1ZTogybUwJDYgfSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNVc2VDbGFzc1Byb3ZpZGVyKG1ldGEpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChtZXRhKSkpLnVzZUNsYXNzICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNVc2VWYWx1ZVByb3ZpZGVyKG1ldGEpIHsKICAgICAgICByZXR1cm4gVVNFX1ZBTFVFJDEgaW4gbWV0YTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1VzZUZhY3RvcnlQcm92aWRlcihtZXRhKSB7CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobWV0YSkpKS51c2VGYWN0b3J5ICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNVc2VFeGlzdGluZ1Byb3ZpZGVyKG1ldGEpIHsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChtZXRhKSkpLnVzZUV4aXN0aW5nICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/PX0gc3JjTWV0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SW5qZWN0YWJsZU1ldGFkYXRhKHR5cGUsIHNyY01ldGEpIHsKICAgICAgICAvLyBBbGxvdyB0aGUgY29tcGlsYXRpb24gb2YgYSBjbGFzcyB3aXRoIGEgYEBJbmplY3RhYmxlKClgIGRlY29yYXRvciB3aXRob3V0IHBhcmFtZXRlcnMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0YSA9IHNyY01ldGEgfHwgeyBwcm92aWRlZEluOiBudWxsIH07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBpbGVyTWV0YSA9IHsKICAgICAgICAgICAgbmFtZTogdHlwZS5uYW1lLAogICAgICAgICAgICB0eXBlOiB0eXBlLAogICAgICAgICAgICB0eXBlQXJndW1lbnRDb3VudDogMCwKICAgICAgICAgICAgcHJvdmlkZWRJbjogbWV0YS5wcm92aWRlZEluLAogICAgICAgICAgICB1c2VyRGVwczogdW5kZWZpbmVkLAogICAgICAgIH07CiAgICAgICAgaWYgKChpc1VzZUNsYXNzUHJvdmlkZXIobWV0YSkgfHwgaXNVc2VGYWN0b3J5UHJvdmlkZXIobWV0YSkpICYmIG1ldGEuZGVwcyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNvbXBpbGVyTWV0YS51c2VyRGVwcyA9IGNvbnZlcnREZXBlbmRlbmNpZXMobWV0YS5kZXBzKTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzVXNlQ2xhc3NQcm92aWRlcihtZXRhKSkgewogICAgICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VDbGFzcywgYW5kIG1heSBvciBtYXkgbm90IGhhdmUgcHJvdmlkZWQgZGVwcy4KICAgICAgICAgICAgY29tcGlsZXJNZXRhLnVzZUNsYXNzID0gcmVzb2x2ZUZvcndhcmRSZWYobWV0YS51c2VDbGFzcyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzVXNlVmFsdWVQcm92aWRlcihtZXRhKSkgewogICAgICAgICAgICAvLyBUaGUgdXNlciBleHBsaWNpdGx5IHNwZWNpZmllZCB1c2VWYWx1ZS4KICAgICAgICAgICAgY29tcGlsZXJNZXRhLnVzZVZhbHVlID0gcmVzb2x2ZUZvcndhcmRSZWYobWV0YS51c2VWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGlzVXNlRmFjdG9yeVByb3ZpZGVyKG1ldGEpKSB7CiAgICAgICAgICAgIC8vIFRoZSB1c2VyIGV4cGxpY2l0bHkgc3BlY2lmaWVkIHVzZUZhY3RvcnkuCiAgICAgICAgICAgIGNvbXBpbGVyTWV0YS51c2VGYWN0b3J5ID0gbWV0YS51c2VGYWN0b3J5OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChpc1VzZUV4aXN0aW5nUHJvdmlkZXIobWV0YSkpIHsKICAgICAgICAgICAgLy8gVGhlIHVzZXIgZXhwbGljaXRseSBzcGVjaWZpZWQgdXNlRXhpc3RpbmcuCiAgICAgICAgICAgIGNvbXBpbGVyTWV0YS51c2VFeGlzdGluZyA9IHJlc29sdmVGb3J3YXJkUmVmKG1ldGEudXNlRXhpc3RpbmcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcGlsZXJNZXRhOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvdXRpbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCDJtTAkNyA9IGdldENsb3N1cmVTYWZlUHJvcGVydHk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBVU0VfVkFMVUUkMiA9IGdldENsb3N1cmVTYWZlUHJvcGVydHkoeyBwcm92aWRlOiBTdHJpbmcsIHVzZVZhbHVlOiDJtTAkNyB9KTsKICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIGNvbnN0IMm1MCQ4ID0gLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHR5cGUsIG1ldGEpID0+IFNXSVRDSF9DT01QSUxFX0lOSkVDVEFCTEUoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSwgbWV0YSk7CiAgICAvKioKICAgICAqIEluamVjdGFibGUgZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICAgICAqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSW5qZWN0YWJsZSA9IG1ha2VEZWNvcmF0b3IoJ0luamVjdGFibGUnLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoybUwJDgpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNXSVRDSF9DT01QSUxFX0lOSkVDVEFCTEVfX1BPU1RfUjNfXyA9IGNvbXBpbGVJbmplY3RhYmxlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1dJVENIX0NPTVBJTEVfSU5KRUNUQUJMRSA9IFNXSVRDSF9DT01QSUxFX0lOSkVDVEFCTEVfX1BPU1RfUjNfXzsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3Njb3BlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQW4gaW50ZXJuYWwgdG9rZW4gd2hvc2UgcHJlc2VuY2UgaW4gYW4gaW5qZWN0b3IgaW5kaWNhdGVzIHRoYXQgdGhlIGluamVjdG9yIHNob3VsZCB0cmVhdCBpdHNlbGYKICAgICAqIGFzIGEgcm9vdCBzY29wZWQgaW5qZWN0b3Igd2hlbiBwcm9jZXNzaW5nIHJlcXVlc3RzIGZvciB1bmtub3duIHRva2VucyB3aGljaCBtYXkgaW5kaWNhdGUKICAgICAqIHRoZXkgYXJlIHByb3ZpZGVkIGluIHRoZSByb290IHNjb3BlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IElOSkVDVE9SX1NDT1BFID0gbmV3IEluamVjdGlvblRva2VuKCdTZXQgSW5qZWN0b3Igc2NvcGUuJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9kaS9yM19pbmplY3Rvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIE1hcmtlciB3aGljaCBpbmRpY2F0ZXMgdGhhdCBhIHZhbHVlIGhhcyBub3QgeWV0IGJlZW4gY3JlYXRlZCBmcm9tIHRoZSBmYWN0b3J5IGZ1bmN0aW9uLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE5PVF9ZRVQgPSB7fTsKICAgIC8qKgogICAgICogTWFya2VyIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciBhIHRva2VuIGlzIGluIHRoZSBwcm9jZXNzIG9mIGJlaW5nIGNhbGxlZC4KICAgICAqCiAgICAgKiBJZiB0aGUgaW5qZWN0b3IgaXMgYXNrZWQgdG8gaW5qZWN0IGEgdG9rZW4gd2l0aCBpdHMgdmFsdWUgc2V0IHRvIENJUkNVTEFSLCB0aGF0IGluZGljYXRlcwogICAgICogaW5qZWN0aW9uIG9mIGEgZGVwZW5kZW5jeSBoYXMgcmVjdXJzaXZlbHkgYXR0ZW1wdGVkIHRvIGluamVjdCB0aGUgb3JpZ2luYWwgdG9rZW4sIGFuZCB0aGVyZSBpcwogICAgICogYSBjaXJjdWxhciBkZXBlbmRlbmN5IGFtb25nIHRoZSBwcm92aWRlcnMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQ0lSQ1VMQVIgPSB7fTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEVNUFRZX0FSUkFZJDIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKTsKICAgIC8qKgogICAgICogQSBsYXppbHkgaW5pdGlhbGl6ZWQgTnVsbEluamVjdG9yLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBOVUxMX0lOSkVDVE9SID0gdW5kZWZpbmVkOwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXROdWxsSW5qZWN0b3IoKSB7CiAgICAgICAgaWYgKE5VTExfSU5KRUNUT1IgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICBOVUxMX0lOSkVDVE9SID0gbmV3IE51bGxJbmplY3RvcigpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTlVMTF9JTkpFQ1RPUjsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IGBJbmplY3RvcmAgd2hpY2ggaXMgY29uZmlndXJlZCB1c2luZyBhIGBkZWZUeXBlYCBvZiBgSW5qZWN0b3JUeXBlPGFueT5gcy4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBkZWZUeXBlCiAgICAgKiBAcGFyYW0gez89fSBwYXJlbnQKICAgICAqIEBwYXJhbSB7Pz19IGFkZGl0aW9uYWxQcm92aWRlcnMKICAgICAqIEBwYXJhbSB7Pz19IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUluamVjdG9yKGRlZlR5cGUsIHBhcmVudCA9IG51bGwsIGFkZGl0aW9uYWxQcm92aWRlcnMgPSBudWxsLCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluamVjdG9yID0gY3JlYXRlSW5qZWN0b3JXaXRob3V0SW5qZWN0b3JJbnN0YW5jZXMoZGVmVHlwZSwgcGFyZW50LCBhZGRpdGlvbmFsUHJvdmlkZXJzLCBuYW1lKTsKICAgICAgICBpbmplY3Rvci5fcmVzb2x2ZUluamVjdG9yRGVmVHlwZXMoKTsKICAgICAgICByZXR1cm4gaW5qZWN0b3I7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBuZXcgaW5qZWN0b3Igd2l0aG91dCBlYWdlcmx5IHJlc29sdmluZyBpdHMgaW5qZWN0b3IgdHlwZXMuIENhbiBiZSB1c2VkIGluIHBsYWNlcwogICAgICogd2hlcmUgcmVzb2x2aW5nIHRoZSBpbmplY3RvciB0eXBlcyBpbW1lZGlhdGVseSBjYW4gbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLiBUaGUgaW5qZWN0b3IgdHlwZXMKICAgICAqIHNob3VsZCBiZSByZXNvbHZlZCBhdCBhIGxhdGVyIHBvaW50IGJ5IGNhbGxpbmcgYF9yZXNvbHZlSW5qZWN0b3JEZWZUeXBlc2AuCiAgICAgKiBAcGFyYW0gez99IGRlZlR5cGUKICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICogQHBhcmFtIHs/PX0gYWRkaXRpb25hbFByb3ZpZGVycwogICAgICogQHBhcmFtIHs/PX0gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlSW5qZWN0b3JXaXRob3V0SW5qZWN0b3JJbnN0YW5jZXMoZGVmVHlwZSwgcGFyZW50ID0gbnVsbCwgYWRkaXRpb25hbFByb3ZpZGVycyA9IG51bGwsIG5hbWUpIHsKICAgICAgICByZXR1cm4gbmV3IFIzSW5qZWN0b3IoZGVmVHlwZSwgYWRkaXRpb25hbFByb3ZpZGVycywgcGFyZW50IHx8IGdldE51bGxJbmplY3RvcigpLCBuYW1lKTsKICAgIH0KICAgIGNsYXNzIFIzSW5qZWN0b3IgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbmFsUHJvdmlkZXJzCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBzb3VyY2UKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihkZWYsIGFkZGl0aW9uYWxQcm92aWRlcnMsIHBhcmVudCwgc291cmNlID0gbnVsbCkgewogICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1hcCBvZiB0b2tlbnMgdG8gcmVjb3JkcyB3aGljaCBjb250YWluIHRoZSBpbnN0YW5jZXMgb2YgdGhvc2UgdG9rZW5zLgogICAgICAgICAgICAgKiAtIGBudWxsYCB2YWx1ZSBpbXBsaWVzIHRoYXQgd2UgZG9uJ3QgaGF2ZSB0aGUgcmVjb3JkLiBVc2VkIGJ5IHRyZWUtc2hha2FibGUgaW5qZWN0b3JzCiAgICAgICAgICAgICAqIHRvIHByZXZlbnQgZnVydGhlciBzZWFyY2hlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucmVjb3JkcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSB0cmFuc2l0aXZlIHNldCBvZiBgSW5qZWN0b3JUeXBlYHMgd2hpY2ggZGVmaW5lIHRoaXMgaW5qZWN0b3IuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmluamVjdG9yRGVmVHlwZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgb2YgdmFsdWVzIGluc3RhbnRpYXRlZCBieSB0aGlzIGluamVjdG9yIHdoaWNoIGNvbnRhaW4gYG5nT25EZXN0cm95YCBsaWZlY3ljbGUgaG9va3MuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9uRGVzdHJveSA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVkdXBTdGFjayA9IFtdOwogICAgICAgICAgICAvLyBTdGFydCBvZmYgYnkgY3JlYXRpbmcgUmVjb3JkcyBmb3IgZXZlcnkgcHJvdmlkZXIgZGVjbGFyZWQgaW4gZXZlcnkgSW5qZWN0b3JUeXBlCiAgICAgICAgICAgIC8vIGluY2x1ZGVkIHRyYW5zaXRpdmVseSBpbiBhZGRpdGlvbmFsIHByb3ZpZGVycyB0aGVuIGRvIHRoZSBzYW1lIGZvciBgZGVmYC4gVGhpcyBvcmRlciBpcwogICAgICAgICAgICAvLyBpbXBvcnRhbnQgYmVjYXVzZSBgZGVmYCBtYXkgaW5jbHVkZSBwcm92aWRlcnMgdGhhdCBvdmVycmlkZSBvbmVzIGluIGFkZGl0aW9uYWxQcm92aWRlcnMuCiAgICAgICAgICAgIGFkZGl0aW9uYWxQcm92aWRlcnMgJiYKICAgICAgICAgICAgICAgIGRlZXBGb3JFYWNoKGFkZGl0aW9uYWxQcm92aWRlcnMsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3ZpZGVyID0+IHRoaXMucHJvY2Vzc1Byb3ZpZGVyKHByb3ZpZGVyLCBkZWYsIGFkZGl0aW9uYWxQcm92aWRlcnMpKSk7CiAgICAgICAgICAgIGRlZXBGb3JFYWNoKFtkZWZdLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3JEZWYKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGluamVjdG9yRGVmID0+IHRoaXMucHJvY2Vzc0luamVjdG9yVHlwZShpbmplY3RvckRlZiwgW10sIGRlZHVwU3RhY2spKSk7CiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgSU5KRUNUT1IgdG9rZW4gcHJvdmlkZXMgdGhpcyBpbmplY3Rvci4KICAgICAgICAgICAgdGhpcy5yZWNvcmRzLnNldChJTkpFQ1RPUiwgbWFrZVJlY29yZCh1bmRlZmluZWQsIHRoaXMpKTsKICAgICAgICAgICAgLy8gRGV0ZWN0IHdoZXRoZXIgdGhpcyBpbmplY3RvciBoYXMgdGhlIEFQUF9ST09UX1NDT1BFIHRva2VuIGFuZCB0aHVzIHNob3VsZCBwcm92aWRlCiAgICAgICAgICAgIC8vIGFueSBpbmplY3RhYmxlIHNjb3BlZCB0byBBUFBfUk9PVF9TQ09QRS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KElOSkVDVE9SX1NDT1BFKTsKICAgICAgICAgICAgdGhpcy5zY29wZSA9IHJlY29yZCAhPSBudWxsID8gcmVjb3JkLnZhbHVlIDogbnVsbDsKICAgICAgICAgICAgLy8gU291cmNlIG5hbWUsIHVzZWQgZm9yIGRlYnVnZ2luZwogICAgICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZSB8fCAodHlwZW9mIGRlZiA9PT0gJ29iamVjdCcgPyBudWxsIDogc3RyaW5naWZ5KGRlZikpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGbGFnIGluZGljYXRpbmcgdGhhdCB0aGlzIGluamVjdG9yIHdhcyBwcmV2aW91c2x5IGRlc3Ryb3llZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkZXN0cm95ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZXN0cm95ZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERlc3Ryb3kgdGhlIGluamVjdG9yIGFuZCByZWxlYXNlIHJlZmVyZW5jZXMgdG8gZXZlcnkgaW5zdGFuY2Ugb3IgcHJvdmlkZXIgYXNzb2NpYXRlZCB3aXRoIGl0LgogICAgICAgICAqCiAgICAgICAgICogQWxzbyBjYWxscyB0aGUgYE9uRGVzdHJveWAgbGlmZWN5Y2xlIGhvb2tzIG9mIGV2ZXJ5IGluc3RhbmNlIHRoYXQgd2FzIGNyZWF0ZWQgZm9yIHdoaWNoIGEKICAgICAgICAgKiBob29rIHdhcyBmb3VuZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Tm90RGVzdHJveWVkKCk7CiAgICAgICAgICAgIC8vIFNldCBkZXN0cm95ZWQgPSB0cnVlIGZpcnN0LCBpbiBjYXNlIGxpZmVjeWNsZSBob29rcyByZS1lbnRlciBkZXN0cm95KCkuCiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvLyBDYWxsIGFsbCB0aGUgbGlmZWN5Y2xlIGhvb2tzLgogICAgICAgICAgICAgICAgdGhpcy5vbkRlc3Ryb3kuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHNlcnZpY2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHNlcnZpY2UgPT4gc2VydmljZS5uZ09uRGVzdHJveSgpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGFsbCByZWZlcmVuY2VzLgogICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB0aGlzLm9uRGVzdHJveS5jbGVhcigpOwogICAgICAgICAgICAgICAgdGhpcy5pbmplY3RvckRlZlR5cGVzLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUgPSBUSFJPV19JRl9OT1RfRk9VTkQsIGZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCkgewogICAgICAgICAgICB0aGlzLmFzc2VydE5vdERlc3Ryb3llZCgpOwogICAgICAgICAgICAvLyBTZXQgdGhlIGluamVjdGlvbiBjb250ZXh0LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5qZWN0b3IgPSBzZXRDdXJyZW50SW5qZWN0b3IodGhpcyk7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBmb3IgdGhlIFNraXBTZWxmIGZsYWcuCiAgICAgICAgICAgICAgICBpZiAoIShmbGFncyAmIEluamVjdEZsYWdzLlNraXBTZWxmKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFNraXBTZWxmIGlzbid0IHNldCwgY2hlY2sgaWYgdGhlIHJlY29yZCBiZWxvbmdzIHRvIHRoaXMgaW5qZWN0b3IuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCByZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHRva2VuKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gcmVjb3JkLCBidXQgbWF5YmUgdGhlIHRva2VuIGlzIHNjb3BlZCB0byB0aGlzIGluamVjdG9yLiBMb29rIGZvciBhbiBpbmplY3RhYmxlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZiB3aXRoIGEgc2NvcGUgbWF0Y2hpbmcgdGhpcyBpbmplY3Rvci4KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWYgPSBjb3VsZEJlSW5qZWN0YWJsZVR5cGUodG9rZW4pICYmIGdldEluamVjdGFibGVEZWYodG9rZW4pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVmICYmIHRoaXMuaW5qZWN0YWJsZURlZkluU2NvcGUoZGVmKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm91bmQgYW4gaW5qZWN0YWJsZSBkZWYgYW5kIGl0J3Mgc2NvcGVkIHRvIHRoaXMgaW5qZWN0b3IuIFByZXRlbmQgYXMgaWYgaXQgd2FzIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBhbG9uZy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IG1ha2VSZWNvcmQoaW5qZWN0YWJsZURlZk9ySW5qZWN0b3JEZWZGYWN0b3J5KHRva2VuKSwgTk9UX1lFVCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5zZXQodG9rZW4sIHJlY29yZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIElmIGEgcmVjb3JkIHdhcyBmb3VuZCwgZ2V0IHRoZSBpbnN0YW5jZSBmb3IgaXQgYW5kIHJldHVybiBpdC4KICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkICE9IG51bGwgLyogTk9UIG51bGwgfHwgdW5kZWZpbmVkICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh5ZHJhdGUodG9rZW4sIHJlY29yZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2VsZWN0IHRoZSBuZXh0IGluamVjdG9yIGJhc2VkIG9uIHRoZSBTZWxmIGZsYWcgLSBpZiBzZWxmIGlzIHNldCwgdGhlIG5leHQgaW5qZWN0b3IgaXMKICAgICAgICAgICAgICAgIC8vIHRoZSBOdWxsSW5qZWN0b3IsIG90aGVyd2lzZSBpdCdzIHRoZSBwYXJlbnQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXh0SW5qZWN0b3IgPSAhKGZsYWdzICYgSW5qZWN0RmxhZ3MuU2VsZikgPyB0aGlzLnBhcmVudCA6IGdldE51bGxJbmplY3RvcigpOwogICAgICAgICAgICAgICAgLy8gU2V0IHRoZSBub3RGb3VuZFZhbHVlIGJhc2VkIG9uIHRoZSBPcHRpb25hbCBmbGFnIC0gaWYgb3B0aW9uYWwgaXMgc2V0IGFuZCBub3RGb3VuZFZhbHVlCiAgICAgICAgICAgICAgICAvLyBpcyB1bmRlZmluZWQsIHRoZSB2YWx1ZSBpcyBudWxsLCBvdGhlcndpc2UgaXQncyB0aGUgbm90Rm91bmRWYWx1ZS4KICAgICAgICAgICAgICAgIG5vdEZvdW5kVmFsdWUgPSAoZmxhZ3MgJiBJbmplY3RGbGFncy5PcHRpb25hbCkgJiYgbm90Rm91bmRWYWx1ZSA9PT0gVEhST1dfSUZfTk9UX0ZPVU5EID8KICAgICAgICAgICAgICAgICAgICBudWxsIDoKICAgICAgICAgICAgICAgICAgICBub3RGb3VuZFZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIG5leHRJbmplY3Rvci5nZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5uYW1lID09PSAnTnVsbEluamVjdG9yRXJyb3InKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSBlW05HX1RFTVBfVE9LRU5fUEFUSF0gPSBlW05HX1RFTVBfVE9LRU5fUEFUSF0gfHwgW107CiAgICAgICAgICAgICAgICAgICAgcGF0aC51bnNoaWZ0KHN0cmluZ2lmeSh0b2tlbikpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c0luamVjdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYSBwYXJlbnQgaW5qZWN0b3IsIGtlZXAgdGhyb3dpbmcKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvcm1hdCAmIHRocm93IHRoZSBmaW5hbCBlcnJvciBtZXNzYWdlIHdoZW4gd2UgZG9uJ3QgaGF2ZSBhbnkgcHJldmlvdXMgaW5qZWN0b3IKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhdGNoSW5qZWN0b3JFcnJvcihlLCB0b2tlbiwgJ1IzSW5qZWN0b3JFcnJvcicsIHRoaXMuc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgLy8gTGFzdGx5LCBjbGVhbiB1cCB0aGUgc3RhdGUgYnkgcmVzdG9yaW5nIHRoZSBwcmV2aW91cyBpbmplY3Rvci4KICAgICAgICAgICAgICAgIHNldEN1cnJlbnRJbmplY3RvcihwcmV2aW91c0luamVjdG9yKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVzb2x2ZUluamVjdG9yRGVmVHlwZXMoKSB7CiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWZUeXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZWZUeXBlID0+IHRoaXMuZ2V0KGRlZlR5cGUpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gKC8qKiBAdHlwZSB7P30gKi8gKFtdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVjb3JkcyA9IHRoaXMucmVjb3JkczsKICAgICAgICAgICAgcmVjb3Jkcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2LCB0b2tlbikgPT4gdG9rZW5zLnB1c2goc3RyaW5naWZ5KHRva2VuKSkpKTsKICAgICAgICAgICAgcmV0dXJuIGBSM0luamVjdG9yWyR7dG9rZW5zLmpvaW4oJywgJyl9XWA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhc3NlcnROb3REZXN0cm95ZWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW5qZWN0b3IgaGFzIGFscmVhZHkgYmVlbiBkZXN0cm95ZWQuJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIGFuIGBJbmplY3RvclR5cGVgIG9yIGBJbmplY3RvclR5cGVXaXRoUHJvdmlkZXJzYCBhbmQgYWxsIG9mIGl0cyB0cmFuc2l0aXZlIHByb3ZpZGVycwogICAgICAgICAqIHRvIHRoaXMgaW5qZWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhbiBgSW5qZWN0b3JUeXBlV2l0aFByb3ZpZGVyc2AgdGhhdCBkZWNsYXJlcyBwcm92aWRlcnMgYmVzaWRlcyB0aGUgdHlwZSBpcyBzcGVjaWZpZWQsCiAgICAgICAgICogdGhlIGZ1bmN0aW9uIHdpbGwgcmV0dXJuICJ0cnVlIiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBwcm92aWRlcnMgb2YgdGhlIHR5cGUgZGVmaW5pdGlvbiBuZWVkCiAgICAgICAgICogdG8gYmUgcHJvY2Vzc2VkLiBUaGlzIGFsbG93cyB1cyB0byBwcm9jZXNzIHByb3ZpZGVycyBvZiBpbmplY3RvciB0eXBlcyBhZnRlciBhbGwgaW1wb3J0cyBvZgogICAgICAgICAqIGFuIGluamVjdG9yIGRlZmluaXRpb24gYXJlIHByb2Nlc3NlZC4gKGZvbGxvd2luZyBWaWV3IEVuZ2luZSBzZW1hbnRpY3M6IHNlZSBGVy0xMzQ5KQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWZPcldyYXBwZWREZWYKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudHMKICAgICAgICAgKiBAcGFyYW0gez99IGRlZHVwU3RhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NJbmplY3RvclR5cGUoZGVmT3JXcmFwcGVkRGVmLCBwYXJlbnRzLCBkZWR1cFN0YWNrKSB7CiAgICAgICAgICAgIGRlZk9yV3JhcHBlZERlZiA9IHJlc29sdmVGb3J3YXJkUmVmKGRlZk9yV3JhcHBlZERlZik7CiAgICAgICAgICAgIGlmICghZGVmT3JXcmFwcGVkRGVmKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAvLyBFaXRoZXIgdGhlIGRlZk9yV3JhcHBlZERlZiBpcyBhbiBJbmplY3RvclR5cGUgKHdpdGggaW5qZWN0b3IgZGVmKSBvciBhbgogICAgICAgICAgICAvLyBJbmplY3RvckRlZlR5cGVXaXRoUHJvdmlkZXJzIChha2EgTW9kdWxlV2l0aFByb3ZpZGVycykuIERldGVjdGluZyBlaXRoZXIgaXMgYSBtZWdhbW9ycGhpYwogICAgICAgICAgICAvLyByZWFkLCBzbyBjYXJlIGlzIHRha2VuIHRvIG9ubHkgZG8gdGhlIHJlYWQgb25jZS4KICAgICAgICAgICAgLy8gRmlyc3QgYXR0ZW1wdCB0byByZWFkIHRoZSBpbmplY3RvciBkZWYgKGDJtWluamApLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZWYgPSBnZXRJbmplY3RvckRlZihkZWZPcldyYXBwZWREZWYpOwogICAgICAgICAgICAvLyBJZiB0aGF0J3Mgbm90IHByZXNlbnQsIHRoZW4gYXR0ZW1wdCB0byByZWFkIG5nTW9kdWxlIGZyb20gdGhlIEluamVjdG9yRGVmVHlwZVdpdGhQcm92aWRlcnMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmdNb2R1bGUgPSAoZGVmID09IG51bGwpICYmICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmT3JXcmFwcGVkRGVmKSkpLm5nTW9kdWxlIHx8IHVuZGVmaW5lZDsKICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBJbmplY3RvclR5cGUuIEluIHRoZSBjYXNlIHdoZXJlIGBkZWZPcldyYXBwZWREZWZgIGlzIGFuIGBJbmplY3RvclR5cGVgLAogICAgICAgICAgICAvLyB0aGVuIHRoaXMgaXMgZWFzeS4gSW4gdGhlIGNhc2Ugb2YgYW4gSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVycywgdGhlbiB0aGUgZGVmaW5pdGlvbiB0eXBlCiAgICAgICAgICAgIC8vIGlzIHRoZSBgbmdNb2R1bGVgLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZlR5cGUgPSAobmdNb2R1bGUgPT09IHVuZGVmaW5lZCkgPyAoKC8qKiBAdHlwZSB7P30gKi8gKGRlZk9yV3JhcHBlZERlZikpKSA6IG5nTW9kdWxlOwogICAgICAgICAgICAvLyBDaGVjayBmb3IgY2lyY3VsYXIgZGVwZW5kZW5jaWVzLgogICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmIHBhcmVudHMuaW5kZXhPZihkZWZUeXBlKSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRlZk5hbWUgPSBzdHJpbmdpZnkoZGVmVHlwZSk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENpcmN1bGFyIGRlcGVuZGVuY3kgaW4gREkgZGV0ZWN0ZWQgZm9yIHR5cGUgJHtkZWZOYW1lfS4gRGVwZW5kZW5jeSBwYXRoOiAke3BhcmVudHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWZUeXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZWZUeXBlID0+IHN0cmluZ2lmeShkZWZUeXBlKSkpLmpvaW4oJyA+ICcpfSA+ICR7ZGVmTmFtZX0uYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIG11bHRpcGxlIGltcG9ydHMgb2YgdGhlIHNhbWUgbW9kdWxlCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNEdXBsaWNhdGUgPSBkZWR1cFN0YWNrLmluZGV4T2YoZGVmVHlwZSkgIT09IC0xOwogICAgICAgICAgICAvLyBGaW5hbGx5LCBpZiBkZWZPcldyYXBwZWRUeXBlIHdhcyBhbiBgSW5qZWN0b3JEZWZUeXBlV2l0aFByb3ZpZGVyc2AsIHRoZW4gdGhlIGFjdHVhbAogICAgICAgICAgICAvLyBgSW5qZWN0b3JEZWZgIGlzIG9uIGl0cyBgbmdNb2R1bGVgLgogICAgICAgICAgICBpZiAobmdNb2R1bGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZGVmID0gZ2V0SW5qZWN0b3JEZWYobmdNb2R1bGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIG5vIGRlZmluaXRpb24gd2FzIGZvdW5kLCBpdCBtaWdodCBiZSBmcm9tIGV4cG9ydHMuIFJlbW92ZSBpdC4KICAgICAgICAgICAgaWYgKGRlZiA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQWRkIHByb3ZpZGVycyBpbiB0aGUgc2FtZSB3YXkgdGhhdCBATmdNb2R1bGUgcmVzb2x1dGlvbiBkaWQ6CiAgICAgICAgICAgIC8vIEZpcnN0LCBpbmNsdWRlIHByb3ZpZGVycyBmcm9tIGFueSBpbXBvcnRzLgogICAgICAgICAgICBpZiAoZGVmLmltcG9ydHMgIT0gbnVsbCAmJiAhaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgICAgIC8vIEJlZm9yZSBwcm9jZXNzaW5nIGRlZlR5cGUncyBpbXBvcnRzLCBhZGQgaXQgdG8gdGhlIHNldCBvZiBwYXJlbnRzLiBUaGlzIHdheSwgaWYgaXQgZW5kcwogICAgICAgICAgICAgICAgLy8gdXAgZGVlcGx5IGltcG9ydGluZyBpdHNlbGYsIHRoaXMgY2FuIGJlIGRldGVjdGVkLgogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIHBhcmVudHMucHVzaChkZWZUeXBlKTsKICAgICAgICAgICAgICAgIC8vIEFkZCBpdCB0byB0aGUgc2V0IG9mIGRlZHVwcy4gVGhpcyB3YXkgd2UgY2FuIGRldGVjdCBtdWx0aXBsZSBpbXBvcnRzIG9mIHRoZSBzYW1lIG1vZHVsZQogICAgICAgICAgICAgICAgZGVkdXBTdGFjay5wdXNoKGRlZlR5cGUpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGltcG9ydFR5cGVzV2l0aFByb3ZpZGVyczsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgZGVlcEZvckVhY2goZGVmLmltcG9ydHMsICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGltcG9ydGVkCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBpbXBvcnRlZCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb2Nlc3NJbmplY3RvclR5cGUoaW1wb3J0ZWQsIHBhcmVudHMsIGRlZHVwU3RhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzID09PSB1bmRlZmluZWQpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgcHJvY2Vzc2VkIGltcG9ydCBpcyBhbiBpbmplY3RvciB0eXBlIHdpdGggcHJvdmlkZXJzLCB3ZSBzdG9yZSBpdCBpbiB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxpc3Qgb2YgaW1wb3J0IHR5cGVzIHdpdGggcHJvdmlkZXJzLCBzbyB0aGF0IHdlIGNhbiBwcm9jZXNzIHRob3NlIGFmdGVyd2FyZHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRUeXBlc1dpdGhQcm92aWRlcnMucHVzaChpbXBvcnRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgaXQgZnJvbSB0aGUgcGFyZW50cyBzZXQgd2hlbiBmaW5pc2hlZC4KICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgcGFyZW50cy5wb3AoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEltcG9ydHMgd2hpY2ggYXJlIGRlY2xhcmVkIHdpdGggcHJvdmlkZXJzIChUeXBlV2l0aFByb3ZpZGVycykgbmVlZCB0byBiZSBwcm9jZXNzZWQKICAgICAgICAgICAgICAgIC8vIGFmdGVyIGFsbCBpbXBvcnRlZCBtb2R1bGVzIGFyZSBwcm9jZXNzZWQuIFRoaXMgaXMgc2ltaWxhciB0byBob3cgVmlldyBFbmdpbmUKICAgICAgICAgICAgICAgIC8vIHByb2Nlc3Nlcy9tZXJnZXMgbW9kdWxlIGltcG9ydHMgaW4gdGhlIG1ldGFkYXRhIHJlc29sdmVyLiBTZWU6IEZXLTEzNDkuCiAgICAgICAgICAgICAgICBpZiAoaW1wb3J0VHlwZXNXaXRoUHJvdmlkZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGltcG9ydFR5cGVzV2l0aFByb3ZpZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB7IG5nTW9kdWxlLCBwcm92aWRlcnMgfSA9IGltcG9ydFR5cGVzV2l0aFByb3ZpZGVyc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgZGVlcEZvckVhY2goKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVycykpLCAoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyID0+IHRoaXMucHJvY2Vzc1Byb3ZpZGVyKHByb3ZpZGVyLCBuZ01vZHVsZSwgcHJvdmlkZXJzIHx8IEVNUFRZX0FSUkFZJDIpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRyYWNrIHRoZSBJbmplY3RvclR5cGUgYW5kIGFkZCBhIHByb3ZpZGVyIGZvciBpdC4gSXQncyBpbXBvcnRhbnQgdGhhdCB0aGlzIGlzIGRvbmUgYWZ0ZXIgdGhlCiAgICAgICAgICAgIC8vIGRlZidzIGltcG9ydHMuCiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3JEZWZUeXBlcy5hZGQoZGVmVHlwZSk7CiAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5zZXQoZGVmVHlwZSwgbWFrZVJlY29yZChkZWYuZmFjdG9yeSwgTk9UX1lFVCkpOwogICAgICAgICAgICAvLyBOZXh0LCBpbmNsdWRlIHByb3ZpZGVycyBsaXN0ZWQgb24gdGhlIGRlZmluaXRpb24gaXRzZWxmLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZlByb3ZpZGVycyA9IGRlZi5wcm92aWRlcnM7CiAgICAgICAgICAgIGlmIChkZWZQcm92aWRlcnMgIT0gbnVsbCAmJiAhaXNEdXBsaWNhdGUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluamVjdG9yVHlwZSA9ICgvKiogQHR5cGUgez99ICovIChkZWZPcldyYXBwZWREZWYpKTsKICAgICAgICAgICAgICAgIGRlZXBGb3JFYWNoKGRlZlByb3ZpZGVycywgKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvdmlkZXIgPT4gdGhpcy5wcm9jZXNzUHJvdmlkZXIocHJvdmlkZXIsIGluamVjdG9yVHlwZSwgZGVmUHJvdmlkZXJzKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAobmdNb2R1bGUgIT09IHVuZGVmaW5lZCAmJgogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChkZWZPcldyYXBwZWREZWYpKSkucHJvdmlkZXJzICE9PSB1bmRlZmluZWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcm9jZXNzIGEgYFNpbmdsZVByb3ZpZGVyYCBhbmQgYWRkIGl0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGVUeXBlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3NQcm92aWRlcihwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpIHsKICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSB0b2tlbiBmcm9tIHRoZSBwcm92aWRlci4gRWl0aGVyIGl0J3MgaXRzIG93biB0b2tlbiwgb3IgaGFzIGEge3Byb3ZpZGU6IC4uLn0KICAgICAgICAgICAgLy8gcHJvcGVydHkuCiAgICAgICAgICAgIHByb3ZpZGVyID0gcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0b2tlbiA9IGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSA/IHByb3ZpZGVyIDogcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIgJiYgcHJvdmlkZXIucHJvdmlkZSk7CiAgICAgICAgICAgIC8vIENvbnN0cnVjdCBhIGBSZWNvcmRgIGZvciB0aGUgcHJvdmlkZXIuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVjb3JkID0gcHJvdmlkZXJUb1JlY29yZChwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpOwogICAgICAgICAgICBpZiAoIWlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSAmJiBwcm92aWRlci5tdWx0aSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHByb3ZpZGVyIGluZGljYXRlcyB0aGF0IGl0J3MgYSBtdWx0aS1wcm92aWRlciwgcHJvY2VzcyBpdCBzcGVjaWFsbHkuCiAgICAgICAgICAgICAgICAvLyBGaXJzdCBjaGVjayB3aGV0aGVyIGl0J3MgYmVlbiBkZWZpbmVkIGFscmVhZHkuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgbXVsdGlSZWNvcmQgPSB0aGlzLnJlY29yZHMuZ2V0KHRva2VuKTsKICAgICAgICAgICAgICAgIGlmIChtdWx0aVJlY29yZCkgewogICAgICAgICAgICAgICAgICAgIC8vIEl0IGhhcy4gVGhyb3cgYSBuaWNlIGVycm9yIGlmCiAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpUmVjb3JkLm11bHRpID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dNaXhlZE11bHRpUHJvdmlkZXJFcnJvcigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG11bHRpUmVjb3JkID0gbWFrZVJlY29yZCh1bmRlZmluZWQsIE5PVF9ZRVQsIHRydWUpOwogICAgICAgICAgICAgICAgICAgIG11bHRpUmVjb3JkLmZhY3RvcnkgPSAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBpbmplY3RBcmdzKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAobXVsdGlSZWNvcmQpKS5tdWx0aSkpKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWNvcmRzLnNldCh0b2tlbiwgbXVsdGlSZWNvcmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdG9rZW4gPSBwcm92aWRlcjsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChtdWx0aVJlY29yZC5tdWx0aSkpLnB1c2gocHJvdmlkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSB0aGlzLnJlY29yZHMuZ2V0KHRva2VuKTsKICAgICAgICAgICAgICAgIGlmIChleGlzdGluZyAmJiBleGlzdGluZy5tdWx0aSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3dNaXhlZE11bHRpUHJvdmlkZXJFcnJvcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVjb3Jkcy5zZXQodG9rZW4sIHJlY29yZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGh5ZHJhdGUodG9rZW4sIHJlY29yZCkgewogICAgICAgICAgICBpZiAocmVjb3JkLnZhbHVlID09PSBDSVJDVUxBUikgewogICAgICAgICAgICAgICAgdGhyb3dDeWNsaWNEZXBlbmRlbmN5RXJyb3Ioc3RyaW5naWZ5KHRva2VuKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVjb3JkLnZhbHVlID09PSBOT1RfWUVUKSB7CiAgICAgICAgICAgICAgICByZWNvcmQudmFsdWUgPSBDSVJDVUxBUjsKICAgICAgICAgICAgICAgIHJlY29yZC52YWx1ZSA9ICgvKiogQHR5cGUgez99ICovIChyZWNvcmQuZmFjdG9yeSkpKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHR5cGVvZiByZWNvcmQudmFsdWUgPT09ICdvYmplY3QnICYmIHJlY29yZC52YWx1ZSAmJiBoYXNPbkRlc3Ryb3kocmVjb3JkLnZhbHVlKSkgewogICAgICAgICAgICAgICAgdGhpcy5vbkRlc3Ryb3kuYWRkKHJlY29yZC52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChyZWNvcmQudmFsdWUpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW5qZWN0YWJsZURlZkluU2NvcGUoZGVmKSB7CiAgICAgICAgICAgIGlmICghZGVmLnByb3ZpZGVkSW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmLnByb3ZpZGVkSW4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmLnByb3ZpZGVkSW4gPT09ICdhbnknIHx8IChkZWYucHJvdmlkZWRJbiA9PT0gdGhpcy5zY29wZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5pbmplY3RvckRlZlR5cGVzLmhhcyhkZWYucHJvdmlkZWRJbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluamVjdGFibGVEZWZPckluamVjdG9yRGVmRmFjdG9yeSh0b2tlbikgewogICAgICAgIC8vIE1vc3QgdG9rZW5zIHdpbGwgaGF2ZSBhbiBpbmplY3RhYmxlIGRlZiBkaXJlY3RseSBvbiB0aGVtLCB3aGljaCBzcGVjaWZpZXMgYSBmYWN0b3J5IGRpcmVjdGx5LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmplY3RhYmxlRGVmID0gZ2V0SW5qZWN0YWJsZURlZih0b2tlbik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcnkgPSBpbmplY3RhYmxlRGVmICE9PSBudWxsID8gaW5qZWN0YWJsZURlZi5mYWN0b3J5IDogZ2V0RmFjdG9yeURlZih0b2tlbik7CiAgICAgICAgaWYgKGZhY3RvcnkgIT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSB0b2tlbiBpcyBhbiBOZ01vZHVsZSwgaXQncyBhbHNvIGluamVjdGFibGUgYnV0IHRoZSBmYWN0b3J5IGlzIG9uIGl0cyBpbmplY3RvciBkZWYKICAgICAgICAvLyAoYMm1aW5qYCkKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5qZWN0b3JEZWYgPSBnZXRJbmplY3RvckRlZih0b2tlbik7CiAgICAgICAgaWYgKGluamVjdG9yRGVmICE9PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBpbmplY3RvckRlZi5mYWN0b3J5OwogICAgICAgIH0KICAgICAgICAvLyBJbmplY3Rpb25Ub2tlbnMgc2hvdWxkIGhhdmUgYW4gaW5qZWN0YWJsZSBkZWYgKMm1cHJvdikgYW5kIHRodXMgc2hvdWxkIGJlIGhhbmRsZWQgYWJvdmUuCiAgICAgICAgLy8gSWYgaXQncyBtaXNzaW5nIHRoYXQsIGl0J3MgYW4gZXJyb3IuCiAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUb2tlbiAke3N0cmluZ2lmeSh0b2tlbil9IGlzIG1pc3NpbmcgYSDJtXByb3YgZGVmaW5pdGlvbi5gKTsKICAgICAgICB9CiAgICAgICAgLy8gVW5kZWNvcmF0ZWQgdHlwZXMgY2FuIHNvbWV0aW1lcyBiZSBjcmVhdGVkIGlmIHRoZXkgaGF2ZSBubyBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCiAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgRnVuY3Rpb24pIHsKICAgICAgICAgICAgcmV0dXJuIGdldFVuZGVjb3JhdGVkSW5qZWN0YWJsZUZhY3RvcnkodG9rZW4pOwogICAgICAgIH0KICAgICAgICAvLyBUaGVyZSB3YXMgbm8gd2F5IHRvIHJlc29sdmUgYSBmYWN0b3J5IGZvciB0aGlzIHRva2VuLgogICAgICAgIHRocm93IG5ldyBFcnJvcigndW5yZWFjaGFibGUnKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VW5kZWNvcmF0ZWRJbmplY3RhYmxlRmFjdG9yeSh0b2tlbikgewogICAgICAgIC8vIElmIHRoZSB0b2tlbiBoYXMgcGFyYW1ldGVycyB0aGVuIGl0IGhhcyBkZXBlbmRlbmNpZXMgdGhhdCB3ZSBjYW5ub3QgcmVzb2x2ZSBpbXBsaWNpdGx5LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJhbUxlbmd0aCA9IHRva2VuLmxlbmd0aDsKICAgICAgICBpZiAocGFyYW1MZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXJncyA9IG5ld0FycmF5KHBhcmFtTGVuZ3RoLCAnPycpOwogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbid0IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yICR7c3RyaW5naWZ5KHRva2VuKX06ICgke2FyZ3Muam9pbignLCAnKX0pLmApOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgY29uc3RydWN0b3IgZnVuY3Rpb24gYXBwZWFycyB0byBoYXZlIG5vIHBhcmFtZXRlcnMuCiAgICAgICAgLy8gVGhpcyBtaWdodCBiZSBiZWNhdXNlIGl0IGluaGVyaXRzIGZyb20gYSBzdXBlci1jbGFzcy4gSW4gd2hpY2ggY2FzZSwgdXNlIGFuIGluamVjdGFibGUKICAgICAgICAvLyBkZWYgZnJvbSBhbiBhbmNlc3RvciBpZiB0aGVyZSBpcyBvbmUuCiAgICAgICAgLy8gT3RoZXJ3aXNlIHRoaXMgcmVhbGx5IGlzIGEgc2ltcGxlIGNsYXNzIHdpdGggbm8gZGVwZW5kZW5jaWVzLCBzbyByZXR1cm4gYSBmYWN0b3J5IHRoYXQKICAgICAgICAvLyBqdXN0IGluc3RhbnRpYXRlcyB0aGUgemVyby1hcmcgY29uc3RydWN0b3IuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaGVyaXRlZEluamVjdGFibGVEZWYgPSBnZXRJbmhlcml0ZWRJbmplY3RhYmxlRGVmKHRva2VuKTsKICAgICAgICBpZiAoaW5oZXJpdGVkSW5qZWN0YWJsZURlZiAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gaW5oZXJpdGVkSW5qZWN0YWJsZURlZi5mYWN0b3J5KCgvKiogQHR5cGUgez99ICovICh0b2tlbikpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gbmV3ICgoLyoqIEB0eXBlIHs/fSAqLyAodG9rZW4pKSkoKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlVHlwZQogICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3ZpZGVyVG9SZWNvcmQocHJvdmlkZXIsIG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzKSB7CiAgICAgICAgaWYgKGlzVmFsdWVQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgcmV0dXJuIG1ha2VSZWNvcmQodW5kZWZpbmVkLCBwcm92aWRlci51c2VWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSBwcm92aWRlclRvRmFjdG9yeShwcm92aWRlciwgbmdNb2R1bGVUeXBlLCBwcm92aWRlcnMpOwogICAgICAgICAgICByZXR1cm4gbWFrZVJlY29yZChmYWN0b3J5LCBOT1RfWUVUKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvbnZlcnRzIGEgYFNpbmdsZVByb3ZpZGVyYCBpbnRvIGEgZmFjdG9yeSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyIHByb3ZpZGVyIHRvIGNvbnZlcnQgdG8gZmFjdG9yeQogICAgICogQHBhcmFtIHs/PX0gbmdNb2R1bGVUeXBlCiAgICAgKiBAcGFyYW0gez89fSBwcm92aWRlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3ZpZGVyVG9GYWN0b3J5KHByb3ZpZGVyLCBuZ01vZHVsZVR5cGUsIHByb3ZpZGVycykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZmFjdG9yeSA9IHVuZGVmaW5lZDsKICAgICAgICBpZiAoaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdW53cmFwcGVkUHJvdmlkZXIgPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlcik7CiAgICAgICAgICAgIHJldHVybiBnZXRGYWN0b3J5RGVmKHVud3JhcHBlZFByb3ZpZGVyKSB8fCBpbmplY3RhYmxlRGVmT3JJbmplY3RvckRlZkZhY3RvcnkodW53cmFwcGVkUHJvdmlkZXIpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgaWYgKGlzVmFsdWVQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlci51c2VWYWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzRmFjdG9yeVByb3ZpZGVyKHByb3ZpZGVyKSkgewogICAgICAgICAgICAgICAgZmFjdG9yeSA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHByb3ZpZGVyLnVzZUZhY3RvcnkoLi4uaW5qZWN0QXJncyhwcm92aWRlci5kZXBzIHx8IFtdKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzRXhpc3RpbmdQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgICAgIGZhY3RvcnkgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiDJtcm1aW5qZWN0KHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnVzZUV4aXN0aW5nKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2xhc3NSZWYgPSByZXNvbHZlRm9yd2FyZFJlZihwcm92aWRlciAmJgogICAgICAgICAgICAgICAgICAgICgoKC8qKiBAdHlwZSB7P30gKi8gKHByb3ZpZGVyKSkpLnVzZUNsYXNzIHx8IHByb3ZpZGVyLnByb3ZpZGUpKTsKICAgICAgICAgICAgICAgIGlmICghY2xhc3NSZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvd0ludmFsaWRQcm92aWRlckVycm9yKG5nTW9kdWxlVHlwZSwgcHJvdmlkZXJzLCBwcm92aWRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaGFzRGVwcyhwcm92aWRlcikpIHsKICAgICAgICAgICAgICAgICAgICBmYWN0b3J5ID0gKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gbmV3IChjbGFzc1JlZikoLi4uaW5qZWN0QXJncyhwcm92aWRlci5kZXBzKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdldEZhY3RvcnlEZWYoY2xhc3NSZWYpIHx8IGluamVjdGFibGVEZWZPckluamVjdG9yRGVmRmFjdG9yeShjbGFzc1JlZik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IG11bHRpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlUmVjb3JkKGZhY3RvcnksIHZhbHVlLCBtdWx0aSA9IGZhbHNlKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgZmFjdG9yeTogZmFjdG9yeSwKICAgICAgICAgICAgdmFsdWU6IHZhbHVlLAogICAgICAgICAgICBtdWx0aTogbXVsdGkgPyBbXSA6IHVuZGVmaW5lZCwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1ZhbHVlUHJvdmlkZXIodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnICYmIFVTRV9WQUxVRSBpbiB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNFeGlzdGluZ1Byb3ZpZGVyKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuICEhKHZhbHVlICYmICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkudXNlRXhpc3RpbmcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0ZhY3RvcnlQcm92aWRlcih2YWx1ZSkgewogICAgICAgIHJldHVybiAhISh2YWx1ZSAmJiAoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpLnVzZUZhY3RvcnkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1R5cGVQcm92aWRlcih2YWx1ZSkgewogICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdmdW5jdGlvbic7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQ2xhc3NQcm92aWRlcih2YWx1ZSkgewogICAgICAgIHJldHVybiAhISgoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSkudXNlQ2xhc3M7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc0RlcHModmFsdWUpIHsKICAgICAgICByZXR1cm4gISEoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpLmRlcHM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc09uRGVzdHJveSh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnICYmCiAgICAgICAgICAgIHR5cGVvZiAoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpLm5nT25EZXN0cm95ID09PSAnZnVuY3Rpb24nOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb3VsZEJlSW5qZWN0YWJsZVR5cGUodmFsdWUpIHsKICAgICAgICByZXR1cm4gKHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJykgfHwKICAgICAgICAgICAgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBJTkpFQ1RPUl9JTVBMX19QT1NUX1IzX18ocHJvdmlkZXJzLCBwYXJlbnQsIG5hbWUpIHsKICAgICAgICByZXR1cm4gY3JlYXRlSW5qZWN0b3IoeyBuYW1lOiBuYW1lIH0sIHBhcmVudCwgcHJvdmlkZXJzLCBuYW1lKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IElOSkVDVE9SX0lNUEwgPSBJTkpFQ1RPUl9JTVBMX19QT1NUX1IzX187CiAgICAvKioKICAgICAqIENvbmNyZXRlIGluamVjdG9ycyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuIEluamVjdG9ycyBhcmUgY29uZmlndXJlZAogICAgICogd2l0aCBbcHJvdmlkZXJzXShndWlkZS9nbG9zc2FyeSNwcm92aWRlcikgdGhhdCBhc3NvY2lhdGUKICAgICAqIGRlcGVuZGVuY2llcyBvZiB2YXJpb3VzIHR5cGVzIHdpdGggW2luamVjdGlvbiB0b2tlbnNdKGd1aWRlL2dsb3NzYXJ5I2RpLXRva2VuKS4KICAgICAqCiAgICAgKiBAc2VlIFsiREkgUHJvdmlkZXJzIl0oZ3VpZGUvZGVwZW5kZW5jeS1pbmplY3Rpb24tcHJvdmlkZXJzKS4KICAgICAqIEBzZWUgYFN0YXRpY1Byb3ZpZGVyYAogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY3JlYXRlcyBhIHNlcnZpY2UgaW5qZWN0b3IgaW5zdGFuY2UuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL3Byb3ZpZGVyX3NwZWMudHMgcmVnaW9uPSdDb25zdHJ1Y3RvclByb3ZpZGVyJ30KICAgICAqCiAgICAgKiAjIyMgVXNhZ2UgZXhhbXBsZQogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29yZS9kaS90cy9pbmplY3Rvcl9zcGVjLnRzIHJlZ2lvbj0nSW5qZWN0b3InfQogICAgICoKICAgICAqIGBJbmplY3RvcmAgcmV0dXJucyBpdHNlbGYgd2hlbiBnaXZlbiBgSW5qZWN0b3JgIGFzIGEgdG9rZW46CiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb3JlL2RpL3RzL2luamVjdG9yX3NwZWMudHMgcmVnaW9uPSdpbmplY3RJbmplY3Rvcid9CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBJbmplY3RvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gcGFyZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgY3JlYXRlKG9wdGlvbnMsIHBhcmVudCkgewogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShvcHRpb25zKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIElOSkVDVE9SX0lNUEwob3B0aW9ucywgcGFyZW50LCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSU5KRUNUT1JfSU1QTChvcHRpb25zLnByb3ZpZGVycywgb3B0aW9ucy5wYXJlbnQsIG9wdGlvbnMubmFtZSB8fCAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBJbmplY3Rvci5USFJPV19JRl9OT1RfRk9VTkQgPSBUSFJPV19JRl9OT1RfRk9VTkQ7CiAgICBJbmplY3Rvci5OVUxMID0gbmV3IE51bGxJbmplY3RvcigpOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBJbmplY3Rvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7CiAgICAgICAgdG9rZW46IEluamVjdG9yLAogICAgICAgIHByb3ZpZGVkSW46ICgvKiogQHR5cGUgez99ICovICgnYW55JykpLAogICAgICAgIGZhY3Rvcnk6ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IMm1ybVpbmplY3QoSU5KRUNUT1IpKSwKICAgIH0pOwogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAbm9jb2xsYXBzZQogICAgICovCiAgICBJbmplY3Rvci5fX05HX0VMRU1FTlRfSURfXyA9IC0xOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvcmVmbGVjdGl2ZV9lcnJvcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRGaXJzdENsb3NlZEN5Y2xlKGtleXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIGlmIChyZXMuaW5kZXhPZihrZXlzW2ldKSA+IC0xKSB7CiAgICAgICAgICAgICAgICByZXMucHVzaChrZXlzW2ldKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzLnB1c2goa2V5c1tpXSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30ga2V5cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzKSB7CiAgICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJldmVyc2VkID0gZmluZEZpcnN0Q2xvc2VkQ3ljbGUoa2V5cy5zbGljZSgpLnJldmVyc2UoKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG9rZW5TdHJzID0gcmV2ZXJzZWQubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBrID0+IHN0cmluZ2lmeShrLnRva2VuKSkpOwogICAgICAgICAgICByZXR1cm4gJyAoJyArIHRva2VuU3Rycy5qb2luKCcgLT4gJykgKyAnKSc7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnJzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZQogICAgICogQHBhcmFtIHs/PX0gb3JpZ2luYWxFcnJvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW5qZWN0aW9uRXJyb3IoaW5qZWN0b3IsIGtleSwgY29uc3RydWN0UmVzb2x2aW5nTWVzc2FnZSwgb3JpZ2luYWxFcnJvcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBrZXlzID0gW2tleV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVyck1zZyA9IGNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2Uoa2V5cyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVycm9yID0gKC8qKiBAdHlwZSB7P30gKi8gKChvcmlnaW5hbEVycm9yID8gd3JhcHBlZEVycm9yKGVyck1zZywgb3JpZ2luYWxFcnJvcikgOiBFcnJvcihlcnJNc2cpKSkpOwogICAgICAgIGVycm9yLmFkZEtleSA9IGFkZEtleTsKICAgICAgICBlcnJvci5rZXlzID0ga2V5czsKICAgICAgICBlcnJvci5pbmplY3RvcnMgPSBbaW5qZWN0b3JdOwogICAgICAgIGVycm9yLmNvbnN0cnVjdFJlc29sdmluZ01lc3NhZ2UgPSBjb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlOwogICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZXJyb3IpKSlbRVJST1JfT1JJR0lOQUxfRVJST1JdID0gb3JpZ2luYWxFcnJvcjsKICAgICAgICByZXR1cm4gZXJyb3I7CiAgICB9CiAgICAvKioKICAgICAqIEB0aGlzIHs/fQogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFkZEtleShpbmplY3Rvciwga2V5KSB7CiAgICAgICAgdGhpcy5pbmplY3RvcnMucHVzaChpbmplY3Rvcik7CiAgICAgICAgdGhpcy5rZXlzLnB1c2goa2V5KTsKICAgICAgICAvLyBOb3RlOiBUaGlzIHVwZGF0ZWQgbWVzc2FnZSB3b24ndCBiZSByZWZsZWN0ZWQgaW4gdGhlIGAuc3RhY2tgIHByb3BlcnR5CiAgICAgICAgdGhpcy5tZXNzYWdlID0gdGhpcy5jb25zdHJ1Y3RSZXNvbHZpbmdNZXNzYWdlKHRoaXMua2V5cyk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93biB3aGVuIHRyeWluZyB0byByZXRyaWV2ZSBhIGRlcGVuZGVuY3kgYnkga2V5IGZyb20ge1xAbGluayBJbmplY3Rvcn0sIGJ1dCB0aGUKICAgICAqIHtcQGxpbmsgSW5qZWN0b3J9IGRvZXMgbm90IGhhdmUgYSB7XEBsaW5rIFByb3ZpZGVyfSBmb3IgdGhlIGdpdmVuIGtleS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogY2xhc3MgQSB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKGI6Qikge30KICAgICAqIH0KICAgICAqCiAgICAgKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTsKICAgICAqIGBgYAogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vUHJvdmlkZXJFcnJvcihpbmplY3Rvciwga2V5KSB7CiAgICAgICAgcmV0dXJuIGluamVjdGlvbkVycm9yKGluamVjdG9yLCBrZXksICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBzdHJpbmdpZnkoa2V5c1swXS50b2tlbik7CiAgICAgICAgICAgIHJldHVybiBgTm8gcHJvdmlkZXIgZm9yICR7Zmlyc3R9ISR7Y29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzKX1gOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogVGhyb3duIHdoZW4gZGVwZW5kZW5jaWVzIGZvcm0gYSBjeWNsZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbCiAgICAgKiAgIHtwcm92aWRlOiAib25lIiwgdXNlRmFjdG9yeTogKHR3bykgPT4gInR3byIsIGRlcHM6IFtbbmV3IEluamVjdCgidHdvIildXX0sCiAgICAgKiAgIHtwcm92aWRlOiAidHdvIiwgdXNlRmFjdG9yeTogKG9uZSkgPT4gIm9uZSIsIGRlcHM6IFtbbmV3IEluamVjdCgib25lIildXX0KICAgICAqIF0pOwogICAgICoKICAgICAqIGV4cGVjdCgoKSA9PiBpbmplY3Rvci5nZXQoIm9uZSIpKS50b1Rocm93RXJyb3IoKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFJldHJpZXZpbmcgYEFgIG9yIGBCYCB0aHJvd3MgYSBgQ3ljbGljRGVwZW5kZW5jeUVycm9yYCBhcyB0aGUgZ3JhcGggYWJvdmUgY2Fubm90IGJlIGNvbnN0cnVjdGVkLgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGN5Y2xpY0RlcGVuZGVuY3lFcnJvcihpbmplY3Rvciwga2V5KSB7CiAgICAgICAgcmV0dXJuIGluamVjdGlvbkVycm9yKGluamVjdG9yLCBrZXksICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChrZXlzKSB7CiAgICAgICAgICAgIHJldHVybiBgQ2Fubm90IGluc3RhbnRpYXRlIGN5Y2xpYyBkZXBlbmRlbmN5ISR7Y29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzKX1gOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogVGhyb3duIHdoZW4gYSBjb25zdHJ1Y3RpbmcgdHlwZSByZXR1cm5zIHdpdGggYW4gRXJyb3IuCiAgICAgKgogICAgICogVGhlIGBJbnN0YW50aWF0aW9uRXJyb3JgIGNsYXNzIGNvbnRhaW5zIHRoZSBvcmlnaW5hbCBlcnJvciBwbHVzIHRoZSBkZXBlbmRlbmN5IGdyYXBoIHdoaWNoIGNhdXNlZAogICAgICogdGhpcyBvYmplY3QgdG8gYmUgaW5zdGFudGlhdGVkLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjbGFzcyBBIHsKICAgICAqICAgY29uc3RydWN0b3IoKSB7CiAgICAgKiAgICAgdGhyb3cgbmV3IEVycm9yKCdtZXNzYWdlJyk7CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqCiAgICAgKiB2YXIgaW5qZWN0b3IgPSBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBXSk7CiAgICAgKiB0cnkgewogICAgICogICBpbmplY3Rvci5nZXQoQSk7CiAgICAgKiB9IGNhdGNoIChlKSB7CiAgICAgKiAgIGV4cGVjdChlIGluc3RhbmNlb2YgSW5zdGFudGlhdGlvbkVycm9yKS50b0JlKHRydWUpOwogICAgICogICBleHBlY3QoZS5vcmlnaW5hbEV4Y2VwdGlvbi5tZXNzYWdlKS50b0VxdWFsKCJtZXNzYWdlIik7CiAgICAgKiAgIGV4cGVjdChlLm9yaWdpbmFsU3RhY2spLnRvQmVEZWZpbmVkKCk7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICAgICAqIEBwYXJhbSB7P30gb3JpZ2luYWxFeGNlcHRpb24KICAgICAqIEBwYXJhbSB7P30gb3JpZ2luYWxTdGFjawogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRpb25FcnJvcihpbmplY3Rvciwgb3JpZ2luYWxFeGNlcHRpb24sIG9yaWdpbmFsU3RhY2ssIGtleSkgewogICAgICAgIHJldHVybiBpbmplY3Rpb25FcnJvcihpbmplY3Rvciwga2V5LCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoa2V5cykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZpcnN0ID0gc3RyaW5naWZ5KGtleXNbMF0udG9rZW4pOwogICAgICAgICAgICByZXR1cm4gYCR7b3JpZ2luYWxFeGNlcHRpb24ubWVzc2FnZX06IEVycm9yIGR1cmluZyBpbnN0YW50aWF0aW9uIG9mICR7Zmlyc3R9ISR7Y29uc3RydWN0UmVzb2x2aW5nUGF0aChrZXlzKX0uYDsKICAgICAgICB9KSwgb3JpZ2luYWxFeGNlcHRpb24pOwogICAgfQogICAgLyoqCiAgICAgKiBUaHJvd24gd2hlbiBhbiBvYmplY3Qgb3RoZXIgdGhlbiB7XEBsaW5rIFByb3ZpZGVyfSAob3IgYFR5cGVgKSBpcyBwYXNzZWQgdG8ge1xAbGluayBJbmplY3Rvcn0KICAgICAqIGNyZWF0aW9uLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbIm5vdCBhIHR5cGUiXSkpLnRvVGhyb3dFcnJvcigpOwogICAgICogYGBgCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnZhbGlkUHJvdmlkZXJFcnJvcihwcm92aWRlcikgewogICAgICAgIHJldHVybiBFcnJvcihgSW52YWxpZCBwcm92aWRlciAtIG9ubHkgaW5zdGFuY2VzIG9mIFByb3ZpZGVyIGFuZCBUeXBlIGFyZSBhbGxvd2VkLCBnb3Q6ICR7cHJvdmlkZXJ9YCk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93biB3aGVuIHRoZSBjbGFzcyBoYXMgbm8gYW5ub3RhdGlvbiBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBMYWNrIG9mIGFubm90YXRpb24gaW5mb3JtYXRpb24gcHJldmVudHMgdGhlIHtcQGxpbmsgSW5qZWN0b3J9IGZyb20gZGV0ZXJtaW5pbmcgd2hpY2ggZGVwZW5kZW5jaWVzCiAgICAgKiBuZWVkIHRvIGJlIGluamVjdGVkIGludG8gdGhlIGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjbGFzcyBBIHsKICAgICAqICAgY29uc3RydWN0b3IoYikge30KICAgICAqIH0KICAgICAqCiAgICAgKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pKS50b1Rocm93RXJyb3IoKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFRoaXMgZXJyb3IgaXMgYWxzbyB0aHJvd24gd2hlbiB0aGUgY2xhc3Mgbm90IG1hcmtlZCB3aXRoIHtcQGxpbmsgSW5qZWN0YWJsZX0gaGFzIHBhcmFtZXRlciB0eXBlcy4KICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjbGFzcyBCIHt9CiAgICAgKgogICAgICogY2xhc3MgQSB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKGI6Qikge30gLy8gbm8gaW5mb3JtYXRpb24gYWJvdXQgdGhlIHBhcmFtZXRlciB0eXBlcyBvZiBBIGlzIGF2YWlsYWJsZSBhdCBydW50aW1lLgogICAgICogfQogICAgICoKICAgICAqIGV4cGVjdCgoKSA9PiBJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtBLEJdKSkudG9UaHJvd0Vycm9yKCk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHR5cGVPckZ1bmMKICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub0Fubm90YXRpb25FcnJvcih0eXBlT3JGdW5jLCBwYXJhbXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2lnbmF0dXJlID0gW107CiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGlpID0gcGFyYW1zLmxlbmd0aDsgaSA8IGlpOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXIgPSBwYXJhbXNbaV07CiAgICAgICAgICAgIGlmICghcGFyYW1ldGVyIHx8IHBhcmFtZXRlci5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgc2lnbmF0dXJlLnB1c2goJz8nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNpZ25hdHVyZS5wdXNoKHBhcmFtZXRlci5tYXAoc3RyaW5naWZ5KS5qb2luKCcgJykpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBFcnJvcignQ2Fubm90IHJlc29sdmUgYWxsIHBhcmFtZXRlcnMgZm9yIFwnJyArIHN0cmluZ2lmeSh0eXBlT3JGdW5jKSArICdcJygnICsKICAgICAgICAgICAgc2lnbmF0dXJlLmpvaW4oJywgJykgKyAnKS4gJyArCiAgICAgICAgICAgICdNYWtlIHN1cmUgdGhhdCBhbGwgdGhlIHBhcmFtZXRlcnMgYXJlIGRlY29yYXRlZCB3aXRoIEluamVjdCBvciBoYXZlIHZhbGlkIHR5cGUgYW5ub3RhdGlvbnMgYW5kIHRoYXQgXCcnICsKICAgICAgICAgICAgc3RyaW5naWZ5KHR5cGVPckZ1bmMpICsgJ1wnIGlzIGRlY29yYXRlZCB3aXRoIEluamVjdGFibGUuJyk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93biB3aGVuIGdldHRpbmcgYW4gb2JqZWN0IGJ5IGluZGV4LgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBjbGFzcyBBIHt9CiAgICAgKgogICAgICogdmFyIGluamVjdG9yID0gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQV0pOwogICAgICoKICAgICAqIGV4cGVjdCgoKSA9PiBpbmplY3Rvci5nZXRBdCgxMDApKS50b1Rocm93RXJyb3IoKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG91dE9mQm91bmRzRXJyb3IoaW5kZXgpIHsKICAgICAgICByZXR1cm4gRXJyb3IoYEluZGV4ICR7aW5kZXh9IGlzIG91dC1vZi1ib3VuZHMuYCk7CiAgICB9CiAgICAvLyBUT0RPOiBhZGQgYSB3b3JraW5nIGV4YW1wbGUgYWZ0ZXIgYWxwaGEzOCBpcyByZWxlYXNlZAogICAgLyoqCiAgICAgKiBUaHJvd24gd2hlbiBhIG11bHRpIHByb3ZpZGVyIGFuZCBhIHJlZ3VsYXIgcHJvdmlkZXIgYXJlIGJvdW5kIHRvIHRoZSBzYW1lIHRva2VuLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBleHBlY3QoKCkgPT4gSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbCiAgICAgKiAgIHsgcHJvdmlkZTogIlN0cmluZ3MiLCB1c2VWYWx1ZTogInN0cmluZzEiLCBtdWx0aTogdHJ1ZX0sCiAgICAgKiAgIHsgcHJvdmlkZTogIlN0cmluZ3MiLCB1c2VWYWx1ZTogInN0cmluZzIiLCBtdWx0aTogZmFsc2V9CiAgICAgKiBdKSkudG9UaHJvd0Vycm9yKCk7CiAgICAgKiBgYGAKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIxCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyMgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5nTXVsdGlQcm92aWRlcnNXaXRoUmVndWxhclByb3ZpZGVyc0Vycm9yKHByb3ZpZGVyMSwgcHJvdmlkZXIyKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBDYW5ub3QgbWl4IG11bHRpIHByb3ZpZGVycyBhbmQgcmVndWxhciBwcm92aWRlcnMsIGdvdDogJHtwcm92aWRlcjF9ICR7cHJvdmlkZXIyfWApOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvZGkvcmVmbGVjdGl2ZV9rZXkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBIHVuaXF1ZSBvYmplY3QgdXNlZCBmb3IgcmV0cmlldmluZyBpdGVtcyBmcm9tIHRoZSB7XEBsaW5rIFJlZmxlY3RpdmVJbmplY3Rvcn0uCiAgICAgKgogICAgICogS2V5cyBoYXZlOgogICAgICogLSBhIHN5c3RlbS13aWRlIHVuaXF1ZSBgaWRgLgogICAgICogLSBhIGB0b2tlbmAuCiAgICAgKgogICAgICogYEtleWAgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHtcQGxpbmsgUmVmbGVjdGl2ZUluamVjdG9yfSBiZWNhdXNlIGl0cyBzeXN0ZW0td2lkZSB1bmlxdWUgYGlkYCBhbGxvd3MKICAgICAqIHRoZQogICAgICogaW5qZWN0b3IgdG8gc3RvcmUgY3JlYXRlZCBvYmplY3RzIGluIGEgbW9yZSBlZmZpY2llbnQgd2F5LgogICAgICoKICAgICAqIGBLZXlgIHNob3VsZCBub3QgYmUgY3JlYXRlZCBkaXJlY3RseS4ge1xAbGluayBSZWZsZWN0aXZlSW5qZWN0b3J9IGNyZWF0ZXMga2V5cyBhdXRvbWF0aWNhbGx5IHdoZW4KICAgICAqIHJlc29sdmluZwogICAgICogcHJvdmlkZXJzLgogICAgICoKICAgICAqIEBkZXByZWNhdGVkIE5vIHJlcGxhY2VtZW50CiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBSZWZsZWN0aXZlS2V5IHsKICAgICAgICAvKioKICAgICAgICAgKiBQcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0b2tlbiwgaWQpIHsKICAgICAgICAgICAgdGhpcy50b2tlbiA9IHRva2VuOwogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIGlmICghdG9rZW4pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVG9rZW4gbXVzdCBiZSBkZWZpbmVkIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSBzdHJpbmdpZnkodGhpcy50b2tlbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyBhIGBLZXlgIGZvciBhIHRva2VuLgogICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBnZXQodG9rZW4pIHsKICAgICAgICAgICAgcmV0dXJuIF9nbG9iYWxLZXlSZWdpc3RyeS5nZXQocmVzb2x2ZUZvcndhcmRSZWYodG9rZW4pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30gdGhlIG51bWJlciBvZiBrZXlzIHJlZ2lzdGVyZWQgaW4gdGhlIHN5c3RlbS4KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZ2V0IG51bWJlck9mS2V5cygpIHsKICAgICAgICAgICAgcmV0dXJuIF9nbG9iYWxLZXlSZWdpc3RyeS5udW1iZXJPZktleXM7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgS2V5UmVnaXN0cnkgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9hbGxLZXlzID0gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQodG9rZW4pIHsKICAgICAgICAgICAgaWYgKHRva2VuIGluc3RhbmNlb2YgUmVmbGVjdGl2ZUtleSkKICAgICAgICAgICAgICAgIHJldHVybiB0b2tlbjsKICAgICAgICAgICAgaWYgKHRoaXMuX2FsbEtleXMuaGFzKHRva2VuKSkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLl9hbGxLZXlzLmdldCh0b2tlbikpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld0tleSA9IG5ldyBSZWZsZWN0aXZlS2V5KHRva2VuLCBSZWZsZWN0aXZlS2V5Lm51bWJlck9mS2V5cyk7CiAgICAgICAgICAgIHRoaXMuX2FsbEtleXMuc2V0KHRva2VuLCBuZXdLZXkpOwogICAgICAgICAgICByZXR1cm4gbmV3S2V5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBudW1iZXJPZktleXMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbGxLZXlzLnNpemU7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX2dsb2JhbEtleVJlZ2lzdHJ5ID0gbmV3IEtleVJlZ2lzdHJ5KCk7CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBQcm92aWRlcyBhY2Nlc3MgdG8gcmVmbGVjdGlvbiBkYXRhIGFib3V0IHN5bWJvbHMuIFVzZWQgaW50ZXJuYWxseSBieSBBbmd1bGFyCiAgICAgKiB0byBwb3dlciBkZXBlbmRlbmN5IGluamVjdGlvbiBhbmQgY29tcGlsYXRpb24uCiAgICAgKi8KICAgIGNsYXNzIFJlZmxlY3RvciB7CiAgICAgICAgY29uc3RydWN0b3IocmVmbGVjdGlvbkNhcGFiaWxpdGllcykgewogICAgICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSByZWZsZWN0aW9uQ2FwYWJpbGl0aWVzOwogICAgICAgIH0KICAgICAgICB1cGRhdGVDYXBhYmlsaXRpZXMoY2FwcykgewogICAgICAgICAgICB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMgPSBjYXBzOwogICAgICAgIH0KICAgICAgICBmYWN0b3J5KHR5cGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5mYWN0b3J5KHR5cGUpOwogICAgICAgIH0KICAgICAgICBwYXJhbWV0ZXJzKHR5cGVPckZ1bmMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5wYXJhbWV0ZXJzKHR5cGVPckZ1bmMpOwogICAgICAgIH0KICAgICAgICBhbm5vdGF0aW9ucyh0eXBlT3JGdW5jKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMuYW5ub3RhdGlvbnModHlwZU9yRnVuYyk7CiAgICAgICAgfQogICAgICAgIHByb3BNZXRhZGF0YSh0eXBlT3JGdW5jKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucHJvcE1ldGFkYXRhKHR5cGVPckZ1bmMpOwogICAgICAgIH0KICAgICAgICBoYXNMaWZlY3ljbGVIb29rKHR5cGUsIGxjUHJvcGVydHkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5oYXNMaWZlY3ljbGVIb29rKHR5cGUsIGxjUHJvcGVydHkpOwogICAgICAgIH0KICAgICAgICBnZXR0ZXIobmFtZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmdldHRlcihuYW1lKTsKICAgICAgICB9CiAgICAgICAgc2V0dGVyKG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5zZXR0ZXIobmFtZSk7CiAgICAgICAgfQogICAgICAgIG1ldGhvZChuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMubWV0aG9kKG5hbWUpOwogICAgICAgIH0KICAgICAgICBpbXBvcnRVcmkodHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLmltcG9ydFVyaSh0eXBlKTsKICAgICAgICB9CiAgICAgICAgcmVzb3VyY2VVcmkodHlwZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZWZsZWN0aW9uQ2FwYWJpbGl0aWVzLnJlc291cmNlVXJpKHR5cGUpOwogICAgICAgIH0KICAgICAgICByZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVmbGVjdGlvbkNhcGFiaWxpdGllcy5yZXNvbHZlSWRlbnRpZmllcihuYW1lLCBtb2R1bGVVcmwsIG1lbWJlcnMsIHJ1bnRpbWUpOwogICAgICAgIH0KICAgICAgICByZXNvbHZlRW51bShpZGVudGlmaWVyLCBuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlZmxlY3Rpb25DYXBhYmlsaXRpZXMucmVzb2x2ZUVudW0oaWRlbnRpZmllciwgbmFtZSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogVGhlIHtAbGluayBSZWZsZWN0b3J9IHVzZWQgaW50ZXJuYWxseSBpbiBBbmd1bGFyIHRvIGFjY2VzcyBtZXRhZGF0YQogICAgICogYWJvdXQgc3ltYm9scy4KICAgICAqLwogICAgY29uc3QgcmVmbGVjdG9yID0gbmV3IFJlZmxlY3RvcihuZXcgUmVmbGVjdGlvbkNhcGFiaWxpdGllcygpKTsKICAgIC8qKgogICAgICogYERlcGVuZGVuY3lgIGlzIHVzZWQgYnkgdGhlIGZyYW1ld29yayB0byBleHRlbmQgREkuCiAgICAgKiBUaGlzIGlzIGludGVybmFsIHRvIEFuZ3VsYXIgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4KICAgICAqLwogICAgY2xhc3MgUmVmbGVjdGl2ZURlcGVuZGVuY3kgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmlzaWJpbGl0eQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGtleSwgb3B0aW9uYWwsIHZpc2liaWxpdHkpIHsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgICAgIHRoaXMub3B0aW9uYWwgPSBvcHRpb25hbDsKICAgICAgICAgICAgdGhpcy52aXNpYmlsaXR5ID0gdmlzaWJpbGl0eTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmcm9tS2V5KGtleSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFJlZmxlY3RpdmVEZXBlbmRlbmN5KGtleSwgZmFsc2UsIG51bGwpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9FTVBUWV9MSVNUID0gW107CiAgICBjbGFzcyBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcl8gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHBhcmFtIHs/fSByZXNvbHZlZEZhY3RvcmllcwogICAgICAgICAqIEBwYXJhbSB7P30gbXVsdGlQcm92aWRlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGtleSwgcmVzb2x2ZWRGYWN0b3JpZXMsIG11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgICAgIHRoaXMucmVzb2x2ZWRGYWN0b3JpZXMgPSByZXNvbHZlZEZhY3RvcmllczsKICAgICAgICAgICAgdGhpcy5tdWx0aVByb3ZpZGVyID0gbXVsdGlQcm92aWRlcjsKICAgICAgICAgICAgdGhpcy5yZXNvbHZlZEZhY3RvcnkgPSB0aGlzLnJlc29sdmVkRmFjdG9yaWVzWzBdOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQW4gaW50ZXJuYWwgcmVzb2x2ZWQgcmVwcmVzZW50YXRpb24gb2YgYSBmYWN0b3J5IGZ1bmN0aW9uIGNyZWF0ZWQgYnkgcmVzb2x2aW5nIGBQcm92aWRlcmAuCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAgICAgKiBAcGFyYW0gez99IGRlcGVuZGVuY2llcwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGZhY3RvcnksIGRlcGVuZGVuY2llcykgewogICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llczsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJlc29sdmUgYSBzaW5nbGUgcHJvdmlkZXIuCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZUZhY3RvcnkocHJvdmlkZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZhY3RvcnlGbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc29sdmVkRGVwczsKICAgICAgICBpZiAocHJvdmlkZXIudXNlQ2xhc3MpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB1c2VDbGFzcyA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyLnVzZUNsYXNzKTsKICAgICAgICAgICAgZmFjdG9yeUZuID0gcmVmbGVjdG9yLmZhY3RvcnkodXNlQ2xhc3MpOwogICAgICAgICAgICByZXNvbHZlZERlcHMgPSBfZGVwZW5kZW5jaWVzRm9yKHVzZUNsYXNzKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocHJvdmlkZXIudXNlRXhpc3RpbmcpIHsKICAgICAgICAgICAgZmFjdG9yeUZuID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGFsaWFzSW5zdGFuY2UKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhbGlhc0luc3RhbmNlKSA9PiBhbGlhc0luc3RhbmNlKTsKICAgICAgICAgICAgcmVzb2x2ZWREZXBzID0gW1JlZmxlY3RpdmVEZXBlbmRlbmN5LmZyb21LZXkoUmVmbGVjdGl2ZUtleS5nZXQocHJvdmlkZXIudXNlRXhpc3RpbmcpKV07CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHByb3ZpZGVyLnVzZUZhY3RvcnkpIHsKICAgICAgICAgICAgZmFjdG9yeUZuID0gcHJvdmlkZXIudXNlRmFjdG9yeTsKICAgICAgICAgICAgcmVzb2x2ZWREZXBzID0gY29uc3RydWN0RGVwZW5kZW5jaWVzKHByb3ZpZGVyLnVzZUZhY3RvcnksIHByb3ZpZGVyLmRlcHMpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZmFjdG9yeUZuID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gcHJvdmlkZXIudXNlVmFsdWUpOwogICAgICAgICAgICByZXNvbHZlZERlcHMgPSBfRU1QVFlfTElTVDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ldyBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5KGZhY3RvcnlGbiwgcmVzb2x2ZWREZXBzKTsKICAgIH0KICAgIC8qKgogICAgICogQ29udmVydHMgdGhlIGBQcm92aWRlcmAgaW50byBgUmVzb2x2ZWRQcm92aWRlcmAuCiAgICAgKgogICAgICogYEluamVjdG9yYCBpbnRlcm5hbGx5IG9ubHkgdXNlcyBgUmVzb2x2ZWRQcm92aWRlcmAsIGBQcm92aWRlcmAgY29udGFpbnMgY29udmVuaWVuY2UgcHJvdmlkZXIKICAgICAqIHN5bnRheC4KICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlc29sdmVSZWZsZWN0aXZlUHJvdmlkZXIocHJvdmlkZXIpIHsKICAgICAgICByZXR1cm4gbmV3IFJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVyXyhSZWZsZWN0aXZlS2V5LmdldChwcm92aWRlci5wcm92aWRlKSwgW3Jlc29sdmVSZWZsZWN0aXZlRmFjdG9yeShwcm92aWRlcildLCBwcm92aWRlci5tdWx0aSB8fCBmYWxzZSk7CiAgICB9CiAgICAvKioKICAgICAqIFJlc29sdmUgYSBsaXN0IG9mIFByb3ZpZGVycy4KICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9ybWFsaXplZCA9IF9ub3JtYWxpemVQcm92aWRlcnMocHJvdmlkZXJzLCBbXSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc29sdmVkID0gbm9ybWFsaXplZC5tYXAocmVzb2x2ZVJlZmxlY3RpdmVQcm92aWRlcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc29sdmVkUHJvdmlkZXJNYXAgPSBtZXJnZVJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyhyZXNvbHZlZCwgbmV3IE1hcCgpKTsKICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShyZXNvbHZlZFByb3ZpZGVyTWFwLnZhbHVlcygpKTsKICAgIH0KICAgIC8qKgogICAgICogTWVyZ2VzIGEgbGlzdCBvZiBSZXNvbHZlZFByb3ZpZGVycyBpbnRvIGEgbGlzdCB3aGVyZSBlYWNoIGtleSBpcyBjb250YWluZWQgZXhhY3RseSBvbmNlIGFuZAogICAgICogbXVsdGkgcHJvdmlkZXJzIGhhdmUgYmVlbiBtZXJnZWQuCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHBhcmFtIHs/fSBub3JtYWxpemVkUHJvdmlkZXJzTWFwCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtZXJnZVJlc29sdmVkUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMsIG5vcm1hbGl6ZWRQcm92aWRlcnNNYXApIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3ZpZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVyID0gcHJvdmlkZXJzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gbm9ybWFsaXplZFByb3ZpZGVyc01hcC5nZXQocHJvdmlkZXIua2V5LmlkKTsKICAgICAgICAgICAgaWYgKGV4aXN0aW5nKSB7CiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlciAhPT0gZXhpc3RpbmcubXVsdGlQcm92aWRlcikgewogICAgICAgICAgICAgICAgICAgIHRocm93IG1peGluZ011bHRpUHJvdmlkZXJzV2l0aFJlZ3VsYXJQcm92aWRlcnNFcnJvcihleGlzdGluZywgcHJvdmlkZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHByb3ZpZGVyLnJlc29sdmVkRmFjdG9yaWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nLnJlc29sdmVkRmFjdG9yaWVzLnB1c2gocHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXNbal0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRQcm92aWRlcnNNYXAuc2V0KHByb3ZpZGVyLmtleS5pZCwgcHJvdmlkZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHJlc29sdmVkUHJvdmlkZXI7CiAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIubXVsdGlQcm92aWRlcikgewogICAgICAgICAgICAgICAgICAgIHJlc29sdmVkUHJvdmlkZXIgPSBuZXcgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJfKHByb3ZpZGVyLmtleSwgcHJvdmlkZXIucmVzb2x2ZWRGYWN0b3JpZXMuc2xpY2UoKSwgcHJvdmlkZXIubXVsdGlQcm92aWRlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFByb3ZpZGVyID0gcHJvdmlkZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBub3JtYWxpemVkUHJvdmlkZXJzTWFwLnNldChwcm92aWRlci5rZXkuaWQsIHJlc29sdmVkUHJvdmlkZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3JtYWxpemVkUHJvdmlkZXJzTWFwOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICogQHBhcmFtIHs/fSByZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9ub3JtYWxpemVQcm92aWRlcnMocHJvdmlkZXJzLCByZXMpIHsKICAgICAgICBwcm92aWRlcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBiID0+IHsKICAgICAgICAgICAgaWYgKGIgaW5zdGFuY2VvZiBUeXBlKSB7CiAgICAgICAgICAgICAgICByZXMucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAoeyBwcm92aWRlOiBiLCB1c2VDbGFzczogYiB9KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGIgJiYgdHlwZW9mIGIgPT0gJ29iamVjdCcgJiYgKCgvKiogQHR5cGUgez99ICovIChiKSkpLnByb3ZpZGUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmVzLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKGIpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShiKSkgewogICAgICAgICAgICAgICAgX25vcm1hbGl6ZVByb3ZpZGVycyhiLCByZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFByb3ZpZGVyRXJyb3IoYik7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlT3JGdW5jCiAgICAgKiBAcGFyYW0gez89fSBkZXBlbmRlbmNpZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnN0cnVjdERlcGVuZGVuY2llcyh0eXBlT3JGdW5jLCBkZXBlbmRlbmNpZXMpIHsKICAgICAgICBpZiAoIWRlcGVuZGVuY2llcykgewogICAgICAgICAgICByZXR1cm4gX2RlcGVuZGVuY2llc0Zvcih0eXBlT3JGdW5jKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gZGVwZW5kZW5jaWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdCA9PiBbdF0pKTsKICAgICAgICAgICAgcmV0dXJuIGRlcGVuZGVuY2llcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHQgPT4gX2V4dHJhY3RUb2tlbih0eXBlT3JGdW5jLCB0LCBwYXJhbXMpKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGVPckZ1bmMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9kZXBlbmRlbmNpZXNGb3IodHlwZU9yRnVuYykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJhbXMgPSByZWZsZWN0b3IucGFyYW1ldGVycyh0eXBlT3JGdW5jKTsKICAgICAgICBpZiAoIXBhcmFtcykKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIGlmIChwYXJhbXMuc29tZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwID0+IHAgPT0gbnVsbCkpKSB7CiAgICAgICAgICAgIHRocm93IG5vQW5ub3RhdGlvbkVycm9yKHR5cGVPckZ1bmMsIHBhcmFtcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHAgPT4gX2V4dHJhY3RUb2tlbih0eXBlT3JGdW5jLCBwLCBwYXJhbXMpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZU9yRnVuYwogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9leHRyYWN0VG9rZW4odHlwZU9yRnVuYywgbWV0YWRhdGEsIHBhcmFtcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdG9rZW4gPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb3B0aW9uYWwgPSBmYWxzZTsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkobWV0YWRhdGEpKSB7CiAgICAgICAgICAgIGlmIChtZXRhZGF0YSBpbnN0YW5jZW9mIEluamVjdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIF9jcmVhdGVEZXBlbmRlbmN5KG1ldGFkYXRhLnRva2VuLCBvcHRpb25hbCwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX2NyZWF0ZURlcGVuZGVuY3kobWV0YWRhdGEsIG9wdGlvbmFsLCBudWxsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHZpc2liaWxpdHkgPSBudWxsOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbWV0YWRhdGEubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJhbU1ldGFkYXRhID0gbWV0YWRhdGFbaV07CiAgICAgICAgICAgIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgVHlwZSkgewogICAgICAgICAgICAgICAgdG9rZW4gPSBwYXJhbU1ldGFkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBJbmplY3QpIHsKICAgICAgICAgICAgICAgIHRva2VuID0gcGFyYW1NZXRhZGF0YS50b2tlbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgT3B0aW9uYWwpIHsKICAgICAgICAgICAgICAgIG9wdGlvbmFsID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2VsZiB8fCBwYXJhbU1ldGFkYXRhIGluc3RhbmNlb2YgU2tpcFNlbGYpIHsKICAgICAgICAgICAgICAgIHZpc2liaWxpdHkgPSBwYXJhbU1ldGFkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBhcmFtTWV0YWRhdGEgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgewogICAgICAgICAgICAgICAgdG9rZW4gPSBwYXJhbU1ldGFkYXRhOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRva2VuID0gcmVzb2x2ZUZvcndhcmRSZWYodG9rZW4pOwogICAgICAgIGlmICh0b2tlbiAhPSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBfY3JlYXRlRGVwZW5kZW5jeSh0b2tlbiwgb3B0aW9uYWwsIHZpc2liaWxpdHkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbm9Bbm5vdGF0aW9uRXJyb3IodHlwZU9yRnVuYywgcGFyYW1zKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7P30gb3B0aW9uYWwKICAgICAqIEBwYXJhbSB7P30gdmlzaWJpbGl0eQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2NyZWF0ZURlcGVuZGVuY3kodG9rZW4sIG9wdGlvbmFsLCB2aXNpYmlsaXR5KSB7CiAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlRGVwZW5kZW5jeShSZWZsZWN0aXZlS2V5LmdldCh0b2tlbiksIG9wdGlvbmFsLCB2aXNpYmlsaXR5KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL3JlZmxlY3RpdmVfaW5qZWN0b3IudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gVGhyZXNob2xkIGZvciB0aGUgZHluYW1pYyB2ZXJzaW9uCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBVTkRFRklORUQgPSB7fTsKICAgIC8qKgogICAgICogQSBSZWZsZWN0aXZlRGVwZW5kZW5jeSBpbmplY3Rpb24gY29udGFpbmVyIHVzZWQgZm9yIGluc3RhbnRpYXRpbmcgb2JqZWN0cyBhbmQgcmVzb2x2aW5nCiAgICAgKiBkZXBlbmRlbmNpZXMuCiAgICAgKgogICAgICogQW4gYEluamVjdG9yYCBpcyBhIHJlcGxhY2VtZW50IGZvciBhIGBuZXdgIG9wZXJhdG9yLCB3aGljaCBjYW4gYXV0b21hdGljYWxseSByZXNvbHZlIHRoZQogICAgICogY29uc3RydWN0b3IgZGVwZW5kZW5jaWVzLgogICAgICoKICAgICAqIEluIHR5cGljYWwgdXNlLCBhcHBsaWNhdGlvbiBjb2RlIGFza3MgZm9yIHRoZSBkZXBlbmRlbmNpZXMgaW4gdGhlIGNvbnN0cnVjdG9yIGFuZCB0aGV5IGFyZQogICAgICogcmVzb2x2ZWQgYnkgdGhlIGBJbmplY3RvcmAuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBjcmVhdGVzIGFuIGBJbmplY3RvcmAgY29uZmlndXJlZCB0byBjcmVhdGUgYEVuZ2luZWAgYW5kIGBDYXJgLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgKiBjbGFzcyBFbmdpbmUgewogICAgICogfQogICAgICoKICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgKiBjbGFzcyBDYXIgewogICAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge30KICAgICAqIH0KICAgICAqCiAgICAgKiB2YXIgaW5qZWN0b3IgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZUFuZENyZWF0ZShbQ2FyLCBFbmdpbmVdKTsKICAgICAqIHZhciBjYXIgPSBpbmplY3Rvci5nZXQoQ2FyKTsKICAgICAqIGV4cGVjdChjYXIgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7CiAgICAgKiBleHBlY3QoY2FyLmVuZ2luZSBpbnN0YW5jZW9mIEVuZ2luZSkudG9CZSh0cnVlKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIE5vdGljZSwgd2UgZG9uJ3QgdXNlIHRoZSBgbmV3YCBvcGVyYXRvciBiZWNhdXNlIHdlIGV4cGxpY2l0bHkgd2FudCB0byBoYXZlIHRoZSBgSW5qZWN0b3JgCiAgICAgKiByZXNvbHZlIGFsbCBvZiB0aGUgb2JqZWN0J3MgZGVwZW5kZW5jaWVzIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgZnJvbSB2NSAtIHNsb3cgYW5kIGJyaW5ncyBpbiBhIGxvdCBvZiBjb2RlLCBVc2UgYEluamVjdG9yLmNyZWF0ZWAgaW5zdGVhZC4KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgUmVmbGVjdGl2ZUluamVjdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBUdXJucyBhbiBhcnJheSBvZiBwcm92aWRlciBkZWZpbml0aW9ucyBpbnRvIGFuIGFycmF5IG9mIHJlc29sdmVkIHByb3ZpZGVycy4KICAgICAgICAgKgogICAgICAgICAqIEEgcmVzb2x1dGlvbiBpcyBhIHByb2Nlc3Mgb2YgZmxhdHRlbmluZyBtdWx0aXBsZSBuZXN0ZWQgYXJyYXlzIGFuZCBjb252ZXJ0aW5nIGluZGl2aWR1YWwKICAgICAgICAgKiBwcm92aWRlcnMgaW50byBhbiBhcnJheSBvZiBgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXJgcy4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqICMjIyBFeGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogXEBJbmplY3RhYmxlKCkKICAgICAgICAgKiBjbGFzcyBFbmdpbmUgewogICAgICAgICAqIH0KICAgICAgICAgKiAgLwogICAgICAgICAqIGNsYXNzIENhciB7CiAgICAgICAgICogICBjb25zdHJ1Y3RvcihwdWJsaWMgZW5naW5lOkVuZ2luZSkge30KICAgICAgICAgKiB9CiAgICAgICAgICoKICAgICAgICAgKiB2YXIgcHJvdmlkZXJzID0gUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUoW0NhciwgW1tFbmdpbmVdXV0pOwogICAgICAgICAqCiAgICAgICAgICogZXhwZWN0KHByb3ZpZGVycy5sZW5ndGgpLnRvRXF1YWwoMik7CiAgICAgICAgICoKICAgICAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdIGluc3RhbmNlb2YgUmVzb2x2ZWRSZWZsZWN0aXZlUHJvdmlkZXIpLnRvQmUodHJ1ZSk7CiAgICAgICAgICogZXhwZWN0KHByb3ZpZGVyc1swXS5rZXkuZGlzcGxheU5hbWUpLnRvQmUoIkNhciIpOwogICAgICAgICAqIGV4cGVjdChwcm92aWRlcnNbMF0uZGVwZW5kZW5jaWVzLmxlbmd0aCkudG9FcXVhbCgxKTsKICAgICAgICAgKiBleHBlY3QocHJvdmlkZXJzWzBdLmZhY3RvcnkpLnRvQmVEZWZpbmVkKCk7CiAgICAgICAgICoKICAgICAgICAgKiBleHBlY3QocHJvdmlkZXJzWzFdLmtleS5kaXNwbGF5TmFtZSkudG9CZSgiRW5naW5lIik7CiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHJlc29sdmUocHJvdmlkZXJzKSB7CiAgICAgICAgICAgIHJldHVybiByZXNvbHZlUmVmbGVjdGl2ZVByb3ZpZGVycyhwcm92aWRlcnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXNvbHZlcyBhbiBhcnJheSBvZiBwcm92aWRlcnMgYW5kIGNyZWF0ZXMgYW4gaW5qZWN0b3IgZnJvbSB0aG9zZSBwcm92aWRlcnMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcGFzc2VkLWluIHByb3ZpZGVycyBjYW4gYmUgYW4gYXJyYXkgb2YgYFR5cGVgLCBgUHJvdmlkZXJgLAogICAgICAgICAqIG9yIGEgcmVjdXJzaXZlIGFycmF5IG9mIG1vcmUgcHJvdmlkZXJzLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogIyMjIEV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBcQEluamVjdGFibGUoKQogICAgICAgICAqIGNsYXNzIEVuZ2luZSB7CiAgICAgICAgICogfQogICAgICAgICAqICAvCiAgICAgICAgICogY2xhc3MgQ2FyIHsKICAgICAgICAgKiAgIGNvbnN0cnVjdG9yKHB1YmxpYyBlbmdpbmU6RW5naW5lKSB7fQogICAgICAgICAqIH0KICAgICAgICAgKgogICAgICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlQW5kQ3JlYXRlKFtDYXIsIEVuZ2luZV0pOwogICAgICAgICAqIGV4cGVjdChpbmplY3Rvci5nZXQoQ2FyKSBpbnN0YW5jZW9mIENhcikudG9CZSh0cnVlKTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICAgICAqIEBwYXJhbSB7Pz19IHBhcmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHJlc29sdmVBbmRDcmVhdGUocHJvdmlkZXJzLCBwYXJlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShwcm92aWRlcnMpOwogICAgICAgICAgICByZXR1cm4gUmVmbGVjdGl2ZUluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMsIHBhcmVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gaW5qZWN0b3IgZnJvbSBwcmV2aW91c2x5IHJlc29sdmVkIHByb3ZpZGVycy4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgQVBJIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gY29uc3RydWN0IGluamVjdG9ycyBpbiBwZXJmb3JtYW5jZS1zZW5zaXRpdmUgcGFydHMuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgRXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogYGBgdHlwZXNjcmlwdAogICAgICAgICAqIFxASW5qZWN0YWJsZSgpCiAgICAgICAgICogY2xhc3MgRW5naW5lIHsKICAgICAgICAgKiB9CiAgICAgICAgICogIC8KICAgICAgICAgKiBjbGFzcyBDYXIgewogICAgICAgICAqICAgY29uc3RydWN0b3IocHVibGljIGVuZ2luZTpFbmdpbmUpIHt9CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogdmFyIHByb3ZpZGVycyA9IFJlZmxlY3RpdmVJbmplY3Rvci5yZXNvbHZlKFtDYXIsIEVuZ2luZV0pOwogICAgICAgICAqIHZhciBpbmplY3RvciA9IFJlZmxlY3RpdmVJbmplY3Rvci5mcm9tUmVzb2x2ZWRQcm92aWRlcnMocHJvdmlkZXJzKTsKICAgICAgICAgKiBleHBlY3QoaW5qZWN0b3IuZ2V0KENhcikgaW5zdGFuY2VvZiBDYXIpLnRvQmUodHJ1ZSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAgICAgKiBAcGFyYW0gez89fSBwYXJlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmcm9tUmVzb2x2ZWRQcm92aWRlcnMocHJvdmlkZXJzLCBwYXJlbnQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWZsZWN0aXZlSW5qZWN0b3JfKHByb3ZpZGVycywgcGFyZW50KTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBSZWZsZWN0aXZlSW5qZWN0b3JfIHsKICAgICAgICAvKioKICAgICAgICAgKiBQcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBfcHJvdmlkZXJzCiAgICAgICAgICogQHBhcmFtIHs/PX0gX3BhcmVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9wcm92aWRlcnMsIF9wYXJlbnQpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NvbnN0cnVjdGlvbkNvdW50ZXIgPSAwOwogICAgICAgICAgICB0aGlzLl9wcm92aWRlcnMgPSBfcHJvdmlkZXJzOwogICAgICAgICAgICB0aGlzLnBhcmVudCA9IF9wYXJlbnQgfHwgbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsZW4gPSBfcHJvdmlkZXJzLmxlbmd0aDsKICAgICAgICAgICAgdGhpcy5rZXlJZHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5vYmpzID0gW107CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMua2V5SWRzW2ldID0gX3Byb3ZpZGVyc1tpXS5rZXkuaWQ7CiAgICAgICAgICAgICAgICB0aGlzLm9ianNbaV0gPSBVTkRFRklORUQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICAgICAqIEBwYXJhbSB7Pz19IG5vdEZvdW5kVmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSA9IFRIUk9XX0lGX05PVF9GT1VORCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXkoUmVmbGVjdGl2ZUtleS5nZXQodG9rZW4pLCBudWxsLCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc29sdmVBbmRDcmVhdGVDaGlsZChwcm92aWRlcnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMgPSBSZWZsZWN0aXZlSW5qZWN0b3IucmVzb2x2ZShwcm92aWRlcnMpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVDaGlsZEZyb21SZXNvbHZlZChSZXNvbHZlZFJlZmxlY3RpdmVQcm92aWRlcnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlQ2hpbGRGcm9tUmVzb2x2ZWQocHJvdmlkZXJzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5qID0gbmV3IFJlZmxlY3RpdmVJbmplY3Rvcl8ocHJvdmlkZXJzKTsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChpbmopKSkucGFyZW50ID0gdGhpczsKICAgICAgICAgICAgcmV0dXJuIGluajsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzb2x2ZUFuZEluc3RhbnRpYXRlKHByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmluc3RhbnRpYXRlUmVzb2x2ZWQoUmVmbGVjdGl2ZUluamVjdG9yLnJlc29sdmUoW3Byb3ZpZGVyXSlbMF0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbnN0YW50aWF0ZVJlc29sdmVkKHByb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnN0YW50aWF0ZVByb3ZpZGVyKHByb3ZpZGVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UHJvdmlkZXJBdEluZGV4KGluZGV4KSB7CiAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gdGhpcy5fcHJvdmlkZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgb3V0T2ZCb3VuZHNFcnJvcihpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Byb3ZpZGVyc1tpbmRleF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbmV3KHByb3ZpZGVyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jb25zdHJ1Y3Rpb25Db3VudGVyKysgPiB0aGlzLl9nZXRNYXhOdW1iZXJPZk9iamVjdHMoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgY3ljbGljRGVwZW5kZW5jeUVycm9yKHRoaXMsIHByb3ZpZGVyLmtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE1heE51bWJlck9mT2JqZWN0cygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub2Jqcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luc3RhbnRpYXRlUHJvdmlkZXIocHJvdmlkZXIpIHsKICAgICAgICAgICAgaWYgKHByb3ZpZGVyLm11bHRpUHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgIHJlc1tpXSA9IHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2luc3RhbnRpYXRlKHByb3ZpZGVyLCBwcm92aWRlci5yZXNvbHZlZEZhY3Rvcmllc1swXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBSZXNvbHZlZFJlZmxlY3RpdmVGYWN0b3J5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW5zdGFudGlhdGUocHJvdmlkZXIsIFJlc29sdmVkUmVmbGVjdGl2ZUZhY3RvcnkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeS5mYWN0b3J5OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZXBzOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgZGVwcyA9CiAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZWRSZWZsZWN0aXZlRmFjdG9yeS5kZXBlbmRlbmNpZXMubWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlcAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgZGVwID0+IHRoaXMuX2dldEJ5UmVmbGVjdGl2ZURlcGVuZGVuY3koZGVwKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoZS5hZGRLZXkpIHsKICAgICAgICAgICAgICAgICAgICBlLmFkZEtleSh0aGlzLCBwcm92aWRlci5rZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvYmo7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBvYmogPSBmYWN0b3J5KC4uLmRlcHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBpbnN0YW50aWF0aW9uRXJyb3IodGhpcywgZSwgZS5zdGFjaywgcHJvdmlkZXIua2V5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZGVwCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0QnlSZWZsZWN0aXZlRGVwZW5kZW5jeShkZXApIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2dldEJ5S2V5KGRlcC5rZXksIGRlcC52aXNpYmlsaXR5LCBkZXAub3B0aW9uYWwgPyBudWxsIDogVEhST1dfSUZfTk9UX0ZPVU5EKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEBwYXJhbSB7P30gdmlzaWJpbGl0eQogICAgICAgICAqIEBwYXJhbSB7P30gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEJ5S2V5KGtleSwgdmlzaWJpbGl0eSwgbm90Rm91bmRWYWx1ZSkgewogICAgICAgICAgICBpZiAoa2V5ID09PSBSZWZsZWN0aXZlSW5qZWN0b3JfLklOSkVDVE9SX0tFWSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHZpc2liaWxpdHkgaW5zdGFuY2VvZiBTZWxmKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXlTZWxmKGtleSwgbm90Rm91bmRWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0QnlLZXlEZWZhdWx0KGtleSwgbm90Rm91bmRWYWx1ZSwgdmlzaWJpbGl0eSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGtleUlkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0T2JqQnlLZXlJZChrZXlJZCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMua2V5SWRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5rZXlJZHNbaV0gPT09IGtleUlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMub2Jqc1tpXSA9PT0gVU5ERUZJTkVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub2Jqc1tpXSA9IHRoaXMuX25ldyh0aGlzLl9wcm92aWRlcnNbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vYmpzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBVTkRFRklORUQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEBwYXJhbSB7P30gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Rocm93T3JOdWxsKGtleSwgbm90Rm91bmRWYWx1ZSkgewogICAgICAgICAgICBpZiAobm90Rm91bmRWYWx1ZSAhPT0gVEhST1dfSUZfTk9UX0ZPVU5EKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbm90Rm91bmRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5vUHJvdmlkZXJFcnJvcih0aGlzLCBrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEBwYXJhbSB7P30gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEJ5S2V5U2VsZihrZXksIG5vdEZvdW5kVmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYmogPSB0aGlzLl9nZXRPYmpCeUtleUlkKGtleS5pZCk7CiAgICAgICAgICAgIHJldHVybiAob2JqICE9PSBVTkRFRklORUQpID8gb2JqIDogdGhpcy5fdGhyb3dPck51bGwoa2V5LCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHBhcmFtIHs/fSBub3RGb3VuZFZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSB2aXNpYmlsaXR5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0QnlLZXlEZWZhdWx0KGtleSwgbm90Rm91bmRWYWx1ZSwgdmlzaWJpbGl0eSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpbmo7CiAgICAgICAgICAgIGlmICh2aXNpYmlsaXR5IGluc3RhbmNlb2YgU2tpcFNlbGYpIHsKICAgICAgICAgICAgICAgIGluaiA9IHRoaXMucGFyZW50OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaW5qID0gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoaW5qIGluc3RhbmNlb2YgUmVmbGVjdGl2ZUluamVjdG9yXykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5qXyA9ICgvKiogQHR5cGUgez99ICovIChpbmopKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9iaiA9IGlual8uX2dldE9iakJ5S2V5SWQoa2V5LmlkKTsKICAgICAgICAgICAgICAgIGlmIChvYmogIT09IFVOREVGSU5FRCkKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2JqOwogICAgICAgICAgICAgICAgaW5qID0gaW5qXy5wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGluaiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGluai5nZXQoa2V5LnRva2VuLCBub3RGb3VuZFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl90aHJvd09yTnVsbChrZXksIG5vdEZvdW5kVmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpc3BsYXlOYW1lKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3ZpZGVycyA9IF9tYXBQcm92aWRlcnModGhpcywgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChiKSA9PiAnICInICsgYi5rZXkuZGlzcGxheU5hbWUgKyAnIiAnKSkKICAgICAgICAgICAgICAgIC5qb2luKCcsICcpOwogICAgICAgICAgICByZXR1cm4gYFJlZmxlY3RpdmVJbmplY3Rvcihwcm92aWRlcnM6IFske3Byb3ZpZGVyc31dKWA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9TdHJpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc3BsYXlOYW1lOwogICAgICAgIH0KICAgIH0KICAgIFJlZmxlY3RpdmVJbmplY3Rvcl8uSU5KRUNUT1JfS0VZID0gUmVmbGVjdGl2ZUtleS5nZXQoSW5qZWN0b3IpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9yCiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfbWFwUHJvdmlkZXJzKGluamVjdG9yLCBmbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGluamVjdG9yLl9wcm92aWRlcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgcmVzW2ldID0gZm4oaW5qZWN0b3IuZ2V0UHJvdmlkZXJBdEluZGV4KGkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpL2luZGV4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2RpLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL21ldGFkYXRhL2RpLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQSBESSB0b2tlbiB0aGF0IHlvdSBjYW4gdXNlIHRvIGNyZWF0ZSBhIHZpcnR1YWwgW3Byb3ZpZGVyXShndWlkZS9nbG9zc2FyeSNwcm92aWRlcikKICAgICAqIHRoYXQgd2lsbCBwb3B1bGF0ZSB0aGUgYGVudHJ5Q29tcG9uZW50c2AgZmllbGQgb2YgY29tcG9uZW50cyBhbmQgTmdNb2R1bGVzCiAgICAgKiBiYXNlZCBvbiBpdHMgYHVzZVZhbHVlYCBwcm9wZXJ0eSB2YWx1ZS4KICAgICAqIEFsbCBjb21wb25lbnRzIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4gdGhlIGB1c2VWYWx1ZWAgdmFsdWUgKGVpdGhlciBkaXJlY3RseQogICAgICogb3IgaW4gYSBuZXN0ZWQgYXJyYXkgb3IgbWFwKSBhcmUgYWRkZWQgdG8gdGhlIGBlbnRyeUNvbXBvbmVudHNgIHByb3BlcnR5LgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdGhlIHJvdXRlciBjYW4gcG9wdWxhdGUgdGhlIGBlbnRyeUNvbXBvbmVudHNgCiAgICAgKiBmaWVsZCBvZiBhbiBOZ01vZHVsZSBiYXNlZCBvbiBhIHJvdXRlciBjb25maWd1cmF0aW9uIHRoYXQgcmVmZXJzCiAgICAgKiB0byBjb21wb25lbnRzLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIC8vIGhlbHBlciBmdW5jdGlvbiBpbnNpZGUgdGhlIHJvdXRlcgogICAgICogZnVuY3Rpb24gcHJvdmlkZVJvdXRlcyhyb3V0ZXMpIHsKICAgICAqICAgcmV0dXJuIFsKICAgICAqICAgICB7cHJvdmlkZTogUk9VVEVTLCB1c2VWYWx1ZTogcm91dGVzfSwKICAgICAqICAgICB7cHJvdmlkZTogQU5BTFlaRV9GT1JfRU5UUllfQ09NUE9ORU5UUywgdXNlVmFsdWU6IHJvdXRlcywgbXVsdGk6IHRydWV9CiAgICAgKiAgIF07CiAgICAgKiB9CiAgICAgKgogICAgICogLy8gdXNlciBjb2RlCiAgICAgKiBsZXQgcm91dGVzID0gWwogICAgICogICB7cGF0aDogJy9yb290JywgY29tcG9uZW50OiBSb290Q29tcH0sCiAgICAgKiAgIHtwYXRoOiAnL3RlYW1zJywgY29tcG9uZW50OiBUZWFtc0NvbXB9CiAgICAgKiBdOwogICAgICoKICAgICAqIFxATmdNb2R1bGUoewogICAgICogICBwcm92aWRlcnM6IFtwcm92aWRlUm91dGVzKHJvdXRlcyldCiAgICAgKiB9KQogICAgICogY2xhc3MgTW9kdWxlV2l0aFJvdXRlcyB7fQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBkZXByZWNhdGVkIFNpbmNlIDkuMC4wLiBXaXRoIEl2eSwgdGhpcyBwcm9wZXJ0eSBpcyBubyBsb25nZXIgbmVjZXNzYXJ5LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEFOQUxZWkVfRk9SX0VOVFJZX0NPTVBPTkVOVFMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FuYWx5emVGb3JFbnRyeUNvbXBvbmVudHMnKTsKICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIC8qKgogICAgICogQmFzZSBjbGFzcyBmb3IgcXVlcnkgbWV0YWRhdGEuCiAgICAgKgogICAgICogQHNlZSBgQ29udGVudENoaWxkcmVuYC4KICAgICAqIEBzZWUgYENvbnRlbnRDaGlsZGAuCiAgICAgKiBAc2VlIGBWaWV3Q2hpbGRyZW5gLgogICAgICogQHNlZSBgVmlld0NoaWxkYC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIFF1ZXJ5IHsKICAgIH0KICAgIGNvbnN0IMm1MCRhID0gLyoqCiAgICAgKiBAcGFyYW0gez89fSBzZWxlY3RvcgogICAgICogQHBhcmFtIHs/PX0gZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHNlbGVjdG9yLCBkYXRhID0ge30pID0+IChPYmplY3QuYXNzaWduKHsgc2VsZWN0b3IsIGZpcnN0OiBmYWxzZSwgaXNWaWV3UXVlcnk6IGZhbHNlLCBkZXNjZW5kYW50czogZmFsc2UgfSwgZGF0YSkpOwogICAgLyoqCiAgICAgKiBDb250ZW50Q2hpbGRyZW4gZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICAgICAqCiAgICAgKgogICAgICogXEBBbm5vdGF0aW9uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENvbnRlbnRDaGlsZHJlbiA9IG1ha2VQcm9wRGVjb3JhdG9yKCdDb250ZW50Q2hpbGRyZW4nLCAoybUwJGEpLCBRdWVyeSk7CiAgICBjb25zdCDJtTEkMiA9IC8qKgogICAgICogQHBhcmFtIHs/PX0gc2VsZWN0b3IKICAgICAqIEBwYXJhbSB7Pz19IGRhdGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzZWxlY3RvciwgZGF0YSA9IHt9KSA9PiAoT2JqZWN0LmFzc2lnbih7IHNlbGVjdG9yLCBmaXJzdDogdHJ1ZSwgaXNWaWV3UXVlcnk6IGZhbHNlLCBkZXNjZW5kYW50czogdHJ1ZSB9LCBkYXRhKSk7CiAgICAvKioKICAgICAqIENvbnRlbnRDaGlsZCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogICAgICoKICAgICAqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENvbnRlbnRDaGlsZCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdDb250ZW50Q2hpbGQnLCAoybUxJDIpLCBRdWVyeSk7CiAgICBjb25zdCDJtTIgPSAvKioKICAgICAqIEBwYXJhbSB7Pz19IHNlbGVjdG9yCiAgICAgKiBAcGFyYW0gez89fSBkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc2VsZWN0b3IsIGRhdGEgPSB7fSkgPT4gKE9iamVjdC5hc3NpZ24oeyBzZWxlY3RvciwgZmlyc3Q6IGZhbHNlLCBpc1ZpZXdRdWVyeTogdHJ1ZSwgZGVzY2VuZGFudHM6IHRydWUgfSwgZGF0YSkpOwogICAgLyoqCiAgICAgKiBWaWV3Q2hpbGRyZW4gZGVjb3JhdG9yIGFuZCBtZXRhZGF0YS4KICAgICAqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgVmlld0NoaWxkcmVuID0gbWFrZVByb3BEZWNvcmF0b3IoJ1ZpZXdDaGlsZHJlbicsICjJtTIpLCBRdWVyeSk7CiAgICBjb25zdCDJtTMgPSAvKioKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHNlbGVjdG9yLCBkYXRhKSA9PiAoT2JqZWN0LmFzc2lnbih7IHNlbGVjdG9yLCBmaXJzdDogdHJ1ZSwgaXNWaWV3UXVlcnk6IHRydWUsIGRlc2NlbmRhbnRzOiB0cnVlIH0sIGRhdGEpKTsKICAgIC8qKgogICAgICogVmlld0NoaWxkIGRlY29yYXRvciBhbmQgbWV0YWRhdGEuCiAgICAgKgogICAgICogXEBBbm5vdGF0aW9uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFZpZXdDaGlsZCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdWaWV3Q2hpbGQnLCAoybUzKSwgUXVlcnkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbWV0YWRhdGEvcmVzb3VyY2VfbG9hZGluZy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFVzZWQgdG8gcmVzb2x2ZSByZXNvdXJjZSBVUkxzIG9uIGBcQENvbXBvbmVudGAgd2hlbiB1c2VkIHdpdGggSklUIGNvbXBpbGF0aW9uLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKiBgYGAKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgc2VsZWN0b3I6ICdteS1jb21wJywKICAgICAqICAgdGVtcGxhdGVVcmw6ICdteS1jb21wLmh0bWwnLCAvLyBUaGlzIHJlcXVpcmVzIGFzeW5jaHJvbm91cyByZXNvbHV0aW9uCiAgICAgKiB9KQogICAgICogY2xhc3MgTXlDb21wb25lbnR7CiAgICAgKiB9CiAgICAgKgogICAgICogLy8gQ2FsbGluZyBgcmVuZGVyQ29tcG9uZW50YCB3aWxsIGZhaWwgYmVjYXVzZSBgcmVuZGVyQ29tcG9uZW50YCBpcyBhIHN5bmNocm9ub3VzIHByb2Nlc3MKICAgICAqIC8vIGFuZCBgTXlDb21wb25lbnRgJ3MgYFxAQ29tcG9uZW50LnRlbXBsYXRlVXJsYCBuZWVkcyB0byBiZSByZXNvbHZlZCBhc3luY2hyb25vdXNseS4KICAgICAqCiAgICAgKiAvLyBDYWxsaW5nIGByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKClgIHdpbGwgcmVzb2x2ZSBgXEBDb21wb25lbnQudGVtcGxhdGVVcmxgIGludG8KICAgICAqIC8vIGBcQENvbXBvbmVudC50ZW1wbGF0ZWAsIHdoaWNoIGFsbG93cyBgcmVuZGVyQ29tcG9uZW50YCB0byBwcm9jZWVkIGluIGEgc3luY2hyb25vdXMgbWFubmVyLgogICAgICoKICAgICAqIC8vIFVzZSBicm93c2VyJ3MgYGZldGNoKClgIGZ1bmN0aW9uIGFzIHRoZSBkZWZhdWx0IHJlc291cmNlIHJlc29sdXRpb24gc3RyYXRlZ3kuCiAgICAgKiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKGZldGNoKS50aGVuKCgpID0+IHsKICAgICAqICAgLy8gQWZ0ZXIgcmVzb2x1dGlvbiBhbGwgVVJMcyBoYXZlIGJlZW4gY29udmVydGVkIGludG8gYHRlbXBsYXRlYCBzdHJpbmdzLgogICAgICogICByZW5kZXJDb21wb25lbnQoTXlDb21wb25lbnQpOwogICAgICogfSk7CiAgICAgKgogICAgICogYGBgCiAgICAgKgogICAgICogTk9URTogSW4gQU9UIHRoZSByZXNvbHV0aW9uIGhhcHBlbnMgZHVyaW5nIGNvbXBpbGF0aW9uLCBhbmQgc28gdGhlcmUgc2hvdWxkIGJlIG5vIG5lZWQKICAgICAqIHRvIGNhbGwgdGhpcyBtZXRob2Qgb3V0c2lkZSBKSVQgbW9kZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJlc291cmNlUmVzb2x2ZXIgYSBmdW5jdGlvbiB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgcmV0dXJuaW5nIGEgYFByb21pc2VgIHRvIHRoZQogICAgICogY29udGVudHMgb2YgdGhlIHJlc29sdmVkIFVSTC4gQnJvd3NlcidzIGBmZXRjaCgpYCBtZXRob2QgaXMgYSBnb29kIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKHJlc291cmNlUmVzb2x2ZXIpIHsKICAgICAgICAvLyBTdG9yZSBhbGwgcHJvbWlzZXMgd2hpY2ggYXJlIGZldGNoaW5nIHRoZSByZXNvdXJjZXMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudFJlc29sdmVkID0gW107CiAgICAgICAgLy8gQ2FjaGUgc28gdGhhdCB3ZSBkb24ndCBmZXRjaCB0aGUgc2FtZSByZXNvdXJjZSBtb3JlIHRoYW4gb25jZS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXJsTWFwID0gbmV3IE1hcCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjYWNoZWRSZXNvdXJjZVJlc29sdmUodXJsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHByb21pc2UgPSB1cmxNYXAuZ2V0KHVybCk7CiAgICAgICAgICAgIGlmICghcHJvbWlzZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVzcCA9IHJlc291cmNlUmVzb2x2ZXIodXJsKTsKICAgICAgICAgICAgICAgIHVybE1hcC5zZXQodXJsLCBwcm9taXNlID0gcmVzcC50aGVuKHVud3JhcFJlc3BvbnNlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgfQogICAgICAgIGNvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50CiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29tcG9uZW50LCB0eXBlKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvbWlzZXMgPSBbXTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC50ZW1wbGF0ZVVybCkgewogICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjYWNoZWRSZXNvdXJjZVJlc29sdmUoY29tcG9uZW50LnRlbXBsYXRlVXJsKS50aGVuKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh0ZW1wbGF0ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudC50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlVXJscyA9IGNvbXBvbmVudC5zdHlsZVVybHM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gY29tcG9uZW50LnN0eWxlcyB8fCAoY29tcG9uZW50LnN0eWxlcyA9IFtdKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZU9mZnNldCA9IGNvbXBvbmVudC5zdHlsZXMubGVuZ3RoOwogICAgICAgICAgICBzdHlsZVVybHMgJiYgc3R5bGVVcmxzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlVXJsCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzdHlsZVVybCwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKCcnKTsgLy8gcHJlLWFsbG9jYXRlIGFycmF5LgogICAgICAgICAgICAgICAgcHJvbWlzZXMucHVzaChjYWNoZWRSZXNvdXJjZVJlc29sdmUoc3R5bGVVcmwpLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHN0eWxlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVzW3N0eWxlT2Zmc2V0ICsgaW5kZXhdID0gc3R5bGU7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzLnNwbGljZShzdHlsZVVybHMuaW5kZXhPZihzdHlsZVVybCksIDEpOwogICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVVybHMubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50LnN0eWxlVXJscyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZnVsbHlSZXNvbHZlZCA9IFByb21pc2UuYWxsKHByb21pc2VzKS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IGNvbXBvbmVudERlZlJlc29sdmVkKHR5cGUpKSk7CiAgICAgICAgICAgIGNvbXBvbmVudFJlc29sdmVkLnB1c2goZnVsbHlSZXNvbHZlZCk7CiAgICAgICAgfSkpOwogICAgICAgIGNsZWFyUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzUXVldWUoKTsKICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoY29tcG9uZW50UmVzb2x2ZWQpLnRoZW4oKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gdW5kZWZpbmVkKSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUgPSBuZXcgTWFwKCk7CiAgICAvLyBUcmFjayB3aGVuIGV4aXN0aW5nIMm1Y21wIGZvciBhIFR5cGUgaXMgd2FpdGluZyBvbiByZXNvdXJjZXMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBjb21wb25lbnREZWZQZW5kaW5nUmVzb2x1dGlvbiA9IG5ldyBTZXQoKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXliZVF1ZXVlUmVzb2x1dGlvbk9mQ29tcG9uZW50UmVzb3VyY2VzKHR5cGUsIG1ldGFkYXRhKSB7CiAgICAgICAgaWYgKGNvbXBvbmVudE5lZWRzUmVzb2x1dGlvbihtZXRhZGF0YSkpIHsKICAgICAgICAgICAgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUuc2V0KHR5cGUsIG1ldGFkYXRhKTsKICAgICAgICAgICAgY29tcG9uZW50RGVmUGVuZGluZ1Jlc29sdXRpb24uYWRkKHR5cGUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXBvbmVudE5lZWRzUmVzb2x1dGlvbihjb21wb25lbnQpIHsKICAgICAgICByZXR1cm4gISEoKGNvbXBvbmVudC50ZW1wbGF0ZVVybCAmJiAhY29tcG9uZW50Lmhhc093blByb3BlcnR5KCd0ZW1wbGF0ZScpKSB8fAogICAgICAgICAgICBjb21wb25lbnQuc3R5bGVVcmxzICYmIGNvbXBvbmVudC5zdHlsZVVybHMubGVuZ3RoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2xlYXJSZXNvbHV0aW9uT2ZDb21wb25lbnRSZXNvdXJjZXNRdWV1ZSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkID0gY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWU7CiAgICAgICAgY29tcG9uZW50UmVzb3VyY2VSZXNvbHV0aW9uUXVldWUgPSBuZXcgTWFwKCk7CiAgICAgICAgcmV0dXJuIG9sZDsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNDb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZUVtcHR5KCkgewogICAgICAgIHJldHVybiBjb21wb25lbnRSZXNvdXJjZVJlc29sdXRpb25RdWV1ZS5zaXplID09PSAwOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlc3BvbnNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB1bndyYXBSZXNwb25zZShyZXNwb25zZSkgewogICAgICAgIHJldHVybiB0eXBlb2YgcmVzcG9uc2UgPT0gJ3N0cmluZycgPyByZXNwb25zZSA6IHJlc3BvbnNlLnRleHQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb21wb25lbnREZWZSZXNvbHZlZCh0eXBlKSB7CiAgICAgICAgY29tcG9uZW50RGVmUGVuZGluZ1Jlc29sdXRpb24uZGVsZXRlKHR5cGUpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9zdHlsaW5nL3N0YXRpY19zdHlsaW5nLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ29tcHV0ZSB0aGUgc3RhdGljIHN0eWxpbmcgKGNsYXNzL3N0eWxlKSBmcm9tIGBUQXR0cmlidXRlc2AuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGR1cmluZyBgZmlyc3RDcmVhdGVQYXNzYCBvbmx5LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdE5vZGUgVGhlIGBUTm9kZWAgaW50byB3aGljaCB0aGUgc3R5bGluZyBpbmZvcm1hdGlvbiBzaG91bGQgYmUgbG9hZGVkLgogICAgICogQHBhcmFtIHs/fSBhdHRycyBgVEF0dHJpYnV0ZXNgIGNvbnRhaW5pbmcgdGhlIHN0eWxpbmcgaW5mb3JtYXRpb24uCiAgICAgKiBAcGFyYW0gez99IHdyaXRlVG9Ib3N0IFdoZXJlIHNob3VsZCB0aGUgcmVzdWx0aW5nIHN0YXRpYyBzdHlsZXMgYmUgd3JpdHRlbj8KICAgICAqICAgLSBgZmFsc2VgIFdyaXRlIHRvIGBUTm9kZS5zdHlsZXNXaXRob3V0SG9zdGAgLyBgVE5vZGUuY2xhc3Nlc1dpdGhvdXRIb3N0YAogICAgICogICAtIGB0cnVlYCBXcml0ZSB0byBgVE5vZGUuc3R5bGVzYCAvIGBUTm9kZS5jbGFzc2VzYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZVN0YXRpY1N0eWxpbmcodE5vZGUsIGF0dHJzLCB3cml0ZVRvSG9zdCkgewogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnRGaXJzdENyZWF0ZVBhc3MoZ2V0VFZpZXcoKSwgJ0V4cGVjdGluZyB0byBiZSBjYWxsZWQgaW4gZmlyc3QgdGVtcGxhdGUgcGFzcyBvbmx5Jyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdHlsZXMgPSB3cml0ZVRvSG9zdCA/IHROb2RlLnN0eWxlcyA6IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjbGFzc2VzID0gd3JpdGVUb0hvc3QgPyB0Tm9kZS5jbGFzc2VzIDogbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1vZGUgPSAwOwogICAgICAgIGlmIChhdHRycyAhPT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGF0dHJzW2ldOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBtb2RlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChtb2RlID09IDEgLyogQ2xhc3NlcyAqLykgewogICAgICAgICAgICAgICAgICAgIGNsYXNzZXMgPSBjb25jYXRTdHJpbmdzV2l0aFNwYWNlKGNsYXNzZXMsICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1vZGUgPT0gMiAvKiBTdHlsZXMgKi8pIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovIChhdHRyc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVzID0gY29uY2F0U3RyaW5nc1dpdGhTcGFjZShzdHlsZXMsIHN0eWxlICsgJzogJyArIHN0eWxlVmFsdWUgKyAnOycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHdyaXRlVG9Ib3N0ID8gdE5vZGUuc3R5bGVzID0gc3R5bGVzIDogdE5vZGUuc3R5bGVzV2l0aG91dEhvc3QgPSBzdHlsZXM7CiAgICAgICAgd3JpdGVUb0hvc3QgPyB0Tm9kZS5jbGFzc2VzID0gY2xhc3NlcyA6IHROb2RlLmNsYXNzZXNXaXRob3V0SG9zdCA9IGNsYXNzZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgbGV0IF9zeW1ib2xJdGVyYXRvciA9IG51bGw7CiAgICBmdW5jdGlvbiBnZXRTeW1ib2xJdGVyYXRvciQxKCkgewogICAgICAgIGlmICghX3N5bWJvbEl0ZXJhdG9yKSB7CiAgICAgICAgICAgIGNvbnN0IFN5bWJvbCA9IF9nbG9iYWxbJ1N5bWJvbCddOwogICAgICAgICAgICBpZiAoU3ltYm9sICYmIFN5bWJvbC5pdGVyYXRvcikgewogICAgICAgICAgICAgICAgX3N5bWJvbEl0ZXJhdG9yID0gU3ltYm9sLml0ZXJhdG9yOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gZXM2LXNoaW0gc3BlY2lmaWMgbG9naWMKICAgICAgICAgICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhNYXAucHJvdG90eXBlKTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwga2V5cy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IGtleXNbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2VudHJpZXMnICYmIGtleSAhPT0gJ3NpemUnICYmCiAgICAgICAgICAgICAgICAgICAgICAgIE1hcC5wcm90b3R5cGVba2V5XSA9PT0gTWFwLnByb3RvdHlwZVsnZW50cmllcyddKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9zeW1ib2xJdGVyYXRvciA9IGtleTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIF9zeW1ib2xJdGVyYXRvcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvLyBKUyBoYXMgTmFOICE9PSBOYU4KICAgIGZ1bmN0aW9uIGxvb3NlSWRlbnRpY2FsKGEsIGIpIHsKICAgICAgICByZXR1cm4gYSA9PT0gYiB8fCB0eXBlb2YgYSA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGIgPT09ICdudW1iZXInICYmIGlzTmFOKGEpICYmIGlzTmFOKGIpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uX3V0aWwudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGEKICAgICAqIEBwYXJhbSB7P30gYgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGV2TW9kZUVxdWFsJDEoYSwgYikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0xpc3RMaWtlSXRlcmFibGVBID0gaXNMaXN0TGlrZUl0ZXJhYmxlJDEoYSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzTGlzdExpa2VJdGVyYWJsZUIgPSBpc0xpc3RMaWtlSXRlcmFibGUkMShiKTsKICAgICAgICBpZiAoaXNMaXN0TGlrZUl0ZXJhYmxlQSAmJiBpc0xpc3RMaWtlSXRlcmFibGVCKSB7CiAgICAgICAgICAgIHJldHVybiBhcmVJdGVyYWJsZXNFcXVhbCQxKGEsIGIsIGRldk1vZGVFcXVhbCQxKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNBT2JqZWN0ID0gYSAmJiAodHlwZW9mIGEgPT09ICdvYmplY3QnIHx8IHR5cGVvZiBhID09PSAnZnVuY3Rpb24nKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0JPYmplY3QgPSBiICYmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIGIgPT09ICdmdW5jdGlvbicpOwogICAgICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZUEgJiYgaXNBT2JqZWN0ICYmICFpc0xpc3RMaWtlSXRlcmFibGVCICYmIGlzQk9iamVjdCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9vc2VJZGVudGljYWwoYSwgYik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSByZXN1bHQgb2YgYSB7XEBsaW5rIFBpcGV9IHRyYW5zZm9ybWF0aW9uIGhhcyBjaGFuZ2VkIGV2ZW4gdGhvdWdoIHRoZQogICAgICogcmVmZXJlbmNlIGhhcyBub3QgY2hhbmdlZC4KICAgICAqCiAgICAgKiBXcmFwcGVkIHZhbHVlcyBhcmUgdW53cmFwcGVkIGF1dG9tYXRpY2FsbHkgZHVyaW5nIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLCBhbmQgdGhlIHVud3JhcHBlZCB2YWx1ZQogICAgICogaXMgc3RvcmVkLgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBpZiAodGhpcy5fbGF0ZXN0VmFsdWUgPT09IHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUpIHsKICAgICAqICAgIHJldHVybiB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlOwogICAgICogIH0gZWxzZSB7CiAgICAgKiAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gdGhpcy5fbGF0ZXN0VmFsdWU7CiAgICAgKiAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpOyAvLyB0aGlzIHdpbGwgZm9yY2UgdXBkYXRlCiAgICAgKiAgfQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgV3JhcHBlZFZhbHVlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy53cmFwcGVkID0gdmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSB3cmFwcGVkIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyB3cmFwKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgV3JhcHBlZFZhbHVlKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB2YWx1ZSBvZiBhIHdyYXBwZWQgdmFsdWUuCiAgICAgICAgICogUmV0dXJucyB0aGUgZ2l2ZW4gYHZhbHVlYCB3aGVuIGl0IGlzIG5vdCB3cmFwcGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHVud3JhcCh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLmlzV3JhcHBlZCh2YWx1ZSkgPyB2YWx1ZS53cmFwcGVkIDogdmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiBgdmFsdWVgIGlzIGEgd3JhcHBlZCB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNXcmFwcGVkKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIFdyYXBwZWRWYWx1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0xpc3RMaWtlSXRlcmFibGUkMShvYmopIHsKICAgICAgICBpZiAoIWlzSnNPYmplY3QkMShvYmopKQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkob2JqKSB8fAogICAgICAgICAgICAoIShvYmogaW5zdGFuY2VvZiBNYXApICYmIC8vIEpTIE1hcCBhcmUgaXRlcmFibGVzIGJ1dCByZXR1cm4gZW50cmllcyBhcyBbaywgdl0KICAgICAgICAgICAgICAgIGdldFN5bWJvbEl0ZXJhdG9yJDEoKSBpbiBvYmopOyAvLyBKUyBJdGVyYWJsZSBoYXZlIGEgU3ltYm9sLml0ZXJhdG9yIHByb3AKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhCiAgICAgKiBAcGFyYW0gez99IGIKICAgICAqIEBwYXJhbSB7P30gY29tcGFyYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXJlSXRlcmFibGVzRXF1YWwkMShhLCBiLCBjb21wYXJhdG9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGl0ZXJhdG9yMSA9IGFbZ2V0U3ltYm9sSXRlcmF0b3IkMSgpXSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpdGVyYXRvcjIgPSBiW2dldFN5bWJvbEl0ZXJhdG9yJDEoKV0oKTsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW0xID0gaXRlcmF0b3IxLm5leHQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtMiA9IGl0ZXJhdG9yMi5uZXh0KCk7CiAgICAgICAgICAgIGlmIChpdGVtMS5kb25lICYmIGl0ZW0yLmRvbmUpCiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgaWYgKGl0ZW0xLmRvbmUgfHwgaXRlbTIuZG9uZSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgaWYgKCFjb21wYXJhdG9yKGl0ZW0xLnZhbHVlLCBpdGVtMi52YWx1ZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXRlcmF0ZUxpc3RMaWtlJDEob2JqLCBmbikgewogICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9iaikpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGZuKG9ialtpXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXRlcmF0b3IgPSBvYmpbZ2V0U3ltYm9sSXRlcmF0b3IkMSgpXSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpdGVtOwogICAgICAgICAgICB3aGlsZSAoISgoaXRlbSA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZSkpIHsKICAgICAgICAgICAgICAgIGZuKGl0ZW0udmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG8KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzSnNPYmplY3QkMShvKSB7CiAgICAgICAgcmV0dXJuIG8gIT09IG51bGwgJiYgKHR5cGVvZiBvID09PSAnZnVuY3Rpb24nIHx8IHR5cGVvZiBvID09PSAnb2JqZWN0Jyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2JpbmRpbmdzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIFRPRE8obWlza28pOiBjb25zaWRlciBpbmxpbmluZwogICAgLyoqCiAgICAgKiBVcGRhdGVzIGJpbmRpbmcgYW5kIHJldHVybnMgdGhlIHZhbHVlLgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpIHsKICAgICAgICByZXR1cm4gbFZpZXdbYmluZGluZ0luZGV4XSA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGJpbmRpbmcgdmFsdWUuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QmluZGluZyhsVmlldywgYmluZGluZ0luZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBiaW5kaW5nSW5kZXgpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnROb3RTYW1lKGxWaWV3W2JpbmRpbmdJbmRleF0sIE5PX0NIQU5HRSwgJ1N0b3JlZCB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLicpOwogICAgICAgIHJldHVybiBsVmlld1tiaW5kaW5nSW5kZXhdOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIGJpbmRpbmcgaWYgY2hhbmdlZCwgdGhlbiByZXR1cm5zIHdoZXRoZXIgaXQgd2FzIHVwZGF0ZWQuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBhbHNvIGNoZWNrcyB0aGUgYENoZWNrTm9DaGFuZ2VzTW9kZWAgYW5kIHRocm93cyBpZiBjaGFuZ2VzIGFyZSBtYWRlLgogICAgICogU29tZSBjaGFuZ2VzIChPYmplY3RzL2l0ZXJhYmxlcykgZHVyaW5nIGBDaGVja05vQ2hhbmdlc01vZGVgIGFyZSBleGVtcHQgdG8gY29tcGx5IHdpdGggVkUKICAgICAqIGJlaGF2aW9yLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgY3VycmVudCBgTFZpZXdgCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleCBUaGUgYmluZGluZyBpbiB0aGUgYExWaWV3YCB0byBjaGVjawogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gY2hlY2sgYWdhaW5zdCBgbFZpZXdbYmluZGluZ0luZGV4XWAKICAgICAqIEByZXR1cm4gez99IGB0cnVlYCBpZiB0aGUgYmluZGluZ3MgaGFzIGNoYW5nZWQuIChUaHJvd3MgaWYgYmluZGluZyBoYXMgY2hhbmdlZCBkdXJpbmcKICAgICAqICAgICAgICAgIGBDaGVja05vQ2hhbmdlc01vZGVgKQogICAgICovCiAgICBmdW5jdGlvbiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROb3RTYW1lKHZhbHVlLCBOT19DSEFOR0UsICdJbmNvbWluZyB2YWx1ZSBzaG91bGQgbmV2ZXIgYmUgTk9fQ0hBTkdFLicpOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnRMZXNzVGhhbihiaW5kaW5nSW5kZXgsIGxWaWV3Lmxlbmd0aCwgYFNsb3Qgc2hvdWxkIGhhdmUgYmVlbiBpbml0aWFsaXplZCB0byBOT19DSEFOR0VgKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2xkVmFsdWUgPSBsVmlld1tiaW5kaW5nSW5kZXhdOwogICAgICAgIGlmIChPYmplY3QuaXMob2xkVmFsdWUsIHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmIGdldENoZWNrTm9DaGFuZ2VzTW9kZSgpKSB7CiAgICAgICAgICAgICAgICAvLyBWaWV3IGVuZ2luZSBkaWRuJ3QgcmVwb3J0IHVuZGVmaW5lZCB2YWx1ZXMgYXMgY2hhbmdlZCBvbiB0aGUgZmlyc3QgY2hlY2tOb0NoYW5nZXMgcGFzcwogICAgICAgICAgICAgICAgLy8gKGJlZm9yZSB0aGUgY2hhbmdlIGRldGVjdGlvbiB3YXMgcnVuKS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlVG9Db21wYXJlID0gb2xkVmFsdWUgIT09IE5PX0NIQU5HRSA/IG9sZFZhbHVlIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgaWYgKCFkZXZNb2RlRXF1YWwkMShvbGRWYWx1ZVRvQ29tcGFyZSwgdmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBnZXRFeHByZXNzaW9uQ2hhbmdlZEVycm9yRGV0YWlscyhsVmlldywgYmluZGluZ0luZGV4LCBvbGRWYWx1ZVRvQ29tcGFyZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRocm93RXJyb3JJZk5vQ2hhbmdlc01vZGUob2xkVmFsdWUgPT09IE5PX0NIQU5HRSwgZGV0YWlscy5vbGRWYWx1ZSwgZGV0YWlscy5uZXdWYWx1ZSwgZGV0YWlscy5wcm9wTmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUaGVyZSB3YXMgYSBjaGFuZ2UsIGJ1dCB0aGUgYGRldk1vZGVFcXVhbGAgZGVjaWRlZCB0aGF0IHRoZSBjaGFuZ2UgaXMgZXhlbXB0IGZyb20gYW4gZXJyb3IuCiAgICAgICAgICAgICAgICAvLyBGb3IgdGhpcyByZWFzb24gd2UgZXhpdCBhcyBpZiBubyBjaGFuZ2UuIFRoZSBlYXJseSBleGl0IGlzIG5lZWRlZCB0byBwcmV2ZW50IHRoZSBjaGFuZ2VkCiAgICAgICAgICAgICAgICAvLyB2YWx1ZSB0byBiZSB3cml0dGVuIGludG8gYExWaWV3YCAoSWYgd2Ugd291bGQgd3JpdGUgdGhlIG5ldyB2YWx1ZSB0aGF0IHdlIHdvdWxkIG5vdCBzZWUgaXQKICAgICAgICAgICAgICAgIC8vIGFzIGNoYW5nZSBvbiBuZXh0IENELikKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsVmlld1tiaW5kaW5nSW5kZXhdID0gdmFsdWU7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyAyIGJpbmRpbmdzIGlmIGNoYW5nZWQsIHRoZW4gcmV0dXJucyB3aGV0aGVyIGVpdGhlciB3YXMgdXBkYXRlZC4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4CiAgICAgKiBAcGFyYW0gez99IGV4cDEKICAgICAqIEBwYXJhbSB7P30gZXhwMgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSk7CiAgICAgICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAxLCBleHAyKSB8fCBkaWZmZXJlbnQ7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZXMgMyBiaW5kaW5ncyBpZiBjaGFuZ2VkLCB0aGVuIHJldHVybnMgd2hldGhlciBhbnkgd2FzIHVwZGF0ZWQuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7P30gZXhwMwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIpOwogICAgICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4ICsgMiwgZXhwMykgfHwgZGlmZmVyZW50OwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGVzIDQgYmluZGluZ3MgaWYgY2hhbmdlZCwgdGhlbiByZXR1cm5zIHdoZXRoZXIgYW55IHdhcyB1cGRhdGVkLgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXgKICAgICAqIEBwYXJhbSB7P30gZXhwMQogICAgICogQHBhcmFtIHs/fSBleHAyCiAgICAgKiBAcGFyYW0gez99IGV4cDMKICAgICAqIEBwYXJhbSB7P30gZXhwNAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIpOwogICAgICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCArIDIsIGV4cDMsIGV4cDQpIHx8IGRpZmZlcmVudDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2F0dHJpYnV0ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFVwZGF0ZXMgdGhlIHZhbHVlIG9mIG9yIHJlbW92ZXMgYSBib3VuZCBhdHRyaWJ1dGUgb24gYW4gRWxlbWVudC4KICAgICAqCiAgICAgKiBVc2VkIGluIHRoZSBjYXNlIG9mIGBbYXR0ci50aXRsZV09InZhbHVlImAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gbmFtZSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIHZhbHVlIFRoZSBhdHRyaWJ1dGUgaXMgcmVtb3ZlZCB3aGVuIHZhbHVlIGlzIGBudWxsYCBvciBgdW5kZWZpbmVkYC4KICAgICAqICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIHRoZSBhdHRyaWJ1dGUgdmFsdWUgaXMgc2V0IHRvIHRoZSBzdHJpbmdpZmllZCB2YWx1ZS4KICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZSBPcHRpb25hbCBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gc2V0dGluZyB0aGUgYXR0cmlidXRlLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGUobmFtZSwgdmFsdWUsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gbmV4dEJpbmRpbmdJbmRleCgpOwogICAgICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIG5hbWUsIHZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCAnYXR0ci4nICsgbmFtZSwgYmluZGluZ0luZGV4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9pbnRlcnBvbGF0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ3JlYXRlIGludGVycG9sYXRpb24gYmluZGluZ3Mgd2l0aCBhIHZhcmlhYmxlIG51bWJlciBvZiBleHByZXNzaW9ucy4KICAgICAqCiAgICAgKiBJZiB0aGVyZSBhcmUgMSB0byA4IGV4cHJlc3Npb25zIGBpbnRlcnBvbGF0aW9uMSgpYCB0byBgaW50ZXJwb2xhdGlvbjgoKWAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KICAgICAqIFRob3NlIGFyZSBmYXN0ZXIgYmVjYXVzZSB0aGVyZSBpcyBubyBuZWVkIHRvIGNyZWF0ZSBhbiBhcnJheSBvZiBleHByZXNzaW9ucyBhbmQgaXRlcmF0ZSBvdmVyIGl0LgogICAgICoKICAgICAqIGB2YWx1ZXNgOgogICAgICogLSBoYXMgc3RhdGljIHRleHQgYXQgZXZlbiBpbmRleGVzLAogICAgICogLSBoYXMgZXZhbHVhdGVkIGV4cHJlc3Npb25zIGF0IG9kZCBpbmRleGVzLgogICAgICoKICAgICAqIFJldHVybnMgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgd2hlbiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBjaGFuZ2VzLCBgTk9fQ0hBTkdFYCBvdGhlcndpc2UuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHZhbHVlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGlvblYobFZpZXcsIHZhbHVlcykgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMZXNzVGhhbigyLCB2YWx1ZXMubGVuZ3RoLCAnc2hvdWxkIGhhdmUgYXQgbGVhc3QgMyB2YWx1ZXMnKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RXF1YWwodmFsdWVzLmxlbmd0aCAlIDIsIDEsICdzaG91bGQgaGF2ZSBhbiBvZGQgbnVtYmVyIG9mIHZhbHVlcycpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaXNCaW5kaW5nVXBkYXRlZCA9IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ0luZGV4KCk7CiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgLy8gQ2hlY2sgaWYgYmluZGluZ3MgKG9kZCBpbmRleGVzKSBoYXZlIGNoYW5nZWQKICAgICAgICAgICAgaXNCaW5kaW5nVXBkYXRlZCA9IGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgrKywgdmFsdWVzW2ldKSB8fCBpc0JpbmRpbmdVcGRhdGVkOwogICAgICAgIH0KICAgICAgICBzZXRCaW5kaW5nSW5kZXgoYmluZGluZ0luZGV4KTsKICAgICAgICBpZiAoIWlzQmluZGluZ1VwZGF0ZWQpIHsKICAgICAgICAgICAgcmV0dXJuIE5PX0NIQU5HRTsKICAgICAgICB9CiAgICAgICAgLy8gQnVpbGQgdGhlIHVwZGF0ZWQgY29udGVudAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY29udGVudCA9IHZhbHVlc1swXTsKICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICBjb250ZW50ICs9IHJlbmRlclN0cmluZ2lmeSh2YWx1ZXNbaV0pICsgdmFsdWVzW2kgKyAxXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggMSBleHByZXNzaW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IHN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIHZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IHN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBuZXh0QmluZGluZ0luZGV4KCksIHYwKTsKICAgICAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAyIGV4cHJlc3Npb25zLgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBwcmVmaXgKICAgICAqIEBwYXJhbSB7P30gdjAKICAgICAqIEBwYXJhbSB7P30gaTAKICAgICAqIEBwYXJhbSB7P30gdjEKICAgICAqIEBwYXJhbSB7P30gc3VmZml4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ0luZGV4KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkMihsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEpOwogICAgICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCgyKTsKICAgICAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIHN1ZmZpeCA6IE5PX0NIQU5HRTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBpbnRlcnBvbGF0aW9uIGJpbmRpbmcgd2l0aCAzIGV4cHJlc3Npb25zLgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBwcmVmaXgKICAgICAqIEBwYXJhbSB7P30gdjAKICAgICAqIEBwYXJhbSB7P30gaTAKICAgICAqIEBwYXJhbSB7P30gdjEKICAgICAqIEBwYXJhbSB7P30gaTEKICAgICAqIEBwYXJhbSB7P30gdjIKICAgICAqIEBwYXJhbSB7P30gc3VmZml4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSwgdjIpOwogICAgICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCgzKTsKICAgICAgICByZXR1cm4gZGlmZmVyZW50ID8KICAgICAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIHN1ZmZpeCA6CiAgICAgICAgICAgIE5PX0NIQU5HRTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDQgZXhwcmVzc2lvbnMuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ0luZGV4KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICAgICAgaW5jcmVtZW50QmluZGluZ0luZGV4KDQpOwogICAgICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgc3VmZml4IDoKICAgICAgICAgICAgTk9fQ0hBTkdFOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDUgZXhwcmVzc2lvbnMuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBpMwogICAgICogQHBhcmFtIHs/fSB2NAogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICAgICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIHY0KSB8fCBkaWZmZXJlbnQ7CiAgICAgICAgaW5jcmVtZW50QmluZGluZ0luZGV4KDUpOwogICAgICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgaTMgKyByZW5kZXJTdHJpbmdpZnkodjQpICsgc3VmZml4IDoKICAgICAgICAgICAgTk9fQ0hBTkdFOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDYgZXhwcmVzc2lvbnMuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBpMwogICAgICogQHBhcmFtIHs/fSB2NAogICAgICogQHBhcmFtIHs/fSBpNAogICAgICogQHBhcmFtIHs/fSB2NQogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVycG9sYXRpb242KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdJbmRleCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXgsIHYwLCB2MSwgdjIsIHYzKTsKICAgICAgICBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDIobFZpZXcsIGJpbmRpbmdJbmRleCArIDQsIHY0LCB2NSkgfHwgZGlmZmVyZW50OwogICAgICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg2KTsKICAgICAgICByZXR1cm4gZGlmZmVyZW50ID8KICAgICAgICAgICAgcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsgcmVuZGVyU3RyaW5naWZ5KHYyKSArIGkyICsKICAgICAgICAgICAgICAgIHJlbmRlclN0cmluZ2lmeSh2MykgKyBpMyArIHJlbmRlclN0cmluZ2lmeSh2NCkgKyBpNCArIHJlbmRlclN0cmluZ2lmeSh2NSkgKyBzdWZmaXggOgogICAgICAgICAgICBOT19DSEFOR0U7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gaW50ZXJwb2xhdGlvbiBiaW5kaW5nIHdpdGggNyBleHByZXNzaW9ucy4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gcHJlZml4CiAgICAgKiBAcGFyYW0gez99IHYwCiAgICAgKiBAcGFyYW0gez99IGkwCiAgICAgKiBAcGFyYW0gez99IHYxCiAgICAgKiBAcGFyYW0gez99IGkxCiAgICAgKiBAcGFyYW0gez99IHYyCiAgICAgKiBAcGFyYW0gez99IGkyCiAgICAgKiBAcGFyYW0gez99IHYzCiAgICAgKiBAcGFyYW0gez99IGkzCiAgICAgKiBAcGFyYW0gez99IHY0CiAgICAgKiBAcGFyYW0gez99IGk0CiAgICAgKiBAcGFyYW0gez99IHY1CiAgICAgKiBAcGFyYW0gez99IGk1CiAgICAgKiBAcGFyYW0gez99IHY2CiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICAgICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCwgdjUsIHY2KSB8fCBkaWZmZXJlbnQ7CiAgICAgICAgaW5jcmVtZW50QmluZGluZ0luZGV4KDcpOwogICAgICAgIHJldHVybiBkaWZmZXJlbnQgPyBwcmVmaXggKyByZW5kZXJTdHJpbmdpZnkodjApICsgaTAgKyByZW5kZXJTdHJpbmdpZnkodjEpICsgaTEgKwogICAgICAgICAgICByZW5kZXJTdHJpbmdpZnkodjIpICsgaTIgKyByZW5kZXJTdHJpbmdpZnkodjMpICsgaTMgKyByZW5kZXJTdHJpbmdpZnkodjQpICsgaTQgKwogICAgICAgICAgICByZW5kZXJTdHJpbmdpZnkodjUpICsgaTUgKyByZW5kZXJTdHJpbmdpZnkodjYpICsgc3VmZml4IDoKICAgICAgICAgICAgTk9fQ0hBTkdFOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGludGVycG9sYXRpb24gYmluZGluZyB3aXRoIDggZXhwcmVzc2lvbnMuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBpMwogICAgICogQHBhcmFtIHs/fSB2NAogICAgICogQHBhcmFtIHs/fSBpNAogICAgICogQHBhcmFtIHs/fSB2NQogICAgICogQHBhcmFtIHs/fSBpNQogICAgICogQHBhcmFtIHs/fSB2NgogICAgICogQHBhcmFtIHs/fSBpNgogICAgICogQHBhcmFtIHs/fSB2NwogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludGVycG9sYXRpb244KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCB2MCwgdjEsIHYyLCB2Myk7CiAgICAgICAgZGlmZmVyZW50ID0gYmluZGluZ1VwZGF0ZWQ0KGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB2NCwgdjUsIHY2LCB2NykgfHwgZGlmZmVyZW50OwogICAgICAgIGluY3JlbWVudEJpbmRpbmdJbmRleCg4KTsKICAgICAgICByZXR1cm4gZGlmZmVyZW50ID8gcHJlZml4ICsgcmVuZGVyU3RyaW5naWZ5KHYwKSArIGkwICsgcmVuZGVyU3RyaW5naWZ5KHYxKSArIGkxICsKICAgICAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHYyKSArIGkyICsgcmVuZGVyU3RyaW5naWZ5KHYzKSArIGkzICsgcmVuZGVyU3RyaW5naWZ5KHY0KSArIGk0ICsKICAgICAgICAgICAgcmVuZGVyU3RyaW5naWZ5KHY1KSArIGk1ICsgcmVuZGVyU3RyaW5naWZ5KHY2KSArIGk2ICsgcmVuZGVyU3RyaW5naWZ5KHY3KSArIHN1ZmZpeCA6CiAgICAgICAgICAgIE5PX0NIQU5HRTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2F0dHJpYnV0ZV9pbnRlcnBvbGF0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTEoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMShhdHRyTmFtZSwgcHJlZml4LCB2MCwgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YShnZXRUVmlldygpLmRhdGEsIHROb2RlLCAnYXR0ci4nICsgYXR0ck5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMSwgcHJlZml4LCBzdWZmaXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgYXR0cmlidXRlIG9uIGFuIGVsZW1lbnQgd2l0aCAyIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgYXR0ci50aXRsZT0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyKCd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMihhdHRyTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDIsIHByZWZpeCwgaTAsIHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAzIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUzKAogICAgICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTMoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YShnZXRUVmlldygpLmRhdGEsIHROb2RlLCAnYXR0ci4nICsgYXR0ck5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMywgcHJlZml4LCBpMCwgaTEsIHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUzOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA0IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNCgKICAgICAqICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTQoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDQsIHByZWZpeCwgaTAsIGkxLCBpMiwgc3VmZml4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTQ7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IGF0dHIudGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNSgKICAgICAqICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNShhdHRyTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDUsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU1OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA2IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU2KAogICAgICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gYXR0ck5hbWUgVGhlIG5hbWUgb2YgdGhlIGF0dHJpYnV0ZSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTYoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICAgICAgZWxlbWVudEF0dHJpYnV0ZUludGVybmFsKHROb2RlLCBsVmlldywgYXR0ck5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YShnZXRUVmlldygpLmRhdGEsIHROb2RlLCAnYXR0ci4nICsgYXR0ck5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gNiwgcHJlZml4LCBpMCwgaTEsIGkyLCBpMywgaTQsIHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU2OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDcgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBhdHRyLnRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNygKICAgICAqICAgICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTcoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCwgc2FuaXRpemVyLCBuYW1lc3BhY2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgc2FuaXRpemVyLCBuYW1lc3BhY2UpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDcsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgc3VmZml4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTc7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGF0dHJpYnV0ZSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IGF0dHIudGl0bGU9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlOCgKICAgICAqICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBhdHRyTmFtZSBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHVwZGF0ZQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTUgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjYgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTgoYXR0ck5hbWUsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4LCBzYW5pdGl6ZXIsIG5hbWVzcGFjZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgICAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgICAgICBlbGVtZW50QXR0cmlidXRlSW50ZXJuYWwodE5vZGUsIGxWaWV3LCBhdHRyTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIHNhbml0aXplciwgbmFtZXNwYWNlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKGdldFRWaWV3KCkuZGF0YSwgdE5vZGUsICdhdHRyLicgKyBhdHRyTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA4LCBwcmVmaXgsIGkwLCBpMSwgaTIsIGkzLCBpNCwgaTUsIGk2LCBzdWZmaXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtWF0dHJpYnV0ZUludGVycG9sYXRlODsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudCB3aXRoIDkgb3IgbW9yZSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYKICAgICAqICB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19LXt7djd9fS17e3Y4fX0te3t2OX19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZVYoCiAgICAgKiAgJ3RpdGxlJywgWydwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJy0nLCB2OSwKICAgICAqICAnc3VmZml4J10pOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGF0dHJOYW1lIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gdXBkYXRlLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICAgICAqIGEgc3RyaW5nIHByZWZpeCBhbmQgZW5kaW5nIHdpdGggYSBzdHJpbmcgc3VmZml4LgogICAgICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGVWKGF0dHJOYW1lLCB2YWx1ZXMsIHNhbml0aXplciwgbmFtZXNwYWNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvblYobFZpZXcsIHZhbHVlcyk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRBdHRyaWJ1dGVJbnRlcm5hbCh0Tm9kZSwgbFZpZXcsIGF0dHJOYW1lLCBpbnRlcnBvbGF0ZWQsIHNhbml0aXplciwgbmFtZXNwYWNlKTsKICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbkluQmV0d2VlbiA9IFt2YWx1ZXNbMF1dOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uSW5CZXR3ZWVuLnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEoZ2V0VFZpZXcoKS5kYXRhLCB0Tm9kZSwgJ2F0dHIuJyArIGF0dHJOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIGludGVycG9sYXRpb25JbkJldHdlZW4ubGVuZ3RoICsgMSwgLi4uaW50ZXJwb2xhdGlvbkluQmV0d2Vlbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZVY7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9jaGFuZ2VfZGV0ZWN0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogU3luY2hyb25vdXNseSBwZXJmb3JtIGNoYW5nZSBkZXRlY3Rpb24gb24gYSBjb21wb25lbnQgKGFuZCBwb3NzaWJseSBpdHMgc3ViLWNvbXBvbmVudHMpLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gdHJpZ2dlcnMgY2hhbmdlIGRldGVjdGlvbiBpbiBhIHN5bmNocm9ub3VzIHdheSBvbiBhIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudCBUaGUgY29tcG9uZW50IHdoaWNoIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHNob3VsZCBiZSBwZXJmb3JtZWQgb24uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBkZXRlY3RDaGFuZ2VzKGNvbXBvbmVudCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3ID0gZ2V0Q29tcG9uZW50Vmlld0J5SW5zdGFuY2UoY29tcG9uZW50KTsKICAgICAgICBkZXRlY3RDaGFuZ2VzSW50ZXJuYWwodmlld1tUVklFV10sIHZpZXcsIGNvbXBvbmVudCk7CiAgICB9CiAgICAvKioKICAgICAqIE1hcmtzIHRoZSBjb21wb25lbnQgYXMgZGlydHkgKG5lZWRpbmcgY2hhbmdlIGRldGVjdGlvbikuIE1hcmtpbmcgYSBjb21wb25lbnQgZGlydHkgd2lsbAogICAgICogc2NoZWR1bGUgYSBjaGFuZ2UgZGV0ZWN0aW9uIG9uIGl0IGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KICAgICAqCiAgICAgKiBNYXJraW5nIGFuIGFscmVhZHkgZGlydHkgY29tcG9uZW50IGFzIGRpcnR5IHdvbid0IGRvIGFueXRoaW5nLiBPbmx5IG9uZSBvdXRzdGFuZGluZyBjaGFuZ2UKICAgICAqIGRldGVjdGlvbiBjYW4gYmUgc2NoZWR1bGVkIHBlciBjb21wb25lbnQgdHJlZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudCBDb21wb25lbnQgdG8gbWFyayBhcyBkaXJ0eS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcmtEaXJ0eShjb21wb25lbnQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjb21wb25lbnQsICdjb21wb25lbnQnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobWFya1ZpZXdEaXJ0eShnZXRDb21wb25lbnRWaWV3QnlJbnN0YW5jZShjb21wb25lbnQpKSkpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHJvb3RWaWV3W0NPTlRFWFRdLCAncm9vdENvbnRleHQgc2hvdWxkIGJlIGRlZmluZWQnKTsKICAgICAgICBzY2hlZHVsZVRpY2soKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RWaWV3W0NPTlRFWFRdKSksIDEgLyogRGV0ZWN0Q2hhbmdlcyAqLyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy90ZW1wbGF0ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVGbgogICAgICogQHBhcmFtIHs/fSBkZWNscwogICAgICogQHBhcmFtIHs/fSB2YXJzCiAgICAgKiBAcGFyYW0gez89fSB0YWdOYW1lCiAgICAgKiBAcGFyYW0gez89fSBhdHRyc0luZGV4CiAgICAgKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdGVtcGxhdGVGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgdGVtcGxhdGVGbiwgZGVjbHMsIHZhcnMsIHRhZ05hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0Vmlldyk7CiAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5maXJzdENyZWF0ZVBhc3MrKzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXdDb25zdHMgPSB0Vmlldy5jb25zdHM7CiAgICAgICAgLy8gVE9ETyhwayk6IHJlZmFjdG9yIGdldE9yQ3JlYXRlVE5vZGUgdG8gaGF2ZSB0aGUgImNyZWF0ZSIgb25seSB2ZXJzaW9uCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDAgLyogQ29udGFpbmVyICovLCB0YWdOYW1lIHx8IG51bGwsIGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBhdHRyc0luZGV4KSk7CiAgICAgICAgcmVzb2x2ZURpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgZ2V0Q29uc3RhbnQodFZpZXdDb25zdHMsIGxvY2FsUmVmc0luZGV4KSk7CiAgICAgICAgcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgdE5vZGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbWJlZGRlZFRWaWV3ID0gdE5vZGUudFZpZXdzID0gY3JlYXRlVFZpZXcoMiAvKiBFbWJlZGRlZCAqLywgLTEsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCB0Vmlldy5kaXJlY3RpdmVSZWdpc3RyeSwgdFZpZXcucGlwZVJlZ2lzdHJ5LCBudWxsLCB0Vmlldy5zY2hlbWFzLCB0Vmlld0NvbnN0cyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVtYmVkZGVkVFZpZXdOb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZVROb2RlKHRWaWV3LCBudWxsLCAyIC8qIFZpZXcgKi8sIC0xLCBudWxsLCBudWxsKSkpOwogICAgICAgIGVtYmVkZGVkVFZpZXdOb2RlLmluamVjdG9ySW5kZXggPSB0Tm9kZS5pbmplY3RvckluZGV4OwogICAgICAgIGVtYmVkZGVkVFZpZXcubm9kZSA9IGVtYmVkZGVkVFZpZXdOb2RlOwogICAgICAgIGlmICh0Vmlldy5xdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHRWaWV3LnF1ZXJpZXMudGVtcGxhdGUodFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgZW1iZWRkZWRUVmlldy5xdWVyaWVzID0gdFZpZXcucXVlcmllcy5lbWJlZGRlZFRWaWV3KHROb2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHROb2RlOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIExDb250YWluZXIgZm9yIGFuIG5nLXRlbXBsYXRlIChkeW5hbWljYWxseS1pbnNlcnRlZCB2aWV3KSwgZS5nLgogICAgICoKICAgICAqIDxuZy10ZW1wbGF0ZSAjZm9vPgogICAgICogICAgPGRpdj48L2Rpdj4KICAgICAqIDwvbmctdGVtcGxhdGU+CiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgY29udGFpbmVyIGluIHRoZSBkYXRhIGFycmF5CiAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlRm4gSW5saW5lIHRlbXBsYXRlCiAgICAgKiBAcGFyYW0gez99IGRlY2xzIFRoZSBudW1iZXIgb2Ygbm9kZXMsIGxvY2FsIHJlZnMsIGFuZCBwaXBlcyBmb3IgdGhpcyB0ZW1wbGF0ZQogICAgICogQHBhcmFtIHs/fSB2YXJzIFRoZSBudW1iZXIgb2YgYmluZGluZ3MgZm9yIHRoaXMgdGVtcGxhdGUKICAgICAqIEBwYXJhbSB7Pz19IHRhZ05hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbnRhaW5lciBlbGVtZW50LCBpZiBhcHBsaWNhYmxlCiAgICAgKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRlbXBsYXRlIGF0dHJpYnV0ZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxSZWZzSW5kZXgKICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmRXh0cmFjdG9yIEEgZnVuY3Rpb24gd2hpY2ggZXh0cmFjdHMgbG9jYWwtcmVmcyB2YWx1ZXMgZnJvbSB0aGUgdGVtcGxhdGUuCiAgICAgKiAgICAgICAgRGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZWxlbWVudCBhc3NvY2lhdGVkIHdpdGggdGhlIGxvY2FsLXJlZi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1dGVtcGxhdGUoaW5kZXgsIHRlbXBsYXRlRm4sIGRlY2xzLCB2YXJzLCB0YWdOYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCwgbG9jYWxSZWZFeHRyYWN0b3IpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSBpbmRleCArIEhFQURFUl9PRkZTRVQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gdFZpZXcuZmlyc3RDcmVhdGVQYXNzID8KICAgICAgICAgICAgdGVtcGxhdGVGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgdGVtcGxhdGVGbiwgZGVjbHMsIHZhcnMsIHRhZ05hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSA6CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHROb2RlLCBmYWxzZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbW1lbnQgPSBsVmlld1tSRU5ERVJFUl0uY3JlYXRlQ29tbWVudChuZ0Rldk1vZGUgPyAnY29udGFpbmVyJyA6ICcnKTsKICAgICAgICBhcHBlbmRDaGlsZCh0VmlldywgbFZpZXcsIGNvbW1lbnQsIHROb2RlKTsKICAgICAgICBhdHRhY2hQYXRjaERhdGEoY29tbWVudCwgbFZpZXcpOwogICAgICAgIGFkZFRvVmlld1RyZWUobFZpZXcsIGxWaWV3W2FkanVzdGVkSW5kZXhdID0gY3JlYXRlTENvbnRhaW5lcihjb21tZW50LCBsVmlldywgY29tbWVudCwgdE5vZGUpKTsKICAgICAgICBpZiAoaXNEaXJlY3RpdmVIb3N0KHROb2RlKSkgewogICAgICAgICAgICBjcmVhdGVEaXJlY3RpdmVzSW5zdGFuY2VzKHRWaWV3LCBsVmlldywgdE5vZGUpOwogICAgICAgIH0KICAgICAgICBpZiAobG9jYWxSZWZzSW5kZXggIT0gbnVsbCkgewogICAgICAgICAgICBzYXZlUmVzb2x2ZWRMb2NhbHNJbkRhdGEobFZpZXcsIHROb2RlLCBsb2NhbFJlZkV4dHJhY3Rvcik7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvc3RvcmFnZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFN0b3JlIGEgdmFsdWUgaW4gdGhlIGBkYXRhYCBhdCBhIGdpdmVuIGBpbmRleGAuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3RvcmUodFZpZXcsIGxWaWV3LCBpbmRleCwgdmFsdWUpIHsKICAgICAgICAvLyBXZSBkb24ndCBzdG9yZSBhbnkgc3RhdGljIGRhdGEgZm9yIGxvY2FsIHZhcmlhYmxlcywgc28gdGhlIGZpcnN0IHRpbWUKICAgICAgICAvLyB3ZSBzZWUgdGhlIHRlbXBsYXRlLCB3ZSBzaG91bGQgc3RvcmUgYXMgbnVsbCB0byBhdm9pZCBhIHNwYXJzZSBhcnJheQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgICAgIGlmIChhZGp1c3RlZEluZGV4ID49IHRWaWV3LmRhdGEubGVuZ3RoKSB7CiAgICAgICAgICAgIHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0gPSBudWxsOwogICAgICAgICAgICB0Vmlldy5ibHVlcHJpbnRbYWRqdXN0ZWRJbmRleF0gPSBudWxsOwogICAgICAgIH0KICAgICAgICBsVmlld1thZGp1c3RlZEluZGV4XSA9IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgYSBsb2NhbCByZWZlcmVuY2UgZnJvbSB0aGUgY3VycmVudCBjb250ZXh0Vmlld0RhdGEuCiAgICAgKgogICAgICogSWYgdGhlIHJlZmVyZW5jZSB0byByZXRyaWV2ZSBpcyBpbiBhIHBhcmVudCB2aWV3LCB0aGlzIGluc3RydWN0aW9uIGlzIHVzZWQgaW4gY29uanVuY3Rpb24KICAgICAqIHdpdGggYSBuZXh0Q29udGV4dCgpIGNhbGwsIHdoaWNoIHdhbGtzIHVwIHRoZSB0cmVlIGFuZCB1cGRhdGVzIHRoZSBjb250ZXh0Vmlld0RhdGEgaW5zdGFuY2UuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGxvY2FsIHJlZiBpbiBjb250ZXh0Vmlld0RhdGEuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXJlZmVyZW5jZShpbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250ZXh0TFZpZXcgPSBnZXRDb250ZXh0TFZpZXcoKTsKICAgICAgICByZXR1cm4gbG9hZChjb250ZXh0TFZpZXcsIGluZGV4KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2RpLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1ZGlyZWN0aXZlSW5qZWN0KHRva2VuLCBmbGFncyA9IEluamVjdEZsYWdzLkRlZmF1bHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8vIEZhbGwgYmFjayB0byBpbmplY3QoKSBpZiB2aWV3IGhhc24ndCBiZWVuIGNyZWF0ZWQuIFRoaXMgc2l0dWF0aW9uIGNhbiBoYXBwZW4gaW4gdGVzdHMKICAgICAgICAvLyBpZiBpbmplY3QgdXRpbGl0aWVzIGFyZSB1c2VkIGJlZm9yZSBib290c3RyYXBwaW5nLgogICAgICAgIGlmIChsVmlldyA9PSBudWxsKQogICAgICAgICAgICByZXR1cm4gybXJtWluamVjdCh0b2tlbiwgZmxhZ3MpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgIHJldHVybiBnZXRPckNyZWF0ZUluamVjdGFibGUoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksIGxWaWV3LCByZXNvbHZlRm9yd2FyZFJlZih0b2tlbiksIGZsYWdzKTsKICAgIH0KICAgIC8qKgogICAgICogRmFjYWRlIGZvciB0aGUgYXR0cmlidXRlIGluamVjdGlvbiBmcm9tIERJLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBhdHRyTmFtZVRvSW5qZWN0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1aW5qZWN0QXR0cmlidXRlKGF0dHJOYW1lVG9JbmplY3QpIHsKICAgICAgICByZXR1cm4gaW5qZWN0QXR0cmlidXRlSW1wbChnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKSwgYXR0ck5hbWVUb0luamVjdCk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgYSBmYWN0b3J5IGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGZvciBhCiAgICAgKiBwYXJ0aWN1bGFyIGNsYXNzLgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWxsb3dzIHRoZSBhY3R1YWwgZXJyb3IgbWVzc2FnZSB0byBiZSBvcHRpbWl6ZWQgYXdheSB3aGVuIG5nRGV2TW9kZSBpcyB0dXJuZWQKICAgICAqIG9mZiwgc2F2aW5nIGJ5dGVzIG9mIGdlbmVyYXRlZCBjb2RlIHdoaWxlIHN0aWxsIHByb3ZpZGluZyBhIGdvb2QgZXhwZXJpZW5jZSBpbiBkZXYgbW9kZS4KICAgICAqCiAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY2xhc3MgaXMgbm90IG1lbnRpb25lZCBoZXJlLCBidXQgd2lsbCBiZSBpbiB0aGUgZ2VuZXJhdGVkIGZhY3RvcnkgZnVuY3Rpb24gbmFtZQogICAgICogYW5kIHRodXMgaW4gdGhlIHN0YWNrIHRyYWNlLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWludmFsaWRGYWN0b3J5KCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtc2cgPSBuZ0Rldk1vZGUgPyBgVGhpcyBjb25zdHJ1Y3RvciB3YXMgbm90IGNvbXBhdGlibGUgd2l0aCBEZXBlbmRlbmN5IEluamVjdGlvbi5gIDogJ2ludmFsaWQnOwogICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvcHJvcGVydHkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBVcGRhdGUgYSBwcm9wZXJ0eSBvbiBhIHNlbGVjdGVkIGVsZW1lbnQuCiAgICAgKgogICAgICogT3BlcmF0ZXMgb24gdGhlIGVsZW1lbnQgc2VsZWN0ZWQgYnkgaW5kZXggdmlhIHRoZSB7XEBsaW5rIHNlbGVjdH0gaW5zdHJ1Y3Rpb24uCiAgICAgKgogICAgICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICAgICAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAgICAgKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIE5hbWUgb2YgcHJvcGVydHkuIEJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gRE9NLCB0aGlzIGlzIG5vdCBzdWJqZWN0IHRvCiAgICAgKiAgICAgICAgcmVuYW1pbmcgYXMgcGFydCBvZiBtaW5pZmljYXRpb24uCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIE5ldyB2YWx1ZSB0byB3cml0ZS4KICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICAgICAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogICAgICogKGUuZy4gYHByb3BlcnR5KCduYW1lJywgY3R4Lm5hbWUpKCd0aXRsZScsIGN0eC50aXRsZSlgKQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtXByb3BlcnR5KHByb3BOYW1lLCB2YWx1ZSwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gbmV4dEJpbmRpbmdJbmRleCgpOwogICAgICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCB2YWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXByb3BlcnR5OwogICAgfQogICAgLyoqCiAgICAgKiBHaXZlbiBgPGRpdiBzdHlsZT0iLi4uIiBteS1kaXI+YCBhbmQgYE15RGlyYCB3aXRoIGBcQElucHV0KCdzdHlsZScpYCB3ZSBuZWVkIHRvIHdyaXRlIHRvCiAgICAgKiBkaXJlY3RpdmUgaW5wdXQuCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IHROb2RlCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0RGlyZWN0aXZlSW5wdXRzV2hpY2hTaGFkb3dzU3R5bGluZyh0VmlldywgdE5vZGUsIGxWaWV3LCB2YWx1ZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlucHV0cyA9ICgvKiogQHR5cGUgez99ICovICh0Tm9kZS5pbnB1dHMpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvcGVydHkgPSBpc0NsYXNzQmFzZWQgPyAnY2xhc3MnIDogJ3N0eWxlJzsKICAgICAgICAvLyBXZSBzdXBwb3J0IGJvdGggJ2NsYXNzJyBhbmQgYGNsYXNzTmFtZWAgaGVuY2UgdGhlIGZhbGxiYWNrLgogICAgICAgIHNldElucHV0c0ZvclByb3BlcnR5KHRWaWV3LCBsVmlldywgaW5wdXRzW3Byb3BlcnR5XSwgcHJvcGVydHksIHZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2VsZW1lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IG5hdGl2ZQogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez89fSBhdHRyc0luZGV4CiAgICAgKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZWxlbWVudFN0YXJ0Rmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIG5hdGl2ZSwgbmFtZSwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3KTsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Vmlld0NvbnN0cyA9IHRWaWV3LmNvbnN0czsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0cnMgPSBnZXRDb25zdGFudCh0Vmlld0NvbnN0cywgYXR0cnNJbmRleCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDMgLyogRWxlbWVudCAqLywgbmFtZSwgYXR0cnMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBoYXNEaXJlY3RpdmVzID0gcmVzb2x2ZURpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgZ2V0Q29uc3RhbnQodFZpZXdDb25zdHMsIGxvY2FsUmVmc0luZGV4KSk7CiAgICAgICAgbmdEZXZNb2RlICYmIHdhcm5BYm91dFVua25vd25FbGVtZW50KHRWaWV3LCBsVmlldywgbmF0aXZlLCB0Tm9kZSwgaGFzRGlyZWN0aXZlcyk7CiAgICAgICAgaWYgKHROb2RlLmF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGNvbXB1dGVTdGF0aWNTdHlsaW5nKHROb2RlLCB0Tm9kZS5hdHRycywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICBpZiAodE5vZGUubWVyZ2VkQXR0cnMgIT09IG51bGwpIHsKICAgICAgICAgICAgY29tcHV0ZVN0YXRpY1N0eWxpbmcodE5vZGUsIHROb2RlLm1lcmdlZEF0dHJzLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgaWYgKHRWaWV3LnF1ZXJpZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgdFZpZXcucXVlcmllcy5lbGVtZW50U3RhcnQodFZpZXcsIHROb2RlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHROb2RlOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGUgRE9NIGVsZW1lbnQuIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGxhdGVyIGJlIGZvbGxvd2VkIGJ5IGBlbGVtZW50RW5kKClgIGNhbGwuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheQogICAgICogQHBhcmFtIHs/fSBuYW1lIE5hbWUgb2YgdGhlIERPTSBOb2RlCiAgICAgKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAgICAgKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIGxvY2FsIHJlZmVyZW5jZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogICAgICoKICAgICAqIEF0dHJpYnV0ZXMgYW5kIGxvY2FsUmVmcyBhcmUgcGFzc2VkIGFzIGFuIGFycmF5IG9mIHN0cmluZ3Mgd2hlcmUgZWxlbWVudHMgd2l0aCBhbiBldmVuIGluZGV4CiAgICAgKiBob2xkIGFuIGF0dHJpYnV0ZSBuYW1lIGFuZCBlbGVtZW50cyB3aXRoIGFuIG9kZCBpbmRleCBob2xkIGFuIGF0dHJpYnV0ZSB2YWx1ZSwgZXguOgogICAgICogWydpZCcsICd3YXJuaW5nNScsICdjbGFzcycsICdhbGVydCddCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWVsZW1lbnRTdGFydChpbmRleCwgbmFtZSwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFkanVzdGVkSW5kZXggPSBIRUFERVJfT0ZGU0VUICsgaW5kZXg7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ2VsZW1lbnRzIHNob3VsZCBiZSBjcmVhdGVkIGJlZm9yZSBhbnkgYmluZGluZ3MnKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlRWxlbWVudCsrOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgYWRqdXN0ZWRJbmRleCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbmRlcmVyID0gbFZpZXdbUkVOREVSRVJdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmUgPSBsVmlld1thZGp1c3RlZEluZGV4XSA9IGVsZW1lbnRDcmVhdGUobmFtZSwgcmVuZGVyZXIsIGdldE5hbWVzcGFjZSgpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3MgPwogICAgICAgICAgICBlbGVtZW50U3RhcnRGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgbmF0aXZlLCBuYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgOgogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSkpOwogICAgICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZSh0Tm9kZSwgdHJ1ZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lcmdlZEF0dHJzID0gdE5vZGUubWVyZ2VkQXR0cnM7CiAgICAgICAgaWYgKG1lcmdlZEF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhyZW5kZXJlciwgbmF0aXZlLCBtZXJnZWRBdHRycyk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjbGFzc2VzID0gdE5vZGUuY2xhc3NlczsKICAgICAgICBpZiAoY2xhc3NlcyAhPT0gbnVsbCkgewogICAgICAgICAgICB3cml0ZURpcmVjdENsYXNzKHJlbmRlcmVyLCBuYXRpdmUsIGNsYXNzZXMpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3R5bGVzID0gdE5vZGUuc3R5bGVzOwogICAgICAgIGlmIChzdHlsZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgd3JpdGVEaXJlY3RTdHlsZShyZW5kZXJlciwgbmF0aXZlLCBzdHlsZXMpOwogICAgICAgIH0KICAgICAgICBhcHBlbmRDaGlsZCh0VmlldywgbFZpZXcsIG5hdGl2ZSwgdE5vZGUpOwogICAgICAgIC8vIGFueSBpbW1lZGlhdGUgY2hpbGRyZW4gb2YgYSBjb21wb25lbnQgb3IgdGVtcGxhdGUgY29udGFpbmVyIG11c3QgYmUgcHJlLWVtcHRpdmVseQogICAgICAgIC8vIG1vbmtleS1wYXRjaGVkIHdpdGggdGhlIGNvbXBvbmVudCB2aWV3IGRhdGEgc28gdGhhdCB0aGUgZWxlbWVudCBjYW4gYmUgaW5zcGVjdGVkCiAgICAgICAgLy8gbGF0ZXIgb24gdXNpbmcgYW55IGVsZW1lbnQgZGlzY292ZXJ5IHV0aWxpdHkgbWV0aG9kcyAoc2VlIGBlbGVtZW50X2Rpc2NvdmVyeS50c2ApCiAgICAgICAgaWYgKGdldEVsZW1lbnREZXB0aENvdW50KCkgPT09IDApIHsKICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICBpbmNyZWFzZUVsZW1lbnREZXB0aENvdW50KCk7CiAgICAgICAgaWYgKGlzRGlyZWN0aXZlSG9zdCh0Tm9kZSkpIHsKICAgICAgICAgICAgY3JlYXRlRGlyZWN0aXZlc0luc3RhbmNlcyh0VmlldywgbFZpZXcsIHROb2RlKTsKICAgICAgICAgICAgZXhlY3V0ZUNvbnRlbnRRdWVyaWVzKHRWaWV3LCB0Tm9kZSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICBpZiAobG9jYWxSZWZzSW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYXJrIHRoZSBlbmQgb2YgdGhlIGVsZW1lbnQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1ZWxlbWVudEVuZCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgJ05vIHBhcmVudCBub2RlIHRvIGNsb3NlLicpOwogICAgICAgIGlmIChnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgICAgIHNldElzTm90UGFyZW50KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0SGFzUGFyZW50KGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpKTsKICAgICAgICAgICAgcHJldmlvdXNPclBhcmVudFROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKHByZXZpb3VzT3JQYXJlbnRUTm9kZS5wYXJlbnQpKTsKICAgICAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBwcmV2aW91c09yUGFyZW50VE5vZGU7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHROb2RlLCAzIC8qIEVsZW1lbnQgKi8pOwogICAgICAgIGRlY3JlYXNlRWxlbWVudERlcHRoQ291bnQoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgcmVnaXN0ZXJQb3N0T3JkZXJIb29rcyh0VmlldywgcHJldmlvdXNPclBhcmVudFROb2RlKTsKICAgICAgICAgICAgaWYgKGlzQ29udGVudFF1ZXJ5SG9zdChwcmV2aW91c09yUGFyZW50VE5vZGUpKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcucXVlcmllcykpLmVsZW1lbnRFbmQocHJldmlvdXNPclBhcmVudFROb2RlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodE5vZGUuY2xhc3Nlc1dpdGhvdXRIb3N0ICE9IG51bGwgJiYgaGFzQ2xhc3NJbnB1dCh0Tm9kZSkpIHsKICAgICAgICAgICAgc2V0RGlyZWN0aXZlSW5wdXRzV2hpY2hTaGFkb3dzU3R5bGluZyh0VmlldywgdE5vZGUsIGdldExWaWV3KCksIHROb2RlLmNsYXNzZXNXaXRob3V0SG9zdCwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0Tm9kZS5zdHlsZXNXaXRob3V0SG9zdCAhPSBudWxsICYmIGhhc1N0eWxlSW5wdXQodE5vZGUpKSB7CiAgICAgICAgICAgIHNldERpcmVjdGl2ZUlucHV0c1doaWNoU2hhZG93c1N0eWxpbmcodFZpZXcsIHROb2RlLCBnZXRMVmlldygpLCB0Tm9kZS5zdHlsZXNXaXRob3V0SG9zdCwgZmFsc2UpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBlbXB0eSBlbGVtZW50IHVzaW5nIHtcQGxpbmsgZWxlbWVudFN0YXJ0fSBhbmQge1xAbGluayBlbGVtZW50RW5kfQogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgZGF0YSBhcnJheQogICAgICogQHBhcmFtIHs/fSBuYW1lIE5hbWUgb2YgdGhlIERPTSBOb2RlCiAgICAgKiBAcGFyYW0gez89fSBhdHRyc0luZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50J3MgYXR0cmlidXRlcyBpbiB0aGUgYGNvbnN0c2AgYXJyYXkuCiAgICAgKiBAcGFyYW0gez89fSBsb2NhbFJlZnNJbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCdzIGxvY2FsIHJlZmVyZW5jZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVlbGVtZW50KGluZGV4LCBuYW1lLCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoaW5kZXgsIG5hbWUsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gaGFzRGlyZWN0aXZlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gd2FybkFib3V0VW5rbm93bkVsZW1lbnQodFZpZXcsIGxWaWV3LCBlbGVtZW50LCB0Tm9kZSwgaGFzRGlyZWN0aXZlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzY2hlbWFzID0gdFZpZXcuc2NoZW1hczsKICAgICAgICAvLyBJZiBgc2NoZW1hc2AgaXMgc2V0IHRvIGBudWxsYCwgdGhhdCdzIGFuIGluZGljYXRpb24gdGhhdCB0aGlzIENvbXBvbmVudCB3YXMgY29tcGlsZWQgaW4gQU9UCiAgICAgICAgLy8gbW9kZSB3aGVyZSB0aGlzIGNoZWNrIGhhcHBlbnMgYXQgY29tcGlsZSB0aW1lLiBJbiBKSVQgbW9kZSwgYHNjaGVtYXNgIGlzIGFsd2F5cyBwcmVzZW50IGFuZAogICAgICAgIC8vIGRlZmluZWQgYXMgYW4gYXJyYXkgKGFzIGFuIGVtcHR5IGFycmF5IGluIGNhc2UgYHNjaGVtYXNgIGZpZWxkIGlzIG5vdCBkZWZpbmVkKSBhbmQgd2Ugc2hvdWxkCiAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY2hlY2sgYmVsb3cuCiAgICAgICAgaWYgKHNjaGVtYXMgPT09IG51bGwpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGFnTmFtZSA9IHROb2RlLnRhZ05hbWU7CiAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgbWF0Y2hlcyBhbnkgZGlyZWN0aXZlLCBpdCdzIGNvbnNpZGVyZWQgYXMgdmFsaWQuCiAgICAgICAgaWYgKCFoYXNEaXJlY3RpdmVzICYmIHRhZ05hbWUgIT09IG51bGwpIHsKICAgICAgICAgICAgLy8gVGhlIGVsZW1lbnQgaXMgdW5rbm93biBpZiBpdCdzIGFuIGluc3RhbmNlIG9mIEhUTUxVbmtub3duRWxlbWVudCBvciBpdCBpc24ndCByZWdpc3RlcmVkCiAgICAgICAgICAgIC8vIGFzIGEgY3VzdG9tIGVsZW1lbnQuIE5vdGUgdGhhdCB1bmtub3duIGVsZW1lbnRzIHdpdGggYSBkYXNoIGluIHRoZWlyIG5hbWUgd29uJ3QgYmUgaW5zdGFuY2VzCiAgICAgICAgICAgIC8vIG9mIEhUTUxVbmtub3duRWxlbWVudCBpbiBicm93c2VycyB0aGF0IHN1cHBvcnQgd2ViIGNvbXBvbmVudHMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNVbmtub3duID0gCiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjaGVjayBmb3IgYHR5cGVvZiBIVE1MVW5rbm93bkVsZW1lbnQgPT09ICdmdW5jdGlvbidgLAogICAgICAgICAgICAvLyBiZWNhdXNlIHdoaWxlIG1vc3QgYnJvd3NlcnMgcmV0dXJuICdmdW5jdGlvbicsIElFIHJldHVybnMgJ29iamVjdCcuCiAgICAgICAgICAgICh0eXBlb2YgSFRNTFVua25vd25FbGVtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBIVE1MVW5rbm93bkVsZW1lbnQgJiYKICAgICAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVW5rbm93bkVsZW1lbnQpIHx8CiAgICAgICAgICAgICAgICAodHlwZW9mIGN1c3RvbUVsZW1lbnRzICE9PSAndW5kZWZpbmVkJyAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xICYmCiAgICAgICAgICAgICAgICAgICAgIWN1c3RvbUVsZW1lbnRzLmdldCh0YWdOYW1lKSk7CiAgICAgICAgICAgIGlmIChpc1Vua25vd24gJiYgIW1hdGNoaW5nU2NoZW1hcyh0VmlldywgbFZpZXcsIHRhZ05hbWUpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgd2FybmluZyA9IGAnJHt0YWdOYW1lfScgaXMgbm90IGEga25vd24gZWxlbWVudDpcbmA7CiAgICAgICAgICAgICAgICB3YXJuaW5nICs9IGAxLiBJZiAnJHt0YWdOYW1lfScgaXMgYW4gQW5ndWxhciBjb21wb25lbnQsIHRoZW4gdmVyaWZ5IHRoYXQgaXQgaXMgcGFydCBvZiB0aGlzIG1vZHVsZS5cbmA7CiAgICAgICAgICAgICAgICBpZiAodGFnTmFtZSAmJiB0YWdOYW1lLmluZGV4T2YoJy0nKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgd2FybmluZyArPSBgMi4gSWYgJyR7dGFnTmFtZX0nIGlzIGEgV2ViIENvbXBvbmVudCB0aGVuIGFkZCAnQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQScgdG8gdGhlICdATmdNb2R1bGUuc2NoZW1hcycgb2YgdGhpcyBjb21wb25lbnQgdG8gc3VwcHJlc3MgdGhpcyBtZXNzYWdlLmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB3YXJuaW5nICs9CiAgICAgICAgICAgICAgICAgICAgICAgIGAyLiBUbyBhbGxvdyBhbnkgZWxlbWVudCBhZGQgJ05PX0VSUk9SU19TQ0hFTUEnIHRvIHRoZSAnQE5nTW9kdWxlLnNjaGVtYXMnIG9mIHRoaXMgY29tcG9uZW50LmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4od2FybmluZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9lbGVtZW50X2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7Pz19IGF0dHJzSW5kZXgKICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBlbGVtZW50Q29udGFpbmVyU3RhcnRGaXJzdENyZWF0ZVBhc3MoaW5kZXgsIHRWaWV3LCBsVmlldywgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLmZpcnN0Q3JlYXRlUGFzcysrOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Vmlld0NvbnN0cyA9IHRWaWV3LmNvbnN0czsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXR0cnMgPSBnZXRDb25zdGFudCh0Vmlld0NvbnN0cywgYXR0cnNJbmRleCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0T3JDcmVhdGVUTm9kZSh0VmlldywgbFZpZXdbVF9IT1NUXSwgaW5kZXgsIDQgLyogRWxlbWVudENvbnRhaW5lciAqLywgJ25nLWNvbnRhaW5lcicsIGF0dHJzKTsKICAgICAgICAvLyBXaGlsZSBuZy1jb250YWluZXIgZG9lc24ndCBuZWNlc3NhcmlseSBzdXBwb3J0IHN0eWxpbmcsIHdlIHVzZSB0aGUgc3R5bGUgY29udGV4dCB0byBpZGVudGlmeQogICAgICAgIC8vIGFuZCBleGVjdXRlIGRpcmVjdGl2ZXMgb24gdGhlIG5nLWNvbnRhaW5lci4KICAgICAgICBpZiAoYXR0cnMgIT09IG51bGwpIHsKICAgICAgICAgICAgY29tcHV0ZVN0YXRpY1N0eWxpbmcodE5vZGUsIGF0dHJzLCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxvY2FsUmVmcyA9IGdldENvbnN0YW50KHRWaWV3Q29uc3RzLCBsb2NhbFJlZnNJbmRleCk7CiAgICAgICAgcmVzb2x2ZURpcmVjdGl2ZXModFZpZXcsIGxWaWV3LCB0Tm9kZSwgbG9jYWxSZWZzKTsKICAgICAgICBpZiAodFZpZXcucXVlcmllcyAhPT0gbnVsbCkgewogICAgICAgICAgICB0Vmlldy5xdWVyaWVzLmVsZW1lbnRTdGFydCh0VmlldywgdE5vZGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdE5vZGU7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBsb2dpY2FsIGNvbnRhaW5lciBmb3Igb3RoZXIgbm9kZXMgKDxuZy1jb250YWluZXI+KSBiYWNrZWQgYnkgYSBjb21tZW50IG5vZGUgaW4gdGhlIERPTS4KICAgICAqIFRoZSBpbnN0cnVjdGlvbiBtdXN0IGxhdGVyIGJlIGZvbGxvd2VkIGJ5IGBlbGVtZW50Q29udGFpbmVyRW5kKClgIGNhbGwuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGluZGV4IEluZGV4IG9mIHRoZSBlbGVtZW50IGluIHRoZSBMVmlldyBhcnJheQogICAgICogQHBhcmFtIHs/PX0gYXR0cnNJbmRleCBJbmRleCBvZiB0aGUgY29udGFpbmVyIGF0dHJpYnV0ZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxSZWZzSW5kZXggSW5kZXggb2YgdGhlIGNvbnRhaW5lcidzIGxvY2FsIHJlZmVyZW5jZXMgaW4gdGhlIGBjb25zdHNgIGFycmF5LgogICAgICoKICAgICAqIEV2ZW4gaWYgdGhpcyBpbnN0cnVjdGlvbiBhY2NlcHRzIGEgc2V0IG9mIGF0dHJpYnV0ZXMgbm8gYWN0dWFsIGF0dHJpYnV0ZSB2YWx1ZXMgYXJlIHByb3BhZ2F0ZWQgdG8KICAgICAqIHRoZSBET00gKGFzIGEgY29tbWVudCBub2RlIGNhbid0IGhhdmUgYXR0cmlidXRlcykuIEF0dHJpYnV0ZXMgYXJlIGhlcmUgb25seSBmb3IgZGlyZWN0aXZlCiAgICAgKiBtYXRjaGluZyBwdXJwb3NlcyBhbmQgc2V0dGluZyBpbml0aWFsIGlucHV0cyBvZiBkaXJlY3RpdmVzLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoaW5kZXgsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhZGp1c3RlZEluZGV4ID0gaW5kZXggKyBIRUFERVJfT0ZGU0VUOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShsVmlldywgYWRqdXN0ZWRJbmRleCk7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ2VsZW1lbnQgY29udGFpbmVycyBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGJpbmRpbmdzJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gdFZpZXcuZmlyc3RDcmVhdGVQYXNzID8KICAgICAgICAgICAgZWxlbWVudENvbnRhaW5lclN0YXJ0Rmlyc3RDcmVhdGVQYXNzKGluZGV4LCB0VmlldywgbFZpZXcsIGF0dHJzSW5kZXgsIGxvY2FsUmVmc0luZGV4KSA6CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKHROb2RlLCB0cnVlKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlQ29tbWVudCsrOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuYXRpdmUgPSBsVmlld1thZGp1c3RlZEluZGV4XSA9CiAgICAgICAgICAgIGxWaWV3W1JFTkRFUkVSXS5jcmVhdGVDb21tZW50KG5nRGV2TW9kZSA/ICduZy1jb250YWluZXInIDogJycpOwogICAgICAgIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgbmF0aXZlLCB0Tm9kZSk7CiAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKG5hdGl2ZSwgbFZpZXcpOwogICAgICAgIGlmIChpc0RpcmVjdGl2ZUhvc3QodE5vZGUpKSB7CiAgICAgICAgICAgIGNyZWF0ZURpcmVjdGl2ZXNJbnN0YW5jZXModFZpZXcsIGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgIGV4ZWN1dGVDb250ZW50UXVlcmllcyh0VmlldywgdE5vZGUsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgaWYgKGxvY2FsUmVmc0luZGV4ICE9IG51bGwpIHsKICAgICAgICAgICAgc2F2ZVJlc29sdmVkTG9jYWxzSW5EYXRhKGxWaWV3LCB0Tm9kZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBNYXJrIHRoZSBlbmQgb2YgdGhlIDxuZy1jb250YWluZXI+LgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWVsZW1lbnRDb250YWluZXJFbmQoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIGlmIChnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgICAgIHNldElzTm90UGFyZW50KCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0SGFzUGFyZW50KHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7CiAgICAgICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZSA9ICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c09yUGFyZW50VE5vZGUucGFyZW50KSk7CiAgICAgICAgICAgIHNldFByZXZpb3VzT3JQYXJlbnRUTm9kZShwcmV2aW91c09yUGFyZW50VE5vZGUsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVUeXBlKHByZXZpb3VzT3JQYXJlbnRUTm9kZSwgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIHJlZ2lzdGVyUG9zdE9yZGVySG9va3ModFZpZXcsIHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7CiAgICAgICAgICAgIGlmIChpc0NvbnRlbnRRdWVyeUhvc3QocHJldmlvdXNPclBhcmVudFROb2RlKSkgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LnF1ZXJpZXMpKS5lbGVtZW50RW5kKHByZXZpb3VzT3JQYXJlbnRUTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW4gZW1wdHkgbG9naWNhbCBjb250YWluZXIgdXNpbmcge1xAbGluayBlbGVtZW50Q29udGFpbmVyU3RhcnR9CiAgICAgKiBhbmQge1xAbGluayBlbGVtZW50Q29udGFpbmVyRW5kfQogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBvZiB0aGUgZWxlbWVudCBpbiB0aGUgTFZpZXcgYXJyYXkKICAgICAqIEBwYXJhbSB7Pz19IGF0dHJzSW5kZXggSW5kZXggb2YgdGhlIGNvbnRhaW5lciBhdHRyaWJ1dGVzIGluIHRoZSBgY29uc3RzYCBhcnJheS4KICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsUmVmc0luZGV4IEluZGV4IG9mIHRoZSBjb250YWluZXIncyBsb2NhbCByZWZlcmVuY2VzIGluIHRoZSBgY29uc3RzYCBhcnJheS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1ZWxlbWVudENvbnRhaW5lcihpbmRleCwgYXR0cnNJbmRleCwgbG9jYWxSZWZzSW5kZXgpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KGluZGV4LCBhdHRyc0luZGV4LCBsb2NhbFJlZnNJbmRleCk7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2dldF9jdXJyZW50X3ZpZXcudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IE9wYXF1ZVZpZXdTdGF0ZSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBVc2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIHJlc3RvcmVWaWV3KCkgaW5zdHJ1Y3Rpb24gdG8gc2F2ZSBhIHNuYXBzaG90CiAgICAgKiBvZiB0aGUgY3VycmVudCB2aWV3IGFuZCByZXN0b3JlIGl0IHdoZW4gbGlzdGVuZXJzIGFyZSBpbnZva2VkLiBUaGlzIGFsbG93cwogICAgICogd2Fsa2luZyB0aGUgZGVjbGFyYXRpb24gdmlldyB0cmVlIGluIGxpc3RlbmVycyB0byBnZXQgdmFycyBmcm9tIHBhcmVudCB2aWV3cy4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVnZXRDdXJyZW50VmlldygpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChnZXRMVmlldygpKSkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIERldGVybWluZSBpZiB0aGUgYXJndW1lbnQgaXMgc2hhcGVkIGxpa2UgYSBQcm9taXNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzUHJvbWlzZSQxKG9iaikgewogICAgICAgIC8vIGFsbG93IGFueSBQcm9taXNlL0ErIGNvbXBsaWFudCB0aGVuYWJsZS4KICAgICAgICAvLyBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgb2JqLnRoZW4gY29uZm9ybXMgdG8gdGhlIHNwZWMKICAgICAgICByZXR1cm4gISFvYmogJiYgdHlwZW9mIG9iai50aGVuID09PSAnZnVuY3Rpb24nOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmUgaWYgdGhlIGFyZ3VtZW50IGlzIGFuIE9ic2VydmFibGUKICAgICAqLwogICAgZnVuY3Rpb24gaXNPYnNlcnZhYmxlJDEob2JqKSB7CiAgICAgICAgLy8gVE9ETzogdXNlIGlzT2JzZXJ2YWJsZSBvbmNlIHdlIHVwZGF0ZSBwYXNzIHJ4anMgNi4xCiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL1JlYWN0aXZlWC9yeGpzL2Jsb2IvbWFzdGVyL0NIQU5HRUxPRy5tZCM2MTAtMjAxOC0wNS0wMwogICAgICAgIHJldHVybiAhIW9iaiAmJiB0eXBlb2Ygb2JqLnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL2xpc3RlbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQWRkcyBhbiBldmVudCBsaXN0ZW5lciB0byB0aGUgY3VycmVudCBub2RlLgogICAgICoKICAgICAqIElmIGFuIG91dHB1dCBleGlzdHMgb24gb25lIG9mIHRoZSBub2RlJ3MgZGlyZWN0aXZlcywgaXQgYWxzbyBzdWJzY3JpYmVzIHRvIHRoZSBvdXRwdXQKICAgICAqIGFuZCBzYXZlcyB0aGUgc3Vic2NyaXB0aW9uIGZvciBsYXRlciBjbGVhbnVwLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUgTmFtZSBvZiB0aGUgZXZlbnQKICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXJGbiBUaGUgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gZXZlbnQgZW1pdHMKICAgICAqIEBwYXJhbSB7Pz19IHVzZUNhcHR1cmUgV2hldGhlciBvciBub3QgdG8gdXNlIGNhcHR1cmUgaW4gZXZlbnQgbGlzdGVuZXIKICAgICAqIEBwYXJhbSB7Pz19IGV2ZW50VGFyZ2V0UmVzb2x2ZXIgRnVuY3Rpb24gdGhhdCByZXR1cm5zIGdsb2JhbCB0YXJnZXQgaW5mb3JtYXRpb24gaW4gY2FzZSB0aGlzIGxpc3RlbmVyCiAgICAgKiBzaG91bGQgYmUgYXR0YWNoZWQgdG8gYSBnbG9iYWwgb2JqZWN0IGxpa2Ugd2luZG93LCBkb2N1bWVudCBvciBib2R5CiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWxpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSA9IGZhbHNlLCBldmVudFRhcmdldFJlc29sdmVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgIGxpc3RlbmVySW50ZXJuYWwodFZpZXcsIGxWaWV3LCBsVmlld1tSRU5ERVJFUl0sIHROb2RlLCBldmVudE5hbWUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpOwogICAgICAgIHJldHVybiDJtcm1bGlzdGVuZXI7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIHN5bnRoZXRpYyBob3N0IGxpc3RlbmVyIChlLmcuIGAoXEBmb28uc3RhcnQpYCkgb24gYSBjb21wb25lbnQgb3IgZGlyZWN0aXZlLgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgZm9yIGNvbXBhdGliaWxpdHkgcHVycG9zZXMgYW5kIGlzIGRlc2lnbmVkIHRvIGVuc3VyZSB0aGF0IGEKICAgICAqIHN5bnRoZXRpYyBob3N0IGxpc3RlbmVyIChlLmcuIGBcQEhvc3RMaXN0ZW5lcignXEBmb28uc3RhcnQnKWApIHByb3Blcmx5IGdldHMgcmVuZGVyZWQKICAgICAqIGluIHRoZSBjb21wb25lbnQncyByZW5kZXJlci4gTm9ybWFsbHkgYWxsIGhvc3QgbGlzdGVuZXJzIGFyZSBldmFsdWF0ZWQgd2l0aCB0aGUKICAgICAqIHBhcmVudCBjb21wb25lbnQncyByZW5kZXJlciwgYnV0LCBpbiB0aGUgY2FzZSBvZiBhbmltYXRpb24gXEB0cmlnZ2VycywgdGhleSBuZWVkCiAgICAgKiB0byBiZSBldmFsdWF0ZWQgd2l0aCB0aGUgc3ViIGNvbXBvbmVudCdzIHJlbmRlcmVyIChiZWNhdXNlIHRoYXQncyB3aGVyZSB0aGUKICAgICAqIGFuaW1hdGlvbiB0cmlnZ2VycyBhcmUgZGVmaW5lZCkuCiAgICAgKgogICAgICogRG8gbm90IHVzZSB0aGlzIGluc3RydWN0aW9uIGFzIGEgcmVwbGFjZW1lbnQgZm9yIGBsaXN0ZW5lcmAuIFRoaXMgaW5zdHJ1Y3Rpb24KICAgICAqIG9ubHkgZXhpc3RzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFZpZXdFbmdpbmUncyBob3N0IGJpbmRpbmcgYmVoYXZpb3IuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBOYW1lIG9mIHRoZSBldmVudAogICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lckZuIFRoZSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBldmVudCBlbWl0cwogICAgICogQHBhcmFtIHs/PX0gdXNlQ2FwdHVyZSBXaGV0aGVyIG9yIG5vdCB0byB1c2UgY2FwdHVyZSBpbiBldmVudCBsaXN0ZW5lcgogICAgICogQHBhcmFtIHs/PX0gZXZlbnRUYXJnZXRSZXNvbHZlciBGdW5jdGlvbiB0aGF0IHJldHVybnMgZ2xvYmFsIHRhcmdldCBpbmZvcm1hdGlvbiBpbiBjYXNlIHRoaXMgbGlzdGVuZXIKICAgICAqIHNob3VsZCBiZSBhdHRhY2hlZCB0byBhIGdsb2JhbCBvYmplY3QgbGlrZSB3aW5kb3csIGRvY3VtZW50IG9yIGJvZHkKICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyKGV2ZW50TmFtZSwgbGlzdGVuZXJGbiwgdXNlQ2FwdHVyZSA9IGZhbHNlLCBldmVudFRhcmdldFJlc29sdmVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50RGVmID0gZ2V0Q3VycmVudERpcmVjdGl2ZURlZih0Vmlldy5kYXRhKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsb2FkQ29tcG9uZW50UmVuZGVyZXIoY3VycmVudERlZiwgdE5vZGUsIGxWaWV3KTsKICAgICAgICBsaXN0ZW5lckludGVybmFsKHRWaWV3LCBsVmlldywgcmVuZGVyZXIsIHROb2RlLCBldmVudE5hbWUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpOwogICAgICAgIHJldHVybiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyOwogICAgfQogICAgLyoqCiAgICAgKiBBIHV0aWxpdHkgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgYSBnaXZlbiBlbGVtZW50IGhhcyBhbHJlYWR5IGFuIGV2ZW50IGhhbmRsZXIgcmVnaXN0ZXJlZCBmb3IgYW4KICAgICAqIGV2ZW50IHdpdGggYSBzcGVjaWZpZWQgbmFtZS4gVGhlIFRWaWV3LmNsZWFudXAgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBmaW5kIG91dCB3aGljaCBldmVudHMKICAgICAqIGFyZSByZWdpc3RlcmVkIGZvciBhIGdpdmVuIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHBhcmFtIHs/fSB0Tm9kZUlkeAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZmluZEV4aXN0aW5nTGlzdGVuZXIodFZpZXcsIGxWaWV3LCBldmVudE5hbWUsIHROb2RlSWR4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRDbGVhbnVwID0gdFZpZXcuY2xlYW51cDsKICAgICAgICBpZiAodENsZWFudXAgIT0gbnVsbCkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRDbGVhbnVwLmxlbmd0aCAtIDE7IGkgKz0gMikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2xlYW51cEV2ZW50TmFtZSA9IHRDbGVhbnVwW2ldOwogICAgICAgICAgICAgICAgaWYgKGNsZWFudXBFdmVudE5hbWUgPT09IGV2ZW50TmFtZSAmJiB0Q2xlYW51cFtpICsgMV0gPT09IHROb2RlSWR4KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIG1hdGNoaW5nIGV2ZW50IG5hbWUgb24gdGhlIHNhbWUgbm9kZSBidXQgaXQgbWlnaHQgbm90IGhhdmUgYmVlbgogICAgICAgICAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWQgeWV0LCBzbyB3ZSBtdXN0IGV4cGxpY2l0bHkgdmVyaWZ5IGVudHJpZXMgaW4gdGhlIExWaWV3IGNsZWFudXAgZGF0YQogICAgICAgICAgICAgICAgICAgIC8vIHN0cnVjdHVyZXMuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxDbGVhbnVwID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W0NMRUFOVVBdKSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVySWR4SW5MQ2xlYW51cCA9IHRDbGVhbnVwW2kgKyAyXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbENsZWFudXAubGVuZ3RoID4gbGlzdGVuZXJJZHhJbkxDbGVhbnVwID8gbENsZWFudXBbbGlzdGVuZXJJZHhJbkxDbGVhbnVwXSA6IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUVmlldy5jbGVhbnVwIGNhbiBoYXZlIGEgbWl4IG9mIDQtZWxlbWVudHMgZW50cmllcyAoZm9yIGV2ZW50IGhhbmRsZXIgY2xlYW51cHMpIG9yCiAgICAgICAgICAgICAgICAvLyAyLWVsZW1lbnQgZW50cmllcyAoZm9yIGRpcmVjdGl2ZSBhbmQgcXVlcmllcyBkZXN0cm95IGhvb2tzKS4gQXMgc3VjaCB3ZSBjYW4gZW5jb3VudGVyCiAgICAgICAgICAgICAgICAvLyBibG9ja3Mgb2YgNCBvciAyIGl0ZW1zIGluIHRoZSB0Vmlldy5jbGVhbnVwIGFuZCB0aGlzIGlzIHdoeSB3ZSBpdGVyYXRlIG92ZXIgMiBlbGVtZW50cwogICAgICAgICAgICAgICAgLy8gZmlyc3QgYW5kIGp1bXAgYW5vdGhlciAyIGVsZW1lbnRzIGlmIHdlIGRldGVjdCBsaXN0ZW5lcnMgY2xlYW51cCAoNCBlbGVtZW50cykuIEFsc28gY2hlY2sKICAgICAgICAgICAgICAgIC8vIGRvY3VtZW50YXRpb24gb2YgVFZpZXcuY2xlYW51cCBmb3IgbW9yZSBkZXRhaWxzIG9mIHRoaXMgZGF0YSBzdHJ1Y3R1cmUgbGF5b3V0LgogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjbGVhbnVwRXZlbnROYW1lID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIGkgKz0gMjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSByZW5kZXJlcgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXJGbgogICAgICogQHBhcmFtIHs/PX0gdXNlQ2FwdHVyZQogICAgICogQHBhcmFtIHs/PX0gZXZlbnRUYXJnZXRSZXNvbHZlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbGlzdGVuZXJJbnRlcm5hbCh0VmlldywgbFZpZXcsIHJlbmRlcmVyLCB0Tm9kZSwgZXZlbnROYW1lLCBsaXN0ZW5lckZuLCB1c2VDYXB0dXJlID0gZmFsc2UsIGV2ZW50VGFyZ2V0UmVzb2x2ZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNUTm9kZURpcmVjdGl2ZUhvc3QgPSBpc0RpcmVjdGl2ZUhvc3QodE5vZGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaXJzdENyZWF0ZVBhc3MgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3M7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRDbGVhbnVwID0gZmlyc3RDcmVhdGVQYXNzICYmICh0Vmlldy5jbGVhbnVwIHx8ICh0Vmlldy5jbGVhbnVwID0gW10pKTsKICAgICAgICAvLyBXaGVuIHRoZSDJtcm1bGlzdGVuZXIgaW5zdHJ1Y3Rpb24gd2FzIGdlbmVyYXRlZCBhbmQgaXMgZXhlY3V0ZWQgd2Uga25vdyB0aGF0IHRoZXJlIGlzIGVpdGhlciBhCiAgICAgICAgLy8gbmF0aXZlIGxpc3RlbmVyIG9yIGEgZGlyZWN0aXZlIG91dHB1dCBvbiB0aGlzIGVsZW1lbnQuIEFzIHN1Y2ggd2Ugd2Uga25vdyB0aGF0IHdlIHdpbGwgaGF2ZSB0bwogICAgICAgIC8vIHJlZ2lzdGVyIGEgbGlzdGVuZXIgYW5kIHN0b3JlIGl0cyBjbGVhbnVwIGZ1bmN0aW9uIG9uIExWaWV3LgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsQ2xlYW51cCA9IGdldExDbGVhbnVwKGxWaWV3KTsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByb2Nlc3NPdXRwdXRzID0gdHJ1ZTsKICAgICAgICAvLyBhZGQgbmF0aXZlIGV2ZW50IGxpc3RlbmVyIC0gYXBwbGljYWJsZSB0byBlbGVtZW50cyBvbmx5CiAgICAgICAgaWYgKHROb2RlLnR5cGUgPT09IDMgLyogRWxlbWVudCAqLykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZSA9ICgvKiogQHR5cGUgez99ICovIChnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldykpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXNvbHZlZCA9IGV2ZW50VGFyZ2V0UmVzb2x2ZXIgPyBldmVudFRhcmdldFJlc29sdmVyKG5hdGl2ZSkgOiAoLyoqIEB0eXBlIHs/fSAqLyAoRU1QVFlfT0JKKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gcmVzb2x2ZWQudGFyZ2V0IHx8IG5hdGl2ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsQ2xlYW51cEluZGV4ID0gbENsZWFudXAubGVuZ3RoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlkeE9yVGFyZ2V0R2V0dGVyID0gZXZlbnRUYXJnZXRSZXNvbHZlciA/CiAgICAgICAgICAgICAgICAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9sVmlldwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKF9sVmlldykgPT4gZXZlbnRUYXJnZXRSZXNvbHZlcih1bndyYXBSTm9kZShfbFZpZXdbdE5vZGUuaW5kZXhdKSkudGFyZ2V0KSA6CiAgICAgICAgICAgICAgICB0Tm9kZS5pbmRleDsKICAgICAgICAgICAgLy8gSW4gb3JkZXIgdG8gbWF0Y2ggY3VycmVudCBiZWhhdmlvciwgbmF0aXZlIERPTSBldmVudCBsaXN0ZW5lcnMgbXVzdCBiZSBhZGRlZCBmb3IgYWxsCiAgICAgICAgICAgIC8vIGV2ZW50cyAoaW5jbHVkaW5nIG91dHB1dHMpLgogICAgICAgICAgICBpZiAoaXNQcm9jZWR1cmFsUmVuZGVyZXIocmVuZGVyZXIpKSB7CiAgICAgICAgICAgICAgICAvLyBUaGVyZSBtaWdodCBiZSBjYXNlcyB3aGVyZSBtdWx0aXBsZSBkaXJlY3RpdmVzIG9uIHRoZSBzYW1lIGVsZW1lbnQgdHJ5IHRvIHJlZ2lzdGVyIGFuIGV2ZW50CiAgICAgICAgICAgICAgICAvLyBoYW5kbGVyIGZ1bmN0aW9uIGZvciB0aGUgc2FtZSBldmVudC4gSW4gdGhpcyBzaXR1YXRpb24gd2Ugd2FudCB0byBhdm9pZCByZWdpc3RyYXRpb24gb2YKICAgICAgICAgICAgICAgIC8vIHNldmVyYWwgbmF0aXZlIGxpc3RlbmVycyBhcyBlYWNoIHJlZ2lzdHJhdGlvbiB3b3VsZCBiZSBpbnRlcmNlcHRlZCBieSBOZ1pvbmUgYW5kCiAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGNoYW5nZSBkZXRlY3Rpb24uIFRoaXMgd291bGQgbWVhbiB0aGF0IGEgc2luZ2xlIHVzZXIgYWN0aW9uIHdvdWxkIHJlc3VsdCBpbiBzZXZlcmFsCiAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgZGV0ZWN0aW9ucyBiZWluZyBpbnZva2VkLiBUbyBhdm9pZCB0aGlzIHNpdHVhdGlvbiB3ZSB3YW50IHRvIGhhdmUgb25seSBvbmUgY2FsbCB0bwogICAgICAgICAgICAgICAgLy8gbmF0aXZlIGhhbmRsZXIgcmVnaXN0cmF0aW9uIChmb3IgdGhlIHNhbWUgZWxlbWVudCBhbmQgc2FtZSB0eXBlIG9mIGV2ZW50KS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBJbiBvcmRlciB0byBoYXZlIGp1c3Qgb25lIG5hdGl2ZSBldmVudCBoYW5kbGVyIGluIHByZXNlbmNlIG9mIG11bHRpcGxlIGhhbmRsZXIgZnVuY3Rpb25zLAogICAgICAgICAgICAgICAgLy8gd2UganVzdCByZWdpc3RlciBhIGZpcnN0IGhhbmRsZXIgZnVuY3Rpb24gYXMgYSBuYXRpdmUgZXZlbnQgbGlzdGVuZXIgYW5kIHRoZW4gY2hhaW4KICAgICAgICAgICAgICAgIC8vIChjb2FsZXNjZSkgb3RoZXIgaGFuZGxlciBmdW5jdGlvbnMgb24gdG9wIG9mIHRoZSBmaXJzdCBuYXRpdmUgaGFuZGxlciBmdW5jdGlvbi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBleGlzdGluZ0xpc3RlbmVyID0gbnVsbDsKICAgICAgICAgICAgICAgIC8vIFBsZWFzZSBub3RlIHRoYXQgdGhlIGNvYWxlc2NpbmcgZGVzY3JpYmVkIGhlcmUgZG9lc24ndCBoYXBwZW4gZm9yIGV2ZW50cyBzcGVjaWZ5aW5nIGFuCiAgICAgICAgICAgICAgICAvLyBhbHRlcm5hdGl2ZSB0YXJnZXQgKGV4LiAoZG9jdW1lbnQ6Y2xpY2spKSAtIHRoaXMgaXMgdG8ga2VlcCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHdpdGggdGhlCiAgICAgICAgICAgICAgICAvLyB2aWV3IGVuZ2luZS4KICAgICAgICAgICAgICAgIC8vIEFsc28sIHdlIGRvbid0IGhhdmUgdG8gc2VhcmNoIGZvciBleGlzdGluZyBsaXN0ZW5lcnMgaXMgdGhlcmUgYXJlIG5vIGRpcmVjdGl2ZXMKICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIG9uIGEgZ2l2ZW4gbm9kZSBhcyB3ZSBjYW4ndCByZWdpc3RlciBtdWx0aXBsZSBldmVudCBoYW5kbGVycyBmb3IgdGhlIHNhbWUgZXZlbnQgaW4KICAgICAgICAgICAgICAgIC8vIGEgdGVtcGxhdGUgKHRoaXMgd291bGQgbWVhbiBoYXZpbmcgZHVwbGljYXRlIGF0dHJpYnV0ZXMpLgogICAgICAgICAgICAgICAgaWYgKCFldmVudFRhcmdldFJlc29sdmVyICYmIGlzVE5vZGVEaXJlY3RpdmVIb3N0KSB7CiAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdMaXN0ZW5lciA9IGZpbmRFeGlzdGluZ0xpc3RlbmVyKHRWaWV3LCBsVmlldywgZXZlbnROYW1lLCB0Tm9kZS5pbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdMaXN0ZW5lciAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCBhIG5ldyBsaXN0ZW5lciB0byBjb2FsZXNjZWQgbGlzdGVuZXJzIGxpc3QsIG1haW50YWluaW5nIHRoZSBvcmRlciBpbiB3aGljaAogICAgICAgICAgICAgICAgICAgIC8vIGxpc3RlbmVycyBhcmUgcmVnaXN0ZXJlZC4gRm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMsIHdlIGtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIGxhc3QKICAgICAgICAgICAgICAgICAgICAvLyBsaXN0ZW5lciBpbiB0aGF0IGxpc3QgKGluIGBfX25nTGFzdExpc3RlbmVyRm5fX2AgZmllbGQpLCBzbyB3ZSBjYW4gYXZvaWQgZ29pbmcgdGhyb3VnaAogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBlbnRpcmUgc2V0IGVhY2ggdGltZSB3ZSBuZWVkIHRvIGFkZCBhIG5ldyBsaXN0ZW5lci4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbGFzdExpc3RlbmVyRm4gPSAoKC8qKiBAdHlwZSB7P30gKi8gKGV4aXN0aW5nTGlzdGVuZXIpKSkuX19uZ0xhc3RMaXN0ZW5lckZuX18gfHwgZXhpc3RpbmdMaXN0ZW5lcjsKICAgICAgICAgICAgICAgICAgICBsYXN0TGlzdGVuZXJGbi5fX25nTmV4dExpc3RlbmVyRm5fXyA9IGxpc3RlbmVyRm47CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChleGlzdGluZ0xpc3RlbmVyKSkpLl9fbmdMYXN0TGlzdGVuZXJGbl9fID0gbGlzdGVuZXJGbjsKICAgICAgICAgICAgICAgICAgICBwcm9jZXNzT3V0cHV0cyA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGFyZ3VtZW50IG9mIGBsaXN0ZW5gIGZ1bmN0aW9uIGluIFByb2NlZHVyYWwgUmVuZGVyZXIgaXM6CiAgICAgICAgICAgICAgICAgICAgLy8gLSBlaXRoZXIgYSB0YXJnZXQgbmFtZSAoYXMgYSBzdHJpbmcpIGluIGNhc2Ugb2YgZ2xvYmFsIHRhcmdldCAod2luZG93LCBkb2N1bWVudCwgYm9keSkKICAgICAgICAgICAgICAgICAgICAvLyAtIG9yIGVsZW1lbnQgcmVmZXJlbmNlIChpbiBhbGwgb3RoZXIgY2FzZXMpCiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJGbiA9IHdyYXBMaXN0ZW5lcih0Tm9kZSwgbFZpZXcsIGxpc3RlbmVyRm4sIGZhbHNlIC8qKiBwcmV2ZW50RGVmYXVsdCAqLyk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsZWFudXBGbiA9IHJlbmRlcmVyLmxpc3RlbihyZXNvbHZlZC5uYW1lIHx8IHRhcmdldCwgZXZlbnROYW1lLCBsaXN0ZW5lckZuKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQWRkRXZlbnRMaXN0ZW5lcisrOwogICAgICAgICAgICAgICAgICAgIGxDbGVhbnVwLnB1c2gobGlzdGVuZXJGbiwgY2xlYW51cEZuKTsKICAgICAgICAgICAgICAgICAgICB0Q2xlYW51cCAmJiB0Q2xlYW51cC5wdXNoKGV2ZW50TmFtZSwgaWR4T3JUYXJnZXRHZXR0ZXIsIGxDbGVhbnVwSW5kZXgsIGxDbGVhbnVwSW5kZXggKyAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVyRm4gPSB3cmFwTGlzdGVuZXIodE5vZGUsIGxWaWV3LCBsaXN0ZW5lckZuLCB0cnVlIC8qKiBwcmV2ZW50RGVmYXVsdCAqLyk7CiAgICAgICAgICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGxpc3RlbmVyRm4sIHVzZUNhcHR1cmUpOwogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckFkZEV2ZW50TGlzdGVuZXIrKzsKICAgICAgICAgICAgICAgIGxDbGVhbnVwLnB1c2gobGlzdGVuZXJGbik7CiAgICAgICAgICAgICAgICB0Q2xlYW51cCAmJiB0Q2xlYW51cC5wdXNoKGV2ZW50TmFtZSwgaWR4T3JUYXJnZXRHZXR0ZXIsIGxDbGVhbnVwSW5kZXgsIHVzZUNhcHR1cmUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIHN1YnNjcmliZSB0byBkaXJlY3RpdmUgb3V0cHV0cwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvdXRwdXRzID0gdE5vZGUub3V0cHV0czsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByb3BzOwogICAgICAgIGlmIChwcm9jZXNzT3V0cHV0cyAmJiBvdXRwdXRzICE9PSBudWxsICYmIChwcm9wcyA9IG91dHB1dHNbZXZlbnROYW1lXSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm9wc0xlbmd0aCA9IHByb3BzLmxlbmd0aDsKICAgICAgICAgICAgaWYgKHByb3BzTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb3BzTGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAocHJvcHNbaV0pKTsKICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWluaWZpZWROYW1lID0gcHJvcHNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVJbnN0YW5jZSA9IGxWaWV3W2luZGV4XTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0gZGlyZWN0aXZlSW5zdGFuY2VbbWluaWZpZWROYW1lXTsKICAgICAgICAgICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmICFpc09ic2VydmFibGUkMShvdXRwdXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQE91dHB1dCAke21pbmlmaWVkTmFtZX0gbm90IGluaXRpYWxpemVkIGluICcke2RpcmVjdGl2ZUluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWV9Jy5gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IG91dHB1dC5zdWJzY3JpYmUobGlzdGVuZXJGbik7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IGxDbGVhbnVwLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBsQ2xlYW51cC5wdXNoKGxpc3RlbmVyRm4sIHN1YnNjcmlwdGlvbik7CiAgICAgICAgICAgICAgICAgICAgdENsZWFudXAgJiYgdENsZWFudXAucHVzaChldmVudE5hbWUsIHROb2RlLmluZGV4LCBpZHgsIC0oaWR4ICsgMSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyRm4KICAgICAqIEBwYXJhbSB7P30gZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXhlY3V0ZUxpc3RlbmVyV2l0aEVycm9ySGFuZGxpbmcobFZpZXcsIGxpc3RlbmVyRm4sIGUpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICAvLyBPbmx5IGV4cGxpY2l0bHkgcmV0dXJuaW5nIGZhbHNlIGZyb20gYSBsaXN0ZW5lciBzaG91bGQgcHJldmVudERlZmF1bHQKICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyRm4oZSkgIT09IGZhbHNlOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgaGFuZGxlRXJyb3IobFZpZXcsIGVycm9yKTsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogV3JhcHMgYW4gZXZlbnQgbGlzdGVuZXIgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgbWFya3MgYW5jZXN0b3JzIGRpcnR5IGFuZCBwcmV2ZW50cyBkZWZhdWx0IGJlaGF2aW9yLAogICAgICogaWYgYXBwbGljYWJsZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHROb2RlIFRoZSBUTm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBsaXN0ZW5lcgogICAgICogQHBhcmFtIHs/fSBsVmlldyBUaGUgTFZpZXcgdGhhdCBjb250YWlucyB0aGlzIGxpc3RlbmVyCiAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyRm4gVGhlIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIGNhbGwKICAgICAqIEBwYXJhbSB7P30gd3JhcFdpdGhQcmV2ZW50RGVmYXVsdCBXaGV0aGVyIG9yIG5vdCB0byBwcmV2ZW50IGRlZmF1bHQgYmVoYXZpb3IKICAgICAqICh0aGUgcHJvY2VkdXJhbCByZW5kZXJlciBkb2VzIHRoaXMgYWxyZWFkeSwgc28gaW4gdGhvc2UgY2FzZXMsIHdlIHNob3VsZCBza2lwKQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gd3JhcExpc3RlbmVyKHROb2RlLCBsVmlldywgbGlzdGVuZXJGbiwgd3JhcFdpdGhQcmV2ZW50RGVmYXVsdCkgewogICAgICAgIC8vIE5vdGU6IHdlIGFyZSBwZXJmb3JtaW5nIG1vc3Qgb2YgdGhlIHdvcmsgaW4gdGhlIGxpc3RlbmVyIGZ1bmN0aW9uIGl0c2VsZgogICAgICAgIC8vIHRvIG9wdGltaXplIGxpc3RlbmVyIHJlZ2lzdHJhdGlvbi4KICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gd3JhcExpc3RlbmVySW5fbWFya0RpcnR5QW5kUHJldmVudERlZmF1bHQoZSkgewogICAgICAgICAgICAvLyBJdnkgdXNlcyBgRnVuY3Rpb25gIGFzIGEgc3BlY2lhbCB0b2tlbiB0aGF0IGFsbG93cyB1cyB0byB1bndyYXAgdGhlIGZ1bmN0aW9uCiAgICAgICAgICAgIC8vIHNvIHRoYXQgaXQgY2FuIGJlIGludm9rZWQgcHJvZ3JhbW1hdGljYWxseSBieSBgRGVidWdOb2RlLnRyaWdnZXJFdmVudEhhbmRsZXJgLgogICAgICAgICAgICBpZiAoZSA9PT0gRnVuY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiBsaXN0ZW5lckZuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEluIG9yZGVyIHRvIGJlIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGggVmlldyBFbmdpbmUsIGV2ZW50cyBvbiBjb21wb25lbnQgaG9zdCBub2RlcwogICAgICAgICAgICAvLyBtdXN0IGFsc28gbWFyayB0aGUgY29tcG9uZW50IHZpZXcgaXRzZWxmIGRpcnR5IChpLmUuIHRoZSB2aWV3IHRoYXQgaXQgb3ducykuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhcnRWaWV3ID0gdE5vZGUuZmxhZ3MgJiAyIC8qIGlzQ29tcG9uZW50SG9zdCAqLyA/CiAgICAgICAgICAgICAgICBnZXRDb21wb25lbnRMVmlld0J5SW5kZXgodE5vZGUuaW5kZXgsIGxWaWV3KSA6CiAgICAgICAgICAgICAgICBsVmlldzsKICAgICAgICAgICAgLy8gU2VlIGludGVyZmFjZXMvdmlldy50cyBmb3IgbW9yZSBvbiBMVmlld0ZsYWdzLk1hbnVhbE9uUHVzaAogICAgICAgICAgICBpZiAoKGxWaWV3W0ZMQUdTXSAmIDMyIC8qIE1hbnVhbE9uUHVzaCAqLykgPT09IDApIHsKICAgICAgICAgICAgICAgIG1hcmtWaWV3RGlydHkoc3RhcnRWaWV3KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZXN1bHQgPSBleGVjdXRlTGlzdGVuZXJXaXRoRXJyb3JIYW5kbGluZyhsVmlldywgbGlzdGVuZXJGbiwgZSk7CiAgICAgICAgICAgIC8vIEEganVzdC1pbnZva2VkIGxpc3RlbmVyIGZ1bmN0aW9uIG1pZ2h0IGhhdmUgY29hbGVzY2VkIGxpc3RlbmVycyBzbyB3ZSBuZWVkIHRvIGNoZWNrIGZvcgogICAgICAgICAgICAvLyB0aGVpciBwcmVzZW5jZSBhbmQgaW52b2tlIGFzIG5lZWRlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbmV4dExpc3RlbmVyRm4gPSAoKC8qKiBAdHlwZSB7P30gKi8gKHdyYXBMaXN0ZW5lckluX21hcmtEaXJ0eUFuZFByZXZlbnREZWZhdWx0KSkpLl9fbmdOZXh0TGlzdGVuZXJGbl9fOwogICAgICAgICAgICB3aGlsZSAobmV4dExpc3RlbmVyRm4pIHsKICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZCBwcmV2ZW50IGRlZmF1bHQgaWYgYW55IG9mIHRoZSBsaXN0ZW5lcnMgZXhwbGljaXRseSByZXR1cm4gZmFsc2UKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGV4ZWN1dGVMaXN0ZW5lcldpdGhFcnJvckhhbmRsaW5nKGxWaWV3LCBuZXh0TGlzdGVuZXJGbiwgZSkgJiYgcmVzdWx0OwogICAgICAgICAgICAgICAgbmV4dExpc3RlbmVyRm4gPSAoKC8qKiBAdHlwZSB7P30gKi8gKG5leHRMaXN0ZW5lckZuKSkpLl9fbmdOZXh0TGlzdGVuZXJGbl9fOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3cmFwV2l0aFByZXZlbnREZWZhdWx0ICYmIHJlc3VsdCA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIC8vIE5lY2Vzc2FyeSBmb3IgbGVnYWN5IGJyb3dzZXJzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBwcmV2ZW50RGVmYXVsdCAoZS5nLiBJRSkKICAgICAgICAgICAgICAgIGUucmV0dXJuVmFsdWUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvbmFtZXNwYWNlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL25leHRfY29udGV4dC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIGNvbnRleHQgYXQgdGhlIGxldmVsIHNwZWNpZmllZCBhbmQgc2F2ZXMgaXQgYXMgdGhlIGdsb2JhbCwgY29udGV4dFZpZXdEYXRhLgogICAgICogV2lsbCBnZXQgdGhlIG5leHQgbGV2ZWwgdXAgaWYgbGV2ZWwgaXMgbm90IHNwZWNpZmllZC4KICAgICAqCiAgICAgKiBUaGlzIGlzIHVzZWQgdG8gc2F2ZSBjb250ZXh0cyBvZiBwYXJlbnQgdmlld3Mgc28gdGhleSBjYW4gYmUgYm91bmQgaW4gZW1iZWRkZWQgdmlld3MsIG9yCiAgICAgKiBpbiBjb25qdW5jdGlvbiB3aXRoIHJlZmVyZW5jZSgpIHRvIGJpbmQgYSByZWYgZnJvbSBhIHBhcmVudCB2aWV3LgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7Pz19IGxldmVsIFRoZSByZWxhdGl2ZSBsZXZlbCBvZiB0aGUgdmlldyBmcm9tIHdoaWNoIHRvIGdyYWIgY29udGV4dCBjb21wYXJlZCB0byBjb250ZXh0VmV3RGF0YQogICAgICogQHJldHVybiB7P30gY29udGV4dAogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtW5leHRDb250ZXh0KGxldmVsID0gMSkgewogICAgICAgIHJldHVybiBuZXh0Q29udGV4dEltcGwobGV2ZWwpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvcHJvamVjdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIENoZWNrcyBhIGdpdmVuIG5vZGUgYWdhaW5zdCBtYXRjaGluZyBwcm9qZWN0aW9uIHNsb3RzIGFuZCByZXR1cm5zIHRoZQogICAgICogZGV0ZXJtaW5lZCBzbG90IGluZGV4LiBSZXR1cm5zICJudWxsIiBpZiBubyBzbG90IG1hdGNoZWQgdGhlIGdpdmVuIG5vZGUuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiB0YWtlcyBpbnRvIGFjY291bnQgdGhlIHBhcnNlZCBuZ1Byb2plY3RBcyBzZWxlY3RvciBmcm9tIHRoZQogICAgICogbm9kZSdzIGF0dHJpYnV0ZXMuIElmIHByZXNlbnQsIGl0IHdpbGwgY2hlY2sgd2hldGhlciB0aGUgbmdQcm9qZWN0QXMgc2VsZWN0b3IKICAgICAqIG1hdGNoZXMgYW55IG9mIHRoZSBwcm9qZWN0aW9uIHNsb3Qgc2VsZWN0b3JzLgogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBwcm9qZWN0aW9uU2xvdHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hdGNoaW5nUHJvamVjdGlvblNsb3RJbmRleCh0Tm9kZSwgcHJvamVjdGlvblNsb3RzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdQcm9qZWN0QXNBdHRyVmFsID0gZ2V0UHJvamVjdEFzQXR0clZhbHVlKHROb2RlKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByb2plY3Rpb25TbG90cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNsb3RWYWx1ZSA9IHByb2plY3Rpb25TbG90c1tpXTsKICAgICAgICAgICAgLy8gVGhlIGxhc3Qgd2lsZGNhcmQgcHJvamVjdGlvbiBzbG90IHNob3VsZCBtYXRjaCBhbGwgbm9kZXMgd2hpY2ggYXJlbid0IG1hdGNoaW5nCiAgICAgICAgICAgIC8vIGFueSBzZWxlY3Rvci4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gYmUgYmFja3dhcmRzIGNvbXBhdGlibGUgd2l0aCB2aWV3IGVuZ2luZS4KICAgICAgICAgICAgaWYgKHNsb3RWYWx1ZSA9PT0gJyonKSB7CiAgICAgICAgICAgICAgICB3aWxkY2FyZE5nQ29udGVudEluZGV4ID0gaTsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHdlIHJhbiBpbnRvIGFuIGBuZ1Byb2plY3RBc2AgYXR0cmlidXRlLCB3ZSBzaG91bGQgbWF0Y2ggaXRzIHBhcnNlZCBzZWxlY3RvcgogICAgICAgICAgICAvLyB0byB0aGUgbGlzdCBvZiBzZWxlY3RvcnMsIG90aGVyd2lzZSB3ZSBmYWxsIGJhY2sgdG8gbWF0Y2hpbmcgYWdhaW5zdCB0aGUgbm9kZS4KICAgICAgICAgICAgaWYgKG5nUHJvamVjdEFzQXR0clZhbCA9PT0gbnVsbCA/CiAgICAgICAgICAgICAgICBpc05vZGVNYXRjaGluZ1NlbGVjdG9yTGlzdCh0Tm9kZSwgc2xvdFZhbHVlLCAvKiBpc1Byb2plY3Rpb25Nb2RlICovIHRydWUpIDoKICAgICAgICAgICAgICAgIGlzU2VsZWN0b3JJblNlbGVjdG9yTGlzdChuZ1Byb2plY3RBc0F0dHJWYWwsIHNsb3RWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOyAvLyBmaXJzdCBtYXRjaGluZyBzZWxlY3RvciAiY2FwdHVyZXMiIGEgZ2l2ZW4gbm9kZQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB3aWxkY2FyZE5nQ29udGVudEluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBJbnN0cnVjdGlvbiB0byBkaXN0cmlidXRlIHByb2plY3RhYmxlIG5vZGVzIGFtb25nIDxuZy1jb250ZW50PiBvY2N1cnJlbmNlcyBpbiBhIGdpdmVuIHRlbXBsYXRlLgogICAgICogSXQgdGFrZXMgYWxsIHRoZSBzZWxlY3RvcnMgZnJvbSB0aGUgZW50aXJlIGNvbXBvbmVudCdzIHRlbXBsYXRlIGFuZCBkZWNpZGVzIHdoZXJlCiAgICAgKiBlYWNoIHByb2plY3RlZCBub2RlIGJlbG9uZ3MgKGl0IHJlLWRpc3RyaWJ1dGVzIG5vZGVzIGFtb25nICJidWNrZXRzIiB3aGVyZSBlYWNoICJidWNrZXQiIGlzCiAgICAgKiBiYWNrZWQgYnkgYSBzZWxlY3RvcikuCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiByZXF1aXJlcyBDU1Mgc2VsZWN0b3JzIHRvIGJlIHByb3ZpZGVkIGluIDIgZm9ybXM6IHBhcnNlZCAoYnkgYSBjb21waWxlcikgYW5kIHRleHQsCiAgICAgKiB1bi1wYXJzZWQgZm9ybS4KICAgICAqCiAgICAgKiBUaGUgcGFyc2VkIGZvcm0gaXMgbmVlZGVkIGZvciBlZmZpY2llbnQgbWF0Y2hpbmcgb2YgYSBub2RlIGFnYWluc3QgYSBnaXZlbiBDU1Mgc2VsZWN0b3IuCiAgICAgKiBUaGUgdW4tcGFyc2VkLCB0ZXh0dWFsIGZvcm0gaXMgbmVlZGVkIGZvciBzdXBwb3J0IG9mIHRoZSBuZ1Byb2plY3RBcyBhdHRyaWJ1dGUuCiAgICAgKgogICAgICogSGF2aW5nIGEgQ1NTIHNlbGVjdG9yIGluIDIgZGlmZmVyZW50IGZvcm1hdHMgaXMgbm90IGlkZWFsLCBidXQgYWx0ZXJuYXRpdmVzIGhhdmUgZXZlbiBtb3JlCiAgICAgKiBkcmF3YmFja3M6CiAgICAgKiAtIGhhdmluZyBvbmx5IGEgdGV4dHVhbCBmb3JtIHdvdWxkIHJlcXVpcmUgcnVudGltZSBwYXJzaW5nIG9mIENTUyBzZWxlY3RvcnM7CiAgICAgKiAtIHdlIGNhbid0IGhhdmUgb25seSBhIHBhcnNlZCBhcyB3ZSBjYW4ndCByZS1jb25zdHJ1Y3QgdGV4dHVhbCBmb3JtIGZyb20gaXQgKGFzIGVudGVyZWQgYnkgYQogICAgICogdGVtcGxhdGUgYXV0aG9yKS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7Pz19IHByb2plY3Rpb25TbG90cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXByb2plY3Rpb25EZWYocHJvamVjdGlvblNsb3RzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TFZpZXcoKVtERUNMQVJBVElPTl9DT01QT05FTlRfVklFV11bVF9IT1NUXSkpOwogICAgICAgIGlmICghY29tcG9uZW50Tm9kZS5wcm9qZWN0aW9uKSB7CiAgICAgICAgICAgIC8vIElmIG5vIGV4cGxpY2l0IHByb2plY3Rpb24gc2xvdHMgYXJlIGRlZmluZWQsIGZhbGwgYmFjayB0byBhIHNpbmdsZQogICAgICAgICAgICAvLyBwcm9qZWN0aW9uIHNsb3Qgd2l0aCB0aGUgd2lsZGNhcmQgc2VsZWN0b3IuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnVtUHJvamVjdGlvblNsb3RzID0gcHJvamVjdGlvblNsb3RzID8gcHJvamVjdGlvblNsb3RzLmxlbmd0aCA6IDE7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvamVjdGlvbkhlYWRzID0gY29tcG9uZW50Tm9kZS5wcm9qZWN0aW9uID0KICAgICAgICAgICAgICAgIG5ld0FycmF5KG51bVByb2plY3Rpb25TbG90cywgKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGFpbHMgPSBwcm9qZWN0aW9uSGVhZHMuc2xpY2UoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29tcG9uZW50Q2hpbGQgPSBjb21wb25lbnROb2RlLmNoaWxkOwogICAgICAgICAgICB3aGlsZSAoY29tcG9uZW50Q2hpbGQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNsb3RJbmRleCA9IHByb2plY3Rpb25TbG90cyA/IG1hdGNoaW5nUHJvamVjdGlvblNsb3RJbmRleChjb21wb25lbnRDaGlsZCwgcHJvamVjdGlvblNsb3RzKSA6IDA7CiAgICAgICAgICAgICAgICBpZiAoc2xvdEluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhaWxzW3Nsb3RJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRhaWxzW3Nsb3RJbmRleF0pKS5wcm9qZWN0aW9uTmV4dCA9IGNvbXBvbmVudENoaWxkOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbkhlYWRzW3Nsb3RJbmRleF0gPSBjb21wb25lbnRDaGlsZDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGFpbHNbc2xvdEluZGV4XSA9IGNvbXBvbmVudENoaWxkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29tcG9uZW50Q2hpbGQgPSBjb21wb25lbnRDaGlsZC5uZXh0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGRlbGF5UHJvamVjdGlvbiA9IGZhbHNlOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXREZWxheVByb2plY3Rpb24odmFsdWUpIHsKICAgICAgICBkZWxheVByb2plY3Rpb24gPSB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogSW5zZXJ0cyBwcmV2aW91c2x5IHJlLWRpc3RyaWJ1dGVkIHByb2plY3RlZCBub2Rlcy4gVGhpcyBpbnN0cnVjdGlvbiBtdXN0IGJlIHByZWNlZGVkIGJ5IGEgY2FsbAogICAgICogdG8gdGhlIHByb2plY3Rpb25EZWYgaW5zdHJ1Y3Rpb24uCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IG5vZGVJbmRleAogICAgICogQHBhcmFtIHs/PX0gc2VsZWN0b3JJbmRleAogICAgICogQHBhcmFtIHs/PX0gYXR0cnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwcm9qZWN0aW9uKG5vZGVJbmRleCwgc2VsZWN0b3JJbmRleCA9IDAsIGF0dHJzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UHJvamVjdGlvbk5vZGUgPSBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBub2RlSW5kZXgsIDEgLyogUHJvamVjdGlvbiAqLywgbnVsbCwgYXR0cnMgfHwgbnVsbCk7CiAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIHZpZXdEYXRhW0hPU1RfTk9ERV0gYmVjYXVzZSBwcm9qZWN0aW9uIG5vZGVzIGNhbiBiZSBuZXN0ZWQgaW4gZW1iZWRkZWQgdmlld3MuCiAgICAgICAgaWYgKHRQcm9qZWN0aW9uTm9kZS5wcm9qZWN0aW9uID09PSBudWxsKQogICAgICAgICAgICB0UHJvamVjdGlvbk5vZGUucHJvamVjdGlvbiA9IHNlbGVjdG9ySW5kZXg7CiAgICAgICAgLy8gYDxuZy1jb250ZW50PmAgaGFzIG5vIGNvbnRlbnQKICAgICAgICBzZXRJc05vdFBhcmVudCgpOwogICAgICAgIC8vIFdlIG1pZ2h0IG5lZWQgdG8gZGVsYXkgdGhlIHByb2plY3Rpb24gb2Ygbm9kZXMgaWYgdGhleSBhcmUgaW4gdGhlIG1pZGRsZSBvZiBhbiBpMThuIGJsb2NrCiAgICAgICAgaWYgKCFkZWxheVByb2plY3Rpb24pIHsKICAgICAgICAgICAgLy8gcmUtZGlzdHJpYnV0aW9uIG9mIHByb2plY3RhYmxlIG5vZGVzIGlzIHN0b3JlZCBvbiBhIGNvbXBvbmVudCdzIHZpZXcgbGV2ZWwKICAgICAgICAgICAgYXBwbHlQcm9qZWN0aW9uKHRWaWV3LCBsVmlldywgdFByb2plY3Rpb25Ob2RlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9wcm9wZXJ0eV9pbnRlcnBvbGF0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIGEgbG9uZSBib3VuZCB2YWx1ZQogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0LCBhbiBubyBhZGRpdGlvbmFsIHRleHQKICAgICAqIHN1cnJvdW5kcyB0aGF0IGludGVycG9sYXRlZCB2YWx1ZToKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHRpdGxlPSJ7e3YwfX0iPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoJ3RpdGxlJywgdjApOwogICAgICogYGBgCiAgICAgKgogICAgICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICAgICAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAgICAgKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/PX0gc2FuaXRpemVyIEFuIG9wdGlvbmFsIHNhbml0aXplciBmdW5jdGlvbgogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZShwcm9wTmFtZSwgdjAsIHNhbml0aXplcikgewogICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMShwcm9wTmFtZSwgJycsIHYwLCAnJywgc2FuaXRpemVyKTsKICAgICAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgdGl0bGU9InByZWZpeHt7djB9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6OgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTEoJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogICAgICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICAgICAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUxKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBzdWZmaXgsIHNhbml0aXplcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSAxLCBwcmVmaXgsIHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTE7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCAyIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgdGl0bGU9InByZWZpeHt7djB9fS17e3YxfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyKCd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICAgICAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAgICAgKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyKHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gMiwgcHJlZml4LCBpMCwgc3VmZml4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMjsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDMgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAzIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUzKAogICAgICogJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogICAgICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICAgICAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMyhwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSAzLCBwcmVmaXgsIGkwLCBpMSwgc3VmZml4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMzsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA0IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNCgKICAgICAqICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICAgICAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAgICAgKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNChwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gNCwgcHJlZml4LCBpMCwgaTEsIGkyLCBzdWZmaXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU0OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNSgKICAgICAqICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICAgICAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAgICAgKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1KHByb3BOYW1lLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gNSwgcHJlZml4LCBpMCwgaTEsIGkyLCBpMywgc3VmZml4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDYgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA2IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOjoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU2KAogICAgICogICAgJ3RpdGxlJywgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogICAgICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICAgICAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNihwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICBzdG9yZVByb3BlcnR5QmluZGluZ01ldGFkYXRhKHRWaWV3LmRhdGEsIHROb2RlLCBwcm9wTmFtZSwgZ2V0QmluZGluZ0luZGV4KCkgLSA2LCBwcmVmaXgsIGkwLCBpMSwgaTIsIGkzLCBpNCwgc3VmZml4KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNjsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDcgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA3IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNygKICAgICAqICAgICd0aXRsZScsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogSWYgdGhlIHByb3BlcnR5IG5hbWUgYWxzbyBleGlzdHMgYXMgYW4gaW5wdXQgcHJvcGVydHkgb24gb25lIG9mIHRoZSBlbGVtZW50J3MgZGlyZWN0aXZlcywKICAgICAqIHRoZSBjb21wb25lbnQgcHJvcGVydHkgd2lsbCBiZSBzZXQgaW5zdGVhZCBvZiB0aGUgZWxlbWVudCBwcm9wZXJ0eS4gVGhpcyBjaGVjayBtdXN0CiAgICAgKiBiZSBjb25kdWN0ZWQgYXQgcnVudGltZSBzbyBjaGlsZCBjb21wb25lbnRzIHRoYXQgYWRkIG5ldyBgXEBJbnB1dHNgIGRvbid0IGhhdmUgdG8gYmUgcmUtY29tcGlsZWQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIFRoZSBuYW1lIG9mIHRoZSBwcm9wZXJ0eSB0byB1cGRhdGUKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY2IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNyhwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4LCBzYW5pdGl6ZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb243KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWRWYWx1ZSAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgaW50ZXJwb2xhdGVkVmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCBmYWxzZSk7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgc3RvcmVQcm9wZXJ0eUJpbmRpbmdNZXRhZGF0YSh0Vmlldy5kYXRhLCB0Tm9kZSwgcHJvcE5hbWUsIGdldEJpbmRpbmdJbmRleCgpIC0gNywgcHJlZml4LCBpMCwgaTEsIGkyLCBpMywgaTQsIGk1LCBzdWZmaXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXByb3BlcnR5SW50ZXJwb2xhdGU3OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggOCBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHRpdGxlPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOCgKICAgICAqICAndGl0bGUnLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIElmIHRoZSBwcm9wZXJ0eSBuYW1lIGFsc28gZXhpc3RzIGFzIGFuIGlucHV0IHByb3BlcnR5IG9uIG9uZSBvZiB0aGUgZWxlbWVudCdzIGRpcmVjdGl2ZXMsCiAgICAgKiB0aGUgY29tcG9uZW50IHByb3BlcnR5IHdpbGwgYmUgc2V0IGluc3RlYWQgb2YgdGhlIGVsZW1lbnQgcHJvcGVydHkuIFRoaXMgY2hlY2sgbXVzdAogICAgICogYmUgY29uZHVjdGVkIGF0IHJ1bnRpbWUgc28gY2hpbGQgY29tcG9uZW50cyB0aGF0IGFkZCBuZXcgYFxASW5wdXRzYCBkb24ndCBoYXZlIHRvIGJlIHJlLWNvbXBpbGVkLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZSBUaGUgbmFtZSBvZiB0aGUgcHJvcGVydHkgdG8gdXBkYXRlCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk2IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY3IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgc2FuaXRpemVyIGZ1bmN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlOChwcm9wTmFtZSwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgsIHNhbml0aXplcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgICAgICBpZiAoaW50ZXJwb2xhdGVkVmFsdWUgIT09IE5PX0NIQU5HRSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFNlbGVjdGVkVE5vZGUoKTsKICAgICAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIGludGVycG9sYXRlZFZhbHVlLCBsVmlld1tSRU5ERVJFUl0sIHNhbml0aXplciwgZmFsc2UpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIDgsIHByZWZpeCwgaTAsIGkxLCBpMiwgaTMsIGk0LCBpNSwgaTYsIHN1ZmZpeCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTg7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDkgb3IgbW9yZSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYKICAgICAqICB0aXRsZT0icHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19LXt7djd9fS17e3Y4fX0te3t2OX19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczo6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlVigKICAgICAqICAndGl0bGUnLCBbJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnLScsIHY5LAogICAgICogICdzdWZmaXgnXSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJZiB0aGUgcHJvcGVydHkgbmFtZSBhbHNvIGV4aXN0cyBhcyBhbiBpbnB1dCBwcm9wZXJ0eSBvbiBvbmUgb2YgdGhlIGVsZW1lbnQncyBkaXJlY3RpdmVzLAogICAgICogdGhlIGNvbXBvbmVudCBwcm9wZXJ0eSB3aWxsIGJlIHNldCBpbnN0ZWFkIG9mIHRoZSBlbGVtZW50IHByb3BlcnR5LiBUaGlzIGNoZWNrIG11c3QKICAgICAqIGJlIGNvbmR1Y3RlZCBhdCBydW50aW1lIHNvIGNoaWxkIGNvbXBvbmVudHMgdGhhdCBhZGQgbmV3IGBcQElucHV0c2AgZG9uJ3QgaGF2ZSB0byBiZSByZS1jb21waWxlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcE5hbWUgVGhlIG5hbWUgb2YgdGhlIHByb3BlcnR5IHRvIHVwZGF0ZS4KICAgICAqIEBwYXJhbSB7P30gdmFsdWVzIFRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBhbmQgdGhlIHN0cmluZ3MgaW5iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGggYQogICAgICogc3RyaW5nIHByZWZpeCBhbmQgZW5kaW5nIHdpdGggYSBzdHJpbmcgc3VmZml4LgogICAgICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBzYW5pdGl6ZXIgZnVuY3Rpb24KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXByb3BlcnR5SW50ZXJwb2xhdGVWKHByb3BOYW1lLCB2YWx1ZXMsIHNhbml0aXplcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvblYobFZpZXcsIHZhbHVlcyk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZFZhbHVlICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIGVsZW1lbnRQcm9wZXJ0eUludGVybmFsKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHByb3BOYW1lLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgbFZpZXdbUkVOREVSRVJdLCBzYW5pdGl6ZXIsIGZhbHNlKTsKICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW50ZXJwb2xhdGlvbkluQmV0d2VlbiA9IFt2YWx1ZXNbMF1dOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDI7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgICAgICBpbnRlcnBvbGF0aW9uSW5CZXR3ZWVuLnB1c2godmFsdWVzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBnZXRCaW5kaW5nSW5kZXgoKSAtIGludGVycG9sYXRpb25JbkJldHdlZW4ubGVuZ3RoICsgMSwgLi4uaW50ZXJwb2xhdGlvbkluQmV0d2Vlbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlVjsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFRoaXMgZmlsZSBjb250YWlucyByZXVzZWFibGUgImVtcHR5IiBzeW1ib2xzIHRoYXQgY2FuIGJlIHVzZWQgYXMgZGVmYXVsdCByZXR1cm4gdmFsdWVzCiAgICAgKiBpbiBkaWZmZXJlbnQgcGFydHMgb2YgdGhlIHJlbmRlcmluZyBjb2RlLiBCZWNhdXNlIHRoZSBzYW1lIHN5bWJvbHMgYXJlIHJldHVybmVkLCB0aGlzCiAgICAgKiBhbGxvd3MgZm9yIGlkZW50aXR5IGNoZWNrcyBhZ2FpbnN0IHRoZXNlIHZhbHVlcyB0byBiZSBjb25zaXN0ZW50bHkgdXNlZCBieSB0aGUgZnJhbWV3b3JrCiAgICAgKiBjb2RlLgogICAgICovCiAgICBjb25zdCBFTVBUWV9PQkokMSA9IHt9OwogICAgY29uc3QgRU1QVFlfQVJSQVkkMyA9IFtdOwogICAgLy8gZnJlZXppbmcgdGhlIHZhbHVlcyBwcmV2ZW50cyBhbnkgY29kZSBmcm9tIGFjY2lkZW50YWxseSBpbnNlcnRpbmcgbmV3IHZhbHVlcyBpbgogICAgaWYgKCh0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0Rldk1vZGUpICYmIGluaXROZ0Rldk1vZGUoKSkgewogICAgICAgIC8vIFRoZXNlIHByb3BlcnR5IGFjY2Vzc2VzIGNhbiBiZSBpZ25vcmVkIGJlY2F1c2UgbmdEZXZNb2RlIHdpbGwgYmUgc2V0IHRvIGZhbHNlCiAgICAgICAgLy8gd2hlbiBvcHRpbWl6aW5nIGNvZGUgYW5kIHRoZSB3aG9sZSBpZiBzdGF0ZW1lbnQgd2lsbCBiZSBkcm9wcGVkLgogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgICAgICBPYmplY3QuZnJlZXplKEVNUFRZX09CSiQxKTsKICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCiAgICAgICAgT2JqZWN0LmZyZWV6ZShFTVBUWV9BUlJBWSQzKTsKICAgIH0KICAgIC8qKgogICAgICogSW5zZXJ0IG5ldyBgdFN0eWxlVmFsdWVgIGF0IGBURGF0YWAgYW5kIGxpbmsgZXhpc3Rpbmcgc3R5bGUgYmluZGluZ3Mgc3VjaCB0aGF0IHdlIG1haW50YWluIGxpbmtlZAogICAgICogbGlzdCBvZiBzdHlsZXMgYW5kIGNvbXB1dGUgdGhlIGR1cGxpY2F0ZSBmbGFnLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZHVyaW5nIGBmaXJzdFVwZGF0ZVBhc3NgIG9ubHkgdG8gcG9wdWxhdGUgdGhlIGBUVmlldy5kYXRhYC4KICAgICAqCiAgICAgKiBUaGUgZnVuY3Rpb24gd29ya3MgYnkga2VlcGluZyB0cmFjayBvZiBgdFN0eWxpbmdSYW5nZWAgd2hpY2ggY29udGFpbnMgdHdvIHBvaW50ZXJzIHBvaW50aW5nIHRvCiAgICAgKiB0aGUgaGVhZC90YWlsIG9mIHRoZSB0ZW1wbGF0ZSBwb3J0aW9uIG9mIHRoZSBzdHlsZXMuCiAgICAgKiAgLSBpZiBgaXNIb3N0ID09PSBmYWxzZWAgKHdlIGFyZSB0ZW1wbGF0ZSkgdGhlbiBpbnNlcnRpb24gaXMgYXQgdGFpbCBvZiBgVFN0eWxpbmdSYW5nZWAKICAgICAqICAtIGlmIGBpc0hvc3QgPT09IHRydWVgICh3ZSBhcmUgaG9zdCBiaW5kaW5nKSB0aGVuIGluc2VydGlvbiBpcyBhdCBoZWFkIG9mIGBUU3R5bGluZ1JhbmdlYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gdERhdGEgVGhlIGBURGF0YWAgdG8gaW5zZXJ0IGludG8uCiAgICAgKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdHlsaW5nIGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5V2l0aFN0YXRpYwogICAgICogQHBhcmFtIHs/fSBpbmRleCBsb2NhdGlvbiBvZiB3aGVyZSBgdFN0eWxlVmFsdWVgIHNob3VsZCBiZSBzdG9yZWQgKGFuZCBsaW5rZWQgaW50byBsaXN0LikKICAgICAqIEBwYXJhbSB7P30gaXNIb3N0QmluZGluZyBgdHJ1ZWAgaWYgdGhlIGluc2VydGlvbiBpcyBmb3IgYSBgaG9zdEJpbmRpbmdgLiAoaW5zZXJ0aW9uIGlzIGluIGZyb250IG9mCiAgICAgKiAgICAgICAgICAgICAgIHRlbXBsYXRlLikKICAgICAqIEBwYXJhbSB7P30gaXNDbGFzc0JpbmRpbmcgVHJ1ZSBpZiB0aGUgYXNzb2NpYXRlZCBgdFN0eWxpbmdLZXlgIGFzIGEgYGNsYXNzYCBzdHlsaW5nLgogICAgICogICAgICAgICAgICAgICAgICAgICAgIGB0Tm9kZS5jbGFzc0JpbmRpbmdzYCBzaG91bGQgYmUgdXNlZCAob3IgYHROb2RlLnN0eWxlQmluZGluZ3NgIG90aGVyd2lzZS4pCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnNlcnRUU3R5bGluZ0JpbmRpbmcodERhdGEsIHROb2RlLCB0U3R5bGluZ0tleVdpdGhTdGF0aWMsIGluZGV4LCBpc0hvc3RCaW5kaW5nLCBpc0NsYXNzQmluZGluZykgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRGaXJzdFVwZGF0ZVBhc3MoZ2V0VFZpZXcoKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0QmluZGluZ3MgPSBpc0NsYXNzQmluZGluZyA/IHROb2RlLmNsYXNzQmluZGluZ3MgOiB0Tm9kZS5zdHlsZUJpbmRpbmdzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdG1wbEhlYWQgPSBnZXRUU3R5bGluZ1JhbmdlUHJldih0QmluZGluZ3MpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdG1wbFRhaWwgPSBnZXRUU3R5bGluZ1JhbmdlTmV4dCh0QmluZGluZ3MpOwogICAgICAgIHREYXRhW2luZGV4XSA9IHRTdHlsaW5nS2V5V2l0aFN0YXRpYzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMgPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRTdHlsaW5nS2V5OwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRTdHlsaW5nS2V5V2l0aFN0YXRpYykpIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGNhc2Ugd2hlbiB0aGUgYFRTdHlsaW5nS2V5YCBjb250YWlucyBzdGF0aWMgZmllbGRzIGFzIHdlbGwuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhdGljS2V5VmFsdWVBcnJheSA9ICgvKiogQHR5cGUgez99ICovICh0U3R5bGluZ0tleVdpdGhTdGF0aWMpKTsKICAgICAgICAgICAgdFN0eWxpbmdLZXkgPSBzdGF0aWNLZXlWYWx1ZUFycmF5WzFdOyAvLyB1bndyYXAuCiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgaWYgb3VyIGtleSBpcyBwcmVzZW50IGluIHRoZSBzdGF0aWMgc28gdGhhdCB3ZSBjYW4gbWFyayBpdCBhcyBkdXBsaWNhdGUuCiAgICAgICAgICAgIGlmICh0U3R5bGluZ0tleSA9PT0gbnVsbCB8fAogICAgICAgICAgICAgICAga2V5VmFsdWVBcnJheUluZGV4T2Yoc3RhdGljS2V5VmFsdWVBcnJheSwgKC8qKiBAdHlwZSB7P30gKi8gKHRTdHlsaW5nS2V5KSkpID4gMCkgewogICAgICAgICAgICAgICAgLy8gdFN0eWxpbmdLZXkgaXMgcHJlc2VudCBpbiB0aGUgc3RhdGljcywgbmVlZCB0byBtYXJrIGl0IGFzIGR1cGxpY2F0ZS4KICAgICAgICAgICAgICAgIGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0U3R5bGluZ0tleSA9IHRTdHlsaW5nS2V5V2l0aFN0YXRpYzsKICAgICAgICB9CiAgICAgICAgaWYgKGlzSG9zdEJpbmRpbmcpIHsKICAgICAgICAgICAgLy8gV2UgYXJlIGluc2VydGluZyBob3N0IGJpbmRpbmdzCiAgICAgICAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgdGVtcGxhdGUgYmluZGluZ3MgdGhlbiBgdGFpbGAgaXMgMC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYXNUZW1wbGF0ZUJpbmRpbmdzID0gdG1wbFRhaWwgIT09IDA7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgaW1wb3J0YW50IHRvIGtub3cgYmVjYXVzZSB0aGF0IG1lYW5zIHRoYXQgdGhlIGBoZWFkYCBjYW4ndCBwb2ludCB0byB0aGUgZmlyc3QKICAgICAgICAgICAgLy8gdGVtcGxhdGUgYmluZGluZ3MgKHRoZXJlIGFyZSBub25lLikgSW5zdGVhZCB0aGUgaGVhZCBwb2ludHMgdG8gdGhlIHRhaWwgb2YgdGhlIHRlbXBsYXRlLgogICAgICAgICAgICBpZiAoaGFzVGVtcGxhdGVCaW5kaW5ncykgewogICAgICAgICAgICAgICAgLy8gdGVtcGxhdGUgaGVhZCdzICJwcmV2IiB3aWxsIHBvaW50IHRvIGxhc3QgaG9zdCBiaW5kaW5nIG9yIHRvIDAgaWYgbm8gaG9zdCBiaW5kaW5ncyB5ZXQKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzTm9kZSA9IGdldFRTdHlsaW5nUmFuZ2VQcmV2KCgvKiogQHR5cGUgez99ICovICh0RGF0YVt0bXBsSGVhZCArIDFdKSkpOwogICAgICAgICAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHRvVFN0eWxpbmdSYW5nZShwcmV2aW91c05vZGUsIHRtcGxIZWFkKTsKICAgICAgICAgICAgICAgIC8vIGlmIGEgaG9zdCBiaW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5leHQgb2YgdGhhdCBob3N0CiAgICAgICAgICAgICAgICAvLyBiaW5kaW5nIHRvIHBvaW50IHRvIHRoaXMgb25lCiAgICAgICAgICAgICAgICBpZiAocHJldmlvdXNOb2RlICE9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHRlbXBsYXRlLXRhaWwgdmFsdWUgdG8gcG9pbnQgdG8gdXMuCiAgICAgICAgICAgICAgICAgICAgdERhdGFbcHJldmlvdXNOb2RlICsgMV0gPQogICAgICAgICAgICAgICAgICAgICAgICBzZXRUU3R5bGluZ1JhbmdlTmV4dCgoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbcHJldmlvdXNOb2RlICsgMV0pKSwgaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVGhlICJwcmV2aW91cyIgb2YgdGhlIHRlbXBsYXRlIGJpbmRpbmcgaGVhZCBzaG91bGQgcG9pbnQgdG8gdGhpcyBob3N0IGJpbmRpbmcKICAgICAgICAgICAgICAgIHREYXRhW3RtcGxIZWFkICsgMV0gPSBzZXRUU3R5bGluZ1JhbmdlUHJldigoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbdG1wbEhlYWQgKyAxXSkpLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0RGF0YVtpbmRleCArIDFdID0gdG9UU3R5bGluZ1JhbmdlKHRtcGxIZWFkLCAwKTsKICAgICAgICAgICAgICAgIC8vIGlmIGEgaG9zdCBiaW5kaW5nIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgd2UgbmVlZCB0byB1cGRhdGUgdGhlIG5leHQgb2YgdGhhdCBob3N0CiAgICAgICAgICAgICAgICAvLyBiaW5kaW5nIHRvIHBvaW50IHRvIHRoaXMgb25lCiAgICAgICAgICAgICAgICBpZiAodG1wbEhlYWQgIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUtdGFpbCB2YWx1ZSB0byBwb2ludCB0byB1cy4KICAgICAgICAgICAgICAgICAgICB0RGF0YVt0bXBsSGVhZCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZU5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxIZWFkICsgMV0pKSwgaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gaWYgd2UgZG9uJ3QgaGF2ZSB0ZW1wbGF0ZSwgdGhlIGhlYWQgcG9pbnRzIHRvIHRlbXBsYXRlLXRhaWwsIGFuZCBuZWVkcyB0byBiZSBhZHZhbmNlZC4KICAgICAgICAgICAgICAgIHRtcGxIZWFkID0gaW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFdlIGFyZSBpbnNlcnRpbmcgaW4gdGVtcGxhdGUgc2VjdGlvbi4KICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhpcyBiaW5kaW5nJ3MgInByZXZpb3VzIiB0byB0aGUgY3VycmVudCB0ZW1wbGF0ZSB0YWlsCiAgICAgICAgICAgIHREYXRhW2luZGV4ICsgMV0gPSB0b1RTdHlsaW5nUmFuZ2UodG1wbFRhaWwsIDApOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIGFzc2VydEVxdWFsKHRtcGxIZWFkICE9PSAwICYmIHRtcGxUYWlsID09PSAwLCBmYWxzZSwgJ0FkZGluZyB0ZW1wbGF0ZSBiaW5kaW5ncyBhZnRlciBob3N0QmluZGluZ3MgaXMgbm90IGFsbG93ZWQuJyk7CiAgICAgICAgICAgIGlmICh0bXBsSGVhZCA9PT0gMCkgewogICAgICAgICAgICAgICAgdG1wbEhlYWQgPSBpbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIHRoZSBwcmV2aW91cyB2YWx1ZSAibmV4dCIgdG8gcG9pbnQgdG8gdGhpcyBiaW5kaW5nCiAgICAgICAgICAgICAgICB0RGF0YVt0bXBsVGFpbCArIDFdID0gc2V0VFN0eWxpbmdSYW5nZU5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW3RtcGxUYWlsICsgMV0pKSwgaW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRtcGxUYWlsID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIC8vIE5vdyB3ZSBuZWVkIHRvIHVwZGF0ZSAvIGNvbXB1dGUgdGhlIGR1cGxpY2F0ZXMuCiAgICAgICAgLy8gU3RhcnRpbmcgd2l0aCBvdXIgbG9jYXRpb24gc2VhcmNoIHRvd2FyZHMgaGVhZCAobGVhc3QgcHJpb3JpdHkpCiAgICAgICAgaWYgKGlzS2V5RHVwbGljYXRlT2ZTdGF0aWMpIHsKICAgICAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHNldFRTdHlsaW5nUmFuZ2VQcmV2RHVwbGljYXRlKCgvKiogQHR5cGUgez99ICovICh0RGF0YVtpbmRleCArIDFdKSkpOwogICAgICAgIH0KICAgICAgICBtYXJrRHVwbGljYXRlcyh0RGF0YSwgdFN0eWxpbmdLZXksIGluZGV4LCB0cnVlKTsKICAgICAgICBtYXJrRHVwbGljYXRlcyh0RGF0YSwgdFN0eWxpbmdLZXksIGluZGV4LCBmYWxzZSk7CiAgICAgICAgbWFya0R1cGxpY2F0ZU9mUmVzaWR1YWxTdHlsaW5nKHROb2RlLCB0U3R5bGluZ0tleSwgdERhdGEsIGluZGV4LCBpc0NsYXNzQmluZGluZyk7CiAgICAgICAgdEJpbmRpbmdzID0gdG9UU3R5bGluZ1JhbmdlKHRtcGxIZWFkLCB0bXBsVGFpbCk7CiAgICAgICAgaWYgKGlzQ2xhc3NCaW5kaW5nKSB7CiAgICAgICAgICAgIHROb2RlLmNsYXNzQmluZGluZ3MgPSB0QmluZGluZ3M7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0Tm9kZS5zdHlsZUJpbmRpbmdzID0gdEJpbmRpbmdzOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTG9vayBpbnRvIHRoZSByZXNpZHVhbCBzdHlsaW5nIHRvIHNlZSBpZiB0aGUgY3VycmVudCBgdFN0eWxpbmdLZXlgIGlzIGR1cGxpY2F0ZSBvZiByZXNpZHVhbC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hlcmUgdGhlIHJlc2lkdWFsIGlzIHN0b3JlZC4KICAgICAqIEBwYXJhbSB7P30gdFN0eWxpbmdLZXkgYFRTdHlsaW5nS2V5YCB0byBzdG9yZS4KICAgICAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgYExWaWV3YC4KICAgICAqIEBwYXJhbSB7P30gaW5kZXggbG9jYXRpb24gb2Ygd2hlcmUgYHRTdHlsZVZhbHVlYCBzaG91bGQgYmUgc3RvcmVkIChhbmQgbGlua2VkIGludG8gbGlzdC4pCiAgICAgKiBAcGFyYW0gez99IGlzQ2xhc3NCaW5kaW5nIFRydWUgaWYgdGhlIGFzc29jaWF0ZWQgYHRTdHlsaW5nS2V5YCBhcyBhIGBjbGFzc2Agc3R5bGluZy4KICAgICAqICAgICAgICAgICAgICAgICAgICAgICBgdE5vZGUuY2xhc3NCaW5kaW5nc2Agc2hvdWxkIGJlIHVzZWQgKG9yIGB0Tm9kZS5zdHlsZUJpbmRpbmdzYCBvdGhlcndpc2UuKQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWFya0R1cGxpY2F0ZU9mUmVzaWR1YWxTdHlsaW5nKHROb2RlLCB0U3R5bGluZ0tleSwgdERhdGEsIGluZGV4LCBpc0NsYXNzQmluZGluZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNpZHVhbCA9IGlzQ2xhc3NCaW5kaW5nID8gdE5vZGUucmVzaWR1YWxDbGFzc2VzIDogdE5vZGUucmVzaWR1YWxTdHlsZXM7CiAgICAgICAgaWYgKHJlc2lkdWFsICE9IG51bGwgLyogb3IgdW5kZWZpbmVkICovICYmIHR5cGVvZiB0U3R5bGluZ0tleSA9PSAnc3RyaW5nJyAmJgogICAgICAgICAgICBrZXlWYWx1ZUFycmF5SW5kZXhPZihyZXNpZHVhbCwgdFN0eWxpbmdLZXkpID49IDApIHsKICAgICAgICAgICAgLy8gV2UgaGF2ZSBkdXBsaWNhdGUgaW4gdGhlIHJlc2lkdWFsIHNvIG1hcmsgb3Vyc2VsdmVzIGFzIGR1cGxpY2F0ZS4KICAgICAgICAgICAgdERhdGFbaW5kZXggKyAxXSA9IHNldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKCgvKiogQHR5cGUgez99ICovICh0RGF0YVtpbmRleCArIDFdKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogTWFya3MgYFRTdHlsZVZhbHVlYHMgYXMgZHVwbGljYXRlcyBpZiBhbm90aGVyIHN0eWxlIGJpbmRpbmcgaW4gdGhlIGxpc3QgaGFzIHRoZSBzYW1lCiAgICAgKiBgVFN0eWxlVmFsdWVgLgogICAgICoKICAgICAqIE5PVEU6IHRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgY2FsbGVkIHR3aWNlIG9uY2Ugd2l0aCBgaXNQcmV2RGlyYCBzZXQgdG8gYHRydWVgIGFuZCBvbmNlCiAgICAgKiB3aXRoIGl0IHNldCB0byBgZmFsc2VgIHRvIHNlYXJjaCBib3RoIHRoZSBwcmV2aW91cyBhcyB3ZWxsIGFzIG5leHQgaXRlbXMgaW4gdGhlIGxpc3QuCiAgICAgKgogICAgICogTm8gZHVwbGljYXRlIGNhc2UKICAgICAqIGBgYAogICAgICogICBbc3R5bGUuY29sb3JdCiAgICAgKiAgIFtzdHlsZS53aWR0aC5weF0gPDwtIGluZGV4CiAgICAgKiAgIFtzdHlsZS5oZWlnaHQucHhdCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJbiB0aGUgYWJvdmUgY2FzZSBhZGRpbmcgYFtzdHlsZS53aWR0aC5weF1gIHRvIHRoZSBleGlzdGluZyBgW3N0eWxlLmNvbG9yXWAgcHJvZHVjZXMgbm8KICAgICAqIGR1cGxpY2F0ZXMgYmVjYXVzZSBgd2lkdGhgIGlzIG5vdCBmb3VuZCBpbiBhbnkgb3RoZXIgcGFydCBvZiB0aGUgbGlua2VkIGxpc3QuCiAgICAgKgogICAgICogRHVwbGljYXRlIGNhc2UKICAgICAqIGBgYAogICAgICogICBbc3R5bGUuY29sb3JdCiAgICAgKiAgIFtzdHlsZS53aWR0aC5lbV0KICAgICAqICAgW3N0eWxlLndpZHRoLnB4XSA8PC0gaW5kZXgKICAgICAqIGBgYAogICAgICogSW4gdGhlIGFib3ZlIGNhc2UgYWRkaW5nIGBbc3R5bGUud2lkdGgucHhdYCB3aWxsIHByb2R1Y2UgYSBkdXBsaWNhdGUgd2l0aCBgW3N0eWxlLndpZHRoLmVtXWAKICAgICAqIGJlY2F1c2UgYHdpZHRoYCBpcyBmb3VuZCBpbiB0aGUgY2hhaW4uCiAgICAgKgogICAgICogTWFwIGNhc2UgMQogICAgICogYGBgCiAgICAgKiAgIFtzdHlsZS53aWR0aC5weF0KICAgICAqICAgW3N0eWxlLmNvbG9yXQogICAgICogICBbc3R5bGVdICA8PC0gaW5kZXgKICAgICAqIGBgYAogICAgICogSW4gdGhlIGFib3ZlIGNhc2UgYWRkaW5nIGBbc3R5bGVdYCB3aWxsIHByb2R1Y2UgYSBkdXBsaWNhdGUgd2l0aCBhbnkgb3RoZXIgYmluZGluZ3MgYmVjYXVzZQogICAgICogYFtzdHlsZV1gIGlzIGEgTWFwIGFuZCBhcyBzdWNoIGlzIGZ1bGx5IGR5bmFtaWMgYW5kIGNvdWxkIHByb2R1Y2UgYGNvbG9yYCBvciBgd2lkdGhgLgogICAgICoKICAgICAqIE1hcCBjYXNlIDIKICAgICAqIGBgYAogICAgICogICBbc3R5bGVdCiAgICAgKiAgIFtzdHlsZS53aWR0aC5weF0KICAgICAqICAgW3N0eWxlLmNvbG9yXSAgPDwtIGluZGV4CiAgICAgKiBgYGAKICAgICAqIEluIHRoZSBhYm92ZSBjYXNlIGFkZGluZyBgW3N0eWxlLmNvbG9yXWAgd2lsbCBwcm9kdWNlIGEgZHVwbGljYXRlIGJlY2F1c2UgdGhlcmUgaXMgYWxyZWFkeSBhCiAgICAgKiBgW3N0eWxlXWAgYmluZGluZyB3aGljaCBpcyBhIE1hcCBhbmQgYXMgc3VjaCBpcyBmdWxseSBkeW5hbWljIGFuZCBjb3VsZCBwcm9kdWNlIGBjb2xvcmAgb3IKICAgICAqIGB3aWR0aGAuCiAgICAgKgogICAgICogTk9URTogT25jZSBgW3N0eWxlXWAgKE1hcCkgaXMgYWRkZWQgaW50byB0aGUgc3lzdGVtIGFsbCB0aGluZ3MgYXJlIG1hcHBlZCBhcyBkdXBsaWNhdGVzLgogICAgICogTk9URTogV2UgdXNlIGBzdHlsZWAgYXMgZXhhbXBsZSwgYnV0IHNhbWUgbG9naWMgaXMgYXBwbGllZCB0byBgY2xhc3NgZXMgYXMgd2VsbC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGlzIHN0b3JlZC4KICAgICAqIEBwYXJhbSB7P30gdFN0eWxpbmdLZXkgYFRTdHlsaW5nS2V5UHJpbWl0aXZlYCB3aGljaCBjb250YWlucyB0aGUgdmFsdWUgdG8gY29tcGFyZSB0byBvdGhlciBrZXlzIGluCiAgICAgKiAgICAgICAgdGhlIGxpbmtlZCBsaXN0LgogICAgICogQHBhcmFtIHs/fSBpbmRleCBTdGFydGluZyBsb2NhdGlvbiBpbiB0aGUgbGlua2VkIGxpc3QgdG8gc2VhcmNoIGZyb20KICAgICAqIEBwYXJhbSB7P30gaXNQcmV2RGlyIERpcmVjdGlvbi4KICAgICAqICAgICAgICAtIGB0cnVlYCBmb3IgcHJldmlvdXMgKGxvd2VyIHByaW9yaXR5KTsKICAgICAqICAgICAgICAtIGBmYWxzZWAgZm9yIG5leHQgKGhpZ2hlciBwcmlvcml0eSkuCiAgICAgKiBAcGFyYW0gez99IGlzQ2xhc3NCaW5kaW5nCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXJrRHVwbGljYXRlcyh0RGF0YSwgdFN0eWxpbmdLZXksIGluZGV4LCBpc1ByZXZEaXIsIGlzQ2xhc3NCaW5kaW5nKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRTdHlsaW5nQXRJbmRleCA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtpbmRleCArIDFdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzTWFwID0gdFN0eWxpbmdLZXkgPT09IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjdXJzb3IgPSBpc1ByZXZEaXIgPyBnZXRUU3R5bGluZ1JhbmdlUHJldih0U3R5bGluZ0F0SW5kZXgpIDogZ2V0VFN0eWxpbmdSYW5nZU5leHQodFN0eWxpbmdBdEluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZvdW5kRHVwbGljYXRlID0gZmFsc2U7CiAgICAgICAgLy8gV2Uga2VlcCBpdGVyYXRpbmcgYXMgbG9uZyBhcyB3ZSBoYXZlIGEgY3Vyc29yCiAgICAgICAgLy8gQU5EIGVpdGhlcjoKICAgICAgICAvLyAtIHdlIGZvdW5kIHdoYXQgd2UgYXJlIGxvb2tpbmcgZm9yLCBPUgogICAgICAgIC8vIC0gd2UgYXJlIGEgbWFwIGluIHdoaWNoIGNhc2Ugd2UgaGF2ZSB0byBjb250aW51ZSBzZWFyY2hpbmcgZXZlbiBhZnRlciB3ZSBmaW5kIHdoYXQgd2Ugd2VyZQogICAgICAgIC8vICAgbG9va2luZyBmb3Igc2luY2Ugd2UgYXJlIGEgd2lsZCBjYXJkIGFuZCBldmVyeXRoaW5nIG5lZWRzIHRvIGJlIGZsaXBwZWQgdG8gZHVwbGljYXRlLgogICAgICAgIHdoaWxlIChjdXJzb3IgIT09IDAgJiYgKGZvdW5kRHVwbGljYXRlID09PSBmYWxzZSB8fCBpc01hcCkpIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKHREYXRhLCBjdXJzb3IpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRTdHlsaW5nVmFsdWVBdEN1cnNvciA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3JdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFN0eWxlUmFuZ2VBdEN1cnNvciA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtjdXJzb3IgKyAxXSkpOwogICAgICAgICAgICBpZiAoaXNTdHlsaW5nTWF0Y2godFN0eWxpbmdWYWx1ZUF0Q3Vyc29yLCB0U3R5bGluZ0tleSkpIHsKICAgICAgICAgICAgICAgIGZvdW5kRHVwbGljYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHREYXRhW2N1cnNvciArIDFdID0gaXNQcmV2RGlyID8gc2V0VFN0eWxpbmdSYW5nZU5leHREdXBsaWNhdGUodFN0eWxlUmFuZ2VBdEN1cnNvcikgOgogICAgICAgICAgICAgICAgICAgIHNldFRTdHlsaW5nUmFuZ2VQcmV2RHVwbGljYXRlKHRTdHlsZVJhbmdlQXRDdXJzb3IpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGN1cnNvciA9IGlzUHJldkRpciA/IGdldFRTdHlsaW5nUmFuZ2VQcmV2KHRTdHlsZVJhbmdlQXRDdXJzb3IpIDoKICAgICAgICAgICAgICAgIGdldFRTdHlsaW5nUmFuZ2VOZXh0KHRTdHlsZVJhbmdlQXRDdXJzb3IpOwogICAgICAgIH0KICAgICAgICBpZiAoZm91bmREdXBsaWNhdGUpIHsKICAgICAgICAgICAgLy8gaWYgd2UgZm91bmQgYSBkdXBsaWNhdGUsIHRoYW4gbWFyayBvdXJzZWx2ZXMuCiAgICAgICAgICAgIHREYXRhW2luZGV4ICsgMV0gPSBpc1ByZXZEaXIgPyBzZXRUU3R5bGluZ1JhbmdlUHJldkR1cGxpY2F0ZSh0U3R5bGluZ0F0SW5kZXgpIDoKICAgICAgICAgICAgICAgIHNldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRTdHlsaW5nQXRJbmRleCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIHR3byBgVFN0eWxpbmdLZXlgcyBhcmUgYSBtYXRjaC4KICAgICAqCiAgICAgKiBXaGVuIGNvbXB1dGluZyB3ZWF0aGVyIGEgYmluZGluZyBjb250YWlucyBhIGR1cGxpY2F0ZSwgd2UgbmVlZCB0byBjb21wYXJlIGlmIHRoZSBpbnN0cnVjdGlvbgogICAgICogYFRTdHlsaW5nS2V5YCBoYXMgYSBtYXRjaC4KICAgICAqCiAgICAgKiBIZXJlIGFyZSBleGFtcGxlcyBvZiBgVFN0eWxpbmdLZXlgcyB3aGljaCBtYXRjaCBnaXZlbiBgdFN0eWxpbmdLZXlDdXJzb3JgIGlzOgogICAgICogLSBgY29sb3JgCiAgICAgKiAgICAtIGBjb2xvcmAgICAgLy8gTWF0Y2ggYW5vdGhlciBjb2xvcgogICAgICogICAgLSBgbnVsbGAgICAgIC8vIFRoYXQgbWVhbnMgdGhhdCBgdFN0eWxpbmdLZXlgIGlzIGEgYGNsYXNzTWFwYC9gc3R5bGVNYXBgIGluc3RydWN0aW9uCiAgICAgKiAgICAtIGBbJycsICdjb2xvcicsICdvdGhlcicsIHRydWVdYCAvLyB3cmFwcGVkIGBjb2xvcmAgc28gbWF0Y2gKICAgICAqICAgIC0gYFsnJywgbnVsbCwgJ290aGVyJywgdHJ1ZV1gICAgICAgIC8vIHdyYXBwZWQgYG51bGxgIHNvIG1hdGNoCiAgICAgKiAgICAtIGBbJycsICd3aWR0aCcsICdjb2xvcicsICd2YWx1ZSddYCAvLyB3cmFwcGVkIHN0YXRpYyB2YWx1ZSBjb250YWlucyBhIG1hdGNoIG9uIGAnY29sb3InYAogICAgICogLSBgbnVsbGAgICAgICAgLy8gYHRTdHlsaW5nS2V5Q3Vyc29yYCBhbHdheXMgbWF0Y2ggYXMgaXQgaXMgYGNsYXNzTWFwYC9gc3R5bGVNYXBgIGluc3RydWN0aW9uCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0U3R5bGluZ0tleUN1cnNvcgogICAgICogQHBhcmFtIHs/fSB0U3R5bGluZ0tleQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNTdHlsaW5nTWF0Y2godFN0eWxpbmdLZXlDdXJzb3IsIHRTdHlsaW5nS2V5KSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vdEVxdWFsKEFycmF5LmlzQXJyYXkodFN0eWxpbmdLZXkpLCB0cnVlLCAnRXhwZWN0ZWQgdGhhdCBcJ3RTdHlsaW5nS2V5XCcgaGFzIGJlZW4gdW53cmFwcGVkJyk7CiAgICAgICAgaWYgKHRTdHlsaW5nS2V5Q3Vyc29yID09PSBudWxsIHx8IC8vIElmIHRoZSBjdXJzb3IgaXMgYG51bGxgIGl0IG1lYW5zIHRoYXQgd2UgaGF2ZSBtYXAgYXQgdGhhdAogICAgICAgICAgICAvLyBsb2NhdGlvbiBzbyB3ZSBtdXN0IGFzc3VtZSB0aGF0IHdlIGhhdmUgYSBtYXRjaC4KICAgICAgICAgICAgdFN0eWxpbmdLZXkgPT0gbnVsbCB8fCAvLyBJZiBgdFN0eWxpbmdLZXlgIGlzIGBudWxsYCB0aGVuIGl0IGlzIGEgbWFwIHRoZXJlZm9yIGFzc3VtZSB0aGF0IGl0CiAgICAgICAgICAgIC8vIGNvbnRhaW5zIGEgbWF0Y2guCiAgICAgICAgICAgIChBcnJheS5pc0FycmF5KHRTdHlsaW5nS2V5Q3Vyc29yKSA/IHRTdHlsaW5nS2V5Q3Vyc29yWzFdIDogdFN0eWxpbmdLZXlDdXJzb3IpID09PQogICAgICAgICAgICAgICAgdFN0eWxpbmdLZXkgLy8gSWYgdGhlIGtleXMgbWF0Y2ggZXhwbGljaXRseSB0aGFuIHdlIGFyZSBhIG1hdGNoLgogICAgICAgICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh0U3R5bGluZ0tleUN1cnNvcikgJiYgdHlwZW9mIHRTdHlsaW5nS2V5ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAvLyBpZiB3ZSBkaWQgbm90IGZpbmQgYSBtYXRjaCwgYnV0IGB0U3R5bGluZ0tleUN1cnNvcmAgaXMgYEtleVZhbHVlQXJyYXlgIHRoYXQgbWVhbnMgY3Vyc29yIGhhcwogICAgICAgICAgICAvLyBzdGF0aWNzIGFuZCB3ZSBuZWVkIHRvIGNoZWNrIHRob3NlIGFzIHdlbGwuCiAgICAgICAgICAgIHJldHVybiBrZXlWYWx1ZUFycmF5SW5kZXhPZih0U3R5bGluZ0tleUN1cnNvciwgdFN0eWxpbmdLZXkpID49CiAgICAgICAgICAgICAgICAwOyAvLyBzZWUgaWYgd2UgYXJlIG1hdGNoaW5nIHRoZSBrZXkKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLy8gR2xvYmFsIHN0YXRlIG9mIHRoZSBwYXJzZXIuIChUaGlzIG1ha2VzIHBhcnNlciBub24tcmVlbnRyYW50LCBidXQgdGhhdCBpcyBub3QgYW4gaXNzdWUpCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwYXJzZXJTdGF0ZSA9IHsKICAgICAgICB0ZXh0RW5kOiAwLAogICAgICAgIGtleTogMCwKICAgICAgICBrZXlFbmQ6IDAsCiAgICAgICAgdmFsdWU6IDAsCiAgICAgICAgdmFsdWVFbmQ6IDAsCiAgICB9OwogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGxhc3QgcGFyc2VkIGBrZXlgIG9mIHN0eWxlLgogICAgICogQHBhcmFtIHs/fSB0ZXh0IHRoZSB0ZXh0IHRvIHN1YnN0cmluZyB0aGUga2V5IGZyb20uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRMYXN0UGFyc2VkS2V5KHRleHQpIHsKICAgICAgICByZXR1cm4gdGV4dC5zdWJzdHJpbmcocGFyc2VyU3RhdGUua2V5LCBwYXJzZXJTdGF0ZS5rZXlFbmQpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGxhc3QgcGFyc2VkIGB2YWx1ZWAgb2Ygc3R5bGUuCiAgICAgKiBAcGFyYW0gez99IHRleHQgdGhlIHRleHQgdG8gc3Vic3RyaW5nIHRoZSBrZXkgZnJvbS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExhc3RQYXJzZWRWYWx1ZSh0ZXh0KSB7CiAgICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKHBhcnNlclN0YXRlLnZhbHVlLCBwYXJzZXJTdGF0ZS52YWx1ZUVuZCk7CiAgICB9CiAgICAvKioKICAgICAqIEluaXRpYWxpemVzIGBjbGFzc05hbWVgIHN0cmluZyBmb3IgcGFyc2luZyBhbmQgcGFyc2VzIHRoZSBmaXJzdCB0b2tlbi4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gdGhpcyBmb3JtYXQ6CiAgICAgKiBgYGAKICAgICAqIGZvciAobGV0IGkgPSBwYXJzZUNsYXNzTmFtZSh0ZXh0KTsgaSA+PSAwOyBpID0gcGFyc2VDbGFzc05hbWVOZXh0KHRleHQsIGkpKSB7CiAgICAgKiAgIGNvbnN0IGtleSA9IGdldExhc3RQYXJzZWRLZXkoKTsKICAgICAqICAgLi4uCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqIEBwYXJhbSB7P30gdGV4dCBgY2xhc3NOYW1lYCB0byBwYXJzZQogICAgICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VDbGFzc05hbWVOZXh0YCBzaG91bGQgcmVzdW1lLgogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUNsYXNzTmFtZSh0ZXh0KSB7CiAgICAgICAgcmVzZXRQYXJzZXJTdGF0ZSh0ZXh0KTsKICAgICAgICByZXR1cm4gcGFyc2VDbGFzc05hbWVOZXh0KHRleHQsIGNvbnN1bWVXaGl0ZXNwYWNlKHRleHQsIDAsIHBhcnNlclN0YXRlLnRleHRFbmQpKTsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2VzIG5leHQgYGNsYXNzTmFtZWAgdG9rZW4uCiAgICAgKgogICAgICogVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIHRoaXMgZm9ybWF0OgogICAgICogYGBgCiAgICAgKiBmb3IgKGxldCBpID0gcGFyc2VDbGFzc05hbWUodGV4dCk7IGkgPj0gMDsgaSA9IHBhcnNlQ2xhc3NOYW1lTmV4dCh0ZXh0LCBpKSkgewogICAgICogICBjb25zdCBrZXkgPSBnZXRMYXN0UGFyc2VkS2V5KCk7CiAgICAgKiAgIC4uLgogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0ZXh0IGBjbGFzc05hbWVgIHRvIHBhcnNlCiAgICAgKiBAcGFyYW0gez99IGluZGV4IHdoZXJlIHRoZSBwYXJzaW5nIHNob3VsZCByZXN1bWUuCiAgICAgKiBAcmV0dXJuIHs/fSBpbmRleCB3aGVyZSB0aGUgbmV4dCBpbnZvY2F0aW9uIG9mIGBwYXJzZUNsYXNzTmFtZU5leHRgIHNob3VsZCByZXN1bWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlQ2xhc3NOYW1lTmV4dCh0ZXh0LCBpbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlbmQgPSBwYXJzZXJTdGF0ZS50ZXh0RW5kOwogICAgICAgIGlmIChlbmQgPT09IGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiAtMTsKICAgICAgICB9CiAgICAgICAgaW5kZXggPSBwYXJzZXJTdGF0ZS5rZXlFbmQgPSBjb25zdW1lQ2xhc3NUb2tlbih0ZXh0LCBwYXJzZXJTdGF0ZS5rZXkgPSBpbmRleCwgZW5kKTsKICAgICAgICByZXR1cm4gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgaW5kZXgsIGVuZCk7CiAgICB9CiAgICAvKioKICAgICAqIEluaXRpYWxpemVzIGBjc3NUZXh0YCBzdHJpbmcgZm9yIHBhcnNpbmcgYW5kIHBhcnNlcyB0aGUgZmlyc3Qga2V5L3ZhbHVlcy4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgaW4gdGhpcyBmb3JtYXQ6CiAgICAgKiBgYGAKICAgICAqIGZvciAobGV0IGkgPSBwYXJzZVN0eWxlKHRleHQpOyBpID49IDA7IGkgPSBwYXJzZVN0eWxlTmV4dCh0ZXh0LCBpKSkpIHsKICAgICAqICAgY29uc3Qga2V5ID0gZ2V0TGFzdFBhcnNlZEtleSgpOwogICAgICogICBjb25zdCB2YWx1ZSA9IGdldExhc3RQYXJzZWRWYWx1ZSgpOwogICAgICogICAuLi4KICAgICAqIH0KICAgICAqIGBgYAogICAgICogQHBhcmFtIHs/fSB0ZXh0IGBjc3NUZXh0YCB0byBwYXJzZQogICAgICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VTdHlsZU5leHRgIHNob3VsZCByZXN1bWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlU3R5bGUodGV4dCkgewogICAgICAgIHJlc2V0UGFyc2VyU3RhdGUodGV4dCk7CiAgICAgICAgcmV0dXJuIHBhcnNlU3R5bGVOZXh0KHRleHQsIGNvbnN1bWVXaGl0ZXNwYWNlKHRleHQsIDAsIHBhcnNlclN0YXRlLnRleHRFbmQpKTsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2VzIHRoZSBuZXh0IGBjc3NUZXh0YCBrZXkvdmFsdWVzLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiB0aGlzIGZvcm1hdDoKICAgICAqIGBgYAogICAgICogZm9yIChsZXQgaSA9IHBhcnNlU3R5bGUodGV4dCk7IGkgPj0gMDsgaSA9IHBhcnNlU3R5bGVOZXh0KHRleHQsIGkpKSkgewogICAgICogICBjb25zdCBrZXkgPSBnZXRMYXN0UGFyc2VkS2V5KCk7CiAgICAgKiAgIGNvbnN0IHZhbHVlID0gZ2V0TGFzdFBhcnNlZFZhbHVlKCk7CiAgICAgKiAgIC4uLgogICAgICogfQogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGV4dCBgY3NzVGV4dGAgdG8gcGFyc2UKICAgICAqIEBwYXJhbSB7P30gc3RhcnRJbmRleAogICAgICogQHJldHVybiB7P30gaW5kZXggd2hlcmUgdGhlIG5leHQgaW52b2NhdGlvbiBvZiBgcGFyc2VTdHlsZU5leHRgIHNob3VsZCByZXN1bWUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlU3R5bGVOZXh0KHRleHQsIHN0YXJ0SW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZW5kID0gcGFyc2VyU3RhdGUudGV4dEVuZDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluZGV4ID0gcGFyc2VyU3RhdGUua2V5ID0gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgc3RhcnRJbmRleCwgZW5kKTsKICAgICAgICBpZiAoZW5kID09PSBpbmRleCkgewogICAgICAgICAgICAvLyB3ZSByZWFjaGVkIGFuIGVuZCBzbyBqdXN0IHF1aXQKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICBpbmRleCA9IHBhcnNlclN0YXRlLmtleUVuZCA9IGNvbnN1bWVTdHlsZUtleSh0ZXh0LCBpbmRleCwgZW5kKTsKICAgICAgICBpbmRleCA9IGNvbnN1bWVTZXBhcmF0b3IodGV4dCwgaW5kZXgsIGVuZCwgNTggLyogQ09MT04gKi8pOwogICAgICAgIGluZGV4ID0gcGFyc2VyU3RhdGUudmFsdWUgPSBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBpbmRleCwgZW5kKTsKICAgICAgICBpbmRleCA9IHBhcnNlclN0YXRlLnZhbHVlRW5kID0gY29uc3VtZVN0eWxlVmFsdWUodGV4dCwgaW5kZXgsIGVuZCk7CiAgICAgICAgcmV0dXJuIGNvbnN1bWVTZXBhcmF0b3IodGV4dCwgaW5kZXgsIGVuZCwgNTkgLyogU0VNSV9DT0xPTiAqLyk7CiAgICB9CiAgICAvKioKICAgICAqIFJlc2V0IHRoZSBnbG9iYWwgc3RhdGUgb2YgdGhlIHN0eWxpbmcgcGFyc2VyLgogICAgICogQHBhcmFtIHs/fSB0ZXh0IFRoZSBzdHlsaW5nIHRleHQgdG8gcGFyc2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNldFBhcnNlclN0YXRlKHRleHQpIHsKICAgICAgICBwYXJzZXJTdGF0ZS5rZXkgPSAwOwogICAgICAgIHBhcnNlclN0YXRlLmtleUVuZCA9IDA7CiAgICAgICAgcGFyc2VyU3RhdGUudmFsdWUgPSAwOwogICAgICAgIHBhcnNlclN0YXRlLnZhbHVlRW5kID0gMDsKICAgICAgICBwYXJzZXJTdGF0ZS50ZXh0RW5kID0gdGV4dC5sZW5ndGg7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgaW5kZXggb2YgbmV4dCBub24td2hpdGVzcGFjZSBjaGFyYWN0ZXIuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0ZXh0IFRleHQgdG8gc2NhbgogICAgICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAgICAgKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICAgICAqIEByZXR1cm4gez99IEluZGV4IG9mIG5leHQgbm9uLXdoaXRlc3BhY2UgY2hhcmFjdGVyIChNYXkgYmUgdGhlIHNhbWUgYXMgYHN0YXJ0YCBpZiBubyB3aGl0ZXNwYWNlIGF0CiAgICAgKiAgICAgICAgICB0aGF0IGxvY2F0aW9uLikKICAgICAqLwogICAgZnVuY3Rpb24gY29uc3VtZVdoaXRlc3BhY2UodGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgICAgICB3aGlsZSAoc3RhcnRJbmRleCA8IGVuZEluZGV4ICYmIHRleHQuY2hhckNvZGVBdChzdGFydEluZGV4KSA8PSAzMiAvKiBTUEFDRSAqLykgewogICAgICAgICAgICBzdGFydEluZGV4Kys7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdGFydEluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGluZGV4IG9mIGxhc3QgY2hhciBpbiBjbGFzcyB0b2tlbi4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRleHQgVGV4dCB0byBzY2FuCiAgICAgKiBAcGFyYW0gez99IHN0YXJ0SW5kZXggU3RhcnRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBzdGFydC4KICAgICAqIEBwYXJhbSB7P30gZW5kSW5kZXggRW5kaW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgZW5kLgogICAgICogQHJldHVybiB7P30gSW5kZXggYWZ0ZXIgbGFzdCBjaGFyIGluIGNsYXNzIHRva2VuLgogICAgICovCiAgICBmdW5jdGlvbiBjb25zdW1lQ2xhc3NUb2tlbih0ZXh0LCBzdGFydEluZGV4LCBlbmRJbmRleCkgewogICAgICAgIHdoaWxlIChzdGFydEluZGV4IDwgZW5kSW5kZXggJiYgdGV4dC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXgpID4gMzIgLyogU1BBQ0UgKi8pIHsKICAgICAgICAgICAgc3RhcnRJbmRleCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3VtZXMgYWxsIG9mIHRoZSBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byBzdHlsZSBrZXkgYW5kIHRva2VuLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGV4dCBUZXh0IHRvIHNjYW4KICAgICAqIEBwYXJhbSB7P30gc3RhcnRJbmRleCBTdGFydGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIHN0YXJ0LgogICAgICogQHBhcmFtIHs/fSBlbmRJbmRleCBFbmRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBlbmQuCiAgICAgKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBsYXN0IHN0eWxlIGtleSBjaGFyYWN0ZXIuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnN1bWVTdHlsZUtleSh0ZXh0LCBzdGFydEluZGV4LCBlbmRJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY2g7CiAgICAgICAgd2hpbGUgKHN0YXJ0SW5kZXggPCBlbmRJbmRleCAmJgogICAgICAgICAgICAoKGNoID0gdGV4dC5jaGFyQ29kZUF0KHN0YXJ0SW5kZXgpKSA9PT0gNDUgLyogREFTSCAqLyB8fCBjaCA9PT0gOTUgLyogVU5ERVJTQ09SRSAqLyB8fAogICAgICAgICAgICAgICAgKChjaCAmIC0zMyAvKiBVUFBFUl9DQVNFICovKSA+PSA2NSAvKiBBICovICYmIChjaCAmIC0zMyAvKiBVUFBFUl9DQVNFICovKSA8PSA5MCAvKiBaICovKSkpIHsKICAgICAgICAgICAgc3RhcnRJbmRleCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3VtZXMgYWxsIHdoaXRlc3BhY2UgYW5kIHRoZSBzZXBhcmF0b3IgYDpgIGFmdGVyIHRoZSBzdHlsZSBrZXkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0ZXh0IFRleHQgdG8gc2NhbgogICAgICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAgICAgKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICAgICAqIEBwYXJhbSB7P30gc2VwYXJhdG9yCiAgICAgKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBzZXBhcmF0b3IgYW5kIHN1cnJvdW5kaW5nIHdoaXRlc3BhY2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnN1bWVTZXBhcmF0b3IodGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgsIHNlcGFyYXRvcikgewogICAgICAgIHN0YXJ0SW5kZXggPSBjb25zdW1lV2hpdGVzcGFjZSh0ZXh0LCBzdGFydEluZGV4LCBlbmRJbmRleCk7CiAgICAgICAgaWYgKHN0YXJ0SW5kZXggPCBlbmRJbmRleCkgewogICAgICAgICAgICBpZiAobmdEZXZNb2RlICYmIHRleHQuY2hhckNvZGVBdChzdGFydEluZGV4KSAhPT0gc2VwYXJhdG9yKSB7CiAgICAgICAgICAgICAgICBtYWxmb3JtZWRTdHlsZUVycm9yKHRleHQsIFN0cmluZy5mcm9tQ2hhckNvZGUoc2VwYXJhdG9yKSwgc3RhcnRJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhcnRJbmRleCsrOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhcnRJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3VtZXMgc3R5bGUgdmFsdWUgaG9ub3JpbmcgYHVybCgpYCBhbmQgYCIiYCB0ZXh0LgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdGV4dCBUZXh0IHRvIHNjYW4KICAgICAqIEBwYXJhbSB7P30gc3RhcnRJbmRleCBTdGFydGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIHN0YXJ0LgogICAgICogQHBhcmFtIHs/fSBlbmRJbmRleCBFbmRpbmcgaW5kZXggb2YgY2hhcmFjdGVyIHdoZXJlIHRoZSBzY2FuIHNob3VsZCBlbmQuCiAgICAgKiBAcmV0dXJuIHs/fSBJbmRleCBhZnRlciBsYXN0IHN0eWxlIHZhbHVlIGNoYXJhY3Rlci4KICAgICAqLwogICAgZnVuY3Rpb24gY29uc3VtZVN0eWxlVmFsdWUodGV4dCwgc3RhcnRJbmRleCwgZW5kSW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNoMSA9IC0xOwogICAgICAgIC8vIDFzdCBwcmV2aW91cyBjaGFyYWN0ZXIKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNoMiA9IC0xOwogICAgICAgIC8vIDJuZCBwcmV2aW91cyBjaGFyYWN0ZXIKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNoMyA9IC0xOwogICAgICAgIC8vIDNyZCBwcmV2aW91cyBjaGFyYWN0ZXIKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGkgPSBzdGFydEluZGV4OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbGFzdENoSW5kZXggPSBpOwogICAgICAgIHdoaWxlIChpIDwgZW5kSW5kZXgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaCA9IHRleHQuY2hhckNvZGVBdChpKyspOwogICAgICAgICAgICBpZiAoY2ggPT09IDU5IC8qIFNFTUlfQ09MT04gKi8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBsYXN0Q2hJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChjaCA9PT0gMzQgLyogRE9VQkxFX1FVT1RFICovIHx8IGNoID09PSAzOSAvKiBTSU5HTEVfUVVPVEUgKi8pIHsKICAgICAgICAgICAgICAgIGxhc3RDaEluZGV4ID0gaSA9IGNvbnN1bWVRdW90ZWRUZXh0KHRleHQsIGNoLCBpLCBlbmRJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhcnRJbmRleCA9PT0KICAgICAgICAgICAgICAgIGkgLSA0ICYmIC8vIFdlIGhhdmUgc2VlbiBvbmx5IDQgY2hhcmFjdGVycyBzbyBmYXIgIlVSTCgiIChJZ25vcmUgImZvb19VUkwoKSIpCiAgICAgICAgICAgICAgICBjaDMgPT09IDg1IC8qIFUgKi8gJiYKICAgICAgICAgICAgICAgIGNoMiA9PT0gODIgLyogUiAqLyAmJiBjaDEgPT09IDc2IC8qIEwgKi8gJiYgY2ggPT09IDQwIC8qIE9QRU5fUEFSRU4gKi8pIHsKICAgICAgICAgICAgICAgIGxhc3RDaEluZGV4ID0gaSA9IGNvbnN1bWVRdW90ZWRUZXh0KHRleHQsIDQxIC8qIENMT1NFX1BBUkVOICovLCBpLCBlbmRJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY2ggPiAzMiAvKiBTUEFDRSAqLykgewogICAgICAgICAgICAgICAgLy8gaWYgd2UgaGF2ZSBhIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlciB0aGVuIGNhcHR1cmUgaXRzIGxvY2F0aW9uCiAgICAgICAgICAgICAgICBsYXN0Q2hJbmRleCA9IGk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2gzID0gY2gyOwogICAgICAgICAgICBjaDIgPSBjaDE7CiAgICAgICAgICAgIGNoMSA9IGNoICYgLTMzIC8qIFVQUEVSX0NBU0UgKi87CiAgICAgICAgfQogICAgICAgIHJldHVybiBsYXN0Q2hJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogQ29uc3VtZXMgYWxsIG9mIHRoZSBxdW90ZWQgY2hhcmFjdGVycy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRleHQgVGV4dCB0byBzY2FuCiAgICAgKiBAcGFyYW0gez99IHF1b3RlQ2hhckNvZGUgQ2hhckNvZGUgb2YgZWl0aGVyIGAiYCBvciBgJ2AgcXVvdGUgb3IgYClgIGZvciBgdXJsKC4uLilgLgogICAgICogQHBhcmFtIHs/fSBzdGFydEluZGV4IFN0YXJ0aW5nIGluZGV4IG9mIGNoYXJhY3RlciB3aGVyZSB0aGUgc2NhbiBzaG91bGQgc3RhcnQuCiAgICAgKiBAcGFyYW0gez99IGVuZEluZGV4IEVuZGluZyBpbmRleCBvZiBjaGFyYWN0ZXIgd2hlcmUgdGhlIHNjYW4gc2hvdWxkIGVuZC4KICAgICAqIEByZXR1cm4gez99IEluZGV4IGFmdGVyIHF1b3RlZCBjaGFyYWN0ZXJzLgogICAgICovCiAgICBmdW5jdGlvbiBjb25zdW1lUXVvdGVkVGV4dCh0ZXh0LCBxdW90ZUNoYXJDb2RlLCBzdGFydEluZGV4LCBlbmRJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY2gxID0gLTE7CiAgICAgICAgLy8gMXN0IHByZXZpb3VzIGNoYXJhY3RlcgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5kZXggPSBzdGFydEluZGV4OwogICAgICAgIHdoaWxlIChpbmRleCA8IGVuZEluZGV4KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2ggPSB0ZXh0LmNoYXJDb2RlQXQoaW5kZXgrKyk7CiAgICAgICAgICAgIGlmIChjaCA9PSBxdW90ZUNoYXJDb2RlICYmIGNoMSAhPT0gOTIgLyogQkFDS19TTEFTSCAqLykgewogICAgICAgICAgICAgICAgcmV0dXJuIGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaCA9PSA5MiAvKiBCQUNLX1NMQVNIICovICYmIGNoMSA9PT0gOTIgLyogQkFDS19TTEFTSCAqLykgewogICAgICAgICAgICAgICAgLy8gdHdvIGJhY2sgc2xhc2hlcyBjYW5jZWwgZWFjaCBvdGhlciBvdXQuIEZvciBleGFtcGxlIGAiXFwiYCBzaG91bGQgcHJvcGVybHkgZW5kIHRoZQogICAgICAgICAgICAgICAgLy8gcXVvdGF0aW9uLiAoSXQgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCB0aGUgbGFzdCBgImAgaXMgZXNjYXBlZC4pCiAgICAgICAgICAgICAgICBjaDEgPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY2gxID0gY2g7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3cgbmdEZXZNb2RlID8gbWFsZm9ybWVkU3R5bGVFcnJvcih0ZXh0LCBTdHJpbmcuZnJvbUNoYXJDb2RlKHF1b3RlQ2hhckNvZGUpLCBlbmRJbmRleCkgOgogICAgICAgICAgICBuZXcgRXJyb3IoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0ZXh0CiAgICAgKiBAcGFyYW0gez99IGV4cGVjdGluZwogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWFsZm9ybWVkU3R5bGVFcnJvcih0ZXh0LCBleHBlY3RpbmcsIGluZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydEVxdWFsKHR5cGVvZiB0ZXh0ID09PSAnc3RyaW5nJywgdHJ1ZSwgJ1N0cmluZyBleHBlY3RlZCBoZXJlJyk7CiAgICAgICAgdGhyb3cgdGhyb3dFcnJvciQxKGBNYWxmb3JtZWQgc3R5bGUgYXQgbG9jYXRpb24gJHtpbmRleH0gaW4gc3RyaW5nICdgICsgdGV4dC5zdWJzdHJpbmcoMCwgaW5kZXgpICsgJ1s+PicgKwogICAgICAgICAgICB0ZXh0LnN1YnN0cmluZyhpbmRleCwgaW5kZXggKyAxKSArICc8PF0nICsgdGV4dC5zdWJzdHIoaW5kZXggKyAxKSArCiAgICAgICAgICAgIGAnLiBFeHBlY3RpbmcgJyR7ZXhwZWN0aW5nfScuYCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luc3RydWN0aW9ucy9zdHlsaW5nLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogU2V0cyB0aGUgY3VycmVudCBzdHlsZSBzYW5pdGl6ZXIgZnVuY3Rpb24gd2hpY2ggd2lsbCB0aGVuIGJlIHVzZWQKICAgICAqIHdpdGhpbiBhbGwgZm9sbG93LXVwIHByb3AgYW5kIG1hcC1iYXNlZCBzdHlsZSBiaW5kaW5nIGluc3RydWN0aW9ucwogICAgICogZm9yIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICoKICAgICAqIE5vdGUgdGhhdCBvbmNlIHN0eWxpbmcgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgZWxlbWVudCAoaS5lLiBvbmNlCiAgICAgKiBgYWR2YW5jZShuKWAgaXMgZXhlY3V0ZWQgb3IgdGhlIGhvc3RCaW5kaW5ncy90ZW1wbGF0ZSBmdW5jdGlvbiBleGl0cykKICAgICAqIHRoZW4gdGhlIGFjdGl2ZSBgc2FuaXRpemVyRm5gIHdpbGwgYmUgc2V0IHRvIGBudWxsYC4gVGhpcyBtZWFucyB0aGF0CiAgICAgKiBvbmNlIHN0eWxpbmcgaXMgYXBwbGllZCB0byBhbm90aGVyIGVsZW1lbnQgdGhlbiBhIGFub3RoZXIgY2FsbCB0bwogICAgICogYHN0eWxlU2FuaXRpemVyYCB3aWxsIG5lZWQgdG8gYmUgbWFkZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2FuaXRpemVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVTYW5pdGl6ZXIoc2FuaXRpemVyKSB7CiAgICAgICAgc2V0Q3VycmVudFN0eWxlU2FuaXRpemVyKHNhbml0aXplcik7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhIHN0eWxlIGJpbmRpbmcgb24gYW4gZWxlbWVudCB3aXRoIHRoZSBwcm92aWRlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBJZiB0aGUgc3R5bGUgdmFsdWUgaXMgZmFsc3kgdGhlbiBpdCB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudAogICAgICogKG9yIGFzc2lnbmVkIGEgZGlmZmVyZW50IHZhbHVlIGRlcGVuZGluZyBpZiB0aGVyZSBhcmUgYW55IHN0eWxlcyBwbGFjZWQKICAgICAqIG9uIHRoZSBlbGVtZW50IHdpdGggYHN0eWxlTWFwYCBvciBhbnkgc3RhdGljIHN0eWxlcyB0aGF0IGFyZQogICAgICogcHJlc2VudCBmcm9tIHdoZW4gdGhlIGVsZW1lbnQgd2FzIGNyZWF0ZWQgd2l0aCBgc3R5bGluZ2ApLgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGUgc3R5bGluZyBlbGVtZW50IGlzIHVwZGF0ZWQgYXMgcGFydCBvZiBgc3R5bGluZ0FwcGx5YC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcCBBIHZhbGlkIENTUyBwcm9wZXJ0eS4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUgTmV3IHZhbHVlIHRvIHdyaXRlIChgbnVsbGAgb3IgYW4gZW1wdHkgc3RyaW5nIHRvIHJlbW92ZSkuCiAgICAgKiBAcGFyYW0gez89fSBzdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAgICAgKiAgICAgICAgTm90ZSB0aGF0IHdoZW4gYSBzdWZmaXggaXMgcHJvdmlkZWQgdGhlbiB0aGUgdW5kZXJseWluZyBzYW5pdGl6ZXIgd2lsbAogICAgICogICAgICAgIGJlIGlnbm9yZWQuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBhcHBseSB0aGUgcHJvdmlkZWQgc3R5bGUgdmFsdWUgdG8gdGhlIGhvc3QgZWxlbWVudCBpZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZAogICAgICogd2l0aGluIGEgaG9zdCBiaW5kaW5nIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZVByb3AocHJvcCwgdmFsdWUsIHN1ZmZpeCkgewogICAgICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlLCBzdWZmaXgsIGZhbHNlKTsKICAgICAgICByZXR1cm4gybXJtXN0eWxlUHJvcDsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGEgY2xhc3MgYmluZGluZyBvbiBhbiBlbGVtZW50IHdpdGggdGhlIHByb3ZpZGVkIHZhbHVlLgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gaGFuZGxlIHRoZSBgW2NsYXNzLmZvb109ImV4cCJgIGNhc2UgYW5kLAogICAgICogdGhlcmVmb3JlLCB0aGUgY2xhc3MgYmluZGluZyBpdHNlbGYgbXVzdCBhbHJlYWR5IGJlIGFsbG9jYXRlZCB1c2luZwogICAgICogYHN0eWxpbmdgIHdpdGhpbiB0aGUgY3JlYXRpb24gYmxvY2suCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGNsYXNzTmFtZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBBIHRydWUvZmFsc2UgdmFsdWUgd2hpY2ggd2lsbCB0dXJuIHRoZSBjbGFzcyBvbiBvciBvZmYuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBhcHBseSB0aGUgcHJvdmlkZWQgY2xhc3MgdmFsdWUgdG8gdGhlIGhvc3QgZWxlbWVudCBpZiB0aGlzIGZ1bmN0aW9uCiAgICAgKiBpcyBjYWxsZWQgd2l0aGluIGEgaG9zdCBiaW5kaW5nIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVjbGFzc1Byb3AoY2xhc3NOYW1lLCB2YWx1ZSkgewogICAgICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KGNsYXNzTmFtZSwgdmFsdWUsIG51bGwsIHRydWUpOwogICAgICAgIHJldHVybiDJtcm1Y2xhc3NQcm9wOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgc3R5bGUgYmluZGluZ3MgdXNpbmcgYW4gb2JqZWN0IGxpdGVyYWwgb24gYW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBUaGlzIGluc3RydWN0aW9uIGlzIG1lYW50IHRvIGFwcGx5IHN0eWxpbmcgdmlhIHRoZSBgW3N0eWxlXT0iZXhwImAgdGVtcGxhdGUgYmluZGluZ3MuCiAgICAgKiBXaGVuIHN0eWxlcyBhcmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCB0aGV5IHdpbGwgdGhlbiBiZSB1cGRhdGVkIHdpdGggcmVzcGVjdCB0bwogICAgICogYW55IHN0eWxlcy9jbGFzc2VzIHNldCB2aWEgYHN0eWxlUHJvcGAuIElmIGFueSBzdHlsZXMgYXJlIHNldCB0byBmYWxzeQogICAgICogdGhlbiB0aGV5IHdpbGwgYmUgcmVtb3ZlZCBmcm9tIHRoZSBlbGVtZW50LgogICAgICoKICAgICAqIE5vdGUgdGhhdCB0aGUgc3R5bGluZyBpbnN0cnVjdGlvbiB3aWxsIG5vdCBiZSBhcHBsaWVkIHVudGlsIGBzdHlsaW5nQXBwbHlgIGlzIGNhbGxlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc3R5bGVzIEEga2V5L3ZhbHVlIHN0eWxlIG1hcCBvZiB0aGUgc3R5bGVzIHRoYXQgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBnaXZlbiBlbGVtZW50LgogICAgICogICAgICAgIEFueSBtaXNzaW5nIHN0eWxlcyAodGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50IGJlZm9yZWhhbmQpIHdpbGwgYmUKICAgICAqICAgICAgICByZW1vdmVkICh1bnNldCkgZnJvbSB0aGUgZWxlbWVudCdzIHN0eWxpbmcuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgd2lsbCBhcHBseSB0aGUgcHJvdmlkZWQgc3R5bGVNYXAgdmFsdWUgdG8gdGhlIGhvc3QgZWxlbWVudCBpZiB0aGlzIGZ1bmN0aW9uCiAgICAgKiBpcyBjYWxsZWQgd2l0aGluIGEgaG9zdCBiaW5kaW5nLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcChzdHlsZXMpIHsKICAgICAgICBjaGVja1N0eWxpbmdNYXAoc3R5bGVLZXlWYWx1ZUFycmF5U2V0LCBzdHlsZVN0cmluZ1BhcnNlciwgc3R5bGVzLCBmYWxzZSk7CiAgICB9CiAgICAvKioKICAgICAqIFBhcnNlIHRleHQgYXMgc3R5bGUgYW5kIGFkZCB2YWx1ZXMgdG8gS2V5VmFsdWVBcnJheS4KICAgICAqCiAgICAgKiBUaGlzIGNvZGUgaXMgcHVsbGVkIG91dCB0byBhIHNlcGFyYXRlIGZ1bmN0aW9uIHNvIHRoYXQgaXQgY2FuIGJlIHRyZWUgc2hha2VuIGF3YXkgaWYgaXQgaXMgbm90CiAgICAgKiBuZWVkZWQuIEl0IGlzIG9ubHkgcmVmZXJlbmNlZCBmcm9tIGDJtcm1c3R5bGVNYXBgLgogICAgICoKICAgICAqIEBwYXJhbSB7P30ga2V5VmFsdWVBcnJheSBLZXlWYWx1ZUFycmF5IHRvIGFkZCBwYXJzZWQgdmFsdWVzIHRvLgogICAgICogQHBhcmFtIHs/fSB0ZXh0IHRleHQgdG8gcGFyc2UuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdHlsZVN0cmluZ1BhcnNlcihrZXlWYWx1ZUFycmF5LCB0ZXh0KSB7CiAgICAgICAgZm9yIChsZXQgaSA9IHBhcnNlU3R5bGUodGV4dCk7IGkgPj0gMDsgaSA9IHBhcnNlU3R5bGVOZXh0KHRleHQsIGkpKSB7CiAgICAgICAgICAgIHN0eWxlS2V5VmFsdWVBcnJheVNldChrZXlWYWx1ZUFycmF5LCBnZXRMYXN0UGFyc2VkS2V5KHRleHQpLCBnZXRMYXN0UGFyc2VkVmFsdWUodGV4dCkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGNsYXNzIGJpbmRpbmdzIHVzaW5nIGFuIG9iamVjdCBsaXRlcmFsIG9yIGNsYXNzLXN0cmluZyBvbiBhbiBlbGVtZW50LgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgbWVhbnQgdG8gYXBwbHkgc3R5bGluZyB2aWEgdGhlIGBbY2xhc3NdPSJleHAiYCB0ZW1wbGF0ZSBiaW5kaW5ncy4KICAgICAqIFdoZW4gY2xhc3NlcyBhcmUgYXBwbGllZCB0byB0aGUgZWxlbWVudCB0aGV5IHdpbGwgdGhlbiBiZSB1cGRhdGVkIHdpdGgKICAgICAqIHJlc3BlY3QgdG8gYW55IHN0eWxlcy9jbGFzc2VzIHNldCB2aWEgYGNsYXNzUHJvcGAuIElmIGFueQogICAgICogY2xhc3NlcyBhcmUgc2V0IHRvIGZhbHN5IHRoZW4gdGhleSB3aWxsIGJlIHJlbW92ZWQgZnJvbSB0aGUgZWxlbWVudC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gd2lsbCBub3QgYmUgYXBwbGllZCB1bnRpbCBgc3R5bGluZ0FwcGx5YCBpcyBjYWxsZWQuCiAgICAgKiBOb3RlIHRoYXQgdGhpcyB3aWxsIHRoZSBwcm92aWRlZCBjbGFzc01hcCB2YWx1ZSB0byB0aGUgaG9zdCBlbGVtZW50IGlmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkCiAgICAgKiB3aXRoaW4gYSBob3N0IGJpbmRpbmcuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGNsYXNzZXMgQSBrZXkvdmFsdWUgbWFwIG9yIHN0cmluZyBvZiBDU1MgY2xhc3NlcyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gdGhlCiAgICAgKiAgICAgICAgZ2l2ZW4gZWxlbWVudC4gQW55IG1pc3NpbmcgY2xhc3NlcyAodGhhdCBoYXZlIGFscmVhZHkgYmVlbiBhcHBsaWVkIHRvIHRoZSBlbGVtZW50CiAgICAgKiAgICAgICAgYmVmb3JlaGFuZCkgd2lsbCBiZSByZW1vdmVkICh1bnNldCkgZnJvbSB0aGUgZWxlbWVudCdzIGxpc3Qgb2YgQ1NTIGNsYXNzZXMuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWNsYXNzTWFwKGNsYXNzZXMpIHsKICAgICAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGNsYXNzZXMsIHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKiBQYXJzZSB0ZXh0IGFzIGNsYXNzIGFuZCBhZGQgdmFsdWVzIHRvIEtleVZhbHVlQXJyYXkuCiAgICAgKgogICAgICogVGhpcyBjb2RlIGlzIHB1bGxlZCBvdXQgdG8gYSBzZXBhcmF0ZSBmdW5jdGlvbiBzbyB0aGF0IGl0IGNhbiBiZSB0cmVlIHNoYWtlbiBhd2F5IGlmIGl0IGlzIG5vdAogICAgICogbmVlZGVkLiBJdCBpcyBvbmx5IHJlZmVyZW5jZWQgZnJvbSBgybXJtWNsYXNzTWFwYC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGtleVZhbHVlQXJyYXkgS2V5VmFsdWVBcnJheSB0byBhZGQgcGFyc2VkIHZhbHVlcyB0by4KICAgICAqIEBwYXJhbSB7P30gdGV4dCB0ZXh0IHRvIHBhcnNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2xhc3NTdHJpbmdQYXJzZXIoa2V5VmFsdWVBcnJheSwgdGV4dCkgewogICAgICAgIGZvciAobGV0IGkgPSBwYXJzZUNsYXNzTmFtZSh0ZXh0KTsgaSA+PSAwOyBpID0gcGFyc2VDbGFzc05hbWVOZXh0KHRleHQsIGkpKSB7CiAgICAgICAgICAgIGtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwgZ2V0TGFzdFBhcnNlZEtleSh0ZXh0KSwgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDb21tb24gY29kZSBiZXR3ZWVuIGDJtcm1Y2xhc3NQcm9wYCBhbmQgYMm1ybVzdHlsZVByb3BgLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcHJvcCBwcm9wZXJ0eSBuYW1lLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBiaW5kaW5nIHZhbHVlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXhPclNhbml0aXplciBzdWZmaXggb3Igc2FuaXRpemF0aW9uIGZ1bmN0aW9uCiAgICAgKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCBjaGFuZ2UgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIHZhbHVlLCBzdWZmaXhPclNhbml0aXplciwgaXNDbGFzc0Jhc2VkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8vIFN0eWxpbmcgaW5zdHJ1Y3Rpb25zIHVzZSAyIHNsb3RzIHBlciBiaW5kaW5nLgogICAgICAgIC8vIDEuIG9uZSBmb3IgdGhlIHZhbHVlIC8gVFN0eWxpbmdLZXkKICAgICAgICAvLyAyLiBvbmUgZm9yIHRoZSBpbnRlcm1pdHRlbnQtdmFsdWUgLyBUU3R5bGluZ1JhbmdlCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGluY3JlbWVudEJpbmRpbmdJbmRleCgyKTsKICAgICAgICBpZiAodFZpZXcuZmlyc3RVcGRhdGVQYXNzKSB7CiAgICAgICAgICAgIHN0eWxpbmdGaXJzdFVwZGF0ZVBhc3ModFZpZXcsIHByb3AsIGJpbmRpbmdJbmRleCwgaXNDbGFzc0Jhc2VkKTsKICAgICAgICB9CiAgICAgICAgaWYgKHZhbHVlICE9PSBOT19DSEFOR0UgJiYgYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgYSB3b3JrIGFyb3VuZC4gT25jZSBQUiMzNDQ4MCBsYW5kcyB0aGUgc2FuaXRpemVyIGlzIHBhc3NlZCBleHBsaWNpdGx5IGFuZCB0aGlzIGxpbmUKICAgICAgICAgICAgLy8gY2FuIGJlIHJlbW92ZWQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0eWxlU2FuaXRpemVyOwogICAgICAgICAgICBpZiAoc3VmZml4T3JTYW5pdGl6ZXIgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKHN0eWxlU2FuaXRpemVyID0gZ2V0Q3VycmVudFN0eWxlU2FuaXRpemVyKCkpIHsKICAgICAgICAgICAgICAgICAgICBzdWZmaXhPclNhbml0aXplciA9ICgvKiogQHR5cGUgez99ICovIChzdHlsZVNhbml0aXplcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVtnZXRTZWxlY3RlZEluZGV4KCkgKyBIRUFERVJfT0ZGU0VUXSkpOwogICAgICAgICAgICB1cGRhdGVTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgcHJvcCwgbFZpZXdbYmluZGluZ0luZGV4ICsgMV0gPSBub3JtYWxpemVBbmRBcHBseVN1ZmZpeE9yU2FuaXRpemVyKHZhbHVlLCBzdWZmaXhPclNhbml0aXplciksIGlzQ2xhc3NCYXNlZCwgYmluZGluZ0luZGV4KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIENvbW1vbiBjb2RlIGJldHdlZW4gYMm1ybVjbGFzc01hcGAgYW5kIGDJtcm1c3R5bGVNYXBgLgogICAgICoKICAgICAqIEBwYXJhbSB7P30ga2V5VmFsdWVBcnJheVNldCAoU2VlIGBrZXlWYWx1ZUFycmF5U2V0YCBpbiAidXRpbC9hcnJheV91dGlscyIpIEdldHMgcGFzc2VkIGluIGFzIGEKICAgICAqIGZ1bmN0aW9uIHNvIHRoYXQKICAgICAqICAgICAgICBgc3R5bGVgIGNhbiBwYXNzIGluIHZlcnNpb24gd2hpY2ggZG9lcyBzYW5pdGl6YXRpb24uIFRoaXMgaXMgZG9uZSBmb3IgdHJlZSBzaGFraW5nCiAgICAgKiAgICAgICAgcHVycG9zZXMuCiAgICAgKiBAcGFyYW0gez99IHN0cmluZ1BhcnNlciBQYXJzZXIgdXNlZCB0byBwYXJzZSBgdmFsdWVgIGlmIGBzdHJpbmdgLiAoUGFzc2VkIGluIGFzIGBzdHlsZWAgYW5kIGBjbGFzc2AKICAgICAqICAgICAgICBoYXZlIGRpZmZlcmVudCBwYXJzZXJzLikKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgYm91bmQgdmFsdWUgZnJvbSBhcHBsaWNhdGlvbgogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgY2hhbmdlIChgZmFsc2VgIGlmIGBzdHlsZWApCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgc3RyaW5nUGFyc2VyLCB2YWx1ZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gaW5jcmVtZW50QmluZGluZ0luZGV4KDIpOwogICAgICAgIGlmICh0Vmlldy5maXJzdFVwZGF0ZVBhc3MpIHsKICAgICAgICAgICAgc3R5bGluZ0ZpcnN0VXBkYXRlUGFzcyh0VmlldywgbnVsbCwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIGlmICh2YWx1ZSAhPT0gTk9fQ0hBTkdFICYmIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgsIHZhbHVlKSkgewogICAgICAgICAgICAvLyBgZ2V0U2VsZWN0ZWRJbmRleCgpYCBzaG91bGQgYmUgaGVyZSAocmF0aGVyIHRoYW4gaW4gaW5zdHJ1Y3Rpb24pIHNvIHRoYXQgaXQgaXMgZ3VhcmRlZCBieSB0aGUKICAgICAgICAgICAgLy8gaWYgc28gYXMgbm90IHRvIHJlYWQgdW5uZWNlc3NhcmlseS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2dldFNlbGVjdGVkSW5kZXgoKSArIEhFQURFUl9PRkZTRVRdKSk7CiAgICAgICAgICAgIGlmIChoYXNTdHlsaW5nSW5wdXRTaGFkb3codE5vZGUsIGlzQ2xhc3NCYXNlZCkgJiYgIWlzSW5Ib3N0QmluZGluZ3ModFZpZXcsIGJpbmRpbmdJbmRleCkpIHsKICAgICAgICAgICAgICAgIGlmIChuZ0Rldk1vZGUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB2ZXJpZnkgdGhhdCBpZiB3ZSBhcmUgc2hhZG93aW5nIHRoZW4gYFREYXRhYCBpcyBhcHByb3ByaWF0ZWx5IG1hcmtlZCBzbyB0aGF0IHdlIHNraXAKICAgICAgICAgICAgICAgICAgICAvLyBwcm9jZXNzaW5nIHRoaXMgYmluZGluZyBpbiBzdHlsaW5nIHJlc29sdXRpb24uCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHRTdHlsaW5nS2V5ID0gdFZpZXcuZGF0YVtiaW5kaW5nSW5kZXhdOwogICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFsKEFycmF5LmlzQXJyYXkodFN0eWxpbmdLZXkpID8gdFN0eWxpbmdLZXlbMV0gOiB0U3R5bGluZ0tleSwgZmFsc2UsICdTdHlsaW5nIGxpbmtlZCBsaXN0IHNoYWRvdyBpbnB1dCBzaG91bGQgYmUgbWFya2VkIGFzIFwnZmFsc2VcJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVkUgZG9lcyBub3QgY29uY2F0ZW5hdGUgdGhlIHN0YXRpYyBwb3J0aW9uIGxpa2Ugd2UgYXJlIGRvaW5nIGhlcmUuCiAgICAgICAgICAgICAgICAvLyBJbnN0ZWFkIFZFIGp1c3QgaWdub3JlcyB0aGUgc3RhdGljIGNvbXBsZXRlbHkgaWYgZHluYW1pYyBiaW5kaW5nIGlzIHByZXNlbnQuCiAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIG9mIGxvY2FsaXR5IHdlIGhhdmUgYWxyZWFkeSBzZXQgdGhlIHN0YXRpYyBwb3J0aW9uIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGVyZQogICAgICAgICAgICAgICAgLy8gaXMgYSBkeW5hbWljIHBvcnRpb24gdW50aWwgbGF0ZXIuIElmIHdlIHdvdWxkIGlnbm9yZSB0aGUgc3RhdGljIHBvcnRpb24gaXQgd291bGQgbG9vayBsaWtlCiAgICAgICAgICAgICAgICAvLyB0aGUgYmluZGluZyBoYXMgcmVtb3ZlZCBpdC4gVGhpcyB3b3VsZCBjb25mdXNlIGBbbmdTdHlsZV1gL2BbbmdDbGFzc11gIHRvIGRvIHRoZSB3cm9uZwogICAgICAgICAgICAgICAgLy8gdGhpbmcgYXMgaXQgd291bGQgdGhpbmsgdGhhdCB0aGUgc3RhdGljIHBvcnRpb24gd2FzIHJlbW92ZWQuIEZvciB0aGlzIHJlYXNvbiB3ZQogICAgICAgICAgICAgICAgLy8gY29uY2F0ZW5hdGUgaXQgc28gdGhhdCBgW25nU3R5bGVdYC9gW25nQ2xhc3NdYCAgY2FuIGNvbnRpbnVlIHRvIHdvcmsgb24gY2hhbmdlZC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBzdGF0aWNQcmVmaXggPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5jbGFzc2VzV2l0aG91dEhvc3QgOiB0Tm9kZS5zdHlsZXNXaXRob3V0SG9zdDsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBpc0NsYXNzQmFzZWQgPT09IGZhbHNlICYmIHN0YXRpY1ByZWZpeCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFsKHN0YXRpY1ByZWZpeC5lbmRzV2l0aCgnOycpLCB0cnVlLCAnRXhwZWN0aW5nIHN0YXRpYyBwb3J0aW9uIHRvIGVuZCB3aXRoIFwnO1wnJyk7CiAgICAgICAgICAgICAgICBpZiAoc3RhdGljUHJlZml4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBmYWxzeSB2YWx1ZXMgb2YgYHZhbHVlYCBiZWNvbWUgZW1wdHkgc3RyaW5ncy4KICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IGNvbmNhdFN0cmluZ3NXaXRoU3BhY2Uoc3RhdGljUHJlZml4LCB2YWx1ZSA/IHZhbHVlIDogJycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gR2l2ZW4gYDxkaXYgW3N0eWxlXSBteS1kaXI+YCBzdWNoIHRoYXQgYG15LWRpcmAgaGFzIGBASW5wdXQoJ3N0eWxlJylgLgogICAgICAgICAgICAgICAgLy8gVGhpcyB0YWtlcyBvdmVyIHRoZSBgW3N0eWxlXWAgYmluZGluZy4gKFNhbWUgZm9yIGBbY2xhc3NdYCkKICAgICAgICAgICAgICAgIHNldERpcmVjdGl2ZUlucHV0c1doaWNoU2hhZG93c1N0eWxpbmcodFZpZXcsIHROb2RlLCBsVmlldywgdmFsdWUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB1cGRhdGVTdHlsaW5nTWFwKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIGxWaWV3W1JFTkRFUkVSXSwgbFZpZXdbYmluZGluZ0luZGV4ICsgMV0sIGxWaWV3W2JpbmRpbmdJbmRleCArIDFdID0gdG9TdHlsaW5nS2V5VmFsdWVBcnJheShrZXlWYWx1ZUFycmF5U2V0LCBzdHJpbmdQYXJzZXIsIHZhbHVlKSwgaXNDbGFzc0Jhc2VkLCBiaW5kaW5nSW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIHdoZW4gdGhlIGJpbmRpbmcgaXMgaW4gYGhvc3RCaW5kaW5nc2Agc2VjdGlvbgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgQ3VycmVudCBgVFZpZXdgCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleCBpbmRleCBvZiBiaW5kaW5nIHdoaWNoIHdlIHdvdWxkIGxpa2UgaWYgaXQgaXMgaW4gYGhvc3RCaW5kaW5nc2AKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzSW5Ib3N0QmluZGluZ3ModFZpZXcsIGJpbmRpbmdJbmRleCkgewogICAgICAgIC8vIEFsbCBob3N0IGJpbmRpbmdzIGFyZSBwbGFjZWQgYWZ0ZXIgdGhlIGV4cGFuZG8gc2VjdGlvbi4KICAgICAgICByZXR1cm4gYmluZGluZ0luZGV4ID49IHRWaWV3LmV4cGFuZG9TdGFydEluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBDb2xsZWN0cyB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIHRvIGluc2VydCB0aGUgYmluZGluZyBpbnRvIGEgbGlua2VkIGxpc3Qgb2Ygc3R5bGUgYmluZGluZ3MKICAgICAqIHVzaW5nIGBpbnNlcnRUU3R5bGluZ0JpbmRpbmdgLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdFZpZXcgYFRWaWV3YCB3aGVyZSB0aGUgYmluZGluZyBsaW5rZWQgbGlzdCB3aWxsIGJlIHN0b3JlZC4KICAgICAqIEBwYXJhbSB7P30gdFN0eWxpbmdLZXkgUHJvcGVydHkva2V5IG9mIHRoZSBiaW5kaW5nLgogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nSW5kZXggSW5kZXggb2YgYmluZGluZyBhc3NvY2lhdGVkIHdpdGggdGhlIGBwcm9wYAogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgY2hhbmdlIChgZmFsc2VgIGlmIGBzdHlsZWApCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdHlsaW5nRmlyc3RVcGRhdGVQYXNzKHRWaWV3LCB0U3R5bGluZ0tleSwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Rmlyc3RVcGRhdGVQYXNzKHRWaWV3KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdERhdGEgPSB0Vmlldy5kYXRhOwogICAgICAgIGlmICh0RGF0YVtiaW5kaW5nSW5kZXggKyAxXSA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBUaGUgYWJvdmUgY2hlY2sgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgZG9uJ3QgY2xlYXIgZmlyc3QgdXBkYXRlIHBhc3MgdW50aWwgZmlyc3Qgc3VjY2Vzc2Z1bAogICAgICAgICAgICAvLyAobm8gZXhjZXB0aW9uKSB0ZW1wbGF0ZSBleGVjdXRpb24uIFRoaXMgcHJldmVudHMgdGhlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gZnJvbSBkb3VibGUgYWRkaW5nCiAgICAgICAgICAgIC8vIGl0c2VsZiB0byB0aGUgbGlzdC4KICAgICAgICAgICAgLy8gYGdldFNlbGVjdGVkSW5kZXgoKWAgc2hvdWxkIGJlIGhlcmUgKHJhdGhlciB0aGFuIGluIGluc3RydWN0aW9uKSBzbyB0aGF0IGl0IGlzIGd1YXJkZWQgYnkgdGhlCiAgICAgICAgICAgIC8vIGlmIHNvIGFzIG5vdCB0byByZWFkIHVubmVjZXNzYXJpbHkuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbZ2V0U2VsZWN0ZWRJbmRleCgpICsgSEVBREVSX09GRlNFVF0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0hvc3RCaW5kaW5ncyA9IGlzSW5Ib3N0QmluZGluZ3ModFZpZXcsIGJpbmRpbmdJbmRleCk7CiAgICAgICAgICAgIGlmIChoYXNTdHlsaW5nSW5wdXRTaGFkb3codE5vZGUsIGlzQ2xhc3NCYXNlZCkgJiYgdFN0eWxpbmdLZXkgPT09IG51bGwgJiYgIWlzSG9zdEJpbmRpbmdzKSB7CiAgICAgICAgICAgICAgICAvLyBgdFN0eWxpbmdLZXkgPT09IG51bGxgIGltcGxpZXMgdGhhdCB3ZSBhcmUgZWl0aGVyIGBbc3R5bGVdYCBvciBgW2NsYXNzXWAgYmluZGluZy4KICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZGlyZWN0aXZlIHdoaWNoIHVzZXMgYEBJbnB1dCgnc3R5bGUnKWAgb3IgYEBJbnB1dCgnY2xhc3MnKWAgdGhhbgogICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBuZXV0cmFsaXplIHRoaXMgYmluZGluZyBzaW5jZSB0aGF0IGRpcmVjdGl2ZSBpcyBzaGFkb3dpbmcgaXQuCiAgICAgICAgICAgICAgICAvLyBXZSB0dXJuIHRoaXMgaW50byBhIG5vb3AgYnkgc2V0dGluZyB0aGUga2V5IHRvIGBmYWxzZWAKICAgICAgICAgICAgICAgIHRTdHlsaW5nS2V5ID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdFN0eWxpbmdLZXkgPSB3cmFwSW5TdGF0aWNTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgdFN0eWxpbmdLZXksIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgIGluc2VydFRTdHlsaW5nQmluZGluZyh0RGF0YSwgdE5vZGUsIHRTdHlsaW5nS2V5LCBiaW5kaW5nSW5kZXgsIGlzSG9zdEJpbmRpbmdzLCBpc0NsYXNzQmFzZWQpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQWRkcyBzdGF0aWMgc3R5bGluZyBpbmZvcm1hdGlvbiB0byB0aGUgYmluZGluZyBpZiBhcHBsaWNhYmxlLgogICAgICoKICAgICAqIFRoZSBsaW5rZWQgbGlzdCBvZiBzdHlsZXMgbm90IG9ubHkgc3RvcmVzIHRoZSBsaXN0IGFuZCBrZXlzLCBidXQgYWxzbyBzdG9yZXMgc3RhdGljIHN0eWxpbmcKICAgICAqIGluZm9ybWF0aW9uIG9uIHNvbWUgb2YgdGhlIGtleXMuIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUga2V5IHNob3VsZCBjb250YWluIHRoZSBzdHlsaW5nCiAgICAgKiBpbmZvcm1hdGlvbiBhbmQgY29tcHV0ZXMgaXQuCiAgICAgKgogICAgICogU2VlIGBUU3R5bGluZ1N0YXRpY2AgZm9yIG1vcmUgZGV0YWlscy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGlzIHN0b3JlZC4KICAgICAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCBmb3Igd2hpY2ggdGhlIHN0eWxpbmcgaXMgYmVpbmcgY29tcHV0ZWQuCiAgICAgKiBAcGFyYW0gez99IHN0eWxpbmdLZXkgYFRTdHlsaW5nS2V5UHJpbWl0aXZlYCB3aGljaCBtYXkgbmVlZCB0byBiZSB3cmFwcGVkIGludG8gYFRTdHlsaW5nS2V5YAogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyYXBJblN0YXRpY1N0eWxpbmdLZXkodERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaG9zdERpcmVjdGl2ZURlZiA9IGdldEN1cnJlbnREaXJlY3RpdmVEZWYodERhdGEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzaWR1YWwgPSBpc0NsYXNzQmFzZWQgPyB0Tm9kZS5yZXNpZHVhbENsYXNzZXMgOiB0Tm9kZS5yZXNpZHVhbFN0eWxlczsKICAgICAgICBpZiAoaG9zdERpcmVjdGl2ZURlZiA9PT0gbnVsbCkgewogICAgICAgICAgICAvLyBXZSBhcmUgaW4gdGVtcGxhdGUgbm9kZS4KICAgICAgICAgICAgLy8gSWYgdGVtcGxhdGUgbm9kZSBhbHJlYWR5IGhhZCBzdHlsaW5nIGluc3RydWN0aW9uIHRoZW4gaXQgaGFzIGFscmVhZHkgY29sbGVjdGVkIHRoZSBzdGF0aWMKICAgICAgICAgICAgLy8gc3R5bGluZyBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBjb2xsZWN0IHRoZW0gYWdhaW4uIFdlIGtub3cgdGhhdCB3ZSBhcmUgdGhlIGZpcnN0IHN0eWxpbmcKICAgICAgICAgICAgLy8gaW5zdHJ1Y3Rpb24gYmVjYXVzZSB0aGUgYFROb2RlLipCaW5kaW5nc2AgcG9pbnRzIHRvIDAgKG5vdGhpbmcgaGFzIGJlZW4gaW5zZXJ0ZWQgeWV0KS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0ZpcnN0U3R5bGluZ0luc3RydWN0aW9uSW5UZW1wbGF0ZSA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoKGlzQ2xhc3NCYXNlZCA/IHROb2RlLmNsYXNzQmluZGluZ3MgOiB0Tm9kZS5zdHlsZUJpbmRpbmdzKSkpKSkgPT09IDA7CiAgICAgICAgICAgIGlmIChpc0ZpcnN0U3R5bGluZ0luc3RydWN0aW9uSW5UZW1wbGF0ZSkgewogICAgICAgICAgICAgICAgLy8gSXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIGdldCB0aGUgc3RhdGljcyBmcm9tIGBtZXJnZUF0dHJzYCwgaG93ZXZlciwgYXQgdGhpcyBwb2ludAogICAgICAgICAgICAgICAgLy8gdGhleSBhcmUgYWxyZWFkeSBtZXJnZWQgYW5kIGl0IHdvdWxkIG5vdCBiZSBwb3NzaWJsZSB0byBmaWd1cmUgd2hpY2ggcHJvcGVydHkgYmVsb25ncyB3aGVyZQogICAgICAgICAgICAgICAgLy8gaW4gdGhlIHByaW9yaXR5LgogICAgICAgICAgICAgICAgc3R5bGluZ0tleSA9IGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMobnVsbCwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgc3R5bGluZ0tleSA9IGNvbGxlY3RTdHlsaW5nRnJvbVRBdHRycyhzdHlsaW5nS2V5LCB0Tm9kZS5hdHRycywgaXNDbGFzc0Jhc2VkKTsKICAgICAgICAgICAgICAgIC8vIFdlIGtub3cgdGhhdCBpZiB3ZSBoYXZlIHN0eWxpbmcgYmluZGluZyBpbiB0ZW1wbGF0ZSB3ZSBjYW4ndCBoYXZlIHJlc2lkdWFsLgogICAgICAgICAgICAgICAgcmVzaWR1YWwgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBXZSBhcmUgaW4gaG9zdCBiaW5kaW5nIG5vZGUgYW5kIHRoZXJlIHdhcyBubyBiaW5kaW5nIGluc3RydWN0aW9uIGluIHRlbXBsYXRlIG5vZGUuCiAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIHJlc2lkdWFsLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGl2ZVN0eWxpbmdMYXN0ID0gdE5vZGUuZGlyZWN0aXZlU3R5bGluZ0xhc3Q7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNGaXJzdFN0eWxpbmdJbnN0cnVjdGlvbkluSG9zdEJpbmRpbmcgPSBkaXJlY3RpdmVTdHlsaW5nTGFzdCA9PT0gLTEgfHwgdERhdGFbZGlyZWN0aXZlU3R5bGluZ0xhc3RdICE9PSBob3N0RGlyZWN0aXZlRGVmOwogICAgICAgICAgICBpZiAoaXNGaXJzdFN0eWxpbmdJbnN0cnVjdGlvbkluSG9zdEJpbmRpbmcpIHsKICAgICAgICAgICAgICAgIHN0eWxpbmdLZXkgPQogICAgICAgICAgICAgICAgICAgIGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMoaG9zdERpcmVjdGl2ZURlZiwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgaWYgKHJlc2lkdWFsID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gLSBJZiBgbnVsbGAgdGhhbiBlaXRoZXI6CiAgICAgICAgICAgICAgICAgICAgLy8gICAgLSBUZW1wbGF0ZSBzdHlsaW5nIGluc3RydWN0aW9uIGFscmVhZHkgcmFuIGFuZCBpdCBoYXMgY29uc3VtZWQgdGhlIHN0YXRpYwogICAgICAgICAgICAgICAgICAgIC8vICAgICAgc3R5bGluZyBpbnRvIGl0cyBgVFN0eWxpbmdLZXlgIGFuZCBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHVwZGF0ZSByZXNpZHVhbC4gSW5zdGVhZAogICAgICAgICAgICAgICAgICAgIC8vICAgICAgd2UgbmVlZCB0byB1cGRhdGUgdGhlIGBUU3R5bGluZ0tleWAgYXNzb2NpYXRlZCB3aXRoIHRoZSBmaXJzdCB0ZW1wbGF0ZSBub2RlCiAgICAgICAgICAgICAgICAgICAgLy8gICAgICBpbnN0cnVjdGlvbi4gT1IKICAgICAgICAgICAgICAgICAgICAvLyAgICAtIFNvbWUgb3RoZXIgc3R5bGluZyBpbnN0cnVjdGlvbiByYW4gYW5kIGRldGVybWluZWQgdGhhdCB0aGVyZSBhcmUgbm8gcmVzaWR1YWxzCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCB0ZW1wbGF0ZVN0eWxpbmdLZXkgPSBnZXRUZW1wbGF0ZUhlYWRUU3R5bGluZ0tleSh0RGF0YSwgdE5vZGUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBsYXRlU3R5bGluZ0tleSAhPT0gdW5kZWZpbmVkICYmIEFycmF5LmlzQXJyYXkodGVtcGxhdGVTdHlsaW5nS2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlY29tcHV0ZSBpZiBgdGVtcGxhdGVTdHlsaW5nS2V5YCBoYWQgc3RhdGljIHZhbHVlcy4gKElmIG5vIHN0YXRpYyB2YWx1ZSBmb3VuZAogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8gc2luY2UgdGhpcyBvcGVyYXRpb24gY2FuIG9ubHkgcHJvZHVjZSBsZXNzIHN0YXRpYyBrZXlzLCBub3QKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9yZS4pCiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3R5bGluZ0tleSA9IGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMobnVsbCwgdERhdGEsIHROb2RlLCB0ZW1wbGF0ZVN0eWxpbmdLZXlbMV0gLyogdW53cmFwIHByZXZpb3VzIHN0YXRpY3MgKi8sIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlU3R5bGluZ0tleSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0U3R5bGluZ0Zyb21UQXR0cnModGVtcGxhdGVTdHlsaW5nS2V5LCB0Tm9kZS5hdHRycywgaXNDbGFzc0Jhc2VkKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGVtcGxhdGVIZWFkVFN0eWxpbmdLZXkodERhdGEsIHROb2RlLCBpc0NsYXNzQmFzZWQsIHRlbXBsYXRlU3R5bGluZ0tleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugb25seSBuZWVkIHRvIHJlY29tcHV0ZSByZXNpZHVhbCBpZiBpdCBpcyBub3QgYG51bGxgLgogICAgICAgICAgICAgICAgICAgIC8vIC0gSWYgZXhpc3RpbmcgcmVzaWR1YWwgKGltcGxpZXMgdGhlcmUgd2FzIG5vIHRlbXBsYXRlIHN0eWxpbmcpLiBUaGlzIG1lYW5zIHRoYXQgc29tZSBvZgogICAgICAgICAgICAgICAgICAgIC8vICAgdGhlIHN0YXRpY3MgbWF5IGhhdmUgbW92ZWQgZnJvbSB0aGUgcmVzaWR1YWwgdG8gdGhlIGBzdHlsaW5nS2V5YCBhbmQgc28gd2UgaGF2ZSB0bwogICAgICAgICAgICAgICAgICAgIC8vICAgcmVjb21wdXRlLgogICAgICAgICAgICAgICAgICAgIC8vIC0gSWYgYHVuZGVmaW5lZGAgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBhcmUgcnVubmluZy4KICAgICAgICAgICAgICAgICAgICByZXNpZHVhbCA9IGNvbGxlY3RSZXNpZHVhbCh0RGF0YSwgdE5vZGUsIGlzQ2xhc3NCYXNlZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKHJlc2lkdWFsICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaXNDbGFzc0Jhc2VkID8gKHROb2RlLnJlc2lkdWFsQ2xhc3NlcyA9IHJlc2lkdWFsKSA6ICh0Tm9kZS5yZXNpZHVhbFN0eWxlcyA9IHJlc2lkdWFsKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxpbmdLZXk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlIHRoZSBgVFN0eWxpbmdLZXlgIGZvciB0aGUgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbi4KICAgICAqCiAgICAgKiBUaGlzIGlzIG5lZWRlZCBzaW5jZSBgaG9zdEJpbmRpbmdgIHN0eWxpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBpbnNlcnRlZCBhZnRlciB0aGUgdGVtcGxhdGUKICAgICAqIGluc3RydWN0aW9uLiBXaGlsZSB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gbmVlZHMgdG8gdXBkYXRlIHRoZSByZXNpZHVhbCBpbiBgVE5vZGVgIHRoZQogICAgICogYGhvc3RCaW5kaW5nYCBpbnN0cnVjdGlvbnMgbmVlZCB0byB1cGRhdGUgdGhlIGBUU3R5bGluZ0tleWAgb2YgdGhlIHRlbXBsYXRlIGluc3RydWN0aW9uIGJlY2F1c2UKICAgICAqIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiBpcyBkb3duc3RyZWFtIGZyb20gdGhlIGBob3N0QmluZGluZ3NgIGluc3RydWN0aW9ucy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHREYXRhIGBURGF0YWAgd2hlcmUgdGhlIGxpbmtlZCBsaXN0IGlzIHN0b3JlZC4KICAgICAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCBmb3Igd2hpY2ggdGhlIHN0eWxpbmcgaXMgYmVpbmcgY29tcHV0ZWQuCiAgICAgKiBAcGFyYW0gez99IGlzQ2xhc3NCYXNlZCBgdHJ1ZWAgaWYgYGNsYXNzYCAoYGZhbHNlYCBpZiBgc3R5bGVgKQogICAgICogQHJldHVybiB7P30gYFRTdHlsaW5nS2V5YCBpZiBmb3VuZCBvciBgdW5kZWZpbmVkYCBpZiBub3QgZm91bmQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRlbXBsYXRlSGVhZFRTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdzID0gaXNDbGFzc0Jhc2VkID8gdE5vZGUuY2xhc3NCaW5kaW5ncyA6IHROb2RlLnN0eWxlQmluZGluZ3M7CiAgICAgICAgaWYgKGdldFRTdHlsaW5nUmFuZ2VOZXh0KGJpbmRpbmdzKSA9PT0gMCkgewogICAgICAgICAgICAvLyBUaGVyZSBkb2VzIG5vdCBzZWVtIHRvIGJlIGEgc3R5bGluZyBpbnN0cnVjdGlvbiBpbiB0aGUgYHRlbXBsYXRlYC4KICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0RGF0YVtnZXRUU3R5bGluZ1JhbmdlUHJldihiaW5kaW5ncyldKSk7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSB0aGUgYFRTdHlsaW5nS2V5YCBvZiB0aGUgZmlyc3QgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gaW4gYFROb2RlYC4KICAgICAqCiAgICAgKiBMb2dpY2FsbHkgYGhvc3RCaW5kaW5nc2Agc3R5bGluZyBpbnN0cnVjdGlvbnMgYXJlIG9mIGxvd2VyIHByaW9yaXR5IHRoYW4gdGhhdCBvZiB0aGUgdGVtcGxhdGUuCiAgICAgKiBIb3dldmVyLCB0aGV5IGV4ZWN1dGUgYWZ0ZXIgdGhlIHRlbXBsYXRlIHN0eWxpbmcgaW5zdHJ1Y3Rpb25zLiBUaGlzIG1lYW5zIHRoYXQgdGhleSBnZXQgaW5zZXJ0ZWQKICAgICAqIGluIGZyb250IG9mIHRoZSB0ZW1wbGF0ZSBzdHlsaW5nIGluc3RydWN0aW9ucy4KICAgICAqCiAgICAgKiBJZiB3ZSBoYXZlIGEgdGVtcGxhdGUgc3R5bGluZyBpbnN0cnVjdGlvbiBhbmQgYSBuZXcgYGhvc3RCaW5kaW5nc2Agc3R5bGluZyBpbnN0cnVjdGlvbiBpcwogICAgICogZXhlY3V0ZWQgaXQgbWVhbnMgdGhhdCBpdCBtYXkgbmVlZCB0byBzdGVhbCBzdGF0aWMgZmllbGRzIGZyb20gdGhlIHRlbXBsYXRlIGluc3RydWN0aW9uLiBUaGlzCiAgICAgKiBtZXRob2QgYWxsb3dzIHVzIHRvIHVwZGF0ZSB0aGUgZmlyc3QgdGVtcGxhdGUgaW5zdHJ1Y3Rpb24gYFRTdHlsaW5nS2V5YCB3aXRoIGEgbmV3IHZhbHVlLgogICAgICoKICAgICAqIEFzc3VtZToKICAgICAqIGBgYAogICAgICogPGRpdiBteS1kaXIgc3R5bGU9ImNvbG9yOiByZWQiIFtzdHlsZS5jb2xvcl09InRtcGxFeHAiPjwvZGl2PgogICAgICoKICAgICAqIFxARGlyZWN0aXZlKHsKICAgICAqICAgaG9zdDogewogICAgICogICAgICdzdHlsZSc6ICd3aWR0aDogMTAwcHgnLAogICAgICogICAgICdbc3R5bGUuY29sb3JdJzogJ2RpckV4cCcsCiAgICAgKiAgIH0KICAgICAqIH0pCiAgICAgKiBjbGFzcyBNeURpciB7fQogICAgICogYGBgCiAgICAgKgogICAgICogd2hlbiBgW3N0eWxlLmNvbG9yXT0idG1wbEV4cCJgIGV4ZWN1dGVzIGl0IGNyZWF0ZXMgdGhpcyBkYXRhIHN0cnVjdHVyZS4KICAgICAqIGBgYAogICAgICogIFsnJywgJ2NvbG9yJywgJ2NvbG9yJywgJ3JlZCcsICd3aWR0aCcsICcxMDBweCddLAogICAgICogYGBgCiAgICAgKgogICAgICogVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBrbm93IGlmIHRoZXJlIGFyZSBzdHlsaW5nCiAgICAgKiBpbnN0cnVjdGlvbnMgYW5kIG11c3QgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vbmUgYW5kIG11c3QgY29sbGVjdCBhbGwgb2YgdGhlIHN0YXRpYyBzdHlsaW5nLgogICAgICogKGJvdGgKICAgICAqIGBjb2xvcicgYW5kICd3aWR0aGApCiAgICAgKgogICAgICogV2hlbiBgJ1tzdHlsZS5jb2xvcl0nOiAnZGlyRXhwJyxgIGV4ZWN1dGVzIHdlIG5lZWQgdG8gaW5zZXJ0IGEgbmV3IGRhdGEgaW50byB0aGUgbGlua2VkIGxpc3QuCiAgICAgKiBgYGAKICAgICAqICBbJycsICdjb2xvcicsICd3aWR0aCcsICcxMDBweCddLCAgLy8gbmV3bHkgaW5zZXJ0ZWQKICAgICAqICBbJycsICdjb2xvcicsICdjb2xvcicsICdyZWQnLCAnd2lkdGgnLCAnMTAwcHgnXSwgLy8gdGhpcyBpcyB3cm9uZwogICAgICogYGBgCiAgICAgKgogICAgICogTm90aWNlIHRoYXQgdGhlIHRlbXBsYXRlIHN0YXRpY3MgaXMgbm93IHdyb25nIGFzIGl0IGluY29ycmVjdGx5IGNvbnRhaW5zIGB3aWR0aGAgc28gd2UgbmVlZCB0bwogICAgICogdXBkYXRlIGl0IGxpa2Ugc286CiAgICAgKiBgYGAKICAgICAqICBbJycsICdjb2xvcicsICd3aWR0aCcsICcxMDBweCddLAogICAgICogIFsnJywgJ2NvbG9yJywgJ2NvbG9yJywgJ3JlZCddLCAgICAvLyBVUERBVEUKICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgbGlua2VkIGxpc3QgaXMgc3RvcmVkLgogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIGZvciB3aGljaCB0aGUgc3R5bGluZyBpcyBiZWluZyBjb21wdXRlZC4KICAgICAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAgICAgKiBAcGFyYW0gez99IHRTdHlsaW5nS2V5IE5ldyBgVFN0eWxpbmdLZXlgIHdoaWNoIGlzIHJlcGxhY2luZyB0aGUgb2xkIG9uZS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFRlbXBsYXRlSGVhZFRTdHlsaW5nS2V5KHREYXRhLCB0Tm9kZSwgaXNDbGFzc0Jhc2VkLCB0U3R5bGluZ0tleSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5ncyA9IGlzQ2xhc3NCYXNlZCA/IHROb2RlLmNsYXNzQmluZGluZ3MgOiB0Tm9kZS5zdHlsZUJpbmRpbmdzOwogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnROb3RFcXVhbChnZXRUU3R5bGluZ1JhbmdlTmV4dChiaW5kaW5ncyksIDAsICdFeHBlY3RpbmcgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgdGVtcGxhdGUgc3R5bGluZyBiaW5kaW5nLicpOwogICAgICAgIHREYXRhW2dldFRTdHlsaW5nUmFuZ2VQcmV2KGJpbmRpbmdzKV0gPSB0U3R5bGluZ0tleTsKICAgIH0KICAgIC8qKgogICAgICogQ29sbGVjdCBhbGwgc3RhdGljIHZhbHVlcyBhZnRlciB0aGUgY3VycmVudCBgVE5vZGUuZGlyZWN0aXZlU3R5bGluZ0xhc3RgIGluZGV4LgogICAgICoKICAgICAqIENvbGxlY3QgdGhlIHJlbWFpbmluZyBzdHlsaW5nIGluZm9ybWF0aW9uIHdoaWNoIGhhcyBub3QgeWV0IGJlZW4gY29sbGVjdGVkIGJ5IGFuIGV4aXN0aW5nCiAgICAgKiBzdHlsaW5nIGluc3RydWN0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgYERpcmVjdGl2ZURlZnNgIGFyZSBzdG9yZWQuCiAgICAgKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hpY2ggY29udGFpbnMgdGhlIGRpcmVjdGl2ZSByYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb2xsZWN0UmVzaWR1YWwodERhdGEsIHROb2RlLCBpc0NsYXNzQmFzZWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc2lkdWFsID0gdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVFbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydE5vdEVxdWFsKHROb2RlLmRpcmVjdGl2ZVN0eWxpbmdMYXN0LCAtMSwgJ0J5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gZ2V0cyBjYWxsZWQgYXQgbGVhc3Qgb25lIGhvc3RCaW5kaW5ncy1ub2RlIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGV4ZWN1dGVkLicpOwogICAgICAgIC8vIFdlIGFkZCBgMSArIHROb2RlLmRpcmVjdGl2ZVN0YXJ0YCBiZWNhdXNlIHdlIG5lZWQgdG8gc2tpcCB0aGUgY3VycmVudCBkaXJlY3RpdmUgKGFzIHdlIGFyZQogICAgICAgIC8vIGNvbGxlY3RpbmcgdGhpbmdzIGFmdGVyIHRoZSBsYXN0IGBob3N0QmluZGluZ3NgIGRpcmVjdGl2ZSB3aGljaCBoYWQgYSBzdHlsaW5nIGluc3RydWN0aW9uLikKICAgICAgICBmb3IgKGxldCBpID0gMSArIHROb2RlLmRpcmVjdGl2ZVN0eWxpbmdMYXN0OyBpIDwgZGlyZWN0aXZlRW5kOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRycyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbaV0pKSkuaG9zdEF0dHJzOwogICAgICAgICAgICByZXNpZHVhbCA9ICgvKiogQHR5cGUgez99ICovIChjb2xsZWN0U3R5bGluZ0Zyb21UQXR0cnMocmVzaWR1YWwsIGF0dHJzLCBpc0NsYXNzQmFzZWQpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHJlc2lkdWFsLCB0Tm9kZS5hdHRycywgaXNDbGFzc0Jhc2VkKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBDb2xsZWN0IHRoZSBzdGF0aWMgc3R5bGluZyBpbmZvcm1hdGlvbiB3aXRoIGxvd2VyIHByaW9yaXR5IHRoYW4gYGhvc3REaXJlY3RpdmVEZWZgLgogICAgICoKICAgICAqIChUaGlzIGlzIG9wcG9zaXRlIG9mIHJlc2lkdWFsIHN0eWxpbmcuKQogICAgICoKICAgICAqIEBwYXJhbSB7P30gaG9zdERpcmVjdGl2ZURlZiBgRGlyZWN0aXZlRGVmYCBmb3Igd2hpY2ggd2Ugd2FudCB0byBjb2xsZWN0IGxvd2VyIHByaW9yaXR5IHN0YXRpYwogICAgICogICAgICAgIHN0eWxpbmcuIChPciBgbnVsbGAgaWYgdGVtcGxhdGUgc3R5bGluZykKICAgICAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB3aGVyZSB0aGUgbGlua2VkIGxpc3QgaXMgc3RvcmVkLgogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIGZvciB3aGljaCB0aGUgc3R5bGluZyBpcyBiZWluZyBjb21wdXRlZC4KICAgICAqIEBwYXJhbSB7P30gc3R5bGluZ0tleSBFeGlzdGluZyBgVFN0eWxpbmdLZXlgIHRvIHVwZGF0ZSBvciB3cmFwLgogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbGxlY3RTdHlsaW5nRnJvbURpcmVjdGl2ZXMoaG9zdERpcmVjdGl2ZURlZiwgdERhdGEsIHROb2RlLCBzdHlsaW5nS2V5LCBpc0NsYXNzQmFzZWQpIHsKICAgICAgICAvLyBXZSBuZWVkIHRvIGxvb3AgYmVjYXVzZSB0aGVyZSBjYW4gYmUgZGlyZWN0aXZlcyB3aGljaCBoYXZlIGBob3N0QXR0cnNgIGJ1dCBkb24ndCBoYXZlCiAgICAgICAgLy8gYGhvc3RCaW5kaW5nc2Agc28gdGhpcyBsb29wIGNhdGNoZXMgdXAgdG8gdGhlIGN1cnJlbnQgZGlyZWN0aXZlLi4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnJlbnREaXJlY3RpdmUgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJlY3RpdmVFbmQgPSB0Tm9kZS5kaXJlY3RpdmVFbmQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkaXJlY3RpdmVTdHlsaW5nTGFzdCA9IHROb2RlLmRpcmVjdGl2ZVN0eWxpbmdMYXN0OwogICAgICAgIGlmIChkaXJlY3RpdmVTdHlsaW5nTGFzdCA9PT0gLTEpIHsKICAgICAgICAgICAgZGlyZWN0aXZlU3R5bGluZ0xhc3QgPSB0Tm9kZS5kaXJlY3RpdmVTdGFydDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRpcmVjdGl2ZVN0eWxpbmdMYXN0Kys7CiAgICAgICAgfQogICAgICAgIHdoaWxlIChkaXJlY3RpdmVTdHlsaW5nTGFzdCA8IGRpcmVjdGl2ZUVuZCkgewogICAgICAgICAgICBjdXJyZW50RGlyZWN0aXZlID0gKC8qKiBAdHlwZSB7P30gKi8gKHREYXRhW2RpcmVjdGl2ZVN0eWxpbmdMYXN0XSkpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChjdXJyZW50RGlyZWN0aXZlLCAnZXhwZWN0ZWQgdG8gYmUgZGVmaW5lZCcpOwogICAgICAgICAgICBzdHlsaW5nS2V5ID0gY29sbGVjdFN0eWxpbmdGcm9tVEF0dHJzKHN0eWxpbmdLZXksIGN1cnJlbnREaXJlY3RpdmUuaG9zdEF0dHJzLCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICBpZiAoY3VycmVudERpcmVjdGl2ZSA9PT0gaG9zdERpcmVjdGl2ZURlZikKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBkaXJlY3RpdmVTdHlsaW5nTGFzdCsrOwogICAgICAgIH0KICAgICAgICBpZiAoaG9zdERpcmVjdGl2ZURlZiAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyB3ZSBvbmx5IGFkdmFuY2UgdGhlIHN0eWxpbmcgY3Vyc29yIGlmIHdlIGFyZSBjb2xsZWN0aW5nIGRhdGEgZnJvbSBob3N0IGJpbmRpbmdzLgogICAgICAgICAgICAvLyBUZW1wbGF0ZSBleGVjdXRlcyBiZWZvcmUgaG9zdCBiaW5kaW5ncyBhbmQgc28gaWYgd2Ugd291bGQgdXBkYXRlIHRoZSBpbmRleCwKICAgICAgICAgICAgLy8gaG9zdCBiaW5kaW5ncyB3b3VsZCBub3QgZ2V0IHRoZWlyIHN0YXRpY3MuCiAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZVN0eWxpbmdMYXN0ID0gZGlyZWN0aXZlU3R5bGluZ0xhc3Q7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdHlsaW5nS2V5OwogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0IGBUQXR0cnNgIGludG8gYFRTdHlsaW5nU3RhdGljYC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHN0eWxpbmdLZXkgZXhpc3RpbmcgYFRTdHlsaW5nS2V5YCB0byB1cGRhdGUgb3Igd3JhcC4KICAgICAqIEBwYXJhbSB7P30gYXR0cnMgYFRBdHRyaWJ1dGVzYCB0byBwcm9jZXNzLgogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbGxlY3RTdHlsaW5nRnJvbVRBdHRycyhzdHlsaW5nS2V5LCBhdHRycywgaXNDbGFzc0Jhc2VkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlc2lyZWRNYXJrZXIgPSBpc0NsYXNzQmFzZWQgPyAxIC8qIENsYXNzZXMgKi8gOiAyIC8qIFN0eWxlcyAqLzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnJlbnRNYXJrZXIgPSAtMSAvKiBJbXBsaWNpdEF0dHJpYnV0ZXMgKi87CiAgICAgICAgaWYgKGF0dHJzICE9PSBudWxsKSB7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXR0cnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXR0cnNbaV0pKTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW50TWFya2VyID0gaXRlbTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50TWFya2VyID09PSBkZXNpcmVkTWFya2VyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheShzdHlsaW5nS2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGluZ0tleSA9IHN0eWxpbmdLZXkgPT09IHVuZGVmaW5lZCA/IFtdIDogKC8qKiBAdHlwZSB7P30gKi8gKFsnJywgc3R5bGluZ0tleV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KCgvKiogQHR5cGUgez99ICovIChzdHlsaW5nS2V5KSksIGl0ZW0sIGlzQ2xhc3NCYXNlZCA/IHRydWUgOiBhdHRyc1srK2ldKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHN0eWxpbmdLZXkgPT09IHVuZGVmaW5lZCA/IG51bGwgOiBzdHlsaW5nS2V5OwogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0IHVzZXIgaW5wdXQgdG8gYEtleVZhbHVlQXJyYXlgLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gdGFrZXMgdXNlciBpbnB1dCB3aGljaCBjb3VsZCBiZSBgc3RyaW5nYCwgT2JqZWN0IGxpdGVyYWwsIG9yIGl0ZXJhYmxlIGFuZCBjb252ZXJ0cwogICAgICogaXQgaW50byBhIGNvbnNpc3RlbnQgcmVwcmVzZW50YXRpb24uIFRoZSBvdXRwdXQgb2YgdGhpcyBpcyBgS2V5VmFsdWVBcnJheWAgKHdoaWNoIGlzIGFuIGFycmF5CiAgICAgKiB3aGVyZQogICAgICogZXZlbiBpbmRleGVzIGNvbnRhaW4ga2V5cyBhbmQgb2RkIGluZGV4ZXMgY29udGFpbiB2YWx1ZXMgZm9yIHRob3NlIGtleXMpLgogICAgICoKICAgICAqIFRoZSBhZHZhbnRhZ2Ugb2YgY29udmVydGluZyB0byBgS2V5VmFsdWVBcnJheWAgaXMgdGhhdCB3ZSBjYW4gcGVyZm9ybSBkaWZmIGluIGFuIGlucHV0CiAgICAgKiBpbmRlcGVuZGVudAogICAgICogd2F5LgogICAgICogKGllIHdlIGNhbiBjb21wYXJlIGBmb28gYmFyYCB0byBgWydiYXInLCAnYmF6J10gYW5kIGRldGVybWluZSBhIHNldCBvZiBjaGFuZ2VzIHdoaWNoIG5lZWQgdG8gYmUKICAgICAqIGFwcGxpZWQpCiAgICAgKgogICAgICogVGhlIGZhY3QgdGhhdCBgS2V5VmFsdWVBcnJheWAgaXMgc29ydGVkIGlzIHZlcnkgaW1wb3J0YW50IGJlY2F1c2UgaXQgYWxsb3dzIHVzIHRvIGNvbXB1dGUgdGhlCiAgICAgKiBkaWZmZXJlbmNlIGluIGxpbmVhciBmYXNoaW9uIHdpdGhvdXQgdGhlIG5lZWQgdG8gYWxsb2NhdGUgYW55IGFkZGl0aW9uYWwgZGF0YS4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSBpZiB3ZSBrZXB0IHRoaXMgYXMgYSBgTWFwYCB3ZSB3b3VsZCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBwcmV2aW91cyBgTWFwYCB0byBkZXRlcm1pbmUKICAgICAqIHdoaWNoIHZhbHVlcyBuZWVkIHRvIGJlIGRlbGV0ZWQsIG92ZXIgdGhlIG5ldyBgTWFwYCB0byBkZXRlcm1pbmUgYWRkaXRpb25zLCBhbmQgd2Ugd291bGQgaGF2ZSB0bwogICAgICoga2VlcCBhZGRpdGlvbmFsIGBNYXBgIHRvIGtlZXAgdHJhY2sgb2YgZHVwbGljYXRlcyBvciBpdGVtcyB3aGljaCBoYXZlIG5vdCB5ZXQgYmVlbiB2aXNpdGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30ga2V5VmFsdWVBcnJheVNldCAoU2VlIGBrZXlWYWx1ZUFycmF5U2V0YCBpbiAidXRpbC9hcnJheV91dGlscyIpIEdldHMgcGFzc2VkIGluIGFzIGEKICAgICAqIGZ1bmN0aW9uIHNvIHRoYXQKICAgICAqICAgICAgICBgc3R5bGVgIGNhbiBwYXNzIGluIHZlcnNpb24gd2hpY2ggZG9lcyBzYW5pdGl6YXRpb24uIFRoaXMgaXMgZG9uZSBmb3IgdHJlZSBzaGFraW5nCiAgICAgKiAgICAgICAgcHVycG9zZXMuCiAgICAgKiBAcGFyYW0gez99IHN0cmluZ1BhcnNlciBUaGUgcGFyc2VyIGlzIHBhc3NlZCBpbiBzbyB0aGF0IGl0IHdpbGwgYmUgdHJlZSBzaGFrYWJsZS4gU2VlCiAgICAgKiAgICAgICAgYHN0eWxlU3RyaW5nUGFyc2VyYCBhbmQgYGNsYXNzU3RyaW5nUGFyc2VyYAogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gcGFyc2UvY29udmVydCB0byBgS2V5VmFsdWVBcnJheWAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvU3R5bGluZ0tleVZhbHVlQXJyYXkoa2V5VmFsdWVBcnJheVNldCwgc3RyaW5nUGFyc2VyLCB2YWx1ZSkgewogICAgICAgIGlmICh2YWx1ZSA9PSBudWxsIC8qfHwgdmFsdWUgPT09IHVuZGVmaW5lZCAqLyB8fCB2YWx1ZSA9PT0gJycpCiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoRU1QVFlfQVJSQVkkMykpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZUtleVZhbHVlQXJyYXkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdW53cmFwcGVkVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwU2FmZVZhbHVlKHZhbHVlKSkpOwogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHVud3JhcHBlZFZhbHVlKSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHVud3JhcHBlZFZhbHVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KHN0eWxlS2V5VmFsdWVBcnJheSwgdW53cmFwcGVkVmFsdWVbaV0sIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiB1bndyYXBwZWRWYWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gdW53cmFwcGVkVmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICh1bndyYXBwZWRWYWx1ZS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAga2V5VmFsdWVBcnJheVNldChzdHlsZUtleVZhbHVlQXJyYXksIGtleSwgdW53cmFwcGVkVmFsdWVba2V5XSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVud3JhcHBlZFZhbHVlID09PSAnc3RyaW5nJykgewogICAgICAgICAgICBzdHJpbmdQYXJzZXIoc3R5bGVLZXlWYWx1ZUFycmF5LCB1bndyYXBwZWRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIHRocm93RXJyb3IkMSgnVW5zdXBwb3J0ZWQgc3R5bGluZyB0eXBlICcgKyB0eXBlb2YgdW53cmFwcGVkVmFsdWUgKyAnOiAnICsgdW53cmFwcGVkVmFsdWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3R5bGVLZXlWYWx1ZUFycmF5OwogICAgfQogICAgLyoqCiAgICAgKiBTZXQgYSBgdmFsdWVgIGZvciBhIGBrZXlgIHRha2luZyBzdHlsZSBzYW5pdGl6YXRpb24gaW50byBhY2NvdW50LgogICAgICoKICAgICAqIFNlZTogYGtleVZhbHVlQXJyYXlTZXRgIGZvciBkZXRhaWxzCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBrZXlWYWx1ZUFycmF5IEtleVZhbHVlQXJyYXkgdG8gYWRkIHRvLgogICAgICogQHBhcmFtIHs/fSBrZXkgU3R5bGUga2V5IHRvIGFkZC4gKFRoaXMga2V5IHdpbGwgYmUgY2hlY2tlZCBpZiBpdCBuZWVkcyBzYW5pdGl6YXRpb24pCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBzZXQgKElmIGtleSBuZWVkcyBzYW5pdGl6YXRpb24gaXQgd2lsbCBiZSBzYW5pdGl6ZWQpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdHlsZUtleVZhbHVlQXJyYXlTZXQoa2V5VmFsdWVBcnJheSwga2V5LCB2YWx1ZSkgewogICAgICAgIGlmIChzdHlsZVByb3BOZWVkc1Nhbml0aXphdGlvbihrZXkpKSB7CiAgICAgICAgICAgIHZhbHVlID0gybXJtXNhbml0aXplU3R5bGUodmFsdWUpOwogICAgICAgIH0KICAgICAgICBrZXlWYWx1ZUFycmF5U2V0KGtleVZhbHVlQXJyYXksIGtleSwgdmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgbWFwIGJhc2VkIHN0eWxpbmcuCiAgICAgKgogICAgICogTWFwIGJhc2VkIHN0eWxpbmcgY291bGQgYmUgYW55dGhpbmcgd2hpY2ggY29udGFpbnMgbW9yZSB0aGFuIG9uZSBiaW5kaW5nLiBGb3IgZXhhbXBsZSBgc3RyaW5nYCwKICAgICAqIG9yIG9iamVjdCBsaXRlcmFsLiBEZWFsaW5nIHdpdGggYWxsIG9mIHRoZXNlIHR5cGVzIHdvdWxkIGNvbXBsaWNhdGUgdGhlIGxvZ2ljIHNvCiAgICAgKiBpbnN0ZWFkIHRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IHRoZSBjb21wbGV4IGlucHV0IGlzIGZpcnN0IGNvbnZlcnRlZCBpbnRvIG5vcm1hbGl6ZWQKICAgICAqIGBLZXlWYWx1ZUFycmF5YC4gVGhlIGFkdmFudGFnZSBvZiBub3JtYWxpemF0aW9uIGlzIHRoYXQgd2UgZ2V0IHRoZSB2YWx1ZXMgc29ydGVkLCB3aGljaCBtYWtlcyBpdAogICAgICogdmVyeSBjaGVhcCB0byBjb21wdXRlIGRlbHRhcyBiZXR3ZWVuIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3IEFzc29jaWF0ZWQgYFRWaWV3LmRhdGFgIGNvbnRhaW5zIHRoZSBsaW5rZWQgbGlzdCBvZiBiaW5kaW5nIHByaW9yaXRpZXMuCiAgICAgKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hlcmUgdGhlIGJpbmRpbmcgaXMgbG9jYXRlZC4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcgYExWaWV3YCBjb250YWlucyB0aGUgdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBvdGhlciBzdHlsaW5nIGJpbmRpbmcgYXQgdGhpcyBgVE5vZGVgLgogICAgICogQHBhcmFtIHs/fSByZW5kZXJlciBSZW5kZXJlciB0byB1c2UgaWYgYW55IHVwZGF0ZXMuCiAgICAgKiBAcGFyYW0gez99IG9sZEtleVZhbHVlQXJyYXkgUHJldmlvdXMgdmFsdWUgcmVwcmVzZW50ZWQgYXMgYEtleVZhbHVlQXJyYXlgCiAgICAgKiBAcGFyYW0gez99IG5ld0tleVZhbHVlQXJyYXkgQ3VycmVudCB2YWx1ZSByZXByZXNlbnRlZCBhcyBgS2V5VmFsdWVBcnJheWAKICAgICAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleCBCaW5kaW5nIGluZGV4IG9mIHRoZSBiaW5kaW5nLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdXBkYXRlU3R5bGluZ01hcCh0VmlldywgdE5vZGUsIGxWaWV3LCByZW5kZXJlciwgb2xkS2V5VmFsdWVBcnJheSwgbmV3S2V5VmFsdWVBcnJheSwgaXNDbGFzc0Jhc2VkLCBiaW5kaW5nSW5kZXgpIHsKICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKG9sZEtleVZhbHVlQXJyYXkpKSA9PT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIC8vIE9uIGZpcnN0IGV4ZWN1dGlvbiB0aGUgb2xkS2V5VmFsdWVBcnJheSBpcyBOT19DSEFOR0UgPT4gdHJlYXQgaXQgYXMgZW1wdHkgS2V5VmFsdWVBcnJheS4KICAgICAgICAgICAgb2xkS2V5VmFsdWVBcnJheSA9ICgvKiogQHR5cGUgez99ICovIChFTVBUWV9BUlJBWSQzKSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2xkSW5kZXggPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbmV3SW5kZXggPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgb2xkS2V5ID0gMCA8IG9sZEtleVZhbHVlQXJyYXkubGVuZ3RoID8gb2xkS2V5VmFsdWVBcnJheVswXSA6IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZXdLZXkgPSAwIDwgbmV3S2V5VmFsdWVBcnJheS5sZW5ndGggPyBuZXdLZXlWYWx1ZUFycmF5WzBdIDogbnVsbDsKICAgICAgICB3aGlsZSAob2xkS2V5ICE9PSBudWxsIHx8IG5ld0tleSAhPT0gbnVsbCkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TGVzc1RoYW4ob2xkSW5kZXgsIDk5OSwgJ0FyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPycpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TGVzc1RoYW4obmV3SW5kZXgsIDk5OSwgJ0FyZSB3ZSBzdHVjayBpbiBpbmZpbml0ZSBsb29wPycpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gb2xkSW5kZXggPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbb2xkSW5kZXggKyAxXSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXdWYWx1ZSA9IG5ld0luZGV4IDwgbmV3S2V5VmFsdWVBcnJheS5sZW5ndGggPyBuZXdLZXlWYWx1ZUFycmF5W25ld0luZGV4ICsgMV0gOiB1bmRlZmluZWQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNldEtleSA9IG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNldFZhbHVlID0gdW5kZWZpbmVkOwogICAgICAgICAgICBpZiAob2xkS2V5ID09PSBuZXdLZXkpIHsKICAgICAgICAgICAgICAgIC8vIFVQREFURTogS2V5cyBhcmUgZXF1YWwgPT4gbmV3IHZhbHVlIGlzIG92ZXJ3cml0aW5nIG9sZCB2YWx1ZS4KICAgICAgICAgICAgICAgIG9sZEluZGV4ICs9IDI7CiAgICAgICAgICAgICAgICBuZXdJbmRleCArPSAyOwogICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9PSBuZXdWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHNldEtleSA9IG5ld0tleTsKICAgICAgICAgICAgICAgICAgICBzZXRWYWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKG5ld0tleSA9PT0gbnVsbCB8fCBvbGRLZXkgIT09IG51bGwgJiYgb2xkS2V5IDwgKC8qKiBAdHlwZSB7P30gKi8gKG5ld0tleSkpKSB7CiAgICAgICAgICAgICAgICAvLyBERUxFVEU6IG9sZEtleSBrZXkgaXMgbWlzc2luZyBvciB3ZSBkaWQgbm90IGZpbmQgdGhlIG9sZEtleSBpbiB0aGUgbmV3VmFsdWUKICAgICAgICAgICAgICAgIC8vIChiZWNhdXNlIHRoZSBrZXlWYWx1ZUFycmF5IGlzIHNvcnRlZCBhbmQgYG5ld0tleWAgaXMgZm91bmQgbGF0ZXIgYWxwaGFiZXRpY2FsbHkpLgogICAgICAgICAgICAgICAgLy8gYCJiYWNrZ3JvdW5kIiA8ICJjb2xvciJgIHNvIHdlIG5lZWQgdG8gZGVsZXRlIGAiYmFja2dyb3VuZCJgIGJlY2F1c2UgaXQgaXMgbm90IGZvdW5kIGluIHRoZQogICAgICAgICAgICAgICAgLy8gbmV3IGFycmF5LgogICAgICAgICAgICAgICAgb2xkSW5kZXggKz0gMjsKICAgICAgICAgICAgICAgIHNldEtleSA9IG9sZEtleTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIENSRUFURTogbmV3S2V5J3MgaXMgZWFybGllciBhbHBoYWJldGljYWxseSB0aGFuIG9sZEtleSdzIChvciBubyBvbGRLZXkpID0+IHdlIGhhdmUgbmV3IGtleS4KICAgICAgICAgICAgICAgIC8vIGAiY29sb3IiID4gImJhY2tncm91bmQiYCBzbyB3ZSBuZWVkIHRvIGFkZCBgY29sb3JgIGJlY2F1c2UgaXQgaXMgaW4gbmV3IGFycmF5IGJ1dCBub3QgaW4KICAgICAgICAgICAgICAgIC8vIG9sZCBhcnJheS4KICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKG5ld0tleSwgJ0V4cGVjdGluZyB0byBoYXZlIGEgdmFsaWQga2V5Jyk7CiAgICAgICAgICAgICAgICBuZXdJbmRleCArPSAyOwogICAgICAgICAgICAgICAgc2V0S2V5ID0gbmV3S2V5OwogICAgICAgICAgICAgICAgc2V0VmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoc2V0S2V5ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB1cGRhdGVTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHJlbmRlcmVyLCBzZXRLZXksIHNldFZhbHVlLCBpc0NsYXNzQmFzZWQsIGJpbmRpbmdJbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb2xkS2V5ID0gb2xkSW5kZXggPCBvbGRLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG9sZEtleVZhbHVlQXJyYXlbb2xkSW5kZXhdIDogbnVsbDsKICAgICAgICAgICAgbmV3S2V5ID0gbmV3SW5kZXggPCBuZXdLZXlWYWx1ZUFycmF5Lmxlbmd0aCA/IG5ld0tleVZhbHVlQXJyYXlbbmV3SW5kZXhdIDogbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhIHNpbXBsZSAocHJvcGVydHkgbmFtZSkgc3R5bGluZy4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uIHRha2VzIGBwcm9wYCBhbmQgdXBkYXRlcyB0aGUgRE9NIHRvIHRoYXQgdmFsdWUuIFRoZSBmdW5jdGlvbiB0YWtlcyB0aGUgYmluZGluZwogICAgICogdmFsdWUgYXMgd2VsbCBhcyBiaW5kaW5nIHByaW9yaXR5IGludG8gY29uc2lkZXJhdGlvbiB0byBkZXRlcm1pbmUgd2hpY2ggdmFsdWUgc2hvdWxkIGJlIHdyaXR0ZW4KICAgICAqIHRvIERPTS4gKEZvciBleGFtcGxlIGl0IG1heSBiZSBkZXRlcm1pbmVkIHRoYXQgdGhlcmUgaXMgYSBoaWdoZXIgcHJpb3JpdHkgb3ZlcndyaXRlIHdoaWNoIGJsb2NrcwogICAgICogdGhlIERPTSB3cml0ZSwgb3IgaWYgdGhlIHZhbHVlIGdvZXMgdG8gYHVuZGVmaW5lZGAgYSBsb3dlciBwcmlvcml0eSBvdmVyd3JpdGUgbWF5IGJlIGNvbnN1bHRlZC4pCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0VmlldyBBc3NvY2lhdGVkIGBUVmlldy5kYXRhYCBjb250YWlucyB0aGUgbGlua2VkIGxpc3Qgb2YgYmluZGluZyBwcmlvcml0aWVzLgogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBgVE5vZGVgIHdoZXJlIHRoZSBiaW5kaW5nIGlzIGxvY2F0ZWQuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IGBMVmlld2AgY29udGFpbnMgdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggb3RoZXIgc3R5bGluZyBiaW5kaW5nIGF0IHRoaXMgYFROb2RlYC4KICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXIgUmVuZGVyZXIgdG8gdXNlIGlmIGFueSB1cGRhdGVzLgogICAgICogQHBhcmFtIHs/fSBwcm9wIEVpdGhlciBzdHlsZSBwcm9wZXJ0eSBuYW1lIG9yIGEgY2xhc3MgbmFtZS4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUgRWl0aGVyIHN0eWxlIHZhbHVlIGZvciBgcHJvcGAgb3IgYHRydWVgL2BmYWxzZWAgaWYgYHByb3BgIGlzIGNsYXNzLgogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICAgICAqIEBwYXJhbSB7P30gYmluZGluZ0luZGV4IEJpbmRpbmcgaW5kZXggb2YgdGhlIGJpbmRpbmcuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB1cGRhdGVTdHlsaW5nKHRWaWV3LCB0Tm9kZSwgbFZpZXcsIHJlbmRlcmVyLCBwcm9wLCB2YWx1ZSwgaXNDbGFzc0Jhc2VkLCBiaW5kaW5nSW5kZXgpIHsKICAgICAgICBpZiAodE5vZGUudHlwZSAhPT0gMyAvKiBFbGVtZW50ICovKSB7CiAgICAgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgc3R5bGluZyBvbiBub24tZWxlbWVudHMgKHN1Y2ggYXMgbmctY29udGFpbmVyKS4KICAgICAgICAgICAgLy8gVGhpcyBpcyByYXJlLCBidXQgaXQgZG9lcyBoYXBwZW4uIEluIHN1Y2ggYSBjYXNlLCBqdXN0IGlnbm9yZSB0aGUgYmluZGluZy4KICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdERhdGEgPSB0Vmlldy5kYXRhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0UmFuZ2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAodERhdGFbYmluZGluZ0luZGV4ICsgMV0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaGlnaGVyUHJpb3JpdHlWYWx1ZSA9IGdldFRTdHlsaW5nUmFuZ2VOZXh0RHVwbGljYXRlKHRSYW5nZSkgPwogICAgICAgICAgICBmaW5kU3R5bGluZ1ZhbHVlKHREYXRhLCB0Tm9kZSwgbFZpZXcsIHByb3AsIGdldFRTdHlsaW5nUmFuZ2VOZXh0KHRSYW5nZSksIGlzQ2xhc3NCYXNlZCkgOgogICAgICAgICAgICB1bmRlZmluZWQ7CiAgICAgICAgaWYgKCFpc1N0eWxpbmdWYWx1ZVByZXNlbnQoaGlnaGVyUHJpb3JpdHlWYWx1ZSkpIHsKICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIG5leHQgZHVwbGljYXRlLCBvciB3ZSBkaWQgbm90IGZpbmQgYSBkdXBsaWNhdGUgdmFsdWUuCiAgICAgICAgICAgIGlmICghaXNTdHlsaW5nVmFsdWVQcmVzZW50KHZhbHVlKSkgewogICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIGRlbGV0ZSBjdXJyZW50IHZhbHVlIG9yIHJlc3RvcmUgdG8gbG93ZXIgcHJpb3JpdHkgdmFsdWUuCiAgICAgICAgICAgICAgICBpZiAoZ2V0VFN0eWxpbmdSYW5nZVByZXZEdXBsaWNhdGUodFJhbmdlKSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYSBwb3NzaWJsZSBwcmV2IGR1cGxpY2F0ZSwgbGV0J3MgcmV0cmlldmUgaXQuCiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBmaW5kU3R5bGluZ1ZhbHVlKHREYXRhLCBudWxsLCBsVmlldywgcHJvcCwgYmluZGluZ0luZGV4LCBpc0NsYXNzQmFzZWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgck5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TmF0aXZlQnlJbmRleChnZXRTZWxlY3RlZEluZGV4KCksIGxWaWV3KSkpOwogICAgICAgICAgICBhcHBseVN0eWxpbmcocmVuZGVyZXIsIGlzQ2xhc3NCYXNlZCwgck5vZGUsIHByb3AsIHZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNlYXJjaCBmb3Igc3R5bGluZyB2YWx1ZSB3aXRoIGhpZ2hlciBwcmlvcml0eSB3aGljaCBpcyBvdmVyd3JpdGluZyBjdXJyZW50IHZhbHVlLCBvciBhCiAgICAgKiB2YWx1ZSBvZiBsb3dlciBwcmlvcml0eSB0byB3aGljaCB3ZSBzaG91bGQgZmFsbCBiYWNrIGlmIHRoZSB2YWx1ZSBpcyBgdW5kZWZpbmVkYC4KICAgICAqCiAgICAgKiBXaGVuIHZhbHVlIGlzIGJlaW5nIGFwcGxpZWQgYXQgYSBsb2NhdGlvbiwgcmVsYXRlZCB2YWx1ZXMgbmVlZCB0byBiZSBjb25zdWx0ZWQuCiAgICAgKiAtIElmIHRoZXJlIGlzIGEgaGlnaGVyIHByaW9yaXR5IGJpbmRpbmcsIHdlIHNob3VsZCBiZSB1c2luZyB0aGF0IG9uZSBpbnN0ZWFkLgogICAgICogICBGb3IgZXhhbXBsZSBgPGRpdiAgW3N0eWxlXT0ie2NvbG9yOmV4cDF9IiBbc3R5bGUuY29sb3JdPSJleHAyIj5gIGNoYW5nZSB0byBgZXhwMWAKICAgICAqICAgcmVxdWlyZXMgdGhhdCB3ZSBjaGVjayBgZXhwMmAgdG8gc2VlIGlmIGl0IGlzIHNldCB0byB2YWx1ZSBvdGhlciB0aGFuIGB1bmRlZmluZWRgLgogICAgICogLSBJZiB0aGVyZSBpcyBhIGxvd2VyIHByaW9yaXR5IGJpbmRpbmcgYW5kIHdlIGFyZSBjaGFuZ2luZyB0byBgdW5kZWZpbmVkYAogICAgICogICBGb3IgZXhhbXBsZSBgPGRpdiAgW3N0eWxlXT0ie2NvbG9yOmV4cDF9IiBbc3R5bGUuY29sb3JdPSJleHAyIj5gIGNoYW5nZSB0byBgZXhwMmAgdG8KICAgICAqICAgYHVuZGVmaW5lZGAgcmVxdWlyZXMgdGhhdCB3ZSBjaGVjayBgZXhwMWAgKGFuZCBzdGF0aWMgdmFsdWVzKSBhbmQgdXNlIHRoYXQgYXMgbmV3IHZhbHVlLgogICAgICoKICAgICAqIE5PVEU6IFRoZSBzdHlsaW5nIHN0b3JlcyB0d28gdmFsdWVzLgogICAgICogMS4gVGhlIHJhdyB2YWx1ZSB3aGljaCBjYW1lIGZyb20gdGhlIGFwcGxpY2F0aW9uIGlzIHN0b3JlZCBhdCBgaW5kZXggKyAwYCBsb2NhdGlvbi4gKFRoaXMgdmFsdWUKICAgICAqICAgIGlzIHVzZWQgZm9yIGRpcnR5IGNoZWNraW5nKS4KICAgICAqIDIuIFRoZSBub3JtYWxpemVkIHZhbHVlIChjb252ZXJ0ZWQgdG8gYEtleVZhbHVlQXJyYXlgIGlmIG1hcCBhbmQgc2FuaXRpemVkKSBpcyBzdG9yZWQgYXQgYGluZGV4ICsKICAgICAqIDFgLgogICAgICogICAgVGhlIGFkdmFudGFnZSBvZiBzdG9yaW5nIHRoZSBzYW5pdGl6ZWQgdmFsdWUgaXMgdGhhdCBvbmNlIHRoZSB2YWx1ZSBpcyB3cml0dGVuIHdlIGRvbid0IG5lZWQKICAgICAqICAgIHRvIHdvcnJ5IGFib3V0IHNhbml0aXppbmcgaXQgbGF0ZXIgb3Iga2VlcGluZyB0cmFjayBvZiB0aGUgc2FuaXRpemVyLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdERhdGEgYFREYXRhYCB1c2VkIGZvciB0cmF2ZXJzaW5nIHRoZSBwcmlvcml0eS4KICAgICAqIEBwYXJhbSB7P30gdE5vZGUgYFROb2RlYCB0byB1c2UgZm9yIHJlc29sdmluZyBzdGF0aWMgc3R5bGluZy4gQWxzbyBjb250cm9scyBzZWFyY2ggZGlyZWN0aW9uLgogICAgICogICAtIGBUTm9kZWAgc2VhcmNoIG5leHQgYW5kIHF1aXQgYXMgc29vbiBhcyBgaXNTdHlsaW5nVmFsdWVQcmVzZW50KHZhbHVlKWAgaXMgdHJ1ZS4KICAgICAqICAgICAgSWYgbm8gdmFsdWUgZm91bmQgY29uc3VsdCBgdE5vZGUucmVzaWR1YWxTdHlsZWAvYHROb2RlLnJlc2lkdWFsQ2xhc3NgIGZvciBkZWZhdWx0IHZhbHVlLgogICAgICogICAtIGBudWxsYCBzZWFyY2ggcHJldiBhbmQgZ28gYWxsIHRoZSB3YXkgdG8gZW5kLiBSZXR1cm4gbGFzdCB2YWx1ZSB3aGVyZQogICAgICogICAgIGBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpYCBpcyB0cnVlLgogICAgICogQHBhcmFtIHs/fSBsVmlldyBgTFZpZXdgIHVzZWQgZm9yIHJldHJpZXZpbmcgdGhlIGFjdHVhbCB2YWx1ZXMuCiAgICAgKiBAcGFyYW0gez99IHByb3AgUHJvcGVydHkgd2hpY2ggd2UgYXJlIGludGVyZXN0ZWQgaW4uCiAgICAgKiBAcGFyYW0gez99IGluZGV4IFN0YXJ0aW5nIGluZGV4IGluIHRoZSBsaW5rZWQgbGlzdCBvZiBzdHlsaW5nIGJpbmRpbmdzIHdoZXJlIHRoZSBzZWFyY2ggc2hvdWxkIHN0YXJ0LgogICAgICogQHBhcmFtIHs/fSBpc0NsYXNzQmFzZWQgYHRydWVgIGlmIGBjbGFzc2AgKGBmYWxzZWAgaWYgYHN0eWxlYCkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRTdHlsaW5nVmFsdWUodERhdGEsIHROb2RlLCBsVmlldywgcHJvcCwgaW5kZXgsIGlzQ2xhc3NCYXNlZCkgewogICAgICAgIC8vIGBUTm9kZWAgdG8gdXNlIGZvciByZXNvbHZpbmcgc3RhdGljIHN0eWxpbmcuIEFsc28gY29udHJvbHMgc2VhcmNoIGRpcmVjdGlvbi4KICAgICAgICAvLyAgIC0gYFROb2RlYCBzZWFyY2ggbmV4dCBhbmQgcXVpdCBhcyBzb29uIGFzIGBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpYCBpcyB0cnVlLgogICAgICAgIC8vICAgICAgSWYgbm8gdmFsdWUgZm91bmQgY29uc3VsdCBgdE5vZGUucmVzaWR1YWxTdHlsZWAvYHROb2RlLnJlc2lkdWFsQ2xhc3NgIGZvciBkZWZhdWx0IHZhbHVlLgogICAgICAgIC8vICAgLSBgbnVsbGAgc2VhcmNoIHByZXYgYW5kIGdvIGFsbCB0aGUgd2F5IHRvIGVuZC4gUmV0dXJuIGxhc3QgdmFsdWUgd2hlcmUKICAgICAgICAvLyAgICAgYGlzU3R5bGluZ1ZhbHVlUHJlc2VudCh2YWx1ZSlgIGlzIHRydWUuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzUHJldkRpcmVjdGlvbiA9IHROb2RlID09PSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsdWUgPSB1bmRlZmluZWQ7CiAgICAgICAgd2hpbGUgKGluZGV4ID4gMCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJhd0tleSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtpbmRleF0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250YWluc1N0YXRpY3MgPSBBcnJheS5pc0FycmF5KHJhd0tleSk7CiAgICAgICAgICAgIC8vIFVud3JhcCB0aGUga2V5IGlmIHdlIGNvbnRhaW4gc3RhdGljIHZhbHVlcy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXkgPSBjb250YWluc1N0YXRpY3MgPyAoKC8qKiBAdHlwZSB7P30gKi8gKHJhd0tleSkpKVsxXSA6IHJhd0tleTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1N0eWxpbmdNYXAgPSBrZXkgPT09IG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlQXRMVmlld0luZGV4ID0gbFZpZXdbaW5kZXggKyAxXTsKICAgICAgICAgICAgaWYgKHZhbHVlQXRMVmlld0luZGV4ID09PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgICAgIC8vIEluIGZpcnN0VXBkYXRlUGFzcyB0aGUgc3R5bGluZyBpbnN0cnVjdGlvbnMgY3JlYXRlIGEgbGlua2VkIGxpc3Qgb2Ygc3R5bGluZy4KICAgICAgICAgICAgICAgIC8vIE9uIHN1YnNlcXVlbnQgcGFzc2VzIGl0IGlzIHBvc3NpYmxlIGZvciBhIHN0eWxpbmcgaW5zdHJ1Y3Rpb24gdG8gdHJ5IHRvIHJlYWQgYSBiaW5kaW5nCiAgICAgICAgICAgICAgICAvLyB3aGljaAogICAgICAgICAgICAgICAgLy8gaGFzIG5vdCB5ZXQgZXhlY3V0ZWQuIEluIHRoYXQgY2FzZSB3ZSB3aWxsIGZpbmQgYE5PX0NIQU5HRWAgYW5kIHdlIHNob3VsZCBhc3N1bWUgdGhhdAogICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBgdW5kZWZpbmVkYCAob3IgZW1wdHkgYXJyYXkgaW4gY2FzZSBvZiBzdHlsaW5nLW1hcCBpbnN0cnVjdGlvbikgaW5zdGVhZC4gVGhpcwogICAgICAgICAgICAgICAgLy8gYWxsb3dzIHRoZSByZXNvbHV0aW9uIHRvIGFwcGx5IHRoZSB2YWx1ZSAod2hpY2ggbWF5IGxhdGVyIGJlIG92ZXJ3cml0dGVuIHdoZW4gdGhlCiAgICAgICAgICAgICAgICAvLyBiaW5kaW5nIGFjdHVhbGx5IGV4ZWN1dGVzLikKICAgICAgICAgICAgICAgIHZhbHVlQXRMVmlld0luZGV4ID0gaXNTdHlsaW5nTWFwID8gRU1QVFlfQVJSQVkkMyA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjdXJyZW50VmFsdWUgPSBpc1N0eWxpbmdNYXAgPyBrZXlWYWx1ZUFycmF5R2V0KHZhbHVlQXRMVmlld0luZGV4LCBwcm9wKSA6CiAgICAgICAgICAgICAgICBrZXkgPT09IHByb3AgPyB2YWx1ZUF0TFZpZXdJbmRleCA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKGNvbnRhaW5zU3RhdGljcyAmJiAhaXNTdHlsaW5nVmFsdWVQcmVzZW50KGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZSA9IGtleVZhbHVlQXJyYXlHZXQoKC8qKiBAdHlwZSB7P30gKi8gKHJhd0tleSkpLCBwcm9wKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNTdHlsaW5nVmFsdWVQcmVzZW50KGN1cnJlbnRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIHZhbHVlID0gY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgaWYgKGlzUHJldkRpcmVjdGlvbikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRSYW5nZSA9ICgvKiogQHR5cGUgez99ICovICh0RGF0YVtpbmRleCArIDFdKSk7CiAgICAgICAgICAgIGluZGV4ID0gaXNQcmV2RGlyZWN0aW9uID8gZ2V0VFN0eWxpbmdSYW5nZVByZXYodFJhbmdlKSA6IGdldFRTdHlsaW5nUmFuZ2VOZXh0KHRSYW5nZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0Tm9kZSAhPT0gbnVsbCkgewogICAgICAgICAgICAvLyBpbiBjYXNlIHdoZXJlIHdlIGFyZSBnb2luZyBpbiBuZXh0IGRpcmVjdGlvbiBBTkQgd2UgZGlkIG5vdCBmaW5kIGFueXRoaW5nLCB3ZSBuZWVkIHRvCiAgICAgICAgICAgIC8vIGNvbnN1bHQgcmVzaWR1YWwgc3R5bGluZwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZXNpZHVhbCA9IGlzQ2xhc3NCYXNlZCA/IHROb2RlLnJlc2lkdWFsQ2xhc3NlcyA6IHROb2RlLnJlc2lkdWFsU3R5bGVzOwogICAgICAgICAgICBpZiAocmVzaWR1YWwgIT0gbnVsbCAvKiogT1IgcmVzaWR1YWwgIT09PSB1bmRlZmluZWQgKi8pIHsKICAgICAgICAgICAgICAgIHZhbHVlID0ga2V5VmFsdWVBcnJheUdldCgoLyoqIEB0eXBlIHs/fSAqLyAocmVzaWR1YWwpKSwgcHJvcCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmVzIGlmIHRoZSBiaW5kaW5nIHZhbHVlIHNob3VsZCBiZSB1c2VkIChvciBpZiB0aGUgdmFsdWUgaXMgJ3VuZGVmaW5lZCcgYW5kIGhlbmNlIHByaW9yaXR5CiAgICAgKiByZXNvbHV0aW9uIHNob3VsZCBiZSB1c2VkLikKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIEJpbmRpbmcgc3R5bGUgdmFsdWUuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1N0eWxpbmdWYWx1ZVByZXNlbnQodmFsdWUpIHsKICAgICAgICAvLyBDdXJyZW50bHkgb25seSBgdW5kZWZpbmVkYCB2YWx1ZSBpcyBjb25zaWRlcmVkIG5vbi1iaW5kaW5nLiBUaGF0IGlzIGB1bmRlZmluZWRgIHNheXMgSSBkb24ndAogICAgICAgIC8vIGhhdmUgYW4gb3BpbmlvbiBhcyB0byB3aGF0IHRoaXMgYmluZGluZyBzaG91bGQgYmUgYW5kIHlvdSBzaG91bGQgY29uc3VsdCBvdGhlciBiaW5kaW5ncyBieQogICAgICAgIC8vIHByaW9yaXR5IHRvIGRldGVybWluZSB0aGUgdmFsaWQgdmFsdWUuCiAgICAgICAgLy8gVGhpcyBpcyBleHRyYWN0ZWQgaW50byBhIHNpbmdsZSBmdW5jdGlvbiBzbyB0aGF0IHdlIGhhdmUgYSBzaW5nbGUgcGxhY2UgdG8gY29udHJvbCB0aGlzLgogICAgICAgIHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkOwogICAgfQogICAgLyoqCiAgICAgKiBTYW5pdGl6ZXMgb3IgYWRkcyBzdWZmaXggdG8gdGhlIHZhbHVlLgogICAgICoKICAgICAqIElmIHZhbHVlIGlzIGBudWxsYC9gdW5kZWZpbmVkYCBubyBzdWZmaXggaXMgYWRkZWQKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7P30gc3VmZml4T3JTYW5pdGl6ZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUFuZEFwcGx5U3VmZml4T3JTYW5pdGl6ZXIodmFsdWUsIHN1ZmZpeE9yU2FuaXRpemVyKSB7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgLyoqIHx8IHZhbHVlID09PSB1bmRlZmluZWQgKi8pIDsKICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc3VmZml4T3JTYW5pdGl6ZXIgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgLy8gc2FuaXRpemUgdGhlIHZhbHVlLgogICAgICAgICAgICB2YWx1ZSA9IHN1ZmZpeE9yU2FuaXRpemVyKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHN1ZmZpeE9yU2FuaXRpemVyID09PSAnc3RyaW5nJykgewogICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICsgc3VmZml4T3JTYW5pdGl6ZXI7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgdmFsdWUgPSBzdHJpbmdpZnkodW53cmFwU2FmZVZhbHVlKHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KICAgIC8qKgogICAgICogVGVzdHMgaWYgdGhlIGBUTm9kZWAgaGFzIGlucHV0IHNoYWRvdy4KICAgICAqCiAgICAgKiBBbiBpbnB1dCBzaGFkb3cgaXMgd2hlbiBhIGRpcmVjdGl2ZSBzdGVhbHMgKHNoYWRvd3MpIHRoZSBpbnB1dCBieSB1c2luZyBgXEBJbnB1dCgnc3R5bGUnKWAgb3IKICAgICAqIGBcQElucHV0KCdjbGFzcycpYCBhcyBpbnB1dC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHROb2RlIGBUTm9kZWAgd2hpY2ggd2Ugd291bGQgbGlrZSB0byBzZWUgaWYgaXQgaGFzIHNoYWRvdy4KICAgICAqIEBwYXJhbSB7P30gaXNDbGFzc0Jhc2VkIGB0cnVlYCBpZiBgY2xhc3NgIChgZmFsc2VgIGlmIGBzdHlsZWApCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBoYXNTdHlsaW5nSW5wdXRTaGFkb3codE5vZGUsIGlzQ2xhc3NCYXNlZCkgewogICAgICAgIHJldHVybiAodE5vZGUuZmxhZ3MgJiAoaXNDbGFzc0Jhc2VkID8gMTYgLyogaGFzQ2xhc3NJbnB1dCAqLyA6IDMyIC8qIGhhc1N0eWxlSW5wdXQgKi8pKSAhPT0gMDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3RleHQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDcmVhdGUgc3RhdGljIHRleHQgbm9kZQogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBvZiB0aGUgbm9kZSBpbiB0aGUgZGF0YSBhcnJheQogICAgICogQHBhcmFtIHs/PX0gdmFsdWUgU3RhdGljIHN0cmluZyB2YWx1ZSB0byB3cml0ZS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1dGV4dChpbmRleCwgdmFsdWUgPSAnJykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgYXNzZXJ0RXF1YWwoZ2V0QmluZGluZ0luZGV4KCksIHRWaWV3LmJpbmRpbmdTdGFydEluZGV4LCAndGV4dCBub2RlcyBzaG91bGQgYmUgY3JlYXRlZCBiZWZvcmUgYW55IGJpbmRpbmdzJyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCBhZGp1c3RlZEluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSB0Vmlldy5maXJzdENyZWF0ZVBhc3MgPwogICAgICAgICAgICBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBpbmRleCwgMyAvKiBFbGVtZW50ICovLCBudWxsLCBudWxsKSA6CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW2FkanVzdGVkSW5kZXhdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRleHROYXRpdmUgPSBsVmlld1thZGp1c3RlZEluZGV4XSA9IGNyZWF0ZVRleHROb2RlKHZhbHVlLCBsVmlld1tSRU5ERVJFUl0pOwogICAgICAgIGFwcGVuZENoaWxkKHRWaWV3LCBsVmlldywgdGV4dE5hdGl2ZSwgdE5vZGUpOwogICAgICAgIC8vIFRleHQgbm9kZXMgYXJlIHNlbGYgY2xvc2luZy4KICAgICAgICBzZXRQcmV2aW91c09yUGFyZW50VE5vZGUodE5vZGUsIGZhbHNlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3RleHRfaW50ZXJwb2xhdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggYSBsb25lIGJvdW5kIHZhbHVlCiAgICAgKgogICAgICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdCwgYW4gbm8gYWRkaXRpb25hbCB0ZXh0CiAgICAgKiBzdXJyb3VuZHMgdGhhdCBpbnRlcnBvbGF0ZWQgdmFsdWU6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdj57e3YwfX08L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXRleHRJbnRlcnBvbGF0ZSh2MCk7CiAgICAgKiBgYGAKICAgICAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHYwCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybV0ZXh0SW50ZXJwb2xhdGUodjApIHsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgnJywgdjAsICcnKTsKICAgICAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSB0ZXh0IGNvbnRlbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdj5wcmVmaXh7e3YwfX1zdWZmaXg8L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXRleHRJbnRlcnBvbGF0ZTEoJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTEocHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjEobFZpZXcsIHByZWZpeCwgdjAsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGUxOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gYSB0ZXh0IG5vZGUgaGFzIDIgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2PnByZWZpeHt7djB9fS17e3YxfX1zdWZmaXg8L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXRleHRJbnRlcnBvbGF0ZTIoJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTIocHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgICAgICB0ZXh0QmluZGluZ0ludGVybmFsKGxWaWV3LCBnZXRTZWxlY3RlZEluZGV4KCksICgvKiogQHR5cGUgez99ICovIChpbnRlcnBvbGF0ZWQpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlMjsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSB0ZXh0IGNvbnRlbnQgd2l0aCAzIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IG90aGVyIHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIGEgdGV4dCBub2RlIGhhcyAzIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdj5wcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeDwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1dGV4dEludGVycG9sYXRlMygKICAgICAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXgKICAgICAqIEBwYXJhbSB7P30gdjAKICAgICAqIEBwYXJhbSB7P30gaTAKICAgICAqIEBwYXJhbSB7P30gdjEKICAgICAqIEBwYXJhbSB7P30gaTEKICAgICAqIEBwYXJhbSB7P30gdjIKICAgICAqIEBwYXJhbSB7P30gc3VmZml4CiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybV0ZXh0SW50ZXJwb2xhdGUzKHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGUzOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gYSB0ZXh0IG5vZGUgaGFzIDQgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2PnByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fXN1ZmZpeDwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1dGV4dEludGVycG9sYXRlNCgKICAgICAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKiBAc2VlIMm1ybV0ZXh0SW50ZXJwb2xhdGVWCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJlZml4CiAgICAgKiBAcGFyYW0gez99IHYwCiAgICAgKiBAcGFyYW0gez99IGkwCiAgICAgKiBAcGFyYW0gez99IHYxCiAgICAgKiBAcGFyYW0gez99IGkxCiAgICAgKiBAcGFyYW0gez99IHYyCiAgICAgKiBAcGFyYW0gez99IGkyCiAgICAgKiBAcGFyYW0gez99IHYzCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeAogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1dGV4dEludGVycG9sYXRlNChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uNChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2Mywgc3VmZml4KTsKICAgICAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTQ7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNSBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fXN1ZmZpeDwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1dGV4dEludGVycG9sYXRlNSgKICAgICAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKiBAc2VlIHRleHRJbnRlcnBvbGF0ZVYKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXgKICAgICAqIEBwYXJhbSB7P30gdjAKICAgICAqIEBwYXJhbSB7P30gaTAKICAgICAqIEBwYXJhbSB7P30gdjEKICAgICAqIEBwYXJhbSB7P30gaTEKICAgICAqIEBwYXJhbSB7P30gdjIKICAgICAqIEBwYXJhbSB7P30gaTIKICAgICAqIEBwYXJhbSB7P30gdjMKICAgICAqIEBwYXJhbSB7P30gaTMKICAgICAqIEBwYXJhbSB7P30gdjQKICAgICAqIEBwYXJhbSB7P30gc3VmZml4CiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybV0ZXh0SW50ZXJwb2xhdGU1KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjUobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KTsKICAgICAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTU7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggNiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX1zdWZmaXg8L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXRleHRJbnRlcnBvbGF0ZTYoCiAgICAgKiAgICAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBpMwogICAgICogQHBhcmFtIHs/fSB2NAogICAgICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuIFxAcmV0dXJucyBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTYocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZCA9IGludGVycG9sYXRpb242KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KTsKICAgICAgICBpZiAoaW50ZXJwb2xhdGVkICE9PSBOT19DSEFOR0UpIHsKICAgICAgICAgICAgdGV4dEJpbmRpbmdJbnRlcm5hbChsVmlldywgZ2V0U2VsZWN0ZWRJbmRleCgpLCAoLyoqIEB0eXBlIHs/fSAqLyAoaW50ZXJwb2xhdGVkKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXRleHRJbnRlcnBvbGF0ZTY7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgdGV4dCBjb250ZW50IHdpdGggNyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSBvdGhlciB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiBhIHRleHQgbm9kZSBoYXMgNyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19c3VmZml4PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybV0ZXh0SW50ZXJwb2xhdGU3KAogICAgICogICAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBpMwogICAgICogQHBhcmFtIHs/fSB2NAogICAgICogQHBhcmFtIHs/fSBpNAogICAgICogQHBhcmFtIHs/fSB2NQogICAgICogQHBhcmFtIHs/fSBpNQogICAgICogQHBhcmFtIHs/fSB2NgogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTcocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGU3OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDggYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgb3RoZXIgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gYSB0ZXh0IG5vZGUgaGFzIDggaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2PnByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX1zdWZmaXg8L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXRleHRJbnRlcnBvbGF0ZTgoCiAgICAgKiAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqIEBzZWUgdGV4dEludGVycG9sYXRlVgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICogQHBhcmFtIHs/fSB2MAogICAgICogQHBhcmFtIHs/fSBpMAogICAgICogQHBhcmFtIHs/fSB2MQogICAgICogQHBhcmFtIHs/fSBpMQogICAgICogQHBhcmFtIHs/fSB2MgogICAgICogQHBhcmFtIHs/fSBpMgogICAgICogQHBhcmFtIHs/fSB2MwogICAgICogQHBhcmFtIHs/fSBpMwogICAgICogQHBhcmFtIHs/fSB2NAogICAgICogQHBhcmFtIHs/fSBpNAogICAgICogQHBhcmFtIHs/fSB2NQogICAgICogQHBhcmFtIHs/fSBpNQogICAgICogQHBhcmFtIHs/fSB2NgogICAgICogQHBhcmFtIHs/fSBpNgogICAgICogQHBhcmFtIHs/fSB2NwogICAgICogQHBhcmFtIHs/fSBzdWZmaXgKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZTgocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWQgPSBpbnRlcnBvbGF0aW9uOChsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2NiwgaTYsIHY3LCBzdWZmaXgpOwogICAgICAgIGlmIChpbnRlcnBvbGF0ZWQgIT09IE5PX0NIQU5HRSkgewogICAgICAgICAgICB0ZXh0QmluZGluZ0ludGVybmFsKGxWaWV3LCBnZXRTZWxlY3RlZEluZGV4KCksICgvKiogQHR5cGUgez99ICovIChpbnRlcnBvbGF0ZWQpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiDJtcm1dGV4dEludGVycG9sYXRlODsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIHRleHQgY29udGVudCB3aXRoIDkgb3IgbW9yZSBib3VuZCB2YWx1ZXMgb3RoZXIgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgbnVtYmVyIG9mIGludGVycG9sYXRlZCB2YWx1ZXMgZXhjZWVkcyA4LgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXY+cHJlZml4e3t2MH19LXt7djF9fS17e3YyfX0te3t2M319LXt7djR9fS17e3Y1fX0te3t2Nn19LXt7djd9fS17e3Y4fX0te3t2OX19c3VmZml4PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybV0ZXh0SW50ZXJwb2xhdGVWKAogICAgICogIFsncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICctJywgdjcsICctJywgdjksCiAgICAgKiAgJ3N1ZmZpeCddKTsKICAgICAqIGBgYAogICAgICogLgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHZhbHVlcyBUaGUgY29sbGVjdGlvbiBvZiB2YWx1ZXMgYW5kIHRoZSBzdHJpbmdzIGluIGJldHdlZW4gdGhvc2UgdmFsdWVzLCBiZWdpbm5pbmcgd2l0aAogICAgICogYSBzdHJpbmcgcHJlZml4IGFuZCBlbmRpbmcgd2l0aCBhIHN0cmluZyBzdWZmaXguCiAgICAgKiAoZS5nLiBgWydwcmVmaXgnLCB2YWx1ZTAsICctJywgdmFsdWUxLCAnLScsIHZhbHVlMiwgLi4uLCB2YWx1ZTk5LCAnc3VmZml4J11gKQogICAgICoKICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRleHRJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkID0gaW50ZXJwb2xhdGlvblYobFZpZXcsIHZhbHVlcyk7CiAgICAgICAgaWYgKGludGVycG9sYXRlZCAhPT0gTk9fQ0hBTkdFKSB7CiAgICAgICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIGdldFNlbGVjdGVkSW5kZXgoKSwgKC8qKiBAdHlwZSB7P30gKi8gKGludGVycG9sYXRlZCkpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIMm1ybV0ZXh0SW50ZXJwb2xhdGVWOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvY2xhc3NfbWFwX2ludGVycG9sYXRpb24udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBjbGFzcyBvbiBhbiBlbGVtZW50IHdpdGggc2luZ2xlIGJvdW5kIHZhbHVlIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAxIGludGVycG9sYXRlZCB2YWx1ZSBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTEoJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTEocHJlZml4LCB2MCwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMShsVmlldywgcHJlZml4LCB2MCwgc3VmZml4KTsKICAgICAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGludGVycG9sYXRlZFZhbHVlLCB0cnVlKTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgY2xhc3Mgb24gYW4gZWxlbWVudCB3aXRoIDIgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyAyIGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBjbGFzcz0icHJlZml4e3t2MH19LXt7djF9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlMigncHJlZml4JywgdjAsICctJywgdjEsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUyKHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBzdWZmaXgpOwogICAgICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBjbGFzcyBvbiBhbiBlbGVtZW50IHdpdGggMyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDMgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlMygKICAgICAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlNCgKICAgICAqICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU0KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjQobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNSBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTUoCiAgICAgKiAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU1KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNShsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBzdWZmaXgpOwogICAgICAgIGNoZWNrU3R5bGluZ01hcChrZXlWYWx1ZUFycmF5U2V0LCBjbGFzc1N0cmluZ1BhcnNlciwgaW50ZXJwb2xhdGVkVmFsdWUsIHRydWUpOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBjbGFzcyBvbiBhbiBlbGVtZW50IHdpdGggNiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDYgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlNigKICAgICAqICAgICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlNihwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVjbGFzc01hcEludGVycG9sYXRlNygKICAgICAqICAgICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU3KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nTWFwKGtleVZhbHVlQXJyYXlTZXQsIGNsYXNzU3RyaW5nUGFyc2VyLCBpbnRlcnBvbGF0ZWRWYWx1ZSwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIGNsYXNzIG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgOCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgY2xhc3M9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTgoCiAgICAgKiAgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY2IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjcgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVjbGFzc01hcEludGVycG9sYXRlOChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgICAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGludGVycG9sYXRlZFZhbHVlLCB0cnVlKTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBjbGFzcyBvbiBhbiBlbGVtZW50IHdpdGggOSBvciBtb3JlIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSBudW1iZXIgb2YgaW50ZXJwb2xhdGVkIHZhbHVlcyBleGNlZWRzIDguCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdgogICAgICogIGNsYXNzPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19LXt7djV9fS17e3Y2fX0te3t2N319LXt7djh9fS17e3Y5fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYoCiAgICAgKiAgWydwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwgJy0nLCB2NywgJy0nLCB2OSwKICAgICAqICAnc3VmZml4J10pOwogICAgICogYGBgCiAgICAgKiAuCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gdmFsdWVzIFRoZSBjb2xsZWN0aW9uIG9mIHZhbHVlcyBhbmQgdGhlIHN0cmluZ3MgaW4tYmV0d2VlbiB0aG9zZSB2YWx1ZXMsIGJlZ2lubmluZyB3aXRoCiAgICAgKiBhIHN0cmluZyBwcmVmaXggYW5kIGVuZGluZyB3aXRoIGEgc3RyaW5nIHN1ZmZpeC4KICAgICAqIChlLmcuIGBbJ3ByZWZpeCcsIHZhbHVlMCwgJy0nLCB2YWx1ZTEsICctJywgdmFsdWUyLCAuLi4sIHZhbHVlOTksICdzdWZmaXgnXWApCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYodmFsdWVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uVihsVmlldywgdmFsdWVzKTsKICAgICAgICBjaGVja1N0eWxpbmdNYXAoa2V5VmFsdWVBcnJheVNldCwgY2xhc3NTdHJpbmdQYXJzZXIsIGludGVycG9sYXRlZFZhbHVlLCB0cnVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3N0eWxlX21hcF9pbnRlcnBvbGF0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIHNpbmdsZSBib3VuZCB2YWx1ZSBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMSBpbnRlcnBvbGF0ZWQgdmFsdWUgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTEoJ2tleTogJywgdjAsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMShwcmVmaXgsIHYwLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24xKGxWaWV3LCBwcmVmaXgsIHYwLCBzdWZmaXgpOwogICAgICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCAyIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIoJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMihwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjIobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgc3VmZml4KTsKICAgICAgICDJtcm1c3R5bGVNYXAoaW50ZXJwb2xhdGVkVmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBvbiBhbiBlbGVtZW50IHdpdGggMyBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDMgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHN0eWxlPSJrZXk6IHt7djB9fTsga2V5Mjoge3t2MX19OyBrZXkyOiB7e3YyfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTMoCiAgICAgKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlMyhwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2Miwgc3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICAgICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDQgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA0IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTQoCiAgICAgKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpOwogICAgICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCA1IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNSBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319OyBrZXk0OiB7e3Y0fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUoCiAgICAgKiAgICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNShwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjUobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgc3VmZml4KTsKICAgICAgICDJtcm1c3R5bGVNYXAoaW50ZXJwb2xhdGVkVmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBvbiBhbiBlbGVtZW50IHdpdGggNiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDYgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHN0eWxlPSJrZXk6IHt7djB9fTsga2V5MToge3t2MX19OyBrZXkyOiB7e3YyfX07IGtleTM6IHt7djN9fTsga2V5NDoge3t2NH19OwogICAgICogICAgICAgICAgICAga2V5NToge3t2NX19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU2KAogICAgICogICAgJ2tleTogJywgdjAsICc7IGtleTE6ICcsIHYxLCAnOyBrZXkyOiAnLCB2MiwgJzsga2V5MzogJywgdjMsICc7IGtleTQ6ICcsIHY0LCAnOyBrZXk1OiAnLCB2NSwKICAgICAqICAgICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMyBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk0IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY1IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTYocHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjYobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgpOwogICAgICAgIMm1ybVzdHlsZU1hcChpbnRlcnBvbGF0ZWRWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGU9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319OyBrZXk0OiB7e3Y0fX07IGtleTU6IHt7djV9fTsKICAgICAqICAgICAgICAgICAgIGtleTY6IHt7djZ9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVzdHlsZU1hcEludGVycG9sYXRlNygKICAgICAqICAgICdrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICc7IGtleTM6ICcsIHYzLCAnOyBrZXk0OiAnLCB2NCwgJzsga2V5NTogJywgdjUsCiAgICAgKiAgICAnOyBrZXk2OiAnLCB2NiwgJ3N1ZmZpeCcpOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU3KHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCk7CiAgICAgICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKICAgIH0KICAgIC8qKgogICAgICoKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgb24gYW4gZWxlbWVudCB3aXRoIDggYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIHZhbHVlIHBhc3NlZCB0byBhIHByb3BlcnR5IGhhcyA4IGludGVycG9sYXRlZCB2YWx1ZXMgaW4gaXQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGRpdiBzdHlsZT0ia2V5OiB7e3YwfX07IGtleTE6IHt7djF9fTsga2V5Mjoge3t2Mn19OyBrZXkzOiB7e3YzfX07IGtleTQ6IHt7djR9fTsga2V5NToge3t2NX19OwogICAgICogICAgICAgICAgICAga2V5Njoge3t2Nn19OyBrZXk3OiB7e3Y3fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgoCiAgICAgKiAgICAna2V5OiAnLCB2MCwgJzsga2V5MTogJywgdjEsICc7IGtleTI6ICcsIHYyLCAnOyBrZXkzOiAnLCB2MywgJzsga2V5NDogJywgdjQsICc7IGtleTU6ICcsIHY1LAogICAgICogICAgJzsga2V5NjogJywgdjYsICc7IGtleTc6ICcsIHY3LCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJlZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYwIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTAgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjEgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkyIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYzIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTMgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjQgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk1IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY2IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTYgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjcgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZU1hcEludGVycG9sYXRlOChwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjgobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIGk2LCB2Nywgc3VmZml4KTsKICAgICAgICDJtcm1c3R5bGVNYXAoaW50ZXJwb2xhdGVkVmFsdWUpOwogICAgfQogICAgLyoqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIG9uIGFuIGVsZW1lbnQgd2l0aCA5IG9yIG1vcmUgYm91bmQgdmFsdWVzIHN1cnJvdW5kZWQgYnkgdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIG51bWJlciBvZiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGV4Y2VlZHMgOC4KICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2CiAgICAgKiAgY2xhc3M9ImtleToge3t2MH19OyBrZXkxOiB7e3YxfX07IGtleTI6IHt7djJ9fTsga2V5Mzoge3t2M319OyBrZXk0OiB7e3Y0fX07IGtleTU6IHt7djV9fTsKICAgICAqICAgICAgICAga2V5Njoge3t2Nn19OyBrZXk3OiB7e3Y3fX07IGtleTg6IHt7djh9fTsga2V5OToge3t2OX19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGVWKAogICAgICogICAgWydrZXk6ICcsIHYwLCAnOyBrZXkxOiAnLCB2MSwgJzsga2V5MjogJywgdjIsICc7IGtleTM6ICcsIHYzLCAnOyBrZXk0OiAnLCB2NCwgJzsga2V5NTogJywgdjUsCiAgICAgKiAgICAgJzsga2V5NjogJywgdjYsICc7IGtleTc6ICcsIHY3LCAnOyBrZXk4OiAnLCB2OCwgJzsga2V5OTogJywgdjksICdzdWZmaXgnXSk7CiAgICAgKiBgYGAKICAgICAqIC4KICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICAgICAqIGEgc3RyaW5nIHByZWZpeCBhbmQgZW5kaW5nIHdpdGggYSBzdHJpbmcgc3VmZml4LgogICAgICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnOyBrZXkyOiAnLCB2YWx1ZTEsICc7IGtleTI6ICcsIHZhbHVlMiwgLi4uLCB2YWx1ZTk5LCAnc3VmZml4J11gKQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXN0eWxlTWFwSW50ZXJwb2xhdGVWKHZhbHVlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvblYobFZpZXcsIHZhbHVlcyk7CiAgICAgICAgybXJtXN0eWxlTWFwKGludGVycG9sYXRlZFZhbHVlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaW5zdHJ1Y3Rpb25zL3N0eWxlX3Byb3BfaW50ZXJwb2xhdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCBzaW5nbGUgYm91bmQgdmFsdWUgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDEgaW50ZXJwb2xhdGVkIHZhbHVlIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEoMCwgJ3ByZWZpeCcsIHYwLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxKHByb3AsIHByZWZpeCwgdjAsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24xKGxWaWV3LCBwcmVmaXgsIHYwLCBzdWZmaXgpOwogICAgICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxOwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggMiBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDIgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlMigwLCAncHJlZml4JywgdjAsICctJywgdjEsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlMihwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb24yKGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTI7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCAzIGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgMyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlMygwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUzKHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBzdWZmaXgsIHZhbHVlU3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uMyhsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTM7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA0IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQoMCwgJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnc3VmZml4Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHBhcmFtIHs/fSBwcmVmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjAgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MSBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkxIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYyIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTIgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjMgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0KHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb240KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBzdWZmaXgpOwogICAgICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0OwogICAgfQogICAgLyoqCiAgICAgKgogICAgICogVXBkYXRlIGFuIGludGVycG9sYXRlZCBzdHlsZSBwcm9wZXJ0eSBvbiBhbiBlbGVtZW50IHdpdGggNSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieSB0ZXh0LgogICAgICoKICAgICAqIFVzZWQgd2hlbiB0aGUgdmFsdWUgcGFzc2VkIHRvIGEgcHJvcGVydHkgaGFzIDUgaW50ZXJwb2xhdGVkIHZhbHVlcyBpbiBpdDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2IHN0eWxlLmNvbG9yPSJwcmVmaXh7e3YwfX0te3t2MX19LXt7djJ9fS17e3YzfX0te3t2NH19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlNSgwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlNShwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb241KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTU7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA2IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19c3VmZml4Ij48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlNigwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBzdWZmaXggU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU2KHByb3AsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBzdWZmaXgsIHZhbHVlU3VmZml4KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZXJwb2xhdGVkVmFsdWUgPSBpbnRlcnBvbGF0aW9uNihsVmlldywgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTY7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA3IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgNyBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fXN1ZmZpeCI+PC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJdHMgY29tcGlsZWQgcmVwcmVzZW50YXRpb24gaXM6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTcoCiAgICAgKiAgICAwLCAncHJlZml4JywgdjAsICctJywgdjEsICctJywgdjIsICctJywgdjMsICctJywgdjQsICctJywgdjUsICctJywgdjYsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IHN1ZmZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/PX0gdmFsdWVTdWZmaXggT3B0aW9uYWwgc3VmZml4LiBVc2VkIHdpdGggc2NhbGFyIHZhbHVlcyB0byBhZGQgdW5pdCBzdWNoIGFzIGBweGAuCiAgICAgKiBAcmV0dXJuIHs/fSBpdHNlbGYsIHNvIHRoYXQgaXQgbWF5IGJlIGNoYWluZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTcocHJvcCwgcHJlZml4LCB2MCwgaTAsIHYxLCBpMSwgdjIsIGkyLCB2MywgaTMsIHY0LCBpNCwgdjUsIGk1LCB2Niwgc3VmZml4LCB2YWx1ZVN1ZmZpeCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGludGVycG9sYXRlZFZhbHVlID0gaW50ZXJwb2xhdGlvbjcobFZpZXcsIHByZWZpeCwgdjAsIGkwLCB2MSwgaTEsIHYyLCBpMiwgdjMsIGkzLCB2NCwgaTQsIHY1LCBpNSwgdjYsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTc7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVcGRhdGUgYW4gaW50ZXJwb2xhdGVkIHN0eWxlIHByb3BlcnR5IG9uIGFuIGVsZW1lbnQgd2l0aCA4IGJvdW5kIHZhbHVlcyBzdXJyb3VuZGVkIGJ5IHRleHQuCiAgICAgKgogICAgICogVXNlZCB3aGVuIHRoZSB2YWx1ZSBwYXNzZWQgdG8gYSBwcm9wZXJ0eSBoYXMgOCBpbnRlcnBvbGF0ZWQgdmFsdWVzIGluIGl0OgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxkaXYgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX1zdWZmaXgiPjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogSXRzIGNvbXBpbGVkIHJlcHJlc2VudGF0aW9uIGlzOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU4KDAsICdwcmVmaXgnLCB2MCwgJy0nLCB2MSwgJy0nLCB2MiwgJy0nLCB2MywgJy0nLCB2NCwgJy0nLCB2NSwgJy0nLCB2NiwKICAgICAqICctJywgdjcsICdzdWZmaXgnKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcGFyYW0gez99IHByZWZpeCBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MCBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkwIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHYxIFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTEgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjIgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpMiBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2MyBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGkzIFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY0IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gaTQgU3RhdGljIHZhbHVlIHVzZWQgZm9yIGNvbmNhdGVuYXRpb24gb25seS4KICAgICAqIEBwYXJhbSB7P30gdjUgVmFsdWUgY2hlY2tlZCBmb3IgY2hhbmdlLgogICAgICogQHBhcmFtIHs/fSBpNSBTdGF0aWMgdmFsdWUgdXNlZCBmb3IgY29uY2F0ZW5hdGlvbiBvbmx5LgogICAgICogQHBhcmFtIHs/fSB2NiBWYWx1ZSBjaGVja2VkIGZvciBjaGFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGk2IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez99IHY3IFZhbHVlIGNoZWNrZWQgZm9yIGNoYW5nZS4KICAgICAqIEBwYXJhbSB7P30gc3VmZml4IFN0YXRpYyB2YWx1ZSB1c2VkIGZvciBjb25jYXRlbmF0aW9uIG9ubHkuCiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZVN1ZmZpeCBPcHRpb25hbCBzdWZmaXguIFVzZWQgd2l0aCBzY2FsYXIgdmFsdWVzIHRvIGFkZCB1bml0IHN1Y2ggYXMgYHB4YC4KICAgICAqIEByZXR1cm4gez99IGl0c2VsZiwgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZC4KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXN0eWxlUHJvcEludGVycG9sYXRlOChwcm9wLCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCwgdmFsdWVTdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb244KGxWaWV3LCBwcmVmaXgsIHYwLCBpMCwgdjEsIGkxLCB2MiwgaTIsIHYzLCBpMywgdjQsIGk0LCB2NSwgaTUsIHY2LCBpNiwgdjcsIHN1ZmZpeCk7CiAgICAgICAgY2hlY2tTdHlsaW5nUHJvcGVydHkocHJvcCwgaW50ZXJwb2xhdGVkVmFsdWUsIHZhbHVlU3VmZml4LCBmYWxzZSk7CiAgICAgICAgcmV0dXJuIMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTg7CiAgICB9CiAgICAvKioKICAgICAqIFVwZGF0ZSBhbiBpbnRlcnBvbGF0ZWQgc3R5bGUgcHJvcGVydHkgb24gYW4gZWxlbWVudCB3aXRoIDkgb3IgbW9yZSBib3VuZCB2YWx1ZXMgc3Vycm91bmRlZCBieQogICAgICogdGV4dC4KICAgICAqCiAgICAgKiBVc2VkIHdoZW4gdGhlIG51bWJlciBvZiBpbnRlcnBvbGF0ZWQgdmFsdWVzIGV4Y2VlZHMgOC4KICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8ZGl2CiAgICAgKiAgc3R5bGUuY29sb3I9InByZWZpeHt7djB9fS17e3YxfX0te3t2Mn19LXt7djN9fS17e3Y0fX0te3t2NX19LXt7djZ9fS17e3Y3fX0te3t2OH19LXt7djl9fXN1ZmZpeCI+CiAgICAgKiA8L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEl0cyBjb21waWxlZCByZXByZXNlbnRhdGlvbiBpczoKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogybXJtXN0eWxlUHJvcEludGVycG9sYXRlVigKICAgICAqICAwLCBbJ3ByZWZpeCcsIHYwLCAnLScsIHYxLCAnLScsIHYyLCAnLScsIHYzLCAnLScsIHY0LCAnLScsIHY1LCAnLScsIHY2LCAnLScsIHY3LCAnLScsIHY5LAogICAgICogICdzdWZmaXgnXSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHBhcmFtIHs/fSB2YWx1ZXMgVGhlIGNvbGxlY3Rpb24gb2YgdmFsdWVzIGFuZCB0aGUgc3RyaW5ncyBpbi1iZXR3ZWVuIHRob3NlIHZhbHVlcywgYmVnaW5uaW5nIHdpdGgKICAgICAqIGEgc3RyaW5nIHByZWZpeCBhbmQgZW5kaW5nIHdpdGggYSBzdHJpbmcgc3VmZml4LgogICAgICogKGUuZy4gYFsncHJlZml4JywgdmFsdWUwLCAnLScsIHZhbHVlMSwgJy0nLCB2YWx1ZTIsIC4uLiwgdmFsdWU5OSwgJ3N1ZmZpeCddYCkKICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlU3VmZml4IE9wdGlvbmFsIHN1ZmZpeC4gVXNlZCB3aXRoIHNjYWxhciB2YWx1ZXMgdG8gYWRkIHVuaXQgc3VjaCBhcyBgcHhgLgogICAgICogQHJldHVybiB7P30gaXRzZWxmLCBzbyB0aGF0IGl0IG1heSBiZSBjaGFpbmVkLgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGVWKHByb3AsIHZhbHVlcywgdmFsdWVTdWZmaXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbnRlcnBvbGF0ZWRWYWx1ZSA9IGludGVycG9sYXRpb25WKGxWaWV3LCB2YWx1ZXMpOwogICAgICAgIGNoZWNrU3R5bGluZ1Byb3BlcnR5KHByb3AsIGludGVycG9sYXRlZFZhbHVlLCB2YWx1ZVN1ZmZpeCwgZmFsc2UpOwogICAgICAgIHJldHVybiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGVWOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvaG9zdF9wcm9wZXJ0eS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFVwZGF0ZSBhIHByb3BlcnR5IG9uIGEgaG9zdCBlbGVtZW50LiBPbmx5IGFwcGxpZXMgdG8gbmF0aXZlIG5vZGUgcHJvcGVydGllcywgbm90IGlucHV0cy4KICAgICAqCiAgICAgKiBPcGVyYXRlcyBvbiB0aGUgZWxlbWVudCBzZWxlY3RlZCBieSBpbmRleCB2aWEgdGhlIHtcQGxpbmsgc2VsZWN0fSBpbnN0cnVjdGlvbi4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHByb3BOYW1lIE5hbWUgb2YgcHJvcGVydHkuIEJlY2F1c2UgaXQgaXMgZ29pbmcgdG8gRE9NLCB0aGlzIGlzIG5vdCBzdWJqZWN0IHRvCiAgICAgKiAgICAgICAgcmVuYW1pbmcgYXMgcGFydCBvZiBtaW5pZmljYXRpb24uCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIE5ldyB2YWx1ZSB0byB3cml0ZS4KICAgICAqIEBwYXJhbSB7Pz19IHNhbml0aXplciBBbiBvcHRpb25hbCBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSB2YWx1ZS4KICAgICAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogICAgICogKGUuZy4gYHByb3BlcnR5KCduYW1lJywgY3R4Lm5hbWUpKCd0aXRsZScsIGN0eC50aXRsZSlgKQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtWhvc3RQcm9wZXJ0eShwcm9wTmFtZSwgdmFsdWUsIHNhbml0aXplcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IG5leHRCaW5kaW5nSW5kZXgoKTsKICAgICAgICBpZiAoYmluZGluZ1VwZGF0ZWQobFZpZXcsIGJpbmRpbmdJbmRleCwgdmFsdWUpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHROb2RlID0gZ2V0U2VsZWN0ZWRUTm9kZSgpOwogICAgICAgICAgICBlbGVtZW50UHJvcGVydHlJbnRlcm5hbCh0VmlldywgdE5vZGUsIGxWaWV3LCBwcm9wTmFtZSwgdmFsdWUsIGxWaWV3W1JFTkRFUkVSXSwgc2FuaXRpemVyLCB0cnVlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtWhvc3RQcm9wZXJ0eTsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyBhIHN5bnRoZXRpYyBob3N0IGJpbmRpbmcgKGUuZy4gYFtcQGZvb11gKSBvbiBhIGNvbXBvbmVudCBvciBkaXJlY3RpdmUuCiAgICAgKgogICAgICogVGhpcyBpbnN0cnVjdGlvbiBpcyBmb3IgY29tcGF0aWJpbGl0eSBwdXJwb3NlcyBhbmQgaXMgZGVzaWduZWQgdG8gZW5zdXJlIHRoYXQgYQogICAgICogc3ludGhldGljIGhvc3QgYmluZGluZyAoZS5nLiBgXEBIb3N0QmluZGluZygnXEBmb28nKWApIHByb3Blcmx5IGdldHMgcmVuZGVyZWQgaW4KICAgICAqIHRoZSBjb21wb25lbnQncyByZW5kZXJlci4gTm9ybWFsbHkgYWxsIGhvc3QgYmluZGluZ3MgYXJlIGV2YWx1YXRlZCB3aXRoIHRoZSBwYXJlbnQKICAgICAqIGNvbXBvbmVudCdzIHJlbmRlcmVyLCBidXQsIGluIHRoZSBjYXNlIG9mIGFuaW1hdGlvbiBcQHRyaWdnZXJzLCB0aGV5IG5lZWQgdG8gYmUKICAgICAqIGV2YWx1YXRlZCB3aXRoIHRoZSBzdWIgY29tcG9uZW50J3MgcmVuZGVyZXIgKGJlY2F1c2UgdGhhdCdzIHdoZXJlIHRoZSBhbmltYXRpb24KICAgICAqIHRyaWdnZXJzIGFyZSBkZWZpbmVkKS4KICAgICAqCiAgICAgKiBEbyBub3QgdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gYXMgYSByZXBsYWNlbWVudCBmb3IgYGVsZW1lbnRQcm9wZXJ0eWAuIFRoaXMgaW5zdHJ1Y3Rpb24KICAgICAqIG9ubHkgZXhpc3RzIHRvIGVuc3VyZSBjb21wYXRpYmlsaXR5IHdpdGggdGhlIFZpZXdFbmdpbmUncyBob3N0IGJpbmRpbmcgYmVoYXZpb3IuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBwcm9wTmFtZSBOYW1lIG9mIHByb3BlcnR5LiBCZWNhdXNlIGl0IGlzIGdvaW5nIHRvIERPTSwgdGhpcyBpcyBub3Qgc3ViamVjdCB0bwogICAgICogICAgICAgIHJlbmFtaW5nIGFzIHBhcnQgb2YgbWluaWZpY2F0aW9uLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBOZXcgdmFsdWUgdG8gd3JpdGUuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgQW4gb3B0aW9uYWwgZnVuY3Rpb24gdXNlZCB0byBzYW5pdGl6ZSB0aGUgdmFsdWUuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nKHByb3BOYW1lLCB2YWx1ZSwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gbmV4dEJpbmRpbmdJbmRleCgpOwogICAgICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCB2YWx1ZSkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRTZWxlY3RlZFROb2RlKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudERlZiA9IGdldEN1cnJlbnREaXJlY3RpdmVEZWYodFZpZXcuZGF0YSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsb2FkQ29tcG9uZW50UmVuZGVyZXIoY3VycmVudERlZiwgdE5vZGUsIGxWaWV3KTsKICAgICAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIHROb2RlLCBsVmlldywgcHJvcE5hbWUsIHZhbHVlLCByZW5kZXJlciwgc2FuaXRpemVyLCB0cnVlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIHN0b3JlUHJvcGVydHlCaW5kaW5nTWV0YWRhdGEodFZpZXcuZGF0YSwgdE5vZGUsIHByb3BOYW1lLCBiaW5kaW5nSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gybXJtXVwZGF0ZVN5bnRoZXRpY0hvc3RCaW5kaW5nOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pbnN0cnVjdGlvbnMvYWxsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdXRpbC9kaXNjb3ZlcnlfdXRpbHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbXBvbmVudCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBET00gZWxlbWVudC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIEdpdmVuIHRoZSBmb2xsb3dpbmcgRE9NIHN0cnVjdHVyZToKICAgICAqIGBgYGh0bWwKICAgICAqIDxteS1hcHA+CiAgICAgKiAgIDxkaXY+CiAgICAgKiAgICAgPGNoaWxkLWNvbXA+PC9jaGlsZC1jb21wPgogICAgICogICA8L2Rpdj4KICAgICAqIDwvbXktYXBwPgogICAgICogYGBgCiAgICAgKiBDYWxsaW5nIGBnZXRDb21wb25lbnRgIG9uIGA8Y2hpbGQtY29tcD5gIHdpbGwgcmV0dXJuIHRoZSBpbnN0YW5jZSBvZiBgQ2hpbGRDb21wb25lbnRgCiAgICAgKiBhc3NvY2lhdGVkIHdpdGggdGhpcyBET00gZWxlbWVudC4KICAgICAqCiAgICAgKiBDYWxsaW5nIHRoZSBmdW5jdGlvbiBvbiBgPG15LWFwcD5gIHdpbGwgcmV0dXJuIHRoZSBgTXlBcHBgIGluc3RhbmNlLgogICAgICoKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogXEBnbG9iYWxBcGkgbmcKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRE9NIGVsZW1lbnQgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IHNob3VsZCBiZSByZXRyaWV2ZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBDb21wb25lbnQgaW5zdGFuY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50IG9yIGBudWxsYCBpZiB0aGVyZQogICAgICogICAgaXMgbm8gY29tcG9uZW50IGFzc29jaWF0ZWQgd2l0aCBpdC4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbXBvbmVudChlbGVtZW50KSB7CiAgICAgICAgYXNzZXJ0RG9tRWxlbWVudChlbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGV4dCA9IGxvYWRMQ29udGV4dChlbGVtZW50LCBmYWxzZSk7CiAgICAgICAgaWYgKGNvbnRleHQgPT09IG51bGwpCiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIGlmIChjb250ZXh0LmNvbXBvbmVudCA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNvbnRleHQuY29tcG9uZW50ID0gZ2V0Q29tcG9uZW50QXROb2RlSW5kZXgoY29udGV4dC5ub2RlSW5kZXgsIGNvbnRleHQubFZpZXcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY29tcG9uZW50KSk7CiAgICB9CiAgICAvKioKICAgICAqIElmIGluc2lkZSBhbiBlbWJlZGRlZCB2aWV3IChlLmcuIGAqbmdJZmAgb3IgYCpuZ0ZvcmApLCByZXRyaWV2ZXMgdGhlIGNvbnRleHQgb2YgdGhlIGVtYmVkZGVkCiAgICAgKiB2aWV3IHRoYXQgdGhlIGVsZW1lbnQgaXMgcGFydCBvZi4gT3RoZXJ3aXNlIHJldHJpZXZlcyB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCB3aG9zZSB2aWV3CiAgICAgKiBvd25zIHRoZSBlbGVtZW50IChpbiB0aGlzIGNhc2UsIHRoZSByZXN1bHQgaXMgdGhlIHNhbWUgYXMgY2FsbGluZyBgZ2V0T3duaW5nQ29tcG9uZW50YCkuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIFxAZ2xvYmFsQXBpIG5nCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBlbGVtZW50IEVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgc3Vycm91bmRpbmcgY29tcG9uZW50IGluc3RhbmNlLgogICAgICogQHJldHVybiB7P30gSW5zdGFuY2Ugb2YgdGhlIGNvbXBvbmVudCB0aGF0IGlzIGFyb3VuZCB0aGUgZWxlbWVudCBvciBudWxsIGlmIHRoZSBlbGVtZW50IGlzbid0CiAgICAgKiAgICBpbnNpZGUgYW55IGNvbXBvbmVudC4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbnRleHQoZWxlbWVudCkgewogICAgICAgIGFzc2VydERvbUVsZW1lbnQoZWxlbWVudCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRleHQgPSBsb2FkTENvbnRleHQoZWxlbWVudCwgZmFsc2UpOwogICAgICAgIHJldHVybiBjb250ZXh0ID09PSBudWxsID8gbnVsbCA6ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmxWaWV3W0NPTlRFWFRdKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyB0aGUgY29tcG9uZW50IGluc3RhbmNlIHdob3NlIHZpZXcgY29udGFpbnMgdGhlIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCBpZiBgPGNoaWxkLWNvbXA+YCBpcyB1c2VkIGluIHRoZSB0ZW1wbGF0ZSBvZiBgPGFwcC1jb21wPmAKICAgICAqIChpLmUuIGEgYFZpZXdDaGlsZGAgb2YgYDxhcHAtY29tcD5gKSwgY2FsbGluZyBgZ2V0T3duaW5nQ29tcG9uZW50YCBvbiBgPGNoaWxkLWNvbXA+YAogICAgICogd291bGQgcmV0dXJuIGA8YXBwLWNvbXA+YC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogXEBnbG9iYWxBcGkgbmcKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPckRpciBET00gZWxlbWVudCwgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBpbnN0YW5jZQogICAgICogICAgZm9yIHdoaWNoIHRvIHJldHJpZXZlIHRoZSByb290IGNvbXBvbmVudHMuCiAgICAgKiBAcmV0dXJuIHs/fSBDb21wb25lbnQgaW5zdGFuY2Ugd2hvc2UgdmlldyBvd25zIHRoZSBET00gZWxlbWVudCBvciBudWxsIGlmIHRoZSBlbGVtZW50IGlzIG5vdAogICAgICogICAgcGFydCBvZiBhIGNvbXBvbmVudCB2aWV3LgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0T3duaW5nQ29tcG9uZW50KGVsZW1lbnRPckRpcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb250ZXh0ID0gbG9hZExDb250ZXh0KGVsZW1lbnRPckRpciwgZmFsc2UpOwogICAgICAgIGlmIChjb250ZXh0ID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGxWaWV3ID0gY29udGV4dC5sVmlldzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcmVudDsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0TFZpZXcobFZpZXcpOwogICAgICAgIHdoaWxlIChsVmlld1tIT1NUXSA9PT0gbnVsbCAmJiAocGFyZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldExWaWV3UGFyZW50KGxWaWV3KSkpKSkgewogICAgICAgICAgICAvLyBBcyBsb25nIGFzIGxWaWV3W0hPU1RdIGlzIG51bGwgd2Uga25vdyB3ZSBhcmUgcGFydCBvZiBzdWItdGVtcGxhdGUgc3VjaCBhcyBgKm5nSWZgCiAgICAgICAgICAgIGxWaWV3ID0gcGFyZW50OwogICAgICAgIH0KICAgICAgICByZXR1cm4gbFZpZXdbRkxBR1NdICYgNTEyIC8qIElzUm9vdCAqLyA/IG51bGwgOiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbQ09OVEVYVF0pKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGFsbCByb290IGNvbXBvbmVudHMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NIGVsZW1lbnQsIGRpcmVjdGl2ZSBvciBjb21wb25lbnQgaW5zdGFuY2UuCiAgICAgKiBSb290IGNvbXBvbmVudHMgYXJlIHRob3NlIHdoaWNoIGhhdmUgYmVlbiBib290c3RyYXBwZWQgYnkgQW5ndWxhci4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogXEBnbG9iYWxBcGkgbmcKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudE9yRGlyIERPTSBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlCiAgICAgKiAgICBmb3Igd2hpY2ggdG8gcmV0cmlldmUgdGhlIHJvb3QgY29tcG9uZW50cy4KICAgICAqIEByZXR1cm4gez99IFJvb3QgY29tcG9uZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHRhcmdldCBvYmplY3QuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBnZXRSb290Q29tcG9uZW50cyhlbGVtZW50T3JEaXIpIHsKICAgICAgICByZXR1cm4gWy4uLmdldFJvb3RDb250ZXh0KGVsZW1lbnRPckRpcikuY29tcG9uZW50c107CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhbiBgSW5qZWN0b3JgIGFzc29jaWF0ZWQgd2l0aCBhbiBlbGVtZW50LCBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBcQGdsb2JhbEFwaSBuZwogICAgICogQHBhcmFtIHs/fSBlbGVtZW50T3JEaXIgRE9NIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UgZm9yIHdoaWNoIHRvCiAgICAgKiAgICByZXRyaWV2ZSB0aGUgaW5qZWN0b3IuCiAgICAgKiBAcmV0dXJuIHs/fSBJbmplY3RvciBhc3NvY2lhdGVkIHdpdGggdGhlIGVsZW1lbnQsIGNvbXBvbmVudCBvciBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBnZXRJbmplY3RvcihlbGVtZW50T3JEaXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGV4dCA9IGxvYWRMQ29udGV4dChlbGVtZW50T3JEaXIsIGZhbHNlKTsKICAgICAgICBpZiAoY29udGV4dCA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIEluamVjdG9yLk5VTEw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQubFZpZXdbVFZJRVddLmRhdGFbY29udGV4dC5ub2RlSW5kZXhdKSk7CiAgICAgICAgcmV0dXJuIG5ldyBOb2RlSW5qZWN0b3IodE5vZGUsIGNvbnRleHQubFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgZGlyZWN0aXZlIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggYSBnaXZlbiBET00gZWxlbWVudC4gRG9lcyBub3QgaW5jbHVkZQogICAgICogY29tcG9uZW50IGluc3RhbmNlcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIEdpdmVuIHRoZSBmb2xsb3dpbmcgRE9NIHN0cnVjdHVyZToKICAgICAqIGBgYAogICAgICogPG15LWFwcD4KICAgICAqICAgPGJ1dHRvbiBteS1idXR0b24+PC9idXR0b24+CiAgICAgKiAgIDxteS1jb21wPjwvbXktY29tcD4KICAgICAqIDwvbXktYXBwPgogICAgICogYGBgCiAgICAgKiBDYWxsaW5nIGBnZXREaXJlY3RpdmVzYCBvbiBgPGJ1dHRvbj5gIHdpbGwgcmV0dXJuIGFuIGFycmF5IHdpdGggYW4gaW5zdGFuY2Ugb2YgdGhlIGBNeUJ1dHRvbmAKICAgICAqIGRpcmVjdGl2ZSB0aGF0IGlzIGFzc29jaWF0ZWQgd2l0aCB0aGUgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogQ2FsbGluZyBgZ2V0RGlyZWN0aXZlc2Agb24gYDxteS1jb21wPmAgd2lsbCByZXR1cm4gYW4gZW1wdHkgYXJyYXkuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIFxAZ2xvYmFsQXBpIG5nCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRE9NIGVsZW1lbnQgZm9yIHdoaWNoIHRvIGdldCB0aGUgZGlyZWN0aXZlcy4KICAgICAqIEByZXR1cm4gez99IEFycmF5IG9mIGRpcmVjdGl2ZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBlbGVtZW50LgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlcyhlbGVtZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbnRleHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAobG9hZExDb250ZXh0KGVsZW1lbnQpKSk7CiAgICAgICAgaWYgKGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIGNvbnRleHQuZGlyZWN0aXZlcyA9IGdldERpcmVjdGl2ZXNBdE5vZGVJbmRleChjb250ZXh0Lm5vZGVJbmRleCwgY29udGV4dC5sVmlldywgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvLyBUaGUgYGRpcmVjdGl2ZXNgIGluIHRoaXMgY2FzZSBhcmUgYSBuYW1lZCBhcnJheSBjYWxsZWQgYExDb21wb25lbnRWaWV3YC4gQ2xvbmUgdGhlCiAgICAgICAgLy8gcmVzdWx0IHNvIHdlIGRvbid0IGV4cG9zZSBhbiBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZSBpbiB0aGUgdXNlcidzIGNvbnNvbGUuCiAgICAgICAgcmV0dXJuIGNvbnRleHQuZGlyZWN0aXZlcyA9PT0gbnVsbCA/IFtdIDogWy4uLmNvbnRleHQuZGlyZWN0aXZlc107CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcGFyYW0gez89fSB0aHJvd09uTm90Rm91bmQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvYWRMQ29udGV4dCh0YXJnZXQsIHRocm93T25Ob3RGb3VuZCA9IHRydWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29udGV4dCA9IGdldExDb250ZXh0KHRhcmdldCk7CiAgICAgICAgaWYgKCFjb250ZXh0ICYmIHRocm93T25Ob3RGb3VuZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IobmdEZXZNb2RlID8gYFVuYWJsZSB0byBmaW5kIGNvbnRleHQgYXNzb2NpYXRlZCB3aXRoICR7c3RyaW5naWZ5Rm9yRXJyb3IodGFyZ2V0KX1gIDoKICAgICAgICAgICAgICAgICdJbnZhbGlkIG5nIHRhcmdldCcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29udGV4dDsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIHRoZSBob3N0IGVsZW1lbnQgb2YgYSBjb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICogVGhlIGhvc3QgZWxlbWVudCBpcyB0aGUgRE9NIGVsZW1lbnQgdGhhdCBtYXRjaGVkIHRoZSBzZWxlY3RvciBvZiB0aGUgZGlyZWN0aXZlLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBcQGdsb2JhbEFwaSBuZwogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRPckRpcmVjdGl2ZSBDb21wb25lbnQgb3IgZGlyZWN0aXZlIGluc3RhbmNlIGZvciB3aGljaCB0aGUgaG9zdAogICAgICogICAgIGVsZW1lbnQgc2hvdWxkIGJlIHJldHJpZXZlZC4KICAgICAqIEByZXR1cm4gez99IEhvc3QgZWxlbWVudCBvZiB0aGUgdGFyZ2V0LgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZ2V0SG9zdEVsZW1lbnQoY29tcG9uZW50T3JEaXJlY3RpdmUpIHsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0TENvbnRleHQoY29tcG9uZW50T3JEaXJlY3RpdmUpKSkubmF0aXZlKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGEgbGlzdCBvZiBldmVudCBsaXN0ZW5lcnMgYXNzb2NpYXRlZCB3aXRoIGEgRE9NIGVsZW1lbnQuIFRoZSBsaXN0IGRvZXMgaW5jbHVkZSBob3N0CiAgICAgKiBsaXN0ZW5lcnMsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIGV2ZW50IGxpc3RlbmVycyBkZWZpbmVkIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgY29udGV4dAogICAgICogKGUuZy4gdGhyb3VnaCBgYWRkRXZlbnRMaXN0ZW5lcmApLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogR2l2ZW4gdGhlIGZvbGxvd2luZyBET00gc3RydWN0dXJlOgogICAgICogYGBgCiAgICAgKiA8bXktYXBwPgogICAgICogICA8ZGl2IChjbGljayk9ImRvU29tZXRoaW5nKCkiPjwvZGl2PgogICAgICogPC9teS1hcHA+CiAgICAgKgogICAgICogYGBgCiAgICAgKiBDYWxsaW5nIGBnZXRMaXN0ZW5lcnNgIG9uIGA8ZGl2PmAgd2lsbCByZXR1cm4gYW4gb2JqZWN0IHRoYXQgbG9va3MgYXMgZm9sbG93czoKICAgICAqIGBgYAogICAgICogewogICAgICogICBuYW1lOiAnY2xpY2snLAogICAgICogICBlbGVtZW50OiA8ZGl2PiwKICAgICAqICAgY2FsbGJhY2s6ICgpID0+IGRvU29tZXRoaW5nKCksCiAgICAgKiAgIHVzZUNhcHR1cmU6IGZhbHNlCiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogXEBnbG9iYWxBcGkgbmcKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBFbGVtZW50IGZvciB3aGljaCB0aGUgRE9NIGxpc3RlbmVycyBzaG91bGQgYmUgcmV0cmlldmVkLgogICAgICogQHJldHVybiB7P30gQXJyYXkgb2YgZXZlbnQgbGlzdGVuZXJzIG9uIHRoZSBET00gZWxlbWVudC4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExpc3RlbmVycyhlbGVtZW50KSB7CiAgICAgICAgYXNzZXJ0RG9tRWxlbWVudChlbGVtZW50KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbENvbnRleHQgPSBsb2FkTENvbnRleHQoZWxlbWVudCwgZmFsc2UpOwogICAgICAgIGlmIChsQ29udGV4dCA9PT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGxDb250ZXh0LmxWaWV3OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGxWaWV3W1RWSUVXXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbENsZWFudXAgPSBsVmlld1tDTEVBTlVQXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdENsZWFudXAgPSB0Vmlldy5jbGVhbnVwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSBbXTsKICAgICAgICBpZiAodENsZWFudXAgJiYgbENsZWFudXApIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0Q2xlYW51cC5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFBhcmFtID0gdENsZWFudXBbaSsrXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNlY29uZFBhcmFtID0gdENsZWFudXBbaSsrXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmlyc3RQYXJhbSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGZpcnN0UGFyYW07CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodW53cmFwUk5vZGUobFZpZXdbc2Vjb25kUGFyYW1dKSkpKSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gbENsZWFudXBbdENsZWFudXBbaSsrXV07CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHVzZUNhcHR1cmVPckluZHggPSB0Q2xlYW51cFtpKytdOwogICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgYm9vbGVhbiB0aGVuIHJlcG9ydCBpdCBhcyBpcy4KICAgICAgICAgICAgICAgICAgICAvLyBpZiB1c2VDYXB0dXJlT3JJbmR4IGlzIHBvc2l0aXZlIG51bWJlciB0aGVuIGl0IGluIHVuc3Vic2NyaWJlIG1ldGhvZAogICAgICAgICAgICAgICAgICAgIC8vIGlmIHVzZUNhcHR1cmVPckluZHggaXMgbmVnYXRpdmUgbnVtYmVyIHRoZW4gaXQgaXMgYSBTdWJzY3JpcHRpb24KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZSA9ICh0eXBlb2YgdXNlQ2FwdHVyZU9ySW5keCA9PT0gJ2Jvb2xlYW4nIHx8IHVzZUNhcHR1cmVPckluZHggPj0gMCkgPyAnZG9tJyA6ICdvdXRwdXQnOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB1c2VDYXB0dXJlID0gdHlwZW9mIHVzZUNhcHR1cmVPckluZHggPT09ICdib29sZWFuJyA/IHVzZUNhcHR1cmVPckluZHggOiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PSBsaXN0ZW5lckVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goeyBlbGVtZW50LCBuYW1lLCBjYWxsYmFjaywgdXNlQ2FwdHVyZSwgdHlwZSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbGlzdGVuZXJzLnNvcnQoc29ydExpc3RlbmVycyk7CiAgICAgICAgcmV0dXJuIGxpc3RlbmVyczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhCiAgICAgKiBAcGFyYW0gez99IGIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNvcnRMaXN0ZW5lcnMoYSwgYikgewogICAgICAgIGlmIChhLm5hbWUgPT0gYi5uYW1lKQogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOwogICAgfQogICAgLyoqCiAgICAgKiBBc3NlcnRzIHRoYXQgYSB2YWx1ZSBpcyBhIERPTSBFbGVtZW50LgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0RG9tRWxlbWVudCh2YWx1ZSkgewogICAgICAgIGlmICh0eXBlb2YgRWxlbWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEVsZW1lbnQpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0aW5nIGluc3RhbmNlIG9mIERPTSBFbGVtZW50Jyk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2NoYW5nZV9kZXRlY3Rpb25fdXRpbHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBNYXJrcyBhIGNvbXBvbmVudCBmb3IgY2hlY2sgKGluIGNhc2Ugb2YgT25QdXNoIGNvbXBvbmVudHMpIGFuZCBzeW5jaHJvbm91c2x5CiAgICAgKiBwZXJmb3JtcyBjaGFuZ2UgZGV0ZWN0aW9uIG9uIHRoZSBhcHBsaWNhdGlvbiB0aGlzIGNvbXBvbmVudCBiZWxvbmdzIHRvLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBcQGdsb2JhbEFwaSBuZwogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQgQ29tcG9uZW50IHRvIHtcQGxpbmsgQ2hhbmdlRGV0ZWN0b3JSZWYjbWFya0ZvckNoZWNrIG1hcmsgZm9yIGNoZWNrfS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUNoYW5nZXMoY29tcG9uZW50KSB7CiAgICAgICAgbWFya0RpcnR5KGNvbXBvbmVudCk7CiAgICAgICAgZ2V0Um9vdENvbXBvbmVudHMoY29tcG9uZW50KS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJvb3RDb21wb25lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJvb3RDb21wb25lbnQgPT4gZGV0ZWN0Q2hhbmdlcyhyb290Q29tcG9uZW50KSkpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy91dGlsL2dsb2JhbF91dGlscy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRoaXMgdmFsdWUgcmVmbGVjdHMgdGhlIHByb3BlcnR5IG9uIHRoZSB3aW5kb3cgd2hlcmUgdGhlIGRldgogICAgICogdG9vbHMgYXJlIHBhdGNoZWQgKHdpbmRvdy5uZykuCiAgICAgKgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEdMT0JBTF9QVUJMSVNIX0VYUEFORE9fS0VZID0gJ25nJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBfcHVibGlzaGVkID0gZmFsc2U7CiAgICAvKioKICAgICAqIFB1Ymxpc2hlcyBhIGNvbGxlY3Rpb24gb2YgZGVmYXVsdCBkZWJ1ZyB0b29scyBvbnRvYHdpbmRvdy5uZ2AuCiAgICAgKgogICAgICogVGhlc2UgZnVuY3Rpb25zIGFyZSBhdmFpbGFibGUgZ2xvYmFsbHkgd2hlbiBBbmd1bGFyIGlzIGluIGRldmVsb3BtZW50CiAgICAgKiBtb2RlIGFuZCBhcmUgYXV0b21hdGljYWxseSBzdHJpcHBlZCBhd2F5IGZyb20gcHJvZCBtb2RlIGlzIG9uLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcHVibGlzaERlZmF1bHRHbG9iYWxVdGlscygpIHsKICAgICAgICBpZiAoIV9wdWJsaXNoZWQpIHsKICAgICAgICAgICAgX3B1Ymxpc2hlZCA9IHRydWU7CiAgICAgICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRDb21wb25lbnQnLCBnZXRDb21wb25lbnQpOwogICAgICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Q29udGV4dCcsIGdldENvbnRleHQpOwogICAgICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0TGlzdGVuZXJzJywgZ2V0TGlzdGVuZXJzKTsKICAgICAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldE93bmluZ0NvbXBvbmVudCcsIGdldE93bmluZ0NvbXBvbmVudCk7CiAgICAgICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXRIb3N0RWxlbWVudCcsIGdldEhvc3RFbGVtZW50KTsKICAgICAgICAgICAgcHVibGlzaEdsb2JhbFV0aWwoJ2dldEluamVjdG9yJywgZ2V0SW5qZWN0b3IpOwogICAgICAgICAgICBwdWJsaXNoR2xvYmFsVXRpbCgnZ2V0Um9vdENvbXBvbmVudHMnLCBnZXRSb290Q29tcG9uZW50cyk7CiAgICAgICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdnZXREaXJlY3RpdmVzJywgZ2V0RGlyZWN0aXZlcyk7CiAgICAgICAgICAgIHB1Ymxpc2hHbG9iYWxVdGlsKCdhcHBseUNoYW5nZXMnLCBhcHBseUNoYW5nZXMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUHVibGlzaGVzIHRoZSBnaXZlbiBmdW5jdGlvbiB0byBgd2luZG93Lm5nYCBzbyB0aGF0IGl0IGNhbiBiZQogICAgICogdXNlZCBmcm9tIHRoZSBicm93c2VyIGNvbnNvbGUgd2hlbiBhbiBhcHBsaWNhdGlvbiBpcyBub3QgaW4gcHJvZHVjdGlvbi4KICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSBmbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcHVibGlzaEdsb2JhbFV0aWwobmFtZSwgZm4pIHsKICAgICAgICBpZiAodHlwZW9mIENPTVBJTEVEID09PSAndW5kZWZpbmVkJyB8fCAhQ09NUElMRUQpIHsKICAgICAgICAgICAgLy8gTm90ZTogd2UgY2FuJ3QgZXhwb3J0IGBuZ2Agd2hlbiB1c2luZyBjbG9zdXJlIGVuaGFuY2VkIG9wdGltaXphdGlvbiBhczoKICAgICAgICAgICAgLy8gLSBjbG9zdXJlIGRlY2xhcmVzIGdsb2JhbHMgaXRzZWxmIGZvciBtaW5pZmllZCBuYW1lcywgd2hpY2ggc29tZXRpbWVzIGNsb2JiZXIgb3VyIGBuZ2AgZ2xvYmFsCiAgICAgICAgICAgIC8vIC0gd2UgY2FuJ3QgZGVjbGFyZSBhIGNsb3N1cmUgZXh0ZXJuIGFzIHRoZSBuYW1lc3BhY2UgYG5nYCBpcyBhbHJlYWR5IHVzZWQgd2l0aGluIEdvb2dsZQogICAgICAgICAgICAvLyAgIGZvciB0eXBpbmdzIGZvciBBbmd1bGFySlMgKHZpYSBgZ29vZy5wcm92aWRlKCduZy4uLi4nKWApLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHcgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKF9nbG9iYWwpKSkpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZChmbiwgJ2Z1bmN0aW9uIG5vdCBkZWZpbmVkJyk7CiAgICAgICAgICAgIGlmICh3KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gd1tHTE9CQUxfUFVCTElTSF9FWFBBTkRPX0tFWV07CiAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5lcikgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lciA9IHdbR0xPQkFMX1BVQkxJU0hfRVhQQU5ET19LRVldID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250YWluZXJbbmFtZV0gPSBmbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyB0aGUgcm9vdCBjb21wb25lbnQgdmlldyBhbmQgdGhlIHJvb3QgY29tcG9uZW50IG5vZGUuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSByTm9kZSBSZW5kZXIgaG9zdCBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBkZWYgQ29tcG9uZW50RGVmCiAgICAgKiBAcGFyYW0gez99IHJvb3RWaWV3IFRoZSBwYXJlbnQgdmlldyB3aGVyZSB0aGUgaG9zdCBub2RlIGlzIHN0b3JlZAogICAgICogQHBhcmFtIHs/fSByZW5kZXJlckZhY3RvcnkKICAgICAqIEBwYXJhbSB7P30gaG9zdFJlbmRlcmVyIFRoZSBjdXJyZW50IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZXIgVGhlIHNhbml0aXplciwgaWYgcHJvdmlkZWQKICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBDb21wb25lbnQgdmlldyBjcmVhdGVkCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVJvb3RDb21wb25lbnRWaWV3KHJOb2RlLCBkZWYsIHJvb3RWaWV3LCByZW5kZXJlckZhY3RvcnksIGhvc3RSZW5kZXJlciwgc2FuaXRpemVyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gcm9vdFZpZXdbVFZJRVddOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZShyb290VmlldywgMCArIEhFQURFUl9PRkZTRVQpOwogICAgICAgIHJvb3RWaWV3WzAgKyBIRUFERVJfT0ZGU0VUXSA9IHJOb2RlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Tm9kZSA9IGdldE9yQ3JlYXRlVE5vZGUodFZpZXcsIG51bGwsIDAsIDMgLyogRWxlbWVudCAqLywgbnVsbCwgbnVsbCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1lcmdlZEF0dHJzID0gdE5vZGUubWVyZ2VkQXR0cnMgPSBkZWYuaG9zdEF0dHJzOwogICAgICAgIGlmIChtZXJnZWRBdHRycyAhPT0gbnVsbCkgewogICAgICAgICAgICBjb21wdXRlU3RhdGljU3R5bGluZyh0Tm9kZSwgbWVyZ2VkQXR0cnMsIHRydWUpOwogICAgICAgICAgICBpZiAock5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhob3N0UmVuZGVyZXIsIHJOb2RlLCBtZXJnZWRBdHRycyk7CiAgICAgICAgICAgICAgICBpZiAodE5vZGUuY2xhc3NlcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHdyaXRlRGlyZWN0Q2xhc3MoaG9zdFJlbmRlcmVyLCByTm9kZSwgdE5vZGUuY2xhc3Nlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodE5vZGUuc3R5bGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVEaXJlY3RTdHlsZShob3N0UmVuZGVyZXIsIHJOb2RlLCB0Tm9kZS5zdHlsZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2aWV3UmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIock5vZGUsIGRlZik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudFZpZXcgPSBjcmVhdGVMVmlldyhyb290VmlldywgZ2V0T3JDcmVhdGVUQ29tcG9uZW50VmlldyhkZWYpLCBudWxsLCBkZWYub25QdXNoID8gNjQgLyogRGlydHkgKi8gOiAxNiAvKiBDaGVja0Fsd2F5cyAqLywgcm9vdFZpZXdbSEVBREVSX09GRlNFVF0sIHROb2RlLCByZW5kZXJlckZhY3RvcnksIHZpZXdSZW5kZXJlciwgc2FuaXRpemVyKTsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIGRpUHVibGljSW5JbmplY3RvcihnZXRPckNyZWF0ZU5vZGVJbmplY3RvckZvck5vZGUodE5vZGUsIHJvb3RWaWV3KSwgdFZpZXcsIGRlZi50eXBlKTsKICAgICAgICAgICAgbWFya0FzQ29tcG9uZW50SG9zdCh0VmlldywgdE5vZGUpOwogICAgICAgICAgICBpbml0VE5vZGVGbGFncyh0Tm9kZSwgcm9vdFZpZXcubGVuZ3RoLCAxKTsKICAgICAgICB9CiAgICAgICAgYWRkVG9WaWV3VHJlZShyb290VmlldywgY29tcG9uZW50Vmlldyk7CiAgICAgICAgLy8gU3RvcmUgY29tcG9uZW50IHZpZXcgYXQgbm9kZSBpbmRleCwgd2l0aCBub2RlIGFzIHRoZSBIT1NUCiAgICAgICAgcmV0dXJuIHJvb3RWaWV3W0hFQURFUl9PRkZTRVRdID0gY29tcG9uZW50VmlldzsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIHJvb3QgY29tcG9uZW50IGFuZCBzZXRzIGl0IHVwIHdpdGggZmVhdHVyZXMgYW5kIGhvc3QgYmluZGluZ3MuIFNoYXJlZCBieQogICAgICogcmVuZGVyQ29tcG9uZW50KCkgYW5kIFZpZXdDb250YWluZXJSZWYuY3JlYXRlQ29tcG9uZW50KCkuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRWaWV3CiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudERlZgogICAgICogQHBhcmFtIHs/fSByb290TFZpZXcKICAgICAqIEBwYXJhbSB7P30gcm9vdENvbnRleHQKICAgICAqIEBwYXJhbSB7P30gaG9zdEZlYXR1cmVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVSb290Q29tcG9uZW50KGNvbXBvbmVudFZpZXcsIGNvbXBvbmVudERlZiwgcm9vdExWaWV3LCByb290Q29udGV4dCwgaG9zdEZlYXR1cmVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gcm9vdExWaWV3W1RWSUVXXTsKICAgICAgICAvLyBDcmVhdGUgZGlyZWN0aXZlIGluc3RhbmNlIHdpdGggZmFjdG9yeSgpIGFuZCBzdG9yZSBhdCBuZXh0IGluZGV4IGluIHZpZXdEYXRhCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGluc3RhbnRpYXRlUm9vdENvbXBvbmVudCh0Vmlldywgcm9vdExWaWV3LCBjb21wb25lbnREZWYpOwogICAgICAgIHJvb3RDb250ZXh0LmNvbXBvbmVudHMucHVzaChjb21wb25lbnQpOwogICAgICAgIGNvbXBvbmVudFZpZXdbQ09OVEVYVF0gPSBjb21wb25lbnQ7CiAgICAgICAgaG9zdEZlYXR1cmVzICYmIGhvc3RGZWF0dXJlcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmZWF0dXJlKSA9PiBmZWF0dXJlKGNvbXBvbmVudCwgY29tcG9uZW50RGVmKSkpOwogICAgICAgIC8vIFdlIHdhbnQgdG8gZ2VuZXJhdGUgYW4gZW1wdHkgUXVlcnlMaXN0IGZvciByb290IGNvbnRlbnQgcXVlcmllcyBmb3IgYmFja3dhcmRzCiAgICAgICAgLy8gY29tcGF0aWJpbGl0eSB3aXRoIFZpZXdFbmdpbmUuCiAgICAgICAgaWYgKGNvbXBvbmVudERlZi5jb250ZW50UXVlcmllcykgewogICAgICAgICAgICBjb21wb25lbnREZWYuY29udGVudFF1ZXJpZXMoMSAvKiBDcmVhdGUgKi8sIGNvbXBvbmVudCwgcm9vdExWaWV3Lmxlbmd0aCAtIDEpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdFROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAgICAgaWYgKHRWaWV3LmZpcnN0Q3JlYXRlUGFzcyAmJgogICAgICAgICAgICAoY29tcG9uZW50RGVmLmhvc3RCaW5kaW5ncyAhPT0gbnVsbCB8fCBjb21wb25lbnREZWYuaG9zdEF0dHJzICE9PSBudWxsKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IHJvb3RUTm9kZS5pbmRleCAtIEhFQURFUl9PRkZTRVQ7CiAgICAgICAgICAgIHNldFNlbGVjdGVkSW5kZXgoZWxlbWVudEluZGV4KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByb290VFZpZXcgPSByb290TFZpZXdbVFZJRVddOwogICAgICAgICAgICBhZGRIb3N0QmluZGluZ3NUb0V4cGFuZG9JbnN0cnVjdGlvbnMocm9vdFRWaWV3LCBjb21wb25lbnREZWYpOwogICAgICAgICAgICBncm93SG9zdFZhcnNTcGFjZShyb290VFZpZXcsIHJvb3RMVmlldywgY29tcG9uZW50RGVmLmhvc3RWYXJzKTsKICAgICAgICAgICAgaW52b2tlSG9zdEJpbmRpbmdzSW5DcmVhdGlvbk1vZGUoY29tcG9uZW50RGVmLCBjb21wb25lbnQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY29tcG9uZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBzY2hlZHVsZXIKICAgICAqIEBwYXJhbSB7Pz19IHBsYXllckhhbmRsZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVJvb3RDb250ZXh0KHNjaGVkdWxlciwgcGxheWVySGFuZGxlcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGNvbXBvbmVudHM6IFtdLAogICAgICAgICAgICBzY2hlZHVsZXI6IHNjaGVkdWxlciB8fCBkZWZhdWx0U2NoZWR1bGVyLAogICAgICAgICAgICBjbGVhbjogQ0xFQU5fUFJPTUlTRSwKICAgICAgICAgICAgcGxheWVySGFuZGxlcjogcGxheWVySGFuZGxlciB8fCBudWxsLAogICAgICAgICAgICBmbGFnczogMCAvKiBFbXB0eSAqLwogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFVzZWQgdG8gZW5hYmxlIGxpZmVjeWNsZSBob29rcyBvbiB0aGUgcm9vdCBjb21wb25lbnQuCiAgICAgKgogICAgICogSW5jbHVkZSB0aGlzIGZlYXR1cmUgd2hlbiBjYWxsaW5nIGByZW5kZXJDb21wb25lbnRgIGlmIHRoZSByb290IGNvbXBvbmVudAogICAgICogeW91IGFyZSByZW5kZXJpbmcgaGFzIGxpZmVjeWNsZSBob29rcyBkZWZpbmVkLiBPdGhlcndpc2UsIHRoZSBob29rcyB3b24ndAogICAgICogYmUgY2FsbGVkIHByb3Blcmx5LgogICAgICoKICAgICAqIEV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiByZW5kZXJDb21wb25lbnQoQXBwQ29tcG9uZW50LCB7aG9zdEZlYXR1cmVzOiBbTGlmZWN5Y2xlSG9va3NGZWF0dXJlXX0pOwogICAgICogYGBgCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIExpZmVjeWNsZUhvb2tzRmVhdHVyZShjb21wb25lbnQsIGRlZikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByb290VFZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAocmVhZFBhdGNoZWRMVmlldyhjb21wb25lbnQpKSlbVFZJRVddOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXJJbmRleCA9IHJvb3RUVmlldy5kYXRhLmxlbmd0aCAtIDE7CiAgICAgICAgLy8gVE9ETyhtaXNrbyk6IHJlcGxhY2UgYGFzIFROb2RlYCB3aXRoIGNyZWF0ZVROb2RlIGNhbGwuIChuZWVkcyByZWZhY3RvcmluZyB0byBsb3NlIGRlcCBvbgogICAgICAgIC8vIExOb2RlKS4KICAgICAgICByZWdpc3RlclBvc3RPcmRlckhvb2tzKHJvb3RUVmlldywgKC8qKiBAdHlwZSB7P30gKi8gKHsgZGlyZWN0aXZlU3RhcnQ6IGRpckluZGV4LCBkaXJlY3RpdmVFbmQ6IGRpckluZGV4ICsgMSB9KSkpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9mZWF0dXJlcy9pbmhlcml0X2RlZmluaXRpb25fZmVhdHVyZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U3VwZXJUeXBlKHR5cGUpIHsKICAgICAgICByZXR1cm4gT2JqZWN0LmdldFByb3RvdHlwZU9mKHR5cGUucHJvdG90eXBlKS5jb25zdHJ1Y3RvcjsKICAgIH0KICAgIC8qKgogICAgICogTWVyZ2VzIHRoZSBkZWZpbml0aW9uIGZyb20gYSBzdXBlciBjbGFzcyB0byBhIHN1YiBjbGFzcy4KICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBkZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIHRoYXQgaXMgYSBTdWJDbGFzcyBvZiBhbm90aGVyIGRpcmVjdGl2ZSBvZiBjb21wb25lbnQKICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlKGRlZmluaXRpb24pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN1cGVyVHlwZSA9IGdldFN1cGVyVHlwZShkZWZpbml0aW9uLnR5cGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2hvdWxkSW5oZXJpdEZpZWxkcyA9IHRydWU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaGVyaXRhbmNlQ2hhaW4gPSBbZGVmaW5pdGlvbl07CiAgICAgICAgd2hpbGUgKHN1cGVyVHlwZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdXBlckRlZiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKGRlZmluaXRpb24pKSB7CiAgICAgICAgICAgICAgICAvLyBEb24ndCB1c2UgZ2V0Q29tcG9uZW50RGVmL2dldERpcmVjdGl2ZURlZi4gVGhpcyBsb2dpYyByZWxpZXMgb24gaW5oZXJpdGFuY2UuCiAgICAgICAgICAgICAgICBzdXBlckRlZiA9IHN1cGVyVHlwZS7JtWNtcCB8fCBzdXBlclR5cGUuybVkaXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoc3VwZXJUeXBlLsm1Y21wKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdEaXJlY3RpdmVzIGNhbm5vdCBpbmhlcml0IENvbXBvbmVudHMnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIERvbid0IHVzZSBnZXRDb21wb25lbnREZWYvZ2V0RGlyZWN0aXZlRGVmLiBUaGlzIGxvZ2ljIHJlbGllcyBvbiBpbmhlcml0YW5jZS4KICAgICAgICAgICAgICAgIHN1cGVyRGVmID0gc3VwZXJUeXBlLsm1ZGlyOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzdXBlckRlZikgewogICAgICAgICAgICAgICAgaWYgKHNob3VsZEluaGVyaXRGaWVsZHMpIHsKICAgICAgICAgICAgICAgICAgICBpbmhlcml0YW5jZUNoYWluLnB1c2goc3VwZXJEZWYpOwogICAgICAgICAgICAgICAgICAgIC8vIFNvbWUgZmllbGRzIGluIHRoZSBkZWZpbml0aW9uIG1heSBiZSBlbXB0eSwgaWYgdGhlcmUgd2VyZSBubyB2YWx1ZXMgdG8gcHV0IGluIHRoZW0gdGhhdAogICAgICAgICAgICAgICAgICAgIC8vIHdvdWxkJ3ZlIGp1c3RpZmllZCBvYmplY3QgY3JlYXRpb24uIFVud3JhcCB0aGVtIGlmIG5lY2Vzc2FyeS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3JpdGVhYmxlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlZmluaXRpb24pKTsKICAgICAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuaW5wdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLmlucHV0cyk7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmRlY2xhcmVkSW5wdXRzID0gbWF5YmVVbndyYXBFbXB0eShkZWZpbml0aW9uLmRlY2xhcmVkSW5wdXRzKTsKICAgICAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYub3V0cHV0cyA9IG1heWJlVW53cmFwRW1wdHkoZGVmaW5pdGlvbi5vdXRwdXRzKTsKICAgICAgICAgICAgICAgICAgICAvLyBNZXJnZSBob3N0QmluZGluZ3MKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwZXJIb3N0QmluZGluZ3MgPSBzdXBlckRlZi5ob3N0QmluZGluZ3M7CiAgICAgICAgICAgICAgICAgICAgc3VwZXJIb3N0QmluZGluZ3MgJiYgaW5oZXJpdEhvc3RCaW5kaW5ncyhkZWZpbml0aW9uLCBzdXBlckhvc3RCaW5kaW5ncyk7CiAgICAgICAgICAgICAgICAgICAgLy8gTWVyZ2UgcXVlcmllcwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdXBlclZpZXdRdWVyeSA9IHN1cGVyRGVmLnZpZXdRdWVyeTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwZXJDb250ZW50UXVlcmllcyA9IHN1cGVyRGVmLmNvbnRlbnRRdWVyaWVzOwogICAgICAgICAgICAgICAgICAgIHN1cGVyVmlld1F1ZXJ5ICYmIGluaGVyaXRWaWV3UXVlcnkoZGVmaW5pdGlvbiwgc3VwZXJWaWV3UXVlcnkpOwogICAgICAgICAgICAgICAgICAgIHN1cGVyQ29udGVudFF1ZXJpZXMgJiYgaW5oZXJpdENvbnRlbnRRdWVyaWVzKGRlZmluaXRpb24sIHN1cGVyQ29udGVudFF1ZXJpZXMpOwogICAgICAgICAgICAgICAgICAgIC8vIE1lcmdlIGlucHV0cyBhbmQgb3V0cHV0cwogICAgICAgICAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24uaW5wdXRzLCBzdXBlckRlZi5pbnB1dHMpOwogICAgICAgICAgICAgICAgICAgIGZpbGxQcm9wZXJ0aWVzKGRlZmluaXRpb24uZGVjbGFyZWRJbnB1dHMsIHN1cGVyRGVmLmRlY2xhcmVkSW5wdXRzKTsKICAgICAgICAgICAgICAgICAgICBmaWxsUHJvcGVydGllcyhkZWZpbml0aW9uLm91dHB1dHMsIHN1cGVyRGVmLm91dHB1dHMpOwogICAgICAgICAgICAgICAgICAgIC8vIE1lcmdlIGFuaW1hdGlvbnMgbWV0YWRhdGEuCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYHN1cGVyRGVmYCBpcyBhIENvbXBvbmVudCwgdGhlIGBkYXRhYCBmaWVsZCBpcyBwcmVzZW50IChkZWZhdWx0cyB0byBhbiBlbXB0eSBvYmplY3QpLgogICAgICAgICAgICAgICAgICAgIGlmIChpc0NvbXBvbmVudERlZihzdXBlckRlZikgJiYgc3VwZXJEZWYuZGF0YS5hbmltYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgc3VwZXIgZGVmIGlzIGEgQ29tcG9uZW50LCB0aGUgYGRlZmluaXRpb25gIGlzIGFsc28gYSBDb21wb25lbnQsIHNpbmNlIERpcmVjdGl2ZXMgY2FuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdCBpbmhlcml0IENvbXBvbmVudHMgKHdlIHRocm93IGFuIGVycm9yIGFib3ZlIGFuZCBjYW5ub3QgcmVhY2ggdGhpcyBjb2RlKS4KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWZEYXRhID0gKCgvKiogQHR5cGUgez99ICovIChkZWZpbml0aW9uKSkpLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlZkRhdGEuYW5pbWF0aW9uID0gKGRlZkRhdGEuYW5pbWF0aW9uIHx8IFtdKS5jb25jYXQoc3VwZXJEZWYuZGF0YS5hbmltYXRpb24pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBJbmhlcml0IGhvb2tzCiAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHN1cGVyIGNsYXNzIGluaGVyaXRhbmNlIGZlYXR1cmUgaGFzIGFscmVhZHkgcnVuLgogICAgICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5hZnRlckNvbnRlbnRDaGVja2VkID0KICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmFmdGVyQ29udGVudENoZWNrZWQgfHwgc3VwZXJEZWYuYWZ0ZXJDb250ZW50Q2hlY2tlZDsKICAgICAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuYWZ0ZXJDb250ZW50SW5pdCA9IGRlZmluaXRpb24uYWZ0ZXJDb250ZW50SW5pdCB8fCBzdXBlckRlZi5hZnRlckNvbnRlbnRJbml0OwogICAgICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5hZnRlclZpZXdDaGVja2VkID0gZGVmaW5pdGlvbi5hZnRlclZpZXdDaGVja2VkIHx8IHN1cGVyRGVmLmFmdGVyVmlld0NoZWNrZWQ7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLmFmdGVyVmlld0luaXQgPSBkZWZpbml0aW9uLmFmdGVyVmlld0luaXQgfHwgc3VwZXJEZWYuYWZ0ZXJWaWV3SW5pdDsKICAgICAgICAgICAgICAgICAgICB3cml0ZWFibGVEZWYuZG9DaGVjayA9IGRlZmluaXRpb24uZG9DaGVjayB8fCBzdXBlckRlZi5kb0NoZWNrOwogICAgICAgICAgICAgICAgICAgIHdyaXRlYWJsZURlZi5vbkRlc3Ryb3kgPSBkZWZpbml0aW9uLm9uRGVzdHJveSB8fCBzdXBlckRlZi5vbkRlc3Ryb3k7CiAgICAgICAgICAgICAgICAgICAgd3JpdGVhYmxlRGVmLm9uSW5pdCA9IGRlZmluaXRpb24ub25Jbml0IHx8IHN1cGVyRGVmLm9uSW5pdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFJ1biBwYXJlbnQgZmVhdHVyZXMKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVzID0gc3VwZXJEZWYuZmVhdHVyZXM7CiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IGZlYXR1cmVzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZSAmJiBmZWF0dXJlLm5nSW5oZXJpdCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChmZWF0dXJlKSkpKGRlZmluaXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGBJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVgIGlzIGEgcGFydCBvZiB0aGUgY3VycmVudCBgc3VwZXJEZWZgLCBpdCBtZWFucyB0aGF0IHRoaXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVmIGFscmVhZHkgaGFzIGFsbCB0aGUgbmVjZXNzYXJ5IGluZm9ybWF0aW9uIGluaGVyaXRlZCBmcm9tIGl0cyBzdXBlciBjbGFzcyhlcyksIHNvIHdlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBzdG9wIG1lcmdpbmcgZmllbGRzIGZyb20gc3VwZXIgY2xhc3Nlcy4gSG93ZXZlciB3ZSBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdG90eXBlIGNoYWluIHRvIGxvb2sgZm9yIGNsYXNzZXMgdGhhdCBtaWdodCBjb250YWluIG90aGVyICJmZWF0dXJlcyIgKGxpa2UKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmdPbkNoYW5nZXMpLCB3aGljaCB3ZSBzaG91bGQgaW52b2tlIGZvciB0aGUgb3JpZ2luYWwgYGRlZmluaXRpb25gLiBXZSBzZXQgdGhlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGBzaG91bGRJbmhlcml0RmllbGRzYCBmbGFnIHRvIGluZGljYXRlIHRoYXQsIGVzc2VudGlhbGx5IHNraXBwaW5nIGZpZWxkcyBpbmhlcml0YW5jZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBsb2dpYyBhbmQgb25seSBpbnZva2luZyBmdW5jdGlvbnMgZnJvbSB0aGUgImZlYXR1cmVzIiBsaXN0LgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZSA9PT0gybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdWxkSW5oZXJpdEZpZWxkcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1cGVyVHlwZSA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihzdXBlclR5cGUpOwogICAgICAgIH0KICAgICAgICBtZXJnZUhvc3RBdHRyc0Fjcm9zc0luaGVyaXRhbmNlKGluaGVyaXRhbmNlQ2hhaW4pOwogICAgfQogICAgLyoqCiAgICAgKiBNZXJnZSB0aGUgYGhvc3RBdHRyc2AgYW5kIGBob3N0VmFyc2AgZnJvbSB0aGUgaW5oZXJpdGVkIHBhcmVudCB0byB0aGUgYmFzZSBjbGFzcy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGluaGVyaXRhbmNlQ2hhaW4gQSBsaXN0IG9mIGBXcml0YWJsZURlZnNgIHN0YXJ0aW5nIGF0IHRoZSB0b3AgbW9zdCB0eXBlIGFuZCBsaXN0aW5nCiAgICAgKiBzdWItdHlwZXMgaW4gb3JkZXIuIEZvciBlYWNoIHR5cGUgdGFrZSB0aGUgYGhvc3RBdHRyc2AgYW5kIGBob3N0VmFyc2AgYW5kIG1lcmdlIGl0IHdpdGggdGhlIGNoaWxkCiAgICAgKiB0eXBlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWVyZ2VIb3N0QXR0cnNBY3Jvc3NJbmhlcml0YW5jZShpbmhlcml0YW5jZUNoYWluKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBob3N0VmFycyA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBob3N0QXR0cnMgPSBudWxsOwogICAgICAgIC8vIFdlIHByb2Nlc3MgdGhlIGluaGVyaXRhbmNlIG9yZGVyIGZyb20gdGhlIGJhc2UgdG8gdGhlIGxlYXZlcyBoZXJlLgogICAgICAgIGZvciAobGV0IGkgPSBpbmhlcml0YW5jZUNoYWluLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmID0gaW5oZXJpdGFuY2VDaGFpbltpXTsKICAgICAgICAgICAgLy8gRm9yIGVhY2ggYGhvc3RWYXJzYCwgd2UgbmVlZCB0byBhZGQgdGhlIHN1cGVyY2xhc3MgYW1vdW50LgogICAgICAgICAgICBkZWYuaG9zdFZhcnMgPSAoaG9zdFZhcnMgKz0gZGVmLmhvc3RWYXJzKTsKICAgICAgICAgICAgLy8gZm9yIGVhY2ggYGhvc3RBdHRyc2Agd2UgbmVlZCB0byBtZXJnZSBpdCB3aXRoIHN1cGVyY2xhc3MuCiAgICAgICAgICAgIGRlZi5ob3N0QXR0cnMgPQogICAgICAgICAgICAgICAgbWVyZ2VIb3N0QXR0cnMoZGVmLmhvc3RBdHRycywgaG9zdEF0dHJzID0gbWVyZ2VIb3N0QXR0cnMoaG9zdEF0dHJzLCBkZWYuaG9zdEF0dHJzKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYXliZVVud3JhcEVtcHR5KHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlID09PSBFTVBUWV9PQkopIHsKICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgIH0KICAgICAgICBlbHNlIGlmICh2YWx1ZSA9PT0gRU1QVFlfQVJSQVkpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZWZpbml0aW9uCiAgICAgKiBAcGFyYW0gez99IHN1cGVyVmlld1F1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbmhlcml0Vmlld1F1ZXJ5KGRlZmluaXRpb24sIHN1cGVyVmlld1F1ZXJ5KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZWaWV3UXVlcnkgPSBkZWZpbml0aW9uLnZpZXdRdWVyeTsKICAgICAgICBpZiAocHJldlZpZXdRdWVyeSkgewogICAgICAgICAgICBkZWZpbml0aW9uLnZpZXdRdWVyeSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJmLCBjdHgpID0+IHsKICAgICAgICAgICAgICAgIHN1cGVyVmlld1F1ZXJ5KHJmLCBjdHgpOwogICAgICAgICAgICAgICAgcHJldlZpZXdRdWVyeShyZiwgY3R4KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWZpbml0aW9uLnZpZXdRdWVyeSA9IHN1cGVyVmlld1F1ZXJ5OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZWZpbml0aW9uCiAgICAgKiBAcGFyYW0gez99IHN1cGVyQ29udGVudFF1ZXJpZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluaGVyaXRDb250ZW50UXVlcmllcyhkZWZpbml0aW9uLCBzdXBlckNvbnRlbnRRdWVyaWVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZDb250ZW50UXVlcmllcyA9IGRlZmluaXRpb24uY29udGVudFF1ZXJpZXM7CiAgICAgICAgaWYgKHByZXZDb250ZW50UXVlcmllcykgewogICAgICAgICAgICBkZWZpbml0aW9uLmNvbnRlbnRRdWVyaWVzID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJmCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlSW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZiwgY3R4LCBkaXJlY3RpdmVJbmRleCkgPT4gewogICAgICAgICAgICAgICAgc3VwZXJDb250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJlY3RpdmVJbmRleCk7CiAgICAgICAgICAgICAgICBwcmV2Q29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlyZWN0aXZlSW5kZXgpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGRlZmluaXRpb24uY29udGVudFF1ZXJpZXMgPSBzdXBlckNvbnRlbnRRdWVyaWVzOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkZWZpbml0aW9uCiAgICAgKiBAcGFyYW0gez99IHN1cGVySG9zdEJpbmRpbmdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbmhlcml0SG9zdEJpbmRpbmdzKGRlZmluaXRpb24sIHN1cGVySG9zdEJpbmRpbmdzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZIb3N0QmluZGluZ3MgPSBkZWZpbml0aW9uLmhvc3RCaW5kaW5nczsKICAgICAgICBpZiAocHJldkhvc3RCaW5kaW5ncykgewogICAgICAgICAgICBkZWZpbml0aW9uLmhvc3RCaW5kaW5ncyA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJmLCBjdHgpID0+IHsKICAgICAgICAgICAgICAgIHN1cGVySG9zdEJpbmRpbmdzKHJmLCBjdHgpOwogICAgICAgICAgICAgICAgcHJldkhvc3RCaW5kaW5ncyhyZiwgY3R4KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkZWZpbml0aW9uLmhvc3RCaW5kaW5ncyA9IHN1cGVySG9zdEJpbmRpbmdzOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvZmVhdHVyZXMvY29weV9kZWZpbml0aW9uX2ZlYXR1cmUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBGaWVsZHMgd2hpY2ggZXhpc3Qgb24gZWl0aGVyIGRpcmVjdGl2ZSBvciBjb21wb25lbnQgZGVmaW5pdGlvbnMsIGFuZCBuZWVkIHRvIGJlIGNvcGllZCBmcm9tCiAgICAgKiBwYXJlbnQgdG8gY2hpbGQgY2xhc3NlcyBieSB0aGUgYMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmVgLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENPUFlfRElSRUNUSVZFX0ZJRUxEUyA9IFsKICAgICAgICAvLyBUaGUgY2hpbGQgY2xhc3Mgc2hvdWxkIHVzZSB0aGUgcHJvdmlkZXJzIG9mIGl0cyBwYXJlbnQuCiAgICAgICAgJ3Byb3ZpZGVyc1Jlc29sdmVyJywKICAgIF07CiAgICAvKioKICAgICAqIEZpZWxkcyB3aGljaCBleGlzdCBvbmx5IG9uIGNvbXBvbmVudCBkZWZpbml0aW9ucywgYW5kIG5lZWQgdG8gYmUgY29waWVkIGZyb20gcGFyZW50IHRvIGNoaWxkCiAgICAgKiBjbGFzc2VzIGJ5IHRoZSBgybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZWAuCiAgICAgKgogICAgICogVGhlIHR5cGUgaGVyZSBhbGxvd3MgYW55IGZpZWxkIG9mIGBDb21wb25lbnREZWZgIHdoaWNoIGlzIG5vdCBhbHNvIGEgcHJvcGVydHkgb2YgYERpcmVjdGl2ZURlZmAsCiAgICAgKiBzaW5jZSB0aG9zZSBzaG91bGQgZ28gaW4gYENPUFlfRElSRUNUSVZFX0ZJRUxEU2AgYWJvdmUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQ09QWV9DT01QT05FTlRfRklFTERTID0gWwogICAgICAgIC8vIFRoZSBjaGlsZCBjbGFzcyBzaG91bGQgdXNlIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBvZiBpdHMgcGFyZW50LCBpbmNsdWRpbmcgYWxsIHRlbXBsYXRlCiAgICAgICAgLy8gc2VtYW50aWNzLgogICAgICAgICd0ZW1wbGF0ZScsCiAgICAgICAgJ2RlY2xzJywKICAgICAgICAnY29uc3RzJywKICAgICAgICAndmFycycsCiAgICAgICAgJ29uUHVzaCcsCiAgICAgICAgJ25nQ29udGVudFNlbGVjdG9ycycsCiAgICAgICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCB1c2UgdGhlIENTUyBzdHlsZXMgb2YgaXRzIHBhcmVudCwgaW5jbHVkaW5nIGFsbCBzdHlsaW5nIHNlbWFudGljcy4KICAgICAgICAnc3R5bGVzJywKICAgICAgICAnZW5jYXBzdWxhdGlvbicsCiAgICAgICAgLy8gVGhlIGNoaWxkIGNsYXNzIHNob3VsZCBiZSBjaGVja2VkIGJ5IHRoZSBydW50aW1lIGluIHRoZSBzYW1lIHdheSBhcyBpdHMgcGFyZW50LgogICAgICAgICdzY2hlbWFzJywKICAgIF07CiAgICAvKioKICAgICAqIENvcGllcyB0aGUgZmllbGRzIG5vdCBoYW5kbGVkIGJ5IHRoZSBgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZWAgZnJvbSB0aGUgc3VwZXJ0eXBlIG9mIGEKICAgICAqIGRlZmluaXRpb24uCiAgICAgKgogICAgICogVGhpcyBleGlzdHMgcHJpbWFyaWx5IHRvIHN1cHBvcnQgbmdjYyBtaWdyYXRpb24gb2YgYW4gZXhpc3RpbmcgVmlldyBFbmdpbmUgcGF0dGVybiwgd2hlcmUgYW4KICAgICAqIGVudGlyZSBkZWNvcmF0b3IgaXMgaW5oZXJpdGVkIGZyb20gYSBwYXJlbnQgdG8gYSBjaGlsZCBjbGFzcy4gV2hlbiBuZ2NjIGRldGVjdHMgdGhpcyBjYXNlLCBpdAogICAgICogZ2VuZXJhdGVzIGEgc2tlbGV0b24gZGVmaW5pdGlvbiBvbiB0aGUgY2hpbGQgY2xhc3MsIGFuZCBhcHBsaWVzIHRoaXMgZmVhdHVyZS4KICAgICAqCiAgICAgKiBUaGUgYMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmVgIHRoZW4gY29waWVzIGFueSBuZWVkZWQgZmllbGRzIGZyb20gdGhlIHBhcmVudCBjbGFzcycgZGVmaW5pdGlvbiwKICAgICAqIGluY2x1ZGluZyB0aGluZ3MgbGlrZSB0aGUgY29tcG9uZW50IHRlbXBsYXRlIGZ1bmN0aW9uLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBkZWZpbml0aW9uIFRoZSBkZWZpbml0aW9uIG9mIGEgY2hpbGQgY2xhc3Mgd2hpY2ggaW5oZXJpdHMgZnJvbSBhIHBhcmVudCBjbGFzcyB3aXRoIGl0cwogICAgICogb3duIGRlZmluaXRpb24uCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZShkZWZpbml0aW9uKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdXBlclR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0U3VwZXJUeXBlKGRlZmluaXRpb24udHlwZSkpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN1cGVyRGVmID0gdW5kZWZpbmVkOwogICAgICAgIGlmIChpc0NvbXBvbmVudERlZihkZWZpbml0aW9uKSkgewogICAgICAgICAgICAvLyBEb24ndCB1c2UgZ2V0Q29tcG9uZW50RGVmL2dldERpcmVjdGl2ZURlZi4gVGhpcyBsb2dpYyByZWxpZXMgb24gaW5oZXJpdGFuY2UuCiAgICAgICAgICAgIHN1cGVyRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHN1cGVyVHlwZS7JtWNtcCkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gRG9uJ3QgdXNlIGdldENvbXBvbmVudERlZi9nZXREaXJlY3RpdmVEZWYuIFRoaXMgbG9naWMgcmVsaWVzIG9uIGluaGVyaXRhbmNlLgogICAgICAgICAgICBzdXBlckRlZiA9ICgvKiogQHR5cGUgez99ICovIChzdXBlclR5cGUuybVkaXIpKTsKICAgICAgICB9CiAgICAgICAgLy8gTmVlZGVkIGJlY2F1c2UgYGRlZmluaXRpb25gIGZpZWxkcyBhcmUgcmVhZG9ubHkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlZkFueSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmaW5pdGlvbikpKTsKICAgICAgICAvLyBDb3B5IG92ZXIgYW55IGZpZWxkcyB0aGF0IGFwcGx5IHRvIGVpdGhlciBkaXJlY3RpdmVzIG9yIGNvbXBvbmVudHMuCiAgICAgICAgZm9yIChjb25zdCBmaWVsZCBvZiBDT1BZX0RJUkVDVElWRV9GSUVMRFMpIHsKICAgICAgICAgICAgZGVmQW55W2ZpZWxkXSA9IHN1cGVyRGVmW2ZpZWxkXTsKICAgICAgICB9CiAgICAgICAgaWYgKGlzQ29tcG9uZW50RGVmKHN1cGVyRGVmKSkgewogICAgICAgICAgICAvLyBDb3B5IG92ZXIgYW55IGNvbXBvbmVudC1zcGVjaWZpYyBmaWVsZHMuCiAgICAgICAgICAgIGZvciAoY29uc3QgZmllbGQgb2YgQ09QWV9DT01QT05FTlRfRklFTERTKSB7CiAgICAgICAgICAgICAgICBkZWZBbnlbZmllbGRdID0gc3VwZXJEZWZbZmllbGRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogUmVwcmVzZW50cyBhIGJhc2ljIGNoYW5nZSBmcm9tIGEgcHJldmlvdXMgdG8gYSBuZXcgdmFsdWUgZm9yIGEgc2luZ2xlCiAgICAgKiBwcm9wZXJ0eSBvbiBhIGRpcmVjdGl2ZSBpbnN0YW5jZS4gUGFzc2VkIGFzIGEgdmFsdWUgaW4gYQogICAgICoge0BsaW5rIFNpbXBsZUNoYW5nZXN9IG9iamVjdCB0byB0aGUgYG5nT25DaGFuZ2VzYCBob29rLgogICAgICoKICAgICAqIEBzZWUgYE9uQ2hhbmdlc2AKICAgICAqCiAgICAgKiBAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFNpbXBsZUNoYW5nZSB7CiAgICAgICAgY29uc3RydWN0b3IocHJldmlvdXNWYWx1ZSwgY3VycmVudFZhbHVlLCBmaXJzdENoYW5nZSkgewogICAgICAgICAgICB0aGlzLnByZXZpb3VzVmFsdWUgPSBwcmV2aW91c1ZhbHVlOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRWYWx1ZSA9IGN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgdGhpcy5maXJzdENoYW5nZSA9IGZpcnN0Q2hhbmdlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBuZXcgdmFsdWUgaXMgdGhlIGZpcnN0IHZhbHVlIGFzc2lnbmVkLgogICAgICAgICAqLwogICAgICAgIGlzRmlyc3RDaGFuZ2UoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpcnN0Q2hhbmdlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVGhlIE5nT25DaGFuZ2VzRmVhdHVyZSBkZWNvcmF0ZXMgYSBjb21wb25lbnQgd2l0aCBzdXBwb3J0IGZvciB0aGUgbmdPbkNoYW5nZXMKICAgICAqIGxpZmVjeWNsZSBob29rLCBzbyBpdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gYW55IGNvbXBvbmVudCB0aGF0IGltcGxlbWVudHMKICAgICAqIHRoYXQgaG9vay4KICAgICAqCiAgICAgKiBJZiB0aGUgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSB1c2VzIGluaGVyaXRhbmNlLCB0aGUgTmdPbkNoYW5nZXNGZWF0dXJlIE1VU1QKICAgICAqIGJlIGluY2x1ZGVkIGFzIGEgZmVhdHVyZSBBRlRFUiB7XEBsaW5rIEluaGVyaXREZWZpbml0aW9uRmVhdHVyZX0sIG90aGVyd2lzZQogICAgICogaW5oZXJpdGVkIHByb3BlcnRpZXMgd2lsbCBub3QgYmUgcHJvcGFnYXRlZCB0byB0aGUgbmdPbkNoYW5nZXMgbGlmZWN5Y2xlCiAgICAgKiBob29rLgogICAgICoKICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKgogICAgICogYGBgCiAgICAgKiBzdGF0aWMgybVjbXAgPSBkZWZpbmVDb21wb25lbnQoewogICAgICogICAuLi4KICAgICAqICAgaW5wdXRzOiB7bmFtZTogJ3B1YmxpY05hbWUnfSwKICAgICAqICAgZmVhdHVyZXM6IFtOZ09uQ2hhbmdlc0ZlYXR1cmVdCiAgICAgKiB9KTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gZGVmaW5pdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtU5nT25DaGFuZ2VzRmVhdHVyZShkZWZpbml0aW9uKSB7CiAgICAgICAgaWYgKGRlZmluaXRpb24udHlwZS5wcm90b3R5cGUubmdPbkNoYW5nZXMpIHsKICAgICAgICAgICAgZGVmaW5pdGlvbi5zZXRJbnB1dCA9IG5nT25DaGFuZ2VzU2V0SW5wdXQ7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVmaW5pdGlvbikpKS5vbkNoYW5nZXMgPSB3cmFwT25DaGFuZ2VzKCk7CiAgICAgICAgfQogICAgfQogICAgLy8gVGhpcyBvcHRpb24gZW5zdXJlcyB0aGF0IHRoZSBuZ09uQ2hhbmdlcyBsaWZlY3ljbGUgaG9vayB3aWxsIGJlIGluaGVyaXRlZAogICAgLy8gZnJvbSBzdXBlcmNsYXNzZXMgKGluIEluaGVyaXREZWZpbml0aW9uRmVhdHVyZSkuCiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby10b3BsZXZlbC1wcm9wZXJ0eS1hY2Nlc3MKICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoybXJtU5nT25DaGFuZ2VzRmVhdHVyZSkpKS5uZ0luaGVyaXQgPSB0cnVlOwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB3cmFwT25DaGFuZ2VzKCkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB3cmFwT25DaGFuZ2VzSG9va19pblByZXZpb3VzQ2hhbmdlc1N0b3JhZ2UoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2ltcGxlQ2hhbmdlc1N0b3JlID0gZ2V0U2ltcGxlQ2hhbmdlc1N0b3JlKHRoaXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnQgPSBzaW1wbGVDaGFuZ2VzU3RvcmUgJiYgc2ltcGxlQ2hhbmdlc1N0b3JlLmN1cnJlbnQ7CiAgICAgICAgICAgIGlmIChjdXJyZW50KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9ICgvKiogQHR5cGUgez99ICovIChzaW1wbGVDaGFuZ2VzU3RvcmUpKS5wcmV2aW91czsKICAgICAgICAgICAgICAgIGlmIChwcmV2aW91cyA9PT0gRU1QVFlfT0JKKSB7CiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHNpbXBsZUNoYW5nZXNTdG9yZSkpLnByZXZpb3VzID0gY3VycmVudDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIE5ldyBjaGFuZ2VzIGFyZSBjb3BpZWQgdG8gdGhlIHByZXZpb3VzIHN0b3JlLCBzbyB0aGF0IHdlIGRvbid0IGxvc2UgaGlzdG9yeSBmb3IgaW5wdXRzCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggd2VyZSBub3QgY2hhbmdlZCB0aGlzIHRpbWUKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gY3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1trZXldID0gY3VycmVudFtrZXldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChzaW1wbGVDaGFuZ2VzU3RvcmUpKS5jdXJyZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMubmdPbkNoYW5nZXMoY3VycmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEB0aGlzIHs/fQogICAgICogQHBhcmFtIHs/fSBpbnN0YW5jZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBwdWJsaWNOYW1lCiAgICAgKiBAcGFyYW0gez99IHByaXZhdGVOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBuZ09uQ2hhbmdlc1NldElucHV0KGluc3RhbmNlLCB2YWx1ZSwgcHVibGljTmFtZSwgcHJpdmF0ZU5hbWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2ltcGxlQ2hhbmdlc1N0b3JlID0gZ2V0U2ltcGxlQ2hhbmdlc1N0b3JlKGluc3RhbmNlKSB8fAogICAgICAgICAgICBzZXRTaW1wbGVDaGFuZ2VzU3RvcmUoaW5zdGFuY2UsIHsgcHJldmlvdXM6IEVNUFRZX09CSiwgY3VycmVudDogbnVsbCB9KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3VycmVudCA9IHNpbXBsZUNoYW5nZXNTdG9yZS5jdXJyZW50IHx8IChzaW1wbGVDaGFuZ2VzU3RvcmUuY3VycmVudCA9IHt9KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXMgPSBzaW1wbGVDaGFuZ2VzU3RvcmUucHJldmlvdXM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlY2xhcmVkTmFtZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5kZWNsYXJlZElucHV0cykpKVtwdWJsaWNOYW1lXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNDaGFuZ2UgPSBwcmV2aW91c1tkZWNsYXJlZE5hbWVdOwogICAgICAgIGN1cnJlbnRbZGVjbGFyZWROYW1lXSA9IG5ldyBTaW1wbGVDaGFuZ2UocHJldmlvdXNDaGFuZ2UgJiYgcHJldmlvdXNDaGFuZ2UuY3VycmVudFZhbHVlLCB2YWx1ZSwgcHJldmlvdXMgPT09IEVNUFRZX09CSik7CiAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChpbnN0YW5jZSkpKVtwcml2YXRlTmFtZV0gPSB2YWx1ZTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNJTVBMRV9DSEFOR0VTX1NUT1JFID0gJ19fbmdTaW1wbGVDaGFuZ2VzX18nOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRTaW1wbGVDaGFuZ2VzU3RvcmUoaW5zdGFuY2UpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2VbU0lNUExFX0NIQU5HRVNfU1RPUkVdIHx8IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFNpbXBsZUNoYW5nZXNTdG9yZShpbnN0YW5jZSwgc3RvcmUpIHsKICAgICAgICByZXR1cm4gaW5zdGFuY2VbU0lNUExFX0NIQU5HRVNfU1RPUkVdID0gc3RvcmU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2RpX3NldHVwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUmVzb2x2ZXMgdGhlIHByb3ZpZGVycyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgRGlyZWN0aXZlRGVmLgogICAgICoKICAgICAqIFdoZW4gaW5zZXJ0aW5nIHRoZSB0b2tlbnMgYW5kIHRoZSBmYWN0b3JpZXMgaW4gdGhlaXIgcmVzcGVjdGl2ZSBhcnJheXMsIHdlIGNhbiBhc3N1bWUgdGhhdAogICAgICogdGhpcyBtZXRob2QgaXMgY2FsbGVkIGZpcnN0IGZvciB0aGUgY29tcG9uZW50IChpZiBhbnkpLCBhbmQgdGhlbiBmb3Igb3RoZXIgZGlyZWN0aXZlcyBvbiB0aGUgc2FtZQogICAgICogbm9kZS4KICAgICAqIEFzIGEgY29uc2VxdWVuY2UsdGhlIHByb3ZpZGVycyBhcmUgYWx3YXlzIHByb2Nlc3NlZCBpbiB0aGF0IG9yZGVyOgogICAgICogMSkgVGhlIHZpZXcgcHJvdmlkZXJzIG9mIHRoZSBjb21wb25lbnQKICAgICAqIDIpIFRoZSBwcm92aWRlcnMgb2YgdGhlIGNvbXBvbmVudAogICAgICogMykgVGhlIHByb3ZpZGVycyBvZiB0aGUgb3RoZXIgZGlyZWN0aXZlcwogICAgICogVGhpcyBtYXRjaGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGluamVjdGFibGVzIGFycmF5cyBvZiBhIHZpZXcgKGZvciBlYWNoIG5vZGUpLgogICAgICogU28gdGhlIHRva2VucyBhbmQgdGhlIGZhY3RvcmllcyBjYW4gYmUgcHVzaGVkIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5cywgZXhjZXB0CiAgICAgKiBpbiBvbmUgY2FzZSBmb3IgbXVsdGkgcHJvdmlkZXJzLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGRlZiB0aGUgZGlyZWN0aXZlIGRlZmluaXRpb24KICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgKiBAcGFyYW0gez99IHZpZXdQcm92aWRlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3ZpZGVyc1Jlc29sdmVyKGRlZiwgcHJvdmlkZXJzLCB2aWV3UHJvdmlkZXJzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNDb21wb25lbnQgPSBpc0NvbXBvbmVudERlZihkZWYpOwogICAgICAgICAgICAvLyBUaGUgbGlzdCBvZiB2aWV3IHByb3ZpZGVycyBpcyBwcm9jZXNzZWQgZmlyc3QsIGFuZCB0aGUgZmxhZ3MgYXJlIHVwZGF0ZWQKICAgICAgICAgICAgcmVzb2x2ZVByb3ZpZGVyJDEodmlld1Byb3ZpZGVycywgdFZpZXcuZGF0YSwgdFZpZXcuYmx1ZXByaW50LCBpc0NvbXBvbmVudCwgdHJ1ZSk7CiAgICAgICAgICAgIC8vIFRoZW4sIHRoZSBsaXN0IG9mIHByb3ZpZGVycyBpcyBwcm9jZXNzZWQsIGFuZCB0aGUgZmxhZ3MgYXJlIHVwZGF0ZWQKICAgICAgICAgICAgcmVzb2x2ZVByb3ZpZGVyJDEocHJvdmlkZXJzLCB0Vmlldy5kYXRhLCB0Vmlldy5ibHVlcHJpbnQsIGlzQ29tcG9uZW50LCBmYWxzZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXNvbHZlcyBhIHByb3ZpZGVyIGFuZCBwdWJsaXNoZXMgaXQgdG8gdGhlIERJIHN5c3RlbS4KICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIKICAgICAqIEBwYXJhbSB7P30gdEluamVjdGFibGVzCiAgICAgKiBAcGFyYW0gez99IGxJbmplY3RhYmxlc0JsdWVwcmludAogICAgICogQHBhcmFtIHs/fSBpc0NvbXBvbmVudAogICAgICogQHBhcmFtIHs/fSBpc1ZpZXdQcm92aWRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZVByb3ZpZGVyJDEocHJvdmlkZXIsIHRJbmplY3RhYmxlcywgbEluamVjdGFibGVzQmx1ZXByaW50LCBpc0NvbXBvbmVudCwgaXNWaWV3UHJvdmlkZXIpIHsKICAgICAgICBwcm92aWRlciA9IHJlc29sdmVGb3J3YXJkUmVmKHByb3ZpZGVyKTsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShwcm92aWRlcikpIHsKICAgICAgICAgICAgLy8gUmVjdXJzaXZlbHkgY2FsbCBgcmVzb2x2ZVByb3ZpZGVyYAogICAgICAgICAgICAvLyBSZWN1cnNpb24gaXMgT0sgaW4gdGhpcyBjYXNlIGJlY2F1c2UgdGhpcyBjb2RlIHdpbGwgbm90IGJlIGluIGhvdC1wYXRoIG9uY2Ugd2UgaW1wbGVtZW50CiAgICAgICAgICAgIC8vIGNsb25pbmcgb2YgdGhlIGluaXRpYWwgc3RhdGUuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvdmlkZXIubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHJlc29sdmVQcm92aWRlciQxKHByb3ZpZGVyW2ldLCB0SW5qZWN0YWJsZXMsIGxJbmplY3RhYmxlc0JsdWVwcmludCwgaXNDb21wb25lbnQsIGlzVmlld1Byb3ZpZGVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0b2tlbiA9IGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSA/IHByb3ZpZGVyIDogcmVzb2x2ZUZvcndhcmRSZWYocHJvdmlkZXIucHJvdmlkZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHByb3ZpZGVyRmFjdG9yeSA9IHByb3ZpZGVyVG9GYWN0b3J5KHByb3ZpZGVyKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJlZ2luSW5kZXggPSB0Tm9kZS5wcm92aWRlckluZGV4ZXMgJiA2NTUzNSAvKiBQcm92aWRlcnNTdGFydEluZGV4TWFzayAqLzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHROb2RlLmRpcmVjdGl2ZVN0YXJ0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNwdFZpZXdQcm92aWRlcnNDb3VudCA9IHROb2RlLnByb3ZpZGVySW5kZXhlcyA+PiAxNiAvKiBDcHRWaWV3UHJvdmlkZXJzQ291bnRTaGlmdCAqLzsKICAgICAgICAgICAgaWYgKGlzVHlwZVByb3ZpZGVyKHByb3ZpZGVyKSB8fCAhcHJvdmlkZXIubXVsdGkpIHsKICAgICAgICAgICAgICAgIC8vIFNpbmdsZSBwcm92aWRlciBjYXNlOiB0aGUgZmFjdG9yeSBpcyBjcmVhdGVkIGFuZCBwdXNoZWQgaW1tZWRpYXRlbHkKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSBuZXcgTm9kZUluamVjdG9yRmFjdG9yeShwcm92aWRlckZhY3RvcnksIGlzVmlld1Byb3ZpZGVyLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nRmFjdG9yeUluZGV4ID0gaW5kZXhPZih0b2tlbiwgdEluamVjdGFibGVzLCBpc1ZpZXdQcm92aWRlciA/IGJlZ2luSW5kZXggOiBiZWdpbkluZGV4ICsgY3B0Vmlld1Byb3ZpZGVyc0NvdW50LCBlbmRJbmRleCk7CiAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdGYWN0b3J5SW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgZGlQdWJsaWNJbkluamVjdG9yKGdldE9yQ3JlYXRlTm9kZUluamVjdG9yRm9yTm9kZSgoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcpLCB0VmlldywgdG9rZW4pOwogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRGVzdHJveUhvb2tzSWZTdXBwb3J0ZWQodFZpZXcsIHByb3ZpZGVyLCB0SW5qZWN0YWJsZXMubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICB0SW5qZWN0YWJsZXMucHVzaCh0b2tlbik7CiAgICAgICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlU3RhcnQrKzsKICAgICAgICAgICAgICAgICAgICB0Tm9kZS5kaXJlY3RpdmVFbmQrKzsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNWaWV3UHJvdmlkZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdE5vZGUucHJvdmlkZXJJbmRleGVzICs9IDY1NTM2IC8qIENwdFZpZXdQcm92aWRlcnNDb3VudFNoaWZ0ZXIgKi87CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGxJbmplY3RhYmxlc0JsdWVwcmludC5wdXNoKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgIGxWaWV3LnB1c2goZmFjdG9yeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdGYWN0b3J5SW5kZXhdID0gZmFjdG9yeTsKICAgICAgICAgICAgICAgICAgICBsVmlld1tleGlzdGluZ0ZhY3RvcnlJbmRleF0gPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gTXVsdGkgcHJvdmlkZXIgY2FzZToKICAgICAgICAgICAgICAgIC8vIFdlIGNyZWF0ZSBhIG11bHRpIGZhY3Rvcnkgd2hpY2ggaXMgZ29pbmcgdG8gYWdncmVnYXRlIGFsbCB0aGUgdmFsdWVzLgogICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIG91dHB1dCBvZiBzdWNoIGEgZmFjdG9yeSBkZXBlbmRzIG9uIGNvbnRlbnQgb3IgdmlldyBpbmplY3Rpb24sCiAgICAgICAgICAgICAgICAvLyB3ZSBjcmVhdGUgdHdvIG9mIHRoZW0sIHdoaWNoIGFyZSBsaW5rZWQgdG9nZXRoZXIuCiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gVGhlIGZpcnN0IG9uZSAoZm9yIHZpZXcgcHJvdmlkZXJzKSBpcyBhbHdheXMgaW4gdGhlIGZpcnN0IGJsb2NrIG9mIHRoZSBpbmplY3RhYmxlcyBhcnJheSwKICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgc2Vjb25kIG9uZSAoZm9yIHByb3ZpZGVycykgaXMgYWx3YXlzIGluIHRoZSBzZWNvbmQgYmxvY2suCiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGltcG9ydGFudCBiZWNhdXNlIHZpZXcgcHJvdmlkZXJzIGhhdmUgaGlnaGVyIHByaW9yaXR5LiBXaGVuIGEgbXVsdGkgdG9rZW4KICAgICAgICAgICAgICAgIC8vIGlzIGJlaW5nIGxvb2tlZCB1cCwgdGhlIHZpZXcgcHJvdmlkZXJzIHNob3VsZCBiZSBmb3VuZCBmaXJzdC4KICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gaGF2ZSBhIG11bHRpIGZhY3RvcnkgaW4gdGhlIHRoaXJkIGJsb2NrIChkaXJlY3RpdmUgYmxvY2spLgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIFRoZSBhbGdvcml0aG0gdG8gcHJvY2VzcyBtdWx0aSBwcm92aWRlcnMgaXMgYXMgZm9sbG93czoKICAgICAgICAgICAgICAgIC8vIDEpIElmIHRoZSBtdWx0aSBwcm92aWRlciBjb21lcyBmcm9tIHRoZSBgdmlld1Byb3ZpZGVyc2Agb2YgdGhlIGNvbXBvbmVudDoKICAgICAgICAgICAgICAgIC8vICAgYSkgSWYgdGhlIHNwZWNpYWwgdmlldyBwcm92aWRlcnMgZmFjdG9yeSBkb2Vzbid0IGV4aXN0LCBpdCBpcyBjcmVhdGVkIGFuZCBwdXNoZWQuCiAgICAgICAgICAgICAgICAvLyAgIGIpIEVsc2UsIHRoZSBtdWx0aSBwcm92aWRlciBpcyBhZGRlZCB0byB0aGUgZXhpc3RpbmcgbXVsdGkgZmFjdG9yeS4KICAgICAgICAgICAgICAgIC8vIDIpIElmIHRoZSBtdWx0aSBwcm92aWRlciBjb21lcyBmcm9tIHRoZSBgcHJvdmlkZXJzYCBvZiB0aGUgY29tcG9uZW50IG9yIG9mIGFub3RoZXIKICAgICAgICAgICAgICAgIC8vIGRpcmVjdGl2ZToKICAgICAgICAgICAgICAgIC8vICAgYSkgSWYgdGhlIG11bHRpIGZhY3RvcnkgZG9lc24ndCBleGlzdCwgaXQgaXMgY3JlYXRlZCBhbmQgcHJvdmlkZXIgcHVzaGVkIGludG8gaXQuCiAgICAgICAgICAgICAgICAvLyAgICAgIEl0IGlzIGFsc28gbGlua2VkIHRvIHRoZSBtdWx0aSBmYWN0b3J5IGZvciB2aWV3IHByb3ZpZGVycywgaWYgaXQgZXhpc3RzLgogICAgICAgICAgICAgICAgLy8gICBiKSBFbHNlLCB0aGUgbXVsdGkgcHJvdmlkZXIgaXMgYWRkZWQgdG8gdGhlIGV4aXN0aW5nIG11bHRpIGZhY3RvcnkuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA9IGluZGV4T2YodG9rZW4sIHRJbmplY3RhYmxlcywgYmVnaW5JbmRleCArIGNwdFZpZXdQcm92aWRlcnNDb3VudCwgZW5kSW5kZXgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4ID0gaW5kZXhPZih0b2tlbiwgdEluamVjdGFibGVzLCBiZWdpbkluZGV4LCBiZWdpbkluZGV4ICsgY3B0Vmlld1Byb3ZpZGVyc0NvdW50KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QgPSBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA+PSAwICYmCiAgICAgICAgICAgICAgICAgICAgbEluamVjdGFibGVzQmx1ZXByaW50W2V4aXN0aW5nUHJvdmlkZXJzRmFjdG9yeUluZGV4XTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRvZXNWaWV3UHJvdmlkZXJzRmFjdG9yeUV4aXN0ID0gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4ID49IDAgJiYKICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XTsKICAgICAgICAgICAgICAgIGlmIChpc1ZpZXdQcm92aWRlciAmJiAhZG9lc1ZpZXdQcm92aWRlcnNGYWN0b3J5RXhpc3QgfHwKICAgICAgICAgICAgICAgICAgICAhaXNWaWV3UHJvdmlkZXIgJiYgIWRvZXNQcm92aWRlcnNGYWN0b3J5RXhpc3QpIHsKICAgICAgICAgICAgICAgICAgICAvLyBDYXNlcyAxLmEgYW5kIDIuYQogICAgICAgICAgICAgICAgICAgIGRpUHVibGljSW5JbmplY3RvcihnZXRPckNyZWF0ZU5vZGVJbmplY3RvckZvck5vZGUoKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSksIGxWaWV3KSwgdFZpZXcsIHRva2VuKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IG11bHRpRmFjdG9yeShpc1ZpZXdQcm92aWRlciA/IG11bHRpVmlld1Byb3ZpZGVyc0ZhY3RvcnlSZXNvbHZlciA6IG11bHRpUHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyLCBsSW5qZWN0YWJsZXNCbHVlcHJpbnQubGVuZ3RoLCBpc1ZpZXdQcm92aWRlciwgaXNDb21wb25lbnQsIHByb3ZpZGVyRmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1ZpZXdQcm92aWRlciAmJiBkb2VzVmlld1Byb3ZpZGVyc0ZhY3RvcnlFeGlzdCkgewogICAgICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5wcm92aWRlckZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZWdpc3RlckRlc3Ryb3lIb29rc0lmU3VwcG9ydGVkKHRWaWV3LCBwcm92aWRlciwgdEluamVjdGFibGVzLmxlbmd0aCwgMCk7CiAgICAgICAgICAgICAgICAgICAgdEluamVjdGFibGVzLnB1c2godG9rZW4pOwogICAgICAgICAgICAgICAgICAgIHROb2RlLmRpcmVjdGl2ZVN0YXJ0Kys7CiAgICAgICAgICAgICAgICAgICAgdE5vZGUuZGlyZWN0aXZlRW5kKys7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVmlld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHROb2RlLnByb3ZpZGVySW5kZXhlcyArPSA2NTUzNiAvKiBDcHRWaWV3UHJvdmlkZXJzQ291bnRTaGlmdGVyICovOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBsSW5qZWN0YWJsZXNCbHVlcHJpbnQucHVzaChmYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICBsVmlldy5wdXNoKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2FzZXMgMS5iIGFuZCAyLmIKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXhJbkZhY3RvcnkgPSBtdWx0aUZhY3RvcnlBZGQoKC8qKiBAdHlwZSB7P30gKi8gKGxJbmplY3RhYmxlc0JsdWVwcmludCkpW2lzVmlld1Byb3ZpZGVyID8gZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4IDoKICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdQcm92aWRlcnNGYWN0b3J5SW5kZXhdLCBwcm92aWRlckZhY3RvcnksICFpc1ZpZXdQcm92aWRlciAmJiBpc0NvbXBvbmVudCk7CiAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJEZXN0cm95SG9va3NJZlN1cHBvcnRlZCh0VmlldywgcHJvdmlkZXIsIGV4aXN0aW5nUHJvdmlkZXJzRmFjdG9yeUluZGV4ID4gLTEgPyBleGlzdGluZ1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCA6CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVmlld1Byb3ZpZGVyc0ZhY3RvcnlJbmRleCwgaW5kZXhJbkZhY3RvcnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFpc1ZpZXdQcm92aWRlciAmJiBpc0NvbXBvbmVudCAmJiBkb2VzVmlld1Byb3ZpZGVyc0ZhY3RvcnlFeGlzdCkgewogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChsSW5qZWN0YWJsZXNCbHVlcHJpbnRbZXhpc3RpbmdWaWV3UHJvdmlkZXJzRmFjdG9yeUluZGV4XS5jb21wb25lbnRQcm92aWRlcnMpKSsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgdGhlIGBuZ09uRGVzdHJveWAgaG9vayBvZiBhIHByb3ZpZGVyLCBpZiB0aGUgcHJvdmlkZXIgc3VwcG9ydHMgZGVzdHJveSBob29rcy4KICAgICAqIEBwYXJhbSB7P30gdFZpZXcgYFRWaWV3YCBpbiB3aGljaCB0byByZWdpc3RlciB0aGUgaG9vay4KICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXIgUHJvdmlkZXIgd2hvc2UgaG9vayBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KICAgICAqIEBwYXJhbSB7P30gY29udGV4dEluZGV4IEluZGV4IHVuZGVyIHdoaWNoIHRvIGZpbmQgdGhlIGNvbnRleHQgZm9yIHRoZSBob29rIHdoZW4gaXQncyBiZWluZyBpbnZva2VkLgogICAgICogQHBhcmFtIHs/PX0gaW5kZXhJbkZhY3RvcnkgT25seSByZXF1aXJlZCBmb3IgYG11bHRpYCBwcm92aWRlcnMuIEluZGV4IG9mIHRoZSBwcm92aWRlciBpbiB0aGUgbXVsdGkKICAgICAqIHByb3ZpZGVyIGZhY3RvcnkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZWdpc3RlckRlc3Ryb3lIb29rc0lmU3VwcG9ydGVkKHRWaWV3LCBwcm92aWRlciwgY29udGV4dEluZGV4LCBpbmRleEluRmFjdG9yeSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm92aWRlcklzVHlwZVByb3ZpZGVyID0gaXNUeXBlUHJvdmlkZXIocHJvdmlkZXIpOwogICAgICAgIGlmIChwcm92aWRlcklzVHlwZVByb3ZpZGVyIHx8IGlzQ2xhc3NQcm92aWRlcihwcm92aWRlcikpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm90b3R5cGUgPSAoKCgvKiogQHR5cGUgez99ICovIChwcm92aWRlcikpKS51c2VDbGFzcyB8fCBwcm92aWRlcikucHJvdG90eXBlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nT25EZXN0cm95ID0gcHJvdG90eXBlLm5nT25EZXN0cm95OwogICAgICAgICAgICBpZiAobmdPbkRlc3Ryb3kpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGhvb2tzID0gdFZpZXcuZGVzdHJveUhvb2tzIHx8ICh0Vmlldy5kZXN0cm95SG9va3MgPSBbXSk7CiAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVySXNUeXBlUHJvdmlkZXIgJiYgKCgoLyoqIEB0eXBlIHs/fSAqLyAocHJvdmlkZXIpKSkpLm11bHRpKSB7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydERlZmluZWQoaW5kZXhJbkZhY3RvcnksICdpbmRleEluRmFjdG9yeSB3aGVuIHJlZ2lzdGVyaW5nIG11bHRpIGZhY3RvcnkgZGVzdHJveSBob29rJyk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nQ2FsbGJhY2tzSW5kZXggPSBob29rcy5pbmRleE9mKGNvbnRleHRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nQ2FsbGJhY2tzSW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhvb2tzLnB1c2goY29udGV4dEluZGV4LCBbaW5kZXhJbkZhY3RvcnksIG5nT25EZXN0cm95XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGhvb2tzW2V4aXN0aW5nQ2FsbGJhY2tzSW5kZXggKyAxXSkpKS5wdXNoKCgvKiogQHR5cGUgez99ICovIChpbmRleEluRmFjdG9yeSkpLCBuZ09uRGVzdHJveSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaG9va3MucHVzaChjb250ZXh0SW5kZXgsIG5nT25EZXN0cm95KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQWRkIGEgZmFjdG9yeSBpbiBhIG11bHRpIGZhY3RvcnkuCiAgICAgKiBAcGFyYW0gez99IG11bHRpRmFjdG9yeQogICAgICogQHBhcmFtIHs/fSBmYWN0b3J5CiAgICAgKiBAcGFyYW0gez99IGlzQ29tcG9uZW50UHJvdmlkZXIKICAgICAqIEByZXR1cm4gez99IEluZGV4IGF0IHdoaWNoIHRoZSBmYWN0b3J5IHdhcyBpbnNlcnRlZC4KICAgICAqLwogICAgZnVuY3Rpb24gbXVsdGlGYWN0b3J5QWRkKG11bHRpRmFjdG9yeSwgZmFjdG9yeSwgaXNDb21wb25lbnRQcm92aWRlcikgewogICAgICAgIGlmIChpc0NvbXBvbmVudFByb3ZpZGVyKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChtdWx0aUZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzKSkrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChtdWx0aUZhY3RvcnkubXVsdGkpKS5wdXNoKGZhY3RvcnkpIC0gMTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgaW5kZXggb2YgaXRlbSBpbiB0aGUgYXJyYXksIGJ1dCBvbmx5IGluIHRoZSBiZWdpbiB0byBlbmQgcmFuZ2UuCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEBwYXJhbSB7P30gYXJyCiAgICAgKiBAcGFyYW0gez99IGJlZ2luCiAgICAgKiBAcGFyYW0gez99IGVuZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW5kZXhPZihpdGVtLCBhcnIsIGJlZ2luLCBlbmQpIHsKICAgICAgICBmb3IgKGxldCBpID0gYmVnaW47IGkgPCBlbmQ7IGkrKykgewogICAgICAgICAgICBpZiAoYXJyW2ldID09PSBpdGVtKQogICAgICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGBwcm92aWRlcnNgLgogICAgICogQHRoaXMgez99CiAgICAgKiBAcGFyYW0gez99IF8KICAgICAqIEBwYXJhbSB7P30gdERhdGEKICAgICAqIEBwYXJhbSB7P30gbERhdGEKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG11bHRpUHJvdmlkZXJzRmFjdG9yeVJlc29sdmVyKF8sIHREYXRhLCBsRGF0YSwgdE5vZGUpIHsKICAgICAgICByZXR1cm4gbXVsdGlSZXNvbHZlKCgvKiogQHR5cGUgez99ICovICh0aGlzLm11bHRpKSksIFtdKTsKICAgIH0KICAgIC8qKgogICAgICogVXNlIHRoaXMgd2l0aCBgbXVsdGlgIGB2aWV3UHJvdmlkZXJzYC4KICAgICAqCiAgICAgKiBUaGlzIGZhY3Rvcnkga25vd3MgaG93IHRvIGNvbmNhdGVuYXRlIGl0c2VsZiB3aXRoIHRoZSBleGlzdGluZyBgbXVsdGlgIGBwcm92aWRlcnNgLgogICAgICogQHRoaXMgez99CiAgICAgKiBAcGFyYW0gez99IF8KICAgICAqIEBwYXJhbSB7P30gdERhdGEKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG11bHRpVmlld1Byb3ZpZGVyc0ZhY3RvcnlSZXNvbHZlcihfLCB0RGF0YSwgbFZpZXcsIHROb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZhY3RvcmllcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm11bHRpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXN1bHQ7CiAgICAgICAgaWYgKHRoaXMucHJvdmlkZXJGYWN0b3J5KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcG9uZW50Q291bnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5wcm92aWRlckZhY3RvcnkuY29tcG9uZW50UHJvdmlkZXJzKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbXVsdGlQcm92aWRlcnMgPSBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgbFZpZXdbVFZJRVddLCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMucHJvdmlkZXJGYWN0b3J5KSkuaW5kZXgpKSwgdE5vZGUpOwogICAgICAgICAgICAvLyBDb3B5IHRoZSBzZWN0aW9uIG9mIHRoZSBhcnJheSB3aGljaCBjb250YWlucyBgbXVsdGlgIGBwcm92aWRlcnNgIGZyb20gdGhlIGNvbXBvbmVudAogICAgICAgICAgICByZXN1bHQgPSBtdWx0aVByb3ZpZGVycy5zbGljZSgwLCBjb21wb25lbnRDb3VudCk7CiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgYHZpZXdQcm92aWRlcmAgaW5zdGFuY2VzLgogICAgICAgICAgICBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpOwogICAgICAgICAgICAvLyBDb3B5IHRoZSBzZWN0aW9uIG9mIHRoZSBhcnJheSB3aGljaCBjb250YWlucyBgbXVsdGlgIGBwcm92aWRlcnNgIGZyb20gb3RoZXIgZGlyZWN0aXZlcwogICAgICAgICAgICBmb3IgKGxldCBpID0gY29tcG9uZW50Q291bnQ7IGkgPCBtdWx0aVByb3ZpZGVycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2gobXVsdGlQcm92aWRlcnNbaV0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXN1bHQgPSBbXTsKICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBgdmlld1Byb3ZpZGVyYCBpbnN0YW5jZXMuCiAgICAgICAgICAgIG11bHRpUmVzb2x2ZShmYWN0b3JpZXMsIHJlc3VsdCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIE1hcHMgYW4gYXJyYXkgb2YgZmFjdG9yaWVzIGludG8gYW4gYXJyYXkgb2YgdmFsdWVzLgogICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtdWx0aVJlc29sdmUoZmFjdG9yaWVzLCByZXN1bHQpIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGZhY3Rvcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZhY3RvcnkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGZhY3Rvcmllc1tpXSkpKSk7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGZhY3RvcnkoKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgYSBtdWx0aSBmYWN0b3J5LgogICAgICogQHBhcmFtIHs/fSBmYWN0b3J5Rm4KICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gaXNWaWV3UHJvdmlkZXIKICAgICAqIEBwYXJhbSB7P30gaXNDb21wb25lbnQKICAgICAqIEBwYXJhbSB7P30gZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbXVsdGlGYWN0b3J5KGZhY3RvcnlGbiwgaW5kZXgsIGlzVmlld1Byb3ZpZGVyLCBpc0NvbXBvbmVudCwgZikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmYWN0b3J5ID0gbmV3IE5vZGVJbmplY3RvckZhY3RvcnkoZmFjdG9yeUZuLCBpc1ZpZXdQcm92aWRlciwgybXJtWRpcmVjdGl2ZUluamVjdCk7CiAgICAgICAgZmFjdG9yeS5tdWx0aSA9IFtdOwogICAgICAgIGZhY3RvcnkuaW5kZXggPSBpbmRleDsKICAgICAgICBmYWN0b3J5LmNvbXBvbmVudFByb3ZpZGVycyA9IDA7CiAgICAgICAgbXVsdGlGYWN0b3J5QWRkKGZhY3RvcnksIGYsIGlzQ29tcG9uZW50ICYmICFpc1ZpZXdQcm92aWRlcik7CiAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2ZlYXR1cmVzL3Byb3ZpZGVyc19mZWF0dXJlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhpcyBmZWF0dXJlIHJlc29sdmVzIHRoZSBwcm92aWRlcnMgb2YgYSBkaXJlY3RpdmUgKG9yIGNvbXBvbmVudCksCiAgICAgKiBhbmQgcHVibGlzaCB0aGVtIGludG8gdGhlIERJIHN5c3RlbSwgbWFraW5nIGl0IHZpc2libGUgdG8gb3RoZXJzIGZvciBpbmplY3Rpb24uCiAgICAgKgogICAgICogRm9yIGV4YW1wbGU6CiAgICAgKiBgYGB0cwogICAgICogY2xhc3MgQ29tcG9uZW50V2l0aFByb3ZpZGVycyB7CiAgICAgKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgZ3JlZXRlcjogR3JlZXRlckRFKSB7fQogICAgICoKICAgICAqICAgc3RhdGljIMm1Y21wID0gZGVmaW5lQ29tcG9uZW50KHsKICAgICAqICAgICB0eXBlOiBDb21wb25lbnRXaXRoUHJvdmlkZXJzLAogICAgICogICAgIHNlbGVjdG9yczogW1snY29tcG9uZW50LXdpdGgtcHJvdmlkZXJzJ11dLAogICAgICogICAgZmFjdG9yeTogKCkgPT4gbmV3IENvbXBvbmVudFdpdGhQcm92aWRlcnMoZGlyZWN0aXZlSW5qZWN0KEdyZWV0ZXJERSBhcyBhbnkpKSwKICAgICAqICAgIGRlY2xzOiAxLAogICAgICogICAgdmFyczogMSwKICAgICAqICAgIHRlbXBsYXRlOiBmdW5jdGlvbihmczogUmVuZGVyRmxhZ3MsIGN0eDogQ29tcG9uZW50V2l0aFByb3ZpZGVycykgewogICAgICogICAgICBpZiAoZnMgJiBSZW5kZXJGbGFncy5DcmVhdGUpIHsKICAgICAqICAgICAgICDJtcm1dGV4dCgwKTsKICAgICAqICAgICAgfQogICAgICogICAgICBpZiAoZnMgJiBSZW5kZXJGbGFncy5VcGRhdGUpIHsKICAgICAqICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eC5ncmVldGVyLmdyZWV0KCkpOwogICAgICogICAgICB9CiAgICAgKiAgICB9LAogICAgICogICAgZmVhdHVyZXM6IFtQcm92aWRlcnNGZWF0dXJlKFtHcmVldGVyREVdKV0KICAgICAqICB9KTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgKiBAcGFyYW0gez89fSB2aWV3UHJvdmlkZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1UHJvdmlkZXJzRmVhdHVyZShwcm92aWRlcnMsIHZpZXdQcm92aWRlcnMgPSBbXSkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWZpbml0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZGVmaW5pdGlvbikgPT4gewogICAgICAgICAgICBkZWZpbml0aW9uLnByb3ZpZGVyc1Jlc29sdmVyID0KICAgICAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez89fSBwcm9jZXNzUHJvdmlkZXJzRm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChkZWYsIHByb2Nlc3NQcm92aWRlcnNGbikgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm92aWRlcnNSZXNvbHZlcihkZWYsIC8vCiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc1Byb3ZpZGVyc0ZuID8gcHJvY2Vzc1Byb3ZpZGVyc0ZuKHByb3ZpZGVycykgOiBwcm92aWRlcnMsIC8vCiAgICAgICAgICAgICAgICAgICAgdmlld1Byb3ZpZGVycyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9jb21wb25lbnRfZmFjdG9yeS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFJlcHJlc2VudHMgYSBjb21wb25lbnQgY3JlYXRlZCBieSBhIGBDb21wb25lbnRGYWN0b3J5YC4KICAgICAqIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29tcG9uZW50IGluc3RhbmNlIGFuZCByZWxhdGVkIG9iamVjdHMsCiAgICAgKiBhbmQgcHJvdmlkZXMgdGhlIG1lYW5zIG9mIGRlc3Ryb3lpbmcgdGhlIGluc3RhbmNlLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgKi8KICAgIGNsYXNzIENvbXBvbmVudFJlZiB7CiAgICB9CiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIGEgZmFjdG9yeSB0aGF0IGNhbiBjcmVhdGUgYSBjb21wb25lbnQgZHluYW1pY2FsbHkuCiAgICAgKiBJbnN0YW50aWF0ZSBhIGZhY3RvcnkgZm9yIGEgZ2l2ZW4gdHlwZSBvZiBjb21wb25lbnQgd2l0aCBgcmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkoKWAuCiAgICAgKiBVc2UgdGhlIHJlc3VsdGluZyBgQ29tcG9uZW50RmFjdG9yeS5jcmVhdGUoKWAgbWV0aG9kIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBvZiB0aGF0IHR5cGUuCiAgICAgKgogICAgICogQHNlZSBbRHluYW1pYyBDb21wb25lbnRzXShndWlkZS9keW5hbWljLWNvbXBvbmVudC1sb2FkZXIpCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICogQHRlbXBsYXRlIEMKICAgICAqLwogICAgY2xhc3MgQ29tcG9uZW50RmFjdG9yeSB7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvY29tcG9uZW50X2ZhY3RvcnlfcmVzb2x2ZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVycm9yID0gRXJyb3IoYE5vIGNvbXBvbmVudCBmYWN0b3J5IGZvdW5kIGZvciAke3N0cmluZ2lmeShjb21wb25lbnQpfS4gRGlkIHlvdSBhZGQgaXQgdG8gQE5nTW9kdWxlLmVudHJ5Q29tcG9uZW50cz9gKTsKICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGVycm9yKSkpW0VSUk9SX0NPTVBPTkVOVF0gPSBjb21wb25lbnQ7CiAgICAgICAgcmV0dXJuIGVycm9yOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRVJST1JfQ09NUE9ORU5UID0gJ25nQ29tcG9uZW50JzsKICAgIGNsYXNzIF9OdWxsQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNvbHZlQ29tcG9uZW50RmFjdG9yeShjb21wb25lbnQpIHsKICAgICAgICAgICAgdGhyb3cgbm9Db21wb25lbnRGYWN0b3J5RXJyb3IoY29tcG9uZW50KTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEEgc2ltcGxlIHJlZ2lzdHJ5IHRoYXQgbWFwcyBgQ29tcG9uZW50c2AgdG8gZ2VuZXJhdGVkIGBDb21wb25lbnRGYWN0b3J5YCBjbGFzc2VzCiAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZXMgb2YgY29tcG9uZW50cy4KICAgICAqIFVzZSB0byBvYnRhaW4gdGhlIGZhY3RvcnkgZm9yIGEgZ2l2ZW4gY29tcG9uZW50IHR5cGUsCiAgICAgKiB0aGVuIHVzZSB0aGUgZmFjdG9yeSdzIGBjcmVhdGUoKWAgbWV0aG9kIHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBvZiB0aGF0IHR5cGUuCiAgICAgKgogICAgICogQHNlZSBbRHluYW1pYyBDb21wb25lbnRzXShndWlkZS9keW5hbWljLWNvbXBvbmVudC1sb2FkZXIpCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB7CiAgICB9CiAgICBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIuTlVMTCA9IG5ldyBfTnVsbENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcigpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL2VsZW1lbnRfcmVmLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQSB3cmFwcGVyIGFyb3VuZCBhIG5hdGl2ZSBlbGVtZW50IGluc2lkZSBvZiBhIFZpZXcuCiAgICAgKgogICAgICogQW4gYEVsZW1lbnRSZWZgIGlzIGJhY2tlZCBieSBhIHJlbmRlci1zcGVjaWZpYyBlbGVtZW50LiBJbiB0aGUgYnJvd3NlciwgdGhpcyBpcyB1c3VhbGx5IGEgRE9NCiAgICAgKiBlbGVtZW50LgogICAgICoKICAgICAqIFxAc2VjdXJpdHkgUGVybWl0dGluZyBkaXJlY3QgYWNjZXNzIHRvIHRoZSBET00gY2FuIG1ha2UgeW91ciBhcHBsaWNhdGlvbiBtb3JlIHZ1bG5lcmFibGUgdG8KICAgICAqIFhTUyBhdHRhY2tzLiBDYXJlZnVsbHkgcmV2aWV3IGFueSB1c2Ugb2YgYEVsZW1lbnRSZWZgIGluIHlvdXIgY29kZS4gRm9yIG1vcmUgZGV0YWlsLCBzZWUgdGhlCiAgICAgKiBbU2VjdXJpdHkgR3VpZGVdKGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5KS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgLy8gTm90ZTogV2UgZG9uJ3QgZXhwb3NlIHRoaW5ncyBsaWtlIGBJbmplY3RvcmAsIGBWaWV3Q29udGFpbmVyYCwgLi4uIGhlcmUsCiAgICAvLyBpLmUuIHVzZXJzIGhhdmUgdG8gYXNrIGZvciB3aGF0IHRoZXkgbmVlZC4gV2l0aCB0aGF0LCB3ZSBjYW4gYnVpbGQgYmV0dGVyIGFuYWx5c2lzIHRvb2xzCiAgICAvLyBhbmQgY291bGQgZG8gYmV0dGVyIGNvZGVnZW4gaW4gdGhlIGZ1dHVyZS4KICAgIGNsYXNzIEVsZW1lbnRSZWYgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmF0aXZlRWxlbWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5hdGl2ZUVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5uYXRpdmVFbGVtZW50ID0gbmF0aXZlRWxlbWVudDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBub2NvbGxhcHNlCiAgICAgKi8KICAgIEVsZW1lbnRSZWYuX19OR19FTEVNRU5UX0lEX18gPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWShFbGVtZW50UmVmKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfRUxFTUVOVF9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0RWxlbWVudFJlZjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNXSVRDSF9FTEVNRU5UX1JFRl9GQUNUT1JZID0gU1dJVENIX0VMRU1FTlRfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXzsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlci9hcGkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUmVuZGVyZXIySW50ZXJjZXB0b3IgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1JlbmRlcmVyMkludGVyY2VwdG9yJyk7CiAgICAvKioKICAgICAqIENyZWF0ZXMgYW5kIGluaXRpYWxpemVzIGEgY3VzdG9tIHJlbmRlcmVyIHRoYXQgaW1wbGVtZW50cyB0aGUgYFJlbmRlcmVyMmAgYmFzZSBjbGFzcy4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIFJlbmRlcmVyRmFjdG9yeTIgewogICAgfQogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBSZW5kZXJlclN0eWxlRmxhZ3MyID0gewogICAgICAgIC8vIFRPRE8obWlza28pOiBUaGlzIG5lZWRzIHRvIGJlIHJlZmFjdG9yZWQgaW50byBhIHNlcGFyYXRlIGZpbGUgc28gdGhhdCBpdCBjYW4gYmUgaW1wb3J0ZWQgZnJvbQogICAgICAgIC8vIGBub2RlX21hbmlwdWxhdGlvbi50c2AgQ3VycmVudGx5IGRvaW5nIHRoZSBpbXBvcnQgY2F1c2UgcmVzb2x1dGlvbiBvcmRlciB0byBjaGFuZ2UgYW5kIGZhaWxzCiAgICAgICAgLy8gdGhlIHRlc3RzLiBUaGUgd29yayBhcm91bmQgaXMgdG8gaGF2ZSBoYXJkIGNvZGVkIHZhbHVlIGluIGBub2RlX21hbmlwdWxhdGlvbi50c2AgZm9yIG5vdy4KICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyBhIHN0eWxlIGFzIGltcG9ydGFudC4KICAgICAgICAgKi8KICAgICAgICBJbXBvcnRhbnQ6IDEsCiAgICAgICAgLyoqCiAgICAgICAgICogTWFya3MgYSBzdHlsZSBhcyB1c2luZyBkYXNoIGNhc2UgbmFtaW5nICh0aGlzLWlzLWRhc2gtY2FzZSkuCiAgICAgICAgICovCiAgICAgICAgRGFzaENhc2U6IDIsCiAgICB9OwogICAgUmVuZGVyZXJTdHlsZUZsYWdzMltSZW5kZXJlclN0eWxlRmxhZ3MyLkltcG9ydGFudF0gPSAnSW1wb3J0YW50JzsKICAgIFJlbmRlcmVyU3R5bGVGbGFnczJbUmVuZGVyZXJTdHlsZUZsYWdzMi5EYXNoQ2FzZV0gPSAnRGFzaENhc2UnOwogICAgLyoqCiAgICAgKiBFeHRlbmQgdGhpcyBiYXNlIGNsYXNzIHRvIGltcGxlbWVudCBjdXN0b20gcmVuZGVyaW5nLiBCeSBkZWZhdWx0LCBBbmd1bGFyCiAgICAgKiByZW5kZXJzIGEgdGVtcGxhdGUgaW50byBET00uIFlvdSBjYW4gdXNlIGN1c3RvbSByZW5kZXJpbmcgdG8gaW50ZXJjZXB0CiAgICAgKiByZW5kZXJpbmcgY2FsbHMsIG9yIHRvIHJlbmRlciB0byBzb21ldGhpbmcgb3RoZXIgdGhhbiBET00uCiAgICAgKgogICAgICogQ3JlYXRlIHlvdXIgY3VzdG9tIHJlbmRlcmVyIHVzaW5nIGBSZW5kZXJlckZhY3RvcnkyYC4KICAgICAqCiAgICAgKiBVc2UgYSBjdXN0b20gcmVuZGVyZXIgdG8gYnlwYXNzIEFuZ3VsYXIncyB0ZW1wbGF0aW5nIGFuZAogICAgICogbWFrZSBjdXN0b20gVUkgY2hhbmdlcyB0aGF0IGNhbid0IGJlIGV4cHJlc3NlZCBkZWNsYXJhdGl2ZWx5LgogICAgICogRm9yIGV4YW1wbGUgaWYgeW91IG5lZWQgdG8gc2V0IGEgcHJvcGVydHkgb3IgYW4gYXR0cmlidXRlIHdob3NlIG5hbWUgaXMKICAgICAqIG5vdCBzdGF0aWNhbGx5IGtub3duLCB1c2UgdGhlIGBzZXRQcm9wZXJ0eSgpYCBvcgogICAgICogYHNldEF0dHJpYnV0ZSgpYCBtZXRob2QuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBSZW5kZXJlcjIgewogICAgfQogICAgLyoqCiAgICAgKiBcQGludGVybmFsCiAgICAgKiBAbm9jb2xsYXBzZQogICAgICovCiAgICBSZW5kZXJlcjIuX19OR19FTEVNRU5UX0lEX18gPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUlkoKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfUkVOREVSRVIyX0ZBQ1RPUllfX1BPU1RfUjNfXyA9IGluamVjdFJlbmRlcmVyMjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWSA9IFNXSVRDSF9SRU5ERVJFUjJfRkFDVE9SWV9fUE9TVF9SM19fOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvc2FuaXRpemF0aW9uL3Nhbml0aXplci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFNhbml0aXplciBpcyB1c2VkIGJ5IHRoZSB2aWV3cyB0byBzYW5pdGl6ZSBwb3RlbnRpYWxseSBkYW5nZXJvdXMgdmFsdWVzLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgU2FuaXRpemVyIHsKICAgIH0KICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU2FuaXRpemVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsKICAgICAgICB0b2tlbjogU2FuaXRpemVyLAogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBudWxsKSwKICAgIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvdmVyc2lvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24gUmVwcmVzZW50cyB0aGUgdmVyc2lvbiBvZiBBbmd1bGFyCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgVmVyc2lvbiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmdWxsCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZnVsbCkgewogICAgICAgICAgICB0aGlzLmZ1bGwgPSBmdWxsOwogICAgICAgICAgICB0aGlzLm1ham9yID0gZnVsbC5zcGxpdCgnLicpWzBdOwogICAgICAgICAgICB0aGlzLm1pbm9yID0gZnVsbC5zcGxpdCgnLicpWzFdOwogICAgICAgICAgICB0aGlzLnBhdGNoID0gZnVsbC5zcGxpdCgnLicpLnNsaWNlKDIpLmpvaW4oJy4nKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgVkVSU0lPTiA9IG5ldyBWZXJzaW9uKCc5LjEuMTInKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2NoYW5nZV9kZXRlY3Rpb24vZGlmZmVycy9kZWZhdWx0X2l0ZXJhYmxlX2RpZmZlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0cyhvYmopIHsKICAgICAgICAgICAgcmV0dXJuIGlzTGlzdExpa2VJdGVyYWJsZSQxKG9iaik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgICAgICogQHBhcmFtIHs/PX0gdHJhY2tCeUZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGUodHJhY2tCeUZuKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdEl0ZXJhYmxlRGlmZmVyKHRyYWNrQnlGbik7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgdHJhY2tCeUlkZW50aXR5ID0gKC8qKgogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoaW5kZXgsIGl0ZW0pID0+IGl0ZW0pOwogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZCB2NC4wLjAgLSBTaG91bGQgbm90IGJlIHBhcnQgb2YgcHVibGljIEFQSS4KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdGVtcGxhdGUgVgogICAgICovCiAgICBjbGFzcyBEZWZhdWx0SXRlcmFibGVEaWZmZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IHRyYWNrQnlGbgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHRyYWNrQnlGbikgewogICAgICAgICAgICB0aGlzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHRoZSB1c2VkIHJlY29yZHMgYXQgYW55IHBvaW50IGluIHRpbWUgKGR1cmluZyAmIGFjcm9zcyBgX2NoZWNrKClgIGNhbGxzKQogICAgICAgICAgICB0aGlzLl9saW5rZWRSZWNvcmRzID0gbnVsbDsKICAgICAgICAgICAgLy8gS2VlcHMgdHJhY2sgb2YgdGhlIHJlbW92ZWQgcmVjb3JkcyBhdCBhbnkgcG9pbnQgaW4gdGltZSBkdXJpbmcgYF9jaGVjaygpYCBjYWxscy4KICAgICAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNJdEhlYWQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9pdEhlYWQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9pdFRhaWwgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX21vdmVzSGVhZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX21vdmVzVGFpbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7CiAgICAgICAgICAgIC8vIEtlZXBzIHRyYWNrIG9mIHJlY29yZHMgd2hlcmUgY3VzdG9tIHRyYWNrIGJ5IGlzIHRoZSBzYW1lLCBidXQgaXRlbSBpZGVudGl0eSBoYXMgY2hhbmdlZAogICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNIZWFkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3RyYWNrQnlGbiA9IHRyYWNrQnlGbiB8fCB0cmFja0J5SWRlbnRpdHk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvckVhY2hJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvckVhY2hPcGVyYXRpb24oZm4pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbmV4dEl0ID0gdGhpcy5faXRIZWFkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBuZXh0UmVtb3ZlID0gdGhpcy5fcmVtb3ZhbHNIZWFkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBhZGRSZW1vdmVPZmZzZXQgPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBtb3ZlT2Zmc2V0cyA9IG51bGw7CiAgICAgICAgICAgIHdoaWxlIChuZXh0SXQgfHwgbmV4dFJlbW92ZSkgewogICAgICAgICAgICAgICAgLy8gRmlndXJlIG91dCB3aGljaCBpcyB0aGUgbmV4dCByZWNvcmQgdG8gcHJvY2VzcwogICAgICAgICAgICAgICAgLy8gT3JkZXI6IHJlbW92ZSwgYWRkLCBtb3ZlCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByZWNvcmQgPSAhbmV4dFJlbW92ZSB8fAogICAgICAgICAgICAgICAgICAgIG5leHRJdCAmJgogICAgICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAobmV4dEl0LmN1cnJlbnRJbmRleCkpIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFByZXZpb3VzSW5kZXgobmV4dFJlbW92ZSwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cykgPwogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChuZXh0SXQpKSA6CiAgICAgICAgICAgICAgICAgICAgbmV4dFJlbW92ZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGFkalByZXZpb3VzSW5kZXggPSBnZXRQcmV2aW91c0luZGV4KHJlY29yZCwgYWRkUmVtb3ZlT2Zmc2V0LCBtb3ZlT2Zmc2V0cyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4OwogICAgICAgICAgICAgICAgLy8gY29uc3VtZSB0aGUgaXRlbSwgYW5kIGFkanVzdCB0aGUgYWRkUmVtb3ZlT2Zmc2V0IGFuZCB1cGRhdGUgbW92ZURpc3RhbmNlIGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gbmV4dFJlbW92ZSkgewogICAgICAgICAgICAgICAgICAgIGFkZFJlbW92ZU9mZnNldC0tOwogICAgICAgICAgICAgICAgICAgIG5leHRSZW1vdmUgPSBuZXh0UmVtb3ZlLl9uZXh0UmVtb3ZlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5leHRJdCA9ICgvKiogQHR5cGUgez99ICovIChuZXh0SXQpKS5fbmV4dDsKICAgICAgICAgICAgICAgICAgICBpZiAocmVjb3JkLnByZXZpb3VzSW5kZXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGRSZW1vdmVPZmZzZXQrKzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElOVkFSSUFOVDogIGN1cnJlbnRJbmRleCA8IHByZXZpb3VzSW5kZXgKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtb3ZlT2Zmc2V0cykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxNb3ZlUHJldmlvdXNJbmRleCA9IGFkalByZXZpb3VzSW5kZXggLSBhZGRSZW1vdmVPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxDdXJyZW50SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudEluZGV4KSkgLSBhZGRSZW1vdmVPZmZzZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbE1vdmVQcmV2aW91c0luZGV4ICE9IGxvY2FsQ3VycmVudEluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTW92ZVByZXZpb3VzSW5kZXg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvZmZzZXQgPSBpIDwgbW92ZU9mZnNldHMubGVuZ3RoID8gbW92ZU9mZnNldHNbaV0gOiAobW92ZU9mZnNldHNbaV0gPSAwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBvZmZzZXQgKyBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2NhbEN1cnJlbnRJbmRleCA8PSBpbmRleCAmJiBpbmRleCA8IGxvY2FsTW92ZVByZXZpb3VzSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW92ZU9mZnNldHNbaV0gPSBvZmZzZXQgKyAxOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSByZWNvcmQucHJldmlvdXNJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vdmVPZmZzZXRzW3ByZXZpb3VzSW5kZXhdID0gbG9jYWxDdXJyZW50SW5kZXggLSBsb2NhbE1vdmVQcmV2aW91c0luZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFkalByZXZpb3VzSW5kZXggIT09IGN1cnJlbnRJbmRleCkgewogICAgICAgICAgICAgICAgICAgIGZuKHJlY29yZCwgYWRqUHJldmlvdXNJbmRleCwgY3VycmVudEluZGV4KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JFYWNoUHJldmlvdXNJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c0l0SGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRQcmV2aW91cykgewogICAgICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JFYWNoQWRkZWRJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dEFkZGVkKSB7CiAgICAgICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvckVhY2hNb3ZlZEl0ZW0oZm4pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZCkgewogICAgICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JFYWNoUmVtb3ZlZEl0ZW0oZm4pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX3JlbW92YWxzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRSZW1vdmVkKSB7CiAgICAgICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvckVhY2hJZGVudGl0eUNoYW5nZShmbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRJZGVudGl0eUNoYW5nZSkgewogICAgICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpZmYoY29sbGVjdGlvbikgewogICAgICAgICAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKQogICAgICAgICAgICAgICAgY29sbGVjdGlvbiA9IFtdOwogICAgICAgICAgICBpZiAoIWlzTGlzdExpa2VJdGVyYWJsZSQxKGNvbGxlY3Rpb24pKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke3N0cmluZ2lmeShjb2xsZWN0aW9uKX0nLiBPbmx5IGFycmF5cyBhbmQgaXRlcmFibGVzIGFyZSBhbGxvd2VkYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2soY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRlc3Ryb3koKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbGxlY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNoZWNrKGNvbGxlY3Rpb24pIHsKICAgICAgICAgICAgdGhpcy5fcmVzZXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkID0gdGhpcy5faXRIZWFkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBtYXlCZURpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGluZGV4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpdGVtOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpdGVtVHJhY2tCeTsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29sbGVjdGlvbikpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDsKICAgICAgICAgICAgICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCB0aGlzLmxlbmd0aDsgaW5kZXgrKykgewogICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBjb2xsZWN0aW9uW2luZGV4XTsKICAgICAgICAgICAgICAgICAgICBpdGVtVHJhY2tCeSA9IHRoaXMuX3RyYWNrQnlGbihpbmRleCwgaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLnRyYWNrQnlJZCwgaXRlbVRyYWNrQnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX21pc21hdGNoKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5QmVEaXJ0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGNhbiB3ZSBsaW1pdCB0aGlzIHRvIGR1cGxpY2F0ZXMgb25seT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHJlY29yZCwgaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGluZGV4ID0gMDsKICAgICAgICAgICAgICAgIGl0ZXJhdGVMaXN0TGlrZSQxKGNvbGxlY3Rpb24sICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGl0ZW0pID0+IHsKICAgICAgICAgICAgICAgICAgICBpdGVtVHJhY2tCeSA9IHRoaXMuX3RyYWNrQnlGbihpbmRleCwgaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlY29yZCA9PT0gbnVsbCB8fCAhbG9vc2VJZGVudGljYWwocmVjb3JkLnRyYWNrQnlJZCwgaXRlbVRyYWNrQnkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX21pc21hdGNoKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgbWF5QmVEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF5QmVEaXJ0eSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGNhbiB3ZSBsaW1pdCB0aGlzIHRvIGR1cGxpY2F0ZXMgb25seT8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3ZlcmlmeVJlaW5zZXJ0aW9uKHJlY29yZCwgaXRlbSwgaXRlbVRyYWNrQnksIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZElkZW50aXR5Q2hhbmdlKHJlY29yZCwgaXRlbSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlY29yZCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgICAgICAgICBpbmRleCsrOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmxlbmd0aCA9IGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3RydW5jYXRlKHJlY29yZCk7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXJ0eTsKICAgICAgICB9CiAgICAgICAgLyogQ29sbGVjdGlvbkNoYW5nZXMgaXMgY29uc2lkZXJlZCBkaXJ0eSBpZiBpdCBoYXMgYW55IGFkZGl0aW9ucywgbW92ZXMsIHJlbW92YWxzLCBvciBpZGVudGl0eQogICAgICAgICAgICogY2hhbmdlcy4KICAgICAgICAgICAqLwogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGlzRGlydHkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX21vdmVzSGVhZCAhPT0gbnVsbCB8fAogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgIT09IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0IHRoZSBzdGF0ZSBvZiB0aGUgY2hhbmdlIG9iamVjdHMgdG8gc2hvdyBubyBjaGFuZ2VzLiBUaGlzIG1lYW5zIHNldCBwcmV2aW91c0tleSB0bwogICAgICAgICAqIGN1cnJlbnRLZXksIGFuZCBjbGVhciBhbGwgb2YgdGhlIHF1ZXVlcyAoYWRkaXRpb25zLCBtb3ZlcywgcmVtb3ZhbHMpLgogICAgICAgICAqIFNldCB0aGUgcHJldmlvdXNJbmRleGVzIG9mIG1vdmVkIGFuZCBhZGRlZCBpdGVtcyB0byB0aGVpciBjdXJyZW50SW5kZXhlcwogICAgICAgICAqIFJlc2V0IHRoZSBsaXN0IG9mIGFkZGl0aW9ucywgbW92ZXMgYW5kIHJlbW92YWxzCiAgICAgICAgICoKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVzZXQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgbmV4dFJlY29yZDsKICAgICAgICAgICAgICAgIGZvciAocmVjb3JkID0gdGhpcy5fcHJldmlvdXNJdEhlYWQgPSB0aGlzLl9pdEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNJbmRleCA9IHJlY29yZC5jdXJyZW50SW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7CiAgICAgICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX21vdmVzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSBuZXh0UmVjb3JkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzSW5kZXggPSByZWNvcmQuY3VycmVudEluZGV4OwogICAgICAgICAgICAgICAgICAgIG5leHRSZWNvcmQgPSByZWNvcmQuX25leHRNb3ZlZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX21vdmVzSGVhZCA9IHRoaXMuX21vdmVzVGFpbCA9IG51bGw7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSB0aGlzLl9yZW1vdmFsc1RhaWwgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzSGVhZCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc1RhaWwgPSBudWxsOwogICAgICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTogd2hlbiBhc3NlcnQgZ2V0cyBzdXBwb3J0ZWQKICAgICAgICAgICAgICAgIC8vIGFzc2VydCghdGhpcy5pc0RpcnR5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIGlzIHRoZSBjb3JlIGZ1bmN0aW9uIHdoaWNoIGhhbmRsZXMgZGlmZmVyZW5jZXMgYmV0d2VlbiBjb2xsZWN0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIC0gYHJlY29yZGAgaXMgdGhlIHJlY29yZCB3aGljaCB3ZSBzYXcgYXQgdGhpcyBwb3NpdGlvbiBsYXN0IHRpbWUuIElmIG51bGwgdGhlbiBpdCBpcyBhIG5ldwogICAgICAgICAqICAgaXRlbS4KICAgICAgICAgKiAtIGBpdGVtYCBpcyB0aGUgY3VycmVudCBpdGVtIGluIHRoZSBjb2xsZWN0aW9uCiAgICAgICAgICogLSBgaW5kZXhgIGlzIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgY29sbGVjdGlvbgogICAgICAgICAqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtVHJhY2tCeQogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9taXNtYXRjaChyZWNvcmQsIGl0ZW0sIGl0ZW1UcmFja0J5LCBpbmRleCkgewogICAgICAgICAgICAvLyBUaGUgcHJldmlvdXMgcmVjb3JkIGFmdGVyIHdoaWNoIHdlIHdpbGwgYXBwZW5kIHRoZSBjdXJyZW50IG9uZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJldmlvdXNSZWNvcmQ7CiAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHByZXZpb3VzUmVjb3JkID0gdGhpcy5faXRUYWlsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJldmlvdXNSZWNvcmQgPSByZWNvcmQuX3ByZXY7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHJlY29yZCBmcm9tIHRoZSBjb2xsZWN0aW9uIHNpbmNlIHdlIGtub3cgaXQgZG9lcyBub3QgbWF0Y2ggdGhlIGl0ZW0uCiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmUocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBdHRlbXB0IHRvIHNlZSBpZiB3ZSBoYXZlIHNlZW4gdGhlIGl0ZW0gYmVmb3JlLgogICAgICAgICAgICByZWNvcmQgPSB0aGlzLl9saW5rZWRSZWNvcmRzID09PSBudWxsID8gbnVsbCA6IHRoaXMuX2xpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5LCBpbmRleCk7CiAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgc2VlbiB0aGlzIGJlZm9yZSwgd2UgbmVlZCB0byBtb3ZlIGl0IGZvcndhcmQgaW4gdGhlIGNvbGxlY3Rpb24uCiAgICAgICAgICAgICAgICAvLyBCdXQgZmlyc3Qgd2UgbmVlZCB0byBjaGVjayBpZiBpZGVudGl0eSBjaGFuZ2VkLCBzbyB3ZSBjYW4gdXBkYXRlIGluIHZpZXcgaWYgbmVjZXNzYXJ5CiAgICAgICAgICAgICAgICBpZiAoIWxvb3NlSWRlbnRpY2FsKHJlY29yZC5pdGVtLCBpdGVtKSkKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pOwogICAgICAgICAgICAgICAgdGhpcy5fbW92ZUFmdGVyKHJlY29yZCwgcHJldmlvdXNSZWNvcmQsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5ldmVyIHNlZW4gaXQsIGNoZWNrIGV2aWN0ZWQgbGlzdC4KICAgICAgICAgICAgICAgIHJlY29yZCA9IHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCA/IG51bGwgOiB0aGlzLl91bmxpbmtlZFJlY29yZHMuZ2V0KGl0ZW1UcmFja0J5LCBudWxsKTsKICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBhbiBpdGVtIHdoaWNoIHdlIGhhdmUgZXZpY3RlZCBlYXJsaWVyOiByZWluc2VydCBpdCBiYWNrIGludG8gdGhlIGxpc3QuCiAgICAgICAgICAgICAgICAgICAgLy8gQnV0IGZpcnN0IHdlIG5lZWQgdG8gY2hlY2sgaWYgaWRlbnRpdHkgY2hhbmdlZCwgc28gd2UgY2FuIHVwZGF0ZSBpbiB2aWV3IGlmIG5lY2Vzc2FyeQogICAgICAgICAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwocmVjb3JkLml0ZW0sIGl0ZW0pKQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlaW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgYSBuZXcgaXRlbTogYWRkIGl0LgogICAgICAgICAgICAgICAgICAgIHJlY29yZCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZEFmdGVyKG5ldyBJdGVyYWJsZUNoYW5nZVJlY29yZF8oaXRlbSwgaXRlbVRyYWNrQnkpLCBwcmV2aW91c1JlY29yZCwgaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgY2hlY2sgaXMgb25seSBuZWVkZWQgaWYgYW4gYXJyYXkgY29udGFpbnMgZHVwbGljYXRlcy4gKFNob3J0IGNpcmN1aXQgb2Ygbm90aGluZyBkaXJ0eSkKICAgICAgICAgKgogICAgICAgICAqIFVzZSBjYXNlOiBgW2EsIGFdYCA9PiBgW2IsIGEsIGFdYAogICAgICAgICAqCiAgICAgICAgICogSWYgd2UgZGlkIG5vdCBoYXZlIHRoaXMgY2hlY2sgdGhlbiB0aGUgaW5zZXJ0aW9uIG9mIGBiYCB3b3VsZDoKICAgICAgICAgKiAgIDEpIGV2aWN0IGZpcnN0IGBhYAogICAgICAgICAqICAgMikgaW5zZXJ0IGBiYCBhdCBgMGAgaW5kZXguCiAgICAgICAgICogICAzKSBsZWF2ZSBgYWAgYXQgaW5kZXggYDFgIGFzIGlzLiA8LS0gdGhpcyBpcyB3cm9uZyEKICAgICAgICAgKiAgIDMpIHJlaW5zZXJ0IGBhYCBhdCBpbmRleCAyLiA8LS0gdGhpcyBpcyB3cm9uZyEKICAgICAgICAgKgogICAgICAgICAqIFRoZSBjb3JyZWN0IGJlaGF2aW9yIGlzOgogICAgICAgICAqICAgMSkgZXZpY3QgZmlyc3QgYGFgCiAgICAgICAgICogICAyKSBpbnNlcnQgYGJgIGF0IGAwYCBpbmRleC4KICAgICAgICAgKiAgIDMpIHJlaW5zZXJ0IGBhYCBhdCBpbmRleCAxLgogICAgICAgICAqICAgMykgbW92ZSBgYWAgYXQgZnJvbSBgMWAgdG8gYDJgLgogICAgICAgICAqCiAgICAgICAgICoKICAgICAgICAgKiBEb3VibGUgY2hlY2sgdGhhdCB3ZSBoYXZlIG5vdCBldmljdGVkIGEgZHVwbGljYXRlIGl0ZW0uIFdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGl0ZW0gdHlwZSBtYXkKICAgICAgICAgKiBoYXZlIGFscmVhZHkgYmVlbiByZW1vdmVkOgogICAgICAgICAqIFRoZSBpbnNlcnRpb24gb2YgYiB3aWxsIGV2aWN0IHRoZSBmaXJzdCAnYScuIElmIHdlIGRvbid0IHJlaW5zZXJ0IGl0IG5vdyBpdCB3aWxsIGJlIHJlaW5zZXJ0ZWQKICAgICAgICAgKiBhdCB0aGUgZW5kLiBXaGljaCB3aWxsIHNob3cgdXAgYXMgdGhlIHR3byAnYSdzIHN3aXRjaGluZyBwb3NpdGlvbi4gVGhpcyBpcyBpbmNvcnJlY3QsIHNpbmNlIGEKICAgICAgICAgKiBiZXR0ZXIgd2F5IHRvIHRoaW5rIG9mIGl0IGlzIGFzIGluc2VydCBvZiAnYicgcmF0aGVyIHRoZW4gc3dpdGNoICdhJyB3aXRoICdiJyBhbmQgdGhlbiBhZGQgJ2EnCiAgICAgICAgICogYXQgdGhlIGVuZC4KICAgICAgICAgKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbVRyYWNrQnkKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdmVyaWZ5UmVpbnNlcnRpb24ocmVjb3JkLCBpdGVtLCBpdGVtVHJhY2tCeSwgaW5kZXgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVpbnNlcnRSZWNvcmQgPSB0aGlzLl91bmxpbmtlZFJlY29yZHMgPT09IG51bGwgPyBudWxsIDogdGhpcy5fdW5saW5rZWRSZWNvcmRzLmdldChpdGVtVHJhY2tCeSwgbnVsbCk7CiAgICAgICAgICAgIGlmIChyZWluc2VydFJlY29yZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmVjb3JkID0gdGhpcy5fcmVpbnNlcnRBZnRlcihyZWluc2VydFJlY29yZCwgKC8qKiBAdHlwZSB7P30gKi8gKHJlY29yZC5fcHJldikpLCBpbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocmVjb3JkLmN1cnJlbnRJbmRleCAhPSBpbmRleCkgewogICAgICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRJbmRleCA9IGluZGV4OwogICAgICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgcmlkIG9mIGFueSBleGNlc3Mge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99cyBmcm9tIHRoZSBwcmV2aW91cyBjb2xsZWN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiAtIGByZWNvcmRgIFRoZSBmaXJzdCBleGNlc3Mge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99LgogICAgICAgICAqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdHJ1bmNhdGUocmVjb3JkKSB7CiAgICAgICAgICAgIC8vIEFueXRoaW5nIGFmdGVyIHRoYXQgbmVlZHMgdG8gYmUgcmVtb3ZlZDsKICAgICAgICAgICAgd2hpbGUgKHJlY29yZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmV4dFJlY29yZCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZFRvUmVtb3ZhbHModGhpcy5fdW5saW5rKHJlY29yZCkpOwogICAgICAgICAgICAgICAgcmVjb3JkID0gbmV4dFJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fdW5saW5rZWRSZWNvcmRzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMuY2xlYXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fYWRkaXRpb25zVGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fbW92ZXNUYWlsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2l0VGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faXRUYWlsLl9uZXh0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcmVtb3ZhbHNUYWlsICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmFsc1RhaWwuX25leHRSZW1vdmVkID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZSZWNvcmQKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVpbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl91bmxpbmtlZFJlY29yZHMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VubGlua2VkUmVjb3Jkcy5yZW1vdmUocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXYgPSByZWNvcmQuX3ByZXZSZW1vdmVkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHQgPSByZWNvcmQuX25leHRSZW1vdmVkOwogICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNIZWFkID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHByZXYuX25leHRSZW1vdmVkID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsID0gcHJldjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5leHQuX3ByZXZSZW1vdmVkID0gcHJldjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTsKICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX21vdmVBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KSB7CiAgICAgICAgICAgIHRoaXMuX3VubGluayhyZWNvcmQpOwogICAgICAgICAgICB0aGlzLl9pbnNlcnRBZnRlcihyZWNvcmQsIHByZXZSZWNvcmQsIGluZGV4KTsKICAgICAgICAgICAgdGhpcy5fYWRkVG9Nb3ZlcyhyZWNvcmQsIGluZGV4KTsKICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FkZEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5faW5zZXJ0QWZ0ZXIocmVjb3JkLCBwcmV2UmVjb3JkLCBpbmRleCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAgICAgLy8gYXNzZXJ0KHRoaXMuX2FkZGl0aW9uc0hlYWQgPT09IG51bGwpOwogICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAgICAgLy8gYXNzZXJ0KF9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPT09IG51bGwpOwogICAgICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dEFkZGVkID09PSBudWxsKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSB0aGlzLl9hZGRpdGlvbnNUYWlsLl9uZXh0QWRkZWQgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luc2VydEFmdGVyKHJlY29yZCwgcHJldlJlY29yZCwgaW5kZXgpIHsKICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZCAhPSBwcmV2UmVjb3JkKTsKICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dCA9PT0gbnVsbCk7CiAgICAgICAgICAgIC8vIGFzc2VydChyZWNvcmQuX3ByZXYgPT09IG51bGwpOwogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkICE9IHByZXZSZWNvcmQpOwogICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0ID09PSBudWxsKTsKICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fcHJldiA9PT0gbnVsbCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dCA9IHByZXZSZWNvcmQgPT09IG51bGwgPyB0aGlzLl9pdEhlYWQgOiBwcmV2UmVjb3JkLl9uZXh0OwogICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAvLyBhc3NlcnQobmV4dCAhPSByZWNvcmQpOwogICAgICAgICAgICAvLyBhc3NlcnQocHJldlJlY29yZCAhPSByZWNvcmQpOwogICAgICAgICAgICByZWNvcmQuX25leHQgPSBuZXh0OwogICAgICAgICAgICByZWNvcmQuX3ByZXYgPSBwcmV2UmVjb3JkOwogICAgICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faXRUYWlsID0gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dC5fcHJldiA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJldlJlY29yZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faXRIZWFkID0gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcHJldlJlY29yZC5fbmV4dCA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fbGlua2VkUmVjb3JkcyA9IG5ldyBfRHVwbGljYXRlTWFwKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5wdXQocmVjb3JkKTsKICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRJbmRleCA9IGluZGV4OwogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZW1vdmUocmVjb3JkKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRUb1JlbW92YWxzKHRoaXMuX3VubGluayhyZWNvcmQpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdW5saW5rKHJlY29yZCkgewogICAgICAgICAgICBpZiAodGhpcy5fbGlua2VkUmVjb3JkcyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fbGlua2VkUmVjb3Jkcy5yZW1vdmUocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXYgPSByZWNvcmQuX3ByZXY7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dCA9IHJlY29yZC5fbmV4dDsKICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgLy8gYXNzZXJ0KChyZWNvcmQuX3ByZXYgPSBudWxsKSA9PT0gbnVsbCk7CiAgICAgICAgICAgIC8vIGFzc2VydCgocmVjb3JkLl9uZXh0ID0gbnVsbCkgPT09IG51bGwpOwogICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faXRIZWFkID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHByZXYuX25leHQgPSBuZXh0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuZXh0ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pdFRhaWwgPSBwcmV2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgbmV4dC5fcHJldiA9IHByZXY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlY29yZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHBhcmFtIHs/fSB0b0luZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkVG9Nb3ZlcyhyZWNvcmQsIHRvSW5kZXgpIHsKICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgLy8gYXNzZXJ0KHJlY29yZC5fbmV4dE1vdmVkID09PSBudWxsKTsKICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09PSB0b0luZGV4KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9tb3Zlc1RhaWwgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgICAgICAgICAvLyBhc3NlcnQoX21vdmVzSGVhZCA9PT0gbnVsbCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwgPSB0aGlzLl9tb3Zlc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBUT0RPKHZpY2IpOgogICAgICAgICAgICAgICAgLy8gYXNzZXJ0KF9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tb3Zlc1RhaWwgPSB0aGlzLl9tb3Zlc1RhaWwuX25leHRNb3ZlZCA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkVG9SZW1vdmFscyhyZWNvcmQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3VubGlua2VkUmVjb3JkcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fdW5saW5rZWRSZWNvcmRzID0gbmV3IF9EdXBsaWNhdGVNYXAoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl91bmxpbmtlZFJlY29yZHMucHV0KHJlY29yZCk7CiAgICAgICAgICAgIHJlY29yZC5jdXJyZW50SW5kZXggPSBudWxsOwogICAgICAgICAgICByZWNvcmQuX25leHRSZW1vdmVkID0gbnVsbDsKICAgICAgICAgICAgaWYgKHRoaXMuX3JlbW92YWxzVGFpbCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNIZWFkID09PSBudWxsKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IHRoaXMuX3JlbW92YWxzSGVhZCA9IHJlY29yZDsKICAgICAgICAgICAgICAgIHJlY29yZC5fcHJldlJlbW92ZWQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gVE9ETyh2aWNiKToKICAgICAgICAgICAgICAgIC8vIGFzc2VydChfcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLl9uZXh0UmVtb3ZlZCA9PT0gbnVsbCk7CiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXZSZW1vdmVkID0gdGhpcy5fcmVtb3ZhbHNUYWlsOwogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZhbHNUYWlsID0gdGhpcy5fcmVtb3ZhbHNUYWlsLl9uZXh0UmVtb3ZlZCA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hZGRJZGVudGl0eUNoYW5nZShyZWNvcmQsIGl0ZW0pIHsKICAgICAgICAgICAgcmVjb3JkLml0ZW0gPSBpdGVtOwogICAgICAgICAgICBpZiAodGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbCA9IHRoaXMuX2lkZW50aXR5Q2hhbmdlc0hlYWQgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pZGVudGl0eUNoYW5nZXNUYWlsID0gdGhpcy5faWRlbnRpdHlDaGFuZ2VzVGFpbC5fbmV4dElkZW50aXR5Q2hhbmdlID0gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVgogICAgICovCiAgICBjbGFzcyBJdGVyYWJsZUNoYW5nZVJlY29yZF8gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAqIEBwYXJhbSB7P30gdHJhY2tCeUlkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaXRlbSwgdHJhY2tCeUlkKSB7CiAgICAgICAgICAgIHRoaXMuaXRlbSA9IGl0ZW07CiAgICAgICAgICAgIHRoaXMudHJhY2tCeUlkID0gdHJhY2tCeUlkOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRJbmRleCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucHJldmlvdXNJbmRleCA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9uZXh0UHJldmlvdXMgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcHJldiA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3ByZXZEdXAgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbmV4dER1cCA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wcmV2UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9uZXh0UmVtb3ZlZCA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9uZXh0QWRkZWQgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbmV4dE1vdmVkID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX25leHRJZGVudGl0eUNoYW5nZSA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgLy8gQSBsaW5rZWQgbGlzdCBvZiBDb2xsZWN0aW9uQ2hhbmdlUmVjb3JkcyB3aXRoIHRoZSBzYW1lIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXy5pdGVtCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKi8KICAgIGNsYXNzIF9EdXBsaWNhdGVJdGVtUmVjb3JkTGlzdCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9oZWFkID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBlbmQgdGhlIHJlY29yZCB0byB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzLgogICAgICAgICAqCiAgICAgICAgICogTm90ZTogYnkgZGVzaWduIGFsbCByZWNvcmRzIGluIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMgaG9sZCB0aGUgc2FtZSB2YWx1ZSBpbiByZWNvcmQuaXRlbS4KICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkKHJlY29yZCkgewogICAgICAgICAgICBpZiAodGhpcy5faGVhZCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IHRoaXMuX3RhaWwgPSByZWNvcmQ7CiAgICAgICAgICAgICAgICByZWNvcmQuX25leHREdXAgPSBudWxsOwogICAgICAgICAgICAgICAgcmVjb3JkLl9wcmV2RHVwID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgICAgICAgICAvLyBhc3NlcnQocmVjb3JkLml0ZW0gPT0gIF9oZWFkLml0ZW0gfHwKICAgICAgICAgICAgICAgIC8vICAgICAgIHJlY29yZC5pdGVtIGlzIG51bSAmJiByZWNvcmQuaXRlbS5pc05hTiAmJiBfaGVhZC5pdGVtIGlzIG51bSAmJiBfaGVhZC5pdGVtLmlzTmFOKTsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl90YWlsKSkuX25leHREdXAgPSByZWNvcmQ7CiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXZEdXAgPSB0aGlzLl90YWlsOwogICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0RHVwID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gUmV0dXJucyBhIEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyBoYXZpbmcgSXRlcmFibGVDaGFuZ2VSZWNvcmRfLnRyYWNrQnlJZCA9PSB0cmFja0J5SWQgYW5kCiAgICAgICAgLy8gSXRlcmFibGVDaGFuZ2VSZWNvcmRfLmN1cnJlbnRJbmRleCA+PSBhdE9yQWZ0ZXJJbmRleAogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHJhY2tCeUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBhdE9yQWZ0ZXJJbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHRyYWNrQnlJZCwgYXRPckFmdGVySW5kZXgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0RHVwKSB7CiAgICAgICAgICAgICAgICBpZiAoKGF0T3JBZnRlckluZGV4ID09PSBudWxsIHx8IGF0T3JBZnRlckluZGV4IDw9ICgvKiogQHR5cGUgez99ICovIChyZWNvcmQuY3VycmVudEluZGV4KSkpICYmCiAgICAgICAgICAgICAgICAgICAgbG9vc2VJZGVudGljYWwocmVjb3JkLnRyYWNrQnlJZCwgdHJhY2tCeUlkKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZSBvbmUge1xAbGluayBJdGVyYWJsZUNoYW5nZVJlY29yZF99IGZyb20gdGhlIGxpc3Qgb2YgZHVwbGljYXRlcy4KICAgICAgICAgKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciB0aGUgbGlzdCBvZiBkdXBsaWNhdGVzIGlzIGVtcHR5LgogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmUocmVjb3JkKSB7CiAgICAgICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgICAgIC8vIGFzc2VydCgoKSB7CiAgICAgICAgICAgIC8vICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjb3JkIGJlaW5nIHJlbW92ZWQgaXMgaW4gdGhlIGxpc3QuCiAgICAgICAgICAgIC8vICBmb3IgKEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyBjdXJzb3IgPSBfaGVhZDsgY3Vyc29yICE9IG51bGw7IGN1cnNvciA9IGN1cnNvci5fbmV4dER1cCkgewogICAgICAgICAgICAvLyAgICBpZiAoaWRlbnRpY2FsKGN1cnNvciwgcmVjb3JkKSkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIC8vICB9CiAgICAgICAgICAgIC8vICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIC8vfSk7CiAgICAgICAgICAgIC8vIFRPRE8odmljYik6CiAgICAgICAgICAgIC8vIGFzc2VydCgoKSB7CiAgICAgICAgICAgIC8vICAvLyB2ZXJpZnkgdGhhdCB0aGUgcmVjb3JkIGJlaW5nIHJlbW92ZWQgaXMgaW4gdGhlIGxpc3QuCiAgICAgICAgICAgIC8vICBmb3IgKEl0ZXJhYmxlQ2hhbmdlUmVjb3JkXyBjdXJzb3IgPSBfaGVhZDsgY3Vyc29yICE9IG51bGw7IGN1cnNvciA9IGN1cnNvci5fbmV4dER1cCkgewogICAgICAgICAgICAvLyAgICBpZiAoaWRlbnRpY2FsKGN1cnNvciwgcmVjb3JkKSkgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIC8vICB9CiAgICAgICAgICAgIC8vICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIC8vfSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldiA9IHJlY29yZC5fcHJldkR1cDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXh0ID0gcmVjb3JkLl9uZXh0RHVwOwogICAgICAgICAgICBpZiAocHJldiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5faGVhZCA9IG5leHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0RHVwID0gbmV4dDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobmV4dCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHByZXY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0Ll9wcmV2RHVwID0gcHJldjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5faGVhZCA9PT0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKi8KICAgIGNsYXNzIF9EdXBsaWNhdGVNYXAgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm1hcCA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHB1dChyZWNvcmQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXkgPSByZWNvcmQudHJhY2tCeUlkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkdXBsaWNhdGVzID0gdGhpcy5tYXAuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmICghZHVwbGljYXRlcykgewogICAgICAgICAgICAgICAgZHVwbGljYXRlcyA9IG5ldyBfRHVwbGljYXRlSXRlbVJlY29yZExpc3QoKTsKICAgICAgICAgICAgICAgIHRoaXMubWFwLnNldChrZXksIGR1cGxpY2F0ZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGR1cGxpY2F0ZXMuYWRkKHJlY29yZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlIHRoZSBgdmFsdWVgIHVzaW5nIGtleS4gQmVjYXVzZSB0aGUgSXRlcmFibGVDaGFuZ2VSZWNvcmRfIHZhbHVlIG1heSBiZSBvbmUgd2hpY2ggd2UKICAgICAgICAgKiBoYXZlIGFscmVhZHkgaXRlcmF0ZWQgb3Zlciwgd2UgdXNlIHRoZSBgYXRPckFmdGVySW5kZXhgIHRvIHByZXRlbmQgaXQgaXMgbm90IHRoZXJlLgogICAgICAgICAqCiAgICAgICAgICogVXNlIGNhc2U6IGBbYSwgYiwgYywgYSwgYV1gIGlmIHdlIGFyZSBhdCBpbmRleCBgM2Agd2hpY2ggaXMgdGhlIHNlY29uZCBgYWAgdGhlbiBhc2tpbmcgaWYgd2UKICAgICAgICAgKiBoYXZlIGFueSBtb3JlIGBhYHMgbmVlZHMgdG8gcmV0dXJuIHRoZSBzZWNvbmQgYGFgLgogICAgICAgICAqIEBwYXJhbSB7P30gdHJhY2tCeUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBhdE9yQWZ0ZXJJbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHRyYWNrQnlJZCwgYXRPckFmdGVySW5kZXgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXkgPSB0cmFja0J5SWQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVjb3JkTGlzdCA9IHRoaXMubWFwLmdldChrZXkpOwogICAgICAgICAgICByZXR1cm4gcmVjb3JkTGlzdCA/IHJlY29yZExpc3QuZ2V0KHRyYWNrQnlJZCwgYXRPckFmdGVySW5kZXgpIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIHtcQGxpbmsgSXRlcmFibGVDaGFuZ2VSZWNvcmRffSBmcm9tIHRoZSBsaXN0IG9mIGR1cGxpY2F0ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgbGlzdCBvZiBkdXBsaWNhdGVzIGFsc28gaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXAgaWYgaXQgZ2V0cyBlbXB0eS4KICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlKHJlY29yZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlY29yZC50cmFja0J5SWQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVjb3JkTGlzdCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcC5nZXQoa2V5KSkpOwogICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGxpc3Qgb2YgZHVwbGljYXRlcyB3aGVuIGl0IGdldHMgZW1wdHkKICAgICAgICAgICAgaWYgKHJlY29yZExpc3QucmVtb3ZlKHJlY29yZCkpIHsKICAgICAgICAgICAgICAgIHRoaXMubWFwLmRlbGV0ZShrZXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGlzRW1wdHkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm1hcC5zaXplID09PSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICB0aGlzLm1hcC5jbGVhcigpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgKiBAcGFyYW0gez99IGFkZFJlbW92ZU9mZnNldAogICAgICogQHBhcmFtIHs/fSBtb3ZlT2Zmc2V0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UHJldmlvdXNJbmRleChpdGVtLCBhZGRSZW1vdmVPZmZzZXQsIG1vdmVPZmZzZXRzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZpb3VzSW5kZXggPSBpdGVtLnByZXZpb3VzSW5kZXg7CiAgICAgICAgaWYgKHByZXZpb3VzSW5kZXggPT09IG51bGwpCiAgICAgICAgICAgIHJldHVybiBwcmV2aW91c0luZGV4OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbW92ZU9mZnNldCA9IDA7CiAgICAgICAgaWYgKG1vdmVPZmZzZXRzICYmIHByZXZpb3VzSW5kZXggPCBtb3ZlT2Zmc2V0cy5sZW5ndGgpIHsKICAgICAgICAgICAgbW92ZU9mZnNldCA9IG1vdmVPZmZzZXRzW3ByZXZpb3VzSW5kZXhdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcHJldmlvdXNJbmRleCArIGFkZFJlbW92ZU9mZnNldCArIG1vdmVPZmZzZXQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uL2RpZmZlcnMvZGVmYXVsdF9rZXl2YWx1ZV9kaWZmZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgSywgVgogICAgICovCiAgICBjbGFzcyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0cyhvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIE1hcCB8fCBpc0pzT2JqZWN0JDEob2JqKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIEssIFYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXIoKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBLLCBWCiAgICAgKi8KICAgIGNsYXNzIERlZmF1bHRLZXlWYWx1ZURpZmZlciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX3JlY29yZHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSBudWxsOwogICAgICAgICAgICAvLyBfYXBwZW5kQWZ0ZXIgaXMgdXNlZCBpbiB0aGUgY2hlY2sgbG9vcAogICAgICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTWFwSGVhZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZXNIZWFkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlc1RhaWwgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzVGFpbCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGlzRGlydHkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZGRpdGlvbnNIZWFkICE9PSBudWxsIHx8IHRoaXMuX2NoYW5nZXNIZWFkICE9PSBudWxsIHx8CiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgIT09IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvckVhY2hJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9tYXBIZWFkOyByZWNvcmQgIT09IG51bGw7IHJlY29yZCA9IHJlY29yZC5fbmV4dCkgewogICAgICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JFYWNoUHJldmlvdXNJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UHJldmlvdXMpIHsKICAgICAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9yRWFjaENoYW5nZWRJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICBmbihyZWNvcmQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvckVhY2hBZGRlZEl0ZW0oZm4pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb3JkOwogICAgICAgICAgICBmb3IgKHJlY29yZCA9IHRoaXMuX2FkZGl0aW9uc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgICAgIGZuKHJlY29yZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9yRWFjaFJlbW92ZWRJdGVtKGZuKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlY29yZDsKICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9yZW1vdmFsc0hlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkgewogICAgICAgICAgICAgICAgZm4ocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBtYXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpZmYobWFwKSB7CiAgICAgICAgICAgIGlmICghbWFwKSB7CiAgICAgICAgICAgICAgICBtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIShtYXAgaW5zdGFuY2VvZiBNYXAgfHwgaXNKc09iamVjdCQxKG1hcCkpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEVycm9yIHRyeWluZyB0byBkaWZmICcke3N0cmluZ2lmeShtYXApfScuIE9ubHkgbWFwcyBhbmQgb2JqZWN0cyBhcmUgYWxsb3dlZGApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoZWNrKG1hcCkgPyB0aGlzIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRlc3Ryb3koKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBDaGVjayB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbWFwIHZzIHRoZSBwcmV2aW91cy4KICAgICAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIG9wdGltaXNlZCBmb3Igd2hlbiB0aGUga2V5cyBkbyBubyBjaGFuZ2UuCiAgICAgICAgICogQHBhcmFtIHs/fSBtYXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNoZWNrKG1hcCkgewogICAgICAgICAgICB0aGlzLl9yZXNldCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpbnNlcnRCZWZvcmUgPSB0aGlzLl9tYXBIZWFkOwogICAgICAgICAgICB0aGlzLl9hcHBlbmRBZnRlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2gobWFwLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlICYmIGluc2VydEJlZm9yZS5rZXkgPT09IGtleSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX21heWJlQWRkVG9DaGFuZ2VzKGluc2VydEJlZm9yZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGVuZEFmdGVyID0gaW5zZXJ0QmVmb3JlOwogICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZSA9IGluc2VydEJlZm9yZS5fbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmQgPSB0aGlzLl9nZXRPckNyZWF0ZVJlY29yZEZvcktleShrZXksIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpbnNlcnRCZWZvcmUgPSB0aGlzLl9pbnNlcnRCZWZvcmVPckFwcGVuZChpbnNlcnRCZWZvcmUsIHJlY29yZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gSXRlbXMgcmVtYWluaW5nIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgaGF2ZSBiZWVuIGRlbGV0ZWQKICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZSkgewogICAgICAgICAgICAgICAgaWYgKGluc2VydEJlZm9yZS5fcHJldikgewogICAgICAgICAgICAgICAgICAgIGluc2VydEJlZm9yZS5fcHJldi5fbmV4dCA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmFsc0hlYWQgPSBpbnNlcnRCZWZvcmU7CiAgICAgICAgICAgICAgICBmb3IgKGxldCByZWNvcmQgPSBpbnNlcnRCZWZvcmU7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0UmVtb3ZlZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQgPT09IHRoaXMuX21hcEhlYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFwSGVhZCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlY29yZHMuZGVsZXRlKHJlY29yZC5rZXkpOwogICAgICAgICAgICAgICAgICAgIHJlY29yZC5fbmV4dFJlbW92ZWQgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgICAgIHJlY29yZC5jdXJyZW50VmFsdWUgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHJlY29yZC5fcHJldiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0ID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBNYWtlIHN1cmUgdGFpbHMgaGF2ZSBubyBuZXh0IHJlY29yZHMgZnJvbSBwcmV2aW91cyBydW5zCiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VzVGFpbCkKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZXNUYWlsLl9uZXh0Q2hhbmdlZCA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNUYWlsKQogICAgICAgICAgICAgICAgdGhpcy5fYWRkaXRpb25zVGFpbC5fbmV4dEFkZGVkID0gbnVsbDsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaXNEaXJ0eTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHJlY29yZCBiZWZvcmUgYGJlZm9yZWAgb3IgYXBwZW5kIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3Qgd2hlbiBgYmVmb3JlYCBpcyBudWxsLgogICAgICAgICAqCiAgICAgICAgICogTm90ZXM6CiAgICAgICAgICogLSBUaGlzIG1ldGhvZCBhcHBlbmRzIGF0IGB0aGlzLl9hcHBlbmRBZnRlcmAsCiAgICAgICAgICogLSBUaGlzIG1ldGhvZCB1cGRhdGVzIGB0aGlzLl9hcHBlbmRBZnRlcmAsCiAgICAgICAgICogLSBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBpbnNlcnRpb24gcG9pbnRlci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYmVmb3JlCiAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pbnNlcnRCZWZvcmVPckFwcGVuZChiZWZvcmUsIHJlY29yZCkgewogICAgICAgICAgICBpZiAoYmVmb3JlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2ID0gYmVmb3JlLl9wcmV2OwogICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0ID0gYmVmb3JlOwogICAgICAgICAgICAgICAgcmVjb3JkLl9wcmV2ID0gcHJldjsKICAgICAgICAgICAgICAgIGJlZm9yZS5fcHJldiA9IHJlY29yZDsKICAgICAgICAgICAgICAgIGlmIChwcmV2KSB7CiAgICAgICAgICAgICAgICAgICAgcHJldi5fbmV4dCA9IHJlY29yZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChiZWZvcmUgPT09IHRoaXMuX21hcEhlYWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9tYXBIZWFkID0gcmVjb3JkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIgPSBiZWZvcmU7CiAgICAgICAgICAgICAgICByZXR1cm4gYmVmb3JlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9hcHBlbmRBZnRlcikgewogICAgICAgICAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIuX25leHQgPSByZWNvcmQ7CiAgICAgICAgICAgICAgICByZWNvcmQuX3ByZXYgPSB0aGlzLl9hcHBlbmRBZnRlcjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX21hcEhlYWQgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYXBwZW5kQWZ0ZXIgPSByZWNvcmQ7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE9yQ3JlYXRlUmVjb3JkRm9yS2V5KGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3JlY29yZHMuaGFzKGtleSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9yZWNvcmRzLmdldChrZXkpKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXliZUFkZFRvQ2hhbmdlcyhyZWNvcmQsIHZhbHVlKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXYgPSByZWNvcmQuX3ByZXY7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXh0ID0gcmVjb3JkLl9uZXh0OwogICAgICAgICAgICAgICAgaWYgKHByZXYpIHsKICAgICAgICAgICAgICAgICAgICBwcmV2Ll9uZXh0ID0gbmV4dDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgbmV4dC5fcHJldiA9IHByZXY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZWNvcmQuX25leHQgPSBudWxsOwogICAgICAgICAgICAgICAgcmVjb3JkLl9wcmV2ID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWNvcmQgPSBuZXcgS2V5VmFsdWVDaGFuZ2VSZWNvcmRfKGtleSk7CiAgICAgICAgICAgIHRoaXMuX3JlY29yZHMuc2V0KGtleSwgcmVjb3JkKTsKICAgICAgICAgICAgcmVjb3JkLmN1cnJlbnRWYWx1ZSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9hZGRUb0FkZGl0aW9ucyhyZWNvcmQpOwogICAgICAgICAgICByZXR1cm4gcmVjb3JkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVzZXQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzRGlydHkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCByZWNvcmQ7CiAgICAgICAgICAgICAgICAvLyBsZXQgYF9wcmV2aW91c01hcEhlYWRgIGNvbnRhaW4gdGhlIHN0YXRlIG9mIHRoZSBtYXAgYmVmb3JlIHRoZSBjaGFuZ2VzCiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c01hcEhlYWQgPSB0aGlzLl9tYXBIZWFkOwogICAgICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9wcmV2aW91c01hcEhlYWQ7IHJlY29yZCAhPT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLl9uZXh0UHJldmlvdXMgPSByZWNvcmQuX25leHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgYHJlY29yZC5wcmV2aW91c1ZhbHVlYCB3aXRoIHRoZSB2YWx1ZSBvZiB0aGUgaXRlbSBiZWZvcmUgdGhlIGNoYW5nZXMKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXBkYXRlIGFsbCBjaGFuZ2VkIGl0ZW1zICh0aGF0J3MgdGhvc2Ugd2hpY2ggaGF2ZSBiZWVuIGFkZGVkIGFuZCBjaGFuZ2VkKQogICAgICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9jaGFuZ2VzSGVhZDsgcmVjb3JkICE9PSBudWxsOyByZWNvcmQgPSByZWNvcmQuX25leHRDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnByZXZpb3VzVmFsdWUgPSByZWNvcmQuY3VycmVudFZhbHVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChyZWNvcmQgPSB0aGlzLl9hZGRpdGlvbnNIZWFkOyByZWNvcmQgIT0gbnVsbDsgcmVjb3JkID0gcmVjb3JkLl9uZXh0QWRkZWQpIHsKICAgICAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VzSGVhZCA9IHRoaXMuX2NoYW5nZXNUYWlsID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc0hlYWQgPSB0aGlzLl9hZGRpdGlvbnNUYWlsID0gbnVsbDsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92YWxzSGVhZCA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gQWRkIHRoZSByZWNvcmQgb3IgYSBnaXZlbiBrZXkgdG8gdGhlIGxpc3Qgb2YgY2hhbmdlcyBvbmx5IHdoZW4gdGhlIHZhbHVlIGhhcyBhY3R1YWxseSBjaGFuZ2VkCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9tYXliZUFkZFRvQ2hhbmdlcyhyZWNvcmQsIG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIGlmICghbG9vc2VJZGVudGljYWwobmV3VmFsdWUsIHJlY29yZC5jdXJyZW50VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZWNvcmQucHJldmlvdXNWYWx1ZSA9IHJlY29yZC5jdXJyZW50VmFsdWU7CiAgICAgICAgICAgICAgICByZWNvcmQuY3VycmVudFZhbHVlID0gbmV3VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRUb0NoYW5nZXMocmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkVG9BZGRpdGlvbnMocmVjb3JkKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hZGRpdGlvbnNIZWFkID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRpdGlvbnNIZWFkID0gdGhpcy5fYWRkaXRpb25zVGFpbCA9IHJlY29yZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9hZGRpdGlvbnNUYWlsKSkuX25leHRBZGRlZCA9IHJlY29yZDsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZGl0aW9uc1RhaWwgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FkZFRvQ2hhbmdlcyhyZWNvcmQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZXNIZWFkID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VzSGVhZCA9IHRoaXMuX2NoYW5nZXNUYWlsID0gcmVjb3JkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NoYW5nZXNUYWlsKSkuX25leHRDaGFuZ2VkID0gcmVjb3JkOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlc1RhaWwgPSByZWNvcmQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRlbXBsYXRlIEssIFYKICAgICAgICAgKiBAcGFyYW0gez99IG9iagogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb3JFYWNoKG9iaiwgZm4pIHsKICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIE1hcCkgewogICAgICAgICAgICAgICAgb2JqLmZvckVhY2goZm4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gawogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgayA9PiBmbihvYmpba10sIGspKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBLLCBWCiAgICAgKi8KICAgIGNsYXNzIEtleVZhbHVlQ2hhbmdlUmVjb3JkXyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihrZXkpIHsKICAgICAgICAgICAgdGhpcy5rZXkgPSBrZXk7CiAgICAgICAgICAgIHRoaXMucHJldmlvdXNWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFZhbHVlID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX25leHRQcmV2aW91cyA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9uZXh0ID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3ByZXYgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbmV4dEFkZGVkID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX25leHRSZW1vdmVkID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX25leHRDaGFuZ2VkID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEEgcmVwb3NpdG9yeSBvZiBkaWZmZXJlbnQgaXRlcmFibGUgZGlmZmluZyBzdHJhdGVnaWVzIHVzZWQgYnkgTmdGb3IsIE5nQ2xhc3MsIGFuZCBvdGhlcnMuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSXRlcmFibGVEaWZmZXJzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGZhY3RvcmllcykgewogICAgICAgICAgICB0aGlzLmZhY3RvcmllcyA9IGZhY3RvcmllczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAgICAgKiBAcGFyYW0gez89fSBwYXJlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGUoZmFjdG9yaWVzLCBwYXJlbnQpIHsKICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb3BpZWQgPSBwYXJlbnQuZmFjdG9yaWVzLnNsaWNlKCk7CiAgICAgICAgICAgICAgICBmYWN0b3JpZXMgPSBmYWN0b3JpZXMuY29uY2F0KGNvcGllZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBJdGVyYWJsZURpZmZlcnMoZmFjdG9yaWVzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGFrZXMgYW4gYXJyYXkgb2Yge1xAbGluayBJdGVyYWJsZURpZmZlckZhY3Rvcnl9IGFuZCByZXR1cm5zIGEgcHJvdmlkZXIgdXNlZCB0byBleHRlbmQgdGhlCiAgICAgICAgICogaW5oZXJpdGVkIHtcQGxpbmsgSXRlcmFibGVEaWZmZXJzfSBpbnN0YW5jZSB3aXRoIHRoZSBwcm92aWRlZCBmYWN0b3JpZXMgYW5kIHJldHVybiBhIG5ldwogICAgICAgICAqIHtcQGxpbmsgSXRlcmFibGVEaWZmZXJzfSBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqICMjIyBFeGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIGV4dGVuZCBhbiBleGlzdGluZyBsaXN0IG9mIGZhY3RvcmllcywKICAgICAgICAgKiB3aGljaCB3aWxsIG9ubHkgYmUgYXBwbGllZCB0byB0aGUgaW5qZWN0b3IgZm9yIHRoaXMgY29tcG9uZW50IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgICAgICogVGhpcyBzdGVwIGlzIGFsbCB0aGF0J3MgcmVxdWlyZWQgdG8gbWFrZSBhIG5ldyB7XEBsaW5rIEl0ZXJhYmxlRGlmZmVyfSBhdmFpbGFibGUuCiAgICAgICAgICoKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBcQENvbXBvbmVudCh7CiAgICAgICAgICogICB2aWV3UHJvdmlkZXJzOiBbCiAgICAgICAgICogICAgIEl0ZXJhYmxlRGlmZmVycy5leHRlbmQoW25ldyBJbW11dGFibGVMaXN0RGlmZmVyKCldKQogICAgICAgICAqICAgXQogICAgICAgICAqIH0pCiAgICAgICAgICogYGBgCiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBleHRlbmQoZmFjdG9yaWVzKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBwcm92aWRlOiBJdGVyYWJsZURpZmZlcnMsCiAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHBhcmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghcGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFR5cGljYWxseSB3b3VsZCBvY2N1ciB3aGVuIGNhbGxpbmcgSXRlcmFibGVEaWZmZXJzLmV4dGVuZCBpbnNpZGUgb2YgZGVwZW5kZW5jaWVzIHBhc3NlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyBib290c3RyYXAoKSwgd2hpY2ggd291bGQgb3ZlcnJpZGUgZGVmYXVsdCBwaXBlcyBpbnN0ZWFkIG9mIGV4dGVuZGluZyB0aGVtLgogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0Nhbm5vdCBleHRlbmQgSXRlcmFibGVEaWZmZXJzIHdpdGhvdXQgYSBwYXJlbnQgaW5qZWN0b3InKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEl0ZXJhYmxlRGlmZmVycy5jcmVhdGUoZmFjdG9yaWVzLCBwYXJlbnQpOwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgICAgICAvLyBEZXBlbmRlbmN5IHRlY2huaWNhbGx5IGlzbid0IG9wdGlvbmFsLCBidXQgd2UgY2FuIHByb3ZpZGUgYSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSB0aGlzIHdheS4KICAgICAgICAgICAgICAgIGRlcHM6IFtbSXRlcmFibGVEaWZmZXJzLCBuZXcgU2tpcFNlbGYoKSwgbmV3IE9wdGlvbmFsKCldXQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGl0ZXJhYmxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmaW5kKGl0ZXJhYmxlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmFjdG9yeSA9IHRoaXMuZmFjdG9yaWVzLmZpbmQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGYKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPT4gZi5zdXBwb3J0cyhpdGVyYWJsZSkpKTsKICAgICAgICAgICAgaWYgKGZhY3RvcnkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGEgZGlmZmVyIHN1cHBvcnRpbmcgb2JqZWN0ICcke2l0ZXJhYmxlfScgb2YgdHlwZSAnJHtnZXRUeXBlTmFtZUZvckRlYnVnZ2luZyhpdGVyYWJsZSl9J2ApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBJdGVyYWJsZURpZmZlcnMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoewogICAgICAgIHRva2VuOiBJdGVyYWJsZURpZmZlcnMsCiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IG5ldyBJdGVyYWJsZURpZmZlcnMoW25ldyBEZWZhdWx0SXRlcmFibGVEaWZmZXJGYWN0b3J5KCldKSkKICAgIH0pOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFR5cGVOYW1lRm9yRGVidWdnaW5nKHR5cGUpIHsKICAgICAgICByZXR1cm4gdHlwZVsnbmFtZSddIHx8IHR5cGVvZiB0eXBlOwogICAgfQogICAgLyoqCiAgICAgKiBBIHJlcG9zaXRvcnkgb2YgZGlmZmVyZW50IE1hcCBkaWZmaW5nIHN0cmF0ZWdpZXMgdXNlZCBieSBOZ0NsYXNzLCBOZ1N0eWxlLCBhbmQgb3RoZXJzLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEtleVZhbHVlRGlmZmVycyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihmYWN0b3JpZXMpIHsKICAgICAgICAgICAgdGhpcy5mYWN0b3JpZXMgPSBmYWN0b3JpZXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBTCiAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3JpZXMKICAgICAgICAgKiBAcGFyYW0gez89fSBwYXJlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjcmVhdGUoZmFjdG9yaWVzLCBwYXJlbnQpIHsKICAgICAgICAgICAgaWYgKHBhcmVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29waWVkID0gcGFyZW50LmZhY3Rvcmllcy5zbGljZSgpOwogICAgICAgICAgICAgICAgZmFjdG9yaWVzID0gZmFjdG9yaWVzLmNvbmNhdChjb3BpZWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgS2V5VmFsdWVEaWZmZXJzKGZhY3Rvcmllcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRha2VzIGFuIGFycmF5IG9mIHtcQGxpbmsgS2V5VmFsdWVEaWZmZXJGYWN0b3J5fSBhbmQgcmV0dXJucyBhIHByb3ZpZGVyIHVzZWQgdG8gZXh0ZW5kIHRoZQogICAgICAgICAqIGluaGVyaXRlZCB7XEBsaW5rIEtleVZhbHVlRGlmZmVyc30gaW5zdGFuY2Ugd2l0aCB0aGUgcHJvdmlkZWQgZmFjdG9yaWVzIGFuZCByZXR1cm4gYSBuZXcKICAgICAgICAgKiB7XEBsaW5rIEtleVZhbHVlRGlmZmVyc30gaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgRXhhbXBsZQogICAgICAgICAqCiAgICAgICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBleHRlbmQgYW4gZXhpc3RpbmcgbGlzdCBvZiBmYWN0b3JpZXMsCiAgICAgICAgICogd2hpY2ggd2lsbCBvbmx5IGJlIGFwcGxpZWQgdG8gdGhlIGluamVjdG9yIGZvciB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIGNoaWxkcmVuLgogICAgICAgICAqIFRoaXMgc3RlcCBpcyBhbGwgdGhhdCdzIHJlcXVpcmVkIHRvIG1ha2UgYSBuZXcge1xAbGluayBLZXlWYWx1ZURpZmZlcn0gYXZhaWxhYmxlLgogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICogXEBDb21wb25lbnQoewogICAgICAgICAqICAgdmlld1Byb3ZpZGVyczogWwogICAgICAgICAqICAgICBLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kKFtuZXcgSW1tdXRhYmxlTWFwRGlmZmVyKCldKQogICAgICAgICAqICAgXQogICAgICAgICAqIH0pCiAgICAgICAgICogYGBgCiAgICAgICAgICogQHRlbXBsYXRlIFMKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcmllcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGV4dGVuZChmYWN0b3JpZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IEtleVZhbHVlRGlmZmVycywKICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocGFyZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwaWNhbGx5IHdvdWxkIG9jY3VyIHdoZW4gY2FsbGluZyBLZXlWYWx1ZURpZmZlcnMuZXh0ZW5kIGluc2lkZSBvZiBkZXBlbmRlbmNpZXMgcGFzc2VkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGJvb3RzdHJhcCgpLCB3aGljaCB3b3VsZCBvdmVycmlkZSBkZWZhdWx0IHBpcGVzIGluc3RlYWQgb2YgZXh0ZW5kaW5nIHRoZW0uCiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGV4dGVuZCBLZXlWYWx1ZURpZmZlcnMgd2l0aG91dCBhIHBhcmVudCBpbmplY3RvcicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gS2V5VmFsdWVEaWZmZXJzLmNyZWF0ZShmYWN0b3JpZXMsIHBhcmVudCk7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgIC8vIERlcGVuZGVuY3kgdGVjaG5pY2FsbHkgaXNuJ3Qgb3B0aW9uYWwsIGJ1dCB3ZSBjYW4gcHJvdmlkZSBhIGJldHRlciBlcnJvciBtZXNzYWdlIHRoaXMgd2F5LgogICAgICAgICAgICAgICAgZGVwczogW1tLZXlWYWx1ZURpZmZlcnMsIG5ldyBTa2lwU2VsZigpLCBuZXcgT3B0aW9uYWwoKV1dCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30ga3YKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmQoa3YpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmYWN0b3J5ID0gdGhpcy5mYWN0b3JpZXMuZmluZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZiA9PiBmLnN1cHBvcnRzKGt2KSkpOwogICAgICAgICAgICBpZiAoZmFjdG9yeSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhY3Rvcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHtrdn0nYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBLZXlWYWx1ZURpZmZlcnMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoewogICAgICAgIHRva2VuOiBLZXlWYWx1ZURpZmZlcnMsCiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IG5ldyBLZXlWYWx1ZURpZmZlcnMoW25ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5KCldKSkKICAgIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY2hhbmdlX2RldGVjdGlvbi9jaGFuZ2VfZGV0ZWN0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogU3RydWN0dXJhbCBkaWZmaW5nIGZvciBgT2JqZWN0YHMgYW5kIGBNYXBgcy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBrZXlWYWxEaWZmID0gW25ldyBEZWZhdWx0S2V5VmFsdWVEaWZmZXJGYWN0b3J5KCldOwogICAgLyoqCiAgICAgKiBTdHJ1Y3R1cmFsIGRpZmZpbmcgZm9yIGBJdGVyYWJsZWAgdHlwZXMgc3VjaCBhcyBgQXJyYXlgcy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBpdGVyYWJsZURpZmYgPSBbbmV3IERlZmF1bHRJdGVyYWJsZURpZmZlckZhY3RvcnkoKV07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBkZWZhdWx0SXRlcmFibGVEaWZmZXJzID0gbmV3IEl0ZXJhYmxlRGlmZmVycyhpdGVyYWJsZURpZmYpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZGVmYXVsdEtleVZhbHVlRGlmZmVycyA9IG5ldyBLZXlWYWx1ZURpZmZlcnMoa2V5VmFsRGlmZik7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvdGVtcGxhdGVfcmVmLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUmVwcmVzZW50cyBhbiBlbWJlZGRlZCB0ZW1wbGF0ZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGluc3RhbnRpYXRlIGVtYmVkZGVkIHZpZXdzLgogICAgICogVG8gaW5zdGFudGlhdGUgZW1iZWRkZWQgdmlld3MgYmFzZWQgb24gYSB0ZW1wbGF0ZSwgdXNlIHRoZSBgVmlld0NvbnRhaW5lclJlZmAKICAgICAqIG1ldGhvZCBgY3JlYXRlRW1iZWRkZWRWaWV3KClgLgogICAgICoKICAgICAqIEFjY2VzcyBhIGBUZW1wbGF0ZVJlZmAgaW5zdGFuY2UgYnkgcGxhY2luZyBhIGRpcmVjdGl2ZSBvbiBhbiBgPG5nLXRlbXBsYXRlPmAKICAgICAqIGVsZW1lbnQgKG9yIGRpcmVjdGl2ZSBwcmVmaXhlZCB3aXRoIGAqYCkuIFRoZSBgVGVtcGxhdGVSZWZgIGZvciB0aGUgZW1iZWRkZWQgdmlldwogICAgICogaXMgaW5qZWN0ZWQgaW50byB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGRpcmVjdGl2ZSwKICAgICAqIHVzaW5nIHRoZSBgVGVtcGxhdGVSZWZgIHRva2VuLgogICAgICoKICAgICAqIFlvdSBjYW4gYWxzbyB1c2UgYSBgUXVlcnlgIHRvIGZpbmQgYSBgVGVtcGxhdGVSZWZgIGFzc29jaWF0ZWQgd2l0aAogICAgICogYSBjb21wb25lbnQgb3IgYSBkaXJlY3RpdmUuCiAgICAgKgogICAgICogQHNlZSBgVmlld0NvbnRhaW5lclJlZmAKICAgICAqIEBzZWUgW05hdmlnYXRlIHRoZSBDb21wb25lbnQgVHJlZSB3aXRoIERJXShndWlkZS9kZXBlbmRlbmN5LWluamVjdGlvbi1uYXZ0cmVlKQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqIEB0ZW1wbGF0ZSBDCiAgICAgKi8KICAgIGNsYXNzIFRlbXBsYXRlUmVmIHsKICAgIH0KICAgIC8qKgogICAgICogXEBpbnRlcm5hbAogICAgICogQG5vY29sbGFwc2UKICAgICAqLwogICAgVGVtcGxhdGVSZWYuX19OR19FTEVNRU5UX0lEX18gPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUlkoVGVtcGxhdGVSZWYsIEVsZW1lbnRSZWYpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNXSVRDSF9URU1QTEFURV9SRUZfRkFDVE9SWV9fUE9TVF9SM19fID0gaW5qZWN0VGVtcGxhdGVSZWY7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUlkgPSBTV0lUQ0hfVEVNUExBVEVfUkVGX0ZBQ1RPUllfX1BPU1RfUjNfXzsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci92aWV3X2NvbnRhaW5lcl9yZWYudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBSZXByZXNlbnRzIGEgY29udGFpbmVyIHdoZXJlIG9uZSBvciBtb3JlIHZpZXdzIGNhbiBiZSBhdHRhY2hlZCB0byBhIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBDYW4gY29udGFpbiAqaG9zdCB2aWV3cyogKGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyBhCiAgICAgKiBjb21wb25lbnQgd2l0aCB0aGUgYGNyZWF0ZUNvbXBvbmVudCgpYCBtZXRob2QpLCBhbmQgKmVtYmVkZGVkIHZpZXdzKgogICAgICogKGNyZWF0ZWQgYnkgaW5zdGFudGlhdGluZyBhIGBUZW1wbGF0ZVJlZmAgd2l0aCB0aGUgYGNyZWF0ZUVtYmVkZGVkVmlldygpYCBtZXRob2QpLgogICAgICoKICAgICAqIEEgdmlldyBjb250YWluZXIgaW5zdGFuY2UgY2FuIGNvbnRhaW4gb3RoZXIgdmlldyBjb250YWluZXJzLAogICAgICogY3JlYXRpbmcgYSBbdmlldyBoaWVyYXJjaHldKGd1aWRlL2dsb3NzYXJ5I3ZpZXctdHJlZSkuCiAgICAgKgogICAgICogQHNlZSBgQ29tcG9uZW50UmVmYAogICAgICogQHNlZSBgRW1iZWRkZWRWaWV3UmVmYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgVmlld0NvbnRhaW5lclJlZiB7CiAgICB9CiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEBub2NvbGxhcHNlCiAgICAgKi8KICAgIFZpZXdDb250YWluZXJSZWYuX19OR19FTEVNRU5UX0lEX18gPSAoLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiBTV0lUQ0hfVklFV19DT05UQUlORVJfUkVGX0ZBQ1RPUlkoVmlld0NvbnRhaW5lclJlZiwgRWxlbWVudFJlZikpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1dJVENIX1ZJRVdfQ09OVEFJTkVSX1JFRl9GQUNUT1JZX19QT1NUX1IzX18gPSBpbmplY3RWaWV3Q29udGFpbmVyUmVmOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1dJVENIX1ZJRVdfQ09OVEFJTkVSX1JFRl9GQUNUT1JZID0gU1dJVENIX1ZJRVdfQ09OVEFJTkVSX1JFRl9GQUNUT1JZX19QT1NUX1IzX187CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfdG9rZW5LZXlDYWNoZSA9IG5ldyBNYXAoKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdG9rZW5LZXkodG9rZW4pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGtleSA9IF90b2tlbktleUNhY2hlLmdldCh0b2tlbik7CiAgICAgICAgaWYgKCFrZXkpIHsKICAgICAgICAgICAga2V5ID0gc3RyaW5naWZ5KHRva2VuKSArICdfJyArIF90b2tlbktleUNhY2hlLnNpemU7CiAgICAgICAgICAgIF90b2tlbktleUNhY2hlLnNldCh0b2tlbiwga2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEluamVjdG9yUmVmVG9rZW5LZXkgPSB0b2tlbktleShJbmplY3Rvcik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBJTkpFQ1RPUlJlZlRva2VuS2V5ID0gdG9rZW5LZXkoSU5KRUNUT1IpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTmdNb2R1bGVSZWZUb2tlbktleSA9IHRva2VuS2V5KE5nTW9kdWxlUmVmKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3ZpZXcvcHJvdmlkZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUmVuZGVyZXIyVG9rZW5LZXkgPSB0b2tlbktleShSZW5kZXJlcjIpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRWxlbWVudFJlZlRva2VuS2V5ID0gdG9rZW5LZXkoRWxlbWVudFJlZik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBWaWV3Q29udGFpbmVyUmVmVG9rZW5LZXkgPSB0b2tlbktleShWaWV3Q29udGFpbmVyUmVmKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFRlbXBsYXRlUmVmVG9rZW5LZXkgPSB0b2tlbktleShUZW1wbGF0ZVJlZik7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDaGFuZ2VEZXRlY3RvclJlZlRva2VuS2V5ID0gdG9rZW5LZXkoQ2hhbmdlRGV0ZWN0b3JSZWYpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSW5qZWN0b3JSZWZUb2tlbktleSQxID0gdG9rZW5LZXkoSW5qZWN0b3IpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSU5KRUNUT1JSZWZUb2tlbktleSQxID0gdG9rZW5LZXkoSU5KRUNUT1IpOwogICAgLy8gVGhpcyBkZWZhdWx0IHZhbHVlIGlzIHdoZW4gY2hlY2tpbmcgdGhlIGhpZXJhcmNoeSBmb3IgYSB0b2tlbi4KICAgIC8vCiAgICAvLyBJdCBtZWFucyBib3RoOgogICAgLy8gLSB0aGUgdG9rZW4gaXMgbm90IHByb3ZpZGVkIGJ5IHRoZSBjdXJyZW50IGluamVjdG9yLAogICAgLy8gLSBvbmx5IHRoZSBlbGVtZW50IGluamVjdG9ycyBzaG91bGQgYmUgY2hlY2tlZCAoaWUgZG8gbm90IGNoZWNrIG1vZHVsZSBpbmplY3RvcnMKICAgIC8vCiAgICAvLyAgICAgICAgICBtb2QxCiAgICAvLyAgICAgICAgIC8KICAgIC8vICAgICAgIGVsMSAgIG1vZDIKICAgIC8vICAgICAgICAgXCAgLwogICAgLy8gICAgICAgICBlbDIKICAgIC8vCiAgICAvLyBXaGVuIHJlcXVlc3RpbmcgZWwyLmluamVjdG9yLmdldCh0b2tlbiksIHdlIHNob3VsZCBjaGVjayBpbiB0aGUgZm9sbG93aW5nIG9yZGVyIGFuZCByZXR1cm4gdGhlCiAgICAvLyBmaXJzdCBmb3VuZCB2YWx1ZToKICAgIC8vIC0gZWwyLmluamVjdG9yLmdldCh0b2tlbiwgZGVmYXVsdCkKICAgIC8vIC0gZWwxLmluamVjdG9yLmdldCh0b2tlbiwgTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUikgLT4gZG8gbm90IGNoZWNrIHRoZSBtb2R1bGUKICAgIC8vIC0gbW9kMi5pbmplY3Rvci5nZXQodG9rZW4sIGRlZmF1bHQpCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SID0ge307CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2NvbXBvbmVudF9yZWYudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyJDEgZXh0ZW5kcyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlIFRoZSBOZ01vZHVsZVJlZiB0byB3aGljaCBhbGwgcmVzb2x2ZWQgZmFjdG9yaWVzIGFyZSBib3VuZC4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihuZ01vZHVsZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLm5nTW9kdWxlID0gbmdNb2R1bGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudCkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0Q29tcG9uZW50VHlwZShjb21wb25lbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXRDb21wb25lbnREZWYoY29tcG9uZW50KSkpOwogICAgICAgICAgICByZXR1cm4gbmV3IENvbXBvbmVudEZhY3RvcnkkMShjb21wb25lbnREZWYsIHRoaXMubmdNb2R1bGUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtYXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvUmVmQXJyYXkobWFwKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFycmF5ID0gW107CiAgICAgICAgZm9yIChsZXQgbm9uTWluaWZpZWQgaW4gbWFwKSB7CiAgICAgICAgICAgIGlmIChtYXAuaGFzT3duUHJvcGVydHkobm9uTWluaWZpZWQpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtaW5pZmllZCA9IG1hcFtub25NaW5pZmllZF07CiAgICAgICAgICAgICAgICBhcnJheS5wdXNoKHsgcHJvcE5hbWU6IG1pbmlmaWVkLCB0ZW1wbGF0ZU5hbWU6IG5vbk1pbmlmaWVkIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50TmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TmFtZXNwYWNlJDEoZWxlbWVudE5hbWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmFtZSA9IGVsZW1lbnROYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgcmV0dXJuIG5hbWUgPT09ICdzdmcnID8gU1ZHX05BTUVTUEFDRSA6IChuYW1lID09PSAnbWF0aCcgPyBNQVRIX01MX05BTUVTUEFDRSA6IG51bGwpOwogICAgfQogICAgLyoqCiAgICAgKiBBIGNoYW5nZSBkZXRlY3Rpb24gc2NoZWR1bGVyIHRva2VuIGZvciB7XEBsaW5rIFJvb3RDb250ZXh0fS4gVGhpcyB0b2tlbiBpcyB0aGUgZGVmYXVsdCB2YWx1ZSB1c2VkCiAgICAgKiBmb3IgdGhlIGRlZmF1bHQgYFJvb3RDb250ZXh0YCBmb3VuZCBpbiB0aGUge1xAbGluayBST09UX0NPTlRFWFR9IHRva2VuLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFNDSEVEVUxFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignU0NIRURVTEVSX1RPS0VOJywgewogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBkZWZhdWx0U2NoZWR1bGVyKSwKICAgIH0pOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJvb3RWaWV3SW5qZWN0b3IKICAgICAqIEBwYXJhbSB7P30gbW9kdWxlSW5qZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUNoYWluZWRJbmplY3Rvcihyb290Vmlld0luamVjdG9yLCBtb2R1bGVJbmplY3RvcikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGdldDogKC8qKgogICAgICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IG5vdEZvdW5kVmFsdWUKICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gZmxhZ3MKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgZmxhZ3MpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcm9vdFZpZXdJbmplY3Rvci5nZXQodG9rZW4sICgvKiogQHR5cGUgez99ICovIChOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKSksIGZsYWdzKTsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPT0gTk9UX0ZPVU5EX0NIRUNLX09OTFlfRUxFTUVOVF9JTkpFQ1RPUiB8fAogICAgICAgICAgICAgICAgICAgIG5vdEZvdW5kVmFsdWUgPT09IE5PVF9GT1VORF9DSEVDS19PTkxZX0VMRU1FTlRfSU5KRUNUT1IpIHsKICAgICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHZhbHVlIGZyb20gdGhlIHJvb3QgZWxlbWVudCBpbmplY3RvciB3aGVuCiAgICAgICAgICAgICAgICAgICAgLy8gLSBpdCBwcm92aWRlcyBpdAogICAgICAgICAgICAgICAgICAgIC8vICAgKHZhbHVlICE9PSBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKQogICAgICAgICAgICAgICAgICAgIC8vIC0gdGhlIG1vZHVsZSBpbmplY3RvciBzaG91bGQgbm90IGJlIGNoZWNrZWQKICAgICAgICAgICAgICAgICAgICAvLyAgIChub3RGb3VuZFZhbHVlID09PSBOT1RfRk9VTkRfQ0hFQ0tfT05MWV9FTEVNRU5UX0lOSkVDVE9SKQogICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGVJbmplY3Rvci5nZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUsIGZsYWdzKTsKICAgICAgICAgICAgfSkKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBSZW5kZXIzIGltcGxlbWVudGF0aW9uIG9mIHtcQGxpbmsgdmlld0VuZ2luZV9Db21wb25lbnRGYWN0b3J5fS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIENvbXBvbmVudEZhY3RvcnkkMSBleHRlbmRzIENvbXBvbmVudEZhY3RvcnkgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50RGVmIFRoZSBjb21wb25lbnQgZGVmaW5pdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez89fSBuZ01vZHVsZSBUaGUgTmdNb2R1bGVSZWYgdG8gd2hpY2ggdGhlIGZhY3RvcnkgaXMgYm91bmQuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29tcG9uZW50RGVmLCBuZ01vZHVsZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLmNvbXBvbmVudERlZiA9IGNvbXBvbmVudERlZjsKICAgICAgICAgICAgdGhpcy5uZ01vZHVsZSA9IG5nTW9kdWxlOwogICAgICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGUgPSBjb21wb25lbnREZWYudHlwZTsKICAgICAgICAgICAgdGhpcy5zZWxlY3RvciA9IHN0cmluZ2lmeUNTU1NlbGVjdG9yTGlzdChjb21wb25lbnREZWYuc2VsZWN0b3JzKTsKICAgICAgICAgICAgdGhpcy5uZ0NvbnRlbnRTZWxlY3RvcnMgPQogICAgICAgICAgICAgICAgY29tcG9uZW50RGVmLm5nQ29udGVudFNlbGVjdG9ycyA/IGNvbXBvbmVudERlZi5uZ0NvbnRlbnRTZWxlY3RvcnMgOiBbXTsKICAgICAgICAgICAgdGhpcy5pc0JvdW5kVG9Nb2R1bGUgPSAhIW5nTW9kdWxlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBpbnB1dHMoKSB7CiAgICAgICAgICAgIHJldHVybiB0b1JlZkFycmF5KHRoaXMuY29tcG9uZW50RGVmLmlucHV0cyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG91dHB1dHMoKSB7CiAgICAgICAgICAgIHJldHVybiB0b1JlZkFycmF5KHRoaXMuY29tcG9uZW50RGVmLm91dHB1dHMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yCiAgICAgICAgICogQHBhcmFtIHs/PX0gcHJvamVjdGFibGVOb2RlcwogICAgICAgICAqIEBwYXJhbSB7Pz19IHJvb3RTZWxlY3Rvck9yTm9kZQogICAgICAgICAqIEBwYXJhbSB7Pz19IG5nTW9kdWxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGUoaW5qZWN0b3IsIHByb2plY3RhYmxlTm9kZXMsIHJvb3RTZWxlY3Rvck9yTm9kZSwgbmdNb2R1bGUpIHsKICAgICAgICAgICAgbmdNb2R1bGUgPSBuZ01vZHVsZSB8fCB0aGlzLm5nTW9kdWxlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3RWaWV3SW5qZWN0b3IgPSBuZ01vZHVsZSA/IGNyZWF0ZUNoYWluZWRJbmplY3RvcihpbmplY3RvciwgbmdNb2R1bGUuaW5qZWN0b3IpIDogaW5qZWN0b3I7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVuZGVyZXJGYWN0b3J5ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJvb3RWaWV3SW5qZWN0b3IuZ2V0KFJlbmRlcmVyRmFjdG9yeTIsIGRvbVJlbmRlcmVyRmFjdG9yeTMpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVyID0gcm9vdFZpZXdJbmplY3Rvci5nZXQoU2FuaXRpemVyLCBudWxsKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBob3N0UmVuZGVyZXIgPSByZW5kZXJlckZhY3RvcnkuY3JlYXRlUmVuZGVyZXIobnVsbCwgdGhpcy5jb21wb25lbnREZWYpOwogICAgICAgICAgICAvLyBEZXRlcm1pbmUgYSB0YWcgbmFtZSB1c2VkIGZvciBjcmVhdGluZyBob3N0IGVsZW1lbnRzIHdoZW4gdGhpcyBjb21wb25lbnQgaXMgY3JlYXRlZAogICAgICAgICAgICAvLyBkeW5hbWljYWxseS4gRGVmYXVsdCB0byAnZGl2JyBpZiB0aGlzIGNvbXBvbmVudCBkaWQgbm90IHNwZWNpZnkgYW55IHRhZyBuYW1lIGluIGl0cyBzZWxlY3Rvci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50TmFtZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLmNvbXBvbmVudERlZi5zZWxlY3RvcnNbMF1bMF0pKSB8fCAnZGl2JzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBob3N0Uk5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgPwogICAgICAgICAgICAgICAgbG9jYXRlSG9zdEVsZW1lbnQoaG9zdFJlbmRlcmVyLCByb290U2VsZWN0b3JPck5vZGUsIHRoaXMuY29tcG9uZW50RGVmLmVuY2Fwc3VsYXRpb24pIDoKICAgICAgICAgICAgICAgIGVsZW1lbnRDcmVhdGUoZWxlbWVudE5hbWUsIHJlbmRlcmVyRmFjdG9yeS5jcmVhdGVSZW5kZXJlcihudWxsLCB0aGlzLmNvbXBvbmVudERlZiksIGdldE5hbWVzcGFjZSQxKGVsZW1lbnROYW1lKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdEZsYWdzID0gdGhpcy5jb21wb25lbnREZWYub25QdXNoID8gNjQgLyogRGlydHkgKi8gfCA1MTIgLyogSXNSb290ICovIDoKICAgICAgICAgICAgICAgIDE2IC8qIENoZWNrQWx3YXlzICovIHwgNTEyIC8qIElzUm9vdCAqLzsKICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIENvbXBvbmVudCBuZWVkcyB0byBiZSBpc29sYXRlZCBmcm9tIG90aGVyIGNvbXBvbmVudHMsIGkuZS4gd2hldGhlciBpdAogICAgICAgICAgICAvLyBzaG91bGQgYmUgcGxhY2VkIGludG8gaXRzIG93biAoZW1wdHkpIHJvb3QgY29udGV4dCBvciBleGlzdGluZyByb290IGNvbnRleHQgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgaXMgaW50ZXJuYWwtb25seSBjb252ZW50aW9uIGFuZCBtaWdodCBjaGFuZ2UgaW4gdGhlIGZ1dHVyZSwgc28gaXQgc2hvdWxkIG5vdCBiZQogICAgICAgICAgICAvLyByZWxpZWQgdXBvbiBleHRlcm5hbGx5LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzSXNvbGF0ZWQgPSB0eXBlb2Ygcm9vdFNlbGVjdG9yT3JOb2RlID09PSAnc3RyaW5nJyAmJgogICAgICAgICAgICAgICAgL14jcm9vdC1uZy1pbnRlcm5hbC1pc29sYXRlZC1cZCsvLnRlc3Qocm9vdFNlbGVjdG9yT3JOb2RlKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByb290Q29udGV4dCA9IGNyZWF0ZVJvb3RDb250ZXh0KCk7CiAgICAgICAgICAgIC8vIENyZWF0ZSB0aGUgcm9vdCB2aWV3LiBVc2VzIGVtcHR5IFRWaWV3IGFuZCBDb250ZW50VGVtcGxhdGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdFRWaWV3ID0gY3JlYXRlVFZpZXcoMCAvKiBSb290ICovLCAtMSwgbnVsbCwgMSwgMCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdExWaWV3ID0gY3JlYXRlTFZpZXcobnVsbCwgcm9vdFRWaWV3LCByb290Q29udGV4dCwgcm9vdEZsYWdzLCBudWxsLCBudWxsLCByZW5kZXJlckZhY3RvcnksIGhvc3RSZW5kZXJlciwgc2FuaXRpemVyLCByb290Vmlld0luamVjdG9yKTsKICAgICAgICAgICAgLy8gcm9vdFZpZXcgaXMgdGhlIHBhcmVudCB3aGVuIGJvb3RzdHJhcHBpbmcKICAgICAgICAgICAgLy8gVE9ETyhtaXNrbyk6IGl0IGxvb2tzIGxpa2Ugd2UgYXJlIGVudGVyaW5nIHZpZXcgaGVyZSBidXQgd2UgZG9uJ3QgcmVhbGx5IG5lZWQgdG8gYXMKICAgICAgICAgICAgLy8gYHJlbmRlclZpZXdgIGRvZXMgdGhhdC4gSG93ZXZlciBhcyB0aGUgY29kZSBpcyB3cml0dGVuIGl0IGlzIG5lZWRlZCBiZWNhdXNlCiAgICAgICAgICAgIC8vIGBjcmVhdGVSb290Q29tcG9uZW50Vmlld2AgYW5kIGBjcmVhdGVSb290Q29tcG9uZW50YCBib3RoIHJlYWQgZ2xvYmFsIHN0YXRlLiBGaXhpbmcgdGhvc2UKICAgICAgICAgICAgLy8gaXNzdWVzIHdvdWxkIGFsbG93IHVzIHRvIGRyb3AgdGhpcy4KICAgICAgICAgICAgZW50ZXJWaWV3KHJvb3RMVmlldywgbnVsbCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbXBvbmVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdEVsZW1lbnROb2RlOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29tcG9uZW50VmlldyA9IGNyZWF0ZVJvb3RDb21wb25lbnRWaWV3KGhvc3RSTm9kZSwgdGhpcy5jb21wb25lbnREZWYsIHJvb3RMVmlldywgcmVuZGVyZXJGYWN0b3J5LCBob3N0UmVuZGVyZXIpOwogICAgICAgICAgICAgICAgaWYgKGhvc3RSTm9kZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChyb290U2VsZWN0b3JPck5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VXBBdHRyaWJ1dGVzKGhvc3RSZW5kZXJlciwgaG9zdFJOb2RlLCBbJ25nLXZlcnNpb24nLCBWRVJTSU9OLmZ1bGxdKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIGhvc3QgZWxlbWVudCBpcyBjcmVhdGVkIGFzIGEgcGFydCBvZiB0aGlzIGZ1bmN0aW9uIGNhbGwgKGkuZS4gYHJvb3RTZWxlY3Rvck9yTm9kZWAKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IGRlZmluZWQpLCBhbHNvIGFwcGx5IGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgZXh0cmFjdGVkIGZyb20gY29tcG9uZW50IHNlbGVjdG9yLgogICAgICAgICAgICAgICAgICAgICAgICAvLyBFeHRyYWN0IGF0dHJpYnV0ZXMgYW5kIGNsYXNzZXMgZnJvbSB0aGUgZmlyc3Qgc2VsZWN0b3Igb25seSB0byBtYXRjaCBWRSBiZWhhdmlvci4KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBhdHRycywgY2xhc3NlcyB9ID0gZXh0cmFjdEF0dHJzQW5kQ2xhc3Nlc0Zyb21TZWxlY3Rvcih0aGlzLmNvbXBvbmVudERlZi5zZWxlY3RvcnNbMF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXR0cnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFVwQXR0cmlidXRlcyhob3N0UmVuZGVyZXIsIGhvc3RSTm9kZSwgYXR0cnMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjbGFzc2VzICYmIGNsYXNzZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVEaXJlY3RDbGFzcyhob3N0UmVuZGVyZXIsIGhvc3RSTm9kZSwgY2xhc3Nlcy5qb2luKCcgJykpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdEVsZW1lbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHJvb3RUVmlldywgMCkpKTsKICAgICAgICAgICAgICAgIGlmIChwcm9qZWN0YWJsZU5vZGVzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvamVjdGlvbiA9IHRFbGVtZW50Tm9kZS5wcm9qZWN0aW9uID0gW107CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm5nQ29udGVudFNlbGVjdG9ycy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vZGVzZm9yU2xvdCA9IHByb2plY3RhYmxlTm9kZXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByb2plY3RhYmxlIG5vZGVzIGNhbiBiZSBwYXNzZWQgYXMgYXJyYXkgb2YgYXJyYXlzIG9yIGFuIGFycmF5IG9mIGl0ZXJhYmxlcyAobmdVcGdyYWRlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UpLiBIZXJlIHdlIGRvIG5vcm1hbGl6ZSBwYXNzZWQgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgYW4gYXJyYXkgb2YgYXJyYXlzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbXBsZXggY2hlY2tzIGRvd24gdGhlIGxpbmUuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGFsc28gbm9ybWFsaXplIHRoZSBsZW5ndGggb2YgdGhlIHBhc3NlZCBpbiBwcm9qZWN0YWJsZSBub2RlcyAodG8gbWF0Y2ggdGhlIG51bWJlciBvZgogICAgICAgICAgICAgICAgICAgICAgICAvLyA8bmctY29udGFpbmVyPiBzbG90cyBkZWZpbmVkIGJ5IGEgY29tcG9uZW50KS4KICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdGlvbi5wdXNoKG5vZGVzZm9yU2xvdCAhPSBudWxsID8gQXJyYXkuZnJvbShub2Rlc2ZvclNsb3QpIDogbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIExpZmVjeWNsZUhvb2tzRmVhdHVyZSBhbmQgb3RoZXIgaG9zdCBmZWF0dXJlcyBiZSBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyIGFuZAogICAgICAgICAgICAgICAgLy8gZXhlY3V0ZWQgaGVyZT8KICAgICAgICAgICAgICAgIC8vIEFuZ3VsYXIgNSByZWZlcmVuY2U6IGh0dHBzOi8vc3RhY2tibGl0ei5jb20vZWRpdC9saWZlY3ljbGUtaG9va3MtdmNyZWYKICAgICAgICAgICAgICAgIGNvbXBvbmVudCA9IGNyZWF0ZVJvb3RDb21wb25lbnQoY29tcG9uZW50VmlldywgdGhpcy5jb21wb25lbnREZWYsIHJvb3RMVmlldywgcm9vdENvbnRleHQsIFtMaWZlY3ljbGVIb29rc0ZlYXR1cmVdKTsKICAgICAgICAgICAgICAgIHJlbmRlclZpZXcocm9vdFRWaWV3LCByb290TFZpZXcsIG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgbGVhdmVWaWV3KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRSZWYgPSBuZXcgQ29tcG9uZW50UmVmJDEodGhpcy5jb21wb25lbnRUeXBlLCBjb21wb25lbnQsIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZiwgdEVsZW1lbnROb2RlLCByb290TFZpZXcpLCByb290TFZpZXcsIHRFbGVtZW50Tm9kZSk7CiAgICAgICAgICAgIGlmICghcm9vdFNlbGVjdG9yT3JOb2RlIHx8IGlzSXNvbGF0ZWQpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSBob3N0IGVsZW1lbnQgb2YgdGhlIGludGVybmFsIG9yIGlzb2xhdGVkIHJvb3QgdmlldyBpcyBhdHRhY2hlZCB0byB0aGUgY29tcG9uZW50J3MgaG9zdAogICAgICAgICAgICAgICAgLy8gdmlldyBub2RlLgogICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydE5vZGVPZlBvc3NpYmxlVHlwZXMocm9vdFRWaWV3Lm5vZGUsIDIgLyogVmlldyAqLyk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAocm9vdFRWaWV3Lm5vZGUpKS5jaGlsZCA9IHRFbGVtZW50Tm9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IG5ldyBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIkMSgpOwogICAgLyoqCiAgICAgKiBSZXByZXNlbnRzIGFuIGluc3RhbmNlIG9mIGEgQ29tcG9uZW50IGNyZWF0ZWQgdmlhIGEge1xAbGluayBDb21wb25lbnRGYWN0b3J5fS4KICAgICAqCiAgICAgKiBgQ29tcG9uZW50UmVmYCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIENvbXBvbmVudCBJbnN0YW5jZSBhcyB3ZWxsIG90aGVyIG9iamVjdHMgcmVsYXRlZCB0byB0aGlzCiAgICAgKiBDb21wb25lbnQgSW5zdGFuY2UgYW5kIGFsbG93cyB5b3UgdG8gZGVzdHJveSB0aGUgQ29tcG9uZW50IEluc3RhbmNlIHZpYSB0aGUge1xAbGluayAjZGVzdHJveX0KICAgICAqIG1ldGhvZC4KICAgICAqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBDb21wb25lbnRSZWYkMSBleHRlbmRzIENvbXBvbmVudFJlZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRUeXBlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbnN0YW5jZQogICAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IF9yb290TFZpZXcKICAgICAgICAgKiBAcGFyYW0gez99IF90Tm9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbXBvbmVudFR5cGUsIGluc3RhbmNlLCBsb2NhdGlvbiwgX3Jvb3RMVmlldywgX3ROb2RlKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgICAgdGhpcy5fcm9vdExWaWV3ID0gX3Jvb3RMVmlldzsKICAgICAgICAgICAgdGhpcy5fdE5vZGUgPSBfdE5vZGU7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNicyA9IFtdOwogICAgICAgICAgICB0aGlzLmluc3RhbmNlID0gaW5zdGFuY2U7CiAgICAgICAgICAgIHRoaXMuaG9zdFZpZXcgPSB0aGlzLmNoYW5nZURldGVjdG9yUmVmID0gbmV3IFJvb3RWaWV3UmVmKF9yb290TFZpZXcpOwogICAgICAgICAgICBhc3NpZ25UVmlld05vZGVUb0xWaWV3KF9yb290TFZpZXdbVFZJRVddLCBudWxsLCAtMSwgX3Jvb3RMVmlldyk7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IE5vZGVJbmplY3Rvcih0aGlzLl90Tm9kZSwgdGhpcy5fcm9vdExWaWV3KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95Q2JzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lDYnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lDYnMgPSBudWxsOwogICAgICAgICAgICAgICAgIXRoaXMuaG9zdFZpZXcuZGVzdHJveWVkICYmIHRoaXMuaG9zdFZpZXcuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95Q2JzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlc3Ryb3lDYnMucHVzaChjYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBOT1RFOiBjaGFuZ2VzIHRvIHRoZSBgbmdJMThuQ2xvc3VyZU1vZGVgIG5hbWUgbXVzdCBiZSBzeW5jZWQgd2l0aCBgY29tcGlsZXItY2xpL3NyYy90b29saW5nLnRzYC4KICAgICAqLwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0eSBhY2Nlc3NlcyBjYW4gYmUgaWdub3JlZCBiZWNhdXNlIG5nSTE4bkNsb3N1cmVNb2RlIHdpbGwgYmUgc2V0IHRvIGZhbHNlCiAgICAgICAgLy8gd2hlbiBvcHRpbWl6aW5nIGNvZGUgYW5kIHRoZSB3aG9sZSBpZiBzdGF0ZW1lbnQgd2lsbCBiZSBkcm9wcGVkLgogICAgICAgIC8vIE1ha2Ugc3VyZSB0byByZWZlciB0byBuZ0kxOG5DbG9zdXJlTW9kZSBhcyBbJ25nSTE4bkNsb3N1cmVNb2RlJ10gZm9yIGNsb3N1cmUuCiAgICAgICAgLy8gTk9URTogd2UgbmVlZCB0byBoYXZlIGl0IGluIElJRkUgc28gdGhhdCB0aGUgdHJlZS1zaGFrZXIgaXMgaGFwcHkuCiAgICAgICAgKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRvcGxldmVsLXByb3BlcnR5LWFjY2VzcwogICAgICAgICAgICBfZ2xvYmFsWyduZ0kxOG5DbG9zdXJlTW9kZSddID0KICAgICAgICAgICAgICAgIC8vIFRPRE8oRlctMTI1MCk6IHZhbGlkYXRlIHRoYXQgdGhpcyBhY3R1YWxseSwgeW91IGtub3csIHdvcmtzLgogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLXRvcGxldmVsLXByb3BlcnR5LWFjY2VzcwogICAgICAgICAgICAgICAgdHlwZW9mIGdvb2cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiBnb29nLmdldE1zZyA9PT0gJ2Z1bmN0aW9uJzsKICAgICAgICB9KSgpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaTE4bi9sb2NhbGVfZW4udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRlkKICAgIC8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCB1ID0gdW5kZWZpbmVkOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBsdXJhbChuKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpID0gTWF0aC5mbG9vcihNYXRoLmFicyhuKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB2ID0gbi50b1N0cmluZygpLnJlcGxhY2UoL15bXi5dKlwuPy8sICcnKS5sZW5ndGg7CiAgICAgICAgaWYgKGkgPT09IDEgJiYgdiA9PT0gMCkKICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgcmV0dXJuIDU7CiAgICB9CiAgICB2YXIgbG9jYWxlRW4gPSBbCiAgICAgICAgJ2VuJywKICAgICAgICBbWydhJywgJ3AnXSwgWydBTScsICdQTSddLCB1XSwKICAgICAgICBbWydBTScsICdQTSddLCB1LCB1XSwKICAgICAgICBbCiAgICAgICAgICAgIFsnUycsICdNJywgJ1QnLCAnVycsICdUJywgJ0YnLCAnUyddLCBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLAogICAgICAgICAgICBbJ1N1bmRheScsICdNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5J10sCiAgICAgICAgICAgIFsnU3UnLCAnTW8nLCAnVHUnLCAnV2UnLCAnVGgnLCAnRnInLCAnU2EnXQogICAgICAgIF0sCiAgICAgICAgdSwKICAgICAgICBbCiAgICAgICAgICAgIFsnSicsICdGJywgJ00nLCAnQScsICdNJywgJ0onLCAnSicsICdBJywgJ1MnLCAnTycsICdOJywgJ0QnXSwKICAgICAgICAgICAgWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddLAogICAgICAgICAgICBbCiAgICAgICAgICAgICAgICAnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsICdKdWx5JywgJ0F1Z3VzdCcsICdTZXB0ZW1iZXInLAogICAgICAgICAgICAgICAgJ09jdG9iZXInLCAnTm92ZW1iZXInLCAnRGVjZW1iZXInCiAgICAgICAgICAgIF0KICAgICAgICBdLAogICAgICAgIHUsCiAgICAgICAgW1snQicsICdBJ10sIFsnQkMnLCAnQUQnXSwgWydCZWZvcmUgQ2hyaXN0JywgJ0Fubm8gRG9taW5pJ11dLAogICAgICAgIDAsCiAgICAgICAgWzYsIDBdLAogICAgICAgIFsnTS9kL3l5JywgJ01NTSBkLCB5JywgJ01NTU0gZCwgeScsICdFRUVFLCBNTU1NIGQsIHknXSwKICAgICAgICBbJ2g6bW0gYScsICdoOm1tOnNzIGEnLCAnaDptbTpzcyBhIHonLCAnaDptbTpzcyBhIHp6enonXSwKICAgICAgICBbJ3sxfSwgezB9JywgdSwgJ3sxfSBcJ2F0XCcgezB9JywgdV0sCiAgICAgICAgWycuJywgJywnLCAnOycsICclJywgJysnLCAnLScsICdFJywgJ8OXJywgJ+KAsCcsICfiiJ4nLCAnTmFOJywgJzonXSwKICAgICAgICBbJyMsIyMwLiMjIycsICcjLCMjMCUnLCAnwqQjLCMjMC4wMCcsICcjRTAnXSwKICAgICAgICAnVVNEJywKICAgICAgICAnJCcsCiAgICAgICAgJ1VTIERvbGxhcicsCiAgICAgICAge30sCiAgICAgICAgJ2x0cicsCiAgICAgICAgcGx1cmFsCiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaTE4bi9sb2NhbGVfZGF0YV9hcGkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBUaGlzIGNvbnN0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIGxvY2FsZSBkYXRhIHJlZ2lzdGVyZWQgd2l0aCBgcmVnaXN0ZXJMb2NhbGVEYXRhYAogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBMT0NBTEVfREFUQSA9IHt9OwogICAgLyoqCiAgICAgKiBGaW5kcyB0aGUgbG9jYWxlIGRhdGEgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogICAgICoKICAgICAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBUaGUgbG9jYWxlIGNvZGUuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxlIGRhdGEuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRMb2NhbGVEYXRhKGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBub3JtYWxpemVkTG9jYWxlID0gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaCA9IGdldExvY2FsZURhdGEobm9ybWFsaXplZExvY2FsZSk7CiAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaDsKICAgICAgICB9CiAgICAgICAgLy8gbGV0J3MgdHJ5IHRvIGZpbmQgYSBwYXJlbnQgbG9jYWxlCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcmVudExvY2FsZSA9IG5vcm1hbGl6ZWRMb2NhbGUuc3BsaXQoJy0nKVswXTsKICAgICAgICBtYXRjaCA9IGdldExvY2FsZURhdGEocGFyZW50TG9jYWxlKTsKICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgcmV0dXJuIG1hdGNoOwogICAgICAgIH0KICAgICAgICBpZiAocGFyZW50TG9jYWxlID09PSAnZW4nKSB7CiAgICAgICAgICAgIHJldHVybiBsb2NhbGVFbjsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlICIke2xvY2FsZX0iLmApOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIHBsdXJhbCBmdW5jdGlvbiB1c2VkIGJ5IElDVSBleHByZXNzaW9ucyB0byBkZXRlcm1pbmUgdGhlIHBsdXJhbCBjYXNlIHRvIHVzZQogICAgICogZm9yIGEgZ2l2ZW4gbG9jYWxlLgogICAgICogQHNlZSBgTmdQbHVyYWxgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcGx1cmFsIGZ1bmN0aW9uIGZvciB0aGUgbG9jYWxlLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVQbHVyYWxDYXNlKGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgICAgICByZXR1cm4gZGF0YVtMb2NhbGVEYXRhSW5kZXguUGx1cmFsQ2FzZV07CiAgICB9CiAgICAvKioKICAgICAqIEhlbHBlciBmdW5jdGlvbiB0byBnZXQgdGhlIGdpdmVuIGBub3JtYWxpemVkTG9jYWxlYCBmcm9tIGBMT0NBTEVfREFUQWAKICAgICAqIG9yIGZyb20gdGhlIGdsb2JhbCBgbmcuY29tbW9uLmxvY2FsZWAuCiAgICAgKiBAcGFyYW0gez99IG5vcm1hbGl6ZWRMb2NhbGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExvY2FsZURhdGEobm9ybWFsaXplZExvY2FsZSkgewogICAgICAgIGlmICghKG5vcm1hbGl6ZWRMb2NhbGUgaW4gTE9DQUxFX0RBVEEpKSB7CiAgICAgICAgICAgIExPQ0FMRV9EQVRBW25vcm1hbGl6ZWRMb2NhbGVdID0gX2dsb2JhbC5uZyAmJiBfZ2xvYmFsLm5nLmNvbW1vbiAmJiBfZ2xvYmFsLm5nLmNvbW1vbi5sb2NhbGVzICYmCiAgICAgICAgICAgICAgICBfZ2xvYmFsLm5nLmNvbW1vbi5sb2NhbGVzW25vcm1hbGl6ZWRMb2NhbGVdOwogICAgICAgIH0KICAgICAgICByZXR1cm4gTE9DQUxFX0RBVEFbbm9ybWFsaXplZExvY2FsZV07CiAgICB9CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IExvY2FsZURhdGFJbmRleCA9IHsKICAgICAgICBMb2NhbGVJZDogMCwKICAgICAgICBEYXlQZXJpb2RzRm9ybWF0OiAxLAogICAgICAgIERheVBlcmlvZHNTdGFuZGFsb25lOiAyLAogICAgICAgIERheXNGb3JtYXQ6IDMsCiAgICAgICAgRGF5c1N0YW5kYWxvbmU6IDQsCiAgICAgICAgTW9udGhzRm9ybWF0OiA1LAogICAgICAgIE1vbnRoc1N0YW5kYWxvbmU6IDYsCiAgICAgICAgRXJhczogNywKICAgICAgICBGaXJzdERheU9mV2VlazogOCwKICAgICAgICBXZWVrZW5kUmFuZ2U6IDksCiAgICAgICAgRGF0ZUZvcm1hdDogMTAsCiAgICAgICAgVGltZUZvcm1hdDogMTEsCiAgICAgICAgRGF0ZVRpbWVGb3JtYXQ6IDEyLAogICAgICAgIE51bWJlclN5bWJvbHM6IDEzLAogICAgICAgIE51bWJlckZvcm1hdHM6IDE0LAogICAgICAgIEN1cnJlbmN5Q29kZTogMTUsCiAgICAgICAgQ3VycmVuY3lTeW1ib2w6IDE2LAogICAgICAgIEN1cnJlbmN5TmFtZTogMTcsCiAgICAgICAgQ3VycmVuY2llczogMTgsCiAgICAgICAgRGlyZWN0aW9uYWxpdHk6IDE5LAogICAgICAgIFBsdXJhbENhc2U6IDIwLAogICAgICAgIEV4dHJhRGF0YTogMjEsCiAgICB9OwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5Mb2NhbGVJZF0gPSAnTG9jYWxlSWQnOwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzRm9ybWF0XSA9ICdEYXlQZXJpb2RzRm9ybWF0JzsKICAgIExvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguRGF5UGVyaW9kc1N0YW5kYWxvbmVdID0gJ0RheVBlcmlvZHNTdGFuZGFsb25lJzsKICAgIExvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguRGF5c0Zvcm1hdF0gPSAnRGF5c0Zvcm1hdCc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRheXNTdGFuZGFsb25lXSA9ICdEYXlzU3RhbmRhbG9uZSc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4Lk1vbnRoc0Zvcm1hdF0gPSAnTW9udGhzRm9ybWF0JzsKICAgIExvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTW9udGhzU3RhbmRhbG9uZV0gPSAnTW9udGhzU3RhbmRhbG9uZSc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkVyYXNdID0gJ0VyYXMnOwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5GaXJzdERheU9mV2Vla10gPSAnRmlyc3REYXlPZldlZWsnOwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5XZWVrZW5kUmFuZ2VdID0gJ1dlZWtlbmRSYW5nZSc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRhdGVGb3JtYXRdID0gJ0RhdGVGb3JtYXQnOwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5UaW1lRm9ybWF0XSA9ICdUaW1lRm9ybWF0JzsKICAgIExvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguRGF0ZVRpbWVGb3JtYXRdID0gJ0RhdGVUaW1lRm9ybWF0JzsKICAgIExvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguTnVtYmVyU3ltYm9sc10gPSAnTnVtYmVyU3ltYm9scyc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4Lk51bWJlckZvcm1hdHNdID0gJ051bWJlckZvcm1hdHMnOwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5DdXJyZW5jeUNvZGVdID0gJ0N1cnJlbmN5Q29kZSc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmN5U3ltYm9sXSA9ICdDdXJyZW5jeVN5bWJvbCc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkN1cnJlbmN5TmFtZV0gPSAnQ3VycmVuY3lOYW1lJzsKICAgIExvY2FsZURhdGFJbmRleFtMb2NhbGVEYXRhSW5kZXguQ3VycmVuY2llc10gPSAnQ3VycmVuY2llcyc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LkRpcmVjdGlvbmFsaXR5XSA9ICdEaXJlY3Rpb25hbGl0eSc7CiAgICBMb2NhbGVEYXRhSW5kZXhbTG9jYWxlRGF0YUluZGV4LlBsdXJhbENhc2VdID0gJ1BsdXJhbENhc2UnOwogICAgTG9jYWxlRGF0YUluZGV4W0xvY2FsZURhdGFJbmRleC5FeHRyYURhdGFdID0gJ0V4dHJhRGF0YSc7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEgbG9jYWxlIG5hbWUgLSBsb3dlcmNhc2Ugd2l0aCBgX2AgcmVwbGFjZWQgd2l0aCBgLWAuCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbm9ybWFsaXplTG9jYWxlKGxvY2FsZSkgewogICAgICAgIHJldHVybiBsb2NhbGUudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJyk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9pMThuL2xvY2FsaXphdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBwbHVyYWxNYXBwaW5nID0gWyd6ZXJvJywgJ29uZScsICd0d28nLCAnZmV3JywgJ21hbnknXTsKICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgcGx1cmFsIGNhc2UgYmFzZWQgb24gdGhlIGxvY2FsZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFBsdXJhbENhc2UodmFsdWUsIGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbHVyYWwgPSBnZXRMb2NhbGVQbHVyYWxDYXNlKGxvY2FsZSkocGFyc2VJbnQodmFsdWUsIDEwKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IHBsdXJhbE1hcHBpbmdbcGx1cmFsXTsKICAgICAgICByZXR1cm4gKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSA/IHJlc3VsdCA6ICdvdGhlcic7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBsb2NhbGUgaWQgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgdXNpbmcgYnkgZGVmYXVsdCAoZm9yIHRyYW5zbGF0aW9ucyBhbmQgSUNVIGV4cHJlc3Npb25zKS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBERUZBVUxUX0xPQ0FMRV9JRCA9ICdlbi1VUyc7CiAgICAvKioKICAgICAqIFVTRCBjdXJyZW5jeSBjb2RlIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHVzZXMgYnkgZGVmYXVsdCBmb3IgQ3VycmVuY3lQaXBlIHdoZW4gbm8KICAgICAqIERFRkFVTFRfQ1VSUkVOQ1lfQ09ERSBpcyBwcm92aWRlZC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBVU0RfQ1VSUkVOQ1lfQ09ERSA9ICdVU0QnOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9pMThuLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE1BUktFUiA9IGDvv71gOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSUNVX0JMT0NLX1JFR0VYUCA9IC9eXHMqKO+/vVxkKzo/XGQq77+9KVxzKixccyooc2VsZWN0fHBsdXJhbClccyosLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNVQlRFTVBMQVRFX1JFR0VYUCA9IC/vv71cLz9cKihcZCs6XGQrKe+/vS9naTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBIX1JFR0VYUCA9IC/vv70oXC8/WyMqIV1cZCspOj9cZCrvv70vZ2k7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBCSU5ESU5HX1JFR0VYUCA9IC/vv70oXGQrKTo/XGQq77+9L2dpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSUNVX1JFR0VYUCA9IC8oe1xzKu+/vVxkKzo/XGQq77+9XHMqLFxzKlxTezZ9XHMqLFtcc1xTXSp9KS9naTsKICAgIC8vIGkxOG5Qb3N0cHJvY2VzcyBjb25zdHMKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJPT1RfVEVNUExBVEVfSUQgPSAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUFBfTVVMVElfVkFMVUVfUExBQ0VIT0xERVJTX1JFR0VYUCA9IC9cWyjvv70uKz/vv70/KVxdLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBQX1BMQUNFSE9MREVSU19SRUdFWFAgPSAvXFso77+9Lis/77+9PylcXXwo77+9XC8/XCpcZCs6XGQr77+9KS9nOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUFBfSUNVX1ZBUlNfUkVHRVhQID0gLyh7XHMqKShWQVJfKFBMVVJBTHxTRUxFQ1QpKF9cZCspPykoXHMqLCkvZzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBQX0lDVV9QTEFDRUhPTERFUlNfUkVHRVhQID0gL3soW0EtWjAtOV9dKyl9L2c7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBQUF9JQ1VTX1JFR0VYUCA9IC/vv71JMThOX0VYUF8oSUNVKF9cZCspPynvv70vZzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBQX0NMT1NFX1RFTVBMQVRFX1JFR0VYUCA9IC9cL1wqLzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBQX1RFTVBMQVRFX0lEX1JFR0VYUCA9IC9cZCtcOihcZCspLzsKICAgIC8qKgogICAgICogQnJlYWtzIHBhdHRlcm4gaW50byBzdHJpbmdzIGFuZCB0b3AgbGV2ZWwgey4uLn0gYmxvY2tzLgogICAgICogQ2FuIGJlIHVzZWQgdG8gYnJlYWsgYSBtZXNzYWdlIGludG8gdGV4dCBhbmQgSUNVIGV4cHJlc3Npb25zLCBvciB0byBicmVhayBhbiBJQ1UgZXhwcmVzc2lvbiBpbnRvCiAgICAgKiBrZXlzIGFuZCBjYXNlcy4KICAgICAqIE9yaWdpbmFsIGNvZGUgZnJvbSBjbG9zdXJlIGxpYnJhcnksIG1vZGlmaWVkIGZvciBBbmd1bGFyLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcGF0dGVybiAoc3ViKVBhdHRlcm4gdG8gYmUgYnJva2VuLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4dHJhY3RQYXJ0cyhwYXR0ZXJuKSB7CiAgICAgICAgaWYgKCFwYXR0ZXJuKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwcmV2UG9zID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYnJhY2VTdGFjayA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHRzID0gW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJyYWNlcyA9IC9be31dL2c7CiAgICAgICAgLy8gbGFzdEluZGV4IGRvZXNuJ3QgZ2V0IHNldCB0byAwIHNvIHdlIGhhdmUgdG8uCiAgICAgICAgYnJhY2VzLmxhc3RJbmRleCA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaDsKICAgICAgICB3aGlsZSAobWF0Y2ggPSBicmFjZXMuZXhlYyhwYXR0ZXJuKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvcyA9IG1hdGNoLmluZGV4OwogICAgICAgICAgICBpZiAobWF0Y2hbMF0gPT0gJ30nKSB7CiAgICAgICAgICAgICAgICBicmFjZVN0YWNrLnBvcCgpOwogICAgICAgICAgICAgICAgaWYgKGJyYWNlU3RhY2subGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyBFbmQgb2YgdGhlIGJsb2NrLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBibG9jayA9IHBhdHRlcm4uc3Vic3RyaW5nKHByZXZQb3MsIHBvcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKElDVV9CTE9DS19SRUdFWFAudGVzdChibG9jaykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHBhcnNlSUNVQmxvY2soYmxvY2spKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChibG9jayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByZXZQb3MgPSBwb3MgKyAxOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGJyYWNlU3RhY2subGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3Vic3RyaW5nID0gcGF0dGVybi5zdWJzdHJpbmcocHJldlBvcywgcG9zKTsKICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goc3Vic3RyaW5nKTsKICAgICAgICAgICAgICAgICAgICBwcmV2UG9zID0gcG9zICsgMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyYWNlU3RhY2sucHVzaCgneycpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdWJzdHJpbmcgPSBwYXR0ZXJuLnN1YnN0cmluZyhwcmV2UG9zKTsKICAgICAgICByZXN1bHRzLnB1c2goc3Vic3RyaW5nKTsKICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2VzIHRleHQgY29udGFpbmluZyBhbiBJQ1UgZXhwcmVzc2lvbiBhbmQgcHJvZHVjZXMgYSBKU09OIG9iamVjdCBmb3IgaXQuCiAgICAgKiBPcmlnaW5hbCBjb2RlIGZyb20gY2xvc3VyZSBsaWJyYXJ5LCBtb2RpZmllZCBmb3IgQW5ndWxhci4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHBhdHRlcm4gVGV4dCBjb250YWluaW5nIGFuIElDVSBleHByZXNzaW9uIHRoYXQgbmVlZHMgdG8gYmUgcGFyc2VkLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlSUNVQmxvY2socGF0dGVybikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjYXNlcyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2YWx1ZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGljdVR5cGUgPSAxIC8qIHBsdXJhbCAqLzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1haW5CaW5kaW5nID0gMDsKICAgICAgICBwYXR0ZXJuID0gcGF0dGVybi5yZXBsYWNlKElDVV9CTE9DS19SRUdFWFAsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0cgogICAgICAgICAqIEBwYXJhbSB7P30gYmluZGluZwogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKHN0ciwgYmluZGluZywgdHlwZSkgewogICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NlbGVjdCcpIHsKICAgICAgICAgICAgICAgIGljdVR5cGUgPSAwIC8qIHNlbGVjdCAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGljdVR5cGUgPSAxIC8qIHBsdXJhbCAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICBtYWluQmluZGluZyA9IHBhcnNlSW50KGJpbmRpbmcuc3Vic3RyKDEpLCAxMCk7CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcnRzID0gKC8qKiBAdHlwZSB7P30gKi8gKGV4dHJhY3RQYXJ0cyhwYXR0ZXJuKSkpOwogICAgICAgIC8vIExvb2tpbmcgZm9yIChrZXkgYmxvY2spKyBzZXF1ZW5jZS4gT25lIG9mIHRoZSBrZXlzIGhhcyB0byBiZSAib3RoZXIiLgogICAgICAgIGZvciAobGV0IHBvcyA9IDA7IHBvcyA8IHBhcnRzLmxlbmd0aDspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQga2V5ID0gcGFydHNbcG9zKytdLnRyaW0oKTsKICAgICAgICAgICAgaWYgKGljdVR5cGUgPT09IDEgLyogcGx1cmFsICovKSB7CiAgICAgICAgICAgICAgICAvLyBLZXkgY2FuIGJlICI9eCIsIHdlIGp1c3Qgd2FudCAieCIKICAgICAgICAgICAgICAgIGtleSA9IGtleS5yZXBsYWNlKC9ccyooPzo9KT8oXHcrKVxzKi8sICckMScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrZXkubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjYXNlcy5wdXNoKGtleSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBibG9ja3MgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXh0cmFjdFBhcnRzKHBhcnRzW3BvcysrXSkpKTsKICAgICAgICAgICAgaWYgKGNhc2VzLmxlbmd0aCA+IHZhbHVlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHZhbHVlcy5wdXNoKGJsb2Nrcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhvY29tYmUpOiBzdXBwb3J0IElDVSBleHByZXNzaW9ucyBpbiBhdHRyaWJ1dGVzLCBzZWUgIzIxNjE1CiAgICAgICAgcmV0dXJuIHsgdHlwZTogaWN1VHlwZSwgbWFpbkJpbmRpbmc6IG1haW5CaW5kaW5nLCBjYXNlcywgdmFsdWVzIH07CiAgICB9CiAgICAvKioKICAgICAqIFJlbW92ZXMgZXZlcnl0aGluZyBpbnNpZGUgdGhlIHN1Yi10ZW1wbGF0ZXMgb2YgYSBtZXNzYWdlLgogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVJbm5lclRlbXBsYXRlVHJhbnNsYXRpb24obWVzc2FnZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWF0Y2g7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXMgPSAnJzsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluZGV4ID0gMDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluVGVtcGxhdGUgPSBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRhZ01hdGNoZWQ7CiAgICAgICAgd2hpbGUgKChtYXRjaCA9IFNVQlRFTVBMQVRFX1JFR0VYUC5leGVjKG1lc3NhZ2UpKSAhPT0gbnVsbCkgewogICAgICAgICAgICBpZiAoIWluVGVtcGxhdGUpIHsKICAgICAgICAgICAgICAgIHJlcyArPSBtZXNzYWdlLnN1YnN0cmluZyhpbmRleCwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpOwogICAgICAgICAgICAgICAgdGFnTWF0Y2hlZCA9IG1hdGNoWzFdOwogICAgICAgICAgICAgICAgaW5UZW1wbGF0ZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobWF0Y2hbMF0gPT09IGAke01BUktFUn0vKiR7dGFnTWF0Y2hlZH0ke01BUktFUn1gKSB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBtYXRjaC5pbmRleDsKICAgICAgICAgICAgICAgICAgICBpblRlbXBsYXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKGluVGVtcGxhdGUsIGZhbHNlLCBgVGFnIG1pc21hdGNoOiB1bmFibGUgdG8gZmluZCB0aGUgZW5kIG9mIHRoZSBzdWItdGVtcGxhdGUgaW4gdGhlIHRyYW5zbGF0aW9uICIke21lc3NhZ2V9ImApOwogICAgICAgIHJlcyArPSBtZXNzYWdlLnN1YnN0cihpbmRleCk7CiAgICAgICAgcmV0dXJuIHJlczsKICAgIH0KICAgIC8qKgogICAgICogRXh0cmFjdHMgYSBwYXJ0IG9mIGEgbWVzc2FnZSBhbmQgcmVtb3ZlcyB0aGUgcmVzdC4KICAgICAqCiAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBleHRyYWN0aW5nIGEgcGFydCBvZiB0aGUgbWVzc2FnZSBhc3NvY2lhdGVkIHdpdGggYSB0ZW1wbGF0ZS4gQSB0cmFuc2xhdGVkCiAgICAgKiBtZXNzYWdlIGNhbiBzcGFuIG11bHRpcGxlIHRlbXBsYXRlcy4KICAgICAqCiAgICAgKiBFeGFtcGxlOgogICAgICogYGBgCiAgICAgKiA8ZGl2IGkxOG4+VHJhbnNsYXRlIDxzcGFuICpuZ0lmPm1lPC9zcGFuPiE8L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBjcm9wCiAgICAgKiBAcGFyYW0gez89fSBzdWJUZW1wbGF0ZUluZGV4IEluZGV4IG9mIHRoZSBzdWItdGVtcGxhdGUgdG8gZXh0cmFjdC4gSWYgdW5kZWZpbmVkIGl0IHJldHVybnMgdGhlCiAgICAgKiBleHRlcm5hbCB0ZW1wbGF0ZSBhbmQgcmVtb3ZlcyBhbGwgc3ViLXRlbXBsYXRlcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRyYW5zbGF0aW9uRm9yVGVtcGxhdGUobWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCkgewogICAgICAgIGlmIChpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2Uoc3ViVGVtcGxhdGVJbmRleCkpIHsKICAgICAgICAgICAgLy8gV2Ugd2FudCB0aGUgcm9vdCB0ZW1wbGF0ZSBtZXNzYWdlLCBpZ25vcmUgYWxsIHN1Yi10ZW1wbGF0ZXMKICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUlubmVyVGVtcGxhdGVUcmFuc2xhdGlvbihtZXNzYWdlKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFdlIHdhbnQgYSBzcGVjaWZpYyBzdWItdGVtcGxhdGUKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFydCA9IG1lc3NhZ2UuaW5kZXhPZihgOiR7c3ViVGVtcGxhdGVJbmRleH0ke01BUktFUn1gKSArIDIgKyBzdWJUZW1wbGF0ZUluZGV4LnRvU3RyaW5nKCkubGVuZ3RoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZCA9IG1lc3NhZ2Uuc2VhcmNoKG5ldyBSZWdFeHAoYCR7TUFSS0VSfVxcL1xcKlxcZCs6JHtzdWJUZW1wbGF0ZUluZGV4fSR7TUFSS0VSfWApKTsKICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUlubmVyVGVtcGxhdGVUcmFuc2xhdGlvbihtZXNzYWdlLnN1YnN0cmluZyhzdGFydCwgZW5kKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSB0aGUgT3BDb2RlcyB0byB1cGRhdGUgdGhlIGJpbmRpbmdzIG9mIGEgc3RyaW5nLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gc3RyIFRoZSBzdHJpbmcgY29udGFpbmluZyB0aGUgYmluZGluZ3MuCiAgICAgKiBAcGFyYW0gez99IGRlc3RpbmF0aW9uTm9kZSBJbmRleCBvZiB0aGUgZGVzdGluYXRpb24gbm9kZSB3aGljaCB3aWxsIHJlY2VpdmUgdGhlIGJpbmRpbmcuCiAgICAgKiBAcGFyYW0gez89fSBhdHRyTmFtZSBOYW1lIG9mIHRoZSBhdHRyaWJ1dGUsIGlmIHRoZSBzdHJpbmcgYmVsb25ncyB0byBhbiBhdHRyaWJ1dGUuCiAgICAgKiBAcGFyYW0gez89fSBzYW5pdGl6ZUZuIFNhbml0aXphdGlvbiBmdW5jdGlvbiB1c2VkIHRvIHNhbml0aXplIHRoZSBzdHJpbmcgYWZ0ZXIgdXBkYXRlLCBpZiBuZWNlc3NhcnkuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKHN0ciwgZGVzdGluYXRpb25Ob2RlLCBhdHRyTmFtZSwgc2FuaXRpemVGbiA9IG51bGwpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXBkYXRlT3BDb2RlcyA9IFtudWxsLCBudWxsXTsKICAgICAgICAvLyBBbGxvYyBzcGFjZSBmb3IgbWFzayBhbmQgc2l6ZQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0ZXh0UGFydHMgPSBzdHIuc3BsaXQoQklORElOR19SRUdFWFApOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWFzayA9IDA7CiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0ZXh0UGFydHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0VmFsdWUgPSB0ZXh0UGFydHNbal07CiAgICAgICAgICAgIGlmIChqICYgMSkgewogICAgICAgICAgICAgICAgLy8gT2RkIGluZGV4ZXMgYXJlIGJpbmRpbmdzCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBwYXJzZUludCh0ZXh0VmFsdWUsIDEwKTsKICAgICAgICAgICAgICAgIHVwZGF0ZU9wQ29kZXMucHVzaCgtMSAtIGJpbmRpbmdJbmRleCk7CiAgICAgICAgICAgICAgICBtYXNrID0gbWFzayB8IHRvTWFza0JpdChiaW5kaW5nSW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRleHRWYWx1ZSAhPT0gJycpIHsKICAgICAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dAogICAgICAgICAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKHRleHRWYWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdXBkYXRlT3BDb2Rlcy5wdXNoKGRlc3RpbmF0aW9uTm9kZSA8PCAyIC8qIFNISUZUX1JFRiAqLyB8CiAgICAgICAgICAgIChhdHRyTmFtZSA/IDEgLyogQXR0ciAqLyA6IDAgLyogVGV4dCAqLykpOwogICAgICAgIGlmIChhdHRyTmFtZSkgewogICAgICAgICAgICB1cGRhdGVPcENvZGVzLnB1c2goYXR0ck5hbWUsIHNhbml0aXplRm4pOwogICAgICAgIH0KICAgICAgICB1cGRhdGVPcENvZGVzWzBdID0gbWFzazsKICAgICAgICB1cGRhdGVPcENvZGVzWzFdID0gdXBkYXRlT3BDb2Rlcy5sZW5ndGggLSAyOwogICAgICAgIHJldHVybiB1cGRhdGVPcENvZGVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGljdUV4cHJlc3Npb24KICAgICAqIEBwYXJhbSB7Pz19IG1hc2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEJpbmRpbmdNYXNrKGljdUV4cHJlc3Npb24sIG1hc2sgPSAwKSB7CiAgICAgICAgbWFzayA9IG1hc2sgfCB0b01hc2tCaXQoaWN1RXhwcmVzc2lvbi5tYWluQmluZGluZyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBtYXRjaDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljdUV4cHJlc3Npb24udmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWVBcnIgPSBpY3VFeHByZXNzaW9uLnZhbHVlc1tpXTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB2YWx1ZUFyci5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB2YWx1ZUFycltqXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG1hdGNoID0gQklORElOR19SRUdFWFAuZXhlYyh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWFzayA9IG1hc2sgfCB0b01hc2tCaXQocGFyc2VJbnQobWF0Y2hbMV0sIDEwKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgbWFzayA9IGdldEJpbmRpbmdNYXNrKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpLCBtYXNrKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbWFzazsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGkxOG5JbmRleFN0YWNrID0gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaTE4bkluZGV4U3RhY2tQb2ludGVyID0gLTE7CiAgICAvKioKICAgICAqIENvbnZlcnQgYmluZGluZyBpbmRleCB0byBtYXNrIGJpdC4KICAgICAqCiAgICAgKiBFYWNoIGluZGV4IHJlcHJlc2VudHMgYSBzaW5nbGUgYml0IG9uIHRoZSBiaXQtbWFzay4gQmVjYXVzZSBiaXQtbWFzayBvbmx5IGhhcyAzMiBiaXRzLCB3ZSBtYWtlCiAgICAgKiB0aGUgMzJuZCBiaXQgc2hhcmUgYWxsIG1hc2tzIGZvciBhbGwgYmluZGluZ3MgaGlnaGVyIHRoYW4gMzIuIFNpbmNlIGl0IGlzIGV4dHJlbWVseSByYXJlIHRvIGhhdmUKICAgICAqIG1vcmUgdGhhbiAzMiBiaW5kaW5ncyB0aGlzIHdpbGwgYmUgaGl0IHZlcnkgcmFyZWx5LiBUaGUgZG93bnNpZGUgb2YgaGl0dGluZyB0aGlzIGNvcm5lciBjYXNlIGlzCiAgICAgKiB0aGF0IHdlIHdpbGwgZXhlY3V0ZSBiaW5kaW5nIGNvZGUgbW9yZSBvZnRlbiB0aGFuIG5lY2Vzc2FyeS4gKHBlbmFsdHkgb2YgcGVyZm9ybWFuY2UpCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdG9NYXNrQml0KGJpbmRpbmdJbmRleCkgewogICAgICAgIHJldHVybiAxIDw8IE1hdGgubWluKGJpbmRpbmdJbmRleCwgMzEpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGFyZW50SW5kZXhTdGFjayA9IFtdOwogICAgLyoqCiAgICAgKiBNYXJrcyBhIGJsb2NrIG9mIHRleHQgYXMgdHJhbnNsYXRhYmxlLgogICAgICoKICAgICAqIFRoZSBpbnN0cnVjdGlvbnMgYGkxOG5TdGFydGAgYW5kIGBpMThuRW5kYCBtYXJrIHRoZSB0cmFuc2xhdGlvbiBibG9jayBpbiB0aGUgdGVtcGxhdGUuCiAgICAgKiBUaGUgdHJhbnNsYXRpb24gYG1lc3NhZ2VgIGlzIHRoZSB2YWx1ZSB3aGljaCBpcyBsb2NhbGUgc3BlY2lmaWMuIFRoZSB0cmFuc2xhdGlvbiBzdHJpbmcgbWF5CiAgICAgKiBjb250YWluIHBsYWNlaG9sZGVycyB3aGljaCBhc3NvY2lhdGUgaW5uZXIgZWxlbWVudHMgYW5kIHN1Yi10ZW1wbGF0ZXMgd2l0aGluIHRoZSB0cmFuc2xhdGlvbi4KICAgICAqCiAgICAgKiBUaGUgdHJhbnNsYXRpb24gYG1lc3NhZ2VgIHBsYWNlaG9sZGVycyBhcmU6CiAgICAgKiAtIGDvv717aW5kZXh9KDp7YmxvY2t9Ke+/vWA6ICpCaW5kaW5nIFBsYWNlaG9sZGVyKjogTWFya3MgYSBsb2NhdGlvbiB3aGVyZSBhbiBleHByZXNzaW9uIHdpbGwgYmUKICAgICAqICAgaW50ZXJwb2xhdGVkIGludG8uIFRoZSBwbGFjZWhvbGRlciBgaW5kZXhgIHBvaW50cyB0byB0aGUgZXhwcmVzc2lvbiBiaW5kaW5nIGluZGV4LiBBbiBvcHRpb25hbAogICAgICogICBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICAgICAqIC0gYO+/vSN7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8je2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqRWxlbWVudCBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUgYmVnaW5uaW5nCiAgICAgKiAgIGFuZCBlbmQgb2YgRE9NIGVsZW1lbnQgdGhhdCB3ZXJlIGVtYmVkZGVkIGluIHRoZSBvcmlnaW5hbCB0cmFuc2xhdGlvbiBibG9jay4gVGhlIHBsYWNlaG9sZGVyCiAgICAgKiAgIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBlbGVtZW50IGluZGV4IGluIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbnMgc2V0LiBBbiBvcHRpb25hbCBgYmxvY2tgIHRoYXQKICAgICAqICAgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICAgICAqIC0gYO+/vSF7aW5kZXh9KDp7YmxvY2t9Ke+/vWAvYO+/vS8he2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqUHJvamVjdGlvbiBQbGFjZWhvbGRlcio6ICBNYXJrcyB0aGUKICAgICAqICAgYmVnaW5uaW5nIGFuZCBlbmQgb2YgPG5nLWNvbnRlbnQ+IHRoYXQgd2FzIGVtYmVkZGVkIGluIHRoZSBvcmlnaW5hbCB0cmFuc2xhdGlvbiBibG9jay4KICAgICAqICAgVGhlIHBsYWNlaG9sZGVyIGBpbmRleGAgcG9pbnRzIHRvIHRoZSBlbGVtZW50IGluZGV4IGluIHRoZSB0ZW1wbGF0ZSBpbnN0cnVjdGlvbnMgc2V0LgogICAgICogICBBbiBvcHRpb25hbCBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICAgICAqIC0gYO+/vSp7aW5kZXh9OntibG9ja33vv71gL2Dvv70vKntpbmRleH06e2Jsb2Nrfe+/vWA6ICpTdWItdGVtcGxhdGUgUGxhY2Vob2xkZXIqOiBTdWItdGVtcGxhdGVzIG11c3QgYmUKICAgICAqICAgc3BsaXQgdXAgYW5kIHRyYW5zbGF0ZWQgc2VwYXJhdGVseSBpbiBlYWNoIGFuZ3VsYXIgdGVtcGxhdGUgZnVuY3Rpb24uIFRoZSBgaW5kZXhgIHBvaW50cyB0byB0aGUKICAgICAqICAgYHRlbXBsYXRlYCBpbnN0cnVjdGlvbiBpbmRleC4gQSBgYmxvY2tgIHRoYXQgbWF0Y2hlcyB0aGUgc3ViLXRlbXBsYXRlIGluIHdoaWNoIGl0IHdhcyBkZWNsYXJlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gaW5kZXggQSB1bmlxdWUgaW5kZXggb2YgdGhlIHRyYW5zbGF0aW9uIGluIHRoZSBzdGF0aWMgYmxvY2suCiAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UgVGhlIHRyYW5zbGF0aW9uIG1lc3NhZ2UuCiAgICAgKiBAcGFyYW0gez89fSBzdWJUZW1wbGF0ZUluZGV4IE9wdGlvbmFsIHN1Yi10ZW1wbGF0ZSBpbmRleCBpbiB0aGUgYG1lc3NhZ2VgLgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVpMThuU3RhcnQoaW5kZXgsIG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LCBgdFZpZXcgc2hvdWxkIGJlIGRlZmluZWRgKTsKICAgICAgICBpMThuSW5kZXhTdGFja1srK2kxOG5JbmRleFN0YWNrUG9pbnRlcl0gPSBpbmRleDsKICAgICAgICAvLyBXZSBuZWVkIHRvIGRlbGF5IHByb2plY3Rpb25zIHVudGlsIGBpMThuRW5kYAogICAgICAgIHNldERlbGF5UHJvamVjdGlvbih0cnVlKTsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzICYmIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9PT0gbnVsbCkgewogICAgICAgICAgICBpMThuU3RhcnRGaXJzdFBhc3MoZ2V0TFZpZXcoKSwgdFZpZXcsIGluZGV4LCBtZXNzYWdlLCBzdWJUZW1wbGF0ZUluZGV4KTsKICAgICAgICB9CiAgICB9CiAgICAvLyBDb3VudCBmb3IgdGhlIG51bWJlciBvZiB2YXJzIHRoYXQgd2lsbCBiZSBhbGxvY2F0ZWQgZm9yIGVhY2ggaTE4biBibG9jay4KICAgIC8vIEl0IGlzIGdsb2JhbCBiZWNhdXNlIHRoaXMgaXMgdXNlZCBpbiBtdWx0aXBsZSBmdW5jdGlvbnMgdGhhdCBpbmNsdWRlIGxvb3BzIGFuZCByZWN1cnNpdmUgY2FsbHMuCiAgICAvLyBUaGlzIGlzIHJlc2V0IHRvIDAgd2hlbiBgaTE4blN0YXJ0Rmlyc3RQYXNzYCBpcyBjYWxsZWQuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaTE4blZhcnNDb3VudDsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGFydEluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhbGxvY05vZGVJbmRleChzdGFydEluZGV4KSB7CiAgICAgICAgcmV0dXJuIHN0YXJ0SW5kZXggKyBpMThuVmFyc0NvdW50Kys7CiAgICB9CiAgICAvKioKICAgICAqIFNlZSBgaTE4blN0YXJ0YCBhYm92ZS4KICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICogQHBhcmFtIHs/PX0gc3ViVGVtcGxhdGVJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaTE4blN0YXJ0Rmlyc3RQYXNzKGxWaWV3LCB0VmlldywgaW5kZXgsIG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhcnRJbmRleCA9IHRWaWV3LmJsdWVwcmludC5sZW5ndGggLSBIRUFERVJfT0ZGU0VUOwogICAgICAgIGkxOG5WYXJzQ291bnQgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyZW50VE5vZGUgPSBnZXRJc1BhcmVudCgpID8gcHJldmlvdXNPclBhcmVudFROb2RlIDogcHJldmlvdXNPclBhcmVudFROb2RlICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5wYXJlbnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwYXJlbnRJbmRleCA9IHBhcmVudFROb2RlICYmIHBhcmVudFROb2RlICE9PSBsVmlld1tUX0hPU1RdID8gcGFyZW50VE5vZGUuaW5kZXggLSBIRUFERVJfT0ZGU0VUIDogaW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwYXJlbnRJbmRleFBvaW50ZXIgPSAwOwogICAgICAgIHBhcmVudEluZGV4U3RhY2tbcGFyZW50SW5kZXhQb2ludGVyXSA9IHBhcmVudEluZGV4OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjcmVhdGVPcENvZGVzID0gW107CiAgICAgICAgLy8gSWYgdGhlIHByZXZpb3VzIG5vZGUgd2Fzbid0IHRoZSBkaXJlY3QgcGFyZW50IHRoZW4gd2UgaGF2ZSBhIHRyYW5zbGF0aW9uIHdpdGhvdXQgdG9wIGxldmVsCiAgICAgICAgLy8gZWxlbWVudCBhbmQgd2UgbmVlZCB0byBrZWVwIGEgcmVmZXJlbmNlIG9mIHRoZSBwcmV2aW91cyBlbGVtZW50IGlmIHRoZXJlIGlzIG9uZS4gV2Ugc2hvdWxkIGFsc28KICAgICAgICAvLyBrZWVwIHRyYWNrIHdoZXRoZXIgYW4gZWxlbWVudCB3YXMgYSBwYXJlbnQgbm9kZSBvciBub3QsIHNvIHRoYXQgdGhlIGxvZ2ljIHRoYXQgY29uc3VtZXMKICAgICAgICAvLyB0aGUgZ2VuZXJhdGVkIGBJMThuTXV0YXRlT3BDb2RlYHMgY2FuIGxldmVyYWdlIHRoaXMgaW5mb3JtYXRpb24gdG8gcHJvcGVybHkgc2V0IFROb2RlIHN0YXRlCiAgICAgICAgLy8gKHdoZXRoZXIgaXQncyBhIHBhcmVudCBvciBzaWJsaW5nKS4KICAgICAgICBpZiAoaW5kZXggPiAwICYmIHByZXZpb3VzT3JQYXJlbnRUTm9kZSAhPT0gcGFyZW50VE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJldmlvdXNUTm9kZUluZGV4ID0gcHJldmlvdXNPclBhcmVudFROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVDsKICAgICAgICAgICAgLy8gSWYgY3VycmVudCBUTm9kZSBpcyBhIHNpYmxpbmcgbm9kZSwgZW5jb2RlIGl0IHVzaW5nIGEgbmVnYXRpdmUgaW5kZXguIFRoaXMgaW5mb3JtYXRpb24gaXMKICAgICAgICAgICAgLy8gcmVxdWlyZWQgd2hlbiB0aGUgYFNlbGVjdGAgYWN0aW9uIGlzIHByb2Nlc3NlZCAoc2VlIHRoZSBgcmVhZENyZWF0ZU9wQ29kZXNgIGZ1bmN0aW9uKS4KICAgICAgICAgICAgaWYgKCFnZXRJc1BhcmVudCgpKSB7CiAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlSW5kZXggPSB+cHJldmlvdXNUTm9kZUluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBPcENvZGUgdG8gc2VsZWN0IHRoZSBwcmV2aW91cyBUTm9kZQogICAgICAgICAgICBjcmVhdGVPcENvZGVzLnB1c2gocHJldmlvdXNUTm9kZUluZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgMCAvKiBTZWxlY3QgKi8pOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXBkYXRlT3BDb2RlcyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpY3VFeHByZXNzaW9ucyA9IFtdOwogICAgICAgIGlmIChtZXNzYWdlID09PSAnJyAmJiBpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2Uoc3ViVGVtcGxhdGVJbmRleCkpIHsKICAgICAgICAgICAgLy8gSWYgdG9wIGxldmVsIHRyYW5zbGF0aW9uIGlzIGFuIGVtcHR5IHN0cmluZywgZG8gbm90IGludm9rZSBhZGRpdGlvbmFsIHByb2Nlc3NpbmcKICAgICAgICAgICAgLy8gYW5kIGp1c3QgY3JlYXRlIG9wIGNvZGVzIGZvciBlbXB0eSB0ZXh0IG5vZGUgaW5zdGVhZC4KICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKG1lc3NhZ2UsIGFsbG9jTm9kZUluZGV4KHN0YXJ0SW5kZXgpLCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGVtcGxhdGVUcmFuc2xhdGlvbiA9IGdldFRyYW5zbGF0aW9uRm9yVGVtcGxhdGUobWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbXNnUGFydHMgPSByZXBsYWNlTmdzcCh0ZW1wbGF0ZVRyYW5zbGF0aW9uKS5zcGxpdChQSF9SRUdFWFApOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1zZ1BhcnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBtc2dQYXJ0c1tpXTsKICAgICAgICAgICAgICAgIGlmIChpICYgMSkgewogICAgICAgICAgICAgICAgICAgIC8vIE9kZCBpbmRleGVzIGFyZSBwbGFjZWhvbGRlcnMgKGVsZW1lbnRzIGFuZCBzdWItdGVtcGxhdGVzKQogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoMCkgPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIGNsb3NpbmcgdGFnCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5jaGFyQXQoMSkgPT09ICIjIiAvKiBFTEVNRU5UICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwaEluZGV4ID0gcGFyc2VJbnQodmFsdWUuc3Vic3RyKDIpLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRJbmRleCA9IHBhcmVudEluZGV4U3RhY2tbLS1wYXJlbnRJbmRleFBvaW50ZXJdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKHBoSW5kZXggPDwgMyAvKiBTSElGVF9SRUYgKi8gfCA1IC8qIEVsZW1lbnRFbmQgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBoSW5kZXggPSBwYXJzZUludCh2YWx1ZS5zdWJzdHIoMSksIDEwKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpc0VsZW1lbnQgPSB2YWx1ZS5jaGFyQXQoMCkgPT09ICIjIiAvKiBFTEVNRU5UICovOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgdmFsdWUgcmVwcmVzZW50cyBhIHBsYWNlaG9sZGVyIHRoYXQgd2UgbW92ZSB0byB0aGUgZGVzaWduYXRlZCBpbmRleC4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZTogcG9zaXRpdmUgaW5kaWNpZXMgaW5kaWNhdGUgdGhhdCBhIFROb2RlIHdpdGggYSBnaXZlbiBpbmRleCBzaG91bGQgYWxzbyBiZSBtYXJrZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgcGFyZW50IHdoaWxlIGV4ZWN1dGluZyBgU2VsZWN0YCBpbnN0cnVjdGlvbi4KICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKChpc0VsZW1lbnQgPyBwaEluZGV4IDogfnBoSW5kZXgpIDw8IDMgLyogU0hJRlRfUkVGICovIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogU2VsZWN0ICovLCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50SW5kZXhTdGFja1srK3BhcmVudEluZGV4UG9pbnRlcl0gPSBwYXJlbnRJbmRleCA9IHBoSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBFdmVuIGluZGV4ZXMgYXJlIHRleHQgKGluY2x1ZGluZyBiaW5kaW5ncyAmIElDVSBleHByZXNzaW9ucykKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFydHMgPSBleHRyYWN0UGFydHModmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGogPSAwOyBqIDwgcGFydHMubGVuZ3RoOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGogJiAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPZGQgaW5kZXhlcyBhcmUgSUNVIGV4cHJlc3Npb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpY3VFeHByZXNzaW9uID0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcnRzW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWZXJpZnkgdGhhdCBJQ1UgZXhwcmVzc2lvbiBoYXMgdGhlIHJpZ2h0IHNoYXBlLiBUcmFuc2xhdGlvbnMgbWlnaHQgY29udGFpbiBpbnZhbGlkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb25zdHJ1Y3Rpb25zICh3aGlsZSBvcmlnaW5hbCBtZXNzYWdlcyB3ZXJlIGNvcnJlY3QpLCBzbyBJQ1UgcGFyc2luZyBhdCBydW50aW1lIG1heQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHN1Y2NlZWQgKHRodXMgYGljdUV4cHJlc3Npb25gIHJlbWFpbnMgYSBzdHJpbmcpLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpY3VFeHByZXNzaW9uICE9PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIHBhcnNlIElDVSBleHByZXNzaW9uIGluICIke3RlbXBsYXRlVHJhbnNsYXRpb259IiBtZXNzYWdlLmApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tZW50IG5vZGUgdGhhdCB3aWxsIGFuY2hvciB0aGUgSUNVIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGljdU5vZGVJbmRleCA9IGFsbG9jTm9kZUluZGV4KHN0YXJ0SW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlT3BDb2Rlcy5wdXNoKENPTU1FTlRfTUFSS0VSLCBuZ0Rldk1vZGUgPyBgSUNVICR7aWN1Tm9kZUluZGV4fWAgOiAnJywgaWN1Tm9kZUluZGV4LCBwYXJlbnRJbmRleCA8PCAxNyAvKiBTSElGVF9QQVJFTlQgKi8gfCAxIC8qIEFwcGVuZENoaWxkICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBjb2RlcyBmb3IgdGhlIElDVSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXNrID0gZ2V0QmluZGluZ01hc2soaWN1RXhwcmVzc2lvbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3VTdGFydChpY3VFeHByZXNzaW9ucywgaWN1RXhwcmVzc2lvbiwgaWN1Tm9kZUluZGV4LCBpY3VOb2RlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyByZWN1cnNpdmUsIHRoZSBsYXN0IFRJY3UgdGhhdCB3YXMgcHVzaGVkIGlzIHRoZSBvbmUgd2Ugd2FudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdEljdUluZGV4ID0gaWN1RXhwcmVzc2lvbnMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9wQ29kZXMucHVzaCh0b01hc2tCaXQoaWN1RXhwcmVzc2lvbi5tYWluQmluZGluZyksIC8vIG1hc2sgb2YgdGhlIG1haW4gYmluZGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgMywgLy8gc2tpcCAzIG9wQ29kZXMgaWYgbm90IGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xIC0gaWN1RXhwcmVzc2lvbi5tYWluQmluZGluZywgaWN1Tm9kZUluZGV4IDw8IDIgLyogU0hJRlRfUkVGICovIHwgMiAvKiBJY3VTd2l0Y2ggKi8sIHRJY3VJbmRleCwgbWFzaywgLy8gbWFzayBvZiBhbGwgdGhlIGJpbmRpbmdzIG9mIHRoaXMgSUNVIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIsIC8vIHNraXAgMiBvcENvZGVzIGlmIG5vdCBjaGFuZ2VkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3VOb2RlSW5kZXggPDwgMiAvKiBTSElGVF9SRUYgKi8gfCAzIC8qIEljdVVwZGF0ZSAqLywgdEljdUluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJ0c1tqXSAhPT0gJycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAocGFydHNbal0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV2ZW4gaW5kZXhlcyBhcmUgdGV4dCAoaW5jbHVkaW5nIGJpbmRpbmdzKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzQmluZGluZyA9IHRleHQubWF0Y2goQklORElOR19SRUdFWFApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRleHQgbm9kZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlSW5kZXggPSBhbGxvY05vZGVJbmRleChzdGFydEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU9wQ29kZXMucHVzaCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgYmluZGluZywgdGhlIHZhbHVlIHdpbGwgYmUgc2V0IGR1cmluZyB1cGRhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc0JpbmRpbmcgPyAnJyA6IHRleHQsIHRleHROb2RlSW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRBbGxUb0FycmF5KGdlbmVyYXRlQmluZGluZ1VwZGF0ZU9wQ29kZXModGV4dCwgdGV4dE5vZGVJbmRleCksIHVwZGF0ZU9wQ29kZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmIChpMThuVmFyc0NvdW50ID4gMCkgewogICAgICAgICAgICBhbGxvY0V4cGFuZG8odFZpZXcsIGxWaWV3LCBpMThuVmFyc0NvdW50KTsKICAgICAgICB9CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGF0dGFjaEkxOG5PcENvZGVzRGVidWcoY3JlYXRlT3BDb2RlcywgdXBkYXRlT3BDb2RlcywgaWN1RXhwcmVzc2lvbnMubGVuZ3RoID8gaWN1RXhwcmVzc2lvbnMgOiBudWxsLCBsVmlldyk7CiAgICAgICAgLy8gTk9URTogbG9jYWwgdmFyIG5lZWRlZCB0byBwcm9wZXJseSBhc3NlcnQgdGhlIHR5cGUgb2YgYFRJMThuYC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdEkxOG4gPSB7CiAgICAgICAgICAgIHZhcnM6IGkxOG5WYXJzQ291bnQsCiAgICAgICAgICAgIGNyZWF0ZTogY3JlYXRlT3BDb2RlcywKICAgICAgICAgICAgdXBkYXRlOiB1cGRhdGVPcENvZGVzLAogICAgICAgICAgICBpY3VzOiBpY3VFeHByZXNzaW9ucy5sZW5ndGggPyBpY3VFeHByZXNzaW9ucyA6IG51bGwsCiAgICAgICAgfTsKICAgICAgICB0Vmlldy5kYXRhW2luZGV4ICsgSEVBREVSX09GRlNFVF0gPSB0STE4bjsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBwYXJlbnRUTm9kZQogICAgICogQHBhcmFtIHs/fSBwcmV2aW91c1ROb2RlCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBlbmRJMThuTm9kZSh0VmlldywgdE5vZGUsIHBhcmVudFROb2RlLCBwcmV2aW91c1ROb2RlLCBsVmlldykgewogICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJNb3ZlTm9kZSsrOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IHROb2RlLm5leHQ7CiAgICAgICAgaWYgKCFwcmV2aW91c1ROb2RlKSB7CiAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBwYXJlbnRUTm9kZTsKICAgICAgICB9CiAgICAgICAgLy8gUmUtb3JnYW5pemUgbm9kZSB0cmVlIHRvIHB1dCB0aGlzIG5vZGUgaW4gdGhlIGNvcnJlY3QgcG9zaXRpb24uCiAgICAgICAgaWYgKHByZXZpb3VzVE5vZGUgPT09IHBhcmVudFROb2RlICYmIHROb2RlICE9PSBwYXJlbnRUTm9kZS5jaGlsZCkgewogICAgICAgICAgICB0Tm9kZS5uZXh0ID0gcGFyZW50VE5vZGUuY2hpbGQ7CiAgICAgICAgICAgIHBhcmVudFROb2RlLmNoaWxkID0gdE5vZGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHByZXZpb3VzVE5vZGUgIT09IHBhcmVudFROb2RlICYmIHROb2RlICE9PSBwcmV2aW91c1ROb2RlLm5leHQpIHsKICAgICAgICAgICAgdE5vZGUubmV4dCA9IHByZXZpb3VzVE5vZGUubmV4dDsKICAgICAgICAgICAgcHJldmlvdXNUTm9kZS5uZXh0ID0gdE5vZGU7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICB0Tm9kZS5uZXh0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKHBhcmVudFROb2RlICE9PSBsVmlld1tUX0hPU1RdKSB7CiAgICAgICAgICAgIHROb2RlLnBhcmVudCA9ICgvKiogQHR5cGUgez99ICovIChwYXJlbnRUTm9kZSkpOwogICAgICAgIH0KICAgICAgICAvLyBJZiB0Tm9kZSB3YXMgbW92ZWQgYXJvdW5kLCB3ZSBtaWdodCBuZWVkIHRvIGZpeCBhIGJyb2tlbiBsaW5rLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY3Vyc29yID0gdE5vZGUubmV4dDsKICAgICAgICB3aGlsZSAoY3Vyc29yKSB7CiAgICAgICAgICAgIGlmIChjdXJzb3IubmV4dCA9PT0gdE5vZGUpIHsKICAgICAgICAgICAgICAgIGN1cnNvci5uZXh0ID0gbmV4dE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY3Vyc29yID0gY3Vyc29yLm5leHQ7CiAgICAgICAgfQogICAgICAgIC8vIElmIHRoZSBwbGFjZWhvbGRlciB0byBhcHBlbmQgaXMgYSBwcm9qZWN0aW9uLCB3ZSBuZWVkIHRvIG1vdmUgdGhlIHByb2plY3RlZCBub2RlcyBpbnN0ZWFkCiAgICAgICAgaWYgKHROb2RlLnR5cGUgPT09IDEgLyogUHJvamVjdGlvbiAqLykgewogICAgICAgICAgICBhcHBseVByb2plY3Rpb24odFZpZXcsIGxWaWV3LCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSk7CiAgICAgICAgICAgIHJldHVybiB0Tm9kZTsKICAgICAgICB9CiAgICAgICAgYXBwZW5kQ2hpbGQodFZpZXcsIGxWaWV3LCBnZXROYXRpdmVCeVROb2RlKHROb2RlLCBsVmlldyksIHROb2RlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2xvdFZhbHVlID0gbFZpZXdbdE5vZGUuaW5kZXhdOwogICAgICAgIGlmICh0Tm9kZS50eXBlICE9PSAwIC8qIENvbnRhaW5lciAqLyAmJiBpc0xDb250YWluZXIoc2xvdFZhbHVlKSkgewogICAgICAgICAgICAvLyBOb2RlcyB0aGF0IGluamVjdCBWaWV3Q29udGFpbmVyUmVmIGFsc28gaGF2ZSBhIGNvbW1lbnQgbm9kZSB0aGF0IHNob3VsZCBiZSBtb3ZlZAogICAgICAgICAgICBhcHBlbmRDaGlsZCh0VmlldywgbFZpZXcsIHNsb3RWYWx1ZVtOQVRJVkVdLCB0Tm9kZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0Tm9kZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdWJUZW1wbGF0ZUluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1Jvb3RUZW1wbGF0ZU1lc3NhZ2Uoc3ViVGVtcGxhdGVJbmRleCkgewogICAgICAgIHJldHVybiBzdWJUZW1wbGF0ZUluZGV4ID09PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEhhbmRsZXMgbWVzc2FnZSBzdHJpbmcgcG9zdC1wcm9jZXNzaW5nIGZvciBpbnRlcm5hdGlvbmFsaXphdGlvbi4KICAgICAqCiAgICAgKiBIYW5kbGVzIG1lc3NhZ2Ugc3RyaW5nIHBvc3QtcHJvY2Vzc2luZyBieSB0cmFuc2Zvcm1pbmcgaXQgZnJvbSBpbnRlcm1lZGlhdGUKICAgICAqIGZvcm1hdCAodGhhdCBtaWdodCBjb250YWluIHNvbWUgbWFya2VycyB0aGF0IHdlIG5lZWQgdG8gcmVwbGFjZSkgdG8gdGhlIGZpbmFsCiAgICAgKiBmb3JtLCBjb25zdW1hYmxlIGJ5IGkxOG5TdGFydCBpbnN0cnVjdGlvbi4gUG9zdCBwcm9jZXNzaW5nIHN0ZXBzIGluY2x1ZGU6CiAgICAgKgogICAgICogMS4gUmVzb2x2ZSBhbGwgbXVsdGktdmFsdWUgY2FzZXMgKGxpa2UgW++/vSoxOjHvv73vv70jMjox77+9fO+/vSM0OjHvv71877+9Ne+/vV0pCiAgICAgKiAyLiBSZXBsYWNlIGFsbCBJQ1UgdmFycyAobGlrZSAiVkFSX1BMVVJBTCIpCiAgICAgKiAzLiBSZXBsYWNlIGFsbCBwbGFjZWhvbGRlcnMgdXNlZCBpbnNpZGUgSUNVcyBpbiBhIGZvcm0gb2Yge1BMQUNFSE9MREVSfQogICAgICogNC4gUmVwbGFjZSBhbGwgSUNVIHJlZmVyZW5jZXMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyAobGlrZSDvv71JQ1VfRVhQX0lDVV8x77+9KQogICAgICogICAgaW4gY2FzZSBtdWx0aXBsZSBJQ1VzIGhhdmUgdGhlIHNhbWUgcGxhY2Vob2xkZXIgbmFtZQogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlIFJhdyB0cmFuc2xhdGlvbiBzdHJpbmcgZm9yIHBvc3QgcHJvY2Vzc2luZwogICAgICogQHBhcmFtIHs/PX0gcmVwbGFjZW1lbnRzIFNldCBvZiByZXBsYWNlbWVudHMgdGhhdCBzaG91bGQgYmUgYXBwbGllZAogICAgICoKICAgICAqIEByZXR1cm4gez99IFRyYW5zZm9ybWVkIHN0cmluZyB0aGF0IGNhbiBiZSBjb25zdW1lZCBieSBpMThuU3RhcnQgaW5zdHJ1Y3Rpb24KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVpMThuUG9zdHByb2Nlc3MobWVzc2FnZSwgcmVwbGFjZW1lbnRzID0ge30pIHsKICAgICAgICAvKioKICAgICAgICAgKiBTdGVwIDE6IHJlc29sdmUgYWxsIG11bHRpLXZhbHVlIHBsYWNlaG9sZGVycyBsaWtlIFvvv70jNe+/vXzvv70qMTox77+977+9IzI6Me+/vXzvv70jNDox77+9XQogICAgICAgICAqCiAgICAgICAgICogTm90ZTogZHVlIHRvIHRoZSB3YXkgd2UgcHJvY2VzcyBuZXN0ZWQgdGVtcGxhdGVzIChCRlMpLCBtdWx0aS12YWx1ZSBwbGFjZWhvbGRlcnMgYXJlIHR5cGljYWxseQogICAgICAgICAqIGdyb3VwZWQgYnkgdGVtcGxhdGVzLCBmb3IgZXhhbXBsZTogW++/vSM177+9fO+/vSM277+9fO+/vSMxOjHvv71877+9IzM6Mu+/vV0gd2hlcmUg77+9IzXvv70gYW5kIO+/vSM277+9IGJlbG9uZyB0byByb290CiAgICAgICAgICogdGVtcGxhdGUsIO+/vSMxOjHvv70gYmVsb25nIHRvIG5lc3RlZCB0ZW1wbGF0ZSB3aXRoIGluZGV4IDEgYW5kIO+/vSMxOjLvv70gLSBuZXN0ZWQgdGVtcGxhdGUgd2l0aCBpbmRleAogICAgICAgICAqIDMuIEhvd2V2ZXIgaW4gcmVhbCB0ZW1wbGF0ZXMgdGhlIG9yZGVyIG1pZ2h0IGJlIGRpZmZlcmVudDogaS5lLiDvv70jMTox77+9IGFuZC9vciDvv70jMzoy77+9IG1heSBnbyBpbgogICAgICAgICAqIGZyb250IG9mIO+/vSM277+9LiBUaGUgcG9zdCBwcm9jZXNzaW5nIHN0ZXAgcmVzdG9yZXMgdGhlIHJpZ2h0IG9yZGVyIGJ5IGtlZXBpbmcgdHJhY2sgb2YgdGhlCiAgICAgICAgICogdGVtcGxhdGUgaWQgc3RhY2sgYW5kIGxvb2tzIGZvciBwbGFjZWhvbGRlcnMgdGhhdCBiZWxvbmcgdG8gdGhlIGN1cnJlbnRseSBhY3RpdmUgdGVtcGxhdGUuCiAgICAgICAgICogQHR5cGUgez99CiAgICAgICAgICovCiAgICAgICAgbGV0IHJlc3VsdCA9IG1lc3NhZ2U7CiAgICAgICAgaWYgKFBQX01VTFRJX1ZBTFVFX1BMQUNFSE9MREVSU19SRUdFWFAudGVzdChtZXNzYWdlKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGNoZXMgPSB7fTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZUlkc1N0YWNrID0gW1JPT1RfVEVNUExBVEVfSURdOwogICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9QTEFDRUhPTERFUlNfUkVHRVhQLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbQogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBocwogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRtcGwKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChtLCBwaHMsIHRtcGwpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBwaHMgfHwgdG1wbDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVycyA9IG1hdGNoZXNbY29udGVudF0gfHwgW107CiAgICAgICAgICAgICAgICBpZiAoIXBsYWNlaG9sZGVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZW50LnNwbGl0KCd8JykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGFjZWhvbGRlcgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKHBsYWNlaG9sZGVyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBwbGFjZWhvbGRlci5tYXRjaChQUF9URU1QTEFURV9JRF9SRUdFWFApOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRlbXBsYXRlSWQgPSBtYXRjaCA/IHBhcnNlSW50KG1hdGNoWzFdLCAxMCkgOiBST09UX1RFTVBMQVRFX0lEOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzQ2xvc2VUZW1wbGF0ZVRhZyA9IFBQX0NMT1NFX1RFTVBMQVRFX1JFR0VYUC50ZXN0KHBsYWNlaG9sZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2Vob2xkZXJzLnB1c2goW3RlbXBsYXRlSWQsIGlzQ2xvc2VUZW1wbGF0ZVRhZywgcGxhY2Vob2xkZXJdKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1tjb250ZW50XSA9IHBsYWNlaG9sZGVyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcGxhY2Vob2xkZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgaTE4biBwb3N0cHJvY2VzczogdW5tYXRjaGVkIHBsYWNlaG9sZGVyIC0gJHtjb250ZW50fWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFRlbXBsYXRlSWQgPSB0ZW1wbGF0ZUlkc1N0YWNrW3RlbXBsYXRlSWRzU3RhY2subGVuZ3RoIC0gMV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgaWR4ID0gMDsKICAgICAgICAgICAgICAgIC8vIGZpbmQgcGxhY2Vob2xkZXIgaW5kZXggdGhhdCBtYXRjaGVzIGN1cnJlbnQgdGVtcGxhdGUgaWQKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcGxhY2Vob2xkZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWNlaG9sZGVyc1tpXVswXSA9PT0gY3VycmVudFRlbXBsYXRlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWR4ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gdXBkYXRlIHRlbXBsYXRlIGlkIHN0YWNrIGJhc2VkIG9uIHRoZSBjdXJyZW50IHRhZyBleHRyYWN0ZWQKICAgICAgICAgICAgICAgIGNvbnN0IFt0ZW1wbGF0ZUlkLCBpc0Nsb3NlVGVtcGxhdGVUYWcsIHBsYWNlaG9sZGVyXSA9IHBsYWNlaG9sZGVyc1tpZHhdOwogICAgICAgICAgICAgICAgaWYgKGlzQ2xvc2VUZW1wbGF0ZVRhZykgewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWRzU3RhY2sucG9wKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50VGVtcGxhdGVJZCAhPT0gdGVtcGxhdGVJZCkgewogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlSWRzU3RhY2sucHVzaCh0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBwcm9jZXNzZWQgdGFnIGZyb20gdGhlIGxpc3QKICAgICAgICAgICAgICAgIHBsYWNlaG9sZGVycy5zcGxpY2UoaWR4LCAxKTsKICAgICAgICAgICAgICAgIHJldHVybiBwbGFjZWhvbGRlcjsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvLyByZXR1cm4gY3VycmVudCByZXN1bHQgaWYgbm8gcmVwbGFjZW1lbnRzIHNwZWNpZmllZAogICAgICAgIGlmICghT2JqZWN0LmtleXMocmVwbGFjZW1lbnRzKS5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3RlcCAyOiByZXBsYWNlIGFsbCBJQ1UgdmFycyAobGlrZSAiVkFSX1BMVVJBTCIpCiAgICAgICAgICovCiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoUFBfSUNVX1ZBUlNfUkVHRVhQLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICAgICAqIEBwYXJhbSB7P30gc3RhcnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEBwYXJhbSB7P30gX3R5cGUKICAgICAgICAgKiBAcGFyYW0gez99IF9pZHgKICAgICAgICAgKiBAcGFyYW0gez99IGVuZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG1hdGNoLCBzdGFydCwga2V5LCBfdHlwZSwgX2lkeCwgZW5kKSA9PiB7CiAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudHMuaGFzT3duUHJvcGVydHkoa2V5KSA/IGAke3N0YXJ0fSR7cmVwbGFjZW1lbnRzW2tleV19JHtlbmR9YCA6IG1hdGNoOwogICAgICAgIH0pKTsKICAgICAgICAvKioKICAgICAgICAgKiBTdGVwIDM6IHJlcGxhY2UgYWxsIHBsYWNlaG9sZGVycyB1c2VkIGluc2lkZSBJQ1VzIGluIGEgZm9ybSBvZiB7UExBQ0VIT0xERVJ9CiAgICAgICAgICovCiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnJlcGxhY2UoUFBfSUNVX1BMQUNFSE9MREVSU19SRUdFWFAsICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1hdGNoCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtYXRjaCwga2V5KSA9PiB7CiAgICAgICAgICAgIHJldHVybiByZXBsYWNlbWVudHMuaGFzT3duUHJvcGVydHkoa2V5KSA/ICgvKiogQHR5cGUgez99ICovIChyZXBsYWNlbWVudHNba2V5XSkpIDogbWF0Y2g7CiAgICAgICAgfSkpOwogICAgICAgIC8qKgogICAgICAgICAqIFN0ZXAgNDogcmVwbGFjZSBhbGwgSUNVIHJlZmVyZW5jZXMgd2l0aCBjb3JyZXNwb25kaW5nIHZhbHVlcyAobGlrZSDvv71JQ1VfRVhQX0lDVV8x77+9KSBpbiBjYXNlCiAgICAgICAgICogbXVsdGlwbGUgSUNVcyBoYXZlIHRoZSBzYW1lIHBsYWNlaG9sZGVyIG5hbWUKICAgICAgICAgKi8KICAgICAgICByZXN1bHQgPSByZXN1bHQucmVwbGFjZShQUF9JQ1VTX1JFR0VYUCwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWF0Y2gKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKG1hdGNoLCBrZXkpID0+IHsKICAgICAgICAgICAgaWYgKHJlcGxhY2VtZW50cy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlcGxhY2VtZW50c1trZXldKSk7CiAgICAgICAgICAgICAgICBpZiAoIWxpc3QubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBpMThuIHBvc3Rwcm9jZXNzOiB1bm1hdGNoZWQgSUNVIC0gJHttYXRjaH0gd2l0aCBrZXk6ICR7a2V5fWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChsaXN0LnNoaWZ0KCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbWF0Y2g7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIFRyYW5zbGF0ZXMgYSB0cmFuc2xhdGlvbiBibG9jayBtYXJrZWQgYnkgYGkxOG5TdGFydGAgYW5kIGBpMThuRW5kYC4gSXQgaW5zZXJ0cyB0aGUgdGV4dC9JQ1Ugbm9kZXMKICAgICAqIGludG8gdGhlIHJlbmRlciB0cmVlLCBtb3ZlcyB0aGUgcGxhY2Vob2xkZXIgbm9kZXMgYW5kIHJlbW92ZXMgdGhlIGRlbGV0ZWQgbm9kZXMuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1aTE4bkVuZCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodFZpZXcsIGB0VmlldyBzaG91bGQgYmUgZGVmaW5lZGApOwogICAgICAgIGkxOG5FbmRGaXJzdFBhc3ModFZpZXcsIGxWaWV3KTsKICAgICAgICAvLyBTdG9wIGRlbGF5aW5nIHByb2plY3Rpb25zCiAgICAgICAgc2V0RGVsYXlQcm9qZWN0aW9uKGZhbHNlKTsKICAgIH0KICAgIC8qKgogICAgICogU2VlIGBpMThuRW5kYCBhYm92ZS4KICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGkxOG5FbmRGaXJzdFBhc3ModFZpZXcsIGxWaWV3KSB7CiAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgIGFzc2VydEVxdWFsKGdldEJpbmRpbmdJbmRleCgpLCB0Vmlldy5iaW5kaW5nU3RhcnRJbmRleCwgJ2kxOG5FbmQgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgYW55IGJpbmRpbmcnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgcm9vdEluZGV4ID0gaTE4bkluZGV4U3RhY2tbaTE4bkluZGV4U3RhY2tQb2ludGVyLS1dOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0STE4biA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5kYXRhW3Jvb3RJbmRleCArIEhFQURFUl9PRkZTRVRdKSk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQodEkxOG4sIGBZb3Ugc2hvdWxkIGNhbGwgaTE4blN0YXJ0IGJlZm9yZSBpMThuRW5kYCk7CiAgICAgICAgLy8gRmluZCB0aGUgbGFzdCBub2RlIHRoYXQgd2FzIGFkZGVkIGJlZm9yZSBgaTE4bkVuZGAKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGFzdENyZWF0ZWROb2RlID0gZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCk7CiAgICAgICAgLy8gUmVhZCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGluc2VydC9tb3ZlL3JlbW92ZSBET00gZWxlbWVudHMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmlzaXRlZE5vZGVzID0gcmVhZENyZWF0ZU9wQ29kZXMocm9vdEluZGV4LCB0STE4bi5jcmVhdGUsIHRWaWV3LCBsVmlldyk7CiAgICAgICAgLy8gUmVtb3ZlIGRlbGV0ZWQgbm9kZXMKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluZGV4ID0gcm9vdEluZGV4ICsgMTsKICAgICAgICB3aGlsZSAoaW5kZXggPD0gbGFzdENyZWF0ZWROb2RlLmluZGV4IC0gSEVBREVSX09GRlNFVCkgewogICAgICAgICAgICBpZiAodmlzaXRlZE5vZGVzLmluZGV4T2YoaW5kZXgpID09PSAtMSkgewogICAgICAgICAgICAgICAgcmVtb3ZlTm9kZSh0VmlldywgbFZpZXcsIGluZGV4LCAvKiBtYXJrQXNEZXRhY2hlZCAqLyB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDaGVjayBpZiBhbiBlbGVtZW50IGhhcyBhbnkgbG9jYWwgcmVmcyBhbmQgc2tpcCB0aGVtCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRUTm9kZSh0VmlldywgaW5kZXgpOwogICAgICAgICAgICBpZiAodE5vZGUgJiYKICAgICAgICAgICAgICAgICh0Tm9kZS50eXBlID09PSAwIC8qIENvbnRhaW5lciAqLyB8fCB0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gfHwKICAgICAgICAgICAgICAgICAgICB0Tm9kZS50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8pICYmCiAgICAgICAgICAgICAgICB0Tm9kZS5sb2NhbE5hbWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBEaXZpZGUgYnkgMiB0byBnZXQgdGhlIG51bWJlciBvZiBsb2NhbCByZWZzLAogICAgICAgICAgICAgICAgLy8gc2luY2UgdGhleSBhcmUgc3RvcmVkIGFzIGFuIGFycmF5IHRoYXQgYWxzbyBpbmNsdWRlcyBkaXJlY3RpdmUgaW5kZXhlcywKICAgICAgICAgICAgICAgIC8vIGkuZS4gWyJsb2NhbFJlZiIsIGRpcmVjdGl2ZUluZGV4LCAuLi5dCiAgICAgICAgICAgICAgICBpbmRleCArPSB0Tm9kZS5sb2NhbE5hbWVzLmxlbmd0aCA+PiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGluZGV4Kys7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuZCBzdG9yZXMgdGhlIGR5bmFtaWMgVE5vZGUsIGFuZCB1bmhvb2tzIGl0IGZyb20gdGhlIHRyZWUgZm9yIG5vdy4KICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBuYXRpdmUKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlRHluYW1pY05vZGVBdEluZGV4KHRWaWV3LCBsVmlldywgaW5kZXgsIHR5cGUsIG5hdGl2ZSwgbmFtZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c09yUGFyZW50VE5vZGUgPSBnZXRQcmV2aW91c09yUGFyZW50VE5vZGUoKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGF0YUluUmFuZ2UobFZpZXcsIGluZGV4ICsgSEVBREVSX09GRlNFVCk7CiAgICAgICAgbFZpZXdbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9IG5hdGl2ZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdE5vZGUgPSBnZXRPckNyZWF0ZVROb2RlKHRWaWV3LCBsVmlld1tUX0hPU1RdLCBpbmRleCwgKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSwgbmFtZSwgbnVsbCk7CiAgICAgICAgLy8gV2UgYXJlIGNyZWF0aW5nIGEgZHluYW1pYyBub2RlLCB0aGUgcHJldmlvdXMgdE5vZGUgbWlnaHQgbm90IGJlIHBvaW50aW5nIGF0IHRoaXMgbm9kZS4KICAgICAgICAvLyBXZSB3aWxsIGxpbmsgb3Vyc2VsdmVzIGludG8gdGhlIHRyZWUgbGF0ZXIgd2l0aCBgYXBwZW5kSTE4bk5vZGVgLgogICAgICAgIGlmIChwcmV2aW91c09yUGFyZW50VE5vZGUgJiYgcHJldmlvdXNPclBhcmVudFROb2RlLm5leHQgPT09IHROb2RlKSB7CiAgICAgICAgICAgIHByZXZpb3VzT3JQYXJlbnRUTm9kZS5uZXh0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHROb2RlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IGNyZWF0ZU9wQ29kZXMKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlYWRDcmVhdGVPcENvZGVzKGluZGV4LCBjcmVhdGVPcENvZGVzLCB0VmlldywgbFZpZXcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVuZGVyZXIgPSBsVmlld1tSRU5ERVJFUl07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjdXJyZW50VE5vZGUgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcHJldmlvdXNUTm9kZSA9IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZpc2l0ZWROb2RlcyA9IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY3JlYXRlT3BDb2Rlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wQ29kZSA9IGNyZWF0ZU9wQ29kZXNbaV07CiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BDb2RlID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0Uk5vZGUgPSBjcmVhdGVUZXh0Tm9kZShvcENvZGUsIHJlbmRlcmVyKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRleHROb2RlSW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYgbmdEZXZNb2RlLnJlbmRlcmVyQ3JlYXRlVGV4dE5vZGUrKzsKICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGU7CiAgICAgICAgICAgICAgICBjdXJyZW50VE5vZGUgPQogICAgICAgICAgICAgICAgICAgIGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleCh0VmlldywgbFZpZXcsIHRleHROb2RlSW5kZXgsIDMgLyogRWxlbWVudCAqLywgdGV4dFJOb2RlLCBudWxsKTsKICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKHRleHROb2RlSW5kZXgpOwogICAgICAgICAgICAgICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb3BDb2RlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG9wQ29kZSAmIDcgLyogTUFTS19PUENPREUgKi8pIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIDEgLyogQXBwZW5kQ2hpbGQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzdGluYXRpb25Ob2RlSW5kZXggPSBvcENvZGUgPj4+IDE3IC8qIFNISUZUX1BBUkVOVCAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZGVzdGluYXRpb25UTm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc3RpbmF0aW9uTm9kZUluZGV4ID09PSBpbmRleCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIGRlc3RpbmF0aW9uIG5vZGUgaXMgYGkxOG5TdGFydGAsIHdlIGRvbid0IGhhdmUgYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG9wLWxldmVsIG5vZGUgYW5kIHdlIHNob3VsZCB1c2UgdGhlIGhvc3Qgbm9kZSBpbnN0ZWFkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvblROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1RfSE9TVF0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uVE5vZGUgPSBnZXRUTm9kZSh0VmlldywgZGVzdGluYXRpb25Ob2RlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RGVmaW5lZCgoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudFROb2RlKSksIGBZb3UgbmVlZCB0byBjcmVhdGUgb3Igc2VsZWN0IGEgbm9kZSBiZWZvcmUgeW91IGNhbiBpbnNlcnQgaXQgaW50byB0aGUgRE9NYCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBwZW5kSTE4bk5vZGUodFZpZXcsICgvKiogQHR5cGUgez99ICovIChjdXJyZW50VE5vZGUpKSwgZGVzdGluYXRpb25UTm9kZSwgcHJldmlvdXNUTm9kZSwgbFZpZXcpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDAgLyogU2VsZWN0ICovOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBpbmRpY2llcyBpbmRpY2F0ZSB0aGF0IGEgZ2l2ZW4gVE5vZGUgaXMgYSBzaWJsaW5nIG5vZGUsIG5vdCBhIHBhcmVudCBub2RlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIChzZWUgYGkxOG5TdGFydEZpcnN0UGFzc2AgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24pLgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGlzUGFyZW50ID0gb3BDb2RlID49IDA7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gKGlzUGFyZW50ID8gb3BDb2RlIDogfm9wQ29kZSkgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkTm9kZXMucHVzaChub2RlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmV2aW91c1ROb2RlID0gY3VycmVudFROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50VE5vZGUgPSBnZXRUTm9kZSh0Vmlldywgbm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRUTm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKGN1cnJlbnRUTm9kZSwgaXNQYXJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgNSAvKiBFbGVtZW50RW5kICovOgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJbmRleCA9IG9wQ29kZSA+Pj4gMyAvKiBTSElGVF9SRUYgKi87CiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGUgPSBnZXRUTm9kZSh0VmlldywgZWxlbWVudEluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0UHJldmlvdXNPclBhcmVudFROb2RlKGN1cnJlbnRUTm9kZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDQgLyogQXR0ciAqLzoKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50Tm9kZUluZGV4ID0gb3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdHRyVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29kZSBpcyB1c2VkIGZvciBJQ1UgZXhwcmVzc2lvbnMgb25seSwgc2luY2Ugd2UgZG9uJ3Qgc3VwcG9ydAogICAgICAgICAgICAgICAgICAgICAgICAvLyBkaXJlY3RpdmVzL2NvbXBvbmVudHMgaW4gSUNVcywgd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCBpbnB1dHMgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50QXR0cmlidXRlSW50ZXJuYWwoZ2V0VE5vZGUodFZpZXcsIGVsZW1lbnROb2RlSW5kZXgpLCBsVmlldywgYXR0ck5hbWUsIGF0dHJWYWx1ZSwgbnVsbCwgbnVsbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGRldGVybWluZSB0aGUgdHlwZSBvZiBtdXRhdGUgb3BlcmF0aW9uIGZvciAiJHtvcENvZGV9ImApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3dpdGNoIChvcENvZGUpIHsKICAgICAgICAgICAgICAgICAgICBjYXNlIENPTU1FTlRfTUFSS0VSOgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbW1lbnRWYWx1ZSA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50Tm9kZUluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNyZWF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgICAgICAgICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydEVxdWFsKHR5cGVvZiBjb21tZW50VmFsdWUsICdzdHJpbmcnLCBgRXhwZWN0ZWQgIiR7Y29tbWVudFZhbHVlfSIgdG8gYmUgYSBjb21tZW50IG5vZGUgdmFsdWVgKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21tZW50Uk5vZGUgPSByZW5kZXJlci5jcmVhdGVDb21tZW50KGNvbW1lbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJDcmVhdGVDb21tZW50Kys7CiAgICAgICAgICAgICAgICAgICAgICAgIHByZXZpb3VzVE5vZGUgPSBjdXJyZW50VE5vZGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRUTm9kZSA9IGNyZWF0ZUR5bmFtaWNOb2RlQXRJbmRleCh0VmlldywgbFZpZXcsIGNvbW1lbnROb2RlSW5kZXgsIDUgLyogSWN1Q29udGFpbmVyICovLCBjb21tZW50Uk5vZGUsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB2aXNpdGVkTm9kZXMucHVzaChjb21tZW50Tm9kZUluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoUGF0Y2hEYXRhKGNvbW1lbnRSTm9kZSwgbFZpZXcpOwogICAgICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRUTm9kZSkpKS5hY3RpdmVDYXNlSW5kZXggPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSB3aWxsIGFkZCB0aGUgY2FzZSBub2RlcyBsYXRlciwgZHVyaW5nIHRoZSB1cGRhdGUgcGhhc2UKICAgICAgICAgICAgICAgICAgICAgICAgc2V0SXNOb3RQYXJlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSBFTEVNRU5UX01BUktFUjoKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdOYW1lVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlT3BDb2Rlc1srK2ldKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudE5vZGVJbmRleCA9ICgvKiogQHR5cGUgez99ICovIChjcmVhdGVPcENvZGVzWysraV0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbCh0eXBlb2YgdGFnTmFtZVZhbHVlLCAnc3RyaW5nJywgYEV4cGVjdGVkICIke3RhZ05hbWVWYWx1ZX0iIHRvIGJlIGFuIGVsZW1lbnQgbm9kZSB0YWcgbmFtZWApOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSTm9kZSA9IHJlbmRlcmVyLmNyZWF0ZUVsZW1lbnQodGFnTmFtZVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmIG5nRGV2TW9kZS5yZW5kZXJlckNyZWF0ZUVsZW1lbnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNUTm9kZSA9IGN1cnJlbnRUTm9kZTsKICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFROb2RlID0gY3JlYXRlRHluYW1pY05vZGVBdEluZGV4KHRWaWV3LCBsVmlldywgZWxlbWVudE5vZGVJbmRleCwgMyAvKiBFbGVtZW50ICovLCBlbGVtZW50Uk5vZGUsIHRhZ05hbWVWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpc2l0ZWROb2Rlcy5wdXNoKGVsZW1lbnROb2RlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBkZXRlcm1pbmUgdGhlIHR5cGUgb2YgbXV0YXRlIG9wZXJhdGlvbiBmb3IgIiR7b3BDb2RlfSJgKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRJc05vdFBhcmVudCgpOwogICAgICAgIHJldHVybiB2aXNpdGVkTm9kZXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdXBkYXRlT3BDb2RlcwogICAgICogQHBhcmFtIHs/fSBpY3VzCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdzU3RhcnRJbmRleAogICAgICogQHBhcmFtIHs/fSBjaGFuZ2VNYXNrCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez89fSBieXBhc3NDaGVja0JpdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVhZFVwZGF0ZU9wQ29kZXModXBkYXRlT3BDb2RlcywgaWN1cywgYmluZGluZ3NTdGFydEluZGV4LCBjaGFuZ2VNYXNrLCB0VmlldywgbFZpZXcsIGJ5cGFzc0NoZWNrQml0ID0gZmFsc2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNhc2VDcmVhdGVkID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB1cGRhdGVPcENvZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIGJpdCBjb2RlIHRvIGNoZWNrIGlmIHdlIHNob3VsZCBhcHBseSB0aGUgbmV4dCB1cGRhdGUKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaGVja0JpdCA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzW2ldKSk7CiAgICAgICAgICAgIC8vIE51bWJlciBvZiBvcENvZGVzIHRvIHNraXAgdW50aWwgbmV4dCBzZXQgb2YgdXBkYXRlIGNvZGVzCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2tpcENvZGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHVwZGF0ZU9wQ29kZXNbKytpXSkpOwogICAgICAgICAgICBpZiAoYnlwYXNzQ2hlY2tCaXQgfHwgKGNoZWNrQml0ICYgY2hhbmdlTWFzaykpIHsKICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBoYXMgYmVlbiB1cGRhdGVkIHNpbmNlIGxhc3QgY2hlY2tlZAogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gJyc7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gaSArIDE7IGogPD0gKGkgKyBza2lwQ29kZXMpOyBqKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3BDb2RlID0gdXBkYXRlT3BDb2Rlc1tqXTsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9wQ29kZSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSBvcENvZGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBvcENvZGUgPT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wQ29kZSA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0J3MgYSBiaW5kaW5nIGluZGV4IHdob3NlIHZhbHVlIGlzIG5lZ2F0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSArPSByZW5kZXJTdHJpbmdpZnkobFZpZXdbYmluZGluZ3NTdGFydEluZGV4IC0gb3BDb2RlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBub2RlSW5kZXggPSBvcENvZGUgPj4+IDIgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRJY3VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0SWN1OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGljdVROb2RlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChvcENvZGUgJiAzIC8qIE1BU0tfT1BDT0RFICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxIC8qIEF0dHIgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvcE5hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlT3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2FuaXRpemVGbiA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGVPcENvZGVzWysral0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFByb3BlcnR5SW50ZXJuYWwodFZpZXcsIGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpLCBsVmlldywgcHJvcE5hbWUsIHZhbHVlLCBsVmlld1tSRU5ERVJFUl0sIHNhbml0aXplRm4sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAwIC8qIFRleHQgKi86CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRCaW5kaW5nSW50ZXJuYWwobFZpZXcsIG5vZGVJbmRleCwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDIgLyogSWN1U3dpdGNoICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlT3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3UgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaWN1cykpW3RJY3VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGFuIGFjdGl2ZSBjYXNlLCBkZWxldGUgdGhlIG9sZCBub2RlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZW1vdmVDb2RlcyA9IHRJY3UucmVtb3ZlW2ljdVROb2RlLmFjdGl2ZUNhc2VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA8IHJlbW92ZUNvZGVzLmxlbmd0aDsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlbW92ZU9wQ29kZSA9ICgvKiogQHR5cGUgez99ICovIChyZW1vdmVDb2Rlc1trXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVtb3ZlT3BDb2RlICYgNyAvKiBNQVNLX09QQ09ERSAqLykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogUmVtb3ZlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUluZGV4ID0gcmVtb3ZlT3BDb2RlID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBET00gZWxlbWVudCwgYnV0IGRvICpub3QqIG1hcmsgVE5vZGUgYXMgZGV0YWNoZWQsIHNpbmNlIHdlIGFyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCBzd2l0Y2hpbmcgSUNVIGNhc2VzICh3aGlsZSBrZWVwaW5nIHRoZSBzYW1lIFROb2RlKSwgc28gYSBET00gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVwcmVzZW50aW5nIGEgbmV3IElDVSBjYXNlIHdpbGwgYmUgcmUtY3JlYXRlZC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZU5vZGUodFZpZXcsIGxWaWV3LCBub2RlSW5kZXgsIC8qIG1hcmtBc0RldGFjaGVkICovIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDYgLyogUmVtb3ZlTmVzdGVkSWN1ICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmVzdGVkSWN1Tm9kZUluZGV4ID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlbW92ZUNvZGVzW2sgKyAxXSkpID4+PiAzIC8qIFNISUZUX1JFRiAqLzsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBuZXN0ZWRJY3VOb2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVJbmRleCA9IG5lc3RlZEljdVROb2RlLmFjdGl2ZUNhc2VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVJbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VUSW5kZXggPSByZW1vdmVPcENvZGUgPj4+IDMgLyogU0hJRlRfUkVGICovOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRUSWN1ID0gKC8qKiBAdHlwZSB7P30gKi8gKGljdXMpKVtuZXN0ZWRJY3VUSW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkobmVzdGVkVEljdS5yZW1vdmVbYWN0aXZlSW5kZXhdLCByZW1vdmVDb2Rlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBhY3RpdmUgY2FzZUluZGV4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2FzZUluZGV4ID0gZ2V0Q2FzZUluZGV4KHRJY3UsIHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN1VE5vZGUuYWN0aXZlQ2FzZUluZGV4ID0gY2FzZUluZGV4ICE9PSAtMSA/IGNhc2VJbmRleCA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjYXNlSW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBub2RlcyBmb3IgdGhlIG5ldyBjYXNlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkQ3JlYXRlT3BDb2RlcygtMSwgdEljdS5jcmVhdGVbY2FzZUluZGV4XSwgdFZpZXcsIGxWaWV3KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VDcmVhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDMgLyogSWN1VXBkYXRlICovOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0SWN1SW5kZXggPSAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlT3BDb2Rlc1srK2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRJY3UgPSAoLyoqIEB0eXBlIHs/fSAqLyAoaWN1cykpW3RJY3VJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdVROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldFROb2RlKHRWaWV3LCBub2RlSW5kZXgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpY3VUTm9kZS5hY3RpdmVDYXNlSW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRVcGRhdGVPcENvZGVzKHRJY3UudXBkYXRlW2ljdVROb2RlLmFjdGl2ZUNhc2VJbmRleF0sIGljdXMsIGJpbmRpbmdzU3RhcnRJbmRleCwgY2hhbmdlTWFzaywgdFZpZXcsIGxWaWV3LCBjYXNlQ3JlYXRlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaSArPSBza2lwQ29kZXM7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IG1hcmtBc0RldGFjaGVkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVOb2RlKHRWaWV3LCBsVmlldywgaW5kZXgsIG1hcmtBc0RldGFjaGVkKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlbW92ZWRQaFROb2RlID0gZ2V0VE5vZGUodFZpZXcsIGluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVtb3ZlZFBoUk5vZGUgPSBnZXROYXRpdmVCeUluZGV4KGluZGV4LCBsVmlldyk7CiAgICAgICAgaWYgKHJlbW92ZWRQaFJOb2RlKSB7CiAgICAgICAgICAgIG5hdGl2ZVJlbW92ZU5vZGUobFZpZXdbUkVOREVSRVJdLCByZW1vdmVkUGhSTm9kZSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbG90VmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAobG9hZChsVmlldywgaW5kZXgpKSk7CiAgICAgICAgaWYgKGlzTENvbnRhaW5lcihzbG90VmFsdWUpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbENvbnRhaW5lciA9ICgvKiogQHR5cGUgez99ICovIChzbG90VmFsdWUpKTsKICAgICAgICAgICAgaWYgKHJlbW92ZWRQaFROb2RlLnR5cGUgIT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZW1vdmVOb2RlKGxWaWV3W1JFTkRFUkVSXSwgbENvbnRhaW5lcltOQVRJVkVdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAobWFya0FzRGV0YWNoZWQpIHsKICAgICAgICAgICAgLy8gRGVmaW5lIHRoaXMgbm9kZSBhcyBkZXRhY2hlZCB0byBhdm9pZCBwcm9qZWN0aW5nIGl0IGxhdGVyCiAgICAgICAgICAgIHJlbW92ZWRQaFROb2RlLmZsYWdzIHw9IDY0IC8qIGlzRGV0YWNoZWQgKi87CiAgICAgICAgfQogICAgICAgIG5nRGV2TW9kZSAmJiBuZ0Rldk1vZGUucmVuZGVyZXJSZW1vdmVOb2RlKys7CiAgICB9CiAgICAvKioKICAgICAqCiAgICAgKiBVc2UgdGhpcyBpbnN0cnVjdGlvbiB0byBjcmVhdGUgYSB0cmFuc2xhdGlvbiBibG9jayB0aGF0IGRvZXNuJ3QgY29udGFpbiBhbnkgcGxhY2Vob2xkZXIuCiAgICAgKiBJdCBjYWxscyBib3RoIHtcQGxpbmsgaTE4blN0YXJ0fSBhbmQge1xAbGluayBpMThuRW5kfSBpbiBvbmUgaW5zdHJ1Y3Rpb24uCiAgICAgKgogICAgICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBpcyB0aGUgdmFsdWUgd2hpY2ggaXMgbG9jYWxlIHNwZWNpZmljLiBUaGUgdHJhbnNsYXRpb24gc3RyaW5nIG1heQogICAgICogY29udGFpbiBwbGFjZWhvbGRlcnMgd2hpY2ggYXNzb2NpYXRlIGlubmVyIGVsZW1lbnRzIGFuZCBzdWItdGVtcGxhdGVzIHdpdGhpbiB0aGUgdHJhbnNsYXRpb24uCiAgICAgKgogICAgICogVGhlIHRyYW5zbGF0aW9uIGBtZXNzYWdlYCBwbGFjZWhvbGRlcnMgYXJlOgogICAgICogLSBg77+9e2luZGV4fSg6e2Jsb2NrfSnvv71gOiAqQmluZGluZyBQbGFjZWhvbGRlcio6IE1hcmtzIGEgbG9jYXRpb24gd2hlcmUgYW4gZXhwcmVzc2lvbiB3aWxsIGJlCiAgICAgKiAgIGludGVycG9sYXRlZCBpbnRvLiBUaGUgcGxhY2Vob2xkZXIgYGluZGV4YCBwb2ludHMgdG8gdGhlIGV4cHJlc3Npb24gYmluZGluZyBpbmRleC4gQW4gb3B0aW9uYWwKICAgICAqICAgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAgICAgKiAtIGDvv70je2luZGV4fSg6e2Jsb2NrfSnvv71gL2Dvv70vI3tpbmRleH0oOntibG9ja30p77+9YDogKkVsZW1lbnQgUGxhY2Vob2xkZXIqOiAgTWFya3MgdGhlIGJlZ2lubmluZwogICAgICogICBhbmQgZW5kIG9mIERPTSBlbGVtZW50IHRoYXQgd2VyZSBlbWJlZGRlZCBpbiB0aGUgb3JpZ2luYWwgdHJhbnNsYXRpb24gYmxvY2suIFRoZSBwbGFjZWhvbGRlcgogICAgICogICBgaW5kZXhgIHBvaW50cyB0byB0aGUgZWxlbWVudCBpbmRleCBpbiB0aGUgdGVtcGxhdGUgaW5zdHJ1Y3Rpb25zIHNldC4gQW4gb3B0aW9uYWwgYGJsb2NrYCB0aGF0CiAgICAgKiAgIG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAgICAgKiAtIGDvv70qe2luZGV4fTp7YmxvY2t977+9YC9g77+9Lyp7aW5kZXh9OntibG9ja33vv71gOiAqU3ViLXRlbXBsYXRlIFBsYWNlaG9sZGVyKjogU3ViLXRlbXBsYXRlcyBtdXN0IGJlCiAgICAgKiAgIHNwbGl0IHVwIGFuZCB0cmFuc2xhdGVkIHNlcGFyYXRlbHkgaW4gZWFjaCBhbmd1bGFyIHRlbXBsYXRlIGZ1bmN0aW9uLiBUaGUgYGluZGV4YCBwb2ludHMgdG8gdGhlCiAgICAgKiAgIGB0ZW1wbGF0ZWAgaW5zdHJ1Y3Rpb24gaW5kZXguIEEgYGJsb2NrYCB0aGF0IG1hdGNoZXMgdGhlIHN1Yi10ZW1wbGF0ZSBpbiB3aGljaCBpdCB3YXMgZGVjbGFyZWQuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGluZGV4IEEgdW5pcXVlIGluZGV4IG9mIHRoZSB0cmFuc2xhdGlvbiBpbiB0aGUgc3RhdGljIGJsb2NrLgogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlIFRoZSB0cmFuc2xhdGlvbiBtZXNzYWdlLgogICAgICogQHBhcmFtIHs/PX0gc3ViVGVtcGxhdGVJbmRleCBPcHRpb25hbCBzdWItdGVtcGxhdGUgaW5kZXggaW4gdGhlIGBtZXNzYWdlYC4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1aTE4bihpbmRleCwgbWVzc2FnZSwgc3ViVGVtcGxhdGVJbmRleCkgewogICAgICAgIMm1ybVpMThuU3RhcnQoaW5kZXgsIG1lc3NhZ2UsIHN1YlRlbXBsYXRlSW5kZXgpOwogICAgICAgIMm1ybVpMThuRW5kKCk7CiAgICB9CiAgICAvKioKICAgICAqIE1hcmtzIGEgbGlzdCBvZiBhdHRyaWJ1dGVzIGFzIHRyYW5zbGF0YWJsZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gaW5kZXggQSB1bmlxdWUgaW5kZXggaW4gdGhlIHN0YXRpYyBibG9jawogICAgICogQHBhcmFtIHs/fSB2YWx1ZXMKICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1aTE4bkF0dHJpYnV0ZXMoaW5kZXgsIHZhbHVlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRWaWV3ID0gZ2V0VFZpZXcoKTsKICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0VmlldywgYHRWaWV3IHNob3VsZCBiZSBkZWZpbmVkYCk7CiAgICAgICAgaTE4bkF0dHJpYnV0ZXNGaXJzdFBhc3MobFZpZXcsIHRWaWV3LCBpbmRleCwgdmFsdWVzKTsKICAgIH0KICAgIC8qKgogICAgICogU2VlIGBpMThuQXR0cmlidXRlc2AgYWJvdmUuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcGFyYW0gez99IHZhbHVlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaTE4bkF0dHJpYnV0ZXNGaXJzdFBhc3MobFZpZXcsIHRWaWV3LCBpbmRleCwgdmFsdWVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZpb3VzRWxlbWVudCA9IGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcmV2aW91c0VsZW1lbnRJbmRleCA9IHByZXZpb3VzRWxlbWVudC5pbmRleCAtIEhFQURFUl9PRkZTRVQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHVwZGF0ZU9wQ29kZXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF0dHJOYW1lID0gdmFsdWVzW2ldOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSB2YWx1ZXNbaSArIDFdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gbWVzc2FnZS5zcGxpdChJQ1VfUkVHRVhQKTsKICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCBwYXJ0cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBwYXJ0c1tqXTsKICAgICAgICAgICAgICAgIGlmIChqICYgMSkgewogICAgICAgICAgICAgICAgICAgIC8vIE9kZCBpbmRleGVzIGFyZSBJQ1UgZXhwcmVzc2lvbnMKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKG9jb21iZSk6IHN1cHBvcnQgSUNVIGV4cHJlc3Npb25zIGluIGF0dHJpYnV0ZXMKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lDVSBleHByZXNzaW9ucyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgaW4gYXR0cmlidXRlcycpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09ICcnKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRXZlbiBpbmRleGVzIGFyZSB0ZXh0IChpbmNsdWRpbmcgYmluZGluZ3MpCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhhc0JpbmRpbmcgPSAhIXZhbHVlLm1hdGNoKEJJTkRJTkdfUkVHRVhQKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmluZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzICYmIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKHZhbHVlLCBwcmV2aW91c0VsZW1lbnRJbmRleCwgYXR0ck5hbWUpLCB1cGRhdGVPcENvZGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0Tm9kZSA9IGdldFROb2RlKHRWaWV3LCBwcmV2aW91c0VsZW1lbnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBhdHRyaWJ1dGVzIGZvciBFbGVtZW50cyBvbmx5LCBmb3Igb3RoZXIgdHlwZXMgKGxpa2UgRWxlbWVudENvbnRhaW5lciksCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgc2V0IGlucHV0cyBiZWxvdwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodE5vZGUudHlwZSA9PT0gMyAvKiBFbGVtZW50ICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50QXR0cmlidXRlSW50ZXJuYWwodE5vZGUsIGxWaWV3LCBhdHRyTmFtZSwgdmFsdWUsIG51bGwsIG51bGwpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoYXQgYXR0cmlidXRlIGlzIGEgZGlyZWN0aXZlIGlucHV0CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YVZhbHVlID0gdE5vZGUuaW5wdXRzICE9PSBudWxsICYmIHROb2RlLmlucHV0c1thdHRyTmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldElucHV0c0ZvclByb3BlcnR5KHRWaWV3LCBsVmlldywgZGF0YVZhbHVlLCBhdHRyTmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5hdGl2ZUJ5SW5kZXgocHJldmlvdXNFbGVtZW50SW5kZXgsIGxWaWV3KSkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldE5nUmVmbGVjdFByb3BlcnRpZXMobFZpZXcsIGVsZW1lbnQsIHROb2RlLnR5cGUsIGRhdGFWYWx1ZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MgJiYgdFZpZXcuZGF0YVtpbmRleCArIEhFQURFUl9PRkZTRVRdID09PSBudWxsKSB7CiAgICAgICAgICAgIHRWaWV3LmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSA9IHVwZGF0ZU9wQ29kZXM7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGNoYW5nZU1hc2sgPSAwYjA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgc2hpZnRzQ291bnRlciA9IDA7CiAgICAvKioKICAgICAqIFN0b3JlcyB0aGUgdmFsdWVzIG9mIHRoZSBiaW5kaW5ncyBkdXJpbmcgZWFjaCB1cGRhdGUgY3ljbGUgaW4gb3JkZXIgdG8gZGV0ZXJtaW5lIGlmIHdlIG5lZWQgdG8KICAgICAqIHVwZGF0ZSB0aGUgdHJhbnNsYXRlZCBub2Rlcy4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBiaW5kaW5nJ3MgdmFsdWUKICAgICAqIEByZXR1cm4gez99IFRoaXMgZnVuY3Rpb24gcmV0dXJucyBpdHNlbGYgc28gdGhhdCBpdCBtYXkgYmUgY2hhaW5lZAogICAgICogKGUuZy4gYGkxOG5FeHAoY3R4Lm5hbWUpKGN0eC50aXRsZSlgKQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtWkxOG5FeHAodmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIGlmIChiaW5kaW5nVXBkYXRlZChsVmlldywgbmV4dEJpbmRpbmdJbmRleCgpLCB2YWx1ZSkpIHsKICAgICAgICAgICAgY2hhbmdlTWFzayA9IGNoYW5nZU1hc2sgfCAoMSA8PCBzaGlmdHNDb3VudGVyKTsKICAgICAgICB9CiAgICAgICAgc2hpZnRzQ291bnRlcisrOwogICAgICAgIHJldHVybiDJtcm1aTE4bkV4cDsKICAgIH0KICAgIC8qKgogICAgICogVXBkYXRlcyBhIHRyYW5zbGF0aW9uIGJsb2NrIG9yIGFuIGkxOG4gYXR0cmlidXRlIHdoZW4gdGhlIGJpbmRpbmdzIGhhdmUgY2hhbmdlZC4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gaW5kZXggSW5kZXggb2YgZWl0aGVyIHtcQGxpbmsgaTE4blN0YXJ0fSAodHJhbnNsYXRpb24gYmxvY2spIG9yIHtcQGxpbmsgaTE4bkF0dHJpYnV0ZXN9CiAgICAgKiAoaTE4biBhdHRyaWJ1dGUpIG9uIHdoaWNoIGl0IHNob3VsZCB1cGRhdGUgdGhlIGNvbnRlbnQuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtWkxOG5BcHBseShpbmRleCkgewogICAgICAgIGlmIChzaGlmdHNDb3VudGVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0VmlldywgYHRWaWV3IHNob3VsZCBiZSBkZWZpbmVkYCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdEkxOG4gPSB0Vmlldy5kYXRhW2luZGV4ICsgSEVBREVSX09GRlNFVF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHVwZGF0ZU9wQ29kZXM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGljdXMgPSBudWxsOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0STE4bikpIHsKICAgICAgICAgICAgICAgIHVwZGF0ZU9wQ29kZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodEkxOG4pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHVwZGF0ZU9wQ29kZXMgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRJMThuKSkpLnVwZGF0ZTsKICAgICAgICAgICAgICAgIGljdXMgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRJMThuKSkpLmljdXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiaW5kaW5nc1N0YXJ0SW5kZXggPSBnZXRCaW5kaW5nSW5kZXgoKSAtIHNoaWZ0c0NvdW50ZXIgLSAxOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAgICAgcmVhZFVwZGF0ZU9wQ29kZXModXBkYXRlT3BDb2RlcywgaWN1cywgYmluZGluZ3NTdGFydEluZGV4LCBjaGFuZ2VNYXNrLCB0VmlldywgbFZpZXcpOwogICAgICAgICAgICAvLyBSZXNldCBjaGFuZ2VNYXNrICYgbWFza0JpdCB0byBkZWZhdWx0IGZvciB0aGUgbmV4dCB1cGRhdGUgY3ljbGUKICAgICAgICAgICAgY2hhbmdlTWFzayA9IDBiMDsKICAgICAgICAgICAgc2hpZnRzQ291bnRlciA9IDA7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBjYXNlIG9mIGFuIElDVSBleHByZXNzaW9uIGRlcGVuZGluZyBvbiB0aGUgbWFpbiBiaW5kaW5nIHZhbHVlCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBpY3VFeHByZXNzaW9uCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdWYWx1ZSBUaGUgdmFsdWUgb2YgdGhlIG1haW4gYmluZGluZyB1c2VkIGJ5IHRoaXMgSUNVIGV4cHJlc3Npb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENhc2VJbmRleChpY3VFeHByZXNzaW9uLCBiaW5kaW5nVmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluZGV4ID0gaWN1RXhwcmVzc2lvbi5jYXNlcy5pbmRleE9mKGJpbmRpbmdWYWx1ZSk7CiAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgICAgICBzd2l0Y2ggKGljdUV4cHJlc3Npb24udHlwZSkgewogICAgICAgICAgICAgICAgY2FzZSAxIC8qIHBsdXJhbCAqLzogewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZENhc2UgPSBnZXRQbHVyYWxDYXNlKGJpbmRpbmdWYWx1ZSwgZ2V0TG9jYWxlSWQoKSk7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpY3VFeHByZXNzaW9uLmNhc2VzLmluZGV4T2YocmVzb2x2ZWRDYXNlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaW5kZXggPT09IC0xICYmIHJlc29sdmVkQ2FzZSAhPT0gJ290aGVyJykgewogICAgICAgICAgICAgICAgICAgICAgICBpbmRleCA9IGljdUV4cHJlc3Npb24uY2FzZXMuaW5kZXhPZignb3RoZXInKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIDAgLyogc2VsZWN0ICovOiB7CiAgICAgICAgICAgICAgICAgICAgaW5kZXggPSBpY3VFeHByZXNzaW9uLmNhc2VzLmluZGV4T2YoJ290aGVyJyk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGluZGV4OwogICAgfQogICAgLyoqCiAgICAgKiBHZW5lcmF0ZSB0aGUgT3BDb2RlcyBmb3IgSUNVIGV4cHJlc3Npb25zLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdEljdXMKICAgICAqIEBwYXJhbSB7P30gaWN1RXhwcmVzc2lvbgogICAgICogQHBhcmFtIHs/fSBzdGFydEluZGV4CiAgICAgKiBAcGFyYW0gez99IGV4cGFuZG9TdGFydEluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpY3VTdGFydCh0SWN1cywgaWN1RXhwcmVzc2lvbiwgc3RhcnRJbmRleCwgZXhwYW5kb1N0YXJ0SW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3JlYXRlQ29kZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVtb3ZlQ29kZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXBkYXRlQ29kZXMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdmFycyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjaGlsZEljdXMgPSBbXTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGljdUV4cHJlc3Npb24udmFsdWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8vIEVhY2ggdmFsdWUgaXMgYW4gYXJyYXkgb2Ygc3RyaW5ncyAmIG90aGVyIElDVSBleHByZXNzaW9ucwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbHVlQXJyID0gaWN1RXhwcmVzc2lvbi52YWx1ZXNbaV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmVzdGVkSWN1cyA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHZhbHVlQXJyLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHZhbHVlQXJyW2pdOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBhbiBuZXN0ZWQgSUNVIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaWN1SW5kZXggPSBuZXN0ZWRJY3VzLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpIC0gMTsKICAgICAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIG5lc3RlZCBJQ1UgZXhwcmVzc2lvbiBieSBhIGNvbW1lbnQgbm9kZQogICAgICAgICAgICAgICAgICAgIHZhbHVlQXJyW2pdID0gYDwhLS3vv70ke2ljdUluZGV4fe+/vS0tPmA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpY3VDYXNlID0gcGFyc2VJY3VDYXNlKHZhbHVlQXJyLmpvaW4oJycpLCBzdGFydEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpOwogICAgICAgICAgICBjcmVhdGVDb2Rlcy5wdXNoKGljdUNhc2UuY3JlYXRlKTsKICAgICAgICAgICAgcmVtb3ZlQ29kZXMucHVzaChpY3VDYXNlLnJlbW92ZSk7CiAgICAgICAgICAgIHVwZGF0ZUNvZGVzLnB1c2goaWN1Q2FzZS51cGRhdGUpOwogICAgICAgICAgICB2YXJzLnB1c2goaWN1Q2FzZS52YXJzKTsKICAgICAgICAgICAgY2hpbGRJY3VzLnB1c2goaWN1Q2FzZS5jaGlsZEljdXMpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdEljdSA9IHsKICAgICAgICAgICAgdHlwZTogaWN1RXhwcmVzc2lvbi50eXBlLAogICAgICAgICAgICB2YXJzLAogICAgICAgICAgICBjaGlsZEljdXMsCiAgICAgICAgICAgIGNhc2VzOiBpY3VFeHByZXNzaW9uLmNhc2VzLAogICAgICAgICAgICBjcmVhdGU6IGNyZWF0ZUNvZGVzLAogICAgICAgICAgICByZW1vdmU6IHJlbW92ZUNvZGVzLAogICAgICAgICAgICB1cGRhdGU6IHVwZGF0ZUNvZGVzCiAgICAgICAgfTsKICAgICAgICB0SWN1cy5wdXNoKHRJY3UpOwogICAgICAgIC8vIEFkZGluZyB0aGUgbWF4aW11bSBwb3NzaWJsZSBvZiB2YXJzIG5lZWRlZCAoYmFzZWQgb24gdGhlIGNhc2VzIHdpdGggdGhlIG1vc3QgdmFycykKICAgICAgICBpMThuVmFyc0NvdW50ICs9IE1hdGgubWF4KC4uLnZhcnMpOwogICAgfQogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIHRlbXBsYXRlIGludG8gYW4gSFRNTCB0ZW1wbGF0ZSBhbmQgYSBsaXN0IG9mIGluc3RydWN0aW9ucyB1c2VkIHRvIHVwZGF0ZQogICAgICogYXR0cmlidXRlcyBvciBub2RlcyB0aGF0IGNvbnRhaW4gYmluZGluZ3MuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB1bnNhZmVIdG1sIFRoZSBzdHJpbmcgdG8gcGFyc2UKICAgICAqIEBwYXJhbSB7P30gcGFyZW50SW5kZXgKICAgICAqIEBwYXJhbSB7P30gbmVzdGVkSWN1cwogICAgICogQHBhcmFtIHs/fSB0SWN1cwogICAgICogQHBhcmFtIHs/fSBleHBhbmRvU3RhcnRJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VJY3VDYXNlKHVuc2FmZUh0bWwsIHBhcmVudEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5lcnRCb2R5SGVscGVyID0gbmV3IEluZXJ0Qm9keUhlbHBlcihnZXREb2N1bWVudCgpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5lcnRCb2R5RWxlbWVudCA9IGluZXJ0Qm9keUhlbHBlci5nZXRJbmVydEJvZHlFbGVtZW50KHVuc2FmZUh0bWwpOwogICAgICAgIGlmICghaW5lcnRCb2R5RWxlbWVudCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuYWJsZSB0byBnZW5lcmF0ZSBpbmVydCBib2R5IGVsZW1lbnQnKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHdyYXBwZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0VGVtcGxhdGVDb250ZW50KCgvKiogQHR5cGUgez99ICovIChpbmVydEJvZHlFbGVtZW50KSkpKSkgfHwgaW5lcnRCb2R5RWxlbWVudDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3BDb2RlcyA9IHsgdmFyczogMCwgY2hpbGRJY3VzOiBbXSwgY3JlYXRlOiBbXSwgcmVtb3ZlOiBbXSwgdXBkYXRlOiBbXSB9OwogICAgICAgIHBhcnNlTm9kZXMod3JhcHBlci5maXJzdENoaWxkLCBvcENvZGVzLCBwYXJlbnRJbmRleCwgbmVzdGVkSWN1cywgdEljdXMsIGV4cGFuZG9TdGFydEluZGV4KTsKICAgICAgICByZXR1cm4gb3BDb2RlczsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5FU1RFRF9JQ1UgPSAv77+9KFxkKynvv70vOwogICAgLyoqCiAgICAgKiBQYXJzZXMgYSBub2RlLCBpdHMgY2hpbGRyZW4gYW5kIGl0cyBzaWJsaW5ncywgYW5kIGdlbmVyYXRlcyB0aGUgbXV0YXRlICYgdXBkYXRlIE9wQ29kZXMuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBjdXJyZW50Tm9kZSBUaGUgZmlyc3Qgbm9kZSB0byBwYXJzZQogICAgICogQHBhcmFtIHs/fSBpY3VDYXNlIFRoZSBkYXRhIGZvciB0aGUgSUNVIGV4cHJlc3Npb24gY2FzZSB0aGF0IGNvbnRhaW5zIHRob3NlIG5vZGVzCiAgICAgKiBAcGFyYW0gez99IHBhcmVudEluZGV4IEluZGV4IG9mIHRoZSBjdXJyZW50IG5vZGUncyBwYXJlbnQKICAgICAqIEBwYXJhbSB7P30gbmVzdGVkSWN1cyBEYXRhIGZvciB0aGUgbmVzdGVkIElDVSBleHByZXNzaW9ucyB0aGF0IHRoaXMgY2FzZSBjb250YWlucwogICAgICogQHBhcmFtIHs/fSB0SWN1cyBEYXRhIGZvciBhbGwgSUNVIGV4cHJlc3Npb25zIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UKICAgICAqIEBwYXJhbSB7P30gZXhwYW5kb1N0YXJ0SW5kZXggRXhwYW5kbyBzdGFydCBpbmRleCBmb3IgdGhlIGN1cnJlbnQgSUNVIGV4cHJlc3Npb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlTm9kZXMoY3VycmVudE5vZGUsIGljdUNhc2UsIHBhcmVudEluZGV4LCBuZXN0ZWRJY3VzLCB0SWN1cywgZXhwYW5kb1N0YXJ0SW5kZXgpIHsKICAgICAgICBpZiAoY3VycmVudE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VzVG9DcmVhdGUgPSBbXTsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXh0Tm9kZSA9IGN1cnJlbnROb2RlLm5leHRTaWJsaW5nOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmV3SW5kZXggPSBleHBhbmRvU3RhcnRJbmRleCArICsraWN1Q2FzZS52YXJzOwogICAgICAgICAgICAgICAgc3dpdGNoIChjdXJyZW50Tm9kZS5ub2RlVHlwZSkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgTm9kZS5FTEVNRU5UX05PREU6CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChjdXJyZW50Tm9kZSkpOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRhZ05hbWUgPSBlbGVtZW50LnRhZ05hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFWQUxJRF9FTEVNRU5UUy5oYXNPd25Qcm9wZXJ0eSh0YWdOYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpc24ndCBhIHZhbGlkIGVsZW1lbnQsIHdlIHdvbid0IGNyZWF0ZSBhbiBlbGVtZW50IGZvciBpdAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS52YXJzLS07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLmNyZWF0ZS5wdXNoKEVMRU1FTlRfTUFSS0VSLCB0YWdOYW1lLCBuZXdJbmRleCwgcGFyZW50SW5kZXggPDwgMTcgLyogU0hJRlRfUEFSRU5UICovIHwgMSAvKiBBcHBlbmRDaGlsZCAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbEF0dHJzID0gZWxlbWVudC5hdHRyaWJ1dGVzOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbEF0dHJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF0dHIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWxBdHRycy5pdGVtKGkpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvd2VyQXR0ck5hbWUgPSBhdHRyLm5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzQmluZGluZyA9ICEhYXR0ci52YWx1ZS5tYXRjaChCSU5ESU5HX1JFR0VYUCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXNzdW1lIHRoZSBpbnB1dCBzdHJpbmcgaXMgc2FmZSwgdW5sZXNzIGl0J3MgdXNpbmcgYSBiaW5kaW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0JpbmRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFZBTElEX0FUVFJTLmhhc093blByb3BlcnR5KGxvd2VyQXR0ck5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoVVJJX0FUVFJTW2xvd2VyQXR0ck5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKGF0dHIudmFsdWUsIG5ld0luZGV4LCBhdHRyLm5hbWUsIF9zYW5pdGl6ZVVybCksIGljdUNhc2UudXBkYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFNSQ1NFVF9BVFRSU1tsb3dlckF0dHJOYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2RlcyhhdHRyLnZhbHVlLCBuZXdJbmRleCwgYXR0ci5uYW1lLCBzYW5pdGl6ZVNyY3NldCksIGljdUNhc2UudXBkYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEFsbFRvQXJyYXkoZ2VuZXJhdGVCaW5kaW5nVXBkYXRlT3BDb2RlcyhhdHRyLnZhbHVlLCBuZXdJbmRleCwgYXR0ci5uYW1lKSwgaWN1Q2FzZS51cGRhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBXQVJOSU5HOiBpZ25vcmluZyB1bnNhZmUgYXR0cmlidXRlIHZhbHVlICR7bG93ZXJBdHRyTmFtZX0gb24gZWxlbWVudCAke3RhZ05hbWV9IChzZWUgaHR0cDovL2cuY28vbmcvc2VjdXJpdHkjeHNzKWApOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLmNyZWF0ZS5wdXNoKG5ld0luZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgNCAvKiBBdHRyICovLCBhdHRyLm5hbWUsIGF0dHIudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUgKGlmIGFueSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlTm9kZXMoY3VycmVudE5vZGUuZmlyc3RDaGlsZCwgaWN1Q2FzZSwgbmV3SW5kZXgsIG5lc3RlZEljdXMsIHRJY3VzLCBleHBhbmRvU3RhcnRJbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHBhcmVudCBub2RlIGFmdGVyIHRoZSBjaGlsZHJlbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5yZW1vdmUucHVzaChuZXdJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDMgLyogUmVtb3ZlICovKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuVEVYVF9OT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gY3VycmVudE5vZGUudGV4dENvbnRlbnQgfHwgJyc7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFzQmluZGluZyA9IHZhbHVlLm1hdGNoKEJJTkRJTkdfUkVHRVhQKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWN1Q2FzZS5jcmVhdGUucHVzaChoYXNCaW5kaW5nID8gJycgOiB2YWx1ZSwgbmV3SW5kZXgsIHBhcmVudEluZGV4IDw8IDE3IC8qIFNISUZUX1BBUkVOVCAqLyB8IDEgLyogQXBwZW5kQ2hpbGQgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLnJlbW92ZS5wdXNoKG5ld0luZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgMyAvKiBSZW1vdmUgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFzQmluZGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkQWxsVG9BcnJheShnZW5lcmF0ZUJpbmRpbmdVcGRhdGVPcENvZGVzKHZhbHVlLCBuZXdJbmRleCksIGljdUNhc2UudXBkYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIE5vZGUuQ09NTUVOVF9OT0RFOgogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgY29tbWVudCBub2RlIGlzIGEgcGxhY2Vob2xkZXIgZm9yIGEgbmVzdGVkIElDVQogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gTkVTVEVEX0lDVS5leGVjKGN1cnJlbnROb2RlLnRleHRDb250ZW50IHx8ICcnKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hdGNoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3VJbmRleCA9IHBhcnNlSW50KG1hdGNoWzFdLCAxMCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdMb2NhbCA9IG5nRGV2TW9kZSA/IGBuZXN0ZWQgSUNVICR7bmVzdGVkSWN1SW5kZXh9YCA6ICcnOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIHRoZSBjb21tZW50IG5vZGUgdGhhdCB3aWxsIGFuY2hvciB0aGUgSUNVIGV4cHJlc3Npb24KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdUNhc2UuY3JlYXRlLnB1c2goQ09NTUVOVF9NQVJLRVIsIG5ld0xvY2FsLCBuZXdJbmRleCwgcGFyZW50SW5kZXggPDwgMTcgLyogU0hJRlRfUEFSRU5UICovIHwgMSAvKiBBcHBlbmRDaGlsZCAqLyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXN0ZWRJY3UgPSBuZXN0ZWRJY3VzW25lc3RlZEljdUluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZEljdXNUb0NyZWF0ZS5wdXNoKFtuZXN0ZWRJY3UsIG5ld0luZGV4XSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBkbyBub3QgaGFuZGxlIGFueSBvdGhlciB0eXBlIG9mIGNvbW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGljdUNhc2UudmFycy0tOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIG5vdCBoYW5kbGUgYW55IG90aGVyIHR5cGUgb2YgZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAgICBpY3VDYXNlLnZhcnMtLTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnROb2RlID0gKC8qKiBAdHlwZSB7P30gKi8gKG5leHROb2RlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXN0ZWRJY3VzVG9DcmVhdGUubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdSA9IG5lc3RlZEljdXNUb0NyZWF0ZVtpXVswXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5lc3RlZEljdU5vZGVJbmRleCA9IG5lc3RlZEljdXNUb0NyZWF0ZVtpXVsxXTsKICAgICAgICAgICAgICAgIGljdVN0YXJ0KHRJY3VzLCBuZXN0ZWRJY3UsIG5lc3RlZEljdU5vZGVJbmRleCwgZXhwYW5kb1N0YXJ0SW5kZXggKyBpY3VDYXNlLnZhcnMpOwogICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBpcyByZWN1cnNpdmUsIHRoZSBsYXN0IFRJY3UgdGhhdCB3YXMgcHVzaGVkIGlzIHRoZSBvbmUgd2Ugd2FudAogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmVzdFRJY3VJbmRleCA9IHRJY3VzLmxlbmd0aCAtIDE7CiAgICAgICAgICAgICAgICBpY3VDYXNlLnZhcnMgKz0gTWF0aC5tYXgoLi4udEljdXNbbmVzdFRJY3VJbmRleF0udmFycyk7CiAgICAgICAgICAgICAgICBpY3VDYXNlLmNoaWxkSWN1cy5wdXNoKG5lc3RUSWN1SW5kZXgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWFzayA9IGdldEJpbmRpbmdNYXNrKG5lc3RlZEljdSk7CiAgICAgICAgICAgICAgICBpY3VDYXNlLnVwZGF0ZS5wdXNoKHRvTWFza0JpdChuZXN0ZWRJY3UubWFpbkJpbmRpbmcpLCAvLyBtYXNrIG9mIHRoZSBtYWluIGJpbmRpbmcKICAgICAgICAgICAgICAgIDMsIC8vIHNraXAgMyBvcENvZGVzIGlmIG5vdCBjaGFuZ2VkCiAgICAgICAgICAgICAgICAtMSAtIG5lc3RlZEljdS5tYWluQmluZGluZywgbmVzdGVkSWN1Tm9kZUluZGV4IDw8IDIgLyogU0hJRlRfUkVGICovIHwgMiAvKiBJY3VTd2l0Y2ggKi8sIG5lc3RUSWN1SW5kZXgsIG1hc2ssIC8vIG1hc2sgb2YgYWxsIHRoZSBiaW5kaW5ncyBvZiB0aGlzIElDVSBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAyLCAvLyBza2lwIDIgb3BDb2RlcyBpZiBub3QgY2hhbmdlZAogICAgICAgICAgICAgICAgbmVzdGVkSWN1Tm9kZUluZGV4IDw8IDIgLyogU0hJRlRfUkVGICovIHwgMyAvKiBJY3VVcGRhdGUgKi8sIG5lc3RUSWN1SW5kZXgpOwogICAgICAgICAgICAgICAgaWN1Q2FzZS5yZW1vdmUucHVzaChuZXN0VEljdUluZGV4IDw8IDMgLyogU0hJRlRfUkVGICovIHwgNiAvKiBSZW1vdmVOZXN0ZWRJY3UgKi8sIG5lc3RlZEljdU5vZGVJbmRleCA8PCAzIC8qIFNISUZUX1JFRiAqLyB8IDMgLyogUmVtb3ZlICovKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQW5ndWxhciBEYXJ0IGludHJvZHVjZWQgJm5nc3A7IGFzIGEgcGxhY2Vob2xkZXIgZm9yIG5vbi1yZW1vdmFibGUgc3BhY2UsIHNlZToKICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJ0LWxhbmcvYW5ndWxhci9ibG9iLzBiYjYxMTM4N2QyOWQ2NWI1YWY3ZjlkMjUxNWFiNTcxZmQzZmJlZTQvX3Rlc3RzL3Rlc3QvY29tcGlsZXIvcHJlc2VydmVfd2hpdGVzcGFjZV90ZXN0LmRhcnQjTDI1LUwzMgogICAgICogSW4gQW5ndWxhciBEYXJ0ICZuZ3NwOyBpcyBjb252ZXJ0ZWQgdG8gdGhlIDB4RTUwMCBQVUEgKFByaXZhdGUgVXNlIEFyZWFzKSB1bmljb2RlIGNoYXJhY3RlcgogICAgICogYW5kIGxhdGVyIG9uIHJlcGxhY2VkIGJ5IGEgc3BhY2UuIFdlIGFyZSByZS1pbXBsZW1lbnRpbmcgdGhlIHNhbWUgaWRlYSBoZXJlLCBzaW5jZSB0cmFuc2xhdGlvbnMKICAgICAqIG1pZ2h0IGNvbnRhaW4gdGhpcyBzcGVjaWFsIGNoYXJhY3Rlci4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBOR1NQX1VOSUNPREVfUkVHRVhQID0gL1x1RTUwMC9nOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXBsYWNlTmdzcCh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKE5HU1BfVU5JQ09ERV9SRUdFWFAsICcgJyk7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBsb2NhbGUgaWQgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgY3VycmVudGx5IHVzaW5nIChmb3IgdHJhbnNsYXRpb25zIGFuZCBJQ1UgZXhwcmVzc2lvbnMpLgogICAgICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogICAgICogYnV0IGlzIG5vdyBkZWZpbmVkIGFzIGEgZ2xvYmFsIHZhbHVlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBMT0NBTEVfSUQgPSBERUZBVUxUX0xPQ0FMRV9JRDsKICAgIC8qKgogICAgICogU2V0cyB0aGUgbG9jYWxlIGlkIHRoYXQgd2lsbCBiZSB1c2VkIGZvciB0cmFuc2xhdGlvbnMgYW5kIElDVSBleHByZXNzaW9ucy4KICAgICAqIFRoaXMgaXMgdGhlIGl2eSB2ZXJzaW9uIG9mIGBMT0NBTEVfSURgIHRoYXQgd2FzIGRlZmluZWQgYXMgYW4gaW5qZWN0aW9uIHRva2VuIGZvciB0aGUgdmlldyBlbmdpbmUKICAgICAqIGJ1dCBpcyBub3cgZGVmaW5lZCBhcyBhIGdsb2JhbCB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZUlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRMb2NhbGVJZChsb2NhbGVJZCkgewogICAgICAgIGFzc2VydERlZmluZWQobG9jYWxlSWQsIGBFeHBlY3RlZCBsb2NhbGVJZCB0byBiZSBkZWZpbmVkYCk7CiAgICAgICAgaWYgKHR5cGVvZiBsb2NhbGVJZCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgTE9DQUxFX0lEID0gbG9jYWxlSWQudG9Mb3dlckNhc2UoKS5yZXBsYWNlKC9fL2csICctJyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHRoZSBsb2NhbGUgaWQgdGhhdCB3aWxsIGJlIHVzZWQgZm9yIHRyYW5zbGF0aW9ucyBhbmQgSUNVIGV4cHJlc3Npb25zLgogICAgICogVGhpcyBpcyB0aGUgaXZ5IHZlcnNpb24gb2YgYExPQ0FMRV9JRGAgdGhhdCB3YXMgZGVmaW5lZCBhcyBhbiBpbmplY3Rpb24gdG9rZW4gZm9yIHRoZSB2aWV3IGVuZ2luZQogICAgICogYnV0IGlzIG5vdyBkZWZpbmVkIGFzIGEgZ2xvYmFsIHZhbHVlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TG9jYWxlSWQoKSB7CiAgICAgICAgcmV0dXJuIExPQ0FMRV9JRDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9uZ19tb2R1bGVfZmFjdG9yeV9yZWdpc3RyYXRpb24udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBNYXAgb2YgbW9kdWxlLWlkIHRvIHRoZSBjb3JyZXNwb25kaW5nIE5nTW9kdWxlLgogICAgICogLSBJbiBwcmUgSXZ5IHdlIHRyYWNrIE5nTW9kdWxlRmFjdG9yeSwKICAgICAqIC0gSW4gcG9zdCBJdnkgd2UgdHJhY2sgdGhlIE5nTW9kdWxlVHlwZQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IG1vZHVsZXMgPSBuZXcgTWFwKCk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBpbmNvbWluZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0U2FtZU9yTm90RXhpc3RpbmcoaWQsIHR5cGUsIGluY29taW5nKSB7CiAgICAgICAgaWYgKHR5cGUgJiYgdHlwZSAhPT0gaW5jb21pbmcpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBEdXBsaWNhdGUgbW9kdWxlIHJlZ2lzdGVyZWQgZm9yICR7aWR9IC0gJHtzdHJpbmdpZnkodHlwZSl9IHZzICR7c3RyaW5naWZ5KHR5cGUubmFtZSl9YCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlVHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVnaXN0ZXJOZ01vZHVsZVR5cGUobmdNb2R1bGVUeXBlKSB7CiAgICAgICAgaWYgKG5nTW9kdWxlVHlwZS7JtW1vZC5pZCAhPT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlkID0gbmdNb2R1bGVUeXBlLsm1bW9kLmlkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZXMuZ2V0KGlkKSkpOwogICAgICAgICAgICBhc3NlcnRTYW1lT3JOb3RFeGlzdGluZyhpZCwgZXhpc3RpbmcsIG5nTW9kdWxlVHlwZSk7CiAgICAgICAgICAgIG1vZHVsZXMuc2V0KGlkLCBuZ01vZHVsZVR5cGUpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGltcG9ydHMgPSBuZ01vZHVsZVR5cGUuybVtb2QuaW1wb3J0czsKICAgICAgICBpZiAoaW1wb3J0cyBpbnN0YW5jZW9mIEZ1bmN0aW9uKSB7CiAgICAgICAgICAgIGltcG9ydHMgPSBpbXBvcnRzKCk7CiAgICAgICAgfQogICAgICAgIGlmIChpbXBvcnRzKSB7CiAgICAgICAgICAgIGltcG9ydHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaSA9PiByZWdpc3Rlck5nTW9kdWxlVHlwZSgoLyoqIEB0eXBlIHs/fSAqLyAoaSkpKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgTmdNb2R1bGVSZWYkMSBleHRlbmRzIE5nTW9kdWxlUmVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlVHlwZQogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5nTW9kdWxlVHlwZSwgX3BhcmVudCkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50OwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgdGhpcy5fYm9vdHN0cmFwQ29tcG9uZW50cyA9IFtdOwogICAgICAgICAgICB0aGlzLmluamVjdG9yID0gdGhpczsKICAgICAgICAgICAgdGhpcy5kZXN0cm95Q2JzID0gW107CiAgICAgICAgICAgIC8vIFdoZW4gYm9vdHN0cmFwcGluZyBhIG1vZHVsZSB3ZSBoYXZlIGEgZGVwZW5kZW5jeSBncmFwaCB0aGF0IGxvb2tzIGxpa2UgdGhpczoKICAgICAgICAgICAgLy8gQXBwbGljYXRpb25SZWYgLT4gQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIC0+IE5nTW9kdWxlUmVmLiBUaGUgcHJvYmxlbSBpcyB0aGF0IGlmIHRoZQogICAgICAgICAgICAvLyBtb2R1bGUgYmVpbmcgcmVzb2x2ZWQgdHJpZXMgdG8gaW5qZWN0IHRoZSBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIGl0J2xsIGNyZWF0ZSBhCiAgICAgICAgICAgIC8vIGNpcmN1bGFyIGRlcGVuZGVuY3kgd2hpY2ggd2lsbCByZXN1bHQgaW4gYSBydW50aW1lIGVycm9yLCBiZWNhdXNlIHRoZSBpbmplY3RvciBkb2Vzbid0CiAgICAgICAgICAgIC8vIGV4aXN0IHlldC4gV2Ugd29yayBhcm91bmQgdGhlIGlzc3VlIGJ5IGNyZWF0aW5nIHRoZSBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgb3Vyc2VsdmVzCiAgICAgICAgICAgIC8vIGFuZCBwcm92aWRpbmcgaXQsIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIGluamVjdG9yIHJlc29sdmUgaXQuCiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gbmV3IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciQxKHRoaXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYobmdNb2R1bGVUeXBlKTsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICBhc3NlcnREZWZpbmVkKG5nTW9kdWxlRGVmLCBgTmdNb2R1bGUgJyR7c3RyaW5naWZ5KG5nTW9kdWxlVHlwZSl9JyBpcyBub3QgYSBzdWJ0eXBlIG9mICdOZ01vZHVsZVR5cGUnLmApOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nTG9jYWxlSWREZWYgPSBnZXROZ0xvY2FsZUlkRGVmKG5nTW9kdWxlVHlwZSk7CiAgICAgICAgICAgIG5nTG9jYWxlSWREZWYgJiYgc2V0TG9jYWxlSWQobmdMb2NhbGVJZERlZik7CiAgICAgICAgICAgIHRoaXMuX2Jvb3RzdHJhcENvbXBvbmVudHMgPSBtYXliZVVud3JhcEZuKCgvKiogQHR5cGUgez99ICovIChuZ01vZHVsZURlZikpLmJvb3RzdHJhcCk7CiAgICAgICAgICAgIHRoaXMuX3IzSW5qZWN0b3IgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY3JlYXRlSW5qZWN0b3JXaXRob3V0SW5qZWN0b3JJbnN0YW5jZXMobmdNb2R1bGVUeXBlLCBfcGFyZW50LCBbCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE5nTW9kdWxlUmVmLCB1c2VWYWx1ZTogdGhpcyB9LCB7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLAogICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdLCBzdHJpbmdpZnkobmdNb2R1bGVUeXBlKSkpKTsKICAgICAgICAgICAgLy8gV2UgbmVlZCB0byByZXNvbHZlIHRoZSBpbmplY3RvciB0eXBlcyBzZXBhcmF0ZWx5IGZyb20gdGhlIGluamVjdG9yIGNyZWF0aW9uLCBiZWNhdXNlCiAgICAgICAgICAgIC8vIHRoZSBtb2R1bGUgbWlnaHQgYmUgdHJ5aW5nIHRvIHVzZSB0aGlzIHJlZiBpbiBpdHMgY29udHJ1Y3RvciBmb3IgREkgd2hpY2ggd2lsbCBjYXVzZSBhCiAgICAgICAgICAgIC8vIGNpcmN1bGFyIGVycm9yIHRoYXQgd2lsbCBldmVudHVhbGx5IGVycm9yIG91dCwgYmVjYXVzZSB0aGUgaW5qZWN0b3IgaXNuJ3QgY3JlYXRlZCB5ZXQuCiAgICAgICAgICAgIHRoaXMuX3IzSW5qZWN0b3IuX3Jlc29sdmVJbmplY3RvckRlZlR5cGVzKCk7CiAgICAgICAgICAgIHRoaXMuaW5zdGFuY2UgPSB0aGlzLmdldChuZ01vZHVsZVR5cGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGluamVjdEZsYWdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQodG9rZW4sIG5vdEZvdW5kVmFsdWUgPSBJbmplY3Rvci5USFJPV19JRl9OT1RfRk9VTkQsIGluamVjdEZsYWdzID0gSW5qZWN0RmxhZ3MuRGVmYXVsdCkgewogICAgICAgICAgICBpZiAodG9rZW4gPT09IEluamVjdG9yIHx8IHRva2VuID09PSBOZ01vZHVsZVJlZiB8fCB0b2tlbiA9PT0gSU5KRUNUT1IpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yM0luamVjdG9yLmdldCh0b2tlbiwgbm90Rm91bmRWYWx1ZSwgaW5qZWN0RmxhZ3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRoaXMuZGVzdHJveUNicywgJ05nTW9kdWxlIGFscmVhZHkgZGVzdHJveWVkJyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLl9yM0luamVjdG9yOwogICAgICAgICAgICAhaW5qZWN0b3IuZGVzdHJveWVkICYmIGluamVjdG9yLmRlc3Ryb3koKTsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZGVzdHJveUNicykpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveUNicyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRGVzdHJveShjYWxsYmFjaykgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYgYXNzZXJ0RGVmaW5lZCh0aGlzLmRlc3Ryb3lDYnMsICdOZ01vZHVsZSBhbHJlYWR5IGRlc3Ryb3llZCcpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5kZXN0cm95Q2JzKSkucHVzaChjYWxsYmFjayk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBOZ01vZHVsZUZhY3RvcnkkMSBleHRlbmRzIE5nTW9kdWxlRmFjdG9yeSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IobW9kdWxlVHlwZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLm1vZHVsZVR5cGUgPSBtb2R1bGVUeXBlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYobW9kdWxlVHlwZSk7CiAgICAgICAgICAgIGlmIChuZ01vZHVsZURlZiAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLy8gUmVnaXN0ZXIgdGhlIE5nTW9kdWxlIHdpdGggQW5ndWxhcidzIG1vZHVsZSByZWdpc3RyeS4gVGhlIGxvY2F0aW9uIChhbmQgaGVuY2UgdGltaW5nKSBvZgogICAgICAgICAgICAgICAgLy8gdGhpcyBjYWxsIGlzIGNyaXRpY2FsIHRvIGVuc3VyZSB0aGlzIHdvcmtzIGNvcnJlY3RseSAobW9kdWxlcyBnZXQgcmVnaXN0ZXJlZCB3aGVuIGV4cGVjdGVkKQogICAgICAgICAgICAgICAgLy8gd2l0aG91dCBibG9hdGluZyBidW5kbGVzIChtb2R1bGVzIGFyZSByZWdpc3RlcmVkIHdoZW4gb3RoZXJ3aXNlIG5vdCByZWZlcmVuY2VkKS4KICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAvLyBJbiBWaWV3IEVuZ2luZSwgcmVnaXN0cmF0aW9uIG9jY3VycyBpbiB0aGUgLm5nZmFjdG9yeS5qcyBmaWxlIGFzIGEgc2lkZSBlZmZlY3QuIFRoaXMgaGFzCiAgICAgICAgICAgICAgICAvLyBzZXZlcmFsIHByYWN0aWNhbCBjb25zZXF1ZW5jZXM6CiAgICAgICAgICAgICAgICAvLwogICAgICAgICAgICAgICAgLy8gLSBJZiBhbiAubmdmYWN0b3J5IGZpbGUgaXMgbm90IGltcG9ydGVkIGZyb20sIHRoZSBtb2R1bGUgd29uJ3QgYmUgcmVnaXN0ZXJlZCAoYW5kIGNhbiBiZQogICAgICAgICAgICAgICAgLy8gICB0cmVlIHNoYWtlbikuCiAgICAgICAgICAgICAgICAvLyAtIElmIGFuIC5uZ2ZhY3RvcnkgZmlsZSBpcyBpbXBvcnRlZCBmcm9tLCB0aGUgbW9kdWxlIHdpbGwgYmUgcmVnaXN0ZXJlZCBldmVuIGlmIGFuIGluc3RhbmNlCiAgICAgICAgICAgICAgICAvLyAgIGlzIG5vdCBhY3R1YWxseSBjcmVhdGVkICh2aWEgYGNyZWF0ZWAgYmVsb3cpLgogICAgICAgICAgICAgICAgLy8gLSBTaW5jZSBhbiAubmdmYWN0b3J5IGZpbGUgaW4gVmlldyBFbmdpbmUgcmVmZXJlbmNlcyB0aGUgLm5nZmFjdG9yeSBmaWxlcyBvZiB0aGUgTmdNb2R1bGUncwogICAgICAgICAgICAgICAgLy8gICBpbXBvcnRzLAogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIEluIEl2eSwgdGhpbmdzIGFyZSBhIGJpdCBkaWZmZXJlbnQuIC5uZ2ZhY3RvcnkgZmlsZXMgc3RpbGwgZXhpc3QgZm9yIGNvbXBhdGliaWxpdHksIGJ1dCBhcmUKICAgICAgICAgICAgICAgIC8vIG5vdCBhIHJlcXVpcmVkIEFQSSB0byB1c2UgLSB0aGVyZSBhcmUgb3RoZXIgd2F5cyB0byBvYnRhaW4gYW4gTmdNb2R1bGVGYWN0b3J5IGZvciBhIGdpdmVuCiAgICAgICAgICAgICAgICAvLyBOZ01vZHVsZS4gVGh1cywgcmVseWluZyBvbiBhIHNpZGUgZWZmZWN0IGluIHRoZSAubmdmYWN0b3J5IGZpbGUgaXMgbm90IHN1ZmZpY2llbnQuIEluc3RlYWQsCiAgICAgICAgICAgICAgICAvLyB0aGUgc2lkZSBlZmZlY3Qgb2YgcmVnaXN0cmF0aW9uIGlzIGFkZGVkIGhlcmUsIGluIHRoZSBjb25zdHJ1Y3RvciBvZiBOZ01vZHVsZUZhY3RvcnksCiAgICAgICAgICAgICAgICAvLyBlbnN1cmluZyBubyBtYXR0ZXIgaG93IGEgZmFjdG9yeSBpcyBjcmVhdGVkLCB0aGUgbW9kdWxlIGlzIHJlZ2lzdGVyZWQgY29ycmVjdGx5LgogICAgICAgICAgICAgICAgLy8KICAgICAgICAgICAgICAgIC8vIEFuIGFsdGVybmF0aXZlIHdvdWxkIGJlIHRvIGluY2x1ZGUgdGhlIHJlZ2lzdHJhdGlvbiBzaWRlIGVmZmVjdCBpbmxpbmUgZm9sbG93aW5nIHRoZSBhY3R1YWwKICAgICAgICAgICAgICAgIC8vIE5nTW9kdWxlIGRlZmluaXRpb24uIFRoaXMgYWxzbyBoYXMgdGhlIGNvcnJlY3QgdGltaW5nLCBidXQgYnJlYWtzIHRyZWUtc2hha2luZyAtIG1vZHVsZXMKICAgICAgICAgICAgICAgIC8vIHdpbGwgYmUgcmVnaXN0ZXJlZCBhbmQgcmV0YWluZWQgZXZlbiBpZiB0aGV5J3JlIG90aGVyd2lzZSBuZXZlciByZWZlcmVuY2VkLgogICAgICAgICAgICAgICAgcmVnaXN0ZXJOZ01vZHVsZVR5cGUoKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZVR5cGUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnRJbmplY3RvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlKHBhcmVudEluamVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTmdNb2R1bGVSZWYkMSh0aGlzLm1vZHVsZVR5cGUsIHBhcmVudEluamVjdG9yKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3B1cmVfZnVuY3Rpb24udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBCaW5kaW5ncyBmb3IgcHVyZSBmdW5jdGlvbnMgYXJlIHN0b3JlZCBhZnRlciByZWd1bGFyIGJpbmRpbmdzLgogICAgICoKICAgICAqIHwtLS0tLS0tZGVjbHMtLS0tLS18LS0tLS0tLS0tdmFycy0tLS0tLS0tLXwgICAgICAgICAgICAgICAgIHwtLS0tLSBob3N0VmFycyAoZGlyMSkgLS0tLS0tfAogICAgICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiB8IG5vZGVzL3JlZnMvcGlwZXMgfCBiaW5kaW5ncyB8IGZuIHNsb3RzICB8IGluamVjdG9yIHwgZGlyMSB8IGhvc3QgYmluZGluZ3MgfCBob3N0IHNsb3RzIHwKICAgICAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgICogICAgICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgXgogICAgICogICAgICBUVmlldy5iaW5kaW5nU3RhcnRJbmRleCAgICAgIFRWaWV3LmV4cGFuZG9TdGFydEluZGV4CiAgICAgKgogICAgICogUHVyZSBmdW5jdGlvbiBpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIGFuIG9mZnNldCBmcm9tIHRoZSBiaW5kaW5nIHJvb3QuIEFkZGluZyB0aGUgb2Zmc2V0IHRvIHRoZQogICAgICogYmluZGluZyByb290IGdpdmVzIHRoZSBmaXJzdCBpbmRleCB3aGVyZSB0aGUgYmluZGluZ3MgYXJlIHN0b3JlZC4gSW4gY29tcG9uZW50IHZpZXdzLCB0aGUgYmluZGluZwogICAgICogcm9vdCBpcyB0aGUgYmluZGluZ1N0YXJ0SW5kZXguIEluIGhvc3QgYmluZGluZ3MsIHRoZSBiaW5kaW5nIHJvb3QgaXMgdGhlIGV4cGFuZG9TdGFydEluZGV4ICsKICAgICAqIGFueSBkaXJlY3RpdmUgaW5zdGFuY2VzICsgYW55IGhvc3RWYXJzIGluIGRpcmVjdGl2ZXMgZXZhbHVhdGVkIGJlZm9yZSBpdC4KICAgICAqCiAgICAgKiBTZWUgVklFV19EQVRBLm1kIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGhvc3QgYmluZGluZyByZXNvbHV0aW9uLgogICAgICovCiAgICAvKioKICAgICAqIElmIHRoZSB2YWx1ZSBoYXNuJ3QgYmVlbiBzYXZlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gc3RvcmUgYW5kIHJldHVybiB0aGUKICAgICAqIHZhbHVlLiBJZiBpdCBoYXMgYmVlbiBzYXZlZCwgcmV0dXJucyB0aGUgc2F2ZWQgdmFsdWUuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICAgICAqIEBwYXJhbSB7P30gcHVyZUZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhIHZhbHVlCiAgICAgKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICAgICAqIEByZXR1cm4gez99IHZhbHVlCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cHVyZUZ1bmN0aW9uMChzbG90T2Zmc2V0LCBwdXJlRm4sIHRoaXNBcmcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICByZXR1cm4gbFZpZXdbYmluZGluZ0luZGV4XSA9PT0gTk9fQ0hBTkdFID8KICAgICAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZykgOiBwdXJlRm4oKSkgOgogICAgICAgICAgICBnZXRCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXgpOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbiBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gdXBkYXRlZCB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBleHAgVXBkYXRlZCBleHByZXNzaW9uIHZhbHVlCiAgICAgKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICAgICAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cHVyZUZ1bmN0aW9uMShzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cCwgdGhpc0FyZykgewogICAgICAgIHJldHVybiBwdXJlRnVuY3Rpb24xSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbgogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb24yKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgdGhpc0FyZykgewogICAgICAgIHJldHVybiBwdXJlRnVuY3Rpb24ySW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCB0aGlzQXJnKTsKICAgIH0KICAgIC8qKgogICAgICogSWYgdGhlIHZhbHVlIG9mIGFueSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogICAgICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogICAgICogQHBhcmFtIHs/fSBwdXJlRm4KICAgICAqIEBwYXJhbSB7P30gZXhwMQogICAgICogQHBhcmFtIHs/fSBleHAyCiAgICAgKiBAcGFyYW0gez99IGV4cDMKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb24zKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgdGhpc0FyZykgewogICAgICAgIHJldHVybiBwdXJlRnVuY3Rpb24zSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKTsKICAgIH0KICAgIC8qKgogICAgICogSWYgdGhlIHZhbHVlIG9mIGFueSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogICAgICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogICAgICogQHBhcmFtIHs/fSBwdXJlRm4KICAgICAqIEBwYXJhbSB7P30gZXhwMQogICAgICogQHBhcmFtIHs/fSBleHAyCiAgICAgKiBAcGFyYW0gez99IGV4cDMKICAgICAqIEBwYXJhbSB7P30gZXhwNAogICAgICogQHBhcmFtIHs/PX0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuCiAgICAgKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjQoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCB0aGlzQXJnKSB7CiAgICAgICAgcmV0dXJuIHB1cmVGdW5jdGlvbjRJbnRlcm5hbChnZXRMVmlldygpLCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIHRoaXNBcmcpOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbgogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7P30gZXhwMwogICAgICogQHBhcmFtIHs/fSBleHA0CiAgICAgKiBAcGFyYW0gez99IGV4cDUKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb241KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgdGhpc0FyZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICAgICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1KSB8fCBkaWZmZXJlbnQgPwogICAgICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA1LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSkgOgogICAgICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUpKSA6CiAgICAgICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDUpOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbgogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7P30gZXhwMwogICAgICogQHBhcmFtIHs/fSBleHA0CiAgICAgKiBAcGFyYW0gez99IGV4cDUKICAgICAqIEBwYXJhbSB7P30gZXhwNgogICAgICogQHBhcmFtIHs/PX0gdGhpc0FyZyBPcHRpb25hbCBjYWxsaW5nIGNvbnRleHQgb2YgcHVyZUZuCiAgICAgKiBAcmV0dXJuIHs/fSBVcGRhdGVkIG9yIGNhY2hlZCB2YWx1ZQogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtXB1cmVGdW5jdGlvbjYoc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCB0aGlzQXJnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGdldEJpbmRpbmdSb290KCkgKyBzbG90T2Zmc2V0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsVmlldyA9IGdldExWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzLCBleHA0KTsKICAgICAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQyKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2KSB8fCBkaWZmZXJlbnQgPwogICAgICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA2LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNikgOgogICAgICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYpKSA6CiAgICAgICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDYpOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbgogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7P30gZXhwMwogICAgICogQHBhcmFtIHs/fSBleHA0CiAgICAgKiBAcGFyYW0gez99IGV4cDUKICAgICAqIEBwYXJhbSB7P30gZXhwNgogICAgICogQHBhcmFtIHs/fSBleHA3CiAgICAgKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICAgICAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cHVyZUZ1bmN0aW9uNyhzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYsIGV4cDcsIHRoaXNBcmcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gZ2V0QmluZGluZ1Jvb3QoKSArIHNsb3RPZmZzZXQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZmZlcmVudCA9IGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyLCBleHAzLCBleHA0KTsKICAgICAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCBleHA1LCBleHA2LCBleHA3KSB8fCBkaWZmZXJlbnQgPwogICAgICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA3LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgZXhwNykgOgogICAgICAgICAgICAgICAgcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYsIGV4cDcpKSA6CiAgICAgICAgICAgIGdldEJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDcpOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbgogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7P30gZXhwMwogICAgICogQHBhcmFtIHs/fSBleHA0CiAgICAgKiBAcGFyYW0gez99IGV4cDUKICAgICAqIEBwYXJhbSB7P30gZXhwNgogICAgICogQHBhcmFtIHs/fSBleHA3CiAgICAgKiBAcGFyYW0gez99IGV4cDgKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb244KHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCwgZXhwNSwgZXhwNiwgZXhwNywgZXhwOCwgdGhpc0FyZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBnZXRCaW5kaW5nUm9vdCgpICsgc2xvdE9mZnNldDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaWZmZXJlbnQgPSBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCk7CiAgICAgICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkNChsVmlldywgYmluZGluZ0luZGV4ICsgNCwgZXhwNSwgZXhwNiwgZXhwNywgZXhwOCkgfHwgZGlmZmVyZW50ID8KICAgICAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgOCwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIGV4cDUsIGV4cDYsIGV4cDcsIGV4cDgpIDoKICAgICAgICAgICAgICAgIHB1cmVGbihleHAxLCBleHAyLCBleHAzLCBleHA0LCBleHA1LCBleHA2LCBleHA3LCBleHA4KSkgOgogICAgICAgICAgICBnZXRCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA4KTsKICAgIH0KICAgIC8qKgogICAgICogcHVyZUZ1bmN0aW9uIGluc3RydWN0aW9uIHRoYXQgY2FuIHN1cHBvcnQgYW55IG51bWJlciBvZiBiaW5kaW5ncy4KICAgICAqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgYW55IHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiBubyB2YWx1ZXMgaGF2ZSBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbiBBIHB1cmUgZnVuY3Rpb24gdGhhdCB0YWtlcyBiaW5kaW5nIHZhbHVlcyBhbmQgYnVpbGRzIGFuIG9iamVjdCBvciBhcnJheQogICAgICogY29udGFpbmluZyB0aG9zZSB2YWx1ZXMuCiAgICAgKiBAcGFyYW0gez99IGV4cHMgQW4gYXJyYXkgb2YgYmluZGluZyB2YWx1ZXMKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwdXJlRnVuY3Rpb25WKHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwcywgdGhpc0FyZykgewogICAgICAgIHJldHVybiBwdXJlRnVuY3Rpb25WSW50ZXJuYWwoZ2V0TFZpZXcoKSwgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHBzLCB0aGlzQXJnKTsKICAgIH0KICAgIC8qKgogICAgICogUmVzdWx0cyBvZiBhIHB1cmUgZnVuY3Rpb24gaW52b2NhdGlvbiBhcmUgc3RvcmVkIGluIExWaWV3IGluIGEgZGVkaWNhdGVkIHNsb3QgdGhhdCBpcyBpbml0aWFsaXplZAogICAgICogdG8gTk9fQ0hBTkdFLiBJbiByYXJlIHNpdHVhdGlvbnMgYSBwdXJlIHBpcGUgbWlnaHQgdGhyb3cgYW4gZXhjZXB0aW9uIG9uIHRoZSB2ZXJ5IGZpcnN0CiAgICAgKiBpbnZvY2F0aW9uIGFuZCBub3QgcHJvZHVjZSBhbnkgdmFsaWQgcmVzdWx0cy4gSW4gdGhpcyBjYXNlIExWaWV3IHdvdWxkIGtlZXAgaG9sZGluZyB0aGUgTk9fQ0hBTkdFCiAgICAgKiB2YWx1ZS4gVGhlIE5PX0NIQU5HRSBpcyBub3Qgc29tZXRoaW5nIHRoYXQgd2UgY2FuIHVzZSBpbiBleHByZXNzaW9ucyAvIGJpbmRpbmdzIHRodXMgd2UgY29udmVydAogICAgICogaXQgdG8gYHVuZGVmaW5lZGAuCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHJldHVyblZhbHVlSW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFB1cmVGdW5jdGlvblJldHVyblZhbHVlKGxWaWV3LCByZXR1cm5WYWx1ZUluZGV4KSB7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKGxWaWV3LCByZXR1cm5WYWx1ZUluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbGFzdFJldHVyblZhbHVlID0gbFZpZXdbcmV0dXJuVmFsdWVJbmRleF07CiAgICAgICAgcmV0dXJuIGxhc3RSZXR1cm5WYWx1ZSA9PT0gTk9fQ0hBTkdFID8gdW5kZWZpbmVkIDogbGFzdFJldHVyblZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBJZiB0aGUgdmFsdWUgb2YgdGhlIHByb3ZpZGVkIGV4cCBoYXMgY2hhbmdlZCwgY2FsbHMgdGhlIHB1cmUgZnVuY3Rpb24gdG8gcmV0dXJuCiAgICAgKiBhbiB1cGRhdGVkIHZhbHVlLiBPciBpZiB0aGUgdmFsdWUgaGFzIG5vdCBjaGFuZ2VkLCByZXR1cm5zIGNhY2hlZCB2YWx1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3IExWaWV3IGluIHdoaWNoIHRoZSBmdW5jdGlvbiBpcyBiZWluZyBleGVjdXRlZC4KICAgICAqIEBwYXJhbSB7P30gYmluZGluZ1Jvb3QgQmluZGluZyByb290IGluZGV4LgogICAgICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgZnJvbSBiaW5kaW5nIHJvb3QgdG8gdGhlIHJlc2VydmVkIHNsb3QKICAgICAqIEBwYXJhbSB7P30gcHVyZUZuIEZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiB1cGRhdGVkIHZhbHVlCiAgICAgKiBAcGFyYW0gez99IGV4cCBVcGRhdGVkIGV4cHJlc3Npb24gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqLwogICAgZnVuY3Rpb24gcHVyZUZ1bmN0aW9uMUludGVybmFsKGxWaWV3LCBiaW5kaW5nUm9vdCwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAsIHRoaXNBcmcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZChsVmlldywgYmluZGluZ0luZGV4LCBleHApID8KICAgICAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgMSwgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cCkgOiBwdXJlRm4oZXhwKSkgOgogICAgICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgMSk7CiAgICB9CiAgICAvKioKICAgICAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICAgICAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nUm9vdCBCaW5kaW5nIHJvb3QgaW5kZXguCiAgICAgKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogICAgICogQHBhcmFtIHs/fSBwdXJlRm4KICAgICAqIEBwYXJhbSB7P30gZXhwMQogICAgICogQHBhcmFtIHs/fSBleHAyCiAgICAgKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICAgICAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHB1cmVGdW5jdGlvbjJJbnRlcm5hbChsVmlldywgYmluZGluZ1Jvb3QsIHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwMSwgZXhwMiwgdGhpc0FyZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW5kaW5nSW5kZXggPSBiaW5kaW5nUm9vdCArIHNsb3RPZmZzZXQ7CiAgICAgICAgcmV0dXJuIGJpbmRpbmdVcGRhdGVkMihsVmlldywgYmluZGluZ0luZGV4LCBleHAxLCBleHAyKSA/CiAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcobFZpZXcsIGJpbmRpbmdJbmRleCArIDIsIHRoaXNBcmcgPyBwdXJlRm4uY2FsbCh0aGlzQXJnLCBleHAxLCBleHAyKSA6IHB1cmVGbihleHAxLCBleHAyKSkgOgogICAgICAgICAgICBnZXRQdXJlRnVuY3Rpb25SZXR1cm5WYWx1ZShsVmlldywgYmluZGluZ0luZGV4ICsgMik7CiAgICB9CiAgICAvKioKICAgICAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICAgICAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nUm9vdCBCaW5kaW5nIHJvb3QgaW5kZXguCiAgICAgKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogICAgICogQHBhcmFtIHs/fSBwdXJlRm4KICAgICAqIEBwYXJhbSB7P30gZXhwMQogICAgICogQHBhcmFtIHs/fSBleHAyCiAgICAgKiBAcGFyYW0gez99IGV4cDMKICAgICAqIEBwYXJhbSB7Pz19IHRoaXNBcmcgT3B0aW9uYWwgY2FsbGluZyBjb250ZXh0IG9mIHB1cmVGbgogICAgICogQHJldHVybiB7P30gVXBkYXRlZCBvciBjYWNoZWQgdmFsdWUKICAgICAqLwogICAgZnVuY3Rpb24gcHVyZUZ1bmN0aW9uM0ludGVybmFsKGxWaWV3LCBiaW5kaW5nUm9vdCwgc2xvdE9mZnNldCwgcHVyZUZuLCBleHAxLCBleHAyLCBleHAzLCB0aGlzQXJnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJpbmRpbmdJbmRleCA9IGJpbmRpbmdSb290ICsgc2xvdE9mZnNldDsKICAgICAgICByZXR1cm4gYmluZGluZ1VwZGF0ZWQzKGxWaWV3LCBiaW5kaW5nSW5kZXgsIGV4cDEsIGV4cDIsIGV4cDMpID8KICAgICAgICAgICAgdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4ICsgMywgdGhpc0FyZyA/IHB1cmVGbi5jYWxsKHRoaXNBcmcsIGV4cDEsIGV4cDIsIGV4cDMpIDogcHVyZUZuKGV4cDEsIGV4cDIsIGV4cDMpKSA6CiAgICAgICAgICAgIGdldFB1cmVGdW5jdGlvblJldHVyblZhbHVlKGxWaWV3LCBiaW5kaW5nSW5kZXggKyAzKTsKICAgIH0KICAgIC8qKgogICAgICogSWYgdGhlIHZhbHVlIG9mIGFueSBwcm92aWRlZCBleHAgaGFzIGNoYW5nZWQsIGNhbGxzIHRoZSBwdXJlIGZ1bmN0aW9uIHRvIHJldHVybgogICAgICogYW4gdXBkYXRlZCB2YWx1ZS4gT3IgaWYgbm8gdmFsdWVzIGhhdmUgY2hhbmdlZCwgcmV0dXJucyBjYWNoZWQgdmFsdWUuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBsVmlldyBMVmlldyBpbiB3aGljaCB0aGUgZnVuY3Rpb24gaXMgYmVpbmcgZXhlY3V0ZWQuCiAgICAgKiBAcGFyYW0gez99IGJpbmRpbmdSb290IEJpbmRpbmcgcm9vdCBpbmRleC4KICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGZyb20gYmluZGluZyByb290IHRvIHRoZSByZXNlcnZlZCBzbG90CiAgICAgKiBAcGFyYW0gez99IHB1cmVGbgogICAgICogQHBhcmFtIHs/fSBleHAxCiAgICAgKiBAcGFyYW0gez99IGV4cDIKICAgICAqIEBwYXJhbSB7P30gZXhwMwogICAgICogQHBhcmFtIHs/fSBleHA0CiAgICAgKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICAgICAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBwdXJlRnVuY3Rpb240SW50ZXJuYWwobFZpZXcsIGJpbmRpbmdSb290LCBzbG90T2Zmc2V0LCBwdXJlRm4sIGV4cDEsIGV4cDIsIGV4cDMsIGV4cDQsIHRoaXNBcmcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgICAgIHJldHVybiBiaW5kaW5nVXBkYXRlZDQobFZpZXcsIGJpbmRpbmdJbmRleCwgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkgPwogICAgICAgICAgICB1cGRhdGVCaW5kaW5nKGxWaWV3LCBiaW5kaW5nSW5kZXggKyA0LCB0aGlzQXJnID8gcHVyZUZuLmNhbGwodGhpc0FyZywgZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkgOiBwdXJlRm4oZXhwMSwgZXhwMiwgZXhwMywgZXhwNCkpIDoKICAgICAgICAgICAgZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIGJpbmRpbmdJbmRleCArIDQpOwogICAgfQogICAgLyoqCiAgICAgKiBwdXJlRnVuY3Rpb24gaW5zdHJ1Y3Rpb24gdGhhdCBjYW4gc3VwcG9ydCBhbnkgbnVtYmVyIG9mIGJpbmRpbmdzLgogICAgICoKICAgICAqIElmIHRoZSB2YWx1ZSBvZiBhbnkgcHJvdmlkZWQgZXhwIGhhcyBjaGFuZ2VkLCBjYWxscyB0aGUgcHVyZSBmdW5jdGlvbiB0byByZXR1cm4KICAgICAqIGFuIHVwZGF0ZWQgdmFsdWUuIE9yIGlmIG5vIHZhbHVlcyBoYXZlIGNoYW5nZWQsIHJldHVybnMgY2FjaGVkIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcgTFZpZXcgaW4gd2hpY2ggdGhlIGZ1bmN0aW9uIGlzIGJlaW5nIGV4ZWN1dGVkLgogICAgICogQHBhcmFtIHs/fSBiaW5kaW5nUm9vdCBCaW5kaW5nIHJvb3QgaW5kZXguCiAgICAgKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBmcm9tIGJpbmRpbmcgcm9vdCB0byB0aGUgcmVzZXJ2ZWQgc2xvdAogICAgICogQHBhcmFtIHs/fSBwdXJlRm4gQSBwdXJlIGZ1bmN0aW9uIHRoYXQgdGFrZXMgYmluZGluZyB2YWx1ZXMgYW5kIGJ1aWxkcyBhbiBvYmplY3Qgb3IgYXJyYXkKICAgICAqIGNvbnRhaW5pbmcgdGhvc2UgdmFsdWVzLgogICAgICogQHBhcmFtIHs/fSBleHBzIEFuIGFycmF5IG9mIGJpbmRpbmcgdmFsdWVzCiAgICAgKiBAcGFyYW0gez89fSB0aGlzQXJnIE9wdGlvbmFsIGNhbGxpbmcgY29udGV4dCBvZiBwdXJlRm4KICAgICAqIEByZXR1cm4gez99IFVwZGF0ZWQgb3IgY2FjaGVkIHZhbHVlCiAgICAgKi8KICAgIGZ1bmN0aW9uIHB1cmVGdW5jdGlvblZJbnRlcm5hbChsVmlldywgYmluZGluZ1Jvb3QsIHNsb3RPZmZzZXQsIHB1cmVGbiwgZXhwcywgdGhpc0FyZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYmluZGluZ0luZGV4ID0gYmluZGluZ1Jvb3QgKyBzbG90T2Zmc2V0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGlmZmVyZW50ID0gZmFsc2U7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBleHBzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGJpbmRpbmdVcGRhdGVkKGxWaWV3LCBiaW5kaW5nSW5kZXgrKywgZXhwc1tpXSkgJiYgKGRpZmZlcmVudCA9IHRydWUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGlmZmVyZW50ID8gdXBkYXRlQmluZGluZyhsVmlldywgYmluZGluZ0luZGV4LCBwdXJlRm4uYXBwbHkodGhpc0FyZywgZXhwcykpIDoKICAgICAgICAgICAgZ2V0UHVyZUZ1bmN0aW9uUmV0dXJuVmFsdWUobFZpZXcsIGJpbmRpbmdJbmRleCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL3BpcGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDcmVhdGUgYSBwaXBlLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdpbGwgYmUgc3RvcmVkLgogICAgICogQHBhcmFtIHs/fSBwaXBlTmFtZSBUaGUgbmFtZSBvZiB0aGUgcGlwZQogICAgICogQHJldHVybiB7P30gVCB0aGUgaW5zdGFuY2Ugb2YgdGhlIHBpcGUuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cGlwZShpbmRleCwgcGlwZU5hbWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFZpZXcgPSBnZXRUVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGlwZURlZjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWRqdXN0ZWRJbmRleCA9IGluZGV4ICsgSEVBREVSX09GRlNFVDsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIHBpcGVEZWYgPSBnZXRQaXBlRGVmJDEocGlwZU5hbWUsIHRWaWV3LnBpcGVSZWdpc3RyeSk7CiAgICAgICAgICAgIHRWaWV3LmRhdGFbYWRqdXN0ZWRJbmRleF0gPSBwaXBlRGVmOwogICAgICAgICAgICBpZiAocGlwZURlZi5vbkRlc3Ryb3kpIHsKICAgICAgICAgICAgICAgICh0Vmlldy5kZXN0cm95SG9va3MgfHwgKHRWaWV3LmRlc3Ryb3lIb29rcyA9IFtdKSkucHVzaChhZGp1c3RlZEluZGV4LCBwaXBlRGVmLm9uRGVzdHJveSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHBpcGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXcuZGF0YVthZGp1c3RlZEluZGV4XSkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGlwZUZhY3RvcnkgPSBwaXBlRGVmLmZhY3RvcnkgfHwgKHBpcGVEZWYuZmFjdG9yeSA9IGdldEZhY3RvcnlEZWYocGlwZURlZi50eXBlLCB0cnVlKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZpb3VzSW5qZWN0SW1wbGVtZW50YXRpb24gPSBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbijJtcm1ZGlyZWN0aXZlSW5qZWN0KTsKICAgICAgICAvLyBESSBmb3IgcGlwZXMgaXMgc3VwcG9zZWQgdG8gYmVoYXZlIGxpa2UgZGlyZWN0aXZlcyB3aGVuIHBsYWNlZCBvbiBhIGNvbXBvbmVudAogICAgICAgIC8vIGhvc3Qgbm9kZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBoYXZlIHRvIGRpc2FibGUgYWNjZXNzIHRvIGB2aWV3UHJvdmlkZXJzYC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJldmlvdXNJbmNsdWRlVmlld1Byb3ZpZGVycyA9IHNldEluY2x1ZGVWaWV3UHJvdmlkZXJzKGZhbHNlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGlwZUluc3RhbmNlID0gcGlwZUZhY3RvcnkoKTsKICAgICAgICBzZXRJbmNsdWRlVmlld1Byb3ZpZGVycyhwcmV2aW91c0luY2x1ZGVWaWV3UHJvdmlkZXJzKTsKICAgICAgICBzZXRJbmplY3RJbXBsZW1lbnRhdGlvbihwcmV2aW91c0luamVjdEltcGxlbWVudGF0aW9uKTsKICAgICAgICBzdG9yZSh0VmlldywgZ2V0TFZpZXcoKSwgaW5kZXgsIHBpcGVJbnN0YW5jZSk7CiAgICAgICAgcmV0dXJuIHBpcGVJbnN0YW5jZTsKICAgIH0KICAgIC8qKgogICAgICogU2VhcmNoZXMgdGhlIHBpcGUgcmVnaXN0cnkgZm9yIGEgcGlwZSB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBvbmUgaXMgZm91bmQsCiAgICAgKiByZXR1cm5zIHRoZSBwaXBlLiBPdGhlcndpc2UsIGFuIGVycm9yIGlzIHRocm93biBiZWNhdXNlIHRoZSBwaXBlIGNhbm5vdCBiZSByZXNvbHZlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IG5hbWUgTmFtZSBvZiBwaXBlIHRvIHJlc29sdmUKICAgICAqIEBwYXJhbSB7P30gcmVnaXN0cnkgRnVsbCBsaXN0IG9mIGF2YWlsYWJsZSBwaXBlcwogICAgICogQHJldHVybiB7P30gTWF0Y2hpbmcgUGlwZURlZgogICAgICovCiAgICBmdW5jdGlvbiBnZXRQaXBlRGVmJDEobmFtZSwgcmVnaXN0cnkpIHsKICAgICAgICBpZiAocmVnaXN0cnkpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHJlZ2lzdHJ5Lmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwaXBlRGVmID0gcmVnaXN0cnlbaV07CiAgICAgICAgICAgICAgICBpZiAobmFtZSA9PT0gcGlwZURlZi5uYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHBpcGVEZWY7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcGlwZSAnJHtuYW1lfScgY291bGQgbm90IGJlIGZvdW5kIWApOwogICAgfQogICAgLyoqCiAgICAgKiBJbnZva2VzIGEgcGlwZSB3aXRoIDEgYXJndW1lbnRzLgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAgICAgKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogICAgICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2UKICAgICAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwaXBlQmluZDEoaW5kZXgsIHNsb3RPZmZzZXQsIHYxKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGlwZUluc3RhbmNlID0gbG9hZChsVmlldywgaW5kZXgpOwogICAgICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/CiAgICAgICAgICAgIHB1cmVGdW5jdGlvbjFJbnRlcm5hbChsVmlldywgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdjEsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtKHYxKSk7CiAgICB9CiAgICAvKioKICAgICAqIEludm9rZXMgYSBwaXBlIHdpdGggMiBhcmd1bWVudHMuCiAgICAgKgogICAgICogVGhpcyBpbnN0cnVjdGlvbiBhY3RzIGFzIGEgZ3VhcmQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0gaW52b2tpbmcKICAgICAqIHRoZSBwaXBlIG9ubHkgd2hlbiBhbiBpbnB1dCB0byB0aGUgcGlwZSBjaGFuZ2VzLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSBpbmRleCBQaXBlIGluZGV4IHdoZXJlIHRoZSBwaXBlIHdhcyBzdG9yZWQgb24gY3JlYXRpb24uCiAgICAgKiBAcGFyYW0gez99IHNsb3RPZmZzZXQgdGhlIG9mZnNldCBpbiB0aGUgcmVzZXJ2ZWQgc2xvdCBzcGFjZQogICAgICogQHBhcmFtIHs/fSB2MSAxc3QgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAgICAgKiBAcGFyYW0gez99IHYyIDJuZCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cGlwZUJpbmQyKGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwaXBlSW5zdGFuY2UgPSBsb2FkKGxWaWV3LCBpbmRleCk7CiAgICAgICAgcmV0dXJuIHVud3JhcFZhbHVlJDEobFZpZXcsIGlzUHVyZShsVmlldywgaW5kZXgpID8KICAgICAgICAgICAgcHVyZUZ1bmN0aW9uMkludGVybmFsKGxWaWV3LCBnZXRCaW5kaW5nUm9vdCgpLCBzbG90T2Zmc2V0LCBwaXBlSW5zdGFuY2UudHJhbnNmb3JtLCB2MSwgdjIsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtKHYxLCB2MikpOwogICAgfQogICAgLyoqCiAgICAgKiBJbnZva2VzIGEgcGlwZSB3aXRoIDMgYXJndW1lbnRzLgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAgICAgKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogICAgICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2UKICAgICAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogICAgICogQHBhcmFtIHs/fSB2MiAybmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAgICAgKiBAcGFyYW0gez99IHYzIDRyZCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1cGlwZUJpbmQzKGluZGV4LCBzbG90T2Zmc2V0LCB2MSwgdjIsIHYzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGlwZUluc3RhbmNlID0gbG9hZChsVmlldywgaW5kZXgpOwogICAgICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/IHB1cmVGdW5jdGlvbjNJbnRlcm5hbChsVmlldywgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdjEsIHYyLCB2MywgcGlwZUluc3RhbmNlKSA6CiAgICAgICAgICAgIHBpcGVJbnN0YW5jZS50cmFuc2Zvcm0odjEsIHYyLCB2MykpOwogICAgfQogICAgLyoqCiAgICAgKiBJbnZva2VzIGEgcGlwZSB3aXRoIDQgYXJndW1lbnRzLgogICAgICoKICAgICAqIFRoaXMgaW5zdHJ1Y3Rpb24gYWN0cyBhcyBhIGd1YXJkIHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19IGludm9raW5nCiAgICAgKiB0aGUgcGlwZSBvbmx5IHdoZW4gYW4gaW5wdXQgdG8gdGhlIHBpcGUgY2hhbmdlcy4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gaW5kZXggUGlwZSBpbmRleCB3aGVyZSB0aGUgcGlwZSB3YXMgc3RvcmVkIG9uIGNyZWF0aW9uLgogICAgICogQHBhcmFtIHs/fSBzbG90T2Zmc2V0IHRoZSBvZmZzZXQgaW4gdGhlIHJlc2VydmVkIHNsb3Qgc3BhY2UKICAgICAqIEBwYXJhbSB7P30gdjEgMXN0IGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogICAgICogQHBhcmFtIHs/fSB2MiAybmQgYXJndW1lbnQgdG8ge1xAbGluayBQaXBlVHJhbnNmb3JtI3RyYW5zZm9ybX0uCiAgICAgKiBAcGFyYW0gez99IHYzIDNyZCBhcmd1bWVudCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfS4KICAgICAqIEBwYXJhbSB7P30gdjQgNHRoIGFyZ3VtZW50IHRvIHtcQGxpbmsgUGlwZVRyYW5zZm9ybSN0cmFuc2Zvcm19LgogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVwaXBlQmluZDQoaW5kZXgsIHNsb3RPZmZzZXQsIHYxLCB2MiwgdjMsIHY0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGlwZUluc3RhbmNlID0gbG9hZChsVmlldywgaW5kZXgpOwogICAgICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/IHB1cmVGdW5jdGlvbjRJbnRlcm5hbChsVmlldywgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdjEsIHYyLCB2MywgdjQsIHBpcGVJbnN0YW5jZSkgOgogICAgICAgICAgICBwaXBlSW5zdGFuY2UudHJhbnNmb3JtKHYxLCB2MiwgdjMsIHY0KSk7CiAgICB9CiAgICAvKioKICAgICAqIEludm9rZXMgYSBwaXBlIHdpdGggdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cy4KICAgICAqCiAgICAgKiBUaGlzIGluc3RydWN0aW9uIGFjdHMgYXMgYSBndWFyZCB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBpbnZva2luZwogICAgICogdGhlIHBpcGUgb25seSB3aGVuIGFuIGlucHV0IHRvIHRoZSBwaXBlIGNoYW5nZXMuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAcGFyYW0gez99IGluZGV4IFBpcGUgaW5kZXggd2hlcmUgdGhlIHBpcGUgd2FzIHN0b3JlZCBvbiBjcmVhdGlvbi4KICAgICAqIEBwYXJhbSB7P30gc2xvdE9mZnNldCB0aGUgb2Zmc2V0IGluIHRoZSByZXNlcnZlZCBzbG90IHNwYWNlCiAgICAgKiBAcGFyYW0gez99IHZhbHVlcyBBcnJheSBvZiBhcmd1bWVudHMgdG8gcGFzcyB0byB7XEBsaW5rIFBpcGVUcmFuc2Zvcm0jdHJhbnNmb3JtfSBtZXRob2QuCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXBpcGVCaW5kVihpbmRleCwgc2xvdE9mZnNldCwgdmFsdWVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxWaWV3ID0gZ2V0TFZpZXcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGlwZUluc3RhbmNlID0gbG9hZChsVmlldywgaW5kZXgpOwogICAgICAgIHJldHVybiB1bndyYXBWYWx1ZSQxKGxWaWV3LCBpc1B1cmUobFZpZXcsIGluZGV4KSA/CiAgICAgICAgICAgIHB1cmVGdW5jdGlvblZJbnRlcm5hbChsVmlldywgZ2V0QmluZGluZ1Jvb3QoKSwgc2xvdE9mZnNldCwgcGlwZUluc3RhbmNlLnRyYW5zZm9ybSwgdmFsdWVzLCBwaXBlSW5zdGFuY2UpIDoKICAgICAgICAgICAgcGlwZUluc3RhbmNlLnRyYW5zZm9ybS5hcHBseShwaXBlSW5zdGFuY2UsIHZhbHVlcykpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1B1cmUobFZpZXcsIGluZGV4KSB7CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbVFZJRVddLmRhdGFbaW5kZXggKyBIRUFERVJfT0ZGU0VUXSkpKS5wdXJlOwogICAgfQogICAgLyoqCiAgICAgKiBVbndyYXAgdGhlIG91dHB1dCBvZiBhIHBpcGUgdHJhbnNmb3JtYXRpb24uCiAgICAgKiBJbiBvcmRlciB0byB0cmljayBjaGFuZ2UgZGV0ZWN0aW9uIGludG8gY29uc2lkZXJpbmcgdGhhdCB0aGUgbmV3IHZhbHVlIGlzIGFsd2F5cyBkaWZmZXJlbnQgZnJvbQogICAgICogdGhlIG9sZCBvbmUsIHRoZSBvbGQgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gYnkgTk9fQ0hBTkdFLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUgdGhlIHBpcGUgdHJhbnNmb3JtYXRpb24gb3V0cHV0LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdW53cmFwVmFsdWUkMShsVmlldywgbmV3VmFsdWUpIHsKICAgICAgICBpZiAoV3JhcHBlZFZhbHVlLmlzV3JhcHBlZChuZXdWYWx1ZSkpIHsKICAgICAgICAgICAgbmV3VmFsdWUgPSBXcmFwcGVkVmFsdWUudW53cmFwKG5ld1ZhbHVlKTsKICAgICAgICAgICAgLy8gVGhlIE5PX0NIQU5HRSB2YWx1ZSBuZWVkcyB0byBiZSB3cml0dGVuIGF0IHRoZSBpbmRleCB3aGVyZSB0aGUgaW1wYWN0ZWQgYmluZGluZyB2YWx1ZSBpcwogICAgICAgICAgICAvLyBzdG9yZWQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiaW5kaW5nVG9JbnZhbGlkYXRlSWR4ID0gZ2V0QmluZGluZ0luZGV4KCk7CiAgICAgICAgICAgIGxWaWV3W2JpbmRpbmdUb0ludmFsaWRhdGVJZHhdID0gTk9fQ0hBTkdFOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3VmFsdWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9ldmVudF9lbWl0dGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVXNlIGluIGNvbXBvbmVudHMgd2l0aCB0aGUgYFxAT3V0cHV0YCBkaXJlY3RpdmUgdG8gZW1pdCBjdXN0b20gZXZlbnRzCiAgICAgKiBzeW5jaHJvbm91c2x5IG9yIGFzeW5jaHJvbm91c2x5LCBhbmQgcmVnaXN0ZXIgaGFuZGxlcnMgZm9yIHRob3NlIGV2ZW50cwogICAgICogYnkgc3Vic2NyaWJpbmcgdG8gYW4gaW5zdGFuY2UuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogRXh0ZW5kcwogICAgICogW1J4SlMgYFN1YmplY3RgXShodHRwczovL3J4anMuZGV2L2FwaS9pbmRleC9jbGFzcy9TdWJqZWN0KQogICAgICogZm9yIEFuZ3VsYXIgYnkgYWRkaW5nIHRoZSBgZW1pdCgpYCBtZXRob2QuCiAgICAgKgogICAgICogSW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLCBhIGNvbXBvbmVudCBkZWZpbmVzIHR3byBvdXRwdXQgcHJvcGVydGllcwogICAgICogdGhhdCBjcmVhdGUgZXZlbnQgZW1pdHRlcnMuIFdoZW4gdGhlIHRpdGxlIGlzIGNsaWNrZWQsIHRoZSBlbWl0dGVyCiAgICAgKiBlbWl0cyBhbiBvcGVuIG9yIGNsb3NlIGV2ZW50IHRvIHRvZ2dsZSB0aGUgY3VycmVudCB2aXNpYmlsaXR5IHN0YXRlLgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgc2VsZWN0b3I6ICd6aXBweScsCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgIDxkaXYgY2xhc3M9InppcHB5Ij4KICAgICAqICAgICA8ZGl2IChjbGljayk9InRvZ2dsZSgpIj5Ub2dnbGU8L2Rpdj4KICAgICAqICAgICA8ZGl2IFtoaWRkZW5dPSIhdmlzaWJsZSI+CiAgICAgKiAgICAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+CiAgICAgKiAgICAgPC9kaXY+CiAgICAgKiAgPC9kaXY+YH0pCiAgICAgKiBleHBvcnQgY2xhc3MgWmlwcHkgewogICAgICogICB2aXNpYmxlOiBib29sZWFuID0gdHJ1ZTsKICAgICAqIFxAT3V0cHV0KCkgb3BlbjogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgKiBcQE91dHB1dCgpIGNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAqCiAgICAgKiAgIHRvZ2dsZSgpIHsKICAgICAqICAgICB0aGlzLnZpc2libGUgPSAhdGhpcy52aXNpYmxlOwogICAgICogICAgIGlmICh0aGlzLnZpc2libGUpIHsKICAgICAqICAgICAgIHRoaXMub3Blbi5lbWl0KG51bGwpOwogICAgICogICAgIH0gZWxzZSB7CiAgICAgKiAgICAgICB0aGlzLmNsb3NlLmVtaXQobnVsbCk7CiAgICAgKiAgICAgfQogICAgICogICB9CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBBY2Nlc3MgdGhlIGV2ZW50IG9iamVjdCB3aXRoIHRoZSBgJGV2ZW50YCBhcmd1bWVudCBwYXNzZWQgdG8gdGhlIG91dHB1dCBldmVudAogICAgICogaGFuZGxlcjoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8emlwcHkgKG9wZW4pPSJvbk9wZW4oJGV2ZW50KSIgKGNsb3NlKT0ib25DbG9zZSgkZXZlbnQpIj48L3ppcHB5PgogICAgICogYGBgCiAgICAgKgogICAgICogQHNlZSBbT2JzZXJ2YWJsZXMgaW4gQW5ndWxhcl0oZ3VpZGUvb2JzZXJ2YWJsZXMtaW4tYW5ndWxhcikKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBFdmVudEVtaXR0ZXIgZXh0ZW5kcyBTdWJqZWN0IHsKICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1saW5lCiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHRoYXQgY2FuCiAgICAgICAgICogZGVsaXZlciBldmVudHMgc3luY2hyb25vdXNseSBvciBhc3luY2hyb25vdXNseS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzQXN5bmMgV2hlbiB0cnVlLCBkZWxpdmVyIGV2ZW50cyBhc3luY2hyb25vdXNseS4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGlzQXN5bmMgPSBmYWxzZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9faXNBc3luYyA9IGlzQXN5bmM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIGFuIGV2ZW50IGNvbnRhaW5pbmcgYSBnaXZlbiB2YWx1ZS4KICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBUaGUgdmFsdWUgdG8gZW1pdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVtaXQodmFsdWUpIHsKICAgICAgICAgICAgc3VwZXIubmV4dCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBoYW5kbGVycyBmb3IgZXZlbnRzIGVtaXR0ZWQgYnkgdGhpcyBpbnN0YW5jZS4KICAgICAgICAgKiBAcGFyYW0gez89fSBnZW5lcmF0b3JPck5leHQgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgZW1pdHRlZCBldmVudHMuCiAgICAgICAgICogQHBhcmFtIHs/PX0gZXJyb3IgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgYW4gZXJyb3Igbm90aWZpY2F0aW9uCiAgICAgICAgICogZnJvbSB0aGlzIGVtaXR0ZXIuCiAgICAgICAgICogQHBhcmFtIHs/PX0gY29tcGxldGUgV2hlbiBzdXBwbGllZCwgYSBjdXN0b20gaGFuZGxlciBmb3IgYSBjb21wbGV0aW9uCiAgICAgICAgICogbm90aWZpY2F0aW9uIGZyb20gdGhpcyBlbWl0dGVyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3Vic2NyaWJlKGdlbmVyYXRvck9yTmV4dCwgZXJyb3IsIGNvbXBsZXRlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNjaGVkdWxlckZuOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBlcnJvckZuID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVycikgPT4gbnVsbCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbXBsZXRlRm4gPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBudWxsKTsKICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dCAmJiB0eXBlb2YgZ2VuZXJhdG9yT3JOZXh0ID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gZ2VuZXJhdG9yT3JOZXh0Lm5leHQodmFsdWUpKSk7CiAgICAgICAgICAgICAgICB9KSA6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dC5lcnJvcikgewogICAgICAgICAgICAgICAgICAgIGVycm9yRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKGVycikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGdlbmVyYXRvck9yTmV4dC5lcnJvcihlcnIpKSk7CiAgICAgICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnIKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yT3JOZXh0LmVycm9yKGVycik7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZ2VuZXJhdG9yT3JOZXh0LmNvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAgICAgY29tcGxldGVGbiA9IHRoaXMuX19pc0FzeW5jID8gKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvck9yTmV4dC5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc2NoZWR1bGVyRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gZ2VuZXJhdG9yT3JOZXh0KHZhbHVlKSkpOwogICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JPck5leHQodmFsdWUpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvckZuID0gdGhpcy5fX2lzQXN5bmMgPyAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnIKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBlcnJvcihlcnIpKSk7CiAgICAgICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnIKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IoZXJyKTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjb21wbGV0ZSkgewogICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlRm4gPSB0aGlzLl9faXNBc3luYyA/ICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBjb21wbGV0ZSgpKSk7CiAgICAgICAgICAgICAgICAgICAgfSkgOiAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzaW5rID0gc3VwZXIuc3Vic2NyaWJlKHNjaGVkdWxlckZuLCBlcnJvckZuLCBjb21wbGV0ZUZuKTsKICAgICAgICAgICAgaWYgKGdlbmVyYXRvck9yTmV4dCBpbnN0YW5jZW9mIFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgZ2VuZXJhdG9yT3JOZXh0LmFkZChzaW5rKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc2luazsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9saW5rZXIvcXVlcnlfbGlzdC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAdGhpcyB7P30KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN5bWJvbEl0ZXJhdG9yKCkgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpKS5fcmVzdWx0cykpKVtnZXRTeW1ib2xJdGVyYXRvciQxKCldKCk7CiAgICB9CiAgICAvKioKICAgICAqIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIGl0ZW1zIHRoYXQgQW5ndWxhciBrZWVwcyB1cCB0byBkYXRlIHdoZW4gdGhlIHN0YXRlCiAgICAgKiBvZiB0aGUgYXBwbGljYXRpb24gY2hhbmdlcy4KICAgICAqCiAgICAgKiBUaGUgdHlwZSBvZiBvYmplY3QgdGhhdCB7XEBsaW5rIFZpZXdDaGlsZHJlbn0sIHtcQGxpbmsgQ29udGVudENoaWxkcmVufSwgYW5kIHtcQGxpbmsgUXVlcnlMaXN0fQogICAgICogcHJvdmlkZS4KICAgICAqCiAgICAgKiBJbXBsZW1lbnRzIGFuIGl0ZXJhYmxlIGludGVyZmFjZSwgdGhlcmVmb3JlIGl0IGNhbiBiZSB1c2VkIGluIGJvdGggRVM2CiAgICAgKiBqYXZhc2NyaXB0IGBmb3IgKHZhciBpIG9mIGl0ZW1zKWAgbG9vcHMgYXMgd2VsbCBhcyBpbiBBbmd1bGFyIHRlbXBsYXRlcyB3aXRoCiAgICAgKiBgKm5nRm9yPSJsZXQgaSBvZiBteUxpc3QiYC4KICAgICAqCiAgICAgKiBDaGFuZ2VzIGNhbiBiZSBvYnNlcnZlZCBieSBzdWJzY3JpYmluZyB0byB0aGUgY2hhbmdlcyBgT2JzZXJ2YWJsZWAuCiAgICAgKgogICAgICogTk9URTogSW4gdGhlIGZ1dHVyZSB0aGlzIGNsYXNzIHdpbGwgaW1wbGVtZW50IGFuIGBPYnNlcnZhYmxlYCBpbnRlcmZhY2UuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogXEBDb21wb25lbnQoey4uLn0pCiAgICAgKiBjbGFzcyBDb250YWluZXIgewogICAgICogXEBWaWV3Q2hpbGRyZW4oSXRlbSkgaXRlbXM6UXVlcnlMaXN0PEl0ZW0+OwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIFF1ZXJ5TGlzdCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuZGlydHkgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9yZXN1bHRzID0gW107CiAgICAgICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5sZW5ndGggPSAwOwogICAgICAgICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBkZWNsYXJlZCBvbiB0aGUgcHJvdG90eXBlLCBidXQgZG9pbmcgc28gdGhlcmUgd2lsbCBjYXVzZSB0aGUgY2xhc3MKICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gdG8gaGF2ZSBzaWRlLWVmZmVjdHMgYW5kIGJlY29tZSBub3QgdHJlZS1zaGFrYWJsZS4gRm9yIHRoaXMgcmVhc29uIHdlIGRvIGl0IGluCiAgICAgICAgICAgIC8vIHRoZSBjb25zdHJ1Y3Rvci4KICAgICAgICAgICAgLy8gW2dldFN5bWJvbEl0ZXJhdG9yKCldKCk6IEl0ZXJhdG9yPFQ+IHsgLi4uIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzeW1ib2wgPSBnZXRTeW1ib2xJdGVyYXRvciQxKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvdG8gPSAoLyoqIEB0eXBlIHs/fSAqLyAoUXVlcnlMaXN0LnByb3RvdHlwZSkpOwogICAgICAgICAgICBpZiAoIXByb3RvW3N5bWJvbF0pCiAgICAgICAgICAgICAgICBwcm90b1tzeW1ib2xdID0gc3ltYm9sSXRlcmF0b3I7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlZQogICAgICAgICAqIFtBcnJheS5tYXBdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L21hcCkKICAgICAgICAgKiBAdGVtcGxhdGUgVQogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hcChmbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5tYXAoZm4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZWUKICAgICAgICAgKiBbQXJyYXkuZmlsdGVyXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maWx0ZXIpCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmlsdGVyKGZuKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZXN1bHRzLmZpbHRlcihmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlZQogICAgICAgICAqIFtBcnJheS5maW5kXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9maW5kKQogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmQoZm4pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMuZmluZChmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlZQogICAgICAgICAqIFtBcnJheS5yZWR1Y2VdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3JlZHVjZSkKICAgICAgICAgKiBAdGVtcGxhdGUgVQogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcGFyYW0gez99IGluaXQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZHVjZShmbiwgaW5pdCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5yZWR1Y2UoZm4sIGluaXQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZWUKICAgICAgICAgKiBbQXJyYXkuZm9yRWFjaF0oaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZm9yRWFjaCkKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JFYWNoKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdHMuZm9yRWFjaChmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlZQogICAgICAgICAqIFtBcnJheS5zb21lXShodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9zb21lKQogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNvbWUoZm4pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Jlc3VsdHMuc29tZShmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBjb3B5IG9mIHRoZSBpbnRlcm5hbCByZXN1bHRzIGxpc3QgYXMgYW4gQXJyYXkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b0FycmF5KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy5zbGljZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvU3RyaW5nKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVzdWx0cy50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzdG9yZWQgZGF0YSBvZiB0aGUgcXVlcnkgbGlzdCwgYW5kIHJlc2V0cyB0aGUgYGRpcnR5YCBmbGFnIHRvIGBmYWxzZWAsIHNvIHRoYXQKICAgICAgICAgKiBvbiBjaGFuZ2UgZGV0ZWN0aW9uLCBpdCB3aWxsIG5vdCBub3RpZnkgb2YgY2hhbmdlcyB0byB0aGUgcXVlcmllcywgdW5sZXNzIGEgbmV3IGNoYW5nZQogICAgICAgICAqIG9jY3Vycy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVzdWx0c1RyZWUgVGhlIHF1ZXJ5IHJlc3VsdHMgdG8gc3RvcmUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc2V0KHJlc3VsdHNUcmVlKSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdHMgPSBmbGF0dGVuKHJlc3VsdHNUcmVlKTsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sZW5ndGggPSB0aGlzLl9yZXN1bHRzLmxlbmd0aDsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmxhc3QgPSB0aGlzLl9yZXN1bHRzW3RoaXMubGVuZ3RoIC0gMV07CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5maXJzdCA9IHRoaXMuX3Jlc3VsdHNbMF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRyaWdnZXJzIGEgY2hhbmdlIGV2ZW50IGJ5IGVtaXR0aW5nIG9uIHRoZSBgY2hhbmdlc2Age1xAbGluayBFdmVudEVtaXR0ZXJ9LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm90aWZ5T25DaGFuZ2VzKCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY2hhbmdlcykpKS5lbWl0KHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlydHkoKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5kaXJ0eSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY2hhbmdlcykpKS5jb21wbGV0ZSgpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuY2hhbmdlcykpKS51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgTFF1ZXJ5XyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBxdWVyeUxpc3QKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihxdWVyeUxpc3QpIHsKICAgICAgICAgICAgdGhpcy5xdWVyeUxpc3QgPSBxdWVyeUxpc3Q7CiAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xvbmUoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgTFF1ZXJ5Xyh0aGlzLnF1ZXJ5TGlzdCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlydHkoKSB7CiAgICAgICAgICAgIHRoaXMucXVlcnlMaXN0LnNldERpcnR5KCk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgTFF1ZXJpZXNfIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBxdWVyaWVzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IocXVlcmllcyA9IFtdKSB7CiAgICAgICAgICAgIHRoaXMucXVlcmllcyA9IHF1ZXJpZXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUVtYmVkZGVkVmlldyh0VmlldykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRRdWVyaWVzID0gdFZpZXcucXVlcmllczsKICAgICAgICAgICAgaWYgKHRRdWVyaWVzICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBub09mSW5oZXJpdGVkUXVlcmllcyA9IHRWaWV3LmNvbnRlbnRRdWVyaWVzICE9PSBudWxsID8gdFZpZXcuY29udGVudFF1ZXJpZXNbMF0gOiB0UXVlcmllcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3TFF1ZXJpZXMgPSBbXTsKICAgICAgICAgICAgICAgIC8vIEFuIGVtYmVkZGVkIHZpZXcgaGFzIHF1ZXJpZXMgcHJvcGFnYXRlZCBmcm9tIGEgZGVjbGFyYXRpb24gdmlldyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQogICAgICAgICAgICAgICAgLy8gVFF1ZXJpZXMgY29sbGVjdGlvbiBhbmQgdXAgdW50aWwgYSBmaXJzdCBjb250ZW50IHF1ZXJ5IGRlY2xhcmVkIGluIHRoZSBlbWJlZGRlZCB2aWV3LiBPbmx5CiAgICAgICAgICAgICAgICAvLyBwcm9wYWdhdGVkIExRdWVyaWVzIGFyZSBjcmVhdGVkIGF0IHRoaXMgcG9pbnQgKExRdWVyeSBjb3JyZXNwb25kaW5nIHRvIGRlY2xhcmVkIGNvbnRlbnQKICAgICAgICAgICAgICAgIC8vIHF1ZXJpZXMgd2lsbCBiZSBpbnN0YW50aWF0ZWQgZnJvbSB0aGUgY29udGVudCBxdWVyeSBpbnN0cnVjdGlvbnMgZm9yIGVhY2ggZGlyZWN0aXZlKS4KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbm9PZkluaGVyaXRlZFF1ZXJpZXM7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0UXVlcnkgPSB0UXVlcmllcy5nZXRCeUluZGV4KGkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRMUXVlcnkgPSB0aGlzLnF1ZXJpZXNbdFF1ZXJ5LmluZGV4SW5EZWNsYXJhdGlvblZpZXddOwogICAgICAgICAgICAgICAgICAgIHZpZXdMUXVlcmllcy5wdXNoKHBhcmVudExRdWVyeS5jbG9uZSgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTFF1ZXJpZXNfKHZpZXdMUXVlcmllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluc2VydFZpZXcodFZpZXcpIHsKICAgICAgICAgICAgdGhpcy5kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0Vmlldyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRldGFjaFZpZXcodFZpZXcpIHsKICAgICAgICAgICAgdGhpcy5kaXJ0eVF1ZXJpZXNXaXRoTWF0Y2hlcyh0Vmlldyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlydHlRdWVyaWVzV2l0aE1hdGNoZXModFZpZXcpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGlmIChnZXRUUXVlcnkodFZpZXcsIGkpLm1hdGNoZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnF1ZXJpZXNbaV0uc2V0RGlydHkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFRRdWVyeU1ldGFkYXRhXyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmVkaWNhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGRlc2NlbmRhbnRzCiAgICAgICAgICogQHBhcmFtIHs/fSBpc1N0YXRpYwogICAgICAgICAqIEBwYXJhbSB7Pz19IHJlYWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihwcmVkaWNhdGUsIGRlc2NlbmRhbnRzLCBpc1N0YXRpYywgcmVhZCA9IG51bGwpIHsKICAgICAgICAgICAgdGhpcy5wcmVkaWNhdGUgPSBwcmVkaWNhdGU7CiAgICAgICAgICAgIHRoaXMuZGVzY2VuZGFudHMgPSBkZXNjZW5kYW50czsKICAgICAgICAgICAgdGhpcy5pc1N0YXRpYyA9IGlzU3RhdGljOwogICAgICAgICAgICB0aGlzLnJlYWQgPSByZWFkOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFRRdWVyaWVzXyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gcXVlcmllcwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHF1ZXJpZXMgPSBbXSkgewogICAgICAgICAgICB0aGlzLnF1ZXJpZXMgPSBxdWVyaWVzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZWxlbWVudFN0YXJ0KHRWaWV3LCB0Tm9kZSkgewogICAgICAgICAgICBuZ0Rldk1vZGUgJiYKICAgICAgICAgICAgICAgIGFzc2VydEZpcnN0Q3JlYXRlUGFzcyh0VmlldywgJ1F1ZXJpZXMgc2hvdWxkIGNvbGxlY3QgcmVzdWx0cyBvbiB0aGUgZmlyc3QgdGVtcGxhdGUgcGFzcyBvbmx5Jyk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5xdWVyaWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLnF1ZXJpZXNbaV0uZWxlbWVudFN0YXJ0KHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZWxlbWVudEVuZCh0Tm9kZSkgewogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMucXVlcmllcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5xdWVyaWVzW2ldLmVsZW1lbnRFbmQodE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVtYmVkZGVkVFZpZXcodE5vZGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcXVlcmllc0ZvclRlbXBsYXRlUmVmID0gbnVsbDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGlsZFF1ZXJ5SW5kZXggPSBxdWVyaWVzRm9yVGVtcGxhdGVSZWYgIT09IG51bGwgPyBxdWVyaWVzRm9yVGVtcGxhdGVSZWYubGVuZ3RoIDogMDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRxdWVyeUNsb25lID0gdGhpcy5nZXRCeUluZGV4KGkpLmVtYmVkZGVkVFZpZXcodE5vZGUsIGNoaWxkUXVlcnlJbmRleCk7CiAgICAgICAgICAgICAgICBpZiAodHF1ZXJ5Q2xvbmUpIHsKICAgICAgICAgICAgICAgICAgICB0cXVlcnlDbG9uZS5pbmRleEluRGVjbGFyYXRpb25WaWV3ID0gaTsKICAgICAgICAgICAgICAgICAgICBpZiAocXVlcmllc0ZvclRlbXBsYXRlUmVmICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZi5wdXNoKHRxdWVyeUNsb25lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZiA9IFt0cXVlcnlDbG9uZV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBxdWVyaWVzRm9yVGVtcGxhdGVSZWYgIT09IG51bGwgPyBuZXcgVFF1ZXJpZXNfKHF1ZXJpZXNGb3JUZW1wbGF0ZVJlZikgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdGVtcGxhdGUodFZpZXcsIHROb2RlKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgYXNzZXJ0Rmlyc3RDcmVhdGVQYXNzKHRWaWV3LCAnUXVlcmllcyBzaG91bGQgY29sbGVjdCByZXN1bHRzIG9uIHRoZSBmaXJzdCB0ZW1wbGF0ZSBwYXNzIG9ubHknKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLnF1ZXJpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHRoaXMucXVlcmllc1tpXS50ZW1wbGF0ZSh0VmlldywgdE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEJ5SW5kZXgoaW5kZXgpIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKHRoaXMucXVlcmllcywgaW5kZXgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyaWVzW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbGVuZ3RoKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5xdWVyaWVzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0cXVlcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYWNrKHRxdWVyeSkgewogICAgICAgICAgICB0aGlzLnF1ZXJpZXMucHVzaCh0cXVlcnkpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFRRdWVyeV8gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAgICAgKiBAcGFyYW0gez89fSBub2RlSW5kZXgKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihtZXRhZGF0YSwgbm9kZUluZGV4ID0gLTEpIHsKICAgICAgICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwogICAgICAgICAgICB0aGlzLm1hdGNoZXMgPSBudWxsOwogICAgICAgICAgICB0aGlzLmluZGV4SW5EZWNsYXJhdGlvblZpZXcgPSAtMTsKICAgICAgICAgICAgdGhpcy5jcm9zc2VzTmdUZW1wbGF0ZSA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBmbGFnIGluZGljYXRpbmcgaWYgYSBnaXZlbiBxdWVyeSBzdGlsbCBhcHBsaWVzIHRvIG5vZGVzIGl0IGlzIGNyb3NzaW5nLiBXZSB1c2UgdGhpcyBmbGFnCiAgICAgICAgICAgICAqIChhbG9uZ3NpZGUgd2l0aCBfZGVjbGFyYXRpb25Ob2RlSW5kZXgpIHRvIGtub3cgd2hlbiB0byBzdG9wIGFwcGx5aW5nIGNvbnRlbnQgcXVlcmllcyB0bwogICAgICAgICAgICAgKiBlbGVtZW50cyBpbiBhIHRlbXBsYXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fYXBwbGllc1RvTmV4dE5vZGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZWNsYXJhdGlvbk5vZGVJbmRleCA9IG5vZGVJbmRleDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVsZW1lbnRTdGFydCh0VmlldywgdE5vZGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNBcHBseWluZ1RvTm9kZSh0Tm9kZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZSh0VmlldywgdE5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVsZW1lbnRFbmQodE5vZGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2RlY2xhcmF0aW9uTm9kZUluZGV4ID09PSB0Tm9kZS5pbmRleCkgewogICAgICAgICAgICAgICAgdGhpcy5fYXBwbGllc1RvTmV4dE5vZGUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdGVtcGxhdGUodFZpZXcsIHROb2RlKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFN0YXJ0KHRWaWV3LCB0Tm9kZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAgICAgKiBAcGFyYW0gez99IGNoaWxkUXVlcnlJbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZW1iZWRkZWRUVmlldyh0Tm9kZSwgY2hpbGRRdWVyeUluZGV4KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmlzQXBwbHlpbmdUb05vZGUodE5vZGUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNyb3NzZXNOZ1RlbXBsYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIC8vIEEgbWFya2VyIGluZGljYXRpbmcgYSBgPG5nLXRlbXBsYXRlPmAgZWxlbWVudCAoYSBwbGFjZWhvbGRlciBmb3IgcXVlcnkgcmVzdWx0cyBmcm9tCiAgICAgICAgICAgICAgICAvLyBlbWJlZGRlZCB2aWV3cyBjcmVhdGVkIGJhc2VkIG9uIHRoaXMgYDxuZy10ZW1wbGF0ZT5gKS4KICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2goLXROb2RlLmluZGV4LCBjaGlsZFF1ZXJ5SW5kZXgpOwogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUUXVlcnlfKHRoaXMubWV0YWRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzQXBwbHlpbmdUb05vZGUodE5vZGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2FwcGxpZXNUb05leHROb2RlICYmIHRoaXMubWV0YWRhdGEuZGVzY2VuZGFudHMgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbk5vZGVJZHggPSB0aGlzLl9kZWNsYXJhdGlvbk5vZGVJbmRleDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwYXJlbnQgPSB0Tm9kZS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAvLyBEZXRlcm1pbmUgaWYgYSBnaXZlbiBUTm9kZSBpcyBhICJkaXJlY3QiIGNoaWxkIG9mIGEgbm9kZSBvbiB3aGljaCBhIGNvbnRlbnQgcXVlcnkgd2FzCiAgICAgICAgICAgICAgICAvLyBkZWNsYXJlZCAob25seSBkaXJlY3QgY2hpbGRyZW4gb2YgcXVlcnkncyBob3N0IG5vZGUgY2FuIG1hdGNoIHdpdGggdGhlIGRlc2NlbmRhbnRzOiBmYWxzZQogICAgICAgICAgICAgICAgLy8gb3B0aW9uKS4gVGhlcmUgYXJlIDMgbWFpbiB1c2UtY2FzZSAvIGNvbmRpdGlvbnMgdG8gY29uc2lkZXIgaGVyZToKICAgICAgICAgICAgICAgIC8vIC0gPG5lZWRzLXRhcmdldD48aSAjdGFyZ2V0PjwvaT48L25lZWRzLXRhcmdldD46IGhlcmUgPGkgI3RhcmdldD4gcGFyZW50IG5vZGUgaXMgYSBxdWVyeQogICAgICAgICAgICAgICAgLy8gaG9zdCBub2RlOwogICAgICAgICAgICAgICAgLy8gLSA8bmVlZHMtdGFyZ2V0PjxuZy10ZW1wbGF0ZSBbbmdJZl09InRydWUiPjxpICN0YXJnZXQ+PC9pPjwvbmctdGVtcGxhdGU+PC9uZWVkcy10YXJnZXQ+OgogICAgICAgICAgICAgICAgLy8gaGVyZSA8aSAjdGFyZ2V0PiBwYXJlbnQgbm9kZSBpcyBudWxsOwogICAgICAgICAgICAgICAgLy8gLSA8bmVlZHMtdGFyZ2V0PjxuZy1jb250YWluZXI+PGkgI3RhcmdldD48L2k+PC9uZy1jb250YWluZXI+PC9uZWVkcy10YXJnZXQ+OiBoZXJlIHdlIG5lZWQKICAgICAgICAgICAgICAgIC8vIHRvIGdvIHBhc3QgYDxuZy1jb250YWluZXI+YCB0byBkZXRlcm1pbmUgPGkgI3RhcmdldD4gcGFyZW50IG5vZGUgKGJ1dCB3ZSBzaG91bGRuJ3QgdHJhdmVyc2UKICAgICAgICAgICAgICAgIC8vIHVwIHBhc3QgdGhlIHF1ZXJ5J3MgaG9zdCBub2RlISkuCiAgICAgICAgICAgICAgICB3aGlsZSAocGFyZW50ICE9PSBudWxsICYmIHBhcmVudC50eXBlID09PSA0IC8qIEVsZW1lbnRDb250YWluZXIgKi8gJiYKICAgICAgICAgICAgICAgICAgICBwYXJlbnQuaW5kZXggIT09IGRlY2xhcmF0aW9uTm9kZUlkeCkgewogICAgICAgICAgICAgICAgICAgIHBhcmVudCA9IHBhcmVudC5wYXJlbnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZGVjbGFyYXRpb25Ob2RlSWR4ID09PSAocGFyZW50ICE9PSBudWxsID8gcGFyZW50LmluZGV4IDogLTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWVzVG9OZXh0Tm9kZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWF0Y2hUTm9kZSh0VmlldywgdE5vZGUpIHsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5tZXRhZGF0YS5wcmVkaWNhdGUpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsb2NhbE5hbWVzID0gdGhpcy5tZXRhZGF0YS5wcmVkaWNhdGU7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxvY2FsTmFtZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1hdGNoVE5vZGVXaXRoUmVhZE9wdGlvbih0VmlldywgdE5vZGUsIGdldElkeE9mTWF0Y2hpbmdTZWxlY3Rvcih0Tm9kZSwgbG9jYWxOYW1lc1tpXSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdHlwZVByZWRpY2F0ZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm1ldGFkYXRhLnByZWRpY2F0ZSkpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVQcmVkaWNhdGUgPT09IFRlbXBsYXRlUmVmKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgLTEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgbG9jYXRlRGlyZWN0aXZlT3JQcm92aWRlcih0Tm9kZSwgdFZpZXcsIHR5cGVQcmVkaWNhdGUsIGZhbHNlLCBmYWxzZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVNYXRjaElkeAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWF0Y2hUTm9kZVdpdGhSZWFkT3B0aW9uKHRWaWV3LCB0Tm9kZSwgbm9kZU1hdGNoSWR4KSB7CiAgICAgICAgICAgIGlmIChub2RlTWF0Y2hJZHggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlYWQgPSB0aGlzLm1ldGFkYXRhLnJlYWQ7CiAgICAgICAgICAgICAgICBpZiAocmVhZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZWFkID09PSBFbGVtZW50UmVmIHx8IHJlYWQgPT09IFZpZXdDb250YWluZXJSZWYgfHwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZCA9PT0gVGVtcGxhdGVSZWYgJiYgdE5vZGUudHlwZSA9PT0gMCAvKiBDb250YWluZXIgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5hZGRNYXRjaCh0Tm9kZS5pbmRleCwgLTIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3RpdmVPclByb3ZpZGVySWR4ID0gbG9jYXRlRGlyZWN0aXZlT3JQcm92aWRlcih0Tm9kZSwgdFZpZXcsIHJlYWQsIGZhbHNlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkaXJlY3RpdmVPclByb3ZpZGVySWR4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZE1hdGNoKHROb2RlLmluZGV4LCBkaXJlY3RpdmVPclByb3ZpZGVySWR4KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWRkTWF0Y2godE5vZGUuaW5kZXgsIG5vZGVNYXRjaElkeCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHROb2RlSWR4CiAgICAgICAgICogQHBhcmFtIHs/fSBtYXRjaElkeAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkTWF0Y2godE5vZGVJZHgsIG1hdGNoSWR4KSB7CiAgICAgICAgICAgIGlmICh0aGlzLm1hdGNoZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMubWF0Y2hlcyA9IFt0Tm9kZUlkeCwgbWF0Y2hJZHhdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5tYXRjaGVzLnB1c2godE5vZGVJZHgsIG1hdGNoSWR4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogSXRlcmF0ZXMgb3ZlciBsb2NhbCBuYW1lcyBmb3IgYSBnaXZlbiBub2RlIGFuZCByZXR1cm5zIGRpcmVjdGl2ZSBpbmRleAogICAgICogKG9yIC0xIGlmIGEgbG9jYWwgbmFtZSBwb2ludHMgdG8gYW4gZWxlbWVudCkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSB0Tm9kZSBzdGF0aWMgZGF0YSBvZiBhIG5vZGUgdG8gY2hlY2sKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3Igc2VsZWN0b3IgdG8gbWF0Y2gKICAgICAqIEByZXR1cm4gez99IGRpcmVjdGl2ZSBpbmRleCwgLTEgb3IgbnVsbCBpZiBhIHNlbGVjdG9yIGRpZG4ndCBtYXRjaCBhbnkgb2YgdGhlIGxvY2FsIG5hbWVzCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldElkeE9mTWF0Y2hpbmdTZWxlY3Rvcih0Tm9kZSwgc2VsZWN0b3IpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYWxOYW1lcyA9IHROb2RlLmxvY2FsTmFtZXM7CiAgICAgICAgaWYgKGxvY2FsTmFtZXMgIT09IG51bGwpIHsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsb2NhbE5hbWVzLmxlbmd0aDsgaSArPSAyKSB7CiAgICAgICAgICAgICAgICBpZiAobG9jYWxOYW1lc1tpXSA9PT0gc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGxvY2FsTmFtZXNbaSArIDFdKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gY3VycmVudFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3VsdEJ5VE5vZGVUeXBlKHROb2RlLCBjdXJyZW50VmlldykgewogICAgICAgIGlmICh0Tm9kZS50eXBlID09PSAzIC8qIEVsZW1lbnQgKi8gfHwgdE5vZGUudHlwZSA9PT0gNCAvKiBFbGVtZW50Q29udGFpbmVyICovKSB7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVFbGVtZW50UmVmKEVsZW1lbnRSZWYsIHROb2RlLCBjdXJyZW50Vmlldyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHROb2RlLnR5cGUgPT09IDAgLyogQ29udGFpbmVyICovKSB7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZiwgRWxlbWVudFJlZiwgdE5vZGUsIGN1cnJlbnRWaWV3KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gdE5vZGUKICAgICAqIEBwYXJhbSB7P30gbWF0Y2hpbmdJZHgKICAgICAqIEBwYXJhbSB7P30gcmVhZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlUmVzdWx0Rm9yTm9kZShsVmlldywgdE5vZGUsIG1hdGNoaW5nSWR4LCByZWFkKSB7CiAgICAgICAgaWYgKG1hdGNoaW5nSWR4ID09PSAtMSkgewogICAgICAgICAgICAvLyBpZiByZWFkIHRva2VuIGFuZCAvIG9yIHN0cmF0ZWd5IGlzIG5vdCBzcGVjaWZpZWQsIGRldGVjdCBpdCB1c2luZyBhcHByb3ByaWF0ZSB0Tm9kZSB0eXBlCiAgICAgICAgICAgIHJldHVybiBjcmVhdGVSZXN1bHRCeVROb2RlVHlwZSh0Tm9kZSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChtYXRjaGluZ0lkeCA9PT0gLTIpIHsKICAgICAgICAgICAgLy8gcmVhZCBhIHNwZWNpYWwgdG9rZW4gZnJvbSBhIG5vZGUgaW5qZWN0b3IKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVNwZWNpYWxUb2tlbihsVmlldywgdE5vZGUsIHJlYWQpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gcmVhZCBhIHRva2VuCiAgICAgICAgICAgIHJldHVybiBnZXROb2RlSW5qZWN0YWJsZShsVmlldywgbFZpZXdbVFZJRVddLCBtYXRjaGluZ0lkeCwgKC8qKiBAdHlwZSB7P30gKi8gKHROb2RlKSkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSByZWFkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVTcGVjaWFsVG9rZW4obFZpZXcsIHROb2RlLCByZWFkKSB7CiAgICAgICAgaWYgKHJlYWQgPT09IEVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUVsZW1lbnRSZWYoRWxlbWVudFJlZiwgdE5vZGUsIGxWaWV3KTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAocmVhZCA9PT0gVGVtcGxhdGVSZWYpIHsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVRlbXBsYXRlUmVmKFRlbXBsYXRlUmVmLCBFbGVtZW50UmVmLCB0Tm9kZSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChyZWFkID09PSBWaWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgYXNzZXJ0Tm9kZU9mUG9zc2libGVUeXBlcyh0Tm9kZSwgMyAvKiBFbGVtZW50ICovLCAwIC8qIENvbnRhaW5lciAqLywgNCAvKiBFbGVtZW50Q29udGFpbmVyICovKTsKICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZUNvbnRhaW5lclJlZihWaWV3Q29udGFpbmVyUmVmLCBFbGVtZW50UmVmLCAoLyoqIEB0eXBlIHs/fSAqLyAodE5vZGUpKSwgbFZpZXcpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICB0aHJvd0Vycm9yJDEoYFNwZWNpYWwgdG9rZW4gdG8gcmVhZCBzaG91bGQgYmUgb25lIG9mIEVsZW1lbnRSZWYsIFRlbXBsYXRlUmVmIG9yIFZpZXdDb250YWluZXJSZWYgYnV0IGdvdCAke3N0cmluZ2lmeShyZWFkKX0uYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNyZWF0ZXMgcXVlcnkgcmVzdWx0cyBmb3IgYSBnaXZlbiB2aWV3LiBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IHRvIGRvIHRoZQogICAgICogcHJvY2Vzc2luZyBvbmNlIGFuZCBvbmx5IG9uY2UgZm9yIGEgZ2l2ZW4gdmlldyBpbnN0YW5jZSAoYSBzZXQgb2YgcmVzdWx0cyBmb3IgYSBnaXZlbiB2aWV3CiAgICAgKiBkb2Vzbid0IGNoYW5nZSkuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSB0UXVlcnkKICAgICAqIEBwYXJhbSB7P30gcXVlcnlJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWF0ZXJpYWxpemVWaWV3UmVzdWx0cyh0VmlldywgbFZpZXcsIHRRdWVyeSwgcXVlcnlJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsUXVlcnkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGxWaWV3W1FVRVJJRVNdKSkucXVlcmllcykpW3F1ZXJ5SW5kZXhdOwogICAgICAgIGlmIChsUXVlcnkubWF0Y2hlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRWaWV3RGF0YSA9IHRWaWV3LmRhdGE7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdFF1ZXJ5TWF0Y2hlcyA9ICgvKiogQHR5cGUgez99ICovICh0UXVlcnkubWF0Y2hlcykpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRRdWVyeU1hdGNoZXMubGVuZ3RoOyBpICs9IDIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoZWROb2RlSWR4ID0gdFF1ZXJ5TWF0Y2hlc1tpXTsKICAgICAgICAgICAgICAgIGlmIChtYXRjaGVkTm9kZUlkeCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhdCB0aGUgPG5nLXRlbXBsYXRlPiBtYXJrZXIgd2hpY2ggbWlnaHQgaGF2ZSByZXN1bHRzIGluIHZpZXdzIGNyZWF0ZWQgYmFzZWQgb24gdGhpcwogICAgICAgICAgICAgICAgICAgIC8vIDxuZy10ZW1wbGF0ZT4gLSB0aG9zZSByZXN1bHRzIHdpbGwgYmUgaW4gc2VwYXJhdGUgdmlld3MgdGhvdWdoLCBzbyBoZXJlIHdlIGp1c3QgbGVhdmUKICAgICAgICAgICAgICAgICAgICAvLyBudWxsIGFzIGEgcGxhY2Vob2xkZXIKICAgICAgICAgICAgICAgICAgICByZXN1bHQucHVzaChudWxsKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREYXRhSW5SYW5nZSh0Vmlld0RhdGEsIG1hdGNoZWROb2RlSWR4KTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdE5vZGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodFZpZXdEYXRhW21hdGNoZWROb2RlSWR4XSkpOwogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGNyZWF0ZVJlc3VsdEZvck5vZGUobFZpZXcsIHROb2RlLCB0UXVlcnlNYXRjaGVzW2kgKyAxXSwgdFF1ZXJ5Lm1ldGFkYXRhLnJlYWQpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBsUXVlcnkubWF0Y2hlcyA9IHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGxRdWVyeS5tYXRjaGVzOwogICAgfQogICAgLyoqCiAgICAgKiBBIGhlbHBlciBmdW5jdGlvbiB0aGF0IGNvbGxlY3RzIChhbHJlYWR5IG1hdGVyaWFsaXplZCkgcXVlcnkgcmVzdWx0cyBmcm9tIGEgdHJlZSBvZiB2aWV3cywKICAgICAqIHN0YXJ0aW5nIHdpdGggYSBwcm92aWRlZCBMVmlldy4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHF1ZXJ5SW5kZXgKICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb2xsZWN0UXVlcnlSZXN1bHRzKHRWaWV3LCBsVmlldywgcXVlcnlJbmRleCwgcmVzdWx0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRRdWVyeSA9ICgvKiogQHR5cGUgez99ICovICh0Vmlldy5xdWVyaWVzKSkuZ2V0QnlJbmRleChxdWVyeUluZGV4KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFF1ZXJ5TWF0Y2hlcyA9IHRRdWVyeS5tYXRjaGVzOwogICAgICAgIGlmICh0UXVlcnlNYXRjaGVzICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbFZpZXdSZXN1bHRzID0gbWF0ZXJpYWxpemVWaWV3UmVzdWx0cyh0VmlldywgbFZpZXcsIHRRdWVyeSwgcXVlcnlJbmRleCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdFF1ZXJ5TWF0Y2hlcy5sZW5ndGg7IGkgKz0gMikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdE5vZGVJZHggPSB0UXVlcnlNYXRjaGVzW2ldOwogICAgICAgICAgICAgICAgaWYgKHROb2RlSWR4ID4gMCkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKCgvKiogQHR5cGUgez99ICovIChsVmlld1Jlc3VsdHNbaSAvIDJdKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkUXVlcnlJbmRleCA9IHRRdWVyeU1hdGNoZXNbaSArIDFdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkZWNsYXJhdGlvbkxDb250YWluZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbLXROb2RlSWR4XSkpOwogICAgICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnRMQ29udGFpbmVyKGRlY2xhcmF0aW9uTENvbnRhaW5lcik7CiAgICAgICAgICAgICAgICAgICAgLy8gY29sbGVjdCBtYXRjaGVzIGZvciB2aWV3cyBpbnNlcnRlZCBpbiB0aGlzIGNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBDT05UQUlORVJfSEVBREVSX09GRlNFVDsgaSA8IGRlY2xhcmF0aW9uTENvbnRhaW5lci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBkZWNsYXJhdGlvbkxDb250YWluZXJbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbWJlZGRlZExWaWV3W0RFQ0xBUkFUSU9OX0xDT05UQUlORVJdID09PSBlbWJlZGRlZExWaWV3W1BBUkVOVF0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RRdWVyeVJlc3VsdHMoZW1iZWRkZWRMVmlld1tUVklFV10sIGVtYmVkZGVkTFZpZXcsIGNoaWxkUXVlcnlJbmRleCwgcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBjb2xsZWN0IG1hdGNoZXMgZm9yIHZpZXdzIGNyZWF0ZWQgZnJvbSB0aGlzIGRlY2xhcmF0aW9uIGNvbnRhaW5lciBhbmQgaW5zZXJ0ZWQgaW50bwogICAgICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCBjb250YWluZXJzCiAgICAgICAgICAgICAgICAgICAgaWYgKGRlY2xhcmF0aW9uTENvbnRhaW5lcltNT1ZFRF9WSUVXU10gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRlZExWaWV3cyA9ICgvKiogQHR5cGUgez99ICovIChkZWNsYXJhdGlvbkxDb250YWluZXJbTU9WRURfVklFV1NdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZW1iZWRkZWRMVmlld3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVtYmVkZGVkTFZpZXcgPSBlbWJlZGRlZExWaWV3c1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RRdWVyeVJlc3VsdHMoZW1iZWRkZWRMVmlld1tUVklFV10sIGVtYmVkZGVkTFZpZXcsIGNoaWxkUXVlcnlJbmRleCwgcmVzdWx0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLyoqCiAgICAgKiBSZWZyZXNoZXMgYSBxdWVyeSBieSBjb21iaW5pbmcgbWF0Y2hlcyBmcm9tIGFsbCBhY3RpdmUgdmlld3MgYW5kIHJlbW92aW5nIG1hdGNoZXMgZnJvbSBkZWxldGVkCiAgICAgKiB2aWV3cy4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEBwYXJhbSB7P30gcXVlcnlMaXN0CiAgICAgKiBAcmV0dXJuIHs/fSBgdHJ1ZWAgaWYgYSBxdWVyeSBnb3QgZGlydHkgZHVyaW5nIGNoYW5nZSBkZXRlY3Rpb24gb3IgaWYgdGhpcyBpcyBhIHN0YXRpYyBxdWVyeQogICAgICogcmVzb2x2aW5nIGluIGNyZWF0aW9uIG1vZGUsIGBmYWxzZWAgb3RoZXJ3aXNlLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gybXJtXF1ZXJ5UmVmcmVzaChxdWVyeUxpc3QpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbFZpZXcgPSBnZXRMVmlldygpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0VmlldyA9IGdldFRWaWV3KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHF1ZXJ5SW5kZXggPSBnZXRDdXJyZW50UXVlcnlJbmRleCgpOwogICAgICAgIHNldEN1cnJlbnRRdWVyeUluZGV4KHF1ZXJ5SW5kZXggKyAxKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdFF1ZXJ5ID0gZ2V0VFF1ZXJ5KHRWaWV3LCBxdWVyeUluZGV4KTsKICAgICAgICBpZiAocXVlcnlMaXN0LmRpcnR5ICYmIChpc0NyZWF0aW9uTW9kZShsVmlldykgPT09IHRRdWVyeS5tZXRhZGF0YS5pc1N0YXRpYykpIHsKICAgICAgICAgICAgaWYgKHRRdWVyeS5tYXRjaGVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICBxdWVyeUxpc3QucmVzZXQoW10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gdFF1ZXJ5LmNyb3NzZXNOZ1RlbXBsYXRlID8KICAgICAgICAgICAgICAgICAgICBjb2xsZWN0UXVlcnlSZXN1bHRzKHRWaWV3LCBsVmlldywgcXVlcnlJbmRleCwgW10pIDoKICAgICAgICAgICAgICAgICAgICBtYXRlcmlhbGl6ZVZpZXdSZXN1bHRzKHRWaWV3LCBsVmlldywgdFF1ZXJ5LCBxdWVyeUluZGV4KTsKICAgICAgICAgICAgICAgIHF1ZXJ5TGlzdC5yZXNldChyZXN1bHQpOwogICAgICAgICAgICAgICAgcXVlcnlMaXN0Lm5vdGlmeU9uQ2hhbmdlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgbmV3IFF1ZXJ5TGlzdCBmb3IgYSBzdGF0aWMgdmlldyBxdWVyeS4KICAgICAqCiAgICAgKiBcQGNvZGVHZW5BcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZSBUaGUgdHlwZSBmb3Igd2hpY2ggdGhlIHF1ZXJ5IHdpbGwgc2VhcmNoCiAgICAgKiBAcGFyYW0gez99IGRlc2NlbmQgV2hldGhlciBvciBub3QgdG8gZGVzY2VuZCBpbnRvIGNoaWxkcmVuCiAgICAgKiBAcGFyYW0gez89fSByZWFkIFdoYXQgdG8gc2F2ZSBpbiB0aGUgcXVlcnkKICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiDJtcm1c3RhdGljVmlld1F1ZXJ5KHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkgewogICAgICAgIHZpZXdRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgdHJ1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIENyZWF0ZXMgbmV3IFF1ZXJ5TGlzdCwgc3RvcmVzIHRoZSByZWZlcmVuY2UgaW4gTFZpZXcgYW5kIHJldHVybnMgUXVlcnlMaXN0LgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gcHJlZGljYXRlIFRoZSB0eXBlIGZvciB3aGljaCB0aGUgcXVlcnkgd2lsbCBzZWFyY2gKICAgICAqIEBwYXJhbSB7P30gZGVzY2VuZCBXaGV0aGVyIG9yIG5vdCB0byBkZXNjZW5kIGludG8gY2hpbGRyZW4KICAgICAqIEBwYXJhbSB7Pz19IHJlYWQgV2hhdCB0byBzYXZlIGluIHRoZSBxdWVyeQogICAgICoKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybV2aWV3UXVlcnkocHJlZGljYXRlLCBkZXNjZW5kLCByZWFkKSB7CiAgICAgICAgdmlld1F1ZXJ5SW50ZXJuYWwoZ2V0VFZpZXcoKSwgZ2V0TFZpZXcoKSwgcHJlZGljYXRlLCBkZXNjZW5kLCByZWFkLCBmYWxzZSk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHRWaWV3CiAgICAgKiBAcGFyYW0gez99IGxWaWV3CiAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZQogICAgICogQHBhcmFtIHs/fSBkZXNjZW5kCiAgICAgKiBAcGFyYW0gez99IHJlYWQKICAgICAqIEBwYXJhbSB7P30gaXNTdGF0aWMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHZpZXdRdWVyeUludGVybmFsKHRWaWV3LCBsVmlldywgcHJlZGljYXRlLCBkZXNjZW5kLCByZWFkLCBpc1N0YXRpYykgewogICAgICAgIGlmICh0Vmlldy5maXJzdENyZWF0ZVBhc3MpIHsKICAgICAgICAgICAgY3JlYXRlVFF1ZXJ5KHRWaWV3LCBuZXcgVFF1ZXJ5TWV0YWRhdGFfKHByZWRpY2F0ZSwgZGVzY2VuZCwgaXNTdGF0aWMsIHJlYWQpLCAtMSk7CiAgICAgICAgICAgIGlmIChpc1N0YXRpYykgewogICAgICAgICAgICAgICAgdFZpZXcuc3RhdGljVmlld1F1ZXJpZXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNyZWF0ZUxRdWVyeSh0VmlldywgbFZpZXcpOwogICAgfQogICAgLyoqCiAgICAgKiBSZWdpc3RlcnMgYSBRdWVyeUxpc3QsIGFzc29jaWF0ZWQgd2l0aCBhIGNvbnRlbnQgcXVlcnksIGZvciBsYXRlciByZWZyZXNoIChwYXJ0IG9mIGEgdmlldwogICAgICogcmVmcmVzaCkuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleCBDdXJyZW50IGRpcmVjdGl2ZSBpbmRleAogICAgICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogICAgICogQHBhcmFtIHs/fSBkZXNjZW5kIFdoZXRoZXIgb3Igbm90IHRvIGRlc2NlbmQgaW50byBjaGlsZHJlbgogICAgICogQHBhcmFtIHs/PX0gcmVhZCBXaGF0IHRvIHNhdmUgaW4gdGhlIHF1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fSBRdWVyeUxpc3Q8VD4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVjb250ZW50UXVlcnkoZGlyZWN0aXZlSW5kZXgsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkgewogICAgICAgIGNvbnRlbnRRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgZmFsc2UsIGdldFByZXZpb3VzT3JQYXJlbnRUTm9kZSgpLCBkaXJlY3RpdmVJbmRleCk7CiAgICB9CiAgICAvKioKICAgICAqIFJlZ2lzdGVycyBhIFF1ZXJ5TGlzdCwgYXNzb2NpYXRlZCB3aXRoIGEgc3RhdGljIGNvbnRlbnQgcXVlcnksIGZvciBsYXRlciByZWZyZXNoCiAgICAgKiAocGFydCBvZiBhIHZpZXcgcmVmcmVzaCkuCiAgICAgKgogICAgICogXEBjb2RlR2VuQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleCBDdXJyZW50IGRpcmVjdGl2ZSBpbmRleAogICAgICogQHBhcmFtIHs/fSBwcmVkaWNhdGUgVGhlIHR5cGUgZm9yIHdoaWNoIHRoZSBxdWVyeSB3aWxsIHNlYXJjaAogICAgICogQHBhcmFtIHs/fSBkZXNjZW5kIFdoZXRoZXIgb3Igbm90IHRvIGRlc2NlbmQgaW50byBjaGlsZHJlbgogICAgICogQHBhcmFtIHs/PX0gcmVhZCBXaGF0IHRvIHNhdmUgaW4gdGhlIHF1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fSBRdWVyeUxpc3Q8VD4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVzdGF0aWNDb250ZW50UXVlcnkoZGlyZWN0aXZlSW5kZXgsIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCkgewogICAgICAgIGNvbnRlbnRRdWVyeUludGVybmFsKGdldFRWaWV3KCksIGdldExWaWV3KCksIHByZWRpY2F0ZSwgZGVzY2VuZCwgcmVhZCwgdHJ1ZSwgZ2V0UHJldmlvdXNPclBhcmVudFROb2RlKCksIGRpcmVjdGl2ZUluZGV4KTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEBwYXJhbSB7P30gcHJlZGljYXRlCiAgICAgKiBAcGFyYW0gez99IGRlc2NlbmQKICAgICAqIEBwYXJhbSB7P30gcmVhZAogICAgICogQHBhcmFtIHs/fSBpc1N0YXRpYwogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29udGVudFF1ZXJ5SW50ZXJuYWwodFZpZXcsIGxWaWV3LCBwcmVkaWNhdGUsIGRlc2NlbmQsIHJlYWQsIGlzU3RhdGljLCB0Tm9kZSwgZGlyZWN0aXZlSW5kZXgpIHsKICAgICAgICBpZiAodFZpZXcuZmlyc3RDcmVhdGVQYXNzKSB7CiAgICAgICAgICAgIGNyZWF0ZVRRdWVyeSh0VmlldywgbmV3IFRRdWVyeU1ldGFkYXRhXyhwcmVkaWNhdGUsIGRlc2NlbmQsIGlzU3RhdGljLCByZWFkKSwgdE5vZGUuaW5kZXgpOwogICAgICAgICAgICBzYXZlQ29udGVudFF1ZXJ5QW5kRGlyZWN0aXZlSW5kZXgodFZpZXcsIGRpcmVjdGl2ZUluZGV4KTsKICAgICAgICAgICAgaWYgKGlzU3RhdGljKSB7CiAgICAgICAgICAgICAgICB0Vmlldy5zdGF0aWNDb250ZW50UXVlcmllcyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY3JlYXRlTFF1ZXJ5KHRWaWV3LCBsVmlldyk7CiAgICB9CiAgICAvKioKICAgICAqIExvYWRzIGEgUXVlcnlMaXN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgdmlldyBvciBjb250ZW50IHF1ZXJ5LgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVsb2FkUXVlcnkoKSB7CiAgICAgICAgcmV0dXJuIGxvYWRRdWVyeUludGVybmFsKGdldExWaWV3KCksIGdldEN1cnJlbnRRdWVyeUluZGV4KCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBsVmlldwogICAgICogQHBhcmFtIHs/fSBxdWVyeUluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBsb2FkUXVlcnlJbnRlcm5hbChsVmlldywgcXVlcnlJbmRleCkgewogICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICBhc3NlcnREZWZpbmVkKGxWaWV3W1FVRVJJRVNdLCAnTFF1ZXJpZXMgc2hvdWxkIGJlIGRlZmluZWQgd2hlbiB0cnlpbmcgdG8gbG9hZCBhIHF1ZXJ5Jyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERhdGFJblJhbmdlKCgvKiogQHR5cGUgez99ICovIChsVmlld1tRVUVSSUVTXSkpLnF1ZXJpZXMsIHF1ZXJ5SW5kZXgpOwogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUVVFUklFU10pKS5xdWVyaWVzW3F1ZXJ5SW5kZXhdLnF1ZXJ5TGlzdDsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbFZpZXcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUxRdWVyeSh0VmlldywgbFZpZXcpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcXVlcnlMaXN0ID0gbmV3IFF1ZXJ5TGlzdCgpOwogICAgICAgIHN0b3JlQ2xlYW51cFdpdGhDb250ZXh0KHRWaWV3LCBsVmlldywgcXVlcnlMaXN0LCBxdWVyeUxpc3QuZGVzdHJveSk7CiAgICAgICAgaWYgKGxWaWV3W1FVRVJJRVNdID09PSBudWxsKQogICAgICAgICAgICBsVmlld1tRVUVSSUVTXSA9IG5ldyBMUXVlcmllc18oKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAobFZpZXdbUVVFUklFU10pKS5xdWVyaWVzLnB1c2gobmV3IExRdWVyeV8ocXVlcnlMaXN0KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdFZpZXcKICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7P30gbm9kZUluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVUUXVlcnkodFZpZXcsIG1ldGFkYXRhLCBub2RlSW5kZXgpIHsKICAgICAgICBpZiAodFZpZXcucXVlcmllcyA9PT0gbnVsbCkKICAgICAgICAgICAgdFZpZXcucXVlcmllcyA9IG5ldyBUUXVlcmllc18oKTsKICAgICAgICB0Vmlldy5xdWVyaWVzLnRyYWNrKG5ldyBUUXVlcnlfKG1ldGFkYXRhLCBub2RlSW5kZXgpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBkaXJlY3RpdmVJbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2F2ZUNvbnRlbnRRdWVyeUFuZERpcmVjdGl2ZUluZGV4KHRWaWV3LCBkaXJlY3RpdmVJbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0Vmlld0NvbnRlbnRRdWVyaWVzID0gdFZpZXcuY29udGVudFF1ZXJpZXMgfHwgKHRWaWV3LmNvbnRlbnRRdWVyaWVzID0gW10pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsYXN0U2F2ZWREaXJlY3RpdmVJbmRleCA9IHRWaWV3LmNvbnRlbnRRdWVyaWVzLmxlbmd0aCA/IHRWaWV3Q29udGVudFF1ZXJpZXNbdFZpZXdDb250ZW50UXVlcmllcy5sZW5ndGggLSAxXSA6IC0xOwogICAgICAgIGlmIChkaXJlY3RpdmVJbmRleCAhPT0gbGFzdFNhdmVkRGlyZWN0aXZlSW5kZXgpIHsKICAgICAgICAgICAgdFZpZXdDb250ZW50UXVlcmllcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh0Vmlldy5xdWVyaWVzKSkubGVuZ3RoIC0gMSwgZGlyZWN0aXZlSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0VmlldwogICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VFF1ZXJ5KHRWaWV3LCBpbmRleCkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKHRWaWV3LnF1ZXJpZXMsICdUUXVlcmllcyBtdXN0IGJlIGRlZmluZWQgdG8gcmV0cmlldmUgYSBUUXVlcnknKTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRWaWV3LnF1ZXJpZXMpKS5nZXRCeUluZGV4KGluZGV4KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvdmlld19lbmdpbmVfY29tcGF0aWJpbGl0eV9wcmVib3VuZC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFJldHJpZXZlcyBgVGVtcGxhdGVSZWZgIGluc3RhbmNlIGZyb20gYEluamVjdG9yYCB3aGVuIGEgbG9jYWwgcmVmZXJlbmNlIGlzIHBsYWNlZCBvbiB0aGUKICAgICAqIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/fSB0Tm9kZQogICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmlldwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKHROb2RlLCBjdXJyZW50VmlldykgewogICAgICAgIHJldHVybiBjcmVhdGVUZW1wbGF0ZVJlZihUZW1wbGF0ZVJlZiwgRWxlbWVudFJlZiwgdE5vZGUsIGN1cnJlbnRWaWV3KTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgYENoYW5nZURldGVjdG9yUmVmYCBmb3IgYSBwaXBlLgogICAgICoKICAgICAqIFxAY29kZUdlbkFwaQogICAgICogQHBhcmFtIHs/PX0gZmxhZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIMm1ybVpbmplY3RQaXBlQ2hhbmdlRGV0ZWN0b3JSZWYoZmxhZ3MgPSBJbmplY3RGbGFncy5EZWZhdWx0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlID0gaW5qZWN0Q2hhbmdlRGV0ZWN0b3JSZWYodHJ1ZSk7CiAgICAgICAgaWYgKHZhbHVlID09IG51bGwgJiYgIShmbGFncyAmIEluamVjdEZsYWdzLk9wdGlvbmFsKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHByb3ZpZGVyIGZvciBDaGFuZ2VEZXRlY3RvclJlZiFgKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9yZW5kZXIzL2luZGV4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3JlbmRlcjMvaml0L2Vudmlyb25tZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IMm1MCRkID0gLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiAoewogICAgICAgICfJtcm1YXR0cmlidXRlJzogybXJtWF0dHJpYnV0ZSwKICAgICAgICAnybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMSc6IMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTEsCiAgICAgICAgJ8m1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTInOiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUyLAogICAgICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGUzJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlMywKICAgICAgICAnybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNCc6IMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTQsCiAgICAgICAgJ8m1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTUnOiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU1LAogICAgICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU2JzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNiwKICAgICAgICAnybXJtWF0dHJpYnV0ZUludGVycG9sYXRlNyc6IMm1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTcsCiAgICAgICAgJ8m1ybVhdHRyaWJ1dGVJbnRlcnBvbGF0ZTgnOiDJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGU4LAogICAgICAgICfJtcm1YXR0cmlidXRlSW50ZXJwb2xhdGVWJzogybXJtWF0dHJpYnV0ZUludGVycG9sYXRlViwKICAgICAgICAnybXJtWRlZmluZUNvbXBvbmVudCc6IMm1ybVkZWZpbmVDb21wb25lbnQsCiAgICAgICAgJ8m1ybVkZWZpbmVEaXJlY3RpdmUnOiDJtcm1ZGVmaW5lRGlyZWN0aXZlLAogICAgICAgICfJtcm1ZGVmaW5lSW5qZWN0YWJsZSc6IMm1ybVkZWZpbmVJbmplY3RhYmxlLAogICAgICAgICfJtcm1ZGVmaW5lSW5qZWN0b3InOiDJtcm1ZGVmaW5lSW5qZWN0b3IsCiAgICAgICAgJ8m1ybVkZWZpbmVOZ01vZHVsZSc6IMm1ybVkZWZpbmVOZ01vZHVsZSwKICAgICAgICAnybXJtWRlZmluZVBpcGUnOiDJtcm1ZGVmaW5lUGlwZSwKICAgICAgICAnybXJtWRpcmVjdGl2ZUluamVjdCc6IMm1ybVkaXJlY3RpdmVJbmplY3QsCiAgICAgICAgJ8m1ybVnZXRGYWN0b3J5T2YnOiDJtcm1Z2V0RmFjdG9yeU9mLAogICAgICAgICfJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeSc6IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5LAogICAgICAgICfJtcm1aW5qZWN0JzogybXJtWluamVjdCwKICAgICAgICAnybXJtWluamVjdEF0dHJpYnV0ZSc6IMm1ybVpbmplY3RBdHRyaWJ1dGUsCiAgICAgICAgJ8m1ybVpbnZhbGlkRmFjdG9yeSc6IMm1ybVpbnZhbGlkRmFjdG9yeSwKICAgICAgICAnybXJtWludmFsaWRGYWN0b3J5RGVwJzogybXJtWludmFsaWRGYWN0b3J5RGVwLAogICAgICAgICfJtcm1aW5qZWN0UGlwZUNoYW5nZURldGVjdG9yUmVmJzogybXJtWluamVjdFBpcGVDaGFuZ2VEZXRlY3RvclJlZiwKICAgICAgICAnybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yJzogybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yLAogICAgICAgICfJtcm1TmdPbkNoYW5nZXNGZWF0dXJlJzogybXJtU5nT25DaGFuZ2VzRmVhdHVyZSwKICAgICAgICAnybXJtVByb3ZpZGVyc0ZlYXR1cmUnOiDJtcm1UHJvdmlkZXJzRmVhdHVyZSwKICAgICAgICAnybXJtUNvcHlEZWZpbml0aW9uRmVhdHVyZSc6IMm1ybVDb3B5RGVmaW5pdGlvbkZlYXR1cmUsCiAgICAgICAgJ8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUnOiDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlLAogICAgICAgICfJtcm1bmV4dENvbnRleHQnOiDJtcm1bmV4dENvbnRleHQsCiAgICAgICAgJ8m1ybVuYW1lc3BhY2VIVE1MJzogybXJtW5hbWVzcGFjZUhUTUwsCiAgICAgICAgJ8m1ybVuYW1lc3BhY2VNYXRoTUwnOiDJtcm1bmFtZXNwYWNlTWF0aE1MLAogICAgICAgICfJtcm1bmFtZXNwYWNlU1ZHJzogybXJtW5hbWVzcGFjZVNWRywKICAgICAgICAnybXJtWVuYWJsZUJpbmRpbmdzJzogybXJtWVuYWJsZUJpbmRpbmdzLAogICAgICAgICfJtcm1ZGlzYWJsZUJpbmRpbmdzJzogybXJtWRpc2FibGVCaW5kaW5ncywKICAgICAgICAnybXJtWVsZW1lbnRTdGFydCc6IMm1ybVlbGVtZW50U3RhcnQsCiAgICAgICAgJ8m1ybVlbGVtZW50RW5kJzogybXJtWVsZW1lbnRFbmQsCiAgICAgICAgJ8m1ybVlbGVtZW50JzogybXJtWVsZW1lbnQsCiAgICAgICAgJ8m1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQnOiDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0LAogICAgICAgICfJtcm1ZWxlbWVudENvbnRhaW5lckVuZCc6IMm1ybVlbGVtZW50Q29udGFpbmVyRW5kLAogICAgICAgICfJtcm1ZWxlbWVudENvbnRhaW5lcic6IMm1ybVlbGVtZW50Q29udGFpbmVyLAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uMCc6IMm1ybVwdXJlRnVuY3Rpb24wLAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uMSc6IMm1ybVwdXJlRnVuY3Rpb24xLAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uMic6IMm1ybVwdXJlRnVuY3Rpb24yLAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uMyc6IMm1ybVwdXJlRnVuY3Rpb24zLAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uNCc6IMm1ybVwdXJlRnVuY3Rpb240LAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uNSc6IMm1ybVwdXJlRnVuY3Rpb241LAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uNic6IMm1ybVwdXJlRnVuY3Rpb242LAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uNyc6IMm1ybVwdXJlRnVuY3Rpb243LAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uOCc6IMm1ybVwdXJlRnVuY3Rpb244LAogICAgICAgICfJtcm1cHVyZUZ1bmN0aW9uVic6IMm1ybVwdXJlRnVuY3Rpb25WLAogICAgICAgICfJtcm1Z2V0Q3VycmVudFZpZXcnOiDJtcm1Z2V0Q3VycmVudFZpZXcsCiAgICAgICAgJ8m1ybVyZXN0b3JlVmlldyc6IMm1ybVyZXN0b3JlVmlldywKICAgICAgICAnybXJtWxpc3RlbmVyJzogybXJtWxpc3RlbmVyLAogICAgICAgICfJtcm1cHJvamVjdGlvbic6IMm1ybVwcm9qZWN0aW9uLAogICAgICAgICfJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmcnOiDJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmcsCiAgICAgICAgJ8m1ybVjb21wb25lbnRIb3N0U3ludGhldGljTGlzdGVuZXInOiDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyLAogICAgICAgICfJtcm1cGlwZUJpbmQxJzogybXJtXBpcGVCaW5kMSwKICAgICAgICAnybXJtXBpcGVCaW5kMic6IMm1ybVwaXBlQmluZDIsCiAgICAgICAgJ8m1ybVwaXBlQmluZDMnOiDJtcm1cGlwZUJpbmQzLAogICAgICAgICfJtcm1cGlwZUJpbmQ0JzogybXJtXBpcGVCaW5kNCwKICAgICAgICAnybXJtXBpcGVCaW5kVic6IMm1ybVwaXBlQmluZFYsCiAgICAgICAgJ8m1ybVwcm9qZWN0aW9uRGVmJzogybXJtXByb2plY3Rpb25EZWYsCiAgICAgICAgJ8m1ybVob3N0UHJvcGVydHknOiDJtcm1aG9zdFByb3BlcnR5LAogICAgICAgICfJtcm1cHJvcGVydHknOiDJtcm1cHJvcGVydHksCiAgICAgICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUsCiAgICAgICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlMSc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMSwKICAgICAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyJzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGUyLAogICAgICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTMsCiAgICAgICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNCc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNCwKICAgICAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU1LAogICAgICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZTYsCiAgICAgICAgJ8m1ybVwcm9wZXJ0eUludGVycG9sYXRlNyc6IMm1ybVwcm9wZXJ0eUludGVycG9sYXRlNywKICAgICAgICAnybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4JzogybXJtXByb3BlcnR5SW50ZXJwb2xhdGU4LAogICAgICAgICfJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYnOiDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZVYsCiAgICAgICAgJ8m1ybVwaXBlJzogybXJtXBpcGUsCiAgICAgICAgJ8m1ybVxdWVyeVJlZnJlc2gnOiDJtcm1cXVlcnlSZWZyZXNoLAogICAgICAgICfJtcm1dmlld1F1ZXJ5JzogybXJtXZpZXdRdWVyeSwKICAgICAgICAnybXJtXN0YXRpY1ZpZXdRdWVyeSc6IMm1ybVzdGF0aWNWaWV3UXVlcnksCiAgICAgICAgJ8m1ybVzdGF0aWNDb250ZW50UXVlcnknOiDJtcm1c3RhdGljQ29udGVudFF1ZXJ5LAogICAgICAgICfJtcm1bG9hZFF1ZXJ5JzogybXJtWxvYWRRdWVyeSwKICAgICAgICAnybXJtWNvbnRlbnRRdWVyeSc6IMm1ybVjb250ZW50UXVlcnksCiAgICAgICAgJ8m1ybVyZWZlcmVuY2UnOiDJtcm1cmVmZXJlbmNlLAogICAgICAgICfJtcm1Y2xhc3NNYXAnOiDJtcm1Y2xhc3NNYXAsCiAgICAgICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlMSc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlMSwKICAgICAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUyJzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUyLAogICAgICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTMnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTMsCiAgICAgICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlNCc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlNCwKICAgICAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU1JzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU1LAogICAgICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTYnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTYsCiAgICAgICAgJ8m1ybVjbGFzc01hcEludGVycG9sYXRlNyc6IMm1ybVjbGFzc01hcEludGVycG9sYXRlNywKICAgICAgICAnybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU4JzogybXJtWNsYXNzTWFwSW50ZXJwb2xhdGU4LAogICAgICAgICfJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYnOiDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZVYsCiAgICAgICAgJ8m1ybVzdHlsZU1hcCc6IMm1ybVzdHlsZU1hcCwKICAgICAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUxJzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGUxLAogICAgICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTInOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTIsCiAgICAgICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlMyc6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlMywKICAgICAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU0JzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU0LAogICAgICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUnOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTUsCiAgICAgICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlNic6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlNiwKICAgICAgICAnybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU3JzogybXJtXN0eWxlTWFwSW50ZXJwb2xhdGU3LAogICAgICAgICfJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgnOiDJtcm1c3R5bGVNYXBJbnRlcnBvbGF0ZTgsCiAgICAgICAgJ8m1ybVzdHlsZU1hcEludGVycG9sYXRlVic6IMm1ybVzdHlsZU1hcEludGVycG9sYXRlViwKICAgICAgICAnybXJtXN0eWxlUHJvcCc6IMm1ybVzdHlsZVByb3AsCiAgICAgICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTEnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUxLAogICAgICAgICfJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGUyJzogybXJtXN0eWxlUHJvcEludGVycG9sYXRlMiwKICAgICAgICAnybXJtXN0eWxlUHJvcEludGVycG9sYXRlMyc6IMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTMsCiAgICAgICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTQnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU0LAogICAgICAgICfJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU1JzogybXJtXN0eWxlUHJvcEludGVycG9sYXRlNSwKICAgICAgICAnybXJtXN0eWxlUHJvcEludGVycG9sYXRlNic6IMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTYsCiAgICAgICAgJ8m1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZTcnOiDJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU3LAogICAgICAgICfJtcm1c3R5bGVQcm9wSW50ZXJwb2xhdGU4JzogybXJtXN0eWxlUHJvcEludGVycG9sYXRlOCwKICAgICAgICAnybXJtXN0eWxlUHJvcEludGVycG9sYXRlVic6IMm1ybVzdHlsZVByb3BJbnRlcnBvbGF0ZVYsCiAgICAgICAgJ8m1ybVzdHlsZVNhbml0aXplcic6IMm1ybVzdHlsZVNhbml0aXplciwKICAgICAgICAnybXJtWNsYXNzUHJvcCc6IMm1ybVjbGFzc1Byb3AsCiAgICAgICAgJ8m1ybVzZWxlY3QnOiDJtcm1c2VsZWN0LAogICAgICAgICfJtcm1YWR2YW5jZSc6IMm1ybVhZHZhbmNlLAogICAgICAgICfJtcm1dGVtcGxhdGUnOiDJtcm1dGVtcGxhdGUsCiAgICAgICAgJ8m1ybV0ZXh0JzogybXJtXRleHQsCiAgICAgICAgJ8m1ybV0ZXh0SW50ZXJwb2xhdGUnOiDJtcm1dGV4dEludGVycG9sYXRlLAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlMSc6IMm1ybV0ZXh0SW50ZXJwb2xhdGUxLAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlMic6IMm1ybV0ZXh0SW50ZXJwb2xhdGUyLAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlMyc6IMm1ybV0ZXh0SW50ZXJwb2xhdGUzLAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlNCc6IMm1ybV0ZXh0SW50ZXJwb2xhdGU0LAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlNSc6IMm1ybV0ZXh0SW50ZXJwb2xhdGU1LAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlNic6IMm1ybV0ZXh0SW50ZXJwb2xhdGU2LAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlNyc6IMm1ybV0ZXh0SW50ZXJwb2xhdGU3LAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlOCc6IMm1ybV0ZXh0SW50ZXJwb2xhdGU4LAogICAgICAgICfJtcm1dGV4dEludGVycG9sYXRlVic6IMm1ybV0ZXh0SW50ZXJwb2xhdGVWLAogICAgICAgICfJtcm1aTE4bic6IMm1ybVpMThuLAogICAgICAgICfJtcm1aTE4bkF0dHJpYnV0ZXMnOiDJtcm1aTE4bkF0dHJpYnV0ZXMsCiAgICAgICAgJ8m1ybVpMThuRXhwJzogybXJtWkxOG5FeHAsCiAgICAgICAgJ8m1ybVpMThuU3RhcnQnOiDJtcm1aTE4blN0YXJ0LAogICAgICAgICfJtcm1aTE4bkVuZCc6IMm1ybVpMThuRW5kLAogICAgICAgICfJtcm1aTE4bkFwcGx5JzogybXJtWkxOG5BcHBseSwKICAgICAgICAnybXJtWkxOG5Qb3N0cHJvY2Vzcyc6IMm1ybVpMThuUG9zdHByb2Nlc3MsCiAgICAgICAgJ8m1ybVyZXNvbHZlV2luZG93JzogybXJtXJlc29sdmVXaW5kb3csCiAgICAgICAgJ8m1ybVyZXNvbHZlRG9jdW1lbnQnOiDJtcm1cmVzb2x2ZURvY3VtZW50LAogICAgICAgICfJtcm1cmVzb2x2ZUJvZHknOiDJtcm1cmVzb2x2ZUJvZHksCiAgICAgICAgJ8m1ybVzZXRDb21wb25lbnRTY29wZSc6IMm1ybVzZXRDb21wb25lbnRTY29wZSwKICAgICAgICAnybXJtXNldE5nTW9kdWxlU2NvcGUnOiDJtcm1c2V0TmdNb2R1bGVTY29wZSwKICAgICAgICAnybXJtXNhbml0aXplSHRtbCc6IMm1ybVzYW5pdGl6ZUh0bWwsCiAgICAgICAgJ8m1ybVzYW5pdGl6ZVN0eWxlJzogybXJtXNhbml0aXplU3R5bGUsCiAgICAgICAgJ8m1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXInOiDJtcm1ZGVmYXVsdFN0eWxlU2FuaXRpemVyLAogICAgICAgICfJtcm1c2FuaXRpemVSZXNvdXJjZVVybCc6IMm1ybVzYW5pdGl6ZVJlc291cmNlVXJsLAogICAgICAgICfJtcm1c2FuaXRpemVTY3JpcHQnOiDJtcm1c2FuaXRpemVTY3JpcHQsCiAgICAgICAgJ8m1ybVzYW5pdGl6ZVVybCc6IMm1ybVzYW5pdGl6ZVVybCwKICAgICAgICAnybXJtXNhbml0aXplVXJsT3JSZXNvdXJjZVVybCc6IMm1ybVzYW5pdGl6ZVVybE9yUmVzb3VyY2VVcmwsCiAgICB9KTsKICAgIC8qKgogICAgICogQSBtYXBwaW5nIG9mIHRoZSBcQGFuZ3VsYXIvY29yZSBBUEkgc3VyZmFjZSB1c2VkIGluIGdlbmVyYXRlZCBleHByZXNzaW9ucyB0byB0aGUgYWN0dWFsIHN5bWJvbHMuCiAgICAgKgogICAgICogVGhpcyBzaG91bGQgYmUga2VwdCB1cCB0byBkYXRlIHdpdGggdGhlIHB1YmxpYyBleHBvcnRzIG9mIFxAYW5ndWxhci9jb3JlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGFuZ3VsYXJDb3JlRW52ID0gKCjJtTAkZCkpKCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgaml0T3B0aW9ucyA9IG51bGw7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0Sml0T3B0aW9ucyhvcHRpb25zKSB7CiAgICAgICAgaWYgKGppdE9wdGlvbnMgIT09IG51bGwpIHsKICAgICAgICAgICAgaWYgKG9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb24gIT09IGppdE9wdGlvbnMuZGVmYXVsdEVuY2Fwc3VsYXRpb24pIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIHZhbHVlIGZvciBgZGVmYXVsdEVuY2Fwc3VsYXRpb25gIGNhbiBub3QgYmUgY2hhbmdlZCBvbmNlIGl0IGhhcyBiZWVuIHNldC4nKTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0aW9ucy5wcmVzZXJ2ZVdoaXRlc3BhY2VzICE9PSBqaXRPcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXMpIHsKICAgICAgICAgICAgICAgIG5nRGV2TW9kZSAmJgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1Byb3ZpZGVkIHZhbHVlIGZvciBgcHJlc2VydmVXaGl0ZXNwYWNlc2AgY2FuIG5vdCBiZSBjaGFuZ2VkIG9uY2UgaXQgaGFzIGJlZW4gc2V0LicpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGppdE9wdGlvbnMgPSBvcHRpb25zOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRKaXRPcHRpb25zKCkgewogICAgICAgIHJldHVybiBqaXRPcHRpb25zOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9qaXQvbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEVNUFRZX0FSUkFZJDUgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1vZHVsZVF1ZXVlID0gW107CiAgICAvKioKICAgICAqIEVucXVldWVzIG1vZHVsZURlZiB0byBiZSBjaGVja2VkIGxhdGVyIHRvIHNlZSBpZiBzY29wZSBjYW4gYmUgc2V0IG9uIGl0cwogICAgICogY29tcG9uZW50IGRlY2xhcmF0aW9ucy4KICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZW5xdWV1ZU1vZHVsZUZvckRlbGF5ZWRTY29waW5nKG1vZHVsZVR5cGUsIG5nTW9kdWxlKSB7CiAgICAgICAgbW9kdWxlUXVldWUucHVzaCh7IG1vZHVsZVR5cGUsIG5nTW9kdWxlIH0pOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IGZsdXNoaW5nTW9kdWxlUXVldWUgPSBmYWxzZTsKICAgIC8qKgogICAgICogTG9vcHMgb3ZlciBxdWV1ZWQgbW9kdWxlIGRlZmluaXRpb25zLCBpZiBhIGdpdmVuIG1vZHVsZSBkZWZpbml0aW9uIGhhcyBhbGwgb2YgaXRzCiAgICAgKiBkZWNsYXJhdGlvbnMgcmVzb2x2ZWQsIGl0IGRlcXVldWVzIHRoYXQgbW9kdWxlIGRlZmluaXRpb24gYW5kIHNldHMgdGhlIHNjb3BlIG9uCiAgICAgKiBpdHMgZGVjbGFyYXRpb25zLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlKCkgewogICAgICAgIGlmICghZmx1c2hpbmdNb2R1bGVRdWV1ZSkgewogICAgICAgICAgICBmbHVzaGluZ01vZHVsZVF1ZXVlID0gdHJ1ZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSBtb2R1bGVRdWV1ZS5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbW9kdWxlVHlwZSwgbmdNb2R1bGUgfSA9IG1vZHVsZVF1ZXVlW2ldOwogICAgICAgICAgICAgICAgICAgIGlmIChuZ01vZHVsZS5kZWNsYXJhdGlvbnMgJiYgbmdNb2R1bGUuZGVjbGFyYXRpb25zLmV2ZXJ5KGlzUmVzb2x2ZWREZWNsYXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVxdWV1ZQogICAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVRdWV1ZS5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNldFNjb3BlT25EZWNsYXJlZENvbXBvbmVudHMobW9kdWxlVHlwZSwgbmdNb2R1bGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIGZsdXNoaW5nTW9kdWxlUXVldWUgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB0cnV0aHkgaWYgYSBkZWNsYXJhdGlvbiBoYXMgcmVzb2x2ZWQuIElmIHRoZSBkZWNsYXJhdGlvbiBoYXBwZW5zIHRvIGJlCiAgICAgKiBhbiBhcnJheSBvZiBkZWNsYXJhdGlvbnMsIGl0IHdpbGwgcmVjdXJzZSB0byBjaGVjayBlYWNoIGRlY2xhcmF0aW9uIGluIHRoYXQgYXJyYXkKICAgICAqICh3aGljaCBtYXkgYWxzbyBiZSBhcnJheXMpLgogICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNSZXNvbHZlZERlY2xhcmF0aW9uKGRlY2xhcmF0aW9uKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGVjbGFyYXRpb24pKSB7CiAgICAgICAgICAgIHJldHVybiBkZWNsYXJhdGlvbi5ldmVyeShpc1Jlc29sdmVkRGVjbGFyYXRpb24pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gISFyZXNvbHZlRm9yd2FyZFJlZihkZWNsYXJhdGlvbik7CiAgICB9CiAgICAvKioKICAgICAqIENvbXBpbGVzIGEgbW9kdWxlIGluIEpJVCBtb2RlLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb24gYXV0b21hdGljYWxseSBnZXRzIGNhbGxlZCB3aGVuIGEgY2xhc3MgaGFzIGEgYFxATmdNb2R1bGVgIGRlY29yYXRvci4KICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHBhcmFtIHs/PX0gbmdNb2R1bGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZShtb2R1bGVUeXBlLCBuZ01vZHVsZSA9IHt9KSB7CiAgICAgICAgY29tcGlsZU5nTW9kdWxlRGVmcygoLyoqIEB0eXBlIHs/fSAqLyAobW9kdWxlVHlwZSkpLCBuZ01vZHVsZSk7CiAgICAgICAgLy8gQmVjYXVzZSB3ZSBkb24ndCBrbm93IGlmIGFsbCBkZWNsYXJhdGlvbnMgaGF2ZSByZXNvbHZlZCB5ZXQgYXQgdGhlIG1vbWVudCB0aGUKICAgICAgICAvLyBOZ01vZHVsZSBkZWNvcmF0b3IgaXMgZXhlY3V0aW5nLCB3ZSdyZSBlbnF1ZXVlaW5nIHRoZSBzZXR0aW5nIG9mIG1vZHVsZSBzY29wZQogICAgICAgIC8vIG9uIGl0cyBkZWNsYXJhdGlvbnMgdG8gYmUgcnVuIGF0IGEgbGF0ZXIgdGltZSB3aGVuIGFsbCBkZWNsYXJhdGlvbnMgZm9yIHRoZSBtb2R1bGUsCiAgICAgICAgLy8gaW5jbHVkaW5nIGZvcndhcmQgcmVmcywgaGF2ZSByZXNvbHZlZC4KICAgICAgICBlbnF1ZXVlTW9kdWxlRm9yRGVsYXllZFNjb3BpbmcobW9kdWxlVHlwZSwgbmdNb2R1bGUpOwogICAgfQogICAgLyoqCiAgICAgKiBDb21waWxlcyBhbmQgYWRkcyB0aGUgYMm1bW9kYCBhbmQgYMm1aW5qYCBwcm9wZXJ0aWVzIHRvIHRoZSBtb2R1bGUgY2xhc3MuCiAgICAgKgogICAgICogSXQncyBwb3NzaWJsZSB0byBjb21waWxlIGEgbW9kdWxlIHZpYSB0aGlzIEFQSSB3aGljaCB3aWxsIGFsbG93IGR1cGxpY2F0ZSBkZWNsYXJhdGlvbnMgaW4gaXRzCiAgICAgKiByb290LgogICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlCiAgICAgKiBAcGFyYW0gez89fSBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGlsZU5nTW9kdWxlRGVmcyhtb2R1bGVUeXBlLCBuZ01vZHVsZSwgYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QgPSBmYWxzZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnREZWZpbmVkKG1vZHVsZVR5cGUsICdSZXF1aXJlZCB2YWx1ZSBtb2R1bGVUeXBlJyk7CiAgICAgICAgbmdEZXZNb2RlICYmIGFzc2VydERlZmluZWQobmdNb2R1bGUsICdSZXF1aXJlZCB2YWx1ZSBuZ01vZHVsZScpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWNsYXJhdGlvbnMgPSBmbGF0dGVuKG5nTW9kdWxlLmRlY2xhcmF0aW9ucyB8fCBFTVBUWV9BUlJBWSQ1KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5nTW9kdWxlRGVmID0gbnVsbDsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlVHlwZSwgTkdfTU9EX0RFRiwgewogICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsCiAgICAgICAgICAgIGdldDogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKG5nTW9kdWxlRGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5nRGV2TW9kZSAmJiBuZ01vZHVsZS5pbXBvcnRzICYmIG5nTW9kdWxlLmltcG9ydHMuaW5kZXhPZihtb2R1bGVUeXBlKSA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYXNzZXJ0IHRoaXMgaW1tZWRpYXRlbHksIGJlY2F1c2UgYWxsb3dpbmcgaXQgdG8gY29udGludWUgd2lsbCBjYXVzZSBpdCB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyBnbyBpbnRvIGFuIGluZmluaXRlIGxvb3AgYmVmb3JlIHdlJ3ZlIHJlYWNoZWQgdGhlIHBvaW50IHdoZXJlIHdlIHRocm93IGFsbCB0aGUgZXJyb3JzLgogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke3N0cmluZ2lmeUZvckVycm9yKG1vZHVsZVR5cGUpfScgbW9kdWxlIGNhbid0IGltcG9ydCBpdHNlbGZgKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVEZWYgPSBnZXRDb21waWxlckZhY2FkZSgpLmNvbXBpbGVOZ01vZHVsZShhbmd1bGFyQ29yZUVudiwgYG5nOi8vLyR7bW9kdWxlVHlwZS5uYW1lfS/JtW1vZC5qc2AsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogbW9kdWxlVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgYm9vdHN0cmFwOiBmbGF0dGVuKG5nTW9kdWxlLmJvb3RzdHJhcCB8fCBFTVBUWV9BUlJBWSQ1KS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IGRlY2xhcmF0aW9ucy5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBmbGF0dGVuKG5nTW9kdWxlLmltcG9ydHMgfHwgRU1QVFlfQVJSQVkkNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGV4cGFuZE1vZHVsZVdpdGhQcm92aWRlcnMpLAogICAgICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBmbGF0dGVuKG5nTW9kdWxlLmV4cG9ydHMgfHwgRU1QVFlfQVJSQVkkNSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAocmVzb2x2ZUZvcndhcmRSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwKGV4cGFuZE1vZHVsZVdpdGhQcm92aWRlcnMpLAogICAgICAgICAgICAgICAgICAgICAgICBzY2hlbWFzOiBuZ01vZHVsZS5zY2hlbWFzID8gZmxhdHRlbihuZ01vZHVsZS5zY2hlbWFzKSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBuZ01vZHVsZS5pZCB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIC8vIFNldCBgc2NoZW1hc2Agb24gbmdNb2R1bGVEZWYgdG8gYW4gZW1wdHkgYXJyYXkgaW4gSklUIG1vZGUgdG8gaW5kaWNhdGUgdGhhdCBydW50aW1lCiAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIHZlcmlmeSB0aGF0IHRoZXJlIGFyZSBubyB1bmtub3duIGVsZW1lbnRzIGluIGEgdGVtcGxhdGUuIEluIEFPVCBtb2RlLCB0aGF0IGNoZWNrCiAgICAgICAgICAgICAgICAgICAgLy8gaGFwcGVucyBhdCBjb21waWxlIHRpbWUgYW5kIGBzY2hlbWFzYCBpbmZvcm1hdGlvbiBpcyBub3QgcHJlc2VudCBvbiBDb21wb25lbnQgYW5kIE1vZHVsZQogICAgICAgICAgICAgICAgICAgIC8vIGRlZnMgYWZ0ZXIgY29tcGlsYXRpb24gKHNvIHRoZSBjaGVjayBkb2Vzbid0IGhhcHBlbiB0aGUgc2Vjb25kIHRpbWUgYXQgcnVudGltZSkuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFuZ01vZHVsZURlZi5zY2hlbWFzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5nTW9kdWxlRGVmLnNjaGVtYXMgPSBbXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbmdNb2R1bGVEZWY7CiAgICAgICAgICAgIH0pCiAgICAgICAgfSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZ0luamVjdG9yRGVmID0gbnVsbDsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobW9kdWxlVHlwZSwgTkdfSU5KX0RFRiwgewogICAgICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChuZ0luamVjdG9yRGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgbmdEZXZNb2RlICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVEZWYoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChtb2R1bGVUeXBlKSkpKSwgYWxsb3dEdXBsaWNhdGVEZWNsYXJhdGlvbnNJblJvb3QpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRhID0gewogICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBtb2R1bGVUeXBlLm5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IG1vZHVsZVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXMobW9kdWxlVHlwZSksCiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogbmdNb2R1bGUucHJvdmlkZXJzIHx8IEVNUFRZX0FSUkFZJDUsCiAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIChuZ01vZHVsZS5pbXBvcnRzIHx8IEVNUFRZX0FSUkFZJDUpLm1hcChyZXNvbHZlRm9yd2FyZFJlZiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobmdNb2R1bGUuZXhwb3J0cyB8fCBFTVBUWV9BUlJBWSQ1KS5tYXAocmVzb2x2ZUZvcndhcmRSZWYpLAogICAgICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgbmdJbmplY3RvckRlZiA9IGdldENvbXBpbGVyRmFjYWRlKCkuY29tcGlsZUluamVjdG9yKGFuZ3VsYXJDb3JlRW52LCBgbmc6Ly8vJHttb2R1bGVUeXBlLm5hbWV9L8m1aW5qLmpzYCwgbWV0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gbmdJbmplY3RvckRlZjsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHBhcmFtIHs/fSBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdAogICAgICogQHBhcmFtIHs/PX0gaW1wb3J0aW5nTW9kdWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlRGVmKG1vZHVsZVR5cGUsIGFsbG93RHVwbGljYXRlRGVjbGFyYXRpb25zSW5Sb290LCBpbXBvcnRpbmdNb2R1bGUpIHsKICAgICAgICBpZiAodmVyaWZpZWROZ01vZHVsZS5nZXQobW9kdWxlVHlwZSkpCiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB2ZXJpZmllZE5nTW9kdWxlLnNldChtb2R1bGVUeXBlLCB0cnVlKTsKICAgICAgICBtb2R1bGVUeXBlID0gcmVzb2x2ZUZvcndhcmRSZWYobW9kdWxlVHlwZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZ01vZHVsZURlZjsKICAgICAgICBpZiAoaW1wb3J0aW5nTW9kdWxlKSB7CiAgICAgICAgICAgIG5nTW9kdWxlRGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5nTW9kdWxlRGVmKG1vZHVsZVR5cGUpKSk7CiAgICAgICAgICAgIGlmICghbmdNb2R1bGVEZWYpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB2YWx1ZSAnJHttb2R1bGVUeXBlLm5hbWV9JyBpbXBvcnRlZCBieSB0aGUgbW9kdWxlICcke2ltcG9ydGluZ01vZHVsZS5uYW1lfScuIFBsZWFzZSBhZGQgYW4gQE5nTW9kdWxlIGFubm90YXRpb24uYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG5nTW9kdWxlRGVmID0gZ2V0TmdNb2R1bGVEZWYobW9kdWxlVHlwZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVjbGFyYXRpb25zID0gbWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5kZWNsYXJhdGlvbnMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbXBvcnRzID0gbWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5pbXBvcnRzKTsKICAgICAgICBmbGF0dGVuKGltcG9ydHMpLm1hcCh1bndyYXBNb2R1bGVXaXRoUHJvdmlkZXJzSW1wb3J0cykuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtb2QKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1vZCA9PiB7CiAgICAgICAgICAgIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVJbXBvcnQobW9kLCBtb2R1bGVUeXBlKTsKICAgICAgICAgICAgdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZURlZihtb2QsIGZhbHNlLCBtb2R1bGVUeXBlKTsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4cG9ydHMgPSBtYXliZVVud3JhcEZuKG5nTW9kdWxlRGVmLmV4cG9ydHMpOwogICAgICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKHZlcmlmeURlY2xhcmF0aW9uc0hhdmVEZWZpbml0aW9ucyk7CiAgICAgICAgZGVjbGFyYXRpb25zLmZvckVhY2godmVyaWZ5RGlyZWN0aXZlc0hhdmVTZWxlY3Rvcik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbWJpbmVkRGVjbGFyYXRpb25zID0gWwogICAgICAgICAgICAuLi5kZWNsYXJhdGlvbnMubWFwKHJlc29sdmVGb3J3YXJkUmVmKSwKICAgICAgICAgICAgLi4uZmxhdHRlbihpbXBvcnRzLm1hcChjb21wdXRlQ29tYmluZWRFeHBvcnRzKSkubWFwKHJlc29sdmVGb3J3YXJkUmVmKSwKICAgICAgICBdOwogICAgICAgIGV4cG9ydHMuZm9yRWFjaCh2ZXJpZnlFeHBvcnRzQXJlRGVjbGFyZWRPclJlRXhwb3J0ZWQpOwogICAgICAgIGRlY2xhcmF0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRlY2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlY2wgPT4gdmVyaWZ5RGVjbGFyYXRpb25Jc1VuaXF1ZShkZWNsLCBhbGxvd0R1cGxpY2F0ZURlY2xhcmF0aW9uc0luUm9vdCkpKTsKICAgICAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCh2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdNb2R1bGUgPSBnZXRBbm5vdGF0aW9uKG1vZHVsZVR5cGUsICdOZ01vZHVsZScpOwogICAgICAgIGlmIChuZ01vZHVsZSkgewogICAgICAgICAgICBuZ01vZHVsZS5pbXBvcnRzICYmCiAgICAgICAgICAgICAgICBmbGF0dGVuKG5nTW9kdWxlLmltcG9ydHMpLm1hcCh1bndyYXBNb2R1bGVXaXRoUHJvdmlkZXJzSW1wb3J0cykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG1vZAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbW9kID0+IHsKICAgICAgICAgICAgICAgICAgICB2ZXJpZnlTZW1hbnRpY3NPZk5nTW9kdWxlSW1wb3J0KG1vZCwgbW9kdWxlVHlwZSk7CiAgICAgICAgICAgICAgICAgICAgdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZURlZihtb2QsIGZhbHNlLCBtb2R1bGVUeXBlKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgbmdNb2R1bGUuYm9vdHN0cmFwICYmIGRlZXBGb3JFYWNoKG5nTW9kdWxlLmJvb3RzdHJhcCwgdmVyaWZ5Q29ycmVjdEJvb3RzdHJhcFR5cGUpOwogICAgICAgICAgICBuZ01vZHVsZS5ib290c3RyYXAgJiYgZGVlcEZvckVhY2gobmdNb2R1bGUuYm9vdHN0cmFwLCB2ZXJpZnlDb21wb25lbnRJc1BhcnRPZk5nTW9kdWxlKTsKICAgICAgICAgICAgbmdNb2R1bGUuZW50cnlDb21wb25lbnRzICYmCiAgICAgICAgICAgICAgICBkZWVwRm9yRWFjaChuZ01vZHVsZS5lbnRyeUNvbXBvbmVudHMsIHZlcmlmeUNvbXBvbmVudElzUGFydE9mTmdNb2R1bGUpOwogICAgICAgIH0KICAgICAgICAvLyBUaHJvdyBFcnJvciBpZiBhbnkgZXJyb3JzIHdlcmUgZGV0ZWN0ZWQuCiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGVycm9ycy5qb2luKCdcbicpKTsKICAgICAgICB9CiAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB2ZXJpZnlEZWNsYXJhdGlvbnNIYXZlRGVmaW5pdGlvbnModHlwZSkgewogICAgICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmID0gZ2V0Q29tcG9uZW50RGVmKHR5cGUpIHx8IGdldERpcmVjdGl2ZURlZih0eXBlKSB8fCBnZXRQaXBlRGVmKHR5cGUpOwogICAgICAgICAgICBpZiAoIWRlZikgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYFVuZXhwZWN0ZWQgdmFsdWUgJyR7c3RyaW5naWZ5Rm9yRXJyb3IodHlwZSl9JyBkZWNsYXJlZCBieSB0aGUgbW9kdWxlICcke3N0cmluZ2lmeUZvckVycm9yKG1vZHVsZVR5cGUpfScuIFBsZWFzZSBhZGQgYSBAUGlwZS9ARGlyZWN0aXZlL0BDb21wb25lbnQgYW5ub3RhdGlvbi5gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHZlcmlmeURpcmVjdGl2ZXNIYXZlU2VsZWN0b3IodHlwZSkgewogICAgICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmID0gZ2V0RGlyZWN0aXZlRGVmKHR5cGUpOwogICAgICAgICAgICBpZiAoIWdldENvbXBvbmVudERlZih0eXBlKSAmJiBkZWYgJiYgZGVmLnNlbGVjdG9ycy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYERpcmVjdGl2ZSAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBoYXMgbm8gc2VsZWN0b3IsIHBsZWFzZSBhZGQgaXQhYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB2ZXJpZnlFeHBvcnRzQXJlRGVjbGFyZWRPclJlRXhwb3J0ZWQodHlwZSkgewogICAgICAgICAgICB0eXBlID0gcmVzb2x2ZUZvcndhcmRSZWYodHlwZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2luZCA9IGdldENvbXBvbmVudERlZih0eXBlKSAmJiAnY29tcG9uZW50JyB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkgJiYgJ2RpcmVjdGl2ZScgfHwKICAgICAgICAgICAgICAgIGdldFBpcGVEZWYodHlwZSkgJiYgJ3BpcGUnOwogICAgICAgICAgICBpZiAoa2luZCkgewogICAgICAgICAgICAgICAgLy8gb25seSBjaGVja2VkIGlmIHdlIGFyZSBkZWNsYXJlZCBhcyBDb21wb25lbnQsIERpcmVjdGl2ZSwgb3IgUGlwZQogICAgICAgICAgICAgICAgLy8gTW9kdWxlcyBkb24ndCBuZWVkIHRvIGJlIGRlY2xhcmVkIG9yIGltcG9ydGVkLgogICAgICAgICAgICAgICAgaWYgKGNvbWJpbmVkRGVjbGFyYXRpb25zLmxhc3RJbmRleE9mKHR5cGUpID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBleHBvcnRpbmcgc29tZXRoaW5nIHdoaWNoIHdlIGRvbid0IGV4cGxpY2l0bHkgZGVjbGFyZSBvciBpbXBvcnQuCiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYENhbid0IGV4cG9ydCAke2tpbmR9ICR7c3RyaW5naWZ5Rm9yRXJyb3IodHlwZSl9IGZyb20gJHtzdHJpbmdpZnlGb3JFcnJvcihtb2R1bGVUeXBlKX0gYXMgaXQgd2FzIG5laXRoZXIgZGVjbGFyZWQgbm9yIGltcG9ydGVkIWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqIEBwYXJhbSB7P30gc3VwcHJlc3NFcnJvcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHZlcmlmeURlY2xhcmF0aW9uSXNVbmlxdWUodHlwZSwgc3VwcHJlc3NFcnJvcnMpIHsKICAgICAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTW9kdWxlID0gb3duZXJOZ01vZHVsZS5nZXQodHlwZSk7CiAgICAgICAgICAgIGlmIChleGlzdGluZ01vZHVsZSAmJiBleGlzdGluZ01vZHVsZSAhPT0gbW9kdWxlVHlwZSkgewogICAgICAgICAgICAgICAgaWYgKCFzdXBwcmVzc0Vycm9ycykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVzID0gW2V4aXN0aW5nTW9kdWxlLCBtb2R1bGVUeXBlXS5tYXAoc3RyaW5naWZ5Rm9yRXJyb3IpLnNvcnQoKTsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgVHlwZSAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBpcyBwYXJ0IG9mIHRoZSBkZWNsYXJhdGlvbnMgb2YgMiBtb2R1bGVzOiAke21vZHVsZXNbMF19IGFuZCAke21vZHVsZXNbMV19ISBgICsKICAgICAgICAgICAgICAgICAgICAgICAgYFBsZWFzZSBjb25zaWRlciBtb3ZpbmcgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gdG8gYSBoaWdoZXIgbW9kdWxlIHRoYXQgaW1wb3J0cyAke21vZHVsZXNbMF19IGFuZCAke21vZHVsZXNbMV19LiBgICsKICAgICAgICAgICAgICAgICAgICAgICAgYFlvdSBjYW4gYWxzbyBjcmVhdGUgYSBuZXcgTmdNb2R1bGUgdGhhdCBleHBvcnRzIGFuZCBpbmNsdWRlcyAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSB0aGVuIGltcG9ydCB0aGF0IE5nTW9kdWxlIGluICR7bW9kdWxlc1swXX0gYW5kICR7bW9kdWxlc1sxXX0uYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBNYXJrIHR5cGUgYXMgaGF2aW5nIG93bmVyLgogICAgICAgICAgICAgICAgb3duZXJOZ01vZHVsZS5zZXQodHlwZSwgbW9kdWxlVHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB2ZXJpZnlDb21wb25lbnRJc1BhcnRPZk5nTW9kdWxlKHR5cGUpIHsKICAgICAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nTW9kdWxlID0gb3duZXJOZ01vZHVsZS5nZXQodHlwZSk7CiAgICAgICAgICAgIGlmICghZXhpc3RpbmdNb2R1bGUpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGBDb21wb25lbnQgJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0gaXMgbm90IHBhcnQgb2YgYW55IE5nTW9kdWxlIG9yIHRoZSBtb2R1bGUgaGFzIG5vdCBiZWVuIGltcG9ydGVkIGludG8geW91ciBtb2R1bGUuYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB2ZXJpZnlDb3JyZWN0Qm9vdHN0cmFwVHlwZSh0eXBlKSB7CiAgICAgICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAgICAgaWYgKCFnZXRDb21wb25lbnREZWYodHlwZSkpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGAke3N0cmluZ2lmeUZvckVycm9yKHR5cGUpfSBjYW5ub3QgYmUgdXNlZCBhcyBhbiBlbnRyeSBjb21wb25lbnQuYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiB2ZXJpZnlDb21wb25lbnRFbnRyeUNvbXBvbmVudHNJc1BhcnRPZk5nTW9kdWxlKHR5cGUpIHsKICAgICAgICAgICAgdHlwZSA9IHJlc29sdmVGb3J3YXJkUmVmKHR5cGUpOwogICAgICAgICAgICBpZiAoZ2V0Q29tcG9uZW50RGVmKHR5cGUpKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBrbm93IHdlIGFyZSBjb21wb25lbnQKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IGdldEFubm90YXRpb24odHlwZSwgJ0NvbXBvbmVudCcpOwogICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCAmJiBjb21wb25lbnQuZW50cnlDb21wb25lbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgZGVlcEZvckVhY2goY29tcG9uZW50LmVudHJ5Q29tcG9uZW50cywgdmVyaWZ5Q29tcG9uZW50SXNQYXJ0T2ZOZ01vZHVsZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbXBvcnRpbmdNb2R1bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHZlcmlmeVNlbWFudGljc09mTmdNb2R1bGVJbXBvcnQodHlwZSwgaW1wb3J0aW5nTW9kdWxlKSB7CiAgICAgICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAgICAgaWYgKGdldENvbXBvbmVudERlZih0eXBlKSB8fCBnZXREaXJlY3RpdmVEZWYodHlwZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBkaXJlY3RpdmUgJyR7dHlwZS5uYW1lfScgaW1wb3J0ZWQgYnkgdGhlIG1vZHVsZSAnJHtpbXBvcnRpbmdNb2R1bGUubmFtZX0nLiBQbGVhc2UgYWRkIGFuIEBOZ01vZHVsZSBhbm5vdGF0aW9uLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChnZXRQaXBlRGVmKHR5cGUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgcGlwZSAnJHt0eXBlLm5hbWV9JyBpbXBvcnRlZCBieSB0aGUgbW9kdWxlICcke2ltcG9ydGluZ01vZHVsZS5uYW1lfScuIFBsZWFzZSBhZGQgYW4gQE5nTW9kdWxlIGFubm90YXRpb24uYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZU9yV2l0aFByb3ZpZGVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdW53cmFwTW9kdWxlV2l0aFByb3ZpZGVyc0ltcG9ydHModHlwZU9yV2l0aFByb3ZpZGVycykgewogICAgICAgIHR5cGVPcldpdGhQcm92aWRlcnMgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlT3JXaXRoUHJvdmlkZXJzKTsKICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICh0eXBlT3JXaXRoUHJvdmlkZXJzKSkpLm5nTW9kdWxlIHx8IHR5cGVPcldpdGhQcm92aWRlcnM7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0QW5ub3RhdGlvbih0eXBlLCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBhbm5vdGF0aW9uID0gbnVsbDsKICAgICAgICBjb2xsZWN0KHR5cGUuX19hbm5vdGF0aW9uc19fKTsKICAgICAgICBjb2xsZWN0KHR5cGUuZGVjb3JhdG9ycyk7CiAgICAgICAgcmV0dXJuIGFubm90YXRpb247CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gY29sbGVjdChhbm5vdGF0aW9ucykgewogICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgIGFubm90YXRpb25zLmZvckVhY2gocmVhZEFubm90YXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVjb3JhdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiByZWFkQW5ub3RhdGlvbihkZWNvcmF0b3IpIHsKICAgICAgICAgICAgaWYgKCFhbm5vdGF0aW9uKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZihkZWNvcmF0b3IpOwogICAgICAgICAgICAgICAgaWYgKHByb3RvLm5nTWV0YWRhdGFOYW1lID09IG5hbWUpIHsKICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlY29yYXRvcikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZGVjb3JhdG9yLnR5cGUpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcHJvdG8gPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YoZGVjb3JhdG9yLnR5cGUpOwogICAgICAgICAgICAgICAgICAgIGlmIChwcm90by5uZ01ldGFkYXRhTmFtZSA9PSBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24gPSBkZWNvcmF0b3IuYXJnc1swXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEtlZXAgdHJhY2sgb2YgY29tcGlsZWQgY29tcG9uZW50cy4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBpbiB0ZXN0cyB3ZSBvZnRlbiB3YW50IHRvIGNvbXBpbGUgdGhlCiAgICAgKiBzYW1lIGNvbXBvbmVudCB3aXRoIG1vcmUgdGhhbiBvbmUgTmdNb2R1bGUuIFRoaXMgd291bGQgY2F1c2UgYW4gZXJyb3IgdW5sZXNzIHdlIHJlc2V0IHdoaWNoCiAgICAgKiBOZ01vZHVsZSB0aGUgY29tcG9uZW50IGJlbG9uZ3MgdG8uIFdlIGtlZXAgdGhlIGxpc3Qgb2YgY29tcGlsZWQgY29tcG9uZW50cyBoZXJlIHNvIHRoYXQgdGhlCiAgICAgKiBUZXN0QmVkIGNhbiByZXNldCBpdCBsYXRlci4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBsZXQgb3duZXJOZ01vZHVsZSA9IG5ldyBNYXAoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB2ZXJpZmllZE5nTW9kdWxlID0gbmV3IE1hcCgpOwogICAgLyoqCiAgICAgKiBDb21wdXRlcyB0aGUgY29tYmluZWQgZGVjbGFyYXRpb25zIG9mIGV4cGxpY2l0IGRlY2xhcmF0aW9ucywgYXMgd2VsbCBhcyBkZWNsYXJhdGlvbnMgaW5oZXJpdGVkIGJ5CiAgICAgKiB0cmF2ZXJzaW5nIHRoZSBleHBvcnRzIG9mIGltcG9ydGVkIG1vZHVsZXMuCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXB1dGVDb21iaW5lZEV4cG9ydHModHlwZSkgewogICAgICAgIHR5cGUgPSByZXNvbHZlRm9yd2FyZFJlZih0eXBlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmdNb2R1bGVEZWYgPSBnZXROZ01vZHVsZURlZih0eXBlLCB0cnVlKTsKICAgICAgICByZXR1cm4gWy4uLmZsYXR0ZW4obWF5YmVVbndyYXBGbihuZ01vZHVsZURlZi5leHBvcnRzKS5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh0eXBlKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZ01vZHVsZURlZiA9IGdldE5nTW9kdWxlRGVmKHR5cGUpOwogICAgICAgICAgICAgICAgaWYgKG5nTW9kdWxlRGVmKSB7CiAgICAgICAgICAgICAgICAgICAgdmVyaWZ5U2VtYW50aWNzT2ZOZ01vZHVsZURlZigoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSkpLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVDb21iaW5lZEV4cG9ydHModHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpKV07CiAgICB9CiAgICAvKioKICAgICAqIFNvbWUgZGVjbGFyZWQgY29tcG9uZW50cyBtYXkgYmUgY29tcGlsZWQgYXN5bmNocm9ub3VzbHksIGFuZCB0aHVzIG1heSBub3QgaGF2ZSB0aGVpcgogICAgICogybVjbXAgc2V0IHlldC4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgdGhlbiBhIHJlZmVyZW5jZSB0byB0aGUgbW9kdWxlIGlzIHdyaXR0ZW4gaW50bwogICAgICogdGhlIGBuZ1NlbGVjdG9yU2NvcGVgIHByb3BlcnR5IG9mIHRoZSBkZWNsYXJlZCB0eXBlLgogICAgICogQHBhcmFtIHs/fSBtb2R1bGVUeXBlCiAgICAgKiBAcGFyYW0gez99IG5nTW9kdWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRTY29wZU9uRGVjbGFyZWRDb21wb25lbnRzKG1vZHVsZVR5cGUsIG5nTW9kdWxlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlY2xhcmF0aW9ucyA9IGZsYXR0ZW4obmdNb2R1bGUuZGVjbGFyYXRpb25zIHx8IEVNUFRZX0FSUkFZJDUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0cmFuc2l0aXZlU2NvcGVzID0gdHJhbnNpdGl2ZVNjb3Blc0Zvcihtb2R1bGVUeXBlKTsKICAgICAgICBkZWNsYXJhdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVjbGFyYXRpb24gPT4gewogICAgICAgICAgICBpZiAoZGVjbGFyYXRpb24uaGFzT3duUHJvcGVydHkoTkdfQ09NUF9ERUYpKSB7CiAgICAgICAgICAgICAgICAvLyBBIGDJtWNtcGAgZmllbGQgZXhpc3RzIC0gZ28gYWhlYWQgYW5kIHBhdGNoIHRoZSBjb21wb25lbnQgZGlyZWN0bHkuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVjbGFyYXRpb24pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudERlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXRDb21wb25lbnREZWYoY29tcG9uZW50KSkpOwogICAgICAgICAgICAgICAgcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUoY29tcG9uZW50RGVmLCB0cmFuc2l0aXZlU2NvcGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghZGVjbGFyYXRpb24uaGFzT3duUHJvcGVydHkoTkdfRElSX0RFRikgJiYgIWRlY2xhcmF0aW9uLmhhc093blByb3BlcnR5KE5HX1BJUEVfREVGKSkgewogICAgICAgICAgICAgICAgLy8gU2V0IGBuZ1NlbGVjdG9yU2NvcGVgIGZvciBmdXR1cmUgcmVmZXJlbmNlIHdoZW4gdGhlIGNvbXBvbmVudCBjb21waWxhdGlvbiBmaW5pc2hlcy4KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoZGVjbGFyYXRpb24pKSkubmdTZWxlY3RvclNjb3BlID0gbW9kdWxlVHlwZTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogUGF0Y2ggdGhlIGRlZmluaXRpb24gb2YgYSBjb21wb25lbnQgd2l0aCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBmcm9tIHRoZSBjb21waWxhdGlvbiBzY29wZSBvZgogICAgICogYSBnaXZlbiBtb2R1bGUuCiAgICAgKiBAdGVtcGxhdGUgQwogICAgICogQHBhcmFtIHs/fSBjb21wb25lbnREZWYKICAgICAqIEBwYXJhbSB7P30gdHJhbnNpdGl2ZVNjb3BlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUoY29tcG9uZW50RGVmLCB0cmFuc2l0aXZlU2NvcGVzKSB7CiAgICAgICAgY29tcG9uZW50RGVmLmRpcmVjdGl2ZURlZnMgPSAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBBcnJheS5mcm9tKHRyYW5zaXRpdmVTY29wZXMuY29tcGlsYXRpb24uZGlyZWN0aXZlcykKICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpciA9PiBkaXIuaGFzT3duUHJvcGVydHkoTkdfQ09NUF9ERUYpID8gKC8qKiBAdHlwZSB7P30gKi8gKGdldENvbXBvbmVudERlZihkaXIpKSkgOiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0RGlyZWN0aXZlRGVmKGRpcikpKSkpCiAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZWYgPT4gISFkZWYpKSk7CiAgICAgICAgY29tcG9uZW50RGVmLnBpcGVEZWZzID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gQXJyYXkuZnJvbSh0cmFuc2l0aXZlU2NvcGVzLmNvbXBpbGF0aW9uLnBpcGVzKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGlwZSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0UGlwZURlZihwaXBlKSkpKSkpOwogICAgICAgIGNvbXBvbmVudERlZi5zY2hlbWFzID0gdHJhbnNpdGl2ZVNjb3Blcy5zY2hlbWFzOwogICAgICAgIC8vIFNpbmNlIHdlIGF2b2lkIENvbXBvbmVudHMvRGlyZWN0aXZlcy9QaXBlcyByZWNvbXBpbGluZyBpbiBjYXNlIHRoZXJlIGFyZSBubyBvdmVycmlkZXMsIHdlCiAgICAgICAgLy8gbWF5IGZhY2UgYSBwcm9ibGVtIHdoZXJlIHByZXZpb3VzbHkgY29tcGlsZWQgZGVmcyBhdmFpbGFibGUgdG8gYSBnaXZlbiBDb21wb25lbnQvRGlyZWN0aXZlCiAgICAgICAgLy8gYXJlIGNhY2hlZCBpbiBUVmlldyBhbmQgbWF5IGJlY29tZSBzdGFsZSAoaW4gY2FzZSBhbnkgb2YgdGhlc2UgZGVmcyBnZXRzIHJlY29tcGlsZWQpLiBJbgogICAgICAgIC8vIG9yZGVyIHRvIGF2b2lkIHRoaXMgcHJvYmxlbSwgd2UgZm9yY2UgZnJlc2ggVFZpZXcgdG8gYmUgY3JlYXRlZC4KICAgICAgICBjb21wb25lbnREZWYudFZpZXcgPSBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBDb21wdXRlIHRoZSBwYWlyIG9mIHRyYW5zaXRpdmUgc2NvcGVzIChjb21waWxhdGlvbiBzY29wZSBhbmQgZXhwb3J0ZWQgc2NvcGUpIGZvciBhIGdpdmVuIG1vZHVsZS4KICAgICAqCiAgICAgKiBUaGlzIG9wZXJhdGlvbiBpcyBtZW1vaXplZCBhbmQgdGhlIHJlc3VsdCBpcyBjYWNoZWQgb24gdGhlIG1vZHVsZSdzIGRlZmluaXRpb24uIFRoaXMgZnVuY3Rpb24gY2FuCiAgICAgKiBiZSBjYWxsZWQgb24gbW9kdWxlcyB3aXRoIGNvbXBvbmVudHMgdGhhdCBoYXZlIG5vdCBmdWxseSBjb21waWxlZCB5ZXQsIGJ1dCB0aGUgcmVzdWx0IHNob3VsZCBub3QKICAgICAqIGJlIHVzZWQgdW50aWwgdGhleSBoYXZlLgogICAgICoKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUgbW9kdWxlIHRoYXQgdHJhbnNpdGl2ZSBzY29wZSBzaG91bGQgYmUgY2FsY3VsYXRlZCBmb3IuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0cmFuc2l0aXZlU2NvcGVzRm9yKG1vZHVsZVR5cGUpIHsKICAgICAgICBpZiAoIWlzTmdNb2R1bGUobW9kdWxlVHlwZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21vZHVsZVR5cGUubmFtZX0gZG9lcyBub3QgaGF2ZSBhIG1vZHVsZSBkZWYgKMm1bW9kIHByb3BlcnR5KWApOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldE5nTW9kdWxlRGVmKG1vZHVsZVR5cGUpKSk7CiAgICAgICAgaWYgKGRlZi50cmFuc2l0aXZlQ29tcGlsZVNjb3BlcyAhPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gZGVmLnRyYW5zaXRpdmVDb21waWxlU2NvcGVzOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2NvcGVzID0gewogICAgICAgICAgICBzY2hlbWFzOiBkZWYuc2NoZW1hcyB8fCBudWxsLAogICAgICAgICAgICBjb21waWxhdGlvbjogewogICAgICAgICAgICAgICAgZGlyZWN0aXZlczogbmV3IFNldCgpLAogICAgICAgICAgICAgICAgcGlwZXM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXhwb3J0ZWQ6IHsKICAgICAgICAgICAgICAgIGRpcmVjdGl2ZXM6IG5ldyBTZXQoKSwKICAgICAgICAgICAgICAgIHBpcGVzOiBuZXcgU2V0KCksCiAgICAgICAgICAgIH0sCiAgICAgICAgfTsKICAgICAgICBtYXliZVVud3JhcEZuKGRlZi5pbXBvcnRzKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAdGVtcGxhdGUgSQogICAgICAgICAqIEBwYXJhbSB7P30gaW1wb3J0ZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChpbXBvcnRlZCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkVHlwZSA9ICgvKiogQHR5cGUgez99ICovIChpbXBvcnRlZCkpOwogICAgICAgICAgICBpZiAoIWlzTmdNb2R1bGUoaW1wb3J0ZWRUeXBlKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbXBvcnRpbmcgJHtpbXBvcnRlZFR5cGUubmFtZX0gd2hpY2ggZG9lcyBub3QgaGF2ZSBhIMm1bW9kIHByb3BlcnR5YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2hlbiB0aGlzIG1vZHVsZSBpbXBvcnRzIGFub3RoZXIsIHRoZSBpbXBvcnRlZCBtb2R1bGUncyBleHBvcnRlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhcmUKICAgICAgICAgICAgLy8gYWRkZWQgdG8gdGhlIGNvbXBpbGF0aW9uIHNjb3BlIG9mIHRoaXMgbW9kdWxlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGltcG9ydGVkU2NvcGUgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKGltcG9ydGVkVHlwZSk7CiAgICAgICAgICAgIGltcG9ydGVkU2NvcGUuZXhwb3J0ZWQuZGlyZWN0aXZlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbnRyeQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW50cnkgPT4gc2NvcGVzLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMuYWRkKGVudHJ5KSkpOwogICAgICAgICAgICBpbXBvcnRlZFNjb3BlLmV4cG9ydGVkLnBpcGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbnRyeSA9PiBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGVudHJ5KSkpOwogICAgICAgIH0pKTsKICAgICAgICBtYXliZVVud3JhcEZuKGRlZi5kZWNsYXJhdGlvbnMpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGVjbGFyZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlY2xhcmVkID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWNsYXJlZFdpdGhEZWZzID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlY2xhcmVkKSk7CiAgICAgICAgICAgIGlmIChnZXRQaXBlRGVmKGRlY2xhcmVkV2l0aERlZnMpKSB7CiAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGRlY2xhcmVkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEVpdGhlciBkZWNsYXJlZCBoYXMgYSDJtWNtcCBvciDJtWRpciwgb3IgaXQncyBhIGNvbXBvbmVudCB3aGljaCBoYXNuJ3QKICAgICAgICAgICAgICAgIC8vIGhhZCBpdHMgdGVtcGxhdGUgY29tcGlsZWQgeWV0LiBJbiBlaXRoZXIgY2FzZSwgaXQgZ2V0cyBhZGRlZCB0byB0aGUgY29tcGlsYXRpb24ncwogICAgICAgICAgICAgICAgLy8gZGlyZWN0aXZlcy4KICAgICAgICAgICAgICAgIHNjb3Blcy5jb21waWxhdGlvbi5kaXJlY3RpdmVzLmFkZChkZWNsYXJlZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgbWF5YmVVbndyYXBGbihkZWYuZXhwb3J0cykuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHRlbXBsYXRlIEUKICAgICAgICAgKiBAcGFyYW0gez99IGV4cG9ydGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXhwb3J0ZWQpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBleHBvcnRlZFR5cGUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXhwb3J0ZWQpKTsKICAgICAgICAgICAgLy8gRWl0aGVyIHRoZSB0eXBlIGlzIGEgbW9kdWxlLCBhIHBpcGUsIG9yIGEgY29tcG9uZW50L2RpcmVjdGl2ZSAod2hpY2ggbWF5IG5vdCBoYXZlIGEKICAgICAgICAgICAgLy8gybVjbXAgYXMgaXQgbWlnaHQgYmUgY29tcGlsZWQgYXN5bmNocm9ub3VzbHkpLgogICAgICAgICAgICBpZiAoaXNOZ01vZHVsZShleHBvcnRlZFR5cGUpKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoaXMgbW9kdWxlIGV4cG9ydHMgYW5vdGhlciwgdGhlIGV4cG9ydGVkIG1vZHVsZSdzIGV4cG9ydGVkIGRpcmVjdGl2ZXMgYW5kIHBpcGVzIGFyZQogICAgICAgICAgICAgICAgLy8gYWRkZWQgdG8gYm90aCB0aGUgY29tcGlsYXRpb24gYW5kIGV4cG9ydGVkIHNjb3BlcyBvZiB0aGlzIG1vZHVsZS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGV4cG9ydGVkU2NvcGUgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKGV4cG9ydGVkVHlwZSk7CiAgICAgICAgICAgICAgICBleHBvcnRlZFNjb3BlLmV4cG9ydGVkLmRpcmVjdGl2ZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc2NvcGVzLmNvbXBpbGF0aW9uLmRpcmVjdGl2ZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQuZGlyZWN0aXZlcy5hZGQoZW50cnkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgZXhwb3J0ZWRTY29wZS5leHBvcnRlZC5waXBlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgICAgICAgICBzY29wZXMuY29tcGlsYXRpb24ucGlwZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgICAgICAgICBzY29wZXMuZXhwb3J0ZWQucGlwZXMuYWRkKGVudHJ5KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChnZXRQaXBlRGVmKGV4cG9ydGVkVHlwZSkpIHsKICAgICAgICAgICAgICAgIHNjb3Blcy5leHBvcnRlZC5waXBlcy5hZGQoZXhwb3J0ZWRUeXBlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHNjb3Blcy5leHBvcnRlZC5kaXJlY3RpdmVzLmFkZChleHBvcnRlZFR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGRlZi50cmFuc2l0aXZlQ29tcGlsZVNjb3BlcyA9IHNjb3BlczsKICAgICAgICByZXR1cm4gc2NvcGVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBleHBhbmRNb2R1bGVXaXRoUHJvdmlkZXJzKHZhbHVlKSB7CiAgICAgICAgaWYgKGlzTW9kdWxlV2l0aFByb3ZpZGVycyh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlLm5nTW9kdWxlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTW9kdWxlV2l0aFByb3ZpZGVycyh2YWx1ZSkgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpLm5nTW9kdWxlICE9PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc05nTW9kdWxlKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuICEhZ2V0TmdNb2R1bGVEZWYodmFsdWUpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9qaXQvZGlyZWN0aXZlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ29tcGlsZSBhbiBBbmd1bGFyIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRvciBtZXRhZGF0YSwgYW5kIHBhdGNoIHRoZSByZXN1bHRpbmcKICAgICAqIGNvbXBvbmVudCBkZWYgKMm1Y21wKSBvbnRvIHRoZSBjb21wb25lbnQgdHlwZS4KICAgICAqCiAgICAgKiBDb21waWxhdGlvbiBtYXkgYmUgYXN5bmNocm9ub3VzIChkdWUgdG8gdGhlIG5lZWQgdG8gcmVzb2x2ZSBVUkxzIGZvciB0aGUgY29tcG9uZW50IHRlbXBsYXRlIG9yCiAgICAgKiBvdGhlciByZXNvdXJjZXMsIGZvciBleGFtcGxlKS4gSW4gdGhlIGV2ZW50IHRoYXQgY29tcGlsYXRpb24gaXMgbm90IGltbWVkaWF0ZSwgYGNvbXBpbGVDb21wb25lbnRgCiAgICAgKiB3aWxsIGVucXVldWUgcmVzb3VyY2UgcmVzb2x1dGlvbiBpbnRvIGEgZ2xvYmFsIHF1ZXVlIGFuZCB3aWxsIGZhaWwgdG8gcmV0dXJuIHRoZSBgybVjbXBgCiAgICAgKiB1bnRpbCB0aGUgZ2xvYmFsIHF1ZXVlIGhhcyBiZWVuIHJlc29sdmVkIHdpdGggYSBjYWxsIHRvIGByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzYC4KICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGlsZUNvbXBvbmVudCh0eXBlLCBtZXRhZGF0YSkgewogICAgICAgIC8vIEluaXRpYWxpemUgbmdEZXZNb2RlLiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IHN0YXRlbWVudCBpbiBjb21waWxlQ29tcG9uZW50LgogICAgICAgIC8vIFNlZSB0aGUgYGluaXROZ0Rldk1vZGVgIGRvY3N0cmluZyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAgICAodHlwZW9mIG5nRGV2TW9kZSA9PT0gJ3VuZGVmaW5lZCcgfHwgbmdEZXZNb2RlKSAmJiBpbml0TmdEZXZNb2RlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZ0NvbXBvbmVudERlZiA9IG51bGw7CiAgICAgICAgLy8gTWV0YWRhdGEgbWF5IGhhdmUgcmVzb3VyY2VzIHdoaWNoIG5lZWQgdG8gYmUgcmVzb2x2ZWQuCiAgICAgICAgbWF5YmVRdWV1ZVJlc29sdXRpb25PZkNvbXBvbmVudFJlc291cmNlcyh0eXBlLCBtZXRhZGF0YSk7CiAgICAgICAgLy8gTm90ZSB0aGF0IHdlJ3JlIHVzaW5nIHRoZSBzYW1lIGZ1bmN0aW9uIGFzIGBEaXJlY3RpdmVgLCBiZWNhdXNlIHRoYXQncyBvbmx5IHN1YnNldCBvZiBtZXRhZGF0YQogICAgICAgIC8vIHRoYXQgd2UgbmVlZCB0byBjcmVhdGUgdGhlIG5nRmFjdG9yeURlZi4gV2UncmUgYXZvaWRpbmcgdXNpbmcgdGhlIGNvbXBvbmVudCBtZXRhZGF0YQogICAgICAgIC8vIGJlY2F1c2Ugd2UnZCBoYXZlIHRvIHJlc29sdmUgdGhlIGFzeW5jaHJvbm91cyB0ZW1wbGF0ZXMuCiAgICAgICAgYWRkRGlyZWN0aXZlRmFjdG9yeURlZih0eXBlLCBtZXRhZGF0YSk7CiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHR5cGUsIE5HX0NPTVBfREVGLCB7CiAgICAgICAgICAgIGdldDogKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKG5nQ29tcG9uZW50RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50TmVlZHNSZXNvbHV0aW9uKG1ldGFkYXRhKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gW2BDb21wb25lbnQgJyR7dHlwZS5uYW1lfScgaXMgbm90IHJlc29sdmVkOmBdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobWV0YWRhdGEudGVtcGxhdGVVcmwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLnB1c2goYCAtIHRlbXBsYXRlVXJsOiAke21ldGFkYXRhLnRlbXBsYXRlVXJsfWApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXRhZGF0YS5zdHlsZVVybHMgJiYgbWV0YWRhdGEuc3R5bGVVcmxzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgIC0gc3R5bGVVcmxzOiAke0pTT04uc3RyaW5naWZ5KG1ldGFkYXRhLnN0eWxlVXJscyl9YCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IucHVzaChgRGlkIHlvdSBydW4gYW5kIHdhaXQgZm9yICdyZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCknP2ApOwogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoZXJyb3Iuam9pbignXG4nKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY29uc3Qgd2FzIGNhbGxlZCBgaml0T3B0aW9uc2AgcHJldmlvdXNseSBidXQgaGFkIHRvIGJlIHJlbmFtZWQgdG8gYG9wdGlvbnNgIGJlY2F1c2UKICAgICAgICAgICAgICAgICAgICAvLyBvZiBhIGJ1ZyB3aXRoIFRlcnNlciB0aGF0IGNhdXNlZCBvcHRpbWl6ZWQgSklUIGJ1aWxkcyB0byB0aHJvdyBhIGBSZWZlcmVuY2VFcnJvcmAuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBidWcgd2FzIGludmVzdGlnYXRlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyLWNsaS9pc3N1ZXMvMTcyNjQuCiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIG5vdCByZW5hbWUgaXQgYmFjayB1bnRpbCBodHRwczovL2dpdGh1Yi5jb20vdGVyc2VyL3RlcnNlci9pc3N1ZXMvNjE1IGlzIGZpeGVkLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gZ2V0Sml0T3B0aW9ucygpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgcHJlc2VydmVXaGl0ZXNwYWNlcyA9IG1ldGFkYXRhLnByZXNlcnZlV2hpdGVzcGFjZXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXNlcnZlV2hpdGVzcGFjZXMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyAhPT0gbnVsbCAmJiBvcHRpb25zLnByZXNlcnZlV2hpdGVzcGFjZXMgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlcyA9IG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlczsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNlcnZlV2hpdGVzcGFjZXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IGVuY2Fwc3VsYXRpb24gPSBtZXRhZGF0YS5lbmNhcHN1bGF0aW9uOwogICAgICAgICAgICAgICAgICAgIGlmIChlbmNhcHN1bGF0aW9uID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMgIT09IG51bGwgJiYgb3B0aW9ucy5kZWZhdWx0RW5jYXBzdWxhdGlvbiAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uID0gb3B0aW9ucy5kZWZhdWx0RW5jYXBzdWxhdGlvbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb24gPSBWaWV3RW5jYXBzdWxhdGlvbiQxLkVtdWxhdGVkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZW1wbGF0ZVVybCA9IG1ldGFkYXRhLnRlbXBsYXRlVXJsIHx8IGBuZzovLy8ke3R5cGUubmFtZX0vdGVtcGxhdGUuaHRtbGA7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRpcmVjdGl2ZU1ldGFkYXRhKHR5cGUsIG1ldGFkYXRhKSksIHsgdHlwZVNvdXJjZVNwYW46IGNvbXBpbGVyLmNyZWF0ZVBhcnNlU291cmNlU3BhbignQ29tcG9uZW50JywgdHlwZS5uYW1lLCB0ZW1wbGF0ZVVybCksIHRlbXBsYXRlOiBtZXRhZGF0YS50ZW1wbGF0ZSB8fCAnJywgcHJlc2VydmVXaGl0ZXNwYWNlcywgc3R5bGVzOiBtZXRhZGF0YS5zdHlsZXMgfHwgRU1QVFlfQVJSQVksIGFuaW1hdGlvbnM6IG1ldGFkYXRhLmFuaW1hdGlvbnMsIGRpcmVjdGl2ZXM6IFtdLCBjaGFuZ2VEZXRlY3Rpb246IG1ldGFkYXRhLmNoYW5nZURldGVjdGlvbiwgcGlwZXM6IG5ldyBNYXAoKSwgZW5jYXBzdWxhdGlvbiwgaW50ZXJwb2xhdGlvbjogbWV0YWRhdGEuaW50ZXJwb2xhdGlvbiwgdmlld1Byb3ZpZGVyczogbWV0YWRhdGEudmlld1Byb3ZpZGVycyB8fCBudWxsIH0pOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRhLnVzZXNJbmhlcml0YW5jZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhZGREaXJlY3RpdmVEZWZUb1VuZGVjb3JhdGVkUGFyZW50cyh0eXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbmdDb21wb25lbnREZWYgPSBjb21waWxlci5jb21waWxlQ29tcG9uZW50KGFuZ3VsYXJDb3JlRW52LCB0ZW1wbGF0ZVVybCwgbWV0YSk7CiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBOZ01vZHVsZSBkZWNvcmF0b3IgZXhlY3V0ZWQsIHdlIGVucXVldWVkIHRoZSBtb2R1bGUgZGVmaW5pdGlvbiBzdWNoIHRoYXQKICAgICAgICAgICAgICAgICAgICAvLyBpdCB3b3VsZCBvbmx5IGRlcXVldWUgYW5kIGFkZCBpdHNlbGYgYXMgbW9kdWxlIHNjb3BlIHRvIGFsbCBvZiBpdHMgZGVjbGFyYXRpb25zLAogICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBvbmx5IGlmICBpZiBhbGwgb2YgaXRzIGRlY2xhcmF0aW9ucyBoYWQgcmVzb2x2ZWQuIFRoaXMgY2FsbCBydW5zIHRoZSBjaGVjawogICAgICAgICAgICAgICAgICAgIC8vIHRvIHNlZSBpZiBhbnkgbW9kdWxlcyB0aGF0IGFyZSBpbiB0aGUgcXVldWUgY2FuIGJlIGRlcXVldWVkIGFuZCBhZGQgc2NvcGUgdG8KICAgICAgICAgICAgICAgICAgICAvLyB0aGVpciBkZWNsYXJhdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgZmx1c2hNb2R1bGVTY29waW5nUXVldWVBc011Y2hBc1Bvc3NpYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgY29tcG9uZW50IGNvbXBpbGF0aW9uIGlzIGFzeW5jLCB0aGVuIHRoZSBATmdNb2R1bGUgYW5ub3RhdGlvbiB3aGljaCBkZWNsYXJlcyB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgbWF5IGV4ZWN1dGUgYW5kIHNldCBhbiBuZ1NlbGVjdG9yU2NvcGUgcHJvcGVydHkgb24gdGhlIGNvbXBvbmVudCB0eXBlLiBUaGlzCiAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3dzIHRoZSBjb21wb25lbnQgdG8gcGF0Y2ggaXRzZWxmIHdpdGggZGlyZWN0aXZlRGVmcyBmcm9tIHRoZSBtb2R1bGUgYWZ0ZXIgaXQKICAgICAgICAgICAgICAgICAgICAvLyBmaW5pc2hlcyBjb21waWxpbmcuCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1NlbGVjdG9yU2NvcGUodHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZXMgPSB0cmFuc2l0aXZlU2NvcGVzRm9yKHR5cGUubmdTZWxlY3RvclNjb3BlKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hDb21wb25lbnREZWZXaXRoU2NvcGUobmdDb21wb25lbnREZWYsIHNjb3Blcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5nQ29tcG9uZW50RGVmOwogICAgICAgICAgICB9KSwKICAgICAgICAgICAgLy8gTWFrZSB0aGUgcHJvcGVydHkgY29uZmlndXJhYmxlIGluIGRldiBtb2RlIHRvIGFsbG93IG92ZXJyaWRpbmcgaW4gdGVzdHMKICAgICAgICAgICAgY29uZmlndXJhYmxlOiAhIW5nRGV2TW9kZSwKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBoYXNTZWxlY3RvclNjb3BlKGNvbXBvbmVudCkgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudCkpKS5uZ1NlbGVjdG9yU2NvcGUgIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIC8qKgogICAgICogQ29tcGlsZSBhbiBBbmd1bGFyIGRpcmVjdGl2ZSBhY2NvcmRpbmcgdG8gaXRzIGRlY29yYXRvciBtZXRhZGF0YSwgYW5kIHBhdGNoIHRoZSByZXN1bHRpbmcKICAgICAqIGRpcmVjdGl2ZSBkZWYgb250byB0aGUgY29tcG9uZW50IHR5cGUuCiAgICAgKgogICAgICogSW4gdGhlIGV2ZW50IHRoYXQgY29tcGlsYXRpb24gaXMgbm90IGltbWVkaWF0ZSwgYGNvbXBpbGVEaXJlY3RpdmVgIHdpbGwgcmV0dXJuIGEgYFByb21pc2VgIHdoaWNoCiAgICAgKiB3aWxsIHJlc29sdmUgd2hlbiBjb21waWxhdGlvbiBjb21wbGV0ZXMgYW5kIHRoZSBkaXJlY3RpdmUgYmVjb21lcyB1c2FibGUuCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gZGlyZWN0aXZlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb21waWxlRGlyZWN0aXZlKHR5cGUsIGRpcmVjdGl2ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbmdEaXJlY3RpdmVEZWYgPSBudWxsOwogICAgICAgIGFkZERpcmVjdGl2ZUZhY3RvcnlEZWYodHlwZSwgZGlyZWN0aXZlIHx8IHt9KTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRElSX0RFRiwgewogICAgICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChuZ0RpcmVjdGl2ZURlZiA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIGBkaXJlY3RpdmVgIGNhbiBiZSBudWxsIGluIHRoZSBjYXNlIG9mIGFic3RyYWN0IGRpcmVjdGl2ZXMgYXMgYSBiYXNlIGNsYXNzCiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCB1c2UgYEBEaXJlY3RpdmUoKWAgd2l0aCBubyBzZWxlY3Rvci4gSW4gdGhhdCBjYXNlLCBwYXNzIGVtcHR5IG9iamVjdCB0byB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBgZGlyZWN0aXZlTWV0YWRhdGFgIGZ1bmN0aW9uIGluc3RlYWQgb2YgbnVsbC4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YSA9IGdldERpcmVjdGl2ZU1ldGFkYXRhKHR5cGUsIGRpcmVjdGl2ZSB8fCB7fSk7CiAgICAgICAgICAgICAgICAgICAgbmdEaXJlY3RpdmVEZWYgPQogICAgICAgICAgICAgICAgICAgICAgICBnZXRDb21waWxlckZhY2FkZSgpLmNvbXBpbGVEaXJlY3RpdmUoYW5ndWxhckNvcmVFbnYsIG1ldGEuc291cmNlTWFwVXJsLCBtZXRhLm1ldGFkYXRhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZ0RpcmVjdGl2ZURlZjsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGlyZWN0aXZlTWV0YWRhdGEodHlwZSwgbWV0YWRhdGEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmFtZSA9IHR5cGUgJiYgdHlwZS5uYW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzb3VyY2VNYXBVcmwgPSBgbmc6Ly8vJHtuYW1lfS/JtWRpci5qc2A7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmFjYWRlID0gZGlyZWN0aXZlTWV0YWRhdGEoKC8qKiBAdHlwZSB7P30gKi8gKHR5cGUpKSwgbWV0YWRhdGEpOwogICAgICAgIGZhY2FkZS50eXBlU291cmNlU3BhbiA9IGNvbXBpbGVyLmNyZWF0ZVBhcnNlU291cmNlU3BhbignRGlyZWN0aXZlJywgbmFtZSwgc291cmNlTWFwVXJsKTsKICAgICAgICBpZiAoZmFjYWRlLnVzZXNJbmhlcml0YW5jZSkgewogICAgICAgICAgICBhZGREaXJlY3RpdmVEZWZUb1VuZGVjb3JhdGVkUGFyZW50cyh0eXBlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgbWV0YWRhdGE6IGZhY2FkZSwgc291cmNlTWFwVXJsIH07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYWRkRGlyZWN0aXZlRmFjdG9yeURlZih0eXBlLCBtZXRhZGF0YSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbmdGYWN0b3J5RGVmID0gbnVsbDsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRkFDVE9SWV9ERUYsIHsKICAgICAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobmdGYWN0b3J5RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGEgPSBnZXREaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBtZXRhZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBpbGVyID0gZ2V0Q29tcGlsZXJGYWNhZGUoKTsKICAgICAgICAgICAgICAgICAgICBuZ0ZhY3RvcnlEZWYgPSBjb21waWxlci5jb21waWxlRmFjdG9yeShhbmd1bGFyQ29yZUVudiwgYG5nOi8vLyR7dHlwZS5uYW1lfS/JtWZhYy5qc2AsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbWV0YS5tZXRhZGF0YSksIHsgaW5qZWN0Rm46ICdkaXJlY3RpdmVJbmplY3QnLCB0YXJnZXQ6IGNvbXBpbGVyLlIzRmFjdG9yeVRhcmdldC5EaXJlY3RpdmUgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5nRmFjdG9yeURlZjsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXh0ZW5kc0RpcmVjdGx5RnJvbU9iamVjdCh0eXBlKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZih0eXBlLnByb3RvdHlwZSkgPT09IE9iamVjdC5wcm90b3R5cGU7CiAgICB9CiAgICAvKioKICAgICAqIEV4dHJhY3QgdGhlIGBSM0RpcmVjdGl2ZU1ldGFkYXRhYCBmb3IgYSBwYXJ0aWN1bGFyIGRpcmVjdGl2ZSAoZWl0aGVyIGEgYERpcmVjdGl2ZWAgb3IgYQogICAgICogYENvbXBvbmVudGApLgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBkaXJlY3RpdmVNZXRhZGF0YSh0eXBlLCBtZXRhZGF0YSkgewogICAgICAgIC8vIFJlZmxlY3QgaW5wdXRzIGFuZCBvdXRwdXRzLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWZsZWN0ID0gZ2V0UmVmbGVjdCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm9wTWV0YWRhdGEgPSByZWZsZWN0Lm93blByb3BNZXRhZGF0YSh0eXBlKTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBuYW1lOiB0eXBlLm5hbWUsCiAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLAogICAgICAgICAgICBzZWxlY3RvcjogbWV0YWRhdGEuc2VsZWN0b3IgIT09IHVuZGVmaW5lZCA/IG1ldGFkYXRhLnNlbGVjdG9yIDogbnVsbCwKICAgICAgICAgICAgZGVwczogcmVmbGVjdERlcGVuZGVuY2llcyh0eXBlKSwKICAgICAgICAgICAgaG9zdDogbWV0YWRhdGEuaG9zdCB8fCBFTVBUWV9PQkosCiAgICAgICAgICAgIHByb3BNZXRhZGF0YTogcHJvcE1ldGFkYXRhLAogICAgICAgICAgICBpbnB1dHM6IG1ldGFkYXRhLmlucHV0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICAgICAgb3V0cHV0czogbWV0YWRhdGEub3V0cHV0cyB8fCBFTVBUWV9BUlJBWSwKICAgICAgICAgICAgcXVlcmllczogZXh0cmFjdFF1ZXJpZXNNZXRhZGF0YSh0eXBlLCBwcm9wTWV0YWRhdGEsIGlzQ29udGVudFF1ZXJ5KSwKICAgICAgICAgICAgbGlmZWN5Y2xlOiB7IHVzZXNPbkNoYW5nZXM6IHJlZmxlY3QuaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCAnbmdPbkNoYW5nZXMnKSB9LAogICAgICAgICAgICB0eXBlU291cmNlU3BhbjogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgdXNlc0luaGVyaXRhbmNlOiAhZXh0ZW5kc0RpcmVjdGx5RnJvbU9iamVjdCh0eXBlKSwKICAgICAgICAgICAgZXhwb3J0QXM6IGV4dHJhY3RFeHBvcnRBcyhtZXRhZGF0YS5leHBvcnRBcyksCiAgICAgICAgICAgIHByb3ZpZGVyczogbWV0YWRhdGEucHJvdmlkZXJzIHx8IG51bGwsCiAgICAgICAgICAgIHZpZXdRdWVyaWVzOiBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNWaWV3UXVlcnkpCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQWRkcyBhIGRpcmVjdGl2ZSBkZWZpbml0aW9uIHRvIGFsbCBwYXJlbnQgY2xhc3NlcyBvZiBhIHR5cGUgdGhhdCBkb24ndCBoYXZlIGFuIEFuZ3VsYXIgZGVjb3JhdG9yLgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGREaXJlY3RpdmVEZWZUb1VuZGVjb3JhdGVkUGFyZW50cyh0eXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9ialByb3RvdHlwZSA9IE9iamVjdC5wcm90b3R5cGU7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBwYXJlbnQgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YodHlwZS5wcm90b3R5cGUpLmNvbnN0cnVjdG9yOwogICAgICAgIC8vIEdvIHVwIHRoZSBwcm90b3R5cGUgdW50aWwgd2UgaGl0IGBPYmplY3RgLgogICAgICAgIHdoaWxlIChwYXJlbnQgJiYgcGFyZW50ICE9PSBvYmpQcm90b3R5cGUpIHsKICAgICAgICAgICAgLy8gU2luY2UgaW5oZXJpdGFuY2Ugd29ya3MgaWYgdGhlIGNsYXNzIHdhcyBhbm5vdGF0ZWQgYWxyZWFkeSwgd2Ugb25seSBuZWVkIHRvIGFkZAogICAgICAgICAgICAvLyB0aGUgZGVmIGlmIHRoZXJlIGFyZSBubyBhbm5vdGF0aW9ucyBhbmQgdGhlIGRlZiBoYXNuJ3QgYmVlbiBjcmVhdGVkIGFscmVhZHkuCiAgICAgICAgICAgIGlmICghZ2V0RGlyZWN0aXZlRGVmKHBhcmVudCkgJiYgIWdldENvbXBvbmVudERlZihwYXJlbnQpICYmCiAgICAgICAgICAgICAgICBzaG91bGRBZGRBYnN0cmFjdERpcmVjdGl2ZShwYXJlbnQpKSB7CiAgICAgICAgICAgICAgICBjb21waWxlRGlyZWN0aXZlKHBhcmVudCwgbnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyZW50ID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHBhcmVudCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb252ZXJ0VG9SM1F1ZXJ5UHJlZGljYXRlKHNlbGVjdG9yKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gJ3N0cmluZycgPyBzcGxpdEJ5Q29tbWEoc2VsZWN0b3IpIDogcmVzb2x2ZUZvcndhcmRSZWYoc2VsZWN0b3IpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZQogICAgICogQHBhcmFtIHs/fSBhbm4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnZlcnRUb1IzUXVlcnlNZXRhZGF0YShwcm9wZXJ0eU5hbWUsIGFubikgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHByb3BlcnR5TmFtZTogcHJvcGVydHlOYW1lLAogICAgICAgICAgICBwcmVkaWNhdGU6IGNvbnZlcnRUb1IzUXVlcnlQcmVkaWNhdGUoYW5uLnNlbGVjdG9yKSwKICAgICAgICAgICAgZGVzY2VuZGFudHM6IGFubi5kZXNjZW5kYW50cywKICAgICAgICAgICAgZmlyc3Q6IGFubi5maXJzdCwKICAgICAgICAgICAgcmVhZDogYW5uLnJlYWQgPyBhbm4ucmVhZCA6IG51bGwsCiAgICAgICAgICAgIHN0YXRpYzogISFhbm4uc3RhdGljCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IHByb3BNZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBpc1F1ZXJ5QW5uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBleHRyYWN0UXVlcmllc01ldGFkYXRhKHR5cGUsIHByb3BNZXRhZGF0YSwgaXNRdWVyeUFubikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBxdWVyaWVzTWV0YSA9IFtdOwogICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gcHJvcE1ldGFkYXRhKSB7CiAgICAgICAgICAgIGlmIChwcm9wTWV0YWRhdGEuaGFzT3duUHJvcGVydHkoZmllbGQpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhbm5vdGF0aW9ucyA9IHByb3BNZXRhZGF0YVtmaWVsZF07CiAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYW5uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBhbm4gPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJ5QW5uKGFubikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhbm4uc2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3QgY29uc3RydWN0IGEgcXVlcnkgZm9yIHRoZSBwcm9wZXJ0eSAiJHtmaWVsZH0iIG9mIGAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGAiJHtzdHJpbmdpZnlGb3JFcnJvcih0eXBlKX0iIHNpbmNlIHRoZSBxdWVyeSBzZWxlY3RvciB3YXNuJ3QgZGVmaW5lZC5gKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoYW5ub3RhdGlvbnMuc29tZShpc0lucHV0QW5ub3RhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbWJpbmUgQElucHV0IGRlY29yYXRvcnMgd2l0aCBxdWVyeSBkZWNvcmF0b3JzYCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcXVlcmllc01ldGEucHVzaChjb252ZXJ0VG9SM1F1ZXJ5TWV0YWRhdGEoZmllbGQsIGFubikpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gcXVlcmllc01ldGE7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXhwb3J0QXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4dHJhY3RFeHBvcnRBcyhleHBvcnRBcykgewogICAgICAgIHJldHVybiBleHBvcnRBcyA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHNwbGl0QnlDb21tYShleHBvcnRBcyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQ29udGVudFF1ZXJ5KHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTsKICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ0NvbnRlbnRDaGlsZCcgfHwgbmFtZSA9PT0gJ0NvbnRlbnRDaGlsZHJlbic7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzVmlld1F1ZXJ5KHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5hbWUgPSB2YWx1ZS5uZ01ldGFkYXRhTmFtZTsKICAgICAgICByZXR1cm4gbmFtZSA9PT0gJ1ZpZXdDaGlsZCcgfHwgbmFtZSA9PT0gJ1ZpZXdDaGlsZHJlbic7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzSW5wdXRBbm5vdGF0aW9uKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlLm5nTWV0YWRhdGFOYW1lID09PSAnSW5wdXQnOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzcGxpdEJ5Q29tbWEodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUuc3BsaXQoJywnKS5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGllY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBpZWNlID0+IHBpZWNlLnRyaW0oKSkpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTElGRUNZQ0xFX0hPT0tTID0gWwogICAgICAgICduZ09uQ2hhbmdlcycsICduZ09uSW5pdCcsICduZ09uRGVzdHJveScsICduZ0RvQ2hlY2snLCAnbmdBZnRlclZpZXdJbml0JywgJ25nQWZ0ZXJWaWV3Q2hlY2tlZCcsCiAgICAgICAgJ25nQWZ0ZXJDb250ZW50SW5pdCcsICduZ0FmdGVyQ29udGVudENoZWNrZWQnCiAgICBdOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNob3VsZEFkZEFic3RyYWN0RGlyZWN0aXZlKHR5cGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVmbGVjdCA9IGdldFJlZmxlY3QoKTsKICAgICAgICBpZiAoTElGRUNZQ0xFX0hPT0tTLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaG9va05hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhvb2tOYW1lID0+IHJlZmxlY3QuaGFzTGlmZWN5Y2xlSG9vayh0eXBlLCBob29rTmFtZSkpKSkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByb3BNZXRhZGF0YSA9IHJlZmxlY3QucHJvcE1ldGFkYXRhKHR5cGUpOwogICAgICAgIGZvciAoY29uc3QgZmllbGQgaW4gcHJvcE1ldGFkYXRhKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbnMgPSBwcm9wTWV0YWRhdGFbZmllbGRdOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFubm90YXRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50ID0gYW5ub3RhdGlvbnNbaV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YU5hbWUgPSBjdXJyZW50Lm5nTWV0YWRhdGFOYW1lOwogICAgICAgICAgICAgICAgaWYgKGlzSW5wdXRBbm5vdGF0aW9uKGN1cnJlbnQpIHx8IGlzQ29udGVudFF1ZXJ5KGN1cnJlbnQpIHx8IGlzVmlld1F1ZXJ5KGN1cnJlbnQpIHx8CiAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFOYW1lID09PSAnT3V0cHV0JyB8fCBtZXRhZGF0YU5hbWUgPT09ICdIb3N0QmluZGluZycgfHwKICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YU5hbWUgPT09ICdIb3N0TGlzdGVuZXInKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvcmVuZGVyMy9qaXQvcGlwZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb21waWxlUGlwZSh0eXBlLCBtZXRhKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBuZ1BpcGVEZWYgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbmdGYWN0b3J5RGVmID0gbnVsbDsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodHlwZSwgTkdfRkFDVE9SWV9ERUYsIHsKICAgICAgICAgICAgZ2V0OiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobmdGYWN0b3J5RGVmID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhID0gZ2V0UGlwZU1ldGFkYXRhKHR5cGUsIG1ldGEpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb21waWxlciA9IGdldENvbXBpbGVyRmFjYWRlKCk7CiAgICAgICAgICAgICAgICAgICAgbmdGYWN0b3J5RGVmID0gY29tcGlsZXIuY29tcGlsZUZhY3RvcnkoYW5ndWxhckNvcmVFbnYsIGBuZzovLy8ke21ldGFkYXRhLm5hbWV9L8m1ZmFjLmpzYCwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtZXRhZGF0YSksIHsgaW5qZWN0Rm46ICdkaXJlY3RpdmVJbmplY3QnLCB0YXJnZXQ6IGNvbXBpbGVyLlIzRmFjdG9yeVRhcmdldC5QaXBlIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuZ0ZhY3RvcnlEZWY7CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICAvLyBNYWtlIHRoZSBwcm9wZXJ0eSBjb25maWd1cmFibGUgaW4gZGV2IG1vZGUgdG8gYWxsb3cgb3ZlcnJpZGluZyBpbiB0ZXN0cwogICAgICAgICAgICBjb25maWd1cmFibGU6ICEhbmdEZXZNb2RlLAogICAgICAgIH0pOwogICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0eXBlLCBOR19QSVBFX0RFRiwgewogICAgICAgICAgICBnZXQ6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChuZ1BpcGVEZWYgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBnZXRQaXBlTWV0YWRhdGEodHlwZSwgbWV0YSk7CiAgICAgICAgICAgICAgICAgICAgbmdQaXBlRGVmID0gZ2V0Q29tcGlsZXJGYWNhZGUoKS5jb21waWxlUGlwZShhbmd1bGFyQ29yZUVudiwgYG5nOi8vLyR7bWV0YWRhdGEubmFtZX0vybVwaXBlLmpzYCwgbWV0YWRhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG5nUGlwZURlZjsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIC8vIE1ha2UgdGhlIHByb3BlcnR5IGNvbmZpZ3VyYWJsZSBpbiBkZXYgbW9kZSB0byBhbGxvdyBvdmVycmlkaW5nIGluIHRlc3RzCiAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogISFuZ0Rldk1vZGUsCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQaXBlTWV0YWRhdGEodHlwZSwgbWV0YSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6IHR5cGUsCiAgICAgICAgICAgIHR5cGVBcmd1bWVudENvdW50OiAwLAogICAgICAgICAgICBuYW1lOiB0eXBlLm5hbWUsCiAgICAgICAgICAgIGRlcHM6IHJlZmxlY3REZXBlbmRlbmNpZXModHlwZSksCiAgICAgICAgICAgIHBpcGVOYW1lOiBtZXRhLm5hbWUsCiAgICAgICAgICAgIHB1cmU6IG1ldGEucHVyZSAhPT0gdW5kZWZpbmVkID8gbWV0YS5wdXJlIDogdHJ1ZQogICAgICAgIH07CiAgICB9CiAgICAvLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CiAgICBjb25zdCDJtTAkZSA9IC8qKgogICAgICogQHBhcmFtIHs/PX0gZGlyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZGlyID0ge30pID0+IGRpciwgybUxJDMgPSAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAodHlwZSwgbWV0YSkgPT4gU1dJVENIX0NPTVBJTEVfRElSRUNUSVZFKHR5cGUsIG1ldGEpOwogICAgLyoqCiAgICAgKiBUeXBlIG9mIHRoZSBEaXJlY3RpdmUgbWV0YWRhdGEuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBEaXJlY3RpdmUgPSBtYWtlRGVjb3JhdG9yKCdEaXJlY3RpdmUnLCAoybUwJGUpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgKMm1MSQzKSk7CiAgICAvLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CiAgICBjb25zdCDJtTIkMSA9IC8qKgogICAgICogQHBhcmFtIHs/PX0gYwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGMgPSB7fSkgPT4gKE9iamVjdC5hc3NpZ24oeyBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LkRlZmF1bHQgfSwgYykpLCDJtTMkMSA9IC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IG1ldGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICh0eXBlLCBtZXRhKSA9PiBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlQodHlwZSwgbWV0YSk7CiAgICAvKioKICAgICAqIENvbXBvbmVudCBkZWNvcmF0b3IgYW5kIG1ldGFkYXRhLgogICAgICoKICAgICAqIFxAQW5ub3RhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBDb21wb25lbnQgPSBtYWtlRGVjb3JhdG9yKCdDb21wb25lbnQnLCAoybUyJDEpLCBEaXJlY3RpdmUsIHVuZGVmaW5lZCwgKMm1MyQxKSk7CiAgICAvLyBXQVJOSU5HOiBpbnRlcmZhY2UgaGFzIGJvdGggYSB0eXBlIGFuZCBhIHZhbHVlLCBza2lwcGluZyBlbWl0CiAgICBjb25zdCDJtTQgPSAvKioKICAgICAqIEBwYXJhbSB7P30gcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHApID0+IChPYmplY3QuYXNzaWduKHsgcHVyZTogdHJ1ZSB9LCBwKSksIMm1NSA9IC8qKgogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IG1ldGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICh0eXBlLCBtZXRhKSA9PiBTV0lUQ0hfQ09NUElMRV9QSVBFKHR5cGUsIG1ldGEpOwogICAgLyoqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgUGlwZSA9IG1ha2VEZWNvcmF0b3IoJ1BpcGUnLCAoybU0KSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsICjJtTUpKTsKICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIGNvbnN0IMm1NiA9IC8qKgogICAgICogQHBhcmFtIHs/PX0gYmluZGluZ1Byb3BlcnR5TmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGJpbmRpbmdQcm9wZXJ0eU5hbWUpID0+ICh7IGJpbmRpbmdQcm9wZXJ0eU5hbWUgfSk7CiAgICAvKioKICAgICAqIFxAQW5ub3RhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBJbnB1dCA9IG1ha2VQcm9wRGVjb3JhdG9yKCdJbnB1dCcsICjJtTYpKTsKICAgIC8vIFdBUk5JTkc6IGludGVyZmFjZSBoYXMgYm90aCBhIHR5cGUgYW5kIGEgdmFsdWUsIHNraXBwaW5nIGVtaXQKICAgIGNvbnN0IMm1NyA9IC8qKgogICAgICogQHBhcmFtIHs/PX0gYmluZGluZ1Byb3BlcnR5TmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGJpbmRpbmdQcm9wZXJ0eU5hbWUpID0+ICh7IGJpbmRpbmdQcm9wZXJ0eU5hbWUgfSk7CiAgICAvKioKICAgICAqIFxAQW5ub3RhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBPdXRwdXQgPSBtYWtlUHJvcERlY29yYXRvcignT3V0cHV0JywgKMm1NykpOwogICAgLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAogICAgY29uc3QgybU4ID0gLyoqCiAgICAgKiBAcGFyYW0gez89fSBob3N0UHJvcGVydHlOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoaG9zdFByb3BlcnR5TmFtZSkgPT4gKHsgaG9zdFByb3BlcnR5TmFtZSB9KTsKICAgIC8qKgogICAgICogXEBBbm5vdGF0aW9uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEhvc3RCaW5kaW5nID0gbWFrZVByb3BEZWNvcmF0b3IoJ0hvc3RCaW5kaW5nJywgKMm1OCkpOwogICAgLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAogICAgY29uc3QgybU5ID0gLyoqCiAgICAgKiBAcGFyYW0gez89fSBldmVudE5hbWUKICAgICAqIEBwYXJhbSB7Pz19IGFyZ3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChldmVudE5hbWUsIGFyZ3MpID0+ICh7IGV2ZW50TmFtZSwgYXJncyB9KTsKICAgIC8qKgogICAgICogRGVjb3JhdG9yIHRoYXQgYmluZHMgYSBET00gZXZlbnQgdG8gYSBob3N0IGxpc3RlbmVyIGFuZCBzdXBwbGllcyBjb25maWd1cmF0aW9uIG1ldGFkYXRhLgogICAgICogQW5ndWxhciBpbnZva2VzIHRoZSBzdXBwbGllZCBoYW5kbGVyIG1ldGhvZCB3aGVuIHRoZSBob3N0IGVsZW1lbnQgZW1pdHMgdGhlIHNwZWNpZmllZCBldmVudCwKICAgICAqIGFuZCB1cGRhdGVzIHRoZSBib3VuZCBlbGVtZW50IHdpdGggdGhlIHJlc3VsdC4KICAgICAqCiAgICAgKiBJZiB0aGUgaGFuZGxlciBtZXRob2QgcmV0dXJucyBmYWxzZSwgYXBwbGllcyBgcHJldmVudERlZmF1bHRgIG9uIHRoZSBib3VuZCBlbGVtZW50LgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBkZWNsYXJlcyBhIGRpcmVjdGl2ZQogICAgICogdGhhdCBhdHRhY2hlcyBhIGNsaWNrIGxpc3RlbmVyIHRvIGEgYnV0dG9uIGFuZCBjb3VudHMgY2xpY2tzLgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBcQERpcmVjdGl2ZSh7c2VsZWN0b3I6ICdidXR0b25bY291bnRpbmddJ30pCiAgICAgKiBjbGFzcyBDb3VudENsaWNrcyB7CiAgICAgKiAgIG51bWJlck9mQ2xpY2tzID0gMDsKICAgICAqCiAgICAgKiBcQEhvc3RMaXN0ZW5lcignY2xpY2snLCBbJyRldmVudC50YXJnZXQnXSkKICAgICAqICAgb25DbGljayhidG4pIHsKICAgICAqICAgICBjb25zb2xlLmxvZygnYnV0dG9uJywgYnRuLCAnbnVtYmVyIG9mIGNsaWNrczonLCB0aGlzLm51bWJlck9mQ2xpY2tzKyspOwogICAgICogIH0KICAgICAqIH0KICAgICAqCiAgICAgKiBcQENvbXBvbmVudCh7CiAgICAgKiAgIHNlbGVjdG9yOiAnYXBwJywKICAgICAqICAgdGVtcGxhdGU6ICc8YnV0dG9uIGNvdW50aW5nPkluY3JlbWVudDwvYnV0dG9uPicsCiAgICAgKiB9KQogICAgICogY2xhc3MgQXBwIHt9CiAgICAgKgogICAgICogYGBgCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlZ2lzdGVycyBhbm90aGVyIERPTSBldmVudCBoYW5kbGVyIHRoYXQgbGlzdGVucyBmb3Iga2V5LXByZXNzIGV2ZW50cy4KICAgICAqIGBgYCB0cwogICAgICogaW1wb3J0IHsgSG9zdExpc3RlbmVyLCBDb21wb25lbnQgfSBmcm9tICJcQGFuZ3VsYXIvY29yZSI7CiAgICAgKgogICAgICogXEBDb21wb25lbnQoewogICAgICogICBzZWxlY3RvcjogJ2FwcCcsCiAgICAgKiAgIHRlbXBsYXRlOiBgPGgxPkhlbGxvLCB5b3UgaGF2ZSBwcmVzc2VkIGtleXMge3tjb3VudGVyfX0gbnVtYmVyIG9mIHRpbWVzITwvaDE+IFByZXNzIGFueSBrZXkgdG8KICAgICAqIGluY3JlbWVudCB0aGUgY291bnRlci4KICAgICAqICAgPGJ1dHRvbiAoY2xpY2spPSJyZXNldENvdW50ZXIoKSI+UmVzZXQgQ291bnRlcjwvYnV0dG9uPmAKICAgICAqIH0pCiAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQgewogICAgICogICBjb3VudGVyID0gMDsKICAgICAqIFxASG9zdExpc3RlbmVyKCd3aW5kb3c6a2V5ZG93bicsIFsnJGV2ZW50J10pCiAgICAgKiAgIGhhbmRsZUtleURvd24oZXZlbnQ6IEtleWJvYXJkRXZlbnQpIHsKICAgICAqICAgICB0aGlzLmNvdW50ZXIrKzsKICAgICAqICAgfQogICAgICogICByZXNldENvdW50ZXIoKSB7CiAgICAgKiAgICAgdGhpcy5jb3VudGVyID0gMDsKICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogXEBBbm5vdGF0aW9uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEhvc3RMaXN0ZW5lciA9IG1ha2VQcm9wRGVjb3JhdG9yKCdIb3N0TGlzdGVuZXInLCAoybU5KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfQ09NUElMRV9DT01QT05FTlRfX1BPU1RfUjNfXyA9IGNvbXBpbGVDb21wb25lbnQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfQ09NUElMRV9ESVJFQ1RJVkVfX1BPU1RfUjNfXyA9IGNvbXBpbGVEaXJlY3RpdmU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfQ09NUElMRV9QSVBFX19QT1NUX1IzX18gPSBjb21waWxlUGlwZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNXSVRDSF9DT01QSUxFX0NPTVBPTkVOVCA9IFNXSVRDSF9DT01QSUxFX0NPTVBPTkVOVF9fUE9TVF9SM19fOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1dJVENIX0NPTVBJTEVfRElSRUNUSVZFID0gU1dJVENIX0NPTVBJTEVfRElSRUNUSVZFX19QT1NUX1IzX187CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfQ09NUElMRV9QSVBFID0gU1dJVENIX0NPTVBJTEVfUElQRV9fUE9TVF9SM19fOwogICAgLy8gV0FSTklORzogaW50ZXJmYWNlIGhhcyBib3RoIGEgdHlwZSBhbmQgYSB2YWx1ZSwgc2tpcHBpbmcgZW1pdAogICAgY29uc3QgybUwJGYgPSAvKioKICAgICAqIEBwYXJhbSB7P30gbmdNb2R1bGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChuZ01vZHVsZSkgPT4gbmdNb2R1bGUsIMm1MSQ0ID0gLyoqCiAgICAgKiBEZWNvcmF0b3IgdGhhdCBtYXJrcyB0aGUgZm9sbG93aW5nIGNsYXNzIGFzIGFuIE5nTW9kdWxlLCBhbmQgc3VwcGxpZXMKICAgICAqIGNvbmZpZ3VyYXRpb24gbWV0YWRhdGEgZm9yIGl0LgogICAgICoKICAgICAqICogVGhlIGBkZWNsYXJhdGlvbnNgIGFuZCBgZW50cnlDb21wb25lbnRzYCBvcHRpb25zIGNvbmZpZ3VyZSB0aGUgY29tcGlsZXIKICAgICAqIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBiZWxvbmdzIHRvIHRoZSBOZ01vZHVsZS4KICAgICAqICogVGhlIGBwcm92aWRlcnNgIG9wdGlvbnMgY29uZmlndXJlcyB0aGUgTmdNb2R1bGUncyBpbmplY3RvciB0byBwcm92aWRlCiAgICAgKiBkZXBlbmRlbmNpZXMgdGhlIE5nTW9kdWxlIG1lbWJlcnMuCiAgICAgKiAqIFRoZSBgaW1wb3J0c2AgYW5kIGBleHBvcnRzYCBvcHRpb25zIGJyaW5nIGluIG1lbWJlcnMgZnJvbSBvdGhlciBtb2R1bGVzLCBhbmQgbWFrZQogICAgICogdGhpcyBtb2R1bGUncyBtZW1iZXJzIGF2YWlsYWJsZSB0byBvdGhlcnMuCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gbWV0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHR5cGUsIG1ldGEpID0+IFNXSVRDSF9DT01QSUxFX05HTU9EVUxFKHR5cGUsIG1ldGEpOwogICAgLyoqCiAgICAgKiBcQEFubm90YXRpb24KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTmdNb2R1bGUgPSBtYWtlRGVjb3JhdG9yKCdOZ01vZHVsZScsICjJtTAkZiksIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCAoybUxJDQpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNXSVRDSF9DT01QSUxFX05HTU9EVUxFX19QT1NUX1IzX18gPSBjb21waWxlTmdNb2R1bGU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTV0lUQ0hfQ09NUElMRV9OR01PRFVMRSA9IFNXSVRDSF9DT01QSUxFX05HTU9EVUxFX19QT1NUX1IzX187CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9tZXRhZGF0YS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25faW5pdC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuIGluamVjdGlvbiB0b2tlbiB0aGF0IGFsbG93cyB5b3UgdG8gcHJvdmlkZSBvbmUgb3IgbW9yZSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCiAgICAgKiBUaGVzZSBmdW5jdGlvbiBhcmUgaW5qZWN0ZWQgYXQgYXBwbGljYXRpb24gc3RhcnR1cCBhbmQgZXhlY3V0ZWQgZHVyaW5nCiAgICAgKiBhcHAgaW5pdGlhbGl6YXRpb24uIElmIGFueSBvZiB0aGVzZSBmdW5jdGlvbnMgcmV0dXJucyBhIFByb21pc2UsIGluaXRpYWxpemF0aW9uCiAgICAgKiBkb2VzIG5vdCBjb21wbGV0ZSB1bnRpbCB0aGUgUHJvbWlzZSBpcyByZXNvbHZlZC4KICAgICAqCiAgICAgKiBZb3UgY2FuLCBmb3IgZXhhbXBsZSwgY3JlYXRlIGEgZmFjdG9yeSBmdW5jdGlvbiB0aGF0IGxvYWRzIGxhbmd1YWdlIGRhdGEKICAgICAqIG9yIGFuIGV4dGVybmFsIGNvbmZpZ3VyYXRpb24sIGFuZCBwcm92aWRlIHRoYXQgZnVuY3Rpb24gdG8gdGhlIGBBUFBfSU5JVElBTElaRVJgIHRva2VuLgogICAgICogVGhhdCB3YXksIHRoZSBmdW5jdGlvbiBpcyBleGVjdXRlZCBkdXJpbmcgdGhlIGFwcGxpY2F0aW9uIGJvb3RzdHJhcCBwcm9jZXNzLAogICAgICogYW5kIHRoZSBuZWVkZWQgZGF0YSBpcyBhdmFpbGFibGUgb24gc3RhcnR1cC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEFQUF9JTklUSUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignQXBwbGljYXRpb24gSW5pdGlhbGl6ZXInKTsKICAgIC8qKgogICAgICogQSBjbGFzcyB0aGF0IHJlZmxlY3RzIHRoZSBzdGF0ZSBvZiBydW5uaW5nIHtcQGxpbmsgQVBQX0lOSVRJQUxJWkVSfXMuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgQXBwbGljYXRpb25Jbml0U3RhdHVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFwcEluaXRzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYXBwSW5pdHMpIHsKICAgICAgICAgICAgdGhpcy5hcHBJbml0cyA9IGFwcEluaXRzOwogICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZG9uZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmRvbmVQcm9taXNlID0gbmV3IFByb21pc2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcwogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlagogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlcywgcmVqKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnJlc29sdmUgPSByZXM7CiAgICAgICAgICAgICAgICB0aGlzLnJlamVjdCA9IHJlajsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBydW5Jbml0aWFsaXplcnMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmluaXRpYWxpemVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhc3luY0luaXRQcm9taXNlcyA9IFtdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBsZXRlID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRvbmUgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5yZXNvbHZlKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodGhpcy5hcHBJbml0cykgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmFwcEluaXRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGluaXRSZXN1bHQgPSB0aGlzLmFwcEluaXRzW2ldKCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzUHJvbWlzZSQxKGluaXRSZXN1bHQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFzeW5jSW5pdFByb21pc2VzLnB1c2goaW5pdFJlc3VsdCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIFByb21pc2UuYWxsKGFzeW5jSW5pdFByb21pc2VzKQogICAgICAgICAgICAgICAgLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgY29tcGxldGUoKTsKICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAuY2F0Y2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGUgPT4gewogICAgICAgICAgICAgICAgdGhpcy5yZWplY3QoZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKGFzeW5jSW5pdFByb21pc2VzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBBcHBsaWNhdGlvbkluaXRTdGF0dXMuybVmYWMgPSBmdW5jdGlvbiBBcHBsaWNhdGlvbkluaXRTdGF0dXNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwbGljYXRpb25Jbml0U3RhdHVzKSjJtcm1aW5qZWN0KEFQUF9JTklUSUFMSVpFUiwgOCkpOyB9OwogICAgQXBwbGljYXRpb25Jbml0U3RhdHVzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEFwcGxpY2F0aW9uSW5pdFN0YXR1cywgZmFjdG9yeTogQXBwbGljYXRpb25Jbml0U3RhdHVzLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBcHBsaWNhdGlvbkluaXRTdGF0dXMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0lOSVRJQUxJWkVSLF0gfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvYXBwbGljYXRpb25fdG9rZW5zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQSBESSBUb2tlbiByZXByZXNlbnRpbmcgYSB1bmlxdWUgc3RyaW5nIGlkIGFzc2lnbmVkIHRvIHRoZSBhcHBsaWNhdGlvbiBieSBBbmd1bGFyIGFuZCB1c2VkCiAgICAgKiBwcmltYXJpbHkgZm9yIHByZWZpeGluZyBhcHBsaWNhdGlvbiBhdHRyaWJ1dGVzIGFuZCBDU1Mgc3R5bGVzIHdoZW4KICAgICAqIHtcQGxpbmsgVmlld0VuY2Fwc3VsYXRpb24jRW11bGF0ZWQgVmlld0VuY2Fwc3VsYXRpb24uRW11bGF0ZWR9IGlzIGJlaW5nIHVzZWQuCiAgICAgKgogICAgICogSWYgeW91IG5lZWQgdG8gYXZvaWQgcmFuZG9tbHkgZ2VuZXJhdGVkIHZhbHVlIHRvIGJlIHVzZWQgYXMgYW4gYXBwbGljYXRpb24gaWQsIHlvdSBjYW4gcHJvdmlkZQogICAgICogYSBjdXN0b20gdmFsdWUgdmlhIGEgREkgcHJvdmlkZXIgPCEtLSBUT0RPOiBwcm92aWRlciAtLT4gY29uZmlndXJpbmcgdGhlIHJvb3Qge1xAbGluayBJbmplY3Rvcn0KICAgICAqIHVzaW5nIHRoaXMgdG9rZW4uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEFQUF9JRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignQXBwSWQnKTsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2FwcElkUmFuZG9tUHJvdmlkZXJGYWN0b3J5KCkgewogICAgICAgIHJldHVybiBgJHtfcmFuZG9tQ2hhcigpfSR7X3JhbmRvbUNoYXIoKX0ke19yYW5kb21DaGFyKCl9YDsKICAgIH0KICAgIC8qKgogICAgICogUHJvdmlkZXJzIHRoYXQgd2lsbCBnZW5lcmF0ZSBhIHJhbmRvbSBBUFBfSURfVE9LRU4uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEFQUF9JRF9SQU5ET01fUFJPVklERVIgPSB7CiAgICAgICAgcHJvdmlkZTogQVBQX0lELAogICAgICAgIHVzZUZhY3Rvcnk6IF9hcHBJZFJhbmRvbVByb3ZpZGVyRmFjdG9yeSwKICAgICAgICBkZXBzOiAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKSwKICAgIH07CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9yYW5kb21DaGFyKCkgewogICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKDk3ICsgTWF0aC5mbG9vcihNYXRoLnJhbmRvbSgpICogMjUpKTsKICAgIH0KICAgIC8qKgogICAgICogQSBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbiBhIHBsYXRmb3JtIGlzIGluaXRpYWxpemVkLgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBQTEFURk9STV9JTklUSUFMSVpFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignUGxhdGZvcm0gSW5pdGlhbGl6ZXInKTsKICAgIC8qKgogICAgICogQSB0b2tlbiB0aGF0IGluZGljYXRlcyBhbiBvcGFxdWUgcGxhdGZvcm0gaWQuCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFBMQVRGT1JNX0lEID0gbmV3IEluamVjdGlvblRva2VuKCdQbGF0Zm9ybSBJRCcpOwogICAgLyoqCiAgICAgKiBBbGwgY2FsbGJhY2tzIHByb3ZpZGVkIHZpYSB0aGlzIHRva2VuIHdpbGwgYmUgY2FsbGVkIGZvciBldmVyeSBjb21wb25lbnQgdGhhdCBpcyBib290c3RyYXBwZWQuCiAgICAgKiBTaWduYXR1cmUgb2YgdGhlIGNhbGxiYWNrOgogICAgICoKICAgICAqIGAoY29tcG9uZW50UmVmOiBDb21wb25lbnRSZWYpID0+IHZvaWRgLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQVBQX0JPT1RTVFJBUF9MSVNURU5FUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignYXBwQm9vdHN0cmFwTGlzdGVuZXInKTsKICAgIC8qKgogICAgICogQSB0b2tlbiB3aGljaCBpbmRpY2F0ZXMgdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoZSBhcHBsaWNhdGlvbgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBQQUNLQUdFX1JPT1RfVVJMID0gbmV3IEluamVjdGlvblRva2VuKCdBcHBsaWNhdGlvbiBQYWNrYWdlcyBSb290IFVSTCcpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY29uc29sZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBDb25zb2xlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxvZyhtZXNzYWdlKSB7CiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlCiAgICAgICAgICAgIGNvbnNvbGUubG9nKG1lc3NhZ2UpOwogICAgICAgIH0KICAgICAgICAvLyBOb3RlOiBmb3IgcmVwb3J0aW5nIGVycm9ycyB1c2UgYERPTS5sb2dFcnJvcigpYCBhcyBpdCBpcyBwbGF0Zm9ybSBzcGVjaWZpYwogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd2FybihtZXNzYWdlKSB7CiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1jb25zb2xlCiAgICAgICAgICAgIGNvbnNvbGUud2FybihtZXNzYWdlKTsKICAgICAgICB9CiAgICB9CiAgICBDb25zb2xlLsm1ZmFjID0gZnVuY3Rpb24gQ29uc29sZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDb25zb2xlKSgpOyB9OwogICAgQ29uc29sZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBDb25zb2xlLCBmYWN0b3J5OiBDb25zb2xlLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvaTE4bi90b2tlbnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gdG8gc2V0IHRoZSBsb2NhbGUgb2YgeW91ciBhcHBsaWNhdGlvbi4KICAgICAqIEl0IGlzIHVzZWQgZm9yIGkxOG4gZXh0cmFjdGlvbiwgYnkgaTE4biBwaXBlcyAoRGF0ZVBpcGUsIEkxOG5QbHVyYWxQaXBlLCBDdXJyZW5jeVBpcGUsCiAgICAgKiBEZWNpbWFsUGlwZSBhbmQgUGVyY2VudFBpcGUpIGFuZCBieSBJQ1UgZXhwcmVzc2lvbnMuCiAgICAgKgogICAgICogU2VlIHRoZSBbaTE4biBndWlkZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLWxvY2FsZSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGltcG9ydCB7IExPQ0FMRV9JRCB9IGZyb20gJ1xAYW5ndWxhci9jb3JlJzsKICAgICAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJzsKICAgICAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnOwogICAgICoKICAgICAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAgICAgKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBMT0NBTEVfSUQsIHVzZVZhbHVlOiAnZW4tVVMnIH1dCiAgICAgKiB9KTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTE9DQUxFX0lEJDEgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0xvY2FsZUlkJyk7CiAgICAvKioKICAgICAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBzZXQgdGhlIGRlZmF1bHQgY3VycmVuY3kgY29kZSB5b3VyIGFwcGxpY2F0aW9uIHVzZXMgZm9yCiAgICAgKiBDdXJyZW5jeVBpcGUgd2hlbiB0aGVyZSBpcyBubyBjdXJyZW5jeSBjb2RlIHBhc3NlZCBpbnRvIGl0LiBUaGlzIGlzIG9ubHkgdXNlZCBieQogICAgICogQ3VycmVuY3lQaXBlIGFuZCBoYXMgbm8gcmVsYXRpb24gdG8gbG9jYWxlIGN1cnJlbmN5LiBEZWZhdWx0cyB0byBVU0QgaWYgbm90IGNvbmZpZ3VyZWQuCiAgICAgKgogICAgICogU2VlIHRoZSBbaTE4biBndWlkZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLWxvY2FsZSkgZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogPGRpdiBjbGFzcz0iYWxlcnQgaXMtaGVscGZ1bCI+CiAgICAgKgogICAgICogKipEZXByZWNhdGlvbiBub3RpY2U6KioKICAgICAqCiAgICAgKiBUaGUgZGVmYXVsdCBjdXJyZW5jeSBjb2RlIGlzIGN1cnJlbnRseSBhbHdheXMgYFVTRGAgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZCBmcm9tIHY5LgogICAgICoKICAgICAqICoqSW4gdjEwIHRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IGxvY2FsZS4qKgogICAgICoKICAgICAqIElmIHlvdSBuZWVkIHRoZSBwcmV2aW91cyBiZWhhdmlvciB0aGVuIHNldCBpdCBieSBjcmVhdGluZyBhIGBERUZBVUxUX0NVUlJFTkNZX0NPREVgIHByb3ZpZGVyIGluCiAgICAgKiB5b3VyIGFwcGxpY2F0aW9uIGBOZ01vZHVsZWA6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIHtwcm92aWRlOiBERUZBVUxUX0NVUlJFTkNZX0NPREUsIHVzZVZhbHVlOiAnVVNEJ30KICAgICAqIGBgYAogICAgICoKICAgICAqIDwvZGl2PgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7CiAgICAgKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tICcuL2FwcC9hcHAubW9kdWxlJzsKICAgICAqCiAgICAgKiBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljKCkuYm9vdHN0cmFwTW9kdWxlKEFwcE1vZHVsZSwgewogICAgICogICBwcm92aWRlcnM6IFt7cHJvdmlkZTogREVGQVVMVF9DVVJSRU5DWV9DT0RFLCB1c2VWYWx1ZTogJ0VVUicgfV0KICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBERUZBVUxUX0NVUlJFTkNZX0NPREUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0RlZmF1bHRDdXJyZW5jeUNvZGUnKTsKICAgIC8qKgogICAgICogVXNlIHRoaXMgdG9rZW4gYXQgYm9vdHN0cmFwIHRvIHByb3ZpZGUgdGhlIGNvbnRlbnQgb2YgeW91ciB0cmFuc2xhdGlvbiBmaWxlIChgeHRiYCwKICAgICAqIGB4bGZgIG9yIGB4bGYyYCkgd2hlbiB5b3Ugd2FudCB0byB0cmFuc2xhdGUgeW91ciBhcHBsaWNhdGlvbiBpbiBhbm90aGVyIGxhbmd1YWdlLgogICAgICoKICAgICAqIFNlZSB0aGUgW2kxOG4gZ3VpZGVdKGd1aWRlL2kxOG4jbWVyZ2UpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogIyMjIEV4YW1wbGUKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBpbXBvcnQgeyBUUkFOU0xBVElPTlMgfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAgICAgKiBpbXBvcnQgeyBwbGF0Zm9ybUJyb3dzZXJEeW5hbWljIH0gZnJvbSAnXEBhbmd1bGFyL3BsYXRmb3JtLWJyb3dzZXItZHluYW1pYyc7CiAgICAgKiBpbXBvcnQgeyBBcHBNb2R1bGUgfSBmcm9tICcuL2FwcC9hcHAubW9kdWxlJzsKICAgICAqCiAgICAgKiAvLyBjb250ZW50IG9mIHlvdXIgdHJhbnNsYXRpb24gZmlsZQogICAgICogY29uc3QgdHJhbnNsYXRpb25zID0gJy4uLi4nOwogICAgICoKICAgICAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAgICAgKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBUUkFOU0xBVElPTlMsIHVzZVZhbHVlOiB0cmFuc2xhdGlvbnMgfV0KICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBUUkFOU0xBVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RyYW5zbGF0aW9ucycpOwogICAgLyoqCiAgICAgKiBQcm92aWRlIHRoaXMgdG9rZW4gYXQgYm9vdHN0cmFwIHRvIHNldCB0aGUgZm9ybWF0IG9mIHlvdXIge1xAbGluayBUUkFOU0xBVElPTlN9OiBgeHRiYCwKICAgICAqIGB4bGZgIG9yIGB4bGYyYC4KICAgICAqCiAgICAgKiBTZWUgdGhlIFtpMThuIGd1aWRlXShndWlkZS9pMThuI21lcmdlKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogaW1wb3J0IHsgVFJBTlNMQVRJT05TX0ZPUk1BVCB9IGZyb20gJ1xAYW5ndWxhci9jb3JlJzsKICAgICAqIGltcG9ydCB7IHBsYXRmb3JtQnJvd3NlckR5bmFtaWMgfSBmcm9tICdcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3Nlci1keW5hbWljJzsKICAgICAqIGltcG9ydCB7IEFwcE1vZHVsZSB9IGZyb20gJy4vYXBwL2FwcC5tb2R1bGUnOwogICAgICoKICAgICAqIHBsYXRmb3JtQnJvd3NlckR5bmFtaWMoKS5ib290c3RyYXBNb2R1bGUoQXBwTW9kdWxlLCB7CiAgICAgKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBUUkFOU0xBVElPTlNfRk9STUFULCB1c2VWYWx1ZTogJ3hsZicgfV0KICAgICAqIH0pOwogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBUUkFOU0xBVElPTlNfRk9STUFUID0gbmV3IEluamVjdGlvblRva2VuKCdUcmFuc2xhdGlvbnNGb3JtYXQnKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2l2eV9zd2l0Y2gudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1dJVENIX0lWWV9FTkFCTEVEX19QT1NUX1IzX18gPSB0cnVlOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaXZ5RW5hYmxlZCA9IFNXSVRDSF9JVllfRU5BQkxFRF9fUE9TVF9SM19fOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvbGlua2VyL2NvbXBpbGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ29tYmluYXRpb24gb2YgTmdNb2R1bGVGYWN0b3J5IGFuZCBDb21wb25lbnRGYWN0b3J5cy4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgTW9kdWxlV2l0aENvbXBvbmVudEZhY3RvcmllcyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZ01vZHVsZUZhY3RvcnkKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudEZhY3RvcmllcwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5nTW9kdWxlRmFjdG9yeSwgY29tcG9uZW50RmFjdG9yaWVzKSB7CiAgICAgICAgICAgIHRoaXMubmdNb2R1bGVGYWN0b3J5ID0gbmdNb2R1bGVGYWN0b3J5OwogICAgICAgICAgICB0aGlzLmNvbXBvbmVudEZhY3RvcmllcyA9IGNvbXBvbmVudEZhY3RvcmllczsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fID0gKC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsKICAgICAgICByZXR1cm4gbmV3IE5nTW9kdWxlRmFjdG9yeSQxKG1vZHVsZVR5cGUpOwogICAgfSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDb21waWxlcl9jb21waWxlTW9kdWxlU3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX187CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDb21waWxlcl9jb21waWxlTW9kdWxlQXN5bmNfX1BPU1RfUjNfXyA9ICgvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7CiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShDb21waWxlcl9jb21waWxlTW9kdWxlU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTsKICAgIH0pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFzeW5jX19QT1NUX1IzX187CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDb21waWxlcl9jb21waWxlTW9kdWxlQW5kQWxsQ29tcG9uZW50c1N5bmNfX1BPU1RfUjNfXyA9ICgvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIChtb2R1bGVUeXBlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5nTW9kdWxlRmFjdG9yeSA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVTeW5jX19QT1NUX1IzX18obW9kdWxlVHlwZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1vZHVsZURlZiA9ICgvKiogQHR5cGUgez99ICovIChnZXROZ01vZHVsZURlZihtb2R1bGVUeXBlKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3JpZXMgPSBtYXliZVVud3JhcEZuKG1vZHVsZURlZi5kZWNsYXJhdGlvbnMpCiAgICAgICAgICAgIC5yZWR1Y2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZmFjdG9yaWVzCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWNsYXJhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGZhY3RvcmllcywgZGVjbGFyYXRpb24pID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnREZWYgPSBnZXRDb21wb25lbnREZWYoZGVjbGFyYXRpb24pOwogICAgICAgICAgICBjb21wb25lbnREZWYgJiYgZmFjdG9yaWVzLnB1c2gobmV3IENvbXBvbmVudEZhY3RvcnkkMShjb21wb25lbnREZWYpKTsKICAgICAgICAgICAgcmV0dXJuIGZhY3RvcmllczsKICAgICAgICB9KSwgKC8qKiBAdHlwZSB7P30gKi8gKFtdKSkpOwogICAgICAgIHJldHVybiBuZXcgTW9kdWxlV2l0aENvbXBvbmVudEZhY3RvcmllcyhuZ01vZHVsZUZhY3RvcnksIGNvbXBvbmVudEZhY3Rvcmllcyk7CiAgICB9KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luY19fUE9TVF9SM19fOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luY19fUE9TVF9SM19fID0gKC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gKG1vZHVsZVR5cGUpIHsKICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzU3luY19fUE9TVF9SM19fKG1vZHVsZVR5cGUpKTsKICAgIH0pOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmNfX1BPU1RfUjNfXzsKICAgIC8qKgogICAgICogTG93LWxldmVsIHNlcnZpY2UgZm9yIHJ1bm5pbmcgdGhlIGFuZ3VsYXIgY29tcGlsZXIgZHVyaW5nIHJ1bnRpbWUKICAgICAqIHRvIGNyZWF0ZSB7XEBsaW5rIENvbXBvbmVudEZhY3Rvcnl9cywgd2hpY2gKICAgICAqIGNhbiBsYXRlciBiZSB1c2VkIHRvIGNyZWF0ZSBhbmQgcmVuZGVyIGEgQ29tcG9uZW50IGluc3RhbmNlLgogICAgICoKICAgICAqIEVhY2ggYFxATmdNb2R1bGVgIHByb3ZpZGVzIGFuIG93biBgQ29tcGlsZXJgIHRvIGl0cyBpbmplY3RvciwKICAgICAqIHRoYXQgd2lsbCB1c2UgdGhlIGRpcmVjdGl2ZXMvcGlwZXMgb2YgdGhlIG5nIG1vZHVsZSBmb3IgY29tcGlsYXRpb24KICAgICAqIG9mIGNvbXBvbmVudHMuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgQ29tcGlsZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29tcGlsZXMgdGhlIGdpdmVuIE5nTW9kdWxlIGFuZCBhbGwgb2YgaXRzIGNvbXBvbmVudHMuIEFsbCB0ZW1wbGF0ZXMgb2YgdGhlIGNvbXBvbmVudHMgbGlzdGVkCiAgICAgICAgICAgICAqIGluIGBlbnRyeUNvbXBvbmVudHNgIGhhdmUgdG8gYmUgaW5saW5lZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZVN5bmMgPSBDb21waWxlcl9jb21waWxlTW9kdWxlU3luYzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbXBpbGVzIHRoZSBnaXZlbiBOZ01vZHVsZSBhbmQgYWxsIG9mIGl0cyBjb21wb25lbnRzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNvbXBpbGVNb2R1bGVBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBc3luYzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFNhbWUgYXMge1xAbGluayAjY29tcGlsZU1vZHVsZVN5bmN9IGJ1dCBhbHNvIGNyZWF0ZXMgQ29tcG9uZW50RmFjdG9yaWVzIGZvciBhbGwgY29tcG9uZW50cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jID0gQ29tcGlsZXJfY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNTeW5jOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU2FtZSBhcyB7XEBsaW5rICNjb21waWxlTW9kdWxlQXN5bmN9IGJ1dCBhbHNvIGNyZWF0ZXMgQ29tcG9uZW50RmFjdG9yaWVzIGZvciBhbGwgY29tcG9uZW50cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29tcGlsZU1vZHVsZUFuZEFsbENvbXBvbmVudHNBc3luYyA9IENvbXBpbGVyX2NvbXBpbGVNb2R1bGVBbmRBbGxDb21wb25lbnRzQXN5bmM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyBhbGwgY2FjaGVzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xlYXJDYWNoZSgpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgY2FjaGUgZm9yIHRoZSBnaXZlbiBjb21wb25lbnQvbmdNb2R1bGUuCiAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbGVhckNhY2hlRm9yKHR5cGUpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGlkIGZvciBhIGdpdmVuIE5nTW9kdWxlLCBpZiBvbmUgaXMgZGVmaW5lZCBhbmQga25vd24gdG8gdGhlIGNvbXBpbGVyLgogICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlVHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TW9kdWxlSWQobW9kdWxlVHlwZSkgewogICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkOwogICAgICAgIH0KICAgIH0KICAgIENvbXBpbGVyLsm1ZmFjID0gZnVuY3Rpb24gQ29tcGlsZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29tcGlsZXIpKCk7IH07CiAgICBDb21waWxlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBDb21waWxlciwgZmFjdG9yeTogQ29tcGlsZXIuybVmYWMgfSk7CiAgICAvKioKICAgICAqIFRva2VuIHRvIHByb3ZpZGUgQ29tcGlsZXJPcHRpb25zIGluIHRoZSBwbGF0Zm9ybSBpbmplY3Rvci4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENPTVBJTEVSX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2NvbXBpbGVyT3B0aW9ucycpOwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIGNvbnN0IHByb21pc2UgPSAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKDApKSgpOwogICAgZnVuY3Rpb24gc2NoZWR1bGVNaWNyb1Rhc2soZm4pIHsKICAgICAgICBpZiAodHlwZW9mIFpvbmUgPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgIC8vIHVzZSBwcm9taXNlIHRvIHNjaGVkdWxlIG1pY3JvVGFzayBpbnN0ZWFkIG9mIHVzZSBab25lCiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7CiAgICAgICAgICAgICAgICBmbiAmJiBmbi5hcHBseShudWxsLCBudWxsKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBab25lLmN1cnJlbnQuc2NoZWR1bGVNaWNyb1Rhc2soJ3NjaGVkdWxlTWljcm90YXNrJywgZm4pOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICBmdW5jdGlvbiBnZXROYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKSB7CiAgICAgICAgbGV0IG5hdGl2ZVJlcXVlc3RBbmltYXRpb25GcmFtZSA9IF9nbG9iYWxbJ3JlcXVlc3RBbmltYXRpb25GcmFtZSddOwogICAgICAgIGxldCBuYXRpdmVDYW5jZWxBbmltYXRpb25GcmFtZSA9IF9nbG9iYWxbJ2NhbmNlbEFuaW1hdGlvbkZyYW1lJ107CiAgICAgICAgaWYgKHR5cGVvZiBab25lICE9PSAndW5kZWZpbmVkJyAmJiBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgJiYgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUpIHsKICAgICAgICAgICAgLy8gdXNlIHVucGF0Y2hlZCB2ZXJzaW9uIG9mIHJlcXVlc3RBbmltYXRpb25GcmFtZShuYXRpdmUgZGVsZWdhdGUpIGlmIHBvc3NpYmxlCiAgICAgICAgICAgIC8vIHRvIGF2b2lkIGFub3RoZXIgQ2hhbmdlIGRldGVjdGlvbgogICAgICAgICAgICBjb25zdCB1bnBhdGNoZWRSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWVbWm9uZS5fX3N5bWJvbF9fKCdPcmlnaW5hbERlbGVnYXRlJyldOwogICAgICAgICAgICBpZiAodW5wYXRjaGVkUmVxdWVzdEFuaW1hdGlvbkZyYW1lKSB7CiAgICAgICAgICAgICAgICBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPSB1bnBhdGNoZWRSZXF1ZXN0QW5pbWF0aW9uRnJhbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgdW5wYXRjaGVkQ2FuY2VsQW5pbWF0aW9uRnJhbWUgPSBuYXRpdmVDYW5jZWxBbmltYXRpb25GcmFtZVtab25lLl9fc3ltYm9sX18oJ09yaWdpbmFsRGVsZWdhdGUnKV07CiAgICAgICAgICAgIGlmICh1bnBhdGNoZWRDYW5jZWxBbmltYXRpb25GcmFtZSkgewogICAgICAgICAgICAgICAgbmF0aXZlQ2FuY2VsQW5pbWF0aW9uRnJhbWUgPSB1bnBhdGNoZWRDYW5jZWxBbmltYXRpb25GcmFtZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4geyBuYXRpdmVSZXF1ZXN0QW5pbWF0aW9uRnJhbWUsIG5hdGl2ZUNhbmNlbEFuaW1hdGlvbkZyYW1lIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy96b25lL25nX3pvbmUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBbiBpbmplY3RhYmxlIHNlcnZpY2UgZm9yIGV4ZWN1dGluZyB3b3JrIGluc2lkZSBvciBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUuCiAgICAgKgogICAgICogVGhlIG1vc3QgY29tbW9uIHVzZSBvZiB0aGlzIHNlcnZpY2UgaXMgdG8gb3B0aW1pemUgcGVyZm9ybWFuY2Ugd2hlbiBzdGFydGluZyBhIHdvcmsgY29uc2lzdGluZyBvZgogICAgICogb25lIG9yIG1vcmUgYXN5bmNocm9ub3VzIHRhc2tzIHRoYXQgZG9uJ3QgcmVxdWlyZSBVSSB1cGRhdGVzIG9yIGVycm9yIGhhbmRsaW5nIHRvIGJlIGhhbmRsZWQgYnkKICAgICAqIEFuZ3VsYXIuIFN1Y2ggdGFza3MgY2FuIGJlIGtpY2tlZCBvZmYgdmlhIHtcQGxpbmsgI3J1bk91dHNpZGVBbmd1bGFyfSBhbmQgaWYgbmVlZGVkLCB0aGVzZSB0YXNrcwogICAgICogY2FuIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSB2aWEge1xAbGluayAjcnVufS4KICAgICAqCiAgICAgKiA8IS0tIFRPRE86IGFkZC9maXggbGlua3MgdG86CiAgICAgKiAgIC0gZG9jcyBleHBsYWluaW5nIHpvbmVzIGFuZCB0aGUgdXNlIG9mIHpvbmVzIGluIEFuZ3VsYXIgYW5kIGNoYW5nZS1kZXRlY3Rpb24KICAgICAqICAgLSBsaW5rIHRvIHJ1bk91dHNpZGVBbmd1bGFyL3J1biAodGhyb3VnaG91dCB0aGlzIGZpbGUhKQogICAgICogICAtLT4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICogYGBgCiAgICAgKiBpbXBvcnQge0NvbXBvbmVudCwgTmdab25lfSBmcm9tICdcQGFuZ3VsYXIvY29yZSc7CiAgICAgKiBpbXBvcnQge05nSWZ9IGZyb20gJ1xAYW5ndWxhci9jb21tb24nOwogICAgICoKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgc2VsZWN0b3I6ICduZy16b25lLWRlbW8nLAogICAgICogICB0ZW1wbGF0ZTogYAogICAgICogICAgIDxoMj5EZW1vOiBOZ1pvbmU8L2gyPgogICAgICoKICAgICAqICAgICA8cD5Qcm9ncmVzczoge3twcm9ncmVzc319JTwvcD4KICAgICAqICAgICA8cCAqbmdJZj0icHJvZ3Jlc3MgPj0gMTAwIj5Eb25lIHByb2Nlc3Npbmcge3tsYWJlbH19IG9mIEFuZ3VsYXIgem9uZSE8L3A+CiAgICAgKgogICAgICogICAgIDxidXR0b24gKGNsaWNrKT0icHJvY2Vzc1dpdGhpbkFuZ3VsYXJab25lKCkiPlByb2Nlc3Mgd2l0aGluIEFuZ3VsYXIgem9uZTwvYnV0dG9uPgogICAgICogICAgIDxidXR0b24gKGNsaWNrKT0icHJvY2Vzc091dHNpZGVPZkFuZ3VsYXJab25lKCkiPlByb2Nlc3Mgb3V0c2lkZSBvZiBBbmd1bGFyIHpvbmU8L2J1dHRvbj4KICAgICAqICAgYCwKICAgICAqIH0pCiAgICAgKiBleHBvcnQgY2xhc3MgTmdab25lRGVtbyB7CiAgICAgKiAgIHByb2dyZXNzOiBudW1iZXIgPSAwOwogICAgICogICBsYWJlbDogc3RyaW5nOwogICAgICoKICAgICAqICAgY29uc3RydWN0b3IocHJpdmF0ZSBfbmdab25lOiBOZ1pvbmUpIHt9CiAgICAgKgogICAgICogICAvLyBMb29wIGluc2lkZSB0aGUgQW5ndWxhciB6b25lCiAgICAgKiAgIC8vIHNvIHRoZSBVSSBET0VTIHJlZnJlc2ggYWZ0ZXIgZWFjaCBzZXRUaW1lb3V0IGN5Y2xlCiAgICAgKiAgIHByb2Nlc3NXaXRoaW5Bbmd1bGFyWm9uZSgpIHsKICAgICAqICAgICB0aGlzLmxhYmVsID0gJ2luc2lkZSc7CiAgICAgKiAgICAgdGhpcy5wcm9ncmVzcyA9IDA7CiAgICAgKiAgICAgdGhpcy5faW5jcmVhc2VQcm9ncmVzcygoKSA9PiBjb25zb2xlLmxvZygnSW5zaWRlIERvbmUhJykpOwogICAgICogICB9CiAgICAgKgogICAgICogICAvLyBMb29wIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZQogICAgICogICAvLyBzbyB0aGUgVUkgRE9FUyBOT1QgcmVmcmVzaCBhZnRlciBlYWNoIHNldFRpbWVvdXQgY3ljbGUKICAgICAqICAgcHJvY2Vzc091dHNpZGVPZkFuZ3VsYXJab25lKCkgewogICAgICogICAgIHRoaXMubGFiZWwgPSAnb3V0c2lkZSc7CiAgICAgKiAgICAgdGhpcy5wcm9ncmVzcyA9IDA7CiAgICAgKiAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgpID0+IHsKICAgICAqICAgICAgIHRoaXMuX2luY3JlYXNlUHJvZ3Jlc3MoKCkgPT4gewogICAgICogICAgICAgICAvLyByZWVudGVyIHRoZSBBbmd1bGFyIHpvbmUgYW5kIGRpc3BsYXkgZG9uZQogICAgICogICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHsgY29uc29sZS5sb2coJ091dHNpZGUgRG9uZSEnKTsgfSk7CiAgICAgKiAgICAgICB9KTsKICAgICAqICAgICB9KTsKICAgICAqICAgfQogICAgICoKICAgICAqICAgX2luY3JlYXNlUHJvZ3Jlc3MoZG9uZUNhbGxiYWNrOiAoKSA9PiB2b2lkKSB7CiAgICAgKiAgICAgdGhpcy5wcm9ncmVzcyArPSAxOwogICAgICogICAgIGNvbnNvbGUubG9nKGBDdXJyZW50IHByb2dyZXNzOiAke3RoaXMucHJvZ3Jlc3N9JWApOwogICAgICoKICAgICAqICAgICBpZiAodGhpcy5wcm9ncmVzcyA8IDEwMCkgewogICAgICogICAgICAgd2luZG93LnNldFRpbWVvdXQoKCkgPT4gdGhpcy5faW5jcmVhc2VQcm9ncmVzcyhkb25lQ2FsbGJhY2spLCAxMCk7CiAgICAgKiAgICAgfSBlbHNlIHsKICAgICAqICAgICAgIGRvbmVDYWxsYmFjaygpOwogICAgICogICAgIH0KICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTmdab25lIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHsgZW5hYmxlTG9uZ1N0YWNrVHJhY2UgPSBmYWxzZSwgc2hvdWxkQ29hbGVzY2VFdmVudENoYW5nZURldGVjdGlvbiA9IGZhbHNlIH0pIHsKICAgICAgICAgICAgdGhpcy5oYXNQZW5kaW5nTWFjcm90YXNrcyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmhhc1BlbmRpbmdNaWNyb3Rhc2tzID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZXJlIGFyZSBubyBvdXRzdGFuZGluZyBtaWNyb3Rhc2tzIG9yIG1hY3JvdGFza3MuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlzU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5vdGlmaWVzIHdoZW4gY29kZSBlbnRlcnMgQW5ndWxhciBab25lLiBUaGlzIGdldHMgZmlyZWQgZmlyc3Qgb24gVk0gVHVybi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25VbnN0YWJsZSA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTm90aWZpZXMgd2hlbiB0aGVyZSBpcyBubyBtb3JlIG1pY3JvdGFza3MgZW5xdWV1ZWQgaW4gdGhlIGN1cnJlbnQgVk0gVHVybi4KICAgICAgICAgICAgICogVGhpcyBpcyBhIGhpbnQgZm9yIEFuZ3VsYXIgdG8gZG8gY2hhbmdlIGRldGVjdGlvbiwgd2hpY2ggbWF5IGVucXVldWUgbW9yZSBtaWNyb3Rhc2tzLgogICAgICAgICAgICAgKiBGb3IgdGhpcyByZWFzb24gdGhpcyBldmVudCBjYW4gZmlyZSBtdWx0aXBsZSB0aW1lcyBwZXIgVk0gVHVybi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25NaWNyb3Rhc2tFbXB0eSA9IG5ldyBFdmVudEVtaXR0ZXIoZmFsc2UpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTm90aWZpZXMgd2hlbiB0aGUgbGFzdCBgb25NaWNyb3Rhc2tFbXB0eWAgaGFzIHJ1biBhbmQgdGhlcmUgYXJlIG5vIG1vcmUgbWljcm90YXNrcywgd2hpY2gKICAgICAgICAgICAgICogaW1wbGllcyB3ZSBhcmUgYWJvdXQgdG8gcmVsaW5xdWlzaCBWTSB0dXJuLgogICAgICAgICAgICAgKiBUaGlzIGV2ZW50IGdldHMgY2FsbGVkIGp1c3Qgb25jZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25TdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyKGZhbHNlKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5vdGlmaWVzIHRoYXQgYW4gZXJyb3IgaGFzIGJlZW4gZGVsaXZlcmVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vbkVycm9yID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgWm9uZSA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiB0aGlzIGNvbmZpZ3VyYXRpb24gQW5ndWxhciByZXF1aXJlcyBab25lLmpzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgWm9uZS5hc3NlcnRab25lUGF0Y2hlZCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkpOwogICAgICAgICAgICBzZWxmLl9uZXN0aW5nID0gMDsKICAgICAgICAgICAgc2VsZi5fb3V0ZXIgPSBzZWxmLl9pbm5lciA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnd3RmWm9uZVNwZWMnXSkgewogICAgICAgICAgICAgICAgc2VsZi5faW5uZXIgPSBzZWxmLl9pbm5lci5mb3JrKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnd3RmWm9uZVNwZWMnXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnVGFza1RyYWNraW5nWm9uZVNwZWMnXSkgewogICAgICAgICAgICAgICAgc2VsZi5faW5uZXIgPSBzZWxmLl9pbm5lci5mb3JrKG5ldyAoKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnVGFza1RyYWNraW5nWm9uZVNwZWMnXSkpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGVuYWJsZUxvbmdTdGFja1RyYWNlICYmICgoLyoqIEB0eXBlIHs/fSAqLyAoWm9uZSkpKVsnbG9uZ1N0YWNrVHJhY2Vab25lU3BlYyddKSB7CiAgICAgICAgICAgICAgICBzZWxmLl9pbm5lciA9IHNlbGYuX2lubmVyLmZvcmsoKCgvKiogQHR5cGUgez99ICovIChab25lKSkpWydsb25nU3RhY2tUcmFjZVpvbmVTcGVjJ10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHNlbGYuc2hvdWxkQ29hbGVzY2VFdmVudENoYW5nZURldGVjdGlvbiA9IHNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb247CiAgICAgICAgICAgIHNlbGYubGFzdFJlcXVlc3RBbmltYXRpb25GcmFtZUlkID0gLTE7CiAgICAgICAgICAgIHNlbGYubmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZ2V0TmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lKCkubmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lOwogICAgICAgICAgICBmb3JrSW5uZXJab25lV2l0aEFuZ3VsYXJCZWhhdmlvcihzZWxmKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgaXNJbkFuZ3VsYXJab25lKCkgewogICAgICAgICAgICByZXR1cm4gWm9uZS5jdXJyZW50LmdldCgnaXNBbmd1bGFyWm9uZScpID09PSB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhc3NlcnRJbkFuZ3VsYXJab25lKCkgewogICAgICAgICAgICBpZiAoIU5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBiZSBpbiBBbmd1bGFyIFpvbmUsIGJ1dCBpdCBpcyBub3QhJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpIHsKICAgICAgICAgICAgaWYgKE5nWm9uZS5pc0luQW5ndWxhclpvbmUoKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCB0byBub3QgYmUgaW4gQW5ndWxhciBab25lLCBidXQgaXQgaXMhJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSB3aXRoaW4gdGhlIEFuZ3VsYXIgem9uZSBhbmQgcmV0dXJucyB2YWx1ZSByZXR1cm5lZCBieQogICAgICAgICAqIHRoZSBmdW5jdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkCiAgICAgICAgICogb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lICh0eXBpY2FsbHkgc3RhcnRlZCB2aWEge1xAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9KS4KICAgICAgICAgKgogICAgICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tCiAgICAgICAgICogd2l0aGluIHRoZSBBbmd1bGFyIHpvbmUuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhIHN5bmNocm9ub3VzIGVycm9yIGhhcHBlbnMgaXQgd2lsbCBiZSByZXRocm93biBhbmQgbm90IHJlcG9ydGVkIHZpYSBgb25FcnJvcmAuCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXBwbHlBcmdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBydW4oZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lci5ydW4oZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFeGVjdXRlcyB0aGUgYGZuYCBmdW5jdGlvbiBzeW5jaHJvbm91c2x5IHdpdGhpbiB0aGUgQW5ndWxhciB6b25lIGFzIGEgdGFzayBhbmQgcmV0dXJucyB2YWx1ZQogICAgICAgICAqIHJldHVybmVkIGJ5IHRoZSBmdW5jdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIFJ1bm5pbmcgZnVuY3Rpb25zIHZpYSBgcnVuYCBhbGxvd3MgeW91IHRvIHJlZW50ZXIgQW5ndWxhciB6b25lIGZyb20gYSB0YXNrIHRoYXQgd2FzIGV4ZWN1dGVkCiAgICAgICAgICogb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lICh0eXBpY2FsbHkgc3RhcnRlZCB2aWEge1xAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9KS4KICAgICAgICAgKgogICAgICAgICAqIEFueSBmdXR1cmUgdGFza3Mgb3IgbWljcm90YXNrcyBzY2hlZHVsZWQgZnJvbSB3aXRoaW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNvbnRpbnVlIGV4ZWN1dGluZyBmcm9tCiAgICAgICAgICogd2l0aGluIHRoZSBBbmd1bGFyIHpvbmUuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBhIHN5bmNocm9ub3VzIGVycm9yIGhhcHBlbnMgaXQgd2lsbCBiZSByZXRocm93biBhbmQgbm90IHJlcG9ydGVkIHZpYSBgb25FcnJvcmAuCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXBwbHlBcmdzCiAgICAgICAgICogQHBhcmFtIHs/PX0gbmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcnVuVGFzayhmbiwgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIG5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB6b25lID0gKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lcjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0YXNrID0gem9uZS5zY2hlZHVsZUV2ZW50VGFzaygnTmdab25lRXZlbnQ6ICcgKyBuYW1lLCBmbiwgRU1QVFlfUEFZTE9BRCwgbm9vcCQxLCBub29wJDEpOwogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh6b25lLnJ1blRhc2sodGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICB6b25lLmNhbmNlbFRhc2sodGFzayk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2FtZSBhcyBgcnVuYCwgZXhjZXB0IHRoYXQgc3luY2hyb25vdXMgZXJyb3JzIGFyZSBjYXVnaHQgYW5kIGZvcndhcmRlZCB2aWEgYG9uRXJyb3JgIGFuZCBub3QKICAgICAgICAgKiByZXRocm93bi4KICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcGFyYW0gez89fSBhcHBseVRoaXMKICAgICAgICAgKiBAcGFyYW0gez89fSBhcHBseUFyZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJ1bkd1YXJkZWQoZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKSkpLl9pbm5lci5ydW5HdWFyZGVkKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRXhlY3V0ZXMgdGhlIGBmbmAgZnVuY3Rpb24gc3luY2hyb25vdXNseSBpbiBBbmd1bGFyJ3MgcGFyZW50IHpvbmUgYW5kIHJldHVybnMgdmFsdWUgcmV0dXJuZWQgYnkKICAgICAgICAgKiB0aGUgZnVuY3Rpb24uCiAgICAgICAgICoKICAgICAgICAgKiBSdW5uaW5nIGZ1bmN0aW9ucyB2aWEge1xAbGluayAjcnVuT3V0c2lkZUFuZ3VsYXJ9IGFsbG93cyB5b3UgdG8gZXNjYXBlIEFuZ3VsYXIncyB6b25lIGFuZCBkbwogICAgICAgICAqIHdvcmsgdGhhdAogICAgICAgICAqIGRvZXNuJ3QgdHJpZ2dlciBBbmd1bGFyIGNoYW5nZS1kZXRlY3Rpb24gb3IgaXMgc3ViamVjdCB0byBBbmd1bGFyJ3MgZXJyb3IgaGFuZGxpbmcuCiAgICAgICAgICoKICAgICAgICAgKiBBbnkgZnV0dXJlIHRhc2tzIG9yIG1pY3JvdGFza3Mgc2NoZWR1bGVkIGZyb20gd2l0aGluIHRoaXMgZnVuY3Rpb24gd2lsbCBjb250aW51ZSBleGVjdXRpbmcgZnJvbQogICAgICAgICAqIG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZS4KICAgICAgICAgKgogICAgICAgICAqIFVzZSB7XEBsaW5rICNydW59IHRvIHJlZW50ZXIgdGhlIEFuZ3VsYXIgem9uZSBhbmQgZG8gd29yayB0aGF0IHVwZGF0ZXMgdGhlIGFwcGxpY2F0aW9uIG1vZGVsLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcnVuT3V0c2lkZUFuZ3VsYXIoZm4pIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpKSkuX291dGVyLnJ1bihmbikpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vb3AkMSgpIHsgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRU1QVFlfUEFZTE9BRCA9IHt9OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHpvbmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrU3RhYmxlKHpvbmUpIHsKICAgICAgICBpZiAoem9uZS5fbmVzdGluZyA9PSAwICYmICF6b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzICYmICF6b25lLmlzU3RhYmxlKSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB6b25lLl9uZXN0aW5nKys7CiAgICAgICAgICAgICAgICB6b25lLm9uTWljcm90YXNrRW1wdHkuZW1pdChudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIHpvbmUuX25lc3RpbmctLTsKICAgICAgICAgICAgICAgIGlmICghem9uZS5oYXNQZW5kaW5nTWljcm90YXNrcykgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gem9uZS5vblN0YWJsZS5lbWl0KG51bGwpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICB6b25lLmlzU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gem9uZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGVsYXlDaGFuZ2VEZXRlY3Rpb25Gb3JFdmVudHMoem9uZSkgewogICAgICAgIGlmICh6b25lLmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCAhPT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB6b25lLmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IHpvbmUubmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lLmNhbGwoX2dsb2JhbCwgKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICB6b25lLmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCA9IC0xOwogICAgICAgICAgICB1cGRhdGVNaWNyb1Rhc2tTdGF0dXMoem9uZSk7CiAgICAgICAgICAgIGNoZWNrU3RhYmxlKHpvbmUpOwogICAgICAgIH0pKTsKICAgICAgICB1cGRhdGVNaWNyb1Rhc2tTdGF0dXMoem9uZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gem9uZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZm9ya0lubmVyWm9uZVdpdGhBbmd1bGFyQmVoYXZpb3Ioem9uZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50c0RlbGVnYXRlID0gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gewogICAgICAgICAgICBkZWxheUNoYW5nZURldGVjdGlvbkZvckV2ZW50cyh6b25lKTsKICAgICAgICB9KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWF5YmVEZWxheUNoYW5nZURldGVjdGlvbiA9ICEhem9uZS5zaG91bGRDb2FsZXNjZUV2ZW50Q2hhbmdlRGV0ZWN0aW9uICYmCiAgICAgICAgICAgIHpvbmUubmF0aXZlUmVxdWVzdEFuaW1hdGlvbkZyYW1lICYmIGRlbGF5Q2hhbmdlRGV0ZWN0aW9uRm9yRXZlbnRzRGVsZWdhdGU7CiAgICAgICAgem9uZS5faW5uZXIgPSB6b25lLl9pbm5lci5mb3JrKHsKICAgICAgICAgICAgbmFtZTogJ2FuZ3VsYXInLAogICAgICAgICAgICBwcm9wZXJ0aWVzOiAoLyoqIEB0eXBlIHs/fSAqLyAoeyAnaXNBbmd1bGFyWm9uZSc6IHRydWUsICdtYXliZURlbGF5Q2hhbmdlRGV0ZWN0aW9uJzogbWF5YmVEZWxheUNoYW5nZURldGVjdGlvbiB9KSksCiAgICAgICAgICAgIG9uSW52b2tlVGFzazogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlbGVnYXRlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhc2sKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhcHBseVRoaXMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhcHBseUFyZ3MKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkZWxlZ2F0ZSwgY3VycmVudCwgdGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvbkVudGVyKHpvbmUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2VUYXNrKHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG1heWJlRGVsYXlDaGFuZ2VEZXRlY3Rpb24gJiYgdGFzay50eXBlID09PSAnZXZlbnRUYXNrJykgewogICAgICAgICAgICAgICAgICAgICAgICBtYXliZURlbGF5Q2hhbmdlRGV0ZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIG9uTGVhdmUoem9uZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLAogICAgICAgICAgICBvbkludm9rZTogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlbGVnYXRlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXBwbHlUaGlzCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICAgICAgICAgKiBAcGFyYW0gez89fSBzb3VyY2UKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkZWxlZ2F0ZSwgY3VycmVudCwgdGFyZ2V0LCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICBvbkVudGVyKHpvbmUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZS5pbnZva2UodGFyZ2V0LCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICBvbkxlYXZlKHpvbmUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwKICAgICAgICAgICAgb25IYXNUYXNrOiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaGFzVGFza1N0YXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGVsZWdhdGUsIGN1cnJlbnQsIHRhcmdldCwgaGFzVGFza1N0YXRlKSA9PiB7CiAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5oYXNUYXNrKHRhcmdldCwgaGFzVGFza1N0YXRlKTsKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50ID09PSB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBhcmUgb25seSBpbnRlcmVzdGVkIGluIGhhc1Rhc2sgZXZlbnRzIHdoaWNoIG9yaWdpbmF0ZSBmcm9tIG91ciB6b25lCiAgICAgICAgICAgICAgICAgICAgLy8gKEEgY2hpbGQgaGFzVGFzayBldmVudCBpcyBub3QgaW50ZXJlc3RpbmcgdG8gdXMpCiAgICAgICAgICAgICAgICAgICAgaWYgKGhhc1Rhc2tTdGF0ZS5jaGFuZ2UgPT0gJ21pY3JvVGFzaycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgem9uZS5faGFzUGVuZGluZ01pY3JvdGFza3MgPSBoYXNUYXNrU3RhdGUubWljcm9UYXNrOwogICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVNaWNyb1Rhc2tTdGF0dXMoem9uZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoZWNrU3RhYmxlKHpvbmUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoYXNUYXNrU3RhdGUuY2hhbmdlID09ICdtYWNyb1Rhc2snKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmUuaGFzUGVuZGluZ01hY3JvdGFza3MgPSBoYXNUYXNrU3RhdGUubWFjcm9UYXNrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSksCiAgICAgICAgICAgIG9uSGFuZGxlRXJyb3I6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWxlZ2F0ZQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRlbGVnYXRlLCBjdXJyZW50LCB0YXJnZXQsIGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5oYW5kbGVFcnJvcih0YXJnZXQsIGVycm9yKTsKICAgICAgICAgICAgICAgIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gem9uZS5vbkVycm9yLmVtaXQoZXJyb3IpKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pCiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gem9uZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdXBkYXRlTWljcm9UYXNrU3RhdHVzKHpvbmUpIHsKICAgICAgICBpZiAoem9uZS5faGFzUGVuZGluZ01pY3JvdGFza3MgfHwKICAgICAgICAgICAgKHpvbmUuc2hvdWxkQ29hbGVzY2VFdmVudENoYW5nZURldGVjdGlvbiAmJiB6b25lLmxhc3RSZXF1ZXN0QW5pbWF0aW9uRnJhbWVJZCAhPT0gLTEpKSB7CiAgICAgICAgICAgIHpvbmUuaGFzUGVuZGluZ01pY3JvdGFza3MgPSB0cnVlOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgem9uZS5oYXNQZW5kaW5nTWljcm90YXNrcyA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB6b25lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBvbkVudGVyKHpvbmUpIHsKICAgICAgICB6b25lLl9uZXN0aW5nKys7CiAgICAgICAgaWYgKHpvbmUuaXNTdGFibGUpIHsKICAgICAgICAgICAgem9uZS5pc1N0YWJsZSA9IGZhbHNlOwogICAgICAgICAgICB6b25lLm9uVW5zdGFibGUuZW1pdChudWxsKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gem9uZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gb25MZWF2ZSh6b25lKSB7CiAgICAgICAgem9uZS5fbmVzdGluZy0tOwogICAgICAgIGNoZWNrU3RhYmxlKHpvbmUpOwogICAgfQogICAgLyoqCiAgICAgKiBQcm92aWRlcyBhIG5vb3AgaW1wbGVtZW50YXRpb24gb2YgYE5nWm9uZWAgd2hpY2ggZG9lcyBub3RoaW5nLiBUaGlzIHpvbmUgcmVxdWlyZXMgZXhwbGljaXQgY2FsbHMKICAgICAqIHRvIGZyYW1ld29yayB0byBwZXJmb3JtIHJlbmRlcmluZy4KICAgICAqLwogICAgY2xhc3MgTm9vcE5nWm9uZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuaGFzUGVuZGluZ01pY3JvdGFza3MgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5oYXNQZW5kaW5nTWFjcm90YXNrcyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmlzU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5vblVuc3RhYmxlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uTWljcm90YXNrRW1wdHkgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25TdGFibGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25FcnJvciA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5VGhpcwogICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcnVuKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXBwbHlUaGlzCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXBwbHlBcmdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBydW5HdWFyZGVkKGZuLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgICAgICByZXR1cm4gZm4uYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBydW5PdXRzaWRlQW5ndWxhcihmbikgewogICAgICAgICAgICByZXR1cm4gZm4oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5VGhpcwogICAgICAgICAqIEBwYXJhbSB7Pz19IGFwcGx5QXJncwogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJ1blRhc2soZm4sIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBuYW1lKSB7CiAgICAgICAgICAgIHJldHVybiBmbi5hcHBseShhcHBseVRoaXMsIGFwcGx5QXJncyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBUaGUgVGVzdGFiaWxpdHkgc2VydmljZSBwcm92aWRlcyB0ZXN0aW5nIGhvb2tzIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGZyb20KICAgICAqIHRoZSBicm93c2VyIGFuZCBieSBzZXJ2aWNlcyBzdWNoIGFzIFByb3RyYWN0b3IuIEVhY2ggYm9vdHN0cmFwcGVkIEFuZ3VsYXIKICAgICAqIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIHdpbGwgaGF2ZSBhbiBpbnN0YW5jZSBvZiBUZXN0YWJpbGl0eS4KICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFRlc3RhYmlsaXR5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfbmdab25lKSB7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuX2lzWm9uZVN0YWJsZSA9IHRydWU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIGFueSB3b3JrIHdhcyBkb25lIHNpbmNlIHRoZSBsYXN0ICd3aGVuU3RhYmxlJyBjYWxsYmFjay4gVGhpcyBpcwogICAgICAgICAgICAgKiB1c2VmdWwgdG8gZGV0ZWN0IGlmIHRoaXMgY291bGQgaGF2ZSBwb3RlbnRpYWxseSBkZXN0YWJpbGl6ZWQgYW5vdGhlcgogICAgICAgICAgICAgKiBjb21wb25lbnQgd2hpbGUgaXQgaXMgc3RhYmlsaXppbmcuCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2RpZFdvcmsgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gW107CiAgICAgICAgICAgIHRoaXMudGFza1RyYWNraW5nWm9uZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3dhdGNoQW5ndWxhckV2ZW50cygpOwogICAgICAgICAgICBfbmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnRhc2tUcmFja2luZ1pvbmUgPQogICAgICAgICAgICAgICAgICAgIHR5cGVvZiBab25lID09ICd1bmRlZmluZWQnID8gbnVsbCA6IFpvbmUuY3VycmVudC5nZXQoJ1Rhc2tUcmFja2luZ1pvbmUnKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3dhdGNoQW5ndWxhckV2ZW50cygpIHsKICAgICAgICAgICAgdGhpcy5fbmdab25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9kaWRXb3JrID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1pvbmVTdGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLm9uU3RhYmxlLnN1YnNjcmliZSh7CiAgICAgICAgICAgICAgICAgICAgbmV4dDogKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzaygoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1pvbmVTdGFibGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEluY3JlYXNlcyB0aGUgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdAogICAgICAgICAqIEBkZXByZWNhdGVkIHBlbmRpbmcgcmVxdWVzdHMgYXJlIG5vdyB0cmFja2VkIHdpdGggem9uZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbmNyZWFzZVBlbmRpbmdSZXF1ZXN0Q291bnQoKSB7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDb3VudCArPSAxOwogICAgICAgICAgICB0aGlzLl9kaWRXb3JrID0gdHJ1ZTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BlbmRpbmdDb3VudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVjcmVhc2VzIHRoZSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0CiAgICAgICAgICogQGRlcHJlY2F0ZWQgcGVuZGluZyByZXF1ZXN0cyBhcmUgbm93IHRyYWNrZWQgd2l0aCB6b25lcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVjcmVhc2VQZW5kaW5nUmVxdWVzdENvdW50KCkgewogICAgICAgICAgICB0aGlzLl9wZW5kaW5nQ291bnQgLT0gMTsKICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDb3VudCA8IDApIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigncGVuZGluZyBhc3luYyByZXF1ZXN0cyBiZWxvdyB6ZXJvJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcnVuQ2FsbGJhY2tzSWZSZWFkeSgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGVuZGluZ0NvdW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIGFuIGFzc29jaWF0ZWQgYXBwbGljYXRpb24gaXMgc3RhYmxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc1N0YWJsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2lzWm9uZVN0YWJsZSAmJiB0aGlzLl9wZW5kaW5nQ291bnQgPT09IDAgJiYgIXRoaXMuX25nWm9uZS5oYXNQZW5kaW5nTWFjcm90YXNrczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ydW5DYWxsYmFja3NJZlJlYWR5KCkgewogICAgICAgICAgICBpZiAodGhpcy5pc1N0YWJsZSgpKSB7CiAgICAgICAgICAgICAgICAvLyBTY2hlZHVsZXMgdGhlIGNhbGwgYmFja3MgaW4gYSBuZXcgZnJhbWUgc28gdGhhdCBpdCBpcyBhbHdheXMgYXN5bmMuCiAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzaygoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgY2IgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fY2FsbGJhY2tzLnBvcCgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjYi50aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBjYi5kb25lQ2IodGhpcy5fZGlkV29yayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RpZFdvcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFN0aWxsIG5vdCBzdGFibGUsIHNlbmQgdXBkYXRlcy4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwZW5kaW5nID0gdGhpcy5nZXRQZW5kaW5nVGFza3MoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGNiKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGNiLnVwZGF0ZUNiICYmIGNiLnVwZGF0ZUNiKHBlbmRpbmcpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChjYi50aW1lb3V0SWQpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlkV29yayA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBlbmRpbmdUYXNrcygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnRhc2tUcmFja2luZ1pvbmUpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDb3B5IHRoZSB0YXNrcyBkYXRhIHNvIHRoYXQgd2UgZG9uJ3QgbGVhayB0YXNrcy4KICAgICAgICAgICAgcmV0dXJuIHRoaXMudGFza1RyYWNraW5nWm9uZS5tYWNyb1Rhc2tzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0LnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAvLyBGcm9tIFRhc2tUcmFja2luZ1pvbmU6CiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9ibG9iL21hc3Rlci9saWIvem9uZS1zcGVjL3Rhc2stdHJhY2tpbmcudHMjTDQwCiAgICAgICAgICAgICAgICAgICAgY3JlYXRpb25Mb2NhdGlvbjogKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAodCkpKS5jcmVhdGlvbkxvY2F0aW9uKSksCiAgICAgICAgICAgICAgICAgICAgZGF0YTogdC5kYXRhCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjYgogICAgICAgICAqIEBwYXJhbSB7Pz19IHRpbWVvdXQKICAgICAgICAgKiBAcGFyYW0gez89fSB1cGRhdGVDYgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkQ2FsbGJhY2soY2IsIHRpbWVvdXQsIHVwZGF0ZUNiKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHRpbWVvdXRJZCA9IC0xOwogICAgICAgICAgICBpZiAodGltZW91dCAmJiB0aW1lb3V0ID4gMCkgewogICAgICAgICAgICAgICAgdGltZW91dElkID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzID0gdGhpcy5fY2FsbGJhY2tzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKGNiKSA9PiBjYi50aW1lb3V0SWQgIT09IHRpbWVvdXRJZCkpOwogICAgICAgICAgICAgICAgICAgIGNiKHRoaXMuX2RpZFdvcmssIHRoaXMuZ2V0UGVuZGluZ1Rhc2tzKCkpOwogICAgICAgICAgICAgICAgfSksIHRpbWVvdXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5wdXNoKCgvKiogQHR5cGUgez99ICovICh7IGRvbmVDYjogY2IsIHRpbWVvdXRJZDogdGltZW91dElkLCB1cGRhdGVDYjogdXBkYXRlQ2IgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YWJsZSB3aXRoIGEgdGltZW91dC4gSWYgdGhlIHRpbWVvdXQgaXMgcmVhY2hlZCBiZWZvcmUgdGhhdAogICAgICAgICAqIGhhcHBlbnMsIHRoZSBjYWxsYmFjayByZWNlaXZlcyBhIGxpc3Qgb2YgdGhlIG1hY3JvIHRhc2tzIHRoYXQgd2VyZSBwZW5kaW5nLCBvdGhlcndpc2UgbnVsbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZG9uZUNiIFRoZSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiBBbmd1bGFyIGlzIHN0YWJsZSBvciB0aGUgdGltZW91dCBleHBpcmVzCiAgICAgICAgICogICAgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgogICAgICAgICAqIEBwYXJhbSB7Pz19IHRpbWVvdXQgT3B0aW9uYWwuIFRoZSBtYXhpbXVtIHRpbWUgdG8gd2FpdCBmb3IgQW5ndWxhciB0byBiZWNvbWUgc3RhYmxlLiBJZiBub3QKICAgICAgICAgKiAgICBzcGVjaWZpZWQsIHdoZW5TdGFibGUoKSB3aWxsIHdhaXQgZm9yZXZlci4KICAgICAgICAgKiBAcGFyYW0gez89fSB1cGRhdGVDYiBPcHRpb25hbC4gSWYgc3BlY2lmaWVkLCB0aGlzIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCB3aGVuZXZlciB0aGUgc2V0IG9mCiAgICAgICAgICogICAgcGVuZGluZyBtYWNyb3Rhc2tzIGNoYW5nZXMuIElmIHRoaXMgY2FsbGJhY2sgcmV0dXJucyB0cnVlIGRvbmVDYiB3aWxsIG5vdCBiZSBpbnZva2VkCiAgICAgICAgICogICAgYW5kIG5vIGZ1cnRoZXIgdXBkYXRlcyB3aWxsIGJlIGlzc3VlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHdoZW5TdGFibGUoZG9uZUNiLCB0aW1lb3V0LCB1cGRhdGVDYikgewogICAgICAgICAgICBpZiAodXBkYXRlQ2IgJiYgIXRoaXMudGFza1RyYWNraW5nWm9uZSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUYXNrIHRyYWNraW5nIHpvbmUgaXMgcmVxdWlyZWQgd2hlbiBwYXNzaW5nIGFuIHVwZGF0ZSBjYWxsYmFjayB0byAnICsKICAgICAgICAgICAgICAgICAgICAnd2hlblN0YWJsZSgpLiBJcyAiem9uZS5qcy9kaXN0L3Rhc2stdHJhY2tpbmcuanMiIGxvYWRlZD8nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGVzZSBhcmd1bWVudHMgYXJlICdGdW5jdGlvbicgYWJvdmUgdG8ga2VlcCB0aGUgcHVibGljIEFQSSBzaW1wbGUuCiAgICAgICAgICAgIHRoaXMuYWRkQ2FsbGJhY2soKC8qKiBAdHlwZSB7P30gKi8gKGRvbmVDYikpLCB0aW1lb3V0LCAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlQ2IpKSk7CiAgICAgICAgICAgIHRoaXMuX3J1bkNhbGxiYWNrc0lmUmVhZHkoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBudW1iZXIgb2YgcGVuZGluZyByZXF1ZXN0cwogICAgICAgICAqIEBkZXByZWNhdGVkIHBlbmRpbmcgcmVxdWVzdHMgYXJlIG5vdyB0cmFja2VkIHdpdGggem9uZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBlbmRpbmdSZXF1ZXN0Q291bnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wZW5kaW5nQ291bnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZpbmQgcHJvdmlkZXJzIGJ5IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IHVzaW5nIFRoZSByb290IGVsZW1lbnQgdG8gc2VhcmNoIGZyb20KICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyIFRoZSBuYW1lIG9mIGJpbmRpbmcgdmFyaWFibGUKICAgICAgICAgKiBAcGFyYW0gez99IGV4YWN0TWF0Y2ggV2hldGhlciB1c2luZyBleGFjdE1hdGNoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmaW5kUHJvdmlkZXJzKHVzaW5nLCBwcm92aWRlciwgZXhhY3RNYXRjaCkgewogICAgICAgICAgICAvLyBUT0RPKGp1bGllbXIpOiBpbXBsZW1lbnQuCiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICB9CiAgICBUZXN0YWJpbGl0eS7JtWZhYyA9IGZ1bmN0aW9uIFRlc3RhYmlsaXR5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRlc3RhYmlsaXR5KSjJtcm1aW5qZWN0KE5nWm9uZSkpOyB9OwogICAgVGVzdGFiaWxpdHkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVGVzdGFiaWxpdHksIGZhY3Rvcnk6IFRlc3RhYmlsaXR5Lsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUZXN0YWJpbGl0eS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9CiAgICBdOwogICAgLyoqCiAgICAgKiBBIGdsb2JhbCByZWdpc3RyeSBvZiB7XEBsaW5rIFRlc3RhYmlsaXR5fSBpbnN0YW5jZXMgZm9yIHNwZWNpZmljIGVsZW1lbnRzLgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgVGVzdGFiaWxpdHlSZWdpc3RyeSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hcHBsaWNhdGlvbnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIF90ZXN0YWJpbGl0eUdldHRlci5hZGRUb1dpbmRvdyh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGFwcGxpY2F0aW9uIHdpdGggYSB0ZXN0YWJpbGl0eSBob29rIHNvIHRoYXQgaXQgY2FuIGJlIHRyYWNrZWQKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuIHRva2VuIG9mIGFwcGxpY2F0aW9uLCByb290IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IHRlc3RhYmlsaXR5IFRlc3RhYmlsaXR5IGhvb2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyQXBwbGljYXRpb24odG9rZW4sIHRlc3RhYmlsaXR5KSB7CiAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5zZXQodG9rZW4sIHRlc3RhYmlsaXR5KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVW5yZWdpc3RlcnMgYW4gYXBwbGljYXRpb24uCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlbiB0b2tlbiBvZiBhcHBsaWNhdGlvbiwgcm9vdCBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1bnJlZ2lzdGVyQXBwbGljYXRpb24odG9rZW4pIHsKICAgICAgICAgICAgdGhpcy5fYXBwbGljYXRpb25zLmRlbGV0ZSh0b2tlbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVucmVnaXN0ZXJzIGFsbCBhcHBsaWNhdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVucmVnaXN0ZXJBbGxBcHBsaWNhdGlvbnMoKSB7CiAgICAgICAgICAgIHRoaXMuX2FwcGxpY2F0aW9ucy5jbGVhcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgYSB0ZXN0YWJpbGl0eSBob29rIGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IGVsZW0gcm9vdCBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRUZXN0YWJpbGl0eShlbGVtKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hcHBsaWNhdGlvbnMuZ2V0KGVsZW0pIHx8IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCBhbGwgcmVnaXN0ZXJlZCB0ZXN0YWJpbGl0aWVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRBbGxUZXN0YWJpbGl0aWVzKCkgewogICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh0aGlzLl9hcHBsaWNhdGlvbnMudmFsdWVzKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgYWxsIHJlZ2lzdGVyZWQgYXBwbGljYXRpb25zKHJvb3QgZWxlbWVudHMpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRBbGxSb290RWxlbWVudHMoKSB7CiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHRoaXMuX2FwcGxpY2F0aW9ucy5rZXlzKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGaW5kIHRlc3RhYmlsaXR5IG9mIGEgbm9kZSBpbiB0aGUgVHJlZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbSBub2RlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmluZEluQW5jZXN0b3JzIHdoZXRoZXIgZmluZGluZyB0ZXN0YWJpbGl0eSBpbiBhbmNlc3RvcnMgaWYgdGVzdGFiaWxpdHkgd2FzIG5vdCBmb3VuZCBpbgogICAgICAgICAqIGN1cnJlbnQgbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyA9IHRydWUpIHsKICAgICAgICAgICAgcmV0dXJuIF90ZXN0YWJpbGl0eUdldHRlci5maW5kVGVzdGFiaWxpdHlJblRyZWUodGhpcywgZWxlbSwgZmluZEluQW5jZXN0b3JzKTsKICAgICAgICB9CiAgICB9CiAgICBUZXN0YWJpbGl0eVJlZ2lzdHJ5Lsm1ZmFjID0gZnVuY3Rpb24gVGVzdGFiaWxpdHlSZWdpc3RyeV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXN0YWJpbGl0eVJlZ2lzdHJ5KSgpOyB9OwogICAgVGVzdGFiaWxpdHlSZWdpc3RyeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUZXN0YWJpbGl0eVJlZ2lzdHJ5LCBmYWN0b3J5OiBUZXN0YWJpbGl0eVJlZ2lzdHJ5Lsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUZXN0YWJpbGl0eVJlZ2lzdHJ5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107CiAgICBjbGFzcyBfTm9vcEdldFRlc3RhYmlsaXR5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRUb1dpbmRvdyhyZWdpc3RyeSkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWdpc3RyeQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbQogICAgICAgICAqIEBwYXJhbSB7P30gZmluZEluQW5jZXN0b3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmaW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGVsZW0sIGZpbmRJbkFuY2VzdG9ycykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNldCB0aGUge1xAbGluayBHZXRUZXN0YWJpbGl0eX0gaW1wbGVtZW50YXRpb24gdXNlZCBieSB0aGUgQW5ndWxhciB0ZXN0aW5nIGZyYW1ld29yay4KICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IGdldHRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0VGVzdGFiaWxpdHlHZXR0ZXIoZ2V0dGVyKSB7CiAgICAgICAgX3Rlc3RhYmlsaXR5R2V0dGVyID0gZ2V0dGVyOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IF90ZXN0YWJpbGl0eUdldHRlciA9IG5ldyBfTm9vcEdldFRlc3RhYmlsaXR5KCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9hcHBsaWNhdGlvbl9yZWYudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IF9wbGF0Zm9ybTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBjb21waWxlTmdNb2R1bGVGYWN0b3J5ID0gY29tcGlsZU5nTW9kdWxlRmFjdG9yeV9fUE9TVF9SM19fOwogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgTQogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbXBpbGVOZ01vZHVsZUZhY3RvcnlfX1BPU1RfUjNfXyhpbmplY3Rvciwgb3B0aW9ucywgbW9kdWxlVHlwZSkgewogICAgICAgIG5nRGV2TW9kZSAmJiBhc3NlcnROZ01vZHVsZVR5cGUobW9kdWxlVHlwZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbXBpbGVyT3B0aW9ucyA9IGluamVjdG9yLmdldChDT01QSUxFUl9PUFRJT05TLCBbXSkuY29uY2F0KG9wdGlvbnMpOwogICAgICAgIGlmICh0eXBlb2YgbmdKaXRNb2RlID09PSAndW5kZWZpbmVkJyB8fCBuZ0ppdE1vZGUpIHsKICAgICAgICAgICAgLy8gQ29uZmlndXJlIHRoZSBjb21waWxlciB0byB1c2UgdGhlIHByb3ZpZGVkIG9wdGlvbnMuIFRoaXMgY2FsbCBtYXkgZmFpbCB3aGVuIG11bHRpcGxlIG1vZHVsZXMKICAgICAgICAgICAgLy8gYXJlIGJvb3RzdHJhcHBlZCB3aXRoIGluY29tcGF0aWJsZSBvcHRpb25zLCBhcyBhIGNvbXBvbmVudCBjYW4gb25seSBiZSBjb21waWxlZCBhY2NvcmRpbmcgdG8KICAgICAgICAgICAgLy8gYSBzaW5nbGUgc2V0IG9mIG9wdGlvbnMuCiAgICAgICAgICAgIHNldEppdE9wdGlvbnMoewogICAgICAgICAgICAgICAgZGVmYXVsdEVuY2Fwc3VsYXRpb246IF9sYXN0RGVmaW5lZChjb21waWxlck9wdGlvbnMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgb3B0aW9ucyA9PiBvcHRpb25zLmRlZmF1bHRFbmNhcHN1bGF0aW9uKSkpLAogICAgICAgICAgICAgICAgcHJlc2VydmVXaGl0ZXNwYWNlczogX2xhc3REZWZpbmVkKGNvbXBpbGVyT3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBvcHRpb25zID0+IG9wdGlvbnMucHJlc2VydmVXaGl0ZXNwYWNlcykpKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtb2R1bGVGYWN0b3J5ID0gbmV3IE5nTW9kdWxlRmFjdG9yeSQxKG1vZHVsZVR5cGUpOwogICAgICAgIGlmIChpc0NvbXBvbmVudFJlc291cmNlUmVzb2x1dGlvblF1ZXVlRW1wdHkoKSkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vZHVsZUZhY3RvcnkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcGlsZXJQcm92aWRlcnMgPSBfbWVyZ2VBcnJheXMoY29tcGlsZXJPcHRpb25zLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvID0+ICgvKiogQHR5cGUgez99ICovIChvLnByb3ZpZGVycykpKSkpOwogICAgICAgIC8vIEluIGNhc2UgdGhlcmUgYXJlIG5vIGNvbXBpbGVyIHByb3ZpZGVycywgd2UganVzdCByZXR1cm4gdGhlIG1vZHVsZSBmYWN0b3J5IGFzCiAgICAgICAgLy8gdGhlcmUgd29uJ3QgYmUgYW55IHJlc291cmNlIGxvYWRlci4gVGhpcyBjYW4gaGFwcGVuIHdpdGggSXZ5LCBiZWNhdXNlIEFPVCBjb21waWxlZAogICAgICAgIC8vIG1vZHVsZXMgY2FuIGJlIHN0aWxsIHBhc3NlZCB0aHJvdWdoICJib290c3RyYXBNb2R1bGUiLiBJbiB0aGF0IGNhc2Ugd2Ugc2hvdWxkbid0CiAgICAgICAgLy8gdW5uZWNlc3NhcmlseSByZXF1aXJlIHRoZSBKSVQgY29tcGlsZXIuCiAgICAgICAgaWYgKGNvbXBpbGVyUHJvdmlkZXJzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG1vZHVsZUZhY3RvcnkpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY29tcGlsZXIgPSBnZXRDb21waWxlckZhY2FkZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjb21waWxlckluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBjb21waWxlclByb3ZpZGVycyB9KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzb3VyY2VMb2FkZXIgPSBjb21waWxlckluamVjdG9yLmdldChjb21waWxlci5SZXNvdXJjZUxvYWRlcik7CiAgICAgICAgLy8gVGhlIHJlc291cmNlIGxvYWRlciBjYW4gYWxzbyByZXR1cm4gYSBzdHJpbmcgd2hpbGUgdGhlICJyZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzIgogICAgICAgIC8vIGFsd2F5cyBleHBlY3RzIGEgcHJvbWlzZS4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gd3JhcCB0aGUgcmV0dXJuZWQgdmFsdWUgaW4gYSBwcm9taXNlLgogICAgICAgIHJldHVybiByZXNvbHZlQ29tcG9uZW50UmVzb3VyY2VzKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHVybAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXJsID0+IFByb21pc2UucmVzb2x2ZShyZXNvdXJjZUxvYWRlci5nZXQodXJsKSkpKQogICAgICAgICAgICAudGhlbigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBtb2R1bGVGYWN0b3J5KSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHNfX1BPU1RfUjNfXygpIHsKICAgICAgICBuZ0Rldk1vZGUgJiYgcHVibGlzaERlZmF1bHRHbG9iYWxVdGlscygpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMkMSA9IHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHNfX1BPU1RfUjNfXzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBpc0JvdW5kVG9Nb2R1bGUgPSBpc0JvdW5kVG9Nb2R1bGVfX1BPU1RfUjNfXzsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIEMKICAgICAqIEBwYXJhbSB7P30gY2YKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQm91bmRUb01vZHVsZV9fUE9TVF9SM19fKGNmKSB7CiAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAoY2YpKSkuaXNCb3VuZFRvTW9kdWxlOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQUxMT1dfTVVMVElQTEVfUExBVEZPUk1TID0gbmV3IEluamVjdGlvblRva2VuKCdBbGxvd011bHRpcGxlVG9rZW4nKTsKICAgIC8qKgogICAgICogQSB0b2tlbiBmb3IgdGhpcmQtcGFydHkgY29tcG9uZW50cyB0aGF0IGNhbiByZWdpc3RlciB0aGVtc2VsdmVzIHdpdGggTmdQcm9iZS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBOZ1Byb2JlVG9rZW4gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gdG9rZW4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihuYW1lLCB0b2tlbikgewogICAgICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwogICAgICAgICAgICB0aGlzLnRva2VuID0gdG9rZW47CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgcGxhdGZvcm0uCiAgICAgKiBQbGF0Zm9ybXMgaGF2ZSB0byBiZSBlYWdlcmx5IGNyZWF0ZWQgdmlhIHRoaXMgZnVuY3Rpb24uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVBsYXRmb3JtKGluamVjdG9yKSB7CiAgICAgICAgaWYgKF9wbGF0Zm9ybSAmJiAhX3BsYXRmb3JtLmRlc3Ryb3llZCAmJgogICAgICAgICAgICAhX3BsYXRmb3JtLmluamVjdG9yLmdldChBTExPV19NVUxUSVBMRV9QTEFURk9STVMsIGZhbHNlKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1RoZXJlIGNhbiBiZSBvbmx5IG9uZSBwbGF0Zm9ybS4gRGVzdHJveSB0aGUgcHJldmlvdXMgb25lIHRvIGNyZWF0ZSBhIG5ldyBvbmUuJyk7CiAgICAgICAgfQogICAgICAgIHB1Ymxpc2hEZWZhdWx0R2xvYmFsVXRpbHMkMSgpOwogICAgICAgIF9wbGF0Zm9ybSA9IGluamVjdG9yLmdldChQbGF0Zm9ybVJlZik7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluaXRzID0gaW5qZWN0b3IuZ2V0KFBMQVRGT1JNX0lOSVRJQUxJWkVSLCBudWxsKTsKICAgICAgICBpZiAoaW5pdHMpCiAgICAgICAgICAgIGluaXRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluaXQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpbml0KSA9PiBpbml0KCkpKTsKICAgICAgICByZXR1cm4gX3BsYXRmb3JtOwogICAgfQogICAgLyoqCiAgICAgKiBDcmVhdGVzIGEgZmFjdG9yeSBmb3IgYSBwbGF0Zm9ybQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IHBhcmVudFBsYXRmb3JtRmFjdG9yeQogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez89fSBwcm92aWRlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShwYXJlbnRQbGF0Zm9ybUZhY3RvcnksIG5hbWUsIHByb3ZpZGVycyA9IFtdKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRlc2MgPSBgUGxhdGZvcm06ICR7bmFtZX1gOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXJrZXIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oZGVzYyk7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBleHRyYVByb3ZpZGVycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGV4dHJhUHJvdmlkZXJzID0gW10pID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGxhdGZvcm0gPSBnZXRQbGF0Zm9ybSgpOwogICAgICAgICAgICBpZiAoIXBsYXRmb3JtIHx8IHBsYXRmb3JtLmluamVjdG9yLmdldChBTExPV19NVUxUSVBMRV9QTEFURk9STVMsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgaWYgKHBhcmVudFBsYXRmb3JtRmFjdG9yeSkgewogICAgICAgICAgICAgICAgICAgIHBhcmVudFBsYXRmb3JtRmFjdG9yeShwcm92aWRlcnMuY29uY2F0KGV4dHJhUHJvdmlkZXJzKS5jb25jYXQoeyBwcm92aWRlOiBtYXJrZXIsIHVzZVZhbHVlOiB0cnVlIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmplY3RlZFByb3ZpZGVycyA9IHByb3ZpZGVycy5jb25jYXQoZXh0cmFQcm92aWRlcnMpLmNvbmNhdCh7IHByb3ZpZGU6IG1hcmtlciwgdXNlVmFsdWU6IHRydWUgfSwgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBJTkpFQ1RPUl9TQ09QRSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6ICdwbGF0Zm9ybScKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBjcmVhdGVQbGF0Zm9ybShJbmplY3Rvci5jcmVhdGUoeyBwcm92aWRlcnM6IGluamVjdGVkUHJvdmlkZXJzLCBuYW1lOiBkZXNjIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXNzZXJ0UGxhdGZvcm0obWFya2VyKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHRoYXQgdGhlcmUgY3VycmVudGx5IGlzIGEgcGxhdGZvcm0gd2hpY2ggY29udGFpbnMgdGhlIGdpdmVuIHRva2VuIGFzIGEgcHJvdmlkZXIuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gcmVxdWlyZWRUb2tlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0UGxhdGZvcm0ocmVxdWlyZWRUb2tlbikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwbGF0Zm9ybSA9IGdldFBsYXRmb3JtKCk7CiAgICAgICAgaWYgKCFwbGF0Zm9ybSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIHBsYXRmb3JtIGV4aXN0cyEnKTsKICAgICAgICB9CiAgICAgICAgaWYgKCFwbGF0Zm9ybS5pbmplY3Rvci5nZXQocmVxdWlyZWRUb2tlbiwgbnVsbCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHBsYXRmb3JtIHdpdGggYSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBoYXMgYmVlbiBjcmVhdGVkLiBQbGVhc2UgZGVzdHJveSBpdCBmaXJzdC4nKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBsYXRmb3JtOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHBsYXRmb3JtLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQbGF0Zm9ybSgpIHsKICAgICAgICByZXR1cm4gX3BsYXRmb3JtICYmICFfcGxhdGZvcm0uZGVzdHJveWVkID8gX3BsYXRmb3JtIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogVGhlIEFuZ3VsYXIgcGxhdGZvcm0gaXMgdGhlIGVudHJ5IHBvaW50IGZvciBBbmd1bGFyIG9uIGEgd2ViIHBhZ2UuIEVhY2ggcGFnZQogICAgICogaGFzIGV4YWN0bHkgb25lIHBsYXRmb3JtLCBhbmQgc2VydmljZXMgKHN1Y2ggYXMgcmVmbGVjdGlvbikgd2hpY2ggYXJlIGNvbW1vbgogICAgICogdG8gZXZlcnkgQW5ndWxhciBhcHBsaWNhdGlvbiBydW5uaW5nIG9uIHRoZSBwYWdlIGFyZSBib3VuZCBpbiBpdHMgc2NvcGUuCiAgICAgKgogICAgICogQSBwYWdlJ3MgcGxhdGZvcm0gaXMgaW5pdGlhbGl6ZWQgaW1wbGljaXRseSB3aGVuIGEgcGxhdGZvcm0gaXMgY3JlYXRlZCB2aWEgYSBwbGF0Zm9ybSBmYWN0b3J5CiAgICAgKiAoZS5nLiB7XEBsaW5rIHBsYXRmb3JtQnJvd3Nlcn0pLCBvciBleHBsaWNpdGx5IGJ5IGNhbGxpbmcgdGhlIHtcQGxpbmsgY3JlYXRlUGxhdGZvcm19IGZ1bmN0aW9uLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFBsYXRmb3JtUmVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfaW5qZWN0b3IpIHsKICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgICAgIHRoaXMuX21vZHVsZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveUxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgXEBOZ01vZHVsZWAgZm9yIHRoZSBnaXZlbiBwbGF0Zm9ybQogICAgICAgICAqIGZvciBvZmZsaW5lIGNvbXBpbGF0aW9uLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogIyMjIFNpbXBsZSBFeGFtcGxlCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogbXlfbW9kdWxlLnRzOgogICAgICAgICAqCiAgICAgICAgICogXEBOZ01vZHVsZSh7CiAgICAgICAgICogICBpbXBvcnRzOiBbQnJvd3Nlck1vZHVsZV0KICAgICAgICAgKiB9KQogICAgICAgICAqIGNsYXNzIE15TW9kdWxlIHt9CiAgICAgICAgICoKICAgICAgICAgKiBtYWluLnRzOgogICAgICAgICAqIGltcG9ydCB7TXlNb2R1bGVOZ0ZhY3Rvcnl9IGZyb20gJy4vbXlfbW9kdWxlLm5nZmFjdG9yeSc7CiAgICAgICAgICogaW1wb3J0IHtwbGF0Zm9ybUJyb3dzZXJ9IGZyb20gJ1xAYW5ndWxhci9wbGF0Zm9ybS1icm93c2VyJzsKICAgICAgICAgKgogICAgICAgICAqIGxldCBtb2R1bGVSZWYgPSBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGVGYWN0b3J5KE15TW9kdWxlTmdGYWN0b3J5KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBAdGVtcGxhdGUgTQogICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlRmFjdG9yeQogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJvb3RzdHJhcE1vZHVsZUZhY3RvcnkobW9kdWxlRmFjdG9yeSwgb3B0aW9ucykgewogICAgICAgICAgICAvLyBOb3RlOiBXZSBuZWVkIHRvIGNyZWF0ZSB0aGUgTmdab25lIF9iZWZvcmVfIHdlIGluc3RhbnRpYXRlIHRoZSBtb2R1bGUsCiAgICAgICAgICAgIC8vIGFzIGluc3RhbnRpYXRpbmcgdGhlIG1vZHVsZSBjcmVhdGVzIHNvbWUgcHJvdmlkZXJzIGVhZ2VybHkuCiAgICAgICAgICAgIC8vIFNvIHdlIGNyZWF0ZSBhIG1pbmkgcGFyZW50IGluamVjdG9yIHRoYXQganVzdCBjb250YWlucyB0aGUgbmV3IE5nWm9uZSBhbmQKICAgICAgICAgICAgLy8gcGFzcyB0aGF0IGFzIHBhcmVudCB0byB0aGUgTmdNb2R1bGVGYWN0b3J5LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5nWm9uZU9wdGlvbiA9IG9wdGlvbnMgPyBvcHRpb25zLm5nWm9uZSA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZ1pvbmVFdmVudENvYWxlc2NpbmcgPSAob3B0aW9ucyAmJiBvcHRpb25zLm5nWm9uZUV2ZW50Q29hbGVzY2luZykgfHwgZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgbmdab25lID0gZ2V0Tmdab25lKG5nWm9uZU9wdGlvbiwgbmdab25lRXZlbnRDb2FsZXNjaW5nKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm92aWRlcnMgPSBbeyBwcm92aWRlOiBOZ1pvbmUsIHVzZVZhbHVlOiBuZ1pvbmUgfV07CiAgICAgICAgICAgIC8vIEF0dGVudGlvbjogRG9uJ3QgdXNlIEFwcGxpY2F0aW9uUmVmLnJ1biBoZXJlLAogICAgICAgICAgICAvLyBhcyB3ZSB3YW50IHRvIGJlIHN1cmUgdGhhdCBhbGwgcG9zc2libGUgY29uc3RydWN0b3IgY2FsbHMgYXJlIGluc2lkZSBgbmdab25lLnJ1bmAhCiAgICAgICAgICAgIHJldHVybiBuZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5nWm9uZUluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsgcHJvdmlkZXJzOiBwcm92aWRlcnMsIHBhcmVudDogdGhpcy5pbmplY3RvciwgbmFtZTogbW9kdWxlRmFjdG9yeS5tb2R1bGVUeXBlLm5hbWUgfSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtb2R1bGVSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAobW9kdWxlRmFjdG9yeS5jcmVhdGUobmdab25lSW5qZWN0b3IpKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBleGNlcHRpb25IYW5kbGVyID0gbW9kdWxlUmVmLmluamVjdG9yLmdldChFcnJvckhhbmRsZXIsIG51bGwpOwogICAgICAgICAgICAgICAgaWYgKCFleGNlcHRpb25IYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdObyBFcnJvckhhbmRsZXIuIElzIHBsYXRmb3JtIG1vZHVsZSAoQnJvd3Nlck1vZHVsZSkgaW5jbHVkZWQ/Jyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtb2R1bGVSZWYub25EZXN0cm95KCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHJlbW92ZSh0aGlzLl9tb2R1bGVzLCBtb2R1bGVSZWYpKSk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAobmdab25lKSkucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKG5nWm9uZSkpLm9uRXJyb3Iuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgICAgICBuZXh0OiAoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbkhhbmRsZXIuaGFuZGxlRXJyb3IoZXJyb3IpOwogICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIF9jYWxsQW5kUmVwb3J0VG9FcnJvckhhbmRsZXIoZXhjZXB0aW9uSGFuZGxlciwgKC8qKiBAdHlwZSB7P30gKi8gKG5nWm9uZSkpLCAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGluaXRTdGF0dXMgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KEFwcGxpY2F0aW9uSW5pdFN0YXR1cyk7CiAgICAgICAgICAgICAgICAgICAgaW5pdFN0YXR1cy5ydW5Jbml0aWFsaXplcnMoKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5pdFN0YXR1cy5kb25lUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl2eUVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBgTE9DQUxFX0lEYCBwcm92aWRlciBpcyBkZWZpbmVkIGF0IGJvb3RzdHJhcCB0aGVuIHdlIHNldCB0aGUgdmFsdWUgZm9yIGl2eQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9jYWxlSWQgPSBtb2R1bGVSZWYuaW5qZWN0b3IuZ2V0KExPQ0FMRV9JRCQxLCBERUZBVUxUX0xPQ0FMRV9JRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRMb2NhbGVJZChsb2NhbGVJZCB8fCBERUZBVUxUX0xPQ0FMRV9JRCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlRG9Cb290c3RyYXAobW9kdWxlUmVmKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZVJlZjsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBvZiBhbiBgXEBOZ01vZHVsZWAgZm9yIGEgZ2l2ZW4gcGxhdGZvcm0gdXNpbmcgdGhlIGdpdmVuIHJ1bnRpbWUgY29tcGlsZXIuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgU2ltcGxlIEV4YW1wbGUKICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBcQE5nTW9kdWxlKHsKICAgICAgICAgKiAgIGltcG9ydHM6IFtCcm93c2VyTW9kdWxlXQogICAgICAgICAqIH0pCiAgICAgICAgICogY2xhc3MgTXlNb2R1bGUge30KICAgICAgICAgKgogICAgICAgICAqIGxldCBtb2R1bGVSZWYgPSBwbGF0Zm9ybUJyb3dzZXIoKS5ib290c3RyYXBNb2R1bGUoTXlNb2R1bGUpOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHRlbXBsYXRlIE0KICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZVR5cGUKICAgICAgICAgKiBAcGFyYW0gez89fSBjb21waWxlck9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJvb3RzdHJhcE1vZHVsZShtb2R1bGVUeXBlLCBjb21waWxlck9wdGlvbnMgPSBbXSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBvcHRpb25zUmVkdWNlcih7fSwgY29tcGlsZXJPcHRpb25zKTsKICAgICAgICAgICAgcmV0dXJuIGNvbXBpbGVOZ01vZHVsZUZhY3RvcnkodGhpcy5pbmplY3Rvciwgb3B0aW9ucywgbW9kdWxlVHlwZSkKICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGVGYWN0b3J5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtb2R1bGVGYWN0b3J5ID0+IHRoaXMuYm9vdHN0cmFwTW9kdWxlRmFjdG9yeShtb2R1bGVGYWN0b3J5LCBvcHRpb25zKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbW9kdWxlUmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbW9kdWxlRG9Cb290c3RyYXAobW9kdWxlUmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXBwUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKG1vZHVsZVJlZi5pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpKSk7CiAgICAgICAgICAgIGlmIChtb2R1bGVSZWYuX2Jvb3RzdHJhcENvbXBvbmVudHMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgbW9kdWxlUmVmLl9ib290c3RyYXBDb21wb25lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmID0+IGFwcFJlZi5ib290c3RyYXAoZikpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChtb2R1bGVSZWYuaW5zdGFuY2UubmdEb0Jvb3RzdHJhcCkgewogICAgICAgICAgICAgICAgbW9kdWxlUmVmLmluc3RhbmNlLm5nRG9Cb290c3RyYXAoYXBwUmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGhlIG1vZHVsZSAke3N0cmluZ2lmeShtb2R1bGVSZWYuaW5zdGFuY2UKICAgICAgICAgICAgICAgIC5jb25zdHJ1Y3Rvcil9IHdhcyBib290c3RyYXBwZWQsIGJ1dCBpdCBkb2VzIG5vdCBkZWNsYXJlICJATmdNb2R1bGUuYm9vdHN0cmFwIiBjb21wb25lbnRzIG5vciBhICJuZ0RvQm9vdHN0cmFwIiBtZXRob2QuIGAgKwogICAgICAgICAgICAgICAgICAgIGBQbGVhc2UgZGVmaW5lIG9uZSBvZiB0aGVzZS5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9tb2R1bGVzLnB1c2gobW9kdWxlUmVmKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXIgYSBsaXN0ZW5lciB0byBiZSBjYWxsZWQgd2hlbiB0aGUgcGxhdGZvcm0gaXMgZGlzcG9zZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25EZXN0cm95KGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMucHVzaChjYWxsYmFjayk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlIHRoZSBwbGF0Zm9ybSB7XEBsaW5rIEluamVjdG9yfSwgd2hpY2ggaXMgdGhlIHBhcmVudCBpbmplY3RvciBmb3IKICAgICAgICAgKiBldmVyeSBBbmd1bGFyIGFwcGxpY2F0aW9uIG9uIHRoZSBwYWdlIGFuZCBwcm92aWRlcyBzaW5nbGV0b24gcHJvdmlkZXJzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGluamVjdG9yKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faW5qZWN0b3I7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERlc3Ryb3kgdGhlIEFuZ3VsYXIgcGxhdGZvcm0gYW5kIGFsbCBBbmd1bGFyIGFwcGxpY2F0aW9ucyBvbiB0aGUgcGFnZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhlIHBsYXRmb3JtIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkIScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21vZHVsZXMuc2xpY2UoKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBtb2R1bGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG1vZHVsZSA9PiBtb2R1bGUuZGVzdHJveSgpKSk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lMaXN0ZW5lcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGxpc3RlbmVyID0+IGxpc3RlbmVyKCkpKTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGVzdHJveWVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGVzdHJveWVkOwogICAgICAgIH0KICAgIH0KICAgIFBsYXRmb3JtUmVmLsm1ZmFjID0gZnVuY3Rpb24gUGxhdGZvcm1SZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGxhdGZvcm1SZWYpKMm1ybVpbmplY3QoSW5qZWN0b3IpKTsgfTsKICAgIFBsYXRmb3JtUmVmLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFBsYXRmb3JtUmVmLCBmYWN0b3J5OiBQbGF0Zm9ybVJlZi7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUGxhdGZvcm1SZWYuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RvciB9CiAgICBdOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5nWm9uZU9wdGlvbgogICAgICogQHBhcmFtIHs/fSBuZ1pvbmVFdmVudENvYWxlc2NpbmcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE5nWm9uZShuZ1pvbmVPcHRpb24sIG5nWm9uZUV2ZW50Q29hbGVzY2luZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbmdab25lOwogICAgICAgIGlmIChuZ1pvbmVPcHRpb24gPT09ICdub29wJykgewogICAgICAgICAgICBuZ1pvbmUgPSBuZXcgTm9vcE5nWm9uZSgpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgbmdab25lID0gKG5nWm9uZU9wdGlvbiA9PT0gJ3pvbmUuanMnID8gdW5kZWZpbmVkIDogbmdab25lT3B0aW9uKSB8fCBuZXcgTmdab25lKHsKICAgICAgICAgICAgICAgIGVuYWJsZUxvbmdTdGFja1RyYWNlOiBpc0Rldk1vZGUoKSwKICAgICAgICAgICAgICAgIHNob3VsZENvYWxlc2NlRXZlbnRDaGFuZ2VEZXRlY3Rpb246IG5nWm9uZUV2ZW50Q29hbGVzY2luZwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5nWm9uZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlcnJvckhhbmRsZXIKICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfY2FsbEFuZFJlcG9ydFRvRXJyb3JIYW5kbGVyKGVycm9ySGFuZGxlciwgbmdab25lLCBjYWxsYmFjaykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gY2FsbGJhY2soKTsKICAgICAgICAgICAgaWYgKGlzUHJvbWlzZSQxKHJlc3VsdCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQuY2F0Y2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZSkgPT4gewogICAgICAgICAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBlcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSkpKTsKICAgICAgICAgICAgICAgICAgICAvLyByZXRocm93IGFzIHRoZSBleGNlcHRpb24gaGFuZGxlciBtaWdodCBub3QgZG8gaXQKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBlcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IoZSkpKTsKICAgICAgICAgICAgLy8gcmV0aHJvdyBhcyB0aGUgZXhjZXB0aW9uIGhhbmRsZXIgbWlnaHQgbm90IGRvIGl0CiAgICAgICAgICAgIHRocm93IGU7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkc3QKICAgICAqIEBwYXJhbSB7P30gb2JqcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gb3B0aW9uc1JlZHVjZXIoZHN0LCBvYmpzKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2JqcykpIHsKICAgICAgICAgICAgZHN0ID0gb2Jqcy5yZWR1Y2Uob3B0aW9uc1JlZHVjZXIsIGRzdCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBkc3QgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRzdCksICgoLyoqIEB0eXBlIHs/fSAqLyAob2JqcykpKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkc3Q7CiAgICB9CiAgICAvKioKICAgICAqIEEgcmVmZXJlbmNlIHRvIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gcnVubmluZyBvbiBhIHBhZ2UuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICoge1xAYSBpcy1zdGFibGUtZXhhbXBsZXN9CiAgICAgKiAjIyMgaXNTdGFibGUgZXhhbXBsZXMgYW5kIGNhdmVhdHMKICAgICAqCiAgICAgKiBOb3RlIHR3byBpbXBvcnRhbnQgcG9pbnRzIGFib3V0IGBpc1N0YWJsZWAsIGRlbW9uc3RyYXRlZCBpbiB0aGUgZXhhbXBsZXMgYmVsb3c6CiAgICAgKiAtIHRoZSBhcHBsaWNhdGlvbiB3aWxsIG5ldmVyIGJlIHN0YWJsZSBpZiB5b3Ugc3RhcnQgYW55IGtpbmQKICAgICAqIG9mIHJlY3VycmVudCBhc3luY2hyb25vdXMgdGFzayB3aGVuIHRoZSBhcHBsaWNhdGlvbiBzdGFydHMKICAgICAqIChmb3IgZXhhbXBsZSBmb3IgYSBwb2xsaW5nIHByb2Nlc3MsIHN0YXJ0ZWQgd2l0aCBhIGBzZXRJbnRlcnZhbGAsIGEgYHNldFRpbWVvdXRgCiAgICAgKiBvciB1c2luZyBSeEpTIG9wZXJhdG9ycyBsaWtlIGBpbnRlcnZhbGApOwogICAgICogLSB0aGUgYGlzU3RhYmxlYCBPYnNlcnZhYmxlIHJ1bnMgb3V0c2lkZSBvZiB0aGUgQW5ndWxhciB6b25lLgogICAgICoKICAgICAqIExldCdzIGltYWdpbmUgdGhhdCB5b3Ugc3RhcnQgYSByZWN1cnJlbnQgdGFzawogICAgICogKGhlcmUgaW5jcmVtZW50aW5nIGEgY291bnRlciwgdXNpbmcgUnhKUyBgaW50ZXJ2YWxgKSwKICAgICAqIGFuZCBhdCB0aGUgc2FtZSB0aW1lIHN1YnNjcmliZSB0byBgaXNTdGFibGVgLgogICAgICoKICAgICAqIGBgYAogICAgICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZikgewogICAgICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICAgICAqICAgICAgZmlsdGVyKHN0YWJsZSA9PiBzdGFibGUpCiAgICAgKiAgICkuc3Vic2NyaWJlKCgpID0+IGNvbnNvbGUubG9nKCdBcHAgaXMgc3RhYmxlIG5vdycpOwogICAgICogICBpbnRlcnZhbCgxMDAwKS5zdWJzY3JpYmUoY291bnRlciA9PiBjb25zb2xlLmxvZyhjb3VudGVyKSk7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqIEluIHRoaXMgZXhhbXBsZSwgYGlzU3RhYmxlYCB3aWxsIG5ldmVyIGVtaXQgYHRydWVgLAogICAgICogYW5kIHRoZSB0cmFjZSAiQXBwIGlzIHN0YWJsZSBub3ciIHdpbGwgbmV2ZXIgZ2V0IGxvZ2dlZC4KICAgICAqCiAgICAgKiBJZiB5b3Ugd2FudCB0byBleGVjdXRlIHNvbWV0aGluZyB3aGVuIHRoZSBhcHAgaXMgc3RhYmxlLAogICAgICogeW91IGhhdmUgdG8gd2FpdCBmb3IgdGhlIGFwcGxpY2F0aW9uIHRvIGJlIHN0YWJsZQogICAgICogYmVmb3JlIHN0YXJ0aW5nIHlvdXIgcG9sbGluZyBwcm9jZXNzLgogICAgICoKICAgICAqIGBgYAogICAgICogY29uc3RydWN0b3IoYXBwUmVmOiBBcHBsaWNhdGlvblJlZikgewogICAgICogICBhcHBSZWYuaXNTdGFibGUucGlwZSgKICAgICAqICAgICBmaXJzdChzdGFibGUgPT4gc3RhYmxlKSwKICAgICAqICAgICB0YXAoc3RhYmxlID0+IGNvbnNvbGUubG9nKCdBcHAgaXMgc3RhYmxlIG5vdycpKSwKICAgICAqICAgICBzd2l0Y2hNYXAoKCkgPT4gaW50ZXJ2YWwoMTAwMCkpCiAgICAgKiAgICkuc3Vic2NyaWJlKGNvdW50ZXIgPT4gY29uc29sZS5sb2coY291bnRlcikpOwogICAgICogfQogICAgICogYGBgCiAgICAgKiBJbiB0aGlzIGV4YW1wbGUsIHRoZSB0cmFjZSAiQXBwIGlzIHN0YWJsZSBub3ciIHdpbGwgYmUgbG9nZ2VkCiAgICAgKiBhbmQgdGhlbiB0aGUgY291bnRlciBzdGFydHMgaW5jcmVtZW50aW5nIGV2ZXJ5IHNlY29uZC4KICAgICAqCiAgICAgKiBOb3RlIGFsc28gdGhhdCB0aGlzIE9ic2VydmFibGUgcnVucyBvdXRzaWRlIG9mIHRoZSBBbmd1bGFyIHpvbmUsCiAgICAgKiB3aGljaCBtZWFucyB0aGF0IHRoZSBjb2RlIGluIHRoZSBzdWJzY3JpcHRpb24KICAgICAqIHRvIHRoaXMgT2JzZXJ2YWJsZSB3aWxsIG5vdCB0cmlnZ2VyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLgogICAgICoKICAgICAqIExldCdzIGltYWdpbmUgdGhhdCBpbnN0ZWFkIG9mIGxvZ2dpbmcgdGhlIGNvdW50ZXIgdmFsdWUsCiAgICAgKiB5b3UgdXBkYXRlIGEgZmllbGQgb2YgeW91ciBjb21wb25lbnQKICAgICAqIGFuZCBkaXNwbGF5IGl0IGluIGl0cyB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIGNvbnN0cnVjdG9yKGFwcFJlZjogQXBwbGljYXRpb25SZWYpIHsKICAgICAqICAgYXBwUmVmLmlzU3RhYmxlLnBpcGUoCiAgICAgKiAgICAgZmlyc3Qoc3RhYmxlID0+IHN0YWJsZSksCiAgICAgKiAgICAgc3dpdGNoTWFwKCgpID0+IGludGVydmFsKDEwMDApKQogICAgICogICApLnN1YnNjcmliZShjb3VudGVyID0+IHRoaXMudmFsdWUgPSBjb3VudGVyKTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICogQXMgdGhlIGBpc1N0YWJsZWAgT2JzZXJ2YWJsZSBydW5zIG91dHNpZGUgdGhlIHpvbmUsCiAgICAgKiB0aGUgYHZhbHVlYCBmaWVsZCB3aWxsIGJlIHVwZGF0ZWQgcHJvcGVybHksCiAgICAgKiBidXQgdGhlIHRlbXBsYXRlIHdpbGwgbm90IGJlIHJlZnJlc2hlZCEKICAgICAqCiAgICAgKiBZb3UnbGwgaGF2ZSB0byBtYW51YWxseSB0cmlnZ2VyIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIHRvIHVwZGF0ZSB0aGUgdGVtcGxhdGUuCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdHJ1Y3RvcihhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCBjZDogQ2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAqICAgYXBwUmVmLmlzU3RhYmxlLnBpcGUoCiAgICAgKiAgICAgZmlyc3Qoc3RhYmxlID0+IHN0YWJsZSksCiAgICAgKiAgICAgc3dpdGNoTWFwKCgpID0+IGludGVydmFsKDEwMDApKQogICAgICogICApLnN1YnNjcmliZShjb3VudGVyID0+IHsKICAgICAqICAgICB0aGlzLnZhbHVlID0gY291bnRlcjsKICAgICAqICAgICBjZC5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgKiAgIH0pOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogT3IgbWFrZSB0aGUgc3Vic2NyaXB0aW9uIGNhbGxiYWNrIHJ1biBpbnNpZGUgdGhlIHpvbmUuCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdHJ1Y3RvcihhcHBSZWY6IEFwcGxpY2F0aW9uUmVmLCB6b25lOiBOZ1pvbmUpIHsKICAgICAqICAgYXBwUmVmLmlzU3RhYmxlLnBpcGUoCiAgICAgKiAgICAgZmlyc3Qoc3RhYmxlID0+IHN0YWJsZSksCiAgICAgKiAgICAgc3dpdGNoTWFwKCgpID0+IGludGVydmFsKDEwMDApKQogICAgICogICApLnN1YnNjcmliZShjb3VudGVyID0+IHpvbmUucnVuKCgpID0+IHRoaXMudmFsdWUgPSBjb3VudGVyKSk7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBBcHBsaWNhdGlvblJlZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gX3pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9jb25zb2xlCiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAgICAgKiBAcGFyYW0gez99IF9leGNlcHRpb25IYW5kbGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5pdFN0YXR1cwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF96b25lLCBfY29uc29sZSwgX2luamVjdG9yLCBfZXhjZXB0aW9uSGFuZGxlciwgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX2luaXRTdGF0dXMpIHsKICAgICAgICAgICAgdGhpcy5fem9uZSA9IF96b25lOwogICAgICAgICAgICB0aGlzLl9jb25zb2xlID0gX2NvbnNvbGU7CiAgICAgICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yOwogICAgICAgICAgICB0aGlzLl9leGNlcHRpb25IYW5kbGVyID0gX2V4Y2VwdGlvbkhhbmRsZXI7CiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgICAgIHRoaXMuX2luaXRTdGF0dXMgPSBfaW5pdFN0YXR1czsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2Jvb3RzdHJhcExpc3RlbmVycyA9IFtdOwogICAgICAgICAgICB0aGlzLl92aWV3cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9ydW5uaW5nVGljayA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9lbmZvcmNlTm9OZXdDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3N0YWJsZSA9IHRydWU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBHZXQgYSBsaXN0IG9mIGNvbXBvbmVudCB0eXBlcyByZWdpc3RlcmVkIHRvIHRoaXMgYXBwbGljYXRpb24uCiAgICAgICAgICAgICAqIFRoaXMgbGlzdCBpcyBwb3B1bGF0ZWQgZXZlbiBiZWZvcmUgdGhlIGNvbXBvbmVudCBpcyBjcmVhdGVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jb21wb25lbnRUeXBlcyA9IFtdOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogR2V0IGEgbGlzdCBvZiBjb21wb25lbnRzIHJlZ2lzdGVyZWQgdG8gdGhpcyBhcHBsaWNhdGlvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cyA9IFtdOwogICAgICAgICAgICB0aGlzLl9lbmZvcmNlTm9OZXdDaGFuZ2VzID0gaXNEZXZNb2RlKCk7CiAgICAgICAgICAgIHRoaXMuX3pvbmUub25NaWNyb3Rhc2tFbXB0eS5zdWJzY3JpYmUoewogICAgICAgICAgICAgICAgbmV4dDogKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNDdXJyZW50bHlTdGFibGUgPSBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvYnNlcnZlcikgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fc3RhYmxlID0gdGhpcy5fem9uZS5pc1N0YWJsZSAmJiAhdGhpcy5fem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyAmJgogICAgICAgICAgICAgICAgICAgICF0aGlzLl96b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzOwogICAgICAgICAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dCh0aGlzLl9zdGFibGUpOwogICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1N0YWJsZSA9IG5ldyBPYnNlcnZhYmxlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvYnNlcnZlcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG9ic2VydmVyKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIHN1YnNjcmlwdGlvbiB0byBvblN0YWJsZSBvdXRzaWRlIHRoZSBBbmd1bGFyIFpvbmUgc28gdGhhdAogICAgICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIGlzIHJ1biBvdXRzaWRlIHRoZSBBbmd1bGFyIFpvbmUuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgc3RhYmxlU3ViOwogICAgICAgICAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3RhYmxlU3ViID0gdGhpcy5fem9uZS5vblN0YWJsZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0Tm90SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZXJlIGFyZSBubyBwZW5kaW5nIG1hY3JvL21pY3JvIHRhc2tzIGluIHRoZSBuZXh0IHRpY2sKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdG8gYWxsb3cgZm9yIE5nWm9uZSB0byB1cGRhdGUgdGhlIHN0YXRlLgogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZU1pY3JvVGFzaygoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3N0YWJsZSAmJiAhdGhpcy5fem9uZS5oYXNQZW5kaW5nTWFjcm90YXNrcyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF0aGlzLl96b25lLmhhc1BlbmRpbmdNaWNyb3Rhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHRydWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdW5zdGFibGVTdWIgPSB0aGlzLl96b25lLm9uVW5zdGFibGUuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBOZ1pvbmUuYXNzZXJ0SW5Bbmd1bGFyWm9uZSgpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhYmxlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHN0YWJsZVN1Yi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIHVuc3RhYmxlU3ViLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuaXNTdGFibGUgPQogICAgICAgICAgICAgICAgbWVyZ2UoaXNDdXJyZW50bHlTdGFibGUsIGlzU3RhYmxlLnBpcGUoc2hhcmUoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBCb290c3RyYXAgYSBuZXcgY29tcG9uZW50IGF0IHRoZSByb290IGxldmVsIG9mIHRoZSBhcHBsaWNhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqICMjIyBCb290c3RyYXAgcHJvY2VzcwogICAgICAgICAqCiAgICAgICAgICogV2hlbiBib290c3RyYXBwaW5nIGEgbmV3IHJvb3QgY29tcG9uZW50IGludG8gYW4gYXBwbGljYXRpb24sIEFuZ3VsYXIgbW91bnRzIHRoZQogICAgICAgICAqIHNwZWNpZmllZCBhcHBsaWNhdGlvbiBjb21wb25lbnQgb250byBET00gZWxlbWVudHMgaWRlbnRpZmllZCBieSB0aGUgY29tcG9uZW50VHlwZSdzCiAgICAgICAgICogc2VsZWN0b3IgYW5kIGtpY2tzIG9mZiBhdXRvbWF0aWMgY2hhbmdlIGRldGVjdGlvbiB0byBmaW5pc2ggaW5pdGlhbGl6aW5nIHRoZSBjb21wb25lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBPcHRpb25hbGx5LCBhIGNvbXBvbmVudCBjYW4gYmUgbW91bnRlZCBvbnRvIGEgRE9NIGVsZW1lbnQgdGhhdCBkb2VzIG5vdCBtYXRjaCB0aGUKICAgICAgICAgKiBjb21wb25lbnRUeXBlJ3Mgc2VsZWN0b3IuCiAgICAgICAgICoKICAgICAgICAgKiAjIyMgRXhhbXBsZQogICAgICAgICAqIHtcQGV4YW1wbGUgY29yZS90cy9wbGF0Zm9ybS9wbGF0Zm9ybS50cyByZWdpb249J2xvbmdmb3JtJ30KICAgICAgICAgKiBAdGVtcGxhdGUgQwogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50T3JGYWN0b3J5CiAgICAgICAgICogQHBhcmFtIHs/PX0gcm9vdFNlbGVjdG9yT3JOb2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBib290c3RyYXAoY29tcG9uZW50T3JGYWN0b3J5LCByb290U2VsZWN0b3JPck5vZGUpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pbml0U3RhdHVzLmRvbmUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGJvb3RzdHJhcCBhcyB0aGVyZSBhcmUgc3RpbGwgYXN5bmNocm9ub3VzIGluaXRpYWxpemVycyBydW5uaW5nLiBCb290c3RyYXAgY29tcG9uZW50cyBpbiB0aGUgYG5nRG9Cb290c3RyYXBgIG1ldGhvZCBvZiB0aGUgcm9vdCBtb2R1bGUuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29tcG9uZW50RmFjdG9yeTsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudE9yRmFjdG9yeSBpbnN0YW5jZW9mIENvbXBvbmVudEZhY3RvcnkpIHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudEZhY3RvcnkgPSBjb21wb25lbnRPckZhY3Rvcnk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb21wb25lbnRGYWN0b3J5ID0KICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KGNvbXBvbmVudE9yRmFjdG9yeSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNvbXBvbmVudFR5cGVzLnB1c2goY29tcG9uZW50RmFjdG9yeS5jb21wb25lbnRUeXBlKTsKICAgICAgICAgICAgLy8gQ3JlYXRlIGEgZmFjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIGN1cnJlbnQgbW9kdWxlIGlmIGl0J3Mgbm90IGJvdW5kIHRvIHNvbWUgb3RoZXIKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZ01vZHVsZSA9IGlzQm91bmRUb01vZHVsZShjb21wb25lbnRGYWN0b3J5KSA/IHVuZGVmaW5lZCA6IHRoaXMuX2luamVjdG9yLmdldChOZ01vZHVsZVJlZik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0b3JPck5vZGUgPSByb290U2VsZWN0b3JPck5vZGUgfHwgY29tcG9uZW50RmFjdG9yeS5zZWxlY3RvcjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wUmVmID0gY29tcG9uZW50RmFjdG9yeS5jcmVhdGUoSW5qZWN0b3IuTlVMTCwgW10sIHNlbGVjdG9yT3JOb2RlLCBuZ01vZHVsZSk7CiAgICAgICAgICAgIGNvbXBSZWYub25EZXN0cm95KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3VubG9hZENvbXBvbmVudChjb21wUmVmKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRlc3RhYmlsaXR5ID0gY29tcFJlZi5pbmplY3Rvci5nZXQoVGVzdGFiaWxpdHksIG51bGwpOwogICAgICAgICAgICBpZiAodGVzdGFiaWxpdHkpIHsKICAgICAgICAgICAgICAgIGNvbXBSZWYuaW5qZWN0b3IuZ2V0KFRlc3RhYmlsaXR5UmVnaXN0cnkpCiAgICAgICAgICAgICAgICAgICAgLnJlZ2lzdGVyQXBwbGljYXRpb24oY29tcFJlZi5sb2NhdGlvbi5uYXRpdmVFbGVtZW50LCB0ZXN0YWJpbGl0eSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbG9hZENvbXBvbmVudChjb21wUmVmKTsKICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb25zb2xlLmxvZyhgQW5ndWxhciBpcyBydW5uaW5nIGluIHRoZSBkZXZlbG9wbWVudCBtb2RlLiBDYWxsIGVuYWJsZVByb2RNb2RlKCkgdG8gZW5hYmxlIHRoZSBwcm9kdWN0aW9uIG1vZGUuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNvbXBSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEludm9rZSB0aGlzIG1ldGhvZCB0byBleHBsaWNpdGx5IHByb2Nlc3MgY2hhbmdlIGRldGVjdGlvbiBhbmQgaXRzIHNpZGUtZWZmZWN0cy4KICAgICAgICAgKgogICAgICAgICAqIEluIGRldmVsb3BtZW50IG1vZGUsIGB0aWNrKClgIGFsc28gcGVyZm9ybXMgYSBzZWNvbmQgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSB0byBlbnN1cmUgdGhhdCBubwogICAgICAgICAqIGZ1cnRoZXIgY2hhbmdlcyBhcmUgZGV0ZWN0ZWQuIElmIGFkZGl0aW9uYWwgY2hhbmdlcyBhcmUgcGlja2VkIHVwIGR1cmluZyB0aGlzIHNlY29uZCBjeWNsZSwKICAgICAgICAgKiBiaW5kaW5ncyBpbiB0aGUgYXBwIGhhdmUgc2lkZS1lZmZlY3RzIHRoYXQgY2Fubm90IGJlIHJlc29sdmVkIGluIGEgc2luZ2xlIGNoYW5nZSBkZXRlY3Rpb24KICAgICAgICAgKiBwYXNzLgogICAgICAgICAqIEluIHRoaXMgY2FzZSwgQW5ndWxhciB0aHJvd3MgYW4gZXJyb3IsIHNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuIG9ubHkgaGF2ZSBvbmUgY2hhbmdlCiAgICAgICAgICogZGV0ZWN0aW9uIHBhc3MgZHVyaW5nIHdoaWNoIGFsbCBjaGFuZ2UgZGV0ZWN0aW9uIG11c3QgY29tcGxldGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0aWNrKCkgewogICAgICAgICAgICBpZiAodGhpcy5fcnVubmluZ1RpY2spIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXBwbGljYXRpb25SZWYudGljayBpcyBjYWxsZWQgcmVjdXJzaXZlbHknKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdGhpcy5fcnVubmluZ1RpY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLl92aWV3cykgewogICAgICAgICAgICAgICAgICAgIHZpZXcuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VuZm9yY2VOb05ld0NoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCB2aWV3IG9mIHRoaXMuX3ZpZXdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuY2hlY2tOb0NoYW5nZXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgIC8vIEF0dGVudGlvbjogRG9uJ3QgcmV0aHJvdyBhcyBpdCBjb3VsZCBjYW5jZWwgc3Vic2NyaXB0aW9ucyB0byBPYnNlcnZhYmxlcyEKICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fZXhjZXB0aW9uSGFuZGxlci5oYW5kbGVFcnJvcihlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgdGhpcy5fcnVubmluZ1RpY2sgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2hlcyBhIHZpZXcgc28gdGhhdCBpdCB3aWxsIGJlIGRpcnR5IGNoZWNrZWQuCiAgICAgICAgICogVGhlIHZpZXcgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGRldGFjaGVkIHdoZW4gaXQgaXMgZGVzdHJveWVkLgogICAgICAgICAqIFRoaXMgd2lsbCB0aHJvdyBpZiB0aGUgdmlldyBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIGEgVmlld0NvbnRhaW5lci4KICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaFZpZXcodmlld1JlZikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXcgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdSZWYpKSk7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnB1c2godmlldyk7CiAgICAgICAgICAgIHZpZXcuYXR0YWNoVG9BcHBSZWYodGhpcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGFjaGVzIGEgdmlldyBmcm9tIGRpcnR5IGNoZWNraW5nIGFnYWluLgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld1JlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoVmlldyh2aWV3UmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmlldyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodmlld1JlZikpKTsKICAgICAgICAgICAgcmVtb3ZlKHRoaXMuX3ZpZXdzLCB2aWV3KTsKICAgICAgICAgICAgdmlldy5kZXRhY2hGcm9tQXBwUmVmKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9sb2FkQ29tcG9uZW50KGNvbXBvbmVudFJlZikgewogICAgICAgICAgICB0aGlzLmF0dGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTsKICAgICAgICAgICAgdGhpcy50aWNrKCk7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50cy5wdXNoKGNvbXBvbmVudFJlZik7CiAgICAgICAgICAgIC8vIEdldCB0aGUgbGlzdGVuZXJzIGxhemlseSB0byBwcmV2ZW50IERJIGN5Y2xlcy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaXN0ZW5lcnMgPSB0aGlzLl9pbmplY3Rvci5nZXQoQVBQX0JPT1RTVFJBUF9MSVNURU5FUiwgW10pLmNvbmNhdCh0aGlzLl9ib290c3RyYXBMaXN0ZW5lcnMpOwogICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChsaXN0ZW5lcikgPT4gbGlzdGVuZXIoY29tcG9uZW50UmVmKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50UmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdW5sb2FkQ29tcG9uZW50KGNvbXBvbmVudFJlZikgewogICAgICAgICAgICB0aGlzLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTsKICAgICAgICAgICAgcmVtb3ZlKHRoaXMuY29tcG9uZW50cywgY29tcG9uZW50UmVmKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIC8vIFRPRE8oYWx4aHViKTogRGlzcG9zZSBvZiB0aGUgTmdab25lLgogICAgICAgICAgICB0aGlzLl92aWV3cy5zbGljZSgpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2aWV3KSA9PiB2aWV3LmRlc3Ryb3koKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYXR0YWNoZWQgdmlld3MuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmlld0NvdW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlld3MubGVuZ3RoOwogICAgICAgIH0KICAgIH0KICAgIEFwcGxpY2F0aW9uUmVmLsm1ZmFjID0gZnVuY3Rpb24gQXBwbGljYXRpb25SZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwbGljYXRpb25SZWYpKMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChDb25zb2xlKSwgybXJtWluamVjdChJbmplY3RvciksIMm1ybVpbmplY3QoRXJyb3JIYW5kbGVyKSwgybXJtWluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1aW5qZWN0KEFwcGxpY2F0aW9uSW5pdFN0YXR1cykpOyB9OwogICAgQXBwbGljYXRpb25SZWYuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQXBwbGljYXRpb25SZWYsIGZhY3Rvcnk6IEFwcGxpY2F0aW9uUmVmLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBcHBsaWNhdGlvblJlZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogQ29uc29sZSB9LAogICAgICAgIHsgdHlwZTogSW5qZWN0b3IgfSwKICAgICAgICB7IHR5cGU6IEVycm9ySGFuZGxlciB9LAogICAgICAgIHsgdHlwZTogQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyIH0sCiAgICAgICAgeyB0eXBlOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMgfQogICAgXTsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gbGlzdAogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlKGxpc3QsIGVsKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdC5pbmRleE9mKGVsKTsKICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICBsaXN0LnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBhcmdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfbGFzdERlZmluZWQoYXJncykgewogICAgICAgIGZvciAobGV0IGkgPSBhcmdzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgIGlmIChhcmdzW2ldICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcmdzW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGFydHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9tZXJnZUFycmF5cyhwYXJ0cykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICBwYXJ0cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChwYXJ0KSA9PiBwYXJ0ICYmIHJlc3VsdC5wdXNoKC4uLnBhcnQpKSk7CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2xpbmtlci9zeXN0ZW1fanNfbmdfbW9kdWxlX2ZhY3RvcnlfbG9hZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9TRVBBUkFUT1IgPSAnIyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBGQUNUT1JZX0NMQVNTX1NVRkZJWCA9ICdOZ0ZhY3RvcnknOwogICAgLyoqCiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLgogICAgICogdG9rZW4uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBkZXByZWNhdGVkIHRoZSBgc3RyaW5nYCBmb3JtIG9mIGBsb2FkQ2hpbGRyZW5gIGlzIGRlcHJlY2F0ZWQsIGFuZCBgU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZ2AKICAgICAqIGlzIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLiBTZWUgYExvYWRDaGlsZHJlbmAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyQ29uZmlnIHsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERFRkFVTFRfQ09ORklHID0gewogICAgICAgIGZhY3RvcnlQYXRoUHJlZml4OiAnJywKICAgICAgICBmYWN0b3J5UGF0aFN1ZmZpeDogJy5uZ2ZhY3RvcnknLAogICAgfTsKICAgIC8qKgogICAgICogTmdNb2R1bGVGYWN0b3J5TG9hZGVyIHRoYXQgdXNlcyBTeXN0ZW1KUyB0byBsb2FkIE5nTW9kdWxlRmFjdG9yeQogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBkZXByZWNhdGVkIHRoZSBgc3RyaW5nYCBmb3JtIG9mIGBsb2FkQ2hpbGRyZW5gIGlzIGRlcHJlY2F0ZWQsIGFuZCBgU3lzdGVtSnNOZ01vZHVsZUxvYWRlcmAgaXMKICAgICAqIHBhcnQgb2YgaXRzIGltcGxlbWVudGF0aW9uLiBTZWUgYExvYWRDaGlsZHJlbmAgZm9yIG1vcmUgZGV0YWlscy4KICAgICAqLwogICAgY2xhc3MgU3lzdGVtSnNOZ01vZHVsZUxvYWRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfY29tcGlsZXIKICAgICAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfY29tcGlsZXIsIGNvbmZpZykgewogICAgICAgICAgICB0aGlzLl9jb21waWxlciA9IF9jb21waWxlcjsKICAgICAgICAgICAgdGhpcy5fY29uZmlnID0gY29uZmlnIHx8IERFRkFVTFRfQ09ORklHOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxvYWQocGF0aCkgewogICAgICAgICAgICByZXR1cm4gIHRoaXMubG9hZEFuZENvbXBpbGUocGF0aCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsb2FkQW5kQ29tcGlsZShwYXRoKSB7CiAgICAgICAgICAgIGxldCBbbW9kdWxlLCBleHBvcnROYW1lXSA9IHBhdGguc3BsaXQoX1NFUEFSQVRPUik7CiAgICAgICAgICAgIGlmIChleHBvcnROYW1lID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIGV4cG9ydE5hbWUgPSAnZGVmYXVsdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQobW9kdWxlKQogICAgICAgICAgICAgICAgLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG1vZHVsZSkgPT4gbW9kdWxlW2V4cG9ydE5hbWVdKSkKICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodHlwZSkgPT4gY2hlY2tOb3RFbXB0eSh0eXBlLCBtb2R1bGUsIGV4cG9ydE5hbWUpKSkKICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodHlwZSkgPT4gdGhpcy5fY29tcGlsZXIuY29tcGlsZU1vZHVsZUFzeW5jKHR5cGUpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsb2FkRmFjdG9yeShwYXRoKSB7CiAgICAgICAgICAgIGxldCBbbW9kdWxlLCBleHBvcnROYW1lXSA9IHBhdGguc3BsaXQoX1NFUEFSQVRPUik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGZhY3RvcnlDbGFzc1N1ZmZpeCA9IEZBQ1RPUllfQ0xBU1NfU1VGRklYOwogICAgICAgICAgICBpZiAoZXhwb3J0TmFtZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBleHBvcnROYW1lID0gJ2RlZmF1bHQnOwogICAgICAgICAgICAgICAgZmFjdG9yeUNsYXNzU3VmZml4ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFN5c3RlbS5pbXBvcnQodGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoUHJlZml4ICsgbW9kdWxlICsgdGhpcy5fY29uZmlnLmZhY3RvcnlQYXRoU3VmZml4KQogICAgICAgICAgICAgICAgLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG1vZHVsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG1vZHVsZSkgPT4gbW9kdWxlW2V4cG9ydE5hbWUgKyBmYWN0b3J5Q2xhc3NTdWZmaXhdKSkKICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmYWN0b3J5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmFjdG9yeSkgPT4gY2hlY2tOb3RFbXB0eShmYWN0b3J5LCBtb2R1bGUsIGV4cG9ydE5hbWUpKSk7CiAgICAgICAgfQogICAgfQogICAgU3lzdGVtSnNOZ01vZHVsZUxvYWRlci7JtWZhYyA9IGZ1bmN0aW9uIFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3lzdGVtSnNOZ01vZHVsZUxvYWRlcikoybXJtWluamVjdChDb21waWxlciksIMm1ybVpbmplY3QoU3lzdGVtSnNOZ01vZHVsZUxvYWRlckNvbmZpZywgOCkpOyB9OwogICAgU3lzdGVtSnNOZ01vZHVsZUxvYWRlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLCBmYWN0b3J5OiBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTeXN0ZW1Kc05nTW9kdWxlTG9hZGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQ29tcGlsZXIgfSwKICAgICAgICB7IHR5cGU6IFN5c3RlbUpzTmdNb2R1bGVMb2FkZXJDb25maWcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7P30gbW9kdWxlUGF0aAogICAgICogQHBhcmFtIHs/fSBleHBvcnROYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja05vdEVtcHR5KHZhbHVlLCBtb2R1bGVQYXRoLCBleHBvcnROYW1lKSB7CiAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kICcke2V4cG9ydE5hbWV9JyBpbiAnJHttb2R1bGVQYXRofSdgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9uYXRpdmVOb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXREZWJ1Z05vZGVSMl9fUE9TVF9SM19fKF9uYXRpdmVOb2RlKSB7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXREZWJ1Z05vZGVSMiA9IGdldERlYnVnTm9kZVIyX19QT1NUX1IzX187CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jaGFuZ2VfZGV0ZWN0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3BsYXRmb3JtX2NvcmVfcHJvdmlkZXJzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9DT1JFX1BMQVRGT1JNX1BST1ZJREVSUyA9IFsKICAgICAgICAvLyBTZXQgYSBkZWZhdWx0IHBsYXRmb3JtIG5hbWUgZm9yIHBsYXRmb3JtcyB0aGF0IGRvbid0IHNldCBpdCBleHBsaWNpdGx5LgogICAgICAgIHsgcHJvdmlkZTogUExBVEZPUk1fSUQsIHVzZVZhbHVlOiAndW5rbm93bicgfSwKICAgICAgICB7IHByb3ZpZGU6IFBsYXRmb3JtUmVmLCBkZXBzOiBbSW5qZWN0b3JdIH0sCiAgICAgICAgeyBwcm92aWRlOiBUZXN0YWJpbGl0eVJlZ2lzdHJ5LCBkZXBzOiBbXSB9LAogICAgICAgIHsgcHJvdmlkZTogQ29uc29sZSwgZGVwczogW10gfSwKICAgIF07CiAgICAvKioKICAgICAqIFRoaXMgcGxhdGZvcm0gaGFzIHRvIGJlIGluY2x1ZGVkIGluIGFueSBvdGhlciBwbGF0Zm9ybQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgcGxhdGZvcm1Db3JlID0gY3JlYXRlUGxhdGZvcm1GYWN0b3J5KG51bGwsICdjb3JlJywgX0NPUkVfUExBVEZPUk1fUFJPVklERVJTKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL2FwcGxpY2F0aW9uX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9pdGVyYWJsZURpZmZlcnNGYWN0b3J5KCkgewogICAgICAgIHJldHVybiBkZWZhdWx0SXRlcmFibGVEaWZmZXJzOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfa2V5VmFsdWVEaWZmZXJzRmFjdG9yeSgpIHsKICAgICAgICByZXR1cm4gZGVmYXVsdEtleVZhbHVlRGlmZmVyczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfbG9jYWxlRmFjdG9yeShsb2NhbGUpIHsKICAgICAgICBsb2NhbGUgPSBsb2NhbGUgfHwgZ2V0R2xvYmFsTG9jYWxlKCk7CiAgICAgICAgewogICAgICAgICAgICBzZXRMb2NhbGVJZChsb2NhbGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbG9jYWxlOwogICAgfQogICAgLyoqCiAgICAgKiBXb3JrIG91dCB0aGUgbG9jYWxlIGZyb20gdGhlIHBvdGVudGlhbCBnbG9iYWwgcHJvcGVydGllcy4KICAgICAqCiAgICAgKiAqIENsb3N1cmUgQ29tcGlsZXI6IHVzZSBgZ29vZy5MT0NBTEVgLgogICAgICogKiBJdnkgZW5hYmxlZDogdXNlIGAkbG9jYWxpemUubG9jYWxlYAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0R2xvYmFsTG9jYWxlKCkgewogICAgICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICd1bmRlZmluZWQnICYmIG5nSTE4bkNsb3N1cmVNb2RlICYmCiAgICAgICAgICAgIHR5cGVvZiBnb29nICE9PSAndW5kZWZpbmVkJyAmJiBnb29nLkxPQ0FMRSAhPT0gJ2VuJykgewogICAgICAgICAgICAvLyAqIFRoZSBkZWZhdWx0IGBnb29nLkxPQ0FMRWAgdmFsdWUgaXMgYGVuYCwgd2hpbGUgQW5ndWxhciB1c2VkIGBlbi1VU2AuCiAgICAgICAgICAgIC8vICogSW4gb3JkZXIgdG8gcHJlc2VydmUgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdlIHVzZSBBbmd1bGFyIGRlZmF1bHQgdmFsdWUgb3ZlcgogICAgICAgICAgICAvLyAgIENsb3N1cmUgQ29tcGlsZXIncyBvbmUuCiAgICAgICAgICAgIHJldHVybiBnb29nLkxPQ0FMRTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIEtFRVAgYHR5cGVvZiAkbG9jYWxpemUgIT09ICd1bmRlZmluZWQnICYmICRsb2NhbGl6ZS5sb2NhbGVgIElOIFNZTkMgV0lUSCBUSEUgTE9DQUxJWkUKICAgICAgICAgICAgLy8gQ09NUElMRS1USU1FIElOTElORVIuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vICogRHVyaW5nIGNvbXBpbGUgdGltZSBpbmxpbmluZyBvZiB0cmFuc2xhdGlvbnMgdGhlIGV4cHJlc3Npb24gd2lsbCBiZSByZXBsYWNlZAogICAgICAgICAgICAvLyAgIHdpdGggYSBzdHJpbmcgbGl0ZXJhbCB0aGF0IGlzIHRoZSBjdXJyZW50IGxvY2FsZS4gT3RoZXIgZm9ybXMgb2YgdGhpcyBleHByZXNzaW9uIGFyZSBub3QKICAgICAgICAgICAgLy8gICBndWFyYW50ZWVkIHRvIGJlIHJlcGxhY2VkLgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyAqIER1cmluZyBydW50aW1lIHRyYW5zbGF0aW9uIGV2YWx1YXRpb24sIHRoZSBkZXZlbG9wZXIgaXMgcmVxdWlyZWQgdG8gc2V0IGAkbG9jYWxpemUubG9jYWxlYAogICAgICAgICAgICAvLyAgIGlmIHJlcXVpcmVkLCBvciBqdXN0IHRvIHByb3ZpZGUgdGhlaXIgb3duIGBMT0NBTEVfSURgIHByb3ZpZGVyLgogICAgICAgICAgICByZXR1cm4gKCB0eXBlb2YgJGxvY2FsaXplICE9PSAndW5kZWZpbmVkJyAmJiAkbG9jYWxpemUubG9jYWxlKSB8fAogICAgICAgICAgICAgICAgREVGQVVMVF9MT0NBTEVfSUQ7CiAgICAgICAgfQogICAgfQogICAgY29uc3QgybUwJGcgPSBVU0RfQ1VSUkVOQ1lfQ09ERTsKICAgIC8qKgogICAgICogQSBidWlsdC1pbiBbZGVwZW5kZW5jeSBpbmplY3Rpb24gdG9rZW5dKGd1aWRlL2dsb3NzYXJ5I2RpLXRva2VuKQogICAgICogdGhhdCBpcyB1c2VkIHRvIGNvbmZpZ3VyZSB0aGUgcm9vdCBpbmplY3RvciBmb3IgYm9vdHN0cmFwcGluZy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBBUFBMSUNBVElPTl9NT0RVTEVfUFJPVklERVJTID0gWwogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogQXBwbGljYXRpb25SZWYsCiAgICAgICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvblJlZiwKICAgICAgICAgICAgZGVwczogW05nWm9uZSwgQ29uc29sZSwgSW5qZWN0b3IsIEVycm9ySGFuZGxlciwgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLCBBcHBsaWNhdGlvbkluaXRTdGF0dXNdCiAgICAgICAgfSwKICAgICAgICB7IHByb3ZpZGU6IFNDSEVEVUxFUiwgZGVwczogW05nWm9uZV0sIHVzZUZhY3Rvcnk6IHpvbmVTY2hlZHVsZXJGYWN0b3J5IH0sCiAgICAgICAgewogICAgICAgICAgICBwcm92aWRlOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsCiAgICAgICAgICAgIHVzZUNsYXNzOiBBcHBsaWNhdGlvbkluaXRTdGF0dXMsCiAgICAgICAgICAgIGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIEFQUF9JTklUSUFMSVpFUl1dCiAgICAgICAgfSwKICAgICAgICB7IHByb3ZpZGU6IENvbXBpbGVyLCB1c2VDbGFzczogQ29tcGlsZXIsIGRlcHM6IFtdIH0sCiAgICAgICAgQVBQX0lEX1JBTkRPTV9QUk9WSURFUiwKICAgICAgICB7IHByb3ZpZGU6IEl0ZXJhYmxlRGlmZmVycywgdXNlRmFjdG9yeTogX2l0ZXJhYmxlRGlmZmVyc0ZhY3RvcnksIGRlcHM6IFtdIH0sCiAgICAgICAgeyBwcm92aWRlOiBLZXlWYWx1ZURpZmZlcnMsIHVzZUZhY3Rvcnk6IF9rZXlWYWx1ZURpZmZlcnNGYWN0b3J5LCBkZXBzOiBbXSB9LAogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogTE9DQUxFX0lEJDEsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9sb2NhbGVGYWN0b3J5LAogICAgICAgICAgICBkZXBzOiBbW25ldyBJbmplY3QoTE9DQUxFX0lEJDEpLCBuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCldXQogICAgICAgIH0sCiAgICAgICAgeyBwcm92aWRlOiBERUZBVUxUX0NVUlJFTkNZX0NPREUsIHVzZVZhbHVlOiDJtTAkZyB9LAogICAgXTsKICAgIC8qKgogICAgICogU2NoZWR1bGUgd29yayBhdCBuZXh0IGF2YWlsYWJsZSBzbG90LgogICAgICoKICAgICAqIEluIEl2eSB0aGlzIGlzIGp1c3QgYHJlcXVlc3RBbmltYXRpb25GcmFtZWAuIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbnMgd2hlbiBib290c3RyYXBwZWQKICAgICAqIHVzaW5nIGBwbGF0Zm9ybVJlZi5ib290c3RyYXBgIHdlIG5lZWQgdG8gdXNlIGBOZ1pvbmUub25TdGFibGVgIGFzIHRoZSBzY2hlZHVsaW5nIG1lY2hhbmlzbS4KICAgICAqIFRoaXMgb3ZlcnJpZGVzIHRoZSBzY2hlZHVsaW5nIG1lY2hhbmlzbSBpbiBJdnkgdG8gYE5nWm9uZS5vblN0YWJsZWAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuZ1pvbmUgTmdab25lIHRvIHVzZSBmb3Igc2NoZWR1bGluZy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHpvbmVTY2hlZHVsZXJGYWN0b3J5KG5nWm9uZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcXVldWUgPSBbXTsKICAgICAgICBuZ1pvbmUub25TdGFibGUuc3Vic2NyaWJlKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgd2hpbGUgKHF1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHF1ZXVlLnBvcCgpKSkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChmbikgewogICAgICAgICAgICBxdWV1ZS5wdXNoKGZuKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ29uZmlndXJlcyB0aGUgcm9vdCBpbmplY3RvciBmb3IgYW4gYXBwIHdpdGgKICAgICAqIHByb3ZpZGVycyBvZiBgXEBhbmd1bGFyL2NvcmVgIGRlcGVuZGVuY2llcyB0aGF0IGBBcHBsaWNhdGlvblJlZmAgbmVlZHMKICAgICAqIHRvIGJvb3RzdHJhcCBjb21wb25lbnRzLgogICAgICoKICAgICAqIFJlLWV4cG9ydGVkIGJ5IGBCcm93c2VyTW9kdWxlYCwgd2hpY2ggaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSBpbiB0aGUgcm9vdAogICAgICogYEFwcE1vZHVsZWAgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcCB3aXRoIHRoZSBDTEkgYG5ld2AgY29tbWFuZC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBBcHBsaWNhdGlvbk1vZHVsZSB7CiAgICAgICAgLy8gSW5qZWN0IEFwcGxpY2F0aW9uUmVmIHRvIG1ha2UgaXQgZWFnZXIuLi4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFwcFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGFwcFJlZikgeyB9CiAgICB9CiAgICBBcHBsaWNhdGlvbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFwcGxpY2F0aW9uTW9kdWxlIH0pOwogICAgQXBwbGljYXRpb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBcHBsaWNhdGlvbk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBcHBsaWNhdGlvbk1vZHVsZSkoybXJtWluamVjdChBcHBsaWNhdGlvblJlZikpOyB9LCBwcm92aWRlcnM6IEFQUExJQ0FUSU9OX01PRFVMRV9QUk9WSURFUlMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEFwcGxpY2F0aW9uTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQXBwbGljYXRpb25SZWYgfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvcmUvc3JjL3ZpZXcvaW5kZXgudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY29yZV9wcml2YXRlX2V4cG9ydC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb3JlL3NyYy9jb3JlX3JlbmRlcjNfcHJpdmF0ZV9leHBvcnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY29kZWdlbl9wcml2YXRlX2V4cG9ydHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29yZS9zcmMvY29yZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBpZiAobmdEZXZNb2RlKSB7CiAgICAgICAgLy8gVGhpcyBoZWxwZXIgaXMgdG8gZ2l2ZSBhIHJlYXNvbmFibGUgZXJyb3IgbWVzc2FnZSB0byBwZW9wbGUgdXBncmFkaW5nIHRvIHY5IHRoYXQgaGF2ZSBub3QgeWV0CiAgICAgICAgLy8gaW5zdGFsbGVkIGBAYW5ndWxhci9sb2NhbGl6ZWAgaW4gdGhlaXIgYXBwLgogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogbm8tdG9wbGV2ZWwtcHJvcGVydHktYWNjZXNzCiAgICAgICAgX2dsb2JhbC4kbG9jYWxpemUgPSBfZ2xvYmFsLiRsb2NhbGl6ZSB8fCAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSXQgbG9va3MgbGlrZSB5b3VyIGFwcGxpY2F0aW9uIG9yIG9uZSBvZiBpdHMgZGVwZW5kZW5jaWVzIGlzIHVzaW5nIGkxOG4uXG4nICsKICAgICAgICAgICAgICAgICdBbmd1bGFyIDkgaW50cm9kdWNlZCBhIGdsb2JhbCBgJGxvY2FsaXplKClgIGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gYmUgbG9hZGVkLlxuJyArCiAgICAgICAgICAgICAgICAnUGxlYXNlIHJ1biBgbmcgYWRkIEBhbmd1bGFyL2xvY2FsaXplYCBmcm9tIHRoZSBBbmd1bGFyIENMSS5cbicgKwogICAgICAgICAgICAgICAgJyhGb3Igbm9uLUNMSSBwcm9qZWN0cywgYWRkIGBpbXBvcnQgXCdAYW5ndWxhci9sb2NhbGl6ZS9pbml0XCc7YCB0byB5b3VyIGBwb2x5ZmlsbHMudHNgIGZpbGUuXG4nICsKICAgICAgICAgICAgICAgICdGb3Igc2VydmVyLXNpZGUgcmVuZGVyaW5nIGFwcGxpY2F0aW9ucyBhZGQgdGhlIGltcG9ydCB0byB5b3VyIGBtYWluLnNlcnZlci50c2AgZmlsZS4pJyk7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMTIKICAgICAqIChjKSAyMDEwLTIwMjAgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvLwogICAgICogTGljZW5zZTogTUlUCiAgICAgKi8KICAgIGxldCBfRE9NID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RE9NKCkgewogICAgICAgIHJldHVybiBfRE9NOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFkYXB0ZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFJvb3REb21BZGFwdGVyKGFkYXB0ZXIpIHsKICAgICAgICBpZiAoIV9ET00pIHsKICAgICAgICAgICAgX0RPTSA9IGFkYXB0ZXI7CiAgICAgICAgfQogICAgfQogICAgLyogdHNsaW50OmRpc2FibGU6cmVxdWlyZVBhcmFtZXRlclR5cGUgKi8KICAgIC8qKgogICAgICogUHJvdmlkZXMgRE9NIG9wZXJhdGlvbnMgaW4gYW4gZW52aXJvbm1lbnQtYWdub3N0aWMgd2F5LgogICAgICoKICAgICAqIFxAc2VjdXJpdHkgVHJlYWQgY2FyZWZ1bGx5ISBJbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZGlyZWN0bHkgaXMgZGFuZ2Vyb3VzIGFuZAogICAgICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgRG9tQWRhcHRlciB7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2RvbV90b2tlbnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBIERJIFRva2VuIHJlcHJlc2VudGluZyB0aGUgbWFpbiByZW5kZXJpbmcgY29udGV4dC4gSW4gYSBicm93c2VyIHRoaXMgaXMgdGhlIERPTSBEb2N1bWVudC4KICAgICAqCiAgICAgKiBOb3RlOiBEb2N1bWVudCBtaWdodCBub3QgYmUgYXZhaWxhYmxlIGluIHRoZSBBcHBsaWNhdGlvbiBDb250ZXh0IHdoZW4gQXBwbGljYXRpb24gYW5kIFJlbmRlcmluZwogICAgICogQ29udGV4dHMgYXJlIG5vdCB0aGUgc2FtZSAoZS5nLiB3aGVuIHJ1bm5pbmcgdGhlIGFwcGxpY2F0aW9uIGluIGEgV2ViIFdvcmtlcikuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBET0NVTUVOVCQxID0gbmV3IEluamVjdGlvblRva2VuKCdEb2N1bWVudFRva2VuJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2xvY2F0aW9uL3BsYXRmb3JtX2xvY2F0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhpcyBjbGFzcyBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkgYnkgYW4gYXBwbGljYXRpb24gZGV2ZWxvcGVyLiBJbnN0ZWFkLCB1c2UKICAgICAqIHtcQGxpbmsgTG9jYXRpb259LgogICAgICoKICAgICAqIGBQbGF0Zm9ybUxvY2F0aW9uYCBlbmNhcHN1bGF0ZXMgYWxsIGNhbGxzIHRvIERPTSBBUElzLCB3aGljaCBhbGxvd3MgdGhlIFJvdXRlciB0byBiZQogICAgICogcGxhdGZvcm0tYWdub3N0aWMuCiAgICAgKiBUaGlzIG1lYW5zIHRoYXQgd2UgY2FuIGhhdmUgZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIG9mIGBQbGF0Zm9ybUxvY2F0aW9uYCBmb3IgdGhlIGRpZmZlcmVudAogICAgICogcGxhdGZvcm1zIHRoYXQgQW5ndWxhciBzdXBwb3J0cy4gRm9yIGV4YW1wbGUsIGBcQGFuZ3VsYXIvcGxhdGZvcm0tYnJvd3NlcmAgcHJvdmlkZXMgYW4KICAgICAqIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIHRvIHRoZSBicm93c2VyIGVudmlyb25tZW50LCB3aGlsZSBgXEBhbmd1bGFyL3BsYXRmb3JtLXNlcnZlcmAgcHJvdmlkZXMKICAgICAqIG9uZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggc2VydmVyLXNpZGUgcmVuZGVyaW5nLgogICAgICoKICAgICAqIFRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAgY2xhc3MgaXMgdXNlZCBkaXJlY3RseSBieSBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0KICAgICAqIHdoZW4gdGhleSBuZWVkIHRvIGludGVyYWN0IHdpdGggdGhlIERPTSBBUElzIGxpa2UgcHVzaFN0YXRlLCBwb3BTdGF0ZSwgZXRjLgogICAgICoKICAgICAqIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0gaW4gdHVybiBpcyB1c2VkIGJ5IHRoZSB7XEBsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHdoaWNoIGlzIHVzZWQgZGlyZWN0bHkKICAgICAqIGJ5IHRoZSB7XEBsaW5rIFJvdXRlcn0gaW4gb3JkZXIgdG8gbmF2aWdhdGUgYmV0d2VlbiByb3V0ZXMuIFNpbmNlIGFsbCBpbnRlcmFjdGlvbnMgYmV0d2VlbiB7XEBsaW5rCiAgICAgKiBSb3V0ZXJ9IC8KICAgICAqIHtcQGxpbmsgTG9jYXRpb259IC8ge1xAbGluayBMb2NhdGlvblN0cmF0ZWd5fSBhbmQgRE9NIEFQSXMgZmxvdyB0aHJvdWdoIHRoZSBgUGxhdGZvcm1Mb2NhdGlvbmAKICAgICAqIGNsYXNzLCB0aGV5IGFyZSBhbGwgcGxhdGZvcm0tYWdub3N0aWMuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBQbGF0Zm9ybUxvY2F0aW9uIHsKICAgIH0KICAgIFBsYXRmb3JtTG9jYXRpb24uybVmYWMgPSBmdW5jdGlvbiBQbGF0Zm9ybUxvY2F0aW9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsYXRmb3JtTG9jYXRpb24pKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGxhdGZvcm1Mb2NhdGlvbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IHVzZUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLCB0b2tlbjogUGxhdGZvcm1Mb2NhdGlvbiwgcHJvdmlkZWRJbjogInBsYXRmb3JtIiB9KTsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdXNlQnJvd3NlclBsYXRmb3JtTG9jYXRpb24oKSB7CiAgICAgICAgcmV0dXJuIMm1ybVpbmplY3QoQnJvd3NlclBsYXRmb3JtTG9jYXRpb24pOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBJbmRpY2F0ZXMgd2hlbiBhIGxvY2F0aW9uIGlzIGluaXRpYWxpemVkLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTE9DQVRJT05fSU5JVElBTElaRUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0xvY2F0aW9uIEluaXRpYWxpemVkJyk7CiAgICAvKioKICAgICAqIGBQbGF0Zm9ybUxvY2F0aW9uYCBlbmNhcHN1bGF0ZXMgYWxsIG9mIHRoZSBkaXJlY3QgY2FsbHMgdG8gcGxhdGZvcm0gQVBJcy4KICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IGFuIGFwcGxpY2F0aW9uIGRldmVsb3Blci4gSW5zdGVhZCwgdXNlCiAgICAgKiB7XEBsaW5rIExvY2F0aW9ufS4KICAgICAqLwogICAgY2xhc3MgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24gZXh0ZW5kcyBQbGF0Zm9ybUxvY2F0aW9uIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2MKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX2RvYyA9IF9kb2M7CiAgICAgICAgICAgIHRoaXMuX2luaXQoKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBpcyBtb3ZlZCB0byBpdHMgb3duIG1ldGhvZCBzbyB0aGF0IGBNb2NrUGxhdGZvcm1Mb2NhdGlvblN0cmF0ZWd5YCBjYW4gb3ZlcndyaXRlIGl0CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luaXQoKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5sb2NhdGlvbiA9IGdldERPTSgpLmdldExvY2F0aW9uKCk7CiAgICAgICAgICAgIHRoaXMuX2hpc3RvcnkgPSBnZXRET00oKS5nZXRIaXN0b3J5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0QmFzZUhyZWZGcm9tRE9NKCkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGdldERPTSgpLmdldEJhc2VIcmVmKHRoaXMuX2RvYykpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Qb3BTdGF0ZShmbikgewogICAgICAgICAgICBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsICd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdwb3BzdGF0ZScsIGZuLCBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uSGFzaENoYW5nZShmbikgewogICAgICAgICAgICBnZXRET00oKS5nZXRHbG9iYWxFdmVudFRhcmdldCh0aGlzLl9kb2MsICd3aW5kb3cnKS5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgZm4sIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaHJlZigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uaHJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcHJvdG9jb2woKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnByb3RvY29sOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBob3N0bmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubG9jYXRpb24uaG9zdG5hbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBvcnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLnBvcnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBhdGhuYW1lKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc2VhcmNoKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5sb2NhdGlvbi5zZWFyY2g7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGhhc2goKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmxvY2F0aW9uLmhhc2g7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmV3UGF0aAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHBhdGhuYW1lKG5ld1BhdGgpIHsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5wYXRobmFtZSA9IG5ld1BhdGg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRpdGxlCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCkgewogICAgICAgICAgICBpZiAoc3VwcG9ydHNTdGF0ZSgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oaXN0b3J5LnB1c2hTdGF0ZShzdGF0ZSwgdGl0bGUsIHVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmxvY2F0aW9uLmhhc2ggPSB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdGl0bGUKICAgICAgICAgKiBAcGFyYW0gez99IHVybAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKSB7CiAgICAgICAgICAgIGlmIChzdXBwb3J0c1N0YXRlKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2hpc3RvcnkucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb24uaGFzaCA9IHVybDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvcndhcmQoKSB7CiAgICAgICAgICAgIHRoaXMuX2hpc3RvcnkuZm9yd2FyZCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJhY2soKSB7CiAgICAgICAgICAgIHRoaXMuX2hpc3RvcnkuYmFjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFN0YXRlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faGlzdG9yeS5zdGF0ZTsKICAgICAgICB9CiAgICB9CiAgICBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbi7JtWZhYyA9IGZ1bmN0aW9uIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogY3JlYXRlQnJvd3NlclBsYXRmb3JtTG9jYXRpb24sIHRva2VuOiBCcm93c2VyUGxhdGZvcm1Mb2NhdGlvbiwgcHJvdmlkZWRJbjogInBsYXRmb3JtIiB9KTsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3VwcG9ydHNTdGF0ZSgpIHsKICAgICAgICByZXR1cm4gISF3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGU7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUJyb3dzZXJQbGF0Zm9ybUxvY2F0aW9uKCkgewogICAgICAgIHJldHVybiBuZXcgQnJvd3NlclBsYXRmb3JtTG9jYXRpb24oybXJtWluamVjdChET0NVTUVOVCQxKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3ByaXZhdGVfZXhwb3J0LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vdXRpbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIEpvaW5zIHR3byBwYXJ0cyBvZiBhIFVSTCB3aXRoIGEgc2xhc2ggaWYgbmVlZGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gc3RhcnQgIFVSTCBzdHJpbmcKICAgICAqIEBwYXJhbSB7P30gZW5kICAgIFVSTCBzdHJpbmcKICAgICAqCiAgICAgKgogICAgICogQHJldHVybiB7P30gVGhlIGpvaW5lZCBVUkwgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBqb2luV2l0aFNsYXNoKHN0YXJ0LCBlbmQpIHsKICAgICAgICBpZiAoc3RhcnQubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgcmV0dXJuIGVuZDsKICAgICAgICB9CiAgICAgICAgaWYgKGVuZC5sZW5ndGggPT0gMCkgewogICAgICAgICAgICByZXR1cm4gc3RhcnQ7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc2xhc2hlcyA9IDA7CiAgICAgICAgaWYgKHN0YXJ0LmVuZHNXaXRoKCcvJykpIHsKICAgICAgICAgICAgc2xhc2hlcysrOwogICAgICAgIH0KICAgICAgICBpZiAoZW5kLnN0YXJ0c1dpdGgoJy8nKSkgewogICAgICAgICAgICBzbGFzaGVzKys7CiAgICAgICAgfQogICAgICAgIGlmIChzbGFzaGVzID09IDIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXJ0ICsgZW5kLnN1YnN0cmluZygxKTsKICAgICAgICB9CiAgICAgICAgaWYgKHNsYXNoZXMgPT0gMSkgewogICAgICAgICAgICByZXR1cm4gc3RhcnQgKyBlbmQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzdGFydCArICcvJyArIGVuZDsKICAgIH0KICAgIC8qKgogICAgICogUmVtb3ZlcyBhIHRyYWlsaW5nIHNsYXNoIGZyb20gYSBVUkwgc3RyaW5nIGlmIG5lZWRlZC4KICAgICAqIExvb2tzIGZvciB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBlaXRoZXIgYCNgLCBgP2AsIG9yIHRoZSBlbmQgb2YgdGhlCiAgICAgKiBsaW5lIGFzIGAvYCBjaGFyYWN0ZXJzIGFuZCByZW1vdmVzIHRoZSB0cmFpbGluZyBzbGFzaCBpZiBvbmUgZXhpc3RzLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gdXJsIFVSTCBzdHJpbmcuCiAgICAgKgogICAgICogQHJldHVybiB7P30gVGhlIFVSTCBzdHJpbmcsIG1vZGlmaWVkIGlmIG5lZWRlZC4KICAgICAqLwogICAgZnVuY3Rpb24gc3RyaXBUcmFpbGluZ1NsYXNoKHVybCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaCA9IHVybC5tYXRjaCgvI3xcP3wkLyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhdGhFbmRJZHggPSBtYXRjaCAmJiBtYXRjaC5pbmRleCB8fCB1cmwubGVuZ3RoOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkcm9wcGVkU2xhc2hJZHggPSBwYXRoRW5kSWR4IC0gKHVybFtwYXRoRW5kSWR4IC0gMV0gPT09ICcvJyA/IDEgOiAwKTsKICAgICAgICByZXR1cm4gdXJsLnNsaWNlKDAsIGRyb3BwZWRTbGFzaElkeCkgKyB1cmwuc2xpY2UocGF0aEVuZElkeCk7CiAgICB9CiAgICAvKioKICAgICAqIE5vcm1hbGl6ZXMgVVJMIHBhcmFtZXRlcnMgYnkgcHJlcGVuZGluZyB3aXRoIGA/YCBpZiBuZWVkZWQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBwYXJhbXMgU3RyaW5nIG9mIFVSTCBwYXJhbWV0ZXJzLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRoZSBub3JtYWxpemVkIFVSTCBwYXJhbWV0ZXJzIHN0cmluZy4KICAgICAqLwogICAgZnVuY3Rpb24gbm9ybWFsaXplUXVlcnlQYXJhbXMocGFyYW1zKSB7CiAgICAgICAgcmV0dXJuIHBhcmFtcyAmJiBwYXJhbXNbMF0gIT09ICc/JyA/ICc/JyArIHBhcmFtcyA6IHBhcmFtczsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vbG9jYXRpb25fc3RyYXRlZ3kudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBFbmFibGVzIHRoZSBgTG9jYXRpb25gIHNlcnZpY2UgdG8gcmVhZCByb3V0ZSBzdGF0ZSBmcm9tIHRoZSBicm93c2VyJ3MgVVJMLgogICAgICogQW5ndWxhciBwcm92aWRlcyB0d28gc3RyYXRlZ2llczoKICAgICAqIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgYW5kIGBQYXRoTG9jYXRpb25TdHJhdGVneWAuCiAgICAgKgogICAgICogQXBwbGljYXRpb25zIHNob3VsZCB1c2UgdGhlIGBSb3V0ZXJgIG9yIGBMb2NhdGlvbmAgc2VydmljZXMgdG8KICAgICAqIGludGVyYWN0IHdpdGggYXBwbGljYXRpb24gcm91dGUgc3RhdGUuCiAgICAgKgogICAgICogRm9yIGluc3RhbmNlLCBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgIHByb2R1Y2VzIFVSTHMgbGlrZQogICAgICogPGNvZGUgY2xhc3M9Im5vLWF1dG8tbGluayI+aHR0cDovL2V4YW1wbGUuY29tIy9mb288L2NvZGU+LAogICAgICogYW5kIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgcHJvZHVjZXMKICAgICAqIDxjb2RlIGNsYXNzPSJuby1hdXRvLWxpbmsiPmh0dHA6Ly9leGFtcGxlLmNvbS9mb288L2NvZGU+IGFzIGFuIGVxdWl2YWxlbnQgVVJMLgogICAgICoKICAgICAqIFNlZSB0aGVzZSB0d28gY2xhc3NlcyBmb3IgbW9yZS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIExvY2F0aW9uU3RyYXRlZ3kgewogICAgfQogICAgTG9jYXRpb25TdHJhdGVneS7JtWZhYyA9IGZ1bmN0aW9uIExvY2F0aW9uU3RyYXRlZ3lfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTG9jYXRpb25TdHJhdGVneSkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMb2NhdGlvblN0cmF0ZWd5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogcHJvdmlkZUxvY2F0aW9uU3RyYXRlZ3ksIHRva2VuOiBMb2NhdGlvblN0cmF0ZWd5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm1Mb2NhdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcHJvdmlkZUxvY2F0aW9uU3RyYXRlZ3kocGxhdGZvcm1Mb2NhdGlvbikgewogICAgICAgIC8vIFNlZSAjMjM5MTcKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYXRpb24gPSDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLmxvY2F0aW9uOwogICAgICAgIHJldHVybiBuZXcgUGF0aExvY2F0aW9uU3RyYXRlZ3koybXJtWluamVjdCgoLyoqIEB0eXBlIHs/fSAqLyAoUGxhdGZvcm1Mb2NhdGlvbikpKSwgbG9jYXRpb24gJiYgbG9jYXRpb24ub3JpZ2luIHx8ICcnKTsKICAgIH0KICAgIC8qKgogICAgICogQSBwcmVkZWZpbmVkIFtESSB0b2tlbl0oZ3VpZGUvZ2xvc3NhcnkjZGktdG9rZW4pIGZvciB0aGUgYmFzZSBocmVmCiAgICAgKiB0byBiZSB1c2VkIHdpdGggdGhlIGBQYXRoTG9jYXRpb25TdHJhdGVneWAuCiAgICAgKiBUaGUgYmFzZSBocmVmIGlzIHRoZSBVUkwgcHJlZml4IHRoYXQgc2hvdWxkIGJlIHByZXNlcnZlZCB3aGVuIGdlbmVyYXRpbmcKICAgICAqIGFuZCByZWNvZ25pemluZyBVUkxzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHRoaXMgdG9rZW4gdG8gY29uZmlndXJlIHRoZSByb290IGFwcCBpbmplY3RvcgogICAgICogd2l0aCBhIGJhc2UgaHJlZiB2YWx1ZSwgc28gdGhhdCB0aGUgREkgZnJhbWV3b3JrIGNhbiBzdXBwbHkgdGhlIGRlcGVuZGVuY3kgYW55d2hlcmUgaW4gdGhlIGFwcC4KICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBpbXBvcnQge0NvbXBvbmVudCwgTmdNb2R1bGV9IGZyb20gJ1xAYW5ndWxhci9jb3JlJzsKICAgICAqIGltcG9ydCB7QVBQX0JBU0VfSFJFRn0gZnJvbSAnXEBhbmd1bGFyL2NvbW1vbic7CiAgICAgKgogICAgICogXEBOZ01vZHVsZSh7CiAgICAgKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBBUFBfQkFTRV9IUkVGLCB1c2VWYWx1ZTogJy9teS9hcHAnfV0KICAgICAqIH0pCiAgICAgKiBjbGFzcyBBcHBNb2R1bGUge30KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQVBQX0JBU0VfSFJFRiA9IG5ldyBJbmplY3Rpb25Ub2tlbignYXBwQmFzZUhyZWYnKTsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQSB7XEBsaW5rIExvY2F0aW9uU3RyYXRlZ3l9IHVzZWQgdG8gY29uZmlndXJlIHRoZSB7XEBsaW5rIExvY2F0aW9ufSBzZXJ2aWNlIHRvCiAgICAgKiByZXByZXNlbnQgaXRzIHN0YXRlIGluIHRoZQogICAgICogW3BhdGhdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VuaWZvcm1fUmVzb3VyY2VfTG9jYXRvciNTeW50YXgpIG9mIHRoZQogICAgICogYnJvd3NlcidzIFVSTC4KICAgICAqCiAgICAgKiBJZiB5b3UncmUgdXNpbmcgYFBhdGhMb2NhdGlvblN0cmF0ZWd5YCwgeW91IG11c3QgcHJvdmlkZSBhIHtcQGxpbmsgQVBQX0JBU0VfSFJFRn0KICAgICAqIG9yIGFkZCBhIGJhc2UgZWxlbWVudCB0byB0aGUgZG9jdW1lbnQuIFRoaXMgVVJMIHByZWZpeCB0aGF0IHdpbGwgYmUgcHJlc2VydmVkCiAgICAgKiB3aGVuIGdlbmVyYXRpbmcgYW5kIHJlY29nbml6aW5nIFVSTHMuCiAgICAgKgogICAgICogRm9yIGluc3RhbmNlLCBpZiB5b3UgcHJvdmlkZSBhbiBgQVBQX0JBU0VfSFJFRmAgb2YgYCcvbXkvYXBwJ2AgYW5kIGNhbGwKICAgICAqIGBsb2NhdGlvbi5nbygnL2ZvbycpYCwgdGhlIGJyb3dzZXIncyBVUkwgd2lsbCBiZWNvbWUKICAgICAqIGBleGFtcGxlLmNvbS9teS9hcHAvZm9vYC4KICAgICAqCiAgICAgKiBTaW1pbGFybHksIGlmIHlvdSBhZGQgYDxiYXNlIGhyZWY9Jy9teS9hcHAnLz5gIHRvIHRoZSBkb2N1bWVudCBhbmQgY2FsbAogICAgICogYGxvY2F0aW9uLmdvKCcvZm9vJylgLCB0aGUgYnJvd3NlcidzIFVSTCB3aWxsIGJlY29tZQogICAgICogYGV4YW1wbGUuY29tL215L2FwcC9mb29gLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vbG9jYXRpb24vdHMvcGF0aF9sb2NhdGlvbl9jb21wb25lbnQudHMgcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCd9CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgUGF0aExvY2F0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhdGlvblN0cmF0ZWd5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybUxvY2F0aW9uCiAgICAgICAgICogQHBhcmFtIHs/PX0gaHJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9wbGF0Zm9ybUxvY2F0aW9uLCBocmVmKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24gPSBfcGxhdGZvcm1Mb2NhdGlvbjsKICAgICAgICAgICAgaWYgKGhyZWYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgaHJlZiA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0QmFzZUhyZWZGcm9tRE9NKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGhyZWYgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBiYXNlIGhyZWYgc2V0LiBQbGVhc2UgcHJvdmlkZSBhIHZhbHVlIGZvciB0aGUgQVBQX0JBU0VfSFJFRiB0b2tlbiBvciBhZGQgYSBiYXNlIGVsZW1lbnQgdG8gdGhlIGRvY3VtZW50LmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gaHJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Qb3BTdGF0ZShmbikgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUoZm4pOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0QmFzZUhyZWYoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlSHJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJlcGFyZUV4dGVybmFsVXJsKGludGVybmFsKSB7CiAgICAgICAgICAgIHJldHVybiBqb2luV2l0aFNsYXNoKHRoaXMuX2Jhc2VIcmVmLCBpbnRlcm5hbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGluY2x1ZGVIYXNoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXRoKGluY2x1ZGVIYXNoID0gZmFsc2UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWUgKyBub3JtYWxpemVRdWVyeVBhcmFtcyh0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnNlYXJjaCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGFzaCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDsKICAgICAgICAgICAgcmV0dXJuIGhhc2ggJiYgaW5jbHVkZUhhc2ggPyBgJHtwYXRobmFtZX0ke2hhc2h9YCA6IHBhdGhuYW1lOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsLCBxdWVyeVBhcmFtcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4dGVybmFsVXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwodXJsICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnlQYXJhbXMpKTsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCBleHRlcm5hbFVybCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRpdGxlCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5UGFyYW1zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXBsYWNlU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwsIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXh0ZXJuYWxVcmwgPSB0aGlzLnByZXBhcmVFeHRlcm5hbFVybCh1cmwgKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIGV4dGVybmFsVXJsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3J3YXJkKCkgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBiYWNrKCkgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmJhY2soKTsKICAgICAgICB9CiAgICB9CiAgICBQYXRoTG9jYXRpb25TdHJhdGVneS7JtWZhYyA9IGZ1bmN0aW9uIFBhdGhMb2NhdGlvblN0cmF0ZWd5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBhdGhMb2NhdGlvblN0cmF0ZWd5KSjJtcm1aW5qZWN0KFBsYXRmb3JtTG9jYXRpb24pLCDJtcm1aW5qZWN0KEFQUF9CQVNFX0hSRUYsIDgpKTsgfTsKICAgIFBhdGhMb2NhdGlvblN0cmF0ZWd5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFBhdGhMb2NhdGlvblN0cmF0ZWd5LCBmYWN0b3J5OiBQYXRoTG9jYXRpb25TdHJhdGVneS7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUGF0aExvY2F0aW9uU3RyYXRlZ3kuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybUxvY2F0aW9uIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0JBU0VfSFJFRixdIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2xvY2F0aW9uL2hhc2hfbG9jYXRpb25fc3RyYXRlZ3kudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIHtcQGxpbmsgTG9jYXRpb25TdHJhdGVneX0gdXNlZCB0byBjb25maWd1cmUgdGhlIHtcQGxpbmsgTG9jYXRpb259IHNlcnZpY2UgdG8KICAgICAqIHJlcHJlc2VudCBpdHMgc3RhdGUgaW4gdGhlCiAgICAgKiBbaGFzaCBmcmFnbWVudF0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVW5pZm9ybV9SZXNvdXJjZV9Mb2NhdG9yI1N5bnRheCkKICAgICAqIG9mIHRoZSBicm93c2VyJ3MgVVJMLgogICAgICoKICAgICAqIEZvciBpbnN0YW5jZSwgaWYgeW91IGNhbGwgYGxvY2F0aW9uLmdvKCcvZm9vJylgLCB0aGUgYnJvd3NlcidzIFVSTCB3aWxsIGJlY29tZQogICAgICogYGV4YW1wbGUuY29tIy9mb29gLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vbG9jYXRpb24vdHMvaGFzaF9sb2NhdGlvbl9jb21wb25lbnQudHMgcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCd9CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSGFzaExvY2F0aW9uU3RyYXRlZ3kgZXh0ZW5kcyBMb2NhdGlvblN0cmF0ZWd5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybUxvY2F0aW9uCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2Jhc2VIcmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BsYXRmb3JtTG9jYXRpb24sIF9iYXNlSHJlZikgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uID0gX3BsYXRmb3JtTG9jYXRpb247CiAgICAgICAgICAgIHRoaXMuX2Jhc2VIcmVmID0gJyc7CiAgICAgICAgICAgIGlmIChfYmFzZUhyZWYgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fYmFzZUhyZWYgPSBfYmFzZUhyZWY7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Qb3BTdGF0ZShmbikgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uUG9wU3RhdGUoZm4pOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLm9uSGFzaENoYW5nZShmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0QmFzZUhyZWYoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9iYXNlSHJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5jbHVkZUhhc2gKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhdGgoaW5jbHVkZUhhc2ggPSBmYWxzZSkgewogICAgICAgICAgICAvLyB0aGUgaGFzaCB2YWx1ZSBpcyBhbHdheXMgcHJlZml4ZWQgd2l0aCBhIGAjYAogICAgICAgICAgICAvLyBhbmQgaWYgaXQgaXMgZW1wdHkgdGhlbiBpdCB3aWxsIHN0YXkgZW1wdHkKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGF0aCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uaGFzaDsKICAgICAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKICAgICAgICAgICAgICAgIHBhdGggPSAnIyc7CiAgICAgICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA+IDAgPyBwYXRoLnN1YnN0cmluZygxKSA6IHBhdGg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByZXBhcmVFeHRlcm5hbFVybChpbnRlcm5hbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVybCA9IGpvaW5XaXRoU2xhc2godGhpcy5fYmFzZUhyZWYsIGludGVybmFsKTsKICAgICAgICAgICAgcmV0dXJuIHVybC5sZW5ndGggPiAwID8gKCcjJyArIHVybCkgOiB1cmw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRpdGxlCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHBhcmFtIHs/fSBxdWVyeVBhcmFtcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHVzaFN0YXRlKHN0YXRlLCB0aXRsZSwgcGF0aCwgcXVlcnlQYXJhbXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSk7CiAgICAgICAgICAgIGlmICh1cmwubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIHVybCA9IHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucGF0aG5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1Mb2NhdGlvbi5wdXNoU3RhdGUoc3RhdGUsIHRpdGxlLCB1cmwpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0aXRsZQogICAgICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlcGxhY2VTdGF0ZShzdGF0ZSwgdGl0bGUsIHBhdGgsIHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHVybCA9IHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeVBhcmFtcykpOwogICAgICAgICAgICBpZiAodXJsLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICB1cmwgPSB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLnBhdGhuYW1lOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24ucmVwbGFjZVN0YXRlKHN0YXRlLCB0aXRsZSwgdXJsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3J3YXJkKCkgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmZvcndhcmQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBiYWNrKCkgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uLmJhY2soKTsKICAgICAgICB9CiAgICB9CiAgICBIYXNoTG9jYXRpb25TdHJhdGVneS7JtWZhYyA9IGZ1bmN0aW9uIEhhc2hMb2NhdGlvblN0cmF0ZWd5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhhc2hMb2NhdGlvblN0cmF0ZWd5KSjJtcm1aW5qZWN0KFBsYXRmb3JtTG9jYXRpb24pLCDJtcm1aW5qZWN0KEFQUF9CQVNFX0hSRUYsIDgpKTsgfTsKICAgIEhhc2hMb2NhdGlvblN0cmF0ZWd5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEhhc2hMb2NhdGlvblN0cmF0ZWd5LCBmYWN0b3J5OiBIYXNoTG9jYXRpb25TdHJhdGVneS7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgSGFzaExvY2F0aW9uU3RyYXRlZ3kuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybUxvY2F0aW9uIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQVBQX0JBU0VfSFJFRixdIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBBIHNlcnZpY2UgdGhhdCBhcHBsaWNhdGlvbnMgY2FuIHVzZSB0byBpbnRlcmFjdCB3aXRoIGEgYnJvd3NlcidzIFVSTC4KICAgICAqCiAgICAgKiBEZXBlbmRpbmcgb24gdGhlIGBMb2NhdGlvblN0cmF0ZWd5YCB1c2VkLCBgTG9jYXRpb25gIHBlcnNpc3RzCiAgICAgKiB0byB0aGUgVVJMJ3MgcGF0aCBvciB0aGUgVVJMJ3MgaGFzaCBzZWdtZW50LgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqIEl0J3MgYmV0dGVyIHRvIHVzZSB0aGUgYFJvdXRlciNuYXZpZ2F0ZWAgc2VydmljZSB0byB0cmlnZ2VyIHJvdXRlIGNoYW5nZXMuIFVzZQogICAgICogYExvY2F0aW9uYCBvbmx5IGlmIHlvdSBuZWVkIHRvIGludGVyYWN0IHdpdGggb3IgY3JlYXRlIG5vcm1hbGl6ZWQgVVJMcyBvdXRzaWRlIG9mCiAgICAgKiByb3V0aW5nLgogICAgICoKICAgICAqIGBMb2NhdGlvbmAgaXMgcmVzcG9uc2libGUgZm9yIG5vcm1hbGl6aW5nIHRoZSBVUkwgYWdhaW5zdCB0aGUgYXBwbGljYXRpb24ncyBiYXNlIGhyZWYuCiAgICAgKiBBIG5vcm1hbGl6ZWQgVVJMIGlzIGFic29sdXRlIGZyb20gdGhlIFVSTCBob3N0LCBpbmNsdWRlcyB0aGUgYXBwbGljYXRpb24ncyBiYXNlIGhyZWYsIGFuZCBoYXMgbm8KICAgICAqIHRyYWlsaW5nIHNsYXNoOgogICAgICogLSBgL215L2FwcC91c2VyLzEyM2AgaXMgbm9ybWFsaXplZAogICAgICogLSBgbXkvYXBwL3VzZXIvMTIzYCAqKmlzIG5vdCoqIG5vcm1hbGl6ZWQKICAgICAqIC0gYC9teS9hcHAvdXNlci8xMjMvYCAqKmlzIG5vdCoqIG5vcm1hbGl6ZWQKICAgICAqCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIDxjb2RlLWV4YW1wbGUgcGF0aD0nY29tbW9uL2xvY2F0aW9uL3RzL3BhdGhfbG9jYXRpb25fY29tcG9uZW50LnRzJwogICAgICogcmVnaW9uPSdMb2NhdGlvbkNvbXBvbmVudCc+PC9jb2RlLWV4YW1wbGU+CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTG9jYXRpb24gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm1TdHJhdGVneQogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm1Mb2NhdGlvbgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHBsYXRmb3JtU3RyYXRlZ3ksIHBsYXRmb3JtTG9jYXRpb24pIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3N1YmplY3QgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1TdHJhdGVneSA9IHBsYXRmb3JtU3RyYXRlZ3k7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYnJvd3NlckJhc2VIcmVmID0gdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5nZXRCYXNlSHJlZigpOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybUxvY2F0aW9uID0gcGxhdGZvcm1Mb2NhdGlvbjsKICAgICAgICAgICAgdGhpcy5fYmFzZUhyZWYgPSBzdHJpcFRyYWlsaW5nU2xhc2goX3N0cmlwSW5kZXhIdG1sKGJyb3dzZXJCYXNlSHJlZikpOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5Lm9uUG9wU3RhdGUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXYpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YmplY3QuZW1pdCh7CiAgICAgICAgICAgICAgICAgICAgJ3VybCc6IHRoaXMucGF0aCh0cnVlKSwKICAgICAgICAgICAgICAgICAgICAncG9wJzogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAnc3RhdGUnOiBldi5zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAndHlwZSc6IGV2LnR5cGUsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBOb3JtYWxpemVzIHRoZSBVUkwgcGF0aCBmb3IgdGhpcyBsb2NhdGlvbi4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGluY2x1ZGVIYXNoIFRydWUgdG8gaW5jbHVkZSBhbiBhbmNob3IgZnJhZ21lbnQgaW4gdGhlIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbm9ybWFsaXplZCBVUkwgcGF0aC4KICAgICAgICAgKi8KICAgICAgICAvLyBUT0RPOiB2c2F2a2luLiBSZW1vdmUgdGhlIGJvb2xlYW4gZmxhZyBhbmQgYWx3YXlzIGluY2x1ZGUgaGFzaCBvbmNlIHRoZSBkZXByZWNhdGVkIHJvdXRlciBpcwogICAgICAgIC8vIHJlbW92ZWQuCiAgICAgICAgcGF0aChpbmNsdWRlSGFzaCA9IGZhbHNlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZSh0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnBhdGgoaW5jbHVkZUhhc2gpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVwb3J0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgbG9jYXRpb24gaGlzdG9yeS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgYGhpc3Rvcnkuc3RhdGVgIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBnZXRTdGF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtTG9jYXRpb24uZ2V0U3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXplcyB0aGUgZ2l2ZW4gcGF0aCBhbmQgY29tcGFyZXMgdG8gdGhlIGN1cnJlbnQgbm9ybWFsaXplZCBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoIFRoZSBnaXZlbiBVUkwgcGF0aC4KICAgICAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgZ2l2ZW4gVVJMIHBhdGggaXMgZXF1YWwgdG8gdGhlIGN1cnJlbnQgbm9ybWFsaXplZCBwYXRoLCBmYWxzZQogICAgICAgICAqIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBpc0N1cnJlbnRQYXRoRXF1YWxUbyhwYXRoLCBxdWVyeSA9ICcnKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhdGgoKSA9PSB0aGlzLm5vcm1hbGl6ZShwYXRoICsgbm9ybWFsaXplUXVlcnlQYXJhbXMocXVlcnkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXplcyBhIFVSTCBwYXRoIGJ5IHN0cmlwcGluZyBhbnkgdHJhaWxpbmcgc2xhc2hlcy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdXJsIFN0cmluZyByZXByZXNlbnRpbmcgYSBVUkwuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbm9ybWFsaXplZCBVUkwgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIG5vcm1hbGl6ZSh1cmwpIHsKICAgICAgICAgICAgcmV0dXJuIExvY2F0aW9uLnN0cmlwVHJhaWxpbmdTbGFzaChfc3RyaXBCYXNlSHJlZih0aGlzLl9iYXNlSHJlZiwgX3N0cmlwSW5kZXhIdG1sKHVybCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm9ybWFsaXplcyBhbiBleHRlcm5hbCBVUkwgcGF0aC4KICAgICAgICAgKiBJZiB0aGUgZ2l2ZW4gVVJMIGRvZXNuJ3QgYmVnaW4gd2l0aCBhIGxlYWRpbmcgc2xhc2ggKGAnLydgKSwgYWRkcyBvbmUKICAgICAgICAgKiBiZWZvcmUgbm9ybWFsaXppbmcuIEFkZHMgYSBoYXNoIGlmIGBIYXNoTG9jYXRpb25TdHJhdGVneWAgaXMKICAgICAgICAgKiBpbiB1c2UsIG9yIHRoZSBgQVBQX0JBU0VfSFJFRmAgaWYgdGhlIGBQYXRoTG9jYXRpb25TdHJhdGVneWAgaXMgaW4gdXNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwgU3RyaW5nIHJlcHJlc2VudGluZyBhIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IEEgbm9ybWFsaXplZCBwbGF0Zm9ybS1zcGVjaWZpYyBVUkwuCiAgICAgICAgICovCiAgICAgICAgcHJlcGFyZUV4dGVybmFsVXJsKHVybCkgewogICAgICAgICAgICBpZiAodXJsICYmIHVybFswXSAhPT0gJy8nKSB7CiAgICAgICAgICAgICAgICB1cmwgPSAnLycgKyB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucHJlcGFyZUV4dGVybmFsVXJsKHVybCk7CiAgICAgICAgfQogICAgICAgIC8vIFRPRE86IHJlbmFtZSB0aGlzIG1ldGhvZCB0byBwdXNoU3RhdGUKICAgICAgICAvKioKICAgICAgICAgKiBDaGFuZ2VzIHRoZSBicm93c2VyJ3MgVVJMIHRvIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIGEgZ2l2ZW4gVVJMLCBhbmQgcHVzaGVzIGEKICAgICAgICAgKiBuZXcgaXRlbSBvbnRvIHRoZSBwbGF0Zm9ybSdzIGhpc3RvcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGggIFVSTCBwYXRoIHRvIG5vcm1hbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICAgICAqIEBwYXJhbSB7Pz19IHN0YXRlIExvY2F0aW9uIGhpc3Rvcnkgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdvKHBhdGgsIHF1ZXJ5ID0gJycsIHN0YXRlID0gbnVsbCkgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybVN0cmF0ZWd5LnB1c2hTdGF0ZShzdGF0ZSwgJycsIHBhdGgsIHF1ZXJ5KTsKICAgICAgICAgICAgdGhpcy5fbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHRoaXMucHJlcGFyZUV4dGVybmFsVXJsKHBhdGggKyBub3JtYWxpemVRdWVyeVBhcmFtcyhxdWVyeSkpLCBzdGF0ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoYW5nZXMgdGhlIGJyb3dzZXIncyBVUkwgdG8gYSBub3JtYWxpemVkIHZlcnNpb24gb2YgdGhlIGdpdmVuIFVSTCwgYW5kIHJlcGxhY2VzCiAgICAgICAgICogdGhlIHRvcCBpdGVtIG9uIHRoZSBwbGF0Zm9ybSdzIGhpc3Rvcnkgc3RhY2suCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGggIFVSTCBwYXRoIHRvIG5vcm1hbGl6ZS4KICAgICAgICAgKiBAcGFyYW0gez89fSBxdWVyeSBRdWVyeSBwYXJhbWV0ZXJzLgogICAgICAgICAqIEBwYXJhbSB7Pz19IHN0YXRlIExvY2F0aW9uIGhpc3Rvcnkgc3RhdGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXBsYWNlU3RhdGUocGF0aCwgcXVlcnkgPSAnJywgc3RhdGUgPSBudWxsKSB7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kucmVwbGFjZVN0YXRlKHN0YXRlLCAnJywgcGF0aCwgcXVlcnkpOwogICAgICAgICAgICB0aGlzLl9ub3RpZnlVcmxDaGFuZ2VMaXN0ZW5lcnModGhpcy5wcmVwYXJlRXh0ZXJuYWxVcmwocGF0aCArIG5vcm1hbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5KSksIHN0YXRlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTmF2aWdhdGVzIGZvcndhcmQgaW4gdGhlIHBsYXRmb3JtJ3MgaGlzdG9yeS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvcndhcmQoKSB7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtU3RyYXRlZ3kuZm9yd2FyZCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBOYXZpZ2F0ZXMgYmFjayBpbiB0aGUgcGxhdGZvcm0ncyBoaXN0b3J5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYmFjaygpIHsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1TdHJhdGVneS5iYWNrKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIFVSTCBjaGFuZ2UgbGlzdGVuZXIuIFVzZSB0byBjYXRjaCB1cGRhdGVzIHBlcmZvcm1lZCBieSB0aGUgQW5ndWxhcgogICAgICAgICAqIGZyYW1ld29yayB0aGF0IGFyZSBub3QgZGV0ZWN0aWJsZSB0aHJvdWdoICJwb3BzdGF0ZSIgb3IgImhhc2hjaGFuZ2UiIGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNoYW5nZSBoYW5kbGVyIGZ1bmN0aW9uLCB3aGljaCB0YWtlIGEgVVJMIGFuZCBhIGxvY2F0aW9uIGhpc3Rvcnkgc3RhdGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblVybENoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMucHVzaChmbik7CiAgICAgICAgICAgIHRoaXMuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB2ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX25vdGlmeVVybENoYW5nZUxpc3RlbmVycyh2LnVybCwgdi5zdGF0ZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7Pz19IHVybAogICAgICAgICAqIEBwYXJhbSB7Pz19IHN0YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbm90aWZ5VXJsQ2hhbmdlTGlzdGVuZXJzKHVybCA9ICcnLCBzdGF0ZSkgewogICAgICAgICAgICB0aGlzLl91cmxDaGFuZ2VMaXN0ZW5lcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZuID0+IGZuKHVybCwgc3RhdGUpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN1YnNjcmliZXMgdG8gdGhlIHBsYXRmb3JtJ3MgYHBvcFN0YXRlYCBldmVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG9uTmV4dAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9uVGhyb3cKICAgICAgICAgKiBAcGFyYW0gez89fSBvblJldHVybgogICAgICAgICAqIEByZXR1cm4gez99IFN1YnNjcmliZWQgZXZlbnRzLgogICAgICAgICAqLwogICAgICAgIHN1YnNjcmliZShvbk5leHQsIG9uVGhyb3csIG9uUmV0dXJuKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdWJqZWN0LnN1YnNjcmliZSh7IG5leHQ6IG9uTmV4dCwgZXJyb3I6IG9uVGhyb3csIGNvbXBsZXRlOiBvblJldHVybiB9KTsKICAgICAgICB9CiAgICB9CiAgICBMb2NhdGlvbi7JtWZhYyA9IGZ1bmN0aW9uIExvY2F0aW9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExvY2F0aW9uKSjJtcm1aW5qZWN0KExvY2F0aW9uU3RyYXRlZ3kpLCDJtcm1aW5qZWN0KFBsYXRmb3JtTG9jYXRpb24pKTsgfTsKICAgIC8qKgogICAgICogTm9ybWFsaXplcyBVUkwgcGFyYW1ldGVycyBieSBwcmVwZW5kaW5nIHdpdGggYD9gIGlmIG5lZWRlZC4KICAgICAqCiAgICAgKiBAcGFyYW0gcGFyYW1zIFN0cmluZyBvZiBVUkwgcGFyYW1ldGVycy4KICAgICAqCiAgICAgKiBAcmV0dXJuIFRoZSBub3JtYWxpemVkIFVSTCBwYXJhbWV0ZXJzIHN0cmluZy4KICAgICAqLwogICAgTG9jYXRpb24ubm9ybWFsaXplUXVlcnlQYXJhbXMgPSBub3JtYWxpemVRdWVyeVBhcmFtczsKICAgIC8qKgogICAgICogSm9pbnMgdHdvIHBhcnRzIG9mIGEgVVJMIHdpdGggYSBzbGFzaCBpZiBuZWVkZWQuCiAgICAgKgogICAgICogQHBhcmFtIHN0YXJ0ICBVUkwgc3RyaW5nCiAgICAgKiBAcGFyYW0gZW5kICAgIFVSTCBzdHJpbmcKICAgICAqCiAgICAgKgogICAgICogQHJldHVybiBUaGUgam9pbmVkIFVSTCBzdHJpbmcuCiAgICAgKi8KICAgIExvY2F0aW9uLmpvaW5XaXRoU2xhc2ggPSBqb2luV2l0aFNsYXNoOwogICAgLyoqCiAgICAgKiBSZW1vdmVzIGEgdHJhaWxpbmcgc2xhc2ggZnJvbSBhIFVSTCBzdHJpbmcgaWYgbmVlZGVkLgogICAgICogTG9va3MgZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGVpdGhlciBgI2AsIGA/YCwgb3IgdGhlIGVuZCBvZiB0aGUKICAgICAqIGxpbmUgYXMgYC9gIGNoYXJhY3RlcnMgYW5kIHJlbW92ZXMgdGhlIHRyYWlsaW5nIHNsYXNoIGlmIG9uZSBleGlzdHMuCiAgICAgKgogICAgICogQHBhcmFtIHVybCBVUkwgc3RyaW5nLgogICAgICoKICAgICAqIEByZXR1cm4gVGhlIFVSTCBzdHJpbmcsIG1vZGlmaWVkIGlmIG5lZWRlZC4KICAgICAqLwogICAgTG9jYXRpb24uc3RyaXBUcmFpbGluZ1NsYXNoID0gc3RyaXBUcmFpbGluZ1NsYXNoOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBMb2NhdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IExvY2F0aW9uU3RyYXRlZ3kgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtTG9jYXRpb24gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMb2NhdGlvbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGNyZWF0ZUxvY2F0aW9uLCB0b2tlbjogTG9jYXRpb24sIHByb3ZpZGVkSW46ICJyb290IiB9KTsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlTG9jYXRpb24oKSB7CiAgICAgICAgcmV0dXJuIG5ldyBMb2NhdGlvbijJtcm1aW5qZWN0KCgvKiogQHR5cGUgez99ICovIChMb2NhdGlvblN0cmF0ZWd5KSkpLCDJtcm1aW5qZWN0KCgvKiogQHR5cGUgez99ICovIChQbGF0Zm9ybUxvY2F0aW9uKSkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBiYXNlSHJlZgogICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9zdHJpcEJhc2VIcmVmKGJhc2VIcmVmLCB1cmwpIHsKICAgICAgICByZXR1cm4gYmFzZUhyZWYgJiYgdXJsLnN0YXJ0c1dpdGgoYmFzZUhyZWYpID8gdXJsLnN1YnN0cmluZyhiYXNlSHJlZi5sZW5ndGgpIDogdXJsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX3N0cmlwSW5kZXhIdG1sKHVybCkgewogICAgICAgIHJldHVybiB1cmwucmVwbGFjZSgvXC9pbmRleC5odG1sJC8sICcnKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvbG9jYXRpb24vaW5kZXgudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2N1cnJlbmNpZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLy8gVEhJUyBDT0RFIElTIEdFTkVSQVRFRCAtIERPIE5PVCBNT0RJRlkKICAgIC8vIFNlZSBhbmd1bGFyL3Rvb2xzL2d1bHAtdGFza3MvY2xkci9leHRyYWN0LmpzCiAgICAvKioKICAgICAqIFxAaW50ZXJuYWwKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBDVVJSRU5DSUVTX0VOID0gewogICAgICAgICdBRFAnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdBRk4nOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdBTEwnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdBTUQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDJdLAogICAgICAgICdBT0EnOiBbdW5kZWZpbmVkLCAnS3onXSwKICAgICAgICAnQVJTJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICAgICAnQVVEJzogWydBJCcsICckJ10sCiAgICAgICAgJ0JBTSc6IFt1bmRlZmluZWQsICdLTSddLAogICAgICAgICdCQkQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgICAgICdCRFQnOiBbdW5kZWZpbmVkLCAn4KezJ10sCiAgICAgICAgJ0JIRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sCiAgICAgICAgJ0JJRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ0JNRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ0JORCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ0JPQic6IFt1bmRlZmluZWQsICdCcyddLAogICAgICAgICdCUkwnOiBbJ1IkJ10sCiAgICAgICAgJ0JTRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ0JXUCc6IFt1bmRlZmluZWQsICdQJ10sCiAgICAgICAgJ0JZTic6IFt1bmRlZmluZWQsICfRgC4nLCAyXSwKICAgICAgICAnQllSJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnQlpEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICAgICAnQ0FEJzogWydDQSQnLCAnJCcsIDJdLAogICAgICAgICdDSEYnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDJdLAogICAgICAgICdDTEYnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDRdLAogICAgICAgICdDTFAnOiBbdW5kZWZpbmVkLCAnJCcsIDBdLAogICAgICAgICdDTlknOiBbJ0NOwqUnLCAnwqUnXSwKICAgICAgICAnQ09QJzogW3VuZGVmaW5lZCwgJyQnLCAyXSwKICAgICAgICAnQ1JDJzogW3VuZGVmaW5lZCwgJ+KCoScsIDJdLAogICAgICAgICdDVUMnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgICAgICdDVVAnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgICAgICdDWksnOiBbdW5kZWZpbmVkLCAnS8SNJywgMl0sCiAgICAgICAgJ0RKRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ0RLSyc6IFt1bmRlZmluZWQsICdrcicsIDJdLAogICAgICAgICdET1AnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgICAgICdFR1AnOiBbdW5kZWZpbmVkLCAnRcKjJ10sCiAgICAgICAgJ0VTUCc6IFt1bmRlZmluZWQsICfigqcnLCAwXSwKICAgICAgICAnRVVSJzogWyfigqwnXSwKICAgICAgICAnRkpEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICAgICAnRktQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAgICAgJ0dCUCc6IFsnwqMnXSwKICAgICAgICAnR0VMJzogW3VuZGVmaW5lZCwgJ+KCviddLAogICAgICAgICdHSVAnOiBbdW5kZWZpbmVkLCAnwqMnXSwKICAgICAgICAnR05GJzogW3VuZGVmaW5lZCwgJ0ZHJywgMF0sCiAgICAgICAgJ0dUUSc6IFt1bmRlZmluZWQsICdRJ10sCiAgICAgICAgJ0dZRCc6IFt1bmRlZmluZWQsICckJywgMl0sCiAgICAgICAgJ0hLRCc6IFsnSEskJywgJyQnXSwKICAgICAgICAnSE5MJzogW3VuZGVmaW5lZCwgJ0wnXSwKICAgICAgICAnSFJLJzogW3VuZGVmaW5lZCwgJ2tuJ10sCiAgICAgICAgJ0hVRic6IFt1bmRlZmluZWQsICdGdCcsIDJdLAogICAgICAgICdJRFInOiBbdW5kZWZpbmVkLCAnUnAnLCAyXSwKICAgICAgICAnSUxTJzogWyfigqonXSwKICAgICAgICAnSU5SJzogWyfigrknXSwKICAgICAgICAnSVFEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnSVJSJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnSVNLJzogW3VuZGVmaW5lZCwgJ2tyJywgMF0sCiAgICAgICAgJ0lUTCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ0pNRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ0pPRCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgM10sCiAgICAgICAgJ0pQWSc6IFsnwqUnLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdLSFInOiBbdW5kZWZpbmVkLCAn4Z+bJ10sCiAgICAgICAgJ0tNRic6IFt1bmRlZmluZWQsICdDRicsIDBdLAogICAgICAgICdLUFcnOiBbdW5kZWZpbmVkLCAn4oKpJywgMF0sCiAgICAgICAgJ0tSVyc6IFsn4oKpJywgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnS1dEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSwKICAgICAgICAnS1lEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICAgICAnS1pUJzogW3VuZGVmaW5lZCwgJ+KCuCddLAogICAgICAgICdMQUsnOiBbdW5kZWZpbmVkLCAn4oKtJywgMF0sCiAgICAgICAgJ0xCUCc6IFt1bmRlZmluZWQsICdMwqMnLCAwXSwKICAgICAgICAnTEtSJzogW3VuZGVmaW5lZCwgJ1JzJ10sCiAgICAgICAgJ0xSRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ0xUTCc6IFt1bmRlZmluZWQsICdMdCddLAogICAgICAgICdMVUYnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdMVkwnOiBbdW5kZWZpbmVkLCAnTHMnXSwKICAgICAgICAnTFlEJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAzXSwKICAgICAgICAnTUdBJzogW3VuZGVmaW5lZCwgJ0FyJywgMF0sCiAgICAgICAgJ01HRic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ01NSyc6IFt1bmRlZmluZWQsICdLJywgMF0sCiAgICAgICAgJ01OVCc6IFt1bmRlZmluZWQsICfigq4nLCAyXSwKICAgICAgICAnTVJPJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnTVVSJzogW3VuZGVmaW5lZCwgJ1JzJywgMl0sCiAgICAgICAgJ01YTic6IFsnTVgkJywgJyQnXSwKICAgICAgICAnTVlSJzogW3VuZGVmaW5lZCwgJ1JNJ10sCiAgICAgICAgJ05BRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ05HTic6IFt1bmRlZmluZWQsICfigqYnXSwKICAgICAgICAnTklPJzogW3VuZGVmaW5lZCwgJ0MkJ10sCiAgICAgICAgJ05PSyc6IFt1bmRlZmluZWQsICdrcicsIDJdLAogICAgICAgICdOUFInOiBbdW5kZWZpbmVkLCAnUnMnXSwKICAgICAgICAnTlpEJzogWydOWiQnLCAnJCddLAogICAgICAgICdPTVInOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLAogICAgICAgICdQSFAnOiBbdW5kZWZpbmVkLCAn4oKxJ10sCiAgICAgICAgJ1BLUic6IFt1bmRlZmluZWQsICdScycsIDJdLAogICAgICAgICdQTE4nOiBbdW5kZWZpbmVkLCAnesWCJ10sCiAgICAgICAgJ1BZRyc6IFt1bmRlZmluZWQsICfigrInLCAwXSwKICAgICAgICAnUk9OJzogW3VuZGVmaW5lZCwgJ2xlaSddLAogICAgICAgICdSU0QnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdSVUInOiBbdW5kZWZpbmVkLCAn4oK9J10sCiAgICAgICAgJ1JVUic6IFt1bmRlZmluZWQsICfRgC4nXSwKICAgICAgICAnUldGJzogW3VuZGVmaW5lZCwgJ1JGJywgMF0sCiAgICAgICAgJ1NCRCc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ1NFSyc6IFt1bmRlZmluZWQsICdrcicsIDJdLAogICAgICAgICdTR0QnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgICAgICdTSFAnOiBbdW5kZWZpbmVkLCAnwqMnXSwKICAgICAgICAnU0xMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnU09TJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnU1JEJzogW3VuZGVmaW5lZCwgJyQnXSwKICAgICAgICAnU1NQJzogW3VuZGVmaW5lZCwgJ8KjJ10sCiAgICAgICAgJ1NURCc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1NUTic6IFt1bmRlZmluZWQsICdEYiddLAogICAgICAgICdTWVAnOiBbdW5kZWZpbmVkLCAnwqMnLCAwXSwKICAgICAgICAnVEhCJzogW3VuZGVmaW5lZCwgJ+C4vyddLAogICAgICAgICdUTU0nOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdUTkQnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDNdLAogICAgICAgICdUT1AnOiBbdW5kZWZpbmVkLCAnVCQnXSwKICAgICAgICAnVFJMJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnVFJZJzogW3VuZGVmaW5lZCwgJ+KCuiddLAogICAgICAgICdUVEQnOiBbdW5kZWZpbmVkLCAnJCddLAogICAgICAgICdUV0QnOiBbJ05UJCcsICckJywgMl0sCiAgICAgICAgJ1RaUyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sCiAgICAgICAgJ1VBSCc6IFt1bmRlZmluZWQsICfigrQnXSwKICAgICAgICAnVUdYJzogW3VuZGVmaW5lZCwgdW5kZWZpbmVkLCAwXSwKICAgICAgICAnVVNEJzogWyckJ10sCiAgICAgICAgJ1VZSSc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1VZVSc6IFt1bmRlZmluZWQsICckJ10sCiAgICAgICAgJ1VZVyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgNF0sCiAgICAgICAgJ1VaUyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMl0sCiAgICAgICAgJ1ZFRic6IFt1bmRlZmluZWQsICdCcycsIDJdLAogICAgICAgICdWTkQnOiBbJ+KCqycsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1ZVVic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1hBRic6IFsnRkNGQScsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1hDRCc6IFsnRUMkJywgJyQnXSwKICAgICAgICAnWE9GJzogWydDRkEnLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdYUEYnOiBbJ0NGUEYnLCB1bmRlZmluZWQsIDBdLAogICAgICAgICdYWFgnOiBbJ8KkJ10sCiAgICAgICAgJ1lFUic6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1pBUic6IFt1bmRlZmluZWQsICdSJ10sCiAgICAgICAgJ1pNSyc6IFt1bmRlZmluZWQsIHVuZGVmaW5lZCwgMF0sCiAgICAgICAgJ1pNVyc6IFt1bmRlZmluZWQsICdaSyddLAogICAgICAgICdaV0QnOiBbdW5kZWZpbmVkLCB1bmRlZmluZWQsIDBdCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2xvY2FsZV9kYXRhX2FwaS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IE51bWJlckZvcm1hdFN0eWxlID0gewogICAgICAgIERlY2ltYWw6IDAsCiAgICAgICAgUGVyY2VudDogMSwKICAgICAgICBDdXJyZW5jeTogMiwKICAgICAgICBTY2llbnRpZmljOiAzLAogICAgfTsKICAgIE51bWJlckZvcm1hdFN0eWxlW051bWJlckZvcm1hdFN0eWxlLkRlY2ltYWxdID0gJ0RlY2ltYWwnOwogICAgTnVtYmVyRm9ybWF0U3R5bGVbTnVtYmVyRm9ybWF0U3R5bGUuUGVyY2VudF0gPSAnUGVyY2VudCc7CiAgICBOdW1iZXJGb3JtYXRTdHlsZVtOdW1iZXJGb3JtYXRTdHlsZS5DdXJyZW5jeV0gPSAnQ3VycmVuY3knOwogICAgTnVtYmVyRm9ybWF0U3R5bGVbTnVtYmVyRm9ybWF0U3R5bGUuU2NpZW50aWZpY10gPSAnU2NpZW50aWZpYyc7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IFBsdXJhbCA9IHsKICAgICAgICBaZXJvOiAwLAogICAgICAgIE9uZTogMSwKICAgICAgICBUd286IDIsCiAgICAgICAgRmV3OiAzLAogICAgICAgIE1hbnk6IDQsCiAgICAgICAgT3RoZXI6IDUsCiAgICB9OwogICAgUGx1cmFsW1BsdXJhbC5aZXJvXSA9ICdaZXJvJzsKICAgIFBsdXJhbFtQbHVyYWwuT25lXSA9ICdPbmUnOwogICAgUGx1cmFsW1BsdXJhbC5Ud29dID0gJ1R3byc7CiAgICBQbHVyYWxbUGx1cmFsLkZld10gPSAnRmV3JzsKICAgIFBsdXJhbFtQbHVyYWwuTWFueV0gPSAnTWFueSc7CiAgICBQbHVyYWxbUGx1cmFsLk90aGVyXSA9ICdPdGhlcic7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IEZvcm1TdHlsZSA9IHsKICAgICAgICBGb3JtYXQ6IDAsCiAgICAgICAgU3RhbmRhbG9uZTogMSwKICAgIH07CiAgICBGb3JtU3R5bGVbRm9ybVN0eWxlLkZvcm1hdF0gPSAnRm9ybWF0JzsKICAgIEZvcm1TdHlsZVtGb3JtU3R5bGUuU3RhbmRhbG9uZV0gPSAnU3RhbmRhbG9uZSc7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IFRyYW5zbGF0aW9uV2lkdGggPSB7CiAgICAgICAgLyoqIDEgY2hhcmFjdGVyIGZvciBgZW4tVVNgLiBGb3IgZXhhbXBsZTogJ1MnICovCiAgICAgICAgTmFycm93OiAwLAogICAgICAgIC8qKiAzIGNoYXJhY3RlcnMgZm9yIGBlbi1VU2AuIEZvciBleGFtcGxlOiAnU3VuJyAqLwogICAgICAgIEFiYnJldmlhdGVkOiAxLAogICAgICAgIC8qKiBGdWxsIGxlbmd0aCBmb3IgYGVuLVVTYC4gRm9yIGV4YW1wbGU6ICJTdW5kYXkiICovCiAgICAgICAgV2lkZTogMiwKICAgICAgICAvKiogMiBjaGFyYWN0ZXJzIGZvciBgZW4tVVNgLCBGb3IgZXhhbXBsZTogIlN1IiAqLwogICAgICAgIFNob3J0OiAzLAogICAgfTsKICAgIFRyYW5zbGF0aW9uV2lkdGhbVHJhbnNsYXRpb25XaWR0aC5OYXJyb3ddID0gJ05hcnJvdyc7CiAgICBUcmFuc2xhdGlvbldpZHRoW1RyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWRdID0gJ0FiYnJldmlhdGVkJzsKICAgIFRyYW5zbGF0aW9uV2lkdGhbVHJhbnNsYXRpb25XaWR0aC5XaWRlXSA9ICdXaWRlJzsKICAgIFRyYW5zbGF0aW9uV2lkdGhbVHJhbnNsYXRpb25XaWR0aC5TaG9ydF0gPSAnU2hvcnQnOwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBGb3JtYXRXaWR0aCA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBGb3IgYGVuLVVTYCwgJ00vZC95eSwgaDptbSBhJ2AKICAgICAgICAgKiAoRXhhbXBsZTogYDYvMTUvMTUsIDk6MDMgQU1gKQogICAgICAgICAqLwogICAgICAgIFNob3J0OiAwLAogICAgICAgIC8qKgogICAgICAgICAqIEZvciBgZW4tVVNgLCBgJ01NTSBkLCB5LCBoOm1tOnNzIGEnYAogICAgICAgICAqIChFeGFtcGxlOiBgSnVuIDE1LCAyMDE1LCA5OjAzOjAxIEFNYCkKICAgICAgICAgKi8KICAgICAgICBNZWRpdW06IDEsCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGBlbi1VU2AsIGAnTU1NTSBkLCB5LCBoOm1tOnNzIGEgeidgCiAgICAgICAgICogKEV4YW1wbGU6IGBKdW5lIDE1LCAyMDE1IGF0IDk6MDM6MDEgQU0gR01UKzFgKQogICAgICAgICAqLwogICAgICAgIExvbmc6IDIsCiAgICAgICAgLyoqCiAgICAgICAgICogRm9yIGBlbi1VU2AsIGAnRUVFRSwgTU1NTSBkLCB5LCBoOm1tOnNzIGEgenp6eidgCiAgICAgICAgICogKEV4YW1wbGU6IGBNb25kYXksIEp1bmUgMTUsIDIwMTUgYXQgOTowMzowMSBBTSBHTVQrMDE6MDBgKQogICAgICAgICAqLwogICAgICAgIEZ1bGw6IDMsCiAgICB9OwogICAgRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGguU2hvcnRdID0gJ1Nob3J0JzsKICAgIEZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLk1lZGl1bV0gPSAnTWVkaXVtJzsKICAgIEZvcm1hdFdpZHRoW0Zvcm1hdFdpZHRoLkxvbmddID0gJ0xvbmcnOwogICAgRm9ybWF0V2lkdGhbRm9ybWF0V2lkdGguRnVsbF0gPSAnRnVsbCc7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IE51bWJlclN5bWJvbCA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBEZWNpbWFsIHNlcGFyYXRvci4KICAgICAgICAgKiBGb3IgYGVuLVVTYCwgdGhlIGRvdCBjaGFyYWN0ZXIuCiAgICAgICAgICogRXhhbXBsZSA6IDIsMzQ1YC5gNjcKICAgICAgICAgKi8KICAgICAgICBEZWNpbWFsOiAwLAogICAgICAgIC8qKgogICAgICAgICAqIEdyb3VwaW5nIHNlcGFyYXRvciwgdHlwaWNhbGx5IGZvciB0aG91c2FuZHMuCiAgICAgICAgICogRm9yIGBlbi1VU2AsIHRoZSBjb21tYSBjaGFyYWN0ZXIuCiAgICAgICAgICogRXhhbXBsZTogMmAsYDM0NS42NwogICAgICAgICAqLwogICAgICAgIEdyb3VwOiAxLAogICAgICAgIC8qKgogICAgICAgICAqIExpc3QtaXRlbSBzZXBhcmF0b3IuCiAgICAgICAgICogRXhhbXBsZTogIm9uZSwgdHdvLCBhbmQgdGhyZWUiCiAgICAgICAgICovCiAgICAgICAgTGlzdDogMiwKICAgICAgICAvKioKICAgICAgICAgKiBTaWduIGZvciBwZXJjZW50YWdlIChvdXQgb2YgMTAwKS4KICAgICAgICAgKiBFeGFtcGxlOiAyMy40JQogICAgICAgICAqLwogICAgICAgIFBlcmNlbnRTaWduOiAzLAogICAgICAgIC8qKgogICAgICAgICAqIFNpZ24gZm9yIHBvc2l0aXZlIG51bWJlcnMuCiAgICAgICAgICogRXhhbXBsZTogKzIzCiAgICAgICAgICovCiAgICAgICAgUGx1c1NpZ246IDQsCiAgICAgICAgLyoqCiAgICAgICAgICogU2lnbiBmb3IgbmVnYXRpdmUgbnVtYmVycy4KICAgICAgICAgKiBFeGFtcGxlOiAtMjMKICAgICAgICAgKi8KICAgICAgICBNaW51c1NpZ246IDUsCiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcHV0ZXIgbm90YXRpb24gZm9yIGV4cG9uZW50aWFsIHZhbHVlIChuIHRpbWVzIGEgcG93ZXIgb2YgMTApLgogICAgICAgICAqIEV4YW1wbGU6IDEuMkUzCiAgICAgICAgICovCiAgICAgICAgRXhwb25lbnRpYWw6IDYsCiAgICAgICAgLyoqCiAgICAgICAgICogSHVtYW4tcmVhZGFibGUgZm9ybWF0IG9mIGV4cG9uZW50aWFsLgogICAgICAgICAqIEV4YW1wbGU6IDEuMngxMDMKICAgICAgICAgKi8KICAgICAgICBTdXBlcnNjcmlwdGluZ0V4cG9uZW50OiA3LAogICAgICAgIC8qKgogICAgICAgICAqIFNpZ24gZm9yIHBlcm1pbGxlIChvdXQgb2YgMTAwMCkuCiAgICAgICAgICogRXhhbXBsZTogMjMuNOKAsAogICAgICAgICAqLwogICAgICAgIFBlck1pbGxlOiA4LAogICAgICAgIC8qKgogICAgICAgICAqIEluZmluaXR5LCBjYW4gYmUgdXNlZCB3aXRoIHBsdXMgYW5kIG1pbnVzLgogICAgICAgICAqIEV4YW1wbGU6IOKIniwgK+KIniwgLeKIngogICAgICAgICAqLwogICAgICAgIEluZmluaXR5OiA5LAogICAgICAgIC8qKgogICAgICAgICAqIE5vdCBhIG51bWJlci4KICAgICAgICAgKiBFeGFtcGxlOiBOYU4KICAgICAgICAgKi8KICAgICAgICBOYU46IDEwLAogICAgICAgIC8qKgogICAgICAgICAqIFN5bWJvbCB1c2VkIGJldHdlZW4gdGltZSB1bml0cy4KICAgICAgICAgKiBFeGFtcGxlOiAxMDo1MgogICAgICAgICAqLwogICAgICAgIFRpbWVTZXBhcmF0b3I6IDExLAogICAgICAgIC8qKgogICAgICAgICAqIERlY2ltYWwgc2VwYXJhdG9yIGZvciBjdXJyZW5jeSB2YWx1ZXMgKGZhbGxiYWNrIHRvIGBEZWNpbWFsYCkuCiAgICAgICAgICogRXhhbXBsZTogJDIsMzQ1LjY3CiAgICAgICAgICovCiAgICAgICAgQ3VycmVuY3lEZWNpbWFsOiAxMiwKICAgICAgICAvKioKICAgICAgICAgKiBHcm91cCBzZXBhcmF0b3IgZm9yIGN1cnJlbmN5IHZhbHVlcyAoZmFsbGJhY2sgdG8gYEdyb3VwYCkuCiAgICAgICAgICogRXhhbXBsZTogJDIsMzQ1LjY3CiAgICAgICAgICovCiAgICAgICAgQ3VycmVuY3lHcm91cDogMTMsCiAgICB9OwogICAgTnVtYmVyU3ltYm9sW051bWJlclN5bWJvbC5EZWNpbWFsXSA9ICdEZWNpbWFsJzsKICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuR3JvdXBdID0gJ0dyb3VwJzsKICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuTGlzdF0gPSAnTGlzdCc7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlBlcmNlbnRTaWduXSA9ICdQZXJjZW50U2lnbic7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlBsdXNTaWduXSA9ICdQbHVzU2lnbic7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLk1pbnVzU2lnbl0gPSAnTWludXNTaWduJzsKICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuRXhwb25lbnRpYWxdID0gJ0V4cG9uZW50aWFsJzsKICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuU3VwZXJzY3JpcHRpbmdFeHBvbmVudF0gPSAnU3VwZXJzY3JpcHRpbmdFeHBvbmVudCc7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLlBlck1pbGxlXSA9ICdQZXJNaWxsZSc7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkluZmluaXR5XSA9ICdJbmZpbml0eSc7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLk5hTl0gPSAnTmFOJzsKICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuVGltZVNlcGFyYXRvcl0gPSAnVGltZVNlcGFyYXRvcic7CiAgICBOdW1iZXJTeW1ib2xbTnVtYmVyU3ltYm9sLkN1cnJlbmN5RGVjaW1hbF0gPSAnQ3VycmVuY3lEZWNpbWFsJzsKICAgIE51bWJlclN5bWJvbFtOdW1iZXJTeW1ib2wuQ3VycmVuY3lHcm91cF0gPSAnQ3VycmVuY3lHcm91cCc7CiAgICAvKioKICAgICAqIFJldHJpZXZlcyB0aGUgbG9jYWxlIElEIGZyb20gdGhlIGN1cnJlbnRseSBsb2FkZWQgbG9jYWxlLgogICAgICogVGhlIGxvYWRlZCBsb2NhbGUgY291bGQgYmUsIGZvciBleGFtcGxlLCBhIGdsb2JhbCBvbmUgcmF0aGVyIHRoYW4gYSByZWdpb25hbCBvbmUuCiAgICAgKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlLCBzdWNoIGFzIGBmci1GUmAuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxlIGNvZGUuIEZvciBleGFtcGxlLCBgZnJgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVJZCQxKGxvY2FsZSkgewogICAgICAgIHJldHVybiBmaW5kTG9jYWxlRGF0YShsb2NhbGUpW0xvY2FsZURhdGFJbmRleC5Mb2NhbGVJZF07CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBkYXkgcGVyaW9kIHN0cmluZ3MgZm9yIHRoZSBnaXZlbiBsb2NhbGUuCiAgICAgKgogICAgICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogQHBhcmFtIHs/fSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uCiAgICAgKiBAcGFyYW0gez99IHdpZHRoIFRoZSByZXF1aXJlZCBjaGFyYWN0ZXIgd2lkdGguCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBhcnJheSBvZiBsb2NhbGl6ZWQgcGVyaW9kIHN0cmluZ3MuIEZvciBleGFtcGxlLCBgW0FNLCBQTV1gIGZvciBgZW4tVVNgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybVN0eWxlLCB3aWR0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW1QbURhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoWwogICAgICAgICAgICBkYXRhW0xvY2FsZURhdGFJbmRleC5EYXlQZXJpb2RzRm9ybWF0XSwgZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF5UGVyaW9kc1N0YW5kYWxvbmVdCiAgICAgICAgXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbVBtID0gZ2V0TGFzdERlZmluZWRWYWx1ZShhbVBtRGF0YSwgZm9ybVN0eWxlKTsKICAgICAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShhbVBtLCB3aWR0aCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBkYXlzIG9mIHRoZSB3ZWVrIGZvciB0aGUgZ2l2ZW4gbG9jYWxlLCB1c2luZyB0aGUgR3JlZ29yaWFuIGNhbGVuZGFyLgogICAgICoKICAgICAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIEBwYXJhbSB7P30gZm9ybVN0eWxlIFRoZSByZXF1aXJlZCBncmFtbWF0aWNhbCBmb3JtLgogICAgICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgcmVxdWlyZWQgY2hhcmFjdGVyIHdpZHRoLgogICAgICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgbG9jYWxpemVkIG5hbWUgc3RyaW5ncy4KICAgICAqIEZvciBleGFtcGxlLGBbU3VuZGF5LCBNb25kYXksIC4uLiBTYXR1cmRheV1gIGZvciBgZW4tVVNgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVEYXlOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRheXNEYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKFtkYXRhW0xvY2FsZURhdGFJbmRleC5EYXlzRm9ybWF0XSwgZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF5c1N0YW5kYWxvbmVdXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXlzID0gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXlzRGF0YSwgZm9ybVN0eWxlKTsKICAgICAgICByZXR1cm4gZ2V0TGFzdERlZmluZWRWYWx1ZShkYXlzLCB3aWR0aCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBtb250aHMgb2YgdGhlIHllYXIgZm9yIHRoZSBnaXZlbiBsb2NhbGUsIHVzaW5nIHRoZSBHcmVnb3JpYW4gY2FsZW5kYXIuCiAgICAgKgogICAgICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogQHBhcmFtIHs/fSBmb3JtU3R5bGUgVGhlIHJlcXVpcmVkIGdyYW1tYXRpY2FsIGZvcm0uCiAgICAgKiBAcGFyYW0gez99IHdpZHRoIFRoZSByZXF1aXJlZCBjaGFyYWN0ZXIgd2lkdGguCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBhcnJheSBvZiBsb2NhbGl6ZWQgbmFtZSBzdHJpbmdzLgogICAgICogRm9yIGV4YW1wbGUsICBgW0phbnVhcnksIEZlYnJ1YXJ5LCAuLi5dYCBmb3IgYGVuLVVTYC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TG9jYWxlTW9udGhOYW1lcyhsb2NhbGUsIGZvcm1TdHlsZSwgd2lkdGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1vbnRoc0RhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW2RhdGFbTG9jYWxlRGF0YUluZGV4Lk1vbnRoc0Zvcm1hdF0sIGRhdGFbTG9jYWxlRGF0YUluZGV4Lk1vbnRoc1N0YW5kYWxvbmVdXSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtb250aHMgPSBnZXRMYXN0RGVmaW5lZFZhbHVlKG1vbnRoc0RhdGEsIGZvcm1TdHlsZSk7CiAgICAgICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUobW9udGhzLCB3aWR0aCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBHcmVnb3JpYW4tY2FsZW5kYXIgZXJhcyBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KICAgICAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICAgICAqIEByZXR1cm4gez99IEFuIGFycmF5IG9mIGxvY2FsaXplZCBlcmEgc3RyaW5ncy4KICAgICAqIEZvciBleGFtcGxlLCBgW0FELCBCQ11gIGZvciBgZW4tVVNgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVFcmFOYW1lcyhsb2NhbGUsIHdpZHRoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlcmFzRGF0YSA9ICgvKiogQHR5cGUgez99ICovIChkYXRhW0xvY2FsZURhdGFJbmRleC5FcmFzXSkpOwogICAgICAgIHJldHVybiBnZXRMYXN0RGVmaW5lZFZhbHVlKGVyYXNEYXRhLCB3aWR0aCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBkYXRlLXZhbHVlIGZvcm1hdGluZyBzdHJpbmcuCiAgICAgKgogICAgICogQHNlZSBgRm9ybWF0V2lkdGhgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAqIEBwYXJhbSB7P30gd2lkdGggVGhlIGZvcm1hdCB0eXBlLgogICAgICogQHJldHVybiB7P30gVGhlIGxvY2FsaXplZCBmb3JtYXRpbmcgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgd2lkdGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICAgICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF0ZUZvcm1hdF0sIHdpZHRoKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGEgbG9jYWxpemVkIHRpbWUtdmFsdWUgZm9ybWF0dGluZyBzdHJpbmcuCiAgICAgKgogICAgICogQHNlZSBgRm9ybWF0V2lkdGhgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgZm9ybWF0IHR5cGUuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgd2lkdGgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0YSA9IGZpbmRMb2NhbGVEYXRhKGxvY2FsZSk7CiAgICAgICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF0YVtMb2NhbGVEYXRhSW5kZXguVGltZUZvcm1hdF0sIHdpZHRoKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGEgbG9jYWxpemVkIGRhdGUtdGltZSBmb3JtYXR0aW5nIHN0cmluZy4KICAgICAqCiAgICAgKiBAc2VlIGBGb3JtYXRXaWR0aGAgLyBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogQHBhcmFtIHs/fSB3aWR0aCBUaGUgZm9ybWF0IHR5cGUuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbG9jYWxpemVkIGZvcm1hdHRpbmcgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVEYXRlVGltZUZvcm1hdChsb2NhbGUsIHdpZHRoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRlVGltZUZvcm1hdERhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YVtMb2NhbGVEYXRhSW5kZXguRGF0ZVRpbWVGb3JtYXRdKSk7CiAgICAgICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF0ZVRpbWVGb3JtYXREYXRhLCB3aWR0aCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIGxvY2FsaXplZCBudW1iZXIgc3ltYm9sIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZSBwbGFjZWhvbGRlcnMgaW4gbnVtYmVyIGZvcm1hdHMuCiAgICAgKiBAc2VlIGBOdW1iZXJTeW1ib2xgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlIFRoZSBsb2NhbGUgY29kZS4KICAgICAqIEBwYXJhbSB7P30gc3ltYm9sIFRoZSBzeW1ib2wgdG8gbG9jYWxpemUuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgY2hhcmFjdGVyIGZvciB0aGUgbG9jYWxpemVkIHN5bWJvbC4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgc3ltYm9sKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGEgPSBmaW5kTG9jYWxlRGF0YShsb2NhbGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXMgPSBkYXRhW0xvY2FsZURhdGFJbmRleC5OdW1iZXJTeW1ib2xzXVtzeW1ib2xdOwogICAgICAgIGlmICh0eXBlb2YgcmVzID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICBpZiAoc3ltYm9sID09PSBOdW1iZXJTeW1ib2wuQ3VycmVuY3lEZWNpbWFsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YVtMb2NhbGVEYXRhSW5kZXguTnVtYmVyU3ltYm9sc11bTnVtYmVyU3ltYm9sLkRlY2ltYWxdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHN5bWJvbCA9PT0gTnVtYmVyU3ltYm9sLkN1cnJlbmN5R3JvdXApIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYXRhW0xvY2FsZURhdGFJbmRleC5OdW1iZXJTeW1ib2xzXVtOdW1iZXJTeW1ib2wuR3JvdXBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXM7CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyBhIG51bWJlciBmb3JtYXQgZm9yIGEgZ2l2ZW4gbG9jYWxlLgogICAgICoKICAgICAqIE51bWJlcnMgYXJlIGZvcm1hdHRlZCB1c2luZyBwYXR0ZXJucywgbGlrZSBgIywjIyMuMDBgLiBGb3IgZXhhbXBsZSwgdGhlIHBhdHRlcm4gYCMsIyMjLjAwYAogICAgICogd2hlbiB1c2VkIHRvIGZvcm1hdCB0aGUgbnVtYmVyIDEyMzQ1LjY3OCBjb3VsZCByZXN1bHQgaW4gIjEyJzM0NSw2NzgiLiBUaGF0IHdvdWxkIGhhcHBlbiBpZiB0aGUKICAgICAqIGdyb3VwaW5nIHNlcGFyYXRvciBmb3IgeW91ciBsYW5ndWFnZSBpcyBhbiBhcG9zdHJvcGhlLCBhbmQgdGhlIGRlY2ltYWwgc2VwYXJhdG9yIGlzIGEgY29tbWEuCiAgICAgKgogICAgICogPGI+SW1wb3J0YW50OjwvYj4gVGhlIGNoYXJhY3RlcnMgYC5gIGAsYCBgMGAgYCNgIChhbmQgb3RoZXJzIGJlbG93KSBhcmUgc3BlY2lhbCBwbGFjZWhvbGRlcnMKICAgICAqIHRoYXQgc3RhbmQgZm9yIHRoZSBkZWNpbWFsIHNlcGFyYXRvciwgYW5kIHNvIG9uLCBhbmQgYXJlIE5PVCByZWFsIGNoYXJhY3RlcnMuCiAgICAgKiBZb3UgbXVzdCBOT1QgInRyYW5zbGF0ZSIgdGhlIHBsYWNlaG9sZGVycy4gRm9yIGV4YW1wbGUsIGRvbid0IGNoYW5nZSBgLmAgdG8gYCxgIGV2ZW4gdGhvdWdoIGluCiAgICAgKiB5b3VyIGxhbmd1YWdlIHRoZSBkZWNpbWFsIHBvaW50IGlzIHdyaXR0ZW4gd2l0aCBhIGNvbW1hLiBUaGUgc3ltYm9scyBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlCiAgICAgKiBsb2NhbCBlcXVpdmFsZW50cywgdXNpbmcgdGhlIGFwcHJvcHJpYXRlIGBOdW1iZXJTeW1ib2xgIGZvciB5b3VyIGxhbmd1YWdlLgogICAgICoKICAgICAqIEhlcmUgYXJlIHRoZSBzcGVjaWFsIGNoYXJhY3RlcnMgdXNlZCBpbiBudW1iZXIgcGF0dGVybnM6CiAgICAgKgogICAgICogfCBTeW1ib2wgfCBNZWFuaW5nIHwKICAgICAqIHwtLS0tLS0tLXwtLS0tLS0tLS18CiAgICAgKiB8IC4gfCBSZXBsYWNlZCBhdXRvbWF0aWNhbGx5IGJ5IHRoZSBjaGFyYWN0ZXIgdXNlZCBmb3IgdGhlIGRlY2ltYWwgcG9pbnQuIHwKICAgICAqIHwgLCB8IFJlcGxhY2VkIGJ5IHRoZSAiZ3JvdXBpbmciICh0aG91c2FuZHMpIHNlcGFyYXRvci4gfAogICAgICogfCAwIHwgUmVwbGFjZWQgYnkgYSBkaWdpdCAob3IgemVybyBpZiB0aGVyZSBhcmVuJ3QgZW5vdWdoIGRpZ2l0cykuIHwKICAgICAqIHwgIyB8IFJlcGxhY2VkIGJ5IGEgZGlnaXQgKG9yIG5vdGhpbmcgaWYgdGhlcmUgYXJlbid0IGVub3VnaCkuIHwKICAgICAqIHwgwqQgfCBSZXBsYWNlZCBieSBhIGN1cnJlbmN5IHN5bWJvbCwgc3VjaCBhcyAkIG9yIFVTRC4gfAogICAgICogfCAlIHwgTWFya3MgYSBwZXJjZW50IGZvcm1hdC4gVGhlICUgc3ltYm9sIG1heSBjaGFuZ2UgcG9zaXRpb24sIGJ1dCBtdXN0IGJlIHJldGFpbmVkLiB8CiAgICAgKiB8IEUgfCBNYXJrcyBhIHNjaWVudGlmaWMgZm9ybWF0LiBUaGUgRSBzeW1ib2wgbWF5IGNoYW5nZSBwb3NpdGlvbiwgYnV0IG11c3QgYmUgcmV0YWluZWQuIHwKICAgICAqIHwgJyB8IFNwZWNpYWwgY2hhcmFjdGVycyB1c2VkIGFzIGxpdGVyYWwgY2hhcmFjdGVycyBhcmUgcXVvdGVkIHdpdGggQVNDSUkgc2luZ2xlIHF1b3Rlcy4gfAogICAgICoKICAgICAqIEBzZWUgYE51bWJlckZvcm1hdFN0eWxlYCAvIFtDTERSIHdlYnNpdGVdKGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL3RyYW5zbGF0aW9uL251bWJlci1wYXR0ZXJucykgLyBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogQHBhcmFtIHs/fSB0eXBlIFRoZSB0eXBlIG9mIG51bWVyaWMgdmFsdWUgdG8gYmUgZm9ybWF0dGVkIChzdWNoIGFzIGBEZWNpbWFsYCBvciBgQ3VycmVuY3lgLikKICAgICAqIEByZXR1cm4gez99IFRoZSBsb2NhbGl6ZWQgZm9ybWF0IHN0cmluZy4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgdHlwZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgICAgICByZXR1cm4gZGF0YVtMb2NhbGVEYXRhSW5kZXguTnVtYmVyRm9ybWF0c11bdHlwZV07CiAgICB9CiAgICAvKioKICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVuY3kgdmFsdWVzIGZvciBhIGdpdmVuIGxvY2FsZS4KICAgICAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgY3VycmVuY3kgdmFsdWVzLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVDdXJyZW5jaWVzKGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgICAgICByZXR1cm4gZGF0YVtMb2NhbGVEYXRhSW5kZXguQ3VycmVuY2llc107CiAgICB9CiAgICAvKioKICAgICAqIFxAYWxpYXMgY29yZS/JtWdldExvY2FsZVBsdXJhbENhc2UKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgZ2V0TG9jYWxlUGx1cmFsQ2FzZSQxID0gZ2V0TG9jYWxlUGx1cmFsQ2FzZTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0Z1bGxEYXRhKGRhdGEpIHsKICAgICAgICBpZiAoIWRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV0pIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGV4dHJhIGxvY2FsZSBkYXRhIGZvciB0aGUgbG9jYWxlICIke2RhdGFbTG9jYWxlRGF0YUluZGV4CiAgICAgICAgICAgIC5Mb2NhbGVJZF19Ii4gVXNlICJyZWdpc3RlckxvY2FsZURhdGEiIHRvIGxvYWQgbmV3IGRhdGEuIFNlZSB0aGUgIkkxOG4gZ3VpZGUiIG9uIGFuZ3VsYXIuaW8gdG8ga25vdyBtb3JlLmApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGxvY2FsZS1zcGVjaWZpYyBydWxlcyB1c2VkIHRvIGRldGVybWluZSB3aGljaCBkYXkgcGVyaW9kIHRvIHVzZQogICAgICogd2hlbiBtb3JlIHRoYW4gb25lIHBlcmlvZCBpcyBkZWZpbmVkIGZvciBhIGxvY2FsZS4KICAgICAqCiAgICAgKiBUaGVyZSBpcyBhIHJ1bGUgZm9yIGVhY2ggZGVmaW5lZCBkYXkgcGVyaW9kLiBUaGUKICAgICAqIGZpcnN0IHJ1bGUgaXMgYXBwbGllZCB0byB0aGUgZmlyc3QgZGF5IHBlcmlvZCBhbmQgc28gb24uCiAgICAgKiBGYWxsIGJhY2sgdG8gQU0vUE0gd2hlbiBubyBydWxlcyBhcmUgYXZhaWxhYmxlLgogICAgICoKICAgICAqIEEgcnVsZSBjYW4gc3BlY2lmeSBhIHBlcmlvZCBhcyB0aW1lIHJhbmdlLCBvciBhcyBhIHNpbmdsZSB0aW1lIHZhbHVlLgogICAgICoKICAgICAqIFRoaXMgZnVuY3Rpb25hbGl0eSBpcyBvbmx5IGF2YWlsYWJsZSB3aGVuIHlvdSBoYXZlIGxvYWRlZCB0aGUgZnVsbCBsb2NhbGUgZGF0YS4KICAgICAqIFNlZSB0aGUgWyJJMThuIGd1aWRlIl0oZ3VpZGUvaTE4biNpMThuLXBpcGVzKS4KICAgICAqCiAgICAgKiBAc2VlIGBnZXRMb2NhbGVFeHRyYURheVBlcmlvZHMoKWAgLyBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICogQHJldHVybiB7P30gVGhlIHJ1bGVzIGZvciB0aGUgbG9jYWxlLCBhIHNpbmdsZSB0aW1lIHZhbHVlIG9yIGFycmF5IG9mICpmcm9tLXRpbWUsIHRvLXRpbWUqLAogICAgICogb3IgbnVsbCBpZiBubyBwZXJpb2RzIGFyZSBhdmFpbGFibGUuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBnZXRMb2NhbGVFeHRyYURheVBlcmlvZFJ1bGVzKGxvY2FsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgICAgICBjaGVja0Z1bGxEYXRhKGRhdGEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBydWxlcyA9IGRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV1bMiAvKiBFeHRyYURheVBlcmlvZHNSdWxlcyAqL10gfHwgW107CiAgICAgICAgcmV0dXJuIHJ1bGVzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBydWxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocnVsZSkgPT4gewogICAgICAgICAgICBpZiAodHlwZW9mIHJ1bGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZXh0cmFjdFRpbWUocnVsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIFtleHRyYWN0VGltZShydWxlWzBdKSwgZXh0cmFjdFRpbWUocnVsZVsxXSldOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0cmlldmVzIGxvY2FsZS1zcGVjaWZpYyBkYXkgcGVyaW9kcywgd2hpY2ggaW5kaWNhdGUgcm91Z2hseSBob3cgYSBkYXkgaXMgYnJva2VuIHVwCiAgICAgKiBpbiBkaWZmZXJlbnQgbGFuZ3VhZ2VzLgogICAgICogRm9yIGV4YW1wbGUsIGZvciBgZW4tVVNgLCBwZXJpb2RzIGFyZSBtb3JuaW5nLCBub29uLCBhZnRlcm5vb24sIGV2ZW5pbmcsIGFuZCBtaWRuaWdodC4KICAgICAqCiAgICAgKiBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBhdmFpbGFibGUgd2hlbiB5b3UgaGF2ZSBsb2FkZWQgdGhlIGZ1bGwgbG9jYWxlIGRhdGEuCiAgICAgKiBTZWUgdGhlIFsiSTE4biBndWlkZSJdKGd1aWRlL2kxOG4jaTE4bi1waXBlcykuCiAgICAgKgogICAgICogQHNlZSBgZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RSdWxlcygpYCAvIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcGFyYW0gez99IGZvcm1TdHlsZSBUaGUgcmVxdWlyZWQgZ3JhbW1hdGljYWwgZm9ybS4KICAgICAqIEBwYXJhbSB7P30gd2lkdGggVGhlIHJlcXVpcmVkIGNoYXJhY3RlciB3aWR0aC4KICAgICAqIEByZXR1cm4gez99IFRoZSB0cmFuc2xhdGVkIGRheS1wZXJpb2Qgc3RyaW5ncy4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybVN0eWxlLCB3aWR0aCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0gZmluZExvY2FsZURhdGEobG9jYWxlKTsKICAgICAgICBjaGVja0Z1bGxEYXRhKGRhdGEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXlQZXJpb2RzRGF0YSA9ICgvKiogQHR5cGUgez99ICovIChbCiAgICAgICAgICAgIGRhdGFbTG9jYWxlRGF0YUluZGV4LkV4dHJhRGF0YV1bMCAvKiBFeHRyYURheVBlcmlvZEZvcm1hdHMgKi9dLAogICAgICAgICAgICBkYXRhW0xvY2FsZURhdGFJbmRleC5FeHRyYURhdGFdWzEgLyogRXh0cmFEYXlQZXJpb2RTdGFuZGFsb25lICovXQogICAgICAgIF0pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF5UGVyaW9kcyA9IGdldExhc3REZWZpbmVkVmFsdWUoZGF5UGVyaW9kc0RhdGEsIGZvcm1TdHlsZSkgfHwgW107CiAgICAgICAgcmV0dXJuIGdldExhc3REZWZpbmVkVmFsdWUoZGF5UGVyaW9kcywgd2lkdGgpIHx8IFtdOwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IHZhbHVlIHRoYXQgaXMgZGVmaW5lZCBpbiBhbiBhcnJheSwgZ29pbmcgYmFja3dhcmRzIGZyb20gYW4gaW5kZXggcG9zaXRpb24uCiAgICAgKgogICAgICogVG8gYXZvaWQgcmVwZWF0aW5nIHRoZSBzYW1lIGRhdGEgKGFzIHdoZW4gdGhlICJmb3JtYXQiIGFuZCAic3RhbmRhbG9uZSIgZm9ybXMgYXJlIHRoZSBzYW1lKQogICAgICogYWRkIHRoZSBmaXJzdCB2YWx1ZSB0byB0aGUgbG9jYWxlIGRhdGEgYXJyYXlzLCBhbmQgYWRkIG90aGVyIHZhbHVlcyBvbmx5IGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KICAgICAqCiAgICAgKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBkYXRhIFRoZSBkYXRhIGFycmF5IHRvIHJldHJpZXZlIGZyb20uCiAgICAgKiBAcGFyYW0gez99IGluZGV4IEEgMC1iYXNlZCBpbmRleCBpbnRvIHRoZSBhcnJheSB0byBzdGFydCBmcm9tLgogICAgICogQHJldHVybiB7P30gVGhlIHZhbHVlIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZ2l2ZW4gaW5kZXggcG9zaXRpb24uCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldExhc3REZWZpbmVkVmFsdWUoZGF0YSwgaW5kZXgpIHsKICAgICAgICBmb3IgKGxldCBpID0gaW5kZXg7IGkgPiAtMTsgaS0tKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGF0YVtpXSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkYXRhW2ldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHRocm93IG5ldyBFcnJvcignTG9jYWxlIGRhdGEgQVBJOiBsb2NhbGUgZGF0YSB1bmRlZmluZWQnKTsKICAgIH0KICAgIC8qKgogICAgICogRXh0cmFjdHMgdGhlIGhvdXJzIGFuZCBtaW51dGVzIGZyb20gYSBzdHJpbmcgbGlrZSAiMTU6NDUiCiAgICAgKiBAcGFyYW0gez99IHRpbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGV4dHJhY3RUaW1lKHRpbWUpIHsKICAgICAgICBjb25zdCBbaCwgbV0gPSB0aW1lLnNwbGl0KCc6Jyk7CiAgICAgICAgcmV0dXJuIHsgaG91cnM6ICtoLCBtaW51dGVzOiArbSB9OwogICAgfQogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbmN5IHN5bWJvbCBmb3IgYSBnaXZlbiBjdXJyZW5jeSBjb2RlLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGRlZmF1bHQgYGVuLVVTYCBsb2NhbGUsIHRoZSBjb2RlIGBVU0RgIGNhbgogICAgICogYmUgcmVwcmVzZW50ZWQgYnkgdGhlIG5hcnJvdyBzeW1ib2wgYCRgIG9yIHRoZSB3aWRlIHN5bWJvbCBgVVMkYC4KICAgICAqCiAgICAgKiBAc2VlIFtJbnRlcm5hdGlvbmFsaXphdGlvbiAoaTE4bikgR3VpZGVdKGh0dHBzOi8vYW5ndWxhci5pby9ndWlkZS9pMThuKQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IGNvZGUgVGhlIGN1cnJlbmN5IGNvZGUuCiAgICAgKiBAcGFyYW0gez99IGZvcm1hdCBUaGUgZm9ybWF0LCBgd2lkZWAgb3IgYG5hcnJvd2AuCiAgICAgKiBAcGFyYW0gez89fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICoKICAgICAqIEByZXR1cm4gez99IFRoZSBzeW1ib2wsIG9yIHRoZSBjdXJyZW5jeSBjb2RlIGlmIG5vIHN5bWJvbCBpcyBhdmFpbGFibGUuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEN1cnJlbmN5U3ltYm9sKGNvZGUsIGZvcm1hdCwgbG9jYWxlID0gJ2VuJykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW5jeSA9IGdldExvY2FsZUN1cnJlbmNpZXMobG9jYWxlKVtjb2RlXSB8fCBDVVJSRU5DSUVTX0VOW2NvZGVdIHx8IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzeW1ib2xOYXJyb3cgPSBjdXJyZW5jeVsxIC8qIFN5bWJvbE5hcnJvdyAqL107CiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ25hcnJvdycgJiYgdHlwZW9mIHN5bWJvbE5hcnJvdyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgcmV0dXJuIHN5bWJvbE5hcnJvdzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbmN5WzAgLyogU3ltYm9sICovXSB8fCBjb2RlOwogICAgfQogICAgLy8gTW9zdCBjdXJyZW5jaWVzIGhhdmUgY2VudHMsIHRoYXQncyB3aHkgdGhlIGRlZmF1bHQgaXMgMgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREVGQVVMVF9OQl9PRl9DVVJSRU5DWV9ESUdJVFMgPSAyOwogICAgLyoqCiAgICAgKiBSZXBvcnRzIHRoZSBudW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgZm9yIGEgZ2l2ZW4gY3VycmVuY3kuCiAgICAgKiBUaGUgdmFsdWUgZGVwZW5kcyB1cG9uIHRoZSBwcmVzZW5jZSBvZiBjZW50cyBpbiB0aGF0IHBhcnRpY3VsYXIgY3VycmVuY3kuCiAgICAgKgogICAgICogQHNlZSBbSW50ZXJuYXRpb25hbGl6YXRpb24gKGkxOG4pIEd1aWRlXShodHRwczovL2FuZ3VsYXIuaW8vZ3VpZGUvaTE4bikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBjb2RlIFRoZSBjdXJyZW5jeSBjb2RlLgogICAgICogQHJldHVybiB7P30gVGhlIG51bWJlciBvZiBkZWNpbWFsIGRpZ2l0cywgdHlwaWNhbGx5IDAgb3IgMi4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TnVtYmVyT2ZDdXJyZW5jeURpZ2l0cyhjb2RlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkaWdpdHM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbmN5ID0gQ1VSUkVOQ0lFU19FTltjb2RlXTsKICAgICAgICBpZiAoY3VycmVuY3kpIHsKICAgICAgICAgICAgZGlnaXRzID0gY3VycmVuY3lbMiAvKiBOYk9mRGlnaXRzICovXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHR5cGVvZiBkaWdpdHMgPT09ICdudW1iZXInID8gZGlnaXRzIDogREVGQVVMVF9OQl9PRl9DVVJSRU5DWV9ESUdJVFM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2kxOG4vZm9ybWF0X2RhdGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSVNPODYwMV9EQVRFX1JFR0VYID0gL14oXGR7NH0pLT8oXGRcZCktPyhcZFxkKSg/OlQoXGRcZCkoPzo6PyhcZFxkKSg/Ojo/KFxkXGQpKD86XC4oXGQrKSk/KT8pPyhafChbKy1dKShcZFxkKTo/KFxkXGQpKT8pPyQvOwogICAgLy8gICAgMSAgICAgICAgMiAgICAgICAzICAgICAgICAgNCAgICAgICAgICA1ICAgICAgICAgIDYgICAgICAgICAgNyAgICAgICAgICA4ICA5ICAgICAxMCAgICAgIDExCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOQU1FRF9GT1JNQVRTID0ge307CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBEQVRFX0ZPUk1BVFNfU1BMSVQgPSAvKCg/OlteR3lNTHdXZEVhYkJoSG1zU3paTyddKyl8KD86Jyg/OlteJ118JycpKicpfCg/Okd7MSw1fXx5ezEsNH18TXsxLDV9fEx7MSw1fXx3ezEsMn18V3sxfXxkezEsMn18RXsxLDZ9fGF7MSw1fXxiezEsNX18QnsxLDV9fGh7MSwyfXxIezEsMn18bXsxLDJ9fHN7MSwyfXxTezEsM318ensxLDR9fFp7MSw1fXxPezEsNH0pKShbXHNcU10qKS87CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IFpvbmVXaWR0aCA9IHsKICAgICAgICBTaG9ydDogMCwKICAgICAgICBTaG9ydEdNVDogMSwKICAgICAgICBMb25nOiAyLAogICAgICAgIEV4dGVuZGVkOiAzLAogICAgfTsKICAgIFpvbmVXaWR0aFtab25lV2lkdGguU2hvcnRdID0gJ1Nob3J0JzsKICAgIFpvbmVXaWR0aFtab25lV2lkdGguU2hvcnRHTVRdID0gJ1Nob3J0R01UJzsKICAgIFpvbmVXaWR0aFtab25lV2lkdGguTG9uZ10gPSAnTG9uZyc7CiAgICBab25lV2lkdGhbWm9uZVdpZHRoLkV4dGVuZGVkXSA9ICdFeHRlbmRlZCc7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IERhdGVUeXBlID0gewogICAgICAgIEZ1bGxZZWFyOiAwLAogICAgICAgIE1vbnRoOiAxLAogICAgICAgIERhdGU6IDIsCiAgICAgICAgSG91cnM6IDMsCiAgICAgICAgTWludXRlczogNCwKICAgICAgICBTZWNvbmRzOiA1LAogICAgICAgIEZyYWN0aW9uYWxTZWNvbmRzOiA2LAogICAgICAgIERheTogNywKICAgIH07CiAgICBEYXRlVHlwZVtEYXRlVHlwZS5GdWxsWWVhcl0gPSAnRnVsbFllYXInOwogICAgRGF0ZVR5cGVbRGF0ZVR5cGUuTW9udGhdID0gJ01vbnRoJzsKICAgIERhdGVUeXBlW0RhdGVUeXBlLkRhdGVdID0gJ0RhdGUnOwogICAgRGF0ZVR5cGVbRGF0ZVR5cGUuSG91cnNdID0gJ0hvdXJzJzsKICAgIERhdGVUeXBlW0RhdGVUeXBlLk1pbnV0ZXNdID0gJ01pbnV0ZXMnOwogICAgRGF0ZVR5cGVbRGF0ZVR5cGUuU2Vjb25kc10gPSAnU2Vjb25kcyc7CiAgICBEYXRlVHlwZVtEYXRlVHlwZS5GcmFjdGlvbmFsU2Vjb25kc10gPSAnRnJhY3Rpb25hbFNlY29uZHMnOwogICAgRGF0ZVR5cGVbRGF0ZVR5cGUuRGF5XSA9ICdEYXknOwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBUcmFuc2xhdGlvblR5cGUgPSB7CiAgICAgICAgRGF5UGVyaW9kczogMCwKICAgICAgICBEYXlzOiAxLAogICAgICAgIE1vbnRoczogMiwKICAgICAgICBFcmFzOiAzLAogICAgfTsKICAgIFRyYW5zbGF0aW9uVHlwZVtUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kc10gPSAnRGF5UGVyaW9kcyc7CiAgICBUcmFuc2xhdGlvblR5cGVbVHJhbnNsYXRpb25UeXBlLkRheXNdID0gJ0RheXMnOwogICAgVHJhbnNsYXRpb25UeXBlW1RyYW5zbGF0aW9uVHlwZS5Nb250aHNdID0gJ01vbnRocyc7CiAgICBUcmFuc2xhdGlvblR5cGVbVHJhbnNsYXRpb25UeXBlLkVyYXNdID0gJ0VyYXMnOwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIEZvcm1hdHMgYSBkYXRlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuCiAgICAgKgogICAgICogQHNlZSBgRGF0ZVBpcGVgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGRhdGUgdG8gZm9ybWF0LCBhcyBhIERhdGUsIG9yIGEgbnVtYmVyIChtaWxsaXNlY29uZHMgc2luY2UgVVRDIGVwb2NoKQogICAgICogb3IgYW4gW0lTTyBkYXRlLXRpbWUgc3RyaW5nXShodHRwczovL3d3dy53My5vcmcvVFIvTk9URS1kYXRldGltZSkuCiAgICAgKiBAcGFyYW0gez99IGZvcm1hdCBUaGUgZGF0ZS10aW1lIGNvbXBvbmVudHMgdG8gaW5jbHVkZS4gU2VlIGBEYXRlUGlwZWAgZm9yIGRldGFpbHMuCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcGFyYW0gez89fSB0aW1lem9uZSBUaGUgdGltZSB6b25lLiBBIHRpbWUgem9uZSBvZmZzZXQgZnJvbSBHTVQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwKICAgICAqIG9yIGEgc3RhbmRhcmQgVVRDL0dNVCBvciBjb250aW5lbnRhbCBVUyB0aW1lIHpvbmUgYWJicmV2aWF0aW9uLgogICAgICogSWYgbm90IHNwZWNpZmllZCwgdXNlcyBob3N0IHN5c3RlbSBzZXR0aW5ncy4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIGRhdGUgc3RyaW5nLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gZm9ybWF0RGF0ZSh2YWx1ZSwgZm9ybWF0LCBsb2NhbGUsIHRpbWV6b25lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkYXRlID0gdG9EYXRlKHZhbHVlKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmFtZWRGb3JtYXQgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsIGZvcm1hdCk7CiAgICAgICAgZm9ybWF0ID0gbmFtZWRGb3JtYXQgfHwgZm9ybWF0OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcGFydHMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1hdGNoOwogICAgICAgIHdoaWxlIChmb3JtYXQpIHsKICAgICAgICAgICAgbWF0Y2ggPSBEQVRFX0ZPUk1BVFNfU1BMSVQuZXhlYyhmb3JtYXQpOwogICAgICAgICAgICBpZiAobWF0Y2gpIHsKICAgICAgICAgICAgICAgIHBhcnRzID0gcGFydHMuY29uY2F0KG1hdGNoLnNsaWNlKDEpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnQgPSBwYXJ0cy5wb3AoKTsKICAgICAgICAgICAgICAgIGlmICghcGFydCkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9ybWF0ID0gcGFydDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBhcnRzLnB1c2goZm9ybWF0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgICAgIGlmICh0aW1lem9uZSkgewogICAgICAgICAgICBkYXRlVGltZXpvbmVPZmZzZXQgPSB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBkYXRlVGltZXpvbmVPZmZzZXQpOwogICAgICAgICAgICBkYXRlID0gY29udmVydFRpbWV6b25lVG9Mb2NhbChkYXRlLCB0aW1lem9uZSwgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdGV4dCA9ICcnOwogICAgICAgIHBhcnRzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbHVlID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkYXRlRm9ybWF0dGVyID0gZ2V0RGF0ZUZvcm1hdHRlcih2YWx1ZSk7CiAgICAgICAgICAgIHRleHQgKz0gZGF0ZUZvcm1hdHRlciA/CiAgICAgICAgICAgICAgICBkYXRlRm9ybWF0dGVyKGRhdGUsIGxvY2FsZSwgZGF0ZVRpbWV6b25lT2Zmc2V0KSA6CiAgICAgICAgICAgICAgICB2YWx1ZSA9PT0gJ1wnXCcnID8gJ1wnJyA6IHZhbHVlLnJlcGxhY2UoLyheJ3wnJCkvZywgJycpLnJlcGxhY2UoLycnL2csICdcJycpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gdGV4dDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAqIEBwYXJhbSB7P30gZm9ybWF0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXROYW1lZEZvcm1hdChsb2NhbGUsIGZvcm1hdCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsb2NhbGVJZCA9IGdldExvY2FsZUlkJDEobG9jYWxlKTsKICAgICAgICBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXSA9IE5BTUVEX0ZPUk1BVFNbbG9jYWxlSWRdIHx8IHt9OwogICAgICAgIGlmIChOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdKSB7CiAgICAgICAgICAgIHJldHVybiBOQU1FRF9GT1JNQVRTW2xvY2FsZUlkXVtmb3JtYXRdOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZvcm1hdFZhbHVlID0gJyc7CiAgICAgICAgc3dpdGNoIChmb3JtYXQpIHsKICAgICAgICAgICAgY2FzZSAnc2hvcnREYXRlJzoKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZ2V0TG9jYWxlRGF0ZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLlNob3J0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdtZWRpdW1EYXRlJzoKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZ2V0TG9jYWxlRGF0ZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLk1lZGl1bSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbG9uZ0RhdGUnOgogICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTG9uZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZnVsbERhdGUnOgogICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVEYXRlRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguRnVsbCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2hvcnRUaW1lJzoKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZ2V0TG9jYWxlVGltZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLlNob3J0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdtZWRpdW1UaW1lJzoKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZ2V0TG9jYWxlVGltZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLk1lZGl1bSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbG9uZ1RpbWUnOgogICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTG9uZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZnVsbFRpbWUnOgogICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUgPSBnZXRMb2NhbGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguRnVsbCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnc2hvcnQnOgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2hvcnRUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnc2hvcnRUaW1lJyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzaG9ydERhdGUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdzaG9ydERhdGUnKTsKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5TaG9ydCksIFtzaG9ydFRpbWUsIHNob3J0RGF0ZV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ21lZGl1bSc6CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtZWRpdW1UaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnbWVkaXVtVGltZScpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWVkaXVtRGF0ZSA9IGdldE5hbWVkRm9ybWF0KGxvY2FsZSwgJ21lZGl1bURhdGUnKTsKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0gZm9ybWF0RGF0ZVRpbWUoZ2V0TG9jYWxlRGF0ZVRpbWVGb3JtYXQobG9jYWxlLCBGb3JtYXRXaWR0aC5NZWRpdW0pLCBbbWVkaXVtVGltZSwgbWVkaXVtRGF0ZV0pOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2xvbmcnOgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbG9uZ1RpbWUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdsb25nVGltZScpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbG9uZ0RhdGUgPSBnZXROYW1lZEZvcm1hdChsb2NhbGUsICdsb25nRGF0ZScpOwogICAgICAgICAgICAgICAgZm9ybWF0VmFsdWUgPQogICAgICAgICAgICAgICAgICAgIGZvcm1hdERhdGVUaW1lKGdldExvY2FsZURhdGVUaW1lRm9ybWF0KGxvY2FsZSwgRm9ybWF0V2lkdGguTG9uZyksIFtsb25nVGltZSwgbG9uZ0RhdGVdKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdmdWxsJzoKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxUaW1lID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnZnVsbFRpbWUnKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZ1bGxEYXRlID0gZ2V0TmFtZWRGb3JtYXQobG9jYWxlLCAnZnVsbERhdGUnKTsKICAgICAgICAgICAgICAgIGZvcm1hdFZhbHVlID0KICAgICAgICAgICAgICAgICAgICBmb3JtYXREYXRlVGltZShnZXRMb2NhbGVEYXRlVGltZUZvcm1hdChsb2NhbGUsIEZvcm1hdFdpZHRoLkZ1bGwpLCBbZnVsbFRpbWUsIGZ1bGxEYXRlXSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKGZvcm1hdFZhbHVlKSB7CiAgICAgICAgICAgIE5BTUVEX0ZPUk1BVFNbbG9jYWxlSWRdW2Zvcm1hdF0gPSBmb3JtYXRWYWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZvcm1hdFZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0cgogICAgICogQHBhcmFtIHs/fSBvcHRfdmFsdWVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmb3JtYXREYXRlVGltZShzdHIsIG9wdF92YWx1ZXMpIHsKICAgICAgICBpZiAob3B0X3ZhbHVlcykgewogICAgICAgICAgICBzdHIgPSBzdHIucmVwbGFjZSgvXHsoW159XSspfS9nLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbWF0Y2gKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChtYXRjaCwga2V5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKG9wdF92YWx1ZXMgIT0gbnVsbCAmJiBrZXkgaW4gb3B0X3ZhbHVlcykgPyBvcHRfdmFsdWVzW2tleV0gOiBtYXRjaDsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RyOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG51bQogICAgICogQHBhcmFtIHs/fSBkaWdpdHMKICAgICAqIEBwYXJhbSB7Pz19IG1pbnVzU2lnbgogICAgICogQHBhcmFtIHs/PX0gdHJpbQogICAgICogQHBhcmFtIHs/PX0gbmVnV3JhcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFkTnVtYmVyKG51bSwgZGlnaXRzLCBtaW51c1NpZ24gPSAnLScsIHRyaW0sIG5lZ1dyYXApIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5lZyA9ICcnOwogICAgICAgIGlmIChudW0gPCAwIHx8IChuZWdXcmFwICYmIG51bSA8PSAwKSkgewogICAgICAgICAgICBpZiAobmVnV3JhcCkgewogICAgICAgICAgICAgICAgbnVtID0gLW51bSArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBudW0gPSAtbnVtOwogICAgICAgICAgICAgICAgbmVnID0gbWludXNTaWduOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3RyTnVtID0gU3RyaW5nKG51bSk7CiAgICAgICAgd2hpbGUgKHN0ck51bS5sZW5ndGggPCBkaWdpdHMpIHsKICAgICAgICAgICAgc3RyTnVtID0gJzAnICsgc3RyTnVtOwogICAgICAgIH0KICAgICAgICBpZiAodHJpbSkgewogICAgICAgICAgICBzdHJOdW0gPSBzdHJOdW0uc3Vic3RyKHN0ck51bS5sZW5ndGggLSBkaWdpdHMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmVnICsgc3RyTnVtOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1pbGxpc2Vjb25kcwogICAgICogQHBhcmFtIHs/fSBkaWdpdHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGZvcm1hdEZyYWN0aW9uYWxTZWNvbmRzKG1pbGxpc2Vjb25kcywgZGlnaXRzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0ck1zID0gcGFkTnVtYmVyKG1pbGxpc2Vjb25kcywgMyk7CiAgICAgICAgcmV0dXJuIHN0ck1zLnN1YnN0cigwLCBkaWdpdHMpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgZGF0ZSBmb3JtYXR0ZXIgdGhhdCB0cmFuc2Zvcm1zIGEgZGF0ZSBpbnRvIGl0cyBsb2NhbGUgZGlnaXQgcmVwcmVzZW50YXRpb24KICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICogQHBhcmFtIHs/fSBzaXplCiAgICAgKiBAcGFyYW0gez89fSBvZmZzZXQKICAgICAqIEBwYXJhbSB7Pz19IHRyaW0KICAgICAqIEBwYXJhbSB7Pz19IG5lZ1dyYXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRhdGVHZXR0ZXIobmFtZSwgc2l6ZSwgb2Zmc2V0ID0gMCwgdHJpbSA9IGZhbHNlLCBuZWdXcmFwID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcnQgPSBnZXREYXRlUGFydChuYW1lLCBkYXRlKTsKICAgICAgICAgICAgaWYgKG9mZnNldCA+IDAgfHwgcGFydCA+IC1vZmZzZXQpIHsKICAgICAgICAgICAgICAgIHBhcnQgKz0gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChuYW1lID09PSBEYXRlVHlwZS5Ib3VycykgewogICAgICAgICAgICAgICAgaWYgKHBhcnQgPT09IDAgJiYgb2Zmc2V0ID09PSAtMTIpIHsKICAgICAgICAgICAgICAgICAgICBwYXJ0ID0gMTI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobmFtZSA9PT0gRGF0ZVR5cGUuRnJhY3Rpb25hbFNlY29uZHMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRGcmFjdGlvbmFsU2Vjb25kcyhwYXJ0LCBzaXplKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxvY2FsZU1pbnVzID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbik7CiAgICAgICAgICAgIHJldHVybiBwYWROdW1iZXIocGFydCwgc2l6ZSwgbG9jYWxlTWludXMsIHRyaW0sIG5lZ1dyYXApOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcnQKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGF0ZVBhcnQocGFydCwgZGF0ZSkgewogICAgICAgIHN3aXRjaCAocGFydCkgewogICAgICAgICAgICBjYXNlIERhdGVUeXBlLkZ1bGxZZWFyOgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RnVsbFllYXIoKTsKICAgICAgICAgICAgY2FzZSBEYXRlVHlwZS5Nb250aDoKICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1vbnRoKCk7CiAgICAgICAgICAgIGNhc2UgRGF0ZVR5cGUuRGF0ZToKICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLmdldERhdGUoKTsKICAgICAgICAgICAgY2FzZSBEYXRlVHlwZS5Ib3VyczoKICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLmdldEhvdXJzKCk7CiAgICAgICAgICAgIGNhc2UgRGF0ZVR5cGUuTWludXRlczoKICAgICAgICAgICAgICAgIHJldHVybiBkYXRlLmdldE1pbnV0ZXMoKTsKICAgICAgICAgICAgY2FzZSBEYXRlVHlwZS5TZWNvbmRzOgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0U2Vjb25kcygpOwogICAgICAgICAgICBjYXNlIERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzOgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCk7CiAgICAgICAgICAgIGNhc2UgRGF0ZVR5cGUuRGF5OgogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF5KCk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gRGF0ZVR5cGUgdmFsdWUgIiR7cGFydH0iLmApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhIGRhdGUgZm9ybWF0dGVyIHRoYXQgdHJhbnNmb3JtcyBhIGRhdGUgaW50byBpdHMgbG9jYWxlIHN0cmluZyByZXByZXNlbnRhdGlvbgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHdpZHRoCiAgICAgKiBAcGFyYW0gez89fSBmb3JtCiAgICAgKiBAcGFyYW0gez89fSBleHRlbmRlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGF0ZVN0ckdldHRlcihuYW1lLCB3aWR0aCwgZm9ybSA9IEZvcm1TdHlsZS5Gb3JtYXQsIGV4dGVuZGVkID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7CiAgICAgICAgICAgIHJldHVybiBnZXREYXRlVHJhbnNsYXRpb24oZGF0ZSwgbG9jYWxlLCBuYW1lLCB3aWR0aCwgZm9ybSwgZXh0ZW5kZWQpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBsb2NhbGUgdHJhbnNsYXRpb24gb2YgYSBkYXRlIGZvciBhIGdpdmVuIGZvcm0sIHR5cGUgYW5kIHdpZHRoCiAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gd2lkdGgKICAgICAqIEBwYXJhbSB7P30gZm9ybQogICAgICogQHBhcmFtIHs/fSBleHRlbmRlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGF0ZVRyYW5zbGF0aW9uKGRhdGUsIGxvY2FsZSwgbmFtZSwgd2lkdGgsIGZvcm0sIGV4dGVuZGVkKSB7CiAgICAgICAgc3dpdGNoIChuYW1lKSB7CiAgICAgICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLk1vbnRoczoKICAgICAgICAgICAgICAgIHJldHVybiBnZXRMb2NhbGVNb250aE5hbWVzKGxvY2FsZSwgZm9ybSwgd2lkdGgpW2RhdGUuZ2V0TW9udGgoKV07CiAgICAgICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkRheXM6CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYWxlRGF5TmFtZXMobG9jYWxlLCBmb3JtLCB3aWR0aClbZGF0ZS5nZXREYXkoKV07CiAgICAgICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHM6CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50SG91cnMgPSBkYXRlLmdldEhvdXJzKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjdXJyZW50TWludXRlcyA9IGRhdGUuZ2V0TWludXRlcygpOwogICAgICAgICAgICAgICAgaWYgKGV4dGVuZGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJ1bGVzID0gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RSdWxlcyhsb2NhbGUpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBkYXlQZXJpb2RzID0gZ2V0TG9jYWxlRXh0cmFEYXlQZXJpb2RzKGxvY2FsZSwgZm9ybSwgd2lkdGgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0OwogICAgICAgICAgICAgICAgICAgIHJ1bGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVsZQogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChydWxlLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShydWxlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW9ybmluZywgYWZ0ZXJub29uLCBldmVuaW5nLCBuaWdodAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBob3VyczogaG91cnNGcm9tLCBtaW51dGVzOiBtaW51dGVzRnJvbSB9ID0gcnVsZVswXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnM6IGhvdXJzVG8sIG1pbnV0ZXM6IG1pbnV0ZXNUbyB9ID0gcnVsZVsxXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjdXJyZW50SG91cnMgPj0gaG91cnNGcm9tICYmIGN1cnJlbnRNaW51dGVzID49IG1pbnV0ZXNGcm9tICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRIb3VycyA8IGhvdXJzVG8gfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGN1cnJlbnRIb3VycyA9PT0gaG91cnNUbyAmJiBjdXJyZW50TWludXRlcyA8IG1pbnV0ZXNUbykpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gZGF5UGVyaW9kc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIG5vb24gb3IgbWlkbmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vb24gb3IgbWlkbmlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG91cnMsIG1pbnV0ZXMgfSA9IHJ1bGU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaG91cnMgPT09IGN1cnJlbnRIb3VycyAmJiBtaW51dGVzID09PSBjdXJyZW50TWludXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGRheVBlcmlvZHNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBpZiBubyBydWxlcyBmb3IgdGhlIGRheSBwZXJpb2RzLCB3ZSB1c2UgYW0vcG0gYnkgZGVmYXVsdAogICAgICAgICAgICAgICAgcmV0dXJuIGdldExvY2FsZURheVBlcmlvZHMobG9jYWxlLCBmb3JtLCAoLyoqIEB0eXBlIHs/fSAqLyAod2lkdGgpKSlbY3VycmVudEhvdXJzIDwgMTIgPyAwIDogMV07CiAgICAgICAgICAgIGNhc2UgVHJhbnNsYXRpb25UeXBlLkVyYXM6CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0TG9jYWxlRXJhTmFtZXMobG9jYWxlLCAoLyoqIEB0eXBlIHs/fSAqLyAod2lkdGgpKSlbZGF0ZS5nZXRGdWxsWWVhcigpIDw9IDAgPyAwIDogMV07CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAvLyBUaGlzIGRlZmF1bHQgY2FzZSBpcyBub3QgbmVlZGVkIGJ5IFR5cGVTY3JpcHQgY29tcGlsZXIsIGFzIHRoZSBzd2l0Y2ggaXMgZXhoYXVzdGl2ZS4KICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIgQ2xvc3VyZSBDb21waWxlciBkb2VzIG5vdCB1bmRlcnN0YW5kIHRoYXQgYW5kIHJlcG9ydHMgYW4gZXJyb3IgaW4gdHlwZWQgbW9kZS4KICAgICAgICAgICAgICAgIC8vIFRoZSBgdGhyb3cgbmV3IEVycm9yYCBiZWxvdyB3b3JrcyBhcm91bmQgdGhlIHByb2JsZW0sIGFuZCB0aGUgdW5leHBlY3RlZDogbmV2ZXIgdmFyaWFibGUKICAgICAgICAgICAgICAgIC8vIG1ha2VzIHN1cmUgdHNjIHN0aWxsIGNoZWNrcyB0aGlzIGNvZGUgaXMgdW5yZWFjaGFibGUuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1bmV4cGVjdGVkID0gbmFtZTsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgdW5leHBlY3RlZCB0cmFuc2xhdGlvbiB0eXBlICR7dW5leHBlY3RlZH1gKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYSBkYXRlIGZvcm1hdHRlciB0aGF0IHRyYW5zZm9ybXMgYSBkYXRlIGFuZCBhbiBvZmZzZXQgaW50byBhIHRpbWV6b25lIHdpdGggSVNPODYwMSBvcgogICAgICogR01UIGZvcm1hdCBkZXBlbmRpbmcgb24gdGhlIHdpZHRoIChlZzogc2hvcnQgPSArMDQzMCwgc2hvcnQ6R01UID0gR01UKzQsIGxvbmcgPSBHTVQrMDQ6MzAsCiAgICAgKiBleHRlbmRlZCA9ICswNDozMCkKICAgICAqIEBwYXJhbSB7P30gd2lkdGgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRpbWVab25lR2V0dGVyKHdpZHRoKSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGxvY2FsZQogICAgICAgICAqIEBwYXJhbSB7P30gb2Zmc2V0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlLCBvZmZzZXQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB6b25lID0gLTEgKiBvZmZzZXQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWludXNTaWduID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG91cnMgPSB6b25lID4gMCA/IE1hdGguZmxvb3Ioem9uZSAvIDYwKSA6IE1hdGguY2VpbCh6b25lIC8gNjApOwogICAgICAgICAgICBzd2l0Y2ggKHdpZHRoKSB7CiAgICAgICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5TaG9ydDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCh6b25lID49IDApID8gJysnIDogJycpICsgcGFkTnVtYmVyKGhvdXJzLCAyLCBtaW51c1NpZ24pICsKICAgICAgICAgICAgICAgICAgICAgICAgcGFkTnVtYmVyKE1hdGguYWJzKHpvbmUgJSA2MCksIDIsIG1pbnVzU2lnbik7CiAgICAgICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5TaG9ydEdNVDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ0dNVCcgKyAoKHpvbmUgPj0gMCkgPyAnKycgOiAnJykgKyBwYWROdW1iZXIoaG91cnMsIDEsIG1pbnVzU2lnbik7CiAgICAgICAgICAgICAgICBjYXNlIFpvbmVXaWR0aC5Mb25nOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnR01UJyArICgoem9uZSA+PSAwKSA/ICcrJyA6ICcnKSArIHBhZE51bWJlcihob3VycywgMiwgbWludXNTaWduKSArICc6JyArCiAgICAgICAgICAgICAgICAgICAgICAgIHBhZE51bWJlcihNYXRoLmFicyh6b25lICUgNjApLCAyLCBtaW51c1NpZ24pOwogICAgICAgICAgICAgICAgY2FzZSBab25lV2lkdGguRXh0ZW5kZWQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKG9mZnNldCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1onOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgoem9uZSA+PSAwKSA/ICcrJyA6ICcnKSArIHBhZE51bWJlcihob3VycywgMiwgbWludXNTaWduKSArICc6JyArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWROdW1iZXIoTWF0aC5hYnMoem9uZSAlIDYwKSwgMiwgbWludXNTaWduKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biB6b25lIHdpZHRoICIke3dpZHRofSJgKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSkFOVUFSWSA9IDA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUSFVSU0RBWSA9IDQ7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30geWVhcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcih5ZWFyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpcnN0RGF5T2ZZZWFyID0gKG5ldyBEYXRlKHllYXIsIEpBTlVBUlksIDEpKS5nZXREYXkoKTsKICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgMCwgMSArICgoZmlyc3REYXlPZlllYXIgPD0gVEhVUlNEQVkpID8gVEhVUlNEQVkgOiBUSFVSU0RBWSArIDcpIC0gZmlyc3REYXlPZlllYXIpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRhdGV0aW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRUaHVyc2RheVRoaXNXZWVrKGRhdGV0aW1lKSB7CiAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGV0aW1lLmdldEZ1bGxZZWFyKCksIGRhdGV0aW1lLmdldE1vbnRoKCksIGRhdGV0aW1lLmdldERhdGUoKSArIChUSFVSU0RBWSAtIGRhdGV0aW1lLmdldERheSgpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2l6ZQogICAgICogQHBhcmFtIHs/PX0gbW9udGhCYXNlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gd2Vla0dldHRlcihzaXplLCBtb250aEJhc2VkID0gZmFsc2UpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoZGF0ZSwgbG9jYWxlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlc3VsdDsKICAgICAgICAgICAgaWYgKG1vbnRoQmFzZWQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5iRGF5c0JlZm9yZTFzdERheU9mTW9udGggPSBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSwgMSkuZ2V0RGF5KCkgLSAxOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdG9kYXkgPSBkYXRlLmdldERhdGUoKTsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IDEgKyBNYXRoLmZsb29yKCh0b2RheSArIG5iRGF5c0JlZm9yZTFzdERheU9mTW9udGgpIC8gNyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdFRodXJzID0gZ2V0Rmlyc3RUaHVyc2RheU9mWWVhcihkYXRlLmdldEZ1bGxZZWFyKCkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdGhpc1RodXJzID0gZ2V0VGh1cnNkYXlUaGlzV2VlayhkYXRlKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRpZmYgPSB0aGlzVGh1cnMuZ2V0VGltZSgpIC0gZmlyc3RUaHVycy5nZXRUaW1lKCk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSAxICsgTWF0aC5yb3VuZChkaWZmIC8gNi4wNDhlOCk7IC8vIDYuMDQ4ZTggbXMgcGVyIHdlZWsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGFkTnVtYmVyKHJlc3VsdCwgc2l6ZSwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgICAgIH0pOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREFURV9GT1JNQVRTID0ge307CiAgICAvLyBCYXNlZCBvbiBDTERSIGZvcm1hdHM6CiAgICAvLyBTZWUgY29tcGxldGUgbGlzdDogaHR0cDovL3d3dy51bmljb2RlLm9yZy9yZXBvcnRzL3RyMzUvdHIzNS1kYXRlcy5odG1sI0RhdGVfRmllbGRfU3ltYm9sX1RhYmxlCiAgICAvLyBTZWUgYWxzbyBleHBsYW5hdGlvbnM6IGh0dHA6Ly9jbGRyLnVuaWNvZGUub3JnL3RyYW5zbGF0aW9uL2RhdGUtdGltZQogICAgLy8gVE9ETyhvY29tYmUpOiBzdXBwb3J0IGFsbCBtaXNzaW5nIGNsZHIgZm9ybWF0czogWSwgVSwgUSwgRCwgRiwgZSwgYywgaiwgSiwgQywgQSwgdiwgViwgWCwgeAogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZvcm1hdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RGF0ZUZvcm1hdHRlcihmb3JtYXQpIHsKICAgICAgICBpZiAoREFURV9GT1JNQVRTW2Zvcm1hdF0pIHsKICAgICAgICAgICAgcmV0dXJuIERBVEVfRk9STUFUU1tmb3JtYXRdOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZvcm1hdHRlcjsKICAgICAgICBzd2l0Y2ggKGZvcm1hdCkgewogICAgICAgICAgICAvLyBFcmEgbmFtZSAoQUQvQkMpCiAgICAgICAgICAgIGNhc2UgJ0cnOgogICAgICAgICAgICBjYXNlICdHRyc6CiAgICAgICAgICAgIGNhc2UgJ0dHRyc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5FcmFzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdHR0dHJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkVyYXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnR0dHR0cnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRXJhcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8vIDEgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHllYXIsIGUuZy4gKEFEIDEgPT4gMSwgQUQgMTk5ID0+IDE5OSkKICAgICAgICAgICAgY2FzZSAneSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAxLCAwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gMiBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciwgcGFkZGVkICgwMC05OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApCiAgICAgICAgICAgIGNhc2UgJ3l5JzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRnVsbFllYXIsIDIsIDAsIHRydWUsIHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8vIDMgZGlnaXQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHllYXIsIHBhZGRlZCAoMDAwLTk5OSkuIChlLmcuIEFEIDIwMDEgPT4gMDEsIEFEIDIwMTAgPT4gMTApCiAgICAgICAgICAgIGNhc2UgJ3l5eSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCAzLCAwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gNCBkaWdpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgeWVhciAoZS5nLiBBRCAxID0+IDAwMDEsIEFEIDIwMTAgPT4gMjAxMCkKICAgICAgICAgICAgY2FzZSAneXl5eSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZ1bGxZZWFyLCA0LCAwLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKDEtMTIpLCBudW1lcmljCiAgICAgICAgICAgIGNhc2UgJ00nOgogICAgICAgICAgICBjYXNlICdMJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTW9udGgsIDEsIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ01NJzoKICAgICAgICAgICAgY2FzZSAnTEwnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Nb250aCwgMiwgMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gTW9udGggb2YgdGhlIHllYXIgKEphbnVhcnksIC4uLiksIHN0cmluZywgZm9ybWF0CiAgICAgICAgICAgIGNhc2UgJ01NTSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ01NTU0nOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuTW9udGhzLCBUcmFuc2xhdGlvbldpZHRoLldpZGUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ01NTU1NJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLk1vbnRocywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8vIE1vbnRoIG9mIHRoZSB5ZWFyIChKYW51YXJ5LCAuLi4pLCBzdHJpbmcsIHN0YW5kYWxvbmUKICAgICAgICAgICAgY2FzZSAnTExMJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICAgICAgZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuTW9udGhzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTExMTCc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPQogICAgICAgICAgICAgICAgICAgIGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLk1vbnRocywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnTExMTEwnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0KICAgICAgICAgICAgICAgICAgICBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5Nb250aHMsIFRyYW5zbGF0aW9uV2lkdGguTmFycm93LCBGb3JtU3R5bGUuU3RhbmRhbG9uZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gV2VlayBvZiB0aGUgeWVhciAoMSwgLi4uIDUyKQogICAgICAgICAgICBjYXNlICd3JzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IHdlZWtHZXR0ZXIoMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnd3cnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gd2Vla0dldHRlcigyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyBXZWVrIG9mIHRoZSBtb250aCAoMSwgLi4uKQogICAgICAgICAgICBjYXNlICdXJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IHdlZWtHZXR0ZXIoMSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gRGF5IG9mIHRoZSBtb250aCAoMS0zMSkKICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkRhdGUsIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2RkJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuRGF0ZSwgMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gRGF5IG9mIHRoZSBXZWVrCiAgICAgICAgICAgIGNhc2UgJ0UnOgogICAgICAgICAgICBjYXNlICdFRSc6CiAgICAgICAgICAgIGNhc2UgJ0VFRSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdFRUVFJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheXMsIFRyYW5zbGF0aW9uV2lkdGguV2lkZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnRUVFRUUnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5cywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3cpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ0VFRUVFRSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlzLCBUcmFuc2xhdGlvbldpZHRoLlNob3J0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyBHZW5lcmljIHBlcmlvZCBvZiB0aGUgZGF5IChhbS1wbSkKICAgICAgICAgICAgY2FzZSAnYSc6CiAgICAgICAgICAgIGNhc2UgJ2FhJzoKICAgICAgICAgICAgY2FzZSAnYWFhJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVTdHJHZXR0ZXIoVHJhbnNsYXRpb25UeXBlLkRheVBlcmlvZHMsIFRyYW5zbGF0aW9uV2lkdGguQWJicmV2aWF0ZWQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2FhYWEnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdhYWFhYSc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gRXh0ZW5kZWQgcGVyaW9kIG9mIHRoZSBkYXkgKG1pZG5pZ2h0LCBhdCBuaWdodCwgLi4uKSwgc3RhbmRhbG9uZQogICAgICAgICAgICBjYXNlICdiJzoKICAgICAgICAgICAgY2FzZSAnYmInOgogICAgICAgICAgICBjYXNlICdiYmInOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5BYmJyZXZpYXRlZCwgRm9ybVN0eWxlLlN0YW5kYWxvbmUsIHRydWUpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2JiYmInOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuU3RhbmRhbG9uZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnYmJiYmInOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5OYXJyb3csIEZvcm1TdHlsZS5TdGFuZGFsb25lLCB0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyBFeHRlbmRlZCBwZXJpb2Qgb2YgdGhlIGRheSAobWlkbmlnaHQsIG5pZ2h0LCAuLi4pLCBzdGFuZGFsb25lCiAgICAgICAgICAgIGNhc2UgJ0InOgogICAgICAgICAgICBjYXNlICdCQic6CiAgICAgICAgICAgIGNhc2UgJ0JCQic6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLkFiYnJldmlhdGVkLCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdCQkJCJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9CiAgICAgICAgICAgICAgICAgICAgZGF0ZVN0ckdldHRlcihUcmFuc2xhdGlvblR5cGUuRGF5UGVyaW9kcywgVHJhbnNsYXRpb25XaWR0aC5XaWRlLCBGb3JtU3R5bGUuRm9ybWF0LCB0cnVlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdCQkJCQic6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlU3RyR2V0dGVyKFRyYW5zbGF0aW9uVHlwZS5EYXlQZXJpb2RzLCBUcmFuc2xhdGlvbldpZHRoLk5hcnJvdywgRm9ybVN0eWxlLkZvcm1hdCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gSG91ciBpbiBBTS9QTSwgKDEtMTIpCiAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Ib3VycywgMSwgLTEyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdoaCc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAyLCAtMTIpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8vIEhvdXIgb2YgdGhlIGRheSAoMC0yMykKICAgICAgICAgICAgY2FzZSAnSCc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkhvdXJzLCAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyBIb3VyIGluIGRheSwgcGFkZGVkICgwMC0yMykKICAgICAgICAgICAgY2FzZSAnSEgnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5Ib3VycywgMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gTWludXRlIG9mIHRoZSBob3VyICgwLTU5KQogICAgICAgICAgICBjYXNlICdtJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuTWludXRlcywgMSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnbW0nOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5NaW51dGVzLCAyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyBTZWNvbmQgb2YgdGhlIG1pbnV0ZSAoMC01OSkKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLlNlY29uZHMsIDEpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ3NzJzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IGRhdGVHZXR0ZXIoRGF0ZVR5cGUuU2Vjb25kcywgMik7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gRnJhY3Rpb25hbCBzZWNvbmQKICAgICAgICAgICAgY2FzZSAnUyc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzLCAxKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdTUyc6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSBkYXRlR2V0dGVyKERhdGVUeXBlLkZyYWN0aW9uYWxTZWNvbmRzLCAyKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlICdTU1MnOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gZGF0ZUdldHRlcihEYXRlVHlwZS5GcmFjdGlvbmFsU2Vjb25kcywgMyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gVGltZXpvbmUgSVNPODYwMSBzaG9ydCBmb3JtYXQgKC0wNDMwKQogICAgICAgICAgICBjYXNlICdaJzoKICAgICAgICAgICAgY2FzZSAnWlonOgogICAgICAgICAgICBjYXNlICdaWlonOgogICAgICAgICAgICAgICAgZm9ybWF0dGVyID0gdGltZVpvbmVHZXR0ZXIoWm9uZVdpZHRoLlNob3J0KTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAvLyBUaW1lem9uZSBJU084NjAxIGV4dGVuZGVkIGZvcm1hdCAoLTA0OjMwKQogICAgICAgICAgICBjYXNlICdaWlpaWic6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSB0aW1lWm9uZUdldHRlcihab25lV2lkdGguRXh0ZW5kZWQpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIC8vIFRpbWV6b25lIEdNVCBzaG9ydCBmb3JtYXQgKEdNVCs0KQogICAgICAgICAgICBjYXNlICdPJzoKICAgICAgICAgICAgY2FzZSAnT08nOgogICAgICAgICAgICBjYXNlICdPT08nOgogICAgICAgICAgICAvLyBTaG91bGQgYmUgbG9jYXRpb24sIGJ1dCBmYWxsYmFjayB0byBmb3JtYXQgTyBpbnN0ZWFkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZGF0YSB5ZXQKICAgICAgICAgICAgY2FzZSAneic6CiAgICAgICAgICAgIGNhc2UgJ3p6JzoKICAgICAgICAgICAgY2FzZSAnenp6JzoKICAgICAgICAgICAgICAgIGZvcm1hdHRlciA9IHRpbWVab25lR2V0dGVyKFpvbmVXaWR0aC5TaG9ydEdNVCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgLy8gVGltZXpvbmUgR01UIGxvbmcgZm9ybWF0IChHTVQrMDQzMCkKICAgICAgICAgICAgY2FzZSAnT09PTyc6CiAgICAgICAgICAgIGNhc2UgJ1paWlonOgogICAgICAgICAgICAvLyBTaG91bGQgYmUgbG9jYXRpb24sIGJ1dCBmYWxsYmFjayB0byBmb3JtYXQgTyBpbnN0ZWFkIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSB0aGUgZGF0YSB5ZXQKICAgICAgICAgICAgY2FzZSAnenp6eic6CiAgICAgICAgICAgICAgICBmb3JtYXR0ZXIgPSB0aW1lWm9uZUdldHRlcihab25lV2lkdGguTG9uZyk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBEQVRFX0ZPUk1BVFNbZm9ybWF0XSA9IGZvcm1hdHRlcjsKICAgICAgICByZXR1cm4gZm9ybWF0dGVyOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRpbWV6b25lCiAgICAgKiBAcGFyYW0gez99IGZhbGxiYWNrCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0aW1lem9uZVRvT2Zmc2V0KHRpbWV6b25lLCBmYWxsYmFjaykgewogICAgICAgIC8vIFN1cHBvcnQ6IElFIDktMTEgb25seSwgRWRnZSAxMy0xNSsKICAgICAgICAvLyBJRS9FZGdlIGRvIG5vdCAidW5kZXJzdGFuZCIgY29sb24gKGA6YCkgaW4gdGltZXpvbmUKICAgICAgICB0aW1lem9uZSA9IHRpbWV6b25lLnJlcGxhY2UoLzovZywgJycpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXF1ZXN0ZWRUaW1lem9uZU9mZnNldCA9IERhdGUucGFyc2UoJ0phbiAwMSwgMTk3MCAwMDowMDowMCAnICsgdGltZXpvbmUpIC8gNjAwMDA7CiAgICAgICAgcmV0dXJuIGlzTmFOKHJlcXVlc3RlZFRpbWV6b25lT2Zmc2V0KSA/IGZhbGxiYWNrIDogcmVxdWVzdGVkVGltZXpvbmVPZmZzZXQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICogQHBhcmFtIHs/fSBtaW51dGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGREYXRlTWludXRlcyhkYXRlLCBtaW51dGVzKSB7CiAgICAgICAgZGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsKICAgICAgICBkYXRlLnNldE1pbnV0ZXMoZGF0ZS5nZXRNaW51dGVzKCkgKyBtaW51dGVzKTsKICAgICAgICByZXR1cm4gZGF0ZTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgKiBAcGFyYW0gez99IHRpbWV6b25lCiAgICAgKiBAcGFyYW0gez99IHJldmVyc2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnZlcnRUaW1lem9uZVRvTG9jYWwoZGF0ZSwgdGltZXpvbmUsIHJldmVyc2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmV2ZXJzZVZhbHVlID0gcmV2ZXJzZSA/IC0xIDogMTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZGF0ZVRpbWV6b25lT2Zmc2V0ID0gZGF0ZS5nZXRUaW1lem9uZU9mZnNldCgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0aW1lem9uZU9mZnNldCA9IHRpbWV6b25lVG9PZmZzZXQodGltZXpvbmUsIGRhdGVUaW1lem9uZU9mZnNldCk7CiAgICAgICAgcmV0dXJuIGFkZERhdGVNaW51dGVzKGRhdGUsIHJldmVyc2VWYWx1ZSAqICh0aW1lem9uZU9mZnNldCAtIGRhdGVUaW1lem9uZU9mZnNldCkpOwogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIHZhbHVlIHRvIGRhdGUuCiAgICAgKgogICAgICogU3VwcG9ydGVkIGlucHV0IGZvcm1hdHM6CiAgICAgKiAtIGBEYXRlYAogICAgICogLSBudW1iZXI6IHRpbWVzdGFtcAogICAgICogLSBzdHJpbmc6IG51bWVyaWMgKGUuZy4gIjEyMzQiKSwgSVNPIGFuZCBkYXRlIHN0cmluZ3MgaW4gYSBmb3JtYXQgc3VwcG9ydGVkIGJ5CiAgICAgKiAgIFtEYXRlLnBhcnNlKCldKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUvcGFyc2UpLgogICAgICogICBOb3RlOiBJU08gc3RyaW5ncyB3aXRob3V0IHRpbWUgcmV0dXJuIGEgZGF0ZSB3aXRob3V0IHRpbWVvZmZzZXQuCiAgICAgKgogICAgICogVGhyb3dzIGlmIHVuYWJsZSB0byBjb252ZXJ0IHRvIGEgZGF0ZS4KICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRvRGF0ZSh2YWx1ZSkgewogICAgICAgIGlmIChpc0RhdGUkMSh2YWx1ZSkpIHsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiAhaXNOYU4odmFsdWUpKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudHJpbSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcnNlZE5iID0gcGFyc2VGbG9hdCh2YWx1ZSk7CiAgICAgICAgICAgIC8vIGFueSBzdHJpbmcgdGhhdCBvbmx5IGNvbnRhaW5zIG51bWJlcnMsIGxpa2UgIjEyMzQiIGJ1dCBub3QgbGlrZSAiMTIzNGhlbGxvIgogICAgICAgICAgICBpZiAoIWlzTmFOKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpIC0gcGFyc2VkTmIpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUocGFyc2VkTmIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICgvXihcZHs0fS1cZHsxLDJ9LVxkezEsMn0pJC8udGVzdCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIC8qIEZvciBJU08gU3RyaW5ncyB3aXRob3V0IHRpbWUgdGhlIGRheSwgbW9udGggYW5kIHllYXIgbXVzdCBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgSVNPIFN0cmluZwogICAgICAgICAgICAgICAgICAgICAgYmVmb3JlIERhdGUgY3JlYXRpb24gdG8gYXZvaWQgdGltZSBvZmZzZXQgYW5kIGVycm9ycyBpbiB0aGUgbmV3IERhdGUuCiAgICAgICAgICAgICAgICAgICAgICBJZiB3ZSBvbmx5IHJlcGxhY2UgJy0nIHdpdGggJywnIGluIHRoZSBJU08gU3RyaW5nICgiMjAxNSwwMSwwMSIpLCBhbmQgdHJ5IHRvIGNyZWF0ZSBhIG5ldwogICAgICAgICAgICAgICAgICAgICAgZGF0ZSwgc29tZSBicm93c2VycyAoZS5nLiBJRSA5KSB3aWxsIHRocm93IGFuIGludmFsaWQgRGF0ZSBlcnJvci4KICAgICAgICAgICAgICAgICAgICAgIElmIHdlIGxlYXZlIHRoZSAnLScgKCIyMDE1LTAxLTAxIikgYW5kIHRyeSB0byBjcmVhdGUgYSBuZXcgRGF0ZSgiMjAxNS0wMS0wMSIpIHRoZSB0aW1lb2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICBpcyBhcHBsaWVkLgogICAgICAgICAgICAgICAgICAgICAgTm90ZTogSVNPIG1vbnRocyBhcmUgMCBmb3IgSmFudWFyeSwgMSBmb3IgRmVicnVhcnksIC4uLiAqLwogICAgICAgICAgICAgICAgY29uc3QgW3ksIG0sIGRdID0gdmFsdWUuc3BsaXQoJy0nKS5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWwKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh2YWwpID0+ICt2YWwpKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZSh5LCBtIC0gMSwgZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbWF0Y2g7CiAgICAgICAgICAgIGlmIChtYXRjaCA9IHZhbHVlLm1hdGNoKElTTzg2MDFfREFURV9SRUdFWCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBpc29TdHJpbmdUb0RhdGUobWF0Y2gpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSkpOwogICAgICAgIGlmICghaXNEYXRlJDEoZGF0ZSkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY29udmVydCAiJHt2YWx1ZX0iIGludG8gYSBkYXRlYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgLyoqCiAgICAgKiBDb252ZXJ0cyBhIGRhdGUgaW4gSVNPODYwMSB0byBhIERhdGUuCiAgICAgKiBVc2VkIGluc3RlYWQgb2YgYERhdGUucGFyc2VgIGJlY2F1c2Ugb2YgYnJvd3NlciBkaXNjcmVwYW5jaWVzLgogICAgICogQHBhcmFtIHs/fSBtYXRjaAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNvU3RyaW5nVG9EYXRlKG1hdGNoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgwKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHR6SG91ciA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCB0ek1pbiA9IDA7CiAgICAgICAgLy8gbWF0Y2hbOF0gbWVhbnMgdGhhdCB0aGUgc3RyaW5nIGNvbnRhaW5zICJaIiAoVVRDKSBvciBhIHRpbWV6b25lIGxpa2UgIiswMTowMCIgb3IgIiswMTAwIgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRlU2V0dGVyID0gbWF0Y2hbOF0gPyBkYXRlLnNldFVUQ0Z1bGxZZWFyIDogZGF0ZS5zZXRGdWxsWWVhcjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGltZVNldHRlciA9IG1hdGNoWzhdID8gZGF0ZS5zZXRVVENIb3VycyA6IGRhdGUuc2V0SG91cnM7CiAgICAgICAgLy8gaWYgdGhlcmUgaXMgYSB0aW1lem9uZSBkZWZpbmVkIGxpa2UgIiswMTowMCIgb3IgIiswMTAwIgogICAgICAgIGlmIChtYXRjaFs5XSkgewogICAgICAgICAgICB0ekhvdXIgPSBOdW1iZXIobWF0Y2hbOV0gKyBtYXRjaFsxMF0pOwogICAgICAgICAgICB0ek1pbiA9IE51bWJlcihtYXRjaFs5XSArIG1hdGNoWzExXSk7CiAgICAgICAgfQogICAgICAgIGRhdGVTZXR0ZXIuY2FsbChkYXRlLCBOdW1iZXIobWF0Y2hbMV0pLCBOdW1iZXIobWF0Y2hbMl0pIC0gMSwgTnVtYmVyKG1hdGNoWzNdKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGggPSBOdW1iZXIobWF0Y2hbNF0gfHwgMCkgLSB0ekhvdXI7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG0gPSBOdW1iZXIobWF0Y2hbNV0gfHwgMCkgLSB0ek1pbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcyA9IE51bWJlcihtYXRjaFs2XSB8fCAwKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbXMgPSBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoJzAuJyArIChtYXRjaFs3XSB8fCAwKSkgKiAxMDAwKTsKICAgICAgICB0aW1lU2V0dGVyLmNhbGwoZGF0ZSwgaCwgbSwgcywgbXMpOwogICAgICAgIHJldHVybiBkYXRlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0RhdGUkMSh2YWx1ZSkgewogICAgICAgIHJldHVybiB2YWx1ZSBpbnN0YW5jZW9mIERhdGUgJiYgIWlzTmFOKHZhbHVlLnZhbHVlT2YoKSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2kxOG4vZm9ybWF0X251bWJlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOVU1CRVJfRk9STUFUX1JFR0VYUCA9IC9eKFxkKyk/XC4oKFxkKykoLShcZCspKT8pPyQvOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTUFYX0RJR0lUUyA9IDIyOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREVDSU1BTF9TRVAgPSAnLic7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBaRVJPX0NIQVIgPSAnMCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBQQVRURVJOX1NFUCA9ICc7JzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEdST1VQX1NFUCA9ICcsJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERJR0lUX0NIQVIgPSAnIyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDVVJSRU5DWV9DSEFSID0gJ8KkJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBFUkNFTlRfQ0hBUiA9ICclJzsKICAgIC8qKgogICAgICogVHJhbnNmb3JtcyBhIG51bWJlciB0byBhIGxvY2FsZSBzdHJpbmcgYmFzZWQgb24gYSBzdHlsZSBhbmQgYSBmb3JtYXQuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IHBhdHRlcm4KICAgICAqIEBwYXJhbSB7P30gbG9jYWxlCiAgICAgKiBAcGFyYW0gez99IGdyb3VwU3ltYm9sCiAgICAgKiBAcGFyYW0gez99IGRlY2ltYWxTeW1ib2wKICAgICAqIEBwYXJhbSB7Pz19IGRpZ2l0c0luZm8KICAgICAqIEBwYXJhbSB7Pz19IGlzUGVyY2VudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgZ3JvdXBTeW1ib2wsIGRlY2ltYWxTeW1ib2wsIGRpZ2l0c0luZm8sIGlzUGVyY2VudCA9IGZhbHNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBmb3JtYXR0ZWRUZXh0ID0gJyc7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBpc1plcm8gPSBmYWxzZTsKICAgICAgICBpZiAoIWlzRmluaXRlKHZhbHVlKSkgewogICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLkluZmluaXR5KTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBhcnNlZE51bWJlciA9IHBhcnNlTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgaWYgKGlzUGVyY2VudCkgewogICAgICAgICAgICAgICAgcGFyc2VkTnVtYmVyID0gdG9QZXJjZW50KHBhcnNlZE51bWJlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbWluSW50ID0gcGF0dGVybi5taW5JbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1pbkZyYWN0aW9uID0gcGF0dGVybi5taW5GcmFjOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBtYXhGcmFjdGlvbiA9IHBhdHRlcm4ubWF4RnJhYzsKICAgICAgICAgICAgaWYgKGRpZ2l0c0luZm8pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhcnRzID0gZGlnaXRzSW5mby5tYXRjaChOVU1CRVJfRk9STUFUX1JFR0VYUCk7CiAgICAgICAgICAgICAgICBpZiAocGFydHMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCR7ZGlnaXRzSW5mb30gaXMgbm90IGEgdmFsaWQgZGlnaXQgaW5mb2ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWluSW50UGFydCA9IHBhcnRzWzFdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWluRnJhY3Rpb25QYXJ0ID0gcGFydHNbM107CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtYXhGcmFjdGlvblBhcnQgPSBwYXJ0c1s1XTsKICAgICAgICAgICAgICAgIGlmIChtaW5JbnRQYXJ0ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBtaW5JbnQgPSBwYXJzZUludEF1dG9SYWRpeChtaW5JbnRQYXJ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtaW5GcmFjdGlvblBhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1pbkZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgobWluRnJhY3Rpb25QYXJ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChtYXhGcmFjdGlvblBhcnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIG1heEZyYWN0aW9uID0gcGFyc2VJbnRBdXRvUmFkaXgobWF4RnJhY3Rpb25QYXJ0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1pbkZyYWN0aW9uUGFydCAhPSBudWxsICYmIG1pbkZyYWN0aW9uID4gbWF4RnJhY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICBtYXhGcmFjdGlvbiA9IG1pbkZyYWN0aW9uOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJvdW5kTnVtYmVyKHBhcnNlZE51bWJlciwgbWluRnJhY3Rpb24sIG1heEZyYWN0aW9uKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmRpZ2l0czsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaW50ZWdlckxlbiA9IHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4cG9uZW50ID0gcGFyc2VkTnVtYmVyLmV4cG9uZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkZWNpbWFscyA9IFtdOwogICAgICAgICAgICBpc1plcm8gPSBkaWdpdHMuZXZlcnkoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGQgPT4gIWQpKTsKICAgICAgICAgICAgLy8gcGFkIHplcm9zIGZvciBzbWFsbCBudW1iZXJzCiAgICAgICAgICAgIGZvciAoOyBpbnRlZ2VyTGVuIDwgbWluSW50OyBpbnRlZ2VyTGVuKyspIHsKICAgICAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIHBhZCB6ZXJvcyBmb3Igc21hbGwgbnVtYmVycwogICAgICAgICAgICBmb3IgKDsgaW50ZWdlckxlbiA8IDA7IGludGVnZXJMZW4rKykgewogICAgICAgICAgICAgICAgZGlnaXRzLnVuc2hpZnQoMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gZXh0cmFjdCBkZWNpbWFscyBkaWdpdHMKICAgICAgICAgICAgaWYgKGludGVnZXJMZW4gPiAwKSB7CiAgICAgICAgICAgICAgICBkZWNpbWFscyA9IGRpZ2l0cy5zcGxpY2UoaW50ZWdlckxlbiwgZGlnaXRzLmxlbmd0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkZWNpbWFscyA9IGRpZ2l0czsKICAgICAgICAgICAgICAgIGRpZ2l0cyA9IFswXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBmb3JtYXQgdGhlIGludGVnZXIgZGlnaXRzIHdpdGggZ3JvdXBpbmcgc2VwYXJhdG9ycwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGdyb3VwcyA9IFtdOwogICAgICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCA+PSBwYXR0ZXJuLmxnU2l6ZSkgewogICAgICAgICAgICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLnNwbGljZSgtcGF0dGVybi5sZ1NpemUsIGRpZ2l0cy5sZW5ndGgpLmpvaW4oJycpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB3aGlsZSAoZGlnaXRzLmxlbmd0aCA+IHBhdHRlcm4uZ1NpemUpIHsKICAgICAgICAgICAgICAgIGdyb3Vwcy51bnNoaWZ0KGRpZ2l0cy5zcGxpY2UoLXBhdHRlcm4uZ1NpemUsIGRpZ2l0cy5sZW5ndGgpLmpvaW4oJycpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZGlnaXRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZ3JvdXBzLnVuc2hpZnQoZGlnaXRzLmpvaW4oJycpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ID0gZ3JvdXBzLmpvaW4oZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgZ3JvdXBTeW1ib2wpKTsKICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSBkZWNpbWFsIGRpZ2l0cwogICAgICAgICAgICBpZiAoZGVjaW1hbHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIGRlY2ltYWxTeW1ib2wpICsgZGVjaW1hbHMuam9pbignJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGV4cG9uZW50KSB7CiAgICAgICAgICAgICAgICBmb3JtYXR0ZWRUZXh0ICs9IGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5FeHBvbmVudGlhbCkgKyAnKycgKyBleHBvbmVudDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodmFsdWUgPCAwICYmICFpc1plcm8pIHsKICAgICAgICAgICAgZm9ybWF0dGVkVGV4dCA9IHBhdHRlcm4ubmVnUHJlICsgZm9ybWF0dGVkVGV4dCArIHBhdHRlcm4ubmVnU3VmOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZm9ybWF0dGVkVGV4dCA9IHBhdHRlcm4ucG9zUHJlICsgZm9ybWF0dGVkVGV4dCArIHBhdHRlcm4ucG9zU3VmOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZm9ybWF0dGVkVGV4dDsKICAgIH0KICAgIC8qKgogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBGb3JtYXRzIGEgbnVtYmVyIGFzIGN1cnJlbmN5IHVzaW5nIGxvY2FsZSBydWxlcy4KICAgICAqCiAgICAgKiBAc2VlIGBmb3JtYXROdW1iZXIoKWAgLyBgRGVjaW1hbFBpcGVgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBmb3JtYXQuCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcGFyYW0gez99IGN1cnJlbmN5IEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGN1cnJlbmN5IHN5bWJvbCBvciBpdHMgbmFtZSwKICAgICAqIHN1Y2ggYXMgIiQiIG9yICJDYW5hZGlhbiBEb2xsYXIiLiBVc2VkIGluIG91dHB1dCBzdHJpbmcsIGJ1dCBkb2VzIG5vdCBhZmZlY3QgdGhlIG9wZXJhdGlvbgogICAgICogb2YgdGhlIGZ1bmN0aW9uLgogICAgICogQHBhcmFtIHs/PX0gY3VycmVuY3lDb2RlIFRoZSBbSVNPIDQyMTddKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT180MjE3KQogICAgICogY3VycmVuY3kgY29kZSwgc3VjaCBhcyBgVVNEYCBmb3IgdGhlIFVTIGRvbGxhciBhbmQgYEVVUmAgZm9yIHRoZSBldXJvLgogICAgICogVXNlZCB0byBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBkaWdpdHMgaW4gdGhlIGRlY2ltYWwgcGFydC4KICAgICAqIEBwYXJhbSB7Pz19IGRpZ2l0c0luZm8KICAgICAqIEByZXR1cm4gez99IFRoZSBmb3JtYXR0ZWQgY3VycmVuY3kgdmFsdWUuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBmb3JtYXRDdXJyZW5jeSh2YWx1ZSwgbG9jYWxlLCBjdXJyZW5jeSwgY3VycmVuY3lDb2RlLCBkaWdpdHNJbmZvKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvcm1hdCA9IGdldExvY2FsZU51bWJlckZvcm1hdChsb2NhbGUsIE51bWJlckZvcm1hdFN0eWxlLkN1cnJlbmN5KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgICAgIHBhdHRlcm4ubWluRnJhYyA9IGdldE51bWJlck9mQ3VycmVuY3lEaWdpdHMoKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbmN5Q29kZSkpKTsKICAgICAgICBwYXR0ZXJuLm1heEZyYWMgPSBwYXR0ZXJuLm1pbkZyYWM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlcyA9IGZvcm1hdE51bWJlclRvTG9jYWxlU3RyaW5nKHZhbHVlLCBwYXR0ZXJuLCBsb2NhbGUsIE51bWJlclN5bWJvbC5DdXJyZW5jeUdyb3VwLCBOdW1iZXJTeW1ib2wuQ3VycmVuY3lEZWNpbWFsLCBkaWdpdHNJbmZvKTsKICAgICAgICByZXR1cm4gcmVzCiAgICAgICAgICAgIC5yZXBsYWNlKENVUlJFTkNZX0NIQVIsIGN1cnJlbmN5KQogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIDIgdGltZSB0aGUgY3VycmVuY3kgY2hhcmFjdGVyLCB0aGUgc2Vjb25kIG9uZSBpcyBpZ25vcmVkCiAgICAgICAgICAgIC5yZXBsYWNlKENVUlJFTkNZX0NIQVIsICcnKQogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIHNwYWNpbmcgYmV0d2VlbiBjdXJyZW5jeSBjaGFyYWN0ZXIgYW5kIHRoZSB2YWx1ZSBhbmQKICAgICAgICAgICAgLy8gdGhlIGN1cnJlbmN5IGNoYXJhY3RlciBpcyBzdXByZXNzZWQgYnkgcGFzc2luZyBhbiBlbXB0eSBzdHJpbmcsIHRoZQogICAgICAgICAgICAvLyBzcGFjaW5nIGNoYXJhY3RlciB3b3VsZCByZW1haW4gYXMgcGFydCBvZiB0aGUgc3RyaW5nLiBUaGVuIHdlCiAgICAgICAgICAgIC8vIHNob3VsZCByZW1vdmUgaXQuCiAgICAgICAgICAgIC50cmltKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogRm9ybWF0cyBhIG51bWJlciBhcyBhIHBlcmNlbnRhZ2UgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcy4KICAgICAqCiAgICAgKiBAc2VlIGBmb3JtYXROdW1iZXIoKWAgLyBgRGVjaW1hbFBpcGVgIC8gW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICoKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBmb3JtYXQuCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIHBlcmNlbnRhZ2UgdmFsdWUuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBmb3JtYXRQZXJjZW50KHZhbHVlLCBsb2NhbGUsIGRpZ2l0c0luZm8pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZm9ybWF0ID0gZ2V0TG9jYWxlTnVtYmVyRm9ybWF0KGxvY2FsZSwgTnVtYmVyRm9ybWF0U3R5bGUuUGVyY2VudCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhdHRlcm4gPSBwYXJzZU51bWJlckZvcm1hdChmb3JtYXQsIGdldExvY2FsZU51bWJlclN5bWJvbChsb2NhbGUsIE51bWJlclN5bWJvbC5NaW51c1NpZ24pKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzID0gZm9ybWF0TnVtYmVyVG9Mb2NhbGVTdHJpbmcodmFsdWUsIHBhdHRlcm4sIGxvY2FsZSwgTnVtYmVyU3ltYm9sLkdyb3VwLCBOdW1iZXJTeW1ib2wuRGVjaW1hbCwgZGlnaXRzSW5mbywgdHJ1ZSk7CiAgICAgICAgcmV0dXJuIHJlcy5yZXBsYWNlKG5ldyBSZWdFeHAoUEVSQ0VOVF9DSEFSLCAnZycpLCBnZXRMb2NhbGVOdW1iZXJTeW1ib2wobG9jYWxlLCBOdW1iZXJTeW1ib2wuUGVyY2VudFNpZ24pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBGb3JtYXRzIGEgbnVtYmVyIGFzIHRleHQsIHdpdGggZ3JvdXAgc2l6aW5nLCBzZXBhcmF0b3IsIGFuZCBvdGhlcgogICAgICogcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgbG9jYWxlLgogICAgICoKICAgICAqIEBzZWUgW0ludGVybmF0aW9uYWxpemF0aW9uIChpMThuKSBHdWlkZV0oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL2kxOG4pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBmb3JtYXQuCiAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgZm9ybWF0dGVkIHRleHQgc3RyaW5nLgogICAgICovCiAgICBmdW5jdGlvbiBmb3JtYXROdW1iZXIodmFsdWUsIGxvY2FsZSwgZGlnaXRzSW5mbykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmb3JtYXQgPSBnZXRMb2NhbGVOdW1iZXJGb3JtYXQobG9jYWxlLCBOdW1iZXJGb3JtYXRTdHlsZS5EZWNpbWFsKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGF0dGVybiA9IHBhcnNlTnVtYmVyRm9ybWF0KGZvcm1hdCwgZ2V0TG9jYWxlTnVtYmVyU3ltYm9sKGxvY2FsZSwgTnVtYmVyU3ltYm9sLk1pbnVzU2lnbikpOwogICAgICAgIHJldHVybiBmb3JtYXROdW1iZXJUb0xvY2FsZVN0cmluZyh2YWx1ZSwgcGF0dGVybiwgbG9jYWxlLCBOdW1iZXJTeW1ib2wuR3JvdXAsIE51bWJlclN5bWJvbC5EZWNpbWFsLCBkaWdpdHNJbmZvKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmb3JtYXQKICAgICAqIEBwYXJhbSB7Pz19IG1pbnVzU2lnbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VOdW1iZXJGb3JtYXQoZm9ybWF0LCBtaW51c1NpZ24gPSAnLScpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcCA9IHsKICAgICAgICAgICAgbWluSW50OiAxLAogICAgICAgICAgICBtaW5GcmFjOiAwLAogICAgICAgICAgICBtYXhGcmFjOiAwLAogICAgICAgICAgICBwb3NQcmU6ICcnLAogICAgICAgICAgICBwb3NTdWY6ICcnLAogICAgICAgICAgICBuZWdQcmU6ICcnLAogICAgICAgICAgICBuZWdTdWY6ICcnLAogICAgICAgICAgICBnU2l6ZTogMCwKICAgICAgICAgICAgbGdTaXplOiAwCiAgICAgICAgfTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGF0dGVyblBhcnRzID0gZm9ybWF0LnNwbGl0KFBBVFRFUk5fU0VQKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcG9zaXRpdmUgPSBwYXR0ZXJuUGFydHNbMF07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5lZ2F0aXZlID0gcGF0dGVyblBhcnRzWzFdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb3NpdGl2ZVBhcnRzID0gcG9zaXRpdmUuaW5kZXhPZihERUNJTUFMX1NFUCkgIT09IC0xID8KICAgICAgICAgICAgcG9zaXRpdmUuc3BsaXQoREVDSU1BTF9TRVApIDoKICAgICAgICAgICAgWwogICAgICAgICAgICAgICAgcG9zaXRpdmUuc3Vic3RyaW5nKDAsIHBvc2l0aXZlLmxhc3RJbmRleE9mKFpFUk9fQ0hBUikgKyAxKSwKICAgICAgICAgICAgICAgIHBvc2l0aXZlLnN1YnN0cmluZyhwb3NpdGl2ZS5sYXN0SW5kZXhPZihaRVJPX0NIQVIpICsgMSkKICAgICAgICAgICAgXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW50ZWdlciA9IHBvc2l0aXZlUGFydHNbMF07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZyYWN0aW9uID0gcG9zaXRpdmVQYXJ0c1sxXSB8fCAnJzsKICAgICAgICBwLnBvc1ByZSA9IGludGVnZXIuc3Vic3RyKDAsIGludGVnZXIuaW5kZXhPZihESUdJVF9DSEFSKSk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmcmFjdGlvbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNoID0gZnJhY3Rpb24uY2hhckF0KGkpOwogICAgICAgICAgICBpZiAoY2ggPT09IFpFUk9fQ0hBUikgewogICAgICAgICAgICAgICAgcC5taW5GcmFjID0gcC5tYXhGcmFjID0gaSArIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY2ggPT09IERJR0lUX0NIQVIpIHsKICAgICAgICAgICAgICAgIHAubWF4RnJhYyA9IGkgKyAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcC5wb3NTdWYgKz0gY2g7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGdyb3VwcyA9IGludGVnZXIuc3BsaXQoR1JPVVBfU0VQKTsKICAgICAgICBwLmdTaXplID0gZ3JvdXBzWzFdID8gZ3JvdXBzWzFdLmxlbmd0aCA6IDA7CiAgICAgICAgcC5sZ1NpemUgPSAoZ3JvdXBzWzJdIHx8IGdyb3Vwc1sxXSkgPyAoZ3JvdXBzWzJdIHx8IGdyb3Vwc1sxXSkubGVuZ3RoIDogMDsKICAgICAgICBpZiAobmVnYXRpdmUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cnVua0xlbiA9IHBvc2l0aXZlLmxlbmd0aCAtIHAucG9zUHJlLmxlbmd0aCAtIHAucG9zU3VmLmxlbmd0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3MgPSBuZWdhdGl2ZS5pbmRleE9mKERJR0lUX0NIQVIpOwogICAgICAgICAgICBwLm5lZ1ByZSA9IG5lZ2F0aXZlLnN1YnN0cigwLCBwb3MpLnJlcGxhY2UoLycvZywgJycpOwogICAgICAgICAgICBwLm5lZ1N1ZiA9IG5lZ2F0aXZlLnN1YnN0cihwb3MgKyB0cnVua0xlbikucmVwbGFjZSgvJy9nLCAnJyk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBwLm5lZ1ByZSA9IG1pbnVzU2lnbiArIHAucG9zUHJlOwogICAgICAgICAgICBwLm5lZ1N1ZiA9IHAucG9zU3VmOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcDsKICAgIH0KICAgIC8vIFRyYW5zZm9ybXMgYSBwYXJzZWQgbnVtYmVyIGludG8gYSBwZXJjZW50YWdlIGJ5IG11bHRpcGx5aW5nIGl0IGJ5IDEwMAogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcnNlZE51bWJlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdG9QZXJjZW50KHBhcnNlZE51bWJlcikgewogICAgICAgIC8vIGlmIHRoZSBudW1iZXIgaXMgMCwgZG9uJ3QgZG8gYW55dGhpbmcKICAgICAgICBpZiAocGFyc2VkTnVtYmVyLmRpZ2l0c1swXSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gcGFyc2VkTnVtYmVyOwogICAgICAgIH0KICAgICAgICAvLyBHZXR0aW5nIHRoZSBjdXJyZW50IG51bWJlciBvZiBkZWNpbWFscwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmcmFjdGlvbkxlbiA9IHBhcnNlZE51bWJlci5kaWdpdHMubGVuZ3RoIC0gcGFyc2VkTnVtYmVyLmludGVnZXJMZW47CiAgICAgICAgaWYgKHBhcnNlZE51bWJlci5leHBvbmVudCkgewogICAgICAgICAgICBwYXJzZWROdW1iZXIuZXhwb25lbnQgKz0gMjsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGlmIChmcmFjdGlvbkxlbiA9PT0gMCkgewogICAgICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmRpZ2l0cy5wdXNoKDAsIDApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGZyYWN0aW9uTGVuID09PSAxKSB7CiAgICAgICAgICAgICAgICBwYXJzZWROdW1iZXIuZGlnaXRzLnB1c2goMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyc2VkTnVtYmVyLmludGVnZXJMZW4gKz0gMjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHBhcnNlZE51bWJlcjsKICAgIH0KICAgIC8qKgogICAgICogUGFyc2VzIGEgbnVtYmVyLgogICAgICogU2lnbmlmaWNhbnQgYml0cyBvZiB0aGlzIHBhcnNlIGFsZ29yaXRobSBjYW1lIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL01pa2VNY2wvYmlnLmpzLwogICAgICogQHBhcmFtIHs/fSBudW0KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlTnVtYmVyKG51bSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbnVtU3RyID0gTWF0aC5hYnMobnVtKSArICcnOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZXhwb25lbnQgPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGlnaXRzOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW50ZWdlckxlbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBqOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgemVyb3M7CiAgICAgICAgLy8gRGVjaW1hbCBwb2ludD8KICAgICAgICBpZiAoKGludGVnZXJMZW4gPSBudW1TdHIuaW5kZXhPZihERUNJTUFMX1NFUCkpID4gLTEpIHsKICAgICAgICAgICAgbnVtU3RyID0gbnVtU3RyLnJlcGxhY2UoREVDSU1BTF9TRVAsICcnKTsKICAgICAgICB9CiAgICAgICAgLy8gRXhwb25lbnRpYWwgZm9ybT8KICAgICAgICBpZiAoKGkgPSBudW1TdHIuc2VhcmNoKC9lL2kpKSA+IDApIHsKICAgICAgICAgICAgLy8gV29yayBvdXQgdGhlIGV4cG9uZW50LgogICAgICAgICAgICBpZiAoaW50ZWdlckxlbiA8IDApCiAgICAgICAgICAgICAgICBpbnRlZ2VyTGVuID0gaTsKICAgICAgICAgICAgaW50ZWdlckxlbiArPSArbnVtU3RyLnNsaWNlKGkgKyAxKTsKICAgICAgICAgICAgbnVtU3RyID0gbnVtU3RyLnN1YnN0cmluZygwLCBpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaW50ZWdlckxlbiA8IDApIHsKICAgICAgICAgICAgLy8gVGhlcmUgd2FzIG5vIGRlY2ltYWwgcG9pbnQgb3IgZXhwb25lbnQgc28gaXQgaXMgYW4gaW50ZWdlci4KICAgICAgICAgICAgaW50ZWdlckxlbiA9IG51bVN0ci5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcy4KICAgICAgICBmb3IgKGkgPSAwOyBudW1TdHIuY2hhckF0KGkpID09PSBaRVJPX0NIQVI7IGkrKykgeyAvKiBlbXB0eSAqLwogICAgICAgIH0KICAgICAgICBpZiAoaSA9PT0gKHplcm9zID0gbnVtU3RyLmxlbmd0aCkpIHsKICAgICAgICAgICAgLy8gVGhlIGRpZ2l0cyBhcmUgYWxsIHplcm8uCiAgICAgICAgICAgIGRpZ2l0cyA9IFswXTsKICAgICAgICAgICAgaW50ZWdlckxlbiA9IDE7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm9zCiAgICAgICAgICAgIHplcm9zLS07CiAgICAgICAgICAgIHdoaWxlIChudW1TdHIuY2hhckF0KHplcm9zKSA9PT0gWkVST19DSEFSKQogICAgICAgICAgICAgICAgemVyb3MtLTsKICAgICAgICAgICAgLy8gVHJhaWxpbmcgemVyb3MgYXJlIGluc2lnbmlmaWNhbnQgc28gaWdub3JlIHRoZW0KICAgICAgICAgICAgaW50ZWdlckxlbiAtPSBpOwogICAgICAgICAgICBkaWdpdHMgPSBbXTsKICAgICAgICAgICAgLy8gQ29udmVydCBzdHJpbmcgdG8gYXJyYXkgb2YgZGlnaXRzIHdpdGhvdXQgbGVhZGluZy90cmFpbGluZyB6ZXJvcy4KICAgICAgICAgICAgZm9yIChqID0gMDsgaSA8PSB6ZXJvczsgaSsrLCBqKyspIHsKICAgICAgICAgICAgICAgIGRpZ2l0c1tqXSA9IE51bWJlcihudW1TdHIuY2hhckF0KGkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIG92ZXJmbG93cyB0aGUgbWF4aW11bSBhbGxvd2VkIGRpZ2l0cyB0aGVuIHVzZSBhbiBleHBvbmVudC4KICAgICAgICBpZiAoaW50ZWdlckxlbiA+IE1BWF9ESUdJVFMpIHsKICAgICAgICAgICAgZGlnaXRzID0gZGlnaXRzLnNwbGljZSgwLCBNQVhfRElHSVRTIC0gMSk7CiAgICAgICAgICAgIGV4cG9uZW50ID0gaW50ZWdlckxlbiAtIDE7CiAgICAgICAgICAgIGludGVnZXJMZW4gPSAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBkaWdpdHMsIGV4cG9uZW50LCBpbnRlZ2VyTGVuIH07CiAgICB9CiAgICAvKioKICAgICAqIFJvdW5kIHRoZSBwYXJzZWQgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzCiAgICAgKiBUaGlzIGZ1bmN0aW9uIGNoYW5nZXMgdGhlIHBhcnNlZE51bWJlciBpbi1wbGFjZQogICAgICogQHBhcmFtIHs/fSBwYXJzZWROdW1iZXIKICAgICAqIEBwYXJhbSB7P30gbWluRnJhYwogICAgICogQHBhcmFtIHs/fSBtYXhGcmFjCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByb3VuZE51bWJlcihwYXJzZWROdW1iZXIsIG1pbkZyYWMsIG1heEZyYWMpIHsKICAgICAgICBpZiAobWluRnJhYyA+IG1heEZyYWMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIGZyYWN0aW9uICgke21pbkZyYWN9KSBpcyBoaWdoZXIgdGhhbiB0aGUgbWF4aW11bSAoJHttYXhGcmFjfSkuYCk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGlnaXRzID0gcGFyc2VkTnVtYmVyLmRpZ2l0czsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZyYWN0aW9uTGVuID0gZGlnaXRzLmxlbmd0aCAtIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmcmFjdGlvblNpemUgPSBNYXRoLm1pbihNYXRoLm1heChtaW5GcmFjLCBmcmFjdGlvbkxlbiksIG1heEZyYWMpOwogICAgICAgIC8vIFRoZSBpbmRleCBvZiB0aGUgZGlnaXQgdG8gd2hlcmUgcm91bmRpbmcgaXMgdG8gb2NjdXIKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyBwYXJzZWROdW1iZXIuaW50ZWdlckxlbjsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGRpZ2l0ID0gZGlnaXRzW3JvdW5kQXRdOwogICAgICAgIGlmIChyb3VuZEF0ID4gMCkgewogICAgICAgICAgICAvLyBEcm9wIGZyYWN0aW9uYWwgZGlnaXRzIGJleW9uZCBgcm91bmRBdGAKICAgICAgICAgICAgZGlnaXRzLnNwbGljZShNYXRoLm1heChwYXJzZWROdW1iZXIuaW50ZWdlckxlbiwgcm91bmRBdCkpOwogICAgICAgICAgICAvLyBTZXQgbm9uLWZyYWN0aW9uYWwgZGlnaXRzIGJleW9uZCBgcm91bmRBdGAgdG8gMAogICAgICAgICAgICBmb3IgKGxldCBqID0gcm91bmRBdDsgaiA8IGRpZ2l0cy5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgZGlnaXRzW2pdID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gV2Ugcm91bmRlZCB0byB6ZXJvIHNvIHJlc2V0IHRoZSBwYXJzZWROdW1iZXIKICAgICAgICAgICAgZnJhY3Rpb25MZW4gPSBNYXRoLm1heCgwLCBmcmFjdGlvbkxlbik7CiAgICAgICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuID0gMTsKICAgICAgICAgICAgZGlnaXRzLmxlbmd0aCA9IE1hdGgubWF4KDEsIHJvdW5kQXQgPSBmcmFjdGlvblNpemUgKyAxKTsKICAgICAgICAgICAgZGlnaXRzWzBdID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCByb3VuZEF0OyBpKyspCiAgICAgICAgICAgICAgICBkaWdpdHNbaV0gPSAwOwogICAgICAgIH0KICAgICAgICBpZiAoZGlnaXQgPj0gNSkgewogICAgICAgICAgICBpZiAocm91bmRBdCAtIDEgPCAwKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBrID0gMDsgayA+IHJvdW5kQXQ7IGstLSkgewogICAgICAgICAgICAgICAgICAgIGRpZ2l0cy51bnNoaWZ0KDApOwogICAgICAgICAgICAgICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkaWdpdHMudW5zaGlmdCgxKTsKICAgICAgICAgICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuKys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkaWdpdHNbcm91bmRBdCAtIDFdKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gUGFkIG91dCB3aXRoIHplcm9zIHRvIGdldCB0aGUgcmVxdWlyZWQgZnJhY3Rpb24gbGVuZ3RoCiAgICAgICAgZm9yICg7IGZyYWN0aW9uTGVuIDwgTWF0aC5tYXgoMCwgZnJhY3Rpb25TaXplKTsgZnJhY3Rpb25MZW4rKykKICAgICAgICAgICAgZGlnaXRzLnB1c2goMCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkcm9wVHJhaWxpbmdaZXJvcyA9IGZyYWN0aW9uU2l6ZSAhPT0gMDsKICAgICAgICAvLyBNaW5pbWFsIGxlbmd0aCA9IG5iIG9mIGRlY2ltYWxzIHJlcXVpcmVkICsgY3VycmVudCBuYiBvZiBpbnRlZ2VycwogICAgICAgIC8vIEFueSBudW1iZXIgYmVzaWRlcyB0aGF0IGlzIG9wdGlvbmFsIGFuZCBjYW4gYmUgcmVtb3ZlZCBpZiBpdCdzIGEgdHJhaWxpbmcgMAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtaW5MZW4gPSBtaW5GcmFjICsgcGFyc2VkTnVtYmVyLmludGVnZXJMZW47CiAgICAgICAgLy8gRG8gYW55IGNhcnJ5aW5nLCBlLmcuIGEgZGlnaXQgd2FzIHJvdW5kZWQgdXAgdG8gMTAKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY2FycnkgPSBkaWdpdHMucmVkdWNlUmlnaHQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2FycnkKICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcGFyYW0gez99IGRpZ2l0cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKGNhcnJ5LCBkLCBpLCBkaWdpdHMpIHsKICAgICAgICAgICAgZCA9IGQgKyBjYXJyeTsKICAgICAgICAgICAgZGlnaXRzW2ldID0gZCA8IDEwID8gZCA6IGQgLSAxMDsgLy8gZCAlIDEwCiAgICAgICAgICAgIGlmIChkcm9wVHJhaWxpbmdaZXJvcykgewogICAgICAgICAgICAgICAgLy8gRG8gbm90IGtlZXAgbWVhbmluZ2xlc3MgZnJhY3Rpb25hbCB0cmFpbGluZyB6ZXJvcyAoZS5nLiAxNS41MjAwMCAtLT4gMTUuNTIpCiAgICAgICAgICAgICAgICBpZiAoZGlnaXRzW2ldID09PSAwICYmIGkgPj0gbWluTGVuKSB7CiAgICAgICAgICAgICAgICAgICAgZGlnaXRzLnBvcCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZHJvcFRyYWlsaW5nWmVyb3MgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZCA+PSAxMCA/IDEgOiAwOyAvLyBNYXRoLmZsb29yKGQgLyAxMCk7CiAgICAgICAgfSksIDApOwogICAgICAgIGlmIChjYXJyeSkgewogICAgICAgICAgICBkaWdpdHMudW5zaGlmdChjYXJyeSk7CiAgICAgICAgICAgIHBhcnNlZE51bWJlci5pbnRlZ2VyTGVuKys7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHBhcnNlSW50QXV0b1JhZGl4KHRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzdWx0ID0gcGFyc2VJbnQodGV4dCk7CiAgICAgICAgaWYgKGlzTmFOKHJlc3VsdCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGludGVnZXIgbGl0ZXJhbCB3aGVuIHBhcnNpbmcgJyArIHRleHQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9pMThuL2xvY2FsaXphdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgTmdMb2NhbGl6YXRpb24gewogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2F0ZWdvcnkgZm9yIGEgZ2l2ZW4gdmFsdWUuCiAgICAgKiAtICI9dmFsdWUiIHdoZW4gdGhlIGNhc2UgZXhpc3RzLAogICAgICogLSB0aGUgcGx1cmFsIGNhdGVnb3J5IG90aGVyd2lzZQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBjYXNlcwogICAgICogQHBhcmFtIHs/fSBuZ0xvY2FsaXphdGlvbgogICAgICogQHBhcmFtIHs/PX0gbG9jYWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgY2FzZXMsIG5nTG9jYWxpemF0aW9uLCBsb2NhbGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGtleSA9IGA9JHt2YWx1ZX1gOwogICAgICAgIGlmIChjYXNlcy5pbmRleE9mKGtleSkgPiAtMSkgewogICAgICAgICAgICByZXR1cm4ga2V5OwogICAgICAgIH0KICAgICAgICBrZXkgPSBuZ0xvY2FsaXphdGlvbi5nZXRQbHVyYWxDYXRlZ29yeSh2YWx1ZSwgbG9jYWxlKTsKICAgICAgICBpZiAoY2FzZXMuaW5kZXhPZihrZXkpID4gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIGtleTsKICAgICAgICB9CiAgICAgICAgaWYgKGNhc2VzLmluZGV4T2YoJ290aGVyJykgPiAtMSkgewogICAgICAgICAgICByZXR1cm4gJ290aGVyJzsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBwbHVyYWwgbWVzc2FnZSBmb3VuZCBmb3IgdmFsdWUgIiR7dmFsdWV9ImApOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBwbHVyYWwgY2FzZSBiYXNlZCBvbiB0aGUgbG9jYWxlCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTmdMb2NhbGVMb2NhbGl6YXRpb24gZXh0ZW5kcyBOZ0xvY2FsaXphdGlvbiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihsb2NhbGUpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez89fSBsb2NhbGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBsdXJhbENhdGVnb3J5KHZhbHVlLCBsb2NhbGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbHVyYWwgPSBnZXRMb2NhbGVQbHVyYWxDYXNlJDEobG9jYWxlIHx8IHRoaXMubG9jYWxlKSh2YWx1ZSk7CiAgICAgICAgICAgIHN3aXRjaCAocGx1cmFsKSB7CiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5aZXJvOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnemVybyc7CiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5PbmU6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdvbmUnOwogICAgICAgICAgICAgICAgY2FzZSBQbHVyYWwuVHdvOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAndHdvJzsKICAgICAgICAgICAgICAgIGNhc2UgUGx1cmFsLkZldzoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ2Zldyc7CiAgICAgICAgICAgICAgICBjYXNlIFBsdXJhbC5NYW55OgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnbWFueSc7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnb3RoZXInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTmdMb2NhbGVMb2NhbGl6YXRpb24uybVmYWMgPSBmdW5jdGlvbiBOZ0xvY2FsZUxvY2FsaXphdGlvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0xvY2FsZUxvY2FsaXphdGlvbikoybXJtWluamVjdChMT0NBTEVfSUQkMSkpOyB9OwogICAgTmdMb2NhbGVMb2NhbGl6YXRpb24uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTmdMb2NhbGVMb2NhbGl6YXRpb24sIGZhY3Rvcnk6IE5nTG9jYWxlTG9jYWxpemF0aW9uLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ0xvY2FsZUxvY2FsaXphdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTE9DQUxFX0lEJDEsXSB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9jb29raWUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvb2tpZVN0cgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUNvb2tpZVZhbHVlKGNvb2tpZVN0ciwgbmFtZSkgewogICAgICAgIG5hbWUgPSBlbmNvZGVVUklDb21wb25lbnQobmFtZSk7CiAgICAgICAgZm9yIChjb25zdCBjb29raWUgb2YgY29va2llU3RyLnNwbGl0KCc7JykpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlcUluZGV4ID0gY29va2llLmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgY29uc3QgW2Nvb2tpZU5hbWUsIGNvb2tpZVZhbHVlXSA9IGVxSW5kZXggPT0gLTEgPyBbY29va2llLCAnJ10gOiBbY29va2llLnNsaWNlKDAsIGVxSW5kZXgpLCBjb29raWUuc2xpY2UoZXFJbmRleCArIDEpXTsKICAgICAgICAgICAgaWYgKGNvb2tpZU5hbWUudHJpbSgpID09PSBuYW1lKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KGNvb2tpZVZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19jbGFzcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBgYGAKICAgICAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT0iJ2ZpcnN0IHNlY29uZCciPi4uLjwvc29tZS1lbGVtZW50PgogICAgICoKICAgICAqICAgICA8c29tZS1lbGVtZW50IFtuZ0NsYXNzXT0iWydmaXJzdCcsICdzZWNvbmQnXSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKgogICAgICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPSJ7J2ZpcnN0JzogdHJ1ZSwgJ3NlY29uZCc6IHRydWUsICd0aGlyZCc6IGZhbHNlfSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKgogICAgICogICAgIDxzb21lLWVsZW1lbnQgW25nQ2xhc3NdPSJzdHJpbmdFeHB8YXJyYXlFeHB8b2JqRXhwIj4uLi48L3NvbWUtZWxlbWVudD4KICAgICAqCiAgICAgKiAgICAgPHNvbWUtZWxlbWVudCBbbmdDbGFzc109InsnY2xhc3MxIGNsYXNzMiBjbGFzczMnIDogdHJ1ZX0iPi4uLjwvc29tZS1lbGVtZW50PgogICAgICogYGBgCiAgICAgKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIEFkZHMgYW5kIHJlbW92ZXMgQ1NTIGNsYXNzZXMgb24gYW4gSFRNTCBlbGVtZW50LgogICAgICoKICAgICAqIFRoZSBDU1MgY2xhc3NlcyBhcmUgdXBkYXRlZCBhcyBmb2xsb3dzLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgdGhlIGV4cHJlc3Npb24gZXZhbHVhdGlvbjoKICAgICAqIC0gYHN0cmluZ2AgLSB0aGUgQ1NTIGNsYXNzZXMgbGlzdGVkIGluIHRoZSBzdHJpbmcgKHNwYWNlIGRlbGltaXRlZCkgYXJlIGFkZGVkLAogICAgICogLSBgQXJyYXlgIC0gdGhlIENTUyBjbGFzc2VzIGRlY2xhcmVkIGFzIEFycmF5IGVsZW1lbnRzIGFyZSBhZGRlZCwKICAgICAqIC0gYE9iamVjdGAgLSBrZXlzIGFyZSBDU1MgY2xhc3NlcyB0aGF0IGdldCBhZGRlZCB3aGVuIHRoZSBleHByZXNzaW9uIGdpdmVuIGluIHRoZSB2YWx1ZQogICAgICogICAgICAgICAgICAgIGV2YWx1YXRlcyB0byBhIHRydXRoeSB2YWx1ZSwgb3RoZXJ3aXNlIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTmdDbGFzcyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfaXRlcmFibGVEaWZmZXJzCiAgICAgICAgICogQHBhcmFtIHs/fSBfa2V5VmFsdWVEaWZmZXJzCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdFbAogICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2l0ZXJhYmxlRGlmZmVycywgX2tleVZhbHVlRGlmZmVycywgX25nRWwsIF9yZW5kZXJlcikgewogICAgICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlcnMgPSBfaXRlcmFibGVEaWZmZXJzOwogICAgICAgICAgICB0aGlzLl9rZXlWYWx1ZURpZmZlcnMgPSBfa2V5VmFsdWVEaWZmZXJzOwogICAgICAgICAgICB0aGlzLl9uZ0VsID0gX25nRWw7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5faW5pdGlhbENsYXNzZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fcmF3Q2xhc3MgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQga2xhc3ModmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ2xhc3Nlcyh0aGlzLl9pbml0aWFsQ2xhc3Nlcyk7CiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxDbGFzc2VzID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KC9ccysvKSA6IFtdOwogICAgICAgICAgICB0aGlzLl9hcHBseUNsYXNzZXModGhpcy5faW5pdGlhbENsYXNzZXMpOwogICAgICAgICAgICB0aGlzLl9hcHBseUNsYXNzZXModGhpcy5fcmF3Q2xhc3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbmdDbGFzcyh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVDbGFzc2VzKHRoaXMuX3Jhd0NsYXNzKTsKICAgICAgICAgICAgdGhpcy5fYXBwbHlDbGFzc2VzKHRoaXMuX2luaXRpYWxDbGFzc2VzKTsKICAgICAgICAgICAgdGhpcy5faXRlcmFibGVEaWZmZXIgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9rZXlWYWx1ZURpZmZlciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3Jhd0NsYXNzID0gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyA/IHZhbHVlLnNwbGl0KC9ccysvKSA6IHZhbHVlOwogICAgICAgICAgICBpZiAodGhpcy5fcmF3Q2xhc3MpIHsKICAgICAgICAgICAgICAgIGlmIChpc0xpc3RMaWtlSXRlcmFibGUkMSh0aGlzLl9yYXdDbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVyYWJsZURpZmZlciA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVycy5maW5kKHRoaXMuX3Jhd0NsYXNzKS5jcmVhdGUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleVZhbHVlRGlmZmVyID0gdGhpcy5fa2V5VmFsdWVEaWZmZXJzLmZpbmQodGhpcy5fcmF3Q2xhc3MpLmNyZWF0ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdEb0NoZWNrKCkgewogICAgICAgICAgICBpZiAodGhpcy5faXRlcmFibGVEaWZmZXIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGl0ZXJhYmxlQ2hhbmdlcyA9IHRoaXMuX2l0ZXJhYmxlRGlmZmVyLmRpZmYoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Jhd0NsYXNzKSkpOwogICAgICAgICAgICAgICAgaWYgKGl0ZXJhYmxlQ2hhbmdlcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5SXRlcmFibGVDaGFuZ2VzKGl0ZXJhYmxlQ2hhbmdlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fa2V5VmFsdWVEaWZmZXIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGtleVZhbHVlQ2hhbmdlcyA9IHRoaXMuX2tleVZhbHVlRGlmZmVyLmRpZmYoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Jhd0NsYXNzKSkpOwogICAgICAgICAgICAgICAgaWYgKGtleVZhbHVlQ2hhbmdlcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5S2V5VmFsdWVDaGFuZ2VzKGtleVZhbHVlQ2hhbmdlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hcHBseUtleVZhbHVlQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVjb3JkKSA9PiB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKSkpOwogICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hDaGFuZ2VkSXRlbSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVjb3JkKSA9PiB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCByZWNvcmQuY3VycmVudFZhbHVlKSkpOwogICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hSZW1vdmVkSXRlbSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVjb3JkKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocmVjb3JkLnByZXZpb3VzVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90b2dnbGVDbGFzcyhyZWNvcmQua2V5LCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hcHBseUl0ZXJhYmxlQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVjb3JkKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlY29yZC5pdGVtID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKHJlY29yZC5pdGVtLCB0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTmdDbGFzcyBjYW4gb25seSB0b2dnbGUgQ1NTIGNsYXNzZXMgZXhwcmVzc2VkIGFzIHN0cmluZ3MsIGdvdCAke3N0cmluZ2lmeShyZWNvcmQuaXRlbSl9YCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fdG9nZ2xlQ2xhc3MocmVjb3JkLml0ZW0sIGZhbHNlKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWVzIGEgY29sbGVjdGlvbiBvZiBDU1MgY2xhc3NlcyB0byB0aGUgRE9NIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBGb3IgYXJndW1lbnQgb2YgdHlwZSBTZXQgYW5kIEFycmF5IENTUyBjbGFzcyBuYW1lcyBjb250YWluZWQgaW4gdGhvc2UgY29sbGVjdGlvbnMgYXJlIGFsd2F5cwogICAgICAgICAqIGFkZGVkLgogICAgICAgICAqIEZvciBhcmd1bWVudCBvZiB0eXBlIE1hcCBDU1MgY2xhc3MgbmFtZSBpbiB0aGUgbWFwJ3Mga2V5IGlzIHRvZ2dsZWQgYmFzZWQgb24gdGhlIHZhbHVlIChhZGRlZAogICAgICAgICAqIGZvciB0cnV0aHkgYW5kIHJlbW92ZWQgZm9yIGZhbHN5KS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmF3Q2xhc3NWYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hcHBseUNsYXNzZXMocmF3Q2xhc3NWYWwpIHsKICAgICAgICAgICAgaWYgKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShyYXdDbGFzc1ZhbCkgfHwgcmF3Q2xhc3NWYWwgaW5zdGFuY2VvZiBTZXQpIHsKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHJhd0NsYXNzVmFsKSkpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3MKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChrbGFzcykgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsIHRydWUpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhyYXdDbGFzc1ZhbCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrbGFzcwogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAga2xhc3MgPT4gdGhpcy5fdG9nZ2xlQ2xhc3Moa2xhc3MsICEhcmF3Q2xhc3NWYWxba2xhc3NdKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBjb2xsZWN0aW9uIG9mIENTUyBjbGFzc2VzIGZyb20gdGhlIERPTSBlbGVtZW50LiBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yIGNsZWFudXAKICAgICAgICAgKiBwdXJwb3Nlcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmF3Q2xhc3NWYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZW1vdmVDbGFzc2VzKHJhd0NsYXNzVmFsKSB7CiAgICAgICAgICAgIGlmIChyYXdDbGFzc1ZhbCkgewogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocmF3Q2xhc3NWYWwpIHx8IHJhd0NsYXNzVmFsIGluc3RhbmNlb2YgU2V0KSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyYXdDbGFzc1ZhbCkpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtsYXNzCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoa2xhc3MpID0+IHRoaXMuX3RvZ2dsZUNsYXNzKGtsYXNzLCBmYWxzZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHJhd0NsYXNzVmFsKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtsYXNzCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBrbGFzcyA9PiB0aGlzLl90b2dnbGVDbGFzcyhrbGFzcywgZmFsc2UpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGtsYXNzCiAgICAgICAgICogQHBhcmFtIHs/fSBlbmFibGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdG9nZ2xlQ2xhc3Moa2xhc3MsIGVuYWJsZWQpIHsKICAgICAgICAgICAga2xhc3MgPSBrbGFzcy50cmltKCk7CiAgICAgICAgICAgIGlmIChrbGFzcykgewogICAgICAgICAgICAgICAga2xhc3Muc3BsaXQoL1xzKy9nKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2xhc3MKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGtsYXNzID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5hZGRDbGFzcyh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsIGtsYXNzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnJlbW92ZUNsYXNzKHRoaXMuX25nRWwubmF0aXZlRWxlbWVudCwga2xhc3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE5nQ2xhc3MuybVmYWMgPSBmdW5jdGlvbiBOZ0NsYXNzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ2xhc3MpKMm1ybVkaXJlY3RpdmVJbmplY3QoSXRlcmFibGVEaWZmZXJzKSwgybXJtWRpcmVjdGl2ZUluamVjdChLZXlWYWx1ZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMikpOyB9OwogICAgTmdDbGFzcy7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ0NsYXNzLCBzZWxlY3RvcnM6IFtbIiIsICJuZ0NsYXNzIiwgIiJdXSwgaW5wdXRzOiB7IGtsYXNzOiBbImNsYXNzIiwgImtsYXNzIl0sIG5nQ2xhc3M6ICJuZ0NsYXNzIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ0NsYXNzLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSXRlcmFibGVEaWZmZXJzIH0sCiAgICAgICAgeyB0eXBlOiBLZXlWYWx1ZURpZmZlcnMgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9CiAgICBdOwogICAgTmdDbGFzcy5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBrbGFzczogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2xhc3MnLF0gfV0sCiAgICAgICAgbmdDbGFzczogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdDbGFzcycsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19jb21wb25lbnRfb3V0bGV0LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSW5zdGFudGlhdGVzIGEgc2luZ2xlIHtcQGxpbmsgQ29tcG9uZW50fSB0eXBlIGFuZCBpbnNlcnRzIGl0cyBIb3N0IFZpZXcgaW50byBjdXJyZW50IFZpZXcuCiAgICAgKiBgTmdDb21wb25lbnRPdXRsZXRgIHByb3ZpZGVzIGEgZGVjbGFyYXRpdmUgYXBwcm9hY2ggZm9yIGR5bmFtaWMgY29tcG9uZW50IGNyZWF0aW9uLgogICAgICoKICAgICAqIGBOZ0NvbXBvbmVudE91dGxldGAgcmVxdWlyZXMgYSBjb21wb25lbnQgdHlwZSwgaWYgYSBmYWxzeSB2YWx1ZSBpcyBzZXQgdGhlIHZpZXcgd2lsbCBjbGVhciBhbmQKICAgICAqIGFueSBleGlzdGluZyBjb21wb25lbnQgd2lsbCBnZXQgZGVzdHJveWVkLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBGaW5lIHR1bmUgY29udHJvbAogICAgICoKICAgICAqIFlvdSBjYW4gY29udHJvbCB0aGUgY29tcG9uZW50IGNyZWF0aW9uIHByb2Nlc3MgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBvcHRpb25hbCBhdHRyaWJ1dGVzOgogICAgICoKICAgICAqICogYG5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3JgOiBPcHRpb25hbCBjdXN0b20ge1xAbGluayBJbmplY3Rvcn0gdGhhdCB3aWxsIGJlIHVzZWQgYXMgcGFyZW50IGZvcgogICAgICogdGhlIENvbXBvbmVudC4gRGVmYXVsdHMgdG8gdGhlIGluamVjdG9yIG9mIHRoZSBjdXJyZW50IHZpZXcgY29udGFpbmVyLgogICAgICoKICAgICAqICogYG5nQ29tcG9uZW50T3V0bGV0Q29udGVudGA6IE9wdGlvbmFsIGxpc3Qgb2YgcHJvamVjdGFibGUgbm9kZXMgdG8gaW5zZXJ0IGludG8gdGhlIGNvbnRlbnQKICAgICAqIHNlY3Rpb24gb2YgdGhlIGNvbXBvbmVudCwgaWYgZXhpc3RzLgogICAgICoKICAgICAqICogYG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5YDogT3B0aW9uYWwgbW9kdWxlIGZhY3RvcnkgdG8gYWxsb3cgZHluYW1pY2FsbHkgbG9hZGluZyBvdGhlcgogICAgICogbW9kdWxlLCB0aGVuIGxvYWQgYSBjb21wb25lbnQgZnJvbSB0aGF0IG1vZHVsZS4KICAgICAqCiAgICAgKiAjIyMgU3ludGF4CiAgICAgKgogICAgICogU2ltcGxlCiAgICAgKiBgYGAKICAgICAqIDxuZy1jb250YWluZXIgKm5nQ29tcG9uZW50T3V0bGV0PSJjb21wb25lbnRUeXBlRXhwcmVzc2lvbiI+PC9uZy1jb250YWluZXI+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBDdXN0b21pemVkIGluamVjdG9yL2NvbnRlbnQKICAgICAqIGBgYAogICAgICogPG5nLWNvbnRhaW5lciAqbmdDb21wb25lbnRPdXRsZXQ9ImNvbXBvbmVudFR5cGVFeHByZXNzaW9uOwogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluamVjdG9yOiBpbmplY3RvckV4cHJlc3Npb247CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGVudDogY29udGVudE5vZGVzRXhwcmVzc2lvbjsiPgogICAgICogPC9uZy1jb250YWluZXI+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBDdXN0b21pemVkIG5nTW9kdWxlRmFjdG9yeQogICAgICogYGBgCiAgICAgKiA8bmctY29udGFpbmVyICpuZ0NvbXBvbmVudE91dGxldD0iY29tcG9uZW50VHlwZUV4cHJlc3Npb247CiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmdNb2R1bGVGYWN0b3J5OiBtb2R1bGVGYWN0b3J5OyI+CiAgICAgKiA8L25nLWNvbnRhaW5lcj4KICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBBIHNpbXBsZSBleGFtcGxlCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vbmdDb21wb25lbnRPdXRsZXQvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nU2ltcGxlRXhhbXBsZSd9CiAgICAgKgogICAgICogQSBtb3JlIGNvbXBsZXRlIGV4YW1wbGUgd2l0aCBhZGRpdGlvbmFsIG9wdGlvbnM6CiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vbmdDb21wb25lbnRPdXRsZXQvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nQ29tcGxldGVFeGFtcGxlJ30KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqLwogICAgY2xhc3MgTmdDb21wb25lbnRPdXRsZXQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfdmlld0NvbnRhaW5lclJlZikgewogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX21vZHVsZVJlZiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudFJlZiA9IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLm5nQ29tcG9uZW50T3V0bGV0KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbEluamVjdG9yID0gdGhpcy5uZ0NvbXBvbmVudE91dGxldEluamVjdG9yIHx8IHRoaXMuX3ZpZXdDb250YWluZXJSZWYucGFyZW50SW5qZWN0b3I7CiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlc1snbmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnknXSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9tb2R1bGVSZWYpCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZHVsZVJlZi5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMubmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRNb2R1bGUgPSBlbEluamVjdG9yLmdldChOZ01vZHVsZVJlZik7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX21vZHVsZVJlZiA9IHRoaXMubmdDb21wb25lbnRPdXRsZXROZ01vZHVsZUZhY3RvcnkuY3JlYXRlKHBhcmVudE1vZHVsZS5pbmplY3Rvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9tb2R1bGVSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IHRoaXMuX21vZHVsZVJlZiA/IHRoaXMuX21vZHVsZVJlZi5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgOgogICAgICAgICAgICAgICAgICAgIGVsSW5qZWN0b3IuZ2V0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyLnJlc29sdmVDb21wb25lbnRGYWN0b3J5KHRoaXMubmdDb21wb25lbnRPdXRsZXQpOwogICAgICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVDb21wb25lbnQoY29tcG9uZW50RmFjdG9yeSwgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGgsIGVsSW5qZWN0b3IsIHRoaXMubmdDb21wb25lbnRPdXRsZXRDb250ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fbW9kdWxlUmVmKQogICAgICAgICAgICAgICAgdGhpcy5fbW9kdWxlUmVmLmRlc3Ryb3koKTsKICAgICAgICB9CiAgICB9CiAgICBOZ0NvbXBvbmVudE91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIE5nQ29tcG9uZW50T3V0bGV0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nQ29tcG9uZW50T3V0bGV0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpKTsgfTsKICAgIE5nQ29tcG9uZW50T3V0bGV0Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nQ29tcG9uZW50T3V0bGV0LCBzZWxlY3RvcnM6IFtbIiIsICJuZ0NvbXBvbmVudE91dGxldCIsICIiXV0sIGlucHV0czogeyBuZ0NvbXBvbmVudE91dGxldDogIm5nQ29tcG9uZW50T3V0bGV0IiwgbmdDb21wb25lbnRPdXRsZXRJbmplY3RvcjogIm5nQ29tcG9uZW50T3V0bGV0SW5qZWN0b3IiLCBuZ0NvbXBvbmVudE91dGxldENvbnRlbnQ6ICJuZ0NvbXBvbmVudE91dGxldENvbnRlbnQiLCBuZ0NvbXBvbmVudE91dGxldE5nTW9kdWxlRmFjdG9yeTogIm5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5IiB9LCBmZWF0dXJlczogW8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ0NvbXBvbmVudE91dGxldC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfQogICAgXTsKICAgIE5nQ29tcG9uZW50T3V0bGV0LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG5nQ29tcG9uZW50T3V0bGV0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBuZ0NvbXBvbmVudE91dGxldEluamVjdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBuZ0NvbXBvbmVudE91dGxldENvbnRlbnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG5nQ29tcG9uZW50T3V0bGV0TmdNb2R1bGVGYWN0b3J5OiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19mb3Jfb2YudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHRlbXBsYXRlIFQsIFUKICAgICAqLwogICAgY2xhc3MgTmdGb3JPZkNvbnRleHQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gJGltcGxpY2l0CiAgICAgICAgICogQHBhcmFtIHs/fSBuZ0Zvck9mCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEBwYXJhbSB7P30gY291bnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcigkaW1wbGljaXQsIG5nRm9yT2YsIGluZGV4LCBjb3VudCkgewogICAgICAgICAgICB0aGlzLiRpbXBsaWNpdCA9ICRpbXBsaWNpdDsKICAgICAgICAgICAgdGhpcy5uZ0Zvck9mID0gbmdGb3JPZjsKICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwogICAgICAgICAgICB0aGlzLmNvdW50ID0gY291bnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGZpcnN0KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCA9PT0gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbGFzdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5kZXggPT09IHRoaXMuY291bnQgLSAxOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBldmVuKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5pbmRleCAlIDIgPT09IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG9kZCgpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmV2ZW47CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBIFtzdHJ1Y3R1cmFsIGRpcmVjdGl2ZV0oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKSB0aGF0IHJlbmRlcnMKICAgICAqIGEgdGVtcGxhdGUgZm9yIGVhY2ggaXRlbSBpbiBhIGNvbGxlY3Rpb24uCiAgICAgKiBUaGUgZGlyZWN0aXZlIGlzIHBsYWNlZCBvbiBhbiBlbGVtZW50LCB3aGljaCBiZWNvbWVzIHRoZSBwYXJlbnQKICAgICAqIG9mIHRoZSBjbG9uZWQgdGVtcGxhdGVzLgogICAgICoKICAgICAqIFRoZSBgbmdGb3JPZmAgZGlyZWN0aXZlIGlzIGdlbmVyYWxseSB1c2VkIGluIHRoZQogICAgICogW3Nob3J0aGFuZCBmb3JtXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGhlLWFzdGVyaXNrLS1wcmVmaXgpIGAqbmdGb3JgLgogICAgICogSW4gdGhpcyBmb3JtLCB0aGUgdGVtcGxhdGUgdG8gYmUgcmVuZGVyZWQgZm9yIGVhY2ggaXRlcmF0aW9uIGlzIHRoZSBjb250ZW50CiAgICAgKiBvZiBhbiBhbmNob3IgZWxlbWVudCBjb250YWluaW5nIHRoZSBkaXJlY3RpdmUuCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBzaG9ydGhhbmQgc3ludGF4IHdpdGggc29tZSBvcHRpb25zLAogICAgICogY29udGFpbmVkIGluIGFuIGA8bGk+YCBlbGVtZW50LgogICAgICoKICAgICAqIGBgYAogICAgICogPGxpICpuZ0Zvcj0ibGV0IGl0ZW0gb2YgaXRlbXM7IGluZGV4IGFzIGk7IHRyYWNrQnk6IHRyYWNrQnlGbiI+Li4uPC9saT4KICAgICAqIGBgYAogICAgICoKICAgICAqIFRoZSBzaG9ydGhhbmQgZm9ybSBleHBhbmRzIGludG8gYSBsb25nIGZvcm0gdGhhdCB1c2VzIHRoZSBgbmdGb3JPZmAgc2VsZWN0b3IKICAgICAqIG9uIGFuIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50LgogICAgICogVGhlIGNvbnRlbnQgb2YgdGhlIGA8bmctdGVtcGxhdGU+YCBlbGVtZW50IGlzIHRoZSBgPGxpPmAgZWxlbWVudCB0aGF0IGhlbGQgdGhlCiAgICAgKiBzaG9ydC1mb3JtIGRpcmVjdGl2ZS4KICAgICAqCiAgICAgKiBIZXJlIGlzIHRoZSBleHBhbmRlZCB2ZXJzaW9uIG9mIHRoZSBzaG9ydC1mb3JtIGV4YW1wbGUuCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8bmctdGVtcGxhdGUgbmdGb3IgbGV0LWl0ZW0gW25nRm9yT2ZdPSJpdGVtcyIgbGV0LWk9ImluZGV4IiBbbmdGb3JUcmFja0J5XT0idHJhY2tCeUZuIj4KICAgICAqICAgPGxpPi4uLjwvbGk+CiAgICAgKiA8L25nLXRlbXBsYXRlPgogICAgICogYGBgCiAgICAgKgogICAgICogQW5ndWxhciBhdXRvbWF0aWNhbGx5IGV4cGFuZHMgdGhlIHNob3J0aGFuZCBzeW50YXggYXMgaXQgY29tcGlsZXMgdGhlIHRlbXBsYXRlLgogICAgICogVGhlIGNvbnRleHQgZm9yIGVhY2ggZW1iZWRkZWQgdmlldyBpcyBsb2dpY2FsbHkgbWVyZ2VkIHRvIHRoZSBjdXJyZW50IGNvbXBvbmVudAogICAgICogY29udGV4dCBhY2NvcmRpbmcgdG8gaXRzIGxleGljYWwgcG9zaXRpb24uCiAgICAgKgogICAgICogV2hlbiB1c2luZyB0aGUgc2hvcnRoYW5kIHN5bnRheCwgQW5ndWxhciBhbGxvd3Mgb25seSBbb25lIHN0cnVjdHVyYWwgZGlyZWN0aXZlCiAgICAgKiBvbiBhbiBlbGVtZW50XShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjb25lLXN0cnVjdHVyYWwtZGlyZWN0aXZlLXBlci1ob3N0LWVsZW1lbnQpLgogICAgICogSWYgeW91IHdhbnQgdG8gaXRlcmF0ZSBjb25kaXRpb25hbGx5LCBmb3IgZXhhbXBsZSwKICAgICAqIHB1dCB0aGUgYCpuZ0lmYCBvbiBhIGNvbnRhaW5lciBlbGVtZW50IHRoYXQgd3JhcHMgdGhlIGAqbmdGb3JgIGVsZW1lbnQuCiAgICAgKiBGb3IgZnV0aGVyIGRpc2N1c3Npb24sIHNlZQogICAgICogW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzI29uZS1wZXItZWxlbWVudCkuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIExvY2FsIHZhcmlhYmxlcwogICAgICoKICAgICAqIGBOZ0Zvck9mYCBwcm92aWRlcyBleHBvcnRlZCB2YWx1ZXMgdGhhdCBjYW4gYmUgYWxpYXNlZCB0byBsb2NhbCB2YXJpYWJsZXMuCiAgICAgKiBGb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiAgYGBgCiAgICAgKiA8bGkgKm5nRm9yPSJsZXQgdXNlciBvZiB1c2VyczsgaW5kZXggYXMgaTsgZmlyc3QgYXMgaXNGaXJzdCI+CiAgICAgKiAgICB7e2l9fS97e3VzZXJzLmxlbmd0aH19LiB7e3VzZXJ9fSA8c3BhbiAqbmdJZj0iaXNGaXJzdCI+ZGVmYXVsdDwvc3Bhbj4KICAgICAqIDwvbGk+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4cG9ydGVkIHZhbHVlcyBjYW4gYmUgYWxpYXNlZCB0byBsb2NhbCB2YXJpYWJsZXM6CiAgICAgKgogICAgICogLSBgJGltcGxpY2l0OiBUYDogVGhlIHZhbHVlIG9mIHRoZSBpbmRpdmlkdWFsIGl0ZW1zIGluIHRoZSBpdGVyYWJsZSAoYG5nRm9yT2ZgKS4KICAgICAqIC0gYG5nRm9yT2Y6IE5nSXRlcmFibGU8VD5gOiBUaGUgdmFsdWUgb2YgdGhlIGl0ZXJhYmxlIGV4cHJlc3Npb24uIFVzZWZ1bCB3aGVuIHRoZSBleHByZXNzaW9uIGlzCiAgICAgKiBtb3JlIGNvbXBsZXggdGhlbiBhIHByb3BlcnR5IGFjY2VzcywgZm9yIGV4YW1wbGUgd2hlbiB1c2luZyB0aGUgYXN5bmMgcGlwZSAoYHVzZXJTdHJlYW1zIHwKICAgICAqIGFzeW5jYCkuCiAgICAgKiAtIGBpbmRleDogbnVtYmVyYDogVGhlIGluZGV4IG9mIHRoZSBjdXJyZW50IGl0ZW0gaW4gdGhlIGl0ZXJhYmxlLgogICAgICogLSBgY291bnQ6IG51bWJlcmA6IFRoZSBsZW5ndGggb2YgdGhlIGl0ZXJhYmxlLgogICAgICogLSBgZmlyc3Q6IGJvb2xlYW5gOiBUcnVlIHdoZW4gdGhlIGl0ZW0gaXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIGl0ZXJhYmxlLgogICAgICogLSBgbGFzdDogYm9vbGVhbmA6IFRydWUgd2hlbiB0aGUgaXRlbSBpcyB0aGUgbGFzdCBpdGVtIGluIHRoZSBpdGVyYWJsZS4KICAgICAqIC0gYGV2ZW46IGJvb2xlYW5gOiBUcnVlIHdoZW4gdGhlIGl0ZW0gaGFzIGFuIGV2ZW4gaW5kZXggaW4gdGhlIGl0ZXJhYmxlLgogICAgICogLSBgb2RkOiBib29sZWFuYDogVHJ1ZSB3aGVuIHRoZSBpdGVtIGhhcyBhbiBvZGQgaW5kZXggaW4gdGhlIGl0ZXJhYmxlLgogICAgICoKICAgICAqICMjIyBDaGFuZ2UgcHJvcGFnYXRpb24KICAgICAqCiAgICAgKiBXaGVuIHRoZSBjb250ZW50cyBvZiB0aGUgaXRlcmF0b3IgY2hhbmdlcywgYE5nRm9yT2ZgIG1ha2VzIHRoZSBjb3JyZXNwb25kaW5nIGNoYW5nZXMgdG8gdGhlIERPTToKICAgICAqCiAgICAgKiAqIFdoZW4gYW4gaXRlbSBpcyBhZGRlZCwgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRlbXBsYXRlIGlzIGFkZGVkIHRvIHRoZSBET00uCiAgICAgKiAqIFdoZW4gYW4gaXRlbSBpcyByZW1vdmVkLCBpdHMgdGVtcGxhdGUgaW5zdGFuY2UgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00uCiAgICAgKiAqIFdoZW4gaXRlbXMgYXJlIHJlb3JkZXJlZCwgdGhlaXIgcmVzcGVjdGl2ZSB0ZW1wbGF0ZXMgYXJlIHJlb3JkZXJlZCBpbiB0aGUgRE9NLgogICAgICoKICAgICAqIEFuZ3VsYXIgdXNlcyBvYmplY3QgaWRlbnRpdHkgdG8gdHJhY2sgaW5zZXJ0aW9ucyBhbmQgZGVsZXRpb25zIHdpdGhpbiB0aGUgaXRlcmF0b3IgYW5kIHJlcHJvZHVjZQogICAgICogdGhvc2UgY2hhbmdlcyBpbiB0aGUgRE9NLiBUaGlzIGhhcyBpbXBvcnRhbnQgaW1wbGljYXRpb25zIGZvciBhbmltYXRpb25zIGFuZCBhbnkgc3RhdGVmdWwKICAgICAqIGNvbnRyb2xzIHRoYXQgYXJlIHByZXNlbnQsIHN1Y2ggYXMgYDxpbnB1dD5gIGVsZW1lbnRzIHRoYXQgYWNjZXB0IHVzZXIgaW5wdXQuIEluc2VydGVkIHJvd3MgY2FuCiAgICAgKiBiZSBhbmltYXRlZCBpbiwgZGVsZXRlZCByb3dzIGNhbiBiZSBhbmltYXRlZCBvdXQsIGFuZCB1bmNoYW5nZWQgcm93cyByZXRhaW4gYW55IHVuc2F2ZWQgc3RhdGUKICAgICAqIHN1Y2ggYXMgdXNlciBpbnB1dC4KICAgICAqIEZvciBtb3JlIG9uIGFuaW1hdGlvbnMsIHNlZSBbVHJhbnNpdGlvbnMgYW5kIFRyaWdnZXJzXShndWlkZS90cmFuc2l0aW9uLWFuZC10cmlnZ2VycykuCiAgICAgKgogICAgICogVGhlIGlkZW50aXRpZXMgb2YgZWxlbWVudHMgaW4gdGhlIGl0ZXJhdG9yIGNhbiBjaGFuZ2Ugd2hpbGUgdGhlIGRhdGEgZG9lcyBub3QuCiAgICAgKiBUaGlzIGNhbiBoYXBwZW4sIGZvciBleGFtcGxlLCBpZiB0aGUgaXRlcmF0b3IgaXMgcHJvZHVjZWQgZnJvbSBhbiBSUEMgdG8gdGhlIHNlcnZlciwgYW5kIHRoYXQKICAgICAqIFJQQyBpcyByZS1ydW4uIEV2ZW4gaWYgdGhlIGRhdGEgaGFzbid0IGNoYW5nZWQsIHRoZSBzZWNvbmQgcmVzcG9uc2UgcHJvZHVjZXMgb2JqZWN0cyB3aXRoCiAgICAgKiBkaWZmZXJlbnQgaWRlbnRpdGllcywgYW5kIEFuZ3VsYXIgbXVzdCB0ZWFyIGRvd24gdGhlIGVudGlyZSBET00gYW5kIHJlYnVpbGQgaXQgKGFzIGlmIGFsbCBvbGQKICAgICAqIGVsZW1lbnRzIHdlcmUgZGVsZXRlZCBhbmQgYWxsIG5ldyBlbGVtZW50cyBpbnNlcnRlZCkuCiAgICAgKgogICAgICogVG8gYXZvaWQgdGhpcyBleHBlbnNpdmUgb3BlcmF0aW9uLCB5b3UgY2FuIGN1c3RvbWl6ZSB0aGUgZGVmYXVsdCB0cmFja2luZyBhbGdvcml0aG0uCiAgICAgKiBieSBzdXBwbHlpbmcgdGhlIGB0cmFja0J5YCBvcHRpb24gdG8gYE5nRm9yT2ZgLgogICAgICogYHRyYWNrQnlgIHRha2VzIGEgZnVuY3Rpb24gdGhhdCBoYXMgdHdvIGFyZ3VtZW50czogYGluZGV4YCBhbmQgYGl0ZW1gLgogICAgICogSWYgYHRyYWNrQnlgIGlzIGdpdmVuLCBBbmd1bGFyIHRyYWNrcyBjaGFuZ2VzIGJ5IHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlIGZ1bmN0aW9uLgogICAgICoKICAgICAqIEBzZWUgW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oZ3VpZGUvc3RydWN0dXJhbC1kaXJlY3RpdmVzKQogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdGVtcGxhdGUgVCwgVQogICAgICovCiAgICBjbGFzcyBOZ0Zvck9mIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfdGVtcGxhdGUKICAgICAgICAgKiBAcGFyYW0gez99IF9kaWZmZXJzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXIsIF90ZW1wbGF0ZSwgX2RpZmZlcnMpIHsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lciA9IF92aWV3Q29udGFpbmVyOwogICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IF90ZW1wbGF0ZTsKICAgICAgICAgICAgdGhpcy5fZGlmZmVycyA9IF9kaWZmZXJzOwogICAgICAgICAgICB0aGlzLl9uZ0Zvck9mID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fbmdGb3JPZkRpcnR5ID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHZhbHVlIG9mIHRoZSBpdGVyYWJsZSBleHByZXNzaW9uLCB3aGljaCBjYW4gYmUgdXNlZCBhcyBhCiAgICAgICAgICogW3RlbXBsYXRlIGlucHV0IHZhcmlhYmxlXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMjdGVtcGxhdGUtaW5wdXQtdmFyaWFibGUpLgogICAgICAgICAqIEBwYXJhbSB7P30gbmdGb3JPZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG5nRm9yT2YobmdGb3JPZikgewogICAgICAgICAgICB0aGlzLl9uZ0Zvck9mID0gbmdGb3JPZjsKICAgICAgICAgICAgdGhpcy5fbmdGb3JPZkRpcnR5ID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0aGF0IGRlZmluZXMgaG93IHRvIHRyYWNrIGNoYW5nZXMgZm9yIGl0ZW1zIGluIHRoZSBpdGVyYWJsZS4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4gaXRlbXMgYXJlIGFkZGVkLCBtb3ZlZCwgb3IgcmVtb3ZlZCBpbiB0aGUgaXRlcmFibGUsCiAgICAgICAgICogdGhlIGRpcmVjdGl2ZSBtdXN0IHJlLXJlbmRlciB0aGUgYXBwcm9wcmlhdGUgRE9NIG5vZGVzLgogICAgICAgICAqIFRvIG1pbmltaXplIGNodXJuIGluIHRoZSBET00sIG9ubHkgbm9kZXMgdGhhdCBoYXZlIGNoYW5nZWQKICAgICAgICAgKiBhcmUgcmUtcmVuZGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgY2hhbmdlIGRldGVjdG9yIGFzc3VtZXMgdGhhdAogICAgICAgICAqIHRoZSBvYmplY3QgaW5zdGFuY2UgaWRlbnRpZmllcyB0aGUgbm9kZSBpbiB0aGUgaXRlcmFibGUuCiAgICAgICAgICogV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIHN1cHBsaWVkLCB0aGUgZGlyZWN0aXZlIHVzZXMKICAgICAgICAgKiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhpcyBmdW5jdGlvbiB0byBpZGVudGlmeSB0aGUgaXRlbSBub2RlLAogICAgICAgICAqIHJhdGhlciB0aGFuIHRoZSBpZGVudGl0eSBvZiB0aGUgb2JqZWN0IGl0c2VsZi4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBmdW5jdGlvbiByZWNlaXZlcyB0d28gaW5wdXRzLAogICAgICAgICAqIHRoZSBpdGVyYXRpb24gaW5kZXggYW5kIHRoZSBub2RlIG9iamVjdCBJRC4KICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbmdGb3JUcmFja0J5KGZuKSB7CiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiBmbiAhPSBudWxsICYmIHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgLy8gVE9ETyh2aWNiKTogdXNlIGEgbG9nIHNlcnZpY2Ugb25jZSB0aGVyZSBpcyBhIHB1YmxpYyBvbmUgYXZhaWxhYmxlCiAgICAgICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnNvbGUpKSAmJiAoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS53YXJuKSkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYHRyYWNrQnkgbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShmbil9LiBgICsKICAgICAgICAgICAgICAgICAgICAgICAgYFNlZSBodHRwczovL2FuZ3VsYXIuaW8vYXBpL2NvbW1vbi9OZ0Zvck9mI2NoYW5nZS1wcm9wYWdhdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90cmFja0J5Rm4gPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmdGb3JUcmFja0J5KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tCeUZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgdGVtcGxhdGUgdGhhdCBpcyBzdGFtcGVkIG91dCBmb3IgZWFjaCBpdGVtIGluIHRoZSBpdGVyYWJsZS4KICAgICAgICAgKiBAc2VlIFt0ZW1wbGF0ZSByZWZlcmVuY2UgdmFyaWFibGVdKGd1aWRlL3RlbXBsYXRlLXN5bnRheCN0ZW1wbGF0ZS1yZWZlcmVuY2UtdmFyaWFibGVzLS12YXItKQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBuZ0ZvclRlbXBsYXRlKHZhbHVlKSB7CiAgICAgICAgICAgIC8vIFRPRE8oVFMyLjEpOiBtYWtlIFRlbXBsYXRlUmVmPFBhcnRpYWw8TmdGb3JSb3dPZjxUPj4+IG9uY2Ugd2UgbW92ZSB0byBUUyB2Mi4xCiAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IHR5cGUgaXMgdG9vIHJlc3RyaWN0aXZlOyBhIHRlbXBsYXRlIHRoYXQganVzdCB1c2VzIGluZGV4LCBmb3IgZXhhbXBsZSwKICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGFjY2VwdGFibGUuCiAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWVzIHRoZSBjaGFuZ2VzIHdoZW4gbmVlZGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdEb0NoZWNrKCkgewogICAgICAgICAgICBpZiAodGhpcy5fbmdGb3JPZkRpcnR5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ0Zvck9mRGlydHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIC8vIFJlYWN0IG9uIG5nRm9yT2YgY2hhbmdlcyBvbmx5IG9uY2UgYWxsIGlucHV0cyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gdGhpcy5fbmdGb3JPZjsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUodGhpcy5uZ0ZvclRyYWNrQnkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBhIGRpZmZlciBzdXBwb3J0aW5nIG9iamVjdCAnJHt2YWx1ZX0nIG9mIHR5cGUgJyR7Z2V0VHlwZU5hbWUkMSh2YWx1ZSl9Jy4gTmdGb3Igb25seSBzdXBwb3J0cyBiaW5kaW5nIHRvIEl0ZXJhYmxlcyBzdWNoIGFzIEFycmF5cy5gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2RpZmZlcikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlcyA9IHRoaXMuX2RpZmZlci5kaWZmKHRoaXMuX25nRm9yT2YpOwogICAgICAgICAgICAgICAgaWYgKGNoYW5nZXMpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlDaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnNlcnRUdXBsZXMgPSBbXTsKICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoT3BlcmF0aW9uKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWRqdXN0ZWRQcmV2aW91c0luZGV4CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudEluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaXRlbSwgYWRqdXN0ZWRQcmV2aW91c0luZGV4LCBjdXJyZW50SW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChpdGVtLnByZXZpb3VzSW5kZXggPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIC8vIE5nRm9yT2YgaXMgbmV2ZXIgIm51bGwiIG9yICJ1bmRlZmluZWQiIGhlcmUgYmVjYXVzZSB0aGUgZGlmZmVyIGRldGVjdGVkCiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhIG5ldyBpdGVtIG5lZWRzIHRvIGJlIGluc2VydGVkIGZyb20gdGhlIGl0ZXJhYmxlLiBUaGlzIGltcGxpZXMgdGhhdAogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIGFuIGl0ZXJhYmxlIHZhbHVlIGZvciAiX25nRm9yT2YiLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5fdmlld0NvbnRhaW5lci5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGUsIG5ldyBOZ0Zvck9mQ29udGV4dCgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLCAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbmdGb3JPZikpLCAtMSwgLTEpLCBjdXJyZW50SW5kZXggPT09IG51bGwgPyB1bmRlZmluZWQgOiBjdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0dXBsZSA9IG5ldyBSZWNvcmRWaWV3VHVwbGUoaXRlbSwgdmlldyk7CiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2godHVwbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLnJlbW92ZShhZGp1c3RlZFByZXZpb3VzSW5kZXggPT09IG51bGwgPyB1bmRlZmluZWQgOiBhZGp1c3RlZFByZXZpb3VzSW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoYWRqdXN0ZWRQcmV2aW91c0luZGV4ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld0NvbnRhaW5lci5nZXQoYWRqdXN0ZWRQcmV2aW91c0luZGV4KSkpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIubW92ZSh2aWV3LCBjdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0dXBsZSA9IG5ldyBSZWNvcmRWaWV3VHVwbGUoaXRlbSwgKC8qKiBAdHlwZSB7P30gKi8gKHZpZXcpKSk7CiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VHVwbGVzLnB1c2godHVwbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5zZXJ0VHVwbGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wZXJWaWV3Q2hhbmdlKGluc2VydFR1cGxlc1tpXS52aWV3LCBpbnNlcnRUdXBsZXNbaV0ucmVjb3JkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gMCwgaWxlbiA9IHRoaXMuX3ZpZXdDb250YWluZXIubGVuZ3RoOyBpIDwgaWxlbjsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXIuZ2V0KGkpKSk7CiAgICAgICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuaW5kZXggPSBpOwogICAgICAgICAgICAgICAgdmlld1JlZi5jb250ZXh0LmNvdW50ID0gaWxlbjsKICAgICAgICAgICAgICAgIHZpZXdSZWYuY29udGV4dC5uZ0Zvck9mID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX25nRm9yT2YpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hJZGVudGl0eUNoYW5nZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVjb3JkKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXIuZ2V0KHJlY29yZC5jdXJyZW50SW5kZXgpKSk7CiAgICAgICAgICAgICAgICB2aWV3UmVmLmNvbnRleHQuJGltcGxpY2l0ID0gcmVjb3JkLml0ZW07CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZpZXcKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3BlclZpZXdDaGFuZ2UodmlldywgcmVjb3JkKSB7CiAgICAgICAgICAgIHZpZXcuY29udGV4dC4kaW1wbGljaXQgPSByZWNvcmQuaXRlbTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXNzZXJ0cyB0aGUgY29ycmVjdCB0eXBlIG9mIHRoZSBjb250ZXh0IGZvciB0aGUgdGVtcGxhdGUgdGhhdCBgTmdGb3JPZmAgd2lsbCByZW5kZXIuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcHJlc2VuY2Ugb2YgdGhpcyBtZXRob2QgaXMgYSBzaWduYWwgdG8gdGhlIEl2eSB0ZW1wbGF0ZSB0eXBlLWNoZWNrIGNvbXBpbGVyIHRoYXQgdGhlCiAgICAgICAgICogYE5nRm9yT2ZgIHN0cnVjdHVyYWwgZGlyZWN0aXZlIHJlbmRlcnMgaXRzIHRlbXBsYXRlIHdpdGggYSBzcGVjaWZpYyBjb250ZXh0IHR5cGUuCiAgICAgICAgICogQHRlbXBsYXRlIFQsIFUKICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAqIEBwYXJhbSB7P30gY3R4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgbmdUZW1wbGF0ZUNvbnRleHRHdWFyZChkaXIsIGN0eCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBOZ0Zvck9mLsm1ZmFjID0gZnVuY3Rpb24gTmdGb3JPZl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0Zvck9mKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChJdGVyYWJsZURpZmZlcnMpKTsgfTsKICAgIE5nRm9yT2YuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdGb3JPZiwgc2VsZWN0b3JzOiBbWyIiLCAibmdGb3IiLCAiIiwgIm5nRm9yT2YiLCAiIl1dLCBpbnB1dHM6IHsgbmdGb3JPZjogIm5nRm9yT2YiLCBuZ0ZvclRyYWNrQnk6ICJuZ0ZvclRyYWNrQnkiLCBuZ0ZvclRlbXBsYXRlOiAibmdGb3JUZW1wbGF0ZSIgfSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTmdGb3JPZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICAgICAgeyB0eXBlOiBJdGVyYWJsZURpZmZlcnMgfQogICAgXTsKICAgIE5nRm9yT2YucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmdGb3JPZjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbmdGb3JUcmFja0J5OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBuZ0ZvclRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQsIFUKICAgICAqLwogICAgY2xhc3MgUmVjb3JkVmlld1R1cGxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHJlY29yZCwgdmlldykgewogICAgICAgICAgICB0aGlzLnJlY29yZCA9IHJlY29yZDsKICAgICAgICAgICAgdGhpcy52aWV3ID0gdmlldzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VHlwZU5hbWUkMSh0eXBlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVbJ25hbWUnXSB8fCB0eXBlb2YgdHlwZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ19pZi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEEgc3RydWN0dXJhbCBkaXJlY3RpdmUgdGhhdCBjb25kaXRpb25hbGx5IGluY2x1ZGVzIGEgdGVtcGxhdGUgYmFzZWQgb24gdGhlIHZhbHVlIG9mCiAgICAgKiBhbiBleHByZXNzaW9uIGNvZXJjZWQgdG8gQm9vbGVhbi4KICAgICAqIFdoZW4gdGhlIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIHRydWUsIEFuZ3VsYXIgcmVuZGVycyB0aGUgdGVtcGxhdGUKICAgICAqIHByb3ZpZGVkIGluIGEgYHRoZW5gIGNsYXVzZSwgYW5kIHdoZW4gIGZhbHNlIG9yIG51bGwsCiAgICAgKiBBbmd1bGFyIHJlbmRlcnMgdGhlIHRlbXBsYXRlIHByb3ZpZGVkIGluIGFuIG9wdGlvbmFsIGBlbHNlYCBjbGF1c2UuIFRoZSBkZWZhdWx0CiAgICAgKiB0ZW1wbGF0ZSBmb3IgdGhlIGBlbHNlYCBjbGF1c2UgaXMgYmxhbmsuCiAgICAgKgogICAgICogQSBbc2hvcnRoYW5kIGZvcm1dKGd1aWRlL3N0cnVjdHVyYWwtZGlyZWN0aXZlcyN0aGUtYXN0ZXJpc2stLXByZWZpeCkgb2YgdGhlIGRpcmVjdGl2ZSwKICAgICAqIGAqbmdJZj0iY29uZGl0aW9uImAsIGlzIGdlbmVyYWxseSB1c2VkLCBwcm92aWRlZAogICAgICogYXMgYW4gYXR0cmlidXRlIG9mIHRoZSBhbmNob3IgZWxlbWVudCBmb3IgdGhlIGluc2VydGVkIHRlbXBsYXRlLgogICAgICogQW5ndWxhciBleHBhbmRzIHRoaXMgaW50byBhIG1vcmUgZXhwbGljaXQgdmVyc2lvbiwgaW4gd2hpY2ggdGhlIGFuY2hvciBlbGVtZW50CiAgICAgKiBpcyBjb250YWluZWQgaW4gYW4gYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuCiAgICAgKgogICAgICogU2ltcGxlIGZvcm0gd2l0aCBzaG9ydGhhbmQgc3ludGF4OgogICAgICoKICAgICAqIGBgYAogICAgICogPGRpdiAqbmdJZj0iY29uZGl0aW9uIj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvZGl2PgogICAgICogYGBgCiAgICAgKgogICAgICogU2ltcGxlIGZvcm0gd2l0aCBleHBhbmRlZCBzeW50YXg6CiAgICAgKgogICAgICogYGBgCiAgICAgKiA8bmctdGVtcGxhdGUgW25nSWZdPSJjb25kaXRpb24iPjxkaXY+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMKICAgICAqIHRydWUuPC9kaXY+PC9uZy10ZW1wbGF0ZT4KICAgICAqIGBgYAogICAgICoKICAgICAqIEZvcm0gd2l0aCBhbiAiZWxzZSIgYmxvY2s6CiAgICAgKgogICAgICogYGBgCiAgICAgKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb247IGVsc2UgZWxzZUJsb2NrIj5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvZGl2PgogICAgICogPG5nLXRlbXBsYXRlICNlbHNlQmxvY2s+Q29udGVudCB0byByZW5kZXIgd2hlbiBjb25kaXRpb24gaXMgZmFsc2UuPC9uZy10ZW1wbGF0ZT4KICAgICAqIGBgYAogICAgICoKICAgICAqIFNob3J0aGFuZCBmb3JtIHdpdGggInRoZW4iIGFuZCAiZWxzZSIgYmxvY2tzOgogICAgICoKICAgICAqIGBgYAogICAgICogPGRpdiAqbmdJZj0iY29uZGl0aW9uOyB0aGVuIHRoZW5CbG9jayBlbHNlIGVsc2VCbG9jayI+PC9kaXY+CiAgICAgKiA8bmctdGVtcGxhdGUgI3RoZW5CbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyB0cnVlLjwvbmctdGVtcGxhdGU+CiAgICAgKiA8bmctdGVtcGxhdGUgI2Vsc2VCbG9jaz5Db250ZW50IHRvIHJlbmRlciB3aGVuIGNvbmRpdGlvbiBpcyBmYWxzZS48L25nLXRlbXBsYXRlPgogICAgICogYGBgCiAgICAgKgogICAgICogRm9ybSB3aXRoIHN0b3JpbmcgdGhlIHZhbHVlIGxvY2FsbHk6CiAgICAgKgogICAgICogYGBgCiAgICAgKiA8ZGl2ICpuZ0lmPSJjb25kaXRpb24gYXMgdmFsdWU7IGVsc2UgZWxzZUJsb2NrIj57e3ZhbHVlfX08L2Rpdj4KICAgICAqIDxuZy10ZW1wbGF0ZSAjZWxzZUJsb2NrPkNvbnRlbnQgdG8gcmVuZGVyIHdoZW4gdmFsdWUgaXMgbnVsbC48L25nLXRlbXBsYXRlPgogICAgICogYGBgCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogVGhlIGAqbmdJZmAgZGlyZWN0aXZlIGlzIG1vc3QgY29tbW9ubHkgdXNlZCB0byBjb25kaXRpb25hbGx5IHNob3cgYW4gaW5saW5lIHRlbXBsYXRlLAogICAgICogYXMgc2VlbiBpbiB0aGUgZm9sbG93aW5nICBleGFtcGxlLgogICAgICogVGhlIGRlZmF1bHQgYGVsc2VgIHRlbXBsYXRlIGlzIGJsYW5rLgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29tbW9uL25nSWYvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nTmdJZlNpbXBsZSd9CiAgICAgKgogICAgICogIyMjIFNob3dpbmcgYW4gYWx0ZXJuYXRpdmUgdGVtcGxhdGUgdXNpbmcgYGVsc2VgCiAgICAgKgogICAgICogVG8gZGlzcGxheSBhIHRlbXBsYXRlIHdoZW4gYGV4cHJlc3Npb25gIGV2YWx1YXRlcyB0byBmYWxzZSwgdXNlIGFuIGBlbHNlYCB0ZW1wbGF0ZQogICAgICogYmluZGluZyBhcyBzaG93biBpbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUuCiAgICAgKiBUaGUgYGVsc2VgIGJpbmRpbmcgcG9pbnRzIHRvIGFuIGA8bmctdGVtcGxhdGU+YCAgZWxlbWVudCBsYWJlbGVkIGAjZWxzZUJsb2NrYC4KICAgICAqIFRoZSB0ZW1wbGF0ZSBjYW4gYmUgZGVmaW5lZCBhbnl3aGVyZSBpbiB0aGUgY29tcG9uZW50IHZpZXcsIGJ1dCBpcyB0eXBpY2FsbHkgcGxhY2VkIHJpZ2h0IGFmdGVyCiAgICAgKiBgbmdJZmAgZm9yIHJlYWRhYmlsaXR5LgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29tbW9uL25nSWYvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nTmdJZkVsc2UnfQogICAgICoKICAgICAqICMjIyBVc2luZyBhbiBleHRlcm5hbCBgdGhlbmAgdGVtcGxhdGUKICAgICAqCiAgICAgKiBJbiB0aGUgcHJldmlvdXMgZXhhbXBsZSwgdGhlIHRoZW4tY2xhdXNlIHRlbXBsYXRlIGlzIHNwZWNpZmllZCBpbmxpbmUsIGFzIHRoZSBjb250ZW50IG9mIHRoZQogICAgICogdGFnIHRoYXQgY29udGFpbnMgdGhlIGBuZ0lmYCBkaXJlY3RpdmUuIFlvdSBjYW4gYWxzbyBzcGVjaWZ5IGEgdGVtcGxhdGUgdGhhdCBpcyBkZWZpbmVkCiAgICAgKiBleHRlcm5hbGx5LCBieSByZWZlcmVuY2luZyBhIGxhYmVsZWQgYDxuZy10ZW1wbGF0ZT5gIGVsZW1lbnQuIFdoZW4geW91IGRvIHRoaXMsIHlvdSBjYW4KICAgICAqIGNoYW5nZSB3aGljaCB0ZW1wbGF0ZSB0byB1c2UgYXQgcnVudGltZSwgYXMgc2hvd24gaW4gdGhlIGZvbGxvd2luZyBleGFtcGxlLgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29tbW9uL25nSWYvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nTmdJZlRoZW5FbHNlJ30KICAgICAqCiAgICAgKiAjIyMgU3RvcmluZyBhIGNvbmRpdGlvbmFsIHJlc3VsdCBpbiBhIHZhcmlhYmxlCiAgICAgKgogICAgICogWW91IG1pZ2h0IHdhbnQgdG8gc2hvdyBhIHNldCBvZiBwcm9wZXJ0aWVzIGZyb20gdGhlIHNhbWUgb2JqZWN0LiBJZiB5b3UgYXJlIHdhaXRpbmcKICAgICAqIGZvciBhc3luY2hyb25vdXMgZGF0YSwgdGhlIG9iamVjdCBjYW4gYmUgdW5kZWZpbmVkLgogICAgICogSW4gdGhpcyBjYXNlLCB5b3UgY2FuIHVzZSBgbmdJZmAgYW5kIHN0b3JlIHRoZSByZXN1bHQgb2YgdGhlIGNvbmRpdGlvbiBpbiBhIGxvY2FsCiAgICAgKiB2YXJpYWJsZSBhcyBzaG93biBpbiB0aGUgdGhlIGZvbGxvd2luZyBleGFtcGxlLgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29tbW9uL25nSWYvdHMvbW9kdWxlLnRzIHJlZ2lvbj0nTmdJZkFzJ30KICAgICAqCiAgICAgKiBUaGlzIGNvZGUgdXNlcyBvbmx5IG9uZSBgQXN5bmNQaXBlYCwgc28gb25seSBvbmUgc3Vic2NyaXB0aW9uIGlzIGNyZWF0ZWQuCiAgICAgKiBUaGUgY29uZGl0aW9uYWwgc3RhdGVtZW50IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGB1c2VyU3RyZWFtfGFzeW5jYCBpbiB0aGUgbG9jYWwgdmFyaWFibGUgYHVzZXJgLgogICAgICogWW91IGNhbiB0aGVuIGJpbmQgdGhlIGxvY2FsIGB1c2VyYCByZXBlYXRlZGx5LgogICAgICoKICAgICAqIFRoZSBjb25kaXRpb25hbCBkaXNwbGF5cyB0aGUgZGF0YSBvbmx5IGlmIGB1c2VyU3RyZWFtYCByZXR1cm5zIGEgdmFsdWUsCiAgICAgKiBzbyB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgdGhlCiAgICAgKiBbc2FmZS1uYXZpZ2F0aW9uLW9wZXJhdG9yXShndWlkZS90ZW1wbGF0ZS1zeW50YXgjc2FmZS1uYXZpZ2F0aW9uLW9wZXJhdG9yKSAoYD8uYCkKICAgICAqIHRvIGd1YXJkIGFnYWluc3QgbnVsbCB2YWx1ZXMgd2hlbiBhY2Nlc3NpbmcgcHJvcGVydGllcy4KICAgICAqIFlvdSBjYW4gZGlzcGxheSBhbiBhbHRlcm5hdGl2ZSB0ZW1wbGF0ZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgZGF0YS4KICAgICAqCiAgICAgKiAjIyMgU2hvcnRoYW5kIHN5bnRheAogICAgICoKICAgICAqIFRoZSBzaG9ydGhhbmQgc3ludGF4IGAqbmdJZmAgZXhwYW5kcyBpbnRvIHR3byBzZXBhcmF0ZSB0ZW1wbGF0ZSBzcGVjaWZpY2F0aW9ucwogICAgICogZm9yIHRoZSAidGhlbiIgYW5kICJlbHNlIiBjbGF1c2VzLiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBzaG9ydGhhbmQgc3RhdGVtZW50LAogICAgICogdGhhdCBpcyBtZWFudCB0byBzaG93IGEgbG9hZGluZyBwYWdlIHdoaWxlIHdhaXRpbmcgZm9yIGRhdGEgdG8gYmUgbG9hZGVkLgogICAgICoKICAgICAqIGBgYAogICAgICogPGRpdiBjbGFzcz0iaGVyby1saXN0IiAqbmdJZj0iaGVyb2VzIGVsc2UgbG9hZGluZyI+CiAgICAgKiAgLi4uCiAgICAgKiA8L2Rpdj4KICAgICAqCiAgICAgKiA8bmctdGVtcGxhdGUgI2xvYWRpbmc+CiAgICAgKiAgPGRpdj5Mb2FkaW5nLi4uPC9kaXY+CiAgICAgKiA8L25nLXRlbXBsYXRlPgogICAgICogYGBgCiAgICAgKgogICAgICogWW91IGNhbiBzZWUgdGhhdCB0aGUgImVsc2UiIGNsYXVzZSByZWZlcmVuY2VzIHRoZSBgPG5nLXRlbXBsYXRlPmAKICAgICAqIHdpdGggdGhlIGAjbG9hZGluZ2AgbGFiZWwsIGFuZCB0aGUgdGVtcGxhdGUgZm9yIHRoZSAidGhlbiIgY2xhdXNlCiAgICAgKiBpcyBwcm92aWRlZCBhcyB0aGUgY29udGVudCBvZiB0aGUgYW5jaG9yIGVsZW1lbnQuCiAgICAgKgogICAgICogSG93ZXZlciwgd2hlbiBBbmd1bGFyIGV4cGFuZHMgdGhlIHNob3J0aGFuZCBzeW50YXgsIGl0IGNyZWF0ZXMKICAgICAqIGFub3RoZXIgYDxuZy10ZW1wbGF0ZT5gIHRhZywgd2l0aCBgbmdJZmAgYW5kIGBuZ0lmRWxzZWAgZGlyZWN0aXZlcy4KICAgICAqIFRoZSBhbmNob3IgZWxlbWVudCBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZSBmb3IgdGhlICJ0aGVuIiBjbGF1c2UgYmVjb21lcwogICAgICogdGhlIGNvbnRlbnQgb2YgdGhpcyB1bmxhYmVsZWQgYDxuZy10ZW1wbGF0ZT5gIHRhZy4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIDxuZy10ZW1wbGF0ZSBbbmdJZl09Imhlcm9lcyIgW25nSWZFbHNlXT0ibG9hZGluZyI+CiAgICAgKiAgPGRpdiBjbGFzcz0iaGVyby1saXN0Ij4KICAgICAqICAgLi4uCiAgICAgKiAgPC9kaXY+CiAgICAgKiA8L25nLXRlbXBsYXRlPgogICAgICoKICAgICAqIDxuZy10ZW1wbGF0ZSAjbG9hZGluZz4KICAgICAqICA8ZGl2PkxvYWRpbmcuLi48L2Rpdj4KICAgICAqIDwvbmctdGVtcGxhdGU+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgcHJlc2VuY2Ugb2YgdGhlIGltcGxpY2l0IHRlbXBsYXRlIG9iamVjdCBoYXMgaW1wbGljYXRpb25zIGZvciB0aGUgbmVzdGluZyBvZgogICAgICogc3RydWN0dXJhbCBkaXJlY3RpdmVzLiBGb3IgbW9yZSBvbiB0aGlzIHN1YmplY3QsIHNlZQogICAgICogW1N0cnVjdHVyYWwgRGlyZWN0aXZlc10oaHR0cHM6Ly9hbmd1bGFyLmlvL2d1aWRlL3N0cnVjdHVyYWwtZGlyZWN0aXZlcyNvbmUtcGVyLWVsZW1lbnQpLgogICAgICoKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgTmdJZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lcgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfdmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYpIHsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lciA9IF92aWV3Q29udGFpbmVyOwogICAgICAgICAgICB0aGlzLl9jb250ZXh0ID0gbmV3IE5nSWZDb250ZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fZWxzZVZpZXdSZWYgPSBudWxsOwogICAgICAgICAgICB0aGlzLl90aGVuVGVtcGxhdGVSZWYgPSB0ZW1wbGF0ZVJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIEJvb2xlYW4gZXhwcmVzc2lvbiB0byBldmFsdWF0ZSBhcyB0aGUgY29uZGl0aW9uIGZvciBzaG93aW5nIGEgdGVtcGxhdGUuCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25kaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBuZ0lmKGNvbmRpdGlvbikgewogICAgICAgICAgICB0aGlzLl9jb250ZXh0LiRpbXBsaWNpdCA9IHRoaXMuX2NvbnRleHQubmdJZiA9IGNvbmRpdGlvbjsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmlldygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIHRlbXBsYXRlIHRvIHNob3cgaWYgdGhlIGNvbmRpdGlvbiBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBuZ0lmVGhlbih0ZW1wbGF0ZVJlZikgewogICAgICAgICAgICBhc3NlcnRUZW1wbGF0ZSgnbmdJZlRoZW4nLCB0ZW1wbGF0ZVJlZik7CiAgICAgICAgICAgIHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmOwogICAgICAgICAgICB0aGlzLl90aGVuVmlld1JlZiA9IG51bGw7IC8vIGNsZWFyIHByZXZpb3VzIHZpZXcgaWYgYW55LgogICAgICAgICAgICB0aGlzLl91cGRhdGVWaWV3KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEEgdGVtcGxhdGUgdG8gc2hvdyBpZiB0aGUgY29uZGl0aW9uIGV4cHJlc3Npb24gZXZhbHVhdGVzIHRvIGZhbHNlLgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBuZ0lmRWxzZSh0ZW1wbGF0ZVJlZikgewogICAgICAgICAgICBhc3NlcnRUZW1wbGF0ZSgnbmdJZkVsc2UnLCB0ZW1wbGF0ZVJlZik7CiAgICAgICAgICAgIHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZiA9IHRlbXBsYXRlUmVmOwogICAgICAgICAgICB0aGlzLl9lbHNlVmlld1JlZiA9IG51bGw7IC8vIGNsZWFyIHByZXZpb3VzIHZpZXcgaWYgYW55LgogICAgICAgICAgICB0aGlzLl91cGRhdGVWaWV3KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlVmlldygpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHQuJGltcGxpY2l0KSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3RoZW5WaWV3UmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vsc2VWaWV3UmVmID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdGhlblRlbXBsYXRlUmVmKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RoZW5WaWV3UmVmID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHRoaXMuX3RoZW5UZW1wbGF0ZVJlZiwgdGhpcy5fY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9lbHNlVmlld1JlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90aGVuVmlld1JlZiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Vsc2VUZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbHNlVmlld1JlZiA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl9lbHNlVGVtcGxhdGVSZWYsIHRoaXMuX2NvbnRleHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBc3NlcnRzIHRoZSBjb3JyZWN0IHR5cGUgb2YgdGhlIGNvbnRleHQgZm9yIHRoZSB0ZW1wbGF0ZSB0aGF0IGBOZ0lmYCB3aWxsIHJlbmRlci4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBwcmVzZW5jZSBvZiB0aGlzIG1ldGhvZCBpcyBhIHNpZ25hbCB0byB0aGUgSXZ5IHRlbXBsYXRlIHR5cGUtY2hlY2sgY29tcGlsZXIgdGhhdCB0aGUKICAgICAgICAgKiBgTmdJZmAgc3RydWN0dXJhbCBkaXJlY3RpdmUgcmVuZGVycyBpdHMgdGVtcGxhdGUgd2l0aCBhIHNwZWNpZmljIGNvbnRleHQgdHlwZS4KICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgICAgICogQHBhcmFtIHs/fSBjdHgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBuZ1RlbXBsYXRlQ29udGV4dEd1YXJkKGRpciwgY3R4KSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KICAgIE5nSWYuybVmYWMgPSBmdW5jdGlvbiBOZ0lmX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nSWYpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpKTsgfTsKICAgIE5nSWYuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdJZiwgc2VsZWN0b3JzOiBbWyIiLCAibmdJZiIsICIiXV0sIGlucHV0czogeyBuZ0lmOiAibmdJZiIsIG5nSWZUaGVuOiAibmdJZlRoZW4iLCBuZ0lmRWxzZTogIm5nSWZFbHNlIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ0lmLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfQogICAgXTsKICAgIE5nSWYucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmdJZjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbmdJZlRoZW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG5nSWZFbHNlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIE5nSWZDb250ZXh0IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy4kaW1wbGljaXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgICAgICB0aGlzLm5nSWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eQogICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXNzZXJ0VGVtcGxhdGUocHJvcGVydHksIHRlbXBsYXRlUmVmKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGlzVGVtcGxhdGVSZWZPck51bGwgPSAhISghdGVtcGxhdGVSZWYgfHwgdGVtcGxhdGVSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KTsKICAgICAgICBpZiAoIWlzVGVtcGxhdGVSZWZPck51bGwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke3Byb3BlcnR5fSBtdXN0IGJlIGEgVGVtcGxhdGVSZWYsIGJ1dCByZWNlaXZlZCAnJHtzdHJpbmdpZnkodGVtcGxhdGVSZWYpfScuYCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX3N3aXRjaC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBTd2l0Y2hWaWV3IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfdGVtcGxhdGVSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfdmlld0NvbnRhaW5lclJlZiwgX3RlbXBsYXRlUmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVSZWYgPSBfdGVtcGxhdGVSZWY7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGUoKSB7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyh0aGlzLl90ZW1wbGF0ZVJlZik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fY3JlYXRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY3JlYXRlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZW5mb3JjZVN0YXRlKGNyZWF0ZWQpIHsKICAgICAgICAgICAgaWYgKGNyZWF0ZWQgJiYgIXRoaXMuX2NyZWF0ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuY3JlYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWNyZWF0ZWQgJiYgdGhpcy5fY3JlYXRlZCkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIGBbbmdTd2l0Y2hdYCBkaXJlY3RpdmUgb24gYSBjb250YWluZXIgc3BlY2lmaWVzIGFuIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdC4KICAgICAqIFRoZSBleHByZXNzaW9ucyB0byBtYXRjaCBhcmUgcHJvdmlkZWQgYnkgYG5nU3dpdGNoQ2FzZWAgZGlyZWN0aXZlcyBvbiB2aWV3cyB3aXRoaW4gdGhlIGNvbnRhaW5lci4KICAgICAqIC0gRXZlcnkgdmlldyB0aGF0IG1hdGNoZXMgaXMgcmVuZGVyZWQuCiAgICAgKiAtIElmIHRoZXJlIGFyZSBubyBtYXRjaGVzLCBhIHZpZXcgd2l0aCB0aGUgYG5nU3dpdGNoRGVmYXVsdGAgZGlyZWN0aXZlIGlzIHJlbmRlcmVkLgogICAgICogLSBFbGVtZW50cyB3aXRoaW4gdGhlIGBbTmdTd2l0Y2hdYCBzdGF0ZW1lbnQgYnV0IG91dHNpZGUgb2YgYW55IGBOZ1N3aXRjaENhc2VgCiAgICAgKiBvciBgbmdTd2l0Y2hEZWZhdWx0YCBkaXJlY3RpdmUgYXJlIHByZXNlcnZlZCBhdCB0aGUgbG9jYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBEZWZpbmUgYSBjb250YWluZXIgZWxlbWVudCBmb3IgdGhlIGRpcmVjdGl2ZSwgYW5kIHNwZWNpZnkgdGhlIHN3aXRjaCBleHByZXNzaW9uCiAgICAgKiB0byBtYXRjaCBhZ2FpbnN0IGFzIGFuIGF0dHJpYnV0ZToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIDxjb250YWluZXItZWxlbWVudCBbbmdTd2l0Y2hdPSJzd2l0Y2hfZXhwcmVzc2lvbiI+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBXaXRoaW4gdGhlIGNvbnRhaW5lciwgYCpuZ1N3aXRjaENhc2VgIHN0YXRlbWVudHMgc3BlY2lmeSB0aGUgbWF0Y2ggZXhwcmVzc2lvbnMKICAgICAqIGFzIGF0dHJpYnV0ZXMuIEluY2x1ZGUgYCpuZ1N3aXRjaERlZmF1bHRgIGFzIHRoZSBmaW5hbCBjYXNlLgogICAgICoKICAgICAqIGBgYAogICAgICogPGNvbnRhaW5lci1lbGVtZW50IFtuZ1N3aXRjaF09InN3aXRjaF9leHByZXNzaW9uIj4KICAgICAqICAgIDxzb21lLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8xIj4uLi48L3NvbWUtZWxlbWVudD4KICAgICAqIC4uLgogICAgICogICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hEZWZhdWx0Pi4uLjwvc29tZS1lbGVtZW50PgogICAgICogPC9jb250YWluZXItZWxlbWVudD4KICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBVc2FnZSBFeGFtcGxlcwogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIG1vcmUgdGhhbiBvbmUgY2FzZSB0byBkaXNwbGF5IHRoZSBzYW1lIHZpZXc6CiAgICAgKgogICAgICogYGBgCiAgICAgKiA8Y29udGFpbmVyLWVsZW1lbnQgW25nU3dpdGNoXT0ic3dpdGNoX2V4cHJlc3Npb24iPgogICAgICogICA8IS0tIHRoZSBzYW1lIHZpZXcgY2FuIGJlIHNob3duIGluIG1vcmUgdGhhbiBvbmUgY2FzZSAtLT4KICAgICAqICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzEiPi4uLjwvc29tZS1lbGVtZW50PgogICAgICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9Im1hdGNoX2V4cHJlc3Npb25fMiI+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKiAgIDxzb21lLW90aGVyLWVsZW1lbnQgKm5nU3dpdGNoQ2FzZT0ibWF0Y2hfZXhwcmVzc2lvbl8zIj4uLi48L3NvbWUtb3RoZXItZWxlbWVudD4KICAgICAqICAgPCEtLWRlZmF1bHQgY2FzZSB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGVzIC0tPgogICAgICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKiA8L2NvbnRhaW5lci1lbGVtZW50PgogICAgICogYGBgCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyBjYXNlcyBjYW4gYmUgbmVzdGVkOgogICAgICogYGBgCiAgICAgKiA8Y29udGFpbmVyLWVsZW1lbnQgW25nU3dpdGNoXT0ic3dpdGNoX2V4cHJlc3Npb24iPgogICAgICogICAgICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzEiPi4uLjwvc29tZS1lbGVtZW50PgogICAgICogICAgICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzIiPi4uLjwvc29tZS1lbGVtZW50PgogICAgICogICAgICAgPHNvbWUtb3RoZXItZWxlbWVudCAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzMiPi4uLjwvc29tZS1vdGhlci1lbGVtZW50PgogICAgICogICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPSJtYXRjaF9leHByZXNzaW9uXzMiPgogICAgICogICAgICAgICA8IS0tIHVzZSBhIG5nLWNvbnRhaW5lciB0byBncm91cCBtdWx0aXBsZSByb290IG5vZGVzIC0tPgogICAgICogICAgICAgICA8aW5uZXItZWxlbWVudD48L2lubmVyLWVsZW1lbnQ+CiAgICAgKiAgICAgICAgIDxpbm5lci1vdGhlci1lbGVtZW50PjwvaW5uZXItb3RoZXItZWxlbWVudD4KICAgICAqICAgICAgIDwvbmctY29udGFpbmVyPgogICAgICogICAgICAgPHNvbWUtZWxlbWVudCAqbmdTd2l0Y2hEZWZhdWx0Pi4uLjwvc29tZS1lbGVtZW50PgogICAgICogICAgIDwvY29udGFpbmVyLWVsZW1lbnQ+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHNlZSBgTmdTd2l0Y2hDYXNlYAogICAgICogQHNlZSBgTmdTd2l0Y2hEZWZhdWx0YAogICAgICogQHNlZSBbU3RydWN0dXJhbCBEaXJlY3RpdmVzXShndWlkZS9zdHJ1Y3R1cmFsLWRpcmVjdGl2ZXMpCiAgICAgKgogICAgICovCiAgICBjbGFzcyBOZ1N3aXRjaCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRVc2VkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2Nhc2VDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleCA9IDA7CiAgICAgICAgICAgIHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG5nU3dpdGNoKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX25nU3dpdGNoID0gbmV3VmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYXNlQ291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURlZmF1bHRDYXNlcyh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkQ2FzZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nhc2VDb3VudCsrOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkRGVmYXVsdCh2aWV3KSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGVmYXVsdFZpZXdzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZWZhdWx0Vmlld3MgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kZWZhdWx0Vmlld3MucHVzaCh2aWV3KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9tYXRjaENhc2UodmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXRjaGVkID0gdmFsdWUgPT0gdGhpcy5fbmdTd2l0Y2g7CiAgICAgICAgICAgIHRoaXMuX2xhc3RDYXNlc01hdGNoZWQgPSB0aGlzLl9sYXN0Q2FzZXNNYXRjaGVkIHx8IG1hdGNoZWQ7CiAgICAgICAgICAgIHRoaXMuX2xhc3RDYXNlQ2hlY2tJbmRleCsrOwogICAgICAgICAgICBpZiAodGhpcy5fbGFzdENhc2VDaGVja0luZGV4ID09PSB0aGlzLl9jYXNlQ291bnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURlZmF1bHRDYXNlcyghdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0Q2FzZUNoZWNrSW5kZXggPSAwOwogICAgICAgICAgICAgICAgdGhpcy5fbGFzdENhc2VzTWF0Y2hlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdXNlRGVmYXVsdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZURlZmF1bHRDYXNlcyh1c2VEZWZhdWx0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kZWZhdWx0Vmlld3MgJiYgdXNlRGVmYXVsdCAhPT0gdGhpcy5fZGVmYXVsdFVzZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRVc2VkID0gdXNlRGVmYXVsdDsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGVmYXVsdFZpZXdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRWaWV3ID0gdGhpcy5fZGVmYXVsdFZpZXdzW2ldOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHRWaWV3LmVuZm9yY2VTdGF0ZSh1c2VEZWZhdWx0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE5nU3dpdGNoLsm1ZmFjID0gZnVuY3Rpb24gTmdTd2l0Y2hfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTd2l0Y2gpKCk7IH07CiAgICBOZ1N3aXRjaC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1N3aXRjaCwgc2VsZWN0b3JzOiBbWyIiLCAibmdTd2l0Y2giLCAiIl1dLCBpbnB1dHM6IHsgbmdTd2l0Y2g6ICJuZ1N3aXRjaCIgfSB9KTsKICAgIE5nU3dpdGNoLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG5nU3dpdGNoOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBQcm92aWRlcyBhIHN3aXRjaCBjYXNlIGV4cHJlc3Npb24gdG8gbWF0Y2ggYWdhaW5zdCBhbiBlbmNsb3NpbmcgYG5nU3dpdGNoYCBleHByZXNzaW9uLgogICAgICogV2hlbiB0aGUgZXhwcmVzc2lvbnMgbWF0Y2gsIHRoZSBnaXZlbiBgTmdTd2l0Y2hDYXNlYCB0ZW1wbGF0ZSBpcyByZW5kZXJlZC4KICAgICAqIElmIG11bHRpcGxlIG1hdGNoIGV4cHJlc3Npb25zIG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiB2YWx1ZSwgYWxsIG9mIHRoZW0gYXJlIGRpc3BsYXllZC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiBXaXRoaW4gYSBzd2l0Y2ggY29udGFpbmVyLCBgKm5nU3dpdGNoQ2FzZWAgc3RhdGVtZW50cyBzcGVjaWZ5IHRoZSBtYXRjaCBleHByZXNzaW9ucwogICAgICogYXMgYXR0cmlidXRlcy4gSW5jbHVkZSBgKm5nU3dpdGNoRGVmYXVsdGAgYXMgdGhlIGZpbmFsIGNhc2UuCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8Y29udGFpbmVyLWVsZW1lbnQgW25nU3dpdGNoXT0ic3dpdGNoX2V4cHJlc3Npb24iPgogICAgICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaENhc2U9Im1hdGNoX2V4cHJlc3Npb25fMSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKiAgIC4uLgogICAgICogICA8c29tZS1lbGVtZW50ICpuZ1N3aXRjaERlZmF1bHQ+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKiA8L2NvbnRhaW5lci1lbGVtZW50PgogICAgICogYGBgCiAgICAgKgogICAgICogRWFjaCBzd2l0Y2gtY2FzZSBzdGF0ZW1lbnQgY29udGFpbnMgYW4gaW4tbGluZSBIVE1MIHRlbXBsYXRlIG9yIHRlbXBsYXRlIHJlZmVyZW5jZQogICAgICogdGhhdCBkZWZpbmVzIHRoZSBzdWJ0cmVlIHRvIGJlIHNlbGVjdGVkIGlmIHRoZSB2YWx1ZSBvZiB0aGUgbWF0Y2ggZXhwcmVzc2lvbgogICAgICogbWF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIHN3aXRjaCBleHByZXNzaW9uLgogICAgICoKICAgICAqIFVubGlrZSBKYXZhU2NyaXB0LCB3aGljaCB1c2VzIHN0cmljdCBlcXVhbGl0eSwgQW5ndWxhciB1c2VzIGxvb3NlIGVxdWFsaXR5LgogICAgICogVGhpcyBtZWFucyB0aGF0IHRoZSBlbXB0eSBzdHJpbmcsIGAiImAgbWF0Y2hlcyAwLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAc2VlIGBOZ1N3aXRjaGAKICAgICAqIEBzZWUgYE5nU3dpdGNoRGVmYXVsdGAKICAgICAqCiAgICAgKi8KICAgIGNsYXNzIE5nU3dpdGNoQ2FzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogICAgICAgICAqIEBwYXJhbSB7P30gbmdTd2l0Y2gKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyLCB0ZW1wbGF0ZVJlZiwgbmdTd2l0Y2gpIHsKICAgICAgICAgICAgdGhpcy5uZ1N3aXRjaCA9IG5nU3dpdGNoOwogICAgICAgICAgICBuZ1N3aXRjaC5fYWRkQ2FzZSgpOwogICAgICAgICAgICB0aGlzLl92aWV3ID0gbmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyBjYXNlIG1hdGNoaW5nLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXcuZW5mb3JjZVN0YXRlKHRoaXMubmdTd2l0Y2guX21hdGNoQ2FzZSh0aGlzLm5nU3dpdGNoQ2FzZSkpOwogICAgICAgIH0KICAgIH0KICAgIE5nU3dpdGNoQ2FzZS7JtWZhYyA9IGZ1bmN0aW9uIE5nU3dpdGNoQ2FzZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ1N3aXRjaENhc2UpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nU3dpdGNoLCAxKSk7IH07CiAgICBOZ1N3aXRjaENhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTd2l0Y2hDYXNlLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1N3aXRjaENhc2UiLCAiIl1dLCBpbnB1dHM6IHsgbmdTd2l0Y2hDYXNlOiAibmdTd2l0Y2hDYXNlIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ1N3aXRjaENhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICAgICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9LAogICAgICAgIHsgdHlwZTogTmdTd2l0Y2gsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEhvc3QgfV0gfQogICAgXTsKICAgIE5nU3dpdGNoQ2FzZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBuZ1N3aXRjaENhc2U6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICoKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBDcmVhdGVzIGEgdmlldyB0aGF0IGlzIHJlbmRlcmVkIHdoZW4gbm8gYE5nU3dpdGNoQ2FzZWAgZXhwcmVzc2lvbnMKICAgICAqIG1hdGNoIHRoZSBgTmdTd2l0Y2hgIGV4cHJlc3Npb24uCiAgICAgKiBUaGlzIHN0YXRlbWVudCBzaG91bGQgYmUgdGhlIGZpbmFsIGNhc2UgaW4gYW4gYE5nU3dpdGNoYC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHNlZSBgTmdTd2l0Y2hgCiAgICAgKiBAc2VlIGBOZ1N3aXRjaENhc2VgCiAgICAgKgogICAgICovCiAgICBjbGFzcyBOZ1N3aXRjaERlZmF1bHQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lcgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGVSZWYKICAgICAgICAgKiBAcGFyYW0gez99IG5nU3dpdGNoCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iodmlld0NvbnRhaW5lciwgdGVtcGxhdGVSZWYsIG5nU3dpdGNoKSB7CiAgICAgICAgICAgIG5nU3dpdGNoLl9hZGREZWZhdWx0KG5ldyBTd2l0Y2hWaWV3KHZpZXdDb250YWluZXIsIHRlbXBsYXRlUmVmKSk7CiAgICAgICAgfQogICAgfQogICAgTmdTd2l0Y2hEZWZhdWx0Lsm1ZmFjID0gZnVuY3Rpb24gTmdTd2l0Y2hEZWZhdWx0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nU3dpdGNoRGVmYXVsdCkoybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdTd2l0Y2gsIDEpKTsgfTsKICAgIE5nU3dpdGNoRGVmYXVsdC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1N3aXRjaERlZmF1bHQsIHNlbGVjdG9yczogW1siIiwgIm5nU3dpdGNoRGVmYXVsdCIsICIiXV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE5nU3dpdGNoRGVmYXVsdC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICAgICAgeyB0eXBlOiBOZ1N3aXRjaCwgZGVjb3JhdG9yczogW3sgdHlwZTogSG9zdCB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9kaXJlY3RpdmVzL25nX3BsdXJhbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBgYGAKICAgICAqIDxzb21lLWVsZW1lbnQgW25nUGx1cmFsXT0idmFsdWUiPgogICAgICogICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPSI9MCI+dGhlcmUgaXMgbm90aGluZzwvbmctdGVtcGxhdGU+CiAgICAgKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9Ij0xIj50aGVyZSBpcyBvbmU8L25nLXRlbXBsYXRlPgogICAgICogICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPSJmZXciPnRoZXJlIGFyZSBhIGZldzwvbmctdGVtcGxhdGU+CiAgICAgKiA8L3NvbWUtZWxlbWVudD4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBBZGRzIC8gcmVtb3ZlcyBET00gc3ViLXRyZWVzIGJhc2VkIG9uIGEgbnVtZXJpYyB2YWx1ZS4gVGFpbG9yZWQgZm9yIHBsdXJhbGl6YXRpb24uCiAgICAgKgogICAgICogRGlzcGxheXMgRE9NIHN1Yi10cmVlcyB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbiB2YWx1ZSwgb3IgZmFpbGluZyB0aGF0LCBET00gc3ViLXRyZWVzCiAgICAgKiB0aGF0IG1hdGNoIHRoZSBzd2l0Y2ggZXhwcmVzc2lvbidzIHBsdXJhbGl6YXRpb24gY2F0ZWdvcnkuCiAgICAgKgogICAgICogVG8gdXNlIHRoaXMgZGlyZWN0aXZlIHlvdSBtdXN0IHByb3ZpZGUgYSBjb250YWluZXIgZWxlbWVudCB0aGF0IHNldHMgdGhlIGBbbmdQbHVyYWxdYCBhdHRyaWJ1dGUKICAgICAqIHRvIGEgc3dpdGNoIGV4cHJlc3Npb24uIElubmVyIGVsZW1lbnRzIHdpdGggYSBgW25nUGx1cmFsQ2FzZV1gIHdpbGwgZGlzcGxheSBiYXNlZCBvbiB0aGVpcgogICAgICogZXhwcmVzc2lvbjoKICAgICAqIC0gaWYgYFtuZ1BsdXJhbENhc2VdYCBpcyBzZXQgdG8gYSB2YWx1ZSBzdGFydGluZyB3aXRoIGA9YCwgaXQgd2lsbCBvbmx5IGRpc3BsYXkgaWYgdGhlIHZhbHVlCiAgICAgKiAgIG1hdGNoZXMgdGhlIHN3aXRjaCBleHByZXNzaW9uIGV4YWN0bHksCiAgICAgKiAtIG90aGVyd2lzZSwgdGhlIHZpZXcgd2lsbCBiZSB0cmVhdGVkIGFzIGEgImNhdGVnb3J5IG1hdGNoIiwgYW5kIHdpbGwgb25seSBkaXNwbGF5IGlmIGV4YWN0CiAgICAgKiAgIHZhbHVlIG1hdGNoZXMgYXJlbid0IGZvdW5kIGFuZCB0aGUgdmFsdWUgbWFwcyB0byBpdHMgY2F0ZWdvcnkgZm9yIHRoZSBkZWZpbmVkIGxvY2FsZS4KICAgICAqCiAgICAgKiBTZWUgaHR0cDovL2NsZHIudW5pY29kZS5vcmcvaW5kZXgvY2xkci1zcGVjL3BsdXJhbC1ydWxlcwogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIE5nUGx1cmFsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9sb2NhbGl6YXRpb24KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfbG9jYWxpemF0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbiA9IF9sb2NhbGl6YXRpb247CiAgICAgICAgICAgIHRoaXMuX2Nhc2VWaWV3cyA9IHt9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbmdQbHVyYWwodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fc3dpdGNoVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmlldygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSBzd2l0Y2hWaWV3CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRDYXNlKHZhbHVlLCBzd2l0Y2hWaWV3KSB7CiAgICAgICAgICAgIHRoaXMuX2Nhc2VWaWV3c1t2YWx1ZV0gPSBzd2l0Y2hWaWV3OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVZpZXcoKSB7CiAgICAgICAgICAgIHRoaXMuX2NsZWFyVmlld3MoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYXNlcyA9IE9iamVjdC5rZXlzKHRoaXMuX2Nhc2VWaWV3cyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5ID0gZ2V0UGx1cmFsQ2F0ZWdvcnkodGhpcy5fc3dpdGNoVmFsdWUsIGNhc2VzLCB0aGlzLl9sb2NhbGl6YXRpb24pOwogICAgICAgICAgICB0aGlzLl9hY3RpdmF0ZVZpZXcodGhpcy5fY2FzZVZpZXdzW2tleV0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NsZWFyVmlld3MoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hY3RpdmVWaWV3KQogICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlVmlldy5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWN0aXZhdGVWaWV3KHZpZXcpIHsKICAgICAgICAgICAgaWYgKHZpZXcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVZpZXcgPSB2aWV3OwogICAgICAgICAgICAgICAgdGhpcy5fYWN0aXZlVmlldy5jcmVhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE5nUGx1cmFsLsm1ZmFjID0gZnVuY3Rpb24gTmdQbHVyYWxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdQbHVyYWwpKMm1ybVkaXJlY3RpdmVJbmplY3QoTmdMb2NhbGl6YXRpb24pKTsgfTsKICAgIE5nUGx1cmFsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nUGx1cmFsLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1BsdXJhbCIsICIiXV0sIGlucHV0czogeyBuZ1BsdXJhbDogIm5nUGx1cmFsIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ1BsdXJhbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE5nTG9jYWxpemF0aW9uIH0KICAgIF07CiAgICBOZ1BsdXJhbC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBuZ1BsdXJhbDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIENyZWF0ZXMgYSB2aWV3IHRoYXQgd2lsbCBiZSBhZGRlZC9yZW1vdmVkIGZyb20gdGhlIHBhcmVudCB7XEBsaW5rIE5nUGx1cmFsfSB3aGVuIHRoZQogICAgICogZ2l2ZW4gZXhwcmVzc2lvbiBtYXRjaGVzIHRoZSBwbHVyYWwgZXhwcmVzc2lvbiBhY2NvcmRpbmcgdG8gQ0xEUiBydWxlcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIGBgYAogICAgICogPHNvbWUtZWxlbWVudCBbbmdQbHVyYWxdPSJ2YWx1ZSI+CiAgICAgKiAgIDxuZy10ZW1wbGF0ZSBuZ1BsdXJhbENhc2U9Ij0wIj4uLi48L25nLXRlbXBsYXRlPgogICAgICogICA8bmctdGVtcGxhdGUgbmdQbHVyYWxDYXNlPSJvdGhlciI+Li4uPC9uZy10ZW1wbGF0ZT4KICAgICAqIDwvc29tZS1lbGVtZW50PgogICAgICogYGBgCiAgICAgKgogICAgICogU2VlIHtcQGxpbmsgTmdQbHVyYWx9IGZvciBtb3JlIGRldGFpbHMgYW5kIGV4YW1wbGUuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTmdQbHVyYWxDYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lcgogICAgICAgICAqIEBwYXJhbSB7P30gbmdQbHVyYWwKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih2YWx1ZSwgdGVtcGxhdGUsIHZpZXdDb250YWluZXIsIG5nUGx1cmFsKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0FOdW1iZXIgPSAhaXNOYU4oTnVtYmVyKHZhbHVlKSk7CiAgICAgICAgICAgIG5nUGx1cmFsLmFkZENhc2UoaXNBTnVtYmVyID8gYD0ke3ZhbHVlfWAgOiB2YWx1ZSwgbmV3IFN3aXRjaFZpZXcodmlld0NvbnRhaW5lciwgdGVtcGxhdGUpKTsKICAgICAgICB9CiAgICB9CiAgICBOZ1BsdXJhbENhc2UuybVmYWMgPSBmdW5jdGlvbiBOZ1BsdXJhbENhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdQbHVyYWxDYXNlKSjJtcm1aW5qZWN0QXR0cmlidXRlKCduZ1BsdXJhbENhc2UnKSwgybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdQbHVyYWwsIDEpKTsgfTsKICAgIE5nUGx1cmFsQ2FzZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1BsdXJhbENhc2UsIHNlbGVjdG9yczogW1siIiwgIm5nUGx1cmFsQ2FzZSIsICIiXV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE5nUGx1cmFsQ2FzZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogQXR0cmlidXRlLCBhcmdzOiBbJ25nUGx1cmFsQ2FzZScsXSB9XSB9LAogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSwKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nUGx1cmFsLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL2RpcmVjdGl2ZXMvbmdfc3R5bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqIFNldCB0aGUgZm9udCBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50IHRvIHRoZSByZXN1bHQgb2YgYW4gZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPSJ7J2ZvbnQtc3R5bGUnOiBzdHlsZUV4cH0iPi4uLjwvc29tZS1lbGVtZW50PgogICAgICogYGBgCiAgICAgKgogICAgICogU2V0IHRoZSB3aWR0aCBvZiB0aGUgY29udGFpbmluZyBlbGVtZW50IHRvIGEgcGl4ZWwgdmFsdWUgcmV0dXJuZWQgYnkgYW4gZXhwcmVzc2lvbi4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIDxzb21lLWVsZW1lbnQgW25nU3R5bGVdPSJ7J21heC13aWR0aC5weCc6IHdpZHRoRXhwfSI+Li4uPC9zb21lLWVsZW1lbnQ+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBTZXQgYSBjb2xsZWN0aW9uIG9mIHN0eWxlIHZhbHVlcyB1c2luZyBhbiBleHByZXNzaW9uIHRoYXQgcmV0dXJucyBrZXktdmFsdWUgcGFpcnMuCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8c29tZS1lbGVtZW50IFtuZ1N0eWxlXT0ib2JqRXhwIj4uLi48L3NvbWUtZWxlbWVudD4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBBbiBhdHRyaWJ1dGUgZGlyZWN0aXZlIHRoYXQgdXBkYXRlcyBzdHlsZXMgZm9yIHRoZSBjb250YWluaW5nIEhUTUwgZWxlbWVudC4KICAgICAqIFNldHMgb25lIG9yIG1vcmUgc3R5bGUgcHJvcGVydGllcywgc3BlY2lmaWVkIGFzIGNvbG9uLXNlcGFyYXRlZCBrZXktdmFsdWUgcGFpcnMuCiAgICAgKiBUaGUga2V5IGlzIGEgc3R5bGUgbmFtZSwgd2l0aCBhbiBvcHRpb25hbCBgLjx1bml0PmAgc3VmZml4CiAgICAgKiAoc3VjaCBhcyAndG9wLnB4JywgJ2ZvbnQtc3R5bGUuZW0nKS4KICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBleHByZXNzaW9uIHRvIGJlIGV2YWx1YXRlZC4KICAgICAqIFRoZSByZXN1bHRpbmcgbm9uLW51bGwgdmFsdWUsIGV4cHJlc3NlZCBpbiB0aGUgZ2l2ZW4gdW5pdCwKICAgICAqIGlzIGFzc2lnbmVkIHRvIHRoZSBnaXZlbiBzdHlsZSBwcm9wZXJ0eS4KICAgICAqIElmIHRoZSByZXN1bHQgb2YgZXZhbHVhdGlvbiBpcyBudWxsLCB0aGUgY29ycmVzcG9uZGluZyBzdHlsZSBpcyByZW1vdmVkLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIE5nU3R5bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX25nRWwKICAgICAgICAgKiBAcGFyYW0gez99IF9kaWZmZXJzCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfbmdFbCwgX2RpZmZlcnMsIF9yZW5kZXJlcikgewogICAgICAgICAgICB0aGlzLl9uZ0VsID0gX25nRWw7CiAgICAgICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVyczsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgICAgIHRoaXMuX25nU3R5bGUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9kaWZmZXIgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG5nU3R5bGUodmFsdWVzKSB7CiAgICAgICAgICAgIHRoaXMuX25nU3R5bGUgPSB2YWx1ZXM7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGlmZmVyICYmIHZhbHVlcykgewogICAgICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHZhbHVlcykuY3JlYXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kaWZmZXIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZigoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbmdTdHlsZSkpKTsKICAgICAgICAgICAgICAgIGlmIChjaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlDaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lQW5kVW5pdAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRTdHlsZShuYW1lQW5kVW5pdCwgdmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgW25hbWUsIHVuaXRdID0gbmFtZUFuZFVuaXQuc3BsaXQoJy4nKTsKICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAhPSBudWxsICYmIHVuaXQgPyBgJHt2YWx1ZX0ke3VuaXR9YCA6IHZhbHVlOwogICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0U3R5bGUodGhpcy5fbmdFbC5uYXRpdmVFbGVtZW50LCBuYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5yZW1vdmVTdHlsZSh0aGlzLl9uZ0VsLm5hdGl2ZUVsZW1lbnQsIG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlDaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlY29yZCkgPT4gdGhpcy5fc2V0U3R5bGUocmVjb3JkLmtleSwgbnVsbCkpKTsKICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoQWRkZWRJdGVtKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZWNvcmQpID0+IHRoaXMuX3NldFN0eWxlKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpKSk7CiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaENoYW5nZWRJdGVtKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZWNvcmQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZWNvcmQpID0+IHRoaXMuX3NldFN0eWxlKHJlY29yZC5rZXksIHJlY29yZC5jdXJyZW50VmFsdWUpKSk7CiAgICAgICAgfQogICAgfQogICAgTmdTdHlsZS7JtWZhYyA9IGZ1bmN0aW9uIE5nU3R5bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTdHlsZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChLZXlWYWx1ZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMikpOyB9OwogICAgTmdTdHlsZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1N0eWxlLCBzZWxlY3RvcnM6IFtbIiIsICJuZ1N0eWxlIiwgIiJdXSwgaW5wdXRzOiB7IG5nU3R5bGU6ICJuZ1N0eWxlIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ1N0eWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogS2V5VmFsdWVEaWZmZXJzIH0sCiAgICAgICAgeyB0eXBlOiBSZW5kZXJlcjIgfQogICAgXTsKICAgIE5nU3R5bGUucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmdTdHlsZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdTdHlsZScsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvZGlyZWN0aXZlcy9uZ190ZW1wbGF0ZV9vdXRsZXQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICoKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBJbnNlcnRzIGFuIGVtYmVkZGVkIHZpZXcgZnJvbSBhIHByZXBhcmVkIGBUZW1wbGF0ZVJlZmAuCiAgICAgKgogICAgICogWW91IGNhbiBhdHRhY2ggYSBjb250ZXh0IG9iamVjdCB0byB0aGUgYEVtYmVkZGVkVmlld1JlZmAgYnkgc2V0dGluZyBgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XWAuCiAgICAgKiBgW25nVGVtcGxhdGVPdXRsZXRDb250ZXh0XWAgc2hvdWxkIGJlIGFuIG9iamVjdCwgdGhlIG9iamVjdCdzIGtleXMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGJpbmRpbmcKICAgICAqIGJ5IHRoZSBsb2NhbCB0ZW1wbGF0ZSBgbGV0YCBkZWNsYXJhdGlvbnMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBgYGAKICAgICAqIDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9InRlbXBsYXRlUmVmRXhwOyBjb250ZXh0OiBjb250ZXh0RXhwIj48L25nLWNvbnRhaW5lcj4KICAgICAqIGBgYAogICAgICoKICAgICAqIFVzaW5nIHRoZSBrZXkgYCRpbXBsaWNpdGAgaW4gdGhlIGNvbnRleHQgb2JqZWN0IHdpbGwgc2V0IGl0cyB2YWx1ZSBhcyBkZWZhdWx0LgogICAgICoKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vbmdUZW1wbGF0ZU91dGxldC90cy9tb2R1bGUudHMgcmVnaW9uPSdOZ1RlbXBsYXRlT3V0bGV0J30KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBOZ1RlbXBsYXRlT3V0bGV0IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyUmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICB0aGlzLl92aWV3UmVmID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEEgY29udGV4dCBvYmplY3QgdG8gYXR0YWNoIHRvIHRoZSB7XEBsaW5rIEVtYmVkZGVkVmlld1JlZn0uIFRoaXMgc2hvdWxkIGJlIGFuCiAgICAgICAgICAgICAqIG9iamVjdCwgdGhlIG9iamVjdCdzIGtleXMgd2lsbCBiZSBhdmFpbGFibGUgZm9yIGJpbmRpbmcgYnkgdGhlIGxvY2FsIHRlbXBsYXRlIGBsZXRgCiAgICAgICAgICAgICAqIGRlY2xhcmF0aW9ucy4KICAgICAgICAgICAgICogVXNpbmcgdGhlIGtleSBgJGltcGxpY2l0YCBpbiB0aGUgY29udGV4dCBvYmplY3Qgd2lsbCBzZXQgaXRzIHZhbHVlIGFzIGRlZmF1bHQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0ID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEEgc3RyaW5nIGRlZmluaW5nIHRoZSB0ZW1wbGF0ZSByZWZlcmVuY2UgYW5kIG9wdGlvbmFsbHkgdGhlIGNvbnRleHQgb2JqZWN0IGZvciB0aGUgdGVtcGxhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm5nVGVtcGxhdGVPdXRsZXQgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWNyZWF0ZVZpZXcgPSB0aGlzLl9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcyk7CiAgICAgICAgICAgIGlmIChyZWNyZWF0ZVZpZXcpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZpZXdDb250YWluZXJSZWYgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdSZWYpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29udGFpbmVyUmVmLnJlbW92ZSh2aWV3Q29udGFpbmVyUmVmLmluZGV4T2YodGhpcy5fdmlld1JlZikpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fdmlld1JlZiA9IHRoaXMubmdUZW1wbGF0ZU91dGxldCA/CiAgICAgICAgICAgICAgICAgICAgdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5uZ1RlbXBsYXRlT3V0bGV0LCB0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KSA6CiAgICAgICAgICAgICAgICAgICAgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl92aWV3UmVmICYmIHRoaXMubmdUZW1wbGF0ZU91dGxldENvbnRleHQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUV4aXN0aW5nQ29udGV4dCh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXZSBuZWVkIHRvIHJlLWNyZWF0ZSBleGlzdGluZyBlbWJlZGRlZCB2aWV3IGlmOgogICAgICAgICAqIC0gdGVtcGxhdGVSZWYgaGFzIGNoYW5nZWQKICAgICAgICAgKiAtIGNvbnRleHQgaGFzIGNoYW5nZXMKICAgICAgICAgKgogICAgICAgICAqIFdlIG1hcmsgY29udGV4dCBvYmplY3QgYXMgY2hhbmdlZCB3aGVuIHRoZSBjb3JyZXNwb25kaW5nIG9iamVjdAogICAgICAgICAqIHNoYXBlIGNoYW5nZXMgKG5ldyBwcm9wZXJ0aWVzIGFyZSBhZGRlZCBvciBleGlzdGluZyBwcm9wZXJ0aWVzIGFyZSByZW1vdmVkKS4KICAgICAgICAgKiBJbiBvdGhlciB3b3JkcyB3ZSBjb25zaWRlciBjb250ZXh0IHdpdGggdGhlIHNhbWUgcHJvcGVydGllcyBhcyAidGhlIHNhbWUiIGV2ZW4KICAgICAgICAgKiBpZiBvYmplY3QgcmVmZXJlbmNlIGNoYW5nZXMgKHNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xMzQwNykuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zaG91bGRSZWNyZWF0ZVZpZXcoY2hhbmdlcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN0eENoYW5nZSA9IGNoYW5nZXNbJ25nVGVtcGxhdGVPdXRsZXRDb250ZXh0J107CiAgICAgICAgICAgIHJldHVybiAhIWNoYW5nZXNbJ25nVGVtcGxhdGVPdXRsZXQnXSB8fCAoY3R4Q2hhbmdlICYmIHRoaXMuX2hhc0NvbnRleHRTaGFwZUNoYW5nZWQoY3R4Q2hhbmdlKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjdHhDaGFuZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYXNDb250ZXh0U2hhcGVDaGFuZ2VkKGN0eENoYW5nZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLnByZXZpb3VzVmFsdWUgfHwge30pOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJDdHhLZXlzID0gT2JqZWN0LmtleXMoY3R4Q2hhbmdlLmN1cnJlbnRWYWx1ZSB8fCB7fSk7CiAgICAgICAgICAgIGlmIChwcmV2Q3R4S2V5cy5sZW5ndGggPT09IGN1cnJDdHhLZXlzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgb2YgY3VyckN0eEtleXMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocHJldkN0eEtleXMuaW5kZXhPZihwcm9wTmFtZSkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGN0eAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZUV4aXN0aW5nQ29udGV4dChjdHgpIHsKICAgICAgICAgICAgZm9yIChsZXQgcHJvcE5hbWUgb2YgT2JqZWN0LmtleXMoY3R4KSkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdmlld1JlZikpLmNvbnRleHQpKSlbcHJvcE5hbWVdID0gKCgvKiogQHR5cGUgez99ICovICh0aGlzLm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0KSkpW3Byb3BOYW1lXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE5nVGVtcGxhdGVPdXRsZXQuybVmYWMgPSBmdW5jdGlvbiBOZ1RlbXBsYXRlT3V0bGV0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nVGVtcGxhdGVPdXRsZXQpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZikpOyB9OwogICAgTmdUZW1wbGF0ZU91dGxldC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ1RlbXBsYXRlT3V0bGV0LCBzZWxlY3RvcnM6IFtbIiIsICJuZ1RlbXBsYXRlT3V0bGV0IiwgIiJdXSwgaW5wdXRzOiB7IG5nVGVtcGxhdGVPdXRsZXRDb250ZXh0OiAibmdUZW1wbGF0ZU91dGxldENvbnRleHQiLCBuZ1RlbXBsYXRlT3V0bGV0OiAibmdUZW1wbGF0ZU91dGxldCIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTmdUZW1wbGF0ZU91dGxldC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfQogICAgXTsKICAgIE5nVGVtcGxhdGVPdXRsZXQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmdUZW1wbGF0ZU91dGxldENvbnRleHQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG5nVGVtcGxhdGVPdXRsZXQ6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9pbnZhbGlkX3BpcGVfYXJndW1lbnRfZXJyb3IudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGludmFsaWRQaXBlQXJndW1lbnRFcnJvcih0eXBlLCB2YWx1ZSkgewogICAgICAgIHJldHVybiBFcnJvcihgSW52YWxpZFBpcGVBcmd1bWVudDogJyR7dmFsdWV9JyBmb3IgcGlwZSAnJHtzdHJpbmdpZnkodHlwZSl9J2ApOwogICAgfQogICAgY2xhc3MgT2JzZXJ2YWJsZVN0cmF0ZWd5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jCiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jLCB1cGRhdGVMYXRlc3RWYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gYXN5bmMuc3Vic2NyaWJlKHsKICAgICAgICAgICAgICAgIG5leHQ6IHVwZGF0ZUxhdGVzdFZhbHVlLAogICAgICAgICAgICAgICAgZXJyb3I6ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGUpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBlOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNwb3NlKHN1YnNjcmlwdGlvbikgewogICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdWJzY3JpcHRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRGVzdHJveShzdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUHJvbWlzZVN0cmF0ZWd5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jCiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVMYXRlc3RWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlU3Vic2NyaXB0aW9uKGFzeW5jLCB1cGRhdGVMYXRlc3RWYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gYXN5bmMudGhlbih1cGRhdGVMYXRlc3RWYWx1ZSwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGUgPT4gewogICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN1YnNjcmlwdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzcG9zZShzdWJzY3JpcHRpb24pIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3Vic2NyaXB0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRlc3Ryb3koc3Vic2NyaXB0aW9uKSB7IH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9wcm9taXNlU3RyYXRlZ3kgPSBuZXcgUHJvbWlzZVN0cmF0ZWd5KCk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfb2JzZXJ2YWJsZVN0cmF0ZWd5ID0gbmV3IE9ic2VydmFibGVTdHJhdGVneSgpOwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIFVud3JhcHMgYSB2YWx1ZSBmcm9tIGFuIGFzeW5jaHJvbm91cyBwcmltaXRpdmUuCiAgICAgKgogICAgICogVGhlIGBhc3luY2AgcGlwZSBzdWJzY3JpYmVzIHRvIGFuIGBPYnNlcnZhYmxlYCBvciBgUHJvbWlzZWAgYW5kIHJldHVybnMgdGhlIGxhdGVzdCB2YWx1ZSBpdCBoYXMKICAgICAqIGVtaXR0ZWQuIFdoZW4gYSBuZXcgdmFsdWUgaXMgZW1pdHRlZCwgdGhlIGBhc3luY2AgcGlwZSBtYXJrcyB0aGUgY29tcG9uZW50IHRvIGJlIGNoZWNrZWQgZm9yCiAgICAgKiBjaGFuZ2VzLiBXaGVuIHRoZSBjb21wb25lbnQgZ2V0cyBkZXN0cm95ZWQsIHRoZSBgYXN5bmNgIHBpcGUgdW5zdWJzY3JpYmVzIGF1dG9tYXRpY2FsbHkgdG8gYXZvaWQKICAgICAqIHBvdGVudGlhbCBtZW1vcnkgbGVha3MuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIEV4YW1wbGVzCiAgICAgKgogICAgICogVGhpcyBleGFtcGxlIGJpbmRzIGEgYFByb21pc2VgIHRvIHRoZSB2aWV3LiBDbGlja2luZyB0aGUgYFJlc29sdmVgIGJ1dHRvbiByZXNvbHZlcyB0aGUKICAgICAqIHByb21pc2UuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvYXN5bmNfcGlwZS50cyByZWdpb249J0FzeW5jUGlwZVByb21pc2UnfQogICAgICoKICAgICAqIEl0J3MgYWxzbyBwb3NzaWJsZSB0byB1c2UgYGFzeW5jYCB3aXRoIE9ic2VydmFibGVzLiBUaGUgZXhhbXBsZSBiZWxvdyBiaW5kcyB0aGUgYHRpbWVgIE9ic2VydmFibGUKICAgICAqIHRvIHRoZSB2aWV3LiBUaGUgT2JzZXJ2YWJsZSBjb250aW51b3VzbHkgdXBkYXRlcyB0aGUgdmlldyB3aXRoIHRoZSBjdXJyZW50IHRpbWUuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvYXN5bmNfcGlwZS50cyByZWdpb249J0FzeW5jUGlwZU9ic2VydmFibGUnfQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEFzeW5jUGlwZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3JlZikgewogICAgICAgICAgICB0aGlzLl9yZWYgPSBfcmVmOwogICAgICAgICAgICB0aGlzLl9sYXRlc3RWYWx1ZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgICAgICB0aGlzLl9vYmogPSBudWxsOwogICAgICAgICAgICB0aGlzLl9zdHJhdGVneSA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG9iagogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtKG9iaikgewogICAgICAgICAgICBpZiAoIXRoaXMuX29iaikgewogICAgICAgICAgICAgICAgaWYgKG9iaikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZShvYmopOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvYmogIT09IHRoaXMuX29iaikgewogICAgICAgICAgICAgICAgdGhpcy5fZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhbnNmb3JtKCgvKiogQHR5cGUgez99ICovIChvYmopKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxvb3NlSWRlbnRpY2FsKHRoaXMuX2xhdGVzdFZhbHVlLCB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xhdGVzdFJldHVybmVkVmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbGF0ZXN0UmV0dXJuZWRWYWx1ZSA9IHRoaXMuX2xhdGVzdFZhbHVlOwogICAgICAgICAgICByZXR1cm4gV3JhcHBlZFZhbHVlLndyYXAodGhpcy5fbGF0ZXN0VmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3Vic2NyaWJlKG9iaikgewogICAgICAgICAgICB0aGlzLl9vYmogPSBvYmo7CiAgICAgICAgICAgIHRoaXMuX3N0cmF0ZWd5ID0gdGhpcy5fc2VsZWN0U3RyYXRlZ3kob2JqKTsKICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gdGhpcy5fc3RyYXRlZ3kuY3JlYXRlU3Vic2NyaXB0aW9uKG9iaiwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHRoaXMuX3VwZGF0ZUxhdGVzdFZhbHVlKG9iaiwgdmFsdWUpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvYmoKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZWxlY3RTdHJhdGVneShvYmopIHsKICAgICAgICAgICAgaWYgKGlzUHJvbWlzZSQxKG9iaikpIHsKICAgICAgICAgICAgICAgIHJldHVybiBfcHJvbWlzZVN0cmF0ZWd5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc09ic2VydmFibGUkMShvYmopKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX29ic2VydmFibGVTdHJhdGVneTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoQXN5bmNQaXBlLCBvYmopOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Rpc3Bvc2UoKSB7CiAgICAgICAgICAgIHRoaXMuX3N0cmF0ZWd5LmRpc3Bvc2UoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N1YnNjcmlwdGlvbikpKTsKICAgICAgICAgICAgdGhpcy5fbGF0ZXN0VmFsdWUgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9sYXRlc3RSZXR1cm5lZFZhbHVlID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fb2JqID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZUxhdGVzdFZhbHVlKGFzeW5jLCB2YWx1ZSkgewogICAgICAgICAgICBpZiAoYXN5bmMgPT09IHRoaXMuX29iaikgewogICAgICAgICAgICAgICAgdGhpcy5fbGF0ZXN0VmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEFzeW5jUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIEFzeW5jUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBc3luY1BpcGUpKMm1ybVpbmplY3RQaXBlQ2hhbmdlRGV0ZWN0b3JSZWYoKSk7IH07CiAgICBBc3luY1BpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAiYXN5bmMiLCB0eXBlOiBBc3luY1BpcGUsIHB1cmU6IGZhbHNlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBc3luY1BpcGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9jYXNlX2NvbnZlcnNpb25fcGlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIHRleHQgdG8gYWxsIGxvd2VyIGNhc2UuCiAgICAgKgogICAgICogQHNlZSBgVXBwZXJDYXNlUGlwZWAKICAgICAqIEBzZWUgYFRpdGxlQ2FzZVBpcGVgCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIHZpZXcgdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8gZW50ZXIKICAgICAqIHRleHQsIGFuZCB0aGVuIHVzZXMgdGhlIHBpcGUgdG8gY29udmVydCB0aGUgaW5wdXQgdGV4dCB0byBhbGwgbG93ZXIgY2FzZS4KICAgICAqCiAgICAgKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvbW1vbi9waXBlcy90cy9sb3dlcnVwcGVyX3BpcGUudHMiIHJlZ2lvbj0nTG93ZXJVcHBlclBpcGUnPjwvY29kZS1leGFtcGxlPgogICAgICoKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBMb3dlckNhc2VQaXBlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBzdHJpbmcgdG8gdHJhbnNmb3JtIHRvIGxvd2VyIGNhc2UuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmFuc2Zvcm0odmFsdWUpIHsKICAgICAgICAgICAgaWYgKCF2YWx1ZSkKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihMb3dlckNhc2VQaXBlLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgfQogICAgfQogICAgTG93ZXJDYXNlUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIExvd2VyQ2FzZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTG93ZXJDYXNlUGlwZSkoKTsgfTsKICAgIExvd2VyQ2FzZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAibG93ZXJjYXNlIiwgdHlwZTogTG93ZXJDYXNlUGlwZSwgcHVyZTogdHJ1ZSB9KTsKICAgIC8vCiAgICAvLyBSZWdleCBiZWxvdyBtYXRjaGVzIGFueSBVbmljb2RlIHdvcmQgYW5kIGNvbXBhdGlibGUgd2l0aCBFUzUuIEluIEVTMjAxOCB0aGUgc2FtZSByZXN1bHQKICAgIC8vIGNhbiBiZSBhY2hpZXZlZCBieSB1c2luZyAvXHB7TH1cUyovZ3UgYW5kIGFsc28ga25vd24gYXMgVW5pY29kZSBQcm9wZXJ0eSBFc2NhcGVzCiAgICAvLyAoaHR0cDovLzJhbGl0eS5jb20vMjAxNy8wNy9yZWdleHAtdW5pY29kZS1wcm9wZXJ0eS1lc2NhcGVzLmh0bWwpLiBTaW5jZSB0aGVyZSBpcyBubwogICAgLy8gdHJhbnNwaWxhdGlvbiBvZiB0aGlzIGZ1bmN0aW9uYWxpdHkgZG93biB0byBFUzUgd2l0aG91dCBleHRlcm5hbCB0b29sLCB0aGUgb25seSBzb2x1dGlvbiBpcwogICAgLy8gdG8gdXNlIGFscmVhZHkgdHJhbnNwaWxlZCBmb3JtLiBFeGFtcGxlIGNhbiBiZSBmb3VuZCBoZXJlIC0KICAgIC8vIGh0dHBzOi8vbW90aGVyZWZmLmluL3JlZ2V4cHUjaW5wdXQ9dmFyK3JlZ2V4KyUzRCsvJTVDcCU3QkwlN0QvdSUzQiZ1bmljb2RlUHJvcGVydHlFc2NhcGU9MQogICAgLy8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHVuaWNvZGVXb3JkTWF0Y2ggPSAvKD86W0EtWmEtelx4QUFceEI1XHhCQVx4QzAtXHhENlx4RDgtXHhGNlx4RjgtXHUwMkMxXHUwMkM2LVx1MDJEMVx1MDJFMC1cdTAyRTRcdTAyRUNcdTAyRUVcdTAzNzAtXHUwMzc0XHUwMzc2XHUwMzc3XHUwMzdBLVx1MDM3RFx1MDM3Rlx1MDM4Nlx1MDM4OC1cdTAzOEFcdTAzOENcdTAzOEUtXHUwM0ExXHUwM0EzLVx1MDNGNVx1MDNGNy1cdTA0ODFcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1RDAtXHUwNUVBXHUwNUYwLVx1MDVGMlx1MDYyMC1cdTA2NEFcdTA2NkVcdTA2NkZcdTA2NzEtXHUwNkQzXHUwNkQ1XHUwNkU1XHUwNkU2XHUwNkVFXHUwNkVGXHUwNkZBLVx1MDZGQ1x1MDZGRlx1MDcxMFx1MDcxMi1cdTA3MkZcdTA3NEQtXHUwN0E1XHUwN0IxXHUwN0NBLVx1MDdFQVx1MDdGNFx1MDdGNVx1MDdGQVx1MDgwMC1cdTA4MTVcdTA4MUFcdTA4MjRcdTA4MjhcdTA4NDAtXHUwODU4XHUwODYwLVx1MDg2QVx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTA5RkNcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkYxLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRCXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjFcdTFDRjVcdTFDRjZcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE4M1x1MjE4NFx1MkMwMC1cdTJDMkVcdTJDMzAtXHUyQzVFXHUyQzYwLVx1MkNFNFx1MkNFQi1cdTJDRUVcdTJDRjJcdTJDRjNcdTJEMDAtXHUyRDI1XHUyRDI3XHUyRDJEXHUyRDMwLVx1MkQ2N1x1MkQ2Rlx1MkQ4MC1cdTJEOTZcdTJEQTAtXHUyREE2XHUyREE4LVx1MkRBRVx1MkRCMC1cdTJEQjZcdTJEQjgtXHUyREJFXHUyREMwLVx1MkRDNlx1MkRDOC1cdTJEQ0VcdTJERDAtXHUyREQ2XHUyREQ4LVx1MkRERVx1MkUyRlx1MzAwNVx1MzAwNlx1MzAzMS1cdTMwMzVcdTMwM0JcdTMwM0NcdTMwNDEtXHUzMDk2XHUzMDlELVx1MzA5Rlx1MzBBMS1cdTMwRkFcdTMwRkMtXHUzMEZGXHUzMTA1LVx1MzEyRVx1MzEzMS1cdTMxOEVcdTMxQTAtXHUzMUJBXHUzMUYwLVx1MzFGRlx1MzQwMC1cdTREQjVcdTRFMDAtXHU5RkVBXHVBMDAwLVx1QTQ4Q1x1QTREMC1cdUE0RkRcdUE1MDAtXHVBNjBDXHVBNjEwLVx1QTYxRlx1QTYyQVx1QTYyQlx1QTY0MC1cdUE2NkVcdUE2N0YtXHVBNjlEXHVBNkEwLVx1QTZFNVx1QTcxNy1cdUE3MUZcdUE3MjItXHVBNzg4XHVBNzhCLVx1QTdBRVx1QTdCMC1cdUE3QjdcdUE3RjctXHVBODAxXHVBODAzLVx1QTgwNVx1QTgwNy1cdUE4MEFcdUE4MEMtXHVBODIyXHVBODQwLVx1QTg3M1x1QTg4Mi1cdUE4QjNcdUE4RjItXHVBOEY3XHVBOEZCXHVBOEZEXHVBOTBBLVx1QTkyNVx1QTkzMC1cdUE5NDZcdUE5NjAtXHVBOTdDXHVBOTg0LVx1QTlCMlx1QTlDRlx1QTlFMC1cdUE5RTRcdUE5RTYtXHVBOUVGXHVBOUZBLVx1QTlGRVx1QUEwMC1cdUFBMjhcdUFBNDAtXHVBQTQyXHVBQTQ0LVx1QUE0Qlx1QUE2MC1cdUFBNzZcdUFBN0FcdUFBN0UtXHVBQUFGXHVBQUIxXHVBQUI1XHVBQUI2XHVBQUI5LVx1QUFCRFx1QUFDMFx1QUFDMlx1QUFEQi1cdUFBRERcdUFBRTAtXHVBQUVBXHVBQUYyLVx1QUFGNFx1QUIwMS1cdUFCMDZcdUFCMDktXHVBQjBFXHVBQjExLVx1QUIxNlx1QUIyMC1cdUFCMjZcdUFCMjgtXHVBQjJFXHVBQjMwLVx1QUI1QVx1QUI1Qy1cdUFCNjVcdUFCNzAtXHVBQkUyXHVBQzAwLVx1RDdBM1x1RDdCMC1cdUQ3QzZcdUQ3Q0ItXHVEN0ZCXHVGOTAwLVx1RkE2RFx1RkE3MC1cdUZBRDlcdUZCMDAtXHVGQjA2XHVGQjEzLVx1RkIxN1x1RkIxRFx1RkIxRi1cdUZCMjhcdUZCMkEtXHVGQjM2XHVGQjM4LVx1RkIzQ1x1RkIzRVx1RkI0MFx1RkI0MVx1RkI0M1x1RkI0NFx1RkI0Ni1cdUZCQjFcdUZCRDMtXHVGRDNEXHVGRDUwLVx1RkQ4Rlx1RkQ5Mi1cdUZEQzdcdUZERjAtXHVGREZCXHVGRTcwLVx1RkU3NFx1RkU3Ni1cdUZFRkNcdUZGMjEtXHVGRjNBXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDXXxcdUQ4MDBbXHVEQzAwLVx1REMwQlx1REMwRC1cdURDMjZcdURDMjgtXHVEQzNBXHVEQzNDXHVEQzNEXHVEQzNGLVx1REM0RFx1REM1MC1cdURDNURcdURDODAtXHVEQ0ZBXHVERTgwLVx1REU5Q1x1REVBMC1cdURFRDBcdURGMDAtXHVERjFGXHVERjJELVx1REY0MFx1REY0Mi1cdURGNDlcdURGNTAtXHVERjc1XHVERjgwLVx1REY5RFx1REZBMC1cdURGQzNcdURGQzgtXHVERkNGXXxcdUQ4MDFbXHVEQzAwLVx1REM5RFx1RENCMC1cdURDRDNcdURDRDgtXHVEQ0ZCXHVERDAwLVx1REQyN1x1REQzMC1cdURENjNcdURFMDAtXHVERjM2XHVERjQwLVx1REY1NVx1REY2MC1cdURGNjddfFx1RDgwMltcdURDMDAtXHVEQzA1XHVEQzA4XHVEQzBBLVx1REMzNVx1REMzN1x1REMzOFx1REMzQ1x1REMzRi1cdURDNTVcdURDNjAtXHVEQzc2XHVEQzgwLVx1REM5RVx1RENFMC1cdURDRjJcdURDRjRcdURDRjVcdUREMDAtXHVERDE1XHVERDIwLVx1REQzOVx1REQ4MC1cdUREQjdcdUREQkVcdUREQkZcdURFMDBcdURFMTAtXHVERTEzXHVERTE1LVx1REUxN1x1REUxOS1cdURFMzNcdURFNjAtXHVERTdDXHVERTgwLVx1REU5Q1x1REVDMC1cdURFQzdcdURFQzktXHVERUU0XHVERjAwLVx1REYzNVx1REY0MC1cdURGNTVcdURGNjAtXHVERjcyXHVERjgwLVx1REY5MV18XHVEODAzW1x1REMwMC1cdURDNDhcdURDODAtXHVEQ0IyXHVEQ0MwLVx1RENGMl18XHVEODA0W1x1REMwMy1cdURDMzdcdURDODMtXHVEQ0FGXHVEQ0QwLVx1RENFOFx1REQwMy1cdUREMjZcdURENTAtXHVERDcyXHVERDc2XHVERDgzLVx1RERCMlx1RERDMS1cdUREQzRcdUREREFcdURERENcdURFMDAtXHVERTExXHVERTEzLVx1REUyQlx1REU4MC1cdURFODZcdURFODhcdURFOEEtXHVERThEXHVERThGLVx1REU5RFx1REU5Ri1cdURFQThcdURFQjAtXHVERURFXHVERjA1LVx1REYwQ1x1REYwRlx1REYxMFx1REYxMy1cdURGMjhcdURGMkEtXHVERjMwXHVERjMyXHVERjMzXHVERjM1LVx1REYzOVx1REYzRFx1REY1MFx1REY1RC1cdURGNjFdfFx1RDgwNVtcdURDMDAtXHVEQzM0XHVEQzQ3LVx1REM0QVx1REM4MC1cdURDQUZcdURDQzRcdURDQzVcdURDQzdcdUREODAtXHVEREFFXHVEREQ4LVx1REREQlx1REUwMC1cdURFMkZcdURFNDRcdURFODAtXHVERUFBXHVERjAwLVx1REYxOV18XHVEODA2W1x1RENBMC1cdURDREZcdURDRkZcdURFMDBcdURFMEItXHVERTMyXHVERTNBXHVERTUwXHVERTVDLVx1REU4M1x1REU4Ni1cdURFODlcdURFQzAtXHVERUY4XXxcdUQ4MDdbXHVEQzAwLVx1REMwOFx1REMwQS1cdURDMkVcdURDNDBcdURDNzItXHVEQzhGXHVERDAwLVx1REQwNlx1REQwOFx1REQwOVx1REQwQi1cdUREMzBcdURENDZdfFx1RDgwOFtcdURDMDAtXHVERjk5XXxcdUQ4MDlbXHVEQzgwLVx1REQ0M118W1x1RDgwQ1x1RDgxQy1cdUQ4MjBcdUQ4NDAtXHVEODY4XHVEODZBLVx1RDg2Q1x1RDg2Ri1cdUQ4NzJcdUQ4NzQtXHVEODc5XVtcdURDMDAtXHVERkZGXXxcdUQ4MERbXHVEQzAwLVx1REMyRV18XHVEODExW1x1REMwMC1cdURFNDZdfFx1RDgxQVtcdURDMDAtXHVERTM4XHVERTQwLVx1REU1RVx1REVEMC1cdURFRURcdURGMDAtXHVERjJGXHVERjQwLVx1REY0M1x1REY2My1cdURGNzdcdURGN0QtXHVERjhGXXxcdUQ4MUJbXHVERjAwLVx1REY0NFx1REY1MFx1REY5My1cdURGOUZcdURGRTBcdURGRTFdfFx1RDgyMVtcdURDMDAtXHVERkVDXXxcdUQ4MjJbXHVEQzAwLVx1REVGMl18XHVEODJDW1x1REMwMC1cdUREMUVcdURENzAtXHVERUZCXXxcdUQ4MkZbXHVEQzAwLVx1REM2QVx1REM3MC1cdURDN0NcdURDODAtXHVEQzg4XHVEQzkwLVx1REM5OV18XHVEODM1W1x1REMwMC1cdURDNTRcdURDNTYtXHVEQzlDXHVEQzlFXHVEQzlGXHVEQ0EyXHVEQ0E1XHVEQ0E2XHVEQ0E5LVx1RENBQ1x1RENBRS1cdURDQjlcdURDQkJcdURDQkQtXHVEQ0MzXHVEQ0M1LVx1REQwNVx1REQwNy1cdUREMEFcdUREMEQtXHVERDE0XHVERDE2LVx1REQxQ1x1REQxRS1cdUREMzlcdUREM0ItXHVERDNFXHVERDQwLVx1REQ0NFx1REQ0Nlx1REQ0QS1cdURENTBcdURENTItXHVERUE1XHVERUE4LVx1REVDMFx1REVDMi1cdURFREFcdURFREMtXHVERUZBXHVERUZDLVx1REYxNFx1REYxNi1cdURGMzRcdURGMzYtXHVERjRFXHVERjUwLVx1REY2RVx1REY3MC1cdURGODhcdURGOEEtXHVERkE4XHVERkFBLVx1REZDMlx1REZDNC1cdURGQ0JdfFx1RDgzQVtcdURDMDAtXHVEQ0M0XHVERDAwLVx1REQ0M118XHVEODNCW1x1REUwMC1cdURFMDNcdURFMDUtXHVERTFGXHVERTIxXHVERTIyXHVERTI0XHVERTI3XHVERTI5LVx1REUzMlx1REUzNC1cdURFMzdcdURFMzlcdURFM0JcdURFNDJcdURFNDdcdURFNDlcdURFNEJcdURFNEQtXHVERTRGXHVERTUxXHVERTUyXHVERTU0XHVERTU3XHVERTU5XHVERTVCXHVERTVEXHVERTVGXHVERTYxXHVERTYyXHVERTY0XHVERTY3LVx1REU2QVx1REU2Qy1cdURFNzJcdURFNzQtXHVERTc3XHVERTc5LVx1REU3Q1x1REU3RVx1REU4MC1cdURFODlcdURFOEItXHVERTlCXHVERUExLVx1REVBM1x1REVBNS1cdURFQTlcdURFQUItXHVERUJCXXxcdUQ4NjlbXHVEQzAwLVx1REVENlx1REYwMC1cdURGRkZdfFx1RDg2RFtcdURDMDAtXHVERjM0XHVERjQwLVx1REZGRl18XHVEODZFW1x1REMwMC1cdURDMURcdURDMjAtXHVERkZGXXxcdUQ4NzNbXHVEQzAwLVx1REVBMVx1REVCMC1cdURGRkZdfFx1RDg3QVtcdURDMDAtXHVERkUwXXxcdUQ4N0VbXHVEQzAwLVx1REUxRF0pXFMqL2c7CiAgICAvKioKICAgICAqIFRyYW5zZm9ybXMgdGV4dCB0byB0aXRsZSBjYXNlLgogICAgICogQ2FwaXRhbGl6ZXMgdGhlIGZpcnN0IGxldHRlciBvZiBlYWNoIHdvcmQgYW5kIHRyYW5zZm9ybXMgdGhlCiAgICAgKiByZXN0IG9mIHRoZSB3b3JkIHRvIGxvd2VyIGNhc2UuCiAgICAgKiBXb3JkcyBhcmUgZGVsaW1pdGVkIGJ5IGFueSB3aGl0ZXNwYWNlIGNoYXJhY3Rlciwgc3VjaCBhcyBhIHNwYWNlLCB0YWIsIG9yIGxpbmUtZmVlZCBjaGFyYWN0ZXIuCiAgICAgKgogICAgICogQHNlZSBgTG93ZXJDYXNlUGlwZWAKICAgICAqIEBzZWUgYFVwcGVyQ2FzZVBpcGVgCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgdGhlIHJlc3VsdCBvZiB0cmFuc2Zvcm1pbmcgdmFyaW91cyBzdHJpbmdzIGludG8gdGl0bGUgY2FzZS4KICAgICAqCiAgICAgKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvbW1vbi9waXBlcy90cy90aXRsZWNhc2VfcGlwZS50cyIgcmVnaW9uPSdUaXRsZUNhc2VQaXBlJz48L2NvZGUtZXhhbXBsZT4KICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgVGl0bGVDYXNlUGlwZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHRyYW5zZm9ybSB0byB0aXRsZSBjYXNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICghdmFsdWUpCiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoVGl0bGVDYXNlUGlwZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS5yZXBsYWNlKHVuaWNvZGVXb3JkTWF0Y2gsICgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdHh0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0eHQgPT4gdHh0WzBdLnRvVXBwZXJDYXNlKCkgKyB0eHQuc3Vic3RyKDEpLnRvTG93ZXJDYXNlKCkpKSk7CiAgICAgICAgfQogICAgfQogICAgVGl0bGVDYXNlUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIFRpdGxlQ2FzZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGl0bGVDYXNlUGlwZSkoKTsgfTsKICAgIFRpdGxlQ2FzZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAidGl0bGVjYXNlIiwgdHlwZTogVGl0bGVDYXNlUGlwZSwgcHVyZTogdHJ1ZSB9KTsKICAgIC8qKgogICAgICogVHJhbnNmb3JtcyB0ZXh0IHRvIGFsbCB1cHBlciBjYXNlLgogICAgICogQHNlZSBgTG93ZXJDYXNlUGlwZWAKICAgICAqIEBzZWUgYFRpdGxlQ2FzZVBpcGVgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFVwcGVyQ2FzZVBpcGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHN0cmluZyB0byB0cmFuc2Zvcm0gdG8gdXBwZXIgY2FzZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYW5zZm9ybSh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIXZhbHVlKQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKFVwcGVyQ2FzZVBpcGUsIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdmFsdWUudG9VcHBlckNhc2UoKTsKICAgICAgICB9CiAgICB9CiAgICBVcHBlckNhc2VQaXBlLsm1ZmFjID0gZnVuY3Rpb24gVXBwZXJDYXNlUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBVcHBlckNhc2VQaXBlKSgpOyB9OwogICAgVXBwZXJDYXNlUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJ1cHBlcmNhc2UiLCB0eXBlOiBVcHBlckNhc2VQaXBlLCBwdXJlOiB0cnVlIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9kYXRlX3BpcGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIEZvcm1hdHMgYSBkYXRlIHZhbHVlIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMuCiAgICAgKgogICAgICogT25seSB0aGUgYGVuLVVTYCBsb2NhbGUgZGF0YSBjb21lcyB3aXRoIEFuZ3VsYXIuIFRvIGxvY2FsaXplIGRhdGVzCiAgICAgKiBpbiBhbm90aGVyIGxhbmd1YWdlLCB5b3UgbXVzdCBpbXBvcnQgdGhlIGNvcnJlc3BvbmRpbmcgbG9jYWxlIGRhdGEuCiAgICAgKiBTZWUgdGhlIFtJMThuIGd1aWRlXShndWlkZS9pMThuI2kxOG4tcGlwZXMpIGZvciBtb3JlIGluZm9ybWF0aW9uLgogICAgICoKICAgICAqIEBzZWUgYGZvcm1hdERhdGUoKWAKICAgICAqCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogVGhlIHJlc3VsdCBvZiB0aGlzIHBpcGUgaXMgbm90IHJlZXZhbHVhdGVkIHdoZW4gdGhlIGlucHV0IGlzIG11dGF0ZWQuIFRvIGF2b2lkIHRoZSBuZWVkIHRvCiAgICAgKiByZWZvcm1hdCB0aGUgZGF0ZSBvbiBldmVyeSBjaGFuZ2UtZGV0ZWN0aW9uIGN5Y2xlLCB0cmVhdCB0aGUgZGF0ZSBhcyBhbiBpbW11dGFibGUgb2JqZWN0CiAgICAgKiBhbmQgY2hhbmdlIHRoZSByZWZlcmVuY2Ugd2hlbiB0aGUgcGlwZSBuZWVkcyB0byBydW4gYWdhaW4uCiAgICAgKgogICAgICogIyMjIFByZS1kZWZpbmVkIGZvcm1hdCBvcHRpb25zCiAgICAgKgogICAgICogRXhhbXBsZXMgYXJlIGdpdmVuIGluIGBlbi1VU2AgbG9jYWxlLgogICAgICoKICAgICAqIC0gYCdzaG9ydCdgOiBlcXVpdmFsZW50IHRvIGAnTS9kL3l5LCBoOm1tIGEnYCAoYDYvMTUvMTUsIDk6MDMgQU1gKS4KICAgICAqIC0gYCdtZWRpdW0nYDogZXF1aXZhbGVudCB0byBgJ01NTSBkLCB5LCBoOm1tOnNzIGEnYCAoYEp1biAxNSwgMjAxNSwgOTowMzowMSBBTWApLgogICAgICogLSBgJ2xvbmcnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSwgaDptbTpzcyBhIHonYCAoYEp1bmUgMTUsIDIwMTUgYXQgOTowMzowMSBBTQogICAgICogR01UKzFgKS4KICAgICAqIC0gYCdmdWxsJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHksIGg6bW06c3MgYSB6enp6J2AgKGBNb25kYXksIEp1bmUgMTUsIDIwMTUgYXQKICAgICAqIDk6MDM6MDEgQU0gR01UKzAxOjAwYCkuCiAgICAgKiAtIGAnc2hvcnREYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNL2QveXknYCAoYDYvMTUvMTVgKS4KICAgICAqIC0gYCdtZWRpdW1EYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdNTU0gZCwgeSdgIChgSnVuIDE1LCAyMDE1YCkuCiAgICAgKiAtIGAnbG9uZ0RhdGUnYDogZXF1aXZhbGVudCB0byBgJ01NTU0gZCwgeSdgIChgSnVuZSAxNSwgMjAxNWApLgogICAgICogLSBgJ2Z1bGxEYXRlJ2A6IGVxdWl2YWxlbnQgdG8gYCdFRUVFLCBNTU1NIGQsIHknYCAoYE1vbmRheSwgSnVuZSAxNSwgMjAxNWApLgogICAgICogLSBgJ3Nob3J0VGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbSBhJ2AgKGA5OjAzIEFNYCkuCiAgICAgKiAtIGAnbWVkaXVtVGltZSdgOiBlcXVpdmFsZW50IHRvIGAnaDptbTpzcyBhJ2AgKGA5OjAzOjAxIEFNYCkuCiAgICAgKiAtIGAnbG9uZ1RpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSB6J2AgKGA5OjAzOjAxIEFNIEdNVCsxYCkuCiAgICAgKiAtIGAnZnVsbFRpbWUnYDogZXF1aXZhbGVudCB0byBgJ2g6bW06c3MgYSB6enp6J2AgKGA5OjAzOjAxIEFNIEdNVCswMTowMGApLgogICAgICoKICAgICAqICMjIyBDdXN0b20gZm9ybWF0IG9wdGlvbnMKICAgICAqCiAgICAgKiBZb3UgY2FuIGNvbnN0cnVjdCBhIGZvcm1hdCBzdHJpbmcgdXNpbmcgc3ltYm9scyB0byBzcGVjaWZ5IHRoZSBjb21wb25lbnRzCiAgICAgKiBvZiBhIGRhdGUtdGltZSB2YWx1ZSwgYXMgZGVzY3JpYmVkIGluIHRoZSBmb2xsb3dpbmcgdGFibGUuCiAgICAgKiBGb3JtYXQgZGV0YWlscyBkZXBlbmQgb24gdGhlIGxvY2FsZS4KICAgICAqIEZpZWxkcyBtYXJrZWQgd2l0aCAoKikgYXJlIG9ubHkgYXZhaWxhYmxlIGluIHRoZSBleHRyYSBkYXRhIHNldCBmb3IgdGhlIGdpdmVuIGxvY2FsZS4KICAgICAqCiAgICAgKiAgfCBGaWVsZCB0eXBlICAgICAgICAgfCBGb3JtYXQgICAgICB8IERlc2NyaXB0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBFeGFtcGxlIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8LS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAogICAgICogIHwgRXJhICAgICAgICAgICAgICAgIHwgRywgR0cgJiBHR0cgfCBBYmJyZXZpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBHR0dHICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBBbm5vIERvbWluaSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IEdHR0dHICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgWWVhciAgICAgICAgICAgICAgIHwgeSAgICAgICAgICAgfCBOdW1lcmljOiBtaW5pbXVtIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMiwgMjAsIDIwMSwgMjAxNywgMjAxNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCB5eSAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMiwgMjAsIDAxLCAxNywgNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IHl5eSAgICAgICAgIHwgTnVtZXJpYzogMyBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAwMiwgMDIwLCAyMDEsIDIwMTcsIDIwMTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgeXl5eSAgICAgICAgfCBOdW1lcmljOiA0IGRpZ2l0cyBvciBtb3JlICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgIHwgMDAwMiwgMDAyMCwgMDIwMSwgMjAxNywgMjAxNzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBNb250aCAgICAgICAgICAgICAgfCBNICAgICAgICAgICB8IE51bWVyaWM6IDEgZGlnaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDA5LCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgTU1NICAgICAgICAgfCBBYmJyZXZpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBNTU1NICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTZXB0ZW1iZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IE1NTU1NICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgTW9udGggc3RhbmRhbG9uZSAgIHwgTCAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgOSwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBMTCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwOSwgMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IExMTCAgICAgICAgIHwgQWJicmV2aWF0ZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFNlcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgTExMTCAgICAgICAgfCBXaWRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgU2VwdGVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBMTExMTCAgICAgICB8IE5hcnJvdyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8IFdlZWsgb2YgeWVhciAgICAgICB8IHcgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEuLi4gNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgd3cgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDEuLi4gNTMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBXZWVrIG9mIG1vbnRoICAgICAgfCBXICAgICAgICAgICB8IE51bWVyaWM6IDEgZGlnaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLi4uIDUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8IERheSBvZiBtb250aCAgICAgICB8IGQgICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgZGQgICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgV2VlayBkYXkgICAgICAgICAgIHwgRSwgRUUgJiBFRUUgfCBBYmJyZXZpYXRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBFRUVFICAgICAgICB8IFdpZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBUdWVzZGF5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IEVFRUVFICAgICAgIHwgTmFycm93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgRUVFRUVFICAgICAgfCBTaG9ydCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgVHUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBQZXJpb2QgICAgICAgICAgICAgfCBhLCBhYSAmIGFhYSB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBhbS9wbSBvciBBTS9QTSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IGFhYWEgICAgICAgIHwgV2lkZSAoZmFsbGJhY2sgdG8gYGFgIHdoZW4gbWlzc2luZykgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFudGUgbWVyaWRpZW0vcG9zdCBtZXJpZGllbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgYWFhYWEgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgYS9wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBQZXJpb2QqICAgICAgICAgICAgfCBCLCBCQiAmIEJCQiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IEJCQkIgICAgICAgIHwgV2lkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFtLCBwbSwgbWlkbmlnaHQsIG5vb24sIG1vcm5pbmcsIGFmdGVybm9vbiwgZXZlbmluZywgbmlnaHQgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgQkJCQkIgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBQZXJpb2Qgc3RhbmRhbG9uZSogfCBiLCBiYiAmIGJiYiB8IEFiYnJldmlhdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBtaWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IGJiYmIgICAgICAgIHwgV2lkZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGFtLCBwbSwgbWlkbmlnaHQsIG5vb24sIG1vcm5pbmcsIGFmdGVybm9vbiwgZXZlbmluZywgbmlnaHQgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgYmJiYmIgICAgICAgfCBOYXJyb3cgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgbWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBIb3VyIDEtMTIgICAgICAgICAgfCBoICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAxLCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IGhoICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAxLCAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgSG91ciAwLTIzICAgICAgICAgIHwgSCAgICAgICAgICAgfCBOdW1lcmljOiBtaW5pbXVtIGRpZ2l0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMCwgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBISCAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMCwgMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8IE1pbnV0ZSAgICAgICAgICAgICB8IG0gICAgICAgICAgIHwgTnVtZXJpYzogbWluaW11bSBkaWdpdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDgsIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgbW0gICAgICAgICAgfCBOdW1lcmljOiAyIGRpZ2l0cyArIHplcm8gcGFkZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMDgsIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCBTZWNvbmQgICAgICAgICAgICAgfCBzICAgICAgICAgICB8IE51bWVyaWM6IG1pbmltdW0gZGlnaXRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLi4uIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IHNzICAgICAgICAgIHwgTnVtZXJpYzogMiBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDAwLi4uIDU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgRnJhY3Rpb25hbCBzZWNvbmRzIHwgUyAgICAgICAgICAgfCBOdW1lcmljOiAxIGRpZ2l0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMC4uLiA5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBTUyAgICAgICAgICB8IE51bWVyaWM6IDIgZGlnaXRzICsgemVybyBwYWRkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwMC4uLiA5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IFNTUyAgICAgICAgIHwgTnVtZXJpYzogMyBkaWdpdHMgKyB6ZXJvIHBhZGRlZCAoPSBtaWxsaXNlY29uZHMpICAgICAgICAgICAgICB8IDAwMC4uLiA5OTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgWm9uZSAgICAgICAgICAgICAgIHwgeiwgenogJiB6enogfCBTaG9ydCBzcGVjaWZpYyBub24gbG9jYXRpb24gZm9ybWF0IChmYWxsYmFjayB0byBPKSAgICAgICAgICAgIHwgR01ULTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCB6enp6ICAgICAgICB8IExvbmcgc3BlY2lmaWMgbm9uIGxvY2F0aW9uIGZvcm1hdCAoZmFsbGJhY2sgdG8gT09PTykgICAgICAgICAgfCBHTVQtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IFosIFpaICYgWlpaIHwgSVNPODYwMSBiYXNpYyBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IC0wODAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgWlpaWiAgICAgICAgfCBMb25nIGxvY2FsaXplZCBHTVQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR01ULTg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgfCBaWlpaWiAgICAgICB8IElTTzg2MDEgZXh0ZW5kZWQgZm9ybWF0ICsgWiBpbmRpY2F0b3IgZm9yIG9mZnNldCAwICg9IFhYWFhYKSAgfCAtMDg6MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8IE8sIE9PICYgT09PIHwgU2hvcnQgbG9jYWxpemVkIEdNVCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IEdNVC04ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgIHwgT09PTyAgICAgICAgfCBMb25nIGxvY2FsaXplZCBHTVQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgR01ULTA4OjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKgogICAgICogTm90ZSB0aGF0IHRpbWV6b25lIGNvcnJlY3Rpb24gaXMgbm90IGFwcGxpZWQgdG8gYW4gSVNPIHN0cmluZyB0aGF0IGhhcyBubyB0aW1lIGNvbXBvbmVudCwgc3VjaCBhcyAiMjAxNi0wOS0xOSIKICAgICAqCiAgICAgKiAjIyMgRm9ybWF0IGV4YW1wbGVzCiAgICAgKgogICAgICogVGhlc2UgZXhhbXBsZXMgdHJhbnNmb3JtIGEgZGF0ZSBpbnRvIHZhcmlvdXMgZm9ybWF0cywKICAgICAqIGFzc3VtaW5nIHRoYXQgYGRhdGVPYmpgIGlzIGEgSmF2YVNjcmlwdCBgRGF0ZWAgb2JqZWN0IGZvcgogICAgICogeWVhcjogMjAxNSwgbW9udGg6IDYsIGRheTogMTUsIGhvdXI6IDIxLCBtaW51dGU6IDQzLCBzZWNvbmQ6IDExLAogICAgICogZ2l2ZW4gaW4gdGhlIGxvY2FsIHRpbWUgZm9yIHRoZSBgZW4tVVNgIGxvY2FsZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIHt7IGRhdGVPYmogfCBkYXRlIH19ICAgICAgICAgICAgICAgLy8gb3V0cHV0IGlzICdKdW4gMTUsIDIwMTUnCiAgICAgKiB7eyBkYXRlT2JqIHwgZGF0ZTonbWVkaXVtJyB9fSAgICAgIC8vIG91dHB1dCBpcyAnSnVuIDE1LCAyMDE1LCA5OjQzOjExIFBNJwogICAgICoge3sgZGF0ZU9iaiB8IGRhdGU6J3Nob3J0VGltZScgfX0gICAvLyBvdXRwdXQgaXMgJzk6NDMgUE0nCiAgICAgKiB7eyBkYXRlT2JqIHwgZGF0ZTonbW06c3MnIH19ICAgICAgIC8vIG91dHB1dCBpcyAnNDM6MTEnCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgVXNhZ2UgZXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgY29tcG9uZW50IHVzZXMgYSBkYXRlIHBpcGUgdG8gZGlzcGxheSB0aGUgY3VycmVudCBkYXRlIGluIGRpZmZlcmVudCBmb3JtYXRzLgogICAgICoKICAgICAqIGBgYAogICAgICogXEBDb21wb25lbnQoewogICAgICogIHNlbGVjdG9yOiAnZGF0ZS1waXBlJywKICAgICAqICB0ZW1wbGF0ZTogYDxkaXY+CiAgICAgKiAgICA8cD5Ub2RheSBpcyB7e3RvZGF5IHwgZGF0ZX19PC9wPgogICAgICogICAgPHA+T3IgaWYgeW91IHByZWZlciwge3t0b2RheSB8IGRhdGU6J2Z1bGxEYXRlJ319PC9wPgogICAgICogICAgPHA+VGhlIHRpbWUgaXMge3t0b2RheSB8IGRhdGU6J2g6bW0gYSB6J319PC9wPgogICAgICogIDwvZGl2PmAKICAgICAqIH0pCiAgICAgKiAvLyBHZXQgdGhlIGN1cnJlbnQgZGF0ZSBhbmQgdGltZSBhcyBhIGRhdGUtdGltZSB2YWx1ZS4KICAgICAqIGV4cG9ydCBjbGFzcyBEYXRlUGlwZUNvbXBvbmVudCB7CiAgICAgKiAgIHRvZGF5OiBudW1iZXIgPSBEYXRlLm5vdygpOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgLy8gY2xhbmctZm9ybWF0IG9uCiAgICBjbGFzcyBEYXRlUGlwZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihsb2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGRhdGUgZXhwcmVzc2lvbjogYSBgRGF0ZWAgb2JqZWN0LCAgYSBudW1iZXIKICAgICAgICAgKiAobWlsbGlzZWNvbmRzIHNpbmNlIFVUQyBlcG9jaCksIG9yIGFuIElTTyBzdHJpbmcgKGh0dHBzOi8vd3d3LnczLm9yZy9UUi9OT1RFLWRhdGV0aW1lKS4KICAgICAgICAgKiBAcGFyYW0gez89fSBmb3JtYXQgVGhlIGRhdGUvdGltZSBjb21wb25lbnRzIHRvIGluY2x1ZGUsIHVzaW5nIHByZWRlZmluZWQgb3B0aW9ucyBvciBhCiAgICAgICAgICogY3VzdG9tIGZvcm1hdCBzdHJpbmcuCiAgICAgICAgICogQHBhcmFtIHs/PX0gdGltZXpvbmUgQSB0aW1lem9uZSBvZmZzZXQgKHN1Y2ggYXMgYCcrMDQzMCdgKSwgb3IgYSBzdGFuZGFyZAogICAgICAgICAqIFVUQy9HTVQgb3IgY29udGluZW50YWwgVVMgdGltZXpvbmUgYWJicmV2aWF0aW9uLgogICAgICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSBlbmQtdXNlcidzIGxvY2FsIHN5c3RlbSB0aW1lem9uZS4KICAgICAgICAgKiBAcGFyYW0gez89fSBsb2NhbGUgQSBsb2NhbGUgY29kZSBmb3IgdGhlIGxvY2FsZSBmb3JtYXQgcnVsZXMgdG8gdXNlLgogICAgICAgICAqIFdoZW4gbm90IHN1cHBsaWVkLCB1c2VzIHRoZSB2YWx1ZSBvZiBgTE9DQUxFX0lEYCwgd2hpY2ggaXMgYGVuLVVTYCBieSBkZWZhdWx0LgogICAgICAgICAqIFNlZSBbU2V0dGluZyB5b3VyIGFwcCBsb2NhbGVdKGd1aWRlL2kxOG4jc2V0dGluZy11cC10aGUtbG9jYWxlLW9mLXlvdXItYXBwKS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIGRhdGUgc3RyaW5nIGluIHRoZSBkZXNpcmVkIGZvcm1hdC4KICAgICAgICAgKi8KICAgICAgICB0cmFuc2Zvcm0odmFsdWUsIGZvcm1hdCA9ICdtZWRpdW1EYXRlJywgdGltZXpvbmUsIGxvY2FsZSkgewogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgIT09IHZhbHVlKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0RGF0ZSh2YWx1ZSwgZm9ybWF0LCBsb2NhbGUgfHwgdGhpcy5sb2NhbGUsIHRpbWV6b25lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihEYXRlUGlwZSwgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBEYXRlUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIERhdGVQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERhdGVQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSk7IH07CiAgICBEYXRlUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJkYXRlIiwgdHlwZTogRGF0ZVBpcGUsIHB1cmU6IHRydWUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIERhdGVQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3BpcGVzL2kxOG5fcGx1cmFsX3BpcGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX0lOVEVSUE9MQVRJT05fUkVHRVhQID0gLyMvZzsKICAgIC8qKgogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBNYXBzIGEgdmFsdWUgdG8gYSBzdHJpbmcgdGhhdCBwbHVyYWxpemVzIHRoZSB2YWx1ZSBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBFeGFtcGxlCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvaTE4bl9waXBlLnRzIHJlZ2lvbj0nSTE4blBsdXJhbFBpcGVDb21wb25lbnQnfQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEkxOG5QbHVyYWxQaXBlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9sb2NhbGl6YXRpb24KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfbG9jYWxpemF0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX2xvY2FsaXphdGlvbiA9IF9sb2NhbGl6YXRpb247CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgdGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQKICAgICAgICAgKiBAcGFyYW0gez99IHBsdXJhbE1hcCBhbiBvYmplY3QgdGhhdCBtaW1pY3MgdGhlIElDVSBmb3JtYXQsIHNlZQogICAgICAgICAqIGh0dHA6Ly91c2VyZ3VpZGUuaWN1LXByb2plY3Qub3JnL2Zvcm1hdHBhcnNlL21lc3NhZ2VzLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsZSBhIGBzdHJpbmdgIGRlZmluaW5nIHRoZSBsb2NhbGUgdG8gdXNlICh1c2VzIHRoZSBjdXJyZW50IHtcQGxpbmsgTE9DQUxFX0lEfSBieQogICAgICAgICAqIGRlZmF1bHQpLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtKHZhbHVlLCBwbHVyYWxNYXAsIGxvY2FsZSkgewogICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwbHVyYWxNYXAgIT09ICdvYmplY3QnIHx8IHBsdXJhbE1hcCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEkxOG5QbHVyYWxQaXBlLCBwbHVyYWxNYXApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5ID0gZ2V0UGx1cmFsQ2F0ZWdvcnkodmFsdWUsIE9iamVjdC5rZXlzKHBsdXJhbE1hcCksIHRoaXMuX2xvY2FsaXphdGlvbiwgbG9jYWxlKTsKICAgICAgICAgICAgcmV0dXJuIHBsdXJhbE1hcFtrZXldLnJlcGxhY2UoX0lOVEVSUE9MQVRJT05fUkVHRVhQLCB2YWx1ZS50b1N0cmluZygpKTsKICAgICAgICB9CiAgICB9CiAgICBJMThuUGx1cmFsUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIEkxOG5QbHVyYWxQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEkxOG5QbHVyYWxQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nTG9jYWxpemF0aW9uKSk7IH07CiAgICBJMThuUGx1cmFsUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJpMThuUGx1cmFsIiwgdHlwZTogSTE4blBsdXJhbFBpcGUsIHB1cmU6IHRydWUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEkxOG5QbHVyYWxQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogTmdMb2NhbGl6YXRpb24gfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcGlwZXMvaTE4bl9zZWxlY3RfcGlwZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogR2VuZXJpYyBzZWxlY3RvciB0aGF0IGRpc3BsYXlzIHRoZSBzdHJpbmcgdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHZhbHVlLgogICAgICoKICAgICAqIElmIG5vbmUgb2YgdGhlIGtleXMgb2YgdGhlIGBtYXBwaW5nYCBtYXRjaCB0aGUgYHZhbHVlYCwgdGhlbiB0aGUgY29udGVudAogICAgICogb2YgdGhlIGBvdGhlcmAga2V5IGlzIHJldHVybmVkIHdoZW4gcHJlc2VudCwgb3RoZXJ3aXNlIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2kxOG5fcGlwZS50cyByZWdpb249J0kxOG5TZWxlY3RQaXBlQ29tcG9uZW50J30KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBJMThuU2VsZWN0UGlwZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBhIHN0cmluZyB0byBiZSBpbnRlcm5hdGlvbmFsaXplZC4KICAgICAgICAgKiBAcGFyYW0gez99IG1hcHBpbmcgYW4gb2JqZWN0IHRoYXQgaW5kaWNhdGVzIHRoZSB0ZXh0IHRoYXQgc2hvdWxkIGJlIGRpc3BsYXllZAogICAgICAgICAqIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIHRoZSBwcm92aWRlZCBgdmFsdWVgLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtKHZhbHVlLCBtYXBwaW5nKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICBpZiAodHlwZW9mIG1hcHBpbmcgIT09ICdvYmplY3QnIHx8IHR5cGVvZiB2YWx1ZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihJMThuU2VsZWN0UGlwZSwgbWFwcGluZyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWFwcGluZ1t2YWx1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1hcHBpbmcuaGFzT3duUHJvcGVydHkoJ290aGVyJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtYXBwaW5nWydvdGhlciddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICB9CiAgICBJMThuU2VsZWN0UGlwZS7JtWZhYyA9IGZ1bmN0aW9uIEkxOG5TZWxlY3RQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEkxOG5TZWxlY3RQaXBlKSgpOyB9OwogICAgSTE4blNlbGVjdFBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAiaTE4blNlbGVjdCIsIHR5cGU6IEkxOG5TZWxlY3RQaXBlLCBwdXJlOiB0cnVlIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9qc29uX3BpcGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIENvbnZlcnRzIGEgdmFsdWUgaW50byBpdHMgSlNPTi1mb3JtYXQgcmVwcmVzZW50YXRpb24uICBVc2VmdWwgZm9yIGRlYnVnZ2luZy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGNvbXBvbmVudCB1c2VzIGEgSlNPTiBwaXBlIHRvIGNvbnZlcnQgYW4gb2JqZWN0CiAgICAgKiB0byBKU09OIGZvcm1hdCwgYW5kIGRpc3BsYXlzIHRoZSBzdHJpbmcgaW4gYm90aCBmb3JtYXRzIGZvciBjb21wYXJpc29uLgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgY29tbW9uL3BpcGVzL3RzL2pzb25fcGlwZS50cyByZWdpb249J0pzb25QaXBlJ30KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBKc29uUGlwZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBBIHZhbHVlIG9mIGFueSB0eXBlIHRvIGNvbnZlcnQgaW50byBhIEpTT04tZm9ybWF0IHN0cmluZy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYW5zZm9ybSh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodmFsdWUsIG51bGwsIDIpOwogICAgICAgIH0KICAgIH0KICAgIEpzb25QaXBlLsm1ZmFjID0gZnVuY3Rpb24gSnNvblBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSnNvblBpcGUpKCk7IH07CiAgICBKc29uUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJqc29uIiwgdHlwZTogSnNvblBpcGUsIHB1cmU6IGZhbHNlIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL3NyYy9waXBlcy9rZXl2YWx1ZV9waXBlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHRlbXBsYXRlIEssIFYKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlS2V5VmFsdWVQYWlyKGtleSwgdmFsdWUpIHsKICAgICAgICByZXR1cm4geyBrZXk6IGtleSwgdmFsdWU6IHZhbHVlIH07CiAgICB9CiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogVHJhbnNmb3JtcyBPYmplY3Qgb3IgTWFwIGludG8gYW4gYXJyYXkgb2Yga2V5IHZhbHVlIHBhaXJzLgogICAgICoKICAgICAqIFRoZSBvdXRwdXQgYXJyYXkgd2lsbCBiZSBvcmRlcmVkIGJ5IGtleXMuCiAgICAgKiBCeSBkZWZhdWx0IHRoZSBjb21wYXJhdG9yIHdpbGwgYmUgYnkgVW5pY29kZSBwb2ludCB2YWx1ZS4KICAgICAqIFlvdSBjYW4gb3B0aW9uYWxseSBwYXNzIGEgY29tcGFyZUZuIGlmIHlvdXIga2V5cyBhcmUgY29tcGxleCB0eXBlcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqICMjIyBFeGFtcGxlcwogICAgICoKICAgICAqIFRoaXMgZXhhbXBsZXMgc2hvdyBob3cgYW4gT2JqZWN0IG9yIGEgTWFwIGNhbiBiZSBpdGVyYXRlZCBieSBuZ0ZvciB3aXRoIHRoZSB1c2Ugb2YgdGhpcyBrZXl2YWx1ZQogICAgICogcGlwZS4KICAgICAqCiAgICAgKiB7XEBleGFtcGxlIGNvbW1vbi9waXBlcy90cy9rZXl2YWx1ZV9waXBlLnRzIHJlZ2lvbj0nS2V5VmFsdWVQaXBlJ30KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBLZXlWYWx1ZVBpcGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlmZmVycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRpZmZlcnMpIHsKICAgICAgICAgICAgdGhpcy5kaWZmZXJzID0gZGlmZmVyczsKICAgICAgICAgICAgdGhpcy5rZXlWYWx1ZXMgPSBbXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIEssIFYKICAgICAgICAgKiBAcGFyYW0gez99IGlucHV0CiAgICAgICAgICogQHBhcmFtIHs/PX0gY29tcGFyZUZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmFuc2Zvcm0oaW5wdXQsIGNvbXBhcmVGbiA9IGRlZmF1bHRDb21wYXJhdG9yKSB7CiAgICAgICAgICAgIGlmICghaW5wdXQgfHwgKCEoaW5wdXQgaW5zdGFuY2VvZiBNYXApICYmIHR5cGVvZiBpbnB1dCAhPT0gJ29iamVjdCcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuZGlmZmVyKSB7CiAgICAgICAgICAgICAgICAvLyBtYWtlIGEgZGlmZmVyIGZvciB3aGF0ZXZlciB0eXBlIHdlJ3ZlIGJlZW4gcGFzc2VkIGluCiAgICAgICAgICAgICAgICB0aGlzLmRpZmZlciA9IHRoaXMuZGlmZmVycy5maW5kKGlucHV0KS5jcmVhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpZmZlckNoYW5nZXMgPSB0aGlzLmRpZmZlci5kaWZmKCgvKiogQHR5cGUgez99ICovIChpbnB1dCkpKTsKICAgICAgICAgICAgaWYgKGRpZmZlckNoYW5nZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMua2V5VmFsdWVzID0gW107CiAgICAgICAgICAgICAgICBkaWZmZXJDaGFuZ2VzLmZvckVhY2hJdGVtKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHIpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmtleVZhbHVlcy5wdXNoKG1ha2VLZXlWYWx1ZVBhaXIoci5rZXksICgvKiogQHR5cGUgez99ICovIChyLmN1cnJlbnRWYWx1ZSkpKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB0aGlzLmtleVZhbHVlcy5zb3J0KGNvbXBhcmVGbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5VmFsdWVzOwogICAgICAgIH0KICAgIH0KICAgIEtleVZhbHVlUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIEtleVZhbHVlUGlwZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBLZXlWYWx1ZVBpcGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoS2V5VmFsdWVEaWZmZXJzKSk7IH07CiAgICBLZXlWYWx1ZVBpcGUuybVwaXBlID0gybXJtWRlZmluZVBpcGUoeyBuYW1lOiAia2V5dmFsdWUiLCB0eXBlOiBLZXlWYWx1ZVBpcGUsIHB1cmU6IGZhbHNlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBLZXlWYWx1ZVBpcGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBLZXlWYWx1ZURpZmZlcnMgfQogICAgXTsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIEssIFYKICAgICAqIEBwYXJhbSB7P30ga2V5VmFsdWVBCiAgICAgKiBAcGFyYW0gez99IGtleVZhbHVlQgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGVmYXVsdENvbXBhcmF0b3Ioa2V5VmFsdWVBLCBrZXlWYWx1ZUIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYSA9IGtleVZhbHVlQS5rZXk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGIgPSBrZXlWYWx1ZUIua2V5OwogICAgICAgIC8vIGlmIHNhbWUgZXhpdCB3aXRoIDA7CiAgICAgICAgaWYgKGEgPT09IGIpCiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHVuZGVmaW5lZCBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgc29ydC4KICAgICAgICBpZiAoYSA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICBpZiAoYiA9PT0gdW5kZWZpbmVkKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgbnVsbHMgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIHNvcnQuCiAgICAgICAgaWYgKGEgPT09IG51bGwpCiAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgIGlmIChiID09PSBudWxsKQogICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgaWYgKHR5cGVvZiBhID09ICdzdHJpbmcnICYmIHR5cGVvZiBiID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIHJldHVybiBhIDwgYiA/IC0xIDogMTsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBhID09ICdudW1iZXInICYmIHR5cGVvZiBiID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHJldHVybiBhIC0gYjsKICAgICAgICB9CiAgICAgICAgaWYgKHR5cGVvZiBhID09ICdib29sZWFuJyAmJiB0eXBlb2YgYiA9PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgcmV0dXJuIGEgPCBiID8gLTEgOiAxOwogICAgICAgIH0KICAgICAgICAvLyBgYWAgYW5kIGBiYCBhcmUgb2YgZGlmZmVyZW50IHR5cGVzLiBDb21wYXJlIHRoZWlyIHN0cmluZyB2YWx1ZXMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFTdHJpbmcgPSBTdHJpbmcoYSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJTdHJpbmcgPSBTdHJpbmcoYik7CiAgICAgICAgcmV0dXJuIGFTdHJpbmcgPT0gYlN0cmluZyA/IDAgOiBhU3RyaW5nIDwgYlN0cmluZyA/IC0xIDogMTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcGlwZXMvbnVtYmVyX3BpcGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQG5nTW9kdWxlIENvbW1vbk1vZHVsZQogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIFRyYW5zZm9ybXMgYSBudW1iZXIgaW50byBhIHN0cmluZywKICAgICAqIGZvcm1hdHRlZCBhY2NvcmRpbmcgdG8gbG9jYWxlIHJ1bGVzIHRoYXQgZGV0ZXJtaW5lIGdyb3VwIHNpemluZyBhbmQKICAgICAqIHNlcGFyYXRvciwgZGVjaW1hbC1wb2ludCBjaGFyYWN0ZXIsIGFuZCBvdGhlciBsb2NhbGUtc3BlY2lmaWMKICAgICAqIGNvbmZpZ3VyYXRpb25zLgogICAgICoKICAgICAqIElmIG5vIHBhcmFtZXRlcnMgYXJlIHNwZWNpZmllZCwgdGhlIGZ1bmN0aW9uIHJvdW5kcyBvZmYgdG8gdGhlIG5lYXJlc3QgdmFsdWUgdXNpbmcgdGhpcwogICAgICogW3JvdW5kaW5nIG1ldGhvZF0oaHR0cHM6Ly9lbi53aWtpYm9va3Mub3JnL3dpa2kvQXJpdGhtZXRpYy9Sb3VuZGluZykuCiAgICAgKiBUaGUgYmVoYXZpb3IgZGlmZmVycyBmcm9tIHRoYXQgb2YgdGhlIEphdmFTY3JpcHQgYGBgTWF0aC5yb3VuZCgpYGBgIGZ1bmN0aW9uLgogICAgICogSW4gdGhlIGZvbGxvd2luZyBjYXNlIGZvciBleGFtcGxlLCB0aGUgcGlwZSByb3VuZHMgZG93biB3aGVyZQogICAgICogYGBgTWF0aC5yb3VuZCgpYGBgIHJvdW5kcyB1cDoKICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiAtMi41IHwgbnVtYmVyOicxLjAtMCcKICAgICAqID4gLTMKICAgICAqIE1hdGgucm91bmQoLTIuNSkKICAgICAqID4gLTIKICAgICAqIGBgYAogICAgICoKICAgICAqIEBzZWUgYGZvcm1hdE51bWJlcigpYAogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnMKICAgICAqIGludG8gdGV4dCBzdHJpbmdzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsCiAgICAgKiB3aGVyZSB0aGUgY2FsbGVyJ3MgZGVmYXVsdCBsb2NhbGUgaXMgYGVuLVVTYC4KICAgICAqCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL251bWJlcl9waXBlLnRzIiByZWdpb249J051bWJlclBpcGUnPjwvY29kZS1leGFtcGxlPgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIERlY2ltYWxQaXBlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9sb2NhbGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfbG9jYWxlKSB7CiAgICAgICAgICAgIHRoaXMuX2xvY2FsZSA9IF9sb2NhbGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGlnaXRzSW5mbyBEZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9wdGlvbnMsIHNwZWNpZmllZCBieSBhIHN0cmluZwogICAgICAgICAqIGluIHRoZSBmb2xsb3dpbmcgZm9ybWF0Ojxicj4KICAgICAgICAgKiA8Y29kZT57bWluSW50ZWdlckRpZ2l0c30ue21pbkZyYWN0aW9uRGlnaXRzfS17bWF4RnJhY3Rpb25EaWdpdHN9PC9jb2RlPi4KICAgICAgICAgKiAgIC0gYG1pbkludGVnZXJEaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgaW50ZWdlciBkaWdpdHMgYmVmb3JlIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICAgICAqIERlZmF1bHQgaXMgYDFgLgogICAgICAgICAqICAgLSBgbWluRnJhY3Rpb25EaWdpdHNgOiBUaGUgbWluaW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICAgICAqIERlZmF1bHQgaXMgYDBgLgogICAgICAgICAqICAgLSBgbWF4RnJhY3Rpb25EaWdpdHNgOiBUaGUgbWF4aW11bSBudW1iZXIgb2YgZGlnaXRzIGFmdGVyIHRoZSBkZWNpbWFsIHBvaW50LgogICAgICAgICAqIERlZmF1bHQgaXMgYDNgLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGxvY2FsZSBBIGxvY2FsZSBjb2RlIGZvciB0aGUgbG9jYWxlIGZvcm1hdCBydWxlcyB0byB1c2UuCiAgICAgICAgICogV2hlbiBub3Qgc3VwcGxpZWQsIHVzZXMgdGhlIHZhbHVlIG9mIGBMT0NBTEVfSURgLCB3aGljaCBpcyBgZW4tVVNgIGJ5IGRlZmF1bHQuCiAgICAgICAgICogU2VlIFtTZXR0aW5nIHlvdXIgYXBwIGxvY2FsZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtKHZhbHVlLCBkaWdpdHNJbmZvLCBsb2NhbGUpIHsKICAgICAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZSB8fCB0aGlzLl9sb2NhbGU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKG51bSwgbG9jYWxlLCBkaWdpdHNJbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihEZWNpbWFsUGlwZSwgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBEZWNpbWFsUGlwZS7JtWZhYyA9IGZ1bmN0aW9uIERlY2ltYWxQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlY2ltYWxQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSk7IH07CiAgICBEZWNpbWFsUGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJudW1iZXIiLCB0eXBlOiBEZWNpbWFsUGlwZSwgcHVyZTogdHJ1ZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRGVjaW1hbFBpcGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0xPQ0FMRV9JRCQxLF0gfV0gfQogICAgXTsKICAgIC8qKgogICAgICogXEBuZ01vZHVsZSBDb21tb25Nb2R1bGUKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBUcmFuc2Zvcm1zIGEgbnVtYmVyIHRvIGEgcGVyY2VudGFnZQogICAgICogc3RyaW5nLCBmb3JtYXR0ZWQgYWNjb3JkaW5nIHRvIGxvY2FsZSBydWxlcyB0aGF0IGRldGVybWluZSBncm91cCBzaXppbmcgYW5kCiAgICAgKiBzZXBhcmF0b3IsIGRlY2ltYWwtcG9pbnQgY2hhcmFjdGVyLCBhbmQgb3RoZXIgbG9jYWxlLXNwZWNpZmljCiAgICAgKiBjb25maWd1cmF0aW9ucy4KICAgICAqCiAgICAgKiBAc2VlIGBmb3JtYXRQZXJjZW50KClgCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBUaGUgZm9sbG93aW5nIGNvZGUgc2hvd3MgaG93IHRoZSBwaXBlIHRyYW5zZm9ybXMgbnVtYmVycwogICAgICogaW50byB0ZXh0IHN0cmluZ3MsIGFjY29yZGluZyB0byB2YXJpb3VzIGZvcm1hdCBzcGVjaWZpY2F0aW9ucywKICAgICAqIHdoZXJlIHRoZSBjYWxsZXIncyBkZWZhdWx0IGxvY2FsZSBpcyBgZW4tVVNgLgogICAgICoKICAgICAqIDxjb2RlLWV4YW1wbGUgcGF0aD0iY29tbW9uL3BpcGVzL3RzL3BlcmNlbnRfcGlwZS50cyIgcmVnaW9uPSdQZXJjZW50UGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgUGVyY2VudFBpcGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2xvY2FsZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9sb2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBudW1iZXIgdG8gYmUgZm9ybWF0dGVkIGFzIGEgcGVyY2VudGFnZS4KICAgICAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCiAgICAgICAgICogaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6PGJyPgogICAgICAgICAqIDxjb2RlPnttaW5JbnRlZ2VyRGlnaXRzfS57bWluRnJhY3Rpb25EaWdpdHN9LXttYXhGcmFjdGlvbkRpZ2l0c308L2NvZGU+LgogICAgICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgICogRGVmYXVsdCBpcyBgMWAuCiAgICAgICAgICogICAtIGBtaW5GcmFjdGlvbkRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgICogRGVmYXVsdCBpcyBgMGAuCiAgICAgICAgICogICAtIGBtYXhGcmFjdGlvbkRpZ2l0c2A6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgICogRGVmYXVsdCBpcyBgMGAuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgdmFsdWUgb2YgYExPQ0FMRV9JRGAsIHdoaWNoIGlzIGBlbi1VU2AgYnkgZGVmYXVsdC4KICAgICAgICAgKiBTZWUgW1NldHRpbmcgeW91ciBhcHAgbG9jYWxlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmFuc2Zvcm0odmFsdWUsIGRpZ2l0c0luZm8sIGxvY2FsZSkgewogICAgICAgICAgICBpZiAoaXNFbXB0eSh2YWx1ZSkpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgbG9jYWxlID0gbG9jYWxlIHx8IHRoaXMuX2xvY2FsZTsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG51bSA9IHN0clRvTnVtYmVyKHZhbHVlKTsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRQZXJjZW50KG51bSwgbG9jYWxlLCBkaWdpdHNJbmZvKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIHRocm93IGludmFsaWRQaXBlQXJndW1lbnRFcnJvcihQZXJjZW50UGlwZSwgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBQZXJjZW50UGlwZS7JtWZhYyA9IGZ1bmN0aW9uIFBlcmNlbnRQaXBlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBlcmNlbnRQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSk7IH07CiAgICBQZXJjZW50UGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJwZXJjZW50IiwgdHlwZTogUGVyY2VudFBpcGUsIHB1cmU6IHRydWUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFBlcmNlbnRQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogVHJhbnNmb3JtcyBhIG51bWJlciB0byBhIGN1cnJlbmN5IHN0cmluZywgZm9ybWF0dGVkIGFjY29yZGluZyB0byBsb2NhbGUgcnVsZXMKICAgICAqIHRoYXQgZGV0ZXJtaW5lIGdyb3VwIHNpemluZyBhbmQgc2VwYXJhdG9yLCBkZWNpbWFsLXBvaW50IGNoYXJhY3RlciwKICAgICAqIGFuZCBvdGhlciBsb2NhbGUtc3BlY2lmaWMgY29uZmlndXJhdGlvbnMuCiAgICAgKgogICAgICoge1xAYSBjdXJyZW5jeS1jb2RlLWRlcHJlY2F0aW9ufQogICAgICogPGRpdiBjbGFzcz0iYWxlcnQgaXMtaGVscGZ1bCI+CiAgICAgKgogICAgICogKipEZXByZWNhdGlvbiBub3RpY2U6KioKICAgICAqCiAgICAgKiBUaGUgZGVmYXVsdCBjdXJyZW5jeSBjb2RlIGlzIGN1cnJlbnRseSBhbHdheXMgYFVTRGAgYnV0IHRoaXMgaXMgZGVwcmVjYXRlZCBmcm9tIHY5LgogICAgICoKICAgICAqICoqSW4gdjExIHRoZSBkZWZhdWx0IGN1cnJlbmN5IGNvZGUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBjdXJyZW50IGxvY2FsZSBpZGVudGlmaWVkIGJ5CiAgICAgKiB0aGUgYExPQ0FMX0lEYCB0b2tlbi4gU2VlIHRoZSBbaTE4biBndWlkZV0oZ3VpZGUvaTE4biNzZXR0aW5nLXVwLXRoZS1sb2NhbGUtb2YteW91ci1hcHApIGZvcgogICAgICogbW9yZSBpbmZvcm1hdGlvbi4qKgogICAgICoKICAgICAqIElmIHlvdSBuZWVkIHRoZSBwcmV2aW91cyBiZWhhdmlvciB0aGVuIHNldCBpdCBieSBjcmVhdGluZyBhIGBERUZBVUxUX0NVUlJFTkNZX0NPREVgIHByb3ZpZGVyIGluCiAgICAgKiB5b3VyIGFwcGxpY2F0aW9uIGBOZ01vZHVsZWA6CiAgICAgKgogICAgICogYGBgdHMKICAgICAqIHtwcm92aWRlOiBERUZBVUxUX0NVUlJFTkNZX0NPREUsIHVzZVZhbHVlOiAnVVNEJ30KICAgICAqIGBgYAogICAgICoKICAgICAqIDwvZGl2PgogICAgICoKICAgICAqIEBzZWUgYGdldEN1cnJlbmN5U3ltYm9sKClgCiAgICAgKiBAc2VlIGBmb3JtYXRDdXJyZW5jeSgpYAogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogVGhlIGZvbGxvd2luZyBjb2RlIHNob3dzIGhvdyB0aGUgcGlwZSB0cmFuc2Zvcm1zIG51bWJlcnMKICAgICAqIGludG8gdGV4dCBzdHJpbmdzLCBhY2NvcmRpbmcgdG8gdmFyaW91cyBmb3JtYXQgc3BlY2lmaWNhdGlvbnMsCiAgICAgKiB3aGVyZSB0aGUgY2FsbGVyJ3MgZGVmYXVsdCBsb2NhbGUgaXMgYGVuLVVTYC4KICAgICAqCiAgICAgKiA8Y29kZS1leGFtcGxlIHBhdGg9ImNvbW1vbi9waXBlcy90cy9jdXJyZW5jeV9waXBlLnRzIiByZWdpb249J0N1cnJlbmN5UGlwZSc+PC9jb2RlLWV4YW1wbGU+CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgQ3VycmVuY3lQaXBlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9sb2NhbGUKICAgICAgICAgKiBAcGFyYW0gez89fSBfZGVmYXVsdEN1cnJlbmN5Q29kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9sb2NhbGUsIF9kZWZhdWx0Q3VycmVuY3lDb2RlID0gJ1VTRCcpIHsKICAgICAgICAgICAgdGhpcy5fbG9jYWxlID0gX2xvY2FsZTsKICAgICAgICAgICAgdGhpcy5fZGVmYXVsdEN1cnJlbmN5Q29kZSA9IF9kZWZhdWx0Q3VycmVuY3lDb2RlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG51bWJlciB0byBiZSBmb3JtYXR0ZWQgYXMgY3VycmVuY3kuCiAgICAgICAgICogQHBhcmFtIHs/PX0gY3VycmVuY3lDb2RlIFRoZSBbSVNPIDQyMTddKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT180MjE3KSBjdXJyZW5jeSBjb2RlLAogICAgICAgICAqIHN1Y2ggYXMgYFVTRGAgZm9yIHRoZSBVUyBkb2xsYXIgYW5kIGBFVVJgIGZvciB0aGUgZXVyby4gVGhlIGRlZmF1bHQgY3VycmVuY3kgY29kZSBjYW4gYmUKICAgICAgICAgKiBjb25maWd1cmVkIHVzaW5nIHRoZSBgREVGQVVMVF9DVVJSRU5DWV9DT0RFYCBpbmplY3Rpb24gdG9rZW4uCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGlzcGxheSBUaGUgZm9ybWF0IGZvciB0aGUgY3VycmVuY3kgaW5kaWNhdG9yLiBPbmUgb2YgdGhlIGZvbGxvd2luZzoKICAgICAgICAgKiAgIC0gYGNvZGVgOiBTaG93IHRoZSBjb2RlIChzdWNoIGFzIGBVU0RgKS4KICAgICAgICAgKiAgIC0gYHN5bWJvbGAoZGVmYXVsdCk6IFNob3cgdGhlIHN5bWJvbCAoc3VjaCBhcyBgJGApLgogICAgICAgICAqICAgLSBgc3ltYm9sLW5hcnJvd2A6IFVzZSB0aGUgbmFycm93IHN5bWJvbCBmb3IgbG9jYWxlcyB0aGF0IGhhdmUgdHdvIHN5bWJvbHMgZm9yIHRoZWlyCiAgICAgICAgICogY3VycmVuY3kuCiAgICAgICAgICogRm9yIGV4YW1wbGUsIHRoZSBDYW5hZGlhbiBkb2xsYXIgQ0FEIGhhcyB0aGUgc3ltYm9sIGBDQSRgIGFuZCB0aGUgc3ltYm9sLW5hcnJvdyBgJGAuIElmIHRoZQogICAgICAgICAqIGxvY2FsZSBoYXMgbm8gbmFycm93IHN5bWJvbCwgdXNlcyB0aGUgc3RhbmRhcmQgc3ltYm9sIGZvciB0aGUgbG9jYWxlLgogICAgICAgICAqICAgLSBTdHJpbmc6IFVzZSB0aGUgZ2l2ZW4gc3RyaW5nIHZhbHVlIGluc3RlYWQgb2YgYSBjb2RlIG9yIGEgc3ltYm9sLgogICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBlbXB0eSBzdHJpbmcgd2lsbCBzdXBwcmVzcyB0aGUgY3VycmVuY3kgJiBzeW1ib2wuCiAgICAgICAgICogICAtIEJvb2xlYW4gKG1hcmtlZCBkZXByZWNhdGVkIGluIHY1KTogYHRydWVgIGZvciBzeW1ib2wgYW5kIGZhbHNlIGZvciBgY29kZWAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSBkaWdpdHNJbmZvIERlY2ltYWwgcmVwcmVzZW50YXRpb24gb3B0aW9ucywgc3BlY2lmaWVkIGJ5IGEgc3RyaW5nCiAgICAgICAgICogaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6PGJyPgogICAgICAgICAqIDxjb2RlPnttaW5JbnRlZ2VyRGlnaXRzfS57bWluRnJhY3Rpb25EaWdpdHN9LXttYXhGcmFjdGlvbkRpZ2l0c308L2NvZGU+LgogICAgICAgICAqICAgLSBgbWluSW50ZWdlckRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBpbnRlZ2VyIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgICogRGVmYXVsdCBpcyBgMWAuCiAgICAgICAgICogICAtIGBtaW5GcmFjdGlvbkRpZ2l0c2A6IFRoZSBtaW5pbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgICogRGVmYXVsdCBpcyBgMmAuCiAgICAgICAgICogICAtIGBtYXhGcmFjdGlvbkRpZ2l0c2A6IFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuCiAgICAgICAgICogRGVmYXVsdCBpcyBgMmAuCiAgICAgICAgICogSWYgbm90IHByb3ZpZGVkLCB0aGUgbnVtYmVyIHdpbGwgYmUgZm9ybWF0dGVkIHdpdGggdGhlIHByb3BlciBhbW91bnQgb2YgZGlnaXRzLAogICAgICAgICAqIGRlcGVuZGluZyBvbiB3aGF0IHRoZSBbSVNPIDQyMTddKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0lTT180MjE3KSBzcGVjaWZpZXMuCiAgICAgICAgICogRm9yIGV4YW1wbGUsIHRoZSBDYW5hZGlhbiBkb2xsYXIgaGFzIDIgZGlnaXRzLCB3aGVyZWFzIHRoZSBDaGlsZWFuIHBlc28gaGFzIG5vbmUuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbG9jYWxlIEEgbG9jYWxlIGNvZGUgZm9yIHRoZSBsb2NhbGUgZm9ybWF0IHJ1bGVzIHRvIHVzZS4KICAgICAgICAgKiBXaGVuIG5vdCBzdXBwbGllZCwgdXNlcyB0aGUgdmFsdWUgb2YgYExPQ0FMRV9JRGAsIHdoaWNoIGlzIGBlbi1VU2AgYnkgZGVmYXVsdC4KICAgICAgICAgKiBTZWUgW1NldHRpbmcgeW91ciBhcHAgbG9jYWxlXShndWlkZS9pMThuI3NldHRpbmctdXAtdGhlLWxvY2FsZS1vZi15b3VyLWFwcCkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmFuc2Zvcm0odmFsdWUsIGN1cnJlbmN5Q29kZSwgZGlzcGxheSA9ICdzeW1ib2wnLCBkaWdpdHNJbmZvLCBsb2NhbGUpIHsKICAgICAgICAgICAgaWYgKGlzRW1wdHkodmFsdWUpKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIGxvY2FsZSA9IGxvY2FsZSB8fCB0aGlzLl9sb2NhbGU7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZGlzcGxheSA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGNvbnNvbGUpKSAmJiAoLyoqIEB0eXBlIHs/fSAqLyAoY29uc29sZS53YXJuKSkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYFdhcm5pbmc6IHRoZSBjdXJyZW5jeSBwaXBlIGhhcyBiZWVuIGNoYW5nZWQgaW4gQW5ndWxhciB2NS4gVGhlIHN5bWJvbERpc3BsYXkgb3B0aW9uICh0aGlyZCBwYXJhbWV0ZXIpIGlzIG5vdyBhIHN0cmluZyBpbnN0ZWFkIG9mIGEgYm9vbGVhbi4gVGhlIGFjY2VwdGVkIHZhbHVlcyBhcmUgImNvZGUiLCAic3ltYm9sIiBvciAic3ltYm9sLW5hcnJvdyIuYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkaXNwbGF5ID0gZGlzcGxheSA/ICdzeW1ib2wnIDogJ2NvZGUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGN1cnJlbmN5ID0gY3VycmVuY3lDb2RlIHx8IHRoaXMuX2RlZmF1bHRDdXJyZW5jeUNvZGU7CiAgICAgICAgICAgIGlmIChkaXNwbGF5ICE9PSAnY29kZScpIHsKICAgICAgICAgICAgICAgIGlmIChkaXNwbGF5ID09PSAnc3ltYm9sJyB8fCBkaXNwbGF5ID09PSAnc3ltYm9sLW5hcnJvdycpIHsKICAgICAgICAgICAgICAgICAgICBjdXJyZW5jeSA9IGdldEN1cnJlbmN5U3ltYm9sKGN1cnJlbmN5LCBkaXNwbGF5ID09PSAnc3ltYm9sJyA/ICd3aWRlJyA6ICduYXJyb3cnLCBsb2NhbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY3VycmVuY3kgPSBkaXNwbGF5OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBudW0gPSBzdHJUb051bWJlcih2YWx1ZSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0Q3VycmVuY3kobnVtLCBsb2NhbGUsIGN1cnJlbmN5LCBjdXJyZW5jeUNvZGUsIGRpZ2l0c0luZm8pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgdGhyb3cgaW52YWxpZFBpcGVBcmd1bWVudEVycm9yKEN1cnJlbmN5UGlwZSwgZXJyb3IubWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBDdXJyZW5jeVBpcGUuybVmYWMgPSBmdW5jdGlvbiBDdXJyZW5jeVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ3VycmVuY3lQaXBlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSwgybXJtWRpcmVjdGl2ZUluamVjdChERUZBVUxUX0NVUlJFTkNZX0NPREUpKTsgfTsKICAgIEN1cnJlbmN5UGlwZS7JtXBpcGUgPSDJtcm1ZGVmaW5lUGlwZSh7IG5hbWU6ICJjdXJyZW5jeSIsIHR5cGU6IEN1cnJlbmN5UGlwZSwgcHVyZTogdHJ1ZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ3VycmVuY3lQaXBlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RFRkFVTFRfQ1VSUkVOQ1lfQ09ERSxdIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRW1wdHkodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSA9PT0gJycgfHwgdmFsdWUgIT09IHZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBUcmFuc2Zvcm1zIGEgc3RyaW5nIGludG8gYSBudW1iZXIgKGlmIG5lZWRlZCkuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdHJUb051bWJlcih2YWx1ZSkgewogICAgICAgIC8vIENvbnZlcnQgc3RyaW5ncyB0byBudW1iZXJzCiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgJiYgIWlzTmFOKE51bWJlcih2YWx1ZSkgLSBwYXJzZUZsb2F0KHZhbHVlKSkpIHsKICAgICAgICAgICAgcmV0dXJuIE51bWJlcih2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdudW1iZXInKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJHt2YWx1ZX0gaXMgbm90IGEgbnVtYmVyYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWx1ZTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcGlwZXMvc2xpY2VfcGlwZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAbmdNb2R1bGUgQ29tbW9uTW9kdWxlCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogQ3JlYXRlcyBhIG5ldyBgQXJyYXlgIG9yIGBTdHJpbmdgIGNvbnRhaW5pbmcgYSBzdWJzZXQgKHNsaWNlKSBvZiB0aGUgZWxlbWVudHMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogQWxsIGJlaGF2aW9yIGlzIGJhc2VkIG9uIHRoZSBleHBlY3RlZCBiZWhhdmlvciBvZiB0aGUgSmF2YVNjcmlwdCBBUEkgYEFycmF5LnByb3RvdHlwZS5zbGljZSgpYAogICAgICogYW5kIGBTdHJpbmcucHJvdG90eXBlLnNsaWNlKClgLgogICAgICoKICAgICAqIFdoZW4gb3BlcmF0aW5nIG9uIGFuIGBBcnJheWAsIHRoZSByZXR1cm5lZCBgQXJyYXlgIGlzIGFsd2F5cyBhIGNvcHkgZXZlbiB3aGVuIGFsbAogICAgICogdGhlIGVsZW1lbnRzIGFyZSBiZWluZyByZXR1cm5lZC4KICAgICAqCiAgICAgKiBXaGVuIG9wZXJhdGluZyBvbiBhIGJsYW5rIHZhbHVlLCB0aGUgcGlwZSByZXR1cm5zIHRoZSBibGFuayB2YWx1ZS4KICAgICAqCiAgICAgKiAjIyMgTGlzdCBFeGFtcGxlCiAgICAgKgogICAgICogVGhpcyBgbmdGb3JgIGV4YW1wbGU6CiAgICAgKgogICAgICoge1xAZXhhbXBsZSBjb21tb24vcGlwZXMvdHMvc2xpY2VfcGlwZS50cyByZWdpb249J1NsaWNlUGlwZV9saXN0J30KICAgICAqCiAgICAgKiBwcm9kdWNlcyB0aGUgZm9sbG93aW5nOgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDxsaT5iPC9saT4KICAgICAqIDxsaT5jPC9saT4KICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBTdHJpbmcgRXhhbXBsZXMKICAgICAqCiAgICAgKiB7XEBleGFtcGxlIGNvbW1vbi9waXBlcy90cy9zbGljZV9waXBlLnRzIHJlZ2lvbj0nU2xpY2VQaXBlX3N0cmluZyd9CiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgU2xpY2VQaXBlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGFydAogICAgICAgICAqIEBwYXJhbSB7Pz19IGVuZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtKHZhbHVlLCBzdGFydCwgZW5kKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICBpZiAoIXRoaXMuc3VwcG9ydHModmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBpbnZhbGlkUGlwZUFyZ3VtZW50RXJyb3IoU2xpY2VQaXBlLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlLnNsaWNlKHN0YXJ0LCBlbmQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0cyhvYmopIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT09ICdzdHJpbmcnIHx8IEFycmF5LmlzQXJyYXkob2JqKTsKICAgICAgICB9CiAgICB9CiAgICBTbGljZVBpcGUuybVmYWMgPSBmdW5jdGlvbiBTbGljZVBpcGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2xpY2VQaXBlKSgpOyB9OwogICAgU2xpY2VQaXBlLsm1cGlwZSA9IMm1ybVkZWZpbmVQaXBlKHsgbmFtZTogInNsaWNlIiwgdHlwZTogU2xpY2VQaXBlLCBwdXJlOiBmYWxzZSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvY29tbW9uX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBOb3RlOiBUaGlzIGRvZXMgbm90IGNvbnRhaW4gdGhlIGxvY2F0aW9uIHByb3ZpZGVycywKICAgIC8vIGFzIHRoZXkgbmVlZCBzb21lIHBsYXRmb3JtIHNwZWNpZmljIGltcGxlbWVudGF0aW9ucyB0byB3b3JrLgogICAgLyoqCiAgICAgKiBFeHBvcnRzIGFsbCB0aGUgYmFzaWMgQW5ndWxhciBkaXJlY3RpdmVzIGFuZCBwaXBlcywKICAgICAqIHN1Y2ggYXMgYE5nSWZgLCBgTmdGb3JPZmAsIGBEZWNpbWFsUGlwZWAsIGFuZCBzbyBvbi4KICAgICAqIFJlLWV4cG9ydGVkIGJ5IGBCcm93c2VyTW9kdWxlYCwgd2hpY2ggaXMgaW5jbHVkZWQgYXV0b21hdGljYWxseSBpbiB0aGUgcm9vdAogICAgICogYEFwcE1vZHVsZWAgd2hlbiB5b3UgY3JlYXRlIGEgbmV3IGFwcCB3aXRoIHRoZSBDTEkgYG5ld2AgY29tbWFuZC4KICAgICAqCiAgICAgKiAqIFRoZSBgcHJvdmlkZXJzYCBvcHRpb25zIGNvbmZpZ3VyZSB0aGUgTmdNb2R1bGUncyBpbmplY3RvciB0byBwcm92aWRlCiAgICAgKiBsb2NhbGl6YXRpb24gZGVwZW5kZW5jaWVzIHRvIG1lbWJlcnMuCiAgICAgKiAqIFRoZSBgZXhwb3J0c2Agb3B0aW9ucyBtYWtlIHRoZSBkZWNsYXJlZCBkaXJlY3RpdmVzIGFuZCBwaXBlcyBhdmFpbGFibGUgZm9yIGltcG9ydAogICAgICogYnkgb3RoZXIgTmdNb2R1bGVzLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIENvbW1vbk1vZHVsZSB7CiAgICB9CiAgICBDb21tb25Nb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBDb21tb25Nb2R1bGUgfSk7CiAgICBDb21tb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBDb21tb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29tbW9uTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgeyBwcm92aWRlOiBOZ0xvY2FsaXphdGlvbiwgdXNlQ2xhc3M6IE5nTG9jYWxlTG9jYWxpemF0aW9uIH0sCiAgICAgICAgXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKENvbW1vbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtOZ0NsYXNzLAogICAgICAgICAgICBOZ0NvbXBvbmVudE91dGxldCwKICAgICAgICAgICAgTmdGb3JPZiwKICAgICAgICAgICAgTmdJZiwKICAgICAgICAgICAgTmdUZW1wbGF0ZU91dGxldCwKICAgICAgICAgICAgTmdTdHlsZSwKICAgICAgICAgICAgTmdTd2l0Y2gsCiAgICAgICAgICAgIE5nU3dpdGNoQ2FzZSwKICAgICAgICAgICAgTmdTd2l0Y2hEZWZhdWx0LAogICAgICAgICAgICBOZ1BsdXJhbCwKICAgICAgICAgICAgTmdQbHVyYWxDYXNlLAogICAgICAgICAgICBBc3luY1BpcGUsCiAgICAgICAgICAgIFVwcGVyQ2FzZVBpcGUsCiAgICAgICAgICAgIExvd2VyQ2FzZVBpcGUsCiAgICAgICAgICAgIEpzb25QaXBlLAogICAgICAgICAgICBTbGljZVBpcGUsCiAgICAgICAgICAgIERlY2ltYWxQaXBlLAogICAgICAgICAgICBQZXJjZW50UGlwZSwKICAgICAgICAgICAgVGl0bGVDYXNlUGlwZSwKICAgICAgICAgICAgQ3VycmVuY3lQaXBlLAogICAgICAgICAgICBEYXRlUGlwZSwKICAgICAgICAgICAgSTE4blBsdXJhbFBpcGUsCiAgICAgICAgICAgIEkxOG5TZWxlY3RQaXBlLAogICAgICAgICAgICBLZXlWYWx1ZVBpcGVdLCBleHBvcnRzOiBbTmdDbGFzcywKICAgICAgICAgICAgTmdDb21wb25lbnRPdXRsZXQsCiAgICAgICAgICAgIE5nRm9yT2YsCiAgICAgICAgICAgIE5nSWYsCiAgICAgICAgICAgIE5nVGVtcGxhdGVPdXRsZXQsCiAgICAgICAgICAgIE5nU3R5bGUsCiAgICAgICAgICAgIE5nU3dpdGNoLAogICAgICAgICAgICBOZ1N3aXRjaENhc2UsCiAgICAgICAgICAgIE5nU3dpdGNoRGVmYXVsdCwKICAgICAgICAgICAgTmdQbHVyYWwsCiAgICAgICAgICAgIE5nUGx1cmFsQ2FzZSwKICAgICAgICAgICAgQXN5bmNQaXBlLAogICAgICAgICAgICBVcHBlckNhc2VQaXBlLAogICAgICAgICAgICBMb3dlckNhc2VQaXBlLAogICAgICAgICAgICBKc29uUGlwZSwKICAgICAgICAgICAgU2xpY2VQaXBlLAogICAgICAgICAgICBEZWNpbWFsUGlwZSwKICAgICAgICAgICAgUGVyY2VudFBpcGUsCiAgICAgICAgICAgIFRpdGxlQ2FzZVBpcGUsCiAgICAgICAgICAgIEN1cnJlbmN5UGlwZSwKICAgICAgICAgICAgRGF0ZVBpcGUsCiAgICAgICAgICAgIEkxOG5QbHVyYWxQaXBlLAogICAgICAgICAgICBJMThuU2VsZWN0UGlwZSwKICAgICAgICAgICAgS2V5VmFsdWVQaXBlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvcGxhdGZvcm1faWQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUExBVEZPUk1fQlJPV1NFUl9JRCA9ICdicm93c2VyJzsKICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIGEgcGxhdGZvcm0gaWQgcmVwcmVzZW50cyBhIGJyb3dzZXIgcGxhdGZvcm0uCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybUlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1BsYXRmb3JtQnJvd3NlcihwbGF0Zm9ybUlkKSB7CiAgICAgICAgcmV0dXJuIHBsYXRmb3JtSWQgPT09IFBMQVRGT1JNX0JST1dTRVJfSUQ7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vc3JjL3ZlcnNpb24udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFZFUlNJT04kMSA9IG5ldyBWZXJzaW9uKCc5LjEuMTInKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9zcmMvdmlld3BvcnRfc2Nyb2xsZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZpbmVzIGEgc2Nyb2xsIHBvc2l0aW9uIG1hbmFnZXIuIEltcGxlbWVudGVkIGJ5IGBCcm93c2VyVmlld3BvcnRTY3JvbGxlcmAuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBWaWV3cG9ydFNjcm9sbGVyIHsKICAgIH0KICAgIC8vIERlLXN1Z2FyZWQgdHJlZS1zaGFrYWJsZSBpbmplY3Rpb24KICAgIC8vIFNlZSAjMjM5MTcKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgVmlld3BvcnRTY3JvbGxlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7CiAgICAgICAgdG9rZW46IFZpZXdwb3J0U2Nyb2xsZXIsCiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IG5ldyBCcm93c2VyVmlld3BvcnRTY3JvbGxlcijJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCB3aW5kb3csIMm1ybVpbmplY3QoRXJyb3JIYW5kbGVyKSkpCiAgICB9KTsKICAgIC8qKgogICAgICogTWFuYWdlcyB0aGUgc2Nyb2xsIHBvc2l0aW9uIGZvciBhIGJyb3dzZXIgd2luZG93LgogICAgICovCiAgICBjbGFzcyBCcm93c2VyVmlld3BvcnRTY3JvbGxlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7P30gd2luZG93CiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvckhhbmRsZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCwgd2luZG93LCBlcnJvckhhbmRsZXIpIHsKICAgICAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgICAgICB0aGlzLndpbmRvdyA9IHdpbmRvdzsKICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gWzAsIDBdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uZmlndXJlcyB0aGUgdG9wIG9mZnNldCB1c2VkIHdoZW4gc2Nyb2xsaW5nIHRvIGFuIGFuY2hvci4KICAgICAgICAgKiBAcGFyYW0gez99IG9mZnNldCBBIHBvc2l0aW9uIGluIHNjcmVlbiBjb29yZGluYXRlcyAoYSB0dXBsZSB3aXRoIHggYW5kIHkgdmFsdWVzKQogICAgICAgICAqIG9yIGEgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSB0b3Agb2Zmc2V0IHBvc2l0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRPZmZzZXQob2Zmc2V0KSB7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KG9mZnNldCkpIHsKICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gb2Zmc2V0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBzY3JvbGwgcG9zaXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIHBvc2l0aW9uIGluIHNjcmVlbiBjb29yZGluYXRlcy4KICAgICAgICAgKi8KICAgICAgICBnZXRTY3JvbGxQb3NpdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBbdGhpcy53aW5kb3cuc2Nyb2xsWCwgdGhpcy53aW5kb3cuc2Nyb2xsWV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gWzAsIDBdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHNjcm9sbCBwb3NpdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uIFRoZSBuZXcgcG9zaXRpb24gaW4gc2NyZWVuIGNvb3JkaW5hdGVzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsVG9Qb3NpdGlvbihwb3NpdGlvbikgewogICAgICAgICAgICBpZiAodGhpcy5zdXBwb3J0U2Nyb2xsUmVzdG9yYXRpb24oKSkgewogICAgICAgICAgICAgICAgdGhpcy53aW5kb3cuc2Nyb2xsVG8ocG9zaXRpb25bMF0sIHBvc2l0aW9uWzFdKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTY3JvbGxzIHRvIGFuIGFuY2hvciBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gYW5jaG9yIFRoZSBJRCBvZiB0aGUgYW5jaG9yIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzY3JvbGxUb0FuY2hvcihhbmNob3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkpIHsKICAgICAgICAgICAgICAgIC8vIEVzY2FwZSBhbnl0aGluZyBwYXNzZWQgdG8gYHF1ZXJ5U2VsZWN0b3JgIGFzIGl0IGNhbiB0aHJvdyBlcnJvcnMgYW5kIHN0b3AgdGhlIGFwcGxpY2F0aW9uCiAgICAgICAgICAgICAgICAvLyBmcm9tIHdvcmtpbmcgaWYgaW52YWxpZCB2YWx1ZXMgYXJlIHBhc3NlZC4KICAgICAgICAgICAgICAgIGlmICh0aGlzLndpbmRvdy5DU1MgJiYgdGhpcy53aW5kb3cuQ1NTLmVzY2FwZSkgewogICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IHRoaXMud2luZG93LkNTUy5lc2NhcGUoYW5jaG9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGFuY2hvciA9IGFuY2hvci5yZXBsYWNlKC8oXCJ8XCdcIHw6fFwufFxbfFxdfCx8PSkvZywgJ1xcJDEnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsU2VsZWN0ZWRCeUlkID0gdGhpcy5kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGAjJHthbmNob3J9YCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsU2VsZWN0ZWRCeUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsVG9FbGVtZW50KGVsU2VsZWN0ZWRCeUlkKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxTZWxlY3RlZEJ5TmFtZSA9IHRoaXMuZG9jdW1lbnQucXVlcnlTZWxlY3RvcihgW25hbWU9JyR7YW5jaG9yfSddYCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsU2VsZWN0ZWRCeU5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoZWxTZWxlY3RlZEJ5TmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIGF1dG9tYXRpYyBzY3JvbGwgcmVzdG9yYXRpb24gcHJvdmlkZWQgYnkgdGhlIGJyb3dzZXIuCiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxSZXN0b3JhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0SGlzdG9yeVNjcm9sbFJlc3RvcmF0aW9uKHNjcm9sbFJlc3RvcmF0aW9uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnN1cHBvcnRTY3JvbGxSZXN0b3JhdGlvbigpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBoaXN0b3J5ID0gdGhpcy53aW5kb3cuaGlzdG9yeTsKICAgICAgICAgICAgICAgIGlmIChoaXN0b3J5ICYmIGhpc3Rvcnkuc2Nyb2xsUmVzdG9yYXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBoaXN0b3J5LnNjcm9sbFJlc3RvcmF0aW9uID0gc2Nyb2xsUmVzdG9yYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzY3JvbGxUb0VsZW1lbnQoZWwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWN0ID0gZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGVmdCA9IHJlY3QubGVmdCArIHRoaXMud2luZG93LnBhZ2VYT2Zmc2V0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRvcCA9IHJlY3QudG9wICsgdGhpcy53aW5kb3cucGFnZVlPZmZzZXQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gdGhpcy5vZmZzZXQoKTsKICAgICAgICAgICAgdGhpcy53aW5kb3cuc2Nyb2xsVG8obGVmdCAtIG9mZnNldFswXSwgdG9wIC0gb2Zmc2V0WzFdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2Ugb25seSBzdXBwb3J0IHNjcm9sbCByZXN0b3JhdGlvbiB3aGVuIHdlIGNhbiBnZXQgYSBob2xkIG9mIHdpbmRvdy4KICAgICAgICAgKiBUaGlzIG1lYW5zIHRoYXQgd2UgZG8gbm90IHN1cHBvcnQgdGhpcyBiZWhhdmlvciB3aGVuIHJ1bm5pbmcgaW4gYSB3ZWIgd29ya2VyLgogICAgICAgICAqCiAgICAgICAgICogTGlmdGluZyB0aGlzIHJlc3RyaWN0aW9uIHJpZ2h0IG5vdyB3b3VsZCByZXF1aXJlIG1vcmUgY2hhbmdlcyBpbiB0aGUgZG9tIGFkYXB0ZXIuCiAgICAgICAgICogU2luY2Ugd2Vid29ya2VycyBhcmVuJ3Qgd2lkZWx5IHVzZWQsIHdlIHdpbGwgbGlmdCBpdCBvbmNlIFJvdXRlclNjcm9sbGVyIGlzCiAgICAgICAgICogYmF0dGxlLXRlc3RlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydFNjcm9sbFJlc3RvcmF0aW9uKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgcmV0dXJuICEhdGhpcy53aW5kb3cgJiYgISF0aGlzLndpbmRvdy5zY3JvbGxUbzsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjkuMS4xMgogICAgICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvYnJvd3Nlci9nZW5lcmljX2Jyb3dzZXJfYWRhcHRlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFByb3ZpZGVzIERPTSBvcGVyYXRpb25zIGluIGFueSBicm93c2VyIGVudmlyb25tZW50LgogICAgICoKICAgICAqIFxAc2VjdXJpdHkgVHJlYWQgY2FyZWZ1bGx5ISBJbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZGlyZWN0bHkgaXMgZGFuZ2Vyb3VzIGFuZAogICAgICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyIGV4dGVuZHMgRG9tQWRhcHRlciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydHNET01FdmVudHMoKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvYnJvd3Nlcl9hZGFwdGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IMm1MCQ1ID0gLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7CiAgICAgICAgaWYgKF9nbG9iYWxbJ05vZGUnXSkgewogICAgICAgICAgICByZXR1cm4gX2dsb2JhbFsnTm9kZSddLnByb3RvdHlwZS5jb250YWlucyB8fCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChub2RlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gISEodGhpcy5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihub2RlKSAmIDE2KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodW5kZWZpbmVkKSk7CiAgICB9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgbm9kZUNvbnRhaW5zID0gKCjJtTAkNSkpKCk7CiAgICAvKioKICAgICAqIEEgYERvbUFkYXB0ZXJgIHBvd2VyZWQgYnkgZnVsbCBicm93c2VyIERPTSBBUElzLgogICAgICoKICAgICAqIFxAc2VjdXJpdHkgVHJlYWQgY2FyZWZ1bGx5ISBJbnRlcmFjdGluZyB3aXRoIHRoZSBET00gZGlyZWN0bHkgaXMgZGFuZ2Vyb3VzIGFuZAogICAgICogY2FuIGludHJvZHVjZSBYU1Mgcmlza3MuCiAgICAgKi8KICAgIC8qIHRzbGludDpkaXNhYmxlOnJlcXVpcmVQYXJhbWV0ZXJUeXBlIG5vLWNvbnNvbGUgKi8KICAgIGNsYXNzIEJyb3dzZXJEb21BZGFwdGVyIGV4dGVuZHMgR2VuZXJpY0Jyb3dzZXJEb21BZGFwdGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBtYWtlQ3VycmVudCgpIHsKICAgICAgICAgICAgc2V0Um9vdERvbUFkYXB0ZXIobmV3IEJyb3dzZXJEb21BZGFwdGVyKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRQcm9wZXJ0eShlbCwgbmFtZSkgewogICAgICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChlbCkpKVtuYW1lXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbG9nKGVycm9yKSB7CiAgICAgICAgICAgIGlmICh3aW5kb3cuY29uc29sZSkgewogICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUubG9nICYmIHdpbmRvdy5jb25zb2xlLmxvZyhlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbG9nR3JvdXAoZXJyb3IpIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZS5ncm91cCAmJiB3aW5kb3cuY29uc29sZS5ncm91cChlcnJvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsb2dHcm91cEVuZCgpIHsKICAgICAgICAgICAgaWYgKHdpbmRvdy5jb25zb2xlKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZS5ncm91cEVuZCAmJiB3aW5kb3cuY29uc29sZS5ncm91cEVuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAgICAgKiBAcGFyYW0gez99IGV2dAogICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQW5kQ2FuY2VsKGVsLCBldnQsIGxpc3RlbmVyKSB7CiAgICAgICAgICAgIGVsLmFkZEV2ZW50TGlzdGVuZXIoZXZ0LCBsaXN0ZW5lciwgZmFsc2UpOwogICAgICAgICAgICAvLyBOZWVkZWQgdG8gZm9sbG93IERhcnQncyBzdWJzY3JpcHRpb24gc2VtYW50aWMsIHVudGlsIGZpeCBvZgogICAgICAgICAgICAvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhcnQvaXNzdWVzL2RldGFpbD9pZD0xNzQwNgogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgZWwucmVtb3ZlRXZlbnRMaXN0ZW5lcihldnQsIGxpc3RlbmVyLCBmYWxzZSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBldnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpc3BhdGNoRXZlbnQoZWwsIGV2dCkgewogICAgICAgICAgICBlbC5kaXNwYXRjaEV2ZW50KGV2dCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlKG5vZGUpIHsKICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgbm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG5vZGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBub2RlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRWYWx1ZShlbCkgewogICAgICAgICAgICByZXR1cm4gZWwudmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGFnTmFtZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRvYwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlRWxlbWVudCh0YWdOYW1lLCBkb2MpIHsKICAgICAgICAgICAgZG9jID0gZG9jIHx8IHRoaXMuZ2V0RGVmYXVsdERvY3VtZW50KCk7CiAgICAgICAgICAgIHJldHVybiBkb2MuY3JlYXRlRWxlbWVudCh0YWdOYW1lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVIdG1sRG9jdW1lbnQoKSB7CiAgICAgICAgICAgIHJldHVybiBkb2N1bWVudC5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoJ2Zha2VUaXRsZScpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldERlZmF1bHREb2N1bWVudCgpIHsKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzRWxlbWVudE5vZGUobm9kZSkgewogICAgICAgICAgICByZXR1cm4gbm9kZS5ub2RlVHlwZSA9PT0gTm9kZS5FTEVNRU5UX05PREU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaXNTaGFkb3dSb290KG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUgaW5zdGFuY2VvZiBEb2N1bWVudEZyYWdtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRvYwogICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRHbG9iYWxFdmVudFRhcmdldChkb2MsIHRhcmdldCkgewogICAgICAgICAgICBpZiAodGFyZ2V0ID09PSAnd2luZG93JykgewogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGFyZ2V0ID09PSAnZG9jdW1lbnQnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0YXJnZXQgPT09ICdib2R5JykgewogICAgICAgICAgICAgICAgcmV0dXJuIGRvYy5ib2R5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEhpc3RvcnkoKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3cuaGlzdG9yeTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRMb2NhdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEJhc2VIcmVmKGRvYykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhyZWYgPSBnZXRCYXNlRWxlbWVudEhyZWYoKTsKICAgICAgICAgICAgcmV0dXJuIGhyZWYgPT0gbnVsbCA/IG51bGwgOiByZWxhdGl2ZVBhdGgoaHJlZik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzZXRCYXNlRWxlbWVudCgpIHsKICAgICAgICAgICAgYmFzZUVsZW1lbnQgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFVzZXJBZ2VudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBlcmZvcm1hbmNlTm93KCkgewogICAgICAgICAgICAvLyBwZXJmb3JtYW5jZS5ub3coKSBpcyBub3QgYXZhaWxhYmxlIGluIGFsbCBicm93c2Vycywgc2VlCiAgICAgICAgICAgIC8vIGh0dHA6Ly9jYW5pdXNlLmNvbS8jc2VhcmNoPXBlcmZvcm1hbmNlLm5vdwogICAgICAgICAgICByZXR1cm4gd2luZG93LnBlcmZvcm1hbmNlICYmIHdpbmRvdy5wZXJmb3JtYW5jZS5ub3cgPyB3aW5kb3cucGVyZm9ybWFuY2Uubm93KCkgOgogICAgICAgICAgICAgICAgbmV3IERhdGUoKS5nZXRUaW1lKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydHNDb29raWVzKCkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRDb29raWUobmFtZSkgewogICAgICAgICAgICByZXR1cm4gcGFyc2VDb29raWVWYWx1ZShkb2N1bWVudC5jb29raWUsIG5hbWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBiYXNlRWxlbWVudCA9IG51bGw7CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEJhc2VFbGVtZW50SHJlZigpIHsKICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgIGJhc2VFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2Jhc2UnKSkpOwogICAgICAgICAgICBpZiAoIWJhc2VFbGVtZW50KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gYmFzZUVsZW1lbnQuZ2V0QXR0cmlidXRlKCdocmVmJyk7CiAgICB9CiAgICAvLyBiYXNlZCBvbiB1cmxVdGlscy5qcyBpbiBBbmd1bGFySlMgMQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHVybFBhcnNpbmdOb2RlOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHVybAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVsYXRpdmVQYXRoKHVybCkgewogICAgICAgIGlmICghdXJsUGFyc2luZ05vZGUpIHsKICAgICAgICAgICAgdXJsUGFyc2luZ05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdhJyk7CiAgICAgICAgfQogICAgICAgIHVybFBhcnNpbmdOb2RlLnNldEF0dHJpYnV0ZSgnaHJlZicsIHVybCk7CiAgICAgICAgcmV0dXJuICh1cmxQYXJzaW5nTm9kZS5wYXRobmFtZS5jaGFyQXQoMCkgPT09ICcvJykgPyB1cmxQYXJzaW5nTm9kZS5wYXRobmFtZSA6CiAgICAgICAgICAgICcvJyArIHVybFBhcnNpbmdOb2RlLnBhdGhuYW1lOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvYnJvd3Nlci9zZXJ2ZXItdHJhbnNpdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuIGlkIHRoYXQgaWRlbnRpZmllcyBhIHBhcnRpY3VsYXIgYXBwbGljYXRpb24gYmVpbmcgYm9vdHN0cmFwcGVkLCB0aGF0IHNob3VsZAogICAgICogbWF0Y2ggYWNyb3NzIHRoZSBjbGllbnQvc2VydmVyIGJvdW5kYXJ5LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFRSQU5TSVRJT05fSUQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1RSQU5TSVRJT05fSUQnKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0cmFuc2l0aW9uSWQKICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAqIEBwYXJhbSB7P30gaW5qZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGFwcEluaXRpYWxpemVyRmFjdG9yeSh0cmFuc2l0aW9uSWQsIGRvY3VtZW50LCBpbmplY3RvcikgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIC8vIFdhaXQgZm9yIGFsbCBhcHBsaWNhdGlvbiBpbml0aWFsaXplcnMgdG8gYmUgY29tcGxldGVkIGJlZm9yZSByZW1vdmluZyB0aGUgc3R5bGVzIHNldCBieQogICAgICAgICAgICAvLyB0aGUgc2VydmVyLgogICAgICAgICAgICBpbmplY3Rvci5nZXQoQXBwbGljYXRpb25Jbml0U3RhdHVzKS5kb25lUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRvbSA9IGdldERPTSgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmFwcGx5KGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoYHN0eWxlW25nLXRyYW5zaXRpb25dYCkpOwogICAgICAgICAgICAgICAgc3R5bGVzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlbCA9PiBlbC5nZXRBdHRyaWJ1dGUoJ25nLXRyYW5zaXRpb24nKSA9PT0gdHJhbnNpdGlvbklkKSkKICAgICAgICAgICAgICAgICAgICAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlbCA9PiBkb20ucmVtb3ZlKGVsKSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTRVJWRVJfVFJBTlNJVElPTl9QUk9WSURFUlMgPSBbCiAgICAgICAgewogICAgICAgICAgICBwcm92aWRlOiBBUFBfSU5JVElBTElaRVIsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGFwcEluaXRpYWxpemVyRmFjdG9yeSwKICAgICAgICAgICAgZGVwczogW1RSQU5TSVRJT05fSUQsIERPQ1VNRU5UJDEsIEluamVjdG9yXSwKICAgICAgICAgICAgbXVsdGk6IHRydWUKICAgICAgICB9LAogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvdGVzdGFiaWxpdHkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQnJvd3NlckdldFRlc3RhYmlsaXR5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBpbml0KCkgewogICAgICAgICAgICBzZXRUZXN0YWJpbGl0eUdldHRlcihuZXcgQnJvd3NlckdldFRlc3RhYmlsaXR5KCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRUb1dpbmRvdyhyZWdpc3RyeSkgewogICAgICAgICAgICBfZ2xvYmFsWydnZXRBbmd1bGFyVGVzdGFiaWxpdHknXSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGZpbmRJbkFuY2VzdG9ycwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyA9IHRydWUpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRlc3RhYmlsaXR5ID0gcmVnaXN0cnkuZmluZFRlc3RhYmlsaXR5SW5UcmVlKGVsZW0sIGZpbmRJbkFuY2VzdG9ycyk7CiAgICAgICAgICAgICAgICBpZiAodGVzdGFiaWxpdHkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ291bGQgbm90IGZpbmQgdGVzdGFiaWxpdHkgZm9yIGVsZW1lbnQuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGVzdGFiaWxpdHk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBfZ2xvYmFsWydnZXRBbGxBbmd1bGFyVGVzdGFiaWxpdGllcyddID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gcmVnaXN0cnkuZ2V0QWxsVGVzdGFiaWxpdGllcygpKTsKICAgICAgICAgICAgX2dsb2JhbFsnZ2V0QWxsQW5ndWxhclJvb3RFbGVtZW50cyddID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gcmVnaXN0cnkuZ2V0QWxsUm9vdEVsZW1lbnRzKCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdoZW5BbGxTdGFibGUgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjYWxsYmFjayAvKiogVE9ETyAjOTEwMCAqLykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdGVzdGFiaWxpdGllcyA9IF9nbG9iYWxbJ2dldEFsbEFuZ3VsYXJUZXN0YWJpbGl0aWVzJ10oKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBjb3VudCA9IHRlc3RhYmlsaXRpZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGRpZFdvcmsgPSBmYWxzZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRlY3JlbWVudCA9ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlkV29ya18KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChkaWRXb3JrXyAvKiogVE9ETyAjOTEwMCAqLykgewogICAgICAgICAgICAgICAgICAgIGRpZFdvcmsgPSBkaWRXb3JrIHx8IGRpZFdvcmtfOwogICAgICAgICAgICAgICAgICAgIGNvdW50LS07CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvdW50ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soZGlkV29yayk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB0ZXN0YWJpbGl0aWVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZXN0YWJpbGl0eQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnVuY3Rpb24gKHRlc3RhYmlsaXR5IC8qKiBUT0RPICM5MTAwICovKSB7CiAgICAgICAgICAgICAgICAgICAgdGVzdGFiaWxpdHkud2hlblN0YWJsZShkZWNyZW1lbnQpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgaWYgKCFfZ2xvYmFsWydmcmFtZXdvcmtTdGFiaWxpemVycyddKSB7CiAgICAgICAgICAgICAgICBfZ2xvYmFsWydmcmFtZXdvcmtTdGFiaWxpemVycyddID0gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2dsb2JhbFsnZnJhbWV3b3JrU3RhYmlsaXplcnMnXS5wdXNoKHdoZW5BbGxTdGFibGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5CiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtCiAgICAgICAgICogQHBhcmFtIHs/fSBmaW5kSW5BbmNlc3RvcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmRUZXN0YWJpbGl0eUluVHJlZShyZWdpc3RyeSwgZWxlbSwgZmluZEluQW5jZXN0b3JzKSB7CiAgICAgICAgICAgIGlmIChlbGVtID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdCA9IHJlZ2lzdHJ5LmdldFRlc3RhYmlsaXR5KGVsZW0pOwogICAgICAgICAgICBpZiAodCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghZmluZEluQW5jZXN0b3JzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZ2V0RE9NKCkuaXNTaGFkb3dSb290KGVsZW0pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksICgoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbSkpKS5ob3N0LCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kVGVzdGFiaWxpdHlJblRyZWUocmVnaXN0cnksIGVsZW0ucGFyZW50RWxlbWVudCwgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeHBvcnRzIHRoZSB2YWx1ZSB1bmRlciBhIGdpdmVuIGBuYW1lYCBpbiB0aGUgZ2xvYmFsIHByb3BlcnR5IGBuZ2AuIEZvciBleGFtcGxlIGBuZy5wcm9iZWAgaWYKICAgICAqIGBuYW1lYCBpcyBgJ3Byb2JlJ2AuCiAgICAgKiBAcGFyYW0gez99IG5hbWUgTmFtZSB1bmRlciB3aGljaCBpdCB3aWxsIGJlIGV4cG9ydGVkLiBLZWVwIGluIG1pbmQgdGhpcyB3aWxsIGJlIGEgcHJvcGVydHkgb2YgdGhlCiAgICAgKiBnbG9iYWwgYG5nYCBvYmplY3QuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBleHBvcnQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBleHBvcnROZ1ZhcihuYW1lLCB2YWx1ZSkgewogICAgICAgIGlmICh0eXBlb2YgQ09NUElMRUQgPT09ICd1bmRlZmluZWQnIHx8ICFDT01QSUxFRCkgewogICAgICAgICAgICAvLyBOb3RlOiB3ZSBjYW4ndCBleHBvcnQgYG5nYCB3aGVuIHVzaW5nIGNsb3N1cmUgZW5oYW5jZWQgb3B0aW1pemF0aW9uIGFzOgogICAgICAgICAgICAvLyAtIGNsb3N1cmUgZGVjbGFyZXMgZ2xvYmFscyBpdHNlbGYgZm9yIG1pbmlmaWVkIG5hbWVzLCB3aGljaCBzb21ldGltZXMgY2xvYmJlciBvdXIgYG5nYCBnbG9iYWwKICAgICAgICAgICAgLy8gLSB3ZSBjYW4ndCBkZWNsYXJlIGEgY2xvc3VyZSBleHRlcm4gYXMgdGhlIG5hbWVzcGFjZSBgbmdgIGlzIGFscmVhZHkgdXNlZCB3aXRoaW4gR29vZ2xlCiAgICAgICAgICAgIC8vICAgZm9yIHR5cGluZ3MgZm9yIGFuZ3VsYXJKUyAodmlhIGBnb29nLnByb3ZpZGUoJ25nLi4uLicpYCkuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmcgPSBfZ2xvYmFsWyduZyddID0gKCgvKiogQHR5cGUgez99ICovIChfZ2xvYmFsWyduZyddKSkpIHx8IHt9OwogICAgICAgICAgICBuZ1tuYW1lXSA9IHZhbHVlOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9kZWJ1Zy9uZ19wcm9iZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCDJtTAkMSQxID0gLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiAoewogICAgICAgICdBcHBsaWNhdGlvblJlZic6IEFwcGxpY2F0aW9uUmVmLAogICAgICAgICdOZ1pvbmUnOiBOZ1pvbmUsCiAgICB9KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IENPUkVfVE9LRU5TID0gKCjJtTAkMSQxKSkoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IElOU1BFQ1RfR0xPQkFMX05BTUUgPSAncHJvYmUnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQ09SRV9UT0tFTlNfR0xPQkFMX05BTUUgPSAnY29yZVRva2Vucyc7CiAgICAvKioKICAgICAqIFJldHVybnMgYSB7XEBsaW5rIERlYnVnRWxlbWVudH0gZm9yIHRoZSBnaXZlbiBuYXRpdmUgRE9NIGVsZW1lbnQsIG9yCiAgICAgKiBudWxsIGlmIHRoZSBnaXZlbiBuYXRpdmUgZWxlbWVudCBkb2VzIG5vdCBoYXZlIGFuIEFuZ3VsYXIgdmlldyBhc3NvY2lhdGVkCiAgICAgKiB3aXRoIGl0LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnNwZWN0TmF0aXZlRWxlbWVudFIyKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gZ2V0RGVidWdOb2RlUjIoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb3JlVG9rZW5zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfY3JlYXRlTmdQcm9iZVIyKGNvcmVUb2tlbnMpIHsKICAgICAgICBleHBvcnROZ1ZhcihJTlNQRUNUX0dMT0JBTF9OQU1FLCBpbnNwZWN0TmF0aXZlRWxlbWVudFIyKTsKICAgICAgICBleHBvcnROZ1ZhcihDT1JFX1RPS0VOU19HTE9CQUxfTkFNRSwgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBDT1JFX1RPS0VOUyksIF9uZ1Byb2JlVG9rZW5zVG9NYXAoY29yZVRva2VucyB8fCBbXSkpKTsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gaW5zcGVjdE5hdGl2ZUVsZW1lbnRSMik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW5zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfbmdQcm9iZVRva2Vuc1RvTWFwKHRva2VucykgewogICAgICAgIHJldHVybiB0b2tlbnMucmVkdWNlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByZXYKICAgICAgICAgKiBAcGFyYW0gez99IHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChwcmV2LCB0KSA9PiAocHJldlt0Lm5hbWVdID0gdC50b2tlbiwgcHJldikpLCB7fSk7CiAgICB9CiAgICAvKioKICAgICAqIEluIEl2eSwgd2UgZG9uJ3Qgc3VwcG9ydCBOZ1Byb2JlIGJlY2F1c2Ugd2UgaGF2ZSBvdXIgb3duIHNldCBvZiB0ZXN0aW5nIHV0aWxpdGllcwogICAgICogd2l0aCBtb3JlIHJvYnVzdCBmdW5jdGlvbmFsaXR5LgogICAgICoKICAgICAqIFdlIHNob3VsZG4ndCBicmluZyBpbiBOZ1Byb2JlIGJlY2F1c2UgaXQgcHJldmVudHMgRGVidWdOb2RlIGFuZCBmcmllbmRzIGZyb20KICAgICAqIHRyZWUtc2hha2luZyBwcm9wZXJseS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBFTEVNRU5UX1BST0JFX1BST1ZJREVSU19fUE9TVF9SM19fID0gW107CiAgICAvKioKICAgICAqIFByb3ZpZGVycyB3aGljaCBzdXBwb3J0IGRlYnVnZ2luZyBBbmd1bGFyIGFwcGxpY2F0aW9ucyAoZS5nLiB2aWEgYG5nLnByb2JlYCkuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlNfX1BSRV9SM19fID0gWwogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogQVBQX0lOSVRJQUxJWkVSLAogICAgICAgICAgICB1c2VGYWN0b3J5OiBfY3JlYXRlTmdQcm9iZVIyLAogICAgICAgICAgICBkZXBzOiBbCiAgICAgICAgICAgICAgICBbTmdQcm9iZVRva2VuLCBuZXcgT3B0aW9uYWwoKV0sCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgIH0sCiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlMgPSBFTEVNRU5UX1BST0JFX1BST1ZJREVSU19fUE9TVF9SM19fOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2V2ZW50cy9ldmVudF9tYW5hZ2VyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhlIGluamVjdGlvbiB0b2tlbiBmb3IgdGhlIGV2ZW50LW1hbmFnZXIgcGx1Zy1pbiBzZXJ2aWNlLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgRVZFTlRfTUFOQUdFUl9QTFVHSU5TID0gbmV3IEluamVjdGlvblRva2VuKCdFdmVudE1hbmFnZXJQbHVnaW5zJyk7CiAgICAvKioKICAgICAqIEFuIGluamVjdGFibGUgc2VydmljZSB0aGF0IHByb3ZpZGVzIGV2ZW50IG1hbmFnZW1lbnQgZm9yIEFuZ3VsYXIKICAgICAqIHRocm91Z2ggYSBicm93c2VyIHBsdWctaW4uCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgRXZlbnRNYW5hZ2VyIHsKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXZlbnQtbWFuYWdlciBzZXJ2aWNlLgogICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2lucwogICAgICAgICAqIEBwYXJhbSB7P30gX3pvbmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihwbHVnaW5zLCBfem9uZSkgewogICAgICAgICAgICB0aGlzLl96b25lID0gX3pvbmU7CiAgICAgICAgICAgIHRoaXMuX2V2ZW50TmFtZVRvUGx1Z2luID0gbmV3IE1hcCgpOwogICAgICAgICAgICBwbHVnaW5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwID0+IHAubWFuYWdlciA9IHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5fcGx1Z2lucyA9IHBsdWdpbnMuc2xpY2UoKS5yZXZlcnNlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCBhbmQgZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgVGhlIEhUTUwgZWxlbWVudCB0byByZWNlaXZlIGV2ZW50IG5vdGlmaWNhdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUgVGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBub3RpZmljYXRpb24gb2NjdXJzLiBSZWNlaXZlcyB0aGUKICAgICAgICAgKiBldmVudCBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGUgaGFuZGxlci4KICAgICAgICAgKi8KICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHRoaXMuX2ZpbmRQbHVnaW5Gb3IoZXZlbnROYW1lKTsKICAgICAgICAgICAgcmV0dXJuIHBsdWdpbi5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGdsb2JhbCBoYW5kbGVyIGZvciBhbiBldmVudCBpbiBhIHRhcmdldCB2aWV3LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXQgQSB0YXJnZXQgZm9yIGdsb2JhbCBldmVudCBub3RpZmljYXRpb25zLiBPbmUgb2YgIndpbmRvdyIsICJkb2N1bWVudCIsIG9yICJib2R5Ii4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUgZXZlbnQgdG8gbGlzdGVuIGZvci4KICAgICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIgQSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIG5vdGlmaWNhdGlvbiBvY2N1cnMuIFJlY2VpdmVzIHRoZQogICAgICAgICAqIGV2ZW50IG9iamVjdCBhcyBhbiBhcmd1bWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIHRoZSBoYW5kbGVyLgogICAgICAgICAqLwogICAgICAgIGFkZEdsb2JhbEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLl9maW5kUGx1Z2luRm9yKGV2ZW50TmFtZSk7CiAgICAgICAgICAgIHJldHVybiBwbHVnaW4uYWRkR2xvYmFsRXZlbnRMaXN0ZW5lcih0YXJnZXQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgY29tcGlsYXRpb24gem9uZSBpbiB3aGljaCBldmVudCBsaXN0ZW5lcnMgYXJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRab25lKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmluZFBsdWdpbkZvcihldmVudE5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbHVnaW4gPSB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5nZXQoZXZlbnROYW1lKTsKICAgICAgICAgICAgaWYgKHBsdWdpbikgewogICAgICAgICAgICAgICAgcmV0dXJuIHBsdWdpbjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsdWdpbnMgPSB0aGlzLl9wbHVnaW5zOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBsdWdpbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsdWdpbiA9IHBsdWdpbnNbaV07CiAgICAgICAgICAgICAgICBpZiAocGx1Z2luLnN1cHBvcnRzKGV2ZW50TmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9ldmVudE5hbWVUb1BsdWdpbi5zZXQoZXZlbnROYW1lLCBwbHVnaW4pOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBwbHVnaW47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBldmVudCBtYW5hZ2VyIHBsdWdpbiBmb3VuZCBmb3IgZXZlbnQgJHtldmVudE5hbWV9YCk7CiAgICAgICAgfQogICAgfQogICAgRXZlbnRNYW5hZ2VyLsm1ZmFjID0gZnVuY3Rpb24gRXZlbnRNYW5hZ2VyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEV2ZW50TWFuYWdlcikoybXJtWluamVjdChFVkVOVF9NQU5BR0VSX1BMVUdJTlMpLCDJtcm1aW5qZWN0KE5nWm9uZSkpOyB9OwogICAgRXZlbnRNYW5hZ2VyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEV2ZW50TWFuYWdlciwgZmFjdG9yeTogRXZlbnRNYW5hZ2VyLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBFdmVudE1hbmFnZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRVZFTlRfTUFOQUdFUl9QTFVHSU5TLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9CiAgICBdOwogICAgLyoqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2MKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgICAgIHRoaXMuX2RvYyA9IF9kb2M7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBoYW5kbGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRHbG9iYWxFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGdldERPTSgpLmdldEdsb2JhbEV2ZW50VGFyZ2V0KHRoaXMuX2RvYywgZWxlbWVudCk7CiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuc3VwcG9ydGVkIGV2ZW50IHRhcmdldCAke3RhcmdldH0gZm9yIGV2ZW50ICR7ZXZlbnROYW1lfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFkZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudE5hbWUsIGhhbmRsZXIpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2RvbS9zaGFyZWRfc3R5bGVzX2hvc3QudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgU2hhcmVkU3R5bGVzSG9zdCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zdHlsZXNTZXQgPSBuZXcgU2V0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRTdHlsZXMoc3R5bGVzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWRkaXRpb25zID0gbmV3IFNldCgpOwogICAgICAgICAgICBzdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0eWxlID0+IHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fc3R5bGVzU2V0LmhhcyhzdHlsZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZXNTZXQuYWRkKHN0eWxlKTsKICAgICAgICAgICAgICAgICAgICBhZGRpdGlvbnMuYWRkKHN0eWxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLm9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhZGRpdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU3R5bGVzQWRkZWQoYWRkaXRpb25zKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEFsbFN0eWxlcygpIHsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5fc3R5bGVzU2V0KTsKICAgICAgICB9CiAgICB9CiAgICBTaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjID0gZnVuY3Rpb24gU2hhcmVkU3R5bGVzSG9zdF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTaGFyZWRTdHlsZXNIb3N0KSgpOyB9OwogICAgU2hhcmVkU3R5bGVzSG9zdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTaGFyZWRTdHlsZXNIb3N0LCBmYWN0b3J5OiBTaGFyZWRTdHlsZXNIb3N0Lsm1ZmFjIH0pOwogICAgY2xhc3MgRG9tU2hhcmVkU3R5bGVzSG9zdCBleHRlbmRzIFNoYXJlZFN0eWxlc0hvc3QgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fZG9jID0gX2RvYzsKICAgICAgICAgICAgdGhpcy5faG9zdE5vZGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICB0aGlzLl9zdHlsZU5vZGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICB0aGlzLl9ob3N0Tm9kZXMuYWRkKF9kb2MuaGVhZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAgICAgKiBAcGFyYW0gez99IGhvc3QKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hZGRTdHlsZXNUb0hvc3Qoc3R5bGVzLCBob3N0KSB7CiAgICAgICAgICAgIHN0eWxlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHN0eWxlKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdHlsZUVsID0gdGhpcy5fZG9jLmNyZWF0ZUVsZW1lbnQoJ3N0eWxlJyk7CiAgICAgICAgICAgICAgICBzdHlsZUVsLnRleHRDb250ZW50ID0gc3R5bGU7CiAgICAgICAgICAgICAgICB0aGlzLl9zdHlsZU5vZGVzLmFkZChob3N0LmFwcGVuZENoaWxkKHN0eWxlRWwpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGhvc3ROb2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRIb3N0KGhvc3ROb2RlKSB7CiAgICAgICAgICAgIHRoaXMuX2FkZFN0eWxlc1RvSG9zdCh0aGlzLl9zdHlsZXNTZXQsIGhvc3ROb2RlKTsKICAgICAgICAgICAgdGhpcy5faG9zdE5vZGVzLmFkZChob3N0Tm9kZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZUhvc3QoaG9zdE5vZGUpIHsKICAgICAgICAgICAgdGhpcy5faG9zdE5vZGVzLmRlbGV0ZShob3N0Tm9kZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWRkaXRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblN0eWxlc0FkZGVkKGFkZGl0aW9ucykgewogICAgICAgICAgICB0aGlzLl9ob3N0Tm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaG9zdE5vZGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGhvc3ROb2RlID0+IHRoaXMuX2FkZFN0eWxlc1RvSG9zdChhZGRpdGlvbnMsIGhvc3ROb2RlKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9zdHlsZU5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlTm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3R5bGVOb2RlID0+IGdldERPTSgpLnJlbW92ZShzdHlsZU5vZGUpKSk7CiAgICAgICAgfQogICAgfQogICAgRG9tU2hhcmVkU3R5bGVzSG9zdC7JtWZhYyA9IGZ1bmN0aW9uIERvbVNoYXJlZFN0eWxlc0hvc3RfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRG9tU2hhcmVkU3R5bGVzSG9zdCkoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICBEb21TaGFyZWRTdHlsZXNIb3N0Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IERvbVNoYXJlZFN0eWxlc0hvc3QsIGZhY3Rvcnk6IERvbVNoYXJlZFN0eWxlc0hvc3QuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIERvbVNoYXJlZFN0eWxlc0hvc3QuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2RvbV9yZW5kZXJlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOQU1FU1BBQ0VfVVJJUyA9IHsKICAgICAgICAnc3ZnJzogJ2h0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnJywKICAgICAgICAneGh0bWwnOiAnaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCcsCiAgICAgICAgJ3hsaW5rJzogJ2h0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsnLAogICAgICAgICd4bWwnOiAnaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlJywKICAgICAgICAneG1sbnMnOiAnaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8nLAogICAgfTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IENPTVBPTkVOVF9SRUdFWCA9IC8lQ09NUCUvZzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5HX0RFVl9NT0RFJDEgPSB0eXBlb2YgbmdEZXZNb2RlID09PSAndW5kZWZpbmVkJyB8fCAhIW5nRGV2TW9kZTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IENPTVBPTkVOVF9WQVJJQUJMRSA9ICclQ09NUCUnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSE9TVF9BVFRSID0gYF9uZ2hvc3QtJHtDT01QT05FTlRfVkFSSUFCTEV9YDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IENPTlRFTlRfQVRUUiA9IGBfbmdjb250ZW50LSR7Q09NUE9ORU5UX1ZBUklBQkxFfWA7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50U2hvcnRJZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2hpbUNvbnRlbnRBdHRyaWJ1dGUoY29tcG9uZW50U2hvcnRJZCkgewogICAgICAgIHJldHVybiBDT05URU5UX0FUVFIucmVwbGFjZShDT01QT05FTlRfUkVHRVgsIGNvbXBvbmVudFNob3J0SWQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudFNob3J0SWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNoaW1Ib3N0QXR0cmlidXRlKGNvbXBvbmVudFNob3J0SWQpIHsKICAgICAgICByZXR1cm4gSE9TVF9BVFRSLnJlcGxhY2UoQ09NUE9ORU5UX1JFR0VYLCBjb21wb25lbnRTaG9ydElkKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb21wSWQKICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZmxhdHRlblN0eWxlcyhjb21wSWQsIHN0eWxlcywgdGFyZ2V0KSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3R5bGUgPSBzdHlsZXNbaV07CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHN0eWxlKSkgewogICAgICAgICAgICAgICAgZmxhdHRlblN0eWxlcyhjb21wSWQsIHN0eWxlLCB0YXJnZXQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3R5bGUgPSBzdHlsZS5yZXBsYWNlKENPTVBPTkVOVF9SRUdFWCwgY29tcElkKTsKICAgICAgICAgICAgICAgIHRhcmdldC5wdXNoKHN0eWxlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50SGFuZGxlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGVjb3JhdGVQcmV2ZW50RGVmYXVsdChldmVudEhhbmRsZXIpIHsKICAgICAgICAvLyBgRGVidWdOb2RlLnRyaWdnZXJFdmVudEhhbmRsZXJgIG5lZWRzIHRvIGtub3cgaWYgdGhlIGxpc3RlbmVyIHdhcyBjcmVhdGVkIHdpdGgKICAgICAgICAvLyBkZWNvcmF0ZVByZXZlbnREZWZhdWx0IG9yIGlzIGEgbGlzdGVuZXIgYWRkZWQgb3V0c2lkZSB0aGUgQW5ndWxhciBjb250ZXh0IHNvIGl0IGNhbiBoYW5kbGUgdGhlCiAgICAgICAgLy8gdHdvIGRpZmZlcmVudGx5LiBJbiB0aGUgZmlyc3QgY2FzZSwgdGhlIHNwZWNpYWwgJ19fbmdVbndyYXBfXycgdG9rZW4gaXMgcGFzc2VkIHRvIHRoZSB1bndyYXAKICAgICAgICAvLyB0aGUgbGlzdGVuZXIgKHNlZSBiZWxvdykuCiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgLy8gSXZ5IHVzZXMgJ19fbmdVbndyYXBfXycgYXMgYSBzcGVjaWFsIHRva2VuIHRoYXQgYWxsb3dzIHVzIHRvIHVud3JhcCB0aGUgZnVuY3Rpb24KICAgICAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgaW52b2tlZCBwcm9ncmFtbWF0aWNhbGx5IGJ5IGBEZWJ1Z05vZGUudHJpZ2dlckV2ZW50SGFuZGxlcmAuIFRoZSBkZWJ1Z19ub2RlCiAgICAgICAgICAgIC8vIGNhbiBpbnNwZWN0IHRoZSBsaXN0ZW5lciB0b1N0cmluZyBjb250ZW50cyBmb3IgdGhlIGV4aXN0ZW5jZSBvZiB0aGlzIHNwZWNpYWwgdG9rZW4uIEJlY2F1c2UKICAgICAgICAgICAgLy8gdGhlIHRva2VuIGlzIGEgc3RyaW5nIGxpdGVyYWwsIGl0IGlzIGVuc3VyZWQgdG8gbm90IGJlIG1vZGlmaWVkIGJ5IGNvbXBpbGVkIGNvZGUuCiAgICAgICAgICAgIGlmIChldmVudCA9PT0gJ19fbmdVbndyYXBfXycpIHsKICAgICAgICAgICAgICAgIHJldHVybiBldmVudEhhbmRsZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbGxvd0RlZmF1bHRCZWhhdmlvciA9IGV2ZW50SGFuZGxlcihldmVudCk7CiAgICAgICAgICAgIGlmIChhbGxvd0RlZmF1bHRCZWhhdmlvciA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8odGJvc2NoKTogbW92ZSBwcmV2ZW50RGVmYXVsdCBpbnRvIGV2ZW50IHBsdWdpbnMuLi4KICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBldmVudC5yZXR1cm5WYWx1ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7CiAgICAgICAgfSk7CiAgICB9CiAgICBjbGFzcyBEb21SZW5kZXJlckZhY3RvcnkyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICAgICAqIEBwYXJhbSB7P30gc2hhcmVkU3R5bGVzSG9zdAogICAgICAgICAqIEBwYXJhbSB7P30gYXBwSWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGFwcElkKSB7CiAgICAgICAgICAgIHRoaXMuZXZlbnRNYW5hZ2VyID0gZXZlbnRNYW5hZ2VyOwogICAgICAgICAgICB0aGlzLnNoYXJlZFN0eWxlc0hvc3QgPSBzaGFyZWRTdHlsZXNIb3N0OwogICAgICAgICAgICB0aGlzLmFwcElkID0gYXBwSWQ7CiAgICAgICAgICAgIHRoaXMucmVuZGVyZXJCeUNvbXBJZCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5kZWZhdWx0UmVuZGVyZXIgPSBuZXcgRGVmYXVsdERvbVJlbmRlcmVyMihldmVudE1hbmFnZXIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZVJlbmRlcmVyKGVsZW1lbnQsIHR5cGUpIHsKICAgICAgICAgICAgaWYgKCFlbGVtZW50IHx8ICF0eXBlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kZWZhdWx0UmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoICh0eXBlLmVuY2Fwc3VsYXRpb24pIHsKICAgICAgICAgICAgICAgIGNhc2UgVmlld0VuY2Fwc3VsYXRpb24kMS5FbXVsYXRlZDogewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgcmVuZGVyZXIgPSB0aGlzLnJlbmRlcmVyQnlDb21wSWQuZ2V0KHR5cGUuaWQpOwogICAgICAgICAgICAgICAgICAgIGlmICghcmVuZGVyZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIgPSBuZXcgRW11bGF0ZWRFbmNhcHN1bGF0aW9uRG9tUmVuZGVyZXIyKHRoaXMuZXZlbnRNYW5hZ2VyLCB0aGlzLnNoYXJlZFN0eWxlc0hvc3QsIHR5cGUsIHRoaXMuYXBwSWQpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyQnlDb21wSWQuc2V0KHR5cGUuaWQsIHJlbmRlcmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChyZW5kZXJlcikpKS5hcHBseVRvSG9zdChlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIFZpZXdFbmNhcHN1bGF0aW9uJDEuTmF0aXZlOgogICAgICAgICAgICAgICAgY2FzZSBWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNoYWRvd0RvbVJlbmRlcmVyKHRoaXMuZXZlbnRNYW5hZ2VyLCB0aGlzLnNoYXJlZFN0eWxlc0hvc3QsIGVsZW1lbnQsIHR5cGUpOwogICAgICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5yZW5kZXJlckJ5Q29tcElkLmhhcyh0eXBlLmlkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IGZsYXR0ZW5TdHlsZXModHlwZS5pZCwgdHlwZS5zdHlsZXMsIFtdKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LmFkZFN0eWxlcyhzdHlsZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmVyQnlDb21wSWQuc2V0KHR5cGUuaWQsIHRoaXMuZGVmYXVsdFJlbmRlcmVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdFJlbmRlcmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYmVnaW4oKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVuZCgpIHsgfQogICAgfQogICAgRG9tUmVuZGVyZXJGYWN0b3J5Mi7JtWZhYyA9IGZ1bmN0aW9uIERvbVJlbmRlcmVyRmFjdG9yeTJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRG9tUmVuZGVyZXJGYWN0b3J5MikoybXJtWluamVjdChFdmVudE1hbmFnZXIpLCDJtcm1aW5qZWN0KERvbVNoYXJlZFN0eWxlc0hvc3QpLCDJtcm1aW5qZWN0KEFQUF9JRCkpOyB9OwogICAgRG9tUmVuZGVyZXJGYWN0b3J5Mi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEb21SZW5kZXJlckZhY3RvcnkyLCBmYWN0b3J5OiBEb21SZW5kZXJlckZhY3RvcnkyLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBEb21SZW5kZXJlckZhY3RvcnkyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRXZlbnRNYW5hZ2VyIH0sCiAgICAgICAgeyB0eXBlOiBEb21TaGFyZWRTdHlsZXNIb3N0IH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0FQUF9JRCxdIH1dIH0KICAgIF07CiAgICBjbGFzcyBEZWZhdWx0RG9tUmVuZGVyZXIyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGV2ZW50TWFuYWdlcikgewogICAgICAgICAgICB0aGlzLmV2ZW50TWFuYWdlciA9IGV2ZW50TWFuYWdlcjsKICAgICAgICAgICAgdGhpcy5kYXRhID0gT2JqZWN0LmNyZWF0ZShudWxsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHBhcmFtIHs/PX0gbmFtZXNwYWNlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVFbGVtZW50KG5hbWUsIG5hbWVzcGFjZSkgewogICAgICAgICAgICBpZiAobmFtZXNwYWNlKSB7CiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlcyB3aGVyZSBJdnkgKG5vdCBWaWV3RW5naW5lKSBpcyBnaXZpbmcgdXMgdGhlIGFjdHVhbCBuYW1lc3BhY2UsIHRoZSBsb29rIHVwIGJ5IGtleQogICAgICAgICAgICAgICAgLy8gd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkLCBzbyB3ZSBqdXN0IHJldHVybiB0aGUgbmFtZXNwYWNlIGhlcmUuCiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKE5BTUVTUEFDRV9VUklTW25hbWVzcGFjZV0gfHwgbmFtZXNwYWNlLCBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChuYW1lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlQ29tbWVudCh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZVRleHQodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKSB7CiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChuZXdDaGlsZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdDaGlsZAogICAgICAgICAqIEBwYXJhbSB7P30gcmVmQ2hpbGQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluc2VydEJlZm9yZShwYXJlbnQsIG5ld0NoaWxkLCByZWZDaGlsZCkgewogICAgICAgICAgICBpZiAocGFyZW50KSB7CiAgICAgICAgICAgICAgICBwYXJlbnQuaW5zZXJ0QmVmb3JlKG5ld0NoaWxkLCByZWZDaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKSB7CiAgICAgICAgICAgIGlmIChwYXJlbnQpIHsKICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZChvbGRDaGlsZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3Rvck9yTm9kZQogICAgICAgICAqIEBwYXJhbSB7Pz19IHByZXNlcnZlQ29udGVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2VsZWN0Um9vdEVsZW1lbnQoc2VsZWN0b3JPck5vZGUsIHByZXNlcnZlQ29udGVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBlbCA9IHR5cGVvZiBzZWxlY3Rvck9yTm9kZSA9PT0gJ3N0cmluZycgPyBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yT3JOb2RlKSA6CiAgICAgICAgICAgICAgICBzZWxlY3Rvck9yTm9kZTsKICAgICAgICAgICAgaWYgKCFlbCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgc2VsZWN0b3IgIiR7c2VsZWN0b3JPck5vZGV9IiBkaWQgbm90IG1hdGNoIGFueSBlbGVtZW50c2ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcHJlc2VydmVDb250ZW50KSB7CiAgICAgICAgICAgICAgICBlbC50ZXh0Q29udGVudCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBlbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXJlbnROb2RlKG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5vZGUucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZXh0U2libGluZyhub2RlKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlLm5leHRTaWJsaW5nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0QXR0cmlidXRlKGVsLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgICAgIGlmIChuYW1lc3BhY2UpIHsKICAgICAgICAgICAgICAgIG5hbWUgPSBuYW1lc3BhY2UgKyAnOicgKyBuYW1lOwogICAgICAgICAgICAgICAgLy8gVE9ETyhGVy04MTEpOiBJdnkgbWF5IGNhdXNlIGlzc3VlcyBoZXJlIGJlY2F1c2UgaXQncyBwYXNzaW5nIGFyb3VuZAogICAgICAgICAgICAgICAgLy8gZnVsbCBVUklzIGZvciBuYW1lc3BhY2VzLCB0aGVyZWZvcmUgdGhpcyBsb29rdXAgd2lsbCBmYWlsLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlVXJpID0gTkFNRVNQQUNFX1VSSVNbbmFtZXNwYWNlXTsKICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VVcmkpIHsKICAgICAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGVOUyhuYW1lc3BhY2VVcmksIG5hbWUsIHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlbC5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez89fSBuYW1lc3BhY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZUF0dHJpYnV0ZShlbCwgbmFtZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgICAgIGlmIChuYW1lc3BhY2UpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8oRlctODExKTogSXZ5IG1heSBjYXVzZSBpc3N1ZXMgaGVyZSBiZWNhdXNlIGl0J3MgcGFzc2luZyBhcm91bmQKICAgICAgICAgICAgICAgIC8vIGZ1bGwgVVJJcyBmb3IgbmFtZXNwYWNlcywgdGhlcmVmb3JlIHRoaXMgbG9va3VwIHdpbGwgZmFpbC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5hbWVzcGFjZVVyaSA9IE5BTUVTUEFDRV9VUklTW25hbWVzcGFjZV07CiAgICAgICAgICAgICAgICBpZiAobmFtZXNwYWNlVXJpKSB7CiAgICAgICAgICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlTlMobmFtZXNwYWNlVXJpLCBuYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oRlctODExKTogU2luY2UgaXZ5IGlzIHBhc3NpbmcgYXJvdW5kIGZ1bGwgVVJJcyBmb3IgbmFtZXNwYWNlcwogICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgY291bGQgcmVzdWx0IGluIHByb3BlcnRpZXMgbGlrZSBgaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmc6Y3g9IjEyMyJgLAogICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGlzIHdyb25nLgogICAgICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShgJHtuYW1lc3BhY2V9OiR7bmFtZX1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGVsLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRDbGFzcyhlbCwgbmFtZSkgewogICAgICAgICAgICBlbC5jbGFzc0xpc3QuYWRkKG5hbWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVDbGFzcyhlbCwgbmFtZSkgewogICAgICAgICAgICBlbC5jbGFzc0xpc3QucmVtb3ZlKG5hbWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez99IGZsYWdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRTdHlsZShlbCwgc3R5bGUsIHZhbHVlLCBmbGFncykgewogICAgICAgICAgICBpZiAoZmxhZ3MgJiBSZW5kZXJlclN0eWxlRmxhZ3MyLkRhc2hDYXNlKSB7CiAgICAgICAgICAgICAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eShzdHlsZSwgdmFsdWUsICEhKGZsYWdzICYgUmVuZGVyZXJTdHlsZUZsYWdzMi5JbXBvcnRhbnQpID8gJ2ltcG9ydGFudCcgOiAnJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlbC5zdHlsZVtzdHlsZV0gPSB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICAgICAqIEBwYXJhbSB7P30gZmxhZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZVN0eWxlKGVsLCBzdHlsZSwgZmxhZ3MpIHsKICAgICAgICAgICAgaWYgKGZsYWdzICYgUmVuZGVyZXJTdHlsZUZsYWdzMi5EYXNoQ2FzZSkgewogICAgICAgICAgICAgICAgZWwuc3R5bGUucmVtb3ZlUHJvcGVydHkoc3R5bGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gSUUgcmVxdWlyZXMgJycgaW5zdGVhZCBvZiBudWxsCiAgICAgICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvNzkxNgogICAgICAgICAgICAgICAgZWwuc3R5bGVbc3R5bGVdID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbAogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICBOR19ERVZfTU9ERSQxICYmIGNoZWNrTm9TeW50aGV0aWNQcm9wKG5hbWUsICdwcm9wZXJ0eScpOwogICAgICAgICAgICBlbFtuYW1lXSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZShub2RlLCB2YWx1ZSkgewogICAgICAgICAgICBub2RlLm5vZGVWYWx1ZSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsaXN0ZW4odGFyZ2V0LCBldmVudCwgY2FsbGJhY2spIHsKICAgICAgICAgICAgTkdfREVWX01PREUkMSAmJiBjaGVja05vU3ludGhldGljUHJvcChldmVudCwgJ2xpc3RlbmVyJyk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLmV2ZW50TWFuYWdlci5hZGRHbG9iYWxFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnQsIGRlY29yYXRlUHJldmVudERlZmF1bHQoY2FsbGJhY2spKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZXZlbnRNYW5hZ2VyLmFkZEV2ZW50TGlzdGVuZXIodGFyZ2V0LCBldmVudCwgZGVjb3JhdGVQcmV2ZW50RGVmYXVsdChjYWxsYmFjaykpKSkpKTsKICAgICAgICB9CiAgICB9CiAgICBjb25zdCDJtTAkMiQxID0gLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiAnQCcuY2hhckNvZGVBdCgwKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEFUX0NIQVJDT0RFID0gKCjJtTAkMiQxKSkoKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IG5hbWVLaW5kCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja05vU3ludGhldGljUHJvcChuYW1lLCBuYW1lS2luZCkgewogICAgICAgIGlmIChuYW1lLmNoYXJDb2RlQXQoMCkgPT09IEFUX0NIQVJDT0RFKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRm91bmQgdGhlIHN5bnRoZXRpYyAke25hbWVLaW5kfSAke25hbWV9LiBQbGVhc2UgaW5jbHVkZSBlaXRoZXIgIkJyb3dzZXJBbmltYXRpb25zTW9kdWxlIiBvciAiTm9vcEFuaW1hdGlvbnNNb2R1bGUiIGluIHlvdXIgYXBwbGljYXRpb24uYCk7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgRW11bGF0ZWRFbmNhcHN1bGF0aW9uRG9tUmVuZGVyZXIyIGV4dGVuZHMgRGVmYXVsdERvbVJlbmRlcmVyMiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE1hbmFnZXIKICAgICAgICAgKiBAcGFyYW0gez99IHNoYXJlZFN0eWxlc0hvc3QKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudAogICAgICAgICAqIEBwYXJhbSB7P30gYXBwSWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGNvbXBvbmVudCwgYXBwSWQpIHsKICAgICAgICAgICAgc3VwZXIoZXZlbnRNYW5hZ2VyKTsKICAgICAgICAgICAgdGhpcy5jb21wb25lbnQgPSBjb21wb25lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gZmxhdHRlblN0eWxlcyhhcHBJZCArICctJyArIGNvbXBvbmVudC5pZCwgY29tcG9uZW50LnN0eWxlcywgW10pOwogICAgICAgICAgICBzaGFyZWRTdHlsZXNIb3N0LmFkZFN0eWxlcyhzdHlsZXMpOwogICAgICAgICAgICB0aGlzLmNvbnRlbnRBdHRyID0gc2hpbUNvbnRlbnRBdHRyaWJ1dGUoYXBwSWQgKyAnLScgKyBjb21wb25lbnQuaWQpOwogICAgICAgICAgICB0aGlzLmhvc3RBdHRyID0gc2hpbUhvc3RBdHRyaWJ1dGUoYXBwSWQgKyAnLScgKyBjb21wb25lbnQuaWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGx5VG9Ib3N0KGVsZW1lbnQpIHsKICAgICAgICAgICAgc3VwZXIuc2V0QXR0cmlidXRlKGVsZW1lbnQsIHRoaXMuaG9zdEF0dHIsICcnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZUVsZW1lbnQocGFyZW50LCBuYW1lKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWwgPSBzdXBlci5jcmVhdGVFbGVtZW50KHBhcmVudCwgbmFtZSk7CiAgICAgICAgICAgIHN1cGVyLnNldEF0dHJpYnV0ZShlbCwgdGhpcy5jb250ZW50QXR0ciwgJycpOwogICAgICAgICAgICByZXR1cm4gZWw7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgU2hhZG93RG9tUmVuZGVyZXIgZXh0ZW5kcyBEZWZhdWx0RG9tUmVuZGVyZXIyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TWFuYWdlcgogICAgICAgICAqIEBwYXJhbSB7P30gc2hhcmVkU3R5bGVzSG9zdAogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihldmVudE1hbmFnZXIsIHNoYXJlZFN0eWxlc0hvc3QsIGhvc3RFbCwgY29tcG9uZW50KSB7CiAgICAgICAgICAgIHN1cGVyKGV2ZW50TWFuYWdlcik7CiAgICAgICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdCA9IHNoYXJlZFN0eWxlc0hvc3Q7CiAgICAgICAgICAgIHRoaXMuaG9zdEVsID0gaG9zdEVsOwogICAgICAgICAgICB0aGlzLmNvbXBvbmVudCA9IGNvbXBvbmVudDsKICAgICAgICAgICAgaWYgKGNvbXBvbmVudC5lbmNhcHN1bGF0aW9uID09PSBWaWV3RW5jYXBzdWxhdGlvbiQxLlNoYWRvd0RvbSkgewogICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290ID0gKCgvKiogQHR5cGUgez99ICovIChob3N0RWwpKSkuYXR0YWNoU2hhZG93KHsgbW9kZTogJ29wZW4nIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5zaGFkb3dSb290ID0gKCgvKiogQHR5cGUgez99ICovIChob3N0RWwpKSkuY3JlYXRlU2hhZG93Um9vdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc2hhcmVkU3R5bGVzSG9zdC5hZGRIb3N0KHRoaXMuc2hhZG93Um9vdCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gZmxhdHRlblN0eWxlcyhjb21wb25lbnQuaWQsIGNvbXBvbmVudC5zdHlsZXMsIFtdKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdHlsZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlRWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgc3R5bGVFbC50ZXh0Q29udGVudCA9IHN0eWxlc1tpXTsKICAgICAgICAgICAgICAgIHRoaXMuc2hhZG93Um9vdC5hcHBlbmRDaGlsZChzdHlsZUVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm9kZU9yU2hhZG93Um9vdChub2RlKSB7CiAgICAgICAgICAgIHJldHVybiBub2RlID09PSB0aGlzLmhvc3RFbCA/IHRoaXMuc2hhZG93Um9vdCA6IG5vZGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5zaGFyZWRTdHlsZXNIb3N0LnJlbW92ZUhvc3QodGhpcy5zaGFkb3dSb290KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG5ld0NoaWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5hcHBlbmRDaGlsZCh0aGlzLm5vZGVPclNoYWRvd1Jvb3QocGFyZW50KSwgbmV3Q2hpbGQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAqIEBwYXJhbSB7P30gbmV3Q2hpbGQKICAgICAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICAgICAgcmV0dXJuIHN1cGVyLmluc2VydEJlZm9yZSh0aGlzLm5vZGVPclNoYWRvd1Jvb3QocGFyZW50KSwgbmV3Q2hpbGQsIHJlZkNoaWxkKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkKSB7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5yZW1vdmVDaGlsZCh0aGlzLm5vZGVPclNoYWRvd1Jvb3QocGFyZW50KSwgb2xkQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhcmVudE5vZGUobm9kZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5ub2RlT3JTaGFkb3dSb290KHN1cGVyLnBhcmVudE5vZGUodGhpcy5ub2RlT3JTaGFkb3dSb290KG5vZGUpKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvZG9tL2V2ZW50cy9kb21fZXZlbnRzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIERvbUV2ZW50c1BsdWdpbiBleHRlbmRzIEV2ZW50TWFuYWdlclBsdWdpbiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihkb2MpIHsKICAgICAgICAgICAgc3VwZXIoZG9jKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhpcyBwbHVnaW4gc2hvdWxkIGNvbWUgbGFzdCBpbiB0aGUgbGlzdCBvZiBwbHVnaW5zLCBiZWNhdXNlIGl0IGFjY2VwdHMgYWxsCiAgICAgICAgLy8gZXZlbnRzLgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0cyhldmVudE5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnROYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBoYW5kbGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcikgewogICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoaGFuZGxlcikpLCBmYWxzZSk7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoaGFuZGxlcikpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVFdmVudExpc3RlbmVyKHRhcmdldCwgZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgICAgICAgICByZXR1cm4gdGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoY2FsbGJhY2spKSk7CiAgICAgICAgfQogICAgfQogICAgRG9tRXZlbnRzUGx1Z2luLsm1ZmFjID0gZnVuY3Rpb24gRG9tRXZlbnRzUGx1Z2luX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbUV2ZW50c1BsdWdpbikoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICBEb21FdmVudHNQbHVnaW4uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRG9tRXZlbnRzUGx1Z2luLCBmYWN0b3J5OiBEb21FdmVudHNQbHVnaW4uybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIERvbUV2ZW50c1BsdWdpbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9kb20vZXZlbnRzL2hhbW1lcl9nZXN0dXJlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFN1cHBvcnRlZCBIYW1tZXJKUyByZWNvZ25pemVyIGV2ZW50IG5hbWVzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEVWRU5UX05BTUVTID0gewogICAgICAgIC8vIHBhbgogICAgICAgICdwYW4nOiB0cnVlLAogICAgICAgICdwYW5zdGFydCc6IHRydWUsCiAgICAgICAgJ3Bhbm1vdmUnOiB0cnVlLAogICAgICAgICdwYW5lbmQnOiB0cnVlLAogICAgICAgICdwYW5jYW5jZWwnOiB0cnVlLAogICAgICAgICdwYW5sZWZ0JzogdHJ1ZSwKICAgICAgICAncGFucmlnaHQnOiB0cnVlLAogICAgICAgICdwYW51cCc6IHRydWUsCiAgICAgICAgJ3BhbmRvd24nOiB0cnVlLAogICAgICAgIC8vIHBpbmNoCiAgICAgICAgJ3BpbmNoJzogdHJ1ZSwKICAgICAgICAncGluY2hzdGFydCc6IHRydWUsCiAgICAgICAgJ3BpbmNobW92ZSc6IHRydWUsCiAgICAgICAgJ3BpbmNoZW5kJzogdHJ1ZSwKICAgICAgICAncGluY2hjYW5jZWwnOiB0cnVlLAogICAgICAgICdwaW5jaGluJzogdHJ1ZSwKICAgICAgICAncGluY2hvdXQnOiB0cnVlLAogICAgICAgIC8vIHByZXNzCiAgICAgICAgJ3ByZXNzJzogdHJ1ZSwKICAgICAgICAncHJlc3N1cCc6IHRydWUsCiAgICAgICAgLy8gcm90YXRlCiAgICAgICAgJ3JvdGF0ZSc6IHRydWUsCiAgICAgICAgJ3JvdGF0ZXN0YXJ0JzogdHJ1ZSwKICAgICAgICAncm90YXRlbW92ZSc6IHRydWUsCiAgICAgICAgJ3JvdGF0ZWVuZCc6IHRydWUsCiAgICAgICAgJ3JvdGF0ZWNhbmNlbCc6IHRydWUsCiAgICAgICAgLy8gc3dpcGUKICAgICAgICAnc3dpcGUnOiB0cnVlLAogICAgICAgICdzd2lwZWxlZnQnOiB0cnVlLAogICAgICAgICdzd2lwZXJpZ2h0JzogdHJ1ZSwKICAgICAgICAnc3dpcGV1cCc6IHRydWUsCiAgICAgICAgJ3N3aXBlZG93bic6IHRydWUsCiAgICAgICAgLy8gdGFwCiAgICAgICAgJ3RhcCc6IHRydWUsCiAgICB9OwogICAgLyoqCiAgICAgKiBESSB0b2tlbiBmb3IgcHJvdmlkaW5nIFtIYW1tZXJKU10oaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby8pIHN1cHBvcnQgdG8gQW5ndWxhci4KICAgICAqIEBzZWUgYEhhbW1lckdlc3R1cmVDb25maWdgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBIYW1tZXJNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSEFNTUVSX0dFU1RVUkVfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdIYW1tZXJHZXN0dXJlQ29uZmlnJyk7CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB1c2VkIHRvIHByb3ZpZGUgYSB7XEBsaW5rIEhhbW1lckxvYWRlcn0gdG8gQW5ndWxhci4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEhBTU1FUl9MT0FERVIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0hhbW1lckxvYWRlcicpOwogICAgLyoqCiAgICAgKiBBbiBpbmplY3RhYmxlIFtIYW1tZXJKUyBNYW5hZ2VyXShodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL2FwaS8jaGFtbWVyLm1hbmFnZXIpCiAgICAgKiBmb3IgZ2VzdHVyZSByZWNvZ25pdGlvbi4gQ29uZmlndXJlcyBzcGVjaWZpYyBldmVudCByZWNvZ25pdGlvbi4KICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEhhbW1lckdlc3R1cmVDb25maWcgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBzZXQgb2Ygc3VwcG9ydGVkIGV2ZW50IG5hbWVzIGZvciBnZXN0dXJlcyB0byBiZSB1c2VkIGluIEFuZ3VsYXIuCiAgICAgICAgICAgICAqIEFuZ3VsYXIgc3VwcG9ydHMgYWxsIGJ1aWx0LWluIHJlY29nbml6ZXJzLCBhcyBsaXN0ZWQgaW4KICAgICAgICAgICAgICogW0hhbW1lckpTIGRvY3VtZW50YXRpb25dKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZXZlbnRzID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXBzIGdlc3R1cmUgZXZlbnQgbmFtZXMgdG8gYSBzZXQgb2YgY29uZmlndXJhdGlvbiBvcHRpb25zCiAgICAgICAgICAgICAqIHRoYXQgc3BlY2lmeSBvdmVycmlkZXMgdG8gdGhlIGRlZmF1bHQgdmFsdWVzIGZvciBzcGVjaWZpYyBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBUaGUga2V5IGlzIGEgc3VwcG9ydGVkIGV2ZW50IG5hbWUgdG8gYmUgY29uZmlndXJlZCwKICAgICAgICAgICAgICogYW5kIHRoZSBvcHRpb25zIG9iamVjdCBjb250YWlucyBhIHNldCBvZiBwcm9wZXJ0aWVzLCB3aXRoIG92ZXJyaWRlIHZhbHVlcwogICAgICAgICAgICAgKiB0byBiZSBhcHBsaWVkIHRvIHRoZSBuYW1lZCByZWNvZ25pemVyIGV2ZW50LgogICAgICAgICAgICAgKiBGb3IgZXhhbXBsZSwgdG8gZGlzYWJsZSByZWNvZ25pdGlvbiBvZiB0aGUgcm90YXRlIGV2ZW50LCBzcGVjaWZ5CiAgICAgICAgICAgICAqICBgeyJyb3RhdGUiOiB7ImVuYWJsZSI6IGZhbHNlfX1gLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBQcm9wZXJ0aWVzIHRoYXQgYXJlIG5vdCBwcmVzZW50IHRha2UgdGhlIEhhbW1lckpTIGRlZmF1bHQgdmFsdWVzLgogICAgICAgICAgICAgKiBGb3IgaW5mb3JtYXRpb24gYWJvdXQgd2hpY2ggcHJvcGVydGllcyBhcmUgc3VwcG9ydGVkIGZvciB3aGljaCBldmVudHMsCiAgICAgICAgICAgICAqIGFuZCB0aGVpciBhbGxvd2VkIGFuZCBkZWZhdWx0IHZhbHVlcywgc2VlCiAgICAgICAgICAgICAqIFtIYW1tZXJKUyBkb2N1bWVudGF0aW9uXShodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvLykuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm92ZXJyaWRlcyA9IHt9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgW0hhbW1lckpTIE1hbmFnZXJdKGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vYXBpLyNoYW1tZXIubWFuYWdlcikKICAgICAgICAgKiBhbmQgYXR0YWNoZXMgaXQgdG8gYSBnaXZlbiBIVE1MIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHRoYXQgd2lsbCByZWNvZ25pemUgZ2VzdHVyZXMuCiAgICAgICAgICogQHJldHVybiB7P30gQSBIYW1tZXJKUyBldmVudC1tYW5hZ2VyIG9iamVjdC4KICAgICAgICAgKi8KICAgICAgICBidWlsZEhhbW1lcihlbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWMgPSBuZXcgKC8qKiBAdHlwZSB7P30gKi8gKEhhbW1lcikpKGVsZW1lbnQsIHRoaXMub3B0aW9ucyk7CiAgICAgICAgICAgIG1jLmdldCgncGluY2gnKS5zZXQoeyBlbmFibGU6IHRydWUgfSk7CiAgICAgICAgICAgIG1jLmdldCgncm90YXRlJykuc2V0KHsgZW5hYmxlOiB0cnVlIH0pOwogICAgICAgICAgICBmb3IgKGNvbnN0IGV2ZW50TmFtZSBpbiB0aGlzLm92ZXJyaWRlcykgewogICAgICAgICAgICAgICAgbWMuZ2V0KGV2ZW50TmFtZSkuc2V0KHRoaXMub3ZlcnJpZGVzW2V2ZW50TmFtZV0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtYzsKICAgICAgICB9CiAgICB9CiAgICBIYW1tZXJHZXN0dXJlQ29uZmlnLsm1ZmFjID0gZnVuY3Rpb24gSGFtbWVyR2VzdHVyZUNvbmZpZ19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJHZXN0dXJlQ29uZmlnKSgpOyB9OwogICAgSGFtbWVyR2VzdHVyZUNvbmZpZy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIYW1tZXJHZXN0dXJlQ29uZmlnLCBmYWN0b3J5OiBIYW1tZXJHZXN0dXJlQ29uZmlnLsm1ZmFjIH0pOwogICAgLyoqCiAgICAgKiBFdmVudCBwbHVnaW4gdGhhdCBhZGRzIEhhbW1lciBzdXBwb3J0IHRvIGFuIGFwcGxpY2F0aW9uLgogICAgICoKICAgICAqIFxAbmdNb2R1bGUgSGFtbWVyTW9kdWxlCiAgICAgKi8KICAgIGNsYXNzIEhhbW1lckdlc3R1cmVzUGx1Z2luIGV4dGVuZHMgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRvYwogICAgICAgICAqIEBwYXJhbSB7P30gX2NvbmZpZwogICAgICAgICAqIEBwYXJhbSB7P30gY29uc29sZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGxvYWRlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRvYywgX2NvbmZpZywgY29uc29sZSwgbG9hZGVyKSB7CiAgICAgICAgICAgIHN1cGVyKGRvYyk7CiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgICAgIHRoaXMuY29uc29sZSA9IGNvbnNvbGU7CiAgICAgICAgICAgIHRoaXMubG9hZGVyID0gbG9hZGVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3VwcG9ydHMoZXZlbnROYW1lKSB7CiAgICAgICAgICAgIGlmICghRVZFTlRfTkFNRVMuaGFzT3duUHJvcGVydHkoZXZlbnROYW1lLnRvTG93ZXJDYXNlKCkpICYmICF0aGlzLmlzQ3VzdG9tRXZlbnQoZXZlbnROYW1lKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuSGFtbWVyICYmICF0aGlzLmxvYWRlcikgewogICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLndhcm4oYFRoZSAiJHtldmVudE5hbWV9IiBldmVudCBjYW5ub3QgYmUgYm91bmQgYmVjYXVzZSBIYW1tZXIuSlMgaXMgbm90IGAgKwogICAgICAgICAgICAgICAgICAgIGBsb2FkZWQgYW5kIG5vIGN1c3RvbSBsb2FkZXIgaGFzIGJlZW4gc3BlY2lmaWVkLmApOwogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gaGFuZGxlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbGVtZW50LCBldmVudE5hbWUsIGhhbmRsZXIpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB6b25lID0gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKTsKICAgICAgICAgICAgZXZlbnROYW1lID0gZXZlbnROYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIC8vIElmIEhhbW1lciBpcyBub3QgcHJlc2VudCBidXQgYSBsb2FkZXIgaXMgc3BlY2lmaWVkLCB3ZSBkZWZlciBhZGRpbmcgdGhlIGV2ZW50IGxpc3RlbmVyCiAgICAgICAgICAgIC8vIHVudGlsIEhhbW1lciBpcyBsb2FkZWQuCiAgICAgICAgICAgIGlmICghKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuSGFtbWVyICYmIHRoaXMubG9hZGVyKSB7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGBhZGRFdmVudExpc3RlbmVyYCBtZXRob2QgcmV0dXJucyBhIGZ1bmN0aW9uIHRvIHJlbW92ZSB0aGUgYWRkZWQgbGlzdGVuZXIuCiAgICAgICAgICAgICAgICAvLyBVbnRpbCBIYW1tZXIgaXMgbG9hZGVkLCB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gbmVlZHMgdG8gKmNhbmNlbCogdGhlIHJlZ2lzdHJhdGlvbiByYXRoZXIKICAgICAgICAgICAgICAgIC8vIHRoYW4gcmVtb3ZlIGFueXRoaW5nLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGNhbmNlbFJlZ2lzdHJhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGRlcmVnaXN0ZXIgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY2FuY2VsUmVnaXN0cmF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgdGhpcy5sb2FkZXIoKQogICAgICAgICAgICAgICAgICAgIC50aGVuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBIYW1tZXIgaXNuJ3QgYWN0dWFsbHkgbG9hZGVkIHdoZW4gdGhlIGN1c3RvbSBsb2FkZXIgcmVzb2x2ZXMsIGdpdmUgdXAuCiAgICAgICAgICAgICAgICAgICAgaWYgKCEoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5IYW1tZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jb25zb2xlLndhcm4oYFRoZSBjdXN0b20gSEFNTUVSX0xPQURFUiBjb21wbGV0ZWQsIGJ1dCBIYW1tZXIuSlMgaXMgbm90IHByZXNlbnQuYCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlcmVnaXN0ZXIgPSAoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghY2FuY2VsUmVnaXN0cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdyB0aGF0IEhhbW1lciBpcyBsb2FkZWQgYW5kIHRoZSBsaXN0ZW5lciBpcyBiZWluZyBsb2FkZWQgZm9yIHJlYWwsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXJlZ2lzdHJhdGlvbiBmdW5jdGlvbiBjaGFuZ2VzIGZyb20gY2FuY2VsaW5nIHJlZ2lzdHJhdGlvbiB0byByZW1vdmFsLgogICAgICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyID0gdGhpcy5hZGRFdmVudExpc3RlbmVyKGVsZW1lbnQsIGV2ZW50TmFtZSwgaGFuZGxlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAgICAgLmNhdGNoKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnNvbGUud2FybihgVGhlICIke2V2ZW50TmFtZX0iIGV2ZW50IGNhbm5vdCBiZSBib3VuZCBiZWNhdXNlIHRoZSBjdXN0b20gYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGBIYW1tZXIuSlMgbG9hZGVyIGZhaWxlZC5gKTsKICAgICAgICAgICAgICAgICAgICBkZXJlZ2lzdGVyID0gKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIC8vIFJldHVybiBhIGZ1bmN0aW9uIHRoYXQgKmV4ZWN1dGVzKiBgZGVyZWdpc3RlcmAgKGFuZCBub3QgYGRlcmVnaXN0ZXJgIGl0c2VsZikgc28gdGhhdCB3ZQogICAgICAgICAgICAgICAgLy8gY2FuIGNoYW5nZSB0aGUgYmVoYXZpb3Igb2YgYGRlcmVnaXN0ZXJgIG9uY2UgdGhlIGxpc3RlbmVyIGlzIGFkZGVkLiBVc2luZyBhIGNsb3N1cmUgaW4KICAgICAgICAgICAgICAgIC8vIHRoaXMgd2F5IGFsbG93cyB1cyB0byBhdm9pZCBhbnkgYWRkaXRpb25hbCBkYXRhIHN0cnVjdHVyZXMgdG8gdHJhY2sgbGlzdGVuZXIgcmVtb3ZhbC4KICAgICAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZGVyZWdpc3RlcigpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHpvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gQ3JlYXRpbmcgdGhlIG1hbmFnZXIgYmluZCBldmVudHMsIG11c3QgYmUgZG9uZSBvdXRzaWRlIG9mIGFuZ3VsYXIKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1jID0gdGhpcy5fY29uZmlnLmJ1aWxkSGFtbWVyKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2FsbGJhY2sgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50T2JqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXZlbnRPYmopIHsKICAgICAgICAgICAgICAgICAgICB6b25lLnJ1bkd1YXJkZWQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyKGV2ZW50T2JqKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIG1jLm9uKGV2ZW50TmFtZSwgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBtYy5vZmYoZXZlbnROYW1lLCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveSBtYyB0byBwcmV2ZW50IG1lbW9yeSBsZWFrCiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBtYy5kZXN0cm95ID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1jLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaXNDdXN0b21FdmVudChldmVudE5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbmZpZy5ldmVudHMuaW5kZXhPZihldmVudE5hbWUpID4gLTE7CiAgICAgICAgfQogICAgfQogICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4uybVmYWMgPSBmdW5jdGlvbiBIYW1tZXJHZXN0dXJlc1BsdWdpbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJHZXN0dXJlc1BsdWdpbikoybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChIQU1NRVJfR0VTVFVSRV9DT05GSUcpLCDJtcm1aW5qZWN0KENvbnNvbGUpLCDJtcm1aW5qZWN0KEhBTU1FUl9MT0FERVIsIDgpKTsgfTsKICAgIEhhbW1lckdlc3R1cmVzUGx1Z2luLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEhhbW1lckdlc3R1cmVzUGx1Z2luLCBmYWN0b3J5OiBIYW1tZXJHZXN0dXJlc1BsdWdpbi7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgSGFtbWVyR2VzdHVyZXNQbHVnaW4uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgICAgIHsgdHlwZTogSGFtbWVyR2VzdHVyZUNvbmZpZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbSEFNTUVSX0dFU1RVUkVfQ09ORklHLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IENvbnNvbGUgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtIQU1NRVJfTE9BREVSLF0gfV0gfQogICAgXTsKICAgIC8qKgogICAgICogSW4gSXZ5LCBzdXBwb3J0IGZvciBIYW1tZXIgZ2VzdHVyZXMgaXMgb3B0aW9uYWwsIHNvIGFwcGxpY2F0aW9ucyBtdXN0CiAgICAgKiBpbXBvcnQgdGhlIGBIYW1tZXJNb2R1bGVgIGF0IHJvb3QgdG8gdHVybiBvbiBzdXBwb3J0LiBUaGlzIG1lYW5zIHRoYXQKICAgICAqIEhhbW1lci1zcGVjaWZpYyBjb2RlIGNhbiBiZSB0cmVlLXNoYWtlbiBhd2F5IGlmIG5vdCBuZWVkZWQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSEFNTUVSX1BST1ZJREVSU19fUE9TVF9SM19fID0gW107CiAgICAvKioKICAgICAqIEluIFZpZXcgRW5naW5lLCBzdXBwb3J0IGZvciBIYW1tZXIgZ2VzdHVyZXMgaXMgYnVpbHQtaW4gYnkgZGVmYXVsdC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBIQU1NRVJfUFJPVklERVJTX19QUkVfUjNfXyA9IFsKICAgICAgICB7CiAgICAgICAgICAgIHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUywKICAgICAgICAgICAgdXNlQ2xhc3M6IEhhbW1lckdlc3R1cmVzUGx1Z2luLAogICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgZGVwczogW0RPQ1VNRU5UJDEsIEhBTU1FUl9HRVNUVVJFX0NPTkZJRywgQ29uc29sZSwgW25ldyBPcHRpb25hbCgpLCBIQU1NRVJfTE9BREVSXV0KICAgICAgICB9LAogICAgICAgIHsgcHJvdmlkZTogSEFNTUVSX0dFU1RVUkVfQ09ORklHLCB1c2VDbGFzczogSGFtbWVyR2VzdHVyZUNvbmZpZywgZGVwczogW10gfSwKICAgIF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBIQU1NRVJfUFJPVklERVJTID0gSEFNTUVSX1BST1ZJREVSU19fUE9TVF9SM19fOwogICAgLyoqCiAgICAgKiBBZGRzIHN1cHBvcnQgZm9yIEhhbW1lckpTLgogICAgICoKICAgICAqIEltcG9ydCB0aGlzIG1vZHVsZSBhdCB0aGUgcm9vdCBvZiB5b3VyIGFwcGxpY2F0aW9uIHNvIHRoYXQgQW5ndWxhciBjYW4gd29yayB3aXRoCiAgICAgKiBIYW1tZXJKUyB0byBkZXRlY3QgZ2VzdHVyZSBldmVudHMuCiAgICAgKgogICAgICogTm90ZSB0aGF0IGFwcGxpY2F0aW9ucyBzdGlsbCBuZWVkIHRvIGluY2x1ZGUgdGhlIEhhbW1lckpTIHNjcmlwdCBpdHNlbGYuIFRoaXMgbW9kdWxlCiAgICAgKiBzaW1wbHkgc2V0cyB1cCB0aGUgY29vcmRpbmF0aW9uIGxheWVyIGJldHdlZW4gSGFtbWVySlMgYW5kIEFuZ3VsYXIncyBFdmVudE1hbmFnZXIuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSGFtbWVyTW9kdWxlIHsKICAgIH0KICAgIEhhbW1lck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEhhbW1lck1vZHVsZSB9KTsKICAgIEhhbW1lck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhhbW1lck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIYW1tZXJNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogSEFNTUVSX1BST1ZJREVSU19fUFJFX1IzX18gfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL3NyYy9kb20vZXZlbnRzL2tleV9ldmVudHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBEZWZpbmVzIHN1cHBvcnRlZCBtb2RpZmllcnMgZm9yIGtleSBldmVudHMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTU9ESUZJRVJfS0VZUyA9IFsnYWx0JywgJ2NvbnRyb2wnLCAnbWV0YScsICdzaGlmdCddOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRE9NX0tFWV9MT0NBVElPTl9OVU1QQUQgPSAzOwogICAgLy8gTWFwIHRvIGNvbnZlcnQgc29tZSBrZXkgb3Iga2V5SWRlbnRpZmllciB2YWx1ZXMgdG8gd2hhdCB3aWxsIGJlIHJldHVybmVkIGJ5IGdldEV2ZW50S2V5CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfa2V5TWFwID0gewogICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgdmFsdWVzIGFyZSBoZXJlIGZvciBjcm9zcy1icm93c2VyIGNvbXBhdGliaWxpdHkgYW5kIHRvIG1hdGNoIHRoZSBXM0Mgc3RhbmRhcmQKICAgICAgICAvLyBjZiBodHRwOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMta2V5LwogICAgICAgICdcYic6ICdCYWNrc3BhY2UnLAogICAgICAgICdcdCc6ICdUYWInLAogICAgICAgICdceDdGJzogJ0RlbGV0ZScsCiAgICAgICAgJ1x4MUInOiAnRXNjYXBlJywKICAgICAgICAnRGVsJzogJ0RlbGV0ZScsCiAgICAgICAgJ0VzYyc6ICdFc2NhcGUnLAogICAgICAgICdMZWZ0JzogJ0Fycm93TGVmdCcsCiAgICAgICAgJ1JpZ2h0JzogJ0Fycm93UmlnaHQnLAogICAgICAgICdVcCc6ICdBcnJvd1VwJywKICAgICAgICAnRG93bic6ICdBcnJvd0Rvd24nLAogICAgICAgICdNZW51JzogJ0NvbnRleHRNZW51JywKICAgICAgICAnU2Nyb2xsJzogJ1Njcm9sbExvY2snLAogICAgICAgICdXaW4nOiAnT1MnCiAgICB9OwogICAgLy8gVGhlcmUgaXMgYSBidWcgaW4gQ2hyb21lIGZvciBudW1lcmljIGtleXBhZCBrZXlzOgogICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE1NTY1NAogICAgLy8gMSwgMiwgMyAuLi4gYXJlIHJlcG9ydGVkIGFzIEEsIEIsIEMgLi4uCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfY2hyb21lTnVtS2V5UGFkTWFwID0gewogICAgICAgICdBJzogJzEnLAogICAgICAgICdCJzogJzInLAogICAgICAgICdDJzogJzMnLAogICAgICAgICdEJzogJzQnLAogICAgICAgICdFJzogJzUnLAogICAgICAgICdGJzogJzYnLAogICAgICAgICdHJzogJzcnLAogICAgICAgICdIJzogJzgnLAogICAgICAgICdJJzogJzknLAogICAgICAgICdKJzogJyonLAogICAgICAgICdLJzogJysnLAogICAgICAgICdNJzogJy0nLAogICAgICAgICdOJzogJy4nLAogICAgICAgICdPJzogJy8nLAogICAgICAgICdceDYwJzogJzAnLAogICAgICAgICdceDkwJzogJ051bUxvY2snCiAgICB9OwogICAgY29uc3QgybUwJDMkMSA9IC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV2ZW50KSA9PiBldmVudC5hbHRLZXksIMm1MSQxID0gLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXZlbnQpID0+IGV2ZW50LmN0cmxLZXksIMm1MiQyID0gLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXZlbnQpID0+IGV2ZW50Lm1ldGFLZXksIMm1MyQyID0gLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXZlbnQpID0+IGV2ZW50LnNoaWZ0S2V5OwogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgbW9kaWZpZXJzIGZyb20ga2V5LWV2ZW50IG9iamVjdHMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTU9ESUZJRVJfS0VZX0dFVFRFUlMgPSB7CiAgICAgICAgJ2FsdCc6ICjJtTAkMyQxKSwKICAgICAgICAnY29udHJvbCc6ICjJtTEkMSksCiAgICAgICAgJ21ldGEnOiAoybUyJDIpLAogICAgICAgICdzaGlmdCc6ICjJtTMkMikKICAgIH07CiAgICAvKioKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBBIGJyb3dzZXIgcGx1Zy1pbiB0aGF0IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGhhbmRsaW5nIG9mIGtleSBldmVudHMgaW4gQW5ndWxhci4KICAgICAqLwogICAgY2xhc3MgS2V5RXZlbnRzUGx1Z2luIGV4dGVuZHMgRXZlbnRNYW5hZ2VyUGx1Z2luIHsKICAgICAgICAvKioKICAgICAgICAgKiBJbml0aWFsaXplcyBhbiBpbnN0YW5jZSBvZiB0aGUgYnJvd3NlciBwbHVnLWluLgogICAgICAgICAqIEBwYXJhbSB7P30gZG9jIFRoZSBkb2N1bWVudCBpbiB3aGljaCBrZXkgZXZlbnRzIHdpbGwgYmUgZGV0ZWN0ZWQuCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZG9jKSB7CiAgICAgICAgICAgIHN1cGVyKGRvYyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlcG9ydHMgd2hldGhlciBhIG5hbWVkIGtleSBldmVudCBpcyBzdXBwb3J0ZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUgVGhlIGV2ZW50IG5hbWUgdG8gcXVlcnkuCiAgICAgICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgbmFtZWQga2V5IGV2ZW50IGlzIHN1cHBvcnRlZC4KICAgICAgICAgKi8KICAgICAgICBzdXBwb3J0cyhldmVudE5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIEtleUV2ZW50c1BsdWdpbi5wYXJzZUV2ZW50TmFtZShldmVudE5hbWUpICE9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIGhhbmRsZXIgZm9yIGEgc3BlY2lmaWMgZWxlbWVudCBhbmQga2V5IGV2ZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgSFRNTCBlbGVtZW50IHRvIHJlY2VpdmUgZXZlbnQgbm90aWZpY2F0aW9ucy4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZSBUaGUgbmFtZSBvZiB0aGUga2V5IGV2ZW50IHRvIGxpc3RlbiBmb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSBoYW5kbGVyIEEgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSBub3RpZmljYXRpb24gb2NjdXJzLiBSZWNlaXZlcyB0aGUKICAgICAgICAgKiBldmVudCBvYmplY3QgYXMgYW4gYXJndW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIGtleSBldmVudCB0aGF0IHdhcyByZWdpc3RlcmVkLgogICAgICAgICAqLwogICAgICAgIGFkZEV2ZW50TGlzdGVuZXIoZWxlbWVudCwgZXZlbnROYW1lLCBoYW5kbGVyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyc2VkRXZlbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoS2V5RXZlbnRzUGx1Z2luLnBhcnNlRXZlbnROYW1lKGV2ZW50TmFtZSkpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdXRzaWRlSGFuZGxlciA9IEtleUV2ZW50c1BsdWdpbi5ldmVudENhbGxiYWNrKHBhcnNlZEV2ZW50WydmdWxsS2V5J10sIGhhbmRsZXIsIHRoaXMubWFuYWdlci5nZXRab25lKCkpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5tYW5hZ2VyLmdldFpvbmUoKS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RE9NKCkub25BbmRDYW5jZWwoZWxlbWVudCwgcGFyc2VkRXZlbnRbJ2RvbUV2ZW50TmFtZSddLCBvdXRzaWRlSGFuZGxlcik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBwYXJzZUV2ZW50TmFtZShldmVudE5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJ0cyA9IGV2ZW50TmFtZS50b0xvd2VyQ2FzZSgpLnNwbGl0KCcuJyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZG9tRXZlbnROYW1lID0gcGFydHMuc2hpZnQoKTsKICAgICAgICAgICAgaWYgKChwYXJ0cy5sZW5ndGggPT09IDApIHx8ICEoZG9tRXZlbnROYW1lID09PSAna2V5ZG93bicgfHwgZG9tRXZlbnROYW1lID09PSAna2V5dXAnKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXkgPSBLZXlFdmVudHNQbHVnaW4uX25vcm1hbGl6ZUtleSgoLyoqIEB0eXBlIHs/fSAqLyAocGFydHMucG9wKCkpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGZ1bGxLZXkgPSAnJzsKICAgICAgICAgICAgTU9ESUZJRVJfS0VZUy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBtb2RpZmllck5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG1vZGlmaWVyTmFtZSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHBhcnRzLmluZGV4T2YobW9kaWZpZXJOYW1lKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcGFydHMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgICAgICBmdWxsS2V5ICs9IG1vZGlmaWVyTmFtZSArICcuJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBmdWxsS2V5ICs9IGtleTsKICAgICAgICAgICAgaWYgKHBhcnRzLmxlbmd0aCAhPSAwIHx8IGtleS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIHJldHVybmluZyBudWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgdG8gbGV0IGFub3RoZXIgcGx1Z2luIHByb2Nlc3MgdGhlIGV2ZW50CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgICAgICAgICByZXN1bHRbJ2RvbUV2ZW50TmFtZSddID0gZG9tRXZlbnROYW1lOwogICAgICAgICAgICByZXN1bHRbJ2Z1bGxLZXknXSA9IGZ1bGxLZXk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBnZXRFdmVudEZ1bGxLZXkoZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZnVsbEtleSA9ICcnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBrZXkgPSBnZXRFdmVudEtleShldmVudCk7CiAgICAgICAgICAgIGtleSA9IGtleS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICBpZiAoa2V5ID09PSAnICcpIHsKICAgICAgICAgICAgICAgIGtleSA9ICdzcGFjZSc7IC8vIGZvciByZWFkYWJpbGl0eQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGtleSA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICBrZXkgPSAnZG90JzsgLy8gYmVjYXVzZSAnLicgaXMgdXNlZCBhcyBhIHNlcGFyYXRvciBpbiBldmVudCBuYW1lcwogICAgICAgICAgICB9CiAgICAgICAgICAgIE1PRElGSUVSX0tFWVMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbW9kaWZpZXJOYW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtb2RpZmllck5hbWUgPT4gewogICAgICAgICAgICAgICAgaWYgKG1vZGlmaWVyTmFtZSAhPSBrZXkpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJHZXR0ZXIgPSBNT0RJRklFUl9LRVlfR0VUVEVSU1ttb2RpZmllck5hbWVdOwogICAgICAgICAgICAgICAgICAgIGlmIChtb2RpZmllckdldHRlcihldmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnVsbEtleSArPSBtb2RpZmllck5hbWUgKyAnLic7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGZ1bGxLZXkgKz0ga2V5OwogICAgICAgICAgICByZXR1cm4gZnVsbEtleTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uZmlndXJlcyBhIGhhbmRsZXIgY2FsbGJhY2sgZm9yIGEga2V5IGV2ZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gZnVsbEtleSBUaGUgZXZlbnQgbmFtZSB0aGF0IGNvbWJpbmVzIGFsbCBzaW11bHRhbmVvdXMga2V5c3Ryb2tlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGhhbmRsZXIgVGhlIGZ1bmN0aW9uIHRoYXQgcmVzcG9uZHMgdG8gdGhlIGtleSBldmVudC4KICAgICAgICAgKiBAcGFyYW0gez99IHpvbmUgVGhlIHpvbmUgaW4gd2hpY2ggdGhlIGV2ZW50IG9jY3VycmVkLgogICAgICAgICAqIEByZXR1cm4gez99IEEgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGV2ZW50Q2FsbGJhY2soZnVsbEtleSwgaGFuZGxlciwgem9uZSkgewogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXZlbnQgLyoqIFRPRE8gIzkxMDAgKi8pID0+IHsKICAgICAgICAgICAgICAgIGlmIChLZXlFdmVudHNQbHVnaW4uZ2V0RXZlbnRGdWxsS2V5KGV2ZW50KSA9PT0gZnVsbEtleSkgewogICAgICAgICAgICAgICAgICAgIHpvbmUucnVuR3VhcmRlZCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBoYW5kbGVyKGV2ZW50KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30ga2V5TmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIF9ub3JtYWxpemVLZXkoa2V5TmFtZSkgewogICAgICAgICAgICAvLyBUT0RPOiBzd2l0Y2ggdG8gYSBNYXAgaWYgdGhlIG1hcHBpbmcgZ3Jvd3MgdG9vIG11Y2gKICAgICAgICAgICAgc3dpdGNoIChrZXlOYW1lKSB7CiAgICAgICAgICAgICAgICBjYXNlICdlc2MnOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAnZXNjYXBlJzsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGtleU5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBLZXlFdmVudHNQbHVnaW4uybVmYWMgPSBmdW5jdGlvbiBLZXlFdmVudHNQbHVnaW5fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgS2V5RXZlbnRzUGx1Z2luKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKICAgIEtleUV2ZW50c1BsdWdpbi7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBLZXlFdmVudHNQbHVnaW4sIGZhY3Rvcnk6IEtleUV2ZW50c1BsdWdpbi7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgS2V5RXZlbnRzUGx1Z2luLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RXZlbnRLZXkoZXZlbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGtleSA9IGV2ZW50LmtleTsKICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKICAgICAgICAgICAga2V5ID0gZXZlbnQua2V5SWRlbnRpZmllcjsKICAgICAgICAgICAgLy8ga2V5SWRlbnRpZmllciBpcyBkZWZpbmVkIGluIHRoZSBvbGQgZHJhZnQgb2YgRE9NIExldmVsIDMgRXZlbnRzIGltcGxlbWVudGVkIGJ5IENocm9tZSBhbmQKICAgICAgICAgICAgLy8gU2FmYXJpIGNmCiAgICAgICAgICAgIC8vIGh0dHA6Ly93d3cudzMub3JnL1RSLzIwMDcvV0QtRE9NLUxldmVsLTMtRXZlbnRzLTIwMDcxMjIxL2V2ZW50cy5odG1sI0V2ZW50cy1LZXlib2FyZEV2ZW50cy1JbnRlcmZhY2VzCiAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuICdVbmlkZW50aWZpZWQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChrZXkuc3RhcnRzV2l0aCgnVSsnKSkgewogICAgICAgICAgICAgICAga2V5ID0gU3RyaW5nLmZyb21DaGFyQ29kZShwYXJzZUludChrZXkuc3Vic3RyaW5nKDIpLCAxNikpOwogICAgICAgICAgICAgICAgaWYgKGV2ZW50LmxvY2F0aW9uID09PSBET01fS0VZX0xPQ0FUSU9OX05VTVBBRCAmJiBfY2hyb21lTnVtS2V5UGFkTWFwLmhhc093blByb3BlcnR5KGtleSkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhIGJ1ZyBpbiBDaHJvbWUgZm9yIG51bWVyaWMga2V5cGFkIGtleXM6CiAgICAgICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTE1NTY1NAogICAgICAgICAgICAgICAgICAgIC8vIDEsIDIsIDMgLi4uIGFyZSByZXBvcnRlZCBhcyBBLCBCLCBDIC4uLgogICAgICAgICAgICAgICAgICAgIGtleSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoX2Nocm9tZU51bUtleVBhZE1hcCkpKVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBfa2V5TWFwW2tleV0gfHwga2V5OwogICAgfQogICAgLyoqCiAgICAgKiBEb21TYW5pdGl6ZXIgaGVscHMgcHJldmVudGluZyBDcm9zcyBTaXRlIFNjcmlwdGluZyBTZWN1cml0eSBidWdzIChYU1MpIGJ5IHNhbml0aXppbmcKICAgICAqIHZhbHVlcyB0byBiZSBzYWZlIHRvIHVzZSBpbiB0aGUgZGlmZmVyZW50IERPTSBjb250ZXh0cy4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSwgd2hlbiBiaW5kaW5nIGEgVVJMIGluIGFuIGA8YSBbaHJlZl09InNvbWVWYWx1ZSI+YCBoeXBlcmxpbmssIGBzb21lVmFsdWVgIHdpbGwgYmUKICAgICAqIHNhbml0aXplZCBzbyB0aGF0IGFuIGF0dGFja2VyIGNhbm5vdCBpbmplY3QgZS5nLiBhIGBqYXZhc2NyaXB0OmAgVVJMIHRoYXQgd291bGQgZXhlY3V0ZSBjb2RlIG9uCiAgICAgKiB0aGUgd2Vic2l0ZS4KICAgICAqCiAgICAgKiBJbiBzcGVjaWZpYyBzaXR1YXRpb25zLCBpdCBtaWdodCBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSBzYW5pdGl6YXRpb24sIGZvciBleGFtcGxlIGlmIHRoZQogICAgICogYXBwbGljYXRpb24gZ2VudWluZWx5IG5lZWRzIHRvIHByb2R1Y2UgYSBgamF2YXNjcmlwdDpgIHN0eWxlIGxpbmsgd2l0aCBhIGR5bmFtaWMgdmFsdWUgaW4gaXQuCiAgICAgKiBVc2VycyBjYW4gYnlwYXNzIHNlY3VyaXR5IGJ5IGNvbnN0cnVjdGluZyBhIHZhbHVlIHdpdGggb25lIG9mIHRoZSBgYnlwYXNzU2VjdXJpdHlUcnVzdC4uLmAKICAgICAqIG1ldGhvZHMsIGFuZCB0aGVuIGJpbmRpbmcgdG8gdGhhdCB2YWx1ZSBmcm9tIHRoZSB0ZW1wbGF0ZS4KICAgICAqCiAgICAgKiBUaGVzZSBzaXR1YXRpb25zIHNob3VsZCBiZSB2ZXJ5IHJhcmUsIGFuZCBleHRyYW9yZGluYXJ5IGNhcmUgbXVzdCBiZSB0YWtlbiB0byBhdm9pZCBjcmVhdGluZyBhCiAgICAgKiBDcm9zcyBTaXRlIFNjcmlwdGluZyAoWFNTKSBzZWN1cml0eSBidWchCiAgICAgKgogICAgICogV2hlbiB1c2luZyBgYnlwYXNzU2VjdXJpdHlUcnVzdC4uLmAsIG1ha2Ugc3VyZSB0byBjYWxsIHRoZSBtZXRob2QgYXMgZWFybHkgYXMgcG9zc2libGUgYW5kIGFzCiAgICAgKiBjbG9zZSBhcyBwb3NzaWJsZSB0byB0aGUgc291cmNlIG9mIHRoZSB2YWx1ZSwgdG8gbWFrZSBpdCBlYXN5IHRvIHZlcmlmeSBubyBzZWN1cml0eSBidWcgaXMKICAgICAqIGNyZWF0ZWQgYnkgaXRzIHVzZS4KICAgICAqCiAgICAgKiBJdCBpcyBub3QgcmVxdWlyZWQgKGFuZCBub3QgcmVjb21tZW5kZWQpIHRvIGJ5cGFzcyBzZWN1cml0eSBpZiB0aGUgdmFsdWUgaXMgc2FmZSwgZS5nLiBhIFVSTCB0aGF0CiAgICAgKiBkb2VzIG5vdCBzdGFydCB3aXRoIGEgc3VzcGljaW91cyBwcm90b2NvbCwgb3IgYW4gSFRNTCBzbmlwcGV0IHRoYXQgZG9lcyBub3QgY29udGFpbiBkYW5nZXJvdXMKICAgICAqIGNvZGUuIFRoZSBzYW5pdGl6ZXIgbGVhdmVzIHNhZmUgdmFsdWVzIGludGFjdC4KICAgICAqCiAgICAgKiBcQHNlY3VyaXR5IENhbGxpbmcgYW55IG9mIHRoZSBgYnlwYXNzU2VjdXJpdHlUcnVzdC4uLmAgQVBJcyBkaXNhYmxlcyBBbmd1bGFyJ3MgYnVpbHQtaW4KICAgICAqIHNhbml0aXphdGlvbiBmb3IgdGhlIHZhbHVlIHBhc3NlZCBpbi4gQ2FyZWZ1bGx5IGNoZWNrIGFuZCBhdWRpdCBhbGwgdmFsdWVzIGFuZCBjb2RlIHBhdGhzIGdvaW5nCiAgICAgKiBpbnRvIHRoaXMgY2FsbC4gTWFrZSBzdXJlIGFueSB1c2VyIGRhdGEgaXMgYXBwcm9wcmlhdGVseSBlc2NhcGVkIGZvciB0aGlzIHNlY3VyaXR5IGNvbnRleHQuCiAgICAgKiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUgW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBEb21TYW5pdGl6ZXIgewogICAgfQogICAgRG9tU2FuaXRpemVyLsm1ZmFjID0gZnVuY3Rpb24gRG9tU2FuaXRpemVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbVNhbml0aXplcikoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEb21TYW5pdGl6ZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBEb21TYW5pdGl6ZXJfRmFjdG9yeSgpIHsgcmV0dXJuIMm1ybVpbmplY3QoRG9tU2FuaXRpemVySW1wbCk7IH0sIHRva2VuOiBEb21TYW5pdGl6ZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZG9tU2FuaXRpemVySW1wbEZhY3RvcnkoaW5qZWN0b3IpIHsKICAgICAgICByZXR1cm4gbmV3IERvbVNhbml0aXplckltcGwoaW5qZWN0b3IuZ2V0KERPQ1VNRU5UJDEpKTsKICAgIH0KICAgIGNsYXNzIERvbVNhbml0aXplckltcGwgZXh0ZW5kcyBEb21TYW5pdGl6ZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2RvYwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9kb2MpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fZG9jID0gX2RvYzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjdHgKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzYW5pdGl6ZShjdHgsIHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHN3aXRjaCAoY3R4KSB7CiAgICAgICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5OT05FOgogICAgICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LkhUTUw6CiAgICAgICAgICAgICAgICAgICAgaWYgKGFsbG93U2FuaXRpemF0aW9uQnlwYXNzQW5kVGhyb3codmFsdWUsICJIVE1MIiAvKiBIdG1sICovKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYW5pdGl6ZUh0bWwodGhpcy5fZG9jLCBTdHJpbmcodmFsdWUpKTsKICAgICAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlNUWUxFOgogICAgICAgICAgICAgICAgICAgIGlmIChhbGxvd1Nhbml0aXphdGlvbkJ5cGFzc0FuZFRocm93KHZhbHVlLCAiU3R5bGUiIC8qIFN0eWxlICovKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYW5pdGl6ZVN0eWxlKCgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKTsKICAgICAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlNDUklQVDoKICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgIlNjcmlwdCIgLyogU2NyaXB0ICovKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bnNhZmUgdmFsdWUgdXNlZCBpbiBhIHNjcmlwdCBjb250ZXh0Jyk7CiAgICAgICAgICAgICAgICBjYXNlIFNlY3VyaXR5Q29udGV4dC5VUkw6CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPSBnZXRTYW5pdGl6YXRpb25CeXBhc3NUeXBlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgIlVSTCIgLyogVXJsICovKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdW53cmFwU2FmZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9zYW5pdGl6ZVVybChTdHJpbmcodmFsdWUpKTsKICAgICAgICAgICAgICAgIGNhc2UgU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTDoKICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb3dTYW5pdGl6YXRpb25CeXBhc3NBbmRUaHJvdyh2YWx1ZSwgIlJlc291cmNlVVJMIiAvKiBSZXNvdXJjZVVybCAqLykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVud3JhcFNhZmVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5zYWZlIHZhbHVlIHVzZWQgaW4gYSByZXNvdXJjZSBVUkwgY29udGV4dCAoc2VlIGh0dHA6Ly9nLmNvL25nL3NlY3VyaXR5I3hzcyknKTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIFNlY3VyaXR5Q29udGV4dCAke2N0eH0gKHNlZSBodHRwOi8vZy5jby9uZy9zZWN1cml0eSN4c3MpYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnlwYXNzU2VjdXJpdHlUcnVzdEh0bWwodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0SHRtbCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJ5cGFzc1NlY3VyaXR5VHJ1c3RTdHlsZSh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RTdHlsZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJ5cGFzc1NlY3VyaXR5VHJ1c3RTY3JpcHQodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0U2NyaXB0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnlwYXNzU2VjdXJpdHlUcnVzdFVybCh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gYnlwYXNzU2FuaXRpemF0aW9uVHJ1c3RVcmwodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBieXBhc3NTZWN1cml0eVRydXN0UmVzb3VyY2VVcmwodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIGJ5cGFzc1Nhbml0aXphdGlvblRydXN0UmVzb3VyY2VVcmwodmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIERvbVNhbml0aXplckltcGwuybVmYWMgPSBmdW5jdGlvbiBEb21TYW5pdGl6ZXJJbXBsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERvbVNhbml0aXplckltcGwpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBEb21TYW5pdGl6ZXJJbXBsLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEb21TYW5pdGl6ZXJJbXBsLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRG9tU2FuaXRpemVySW1wbF9GYWN0b3J5KCkgeyByZXR1cm4gZG9tU2FuaXRpemVySW1wbEZhY3RvcnkoybXJtWluamVjdChJTkpFQ1RPUikpOyB9LCB0b2tlbjogRG9tU2FuaXRpemVySW1wbCwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvYnJvd3Nlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluaXREb21BZGFwdGVyKCkgewogICAgICAgIEJyb3dzZXJEb21BZGFwdGVyLm1ha2VDdXJyZW50KCk7CiAgICAgICAgQnJvd3NlckdldFRlc3RhYmlsaXR5LmluaXQoKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXJyb3JIYW5kbGVyKCkgewogICAgICAgIHJldHVybiBuZXcgRXJyb3JIYW5kbGVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9kb2N1bWVudCgpIHsKICAgICAgICAvLyBUZWxsIGl2eSBhYm91dCB0aGUgZ2xvYmFsIGRvY3VtZW50CiAgICAgICAgc2V0RG9jdW1lbnQoZG9jdW1lbnQpOwogICAgICAgIHJldHVybiBkb2N1bWVudDsKICAgIH0KICAgIGNvbnN0IMm1MCQ0JDEgPSBQTEFURk9STV9CUk9XU0VSX0lEOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlMgPSBbCiAgICAgICAgeyBwcm92aWRlOiBQTEFURk9STV9JRCwgdXNlVmFsdWU6IMm1MCQ0JDEgfSwKICAgICAgICB7IHByb3ZpZGU6IFBMQVRGT1JNX0lOSVRJQUxJWkVSLCB1c2VWYWx1ZTogaW5pdERvbUFkYXB0ZXIsIG11bHRpOiB0cnVlIH0sCiAgICAgICAgeyBwcm92aWRlOiBET0NVTUVOVCQxLCB1c2VGYWN0b3J5OiBfZG9jdW1lbnQsIGRlcHM6IFtdIH0sCiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQlJPV1NFUl9TQU5JVElaQVRJT05fUFJPVklERVJTX19QT1NUX1IzX18gPSBbXTsKICAgIC8qKgogICAgICogXEBzZWN1cml0eSBSZXBsYWNpbmcgYnVpbHQtaW4gc2FuaXRpemF0aW9uIHByb3ZpZGVycyBleHBvc2VzIHRoZSBhcHBsaWNhdGlvbiB0byBYU1Mgcmlza3MuCiAgICAgKiBBdHRhY2tlci1jb250cm9sbGVkIGRhdGEgaW50cm9kdWNlZCBieSBhbiB1bnNhbml0aXplZCBwcm92aWRlciBjb3VsZCBleHBvc2UgeW91cgogICAgICogYXBwbGljYXRpb24gdG8gWFNTIHJpc2tzLiBGb3IgbW9yZSBkZXRhaWwsIHNlZSB0aGUgW1NlY3VyaXR5IEd1aWRlXShodHRwOi8vZy5jby9uZy9zZWN1cml0eSkuCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUyA9IEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSU19fUE9TVF9SM19fOwogICAgLyoqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHBsYXRmb3JtQnJvd3NlciA9IGNyZWF0ZVBsYXRmb3JtRmFjdG9yeShwbGF0Zm9ybUNvcmUsICdicm93c2VyJywgSU5URVJOQUxfQlJPV1NFUl9QTEFURk9STV9QUk9WSURFUlMpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQlJPV1NFUl9NT0RVTEVfUFJPVklERVJTID0gWwogICAgICAgIEJST1dTRVJfU0FOSVRJWkFUSU9OX1BST1ZJREVSUywKICAgICAgICB7IHByb3ZpZGU6IElOSkVDVE9SX1NDT1BFLCB1c2VWYWx1ZTogJ3Jvb3QnIH0sCiAgICAgICAgeyBwcm92aWRlOiBFcnJvckhhbmRsZXIsIHVzZUZhY3Rvcnk6IGVycm9ySGFuZGxlciwgZGVwczogW10gfSwKICAgICAgICB7CiAgICAgICAgICAgIHByb3ZpZGU6IEVWRU5UX01BTkFHRVJfUExVR0lOUywKICAgICAgICAgICAgdXNlQ2xhc3M6IERvbUV2ZW50c1BsdWdpbiwKICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgIGRlcHM6IFtET0NVTUVOVCQxLCBOZ1pvbmUsIFBMQVRGT1JNX0lEXQogICAgICAgIH0sCiAgICAgICAgeyBwcm92aWRlOiBFVkVOVF9NQU5BR0VSX1BMVUdJTlMsIHVzZUNsYXNzOiBLZXlFdmVudHNQbHVnaW4sIG11bHRpOiB0cnVlLCBkZXBzOiBbRE9DVU1FTlQkMV0gfSwKICAgICAgICBIQU1NRVJfUFJPVklERVJTLAogICAgICAgIHsKICAgICAgICAgICAgcHJvdmlkZTogRG9tUmVuZGVyZXJGYWN0b3J5MiwKICAgICAgICAgICAgdXNlQ2xhc3M6IERvbVJlbmRlcmVyRmFjdG9yeTIsCiAgICAgICAgICAgIGRlcHM6IFtFdmVudE1hbmFnZXIsIERvbVNoYXJlZFN0eWxlc0hvc3QsIEFQUF9JRF0KICAgICAgICB9LAogICAgICAgIHsgcHJvdmlkZTogUmVuZGVyZXJGYWN0b3J5MiwgdXNlRXhpc3Rpbmc6IERvbVJlbmRlcmVyRmFjdG9yeTIgfSwKICAgICAgICB7IHByb3ZpZGU6IFNoYXJlZFN0eWxlc0hvc3QsIHVzZUV4aXN0aW5nOiBEb21TaGFyZWRTdHlsZXNIb3N0IH0sCiAgICAgICAgeyBwcm92aWRlOiBEb21TaGFyZWRTdHlsZXNIb3N0LCB1c2VDbGFzczogRG9tU2hhcmVkU3R5bGVzSG9zdCwgZGVwczogW0RPQ1VNRU5UJDFdIH0sCiAgICAgICAgeyBwcm92aWRlOiBUZXN0YWJpbGl0eSwgdXNlQ2xhc3M6IFRlc3RhYmlsaXR5LCBkZXBzOiBbTmdab25lXSB9LAogICAgICAgIHsgcHJvdmlkZTogRXZlbnRNYW5hZ2VyLCB1c2VDbGFzczogRXZlbnRNYW5hZ2VyLCBkZXBzOiBbRVZFTlRfTUFOQUdFUl9QTFVHSU5TLCBOZ1pvbmVdIH0sCiAgICAgICAgRUxFTUVOVF9QUk9CRV9QUk9WSURFUlMsCiAgICBdOwogICAgLyoqCiAgICAgKiBFeHBvcnRzIHJlcXVpcmVkIGluZnJhc3RydWN0dXJlIGZvciBhbGwgQW5ndWxhciBhcHBzLgogICAgICogSW5jbHVkZWQgYnkgZGVmYXVsdCBpbiBhbGwgQW5ndWxhciBhcHBzIGNyZWF0ZWQgd2l0aCB0aGUgQ0xJCiAgICAgKiBgbmV3YCBjb21tYW5kLgogICAgICogUmUtZXhwb3J0cyBgQ29tbW9uTW9kdWxlYCBhbmQgYEFwcGxpY2F0aW9uTW9kdWxlYCwgbWFraW5nIHRoZWlyCiAgICAgKiBleHBvcnRzIGFuZCBwcm92aWRlcnMgYXZhaWxhYmxlIHRvIGFsbCBhcHBzLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEJyb3dzZXJNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50TW9kdWxlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IocGFyZW50TW9kdWxlKSB7CiAgICAgICAgICAgIGlmIChwYXJlbnRNb2R1bGUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQnJvd3Nlck1vZHVsZSBoYXMgYWxyZWFkeSBiZWVuIGxvYWRlZC4gSWYgeW91IG5lZWQgYWNjZXNzIHRvIGNvbW1vbiBkaXJlY3RpdmVzIHN1Y2ggYXMgTmdJZiBhbmQgTmdGb3IgZnJvbSBhIGxhenkgbG9hZGVkIG1vZHVsZSwgaW1wb3J0IENvbW1vbk1vZHVsZSBpbnN0ZWFkLmApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbmZpZ3VyZXMgYSBicm93c2VyLWJhc2VkIGFwcCB0byB0cmFuc2l0aW9uIGZyb20gYSBzZXJ2ZXItcmVuZGVyZWQgYXBwLCBpZgogICAgICAgICAqIG9uZSBpcyBwcmVzZW50IG9uIHRoZSBwYWdlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXMgQW4gb2JqZWN0IGNvbnRhaW5pbmcgYW4gaWRlbnRpZmllciBmb3IgdGhlIGFwcCB0byB0cmFuc2l0aW9uLgogICAgICAgICAqIFRoZSBJRCBtdXN0IG1hdGNoIGJldHdlZW4gdGhlIGNsaWVudCBhbmQgc2VydmVyIHZlcnNpb25zIG9mIHRoZSBhcHAuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIHJlY29uZmlndXJlZCBgQnJvd3Nlck1vZHVsZWAgdG8gaW1wb3J0IGludG8gdGhlIGFwcCdzIHJvb3QgYEFwcE1vZHVsZWAuCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHdpdGhTZXJ2ZXJUcmFuc2l0aW9uKHBhcmFtcykgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmdNb2R1bGU6IEJyb3dzZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEFQUF9JRCwgdXNlVmFsdWU6IHBhcmFtcy5hcHBJZCB9LAogICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogVFJBTlNJVElPTl9JRCwgdXNlRXhpc3Rpbmc6IEFQUF9JRCB9LAogICAgICAgICAgICAgICAgICAgIFNFUlZFUl9UUkFOU0lUSU9OX1BST1ZJREVSUywKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgQnJvd3Nlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEJyb3dzZXJNb2R1bGUgfSk7CiAgICBCcm93c2VyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJvd3Nlck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCcm93c2VyTW9kdWxlKSjJtcm1aW5qZWN0KEJyb3dzZXJNb2R1bGUsIDEyKSk7IH0sIHByb3ZpZGVyczogQlJPV1NFUl9NT0RVTEVfUFJPVklERVJTLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBBcHBsaWNhdGlvbk1vZHVsZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEJyb3dzZXJNb2R1bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2tpcFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtCcm93c2VyTW9kdWxlLF0gfV0gfQogICAgXTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEJyb3dzZXJNb2R1bGUsIHsgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0NvbW1vbk1vZHVsZSwgQXBwbGljYXRpb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9zcmMvYnJvd3Nlci9tZXRhLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogRmFjdG9yeSB0byBjcmVhdGUgTWV0YSBzZXJ2aWNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlTWV0YSgpIHsKICAgICAgICByZXR1cm4gbmV3IE1ldGEoybXJtWluamVjdChET0NVTUVOVCQxKSk7CiAgICB9CiAgICAvKioKICAgICAqIEEgc2VydmljZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGdldCBhbmQgYWRkIG1ldGEgdGFncy4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBNZXRhIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2MKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZG9jKSB7CiAgICAgICAgICAgIHRoaXMuX2RvYyA9IF9kb2M7CiAgICAgICAgICAgIHRoaXMuX2RvbSA9IGdldERPTSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICAgICAqIEBwYXJhbSB7Pz19IGZvcmNlQ3JlYXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZFRhZyh0YWcsIGZvcmNlQ3JlYXRpb24gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIXRhZykKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVFbGVtZW50KHRhZywgZm9yY2VDcmVhdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGFncwogICAgICAgICAqIEBwYXJhbSB7Pz19IGZvcmNlQ3JlYXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZFRhZ3ModGFncywgZm9yY2VDcmVhdGlvbiA9IGZhbHNlKSB7CiAgICAgICAgICAgIGlmICghdGFncykKICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgcmV0dXJuIHRhZ3MucmVkdWNlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZXN1bHQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZXN1bHQsIHRhZykgPT4gewogICAgICAgICAgICAgICAgaWYgKHRhZykgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHRoaXMuX2dldE9yQ3JlYXRlRWxlbWVudCh0YWcsIGZvcmNlQ3JlYXRpb24pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0pLCBbXSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXR0clNlbGVjdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRUYWcoYXR0clNlbGVjdG9yKSB7CiAgICAgICAgICAgIGlmICghYXR0clNlbGVjdG9yKQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb2MucXVlcnlTZWxlY3RvcihgbWV0YVske2F0dHJTZWxlY3Rvcn1dYCkgfHwgbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhdHRyU2VsZWN0b3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFRhZ3MoYXR0clNlbGVjdG9yKSB7CiAgICAgICAgICAgIGlmICghYXR0clNlbGVjdG9yKQogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxpc3QgLypOb2RlTGlzdCovID0gdGhpcy5fZG9jLnF1ZXJ5U2VsZWN0b3JBbGwoYG1ldGFbJHthdHRyU2VsZWN0b3J9XWApOwogICAgICAgICAgICByZXR1cm4gbGlzdCA/IFtdLnNsaWNlLmNhbGwobGlzdCkgOiBbXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAgICAgKiBAcGFyYW0gez89fSBzZWxlY3RvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlVGFnKHRhZywgc2VsZWN0b3IpIHsKICAgICAgICAgICAgaWYgKCF0YWcpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3RvciB8fCB0aGlzLl9wYXJzZVNlbGVjdG9yKHRhZyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0YSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLmdldFRhZyhzZWxlY3RvcikpKTsKICAgICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZXRNZXRhRWxlbWVudEF0dHJpYnV0ZXModGFnLCBtZXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0T3JDcmVhdGVFbGVtZW50KHRhZywgdHJ1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXR0clNlbGVjdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVUYWcoYXR0clNlbGVjdG9yKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlVGFnRWxlbWVudCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5nZXRUYWcoYXR0clNlbGVjdG9yKSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVUYWdFbGVtZW50KG1ldGEpIHsKICAgICAgICAgICAgaWYgKG1ldGEpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RvbS5yZW1vdmUobWV0YSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGEKICAgICAgICAgKiBAcGFyYW0gez89fSBmb3JjZUNyZWF0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0T3JDcmVhdGVFbGVtZW50KG1ldGEsIGZvcmNlQ3JlYXRpb24gPSBmYWxzZSkgewogICAgICAgICAgICBpZiAoIWZvcmNlQ3JlYXRpb24pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gdGhpcy5fcGFyc2VTZWxlY3RvcihtZXRhKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW0gPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5nZXRUYWcoc2VsZWN0b3IpKSk7CiAgICAgICAgICAgICAgICAvLyBJdCdzIGFsbG93ZWQgdG8gaGF2ZSBtdWx0aXBsZSBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUgc28gaXQncyBub3QgZW5vdWdoIHRvCiAgICAgICAgICAgICAgICAvLyBqdXN0IGNoZWNrIHRoYXQgZWxlbWVudCB3aXRoIHRoZSBzYW1lIG5hbWUgYWxyZWFkeSBwcmVzZW50IG9uIHRoZSBwYWdlLiBXZSBhbHNvIG5lZWQgdG8KICAgICAgICAgICAgICAgIC8vIGNoZWNrIGlmIGVsZW1lbnQgaGFzIHRhZyBhdHRyaWJ1dGVzCiAgICAgICAgICAgICAgICBpZiAoZWxlbSAmJiB0aGlzLl9jb250YWluc0F0dHJpYnV0ZXMobWV0YSwgZWxlbSkpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVsZW07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvbS5jcmVhdGVFbGVtZW50KCdtZXRhJykpKTsKICAgICAgICAgICAgdGhpcy5fc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKG1ldGEsIGVsZW1lbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhlYWQgPSB0aGlzLl9kb2MuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2hlYWQnKVswXTsKICAgICAgICAgICAgaGVhZC5hcHBlbmRDaGlsZChlbGVtZW50KTsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0TWV0YUVsZW1lbnRBdHRyaWJ1dGVzKHRhZywgZWwpIHsKICAgICAgICAgICAgT2JqZWN0LmtleXModGFnKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocHJvcCkgPT4gZWwuc2V0QXR0cmlidXRlKHByb3AsIHRhZ1twcm9wXSkpKTsKICAgICAgICAgICAgcmV0dXJuIGVsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdGFnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcGFyc2VTZWxlY3Rvcih0YWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyID0gdGFnLm5hbWUgPyAnbmFtZScgOiAncHJvcGVydHknOwogICAgICAgICAgICByZXR1cm4gYCR7YXR0cn09IiR7dGFnW2F0dHJdfSJgOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdGFnCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY29udGFpbnNBdHRyaWJ1dGVzKHRhZywgZWxlbSkgewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmtleXModGFnKS5ldmVyeSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoa2V5KSA9PiBlbGVtLmdldEF0dHJpYnV0ZShrZXkpID09PSB0YWdba2V5XSkpOwogICAgICAgIH0KICAgIH0KICAgIE1ldGEuybVmYWMgPSBmdW5jdGlvbiBNZXRhX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldGEpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNZXRhLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRhLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogY3JlYXRlTWV0YSwgdG9rZW46IE1ldGEsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL2Jyb3dzZXIvdGl0bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBGYWN0b3J5IHRvIGNyZWF0ZSBUaXRsZSBzZXJ2aWNlLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlVGl0bGUoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBUaXRsZSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsKICAgIH0KICAgIC8qKgogICAgICogQSBzZXJ2aWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZ2V0IGFuZCBzZXQgdGhlIHRpdGxlIG9mIGEgY3VycmVudCBIVE1MIGRvY3VtZW50LgogICAgICoKICAgICAqIFNpbmNlIGFuIEFuZ3VsYXIgYXBwbGljYXRpb24gY2FuJ3QgYmUgYm9vdHN0cmFwcGVkIG9uIHRoZSBlbnRpcmUgSFRNTCBkb2N1bWVudCAoYDxodG1sPmAgdGFnKQogICAgICogaXQgaXMgbm90IHBvc3NpYmxlIHRvIGJpbmQgdG8gdGhlIGB0ZXh0YCBwcm9wZXJ0eSBvZiB0aGUgYEhUTUxUaXRsZUVsZW1lbnRgIGVsZW1lbnRzCiAgICAgKiAocmVwcmVzZW50aW5nIHRoZSBgPHRpdGxlPmAgdGFnKS4gSW5zdGVhZCwgdGhpcyBzZXJ2aWNlIGNhbiBiZSB1c2VkIHRvIHNldCBhbmQgZ2V0IHRoZSBjdXJyZW50CiAgICAgKiB0aXRsZSB2YWx1ZS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBUaXRsZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2RvYykgewogICAgICAgICAgICB0aGlzLl9kb2MgPSBfZG9jOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXQgdGhlIHRpdGxlIG9mIHRoZSBjdXJyZW50IEhUTUwgZG9jdW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRUaXRsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvYy50aXRsZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0IHRoZSB0aXRsZSBvZiB0aGUgY3VycmVudCBIVE1MIGRvY3VtZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gbmV3VGl0bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFRpdGxlKG5ld1RpdGxlKSB7CiAgICAgICAgICAgIHRoaXMuX2RvYy50aXRsZSA9IG5ld1RpdGxlIHx8ICcnOwogICAgICAgIH0KICAgIH0KICAgIFRpdGxlLsm1ZmFjID0gZnVuY3Rpb24gVGl0bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGl0bGUpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUaXRsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGl0bGUuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBjcmVhdGVUaXRsZSwgdG9rZW46IFRpdGxlLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdW5lc2NhcGVIdG1sKHRleHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdW5lc2NhcGVkVGV4dCA9IHsKICAgICAgICAgICAgJyZhOyc6ICcmJywKICAgICAgICAgICAgJyZxOyc6ICciJywKICAgICAgICAgICAgJyZzOyc6ICdcJycsCiAgICAgICAgICAgICcmbDsnOiAnPCcsCiAgICAgICAgICAgICcmZzsnOiAnPicsCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC8mW147XSs7L2csICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHMgPT4gdW5lc2NhcGVkVGV4dFtzXSkpOwogICAgfQogICAgLyoqCiAgICAgKiBBIGtleSB2YWx1ZSBzdG9yZSB0aGF0IGlzIHRyYW5zZmVycmVkIGZyb20gdGhlIGFwcGxpY2F0aW9uIG9uIHRoZSBzZXJ2ZXIgc2lkZSB0byB0aGUgYXBwbGljYXRpb24KICAgICAqIG9uIHRoZSBjbGllbnQgc2lkZS4KICAgICAqCiAgICAgKiBgVHJhbnNmZXJTdGF0ZWAgd2lsbCBiZSBhdmFpbGFibGUgYXMgYW4gaW5qZWN0YWJsZSB0b2tlbi4gVG8gdXNlIGl0IGltcG9ydAogICAgICogYFNlcnZlclRyYW5zZmVyU3RhdGVNb2R1bGVgIG9uIHRoZSBzZXJ2ZXIgYW5kIGBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZWAgb24gdGhlIGNsaWVudC4KICAgICAqCiAgICAgKiBUaGUgdmFsdWVzIGluIHRoZSBzdG9yZSBhcmUgc2VyaWFsaXplZC9kZXNlcmlhbGl6ZWQgdXNpbmcgSlNPTi5zdHJpbmdpZnkvSlNPTi5wYXJzZS4gU28gb25seQogICAgICogYm9vbGVhbiwgbnVtYmVyLCBzdHJpbmcsIG51bGwgYW5kIG5vbi1jbGFzcyBvYmplY3RzIHdpbGwgYmUgc2VyaWFsaXplZCBhbmQgZGVzZXJpYWx6aWVkIGluIGEKICAgICAqIG5vbi1sb3NzeSBtYW5uZXIuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgVHJhbnNmZXJTdGF0ZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSB7fTsKICAgICAgICAgICAgdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrcyA9IHt9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBpbml0U3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBpbml0KGluaXRTdGF0ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRyYW5zZmVyU3RhdGUgPSBuZXcgVHJhbnNmZXJTdGF0ZSgpOwogICAgICAgICAgICB0cmFuc2ZlclN0YXRlLnN0b3JlID0gaW5pdFN0YXRlOwogICAgICAgICAgICByZXR1cm4gdHJhbnNmZXJTdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEga2V5LiBSZXR1cm4gYGRlZmF1bHRWYWx1ZWAgaWYga2V5IGlzIG5vdCBmb3VuZC4KICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHBhcmFtIHs/fSBkZWZhdWx0VmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldChrZXksIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yZVtrZXldICE9PSB1bmRlZmluZWQgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5zdG9yZVtrZXldKSkgOiBkZWZhdWx0VmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldCB0aGUgdmFsdWUgY29ycmVzcG9uZGluZyB0byBhIGtleS4KICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0KGtleSwgdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZSBhIGtleSBmcm9tIHRoZSBzdG9yZS4KICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmUoa2V5KSB7CiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnN0b3JlW2tleV07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlc3Qgd2hldGhlciBhIGtleSBleGlzdHMgaW4gdGhlIHN0b3JlLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc0tleShrZXkpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuaGFzT3duUHJvcGVydHkoa2V5KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBwcm92aWRlIHRoZSB2YWx1ZSBmb3IgYSBrZXkgd2hlbiBgdG9Kc29uYCBpcyBjYWxsZWQuCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU2VyaWFsaXplKGtleSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1trZXldID0gY2FsbGJhY2s7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZSB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgc3RvcmUgdG8gSlNPTi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvSnNvbigpIHsKICAgICAgICAgICAgLy8gQ2FsbCB0aGUgb25TZXJpYWxpemUgY2FsbGJhY2tzIGFuZCBwdXQgdGhvc2UgdmFsdWVzIGludG8gdGhlIHN0b3JlLgogICAgICAgICAgICBmb3IgKGNvbnN0IGtleSBpbiB0aGlzLm9uU2VyaWFsaXplQ2FsbGJhY2tzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZVtrZXldID0gdGhpcy5vblNlcmlhbGl6ZUNhbGxiYWNrc1trZXldKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignRXhjZXB0aW9uIGluIG9uU2VyaWFsaXplIGNhbGxiYWNrOiAnLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMuc3RvcmUpOwogICAgICAgIH0KICAgIH0KICAgIFRyYW5zZmVyU3RhdGUuybVmYWMgPSBmdW5jdGlvbiBUcmFuc2ZlclN0YXRlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRyYW5zZmVyU3RhdGUpKCk7IH07CiAgICBUcmFuc2ZlclN0YXRlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFRyYW5zZmVyU3RhdGUsIGZhY3Rvcnk6IFRyYW5zZmVyU3RhdGUuybVmYWMgfSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZG9jCiAgICAgKiBAcGFyYW0gez99IGFwcElkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbml0VHJhbnNmZXJTdGF0ZShkb2MsIGFwcElkKSB7CiAgICAgICAgLy8gTG9jYXRlIHRoZSBzY3JpcHQgdGFnIHdpdGggdGhlIEpTT04gZGF0YSB0cmFuc2ZlcnJlZCBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgICAgLy8gVGhlIGlkIG9mIHRoZSBzY3JpcHQgdGFnIGlzIHNldCB0byB0aGUgQW5ndWxhciBhcHBJZCArICdzdGF0ZScuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNjcmlwdCA9IGRvYy5nZXRFbGVtZW50QnlJZChhcHBJZCArICctc3RhdGUnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGluaXRpYWxTdGF0ZSA9IHt9OwogICAgICAgIGlmIChzY3JpcHQgJiYgc2NyaXB0LnRleHRDb250ZW50KSB7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICBpbml0aWFsU3RhdGUgPSBKU09OLnBhcnNlKHVuZXNjYXBlSHRtbChzY3JpcHQudGV4dENvbnRlbnQpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdFeGNlcHRpb24gd2hpbGUgcmVzdG9yaW5nIFRyYW5zZmVyU3RhdGUgZm9yIGFwcCAnICsgYXBwSWQsIGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBUcmFuc2ZlclN0YXRlLmluaXQoaW5pdGlhbFN0YXRlKTsKICAgIH0KICAgIC8qKgogICAgICogTmdNb2R1bGUgdG8gaW5zdGFsbCBvbiB0aGUgY2xpZW50IHNpZGUgd2hpbGUgdXNpbmcgdGhlIGBUcmFuc2ZlclN0YXRlYCB0byB0cmFuc2ZlciBzdGF0ZSBmcm9tCiAgICAgKiBzZXJ2ZXIgdG8gY2xpZW50LgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlIHsKICAgIH0KICAgIEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQnJvd3NlclRyYW5zZmVyU3RhdGVNb2R1bGUgfSk7CiAgICBCcm93c2VyVHJhbnNmZXJTdGF0ZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEJyb3dzZXJUcmFuc2ZlclN0YXRlTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFRyYW5zZmVyU3RhdGUsIHVzZUZhY3Rvcnk6IGluaXRUcmFuc2ZlclN0YXRlLCBkZXBzOiBbRE9DVU1FTlQkMSwgQVBQX0lEXSB9XSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL3ByaXZhdGVfZXhwb3J0LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvc3JjL3ZlcnNpb24udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFZFUlNJT04kMiA9IG5ldyBWZXJzaW9uKCc5LjEuMTInKTsKCiAgICB2YXIgY29tbW9uanNHbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyB3aW5kb3cgOiB0eXBlb2YgZ2xvYmFsICE9PSAndW5kZWZpbmVkJyA/IGdsb2JhbCA6IHR5cGVvZiBzZWxmICE9PSAndW5kZWZpbmVkJyA/IHNlbGYgOiB7fTsKCiAgICAvKioKICAgICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjAtbmV4dC40KzYxLnNoYS1lNTUyNTkxLndpdGgtbG9jYWwtY2hhbmdlcwogICAgKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICogTGljZW5zZTogTUlUCiAgICAqLwogICAgKGZ1bmN0aW9uIChmYWN0b3J5KSB7CiAgICAgICAgCiAgICAgICAgICAgIGZhY3RvcnkoKTsKICAgIH0oKGZ1bmN0aW9uICgpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiAgICAgICAgdmFyIFpvbmUkMSA9IChmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICAgICAgICAgIHZhciBwZXJmb3JtYW5jZSA9IGdsb2JhbFsncGVyZm9ybWFuY2UnXTsKICAgICAgICAgICAgZnVuY3Rpb24gbWFyayhuYW1lKSB7IHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlWydtYXJrJ10gJiYgcGVyZm9ybWFuY2VbJ21hcmsnXShuYW1lKTsgfQogICAgICAgICAgICBmdW5jdGlvbiBwZXJmb3JtYW5jZU1lYXN1cmUobmFtZSwgbGFiZWwpIHsKICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlICYmIHBlcmZvcm1hbmNlWydtZWFzdXJlJ10gJiYgcGVyZm9ybWFuY2VbJ21lYXN1cmUnXShuYW1lLCBsYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbWFyaygnWm9uZScpOwogICAgICAgICAgICAvLyBJbml0aWFsaXplIGJlZm9yZSBpdCdzIGFjY2Vzc2VkIGJlbG93LgogICAgICAgICAgICAvLyBfX1pvbmVfc3ltYm9sX3ByZWZpeCBnbG9iYWwgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgem9uZQogICAgICAgICAgICAvLyBzeW1ib2wgcHJlZml4IHdpdGggYSBjdXN0b20gb25lIGlmIG5lZWRlZC4KICAgICAgICAgICAgdmFyIHN5bWJvbFByZWZpeCA9IGdsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJzsKICAgICAgICAgICAgZnVuY3Rpb24gX19zeW1ib2xfXyhuYW1lKSB7IHJldHVybiBzeW1ib2xQcmVmaXggKyBuYW1lOyB9CiAgICAgICAgICAgIHZhciBjaGVja0R1cGxpY2F0ZSA9IGdsb2JhbFtfX3N5bWJvbF9fKCdmb3JjZUR1cGxpY2F0ZVpvbmVDaGVjaycpXSA9PT0gdHJ1ZTsKICAgICAgICAgICAgaWYgKGdsb2JhbFsnWm9uZSddKSB7CiAgICAgICAgICAgICAgICAvLyBpZiBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cyAobWF5YmUgem9uZS5qcyB3YXMgYWxyZWFkeSBsb2FkZWQgb3IKICAgICAgICAgICAgICAgIC8vIHNvbWUgb3RoZXIgbGliIGFsc28gcmVnaXN0ZXJlZCBhIGdsb2JhbCBvYmplY3QgbmFtZWQgWm9uZSksIHdlIG1heSBuZWVkCiAgICAgICAgICAgICAgICAvLyB0byB0aHJvdyBhbiBlcnJvciwgYnV0IHNvbWV0aW1lcyB1c2VyIG1heSBub3Qgd2FudCB0aGlzIGVycm9yLgogICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsCiAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHR3byB3ZWIgcGFnZXMsIHBhZ2UxIGluY2x1ZGVzIHpvbmUuanMsIHBhZ2UyIGRvZXNuJ3QuCiAgICAgICAgICAgICAgICAvLyBhbmQgdGhlIDFzdCB0aW1lIHVzZXIgbG9hZCBwYWdlMSBhbmQgcGFnZTIsIGV2ZXJ5dGhpbmcgd29yayBmaW5lLAogICAgICAgICAgICAgICAgLy8gYnV0IHdoZW4gdXNlciBsb2FkIHBhZ2UyIGFnYWluLCBlcnJvciBvY2N1cnMgYmVjYXVzZSBnbG9iYWxbJ1pvbmUnXSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgIC8vIHNvIHdlIGFkZCBhIGZsYWcgdG8gbGV0IHVzZXIgY2hvb3NlIHdoZXRoZXIgdG8gdGhyb3cgdGhpcyBlcnJvciBvciBub3QuCiAgICAgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBpZiBleGlzdGluZyBab25lIGlzIGZyb20gem9uZS5qcywgd2Ugd2lsbCBub3QgdGhyb3cgdGhlIGVycm9yLgogICAgICAgICAgICAgICAgaWYgKGNoZWNrRHVwbGljYXRlIHx8IHR5cGVvZiBnbG9iYWxbJ1pvbmUnXS5fX3N5bWJvbF9fICE9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lIGFscmVhZHkgbG9hZGVkLicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGdsb2JhbFsnWm9uZSddOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBab25lID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgZnVuY3Rpb24gWm9uZShwYXJlbnQsIHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50ID0gcGFyZW50OwogICAgICAgICAgICAgICAgICAgIHRoaXMuX25hbWUgPSB6b25lU3BlYyA/IHpvbmVTcGVjLm5hbWUgfHwgJ3VubmFtZWQnIDogJzxyb290Pic7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvcGVydGllcyA9IHpvbmVTcGVjICYmIHpvbmVTcGVjLnByb3BlcnRpZXMgfHwge307CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFpvbmVEZWxlZ2F0ZSh0aGlzLCB0aGlzLl9wYXJlbnQgJiYgdGhpcy5fcGFyZW50Ll96b25lRGVsZWdhdGUsIHpvbmVTcGVjKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIFpvbmUuYXNzZXJ0Wm9uZVBhdGNoZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZSddICE9PSBwYXRjaGVzWydab25lQXdhcmVQcm9taXNlJ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lLmpzIGhhcyBkZXRlY3RlZCB0aGF0IFpvbmVBd2FyZVByb21pc2UgYCh3aW5kb3d8Z2xvYmFsKS5Qcm9taXNlYCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdoYXMgYmVlbiBvdmVyd3JpdHRlbi5cbicgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ01vc3QgbGlrZWx5IGNhdXNlIGlzIHRoYXQgYSBQcm9taXNlIHBvbHlmaWxsIGhhcyBiZWVuIGxvYWRlZCAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhZnRlciBab25lLmpzIChQb2x5ZmlsbGluZyBQcm9taXNlIGFwaSBpcyBub3QgbmVjZXNzYXJ5IHdoZW4gem9uZS5qcyBpcyBsb2FkZWQuICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0lmIHlvdSBtdXN0IGxvYWQgb25lLCBkbyBzbyBiZWZvcmUgbG9hZGluZyB6b25lLmpzLiknKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmUsICJyb290IiwgewogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHpvbmUucGFyZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lID0gem9uZS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpvbmU7CiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZSwgImN1cnJlbnQiLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfY3VycmVudFpvbmVGcmFtZS56b25lOyB9LAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShab25lLCAiY3VycmVudFRhc2siLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBfY3VycmVudFRhc2s7IH0sCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICBab25lLl9fbG9hZF9wYXRjaCA9IGZ1bmN0aW9uIChuYW1lLCBmbikgewogICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaGVzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0FscmVhZHkgbG9hZGVkIHBhdGNoOiAnICsgbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWdsb2JhbFsnX19ab25lX2Rpc2FibGVfJyArIG5hbWVdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwZXJmTmFtZSA9ICdab25lOicgKyBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBtYXJrKHBlcmZOYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hlc1tuYW1lXSA9IGZuKGdsb2JhbCwgWm9uZSwgX2FwaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBlcmZvcm1hbmNlTWVhc3VyZShwZXJmTmFtZSwgcGVyZk5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZS5wcm90b3R5cGUsICJwYXJlbnQiLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzLl9wYXJlbnQ7IH0sCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmUucHJvdG90eXBlLCAibmFtZSIsIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0sCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuZ2V0ID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgICAgIHZhciB6b25lID0gdGhpcy5nZXRab25lV2l0aChrZXkpOwogICAgICAgICAgICAgICAgICAgIGlmICh6b25lKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gem9uZS5fcHJvcGVydGllc1trZXldOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmdldFpvbmVXaXRoID0gZnVuY3Rpb24gKGtleSkgewogICAgICAgICAgICAgICAgICAgIHZhciBjdXJyZW50ID0gdGhpczsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoY3VycmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudC5fcHJvcGVydGllcy5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5fcGFyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBab25lLnByb3RvdHlwZS5mb3JrID0gZnVuY3Rpb24gKHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYykKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdab25lU3BlYyByZXF1aXJlZCEnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmZvcmsodGhpcywgem9uZVNwZWMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLndyYXAgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RpbmcgZnVuY3Rpb24gZ290OiAnICsgY2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgX2NhbGxiYWNrID0gdGhpcy5fem9uZURlbGVnYXRlLmludGVyY2VwdCh0aGlzLCBjYWxsYmFjaywgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB2YXIgem9uZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHpvbmUucnVuR3VhcmRlZChfY2FsbGJhY2ssIHRoaXMsIGFyZ3VtZW50cywgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uIChjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmVEZWxlZ2F0ZS5pbnZva2UodGhpcywgY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnJ1bkd1YXJkZWQgPSBmdW5jdGlvbiAoY2FsbGJhY2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzLCBzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoYXBwbHlUaGlzID09PSB2b2lkIDApIHsgYXBwbHlUaGlzID0gbnVsbDsgfQogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0geyBwYXJlbnQ6IF9jdXJyZW50Wm9uZUZyYW1lLCB6b25lOiB0aGlzIH07CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lRGVsZWdhdGUuaW52b2tlKHRoaXMsIGNhbGxiYWNrLCBhcHBseVRoaXMsIGFwcGx5QXJncywgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyb3IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyZW50Wm9uZUZyYW1lID0gX2N1cnJlbnRab25lRnJhbWUucGFyZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBab25lLnByb3RvdHlwZS5ydW5UYXNrID0gZnVuY3Rpb24gKHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suem9uZSAhPSB0aGlzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSB0YXNrIGNhbiBvbmx5IGJlIHJ1biBpbiB0aGUgem9uZSBvZiBjcmVhdGlvbiEgKENyZWF0aW9uOiAnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0YXNrLnpvbmUgfHwgTk9fWk9ORSkubmFtZSArICc7IEV4ZWN1dGlvbjogJyArIHRoaXMubmFtZSArICcpJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzc3OCwgc29tZXRpbWVzIGV2ZW50VGFzawogICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcnVuIGluIG5vdFNjaGVkdWxlZChjYW5jZWxlZCkgc3RhdGUsIHdlIHNob3VsZCBub3QgdHJ5IHRvCiAgICAgICAgICAgICAgICAgICAgLy8gcnVuIHN1Y2gga2luZCBvZiB0YXNrIGJ1dCBqdXN0IHJldHVybgogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlID09PSBub3RTY2hlZHVsZWQgJiYgKHRhc2sudHlwZSA9PT0gZXZlbnRUYXNrIHx8IHRhc2sudHlwZSA9PT0gbWFjcm9UYXNrKSkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciByZUVudHJ5R3VhcmQgPSB0YXNrLnN0YXRlICE9IHJ1bm5pbmc7CiAgICAgICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmIHRhc2suX3RyYW5zaXRpb25UbyhydW5uaW5nLCBzY2hlZHVsZWQpOwogICAgICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNUYXNrID0gX2N1cnJlbnRUYXNrOwogICAgICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHRhc2s7CiAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogX2N1cnJlbnRab25lRnJhbWUsIHpvbmU6IHRoaXMgfTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay50eXBlID09IG1hY3JvVGFzayAmJiB0YXNrLmRhdGEgJiYgIXRhc2suZGF0YS5pc1BlcmlvZGljKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLmNhbmNlbEZuID0gdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fem9uZURlbGVnYXRlLmludm9rZVRhc2sodGhpcywgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnJvcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHRhc2sncyBzdGF0ZSBpcyBub3RTY2hlZHVsZWQgb3IgdW5rbm93biwgdGhlbiBpdCBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGxlZAogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgbm90IHJlc2V0IHRoZSBzdGF0ZSB0byBzY2hlZHVsZWQKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgIT09IG5vdFNjaGVkdWxlZCAmJiB0YXNrLnN0YXRlICE9PSB1bmtub3duKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay50eXBlID09IGV2ZW50VGFzayB8fCAodGFzay5kYXRhICYmIHRhc2suZGF0YS5pc1BlcmlvZGljKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlRW50cnlHdWFyZCAmJiB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGVkLCBydW5uaW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQgPSAwOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVFbnRyeUd1YXJkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyhub3RTY2hlZHVsZWQsIHJ1bm5pbmcsIG5vdFNjaGVkdWxlZCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgX2N1cnJlbnRab25lRnJhbWUgPSBfY3VycmVudFpvbmVGcmFtZS5wYXJlbnQ7CiAgICAgICAgICAgICAgICAgICAgICAgIF9jdXJyZW50VGFzayA9IHByZXZpb3VzVGFzazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVUYXNrID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGFzay56b25lICYmIHRhc2suem9uZSAhPT0gdGhpcykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiB0aGUgdGFzayB3YXMgcmVzY2hlZHVsZWQsIHRoZSBuZXdab25lCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgYmUgdGhlIGNoaWxkcmVuIG9mIHRoZSBvcmlnaW5hbCB6b25lCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuZXdab25lID0gdGhpczsKICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKG5ld1pvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuZXdab25lID09PSB0YXNrLnpvbmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcigiY2FuIG5vdCByZXNjaGVkdWxlIHRhc2sgdG8gIiArIHRoaXMubmFtZSArICIgd2hpY2ggaXMgZGVzY2VuZGFudHMgb2YgdGhlIG9yaWdpbmFsIHpvbmUgIiArIHRhc2suem9uZS5uYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1pvbmUgPSBuZXdab25lLnBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGluZywgbm90U2NoZWR1bGVkKTsKICAgICAgICAgICAgICAgICAgICB2YXIgem9uZURlbGVnYXRlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHRhc2suX3pvbmVEZWxlZ2F0ZXMgPSB6b25lRGVsZWdhdGVzOwogICAgICAgICAgICAgICAgICAgIHRhc2suX3pvbmUgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgPSB0aGlzLl96b25lRGVsZWdhdGUuc2NoZWR1bGVUYXNrKHRoaXMsIHRhc2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBzZXQgdGFzaydzIHN0YXRlIHRvIHVua25vd24gd2hlbiBzY2hlZHVsZVRhc2sgdGhyb3cgZXJyb3IKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgZXJyIG1heSBmcm9tIHJlc2NoZWR1bGUsIHNvIHRoZSBmcm9tU3RhdGUgbWF5YmUgbm90U2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suX3RyYW5zaXRpb25Ubyh1bmtub3duLCBzY2hlZHVsaW5nLCBub3RTY2hlZHVsZWQpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBASmlhTGlQYXNzaW9uLCBzaG91bGQgd2UgY2hlY2sgdGhlIHJlc3VsdCBmcm9tIGhhbmRsZUVycm9yPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lRGVsZWdhdGUuaGFuZGxlRXJyb3IodGhpcywgZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5fem9uZURlbGVnYXRlcyA9PT0gem9uZURlbGVnYXRlcykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGJlY2F1c2UgaW50ZXJuYWxseSB0aGUgZGVsZWdhdGUgY2FuIHJlc2NoZWR1bGUgdGhlIHRhc2suCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAxKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2suc3RhdGUgPT0gc2NoZWR1bGluZykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oc2NoZWR1bGVkLCBzY2hlZHVsaW5nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgWm9uZS5wcm90b3R5cGUuc2NoZWR1bGVNaWNyb1Rhc2sgPSBmdW5jdGlvbiAoc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKG1pY3JvVGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIHVuZGVmaW5lZCkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlTWFjcm9UYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKG1hY3JvVGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLnNjaGVkdWxlRXZlbnRUYXNrID0gZnVuY3Rpb24gKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zY2hlZHVsZVRhc2sobmV3IFpvbmVUYXNrKGV2ZW50VGFzaywgc291cmNlLCBjYWxsYmFjaywgZGF0YSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCkpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmUucHJvdG90eXBlLmNhbmNlbFRhc2sgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnpvbmUgIT0gdGhpcykKICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdBIHRhc2sgY2FuIG9ubHkgYmUgY2FuY2VsbGVkIGluIHRoZSB6b25lIG9mIGNyZWF0aW9uISAoQ3JlYXRpb246ICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2suem9uZSB8fCBOT19aT05FKS5uYW1lICsgJzsgRXhlY3V0aW9uOiAnICsgdGhpcy5uYW1lICsgJyknKTsKICAgICAgICAgICAgICAgICAgICB0YXNrLl90cmFuc2l0aW9uVG8oY2FuY2VsaW5nLCBzY2hlZHVsZWQsIHJ1bm5pbmcpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5jYW5jZWxUYXNrKHRoaXMsIHRhc2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGVycm9yIG9jY3VycyB3aGVuIGNhbmNlbFRhc2ssIHRyYW5zaXQgdGhlIHN0YXRlIHRvIHVua25vd24KICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKHVua25vd24sIGNhbmNlbGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZS5oYW5kbGVFcnJvcih0aGlzLCBlcnIpOwogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnI7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRhc2tDb3VudCh0YXNrLCAtMSk7CiAgICAgICAgICAgICAgICAgICAgdGFzay5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgY2FuY2VsaW5nKTsKICAgICAgICAgICAgICAgICAgICB0YXNrLnJ1bkNvdW50ID0gMDsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBab25lLnByb3RvdHlwZS5fdXBkYXRlVGFza0NvdW50ID0gZnVuY3Rpb24gKHRhc2ssIGNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHpvbmVEZWxlZ2F0ZXMgPSB0YXNrLl96b25lRGVsZWdhdGVzOwogICAgICAgICAgICAgICAgICAgIGlmIChjb3VudCA9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLl96b25lRGVsZWdhdGVzID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB6b25lRGVsZWdhdGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVEZWxlZ2F0ZXNbaV0uX3VwZGF0ZVRhc2tDb3VudCh0YXNrLnR5cGUsIGNvdW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIFpvbmU7CiAgICAgICAgICAgIH0oKSk7CiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpyZXF1aXJlLWludGVybmFsLXdpdGgtdW5kZXJzY29yZQogICAgICAgICAgICBab25lLl9fc3ltYm9sX18gPSBfX3N5bWJvbF9fOwogICAgICAgICAgICB2YXIgREVMRUdBVEVfWlMgPSB7CiAgICAgICAgICAgICAgICBuYW1lOiAnJywKICAgICAgICAgICAgICAgIG9uSGFzVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBfLCB0YXJnZXQsIGhhc1Rhc2tTdGF0ZSkgeyByZXR1cm4gZGVsZWdhdGUuaGFzVGFzayh0YXJnZXQsIGhhc1Rhc2tTdGF0ZSk7IH0sCiAgICAgICAgICAgICAgICBvblNjaGVkdWxlVGFzazogZnVuY3Rpb24gKGRlbGVnYXRlLCBfLCB0YXJnZXQsIHRhc2spIHsgcmV0dXJuIGRlbGVnYXRlLnNjaGVkdWxlVGFzayh0YXJnZXQsIHRhc2spOyB9LAogICAgICAgICAgICAgICAgb25JbnZva2VUYXNrOiBmdW5jdGlvbiAoZGVsZWdhdGUsIF8sIHRhcmdldCwgdGFzaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MpIHsgcmV0dXJuIGRlbGVnYXRlLmludm9rZVRhc2sodGFyZ2V0LCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncyk7IH0sCiAgICAgICAgICAgICAgICBvbkNhbmNlbFRhc2s6IGZ1bmN0aW9uIChkZWxlZ2F0ZSwgXywgdGFyZ2V0LCB0YXNrKSB7IHJldHVybiBkZWxlZ2F0ZS5jYW5jZWxUYXNrKHRhcmdldCwgdGFzayk7IH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIFpvbmVEZWxlZ2F0ZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFpvbmVEZWxlZ2F0ZSh6b25lLCBwYXJlbnREZWxlZ2F0ZSwgem9uZVNwZWMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90YXNrQ291bnRzID0geyAnbWljcm9UYXNrJzogMCwgJ21hY3JvVGFzayc6IDAsICdldmVudFRhc2snOiAwIH07CiAgICAgICAgICAgICAgICAgICAgdGhpcy56b25lID0gem9uZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnREZWxlZ2F0ZSA9IHBhcmVudERlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmtaUyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYyAmJiB6b25lU3BlYy5vbkZvcmsgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9mb3JrWlMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmtEbGd0ID0gem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uRm9yayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtEbGd0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9mb3JrQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25Gb3JrID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ZvcmtDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0WlMgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnRlcmNlcHQgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9pbnRlcmNlcHRaUyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW50ZXJjZXB0RGxndCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludGVyY2VwdCA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdERsZ3QpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludGVyY2VwdEN1cnJab25lID0KICAgICAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW50ZXJjZXB0ID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2ludGVyY2VwdEN1cnJab25lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VaUyA9IHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZSA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2ludm9rZVpTKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VEbGd0ID0KICAgICAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlRGxndCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2UgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlQ3VyclpvbmUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yWlMgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25IYW5kbGVFcnJvciA/IHpvbmVTcGVjIDogcGFyZW50RGVsZWdhdGUuX2hhbmRsZUVycm9yWlMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhbmRsZUVycm9yRGxndCA9IHpvbmVTcGVjICYmCiAgICAgICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vbkhhbmRsZUVycm9yID8gcGFyZW50RGVsZWdhdGUgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JEbGd0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVFcnJvckN1cnJab25lID0KICAgICAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSGFuZGxlRXJyb3IgPyB0aGlzLnpvbmUgOiBwYXJlbnREZWxlZ2F0ZS5faGFuZGxlRXJyb3JDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrWlMgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25TY2hlZHVsZVRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9zY2hlZHVsZVRhc2taUyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrRGxndCA9IHpvbmVTcGVjICYmCiAgICAgICAgICAgICAgICAgICAgICAgICh6b25lU3BlYy5vblNjaGVkdWxlVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0RsZ3QpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NjaGVkdWxlVGFza0N1cnJab25lID0gem9uZVNwZWMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKHpvbmVTcGVjLm9uU2NoZWR1bGVUYXNrID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX3NjaGVkdWxlVGFza0N1cnJab25lKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrWlMgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25JbnZva2VUYXNrID8gem9uZVNwZWMgOiBwYXJlbnREZWxlZ2F0ZS5faW52b2tlVGFza1pTKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrRGxndCA9CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkludm9rZVRhc2sgPyBwYXJlbnREZWxlZ2F0ZSA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrRGxndCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0N1cnJab25lID0KICAgICAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uSW52b2tlVGFzayA/IHRoaXMuem9uZSA6IHBhcmVudERlbGVnYXRlLl9pbnZva2VUYXNrQ3VyclpvbmUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2taUyA9CiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVTcGVjICYmICh6b25lU3BlYy5vbkNhbmNlbFRhc2sgPyB6b25lU3BlYyA6IHBhcmVudERlbGVnYXRlLl9jYW5jZWxUYXNrWlMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbmNlbFRhc2tEbGd0ID0KICAgICAgICAgICAgICAgICAgICAgICAgem9uZVNwZWMgJiYgKHpvbmVTcGVjLm9uQ2FuY2VsVGFzayA/IHBhcmVudERlbGVnYXRlIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2tEbGd0KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUgPQogICAgICAgICAgICAgICAgICAgICAgICB6b25lU3BlYyAmJiAoem9uZVNwZWMub25DYW5jZWxUYXNrID8gdGhpcy56b25lIDogcGFyZW50RGVsZWdhdGUuX2NhbmNlbFRhc2tDdXJyWm9uZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza1pTID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrRGxndCA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0RsZ3RPd25lciA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzVGFza0N1cnJab25lID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB2YXIgem9uZVNwZWNIYXNUYXNrID0gem9uZVNwZWMgJiYgem9uZVNwZWMub25IYXNUYXNrOwogICAgICAgICAgICAgICAgICAgIHZhciBwYXJlbnRIYXNUYXNrID0gcGFyZW50RGVsZWdhdGUgJiYgcGFyZW50RGVsZWdhdGUuX2hhc1Rhc2taUzsKICAgICAgICAgICAgICAgICAgICBpZiAoem9uZVNwZWNIYXNUYXNrIHx8IHBhcmVudEhhc1Rhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgbmVlZCB0byByZXBvcnQgaGFzVGFzaywgdGhhbiB0aGlzIFpTIG5lZWRzIHRvIGRvIHJlZiBjb3VudGluZyBvbiB0YXNrcy4gSW4gc3VjaAogICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGNhc2UgYWxsIHRhc2sgcmVsYXRlZCBpbnRlcmNlcHRvcnMgbXVzdCBnbyB0aHJvdWdoIHRoaXMgWkQuIFdlIGNhbid0IHNob3J0IGNpcmN1aXQgaXQuCiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUyA9IHpvbmVTcGVjSGFzVGFzayA/IHpvbmVTcGVjIDogREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0ID0gcGFyZW50RGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2tEbGd0T3duZXIgPSB0aGlzOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrQ3VyclpvbmUgPSB6b25lOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uU2NoZWR1bGVUYXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY2hlZHVsZVRhc2taUyA9IERFTEVHQVRFX1pTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUgPSB0aGlzLnpvbmU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF6b25lU3BlYy5vbkludm9rZVRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2taUyA9IERFTEVHQVRFX1pTOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW52b2tlVGFza0RsZ3QgPSBwYXJlbnREZWxlZ2F0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVRhc2tDdXJyWm9uZSA9IHRoaXMuem9uZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXpvbmVTcGVjLm9uQ2FuY2VsVGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza1pTID0gREVMRUdBVEVfWlM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxUYXNrRGxndCA9IHBhcmVudERlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FuY2VsVGFza0N1cnJab25lID0gdGhpcy56b25lOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5mb3JrID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIHpvbmVTcGVjKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvcmtaUyA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmtaUy5vbkZvcmsodGhpcy5fZm9ya0RsZ3QsIHRoaXMuem9uZSwgdGFyZ2V0Wm9uZSwgem9uZVNwZWMpIDoKICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFpvbmUodGFyZ2V0Wm9uZSwgem9uZVNwZWMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW50ZXJjZXB0ID0gZnVuY3Rpb24gKHRhcmdldFpvbmUsIGNhbGxiYWNrLCBzb3VyY2UpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5faW50ZXJjZXB0WlMgPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcmNlcHRaUy5vbkludGVyY2VwdCh0aGlzLl9pbnRlcmNlcHREbGd0LCB0aGlzLl9pbnRlcmNlcHRDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgY2FsbGJhY2ssIHNvdXJjZSkgOgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjazsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLmludm9rZSA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2VaUyA/CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ludm9rZVpTLm9uSW52b2tlKHRoaXMuX2ludm9rZURsZ3QsIHRoaXMuX2ludm9rZUN1cnJab25lLCB0YXJnZXRab25lLCBjYWxsYmFjaywgYXBwbHlUaGlzLCBhcHBseUFyZ3MsIHNvdXJjZSkgOgogICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5hcHBseShhcHBseVRoaXMsIGFwcGx5QXJncyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgWm9uZURlbGVnYXRlLnByb3RvdHlwZS5oYW5kbGVFcnJvciA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBlcnJvcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYW5kbGVFcnJvclpTID8KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlRXJyb3JaUy5vbkhhbmRsZUVycm9yKHRoaXMuX2hhbmRsZUVycm9yRGxndCwgdGhpcy5faGFuZGxlRXJyb3JDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgZXJyb3IpIDoKICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBab25lRGVsZWdhdGUucHJvdG90eXBlLnNjaGVkdWxlVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCB0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJldHVyblRhc2sgPSB0YXNrOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zY2hlZHVsZVRhc2taUykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faGFzVGFza1pTKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrLl96b25lRGVsZWdhdGVzLnB1c2godGhpcy5faGFzVGFza0RsZ3RPd25lcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2xhbmctZm9ybWF0IG9mZgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5UYXNrID0gdGhpcy5fc2NoZWR1bGVUYXNrWlMub25TY2hlZHVsZVRhc2sodGhpcy5fc2NoZWR1bGVUYXNrRGxndCwgdGhpcy5fc2NoZWR1bGVUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBjbGFuZy1mb3JtYXQgb24KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXR1cm5UYXNrKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuVGFzayA9IHRhc2s7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFzay5zY2hlZHVsZUZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnNjaGVkdWxlRm4odGFzayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAodGFzay50eXBlID09IG1pY3JvVGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2sodGFzayk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Rhc2sgaXMgbWlzc2luZyBzY2hlZHVsZUZuLicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiByZXR1cm5UYXNrOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaW52b2tlVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCB0YXNrLCBhcHBseVRoaXMsIGFwcGx5QXJncykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnZva2VUYXNrWlMgPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnZva2VUYXNrWlMub25JbnZva2VUYXNrKHRoaXMuX2ludm9rZVRhc2tEbGd0LCB0aGlzLl9pbnZva2VUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2ssIGFwcGx5VGhpcywgYXBwbHlBcmdzKSA6CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FsbGJhY2suYXBwbHkoYXBwbHlUaGlzLCBhcHBseUFyZ3MpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuY2FuY2VsVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCB0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jYW5jZWxUYXNrWlMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzLl9jYW5jZWxUYXNrWlMub25DYW5jZWxUYXNrKHRoaXMuX2NhbmNlbFRhc2tEbGd0LCB0aGlzLl9jYW5jZWxUYXNrQ3VyclpvbmUsIHRhcmdldFpvbmUsIHRhc2spOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXNrLmNhbmNlbEZuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignVGFzayBpcyBub3QgY2FuY2VsYWJsZScpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGFzay5jYW5jZWxGbih0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuaGFzVGFzayA9IGZ1bmN0aW9uICh0YXJnZXRab25lLCBpc0VtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaGFzVGFzayBzaG91bGQgbm90IHRocm93IGVycm9yIHNvIG90aGVyIFpvbmVEZWxlZ2F0ZQogICAgICAgICAgICAgICAgICAgIC8vIGNhbiBzdGlsbCB0cmlnZ2VyIGhhc1Rhc2sgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oYXNUYXNrWlMgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hhc1Rhc2taUy5vbkhhc1Rhc2sodGhpcy5faGFzVGFza0RsZ3QsIHRoaXMuX2hhc1Rhc2tDdXJyWm9uZSwgdGFyZ2V0Wm9uZSwgaXNFbXB0eSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYW5kbGVFcnJvcih0YXJnZXRab25lLCBlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgICAgIFpvbmVEZWxlZ2F0ZS5wcm90b3R5cGUuX3VwZGF0ZVRhc2tDb3VudCA9IGZ1bmN0aW9uICh0eXBlLCBjb3VudCkgewogICAgICAgICAgICAgICAgICAgIHZhciBjb3VudHMgPSB0aGlzLl90YXNrQ291bnRzOwogICAgICAgICAgICAgICAgICAgIHZhciBwcmV2ID0gY291bnRzW3R5cGVdOwogICAgICAgICAgICAgICAgICAgIHZhciBuZXh0ID0gY291bnRzW3R5cGVdID0gcHJldiArIGNvdW50OwogICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IDwgMCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01vcmUgdGFza3MgZXhlY3V0ZWQgdGhlbiB3ZXJlIHNjaGVkdWxlZC4nKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHByZXYgPT0gMCB8fCBuZXh0ID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGlzRW1wdHkgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNyb1Rhc2s6IGNvdW50c1snbWljcm9UYXNrJ10gPiAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9UYXNrOiBjb3VudHNbJ21hY3JvVGFzayddID4gMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50VGFzazogY291bnRzWydldmVudFRhc2snXSA+IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2U6IHR5cGUKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oYXNUYXNrKHRoaXMuem9uZSwgaXNFbXB0eSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHJldHVybiBab25lRGVsZWdhdGU7CiAgICAgICAgICAgIH0oKSk7CiAgICAgICAgICAgIHZhciBab25lVGFzayA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFpvbmVUYXNrKHR5cGUsIHNvdXJjZSwgY2FsbGJhY2ssIG9wdGlvbnMsIHNjaGVkdWxlRm4sIGNhbmNlbEZuKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fem9uZSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5Db3VudCA9IDA7CiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fem9uZURlbGVnYXRlcyA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnJlcXVpcmUtaW50ZXJuYWwtd2l0aC11bmRlcnNjb3JlCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnbm90U2NoZWR1bGVkJzsKICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGF0YSA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2hlZHVsZUZuID0gc2NoZWR1bGVGbjsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbmNlbEZuID0gY2FuY2VsRm47CiAgICAgICAgICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxiYWNrIGlzIG5vdCBkZWZpbmVkJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICB2YXIgc2VsZiA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiBvcHRpb25zIHNob3VsZCBoYXZlIGludGVyZmFjZQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSBldmVudFRhc2sgJiYgb3B0aW9ucyAmJiBvcHRpb25zLnVzZUcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2UgPSBab25lVGFzay5pbnZva2VUYXNrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pbnZva2UgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gWm9uZVRhc2suaW52b2tlVGFzay5jYWxsKGdsb2JhbCwgc2VsZiwgdGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBab25lVGFzay5pbnZva2VUYXNrID0gZnVuY3Rpb24gKHRhc2ssIHRhcmdldCwgYXJncykgewogICAgICAgICAgICAgICAgICAgIGlmICghdGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXNrID0gdGhpczsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcysrOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucnVuQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2suem9uZS5ydW5UYXNrKHRhc2ssIHRhcmdldCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmFpbk1pY3JvVGFza1F1ZXVlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcy0tOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZVRhc2sucHJvdG90eXBlLCAiem9uZSIsIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX3pvbmU7IH0sCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVUYXNrLnByb3RvdHlwZSwgInN0YXRlIiwgewogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpcy5fc3RhdGU7IH0sCiAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgWm9uZVRhc2sucHJvdG90eXBlLmNhbmNlbFNjaGVkdWxlUmVxdWVzdCA9IGZ1bmN0aW9uICgpIHsgdGhpcy5fdHJhbnNpdGlvblRvKG5vdFNjaGVkdWxlZCwgc2NoZWR1bGluZyk7IH07CiAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6cmVxdWlyZS1pbnRlcm5hbC13aXRoLXVuZGVyc2NvcmUKICAgICAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS5fdHJhbnNpdGlvblRvID0gZnVuY3Rpb24gKHRvU3RhdGUsIGZyb21TdGF0ZTEsIGZyb21TdGF0ZTIpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTEgfHwgdGhpcy5fc3RhdGUgPT09IGZyb21TdGF0ZTIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB0b1N0YXRlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9TdGF0ZSA9PSBub3RTY2hlZHVsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3pvbmVEZWxlZ2F0ZXMgPSBudWxsOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy50eXBlICsgIiAnIiArIHRoaXMuc291cmNlICsgIic6IGNhbiBub3QgdHJhbnNpdGlvbiB0byAnIiArIHRvU3RhdGUgKyAiJywgZXhwZWN0aW5nIHN0YXRlICciICsgZnJvbVN0YXRlMSArICInIiArIChmcm9tU3RhdGUyID8gJyBvciBcJycgKyBmcm9tU3RhdGUyICsgJ1wnJyA6ICcnKSArICIsIHdhcyAnIiArIHRoaXMuX3N0YXRlICsgIicuIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVUYXNrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kYXRhICYmIHR5cGVvZiB0aGlzLmRhdGEuaGFuZGxlSWQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGEuaGFuZGxlSWQudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIC8vIGFkZCB0b0pTT04gbWV0aG9kIHRvIHByZXZlbnQgY3ljbGljIGVycm9yIHdoZW4KICAgICAgICAgICAgICAgIC8vIGNhbGwgSlNPTi5zdHJpbmdpZnkoem9uZVRhc2spCiAgICAgICAgICAgICAgICBab25lVGFzay5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6IHRoaXMudHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGU6IHRoaXMuc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgIHpvbmU6IHRoaXMuem9uZS5uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBydW5Db3VudDogdGhpcy5ydW5Db3VudAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgcmV0dXJuIFpvbmVUYXNrOwogICAgICAgICAgICB9KCkpOwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vLyAgTUlDUk9UQVNLIFFVRVVFCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgdmFyIHN5bWJvbFNldFRpbWVvdXQgPSBfX3N5bWJvbF9fKCdzZXRUaW1lb3V0Jyk7CiAgICAgICAgICAgIHZhciBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpOwogICAgICAgICAgICB2YXIgc3ltYm9sVGhlbiA9IF9fc3ltYm9sX18oJ3RoZW4nKTsKICAgICAgICAgICAgdmFyIF9taWNyb1Rhc2tRdWV1ZSA9IFtdOwogICAgICAgICAgICB2YXIgX2lzRHJhaW5pbmdNaWNyb3Rhc2tRdWV1ZSA9IGZhbHNlOwogICAgICAgICAgICB2YXIgbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlOwogICAgICAgICAgICBmdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayh0YXNrKSB7CiAgICAgICAgICAgICAgICAvLyBpZiB3ZSBhcmUgbm90IHJ1bm5pbmcgaW4gYW55IHRhc2ssIGFuZCB0aGVyZSBoYXMgbm90IGJlZW4gYW55dGhpbmcgc2NoZWR1bGVkCiAgICAgICAgICAgICAgICAvLyB3ZSBtdXN0IGJvb3RzdHJhcCB0aGUgaW5pdGlhbCB0YXNrIGNyZWF0aW9uIGJ5IG1hbnVhbGx5IHNjaGVkdWxpbmcgdGhlIGRyYWluCiAgICAgICAgICAgICAgICBpZiAoX251bWJlck9mTmVzdGVkVGFza0ZyYW1lcyA9PT0gMCAmJiBfbWljcm9UYXNrUXVldWUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2UgYXJlIG5vdCBydW5uaW5nIGluIFRhc2ssIHNvIHdlIG5lZWQgdG8ga2lja3N0YXJ0IHRoZSBtaWNyb3Rhc2sgcXVldWUuCiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdsb2JhbFtzeW1ib2xQcm9taXNlXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlID0gZ2xvYmFsW3N5bWJvbFByb21pc2VdLnJlc29sdmUoMCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmF0aXZlVGhlbiA9IG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZVtzeW1ib2xUaGVuXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFuYXRpdmVUaGVuKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuYXRpdmUgUHJvbWlzZSBpcyBub3QgcGF0Y2hhYmxlLCB3ZSBuZWVkIHRvIHVzZSBgdGhlbmAgZGlyZWN0bHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzc3VlIDEwNzgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZVRoZW4gPSBuYXRpdmVNaWNyb1Rhc2tRdWV1ZVByb21pc2VbJ3RoZW4nXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVUaGVuLmNhbGwobmF0aXZlTWljcm9UYXNrUXVldWVQcm9taXNlLCBkcmFpbk1pY3JvVGFza1F1ZXVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbFtzeW1ib2xTZXRUaW1lb3V0XShkcmFpbk1pY3JvVGFza1F1ZXVlLCAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0YXNrICYmIF9taWNyb1Rhc2tRdWV1ZS5wdXNoKHRhc2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIGRyYWluTWljcm9UYXNrUXVldWUoKSB7CiAgICAgICAgICAgICAgICBpZiAoIV9pc0RyYWluaW5nTWljcm90YXNrUXVldWUpIHsKICAgICAgICAgICAgICAgICAgICBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoX21pY3JvVGFza1F1ZXVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcXVldWUgPSBfbWljcm9UYXNrUXVldWU7CiAgICAgICAgICAgICAgICAgICAgICAgIF9taWNyb1Rhc2tRdWV1ZSA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHF1ZXVlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHF1ZXVlW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUucnVuVGFzayh0YXNrLCBudWxsLCBudWxsKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9hcGkub25VbmhhbmRsZWRFcnJvcihlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgX2FwaS5taWNyb3Rhc2tEcmFpbkRvbmUoKTsKICAgICAgICAgICAgICAgICAgICBfaXNEcmFpbmluZ01pY3JvdGFza1F1ZXVlID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgICAgICAgICAvLy8gIEJPT1RTVFJBUAogICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgICAgICAgIHZhciBOT19aT05FID0geyBuYW1lOiAnTk8gWk9ORScgfTsKICAgICAgICAgICAgdmFyIG5vdFNjaGVkdWxlZCA9ICdub3RTY2hlZHVsZWQnLCBzY2hlZHVsaW5nID0gJ3NjaGVkdWxpbmcnLCBzY2hlZHVsZWQgPSAnc2NoZWR1bGVkJywgcnVubmluZyA9ICdydW5uaW5nJywgY2FuY2VsaW5nID0gJ2NhbmNlbGluZycsIHVua25vd24gPSAndW5rbm93bic7CiAgICAgICAgICAgIHZhciBtaWNyb1Rhc2sgPSAnbWljcm9UYXNrJywgbWFjcm9UYXNrID0gJ21hY3JvVGFzaycsIGV2ZW50VGFzayA9ICdldmVudFRhc2snOwogICAgICAgICAgICB2YXIgcGF0Y2hlcyA9IHt9OwogICAgICAgICAgICB2YXIgX2FwaSA9IHsKICAgICAgICAgICAgICAgIHN5bWJvbDogX19zeW1ib2xfXywKICAgICAgICAgICAgICAgIGN1cnJlbnRab25lRnJhbWU6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIF9jdXJyZW50Wm9uZUZyYW1lOyB9LAogICAgICAgICAgICAgICAgb25VbmhhbmRsZWRFcnJvcjogbm9vcCwKICAgICAgICAgICAgICAgIG1pY3JvdGFza0RyYWluRG9uZTogbm9vcCwKICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrOiBzY2hlZHVsZU1pY3JvVGFzaywKICAgICAgICAgICAgICAgIHNob3dVbmNhdWdodEVycm9yOiBmdW5jdGlvbiAoKSB7IHJldHVybiAhWm9uZVtfX3N5bWJvbF9fKCdpZ25vcmVDb25zb2xlRXJyb3JVbmNhdWdodEVycm9yJyldOyB9LAogICAgICAgICAgICAgICAgcGF0Y2hFdmVudFRhcmdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgICAgICBwYXRjaE9uUHJvcGVydGllczogbm9vcCwKICAgICAgICAgICAgICAgIHBhdGNoTWV0aG9kOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICAgICAgYmluZEFyZ3VtZW50czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgICAgICBwYXRjaFRoZW46IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgICAgICBwYXRjaE1hY3JvVGFzazogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgICAgIHNldE5hdGl2ZVByb21pc2U6IGZ1bmN0aW9uIChOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gc29tZXRpbWVzIE5hdGl2ZVByb21pc2UucmVzb2x2ZSBzdGF0aWMgZnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICAvLyBpcyBub3QgcmVhZHkgeWV0LCAoc3VjaCBhcyBjb3JlLWpzL2VzNi5wcm9taXNlKQogICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG5lZWQgdG8gY2hlY2sgaGVyZS4KICAgICAgICAgICAgICAgICAgICBpZiAoTmF0aXZlUHJvbWlzZSAmJiB0eXBlb2YgTmF0aXZlUHJvbWlzZS5yZXNvbHZlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZU1pY3JvVGFza1F1ZXVlUHJvbWlzZSA9IE5hdGl2ZVByb21pc2UucmVzb2x2ZSgwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgcGF0Y2hFdmVudFByb3RvdHlwZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgICAgIGlzSUVPckVkZ2U6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZhbHNlOyB9LAogICAgICAgICAgICAgICAgZ2V0R2xvYmFsT2JqZWN0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9LAogICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgICAgICBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHVuZGVmaW5lZDsgfSwKICAgICAgICAgICAgICAgIE9iamVjdENyZWF0ZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gdW5kZWZpbmVkOyB9LAogICAgICAgICAgICAgICAgQXJyYXlTbGljZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gW107IH0sCiAgICAgICAgICAgICAgICBwYXRjaENsYXNzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICAgICAgd3JhcFdpdGhDdXJyZW50Wm9uZTogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfSwKICAgICAgICAgICAgICAgIGZpbHRlclByb3BlcnRpZXM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtdOyB9LAogICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkOiBmdW5jdGlvbiAoKSB7IHJldHVybiBub29wOyB9LAogICAgICAgICAgICAgICAgX3JlZGVmaW5lUHJvcGVydHk6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG5vb3A7IH0sCiAgICAgICAgICAgICAgICBwYXRjaENhbGxiYWNrczogZnVuY3Rpb24gKCkgeyByZXR1cm4gbm9vcDsgfQogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgX2N1cnJlbnRab25lRnJhbWUgPSB7IHBhcmVudDogbnVsbCwgem9uZTogbmV3IFpvbmUobnVsbCwgbnVsbCkgfTsKICAgICAgICAgICAgdmFyIF9jdXJyZW50VGFzayA9IG51bGw7CiAgICAgICAgICAgIHZhciBfbnVtYmVyT2ZOZXN0ZWRUYXNrRnJhbWVzID0gMDsKICAgICAgICAgICAgZnVuY3Rpb24gbm9vcCgpIHsgfQogICAgICAgICAgICBwZXJmb3JtYW5jZU1lYXN1cmUoJ1pvbmUnLCAnWm9uZScpOwogICAgICAgICAgICByZXR1cm4gZ2xvYmFsWydab25lJ10gPSBab25lOwogICAgICAgIH0pKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHdpbmRvdyB8fCB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgJiYgc2VsZiB8fCBjb21tb25qc0dsb2JhbCk7CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdab25lQXdhcmVQcm9taXNlJywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7CiAgICAgICAgICAgIHZhciBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICB2YXIgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgICAgIGZ1bmN0aW9uIHJlYWRhYmxlT2JqZWN0VG9TdHJpbmcob2JqKSB7CiAgICAgICAgICAgICAgICBpZiAob2JqICYmIG9iai50b1N0cmluZyA9PT0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZykgewogICAgICAgICAgICAgICAgICAgIHZhciBjbGFzc05hbWUgPSBvYmouY29uc3RydWN0b3IgJiYgb2JqLmNvbnN0cnVjdG9yLm5hbWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChjbGFzc05hbWUgPyBjbGFzc05hbWUgOiAnJykgKyAnOiAnICsgSlNPTi5zdHJpbmdpZnkob2JqKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvYmogPyBvYmoudG9TdHJpbmcoKSA6IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfX3N5bWJvbF9fID0gYXBpLnN5bWJvbDsKICAgICAgICAgICAgdmFyIF91bmNhdWdodFByb21pc2VFcnJvcnMgPSBbXTsKICAgICAgICAgICAgdmFyIGlzRGlzYWJsZVdyYXBwaW5nVW5jYXVnaHRQcm9taXNlUmVqZWN0aW9uID0gZ2xvYmFsW19fc3ltYm9sX18oJ0RJU0FCTEVfV1JBUFBJTkdfVU5DQVVHSFRfUFJPTUlTRV9SRUpFQ1RJT04nKV0gPT09IHRydWU7CiAgICAgICAgICAgIHZhciBzeW1ib2xQcm9taXNlID0gX19zeW1ib2xfXygnUHJvbWlzZScpOwogICAgICAgICAgICB2YXIgc3ltYm9sVGhlbiA9IF9fc3ltYm9sX18oJ3RoZW4nKTsKICAgICAgICAgICAgdmFyIGNyZWF0aW9uVHJhY2UgPSAnX19jcmVhdGlvblRyYWNlX18nOwogICAgICAgICAgICBhcGkub25VbmhhbmRsZWRFcnJvciA9IGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICBpZiAoYXBpLnNob3dVbmNhdWdodEVycm9yKCkpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVqZWN0aW9uID0gZSAmJiBlLnJlamVjdGlvbjsKICAgICAgICAgICAgICAgICAgICBpZiAocmVqZWN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBQcm9taXNlIHJlamVjdGlvbjonLCByZWplY3Rpb24gaW5zdGFuY2VvZiBFcnJvciA/IHJlamVjdGlvbi5tZXNzYWdlIDogcmVqZWN0aW9uLCAnOyBab25lOicsIGUuem9uZS5uYW1lLCAnOyBUYXNrOicsIGUudGFzayAmJiBlLnRhc2suc291cmNlLCAnOyBWYWx1ZTonLCByZWplY3Rpb24sIHJlamVjdGlvbiBpbnN0YW5jZW9mIEVycm9yID8gcmVqZWN0aW9uLnN0YWNrIDogdW5kZWZpbmVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBhcGkubWljcm90YXNrRHJhaW5Eb25lID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIF9sb29wXzEgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHVuY2F1Z2h0UHJvbWlzZUVycm9yID0gX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5zaGlmdCgpOwogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnpvbmUucnVuR3VhcmRlZChmdW5jdGlvbiAoKSB7IHRocm93IHVuY2F1Z2h0UHJvbWlzZUVycm9yOyB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHdoaWxlIChfdW5jYXVnaHRQcm9taXNlRXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIF9sb29wXzEoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfTsKICAgICAgICAgICAgdmFyIFVOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTCA9IF9fc3ltYm9sX18oJ3VuaGFuZGxlZFByb21pc2VSZWplY3Rpb25IYW5kbGVyJyk7CiAgICAgICAgICAgIGZ1bmN0aW9uIGhhbmRsZVVuaGFuZGxlZFJlamVjdGlvbihlKSB7CiAgICAgICAgICAgICAgICBhcGkub25VbmhhbmRsZWRFcnJvcihlKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBab25lW1VOSEFORExFRF9QUk9NSVNFX1JFSkVDVElPTl9IQU5ETEVSX1NZTUJPTF07CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBoYW5kbGVyID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZnVuY3Rpb24gaXNUaGVuYWJsZSh2YWx1ZSkgeyByZXR1cm4gdmFsdWUgJiYgdmFsdWUudGhlbjsgfQogICAgICAgICAgICBmdW5jdGlvbiBmb3J3YXJkUmVzb2x1dGlvbih2YWx1ZSkgeyByZXR1cm4gdmFsdWU7IH0KICAgICAgICAgICAgZnVuY3Rpb24gZm9yd2FyZFJlamVjdGlvbihyZWplY3Rpb24pIHsgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UucmVqZWN0KHJlamVjdGlvbik7IH0KICAgICAgICAgICAgdmFyIHN5bWJvbFN0YXRlID0gX19zeW1ib2xfXygnc3RhdGUnKTsKICAgICAgICAgICAgdmFyIHN5bWJvbFZhbHVlID0gX19zeW1ib2xfXygndmFsdWUnKTsKICAgICAgICAgICAgdmFyIHN5bWJvbEZpbmFsbHkgPSBfX3N5bWJvbF9fKCdmaW5hbGx5Jyk7CiAgICAgICAgICAgIHZhciBzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWUgPSBfX3N5bWJvbF9fKCdwYXJlbnRQcm9taXNlVmFsdWUnKTsKICAgICAgICAgICAgdmFyIHN5bWJvbFBhcmVudFByb21pc2VTdGF0ZSA9IF9fc3ltYm9sX18oJ3BhcmVudFByb21pc2VTdGF0ZScpOwogICAgICAgICAgICB2YXIgc291cmNlID0gJ1Byb21pc2UudGhlbic7CiAgICAgICAgICAgIHZhciBVTlJFU09MVkVEID0gbnVsbDsKICAgICAgICAgICAgdmFyIFJFU09MVkVEID0gdHJ1ZTsKICAgICAgICAgICAgdmFyIFJFSkVDVEVEID0gZmFsc2U7CiAgICAgICAgICAgIHZhciBSRUpFQ1RFRF9OT19DQVRDSCA9IDA7CiAgICAgICAgICAgIGZ1bmN0aW9uIG1ha2VSZXNvbHZlcihwcm9taXNlLCBzdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICh2KSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgc3RhdGUsIHYpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBEbyBub3QgcmV0dXJuIHZhbHVlIG9yIHlvdSB3aWxsIGJyZWFrIHRoZSBQcm9taXNlIHNwZWMuCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBvbmNlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgdmFyIHdhc0NhbGxlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHdyYXBwZXIod3JhcHBlZEZ1bmN0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdhc0NhbGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHdhc0NhbGxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwZWRGdW5jdGlvbi5hcHBseShudWxsLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgVFlQRV9FUlJPUiA9ICdQcm9taXNlIHJlc29sdmVkIHdpdGggaXRzZWxmJzsKICAgICAgICAgICAgdmFyIENVUlJFTlRfVEFTS19UUkFDRV9TWU1CT0wgPSBfX3N5bWJvbF9fKCdjdXJyZW50VGFza1RyYWNlJyk7CiAgICAgICAgICAgIC8vIFByb21pc2UgUmVzb2x1dGlvbgogICAgICAgICAgICBmdW5jdGlvbiByZXNvbHZlUHJvbWlzZShwcm9taXNlLCBzdGF0ZSwgdmFsdWUpIHsKICAgICAgICAgICAgICAgIHZhciBvbmNlV3JhcHBlciA9IG9uY2UoKTsKICAgICAgICAgICAgICAgIGlmIChwcm9taXNlID09PSB2YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoVFlQRV9FUlJPUik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xTdGF0ZV0gPT09IFVOUkVTT0xWRUQpIHsKICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgb25seSBnZXQgdmFsdWUudGhlbiBvbmNlIGJhc2VkIG9uIHByb21pc2Ugc3BlYy4KICAgICAgICAgICAgICAgICAgICB2YXIgdGhlbiA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgfHwgdHlwZW9mIHZhbHVlID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGVuID0gdmFsdWUgJiYgdmFsdWUudGhlbjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uY2VXcmFwcGVyKGZ1bmN0aW9uICgpIHsgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7IH0pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBpZiAodmFsdWUgaW5zdGFuY2VvZiBab25lQXdhcmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlICE9PSBSRUpFQ1RFRCAmJiB2YWx1ZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UgJiYKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUuaGFzT3duUHJvcGVydHkoc3ltYm9sU3RhdGUpICYmIHZhbHVlLmhhc093blByb3BlcnR5KHN5bWJvbFZhbHVlKSAmJgogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZVtzeW1ib2xTdGF0ZV0gIT09IFVOUkVTT0xWRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJSZWplY3RlZE5vQ2F0Y2godmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlUHJvbWlzZShwcm9taXNlLCB2YWx1ZVtzeW1ib2xTdGF0ZV0sIHZhbHVlW3N5bWJvbFZhbHVlXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXRlICE9PSBSRUpFQ1RFRCAmJiB0eXBlb2YgdGhlbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBvbmNlV3JhcHBlcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgc3RhdGUpKSwgb25jZVdyYXBwZXIobWFrZVJlc29sdmVyKHByb21pc2UsIGZhbHNlKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uY2VXcmFwcGVyKGZ1bmN0aW9uICgpIHsgcmVzb2x2ZVByb21pc2UocHJvbWlzZSwgZmFsc2UsIGVycik7IH0pKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gc3RhdGU7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBxdWV1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocHJvbWlzZVtzeW1ib2xGaW5hbGx5XSA9PT0gc3ltYm9sRmluYWxseSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb21pc2UgaXMgZ2VuZXJhdGVkIGJ5IFByb21pc2UucHJvdG90eXBlLmZpbmFsbHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0ZSA9PT0gUkVTT0xWRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3RhdGUgaXMgcmVzb2x2ZWQsIHNob3VsZCBpZ25vcmUgdGhlIHZhbHVlCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHVzZSBwYXJlbnQgcHJvbWlzZSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlU3RhdGVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sVmFsdWVdID0gcHJvbWlzZVtzeW1ib2xQYXJlbnRQcm9taXNlVmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlY29yZCB0YXNrIGluZm9ybWF0aW9uIGluIHZhbHVlIHdoZW4gZXJyb3Igb2NjdXJzLCBzbyB3ZSBjYW4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gc29tZSBhZGRpdGlvbmFsIHdvcmsgc3VjaCBhcyByZW5kZXIgbG9uZ1N0YWNrVHJhY2UKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXRlID09PSBSRUpFQ1RFRCAmJiB2YWx1ZSBpbnN0YW5jZW9mIEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBsb25nU3RhY2tUcmFjZVpvbmUgaXMgaGVyZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRyYWNlID0gWm9uZS5jdXJyZW50VGFzayAmJiBab25lLmN1cnJlbnRUYXNrLmRhdGEgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBab25lLmN1cnJlbnRUYXNrLmRhdGFbY3JlYXRpb25UcmFjZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGtlZXAgdGhlIGxvbmcgc3RhY2sgdHJhY2UgaW50byBlcnJvciB3aGVuIGluIGxvbmdTdGFja1RyYWNlWm9uZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KHZhbHVlLCBDVVJSRU5UX1RBU0tfVFJBQ0VfU1lNQk9MLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZW51bWVyYWJsZTogZmFsc2UsIHdyaXRhYmxlOiB0cnVlLCB2YWx1ZTogdHJhY2UgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBxdWV1ZS5sZW5ndGg7KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdChwcm9taXNlLCBxdWV1ZVtpKytdLCBxdWV1ZVtpKytdLCBxdWV1ZVtpKytdLCBxdWV1ZVtpKytdKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAocXVldWUubGVuZ3RoID09IDAgJiYgc3RhdGUgPT0gUkVKRUNURUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gUkVKRUNURURfTk9fQ0FUQ0g7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdW5jYXVnaHRQcm9taXNlRXJyb3IgPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNEaXNhYmxlV3JhcHBpbmdVbmNhdWdodFByb21pc2VSZWplY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBkaXNhYmxlIHdyYXBwaW5nIHVuY2F1Z2h0IHByb21pc2UgcmVqZWN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRoZSByZWplY3RlZCB2YWx1ZSBpcyBhbiBFcnJvciBvYmplY3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSB2YWx1ZSBpbnN0ZWFkIG9mIHdyYXBwaW5nIGl0LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgd2UgdGhyb3dzIGEgbmV3IEVycm9yIHRvIHByaW50IG1vcmUgcmVhZGFibGUgZXJyb3IgbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBpZiB0aGUgdmFsdWUgaXMgbm90IGFuIGVycm9yLCB6b25lLmpzIGJ1aWxkcyBhbiBgRXJyb3JgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9iamVjdCBoZXJlIHRvIGF0dGFjaCB0aGUgc3RhY2sgaW5mb3JtYXRpb24uCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVW5jYXVnaHQgKGluIHByb21pc2UpOiAnICsgcmVhZGFibGVPYmplY3RUb1N0cmluZyh2YWx1ZSkgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZhbHVlICYmIHZhbHVlLnN0YWNrID8gJ1xuJyArIHZhbHVlLnN0YWNrIDogJycpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvciA9IGVycjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmNhdWdodFByb21pc2VFcnJvci5yZWplY3Rpb24gPSB2YWx1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnByb21pc2UgPSBwcm9taXNlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5jYXVnaHRQcm9taXNlRXJyb3Iuem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuY2F1Z2h0UHJvbWlzZUVycm9yLnRhc2sgPSBab25lLmN1cnJlbnRUYXNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgX3VuY2F1Z2h0UHJvbWlzZUVycm9ycy5wdXNoKHVuY2F1Z2h0UHJvbWlzZUVycm9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zY2hlZHVsZU1pY3JvVGFzaygpOyAvLyB0byBtYWtlIHN1cmUgdGhhdCBpdCBpcyBydW5uaW5nCiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBSZXNvbHZpbmcgYW4gYWxyZWFkeSByZXNvbHZlZCBwcm9taXNlIGlzIGEgbm9vcC4KICAgICAgICAgICAgICAgIHJldHVybiBwcm9taXNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBSRUpFQ1RJT05fSEFORExFRF9IQU5ETEVSID0gX19zeW1ib2xfXygncmVqZWN0aW9uSGFuZGxlZEhhbmRsZXInKTsKICAgICAgICAgICAgZnVuY3Rpb24gY2xlYXJSZWplY3RlZE5vQ2F0Y2gocHJvbWlzZSkgewogICAgICAgICAgICAgICAgaWYgKHByb21pc2Vbc3ltYm9sU3RhdGVdID09PSBSRUpFQ1RFRF9OT19DQVRDSCkgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIHJlamVjdGVkIG5vIGNhdGNoIHN0YXR1cwogICAgICAgICAgICAgICAgICAgIC8vIGFuZCBxdWV1ZS5sZW5ndGggPiAwLCBtZWFucyB0aGVyZSBpcyBhIGVycm9yIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICAvLyBoZXJlIHRvIGhhbmRsZSB0aGUgcmVqZWN0ZWQgcHJvbWlzZSwgd2Ugc2hvdWxkIHRyaWdnZXIKICAgICAgICAgICAgICAgICAgICAvLyB3aW5kb3dzLnJlamVjdGlvbmhhbmRsZWQgZXZlbnRIYW5kbGVyIG9yIG5vZGVqcyByZWplY3Rpb25IYW5kbGVkCiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnRIYW5kbGVyCiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGhhbmRsZXIgPSBab25lW1JFSkVDVElPTl9IQU5ETEVEX0hBTkRMRVJdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAmJiB0eXBlb2YgaGFuZGxlciA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIHsgcmVqZWN0aW9uOiBwcm9taXNlW3N5bWJvbFZhbHVlXSwgcHJvbWlzZTogcHJvbWlzZSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gUkVKRUNURUQ7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBfdW5jYXVnaHRQcm9taXNlRXJyb3JzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9taXNlID09PSBfdW5jYXVnaHRQcm9taXNlRXJyb3JzW2ldLnByb21pc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIF91bmNhdWdodFByb21pc2VFcnJvcnMuc3BsaWNlKGksIDEpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHByb21pc2UsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKICAgICAgICAgICAgICAgIGNsZWFyUmVqZWN0ZWROb0NhdGNoKHByb21pc2UpOwogICAgICAgICAgICAgICAgdmFyIHByb21pc2VTdGF0ZSA9IHByb21pc2Vbc3ltYm9sU3RhdGVdOwogICAgICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gcHJvbWlzZVN0YXRlID8KICAgICAgICAgICAgICAgICAgICAodHlwZW9mIG9uRnVsZmlsbGVkID09PSAnZnVuY3Rpb24nKSA/IG9uRnVsZmlsbGVkIDogZm9yd2FyZFJlc29sdXRpb24gOgogICAgICAgICAgICAgICAgICAgICh0eXBlb2Ygb25SZWplY3RlZCA9PT0gJ2Z1bmN0aW9uJykgPyBvblJlamVjdGVkIDogZm9yd2FyZFJlamVjdGlvbjsKICAgICAgICAgICAgICAgIHpvbmUuc2NoZWR1bGVNaWNyb1Rhc2soc291cmNlLCBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcmVudFByb21pc2VWYWx1ZSA9IHByb21pc2Vbc3ltYm9sVmFsdWVdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgaXNGaW5hbGx5UHJvbWlzZSA9ICEhY2hhaW5Qcm9taXNlICYmIHN5bWJvbEZpbmFsbHkgPT09IGNoYWluUHJvbWlzZVtzeW1ib2xGaW5hbGx5XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRmluYWxseVByb21pc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIHRoZSBwcm9taXNlIGlzIGdlbmVyYXRlZCBmcm9tIGZpbmFsbHkgY2FsbCwga2VlcCBwYXJlbnQgcHJvbWlzZSdzIHN0YXRlIGFuZCB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhaW5Qcm9taXNlW3N5bWJvbFBhcmVudFByb21pc2VWYWx1ZV0gPSBwYXJlbnRQcm9taXNlVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sUGFyZW50UHJvbWlzZVN0YXRlXSA9IHByb21pc2VTdGF0ZTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG91bGQgbm90IHBhc3MgdmFsdWUgdG8gZmluYWxseSBjYWxsYmFjawogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB6b25lLnJ1bihkZWxlZ2F0ZSwgdW5kZWZpbmVkLCBpc0ZpbmFsbHlQcm9taXNlICYmIGRlbGVnYXRlICE9PSBmb3J3YXJkUmVqZWN0aW9uICYmIGRlbGVnYXRlICE9PSBmb3J3YXJkUmVzb2x1dGlvbiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcGFyZW50UHJvbWlzZVZhbHVlXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGNoYWluUHJvbWlzZSwgdHJ1ZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgZXJyb3Igb2NjdXJzLCBzaG91bGQgYWx3YXlzIHJldHVybiB0aGlzIGVycm9yCiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKGNoYWluUHJvbWlzZSwgZmFsc2UsIGVycm9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCBjaGFpblByb21pc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBaT05FX0FXQVJFX1BST01JU0VfVE9fU1RSSU5HID0gJ2Z1bmN0aW9uIFpvbmVBd2FyZVByb21pc2UoKSB7IFtuYXRpdmUgY29kZV0gfSc7CiAgICAgICAgICAgIHZhciBub29wID0gZnVuY3Rpb24gKCkgeyB9OwogICAgICAgICAgICB2YXIgWm9uZUF3YXJlUHJvbWlzZSA9IC8qKiBAY2xhc3MgKi8gKGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIFpvbmVBd2FyZVByb21pc2UoZXhlY3V0b3IpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcHJvbWlzZSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgaWYgKCEocHJvbWlzZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVzdCBiZSBhbiBpbnN0YW5jZW9mIFByb21pc2UuJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHByb21pc2Vbc3ltYm9sU3RhdGVdID0gVU5SRVNPTFZFRDsKICAgICAgICAgICAgICAgICAgICBwcm9taXNlW3N5bWJvbFZhbHVlXSA9IFtdOyAvLyBxdWV1ZTsKICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICBleGVjdXRvciAmJiBleGVjdXRvcihtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVTT0xWRUQpLCBtYWtlUmVzb2x2ZXIocHJvbWlzZSwgUkVKRUNURUQpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVQcm9taXNlKHByb21pc2UsIGZhbHNlLCBlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFpPTkVfQVdBUkVfUFJPTUlTRV9UT19TVFJJTkc7IH07CiAgICAgICAgICAgICAgICBab25lQXdhcmVQcm9taXNlLnJlc29sdmUgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFU09MVkVELCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5yZWplY3QgPSBmdW5jdGlvbiAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZVByb21pc2UobmV3IHRoaXMobnVsbCksIFJFSkVDVEVELCBlcnJvcik7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZS5yYWNlID0gZnVuY3Rpb24gKHZhbHVlcykgewogICAgICAgICAgICAgICAgICAgIHZhciByZXNvbHZlOwogICAgICAgICAgICAgICAgICAgIHZhciByZWplY3Q7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgdGhpcyhmdW5jdGlvbiAocmVzLCByZWopIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSA9IHJlczsKICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ID0gcmVqOwogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVzb2x2ZSh2YWx1ZSkgeyByZXNvbHZlKHZhbHVlKTsgfQogICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIG9uUmVqZWN0KGVycm9yKSB7IHJlamVjdChlcnJvcik7IH0KICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBfaSA9IDAsIHZhbHVlc18xID0gdmFsdWVzOyBfaSA8IHZhbHVlc18xLmxlbmd0aDsgX2krKykgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSB2YWx1ZXNfMVtfaV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNUaGVuYWJsZSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGhpcy5yZXNvbHZlKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZS50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHJvbWlzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBab25lQXdhcmVQcm9taXNlLmFsbCA9IGZ1bmN0aW9uICh2YWx1ZXMpIHsgcmV0dXJuIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrKHZhbHVlcyk7IH07CiAgICAgICAgICAgICAgICBab25lQXdhcmVQcm9taXNlLmFsbFNldHRsZWQgPSBmdW5jdGlvbiAodmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFAgPSB0aGlzICYmIHRoaXMucHJvdG90eXBlIGluc3RhbmNlb2YgWm9uZUF3YXJlUHJvbWlzZSA/IHRoaXMgOiBab25lQXdhcmVQcm9taXNlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBQLmFsbFdpdGhDYWxsYmFjayh2YWx1ZXMsIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhlbkNhbGxiYWNrOiBmdW5jdGlvbiAodmFsdWUpIHsgcmV0dXJuICh7IHN0YXR1czogJ2Z1bGZpbGxlZCcsIHZhbHVlOiB2YWx1ZSB9KTsgfSwKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDYWxsYmFjazogZnVuY3Rpb24gKGVycikgeyByZXR1cm4gKHsgc3RhdHVzOiAncmVqZWN0ZWQnLCByZWFzb246IGVyciB9KTsgfQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UuYWxsV2l0aENhbGxiYWNrID0gZnVuY3Rpb24gKHZhbHVlcywgY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzb2x2ZTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVqZWN0OwogICAgICAgICAgICAgICAgICAgIHZhciBwcm9taXNlID0gbmV3IHRoaXMoZnVuY3Rpb24gKHJlcywgcmVqKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUgPSByZXM7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCA9IHJlajsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBhdCAyIHRvIHByZXZlbnQgcHJlbWF0dXJlbHkgcmVzb2x2aW5nIGlmIC50aGVuIGlzIGNhbGxlZCBpbW1lZGlhdGVseS4KICAgICAgICAgICAgICAgICAgICB2YXIgdW5yZXNvbHZlZENvdW50ID0gMjsKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWVJbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc29sdmVkVmFsdWVzID0gW107CiAgICAgICAgICAgICAgICAgICAgdmFyIF9sb29wXzIgPSBmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1RoZW5hYmxlKHZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB0aGlzXzEucmVzb2x2ZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGN1clZhbHVlSW5kZXggPSB2YWx1ZUluZGV4OwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUudGhlbihmdW5jdGlvbiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFZhbHVlc1tjdXJWYWx1ZUluZGV4XSA9IGNhbGxiYWNrID8gY2FsbGJhY2sudGhlbkNhbGxiYWNrKHZhbHVlKSA6IHZhbHVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRDb3VudC0tOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXNvbHZlZFZhbHVlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwgZnVuY3Rpb24gKGVycikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlZFZhbHVlc1tjdXJWYWx1ZUluZGV4XSA9IGNhbGxiYWNrLmVycm9yQ2FsbGJhY2soZXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50LS07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1bnJlc29sdmVkQ291bnQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVzb2x2ZWRWYWx1ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKHRoZW5FcnIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlamVjdCh0aGVuRXJyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB1bnJlc29sdmVkQ291bnQrKzsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVJbmRleCsrOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgdmFyIHRoaXNfMSA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgX2kgPSAwLCB2YWx1ZXNfMiA9IHZhbHVlczsgX2kgPCB2YWx1ZXNfMi5sZW5ndGg7IF9pKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHZhbHVlID0gdmFsdWVzXzJbX2ldOwogICAgICAgICAgICAgICAgICAgICAgICBfbG9vcF8yKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gTWFrZSB0aGUgdW5yZXNvbHZlZENvdW50IHplcm8tYmFzZWQgYWdhaW4uCiAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZENvdW50IC09IDI7CiAgICAgICAgICAgICAgICAgICAgaWYgKHVucmVzb2x2ZWRDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlc29sdmVkVmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByb21pc2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KFpvbmVBd2FyZVByb21pc2UucHJvdG90eXBlLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsKICAgICAgICAgICAgICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuICdQcm9taXNlJzsgfSwKICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoWm9uZUF3YXJlUHJvbWlzZS5wcm90b3R5cGUsIFN5bWJvbC5zcGVjaWVzLCB7CiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBab25lQXdhcmVQcm9taXNlOyB9LAogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgQyA9IHRoaXMuY29uc3RydWN0b3JbU3ltYm9sLnNwZWNpZXNdOwogICAgICAgICAgICAgICAgICAgIGlmICghQyB8fCB0eXBlb2YgQyAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICBDID0gdGhpcy5jb25zdHJ1Y3RvciB8fCBab25lQXdhcmVQcm9taXNlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgY2hhaW5Qcm9taXNlID0gbmV3IEMobm9vcCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIHpvbmUgPSBab25lLmN1cnJlbnQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXNbc3ltYm9sU3RhdGVdID09IFVOUkVTT0xWRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tzeW1ib2xWYWx1ZV0ucHVzaCh6b25lLCBjaGFpblByb21pc2UsIG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUmVzb2x2ZU9yUmVqZWN0KHRoaXMsIHpvbmUsIGNoYWluUHJvbWlzZSwgb25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2hhaW5Qcm9taXNlOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UucHJvdG90eXBlLmNhdGNoID0gZnVuY3Rpb24gKG9uUmVqZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy50aGVuKG51bGwsIG9uUmVqZWN0ZWQpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2UucHJvdG90eXBlLmZpbmFsbHkgPSBmdW5jdGlvbiAob25GaW5hbGx5KSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIEMgPSB0aGlzLmNvbnN0cnVjdG9yW1N5bWJvbC5zcGVjaWVzXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIUMgfHwgdHlwZW9mIEMgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgQyA9IFpvbmVBd2FyZVByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjaGFpblByb21pc2UgPSBuZXcgQyhub29wKTsKICAgICAgICAgICAgICAgICAgICBjaGFpblByb21pc2Vbc3ltYm9sRmluYWxseV0gPSBzeW1ib2xGaW5hbGx5OwogICAgICAgICAgICAgICAgICAgIHZhciB6b25lID0gWm9uZS5jdXJyZW50OwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzW3N5bWJvbFN0YXRlXSA9PSBVTlJFU09MVkVEKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbc3ltYm9sVmFsdWVdLnB1c2goem9uZSwgY2hhaW5Qcm9taXNlLCBvbkZpbmFsbHksIG9uRmluYWxseSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZVJlc29sdmVPclJlamVjdCh0aGlzLCB6b25lLCBjaGFpblByb21pc2UsIG9uRmluYWxseSwgb25GaW5hbGx5KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoYWluUHJvbWlzZTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICByZXR1cm4gWm9uZUF3YXJlUHJvbWlzZTsKICAgICAgICAgICAgfSgpKTsKICAgICAgICAgICAgLy8gUHJvdGVjdCBhZ2FpbnN0IGFnZ3Jlc3NpdmUgb3B0aW1pemVycyBkcm9wcGluZyBzZWVtaW5nbHkgdW51c2VkIHByb3BlcnRpZXMuCiAgICAgICAgICAgIC8vIEUuZy4gQ2xvc3VyZSBDb21waWxlciBpbiBhZHZhbmNlZCBtb2RlLgogICAgICAgICAgICBab25lQXdhcmVQcm9taXNlWydyZXNvbHZlJ10gPSBab25lQXdhcmVQcm9taXNlLnJlc29sdmU7CiAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3JlamVjdCddID0gWm9uZUF3YXJlUHJvbWlzZS5yZWplY3Q7CiAgICAgICAgICAgIFpvbmVBd2FyZVByb21pc2VbJ3JhY2UnXSA9IFpvbmVBd2FyZVByb21pc2UucmFjZTsKICAgICAgICAgICAgWm9uZUF3YXJlUHJvbWlzZVsnYWxsJ10gPSBab25lQXdhcmVQcm9taXNlLmFsbDsKICAgICAgICAgICAgdmFyIE5hdGl2ZVByb21pc2UgPSBnbG9iYWxbc3ltYm9sUHJvbWlzZV0gPSBnbG9iYWxbJ1Byb21pc2UnXTsKICAgICAgICAgICAgdmFyIFpPTkVfQVdBUkVfUFJPTUlTRSA9IFpvbmUuX19zeW1ib2xfXygnWm9uZUF3YXJlUHJvbWlzZScpOwogICAgICAgICAgICB2YXIgZGVzYyA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihnbG9iYWwsICdQcm9taXNlJyk7CiAgICAgICAgICAgIGlmICghZGVzYyB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkgewogICAgICAgICAgICAgICAgZGVzYyAmJiBkZWxldGUgZGVzYy53cml0YWJsZTsKICAgICAgICAgICAgICAgIGRlc2MgJiYgZGVsZXRlIGRlc2MudmFsdWU7CiAgICAgICAgICAgICAgICBpZiAoIWRlc2MpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjID0geyBjb25maWd1cmFibGU6IHRydWUsIGVudW1lcmFibGU6IHRydWUgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRlc2MuZ2V0ID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIC8vIGlmIHdlIGFscmVhZHkgc2V0IFpvbmVBd2FyZVByb21pc2UsIHVzZSBwYXRjaGVkIG9uZQogICAgICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gbmF0aXZlIG9uZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2xvYmFsW1pPTkVfQVdBUkVfUFJPTUlTRV0gPyBnbG9iYWxbWk9ORV9BV0FSRV9QUk9NSVNFXSA6IGdsb2JhbFtzeW1ib2xQcm9taXNlXTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBkZXNjLnNldCA9IGZ1bmN0aW9uIChOZXdOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKE5ld05hdGl2ZVByb21pc2UgPT09IFpvbmVBd2FyZVByb21pc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIE5ld05hdGl2ZVByb21pc2UgaXMgWm9uZUF3YXJlUHJvbWlzZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHRvIGdsb2JhbAogICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxbWk9ORV9BV0FSRV9QUk9NSVNFXSA9IE5ld05hdGl2ZVByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgTmV3TmF0aXZlUHJvbWlzZSBpcyBub3QgWm9uZUF3YXJlUHJvbWlzZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgZXhhbXBsZTogYWZ0ZXIgbG9hZCB6b25lLmpzLCBzb21lIGxpYnJhcnkganVzdAogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgZXM2LXByb21pc2UgdG8gZ2xvYmFsLCBpZiB3ZSBzZXQgaXQgdG8gZ2xvYmFsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5LCBhc3NlcnRab25lUGF0Y2hlZCB3aWxsIGZhaWwgYW5kIGFuZ3VsYXIKICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBub3QgbG9hZGVkLCBzbyB3ZSBqdXN0IHNldCB0aGUgTmV3TmF0aXZlUHJvbWlzZQogICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBnbG9iYWxbc3ltYm9sUHJvbWlzZV0sIHNvIHRoZSByZXN1bHQgaXMganVzdCBsaWtlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGxvYWQgRVM2IFByb21pc2UgYmVmb3JlIHpvbmUuanMKICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW3N5bWJvbFByb21pc2VdID0gTmV3TmF0aXZlUHJvbWlzZTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFOZXdOYXRpdmVQcm9taXNlLnByb3RvdHlwZVtzeW1ib2xUaGVuXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hUaGVuKE5ld05hdGl2ZVByb21pc2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFwaS5zZXROYXRpdmVQcm9taXNlKE5ld05hdGl2ZVByb21pc2UpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBPYmplY3REZWZpbmVQcm9wZXJ0eShnbG9iYWwsICdQcm9taXNlJywgZGVzYyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZ2xvYmFsWydQcm9taXNlJ10gPSBab25lQXdhcmVQcm9taXNlOwogICAgICAgICAgICB2YXIgc3ltYm9sVGhlblBhdGNoZWQgPSBfX3N5bWJvbF9fKCd0aGVuUGF0Y2hlZCcpOwogICAgICAgICAgICBmdW5jdGlvbiBwYXRjaFRoZW4oQ3RvcikgewogICAgICAgICAgICAgICAgdmFyIHByb3RvID0gQ3Rvci5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IE9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihwcm90bywgJ3RoZW4nKTsKICAgICAgICAgICAgICAgIGlmIChwcm9wICYmIChwcm9wLndyaXRhYmxlID09PSBmYWxzZSB8fCAhcHJvcC5jb25maWd1cmFibGUpKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgQ3Rvci5wcm90b3R5cGUudGhlbiBwcm9wZXJ0eURlc2NyaXB0b3IgaXMgd3JpdGFibGUgb3Igbm90CiAgICAgICAgICAgICAgICAgICAgLy8gaW4gbWV0ZW9yIGVudiwgd3JpdGFibGUgaXMgZmFsc2UsIHdlIHNob3VsZCBpZ25vcmUgc3VjaCBjYXNlCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIG9yaWdpbmFsVGhlbiA9IHByb3RvLnRoZW47CiAgICAgICAgICAgICAgICAvLyBLZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBvcmlnaW5hbCBtZXRob2QuCiAgICAgICAgICAgICAgICBwcm90b1tzeW1ib2xUaGVuXSA9IG9yaWdpbmFsVGhlbjsKICAgICAgICAgICAgICAgIEN0b3IucHJvdG90eXBlLnRoZW4gPSBmdW5jdGlvbiAob25SZXNvbHZlLCBvblJlamVjdCkgewogICAgICAgICAgICAgICAgICAgIHZhciBfdGhpcyA9IHRoaXM7CiAgICAgICAgICAgICAgICAgICAgdmFyIHdyYXBwZWQgPSBuZXcgWm9uZUF3YXJlUHJvbWlzZShmdW5jdGlvbiAocmVzb2x2ZSwgcmVqZWN0KSB7IG9yaWdpbmFsVGhlbi5jYWxsKF90aGlzLCByZXNvbHZlLCByZWplY3QpOyB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcHBlZC50aGVuKG9uUmVzb2x2ZSwgb25SZWplY3QpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIEN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhcGkucGF0Y2hUaGVuID0gcGF0Y2hUaGVuOwogICAgICAgICAgICBmdW5jdGlvbiB6b25laWZ5KGZuKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHRQcm9taXNlID0gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0UHJvbWlzZSBpbnN0YW5jZW9mIFpvbmVBd2FyZVByb21pc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBjdG9yID0gcmVzdWx0UHJvbWlzZS5jb25zdHJ1Y3RvcjsKICAgICAgICAgICAgICAgICAgICBpZiAoIWN0b3Jbc3ltYm9sVGhlblBhdGNoZWRdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoVGhlbihjdG9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdFByb21pc2U7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChOYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICBwYXRjaFRoZW4oTmF0aXZlUHJvbWlzZSk7CiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hfMSA9IGdsb2JhbFsnZmV0Y2gnXTsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZmV0Y2hfMSA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsW2FwaS5zeW1ib2woJ2ZldGNoJyldID0gZmV0Y2hfMTsKICAgICAgICAgICAgICAgICAgICBnbG9iYWxbJ2ZldGNoJ10gPSB6b25laWZ5KGZldGNoXzEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoaXMgaXMgbm90IHBhcnQgb2YgcHVibGljIEFQSSwgYnV0IGl0IGlzIHVzZWZ1bCBmb3IgdGVzdHMsIHNvIHdlIGV4cG9zZSBpdC4KICAgICAgICAgICAgUHJvbWlzZVtab25lLl9fc3ltYm9sX18oJ3VuY2F1Z2h0UHJvbWlzZUVycm9ycycpXSA9IF91bmNhdWdodFByb21pc2VFcnJvcnM7CiAgICAgICAgICAgIHJldHVybiBab25lQXdhcmVQcm9taXNlOwogICAgICAgIH0pOwogICAgICAgIC8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KICAgICAgICAvKioKICAgICAgICAgKiBTdXBwcmVzcyBjbG9zdXJlIGNvbXBpbGVyIGVycm9ycyBhYm91dCB1bmtub3duICdab25lJyB2YXJpYWJsZQogICAgICAgICAqIEBmaWxlb3ZlcnZpZXcKICAgICAgICAgKiBAc3VwcHJlc3Mge3VuZGVmaW5lZFZhcnMsZ2xvYmFsVGhpcyxtaXNzaW5nUmVxdWlyZX0KICAgICAgICAgKi8KICAgICAgICAvLy8gPHJlZmVyZW5jZSB0eXBlcz0ibm9kZSIvPgogICAgICAgIC8vIGlzc3VlICM5ODksIHRvIHJlZHVjZSBidW5kbGUgc2l6ZSwgdXNlIHNob3J0IG5hbWUKICAgICAgICAvKiogT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciAqLwogICAgICAgIHZhciBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgIC8qKiBPYmplY3QuZGVmaW5lUHJvcGVydHkgKi8KICAgICAgICB2YXIgT2JqZWN0RGVmaW5lUHJvcGVydHkgPSBPYmplY3QuZGVmaW5lUHJvcGVydHk7CiAgICAgICAgLyoqIE9iamVjdC5nZXRQcm90b3R5cGVPZiAqLwogICAgICAgIHZhciBPYmplY3RHZXRQcm90b3R5cGVPZiA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjsKICAgICAgICAvKiogT2JqZWN0LmNyZWF0ZSAqLwogICAgICAgIHZhciBPYmplY3RDcmVhdGUgPSBPYmplY3QuY3JlYXRlOwogICAgICAgIC8qKiBBcnJheS5wcm90b3R5cGUuc2xpY2UgKi8KICAgICAgICB2YXIgQXJyYXlTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKICAgICAgICAvKiogYWRkRXZlbnRMaXN0ZW5lciBzdHJpbmcgY29uc3QgKi8KICAgICAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NUUiA9ICdhZGRFdmVudExpc3RlbmVyJzsKICAgICAgICAvKiogcmVtb3ZlRXZlbnRMaXN0ZW5lciBzdHJpbmcgY29uc3QgKi8KICAgICAgICB2YXIgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiA9ICdyZW1vdmVFdmVudExpc3RlbmVyJzsKICAgICAgICAvKiogem9uZVN5bWJvbCBhZGRFdmVudExpc3RlbmVyICovCiAgICAgICAgdmFyIFpPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUiA9IFpvbmUuX19zeW1ib2xfXyhBRERfRVZFTlRfTElTVEVORVJfU1RSKTsKICAgICAgICAvKiogem9uZVN5bWJvbCByZW1vdmVFdmVudExpc3RlbmVyICovCiAgICAgICAgdmFyIFpPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUiA9IFpvbmUuX19zeW1ib2xfXyhSRU1PVkVfRVZFTlRfTElTVEVORVJfU1RSKTsKICAgICAgICAvKiogdHJ1ZSBzdHJpbmcgY29uc3QgKi8KICAgICAgICB2YXIgVFJVRV9TVFIgPSAndHJ1ZSc7CiAgICAgICAgLyoqIGZhbHNlIHN0cmluZyBjb25zdCAqLwogICAgICAgIHZhciBGQUxTRV9TVFIgPSAnZmFsc2UnOwogICAgICAgIC8qKiBab25lIHN5bWJvbCBwcmVmaXggc3RyaW5nIGNvbnN0LiAqLwogICAgICAgIHZhciBaT05FX1NZTUJPTF9QUkVGSVggPSBab25lLl9fc3ltYm9sX18oJycpOwogICAgICAgIGZ1bmN0aW9uIHdyYXBXaXRoQ3VycmVudFpvbmUoY2FsbGJhY2ssIHNvdXJjZSkgewogICAgICAgICAgICByZXR1cm4gWm9uZS5jdXJyZW50LndyYXAoY2FsbGJhY2ssIHNvdXJjZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlTWFjcm9UYXNrV2l0aEN1cnJlbnRab25lKHNvdXJjZSwgY2FsbGJhY2ssIGRhdGEsIGN1c3RvbVNjaGVkdWxlLCBjdXN0b21DYW5jZWwpIHsKICAgICAgICAgICAgcmV0dXJuIFpvbmUuY3VycmVudC5zY2hlZHVsZU1hY3JvVGFzayhzb3VyY2UsIGNhbGxiYWNrLCBkYXRhLCBjdXN0b21TY2hlZHVsZSwgY3VzdG9tQ2FuY2VsKTsKICAgICAgICB9CiAgICAgICAgdmFyIHpvbmVTeW1ib2wgPSBab25lLl9fc3ltYm9sX187CiAgICAgICAgdmFyIGlzV2luZG93RXhpc3RzID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCc7CiAgICAgICAgdmFyIGludGVybmFsV2luZG93ID0gaXNXaW5kb3dFeGlzdHMgPyB3aW5kb3cgOiB1bmRlZmluZWQ7CiAgICAgICAgdmFyIF9nbG9iYWwgPSBpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvdyB8fCB0eXBlb2Ygc2VsZiA9PT0gJ29iamVjdCcgJiYgc2VsZiB8fCBjb21tb25qc0dsb2JhbDsKICAgICAgICB2YXIgUkVNT1ZFX0FUVFJJQlVURSA9ICdyZW1vdmVBdHRyaWJ1dGUnOwogICAgICAgIHZhciBOVUxMX09OX1BST1BfVkFMVUUgPSBbbnVsbF07CiAgICAgICAgZnVuY3Rpb24gYmluZEFyZ3VtZW50cyhhcmdzLCBzb3VyY2UpIHsKICAgICAgICAgICAgZm9yICh2YXIgaSA9IGFyZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJnc1tpXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIGFyZ3NbaV0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGFyZ3NbaV0sIHNvdXJjZSArICdfJyArIGkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBhcmdzOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwYXRjaFByb3RvdHlwZShwcm90b3R5cGUsIGZuTmFtZXMpIHsKICAgICAgICAgICAgdmFyIHNvdXJjZSA9IHByb3RvdHlwZS5jb25zdHJ1Y3RvclsnbmFtZSddOwogICAgICAgICAgICB2YXIgX2xvb3BfMyA9IGZ1bmN0aW9uIChpKSB7CiAgICAgICAgICAgICAgICB2YXIgbmFtZV8xID0gZm5OYW1lc1tpXTsKICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IHByb3RvdHlwZVtuYW1lXzFdOwogICAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZURlc2MgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBuYW1lXzEpOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNQcm9wZXJ0eVdyaXRhYmxlKHByb3RvdHlwZURlc2MpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiY29udGludWUiOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwcm90b3R5cGVbbmFtZV8xXSA9IChmdW5jdGlvbiAoZGVsZWdhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhdGNoZWQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkodGhpcywgYmluZEFyZ3VtZW50cyhhcmd1bWVudHMsIHNvdXJjZSArICcuJyArIG5hbWVfMSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocGF0Y2hlZCwgZGVsZWdhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGF0Y2hlZDsKICAgICAgICAgICAgICAgICAgICB9KShkZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZm5OYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgX2xvb3BfMyhpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBpc1Byb3BlcnR5V3JpdGFibGUocHJvcGVydHlEZXNjKSB7CiAgICAgICAgICAgIGlmICghcHJvcGVydHlEZXNjKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocHJvcGVydHlEZXNjLndyaXRhYmxlID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAhKHR5cGVvZiBwcm9wZXJ0eURlc2MuZ2V0ID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBwcm9wZXJ0eURlc2Muc2V0ID09PSAndW5kZWZpbmVkJyk7CiAgICAgICAgfQogICAgICAgIHZhciBpc1dlYldvcmtlciA9ICh0eXBlb2YgV29ya2VyR2xvYmFsU2NvcGUgIT09ICd1bmRlZmluZWQnICYmIHNlbGYgaW5zdGFuY2VvZiBXb3JrZXJHbG9iYWxTY29wZSk7CiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5CiAgICAgICAgLy8gdGhpcyBjb2RlLgogICAgICAgIHZhciBpc05vZGUgPSAoISgnbncnIGluIF9nbG9iYWwpICYmIHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgIHt9LnRvU3RyaW5nLmNhbGwoX2dsb2JhbC5wcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nKTsKICAgICAgICB2YXIgaXNCcm93c2VyID0gIWlzTm9kZSAmJiAhaXNXZWJXb3JrZXIgJiYgISEoaXNXaW5kb3dFeGlzdHMgJiYgaW50ZXJuYWxXaW5kb3dbJ0hUTUxFbGVtZW50J10pOwogICAgICAgIC8vIHdlIGFyZSBpbiBlbGVjdHJvbiBvZiBudywgc28gd2UgYXJlIGJvdGggYnJvd3NlciBhbmQgbm9kZWpzCiAgICAgICAgLy8gTWFrZSBzdXJlIHRvIGFjY2VzcyBgcHJvY2Vzc2AgdGhyb3VnaCBgX2dsb2JhbGAgc28gdGhhdCBXZWJQYWNrIGRvZXMgbm90IGFjY2lkZW50YWxseSBicm93c2VyaWZ5CiAgICAgICAgLy8gdGhpcyBjb2RlLgogICAgICAgIHZhciBpc01peCA9IHR5cGVvZiBfZ2xvYmFsLnByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmCiAgICAgICAgICAgIHt9LnRvU3RyaW5nLmNhbGwoX2dsb2JhbC5wcm9jZXNzKSA9PT0gJ1tvYmplY3QgcHJvY2Vzc10nICYmICFpc1dlYldvcmtlciAmJgogICAgICAgICAgICAhIShpc1dpbmRvd0V4aXN0cyAmJiBpbnRlcm5hbFdpbmRvd1snSFRNTEVsZW1lbnQnXSk7CiAgICAgICAgdmFyIHpvbmVTeW1ib2xFdmVudE5hbWVzID0ge307CiAgICAgICAgdmFyIHdyYXBGbiA9IGZ1bmN0aW9uIChldmVudCkgewogICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXMKICAgICAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudAogICAgICAgICAgICBldmVudCA9IGV2ZW50IHx8IF9nbG9iYWwuZXZlbnQ7CiAgICAgICAgICAgIGlmICghZXZlbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnQudHlwZV07CiAgICAgICAgICAgIGlmICghZXZlbnROYW1lU3ltYm9sKSB7CiAgICAgICAgICAgICAgICBldmVudE5hbWVTeW1ib2wgPSB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudC50eXBlXSA9IHpvbmVTeW1ib2woJ09OX1BST1BFUlRZJyArIGV2ZW50LnR5cGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsOwogICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXTsKICAgICAgICAgICAgdmFyIHJlc3VsdDsKICAgICAgICAgICAgaWYgKGlzQnJvd3NlciAmJiB0YXJnZXQgPT09IGludGVybmFsV2luZG93ICYmIGV2ZW50LnR5cGUgPT09ICdlcnJvcicpIHsKICAgICAgICAgICAgICAgIC8vIHdpbmRvdy5vbmVycm9yIGhhdmUgZGlmZmVyZW50IHNpZ25pdHVyZQogICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0dsb2JhbEV2ZW50SGFuZGxlcnMvb25lcnJvciN3aW5kb3cub25lcnJvcgogICAgICAgICAgICAgICAgLy8gYW5kIG9uZXJyb3IgY2FsbGJhY2sgd2lsbCBwcmV2ZW50IGRlZmF1bHQgd2hlbiBjYWxsYmFjayByZXR1cm4gdHJ1ZQogICAgICAgICAgICAgICAgdmFyIGVycm9yRXZlbnQgPSBldmVudDsKICAgICAgICAgICAgICAgIHJlc3VsdCA9IGxpc3RlbmVyICYmCiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBlcnJvckV2ZW50Lm1lc3NhZ2UsIGVycm9yRXZlbnQuZmlsZW5hbWUsIGVycm9yRXZlbnQubGluZW5vLCBlcnJvckV2ZW50LmNvbG5vLCBlcnJvckV2ZW50LmVycm9yKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgPT09IHRydWUpIHsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmVzdWx0ID0gbGlzdGVuZXIgJiYgbGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gdW5kZWZpbmVkICYmICFyZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfTsKICAgICAgICBmdW5jdGlvbiBwYXRjaFByb3BlcnR5KG9iaiwgcHJvcCwgcHJvdG90eXBlKSB7CiAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKG9iaiwgcHJvcCk7CiAgICAgICAgICAgIGlmICghZGVzYyAmJiBwcm90b3R5cGUpIHsKICAgICAgICAgICAgICAgIC8vIHdoZW4gcGF0Y2ggd2luZG93IG9iamVjdCwgdXNlIHByb3RvdHlwZSB0byBjaGVjayBwcm9wIGV4aXN0IG9yIG5vdAogICAgICAgICAgICAgICAgdmFyIHByb3RvdHlwZURlc2MgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBwcm9wKTsKICAgICAgICAgICAgICAgIGlmIChwcm90b3R5cGVEZXNjKSB7CiAgICAgICAgICAgICAgICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaWYgdGhlIGRlc2NyaXB0b3Igbm90IGV4aXN0cyBvciBpcyBub3QgY29uZmlndXJhYmxlCiAgICAgICAgICAgIC8vIGp1c3QgcmV0dXJuCiAgICAgICAgICAgIGlmICghZGVzYyB8fCAhZGVzYy5jb25maWd1cmFibGUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgb25Qcm9wUGF0Y2hlZFN5bWJvbCA9IHpvbmVTeW1ib2woJ29uJyArIHByb3AgKyAncGF0Y2hlZCcpOwogICAgICAgICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KG9uUHJvcFBhdGNoZWRTeW1ib2wpICYmIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEEgcHJvcGVydHkgZGVzY3JpcHRvciBjYW5ub3QgaGF2ZSBnZXR0ZXIvc2V0dGVyIGFuZCBiZSB3cml0YWJsZQogICAgICAgICAgICAvLyBkZWxldGluZyB0aGUgd3JpdGFibGUgYW5kIHZhbHVlIHByb3BlcnRpZXMgYXZvaWRzIHRoaXMgZXJyb3I6CiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIFR5cGVFcnJvcjogcHJvcGVydHkgZGVzY3JpcHRvcnMgbXVzdCBub3Qgc3BlY2lmeSBhIHZhbHVlIG9yIGJlIHdyaXRhYmxlIHdoZW4gYQogICAgICAgICAgICAvLyBnZXR0ZXIgb3Igc2V0dGVyIGhhcyBiZWVuIHNwZWNpZmllZAogICAgICAgICAgICBkZWxldGUgZGVzYy53cml0YWJsZTsKICAgICAgICAgICAgZGVsZXRlIGRlc2MudmFsdWU7CiAgICAgICAgICAgIHZhciBvcmlnaW5hbERlc2NHZXQgPSBkZXNjLmdldDsKICAgICAgICAgICAgdmFyIG9yaWdpbmFsRGVzY1NldCA9IGRlc2Muc2V0OwogICAgICAgICAgICAvLyBzdWJzdHIoMikgY3V6ICdvbmNsaWNrJyAtPiAnY2xpY2snLCBldGMKICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IHByb3Auc3Vic3RyKDIpOwogICAgICAgICAgICB2YXIgZXZlbnROYW1lU3ltYm9sID0gem9uZVN5bWJvbEV2ZW50TmFtZXNbZXZlbnROYW1lXTsKICAgICAgICAgICAgaWYgKCFldmVudE5hbWVTeW1ib2wpIHsKICAgICAgICAgICAgICAgIGV2ZW50TmFtZVN5bWJvbCA9IHpvbmVTeW1ib2xFdmVudE5hbWVzW2V2ZW50TmFtZV0gPSB6b25lU3ltYm9sKCdPTl9QUk9QRVJUWScgKyBldmVudE5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRlc2Muc2V0ID0gZnVuY3Rpb24gKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAvLyBpbiBzb21lIG9mIHdpbmRvd3MncyBvbnByb3BlcnR5IGNhbGxiYWNrLCB0aGlzIGlzIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjaGVjayBpdAogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCAmJiBvYmogPT09IF9nbG9iYWwpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBfZ2xvYmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgcHJldmlvdXNWYWx1ZSA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKHByZXZpb3VzVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIHdyYXBGbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBpc3N1ZSAjOTc4LCB3aGVuIG9ubG9hZCBoYW5kbGVyIHdhcyBhZGRlZCBiZWZvcmUgbG9hZGluZyB6b25lLmpzCiAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggb3JpZ2luYWxEZXNjU2V0CiAgICAgICAgICAgICAgICBpZiAob3JpZ2luYWxEZXNjU2V0KSB7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luYWxEZXNjU2V0LmFwcGx5KHRhcmdldCwgTlVMTF9PTl9QUk9QX1ZBTFVFKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgbmV3VmFsdWUgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXSA9IG5ld1ZhbHVlOwogICAgICAgICAgICAgICAgICAgIHRhcmdldC5hZGRFdmVudExpc3RlbmVyKGV2ZW50TmFtZSwgd3JhcEZuLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbZXZlbnROYW1lU3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8vIFRoZSBnZXR0ZXIgd291bGQgcmV0dXJuIHVuZGVmaW5lZCBmb3IgdW5hc3NpZ25lZCBwcm9wZXJ0aWVzIGJ1dCB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhbgogICAgICAgICAgICAvLyB1bmFzc2lnbmVkIHByb3BlcnR5IGlzIG51bGwKICAgICAgICAgICAgZGVzYy5nZXQgPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAvLyBpbiBzb21lIG9mIHdpbmRvd3MncyBvbnByb3BlcnR5IGNhbGxiYWNrLCB0aGlzIGlzIHVuZGVmaW5lZAogICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjaGVjayBpdAogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7CiAgICAgICAgICAgICAgICBpZiAoIXRhcmdldCAmJiBvYmogPT09IF9nbG9iYWwpIHsKICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBfZ2xvYmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBsaXN0ZW5lciA9IHRhcmdldFtldmVudE5hbWVTeW1ib2xdOwogICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAob3JpZ2luYWxEZXNjR2V0KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gcmVzdWx0IHdpbGwgYmUgbnVsbCB3aGVuIHVzZSBpbmxpbmUgZXZlbnQgYXR0cmlidXRlLAogICAgICAgICAgICAgICAgICAgIC8vIHN1Y2ggYXMgPGJ1dHRvbiBvbmNsaWNrPSJmdW5jKCk7Ij5PSzwvYnV0dG9uPgogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgdGhlIG9uY2xpY2sgZnVuY3Rpb24gaXMgaW50ZXJuYWwgcmF3IHVuY29tcGlsZWQgaGFuZGxlcgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmNsaWNrIHdpbGwgYmUgZXZhbHVhdGVkIHdoZW4gZmlyc3QgdGltZSBldmVudCB3YXMgdHJpZ2dlcmVkIG9yCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHByb3BlcnR5IGlzIGFjY2Vzc2VkLCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy81MjUKICAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBzaG91bGQgdXNlIG9yaWdpbmFsIG5hdGl2ZSBnZXQgdG8gcmV0cmlldmUgdGhlIGhhbmRsZXIKICAgICAgICAgICAgICAgICAgICB2YXIgdmFsdWUgPSBvcmlnaW5hbERlc2NHZXQgJiYgb3JpZ2luYWxEZXNjR2V0LmNhbGwodGhpcyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlc2Muc2V0LmNhbGwodGhpcywgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtSRU1PVkVfQVRUUklCVVRFXSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnJlbW92ZUF0dHJpYnV0ZShwcm9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIE9iamVjdERlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgZGVzYyk7CiAgICAgICAgICAgIG9ialtvblByb3BQYXRjaGVkU3ltYm9sXSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHBhdGNoT25Qcm9wZXJ0aWVzKG9iaiwgcHJvcGVydGllcywgcHJvdG90eXBlKSB7CiAgICAgICAgICAgIGlmIChwcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHByb3BlcnRpZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBwYXRjaFByb3BlcnR5KG9iaiwgJ29uJyArIHByb3BlcnRpZXNbaV0sIHByb3RvdHlwZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgb25Qcm9wZXJ0aWVzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKHZhciBwcm9wIGluIG9iaikgewogICAgICAgICAgICAgICAgICAgIGlmIChwcm9wLnN1YnN0cigwLCAyKSA9PSAnb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9uUHJvcGVydGllcy5wdXNoKHByb3ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgb25Qcm9wZXJ0aWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0Y2hQcm9wZXJ0eShvYmosIG9uUHJvcGVydGllc1tqXSwgcHJvdG90eXBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB2YXIgb3JpZ2luYWxJbnN0YW5jZUtleSA9IHpvbmVTeW1ib2woJ29yaWdpbmFsSW5zdGFuY2UnKTsKICAgICAgICAvLyB3cmFwIHNvbWUgbmF0aXZlIEFQSSBvbiBgd2luZG93YAogICAgICAgIGZ1bmN0aW9uIHBhdGNoQ2xhc3MoY2xhc3NOYW1lKSB7CiAgICAgICAgICAgIHZhciBPcmlnaW5hbENsYXNzID0gX2dsb2JhbFtjbGFzc05hbWVdOwogICAgICAgICAgICBpZiAoIU9yaWdpbmFsQ2xhc3MpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8vIGtlZXAgb3JpZ2luYWwgY2xhc3MgaW4gZ2xvYmFsCiAgICAgICAgICAgIF9nbG9iYWxbem9uZVN5bWJvbChjbGFzc05hbWUpXSA9IE9yaWdpbmFsQ2xhc3M7CiAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXSA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIHZhciBhID0gYmluZEFyZ3VtZW50cyhhcmd1bWVudHMsIGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKGEubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XSA9IG5ldyBPcmlnaW5hbENsYXNzKGFbMF0sIGFbMV0pOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV0gPSBuZXcgT3JpZ2luYWxDbGFzcyhhWzBdLCBhWzFdLCBhWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgY2FzZSA0OgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldID0gbmV3IE9yaWdpbmFsQ2xhc3MoYVswXSwgYVsxXSwgYVsyXSwgYVszXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQXJnIGxpc3QgdG9vIGxvbmcuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8vIGF0dGFjaCBvcmlnaW5hbCBkZWxlZ2F0ZSB0byBwYXRjaGVkIGZ1bmN0aW9uCiAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChfZ2xvYmFsW2NsYXNzTmFtZV0sIE9yaWdpbmFsQ2xhc3MpOwogICAgICAgICAgICB2YXIgaW5zdGFuY2UgPSBuZXcgT3JpZ2luYWxDbGFzcyhmdW5jdGlvbiAoKSB7IH0pOwogICAgICAgICAgICB2YXIgcHJvcDsKICAgICAgICAgICAgZm9yIChwcm9wIGluIGluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NDQ3MjEKICAgICAgICAgICAgICAgIGlmIChjbGFzc05hbWUgPT09ICdYTUxIdHRwUmVxdWVzdCcgJiYgcHJvcCA9PT0gJ3Jlc3BvbnNlQmxvYicpCiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAoZnVuY3Rpb24gKHByb3ApIHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGluc3RhbmNlW3Byb3BdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXS5wcm90b3R5cGVbcHJvcF0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpc1tvcmlnaW5hbEluc3RhbmNlS2V5XVtwcm9wXS5hcHBseSh0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldLCBhcmd1bWVudHMpOwogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0RGVmaW5lUHJvcGVydHkoX2dsb2JhbFtjbGFzc05hbWVdLnByb3RvdHlwZSwgcHJvcCwgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZuID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0gPSB3cmFwV2l0aEN1cnJlbnRab25lKGZuLCBjbGFzc05hbWUgKyAnLicgKyBwcm9wKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8ga2VlcCBjYWxsYmFjayBpbiB3cmFwcGVkIGZ1bmN0aW9uIHNvIHdlIGNhbgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgaXQgaW4gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nIHRvIHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgbmF0aXZlIG9uZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0sIGZuKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXNbb3JpZ2luYWxJbnN0YW5jZUtleV1bcHJvcF0gPSBmbjsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzW29yaWdpbmFsSW5zdGFuY2VLZXldW3Byb3BdOyB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0ocHJvcCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAocHJvcCBpbiBPcmlnaW5hbENsYXNzKSB7CiAgICAgICAgICAgICAgICBpZiAocHJvcCAhPT0gJ3Byb3RvdHlwZScgJiYgT3JpZ2luYWxDbGFzcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIF9nbG9iYWxbY2xhc3NOYW1lXVtwcm9wXSA9IE9yaWdpbmFsQ2xhc3NbcHJvcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcGF0Y2hNZXRob2QodGFyZ2V0LCBuYW1lLCBwYXRjaEZuKSB7CiAgICAgICAgICAgIHZhciBwcm90byA9IHRhcmdldDsKICAgICAgICAgICAgd2hpbGUgKHByb3RvICYmICFwcm90by5oYXNPd25Qcm9wZXJ0eShuYW1lKSkgewogICAgICAgICAgICAgICAgcHJvdG8gPSBPYmplY3RHZXRQcm90b3R5cGVPZihwcm90byk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFwcm90byAmJiB0YXJnZXRbbmFtZV0pIHsKICAgICAgICAgICAgICAgIC8vIHNvbWVob3cgd2UgZGlkIG5vdCBmaW5kIGl0LCBidXQgd2UgY2FuIHNlZSBpdC4gVGhpcyBoYXBwZW5zIG9uIElFIGZvciBXaW5kb3cgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgIHByb3RvID0gdGFyZ2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBkZWxlZ2F0ZU5hbWUgPSB6b25lU3ltYm9sKG5hbWUpOwogICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSBudWxsOwogICAgICAgICAgICBpZiAocHJvdG8gJiYgIShkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0pKSB7CiAgICAgICAgICAgICAgICBkZWxlZ2F0ZSA9IHByb3RvW2RlbGVnYXRlTmFtZV0gPSBwcm90b1tuYW1lXTsKICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgcHJvdG9bbmFtZV0gaXMgd3JpdGFibGUKICAgICAgICAgICAgICAgIC8vIHNvbWUgcHJvcGVydHkgaXMgcmVhZG9ubHkgaW4gc2FmYXJpLCBzdWNoIGFzIEh0bWxDYW52YXNFbGVtZW50LnByb3RvdHlwZS50b0Jsb2IKICAgICAgICAgICAgICAgIHZhciBkZXNjID0gcHJvdG8gJiYgT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHByb3RvLCBuYW1lKTsKICAgICAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5V3JpdGFibGUoZGVzYykpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcGF0Y2hEZWxlZ2F0ZV8xID0gcGF0Y2hGbihkZWxlZ2F0ZSwgZGVsZWdhdGVOYW1lLCBuYW1lKTsKICAgICAgICAgICAgICAgICAgICBwcm90b1tuYW1lXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHBhdGNoRGVsZWdhdGVfMSh0aGlzLCBhcmd1bWVudHMpOyB9OwogICAgICAgICAgICAgICAgICAgIGF0dGFjaE9yaWdpblRvUGF0Y2hlZChwcm90b1tuYW1lXSwgZGVsZWdhdGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETzogQEppYUxpUGFzc2lvbiwgc3VwcG9ydCBjYW5jZWwgdGFzayBsYXRlciBpZiBuZWNlc3NhcnkKICAgICAgICBmdW5jdGlvbiBwYXRjaE1hY3JvVGFzayhvYmosIGZ1bmNOYW1lLCBtZXRhQ3JlYXRvcikgewogICAgICAgICAgICB2YXIgc2V0TmF0aXZlID0gbnVsbDsKICAgICAgICAgICAgZnVuY3Rpb24gc2NoZWR1bGVUYXNrKHRhc2spIHsKICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdGFzay5kYXRhOwogICAgICAgICAgICAgICAgZGF0YS5hcmdzW2RhdGEuY2JJZHhdID0gZnVuY3Rpb24gKCkgeyB0YXNrLmludm9rZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9OwogICAgICAgICAgICAgICAgc2V0TmF0aXZlLmFwcGx5KGRhdGEudGFyZ2V0LCBkYXRhLmFyZ3MpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRhc2s7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc2V0TmF0aXZlID0gcGF0Y2hNZXRob2Qob2JqLCBmdW5jTmFtZSwgZnVuY3Rpb24gKGRlbGVnYXRlKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykgewogICAgICAgICAgICAgICAgdmFyIG1ldGEgPSBtZXRhQ3JlYXRvcihzZWxmLCBhcmdzKTsKICAgICAgICAgICAgICAgIGlmIChtZXRhLmNiSWR4ID49IDAgJiYgdHlwZW9mIGFyZ3NbbWV0YS5jYklkeF0gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUobWV0YS5uYW1lLCBhcmdzW21ldGEuY2JJZHhdLCBtZXRhLCBzY2hlZHVsZVRhc2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVsZWdhdGUuYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07IH0pOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocGF0Y2hlZCwgb3JpZ2luYWwpIHsKICAgICAgICAgICAgcGF0Y2hlZFt6b25lU3ltYm9sKCdPcmlnaW5hbERlbGVnYXRlJyldID0gb3JpZ2luYWw7CiAgICAgICAgfQogICAgICAgIHZhciBpc0RldGVjdGVkSUVPckVkZ2UgPSBmYWxzZTsKICAgICAgICB2YXIgaWVPckVkZ2UgPSBmYWxzZTsKICAgICAgICBmdW5jdGlvbiBpc0lFKCkgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIHVhID0gaW50ZXJuYWxXaW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudDsKICAgICAgICAgICAgICAgIGlmICh1YS5pbmRleE9mKCdNU0lFICcpICE9PSAtMSB8fCB1YS5pbmRleE9mKCdUcmlkZW50LycpICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gaXNJRU9yRWRnZSgpIHsKICAgICAgICAgICAgaWYgKGlzRGV0ZWN0ZWRJRU9yRWRnZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGllT3JFZGdlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlzRGV0ZWN0ZWRJRU9yRWRnZSA9IHRydWU7CiAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICB2YXIgdWEgPSBpbnRlcm5hbFdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50OwogICAgICAgICAgICAgICAgaWYgKHVhLmluZGV4T2YoJ01TSUUgJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ1RyaWRlbnQvJykgIT09IC0xIHx8IHVhLmluZGV4T2YoJ0VkZ2UvJykgIT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgaWVPckVkZ2UgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpZU9yRWRnZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIC8vIG92ZXJyaWRlIEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZyB0byBtYWtlIHpvbmUuanMgcGF0Y2hlZCBmdW5jdGlvbgogICAgICAgIC8vIGxvb2sgbGlrZSBuYXRpdmUgZnVuY3Rpb24KICAgICAgICBab25lLl9fbG9hZF9wYXRjaCgndG9TdHJpbmcnLCBmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICAgICAgICAgIC8vIHBhdGNoIEZ1bmMucHJvdG90eXBlLnRvU3RyaW5nIHRvIGxldCB0aGVtIGxvb2sgbGlrZSBuYXRpdmUKICAgICAgICAgICAgdmFyIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZyA9IEZ1bmN0aW9uLnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgICAgICAgdmFyIE9SSUdJTkFMX0RFTEVHQVRFX1NZTUJPTCA9IHpvbmVTeW1ib2woJ09yaWdpbmFsRGVsZWdhdGUnKTsKICAgICAgICAgICAgdmFyIFBST01JU0VfU1lNQk9MID0gem9uZVN5bWJvbCgnUHJvbWlzZScpOwogICAgICAgICAgICB2YXIgRVJST1JfU1lNQk9MID0gem9uZVN5bWJvbCgnRXJyb3InKTsKICAgICAgICAgICAgdmFyIG5ld0Z1bmN0aW9uVG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgIHZhciBvcmlnaW5hbERlbGVnYXRlID0gdGhpc1tPUklHSU5BTF9ERUxFR0FURV9TWU1CT0xdOwogICAgICAgICAgICAgICAgICAgIGlmIChvcmlnaW5hbERlbGVnYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3JpZ2luYWxEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZy5jYWxsKG9yaWdpbmFsRGVsZWdhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvcmlnaW5hbERlbGVnYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcyA9PT0gUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgbmF0aXZlUHJvbWlzZSA9IGdsb2JhbFtQUk9NSVNFX1NZTUJPTF07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChuYXRpdmVQcm9taXNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwobmF0aXZlUHJvbWlzZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMgPT09IEVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBuYXRpdmVFcnJvciA9IGdsb2JhbFtFUlJPUl9TWU1CT0xdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmF0aXZlRXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEZ1bmN0aW9uVG9TdHJpbmcuY2FsbChuYXRpdmVFcnJvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxGdW5jdGlvblRvU3RyaW5nLmNhbGwodGhpcyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIG5ld0Z1bmN0aW9uVG9TdHJpbmdbT1JJR0lOQUxfREVMRUdBVEVfU1lNQk9MXSA9IG9yaWdpbmFsRnVuY3Rpb25Ub1N0cmluZzsKICAgICAgICAgICAgRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nID0gbmV3RnVuY3Rpb25Ub1N0cmluZzsKICAgICAgICAgICAgLy8gcGF0Y2ggT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyB0byBsZXQgdGhlbSBsb29rIGxpa2UgbmF0aXZlCiAgICAgICAgICAgIHZhciBvcmlnaW5hbE9iamVjdFRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZzsKICAgICAgICAgICAgdmFyIFBST01JU0VfT0JKRUNUX1RPX1NUUklORyA9ICdbb2JqZWN0IFByb21pc2VdJzsKICAgICAgICAgICAgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgUHJvbWlzZSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBQUk9NSVNFX09CSkVDVF9UT19TVFJJTkc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxPYmplY3RUb1N0cmluZy5jYWxsKHRoaXMpOwogICAgICAgICAgICB9OwogICAgICAgIH0pOwogICAgICAgIC8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KICAgICAgICB2YXIgcGFzc2l2ZVN1cHBvcnRlZCA9IGZhbHNlOwogICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcGFzc2l2ZVN1cHBvcnRlZCA9IHRydWU7IH0gfSk7CiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigndGVzdCcsIG9wdGlvbnMsIG9wdGlvbnMpOwogICAgICAgICAgICAgICAgd2luZG93LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCBvcHRpb25zLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICBwYXNzaXZlU3VwcG9ydGVkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gYW4gaWRlbnRpZmllciB0byB0ZWxsIFpvbmVUYXNrIGRvIG5vdCBjcmVhdGUgYSBuZXcgaW52b2tlIGNsb3N1cmUKICAgICAgICB2YXIgT1BUSU1JWkVEX1pPTkVfRVZFTlRfVEFTS19EQVRBID0gewogICAgICAgICAgICB1c2VHOiB0cnVlCiAgICAgICAgfTsKICAgICAgICB2YXIgem9uZVN5bWJvbEV2ZW50TmFtZXMkMSA9IHt9OwogICAgICAgIHZhciBnbG9iYWxTb3VyY2VzID0ge307CiAgICAgICAgdmFyIEVWRU5UX05BTUVfU1lNQk9MX1JFR1ggPSBuZXcgUmVnRXhwKCdeJyArIFpPTkVfU1lNQk9MX1BSRUZJWCArICcoXFx3KykodHJ1ZXxmYWxzZSkkJyk7CiAgICAgICAgdmFyIElNTUVESUFURV9QUk9QQUdBVElPTl9TWU1CT0wgPSB6b25lU3ltYm9sKCdwcm9wYWdhdGlvblN0b3BwZWQnKTsKICAgICAgICBmdW5jdGlvbiBwcmVwYXJlRXZlbnROYW1lcyhldmVudE5hbWUsIGV2ZW50TmFtZVRvU3RyaW5nKSB7CiAgICAgICAgICAgIHZhciBmYWxzZUV2ZW50TmFtZSA9IChldmVudE5hbWVUb1N0cmluZyA/IGV2ZW50TmFtZVRvU3RyaW5nKGV2ZW50TmFtZSkgOiBldmVudE5hbWUpICsgRkFMU0VfU1RSOwogICAgICAgICAgICB2YXIgdHJ1ZUV2ZW50TmFtZSA9IChldmVudE5hbWVUb1N0cmluZyA/IGV2ZW50TmFtZVRvU3RyaW5nKGV2ZW50TmFtZSkgOiBldmVudE5hbWUpICsgVFJVRV9TVFI7CiAgICAgICAgICAgIHZhciBzeW1ib2wgPSBaT05FX1NZTUJPTF9QUkVGSVggKyBmYWxzZUV2ZW50TmFtZTsKICAgICAgICAgICAgdmFyIHN5bWJvbENhcHR1cmUgPSBaT05FX1NZTUJPTF9QUkVGSVggKyB0cnVlRXZlbnROYW1lOwogICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV0gPSB7fTsKICAgICAgICAgICAgem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7CiAgICAgICAgICAgIHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXVtUUlVFX1NUUl0gPSBzeW1ib2xDYXB0dXJlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIGFwaXMsIHBhdGNoT3B0aW9ucykgewogICAgICAgICAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMuYWRkKSB8fCBBRERfRVZFTlRfTElTVEVORVJfU1RSOwogICAgICAgICAgICB2YXIgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSID0gKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucm0pIHx8IFJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7CiAgICAgICAgICAgIHZhciBMSVNURU5FUlNfRVZFTlRfTElTVEVORVIgPSAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5saXN0ZW5lcnMpIHx8ICdldmVudExpc3RlbmVycyc7CiAgICAgICAgICAgIHZhciBSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUiA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnJtQWxsKSB8fCAncmVtb3ZlQWxsTGlzdGVuZXJzJzsKICAgICAgICAgICAgdmFyIHpvbmVTeW1ib2xBZGRFdmVudExpc3RlbmVyID0gem9uZVN5bWJvbChBRERfRVZFTlRfTElTVEVORVIpOwogICAgICAgICAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuJyArIEFERF9FVkVOVF9MSVNURU5FUiArICc6JzsKICAgICAgICAgICAgdmFyIFBSRVBFTkRfRVZFTlRfTElTVEVORVIgPSAncHJlcGVuZExpc3RlbmVyJzsKICAgICAgICAgICAgdmFyIFBSRVBFTkRfRVZFTlRfTElTVEVORVJfU09VUkNFID0gJy4nICsgUFJFUEVORF9FVkVOVF9MSVNURU5FUiArICc6JzsKICAgICAgICAgICAgdmFyIGludm9rZVRhc2sgPSBmdW5jdGlvbiAodGFzaywgdGFyZ2V0LCBldmVudCkgewogICAgICAgICAgICAgICAgLy8gZm9yIGJldHRlciBwZXJmb3JtYW5jZSwgY2hlY2sgaXNSZW1vdmVkIHdoaWNoIGlzIHNldAogICAgICAgICAgICAgICAgLy8gYnkgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgaWYgKHRhc2suaXNSZW1vdmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gdGFzay5jYWxsYmFjazsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVsZWdhdGUgPT09ICdvYmplY3QnICYmIGRlbGVnYXRlLmhhbmRsZUV2ZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIHRoZSBiaW5kIHZlcnNpb24gb2YgaGFuZGxlRXZlbnQgd2hlbiBpbnZva2UKICAgICAgICAgICAgICAgICAgICB0YXNrLmNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7IHJldHVybiBkZWxlZ2F0ZS5oYW5kbGVFdmVudChldmVudCk7IH07CiAgICAgICAgICAgICAgICAgICAgdGFzay5vcmlnaW5hbERlbGVnYXRlID0gZGVsZWdhdGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBpbnZva2Ugc3RhdGljIHRhc2suaW52b2tlCiAgICAgICAgICAgICAgICB0YXNrLmludm9rZSh0YXNrLCB0YXJnZXQsIFtldmVudF0pOwogICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSB0YXNrLm9wdGlvbnM7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ29iamVjdCcgJiYgb3B0aW9ucy5vbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgb3B0aW9ucy5vbmNlIGlzIHRydWUsIGFmdGVyIGludm9rZSBvbmNlIHJlbW92ZSBsaXN0ZW5lciBoZXJlCiAgICAgICAgICAgICAgICAgICAgLy8gb25seSBicm93c2VyIG5lZWQgdG8gZG8gdGhpcywgbm9kZWpzIGV2ZW50RW1pdHRlciB3aWxsIGNhbCByZW1vdmVMaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgIC8vIGluc2lkZSBFdmVudEVtaXR0ZXIub25jZQogICAgICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZV8xID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICB0YXJnZXRbUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRhcmdldCwgZXZlbnQudHlwZSwgZGVsZWdhdGVfMSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIC8vIGdsb2JhbCBzaGFyZWQgem9uZUF3YXJlQ2FsbGJhY2sgdG8gaGFuZGxlIGFsbCBldmVudCBjYWxsYmFjayB3aXRoIGNhcHR1cmUgPSBmYWxzZQogICAgICAgICAgICB2YXIgZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2sgPSBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL3pvbmUuanMvaXNzdWVzLzkxMSwgaW4gSUUsIHNvbWV0aW1lcwogICAgICAgICAgICAgICAgLy8gZXZlbnQgd2lsbCBiZSB1bmRlZmluZWQsIHNvIHdlIG5lZWQgdG8gdXNlIHdpbmRvdy5ldmVudAogICAgICAgICAgICAgICAgZXZlbnQgPSBldmVudCB8fCBfZ2xvYmFsLmV2ZW50OwogICAgICAgICAgICAgICAgaWYgKCFldmVudCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIGV2ZW50LnRhcmdldCBpcyBuZWVkZWQgZm9yIFNhbXN1bmcgVFYgYW5kIFNvdXJjZUJ1ZmZlcgogICAgICAgICAgICAgICAgLy8gfHwgZ2xvYmFsIGlzIG5lZWRlZCBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy8xOTAKICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IGV2ZW50LnRhcmdldCB8fCBfZ2xvYmFsOwogICAgICAgICAgICAgICAgdmFyIHRhc2tzID0gdGFyZ2V0W3pvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnQudHlwZV1bRkFMU0VfU1RSXV07CiAgICAgICAgICAgICAgICBpZiAodGFza3MpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIGNvbmNlcm4sIGlmIHRhc2subGVuZ3RoID09PSAxLCBqdXN0IGludm9rZQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy84MzYKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIHdpbGwgcmVtb3ZlIGl0c2VsZiBvciBvdGhlciBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29weVRhc2tzID0gdGFza3Muc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3B5VGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudFtJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlVGFzayhjb3B5VGFza3NbaV0sIHRhcmdldCwgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICAvLyBnbG9iYWwgc2hhcmVkIHpvbmVBd2FyZUNhbGxiYWNrIHRvIGhhbmRsZSBhbGwgZXZlbnQgY2FsbGJhY2sgd2l0aCBjYXB0dXJlID0gdHJ1ZQogICAgICAgICAgICB2YXIgZ2xvYmFsWm9uZUF3YXJlQ2FwdHVyZUNhbGxiYWNrID0gZnVuY3Rpb24gKGV2ZW50KSB7CiAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy85MTEsIGluIElFLCBzb21ldGltZXMKICAgICAgICAgICAgICAgIC8vIGV2ZW50IHdpbGwgYmUgdW5kZWZpbmVkLCBzbyB3ZSBuZWVkIHRvIHVzZSB3aW5kb3cuZXZlbnQKICAgICAgICAgICAgICAgIGV2ZW50ID0gZXZlbnQgfHwgX2dsb2JhbC5ldmVudDsKICAgICAgICAgICAgICAgIGlmICghZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBldmVudC50YXJnZXQgaXMgbmVlZGVkIGZvciBTYW1zdW5nIFRWIGFuZCBTb3VyY2VCdWZmZXIKICAgICAgICAgICAgICAgIC8vIHx8IGdsb2JhbCBpcyBuZWVkZWQgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvem9uZS5qcy9pc3N1ZXMvMTkwCiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gdGhpcyB8fCBldmVudC50YXJnZXQgfHwgX2dsb2JhbDsKICAgICAgICAgICAgICAgIHZhciB0YXNrcyA9IHRhcmdldFt6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50LnR5cGVdW1RSVUVfU1RSXV07CiAgICAgICAgICAgICAgICBpZiAodGFza3MpIHsKICAgICAgICAgICAgICAgICAgICAvLyBpbnZva2UgYWxsIHRhc2tzIHdoaWNoIGF0dGFjaGVkIHRvIGN1cnJlbnQgdGFyZ2V0IHdpdGggZ2l2ZW4gZXZlbnQudHlwZSBhbmQgY2FwdHVyZSA9IGZhbHNlCiAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHBlcmZvcm1hbmNlIGNvbmNlcm4sIGlmIHRhc2subGVuZ3RoID09PSAxLCBqdXN0IGludm9rZQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrcy5sZW5ndGggPT09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlVGFzayh0YXNrc1swXSwgdGFyZ2V0LCBldmVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci96b25lLmpzL2lzc3Vlcy84MzYKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSB0aGUgdGFza3MgYXJyYXkgYmVmb3JlIGludm9rZSwgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGNhbGxiYWNrIHdpbGwgcmVtb3ZlIGl0c2VsZiBvciBvdGhlciBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY29weVRhc2tzID0gdGFza3Muc2xpY2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb3B5VGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudFtJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW52b2tlVGFzayhjb3B5VGFza3NbaV0sIHRhcmdldCwgZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9OwogICAgICAgICAgICBmdW5jdGlvbiBwYXRjaEV2ZW50VGFyZ2V0TWV0aG9kcyhvYmosIHBhdGNoT3B0aW9ucykgewogICAgICAgICAgICAgICAgaWYgKCFvYmopIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgdXNlR2xvYmFsQ2FsbGJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudXNlRyAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdXNlR2xvYmFsQ2FsbGJhY2sgPSBwYXRjaE9wdGlvbnMudXNlRzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciB2YWxpZGF0ZUhhbmRsZXIgPSBwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLnZoOwogICAgICAgICAgICAgICAgdmFyIGNoZWNrRHVwbGljYXRlID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmIChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLmNoa0R1cCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tEdXBsaWNhdGUgPSBwYXRjaE9wdGlvbnMuY2hrRHVwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIHJldHVyblRhcmdldCA9IGZhbHNlOwogICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucnQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVyblRhcmdldCA9IHBhdGNoT3B0aW9ucy5ydDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBwcm90byA9IG9iajsKICAgICAgICAgICAgICAgIHdoaWxlIChwcm90byAmJiAhcHJvdG8uaGFzT3duUHJvcGVydHkoQUREX0VWRU5UX0xJU1RFTkVSKSkgewogICAgICAgICAgICAgICAgICAgIHByb3RvID0gT2JqZWN0R2V0UHJvdG90eXBlT2YocHJvdG8pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKCFwcm90byAmJiBvYmpbQUREX0VWRU5UX0xJU1RFTkVSXSkgewogICAgICAgICAgICAgICAgICAgIC8vIHNvbWVob3cgd2UgZGlkIG5vdCBmaW5kIGl0LCBidXQgd2UgY2FuIHNlZSBpdC4gVGhpcyBoYXBwZW5zIG9uIElFIGZvciBXaW5kb3cgcHJvcGVydGllcy4KICAgICAgICAgICAgICAgICAgICBwcm90byA9IG9iajsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghcHJvdG8pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocHJvdG9bem9uZVN5bWJvbEFkZEV2ZW50TGlzdGVuZXJdKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZVRvU3RyaW5nID0gcGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy5ldmVudE5hbWVUb1N0cmluZzsKICAgICAgICAgICAgICAgIC8vIGEgc2hhcmVkIGdsb2JhbCB0YXNrRGF0YSB0byBwYXNzIGRhdGEgZm9yIHNjaGVkdWxlRXZlbnRUYXNrCiAgICAgICAgICAgICAgICAvLyBzbyB3ZSBkbyBub3QgbmVlZCB0byBjcmVhdGUgYSBuZXcgb2JqZWN0IGp1c3QgZm9yIHBhc3Mgc29tZSBkYXRhCiAgICAgICAgICAgICAgICB2YXIgdGFza0RhdGEgPSB7fTsKICAgICAgICAgICAgICAgIHZhciBuYXRpdmVBZGRFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbEFkZEV2ZW50TGlzdGVuZXJdID0gcHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgIHZhciBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChSRU1PVkVfRVZFTlRfTElTVEVORVIpXSA9CiAgICAgICAgICAgICAgICAgICAgcHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgIHZhciBuYXRpdmVMaXN0ZW5lcnMgPSBwcm90b1t6b25lU3ltYm9sKExJU1RFTkVSU19FVkVOVF9MSVNURU5FUildID0KICAgICAgICAgICAgICAgICAgICBwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdOwogICAgICAgICAgICAgICAgdmFyIG5hdGl2ZVJlbW92ZUFsbExpc3RlbmVycyA9IHByb3RvW3pvbmVTeW1ib2woUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVIpXSA9CiAgICAgICAgICAgICAgICAgICAgcHJvdG9bUkVNT1ZFX0FMTF9MSVNURU5FUlNfRVZFTlRfTElTVEVORVJdOwogICAgICAgICAgICAgICAgdmFyIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyOwogICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMucHJlcGVuZCkgewogICAgICAgICAgICAgICAgICAgIG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyID0gcHJvdG9bem9uZVN5bWJvbChwYXRjaE9wdGlvbnMucHJlcGVuZCldID0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9bcGF0Y2hPcHRpb25zLnByZXBlbmRdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBUaGlzIHV0aWwgZnVuY3Rpb24gd2lsbCBidWlsZCBhbiBvcHRpb24gb2JqZWN0IHdpdGggcGFzc2l2ZSBvcHRpb24KICAgICAgICAgICAgICAgICAqIHRvIGhhbmRsZSBhbGwgcG9zc2libGUgaW5wdXQgZnJvbSB0aGUgdXNlci4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZnVuY3Rpb24gYnVpbGRFdmVudExpc3RlbmVyT3B0aW9ucyhvcHRpb25zLCBwYXNzaXZlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXNzaXZlU3VwcG9ydGVkICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBwYXNzaXZlIGJ1dCB1c2VyIHdhbnQgdG8gcGFzcyBhbiBvYmplY3QgYXMgb3B0aW9ucy4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIG5vdCB3b3JrIG9uIHNvbWUgb2xkIGJyb3dzZXIsIHNvIHdlIGp1c3QgcGFzcyBhIGJvb2xlYW4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXMgdXNlQ2FwdHVyZSBwYXJhbWV0ZXIKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhb3B0aW9ucy5jYXB0dXJlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIXBhc3NpdmVTdXBwb3J0ZWQgfHwgIXBhc3NpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGNhcHR1cmU6IG9wdGlvbnMsIHBhc3NpdmU6IHRydWUgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKCFvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHBhc3NpdmU6IHRydWUgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyAmJiBvcHRpb25zLnBhc3NpdmUgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMpLCB7IHBhc3NpdmU6IHRydWUgfSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIGN1c3RvbVNjaGVkdWxlR2xvYmFsID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGVyZSBpcyBhbHJlYWR5IGEgdGFzayBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUsCiAgICAgICAgICAgICAgICAgICAgLy8ganVzdCByZXR1cm4sIGJlY2F1c2Ugd2UgdXNlIHRoZSBzaGFyZWQgZ2xvYmFsWm9uZUF3YXJlQ2FsbGJhY2sgaGVyZS4KICAgICAgICAgICAgICAgICAgICBpZiAodGFza0RhdGEuaXNFeGlzdGluZykgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVBZGRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2tEYXRhLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFza0RhdGEub3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgdmFyIGN1c3RvbUNhbmNlbEdsb2JhbCA9IGZ1bmN0aW9uICh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGFzayBpcyBub3QgbWFya2VkIGFzIGlzUmVtb3ZlZCwgdGhpcyBjYWxsIGlzIGRpcmVjdGx5CiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBab25lLnByb3RvdHlwZS5jYW5jZWxUYXNrLCB3ZSBzaG91bGQgcmVtb3ZlIHRoZSB0YXNrCiAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSB0YXNrc0xpc3Qgb2YgdGFyZ2V0IGZpcnN0CiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXNrLmlzUmVtb3ZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbdGFzay5ldmVudE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lID0gdm9pZCAwOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1t0YXNrLmNhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nVGFza3MgPSBzeW1ib2xFdmVudE5hbWUgJiYgdGFzay50YXJnZXRbc3ltYm9sRXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Rhc2sgPSBleGlzdGluZ1Rhc2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2sgPT09IHRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldCBpc1JlbW92ZWQgdG8gZGF0YSBmb3IgZmFzdGVyIGludm9rZVRhc2sgY2hlY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pc1JlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXhpc3RpbmdUYXNrcy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbCB0YXNrcyBmb3IgdGhlIGV2ZW50TmFtZSArIGNhcHR1cmUgaGF2ZSBnb25lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suYWxsUmVtb3ZlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnRhcmdldFtzeW1ib2xFdmVudE5hbWVdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWxsIHRhc2tzIGZvciB0aGUgZXZlbnROYW1lICsgY2FwdHVyZSBoYXZlIGdvbmUsCiAgICAgICAgICAgICAgICAgICAgLy8gd2Ugd2lsbCByZWFsbHkgcmVtb3ZlIHRoZSBnbG9iYWwgZXZlbnQgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm90LCByZXR1cm4KICAgICAgICAgICAgICAgICAgICBpZiAoIXRhc2suYWxsUmVtb3ZlZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmNhcHR1cmUgPyBnbG9iYWxab25lQXdhcmVDYXB0dXJlQ2FsbGJhY2sgOiBnbG9iYWxab25lQXdhcmVDYWxsYmFjaywgdGFzay5vcHRpb25zKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGVOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVBZGRFdmVudExpc3RlbmVyLmNhbGwodGFza0RhdGEudGFyZ2V0LCB0YXNrRGF0YS5ldmVudE5hbWUsIHRhc2suaW52b2tlLCB0YXNrRGF0YS5vcHRpb25zKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGVQcmVwZW5kID0gZnVuY3Rpb24gKHRhc2spIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlUHJlcGVuZEV2ZW50TGlzdGVuZXIuY2FsbCh0YXNrRGF0YS50YXJnZXQsIHRhc2tEYXRhLmV2ZW50TmFtZSwgdGFzay5pbnZva2UsIHRhc2tEYXRhLm9wdGlvbnMpOwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHZhciBjdXN0b21DYW5jZWxOb25HbG9iYWwgPSBmdW5jdGlvbiAodGFzaykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVSZW1vdmVFdmVudExpc3RlbmVyLmNhbGwodGFzay50YXJnZXQsIHRhc2suZXZlbnROYW1lLCB0YXNrLmludm9rZSwgdGFzay5vcHRpb25zKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgY3VzdG9tU2NoZWR1bGUgPSB1c2VHbG9iYWxDYWxsYmFjayA/IGN1c3RvbVNjaGVkdWxlR2xvYmFsIDogY3VzdG9tU2NoZWR1bGVOb25HbG9iYWw7CiAgICAgICAgICAgICAgICB2YXIgY3VzdG9tQ2FuY2VsID0gdXNlR2xvYmFsQ2FsbGJhY2sgPyBjdXN0b21DYW5jZWxHbG9iYWwgOiBjdXN0b21DYW5jZWxOb25HbG9iYWw7CiAgICAgICAgICAgICAgICB2YXIgY29tcGFyZVRhc2tDYWxsYmFja1ZzRGVsZWdhdGUgPSBmdW5jdGlvbiAodGFzaywgZGVsZWdhdGUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgdHlwZU9mRGVsZWdhdGUgPSB0eXBlb2YgZGVsZWdhdGU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh0eXBlT2ZEZWxlZ2F0ZSA9PT0gJ2Z1bmN0aW9uJyAmJiB0YXNrLmNhbGxiYWNrID09PSBkZWxlZ2F0ZSkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGVPZkRlbGVnYXRlID09PSAnb2JqZWN0JyAmJiB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPT09IGRlbGVnYXRlKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB2YXIgY29tcGFyZSA9IChwYXRjaE9wdGlvbnMgJiYgcGF0Y2hPcHRpb25zLmRpZmYpID8gcGF0Y2hPcHRpb25zLmRpZmYgOiBjb21wYXJlVGFza0NhbGxiYWNrVnNEZWxlZ2F0ZTsKICAgICAgICAgICAgICAgIHZhciBibGFja0xpc3RlZEV2ZW50cyA9IFpvbmVbem9uZVN5bWJvbCgnQkxBQ0tfTElTVEVEX0VWRU5UUycpXTsKICAgICAgICAgICAgICAgIHZhciBwYXNzaXZlRXZlbnRzID0gX2dsb2JhbFt6b25lU3ltYm9sKCdQQVNTSVZFX0VWRU5UUycpXTsKICAgICAgICAgICAgICAgIHZhciBtYWtlQWRkTGlzdGVuZXIgPSBmdW5jdGlvbiAobmF0aXZlTGlzdGVuZXIsIGFkZFNvdXJjZSwgY3VzdG9tU2NoZWR1bGVGbiwgY3VzdG9tQ2FuY2VsRm4sIHJldHVyblRhcmdldCwgcHJlcGVuZCkgewogICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQgPT09IHZvaWQgMCkgeyByZXR1cm5UYXJnZXQgPSBmYWxzZTsgfQogICAgICAgICAgICAgICAgICAgIGlmIChwcmVwZW5kID09PSB2b2lkIDApIHsgcHJlcGVuZCA9IGZhbHNlOyB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uICgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IGFyZ3VtZW50c1sxXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFkZWxlZ2F0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzTm9kZSAmJiBldmVudE5hbWUgPT09ICd1bmNhdWdodEV4Y2VwdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IHBhdGNoIHVuY2F1Z2h0RXhjZXB0aW9uIG9mIG5vZGVqcyB0byBwcmV2ZW50IGVuZGxlc3MgbG9vcAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZUxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3QgY3JlYXRlIHRoZSBiaW5kIGRlbGVnYXRlIGZ1bmN0aW9uIGZvciBoYW5kbGVFdmVudAogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXNlIGhlcmUgdG8gaW1wcm92ZSBhZGRFdmVudExpc3RlbmVyIHBlcmZvcm1hbmNlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgY3JlYXRlIHRoZSBiaW5kIGRlbGVnYXRlIHdoZW4gaW52b2tlCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0hhbmRsZUV2ZW50ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZGVsZWdhdGUgIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVsZWdhdGUuaGFuZGxlRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzSGFuZGxlRXZlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZGF0ZUhhbmRsZXIgJiYgIXZhbGlkYXRlSGFuZGxlcihuYXRpdmVMaXN0ZW5lciwgZGVsZWdhdGUsIHRhcmdldCwgYXJndW1lbnRzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwYXNzaXZlID0gcGFzc2l2ZVN1cHBvcnRlZCAmJiAhIXBhc3NpdmVFdmVudHMgJiYgcGFzc2l2ZUV2ZW50cy5pbmRleE9mKGV2ZW50TmFtZSkgIT09IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgb3B0aW9ucyA9IGJ1aWxkRXZlbnRMaXN0ZW5lck9wdGlvbnMoYXJndW1lbnRzWzJdLCBwYXNzaXZlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJsYWNrTGlzdGVkRXZlbnRzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayBibGFjayBsaXN0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJsYWNrTGlzdGVkRXZlbnRzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSA9PT0gYmxhY2tMaXN0ZWRFdmVudHNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhc3NpdmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmF0aXZlTGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB2YXIgY2FwdHVyZSA9ICFvcHRpb25zID8gZmFsc2UgOiB0eXBlb2Ygb3B0aW9ucyA9PT0gJ2Jvb2xlYW4nID8gdHJ1ZSA6IG9wdGlvbnMuY2FwdHVyZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9uY2UgPSBvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zID09PSAnb2JqZWN0JyA/IG9wdGlvbnMub25jZSA6IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgem9uZSA9IFpvbmUuY3VycmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbEV2ZW50TmFtZXMgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3ltYm9sRXZlbnROYW1lcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlcGFyZUV2ZW50TmFtZXMoZXZlbnROYW1lLCBldmVudE5hbWVUb1N0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWUgPSBzeW1ib2xFdmVudE5hbWVzW2NhcHR1cmUgPyBUUlVFX1NUUiA6IEZBTFNFX1NUUl07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBleGlzdGluZ1Rhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpc0V4aXN0aW5nID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHJlYWR5IGhhdmUgdGFzayByZWdpc3RlcmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0V4aXN0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjaGVja0R1cGxpY2F0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXhpc3RpbmdUYXNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGFyZShleGlzdGluZ1Rhc2tzW2ldLCBkZWxlZ2F0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgY2FsbGJhY2ssIHNhbWUgY2FwdHVyZSwgc2FtZSBldmVudCBuYW1lLCBqdXN0IHJldHVybgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcyA9IHRhcmdldFtzeW1ib2xFdmVudE5hbWVdID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNvdXJjZTsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnN0cnVjdG9yTmFtZSA9IHRhcmdldC5jb25zdHJ1Y3RvclsnbmFtZSddOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0U291cmNlID0gZ2xvYmFsU291cmNlc1tjb25zdHJ1Y3Rvck5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0U291cmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPSB0YXJnZXRTb3VyY2VbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNvdXJjZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gY29uc3RydWN0b3JOYW1lICsgYWRkU291cmNlICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgY3JlYXRlIGEgbmV3IG9iamVjdCBhcyB0YXNrLmRhdGEgdG8gcGFzcyB0aG9zZSB0aGluZ3MKICAgICAgICAgICAgICAgICAgICAgICAgLy8ganVzdCB1c2UgdGhlIGdsb2JhbCBzaGFyZWQgb25lCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAob25jZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYWRkRXZlbnRMaXN0ZW5lciB3aXRoIG9uY2Ugb3B0aW9ucywgd2UgZG9uJ3QgcGFzcyBpdCB0bwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmF0aXZlIGFkZEV2ZW50TGlzdGVuZXIsIGluc3RlYWQgd2Uga2VlcCB0aGUgb25jZSBzZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgaGFuZGxlIG91cnNlbHZlcy4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLm9wdGlvbnMub25jZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLnRhcmdldCA9IHRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEuY2FwdHVyZSA9IGNhcHR1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tEYXRhLmV2ZW50TmFtZSA9IGV2ZW50TmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEuaXNFeGlzdGluZyA9IGlzRXhpc3Rpbmc7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkYXRhID0gdXNlR2xvYmFsQ2FsbGJhY2sgPyBPUFRJTUlaRURfWk9ORV9FVkVOVF9UQVNLX0RBVEEgOiB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXAgdGFza0RhdGEgaW50byBkYXRhIHRvIGFsbG93IG9uU2NoZWR1bGVFdmVudFRhc2sgdG8gYWNjZXNzIHRoZSB0YXNrIGluZm9ybWF0aW9uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLnRhc2tEYXRhID0gdGFza0RhdGE7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSB6b25lLnNjaGVkdWxlRXZlbnRUYXNrKHNvdXJjZSwgZGVsZWdhdGUsIGRhdGEsIGN1c3RvbVNjaGVkdWxlRm4sIGN1c3RvbUNhbmNlbEZuKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2hvdWxkIGNsZWFyIHRhc2tEYXRhLnRhcmdldCB0byBhdm9pZCBtZW1vcnkgbGVhawogICAgICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZSwgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjA0NDIKICAgICAgICAgICAgICAgICAgICAgICAgdGFza0RhdGEudGFyZ2V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBjbGVhciB1cCB0YXNrRGF0YSBiZWNhdXNlIGl0IGlzIGEgZ2xvYmFsIG9iamVjdAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGF0YSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50YXNrRGF0YSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBzYXZlIHRob3NlIGluZm9ybWF0aW9uIHRvIHRhc2sgaW4gY2FzZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBhcHBsaWNhdGlvbiBtYXkgY2FsbCB0YXNrLnpvbmUuY2FuY2VsVGFzaygpIGRpcmVjdGx5CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zLm9uY2UgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKCFwYXNzaXZlU3VwcG9ydGVkICYmIHR5cGVvZiB0YXNrLm9wdGlvbnMgPT09ICdib29sZWFuJykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIG5vdCBzdXBwb3J0IHBhc3NpdmUsIGFuZCB3ZSBwYXNzIGFuIG9wdGlvbiBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGFkZEV2ZW50TGlzdGVuZXIsIHdlIHNob3VsZCBzYXZlIHRoZSBvcHRpb25zIHRvIHRhc2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgdGFzay50YXJnZXQgPSB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suY2FwdHVyZSA9IGNhcHR1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suZXZlbnROYW1lID0gZXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNIYW5kbGVFdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBvcmlnaW5hbCBkZWxlZ2F0ZSBmb3IgY29tcGFyZSB0byBjaGVjayBkdXBsaWNhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJlcGVuZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5wdXNoKHRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy51bnNoaWZ0KHRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIHByb3RvW0FERF9FVkVOVF9MSVNURU5FUl0gPSBtYWtlQWRkTGlzdGVuZXIobmF0aXZlQWRkRXZlbnRMaXN0ZW5lciwgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSwgY3VzdG9tU2NoZWR1bGUsIGN1c3RvbUNhbmNlbCwgcmV0dXJuVGFyZ2V0KTsKICAgICAgICAgICAgICAgIGlmIChuYXRpdmVQcmVwZW5kRXZlbnRMaXN0ZW5lcikgewogICAgICAgICAgICAgICAgICAgIHByb3RvW1BSRVBFTkRfRVZFTlRfTElTVEVORVJdID0gbWFrZUFkZExpc3RlbmVyKG5hdGl2ZVByZXBlbmRFdmVudExpc3RlbmVyLCBQUkVQRU5EX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSwgY3VzdG9tU2NoZWR1bGVQcmVwZW5kLCBjdXN0b21DYW5jZWwsIHJldHVyblRhcmdldCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwcm90b1tSRU1PVkVfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIG9wdGlvbnMgPSBhcmd1bWVudHNbMl07CiAgICAgICAgICAgICAgICAgICAgdmFyIGNhcHR1cmUgPSAhb3B0aW9ucyA/IGZhbHNlIDogdHlwZW9mIG9wdGlvbnMgPT09ICdib29sZWFuJyA/IHRydWUgOiBvcHRpb25zLmNhcHR1cmU7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gYXJndW1lbnRzWzFdOwogICAgICAgICAgICAgICAgICAgIGlmICghZGVsZWdhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkYXRlSGFuZGxlciAmJgogICAgICAgICAgICAgICAgICAgICAgICAhdmFsaWRhdGVIYW5kbGVyKG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIsIGRlbGVnYXRlLCB0YXJnZXQsIGFyZ3VtZW50cykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lcyA9IHpvbmVTeW1ib2xFdmVudE5hbWVzJDFbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICB2YXIgc3ltYm9sRXZlbnROYW1lOwogICAgICAgICAgICAgICAgICAgIGlmIChzeW1ib2xFdmVudE5hbWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbY2FwdHVyZSA/IFRSVUVfU1RSIDogRkFMU0VfU1RSXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGV4aXN0aW5nVGFza3MgPSBzeW1ib2xFdmVudE5hbWUgJiYgdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVGFza3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBleGlzdGluZ1Rhc2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXhpc3RpbmdUYXNrID0gZXhpc3RpbmdUYXNrc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wYXJlKGV4aXN0aW5nVGFzaywgZGVsZWdhdGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGlzUmVtb3ZlZCB0byBkYXRhIGZvciBmYXN0ZXIgaW52b2tlVGFzayBjaGVjawogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nVGFzay5pc1JlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZ1Rhc2tzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGwgdGFza3MgZm9yIHRoZSBldmVudE5hbWUgKyBjYXB0dXJlIGhhdmUgZ29uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGdsb2JhbFpvbmVBd2FyZUNhbGxiYWNrIGFuZCByZW1vdmUgdGhlIHRhc2sgY2FjaGUgZnJvbSB0YXJnZXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLmFsbFJlbW92ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSB0YXJnZXQsIHdlIGhhdmUgYW4gZXZlbnQgbGlzdGVuZXIgd2hpY2ggaXMgYWRkZWQgYnkgb25fcHJvcGVydHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VjaCBhcyB0YXJnZXQub25jbGljayA9IGZ1bmN0aW9uKCkge30sIHNvIHdlIG5lZWQgdG8gY2xlYXIgdGhpcyBpbnRlcm5hbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm9wZXJ0eSB0b28gaWYgYWxsIGRlbGVnYXRlcyBhbGwgcmVtb3ZlZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGV2ZW50TmFtZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvblByb3BlcnR5U3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgJ09OX1BST1BFUlRZJyArIGV2ZW50TmFtZTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtvblByb3BlcnR5U3ltYm9sXSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdUYXNrLnpvbmUuY2FuY2VsVGFzayhleGlzdGluZ1Rhc2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXR1cm5UYXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRhcmdldDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGlzc3VlIDkzMCwgZGlkbid0IGZpbmQgdGhlIGV2ZW50IG5hbWUgb3IgY2FsbGJhY2sKICAgICAgICAgICAgICAgICAgICAvLyBmcm9tIHpvbmUga2VwdCBleGlzdGluZ1Rhc2tzLCB0aGUgY2FsbGJhY2sgbWF5YmUKICAgICAgICAgICAgICAgICAgICAvLyBhZGRlZCBvdXRzaWRlIG9mIHpvbmUsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgIC8vIHRvIHRyeSB0byByZW1vdmUgaXQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hdGl2ZVJlbW92ZUV2ZW50TGlzdGVuZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBwcm90b1tMSVNURU5FUlNfRVZFTlRfTElTVEVORVJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB0aGlzIHx8IF9nbG9iYWw7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGFyZ3VtZW50c1swXTsKICAgICAgICAgICAgICAgICAgICBpZiAocGF0Y2hPcHRpb25zICYmIHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBldmVudE5hbWUgPSBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUoZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdmFyIGxpc3RlbmVycyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHZhciB0YXNrcyA9IGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lVG9TdHJpbmcgPyBldmVudE5hbWVUb1N0cmluZyhldmVudE5hbWUpIDogZXZlbnROYW1lKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gdGFza3NbaV07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWxlZ2F0ZSA9IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA/IHRhc2sub3JpZ2luYWxEZWxlZ2F0ZSA6IHRhc2suY2FsbGJhY2s7CiAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVycy5wdXNoKGRlbGVnYXRlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyczsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICBwcm90b1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXMgfHwgX2dsb2JhbDsKICAgICAgICAgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gYXJndW1lbnRzWzBdOwogICAgICAgICAgICAgICAgICAgIGlmICghZXZlbnROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBrZXlzID0gT2JqZWN0LmtleXModGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBrZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvcCA9IGtleXNbaV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZXZ0TmFtZSA9IG1hdGNoICYmIG1hdGNoWzFdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gbm9kZWpzIEV2ZW50RW1pdHRlciwgcmVtb3ZlTGlzdGVuZXIgZXZlbnQgaXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZWQgZm9yIG1vbml0b3JpbmcgdGhlIHJlbW92ZUxpc3RlbmVyIGNhbGwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzbyBqdXN0IGtlZXAgcmVtb3ZlTGlzdGVuZXIgZXZlbnRMaXN0ZW5lciB1bnRpbAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsIG90aGVyIGV2ZW50TGlzdGVuZXJzIGFyZSByZW1vdmVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0TmFtZSAmJiBldnROYW1lICE9PSAncmVtb3ZlTGlzdGVuZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfQUxMX0xJU1RFTkVSU19FVkVOVF9MSVNURU5FUl0uY2FsbCh0aGlzLCBldnROYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVtb3ZlTGlzdGVuZXIgbGlzdGVuZXIgZmluYWxseQogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXS5jYWxsKHRoaXMsICdyZW1vdmVMaXN0ZW5lcicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoT3B0aW9ucyAmJiBwYXRjaE9wdGlvbnMudHJhbnNmZXJFdmVudE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50TmFtZSA9IHBhdGNoT3B0aW9ucy50cmFuc2ZlckV2ZW50TmFtZShldmVudE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWVzID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ltYm9sRXZlbnROYW1lcykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN5bWJvbEV2ZW50TmFtZSA9IHN5bWJvbEV2ZW50TmFtZXNbRkFMU0VfU1RSXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzeW1ib2xDYXB0dXJlRXZlbnROYW1lID0gc3ltYm9sRXZlbnROYW1lc1tUUlVFX1NUUl07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFza3MgPSB0YXJnZXRbc3ltYm9sRXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjYXB0dXJlVGFza3MgPSB0YXJnZXRbc3ltYm9sQ2FwdHVyZUV2ZW50TmFtZV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFza3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgcmVtb3ZlVGFza3MgPSB0YXNrcy5zbGljZSgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVtb3ZlVGFza3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSByZW1vdmVUYXNrc1tpXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlbGVnYXRlID0gdGFzay5vcmlnaW5hbERlbGVnYXRlID8gdGFzay5vcmlnaW5hbERlbGVnYXRlIDogdGFzay5jYWxsYmFjazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpc1tSRU1PVkVfRVZFTlRfTElTVEVORVJdLmNhbGwodGhpcywgZXZlbnROYW1lLCBkZWxlZ2F0ZSwgdGFzay5vcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2FwdHVyZVRhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHJlbW92ZVRhc2tzID0gY2FwdHVyZVRhc2tzLnNsaWNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZW1vdmVUYXNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGFzayA9IHJlbW92ZVRhc2tzW2ldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsZWdhdGUgPSB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgPyB0YXNrLm9yaWdpbmFsRGVsZWdhdGUgOiB0YXNrLmNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzW1JFTU9WRV9FVkVOVF9MSVNURU5FUl0uY2FsbCh0aGlzLCBldmVudE5hbWUsIGRlbGVnYXRlLCB0YXNrLm9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAocmV0dXJuVGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAvLyBmb3IgbmF0aXZlIHRvU3RyaW5nIHBhdGNoCiAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bQUREX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlQWRkRXZlbnRMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bUkVNT1ZFX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlRXZlbnRMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICBpZiAobmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgYXR0YWNoT3JpZ2luVG9QYXRjaGVkKHByb3RvW1JFTU9WRV9BTExfTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlUmVtb3ZlQWxsTGlzdGVuZXJzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChuYXRpdmVMaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgICAgICBhdHRhY2hPcmlnaW5Ub1BhdGNoZWQocHJvdG9bTElTVEVORVJTX0VWRU5UX0xJU1RFTkVSXSwgbmF0aXZlTGlzdGVuZXJzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciByZXN1bHRzID0gW107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXBpcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgcmVzdWx0c1tpXSA9IHBhdGNoRXZlbnRUYXJnZXRNZXRob2RzKGFwaXNbaV0sIHBhdGNoT3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGZpbmRFdmVudFRhc2tzKHRhcmdldCwgZXZlbnROYW1lKSB7CiAgICAgICAgICAgIGlmICghZXZlbnROYW1lKSB7CiAgICAgICAgICAgICAgICB2YXIgZm91bmRUYXNrcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yICh2YXIgcHJvcCBpbiB0YXJnZXQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgbWF0Y2ggPSBFVkVOVF9OQU1FX1NZTUJPTF9SRUdYLmV4ZWMocHJvcCk7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2dE5hbWUgPSBtYXRjaCAmJiBtYXRjaFsxXTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXZ0TmFtZSAmJiAoIWV2ZW50TmFtZSB8fCBldnROYW1lID09PSBldmVudE5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrcyA9IHRhcmdldFtwcm9wXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2tzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRhc2tzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRUYXNrcy5wdXNoKHRhc2tzW2ldKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZFRhc2tzOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBzeW1ib2xFdmVudE5hbWUgPSB6b25lU3ltYm9sRXZlbnROYW1lcyQxW2V2ZW50TmFtZV07CiAgICAgICAgICAgIGlmICghc3ltYm9sRXZlbnROYW1lKSB7CiAgICAgICAgICAgICAgICBwcmVwYXJlRXZlbnROYW1lcyhldmVudE5hbWUpOwogICAgICAgICAgICAgICAgc3ltYm9sRXZlbnROYW1lID0gem9uZVN5bWJvbEV2ZW50TmFtZXMkMVtldmVudE5hbWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjYXB0dXJlRmFsc2VUYXNrcyA9IHRhcmdldFtzeW1ib2xFdmVudE5hbWVbRkFMU0VfU1RSXV07CiAgICAgICAgICAgIHZhciBjYXB0dXJlVHJ1ZVRhc2tzID0gdGFyZ2V0W3N5bWJvbEV2ZW50TmFtZVtUUlVFX1NUUl1dOwogICAgICAgICAgICBpZiAoIWNhcHR1cmVGYWxzZVRhc2tzKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FwdHVyZVRydWVUYXNrcyA/IGNhcHR1cmVUcnVlVGFza3Muc2xpY2UoKSA6IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGNhcHR1cmVUcnVlVGFza3MgPyBjYXB0dXJlRmFsc2VUYXNrcy5jb25jYXQoY2FwdHVyZVRydWVUYXNrcykgOgogICAgICAgICAgICAgICAgICAgIGNhcHR1cmVGYWxzZVRhc2tzLnNsaWNlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gcGF0Y2hFdmVudFByb3RvdHlwZShnbG9iYWwsIGFwaSkgewogICAgICAgICAgICB2YXIgRXZlbnQgPSBnbG9iYWxbJ0V2ZW50J107CiAgICAgICAgICAgIGlmIChFdmVudCAmJiBFdmVudC5wcm90b3R5cGUpIHsKICAgICAgICAgICAgICAgIGFwaS5wYXRjaE1ldGhvZChFdmVudC5wcm90b3R5cGUsICdzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24nLCBmdW5jdGlvbiAoZGVsZWdhdGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgc2VsZltJTU1FRElBVEVfUFJPUEFHQVRJT05fU1lNQk9MXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBjYWxsIHRoZSBuYXRpdmUgc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uCiAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSBpbiBzb21lIGh5YnJpZCBhcHBsaWNhdGlvbiwgc29tZSBwYXJ0IG9mCiAgICAgICAgICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gd2lsbCBiZSBjb250cm9sbGVkIGJ5IHpvbmUsIHNvbWUgYXJlIG5vdAogICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlICYmIGRlbGVnYXRlLmFwcGx5KHNlbGYsIGFyZ3MpOwogICAgICAgICAgICAgICAgfTsgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIHBhdGNoQ2FsbGJhY2tzKGFwaSwgdGFyZ2V0LCB0YXJnZXROYW1lLCBtZXRob2QsIGNhbGxiYWNrcykgewogICAgICAgICAgICB2YXIgc3ltYm9sID0gWm9uZS5fX3N5bWJvbF9fKG1ldGhvZCk7CiAgICAgICAgICAgIGlmICh0YXJnZXRbc3ltYm9sXSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBuYXRpdmVEZWxlZ2F0ZSA9IHRhcmdldFtzeW1ib2xdID0gdGFyZ2V0W21ldGhvZF07CiAgICAgICAgICAgIHRhcmdldFttZXRob2RdID0gZnVuY3Rpb24gKG5hbWUsIG9wdHMsIG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgIGlmIChvcHRzICYmIG9wdHMucHJvdG90eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzLmZvckVhY2goZnVuY3Rpb24gKGNhbGxiYWNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzb3VyY2UgPSB0YXJnZXROYW1lICsgIi4iICsgbWV0aG9kICsgIjo6IiArIGNhbGxiYWNrOwogICAgICAgICAgICAgICAgICAgICAgICB2YXIgcHJvdG90eXBlID0gb3B0cy5wcm90b3R5cGU7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm90b3R5cGUuaGFzT3duUHJvcGVydHkoY2FsbGJhY2spKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IocHJvdG90eXBlLCBjYWxsYmFjayk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAmJiBkZXNjcmlwdG9yLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci52YWx1ZSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKGRlc2NyaXB0b3IudmFsdWUsIHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXBpLl9yZWRlZmluZVByb3BlcnR5KG9wdHMucHJvdG90eXBlLCBjYWxsYmFjaywgZGVzY3JpcHRvcik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm90b3R5cGVbY2FsbGJhY2tdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlW2NhbGxiYWNrXSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKHByb3RvdHlwZVtjYWxsYmFja10sIHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAocHJvdG90eXBlW2NhbGxiYWNrXSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG90eXBlW2NhbGxiYWNrXSA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKHByb3RvdHlwZVtjYWxsYmFja10sIHNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBuYXRpdmVEZWxlZ2F0ZS5jYWxsKHRhcmdldCwgbmFtZSwgb3B0cywgb3B0aW9ucyk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGFwaS5hdHRhY2hPcmlnaW5Ub1BhdGNoZWQodGFyZ2V0W21ldGhvZF0sIG5hdGl2ZURlbGVnYXRlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIHZhciBnbG9iYWxFdmVudEhhbmRsZXJzRXZlbnROYW1lcyA9IFsKICAgICAgICAgICAgJ2Fib3J0JywKICAgICAgICAgICAgJ2FuaW1hdGlvbmNhbmNlbCcsCiAgICAgICAgICAgICdhbmltYXRpb25lbmQnLAogICAgICAgICAgICAnYW5pbWF0aW9uaXRlcmF0aW9uJywKICAgICAgICAgICAgJ2F1eGNsaWNrJywKICAgICAgICAgICAgJ2JlZm9yZWlucHV0JywKICAgICAgICAgICAgJ2JsdXInLAogICAgICAgICAgICAnY2FuY2VsJywKICAgICAgICAgICAgJ2NhbnBsYXknLAogICAgICAgICAgICAnY2FucGxheXRocm91Z2gnLAogICAgICAgICAgICAnY2hhbmdlJywKICAgICAgICAgICAgJ2NvbXBvc2l0aW9uc3RhcnQnLAogICAgICAgICAgICAnY29tcG9zaXRpb251cGRhdGUnLAogICAgICAgICAgICAnY29tcG9zaXRpb25lbmQnLAogICAgICAgICAgICAnY3VlY2hhbmdlJywKICAgICAgICAgICAgJ2NsaWNrJywKICAgICAgICAgICAgJ2Nsb3NlJywKICAgICAgICAgICAgJ2NvbnRleHRtZW51JywKICAgICAgICAgICAgJ2N1cmVjaGFuZ2UnLAogICAgICAgICAgICAnZGJsY2xpY2snLAogICAgICAgICAgICAnZHJhZycsCiAgICAgICAgICAgICdkcmFnZW5kJywKICAgICAgICAgICAgJ2RyYWdlbnRlcicsCiAgICAgICAgICAgICdkcmFnZXhpdCcsCiAgICAgICAgICAgICdkcmFnbGVhdmUnLAogICAgICAgICAgICAnZHJhZ292ZXInLAogICAgICAgICAgICAnZHJvcCcsCiAgICAgICAgICAgICdkdXJhdGlvbmNoYW5nZScsCiAgICAgICAgICAgICdlbXB0aWVkJywKICAgICAgICAgICAgJ2VuZGVkJywKICAgICAgICAgICAgJ2Vycm9yJywKICAgICAgICAgICAgJ2ZvY3VzJywKICAgICAgICAgICAgJ2ZvY3VzaW4nLAogICAgICAgICAgICAnZm9jdXNvdXQnLAogICAgICAgICAgICAnZ290cG9pbnRlcmNhcHR1cmUnLAogICAgICAgICAgICAnaW5wdXQnLAogICAgICAgICAgICAnaW52YWxpZCcsCiAgICAgICAgICAgICdrZXlkb3duJywKICAgICAgICAgICAgJ2tleXByZXNzJywKICAgICAgICAgICAgJ2tleXVwJywKICAgICAgICAgICAgJ2xvYWQnLAogICAgICAgICAgICAnbG9hZHN0YXJ0JywKICAgICAgICAgICAgJ2xvYWRlZGRhdGEnLAogICAgICAgICAgICAnbG9hZGVkbWV0YWRhdGEnLAogICAgICAgICAgICAnbG9zdHBvaW50ZXJjYXB0dXJlJywKICAgICAgICAgICAgJ21vdXNlZG93bicsCiAgICAgICAgICAgICdtb3VzZWVudGVyJywKICAgICAgICAgICAgJ21vdXNlbGVhdmUnLAogICAgICAgICAgICAnbW91c2Vtb3ZlJywKICAgICAgICAgICAgJ21vdXNlb3V0JywKICAgICAgICAgICAgJ21vdXNlb3ZlcicsCiAgICAgICAgICAgICdtb3VzZXVwJywKICAgICAgICAgICAgJ21vdXNld2hlZWwnLAogICAgICAgICAgICAnb3JpZW50YXRpb25jaGFuZ2UnLAogICAgICAgICAgICAncGF1c2UnLAogICAgICAgICAgICAncGxheScsCiAgICAgICAgICAgICdwbGF5aW5nJywKICAgICAgICAgICAgJ3BvaW50ZXJjYW5jZWwnLAogICAgICAgICAgICAncG9pbnRlcmRvd24nLAogICAgICAgICAgICAncG9pbnRlcmVudGVyJywKICAgICAgICAgICAgJ3BvaW50ZXJsZWF2ZScsCiAgICAgICAgICAgICdwb2ludGVybG9ja2NoYW5nZScsCiAgICAgICAgICAgICdtb3pwb2ludGVybG9ja2NoYW5nZScsCiAgICAgICAgICAgICd3ZWJraXRwb2ludGVybG9ja2VyY2hhbmdlJywKICAgICAgICAgICAgJ3BvaW50ZXJsb2NrZXJyb3InLAogICAgICAgICAgICAnbW96cG9pbnRlcmxvY2tlcnJvcicsCiAgICAgICAgICAgICd3ZWJraXRwb2ludGVybG9ja2Vycm9yJywKICAgICAgICAgICAgJ3BvaW50ZXJtb3ZlJywKICAgICAgICAgICAgJ3BvaW50b3V0JywKICAgICAgICAgICAgJ3BvaW50ZXJvdmVyJywKICAgICAgICAgICAgJ3BvaW50ZXJ1cCcsCiAgICAgICAgICAgICdwcm9ncmVzcycsCiAgICAgICAgICAgICdyYXRlY2hhbmdlJywKICAgICAgICAgICAgJ3Jlc2V0JywKICAgICAgICAgICAgJ3Jlc2l6ZScsCiAgICAgICAgICAgICdzY3JvbGwnLAogICAgICAgICAgICAnc2Vla2VkJywKICAgICAgICAgICAgJ3NlZWtpbmcnLAogICAgICAgICAgICAnc2VsZWN0JywKICAgICAgICAgICAgJ3NlbGVjdGlvbmNoYW5nZScsCiAgICAgICAgICAgICdzZWxlY3RzdGFydCcsCiAgICAgICAgICAgICdzaG93JywKICAgICAgICAgICAgJ3NvcnQnLAogICAgICAgICAgICAnc3RhbGxlZCcsCiAgICAgICAgICAgICdzdWJtaXQnLAogICAgICAgICAgICAnc3VzcGVuZCcsCiAgICAgICAgICAgICd0aW1ldXBkYXRlJywKICAgICAgICAgICAgJ3ZvbHVtZWNoYW5nZScsCiAgICAgICAgICAgICd0b3VjaGNhbmNlbCcsCiAgICAgICAgICAgICd0b3VjaG1vdmUnLAogICAgICAgICAgICAndG91Y2hzdGFydCcsCiAgICAgICAgICAgICd0b3VjaGVuZCcsCiAgICAgICAgICAgICd0cmFuc2l0aW9uY2FuY2VsJywKICAgICAgICAgICAgJ3RyYW5zaXRpb25lbmQnLAogICAgICAgICAgICAnd2FpdGluZycsCiAgICAgICAgICAgICd3aGVlbCcKICAgICAgICBdOwogICAgICAgIHZhciBkb2N1bWVudEV2ZW50TmFtZXMgPSBbCiAgICAgICAgICAgICdhZnRlcnNjcmlwdGV4ZWN1dGUnLCAnYmVmb3Jlc2NyaXB0ZXhlY3V0ZScsICdET01Db250ZW50TG9hZGVkJywgJ2ZyZWV6ZScsICdmdWxsc2NyZWVuY2hhbmdlJywKICAgICAgICAgICAgJ21vemZ1bGxzY3JlZW5jaGFuZ2UnLCAnd2Via2l0ZnVsbHNjcmVlbmNoYW5nZScsICdtc2Z1bGxzY3JlZW5jaGFuZ2UnLCAnZnVsbHNjcmVlbmVycm9yJywKICAgICAgICAgICAgJ21vemZ1bGxzY3JlZW5lcnJvcicsICd3ZWJraXRmdWxsc2NyZWVuZXJyb3InLCAnbXNmdWxsc2NyZWVuZXJyb3InLCAncmVhZHlzdGF0ZWNoYW5nZScsCiAgICAgICAgICAgICd2aXNpYmlsaXR5Y2hhbmdlJywgJ3Jlc3VtZScKICAgICAgICBdOwogICAgICAgIHZhciB3aW5kb3dFdmVudE5hbWVzID0gWwogICAgICAgICAgICAnYWJzb2x1dGVkZXZpY2VvcmllbnRhdGlvbicsCiAgICAgICAgICAgICdhZnRlcmlucHV0JywKICAgICAgICAgICAgJ2FmdGVycHJpbnQnLAogICAgICAgICAgICAnYXBwaW5zdGFsbGVkJywKICAgICAgICAgICAgJ2JlZm9yZWluc3RhbGxwcm9tcHQnLAogICAgICAgICAgICAnYmVmb3JlcHJpbnQnLAogICAgICAgICAgICAnYmVmb3JldW5sb2FkJywKICAgICAgICAgICAgJ2RldmljZWxpZ2h0JywKICAgICAgICAgICAgJ2RldmljZW1vdGlvbicsCiAgICAgICAgICAgICdkZXZpY2VvcmllbnRhdGlvbicsCiAgICAgICAgICAgICdkZXZpY2VvcmllbnRhdGlvbmFic29sdXRlJywKICAgICAgICAgICAgJ2RldmljZXByb3hpbWl0eScsCiAgICAgICAgICAgICdoYXNoY2hhbmdlJywKICAgICAgICAgICAgJ2xhbmd1YWdlY2hhbmdlJywKICAgICAgICAgICAgJ21lc3NhZ2UnLAogICAgICAgICAgICAnbW96YmVmb3JlcGFpbnQnLAogICAgICAgICAgICAnb2ZmbGluZScsCiAgICAgICAgICAgICdvbmxpbmUnLAogICAgICAgICAgICAncGFpbnQnLAogICAgICAgICAgICAncGFnZXNob3cnLAogICAgICAgICAgICAncGFnZWhpZGUnLAogICAgICAgICAgICAncG9wc3RhdGUnLAogICAgICAgICAgICAncmVqZWN0aW9uaGFuZGxlZCcsCiAgICAgICAgICAgICdzdG9yYWdlJywKICAgICAgICAgICAgJ3VuaGFuZGxlZHJlamVjdGlvbicsCiAgICAgICAgICAgICd1bmxvYWQnLAogICAgICAgICAgICAndXNlcnByb3hpbWl0eScsCiAgICAgICAgICAgICd2cmRpc3BsYXljb25uZWN0ZWQnLAogICAgICAgICAgICAndnJkaXNwbGF5ZGlzY29ubmVjdGVkJywKICAgICAgICAgICAgJ3ZyZGlzcGxheXByZXNlbnRjaGFuZ2UnCiAgICAgICAgXTsKICAgICAgICB2YXIgaHRtbEVsZW1lbnRFdmVudE5hbWVzID0gWwogICAgICAgICAgICAnYmVmb3JlY29weScsICdiZWZvcmVjdXQnLCAnYmVmb3JlcGFzdGUnLCAnY29weScsICdjdXQnLCAncGFzdGUnLCAnZHJhZ3N0YXJ0JywgJ2xvYWRlbmQnLAogICAgICAgICAgICAnYW5pbWF0aW9uc3RhcnQnLCAnc2VhcmNoJywgJ3RyYW5zaXRpb25ydW4nLCAndHJhbnNpdGlvbnN0YXJ0JywgJ3dlYmtpdGFuaW1hdGlvbmVuZCcsCiAgICAgICAgICAgICd3ZWJraXRhbmltYXRpb25pdGVyYXRpb24nLCAnd2Via2l0YW5pbWF0aW9uc3RhcnQnLCAnd2Via2l0dHJhbnNpdGlvbmVuZCcKICAgICAgICBdOwogICAgICAgIHZhciBtZWRpYUVsZW1lbnRFdmVudE5hbWVzID0gWydlbmNyeXB0ZWQnLCAnd2FpdGluZ2ZvcmtleScsICdtc25lZWRrZXknLCAnbW96aW50ZXJydXB0YmVnaW4nLCAnbW96aW50ZXJydXB0ZW5kJ107CiAgICAgICAgdmFyIGllRWxlbWVudEV2ZW50TmFtZXMgPSBbCiAgICAgICAgICAgICdhY3RpdmF0ZScsCiAgICAgICAgICAgICdhZnRlcnVwZGF0ZScsCiAgICAgICAgICAgICdhcmlhcmVxdWVzdCcsCiAgICAgICAgICAgICdiZWZvcmVhY3RpdmF0ZScsCiAgICAgICAgICAgICdiZWZvcmVkZWFjdGl2YXRlJywKICAgICAgICAgICAgJ2JlZm9yZWVkaXRmb2N1cycsCiAgICAgICAgICAgICdiZWZvcmV1cGRhdGUnLAogICAgICAgICAgICAnY2VsbGNoYW5nZScsCiAgICAgICAgICAgICdjb250cm9sc2VsZWN0JywKICAgICAgICAgICAgJ2RhdGFhdmFpbGFibGUnLAogICAgICAgICAgICAnZGF0YXNldGNoYW5nZWQnLAogICAgICAgICAgICAnZGF0YXNldGNvbXBsZXRlJywKICAgICAgICAgICAgJ2Vycm9ydXBkYXRlJywKICAgICAgICAgICAgJ2ZpbHRlcmNoYW5nZScsCiAgICAgICAgICAgICdsYXlvdXRjb21wbGV0ZScsCiAgICAgICAgICAgICdsb3NlY2FwdHVyZScsCiAgICAgICAgICAgICdtb3ZlJywKICAgICAgICAgICAgJ21vdmVlbmQnLAogICAgICAgICAgICAnbW92ZXN0YXJ0JywKICAgICAgICAgICAgJ3Byb3BlcnR5Y2hhbmdlJywKICAgICAgICAgICAgJ3Jlc2l6ZWVuZCcsCiAgICAgICAgICAgICdyZXNpemVzdGFydCcsCiAgICAgICAgICAgICdyb3dlbnRlcicsCiAgICAgICAgICAgICdyb3dleGl0JywKICAgICAgICAgICAgJ3Jvd3NkZWxldGUnLAogICAgICAgICAgICAncm93c2luc2VydGVkJywKICAgICAgICAgICAgJ2NvbW1hbmQnLAogICAgICAgICAgICAnY29tcGFzc25lZWRzY2FsaWJyYXRpb24nLAogICAgICAgICAgICAnZGVhY3RpdmF0ZScsCiAgICAgICAgICAgICdoZWxwJywKICAgICAgICAgICAgJ21zY29udGVudHpvb20nLAogICAgICAgICAgICAnbXNtYW5pcHVsYXRpb25zdGF0ZWNoYW5nZWQnLAogICAgICAgICAgICAnbXNnZXN0dXJlY2hhbmdlJywKICAgICAgICAgICAgJ21zZ2VzdHVyZWRvdWJsZXRhcCcsCiAgICAgICAgICAgICdtc2dlc3R1cmVlbmQnLAogICAgICAgICAgICAnbXNnZXN0dXJlaG9sZCcsCiAgICAgICAgICAgICdtc2dlc3R1cmVzdGFydCcsCiAgICAgICAgICAgICdtc2dlc3R1cmV0YXAnLAogICAgICAgICAgICAnbXNnb3Rwb2ludGVyY2FwdHVyZScsCiAgICAgICAgICAgICdtc2luZXJ0aWFzdGFydCcsCiAgICAgICAgICAgICdtc2xvc3Rwb2ludGVyY2FwdHVyZScsCiAgICAgICAgICAgICdtc3BvaW50ZXJjYW5jZWwnLAogICAgICAgICAgICAnbXNwb2ludGVyZG93bicsCiAgICAgICAgICAgICdtc3BvaW50ZXJlbnRlcicsCiAgICAgICAgICAgICdtc3BvaW50ZXJob3ZlcicsCiAgICAgICAgICAgICdtc3BvaW50ZXJsZWF2ZScsCiAgICAgICAgICAgICdtc3BvaW50ZXJtb3ZlJywKICAgICAgICAgICAgJ21zcG9pbnRlcm91dCcsCiAgICAgICAgICAgICdtc3BvaW50ZXJvdmVyJywKICAgICAgICAgICAgJ21zcG9pbnRlcnVwJywKICAgICAgICAgICAgJ3BvaW50ZXJvdXQnLAogICAgICAgICAgICAnbXNzaXRlbW9kZWp1bXBsaXN0aXRlbXJlbW92ZWQnLAogICAgICAgICAgICAnbXN0aHVtYm5haWxjbGljaycsCiAgICAgICAgICAgICdzdG9wJywKICAgICAgICAgICAgJ3N0b3JhZ2Vjb21taXQnCiAgICAgICAgXTsKICAgICAgICB2YXIgd2ViZ2xFdmVudE5hbWVzID0gWyd3ZWJnbGNvbnRleHRyZXN0b3JlZCcsICd3ZWJnbGNvbnRleHRsb3N0JywgJ3dlYmdsY29udGV4dGNyZWF0aW9uZXJyb3InXTsKICAgICAgICB2YXIgZm9ybUV2ZW50TmFtZXMgPSBbJ2F1dG9jb21wbGV0ZScsICdhdXRvY29tcGxldGVlcnJvciddOwogICAgICAgIHZhciBkZXRhaWxFdmVudE5hbWVzID0gWyd0b2dnbGUnXTsKICAgICAgICB2YXIgZnJhbWVFdmVudE5hbWVzID0gWydsb2FkJ107CiAgICAgICAgdmFyIGZyYW1lU2V0RXZlbnROYW1lcyA9IFsnYmx1cicsICdlcnJvcicsICdmb2N1cycsICdsb2FkJywgJ3Jlc2l6ZScsICdzY3JvbGwnLCAnbWVzc2FnZWVycm9yJ107CiAgICAgICAgdmFyIG1hcnF1ZWVFdmVudE5hbWVzID0gWydib3VuY2UnLCAnZmluaXNoJywgJ3N0YXJ0J107CiAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnROYW1lcyA9IFsKICAgICAgICAgICAgJ2xvYWRzdGFydCcsICdwcm9ncmVzcycsICdhYm9ydCcsICdlcnJvcicsICdsb2FkJywgJ3Byb2dyZXNzJywgJ3RpbWVvdXQnLCAnbG9hZGVuZCcsCiAgICAgICAgICAgICdyZWFkeXN0YXRlY2hhbmdlJwogICAgICAgIF07CiAgICAgICAgdmFyIElEQkluZGV4RXZlbnROYW1lcyA9IFsndXBncmFkZW5lZWRlZCcsICdjb21wbGV0ZScsICdhYm9ydCcsICdzdWNjZXNzJywgJ2Vycm9yJywgJ2Jsb2NrZWQnLCAndmVyc2lvbmNoYW5nZScsICdjbG9zZSddOwogICAgICAgIHZhciB3ZWJzb2NrZXRFdmVudE5hbWVzID0gWydjbG9zZScsICdlcnJvcicsICdvcGVuJywgJ21lc3NhZ2UnXTsKICAgICAgICB2YXIgd29ya2VyRXZlbnROYW1lcyA9IFsnZXJyb3InLCAnbWVzc2FnZSddOwogICAgICAgIHZhciBldmVudE5hbWVzID0gZ2xvYmFsRXZlbnRIYW5kbGVyc0V2ZW50TmFtZXMuY29uY2F0KHdlYmdsRXZlbnROYW1lcywgZm9ybUV2ZW50TmFtZXMsIGRldGFpbEV2ZW50TmFtZXMsIGRvY3VtZW50RXZlbnROYW1lcywgd2luZG93RXZlbnROYW1lcywgaHRtbEVsZW1lbnRFdmVudE5hbWVzLCBpZUVsZW1lbnRFdmVudE5hbWVzKTsKICAgICAgICBmdW5jdGlvbiBmaWx0ZXJQcm9wZXJ0aWVzKHRhcmdldCwgb25Qcm9wZXJ0aWVzLCBpZ25vcmVQcm9wZXJ0aWVzKSB7CiAgICAgICAgICAgIGlmICghaWdub3JlUHJvcGVydGllcyB8fCBpZ25vcmVQcm9wZXJ0aWVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9uUHJvcGVydGllczsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgdGlwID0gaWdub3JlUHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24gKGlwKSB7IHJldHVybiBpcC50YXJnZXQgPT09IHRhcmdldDsgfSk7CiAgICAgICAgICAgIGlmICghdGlwIHx8IHRpcC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBvblByb3BlcnRpZXM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIHRhcmdldElnbm9yZVByb3BlcnRpZXMgPSB0aXBbMF0uaWdub3JlUHJvcGVydGllczsKICAgICAgICAgICAgcmV0dXJuIG9uUHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24gKG9wKSB7IHJldHVybiB0YXJnZXRJZ25vcmVQcm9wZXJ0aWVzLmluZGV4T2Yob3ApID09PSAtMTsgfSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKHRhcmdldCwgb25Qcm9wZXJ0aWVzLCBpZ25vcmVQcm9wZXJ0aWVzLCBwcm90b3R5cGUpIHsKICAgICAgICAgICAgLy8gY2hlY2sgd2hldGhlciB0YXJnZXQgaXMgYXZhaWxhYmxlLCBzb21ldGltZXMgdGFyZ2V0IHdpbGwgYmUgdW5kZWZpbmVkCiAgICAgICAgICAgIC8vIGJlY2F1c2UgZGlmZmVyZW50IGJyb3dzZXIgb3Igc29tZSAzcmQgcGFydHkgcGx1Z2luLgogICAgICAgICAgICBpZiAoIXRhcmdldCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBmaWx0ZXJlZFByb3BlcnRpZXMgPSBmaWx0ZXJQcm9wZXJ0aWVzKHRhcmdldCwgb25Qcm9wZXJ0aWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgcGF0Y2hPblByb3BlcnRpZXModGFyZ2V0LCBmaWx0ZXJlZFByb3BlcnRpZXMsIHByb3RvdHlwZSk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHByb3BlcnR5RGVzY3JpcHRvclBhdGNoKGFwaSwgX2dsb2JhbCkgewogICAgICAgICAgICBpZiAoaXNOb2RlICYmICFpc01peCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChab25lW2FwaS5zeW1ib2woJ3BhdGNoRXZlbnRzJyldKSB7CiAgICAgICAgICAgICAgICAvLyBldmVudHMgYXJlIGFscmVhZHkgYmVlbiBwYXRjaGVkIGJ5IGxlZ2FjeSBwYXRjaC4KICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgc3VwcG9ydHNXZWJTb2NrZXQgPSB0eXBlb2YgV2ViU29ja2V0ICE9PSAndW5kZWZpbmVkJzsKICAgICAgICAgICAgdmFyIGlnbm9yZVByb3BlcnRpZXMgPSBfZ2xvYmFsWydfX1pvbmVfaWdub3JlX29uX3Byb3BlcnRpZXMnXTsKICAgICAgICAgICAgLy8gZm9yIGJyb3dzZXJzIHRoYXQgd2UgY2FuIHBhdGNoIHRoZSBkZXNjcmlwdG9yOiAgQ2hyb21lICYgRmlyZWZveAogICAgICAgICAgICBpZiAoaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICB2YXIgaW50ZXJuYWxXaW5kb3dfMSA9IHdpbmRvdzsKICAgICAgICAgICAgICAgIHZhciBpZ25vcmVFcnJvclByb3BlcnRpZXMgPSBpc0lFID8gW3sgdGFyZ2V0OiBpbnRlcm5hbFdpbmRvd18xLCBpZ25vcmVQcm9wZXJ0aWVzOiBbJ2Vycm9yJ10gfV0gOiBbXTsKICAgICAgICAgICAgICAgIC8vIGluIElFL0VkZ2UsIG9uUHJvcCBub3QgZXhpc3QgaW4gd2luZG93IG9iamVjdCwgYnV0IGluIFdpbmRvd1Byb3RvdHlwZQogICAgICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBwYXNzIFdpbmRvd1Byb3RvdHlwZSB0byBjaGVjayBvblByb3AgZXhpc3Qgb3Igbm90CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhpbnRlcm5hbFdpbmRvd18xLCBldmVudE5hbWVzLmNvbmNhdChbJ21lc3NhZ2VlcnJvciddKSwgaWdub3JlUHJvcGVydGllcyA/IGlnbm9yZVByb3BlcnRpZXMuY29uY2F0KGlnbm9yZUVycm9yUHJvcGVydGllcykgOiBpZ25vcmVQcm9wZXJ0aWVzLCBPYmplY3RHZXRQcm90b3R5cGVPZihpbnRlcm5hbFdpbmRvd18xKSk7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhEb2N1bWVudC5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpbnRlcm5hbFdpbmRvd18xWydTVkdFbGVtZW50J10gIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoaW50ZXJuYWxXaW5kb3dfMVsnU1ZHRWxlbWVudCddLnByb3RvdHlwZSwgZXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhFbGVtZW50LnByb3RvdHlwZSwgZXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MRWxlbWVudC5wcm90b3R5cGUsIGV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTE1lZGlhRWxlbWVudC5wcm90b3R5cGUsIG1lZGlhRWxlbWVudEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTEZyYW1lU2V0RWxlbWVudC5wcm90b3R5cGUsIHdpbmRvd0V2ZW50TmFtZXMuY29uY2F0KGZyYW1lU2V0RXZlbnROYW1lcyksIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTEJvZHlFbGVtZW50LnByb3RvdHlwZSwgd2luZG93RXZlbnROYW1lcy5jb25jYXQoZnJhbWVTZXRFdmVudE5hbWVzKSwgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhIVE1MRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgZnJhbWVFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKEhUTUxJRnJhbWVFbGVtZW50LnByb3RvdHlwZSwgZnJhbWVFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIHZhciBIVE1MTWFycXVlZUVsZW1lbnRfMSA9IGludGVybmFsV2luZG93XzFbJ0hUTUxNYXJxdWVlRWxlbWVudCddOwogICAgICAgICAgICAgICAgaWYgKEhUTUxNYXJxdWVlRWxlbWVudF8xKSB7CiAgICAgICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSFRNTE1hcnF1ZWVFbGVtZW50XzEucHJvdG90eXBlLCBtYXJxdWVlRXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgV29ya2VyXzEgPSBpbnRlcm5hbFdpbmRvd18xWydXb3JrZXInXTsKICAgICAgICAgICAgICAgIGlmIChXb3JrZXJfMSkgewogICAgICAgICAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKFdvcmtlcl8xLnByb3RvdHlwZSwgd29ya2VyRXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0ID0gX2dsb2JhbFsnWE1MSHR0cFJlcXVlc3QnXTsKICAgICAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIFNlcnZpY2VXb3JrZXIsIHNvIHdlIG5lZWQgdG8gY2hlY2sgaGVyZQogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLCBYTUxIdHRwUmVxdWVzdEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0ID0gX2dsb2JhbFsnWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddOwogICAgICAgICAgICBpZiAoWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCkgewogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCAmJiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LnByb3RvdHlwZSwgWE1MSHR0cFJlcXVlc3RFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodHlwZW9mIElEQkluZGV4ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCSW5kZXgucHJvdG90eXBlLCBJREJJbmRleEV2ZW50TmFtZXMsIGlnbm9yZVByb3BlcnRpZXMpOwogICAgICAgICAgICAgICAgcGF0Y2hGaWx0ZXJlZFByb3BlcnRpZXMoSURCUmVxdWVzdC5wcm90b3R5cGUsIElEQkluZGV4RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhJREJPcGVuREJSZXF1ZXN0LnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQkRhdGFiYXNlLnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQlRyYW5zYWN0aW9uLnByb3RvdHlwZSwgSURCSW5kZXhFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgICAgIHBhdGNoRmlsdGVyZWRQcm9wZXJ0aWVzKElEQkN1cnNvci5wcm90b3R5cGUsIElEQkluZGV4RXZlbnROYW1lcywgaWdub3JlUHJvcGVydGllcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHN1cHBvcnRzV2ViU29ja2V0KSB7CiAgICAgICAgICAgICAgICBwYXRjaEZpbHRlcmVkUHJvcGVydGllcyhXZWJTb2NrZXQucHJvdG90eXBlLCB3ZWJzb2NrZXRFdmVudE5hbWVzLCBpZ25vcmVQcm9wZXJ0aWVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3V0aWwnLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHsKICAgICAgICAgICAgYXBpLnBhdGNoT25Qcm9wZXJ0aWVzID0gcGF0Y2hPblByb3BlcnRpZXM7CiAgICAgICAgICAgIGFwaS5wYXRjaE1ldGhvZCA9IHBhdGNoTWV0aG9kOwogICAgICAgICAgICBhcGkuYmluZEFyZ3VtZW50cyA9IGJpbmRBcmd1bWVudHM7CiAgICAgICAgICAgIGFwaS5wYXRjaE1hY3JvVGFzayA9IHBhdGNoTWFjcm9UYXNrOwogICAgICAgICAgICAvLyBJbiBlYXJsaWVyIHZlcnNpb24gb2Ygem9uZS5qcyAoPDAuOS4wKSwgd2UgdXNlIGVudiBuYW1lIGBfX3pvbmVfc3ltYm9sX19CTEFDS19MSVNURURfRVZFTlRTYCB0bwogICAgICAgICAgICAvLyBkZWZpbmUgd2hpY2ggZXZlbnRzIHdpbGwgbm90IGJlIHBhdGNoZWQgYnkgYFpvbmUuanNgLgogICAgICAgICAgICAvLyBJbiBuZXdlciB2ZXJzaW9uICg+PTAuOS4wKSwgd2UgY2hhbmdlIHRoZSBlbnYgbmFtZSB0byBgX196b25lX3N5bWJvbF9fVU5QQVRDSEVEX0VWRU5UU2AgdG8ga2VlcAogICAgICAgICAgICAvLyB0aGUgbmFtZSBjb25zaXN0ZW50IHdpdGggYW5ndWxhciByZXBvLgogICAgICAgICAgICAvLyBUaGUgIGBfX3pvbmVfc3ltYm9sX19CTEFDS19MSVNURURfRVZFTlRTYCBpcyBkZXByZWNhdGVkLCBidXQgaXQgaXMgc3RpbGwgYmUgc3VwcG9ydGVkIGZvcgogICAgICAgICAgICAvLyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KICAgICAgICAgICAgdmFyIFNZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTID0gWm9uZS5fX3N5bWJvbF9fKCdCTEFDS19MSVNURURfRVZFTlRTJyk7CiAgICAgICAgICAgIHZhciBTWU1CT0xfVU5QQVRDSEVEX0VWRU5UUyA9IFpvbmUuX19zeW1ib2xfXygnVU5QQVRDSEVEX0VWRU5UUycpOwogICAgICAgICAgICBpZiAoZ2xvYmFsW1NZTUJPTF9VTlBBVENIRURfRVZFTlRTXSkgewogICAgICAgICAgICAgICAgZ2xvYmFsW1NZTUJPTF9CTEFDS19MSVNURURfRVZFTlRTXSA9IGdsb2JhbFtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdsb2JhbFtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU10pIHsKICAgICAgICAgICAgICAgIFpvbmVbU1lNQk9MX0JMQUNLX0xJU1RFRF9FVkVOVFNdID0gWm9uZVtTWU1CT0xfVU5QQVRDSEVEX0VWRU5UU10gPQogICAgICAgICAgICAgICAgICAgIGdsb2JhbFtTWU1CT0xfQkxBQ0tfTElTVEVEX0VWRU5UU107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRQcm90b3R5cGUgPSBwYXRjaEV2ZW50UHJvdG90eXBlOwogICAgICAgICAgICBhcGkucGF0Y2hFdmVudFRhcmdldCA9IHBhdGNoRXZlbnRUYXJnZXQ7CiAgICAgICAgICAgIGFwaS5pc0lFT3JFZGdlID0gaXNJRU9yRWRnZTsKICAgICAgICAgICAgYXBpLk9iamVjdERlZmluZVByb3BlcnR5ID0gT2JqZWN0RGVmaW5lUHJvcGVydHk7CiAgICAgICAgICAgIGFwaS5PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSBPYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3I7CiAgICAgICAgICAgIGFwaS5PYmplY3RDcmVhdGUgPSBPYmplY3RDcmVhdGU7CiAgICAgICAgICAgIGFwaS5BcnJheVNsaWNlID0gQXJyYXlTbGljZTsKICAgICAgICAgICAgYXBpLnBhdGNoQ2xhc3MgPSBwYXRjaENsYXNzOwogICAgICAgICAgICBhcGkud3JhcFdpdGhDdXJyZW50Wm9uZSA9IHdyYXBXaXRoQ3VycmVudFpvbmU7CiAgICAgICAgICAgIGFwaS5maWx0ZXJQcm9wZXJ0aWVzID0gZmlsdGVyUHJvcGVydGllczsKICAgICAgICAgICAgYXBpLmF0dGFjaE9yaWdpblRvUGF0Y2hlZCA9IGF0dGFjaE9yaWdpblRvUGF0Y2hlZDsKICAgICAgICAgICAgYXBpLl9yZWRlZmluZVByb3BlcnR5ID0gT2JqZWN0LmRlZmluZVByb3BlcnR5OwogICAgICAgICAgICBhcGkucGF0Y2hDYWxsYmFja3MgPSBwYXRjaENhbGxiYWNrczsKICAgICAgICAgICAgYXBpLmdldEdsb2JhbE9iamVjdHMgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAoeyBnbG9iYWxTb3VyY2VzOiBnbG9iYWxTb3VyY2VzLCB6b25lU3ltYm9sRXZlbnROYW1lczogem9uZVN5bWJvbEV2ZW50TmFtZXMkMSwgZXZlbnROYW1lczogZXZlbnROYW1lcywgaXNCcm93c2VyOiBpc0Jyb3dzZXIsIGlzTWl4OiBpc01peCwgaXNOb2RlOiBpc05vZGUsIFRSVUVfU1RSOiBUUlVFX1NUUiwKICAgICAgICAgICAgICAgIEZBTFNFX1NUUjogRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVg6IFpPTkVfU1lNQk9MX1BSRUZJWCwgQUREX0VWRU5UX0xJU1RFTkVSX1NUUjogQUREX0VWRU5UX0xJU1RFTkVSX1NUUiwgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUjogUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiB9KTsgfTsKICAgICAgICB9KTsKICAgICAgICAvKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiAgICAgICAgLyoKICAgICAgICAgKiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgQ2hyb21lIGFuZCBDaHJvbWUgbW9iaWxlLCB0byBlbmFibGUKICAgICAgICAgKiB0aGluZ3MgbGlrZSByZWRlZmluaW5nIGBjcmVhdGVkQ2FsbGJhY2tgIG9uIGFuIGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgdmFyIHpvbmVTeW1ib2wkMTsKICAgICAgICB2YXIgX2RlZmluZVByb3BlcnR5OwogICAgICAgIHZhciBfZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgIHZhciBfY3JlYXRlOwogICAgICAgIHZhciB1bmNvbmZpZ3VyYWJsZXNLZXk7CiAgICAgICAgZnVuY3Rpb24gcHJvcGVydHlQYXRjaCgpIHsKICAgICAgICAgICAgem9uZVN5bWJvbCQxID0gWm9uZS5fX3N5bWJvbF9fOwogICAgICAgICAgICBfZGVmaW5lUHJvcGVydHkgPSBPYmplY3Rbem9uZVN5bWJvbCQxKCdkZWZpbmVQcm9wZXJ0eScpXSA9IE9iamVjdC5kZWZpbmVQcm9wZXJ0eTsKICAgICAgICAgICAgX2dldE93blByb3BlcnR5RGVzY3JpcHRvciA9IE9iamVjdFt6b25lU3ltYm9sJDEoJ2dldE93blByb3BlcnR5RGVzY3JpcHRvcicpXSA9CiAgICAgICAgICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOwogICAgICAgICAgICBfY3JlYXRlID0gT2JqZWN0LmNyZWF0ZTsKICAgICAgICAgICAgdW5jb25maWd1cmFibGVzS2V5ID0gem9uZVN5bWJvbCQxKCd1bmNvbmZpZ3VyYWJsZXMnKTsKICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iaiwgcHJvcCwgZGVzYykgewogICAgICAgICAgICAgICAgaWYgKGlzVW5jb25maWd1cmFibGUob2JqLCBwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0Nhbm5vdCBhc3NpZ24gdG8gcmVhZCBvbmx5IHByb3BlcnR5IFwnJyArIHByb3AgKyAnXCcgb2YgJyArIG9iaik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxDb25maWd1cmFibGVGbGFnID0gZGVzYy5jb25maWd1cmFibGU7CiAgICAgICAgICAgICAgICBpZiAocHJvcCAhPT0gJ3Byb3RvdHlwZScpIHsKICAgICAgICAgICAgICAgICAgICBkZXNjID0gcmV3cml0ZURlc2NyaXB0b3Iob2JqLCBwcm9wLCBkZXNjKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBfdHJ5RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjLCBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWcpOwogICAgICAgICAgICB9OwogICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA9IGZ1bmN0aW9uIChvYmosIHByb3BzKSB7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhwcm9wcykuZm9yRWFjaChmdW5jdGlvbiAocHJvcCkgeyBPYmplY3QuZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBwcm9wc1twcm9wXSk7IH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIG9iajsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgT2JqZWN0LmNyZWF0ZSA9IGZ1bmN0aW9uIChvYmosIHByb3RvKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHByb3RvID09PSAnb2JqZWN0JyAmJiAhT2JqZWN0LmlzRnJvemVuKHByb3RvKSkgewogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHByb3RvKS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvW3Byb3BdID0gcmV3cml0ZURlc2NyaXB0b3Iob2JqLCBwcm9wLCBwcm90b1twcm9wXSk7CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gX2NyZWF0ZShvYmosIHByb3RvKTsKICAgICAgICAgICAgfTsKICAgICAgICAgICAgT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIChvYmosIHByb3ApIHsKICAgICAgICAgICAgICAgIHZhciBkZXNjID0gX2dldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApOwogICAgICAgICAgICAgICAgaWYgKGRlc2MgJiYgaXNVbmNvbmZpZ3VyYWJsZShvYmosIHByb3ApKSB7CiAgICAgICAgICAgICAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkZXNjOwogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfcmVkZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpIHsKICAgICAgICAgICAgdmFyIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyA9IGRlc2MuY29uZmlndXJhYmxlOwogICAgICAgICAgICBkZXNjID0gcmV3cml0ZURlc2NyaXB0b3Iob2JqLCBwcm9wLCBkZXNjKTsKICAgICAgICAgICAgcmV0dXJuIF90cnlEZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MsIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyk7CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIGlzVW5jb25maWd1cmFibGUob2JqLCBwcm9wKSB7CiAgICAgICAgICAgIHJldHVybiBvYmogJiYgb2JqW3VuY29uZmlndXJhYmxlc0tleV0gJiYgb2JqW3VuY29uZmlndXJhYmxlc0tleV1bcHJvcF07CiAgICAgICAgfQogICAgICAgIGZ1bmN0aW9uIHJld3JpdGVEZXNjcmlwdG9yKG9iaiwgcHJvcCwgZGVzYykgewogICAgICAgICAgICAvLyBpc3N1ZS05MjcsIGlmIHRoZSBkZXNjIGlzIGZyb3plbiwgZG9uJ3QgdHJ5IHRvIGNoYW5nZSB0aGUgZGVzYwogICAgICAgICAgICBpZiAoIU9iamVjdC5pc0Zyb3plbihkZXNjKSkgewogICAgICAgICAgICAgICAgZGVzYy5jb25maWd1cmFibGUgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZGVzYy5jb25maWd1cmFibGUpIHsKICAgICAgICAgICAgICAgIC8vIGlzc3VlLTkyNywgaWYgdGhlIG9iaiBpcyBmcm96ZW4sIGRvbid0IHRyeSB0byBzZXQgdGhlIGRlc2MgdG8gb2JqCiAgICAgICAgICAgICAgICBpZiAoIW9ialt1bmNvbmZpZ3VyYWJsZXNLZXldICYmICFPYmplY3QuaXNGcm96ZW4ob2JqKSkgewogICAgICAgICAgICAgICAgICAgIF9kZWZpbmVQcm9wZXJ0eShvYmosIHVuY29uZmlndXJhYmxlc0tleSwgeyB3cml0YWJsZTogdHJ1ZSwgdmFsdWU6IHt9IH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG9ialt1bmNvbmZpZ3VyYWJsZXNLZXldKSB7CiAgICAgICAgICAgICAgICAgICAgb2JqW3VuY29uZmlndXJhYmxlc0tleV1bcHJvcF0gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBkZXNjOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBfdHJ5RGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjLCBvcmlnaW5hbENvbmZpZ3VyYWJsZUZsYWcpIHsKICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgIHJldHVybiBfZGVmaW5lUHJvcGVydHkob2JqLCBwcm9wLCBkZXNjKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgIGlmIChkZXNjLmNvbmZpZ3VyYWJsZSkgewogICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgZXJyb3JzLCB3aGVuIHRoZSBjb25maWd1cmFibGUgZmxhZyB3YXMgbGlrZWx5IHNldCBieSByZXdyaXRlRGVzY3JpcHRvcigpLCBsZXQncwogICAgICAgICAgICAgICAgICAgIC8vIHJldHJ5IHdpdGggdGhlIG9yaWdpbmFsIGZsYWcgdmFsdWUKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZyA9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgZGVzYy5jb25maWd1cmFibGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjLmNvbmZpZ3VyYWJsZSA9IG9yaWdpbmFsQ29uZmlndXJhYmxlRmxhZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9kZWZpbmVQcm9wZXJ0eShvYmosIHByb3AsIGRlc2MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2NKc29uID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NKc29uID0gSlNPTi5zdHJpbmdpZnkoZGVzYyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjSnNvbiA9IGRlc2MudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygiQXR0ZW1wdGluZyB0byBjb25maWd1cmUgJyIgKyBwcm9wICsgIicgd2l0aCBkZXNjcmlwdG9yICciICsgZGVzY0pzb24gKyAiJyBvbiBvYmplY3QgJyIgKyBvYmogKyAiJyBhbmQgZ290IGVycm9yLCBnaXZpbmcgdXA6ICIgKyBlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIGV2ZW50VGFyZ2V0TGVnYWN5UGF0Y2goX2dsb2JhbCwgYXBpKSB7CiAgICAgICAgICAgIHZhciBfYSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCksIGV2ZW50TmFtZXMgPSBfYS5ldmVudE5hbWVzLCBnbG9iYWxTb3VyY2VzID0gX2EuZ2xvYmFsU291cmNlcywgem9uZVN5bWJvbEV2ZW50TmFtZXMgPSBfYS56b25lU3ltYm9sRXZlbnROYW1lcywgVFJVRV9TVFIgPSBfYS5UUlVFX1NUUiwgRkFMU0VfU1RSID0gX2EuRkFMU0VfU1RSLCBaT05FX1NZTUJPTF9QUkVGSVggPSBfYS5aT05FX1NZTUJPTF9QUkVGSVg7CiAgICAgICAgICAgIHZhciBXVEZfSVNTVUVfNTU1ID0gJ0FuY2hvcixBcmVhLEF1ZGlvLEJSLEJhc2UsQmFzZUZvbnQsQm9keSxCdXR0b24sQ2FudmFzLENvbnRlbnQsRExpc3QsRGlyZWN0b3J5LERpdixFbWJlZCxGaWVsZFNldCxGb250LEZvcm0sRnJhbWUsRnJhbWVTZXQsSFIsSGVhZCxIZWFkaW5nLEh0bWwsSUZyYW1lLEltYWdlLElucHV0LEtleWdlbixMSSxMYWJlbCxMZWdlbmQsTGluayxNYXAsTWFycXVlZSxNZWRpYSxNZW51LE1ldGEsTWV0ZXIsTW9kLE9MaXN0LE9iamVjdCxPcHRHcm91cCxPcHRpb24sT3V0cHV0LFBhcmFncmFwaCxQcmUsUHJvZ3Jlc3MsUXVvdGUsU2NyaXB0LFNlbGVjdCxTb3VyY2UsU3BhbixTdHlsZSxUYWJsZUNhcHRpb24sVGFibGVDZWxsLFRhYmxlQ29sLFRhYmxlLFRhYmxlUm93LFRhYmxlU2VjdGlvbixUZXh0QXJlYSxUaXRsZSxUcmFjayxVTGlzdCxVbmtub3duLFZpZGVvJzsKICAgICAgICAgICAgdmFyIE5PX0VWRU5UX1RBUkdFVCA9ICdBcHBsaWNhdGlvbkNhY2hlLEV2ZW50U291cmNlLEZpbGVSZWFkZXIsSW5wdXRNZXRob2RDb250ZXh0LE1lZGlhQ29udHJvbGxlcixNZXNzYWdlUG9ydCxOb2RlLFBlcmZvcm1hbmNlLFNWR0VsZW1lbnRJbnN0YW5jZSxTaGFyZWRXb3JrZXIsVGV4dFRyYWNrLFRleHRUcmFja0N1ZSxUZXh0VHJhY2tMaXN0LFdlYktpdE5hbWVkRmxvdyxXaW5kb3csV29ya2VyLFdvcmtlckdsb2JhbFNjb3BlLFhNTEh0dHBSZXF1ZXN0LFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQsWE1MSHR0cFJlcXVlc3RVcGxvYWQsSURCUmVxdWVzdCxJREJPcGVuREJSZXF1ZXN0LElEQkRhdGFiYXNlLElEQlRyYW5zYWN0aW9uLElEQkN1cnNvcixEQkluZGV4LFdlYlNvY2tldCcKICAgICAgICAgICAgICAgIC5zcGxpdCgnLCcpOwogICAgICAgICAgICB2YXIgRVZFTlRfVEFSR0VUID0gJ0V2ZW50VGFyZ2V0JzsKICAgICAgICAgICAgdmFyIGFwaXMgPSBbXTsKICAgICAgICAgICAgdmFyIGlzV3RmID0gX2dsb2JhbFsnd3RmJ107CiAgICAgICAgICAgIHZhciBXVEZfSVNTVUVfNTU1X0FSUkFZID0gV1RGX0lTU1VFXzU1NS5zcGxpdCgnLCcpOwogICAgICAgICAgICBpZiAoaXNXdGYpIHsKICAgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yOiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3RyYWNpbmctZnJhbWV3b3JrL2lzc3Vlcy81NTUKICAgICAgICAgICAgICAgIGFwaXMgPSBXVEZfSVNTVUVfNTU1X0FSUkFZLm1hcChmdW5jdGlvbiAodikgeyByZXR1cm4gJ0hUTUwnICsgdiArICdFbGVtZW50JzsgfSkuY29uY2F0KE5PX0VWRU5UX1RBUkdFVCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoX2dsb2JhbFtFVkVOVF9UQVJHRVRdKSB7CiAgICAgICAgICAgICAgICBhcGlzLnB1c2goRVZFTlRfVEFSR0VUKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIE5vdGU6IEV2ZW50VGFyZ2V0IGlzIG5vdCBhdmFpbGFibGUgaW4gYWxsIGJyb3dzZXJzLAogICAgICAgICAgICAgICAgLy8gaWYgaXQncyBub3QgYXZhaWxhYmxlLCB3ZSBpbnN0ZWFkIHBhdGNoIHRoZSBBUElzIGluIHRoZSBJREwgdGhhdCBpbmhlcml0IGZyb20gRXZlbnRUYXJnZXQKICAgICAgICAgICAgICAgIGFwaXMgPSBOT19FVkVOVF9UQVJHRVQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIGlzRGlzYWJsZUlFQ2hlY2sgPSBfZ2xvYmFsWydfX1pvbmVfZGlzYWJsZV9JRV9jaGVjayddIHx8IGZhbHNlOwogICAgICAgICAgICB2YXIgaXNFbmFibGVDcm9zc0NvbnRleHRDaGVjayA9IF9nbG9iYWxbJ19fWm9uZV9lbmFibGVfY3Jvc3NfY29udGV4dF9jaGVjayddIHx8IGZhbHNlOwogICAgICAgICAgICB2YXIgaWVPckVkZ2UgPSBhcGkuaXNJRU9yRWRnZSgpOwogICAgICAgICAgICB2YXIgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSA9ICcuYWRkRXZlbnRMaXN0ZW5lcjonOwogICAgICAgICAgICB2YXIgRlVOQ1RJT05fV1JBUFBFUiA9ICdbb2JqZWN0IEZ1bmN0aW9uV3JhcHBlcl0nOwogICAgICAgICAgICB2YXIgQlJPV1NFUl9UT09MUyA9ICdmdW5jdGlvbiBfX0JST1dTRVJUT09MU19DT05TT0xFX1NBRkVGVU5DKCkgeyBbbmF0aXZlIGNvZGVdIH0nOwogICAgICAgICAgICB2YXIgcG9pbnRlckV2ZW50c01hcCA9IHsKICAgICAgICAgICAgICAgICdNU1BvaW50ZXJDYW5jZWwnOiAncG9pbnRlcmNhbmNlbCcsCiAgICAgICAgICAgICAgICAnTVNQb2ludGVyRG93bic6ICdwb2ludGVyZG93bicsCiAgICAgICAgICAgICAgICAnTVNQb2ludGVyRW50ZXInOiAncG9pbnRlcmVudGVyJywKICAgICAgICAgICAgICAgICdNU1BvaW50ZXJIb3Zlcic6ICdwb2ludGVyaG92ZXInLAogICAgICAgICAgICAgICAgJ01TUG9pbnRlckxlYXZlJzogJ3BvaW50ZXJsZWF2ZScsCiAgICAgICAgICAgICAgICAnTVNQb2ludGVyTW92ZSc6ICdwb2ludGVybW92ZScsCiAgICAgICAgICAgICAgICAnTVNQb2ludGVyT3V0JzogJ3BvaW50ZXJvdXQnLAogICAgICAgICAgICAgICAgJ01TUG9pbnRlck92ZXInOiAncG9pbnRlcm92ZXInLAogICAgICAgICAgICAgICAgJ01TUG9pbnRlclVwJzogJ3BvaW50ZXJ1cCcKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLy8gIHByZWRlZmluZSBhbGwgX196b25lX3N5bWJvbF9fICsgZXZlbnROYW1lICsgdHJ1ZS9mYWxzZSBzdHJpbmcKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTsKICAgICAgICAgICAgICAgIHZhciBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjsKICAgICAgICAgICAgICAgIHZhciB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7CiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgZmFsc2VFdmVudE5hbWU7CiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7CiAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307CiAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7CiAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gIHByZWRlZmluZSBhbGwgdGFzay5zb3VyY2Ugc3RyaW5nCiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgV1RGX0lTU1VFXzU1NV9BUlJBWS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IFdURl9JU1NVRV81NTVfQVJSQVlbaV07CiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0cyA9IGdsb2JhbFNvdXJjZXNbdGFyZ2V0XSA9IHt9OwogICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBldmVudE5hbWVzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50TmFtZSA9IGV2ZW50TmFtZXNbal07CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0c1tldmVudE5hbWVdID0gdGFyZ2V0ICsgQUREX0VWRU5UX0xJU1RFTkVSX1NPVVJDRSArIGV2ZW50TmFtZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY2hlY2tJRUFuZENyb3NzQ29udGV4dCA9IGZ1bmN0aW9uIChuYXRpdmVEZWxlZ2F0ZSwgZGVsZWdhdGUsIHRhcmdldCwgYXJncykgewogICAgICAgICAgICAgICAgaWYgKCFpc0Rpc2FibGVJRUNoZWNrICYmIGllT3JFZGdlKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlQ3Jvc3NDb250ZXh0Q2hlY2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ZXN0U3RyaW5nID0gZGVsZWdhdGUudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGVzdFN0cmluZyA9PT0gRlVOQ1RJT05fV1JBUFBFUiB8fCB0ZXN0U3RyaW5nID09IEJST1dTRVJfVE9PTFMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlRGVsZWdhdGUuYXBwbHkodGFyZ2V0LCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWxlZ2F0ZS5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGVzdFN0cmluZyA9IGRlbGVnYXRlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgodGVzdFN0cmluZyA9PT0gRlVOQ1RJT05fV1JBUFBFUiB8fCB0ZXN0U3RyaW5nID09IEJST1dTRVJfVE9PTFMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWxlZ2F0ZS5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNFbmFibGVDcm9zc0NvbnRleHRDaGVjaykgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGVnYXRlLnRvU3RyaW5nKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVEZWxlZ2F0ZS5hcHBseSh0YXJnZXQsIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIHZhciBhcGlUeXBlcyA9IFtdOwogICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFwaXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIHZhciB0eXBlID0gX2dsb2JhbFthcGlzW2ldXTsKICAgICAgICAgICAgICAgIGFwaVR5cGVzLnB1c2godHlwZSAmJiB0eXBlLnByb3RvdHlwZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdmggaXMgdmFsaWRhdGVIYW5kbGVyIHRvIGNoZWNrIGV2ZW50IGhhbmRsZXIKICAgICAgICAgICAgLy8gaXMgdmFsaWQgb3Igbm90KGZvciBzZWN1cml0eSBjaGVjaykKICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgYXBpVHlwZXMsIHsKICAgICAgICAgICAgICAgIHZoOiBjaGVja0lFQW5kQ3Jvc3NDb250ZXh0LAogICAgICAgICAgICAgICAgdHJhbnNmZXJFdmVudE5hbWU6IGZ1bmN0aW9uIChldmVudE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgcG9pbnRlckV2ZW50TmFtZSA9IHBvaW50ZXJFdmVudHNNYXBbZXZlbnROYW1lXTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcG9pbnRlckV2ZW50TmFtZSB8fCBldmVudE5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBab25lW2FwaS5zeW1ib2woJ3BhdGNoRXZlbnRUYXJnZXQnKV0gPSAhIV9nbG9iYWxbRVZFTlRfVEFSR0VUXTsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KICAgICAgICAvLyB3ZSBoYXZlIHRvIHBhdGNoIHRoZSBpbnN0YW5jZSBzaW5jZSB0aGUgcHJvdG8gaXMgbm9uLWNvbmZpZ3VyYWJsZQogICAgICAgIGZ1bmN0aW9uIGFwcGx5KGFwaSwgX2dsb2JhbCkgewogICAgICAgICAgICB2YXIgX2EgPSBhcGkuZ2V0R2xvYmFsT2JqZWN0cygpLCBBRERfRVZFTlRfTElTVEVORVJfU1RSID0gX2EuQUREX0VWRU5UX0xJU1RFTkVSX1NUUiwgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiA9IF9hLlJFTU9WRV9FVkVOVF9MSVNURU5FUl9TVFI7CiAgICAgICAgICAgIHZhciBXUyA9IF9nbG9iYWwuV2ViU29ja2V0OwogICAgICAgICAgICAvLyBPbiBTYWZhcmkgd2luZG93LkV2ZW50VGFyZ2V0IGRvZXNuJ3QgZXhpc3Qgc28gbmVlZCB0byBwYXRjaCBXUyBhZGQvcmVtb3ZlRXZlbnRMaXN0ZW5lcgogICAgICAgICAgICAvLyBPbiBvbGRlciBDaHJvbWUsIG5vIG5lZWQgc2luY2UgRXZlbnRUYXJnZXQgd2FzIGFscmVhZHkgcGF0Y2hlZAogICAgICAgICAgICBpZiAoIV9nbG9iYWwuRXZlbnRUYXJnZXQpIHsKICAgICAgICAgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KF9nbG9iYWwsIFtXUy5wcm90b3R5cGVdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBfZ2xvYmFsLldlYlNvY2tldCA9IGZ1bmN0aW9uICh4LCB5KSB7CiAgICAgICAgICAgICAgICB2YXIgc29ja2V0ID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBuZXcgV1MoeCwgeSkgOiBuZXcgV1MoeCk7CiAgICAgICAgICAgICAgICB2YXIgcHJveHlTb2NrZXQ7CiAgICAgICAgICAgICAgICB2YXIgcHJveHlTb2NrZXRQcm90bzsKICAgICAgICAgICAgICAgIC8vIFNhZmFyaSA3LjAgaGFzIG5vbi1jb25maWd1cmFibGUgb3duICdvbm1lc3NhZ2UnIGFuZCBmcmllbmRzIHByb3BlcnRpZXMgb24gdGhlIHNvY2tldCBpbnN0YW5jZQogICAgICAgICAgICAgICAgdmFyIG9ubWVzc2FnZURlc2MgPSBhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHNvY2tldCwgJ29ubWVzc2FnZScpOwogICAgICAgICAgICAgICAgaWYgKG9ubWVzc2FnZURlc2MgJiYgb25tZXNzYWdlRGVzYy5jb25maWd1cmFibGUgPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgcHJveHlTb2NrZXQgPSBhcGkuT2JqZWN0Q3JlYXRlKHNvY2tldCk7CiAgICAgICAgICAgICAgICAgICAgLy8gc29ja2V0IGhhdmUgb3duIHByb3BlcnR5IGRlc2NyaXB0b3IgJ29ub3BlbicsICdvbm1lc3NhZ2UnLCAnb25jbG9zZScsICdvbmVycm9yJwogICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwcm94eVNvY2tldCBub3QsIHNvIHdlIHdpbGwga2VlcCBzb2NrZXQgYXMgcHJvdG90eXBlIGFuZCBwYXNzIGl0IHRvCiAgICAgICAgICAgICAgICAgICAgLy8gcGF0Y2hPblByb3BlcnRpZXMgbWV0aG9kCiAgICAgICAgICAgICAgICAgICAgcHJveHlTb2NrZXRQcm90byA9IHNvY2tldDsKICAgICAgICAgICAgICAgICAgICBbQUREX0VWRU5UX0xJU1RFTkVSX1NUUiwgUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUiwgJ3NlbmQnLCAnY2xvc2UnXS5mb3JFYWNoKGZ1bmN0aW9uIChwcm9wTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICBwcm94eVNvY2tldFtwcm9wTmFtZV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgYXJncyA9IGFwaS5BcnJheVNsaWNlLmNhbGwoYXJndW1lbnRzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wTmFtZSA9PT0gQUREX0VWRU5UX0xJU1RFTkVSX1NUUiB8fCBwcm9wTmFtZSA9PT0gUkVNT1ZFX0VWRU5UX0xJU1RFTkVSX1NUUikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBldmVudE5hbWUgPSBhcmdzLmxlbmd0aCA+IDAgPyBhcmdzWzBdIDogdW5kZWZpbmVkOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudE5hbWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5U3ltYm9sID0gWm9uZS5fX3N5bWJvbF9fKCdPTl9QUk9QRVJUWScgKyBldmVudE5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb2NrZXRbcHJvcGVydHlTeW1ib2xdID0gcHJveHlTb2NrZXRbcHJvcGVydHlTeW1ib2xdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzb2NrZXRbcHJvcE5hbWVdLmFwcGx5KHNvY2tldCwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBjYW4gcGF0Y2ggdGhlIHJlYWwgc29ja2V0CiAgICAgICAgICAgICAgICAgICAgcHJveHlTb2NrZXQgPSBzb2NrZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhcGkucGF0Y2hPblByb3BlcnRpZXMocHJveHlTb2NrZXQsIFsnY2xvc2UnLCAnZXJyb3InLCAnbWVzc2FnZScsICdvcGVuJ10sIHByb3h5U29ja2V0UHJvdG8pOwogICAgICAgICAgICAgICAgcmV0dXJuIHByb3h5U29ja2V0OwogICAgICAgICAgICB9OwogICAgICAgICAgICB2YXIgZ2xvYmFsV2ViU29ja2V0ID0gX2dsb2JhbFsnV2ViU29ja2V0J107CiAgICAgICAgICAgIGZvciAodmFyIHByb3AgaW4gV1MpIHsKICAgICAgICAgICAgICAgIGdsb2JhbFdlYlNvY2tldFtwcm9wXSA9IFdTW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBwcm9wZXJ0eURlc2NyaXB0b3JMZWdhY3lQYXRjaChhcGksIF9nbG9iYWwpIHsKICAgICAgICAgICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgaXNOb2RlID0gX2EuaXNOb2RlLCBpc01peCA9IF9hLmlzTWl4OwogICAgICAgICAgICBpZiAoaXNOb2RlICYmICFpc01peCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghY2FuUGF0Y2hWaWFQcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBfZ2xvYmFsKSkgewogICAgICAgICAgICAgICAgdmFyIHN1cHBvcnRzV2ViU29ja2V0ID0gdHlwZW9mIFdlYlNvY2tldCAhPT0gJ3VuZGVmaW5lZCc7CiAgICAgICAgICAgICAgICAvLyBTYWZhcmksIEFuZHJvaWQgYnJvd3NlcnMgKEplbGx5IEJlYW4pCiAgICAgICAgICAgICAgICBwYXRjaFZpYUNhcHR1cmluZ0FsbFRoZUV2ZW50cyhhcGkpOwogICAgICAgICAgICAgICAgYXBpLnBhdGNoQ2xhc3MoJ1hNTEh0dHBSZXF1ZXN0Jyk7CiAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydHNXZWJTb2NrZXQpIHsKICAgICAgICAgICAgICAgICAgICBhcHBseShhcGksIF9nbG9iYWwpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgWm9uZVthcGkuc3ltYm9sKCdwYXRjaEV2ZW50cycpXSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZnVuY3Rpb24gY2FuUGF0Y2hWaWFQcm9wZXJ0eURlc2NyaXB0b3IoYXBpLCBfZ2xvYmFsKSB7CiAgICAgICAgICAgIHZhciBfYSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCksIGlzQnJvd3NlciA9IF9hLmlzQnJvd3NlciwgaXNNaXggPSBfYS5pc01peDsKICAgICAgICAgICAgaWYgKChpc0Jyb3dzZXIgfHwgaXNNaXgpICYmCiAgICAgICAgICAgICAgICAhYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihIVE1MRWxlbWVudC5wcm90b3R5cGUsICdvbmNsaWNrJykgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBFbGVtZW50ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgLy8gV2ViS2l0IGh0dHBzOi8vYnVncy53ZWJraXQub3JnL3Nob3dfYnVnLmNnaT9pZD0xMzQzNjQKICAgICAgICAgICAgICAgIC8vIElETCBpbnRlcmZhY2UgYXR0cmlidXRlcyBhcmUgbm90IGNvbmZpZ3VyYWJsZQogICAgICAgICAgICAgICAgdmFyIGRlc2MgPSBhcGkuT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEVsZW1lbnQucHJvdG90eXBlLCAnb25jbGljaycpOwogICAgICAgICAgICAgICAgaWYgKGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIC8vIHRyeSB0byB1c2Ugb25jbGljayB0byBkZXRlY3Qgd2hldGhlciB3ZSBjYW4gcGF0Y2ggdmlhIHByb3BlcnR5RGVzY3JpcHRvcgogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyCiAgICAgICAgICAgICAgICBpZiAoZGVzYykgewogICAgICAgICAgICAgICAgICAgIGFwaS5PYmplY3REZWZpbmVQcm9wZXJ0eShFbGVtZW50LnByb3RvdHlwZSwgJ29uY2xpY2snLCB7IGVudW1lcmFibGU6IHRydWUsIGNvbmZpZ3VyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9IH0pOwogICAgICAgICAgICAgICAgICAgIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgICAgICB2YXIgcmVzdWx0ID0gISFkaXYub25jbGljazsKICAgICAgICAgICAgICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkoRWxlbWVudC5wcm90b3R5cGUsICdvbmNsaWNrJywgZGVzYyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3QgPSBfZ2xvYmFsWydYTUxIdHRwUmVxdWVzdCddOwogICAgICAgICAgICBpZiAoIVhNTEh0dHBSZXF1ZXN0KSB7CiAgICAgICAgICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIE9OX1JFQURZX1NUQVRFX0NIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnOwogICAgICAgICAgICB2YXIgWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGU7CiAgICAgICAgICAgIHZhciB4aHJEZXNjID0gYXBpLk9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcihYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgT05fUkVBRFlfU1RBVEVfQ0hBTkdFKTsKICAgICAgICAgICAgLy8gYWRkIGVudW1lcmFibGUgYW5kIGNvbmZpZ3VyYWJsZSBoZXJlIGJlY2F1c2UgaW4gb3BlcmEKICAgICAgICAgICAgLy8gYnkgZGVmYXVsdCBYTUxIdHRwUmVxdWVzdC5wcm90b3R5cGUub25yZWFkeXN0YXRlY2hhbmdlIGlzIHVuZGVmaW5lZAogICAgICAgICAgICAvLyB3aXRob3V0IGFkZGluZyBlbnVtZXJhYmxlIGFuZCBjb25maWd1cmFibGUgd2lsbCBjYXVzZSBvbnJlYWR5c3RhdGVjaGFuZ2UKICAgICAgICAgICAgLy8gbm9uLWNvbmZpZ3VyYWJsZQogICAgICAgICAgICAvLyBhbmQgaWYgWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlLm9ucmVhZHlzdGF0ZWNoYW5nZSBpcyB1bmRlZmluZWQsCiAgICAgICAgICAgIC8vIHdlIHNob3VsZCBzZXQgYSByZWFsIGRlc2MgaW5zdGVhZCBhIGZha2Ugb25lCiAgICAgICAgICAgIGlmICh4aHJEZXNjKSB7CiAgICAgICAgICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsIE9OX1JFQURZX1NUQVRFX0NIQU5HRSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfSB9KTsKICAgICAgICAgICAgICAgIHZhciByZXEgPSBuZXcgWE1MSHR0cFJlcXVlc3QoKTsKICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSAhIXJlcS5vbnJlYWR5c3RhdGVjaGFuZ2U7CiAgICAgICAgICAgICAgICAvLyByZXN0b3JlIG9yaWdpbmFsIGRlc2MKICAgICAgICAgICAgICAgIGFwaS5PYmplY3REZWZpbmVQcm9wZXJ0eShYTUxIdHRwUmVxdWVzdFByb3RvdHlwZSwgT05fUkVBRFlfU1RBVEVfQ0hBTkdFLCB4aHJEZXNjIHx8IHt9KTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YXIgU1lNQk9MX0ZBS0VfT05SRUFEWVNUQVRFQ0hBTkdFXzEgPSBhcGkuc3ltYm9sKCdmYWtlJyk7CiAgICAgICAgICAgICAgICBhcGkuT2JqZWN0RGVmaW5lUHJvcGVydHkoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsIE9OX1JFQURZX1NUQVRFX0NIQU5HRSwgewogICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLAogICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tTWU1CT0xfRkFLRV9PTlJFQURZU1RBVEVDSEFOR0VfMV07IH0sCiAgICAgICAgICAgICAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHsgdGhpc1tTWU1CT0xfRkFLRV9PTlJFQURZU1RBVEVDSEFOR0VfMV0gPSB2YWx1ZTsgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB2YXIgcmVxID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiAgICAgICAgICAgICAgICB2YXIgZGV0ZWN0RnVuYyA9IGZ1bmN0aW9uICgpIHsgfTsKICAgICAgICAgICAgICAgIHJlcS5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBkZXRlY3RGdW5jOwogICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IHJlcVtTWU1CT0xfRkFLRV9PTlJFQURZU1RBVEVDSEFOR0VfMV0gPT09IGRldGVjdEZ1bmM7CiAgICAgICAgICAgICAgICByZXEub25yZWFkeXN0YXRlY2hhbmdlID0gbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gV2hlbmV2ZXIgYW55IGV2ZW50TGlzdGVuZXIgZmlyZXMsIHdlIGNoZWNrIHRoZSBldmVudExpc3RlbmVyIHRhcmdldCBhbmQgYWxsIHBhcmVudHMKICAgICAgICAvLyBmb3IgYG9ud2hhdGV2ZXJgIHByb3BlcnRpZXMgYW5kIHJlcGxhY2UgdGhlbSB3aXRoIHpvbmUtYm91bmQgZnVuY3Rpb25zCiAgICAgICAgLy8gLSBDaHJvbWUgKGZvciBub3cpCiAgICAgICAgZnVuY3Rpb24gcGF0Y2hWaWFDYXB0dXJpbmdBbGxUaGVFdmVudHMoYXBpKSB7CiAgICAgICAgICAgIHZhciBldmVudE5hbWVzID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKS5ldmVudE5hbWVzOwogICAgICAgICAgICB2YXIgdW5ib3VuZEtleSA9IGFwaS5zeW1ib2woJ3VuYm91bmQnKTsKICAgICAgICAgICAgdmFyIF9sb29wXzQgPSBmdW5jdGlvbiAoaSkgewogICAgICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gZXZlbnROYW1lc1tpXTsKICAgICAgICAgICAgICAgIHZhciBvbnByb3BlcnR5ID0gJ29uJyArIHByb3BlcnR5OwogICAgICAgICAgICAgICAgc2VsZi5hZGRFdmVudExpc3RlbmVyKHByb3BlcnR5LCBmdW5jdGlvbiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB2YXIgZWx0ID0gZXZlbnQudGFyZ2V0LCBib3VuZCwgc291cmNlOwogICAgICAgICAgICAgICAgICAgIGlmIChlbHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gZWx0LmNvbnN0cnVjdG9yWyduYW1lJ10gKyAnLicgKyBvbnByb3BlcnR5OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlID0gJ3Vua25vd24uJyArIG9ucHJvcGVydHk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHdoaWxlIChlbHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVsdFtvbnByb3BlcnR5XSAmJiAhZWx0W29ucHJvcGVydHldW3VuYm91bmRLZXldKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib3VuZCA9IGFwaS53cmFwV2l0aEN1cnJlbnRab25lKGVsdFtvbnByb3BlcnR5XSwgc291cmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvdW5kW3VuYm91bmRLZXldID0gZWx0W29ucHJvcGVydHldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWx0W29ucHJvcGVydHldID0gYm91bmQ7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSwgdHJ1ZSk7CiAgICAgICAgICAgIH07CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZXZlbnROYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgX2xvb3BfNChpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcmVnaXN0ZXJFbGVtZW50UGF0Y2goX2dsb2JhbCwgYXBpKSB7CiAgICAgICAgICAgIHZhciBfYSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCksIGlzQnJvd3NlciA9IF9hLmlzQnJvd3NlciwgaXNNaXggPSBfYS5pc01peDsKICAgICAgICAgICAgaWYgKCghaXNCcm93c2VyICYmICFpc01peCkgfHwgISgncmVnaXN0ZXJFbGVtZW50JyBpbiBfZ2xvYmFsLmRvY3VtZW50KSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBjYWxsYmFja3MgPSBbJ2NyZWF0ZWRDYWxsYmFjaycsICdhdHRhY2hlZENhbGxiYWNrJywgJ2RldGFjaGVkQ2FsbGJhY2snLCAnYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrJ107CiAgICAgICAgICAgIGFwaS5wYXRjaENhbGxiYWNrcyhhcGksIGRvY3VtZW50LCAnRG9jdW1lbnQnLCAncmVnaXN0ZXJFbGVtZW50JywgY2FsbGJhY2tzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIChmdW5jdGlvbiAoX2dsb2JhbCkgewogICAgICAgICAgICB2YXIgc3ltYm9sUHJlZml4ID0gX2dsb2JhbFsnX19ab25lX3N5bWJvbF9wcmVmaXgnXSB8fCAnX196b25lX3N5bWJvbF9fJzsKICAgICAgICAgICAgZnVuY3Rpb24gX19zeW1ib2xfXyhuYW1lKSB7IHJldHVybiBzeW1ib2xQcmVmaXggKyBuYW1lOyB9CiAgICAgICAgICAgIF9nbG9iYWxbX19zeW1ib2xfXygnbGVnYWN5UGF0Y2gnKV0gPSBmdW5jdGlvbiAoKSB7CiAgICAgICAgICAgICAgICB2YXIgWm9uZSA9IF9nbG9iYWxbJ1pvbmUnXTsKICAgICAgICAgICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdkZWZpbmVQcm9wZXJ0eScsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgICAgICAgICAgICAgIGFwaS5fcmVkZWZpbmVQcm9wZXJ0eSA9IF9yZWRlZmluZVByb3BlcnR5OwogICAgICAgICAgICAgICAgICAgIHByb3BlcnR5UGF0Y2goKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3JlZ2lzdGVyRWxlbWVudCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRWxlbWVudFBhdGNoKGdsb2JhbCwgYXBpKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ0V2ZW50VGFyZ2V0TGVnYWN5JywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSwgYXBpKSB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnRUYXJnZXRMZWdhY3lQYXRjaChnbG9iYWwsIGFwaSk7CiAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yTGVnYWN5UGF0Y2goYXBpLCBnbG9iYWwpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH07CiAgICAgICAgfSkodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPwogICAgICAgICAgICB3aW5kb3cgOgogICAgICAgICAgICB0eXBlb2YgY29tbW9uanNHbG9iYWwgIT09ICd1bmRlZmluZWQnID8gY29tbW9uanNHbG9iYWwgOiB0eXBlb2Ygc2VsZiAhPT0gJ3VuZGVmaW5lZCcgPyBzZWxmIDoge30pOwogICAgICAgIC8qKgogICAgICAgICAqIEBsaWNlbnNlCiAgICAgICAgICogQ29weXJpZ2h0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgICAgICoKICAgICAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAgICAgKi8KICAgICAgICB2YXIgdGFza1N5bWJvbCA9IHpvbmVTeW1ib2woJ3pvbmVUYXNrJyk7CiAgICAgICAgZnVuY3Rpb24gcGF0Y2hUaW1lcih3aW5kb3csIHNldE5hbWUsIGNhbmNlbE5hbWUsIG5hbWVTdWZmaXgpIHsKICAgICAgICAgICAgdmFyIHNldE5hdGl2ZSA9IG51bGw7CiAgICAgICAgICAgIHZhciBjbGVhck5hdGl2ZSA9IG51bGw7CiAgICAgICAgICAgIHNldE5hbWUgKz0gbmFtZVN1ZmZpeDsKICAgICAgICAgICAgY2FuY2VsTmFtZSArPSBuYW1lU3VmZml4OwogICAgICAgICAgICB2YXIgdGFza3NCeUhhbmRsZUlkID0ge307CiAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7CiAgICAgICAgICAgICAgICB2YXIgZGF0YSA9IHRhc2suZGF0YTsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHRpbWVyKCkgewogICAgICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaW52b2tlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGZpbmFsbHkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpc3N1ZS05MzQsIHRhc2sgd2lsbCBiZSBjYW5jZWxsZWQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpdCBpcyBhIHBlcmlvZGljIHRhc2sgc3VjaCBhcwogICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXRJbnRlcnZhbAogICAgICAgICAgICAgICAgICAgICAgICBpZiAoISh0YXNrLmRhdGEgJiYgdGFzay5kYXRhLmlzUGVyaW9kaWMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGRhdGEuaGFuZGxlSWQgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gbm9uLW5vZGVqcyBlbnYsIHdlIHJlbW92ZSB0aW1lcklkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBsb2NhbCBjYWNoZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0YXNrc0J5SGFuZGxlSWRbZGF0YS5oYW5kbGVJZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkYXRhLmhhbmRsZUlkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9kZSByZXR1cm5zIGNvbXBsZXggb2JqZWN0cyBhcyBoYW5kbGVJZHMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSByZW1vdmUgdGFzayByZWZlcmVuY2UgZnJvbSB0aW1lciBvYmplY3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmhhbmRsZUlkW3Rhc2tTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRhdGEuYXJnc1swXSA9IHRpbWVyOwogICAgICAgICAgICAgICAgZGF0YS5oYW5kbGVJZCA9IHNldE5hdGl2ZS5hcHBseSh3aW5kb3csIGRhdGEuYXJncyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgfQogICAgICAgICAgICBmdW5jdGlvbiBjbGVhclRhc2sodGFzaykgeyByZXR1cm4gY2xlYXJOYXRpdmUodGFzay5kYXRhLmhhbmRsZUlkKTsgfQogICAgICAgICAgICBzZXROYXRpdmUgPQogICAgICAgICAgICAgICAgcGF0Y2hNZXRob2Qod2luZG93LCBzZXROYW1lLCBmdW5jdGlvbiAoZGVsZWdhdGUpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQZXJpb2RpYzogbmFtZVN1ZmZpeCA9PT0gJ0ludGVydmFsJywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5OiAobmFtZVN1ZmZpeCA9PT0gJ1RpbWVvdXQnIHx8IG5hbWVTdWZmaXggPT09ICdJbnRlcnZhbCcpID8gYXJnc1sxXSB8fCAwIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzOiBhcmdzCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoc2V0TmFtZSwgYXJnc1swXSwgb3B0aW9ucywgc2NoZWR1bGVUYXNrLCBjbGVhclRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vZGUuanMgbXVzdCBhZGRpdGlvbmFsbHkgc3VwcG9ydCB0aGUgcmVmIGFuZCB1bnJlZiBmdW5jdGlvbnMuCiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBoYW5kbGUgPSB0YXNrLmRhdGEuaGFuZGxlSWQ7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaGFuZGxlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vbiBub2RlanMgZW52LCB3ZSBzYXZlIGhhbmRsZUlkOiB0YXNrCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXBwaW5nIGluIGxvY2FsIGNhY2hlIGZvciBjbGVhclRpbWVvdXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2tzQnlIYW5kbGVJZFtoYW5kbGVdID0gdGFzazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChoYW5kbGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBub2RlanMgZW52LCB3ZSBzYXZlIHRhc2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBpbiB0aW1lcklkIE9iamVjdCBmb3IgY2xlYXJUaW1lb3V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVbdGFza1N5bWJvbF0gPSB0YXNrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHdoZXRoZXIgaGFuZGxlIGlzIG51bGwsIGJlY2F1c2Ugc29tZSBwb2x5ZmlsbCBvciBicm93c2VyCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heSByZXR1cm4gdW5kZWZpbmVkIGZyb20gc2V0VGltZW91dC9zZXRJbnRlcnZhbC9zZXRJbW1lZGlhdGUvcmVxdWVzdEFuaW1hdGlvbkZyYW1lCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUgJiYgaGFuZGxlLnJlZiAmJiBoYW5kbGUudW5yZWYgJiYgdHlwZW9mIGhhbmRsZS5yZWYgPT09ICdmdW5jdGlvbicgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVvZiBoYW5kbGUudW5yZWYgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sucmVmID0gaGFuZGxlLnJlZi5iaW5kKGhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnVucmVmID0gaGFuZGxlLnVucmVmLmJpbmQoaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGhhbmRsZSA9PT0gJ251bWJlcicgfHwgaGFuZGxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0YXNrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2F1c2UgYW4gZXJyb3IgYnkgY2FsbGluZyBpdCBkaXJlY3RseS4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlbGVnYXRlLmFwcGx5KHdpbmRvdywgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfTsgfSk7CiAgICAgICAgICAgIGNsZWFyTmF0aXZlID0KICAgICAgICAgICAgICAgIHBhdGNoTWV0aG9kKHdpbmRvdywgY2FuY2VsTmFtZSwgZnVuY3Rpb24gKGRlbGVnYXRlKSB7IHJldHVybiBmdW5jdGlvbiAoc2VsZiwgYXJncykgewogICAgICAgICAgICAgICAgICAgIHZhciBpZCA9IGFyZ3NbMF07CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2s7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBpZCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uIG5vZGVqcyBlbnYuCiAgICAgICAgICAgICAgICAgICAgICAgIHRhc2sgPSB0YXNrc0J5SGFuZGxlSWRbaWRdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9kZWpzIGVudi4KICAgICAgICAgICAgICAgICAgICAgICAgdGFzayA9IGlkICYmIGlkW3Rhc2tTeW1ib2xdOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlciBlbnZpcm9ubWVudHMuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzayA9IGlkOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0YXNrICYmIHR5cGVvZiB0YXNrLnR5cGUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLnN0YXRlICE9PSAnbm90U2NoZWR1bGVkJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRhc2suY2FuY2VsRm4gJiYgdGFzay5kYXRhLmlzUGVyaW9kaWMgfHwgdGFzay5ydW5Db3VudCA9PT0gMCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgaWQgPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRhc2tzQnlIYW5kbGVJZFtpZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChpZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkW3Rhc2tTeW1ib2xdID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdCBjYW5jZWwgYWxyZWFkeSBjYW5jZWxlZCBmdW5jdGlvbnMKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suem9uZS5jYW5jZWxUYXNrKHRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBjYXVzZSBhbiBlcnJvciBieSBjYWxsaW5nIGl0IGRpcmVjdGx5LgogICAgICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5hcHBseSh3aW5kb3csIGFyZ3MpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07IH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcGF0Y2hDdXN0b21FbGVtZW50cyhfZ2xvYmFsLCBhcGkpIHsKICAgICAgICAgICAgdmFyIF9hID0gYXBpLmdldEdsb2JhbE9iamVjdHMoKSwgaXNCcm93c2VyID0gX2EuaXNCcm93c2VyLCBpc01peCA9IF9hLmlzTWl4OwogICAgICAgICAgICBpZiAoKCFpc0Jyb3dzZXIgJiYgIWlzTWl4KSB8fCAhX2dsb2JhbFsnY3VzdG9tRWxlbWVudHMnXSB8fCAhKCdjdXN0b21FbGVtZW50cycgaW4gX2dsb2JhbCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB2YXIgY2FsbGJhY2tzID0gWydjb25uZWN0ZWRDYWxsYmFjaycsICdkaXNjb25uZWN0ZWRDYWxsYmFjaycsICdhZG9wdGVkQ2FsbGJhY2snLCAnYXR0cmlidXRlQ2hhbmdlZENhbGxiYWNrJ107CiAgICAgICAgICAgIGFwaS5wYXRjaENhbGxiYWNrcyhhcGksIF9nbG9iYWwuY3VzdG9tRWxlbWVudHMsICdjdXN0b21FbGVtZW50cycsICdkZWZpbmUnLCBjYWxsYmFja3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAbGljZW5zZQogICAgICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICAgICAqCiAgICAgICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZXZlbnRUYXJnZXRQYXRjaChfZ2xvYmFsLCBhcGkpIHsKICAgICAgICAgICAgaWYgKFpvbmVbYXBpLnN5bWJvbCgncGF0Y2hFdmVudFRhcmdldCcpXSkgewogICAgICAgICAgICAgICAgLy8gRXZlbnRUYXJnZXQgaXMgYWxyZWFkeSBwYXRjaGVkLgogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHZhciBfYSA9IGFwaS5nZXRHbG9iYWxPYmplY3RzKCksIGV2ZW50TmFtZXMgPSBfYS5ldmVudE5hbWVzLCB6b25lU3ltYm9sRXZlbnROYW1lcyA9IF9hLnpvbmVTeW1ib2xFdmVudE5hbWVzLCBUUlVFX1NUUiA9IF9hLlRSVUVfU1RSLCBGQUxTRV9TVFIgPSBfYS5GQUxTRV9TVFIsIFpPTkVfU1lNQk9MX1BSRUZJWCA9IF9hLlpPTkVfU1lNQk9MX1BSRUZJWDsKICAgICAgICAgICAgLy8gIHByZWRlZmluZSBhbGwgX196b25lX3N5bWJvbF9fICsgZXZlbnROYW1lICsgdHJ1ZS9mYWxzZSBzdHJpbmcKICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBldmVudE5hbWVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgZXZlbnROYW1lID0gZXZlbnROYW1lc1tpXTsKICAgICAgICAgICAgICAgIHZhciBmYWxzZUV2ZW50TmFtZSA9IGV2ZW50TmFtZSArIEZBTFNFX1NUUjsKICAgICAgICAgICAgICAgIHZhciB0cnVlRXZlbnROYW1lID0gZXZlbnROYW1lICsgVFJVRV9TVFI7CiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sID0gWk9ORV9TWU1CT0xfUFJFRklYICsgZmFsc2VFdmVudE5hbWU7CiAgICAgICAgICAgICAgICB2YXIgc3ltYm9sQ2FwdHVyZSA9IFpPTkVfU1lNQk9MX1BSRUZJWCArIHRydWVFdmVudE5hbWU7CiAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdID0ge307CiAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW0ZBTFNFX1NUUl0gPSBzeW1ib2w7CiAgICAgICAgICAgICAgICB6b25lU3ltYm9sRXZlbnROYW1lc1tldmVudE5hbWVdW1RSVUVfU1RSXSA9IHN5bWJvbENhcHR1cmU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdmFyIEVWRU5UX1RBUkdFVCA9IF9nbG9iYWxbJ0V2ZW50VGFyZ2V0J107CiAgICAgICAgICAgIGlmICghRVZFTlRfVEFSR0VUIHx8ICFFVkVOVF9UQVJHRVQucHJvdG90eXBlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXBpLnBhdGNoRXZlbnRUYXJnZXQoX2dsb2JhbCwgW0VWRU5UX1RBUkdFVCAmJiBFVkVOVF9UQVJHRVQucHJvdG90eXBlXSk7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBmdW5jdGlvbiBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKSB7CiAgICAgICAgICAgIGFwaS5wYXRjaEV2ZW50UHJvdG90eXBlKGdsb2JhbCwgYXBpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGxpY2Vuc2UKICAgICAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAgICAgKgogICAgICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICAgICAqLwogICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdsZWdhY3knLCBmdW5jdGlvbiAoZ2xvYmFsKSB7CiAgICAgICAgICAgIHZhciBsZWdhY3lQYXRjaCA9IGdsb2JhbFtab25lLl9fc3ltYm9sX18oJ2xlZ2FjeVBhdGNoJyldOwogICAgICAgICAgICBpZiAobGVnYWN5UGF0Y2gpIHsKICAgICAgICAgICAgICAgIGxlZ2FjeVBhdGNoKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgICAgICBab25lLl9fbG9hZF9wYXRjaCgndGltZXJzJywgZnVuY3Rpb24gKGdsb2JhbCkgewogICAgICAgICAgICB2YXIgc2V0ID0gJ3NldCc7CiAgICAgICAgICAgIHZhciBjbGVhciA9ICdjbGVhcic7CiAgICAgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnVGltZW91dCcpOwogICAgICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgc2V0LCBjbGVhciwgJ0ludGVydmFsJyk7CiAgICAgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCBzZXQsIGNsZWFyLCAnSW1tZWRpYXRlJyk7CiAgICAgICAgfSk7CiAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ3JlcXVlc3RBbmltYXRpb25GcmFtZScsIGZ1bmN0aW9uIChnbG9iYWwpIHsKICAgICAgICAgICAgcGF0Y2hUaW1lcihnbG9iYWwsICdyZXF1ZXN0JywgJ2NhbmNlbCcsICdBbmltYXRpb25GcmFtZScpOwogICAgICAgICAgICBwYXRjaFRpbWVyKGdsb2JhbCwgJ21velJlcXVlc3QnLCAnbW96Q2FuY2VsJywgJ0FuaW1hdGlvbkZyYW1lJyk7CiAgICAgICAgICAgIHBhdGNoVGltZXIoZ2xvYmFsLCAnd2Via2l0UmVxdWVzdCcsICd3ZWJraXRDYW5jZWwnLCAnQW5pbWF0aW9uRnJhbWUnKTsKICAgICAgICB9KTsKICAgICAgICBab25lLl9fbG9hZF9wYXRjaCgnYmxvY2tpbmcnLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lKSB7CiAgICAgICAgICAgIHZhciBibG9ja2luZ01ldGhvZHMgPSBbJ2FsZXJ0JywgJ3Byb21wdCcsICdjb25maXJtJ107CiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYmxvY2tpbmdNZXRob2RzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICB2YXIgbmFtZV8yID0gYmxvY2tpbmdNZXRob2RzW2ldOwogICAgICAgICAgICAgICAgcGF0Y2hNZXRob2QoZ2xvYmFsLCBuYW1lXzIsIGZ1bmN0aW9uIChkZWxlZ2F0ZSwgc3ltYm9sLCBuYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChzLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBab25lLmN1cnJlbnQucnVuKGRlbGVnYXRlLCBnbG9iYWwsIGFyZ3MsIG5hbWUpOwogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdFdmVudFRhcmdldCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgICAgICBwYXRjaEV2ZW50KGdsb2JhbCwgYXBpKTsKICAgICAgICAgICAgZXZlbnRUYXJnZXRQYXRjaChnbG9iYWwsIGFwaSk7CiAgICAgICAgICAgIC8vIHBhdGNoIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQncyBhZGRFdmVudExpc3RlbmVyL3JlbW92ZUV2ZW50TGlzdGVuZXIKICAgICAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgPSBnbG9iYWxbJ1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQnXTsKICAgICAgICAgICAgaWYgKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgJiYgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldC5wcm90b3R5cGUpIHsKICAgICAgICAgICAgICAgIGFwaS5wYXRjaEV2ZW50VGFyZ2V0KGdsb2JhbCwgW1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQucHJvdG90eXBlXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGF0Y2hDbGFzcygnTXV0YXRpb25PYnNlcnZlcicpOwogICAgICAgICAgICBwYXRjaENsYXNzKCdXZWJLaXRNdXRhdGlvbk9ic2VydmVyJyk7CiAgICAgICAgICAgIHBhdGNoQ2xhc3MoJ0ludGVyc2VjdGlvbk9ic2VydmVyJyk7CiAgICAgICAgICAgIHBhdGNoQ2xhc3MoJ0ZpbGVSZWFkZXInKTsKICAgICAgICB9KTsKICAgICAgICBab25lLl9fbG9hZF9wYXRjaCgnb25fcHJvcGVydHknLCBmdW5jdGlvbiAoZ2xvYmFsLCBab25lLCBhcGkpIHsKICAgICAgICAgICAgcHJvcGVydHlEZXNjcmlwdG9yUGF0Y2goYXBpLCBnbG9iYWwpOwogICAgICAgIH0pOwogICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdjdXN0b21FbGVtZW50cycsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUsIGFwaSkgewogICAgICAgICAgICBwYXRjaEN1c3RvbUVsZW1lbnRzKGdsb2JhbCwgYXBpKTsKICAgICAgICB9KTsKICAgICAgICBab25lLl9fbG9hZF9wYXRjaCgnWEhSJywgZnVuY3Rpb24gKGdsb2JhbCwgWm9uZSkgewogICAgICAgICAgICAvLyBUcmVhdCBYTUxIdHRwUmVxdWVzdCBhcyBhIG1hY3JvdGFzay4KICAgICAgICAgICAgcGF0Y2hYSFIoZ2xvYmFsKTsKICAgICAgICAgICAgdmFyIFhIUl9UQVNLID0gem9uZVN5bWJvbCgneGhyVGFzaycpOwogICAgICAgICAgICB2YXIgWEhSX1NZTkMgPSB6b25lU3ltYm9sKCd4aHJTeW5jJyk7CiAgICAgICAgICAgIHZhciBYSFJfTElTVEVORVIgPSB6b25lU3ltYm9sKCd4aHJMaXN0ZW5lcicpOwogICAgICAgICAgICB2YXIgWEhSX1NDSEVEVUxFRCA9IHpvbmVTeW1ib2woJ3hoclNjaGVkdWxlZCcpOwogICAgICAgICAgICB2YXIgWEhSX1VSTCA9IHpvbmVTeW1ib2woJ3hoclVSTCcpOwogICAgICAgICAgICB2YXIgWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRUQgPSB6b25lU3ltYm9sKCd4aHJFcnJvckJlZm9yZVNjaGVkdWxlZCcpOwogICAgICAgICAgICBmdW5jdGlvbiBwYXRjaFhIUih3aW5kb3cpIHsKICAgICAgICAgICAgICAgIHZhciBYTUxIdHRwUmVxdWVzdCA9IHdpbmRvd1snWE1MSHR0cFJlcXVlc3QnXTsKICAgICAgICAgICAgICAgIGlmICghWE1MSHR0cFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgICAgICAvLyBYTUxIdHRwUmVxdWVzdCBpcyBub3QgYXZhaWxhYmxlIGluIHNlcnZpY2Ugd29ya2VyCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlID0gWE1MSHR0cFJlcXVlc3QucHJvdG90eXBlOwogICAgICAgICAgICAgICAgZnVuY3Rpb24gZmluZFBlbmRpbmdUYXNrKHRhcmdldCkgeyByZXR1cm4gdGFyZ2V0W1hIUl9UQVNLXTsgfQogICAgICAgICAgICAgICAgdmFyIG9yaUFkZExpc3RlbmVyID0gWE1MSHR0cFJlcXVlc3RQcm90b3R5cGVbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgIHZhciBvcmlSZW1vdmVMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07CiAgICAgICAgICAgICAgICBpZiAoIW9yaUFkZExpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRfMSA9IHdpbmRvd1snWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCddOwogICAgICAgICAgICAgICAgICAgIGlmIChYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0XzEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFyIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGUgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0XzEucHJvdG90eXBlOwogICAgICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lciA9IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXRQcm90b3R5cGVbWk9ORV9TWU1CT0xfQUREX0VWRU5UX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgICAgICAgICAgb3JpUmVtb3ZlTGlzdGVuZXIgPSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0UHJvdG90eXBlW1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdmFyIFJFQURZX1NUQVRFX0NIQU5HRSA9ICdyZWFkeXN0YXRlY2hhbmdlJzsKICAgICAgICAgICAgICAgIHZhciBTQ0hFRFVMRUQgPSAnc2NoZWR1bGVkJzsKICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlVGFzayh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0YXNrLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhcmdldCA9IGRhdGEudGFyZ2V0OwogICAgICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfU0NIRURVTEVEXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgZXhpc3RpbmcgZXZlbnQgbGlzdGVuZXIKICAgICAgICAgICAgICAgICAgICB2YXIgbGlzdGVuZXIgPSB0YXJnZXRbWEhSX0xJU1RFTkVSXTsKICAgICAgICAgICAgICAgICAgICBpZiAoIW9yaUFkZExpc3RlbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaUFkZExpc3RlbmVyID0gdGFyZ2V0W1pPTkVfU1lNQk9MX0FERF9FVkVOVF9MSVNURU5FUl07CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaVJlbW92ZUxpc3RlbmVyID0gdGFyZ2V0W1pPTkVfU1lNQk9MX1JFTU9WRV9FVkVOVF9MSVNURU5FUl07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgewogICAgICAgICAgICAgICAgICAgICAgICBvcmlSZW1vdmVMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBsaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHZhciBuZXdMaXN0ZW5lciA9IHRhcmdldFtYSFJfTElTVEVORVJdID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LnJlYWR5U3RhdGUgPT09IHRhcmdldC5ET05FKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzb21ldGltZXMgb24gc29tZSBicm93c2VycyBYTUxIdHRwUmVxdWVzdCB3aWxsIGZpcmUgb25yZWFkeXN0YXRlY2hhbmdlIHdpdGgKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWR5U3RhdGU9NCBtdWx0aXBsZSB0aW1lcywgc28gd2UgbmVlZCB0byBjaGVjayB0YXNrIHN0YXRlIGhlcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGF0YS5hYm9ydGVkICYmIHRhcmdldFtYSFJfU0NIRURVTEVEXSAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSB4aHIgaGFzIHJlZ2lzdGVyZWQgb25sb2FkIGxpc3RlbmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhhdCBpcyB0aGUgY2FzZSwgdGhlIHRhc2sgc2hvdWxkIGludm9rZSBhZnRlciBhbGwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvbmxvYWQgbGlzdGVuZXJzIGZpbmlzaC4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgbG9hZFRhc2tzID0gdGFyZ2V0W1pvbmUuX19zeW1ib2xfXygnbG9hZGZhbHNlJyldOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkVGFza3MgJiYgbG9hZFRhc2tzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9yaUludm9rZV8xID0gdGFzay5pbnZva2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaW52b2tlID0gZnVuY3Rpb24gKCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBsb2FkIHRoZSB0YXNrcyBhZ2FpbiwgYmVjYXVzZSBpbiBvdGhlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9hZCBsaXN0ZW5lciwgdGhleSBtYXkgcmVtb3ZlIHRoZW1zZWx2ZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsb2FkVGFza3MgPSB0YXJnZXRbWm9uZS5fX3N5bWJvbF9fKCdsb2FkZmFsc2UnKV07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxvYWRUYXNrcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsb2FkVGFza3NbaV0gPT09IHRhc2spIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZFRhc2tzLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXNrLnN0YXRlID09PSBTQ0hFRFVMRUQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcmlJbnZva2VfMS5jYWxsKHRhc2spOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2FkVGFza3MucHVzaCh0YXNrKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suaW52b2tlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIWRhdGEuYWJvcnRlZCAmJiB0YXJnZXRbWEhSX1NDSEVEVUxFRF0gPT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3Igb2NjdXJzIHdoZW4geGhyLnNlbmQoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFtYSFJfRVJST1JfQkVGT1JFX1NDSEVEVUxFRF0gPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICBvcmlBZGRMaXN0ZW5lci5jYWxsKHRhcmdldCwgUkVBRFlfU1RBVEVfQ0hBTkdFLCBuZXdMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICAgICAgdmFyIHN0b3JlZFRhc2sgPSB0YXJnZXRbWEhSX1RBU0tdOwogICAgICAgICAgICAgICAgICAgIGlmICghc3RvcmVkVGFzaykgewogICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRbWEhSX1RBU0tdID0gdGFzazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc2VuZE5hdGl2ZS5hcHBseSh0YXJnZXQsIGRhdGEuYXJncyk7CiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0W1hIUl9TQ0hFRFVMRURdID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFzazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIHBsYWNlaG9sZGVyQ2FsbGJhY2soKSB7IH0KICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGNsZWFyVGFzayh0YXNrKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGRhdGEgPSB0YXNrLmRhdGE7CiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSAtIGlkZWFsbHksIHdlIHdvdWxkIGNhbGwgZGF0YS50YXJnZXQucmVtb3ZlRXZlbnRMaXN0ZW5lciBoZXJlLCBidXQgaXQncyB0b28gbGF0ZQogICAgICAgICAgICAgICAgICAgIC8vIHRvIHByZXZlbnQgaXQgZnJvbSBmaXJpbmcuIFNvIGluc3RlYWQsIHdlIHN0b3JlIGluZm8gZm9yIHRoZSBldmVudCBsaXN0ZW5lci4KICAgICAgICAgICAgICAgICAgICBkYXRhLmFib3J0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBhYm9ydE5hdGl2ZS5hcHBseShkYXRhLnRhcmdldCwgZGF0YS5hcmdzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZhciBvcGVuTmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdvcGVuJywgZnVuY3Rpb24gKCkgeyByZXR1cm4gZnVuY3Rpb24gKHNlbGYsIGFyZ3MpIHsKICAgICAgICAgICAgICAgICAgICBzZWxmW1hIUl9TWU5DXSA9IGFyZ3NbMl0gPT0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgc2VsZltYSFJfVVJMXSA9IGFyZ3NbMV07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG9wZW5OYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgICAgICB9OyB9KTsKICAgICAgICAgICAgICAgIHZhciBYTUxIVFRQUkVRVUVTVF9TT1VSQ0UgPSAnWE1MSHR0cFJlcXVlc3Quc2VuZCc7CiAgICAgICAgICAgICAgICB2YXIgZmV0Y2hUYXNrQWJvcnRpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tBYm9ydGluZycpOwogICAgICAgICAgICAgICAgdmFyIGZldGNoVGFza1NjaGVkdWxpbmcgPSB6b25lU3ltYm9sKCdmZXRjaFRhc2tTY2hlZHVsaW5nJyk7CiAgICAgICAgICAgICAgICB2YXIgc2VuZE5hdGl2ZSA9IHBhdGNoTWV0aG9kKFhNTEh0dHBSZXF1ZXN0UHJvdG90eXBlLCAnc2VuZCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKFpvbmUuY3VycmVudFtmZXRjaFRhc2tTY2hlZHVsaW5nXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBhIGZldGNoIGlzIHNjaGVkdWxpbmcsIHNvIHdlIGFyZSB1c2luZyB4aHIgdG8gcG9seWZpbGwgZmV0Y2gKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGJlY2F1c2Ugd2UgYWxyZWFkeSBzY2hlZHVsZSBtYWNyb1Rhc2sgZm9yIGZldGNoLCB3ZSBzaG91bGQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm90IHNjaGVkdWxlIGEgbWFjcm9UYXNrIGZvciB4aHIgYWdhaW4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbmROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzZWxmW1hIUl9TWU5DXSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgWEhSIGlzIHN5bmMgdGhlcmUgaXMgbm8gdGFzayB0byBzY2hlZHVsZSwganVzdCBleGVjdXRlIHRoZSBjb2RlLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VuZE5hdGl2ZS5hcHBseShzZWxmLCBhcmdzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvcHRpb25zID0geyB0YXJnZXQ6IHNlbGYsIHVybDogc2VsZltYSFJfVVJMXSwgaXNQZXJpb2RpYzogZmFsc2UsIGFyZ3M6IGFyZ3MsIGFib3J0ZWQ6IGZhbHNlIH07CiAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0YXNrID0gc2NoZWR1bGVNYWNyb1Rhc2tXaXRoQ3VycmVudFpvbmUoWE1MSFRUUFJFUVVFU1RfU09VUkNFLCBwbGFjZWhvbGRlckNhbGxiYWNrLCBvcHRpb25zLCBzY2hlZHVsZVRhc2ssIGNsZWFyVGFzayk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZWxmICYmIHNlbGZbWEhSX0VSUk9SX0JFRk9SRV9TQ0hFRFVMRURdID09PSB0cnVlICYmICFvcHRpb25zLmFib3J0ZWQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhc2suc3RhdGUgPT09IFNDSEVEVUxFRCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8geGhyIHJlcXVlc3QgdGhyb3cgZXJyb3Igd2hlbiBzZW5kCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgaW52b2tlIHRhc2sgaW5zdGVhZCBvZiBsZWF2aW5nIGEgc2NoZWR1bGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwZW5kaW5nIG1hY3JvVGFzawogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFzay5pbnZva2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH07IH0pOwogICAgICAgICAgICAgICAgdmFyIGFib3J0TmF0aXZlID0gcGF0Y2hNZXRob2QoWE1MSHR0cFJlcXVlc3RQcm90b3R5cGUsICdhYm9ydCcsIGZ1bmN0aW9uICgpIHsgcmV0dXJuIGZ1bmN0aW9uIChzZWxmLCBhcmdzKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIHRhc2sgPSBmaW5kUGVuZGluZ1Rhc2soc2VsZik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhc2sgJiYgdHlwZW9mIHRhc2sudHlwZSA9PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgWEhSIGhhcyBhbHJlYWR5IGNvbXBsZXRlZCwgZG8gbm90aGluZy4KICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIFhIUiBoYXMgYWxyZWFkeSBiZWVuIGFib3J0ZWQsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCAjNTY5LCBjYWxsIGFib3J0IG11bHRpcGxlIHRpbWVzIGJlZm9yZSBkb25lIHdpbGwgY2F1c2UKICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFjcm9UYXNrIHRhc2sgY291bnQgYmUgbmVnYXRpdmUgbnVtYmVyCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXNrLmNhbmNlbEZuID09IG51bGwgfHwgKHRhc2suZGF0YSAmJiB0YXNrLmRhdGEuYWJvcnRlZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICB0YXNrLnpvbmUuY2FuY2VsVGFzayh0YXNrKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoWm9uZS5jdXJyZW50W2ZldGNoVGFza0Fib3J0aW5nXSA9PT0gdHJ1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgYWJvcnQgaXMgY2FsbGVkIGZyb20gZmV0Y2ggcG9seWZpbGwsIHdlIG5lZWQgdG8gY2FsbCBuYXRpdmUgYWJvcnQgb2YgWEhSLgogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYWJvcnROYXRpdmUuYXBwbHkoc2VsZiwgYXJncyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgd2UgYXJlIHRyeWluZyB0byBhYm9ydCBhbiBYSFIgd2hpY2ggaGFzIG5vdCB5ZXQgYmVlbiBzZW50LCBzbyB0aGVyZSBpcyBubwogICAgICAgICAgICAgICAgICAgIC8vIHRhc2sKICAgICAgICAgICAgICAgICAgICAvLyB0byBjYW5jZWwuIERvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICB9OyB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIFpvbmUuX19sb2FkX3BhdGNoKCdnZW9sb2NhdGlvbicsIGZ1bmN0aW9uIChnbG9iYWwpIHsKICAgICAgICAgICAgLy8vIEdFT19MT0NBVElPTgogICAgICAgICAgICBpZiAoZ2xvYmFsWyduYXZpZ2F0b3InXSAmJiBnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICBwYXRjaFByb3RvdHlwZShnbG9iYWxbJ25hdmlnYXRvciddLmdlb2xvY2F0aW9uLCBbJ2dldEN1cnJlbnRQb3NpdGlvbicsICd3YXRjaFBvc2l0aW9uJ10pOwogICAgICAgICAgICB9CiAgICAgICAgfSk7CiAgICAgICAgWm9uZS5fX2xvYWRfcGF0Y2goJ1Byb21pc2VSZWplY3Rpb25FdmVudCcsIGZ1bmN0aW9uIChnbG9iYWwsIFpvbmUpIHsKICAgICAgICAgICAgLy8gaGFuZGxlIHVuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbgogICAgICAgICAgICBmdW5jdGlvbiBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoZXZ0TmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIChlKSB7CiAgICAgICAgICAgICAgICAgICAgdmFyIGV2ZW50VGFza3MgPSBmaW5kRXZlbnRUYXNrcyhnbG9iYWwsIGV2dE5hbWUpOwogICAgICAgICAgICAgICAgICAgIGV2ZW50VGFza3MuZm9yRWFjaChmdW5jdGlvbiAoZXZlbnRUYXNrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbmRvd3MgaGFzIGFkZGVkIHVuaGFuZGxlZHJlamVjdGlvbiBldmVudCBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmlnZ2VyIHRoZSBldmVudCBsaXN0ZW5lcgogICAgICAgICAgICAgICAgICAgICAgICB2YXIgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID0gZ2xvYmFsWydQcm9taXNlUmVqZWN0aW9uRXZlbnQnXTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFByb21pc2VSZWplY3Rpb25FdmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGV2dCA9IG5ldyBQcm9taXNlUmVqZWN0aW9uRXZlbnQoZXZ0TmFtZSwgeyBwcm9taXNlOiBlLnByb21pc2UsIHJlYXNvbjogZS5yZWplY3Rpb24gfSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudFRhc2suaW52b2tlKGV2dCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGdsb2JhbFsnUHJvbWlzZVJlamVjdGlvbkV2ZW50J10pIHsKICAgICAgICAgICAgICAgIFpvbmVbem9uZVN5bWJvbCgndW5oYW5kbGVkUHJvbWlzZVJlamVjdGlvbkhhbmRsZXInKV0gPQogICAgICAgICAgICAgICAgICAgIGZpbmRQcm9taXNlUmVqZWN0aW9uSGFuZGxlcigndW5oYW5kbGVkcmVqZWN0aW9uJyk7CiAgICAgICAgICAgICAgICBab25lW3pvbmVTeW1ib2woJ3JlamVjdGlvbkhhbmRsZWRIYW5kbGVyJyldID0KICAgICAgICAgICAgICAgICAgICBmaW5kUHJvbWlzZVJlamVjdGlvbkhhbmRsZXIoJ3JlamVjdGlvbmhhbmRsZWQnKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgfSkpKTsKCiAgICAvKioKICAgICAqIEBsaWNlbnNlIEFuZ3VsYXIgdjkuMS4xMgogICAgICogKGMpIDIwMTAtMjAyMCBHb29nbGUgTExDLiBodHRwczovL2FuZ3VsYXIuaW8vCiAgICAgKiBMaWNlbnNlOiBNSVQKICAgICAqLwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9zcmMvYW5pbWF0aW9uX2J1aWxkZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBbiBpbmplY3RhYmxlIHNlcnZpY2UgdGhhdCBwcm9kdWNlcyBhbiBhbmltYXRpb24gc2VxdWVuY2UgcHJvZ3JhbW1hdGljYWxseSB3aXRoaW4gYW4KICAgICAqIEFuZ3VsYXIgY29tcG9uZW50IG9yIGRpcmVjdGl2ZS4KICAgICAqIFByb3ZpZGVkIGJ5IHRoZSBgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGVgIG9yIGBOb29wQW5pbWF0aW9uc01vZHVsZWAuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogVG8gdXNlIHRoaXMgc2VydmljZSwgYWRkIGl0IHRvIHlvdXIgY29tcG9uZW50IG9yIGRpcmVjdGl2ZSBhcyBhIGRlcGVuZGVuY3kuCiAgICAgKiBUaGUgc2VydmljZSBpcyBpbnN0YW50aWF0ZWQgYWxvbmcgd2l0aCB5b3VyIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBBcHBzIGRvIG5vdCB0eXBpY2FsbHkgbmVlZCB0byBjcmVhdGUgdGhlaXIgb3duIGFuaW1hdGlvbiBwbGF5ZXJzLCBidXQgaWYgeW91CiAgICAgKiBkbyBuZWVkIHRvLCBmb2xsb3cgdGhlc2Ugc3RlcHM6CiAgICAgKgogICAgICogMS4gVXNlIHRoZSBgYnVpbGQoKWAgbWV0aG9kIHRvIGNyZWF0ZSBhIHByb2dyYW1tYXRpYyBhbmltYXRpb24gdXNpbmcgdGhlCiAgICAgKiBgYW5pbWF0ZSgpYCBmdW5jdGlvbi4gVGhlIG1ldGhvZCByZXR1cm5zIGFuIGBBbmltYXRpb25GYWN0b3J5YCBpbnN0YW5jZS4KICAgICAqCiAgICAgKiAyLiBVc2UgdGhlIGZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBhbiBgQW5pbWF0aW9uUGxheWVyYCBhbmQgYXR0YWNoIGl0IHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogMy4gVXNlIHRoZSBwbGF5ZXIgb2JqZWN0IHRvIGNvbnRyb2wgdGhlIGFuaW1hdGlvbiBwcm9ncmFtbWF0aWNhbGx5LgogICAgICoKICAgICAqIEZvciBleGFtcGxlOgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiAvLyBpbXBvcnQgdGhlIHNlcnZpY2UgZnJvbSBCcm93c2VyQW5pbWF0aW9uc01vZHVsZQogICAgICogaW1wb3J0IHtBbmltYXRpb25CdWlsZGVyfSBmcm9tICdcQGFuZ3VsYXIvYW5pbWF0aW9ucyc7CiAgICAgKiAvLyByZXF1aXJlIHRoZSBzZXJ2aWNlIGFzIGEgZGVwZW5kZW5jeQogICAgICogY2xhc3MgTXlDbXAgewogICAgICogICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9idWlsZGVyOiBBbmltYXRpb25CdWlsZGVyKSB7fQogICAgICoKICAgICAqICAgbWFrZUFuaW1hdGlvbihlbGVtZW50OiBhbnkpIHsKICAgICAqICAgICAvLyBmaXJzdCBkZWZpbmUgYSByZXVzYWJsZSBhbmltYXRpb24KICAgICAqICAgICBjb25zdCBteUFuaW1hdGlvbiA9IHRoaXMuX2J1aWxkZXIuYnVpbGQoWwogICAgICogICAgICAgc3R5bGUoeyB3aWR0aDogMCB9KSwKICAgICAqICAgICAgIGFuaW1hdGUoMTAwMCwgc3R5bGUoeyB3aWR0aDogJzEwMHB4JyB9KSkKICAgICAqICAgICBdKTsKICAgICAqCiAgICAgKiAgICAgLy8gdXNlIHRoZSByZXR1cm5lZCBmYWN0b3J5IG9iamVjdCB0byBjcmVhdGUgYSBwbGF5ZXIKICAgICAqICAgICBjb25zdCBwbGF5ZXIgPSBteUFuaW1hdGlvbi5jcmVhdGUoZWxlbWVudCk7CiAgICAgKgogICAgICogICAgIHBsYXllci5wbGF5KCk7CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgQW5pbWF0aW9uQnVpbGRlciB7CiAgICB9CiAgICAvKioKICAgICAqIEEgZmFjdG9yeSBvYmplY3QgcmV0dXJuZWQgZnJvbSB0aGUgYEFuaW1hdGlvbkJ1aWxkZXJgLmBidWlsZCgpYCBtZXRob2QuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBBbmltYXRpb25GYWN0b3J5IHsKICAgIH0KICAgIC8qKgogICAgICogU3BlY2lmaWVzIGF1dG9tYXRpYyBzdHlsaW5nLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQVVUT19TVFlMRSA9ICcqJzsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhIG5hbWVkIGFuaW1hdGlvbiB0cmlnZ2VyLCBjb250YWluaW5nIGEgIGxpc3Qgb2YgYHN0YXRlKClgCiAgICAgKiBhbmQgYHRyYW5zaXRpb24oKWAgZW50cmllcyB0byBiZSBldmFsdWF0ZWQgd2hlbiB0aGUgZXhwcmVzc2lvbgogICAgICogYm91bmQgdG8gdGhlIHRyaWdnZXIgY2hhbmdlcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIERlZmluZSBhbiBhbmltYXRpb24gdHJpZ2dlciBpbiB0aGUgYGFuaW1hdGlvbnNgIHNlY3Rpb24gb2YgYFxAQ29tcG9uZW50YCBtZXRhZGF0YS4KICAgICAqIEluIHRoZSB0ZW1wbGF0ZSwgcmVmZXJlbmNlIHRoZSB0cmlnZ2VyIGJ5IG5hbWUgYW5kIGJpbmQgaXQgdG8gYSB0cmlnZ2VyIGV4cHJlc3Npb24gdGhhdAogICAgICogZXZhbHVhdGVzIHRvIGEgZGVmaW5lZCBhbmltYXRpb24gc3RhdGUsIHVzaW5nIHRoZSBmb2xsb3dpbmcgZm9ybWF0OgogICAgICoKICAgICAqIGBbXEB0cmlnZ2VyTmFtZV09ImV4cHJlc3Npb24iYAogICAgICoKICAgICAqIEFuaW1hdGlvbiB0cmlnZ2VyIGJpbmRpbmdzIGNvbnZlcnQgYWxsIHZhbHVlcyB0byBzdHJpbmdzLCBhbmQgdGhlbiBtYXRjaCB0aGUKICAgICAqIHByZXZpb3VzIGFuZCBjdXJyZW50IHZhbHVlcyBhZ2FpbnN0IGFueSBsaW5rZWQgdHJhbnNpdGlvbnMuCiAgICAgKiBCb29sZWFucyBjYW4gYmUgc3BlY2lmaWVkIGFzIGAxYCBvciBgdHJ1ZWAgYW5kIGAwYCBvciBgZmFsc2VgLgogICAgICoKICAgICAqICMjIyBVc2FnZSBFeGFtcGxlCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNyZWF0ZXMgYW4gYW5pbWF0aW9uIHRyaWdnZXIgcmVmZXJlbmNlIGJhc2VkIG9uIHRoZSBwcm92aWRlZAogICAgICogbmFtZSB2YWx1ZS4KICAgICAqIFRoZSBwcm92aWRlZCBhbmltYXRpb24gdmFsdWUgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXkgY29uc2lzdGluZyBvZiBzdGF0ZSBhbmQKICAgICAqIHRyYW5zaXRpb24gZGVjbGFyYXRpb25zLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgc2VsZWN0b3I6ICJteS1jb21wb25lbnQiLAogICAgICogICB0ZW1wbGF0ZVVybDogIm15LWNvbXBvbmVudC10cGwuaHRtbCIsCiAgICAgKiAgIGFuaW1hdGlvbnM6IFsKICAgICAqICAgICB0cmlnZ2VyKCJteUFuaW1hdGlvblRyaWdnZXIiLCBbCiAgICAgKiAgICAgICBzdGF0ZSguLi4pLAogICAgICogICAgICAgc3RhdGUoLi4uKSwKICAgICAqICAgICAgIHRyYW5zaXRpb24oLi4uKSwKICAgICAqICAgICAgIHRyYW5zaXRpb24oLi4uKQogICAgICogICAgIF0pCiAgICAgKiAgIF0KICAgICAqIH0pCiAgICAgKiBjbGFzcyBNeUNvbXBvbmVudCB7CiAgICAgKiAgIG15U3RhdHVzRXhwID0gInNvbWV0aGluZyI7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgdGVtcGxhdGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29tcG9uZW50IG1ha2VzIHVzZSBvZiB0aGUgZGVmaW5lZCB0cmlnZ2VyCiAgICAgKiBieSBiaW5kaW5nIHRvIGFuIGVsZW1lbnQgd2l0aGluIGl0cyB0ZW1wbGF0ZSBjb2RlLgogICAgICoKICAgICAqIGBgYGh0bWwKICAgICAqIDwhLS0gc29tZXdoZXJlIGluc2lkZSBvZiBteS1jb21wb25lbnQtdHBsLmh0bWwgLS0+CiAgICAgKiA8ZGl2IFtcQG15QW5pbWF0aW9uVHJpZ2dlcl09Im15U3RhdHVzRXhwIj4uLi48L2Rpdj4KICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBVc2luZyBhbiBpbmxpbmUgZnVuY3Rpb24KICAgICAqIFRoZSBgdHJhbnNpdGlvbmAgYW5pbWF0aW9uIG1ldGhvZCBhbHNvIHN1cHBvcnRzIHJlYWRpbmcgYW4gaW5saW5lIGZ1bmN0aW9uIHdoaWNoIGNhbiBkZWNpZGUKICAgICAqIGlmIGl0cyBhc3NvY2lhdGVkIGFuaW1hdGlvbiBzaG91bGQgYmUgcnVuLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIC8vIHRoaXMgbWV0aG9kIGlzIHJ1biBlYWNoIHRpbWUgdGhlIGBteUFuaW1hdGlvblRyaWdnZXJgIHRyaWdnZXIgdmFsdWUgY2hhbmdlcy4KICAgICAqIGZ1bmN0aW9uIG15SW5saW5lTWF0Y2hlckZuKGZyb21TdGF0ZTogc3RyaW5nLCB0b1N0YXRlOiBzdHJpbmcsIGVsZW1lbnQ6IGFueSwgcGFyYW1zOiB7W2tleToKICAgICAqIHN0cmluZ106IGFueX0pOiBib29sZWFuIHsKICAgICAqICAgLy8gbm90aWNlIHRoYXQgYGVsZW1lbnRgIGFuZCBgcGFyYW1zYCBhcmUgYWxzbyBhdmFpbGFibGUgaGVyZQogICAgICogICByZXR1cm4gdG9TdGF0ZSA9PSAneWVzLXBsZWFzZS1hbmltYXRlJzsKICAgICAqIH0KICAgICAqICAvCiAgICAgKiAgIHNlbGVjdG9yOiAnbXktY29tcG9uZW50JywKICAgICAqICAgdGVtcGxhdGVVcmw6ICdteS1jb21wb25lbnQtdHBsLmh0bWwnLAogICAgICogICBhbmltYXRpb25zOiBbCiAgICAgKiAgICAgdHJpZ2dlcignbXlBbmltYXRpb25UcmlnZ2VyJywgWwogICAgICogICAgICAgdHJhbnNpdGlvbihteUlubGluZU1hdGNoZXJGbiwgWwogICAgICogICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIHNlcXVlbmNlIGNvZGUKICAgICAqICAgICAgIF0pLAogICAgICogICAgIF0pCiAgICAgKiAgIF0KICAgICAqIH0pCiAgICAgKiBjbGFzcyBNeUNvbXBvbmVudCB7CiAgICAgKiAgIG15U3RhdHVzRXhwID0gInllcy1wbGVhc2UtYW5pbWF0ZSI7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgRGlzYWJsaW5nIEFuaW1hdGlvbnMKICAgICAqIFdoZW4gdHJ1ZSwgdGhlIHNwZWNpYWwgYW5pbWF0aW9uIGNvbnRyb2wgYmluZGluZyBgXEAuZGlzYWJsZWRgIGJpbmRpbmcgcHJldmVudHMKICAgICAqIGFsbCBhbmltYXRpb25zIGZyb20gcmVuZGVyaW5nLgogICAgICogUGxhY2UgdGhlICBgXEAuZGlzYWJsZWRgIGJpbmRpbmcgb24gYW4gZWxlbWVudCB0byBkaXNhYmxlCiAgICAgKiBhbmltYXRpb25zIG9uIHRoZSBlbGVtZW50IGl0c2VsZiwgYXMgd2VsbCBhcyBhbnkgaW5uZXIgYW5pbWF0aW9uIHRyaWdnZXJzCiAgICAgKiB3aXRoaW4gdGhlIGVsZW1lbnQuCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgdGhpcyBmZWF0dXJlOgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQgLwogICAgICogICBzZWxlY3RvcjogJ215LWNvbXBvbmVudCcsCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgICAgPGRpdiBbXEAuZGlzYWJsZWRdPSJpc0Rpc2FibGVkIj4KICAgICAqICAgICAgIDxkaXYgW1xAY2hpbGRBbmltYXRpb25dPSJleHAiPjwvZGl2PgogICAgICogICAgIDwvZGl2PgogICAgICogICBgLAogICAgICogICBhbmltYXRpb25zOiBbCiAgICAgKiAgICAgdHJpZ2dlcigiY2hpbGRBbmltYXRpb24iLCBbCiAgICAgKiAgICAgICAvLyAuLi4KICAgICAqICAgICBdKQogICAgICogICBdCiAgICAgKiB9KQogICAgICogY2xhc3MgTXlDb21wb25lbnQgewogICAgICogICBpc0Rpc2FibGVkID0gdHJ1ZTsKICAgICAqICAgZXhwID0gJy4uLic7CiAgICAgKiB9CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBXaGVuIGBcQC5kaXNhYmxlZGAgaXMgdHJ1ZSwgaXQgcHJldmVudHMgdGhlIGBcQGNoaWxkQW5pbWF0aW9uYCB0cmlnZ2VyIGZyb20gYW5pbWF0aW5nLAogICAgICogYWxvbmcgd2l0aCBhbnkgaW5uZXIgYW5pbWF0aW9ucy4KICAgICAqCiAgICAgKiAjIyMgRGlzYWJsZSBhbmltYXRpb25zIGFwcGxpY2F0aW9uLXdpZGUKICAgICAqIFdoZW4gYW4gYXJlYSBvZiB0aGUgdGVtcGxhdGUgaXMgc2V0IHRvIGhhdmUgYW5pbWF0aW9ucyBkaXNhYmxlZCwKICAgICAqICoqYWxsKiogaW5uZXIgY29tcG9uZW50cyBoYXZlIHRoZWlyIGFuaW1hdGlvbnMgZGlzYWJsZWQgYXMgd2VsbC4KICAgICAqIFRoaXMgbWVhbnMgdGhhdCB5b3UgY2FuIGRpc2FibGUgYWxsIGFuaW1hdGlvbnMgZm9yIGFuIGFwcAogICAgICogYnkgcGxhY2luZyBhIGhvc3QgYmluZGluZyBzZXQgb24gYFxALmRpc2FibGVkYCBvbiB0aGUgdG9wbW9zdCBBbmd1bGFyIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBpbXBvcnQge0NvbXBvbmVudCwgSG9zdEJpbmRpbmd9IGZyb20gJ1xAYW5ndWxhci9jb3JlJzsKICAgICAqICAvCiAgICAgKiAgIHNlbGVjdG9yOiAnYXBwLWNvbXBvbmVudCcsCiAgICAgKiAgIHRlbXBsYXRlVXJsOiAnYXBwLmNvbXBvbmVudC5odG1sJywKICAgICAqIH0pCiAgICAgKiBjbGFzcyBBcHBDb21wb25lbnQgewogICAgICogXEBIb3N0QmluZGluZygnQC5kaXNhYmxlZCcpCiAgICAgKiAgIHB1YmxpYyBhbmltYXRpb25zRGlzYWJsZWQgPSB0cnVlOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIE92ZXJyaWRpbmcgZGlzYWJsZW1lbnQgb2YgaW5uZXIgYW5pbWF0aW9ucwogICAgICogRGVzcGl0ZSBpbm5lciBhbmltYXRpb25zIGJlaW5nIGRpc2FibGVkLCBhIHBhcmVudCBhbmltYXRpb24gY2FuIGBxdWVyeSgpYAogICAgICogZm9yIGlubmVyIGVsZW1lbnRzIGxvY2F0ZWQgaW4gZGlzYWJsZWQgYXJlYXMgb2YgdGhlIHRlbXBsYXRlIGFuZCBzdGlsbCBhbmltYXRlCiAgICAgKiB0aGVtIGlmIG5lZWRlZC4gVGhpcyBpcyBhbHNvIHRoZSBjYXNlIGZvciB3aGVuIGEgc3ViIGFuaW1hdGlvbiBpcwogICAgICogcXVlcmllZCBieSBhIHBhcmVudCBhbmQgdGhlbiBsYXRlciBhbmltYXRlZCB1c2luZyBgYW5pbWF0ZUNoaWxkKClgLgogICAgICoKICAgICAqICMjIyBEZXRlY3Rpbmcgd2hlbiBhbiBhbmltYXRpb24gaXMgZGlzYWJsZWQKICAgICAqIElmIGEgcmVnaW9uIG9mIHRoZSBET00gKG9yIHRoZSBlbnRpcmUgYXBwbGljYXRpb24pIGhhcyBpdHMgYW5pbWF0aW9ucyBkaXNhYmxlZCwgdGhlIGFuaW1hdGlvbgogICAgICogdHJpZ2dlciBjYWxsYmFja3Mgc3RpbGwgZmlyZSwgYnV0IGZvciB6ZXJvIHNlY29uZHMuIFdoZW4gdGhlIGNhbGxiYWNrIGZpcmVzLCBpdCBwcm92aWRlcwogICAgICogYW4gaW5zdGFuY2Ugb2YgYW4gYEFuaW1hdGlvbkV2ZW50YC4gSWYgYW5pbWF0aW9ucyBhcmUgZGlzYWJsZWQsCiAgICAgKiB0aGUgYC5kaXNhYmxlZGAgZmxhZyBvbiB0aGUgZXZlbnQgaXMgdHJ1ZS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBuYW1lIEFuIGlkZW50aWZ5aW5nIHN0cmluZy4KICAgICAqIEBwYXJhbSB7P30gZGVmaW5pdGlvbnMgIEFuIGFuaW1hdGlvbiBkZWZpbml0aW9uIG9iamVjdCwgY29udGFpbmluZyBhbiBhcnJheSBvZiBgc3RhdGUoKWAKICAgICAqIGFuZCBgdHJhbnNpdGlvbigpYCBkZWNsYXJhdGlvbnMuCiAgICAgKgogICAgICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSB0cmlnZ2VyIGRhdGEuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiB0cmlnZ2VyKG5hbWUsIGRlZmluaXRpb25zKSB7CiAgICAgICAgcmV0dXJuIHsgdHlwZTogNyAvKiBUcmlnZ2VyICovLCBuYW1lLCBkZWZpbml0aW9ucywgb3B0aW9uczoge30gfTsKICAgIH0KICAgIC8qKgogICAgICogRGVmaW5lcyBhbiBhbmltYXRpb24gc3RlcCB0aGF0IGNvbWJpbmVzIHN0eWxpbmcgaW5mb3JtYXRpb24gd2l0aCB0aW1pbmcgaW5mb3JtYXRpb24uCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBDYWxsIHdpdGhpbiBhbiBhbmltYXRpb24gYHNlcXVlbmNlKClgLCBge1xAbGluayBhbmltYXRpb25zL2dyb3VwIGdyb3VwKCl9YCwgb3IKICAgICAqIGB0cmFuc2l0aW9uKClgIGNhbGwgdG8gc3BlY2lmeSBhbiBhbmltYXRpb24gc3RlcAogICAgICogdGhhdCBhcHBsaWVzIGdpdmVuIHN0eWxlIGRhdGEgdG8gdGhlIHBhcmVudCBhbmltYXRpb24gZm9yIGEgZ2l2ZW4gYW1vdW50IG9mIHRpbWUuCiAgICAgKgogICAgICogIyMjIFN5bnRheCBFeGFtcGxlcwogICAgICogKipUaW1pbmcgZXhhbXBsZXMqKgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyB2YXJpb3VzIGB0aW1pbmdzYCBzcGVjaWZpY2F0aW9ucy4KICAgICAqIC0gYGFuaW1hdGUoNTAwKWAgOiBEdXJhdGlvbiBpcyA1MDAgbWlsbGlzZWNvbmRzLgogICAgICogLSBgYW5pbWF0ZSgiMXMiKWAgOiBEdXJhdGlvbiBpcyAxMDAwIG1pbGxpc2Vjb25kcy4KICAgICAqIC0gYGFuaW1hdGUoIjEwMG1zIDAuNXMiKWAgOiBEdXJhdGlvbiBpcyAxMDAgbWlsbGlzZWNvbmRzLCBkZWxheSBpcyA1MDAgbWlsbGlzZWNvbmRzLgogICAgICogLSBgYW5pbWF0ZSgiNXMgZWFzZS1pbiIpYCA6IER1cmF0aW9uIGlzIDUwMDAgbWlsbGlzZWNvbmRzLCBlYXNpbmcgaW4uCiAgICAgKiAtIGBhbmltYXRlKCI1cyAxMG1zIGN1YmljLWJlemllciguMTcsLjY3LC44OCwuMSkiKWAgOiBEdXJhdGlvbiBpcyA1MDAwIG1pbGxpc2Vjb25kcywgZGVsYXkgaXMgMTAKICAgICAqIG1pbGxpc2Vjb25kcywgZWFzaW5nIGFjY29yZGluZyB0byBhIGJlemllciBjdXJ2ZS4KICAgICAqCiAgICAgKiAqKlN0eWxlIGV4YW1wbGVzKioKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgY2FsbHMgYHN0eWxlKClgIHRvIHNldCBhIHNpbmdsZSBDU1Mgc3R5bGUuCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiBhbmltYXRlKDUwMCwgc3R5bGUoeyBiYWNrZ3JvdW5kOiAicmVkIiB9KSkKICAgICAqIGBgYAogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIGNhbGxzIGBrZXlmcmFtZXMoKWAgdG8gc2V0IGEgQ1NTIHN0eWxlCiAgICAgKiB0byBkaWZmZXJlbnQgdmFsdWVzIGZvciBzdWNjZXNzaXZlIGtleWZyYW1lcy4KICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGFuaW1hdGUoNTAwLCBrZXlmcmFtZXMoCiAgICAgKiAgWwogICAgICogICBzdHlsZSh7IGJhY2tncm91bmQ6ICJibHVlIiB9KSksCiAgICAgKiAgIHN0eWxlKHsgYmFja2dyb3VuZDogInJlZCIgfSkpCiAgICAgKiAgXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IHRpbWluZ3MgU2V0cyBgQW5pbWF0ZVRpbWluZ3NgIGZvciB0aGUgcGFyZW50IGFuaW1hdGlvbi4KICAgICAqIEEgc3RyaW5nIGluIHRoZSBmb3JtYXQgImR1cmF0aW9uIFtkZWxheV0gW2Vhc2luZ10iLgogICAgICogIC0gRHVyYXRpb24gYW5kIGRlbGF5IGFyZSBleHByZXNzZWQgYXMgYSBudW1iZXIgYW5kIG9wdGlvbmFsIHRpbWUgdW5pdCwKICAgICAqIHN1Y2ggYXMgIjFzIiBvciAiMTBtcyIgZm9yIG9uZSBzZWNvbmQgYW5kIDEwIG1pbGxpc2Vjb25kcywgcmVzcGVjdGl2ZWx5LgogICAgICogVGhlIGRlZmF1bHQgdW5pdCBpcyBtaWxsaXNlY29uZHMuCiAgICAgKiAgLSBUaGUgZWFzaW5nIHZhbHVlIGNvbnRyb2xzIGhvdyB0aGUgYW5pbWF0aW9uIGFjY2VsZXJhdGVzIGFuZCBkZWNlbGVyYXRlcwogICAgICogZHVyaW5nIGl0cyBydW50aW1lLiBWYWx1ZSBpcyBvbmUgb2YgIGBlYXNlYCwgYGVhc2UtaW5gLCBgZWFzZS1vdXRgLAogICAgICogYGVhc2UtaW4tb3V0YCwgb3IgYSBgY3ViaWMtYmV6aWVyKClgIGZ1bmN0aW9uIGNhbGwuCiAgICAgKiBJZiBub3Qgc3VwcGxpZWQsIG5vIGVhc2luZyBpcyBhcHBsaWVkLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLCB0aGUgc3RyaW5nICIxcyAxMDBtcyBlYXNlLW91dCIgc3BlY2lmaWVzIGEgZHVyYXRpb24gb2YKICAgICAqIDEwMDAgbWlsbGlzZWNvbmRzLCBhbmQgZGVsYXkgb2YgMTAwIG1zLCBhbmQgdGhlICJlYXNlLW91dCIgZWFzaW5nIHN0eWxlLAogICAgICogd2hpY2ggZGVjZWxlcmF0ZXMgbmVhciB0aGUgZW5kIG9mIHRoZSBkdXJhdGlvbi4KICAgICAqIEBwYXJhbSB7Pz19IHN0eWxlcyBTZXRzIEFuaW1hdGlvblN0eWxlcyBmb3IgdGhlIHBhcmVudCBhbmltYXRpb24uCiAgICAgKiBBIGZ1bmN0aW9uIGNhbGwgdG8gZWl0aGVyIGBzdHlsZSgpYCBvciBga2V5ZnJhbWVzKClgCiAgICAgKiB0aGF0IHJldHVybnMgYSBjb2xsZWN0aW9uIG9mIENTUyBzdHlsZSBlbnRyaWVzIHRvIGJlIGFwcGxpZWQgdG8gdGhlIHBhcmVudCBhbmltYXRpb24uCiAgICAgKiBXaGVuIG51bGwsIHVzZXMgdGhlIHN0eWxlcyBmcm9tIHRoZSBkZXN0aW5hdGlvbiBzdGF0ZS4KICAgICAqIFRoaXMgaXMgdXNlZnVsIHdoZW4gZGVzY3JpYmluZyBhbiBhbmltYXRpb24gc3RlcCB0aGF0IHdpbGwgY29tcGxldGUgYW4gYW5pbWF0aW9uOwogICAgICogc2VlICJBbmltYXRpbmcgdG8gdGhlIGZpbmFsIHN0YXRlIiBpbiBgdHJhbnNpdGlvbnMoKWAuCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGFuaW1hdGlvbiBzdGVwLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gYW5pbWF0ZSh0aW1pbmdzLCBzdHlsZXMgPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHsgdHlwZTogNCAvKiBBbmltYXRlICovLCBzdHlsZXMsIHRpbWluZ3MgfTsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbiBEZWZpbmVzIGEgbGlzdCBvZiBhbmltYXRpb24gc3RlcHMgdG8gYmUgcnVuIGluIHBhcmFsbGVsLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogR3JvdXBlZCBhbmltYXRpb25zIGFyZSB1c2VmdWwgd2hlbiBhIHNlcmllcyBvZiBzdHlsZXMgbXVzdCBiZQogICAgICogYW5pbWF0ZWQgYXQgZGlmZmVyZW50IHN0YXJ0aW5nIHRpbWVzIGFuZCBjbG9zZWQgb2ZmIGF0IGRpZmZlcmVudCBlbmRpbmcgdGltZXMuCiAgICAgKgogICAgICogV2hlbiBjYWxsZWQgd2l0aGluIGEgYHNlcXVlbmNlKClgIG9yIGEKICAgICAqIGB0cmFuc2l0aW9uKClgIGNhbGwsIGRvZXMgbm90IGNvbnRpbnVlIHRvIHRoZSBuZXh0CiAgICAgKiBpbnN0cnVjdGlvbiB1bnRpbCBhbGwgb2YgdGhlIGlubmVyIGFuaW1hdGlvbiBzdGVwcyBoYXZlIGNvbXBsZXRlZC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHBhcmFtIHs/fSBzdGVwcyBBbiBhcnJheSBvZiBhbmltYXRpb24gc3RlcCBvYmplY3RzLgogICAgICogLSBXaGVuIHN0ZXBzIGFyZSBkZWZpbmVkIGJ5IGBzdHlsZSgpYCBvciBgYW5pbWF0ZSgpYAogICAgICogZnVuY3Rpb24gY2FsbHMsIGVhY2ggY2FsbCB3aXRoaW4gdGhlIGdyb3VwIGlzIGV4ZWN1dGVkIGluc3RhbnRseS4KICAgICAqIC0gVG8gc3BlY2lmeSBvZmZzZXQgc3R5bGVzIHRvIGJlIGFwcGxpZWQgYXQgYSBsYXRlciB0aW1lLCBkZWZpbmUgc3RlcHMgd2l0aAogICAgICogYGtleWZyYW1lcygpYCwgb3IgdXNlIGBhbmltYXRlKClgIGNhbGxzIHdpdGggYSBkZWxheSB2YWx1ZS4KICAgICAqIEZvciBleGFtcGxlOgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIGdyb3VwKFsKICAgICAqICAgYW5pbWF0ZSgiMXMiLCBzdHlsZSh7IGJhY2tncm91bmQ6ICJibGFjayIgfSkpLAogICAgICogICBhbmltYXRlKCIycyIsIHN0eWxlKHsgY29sb3I6ICJ3aGl0ZSIgfSkpCiAgICAgKiBdKQogICAgICogYGBgCiAgICAgKgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBBbiBvcHRpb25zIG9iamVjdCBjb250YWluaW5nIGEgZGVsYXkgYW5kCiAgICAgKiBkZXZlbG9wZXItZGVmaW5lZCBwYXJhbWV0ZXJzIHRoYXQgcHJvdmlkZSBzdHlsaW5nIGRlZmF1bHRzIGFuZAogICAgICogY2FuIGJlIG92ZXJyaWRkZW4gb24gaW52b2NhdGlvbi4KICAgICAqCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIGdyb3VwIGRhdGEuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBncm91cChzdGVwcywgb3B0aW9ucyA9IG51bGwpIHsKICAgICAgICByZXR1cm4geyB0eXBlOiAzIC8qIEdyb3VwICovLCBzdGVwcywgb3B0aW9ucyB9OwogICAgfQogICAgLyoqCiAgICAgKiBEZWZpbmVzIGEgbGlzdCBvZiBhbmltYXRpb24gc3RlcHMgdG8gYmUgcnVuIHNlcXVlbnRpYWxseSwgb25lIGJ5IG9uZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIFdoZW4geW91IHBhc3MgYW4gYXJyYXkgb2Ygc3RlcHMgdG8gYQogICAgICogYHRyYW5zaXRpb24oKWAgY2FsbCwgdGhlIHN0ZXBzIHJ1biBzZXF1ZW50aWFsbHkgYnkgZGVmYXVsdC4KICAgICAqIENvbXBhcmUgdGhpcyB0byB0aGUgYHtcQGxpbmsgYW5pbWF0aW9ucy9ncm91cCBncm91cCgpfWAgY2FsbCwgd2hpY2ggcnVucyBhbmltYXRpb24gc3RlcHMgaW4KICAgICAqIHBhcmFsbGVsLgogICAgICoKICAgICAqIFdoZW4gYSBzZXF1ZW5jZSBpcyB1c2VkIHdpdGhpbiBhIGB7XEBsaW5rIGFuaW1hdGlvbnMvZ3JvdXAgZ3JvdXAoKX1gIG9yIGEgYHRyYW5zaXRpb24oKWAgY2FsbCwKICAgICAqIGV4ZWN1dGlvbiBjb250aW51ZXMgdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gb25seSBhZnRlciBlYWNoIG9mIHRoZSBpbm5lciBhbmltYXRpb24KICAgICAqIHN0ZXBzIGhhdmUgY29tcGxldGVkLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBzdGVwcyBBbiBhcnJheSBvZiBhbmltYXRpb24gc3RlcCBvYmplY3RzLgogICAgICogLSBTdGVwcyBkZWZpbmVkIGJ5IGBzdHlsZSgpYCBjYWxscyBhcHBseSB0aGUgc3R5bGluZyBkYXRhIGltbWVkaWF0ZWx5LgogICAgICogLSBTdGVwcyBkZWZpbmVkIGJ5IGBhbmltYXRlKClgIGNhbGxzIGFwcGx5IHRoZSBzdHlsaW5nIGRhdGEgb3ZlciB0aW1lCiAgICAgKiAgIGFzIHNwZWNpZmllZCBieSB0aGUgdGltaW5nIGRhdGEuCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogc2VxdWVuY2UoWwogICAgICogICBzdHlsZSh7IG9wYWNpdHk6IDAgfSksCiAgICAgKiAgIGFuaW1hdGUoIjFzIiwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKQogICAgICogXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBhIGRlbGF5IGFuZAogICAgICogZGV2ZWxvcGVyLWRlZmluZWQgcGFyYW1ldGVycyB0aGF0IHByb3ZpZGUgc3R5bGluZyBkZWZhdWx0cyBhbmQKICAgICAqIGNhbiBiZSBvdmVycmlkZGVuIG9uIGludm9jYXRpb24uCiAgICAgKgogICAgICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzZXF1ZW5jZSBkYXRhLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gc2VxdWVuY2Uoc3RlcHMsIG9wdGlvbnMgPSBudWxsKSB7CiAgICAgICAgcmV0dXJuIHsgdHlwZTogMiAvKiBTZXF1ZW5jZSAqLywgc3RlcHMsIG9wdGlvbnMgfTsKICAgIH0KICAgIC8qKgogICAgICogRGVjbGFyZXMgYSBrZXkvdmFsdWUgb2JqZWN0IGNvbnRhaW5pbmcgQ1NTIHByb3BlcnRpZXMvc3R5bGVzIHRoYXQKICAgICAqIGNhbiB0aGVuIGJlIHVzZWQgZm9yIGFuIGFuaW1hdGlvbiBgc3RhdGVgLCB3aXRoaW4gYW4gYW5pbWF0aW9uIGBzZXF1ZW5jZWAsCiAgICAgKiBvciBhcyBzdHlsaW5nIGRhdGEgZm9yIGNhbGxzIHRvIGBhbmltYXRlKClgIGFuZCBga2V5ZnJhbWVzKClgLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlcyBjcmVhdGUgYW5pbWF0aW9uIHN0eWxlcyB0aGF0IGNvbGxlY3QgYSBzZXQgb2YKICAgICAqIENTUyBwcm9wZXJ0eSB2YWx1ZXM6CiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogLy8gc3RyaW5nIHZhbHVlcyBmb3IgQ1NTIHByb3BlcnRpZXMKICAgICAqIHN0eWxlKHsgYmFja2dyb3VuZDogInJlZCIsIGNvbG9yOiAiYmx1ZSIgfSkKICAgICAqCiAgICAgKiAvLyBudW1lcmljYWwgcGl4ZWwgdmFsdWVzCiAgICAgKiBzdHlsZSh7IHdpZHRoOiAxMDAsIGhlaWdodDogMCB9KQogICAgICogYGBgCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgYXV0by1zdHlsaW5nIHRvIGFsbG93IGEgY29tcG9uZW50IHRvIGFuaW1hdGUgZnJvbQogICAgICogYSBoZWlnaHQgb2YgMCB1cCB0byB0aGUgaGVpZ2h0IG9mIHRoZSBwYXJlbnQgZWxlbWVudDoKICAgICAqCiAgICAgKiBgYGAKICAgICAqIHN0eWxlKHsgaGVpZ2h0OiAwIH0pLAogICAgICogYW5pbWF0ZSgiMXMiLCBzdHlsZSh7IGhlaWdodDogIioiIH0pKQogICAgICogYGBgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqCiAgICAgKiBAcGFyYW0gez99IHRva2VucyBBIHNldCBvZiBDU1Mgc3R5bGVzIG9yIEhUTUwgc3R5bGVzIGFzc29jaWF0ZWQgd2l0aCBhbiBhbmltYXRpb24gc3RhdGUuCiAgICAgKiBUaGUgdmFsdWUgY2FuIGJlIGFueSBvZiB0aGUgZm9sbG93aW5nOgogICAgICogLSBBIGtleS12YWx1ZSBzdHlsZSBwYWlyIGFzc29jaWF0aW5nIGEgQ1NTIHByb3BlcnR5IHdpdGggYSB2YWx1ZS4KICAgICAqIC0gQW4gYXJyYXkgb2Yga2V5LXZhbHVlIHN0eWxlIHBhaXJzLgogICAgICogLSBBbiBhc3RlcmlzayAoKiksIHRvIHVzZSBhdXRvLXN0eWxpbmcsIHdoZXJlIHN0eWxlcyBhcmUgZGVyaXZlZCBmcm9tIHRoZSBlbGVtZW50CiAgICAgKiBiZWluZyBhbmltYXRlZCBhbmQgYXBwbGllZCB0byB0aGUgYW5pbWF0aW9uIHdoZW4gaXQgc3RhcnRzLgogICAgICoKICAgICAqIEF1dG8tc3R5bGluZyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgYSBzdGF0ZSB0aGF0IGRlcGVuZHMgb24gbGF5b3V0IG9yIG90aGVyCiAgICAgKiBlbnZpcm9ubWVudGFsIGZhY3RvcnMuCiAgICAgKgogICAgICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBzdHlsZSBkYXRhLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gc3R5bGUodG9rZW5zKSB7CiAgICAgICAgcmV0dXJuIHsgdHlwZTogNiAvKiBTdHlsZSAqLywgc3R5bGVzOiB0b2tlbnMsIG9mZnNldDogbnVsbCB9OwogICAgfQogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbiBhbmltYXRpb24gc3RhdGUgd2l0aGluIGEgdHJpZ2dlciBhdHRhY2hlZCB0byBhbiBlbGVtZW50LgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICogVXNlIHRoZSBgdHJpZ2dlcigpYCBmdW5jdGlvbiB0byByZWdpc3RlciBzdGF0ZXMgdG8gYW4gYW5pbWF0aW9uIHRyaWdnZXIuCiAgICAgKiBVc2UgdGhlIGB0cmFuc2l0aW9uKClgIGZ1bmN0aW9uIHRvIGFuaW1hdGUgYmV0d2VlbiBzdGF0ZXMuCiAgICAgKiBXaGVuIGEgc3RhdGUgaXMgYWN0aXZlIHdpdGhpbiBhIGNvbXBvbmVudCwgaXRzIGFzc29jaWF0ZWQgc3R5bGVzIHBlcnNpc3Qgb24gdGhlIGVsZW1lbnQsCiAgICAgKiBldmVuIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBuYW1lIE9uZSBvciBtb3JlIG5hbWVzIGZvciB0aGUgZGVmaW5lZCBzdGF0ZSBpbiBhIGNvbW1hLXNlcGFyYXRlZCBzdHJpbmcuCiAgICAgKiBUaGUgZm9sbG93aW5nIHJlc2VydmVkIHN0YXRlIG5hbWVzIGNhbiBiZSBzdXBwbGllZCB0byBkZWZpbmUgYSBzdHlsZSBmb3Igc3BlY2lmaWMgdXNlCiAgICAgKiBjYXNlczoKICAgICAqCiAgICAgKiAtIGB2b2lkYCBZb3UgY2FuIGFzc29jaWF0ZSBzdHlsZXMgd2l0aCB0aGlzIG5hbWUgdG8gYmUgdXNlZCB3aGVuCiAgICAgKiB0aGUgZWxlbWVudCBpcyBkZXRhY2hlZCBmcm9tIHRoZSBhcHBsaWNhdGlvbi4gRm9yIGV4YW1wbGUsIHdoZW4gYW4gYG5nSWZgIGV2YWx1YXRlcwogICAgICogdG8gZmFsc2UsIHRoZSBzdGF0ZSBvZiB0aGUgYXNzb2NpYXRlZCBlbGVtZW50IGlzIHZvaWQuCiAgICAgKiAgLSBgKmAgKGFzdGVyaXNrKSBJbmRpY2F0ZXMgdGhlIGRlZmF1bHQgc3RhdGUuIFlvdSBjYW4gYXNzb2NpYXRlIHN0eWxlcyB3aXRoIHRoaXMgbmFtZQogICAgICogdG8gYmUgdXNlZCBhcyB0aGUgZmFsbGJhY2sgd2hlbiB0aGUgc3RhdGUgdGhhdCBpcyBiZWluZyBhbmltYXRlZCBpcyBub3QgZGVjbGFyZWQKICAgICAqIHdpdGhpbiB0aGUgdHJpZ2dlci4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHN0eWxlcyBBIHNldCBvZiBDU1Mgc3R5bGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YXRlLCBjcmVhdGVkIHVzaW5nIHRoZQogICAgICogYHN0eWxlKClgIGZ1bmN0aW9uLgogICAgICogVGhpcyBzZXQgb2Ygc3R5bGVzIHBlcnNpc3RzIG9uIHRoZSBlbGVtZW50IG9uY2UgdGhlIHN0YXRlIGhhcyBiZWVuIHJlYWNoZWQuCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIFBhcmFtZXRlcnMgdGhhdCBjYW4gYmUgcGFzc2VkIHRvIHRoZSBzdGF0ZSB3aGVuIGl0IGlzIGludm9rZWQuCiAgICAgKiAwIG9yIG1vcmUga2V5LXZhbHVlIHBhaXJzLgogICAgICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBuZXcgc3RhdGUgZGF0YS4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0YXRlKG5hbWUsIHN0eWxlcywgb3B0aW9ucykgewogICAgICAgIHJldHVybiB7IHR5cGU6IDAgLyogU3RhdGUgKi8sIG5hbWUsIHN0eWxlcywgb3B0aW9ucyB9OwogICAgfQogICAgLyoqCiAgICAgKiBEZWZpbmVzIGEgc2V0IG9mIGFuaW1hdGlvbiBzdHlsZXMsIGFzc29jaWF0aW5nIGVhY2ggc3R5bGUgd2l0aCBhbiBvcHRpb25hbCBgb2Zmc2V0YCB2YWx1ZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIFVzZSB3aXRoIHRoZSBgYW5pbWF0ZSgpYCBjYWxsLiBJbnN0ZWFkIG9mIGFwcGx5aW5nIGFuaW1hdGlvbnMKICAgICAqIGZyb20gdGhlIGN1cnJlbnQgc3RhdGUKICAgICAqIHRvIHRoZSBkZXN0aW5hdGlvbiBzdGF0ZSwga2V5ZnJhbWVzIGRlc2NyaWJlIGhvdyBlYWNoIHN0eWxlIGVudHJ5IGlzIGFwcGxpZWQgYW5kIGF0IHdoYXQgcG9pbnQKICAgICAqIHdpdGhpbiB0aGUgYW5pbWF0aW9uIGFyYy4KICAgICAqIENvbXBhcmUgW0NTUyBLZXlmcmFtZSBBbmltYXRpb25zXShodHRwczovL3d3dy53M3NjaG9vbHMuY29tL2Nzcy9jc3MzX2FuaW1hdGlvbnMuYXNwKS4KICAgICAqCiAgICAgKiAjIyMgVXNhZ2UKICAgICAqCiAgICAgKiBJbiB0aGUgZm9sbG93aW5nIGV4YW1wbGUsIHRoZSBvZmZzZXQgdmFsdWVzIGRlc2NyaWJlCiAgICAgKiB3aGVuIGVhY2ggYGJhY2tncm91bmRDb2xvcmAgdmFsdWUgaXMgYXBwbGllZC4gVGhlIGNvbG9yIGlzIHJlZCBhdCB0aGUgc3RhcnQsIGFuZCBjaGFuZ2VzIHRvCiAgICAgKiBibHVlIHdoZW4gMjAlIG9mIHRoZSB0b3RhbCB0aW1lIGhhcyBlbGFwc2VkLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIC8vIHRoZSBwcm92aWRlZCBvZmZzZXQgdmFsdWVzCiAgICAgKiBhbmltYXRlKCI1cyIsIGtleWZyYW1lcyhbCiAgICAgKiAgIHN0eWxlKHsgYmFja2dyb3VuZENvbG9yOiAicmVkIiwgb2Zmc2V0OiAwIH0pLAogICAgICogICBzdHlsZSh7IGJhY2tncm91bmRDb2xvcjogImJsdWUiLCBvZmZzZXQ6IDAuMiB9KSwKICAgICAqICAgc3R5bGUoeyBiYWNrZ3JvdW5kQ29sb3I6ICJvcmFuZ2UiLCBvZmZzZXQ6IDAuMyB9KSwKICAgICAqICAgc3R5bGUoeyBiYWNrZ3JvdW5kQ29sb3I6ICJibGFjayIsIG9mZnNldDogMSB9KQogICAgICogXSkpCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBJZiB0aGVyZSBhcmUgbm8gYG9mZnNldGAgdmFsdWVzIHNwZWNpZmllZCBpbiB0aGUgc3R5bGUgZW50cmllcywgdGhlIG9mZnNldHMKICAgICAqIGFyZSBjYWxjdWxhdGVkIGF1dG9tYXRpY2FsbHkuCiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogYW5pbWF0ZSgiNXMiLCBrZXlmcmFtZXMoWwogICAgICogICBzdHlsZSh7IGJhY2tncm91bmRDb2xvcjogInJlZCIgfSkgLy8gb2Zmc2V0ID0gMAogICAgICogICBzdHlsZSh7IGJhY2tncm91bmRDb2xvcjogImJsdWUiIH0pIC8vIG9mZnNldCA9IDAuMzMKICAgICAqICAgc3R5bGUoeyBiYWNrZ3JvdW5kQ29sb3I6ICJvcmFuZ2UiIH0pIC8vIG9mZnNldCA9IDAuNjYKICAgICAqICAgc3R5bGUoeyBiYWNrZ3JvdW5kQ29sb3I6ICJibGFjayIgfSkgLy8gb2Zmc2V0ID0gMQogICAgICogXSkpCiAgICAgKiBgYGAKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IHN0ZXBzIEEgc2V0IG9mIGFuaW1hdGlvbiBzdHlsZXMgd2l0aCBvcHRpb25hbCBvZmZzZXQgZGF0YS4KICAgICAqIFRoZSBvcHRpb25hbCBgb2Zmc2V0YCB2YWx1ZSBmb3IgYSBzdHlsZSBzcGVjaWZpZXMgYSBwZXJjZW50YWdlIG9mIHRoZSB0b3RhbCBhbmltYXRpb24KICAgICAqIHRpbWUgYXQgd2hpY2ggdGhhdCBzdHlsZSBpcyBhcHBsaWVkLgogICAgICogQHJldHVybiB7P30gQW4gb2JqZWN0IHRoYXQgZW5jYXBzdWxhdGVzIHRoZSBrZXlmcmFtZXMgZGF0YS4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIGtleWZyYW1lcyhzdGVwcykgewogICAgICAgIHJldHVybiB7IHR5cGU6IDUgLyogS2V5ZnJhbWVzICovLCBzdGVwcyB9OwogICAgfQogICAgLyoqCiAgICAgKiBEZWNsYXJlcyBhbiBhbmltYXRpb24gdHJhbnNpdGlvbiBhcyBhIHNlcXVlbmNlIG9mIGFuaW1hdGlvbiBzdGVwcyB0byBydW4gd2hlbiBhIGdpdmVuCiAgICAgKiBjb25kaXRpb24gaXMgc2F0aXNmaWVkLiBUaGUgY29uZGl0aW9uIGlzIGEgQm9vbGVhbiBleHByZXNzaW9uIG9yIGZ1bmN0aW9uIHRoYXQgY29tcGFyZXMKICAgICAqIHRoZSBwcmV2aW91cyBhbmQgY3VycmVudCBhbmltYXRpb24gc3RhdGVzLCBhbmQgcmV0dXJucyB0cnVlIGlmIHRoaXMgdHJhbnNpdGlvbiBzaG91bGQgb2NjdXIuCiAgICAgKiBXaGVuIHRoZSBzdGF0ZSBjcml0ZXJpYSBvZiBhIGRlZmluZWQgdHJhbnNpdGlvbiBhcmUgbWV0LCB0aGUgYXNzb2NpYXRlZCBhbmltYXRpb24gaXMKICAgICAqIHRyaWdnZXJlZC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIFRoZSB0ZW1wbGF0ZSBhc3NvY2lhdGVkIHdpdGggYSBjb21wb25lbnQgYmluZHMgYW4gYW5pbWF0aW9uIHRyaWdnZXIgdG8gYW4gZWxlbWVudC4KICAgICAqCiAgICAgKiBgYGBIVE1MCiAgICAgKiA8IS0tIHNvbWV3aGVyZSBpbnNpZGUgb2YgbXktY29tcG9uZW50LXRwbC5odG1sIC0tPgogICAgICogPGRpdiBbXEBteUFuaW1hdGlvblRyaWdnZXJdPSJteVN0YXR1c0V4cCI+Li4uPC9kaXY+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBBbGwgdHJhbnNpdGlvbnMgYXJlIGRlZmluZWQgd2l0aGluIGFuIGFuaW1hdGlvbiB0cmlnZ2VyLAogICAgICogYWxvbmcgd2l0aCBuYW1lZCBzdGF0ZXMgdGhhdCB0aGUgdHJhbnNpdGlvbnMgY2hhbmdlIHRvIGFuZCBmcm9tLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIHRyaWdnZXIoIm15QW5pbWF0aW9uVHJpZ2dlciIsIFsKICAgICAqICAvLyBkZWZpbmUgc3RhdGVzCiAgICAgKiAgc3RhdGUoIm9uIiwgc3R5bGUoeyBiYWNrZ3JvdW5kOiAiZ3JlZW4iIH0pKSwKICAgICAqICBzdGF0ZSgib2ZmIiwgc3R5bGUoeyBiYWNrZ3JvdW5kOiAiZ3JleSIgfSkpLAogICAgICogIC4uLl0KICAgICAqIGBgYAogICAgICoKICAgICAqIE5vdGUgdGhhdCB3aGVuIHlvdSBjYWxsIHRoZSBgc2VxdWVuY2UoKWAgZnVuY3Rpb24gd2l0aGluIGEgYHtcQGxpbmsgYW5pbWF0aW9ucy9ncm91cCBncm91cCgpfWAKICAgICAqIG9yIGEgYHRyYW5zaXRpb24oKWAgY2FsbCwgZXhlY3V0aW9uIGRvZXMgbm90IGNvbnRpbnVlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uCiAgICAgKiB1bnRpbCBlYWNoIG9mIHRoZSBpbm5lciBhbmltYXRpb24gc3RlcHMgaGF2ZSBjb21wbGV0ZWQuCiAgICAgKgogICAgICogIyMjIFN5bnRheCBleGFtcGxlcwogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgZGVmaW5lIHRyYW5zaXRpb25zIGJldHdlZW4gdGhlIHR3byBkZWZpbmVkIHN0YXRlcyAoYW5kIGRlZmF1bHQgc3RhdGVzKSwKICAgICAqIHVzaW5nIHZhcmlvdXMgb3B0aW9uczoKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiAvLyBUcmFuc2l0aW9uIG9jY3VycyB3aGVuIHRoZSBzdGF0ZSB2YWx1ZQogICAgICogLy8gYm91bmQgdG8gIm15QW5pbWF0aW9uVHJpZ2dlciIgY2hhbmdlcyBmcm9tICJvbiIgdG8gIm9mZiIKICAgICAqIHRyYW5zaXRpb24oIm9uID0+IG9mZiIsIGFuaW1hdGUoNTAwKSkKICAgICAqIC8vIFJ1biB0aGUgc2FtZSBhbmltYXRpb24gZm9yIGJvdGggZGlyZWN0aW9ucwogICAgICogdHJhbnNpdGlvbigib24gPD0+IG9mZiIsIGFuaW1hdGUoNTAwKSkKICAgICAqIC8vIERlZmluZSBtdWx0aXBsZSBzdGF0ZS1jaGFuZ2UgcGFpcnMgc2VwYXJhdGVkIGJ5IGNvbW1hcwogICAgICogdHJhbnNpdGlvbigib24gPT4gb2ZmLCBvZmYgPT4gdm9pZCIsIGFuaW1hdGUoNTAwKSkKICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBTcGVjaWFsIHZhbHVlcyBmb3Igc3RhdGUtY2hhbmdlIGV4cHJlc3Npb25zCiAgICAgKgogICAgICogLSBDYXRjaC1hbGwgc3RhdGUgY2hhbmdlIGZvciB3aGVuIGFuIGVsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgcGFnZSBhbmQgdGhlCiAgICAgKiBkZXN0aW5hdGlvbiBzdGF0ZSBpcyB1bmtub3duOgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIHRyYW5zaXRpb24oInZvaWQgPT4gKiIsIFsKICAgICAqICBzdHlsZSh7IG9wYWNpdHk6IDAgfSksCiAgICAgKiAgYW5pbWF0ZSg1MDApCiAgICAgKiAgXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIC0gQ2FwdHVyZSBhIHN0YXRlIGNoYW5nZSBiZXR3ZWVuIGFueSBzdGF0ZXM6CiAgICAgKgogICAgICogIGB0cmFuc2l0aW9uKCIqID0+ICoiLCBhbmltYXRlKCIxcyAwcyIpKWAKICAgICAqCiAgICAgKiAtIEVudHJ5IGFuZCBleGl0IHRyYW5zaXRpb25zOgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIHRyYW5zaXRpb24oIjplbnRlciIsIFsKICAgICAqICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLAogICAgICogICBhbmltYXRlKDUwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKQogICAgICogICBdKSwKICAgICAqIHRyYW5zaXRpb24oIjpsZWF2ZSIsIFsKICAgICAqICAgYW5pbWF0ZSg1MDAsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSkKICAgICAqICAgXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIC0gVXNlIGA6aW5jcmVtZW50YCBhbmQgYDpkZWNyZW1lbnRgIHRvIGluaXRpYXRlIHRyYW5zaXRpb25zOgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIHRyYW5zaXRpb24oIjppbmNyZW1lbnQiLCBncm91cChbCiAgICAgKiAgcXVlcnkoJzplbnRlcicsIFsKICAgICAqICAgICBzdHlsZSh7IGxlZnQ6ICcxMDAlJyB9KSwKICAgICAqICAgICBhbmltYXRlKCcwLjVzIGVhc2Utb3V0Jywgc3R5bGUoJyonKSkKICAgICAqICAgXSksCiAgICAgKiAgcXVlcnkoJzpsZWF2ZScsIFsKICAgICAqICAgICBhbmltYXRlKCcwLjVzIGVhc2Utb3V0Jywgc3R5bGUoeyBsZWZ0OiAnLTEwMCUnIH0pKQogICAgICogIF0pCiAgICAgKiBdKSkKICAgICAqCiAgICAgKiB0cmFuc2l0aW9uKCI6ZGVjcmVtZW50IiwgZ3JvdXAoWwogICAgICogIHF1ZXJ5KCc6ZW50ZXInLCBbCiAgICAgKiAgICAgc3R5bGUoeyBsZWZ0OiAnMTAwJScgfSksCiAgICAgKiAgICAgYW5pbWF0ZSgnMC41cyBlYXNlLW91dCcsIHN0eWxlKCcqJykpCiAgICAgKiAgIF0pLAogICAgICogIHF1ZXJ5KCc6bGVhdmUnLCBbCiAgICAgKiAgICAgYW5pbWF0ZSgnMC41cyBlYXNlLW91dCcsIHN0eWxlKHsgbGVmdDogJy0xMDAlJyB9KSkKICAgICAqICBdKQogICAgICogXSkpCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgU3RhdGUtY2hhbmdlIGZ1bmN0aW9ucwogICAgICoKICAgICAqIEhlcmUgaXMgYW4gZXhhbXBsZSBvZiBhIGBmcm9tU3RhdGVgIHNwZWNpZmllZCBhcyBhIHN0YXRlLWNoYW5nZSBmdW5jdGlvbiB0aGF0IGludm9rZXMgYW4KICAgICAqIGFuaW1hdGlvbiB3aGVuIHRydWU6CiAgICAgKgogICAgICogYGBgdHlwZXNjcmlwdAogICAgICogdHJhbnNpdGlvbigoZnJvbVN0YXRlLCB0b1N0YXRlKSA9PgogICAgICogIHsKICAgICAqICAgcmV0dXJuIGZyb21TdGF0ZSA9PSAib2ZmIiAmJiB0b1N0YXRlID09ICJvbiI7CiAgICAgKiAgfSwKICAgICAqICBhbmltYXRlKCIxcyAwcyIpKQogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIEFuaW1hdGluZyB0byB0aGUgZmluYWwgc3RhdGUKICAgICAqCiAgICAgKiBJZiB0aGUgZmluYWwgc3RlcCBpbiBhIHRyYW5zaXRpb24gaXMgYSBjYWxsIHRvIGBhbmltYXRlKClgIHRoYXQgdXNlcyBhIHRpbWluZyB2YWx1ZQogICAgICogd2l0aCBubyBzdHlsZSBkYXRhLCB0aGF0IHN0ZXAgaXMgYXV0b21hdGljYWxseSBjb25zaWRlcmVkIHRoZSBmaW5hbCBhbmltYXRpb24gYXJjLAogICAgICogZm9yIHRoZSBlbGVtZW50IHRvIHJlYWNoIHRoZSBmaW5hbCBzdGF0ZS4gQW5ndWxhciBhdXRvbWF0aWNhbGx5IGFkZHMgb3IgcmVtb3ZlcwogICAgICogQ1NTIHN0eWxlcyB0byBlbnN1cmUgdGhhdCB0aGUgZWxlbWVudCBpcyBpbiB0aGUgY29ycmVjdCBmaW5hbCBzdGF0ZS4KICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgZGVmaW5lcyBhIHRyYW5zaXRpb24gdGhhdCBzdGFydHMgYnkgaGlkaW5nIHRoZSBlbGVtZW50LAogICAgICogdGhlbiBtYWtlcyBzdXJlIHRoYXQgaXQgYW5pbWF0ZXMgcHJvcGVybHkgdG8gd2hhdGV2ZXIgc3RhdGUgaXMgY3VycmVudGx5IGFjdGl2ZSBmb3IgdHJpZ2dlcjoKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiB0cmFuc2l0aW9uKCJ2b2lkID0+ICoiLCBbCiAgICAgKiAgIHN0eWxlKHsgb3BhY2l0eTogMCB9KSwKICAgICAqICAgYW5pbWF0ZSg1MDApCiAgICAgKiAgXSkKICAgICAqIGBgYAogICAgICogIyMjIEJvb2xlYW4gdmFsdWUgbWF0Y2hpbmcKICAgICAqIElmIGEgdHJpZ2dlciBiaW5kaW5nIHZhbHVlIGlzIGEgQm9vbGVhbiwgaXQgY2FuIGJlIG1hdGNoZWQgdXNpbmcgYSB0cmFuc2l0aW9uIGV4cHJlc3Npb24KICAgICAqIHRoYXQgY29tcGFyZXMgdHJ1ZSBhbmQgZmFsc2Ugb3IgMSBhbmQgMC4gRm9yIGV4YW1wbGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiAvLyBpbiB0aGUgdGVtcGxhdGUKICAgICAqIDxkaXYgW1xAb3BlbkNsb3NlXT0ib3BlbiA/IHRydWUgOiBmYWxzZSI+Li4uPC9kaXY+CiAgICAgKiAvLyBpbiB0aGUgY29tcG9uZW50IG1ldGFkYXRhCiAgICAgKiB0cmlnZ2VyKCdvcGVuQ2xvc2UnLCBbCiAgICAgKiAgIHN0YXRlKCd0cnVlJywgc3R5bGUoeyBoZWlnaHQ6ICcqJyB9KSksCiAgICAgKiAgIHN0YXRlKCdmYWxzZScsIHN0eWxlKHsgaGVpZ2h0OiAnMHB4JyB9KSksCiAgICAgKiAgIHRyYW5zaXRpb24oJ2ZhbHNlIDw9PiB0cnVlJywgYW5pbWF0ZSg1MDApKQogICAgICogXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZUNoYW5nZUV4cHIgQSBCb29sZWFuIGV4cHJlc3Npb24gb3IgZnVuY3Rpb24gdGhhdCBjb21wYXJlcyB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQKICAgICAqIGFuaW1hdGlvbiBzdGF0ZXMsIGFuZCByZXR1cm5zIHRydWUgaWYgdGhpcyB0cmFuc2l0aW9uIHNob3VsZCBvY2N1ci4gTm90ZSB0aGF0ICAidHJ1ZSIgYW5kICJmYWxzZSIKICAgICAqIG1hdGNoIDEgYW5kIDAsIHJlc3BlY3RpdmVseS4gQW4gZXhwcmVzc2lvbiBpcyBldmFsdWF0ZWQgZWFjaCB0aW1lIGEgc3RhdGUgY2hhbmdlIG9jY3VycyBpbiB0aGUKICAgICAqIGFuaW1hdGlvbiB0cmlnZ2VyIGVsZW1lbnQuCiAgICAgKiBUaGUgYW5pbWF0aW9uIHN0ZXBzIHJ1biB3aGVuIHRoZSBleHByZXNzaW9uIGV2YWx1YXRlcyB0byB0cnVlLgogICAgICoKICAgICAqIC0gQSBzdGF0ZS1jaGFuZ2Ugc3RyaW5nIHRha2VzIHRoZSBmb3JtICJzdGF0ZTEgPT4gc3RhdGUyIiwgd2hlcmUgZWFjaCBzaWRlIGlzIGEgZGVmaW5lZCBhbmltYXRpb24KICAgICAqIHN0YXRlLCBvciBhbiBhc3Rlcml4ICgqKSB0byByZWZlciB0byBhIGR5bmFtaWMgc3RhcnQgb3IgZW5kIHN0YXRlLgogICAgICogICAtIFRoZSBleHByZXNzaW9uIHN0cmluZyBjYW4gY29udGFpbiBtdWx0aXBsZSBjb21tYS1zZXBhcmF0ZWQgc3RhdGVtZW50czsKICAgICAqIGZvciBleGFtcGxlICJzdGF0ZTEgPT4gc3RhdGUyLCBzdGF0ZTMgPT4gc3RhdGU0Ii4KICAgICAqICAgLSBTcGVjaWFsIHZhbHVlcyBgOmVudGVyYCBhbmQgYDpsZWF2ZWAgaW5pdGlhdGUgYSB0cmFuc2l0aW9uIG9uIHRoZSBlbnRyeSBhbmQgZXhpdCBzdGF0ZXMsCiAgICAgKiBlcXVpdmFsZW50IHRvICAidm9pZCA9PiAqIiAgYW5kICIqID0+IHZvaWQiLgogICAgICogICAtIFNwZWNpYWwgdmFsdWVzIGA6aW5jcmVtZW50YCBhbmQgYDpkZWNyZW1lbnRgIGluaXRpYXRlIGEgdHJhbnNpdGlvbiB3aGVuIGEgbnVtZXJpYyB2YWx1ZSBoYXMKICAgICAqIGluY3JlYXNlZCBvciBkZWNyZWFzZWQgaW4gdmFsdWUuCiAgICAgKiAtIEEgZnVuY3Rpb24gaXMgZXhlY3V0ZWQgZWFjaCB0aW1lIGEgc3RhdGUgY2hhbmdlIG9jY3VycyBpbiB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgZWxlbWVudC4KICAgICAqIFRoZSBhbmltYXRpb24gc3RlcHMgcnVuIHdoZW4gdGhlIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHN0ZXBzIE9uZSBvciBtb3JlIGFuaW1hdGlvbiBvYmplY3RzLCBhcyByZXR1cm5lZCBieSB0aGUgYGFuaW1hdGUoKWAgb3IKICAgICAqIGBzZXF1ZW5jZSgpYCBmdW5jdGlvbiwgdGhhdCBmb3JtIGEgdHJhbnNmb3JtYXRpb24gZnJvbSBvbmUgc3RhdGUgdG8gYW5vdGhlci4KICAgICAqIEEgc2VxdWVuY2UgaXMgdXNlZCBieSBkZWZhdWx0IHdoZW4geW91IHBhc3MgYW4gYXJyYXkuCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIEFuIG9wdGlvbnMgb2JqZWN0IHRoYXQgY2FuIGNvbnRhaW4gYSBkZWxheSB2YWx1ZSBmb3IgdGhlIHN0YXJ0IG9mIHRoZSBhbmltYXRpb24sCiAgICAgKiBhbmQgYWRkaXRpb25hbCBkZXZlbG9wZXItZGVmaW5lZCBwYXJhbWV0ZXJzLiBQcm92aWRlZCB2YWx1ZXMgZm9yIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBhcmUgdXNlZAogICAgICogYXMgZGVmYXVsdHMsIGFuZCBvdmVycmlkZSB2YWx1ZXMgY2FuIGJlIHBhc3NlZCB0byB0aGUgY2FsbGVyIG9uIGludm9jYXRpb24uCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHRyYW5zaXRpb24gZGF0YS4KICAgICAqCiAgICAgKi8KICAgIGZ1bmN0aW9uIHRyYW5zaXRpb24oc3RhdGVDaGFuZ2VFeHByLCBzdGVwcywgb3B0aW9ucyA9IG51bGwpIHsKICAgICAgICByZXR1cm4geyB0eXBlOiAxIC8qIFRyYW5zaXRpb24gKi8sIGV4cHI6IHN0YXRlQ2hhbmdlRXhwciwgYW5pbWF0aW9uOiBzdGVwcywgb3B0aW9ucyB9OwogICAgfQogICAgLyoqCiAgICAgKiBFeGVjdXRlcyBhIHF1ZXJpZWQgaW5uZXIgYW5pbWF0aW9uIGVsZW1lbnQgd2l0aGluIGFuIGFuaW1hdGlvbiBzZXF1ZW5jZS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIEVhY2ggdGltZSBhbiBhbmltYXRpb24gaXMgdHJpZ2dlcmVkIGluIEFuZ3VsYXIsIHRoZSBwYXJlbnQgYW5pbWF0aW9uCiAgICAgKiBoYXMgcHJpb3JpdHkgYW5kIGFueSBjaGlsZCBhbmltYXRpb25zIGFyZSBibG9ja2VkLiBJbiBvcmRlcgogICAgICogZm9yIGEgY2hpbGQgYW5pbWF0aW9uIHRvIHJ1biwgdGhlIHBhcmVudCBhbmltYXRpb24gbXVzdCBxdWVyeSBlYWNoIG9mIHRoZSBlbGVtZW50cwogICAgICogY29udGFpbmluZyBjaGlsZCBhbmltYXRpb25zLCBhbmQgcnVuIHRoZW0gdXNpbmcgdGhpcyBmdW5jdGlvbi4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBgcXVlcnkoKWAgYW5kIGl0IHdpbGwgb25seSB3b3JrCiAgICAgKiB3aXRoIGFuaW1hdGlvbnMgdGhhdCBhcmUgYXNzaWduZWQgdXNpbmcgdGhlIEFuZ3VsYXIgYW5pbWF0aW9uIGxpYnJhcnkuIENTUyBrZXlmcmFtZXMKICAgICAqIGFuZCB0cmFuc2l0aW9ucyBhcmUgbm90IGhhbmRsZWQgYnkgdGhpcyBBUEkuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQW4gb3B0aW9ucyBvYmplY3QgdGhhdCBjYW4gY29udGFpbiBhIGRlbGF5IHZhbHVlIGZvciB0aGUgc3RhcnQgb2YgdGhlCiAgICAgKiBhbmltYXRpb24sIGFuZCBhZGRpdGlvbmFsIG92ZXJyaWRlIHZhbHVlcyBmb3IgZGV2ZWxvcGVyLWRlZmluZWQgcGFyYW1ldGVycy4KICAgICAqIEByZXR1cm4gez99IEFuIG9iamVjdCB0aGF0IGVuY2Fwc3VsYXRlcyB0aGUgY2hpbGQgYW5pbWF0aW9uIGRhdGEuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBhbmltYXRlQ2hpbGQob3B0aW9ucyA9IG51bGwpIHsKICAgICAgICByZXR1cm4geyB0eXBlOiA5IC8qIEFuaW1hdGVDaGlsZCAqLywgb3B0aW9ucyB9OwogICAgfQogICAgLyoqCiAgICAgKiBGaW5kcyBvbmUgb3IgbW9yZSBpbm5lciBlbGVtZW50cyB3aXRoaW4gdGhlIGN1cnJlbnQgZWxlbWVudCB0aGF0IGlzCiAgICAgKiBiZWluZyBhbmltYXRlZCB3aXRoaW4gYSBzZXF1ZW5jZS4gVXNlIHdpdGggYGFuaW1hdGUoKWAuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKiBUb2tlbnMgY2FuIGJlIG1lcmdlZCBpbnRvIGEgY29tYmluZWQgcXVlcnkgc2VsZWN0b3Igc3RyaW5nLiBGb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgKiAgcXVlcnkoJzpzZWxmLCAucmVjb3JkOmVudGVyLCAucmVjb3JkOmxlYXZlLCBcQHN1YlRyaWdnZXInLCBbLi4uXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIFRoZSBgcXVlcnkoKWAgZnVuY3Rpb24gY29sbGVjdHMgbXVsdGlwbGUgZWxlbWVudHMgYW5kIHdvcmtzIGludGVybmFsbHkgYnkgdXNpbmcKICAgICAqIGBlbGVtZW50LnF1ZXJ5U2VsZWN0b3JBbGxgLiBVc2UgdGhlIGBsaW1pdGAgZmllbGQgb2YgYW4gb3B0aW9ucyBvYmplY3QgdG8gbGltaXQKICAgICAqIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgdG8gYmUgY29sbGVjdGVkLiBGb3IgZXhhbXBsZToKICAgICAqCiAgICAgKiBgYGBqcwogICAgICogcXVlcnkoJ2RpdicsIFsKICAgICAqICAgYW5pbWF0ZSguLi4pLAogICAgICogICBhbmltYXRlKC4uLikKICAgICAqIF0sIHsgbGltaXQ6IDEgfSkKICAgICAqIGBgYAogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRocm93cyBhbiBlcnJvciB3aGVuIHplcm8gaXRlbXMgYXJlIGZvdW5kLiBTZXQgdGhlCiAgICAgKiBgb3B0aW9uYWxgIGZsYWcgdG8gaWdub3JlIHRoaXMgZXJyb3IuIEZvciBleGFtcGxlOgogICAgICoKICAgICAqIGBgYGpzCiAgICAgKiBxdWVyeSgnLnNvbWUtZWxlbWVudC10aGF0LW1heS1ub3QtYmUtdGhlcmUnLCBbCiAgICAgKiAgIGFuaW1hdGUoLi4uKSwKICAgICAqICAgYW5pbWF0ZSguLi4pCiAgICAgKiBdLCB7IG9wdGlvbmFsOiB0cnVlIH0pCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgVXNhZ2UgRXhhbXBsZQogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBxdWVyaWVzIGZvciBpbm5lciBlbGVtZW50cyBhbmQgYW5pbWF0ZXMgdGhlbQogICAgICogaW5kaXZpZHVhbGx5IHVzaW5nIGBhbmltYXRlKClgLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxAQ29tcG9uZW50KHsKICAgICAqICAgc2VsZWN0b3I6ICdpbm5lcicsCiAgICAgKiAgIHRlbXBsYXRlOiBgCiAgICAgKiAgICAgPGRpdiBbXEBxdWVyeUFuaW1hdGlvbl09ImV4cCI+CiAgICAgKiAgICAgICA8aDE+VGl0bGU8L2gxPgogICAgICogICAgICAgPGRpdiBjbGFzcz0iY29udGVudCI+CiAgICAgKiAgICAgICAgIEJsYWggYmxhaCBibGFoCiAgICAgKiAgICAgICA8L2Rpdj4KICAgICAqICAgICA8L2Rpdj4KICAgICAqICAgYCwKICAgICAqICAgYW5pbWF0aW9uczogWwogICAgICogICAgdHJpZ2dlcigncXVlcnlBbmltYXRpb24nLCBbCiAgICAgKiAgICAgIHRyYW5zaXRpb24oJyogPT4gZ29BbmltYXRlJywgWwogICAgICogICAgICAgIC8vIGhpZGUgdGhlIGlubmVyIGVsZW1lbnRzCiAgICAgKiAgICAgICAgcXVlcnkoJ2gxJywgc3R5bGUoeyBvcGFjaXR5OiAwIH0pKSwKICAgICAqICAgICAgICBxdWVyeSgnLmNvbnRlbnQnLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpLAogICAgICoKICAgICAqICAgICAgICAvLyBhbmltYXRlIHRoZSBpbm5lciBlbGVtZW50cyBpbiwgb25lIGJ5IG9uZQogICAgICogICAgICAgIHF1ZXJ5KCdoMScsIGFuaW1hdGUoMTAwMCwgc3R5bGUoeyBvcGFjaXR5OiAxIH0pKSksCiAgICAgKiAgICAgICAgcXVlcnkoJy5jb250ZW50JywgYW5pbWF0ZSgxMDAwLCBzdHlsZSh7IG9wYWNpdHk6IDEgfSkpKSwKICAgICAqICAgICAgXSkKICAgICAqICAgIF0pCiAgICAgKiAgXQogICAgICogfSkKICAgICAqIGNsYXNzIENtcCB7CiAgICAgKiAgIGV4cCA9ICcnOwogICAgICoKICAgICAqICAgZ29BbmltYXRlKCkgewogICAgICogICAgIHRoaXMuZXhwID0gJ2dvQW5pbWF0ZSc7CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yIFRoZSBlbGVtZW50IHRvIHF1ZXJ5LCBvciBhIHNldCBvZiBlbGVtZW50cyB0aGF0IGNvbnRhaW4gQW5ndWxhci1zcGVjaWZpYwogICAgICogY2hhcmFjdGVyaXN0aWNzLCBzcGVjaWZpZWQgd2l0aCBvbmUgb3IgbW9yZSBvZiB0aGUgZm9sbG93aW5nIHRva2Vucy4KICAgICAqICAtIGBxdWVyeSgiOmVudGVyIilgIG9yIGBxdWVyeSgiOmxlYXZlIilgIDogUXVlcnkgZm9yIG5ld2x5IGluc2VydGVkL3JlbW92ZWQgZWxlbWVudHMuCiAgICAgKiAgLSBgcXVlcnkoIjphbmltYXRpbmciKWAgOiBRdWVyeSBhbGwgY3VycmVudGx5IGFuaW1hdGluZyBlbGVtZW50cy4KICAgICAqICAtIGBxdWVyeSgiXEB0cmlnZ2VyTmFtZSIpYCA6IFF1ZXJ5IGVsZW1lbnRzIHRoYXQgY29udGFpbiBhbiBhbmltYXRpb24gdHJpZ2dlci4KICAgICAqICAtIGBxdWVyeSgiXEAqIilgIDogUXVlcnkgYWxsIGVsZW1lbnRzIHRoYXQgY29udGFpbiBhbiBhbmltYXRpb24gdHJpZ2dlcnMuCiAgICAgKiAgLSBgcXVlcnkoIjpzZWxmIilgIDogSW5jbHVkZSB0aGUgY3VycmVudCBlbGVtZW50IGludG8gdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGFuaW1hdGlvbiBPbmUgb3IgbW9yZSBhbmltYXRpb24gc3RlcHMgdG8gYXBwbHkgdG8gdGhlIHF1ZXJpZWQgZWxlbWVudCBvciBlbGVtZW50cy4KICAgICAqIEFuIGFycmF5IGlzIHRyZWF0ZWQgYXMgYW4gYW5pbWF0aW9uIHNlcXVlbmNlLgogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBBbiBvcHRpb25zIG9iamVjdC4gVXNlIHRoZSAnbGltaXQnIGZpZWxkIHRvIGxpbWl0IHRoZSB0b3RhbCBudW1iZXIgb2YKICAgICAqIGl0ZW1zIHRvIGNvbGxlY3QuCiAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYmplY3QgdGhhdCBlbmNhcHN1bGF0ZXMgdGhlIHF1ZXJ5IGRhdGEuCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBxdWVyeShzZWxlY3RvciwgYW5pbWF0aW9uLCBvcHRpb25zID0gbnVsbCkgewogICAgICAgIHJldHVybiB7IHR5cGU6IDExIC8qIFF1ZXJ5ICovLCBzZWxlY3RvciwgYW5pbWF0aW9uLCBvcHRpb25zIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL3NyYy91dGlsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKiBAcGFyYW0gez99IGNiCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzY2hlZHVsZU1pY3JvVGFzayQxKGNiKSB7CiAgICAgICAgUHJvbWlzZS5yZXNvbHZlKG51bGwpLnRoZW4oY2IpOwogICAgfQogICAgLyoqCiAgICAgKiBBbiBlbXB0eSBwcm9ncmFtbWF0aWMgY29udHJvbGxlciBmb3IgcmV1c2FibGUgYW5pbWF0aW9ucy4KICAgICAqIFVzZWQgaW50ZXJuYWxseSB3aGVuIGFuaW1hdGlvbnMgYXJlIGRpc2FibGVkLCB0byBhdm9pZAogICAgICogY2hlY2tpbmcgZm9yIHRoZSBudWxsIGNhc2Ugd2hlbiBhbiBhbmltYXRpb24gcGxheWVyIGlzIGV4cGVjdGVkLgogICAgICoKICAgICAqIEBzZWUgYGFuaW1hdGUoKWAKICAgICAqIEBzZWUgYEFuaW1hdGlvblBsYXllcmAKICAgICAqIEBzZWUgYEdyb3VwUGxheWVyYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIE5vb3BBbmltYXRpb25QbGF5ZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGR1cmF0aW9uCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVsYXkKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihkdXJhdGlvbiA9IDAsIGRlbGF5ID0gMCkgewogICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdOwogICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5wYXJlbnRQbGF5ZXIgPSBudWxsOwogICAgICAgICAgICB0aGlzLnRvdGFsVGltZSA9IGR1cmF0aW9uICsgZGVsYXk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25GaW5pc2goKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU3RhcnQoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Eb25lKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucy5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25EZXN0cm95KGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveUZucy5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYXNTdGFydGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RhcnRlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbml0KCkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuaGFzU3RhcnRlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vblN0YXJ0KCk7CiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXJNaWNyb3Rhc2soKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJpZ2dlck1pY3JvdGFzaygpIHsKICAgICAgICAgICAgc2NoZWR1bGVNaWNyb1Rhc2skMSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9vbkZpbmlzaCgpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25TdGFydCgpIHsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zID0gW107CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGF1c2UoKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc3RhcnQoKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmlzaCgpIHsKICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2Rlc3Ryb3llZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vblN0YXJ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZpbmlzaCgpOwogICAgICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldCgpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBvc2l0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcGhhc2VOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyQ2FsbGJhY2socGhhc2VOYW1lKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0aG9kcyA9IHBoYXNlTmFtZSA9PSAnc3RhcnQnID8gdGhpcy5fb25TdGFydEZucyA6IHRoaXMuX29uRG9uZUZuczsKICAgICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICBtZXRob2RzLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9zcmMvcGxheWVycy9hbmltYXRpb25fZ3JvdXBfcGxheWVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQSBwcm9ncmFtbWF0aWMgY29udHJvbGxlciBmb3IgYSBncm91cCBvZiByZXVzYWJsZSBhbmltYXRpb25zLgogICAgICogVXNlZCBpbnRlcm5hbGx5IHRvIGNvbnRyb2wgYW5pbWF0aW9ucy4KICAgICAqCiAgICAgKiBAc2VlIGBBbmltYXRpb25QbGF5ZXJgCiAgICAgKiBAc2VlIGB7XEBsaW5rIGFuaW1hdGlvbnMvZ3JvdXAgZ3JvdXAoKX1gCiAgICAgKgogICAgICovCiAgICBjbGFzcyBBbmltYXRpb25Hcm91cFBsYXllciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxheWVycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9wbGF5ZXJzKSB7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zID0gW107CiAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveUZucyA9IFtdOwogICAgICAgICAgICB0aGlzLnBhcmVudFBsYXllciA9IG51bGw7CiAgICAgICAgICAgIHRoaXMudG90YWxUaW1lID0gMDsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzID0gX3BsYXllcnM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGRvbmVDb3VudCA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGRlc3Ryb3lDb3VudCA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0YXJ0Q291bnQgPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRvdGFsID0gdGhpcy5wbGF5ZXJzLmxlbmd0aDsKICAgICAgICAgICAgaWYgKHRvdGFsID09IDApIHsKICAgICAgICAgICAgICAgIHNjaGVkdWxlTWljcm9UYXNrJDEoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fb25GaW5pc2goKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uRG9uZSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK2RvbmVDb3VudCA9PSB0b3RhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIub25EZXN0cm95KCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCsrZGVzdHJveUNvdW50ID09IHRvdGFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIub25TdGFydCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgrK3N0YXJ0Q291bnQgPT0gdG90YWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnRvdGFsVGltZSA9IHRoaXMucGxheWVycy5yZWR1Y2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRpbWUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh0aW1lLCBwbGF5ZXIpID0+IE1hdGgubWF4KHRpbWUsIHBsYXllci50b3RhbFRpbWUpKSwgMCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25GaW5pc2goKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZmluaXNoZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5pbml0KCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25TdGFydChmbikgewogICAgICAgICAgICB0aGlzLl9vblN0YXJ0Rm5zLnB1c2goZm4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uU3RhcnQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRvbmUoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zLnB1c2goZm4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRlc3Ryb3koZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLnB1c2goZm4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXkoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5wYXJlbnRQbGF5ZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX29uU3RhcnQoKTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5wbGF5KCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXVzZSgpIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5wYXVzZSgpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzdGFydCgpIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5yZXN0YXJ0KCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmaW5pc2goKSB7CiAgICAgICAgICAgIHRoaXMuX29uRmluaXNoKCk7CiAgICAgICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBsYXllciA9PiBwbGF5ZXIuZmluaXNoKCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwbGF5ZXIgPT4gcGxheWVyLmRlc3Ryb3koKSkpOwogICAgICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldCgpIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5yZXNldCgpKSk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0UG9zaXRpb24ocCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRpbWVBdFBvc2l0aW9uID0gcCAqIHRoaXMudG90YWxUaW1lOwogICAgICAgICAgICB0aGlzLnBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSBwbGF5ZXIudG90YWxUaW1lID8gTWF0aC5taW4oMSwgdGltZUF0UG9zaXRpb24gLyBwbGF5ZXIudG90YWxUaW1lKSA6IDE7CiAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0UG9zaXRpb24ocG9zaXRpb24pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UG9zaXRpb24oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1pbiA9IDA7CiAgICAgICAgICAgIHRoaXMucGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwID0gcGxheWVyLmdldFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICBtaW4gPSBNYXRoLm1pbihwLCBtaW4pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiBtaW47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYmVmb3JlRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuYmVmb3JlRGVzdHJveSkgewogICAgICAgICAgICAgICAgICAgIHBsYXllci5iZWZvcmVEZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcGhhc2VOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyQ2FsbGJhY2socGhhc2VOYW1lKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0aG9kcyA9IHBoYXNlTmFtZSA9PSAnc3RhcnQnID8gdGhpcy5fb25TdGFydEZucyA6IHRoaXMuX29uRG9uZUZuczsKICAgICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICBtZXRob2RzLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9zcmMvcHJpdmF0ZV9leHBvcnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgybVQUkVfU1RZTEUgPSAnISc7CgogICAgLyoqCiAgICAgKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMTIKICAgICAqIChjKSAyMDEwLTIwMjAgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvLwogICAgICogTGljZW5zZTogTUlUCiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQnJvd3NlcigpIHsKICAgICAgICByZXR1cm4gKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmIHR5cGVvZiB3aW5kb3cuZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnKTsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNOb2RlKCkgewogICAgICAgIC8vIENoZWNraW5nIG9ubHkgZm9yIGBwcm9jZXNzYCBpc24ndCBlbm91Z2ggdG8gaWRlbnRpZnkgd2hldGhlciBvciBub3Qgd2UncmUgaW4gYSBOb2RlCiAgICAgICAgLy8gZW52aXJvbm1lbnQsIGJlY2F1c2UgV2VicGFjayBieSBkZWZhdWx0IHdpbGwgcG9seWZpbGwgdGhlIGBwcm9jZXNzYC4gV2hpbGUgd2UgY2FuIGRpc2Nlcm4KICAgICAgICAvLyB0aGF0IFdlYnBhY2sgcG9seWZpbGxlZCBpdCBieSBsb29raW5nIGF0IGBwcm9jZXNzLmJyb3dzZXJgLCBpdCdzIHZlcnkgV2VicGFjay1zcGVjaWZpYyBhbmQKICAgICAgICAvLyBtaWdodCBub3QgYmUgZnV0dXJlLXByb29mLiBJbnN0ZWFkIHdlIGxvb2sgYXQgdGhlIHN0cmluZ2lmaWVkIHZlcnNpb24gb2YgYHByb2Nlc3NgIHdoaWNoCiAgICAgICAgLy8gaXMgYFtvYmplY3QgcHJvY2Vzc11gIGluIE5vZGUgYW5kIGBbb2JqZWN0IE9iamVjdF1gIHdoZW4gcG9seWZpbGxlZC4KICAgICAgICByZXR1cm4gdHlwZW9mIHByb2Nlc3MgIT09ICd1bmRlZmluZWQnICYmIHt9LnRvU3RyaW5nLmNhbGwocHJvY2VzcykgPT09ICdbb2JqZWN0IHByb2Nlc3NdJzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwbGF5ZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBvcHRpbWl6ZUdyb3VwUGxheWVyKHBsYXllcnMpIHsKICAgICAgICBzd2l0Y2ggKHBsYXllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9vcEFuaW1hdGlvblBsYXllcigpOwogICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVyc1swXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uR3JvdXBQbGF5ZXIocGxheWVycyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRyaXZlcgogICAgICogQHBhcmFtIHs/fSBub3JtYWxpemVyCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzCiAgICAgKiBAcGFyYW0gez89fSBwcmVTdHlsZXMKICAgICAqIEBwYXJhbSB7Pz19IHBvc3RTdHlsZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUtleWZyYW1lcyhkcml2ZXIsIG5vcm1hbGl6ZXIsIGVsZW1lbnQsIGtleWZyYW1lcywgcHJlU3R5bGVzID0ge30sIHBvc3RTdHlsZXMgPSB7fSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgbm9ybWFsaXplZEtleWZyYW1lcyA9IFtdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcHJldmlvdXNPZmZzZXQgPSAtMTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHByZXZpb3VzS2V5ZnJhbWUgPSBudWxsOwogICAgICAgIGtleWZyYW1lcy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGtmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBrZiA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGtmWydvZmZzZXQnXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzU2FtZU9mZnNldCA9IG9mZnNldCA9PSBwcmV2aW91c09mZnNldDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBub3JtYWxpemVkS2V5ZnJhbWUgPSAoaXNTYW1lT2Zmc2V0ICYmIHByZXZpb3VzS2V5ZnJhbWUpIHx8IHt9OwogICAgICAgICAgICBPYmplY3Qua2V5cyhrZikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsaXplZFByb3AgPSBwcm9wOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG5vcm1hbGl6ZWRWYWx1ZSA9IGtmW3Byb3BdOwogICAgICAgICAgICAgICAgaWYgKHByb3AgIT09ICdvZmZzZXQnKSB7CiAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFByb3AgPSBub3JtYWxpemVyLm5vcm1hbGl6ZVByb3BlcnR5TmFtZShub3JtYWxpemVkUHJvcCwgZXJyb3JzKTsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5vcm1hbGl6ZWRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlIMm1UFJFX1NUWUxFOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplZFZhbHVlID0gcHJlU3R5bGVzW3Byb3BdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQVVUT19TVFlMRToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9IHBvc3RTdHlsZXNbcHJvcF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRWYWx1ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ybWFsaXplci5ub3JtYWxpemVTdHlsZVZhbHVlKHByb3AsIG5vcm1hbGl6ZWRQcm9wLCBub3JtYWxpemVkVmFsdWUsIGVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBub3JtYWxpemVkS2V5ZnJhbWVbbm9ybWFsaXplZFByb3BdID0gbm9ybWFsaXplZFZhbHVlOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICghaXNTYW1lT2Zmc2V0KSB7CiAgICAgICAgICAgICAgICBub3JtYWxpemVkS2V5ZnJhbWVzLnB1c2gobm9ybWFsaXplZEtleWZyYW1lKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwcmV2aW91c0tleWZyYW1lID0gbm9ybWFsaXplZEtleWZyYW1lOwogICAgICAgICAgICBwcmV2aW91c09mZnNldCA9IG9mZnNldDsKICAgICAgICB9KSk7CiAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBMSU5FX1NUQVJUID0gJ1xuIC0gJzsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gYW5pbWF0ZSBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6JHtMSU5FX1NUQVJUfSR7ZXJyb3JzLmpvaW4oTElORV9TVEFSVCl9YCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBub3JtYWxpemVkS2V5ZnJhbWVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxpc3Rlbk9uUGxheWVyKHBsYXllciwgZXZlbnROYW1lLCBldmVudCwgY2FsbGJhY2spIHsKICAgICAgICBzd2l0Y2ggKGV2ZW50TmFtZSkgewogICAgICAgICAgICBjYXNlICdzdGFydCc6CiAgICAgICAgICAgICAgICBwbGF5ZXIub25TdGFydCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBjYWxsYmFjayhldmVudCAmJiBjb3B5QW5pbWF0aW9uRXZlbnQoZXZlbnQsICdzdGFydCcsIHBsYXllcikpKSk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgY2FzZSAnZG9uZSc6CiAgICAgICAgICAgICAgICBwbGF5ZXIub25Eb25lKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IGNhbGxiYWNrKGV2ZW50ICYmIGNvcHlBbmltYXRpb25FdmVudChldmVudCwgJ2RvbmUnLCBwbGF5ZXIpKSkpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIGNhc2UgJ2Rlc3Ryb3knOgogICAgICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBjYWxsYmFjayhldmVudCAmJiBjb3B5QW5pbWF0aW9uRXZlbnQoZXZlbnQsICdkZXN0cm95JywgcGxheWVyKSkpKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlCiAgICAgKiBAcGFyYW0gez99IHBoYXNlTmFtZQogICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvcHlBbmltYXRpb25FdmVudChlLCBwaGFzZU5hbWUsIHBsYXllcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0b3RhbFRpbWUgPSBwbGF5ZXIudG90YWxUaW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkaXNhYmxlZCA9ICgoLyoqIEB0eXBlIHs/fSAqLyAocGxheWVyKSkpLmRpc2FibGVkID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBldmVudCA9IG1ha2VBbmltYXRpb25FdmVudChlLmVsZW1lbnQsIGUudHJpZ2dlck5hbWUsIGUuZnJvbVN0YXRlLCBlLnRvU3RhdGUsIHBoYXNlTmFtZSB8fCBlLnBoYXNlTmFtZSwgdG90YWxUaW1lID09IHVuZGVmaW5lZCA/IGUudG90YWxUaW1lIDogdG90YWxUaW1lLCBkaXNhYmxlZCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGEgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGUpKSlbJ19kYXRhJ107CiAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50KSkpWydfZGF0YSddID0gZGF0YTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICAgICAqIEBwYXJhbSB7P30gZnJvbVN0YXRlCiAgICAgKiBAcGFyYW0gez99IHRvU3RhdGUKICAgICAqIEBwYXJhbSB7Pz19IHBoYXNlTmFtZQogICAgICogQHBhcmFtIHs/PX0gdG90YWxUaW1lCiAgICAgKiBAcGFyYW0gez89fSBkaXNhYmxlZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWFrZUFuaW1hdGlvbkV2ZW50KGVsZW1lbnQsIHRyaWdnZXJOYW1lLCBmcm9tU3RhdGUsIHRvU3RhdGUsIHBoYXNlTmFtZSA9ICcnLCB0b3RhbFRpbWUgPSAwLCBkaXNhYmxlZCkgewogICAgICAgIHJldHVybiB7IGVsZW1lbnQsIHRyaWdnZXJOYW1lLCBmcm9tU3RhdGUsIHRvU3RhdGUsIHBoYXNlTmFtZSwgdG90YWxUaW1lLCBkaXNhYmxlZDogISFkaXNhYmxlZCB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1hcAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdFZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRPclNldEFzSW5NYXAobWFwLCBrZXksIGRlZmF1bHRWYWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdmFsdWU7CiAgICAgICAgaWYgKG1hcCBpbnN0YW5jZW9mIE1hcCkgewogICAgICAgICAgICB2YWx1ZSA9IG1hcC5nZXQoa2V5KTsKICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgbWFwLnNldChrZXksIHZhbHVlID0gZGVmYXVsdFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdmFsdWUgPSBtYXBba2V5XTsKICAgICAgICAgICAgaWYgKCF2YWx1ZSkgewogICAgICAgICAgICAgICAgdmFsdWUgPSBtYXBba2V5XSA9IGRlZmF1bHRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29tbWFuZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VUaW1lbGluZUNvbW1hbmQoY29tbWFuZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzZXBhcmF0b3JQb3MgPSBjb21tYW5kLmluZGV4T2YoJzonKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaWQgPSBjb21tYW5kLnN1YnN0cmluZygxLCBzZXBhcmF0b3JQb3MpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhY3Rpb24gPSBjb21tYW5kLnN1YnN0cihzZXBhcmF0b3JQb3MgKyAxKTsKICAgICAgICByZXR1cm4gW2lkLCBhY3Rpb25dOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IF9jb250YWlucyA9ICgvKioKICAgICAqIEBwYXJhbSB7P30gZWxtMQogICAgICogQHBhcmFtIHs/fSBlbG0yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZWxtMSwgZWxtMikgPT4gZmFsc2UpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IF9tYXRjaGVzID0gKC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZWxlbWVudCwgc2VsZWN0b3IpID0+IGZhbHNlKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBfcXVlcnkgPSAoLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAqIEBwYXJhbSB7P30gbXVsdGkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChlbGVtZW50LCBzZWxlY3RvciwgbXVsdGkpID0+IHsKICAgICAgICByZXR1cm4gW107CiAgICB9KTsKICAgIC8vIERlZmluZSB1dGlsaXR5IG1ldGhvZHMgZm9yIGJyb3dzZXJzIGFuZCBwbGF0Zm9ybS1zZXJ2ZXIoZG9taW5vKSB3aGVyZSBFbGVtZW50CiAgICAvLyBhbmQgdXRpbGl0eSBtZXRob2RzIGV4aXN0LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX2lzTm9kZSA9IGlzTm9kZSgpOwogICAgaWYgKF9pc05vZGUgfHwgdHlwZW9mIEVsZW1lbnQgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgLy8gdGhpcyBpcyB3ZWxsIHN1cHBvcnRlZCBpbiBhbGwgYnJvd3NlcnMKICAgICAgICBfY29udGFpbnMgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbG0xCiAgICAgICAgICogQHBhcmFtIHs/fSBlbG0yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZWxtMSwgZWxtMikgPT4gewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGVsbTEuY29udGFpbnMoZWxtMikpKTsKICAgICAgICB9KTsKICAgICAgICBfbWF0Y2hlcyA9ICgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgIGlmIChfaXNOb2RlIHx8IEVsZW1lbnQucHJvdG90eXBlLm1hdGNoZXMpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlbGVtZW50LCBzZWxlY3RvcikgPT4gZWxlbWVudC5tYXRjaGVzKHNlbGVjdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcm90byA9ICgvKiogQHR5cGUgez99ICovIChFbGVtZW50LnByb3RvdHlwZSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZm4gPSBwcm90by5tYXRjaGVzU2VsZWN0b3IgfHwgcHJvdG8ubW96TWF0Y2hlc1NlbGVjdG9yIHx8IHByb3RvLm1zTWF0Y2hlc1NlbGVjdG9yIHx8CiAgICAgICAgICAgICAgICAgICAgcHJvdG8ub01hdGNoZXNTZWxlY3RvciB8fCBwcm90by53ZWJraXRNYXRjaGVzU2VsZWN0b3I7CiAgICAgICAgICAgICAgICBpZiAoZm4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChlbGVtZW50LCBzZWxlY3RvcikgPT4gZm4uYXBwbHkoZWxlbWVudCwgW3NlbGVjdG9yXSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIF9tYXRjaGVzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpKCk7CiAgICAgICAgX3F1ZXJ5ID0gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgKiBAcGFyYW0gez99IG11bHRpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlc3VsdHMgPSBbXTsKICAgICAgICAgICAgaWYgKG11bHRpKSB7CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbG0gPSBlbGVtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOwogICAgICAgICAgICAgICAgaWYgKGVsbSkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaChlbG0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbnRhaW5zVmVuZG9yUHJlZml4KHByb3ApIHsKICAgICAgICAvLyBXZWJraXQgaXMgdGhlIG9ubHkgcmVhbCBwb3B1bGFyIHZlbmRvciBwcmVmaXggbm93YWRheXMKICAgICAgICAvLyBjYzogaHR0cDovL3Nob3VsZGlwcmVmaXguY29tLwogICAgICAgIHJldHVybiBwcm9wLnN1YnN0cmluZygxLCA2KSA9PSAnZWJraXQnOyAvLyB3ZWJraXQgb3IgV2Via2l0CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgX0NBQ0hFRF9CT0RZID0gbnVsbDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBfSVNfV0VCS0lUID0gZmFsc2U7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmFsaWRhdGVTdHlsZVByb3BlcnR5KHByb3ApIHsKICAgICAgICBpZiAoIV9DQUNIRURfQk9EWSkgewogICAgICAgICAgICBfQ0FDSEVEX0JPRFkgPSBnZXRCb2R5Tm9kZSgpIHx8IHt9OwogICAgICAgICAgICBfSVNfV0VCS0lUID0gKC8qKiBAdHlwZSB7P30gKi8gKF9DQUNIRURfQk9EWSkpLnN0eWxlID8gKCdXZWJraXRBcHBlYXJhbmNlJyBpbiAoLyoqIEB0eXBlIHs/fSAqLyAoX0NBQ0hFRF9CT0RZKSkuc3R5bGUpIDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKF9DQUNIRURfQk9EWSkpLnN0eWxlICYmICFjb250YWluc1ZlbmRvclByZWZpeChwcm9wKSkgewogICAgICAgICAgICByZXN1bHQgPSBwcm9wIGluICgvKiogQHR5cGUgez99ICovIChfQ0FDSEVEX0JPRFkpKS5zdHlsZTsKICAgICAgICAgICAgaWYgKCFyZXN1bHQgJiYgX0lTX1dFQktJVCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2FtZWxQcm9wID0gJ1dlYmtpdCcgKyBwcm9wLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgcHJvcC5zdWJzdHIoMSk7CiAgICAgICAgICAgICAgICByZXN1bHQgPSBjYW1lbFByb3AgaW4gKC8qKiBAdHlwZSB7P30gKi8gKF9DQUNIRURfQk9EWSkpLnN0eWxlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEJvZHlOb2RlKCkgewogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50LmJvZHk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgbWF0Y2hlc0VsZW1lbnQgPSBfbWF0Y2hlczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRhaW5zRWxlbWVudCA9IF9jb250YWluczsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGludm9rZVF1ZXJ5ID0gX3F1ZXJ5OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iamVjdAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaHlwZW5hdGVQcm9wc09iamVjdChvYmplY3QpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3T2JqID0ge307CiAgICAgICAgT2JqZWN0LmtleXMob2JqZWN0KS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld1Byb3AgPSBwcm9wLnJlcGxhY2UoLyhbYS16XSkoW0EtWl0pL2csICckMS0kMicpOwogICAgICAgICAgICBuZXdPYmpbbmV3UHJvcF0gPSBvYmplY3RbcHJvcF07CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBuZXdPYmo7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci9hbmltYXRpb25fZHJpdmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTm9vcEFuaW1hdGlvbkRyaXZlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZVN0eWxlUHJvcGVydHkocHJvcCkgewogICAgICAgICAgICByZXR1cm4gdmFsaWRhdGVTdHlsZVByb3BlcnR5KHByb3ApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXRjaGVzRWxlbWVudChlbGVtZW50LCBzZWxlY3RvcikgewogICAgICAgICAgICByZXR1cm4gbWF0Y2hlc0VsZW1lbnQoZWxlbWVudCwgc2VsZWN0b3IpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsbTEKICAgICAgICAgKiBAcGFyYW0gez99IGVsbTIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvbnRhaW5zRWxlbWVudChlbG0xLCBlbG0yKSB7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc0VsZW1lbnQoZWxtMSwgZWxtMik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgKiBAcGFyYW0gez99IG11bHRpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBxdWVyeShlbGVtZW50LCBzZWxlY3RvciwgbXVsdGkpIHsKICAgICAgICAgICAgcmV0dXJuIGludm9rZVF1ZXJ5KGVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY29tcHV0ZVN0eWxlKGVsZW1lbnQsIHByb3AsIGRlZmF1bHRWYWx1ZSkgewogICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlIHx8ICcnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmcKICAgICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnMKICAgICAgICAgKiBAcGFyYW0gez89fSBzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYW5pbWF0ZShlbGVtZW50LCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMgPSBbXSwgc2NydWJiZXJBY2Nlc3NSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBOb29wQW5pbWF0aW9uUGxheWVyKGR1cmF0aW9uLCBkZWxheSk7CiAgICAgICAgfQogICAgfQogICAgTm9vcEFuaW1hdGlvbkRyaXZlci7JtWZhYyA9IGZ1bmN0aW9uIE5vb3BBbmltYXRpb25Ecml2ZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTm9vcEFuaW1hdGlvbkRyaXZlcikoKTsgfTsKICAgIE5vb3BBbmltYXRpb25Ecml2ZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTm9vcEFuaW1hdGlvbkRyaXZlciwgZmFjdG9yeTogTm9vcEFuaW1hdGlvbkRyaXZlci7JtWZhYyB9KTsKICAgIC8qKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBBbmltYXRpb25Ecml2ZXIgewogICAgfQogICAgQW5pbWF0aW9uRHJpdmVyLk5PT1AgPSBuZXcgTm9vcEFuaW1hdGlvbkRyaXZlcigpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy91dGlsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE9ORV9TRUNPTkQgPSAxMDAwOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1VCU1RJVFVUSU9OX0VYUFJfU1RBUlQgPSAne3snOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1VCU1RJVFVUSU9OX0VYUFJfRU5EID0gJ319JzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEVOVEVSX0NMQVNTTkFNRSA9ICduZy1lbnRlcic7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBMRUFWRV9DTEFTU05BTUUgPSAnbmctbGVhdmUnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTkdfVFJJR0dFUl9DTEFTU05BTUUgPSAnbmctdHJpZ2dlcic7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOR19UUklHR0VSX1NFTEVDVE9SID0gJy5uZy10cmlnZ2VyJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5HX0FOSU1BVElOR19DTEFTU05BTUUgPSAnbmctYW5pbWF0aW5nJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5HX0FOSU1BVElOR19TRUxFQ1RPUiA9ICcubmctYW5pbWF0aW5nJzsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZVRpbWluZ1ZhbHVlKHZhbHVlKSB7CiAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PSAnbnVtYmVyJykKICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaGVzID0gdmFsdWUubWF0Y2goL14oLT9bXC5cZF0rKShtP3MpLyk7CiAgICAgICAgaWYgKCFtYXRjaGVzIHx8IG1hdGNoZXMubGVuZ3RoIDwgMikKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgcmV0dXJuIF9jb252ZXJ0VGltZVZhbHVlVG9NUyhwYXJzZUZsb2F0KG1hdGNoZXNbMV0pLCBtYXRjaGVzWzJdKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSB1bml0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfY29udmVydFRpbWVWYWx1ZVRvTVModmFsdWUsIHVuaXQpIHsKICAgICAgICBzd2l0Y2ggKHVuaXQpIHsKICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgKiBPTkVfU0VDT05EOwogICAgICAgICAgICBkZWZhdWx0OiAvLyBtcyBvciBzb21ldGhpbmcgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0aW1pbmdzCiAgICAgKiBAcGFyYW0gez99IGVycm9ycwogICAgICogQHBhcmFtIHs/PX0gYWxsb3dOZWdhdGl2ZVZhbHVlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVzb2x2ZVRpbWluZyh0aW1pbmdzLCBlcnJvcnMsIGFsbG93TmVnYXRpdmVWYWx1ZXMpIHsKICAgICAgICByZXR1cm4gdGltaW5ncy5oYXNPd25Qcm9wZXJ0eSgnZHVyYXRpb24nKSA/CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aW1pbmdzKSkgOgogICAgICAgICAgICBwYXJzZVRpbWVFeHByZXNzaW9uKCgvKiogQHR5cGUgez99ICovICh0aW1pbmdzKSksIGVycm9ycywgYWxsb3dOZWdhdGl2ZVZhbHVlcyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXhwCiAgICAgKiBAcGFyYW0gez99IGVycm9ycwogICAgICogQHBhcmFtIHs/PX0gYWxsb3dOZWdhdGl2ZVZhbHVlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VUaW1lRXhwcmVzc2lvbihleHAsIGVycm9ycywgYWxsb3dOZWdhdGl2ZVZhbHVlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZWdleCA9IC9eKC0/W1wuXGRdKykobT9zKSg/OlxzKygtP1tcLlxkXSspKG0/cykpPyg/OlxzKyhbLWEtel0rKD86XCguKz9cKSk/KSk/JC9pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZHVyYXRpb247CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBkZWxheSA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBlYXNpbmcgPSAnJzsKICAgICAgICBpZiAodHlwZW9mIGV4cCA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXRjaGVzID0gZXhwLm1hdGNoKHJlZ2V4KTsKICAgICAgICAgICAgaWYgKG1hdGNoZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGBUaGUgcHJvdmlkZWQgdGltaW5nIHZhbHVlICIke2V4cH0iIGlzIGludmFsaWQuYCk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBkdXJhdGlvbjogMCwgZGVsYXk6IDAsIGVhc2luZzogJycgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBkdXJhdGlvbiA9IF9jb252ZXJ0VGltZVZhbHVlVG9NUyhwYXJzZUZsb2F0KG1hdGNoZXNbMV0pLCBtYXRjaGVzWzJdKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWxheU1hdGNoID0gbWF0Y2hlc1szXTsKICAgICAgICAgICAgaWYgKGRlbGF5TWF0Y2ggIT0gbnVsbCkgewogICAgICAgICAgICAgICAgZGVsYXkgPSBfY29udmVydFRpbWVWYWx1ZVRvTVMocGFyc2VGbG9hdChkZWxheU1hdGNoKSwgbWF0Y2hlc1s0XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlYXNpbmdWYWwgPSBtYXRjaGVzWzVdOwogICAgICAgICAgICBpZiAoZWFzaW5nVmFsKSB7CiAgICAgICAgICAgICAgICBlYXNpbmcgPSBlYXNpbmdWYWw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIGR1cmF0aW9uID0gZXhwOwogICAgICAgIH0KICAgICAgICBpZiAoIWFsbG93TmVnYXRpdmVWYWx1ZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29udGFpbnNFcnJvcnMgPSBmYWxzZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3RhcnRJbmRleCA9IGVycm9ycy5sZW5ndGg7CiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGBEdXJhdGlvbiB2YWx1ZXMgYmVsb3cgMCBhcmUgbm90IGFsbG93ZWQgZm9yIHRoaXMgYW5pbWF0aW9uIHN0ZXAuYCk7CiAgICAgICAgICAgICAgICBjb250YWluc0Vycm9ycyA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRlbGF5IDwgMCkgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYERlbGF5IHZhbHVlcyBiZWxvdyAwIGFyZSBub3QgYWxsb3dlZCBmb3IgdGhpcyBhbmltYXRpb24gc3RlcC5gKTsKICAgICAgICAgICAgICAgIGNvbnRhaW5zRXJyb3JzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29udGFpbnNFcnJvcnMpIHsKICAgICAgICAgICAgICAgIGVycm9ycy5zcGxpY2Uoc3RhcnRJbmRleCwgMCwgYFRoZSBwcm92aWRlZCB0aW1pbmcgdmFsdWUgIiR7ZXhwfSIgaXMgaW52YWxpZC5gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4geyBkdXJhdGlvbiwgZGVsYXksIGVhc2luZyB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHBhcmFtIHs/PX0gZGVzdGluYXRpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvcHlPYmoob2JqLCBkZXN0aW5hdGlvbiA9IHt9KSB7CiAgICAgICAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb3AgPT4gewogICAgICAgICAgICBkZXN0aW5hdGlvbltwcm9wXSA9IG9ialtwcm9wXTsKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIGRlc3RpbmF0aW9uOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0eWxlcwogICAgICogQHBhcmFtIHs/fSByZWFkUHJvdG90eXBlCiAgICAgKiBAcGFyYW0gez89fSBkZXN0aW5hdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29weVN0eWxlcyhzdHlsZXMsIHJlYWRQcm90b3R5cGUsIGRlc3RpbmF0aW9uID0ge30pIHsKICAgICAgICBpZiAocmVhZFByb3RvdHlwZSkgewogICAgICAgICAgICAvLyB3ZSBtYWtlIHVzZSBvZiBhIGZvci1pbiBsb29wIHNvIHRoYXQgdGhlCiAgICAgICAgICAgIC8vIHByb3RvdHlwaWNhbGx5IGluaGVyaXRlZCBwcm9wZXJ0aWVzIGFyZQogICAgICAgICAgICAvLyByZXZlYWxlZCBmcm9tIHRoZSBiYWNrRmlsbCBtYXAKICAgICAgICAgICAgZm9yIChsZXQgcHJvcCBpbiBzdHlsZXMpIHsKICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uW3Byb3BdID0gc3R5bGVzW3Byb3BdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb3B5T2JqKHN0eWxlcywgZGVzdGluYXRpb24pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZGVzdGluYXRpb247CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFN0eWxlQXR0cmlidXRlU3RyaW5nKGVsZW1lbnQsIGtleSwgdmFsdWUpIHsKICAgICAgICAvLyBSZXR1cm4gdGhlIGtleS12YWx1ZSBwYWlyIHN0cmluZyB0byBiZSBhZGRlZCB0byB0aGUgc3R5bGUgYXR0cmlidXRlIGZvciB0aGUKICAgICAgICAvLyBnaXZlbiBDU1Mgc3R5bGUga2V5LgogICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4ga2V5ICsgJzonICsgdmFsdWUgKyAnOyc7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHdyaXRlU3R5bGVBdHRyaWJ1dGUoZWxlbWVudCkgewogICAgICAgIC8vIFJlYWQgdGhlIHN0eWxlIHByb3BlcnR5IG9mIHRoZSBlbGVtZW50IGFuZCBtYW51YWxseSByZWZsZWN0IGl0IHRvIHRoZQogICAgICAgIC8vIHN0eWxlIGF0dHJpYnV0ZS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBEb21pbm8gb24gcGxhdGZvcm0tc2VydmVyIGRvZXNuJ3QKICAgICAgICAvLyB1bmRlcnN0YW5kIHRoZSBmdWxsIHNldCBvZiBhbGxvd2VkIENTUyBwcm9wZXJ0aWVzIGFuZCBkb2Vzbid0IHJlZmxlY3Qgc29tZQogICAgICAgIC8vIG9mIHRoZW0gYXV0b21hdGljYWxseS4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN0eWxlQXR0clZhbHVlID0gJyc7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50LnN0eWxlLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5ID0gZWxlbWVudC5zdHlsZS5pdGVtKGkpOwogICAgICAgICAgICBzdHlsZUF0dHJWYWx1ZSArPSBnZXRTdHlsZUF0dHJpYnV0ZVN0cmluZyhlbGVtZW50LCBrZXksIGVsZW1lbnQuc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZShrZXkpKTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gZWxlbWVudC5zdHlsZSkgewogICAgICAgICAgICAvLyBTa2lwIGludGVybmFsIERvbWlubyBwcm9wZXJ0aWVzIHRoYXQgZG9uJ3QgbmVlZCB0byBiZSByZWZsZWN0ZWQuCiAgICAgICAgICAgIGlmICghZWxlbWVudC5zdHlsZS5oYXNPd25Qcm9wZXJ0eShrZXkpIHx8IGtleS5zdGFydHNXaXRoKCdfJykpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGFzaEtleSA9IGNhbWVsQ2FzZVRvRGFzaENhc2UkMShrZXkpOwogICAgICAgICAgICBzdHlsZUF0dHJWYWx1ZSArPSBnZXRTdHlsZUF0dHJpYnV0ZVN0cmluZyhlbGVtZW50LCBkYXNoS2V5LCBlbGVtZW50LnN0eWxlW2tleV0pOwogICAgICAgIH0KICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnc3R5bGUnLCBzdHlsZUF0dHJWYWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEBwYXJhbSB7Pz19IGZvcm1lclN0eWxlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0U3R5bGVzKGVsZW1lbnQsIHN0eWxlcywgZm9ybWVyU3R5bGVzKSB7CiAgICAgICAgaWYgKGVsZW1lbnRbJ3N0eWxlJ10pIHsKICAgICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVsUHJvcCA9IGRhc2hDYXNlVG9DYW1lbENhc2UocHJvcCk7CiAgICAgICAgICAgICAgICBpZiAoZm9ybWVyU3R5bGVzICYmICFmb3JtZXJTdHlsZXMuaGFzT3duUHJvcGVydHkocHJvcCkpIHsKICAgICAgICAgICAgICAgICAgICBmb3JtZXJTdHlsZXNbcHJvcF0gPSBlbGVtZW50LnN0eWxlW2NhbWVsUHJvcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlW2NhbWVsUHJvcF0gPSBzdHlsZXNbcHJvcF07CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gT24gdGhlIHNlcnZlciBzZXQgdGhlICdzdHlsZScgYXR0cmlidXRlIHNpbmNlIGl0J3Mgbm90IGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkLgogICAgICAgICAgICBpZiAoaXNOb2RlKCkpIHsKICAgICAgICAgICAgICAgIHdyaXRlU3R5bGVBdHRyaWJ1dGUoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGVyYXNlU3R5bGVzKGVsZW1lbnQsIHN0eWxlcykgewogICAgICAgIGlmIChlbGVtZW50WydzdHlsZSddKSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjYW1lbFByb3AgPSBkYXNoQ2FzZVRvQ2FtZWxDYXNlKHByb3ApOwogICAgICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtjYW1lbFByb3BdID0gJyc7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gT24gdGhlIHNlcnZlciBzZXQgdGhlICdzdHlsZScgYXR0cmlidXRlIHNpbmNlIGl0J3Mgbm90IGF1dG9tYXRpY2FsbHkgcmVmbGVjdGVkLgogICAgICAgICAgICBpZiAoaXNOb2RlKCkpIHsKICAgICAgICAgICAgICAgIHdyaXRlU3R5bGVBdHRyaWJ1dGUoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RlcHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZUFuaW1hdGlvbkVudHJ5KHN0ZXBzKSB7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3RlcHMpKSB7CiAgICAgICAgICAgIGlmIChzdGVwcy5sZW5ndGggPT0gMSkKICAgICAgICAgICAgICAgIHJldHVybiBzdGVwc1swXTsKICAgICAgICAgICAgcmV0dXJuIHNlcXVlbmNlKHN0ZXBzKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChzdGVwcykpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2YWxpZGF0ZVN0eWxlUGFyYW1zKHZhbHVlLCBvcHRpb25zLCBlcnJvcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXMgfHwge307CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hdGNoZXMgPSBleHRyYWN0U3R5bGVQYXJhbXModmFsdWUpOwogICAgICAgIGlmIChtYXRjaGVzLmxlbmd0aCkgewogICAgICAgICAgICBtYXRjaGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhck5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhck5hbWUgPT4gewogICAgICAgICAgICAgICAgaWYgKCFwYXJhbXMuaGFzT3duUHJvcGVydHkodmFyTmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgVW5hYmxlIHRvIHJlc29sdmUgdGhlIGxvY2FsIGFuaW1hdGlvbiBwYXJhbSAke3Zhck5hbWV9IGluIHRoZSBnaXZlbiBsaXN0IG9mIHZhbHVlc2ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUEFSQU1fUkVHRVggPSBuZXcgUmVnRXhwKGAke1NVQlNUSVRVVElPTl9FWFBSX1NUQVJUfVxccyooLis/KVxccyoke1NVQlNUSVRVVElPTl9FWFBSX0VORH1gLCAnZycpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBleHRyYWN0U3R5bGVQYXJhbXModmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcmFtcyA9IFtdOwogICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1hdGNoOwogICAgICAgICAgICB3aGlsZSAobWF0Y2ggPSBQQVJBTV9SRUdFWC5leGVjKHZhbHVlKSkgewogICAgICAgICAgICAgICAgcGFyYW1zLnB1c2goKC8qKiBAdHlwZSB7P30gKi8gKG1hdGNoWzFdKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIFBBUkFNX1JFR0VYLmxhc3RJbmRleCA9IDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgKiBAcGFyYW0gez99IGVycm9ycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVQYXJhbXModmFsdWUsIHBhcmFtcywgZXJyb3JzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9yaWdpbmFsID0gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyID0gb3JpZ2luYWwucmVwbGFjZShQQVJBTV9SRUdFWCwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAqIEBwYXJhbSB7P30gdmFyTmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKF8sIHZhck5hbWUpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbG9jYWxWYWwgPSBwYXJhbXNbdmFyTmFtZV07CiAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUgd2FzIG5ldmVyIG92ZXJyaWRkZW4gYnkgdGhlIGRhdGEgcGFzc2VkIGluIGJ5IHRoZSB1c2VyCiAgICAgICAgICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHZhck5hbWUpKSB7CiAgICAgICAgICAgICAgICBlcnJvcnMucHVzaChgUGxlYXNlIHByb3ZpZGUgYSB2YWx1ZSBmb3IgdGhlIGFuaW1hdGlvbiBwYXJhbSAke3Zhck5hbWV9YCk7CiAgICAgICAgICAgICAgICBsb2NhbFZhbCA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBsb2NhbFZhbC50b1N0cmluZygpOwogICAgICAgIH0pKTsKICAgICAgICAvLyB3ZSBkbyB0aGlzIHRvIGFzc2VydCB0aGF0IG51bWVyaWMgdmFsdWVzIHN0YXkgYXMgdGhleSBhcmUKICAgICAgICByZXR1cm4gc3RyID09IG9yaWdpbmFsID8gdmFsdWUgOiBzdHI7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaXRlcmF0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGl0ZXJhdG9yVG9BcnJheShpdGVyYXRvcikgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhcnIgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGl0ZW0gPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgd2hpbGUgKCFpdGVtLmRvbmUpIHsKICAgICAgICAgICAgYXJyLnB1c2goaXRlbS52YWx1ZSk7CiAgICAgICAgICAgIGl0ZW0gPSBpdGVyYXRvci5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnI7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBEQVNIX0NBU0VfUkVHRVhQID0gLy0rKFthLXowLTldKS9nOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlucHV0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBkYXNoQ2FzZVRvQ2FtZWxDYXNlKGlucHV0KSB7CiAgICAgICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoREFTSF9DQVNFX1JFR0VYUCwgKC8qKgogICAgICAgICAqIEBwYXJhbSB7Li4uP30gbQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKC4uLm0pID0+IG1bMV0udG9VcHBlckNhc2UoKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlucHV0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjYW1lbENhc2VUb0Rhc2hDYXNlJDEoaW5wdXQpIHsKICAgICAgICByZXR1cm4gaW5wdXQucmVwbGFjZSgvKFthLXpdKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkdXJhdGlvbgogICAgICogQHBhcmFtIHs/fSBkZWxheQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYWxsb3dQcmV2aW91c1BsYXllclN0eWxlc01lcmdlKGR1cmF0aW9uLCBkZWxheSkgewogICAgICAgIHJldHVybiBkdXJhdGlvbiA9PT0gMCB8fCBkZWxheSA9PT0gMDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICogQHBhcmFtIHs/fSBwcmV2aW91c1N0eWxlcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYmFsYW5jZVByZXZpb3VzU3R5bGVzSW50b0tleWZyYW1lcyhlbGVtZW50LCBrZXlmcmFtZXMsIHByZXZpb3VzU3R5bGVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHByZXZpb3VzU3R5bGVQcm9wcyA9IE9iamVjdC5rZXlzKHByZXZpb3VzU3R5bGVzKTsKICAgICAgICBpZiAocHJldmlvdXNTdHlsZVByb3BzLmxlbmd0aCAmJiBrZXlmcmFtZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0YXJ0aW5nS2V5ZnJhbWUgPSBrZXlmcmFtZXNbMF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1pc3NpbmdTdHlsZVByb3BzID0gW107CiAgICAgICAgICAgIHByZXZpb3VzU3R5bGVQcm9wcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgIGlmICghc3RhcnRpbmdLZXlmcmFtZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIG1pc3NpbmdTdHlsZVByb3BzLnB1c2gocHJvcCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdGFydGluZ0tleWZyYW1lW3Byb3BdID0gcHJldmlvdXNTdHlsZXNbcHJvcF07CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKG1pc3NpbmdTdHlsZVByb3BzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lCiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGtleWZyYW1lcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQga2YgPSBrZXlmcmFtZXNbaV07CiAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1N0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAocHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBrZltwcm9wXSA9IGNvbXB1dGVTdHlsZShlbGVtZW50LCBwcm9wKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGtleWZyYW1lczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2aXNpdG9yCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmlzaXREc2xOb2RlKHZpc2l0b3IsIG5vZGUsIGNvbnRleHQpIHsKICAgICAgICBzd2l0Y2ggKG5vZGUudHlwZSkgewogICAgICAgICAgICBjYXNlIDcgLyogVHJpZ2dlciAqLzoKICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0VHJpZ2dlcihub2RlLCBjb250ZXh0KTsKICAgICAgICAgICAgY2FzZSAwIC8qIFN0YXRlICovOgogICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRTdGF0ZShub2RlLCBjb250ZXh0KTsKICAgICAgICAgICAgY2FzZSAxIC8qIFRyYW5zaXRpb24gKi86CiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFRyYW5zaXRpb24obm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGNhc2UgMiAvKiBTZXF1ZW5jZSAqLzoKICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U2VxdWVuY2Uobm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGNhc2UgMyAvKiBHcm91cCAqLzoKICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0R3JvdXAobm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGNhc2UgNCAvKiBBbmltYXRlICovOgogICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRBbmltYXRlKG5vZGUsIGNvbnRleHQpOwogICAgICAgICAgICBjYXNlIDUgLyogS2V5ZnJhbWVzICovOgogICAgICAgICAgICAgICAgcmV0dXJuIHZpc2l0b3IudmlzaXRLZXlmcmFtZXMobm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGNhc2UgNiAvKiBTdHlsZSAqLzoKICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0U3R5bGUobm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGNhc2UgOCAvKiBSZWZlcmVuY2UgKi86CiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFJlZmVyZW5jZShub2RlLCBjb250ZXh0KTsKICAgICAgICAgICAgY2FzZSA5IC8qIEFuaW1hdGVDaGlsZCAqLzoKICAgICAgICAgICAgICAgIHJldHVybiB2aXNpdG9yLnZpc2l0QW5pbWF0ZUNoaWxkKG5vZGUsIGNvbnRleHQpOwogICAgICAgICAgICBjYXNlIDEwIC8qIEFuaW1hdGVSZWYgKi86CiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdEFuaW1hdGVSZWYobm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGNhc2UgMTEgLyogUXVlcnkgKi86CiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFF1ZXJ5KG5vZGUsIGNvbnRleHQpOwogICAgICAgICAgICBjYXNlIDEyIC8qIFN0YWdnZXIgKi86CiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaXRvci52aXNpdFN0YWdnZXIobm9kZSwgY29udGV4dCk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byByZXNvbHZlIGFuaW1hdGlvbiBtZXRhZGF0YSBub2RlICMke25vZGUudHlwZX1gKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb21wdXRlU3R5bGUoZWxlbWVudCwgcHJvcCkgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQpKSkpW3Byb3BdOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9kc2wvYW5pbWF0aW9uX3RyYW5zaXRpb25fZXhwci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEFOWV9TVEFURSA9ICcqJzsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0cmFuc2l0aW9uVmFsdWUKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZVRyYW5zaXRpb25FeHByKHRyYW5zaXRpb25WYWx1ZSwgZXJyb3JzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4cHJlc3Npb25zID0gW107CiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2l0aW9uVmFsdWUgPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgdHJhbnNpdGlvblZhbHVlLnNwbGl0KC9ccyosXHMqLykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdHIgPT4gcGFyc2VJbm5lclRyYW5zaXRpb25TdHIoc3RyLCBleHByZXNzaW9ucywgZXJyb3JzKSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaCgoLyoqIEB0eXBlIHs/fSAqLyAodHJhbnNpdGlvblZhbHVlKSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZXZlbnRTdHIKICAgICAqIEBwYXJhbSB7P30gZXhwcmVzc2lvbnMKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUlubmVyVHJhbnNpdGlvblN0cihldmVudFN0ciwgZXhwcmVzc2lvbnMsIGVycm9ycykgewogICAgICAgIGlmIChldmVudFN0clswXSA9PSAnOicpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJzZUFuaW1hdGlvbkFsaWFzKGV2ZW50U3RyLCBlcnJvcnMpOwogICAgICAgICAgICBpZiAodHlwZW9mIHJlc3VsdCA9PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBleHByZXNzaW9ucy5wdXNoKHJlc3VsdCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZXZlbnRTdHIgPSByZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaCA9IGV2ZW50U3RyLm1hdGNoKC9eKFwqfFstXHddKylccyooPD9bPS1dPilccyooXCp8Wy1cd10rKSQvKTsKICAgICAgICBpZiAobWF0Y2ggPT0gbnVsbCB8fCBtYXRjaC5sZW5ndGggPCA0KSB7CiAgICAgICAgICAgIGVycm9ycy5wdXNoKGBUaGUgcHJvdmlkZWQgdHJhbnNpdGlvbiBleHByZXNzaW9uICIke2V2ZW50U3RyfSIgaXMgbm90IHN1cHBvcnRlZGApOwogICAgICAgICAgICByZXR1cm4gZXhwcmVzc2lvbnM7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmcm9tU3RhdGUgPSBtYXRjaFsxXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc2VwYXJhdG9yID0gbWF0Y2hbMl07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRvU3RhdGUgPSBtYXRjaFszXTsKICAgICAgICBleHByZXNzaW9ucy5wdXNoKG1ha2VMYW1iZGFGcm9tU3RhdGVzKGZyb21TdGF0ZSwgdG9TdGF0ZSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpc0Z1bGxBbnlTdGF0ZUV4cHIgPSBmcm9tU3RhdGUgPT0gQU5ZX1NUQVRFICYmIHRvU3RhdGUgPT0gQU5ZX1NUQVRFOwogICAgICAgIGlmIChzZXBhcmF0b3JbMF0gPT0gJzwnICYmICFpc0Z1bGxBbnlTdGF0ZUV4cHIpIHsKICAgICAgICAgICAgZXhwcmVzc2lvbnMucHVzaChtYWtlTGFtYmRhRnJvbVN0YXRlcyh0b1N0YXRlLCBmcm9tU3RhdGUpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYWxpYXMKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUFuaW1hdGlvbkFsaWFzKGFsaWFzLCBlcnJvcnMpIHsKICAgICAgICBzd2l0Y2ggKGFsaWFzKSB7CiAgICAgICAgICAgIGNhc2UgJzplbnRlcic6CiAgICAgICAgICAgICAgICByZXR1cm4gJ3ZvaWQgPT4gKic7CiAgICAgICAgICAgIGNhc2UgJzpsZWF2ZSc6CiAgICAgICAgICAgICAgICByZXR1cm4gJyogPT4gdm9pZCc7CiAgICAgICAgICAgIGNhc2UgJzppbmNyZW1lbnQnOgogICAgICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZnJvbVN0YXRlCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHRvU3RhdGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChmcm9tU3RhdGUsIHRvU3RhdGUpID0+IHBhcnNlRmxvYXQodG9TdGF0ZSkgPiBwYXJzZUZsb2F0KGZyb21TdGF0ZSkpOwogICAgICAgICAgICBjYXNlICc6ZGVjcmVtZW50JzoKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZyb21TdGF0ZQogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b1N0YXRlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZnJvbVN0YXRlLCB0b1N0YXRlKSA9PiBwYXJzZUZsb2F0KHRvU3RhdGUpIDwgcGFyc2VGbG9hdChmcm9tU3RhdGUpKTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIGVycm9ycy5wdXNoKGBUaGUgdHJhbnNpdGlvbiBhbGlhcyB2YWx1ZSAiJHthbGlhc30iIGlzIG5vdCBzdXBwb3J0ZWRgKTsKICAgICAgICAgICAgICAgIHJldHVybiAnKiA9PiAqJzsKICAgICAgICB9CiAgICB9CiAgICAvLyBETyBOT1QgUkVGQUNUT1IgLi4uIGtlZXAgdGhlIGZvbGxvdyBzZXQgaW5zdGFudGlhdGlvbnMKICAgIC8vIHdpdGggdGhlIHZhbHVlcyBpbnRhY3QgKGNsb3N1cmUgY29tcGlsZXIgZm9yIHNvbWUgcmVhc29uCiAgICAvLyByZW1vdmVzIGZvbGxvdy11cCBsaW5lcyB0aGF0IGFkZCB0aGUgdmFsdWVzIG91dHNpZGUgb2YKICAgIC8vIHRoZSBjb25zdHJ1Y3Rvci4uLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVFJVRV9CT09MRUFOX1ZBTFVFUyA9IG5ldyBTZXQoWyd0cnVlJywgJzEnXSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBGQUxTRV9CT09MRUFOX1ZBTFVFUyA9IG5ldyBTZXQoWydmYWxzZScsICcwJ10pOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGxocwogICAgICogQHBhcmFtIHs/fSByaHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VMYW1iZGFGcm9tU3RhdGVzKGxocywgcmhzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IExIU19NQVRDSF9CT09MRUFOID0gVFJVRV9CT09MRUFOX1ZBTFVFUy5oYXMobGhzKSB8fCBGQUxTRV9CT09MRUFOX1ZBTFVFUy5oYXMobGhzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgUkhTX01BVENIX0JPT0xFQU4gPSBUUlVFX0JPT0xFQU5fVkFMVUVTLmhhcyhyaHMpIHx8IEZBTFNFX0JPT0xFQU5fVkFMVUVTLmhhcyhyaHMpOwogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRvU3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmcm9tU3RhdGUsIHRvU3RhdGUpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbGhzTWF0Y2ggPSBsaHMgPT0gQU5ZX1NUQVRFIHx8IGxocyA9PSBmcm9tU3RhdGU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJoc01hdGNoID0gcmhzID09IEFOWV9TVEFURSB8fCByaHMgPT0gdG9TdGF0ZTsKICAgICAgICAgICAgaWYgKCFsaHNNYXRjaCAmJiBMSFNfTUFUQ0hfQk9PTEVBTiAmJiB0eXBlb2YgZnJvbVN0YXRlID09PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgIGxoc01hdGNoID0gZnJvbVN0YXRlID8gVFJVRV9CT09MRUFOX1ZBTFVFUy5oYXMobGhzKSA6IEZBTFNFX0JPT0xFQU5fVkFMVUVTLmhhcyhsaHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghcmhzTWF0Y2ggJiYgUkhTX01BVENIX0JPT0xFQU4gJiYgdHlwZW9mIHRvU3RhdGUgPT09ICdib29sZWFuJykgewogICAgICAgICAgICAgICAgcmhzTWF0Y2ggPSB0b1N0YXRlID8gVFJVRV9CT09MRUFOX1ZBTFVFUy5oYXMocmhzKSA6IEZBTFNFX0JPT0xFQU5fVkFMVUVTLmhhcyhyaHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBsaHNNYXRjaCAmJiByaHNNYXRjaDsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl9hc3RfYnVpbGRlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTRUxGX1RPS0VOID0gJzpzZWxmJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNFTEZfVE9LRU5fUkVHRVggPSBuZXcgUmVnRXhwKGBccyoke1NFTEZfVE9LRU59XHMqLD9gLCAnZycpOwogICAgLyoKICAgICAqIFtWYWxpZGF0aW9uXQogICAgICogVGhlIHZpc2l0b3IgY29kZSBiZWxvdyB3aWxsIHRyYXZlcnNlIHRoZSBhbmltYXRpb24gQVNUIGdlbmVyYXRlZCBieSB0aGUgYW5pbWF0aW9uIHZlcmIgZnVuY3Rpb25zCiAgICAgKiAodGhlIG91dHB1dCBpcyBhIHRyZWUgb2Ygb2JqZWN0cykgYW5kIGF0dGVtcHQgdG8gcGVyZm9ybSBhIHNlcmllcyBvZiB2YWxpZGF0aW9ucyBvbiB0aGUgZGF0YS4gVGhlCiAgICAgKiBmb2xsb3dpbmcgY29ybmVyLWNhc2VzIHdpbGwgYmUgdmFsaWRhdGVkOgogICAgICoKICAgICAqIDEuIE92ZXJsYXAgb2YgYW5pbWF0aW9ucwogICAgICogR2l2ZW4gdGhhdCBhIENTUyBwcm9wZXJ0eSBjYW5ub3QgYmUgYW5pbWF0ZWQgaW4gbW9yZSB0aGFuIG9uZSBwbGFjZSBhdCB0aGUgc2FtZSB0aW1lLCBpdCdzCiAgICAgKiBpbXBvcnRhbnQgdGhhdCB0aGlzIGJlaGF2aW9yIGlzIGRldGVjdGVkIGFuZCB2YWxpZGF0ZWQuIFRoZSB3YXkgaW4gd2hpY2ggdGhpcyBvY2N1cnMgaXMgdGhhdAogICAgICogZWFjaCB0aW1lIGEgc3R5bGUgcHJvcGVydHkgaXMgZXhhbWluZWQsIGEgc3RyaW5nLW1hcCBjb250YWluaW5nIHRoZSBwcm9wZXJ0eSB3aWxsIGJlIHVwZGF0ZWQgd2l0aAogICAgICogdGhlIHN0YXJ0IGFuZCBlbmQgdGltZXMgZm9yIHdoZW4gdGhlIHByb3BlcnR5IGlzIHVzZWQgd2l0aGluIGFuIGFuaW1hdGlvbiBzdGVwLgogICAgICoKICAgICAqIElmIHRoZXJlIGFyZSB0d28gb3IgbW9yZSBwYXJhbGxlbCBhbmltYXRpb25zIHRoYXQgYXJlIGN1cnJlbnRseSBydW5uaW5nICh0aGVzZSBhcmUgaW52b2tlZCBieSB0aGUKICAgICAqIGdyb3VwKCkpIG9uIHRoZSBzYW1lIGVsZW1lbnQgdGhlbiB0aGUgdmFsaWRhdG9yIHdpbGwgdGhyb3cgYW4gZXJyb3IuIFNpbmNlIHRoZSBzdGFydC9lbmQgdGltaW5nCiAgICAgKiB2YWx1ZXMgYXJlIGNvbGxlY3RlZCBmb3IgZWFjaCBwcm9wZXJ0eSB0aGVuIGlmIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzdGVwIGlzIGFuaW1hdGluZyB0aGUgc2FtZQogICAgICogcHJvcGVydHkgYW5kIGl0cyB0aW1pbmcgdmFsdWVzIGZhbGwgYW55d2hlcmUgaW50byB0aGUgd2luZG93IG9mIHRpbWUgdGhhdCB0aGUgcHJvcGVydHkgaXMKICAgICAqIGN1cnJlbnRseSBiZWluZyBhbmltYXRlZCB3aXRoaW4gdGhlbiB0aGlzIGlzIHdoYXQgY2F1c2VzIGFuIGVycm9yLgogICAgICoKICAgICAqIDIuIFRpbWluZyB2YWx1ZXMKICAgICAqIFRoZSB2YWxpZGF0b3Igd2lsbCB2YWxpZGF0ZSB0byBzZWUgaWYgYSB0aW1pbmcgdmFsdWUgb2YgYGR1cmF0aW9uIGRlbGF5IGVhc2luZ2Agb3IKICAgICAqIGBkdXJhdGlvbk51bWJlcmAgaXMgdmFsaWQgb3Igbm90LgogICAgICoKICAgICAqIChub3RlIHRoYXQgdXBvbiB2YWxpZGF0aW9uIHRoZSBjb2RlIGJlbG93IHdpbGwgcmVwbGFjZSB0aGUgdGltaW5nIGRhdGEgd2l0aCBhbiBvYmplY3QgY29udGFpbmluZwogICAgICoge2R1cmF0aW9uLGRlbGF5LGVhc2luZ30uCiAgICAgKgogICAgICogMy4gT2Zmc2V0IFZhbGlkYXRpb24KICAgICAqIEVhY2ggb2YgdGhlIHN0eWxlKCkgY2FsbHMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBhbiBvZmZzZXQgdmFsdWUgd2hlbiBwbGFjZWQgaW5zaWRlIG9mIGtleWZyYW1lcygpLgogICAgICogT2Zmc2V0cyB3aXRoaW4ga2V5ZnJhbWVzKCkgYXJlIGNvbnNpZGVyZWQgdmFsaWQgd2hlbjoKICAgICAqCiAgICAgKiAgIC0gTm8gb2Zmc2V0cyBhcmUgdXNlZCBhdCBhbGwKICAgICAqICAgLSBFYWNoIHN0eWxlKCkgZW50cnkgY29udGFpbnMgYW4gb2Zmc2V0IHZhbHVlCiAgICAgKiAgIC0gRWFjaCBvZmZzZXQgaXMgYmV0d2VlbiAwIGFuZCAxCiAgICAgKiAgIC0gRWFjaCBvZmZzZXQgaXMgZ3JlYXRlciB0byBvciBlcXVhbCB0aGFuIHRoZSBwcmV2aW91cyBvbmUKICAgICAqCiAgICAgKiBPdGhlcndpc2UgYW4gZXJyb3Igd2lsbCBiZSB0aHJvd24uCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkcml2ZXIKICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBidWlsZEFuaW1hdGlvbkFzdChkcml2ZXIsIG1ldGFkYXRhLCBlcnJvcnMpIHsKICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvbkFzdEJ1aWxkZXJWaXNpdG9yKGRyaXZlcikuYnVpbGQobWV0YWRhdGEsIGVycm9ycyk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBST09UX1NFTEVDVE9SID0gJyc7CiAgICBjbGFzcyBBbmltYXRpb25Bc3RCdWlsZGVyVmlzaXRvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZHJpdmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2RyaXZlcikgewogICAgICAgICAgICB0aGlzLl9kcml2ZXIgPSBfZHJpdmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJ1aWxkKG1ldGFkYXRhLCBlcnJvcnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZXh0ID0gbmV3IEFuaW1hdGlvbkFzdEJ1aWxkZXJDb250ZXh0KGVycm9ycyk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0Q29udGV4dFN0eWxlVGltaW5nU3RhdGUoY29udGV4dCk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmlzaXREc2xOb2RlKHRoaXMsIG5vcm1hbGl6ZUFuaW1hdGlvbkVudHJ5KG1ldGFkYXRhKSwgY29udGV4dCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKGNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3RvciA9IFJPT1RfU0VMRUNUT1I7CiAgICAgICAgICAgIGNvbnRleHQuY29sbGVjdGVkU3R5bGVzID0ge307CiAgICAgICAgICAgIGNvbnRleHQuY29sbGVjdGVkU3R5bGVzW1JPT1RfU0VMRUNUT1JdID0ge307CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbWUgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdFRyaWdnZXIobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcXVlcnlDb3VudCA9IGNvbnRleHQucXVlcnlDb3VudCA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGRlcENvdW50ID0gY29udGV4dC5kZXBDb3VudCA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhdGVzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbnMgPSBbXTsKICAgICAgICAgICAgaWYgKG1ldGFkYXRhLm5hbWUuY2hhckF0KDApID09ICdAJykgewogICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaCgnYW5pbWF0aW9uIHRyaWdnZXJzIGNhbm5vdCBiZSBwcmVmaXhlZCB3aXRoIGFuIGBAYCBzaWduIChlLmcuIHRyaWdnZXIoXCdAZm9vXCcsIFsuLi5dKSknKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBtZXRhZGF0YS5kZWZpbml0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlZiA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldENvbnRleHRTdHlsZVRpbWluZ1N0YXRlKGNvbnRleHQpOwogICAgICAgICAgICAgICAgaWYgKGRlZi50eXBlID09IDAgLyogU3RhdGUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdGVEZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGVmKSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBzdGF0ZURlZi5uYW1lOwogICAgICAgICAgICAgICAgICAgIG5hbWUudG9TdHJpbmcoKS5zcGxpdCgvXHMqLFxzKi8pLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlRGVmLm5hbWUgPSBuOwogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZXMucHVzaCh0aGlzLnZpc2l0U3RhdGUoc3RhdGVEZWYsIGNvbnRleHQpKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgc3RhdGVEZWYubmFtZSA9IG5hbWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkZWYudHlwZSA9PSAxIC8qIFRyYW5zaXRpb24gKi8pIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJhbnNpdGlvbiA9IHRoaXMudmlzaXRUcmFuc2l0aW9uKCgvKiogQHR5cGUgez99ICovIChkZWYpKSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgcXVlcnlDb3VudCArPSB0cmFuc2l0aW9uLnF1ZXJ5Q291bnQ7CiAgICAgICAgICAgICAgICAgICAgZGVwQ291bnQgKz0gdHJhbnNpdGlvbi5kZXBDb3VudDsKICAgICAgICAgICAgICAgICAgICB0cmFuc2l0aW9ucy5wdXNoKHRyYW5zaXRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaCgnb25seSBzdGF0ZSgpIGFuZCB0cmFuc2l0aW9uKCkgZGVmaW5pdGlvbnMgY2FuIHNpdCBpbnNpZGUgb2YgYSB0cmlnZ2VyKCknKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdHlwZTogNyAvKiBUcmlnZ2VyICovLAogICAgICAgICAgICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSwKICAgICAgICAgICAgICAgIHN0YXRlcywKICAgICAgICAgICAgICAgIHRyYW5zaXRpb25zLAogICAgICAgICAgICAgICAgcXVlcnlDb3VudCwKICAgICAgICAgICAgICAgIGRlcENvdW50LAogICAgICAgICAgICAgICAgb3B0aW9uczogbnVsbAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdFN0YXRlKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVBc3QgPSB0aGlzLnZpc2l0U3R5bGUobWV0YWRhdGEuc3R5bGVzLCBjb250ZXh0KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhc3RQYXJhbXMgPSAobWV0YWRhdGEub3B0aW9ucyAmJiBtZXRhZGF0YS5vcHRpb25zLnBhcmFtcykgfHwgbnVsbDsKICAgICAgICAgICAgaWYgKHN0eWxlQXN0LmNvbnRhaW5zRHluYW1pY1N0eWxlcykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWlzc2luZ1N1YnMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhc3RQYXJhbXMgfHwge307CiAgICAgICAgICAgICAgICBzdHlsZUFzdC5zdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YWx1ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0JDEodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVzT2JqID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlc09iaikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0U3R5bGVQYXJhbXMoc3R5bGVzT2JqW3Byb3BdKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3ViCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyYW1zLmhhc093blByb3BlcnR5KHN1YikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ1N1YnMuYWRkKHN1Yik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgaWYgKG1pc3NpbmdTdWJzLnNpemUpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzc2luZ1N1YnNBcnIgPSBpdGVyYXRvclRvQXJyYXkobWlzc2luZ1N1YnMudmFsdWVzKCkpOwogICAgICAgICAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goYHN0YXRlKCIke21ldGFkYXRhCiAgICAgICAgICAgICAgICAgICAgLm5hbWV9IiwgLi4uKSBtdXN0IGRlZmluZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHRoZSBmb2xsb3dpbmcgc3R5bGUgc3Vic3RpdHV0aW9uczogJHttaXNzaW5nU3Vic0Fyci5qb2luKCcsICcpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0eXBlOiAwIC8qIFN0YXRlICovLAogICAgICAgICAgICAgICAgbmFtZTogbWV0YWRhdGEubmFtZSwKICAgICAgICAgICAgICAgIHN0eWxlOiBzdHlsZUFzdCwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IGFzdFBhcmFtcyA/IHsgcGFyYW1zOiBhc3RQYXJhbXMgfSA6IG51bGwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRUcmFuc2l0aW9uKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnRleHQucXVlcnlDb3VudCA9IDA7CiAgICAgICAgICAgIGNvbnRleHQuZGVwQ291bnQgPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbiA9IHZpc2l0RHNsTm9kZSh0aGlzLCBub3JtYWxpemVBbmltYXRpb25FbnRyeShtZXRhZGF0YS5hbmltYXRpb24pLCBjb250ZXh0KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXRjaGVycyA9IHBhcnNlVHJhbnNpdGlvbkV4cHIobWV0YWRhdGEuZXhwciwgY29udGV4dC5lcnJvcnMpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdHlwZTogMSAvKiBUcmFuc2l0aW9uICovLAogICAgICAgICAgICAgICAgbWF0Y2hlcnMsCiAgICAgICAgICAgICAgICBhbmltYXRpb24sCiAgICAgICAgICAgICAgICBxdWVyeUNvdW50OiBjb250ZXh0LnF1ZXJ5Q291bnQsCiAgICAgICAgICAgICAgICBkZXBDb3VudDogY29udGV4dC5kZXBDb3VudCwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5vcm1hbGl6ZUFuaW1hdGlvbk9wdGlvbnMobWV0YWRhdGEub3B0aW9ucykKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRTZXF1ZW5jZShtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdHlwZTogMiAvKiBTZXF1ZW5jZSAqLywKICAgICAgICAgICAgICAgIHN0ZXBzOiBtZXRhZGF0YS5zdGVwcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBzID0+IHZpc2l0RHNsTm9kZSh0aGlzLCBzLCBjb250ZXh0KSkpLAogICAgICAgICAgICAgICAgb3B0aW9uczogbm9ybWFsaXplQW5pbWF0aW9uT3B0aW9ucyhtZXRhZGF0YS5vcHRpb25zKQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdEdyb3VwKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudFRpbWUgPSBjb250ZXh0LmN1cnJlbnRUaW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBmdXJ0aGVzdFRpbWUgPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0ZXBzID0gbWV0YWRhdGEuc3RlcHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGVwCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGVwID0+IHsKICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbWUgPSBjdXJyZW50VGltZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQXN0ID0gdmlzaXREc2xOb2RlKHRoaXMsIHN0ZXAsIGNvbnRleHQpOwogICAgICAgICAgICAgICAgZnVydGhlc3RUaW1lID0gTWF0aC5tYXgoZnVydGhlc3RUaW1lLCBjb250ZXh0LmN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBpbm5lckFzdDsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lID0gZnVydGhlc3RUaW1lOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdHlwZTogMyAvKiBHcm91cCAqLywKICAgICAgICAgICAgICAgIHN0ZXBzLAogICAgICAgICAgICAgICAgb3B0aW9uczogbm9ybWFsaXplQW5pbWF0aW9uT3B0aW9ucyhtZXRhZGF0YS5vcHRpb25zKQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdEFuaW1hdGUobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1pbmdBc3QgPSBjb25zdHJ1Y3RUaW1pbmdBc3QobWV0YWRhdGEudGltaW5ncywgY29udGV4dC5lcnJvcnMpOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncyA9IHRpbWluZ0FzdDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3R5bGVBc3Q7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0eWxlTWV0YWRhdGEgPSBtZXRhZGF0YS5zdHlsZXMgPyBtZXRhZGF0YS5zdHlsZXMgOiBzdHlsZSh7fSk7CiAgICAgICAgICAgIGlmIChzdHlsZU1ldGFkYXRhLnR5cGUgPT0gNSAvKiBLZXlmcmFtZXMgKi8pIHsKICAgICAgICAgICAgICAgIHN0eWxlQXN0ID0gdGhpcy52aXNpdEtleWZyYW1lcygoLyoqIEB0eXBlIHs/fSAqLyAoc3R5bGVNZXRhZGF0YSkpLCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBzdHlsZU1ldGFkYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKG1ldGFkYXRhLnN0eWxlcykpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGlzRW1wdHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICghc3R5bGVNZXRhZGF0YSkgewogICAgICAgICAgICAgICAgICAgIGlzRW1wdHkgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdTdHlsZURhdGEgPSB7fTsKICAgICAgICAgICAgICAgICAgICBpZiAodGltaW5nQXN0LmVhc2luZykgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZURhdGFbJ2Vhc2luZyddID0gdGltaW5nQXN0LmVhc2luZzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgc3R5bGVNZXRhZGF0YSA9IHN0eWxlKG5ld1N0eWxlRGF0YSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lICs9IHRpbWluZ0FzdC5kdXJhdGlvbiArIHRpbWluZ0FzdC5kZWxheTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IF9zdHlsZUFzdCA9IHRoaXMudmlzaXRTdHlsZShzdHlsZU1ldGFkYXRhLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIF9zdHlsZUFzdC5pc0VtcHR5U3RlcCA9IGlzRW1wdHk7CiAgICAgICAgICAgICAgICBzdHlsZUFzdCA9IF9zdHlsZUFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncyA9IG51bGw7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0eXBlOiA0IC8qIEFuaW1hdGUgKi8sCiAgICAgICAgICAgICAgICB0aW1pbmdzOiB0aW1pbmdBc3QsCiAgICAgICAgICAgICAgICBzdHlsZTogc3R5bGVBc3QsCiAgICAgICAgICAgICAgICBvcHRpb25zOiBudWxsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0U3R5bGUobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhc3QgPSB0aGlzLl9tYWtlU3R5bGVBc3QobWV0YWRhdGEsIGNvbnRleHQpOwogICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVN0eWxlQXN0KGFzdCwgY29udGV4dCk7CiAgICAgICAgICAgIHJldHVybiBhc3Q7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX21ha2VTdHlsZUFzdChtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IFtdOwogICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhZGF0YS5zdHlsZXMpKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKG1ldGFkYXRhLnN0eWxlcykpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVUdXBsZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgc3R5bGVUdXBsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzdHlsZVR1cGxlID09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVR1cGxlID09IEFVVE9fU1RZTEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlcy5wdXNoKHN0eWxlVHVwbGUpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgVGhlIHByb3ZpZGVkIHN0eWxlIHN0cmluZyB2YWx1ZSAke3N0eWxlVHVwbGV9IGlzIG5vdCBhbGxvd2VkLmApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChzdHlsZVR1cGxlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdHlsZXMucHVzaChtZXRhZGF0YS5zdHlsZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbnRhaW5zRHluYW1pY1N0eWxlcyA9IGZhbHNlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjb2xsZWN0ZWRFYXNpbmcgPSBudWxsOwogICAgICAgICAgICBzdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVEYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdHlsZURhdGEgPT4gewogICAgICAgICAgICAgICAgaWYgKGlzT2JqZWN0JDEoc3R5bGVEYXRhKSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZU1hcCA9ICgvKiogQHR5cGUgez99ICovIChzdHlsZURhdGEpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWFzaW5nID0gc3R5bGVNYXBbJ2Vhc2luZyddOwogICAgICAgICAgICAgICAgICAgIGlmIChlYXNpbmcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkRWFzaW5nID0gKC8qKiBAdHlwZSB7P30gKi8gKGVhc2luZykpOwogICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgc3R5bGVNYXBbJ2Vhc2luZyddOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbnRhaW5zRHluYW1pY1N0eWxlcykgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHN0eWxlTWFwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0eWxlTWFwW3Byb3BdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnRvU3RyaW5nKCkuaW5kZXhPZihTVUJTVElUVVRJT05fRVhQUl9TVEFSVCkgPj0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zRHluYW1pY1N0eWxlcyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHR5cGU6IDYgLyogU3R5bGUgKi8sCiAgICAgICAgICAgICAgICBzdHlsZXMsCiAgICAgICAgICAgICAgICBlYXNpbmc6IGNvbGxlY3RlZEVhc2luZywKICAgICAgICAgICAgICAgIG9mZnNldDogbWV0YWRhdGEub2Zmc2V0LAogICAgICAgICAgICAgICAgY29udGFpbnNEeW5hbWljU3R5bGVzLAogICAgICAgICAgICAgICAgb3B0aW9uczogbnVsbAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVTdHlsZUFzdChhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1pbmdzID0gY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3M7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGVuZFRpbWUgPSBjb250ZXh0LmN1cnJlbnRUaW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdGFydFRpbWUgPSBjb250ZXh0LmN1cnJlbnRUaW1lOwogICAgICAgICAgICBpZiAodGltaW5ncyAmJiBzdGFydFRpbWUgPiAwKSB7CiAgICAgICAgICAgICAgICBzdGFydFRpbWUgLT0gdGltaW5ncy5kdXJhdGlvbiArIHRpbWluZ3MuZGVsYXk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgYXN0LnN0eWxlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0dXBsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdHVwbGUgPT4gewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0dXBsZSA9PSAnc3RyaW5nJykKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0dXBsZSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZHJpdmVyLnZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHByb3BlcnR5ICIke3Byb3B9IiBpcyBub3QgYSBzdXBwb3J0ZWQgQ1NTIHByb3BlcnR5IGZvciBhbmltYXRpb25zYCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbGxlY3RlZFN0eWxlcyA9IGNvbnRleHQuY29sbGVjdGVkU3R5bGVzWygvKiogQHR5cGUgez99ICovIChjb250ZXh0LmN1cnJlbnRRdWVyeVNlbGVjdG9yKSldOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2xsZWN0ZWRFbnRyeSA9IGNvbGxlY3RlZFN0eWxlc1twcm9wXTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IHVwZGF0ZUNvbGxlY3RlZFN0eWxlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICBpZiAoY29sbGVjdGVkRW50cnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSAhPSBlbmRUaW1lICYmIHN0YXJ0VGltZSA+PSBjb2xsZWN0ZWRFbnRyeS5zdGFydFRpbWUgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFRpbWUgPD0gY29sbGVjdGVkRW50cnkuZW5kVGltZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgVGhlIENTUyBwcm9wZXJ0eSAiJHtwcm9wfSIgdGhhdCBleGlzdHMgYmV0d2VlbiB0aGUgdGltZXMgb2YgIiR7Y29sbGVjdGVkRW50cnkuc3RhcnRUaW1lfW1zIiBhbmQgIiR7Y29sbGVjdGVkRW50cnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5lbmRUaW1lfW1zIiBpcyBhbHNvIGJlaW5nIGFuaW1hdGVkIGluIGEgcGFyYWxsZWwgYW5pbWF0aW9uIGJldHdlZW4gdGhlIHRpbWVzIG9mICIke3N0YXJ0VGltZX1tcyIgYW5kICIke2VuZFRpbWV9bXMiYCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVDb2xsZWN0ZWRTdHlsZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFsd2F5cyBjaG9vc2UgdGhlIHNtYWxsZXIgc3RhcnQgdGltZSB2YWx1ZSBzaW5jZSB3ZQogICAgICAgICAgICAgICAgICAgICAgICAvLyB3YW50IHRvIGhhdmUgYSByZWNvcmQgb2YgdGhlIGVudGlyZSBhbmltYXRpb24gd2luZG93IHdoZXJlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBzdHlsZSBwcm9wZXJ0eSBpcyBiZWluZyBhbmltYXRlZCBpbiBiZXR3ZWVuCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0VGltZSA9IGNvbGxlY3RlZEVudHJ5LnN0YXJ0VGltZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZUNvbGxlY3RlZFN0eWxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbGxlY3RlZFN0eWxlc1twcm9wXSA9IHsgc3RhcnRUaW1lLCBlbmRUaW1lIH07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChjb250ZXh0Lm9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGVTdHlsZVBhcmFtcyh0dXBsZVtwcm9wXSwgY29udGV4dC5vcHRpb25zLCBjb250ZXh0LmVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0S2V5ZnJhbWVzKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXN0ID0geyB0eXBlOiA1IC8qIEtleWZyYW1lcyAqLywgc3R5bGVzOiBbXSwgb3B0aW9uczogbnVsbCB9OwogICAgICAgICAgICBpZiAoIWNvbnRleHQuY3VycmVudEFuaW1hdGVUaW1pbmdzKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKGBrZXlmcmFtZXMoKSBtdXN0IGJlIHBsYWNlZCBpbnNpZGUgb2YgYSBjYWxsIHRvIGFuaW1hdGUoKWApOwogICAgICAgICAgICAgICAgcmV0dXJuIGFzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IE1BWF9LRVlGUkFNRV9PRkZTRVQgPSAxOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0b3RhbEtleWZyYW1lc1dpdGhPZmZzZXRzID0gMDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvZmZzZXRzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG9mZnNldHNPdXRPZk9yZGVyID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGtleWZyYW1lc091dE9mUmFuZ2UgPSBmYWxzZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHJldmlvdXNPZmZzZXQgPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGtleWZyYW1lcyA9IG1ldGFkYXRhLnN0ZXBzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdHlsZXMgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9tYWtlU3R5bGVBc3Qoc3R5bGVzLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBvZmZzZXRWYWwgPSBzdHlsZS5vZmZzZXQgIT0gbnVsbCA/IHN0eWxlLm9mZnNldCA6IGNvbnN1bWVPZmZzZXQoc3R5bGUuc3R5bGVzKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBvZmZzZXQgPSAwOwogICAgICAgICAgICAgICAgaWYgKG9mZnNldFZhbCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdG90YWxLZXlmcmFtZXNXaXRoT2Zmc2V0cysrOwogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHN0eWxlLm9mZnNldCA9IG9mZnNldFZhbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGtleWZyYW1lc091dE9mUmFuZ2UgPSBrZXlmcmFtZXNPdXRPZlJhbmdlIHx8IG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gMTsKICAgICAgICAgICAgICAgIG9mZnNldHNPdXRPZk9yZGVyID0gb2Zmc2V0c091dE9mT3JkZXIgfHwgb2Zmc2V0IDwgcHJldmlvdXNPZmZzZXQ7CiAgICAgICAgICAgICAgICBwcmV2aW91c09mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgIG9mZnNldHMucHVzaChvZmZzZXQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmIChrZXlmcmFtZXNPdXRPZlJhbmdlKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmVycm9ycy5wdXNoKGBQbGVhc2UgZW5zdXJlIHRoYXQgYWxsIGtleWZyYW1lIG9mZnNldHMgYXJlIGJldHdlZW4gMCBhbmQgMWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvZmZzZXRzT3V0T2ZPcmRlcikgewogICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgUGxlYXNlIGVuc3VyZSB0aGF0IGFsbCBrZXlmcmFtZSBvZmZzZXRzIGFyZSBpbiBvcmRlcmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGVuZ3RoID0gbWV0YWRhdGEuc3RlcHMubGVuZ3RoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRPZmZzZXQgPSAwOwogICAgICAgICAgICBpZiAodG90YWxLZXlmcmFtZXNXaXRoT2Zmc2V0cyA+IDAgJiYgdG90YWxLZXlmcmFtZXNXaXRoT2Zmc2V0cyA8IGxlbmd0aCkgewogICAgICAgICAgICAgICAgY29udGV4dC5lcnJvcnMucHVzaChgTm90IGFsbCBzdHlsZSgpIHN0ZXBzIHdpdGhpbiB0aGUgZGVjbGFyZWQga2V5ZnJhbWVzKCkgY29udGFpbiBvZmZzZXRzYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodG90YWxLZXlmcmFtZXNXaXRoT2Zmc2V0cyA9PSAwKSB7CiAgICAgICAgICAgICAgICBnZW5lcmF0ZWRPZmZzZXQgPSBNQVhfS0VZRlJBTUVfT0ZGU0VUIC8gKGxlbmd0aCAtIDEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGltaXQgPSBsZW5ndGggLSAxOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRUaW1lID0gY29udGV4dC5jdXJyZW50VGltZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3MpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmltYXRlRHVyYXRpb24gPSBjdXJyZW50QW5pbWF0ZVRpbWluZ3MuZHVyYXRpb247CiAgICAgICAgICAgIGtleWZyYW1lcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChrZiwgaSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gZ2VuZXJhdGVkT2Zmc2V0ID4gMCA/IChpID09IGxpbWl0ID8gMSA6IChnZW5lcmF0ZWRPZmZzZXQgKiBpKSkgOiBvZmZzZXRzW2ldOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZHVyYXRpb25VcFRvVGhpc0ZyYW1lID0gb2Zmc2V0ICogYW5pbWF0ZUR1cmF0aW9uOwogICAgICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGltZSA9IGN1cnJlbnRUaW1lICsgY3VycmVudEFuaW1hdGVUaW1pbmdzLmRlbGF5ICsgZHVyYXRpb25VcFRvVGhpc0ZyYW1lOwogICAgICAgICAgICAgICAgY3VycmVudEFuaW1hdGVUaW1pbmdzLmR1cmF0aW9uID0gZHVyYXRpb25VcFRvVGhpc0ZyYW1lOwogICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVTdHlsZUFzdChrZiwgY29udGV4dCk7CiAgICAgICAgICAgICAgICBrZi5vZmZzZXQgPSBvZmZzZXQ7CiAgICAgICAgICAgICAgICBhc3Quc3R5bGVzLnB1c2goa2YpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiBhc3Q7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0UmVmZXJlbmNlKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0eXBlOiA4IC8qIFJlZmVyZW5jZSAqLywKICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogdmlzaXREc2xOb2RlKHRoaXMsIG5vcm1hbGl6ZUFuaW1hdGlvbkVudHJ5KG1ldGFkYXRhLmFuaW1hdGlvbiksIGNvbnRleHQpLAogICAgICAgICAgICAgICAgb3B0aW9uczogbm9ybWFsaXplQW5pbWF0aW9uT3B0aW9ucyhtZXRhZGF0YS5vcHRpb25zKQogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdEFuaW1hdGVDaGlsZChtZXRhZGF0YSwgY29udGV4dCkgewogICAgICAgICAgICBjb250ZXh0LmRlcENvdW50Kys7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0eXBlOiA5IC8qIEFuaW1hdGVDaGlsZCAqLywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5vcm1hbGl6ZUFuaW1hdGlvbk9wdGlvbnMobWV0YWRhdGEub3B0aW9ucykKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRBbmltYXRlUmVmKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0eXBlOiAxMCAvKiBBbmltYXRlUmVmICovLAogICAgICAgICAgICAgICAgYW5pbWF0aW9uOiB0aGlzLnZpc2l0UmVmZXJlbmNlKG1ldGFkYXRhLmFuaW1hdGlvbiwgY29udGV4dCksCiAgICAgICAgICAgICAgICBvcHRpb25zOiBub3JtYWxpemVBbmltYXRpb25PcHRpb25zKG1ldGFkYXRhLm9wdGlvbnMpCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0YWRhdGEKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0UXVlcnkobWV0YWRhdGEsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnRTZWxlY3RvciA9ICgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmN1cnJlbnRRdWVyeVNlbGVjdG9yKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovICgobWV0YWRhdGEub3B0aW9ucyB8fCB7fSkpKTsKICAgICAgICAgICAgY29udGV4dC5xdWVyeUNvdW50Kys7CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5ID0gbWV0YWRhdGE7CiAgICAgICAgICAgIGNvbnN0IFtzZWxlY3RvciwgaW5jbHVkZVNlbGZdID0gbm9ybWFsaXplU2VsZWN0b3IobWV0YWRhdGEuc2VsZWN0b3IpOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRRdWVyeVNlbGVjdG9yID0KICAgICAgICAgICAgICAgIHBhcmVudFNlbGVjdG9yLmxlbmd0aCA/IChwYXJlbnRTZWxlY3RvciArICcgJyArIHNlbGVjdG9yKSA6IHNlbGVjdG9yOwogICAgICAgICAgICBnZXRPclNldEFzSW5NYXAoY29udGV4dC5jb2xsZWN0ZWRTdHlsZXMsIGNvbnRleHQuY3VycmVudFF1ZXJ5U2VsZWN0b3IsIHt9KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmltYXRpb24gPSB2aXNpdERzbE5vZGUodGhpcywgbm9ybWFsaXplQW5pbWF0aW9uRW50cnkobWV0YWRhdGEuYW5pbWF0aW9uKSwgY29udGV4dCk7CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5ID0gbnVsbDsKICAgICAgICAgICAgY29udGV4dC5jdXJyZW50UXVlcnlTZWxlY3RvciA9IHBhcmVudFNlbGVjdG9yOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdHlwZTogMTEgLyogUXVlcnkgKi8sCiAgICAgICAgICAgICAgICBzZWxlY3RvciwKICAgICAgICAgICAgICAgIGxpbWl0OiBvcHRpb25zLmxpbWl0IHx8IDAsCiAgICAgICAgICAgICAgICBvcHRpb25hbDogISFvcHRpb25zLm9wdGlvbmFsLAogICAgICAgICAgICAgICAgaW5jbHVkZVNlbGYsCiAgICAgICAgICAgICAgICBhbmltYXRpb24sCiAgICAgICAgICAgICAgICBvcmlnaW5hbFNlbGVjdG9yOiBtZXRhZGF0YS5zZWxlY3RvciwKICAgICAgICAgICAgICAgIG9wdGlvbnM6IG5vcm1hbGl6ZUFuaW1hdGlvbk9wdGlvbnMobWV0YWRhdGEub3B0aW9ucykKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRTdGFnZ2VyKG1ldGFkYXRhLCBjb250ZXh0KSB7CiAgICAgICAgICAgIGlmICghY29udGV4dC5jdXJyZW50UXVlcnkpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQuZXJyb3JzLnB1c2goYHN0YWdnZXIoKSBjYW4gb25seSBiZSB1c2VkIGluc2lkZSBvZiBxdWVyeSgpYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1pbmdzID0gbWV0YWRhdGEudGltaW5ncyA9PT0gJ2Z1bGwnID8KICAgICAgICAgICAgICAgIHsgZHVyYXRpb246IDAsIGRlbGF5OiAwLCBlYXNpbmc6ICdmdWxsJyB9IDoKICAgICAgICAgICAgICAgIHJlc29sdmVUaW1pbmcobWV0YWRhdGEudGltaW5ncywgY29udGV4dC5lcnJvcnMsIHRydWUpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgdHlwZTogMTIgLyogU3RhZ2dlciAqLywKICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogdmlzaXREc2xOb2RlKHRoaXMsIG5vcm1hbGl6ZUFuaW1hdGlvbkVudHJ5KG1ldGFkYXRhLmFuaW1hdGlvbiksIGNvbnRleHQpLAogICAgICAgICAgICAgICAgdGltaW5ncywKICAgICAgICAgICAgICAgIG9wdGlvbnM6IG51bGwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhhc0FtcGVyc2FuZCA9IHNlbGVjdG9yLnNwbGl0KC9ccyosXHMqLykuZmluZCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9rZW4gPT4gdG9rZW4gPT0gU0VMRl9UT0tFTikpID8gdHJ1ZSA6IGZhbHNlOwogICAgICAgIGlmIChoYXNBbXBlcnNhbmQpIHsKICAgICAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKFNFTEZfVE9LRU5fUkVHRVgsICcnKTsKICAgICAgICB9CiAgICAgICAgLy8gdGhlIDplbnRlciBhbmQgOmxlYXZlIHNlbGVjdG9ycyBhcmUgZmlsbGVkIGluIGF0IHJ1bnRpbWUgZHVyaW5nIHRpbWVsaW5lIGJ1aWxkaW5nCiAgICAgICAgc2VsZWN0b3IgPSBzZWxlY3Rvci5yZXBsYWNlKC9AXCovZywgTkdfVFJJR0dFUl9TRUxFQ1RPUikKICAgICAgICAgICAgLnJlcGxhY2UoL0BcdysvZywgKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWF0Y2gKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hdGNoID0+IE5HX1RSSUdHRVJfU0VMRUNUT1IgKyAnLScgKyBtYXRjaC5zdWJzdHIoMSkpKQogICAgICAgICAgICAucmVwbGFjZSgvOmFuaW1hdGluZy9nLCBOR19BTklNQVRJTkdfU0VMRUNUT1IpOwogICAgICAgIHJldHVybiBbc2VsZWN0b3IsIGhhc0FtcGVyc2FuZF07CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVQYXJhbXMob2JqKSB7CiAgICAgICAgcmV0dXJuIG9iaiA/IGNvcHlPYmoob2JqKSA6IG51bGw7CiAgICB9CiAgICBjbGFzcyBBbmltYXRpb25Bc3RCdWlsZGVyQ29udGV4dCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlcnJvcnMpIHsKICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgICAgIHRoaXMucXVlcnlDb3VudCA9IDA7CiAgICAgICAgICAgIHRoaXMuZGVwQ291bnQgPSAwOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRUcmFuc2l0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5jdXJyZW50UXVlcnkgPSBudWxsOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVyeVNlbGVjdG9yID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSBudWxsOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lID0gMDsKICAgICAgICAgICAgdGhpcy5jb2xsZWN0ZWRTdHlsZXMgPSB7fTsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb25zdW1lT2Zmc2V0KHN0eWxlcykgewogICAgICAgIGlmICh0eXBlb2Ygc3R5bGVzID09ICdzdHJpbmcnKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG9mZnNldCA9IG51bGw7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSkgewogICAgICAgICAgICBzdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVUdXBsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3R5bGVUdXBsZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaXNPYmplY3QkMShzdHlsZVR1cGxlKSAmJiBzdHlsZVR1cGxlLmhhc093blByb3BlcnR5KCdvZmZzZXQnKSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmogPSAoLyoqIEB0eXBlIHs/fSAqLyAoc3R5bGVUdXBsZSkpOwogICAgICAgICAgICAgICAgICAgIG9mZnNldCA9IHBhcnNlRmxvYXQoKC8qKiBAdHlwZSB7P30gKi8gKG9ialsnb2Zmc2V0J10pKSk7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9ialsnb2Zmc2V0J107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaXNPYmplY3QkMShzdHlsZXMpICYmIHN0eWxlcy5oYXNPd25Qcm9wZXJ0eSgnb2Zmc2V0JykpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvYmogPSBzdHlsZXM7CiAgICAgICAgICAgIG9mZnNldCA9IHBhcnNlRmxvYXQoKC8qKiBAdHlwZSB7P30gKi8gKG9ialsnb2Zmc2V0J10pKSk7CiAgICAgICAgICAgIGRlbGV0ZSBvYmpbJ29mZnNldCddOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2Zmc2V0OwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc09iamVjdCQxKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuICFBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB0eXBlb2YgdmFsdWUgPT0gJ29iamVjdCc7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb25zdHJ1Y3RUaW1pbmdBc3QodmFsdWUsIGVycm9ycykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgdGltaW5ncyA9IG51bGw7CiAgICAgICAgaWYgKHZhbHVlLmhhc093blByb3BlcnR5KCdkdXJhdGlvbicpKSB7CiAgICAgICAgICAgIHRpbWluZ3MgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZHVyYXRpb24gPSByZXNvbHZlVGltaW5nKHZhbHVlLCBlcnJvcnMpLmR1cmF0aW9uOwogICAgICAgICAgICByZXR1cm4gbWFrZVRpbWluZ0FzdChkdXJhdGlvbiwgMCwgJycpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmFsdWUpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNEeW5hbWljID0gc3RyVmFsdWUuc3BsaXQoL1xzKy8pLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdiA9PiB2LmNoYXJBdCgwKSA9PSAneycgJiYgdi5jaGFyQXQoMSkgPT0gJ3snKSk7CiAgICAgICAgaWYgKGlzRHluYW1pYykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFzdCA9ICgvKiogQHR5cGUgez99ICovIChtYWtlVGltaW5nQXN0KDAsIDAsICcnKSkpOwogICAgICAgICAgICBhc3QuZHluYW1pYyA9IHRydWU7CiAgICAgICAgICAgIGFzdC5zdHJWYWx1ZSA9IHN0clZhbHVlOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGFzdCkpOwogICAgICAgIH0KICAgICAgICB0aW1pbmdzID0gdGltaW5ncyB8fCByZXNvbHZlVGltaW5nKHN0clZhbHVlLCBlcnJvcnMpOwogICAgICAgIHJldHVybiBtYWtlVGltaW5nQXN0KHRpbWluZ3MuZHVyYXRpb24sIHRpbWluZ3MuZGVsYXksIHRpbWluZ3MuZWFzaW5nKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVBbmltYXRpb25PcHRpb25zKG9wdGlvbnMpIHsKICAgICAgICBpZiAob3B0aW9ucykgewogICAgICAgICAgICBvcHRpb25zID0gY29weU9iaihvcHRpb25zKTsKICAgICAgICAgICAgaWYgKG9wdGlvbnNbJ3BhcmFtcyddKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zWydwYXJhbXMnXSA9ICgvKiogQHR5cGUgez99ICovIChub3JtYWxpemVQYXJhbXMob3B0aW9uc1sncGFyYW1zJ10pKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIG9wdGlvbnMgPSB7fTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9wdGlvbnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAqIEBwYXJhbSB7P30gZGVsYXkKICAgICAqIEBwYXJhbSB7P30gZWFzaW5nCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtYWtlVGltaW5nQXN0KGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nKSB7CiAgICAgICAgcmV0dXJuIHsgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICogQHBhcmFtIHs/fSBwcmVTdHlsZVByb3BzCiAgICAgKiBAcGFyYW0gez99IHBvc3RTdHlsZVByb3BzCiAgICAgKiBAcGFyYW0gez99IGR1cmF0aW9uCiAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgKiBAcGFyYW0gez89fSBlYXNpbmcKICAgICAqIEBwYXJhbSB7Pz19IHN1YlRpbWVsaW5lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVUaW1lbGluZUluc3RydWN0aW9uKGVsZW1lbnQsIGtleWZyYW1lcywgcHJlU3R5bGVQcm9wcywgcG9zdFN0eWxlUHJvcHMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nID0gbnVsbCwgc3ViVGltZWxpbmUgPSBmYWxzZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHR5cGU6IDEgLyogVGltZWxpbmVBbmltYXRpb24gKi8sCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIGtleWZyYW1lcywKICAgICAgICAgICAgcHJlU3R5bGVQcm9wcywKICAgICAgICAgICAgcG9zdFN0eWxlUHJvcHMsCiAgICAgICAgICAgIGR1cmF0aW9uLAogICAgICAgICAgICBkZWxheSwKICAgICAgICAgICAgdG90YWxUaW1lOiBkdXJhdGlvbiArIGRlbGF5LAogICAgICAgICAgICBlYXNpbmcsCiAgICAgICAgICAgIHN1YlRpbWVsaW5lCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2VsZW1lbnRfaW5zdHJ1Y3Rpb25fbWFwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEVsZW1lbnRJbnN0cnVjdGlvbk1hcCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb25zdW1lKGVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaW5zdHJ1Y3Rpb25zID0gdGhpcy5fbWFwLmdldChlbGVtZW50KTsKICAgICAgICAgICAgaWYgKGluc3RydWN0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucyA9IFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBpbnN0cnVjdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhcHBlbmQoZWxlbWVudCwgaW5zdHJ1Y3Rpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGV4aXN0aW5nSW5zdHJ1Y3Rpb25zID0gdGhpcy5fbWFwLmdldChlbGVtZW50KTsKICAgICAgICAgICAgaWYgKCFleGlzdGluZ0luc3RydWN0aW9ucykgewogICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldChlbGVtZW50LCBleGlzdGluZ0luc3RydWN0aW9ucyA9IFtdKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBleGlzdGluZ0luc3RydWN0aW9ucy5wdXNoKC4uLmluc3RydWN0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFzKGVsZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21hcC5oYXMoZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xlYXIoKSB7CiAgICAgICAgICAgIHRoaXMuX21hcC5jbGVhcigpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl90aW1lbGluZV9idWlsZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE9ORV9GUkFNRV9JTl9NSUxMSVNFQ09ORFMgPSAxOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRU5URVJfVE9LRU4gPSAnOmVudGVyJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEVOVEVSX1RPS0VOX1JFR0VYID0gbmV3IFJlZ0V4cChFTlRFUl9UT0tFTiwgJ2cnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IExFQVZFX1RPS0VOID0gJzpsZWF2ZSc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBMRUFWRV9UT0tFTl9SRUdFWCA9IG5ldyBSZWdFeHAoTEVBVkVfVE9LRU4sICdnJyk7CiAgICAvKgogICAgICogVGhlIGNvZGUgd2l0aGluIHRoaXMgZmlsZSBhaW1zIHRvIGdlbmVyYXRlIHdlYi1hbmltYXRpb25zLWNvbXBhdGlibGUga2V5ZnJhbWVzIGZyb20gQW5ndWxhcidzCiAgICAgKiBhbmltYXRpb24gRFNMIGNvZGUuCiAgICAgKgogICAgICogVGhlIGNvZGUgYmVsb3cgd2lsbCBiZSBjb252ZXJ0ZWQgZnJvbToKICAgICAqCiAgICAgKiBgYGAKICAgICAqIHNlcXVlbmNlKFsKICAgICAqICAgc3R5bGUoeyBvcGFjaXR5OiAwIH0pLAogICAgICogICBhbmltYXRlKDEwMDAsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSkKICAgICAqIF0pCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUbzoKICAgICAqIGBgYAogICAgICoga2V5ZnJhbWVzID0gW3sgb3BhY2l0eTogMCwgb2Zmc2V0OiAwIH0sIHsgb3BhY2l0eTogMSwgb2Zmc2V0OiAxIH1dCiAgICAgKiBkdXJhdGlvbiA9IDEwMDAKICAgICAqIGRlbGF5ID0gMAogICAgICogZWFzaW5nID0gJycKICAgICAqIGBgYAogICAgICoKICAgICAqIEZvciB0aGlzIG9wZXJhdGlvbiB0byBjb3ZlciB0aGUgY29tYmluYXRpb24gb2YgYW5pbWF0aW9uIHZlcmJzIChzdHlsZSwgYW5pbWF0ZSwgZ3JvdXAsIGV0Yy4uLikgYQogICAgICogY29tYmluYXRpb24gb2YgcHJvdG90eXBpY2FsIGluaGVyaXRhbmNlLCBBU1QgdHJhdmVyc2FsIGFuZCBtZXJnZS1zb3J0LWxpa2UgYWxnb3JpdGhtcyBhcmUgdXNlZC4KICAgICAqCiAgICAgKiBbQVNUIFRyYXZlcnNhbF0KICAgICAqIEVhY2ggb2YgdGhlIGFuaW1hdGlvbiB2ZXJicywgd2hlbiBleGVjdXRlZCwgd2lsbCByZXR1cm4gYW4gc3RyaW5nLW1hcCBvYmplY3QgcmVwcmVzZW50aW5nIHdoYXQKICAgICAqIHR5cGUgb2YgYWN0aW9uIGl0IGlzIChzdHlsZSwgYW5pbWF0ZSwgZ3JvdXAsIGV0Yy4uLikgYW5kIHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4gVGhpcyBtZWFucwogICAgICogdGhhdCB3aGVuIGZ1bmN0aW9uYWwgY29tcG9zaXRpb24gbWl4IG9mIHRoZXNlIGZ1bmN0aW9ucyBpcyBldmFsdWF0ZWQgKGxpa2UgaW4gdGhlIGV4YW1wbGUgYWJvdmUpCiAgICAgKiB0aGVuIGl0IHdpbGwgZW5kIHVwIHByb2R1Y2luZyBhIHRyZWUgb2Ygb2JqZWN0cyByZXByZXNlbnRpbmcgdGhlIGFuaW1hdGlvbiBpdHNlbGYuCiAgICAgKgogICAgICogV2hlbiB0aGlzIGFuaW1hdGlvbiBvYmplY3QgdHJlZSBpcyBwcm9jZXNzZWQgYnkgdGhlIHZpc2l0b3IgY29kZSBiZWxvdyBpdCB3aWxsIHZpc2l0IGVhY2ggb2YgdGhlCiAgICAgKiB2ZXJiIHN0YXRlbWVudHMgd2l0aGluIHRoZSB2aXNpdG9yLiBBbmQgZHVyaW5nIGVhY2ggdmlzaXQgaXQgd2lsbCBidWlsZCB0aGUgY29udGV4dCBvZiB0aGUKICAgICAqIGFuaW1hdGlvbiBrZXlmcmFtZXMgYnkgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgYFRpbWVsaW5lQnVpbGRlcmAuCiAgICAgKgogICAgICogW1RpbWVsaW5lQnVpbGRlcl0KICAgICAqIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHRyYWNraW5nIHRoZSBzdHlsZXMgYW5kIGJ1aWxkaW5nIGEgc2VyaWVzIG9mIGtleWZyYW1lIG9iamVjdHMgZm9yIGEKICAgICAqIHRpbWVsaW5lIGJldHdlZW4gYSBzdGFydCBhbmQgZW5kIHRpbWUuIFRoZSBidWlsZGVyIHN0YXJ0cyBvZmYgd2l0aCBhbiBpbml0aWFsIHRpbWVsaW5lIGFuZCBlYWNoCiAgICAgKiB0aW1lIHRoZSBBU1QgY29tZXMgYWNyb3NzIGEgYGdyb3VwKClgLCBga2V5ZnJhbWVzKClgIG9yIGEgY29tYmluYXRpb24gb2YgdGhlIHR3byB3aWh0aW4gYQogICAgICogYHNlcXVlbmNlKClgIHRoZW4gaXQgd2lsbCBnZW5lcmF0ZSBhIHN1YiB0aW1lbGluZSBmb3IgZWFjaCBzdGVwIGFzIHdlbGwgYXMgYSBuZXcgb25lIGFmdGVyCiAgICAgKiB0aGV5IGFyZSBjb21wbGV0ZS4KICAgICAqCiAgICAgKiBBcyB0aGUgQVNUIGlzIHRyYXZlcnNlZCwgdGhlIHRpbWluZyBzdGF0ZSBvbiBlYWNoIG9mIHRoZSB0aW1lbGluZXMgd2lsbCBiZSBpbmNyZW1lbnRlZC4gSWYgYSBzdWIKICAgICAqIHRpbWVsaW5lIHdhcyBjcmVhdGVkIChiYXNlZCBvbiBvbmUgb2YgdGhlIGNhc2VzIGFib3ZlKSB0aGVuIHRoZSBwYXJlbnQgdGltZWxpbmUgd2lsbCBhdHRlbXB0IHRvCiAgICAgKiBtZXJnZSB0aGUgc3R5bGVzIHVzZWQgd2l0aGluIHRoZSBzdWIgdGltZWxpbmVzIGludG8gaXRzZWxmIChvbmx5IHdpdGggZ3JvdXAoKSB0aGlzIHdpbGwgaGFwcGVuKS4KICAgICAqIFRoaXMgaGFwcGVucyB3aXRoIGEgbWVyZ2Ugb3BlcmF0aW9uIChtdWNoIGxpa2UgaG93IHRoZSBtZXJnZSB3b3JrcyBpbiBtZXJnZXNvcnQpIGFuZCBpdCB3aWxsIG9ubHkKICAgICAqIGNvcHkgdGhlIG1vc3QgcmVjZW50bHkgdXNlZCBzdHlsZXMgZnJvbSB0aGUgc3ViIHRpbWVsaW5lcyBpbnRvIHRoZSBwYXJlbnQgdGltZWxpbmUuIFRoaXMgZW5zdXJlcwogICAgICogdGhhdCBpZiB0aGUgc3R5bGVzIGFyZSB1c2VkIGxhdGVyIG9uIGluIGFub3RoZXIgcGhhc2Ugb2YgdGhlIGFuaW1hdGlvbiB0aGVuIHRoZXkgd2lsbCBiZSB0aGUgbW9zdAogICAgICogdXAtdG8tZGF0ZSB2YWx1ZXMuCiAgICAgKgogICAgICogW0hvdyBNaXNzaW5nIFN0eWxlcyBBcmUgVXBkYXRlZF0KICAgICAqIEVhY2ggdGltZWxpbmUgaGFzIGEgYGJhY2tGaWxsYCBwcm9wZXJ0eSB3aGljaCBpcyByZXNwb25zaWJsZSBmb3IgZmlsbGluZyBpbiBuZXcgc3R5bGVzIGludG8KICAgICAqIGFscmVhZHkgcHJvY2Vzc2VkIGtleWZyYW1lcyBpZiBhIG5ldyBzdHlsZSBzaG93cyB1cCBsYXRlciB3aXRoaW4gdGhlIGFuaW1hdGlvbiBzZXF1ZW5jZS4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIHNlcXVlbmNlKFsKICAgICAqICAgc3R5bGUoeyB3aWR0aDogMCB9KSwKICAgICAqICAgYW5pbWF0ZSgxMDAwLCBzdHlsZSh7IHdpZHRoOiAxMDAgfSkpLAogICAgICogICBhbmltYXRlKDEwMDAsIHN0eWxlKHsgd2lkdGg6IDIwMCB9KSksCiAgICAgKiAgIGFuaW1hdGUoMTAwMCwgc3R5bGUoeyB3aWR0aDogMzAwIH0pKQogICAgICogICBhbmltYXRlKDEwMDAsIHN0eWxlKHsgd2lkdGg6IDQwMCwgaGVpZ2h0OiA0MDAgfSkpIC8vIG5vdGljZSBob3cgYGhlaWdodGAgZG9lc24ndCBleGlzdCBhbnl3aGVyZQogICAgICogZWxzZQogICAgICogXSkKICAgICAqIGBgYAogICAgICoKICAgICAqIFdoYXQgaXMgaGFwcGVuaW5nIGhlcmUgaXMgdGhhdCB0aGUgYGhlaWdodGAgdmFsdWUgaXMgYWRkZWQgbGF0ZXIgaW4gdGhlIHNlcXVlbmNlLCBidXQgaXMgbWlzc2luZwogICAgICogZnJvbSBhbGwgcHJldmlvdXMgYW5pbWF0aW9uIHN0ZXBzLiBUaGVyZWZvcmUgd2hlbiBhIGtleWZyYW1lIGlzIGNyZWF0ZWQgaXQgd291bGQgYWxzbyBiZSBtaXNzaW5nCiAgICAgKiBmcm9tIGFsbCBwcmV2aW91cyBrZXlmcmFtZXMgdXAgdW50aWwgd2hlcmUgaXQgaXMgZmlyc3QgdXNlZC4gRm9yIHRoZSB0aW1lbGluZSBrZXlmcmFtZSBnZW5lcmF0aW9uCiAgICAgKiB0byBwcm9wZXJseSBmaWxsIGluIHRoZSBzdHlsZSBpdCB3aWxsIHBsYWNlIHRoZSBwcmV2aW91cyB2YWx1ZSAodGhlIHZhbHVlIGZyb20gdGhlIHBhcmVudAogICAgICogdGltZWxpbmUpIG9yIGEgZGVmYXVsdCB2YWx1ZSBvZiBgKmAgaW50byB0aGUgYmFja0ZpbGwgb2JqZWN0LiBHaXZlbiB0aGF0IGVhY2ggb2YgdGhlIGtleWZyYW1lCiAgICAgKiBzdHlsZXMgYXJlIG9iamVjdHMgdGhhdCBwcm90b3R5cGljYWxseSBpbmhlcnQgZnJvbSB0aGUgYmFja0ZpbGwgb2JqZWN0LCB0aGlzIG1lYW5zIHRoYXQgaWYgYQogICAgICogdmFsdWUgaXMgYWRkZWQgaW50byB0aGUgYmFja0ZpbGwgdGhlbiBpdCB3aWxsIGF1dG9tYXRpY2FsbHkgcHJvcGFnYXRlIGFueSBtaXNzaW5nIHZhbHVlcyB0byBhbGwKICAgICAqIGtleWZyYW1lcy4gVGhlcmVmb3JlIHRoZSBtaXNzaW5nIGBoZWlnaHRgIHZhbHVlIHdpbGwgYmUgcHJvcGVybHkgZmlsbGVkIGludG8gdGhlIGFscmVhZHkKICAgICAqIHByb2Nlc3NlZCBrZXlmcmFtZXMuCiAgICAgKgogICAgICogV2hlbiBhIHN1Yi10aW1lbGluZSBpcyBjcmVhdGVkIGl0IHdpbGwgaGF2ZSBpdHMgb3duIGJhY2tGaWxsIHByb3BlcnR5LiBUaGlzIGlzIGRvbmUgc28gdGhhdAogICAgICogc3R5bGVzIHByZXNlbnQgd2l0aGluIHRoZSBzdWItdGltZWxpbmUgZG8gbm90IGFjY2lkZW50YWxseSBzZWVwIGludG8gdGhlIHByZXZpb3VzL2Z1dHVyZSB0aW1lbGluZQogICAgICoga2V5ZnJhbWVzCiAgICAgKgogICAgICogKEZvciBwcm90b3R5cGljYWxseS1pbmhlcml0ZWQgY29udGVudHMgdG8gYmUgZGV0ZWN0ZWQgYSBgZm9yKGkgaW4gb2JqKWAgbG9vcCBtdXN0IGJlIHVzZWQuKQogICAgICoKICAgICAqIFtWYWxpZGF0aW9uXQogICAgICogVGhlIGNvZGUgaW4gdGhpcyBmaWxlIGlzIG5vdCByZXNwb25zaWJsZSBmb3IgdmFsaWRhdGlvbi4gVGhhdCBmdW5jdGlvbmFsaXR5IGhhcHBlbnMgd2l0aCB3aXRoaW4KICAgICAqIHRoZSBgQW5pbWF0aW9uVmFsaWRhdG9yVmlzaXRvcmAgY29kZS4KICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRyaXZlcgogICAgICogQHBhcmFtIHs/fSByb290RWxlbWVudAogICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAqIEBwYXJhbSB7P30gZW50ZXJDbGFzc05hbWUKICAgICAqIEBwYXJhbSB7P30gbGVhdmVDbGFzc05hbWUKICAgICAqIEBwYXJhbSB7Pz19IHN0YXJ0aW5nU3R5bGVzCiAgICAgKiBAcGFyYW0gez89fSBmaW5hbFN0eWxlcwogICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICogQHBhcmFtIHs/PX0gc3ViSW5zdHJ1Y3Rpb25zCiAgICAgKiBAcGFyYW0gez89fSBlcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkQW5pbWF0aW9uVGltZWxpbmVzKGRyaXZlciwgcm9vdEVsZW1lbnQsIGFzdCwgZW50ZXJDbGFzc05hbWUsIGxlYXZlQ2xhc3NOYW1lLCBzdGFydGluZ1N0eWxlcyA9IHt9LCBmaW5hbFN0eWxlcyA9IHt9LCBvcHRpb25zLCBzdWJJbnN0cnVjdGlvbnMsIGVycm9ycyA9IFtdKSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25UaW1lbGluZUJ1aWxkZXJWaXNpdG9yKCkuYnVpbGRLZXlmcmFtZXMoZHJpdmVyLCByb290RWxlbWVudCwgYXN0LCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIHN0YXJ0aW5nU3R5bGVzLCBmaW5hbFN0eWxlcywgb3B0aW9ucywgc3ViSW5zdHJ1Y3Rpb25zLCBlcnJvcnMpOwogICAgfQogICAgY2xhc3MgQW5pbWF0aW9uVGltZWxpbmVCdWlsZGVyVmlzaXRvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkcml2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IHJvb3RFbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgKiBAcGFyYW0gez99IGVudGVyQ2xhc3NOYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBsZWF2ZUNsYXNzTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRpbmdTdHlsZXMKICAgICAgICAgKiBAcGFyYW0gez99IGZpbmFsU3R5bGVzCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gc3ViSW5zdHJ1Y3Rpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gZXJyb3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBidWlsZEtleWZyYW1lcyhkcml2ZXIsIHJvb3RFbGVtZW50LCBhc3QsIGVudGVyQ2xhc3NOYW1lLCBsZWF2ZUNsYXNzTmFtZSwgc3RhcnRpbmdTdHlsZXMsIGZpbmFsU3R5bGVzLCBvcHRpb25zLCBzdWJJbnN0cnVjdGlvbnMsIGVycm9ycyA9IFtdKSB7CiAgICAgICAgICAgIHN1Ykluc3RydWN0aW9ucyA9IHN1Ykluc3RydWN0aW9ucyB8fCBuZXcgRWxlbWVudEluc3RydWN0aW9uTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBBbmltYXRpb25UaW1lbGluZUNvbnRleHQoZHJpdmVyLCByb290RWxlbWVudCwgc3ViSW5zdHJ1Y3Rpb25zLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIGVycm9ycywgW10pOwogICAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMgPSBvcHRpb25zOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5zZXRTdHlsZXMoW3N0YXJ0aW5nU3R5bGVzXSwgbnVsbCwgY29udGV4dC5lcnJvcnMsIG9wdGlvbnMpOwogICAgICAgICAgICB2aXNpdERzbE5vZGUodGhpcywgYXN0LCBjb250ZXh0KTsKICAgICAgICAgICAgLy8gdGhpcyBjaGVja3MgdG8gc2VlIGlmIGFuIGFjdHVhbCBhbmltYXRpb24gaGFwcGVuZWQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1lbGluZXMgPSBjb250ZXh0LnRpbWVsaW5lcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRpbWVsaW5lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aW1lbGluZSA9PiB0aW1lbGluZS5jb250YWluc0FuaW1hdGlvbigpKSk7CiAgICAgICAgICAgIGlmICh0aW1lbGluZXMubGVuZ3RoICYmIE9iamVjdC5rZXlzKGZpbmFsU3R5bGVzKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRsID0gdGltZWxpbmVzW3RpbWVsaW5lcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgIGlmICghdGwuYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKSkgewogICAgICAgICAgICAgICAgICAgIHRsLnNldFN0eWxlcyhbZmluYWxTdHlsZXNdLCBudWxsLCBjb250ZXh0LmVycm9ycywgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRpbWVsaW5lcy5sZW5ndGggPyB0aW1lbGluZXMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0aW1lbGluZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGltZWxpbmUgPT4gdGltZWxpbmUuYnVpbGRLZXlmcmFtZXMoKSkpIDoKICAgICAgICAgICAgICAgIFtjcmVhdGVUaW1lbGluZUluc3RydWN0aW9uKHJvb3RFbGVtZW50LCBbXSwgW10sIFtdLCAwLCAwLCAnJywgZmFsc2UpXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0VHJpZ2dlcihhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgLy8gdGhlc2UgdmFsdWVzIGFyZSBub3QgdmlzaXRlZCBpbiB0aGlzIEFTVAogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRTdGF0ZShhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgLy8gdGhlc2UgdmFsdWVzIGFyZSBub3QgdmlzaXRlZCBpbiB0aGlzIEFTVAogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRUcmFuc2l0aW9uKGFzdCwgY29udGV4dCkgewogICAgICAgICAgICAvLyB0aGVzZSB2YWx1ZXMgYXJlIG5vdCB2aXNpdGVkIGluIHRoaXMgQVNUCiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdEFuaW1hdGVDaGlsZChhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50SW5zdHJ1Y3Rpb25zID0gY29udGV4dC5zdWJJbnN0cnVjdGlvbnMuY29uc3VtZShjb250ZXh0LmVsZW1lbnQpOwogICAgICAgICAgICBpZiAoZWxlbWVudEluc3RydWN0aW9ucykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gY29udGV4dC5jcmVhdGVTdWJDb250ZXh0KGFzdC5vcHRpb25zKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IHRoaXMuX3Zpc2l0U3ViSW5zdHJ1Y3Rpb25zKGVsZW1lbnRJbnN0cnVjdGlvbnMsIGlubmVyQ29udGV4dCwgKC8qKiBAdHlwZSB7P30gKi8gKGlubmVyQ29udGV4dC5vcHRpb25zKSkpOwogICAgICAgICAgICAgICAgaWYgKHN0YXJ0VGltZSAhPSBlbmRUaW1lKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gdGhpcyBvbiB0aGUgdXBwZXIgY29udGV4dCBiZWNhdXNlIHdlIGNyZWF0ZWQgYSBzdWIgY29udGV4dCBmb3IKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3ViIGNoaWxkIGFuaW1hdGlvbnMKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShlbmRUaW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0QW5pbWF0ZVJlZihhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbm5lckNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZVN1YkNvbnRleHQoYXN0Lm9wdGlvbnMpOwogICAgICAgICAgICBpbm5lckNvbnRleHQudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCk7CiAgICAgICAgICAgIHRoaXMudmlzaXRSZWZlcmVuY2UoYXN0LmFuaW1hdGlvbiwgaW5uZXJDb250ZXh0KTsKICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoaW5uZXJDb250ZXh0LmN1cnJlbnRUaW1lbGluZS5jdXJyZW50VGltZSk7CiAgICAgICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gYXN0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb25zCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdmlzaXRTdWJJbnN0cnVjdGlvbnMoaW5zdHJ1Y3Rpb25zLCBjb250ZXh0LCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gY29udGV4dC5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGZ1cnRoZXN0VGltZSA9IHN0YXJ0VGltZTsKICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNwZWNpYWwtY2FzZSBmb3Igd2hlbiBhIHVzZXIgd2FudHMgdG8gc2tpcCBhIHN1YgogICAgICAgICAgICAvLyBhbmltYXRpb24gZnJvbSBiZWluZyBmaXJlZCBlbnRpcmVseS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IG9wdGlvbnMuZHVyYXRpb24gIT0gbnVsbCA/IHJlc29sdmVUaW1pbmdWYWx1ZShvcHRpb25zLmR1cmF0aW9uKSA6IG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVsYXkgPSBvcHRpb25zLmRlbGF5ICE9IG51bGwgPyByZXNvbHZlVGltaW5nVmFsdWUob3B0aW9ucy5kZWxheSkgOiBudWxsOwogICAgICAgICAgICBpZiAoZHVyYXRpb24gIT09IDApIHsKICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb24KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGluc3RydWN0aW9uID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5zdHJ1Y3Rpb25UaW1pbmdzID0gY29udGV4dC5hcHBlbmRJbnN0cnVjdGlvblRvVGltZWxpbmUoaW5zdHJ1Y3Rpb24sIGR1cmF0aW9uLCBkZWxheSk7CiAgICAgICAgICAgICAgICAgICAgZnVydGhlc3RUaW1lID0KICAgICAgICAgICAgICAgICAgICAgICAgTWF0aC5tYXgoZnVydGhlc3RUaW1lLCBpbnN0cnVjdGlvblRpbWluZ3MuZHVyYXRpb24gKyBpbnN0cnVjdGlvblRpbWluZ3MuZGVsYXkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmdXJ0aGVzdFRpbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdFJlZmVyZW5jZShhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgY29udGV4dC51cGRhdGVPcHRpb25zKGFzdC5vcHRpb25zLCB0cnVlKTsKICAgICAgICAgICAgdmlzaXREc2xOb2RlKHRoaXMsIGFzdC5hbmltYXRpb24sIGNvbnRleHQpOwogICAgICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0U2VxdWVuY2UoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3ViQ29udGV4dENvdW50ID0gY29udGV4dC5zdWJDb250ZXh0Q291bnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGN0eCA9IGNvbnRleHQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IGFzdC5vcHRpb25zOwogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiAob3B0aW9ucy5wYXJhbXMgfHwgb3B0aW9ucy5kZWxheSkpIHsKICAgICAgICAgICAgICAgIGN0eCA9IGNvbnRleHQuY3JlYXRlU3ViQ29udGV4dChvcHRpb25zKTsKICAgICAgICAgICAgICAgIGN0eC50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoKTsKICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmRlbGF5ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3R4LnByZXZpb3VzTm9kZS50eXBlID09IDYgLyogU3R5bGUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICAgICAgICAgICAgICAgICAgY3R4LnByZXZpb3VzTm9kZSA9IERFRkFVTFRfTk9PUF9QUkVWSU9VU19OT0RFOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVsYXkgPSByZXNvbHZlVGltaW5nVmFsdWUob3B0aW9ucy5kZWxheSk7CiAgICAgICAgICAgICAgICAgICAgY3R4LmRlbGF5TmV4dFN0ZXAoZGVsYXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChhc3Quc3RlcHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBhc3Quc3RlcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHMKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHMgPT4gdmlzaXREc2xOb2RlKHRoaXMsIHMsIGN0eCkpKTsKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaGVyZSBqdXN0IGluY2FzZSB0aGUgaW5uZXIgc3RlcHMgb25seSBjb250YWluIG9yIGVuZCB3aXRoIGEgc3R5bGUoKSBjYWxsCiAgICAgICAgICAgICAgICBjdHguY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpOwogICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHNvbWUgYW5pbWF0aW9uIGZ1bmN0aW9uIHdpdGhpbiB0aGUgc2VxdWVuY2UKICAgICAgICAgICAgICAgIC8vIGVuZGVkIHVwIGNyZWF0aW5nIGEgc3ViIHRpbWVsaW5lICh3aGljaCBtZWFucyB0aGUgY3VycmVudAogICAgICAgICAgICAgICAgLy8gdGltZWxpbmUgY2Fubm90IG92ZXJsYXAgd2l0aCB0aGUgY29udGVudHMgb2YgdGhlIHNlcXVlbmNlKQogICAgICAgICAgICAgICAgaWYgKGN0eC5zdWJDb250ZXh0Q291bnQgPiBzdWJDb250ZXh0Q291bnQpIHsKICAgICAgICAgICAgICAgICAgICBjdHgudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBhc3Q7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdEdyb3VwKGFzdCwgY29udGV4dCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlubmVyVGltZWxpbmVzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGZ1cnRoZXN0VGltZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gYXN0Lm9wdGlvbnMgJiYgYXN0Lm9wdGlvbnMuZGVsYXkgPyByZXNvbHZlVGltaW5nVmFsdWUoYXN0Lm9wdGlvbnMuZGVsYXkpIDogMDsKICAgICAgICAgICAgYXN0LnN0ZXBzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHMgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5uZXJDb250ZXh0ID0gY29udGV4dC5jcmVhdGVTdWJDb250ZXh0KGFzdC5vcHRpb25zKTsKICAgICAgICAgICAgICAgIGlmIChkZWxheSkgewogICAgICAgICAgICAgICAgICAgIGlubmVyQ29udGV4dC5kZWxheU5leHRTdGVwKGRlbGF5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBzLCBpbm5lckNvbnRleHQpOwogICAgICAgICAgICAgICAgZnVydGhlc3RUaW1lID0gTWF0aC5tYXgoZnVydGhlc3RUaW1lLCBpbm5lckNvbnRleHQuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lKTsKICAgICAgICAgICAgICAgIGlubmVyVGltZWxpbmVzLnB1c2goaW5uZXJDb250ZXh0LmN1cnJlbnRUaW1lbGluZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gdGhpcyBvcGVyYXRpb24gaXMgcnVuIGFmdGVyIHRoZSBBU1QgbG9vcCBiZWNhdXNlIG90aGVyd2lzZQogICAgICAgICAgICAvLyBpZiB0aGUgcGFyZW50IHRpbWVsaW5lJ3MgY29sbGVjdGVkIHN0eWxlcyB3ZXJlIHVwZGF0ZWQgdGhlbgogICAgICAgICAgICAvLyBpdCB3b3VsZCBwYXNzIGluIGludmFsaWQgZGF0YSBpbnRvIHRoZSBuZXctdG8tYmUgZm9ya2VkIGl0ZW1zCiAgICAgICAgICAgIGlubmVyVGltZWxpbmVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRpbWVsaW5lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aW1lbGluZSA9PiBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5tZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHRpbWVsaW5lKSkpOwogICAgICAgICAgICBjb250ZXh0LnRyYW5zZm9ybUludG9OZXdUaW1lbGluZShmdXJ0aGVzdFRpbWUpOwogICAgICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Zpc2l0VGltaW5nKGFzdCwgY29udGV4dCkgewogICAgICAgICAgICBpZiAoKCgvKiogQHR5cGUgez99ICovIChhc3QpKSkuZHluYW1pYykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RyVmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGFzdCkpKS5zdHJWYWx1ZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRpbWluZ1ZhbHVlID0gY29udGV4dC5wYXJhbXMgPyBpbnRlcnBvbGF0ZVBhcmFtcyhzdHJWYWx1ZSwgY29udGV4dC5wYXJhbXMsIGNvbnRleHQuZXJyb3JzKSA6IHN0clZhbHVlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVUaW1pbmcodGltaW5nVmFsdWUsIGNvbnRleHQuZXJyb3JzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGR1cmF0aW9uOiBhc3QuZHVyYXRpb24sIGRlbGF5OiBhc3QuZGVsYXksIGVhc2luZzogYXN0LmVhc2luZyB9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdEFuaW1hdGUoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltaW5ncyA9IGNvbnRleHQuY3VycmVudEFuaW1hdGVUaW1pbmdzID0gdGhpcy5fdmlzaXRUaW1pbmcoYXN0LnRpbWluZ3MsIGNvbnRleHQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRpbWVsaW5lID0gY29udGV4dC5jdXJyZW50VGltZWxpbmU7CiAgICAgICAgICAgIGlmICh0aW1pbmdzLmRlbGF5KSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmluY3JlbWVudFRpbWUodGltaW5ncy5kZWxheSk7CiAgICAgICAgICAgICAgICB0aW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlID0gYXN0LnN0eWxlOwogICAgICAgICAgICBpZiAoc3R5bGUudHlwZSA9PSA1IC8qIEtleWZyYW1lcyAqLykgewogICAgICAgICAgICAgICAgdGhpcy52aXNpdEtleWZyYW1lcyhzdHlsZSwgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmluY3JlbWVudFRpbWUodGltaW5ncy5kdXJhdGlvbik7CiAgICAgICAgICAgICAgICB0aGlzLnZpc2l0U3R5bGUoKC8qKiBAdHlwZSB7P30gKi8gKHN0eWxlKSksIGNvbnRleHQpOwogICAgICAgICAgICAgICAgdGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC5jdXJyZW50QW5pbWF0ZVRpbWluZ3MgPSBudWxsOwogICAgICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0U3R5bGUoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltZWxpbmUgPSBjb250ZXh0LmN1cnJlbnRUaW1lbGluZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1pbmdzID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY3VycmVudEFuaW1hdGVUaW1pbmdzKSk7CiAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgZm9yIHdoZW4gYSBzdHlsZSgpIGNhbGwKICAgICAgICAgICAgLy8gZGlyZWN0bHkgZm9sbG93cyAgYW4gYW5pbWF0ZSgpIGNhbGwgKGJ1dCBub3QgaW5zaWRlIG9mIGFuIGFuaW1hdGUoKSBjYWxsKQogICAgICAgICAgICBpZiAoIXRpbWluZ3MgJiYgdGltZWxpbmUuZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGltZWxpbmUuZm9yd2FyZEZyYW1lKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlYXNpbmcgPSAodGltaW5ncyAmJiB0aW1pbmdzLmVhc2luZykgfHwgYXN0LmVhc2luZzsKICAgICAgICAgICAgaWYgKGFzdC5pc0VtcHR5U3RlcCkgewogICAgICAgICAgICAgICAgdGltZWxpbmUuYXBwbHlFbXB0eVN0ZXAoZWFzaW5nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRpbWVsaW5lLnNldFN0eWxlcyhhc3Quc3R5bGVzLCBlYXNpbmcsIGNvbnRleHQuZXJyb3JzLCBjb250ZXh0Lm9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gYXN0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmlzaXRLZXlmcmFtZXMoYXN0LCBjb250ZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudEFuaW1hdGVUaW1pbmdzID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQuY3VycmVudEFuaW1hdGVUaW1pbmdzKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhcnRUaW1lID0gKCgvKiogQHR5cGUgez99ICovIChjb250ZXh0LmN1cnJlbnRUaW1lbGluZSkpKS5kdXJhdGlvbjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkdXJhdGlvbiA9IGN1cnJlbnRBbmltYXRlVGltaW5ncy5kdXJhdGlvbjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbm5lckNvbnRleHQgPSBjb250ZXh0LmNyZWF0ZVN1YkNvbnRleHQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbm5lclRpbWVsaW5lID0gaW5uZXJDb250ZXh0LmN1cnJlbnRUaW1lbGluZTsKICAgICAgICAgICAgaW5uZXJUaW1lbGluZS5lYXNpbmcgPSBjdXJyZW50QW5pbWF0ZVRpbWluZ3MuZWFzaW5nOwogICAgICAgICAgICBhc3Quc3R5bGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0ZXAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHN0ZXAgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gc3RlcC5vZmZzZXQgfHwgMDsKICAgICAgICAgICAgICAgIGlubmVyVGltZWxpbmUuZm9yd2FyZFRpbWUob2Zmc2V0ICogZHVyYXRpb24pOwogICAgICAgICAgICAgICAgaW5uZXJUaW1lbGluZS5zZXRTdHlsZXMoc3RlcC5zdHlsZXMsIHN0ZXAuZWFzaW5nLCBjb250ZXh0LmVycm9ycywgY29udGV4dC5vcHRpb25zKTsKICAgICAgICAgICAgICAgIGlubmVyVGltZWxpbmUuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBwYXJlbnQgdGltZWxpbmUgZ2V0cyBhbGwgdGhlIHN0eWxlcyBmcm9tCiAgICAgICAgICAgIC8vIHRoZSBjaGlsZCBldmVuIGlmIHRoZSBuZXcgdGltZWxpbmUgYmVsb3cgaXMgbm90IHVzZWQKICAgICAgICAgICAgY29udGV4dC5jdXJyZW50VGltZWxpbmUubWVyZ2VUaW1lbGluZUNvbGxlY3RlZFN0eWxlcyhpbm5lclRpbWVsaW5lKTsKICAgICAgICAgICAgLy8gd2UgZG8gdGhpcyBiZWNhdXNlIHRoZSB3aW5kb3cgYmV0d2VlbiB0aGlzIHRpbWVsaW5lIGFuZCB0aGUgc3ViIHRpbWVsaW5lCiAgICAgICAgICAgIC8vIHNob3VsZCBlbnN1cmUgdGhhdCB0aGUgc3R5bGVzIHdpdGhpbiBhcmUgZXhhY3RseSB0aGUgc2FtZSBhcyB0aGV5IHdlcmUgYmVmb3JlCiAgICAgICAgICAgIGNvbnRleHQudHJhbnNmb3JtSW50b05ld1RpbWVsaW5lKHN0YXJ0VGltZSArIGR1cmF0aW9uKTsKICAgICAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBhc3Q7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aXNpdFF1ZXJ5KGFzdCwgY29udGV4dCkgewogICAgICAgICAgICAvLyBpbiB0aGUgZXZlbnQgdGhhdCB0aGUgZmlyc3Qgc3RlcCBiZWZvcmUgdGhpcyBpcyBhIHN0eWxlIHN0ZXAgd2UgbmVlZAogICAgICAgICAgICAvLyB0byBlbnN1cmUgdGhlIHN0eWxlcyBhcmUgYXBwbGllZCBiZWZvcmUgdGhlIGNoaWxkcmVuIGFyZSBhbmltYXRlZAogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lLmN1cnJlbnRUaW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKGFzdC5vcHRpb25zIHx8IHt9KSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlbGF5ID0gb3B0aW9ucy5kZWxheSA/IHJlc29sdmVUaW1pbmdWYWx1ZShvcHRpb25zLmRlbGF5KSA6IDA7CiAgICAgICAgICAgIGlmIChkZWxheSAmJgogICAgICAgICAgICAgICAgKGNvbnRleHQucHJldmlvdXNOb2RlLnR5cGUgPT09IDYgLyogU3R5bGUgKi8gfHwKICAgICAgICAgICAgICAgICAgICAoc3RhcnRUaW1lID09IDAgJiYgY29udGV4dC5jdXJyZW50VGltZWxpbmUuZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCkpKSB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICAgICAgICAgIGNvbnRleHQucHJldmlvdXNOb2RlID0gREVGQVVMVF9OT09QX1BSRVZJT1VTX05PREU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZnVydGhlc3RUaW1lID0gc3RhcnRUaW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsbXMgPSBjb250ZXh0Lmludm9rZVF1ZXJ5KGFzdC5zZWxlY3RvciwgYXN0Lm9yaWdpbmFsU2VsZWN0b3IsIGFzdC5saW1pdCwgYXN0LmluY2x1ZGVTZWxmLCBvcHRpb25zLm9wdGlvbmFsID8gdHJ1ZSA6IGZhbHNlLCBjb250ZXh0LmVycm9ycyk7CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5VG90YWwgPSBlbG1zLmxlbmd0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc2FtZUVsZW1lbnRUaW1lbGluZSA9IG51bGw7CiAgICAgICAgICAgIGVsbXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChlbGVtZW50LCBpKSA9PiB7CiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRRdWVyeUluZGV4ID0gaTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyQ29udGV4dCA9IGNvbnRleHQuY3JlYXRlU3ViQ29udGV4dChhc3Qub3B0aW9ucywgZWxlbWVudCk7CiAgICAgICAgICAgICAgICBpZiAoZGVsYXkpIHsKICAgICAgICAgICAgICAgICAgICBpbm5lckNvbnRleHQuZGVsYXlOZXh0U3RlcChkZWxheSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudCA9PT0gY29udGV4dC5lbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgc2FtZUVsZW1lbnRUaW1lbGluZSA9IGlubmVyQ29udGV4dC5jdXJyZW50VGltZWxpbmU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB2aXNpdERzbE5vZGUodGhpcywgYXN0LmFuaW1hdGlvbiwgaW5uZXJDb250ZXh0KTsKICAgICAgICAgICAgICAgIC8vIHRoaXMgaXMgaGVyZSBqdXN0IGluY2FzZSB0aGUgaW5uZXIgc3RlcHMgb25seSBjb250YWluIG9yIGVuZAogICAgICAgICAgICAgICAgLy8gd2l0aCBhIHN0eWxlKCkgY2FsbCAod2hpY2ggaXMgaGVyZSB0byBzaWduYWwgdGhhdCB0aGlzIGlzIGEgcHJlcGFyYXRvcnkKICAgICAgICAgICAgICAgIC8vIGNhbGwgdG8gc3R5bGUgYW4gZWxlbWVudCBiZWZvcmUgaXQgaXMgYW5pbWF0ZWQgYWdhaW4pCiAgICAgICAgICAgICAgICBpbm5lckNvbnRleHQuY3VycmVudFRpbWVsaW5lLmFwcGx5U3R5bGVzVG9LZXlmcmFtZSgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kVGltZSA9IGlubmVyQ29udGV4dC5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWU7CiAgICAgICAgICAgICAgICBmdXJ0aGVzdFRpbWUgPSBNYXRoLm1heChmdXJ0aGVzdFRpbWUsIGVuZFRpbWUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5SW5kZXggPSAwOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRRdWVyeVRvdGFsID0gMDsKICAgICAgICAgICAgY29udGV4dC50cmFuc2Zvcm1JbnRvTmV3VGltZWxpbmUoZnVydGhlc3RUaW1lKTsKICAgICAgICAgICAgaWYgKHNhbWVFbGVtZW50VGltZWxpbmUpIHsKICAgICAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFRpbWVsaW5lLm1lcmdlVGltZWxpbmVDb2xsZWN0ZWRTdHlsZXMoc2FtZUVsZW1lbnRUaW1lbGluZSk7CiAgICAgICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRUaW1lbGluZS5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IGFzdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpc2l0U3RhZ2dlcihhc3QsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnRDb250ZXh0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRleHQucGFyZW50Q29udGV4dCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRsID0gY29udGV4dC5jdXJyZW50VGltZWxpbmU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltaW5ncyA9IGFzdC50aW1pbmdzOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gTWF0aC5hYnModGltaW5ncy5kdXJhdGlvbik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWF4VGltZSA9IGR1cmF0aW9uICogKGNvbnRleHQuY3VycmVudFF1ZXJ5VG90YWwgLSAxKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZGVsYXkgPSBkdXJhdGlvbiAqIGNvbnRleHQuY3VycmVudFF1ZXJ5SW5kZXg7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0YWdnZXJUcmFuc2Zvcm1lciA9IHRpbWluZ3MuZHVyYXRpb24gPCAwID8gJ3JldmVyc2UnIDogdGltaW5ncy5lYXNpbmc7CiAgICAgICAgICAgIHN3aXRjaCAoc3RhZ2dlclRyYW5zZm9ybWVyKSB7CiAgICAgICAgICAgICAgICBjYXNlICdyZXZlcnNlJzoKICAgICAgICAgICAgICAgICAgICBkZWxheSA9IG1heFRpbWUgLSBkZWxheTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2Z1bGwnOgogICAgICAgICAgICAgICAgICAgIGRlbGF5ID0gcGFyZW50Q29udGV4dC5jdXJyZW50U3RhZ2dlclRpbWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aW1lbGluZSA9IGNvbnRleHQuY3VycmVudFRpbWVsaW5lOwogICAgICAgICAgICBpZiAoZGVsYXkpIHsKICAgICAgICAgICAgICAgIHRpbWVsaW5lLmRlbGF5TmV4dFN0ZXAoZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhcnRpbmdUaW1lID0gdGltZWxpbmUuY3VycmVudFRpbWU7CiAgICAgICAgICAgIHZpc2l0RHNsTm9kZSh0aGlzLCBhc3QuYW5pbWF0aW9uLCBjb250ZXh0KTsKICAgICAgICAgICAgY29udGV4dC5wcmV2aW91c05vZGUgPSBhc3Q7CiAgICAgICAgICAgIC8vIHRpbWUgPSBkdXJhdGlvbiArIGRlbGF5CiAgICAgICAgICAgIC8vIHRoZSByZWFzb24gd2h5IHRoaXMgY29tcHV0YXRpb24gaXMgc28gY29tcGxleCBpcyBiZWNhdXNlCiAgICAgICAgICAgIC8vIHRoZSBpbm5lciB0aW1lbGluZSBtYXkgZWl0aGVyIGhhdmUgYSBkZWxheSB2YWx1ZSBvciBhIHN0cmV0Y2hlZAogICAgICAgICAgICAvLyBrZXlmcmFtZSBkZXBlbmRpbmcgb24gaWYgYSBzdWJ0aW1lbGluZSBpcyBub3QgdXNlZCBvciBpcyB1c2VkLgogICAgICAgICAgICBwYXJlbnRDb250ZXh0LmN1cnJlbnRTdGFnZ2VyVGltZSA9CiAgICAgICAgICAgICAgICAodGwuY3VycmVudFRpbWUgLSBzdGFydGluZ1RpbWUpICsgKHRsLnN0YXJ0VGltZSAtIHBhcmVudENvbnRleHQuY3VycmVudFRpbWVsaW5lLnN0YXJ0VGltZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREVGQVVMVF9OT09QX1BSRVZJT1VTX05PREUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKTsKICAgIGNsYXNzIEFuaW1hdGlvblRpbWVsaW5lQ29udGV4dCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZHJpdmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzdWJJbnN0cnVjdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IF9lbnRlckNsYXNzTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gX2xlYXZlQ2xhc3NOYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAgICAgKiBAcGFyYW0gez99IHRpbWVsaW5lcwogICAgICAgICAqIEBwYXJhbSB7Pz19IGluaXRpYWxUaW1lbGluZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9kcml2ZXIsIGVsZW1lbnQsIHN1Ykluc3RydWN0aW9ucywgX2VudGVyQ2xhc3NOYW1lLCBfbGVhdmVDbGFzc05hbWUsIGVycm9ycywgdGltZWxpbmVzLCBpbml0aWFsVGltZWxpbmUpIHsKICAgICAgICAgICAgdGhpcy5fZHJpdmVyID0gX2RyaXZlcjsKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5zdWJJbnN0cnVjdGlvbnMgPSBzdWJJbnN0cnVjdGlvbnM7CiAgICAgICAgICAgIHRoaXMuX2VudGVyQ2xhc3NOYW1lID0gX2VudGVyQ2xhc3NOYW1lOwogICAgICAgICAgICB0aGlzLl9sZWF2ZUNsYXNzTmFtZSA9IF9sZWF2ZUNsYXNzTmFtZTsKICAgICAgICAgICAgdGhpcy5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgICAgIHRoaXMudGltZWxpbmVzID0gdGltZWxpbmVzOwogICAgICAgICAgICB0aGlzLnBhcmVudENvbnRleHQgPSBudWxsOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRBbmltYXRlVGltaW5ncyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gREVGQVVMVF9OT09QX1BSRVZJT1VTX05PREU7CiAgICAgICAgICAgIHRoaXMuc3ViQ29udGV4dENvdW50ID0gMDsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0ge307CiAgICAgICAgICAgIHRoaXMuY3VycmVudFF1ZXJ5SW5kZXggPSAwOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRRdWVyeVRvdGFsID0gMDsKICAgICAgICAgICAgdGhpcy5jdXJyZW50U3RhZ2dlclRpbWUgPSAwOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRUaW1lbGluZSA9IGluaXRpYWxUaW1lbGluZSB8fCBuZXcgVGltZWxpbmVCdWlsZGVyKHRoaXMuX2RyaXZlciwgZWxlbWVudCwgMCk7CiAgICAgICAgICAgIHRpbWVsaW5lcy5wdXNoKHRoaXMuY3VycmVudFRpbWVsaW5lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGFyYW1zKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnBhcmFtczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gc2tpcElmRXhpc3RzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVPcHRpb25zKG9wdGlvbnMsIHNraXBJZkV4aXN0cykgewogICAgICAgICAgICBpZiAoIW9wdGlvbnMpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3T3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG9wdGlvbnNUb1VwZGF0ZSA9IHRoaXMub3B0aW9uczsKICAgICAgICAgICAgLy8gTk9URTogdGhpcyB3aWxsIGdldCBwYXRjaGVkIHVwIHdoZW4gb3RoZXIgYW5pbWF0aW9uIG1ldGhvZHMgc3VwcG9ydCBkdXJhdGlvbiBvdmVycmlkZXMKICAgICAgICAgICAgaWYgKG5ld09wdGlvbnMuZHVyYXRpb24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChvcHRpb25zVG9VcGRhdGUpKSkuZHVyYXRpb24gPSByZXNvbHZlVGltaW5nVmFsdWUobmV3T3B0aW9ucy5kdXJhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5ld09wdGlvbnMuZGVsYXkgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgb3B0aW9uc1RvVXBkYXRlLmRlbGF5ID0gcmVzb2x2ZVRpbWluZ1ZhbHVlKG5ld09wdGlvbnMuZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gbmV3T3B0aW9ucy5wYXJhbXM7CiAgICAgICAgICAgIGlmIChuZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwYXJhbXNUb1VwZGF0ZSA9ICgvKiogQHR5cGUgez99ICovIChvcHRpb25zVG9VcGRhdGUucGFyYW1zKSk7CiAgICAgICAgICAgICAgICBpZiAoIXBhcmFtc1RvVXBkYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyYW1zVG9VcGRhdGUgPSB0aGlzLm9wdGlvbnMucGFyYW1zID0ge307CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhuZXdQYXJhbXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBuYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIXNraXBJZkV4aXN0cyB8fCAhcGFyYW1zVG9VcGRhdGUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zVG9VcGRhdGVbbmFtZV0gPSBpbnRlcnBvbGF0ZVBhcmFtcyhuZXdQYXJhbXNbbmFtZV0sIHBhcmFtc1RvVXBkYXRlLCB0aGlzLmVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY29weU9wdGlvbnMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHt9OwogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbGRQYXJhbXMgPSB0aGlzLm9wdGlvbnMucGFyYW1zOwogICAgICAgICAgICAgICAgaWYgKG9sZFBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBvcHRpb25zWydwYXJhbXMnXSA9IHt9OwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKG9sZFBhcmFtcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBuYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zW25hbWVdID0gb2xkUGFyYW1zW25hbWVdOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gb3B0aW9uczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Pz19IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBuZXdUaW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVTdWJDb250ZXh0KG9wdGlvbnMgPSBudWxsLCBlbGVtZW50LCBuZXdUaW1lKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZWxlbWVudCB8fCB0aGlzLmVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGV4dCA9IG5ldyBBbmltYXRpb25UaW1lbGluZUNvbnRleHQodGhpcy5fZHJpdmVyLCB0YXJnZXQsIHRoaXMuc3ViSW5zdHJ1Y3Rpb25zLCB0aGlzLl9lbnRlckNsYXNzTmFtZSwgdGhpcy5fbGVhdmVDbGFzc05hbWUsIHRoaXMuZXJyb3JzLCB0aGlzLnRpbWVsaW5lcywgdGhpcy5jdXJyZW50VGltZWxpbmUuZm9yayh0YXJnZXQsIG5ld1RpbWUgfHwgMCkpOwogICAgICAgICAgICBjb250ZXh0LnByZXZpb3VzTm9kZSA9IHRoaXMucHJldmlvdXNOb2RlOwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRBbmltYXRlVGltaW5ncyA9IHRoaXMuY3VycmVudEFuaW1hdGVUaW1pbmdzOwogICAgICAgICAgICBjb250ZXh0Lm9wdGlvbnMgPSB0aGlzLl9jb3B5T3B0aW9ucygpOwogICAgICAgICAgICBjb250ZXh0LnVwZGF0ZU9wdGlvbnMob3B0aW9ucyk7CiAgICAgICAgICAgIGNvbnRleHQuY3VycmVudFF1ZXJ5SW5kZXggPSB0aGlzLmN1cnJlbnRRdWVyeUluZGV4OwogICAgICAgICAgICBjb250ZXh0LmN1cnJlbnRRdWVyeVRvdGFsID0gdGhpcy5jdXJyZW50UXVlcnlUb3RhbDsKICAgICAgICAgICAgY29udGV4dC5wYXJlbnRDb250ZXh0ID0gdGhpczsKICAgICAgICAgICAgdGhpcy5zdWJDb250ZXh0Q291bnQrKzsKICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IG5ld1RpbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYW5zZm9ybUludG9OZXdUaW1lbGluZShuZXdUaW1lKSB7CiAgICAgICAgICAgIHRoaXMucHJldmlvdXNOb2RlID0gREVGQVVMVF9OT09QX1BSRVZJT1VTX05PREU7CiAgICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVsaW5lID0gdGhpcy5jdXJyZW50VGltZWxpbmUuZm9yayh0aGlzLmVsZW1lbnQsIG5ld1RpbWUpOwogICAgICAgICAgICB0aGlzLnRpbWVsaW5lcy5wdXNoKHRoaXMuY3VycmVudFRpbWVsaW5lKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY3VycmVudFRpbWVsaW5lOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGluc3RydWN0aW9uCiAgICAgICAgICogQHBhcmFtIHs/fSBkdXJhdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsYXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGVuZEluc3RydWN0aW9uVG9UaW1lbGluZShpbnN0cnVjdGlvbiwgZHVyYXRpb24sIGRlbGF5KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdXBkYXRlZFRpbWluZ3MgPSB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbjogZHVyYXRpb24gIT0gbnVsbCA/IGR1cmF0aW9uIDogaW5zdHJ1Y3Rpb24uZHVyYXRpb24sCiAgICAgICAgICAgICAgICBkZWxheTogdGhpcy5jdXJyZW50VGltZWxpbmUuY3VycmVudFRpbWUgKyAoZGVsYXkgIT0gbnVsbCA/IGRlbGF5IDogMCkgKyBpbnN0cnVjdGlvbi5kZWxheSwKICAgICAgICAgICAgICAgIGVhc2luZzogJycKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBidWlsZGVyID0gbmV3IFN1YlRpbWVsaW5lQnVpbGRlcih0aGlzLl9kcml2ZXIsIGluc3RydWN0aW9uLmVsZW1lbnQsIGluc3RydWN0aW9uLmtleWZyYW1lcywgaW5zdHJ1Y3Rpb24ucHJlU3R5bGVQcm9wcywgaW5zdHJ1Y3Rpb24ucG9zdFN0eWxlUHJvcHMsIHVwZGF0ZWRUaW1pbmdzLCBpbnN0cnVjdGlvbi5zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSk7CiAgICAgICAgICAgIHRoaXMudGltZWxpbmVzLnB1c2goYnVpbGRlcik7CiAgICAgICAgICAgIHJldHVybiB1cGRhdGVkVGltaW5nczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0aW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbmNyZW1lbnRUaW1lKHRpbWUpIHsKICAgICAgICAgICAgdGhpcy5jdXJyZW50VGltZWxpbmUuZm9yd2FyZFRpbWUodGhpcy5jdXJyZW50VGltZWxpbmUuZHVyYXRpb24gKyB0aW1lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxheQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVsYXlOZXh0U3RlcChkZWxheSkgewogICAgICAgICAgICAvLyBuZWdhdGl2ZSBkZWxheXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkCiAgICAgICAgICAgIGlmIChkZWxheSA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRpbWVsaW5lLmRlbGF5TmV4dFN0ZXAoZGVsYXkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbmFsU2VsZWN0b3IKICAgICAgICAgKiBAcGFyYW0gez99IGxpbWl0CiAgICAgICAgICogQHBhcmFtIHs/fSBpbmNsdWRlU2VsZgogICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uYWwKICAgICAgICAgKiBAcGFyYW0gez99IGVycm9ycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW52b2tlUXVlcnkoc2VsZWN0b3IsIG9yaWdpbmFsU2VsZWN0b3IsIGxpbWl0LCBpbmNsdWRlU2VsZiwgb3B0aW9uYWwsIGVycm9ycykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZXN1bHRzID0gW107CiAgICAgICAgICAgIGlmIChpbmNsdWRlU2VsZikgewogICAgICAgICAgICAgICAgcmVzdWx0cy5wdXNoKHRoaXMuZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHNlbGVjdG9yLmxlbmd0aCA+IDApIHsgLy8gaWYgOnNlbGYgaXMgb25seSB1c2VkIHRoZW4gdGhlIHNlbGVjdG9yIGlzIGVtcHR5CiAgICAgICAgICAgICAgICBzZWxlY3RvciA9IHNlbGVjdG9yLnJlcGxhY2UoRU5URVJfVE9LRU5fUkVHRVgsICcuJyArIHRoaXMuX2VudGVyQ2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIHNlbGVjdG9yID0gc2VsZWN0b3IucmVwbGFjZShMRUFWRV9UT0tFTl9SRUdFWCwgJy4nICsgdGhpcy5fbGVhdmVDbGFzc05hbWUpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbXVsdGkgPSBsaW1pdCAhPSAxOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGVsZW1lbnRzID0gdGhpcy5fZHJpdmVyLnF1ZXJ5KHRoaXMuZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKTsKICAgICAgICAgICAgICAgIGlmIChsaW1pdCAhPT0gMCkgewogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRzID0gbGltaXQgPCAwID8gZWxlbWVudHMuc2xpY2UoZWxlbWVudHMubGVuZ3RoICsgbGltaXQsIGVsZW1lbnRzLmxlbmd0aCkgOgogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zbGljZSgwLCBsaW1pdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goLi4uZWxlbWVudHMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghb3B0aW9uYWwgJiYgcmVzdWx0cy5sZW5ndGggPT0gMCkgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYFxgcXVlcnkoIiR7b3JpZ2luYWxTZWxlY3Rvcn0iKVxgIHJldHVybmVkIHplcm8gZWxlbWVudHMuIChVc2UgXGBxdWVyeSgiJHtvcmlnaW5hbFNlbGVjdG9yfSIsIHsgb3B0aW9uYWw6IHRydWUgfSlcYCBpZiB5b3Ugd2lzaCB0byBhbGxvdyB0aGlzLilgKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUaW1lbGluZUJ1aWxkZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2RyaXZlcgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gc3RhcnRUaW1lCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9kcml2ZXIsIGVsZW1lbnQsIHN0YXJ0VGltZSwgX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cCkgewogICAgICAgICAgICB0aGlzLl9kcml2ZXIgPSBfZHJpdmVyOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLnN0YXJ0VGltZSA9IHN0YXJ0VGltZTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwID0gX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cDsKICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiA9IDA7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWUgPSB7fTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudEtleWZyYW1lID0ge307CiAgICAgICAgICAgIHRoaXMuX2tleWZyYW1lcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5fc3R5bGVTdW1tYXJ5ID0ge307CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTdHlsZXMgPSB7fTsKICAgICAgICAgICAgdGhpcy5fYmFja0ZpbGwgPSB7fTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudEVtcHR5U3RlcEtleWZyYW1lID0gbnVsbDsKICAgICAgICAgICAgaWYgKCF0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXApIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9sb2NhbFRpbWVsaW5lU3R5bGVzID0gT2JqZWN0LmNyZWF0ZSh0aGlzLl9iYWNrRmlsbCwge30pOwogICAgICAgICAgICB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50VGltZWxpbmVTdHlsZXNMb29rdXAuZ2V0KGVsZW1lbnQpKSk7CiAgICAgICAgICAgIGlmICghdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzID0gdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlczsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRUaW1lbGluZVN0eWxlc0xvb2t1cC5zZXQoZWxlbWVudCwgdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fbG9hZEtleWZyYW1lKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY29udGFpbnNBbmltYXRpb24oKSB7CiAgICAgICAgICAgIHN3aXRjaCAodGhpcy5fa2V5ZnJhbWVzLnNpemUpIHsKICAgICAgICAgICAgICAgIGNhc2UgMDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpLmxlbmd0aCA+IDA7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Q3VycmVudFN0eWxlUHJvcGVydGllcygpIHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX2N1cnJlbnRLZXlmcmFtZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGN1cnJlbnRUaW1lKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdGFydFRpbWUgKyB0aGlzLmR1cmF0aW9uOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZWxheU5leHRTdGVwKGRlbGF5KSB7CiAgICAgICAgICAgIC8vIGluIHRoZSBldmVudCB0aGF0IGEgc3R5bGUoKSBzdGVwIGlzIHBsYWNlZCByaWdodCBiZWZvcmUgYSBzdGFnZ2VyKCkKICAgICAgICAgICAgLy8gYW5kIHRoYXQgc3R5bGUoKSBzdGVwIGlzIHRoZSB2ZXJ5IGZpcnN0IHN0eWxlKCkgdmFsdWUgaW4gdGhlIGFuaW1hdGlvbgogICAgICAgICAgICAvLyB0aGVuIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIGtleWZyYW1lIFswLCBjb3B5LCAxXSBzbyB0aGF0IHRoZSBkZWxheQogICAgICAgICAgICAvLyBwcm9wZXJseSBhcHBsaWVzIHRoZSBzdHlsZSgpIHZhbHVlcyB0byB3b3JrIHdpdGggdGhlIHN0YWdnZXIuLi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYXNQcmVTdHlsZVN0ZXAgPSB0aGlzLl9rZXlmcmFtZXMuc2l6ZSA9PSAxICYmIE9iamVjdC5rZXlzKHRoaXMuX3BlbmRpbmdTdHlsZXMpLmxlbmd0aDsKICAgICAgICAgICAgaWYgKHRoaXMuZHVyYXRpb24gfHwgaGFzUHJlU3R5bGVTdGVwKSB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcndhcmRUaW1lKHRoaXMuY3VycmVudFRpbWUgKyBkZWxheSk7CiAgICAgICAgICAgICAgICBpZiAoaGFzUHJlU3R5bGVTdGVwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zbmFwc2hvdEN1cnJlbnRTdHlsZXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RhcnRUaW1lICs9IGRlbGF5OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IGN1cnJlbnRUaW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JrKGVsZW1lbnQsIGN1cnJlbnRUaW1lKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgICAgIHJldHVybiBuZXcgVGltZWxpbmVCdWlsZGVyKHRoaXMuX2RyaXZlciwgZWxlbWVudCwgY3VycmVudFRpbWUgfHwgdGhpcy5jdXJyZW50VGltZSwgdGhpcy5fZWxlbWVudFRpbWVsaW5lU3R5bGVzTG9va3VwKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9sb2FkS2V5ZnJhbWUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50S2V5ZnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzS2V5ZnJhbWUgPSB0aGlzLl9jdXJyZW50S2V5ZnJhbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY3VycmVudEtleWZyYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2tleWZyYW1lcy5nZXQodGhpcy5kdXJhdGlvbikpKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9jdXJyZW50S2V5ZnJhbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSA9IE9iamVjdC5jcmVhdGUodGhpcy5fYmFja0ZpbGwsIHt9KTsKICAgICAgICAgICAgICAgIHRoaXMuX2tleWZyYW1lcy5zZXQodGhpcy5kdXJhdGlvbiwgdGhpcy5fY3VycmVudEtleWZyYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvcndhcmRGcmFtZSgpIHsKICAgICAgICAgICAgdGhpcy5kdXJhdGlvbiArPSBPTkVfRlJBTUVfSU5fTUlMTElTRUNPTkRTOwogICAgICAgICAgICB0aGlzLl9sb2FkS2V5ZnJhbWUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0aW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3J3YXJkVGltZSh0aW1lKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgICAgIHRoaXMuZHVyYXRpb24gPSB0aW1lOwogICAgICAgICAgICB0aGlzLl9sb2FkS2V5ZnJhbWUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlU3R5bGUocHJvcCwgdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlc1twcm9wXSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlc1twcm9wXSA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9zdHlsZVN1bW1hcnlbcHJvcF0gPSB7IHRpbWU6IHRoaXMuY3VycmVudFRpbWUsIHZhbHVlIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWxsb3dPbmx5VGltZWxpbmVTdHlsZXMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUgIT09IHRoaXMuX2N1cnJlbnRLZXlmcmFtZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGx5RW1wdHlTdGVwKGVhc2luZykgewogICAgICAgICAgICBpZiAoZWFzaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0tleWZyYW1lWydlYXNpbmcnXSA9IGVhc2luZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGFuaW1hdGUoZHVyYXRpb24pOgogICAgICAgICAgICAvLyBhbGwgbWlzc2luZyBzdHlsZXMgYXJlIGZpbGxlZCB3aXRoIGEgYCpgIHZhbHVlIHRoZW4KICAgICAgICAgICAgLy8gaWYgYW55IGRlc3RpbmF0aW9uIHN0eWxlcyBhcmUgZmlsbGVkIGluIGxhdGVyIG9uIHRoZSBzYW1lCiAgICAgICAgICAgIC8vIGtleWZyYW1lIHRoZW4gdGhleSB3aWxsIG92ZXJyaWRlIHRoZSBvdmVycmlkZGVuIHN0eWxlcwogICAgICAgICAgICAvLyBXZSB1c2UgYF9nbG9iYWxUaW1lbGluZVN0eWxlc2AgaGVyZSBiZWNhdXNlIHRoZXJlIG1heSBiZQogICAgICAgICAgICAvLyBzdHlsZXMgaW4gcHJldmlvdXMga2V5ZnJhbWVzIHRoYXQgYXJlIG5vdCBwcmVzZW50IGluIHRoaXMgdGltZWxpbmUKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fYmFja0ZpbGxbcHJvcF0gPSB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlc1twcm9wXSB8fCBBVVRPX1NUWUxFOwogICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudEtleWZyYW1lW3Byb3BdID0gQVVUT19TVFlMRTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl9jdXJyZW50RW1wdHlTdGVwS2V5ZnJhbWUgPSB0aGlzLl9jdXJyZW50S2V5ZnJhbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5wdXQKICAgICAgICAgKiBAcGFyYW0gez99IGVhc2luZwogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0U3R5bGVzKGlucHV0LCBlYXNpbmcsIGVycm9ycywgb3B0aW9ucykgewogICAgICAgICAgICBpZiAoZWFzaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0tleWZyYW1lWydlYXNpbmcnXSA9IGVhc2luZzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IChvcHRpb25zICYmIG9wdGlvbnMucGFyYW1zKSB8fCB7fTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBmbGF0dGVuU3R5bGVzJDEoaW5wdXQsIHRoaXMuX2dsb2JhbFRpbWVsaW5lU3R5bGVzKTsKICAgICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IGludGVycG9sYXRlUGFyYW1zKHN0eWxlc1twcm9wXSwgcGFyYW1zLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1N0eWxlc1twcm9wXSA9IHZhbDsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcy5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tGaWxsW3Byb3BdID0gdGhpcy5fZ2xvYmFsVGltZWxpbmVTdHlsZXMuaGFzT3duUHJvcGVydHkocHJvcCkgPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9nbG9iYWxUaW1lbGluZVN0eWxlc1twcm9wXSA6CiAgICAgICAgICAgICAgICAgICAgICAgIEFVVE9fU1RZTEU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTdHlsZShwcm9wLCB2YWwpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXBwbHlTdHlsZXNUb0tleWZyYW1lKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IHRoaXMuX3BlbmRpbmdTdHlsZXM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvcHMgPSBPYmplY3Qua2V5cyhzdHlsZXMpOwogICAgICAgICAgICBpZiAocHJvcHMubGVuZ3RoID09IDApCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTdHlsZXMgPSB7fTsKICAgICAgICAgICAgcHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWwgPSBzdHlsZXNbcHJvcF07CiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50S2V5ZnJhbWVbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRLZXlmcmFtZS5oYXNPd25Qcm9wZXJ0eShwcm9wKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRLZXlmcmFtZVtwcm9wXSA9IHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXNbcHJvcF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzbmFwc2hvdEN1cnJlbnRTdHlsZXMoKSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX2xvY2FsVGltZWxpbmVTdHlsZXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsID0gdGhpcy5fbG9jYWxUaW1lbGluZVN0eWxlc1twcm9wXTsKICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTdHlsZXNbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVTdHlsZShwcm9wLCB2YWwpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0RmluYWxLZXlmcmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleWZyYW1lcy5nZXQodGhpcy5kdXJhdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHByb3BlcnRpZXMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvcGVydGllcyA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHRoaXMuX2N1cnJlbnRLZXlmcmFtZSkgewogICAgICAgICAgICAgICAgcHJvcGVydGllcy5wdXNoKHByb3ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwcm9wZXJ0aWVzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRpbWVsaW5lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtZXJnZVRpbWVsaW5lQ29sbGVjdGVkU3R5bGVzKHRpbWVsaW5lKSB7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRpbWVsaW5lLl9zdHlsZVN1bW1hcnkpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGV0YWlsczAgPSB0aGlzLl9zdHlsZVN1bW1hcnlbcHJvcF07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzMSA9IHRpbWVsaW5lLl9zdHlsZVN1bW1hcnlbcHJvcF07CiAgICAgICAgICAgICAgICBpZiAoIWRldGFpbHMwIHx8IGRldGFpbHMxLnRpbWUgPiBkZXRhaWxzMC50aW1lKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3R5bGUocHJvcCwgZGV0YWlsczEudmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnVpbGRLZXlmcmFtZXMoKSB7CiAgICAgICAgICAgIHRoaXMuYXBwbHlTdHlsZXNUb0tleWZyYW1lKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlU3R5bGVQcm9wcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3N0U3R5bGVQcm9wcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0VtcHR5ID0gdGhpcy5fa2V5ZnJhbWVzLnNpemUgPT09IDEgJiYgdGhpcy5kdXJhdGlvbiA9PT0gMDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZmluYWxLZXlmcmFtZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fa2V5ZnJhbWVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGltZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGtleWZyYW1lLCB0aW1lKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmaW5hbEtleWZyYW1lID0gY29weVN0eWxlcyhrZXlmcmFtZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmaW5hbEtleWZyYW1lKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZmluYWxLZXlmcmFtZVtwcm9wXTsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gybVQUkVfU1RZTEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlU3R5bGVQcm9wcy5hZGQocHJvcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlID09IEFVVE9fU1RZTEUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFN0eWxlUHJvcHMuYWRkKHByb3ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGlmICghaXNFbXB0eSkgewogICAgICAgICAgICAgICAgICAgIGZpbmFsS2V5ZnJhbWVbJ29mZnNldCddID0gdGltZSAvIHRoaXMuZHVyYXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmaW5hbEtleWZyYW1lcy5wdXNoKGZpbmFsS2V5ZnJhbWUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlUHJvcHMgPSBwcmVTdHlsZVByb3BzLnNpemUgPyBpdGVyYXRvclRvQXJyYXkocHJlU3R5bGVQcm9wcy52YWx1ZXMoKSkgOiBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3N0UHJvcHMgPSBwb3N0U3R5bGVQcm9wcy5zaXplID8gaXRlcmF0b3JUb0FycmF5KHBvc3RTdHlsZVByb3BzLnZhbHVlcygpKSA6IFtdOwogICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIGEgMC1zZWNvbmQgYW5pbWF0aW9uICh3aGljaCBpcyBkZXNpZ25lZCBqdXN0IHRvIHBsYWNlIHN0eWxlcyBvbnNjcmVlbikKICAgICAgICAgICAgaWYgKGlzRW1wdHkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGtmMCA9IGZpbmFsS2V5ZnJhbWVzWzBdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qga2YxID0gY29weU9iaihrZjApOwogICAgICAgICAgICAgICAga2YwWydvZmZzZXQnXSA9IDA7CiAgICAgICAgICAgICAgICBrZjFbJ29mZnNldCddID0gMTsKICAgICAgICAgICAgICAgIGZpbmFsS2V5ZnJhbWVzID0gW2tmMCwga2YxXTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY3JlYXRlVGltZWxpbmVJbnN0cnVjdGlvbih0aGlzLmVsZW1lbnQsIGZpbmFsS2V5ZnJhbWVzLCBwcmVQcm9wcywgcG9zdFByb3BzLCB0aGlzLmR1cmF0aW9uLCB0aGlzLnN0YXJ0VGltZSwgdGhpcy5lYXNpbmcsIGZhbHNlKTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTdWJUaW1lbGluZUJ1aWxkZXIgZXh0ZW5kcyBUaW1lbGluZUJ1aWxkZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZHJpdmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAgICAgKiBAcGFyYW0gez99IHByZVN0eWxlUHJvcHMKICAgICAgICAgKiBAcGFyYW0gez99IHBvc3RTdHlsZVByb3BzCiAgICAgICAgICogQHBhcmFtIHs/fSB0aW1pbmdzCiAgICAgICAgICogQHBhcmFtIHs/PX0gX3N0cmV0Y2hTdGFydGluZ0tleWZyYW1lCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZHJpdmVyLCBlbGVtZW50LCBrZXlmcmFtZXMsIHByZVN0eWxlUHJvcHMsIHBvc3RTdHlsZVByb3BzLCB0aW1pbmdzLCBfc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWUgPSBmYWxzZSkgewogICAgICAgICAgICBzdXBlcihkcml2ZXIsIGVsZW1lbnQsIHRpbWluZ3MuZGVsYXkpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLmtleWZyYW1lcyA9IGtleWZyYW1lczsKICAgICAgICAgICAgdGhpcy5wcmVTdHlsZVByb3BzID0gcHJlU3R5bGVQcm9wczsKICAgICAgICAgICAgdGhpcy5wb3N0U3R5bGVQcm9wcyA9IHBvc3RTdHlsZVByb3BzOwogICAgICAgICAgICB0aGlzLl9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSA9IF9zdHJldGNoU3RhcnRpbmdLZXlmcmFtZTsKICAgICAgICAgICAgdGhpcy50aW1pbmdzID0geyBkdXJhdGlvbjogdGltaW5ncy5kdXJhdGlvbiwgZGVsYXk6IHRpbWluZ3MuZGVsYXksIGVhc2luZzogdGltaW5ncy5lYXNpbmcgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb250YWluc0FuaW1hdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMua2V5ZnJhbWVzLmxlbmd0aCA+IDE7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnVpbGRLZXlmcmFtZXMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGtleWZyYW1lcyA9IHRoaXMua2V5ZnJhbWVzOwogICAgICAgICAgICBsZXQgeyBkZWxheSwgZHVyYXRpb24sIGVhc2luZyB9ID0gdGhpcy50aW1pbmdzOwogICAgICAgICAgICBpZiAodGhpcy5fc3RyZXRjaFN0YXJ0aW5nS2V5ZnJhbWUgJiYgZGVsYXkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5ld0tleWZyYW1lcyA9IFtdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdG90YWxUaW1lID0gZHVyYXRpb24gKyBkZWxheTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0aW5nR2FwID0gZGVsYXkgLyB0b3RhbFRpbWU7CiAgICAgICAgICAgICAgICAvLyB0aGUgb3JpZ2luYWwgc3RhcnRpbmcga2V5ZnJhbWUgbm93IHN0YXJ0cyBvbmNlIHRoZSBkZWxheSBpcyBkb25lCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXdGaXJzdEtleWZyYW1lID0gY29weVN0eWxlcyhrZXlmcmFtZXNbMF0sIGZhbHNlKTsKICAgICAgICAgICAgICAgIG5ld0ZpcnN0S2V5ZnJhbWVbJ29mZnNldCddID0gMDsKICAgICAgICAgICAgICAgIG5ld0tleWZyYW1lcy5wdXNoKG5ld0ZpcnN0S2V5ZnJhbWUpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb2xkRmlyc3RLZXlmcmFtZSA9IGNvcHlTdHlsZXMoa2V5ZnJhbWVzWzBdLCBmYWxzZSk7CiAgICAgICAgICAgICAgICBvbGRGaXJzdEtleWZyYW1lWydvZmZzZXQnXSA9IHJvdW5kT2Zmc2V0KHN0YXJ0aW5nR2FwKTsKICAgICAgICAgICAgICAgIG5ld0tleWZyYW1lcy5wdXNoKG9sZEZpcnN0S2V5ZnJhbWUpOwogICAgICAgICAgICAgICAgLyoKICAgICAgICAgICAgICAgICAgICAgICAgV2hlbiB0aGUga2V5ZnJhbWUgaXMgc3RyZXRjaGVkIHRoZW4gaXQgbWVhbnMgdGhhdCB0aGUgZGVsYXkgYmVmb3JlIHRoZSBhbmltYXRpb24KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRzIGlzIGdvbmUuIEluc3RlYWQgdGhlIGZpcnN0IGtleWZyYW1lIGlzIHBsYWNlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIGFuaW1hdGlvbgogICAgICAgICAgICAgICAgICAgICAgICBhbmQgaXQgaXMgdGhlbiBjb3BpZWQgdG8gd2hlcmUgaXQgc3RhcnRzIHdoZW4gdGhlIG9yaWdpbmFsIGRlbGF5IGlzIG92ZXIuIFRoaXMgYmFzaWNhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgIG1lYW5zIG5vdGhpbmcgYW5pbWF0ZXMgZHVyaW5nIHRoYXQgZGVsYXksIGJ1dCB0aGUgc3R5bGVzIGFyZSBzdGlsbCByZW5kZXJlcmVkLiBGb3IgdGhpcwogICAgICAgICAgICAgICAgICAgICAgICB0byB3b3JrIHRoZSBvcmlnaW5hbCBvZmZzZXQgdmFsdWVzIHRoYXQgZXhpc3QgaW4gdGhlIG9yaWdpbmFsIGtleWZyYW1lcyBtdXN0IGJlICJ3YXJwZWQiCiAgICAgICAgICAgICAgICAgICAgICAgIHNvIHRoYXQgdGhleSBjYW4gdGFrZSB0aGUgbmV3IGtleWZyYW1lICsgZGVsYXkgaW50byBhY2NvdW50LgogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5PTEwMDAsIGR1cmF0aW9uPTEwMDAsIGtleWZyYW1lcyA9IDAgLjUgMQogICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHR1cm5zIGludG8KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBkZWxheT0wLCBkdXJhdGlvbj0yMDAwLCBrZXlmcmFtZXMgPSAwIC4zMyAuNjYgMQogICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAvLyBvZmZzZXRzIGJldHdlZW4gMSAuLi4gbiAtMSBhcmUgYWxsIHdhcnBlZCBieSB0aGUga2V5ZnJhbWUgc3RyZXRjaAogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGltaXQgPSBrZXlmcmFtZXMubGVuZ3RoIC0gMTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGxpbWl0OyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IGtmID0gY29weVN0eWxlcyhrZXlmcmFtZXNbaV0sIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2xkT2Zmc2V0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGtmWydvZmZzZXQnXSkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0aW1lQXRLZXlmcmFtZSA9IGRlbGF5ICsgb2xkT2Zmc2V0ICogZHVyYXRpb247CiAgICAgICAgICAgICAgICAgICAga2ZbJ29mZnNldCddID0gcm91bmRPZmZzZXQodGltZUF0S2V5ZnJhbWUgLyB0b3RhbFRpbWUpOwogICAgICAgICAgICAgICAgICAgIG5ld0tleWZyYW1lcy5wdXNoKGtmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIHRoZSBuZXcgc3RhcnRpbmcga2V5ZnJhbWUgc2hvdWxkIGJlIGFkZGVkIGF0IHRoZSBzdGFydAogICAgICAgICAgICAgICAgZHVyYXRpb24gPSB0b3RhbFRpbWU7CiAgICAgICAgICAgICAgICBkZWxheSA9IDA7CiAgICAgICAgICAgICAgICBlYXNpbmcgPSAnJzsKICAgICAgICAgICAgICAgIGtleWZyYW1lcyA9IG5ld0tleWZyYW1lczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY3JlYXRlVGltZWxpbmVJbnN0cnVjdGlvbih0aGlzLmVsZW1lbnQsIGtleWZyYW1lcywgdGhpcy5wcmVTdHlsZVByb3BzLCB0aGlzLnBvc3RTdHlsZVByb3BzLCBkdXJhdGlvbiwgZGVsYXksIGVhc2luZywgdHJ1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9mZnNldAogICAgICogQHBhcmFtIHs/PX0gZGVjaW1hbFBvaW50cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcm91bmRPZmZzZXQob2Zmc2V0LCBkZWNpbWFsUG9pbnRzID0gMykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtdWx0ID0gTWF0aC5wb3coMTAsIGRlY2ltYWxQb2ludHMgLSAxKTsKICAgICAgICByZXR1cm4gTWF0aC5yb3VuZChvZmZzZXQgKiBtdWx0KSAvIG11bHQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5wdXQKICAgICAqIEBwYXJhbSB7P30gYWxsU3R5bGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuU3R5bGVzJDEoaW5wdXQsIGFsbFN0eWxlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGFsbFByb3BlcnRpZXM7CiAgICAgICAgaW5wdXQuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9rZW4gPT4gewogICAgICAgICAgICBpZiAodG9rZW4gPT09ICcqJykgewogICAgICAgICAgICAgICAgYWxsUHJvcGVydGllcyA9IGFsbFByb3BlcnRpZXMgfHwgT2JqZWN0LmtleXMoYWxsU3R5bGVzKTsKICAgICAgICAgICAgICAgIGFsbFByb3BlcnRpZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgICAgIHN0eWxlc1twcm9wXSA9IEFVVE9fU1RZTEU7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb3B5U3R5bGVzKCgvKiogQHR5cGUgez99ICovICh0b2tlbikpLCBmYWxzZSwgc3R5bGVzKTsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gc3R5bGVzOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9kc2wvc3R5bGVfbm9ybWFsaXphdGlvbi9hbmltYXRpb25fc3R5bGVfbm9ybWFsaXplci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgQW5pbWF0aW9uU3R5bGVOb3JtYWxpemVyIHsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL3N0eWxlX25vcm1hbGl6YXRpb24vd2ViX2FuaW1hdGlvbnNfc3R5bGVfbm9ybWFsaXplci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBXZWJBbmltYXRpb25zU3R5bGVOb3JtYWxpemVyIGV4dGVuZHMgQW5pbWF0aW9uU3R5bGVOb3JtYWxpemVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3BlcnR5TmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBub3JtYWxpemVQcm9wZXJ0eU5hbWUocHJvcGVydHlOYW1lLCBlcnJvcnMpIHsKICAgICAgICAgICAgcmV0dXJuIGRhc2hDYXNlVG9DYW1lbENhc2UocHJvcGVydHlOYW1lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB1c2VyUHJvdmlkZWRQcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7P30gbm9ybWFsaXplZFByb3BlcnR5CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBub3JtYWxpemVTdHlsZVZhbHVlKHVzZXJQcm92aWRlZFByb3BlcnR5LCBub3JtYWxpemVkUHJvcGVydHksIHZhbHVlLCBlcnJvcnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdW5pdCA9ICcnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0clZhbCA9IHZhbHVlLnRvU3RyaW5nKCkudHJpbSgpOwogICAgICAgICAgICBpZiAoRElNRU5TSU9OQUxfUFJPUF9NQVBbbm9ybWFsaXplZFByb3BlcnR5XSAmJiB2YWx1ZSAhPT0gMCAmJiB2YWx1ZSAhPT0gJzAnKSB7CiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgIHVuaXQgPSAncHgnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbEFuZFN1ZmZpeE1hdGNoID0gdmFsdWUubWF0Y2goL15bKy1dP1tcZFwuXSsoW2Etel0qKSQvKTsKICAgICAgICAgICAgICAgICAgICBpZiAodmFsQW5kU3VmZml4TWF0Y2ggJiYgdmFsQW5kU3VmZml4TWF0Y2hbMV0ubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYFBsZWFzZSBwcm92aWRlIGEgQ1NTIHVuaXQgdmFsdWUgZm9yICR7dXNlclByb3ZpZGVkUHJvcGVydHl9OiR7dmFsdWV9YCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdHJWYWwgKyB1bml0OwogICAgICAgIH0KICAgIH0KICAgIGNvbnN0IMm1MCQxJDIgPSAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IG1ha2VCb29sZWFuTWFwKCd3aWR0aCxoZWlnaHQsbWluV2lkdGgsbWluSGVpZ2h0LG1heFdpZHRoLG1heEhlaWdodCxsZWZ0LHRvcCxib3R0b20scmlnaHQsZm9udFNpemUsb3V0bGluZVdpZHRoLG91dGxpbmVPZmZzZXQscGFkZGluZ1RvcCxwYWRkaW5nTGVmdCxwYWRkaW5nQm90dG9tLHBhZGRpbmdSaWdodCxtYXJnaW5Ub3AsbWFyZ2luTGVmdCxtYXJnaW5Cb3R0b20sbWFyZ2luUmlnaHQsYm9yZGVyUmFkaXVzLGJvcmRlcldpZHRoLGJvcmRlclRvcFdpZHRoLGJvcmRlckxlZnRXaWR0aCxib3JkZXJSaWdodFdpZHRoLGJvcmRlckJvdHRvbVdpZHRoLHRleHRJbmRlbnQscGVyc3BlY3RpdmUnCiAgICAgICAgLnNwbGl0KCcsJykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRElNRU5TSU9OQUxfUFJPUF9NQVAgPSAoKMm1MCQxJDIpKSgpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGtleXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1ha2VCb29sZWFuTWFwKGtleXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWFwID0ge307CiAgICAgICAga2V5cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAga2V5ID0+IG1hcFtrZXldID0gdHJ1ZSkpOwogICAgICAgIHJldHVybiBtYXA7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSB0cmlnZ2VyTmFtZQogICAgICogQHBhcmFtIHs/fSBmcm9tU3RhdGUKICAgICAqIEBwYXJhbSB7P30gdG9TdGF0ZQogICAgICogQHBhcmFtIHs/fSBpc1JlbW92YWxUcmFuc2l0aW9uCiAgICAgKiBAcGFyYW0gez99IGZyb21TdHlsZXMKICAgICAqIEBwYXJhbSB7P30gdG9TdHlsZXMKICAgICAqIEBwYXJhbSB7P30gdGltZWxpbmVzCiAgICAgKiBAcGFyYW0gez99IHF1ZXJpZWRFbGVtZW50cwogICAgICogQHBhcmFtIHs/fSBwcmVTdHlsZVByb3BzCiAgICAgKiBAcGFyYW0gez99IHBvc3RTdHlsZVByb3BzCiAgICAgKiBAcGFyYW0gez99IHRvdGFsVGltZQogICAgICogQHBhcmFtIHs/PX0gZXJyb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVUcmFuc2l0aW9uSW5zdHJ1Y3Rpb24oZWxlbWVudCwgdHJpZ2dlck5hbWUsIGZyb21TdGF0ZSwgdG9TdGF0ZSwgaXNSZW1vdmFsVHJhbnNpdGlvbiwgZnJvbVN0eWxlcywgdG9TdHlsZXMsIHRpbWVsaW5lcywgcXVlcmllZEVsZW1lbnRzLCBwcmVTdHlsZVByb3BzLCBwb3N0U3R5bGVQcm9wcywgdG90YWxUaW1lLCBlcnJvcnMpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICB0eXBlOiAwIC8qIFRyYW5zaXRpb25BbmltYXRpb24gKi8sCiAgICAgICAgICAgIGVsZW1lbnQsCiAgICAgICAgICAgIHRyaWdnZXJOYW1lLAogICAgICAgICAgICBpc1JlbW92YWxUcmFuc2l0aW9uLAogICAgICAgICAgICBmcm9tU3RhdGUsCiAgICAgICAgICAgIGZyb21TdHlsZXMsCiAgICAgICAgICAgIHRvU3RhdGUsCiAgICAgICAgICAgIHRvU3R5bGVzLAogICAgICAgICAgICB0aW1lbGluZXMsCiAgICAgICAgICAgIHF1ZXJpZWRFbGVtZW50cywKICAgICAgICAgICAgcHJlU3R5bGVQcm9wcywKICAgICAgICAgICAgcG9zdFN0eWxlUHJvcHMsCiAgICAgICAgICAgIHRvdGFsVGltZSwKICAgICAgICAgICAgZXJyb3JzCiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvZHNsL2FuaW1hdGlvbl90cmFuc2l0aW9uX2ZhY3RvcnkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRU1QVFlfT0JKRUNUID0ge307CiAgICBjbGFzcyBBbmltYXRpb25UcmFuc2l0aW9uRmFjdG9yeSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdHJpZ2dlck5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAqIEBwYXJhbSB7P30gX3N0YXRlU3R5bGVzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3RyaWdnZXJOYW1lLCBhc3QsIF9zdGF0ZVN0eWxlcykgewogICAgICAgICAgICB0aGlzLl90cmlnZ2VyTmFtZSA9IF90cmlnZ2VyTmFtZTsKICAgICAgICAgICAgdGhpcy5hc3QgPSBhc3Q7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlU3R5bGVzID0gX3N0YXRlU3R5bGVzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRTdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbmV4dFN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hdGNoKGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbGVtZW50LCBwYXJhbXMpIHsKICAgICAgICAgICAgcmV0dXJuIG9uZU9yTW9yZVRyYW5zaXRpb25zTWF0Y2godGhpcy5hc3QubWF0Y2hlcnMsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbGVtZW50LCBwYXJhbXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJ1aWxkU3R5bGVzKHN0YXRlTmFtZSwgcGFyYW1zLCBlcnJvcnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiYWNrdXBTdGF0ZVN0eWxlciA9IHRoaXMuX3N0YXRlU3R5bGVzWycqJ107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhdGVTdHlsZXIgPSB0aGlzLl9zdGF0ZVN0eWxlc1tzdGF0ZU5hbWVdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJhY2t1cFN0eWxlcyA9IGJhY2t1cFN0YXRlU3R5bGVyID8gYmFja3VwU3RhdGVTdHlsZXIuYnVpbGRTdHlsZXMocGFyYW1zLCBlcnJvcnMpIDoge307CiAgICAgICAgICAgIHJldHVybiBzdGF0ZVN0eWxlciA/IHN0YXRlU3R5bGVyLmJ1aWxkU3R5bGVzKHBhcmFtcywgZXJyb3JzKSA6IGJhY2t1cFN0eWxlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkcml2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRTdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbmV4dFN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbnRlckNsYXNzTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gbGVhdmVDbGFzc05hbWUKICAgICAgICAgKiBAcGFyYW0gez89fSBjdXJyZW50T3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Pz19IG5leHRPcHRpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gc3ViSW5zdHJ1Y3Rpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gc2tpcEFzdEJ1aWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBidWlsZChkcml2ZXIsIGVsZW1lbnQsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIGN1cnJlbnRPcHRpb25zLCBuZXh0T3B0aW9ucywgc3ViSW5zdHJ1Y3Rpb25zLCBza2lwQXN0QnVpbGQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uQW5pbWF0aW9uUGFyYW1zID0gdGhpcy5hc3Qub3B0aW9ucyAmJiB0aGlzLmFzdC5vcHRpb25zLnBhcmFtcyB8fCBFTVBUWV9PQkpFQ1Q7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudEFuaW1hdGlvblBhcmFtcyA9IGN1cnJlbnRPcHRpb25zICYmIGN1cnJlbnRPcHRpb25zLnBhcmFtcyB8fCBFTVBUWV9PQkpFQ1Q7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudFN0YXRlU3R5bGVzID0gdGhpcy5idWlsZFN0eWxlcyhjdXJyZW50U3RhdGUsIGN1cnJlbnRBbmltYXRpb25QYXJhbXMsIGVycm9ycyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dEFuaW1hdGlvblBhcmFtcyA9IG5leHRPcHRpb25zICYmIG5leHRPcHRpb25zLnBhcmFtcyB8fCBFTVBUWV9PQkpFQ1Q7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlU3R5bGVzID0gdGhpcy5idWlsZFN0eWxlcyhuZXh0U3RhdGUsIG5leHRBbmltYXRpb25QYXJhbXMsIGVycm9ycyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcXVlcmllZEVsZW1lbnRzID0gbmV3IFNldCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZVN0eWxlTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc3RTdHlsZU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1JlbW92YWwgPSBuZXh0U3RhdGUgPT09ICd2b2lkJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmltYXRpb25PcHRpb25zID0geyBwYXJhbXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdHJhbnNpdGlvbkFuaW1hdGlvblBhcmFtcyksIG5leHRBbmltYXRpb25QYXJhbXMpIH07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltZWxpbmVzID0gc2tpcEFzdEJ1aWxkID8KICAgICAgICAgICAgICAgIFtdIDoKICAgICAgICAgICAgICAgIGJ1aWxkQW5pbWF0aW9uVGltZWxpbmVzKGRyaXZlciwgZWxlbWVudCwgdGhpcy5hc3QuYW5pbWF0aW9uLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIGN1cnJlbnRTdGF0ZVN0eWxlcywgbmV4dFN0YXRlU3R5bGVzLCBhbmltYXRpb25PcHRpb25zLCBzdWJJbnN0cnVjdGlvbnMsIGVycm9ycyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHRvdGFsVGltZSA9IDA7CiAgICAgICAgICAgIHRpbWVsaW5lcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0bAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGwgPT4gewogICAgICAgICAgICAgICAgdG90YWxUaW1lID0gTWF0aC5tYXgodGwuZHVyYXRpb24gKyB0bC5kZWxheSwgdG90YWxUaW1lKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVRyYW5zaXRpb25JbnN0cnVjdGlvbihlbGVtZW50LCB0aGlzLl90cmlnZ2VyTmFtZSwgY3VycmVudFN0YXRlLCBuZXh0U3RhdGUsIGlzUmVtb3ZhbCwgY3VycmVudFN0YXRlU3R5bGVzLCBuZXh0U3RhdGVTdHlsZXMsIFtdLCBbXSwgcHJlU3R5bGVNYXAsIHBvc3RTdHlsZU1hcCwgdG90YWxUaW1lLCBlcnJvcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRpbWVsaW5lcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0bAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGwgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxtID0gdGwuZWxlbWVudDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZVByb3BzID0gZ2V0T3JTZXRBc0luTWFwKHByZVN0eWxlTWFwLCBlbG0sIHt9KTsKICAgICAgICAgICAgICAgIHRsLnByZVN0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3AgPT4gcHJlUHJvcHNbcHJvcF0gPSB0cnVlKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwb3N0UHJvcHMgPSBnZXRPclNldEFzSW5NYXAocG9zdFN0eWxlTWFwLCBlbG0sIHt9KTsKICAgICAgICAgICAgICAgIHRsLnBvc3RTdHlsZVByb3BzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwcm9wID0+IHBvc3RQcm9wc1twcm9wXSA9IHRydWUpKTsKICAgICAgICAgICAgICAgIGlmIChlbG0gIT09IGVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICBxdWVyaWVkRWxlbWVudHMuYWRkKGVsbSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBxdWVyaWVkRWxlbWVudHNMaXN0ID0gaXRlcmF0b3JUb0FycmF5KHF1ZXJpZWRFbGVtZW50cy52YWx1ZXMoKSk7CiAgICAgICAgICAgIHJldHVybiBjcmVhdGVUcmFuc2l0aW9uSW5zdHJ1Y3Rpb24oZWxlbWVudCwgdGhpcy5fdHJpZ2dlck5hbWUsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBpc1JlbW92YWwsIGN1cnJlbnRTdGF0ZVN0eWxlcywgbmV4dFN0YXRlU3R5bGVzLCB0aW1lbGluZXMsIHF1ZXJpZWRFbGVtZW50c0xpc3QsIHByZVN0eWxlTWFwLCBwb3N0U3R5bGVNYXAsIHRvdGFsVGltZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG1hdGNoRm5zCiAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRTdGF0ZQogICAgICogQHBhcmFtIHs/fSBuZXh0U3RhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG9uZU9yTW9yZVRyYW5zaXRpb25zTWF0Y2gobWF0Y2hGbnMsIGN1cnJlbnRTdGF0ZSwgbmV4dFN0YXRlLCBlbGVtZW50LCBwYXJhbXMpIHsKICAgICAgICByZXR1cm4gbWF0Y2hGbnMuc29tZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oY3VycmVudFN0YXRlLCBuZXh0U3RhdGUsIGVsZW1lbnQsIHBhcmFtcykpKTsKICAgIH0KICAgIGNsYXNzIEFuaW1hdGlvblN0YXRlU3R5bGVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0eWxlcwogICAgICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdFBhcmFtcwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0eWxlcywgZGVmYXVsdFBhcmFtcykgewogICAgICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsKICAgICAgICAgICAgdGhpcy5kZWZhdWx0UGFyYW1zID0gZGVmYXVsdFBhcmFtczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAgICAgKiBAcGFyYW0gez99IGVycm9ycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnVpbGRTdHlsZXMocGFyYW1zLCBlcnJvcnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaW5hbFN0eWxlcyA9IHt9OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkUGFyYW1zID0gY29weU9iaih0aGlzLmRlZmF1bHRQYXJhbXMpOwogICAgICAgICAgICBPYmplY3Qua2V5cyhwYXJhbXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2V5ID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyYW1zW2tleV07CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkUGFyYW1zW2tleV0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLnN0eWxlcy5zdHlsZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhbHVlID0+IHsKICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlT2JqID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVPYmopLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHZhbCA9IHN0eWxlT2JqW3Byb3BdOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IGludGVycG9sYXRlUGFyYW1zKHZhbCwgY29tYmluZWRQYXJhbXMsIGVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxTdHlsZXNbcHJvcF0gPSB2YWw7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiBmaW5hbFN0eWxlczsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL2RzbC9hbmltYXRpb25fdHJpZ2dlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBidWlsZFRyaWdnZXIobmFtZSwgYXN0KSB7CiAgICAgICAgcmV0dXJuIG5ldyBBbmltYXRpb25UcmlnZ2VyKG5hbWUsIGFzdCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEFuaW1hdGlvblRyaWdnZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gYXN0CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IobmFtZSwgYXN0KSB7CiAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7CiAgICAgICAgICAgIHRoaXMuYXN0ID0gYXN0OwogICAgICAgICAgICB0aGlzLnRyYW5zaXRpb25GYWN0b3JpZXMgPSBbXTsKICAgICAgICAgICAgdGhpcy5zdGF0ZXMgPSB7fTsKICAgICAgICAgICAgYXN0LnN0YXRlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhc3QKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFzdCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZWZhdWx0UGFyYW1zID0gKGFzdC5vcHRpb25zICYmIGFzdC5vcHRpb25zLnBhcmFtcykgfHwge307CiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlc1thc3QubmFtZV0gPSBuZXcgQW5pbWF0aW9uU3RhdGVTdHlsZXMoYXN0LnN0eWxlLCBkZWZhdWx0UGFyYW1zKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBiYWxhbmNlUHJvcGVydGllcyh0aGlzLnN0YXRlcywgJ3RydWUnLCAnMScpOwogICAgICAgICAgICBiYWxhbmNlUHJvcGVydGllcyh0aGlzLnN0YXRlcywgJ2ZhbHNlJywgJzAnKTsKICAgICAgICAgICAgYXN0LnRyYW5zaXRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgYXN0ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMudHJhbnNpdGlvbkZhY3Rvcmllcy5wdXNoKG5ldyBBbmltYXRpb25UcmFuc2l0aW9uRmFjdG9yeShuYW1lLCBhc3QsIHRoaXMuc3RhdGVzKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5mYWxsYmFja1RyYW5zaXRpb24gPSBjcmVhdGVGYWxsYmFja1RyYW5zaXRpb24obmFtZSwgdGhpcy5zdGF0ZXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250YWluc1F1ZXJpZXMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFzdC5xdWVyeUNvdW50ID4gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50U3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG5leHRTdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXRjaFRyYW5zaXRpb24oY3VycmVudFN0YXRlLCBuZXh0U3RhdGUsIGVsZW1lbnQsIHBhcmFtcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gdGhpcy50cmFuc2l0aW9uRmFjdG9yaWVzLmZpbmQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGYKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGYgPT4gZi5tYXRjaChjdXJyZW50U3RhdGUsIG5leHRTdGF0ZSwgZWxlbWVudCwgcGFyYW1zKSkpOwogICAgICAgICAgICByZXR1cm4gZW50cnkgfHwgbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50U3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtcwogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXRjaFN0eWxlcyhjdXJyZW50U3RhdGUsIHBhcmFtcywgZXJyb3JzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZhbGxiYWNrVHJhbnNpdGlvbi5idWlsZFN0eWxlcyhjdXJyZW50U3RhdGUsIHBhcmFtcywgZXJyb3JzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICAgICAqIEBwYXJhbSB7P30gc3RhdGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVGYWxsYmFja1RyYW5zaXRpb24odHJpZ2dlck5hbWUsIHN0YXRlcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaGVycyA9IFsoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZnJvbVN0YXRlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdG9TdGF0ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGZyb21TdGF0ZSwgdG9TdGF0ZSkgPT4gdHJ1ZSldOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbmltYXRpb24gPSB7IHR5cGU6IDIgLyogU2VxdWVuY2UgKi8sIHN0ZXBzOiBbXSwgb3B0aW9uczogbnVsbCB9OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gewogICAgICAgICAgICB0eXBlOiAxIC8qIFRyYW5zaXRpb24gKi8sCiAgICAgICAgICAgIGFuaW1hdGlvbiwKICAgICAgICAgICAgbWF0Y2hlcnMsCiAgICAgICAgICAgIG9wdGlvbnM6IG51bGwsCiAgICAgICAgICAgIHF1ZXJ5Q291bnQ6IDAsCiAgICAgICAgICAgIGRlcENvdW50OiAwCiAgICAgICAgfTsKICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvblRyYW5zaXRpb25GYWN0b3J5KHRyaWdnZXJOYW1lLCB0cmFuc2l0aW9uLCBzdGF0ZXMpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG9iagogICAgICogQHBhcmFtIHs/fSBrZXkxCiAgICAgKiBAcGFyYW0gez99IGtleTIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGJhbGFuY2VQcm9wZXJ0aWVzKG9iaiwga2V5MSwga2V5MikgewogICAgICAgIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5MSkpIHsKICAgICAgICAgICAgaWYgKCFvYmouaGFzT3duUHJvcGVydHkoa2V5MikpIHsKICAgICAgICAgICAgICAgIG9ialtrZXkyXSA9IG9ialtrZXkxXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChvYmouaGFzT3duUHJvcGVydHkoa2V5MikpIHsKICAgICAgICAgICAgb2JqW2tleTFdID0gb2JqW2tleTJdOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3RpbWVsaW5lX2FuaW1hdGlvbl9lbmdpbmUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRU1QVFlfSU5TVFJVQ1RJT05fTUFQID0gbmV3IEVsZW1lbnRJbnN0cnVjdGlvbk1hcCgpOwogICAgY2xhc3MgVGltZWxpbmVBbmltYXRpb25FbmdpbmUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYm9keU5vZGUKICAgICAgICAgKiBAcGFyYW0gez99IF9kcml2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9ub3JtYWxpemVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYm9keU5vZGUsIF9kcml2ZXIsIF9ub3JtYWxpemVyKSB7CiAgICAgICAgICAgIHRoaXMuYm9keU5vZGUgPSBib2R5Tm9kZTsKICAgICAgICAgICAgdGhpcy5fZHJpdmVyID0gX2RyaXZlcjsKICAgICAgICAgICAgdGhpcy5fbm9ybWFsaXplciA9IF9ub3JtYWxpemVyOwogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25zID0ge307CiAgICAgICAgICAgIHRoaXMuX3BsYXllcnNCeUlkID0ge307CiAgICAgICAgICAgIHRoaXMucGxheWVycyA9IFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRhZGF0YQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXIoaWQsIG1ldGFkYXRhKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXN0ID0gYnVpbGRBbmltYXRpb25Bc3QodGhpcy5fZHJpdmVyLCBtZXRhZGF0YSwgZXJyb3JzKTsKICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5hYmxlIHRvIGJ1aWxkIHRoZSBhbmltYXRpb24gZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiAke2Vycm9ycy5qb2luKCdcbicpfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uc1tpZF0gPSBhc3Q7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcGFyYW0gez99IHByZVN0eWxlcwogICAgICAgICAqIEBwYXJhbSB7Pz19IHBvc3RTdHlsZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9idWlsZFBsYXllcihpLCBwcmVTdHlsZXMsIHBvc3RTdHlsZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gaS5lbGVtZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGtleWZyYW1lcyA9IG5vcm1hbGl6ZUtleWZyYW1lcyh0aGlzLl9kcml2ZXIsIHRoaXMuX25vcm1hbGl6ZXIsIGVsZW1lbnQsIGkua2V5ZnJhbWVzLCBwcmVTdHlsZXMsIHBvc3RTdHlsZXMpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZHJpdmVyLmFuaW1hdGUoZWxlbWVudCwga2V5ZnJhbWVzLCBpLmR1cmF0aW9uLCBpLmRlbGF5LCBpLmVhc2luZywgW10sIHRydWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlKGlkLCBlbGVtZW50LCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhc3QgPSB0aGlzLl9hbmltYXRpb25zW2lkXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaW5zdHJ1Y3Rpb25zOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF1dG9TdHlsZXNNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIGlmIChhc3QpIHsKICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucyA9IGJ1aWxkQW5pbWF0aW9uVGltZWxpbmVzKHRoaXMuX2RyaXZlciwgZWxlbWVudCwgYXN0LCBFTlRFUl9DTEFTU05BTUUsIExFQVZFX0NMQVNTTkFNRSwge30sIHt9LCBvcHRpb25zLCBFTVBUWV9JTlNUUlVDVElPTl9NQVAsIGVycm9ycyk7CiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluc3QKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGluc3QgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHlsZXMgPSBnZXRPclNldEFzSW5NYXAoYXV0b1N0eWxlc01hcCwgaW5zdC5lbGVtZW50LCB7fSk7CiAgICAgICAgICAgICAgICAgICAgaW5zdC5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHByb3AgPT4gc3R5bGVzW3Byb3BdID0gbnVsbCkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goJ1RoZSByZXF1ZXN0ZWQgYW5pbWF0aW9uIGRvZXNuXCd0IGV4aXN0IG9yIGhhcyBhbHJlYWR5IGJlZW4gZGVzdHJveWVkJyk7CiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZXJyb3JzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gY3JlYXRlIHRoZSBhbmltYXRpb24gZHVlIHRvIHRoZSBmb2xsb3dpbmcgZXJyb3JzOiAke2Vycm9ycy5qb2luKCdcbicpfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGF1dG9TdHlsZXNNYXAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHN0eWxlcywgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVzW3Byb3BdID0gdGhpcy5fZHJpdmVyLmNvbXB1dGVTdHlsZShlbGVtZW50LCBwcm9wLCBBVVRPX1NUWUxFKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSBpbnN0cnVjdGlvbnMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9IGF1dG9TdHlsZXNNYXAuZ2V0KGkuZWxlbWVudCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYnVpbGRQbGF5ZXIoaSwge30sIHN0eWxlcyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBvcHRpbWl6ZUdyb3VwUGxheWVyKHBsYXllcnMpOwogICAgICAgICAgICB0aGlzLl9wbGF5ZXJzQnlJZFtpZF0gPSBwbGF5ZXI7CiAgICAgICAgICAgIHBsYXllci5vbkRlc3Ryb3koKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5kZXN0cm95KGlkKSkpOwogICAgICAgICAgICB0aGlzLnBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICByZXR1cm4gcGxheWVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KGlkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5fZ2V0UGxheWVyKGlkKTsKICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3BsYXllcnNCeUlkW2lkXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucGxheWVycy5pbmRleE9mKHBsYXllcik7CiAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBsYXllcnMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRQbGF5ZXIoaWQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLl9wbGF5ZXJzQnlJZFtpZF07CiAgICAgICAgICAgIGlmICghcGxheWVyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBmaW5kIHRoZSB0aW1lbGluZSBwbGF5ZXIgcmVmZXJlbmNlZCBieSAke2lkfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwbGF5ZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxpc3RlbihpZCwgZWxlbWVudCwgZXZlbnROYW1lLCBjYWxsYmFjaykgewogICAgICAgICAgICAvLyB0cmlnZ2VyTmFtZSwgZnJvbVN0YXRlLCB0b1N0YXRlIGFyZSBhbGwgaWdub3JlZCBmb3IgdGltZWxpbmUgYW5pbWF0aW9ucwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJhc2VFdmVudCA9IG1ha2VBbmltYXRpb25FdmVudChlbGVtZW50LCAnJywgJycsICcnKTsKICAgICAgICAgICAgbGlzdGVuT25QbGF5ZXIodGhpcy5fZ2V0UGxheWVyKGlkKSwgZXZlbnROYW1lLCBiYXNlRXZlbnQsIGNhbGxiYWNrKTsKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNvbW1hbmQKICAgICAgICAgKiBAcGFyYW0gez99IGFyZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvbW1hbmQoaWQsIGVsZW1lbnQsIGNvbW1hbmQsIGFyZ3MpIHsKICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ3JlZ2lzdGVyJykgewogICAgICAgICAgICAgICAgdGhpcy5yZWdpc3RlcihpZCwgKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3NbMF0pKSk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gJ2NyZWF0ZScpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKGFyZ3NbMF0gfHwge30pKSk7CiAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZShpZCwgZWxlbWVudCwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSB0aGlzLl9nZXRQbGF5ZXIoaWQpOwogICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3BsYXknOgogICAgICAgICAgICAgICAgICAgIHBsYXllci5wbGF5KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdwYXVzZSc6CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdyZXNldCc6CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdyZXN0YXJ0JzoKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIucmVzdGFydCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnZmluaXNoJzoKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZmluaXNoKCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdpbml0JzoKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuaW5pdCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnc2V0UG9zaXRpb24nOgogICAgICAgICAgICAgICAgICAgIHBsYXllci5zZXRQb3NpdGlvbihwYXJzZUZsb2F0KCgvKiogQHR5cGUgez99ICovIChhcmdzWzBdKSkpKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2Rlc3Ryb3knOgogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveShpZCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci90cmFuc2l0aW9uX2FuaW1hdGlvbl9lbmdpbmUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUVVFVUVEX0NMQVNTTkFNRSA9ICduZy1hbmltYXRlLXF1ZXVlZCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBRVUVVRURfU0VMRUNUT1IgPSAnLm5nLWFuaW1hdGUtcXVldWVkJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERJU0FCTEVEX0NMQVNTTkFNRSA9ICduZy1hbmltYXRlLWRpc2FibGVkJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERJU0FCTEVEX1NFTEVDVE9SID0gJy5uZy1hbmltYXRlLWRpc2FibGVkJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNUQVJfQ0xBU1NOQU1FID0gJ25nLXN0YXItaW5zZXJ0ZWQnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1RBUl9TRUxFQ1RPUiA9ICcubmctc3Rhci1pbnNlcnRlZCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBFTVBUWV9QTEFZRVJfQVJSQVkgPSBbXTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5VTExfUkVNT1ZBTF9TVEFURSA9IHsKICAgICAgICBuYW1lc3BhY2VJZDogJycsCiAgICAgICAgc2V0Rm9yUmVtb3ZhbDogZmFsc2UsCiAgICAgICAgc2V0Rm9yTW92ZTogZmFsc2UsCiAgICAgICAgaGFzQW5pbWF0aW9uOiBmYWxzZSwKICAgICAgICByZW1vdmVkQmVmb3JlUXVlcmllZDogZmFsc2UKICAgIH07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBOVUxMX1JFTU9WRURfUVVFUklFRF9TVEFURSA9IHsKICAgICAgICBuYW1lc3BhY2VJZDogJycsCiAgICAgICAgc2V0Rm9yTW92ZTogZmFsc2UsCiAgICAgICAgc2V0Rm9yUmVtb3ZhbDogZmFsc2UsCiAgICAgICAgaGFzQW5pbWF0aW9uOiBmYWxzZSwKICAgICAgICByZW1vdmVkQmVmb3JlUXVlcmllZDogdHJ1ZQogICAgfTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJFTU9WQUxfRkxBRyA9ICdfX25nX3JlbW92ZWQnOwogICAgY2xhc3MgU3RhdGVWYWx1ZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpbnB1dAogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZUlkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaW5wdXQsIG5hbWVzcGFjZUlkID0gJycpIHsKICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VJZCA9IG5hbWVzcGFjZUlkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzT2JqID0gaW5wdXQgJiYgaW5wdXQuaGFzT3duUHJvcGVydHkoJ3ZhbHVlJyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBpc09iaiA/IGlucHV0Wyd2YWx1ZSddIDogaW5wdXQ7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSBub3JtYWxpemVUcmlnZ2VyVmFsdWUodmFsdWUpOwogICAgICAgICAgICBpZiAoaXNPYmopIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9wdGlvbnMgPSBjb3B5T2JqKCgvKiogQHR5cGUgez99ICovIChpbnB1dCkpKTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zWyd2YWx1ZSddOwogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLnBhcmFtcykgewogICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBhcmFtcyA9IHt9OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBhcmFtcygpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLm9wdGlvbnMucGFyYW1zKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWJzb3JiT3B0aW9ucyhvcHRpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3UGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7CiAgICAgICAgICAgIGlmIChuZXdQYXJhbXMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9sZFBhcmFtcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm9wdGlvbnMucGFyYW1zKSk7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhuZXdQYXJhbXMpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAob2xkUGFyYW1zW3Byb3BdID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGFyYW1zW3Byb3BdID0gbmV3UGFyYW1zW3Byb3BdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFZPSURfVkFMVUUgPSAndm9pZCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUZBVUxUX1NUQVRFX1ZBTFVFID0gbmV3IFN0YXRlVmFsdWUoVk9JRF9WQUxVRSk7CiAgICBjbGFzcyBBbmltYXRpb25UcmFuc2l0aW9uTmFtZXNwYWNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gX2VuZ2luZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGlkLCBob3N0RWxlbWVudCwgX2VuZ2luZSkgewogICAgICAgICAgICB0aGlzLmlkID0gaWQ7CiAgICAgICAgICAgIHRoaXMuaG9zdEVsZW1lbnQgPSBob3N0RWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fZW5naW5lID0gX2VuZ2luZTsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzID0gW107CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJzID0ge307CiAgICAgICAgICAgIHRoaXMuX3F1ZXVlID0gW107CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIHRoaXMuX2hvc3RDbGFzc05hbWUgPSAnbmctdG5zLScgKyBpZDsKICAgICAgICAgICAgYWRkQ2xhc3MoaG9zdEVsZW1lbnQsIHRoaXMuX2hvc3RDbGFzc05hbWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IHBoYXNlCiAgICAgICAgICogQHBhcmFtIHs/fSBjYWxsYmFjawogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbGlzdGVuKGVsZW1lbnQsIG5hbWUsIHBoYXNlLCBjYWxsYmFjaykgewogICAgICAgICAgICBpZiAoIXRoaXMuX3RyaWdnZXJzLmhhc093blByb3BlcnR5KG5hbWUpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsaXN0ZW4gb24gdGhlIGFuaW1hdGlvbiB0cmlnZ2VyIGV2ZW50ICIke3BoYXNlfSIgYmVjYXVzZSB0aGUgYW5pbWF0aW9uIHRyaWdnZXIgIiR7bmFtZX0iIGRvZXNuXCd0IGV4aXN0IWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwaGFzZSA9PSBudWxsIHx8IHBoYXNlLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuYWJsZSB0byBsaXN0ZW4gb24gdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke25hbWV9IiBiZWNhdXNlIHRoZSBwcm92aWRlZCBldmVudCBpcyB1bmRlZmluZWQhYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCFpc1RyaWdnZXJFdmVudFZhbGlkKHBoYXNlKSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgZXZlbnQgIiR7cGhhc2V9IiBmb3IgdGhlIGFuaW1hdGlvbiB0cmlnZ2VyICIke25hbWV9IiBpcyBub3Qgc3VwcG9ydGVkIWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gZ2V0T3JTZXRBc0luTWFwKHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMsIGVsZW1lbnQsIFtdKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkYXRhID0geyBuYW1lLCBwaGFzZSwgY2FsbGJhY2sgfTsKICAgICAgICAgICAgbGlzdGVuZXJzLnB1c2goZGF0YSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnNXaXRoU3RhdGVzID0gZ2V0T3JTZXRBc0luTWFwKHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQsIGVsZW1lbnQsIHt9KTsKICAgICAgICAgICAgaWYgKCF0cmlnZ2Vyc1dpdGhTdGF0ZXMuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIE5HX1RSSUdHRVJfQ0xBU1NOQU1FKTsKICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIE5HX1RSSUdHRVJfQ0xBU1NOQU1FICsgJy0nICsgbmFtZSk7CiAgICAgICAgICAgICAgICB0cmlnZ2Vyc1dpdGhTdGF0ZXNbbmFtZV0gPSBERUZBVUxUX1NUQVRFX1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyB0aGUgZXZlbnQgbGlzdGVuZXIgaXMgcmVtb3ZlZCBBRlRFUiB0aGUgZmx1c2ggaGFzIG9jY3VycmVkIHN1Y2gKICAgICAgICAgICAgICAgIC8vIHRoYXQgbGVhdmUgYW5pbWF0aW9ucyBjYWxsYmFja3MgY2FuIGZpcmUgKG90aGVyd2lzZSBpZiB0aGUgbm9kZQogICAgICAgICAgICAgICAgLy8gaXMgcmVtb3ZlZCBpbiBiZXR3ZWVuIHRoZW4gdGhlIGxpc3RlbmVycyB3b3VsZCBiZSBkZXJlZ2lzdGVyZWQpCiAgICAgICAgICAgICAgICB0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGlzdGVuZXJzLmluZGV4T2YoZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fdHJpZ2dlcnNbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRyaWdnZXJzV2l0aFN0YXRlc1tuYW1lXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGFzdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXIobmFtZSwgYXN0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl90cmlnZ2Vyc1tuYW1lXSkgewogICAgICAgICAgICAgICAgLy8gdGhyb3cKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJzW25hbWVdID0gYXN0OwogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRUcmlnZ2VyKG5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5fdHJpZ2dlcnNbbmFtZV07CiAgICAgICAgICAgIGlmICghdHJpZ2dlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUaGUgcHJvdmlkZWQgYW5pbWF0aW9uIHRyaWdnZXIgIiR7bmFtZX0iIGhhcyBub3QgYmVlbiByZWdpc3RlcmVkIWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0cmlnZ2VyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IHRyaWdnZXJOYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRUb0ZhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyKGVsZW1lbnQsIHRyaWdnZXJOYW1lLCB2YWx1ZSwgZGVmYXVsdFRvRmFsbGJhY2sgPSB0cnVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHJpZ2dlciA9IHRoaXMuX2dldFRyaWdnZXIodHJpZ2dlck5hbWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IG5ldyBUcmFuc2l0aW9uQW5pbWF0aW9uUGxheWVyKHRoaXMuaWQsIHRyaWdnZXJOYW1lLCBlbGVtZW50KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHJpZ2dlcnNXaXRoU3RhdGVzID0gdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmICghdHJpZ2dlcnNXaXRoU3RhdGVzKSB7CiAgICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBOR19UUklHR0VSX0NMQVNTTkFNRSk7CiAgICAgICAgICAgICAgICBhZGRDbGFzcyhlbGVtZW50LCBOR19UUklHR0VSX0NMQVNTTkFNRSArICctJyArIHRyaWdnZXJOYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5zdGF0ZXNCeUVsZW1lbnQuc2V0KGVsZW1lbnQsIHRyaWdnZXJzV2l0aFN0YXRlcyA9IHt9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBmcm9tU3RhdGUgPSB0cmlnZ2Vyc1dpdGhTdGF0ZXNbdHJpZ2dlck5hbWVdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRvU3RhdGUgPSBuZXcgU3RhdGVWYWx1ZSh2YWx1ZSwgdGhpcy5pZCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNPYmogPSB2YWx1ZSAmJiB2YWx1ZS5oYXNPd25Qcm9wZXJ0eSgndmFsdWUnKTsKICAgICAgICAgICAgaWYgKCFpc09iaiAmJiBmcm9tU3RhdGUpIHsKICAgICAgICAgICAgICAgIHRvU3RhdGUuYWJzb3JiT3B0aW9ucyhmcm9tU3RhdGUub3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdHJpZ2dlcnNXaXRoU3RhdGVzW3RyaWdnZXJOYW1lXSA9IHRvU3RhdGU7CiAgICAgICAgICAgIGlmICghZnJvbVN0YXRlKSB7CiAgICAgICAgICAgICAgICBmcm9tU3RhdGUgPSBERUZBVUxUX1NUQVRFX1ZBTFVFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNSZW1vdmFsID0gdG9TdGF0ZS52YWx1ZSA9PT0gVk9JRF9WQUxVRTsKICAgICAgICAgICAgLy8gbm9ybWFsbHkgdGhpcyBpc24ndCByZWFjaGVkIGJ5IGhlcmUsIGhvd2V2ZXIsIGlmIGFuIG9iamVjdCBleHByZXNzaW9uCiAgICAgICAgICAgIC8vIGlzIHBhc3NlZCBpbiB0aGVuIGl0IG1heSBiZSBhIG5ldyBvYmplY3QgZWFjaCB0aW1lLiBDb21wYXJpbmcgdGhlIHZhbHVlCiAgICAgICAgICAgIC8vIGlzIGltcG9ydGFudCBzaW5jZSB0aGF0IHdpbGwgc3RheSB0aGUgc2FtZSBkZXNwaXRlIHRoZXJlIGJlaW5nIGEgbmV3IG9iamVjdC4KICAgICAgICAgICAgLy8gVGhlIHJlbW92YWwgYXJjIGhlcmUgaXMgc3BlY2lhbCBjYXNlZCBiZWNhdXNlIHRoZSBzYW1lIGVsZW1lbnQgaXMgdHJpZ2dlcmVkCiAgICAgICAgICAgIC8vIHR3aWNlIGluIHRoZSBldmVudCB0aGF0IGl0IGNvbnRhaW5zIGFuaW1hdGlvbnMgb24gdGhlIG91dGVyL2lubmVyIHBvcnRpb25zCiAgICAgICAgICAgIC8vIG9mIHRoZSBob3N0IGNvbnRhaW5lcgogICAgICAgICAgICBpZiAoIWlzUmVtb3ZhbCAmJiBmcm9tU3RhdGUudmFsdWUgPT09IHRvU3RhdGUudmFsdWUpIHsKICAgICAgICAgICAgICAgIC8vIHRoaXMgbWVhbnMgdGhhdCBkZXNwaXRlIHRoZSB2YWx1ZSBub3QgY2hhbmdpbmcsIHNvbWUgaW5uZXIgcGFyYW1zCiAgICAgICAgICAgICAgICAvLyBoYXZlIGNoYW5nZWQgd2hpY2ggbWVhbnMgdGhhdCB0aGUgYW5pbWF0aW9uIGZpbmFsIHN0eWxlcyBuZWVkIHRvIGJlIGFwcGxpZWQKICAgICAgICAgICAgICAgIGlmICghb2JqRXF1YWxzKGZyb21TdGF0ZS5wYXJhbXMsIHRvU3RhdGUucGFyYW1zKSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSBbXTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbVN0eWxlcyA9IHRyaWdnZXIubWF0Y2hTdHlsZXMoZnJvbVN0YXRlLnZhbHVlLCBmcm9tU3RhdGUucGFyYW1zLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0b1N0eWxlcyA9IHRyaWdnZXIubWF0Y2hTdHlsZXModG9TdGF0ZS52YWx1ZSwgdG9TdGF0ZS5wYXJhbXMsIGVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5naW5lLnJlcG9ydEVycm9yKGVycm9ycyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZVN0eWxlcyhlbGVtZW50LCBmcm9tU3R5bGVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0eWxlcyhlbGVtZW50LCB0b1N0eWxlcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbGF5ZXJzT25FbGVtZW50ID0gZ2V0T3JTZXRBc0luTWFwKHRoaXMuX2VuZ2luZS5wbGF5ZXJzQnlFbGVtZW50LCBlbGVtZW50LCBbXSk7CiAgICAgICAgICAgIHBsYXllcnNPbkVsZW1lbnQuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAgICAgLy8gb25seSByZW1vdmUgdGhlIHBsYXllciBpZiBpdCBpcyBxdWV1ZWQgb24gdGhlIEVYQUNUIHNhbWUgdHJpZ2dlci9uYW1lc3BhY2UKICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgYWxzbyBkZWFsIHdpdGggcXVldWVkIHBsYXllcnMgaGVyZSBiZWNhdXNlIGlmIHRoZSBhbmltYXRpb24gaGFzCiAgICAgICAgICAgICAgICAvLyBzdGFydGVkIHRoZW4gd2Ugd2FudCB0byBrZWVwIHRoZSBwbGF5ZXIgYWxpdmUgdW50aWwgdGhlIGZsdXNoIGhhcHBlbnMKICAgICAgICAgICAgICAgIC8vICh3aGljaCBpcyB3aGVyZSB0aGUgcHJldmlvdXNQbGF5ZXJzIGFyZSBwYXNzZWQgaW50byB0aGUgbmV3IHBhbHllcikKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIubmFtZXNwYWNlSWQgPT0gdGhpcy5pZCAmJiBwbGF5ZXIudHJpZ2dlck5hbWUgPT0gdHJpZ2dlck5hbWUgJiYgcGxheWVyLnF1ZXVlZCkgewogICAgICAgICAgICAgICAgICAgIHBsYXllci5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHJhbnNpdGlvbiA9IHRyaWdnZXIubWF0Y2hUcmFuc2l0aW9uKGZyb21TdGF0ZS52YWx1ZSwgdG9TdGF0ZS52YWx1ZSwgZWxlbWVudCwgdG9TdGF0ZS5wYXJhbXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpc0ZhbGxiYWNrVHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgIGlmICghZGVmYXVsdFRvRmFsbGJhY2spCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgdHJhbnNpdGlvbiA9IHRyaWdnZXIuZmFsbGJhY2tUcmFuc2l0aW9uOwogICAgICAgICAgICAgICAgaXNGYWxsYmFja1RyYW5zaXRpb24gPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2VuZ2luZS50b3RhbFF1ZXVlZFBsYXllcnMrKzsKICAgICAgICAgICAgdGhpcy5fcXVldWUucHVzaCh7IGVsZW1lbnQsIHRyaWdnZXJOYW1lLCB0cmFuc2l0aW9uLCBmcm9tU3RhdGUsIHRvU3RhdGUsIHBsYXllciwgaXNGYWxsYmFja1RyYW5zaXRpb24gfSk7CiAgICAgICAgICAgIGlmICghaXNGYWxsYmFja1RyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsZW1lbnQsIFFVRVVFRF9DTEFTU05BTUUpOwogICAgICAgICAgICAgICAgcGxheWVyLm9uU3RhcnQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJlbW92ZUNsYXNzKGVsZW1lbnQsIFFVRVVFRF9DTEFTU05BTUUpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHBsYXllci5vbkRvbmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gdGhpcy5wbGF5ZXJzLmluZGV4T2YocGxheWVyKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJzID0gdGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgaWYgKHBsYXllcnMpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IGluZGV4ID0gcGxheWVycy5pbmRleE9mKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVycy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLnBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICBwbGF5ZXJzT25FbGVtZW50LnB1c2gocGxheWVyKTsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXJlZ2lzdGVyKG5hbWUpIHsKICAgICAgICAgICAgZGVsZXRlIHRoaXMuX3RyaWdnZXJzW25hbWVdOwogICAgICAgICAgICB0aGlzLl9lbmdpbmUuc3RhdGVzQnlFbGVtZW50LmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlTWFwCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHN0YXRlTWFwLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICBkZWxldGUgc3RhdGVNYXBbbmFtZV07CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudExpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lcnMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobGlzdGVuZXJzLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50TGlzdGVuZXJzLnNldChlbGVtZW50LCBsaXN0ZW5lcnMuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkubmFtZSAhPSBuYW1lOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsZWFyRWxlbWVudENhY2hlKGVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRMaXN0ZW5lcnMuZGVsZXRlKGVsZW1lbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQbGF5ZXJzID0gdGhpcy5fZW5naW5lLnBsYXllcnNCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICBpZiAoZWxlbWVudFBsYXllcnMpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnRQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHBsYXllciA9PiBwbGF5ZXIuZGVzdHJveSgpKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbmdpbmUucGxheWVyc0J5RWxlbWVudC5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHJvb3RFbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2lnbmFsUmVtb3ZhbEZvcklubmVyVHJpZ2dlcnMocm9vdEVsZW1lbnQsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2VuZ2luZS5kcml2ZXIucXVlcnkocm9vdEVsZW1lbnQsIE5HX1RSSUdHRVJfU0VMRUNUT1IsIHRydWUpOwogICAgICAgICAgICAvLyBlbXVsYXRlIGEgbGVhdmUgYW5pbWF0aW9uIGZvciBhbGwgaW5uZXIgbm9kZXMgd2l0aGluIHRoaXMgbm9kZS4KICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGFuaW1hdGlvbnMgZm91bmQgZm9yIGFueSBvZiB0aGUgbm9kZXMgdGhlbiBjbGVhciB0aGUgY2FjaGUKICAgICAgICAgICAgLy8gZm9yIHRoZSBlbGVtZW50LgogICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbG0KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVsbSA9PiB7CiAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgYW4gaW5uZXIgcmVtb3ZlKCkgb3BlcmF0aW9uIGhhcyBhbHJlYWR5IGtpY2tlZCBvZmYKICAgICAgICAgICAgICAgIC8vIHRoZSBhbmltYXRpb24gb24gdGhpcyBlbGVtZW50Li4uCiAgICAgICAgICAgICAgICBpZiAoZWxtW1JFTU9WQUxfRkxBR10pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlcyA9IHRoaXMuX2VuZ2luZS5mZXRjaE5hbWVzcGFjZXNCeUVsZW1lbnQoZWxtKTsKICAgICAgICAgICAgICAgIGlmIChuYW1lc3BhY2VzLnNpemUpIHsKICAgICAgICAgICAgICAgICAgICBuYW1lc3BhY2VzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbnMKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIG5zID0+IG5zLnRyaWdnZXJMZWF2ZUFuaW1hdGlvbihlbG0sIGNvbnRleHQsIGZhbHNlLCB0cnVlKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbGVhckVsZW1lbnRDYWNoZShlbG0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIElmIHRoZSBjaGlsZCBlbGVtZW50cyB3ZXJlIHJlbW92ZWQgYWxvbmcgd2l0aCB0aGUgcGFyZW50LCB0aGVpciBhbmltYXRpb25zIG1pZ2h0IG5vdAogICAgICAgICAgICAvLyBoYXZlIGNvbXBsZXRlZC4gQ2xlYXIgYWxsIHRoZSBlbGVtZW50cyBmcm9tIHRoZSBjYWNoZSBzbyB3ZSBkb24ndCBlbmQgdXAgd2l0aCBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICB0aGlzLl9lbmdpbmUuYWZ0ZXJGbHVzaEFuaW1hdGlvbnNEb25lKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IGVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWxtID0+IHRoaXMuY2xlYXJFbGVtZW50Q2FjaGUoZWxtKSkpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlc3Ryb3lBZnRlckNvbXBsZXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdFRvRmFsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJMZWF2ZUFuaW1hdGlvbihlbGVtZW50LCBjb250ZXh0LCBkZXN0cm95QWZ0ZXJDb21wbGV0ZSwgZGVmYXVsdFRvRmFsbGJhY2spIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cmlnZ2VyU3RhdGVzID0gdGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmICh0cmlnZ2VyU3RhdGVzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXJzID0gW107CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0cmlnZ2VyU3RhdGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlck5hbWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRyaWdnZXJOYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGNoZWNrIGlzIGhlcmUgaW4gdGhlIGV2ZW50IHRoYXQgYW4gZWxlbWVudCBpcyByZW1vdmVkCiAgICAgICAgICAgICAgICAgICAgLy8gdHdpY2UgKGJvdGggb24gdGhlIGhvc3QgbGV2ZWwgYW5kIHRoZSBjb21wb25lbnQgbGV2ZWwpCiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXJzW3RyaWdnZXJOYW1lXSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IHRoaXMudHJpZ2dlcihlbGVtZW50LCB0cmlnZ2VyTmFtZSwgVk9JRF9WQUxVRSwgZGVmYXVsdFRvRmFsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZ2luZS5tYXJrRWxlbWVudEFzUmVtb3ZlZCh0aGlzLmlkLCBlbGVtZW50LCB0cnVlLCBjb250ZXh0KTsKICAgICAgICAgICAgICAgICAgICBpZiAoZGVzdHJveUFmdGVyQ29tcGxldGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW1pemVHcm91cFBsYXllcihwbGF5ZXJzKS5vbkRvbmUoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fZW5naW5lLnByb2Nlc3NMZWF2ZU5vZGUoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByZXBhcmVMZWF2ZUFuaW1hdGlvbkxpc3RlbmVycyhlbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChsaXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZpc2l0ZWRUcmlnZ2VycyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgICAgIGxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGxpc3RlbmVyID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlck5hbWUgPSBsaXN0ZW5lci5uYW1lOwogICAgICAgICAgICAgICAgICAgIGlmICh2aXNpdGVkVHJpZ2dlcnMuaGFzKHRyaWdnZXJOYW1lKSkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIHZpc2l0ZWRUcmlnZ2Vycy5hZGQodHJpZ2dlck5hbWUpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmlnZ2VyID0gdGhpcy5fdHJpZ2dlcnNbdHJpZ2dlck5hbWVdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFuc2l0aW9uID0gdHJpZ2dlci5mYWxsYmFja1RyYW5zaXRpb247CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTdGF0ZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZW5naW5lLnN0YXRlc0J5RWxlbWVudC5nZXQoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZnJvbVN0YXRlID0gZWxlbWVudFN0YXRlc1t0cmlnZ2VyTmFtZV0gfHwgREVGQVVMVF9TVEFURV9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdG9TdGF0ZSA9IG5ldyBTdGF0ZVZhbHVlKFZPSURfVkFMVUUpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwbGF5ZXIgPSBuZXcgVHJhbnNpdGlvbkFuaW1hdGlvblBsYXllcih0aGlzLmlkLCB0cmlnZ2VyTmFtZSwgZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5naW5lLnRvdGFsUXVldWVkUGxheWVycysrOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlLnB1c2goewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LAogICAgICAgICAgICAgICAgICAgICAgICB0cmlnZ2VyTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICB0b1N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlzRmFsbGJhY2tUcmFuc2l0aW9uOiB0cnVlCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVOb2RlKGVsZW1lbnQsIGNvbnRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbmdpbmUgPSB0aGlzLl9lbmdpbmU7CiAgICAgICAgICAgIGlmIChlbGVtZW50LmNoaWxkRWxlbWVudENvdW50KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zaWduYWxSZW1vdmFsRm9ySW5uZXJUcmlnZ2VycyhlbGVtZW50LCBjb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgYSAqID0+IFZPSUQgYW5pbWF0aW9uIHdhcyBkZXRlY3RlZCBhbmQga2lja2VkIG9mZgogICAgICAgICAgICBpZiAodGhpcy50cmlnZ2VyTGVhdmVBbmltYXRpb24oZWxlbWVudCwgY29udGV4dCwgdHJ1ZSkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8vIGZpbmQgdGhlIHBsYXllciB0aGF0IGlzIGFuaW1hdGluZyBhbmQgbWFrZSBzdXJlIHRoYXQgdGhlCiAgICAgICAgICAgIC8vIHJlbW92YWwgaXMgZGVsYXllZCB1bnRpbCB0aGF0IHBsYXllciBoYXMgY29tcGxldGVkCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbnRhaW5zUG90ZW50aWFsUGFyZW50VHJhbnNpdGlvbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAoZW5naW5lLnRvdGFsQW5pbWF0aW9ucykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBsYXllcnMgPSBlbmdpbmUucGxheWVycy5sZW5ndGggPyBlbmdpbmUucGxheWVyc0J5UXVlcmllZEVsZW1lbnQuZ2V0KGVsZW1lbnQpIDogW107CiAgICAgICAgICAgICAgICAvLyB3aGVuIHRoaXMgYGlmIHN0YXRlbWVudGAgZG9lcyBub3QgY29udGludWUgZm9yd2FyZCBpdCBtZWFucyB0aGF0CiAgICAgICAgICAgICAgICAvLyBhIHByZXZpb3VzIGFuaW1hdGlvbiBxdWVyeSBoYXMgc2VsZWN0ZWQgdGhlIGN1cnJlbnQgZWxlbWVudCBhbmQKICAgICAgICAgICAgICAgIC8vIGlzIGFuaW1hdGluZyBpdC4gSW4gdGhpcyBzaXR1YXRpb24gd2FudCB0byBjb250aW51ZSBmb3J3YXJkcyBhbmQKICAgICAgICAgICAgICAgIC8vIGFsbG93IHRoZSBlbGVtZW50IHRvIGJlIHF1ZXVlZCB1cCBmb3IgYW5pbWF0aW9uIGxhdGVyLgogICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRQbGF5ZXJzICYmIGN1cnJlbnRQbGF5ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zUG90ZW50aWFsUGFyZW50VHJhbnNpdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudCA9IHBhcmVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHJpZ2dlcnMgPSBlbmdpbmUuc3RhdGVzQnlFbGVtZW50LmdldChwYXJlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJpZ2dlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zUG90ZW50aWFsUGFyZW50VHJhbnNpdGlvbiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBhdCB0aGlzIHN0YWdlIHdlIGtub3cgdGhhdCB0aGUgZWxlbWVudCB3aWxsIGVpdGhlciBnZXQgcmVtb3ZlZAogICAgICAgICAgICAvLyBkdXJpbmcgZmx1c2ggb3Igd2lsbCBiZSBwaWNrZWQgdXAgYnkgYSBwYXJlbnQgcXVlcnkuIEVpdGhlciB3YXkKICAgICAgICAgICAgLy8gd2UgbmVlZCB0byBmaXJlIHRoZSBsaXN0ZW5lcnMgZm9yIHRoaXMgZWxlbWVudCB3aGVuIGl0IERPRVMgZ2V0CiAgICAgICAgICAgIC8vIHJlbW92ZWQgKG9uY2UgdGhlIHF1ZXJ5IHBhcmVudCBhbmltYXRpb24gaXMgZG9uZSBvciBhZnRlciBmbHVzaCkKICAgICAgICAgICAgdGhpcy5wcmVwYXJlTGVhdmVBbmltYXRpb25MaXN0ZW5lcnMoZWxlbWVudCk7CiAgICAgICAgICAgIC8vIHdoZXRoZXIgb3Igbm90IGEgcGFyZW50IGhhcyBhbiBhbmltYXRpb24gd2UgbmVlZCB0byBkZWxheSB0aGUgZGVmZXJyYWwgb2YgdGhlIGxlYXZlCiAgICAgICAgICAgIC8vIG9wZXJhdGlvbiB1bnRpbCB3ZSBoYXZlIG1vcmUgaW5mb3JtYXRpb24gKHdoaWNoIHdlIGRvIGFmdGVyIGZsdXNoKCkgaGFzIGJlZW4gY2FsbGVkKQogICAgICAgICAgICBpZiAoY29udGFpbnNQb3RlbnRpYWxQYXJlbnRUcmFuc2l0aW9uKSB7CiAgICAgICAgICAgICAgICBlbmdpbmUubWFya0VsZW1lbnRBc1JlbW92ZWQodGhpcy5pZCwgZWxlbWVudCwgZmFsc2UsIGNvbnRleHQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVtb3ZhbEZsYWcgPSBlbGVtZW50W1JFTU9WQUxfRkxBR107CiAgICAgICAgICAgICAgICBpZiAoIXJlbW92YWxGbGFnIHx8IHJlbW92YWxGbGFnID09PSBOVUxMX1JFTU9WQUxfU1RBVEUpIHsKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkbyB0aGlzIGFmdGVyIHRoZSBmbHVzaCBoYXMgb2NjdXJyZWQgc3VjaAogICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIGNhbGxiYWNrcyBjYW4gYmUgZmlyZWQKICAgICAgICAgICAgICAgICAgICBlbmdpbmUuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmNsZWFyRWxlbWVudENhY2hlKGVsZW1lbnQpKSk7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lLmRlc3Ryb3lJbm5lckFuaW1hdGlvbnMoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgZW5naW5lLl9vblJlbW92YWxDb21wbGV0ZShlbGVtZW50LCBjb250ZXh0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW5zZXJ0Tm9kZShlbGVtZW50LCBwYXJlbnQpIHsKICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgdGhpcy5faG9zdENsYXNzTmFtZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWljcm90YXNrSWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYWluUXVldWVkVHJhbnNpdGlvbnMobWljcm90YXNrSWQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fcXVldWUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGVudHJ5LnBsYXllcjsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIuZGVzdHJveWVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbnRyeS5lbGVtZW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGlzdGVuZXJzID0gdGhpcy5fZWxlbWVudExpc3RlbmVycy5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChsaXN0ZW5lcikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAobGlzdGVuZXIubmFtZSA9PSBlbnRyeS50cmlnZ2VyTmFtZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZUV2ZW50ID0gbWFrZUFuaW1hdGlvbkV2ZW50KGVsZW1lbnQsIGVudHJ5LnRyaWdnZXJOYW1lLCBlbnRyeS5mcm9tU3RhdGUudmFsdWUsIGVudHJ5LnRvU3RhdGUudmFsdWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChiYXNlRXZlbnQpKSlbJ19kYXRhJ10gPSBtaWNyb3Rhc2tJZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Rlbk9uUGxheWVyKGVudHJ5LnBsYXllciwgbGlzdGVuZXIucGhhc2UsIGJhc2VFdmVudCwgbGlzdGVuZXIuY2FsbGJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBsYXllci5tYXJrZWRGb3JEZXN0cm95KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW5naW5lLmFmdGVyRmx1c2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgd2UgY2FuIGRlc3Ryb3kgdGhlIGVsZW1lbnQgcHJvcGVybHkgc2luY2UgdGhlIGV2ZW50IGxpc3RlbmVycyBoYXZlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gYm91bmQgdG8gdGhlIHBsYXllcgogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9ucy5wdXNoKGVudHJ5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl9xdWV1ZSA9IFtdOwogICAgICAgICAgICByZXR1cm4gaW5zdHJ1Y3Rpb25zLnNvcnQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGEKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYSwgYikgPT4gewogICAgICAgICAgICAgICAgLy8gaWYgZGVwQ291bnQgPT0gMCB0aGVtIG1vdmUgdG8gZnJvbnQKICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBpZiBhIGNvbnRhaW5zIGIgdGhlbiBtb3ZlIGJhY2sKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGQwID0gYS50cmFuc2l0aW9uLmFzdC5kZXBDb3VudDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGQxID0gYi50cmFuc2l0aW9uLmFzdC5kZXBDb3VudDsKICAgICAgICAgICAgICAgIGlmIChkMCA9PSAwIHx8IGQxID09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZDAgLSBkMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbmdpbmUuZHJpdmVyLmNvbnRhaW5zRWxlbWVudChhLmVsZW1lbnQsIGIuZWxlbWVudCkgPyAxIDogLTE7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KGNvbnRleHQpIHsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHAgPT4gcC5kZXN0cm95KCkpKTsKICAgICAgICAgICAgdGhpcy5fc2lnbmFsUmVtb3ZhbEZvcklubmVyVHJpZ2dlcnModGhpcy5ob3N0RWxlbWVudCwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZWxlbWVudENvbnRhaW5zRGF0YShlbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbnRhaW5zRGF0YSA9IGZhbHNlOwogICAgICAgICAgICBpZiAodGhpcy5fZWxlbWVudExpc3RlbmVycy5oYXMoZWxlbWVudCkpCiAgICAgICAgICAgICAgICBjb250YWluc0RhdGEgPSB0cnVlOwogICAgICAgICAgICBjb250YWluc0RhdGEgPQogICAgICAgICAgICAgICAgKHRoaXMuX3F1ZXVlLmZpbmQoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbnRyeQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZW50cnkgPT4gZW50cnkuZWxlbWVudCA9PT0gZWxlbWVudCkpID8gdHJ1ZSA6IGZhbHNlKSB8fCBjb250YWluc0RhdGE7CiAgICAgICAgICAgIHJldHVybiBjb250YWluc0RhdGE7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBib2R5Tm9kZQogICAgICAgICAqIEBwYXJhbSB7P30gZHJpdmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfbm9ybWFsaXplcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGJvZHlOb2RlLCBkcml2ZXIsIF9ub3JtYWxpemVyKSB7CiAgICAgICAgICAgIHRoaXMuYm9keU5vZGUgPSBib2R5Tm9kZTsKICAgICAgICAgICAgdGhpcy5kcml2ZXIgPSBkcml2ZXI7CiAgICAgICAgICAgIHRoaXMuX25vcm1hbGl6ZXIgPSBfbm9ybWFsaXplcjsKICAgICAgICAgICAgdGhpcy5wbGF5ZXJzID0gW107CiAgICAgICAgICAgIHRoaXMubmV3SG9zdEVsZW1lbnRzID0gbmV3IE1hcCgpOwogICAgICAgICAgICB0aGlzLnBsYXllcnNCeUVsZW1lbnQgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVzQnlFbGVtZW50ID0gbmV3IE1hcCgpOwogICAgICAgICAgICB0aGlzLmRpc2FibGVkTm9kZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIHRoaXMudG90YWxBbmltYXRpb25zID0gMDsKICAgICAgICAgICAgdGhpcy50b3RhbFF1ZXVlZFBsYXllcnMgPSAwOwogICAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VMb29rdXAgPSB7fTsKICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlTGlzdCA9IFtdOwogICAgICAgICAgICB0aGlzLl9mbHVzaEZucyA9IFtdOwogICAgICAgICAgICB0aGlzLl93aGVuUXVpZXRGbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5uYW1lc3BhY2VzQnlIb3N0RWxlbWVudCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzID0gW107CiAgICAgICAgICAgIHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cyA9IFtdOwogICAgICAgICAgICAvLyB0aGlzIG1ldGhvZCBpcyBkZXNpZ25lZCB0byBiZSBvdmVycmlkZGVuIGJ5IHRoZSBjb2RlIHRoYXQgdXNlcyB0aGlzIGVuZ2luZQogICAgICAgICAgICB0aGlzLm9uUmVtb3ZhbENvbXBsZXRlID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZWxlbWVudCwgY29udGV4dCkgPT4geyB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uUmVtb3ZhbENvbXBsZXRlKGVsZW1lbnQsIGNvbnRleHQpIHsKICAgICAgICAgICAgdGhpcy5vblJlbW92YWxDb21wbGV0ZShlbGVtZW50LCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcXVldWVkUGxheWVycygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbGF5ZXJzID0gW107CiAgICAgICAgICAgIHRoaXMuX25hbWVzcGFjZUxpc3QuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5zID0+IHsKICAgICAgICAgICAgICAgIG5zLnBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLnF1ZXVlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAgICAgKiBAcGFyYW0gez99IGhvc3RFbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVOYW1lc3BhY2UobmFtZXNwYWNlSWQsIGhvc3RFbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnMgPSBuZXcgQW5pbWF0aW9uVHJhbnNpdGlvbk5hbWVzcGFjZShuYW1lc3BhY2VJZCwgaG9zdEVsZW1lbnQsIHRoaXMpOwogICAgICAgICAgICBpZiAoaG9zdEVsZW1lbnQucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5fYmFsYW5jZU5hbWVzcGFjZUxpc3QobnMsIGhvc3RFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIGRlZmVyIHRoaXMgbGF0ZXIgdW50aWwgZmx1c2ggZHVyaW5nIHdoZW4gdGhlIGhvc3QgZWxlbWVudCBoYXMKICAgICAgICAgICAgICAgIC8vIGJlZW4gaW5zZXJ0ZWQgc28gdGhhdCB3ZSBrbm93IGV4YWN0bHkgd2hlcmUgdG8gcGxhY2UgaXQgaW4KICAgICAgICAgICAgICAgIC8vIHRoZSBuYW1lc3BhY2UgbGlzdAogICAgICAgICAgICAgICAgdGhpcy5uZXdIb3N0RWxlbWVudHMuc2V0KGhvc3RFbGVtZW50LCBucyk7CiAgICAgICAgICAgICAgICAvLyBnaXZlbiB0aGF0IHRoaXMgaG9zdCBlbGVtZW50IGlzIGFwYXJ0IG9mIHRoZSBhbmltYXRpb24gY29kZSwgaXQKICAgICAgICAgICAgICAgIC8vIG1heSBvciBtYXkgbm90IGJlIGluc2VydGVkIGJ5IGEgcGFyZW50IG5vZGUgdGhhdCBpcyBhbiBvZiBhbgogICAgICAgICAgICAgICAgLy8gYW5pbWF0aW9uIHJlbmRlcmVyIHR5cGUuIElmIHRoaXMgaGFwcGVucyB0aGVuIHdlIGNhbiBzdGlsbCBoYXZlCiAgICAgICAgICAgICAgICAvLyBhY2Nlc3MgdG8gdGhpcyBpdGVtIHdoZW4gd2UgcXVlcnkgZm9yIDplbnRlciBub2Rlcy4gSWYgdGhlIHBhcmVudAogICAgICAgICAgICAgICAgLy8gaXMgYSByZW5kZXJlciB0aGVuIHRoZSBzZXQgZGF0YS1zdHJ1Y3R1cmUgd2lsbCBub3JtYWxpemUgdGhlIGVudHJ5CiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3RFbnRlckVsZW1lbnQoaG9zdEVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYW1lc3BhY2VMb29rdXBbbmFtZXNwYWNlSWRdID0gbnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBucwogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9iYWxhbmNlTmFtZXNwYWNlTGlzdChucywgaG9zdEVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaW1pdCA9IHRoaXMuX25hbWVzcGFjZUxpc3QubGVuZ3RoIC0gMTsKICAgICAgICAgICAgaWYgKGxpbWl0ID49IDApIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBmb3VuZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IGxpbWl0OyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXh0TmFtZXNwYWNlID0gdGhpcy5fbmFtZXNwYWNlTGlzdFtpXTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIuY29udGFpbnNFbGVtZW50KG5leHROYW1lc3BhY2UuaG9zdEVsZW1lbnQsIGhvc3RFbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VMaXN0LnNwbGljZShpICsgMSwgMCwgbnMpOwogICAgICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VMaXN0LnNwbGljZSgwLCAwLCBucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uYW1lc3BhY2VMaXN0LnB1c2gobnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlc0J5SG9zdEVsZW1lbnQuc2V0KGhvc3RFbGVtZW50LCBucyk7CiAgICAgICAgICAgIHJldHVybiBuczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyKG5hbWVzcGFjZUlkLCBob3N0RWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBucyA9IHRoaXMuX25hbWVzcGFjZUxvb2t1cFtuYW1lc3BhY2VJZF07CiAgICAgICAgICAgIGlmICghbnMpIHsKICAgICAgICAgICAgICAgIG5zID0gdGhpcy5jcmVhdGVOYW1lc3BhY2UobmFtZXNwYWNlSWQsIGhvc3RFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlSWQKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IHRyaWdnZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyVHJpZ2dlcihuYW1lc3BhY2VJZCwgbmFtZSwgdHJpZ2dlcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBucyA9IHRoaXMuX25hbWVzcGFjZUxvb2t1cFtuYW1lc3BhY2VJZF07CiAgICAgICAgICAgIGlmIChucyAmJiBucy5yZWdpc3RlcihuYW1lLCB0cmlnZ2VyKSkgewogICAgICAgICAgICAgICAgdGhpcy50b3RhbEFuaW1hdGlvbnMrKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KG5hbWVzcGFjZUlkLCBjb250ZXh0KSB7CiAgICAgICAgICAgIGlmICghbmFtZXNwYWNlSWQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLl9mZXRjaE5hbWVzcGFjZShuYW1lc3BhY2VJZCk7CiAgICAgICAgICAgIHRoaXMuYWZ0ZXJGbHVzaCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50LmRlbGV0ZShucy5ob3N0RWxlbWVudCk7CiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5fbmFtZXNwYWNlTG9va3VwW25hbWVzcGFjZUlkXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGhpcy5fbmFtZXNwYWNlTGlzdC5pbmRleE9mKG5zKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbmFtZXNwYWNlTGlzdC5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuYWZ0ZXJGbHVzaEFuaW1hdGlvbnNEb25lKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IG5zLmRlc3Ryb3koY29udGV4dCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmV0Y2hOYW1lc3BhY2UoaWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWVzcGFjZUxvb2t1cFtpZF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hOYW1lc3BhY2VzQnlFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gbm9ybWFsbHkgdGhlcmUgc2hvdWxkIG9ubHkgYmUgb25lIG5hbWVzcGFjZSBwZXIgZWxlbWVudCwgaG93ZXZlcgogICAgICAgICAgICAvLyBpZiBAdHJpZ2dlcnMgYXJlIHBsYWNlZCBvbiBib3RoIHRoZSBjb21wb25lbnQgZWxlbWVudCBhbmQgdGhlbgogICAgICAgICAgICAvLyBpdHMgaG9zdCBlbGVtZW50ICh3aXRoaW4gdGhlIGNvbXBvbmVudCBjb2RlKSB0aGVuIHRoZXJlIHdpbGwgYmUKICAgICAgICAgICAgLy8gdHdvIG5hbWVzcGFjZXMgcmV0dXJuZWQuIFdlIHVzZSBhIHNldCBoZXJlIHRvIHNpbXBseSB0aGUgZGVkdXBlCiAgICAgICAgICAgIC8vIG9mIG5hbWVzcGFjZXMgaW5jYXNlIHRoZXJlIGFyZSBtdWx0aXBsZSB0cmlnZ2VycyBib3RoIHRoZSBlbG0gYW5kIGhvc3QKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYW1lc3BhY2VzID0gbmV3IFNldCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRTdGF0ZXMgPSB0aGlzLnN0YXRlc0J5RWxlbWVudC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChlbGVtZW50U3RhdGVzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBrZXlzID0gT2JqZWN0LmtleXMoZWxlbWVudFN0YXRlcyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnNJZCA9IGVsZW1lbnRTdGF0ZXNba2V5c1tpXV0ubmFtZXNwYWNlSWQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5zSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBucyA9IHRoaXMuX2ZldGNoTmFtZXNwYWNlKG5zSWQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuYWRkKG5zKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmFtZXNwYWNlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXIobmFtZXNwYWNlSWQsIGVsZW1lbnQsIG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIGlmIChpc0VsZW1lbnROb2RlKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBucyA9IHRoaXMuX2ZldGNoTmFtZXNwYWNlKG5hbWVzcGFjZUlkKTsKICAgICAgICAgICAgICAgIGlmIChucykgewogICAgICAgICAgICAgICAgICAgIG5zLnRyaWdnZXIoZWxlbWVudCwgbmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBpbnNlcnRCZWZvcmUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluc2VydE5vZGUobmFtZXNwYWNlSWQsIGVsZW1lbnQsIHBhcmVudCwgaW5zZXJ0QmVmb3JlKSB7CiAgICAgICAgICAgIGlmICghaXNFbGVtZW50Tm9kZShlbGVtZW50KSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB3aGVuIGFuIGVsZW1lbnQgaXMgcmVtb3ZlZCBhbmQgcmVpbnNlcnRlZCAobW92ZSBvcGVyYXRpb24pCiAgICAgICAgICAgIC8vIHdoZW4gdGhpcyBvY2N1cnMgd2UgZG8gbm90IHdhbnQgdG8gdXNlIHRoZSBlbGVtZW50IGZvciBkZWxldGlvbiBsYXRlcgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudFtSRU1PVkFMX0ZMQUddKSk7CiAgICAgICAgICAgIGlmIChkZXRhaWxzICYmIGRldGFpbHMuc2V0Rm9yUmVtb3ZhbCkgewogICAgICAgICAgICAgICAgZGV0YWlscy5zZXRGb3JSZW1vdmFsID0gZmFsc2U7CiAgICAgICAgICAgICAgICBkZXRhaWxzLnNldEZvck1vdmUgPSB0cnVlOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMuaW5kZXhPZihlbGVtZW50KTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gaW4gdGhlIGV2ZW50IHRoYXQgdGhlIG5hbWVzcGFjZUlkIGlzIGJsYW5rIHRoZW4gdGhlIGNhbGxlcgogICAgICAgICAgICAvLyBjb2RlIGRvZXMgbm90IGNvbnRhaW4gYW55IGFuaW1hdGlvbiBjb2RlIGluIGl0LCBidXQgaXQgaXMKICAgICAgICAgICAgLy8ganVzdCBiZWluZyBjYWxsZWQgc28gdGhhdCB0aGUgbm9kZSBpcyBtYXJrZWQgYXMgYmVpbmcgaW5zZXJ0ZWQKICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUlkKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBucyA9IHRoaXMuX2ZldGNoTmFtZXNwYWNlKG5hbWVzcGFjZUlkKTsKICAgICAgICAgICAgICAgIC8vIFRoaXMgaWYtc3RhdGVtZW50IGlzIGEgd29ya2Fyb3VuZCBmb3Igcm91dGVyIGlzc3VlICMyMTk0Ny4KICAgICAgICAgICAgICAgIC8vIFRoZSByb3V0ZXIgc29tZXRpbWVzIGhpdHMgYSByYWNlIGNvbmRpdGlvbiB3aGVyZSB3aGlsZSBhIHJvdXRlCiAgICAgICAgICAgICAgICAvLyBpcyBiZWluZyBpbnN0YW50aWF0ZWQgYSBuZXcgbmF2aWdhdGlvbiBhcnJpdmVzLCB0cmlnZ2VyaW5nIGxlYXZlCiAgICAgICAgICAgICAgICAvLyBhbmltYXRpb24gb2YgRE9NIHRoYXQgaGFzIG5vdCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLCB1bnRpbCB0aGlzCiAgICAgICAgICAgICAgICAvLyBpcyByZXNvbHZlZCwgd2UgbmVlZCB0byBoYW5kbGUgdGhlIHNjZW5hcmlvIHdoZW4gRE9NIGlzIG5vdCBpbiBhCiAgICAgICAgICAgICAgICAvLyBjb25zaXN0ZW50IHN0YXRlIGR1cmluZyB0aGUgYW5pbWF0aW9uLgogICAgICAgICAgICAgICAgaWYgKG5zKSB7CiAgICAgICAgICAgICAgICAgICAgbnMuaW5zZXJ0Tm9kZShlbGVtZW50LCBwYXJlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIG9ubHkgKmRpcmVjdGl2ZXMgYW5kIGhvc3QgZWxlbWVudHMgYXJlIGluc2VydGVkIGJlZm9yZQogICAgICAgICAgICBpZiAoaW5zZXJ0QmVmb3JlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3RFbnRlckVsZW1lbnQoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb2xsZWN0RW50ZXJFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hcmtFbGVtZW50QXNEaXNhYmxlZChlbGVtZW50LCB2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZE5vZGVzLmhhcyhlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZWROb2Rlcy5hZGQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgYWRkQ2xhc3MoZWxlbWVudCwgRElTQUJMRURfQ0xBU1NOQU1FKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLmRpc2FibGVkTm9kZXMuaGFzKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGVkTm9kZXMuZGVsZXRlKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgcmVtb3ZlQ2xhc3MoZWxlbWVudCwgRElTQUJMRURfQ0xBU1NOQU1FKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBpc0hvc3RFbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVOb2RlKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBpc0hvc3RFbGVtZW50LCBjb250ZXh0KSB7CiAgICAgICAgICAgIGlmIChpc0VsZW1lbnROb2RlKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBucyA9IG5hbWVzcGFjZUlkID8gdGhpcy5fZmV0Y2hOYW1lc3BhY2UobmFtZXNwYWNlSWQpIDogbnVsbDsKICAgICAgICAgICAgICAgIGlmIChucykgewogICAgICAgICAgICAgICAgICAgIG5zLnJlbW92ZU5vZGUoZWxlbWVudCwgY29udGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm1hcmtFbGVtZW50QXNSZW1vdmVkKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBmYWxzZSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoaXNIb3N0RWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBob3N0TlMgPSB0aGlzLm5hbWVzcGFjZXNCeUhvc3RFbGVtZW50LmdldChlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBpZiAoaG9zdE5TICYmIGhvc3ROUy5pZCAhPT0gbmFtZXNwYWNlSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaG9zdE5TLnJlbW92ZU5vZGUoZWxlbWVudCwgY29udGV4dCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fb25SZW1vdmFsQ29tcGxldGUoZWxlbWVudCwgY29udGV4dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IGhhc0FuaW1hdGlvbgogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hcmtFbGVtZW50QXNSZW1vdmVkKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBoYXNBbmltYXRpb24sIGNvbnRleHQpIHsKICAgICAgICAgICAgdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzLnB1c2goZWxlbWVudCk7CiAgICAgICAgICAgIGVsZW1lbnRbUkVNT1ZBTF9GTEFHXSA9CiAgICAgICAgICAgICAgICB7IG5hbWVzcGFjZUlkLCBzZXRGb3JSZW1vdmFsOiBjb250ZXh0LCBoYXNBbmltYXRpb24sIHJlbW92ZWRCZWZvcmVRdWVyaWVkOiBmYWxzZSB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBwaGFzZQogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxpc3RlbihuYW1lc3BhY2VJZCwgZWxlbWVudCwgbmFtZSwgcGhhc2UsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmIChpc0VsZW1lbnROb2RlKGVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hOYW1lc3BhY2UobmFtZXNwYWNlSWQpLmxpc3RlbihlbGVtZW50LCBuYW1lLCBwaGFzZSwgY2FsbGJhY2spOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgKiBAcGFyYW0gez99IHN1YlRpbWVsaW5lcwogICAgICAgICAqIEBwYXJhbSB7P30gZW50ZXJDbGFzc05hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGxlYXZlQ2xhc3NOYW1lCiAgICAgICAgICogQHBhcmFtIHs/PX0gc2tpcEJ1aWxkQXN0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYnVpbGRJbnN0cnVjdGlvbihlbnRyeSwgc3ViVGltZWxpbmVzLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIHNraXBCdWlsZEFzdCkgewogICAgICAgICAgICByZXR1cm4gZW50cnkudHJhbnNpdGlvbi5idWlsZCh0aGlzLmRyaXZlciwgZW50cnkuZWxlbWVudCwgZW50cnkuZnJvbVN0YXRlLnZhbHVlLCBlbnRyeS50b1N0YXRlLnZhbHVlLCBlbnRlckNsYXNzTmFtZSwgbGVhdmVDbGFzc05hbWUsIGVudHJ5LmZyb21TdGF0ZS5vcHRpb25zLCBlbnRyeS50b1N0YXRlLm9wdGlvbnMsIHN1YlRpbWVsaW5lcywgc2tpcEJ1aWxkQXN0KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250YWluZXJFbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95SW5uZXJBbmltYXRpb25zKGNvbnRhaW5lckVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZWxlbWVudHMgPSB0aGlzLmRyaXZlci5xdWVyeShjb250YWluZXJFbGVtZW50LCBOR19UUklHR0VSX1NFTEVDVE9SLCB0cnVlKTsKICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWxlbWVudCA9PiB0aGlzLmRlc3Ryb3lBY3RpdmVBbmltYXRpb25zRm9yRWxlbWVudChlbGVtZW50KSkpOwogICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudC5zaXplID09IDApCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIGVsZW1lbnRzID0gdGhpcy5kcml2ZXIucXVlcnkoY29udGFpbmVyRWxlbWVudCwgTkdfQU5JTUFUSU5HX1NFTEVDVE9SLCB0cnVlKTsKICAgICAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWxlbWVudCA9PiB0aGlzLmZpbmlzaEFjdGl2ZVF1ZXJpZWRBbmltYXRpb25PbkVsZW1lbnQoZWxlbWVudCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95QWN0aXZlQW5pbWF0aW9uc0ZvckVsZW1lbnQoZWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICBpZiAocGxheWVycykgewogICAgICAgICAgICAgICAgcGxheWVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpYWwgY2FzZSBmb3Igd2hlbiBhbiBlbGVtZW50IGlzIHNldCBmb3IgZGVzdHJ1Y3Rpb24sIGJ1dCBoYXNuJ3Qgc3RhcnRlZC4KICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIHNpdHVhdGlvbiB3ZSB3YW50IHRvIGRlbGF5IHRoZSBkZXN0cnVjdGlvbiB1bnRpbCB0aGUgZmx1c2ggb2NjdXJzCiAgICAgICAgICAgICAgICAgICAgLy8gc28gdGhhdCBhbnkgZXZlbnQgbGlzdGVuZXJzIGF0dGFjaGVkIHRvIHRoZSBwbGF5ZXIgYXJlIHRyaWdnZXJlZC4KICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLnF1ZXVlZCkgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIubWFya2VkRm9yRGVzdHJveSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmlzaEFjdGl2ZVF1ZXJpZWRBbmltYXRpb25PbkVsZW1lbnQoZWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXllcnMgPSB0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmdldChlbGVtZW50KTsKICAgICAgICAgICAgaWYgKHBsYXllcnMpIHsKICAgICAgICAgICAgICAgIHBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5maW5pc2goKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd2hlblJlbmRlcmluZ0RvbmUoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVzb2x2ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVzb2x2ZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvcHRpbWl6ZUdyb3VwUGxheWVyKHRoaXMucGxheWVycykub25Eb25lKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHJlc29sdmUoKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvY2Vzc0xlYXZlTm9kZShlbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGV0YWlscyA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50W1JFTU9WQUxfRkxBR10pKTsKICAgICAgICAgICAgaWYgKGRldGFpbHMgJiYgZGV0YWlscy5zZXRGb3JSZW1vdmFsKSB7CiAgICAgICAgICAgICAgICAvLyB0aGlzIHdpbGwgcHJldmVudCBpdCBmcm9tIHJlbW92aW5nIGl0IHR3aWNlCiAgICAgICAgICAgICAgICBlbGVtZW50W1JFTU9WQUxfRkxBR10gPSBOVUxMX1JFTU9WQUxfU1RBVEU7CiAgICAgICAgICAgICAgICBpZiAoZGV0YWlscy5uYW1lc3BhY2VJZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveUlubmVyQW5pbWF0aW9ucyhlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLl9mZXRjaE5hbWVzcGFjZShkZXRhaWxzLm5hbWVzcGFjZUlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbnMuY2xlYXJFbGVtZW50Q2FjaGUoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fb25SZW1vdmFsQ29tcGxldGUoZWxlbWVudCwgZGV0YWlscy5zZXRGb3JSZW1vdmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5kcml2ZXIubWF0Y2hlc0VsZW1lbnQoZWxlbWVudCwgRElTQUJMRURfU0VMRUNUT1IpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1hcmtFbGVtZW50QXNEaXNhYmxlZChlbGVtZW50LCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kcml2ZXIucXVlcnkoZWxlbWVudCwgRElTQUJMRURfU0VMRUNUT1IsIHRydWUpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5vZGUgPT4gewogICAgICAgICAgICAgICAgdGhpcy5tYXJrRWxlbWVudEFzRGlzYWJsZWQobm9kZSwgZmFsc2UpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IG1pY3JvdGFza0lkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmbHVzaChtaWNyb3Rhc2tJZCA9IC0xKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBsYXllcnMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMubmV3SG9zdEVsZW1lbnRzLnNpemUpIHsKICAgICAgICAgICAgICAgIHRoaXMubmV3SG9zdEVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBucwogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAobnMsIGVsZW1lbnQpID0+IHRoaXMuX2JhbGFuY2VOYW1lc3BhY2VMaXN0KG5zLCBlbGVtZW50KSkpOwogICAgICAgICAgICAgICAgdGhpcy5uZXdIb3N0RWxlbWVudHMuY2xlYXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy50b3RhbEFuaW1hdGlvbnMgJiYgdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxtID0gdGhpcy5jb2xsZWN0ZWRFbnRlckVsZW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIGFkZENsYXNzKGVsbSwgU1RBUl9DTEFTU05BTUUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9uYW1lc3BhY2VMaXN0Lmxlbmd0aCAmJgogICAgICAgICAgICAgICAgKHRoaXMudG90YWxRdWV1ZWRQbGF5ZXJzIHx8IHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGgpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwRm5zID0gW107CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHBsYXllcnMgPSB0aGlzLl9mbHVzaEFuaW1hdGlvbnMoY2xlYW51cEZucywgbWljcm90YXNrSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZmluYWxseSB7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBjbGVhbnVwRm5zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBGbnNbaV0oKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuY29sbGVjdGVkTGVhdmVFbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5jb2xsZWN0ZWRMZWF2ZUVsZW1lbnRzW2ldOwogICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xlYXZlTm9kZShlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnRvdGFsUXVldWVkUGxheWVycyA9IDA7CiAgICAgICAgICAgIHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGggPSAwOwogICAgICAgICAgICB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoID0gMDsKICAgICAgICAgICAgdGhpcy5fZmx1c2hGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgdGhpcy5fZmx1c2hGbnMgPSBbXTsKICAgICAgICAgICAgaWYgKHRoaXMuX3doZW5RdWlldEZucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8vIHdlIG1vdmUgdGhlc2Ugb3ZlciB0byBhIHZhcmlhYmxlIHNvIHRoYXQKICAgICAgICAgICAgICAgIC8vIGlmIGFueSBuZXcgY2FsbGJhY2tzIGFyZSByZWdpc3RlcmVkIGluIGFub3RoZXIKICAgICAgICAgICAgICAgIC8vIGZsdXNoIHRoZXkgZG8gbm90IHBvcHVsYXRlIHRoZSBleGlzdGluZyBzZXQKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHF1aWV0Rm5zID0gdGhpcy5fd2hlblF1aWV0Rm5zOwogICAgICAgICAgICAgICAgdGhpcy5fd2hlblF1aWV0Rm5zID0gW107CiAgICAgICAgICAgICAgICBpZiAocGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpbWl6ZUdyb3VwUGxheWVyKHBsYXllcnMpLm9uRG9uZSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHF1aWV0Rm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcXVpZXRGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXBvcnRFcnJvcihlcnJvcnMpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmFibGUgdG8gcHJvY2VzcyBhbmltYXRpb25zIGR1ZSB0byB0aGUgZm9sbG93aW5nIGZhaWxlZCB0cmlnZ2VyIHRyYW5zaXRpb25zXG4gJHtlcnJvcnMuam9pbignXG4nKX1gKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNsZWFudXBGbnMKICAgICAgICAgKiBAcGFyYW0gez99IG1pY3JvdGFza0lkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmx1c2hBbmltYXRpb25zKGNsZWFudXBGbnMsIG1pY3JvdGFza0lkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3ViVGltZWxpbmVzID0gbmV3IEVsZW1lbnRJbnN0cnVjdGlvbk1hcCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNraXBwZWRQbGF5ZXJzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2tpcHBlZFBsYXllcnNNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcXVldWVkSW5zdHJ1Y3Rpb25zID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcXVlcmllZEVsZW1lbnRzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbFByZVN0eWxlRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWxsUG9zdFN0eWxlRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlzYWJsZWRFbGVtZW50c1NldCA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlZE5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5vZGUgPT4gewogICAgICAgICAgICAgICAgZGlzYWJsZWRFbGVtZW50c1NldC5hZGQobm9kZSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBub2Rlc1RoYXRBcmVEaXNhYmxlZCA9IHRoaXMuZHJpdmVyLnF1ZXJ5KG5vZGUsIFFVRVVFRF9TRUxFQ1RPUiwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG5vZGVzVGhhdEFyZURpc2FibGVkLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRFbGVtZW50c1NldC5hZGQobm9kZXNUaGF0QXJlRGlzYWJsZWRbaV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm9keU5vZGUgPSB0aGlzLmJvZHlOb2RlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbFRyaWdnZXJFbGVtZW50cyA9IEFycmF5LmZyb20odGhpcy5zdGF0ZXNCeUVsZW1lbnQua2V5cygpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbnRlck5vZGVNYXAgPSBidWlsZFJvb3RNYXAoYWxsVHJpZ2dlckVsZW1lbnRzLCB0aGlzLmNvbGxlY3RlZEVudGVyRWxlbWVudHMpOwogICAgICAgICAgICAvLyB0aGlzIG11c3Qgb2NjdXIgYmVmb3JlIHRoZSBpbnN0cnVjdGlvbnMgYXJlIGJ1aWx0IGJlbG93IHN1Y2ggdGhhdAogICAgICAgICAgICAvLyB0aGUgOmVudGVyIHF1ZXJpZXMgbWF0Y2ggdGhlIGVsZW1lbnRzIChzaW5jZSB0aGUgdGltZWxpbmUgcXVlcmllcwogICAgICAgICAgICAvLyBhcmUgZmlyZWQgZHVyaW5nIGluc3RydWN0aW9uIGJ1aWxkaW5nKS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbnRlck5vZGVNYXBJZHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGkgPSAwOwogICAgICAgICAgICBlbnRlck5vZGVNYXAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZXMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobm9kZXMsIHJvb3QpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9IEVOVEVSX0NMQVNTTkFNRSArIGkrKzsKICAgICAgICAgICAgICAgIGVudGVyTm9kZU1hcElkcy5zZXQocm9vdCwgY2xhc3NOYW1lKTsKICAgICAgICAgICAgICAgIG5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBub2RlID0+IGFkZENsYXNzKG5vZGUsIGNsYXNzTmFtZSkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbExlYXZlTm9kZXMgPSBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZXJnZWRMZWF2ZU5vZGVzID0gbmV3IFNldCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxlYXZlTm9kZXNXaXRob3V0QW5pbWF0aW9ucyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmNvbGxlY3RlZExlYXZlRWxlbWVudHNbaV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnRbUkVNT1ZBTF9GTEFHXSkpOwogICAgICAgICAgICAgICAgaWYgKGRldGFpbHMgJiYgZGV0YWlscy5zZXRGb3JSZW1vdmFsKSB7CiAgICAgICAgICAgICAgICAgICAgYWxsTGVhdmVOb2Rlcy5wdXNoKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIG1lcmdlZExlYXZlTm9kZXMuYWRkKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzLmhhc0FuaW1hdGlvbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRyaXZlci5xdWVyeShlbGVtZW50LCBTVEFSX1NFTEVDVE9SLCB0cnVlKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbG0KICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGVsbSA9PiBtZXJnZWRMZWF2ZU5vZGVzLmFkZChlbG0pKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBsZWF2ZU5vZGVzV2l0aG91dEFuaW1hdGlvbnMuYWRkKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxlYXZlTm9kZU1hcElkcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsZWF2ZU5vZGVNYXAgPSBidWlsZFJvb3RNYXAoYWxsVHJpZ2dlckVsZW1lbnRzLCBBcnJheS5mcm9tKG1lcmdlZExlYXZlTm9kZXMpKTsKICAgICAgICAgICAgbGVhdmVOb2RlTWFwLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5vZGVzCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5vZGVzLCByb290KSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSBMRUFWRV9DTEFTU05BTUUgKyBpKys7CiAgICAgICAgICAgICAgICBsZWF2ZU5vZGVNYXBJZHMuc2V0KHJvb3QsIGNsYXNzTmFtZSk7CiAgICAgICAgICAgICAgICBub2Rlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgbm9kZSA9PiBhZGRDbGFzcyhub2RlLCBjbGFzc05hbWUpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgY2xlYW51cEZucy5wdXNoKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGVudGVyTm9kZU1hcC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZXMKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKG5vZGVzLCByb290KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChlbnRlck5vZGVNYXBJZHMuZ2V0KHJvb3QpKSk7CiAgICAgICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBub2RlID0+IHJlbW92ZUNsYXNzKG5vZGUsIGNsYXNzTmFtZSkpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGxlYXZlTm9kZU1hcC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZXMKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKG5vZGVzLCByb290KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNsYXNzTmFtZSA9ICgvKiogQHR5cGUgez99ICovIChsZWF2ZU5vZGVNYXBJZHMuZ2V0KHJvb3QpKSk7CiAgICAgICAgICAgICAgICAgICAgbm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBub2RlID0+IHJlbW92ZUNsYXNzKG5vZGUsIGNsYXNzTmFtZSkpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGFsbExlYXZlTm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMucHJvY2Vzc0xlYXZlTm9kZShlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbFBsYXllcnMgPSBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlcnJvbmVvdXNUcmFuc2l0aW9ucyA9IFtdOwogICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fbmFtZXNwYWNlTGlzdC5sZW5ndGggLSAxOyBpID49IDA7IGktLSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbnMgPSB0aGlzLl9uYW1lc3BhY2VMaXN0W2ldOwogICAgICAgICAgICAgICAgbnMuZHJhaW5RdWV1ZWRUcmFuc2l0aW9ucyhtaWNyb3Rhc2tJZCkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlbnRyeSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllciA9IGVudHJ5LnBsYXllcjsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGVudHJ5LmVsZW1lbnQ7CiAgICAgICAgICAgICAgICAgICAgYWxsUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29sbGVjdGVkRW50ZXJFbGVtZW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnRbUkVNT1ZBTF9GTEFHXSkpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3ZlIGFuaW1hdGlvbnMgYXJlIGN1cnJlbnRseSBub3Qgc3VwcG9ydGVkLi4uCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRhaWxzICYmIGRldGFpbHMuc2V0Rm9yTW92ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgbm9kZUlzT3JwaGFuZWQgPSAhYm9keU5vZGUgfHwgIXRoaXMuZHJpdmVyLmNvbnRhaW5zRWxlbWVudChib2R5Tm9kZSwgZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxlYXZlQ2xhc3NOYW1lID0gKC8qKiBAdHlwZSB7P30gKi8gKGxlYXZlTm9kZU1hcElkcy5nZXQoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW50ZXJDbGFzc05hbWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZW50ZXJOb2RlTWFwSWRzLmdldChlbGVtZW50KSkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnN0cnVjdGlvbiA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9idWlsZEluc3RydWN0aW9uKGVudHJ5LCBzdWJUaW1lbGluZXMsIGVudGVyQ2xhc3NOYW1lLCBsZWF2ZUNsYXNzTmFtZSwgbm9kZUlzT3JwaGFuZWQpKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGluc3RydWN0aW9uLmVycm9ycyAmJiBpbnN0cnVjdGlvbi5lcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9uZW91c1RyYW5zaXRpb25zLnB1c2goaW5zdHJ1Y3Rpb24pOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIGV2ZW4gdGhvdWdoIHRoZSBlbGVtZW50IG1heSBub3QgYmUgYXBhcnQgb2YgdGhlIERPTSwgaXQgbWF5CiAgICAgICAgICAgICAgICAgICAgLy8gc3RpbGwgYmUgYWRkZWQgYXQgYSBsYXRlciBwb2ludCAoZHVlIHRvIHRoZSBtZWNoYW5pY3Mgb2YgY29udGVudAogICAgICAgICAgICAgICAgICAgIC8vIHByb2plY3Rpb24gYW5kL29yIGR5bmFtaWMgY29tcG9uZW50IGluc2VydGlvbikgdGhlcmVmb3JlIGl0J3MKICAgICAgICAgICAgICAgICAgICAvLyBpbXBvcnRhbnQgd2Ugc3RpbGwgc3R5bGUgdGhlIGVsZW1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGVJc09ycGhhbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5vblN0YXJ0KCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IGVyYXNlU3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLmZyb21TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5vbkRlc3Ryb3koKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gc2V0U3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLnRvU3R5bGVzKSkpOwogICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSB1bm1hdGNoZWQgdHJhbnNpdGlvbiBpcyBxdWV1ZWQgdG8gZ28gdGhlbiBpdCBTSE9VTEQgTk9UIHJlbmRlcgogICAgICAgICAgICAgICAgICAgIC8vIGFuIGFuaW1hdGlvbiBhbmQgY2FuY2VsIHRoZSBwcmV2aW91c2x5IHJ1bm5pbmcgYW5pbWF0aW9ucy4KICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnkuaXNGYWxsYmFja1RyYW5zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uU3RhcnQoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gZXJhc2VTdHlsZXMoZWxlbWVudCwgaW5zdHJ1Y3Rpb24uZnJvbVN0eWxlcykpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRTdHlsZXMoZWxlbWVudCwgaW5zdHJ1Y3Rpb24udG9TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNraXBwZWRQbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgaWYgYSBwYXJlbnQgYW5pbWF0aW9uIHVzZXMgdGhpcyBhbmltYXRpb24gYXMgYSBzdWIgdHJpZ2dlcgogICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gaXQgd2lsbCBpbnN0cnVjdCB0aGUgdGltZWxpbmUgYnVpbGRlciB0byBub3QgYWRkIGEgcGxheWVyIGRlbGF5LCBidXQKICAgICAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIHN0cmV0Y2ggdGhlIGZpcnN0IGtleWZyYW1lIGdhcCB1cCB1bnRpbCB0aGUgYW5pbWF0aW9uIHN0YXJ0cy4gVGhlCiAgICAgICAgICAgICAgICAgICAgLy8gcmVhc29uIHRoaXMgaXMgaW1wb3J0YW50IGlzIHRvIHByZXZlbnQgZXh0cmEgaW5pdGlhbGl6YXRpb24gc3R5bGVzIGZyb20gYmVpbmcKICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZCBieSB0aGUgdXNlciBpbiB0aGUgYW5pbWF0aW9uLgogICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLnRpbWVsaW5lcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHRsCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICB0bCA9PiB0bC5zdHJldGNoU3RhcnRpbmdLZXlmcmFtZSA9IHRydWUpKTsKICAgICAgICAgICAgICAgICAgICBzdWJUaW1lbGluZXMuYXBwZW5kKGVsZW1lbnQsIGluc3RydWN0aW9uLnRpbWVsaW5lcyk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHR1cGxlID0geyBpbnN0cnVjdGlvbiwgcGxheWVyLCBlbGVtZW50IH07CiAgICAgICAgICAgICAgICAgICAgcXVldWVkSW5zdHJ1Y3Rpb25zLnB1c2godHVwbGUpOwogICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLnF1ZXJpZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGVsZW1lbnQgPT4gZ2V0T3JTZXRBc0luTWFwKHF1ZXJpZWRFbGVtZW50cywgZWxlbWVudCwgW10pLnB1c2gocGxheWVyKSkpOwogICAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uLnByZVN0eWxlUHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdHJpbmdNYXAKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChzdHJpbmdNYXAsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHN0cmluZ01hcCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcm9wcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzZXRWYWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYWxsUHJlU3R5bGVFbGVtZW50cy5nZXQoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2V0VmFsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsUHJlU3R5bGVFbGVtZW50cy5zZXQoZWxlbWVudCwgc2V0VmFsID0gbmV3IFNldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wID0+IHNldFZhbC5hZGQocHJvcCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbi5wb3N0U3R5bGVQcm9wcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0cmluZ01hcAogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKHN0cmluZ01hcCwgZWxlbWVudCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHByb3BzID0gT2JqZWN0LmtleXMoc3RyaW5nTWFwKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgc2V0VmFsID0gKC8qKiBAdHlwZSB7P30gKi8gKGFsbFBvc3RTdHlsZUVsZW1lbnRzLmdldChlbGVtZW50KSkpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNldFZhbCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsUG9zdFN0eWxlRWxlbWVudHMuc2V0KGVsZW1lbnQsIHNldFZhbCA9IG5ldyBTZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcHJvcCA9PiBzZXRWYWwuYWRkKHByb3ApKSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlcnJvbmVvdXNUcmFuc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVycm9ycyA9IFtdOwogICAgICAgICAgICAgICAgZXJyb25lb3VzVHJhbnNpdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluc3RydWN0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbnN0cnVjdGlvbiA9PiB7CiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLnB1c2goYEAke2luc3RydWN0aW9uLnRyaWdnZXJOYW1lfSBoYXMgZmFpbGVkIGR1ZSB0bzpcbmApOwogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChpbnN0cnVjdGlvbi5lcnJvcnMpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBlcnJvciA9PiBlcnJvcnMucHVzaChgLSAke2Vycm9yfVxuYCkpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIGFsbFBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcGxheWVyID0+IHBsYXllci5kZXN0cm95KCkpKTsKICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0RXJyb3IoZXJyb3JzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbFByZXZpb3VzUGxheWVyc01hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLy8gdGhpcyBtYXAgd29ya3MgdG8gdGVsbCB3aGljaCBlbGVtZW50IGluIHRoZSBET00gdHJlZSBpcyBjb250YWluZWQgYnkKICAgICAgICAgICAgLy8gd2hpY2ggYW5pbWF0aW9uLiBGdXJ0aGVyIGRvd24gYmVsb3cgdGhpcyBtYXAgd2lsbCBnZXQgcG9wdWxhdGVkIG9uY2UKICAgICAgICAgICAgLy8gdGhlIHBsYXllcnMgYXJlIGJ1aWx0IGFuZCBpbiBkb2luZyBzbyBpdCBjYW4gZWZmaWNpZW50bHkgZmlndXJlIG91dAogICAgICAgICAgICAvLyBpZiBhIHN1YiBwbGF5ZXIgaXMgc2tpcHBlZCBkdWUgdG8gYSBwYXJlbnQgcGxheWVyIGhhdmluZyBwcmlvcml0eS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmltYXRpb25FbGVtZW50TWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICBxdWV1ZWRJbnN0cnVjdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbnRyeS5lbGVtZW50OwogICAgICAgICAgICAgICAgaWYgKHN1YlRpbWVsaW5lcy5oYXMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25FbGVtZW50TWFwLnNldChlbGVtZW50LCBlbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9iZWZvcmVBbmltYXRpb25CdWlsZChlbnRyeS5wbGF5ZXIubmFtZXNwYWNlSWQsIGVudHJ5Lmluc3RydWN0aW9uLCBhbGxQcmV2aW91c1BsYXllcnNNYXApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHNraXBwZWRQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwbGF5ZXIuZWxlbWVudDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGxheWVycyA9IHRoaXMuX2dldFByZXZpb3VzUGxheWVycyhlbGVtZW50LCBmYWxzZSwgcGxheWVyLm5hbWVzcGFjZUlkLCBwbGF5ZXIudHJpZ2dlck5hbWUsIG51bGwpOwogICAgICAgICAgICAgICAgcHJldmlvdXNQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2UGxheWVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwcmV2UGxheWVyID0+IHsKICAgICAgICAgICAgICAgICAgICBnZXRPclNldEFzSW5NYXAoYWxsUHJldmlvdXNQbGF5ZXJzTWFwLCBlbGVtZW50LCBbXSkucHVzaChwcmV2UGxheWVyKTsKICAgICAgICAgICAgICAgICAgICBwcmV2UGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyB0aGlzIGlzIGEgc3BlY2lhbCBjYXNlIGZvciBub2RlcyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCAoZWl0aGVyIGJ5KQogICAgICAgICAgICAvLyBoYXZpbmcgdGhlaXIgb3duIGxlYXZlIGFuaW1hdGlvbnMgb3IgYnkgYmVpbmcgcXVlcmllZCBpbiBhIGNvbnRhaW5lcgogICAgICAgICAgICAvLyB0aGF0IHdpbGwgYmUgcmVtb3ZlZCBvbmNlIGEgcGFyZW50IGFuaW1hdGlvbiBpcyBjb21wbGV0ZS4gVGhlIGlkZWEKICAgICAgICAgICAgLy8gaGVyZSBpcyB0aGF0ICogc3R5bGVzIG11c3QgYmUgaWRlbnRpY2FsIHRvICEgc3R5bGVzIGJlY2F1c2Ugb2YKICAgICAgICAgICAgLy8gYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgKCogaXMgYWxzbyBmaWxsZWQgaW4gYnkgZGVmYXVsdCBpbiBtYW55IHBsYWNlcykuCiAgICAgICAgICAgIC8vIE90aGVyd2lzZSAqIHN0eWxlcyB3aWxsIHJldHVybiBhbiBlbXB0eSB2YWx1ZSBvciBhdXRvIHNpbmNlIHRoZSBlbGVtZW50CiAgICAgICAgICAgIC8vIHRoYXQgaXMgYmVpbmcgZ2V0Q29tcHV0ZWRTdHlsZSdkIHdpbGwgbm90IGJlIHZpc2libGUgKHNpbmNlICogPSBkZXN0aW5hdGlvbikKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXBsYWNlTm9kZXMgPSBhbGxMZWF2ZU5vZGVzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVwbGFjZVBvc3RTdHlsZXNBc1ByZShub2RlLCBhbGxQcmVTdHlsZUVsZW1lbnRzLCBhbGxQb3N0U3R5bGVFbGVtZW50cyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gUE9TVCBTVEFHRTogZmlsbCB0aGUgKiBzdHlsZXMKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3N0U3R5bGVzTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbExlYXZlUXVlcmllZE5vZGVzID0gY2xvYWtBbmRDb21wdXRlU3R5bGVzKHBvc3RTdHlsZXNNYXAsIHRoaXMuZHJpdmVyLCBsZWF2ZU5vZGVzV2l0aG91dEFuaW1hdGlvbnMsIGFsbFBvc3RTdHlsZUVsZW1lbnRzLCBBVVRPX1NUWUxFKTsKICAgICAgICAgICAgYWxsTGVhdmVRdWVyaWVkTm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocmVwbGFjZVBvc3RTdHlsZXNBc1ByZShub2RlLCBhbGxQcmVTdHlsZUVsZW1lbnRzLCBhbGxQb3N0U3R5bGVFbGVtZW50cykpIHsKICAgICAgICAgICAgICAgICAgICByZXBsYWNlTm9kZXMucHVzaChub2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBQUkUgU1RBR0U6IGZpbGwgdGhlICEgc3R5bGVzCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlU3R5bGVzTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICBlbnRlck5vZGVNYXAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZXMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobm9kZXMsIHJvb3QpID0+IHsKICAgICAgICAgICAgICAgIGNsb2FrQW5kQ29tcHV0ZVN0eWxlcyhwcmVTdHlsZXNNYXAsIHRoaXMuZHJpdmVyLCBuZXcgU2V0KG5vZGVzKSwgYWxsUHJlU3R5bGVFbGVtZW50cywgybVQUkVfU1RZTEUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJlcGxhY2VOb2Rlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBub2RlID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBvc3QgPSBwb3N0U3R5bGVzTWFwLmdldChub2RlKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZSA9IHByZVN0eWxlc01hcC5nZXQobm9kZSk7CiAgICAgICAgICAgICAgICBwb3N0U3R5bGVzTWFwLnNldChub2RlLCAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBwb3N0KSwgcHJlKSkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3RQbGF5ZXJzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3ViUGxheWVycyA9IFtdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IE5PX1BBUkVOVF9BTklNQVRJT05fRUxFTUVOVF9ERVRFQ1RFRCA9IHt9OwogICAgICAgICAgICBxdWV1ZWRJbnN0cnVjdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVudHJ5ID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgZWxlbWVudCwgcGxheWVyLCBpbnN0cnVjdGlvbiB9ID0gZW50cnk7CiAgICAgICAgICAgICAgICAvLyB0aGlzIG1lYW5zIHRoYXQgaXQgd2FzIG5ldmVyIGNvbnN1bWVkIGJ5IGEgcGFyZW50IGFuaW1hdGlvbiB3aGljaAogICAgICAgICAgICAgICAgLy8gbWVhbnMgdGhhdCBpdCBpcyBpbmRlcGVuZGVudCBhbmQgdGhlcmVmb3JlIHNob3VsZCBiZSBzZXQgZm9yIGFuaW1hdGlvbgogICAgICAgICAgICAgICAgaWYgKHN1YlRpbWVsaW5lcy5oYXMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoZGlzYWJsZWRFbGVtZW50c1NldC5oYXMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBzZXRTdHlsZXMoZWxlbWVudCwgaW5zdHJ1Y3Rpb24udG9TdHlsZXMpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5kaXNhYmxlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllci5vdmVycmlkZVRvdGFsVGltZShpbnN0cnVjdGlvbi50b3RhbFRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyB3aWxsIGZsb3cgdXAgdGhlIERPTSBhbmQgcXVlcnkgdGhlIG1hcCB0byBmaWd1cmUgb3V0CiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBwYXJlbnQgYW5pbWF0aW9uIGhhcyBwcmlvcml0eSBvdmVyIGl0LiBJbiB0aGUgc2l0dWF0aW9uCiAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhIHBhcmVudCBpcyBkZXRlY3RlZCB0aGVuIGl0IHdpbGwgY2FuY2VsIHRoZSBsb29wLiBJZgogICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgaXMgZGV0ZWN0ZWQsIG9yIGl0IHRha2VzIGEgZmV3IGhvcHMgdG8gZmluZCBhIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIGl0IHdpbGwgZmlsbCBpbiB0aGUgbWlzc2luZyBub2RlcyBhbmQgc2lnbmFsIHRoZW0gYXMgaGF2aW5nCiAgICAgICAgICAgICAgICAgICAgLy8gYSBkZXRlY3RlZCBwYXJlbnQgKG9yIGEgTk9fUEFSRU5UIHZhbHVlIHZpYSBhIHNwZWNpYWwgY29uc3RhbnQpLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgcGFyZW50V2l0aEFuaW1hdGlvbiA9IE5PX1BBUkVOVF9BTklNQVRJT05fRUxFTUVOVF9ERVRFQ1RFRDsKICAgICAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9uRWxlbWVudE1hcC5zaXplID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBlbG0gPSBlbGVtZW50OwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudHNUb0FkZCA9IFtdOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZWxtID0gZWxtLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRldGVjdGVkUGFyZW50ID0gYW5pbWF0aW9uRWxlbWVudE1hcC5nZXQoZWxtKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkZXRlY3RlZFBhcmVudCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudFdpdGhBbmltYXRpb24gPSBkZXRlY3RlZFBhcmVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudHNUb0FkZC5wdXNoKGVsbSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50c1RvQWRkLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50ID0+IGFuaW1hdGlvbkVsZW1lbnRNYXAuc2V0KHBhcmVudCwgcGFyZW50V2l0aEFuaW1hdGlvbikpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGlubmVyUGxheWVyID0gdGhpcy5fYnVpbGRBbmltYXRpb24ocGxheWVyLm5hbWVzcGFjZUlkLCBpbnN0cnVjdGlvbiwgYWxsUHJldmlvdXNQbGF5ZXJzTWFwLCBza2lwcGVkUGxheWVyc01hcCwgcHJlU3R5bGVzTWFwLCBwb3N0U3R5bGVzTWFwKTsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0UmVhbFBsYXllcihpbm5lclBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudFdpdGhBbmltYXRpb24gPT09IE5PX1BBUkVOVF9BTklNQVRJT05fRUxFTUVOVF9ERVRFQ1RFRCkgewogICAgICAgICAgICAgICAgICAgICAgICByb290UGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudFBsYXllcnMgPSB0aGlzLnBsYXllcnNCeUVsZW1lbnQuZ2V0KHBhcmVudFdpdGhBbmltYXRpb24pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50UGxheWVycyAmJiBwYXJlbnRQbGF5ZXJzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyLnBhcmVudFBsYXllciA9IG9wdGltaXplR3JvdXBQbGF5ZXIocGFyZW50UGxheWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc2tpcHBlZFBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGVyYXNlU3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLmZyb21TdHlsZXMpOwogICAgICAgICAgICAgICAgICAgIHBsYXllci5vbkRlc3Ryb3koKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gc2V0U3R5bGVzKGVsZW1lbnQsIGluc3RydWN0aW9uLnRvU3R5bGVzKSkpOwogICAgICAgICAgICAgICAgICAgIC8vIHRoZXJlIHN0aWxsIG1pZ2h0IGJlIGEgYW5jZXN0b3IgcGxheWVyIGFuaW1hdGluZyB0aGlzCiAgICAgICAgICAgICAgICAgICAgLy8gZWxlbWVudCB0aGVyZWZvcmUgd2Ugd2lsbCBzdGlsbCBhZGQgaXQgYXMgYSBzdWIgcGxheWVyCiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBpdHMgYW5pbWF0aW9uIG1heSBiZSBkaXNhYmxlZAogICAgICAgICAgICAgICAgICAgIHN1YlBsYXllcnMucHVzaChwbGF5ZXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChkaXNhYmxlZEVsZW1lbnRzU2V0LmhhcyhlbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgICAgICBza2lwcGVkUGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIGZpbmQgYWxsIG9mIHRoZSBzdWIgcGxheWVycycgY29ycmVzcG9uZGluZyBpbm5lciBhbmltYXRpb24gcGxheWVyCiAgICAgICAgICAgIHN1YlBsYXllcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAgICAgLy8gZXZlbiBpZiBhbnkgcGxheWVycyBhcmUgbm90IGZvdW5kIGZvciBhIHN1YiBhbmltYXRpb24gdGhlbiBpdAogICAgICAgICAgICAgICAgLy8gd2lsbCBzdGlsbCBjb21wbGV0ZSBpdHNlbGYgYWZ0ZXIgdGhlIG5leHQgdGljayBzaW5jZSBpdCdzIE5vb3AKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBsYXllcnNGb3JFbGVtZW50ID0gc2tpcHBlZFBsYXllcnNNYXAuZ2V0KHBsYXllci5lbGVtZW50KTsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXJzRm9yRWxlbWVudCAmJiBwbGF5ZXJzRm9yRWxlbWVudC5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5uZXJQbGF5ZXIgPSBvcHRpbWl6ZUdyb3VwUGxheWVyKHBsYXllcnNGb3JFbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuc2V0UmVhbFBsYXllcihpbm5lclBsYXllcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gdGhlIHJlYXNvbiB3aHkgd2UgZG9uJ3QgYWN0dWFsbHkgcGxheSB0aGUgYW5pbWF0aW9uIGlzCiAgICAgICAgICAgIC8vIGJlY2F1c2UgYWxsIHRoYXQgYSBza2lwcGVkIHBsYXllciBpcyBkZXNpZ25lZCB0byBkbyBpcyB0bwogICAgICAgICAgICAvLyBmaXJlIHRoZSBzdGFydC9kb25lIHRyYW5zaXRpb24gY2FsbGJhY2sgZXZlbnRzCiAgICAgICAgICAgIHNraXBwZWRQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIGlmIChwbGF5ZXIucGFyZW50UGxheWVyKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLnN5bmNQbGF5ZXJFdmVudHMocGxheWVyLnBhcmVudFBsYXllcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIHJ1biB0aHJvdWdoIGFsbCBvZiB0aGUgcXVldWVkIHJlbW92YWxzIGFuZCBzZWUgaWYgdGhleQogICAgICAgICAgICAvLyB3ZXJlIHBpY2tlZCB1cCBieSBhIHF1ZXJ5LiBJZiBub3QgdGhlbiBwZXJmb3JtIHRoZSByZW1vdmFsCiAgICAgICAgICAgIC8vIG9wZXJhdGlvbiByaWdodCBhd2F5IHVubGVzcyBhIHBhcmVudCBhbmltYXRpb24gaXMgb25nb2luZy4KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhbGxMZWF2ZU5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gYWxsTGVhdmVOb2Rlc1tpXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudFtSRU1PVkFMX0ZMQUddKSk7CiAgICAgICAgICAgICAgICByZW1vdmVDbGFzcyhlbGVtZW50LCBMRUFWRV9DTEFTU05BTUUpOwogICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB0aGUgZWxlbWVudCBoYXMgYSByZW1vdmFsIGFuaW1hdGlvbiB0aGF0IGlzIGJlaW5nCiAgICAgICAgICAgICAgICAvLyB0YWtlbiBjYXJlIG9mIGFuZCB0aGVyZWZvcmUgdGhlIGlubmVyIGVsZW1lbnRzIHdpbGwgaGFuZyBhcm91bmQKICAgICAgICAgICAgICAgIC8vIHVudGlsIHRoYXQgYW5pbWF0aW9uIGlzIG92ZXIgKG9yIHRoZSBwYXJlbnQgcXVlcmllZCBhbmltYXRpb24pCiAgICAgICAgICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLmhhc0FuaW1hdGlvbikKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwbGF5ZXJzID0gW107CiAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGVsZW1lbnQgaXMgcXVlcmllZCBvciBpZiBpdCBjb250YWlucyBxdWVyaWVkIGNoaWxkcmVuCiAgICAgICAgICAgICAgICAvLyB0aGVuIHdlIHdhbnQgZm9yIHRoZSBlbGVtZW50IG5vdCB0byBiZSByZW1vdmVkIGZyb20gdGhlIHBhZ2UKICAgICAgICAgICAgICAgIC8vIHVudGlsIHRoZSBxdWVyaWVkIGFuaW1hdGlvbnMgaGF2ZSBmaW5pc2hlZAogICAgICAgICAgICAgICAgaWYgKHF1ZXJpZWRFbGVtZW50cy5zaXplKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBxdWVyaWVkUGxheWVyUmVzdWx0cyA9IHF1ZXJpZWRFbGVtZW50cy5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHF1ZXJpZWRQbGF5ZXJSZXN1bHRzICYmIHF1ZXJpZWRQbGF5ZXJSZXN1bHRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzLnB1c2goLi4ucXVlcmllZFBsYXllclJlc3VsdHMpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXJpZWRJbm5lckVsZW1lbnRzID0gdGhpcy5kcml2ZXIucXVlcnkoZWxlbWVudCwgTkdfQU5JTUFUSU5HX1NFTEVDVE9SLCB0cnVlKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHF1ZXJpZWRJbm5lckVsZW1lbnRzLmxlbmd0aDsgaisrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHF1ZXJpZWRQbGF5ZXJzID0gcXVlcmllZEVsZW1lbnRzLmdldChxdWVyaWVkSW5uZXJFbGVtZW50c1tqXSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChxdWVyaWVkUGxheWVycyAmJiBxdWVyaWVkUGxheWVycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXllcnMucHVzaCguLi5xdWVyaWVkUGxheWVycyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVQbGF5ZXJzID0gcGxheWVycy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwID0+ICFwLmRlc3Ryb3llZCkpOwogICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVBsYXllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgcmVtb3ZlTm9kZXNBZnRlckFuaW1hdGlvbkRvbmUodGhpcywgZWxlbWVudCwgYWN0aXZlUGxheWVycyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnByb2Nlc3NMZWF2ZU5vZGUoZWxlbWVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBzbyB0aGUgY2xlYW51cCBtZXRob2QgZG9lc24ndCByZW1vdmUgdGhlbQogICAgICAgICAgICBhbGxMZWF2ZU5vZGVzLmxlbmd0aCA9IDA7CiAgICAgICAgICAgIHJvb3RQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIHRoaXMucGxheWVycy5wdXNoKHBsYXllcik7CiAgICAgICAgICAgICAgICBwbGF5ZXIub25Eb25lKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXIuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMucGxheWVycy5pbmRleE9mKHBsYXllcik7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGF5ZXJzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBwbGF5ZXIucGxheSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiByb290UGxheWVyczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZWxlbWVudENvbnRhaW5zRGF0YShuYW1lc3BhY2VJZCwgZWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjb250YWluc0RhdGEgPSBmYWxzZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZXRhaWxzID0gKC8qKiBAdHlwZSB7P30gKi8gKGVsZW1lbnRbUkVNT1ZBTF9GTEFHXSkpOwogICAgICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLnNldEZvclJlbW92YWwpCiAgICAgICAgICAgICAgICBjb250YWluc0RhdGEgPSB0cnVlOwogICAgICAgICAgICBpZiAodGhpcy5wbGF5ZXJzQnlFbGVtZW50LmhhcyhlbGVtZW50KSkKICAgICAgICAgICAgICAgIGNvbnRhaW5zRGF0YSA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LmhhcyhlbGVtZW50KSkKICAgICAgICAgICAgICAgIGNvbnRhaW5zRGF0YSA9IHRydWU7CiAgICAgICAgICAgIGlmICh0aGlzLnN0YXRlc0J5RWxlbWVudC5oYXMoZWxlbWVudCkpCiAgICAgICAgICAgICAgICBjb250YWluc0RhdGEgPSB0cnVlOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hOYW1lc3BhY2UobmFtZXNwYWNlSWQpLmVsZW1lbnRDb250YWluc0RhdGEoZWxlbWVudCkgfHwgY29udGFpbnNEYXRhOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZnRlckZsdXNoKGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHRoaXMuX2ZsdXNoRm5zLnB1c2goY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZnRlckZsdXNoQW5pbWF0aW9uc0RvbmUoY2FsbGJhY2spIHsKICAgICAgICAgICAgdGhpcy5fd2hlblF1aWV0Rm5zLnB1c2goY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gaXNRdWVyaWVkRWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/PX0gdHJpZ2dlck5hbWUKICAgICAgICAgKiBAcGFyYW0gez89fSB0b1N0YXRlVmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRQcmV2aW91c1BsYXllcnMoZWxlbWVudCwgaXNRdWVyaWVkRWxlbWVudCwgbmFtZXNwYWNlSWQsIHRyaWdnZXJOYW1lLCB0b1N0YXRlVmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGxheWVycyA9IFtdOwogICAgICAgICAgICBpZiAoaXNRdWVyaWVkRWxlbWVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcXVlcmllZEVsZW1lbnRQbGF5ZXJzID0gdGhpcy5wbGF5ZXJzQnlRdWVyaWVkRWxlbWVudC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICBpZiAocXVlcmllZEVsZW1lbnRQbGF5ZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgcGxheWVycyA9IHF1ZXJpZWRFbGVtZW50UGxheWVyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRQbGF5ZXJzID0gdGhpcy5wbGF5ZXJzQnlFbGVtZW50LmdldChlbGVtZW50KTsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50UGxheWVycykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBpc1JlbW92YWxBbmltYXRpb24gPSAhdG9TdGF0ZVZhbHVlIHx8IHRvU3RhdGVWYWx1ZSA9PSBWT0lEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgIGVsZW1lbnRQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBwbGF5ZXIgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAocGxheWVyLnF1ZXVlZCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1JlbW92YWxBbmltYXRpb24gJiYgcGxheWVyLnRyaWdnZXJOYW1lICE9IHRyaWdnZXJOYW1lKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUlkIHx8IHRyaWdnZXJOYW1lKSB7CiAgICAgICAgICAgICAgICBwbGF5ZXJzID0gcGxheWVycy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKG5hbWVzcGFjZUlkICYmIG5hbWVzcGFjZUlkICE9IHBsYXllci5uYW1lc3BhY2VJZCkKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgICAgIGlmICh0cmlnZ2VyTmFtZSAmJiB0cmlnZ2VyTmFtZSAhPSBwbGF5ZXIudHJpZ2dlck5hbWUpCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcGxheWVyczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBpbnN0cnVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gYWxsUHJldmlvdXNQbGF5ZXJzTWFwCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYmVmb3JlQW5pbWF0aW9uQnVpbGQobmFtZXNwYWNlSWQsIGluc3RydWN0aW9uLCBhbGxQcmV2aW91c1BsYXllcnNNYXApIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cmlnZ2VyTmFtZSA9IGluc3RydWN0aW9uLnRyaWdnZXJOYW1lOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3RFbGVtZW50ID0gaW5zdHJ1Y3Rpb24uZWxlbWVudDsKICAgICAgICAgICAgLy8gd2hlbiBhIHJlbW92YWwgYW5pbWF0aW9uIG9jY3VycywgQUxMIHByZXZpb3VzIHBsYXllcnMgYXJlIGNvbGxlY3RlZAogICAgICAgICAgICAvLyBhbmQgZGVzdHJveWVkIChldmVuIGlmIHRoZXkgYXJlIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgbmFtZXNwYWNlKQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRhcmdldE5hbWVTcGFjZUlkID0gaW5zdHJ1Y3Rpb24uaXNSZW1vdmFsVHJhbnNpdGlvbiA/IHVuZGVmaW5lZCA6IG5hbWVzcGFjZUlkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRhcmdldFRyaWdnZXJOYW1lID0gaW5zdHJ1Y3Rpb24uaXNSZW1vdmFsVHJhbnNpdGlvbiA/IHVuZGVmaW5lZCA6IHRyaWdnZXJOYW1lOwogICAgICAgICAgICBmb3IgKGNvbnN0IHRpbWVsaW5lSW5zdHJ1Y3Rpb24gb2YgaW5zdHJ1Y3Rpb24udGltZWxpbmVzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGltZWxpbmVJbnN0cnVjdGlvbi5lbGVtZW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaXNRdWVyaWVkRWxlbWVudCA9IGVsZW1lbnQgIT09IHJvb3RFbGVtZW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGxheWVycyA9IGdldE9yU2V0QXNJbk1hcChhbGxQcmV2aW91c1BsYXllcnNNYXAsIGVsZW1lbnQsIFtdKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGxheWVycyA9IHRoaXMuX2dldFByZXZpb3VzUGxheWVycyhlbGVtZW50LCBpc1F1ZXJpZWRFbGVtZW50LCB0YXJnZXROYW1lU3BhY2VJZCwgdGFyZ2V0VHJpZ2dlck5hbWUsIGluc3RydWN0aW9uLnRvU3RhdGUpOwogICAgICAgICAgICAgICAgcHJldmlvdXNQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlYWxQbGF5ZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovIChwbGF5ZXIpKSkuZ2V0UmVhbFBsYXllcigpKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlYWxQbGF5ZXIuYmVmb3JlRGVzdHJveSkgewogICAgICAgICAgICAgICAgICAgICAgICByZWFsUGxheWVyLmJlZm9yZURlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcGxheWVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgICAgICAgICBwbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyB0aGlzIG5lZWRzIHRvIGJlIGRvbmUgc28gdGhhdCB0aGUgUFJFL1BPU1Qgc3R5bGVzIGNhbiBiZQogICAgICAgICAgICAvLyBjb21wdXRlZCBwcm9wZXJseSB3aXRob3V0IGludGVyZmVyaW5nIHdpdGggdGhlIHByZXZpb3VzIGFuaW1hdGlvbgogICAgICAgICAgICBlcmFzZVN0eWxlcyhyb290RWxlbWVudCwgaW5zdHJ1Y3Rpb24uZnJvbVN0eWxlcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gaW5zdHJ1Y3Rpb24KICAgICAgICAgKiBAcGFyYW0gez99IGFsbFByZXZpb3VzUGxheWVyc01hcAogICAgICAgICAqIEBwYXJhbSB7P30gc2tpcHBlZFBsYXllcnNNYXAKICAgICAgICAgKiBAcGFyYW0gez99IHByZVN0eWxlc01hcAogICAgICAgICAqIEBwYXJhbSB7P30gcG9zdFN0eWxlc01hcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2J1aWxkQW5pbWF0aW9uKG5hbWVzcGFjZUlkLCBpbnN0cnVjdGlvbiwgYWxsUHJldmlvdXNQbGF5ZXJzTWFwLCBza2lwcGVkUGxheWVyc01hcCwgcHJlU3R5bGVzTWFwLCBwb3N0U3R5bGVzTWFwKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHJpZ2dlck5hbWUgPSBpbnN0cnVjdGlvbi50cmlnZ2VyTmFtZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByb290RWxlbWVudCA9IGluc3RydWN0aW9uLmVsZW1lbnQ7CiAgICAgICAgICAgIC8vIHdlIGZpcnN0IHJ1biB0aGlzIHNvIHRoYXQgdGhlIHByZXZpb3VzIGFuaW1hdGlvbiBwbGF5ZXIKICAgICAgICAgICAgLy8gZGF0YSBjYW4gYmUgcGFzc2VkIGludG8gdGhlIHN1Y2Nlc3NpdmUgYW5pbWF0aW9uIHBsYXllcnMKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbGxRdWVyaWVkUGxheWVycyA9IFtdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFsbENvbnN1bWVkRWxlbWVudHMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWxsU3ViRWxlbWVudHMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWxsTmV3UGxheWVycyA9IGluc3RydWN0aW9uLnRpbWVsaW5lcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRpbWVsaW5lSW5zdHJ1Y3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRpbWVsaW5lSW5zdHJ1Y3Rpb24gPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRpbWVsaW5lSW5zdHJ1Y3Rpb24uZWxlbWVudDsKICAgICAgICAgICAgICAgIGFsbENvbnN1bWVkRWxlbWVudHMuYWRkKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgLy8gRklYTUUgKG1hdHNrbyk6IG1ha2Ugc3VyZSB0by1iZS1yZW1vdmVkIGFuaW1hdGlvbnMgYXJlIHJlbW92ZWQgcHJvcGVybHkKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRldGFpbHMgPSBlbGVtZW50W1JFTU9WQUxfRkxBR107CiAgICAgICAgICAgICAgICBpZiAoZGV0YWlscyAmJiBkZXRhaWxzLnJlbW92ZWRCZWZvcmVRdWVyaWVkKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9vcEFuaW1hdGlvblBsYXllcih0aW1lbGluZUluc3RydWN0aW9uLmR1cmF0aW9uLCB0aW1lbGluZUluc3RydWN0aW9uLmRlbGF5KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlzUXVlcmllZEVsZW1lbnQgPSBlbGVtZW50ICE9PSByb290RWxlbWVudDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGxheWVycyA9IGZsYXR0ZW5Hcm91cFBsYXllcnMoKGFsbFByZXZpb3VzUGxheWVyc01hcC5nZXQoZWxlbWVudCkgfHwgRU1QVFlfUExBWUVSX0FSUkFZKQogICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwID0+IHAuZ2V0UmVhbFBsYXllcigpKSkpCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHAgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBgZWxlbWVudGAgaXMgbm90IGFwYXJ0IG9mIHRoZSBBbmltYXRpb25QbGF5ZXIgZGVmaW5pdGlvbiwgYnV0CiAgICAgICAgICAgICAgICAgICAgLy8gTW9jay9XZWJBbmltYXRpb25zCiAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBlbGVtZW50IHdpdGhpbiB0aGVpciBpbXBsZW1lbnRhdGlvbi4gVGhpcyB3aWxsIGJlIGFkZGVkIGluIEFuZ3VsYXI1IHRvCiAgICAgICAgICAgICAgICAgICAgLy8gQW5pbWF0aW9uUGxheWVyCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBwID0gKC8qKiBAdHlwZSB7P30gKi8gKHApKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcHAuZWxlbWVudCA/IHBwLmVsZW1lbnQgPT09IGVsZW1lbnQgOiBmYWxzZTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZVN0eWxlcyA9IHByZVN0eWxlc01hcC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwb3N0U3R5bGVzID0gcG9zdFN0eWxlc01hcC5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBrZXlmcmFtZXMgPSBub3JtYWxpemVLZXlmcmFtZXModGhpcy5kcml2ZXIsIHRoaXMuX25vcm1hbGl6ZXIsIGVsZW1lbnQsIHRpbWVsaW5lSW5zdHJ1Y3Rpb24ua2V5ZnJhbWVzLCBwcmVTdHlsZXMsIHBvc3RTdHlsZXMpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGxheWVyID0gdGhpcy5fYnVpbGRQbGF5ZXIodGltZWxpbmVJbnN0cnVjdGlvbiwga2V5ZnJhbWVzLCBwcmV2aW91c1BsYXllcnMpOwogICAgICAgICAgICAgICAgLy8gdGhpcyBtZWFucyB0aGF0IHRoaXMgcGFydGljdWxhciBwbGF5ZXIgYmVsb25ncyB0byBhIHN1YiB0cmlnZ2VyLiBJdCBpcwogICAgICAgICAgICAgICAgLy8gaW1wb3J0YW50IHRoYXQgd2UgbWF0Y2ggdGhpcyBwbGF5ZXIgdXAgd2l0aCB0aGUgY29ycmVzcG9uZGluZyAoQHRyaWdnZXIubGlzdGVuZXIpCiAgICAgICAgICAgICAgICBpZiAodGltZWxpbmVJbnN0cnVjdGlvbi5zdWJUaW1lbGluZSAmJiBza2lwcGVkUGxheWVyc01hcCkgewogICAgICAgICAgICAgICAgICAgIGFsbFN1YkVsZW1lbnRzLmFkZChlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChpc1F1ZXJpZWRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdyYXBwZWRQbGF5ZXIgPSBuZXcgVHJhbnNpdGlvbkFuaW1hdGlvblBsYXllcihuYW1lc3BhY2VJZCwgdHJpZ2dlck5hbWUsIGVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgIHdyYXBwZWRQbGF5ZXIuc2V0UmVhbFBsYXllcihwbGF5ZXIpOwogICAgICAgICAgICAgICAgICAgIGFsbFF1ZXJpZWRQbGF5ZXJzLnB1c2god3JhcHBlZFBsYXllcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcGxheWVyOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGFsbFF1ZXJpZWRQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBsYXllcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGxheWVyID0+IHsKICAgICAgICAgICAgICAgIGdldE9yU2V0QXNJbk1hcCh0aGlzLnBsYXllcnNCeVF1ZXJpZWRFbGVtZW50LCBwbGF5ZXIuZWxlbWVudCwgW10pLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgICAgIHBsYXllci5vbkRvbmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gZGVsZXRlT3JVbnNldEluTWFwKHRoaXMucGxheWVyc0J5UXVlcmllZEVsZW1lbnQsIHBsYXllci5lbGVtZW50LCBwbGF5ZXIpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgYWxsQ29uc3VtZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlbGVtZW50ID0+IGFkZENsYXNzKGVsZW1lbnQsIE5HX0FOSU1BVElOR19DTEFTU05BTUUpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxheWVyID0gb3B0aW1pemVHcm91cFBsYXllcihhbGxOZXdQbGF5ZXJzKTsKICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBhbGxDb25zdW1lZEVsZW1lbnRzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBlbGVtZW50ID0+IHJlbW92ZUNsYXNzKGVsZW1lbnQsIE5HX0FOSU1BVElOR19DTEFTU05BTUUpKSk7CiAgICAgICAgICAgICAgICBzZXRTdHlsZXMocm9vdEVsZW1lbnQsIGluc3RydWN0aW9uLnRvU3R5bGVzKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyB0aGlzIGJhc2ljYWxseSBtYWtlcyBhbGwgb2YgdGhlIGNhbGxiYWNrcyBmb3Igc3ViIGVsZW1lbnQgYW5pbWF0aW9ucwogICAgICAgICAgICAvLyBiZSBkZXBlbmRlbnQgb24gdGhlIHVwcGVyIHBsYXllcnMgZm9yIHdoZW4gdGhleSBmaW5pc2gKICAgICAgICAgICAgYWxsU3ViRWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZWxlbWVudCA9PiB7CiAgICAgICAgICAgICAgICBnZXRPclNldEFzSW5NYXAoc2tpcHBlZFBsYXllcnNNYXAsIGVsZW1lbnQsIFtdKS5wdXNoKHBsYXllcik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGluc3RydWN0aW9uCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlmcmFtZXMKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZpb3VzUGxheWVycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2J1aWxkUGxheWVyKGluc3RydWN0aW9uLCBrZXlmcmFtZXMsIHByZXZpb3VzUGxheWVycykgewogICAgICAgICAgICBpZiAoa2V5ZnJhbWVzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRyaXZlci5hbmltYXRlKGluc3RydWN0aW9uLmVsZW1lbnQsIGtleWZyYW1lcywgaW5zdHJ1Y3Rpb24uZHVyYXRpb24sIGluc3RydWN0aW9uLmRlbGF5LCBpbnN0cnVjdGlvbi5lYXNpbmcsIHByZXZpb3VzUGxheWVycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB3aGVuIGFuIGVtcHR5IHRyYW5zaXRpb258ZGVmaW5pdGlvbiBpcyBwcm92aWRlZAogICAgICAgICAgICAvLyAuLi4gdGhlcmUgaXMgbm8gcG9pbnQgaW4gcmVuZGVyaW5nIGFuIGVtcHR5IGFuaW1hdGlvbgogICAgICAgICAgICByZXR1cm4gbmV3IE5vb3BBbmltYXRpb25QbGF5ZXIoaW5zdHJ1Y3Rpb24uZHVyYXRpb24sIGluc3RydWN0aW9uLmRlbGF5KTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUcmFuc2l0aW9uQW5pbWF0aW9uUGxheWVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSB0cmlnZ2VyTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5hbWVzcGFjZUlkLCB0cmlnZ2VyTmFtZSwgZWxlbWVudCkgewogICAgICAgICAgICB0aGlzLm5hbWVzcGFjZUlkID0gbmFtZXNwYWNlSWQ7CiAgICAgICAgICAgIHRoaXMudHJpZ2dlck5hbWUgPSB0cmlnZ2VyTmFtZTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fcGxheWVyID0gbmV3IE5vb3BBbmltYXRpb25QbGF5ZXIoKTsKICAgICAgICAgICAgdGhpcy5fY29udGFpbnNSZWFsUGxheWVyID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3F1ZXVlZENhbGxiYWNrcyA9IHt9OwogICAgICAgICAgICB0aGlzLmRlc3Ryb3llZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLm1hcmtlZEZvckRlc3Ryb3kgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnF1ZXVlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMudG90YWxUaW1lID0gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFJlYWxQbGF5ZXIocGxheWVyKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jb250YWluc1JlYWxQbGF5ZXIpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX3BsYXllciA9IHBsYXllcjsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fcXVldWVkQ2FsbGJhY2tzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwaGFzZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGhhc2UgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fcXVldWVkQ2FsbGJhY2tzW3BoYXNlXS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNhbGxiYWNrID0+IGxpc3Rlbk9uUGxheWVyKHBsYXllciwgcGhhc2UsIHVuZGVmaW5lZCwgY2FsbGJhY2spKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fcXVldWVkQ2FsbGJhY2tzID0ge307CiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5zUmVhbFBsYXllciA9IHRydWU7CiAgICAgICAgICAgIHRoaXMub3ZlcnJpZGVUb3RhbFRpbWUocGxheWVyLnRvdGFsVGltZSk7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5xdWV1ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRSZWFsUGxheWVyKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGxheWVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRvdGFsVGltZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3ZlcnJpZGVUb3RhbFRpbWUodG90YWxUaW1lKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS50b3RhbFRpbWUgPSB0b3RhbFRpbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzeW5jUGxheWVyRXZlbnRzKHBsYXllcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHAgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fcGxheWVyKSk7CiAgICAgICAgICAgIGlmIChwLnRyaWdnZXJDYWxsYmFjaykgewogICAgICAgICAgICAgICAgcGxheWVyLm9uU3RhcnQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHAudHJpZ2dlckNhbGxiYWNrKSkoJ3N0YXJ0JykpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwbGF5ZXIub25Eb25lKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuZmluaXNoKCkpKTsKICAgICAgICAgICAgcGxheWVyLm9uRGVzdHJveSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLmRlc3Ryb3koKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9xdWV1ZUV2ZW50KG5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIGdldE9yU2V0QXNJbk1hcCh0aGlzLl9xdWV1ZWRDYWxsYmFja3MsIG5hbWUsIFtdKS5wdXNoKGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Eb25lKGZuKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fcXVldWVFdmVudCgnZG9uZScsIGZuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wbGF5ZXIub25Eb25lKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25TdGFydChmbikgewogICAgICAgICAgICBpZiAodGhpcy5xdWV1ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3F1ZXVlRXZlbnQoJ3N0YXJ0JywgZm4pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3BsYXllci5vblN0YXJ0KGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25EZXN0cm95KGZuKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnF1ZXVlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fcXVldWVFdmVudCgnZGVzdHJveScsIGZuKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wbGF5ZXIub25EZXN0cm95KGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbml0KCkgewogICAgICAgICAgICB0aGlzLl9wbGF5ZXIuaW5pdCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnF1ZXVlZCA/IGZhbHNlIDogdGhpcy5fcGxheWVyLmhhc1N0YXJ0ZWQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5KCkgewogICAgICAgICAgICAhdGhpcy5xdWV1ZWQgJiYgdGhpcy5fcGxheWVyLnBsYXkoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXVzZSgpIHsKICAgICAgICAgICAgIXRoaXMucXVldWVkICYmIHRoaXMuX3BsYXllci5wYXVzZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc3RhcnQoKSB7CiAgICAgICAgICAgICF0aGlzLnF1ZXVlZCAmJiB0aGlzLl9wbGF5ZXIucmVzdGFydCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmlzaCgpIHsKICAgICAgICAgICAgdGhpcy5fcGxheWVyLmZpbmlzaCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5kZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9wbGF5ZXIuZGVzdHJveSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICAhdGhpcy5xdWV1ZWQgJiYgdGhpcy5fcGxheWVyLnJlc2V0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0UG9zaXRpb24ocCkgewogICAgICAgICAgICBpZiAoIXRoaXMucXVldWVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wbGF5ZXIuc2V0UG9zaXRpb24ocCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRQb3NpdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWVkID8gMCA6IHRoaXMuX3BsYXllci5nZXRQb3NpdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBwaGFzZU5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJDYWxsYmFjayhwaGFzZU5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3BsYXllcikpOwogICAgICAgICAgICBpZiAocC50cmlnZ2VyQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgIHAudHJpZ2dlckNhbGxiYWNrKHBoYXNlTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWFwCiAgICAgKiBAcGFyYW0gez99IGtleQogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGVsZXRlT3JVbnNldEluTWFwKG1hcCwga2V5LCB2YWx1ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY3VycmVudFZhbHVlczsKICAgICAgICBpZiAobWFwIGluc3RhbmNlb2YgTWFwKSB7CiAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMgPSBtYXAuZ2V0KGtleSk7CiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVzKSB7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50VmFsdWVzLmluZGV4T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgbWFwLmRlbGV0ZShrZXkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjdXJyZW50VmFsdWVzID0gbWFwW2tleV07CiAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVzKSB7CiAgICAgICAgICAgICAgICBpZiAoY3VycmVudFZhbHVlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBjdXJyZW50VmFsdWVzLmluZGV4T2YodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGN1cnJlbnRWYWx1ZXMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChjdXJyZW50VmFsdWVzLmxlbmd0aCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG1hcFtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBjdXJyZW50VmFsdWVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVUcmlnZ2VyVmFsdWUodmFsdWUpIHsKICAgICAgICAvLyB3ZSB1c2UgYCE9IG51bGxgIGhlcmUgYmVjYXVzZSBpdCdzIHRoZSBtb3N0IHNpbXBsZQogICAgICAgIC8vIHdheSB0byB0ZXN0IGFnYWluc3QgYSAiZmFsc3kiIHZhbHVlIHdpdGhvdXQgbWl4aW5nCiAgICAgICAgLy8gaW4gZW1wdHkgc3RyaW5ncyBvciBhIHplcm8gdmFsdWUuIERPIE5PVCBPUFRJTUlaRS4KICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0VsZW1lbnROb2RlKG5vZGUpIHsKICAgICAgICByZXR1cm4gbm9kZSAmJiBub2RlWydub2RlVHlwZSddID09PSAxOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNUcmlnZ2VyRXZlbnRWYWxpZChldmVudE5hbWUpIHsKICAgICAgICByZXR1cm4gZXZlbnROYW1lID09ICdzdGFydCcgfHwgZXZlbnROYW1lID09ICdkb25lJzsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez89fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY2xvYWtFbGVtZW50KGVsZW1lbnQsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZWxlbWVudC5zdHlsZS5kaXNwbGF5OwogICAgICAgIGVsZW1lbnQuc3R5bGUuZGlzcGxheSA9IHZhbHVlICE9IG51bGwgPyB2YWx1ZSA6ICdub25lJzsKICAgICAgICByZXR1cm4gb2xkVmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsdWVzTWFwCiAgICAgKiBAcGFyYW0gez99IGRyaXZlcgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50cwogICAgICogQHBhcmFtIHs/fSBlbGVtZW50UHJvcHNNYXAKICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdFN0eWxlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjbG9ha0FuZENvbXB1dGVTdHlsZXModmFsdWVzTWFwLCBkcml2ZXIsIGVsZW1lbnRzLCBlbGVtZW50UHJvcHNNYXAsIGRlZmF1bHRTdHlsZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjbG9ha1ZhbHMgPSBbXTsKICAgICAgICBlbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVsZW1lbnQgPT4gY2xvYWtWYWxzLnB1c2goY2xvYWtFbGVtZW50KGVsZW1lbnQpKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmYWlsZWRFbGVtZW50cyA9IFtdOwogICAgICAgIGVsZW1lbnRQcm9wc01hcC5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3BzCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocHJvcHMsIGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTsKICAgICAgICAgICAgcHJvcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHN0eWxlc1twcm9wXSA9IGRyaXZlci5jb21wdXRlU3R5bGUoZWxlbWVudCwgcHJvcCwgZGVmYXVsdFN0eWxlKTsKICAgICAgICAgICAgICAgIC8vIHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvIGRldGVjdCB0aGlzIGJlY2F1c2UgYSBzdWIgZWxlbWVudCBjb3VsZCBiZSByZW1vdmVkCiAgICAgICAgICAgICAgICAvLyBieSBhIHBhcmVudCBhbmltYXRpb24gZWxlbWVudCBiZWluZyBkZXRhY2hlZC4KICAgICAgICAgICAgICAgIGlmICghdmFsdWUgfHwgdmFsdWUubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50W1JFTU9WQUxfRkxBR10gPSBOVUxMX1JFTU9WRURfUVVFUklFRF9TVEFURTsKICAgICAgICAgICAgICAgICAgICBmYWlsZWRFbGVtZW50cy5wdXNoKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHZhbHVlc01hcC5zZXQoZWxlbWVudCwgc3R5bGVzKTsKICAgICAgICB9KSk7CiAgICAgICAgLy8gd2UgdXNlIGEgaW5kZXggdmFyaWFibGUgaGVyZSBzaW5jZSBTZXQuZm9yRWFjaChhLCBpKSBkb2VzIG5vdCByZXR1cm4KICAgICAgICAvLyBhbiBpbmRleCB2YWx1ZSBmb3IgdGhlIGNsb3N1cmUgKGJ1dCBpbnN0ZWFkIGp1c3QgdGhlIHZhbHVlKQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaSA9IDA7CiAgICAgICAgZWxlbWVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50ID0+IGNsb2FrRWxlbWVudChlbGVtZW50LCBjbG9ha1ZhbHNbaSsrXSkpKTsKICAgICAgICByZXR1cm4gZmFpbGVkRWxlbWVudHM7CiAgICB9CiAgICAvKgogICAgU2luY2UgdGhlIEFuZ3VsYXIgcmVuZGVyZXIgY29kZSB3aWxsIHJldHVybiBhIGNvbGxlY3Rpb24gb2YgaW5zZXJ0ZWQKICAgIG5vZGVzIGluIGFsbCBhcmVhcyBvZiBhIERPTSB0cmVlLCBpdCdzIHVwIHRvIHRoaXMgYWxnb3JpdGhtIHRvIGZpZ3VyZQogICAgb3V0IHdoaWNoIG5vZGVzIGFyZSByb290cyBmb3IgZWFjaCBhbmltYXRpb24gQHRyaWdnZXIuCgogICAgQnkgcGxhY2luZyBlYWNoIGluc2VydGVkIG5vZGUgaW50byBhIFNldCBhbmQgdHJhdmVyc2luZyB1cHdhcmRzLCBpdAogICAgaXMgcG9zc2libGUgdG8gZmluZCB0aGUgQHRyaWdnZXIgZWxlbWVudHMgYW5kIHdlbGwgYW55IGRpcmVjdCAqc3RhcgogICAgaW5zZXJ0aW9uIG5vZGVzLCBpZiBhIEB0cmlnZ2VyIHJvb3QgaXMgZm91bmQgdGhlbiB0aGUgZW50ZXIgZWxlbWVudAogICAgaXMgcGxhY2VkIGludG8gdGhlIE1hcFtAdHJpZ2dlcl0gc3BvdC4KICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJvb3RzCiAgICAgKiBAcGFyYW0gez99IG5vZGVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBidWlsZFJvb3RNYXAocm9vdHMsIG5vZGVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJvb3RNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgcm9vdHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByb290ID0+IHJvb3RNYXAuc2V0KHJvb3QsIFtdKSkpOwogICAgICAgIGlmIChub2Rlcy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgcmV0dXJuIHJvb3RNYXA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IE5VTExfTk9ERSA9IDE7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5vZGVTZXQgPSBuZXcgU2V0KG5vZGVzKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbG9jYWxSb290TWFwID0gbmV3IE1hcCgpOwogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gZ2V0Um9vdChub2RlKSB7CiAgICAgICAgICAgIGlmICghbm9kZSkKICAgICAgICAgICAgICAgIHJldHVybiBOVUxMX05PREU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJvb3QgPSBsb2NhbFJvb3RNYXAuZ2V0KG5vZGUpOwogICAgICAgICAgICBpZiAocm9vdCkKICAgICAgICAgICAgICAgIHJldHVybiByb290OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgaWYgKHJvb3RNYXAuaGFzKHBhcmVudCkpIHsgLy8gbmdJZiBpbnNpZGUgQHRyaWdnZXIKICAgICAgICAgICAgICAgIHJvb3QgPSBwYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAobm9kZVNldC5oYXMocGFyZW50KSkgeyAvLyBuZ0lmIGluc2lkZSBuZ0lmCiAgICAgICAgICAgICAgICByb290ID0gTlVMTF9OT0RFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgeyAvLyByZWN1cnNlIHVwd2FyZHMKICAgICAgICAgICAgICAgIHJvb3QgPSBnZXRSb290KHBhcmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbG9jYWxSb290TWFwLnNldChub2RlLCByb290KTsKICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgfQogICAgICAgIG5vZGVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbm9kZSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdCA9IGdldFJvb3Qobm9kZSk7CiAgICAgICAgICAgIGlmIChyb290ICE9PSBOVUxMX05PREUpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChyb290TWFwLmdldChyb290KSkpLnB1c2gobm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIHJvb3RNYXA7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDTEFTU0VTX0NBQ0hFX0tFWSA9ICckJGNsYXNzZXMnOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRDbGFzcyhlbGVtZW50LCBjbGFzc05hbWUpIHsKICAgICAgICBpZiAoZWxlbWVudC5jbGFzc0xpc3QpIHsKICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjbGFzc2VzID0gZWxlbWVudFtDTEFTU0VTX0NBQ0hFX0tFWV07CiAgICAgICAgICAgIGlmICghY2xhc3NlcykgewogICAgICAgICAgICAgICAgY2xhc3NlcyA9IGVsZW1lbnRbQ0xBU1NFU19DQUNIRV9LRVldID0ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2xhc3Nlc1tjbGFzc05hbWVdID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZUNsYXNzKGVsZW1lbnQsIGNsYXNzTmFtZSkgewogICAgICAgIGlmIChlbGVtZW50LmNsYXNzTGlzdCkgewogICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNsYXNzZXMgPSBlbGVtZW50W0NMQVNTRVNfQ0FDSEVfS0VZXTsKICAgICAgICAgICAgaWYgKGNsYXNzZXMpIHsKICAgICAgICAgICAgICAgIGRlbGV0ZSBjbGFzc2VzW2NsYXNzTmFtZV07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZW5naW5lCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gcGxheWVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVtb3ZlTm9kZXNBZnRlckFuaW1hdGlvbkRvbmUoZW5naW5lLCBlbGVtZW50LCBwbGF5ZXJzKSB7CiAgICAgICAgb3B0aW1pemVHcm91cFBsYXllcihwbGF5ZXJzKS5vbkRvbmUoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gZW5naW5lLnByb2Nlc3NMZWF2ZU5vZGUoZWxlbWVudCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwbGF5ZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuR3JvdXBQbGF5ZXJzKHBsYXllcnMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmluYWxQbGF5ZXJzID0gW107CiAgICAgICAgX2ZsYXR0ZW5Hcm91cFBsYXllcnNSZWN1cihwbGF5ZXJzLCBmaW5hbFBsYXllcnMpOwogICAgICAgIHJldHVybiBmaW5hbFBsYXllcnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGxheWVycwogICAgICogQHBhcmFtIHs/fSBmaW5hbFBsYXllcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9mbGF0dGVuR3JvdXBQbGF5ZXJzUmVjdXIocGxheWVycywgZmluYWxQbGF5ZXJzKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwbGF5ZXJzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxheWVyID0gcGxheWVyc1tpXTsKICAgICAgICAgICAgaWYgKHBsYXllciBpbnN0YW5jZW9mIEFuaW1hdGlvbkdyb3VwUGxheWVyKSB7CiAgICAgICAgICAgICAgICBfZmxhdHRlbkdyb3VwUGxheWVyc1JlY3VyKHBsYXllci5wbGF5ZXJzLCBmaW5hbFBsYXllcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZmluYWxQbGF5ZXJzLnB1c2gocGxheWVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhCiAgICAgKiBAcGFyYW0gez99IGIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG9iakVxdWFscyhhLCBiKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGsxID0gT2JqZWN0LmtleXMoYSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGsyID0gT2JqZWN0LmtleXMoYik7CiAgICAgICAgaWYgKGsxLmxlbmd0aCAhPSBrMi5sZW5ndGgpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGsxLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJvcCA9IGsxW2ldOwogICAgICAgICAgICBpZiAoIWIuaGFzT3duUHJvcGVydHkocHJvcCkgfHwgYVtwcm9wXSAhPT0gYltwcm9wXSkKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBhbGxQcmVTdHlsZUVsZW1lbnRzCiAgICAgKiBAcGFyYW0gez99IGFsbFBvc3RTdHlsZUVsZW1lbnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXBsYWNlUG9zdFN0eWxlc0FzUHJlKGVsZW1lbnQsIGFsbFByZVN0eWxlRWxlbWVudHMsIGFsbFBvc3RTdHlsZUVsZW1lbnRzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBvc3RFbnRyeSA9IGFsbFBvc3RTdHlsZUVsZW1lbnRzLmdldChlbGVtZW50KTsKICAgICAgICBpZiAoIXBvc3RFbnRyeSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgcHJlRW50cnkgPSBhbGxQcmVTdHlsZUVsZW1lbnRzLmdldChlbGVtZW50KTsKICAgICAgICBpZiAocHJlRW50cnkpIHsKICAgICAgICAgICAgcG9zdEVudHJ5LmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRhdGEgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHByZUVudHJ5KSkuYWRkKGRhdGEpKSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBhbGxQcmVTdHlsZUVsZW1lbnRzLnNldChlbGVtZW50LCBwb3N0RW50cnkpOwogICAgICAgIH0KICAgICAgICBhbGxQb3N0U3R5bGVFbGVtZW50cy5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci9hbmltYXRpb25fZW5naW5lX25leHQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQW5pbWF0aW9uRW5naW5lIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGJvZHlOb2RlCiAgICAgICAgICogQHBhcmFtIHs/fSBfZHJpdmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBub3JtYWxpemVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYm9keU5vZGUsIF9kcml2ZXIsIG5vcm1hbGl6ZXIpIHsKICAgICAgICAgICAgdGhpcy5ib2R5Tm9kZSA9IGJvZHlOb2RlOwogICAgICAgICAgICB0aGlzLl9kcml2ZXIgPSBfZHJpdmVyOwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyQ2FjaGUgPSB7fTsKICAgICAgICAgICAgLy8gdGhpcyBtZXRob2QgaXMgZGVzaWduZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSB0aGUgY29kZSB0aGF0IHVzZXMgdGhpcyBlbmdpbmUKICAgICAgICAgICAgdGhpcy5vblJlbW92YWxDb21wbGV0ZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVsZW1lbnQsIGNvbnRleHQpID0+IHsgfSk7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUgPSBuZXcgVHJhbnNpdGlvbkFuaW1hdGlvbkVuZ2luZShib2R5Tm9kZSwgX2RyaXZlciwgbm9ybWFsaXplcik7CiAgICAgICAgICAgIHRoaXMuX3RpbWVsaW5lRW5naW5lID0gbmV3IFRpbWVsaW5lQW5pbWF0aW9uRW5naW5lKGJvZHlOb2RlLCBfZHJpdmVyLCBub3JtYWxpemVyKTsKICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5vblJlbW92YWxDb21wbGV0ZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVsZW1lbnQsIGNvbnRleHQpID0+IHRoaXMub25SZW1vdmFsQ29tcGxldGUoZWxlbWVudCwgY29udGV4dCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudElkCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IG1ldGFkYXRhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlclRyaWdnZXIoY29tcG9uZW50SWQsIG5hbWVzcGFjZUlkLCBob3N0RWxlbWVudCwgbmFtZSwgbWV0YWRhdGEpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYWNoZUtleSA9IGNvbXBvbmVudElkICsgJy0nICsgbmFtZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHJpZ2dlciA9IHRoaXMuX3RyaWdnZXJDYWNoZVtjYWNoZUtleV07CiAgICAgICAgICAgIGlmICghdHJpZ2dlcikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXJyb3JzID0gW107CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhc3QgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYnVpbGRBbmltYXRpb25Bc3QodGhpcy5fZHJpdmVyLCAoLyoqIEB0eXBlIHs/fSAqLyAobWV0YWRhdGEpKSwgZXJyb3JzKSkpOwogICAgICAgICAgICAgICAgaWYgKGVycm9ycy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRoZSBhbmltYXRpb24gdHJpZ2dlciAiJHtuYW1lfSIgaGFzIGZhaWxlZCB0byBidWlsZCBkdWUgdG8gdGhlIGZvbGxvd2luZyBlcnJvcnM6XG4gLSAke2Vycm9ycy5qb2luKCdcbiAtICcpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdHJpZ2dlciA9IGJ1aWxkVHJpZ2dlcihuYW1lLCBhc3QpOwogICAgICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckNhY2hlW2NhY2hlS2V5XSA9IHRyaWdnZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5yZWdpc3RlclRyaWdnZXIobmFtZXNwYWNlSWQsIG5hbWUsIHRyaWdnZXIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXIobmFtZXNwYWNlSWQsIGhvc3RFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUucmVnaXN0ZXIobmFtZXNwYWNlSWQsIGhvc3RFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveShuYW1lc3BhY2VJZCwgY29udGV4dCkgewogICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uRW5naW5lLmRlc3Ryb3kobmFtZXNwYWNlSWQsIGNvbnRleHQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IGluc2VydEJlZm9yZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25JbnNlcnQobmFtZXNwYWNlSWQsIGVsZW1lbnQsIHBhcmVudCwgaW5zZXJ0QmVmb3JlKSB7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUuaW5zZXJ0Tm9kZShuYW1lc3BhY2VJZCwgZWxlbWVudCwgcGFyZW50LCBpbnNlcnRCZWZvcmUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHBhcmFtIHs/PX0gaXNIb3N0RWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25SZW1vdmUobmFtZXNwYWNlSWQsIGVsZW1lbnQsIGNvbnRleHQsIGlzSG9zdEVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5yZW1vdmVOb2RlKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBpc0hvc3RFbGVtZW50IHx8IGZhbHNlLCBjb250ZXh0KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBkaXNhYmxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlQW5pbWF0aW9ucyhlbGVtZW50LCBkaXNhYmxlKSB7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUubWFya0VsZW1lbnRBc0Rpc2FibGVkKGVsZW1lbnQsIGRpc2FibGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByb2Nlc3MobmFtZXNwYWNlSWQsIGVsZW1lbnQsIHByb3BlcnR5LCB2YWx1ZSkgewogICAgICAgICAgICBpZiAocHJvcGVydHkuY2hhckF0KDApID09ICdAJykgewogICAgICAgICAgICAgICAgY29uc3QgW2lkLCBhY3Rpb25dID0gcGFyc2VUaW1lbGluZUNvbW1hbmQocHJvcGVydHkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYXJncyA9ICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpOwogICAgICAgICAgICAgICAgdGhpcy5fdGltZWxpbmVFbmdpbmUuY29tbWFuZChpZCwgZWxlbWVudCwgYWN0aW9uLCBhcmdzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUudHJpZ2dlcihuYW1lc3BhY2VJZCwgZWxlbWVudCwgcHJvcGVydHksIHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50UGhhc2UKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsaXN0ZW4obmFtZXNwYWNlSWQsIGVsZW1lbnQsIGV2ZW50TmFtZSwgZXZlbnRQaGFzZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgLy8gQEBsaXN0ZW4KICAgICAgICAgICAgaWYgKGV2ZW50TmFtZS5jaGFyQXQoMCkgPT0gJ0AnKSB7CiAgICAgICAgICAgICAgICBjb25zdCBbaWQsIGFjdGlvbl0gPSBwYXJzZVRpbWVsaW5lQ29tbWFuZChldmVudE5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RpbWVsaW5lRW5naW5lLmxpc3RlbihpZCwgZWxlbWVudCwgYWN0aW9uLCBjYWxsYmFjayk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUubGlzdGVuKG5hbWVzcGFjZUlkLCBlbGVtZW50LCBldmVudE5hbWUsIGV2ZW50UGhhc2UsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gbWljcm90YXNrSWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZsdXNoKG1pY3JvdGFza0lkID0gLTEpIHsKICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkVuZ2luZS5mbHVzaChtaWNyb3Rhc2tJZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBsYXllcnMoKSB7CiAgICAgICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RyYW5zaXRpb25FbmdpbmUucGxheWVycykpKQogICAgICAgICAgICAgICAgLmNvbmNhdCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdGltZWxpbmVFbmdpbmUucGxheWVycykpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3aGVuUmVuZGVyaW5nRG9uZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYW5zaXRpb25FbmdpbmUud2hlblJlbmRlcmluZ0RvbmUoKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9hbmltYXRpb25zL2Jyb3dzZXIvc3JjL3JlbmRlci9zcGVjaWFsX2Nhc2VkX3N0eWxlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFJldHVybnMgYW4gaW5zdGFuY2Ugb2YgYFNwZWNpYWxDYXNlZFN0eWxlc2AgaWYgYW5kIHdoZW4gYW55IHNwZWNpYWwgKG5vbiBhbmltYXRlYWJsZSkgc3R5bGVzIGFyZQogICAgICogZGV0ZWN0ZWQuCiAgICAgKgogICAgICogSW4gQ1NTIHRoZXJlIGV4aXN0IHByb3BlcnRpZXMgdGhhdCBjYW5ub3QgYmUgYW5pbWF0ZWQgd2l0aGluIGEga2V5ZnJhbWUgYW5pbWF0aW9uCiAgICAgKiAod2hldGhlciBpdCBiZSB2aWEgQ1NTIGtleWZyYW1lcyBvciB3ZWItYW5pbWF0aW9ucykgYW5kIHRoZSBhbmltYXRpb24gaW1wbGVtZW50YXRpb24KICAgICAqIHdpbGwgaWdub3JlIHRoZW0uIFRoaXMgZnVuY3Rpb24gaXMgZGVzaWduZWQgdG8gZGV0ZWN0IHRob3NlIHNwZWNpYWwgY2FzZWQgc3R5bGVzIGFuZAogICAgICogcmV0dXJuIGEgY29udGFpbmVyIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCB0aGUgc3RhcnQgYW5kIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEByZXR1cm4gez99IGFuIGluc3RhbmNlIG9mIGBTcGVjaWFsQ2FzZWRTdHlsZXNgIGlmIGFueSBzcGVjaWFsIHN0eWxlcyBhcmUgZGV0ZWN0ZWQgb3RoZXJ3aXNlIGBudWxsYAogICAgICovCiAgICBmdW5jdGlvbiBwYWNrYWdlTm9uQW5pbWF0YWJsZVN0eWxlcyhlbGVtZW50LCBzdHlsZXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHN0YXJ0U3R5bGVzID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGVuZFN0eWxlcyA9IG51bGw7CiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGVzKSAmJiBzdHlsZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIHN0YXJ0U3R5bGVzID0gZmlsdGVyTm9uQW5pbWF0YWJsZVN0eWxlcyhzdHlsZXNbMF0pOwogICAgICAgICAgICBpZiAoc3R5bGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIGVuZFN0eWxlcyA9IGZpbHRlck5vbkFuaW1hdGFibGVTdHlsZXMoc3R5bGVzW3N0eWxlcy5sZW5ndGggLSAxXSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoc3R5bGVzKSB7CiAgICAgICAgICAgIHN0YXJ0U3R5bGVzID0gZmlsdGVyTm9uQW5pbWF0YWJsZVN0eWxlcyhzdHlsZXMpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHN0YXJ0U3R5bGVzIHx8IGVuZFN0eWxlcykgPyBuZXcgU3BlY2lhbENhc2VkU3R5bGVzKGVsZW1lbnQsIHN0YXJ0U3R5bGVzLCBlbmRTdHlsZXMpIDoKICAgICAgICAgICAgbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogRGVzaWduZWQgdG8gYmUgZXhlY3V0ZWQgZHVyaW5nIGEga2V5ZnJhbWUtYmFzZWQgYW5pbWF0aW9uIHRvIGFwcGx5IGFueSBzcGVjaWFsLWNhc2VkIHN0eWxlcy4KICAgICAqCiAgICAgKiBXaGVuIHN0YXJ0ZWQgKHdoZW4gdGhlIGBzdGFydCgpYCBtZXRob2QgaXMgcnVuKSB0aGVuIHRoZSBwcm92aWRlZCBgc3RhcnRTdHlsZXNgCiAgICAgKiB3aWxsIGJlIGFwcGxpZWQuIFdoZW4gZmluaXNoZWQgKHdoZW4gdGhlIGBmaW5pc2goKWAgbWV0aG9kIGlzIGNhbGxlZCkgdGhlCiAgICAgKiBgZW5kU3R5bGVzYCB3aWxsIGJlIGFwcGxpZWQgYXMgd2VsbCBhbnkgYW55IHN0YXJ0aW5nIHN0eWxlcy4gRmluYWxseSB3aGVuCiAgICAgKiBgZGVzdHJveSgpYCBpcyBjYWxsZWQgdGhlbiBhbGwgc3R5bGVzIHdpbGwgYmUgcmVtb3ZlZC4KICAgICAqLwogICAgY2xhc3MgU3BlY2lhbENhc2VkU3R5bGVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBfc3RhcnRTdHlsZXMKICAgICAgICAgKiBAcGFyYW0gez99IF9lbmRTdHlsZXMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX3N0YXJ0U3R5bGVzLCBfZW5kU3R5bGVzKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBfZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fc3RhcnRTdHlsZXMgPSBfc3RhcnRTdHlsZXM7CiAgICAgICAgICAgIHRoaXMuX2VuZFN0eWxlcyA9IF9lbmRTdHlsZXM7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMCAvKiBQZW5kaW5nICovOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpbml0aWFsU3R5bGVzID0gU3BlY2lhbENhc2VkU3R5bGVzLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuZ2V0KF9lbGVtZW50KTsKICAgICAgICAgICAgaWYgKCFpbml0aWFsU3R5bGVzKSB7CiAgICAgICAgICAgICAgICBTcGVjaWFsQ2FzZWRTdHlsZXMuaW5pdGlhbFN0eWxlc0J5RWxlbWVudC5zZXQoX2VsZW1lbnQsIGluaXRpYWxTdHlsZXMgPSB7fSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faW5pdGlhbFN0eWxlcyA9IGluaXRpYWxTdHlsZXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhcnQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSA8IDEgLyogU3RhcnRlZCAqLykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXJ0U3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgc2V0U3R5bGVzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX3N0YXJ0U3R5bGVzLCB0aGlzLl9pbml0aWFsU3R5bGVzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMSAvKiBTdGFydGVkICovOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmluaXNoKCkgewogICAgICAgICAgICB0aGlzLnN0YXJ0KCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSA8IDIgLyogRmluaXNoZWQgKi8pIHsKICAgICAgICAgICAgICAgIHNldFN0eWxlcyh0aGlzLl9lbGVtZW50LCB0aGlzLl9pbml0aWFsU3R5bGVzKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbmRTdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICBzZXRTdHlsZXModGhpcy5fZWxlbWVudCwgdGhpcy5fZW5kU3R5bGVzKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRTdHlsZXMgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAxIC8qIFN0YXJ0ZWQgKi87CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLmZpbmlzaCgpOwogICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgPCAzIC8qIERlc3Ryb3llZCAqLykgewogICAgICAgICAgICAgICAgU3BlY2lhbENhc2VkU3R5bGVzLmluaXRpYWxTdHlsZXNCeUVsZW1lbnQuZGVsZXRlKHRoaXMuX2VsZW1lbnQpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXJ0U3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXJhc2VTdHlsZXModGhpcy5fZWxlbWVudCwgdGhpcy5fc3RhcnRTdHlsZXMpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZFN0eWxlcyA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZW5kU3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgZXJhc2VTdHlsZXModGhpcy5fZWxlbWVudCwgdGhpcy5fZW5kU3R5bGVzKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbmRTdHlsZXMgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2V0U3R5bGVzKHRoaXMuX2VsZW1lbnQsIHRoaXMuX2luaXRpYWxTdHlsZXMpOwogICAgICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAzIC8qIERlc3Ryb3llZCAqLzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFNwZWNpYWxDYXNlZFN0eWxlcy5pbml0aWFsU3R5bGVzQnlFbGVtZW50ID0gbmV3IFdlYWtNYXAoKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbHRlck5vbkFuaW1hdGFibGVTdHlsZXMoc3R5bGVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXN1bHQgPSBudWxsOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwcm9wcyA9IE9iamVjdC5rZXlzKHN0eWxlcyk7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwcm9wcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByb3AgPSBwcm9wc1tpXTsKICAgICAgICAgICAgaWYgKGlzTm9uQW5pbWF0YWJsZVN0eWxlKHByb3ApKSB7CiAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgfHwge307CiAgICAgICAgICAgICAgICByZXN1bHRbcHJvcF0gPSBzdHlsZXNbcHJvcF07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc05vbkFuaW1hdGFibGVTdHlsZShwcm9wKSB7CiAgICAgICAgcmV0dXJuIHByb3AgPT09ICdkaXNwbGF5JyB8fCBwcm9wID09PSAncG9zaXRpb24nOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvY3NzX2tleWZyYW1lcy9lbGVtZW50X2FuaW1hdGlvbl9zdHlsZV9oYW5kbGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgRUxBUFNFRF9USU1FX01BWF9ERUNJTUFMX1BMQUNFUyA9IDM7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBBTklNQVRJT05fUFJPUCA9ICdhbmltYXRpb24nOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQU5JTUFUSU9ORU5EX0VWRU5UID0gJ2FuaW1hdGlvbmVuZCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBPTkVfU0VDT05EJDEgPSAxMDAwOwogICAgY2xhc3MgRWxlbWVudEFuaW1hdGlvblN0eWxlSGFuZGxlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gX25hbWUKICAgICAgICAgKiBAcGFyYW0gez99IF9kdXJhdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gX2RlbGF5CiAgICAgICAgICogQHBhcmFtIHs/fSBfZWFzaW5nCiAgICAgICAgICogQHBhcmFtIHs/fSBfZmlsbE1vZGUKICAgICAgICAgKiBAcGFyYW0gez99IF9vbkRvbmVGbgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50LCBfbmFtZSwgX2R1cmF0aW9uLCBfZGVsYXksIF9lYXNpbmcsIF9maWxsTW9kZSwgX29uRG9uZUZuKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBfZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fbmFtZSA9IF9uYW1lOwogICAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9IF9kdXJhdGlvbjsKICAgICAgICAgICAgdGhpcy5fZGVsYXkgPSBfZGVsYXk7CiAgICAgICAgICAgIHRoaXMuX2Vhc2luZyA9IF9lYXNpbmc7CiAgICAgICAgICAgIHRoaXMuX2ZpbGxNb2RlID0gX2ZpbGxNb2RlOwogICAgICAgICAgICB0aGlzLl9vbkRvbmVGbiA9IF9vbkRvbmVGbjsKICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0VGltZSA9IDA7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gMDsKICAgICAgICAgICAgdGhpcy5fZXZlbnRGbiA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZSkgPT4gdGhpcy5faGFuZGxlQ2FsbGJhY2soZSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGx5KCkgewogICAgICAgICAgICBhcHBseUtleWZyYW1lQW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIGAke3RoaXMuX2R1cmF0aW9ufW1zICR7dGhpcy5fZWFzaW5nfSAke3RoaXMuX2RlbGF5fW1zIDEgbm9ybWFsICR7dGhpcy5fZmlsbE1vZGV9ICR7dGhpcy5fbmFtZX1gKTsKICAgICAgICAgICAgYWRkUmVtb3ZlQW5pbWF0aW9uRXZlbnQodGhpcy5fZWxlbWVudCwgdGhpcy5fZXZlbnRGbiwgZmFsc2UpOwogICAgICAgICAgICB0aGlzLl9zdGFydFRpbWUgPSBEYXRlLm5vdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhdXNlKCkgewogICAgICAgICAgICBwbGF5UGF1c2VBbmltYXRpb24odGhpcy5fZWxlbWVudCwgdGhpcy5fbmFtZSwgJ3BhdXNlZCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc3VtZSgpIHsKICAgICAgICAgICAgcGxheVBhdXNlQW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWUsICdydW5uaW5nJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFBvc2l0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kSW5kZXhGb3JBbmltYXRpb24odGhpcy5fZWxlbWVudCwgdGhpcy5fbmFtZSk7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gcG9zaXRpb24gKiB0aGlzLl9kdXJhdGlvbjsKICAgICAgICAgICAgc2V0QW5pbWF0aW9uU3R5bGUodGhpcy5fZWxlbWVudCwgJ0RlbGF5JywgYC0ke3RoaXMuX3Bvc2l0aW9ufW1zYCwgaW5kZXgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBvc2l0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9zaXRpb247CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUNhbGxiYWNrKGV2ZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltZXN0YW1wID0gZXZlbnQuX25nVGVzdE1hbnVhbFRpbWVzdGFtcCB8fCBEYXRlLm5vdygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsYXBzZWRUaW1lID0gcGFyc2VGbG9hdChldmVudC5lbGFwc2VkVGltZS50b0ZpeGVkKEVMQVBTRURfVElNRV9NQVhfREVDSU1BTF9QTEFDRVMpKSAqIE9ORV9TRUNPTkQkMTsKICAgICAgICAgICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT0gdGhpcy5fbmFtZSAmJgogICAgICAgICAgICAgICAgTWF0aC5tYXgodGltZXN0YW1wIC0gdGhpcy5fc3RhcnRUaW1lLCAwKSA+PSB0aGlzLl9kZWxheSAmJiBlbGFwc2VkVGltZSA+PSB0aGlzLl9kdXJhdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5maW5pc2goKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmlzaCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZpbmlzaGVkKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZuKCk7CiAgICAgICAgICAgIGFkZFJlbW92ZUFuaW1hdGlvbkV2ZW50KHRoaXMuX2VsZW1lbnQsIHRoaXMuX2V2ZW50Rm4sIHRydWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kZXN0cm95ZWQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuZmluaXNoKCk7CiAgICAgICAgICAgIHJlbW92ZUtleWZyYW1lQW5pbWF0aW9uKHRoaXMuX2VsZW1lbnQsIHRoaXMuX25hbWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gc3RhdHVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBwbGF5UGF1c2VBbmltYXRpb24oZWxlbWVudCwgbmFtZSwgc3RhdHVzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGluZGV4ID0gZmluZEluZGV4Rm9yQW5pbWF0aW9uKGVsZW1lbnQsIG5hbWUpOwogICAgICAgIHNldEFuaW1hdGlvblN0eWxlKGVsZW1lbnQsICdQbGF5U3RhdGUnLCBzdGF0dXMsIGluZGV4KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhcHBseUtleWZyYW1lQW5pbWF0aW9uKGVsZW1lbnQsIHZhbHVlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW0gPSBnZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCAnJykudHJpbSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5kZXggPSAwOwogICAgICAgIGlmIChhbmltLmxlbmd0aCkgewogICAgICAgICAgICBpbmRleCA9IGNvdW50Q2hhcnMoYW5pbSwgJywnKSArIDE7CiAgICAgICAgICAgIHZhbHVlID0gYCR7YW5pbX0sICR7dmFsdWV9YDsKICAgICAgICB9CiAgICAgICAgc2V0QW5pbWF0aW9uU3R5bGUoZWxlbWVudCwgJycsIHZhbHVlKTsKICAgICAgICByZXR1cm4gaW5kZXg7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVLZXlmcmFtZUFuaW1hdGlvbihlbGVtZW50LCBuYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFuaW0gPSBnZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCAnJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRva2VucyA9IGFuaW0uc3BsaXQoJywnKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5kZXggPSBmaW5kTWF0Y2hpbmdUb2tlbkluZGV4KHRva2VucywgbmFtZSk7CiAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgdG9rZW5zLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0b2tlbnMuam9pbignLCcpOwogICAgICAgICAgICBzZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCAnJywgbmV3VmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kSW5kZXhGb3JBbmltYXRpb24oZWxlbWVudCwgdmFsdWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYW5pbSA9IGdldEFuaW1hdGlvblN0eWxlKGVsZW1lbnQsICcnKTsKICAgICAgICBpZiAoYW5pbS5pbmRleE9mKCcsJykgPiAwKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gYW5pbS5zcGxpdCgnLCcpOwogICAgICAgICAgICByZXR1cm4gZmluZE1hdGNoaW5nVG9rZW5JbmRleCh0b2tlbnMsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZpbmRNYXRjaGluZ1Rva2VuSW5kZXgoW2FuaW1dLCB2YWx1ZSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdG9rZW5zCiAgICAgKiBAcGFyYW0gez99IHNlYXJjaFRva2VuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmaW5kTWF0Y2hpbmdUb2tlbkluZGV4KHRva2Vucywgc2VhcmNoVG9rZW4pIHsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRva2Vucy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICBpZiAodG9rZW5zW2ldLmluZGV4T2Yoc2VhcmNoVG9rZW4pID49IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiAtMTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgKiBAcGFyYW0gez99IGRvUmVtb3ZlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRSZW1vdmVBbmltYXRpb25FdmVudChlbGVtZW50LCBmbiwgZG9SZW1vdmUpIHsKICAgICAgICBkb1JlbW92ZSA/IGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihBTklNQVRJT05FTkRfRVZFTlQsIGZuKSA6CiAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihBTklNQVRJT05FTkRfRVZFTlQsIGZuKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEBwYXJhbSB7Pz19IGluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCBuYW1lLCB2YWx1ZSwgaW5kZXgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvcCA9IEFOSU1BVElPTl9QUk9QICsgbmFtZTsKICAgICAgICBpZiAoaW5kZXggIT0gbnVsbCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gZWxlbWVudC5zdHlsZVtwcm9wXTsKICAgICAgICAgICAgaWYgKG9sZFZhbHVlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdG9rZW5zID0gb2xkVmFsdWUuc3BsaXQoJywnKTsKICAgICAgICAgICAgICAgIHRva2Vuc1tpbmRleF0gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHZhbHVlID0gdG9rZW5zLmpvaW4oJywnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBlbGVtZW50LnN0eWxlW3Byb3BdID0gdmFsdWU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRBbmltYXRpb25TdHlsZShlbGVtZW50LCBuYW1lKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnQuc3R5bGVbQU5JTUFUSU9OX1BST1AgKyBuYW1lXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHBhcmFtIHs/fSBjaGFyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb3VudENoYXJzKHZhbHVlLCBjaGFyKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjb3VudCA9IDA7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGMgPSB2YWx1ZS5jaGFyQXQoaSk7CiAgICAgICAgICAgIGlmIChjID09PSBjaGFyKQogICAgICAgICAgICAgICAgY291bnQrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGNvdW50OwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvY3NzX2tleWZyYW1lcy9jc3Nfa2V5ZnJhbWVzX3BsYXllci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUZBVUxUX0ZJTExfTU9ERSA9ICdmb3J3YXJkcyc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUZBVUxUX0VBU0lORyA9ICdsaW5lYXInOwogICAgY2xhc3MgQ3NzS2V5ZnJhbWVzUGxheWVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gX2R1cmF0aW9uCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGVsYXkKICAgICAgICAgKiBAcGFyYW0gez99IGVhc2luZwogICAgICAgICAqIEBwYXJhbSB7P30gX2ZpbmFsU3R5bGVzCiAgICAgICAgICogQHBhcmFtIHs/PX0gX3NwZWNpYWxTdHlsZXMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBrZXlmcmFtZXMsIGFuaW1hdGlvbk5hbWUsIF9kdXJhdGlvbiwgX2RlbGF5LCBlYXNpbmcsIF9maW5hbFN0eWxlcywgX3NwZWNpYWxTdHlsZXMpIHsKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5rZXlmcmFtZXMgPSBrZXlmcmFtZXM7CiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uTmFtZSA9IGFuaW1hdGlvbk5hbWU7CiAgICAgICAgICAgIHRoaXMuX2R1cmF0aW9uID0gX2R1cmF0aW9uOwogICAgICAgICAgICB0aGlzLl9kZWxheSA9IF9kZWxheTsKICAgICAgICAgICAgdGhpcy5fZmluYWxTdHlsZXMgPSBfZmluYWxTdHlsZXM7CiAgICAgICAgICAgIHRoaXMuX3NwZWNpYWxTdHlsZXMgPSBfc3BlY2lhbFN0eWxlczsKICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zID0gW107CiAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zID0gW107CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jdXJyZW50U25hcHNob3QgPSB7fTsKICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAwOwogICAgICAgICAgICB0aGlzLmVhc2luZyA9IGVhc2luZyB8fCBERUZBVUxUX0VBU0lORzsKICAgICAgICAgICAgdGhpcy50b3RhbFRpbWUgPSBfZHVyYXRpb24gKyBfZGVsYXk7CiAgICAgICAgICAgIHRoaXMuX2J1aWxkU3R5bGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU3RhcnQoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Eb25lKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucy5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25EZXN0cm95KGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveUZucy5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlID49IDQgLyogREVTVFJPWUVEICovKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDQgLyogREVTVFJPWUVEICovOwogICAgICAgICAgICB0aGlzLl9zdHlsZXIuZGVzdHJveSgpOwogICAgICAgICAgICB0aGlzLl9mbHVzaFN0YXJ0Rm5zKCk7CiAgICAgICAgICAgIHRoaXMuX2ZsdXNoRG9uZUZucygpOwogICAgICAgICAgICBpZiAodGhpcy5fc3BlY2lhbFN0eWxlcykgewogICAgICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcy5kZXN0cm95KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fb25EZXN0cm95Rm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveUZucyA9IFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2ZsdXNoRG9uZUZucygpIHsKICAgICAgICAgICAgdGhpcy5fb25Eb25lRm5zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIHRoaXMuX29uRG9uZUZucyA9IFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2ZsdXNoU3RhcnRGbnMoKSB7CiAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmlzaCgpIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSA+PSAzIC8qIEZJTklTSEVEICovKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9IDMgLyogRklOSVNIRUQgKi87CiAgICAgICAgICAgIHRoaXMuX3N0eWxlci5maW5pc2goKTsKICAgICAgICAgICAgdGhpcy5fZmx1c2hTdGFydEZucygpOwogICAgICAgICAgICBpZiAodGhpcy5fc3BlY2lhbFN0eWxlcykgewogICAgICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcy5maW5pc2goKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9mbHVzaERvbmVGbnMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0UG9zaXRpb24odmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fc3R5bGVyLnNldFBvc2l0aW9uKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRQb3NpdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0eWxlci5nZXRQb3NpdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZSA+PSAyIC8qIFNUQVJURUQgKi87CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlID49IDEgLyogSU5JVElBTElaRUQgKi8pCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMSAvKiBJTklUSUFMSVpFRCAqLzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbG0gPSB0aGlzLmVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX3N0eWxlci5hcHBseSgpOwogICAgICAgICAgICBpZiAodGhpcy5fZGVsYXkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N0eWxlci5wYXVzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheSgpIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIGlmICghdGhpcy5oYXNTdGFydGVkKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZsdXNoU3RhcnRGbnMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMiAvKiBTVEFSVEVEICovOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NwZWNpYWxTdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zcGVjaWFsU3R5bGVzLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc3R5bGVyLnJlc3VtZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhdXNlKCkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgdGhpcy5fc3R5bGVyLnBhdXNlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzdGFydCgpIHsKICAgICAgICAgICAgdGhpcy5yZXNldCgpOwogICAgICAgICAgICB0aGlzLnBsYXkoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldCgpIHsKICAgICAgICAgICAgdGhpcy5fc3R5bGVyLmRlc3Ryb3koKTsKICAgICAgICAgICAgdGhpcy5fYnVpbGRTdHlsZXIoKTsKICAgICAgICAgICAgdGhpcy5fc3R5bGVyLmFwcGx5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYnVpbGRTdHlsZXIoKSB7CiAgICAgICAgICAgIHRoaXMuX3N0eWxlciA9IG5ldyBFbGVtZW50QW5pbWF0aW9uU3R5bGVIYW5kbGVyKHRoaXMuZWxlbWVudCwgdGhpcy5hbmltYXRpb25OYW1lLCB0aGlzLl9kdXJhdGlvbiwgdGhpcy5fZGVsYXksIHRoaXMuZWFzaW5nLCBERUZBVUxUX0ZJTExfTU9ERSwgKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5maW5pc2goKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBwaGFzZU5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJDYWxsYmFjayhwaGFzZU5hbWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZXRob2RzID0gcGhhc2VOYW1lID09ICdzdGFydCcgPyB0aGlzLl9vblN0YXJ0Rm5zIDogdGhpcy5fb25Eb25lRm5zOwogICAgICAgICAgICBtZXRob2RzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgIG1ldGhvZHMubGVuZ3RoID0gMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBiZWZvcmVEZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzU3RhcnRlZCgpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmaW5pc2hlZCA9IHRoaXMuX3N0YXRlID49IDMgLyogRklOSVNIRUQgKi87CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9maW5hbFN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChwcm9wICE9ICdvZmZzZXQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlc1twcm9wXSA9IGZpbmlzaGVkID8gdGhpcy5fZmluYWxTdHlsZXNbcHJvcF0gOiBjb21wdXRlU3R5bGUodGhpcy5lbGVtZW50LCBwcm9wKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jdXJyZW50U25hcHNob3QgPSBzdHlsZXM7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvY3NzX2tleWZyYW1lcy9kaXJlY3Rfc3R5bGVfcGxheWVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIERpcmVjdFN0eWxlUGxheWVyIGV4dGVuZHMgTm9vcEFuaW1hdGlvblBsYXllciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZXMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlbGVtZW50LCBzdHlsZXMpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fc3RhcnRpbmdTdHlsZXMgPSB7fTsKICAgICAgICAgICAgdGhpcy5fX2luaXRpYWxpemVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3N0eWxlcyA9IGh5cGVuYXRlUHJvcHNPYmplY3Qoc3R5bGVzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbml0KCkgewogICAgICAgICAgICBpZiAodGhpcy5fX2luaXRpYWxpemVkIHx8ICF0aGlzLl9zdGFydGluZ1N0eWxlcykKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdGhpcy5fX2luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fc3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9zdGFydGluZ1N0eWxlcykpW3Byb3BdID0gdGhpcy5lbGVtZW50LnN0eWxlW3Byb3BdOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHN1cGVyLmluaXQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwbGF5KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3N0YXJ0aW5nU3R5bGVzKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5fc3R5bGVzKQogICAgICAgICAgICAgICAgLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHByb3AgPT4gdGhpcy5lbGVtZW50LnN0eWxlLnNldFByb3BlcnR5KHByb3AsIHRoaXMuX3N0eWxlc1twcm9wXSkpKTsKICAgICAgICAgICAgc3VwZXIucGxheSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fc3RhcnRpbmdTdHlsZXMpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuX3N0YXJ0aW5nU3R5bGVzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N0YXJ0aW5nU3R5bGVzKSlbcHJvcF07CiAgICAgICAgICAgICAgICBpZiAodmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc3R5bGUuc2V0UHJvcGVydHkocHJvcCwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnN0eWxlLnJlbW92ZVByb3BlcnR5KHByb3ApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX3N0YXJ0aW5nU3R5bGVzID0gbnVsbDsKICAgICAgICAgICAgc3VwZXIuZGVzdHJveSgpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL2Nzc19rZXlmcmFtZXMvY3NzX2tleWZyYW1lc19kcml2ZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgS0VZRlJBTUVTX05BTUVfUFJFRklYID0gJ2dlbl9jc3Nfa2ZfJzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFRBQl9TUEFDRSA9ICcgJzsKICAgIGNsYXNzIENzc0tleWZyYW1lc0RyaXZlciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2NvdW50ID0gMDsKICAgICAgICAgICAgdGhpcy5faGVhZCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJ2hlYWQnKTsKICAgICAgICAgICAgdGhpcy5fd2FybmluZ0lzc3VlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKSB7CiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVN0eWxlUHJvcGVydHkocHJvcCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hdGNoZXNFbGVtZW50KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzRWxlbWVudChlbGVtZW50LCBzZWxlY3Rvcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxtMQogICAgICAgICAqIEBwYXJhbSB7P30gZWxtMgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY29udGFpbnNFbGVtZW50KGVsbTEsIGVsbTIpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zRWxlbWVudChlbG0xLCBlbG0yKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAqIEBwYXJhbSB7P30gbXVsdGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHF1ZXJ5KGVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSkgewogICAgICAgICAgICByZXR1cm4gaW52b2tlUXVlcnkoZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdFZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb21wdXRlU3R5bGUoZWxlbWVudCwgcHJvcCwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSkpKVtwcm9wXSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnVpbGRLZXlmcmFtZUVsZW1lbnQoZWxlbWVudCwgbmFtZSwga2V5ZnJhbWVzKSB7CiAgICAgICAgICAgIGtleWZyYW1lcyA9IGtleWZyYW1lcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGtmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBrZiA9PiBoeXBlbmF0ZVByb3BzT2JqZWN0KGtmKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBrZXlmcmFtZVN0ciA9IGBAa2V5ZnJhbWVzICR7bmFtZX0ge1xuYDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdGFiID0gJyc7CiAgICAgICAgICAgIGtleWZyYW1lcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2YgPT4gewogICAgICAgICAgICAgICAgdGFiID0gVEFCX1NQQUNFOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb2Zmc2V0ID0gcGFyc2VGbG9hdChrZlsnb2Zmc2V0J10pOwogICAgICAgICAgICAgICAga2V5ZnJhbWVTdHIgKz0gYCR7dGFifSR7b2Zmc2V0ICogMTAwfSUge1xuYDsKICAgICAgICAgICAgICAgIHRhYiArPSBUQUJfU1BBQ0U7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhrZikuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHByb3AgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGtmW3Byb3BdOwogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocHJvcCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdvZmZzZXQnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdlYXNpbmcnOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ZnJhbWVTdHIgKz0gYCR7dGFifWFuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246ICR7dmFsdWV9O1xuYDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleWZyYW1lU3RyICs9IGAke3RhYn0ke3Byb3B9OiAke3ZhbHVlfTtcbmA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAga2V5ZnJhbWVTdHIgKz0gYCR7dGFifX1cbmA7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAga2V5ZnJhbWVTdHIgKz0gYH1cbmA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2ZFbG0gPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICBrZkVsbS5pbm5lckhUTUwgPSBrZXlmcmFtZVN0cjsKICAgICAgICAgICAgcmV0dXJuIGtmRWxtOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmcKICAgICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnMKICAgICAgICAgKiBAcGFyYW0gez89fSBzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYW5pbWF0ZShlbGVtZW50LCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMgPSBbXSwgc2NydWJiZXJBY2Nlc3NSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgaWYgKHNjcnViYmVyQWNjZXNzUmVxdWVzdGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnlGYXVsdHlTY3J1YmJlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNDc3NLZXlmcmFtZVBsYXllcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAocHJldmlvdXNQbGF5ZXJzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gcGxheWVyIGluc3RhbmNlb2YgQ3NzS2V5ZnJhbWVzUGxheWVyKSkpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c1N0eWxlcyA9IHt9OwogICAgICAgICAgICBpZiAoYWxsb3dQcmV2aW91c1BsYXllclN0eWxlc01lcmdlKGR1cmF0aW9uLCBkZWxheSkpIHsKICAgICAgICAgICAgICAgIHByZXZpb3VzQ3NzS2V5ZnJhbWVQbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZXMgPSBwbGF5ZXIuY3VycmVudFNuYXBzaG90OwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBwcm9wID0+IHByZXZpb3VzU3R5bGVzW3Byb3BdID0gc3R5bGVzW3Byb3BdKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5ZnJhbWVzID0gYmFsYW5jZVByZXZpb3VzU3R5bGVzSW50b0tleWZyYW1lcyhlbGVtZW50LCBrZXlmcmFtZXMsIHByZXZpb3VzU3R5bGVzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaW5hbFN0eWxlcyA9IGZsYXR0ZW5LZXlmcmFtZXNJbnRvU3R5bGVzKGtleWZyYW1lcyk7CiAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIG5vIGFuaW1hdGlvbiB0aGVuIHRoZXJlIGlzIG5vIHBvaW50IGluIGFwcGx5aW5nCiAgICAgICAgICAgIC8vIHN0eWxlcyBhbmQgd2FpdGluZyBmb3IgYW4gZXZlbnQgdG8gZ2V0IGZpcmVkLiBUaGlzIGNhdXNlcyBsYWcuCiAgICAgICAgICAgIC8vIEl0J3MgYmV0dGVyIHRvIGp1c3QgZGlyZWN0bHkgYXBwbHkgdGhlIHN0eWxlcyB0byB0aGUgZWxlbWVudAogICAgICAgICAgICAvLyB2aWEgdGhlIGRpcmVjdCBzdHlsaW5nIGFuaW1hdGlvbiBwbGF5ZXIuCiAgICAgICAgICAgIGlmIChkdXJhdGlvbiA9PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERpcmVjdFN0eWxlUGxheWVyKGVsZW1lbnQsIGZpbmFsU3R5bGVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbk5hbWUgPSBgJHtLRVlGUkFNRVNfTkFNRV9QUkVGSVh9JHt0aGlzLl9jb3VudCsrfWA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2ZFbG0gPSB0aGlzLmJ1aWxkS2V5ZnJhbWVFbGVtZW50KGVsZW1lbnQsIGFuaW1hdGlvbk5hbWUsIGtleWZyYW1lcyk7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdoZWFkJykpKS5hcHBlbmRDaGlsZChrZkVsbSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3BlY2lhbFN0eWxlcyA9IHBhY2thZ2VOb25BbmltYXRhYmxlU3R5bGVzKGVsZW1lbnQsIGtleWZyYW1lcyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxheWVyID0gbmV3IENzc0tleWZyYW1lc1BsYXllcihlbGVtZW50LCBrZXlmcmFtZXMsIGFuaW1hdGlvbk5hbWUsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBmaW5hbFN0eWxlcywgc3BlY2lhbFN0eWxlcyk7CiAgICAgICAgICAgIHBsYXllci5vbkRlc3Ryb3koKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gcmVtb3ZlRWxlbWVudChrZkVsbSkpKTsKICAgICAgICAgICAgcmV0dXJuIHBsYXllcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ub3RpZnlGYXVsdHlTY3J1YmJlcigpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl93YXJuaW5nSXNzdWVkKSB7CiAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oJ0Bhbmd1bGFyL2FuaW1hdGlvbnM6IHBsZWFzZSBsb2FkIHRoZSB3ZWItYW5pbWF0aW9ucy5qcyBwb2x5ZmlsbCB0byBhbGxvdyBwcm9ncmFtbWF0aWMgYWNjZXNzLi4uXG4nLCAnICB2aXNpdCBodHRwOi8vYml0Lmx5L0lXdWthbSB0byBsZWFybiBtb3JlIGFib3V0IHVzaW5nIHRoZSB3ZWItYW5pbWF0aW9uLWpzIHBvbHlmaWxsLicpOwogICAgICAgICAgICAgICAgdGhpcy5fd2FybmluZ0lzc3VlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30ga2V5ZnJhbWVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmbGF0dGVuS2V5ZnJhbWVzSW50b1N0eWxlcyhrZXlmcmFtZXMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGZsYXRLZXlmcmFtZXMgPSB7fTsKICAgICAgICBpZiAoa2V5ZnJhbWVzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2ZzID0gQXJyYXkuaXNBcnJheShrZXlmcmFtZXMpID8ga2V5ZnJhbWVzIDogW2tleWZyYW1lc107CiAgICAgICAgICAgIGtmcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2YgPT4gewogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoa2YpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBwcm9wID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAocHJvcCA9PSAnb2Zmc2V0JyB8fCBwcm9wID09ICdlYXNpbmcnKQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgZmxhdEtleWZyYW1lc1twcm9wXSA9IGtmW3Byb3BdOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmbGF0S2V5ZnJhbWVzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQobm9kZSkgewogICAgICAgIG5vZGUucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChub2RlKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2FuaW1hdGlvbnMvYnJvd3Nlci9zcmMvcmVuZGVyL3dlYl9hbmltYXRpb25zL3dlYl9hbmltYXRpb25zX3BsYXllci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBXZWJBbmltYXRpb25zUGxheWVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Pz19IF9zcGVjaWFsU3R5bGVzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudCwga2V5ZnJhbWVzLCBvcHRpb25zLCBfc3BlY2lhbFN0eWxlcykgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLmtleWZyYW1lcyA9IGtleWZyYW1lczsKICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9uczsKICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcyA9IF9zcGVjaWFsU3R5bGVzOwogICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucyA9IFtdOwogICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMgPSBbXTsKICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy50aW1lID0gMDsKICAgICAgICAgICAgdGhpcy5wYXJlbnRQbGF5ZXIgPSBudWxsOwogICAgICAgICAgICB0aGlzLmN1cnJlbnRTbmFwc2hvdCA9IHt9OwogICAgICAgICAgICB0aGlzLl9kdXJhdGlvbiA9ICgvKiogQHR5cGUgez99ICovIChvcHRpb25zWydkdXJhdGlvbiddKSk7CiAgICAgICAgICAgIHRoaXMuX2RlbGF5ID0gKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnNbJ2RlbGF5J10pKSB8fCAwOwogICAgICAgICAgICB0aGlzLnRpbWUgPSB0aGlzLl9kdXJhdGlvbiArIHRoaXMuX2RlbGF5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uRmluaXNoKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2ZpbmlzaGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2J1aWxkUGxheWVyKCk7CiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVQbGF5ZXJCZWZvcmVTdGFydCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2J1aWxkUGxheWVyKCkgewogICAgICAgICAgICBpZiAodGhpcy5faW5pdGlhbGl6ZWQpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXlmcmFtZXMgPSB0aGlzLmtleWZyYW1lczsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmRvbVBsYXllciA9CiAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyV2ViQW5pbWF0aW9uKHRoaXMuZWxlbWVudCwga2V5ZnJhbWVzLCB0aGlzLm9wdGlvbnMpOwogICAgICAgICAgICB0aGlzLl9maW5hbEtleWZyYW1lID0ga2V5ZnJhbWVzLmxlbmd0aCA/IGtleWZyYW1lc1trZXlmcmFtZXMubGVuZ3RoIC0gMV0gOiB7fTsKICAgICAgICAgICAgdGhpcy5kb21QbGF5ZXIuYWRkRXZlbnRMaXN0ZW5lcignZmluaXNoJywgKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fb25GaW5pc2goKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3ByZXBhcmVQbGF5ZXJCZWZvcmVTdGFydCgpIHsKICAgICAgICAgICAgLy8gdGhpcyBpcyByZXF1aXJlZCBzbyB0aGF0IHRoZSBwbGF5ZXIgZG9lc24ndCBzdGFydCB0byBhbmltYXRlIHJpZ2h0IGF3YXkKICAgICAgICAgICAgaWYgKHRoaXMuX2RlbGF5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldERvbVBsYXllclN0YXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmRvbVBsYXllci5wYXVzZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3RyaWdnZXJXZWJBbmltYXRpb24oZWxlbWVudCwga2V5ZnJhbWVzLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIGpzY29tcGlsZXIgZG9lc24ndCBzZWVtIHRvIGtub3cgYW5pbWF0ZSBpcyBhIG5hdGl2ZSBwcm9wZXJ0eSBiZWNhdXNlIGl0J3Mgbm90IGZ1bGx5CiAgICAgICAgICAgIC8vIHN1cHBvcnRlZCB5ZXQgYWNyb3NzIGNvbW1vbiBicm93c2VycyAod2UgcG9seWZpbGwgaXQgZm9yIEVkZ2UvU2FmYXJpKSBbQ0wgIzE0MzYzMDkyOV0KICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChlbGVtZW50WydhbmltYXRlJ10oa2V5ZnJhbWVzLCBvcHRpb25zKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblN0YXJ0KGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMucHVzaChmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRG9uZShmbikgewogICAgICAgICAgICB0aGlzLl9vbkRvbmVGbnMucHVzaChmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRGVzdHJveShmbikgewogICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMucHVzaChmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGxheSgpIHsKICAgICAgICAgICAgdGhpcy5fYnVpbGRQbGF5ZXIoKTsKICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1N0YXJ0ZWQoKSkgewogICAgICAgICAgICAgICAgdGhpcy5fb25TdGFydEZucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGZuID0+IGZuKCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uU3RhcnRGbnMgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0YXJ0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3NwZWNpYWxTdHlsZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zcGVjaWFsU3R5bGVzLnN0YXJ0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kb21QbGF5ZXIucGxheSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhdXNlKCkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgdGhpcy5kb21QbGF5ZXIucGF1c2UoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmaW5pc2goKSB7CiAgICAgICAgICAgIHRoaXMuaW5pdCgpOwogICAgICAgICAgICBpZiAodGhpcy5fc3BlY2lhbFN0eWxlcykgewogICAgICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcy5maW5pc2goKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9vbkZpbmlzaCgpOwogICAgICAgICAgICB0aGlzLmRvbVBsYXllci5maW5pc2goKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldCgpIHsKICAgICAgICAgICAgdGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Jlc2V0RG9tUGxheWVyU3RhdGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRvbVBsYXllcikgewogICAgICAgICAgICAgICAgdGhpcy5kb21QbGF5ZXIuY2FuY2VsKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXN0YXJ0KCkgewogICAgICAgICAgICB0aGlzLnJlc2V0KCk7CiAgICAgICAgICAgIHRoaXMucGxheSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fcmVzZXREb21QbGF5ZXJTdGF0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fb25GaW5pc2goKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zcGVjaWFsU3R5bGVzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3BlY2lhbFN0eWxlcy5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBmbiA9PiBmbigpKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkRlc3Ryb3lGbnMgPSBbXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFBvc2l0aW9uKHApIHsKICAgICAgICAgICAgdGhpcy5kb21QbGF5ZXIuY3VycmVudFRpbWUgPSBwICogdGhpcy50aW1lOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBvc2l0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kb21QbGF5ZXIuY3VycmVudFRpbWUgLyB0aGlzLnRpbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHRvdGFsVGltZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RlbGF5ICsgdGhpcy5fZHVyYXRpb247CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYmVmb3JlRGVzdHJveSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB7fTsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzU3RhcnRlZCgpKSB7CiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLl9maW5hbEtleWZyYW1lKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHByb3AgIT0gJ29mZnNldCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGVzW3Byb3BdID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZpbmlzaGVkID8gdGhpcy5fZmluYWxLZXlmcmFtZVtwcm9wXSA6IGNvbXB1dGVTdHlsZSh0aGlzLmVsZW1lbnQsIHByb3ApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmN1cnJlbnRTbmFwc2hvdCA9IHN0eWxlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gcGhhc2VOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0cmlnZ2VyQ2FsbGJhY2socGhhc2VOYW1lKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0aG9kcyA9IHBoYXNlTmFtZSA9PSAnc3RhcnQnID8gdGhpcy5fb25TdGFydEZucyA6IHRoaXMuX29uRG9uZUZuczsKICAgICAgICAgICAgbWV0aG9kcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZm4gPT4gZm4oKSkpOwogICAgICAgICAgICBtZXRob2RzLmxlbmd0aCA9IDA7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvYW5pbWF0aW9ucy9icm93c2VyL3NyYy9yZW5kZXIvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnNfZHJpdmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFdlYkFuaW1hdGlvbnNEcml2ZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9pc05hdGl2ZUltcGwgPSAvXHtccypcW25hdGl2ZVxzK2NvZGVcXVxzKlx9Ly50ZXN0KGdldEVsZW1lbnRBbmltYXRlRm4oKS50b1N0cmluZygpKTsKICAgICAgICAgICAgdGhpcy5fY3NzS2V5ZnJhbWVzRHJpdmVyID0gbmV3IENzc0tleWZyYW1lc0RyaXZlcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3AKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbGlkYXRlU3R5bGVQcm9wZXJ0eShwcm9wKSB7CiAgICAgICAgICAgIHJldHVybiB2YWxpZGF0ZVN0eWxlUHJvcGVydHkocHJvcCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hdGNoZXNFbGVtZW50KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBtYXRjaGVzRWxlbWVudChlbGVtZW50LCBzZWxlY3Rvcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxtMQogICAgICAgICAqIEBwYXJhbSB7P30gZWxtMgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY29udGFpbnNFbGVtZW50KGVsbTEsIGVsbTIpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zRWxlbWVudChlbG0xLCBlbG0yKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAqIEBwYXJhbSB7P30gbXVsdGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHF1ZXJ5KGVsZW1lbnQsIHNlbGVjdG9yLCBtdWx0aSkgewogICAgICAgICAgICByZXR1cm4gaW52b2tlUXVlcnkoZWxlbWVudCwgc2VsZWN0b3IsIG11bHRpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdFZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb21wdXRlU3R5bGUoZWxlbWVudCwgcHJvcCwgZGVmYXVsdFZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZShlbGVtZW50KSkpKVtwcm9wXSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN1cHBvcnRlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3ZlcnJpZGVXZWJBbmltYXRpb25zU3VwcG9ydChzdXBwb3J0ZWQpIHsKICAgICAgICAgICAgdGhpcy5faXNOYXRpdmVJbXBsID0gc3VwcG9ydGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGtleWZyYW1lcwogICAgICAgICAqIEBwYXJhbSB7P30gZHVyYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IGRlbGF5CiAgICAgICAgICogQHBhcmFtIHs/fSBlYXNpbmcKICAgICAgICAgKiBAcGFyYW0gez89fSBwcmV2aW91c1BsYXllcnMKICAgICAgICAgKiBAcGFyYW0gez89fSBzY3J1YmJlckFjY2Vzc1JlcXVlc3RlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYW5pbWF0ZShlbGVtZW50LCBrZXlmcmFtZXMsIGR1cmF0aW9uLCBkZWxheSwgZWFzaW5nLCBwcmV2aW91c1BsYXllcnMgPSBbXSwgc2NydWJiZXJBY2Nlc3NSZXF1ZXN0ZWQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB1c2VLZXlmcmFtZXMgPSAhc2NydWJiZXJBY2Nlc3NSZXF1ZXN0ZWQgJiYgIXRoaXMuX2lzTmF0aXZlSW1wbDsKICAgICAgICAgICAgaWYgKHVzZUtleWZyYW1lcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nzc0tleWZyYW1lc0RyaXZlci5hbmltYXRlKGVsZW1lbnQsIGtleWZyYW1lcywgZHVyYXRpb24sIGRlbGF5LCBlYXNpbmcsIHByZXZpb3VzUGxheWVycyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaWxsID0gZGVsYXkgPT0gMCA/ICdib3RoJyA6ICdmb3J3YXJkcyc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxheWVyT3B0aW9ucyA9IHsgZHVyYXRpb24sIGRlbGF5LCBmaWxsIH07CiAgICAgICAgICAgIC8vIHdlIGNoZWNrIGZvciB0aGlzIHRvIGF2b2lkIGhhdmluZyBhIG51bGx8dW5kZWZpbmVkIHZhbHVlIGJlIHByZXNlbnQKICAgICAgICAgICAgLy8gZm9yIHRoZSBlYXNpbmcgKHdoaWNoIHJlc3VsdHMgaW4gYW4gZXJyb3IgZm9yIGNlcnRhaW4gYnJvd3NlcnMgIzk3NTIpCiAgICAgICAgICAgIGlmIChlYXNpbmcpIHsKICAgICAgICAgICAgICAgIHBsYXllck9wdGlvbnNbJ2Vhc2luZyddID0gZWFzaW5nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNTdHlsZXMgPSB7fTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c1dlYkFuaW1hdGlvblBsYXllcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAocHJldmlvdXNQbGF5ZXJzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGxheWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBwbGF5ZXIgPT4gcGxheWVyIGluc3RhbmNlb2YgV2ViQW5pbWF0aW9uc1BsYXllcikpKSk7CiAgICAgICAgICAgIGlmIChhbGxvd1ByZXZpb3VzUGxheWVyU3R5bGVzTWVyZ2UoZHVyYXRpb24sIGRlbGF5KSkgewogICAgICAgICAgICAgICAgcHJldmlvdXNXZWJBbmltYXRpb25QbGF5ZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwbGF5ZXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHBsYXllciA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBzdHlsZXMgPSBwbGF5ZXIuY3VycmVudFNuYXBzaG90OwogICAgICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHN0eWxlcykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBwcm9wID0+IHByZXZpb3VzU3R5bGVzW3Byb3BdID0gc3R5bGVzW3Byb3BdKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAga2V5ZnJhbWVzID0ga2V5ZnJhbWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGVzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdHlsZXMgPT4gY29weVN0eWxlcyhzdHlsZXMsIGZhbHNlKSkpOwogICAgICAgICAgICBrZXlmcmFtZXMgPSBiYWxhbmNlUHJldmlvdXNTdHlsZXNJbnRvS2V5ZnJhbWVzKGVsZW1lbnQsIGtleWZyYW1lcywgcHJldmlvdXNTdHlsZXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNwZWNpYWxTdHlsZXMgPSBwYWNrYWdlTm9uQW5pbWF0YWJsZVN0eWxlcyhlbGVtZW50LCBrZXlmcmFtZXMpOwogICAgICAgICAgICByZXR1cm4gbmV3IFdlYkFuaW1hdGlvbnNQbGF5ZXIoZWxlbWVudCwga2V5ZnJhbWVzLCBwbGF5ZXJPcHRpb25zLCBzcGVjaWFsU3R5bGVzKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cHBvcnRzV2ViQW5pbWF0aW9ucygpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIGdldEVsZW1lbnRBbmltYXRlRm4oKSA9PT0gJ2Z1bmN0aW9uJzsKICAgIH0KICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RWxlbWVudEFuaW1hdGVGbigpIHsKICAgICAgICByZXR1cm4gKGlzQnJvd3NlcigpICYmICgoLyoqIEB0eXBlIHs/fSAqLyAoRWxlbWVudCkpKS5wcm90b3R5cGVbJ2FuaW1hdGUnXSkgfHwge307CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMTIKICAgICAqIChjKSAyMDEwLTIwMjAgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvLwogICAgICogTGljZW5zZTogTUlUCiAgICAgKi8KICAgIGNsYXNzIEJyb3dzZXJBbmltYXRpb25CdWlsZGVyIGV4dGVuZHMgQW5pbWF0aW9uQnVpbGRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByb290UmVuZGVyZXIKICAgICAgICAgKiBAcGFyYW0gez99IGRvYwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHJvb3RSZW5kZXJlciwgZG9jKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX25leHRBbmltYXRpb25JZCA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHlwZURhdGEgPSAoLyoqIEB0eXBlIHs/fSAqLyAoeyBpZDogJzAnLCBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbiQxLk5vbmUsIHN0eWxlczogW10sIGRhdGE6IHsgYW5pbWF0aW9uOiBbXSB9IH0pKTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAocm9vdFJlbmRlcmVyLmNyZWF0ZVJlbmRlcmVyKGRvYy5ib2R5LCB0eXBlRGF0YSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhbmltYXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJ1aWxkKGFuaW1hdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlkID0gdGhpcy5fbmV4dEFuaW1hdGlvbklkLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHRoaXMuX25leHRBbmltYXRpb25JZCsrOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVudHJ5ID0gQXJyYXkuaXNBcnJheShhbmltYXRpb24pID8gc2VxdWVuY2UoYW5pbWF0aW9uKSA6IGFuaW1hdGlvbjsKICAgICAgICAgICAgaXNzdWVBbmltYXRpb25Db21tYW5kKHRoaXMuX3JlbmRlcmVyLCBudWxsLCBpZCwgJ3JlZ2lzdGVyJywgW2VudHJ5XSk7CiAgICAgICAgICAgIHJldHVybiBuZXcgQnJvd3NlckFuaW1hdGlvbkZhY3RvcnkoaWQsIHRoaXMuX3JlbmRlcmVyKTsKICAgICAgICB9CiAgICB9CiAgICBCcm93c2VyQW5pbWF0aW9uQnVpbGRlci7JtWZhYyA9IGZ1bmN0aW9uIEJyb3dzZXJBbmltYXRpb25CdWlsZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEJyb3dzZXJBbmltYXRpb25CdWlsZGVyKSjJtcm1aW5qZWN0KFJlbmRlcmVyRmFjdG9yeTIpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKICAgIEJyb3dzZXJBbmltYXRpb25CdWlsZGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEJyb3dzZXJBbmltYXRpb25CdWlsZGVyLCBmYWN0b3J5OiBCcm93c2VyQW5pbWF0aW9uQnVpbGRlci7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQnJvd3NlckFuaW1hdGlvbkJ1aWxkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBSZW5kZXJlckZhY3RvcnkyIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgY2xhc3MgQnJvd3NlckFuaW1hdGlvbkZhY3RvcnkgZXh0ZW5kcyBBbmltYXRpb25GYWN0b3J5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9pZAogICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2lkLCBfcmVuZGVyZXIpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faWQgPSBfaWQ7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGUoZWxlbWVudCwgb3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gbmV3IFJlbmRlcmVyQW5pbWF0aW9uUGxheWVyKHRoaXMuX2lkLCBlbGVtZW50LCBvcHRpb25zIHx8IHt9LCB0aGlzLl9yZW5kZXJlcik7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgUmVuZGVyZXJBbmltYXRpb25QbGF5ZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IF9yZW5kZXJlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGlkLCBlbGVtZW50LCBvcHRpb25zLCBfcmVuZGVyZXIpIHsKICAgICAgICAgICAgdGhpcy5pZCA9IGlkOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICAgICAgdGhpcy5wYXJlbnRQbGF5ZXIgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9zdGFydGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMudG90YWxUaW1lID0gMDsKICAgICAgICAgICAgdGhpcy5fY29tbWFuZCgnY3JlYXRlJywgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbGlzdGVuKGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVyLmxpc3Rlbih0aGlzLmVsZW1lbnQsIGBAQCR7dGhpcy5pZH06JHtldmVudE5hbWV9YCwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY29tbWFuZAogICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NvbW1hbmQoY29tbWFuZCwgLi4uYXJncykgewogICAgICAgICAgICByZXR1cm4gaXNzdWVBbmltYXRpb25Db21tYW5kKHRoaXMuX3JlbmRlcmVyLCB0aGlzLmVsZW1lbnQsIHRoaXMuaWQsIGNvbW1hbmQsIGFyZ3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRvbmUoZm4pIHsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuKCdkb25lJywgZm4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblN0YXJ0KGZuKSB7CiAgICAgICAgICAgIHRoaXMuX2xpc3Rlbignc3RhcnQnLCBmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRGVzdHJveShmbikgewogICAgICAgICAgICB0aGlzLl9saXN0ZW4oJ2Rlc3Ryb3knLCBmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5fY29tbWFuZCgnaW5pdCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc1N0YXJ0ZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGFydGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBsYXkoKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbW1hbmQoJ3BsYXknKTsKICAgICAgICAgICAgdGhpcy5fc3RhcnRlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGF1c2UoKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbW1hbmQoJ3BhdXNlJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzdGFydCgpIHsKICAgICAgICAgICAgdGhpcy5fY29tbWFuZCgncmVzdGFydCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpbmlzaCgpIHsKICAgICAgICAgICAgdGhpcy5fY29tbWFuZCgnZmluaXNoJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fY29tbWFuZCgnZGVzdHJveScpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc2V0KCkgewogICAgICAgICAgICB0aGlzLl9jb21tYW5kKCdyZXNldCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFBvc2l0aW9uKHApIHsKICAgICAgICAgICAgdGhpcy5fY29tbWFuZCgnc2V0UG9zaXRpb24nLCBwKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRQb3NpdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlbmRlcmVyCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAqIEBwYXJhbSB7P30gY29tbWFuZAogICAgICogQHBhcmFtIHs/fSBhcmdzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc3N1ZUFuaW1hdGlvbkNvbW1hbmQocmVuZGVyZXIsIGVsZW1lbnQsIGlkLCBjb21tYW5kLCBhcmdzKSB7CiAgICAgICAgcmV0dXJuIHJlbmRlcmVyLnNldFByb3BlcnR5KGVsZW1lbnQsIGBAQCR7aWR9OiR7Y29tbWFuZH1gLCBhcmdzKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL3BsYXRmb3JtLWJyb3dzZXIvYW5pbWF0aW9ucy9zcmMvYW5pbWF0aW9uX3JlbmRlcmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEFOSU1BVElPTl9QUkVGSVggPSAnQCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBESVNBQkxFX0FOSU1BVElPTlNfRkxBRyA9ICdALmRpc2FibGVkJzsKICAgIGNsYXNzIEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxlZ2F0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZW5naW5lCiAgICAgICAgICogQHBhcmFtIHs/fSBfem9uZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRlbGVnYXRlLCBlbmdpbmUsIF96b25lKSB7CiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKICAgICAgICAgICAgdGhpcy5lbmdpbmUgPSBlbmdpbmU7CiAgICAgICAgICAgIHRoaXMuX3pvbmUgPSBfem9uZTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudElkID0gMDsKICAgICAgICAgICAgdGhpcy5fbWljcm90YXNrSWQgPSAxOwogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXIgPSBbXTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXJDYWNoZSA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5fY2RSZWN1ckRlcHRoID0gMDsKICAgICAgICAgICAgdGhpcy5wcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKDApOwogICAgICAgICAgICBlbmdpbmUub25SZW1vdmFsQ29tcGxldGUgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlbGVnYXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZWxlbWVudCwgZGVsZWdhdGUpID0+IHsKICAgICAgICAgICAgICAgIC8vIE5vdGU6IGlmIGFuIGNvbXBvbmVudCBlbGVtZW50IGhhcyBhIGxlYXZlIGFuaW1hdGlvbiwgYW5kIHRoZSBjb21wb25lbnQKICAgICAgICAgICAgICAgIC8vIGEgaG9zdCBsZWF2ZSBhbmltYXRpb24sIHRoZSB2aWV3IGVuZ2luZSB3aWxsIGNhbGwgYHJlbW92ZUNoaWxkYCBmb3IgdGhlIHBhcmVudAogICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IHJlbmRlcmVyIGFzIHdlbGwgYXMgZm9yIHRoZSBjaGlsZCBjb21wb25lbnQgcmVuZGVyZXIuCiAgICAgICAgICAgICAgICAvLyBUaGVyZWZvcmUsIHdlIG5lZWQgdG8gY2hlY2sgaWYgd2UgYWxyZWFkeSByZW1vdmVkIHRoZSBlbGVtZW50LgogICAgICAgICAgICAgICAgaWYgKGRlbGVnYXRlICYmIGRlbGVnYXRlLnBhcmVudE5vZGUoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBkZWxlZ2F0ZS5yZW1vdmVDaGlsZChlbGVtZW50LnBhcmVudE5vZGUsIGVsZW1lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBob3N0RWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlUmVuZGVyZXIoaG9zdEVsZW1lbnQsIHR5cGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBFTVBUWV9OQU1FU1BBQ0VfSUQgPSAnJzsKICAgICAgICAgICAgLy8gY2FjaGUgdGhlIGRlbGVnYXRlcyB0byBmaW5kIG91dCB3aGljaCBjYWNoZWQgZGVsZWdhdGUgY2FuCiAgICAgICAgICAgIC8vIGJlIHVzZWQgYnkgd2hpY2ggY2FjaGVkIHJlbmRlcmVyCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVsZWdhdGUgPSB0aGlzLmRlbGVnYXRlLmNyZWF0ZVJlbmRlcmVyKGhvc3RFbGVtZW50LCB0eXBlKTsKICAgICAgICAgICAgaWYgKCFob3N0RWxlbWVudCB8fCAhdHlwZSB8fCAhdHlwZS5kYXRhIHx8ICF0eXBlLmRhdGFbJ2FuaW1hdGlvbiddKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcmVuZGVyZXIgPSB0aGlzLl9yZW5kZXJlckNhY2hlLmdldChkZWxlZ2F0ZSk7CiAgICAgICAgICAgICAgICBpZiAoIXJlbmRlcmVyKSB7CiAgICAgICAgICAgICAgICAgICAgcmVuZGVyZXIgPSBuZXcgQmFzZUFuaW1hdGlvblJlbmRlcmVyKEVNUFRZX05BTUVTUEFDRV9JRCwgZGVsZWdhdGUsIHRoaXMuZW5naW5lKTsKICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IGNhY2hlIHRoaXMgcmVzdWx0IHdoZW4gdGhlIGJhc2UgcmVuZGVyZXIgaXMgdXNlZAogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyQ2FjaGUuc2V0KGRlbGVnYXRlLCByZW5kZXJlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gcmVuZGVyZXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRJZCA9IHR5cGUuaWQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmFtZXNwYWNlSWQgPSB0eXBlLmlkICsgJy0nICsgdGhpcy5fY3VycmVudElkOwogICAgICAgICAgICB0aGlzLl9jdXJyZW50SWQrKzsKICAgICAgICAgICAgdGhpcy5lbmdpbmUucmVnaXN0ZXIobmFtZXNwYWNlSWQsIGhvc3RFbGVtZW50KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWdpc3RlclRyaWdnZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHRyaWdnZXIpID0+IHsKICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRyaWdnZXIpKSB7CiAgICAgICAgICAgICAgICAgICAgdHJpZ2dlci5mb3JFYWNoKHJlZ2lzdGVyVHJpZ2dlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5yZWdpc3RlclRyaWdnZXIoY29tcG9uZW50SWQsIG5hbWVzcGFjZUlkLCBob3N0RWxlbWVudCwgdHJpZ2dlci5uYW1lLCB0cmlnZ2VyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYW5pbWF0aW9uVHJpZ2dlcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodHlwZS5kYXRhWydhbmltYXRpb24nXSkpOwogICAgICAgICAgICBhbmltYXRpb25UcmlnZ2Vycy5mb3JFYWNoKHJlZ2lzdGVyVHJpZ2dlcik7CiAgICAgICAgICAgIHJldHVybiBuZXcgQW5pbWF0aW9uUmVuZGVyZXIodGhpcywgbmFtZXNwYWNlSWQsIGRlbGVnYXRlLCB0aGlzLmVuZ2luZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYmVnaW4oKSB7CiAgICAgICAgICAgIHRoaXMuX2NkUmVjdXJEZXB0aCsrOwogICAgICAgICAgICBpZiAodGhpcy5kZWxlZ2F0ZS5iZWdpbikgewogICAgICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5iZWdpbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2NoZWR1bGVDb3VudFRhc2soKSB7CiAgICAgICAgICAgIC8vIGFsd2F5cyB1c2UgcHJvbWlzZSB0byBzY2hlZHVsZSBtaWNyb3Rhc2sgaW5zdGVhZCBvZiB1c2UgWm9uZQogICAgICAgICAgICB0aGlzLnByb21pc2UudGhlbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9taWNyb3Rhc2tJZCsrOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGNvdW50CiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2NoZWR1bGVMaXN0ZW5lckNhbGxiYWNrKGNvdW50LCBmbiwgZGF0YSkgewogICAgICAgICAgICBpZiAoY291bnQgPj0gMCAmJiBjb3VudCA8IHRoaXMuX21pY3JvdGFza0lkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl96b25lLnJ1bigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBmbihkYXRhKSkpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9hbmltYXRpb25DYWxsYmFja3NCdWZmZXIubGVuZ3RoID09IDApIHsKICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl96b25lLnJ1bigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkNhbGxiYWNrc0J1ZmZlci5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0dXBsZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgW2ZuLCBkYXRhXSA9IHR1cGxlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm4oZGF0YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uQ2FsbGJhY2tzQnVmZmVyID0gW107CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkNhbGxiYWNrc0J1ZmZlci5wdXNoKFtmbiwgZGF0YV0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVuZCgpIHsKICAgICAgICAgICAgdGhpcy5fY2RSZWN1ckRlcHRoLS07CiAgICAgICAgICAgIC8vIHRoaXMgaXMgdG8gcHJldmVudCBhbmltYXRpb25zIGZyb20gcnVubmluZyB0d2ljZSB3aGVuIGFuIGlubmVyCiAgICAgICAgICAgIC8vIGNvbXBvbmVudCBkb2VzIENEIHdoZW4gYSBwYXJlbnQgY29tcG9uZW50IGluc3RlYWQgaGFzIGluc2VydGVkIGl0CiAgICAgICAgICAgIGlmICh0aGlzLl9jZFJlY3VyRGVwdGggPT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fem9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2NoZWR1bGVDb3VudFRhc2soKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVuZ2luZS5mbHVzaCh0aGlzLl9taWNyb3Rhc2tJZCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZGVsZWdhdGUuZW5kKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlLmVuZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd2hlblJlbmRlcmluZ0RvbmUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVuZ2luZS53aGVuUmVuZGVyaW5nRG9uZSgpOwogICAgICAgIH0KICAgIH0KICAgIEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeS7JtWZhYyA9IGZ1bmN0aW9uIEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbmltYXRpb25SZW5kZXJlckZhY3RvcnkpKMm1ybVpbmplY3QoUmVuZGVyZXJGYWN0b3J5MiksIMm1ybVpbmplY3QoQW5pbWF0aW9uRW5naW5lKSwgybXJtWluamVjdChOZ1pvbmUpKTsgfTsKICAgIEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBbmltYXRpb25SZW5kZXJlckZhY3RvcnksIGZhY3Rvcnk6IEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeS7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQW5pbWF0aW9uUmVuZGVyZXJGYWN0b3J5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogUmVuZGVyZXJGYWN0b3J5MiB9LAogICAgICAgIHsgdHlwZTogQW5pbWF0aW9uRW5naW5lIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfQogICAgXTsKICAgIGNsYXNzIEJhc2VBbmltYXRpb25SZW5kZXJlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2VJZAogICAgICAgICAqIEBwYXJhbSB7P30gZGVsZWdhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVuZ2luZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG5hbWVzcGFjZUlkLCBkZWxlZ2F0ZSwgZW5naW5lKSB7CiAgICAgICAgICAgIHRoaXMubmFtZXNwYWNlSWQgPSBuYW1lc3BhY2VJZDsKICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwogICAgICAgICAgICB0aGlzLmVuZ2luZSA9IGVuZ2luZTsKICAgICAgICAgICAgdGhpcy5kZXN0cm95Tm9kZSA9IHRoaXMuZGVsZWdhdGUuZGVzdHJveU5vZGUgPyAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG4pID0+ICgvKiogQHR5cGUgez99ICovIChkZWxlZ2F0ZS5kZXN0cm95Tm9kZSkpKG4pKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRhdGEoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmRhdGE7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGVzdHJveSh0aGlzLm5hbWVzcGFjZUlkLCB0aGlzLmRlbGVnYXRlKTsKICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5kZXN0cm95KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUuY3JlYXRlRWxlbWVudChuYW1lLCBuYW1lc3BhY2UpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVDb21tZW50KHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZUNvbW1lbnQodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVUZXh0KHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmNyZWF0ZVRleHQodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAqIEBwYXJhbSB7P30gbmV3Q2hpbGQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGVuZENoaWxkKHBhcmVudCwgbmV3Q2hpbGQpIHsKICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5hcHBlbmRDaGlsZChwYXJlbnQsIG5ld0NoaWxkKTsKICAgICAgICAgICAgdGhpcy5lbmdpbmUub25JbnNlcnQodGhpcy5uYW1lc3BhY2VJZCwgbmV3Q2hpbGQsIHBhcmVudCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAqIEBwYXJhbSB7P30gbmV3Q2hpbGQKICAgICAgICAgKiBAcGFyYW0gez99IHJlZkNoaWxkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpIHsKICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5pbnNlcnRCZWZvcmUocGFyZW50LCBuZXdDaGlsZCwgcmVmQ2hpbGQpOwogICAgICAgICAgICB0aGlzLmVuZ2luZS5vbkluc2VydCh0aGlzLm5hbWVzcGFjZUlkLCBuZXdDaGlsZCwgcGFyZW50LCB0cnVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG9sZENoaWxkCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0hvc3RFbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVDaGlsZChwYXJlbnQsIG9sZENoaWxkLCBpc0hvc3RFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuZW5naW5lLm9uUmVtb3ZlKHRoaXMubmFtZXNwYWNlSWQsIG9sZENoaWxkLCB0aGlzLmRlbGVnYXRlLCBpc0hvc3RFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3Rvck9yTm9kZQogICAgICAgICAqIEBwYXJhbSB7Pz19IHByZXNlcnZlQ29udGVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2VsZWN0Um9vdEVsZW1lbnQoc2VsZWN0b3JPck5vZGUsIHByZXNlcnZlQ29udGVudCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5zZWxlY3RSb290RWxlbWVudChzZWxlY3Rvck9yTm9kZSwgcHJlc2VydmVDb250ZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXJlbnROb2RlKG5vZGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGVsZWdhdGUucGFyZW50Tm9kZShub2RlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZXh0U2libGluZyhub2RlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLm5leHRTaWJsaW5nKG5vZGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0QXR0cmlidXRlKGVsLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKSB7CiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuc2V0QXR0cmlidXRlKGVsLCBuYW1lLCB2YWx1ZSwgbmFtZXNwYWNlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbAogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7Pz19IG5hbWVzcGFjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlQXR0cmlidXRlKGVsLCBuYW1lLCBuYW1lc3BhY2UpIHsKICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5yZW1vdmVBdHRyaWJ1dGUoZWwsIG5hbWUsIG5hbWVzcGFjZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZENsYXNzKGVsLCBuYW1lKSB7CiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuYWRkQ2xhc3MoZWwsIG5hbWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVDbGFzcyhlbCwgbmFtZSkgewogICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnJlbW92ZUNsYXNzKGVsLCBuYW1lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbAogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmxhZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFN0eWxlKGVsLCBzdHlsZSwgdmFsdWUsIGZsYWdzKSB7CiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUuc2V0U3R5bGUoZWwsIHN0eWxlLCB2YWx1ZSwgZmxhZ3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsCiAgICAgICAgICogQHBhcmFtIHs/fSBzdHlsZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGZsYWdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVTdHlsZShlbCwgc3R5bGUsIGZsYWdzKSB7CiAgICAgICAgICAgIHRoaXMuZGVsZWdhdGUucmVtb3ZlU3R5bGUoZWwsIHN0eWxlLCBmbGFncyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09IEFOSU1BVElPTl9QUkVGSVggJiYgbmFtZSA9PSBESVNBQkxFX0FOSU1BVElPTlNfRkxBRykgewogICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlQW5pbWF0aW9ucyhlbCwgISF2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWUobm9kZSwgdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5kZWxlZ2F0ZS5zZXRWYWx1ZShub2RlLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudE5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsaXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRlbGVnYXRlLmxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZUFuaW1hdGlvbnMoZWxlbWVudCwgdmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5lbmdpbmUuZGlzYWJsZUFuaW1hdGlvbnMoZWxlbWVudCwgdmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIEFuaW1hdGlvblJlbmRlcmVyIGV4dGVuZHMgQmFzZUFuaW1hdGlvblJlbmRlcmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhY3RvcnkKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZUlkCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWxlZ2F0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZW5naW5lCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZmFjdG9yeSwgbmFtZXNwYWNlSWQsIGRlbGVnYXRlLCBlbmdpbmUpIHsKICAgICAgICAgICAgc3VwZXIobmFtZXNwYWNlSWQsIGRlbGVnYXRlLCBlbmdpbmUpOwogICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwogICAgICAgICAgICB0aGlzLm5hbWVzcGFjZUlkID0gbmFtZXNwYWNlSWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRQcm9wZXJ0eShlbCwgbmFtZSwgdmFsdWUpIHsKICAgICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09IEFOSU1BVElPTl9QUkVGSVgpIHsKICAgICAgICAgICAgICAgIGlmIChuYW1lLmNoYXJBdCgxKSA9PSAnLicgJiYgbmFtZSA9PSBESVNBQkxFX0FOSU1BVElPTlNfRkxBRykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgPT09IHVuZGVmaW5lZCA/IHRydWUgOiAhIXZhbHVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlzYWJsZUFuaW1hdGlvbnMoZWwsICgvKiogQHR5cGUgez99ICovICh2YWx1ZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZW5naW5lLnByb2Nlc3ModGhpcy5uYW1lc3BhY2VJZCwgZWwsIG5hbWUuc3Vic3RyKDEpLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmRlbGVnYXRlLnNldFByb3BlcnR5KGVsLCBuYW1lLCB2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50TmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxpc3Rlbih0YXJnZXQsIGV2ZW50TmFtZSwgY2FsbGJhY2spIHsKICAgICAgICAgICAgaWYgKGV2ZW50TmFtZS5jaGFyQXQoMCkgPT0gQU5JTUFUSU9OX1BSRUZJWCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHJlc29sdmVFbGVtZW50RnJvbVRhcmdldCh0YXJnZXQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG5hbWUgPSBldmVudE5hbWUuc3Vic3RyKDEpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHBoYXNlID0gJyc7CiAgICAgICAgICAgICAgICAvLyBAbGlzdGVuZXIucGhhc2UgaXMgZm9yIHRyaWdnZXIgYW5pbWF0aW9uIGNhbGxiYWNrcwogICAgICAgICAgICAgICAgLy8gQEBsaXN0ZW5lciBpcyBmb3IgYW5pbWF0aW9uIGJ1aWxkZXIgY2FsbGJhY2tzCiAgICAgICAgICAgICAgICBpZiAobmFtZS5jaGFyQXQoMCkgIT0gQU5JTUFUSU9OX1BSRUZJWCkgewogICAgICAgICAgICAgICAgICAgIFtuYW1lLCBwaGFzZV0gPSBwYXJzZVRyaWdnZXJDYWxsYmFja05hbWUobmFtZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5lbmdpbmUubGlzdGVuKHRoaXMubmFtZXNwYWNlSWQsIGVsZW1lbnQsIG5hbWUsIHBoYXNlLCAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvdW50SWQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50KSkpWydfZGF0YSddIHx8IC0xOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZmFjdG9yeS5zY2hlZHVsZUxpc3RlbmVyQ2FsbGJhY2soY291bnRJZCwgY2FsbGJhY2ssIGV2ZW50KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5kZWxlZ2F0ZS5saXN0ZW4odGFyZ2V0LCBldmVudE5hbWUsIGNhbGxiYWNrKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlRWxlbWVudEZyb21UYXJnZXQodGFyZ2V0KSB7CiAgICAgICAgc3dpdGNoICh0YXJnZXQpIHsKICAgICAgICAgICAgY2FzZSAnYm9keSc6CiAgICAgICAgICAgICAgICByZXR1cm4gZG9jdW1lbnQuYm9keTsKICAgICAgICAgICAgY2FzZSAnZG9jdW1lbnQnOgogICAgICAgICAgICAgICAgcmV0dXJuIGRvY3VtZW50OwogICAgICAgICAgICBjYXNlICd3aW5kb3cnOgogICAgICAgICAgICAgICAgcmV0dXJuIHdpbmRvdzsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiB0YXJnZXQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRyaWdnZXJOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZVRyaWdnZXJDYWxsYmFja05hbWUodHJpZ2dlck5hbWUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZG90SW5kZXggPSB0cmlnZ2VyTmFtZS5pbmRleE9mKCcuJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRyaWdnZXIgPSB0cmlnZ2VyTmFtZS5zdWJzdHJpbmcoMCwgZG90SW5kZXgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwaGFzZSA9IHRyaWdnZXJOYW1lLnN1YnN0cihkb3RJbmRleCArIDEpOwogICAgICAgIHJldHVybiBbdHJpZ2dlciwgcGhhc2VdOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvcGxhdGZvcm0tYnJvd3Nlci9hbmltYXRpb25zL3NyYy9wcm92aWRlcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZSBleHRlbmRzIEFuaW1hdGlvbkVuZ2luZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2MKICAgICAgICAgKiBAcGFyYW0gez99IGRyaXZlcgogICAgICAgICAqIEBwYXJhbSB7P30gbm9ybWFsaXplcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRvYywgZHJpdmVyLCBub3JtYWxpemVyKSB7CiAgICAgICAgICAgIHN1cGVyKGRvYy5ib2R5LCBkcml2ZXIsIG5vcm1hbGl6ZXIpOwogICAgICAgIH0KICAgIH0KICAgIEluamVjdGFibGVBbmltYXRpb25FbmdpbmUuybVmYWMgPSBmdW5jdGlvbiBJbmplY3RhYmxlQW5pbWF0aW9uRW5naW5lX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluamVjdGFibGVBbmltYXRpb25FbmdpbmUpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoQW5pbWF0aW9uRHJpdmVyKSwgybXJtWluamVjdChBbmltYXRpb25TdHlsZU5vcm1hbGl6ZXIpKTsgfTsKICAgIEluamVjdGFibGVBbmltYXRpb25FbmdpbmUuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZSwgZmFjdG9yeTogSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZS7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBBbmltYXRpb25Ecml2ZXIgfSwKICAgICAgICB7IHR5cGU6IEFuaW1hdGlvblN0eWxlTm9ybWFsaXplciB9CiAgICBdOwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZVN1cHBvcnRlZEFuaW1hdGlvbkRyaXZlcigpIHsKICAgICAgICByZXR1cm4gc3VwcG9ydHNXZWJBbmltYXRpb25zKCkgPyBuZXcgV2ViQW5pbWF0aW9uc0RyaXZlcigpIDogbmV3IENzc0tleWZyYW1lc0RyaXZlcigpOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbnN0YW50aWF0ZURlZmF1bHRTdHlsZU5vcm1hbGl6ZXIoKSB7CiAgICAgICAgcmV0dXJuIG5ldyBXZWJBbmltYXRpb25zU3R5bGVOb3JtYWxpemVyKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVuZGVyZXIKICAgICAqIEBwYXJhbSB7P30gZW5naW5lCiAgICAgKiBAcGFyYW0gez99IHpvbmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGluc3RhbnRpYXRlUmVuZGVyZXJGYWN0b3J5KHJlbmRlcmVyLCBlbmdpbmUsIHpvbmUpIHsKICAgICAgICByZXR1cm4gbmV3IEFuaW1hdGlvblJlbmRlcmVyRmFjdG9yeShyZW5kZXJlciwgZW5naW5lLCB6b25lKTsKICAgIH0KICAgIC8qKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBBTklNQVRJT05fTU9EVUxFX1RZUEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0FuaW1hdGlvbk1vZHVsZVR5cGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNIQVJFRF9BTklNQVRJT05fUFJPVklERVJTID0gWwogICAgICAgIHsgcHJvdmlkZTogQW5pbWF0aW9uQnVpbGRlciwgdXNlQ2xhc3M6IEJyb3dzZXJBbmltYXRpb25CdWlsZGVyIH0sCiAgICAgICAgeyBwcm92aWRlOiBBbmltYXRpb25TdHlsZU5vcm1hbGl6ZXIsIHVzZUZhY3Rvcnk6IGluc3RhbnRpYXRlRGVmYXVsdFN0eWxlTm9ybWFsaXplciB9LAogICAgICAgIHsgcHJvdmlkZTogQW5pbWF0aW9uRW5naW5lLCB1c2VDbGFzczogSW5qZWN0YWJsZUFuaW1hdGlvbkVuZ2luZSB9LCB7CiAgICAgICAgICAgIHByb3ZpZGU6IFJlbmRlcmVyRmFjdG9yeTIsCiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGluc3RhbnRpYXRlUmVuZGVyZXJGYWN0b3J5LAogICAgICAgICAgICBkZXBzOiBbRG9tUmVuZGVyZXJGYWN0b3J5MiwgQW5pbWF0aW9uRW5naW5lLCBOZ1pvbmVdCiAgICAgICAgfQogICAgXTsKICAgIC8qKgogICAgICogU2VwYXJhdGUgcHJvdmlkZXJzIGZyb20gdGhlIGFjdHVhbCBtb2R1bGUgc28gdGhhdCB3ZSBjYW4gZG8gYSBsb2NhbCBtb2RpZmljYXRpb24gaW4gR29vZ2xlMyB0bwogICAgICogaW5jbHVkZSB0aGVtIGluIHRoZSBCcm93c2VyTW9kdWxlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEJST1dTRVJfQU5JTUFUSU9OU19QUk9WSURFUlMgPSBbCiAgICAgICAgeyBwcm92aWRlOiBBbmltYXRpb25Ecml2ZXIsIHVzZUZhY3Rvcnk6IGluc3RhbnRpYXRlU3VwcG9ydGVkQW5pbWF0aW9uRHJpdmVyIH0sCiAgICAgICAgeyBwcm92aWRlOiBBTklNQVRJT05fTU9EVUxFX1RZUEUsIHVzZVZhbHVlOiAnQnJvd3NlckFuaW1hdGlvbnMnIH0sIC4uLlNIQVJFRF9BTklNQVRJT05fUFJPVklERVJTCiAgICBdOwogICAgLyoqCiAgICAgKiBTZXBhcmF0ZSBwcm92aWRlcnMgZnJvbSB0aGUgYWN0dWFsIG1vZHVsZSBzbyB0aGF0IHdlIGNhbiBkbyBhIGxvY2FsIG1vZGlmaWNhdGlvbiBpbiBHb29nbGUzIHRvCiAgICAgKiBpbmNsdWRlIHRoZW0gaW4gdGhlIEJyb3dzZXJUZXN0aW5nTW9kdWxlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEJST1dTRVJfTk9PUF9BTklNQVRJT05TX1BST1ZJREVSUyA9IFsKICAgICAgICB7IHByb3ZpZGU6IEFuaW1hdGlvbkRyaXZlciwgdXNlQ2xhc3M6IE5vb3BBbmltYXRpb25Ecml2ZXIgfSwKICAgICAgICB7IHByb3ZpZGU6IEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgdXNlVmFsdWU6ICdOb29wQW5pbWF0aW9ucycgfSwgLi4uU0hBUkVEX0FOSU1BVElPTl9QUk9WSURFUlMKICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9wbGF0Zm9ybS1icm93c2VyL2FuaW1hdGlvbnMvc3JjL21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEV4cG9ydHMgYEJyb3dzZXJNb2R1bGVgIHdpdGggYWRkaXRpb25hbCBbZGVwZW5kZW5jeS1pbmplY3Rpb24gcHJvdmlkZXJzXShndWlkZS9nbG9zc2FyeSNwcm92aWRlcikKICAgICAqIGZvciB1c2Ugd2l0aCBhbmltYXRpb25zLiBTZWUgW0FuaW1hdGlvbnNdKGd1aWRlL2FuaW1hdGlvbnMpLgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUgewogICAgfQogICAgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSB9KTsKICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJvd3NlckFuaW1hdGlvbnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogQlJPV1NFUl9BTklNQVRJT05TX1BST1ZJREVSUywgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQnJvd3NlckFuaW1hdGlvbnNNb2R1bGUsIHsgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0Jyb3dzZXJNb2R1bGVdOyB9IH0pOyB9KSgpOwogICAgLyoqCiAgICAgKiBBIG51bGwgcGxheWVyIHRoYXQgbXVzdCBiZSBpbXBvcnRlZCB0byBhbGxvdyBkaXNhYmxpbmcgb2YgYW5pbWF0aW9ucy4KICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIE5vb3BBbmltYXRpb25zTW9kdWxlIHsKICAgIH0KICAgIE5vb3BBbmltYXRpb25zTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTm9vcEFuaW1hdGlvbnNNb2R1bGUgfSk7CiAgICBOb29wQW5pbWF0aW9uc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE5vb3BBbmltYXRpb25zTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5vb3BBbmltYXRpb25zTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IEJST1dTRVJfTk9PUF9BTklNQVRJT05TX1BST1ZJREVSUywgaW1wb3J0czogW0Jyb3dzZXJNb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTm9vcEFuaW1hdGlvbnNNb2R1bGUsIHsgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0Jyb3dzZXJNb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UgTmdSeCA5LjIuMAogICAgICogKGMpIDIwMTUtMjAxOCBCcmFuZG9uIFJvYmVydHMsIE1pa2UgUnlhbiwgUm9iIFdvcm1hbGQsIFZpY3RvciBTYXZraW4KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCiAgICBsZXQgUkVHSVNURVJFRF9BQ1RJT05fVFlQRVMgPSB7fTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL2FjdGlvbl9jcmVhdG9yLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQ3JlYXRlcyBhIGNvbmZpZ3VyZWQgYENyZWF0b3JgIGZ1bmN0aW9uIHRoYXQsIHdoZW4gY2FsbGVkLCByZXR1cm5zIGFuIG9iamVjdCBpbiB0aGUgc2hhcGUgb2YgdGhlIGBBY3Rpb25gIGludGVyZmFjZS4KICAgICAqCiAgICAgKiBBY3Rpb24gY3JlYXRvcnMgcmVkdWNlIHRoZSBleHBsaWNpdG5lc3Mgb2YgY2xhc3MtYmFzZWQgYWN0aW9uIGNyZWF0b3JzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICoqRGVjbGFyaW5nIGFuIGFjdGlvbiBjcmVhdG9yKioKICAgICAqCiAgICAgKiBXaXRob3V0IGFkZGl0aW9uYWwgbWV0YWRhdGE6CiAgICAgKiBgYGB0cwogICAgICogZXhwb3J0IGNvbnN0IGluY3JlbWVudCA9IGNyZWF0ZUFjdGlvbignW0NvdW50ZXJdIEluY3JlbWVudCcpOwogICAgICogYGBgCiAgICAgKiBXaXRoIGFkZGl0aW9uYWwgbWV0YWRhdGE6CiAgICAgKiBgYGB0cwogICAgICogZXhwb3J0IGNvbnN0IGxvZ2luU3VjY2VzcyA9IGNyZWF0ZUFjdGlvbigKICAgICAqICAgJ1tBdXRoL0FQSV0gTG9naW4gU3VjY2VzcycsCiAgICAgKiAgIHByb3BzPHsgdXNlcjogVXNlciB9PigpCiAgICAgKiApOwogICAgICogYGBgCiAgICAgKiBXaXRoIGEgZnVuY3Rpb246CiAgICAgKiBgYGB0cwogICAgICogZXhwb3J0IGNvbnN0IGxvZ2luU3VjY2VzcyA9IGNyZWF0ZUFjdGlvbigKICAgICAqICAgJ1tBdXRoL0FQSV0gTG9naW4gU3VjY2VzcycsCiAgICAgKiAgIChyZXNwb25zZTogUmVzcG9uc2UpID0+IHJlc3BvbnNlLnVzZXIKICAgICAqICk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAqKkRpc3BhdGNoaW5nIGFuIGFjdGlvbioqCiAgICAgKgogICAgICogV2l0aG91dCBhZGRpdGlvbmFsIG1ldGFkYXRhOgogICAgICogYGBgdHMKICAgICAqIHN0b3JlLmRpc3BhdGNoKGluY3JlbWVudCgpKTsKICAgICAqIGBgYAogICAgICogV2l0aCBhZGRpdGlvbmFsIG1ldGFkYXRhOgogICAgICogYGBgdHMKICAgICAqIHN0b3JlLmRpc3BhdGNoKGxvZ2luU3VjY2Vzcyh7IHVzZXI6IG5ld1VzZXIgfSkpOwogICAgICogYGBgCiAgICAgKgogICAgICogKipSZWZlcmVuY2luZyBhbiBhY3Rpb24gaW4gYSByZWR1Y2VyKioKICAgICAqCiAgICAgKiBVc2luZyBhIHN3aXRjaCBzdGF0ZW1lbnQ6CiAgICAgKiBgYGB0cwogICAgICogc3dpdGNoIChhY3Rpb24udHlwZSkgewogICAgICogICAvLyAuLi4KICAgICAqICAgY2FzZSBBdXRoQXBpQWN0aW9ucy5sb2dpblN1Y2Nlc3MudHlwZTogewogICAgICogICAgIHJldHVybiB7CiAgICAgKiAgICAgICAuLi5zdGF0ZSwKICAgICAqICAgICAgIHVzZXI6IGFjdGlvbi51c2VyCiAgICAgKiAgICAgfTsKICAgICAqICAgfQogICAgICogfQogICAgICogYGBgCiAgICAgKiBVc2luZyBhIHJlZHVjZXIgY3JlYXRvcjoKICAgICAqIGBgYHRzCiAgICAgKiBvbihBdXRoQXBpQWN0aW9ucy5sb2dpblN1Y2Nlc3MsIChzdGF0ZSwgeyB1c2VyIH0pID0+ICh7IC4uLnN0YXRlLCB1c2VyIH0pKQogICAgICogYGBgCiAgICAgKgogICAgICogICoqUmVmZXJlbmNpbmcgYW4gYWN0aW9uIGluIGFuIGVmZmVjdCoqCiAgICAgKiBgYGB0cwogICAgICogZWZmZWN0TmFtZSQgPSBjcmVhdGVFZmZlY3QoCiAgICAgKiAgICgpID0+IHRoaXMuYWN0aW9ucyQucGlwZSgKICAgICAqICAgICBvZlR5cGUoQXV0aEFwaUFjdGlvbnMubG9naW5TdWNjZXNzKSwKICAgICAqICAgICAvLyAuLi4KICAgICAqICAgKQogICAgICogKTsKICAgICAqIGBgYAogICAgICogQHRlbXBsYXRlIFQsIEMKICAgICAqIEBwYXJhbSB7P30gdHlwZSBEZXNjcmliZXMgdGhlIGFjdGlvbiB0aGF0IHdpbGwgYmUgZGlzcGF0Y2hlZAogICAgICogQHBhcmFtIHs/PX0gY29uZmlnIEFkZGl0aW9uYWwgbWV0YWRhdGEgbmVlZGVkIGZvciB0aGUgaGFuZGxpbmcgb2YgdGhlIGFjdGlvbi4gIFNlZSB7XEBsaW5rIGNyZWF0ZUFjdGlvbiN1c2FnZS1ub3RlcyBVc2FnZSBOb3Rlc30uCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlQWN0aW9uKHR5cGUsIGNvbmZpZykgewogICAgICAgIFJFR0lTVEVSRURfQUNUSU9OX1RZUEVTW3R5cGVdID0gKFJFR0lTVEVSRURfQUNUSU9OX1RZUEVTW3R5cGVdIHx8IDApICsgMTsKICAgICAgICBpZiAodHlwZW9mIGNvbmZpZyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZSh0eXBlLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKC4uLmFyZ3MpID0+IChPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGNvbmZpZyguLi5hcmdzKSksIHsgdHlwZSB9KSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFzID0gY29uZmlnID8gY29uZmlnLl9hcyA6ICdlbXB0eSc7CiAgICAgICAgc3dpdGNoIChhcykgewogICAgICAgICAgICBjYXNlICdlbXB0eSc6CiAgICAgICAgICAgICAgICByZXR1cm4gZGVmaW5lVHlwZSh0eXBlLCAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiAoeyB0eXBlIH0pKSk7CiAgICAgICAgICAgIGNhc2UgJ3Byb3BzJzoKICAgICAgICAgICAgICAgIHJldHVybiBkZWZpbmVUeXBlKHR5cGUsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJvcHMKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChwcm9wcykgPT4gKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcHJvcHMpLCB7IHR5cGUgfSkpKSk7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWQgY29uZmlnLicpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHByb3BzKCkgewogICAgICAgIHJldHVybiB7IF9hczogJ3Byb3BzJywgX3A6ICgvKiogQHR5cGUgez99ICovICh1bmRlZmluZWQpKSB9OwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgKiBAcGFyYW0gez99IGNyZWF0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRlZmluZVR5cGUodHlwZSwgY3JlYXRvcikgewogICAgICAgIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoY3JlYXRvciwgJ3R5cGUnLCB7CiAgICAgICAgICAgIHZhbHVlOiB0eXBlLAogICAgICAgICAgICB3cml0YWJsZTogZmFsc2UsCiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9hY3Rpb25zX3N1YmplY3QudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSU5JVCA9ICgvKiogQHR5cGUgez99ICovICgnQG5ncngvc3RvcmUvaW5pdCcpKTsKICAgIGNsYXNzIEFjdGlvbnNTdWJqZWN0IGV4dGVuZHMgQmVoYXZpb3JTdWJqZWN0IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgc3VwZXIoeyB0eXBlOiBJTklUIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmV4dChhY3Rpb24pIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYAogICAgICAgIERpc3BhdGNoIGV4cGVjdGVkIGFuIG9iamVjdCwgaW5zdGVhZCBpdCByZWNlaXZlZCBhIGZ1bmN0aW9uLgogICAgICAgIElmIHlvdSdyZSB1c2luZyB0aGUgY3JlYXRlQWN0aW9uIGZ1bmN0aW9uLCBtYWtlIHN1cmUgdG8gaW52b2tlIHRoZSBmdW5jdGlvbgogICAgICAgIGJlZm9yZSBkaXNwYXRjaGluZyB0aGUgYWN0aW9uLiBGb3IgZXhhbXBsZSwgc29tZUFjdGlvbiBzaG91bGQgYmUgc29tZUFjdGlvbigpLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24gPT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBBY3Rpb25zIG11c3QgYmUgb2JqZWN0c2ApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYEFjdGlvbnMgbXVzdCBoYXZlIGEgdHlwZSBwcm9wZXJ0eWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN1cGVyLm5leHQoYWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb21wbGV0ZSgpIHsKICAgICAgICAgICAgLyogbm9vcCAqLwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBzdXBlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIEFjdGlvbnNTdWJqZWN0Lsm1ZmFjID0gZnVuY3Rpb24gQWN0aW9uc1N1YmplY3RfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQWN0aW9uc1N1YmplY3QpKCk7IH07CiAgICBBY3Rpb25zU3ViamVjdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBY3Rpb25zU3ViamVjdCwgZmFjdG9yeTogQWN0aW9uc1N1YmplY3QuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEFjdGlvbnNTdWJqZWN0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBBQ1RJT05TX1NVQkpFQ1RfUFJPVklERVJTID0gW0FjdGlvbnNTdWJqZWN0XTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3Rva2Vucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfUk9PVF9TVE9SRV9HVUFSRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgUm9vdCBHdWFyZCcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX0lOSVRJQUxfU1RBVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEludGVybmFsIEluaXRpYWwgU3RhdGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IElOSVRJQUxfU1RBVEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEluaXRpYWwgU3RhdGUnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJFRFVDRVJfRkFDVE9SWSA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgUmVkdWNlciBGYWN0b3J5Jyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfUkVEVUNFUl9GQUNUT1JZID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBJbnRlcm5hbCBSZWR1Y2VyIEZhY3RvcnkgUHJvdmlkZXInKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IElOSVRJQUxfUkVEVUNFUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIEluaXRpYWwgUmVkdWNlcnMnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9JTklUSUFMX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBJbnRlcm5hbCBJbml0aWFsIFJlZHVjZXJzJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTVE9SRV9GRUFUVVJFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgU3RvcmUgRmVhdHVyZXMnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9TVE9SRV9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgU3RvcmUgUmVkdWNlcnMnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9GRUFUVVJFX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfRkVBVFVSRV9DT05GSUdTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIENvbmZpZ3MnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9TVE9SRV9GRUFUVVJFUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgU3RvcmUgRmVhdHVyZXMnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9GRUFUVVJFX1JFRFVDRVJTX1RPS0VOID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBJbnRlcm5hbCBGZWF0dXJlIFJlZHVjZXJzIFRva2VuJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBGRUFUVVJFX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBGZWF0dXJlIFJlZHVjZXJzJyk7CiAgICAvKioKICAgICAqIFVzZXItZGVmaW5lZCBtZXRhIHJlZHVjZXJzIGZyb20gU3RvcmVNb2R1bGUuZm9yUm9vdCgpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgVVNFUl9QUk9WSURFRF9NRVRBX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBVc2VyIFByb3ZpZGVkIE1ldGEgUmVkdWNlcnMnKTsKICAgIC8qKgogICAgICogTWV0YSByZWR1Y2VycyBkZWZpbmVkIGVpdGhlciBpbnRlcm5hbGx5IGJ5IFxAbmdyeC9zdG9yZSBvciBieSBsaWJyYXJ5IGF1dGhvcnMKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNRVRBX1JFRFVDRVJTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBNZXRhIFJlZHVjZXJzJyk7CiAgICAvKioKICAgICAqIENvbmNhdHMgdGhlIHVzZXIgcHJvdmlkZWQgbWV0YSByZWR1Y2VycyBhbmQgdGhlIG1ldGEgcmVkdWNlcnMgcHJvdmlkZWQgb24gdGhlIG11bHRpCiAgICAgKiBpbmplY3Rpb24gdG9rZW4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBfUkVTT0xWRURfTUVUQV9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgUmVzb2x2ZWQgTWV0YSBSZWR1Y2VycycpOwogICAgLyoqCiAgICAgKiBSdW50aW1lIGNoZWNrcyBkZWZpbmVkIGJ5IHRoZSB1c2VyIHZpYSBhbiBJbmplY3Rpb25Ub2tlbgogICAgICogRGVmYXVsdHMgdG8gYF9VU0VSX1JVTlRJTUVfQ0hFQ0tTYAogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFVTRVJfUlVOVElNRV9DSEVDS1MgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L3N0b3JlIFVzZXIgUnVudGltZSBDaGVja3MgQ29uZmlnJyk7CiAgICAvKioKICAgICAqIFJ1bnRpbWUgY2hlY2tzIGRlZmluZWQgYnkgdGhlIHVzZXIgdmlhIGZvclJvb3QoKQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IF9VU0VSX1JVTlRJTUVfQ0hFQ0tTID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBJbnRlcm5hbCBVc2VyIFJ1bnRpbWUgQ2hlY2tzIENvbmZpZycpOwogICAgLyoqCiAgICAgKiBSdW50aW1lIGNoZWNrcyBjdXJyZW50bHkgaW4gdXNlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgX0FDVElWRV9SVU5USU1FX0NIRUNLUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignQG5ncngvc3RvcmUgSW50ZXJuYWwgUnVudGltZSBDaGVja3MnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9BQ1RJT05fVFlQRV9VTklRVUVORVNTX0NIRUNLID0gbmV3IEluamVjdGlvblRva2VuKCdAbmdyeC9zdG9yZSBDaGVjayBpZiBBY3Rpb24gdHlwZXMgYXJlIHVuaXF1ZScpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvdXRpbHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJzCiAgICAgKiBAcGFyYW0gez89fSBpbml0aWFsU3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbWJpbmVSZWR1Y2VycyhyZWR1Y2VycywgaW5pdGlhbFN0YXRlID0ge30pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVkdWNlcktleXMgPSBPYmplY3Qua2V5cyhyZWR1Y2Vycyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpbmFsUmVkdWNlcnMgPSB7fTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJlZHVjZXJLZXlzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVkdWNlcktleXNbaV07CiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVkdWNlcnNba2V5XSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgZmluYWxSZWR1Y2Vyc1trZXldID0gcmVkdWNlcnNba2V5XTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmluYWxSZWR1Y2VyS2V5cyA9IE9iamVjdC5rZXlzKGZpbmFsUmVkdWNlcnMpOwogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjb21iaW5hdGlvbihzdGF0ZSwgYWN0aW9uKSB7CiAgICAgICAgICAgIHN0YXRlID0gc3RhdGUgPT09IHVuZGVmaW5lZCA/IGluaXRpYWxTdGF0ZSA6IHN0YXRlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBoYXNDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV4dFN0YXRlID0ge307CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmluYWxSZWR1Y2VyS2V5cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gZmluYWxSZWR1Y2VyS2V5c1tpXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlZHVjZXIgPSBmaW5hbFJlZHVjZXJzW2tleV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c1N0YXRlRm9yS2V5ID0gc3RhdGVba2V5XTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5leHRTdGF0ZUZvcktleSA9IHJlZHVjZXIocHJldmlvdXNTdGF0ZUZvcktleSwgYWN0aW9uKTsKICAgICAgICAgICAgICAgIG5leHRTdGF0ZVtrZXldID0gbmV4dFN0YXRlRm9yS2V5OwogICAgICAgICAgICAgICAgaGFzQ2hhbmdlZCA9IGhhc0NoYW5nZWQgfHwgbmV4dFN0YXRlRm9yS2V5ICE9PSBwcmV2aW91c1N0YXRlRm9yS2V5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoYXNDaGFuZ2VkID8gbmV4dFN0YXRlIDogc3RhdGU7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IG9iamVjdAogICAgICogQHBhcmFtIHs/fSBrZXlUb1JlbW92ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gb21pdChvYmplY3QsIGtleVRvUmVtb3ZlKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iamVjdCkKICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGtleSA9PiBrZXkgIT09IGtleVRvUmVtb3ZlKSkKICAgICAgICAgICAgLnJlZHVjZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXN1bHQKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlc3VsdCwga2V5KSA9PiBPYmplY3QuYXNzaWduKHJlc3VsdCwgeyBba2V5XTogb2JqZWN0W2tleV0gfSkpLCB7fSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Li4uP30gZnVuY3Rpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb21wb3NlKC4uLmZ1bmN0aW9ucykgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhcmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIChhcmcpIHsKICAgICAgICAgICAgaWYgKGZ1bmN0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybiBhcmc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsYXN0ID0gZnVuY3Rpb25zW2Z1bmN0aW9ucy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXN0ID0gZnVuY3Rpb25zLnNsaWNlKDAsIC0xKTsKICAgICAgICAgICAgcmV0dXJuIHJlc3QucmVkdWNlUmlnaHQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvc2VkCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb21wb3NlZCwgZm4pID0+IGZuKGNvbXBvc2VkKSksIGxhc3QoYXJnKSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBULCBWCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJGYWN0b3J5CiAgICAgKiBAcGFyYW0gez89fSBtZXRhUmVkdWNlcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZXJGYWN0b3J5KHJlZHVjZXJGYWN0b3J5LCBtZXRhUmVkdWNlcnMpIHsKICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShtZXRhUmVkdWNlcnMpICYmIG1ldGFSZWR1Y2Vycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocmVkdWNlckZhY3RvcnkpKSkgPSBjb21wb3NlLmFwcGx5KG51bGwsIFsKICAgICAgICAgICAgICAgIC4uLm1ldGFSZWR1Y2VycywKICAgICAgICAgICAgICAgIHJlZHVjZXJGYWN0b3J5LAogICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJzCiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5pdGlhbFN0YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVkdWNlcnMsIGluaXRpYWxTdGF0ZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlZHVjZXIgPSByZWR1Y2VyRmFjdG9yeShyZWR1Y2Vycyk7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlID09PSB1bmRlZmluZWQgPyAoKC8qKiBAdHlwZSB7P30gKi8gKGluaXRpYWxTdGF0ZSkpKSA6IHN0YXRlOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVCwgVgogICAgICogQHBhcmFtIHs/PX0gbWV0YVJlZHVjZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlUmVkdWNlckZhY3RvcnkobWV0YVJlZHVjZXJzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZHVjZXJGYWN0b3J5ID0gQXJyYXkuaXNBcnJheShtZXRhUmVkdWNlcnMpICYmIG1ldGFSZWR1Y2Vycy5sZW5ndGggPiAwCiAgICAgICAgICAgID8gY29tcG9zZSguLi5tZXRhUmVkdWNlcnMpCiAgICAgICAgICAgIDogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyKSA9PiByKTsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcgogICAgICAgICAqIEBwYXJhbSB7Pz19IGluaXRpYWxTdGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlZHVjZXIsIGluaXRpYWxTdGF0ZSkgPT4gewogICAgICAgICAgICByZWR1Y2VyID0gcmVkdWNlckZhY3RvcnkocmVkdWNlcik7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlID09PSB1bmRlZmluZWQgPyBpbml0aWFsU3RhdGUgOiBzdGF0ZTsKICAgICAgICAgICAgICAgIHJldHVybiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pOwogICAgICAgICAgICB9KTsKICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3JlZHVjZXJfbWFuYWdlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBSZWR1Y2VyT2JzZXJ2YWJsZSBleHRlbmRzIE9ic2VydmFibGUgewogICAgfQogICAgLyoqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgUmVkdWNlck1hbmFnZXJEaXNwYXRjaGVyIGV4dGVuZHMgQWN0aW9uc1N1YmplY3QgewogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVVBEQVRFID0gKC8qKiBAdHlwZSB7P30gKi8gKCdAbmdyeC9zdG9yZS91cGRhdGUtcmVkdWNlcnMnKSk7CiAgICBjbGFzcyBSZWR1Y2VyTWFuYWdlciBleHRlbmRzIEJlaGF2aW9yU3ViamVjdCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXNwYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBpbml0aWFsU3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJzCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VyRmFjdG9yeQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRpc3BhdGNoZXIsIGluaXRpYWxTdGF0ZSwgcmVkdWNlcnMsIHJlZHVjZXJGYWN0b3J5KSB7CiAgICAgICAgICAgIHN1cGVyKHJlZHVjZXJGYWN0b3J5KHJlZHVjZXJzLCBpbml0aWFsU3RhdGUpKTsKICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyID0gZGlzcGF0Y2hlcjsKICAgICAgICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPSBpbml0aWFsU3RhdGU7CiAgICAgICAgICAgIHRoaXMucmVkdWNlcnMgPSByZWR1Y2VyczsKICAgICAgICAgICAgdGhpcy5yZWR1Y2VyRmFjdG9yeSA9IHJlZHVjZXJGYWN0b3J5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZEZlYXR1cmUoZmVhdHVyZSkgewogICAgICAgICAgICB0aGlzLmFkZEZlYXR1cmVzKFtmZWF0dXJlXSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZEZlYXR1cmVzKGZlYXR1cmVzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVkdWNlcnMgPSBmZWF0dXJlcy5yZWR1Y2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJEaWN0CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVkdWNlckRpY3QsIHsgcmVkdWNlcnMsIHJlZHVjZXJGYWN0b3J5LCBtZXRhUmVkdWNlcnMsIGluaXRpYWxTdGF0ZSwga2V5IH0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlZHVjZXIgPSB0eXBlb2YgcmVkdWNlcnMgPT09ICdmdW5jdGlvbicKICAgICAgICAgICAgICAgICAgICA/IGNyZWF0ZUZlYXR1cmVSZWR1Y2VyRmFjdG9yeShtZXRhUmVkdWNlcnMpKHJlZHVjZXJzLCBpbml0aWFsU3RhdGUpCiAgICAgICAgICAgICAgICAgICAgOiBjcmVhdGVSZWR1Y2VyRmFjdG9yeShyZWR1Y2VyRmFjdG9yeSwgbWV0YVJlZHVjZXJzKShyZWR1Y2VycywgaW5pdGlhbFN0YXRlKTsKICAgICAgICAgICAgICAgIHJlZHVjZXJEaWN0W2tleV0gPSByZWR1Y2VyOwogICAgICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXJEaWN0OwogICAgICAgICAgICB9KSwgKC8qKiBAdHlwZSB7P30gKi8gKHt9KSkpOwogICAgICAgICAgICB0aGlzLmFkZFJlZHVjZXJzKHJlZHVjZXJzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmZWF0dXJlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVGZWF0dXJlKGZlYXR1cmUpIHsKICAgICAgICAgICAgdGhpcy5yZW1vdmVGZWF0dXJlcyhbZmVhdHVyZV0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVGZWF0dXJlcyhmZWF0dXJlcykgewogICAgICAgICAgICB0aGlzLnJlbW92ZVJlZHVjZXJzKGZlYXR1cmVzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcCA9PiBwLmtleSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZFJlZHVjZXIoa2V5LCByZWR1Y2VyKSB7CiAgICAgICAgICAgIHRoaXMuYWRkUmVkdWNlcnMoeyBba2V5XTogcmVkdWNlciB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkUmVkdWNlcnMocmVkdWNlcnMpIHsKICAgICAgICAgICAgdGhpcy5yZWR1Y2VycyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yZWR1Y2VycyksIHJlZHVjZXJzKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVSZWR1Y2VycyhPYmplY3Qua2V5cyhyZWR1Y2VycykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVLZXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZVJlZHVjZXIoZmVhdHVyZUtleSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZVJlZHVjZXJzKFtmZWF0dXJlS2V5XSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZUtleXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZVJlZHVjZXJzKGZlYXR1cmVLZXlzKSB7CiAgICAgICAgICAgIGZlYXR1cmVLZXlzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2V5ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMucmVkdWNlcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAob21pdCh0aGlzLnJlZHVjZXJzLCBrZXkpIC8qVE9ETygjODIzKSovKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVSZWR1Y2VycyhmZWF0dXJlS2V5cyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBmZWF0dXJlS2V5cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlUmVkdWNlcnMoZmVhdHVyZUtleXMpIHsKICAgICAgICAgICAgdGhpcy5uZXh0KHRoaXMucmVkdWNlckZhY3RvcnkodGhpcy5yZWR1Y2VycywgdGhpcy5pbml0aWFsU3RhdGUpKTsKICAgICAgICAgICAgdGhpcy5kaXNwYXRjaGVyLm5leHQoKC8qKiBAdHlwZSB7P30gKi8gKHsKICAgICAgICAgICAgICAgIHR5cGU6IFVQREFURSwKICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBmZWF0dXJlS2V5cywKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIFJlZHVjZXJNYW5hZ2VyLsm1ZmFjID0gZnVuY3Rpb24gUmVkdWNlck1hbmFnZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmVkdWNlck1hbmFnZXIpKMm1ybVpbmplY3QoUmVkdWNlck1hbmFnZXJEaXNwYXRjaGVyKSwgybXJtWluamVjdChJTklUSUFMX1NUQVRFKSwgybXJtWluamVjdChJTklUSUFMX1JFRFVDRVJTKSwgybXJtWluamVjdChSRURVQ0VSX0ZBQ1RPUlkpKTsgfTsKICAgIFJlZHVjZXJNYW5hZ2VyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFJlZHVjZXJNYW5hZ2VyLCBmYWN0b3J5OiBSZWR1Y2VyTWFuYWdlci7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUmVkdWNlck1hbmFnZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBSZWR1Y2VyTWFuYWdlckRpc3BhdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbSU5JVElBTF9TVEFURSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0lOSVRJQUxfUkVEVUNFUlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtSRURVQ0VSX0ZBQ1RPUlksXSB9XSB9CiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUkVEVUNFUl9NQU5BR0VSX1BST1ZJREVSUyA9IFsKICAgICAgICBSZWR1Y2VyTWFuYWdlciwKICAgICAgICB7IHByb3ZpZGU6IFJlZHVjZXJPYnNlcnZhYmxlLCB1c2VFeGlzdGluZzogUmVkdWNlck1hbmFnZXIgfSwKICAgICAgICB7IHByb3ZpZGU6IFJlZHVjZXJNYW5hZ2VyRGlzcGF0Y2hlciwgdXNlRXhpc3Rpbmc6IEFjdGlvbnNTdWJqZWN0IH0sCiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvc2Nhbm5lZF9hY3Rpb25zX3N1YmplY3QudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgU2Nhbm5lZEFjdGlvbnNTdWJqZWN0IGV4dGVuZHMgU3ViamVjdCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIFNjYW5uZWRBY3Rpb25zU3ViamVjdC7JtWZhYyA9IGZ1bmN0aW9uIFNjYW5uZWRBY3Rpb25zU3ViamVjdF9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1U2Nhbm5lZEFjdGlvbnNTdWJqZWN0X0Jhc2VGYWN0b3J5KHQgfHwgU2Nhbm5lZEFjdGlvbnNTdWJqZWN0KTsgfTsKICAgIFNjYW5uZWRBY3Rpb25zU3ViamVjdC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTY2FubmVkQWN0aW9uc1N1YmplY3QsIGZhY3Rvcnk6IFNjYW5uZWRBY3Rpb25zU3ViamVjdC7JtWZhYyB9KTsKICAgIGNvbnN0IMm1U2Nhbm5lZEFjdGlvbnNTdWJqZWN0X0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoU2Nhbm5lZEFjdGlvbnNTdWJqZWN0KTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNDQU5ORURfQUNUSU9OU19TVUJKRUNUX1BST1ZJREVSUyA9IFsKICAgICAgICBTY2FubmVkQWN0aW9uc1N1YmplY3QsCiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvc3RhdGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgU3RhdGVPYnNlcnZhYmxlIGV4dGVuZHMgT2JzZXJ2YWJsZSB7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIFN0YXRlIGV4dGVuZHMgQmVoYXZpb3JTdWJqZWN0IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VyJAogICAgICAgICAqIEBwYXJhbSB7P30gc2Nhbm5lZEFjdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IGluaXRpYWxTdGF0ZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGFjdGlvbnMkLCByZWR1Y2VyJCwgc2Nhbm5lZEFjdGlvbnMsIGluaXRpYWxTdGF0ZSkgewogICAgICAgICAgICBzdXBlcihpbml0aWFsU3RhdGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFjdGlvbnNPblF1ZXVlJCA9IGFjdGlvbnMkLnBpcGUob2JzZXJ2ZU9uKHF1ZXVlKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd2l0aExhdGVzdFJlZHVjZXIkID0gYWN0aW9uc09uUXVldWUkLnBpcGUod2l0aExhdGVzdEZyb20ocmVkdWNlciQpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZWVkID0geyBzdGF0ZTogaW5pdGlhbFN0YXRlIH07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhdGVBbmRBY3Rpb24kID0gd2l0aExhdGVzdFJlZHVjZXIkLnBpcGUoc2NhbihyZWR1Y2VTdGF0ZSwgc2VlZCkpOwogICAgICAgICAgICB0aGlzLnN0YXRlU3Vic2NyaXB0aW9uID0gc3RhdGVBbmRBY3Rpb24kLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBzdGF0ZSwgYWN0aW9uIH0pID0+IHsKICAgICAgICAgICAgICAgIHRoaXMubmV4dChzdGF0ZSk7CiAgICAgICAgICAgICAgICBzY2FubmVkQWN0aW9ucy5uZXh0KGFjdGlvbik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5zdGF0ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgU3RhdGUuybVmYWMgPSBmdW5jdGlvbiBTdGF0ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTdGF0ZSkoybXJtWluamVjdChBY3Rpb25zU3ViamVjdCksIMm1ybVpbmplY3QoUmVkdWNlck9ic2VydmFibGUpLCDJtcm1aW5qZWN0KFNjYW5uZWRBY3Rpb25zU3ViamVjdCksIMm1ybVpbmplY3QoSU5JVElBTF9TVEFURSkpOyB9OwogICAgU3RhdGUuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogU3RhdGUsIGZhY3Rvcnk6IFN0YXRlLsm1ZmFjIH0pOwogICAgU3RhdGUuSU5JVCA9IElOSVQ7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFN0YXRlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQWN0aW9uc1N1YmplY3QgfSwKICAgICAgICB7IHR5cGU6IFJlZHVjZXJPYnNlcnZhYmxlIH0sCiAgICAgICAgeyB0eXBlOiBTY2FubmVkQWN0aW9uc1N1YmplY3QgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbSU5JVElBTF9TVEFURSxdIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBULCBWCiAgICAgKiBAcGFyYW0gez89fSBzdGF0ZUFjdGlvblBhaXIKICAgICAqIEBwYXJhbSB7Pz19IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVkdWNlU3RhdGUoc3RhdGVBY3Rpb25QYWlyID0geyBzdGF0ZTogdW5kZWZpbmVkIH0sIFthY3Rpb24sIHJlZHVjZXJdKSB7CiAgICAgICAgY29uc3QgeyBzdGF0ZSB9ID0gc3RhdGVBY3Rpb25QYWlyOwogICAgICAgIHJldHVybiB7IHN0YXRlOiByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pLCBhY3Rpb24gfTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNUQVRFX1BST1ZJREVSUyA9IFsKICAgICAgICBTdGF0ZSwKICAgICAgICB7IHByb3ZpZGU6IFN0YXRlT2JzZXJ2YWJsZSwgdXNlRXhpc3Rpbmc6IFN0YXRlIH0sCiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvc3RvcmUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBTdG9yZSBleHRlbmRzIE9ic2VydmFibGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUkCiAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb25zT2JzZXJ2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJNYW5hZ2VyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RhdGUkLCBhY3Rpb25zT2JzZXJ2ZXIsIHJlZHVjZXJNYW5hZ2VyKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuYWN0aW9uc09ic2VydmVyID0gYWN0aW9uc09ic2VydmVyOwogICAgICAgICAgICB0aGlzLnJlZHVjZXJNYW5hZ2VyID0gcmVkdWNlck1hbmFnZXI7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc3RhdGUkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAdGVtcGxhdGUgUHJvcHMsIEsKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhPck1hcEZuCiAgICAgICAgICogQHBhcmFtIHsuLi4/fSBwYXRocwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2VsZWN0KHBhdGhPck1hcEZuLCAuLi5wYXRocykgewogICAgICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChzZWxlY3QpKSkuY2FsbChudWxsLCBwYXRoT3JNYXBGbiwgLi4ucGF0aHMpKHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAdGVtcGxhdGUgUgogICAgICAgICAqIEBwYXJhbSB7P30gb3BlcmF0b3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxpZnQob3BlcmF0b3IpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdG9yZSA9IG5ldyBTdG9yZSh0aGlzLCB0aGlzLmFjdGlvbnNPYnNlcnZlciwgdGhpcy5yZWR1Y2VyTWFuYWdlcik7CiAgICAgICAgICAgIHN0b3JlLm9wZXJhdG9yID0gb3BlcmF0b3I7CiAgICAgICAgICAgIHJldHVybiBzdG9yZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIFYKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzcGF0Y2goYWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aW9uc09ic2VydmVyLm5leHQoYWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5leHQoYWN0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aW9uc09ic2VydmVyLm5leHQoYWN0aW9uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVycm9yKGVycikgewogICAgICAgICAgICB0aGlzLmFjdGlvbnNPYnNlcnZlci5lcnJvcihlcnIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvbXBsZXRlKCkgewogICAgICAgICAgICB0aGlzLmFjdGlvbnNPYnNlcnZlci5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAdGVtcGxhdGUgU3RhdGUsIEFjdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkUmVkdWNlcihrZXksIHJlZHVjZXIpIHsKICAgICAgICAgICAgdGhpcy5yZWR1Y2VyTWFuYWdlci5hZGRSZWR1Y2VyKGtleSwgcmVkdWNlcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBLZXkKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlUmVkdWNlcihrZXkpIHsKICAgICAgICAgICAgdGhpcy5yZWR1Y2VyTWFuYWdlci5yZW1vdmVSZWR1Y2VyKGtleSk7CiAgICAgICAgfQogICAgfQogICAgU3RvcmUuybVmYWMgPSBmdW5jdGlvbiBTdG9yZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTdG9yZSkoybXJtWluamVjdChTdGF0ZU9ic2VydmFibGUpLCDJtcm1aW5qZWN0KEFjdGlvbnNTdWJqZWN0KSwgybXJtWluamVjdChSZWR1Y2VyTWFuYWdlcikpOyB9OwogICAgU3RvcmUuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogU3RvcmUsIGZhY3Rvcnk6IFN0b3JlLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTdG9yZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0YXRlT2JzZXJ2YWJsZSB9LAogICAgICAgIHsgdHlwZTogQWN0aW9uc1N1YmplY3QgfSwKICAgICAgICB7IHR5cGU6IFJlZHVjZXJNYW5hZ2VyIH0KICAgIF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTVE9SRV9QUk9WSURFUlMgPSBbU3RvcmVdOwogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVCwgUHJvcHMsIEsKICAgICAqIEBwYXJhbSB7P30gcGF0aE9yTWFwRm4KICAgICAqIEBwYXJhbSB7Pz19IHByb3BzT3JQYXRoCiAgICAgKiBAcGFyYW0gey4uLj99IHBhdGhzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3QocGF0aE9yTWFwRm4sIHByb3BzT3JQYXRoLCAuLi5wYXRocykgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2UkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzZWxlY3RPcGVyYXRvcihzb3VyY2UkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1hcHBlZCQ7CiAgICAgICAgICAgIGlmICh0eXBlb2YgcGF0aE9yTWFwRm4gPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYXRoU2xpY2VzID0gWygvKiogQHR5cGUgez99ICovIChwcm9wc09yUGF0aCkpLCAuLi5wYXRoc10uZmlsdGVyKEJvb2xlYW4pOwogICAgICAgICAgICAgICAgbWFwcGVkJCA9IHNvdXJjZSQucGlwZShwbHVjayhwYXRoT3JNYXBGbiwgLi4ucGF0aFNsaWNlcykpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBwYXRoT3JNYXBGbiA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgbWFwcGVkJCA9IHNvdXJjZSQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHNvdXJjZSA9PiBwYXRoT3JNYXBGbihzb3VyY2UsICgvKiogQHR5cGUgez99ICovIChwcm9wc09yUGF0aCkpKSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFVuZXhwZWN0ZWQgdHlwZSAnJHt0eXBlb2YgcGF0aE9yTWFwRm59JyBpbiBzZWxlY3Qgb3BlcmF0b3IsYCArCiAgICAgICAgICAgICAgICAgICAgYCBleHBlY3RlZCAnc3RyaW5nJyBvciAnZnVuY3Rpb24nYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG1hcHBlZCQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhCiAgICAgKiBAcGFyYW0gez99IGIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRXF1YWxDaGVjayhhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEgPT09IGI7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYXJncwogICAgICogQHBhcmFtIHs/fSBsYXN0QXJndW1lbnRzCiAgICAgKiBAcGFyYW0gez99IGNvbXBhcmF0b3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQXJndW1lbnRzQ2hhbmdlZChhcmdzLCBsYXN0QXJndW1lbnRzLCBjb21wYXJhdG9yKSB7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhcmdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIGlmICghY29tcGFyYXRvcihhcmdzW2ldLCBsYXN0QXJndW1lbnRzW2ldKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHByb2plY3Rpb25GbgogICAgICogQHBhcmFtIHs/PX0gaXNBcmd1bWVudHNFcXVhbAogICAgICogQHBhcmFtIHs/PX0gaXNSZXN1bHRFcXVhbAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZGVmYXVsdE1lbW9pemUocHJvamVjdGlvbkZuLCBpc0FyZ3VtZW50c0VxdWFsID0gaXNFcXVhbENoZWNrLCBpc1Jlc3VsdEVxdWFsID0gaXNFcXVhbENoZWNrKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBsYXN0QXJndW1lbnRzID0gbnVsbDsKICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tYW55IGFueXRoaW5nIGNvdWxkIGJlIHRoZSByZXN1bHQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBsYXN0UmVzdWx0ID0gbnVsbDsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG92ZXJyaWRlUmVzdWx0OwogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gcmVzZXQoKSB7CiAgICAgICAgICAgIGxhc3RBcmd1bWVudHMgPSBudWxsOwogICAgICAgICAgICBsYXN0UmVzdWx0ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gcmVzdWx0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBzZXRSZXN1bHQocmVzdWx0ID0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG92ZXJyaWRlUmVzdWx0ID0geyByZXN1bHQgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiBjbGVhclJlc3VsdCgpIHsKICAgICAgICAgICAgb3ZlcnJpZGVSZXN1bHQgPSB1bmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1hbnkgYW55dGhpbmcgY291bGQgYmUgdGhlIHJlc3VsdC4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uIG1lbW9pemVkKCkgewogICAgICAgICAgICBpZiAob3ZlcnJpZGVSZXN1bHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlUmVzdWx0LnJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWxhc3RBcmd1bWVudHMpIHsKICAgICAgICAgICAgICAgIGxhc3RSZXN1bHQgPSBwcm9qZWN0aW9uRm4uYXBwbHkobnVsbCwgKC8qKiBAdHlwZSB7P30gKi8gKGFyZ3VtZW50cykpKTsKICAgICAgICAgICAgICAgIGxhc3RBcmd1bWVudHMgPSBhcmd1bWVudHM7CiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWlzQXJndW1lbnRzQ2hhbmdlZChhcmd1bWVudHMsIGxhc3RBcmd1bWVudHMsIGlzQXJndW1lbnRzRXF1YWwpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld1Jlc3VsdCA9IHByb2plY3Rpb25Gbi5hcHBseShudWxsLCAoLyoqIEB0eXBlIHs/fSAqLyAoYXJndW1lbnRzKSkpOwogICAgICAgICAgICBsYXN0QXJndW1lbnRzID0gYXJndW1lbnRzOwogICAgICAgICAgICBpZiAoaXNSZXN1bHRFcXVhbChsYXN0UmVzdWx0LCBuZXdSZXN1bHQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbGFzdFJlc3VsdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBsYXN0UmVzdWx0ID0gbmV3UmVzdWx0OwogICAgICAgICAgICByZXR1cm4gbmV3UmVzdWx0OwogICAgICAgIH0KICAgICAgICByZXR1cm4geyBtZW1vaXplZCwgcmVzZXQsIHNldFJlc3VsdCwgY2xlYXJSZXN1bHQgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHsuLi4/fSBpbnB1dAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlU2VsZWN0b3IoLi4uaW5wdXQpIHsKICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3JGYWN0b3J5KGRlZmF1bHRNZW1vaXplKSguLi5pbnB1dCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3JzCiAgICAgKiBAcGFyYW0gez99IHByb3BzCiAgICAgKiBAcGFyYW0gez99IG1lbW9pemVkUHJvamVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBkZWZhdWx0U3RhdGVGbihzdGF0ZSwgc2VsZWN0b3JzLCBwcm9wcywgbWVtb2l6ZWRQcm9qZWN0b3IpIHsKICAgICAgICBpZiAocHJvcHMgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFyZ3MgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHNlbGVjdG9ycykpKS5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmbiA9PiBmbihzdGF0ZSkpKTsKICAgICAgICAgICAgcmV0dXJuIG1lbW9pemVkUHJvamVjdG9yLm1lbW9pemVkLmFwcGx5KG51bGwsIGFyZ3MpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYXJncyA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0b3JzKSkpLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm4gPT4gZm4oc3RhdGUsIHByb3BzKSkpOwogICAgICAgIHJldHVybiBtZW1vaXplZFByb2plY3Rvci5tZW1vaXplZC5hcHBseShudWxsLCBbLi4uYXJncywgcHJvcHNdKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZW1vaXplCiAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVTZWxlY3RvckZhY3RvcnkobWVtb2l6ZSwgb3B0aW9ucyA9IHsKICAgICAgICBzdGF0ZUZuOiBkZWZhdWx0U3RhdGVGbiwKICAgIH0pIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7Li4uP30gaW5wdXQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZ1bmN0aW9uICguLi5pbnB1dCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBhcmdzID0gaW5wdXQ7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGFyZ3NbMF0pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBbaGVhZCwgLi4udGFpbF0gPSBhcmdzOwogICAgICAgICAgICAgICAgYXJncyA9IFsuLi5oZWFkLCAuLi50YWlsXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9ycyA9IGFyZ3Muc2xpY2UoMCwgYXJncy5sZW5ndGggLSAxKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm9qZWN0b3IgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWVtb2l6ZWRTZWxlY3RvcnMgPSBzZWxlY3RvcnMuZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHNlbGVjdG9yKSA9PiBzZWxlY3Rvci5yZWxlYXNlICYmIHR5cGVvZiBzZWxlY3Rvci5yZWxlYXNlID09PSAnZnVuY3Rpb24nKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWVtb2l6ZWRQcm9qZWN0b3IgPSBtZW1vaXplKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHsuLi4/fSBzZWxlY3RvcnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uICguLi5zZWxlY3RvcnMpIHsKICAgICAgICAgICAgICAgIHJldHVybiBwcm9qZWN0b3IuYXBwbHkobnVsbCwgc2VsZWN0b3JzKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lbW9pemVkU3RhdGUgPSBkZWZhdWx0TWVtb2l6ZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKHN0YXRlLCBwcm9wcykgewogICAgICAgICAgICAgICAgcmV0dXJuIG9wdGlvbnMuc3RhdGVGbi5hcHBseShudWxsLCBbCiAgICAgICAgICAgICAgICAgICAgc3RhdGUsCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JzLAogICAgICAgICAgICAgICAgICAgIHByb3BzLAogICAgICAgICAgICAgICAgICAgIG1lbW9pemVkUHJvamVjdG9yLAogICAgICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiByZWxlYXNlKCkgewogICAgICAgICAgICAgICAgbWVtb2l6ZWRTdGF0ZS5yZXNldCgpOwogICAgICAgICAgICAgICAgbWVtb2l6ZWRQcm9qZWN0b3IucmVzZXQoKTsKICAgICAgICAgICAgICAgIG1lbW9pemVkU2VsZWN0b3JzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgc2VsZWN0b3IgPT4gc2VsZWN0b3IucmVsZWFzZSgpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24obWVtb2l6ZWRTdGF0ZS5tZW1vaXplZCwgewogICAgICAgICAgICAgICAgcmVsZWFzZSwKICAgICAgICAgICAgICAgIHByb2plY3RvcjogbWVtb2l6ZWRQcm9qZWN0b3IubWVtb2l6ZWQsCiAgICAgICAgICAgICAgICBzZXRSZXN1bHQ6IG1lbW9pemVkU3RhdGUuc2V0UmVzdWx0LAogICAgICAgICAgICAgICAgY2xlYXJSZXN1bHQ6IG1lbW9pemVkU3RhdGUuY2xlYXJSZXN1bHQsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVOYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVGZWF0dXJlU2VsZWN0b3IoZmVhdHVyZU5hbWUpIHsKICAgICAgICByZXR1cm4gY3JlYXRlU2VsZWN0b3IoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzdGF0ZSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVTdGF0ZSA9IHN0YXRlW2ZlYXR1cmVOYW1lXTsKICAgICAgICAgICAgaWYgKCBpc0Rldk1vZGUoKSAmJiAhKGZlYXR1cmVOYW1lIGluIHN0YXRlKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBAbmdyeC9zdG9yZTogVGhlIGZlYXR1cmUgbmFtZSBcIiR7ZmVhdHVyZU5hbWV9XCIgZG9lcyBgICsKICAgICAgICAgICAgICAgICAgICAnbm90IGV4aXN0IGluIHRoZSBzdGF0ZSwgdGhlcmVmb3JlIGNyZWF0ZUZlYXR1cmVTZWxlY3RvciAnICsKICAgICAgICAgICAgICAgICAgICAnY2Fubm90IGFjY2VzcyBpdC4gIEJlIHN1cmUgaXQgaXMgaW1wb3J0ZWQgaW4gYSBsb2FkZWQgbW9kdWxlICcgKwogICAgICAgICAgICAgICAgICAgIGB1c2luZyBTdG9yZU1vZHVsZS5mb3JSb290KCcke2ZlYXR1cmVOYW1lfScsIC4uLikgb3IgYCArCiAgICAgICAgICAgICAgICAgICAgYFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoJyR7ZmVhdHVyZU5hbWV9JywgLi4uKS4gIElmIHRoZSBkZWZhdWx0IGAgKwogICAgICAgICAgICAgICAgICAgICdzdGF0ZSBpcyBpbnRlbmRlZCB0byBiZSB1bmRlZmluZWQsIGFzIGlzIHRoZSBjYXNlIHdpdGggcm91dGVyICcgKwogICAgICAgICAgICAgICAgICAgICdzdGF0ZSwgdGhpcyBkZXZlbG9wbWVudC1vbmx5IHdhcm5pbmcgbWVzc2FnZSBjYW4gYmUgaWdub3JlZC4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmVhdHVyZVN0YXRlOwogICAgICAgIH0pLCAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmZWF0dXJlU3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmZWF0dXJlU3RhdGUpID0+IGZlYXR1cmVTdGF0ZSkpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvbWV0YS1yZWR1Y2Vycy91dGlscy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSVU5USU1FX0NIRUNLX1VSTCA9ICdodHRwczovL25ncnguaW8vZ3VpZGUvc3RvcmUvY29uZmlndXJhdGlvbi9ydW50aW1lLWNoZWNrcyc7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1VuZGVmaW5lZCh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gdGFyZ2V0ID09PSB1bmRlZmluZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc051bGwodGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIHRhcmdldCA9PT0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQXJyYXkkMSh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh0YXJnZXQpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNTdHJpbmcodGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdzdHJpbmcnOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNCb29sZWFuKHRhcmdldCkgewogICAgICAgIHJldHVybiB0eXBlb2YgdGFyZ2V0ID09PSAnYm9vbGVhbic7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc051bWJlcih0YXJnZXQpIHsKICAgICAgICByZXR1cm4gdHlwZW9mIHRhcmdldCA9PT0gJ251bWJlcic7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc09iamVjdExpa2UodGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdvYmplY3QnICYmIHRhcmdldCAhPT0gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzT2JqZWN0JDIodGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIGlzT2JqZWN0TGlrZSh0YXJnZXQpICYmICFpc0FycmF5JDEodGFyZ2V0KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzUGxhaW5PYmplY3QodGFyZ2V0KSB7CiAgICAgICAgaWYgKCFpc09iamVjdCQyKHRhcmdldCkpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdGFyZ2V0UHJvdG90eXBlID0gT2JqZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldCk7CiAgICAgICAgcmV0dXJuIHRhcmdldFByb3RvdHlwZSA9PT0gT2JqZWN0LnByb3RvdHlwZSB8fCB0YXJnZXRQcm90b3R5cGUgPT09IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uJDEodGFyZ2V0KSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiB0YXJnZXQgPT09ICdmdW5jdGlvbic7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0NvbXBvbmVudCh0YXJnZXQpIHsKICAgICAgICByZXR1cm4gaXNGdW5jdGlvbiQxKHRhcmdldCkgJiYgdGFyZ2V0Lmhhc093blByb3BlcnR5KCfJtWNtcCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eU5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc093blByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlOYW1lKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh0YXJnZXQsIHByb3BlcnR5TmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9tZXRhLXJlZHVjZXJzL2ltbXV0YWJpbGl0eV9yZWR1Y2VyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSByZWR1Y2VyCiAgICAgKiBAcGFyYW0gez99IGNoZWNrcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaW1tdXRhYmlsaXR5Q2hlY2tNZXRhUmVkdWNlcihyZWR1Y2VyLCBjaGVja3MpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhY3QgPSBjaGVja3MuYWN0aW9uKGFjdGlvbikgPyBmcmVlemUoYWN0aW9uKSA6IGFjdGlvbjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3QpOwogICAgICAgICAgICByZXR1cm4gY2hlY2tzLnN0YXRlKCkgPyBmcmVlemUobmV4dFN0YXRlKSA6IG5leHRTdGF0ZTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB0YXJnZXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGZyZWV6ZSh0YXJnZXQpIHsKICAgICAgICBPYmplY3QuZnJlZXplKHRhcmdldCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhcmdldElzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uJDEodGFyZ2V0KTsKICAgICAgICBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0YXJnZXQpLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHJvcCA9PiB7CiAgICAgICAgICAgIC8vIElnbm9yZSBJdnkgcHJvcGVydGllcywgcmVmOiBodHRwczovL2dpdGh1Yi5jb20vbmdyeC9wbGF0Zm9ybS9pc3N1ZXMvMjEwOSNpc3N1ZWNvbW1lbnQtNTgyNjg5MDYwCiAgICAgICAgICAgIGlmIChwcm9wLnN0YXJ0c1dpdGgoJ8m1JykpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaGFzT3duUHJvcGVydHkodGFyZ2V0LCBwcm9wKSAmJgogICAgICAgICAgICAgICAgKHRhcmdldElzRnVuY3Rpb24KICAgICAgICAgICAgICAgICAgICA/IHByb3AgIT09ICdjYWxsZXInICYmIHByb3AgIT09ICdjYWxsZWUnICYmIHByb3AgIT09ICdhcmd1bWVudHMnCiAgICAgICAgICAgICAgICAgICAgOiB0cnVlKSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcHJvcFZhbHVlID0gdGFyZ2V0W3Byb3BdOwogICAgICAgICAgICAgICAgaWYgKChpc09iamVjdExpa2UocHJvcFZhbHVlKSB8fCBpc0Z1bmN0aW9uJDEocHJvcFZhbHVlKSkgJiYKICAgICAgICAgICAgICAgICAgICAhT2JqZWN0LmlzRnJvemVuKHByb3BWYWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBmcmVlemUocHJvcFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gdGFyZ2V0OwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9zdG9yZS9zcmMvbWV0YS1yZWR1Y2Vycy9zZXJpYWxpemF0aW9uX3JlZHVjZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAqIEBwYXJhbSB7P30gY2hlY2tzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXJpYWxpemF0aW9uQ2hlY2tNZXRhUmVkdWNlcihyZWR1Y2VyLCBjaGVja3MpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKHN0YXRlLCBhY3Rpb24pIHsKICAgICAgICAgICAgaWYgKGNoZWNrcy5hY3Rpb24oYWN0aW9uKSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdW5zZXJpYWxpemFibGVBY3Rpb24gPSBnZXRVbnNlcmlhbGl6YWJsZShhY3Rpb24pOwogICAgICAgICAgICAgICAgdGhyb3dJZlVuc2VyaWFsaXphYmxlKHVuc2VyaWFsaXphYmxlQWN0aW9uLCAnYWN0aW9uJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXh0U3RhdGUgPSByZWR1Y2VyKHN0YXRlLCBhY3Rpb24pOwogICAgICAgICAgICBpZiAoY2hlY2tzLnN0YXRlKCkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHVuc2VyaWFsaXphYmxlU3RhdGUgPSBnZXRVbnNlcmlhbGl6YWJsZShuZXh0U3RhdGUpOwogICAgICAgICAgICAgICAgdGhyb3dJZlVuc2VyaWFsaXphYmxlKHVuc2VyaWFsaXphYmxlU3RhdGUsICdzdGF0ZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXh0U3RhdGU7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7Pz19IHRhcmdldAogICAgICogQHBhcmFtIHs/PX0gcGF0aAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VW5zZXJpYWxpemFibGUodGFyZ2V0LCBwYXRoID0gW10pIHsKICAgICAgICAvLyBHdWFyZCBhZ2FpbnN0IHVuZGVmaW5lZCBhbmQgbnVsbCwgZS5nLiBhIHJlZHVjZXIgdGhhdCByZXR1cm5zIHVuZGVmaW5lZAogICAgICAgIGlmICgoaXNVbmRlZmluZWQodGFyZ2V0KSB8fCBpc051bGwodGFyZ2V0KSkgJiYgcGF0aC5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHBhdGg6IFsncm9vdCddLAogICAgICAgICAgICAgICAgdmFsdWU6IHRhcmdldCwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyh0YXJnZXQpOwogICAgICAgIHJldHVybiBrZXlzLnJlZHVjZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXN1bHQKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlc3VsdCwga2V5KSA9PiB7CiAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAodGFyZ2V0KSkpW2tleV07CiAgICAgICAgICAgIC8vIElnbm9yZSBJdnkgY29tcG9uZW50cwogICAgICAgICAgICBpZiAoaXNDb21wb25lbnQodmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkgfHwKICAgICAgICAgICAgICAgIGlzTnVsbCh2YWx1ZSkgfHwKICAgICAgICAgICAgICAgIGlzTnVtYmVyKHZhbHVlKSB8fAogICAgICAgICAgICAgICAgaXNCb29sZWFuKHZhbHVlKSB8fAogICAgICAgICAgICAgICAgaXNTdHJpbmcodmFsdWUpIHx8CiAgICAgICAgICAgICAgICBpc0FycmF5JDEodmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGlzUGxhaW5PYmplY3QodmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VW5zZXJpYWxpemFibGUodmFsdWUsIFsuLi5wYXRoLCBrZXldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcGF0aDogWy4uLnBhdGgsIGtleV0sCiAgICAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgfTsKICAgICAgICB9KSwgZmFsc2UpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHVuc2VyaWFsaXphYmxlCiAgICAgKiBAcGFyYW0gez99IGNvbnRleHQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93SWZVbnNlcmlhbGl6YWJsZSh1bnNlcmlhbGl6YWJsZSwgY29udGV4dCkgewogICAgICAgIGlmICh1bnNlcmlhbGl6YWJsZSA9PT0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdW5zZXJpYWxpemFibGVQYXRoID0gdW5zZXJpYWxpemFibGUucGF0aC5qb2luKCcuJyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKGBEZXRlY3RlZCB1bnNlcmlhbGl6YWJsZSAke2NvbnRleHR9IGF0ICIke3Vuc2VyaWFsaXphYmxlUGF0aH0iLiAke1JVTlRJTUVfQ0hFQ0tfVVJMfSNzdHJpY3Qke2NvbnRleHR9c2VyaWFsaXphYmlsaXR5YCk7CiAgICAgICAgZXJyb3IudmFsdWUgPSB1bnNlcmlhbGl6YWJsZS52YWx1ZTsKICAgICAgICBlcnJvci51bnNlcmlhbGl6YWJsZVBhdGggPSB1bnNlcmlhbGl6YWJsZVBhdGg7CiAgICAgICAgdGhyb3cgZXJyb3I7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9tZXRhLXJlZHVjZXJzL2luTmdab25lQXNzZXJ0X3JlZHVjZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAqIEBwYXJhbSB7P30gY2hlY2tzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpbk5nWm9uZUFzc2VydE1ldGFSZWR1Y2VyKHJlZHVjZXIsIGNoZWNrcykgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmdW5jdGlvbiAoc3RhdGUsIGFjdGlvbikgewogICAgICAgICAgICBpZiAoY2hlY2tzLmFjdGlvbihhY3Rpb24pICYmICFOZ1pvbmUuaXNJbkFuZ3VsYXJab25lKCkpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQWN0aW9uICcke2FjdGlvbi50eXBlfScgcnVubmluZyBvdXRzaWRlIE5nWm9uZS4gJHtSVU5USU1FX0NIRUNLX1VSTH0jc3RyaWN0YWN0aW9ud2l0aGlubmd6b25lYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICAgICAgfSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9tZXRhLXJlZHVjZXJzL2luZGV4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvc3RvcmUvc3JjL3J1bnRpbWVfY2hlY2tzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gcnVudGltZUNoZWNrcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlQWN0aXZlUnVudGltZUNoZWNrcyhydW50aW1lQ2hlY2tzKSB7CiAgICAgICAgaWYgKGlzRGV2TW9kZSgpKSB7CiAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKHsgc3RyaWN0U3RhdGVTZXJpYWxpemFiaWxpdHk6IGZhbHNlLCBzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHk6IGZhbHNlLCBzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eTogdHJ1ZSwgc3RyaWN0QWN0aW9uSW1tdXRhYmlsaXR5OiB0cnVlLCBzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmU6IGZhbHNlLCBzdHJpY3RBY3Rpb25UeXBlVW5pcXVlbmVzczogZmFsc2UgfSwgcnVudGltZUNoZWNrcyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiBmYWxzZSwKICAgICAgICAgICAgc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiBmYWxzZSwKICAgICAgICAgICAgc3RyaWN0U3RhdGVJbW11dGFiaWxpdHk6IGZhbHNlLAogICAgICAgICAgICBzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHk6IGZhbHNlLAogICAgICAgICAgICBzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmU6IGZhbHNlLAogICAgICAgICAgICBzdHJpY3RBY3Rpb25UeXBlVW5pcXVlbmVzczogZmFsc2UsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVNlcmlhbGl6YXRpb25DaGVja01ldGFSZWR1Y2VyKHsgc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5LCBzdHJpY3RTdGF0ZVNlcmlhbGl6YWJpbGl0eSwgfSkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocmVkdWNlcikgPT4gc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5IHx8IHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5CiAgICAgICAgICAgID8gc2VyaWFsaXphdGlvbkNoZWNrTWV0YVJlZHVjZXIocmVkdWNlciwgewogICAgICAgICAgICAgICAgYWN0aW9uOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGFjdGlvbikgPT4gc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5ICYmICFpZ25vcmVOZ3J4QWN0aW9uKGFjdGlvbikpLAogICAgICAgICAgICAgICAgc3RhdGU6ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5KSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgOiByZWR1Y2VyKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZUltbXV0YWJpbGl0eUNoZWNrTWV0YVJlZHVjZXIoeyBzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHksIHN0cmljdFN0YXRlSW1tdXRhYmlsaXR5LCB9KSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWR1Y2VyKSA9PiBzdHJpY3RBY3Rpb25JbW11dGFiaWxpdHkgfHwgc3RyaWN0U3RhdGVJbW11dGFiaWxpdHkKICAgICAgICAgICAgPyBpbW11dGFiaWxpdHlDaGVja01ldGFSZWR1Y2VyKHJlZHVjZXIsIHsKICAgICAgICAgICAgICAgIGFjdGlvbjogKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IHN0cmljdEFjdGlvbkltbXV0YWJpbGl0eSAmJiAhaWdub3JlTmdyeEFjdGlvbihhY3Rpb24pKSwKICAgICAgICAgICAgICAgIHN0YXRlOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBzdHJpY3RTdGF0ZUltbXV0YWJpbGl0eSksCiAgICAgICAgICAgIH0pCiAgICAgICAgICAgIDogcmVkdWNlcik7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpZ25vcmVOZ3J4QWN0aW9uKGFjdGlvbikgewogICAgICAgIHJldHVybiBhY3Rpb24udHlwZS5zdGFydHNXaXRoKCdAbmdyeCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlSW5OZ1pvbmVDaGVja01ldGFSZWR1Y2VyKHsgc3RyaWN0QWN0aW9uV2l0aGluTmdab25lLCB9KSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyZWR1Y2VyKSA9PiBzdHJpY3RBY3Rpb25XaXRoaW5OZ1pvbmUKICAgICAgICAgICAgPyBpbk5nWm9uZUFzc2VydE1ldGFSZWR1Y2VyKHJlZHVjZXIsIHsKICAgICAgICAgICAgICAgIGFjdGlvbjogKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IHN0cmljdEFjdGlvbldpdGhpbk5nWm9uZSAmJiAhaWdub3JlTmdyeEFjdGlvbihhY3Rpb24pKSwKICAgICAgICAgICAgfSkKICAgICAgICAgICAgOiByZWR1Y2VyKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gcnVudGltZUNoZWNrcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcHJvdmlkZVJ1bnRpbWVDaGVja3MocnVudGltZUNoZWNrcykgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9VU0VSX1JVTlRJTUVfQ0hFQ0tTLAogICAgICAgICAgICAgICAgdXNlVmFsdWU6IHJ1bnRpbWVDaGVja3MsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IFVTRVJfUlVOVElNRV9DSEVDS1MsCiAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBfcnVudGltZUNoZWNrc0ZhY3RvcnksCiAgICAgICAgICAgICAgICBkZXBzOiBbX1VTRVJfUlVOVElNRV9DSEVDS1NdLAogICAgICAgICAgICB9LAogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm92aWRlOiBfQUNUSVZFX1JVTlRJTUVfQ0hFQ0tTLAogICAgICAgICAgICAgICAgZGVwczogW1VTRVJfUlVOVElNRV9DSEVDS1NdLAogICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlQWN0aXZlUnVudGltZUNoZWNrcywKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUywKICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgZGVwczogW19BQ1RJVkVfUlVOVElNRV9DSEVDS1NdLAogICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlSW1tdXRhYmlsaXR5Q2hlY2tNZXRhUmVkdWNlciwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUywKICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgZGVwczogW19BQ1RJVkVfUlVOVElNRV9DSEVDS1NdLAogICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlU2VyaWFsaXphdGlvbkNoZWNrTWV0YVJlZHVjZXIsCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1FVEFfUkVEVUNFUlMsCiAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgIGRlcHM6IFtfQUNUSVZFX1JVTlRJTUVfQ0hFQ0tTXSwKICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGNyZWF0ZUluTmdab25lQ2hlY2tNZXRhUmVkdWNlciwKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjaGVja0ZvckFjdGlvblR5cGVVbmlxdWVuZXNzKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9BQ1RJT05fVFlQRV9VTklRVUVORVNTX0NIRUNLLAogICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICBkZXBzOiBbX0FDVElWRV9SVU5USU1FX0NIRUNLU10sCiAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBfYWN0aW9uVHlwZVVuaXF1ZW5lc3NDaGVjaywKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJ1bnRpbWVDaGVja3MKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9ydW50aW1lQ2hlY2tzRmFjdG9yeShydW50aW1lQ2hlY2tzKSB7CiAgICAgICAgcmV0dXJuIHJ1bnRpbWVDaGVja3M7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29uZmlnCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfYWN0aW9uVHlwZVVuaXF1ZW5lc3NDaGVjayhjb25maWcpIHsKICAgICAgICBpZiAoIWNvbmZpZy5zdHJpY3RBY3Rpb25UeXBlVW5pcXVlbmVzcykgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkdXBsaWNhdGVzID0gT2JqZWN0LmVudHJpZXMoUkVHSVNURVJFRF9BQ1RJT05fVFlQRVMpCiAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoWywgcmVnaXN0cmF0aW9uc10pID0+IHJlZ2lzdHJhdGlvbnMgPiAxKSkKICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbdHlwZV0pID0+IHR5cGUpKTsKICAgICAgICBpZiAoZHVwbGljYXRlcy5sZW5ndGgpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBY3Rpb24gdHlwZXMgYXJlIHJlZ2lzdGVyZWQgbW9yZSB0aGFuIG9uY2UsICR7ZHVwbGljYXRlcwogICAgICAgICAgICAubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh0eXBlKSA9PiBgIiR7dHlwZX0iYCkpCiAgICAgICAgICAgIC5qb2luKCcsICcpfS4gJHtSVU5USU1FX0NIRUNLX1VSTH0jc3RyaWN0YWN0aW9udHlwZXVuaXF1ZW5lc3NgKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL3N0b3JlL3NyYy9zdG9yZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgU3RvcmVSb290TW9kdWxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VyJAogICAgICAgICAqIEBwYXJhbSB7P30gc2Nhbm5lZEFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gZ3VhcmQKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbkNoZWNrCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYWN0aW9ucyQsIHJlZHVjZXIkLCBzY2FubmVkQWN0aW9ucyQsIHN0b3JlLCBndWFyZCwgYWN0aW9uQ2hlY2spIHsKICAgICAgICB9CiAgICB9CiAgICBTdG9yZVJvb3RNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTdG9yZVJvb3RNb2R1bGUgfSk7CiAgICBTdG9yZVJvb3RNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBTdG9yZVJvb3RNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RvcmVSb290TW9kdWxlKSjJtcm1aW5qZWN0KEFjdGlvbnNTdWJqZWN0KSwgybXJtWluamVjdChSZWR1Y2VyT2JzZXJ2YWJsZSksIMm1ybVpbmplY3QoU2Nhbm5lZEFjdGlvbnNTdWJqZWN0KSwgybXJtWluamVjdChTdG9yZSksIMm1ybVpbmplY3QoX1JPT1RfU1RPUkVfR1VBUkQsIDgpLCDJtcm1aW5qZWN0KF9BQ1RJT05fVFlQRV9VTklRVUVORVNTX0NIRUNLLCA4KSk7IH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFN0b3JlUm9vdE1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEFjdGlvbnNTdWJqZWN0IH0sCiAgICAgICAgeyB0eXBlOiBSZWR1Y2VyT2JzZXJ2YWJsZSB9LAogICAgICAgIHsgdHlwZTogU2Nhbm5lZEFjdGlvbnNTdWJqZWN0IH0sCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW19ST09UX1NUT1JFX0dVQVJELF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtfQUNUSU9OX1RZUEVfVU5JUVVFTkVTU19DSEVDSyxdIH1dIH0KICAgIF07CiAgICBjbGFzcyBTdG9yZUZlYXR1cmVNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZXMKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVSZWR1Y2VycwogICAgICAgICAqIEBwYXJhbSB7P30gcmVkdWNlck1hbmFnZXIKICAgICAgICAgKiBAcGFyYW0gez99IHJvb3QKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbkNoZWNrCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZmVhdHVyZXMsIGZlYXR1cmVSZWR1Y2VycywgcmVkdWNlck1hbmFnZXIsIHJvb3QsIGFjdGlvbkNoZWNrKSB7CiAgICAgICAgICAgIHRoaXMuZmVhdHVyZXMgPSBmZWF0dXJlczsKICAgICAgICAgICAgdGhpcy5mZWF0dXJlUmVkdWNlcnMgPSBmZWF0dXJlUmVkdWNlcnM7CiAgICAgICAgICAgIHRoaXMucmVkdWNlck1hbmFnZXIgPSByZWR1Y2VyTWFuYWdlcjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmZWF0cyA9IGZlYXR1cmVzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmVhdHVyZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZlYXR1cmVSZWR1Y2VyQ29sbGVjdGlvbiA9IGZlYXR1cmVSZWR1Y2Vycy5zaGlmdCgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVkdWNlcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZmVhdHVyZVJlZHVjZXJDb2xsZWN0aW9uIC8qVE9ETygjODIzKSovKSlbaW5kZXhdOwogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZmVhdHVyZSksIHsgcmVkdWNlcnMsIGluaXRpYWxTdGF0ZTogX2luaXRpYWxTdGF0ZUZhY3RvcnkoZmVhdHVyZS5pbml0aWFsU3RhdGUpIH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJlZHVjZXJNYW5hZ2VyLmFkZEZlYXR1cmVzKGZlYXRzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5yZWR1Y2VyTWFuYWdlci5yZW1vdmVGZWF0dXJlcyh0aGlzLmZlYXR1cmVzKTsKICAgICAgICB9CiAgICB9CiAgICBTdG9yZUZlYXR1cmVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTdG9yZUZlYXR1cmVNb2R1bGUgfSk7CiAgICBTdG9yZUZlYXR1cmVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBTdG9yZUZlYXR1cmVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RvcmVGZWF0dXJlTW9kdWxlKSjJtcm1aW5qZWN0KF9TVE9SRV9GRUFUVVJFUyksIMm1ybVpbmplY3QoRkVBVFVSRV9SRURVQ0VSUyksIMm1ybVpbmplY3QoUmVkdWNlck1hbmFnZXIpLCDJtcm1aW5qZWN0KFN0b3JlUm9vdE1vZHVsZSksIMm1ybVpbmplY3QoX0FDVElPTl9UWVBFX1VOSVFVRU5FU1NfQ0hFQ0ssIDgpKTsgfSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU3RvcmVGZWF0dXJlTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW19TVE9SRV9GRUFUVVJFUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRkVBVFVSRV9SRURVQ0VSUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBSZWR1Y2VyTWFuYWdlciB9LAogICAgICAgIHsgdHlwZTogU3RvcmVSb290TW9kdWxlIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbX0FDVElPTl9UWVBFX1VOSVFVRU5FU1NfQ0hFQ0ssXSB9XSB9CiAgICBdOwogICAgY2xhc3MgU3RvcmVNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcnMKICAgICAgICAgKiBAcGFyYW0gez89fSBjb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmb3JSb290KHJlZHVjZXJzLCBjb25maWcgPSB7fSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmdNb2R1bGU6IFN0b3JlUm9vdE1vZHVsZSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX1JPT1RfU1RPUkVfR1VBUkQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9wcm92aWRlRm9yUm9vdEd1YXJkLAogICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiBbW1N0b3JlLCBuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCldXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogX0lOSVRJQUxfU1RBVEUsIHVzZVZhbHVlOiBjb25maWcuaW5pdGlhbFN0YXRlIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBJTklUSUFMX1NUQVRFLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBfaW5pdGlhbFN0YXRlRmFjdG9yeSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogW19JTklUSUFMX1NUQVRFXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogX0lOSVRJQUxfUkVEVUNFUlMsIHVzZVZhbHVlOiByZWR1Y2VycyB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX1NUT1JFX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogcmVkdWNlcnMgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbiA/IHJlZHVjZXJzIDogX0lOSVRJQUxfUkVEVUNFUlMsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IElOSVRJQUxfUkVEVUNFUlMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtJbmplY3RvciwgX0lOSVRJQUxfUkVEVUNFUlMsIFtuZXcgSW5qZWN0KF9TVE9SRV9SRURVQ0VSUyldXSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogX2NyZWF0ZVN0b3JlUmVkdWNlcnMsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFVTRVJfUFJPVklERURfTUVUQV9SRURVQ0VSUywKICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZy5tZXRhUmVkdWNlcnMgPyBjb25maWcubWV0YVJlZHVjZXJzIDogW10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9SRVNPTFZFRF9NRVRBX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiBbTUVUQV9SRURVQ0VSUywgVVNFUl9QUk9WSURFRF9NRVRBX1JFRFVDRVJTXSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogX2NvbmNhdE1ldGFSZWR1Y2VycywKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX1JFRFVDRVJfRkFDVE9SWSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGNvbmZpZy5yZWR1Y2VyRmFjdG9yeQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcucmVkdWNlckZhY3RvcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogY29tYmluZVJlZHVjZXJzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBSRURVQ0VSX0ZBQ1RPUlksCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtfUkVEVUNFUl9GQUNUT1JZLCBfUkVTT0xWRURfTUVUQV9SRURVQ0VSU10sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGNyZWF0ZVJlZHVjZXJGYWN0b3J5LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgQUNUSU9OU19TVUJKRUNUX1BST1ZJREVSUywKICAgICAgICAgICAgICAgICAgICBSRURVQ0VSX01BTkFHRVJfUFJPVklERVJTLAogICAgICAgICAgICAgICAgICAgIFNDQU5ORURfQUNUSU9OU19TVUJKRUNUX1BST1ZJREVSUywKICAgICAgICAgICAgICAgICAgICBTVEFURV9QUk9WSURFUlMsCiAgICAgICAgICAgICAgICAgICAgU1RPUkVfUFJPVklERVJTLAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVSdW50aW1lQ2hlY2tzKGNvbmZpZy5ydW50aW1lQ2hlY2tzKSwKICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckFjdGlvblR5cGVVbmlxdWVuZXNzKCksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVOYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSByZWR1Y2VycwogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZvckZlYXR1cmUoZmVhdHVyZU5hbWUsIHJlZHVjZXJzLCBjb25maWcgPSB7fSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmdNb2R1bGU6IFN0b3JlRmVhdHVyZU1vZHVsZSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX0ZFQVRVUkVfQ09ORklHUywKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFNUT1JFX0ZFQVRVUkVTLAogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleTogZmVhdHVyZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWR1Y2VyRmFjdG9yeTogIShjb25maWcgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgJiYgY29uZmlnLnJlZHVjZXJGYWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25maWcucmVkdWNlckZhY3RvcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGNvbWJpbmVSZWR1Y2VycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFSZWR1Y2VyczogIShjb25maWcgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgJiYgY29uZmlnLm1ldGFSZWR1Y2VycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gY29uZmlnLm1ldGFSZWR1Y2VycwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogW10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0aWFsU3RhdGU6ICEoY29uZmlnIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4pICYmIGNvbmZpZy5pbml0aWFsU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbmZpZy5pbml0aWFsU3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX1NUT1JFX0ZFQVRVUkVTLAogICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiBbSW5qZWN0b3IsIF9GRUFUVVJFX0NPTkZJR1MsIFNUT1JFX0ZFQVRVUkVTXSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogX2NyZWF0ZUZlYXR1cmVTdG9yZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogX0ZFQVRVUkVfUkVEVUNFUlMsIG11bHRpOiB0cnVlLCB1c2VWYWx1ZTogcmVkdWNlcnMgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9GRUFUVVJFX1JFRFVDRVJTX1RPS0VOLAogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IHJlZHVjZXJzIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4gPyByZWR1Y2VycyA6IF9GRUFUVVJFX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBGRUFUVVJFX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5qZWN0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRkVBVFVSRV9SRURVQ0VSUywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtuZXcgSW5qZWN0KF9GRUFUVVJFX1JFRFVDRVJTX1RPS0VOKV0sCiAgICAgICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IF9jcmVhdGVGZWF0dXJlUmVkdWNlcnMsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBjaGVja0ZvckFjdGlvblR5cGVVbmlxdWVuZXNzKCksCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIFN0b3JlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogU3RvcmVNb2R1bGUgfSk7CiAgICBTdG9yZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFN0b3JlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFN0b3JlTW9kdWxlKSgpOyB9IH0pOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluamVjdG9yCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXJzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfY3JlYXRlU3RvcmVSZWR1Y2VycyhpbmplY3RvciwgcmVkdWNlcnMpIHsKICAgICAgICByZXR1cm4gcmVkdWNlcnMgaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbiA/IGluamVjdG9yLmdldChyZWR1Y2VycykgOiByZWR1Y2VyczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBjb25maWdzCiAgICAgKiBAcGFyYW0gez99IGZlYXR1cmVTdG9yZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jcmVhdGVGZWF0dXJlU3RvcmUoaW5qZWN0b3IsIGNvbmZpZ3MsIGZlYXR1cmVTdG9yZXMpIHsKICAgICAgICByZXR1cm4gZmVhdHVyZVN0b3Jlcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZmVhdAogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChmZWF0LCBpbmRleCkgPT4gewogICAgICAgICAgICBpZiAoY29uZmlnc1tpbmRleF0gaW5zdGFuY2VvZiBJbmplY3Rpb25Ub2tlbikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29uZiA9IGluamVjdG9yLmdldChjb25maWdzW2luZGV4XSk7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGtleTogZmVhdC5rZXksCiAgICAgICAgICAgICAgICAgICAgcmVkdWNlckZhY3Rvcnk6IGNvbmYucmVkdWNlckZhY3RvcnkKICAgICAgICAgICAgICAgICAgICAgICAgPyBjb25mLnJlZHVjZXJGYWN0b3J5CiAgICAgICAgICAgICAgICAgICAgICAgIDogY29tYmluZVJlZHVjZXJzLAogICAgICAgICAgICAgICAgICAgIG1ldGFSZWR1Y2VyczogY29uZi5tZXRhUmVkdWNlcnMgPyBjb25mLm1ldGFSZWR1Y2VycyA6IFtdLAogICAgICAgICAgICAgICAgICAgIGluaXRpYWxTdGF0ZTogY29uZi5pbml0aWFsU3RhdGUsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmZWF0OwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSByZWR1Y2VyQ29sbGVjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2NyZWF0ZUZlYXR1cmVSZWR1Y2VycyhpbmplY3RvciwgcmVkdWNlckNvbGxlY3Rpb24pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVkdWNlcnMgPSByZWR1Y2VyQ29sbGVjdGlvbi5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVkdWNlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVkdWNlciA9PiB7CiAgICAgICAgICAgIHJldHVybiByZWR1Y2VyIGluc3RhbmNlb2YgSW5qZWN0aW9uVG9rZW4gPyBpbmplY3Rvci5nZXQocmVkdWNlcikgOiByZWR1Y2VyOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gcmVkdWNlcnM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5pdGlhbFN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfaW5pdGlhbFN0YXRlRmFjdG9yeShpbml0aWFsU3RhdGUpIHsKICAgICAgICBpZiAodHlwZW9mIGluaXRpYWxTdGF0ZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICByZXR1cm4gaW5pdGlhbFN0YXRlKCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbml0aWFsU3RhdGU7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0YVJlZHVjZXJzCiAgICAgKiBAcGFyYW0gez99IHVzZXJQcm92aWRlZE1ldGFSZWR1Y2VycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2NvbmNhdE1ldGFSZWR1Y2VycyhtZXRhUmVkdWNlcnMsIHVzZXJQcm92aWRlZE1ldGFSZWR1Y2VycykgewogICAgICAgIHJldHVybiBtZXRhUmVkdWNlcnMuY29uY2F0KHVzZXJQcm92aWRlZE1ldGFSZWR1Y2Vycyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9wcm92aWRlRm9yUm9vdEd1YXJkKHN0b3JlKSB7CiAgICAgICAgaWYgKHN0b3JlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoYFN0b3JlTW9kdWxlLmZvclJvb3QoKSBjYWxsZWQgdHdpY2UuIEZlYXR1cmUgbW9kdWxlcyBzaG91bGQgdXNlIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoKSBpbnN0ZWFkLmApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gJ2d1YXJkZWQnOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBc3NvY2lhdGVzIGFjdGlvbnMgd2l0aCBhIGdpdmVuIHN0YXRlIGNoYW5nZSBmdW5jdGlvbi4KICAgICAqIEEgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgYXMgdGhlIGxhc3QgcGFyYW1ldGVyLgogICAgICoKICAgICAqIEBwYXJhbSB7Li4uP30gYXJncyBgQWN0aW9uQ3JlYXRvcmAncyBmb2xsb3dlZCBieSBhIHN0YXRlIGNoYW5nZSBmdW5jdGlvbi4KICAgICAqCiAgICAgKiAqKlRvIG1haW50YWluIHR5cGUtc2FmZXR5Kio6IHBhc3MgMTAgb3IgbGVzcyBgQWN0aW9uQ3JlYXRvcmAncy4KICAgICAqIEByZXR1cm4gez99IGFuIGFzc29jaWF0aW9uIG9mIGFjdGlvbiB0eXBlcyB3aXRoIGEgc3RhdGUgY2hhbmdlIGZ1bmN0aW9uLgogICAgICovCiAgICBmdW5jdGlvbiBvbiguLi5hcmdzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlZHVjZXIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYXJncy5wb3AoKSkpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0eXBlcyA9IGFyZ3MucmVkdWNlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlc3VsdAogICAgICAgICAqIEBwYXJhbSB7P30gY3JlYXRvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHJlc3VsdCwgY3JlYXRvcikgPT4gWy4uLnJlc3VsdCwgKCgvKiogQHR5cGUgez99ICovIChjcmVhdG9yKSkpLnR5cGVdKSwgKC8qKiBAdHlwZSB7P30gKi8gKFtdKSkpOwogICAgICAgIHJldHVybiB7IHJlZHVjZXIsIHR5cGVzIH07CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIENyZWF0ZXMgYSByZWR1Y2VyIGZ1bmN0aW9uIHRvIGhhbmRsZSBzdGF0ZSB0cmFuc2l0aW9ucy4KICAgICAqCiAgICAgKiBSZWR1Y2VyIGNyZWF0b3JzIHJlZHVjZSB0aGUgZXhwbGljaXRuZXNzIG9mIHJlZHVjZXIgZnVuY3Rpb25zIHdpdGggc3dpdGNoIHN0YXRlbWVudHMuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogLSBNdXN0IGJlIHVzZWQgd2l0aCBgQWN0aW9uQ3JlYXRvcmAncyAocmV0dXJuZWQgYnkgYGNyZWF0ZUFjdGlvbmApLiAgQ2Fubm90IGJlIHVzZWQgd2l0aCBjbGFzcy1iYXNlZCBhY3Rpb24gY3JlYXRvcnMuCiAgICAgKiAtIFRoZSByZXR1cm5lZCBgQWN0aW9uUmVkdWNlcmAgc2hvdWxkIGFkZGl0aW9uYWxseSBiZSByZXR1cm5lZCBmcm9tIGFuIGV4cG9ydGVkIGByZWR1Y2VyYCBmdW5jdGlvbiwgaWYgeW91IGFyZSB1c2luZyBWaWV3IEVuZ2luZS4KICAgICAqIEluIGNhc2UgeW91IGFyZSB1c2luZyBJdnkgdGhlIGV4dHJhIGZ1bmN0aW9uIGByZWR1Y2VyYCBpcyBub3QgcmVxdWlyZWQuCiAgICAgKgogICAgICogKipEZWNsYXJpbmcgYSByZWR1Y2VyIGNyZWF0b3Igd2l0aCBhbiBleHBvcnRlZCByZWR1Y2VyIGZ1bmN0aW9uKioKICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgZmVhdHVyZVJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKAogICAgICogICBpbml0aWFsU3RhdGUsCiAgICAgKiAgIG9uKAogICAgICogICAgIGZlYXR1cmVBY3Rpb25zLmFjdGlvbk9uZSwKICAgICAqICAgICBmZWF0dXJlQWN0aW9ucy5hY3Rpb25Ud28sCiAgICAgKiAgICAgKHN0YXRlLCB7IHVwZGF0ZWRWYWx1ZSB9KSA9PiAoeyAuLi5zdGF0ZSwgcHJvcDogdXBkYXRlZFZhbHVlIH0pCiAgICAgKiAgICksCiAgICAgKiAgIG9uKGZlYXR1cmVBY3Rpb25zLmFjdGlvblRocmVlLCAoKSA9PiBpbml0aWFsU3RhdGUpOwogICAgICogKTsKICAgICAqCiAgICAgKiBleHBvcnQgZnVuY3Rpb24gcmVkdWNlcihzdGF0ZTogU3RhdGUgfCB1bmRlZmluZWQsIGFjdGlvbjogQWN0aW9uKSB7CiAgICAgKiAgIHJldHVybiBmZWF0dXJlUmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICogQHRlbXBsYXRlIFMsIEEKICAgICAqIEBwYXJhbSB7P30gaW5pdGlhbFN0YXRlIFByb3ZpZGVzIGEgc3RhdGUgdmFsdWUgaWYgdGhlIGN1cnJlbnQgc3RhdGUgaXMgYHVuZGVmaW5lZGAsIGFzIGl0IGlzIGluaXRpYWxseS4KICAgICAqIEBwYXJhbSB7Li4uP30gb25zIEFzc29jaWF0aW9ucyBiZXR3ZWVuIGFjdGlvbnMgYW5kIHN0YXRlIGNoYW5nZXMuCiAgICAgKiBAcmV0dXJuIHs/fSBBIHJlZHVjZXIgZnVuY3Rpb24uCiAgICAgKgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSwgLi4ub25zKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoKTsKICAgICAgICBmb3IgKGxldCBvbiBvZiBvbnMpIHsKICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBvZiBvbi50eXBlcykgewogICAgICAgICAgICAgICAgaWYgKG1hcC5oYXModHlwZSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdSZWR1Y2VyID0gKC8qKiBAdHlwZSB7P30gKi8gKG1hcC5nZXQodHlwZSkpKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3UmVkdWNlciA9ICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiBvbi5yZWR1Y2VyKGV4aXN0aW5nUmVkdWNlcihzdGF0ZSwgYWN0aW9uKSwgYWN0aW9uKSk7CiAgICAgICAgICAgICAgICAgICAgbWFwLnNldCh0eXBlLCBuZXdSZWR1Y2VyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1hcC5zZXQodHlwZSwgb24ucmVkdWNlcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBzdGF0ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZnVuY3Rpb24gKHN0YXRlID0gaW5pdGlhbFN0YXRlLCBhY3Rpb24pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWR1Y2VyID0gbWFwLmdldChhY3Rpb24udHlwZSk7CiAgICAgICAgICAgIHJldHVybiByZWR1Y2VyID8gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKSA6IHN0YXRlOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UgTmdSeCA5LjIuMAogICAgICogKGMpIDIwMTUtMjAxOCBCcmFuZG9uIFJvYmVydHMsIE1pa2UgUnlhbiwgUm9iIFdvcm1hbGQsIFZpY3RvciBTYXZraW4KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUZBVUxUX0VGRkVDVF9DT05GSUcgPSB7CiAgICAgICAgZGlzcGF0Y2g6IHRydWUsCiAgICAgICAgdXNlRWZmZWN0c0Vycm9ySGFuZGxlcjogdHJ1ZSwKICAgIH07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDUkVBVEVfRUZGRUNUX01FVEFEQVRBX0tFWSA9ICdfX0BuZ3J4L2VmZmVjdHNfY3JlYXRlX18nOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RfY3JlYXRvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIENyZWF0ZXMgYW4gZWZmZWN0IGZyb20gYW4gYE9ic2VydmFibGVgIGFuZCBhbiBgRWZmZWN0Q29uZmlnYC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAqKiBNYXBwaW5nIHRvIGEgZGlmZmVyZW50IGFjdGlvbiAqKgogICAgICogYGBgdHMKICAgICAqIGVmZmVjdE5hbWUkID0gY3JlYXRlRWZmZWN0KAogICAgICogICAoKSA9PiB0aGlzLmFjdGlvbnMkLnBpcGUoCiAgICAgKiAgICAgb2ZUeXBlKEZlYXR1cmVBY3Rpb25zLmFjdGlvbk9uZSksCiAgICAgKiAgICAgbWFwKCgpID0+IEZlYXR1cmVBY3Rpb25zLmFjdGlvblR3bygpKQogICAgICogICApCiAgICAgKiApOwogICAgICogYGBgCiAgICAgKgogICAgICogICoqIE5vbi1kaXNwYXRjaGluZyBlZmZlY3RzICoqCiAgICAgKiBgYGB0cwogICAgICogZWZmZWN0TmFtZSQgPSBjcmVhdGVFZmZlY3QoCiAgICAgKiAgICgpID0+IHRoaXMuYWN0aW9ucyQucGlwZSgKICAgICAqICAgICBvZlR5cGUoRmVhdHVyZUFjdGlvbnMuYWN0aW9uT25lKSwKICAgICAqICAgICB0YXAoKCkgPT4gY29uc29sZS5sb2coJ0FjdGlvbiBPbmUgRGlzcGF0Y2hlZCcpKQogICAgICogICApLAogICAgICogICB7IGRpc3BhdGNoOiBmYWxzZSB9CiAgICAgKiAgIC8vIEZlYXR1cmVBY3Rpb25zLmFjdGlvbk9uZSBpcyBub3QgZGlzcGF0Y2hlZAogICAgICogKTsKICAgICAqIGBgYAogICAgICogQHRlbXBsYXRlIEMsIERULCBPVCwgUgogICAgICogQHBhcmFtIHs/fSBzb3VyY2UgQSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFuIGBPYnNlcnZhYmxlYC4KICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZyBBIGBQYXJ0aWFsPEVmZmVjdENvbmZpZz5gIHRvIGNvbmZpZ3VyZSB0aGUgZWZmZWN0LiAgQnkgZGVmYXVsdCwgYGRpc3BhdGNoYCBpcyB0cnVlIGFuZCBgdXNlRWZmZWN0c0Vycm9ySGFuZGxlcmAgaXMgdHJ1ZS4KICAgICAqIEByZXR1cm4gez99IElmIGBFZmZlY3RDb25maWdgI2BkaXNwYXRjaGAgaXMgdHJ1ZSwgcmV0dXJucyBgT2JzZXJ2YWJsZTxBY3Rpb24+YC4gIEVsc2UsIHJldHVybnMgYE9ic2VydmFibGU8dW5rbm93bj5gLgogICAgICoKICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlRWZmZWN0KHNvdXJjZSwgY29uZmlnKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVmZmVjdCA9IHNvdXJjZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2YWx1ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgREVGQVVMVF9FRkZFQ1RfQ09ORklHKSwgY29uZmlnKTsKICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoZWZmZWN0LCBDUkVBVEVfRUZGRUNUX01FVEFEQVRBX0tFWSwgewogICAgICAgICAgICB2YWx1ZSwKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGVmZmVjdCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBpbnN0YW5jZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q3JlYXRlRWZmZWN0TWV0YWRhdGEoaW5zdGFuY2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcHJvcGVydHlOYW1lcyA9ICgvKiogQHR5cGUgez99ICovIChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhpbnN0YW5jZSkpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBwcm9wZXJ0eU5hbWVzCiAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwcm9wZXJ0eU5hbWUgPT4gaW5zdGFuY2VbcHJvcGVydHlOYW1lXSAmJgogICAgICAgICAgICBpbnN0YW5jZVtwcm9wZXJ0eU5hbWVdLmhhc093blByb3BlcnR5KENSRUFURV9FRkZFQ1RfTUVUQURBVEFfS0VZKSkpCiAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHlOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwcm9wZXJ0eU5hbWUgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1ldGFEYXRhID0gKCgvKiogQHR5cGUgez99ICovIChpbnN0YW5jZVtwcm9wZXJ0eU5hbWVdKSkpW0NSRUFURV9FRkZFQ1RfTUVUQURBVEFfS0VZXTsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBwcm9wZXJ0eU5hbWUgfSwgbWV0YURhdGEpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gbWV0YWRhdGE7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL3V0aWxzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNvdXJjZUZvckluc3RhbmNlKGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5nZXRQcm90b3R5cGVPZihpbnN0YW5jZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL2VmZmVjdF9kZWNvcmF0b3IudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTUVUQURBVEFfS0VZID0gJ19fQG5ncngvZWZmZWN0c19fJzsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEVmZmVjdERlY29yYXRvck1ldGFkYXRhKGluc3RhbmNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVmZmVjdHNEZWNvcmF0b3JzID0gY29tcG9zZShnZXRFZmZlY3RNZXRhZGF0YUVudHJpZXMsIGdldFNvdXJjZUZvckluc3RhbmNlKShpbnN0YW5jZSk7CiAgICAgICAgcmV0dXJuIGVmZmVjdHNEZWNvcmF0b3JzOwogICAgfQogICAgLyoqCiAgICAgKiBUeXBlIGd1YXJkIHRvIGRldGVtaW5lIHdoZXRoZXIgTUVUQURBVEFfS0VZIGlzIGFscmVhZHkgcHJlc2VudCBvbiB0aGUgQ2xhc3MKICAgICAqIGNvbnN0cnVjdG9yCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBzb3VyY2VQcm90bwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaGFzTWV0YWRhdGFFbnRyaWVzKHNvdXJjZVByb3RvKSB7CiAgICAgICAgcmV0dXJuIHNvdXJjZVByb3RvLmNvbnN0cnVjdG9yLmhhc093blByb3BlcnR5KE1FVEFEQVRBX0tFWSk7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZVByb3RvCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRFZmZlY3RNZXRhZGF0YUVudHJpZXMoc291cmNlUHJvdG8pIHsKICAgICAgICByZXR1cm4gaGFzTWV0YWRhdGFFbnRyaWVzKHNvdXJjZVByb3RvKQogICAgICAgICAgICA/IHNvdXJjZVByb3RvLmNvbnN0cnVjdG9yW01FVEFEQVRBX0tFWV0KICAgICAgICAgICAgOiBbXTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNvdXJjZU1ldGFkYXRhKGluc3RhbmNlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVmZmVjdHMgPSBbCiAgICAgICAgICAgIGdldEVmZmVjdERlY29yYXRvck1ldGFkYXRhLAogICAgICAgICAgICBnZXRDcmVhdGVFZmZlY3RNZXRhZGF0YSwKICAgICAgICBdOwogICAgICAgIHJldHVybiBlZmZlY3RzLnJlZHVjZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VzCiAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzb3VyY2VzLCBzb3VyY2UpID0+IHNvdXJjZXMuY29uY2F0KHNvdXJjZShpbnN0YW5jZSkpKSwgW10pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RzX3Jlc29sdmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2VJbnN0YW5jZQogICAgICogQHBhcmFtIHs/fSBnbG9iYWxFcnJvckhhbmRsZXIKICAgICAqIEBwYXJhbSB7P30gZWZmZWN0c0Vycm9ySGFuZGxlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWVyZ2VFZmZlY3RzKHNvdXJjZUluc3RhbmNlLCBnbG9iYWxFcnJvckhhbmRsZXIsIGVmZmVjdHNFcnJvckhhbmRsZXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc291cmNlTmFtZSA9IGdldFNvdXJjZUZvckluc3RhbmNlKHNvdXJjZUluc3RhbmNlKS5jb25zdHJ1Y3Rvci5uYW1lOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyQgPSBnZXRTb3VyY2VNZXRhZGF0YShzb3VyY2VJbnN0YW5jZSkubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHsgcHJvcGVydHlOYW1lLCBkaXNwYXRjaCwgdXNlRWZmZWN0c0Vycm9ySGFuZGxlciwgfSkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGUkID0gdHlwZW9mIHNvdXJjZUluc3RhbmNlW3Byb3BlcnR5TmFtZV0gPT09ICdmdW5jdGlvbicKICAgICAgICAgICAgICAgID8gc291cmNlSW5zdGFuY2VbcHJvcGVydHlOYW1lXSgpCiAgICAgICAgICAgICAgICA6IHNvdXJjZUluc3RhbmNlW3Byb3BlcnR5TmFtZV07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWZmZWN0QWN0aW9uJCA9IHVzZUVmZmVjdHNFcnJvckhhbmRsZXIKICAgICAgICAgICAgICAgID8gZWZmZWN0c0Vycm9ySGFuZGxlcihvYnNlcnZhYmxlJCwgZ2xvYmFsRXJyb3JIYW5kbGVyKQogICAgICAgICAgICAgICAgOiBvYnNlcnZhYmxlJDsKICAgICAgICAgICAgaWYgKGRpc3BhdGNoID09PSBmYWxzZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIGVmZmVjdEFjdGlvbiQucGlwZShpZ25vcmVFbGVtZW50cygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hdGVyaWFsaXplZCQgPSBlZmZlY3RBY3Rpb24kLnBpcGUobWF0ZXJpYWxpemUoKSk7CiAgICAgICAgICAgIHJldHVybiBtYXRlcmlhbGl6ZWQkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBub3RpZmljYXRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChub3RpZmljYXRpb24pID0+ICh7CiAgICAgICAgICAgICAgICBlZmZlY3Q6IHNvdXJjZUluc3RhbmNlW3Byb3BlcnR5TmFtZV0sCiAgICAgICAgICAgICAgICBub3RpZmljYXRpb24sCiAgICAgICAgICAgICAgICBwcm9wZXJ0eU5hbWUsCiAgICAgICAgICAgICAgICBzb3VyY2VOYW1lLAogICAgICAgICAgICAgICAgc291cmNlSW5zdGFuY2UsCiAgICAgICAgICAgIH0pKSkpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gbWVyZ2UoLi4ub2JzZXJ2YWJsZXMkKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvZWZmZWN0c19lcnJvcl9oYW5kbGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE1BWF9OVU1CRVJfT0ZfUkVUUllfQVRURU1QVFMgPSAxMDsKICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2YWJsZSQKICAgICAqIEBwYXJhbSB7P30gZXJyb3JIYW5kbGVyCiAgICAgKiBAcGFyYW0gez89fSByZXRyeUF0dGVtcHRMZWZ0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBkZWZhdWx0RWZmZWN0c0Vycm9ySGFuZGxlcihvYnNlcnZhYmxlJCwgZXJyb3JIYW5kbGVyLCByZXRyeUF0dGVtcHRMZWZ0ID0gTUFYX05VTUJFUl9PRl9SRVRSWV9BVFRFTVBUUykgewogICAgICAgIHJldHVybiBvYnNlcnZhYmxlJC5waXBlKGNhdGNoRXJyb3IoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVycm9yID0+IHsKICAgICAgICAgICAgaWYgKGVycm9ySGFuZGxlcikKICAgICAgICAgICAgICAgIGVycm9ySGFuZGxlci5oYW5kbGVFcnJvcihlcnJvcik7CiAgICAgICAgICAgIGlmIChyZXRyeUF0dGVtcHRMZWZ0IDw9IDEpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvYnNlcnZhYmxlJDsgLy8gbGFzdCBhdHRlbXB0CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmV0dXJuIG9ic2VydmFibGUgdGhhdCBwcm9kdWNlcyB0aGlzIHBhcnRpY3VsYXIgZWZmZWN0CiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0RWZmZWN0c0Vycm9ySGFuZGxlcihvYnNlcnZhYmxlJCwgZXJyb3JIYW5kbGVyLCByZXRyeUF0dGVtcHRMZWZ0IC0gMSk7CiAgICAgICAgfSkpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvYWN0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBWCiAgICAgKi8KICAgIGNsYXNzIEFjdGlvbnMgZXh0ZW5kcyBPYnNlcnZhYmxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBzb3VyY2UKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihzb3VyY2UpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgaWYgKHNvdXJjZSkgewogICAgICAgICAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHRlbXBsYXRlIFIKICAgICAgICAgKiBAcGFyYW0gez99IG9wZXJhdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBsaWZ0KG9wZXJhdG9yKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb2JzZXJ2YWJsZSA9IG5ldyBBY3Rpb25zKCk7CiAgICAgICAgICAgIG9ic2VydmFibGUuc291cmNlID0gdGhpczsKICAgICAgICAgICAgb2JzZXJ2YWJsZS5vcGVyYXRvciA9IG9wZXJhdG9yOwogICAgICAgICAgICByZXR1cm4gb2JzZXJ2YWJsZTsKICAgICAgICB9CiAgICB9CiAgICBBY3Rpb25zLsm1ZmFjID0gZnVuY3Rpb24gQWN0aW9uc19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBY3Rpb25zKSjJtcm1aW5qZWN0KFNjYW5uZWRBY3Rpb25zU3ViamVjdCkpOyB9OwogICAgQWN0aW9ucy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBBY3Rpb25zLCBmYWN0b3J5OiBBY3Rpb25zLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBY3Rpb25zLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogT2JzZXJ2YWJsZSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbU2Nhbm5lZEFjdGlvbnNTdWJqZWN0LF0gfV0gfQogICAgXTsKICAgIC8qKgogICAgICogQHBhcmFtIHsuLi4/fSBhbGxvd2VkVHlwZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG9mVHlwZSguLi5hbGxvd2VkVHlwZXMpIHsKICAgICAgICByZXR1cm4gZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGFjdGlvbikgPT4gYWxsb3dlZFR5cGVzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdHlwZU9yQWN0aW9uQ3JlYXRvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PiB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdHlwZU9yQWN0aW9uQ3JlYXRvciA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vIENvbXBhcmluZyB0aGUgc3RyaW5nIHRvIHR5cGUKICAgICAgICAgICAgICAgIHJldHVybiB0eXBlT3JBY3Rpb25DcmVhdG9yID09PSBhY3Rpb24udHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBhcmUgZmlsdGVyaW5nIGJ5IEFjdGlvbkNyZWF0b3IKICAgICAgICAgICAgcmV0dXJuIHR5cGVPckFjdGlvbkNyZWF0b3IudHlwZSA9PT0gYWN0aW9uLnR5cGU7CiAgICAgICAgfSkpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gb3V0cHV0CiAgICAgKiBAcGFyYW0gez99IHJlcG9ydGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXBvcnRJbnZhbGlkQWN0aW9ucyhvdXRwdXQsIHJlcG9ydGVyKSB7CiAgICAgICAgaWYgKG91dHB1dC5ub3RpZmljYXRpb24ua2luZCA9PT0gJ04nKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWN0aW9uID0gb3V0cHV0Lm5vdGlmaWNhdGlvbi52YWx1ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0ludmFsaWRBY3Rpb24gPSAhaXNBY3Rpb24oYWN0aW9uKTsKICAgICAgICAgICAgaWYgKGlzSW52YWxpZEFjdGlvbikgewogICAgICAgICAgICAgICAgcmVwb3J0ZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGBFZmZlY3QgJHtnZXRFZmZlY3ROYW1lKG91dHB1dCl9IGRpc3BhdGNoZWQgYW4gaW52YWxpZCBhY3Rpb246ICR7c3RyaW5naWZ5JDEoYWN0aW9uKX1gKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0FjdGlvbihhY3Rpb24pIHsKICAgICAgICByZXR1cm4gKHR5cGVvZiBhY3Rpb24gIT09ICdmdW5jdGlvbicgJiYKICAgICAgICAgICAgYWN0aW9uICYmCiAgICAgICAgICAgIGFjdGlvbi50eXBlICYmCiAgICAgICAgICAgIHR5cGVvZiBhY3Rpb24udHlwZSA9PT0gJ3N0cmluZycpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RWZmZWN0TmFtZSh7IHByb3BlcnR5TmFtZSwgc291cmNlSW5zdGFuY2UsIHNvdXJjZU5hbWUsIH0pIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaXNNZXRob2QgPSB0eXBlb2Ygc291cmNlSW5zdGFuY2VbcHJvcGVydHlOYW1lXSA9PT0gJ2Z1bmN0aW9uJzsKICAgICAgICByZXR1cm4gYCIke3NvdXJjZU5hbWV9LiR7U3RyaW5nKHByb3BlcnR5TmFtZSl9JHtpc01ldGhvZCA/ICcoKScgOiAnJ30iYDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0cmluZ2lmeSQxKGFjdGlvbikgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhY3Rpb24pOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIGFjdGlvbjsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBtb2R1bGVzL2VmZmVjdHMvc3JjL2xpZmVjeWNsZV9ob29rcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvbklkZW50aWZ5RWZmZWN0c0tleSA9ICduZ3J4T25JZGVudGlmeUVmZmVjdHMnOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc09uSWRlbnRpZnlFZmZlY3RzKGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24kMihpbnN0YW5jZSwgb25JZGVudGlmeUVmZmVjdHNLZXkpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb25SdW5FZmZlY3RzS2V5ID0gJ25ncnhPblJ1bkVmZmVjdHMnOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc09uUnVuRWZmZWN0cyhpbnN0YW5jZSkgewogICAgICAgIHJldHVybiBpc0Z1bmN0aW9uJDIoaW5zdGFuY2UsIG9uUnVuRWZmZWN0c0tleSk7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBvbkluaXRFZmZlY3RzID0gJ25ncnhPbkluaXRFZmZlY3RzJzsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbnN0YW5jZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNPbkluaXRFZmZlY3RzKGluc3RhbmNlKSB7CiAgICAgICAgcmV0dXJuIGlzRnVuY3Rpb24kMihpbnN0YW5jZSwgb25Jbml0RWZmZWN0cyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7P30gZnVuY3Rpb25OYW1lCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0Z1bmN0aW9uJDIoaW5zdGFuY2UsIGZ1bmN0aW9uTmFtZSkgewogICAgICAgIHJldHVybiAoaW5zdGFuY2UgJiYKICAgICAgICAgICAgZnVuY3Rpb25OYW1lIGluIGluc3RhbmNlICYmCiAgICAgICAgICAgIHR5cGVvZiBpbnN0YW5jZVtmdW5jdGlvbk5hbWVdID09PSAnZnVuY3Rpb24nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IG1vZHVsZXMvZWZmZWN0cy9zcmMvdG9rZW5zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9ST09UX0VGRkVDVFNfR1VBUkQgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0BuZ3J4L2VmZmVjdHMgSW50ZXJuYWwgUm9vdCBHdWFyZCcpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSU1NRURJQVRFX0VGRkVDVFMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ25ncngvZWZmZWN0czogSW1tZWRpYXRlIEVmZmVjdHMnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFVTRVJfUFJPVklERURfRUZGRUNUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbmdyeC9lZmZlY3RzOiBVc2VyIFByb3ZpZGVkIEVmZmVjdHMnKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9ST09UX0VGRkVDVFMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ25ncngvZWZmZWN0czogSW50ZXJuYWwgUm9vdCBFZmZlY3RzJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBST09UX0VGRkVDVFMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ25ncngvZWZmZWN0czogUm9vdCBFZmZlY3RzJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfRkVBVFVSRV9FRkZFQ1RTID0gbmV3IEluamVjdGlvblRva2VuKCduZ3J4L2VmZmVjdHM6IEludGVybmFsIEZlYXR1cmUgRWZmZWN0cycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRkVBVFVSRV9FRkZFQ1RTID0gbmV3IEluamVjdGlvblRva2VuKCduZ3J4L2VmZmVjdHM6IEZlYXR1cmUgRWZmZWN0cycpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRUZGRUNUU19FUlJPUl9IQU5ETEVSID0gbmV3IEluamVjdGlvblRva2VuKCduZ3J4L2VmZmVjdHM6IEVmZmVjdHMgRXJyb3IgSGFuZGxlcicpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3Rfc291cmNlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBFZmZlY3RTb3VyY2VzIGV4dGVuZHMgU3ViamVjdCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvckhhbmRsZXIKICAgICAgICAgKiBAcGFyYW0gez99IGVmZmVjdHNFcnJvckhhbmRsZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlcnJvckhhbmRsZXIsIGVmZmVjdHNFcnJvckhhbmRsZXIpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5lcnJvckhhbmRsZXIgPSBlcnJvckhhbmRsZXI7CiAgICAgICAgICAgIHRoaXMuZWZmZWN0c0Vycm9ySGFuZGxlciA9IGVmZmVjdHNFcnJvckhhbmRsZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWZmZWN0U291cmNlSW5zdGFuY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZEVmZmVjdHMoZWZmZWN0U291cmNlSW5zdGFuY2UpIHsKICAgICAgICAgICAgdGhpcy5uZXh0KGVmZmVjdFNvdXJjZUluc3RhbmNlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9BY3Rpb25zKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5waXBlKGdyb3VwQnkoZ2V0U291cmNlRm9ySW5zdGFuY2UpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlJAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc291cmNlJCA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlJC5waXBlKGdyb3VwQnkoZWZmZWN0c0luc3RhbmNlKSk7CiAgICAgICAgICAgIH0pKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZSQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHNvdXJjZSQgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0JCA9IHNvdXJjZSQucGlwZShleGhhdXN0TWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlSW5zdGFuY2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHNvdXJjZUluc3RhbmNlID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzb2x2ZUVmZmVjdFNvdXJjZSh0aGlzLmVycm9ySGFuZGxlciwgdGhpcy5lZmZlY3RzRXJyb3JIYW5kbGVyKShzb3VyY2VJbnN0YW5jZSk7CiAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG91dHB1dAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgb3V0cHV0ID0+IHsKICAgICAgICAgICAgICAgICAgICByZXBvcnRJbnZhbGlkQWN0aW9ucyhvdXRwdXQsIHRoaXMuZXJyb3JIYW5kbGVyKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0Lm5vdGlmaWNhdGlvbjsKICAgICAgICAgICAgICAgIH0pKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm90aWZpY2F0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAobm90aWZpY2F0aW9uKSA9PiBub3RpZmljYXRpb24ua2luZCA9PT0gJ04nKSksIGRlbWF0ZXJpYWxpemUoKSk7CiAgICAgICAgICAgICAgICAvLyBzdGFydCB0aGUgc3RyZWFtIHdpdGggYW4gSU5JVCBhY3Rpb24KICAgICAgICAgICAgICAgIC8vIGRvIHRoaXMgb25seSBmb3IgdGhlIGZpcnN0IEVmZmVjdCBpbnN0YW5jZQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5pdCQgPSBzb3VyY2UkLnBpcGUodGFrZSgxKSwgZmlsdGVyKGlzT25Jbml0RWZmZWN0cyksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluc3RhbmNlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpbnN0YW5jZSA9PiBpbnN0YW5jZS5uZ3J4T25Jbml0RWZmZWN0cygpKSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKGVmZmVjdCQsIGluaXQkKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICB9CiAgICBFZmZlY3RTb3VyY2VzLsm1ZmFjID0gZnVuY3Rpb24gRWZmZWN0U291cmNlc19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFZmZlY3RTb3VyY2VzKSjJtcm1aW5qZWN0KEVycm9ySGFuZGxlciksIMm1ybVpbmplY3QoRUZGRUNUU19FUlJPUl9IQU5ETEVSKSk7IH07CiAgICBFZmZlY3RTb3VyY2VzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEVmZmVjdFNvdXJjZXMsIGZhY3Rvcnk6IEVmZmVjdFNvdXJjZXMuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEVmZmVjdFNvdXJjZXMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFcnJvckhhbmRsZXIgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRUZGRUNUU19FUlJPUl9IQU5ETEVSLF0gfV0gfQogICAgXTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2VJbnN0YW5jZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZWZmZWN0c0luc3RhbmNlKHNvdXJjZUluc3RhbmNlKSB7CiAgICAgICAgaWYgKGlzT25JZGVudGlmeUVmZmVjdHMoc291cmNlSW5zdGFuY2UpKSB7CiAgICAgICAgICAgIHJldHVybiBzb3VyY2VJbnN0YW5jZS5uZ3J4T25JZGVudGlmeUVmZmVjdHMoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICcnOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVycm9ySGFuZGxlcgogICAgICogQHBhcmFtIHs/fSBlZmZlY3RzRXJyb3JIYW5kbGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZXNvbHZlRWZmZWN0U291cmNlKGVycm9ySGFuZGxlciwgZWZmZWN0c0Vycm9ySGFuZGxlcikgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VJbnN0YW5jZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc291cmNlSW5zdGFuY2UgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lcmdlZEVmZmVjdHMkID0gbWVyZ2VFZmZlY3RzKHNvdXJjZUluc3RhbmNlLCBlcnJvckhhbmRsZXIsIGVmZmVjdHNFcnJvckhhbmRsZXIpOwogICAgICAgICAgICBpZiAoaXNPblJ1bkVmZmVjdHMoc291cmNlSW5zdGFuY2UpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlSW5zdGFuY2UubmdyeE9uUnVuRWZmZWN0cyhtZXJnZWRFZmZlY3RzJCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG1lcmdlZEVmZmVjdHMkOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RzX3J1bm5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBFZmZlY3RzUnVubmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVmZmVjdFNvdXJjZXMKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZWZmZWN0U291cmNlcywgc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5lZmZlY3RTb3VyY2VzID0gZWZmZWN0U291cmNlczsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXJ0KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5lZmZlY3RzU3Vic2NyaXB0aW9uID0gdGhpcy5lZmZlY3RTb3VyY2VzCiAgICAgICAgICAgICAgICAgICAgLnRvQWN0aW9ucygpCiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh0aGlzLnN0b3JlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5lZmZlY3RzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVmZmVjdHNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHRoaXMuZWZmZWN0c1N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBFZmZlY3RzUnVubmVyLsm1ZmFjID0gZnVuY3Rpb24gRWZmZWN0c1J1bm5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFZmZlY3RzUnVubmVyKSjJtcm1aW5qZWN0KEVmZmVjdFNvdXJjZXMpLCDJtcm1aW5qZWN0KFN0b3JlKSk7IH07CiAgICBFZmZlY3RzUnVubmVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEVmZmVjdHNSdW5uZXIsIGZhY3Rvcnk6IEVmZmVjdHNSdW5uZXIuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEVmZmVjdHNSdW5uZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFZmZlY3RTb3VyY2VzIH0sCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RzX3Jvb3RfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJPT1RfRUZGRUNUU19JTklUID0gJ0BuZ3J4L2VmZmVjdHMvaW5pdCc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByb290RWZmZWN0c0luaXQgPSBjcmVhdGVBY3Rpb24oUk9PVF9FRkZFQ1RTX0lOSVQpOwogICAgY2xhc3MgRWZmZWN0c1Jvb3RNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlcwogICAgICAgICAqIEBwYXJhbSB7P30gcnVubmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gcm9vdEVmZmVjdHMKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlUm9vdE1vZHVsZQogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmVGZWF0dXJlTW9kdWxlCiAgICAgICAgICogQHBhcmFtIHs/fSBndWFyZAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHNvdXJjZXMsIHJ1bm5lciwgc3RvcmUsIHJvb3RFZmZlY3RzLCBzdG9yZVJvb3RNb2R1bGUsIHN0b3JlRmVhdHVyZU1vZHVsZSwgZ3VhcmQpIHsKICAgICAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlczsKICAgICAgICAgICAgcnVubmVyLnN0YXJ0KCk7CiAgICAgICAgICAgIHJvb3RFZmZlY3RzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVmZmVjdFNvdXJjZUluc3RhbmNlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBlZmZlY3RTb3VyY2VJbnN0YW5jZSA9PiBzb3VyY2VzLmFkZEVmZmVjdHMoZWZmZWN0U291cmNlSW5zdGFuY2UpKSk7CiAgICAgICAgICAgIHN0b3JlLmRpc3BhdGNoKHsgdHlwZTogUk9PVF9FRkZFQ1RTX0lOSVQgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWZmZWN0U291cmNlSW5zdGFuY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZEVmZmVjdHMoZWZmZWN0U291cmNlSW5zdGFuY2UpIHsKICAgICAgICAgICAgdGhpcy5zb3VyY2VzLmFkZEVmZmVjdHMoZWZmZWN0U291cmNlSW5zdGFuY2UpOwogICAgICAgIH0KICAgIH0KICAgIEVmZmVjdHNSb290TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRWZmZWN0c1Jvb3RNb2R1bGUgfSk7CiAgICBFZmZlY3RzUm9vdE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEVmZmVjdHNSb290TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEVmZmVjdHNSb290TW9kdWxlKSjJtcm1aW5qZWN0KEVmZmVjdFNvdXJjZXMpLCDJtcm1aW5qZWN0KEVmZmVjdHNSdW5uZXIpLCDJtcm1aW5qZWN0KFN0b3JlKSwgybXJtWluamVjdChST09UX0VGRkVDVFMpLCDJtcm1aW5qZWN0KFN0b3JlUm9vdE1vZHVsZSwgOCksIMm1ybVpbmplY3QoU3RvcmVGZWF0dXJlTW9kdWxlLCA4KSwgybXJtWluamVjdChfUk9PVF9FRkZFQ1RTX0dVQVJELCA4KSk7IH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEVmZmVjdHNSb290TW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWZmZWN0U291cmNlcyB9LAogICAgICAgIHsgdHlwZTogRWZmZWN0c1J1bm5lciB9LAogICAgICAgIHsgdHlwZTogU3RvcmUgfSwKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtST09UX0VGRkVDVFMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogU3RvcmVSb290TW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogU3RvcmVGZWF0dXJlTW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW19ST09UX0VGRkVDVFNfR1VBUkQsXSB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RzX2ZlYXR1cmVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEVmZmVjdHNGZWF0dXJlTW9kdWxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJvb3QKICAgICAgICAgKiBAcGFyYW0gez99IGVmZmVjdFNvdXJjZUdyb3VwcwogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmVSb290TW9kdWxlCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZUZlYXR1cmVNb2R1bGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihyb290LCBlZmZlY3RTb3VyY2VHcm91cHMsIHN0b3JlUm9vdE1vZHVsZSwgc3RvcmVGZWF0dXJlTW9kdWxlKSB7CiAgICAgICAgICAgIGVmZmVjdFNvdXJjZUdyb3Vwcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBncm91cAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ3JvdXAgPT4gZ3JvdXAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWZmZWN0U291cmNlSW5zdGFuY2UKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGVmZmVjdFNvdXJjZUluc3RhbmNlID0+IHJvb3QuYWRkRWZmZWN0cyhlZmZlY3RTb3VyY2VJbnN0YW5jZSkpKSkpOwogICAgICAgIH0KICAgIH0KICAgIEVmZmVjdHNGZWF0dXJlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRWZmZWN0c0ZlYXR1cmVNb2R1bGUgfSk7CiAgICBFZmZlY3RzRmVhdHVyZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEVmZmVjdHNGZWF0dXJlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEVmZmVjdHNGZWF0dXJlTW9kdWxlKSjJtcm1aW5qZWN0KEVmZmVjdHNSb290TW9kdWxlKSwgybXJtWluamVjdChGRUFUVVJFX0VGRkVDVFMpLCDJtcm1aW5qZWN0KFN0b3JlUm9vdE1vZHVsZSwgOCksIMm1ybVpbmplY3QoU3RvcmVGZWF0dXJlTW9kdWxlLCA4KSk7IH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEVmZmVjdHNGZWF0dXJlTW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWZmZWN0c1Jvb3RNb2R1bGUgfSwKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtGRUFUVVJFX0VGRkVDVFMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogU3RvcmVSb290TW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogU3RvcmVGZWF0dXJlTW9kdWxlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogbW9kdWxlcy9lZmZlY3RzL3NyYy9lZmZlY3RzX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBFZmZlY3RzTW9kdWxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBmZWF0dXJlRWZmZWN0cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZvckZlYXR1cmUoZmVhdHVyZUVmZmVjdHMgPSBbXSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmdNb2R1bGU6IEVmZmVjdHNGZWF0dXJlTW9kdWxlLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgZmVhdHVyZUVmZmVjdHMsCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBfRkVBVFVSRV9FRkZFQ1RTLAogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IGZlYXR1cmVFZmZlY3RzLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBVU0VSX1BST1ZJREVEX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogW10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IEZFQVRVUkVfRUZGRUNUUywKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGNyZWF0ZUVmZmVjdHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGRlcHM6IFtJbmplY3RvciwgX0ZFQVRVUkVfRUZGRUNUUywgVVNFUl9QUk9WSURFRF9FRkZFQ1RTXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gcm9vdEVmZmVjdHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBmb3JSb290KHJvb3RFZmZlY3RzID0gW10pIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5nTW9kdWxlOiBFZmZlY3RzUm9vdE1vZHVsZSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogX1JPT1RfRUZGRUNUU19HVUFSRCwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogX3Byb3ZpZGVGb3JSb290R3VhcmQkMSwKICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogW1tFZmZlY3RzUnVubmVyLCBuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCldXSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRUZGRUNUU19FUlJPUl9IQU5ETEVSLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogZGVmYXVsdEVmZmVjdHNFcnJvckhhbmRsZXIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBFZmZlY3RzUnVubmVyLAogICAgICAgICAgICAgICAgICAgIEVmZmVjdFNvdXJjZXMsCiAgICAgICAgICAgICAgICAgICAgQWN0aW9ucywKICAgICAgICAgICAgICAgICAgICByb290RWZmZWN0cywKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IF9ST09UX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBbcm9vdEVmZmVjdHNdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBVU0VSX1BST1ZJREVEX0VGRkVDVFMsCiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VWYWx1ZTogW10sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IFJPT1RfRUZGRUNUUywKICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogY3JlYXRlRWZmZWN0cywKICAgICAgICAgICAgICAgICAgICAgICAgZGVwczogW0luamVjdG9yLCBfUk9PVF9FRkZFQ1RTLCBVU0VSX1BST1ZJREVEX0VGRkVDVFNdLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIEVmZmVjdHNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBFZmZlY3RzTW9kdWxlIH0pOwogICAgRWZmZWN0c01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEVmZmVjdHNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRWZmZWN0c01vZHVsZSkoKTsgfSB9KTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBlZmZlY3RHcm91cHMKICAgICAqIEBwYXJhbSB7P30gdXNlclByb3ZpZGVkRWZmZWN0R3JvdXBzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVFZmZlY3RzKGluamVjdG9yLCBlZmZlY3RHcm91cHMsIHVzZXJQcm92aWRlZEVmZmVjdEdyb3VwcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXJnZWRFZmZlY3RzID0gW107CiAgICAgICAgZm9yIChsZXQgZWZmZWN0R3JvdXAgb2YgZWZmZWN0R3JvdXBzKSB7CiAgICAgICAgICAgIG1lcmdlZEVmZmVjdHMucHVzaCguLi5lZmZlY3RHcm91cCk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IHVzZXJQcm92aWRlZEVmZmVjdEdyb3VwIG9mIHVzZXJQcm92aWRlZEVmZmVjdEdyb3VwcykgewogICAgICAgICAgICBtZXJnZWRFZmZlY3RzLnB1c2goLi4udXNlclByb3ZpZGVkRWZmZWN0R3JvdXApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gY3JlYXRlRWZmZWN0SW5zdGFuY2VzKGluamVjdG9yLCBtZXJnZWRFZmZlY3RzKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpbmplY3RvcgogICAgICogQHBhcmFtIHs/fSBlZmZlY3RzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVFZmZlY3RJbnN0YW5jZXMoaW5qZWN0b3IsIGVmZmVjdHMpIHsKICAgICAgICByZXR1cm4gZWZmZWN0cy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWZmZWN0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlZmZlY3QgPT4gaW5qZWN0b3IuZ2V0KGVmZmVjdCkpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBydW5uZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9wcm92aWRlRm9yUm9vdEd1YXJkJDEocnVubmVyKSB7CiAgICAgICAgaWYgKHJ1bm5lcikgewogICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKGBFZmZlY3RzTW9kdWxlLmZvclJvb3QoKSBjYWxsZWQgdHdpY2UuIEZlYXR1cmUgbW9kdWxlcyBzaG91bGQgdXNlIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZSgpIGluc3RlYWQuYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiAnZ3VhcmRlZCc7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFVzZXIgaGFzIGNsaWNrZWQgb24gYSBidXR0b24gaW4gdGhlIGhlYWRlciB0byBjaGFuZ2UgdGhlIHBsdWdpbi4KICAgICAqLwogICAgY29uc3QgY2hhbmdlUGx1Z2luID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGx1Z2luIENoYW5nZWQnLCBwcm9wcygpKTsKICAgIC8qKgogICAgICogUGx1Z2luIGluZm9ybWF0aW9uIGluIHRoZSBoYXNoIGlzIGNoYW5nZWQgYnkgdXNlciBhY3Rpb24uCiAgICAgKiBlLmcuLCB1c2VyIGNhbiB1c2UgYnJvd3NlciBuYXZpZ2F0aW9uIGJ1dHRvbiB0byBjaGFuZ2UgdGhlIGhhc2guCiAgICAgKi8KICAgIGNvbnN0IHBsdWdpblVybEhhc2hDaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGx1Z2luIFVybCBIYXNoIENoYW5nZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IGNvcmVMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tDb3JlXSBMb2FkZWQnKTsKICAgIGNvbnN0IG1hbnVhbFJlbG9hZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFVzZXIgVHJpZ2dlcmVkIFJlbG9hZCcpOwogICAgY29uc3QgcmVsb2FkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gQXV0byBSZWxvYWQnKTsKICAgIGNvbnN0IHBsdWdpbnNMaXN0aW5nUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGx1Z2luTGlzdGluZyBGZXRjaCBSZXF1ZXN0ZWQnKTsKICAgIGNvbnN0IHBsdWdpbnNMaXN0aW5nTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUGx1Z2luTGlzdGluZyBGZXRjaCBTdWNjZXNzZnVsJywgcHJvcHMoKSk7CiAgICBjb25zdCBwbHVnaW5zTGlzdGluZ0ZhaWxlZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFBsdWdpbkxpc3RpbmcgRmV0Y2ggRmFpbGVkJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIEFjdGlvbiBmb3Igd2hlbiBFbnZpcm9ubWVudCBkYXRhIGhhcyBiZWVuIGxvYWRlZCBmcm9tIHRoZSBXZWJBcHAgc2VydmVyLgogICAgICovCiAgICBjb25zdCBlbnZpcm9ubWVudExvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIEVudmlyb25tZW50IEZldGNoIFN1Y2Nlc3NmdWwnLCBwcm9wcygpKTsKICAgIC8qKgogICAgICogQWN0aW9uIGZvciB3aGVuIHVzZXIgd2FudHMgdG8gZW5hYmxlL2Rpc2FibGUgcmVsb2FkLgogICAgICovCiAgICBjb25zdCB0b2dnbGVSZWxvYWRFbmFibGVkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUmVsb2FkIEVuYWJsZSBUb2dnbGVkJyk7CiAgICAvKioKICAgICAqIEFjdGlvbiBmb3Igd2hlbiB1c2VyIHdhbnRzIHRvIGNoYW5nZSB0aGUgcmVsb2FkIHBlcmlvZC4KICAgICAqLwogICAgY29uc3QgY2hhbmdlUmVsb2FkUGVyaW9kID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUmVsb2FkIFBlcmlvZCBDaGFuZ2UnLCBwcm9wcygpKTsKICAgIC8qKgogICAgICogQWN0aW9uIGZvciB3aGVuIHVzZXIgd2FudHMgdG8gYW4gaXRlbSBjb3VudCBpbiBhIHBhZ2Ugb2YgYSBwYWdpbmF0ZWQgdmlldy4KICAgICAqLwogICAgY29uc3QgY2hhbmdlUGFnZVNpemUgPSBjcmVhdGVBY3Rpb24oJ1tDb3JlXSBQYWdlIFNpemUgQ2hhbmdlJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIEFjdGlvbiBmb3Igd2hlbiB1c2VyIHdhbnRzIHRvIGNoYW5nZSB0aGUgcnVucyBzZWxlY3Rpb24gaW4gdGhlIHRmLXJ1bnMtc2VsZWN0b3IuCiAgICAgKgogICAgICogQWN0aW9uIGlzIHJlc2VydmVkIGZvciB0aGUgd3JhcHBlciBmb3IgdGhlIFBvbHltZXIgYmFzZWQgdGYtcnVucy1zZWxlY3Rvci4KICAgICAqLwogICAgY29uc3QgcG9seW1lckludGVyb3BSdW5TZWxlY3Rpb25DaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbQ29yZV0gUnVuIFNlbGVjdGlvbiBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBmZXRjaFJ1blN1Y2NlZWRlZCA9IGNyZWF0ZUFjdGlvbignW0NvcmVdIFJ1biBGZXRjaCBTdWNjZXNzZnVsJywgcHJvcHMoKSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2tleWNvZGVzL2tleWNvZGVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEJBQ0tTUEFDRSA9IDg7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUQUIgPSA5OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRU5URVIgPSAxMzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEVTQ0FQRSA9IDI3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgU1BBQ0UgPSAzMjsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBBR0VfVVAgPSAzMzsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFBBR0VfRE9XTiA9IDM0OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgRU5EID0gMzU7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBIT01FID0gMzY7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBMRUZUX0FSUk9XID0gMzc7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBVUF9BUlJPVyA9IDM4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUklHSFRfQVJST1cgPSAzOTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERPV05fQVJST1cgPSA0MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERFTEVURSA9IDQ2OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgWkVSTyA9IDQ4OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTklORSA9IDU3OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQSA9IDY1OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgWiA9IDkwOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9rZXljb2Rlcy9tb2RpZmllcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIGEgbW9kaWZpZXIga2V5IGlzIHByZXNzZWQuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50IEV2ZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgKiBAcGFyYW0gey4uLj99IG1vZGlmaWVycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaGFzTW9kaWZpZXJLZXkoZXZlbnQsIC4uLm1vZGlmaWVycykgewogICAgICAgIGlmIChtb2RpZmllcnMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBtb2RpZmllcnMuc29tZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbW9kaWZpZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG1vZGlmaWVyID0+IGV2ZW50W21vZGlmaWVyXSkpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZXZlbnQuYWx0S2V5IHx8IGV2ZW50LnNoaWZ0S2V5IHx8IGV2ZW50LmN0cmxLZXkgfHwgZXZlbnQubWV0YUtleTsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKiBDb2VyY2VzIGEgZGF0YS1ib3VuZCB2YWx1ZSAodHlwaWNhbGx5IGEgc3RyaW5nKSB0byBhIGJvb2xlYW4uICovCiAgICBmdW5jdGlvbiBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUgIT0gbnVsbCAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnOwogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgZnVuY3Rpb24gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUsIGZhbGxiYWNrVmFsdWUgPSAwKSB7CiAgICAgICAgcmV0dXJuIF9pc051bWJlclZhbHVlKHZhbHVlKSA/IE51bWJlcih2YWx1ZSkgOiBmYWxsYmFja1ZhbHVlOwogICAgfQogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBwcm92aWRlZCB2YWx1ZSBpcyBjb25zaWRlcmVkIGEgbnVtYmVyLgogICAgICogQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBmdW5jdGlvbiBfaXNOdW1iZXJWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8vIHBhcnNlRmxvYXQodmFsdWUpIGhhbmRsZXMgbW9zdCBvZiB0aGUgY2FzZXMgd2UncmUgaW50ZXJlc3RlZCBpbiAoaXQgdHJlYXRzIG51bGwsIGVtcHR5IHN0cmluZywKICAgICAgICAvLyBhbmQgb3RoZXIgbm9uLW51bWJlciB2YWx1ZXMgYXMgTmFOLCB3aGVyZSBOdW1iZXIganVzdCB1c2VzIDApIGJ1dCBpdCBjb25zaWRlcnMgdGhlIHN0cmluZwogICAgICAgIC8vICcxMjNoZWxsbycgdG8gYmUgYSB2YWxpZCBudW1iZXIuIFRoZXJlZm9yZSB3ZSBhbHNvIGNoZWNrIGlmIE51bWJlcih2YWx1ZSkgaXMgTmFOLgogICAgICAgIHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmICFpc05hTihOdW1iZXIodmFsdWUpKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvZXJjZUFycmF5KHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpID8gdmFsdWUgOiBbdmFsdWVdOwogICAgfQoKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIENvZXJjZXMgYSB2YWx1ZSB0byBhIENTUyBwaXhlbCB2YWx1ZS4gKi8KICAgIGZ1bmN0aW9uIGNvZXJjZUNzc1BpeGVsVmFsdWUodmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgfQogICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gdmFsdWUgOiBgJHt2YWx1ZX1weGA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIENvZXJjZXMgYW4gRWxlbWVudFJlZiBvciBhbiBFbGVtZW50IGludG8gYW4gZWxlbWVudC4KICAgICAqIFVzZWZ1bCBmb3IgQVBJcyB0aGF0IGNhbiBhY2NlcHQgZWl0aGVyIGEgcmVmIG9yIHRoZSBuYXRpdmUgZWxlbWVudCBpdHNlbGYuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvZXJjZUVsZW1lbnQoZWxlbWVudE9yUmVmKSB7CiAgICAgICAgcmV0dXJuIGVsZW1lbnRPclJlZiBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbGVtZW50T3JSZWYubmF0aXZlRWxlbWVudCA6IGVsZW1lbnRPclJlZjsKICAgIH0KCiAgICBsZXQgaGFzVjhCcmVha0l0ZXJhdG9yOwogICAgLy8gV2UgbmVlZCBhIHRyeS9jYXRjaCBhcm91bmQgdGhlIHJlZmVyZW5jZSB0byBgSW50bGAsIGJlY2F1c2UgYWNjZXNzaW5nIGl0IGluIHNvbWUgY2FzZXMgY2FuCiAgICAvLyBjYXVzZSBJRSB0byB0aHJvdy4gVGhlc2UgY2FzZXMgYXJlIHRpZWQgdG8gcGFydGljdWxhciB2ZXJzaW9ucyBvZiBXaW5kb3dzIGFuZCBjYW4gaGFwcGVuIGlmCiAgICAvLyB0aGUgY29uc3VtZXIgaXMgcHJvdmlkaW5nIGEgcG9seWZpbGxlZCBgTWFwYC4gU2VlOgogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9DaGFrcmFDb3JlL2lzc3Vlcy8zMTg5CiAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xNTY4NwogICAgdHJ5IHsKICAgICAgICBoYXNWOEJyZWFrSXRlcmF0b3IgPSAodHlwZW9mIEludGwgIT09ICd1bmRlZmluZWQnICYmICgoLyoqIEB0eXBlIHs/fSAqLyAoSW50bCkpKS52OEJyZWFrSXRlcmF0b3IpOwogICAgfQogICAgY2F0Y2ggKF9hKSB7CiAgICAgICAgaGFzVjhCcmVha0l0ZXJhdG9yID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFNlcnZpY2UgdG8gZGV0ZWN0IHRoZSBjdXJyZW50IHBsYXRmb3JtIGJ5IGNvbXBhcmluZyB0aGUgdXNlckFnZW50IHN0cmluZ3MgYW5kCiAgICAgKiBjaGVja2luZyBicm93c2VyLXNwZWNpZmljIGdsb2JhbCBwcm9wZXJ0aWVzLgogICAgICovCiAgICBjbGFzcyBQbGF0Zm9ybSB7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAgcmVtb3ZlIG9wdGlvbmFsIGRlY29yYXRvcgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9wbGF0Zm9ybUlkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BsYXRmb3JtSWQpIHsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm1JZCA9IF9wbGF0Zm9ybUlkOwogICAgICAgICAgICAvLyBXZSB3YW50IHRvIHVzZSB0aGUgQW5ndWxhciBwbGF0Zm9ybSBjaGVjayBiZWNhdXNlIGlmIHRoZSBEb2N1bWVudCBpcyBzaGltbWVkCiAgICAgICAgICAgIC8vIHdpdGhvdXQgdGhlIG5hdmlnYXRvciwgdGhlIGZvbGxvd2luZyBjaGVja3Mgd2lsbCBmYWlsLiBUaGlzIGlzIHByZWZlcnJlZCBiZWNhdXNlCiAgICAgICAgICAgIC8vIHNvbWV0aW1lcyB0aGUgRG9jdW1lbnQgbWF5IGJlIHNoaW1tZWQgd2l0aG91dCB0aGUgdXNlcidzIGtub3dsZWRnZSBvciBpbnRlbnRpb24KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIEFuZ3VsYXIgYXBwbGljYXRpb24gaXMgYmVpbmcgcmVuZGVyZWQgaW4gdGhlIGJyb3dzZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlzQnJvd3NlciA9IHRoaXMuX3BsYXRmb3JtSWQgPwogICAgICAgICAgICAgICAgaXNQbGF0Zm9ybUJyb3dzZXIodGhpcy5fcGxhdGZvcm1JZCkgOiB0eXBlb2YgZG9jdW1lbnQgPT09ICdvYmplY3QnICYmICEhZG9jdW1lbnQ7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IGJyb3dzZXIgaXMgTWljcm9zb2Z0IEVkZ2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLkVER0UgPSB0aGlzLmlzQnJvd3NlciAmJiAvKGVkZ2UpL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBpcyBNaWNyb3NvZnQgVHJpZGVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuVFJJREVOVCA9IHRoaXMuaXNCcm93c2VyICYmIC8obXNpZXx0cmlkZW50KS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7CiAgICAgICAgICAgIC8vIEVkZ2VIVE1MIGFuZCBUcmlkZW50IG1vY2sgQmxpbmsgc3BlY2lmaWMgdGhpbmdzIGFuZCBuZWVkIHRvIGJlIGV4Y2x1ZGVkIGZyb20gdGhpcyBjaGVjay4KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgcmVuZGVyaW5nIGVuZ2luZSBpcyBCbGluay4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuQkxJTksgPSB0aGlzLmlzQnJvd3NlciAmJiAoISEoKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuY2hyb21lIHx8IGhhc1Y4QnJlYWtJdGVyYXRvcikgJiYKICAgICAgICAgICAgICAgIHR5cGVvZiBDU1MgIT09ICd1bmRlZmluZWQnICYmICF0aGlzLkVER0UgJiYgIXRoaXMuVFJJREVOVCk7CiAgICAgICAgICAgIC8vIFdlYmtpdCBpcyBwYXJ0IG9mIHRoZSB1c2VyQWdlbnQgaW4gRWRnZUhUTUwsIEJsaW5rIGFuZCBUcmlkZW50LiBUaGVyZWZvcmUgd2UgbmVlZCB0bwogICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBXZWJraXQgcnVucyBzdGFuZGFsb25lIGFuZCBpcyBub3QgdXNlZCBhcyBhbm90aGVyIGVuZ2luZSdzIGJhc2UuCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHJlbmRlcmluZyBlbmdpbmUgaXMgV2ViS2l0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5XRUJLSVQgPSB0aGlzLmlzQnJvd3NlciAmJgogICAgICAgICAgICAgICAgL0FwcGxlV2ViS2l0L2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhdGhpcy5CTElOSyAmJiAhdGhpcy5FREdFICYmICF0aGlzLlRSSURFTlQ7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjdXJyZW50IHBsYXRmb3JtIGlzIEFwcGxlIGlPUy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuSU9TID0gdGhpcy5pc0Jyb3dzZXIgJiYgL2lQYWR8aVBob25lfGlQb2QvLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYKICAgICAgICAgICAgICAgICEoJ01TU3RyZWFtJyBpbiB3aW5kb3cpOwogICAgICAgICAgICAvLyBJdCdzIGRpZmZpY3VsdCB0byBkZXRlY3QgdGhlIHBsYWluIEdlY2tvIGVuZ2luZSwgYmVjYXVzZSBtb3N0IG9mIHRoZSBicm93c2VycyBpZGVudGlmeQogICAgICAgICAgICAvLyB0aGVtIHNlbGYgYXMgR2Vja28tbGlrZSBicm93c2VycyBhbmQgbW9kaWZ5IHRoZSB1c2VyQWdlbnQncyBhY2NvcmRpbmcgdG8gdGhhdC4KICAgICAgICAgICAgLy8gU2luY2Ugd2Ugb25seSBjb3ZlciBvbmUgZXhwbGljaXQgRmlyZWZveCBjYXNlLCB3ZSBjYW4gc2ltcGx5IGNoZWNrIGZvciBGaXJlZm94CiAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgaGF2aW5nIGFuIHVuc3RhYmxlIGNoZWNrIGZvciBHZWNrby4KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGN1cnJlbnQgYnJvd3NlciBpcyBGaXJlZm94LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5GSVJFRk9YID0gdGhpcy5pc0Jyb3dzZXIgJiYgLyhmaXJlZm94fG1pbmVmaWVsZCkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgY3VycmVudCBwbGF0Zm9ybSBpcyBBbmRyb2lkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgLy8gVHJpZGVudCBvbiBtb2JpbGUgYWRkcyB0aGUgYW5kcm9pZCBwbGF0Zm9ybSB0byB0aGUgdXNlckFnZW50IHRvIHRyaWNrIGRldGVjdGlvbnMuCiAgICAgICAgICAgIHRoaXMuQU5EUk9JRCA9IHRoaXMuaXNCcm93c2VyICYmIC9hbmRyb2lkL2kudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiAhdGhpcy5UUklERU5UOwogICAgICAgICAgICAvLyBTYWZhcmkgYnJvd3NlcnMgd2lsbCBpbmNsdWRlIHRoZSBTYWZhcmkga2V5d29yZCBpbiB0aGVpciB1c2VyQWdlbnQuIFNvbWUgYnJvd3NlcnMgbWF5IGZha2UKICAgICAgICAgICAgLy8gdGhpcyBhbmQganVzdCBwbGFjZSB0aGUgU2FmYXJpIGtleXdvcmQgaW4gdGhlIHVzZXJBZ2VudC4gVG8gYmUgbW9yZSBzYWZlIGFib3V0IFNhZmFyaSBldmVyeQogICAgICAgICAgICAvLyBTYWZhcmkgYnJvd3NlciBzaG91bGQgYWxzbyB1c2UgV2Via2l0IGFzIGl0cyBsYXlvdXQgZW5naW5lLgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgY3VycmVudCBicm93c2VyIGlzIFNhZmFyaS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuU0FGQVJJID0gdGhpcy5pc0Jyb3dzZXIgJiYgL3NhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCkgJiYgdGhpcy5XRUJLSVQ7CiAgICAgICAgfQogICAgfQogICAgUGxhdGZvcm0uybVmYWMgPSBmdW5jdGlvbiBQbGF0Zm9ybV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQbGF0Zm9ybSkoybXJtWluamVjdChQTEFURk9STV9JRCwgOCkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBQbGF0Zm9ybS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE9iamVjdCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtQTEFURk9STV9JRCxdIH1dIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGxhdGZvcm0uybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBQbGF0Zm9ybV9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IFBsYXRmb3JtKMm1ybVpbmplY3QoUExBVEZPUk1fSUQsIDgpKTsgfSwgdG9rZW46IFBsYXRmb3JtLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3BsYXRmb3JtL3BsYXRmb3JtLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBQbGF0Zm9ybU1vZHVsZSB7CiAgICB9CiAgICBQbGF0Zm9ybU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFBsYXRmb3JtTW9kdWxlIH0pOwogICAgUGxhdGZvcm1Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBQbGF0Zm9ybU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQbGF0Zm9ybU1vZHVsZSkoKTsgfSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvcGxhdGZvcm0vZmVhdHVyZXMvaW5wdXQtdHlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIENhY2hlZCByZXN1bHQgU2V0IG9mIGlucHV0IHR5cGVzIHN1cHBvcnQgYnkgdGhlIGN1cnJlbnQgYnJvd3Nlci4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBsZXQgc3VwcG9ydGVkSW5wdXRUeXBlczsKICAgIC8qKgogICAgICogVHlwZXMgb2YgYDxpbnB1dD5gIHRoYXQgKm1pZ2h0KiBiZSBzdXBwb3J0ZWQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgY2FuZGlkYXRlSW5wdXRUeXBlcyA9IFsKICAgICAgICAvLyBgY29sb3JgIG11c3QgY29tZSBmaXJzdC4gQ2hyb21lIDU2IHNob3dzIGEgd2FybmluZyBpZiB3ZSBjaGFuZ2UgdGhlIHR5cGUgdG8gYGNvbG9yYCBhZnRlcgogICAgICAgIC8vIGZpcnN0IGNoYW5naW5nIGl0IHRvIHNvbWV0aGluZyBlbHNlOgogICAgICAgIC8vIFRoZSBzcGVjaWZpZWQgdmFsdWUgIiIgZG9lcyBub3QgY29uZm9ybSB0byB0aGUgcmVxdWlyZWQgZm9ybWF0LgogICAgICAgIC8vIFRoZSBmb3JtYXQgaXMgIiNycmdnYmIiIHdoZXJlIHJyLCBnZywgYmIgYXJlIHR3by1kaWdpdCBoZXhhZGVjaW1hbCBudW1iZXJzLgogICAgICAgICdjb2xvcicsCiAgICAgICAgJ2J1dHRvbicsCiAgICAgICAgJ2NoZWNrYm94JywKICAgICAgICAnZGF0ZScsCiAgICAgICAgJ2RhdGV0aW1lLWxvY2FsJywKICAgICAgICAnZW1haWwnLAogICAgICAgICdmaWxlJywKICAgICAgICAnaGlkZGVuJywKICAgICAgICAnaW1hZ2UnLAogICAgICAgICdtb250aCcsCiAgICAgICAgJ251bWJlcicsCiAgICAgICAgJ3Bhc3N3b3JkJywKICAgICAgICAncmFkaW8nLAogICAgICAgICdyYW5nZScsCiAgICAgICAgJ3Jlc2V0JywKICAgICAgICAnc2VhcmNoJywKICAgICAgICAnc3VibWl0JywKICAgICAgICAndGVsJywKICAgICAgICAndGV4dCcsCiAgICAgICAgJ3RpbWUnLAogICAgICAgICd1cmwnLAogICAgICAgICd3ZWVrJywKICAgIF07CiAgICAvKioKICAgICAqIEByZXR1cm4gez99IFRoZSBpbnB1dCB0eXBlcyBzdXBwb3J0ZWQgYnkgdGhpcyBicm93c2VyLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRTdXBwb3J0ZWRJbnB1dFR5cGVzKCkgewogICAgICAgIC8vIFJlc3VsdCBpcyBjYWNoZWQuCiAgICAgICAgaWYgKHN1cHBvcnRlZElucHV0VHlwZXMpIHsKICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZElucHV0VHlwZXM7CiAgICAgICAgfQogICAgICAgIC8vIFdlIGNhbid0IGNoZWNrIGlmIGFuIGlucHV0IHR5cGUgaXMgbm90IHN1cHBvcnRlZCB1bnRpbCB3ZSdyZSBvbiB0aGUgYnJvd3Nlciwgc28gc2F5IHRoYXQKICAgICAgICAvLyBldmVyeXRoaW5nIGlzIHN1cHBvcnRlZCB3aGVuIG5vdCBvbiB0aGUgYnJvd3Nlci4gV2UgZG9uJ3QgdXNlIGBQbGF0Zm9ybWAgaGVyZSBzaW5jZSBpdCdzCiAgICAgICAgLy8ganVzdCBhIGhlbHBlciBmdW5jdGlvbiBhbmQgY2FuJ3QgaW5qZWN0IGl0LgogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8ICFkb2N1bWVudCkgewogICAgICAgICAgICBzdXBwb3J0ZWRJbnB1dFR5cGVzID0gbmV3IFNldChjYW5kaWRhdGVJbnB1dFR5cGVzKTsKICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZElucHV0VHlwZXM7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZmVhdHVyZVRlc3RJbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2lucHV0Jyk7CiAgICAgICAgc3VwcG9ydGVkSW5wdXRUeXBlcyA9IG5ldyBTZXQoY2FuZGlkYXRlSW5wdXRUeXBlcy5maWx0ZXIoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbHVlID0+IHsKICAgICAgICAgICAgZmVhdHVyZVRlc3RJbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCB2YWx1ZSk7CiAgICAgICAgICAgIHJldHVybiBmZWF0dXJlVGVzdElucHV0LnR5cGUgPT09IHZhbHVlOwogICAgICAgIH0pKSk7CiAgICAgICAgcmV0dXJuIHN1cHBvcnRlZElucHV0VHlwZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3BsYXRmb3JtL2ZlYXR1cmVzL3Bhc3NpdmUtbGlzdGVuZXJzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBDYWNoZWQgcmVzdWx0IG9mIHdoZXRoZXIgdGhlIHVzZXIncyBicm93c2VyIHN1cHBvcnRzIHBhc3NpdmUgZXZlbnQgbGlzdGVuZXJzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBzdXBwb3J0c1Bhc3NpdmVFdmVudHM7CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSB1c2VyJ3MgYnJvd3NlciBzdXBwb3J0cyBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy4KICAgICAqIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL1dJQ0cvRXZlbnRMaXN0ZW5lck9wdGlvbnMvYmxvYi9naC1wYWdlcy9leHBsYWluZXIubWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN1cHBvcnRzUGFzc2l2ZUV2ZW50TGlzdGVuZXJzKCkgewogICAgICAgIGlmIChzdXBwb3J0c1Bhc3NpdmVFdmVudHMgPT0gbnVsbCAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Rlc3QnLCAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpLCBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdwYXNzaXZlJywgewogICAgICAgICAgICAgICAgICAgIGdldDogKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gc3VwcG9ydHNQYXNzaXZlRXZlbnRzID0gdHJ1ZSkKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmaW5hbGx5IHsKICAgICAgICAgICAgICAgIHN1cHBvcnRzUGFzc2l2ZUV2ZW50cyA9IHN1cHBvcnRzUGFzc2l2ZUV2ZW50cyB8fCBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3VwcG9ydHNQYXNzaXZlRXZlbnRzOwogICAgfQogICAgLyoqCiAgICAgKiBOb3JtYWxpemVzIGFuIGBBZGRFdmVudExpc3RlbmVyYCBvYmplY3QgdG8gc29tZXRoaW5nIHRoYXQgY2FuIGJlIHBhc3NlZAogICAgICogdG8gYGFkZEV2ZW50TGlzdGVuZXJgIG9uIGFueSBicm93c2VyLCBubyBtYXR0ZXIgd2hldGhlciBpdCBzdXBwb3J0cyB0aGUKICAgICAqIGBvcHRpb25zYCBwYXJhbWV0ZXIuCiAgICAgKiBAcGFyYW0gez99IG9wdGlvbnMgT2JqZWN0IHRvIGJlIG5vcm1hbGl6ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKG9wdGlvbnMpIHsKICAgICAgICByZXR1cm4gc3VwcG9ydHNQYXNzaXZlRXZlbnRMaXN0ZW5lcnMoKSA/IG9wdGlvbnMgOiAhIW9wdGlvbnMuY2FwdHVyZTsKICAgIH0KICAgIC8qKgogICAgICogQ2FjaGVkIHJlc3VsdCBvZiB0aGUgd2F5IHRoZSBicm93c2VyIGhhbmRsZXMgdGhlIGhvcml6b250YWwgc2Nyb2xsIGF4aXMgaW4gUlRMIG1vZGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgbGV0IHJ0bFNjcm9sbEF4aXNUeXBlOwogICAgLyoqCiAgICAgKiBDaGVjayB3aGV0aGVyIHRoZSBicm93c2VyIHN1cHBvcnRzIHNjcm9sbCBiZWhhdmlvcnMuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkgewogICAgICAgIHJldHVybiAhISh0eXBlb2YgZG9jdW1lbnQgPT0gJ29iamVjdCcgJiYgJ3Njcm9sbEJlaGF2aW9yJyBpbiAoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuc3R5bGUpOwogICAgfQogICAgLyoqCiAgICAgKiBDaGVja3MgdGhlIHR5cGUgb2YgUlRMIHNjcm9sbCBheGlzIHVzZWQgYnkgdGhpcyBicm93c2VyLiBBcyBvZiB0aW1lIG9mIHdyaXRpbmcsIENocm9tZSBpcyBOT1JNQUwsCiAgICAgKiBGaXJlZm94ICYgU2FmYXJpIGFyZSBORUdBVEVELCBhbmQgSUUgJiBFZGdlIGFyZSBJTlZFUlRFRC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJ0bFNjcm9sbEF4aXNUeXBlKCkgewogICAgICAgIC8vIFdlIGNhbid0IGNoZWNrIHVubGVzcyB3ZSdyZSBvbiB0aGUgYnJvd3Nlci4gSnVzdCBhc3N1bWUgJ25vcm1hbCcgaWYgd2UncmUgbm90LgogICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICdvYmplY3QnIHx8ICFkb2N1bWVudCkgewogICAgICAgICAgICByZXR1cm4gMCAvKiBOT1JNQUwgKi87CiAgICAgICAgfQogICAgICAgIGlmIChydGxTY3JvbGxBeGlzVHlwZSA9PSBudWxsKSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBhIDFweCB3aWRlIHNjcm9sbGluZyBjb250YWluZXIgYW5kIGEgMnB4IHdpZGUgY29udGVudCBlbGVtZW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNjcm9sbENvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclN0eWxlID0gc2Nyb2xsQ29udGFpbmVyLnN0eWxlOwogICAgICAgICAgICBzY3JvbGxDb250YWluZXIuZGlyID0gJ3J0bCc7CiAgICAgICAgICAgIGNvbnRhaW5lclN0eWxlLmhlaWdodCA9ICcxcHgnOwogICAgICAgICAgICBjb250YWluZXJTdHlsZS53aWR0aCA9ICcxcHgnOwogICAgICAgICAgICBjb250YWluZXJTdHlsZS5vdmVyZmxvdyA9ICdhdXRvJzsKICAgICAgICAgICAgY29udGFpbmVyU3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogICAgICAgICAgICBjb250YWluZXJTdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOwogICAgICAgICAgICBjb250YWluZXJTdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRTdHlsZSA9IGNvbnRlbnQuc3R5bGU7CiAgICAgICAgICAgIGNvbnRlbnRTdHlsZS53aWR0aCA9ICcycHgnOwogICAgICAgICAgICBjb250ZW50U3R5bGUuaGVpZ2h0ID0gJzFweCc7CiAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5hcHBlbmRDaGlsZChjb250ZW50KTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChzY3JvbGxDb250YWluZXIpOwogICAgICAgICAgICBydGxTY3JvbGxBeGlzVHlwZSA9IDAgLyogTk9STUFMICovOwogICAgICAgICAgICAvLyBUaGUgdmlld3BvcnQgc3RhcnRzIHNjcm9sbGVkIGFsbCB0aGUgd2F5IHRvIHRoZSByaWdodCBpbiBSVEwgbW9kZS4gSWYgd2UgYXJlIGluIGEgTk9STUFMCiAgICAgICAgICAgIC8vIGJyb3dzZXIgdGhpcyB3b3VsZCBtZWFuIHRoYXQgdGhlIHNjcm9sbExlZnQgc2hvdWxkIGJlIDEuIElmIGl0J3MgemVybyBpbnN0ZWFkIHdlIGtub3cgd2UncmUKICAgICAgICAgICAgLy8gZGVhbGluZyB3aXRoIG9uZSBvZiB0aGUgb3RoZXIgdHdvIHR5cGVzIG9mIGJyb3dzZXJzLgogICAgICAgICAgICBpZiAoc2Nyb2xsQ29udGFpbmVyLnNjcm9sbExlZnQgPT09IDApIHsKICAgICAgICAgICAgICAgIC8vIEluIGEgTkVHQVRFRCBicm93c2VyIHRoZSBzY3JvbGxMZWZ0IGlzIGFsd2F5cyBzb21ld2hlcmUgaW4gWy1tYXhTY3JvbGxBbW91bnQsIDBdLiBGb3IgYW4KICAgICAgICAgICAgICAgIC8vIElOVkVSVEVEIGJyb3dzZXIgaXQgaXMgYWx3YXlzIHNvbWV3aGVyZSBpbiBbMCwgbWF4U2Nyb2xsQW1vdW50XS4gV2UgY2FuIGRldGVybWluZSB3aGljaCBieQogICAgICAgICAgICAgICAgLy8gc2V0dGluZyB0byB0aGUgc2Nyb2xsTGVmdCB0byAxLiBUaGlzIGlzIHBhc3QgdGhlIG1heCBmb3IgYSBORUdBVEVEIGJyb3dzZXIsIHNvIGl0IHdpbGwKICAgICAgICAgICAgICAgIC8vIHJldHVybiAwIHdoZW4gd2UgcmVhZCBpdCBhZ2Fpbi4KICAgICAgICAgICAgICAgIHNjcm9sbENvbnRhaW5lci5zY3JvbGxMZWZ0ID0gMTsKICAgICAgICAgICAgICAgIHJ0bFNjcm9sbEF4aXNUeXBlID0KICAgICAgICAgICAgICAgICAgICBzY3JvbGxDb250YWluZXIuc2Nyb2xsTGVmdCA9PT0gMCA/IDEgLyogTkVHQVRFRCAqLyA6IDIgLyogSU5WRVJURUQgKi87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHNjcm9sbENvbnRhaW5lci5wYXJlbnROb2RlKSkucmVtb3ZlQ2hpbGQoc2Nyb2xsQ29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJ0bFNjcm9sbEF4aXNUeXBlOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9wbGF0Zm9ybS9mZWF0dXJlcy9zaGFkb3ctZG9tLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IHNoYWRvd0RvbUlzU3VwcG9ydGVkOwogICAgLyoqCiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgdXNlcidzIGJyb3dzZXIgc3VwcG9ydCBTaGFkb3cgRE9NLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX3N1cHBvcnRzU2hhZG93RG9tKCkgewogICAgICAgIGlmIChzaGFkb3dEb21Jc1N1cHBvcnRlZCA9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGVhZCA9IHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgPyBkb2N1bWVudC5oZWFkIDogbnVsbDsKICAgICAgICAgICAgc2hhZG93RG9tSXNTdXBwb3J0ZWQgPSAhIShoZWFkICYmICgoKC8qKiBAdHlwZSB7P30gKi8gKGhlYWQpKSkuY3JlYXRlU2hhZG93Um9vdCB8fCBoZWFkLmF0dGFjaFNoYWRvdykpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc2hhZG93RG9tSXNTdXBwb3J0ZWQ7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgdGhlIHNoYWRvdyByb290IG9mIGFuIGVsZW1lbnQsIGlmIHN1cHBvcnRlZCBhbmQgdGhlIGVsZW1lbnQgaXMgaW5zaWRlIHRoZSBTaGFkb3cgRE9NLgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfZ2V0U2hhZG93Um9vdChlbGVtZW50KSB7CiAgICAgICAgaWYgKF9zdXBwb3J0c1NoYWRvd0RvbSgpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBlbGVtZW50LmdldFJvb3ROb2RlID8gZWxlbWVudC5nZXRSb290Tm9kZSgpIDogbnVsbDsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlIGNhdWdodCBieSBgX3N1cHBvcnRzU2hhZG93RG9tYCwgYnV0IHNvbWUKICAgICAgICAgICAgLy8gdGVhbXMgaGF2ZSBiZWVuIGFibGUgdG8gaGl0IHRoaXMgY29kZSBwYXRoIG9uIHVuc3VwcG9ydGVkIGJyb3dzZXJzLgogICAgICAgICAgICBpZiAodHlwZW9mIFNoYWRvd1Jvb3QgIT09ICd1bmRlZmluZWQnICYmIFNoYWRvd1Jvb3QgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgY2xhc3MgTXV0YXRpb25PYnNlcnZlckZhY3RvcnkgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2sKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZShjYWxsYmFjaykgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIE11dGF0aW9uT2JzZXJ2ZXIgPT09ICd1bmRlZmluZWQnID8gbnVsbCA6IG5ldyBNdXRhdGlvbk9ic2VydmVyKGNhbGxiYWNrKTsKICAgICAgICB9CiAgICB9CiAgICBNdXRhdGlvbk9ic2VydmVyRmFjdG9yeS7JtWZhYyA9IGZ1bmN0aW9uIE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gTXV0YXRpb25PYnNlcnZlckZhY3RvcnlfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBNdXRhdGlvbk9ic2VydmVyRmFjdG9yeSgpOyB9LCB0b2tlbjogTXV0YXRpb25PYnNlcnZlckZhY3RvcnksIHByb3ZpZGVkSW46ICJyb290IiB9KTsKICAgIC8qKgogICAgICogQW4gaW5qZWN0YWJsZSBzZXJ2aWNlIHRoYXQgYWxsb3dzIHdhdGNoaW5nIGVsZW1lbnRzIGZvciBjaGFuZ2VzIHRvIHRoZWlyIGNvbnRlbnQuCiAgICAgKi8KICAgIGNsYXNzIENvbnRlbnRPYnNlcnZlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfbXV0YXRpb25PYnNlcnZlckZhY3RvcnkKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfbXV0YXRpb25PYnNlcnZlckZhY3RvcnkpIHsKICAgICAgICAgICAgdGhpcy5fbXV0YXRpb25PYnNlcnZlckZhY3RvcnkgPSBfbXV0YXRpb25PYnNlcnZlckZhY3Rvcnk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZXhpc3RpbmcgTXV0YXRpb25PYnNlcnZlcnMgc28gdGhleSBjYW4gYmUgcmV1c2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cyA9IG5ldyBNYXAoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKF8sIGVsZW1lbnQpID0+IHRoaXMuX2NsZWFudXBPYnNlcnZlcihlbGVtZW50KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPclJlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb2JzZXJ2ZShlbGVtZW50T3JSZWYpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50T3JSZWYpOwogICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX29ic2VydmVFbGVtZW50KGVsZW1lbnQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3Vic2NyaXB0aW9uID0gc3RyZWFtLnN1YnNjcmliZShvYnNlcnZlcik7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Vub2JzZXJ2ZUVsZW1lbnQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBPYnNlcnZlcyB0aGUgZ2l2ZW4gZWxlbWVudCBieSB1c2luZyB0aGUgZXhpc3RpbmcgTXV0YXRpb25PYnNlcnZlciBpZiBhdmFpbGFibGUsIG9yIGNyZWF0aW5nIGEKICAgICAgICAgKiBuZXcgb25lIGlmIG5vdC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29ic2VydmVFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmhhcyhlbGVtZW50KSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmVyID0gdGhpcy5fbXV0YXRpb25PYnNlcnZlckZhY3RvcnkuY3JlYXRlKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbXV0YXRpb25zCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBtdXRhdGlvbnMgPT4gc3RyZWFtLm5leHQobXV0YXRpb25zKSkpOwogICAgICAgICAgICAgICAgaWYgKG9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIub2JzZXJ2ZShlbGVtZW50LCB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJhY3RlckRhdGE6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkTGlzdDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3VidHJlZTogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5zZXQoZWxlbWVudCwgeyBvYnNlcnZlciwgc3RyZWFtLCBjb3VudDogMSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmdldChlbGVtZW50KSkpLmNvdW50Kys7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmdldChlbGVtZW50KSkpLnN0cmVhbTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVW4tb2JzZXJ2ZXMgdGhlIGdpdmVuIGVsZW1lbnQgYW5kIGNsZWFucyB1cCB0aGUgdW5kZXJseWluZyBNdXRhdGlvbk9ic2VydmVyIGlmIG5vYm9keSBlbHNlIGlzCiAgICAgICAgICogb2JzZXJ2aW5nIHRoaXMgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Vub2JzZXJ2ZUVsZW1lbnQoZWxlbWVudCkgewogICAgICAgICAgICBpZiAodGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5oYXMoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmdldChlbGVtZW50KSkpLmNvdW50LS07CiAgICAgICAgICAgICAgICBpZiAoISgvKiogQHR5cGUgez99ICovICh0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmdldChlbGVtZW50KSkpLmNvdW50KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xlYW51cE9ic2VydmVyKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFuIHVwIHRoZSB1bmRlcmx5aW5nIE11dGF0aW9uT2JzZXJ2ZXIgZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NsZWFudXBPYnNlcnZlcihlbGVtZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vYnNlcnZlZEVsZW1lbnRzLmhhcyhlbGVtZW50KSkgewogICAgICAgICAgICAgICAgY29uc3QgeyBvYnNlcnZlciwgc3RyZWFtIH0gPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5nZXQoZWxlbWVudCkpKTsKICAgICAgICAgICAgICAgIGlmIChvYnNlcnZlcikgewogICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmRpc2Nvbm5lY3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0cmVhbS5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZWRFbGVtZW50cy5kZWxldGUoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBDb250ZW50T2JzZXJ2ZXIuybVmYWMgPSBmdW5jdGlvbiBDb250ZW50T2JzZXJ2ZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29udGVudE9ic2VydmVyKSjJtcm1aW5qZWN0KE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5KSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENvbnRlbnRPYnNlcnZlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE11dGF0aW9uT2JzZXJ2ZXJGYWN0b3J5IH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ29udGVudE9ic2VydmVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gQ29udGVudE9ic2VydmVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgQ29udGVudE9ic2VydmVyKMm1ybVpbmplY3QoTXV0YXRpb25PYnNlcnZlckZhY3RvcnkpKTsgfSwgdG9rZW46IENvbnRlbnRPYnNlcnZlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwogICAgLyoqCiAgICAgKiBEaXJlY3RpdmUgdGhhdCB0cmlnZ2VycyBhIGNhbGxiYWNrIHdoZW5ldmVyIHRoZSBjb250ZW50IG9mCiAgICAgKiBpdHMgYXNzb2NpYXRlZCBlbGVtZW50IGhhcyBjaGFuZ2VkLgogICAgICovCiAgICBjbGFzcyBDZGtPYnNlcnZlQ29udGVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfY29udGVudE9ic2VydmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9jb250ZW50T2JzZXJ2ZXIsIF9lbGVtZW50UmVmLCBfbmdab25lKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRPYnNlcnZlciA9IF9jb250ZW50T2JzZXJ2ZXI7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgZm9yIGVhY2ggY2hhbmdlIGluIHRoZSBlbGVtZW50J3MgY29udGVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9ic2VydmluZyBjb250ZW50IGlzIGRpc2FibGVkLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZAogICAgICAgICAqIHRvIGRpc2Nvbm5lY3QgdGhlIHVuZGVybHlpbmcgTXV0YXRpb25PYnNlcnZlciB1bnRpbCBpdCBpcyBuZWVkZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID8gdGhpcy5fdW5zdWJzY3JpYmUoKSA6IHRoaXMuX3N1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZWJvdW5jZSBpbnRlcnZhbCBmb3IgZW1pdHRpbmcgdGhlIGNoYW5nZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGVib3VuY2UoKSB7IHJldHVybiB0aGlzLl9kZWJvdW5jZTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkZWJvdW5jZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9kZWJvdW5jZSA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlckNvbnRlbnRJbml0KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24gJiYgIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3Vuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3Vic2NyaWJlKCkgewogICAgICAgICAgICB0aGlzLl91bnN1YnNjcmliZSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0cmVhbSA9IHRoaXMuX2NvbnRlbnRPYnNlcnZlci5vYnNlcnZlKHRoaXMuX2VsZW1lbnRSZWYpOwogICAgICAgICAgICAvLyBUT0RPKG1tYWxlcmJhKTogV2Ugc2hvdWxkbid0IGJlIGVtaXR0aW5nIG9uIHRoaXMgQE91dHB1dCgpIG91dHNpZGUgdGhlIHpvbmUuCiAgICAgICAgICAgIC8vIENvbnNpZGVyIGJyaW5pbmcgaXQgYmFjayBpbnNpZGUgdGhlIHpvbmUgbmV4dCB0aW1lIHdlJ3JlIG1ha2luZyBicmVha2luZyBjaGFuZ2VzLgogICAgICAgICAgICAvLyBCcmluZ2luZyBpdCBiYWNrIGluc2lkZSBjYW4gY2F1c2UgdGhpbmdzIGxpa2UgaW5maW5pdGUgY2hhbmdlIGRldGVjdGlvbiBsb29wcyBhbmQgY2hhbmdlZAogICAgICAgICAgICAvLyBhZnRlciBjaGVja2VkIGVycm9ycyBpZiBwZW9wbGUncyBjb2RlIGlzbid0IGhhbmRsaW5nIGl0IHByb3Blcmx5LgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFN1YnNjcmlwdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgKHRoaXMuZGVib3VuY2UgPyBzdHJlYW0ucGlwZShkZWJvdW5jZVRpbWUodGhpcy5kZWJvdW5jZSkpIDogc3RyZWFtKS5zdWJzY3JpYmUodGhpcy5ldmVudCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91bnN1YnNjcmliZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIENka09ic2VydmVDb250ZW50Lsm1ZmFjID0gZnVuY3Rpb24gQ2RrT2JzZXJ2ZUNvbnRlbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrT2JzZXJ2ZUNvbnRlbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ29udGVudE9ic2VydmVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpKTsgfTsKICAgIENka09ic2VydmVDb250ZW50Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka09ic2VydmVDb250ZW50LCBzZWxlY3RvcnM6IFtbIiIsICJjZGtPYnNlcnZlQ29udGVudCIsICIiXV0sIGlucHV0czogeyBkaXNhYmxlZDogWyJjZGtPYnNlcnZlQ29udGVudERpc2FibGVkIiwgImRpc2FibGVkIl0sIGRlYm91bmNlOiAiZGVib3VuY2UiIH0sIG91dHB1dHM6IHsgZXZlbnQ6ICJjZGtPYnNlcnZlQ29udGVudCIgfSwgZXhwb3J0QXM6IFsiY2RrT2JzZXJ2ZUNvbnRlbnQiXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrT2JzZXJ2ZUNvbnRlbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb250ZW50T2JzZXJ2ZXIgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9CiAgICBdOwogICAgQ2RrT2JzZXJ2ZUNvbnRlbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZXZlbnQ6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydjZGtPYnNlcnZlQ29udGVudCcsXSB9XSwKICAgICAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCcsXSB9XSwKICAgICAgICBkZWJvdW5jZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICBjbGFzcyBPYnNlcnZlcnNNb2R1bGUgewogICAgfQogICAgT2JzZXJ2ZXJzTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogT2JzZXJ2ZXJzTW9kdWxlIH0pOwogICAgT2JzZXJ2ZXJzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gT2JzZXJ2ZXJzTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE9ic2VydmVyc01vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbTXV0YXRpb25PYnNlcnZlckZhY3RvcnldIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoT2JzZXJ2ZXJzTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0Nka09ic2VydmVDb250ZW50XSwgZXhwb3J0czogW0Nka09ic2VydmVDb250ZW50XSB9KTsgfSkoKTsKCiAgICBjb25zdCBJRF9ERUxJTUlURVIgPSAnICc7CiAgICAvKioKICAgICAqIEFkZHMgdGhlIGdpdmVuIElEIHRvIHRoZSBzcGVjaWZpZWQgQVJJQSBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudC4KICAgICAqIFVzZWQgZm9yIGF0dHJpYnV0ZXMgc3VjaCBhcyBhcmlhLWxhYmVsbGVkYnksIGFyaWEtb3ducywgZXRjLgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBhdHRyCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRBcmlhUmVmZXJlbmNlZElkKGVsLCBhdHRyLCBpZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpZHMgPSBnZXRBcmlhUmVmZXJlbmNlSWRzKGVsLCBhdHRyKTsKICAgICAgICBpZiAoaWRzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXhpc3RpbmdJZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZXhpc3RpbmdJZCA9PiBleGlzdGluZ0lkLnRyaW0oKSA9PSBpZC50cmltKCkpKSkgewogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQogICAgICAgIGlkcy5wdXNoKGlkLnRyaW0oKSk7CiAgICAgICAgZWwuc2V0QXR0cmlidXRlKGF0dHIsIGlkcy5qb2luKElEX0RFTElNSVRFUikpOwogICAgfQogICAgLyoqCiAgICAgKiBSZW1vdmVzIHRoZSBnaXZlbiBJRCBmcm9tIHRoZSBzcGVjaWZpZWQgQVJJQSBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudC4KICAgICAqIFVzZWQgZm9yIGF0dHJpYnV0ZXMgc3VjaCBhcyBhcmlhLWxhYmVsbGVkYnksIGFyaWEtb3ducywgZXRjLgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBhdHRyCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZW1vdmVBcmlhUmVmZXJlbmNlZElkKGVsLCBhdHRyLCBpZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpZHMgPSBnZXRBcmlhUmVmZXJlbmNlSWRzKGVsLCBhdHRyKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmlsdGVyZWRJZHMgPSBpZHMuZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmFsID0+IHZhbCAhPSBpZC50cmltKCkpKTsKICAgICAgICBpZiAoZmlsdGVyZWRJZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIGVsLnNldEF0dHJpYnV0ZShhdHRyLCBmaWx0ZXJlZElkcy5qb2luKElEX0RFTElNSVRFUikpOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgZWwucmVtb3ZlQXR0cmlidXRlKGF0dHIpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgbGlzdCBvZiBJRHMgcmVmZXJlbmNlZCBieSB0aGUgZ2l2ZW4gQVJJQSBhdHRyaWJ1dGUgb24gYW4gZWxlbWVudC4KICAgICAqIFVzZWQgZm9yIGF0dHJpYnV0ZXMgc3VjaCBhcyBhcmlhLWxhYmVsbGVkYnksIGFyaWEtb3ducywgZXRjLgogICAgICogQHBhcmFtIHs/fSBlbAogICAgICogQHBhcmFtIHs/fSBhdHRyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRBcmlhUmVmZXJlbmNlSWRzKGVsLCBhdHRyKSB7CiAgICAgICAgLy8gR2V0IHN0cmluZyBhcnJheSBvZiBhbGwgaW5kaXZpZHVhbCBpZHMgKHdoaXRlc3BhY2UgZGVsaW1pdGVkKSBpbiB0aGUgYXR0cmlidXRlIHZhbHVlCiAgICAgICAgcmV0dXJuIChlbC5nZXRBdHRyaWJ1dGUoYXR0cikgfHwgJycpLm1hdGNoKC9cUysvZykgfHwgW107CiAgICB9CiAgICAvKioKICAgICAqIElEIHVzZWQgZm9yIHRoZSBib2R5IGNvbnRhaW5lciB3aGVyZSBhbGwgbWVzc2FnZXMgYXJlIGFwcGVuZGVkLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1FU1NBR0VTX0NPTlRBSU5FUl9JRCA9ICdjZGstZGVzY3JpYmVkYnktbWVzc2FnZS1jb250YWluZXInOwogICAgLyoqCiAgICAgKiBJRCBwcmVmaXggdXNlZCBmb3IgZWFjaCBjcmVhdGVkIG1lc3NhZ2UgZWxlbWVudC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBDREtfREVTQ1JJQkVEQllfSURfUFJFRklYID0gJ2Nkay1kZXNjcmliZWRieS1tZXNzYWdlJzsKICAgIC8qKgogICAgICogQXR0cmlidXRlIGdpdmVuIHRvIGVhY2ggaG9zdCBlbGVtZW50IHRoYXQgaXMgZGVzY3JpYmVkIGJ5IGEgbWVzc2FnZSBlbGVtZW50LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENES19ERVNDUklCRURCWV9IT1NUX0FUVFJJQlVURSA9ICdjZGstZGVzY3JpYmVkYnktaG9zdCc7CiAgICAvKioKICAgICAqIEdsb2JhbCBpbmNyZW1lbnRhbCBpZGVudGlmaWVyIGZvciBlYWNoIHJlZ2lzdGVyZWQgbWVzc2FnZSBlbGVtZW50LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBuZXh0SWQgPSAwOwogICAgLyoqCiAgICAgKiBHbG9iYWwgbWFwIG9mIGFsbCByZWdpc3RlcmVkIG1lc3NhZ2UgZWxlbWVudHMgdGhhdCBoYXZlIGJlZW4gcGxhY2VkIGludG8gdGhlIGRvY3VtZW50LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IG1lc3NhZ2VSZWdpc3RyeSA9IG5ldyBNYXAoKTsKICAgIC8qKgogICAgICogQ29udGFpbmVyIGZvciBhbGwgcmVnaXN0ZXJlZCBtZXNzYWdlcy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBsZXQgbWVzc2FnZXNDb250YWluZXIgPSBudWxsOwogICAgLyoqCiAgICAgKiBVdGlsaXR5IHRoYXQgY3JlYXRlcyB2aXN1YWxseSBoaWRkZW4gZWxlbWVudHMgd2l0aCBhIG1lc3NhZ2UgY29udGVudC4gVXNlZnVsIGZvciBlbGVtZW50cyB0aGF0CiAgICAgKiB3YW50IHRvIHVzZSBhcmlhLWRlc2NyaWJlZGJ5IHRvIGZ1cnRoZXIgZGVzY3JpYmUgdGhlbXNlbHZlcyB3aXRob3V0IGFkZGluZyBhZGRpdGlvbmFsIHZpc3VhbAogICAgICogY29udGVudC4KICAgICAqLwogICAgY2xhc3MgQXJpYURlc2NyaWJlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZG9jdW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgdG8gdGhlIGhvc3QgZWxlbWVudCBhbiBhcmlhLWRlc2NyaWJlZGJ5IHJlZmVyZW5jZSB0byBhIGhpZGRlbiBlbGVtZW50IHRoYXQgY29udGFpbnMKICAgICAgICAgKiB0aGUgbWVzc2FnZS4gSWYgdGhlIHNhbWUgbWVzc2FnZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gaXQgd2lsbCByZXVzZSB0aGUgY3JlYXRlZAogICAgICAgICAqIG1lc3NhZ2UgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0gez99IGhvc3RFbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXNjcmliZShob3N0RWxlbWVudCwgbWVzc2FnZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2NhbkJlRGVzY3JpYmVkKGhvc3RFbGVtZW50LCBtZXNzYWdlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGFuIElELgogICAgICAgICAgICAgICAgdGhpcy5fc2V0TWVzc2FnZUlkKG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgbWVzc2FnZVJlZ2lzdHJ5LnNldChtZXNzYWdlLCB7IG1lc3NhZ2VFbGVtZW50OiBtZXNzYWdlLCByZWZlcmVuY2VDb3VudDogMCB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghbWVzc2FnZVJlZ2lzdHJ5LmhhcyhtZXNzYWdlKSkgewogICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlTWVzc2FnZUVsZW1lbnQobWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0VsZW1lbnREZXNjcmliZWRCeU1lc3NhZ2UoaG9zdEVsZW1lbnQsIG1lc3NhZ2UpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRNZXNzYWdlUmVmZXJlbmNlKGhvc3RFbGVtZW50LCBtZXNzYWdlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIHRoZSBob3N0IGVsZW1lbnQncyBhcmlhLWRlc2NyaWJlZGJ5IHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZSBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdEVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZURlc2NyaXB0aW9uKGhvc3RFbGVtZW50LCBtZXNzYWdlKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faXNFbGVtZW50Tm9kZShob3N0RWxlbWVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5faXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKGhvc3RFbGVtZW50LCBtZXNzYWdlKSkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlTWVzc2FnZVJlZmVyZW5jZShob3N0RWxlbWVudCwgbWVzc2FnZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NhZ2UgaXMgYSBzdHJpbmcsIGl0IG1lYW5zIHRoYXQgaXQncyBvbmUgdGhhdCB3ZSBjcmVhdGVkIGZvciB0aGUKICAgICAgICAgICAgLy8gY29uc3VtZXIgc28gd2UgY2FuIHJlbW92ZSBpdCBzYWZlbHksIG90aGVyd2lzZSB3ZSBzaG91bGQgbGVhdmUgaXQgaW4gcGxhY2UuCiAgICAgICAgICAgIGlmICh0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2lzdGVyZWRNZXNzYWdlID0gbWVzc2FnZVJlZ2lzdHJ5LmdldChtZXNzYWdlKTsKICAgICAgICAgICAgICAgIGlmIChyZWdpc3RlcmVkTWVzc2FnZSAmJiByZWdpc3RlcmVkTWVzc2FnZS5yZWZlcmVuY2VDb3VudCA9PT0gMCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbGV0ZU1lc3NhZ2VFbGVtZW50KG1lc3NhZ2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtZXNzYWdlc0NvbnRhaW5lciAmJiBtZXNzYWdlc0NvbnRhaW5lci5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fZGVsZXRlTWVzc2FnZXNDb250YWluZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVbnJlZ2lzdGVycyBhbGwgY3JlYXRlZCBtZXNzYWdlIGVsZW1lbnRzIGFuZCByZW1vdmVzIHRoZSBtZXNzYWdlIGNvbnRhaW5lci4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlc2NyaWJlZEVsZW1lbnRzID0gdGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgWyR7Q0RLX0RFU0NSSUJFREJZX0hPU1RfQVRUUklCVVRFfV1gKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkZXNjcmliZWRFbGVtZW50cy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlQ2RrRGVzY3JpYmVkQnlSZWZlcmVuY2VJZHMoZGVzY3JpYmVkRWxlbWVudHNbaV0pOwogICAgICAgICAgICAgICAgZGVzY3JpYmVkRWxlbWVudHNbaV0ucmVtb3ZlQXR0cmlidXRlKENES19ERVNDUklCRURCWV9IT1NUX0FUVFJJQlVURSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1lc3NhZ2VzQ29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZWxldGVNZXNzYWdlc0NvbnRhaW5lcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lc3NhZ2VSZWdpc3RyeS5jbGVhcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgbmV3IGVsZW1lbnQgaW4gdGhlIHZpc3VhbGx5IGhpZGRlbiBtZXNzYWdlIGNvbnRhaW5lciBlbGVtZW50IHdpdGggdGhlIG1lc3NhZ2UKICAgICAgICAgKiBhcyBpdHMgY29udGVudCBhbmQgYWRkcyBpdCB0byB0aGUgbWVzc2FnZSByZWdpc3RyeS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZU1lc3NhZ2VFbGVtZW50KG1lc3NhZ2UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZXNzYWdlRWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICB0aGlzLl9zZXRNZXNzYWdlSWQobWVzc2FnZUVsZW1lbnQpOwogICAgICAgICAgICBtZXNzYWdlRWxlbWVudC50ZXh0Q29udGVudCA9IG1lc3NhZ2U7CiAgICAgICAgICAgIHRoaXMuX2NyZWF0ZU1lc3NhZ2VzQ29udGFpbmVyKCk7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChtZXNzYWdlc0NvbnRhaW5lcikpLmFwcGVuZENoaWxkKG1lc3NhZ2VFbGVtZW50KTsKICAgICAgICAgICAgbWVzc2FnZVJlZ2lzdHJ5LnNldChtZXNzYWdlLCB7IG1lc3NhZ2VFbGVtZW50LCByZWZlcmVuY2VDb3VudDogMCB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXNzaWducyBhIHVuaXF1ZSBJRCB0byBhbiBlbGVtZW50LCBpZiBpdCBkb2Vzbid0IGhhdmUgb25lIGFscmVhZHkuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRNZXNzYWdlSWQoZWxlbWVudCkgewogICAgICAgICAgICBpZiAoIWVsZW1lbnQuaWQpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnQuaWQgPSBgJHtDREtfREVTQ1JJQkVEQllfSURfUFJFRklYfS0ke25leHRJZCsrfWA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVsZXRlcyB0aGUgbWVzc2FnZSBlbGVtZW50IGZyb20gdGhlIGdsb2JhbCBtZXNzYWdlcyBjb250YWluZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9kZWxldGVNZXNzYWdlRWxlbWVudChtZXNzYWdlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE1lc3NhZ2UgPSBtZXNzYWdlUmVnaXN0cnkuZ2V0KG1lc3NhZ2UpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VFbGVtZW50ID0gcmVnaXN0ZXJlZE1lc3NhZ2UgJiYgcmVnaXN0ZXJlZE1lc3NhZ2UubWVzc2FnZUVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChtZXNzYWdlc0NvbnRhaW5lciAmJiBtZXNzYWdlRWxlbWVudCkgewogICAgICAgICAgICAgICAgbWVzc2FnZXNDb250YWluZXIucmVtb3ZlQ2hpbGQobWVzc2FnZUVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG1lc3NhZ2VSZWdpc3RyeS5kZWxldGUobWVzc2FnZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgdGhlIGdsb2JhbCBjb250YWluZXIgZm9yIGFsbCBhcmlhLWRlc2NyaWJlZGJ5IG1lc3NhZ2VzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlTWVzc2FnZXNDb250YWluZXIoKSB7CiAgICAgICAgICAgIGlmICghbWVzc2FnZXNDb250YWluZXIpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZUV4aXN0aW5nQ29udGFpbmVyID0gdGhpcy5fZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoTUVTU0FHRVNfQ09OVEFJTkVSX0lEKTsKICAgICAgICAgICAgICAgIC8vIFdoZW4gZ29pbmcgZnJvbSB0aGUgc2VydmVyIHRvIHRoZSBjbGllbnQsIHdlIG1heSBlbmQgdXAgaW4gYSBzaXR1YXRpb24gd2hlcmUgdGhlcmUncwogICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBhIGNvbnRhaW5lciBvbiB0aGUgcGFnZSwgYnV0IHdlIGRvbid0IGhhdmUgYSByZWZlcmVuY2UgdG8gaXQuIENsZWFyIHRoZQogICAgICAgICAgICAgICAgLy8gb2xkIGNvbnRhaW5lciBzbyB3ZSBkb24ndCBnZXQgZHVwbGljYXRlcy4gRG9pbmcgdGhpcywgaW5zdGVhZCBvZiBlbXB0eWluZyB0aGUgcHJldmlvdXMKICAgICAgICAgICAgICAgIC8vIGNvbnRhaW5lciwgc2hvdWxkIGJlIHNsaWdodGx5IGZhc3Rlci4KICAgICAgICAgICAgICAgIGlmIChwcmVFeGlzdGluZ0NvbnRhaW5lcikgewogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChwcmVFeGlzdGluZ0NvbnRhaW5lci5wYXJlbnROb2RlKSkucmVtb3ZlQ2hpbGQocHJlRXhpc3RpbmdDb250YWluZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWVzc2FnZXNDb250YWluZXIgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgICAgIG1lc3NhZ2VzQ29udGFpbmVyLmlkID0gTUVTU0FHRVNfQ09OVEFJTkVSX0lEOwogICAgICAgICAgICAgICAgbWVzc2FnZXNDb250YWluZXIuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgICAgICBtZXNzYWdlc0NvbnRhaW5lci5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnOwogICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtZXNzYWdlc0NvbnRhaW5lcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVsZXRlcyB0aGUgZ2xvYmFsIG1lc3NhZ2VzIGNvbnRhaW5lci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2RlbGV0ZU1lc3NhZ2VzQ29udGFpbmVyKCkgewogICAgICAgICAgICBpZiAobWVzc2FnZXNDb250YWluZXIgJiYgbWVzc2FnZXNDb250YWluZXIucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgbWVzc2FnZXNDb250YWluZXIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChtZXNzYWdlc0NvbnRhaW5lcik7CiAgICAgICAgICAgICAgICBtZXNzYWdlc0NvbnRhaW5lciA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhbGwgY2RrLWRlc2NyaWJlZGJ5IG1lc3NhZ2VzIHRoYXQgYXJlIGhvc3RlZCB0aHJvdWdoIHRoZSBlbGVtZW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlQ2RrRGVzY3JpYmVkQnlSZWZlcmVuY2VJZHMoZWxlbWVudCkgewogICAgICAgICAgICAvLyBSZW1vdmUgYWxsIGFyaWEtZGVzY3JpYmVkYnkgcmVmZXJlbmNlIElEcyB0aGF0IGFyZSBwcmVmaXhlZCBieSBDREtfREVTQ1JJQkVEQllfSURfUFJFRklYCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxSZWZlcmVuY2VJZHMgPSBnZXRBcmlhUmVmZXJlbmNlSWRzKGVsZW1lbnQsICdhcmlhLWRlc2NyaWJlZGJ5JykKICAgICAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpZCA9PiBpZC5pbmRleE9mKENES19ERVNDUklCRURCWV9JRF9QUkVGSVgpICE9IDApKTsKICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtZGVzY3JpYmVkYnknLCBvcmlnaW5hbFJlZmVyZW5jZUlkcy5qb2luKCcgJykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgbWVzc2FnZSByZWZlcmVuY2UgdG8gdGhlIGVsZW1lbnQgdXNpbmcgYXJpYS1kZXNjcmliZWRieSBhbmQgaW5jcmVtZW50cyB0aGUgcmVnaXN0ZXJlZAogICAgICAgICAqIG1lc3NhZ2UncyByZWZlcmVuY2UgY291bnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG1lc3NhZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hZGRNZXNzYWdlUmVmZXJlbmNlKGVsZW1lbnQsIG1lc3NhZ2UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWdpc3RlcmVkTWVzc2FnZSA9ICgvKiogQHR5cGUgez99ICovIChtZXNzYWdlUmVnaXN0cnkuZ2V0KG1lc3NhZ2UpKSk7CiAgICAgICAgICAgIC8vIEFkZCB0aGUgYXJpYS1kZXNjcmliZWRieSByZWZlcmVuY2UgYW5kIHNldCB0aGUKICAgICAgICAgICAgLy8gZGVzY3JpYmVkYnlfaG9zdCBhdHRyaWJ1dGUgdG8gbWFyayB0aGUgZWxlbWVudC4KICAgICAgICAgICAgYWRkQXJpYVJlZmVyZW5jZWRJZChlbGVtZW50LCAnYXJpYS1kZXNjcmliZWRieScsIHJlZ2lzdGVyZWRNZXNzYWdlLm1lc3NhZ2VFbGVtZW50LmlkKTsKICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoQ0RLX0RFU0NSSUJFREJZX0hPU1RfQVRUUklCVVRFLCAnJyk7CiAgICAgICAgICAgIHJlZ2lzdGVyZWRNZXNzYWdlLnJlZmVyZW5jZUNvdW50Kys7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBtZXNzYWdlIHJlZmVyZW5jZSBmcm9tIHRoZSBlbGVtZW50IHVzaW5nIGFyaWEtZGVzY3JpYmVkYnkKICAgICAgICAgKiBhbmQgZGVjcmVtZW50cyB0aGUgcmVnaXN0ZXJlZCBtZXNzYWdlJ3MgcmVmZXJlbmNlIGNvdW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlTWVzc2FnZVJlZmVyZW5jZShlbGVtZW50LCBtZXNzYWdlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE1lc3NhZ2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAobWVzc2FnZVJlZ2lzdHJ5LmdldChtZXNzYWdlKSkpOwogICAgICAgICAgICByZWdpc3RlcmVkTWVzc2FnZS5yZWZlcmVuY2VDb3VudC0tOwogICAgICAgICAgICByZW1vdmVBcmlhUmVmZXJlbmNlZElkKGVsZW1lbnQsICdhcmlhLWRlc2NyaWJlZGJ5JywgcmVnaXN0ZXJlZE1lc3NhZ2UubWVzc2FnZUVsZW1lbnQuaWQpOwogICAgICAgICAgICBlbGVtZW50LnJlbW92ZUF0dHJpYnV0ZShDREtfREVTQ1JJQkVEQllfSE9TVF9BVFRSSUJVVEUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgaGFzIGJlZW4gZGVzY3JpYmVkIGJ5IHRoZSBwcm92aWRlZCBtZXNzYWdlIElELgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNFbGVtZW50RGVzY3JpYmVkQnlNZXNzYWdlKGVsZW1lbnQsIG1lc3NhZ2UpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWZlcmVuY2VJZHMgPSBnZXRBcmlhUmVmZXJlbmNlSWRzKGVsZW1lbnQsICdhcmlhLWRlc2NyaWJlZGJ5Jyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVnaXN0ZXJlZE1lc3NhZ2UgPSBtZXNzYWdlUmVnaXN0cnkuZ2V0KG1lc3NhZ2UpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2VJZCA9IHJlZ2lzdGVyZWRNZXNzYWdlICYmIHJlZ2lzdGVyZWRNZXNzYWdlLm1lc3NhZ2VFbGVtZW50LmlkOwogICAgICAgICAgICByZXR1cm4gISFtZXNzYWdlSWQgJiYgcmVmZXJlbmNlSWRzLmluZGV4T2YobWVzc2FnZUlkKSAhPSAtMTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgbWVzc2FnZSBjYW4gYmUgZGVzY3JpYmVkIG9uIGEgcGFydGljdWxhciBlbGVtZW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2FuQmVEZXNjcmliZWQoZWxlbWVudCwgbWVzc2FnZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2lzRWxlbWVudE5vZGUoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobWVzc2FnZSAmJiB0eXBlb2YgbWVzc2FnZSA9PT0gJ29iamVjdCcpIHsKICAgICAgICAgICAgICAgIC8vIFdlJ2QgaGF2ZSB0byBtYWtlIHNvbWUgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIGRlc2NyaXB0aW9uIGVsZW1lbnQncyB0ZXh0LCBpZiB0aGUgY29uc3VtZXIKICAgICAgICAgICAgICAgIC8vIHBhc3NlZCBpbiBhbiBlbGVtZW50LiBBc3N1bWUgdGhhdCBpZiBhbiBlbGVtZW50IGlzIHBhc3NlZCBpbiwgdGhlIGNvbnN1bWVyIGhhcyB2ZXJpZmllZAogICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBjYW4gYmUgdXNlZCBhcyBhIGRlc2NyaXB0aW9uLgogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cmltbWVkTWVzc2FnZSA9IG1lc3NhZ2UgPT0gbnVsbCA/ICcnIDogYCR7bWVzc2FnZX1gLnRyaW0oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhcmlhTGFiZWwgPSBlbGVtZW50LmdldEF0dHJpYnV0ZSgnYXJpYS1sYWJlbCcpOwogICAgICAgICAgICAvLyBXZSBzaG91bGRuJ3Qgc2V0IGRlc2NyaXB0aW9ucyBpZiB0aGV5J3JlIGV4YWN0bHkgdGhlIHNhbWUgYXMgdGhlIGBhcmlhLWxhYmVsYCBvZiB0aGUKICAgICAgICAgICAgLy8gZWxlbWVudCwgYmVjYXVzZSBzY3JlZW4gcmVhZGVycyB3aWxsIGVuZCB1cCByZWFkaW5nIG91dCB0aGUgc2FtZSB0ZXh0IHR3aWNlIGluIGEgcm93LgogICAgICAgICAgICByZXR1cm4gdHJpbW1lZE1lc3NhZ2UgPyAoIWFyaWFMYWJlbCB8fCBhcmlhTGFiZWwudHJpbSgpICE9PSB0cmltbWVkTWVzc2FnZSkgOiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBub2RlIGlzIGFuIEVsZW1lbnQgbm9kZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2lzRWxlbWVudE5vZGUoZWxlbWVudCkgewogICAgICAgICAgICByZXR1cm4gZWxlbWVudC5ub2RlVHlwZSA9PT0gdGhpcy5fZG9jdW1lbnQuRUxFTUVOVF9OT0RFOwogICAgICAgIH0KICAgIH0KICAgIEFyaWFEZXNjcmliZXIuybVmYWMgPSBmdW5jdGlvbiBBcmlhRGVzY3JpYmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFyaWFEZXNjcmliZXIpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBcmlhRGVzY3JpYmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBcmlhRGVzY3JpYmVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gQXJpYURlc2NyaWJlcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEFyaWFEZXNjcmliZXIoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH0sIHRva2VuOiBBcmlhRGVzY3JpYmVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIFRoaXMgY2xhc3MgbWFuYWdlcyBrZXlib2FyZCBldmVudHMgZm9yIHNlbGVjdGFibGUgbGlzdHMuIElmIHlvdSBwYXNzIGl0IGEgcXVlcnkgbGlzdAogICAgICogb2YgaXRlbXMsIGl0IHdpbGwgc2V0IHRoZSBhY3RpdmUgaXRlbSBjb3JyZWN0bHkgd2hlbiBhcnJvdyBldmVudHMgb2NjdXIuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBMaXN0S2V5TWFuYWdlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfaXRlbXMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfaXRlbXMpIHsKICAgICAgICAgICAgdGhpcy5faXRlbXMgPSBfaXRlbXM7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA9IC0xOwogICAgICAgICAgICB0aGlzLl9hY3RpdmVJdGVtID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fd3JhcCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9sZXR0ZXJLZXlTdHJlYW0gPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICB0aGlzLl90eXBlYWhlYWRTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgICAgIHRoaXMuX3ZlcnRpY2FsID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fYWxsb3dlZE1vZGlmaWVyS2V5cyA9IFtdOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUHJlZGljYXRlIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhbiBpdGVtIHNob3VsZCBiZSBza2lwcGVkCiAgICAgICAgICAgICAqIGJ5IHRoZSBrZXkgbWFuYWdlci4gQnkgZGVmYXVsdCwgZGlzYWJsZWQgaXRlbXMgYXJlIHNraXBwZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9za2lwUHJlZGljYXRlRm4gPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uZGlzYWJsZWQpOwogICAgICAgICAgICAvLyBCdWZmZXIgZm9yIHRoZSBsZXR0ZXJzIHRoYXQgdGhlIHVzZXIgaGFzIHByZXNzZWQgd2hlbiB0aGUgdHlwZWFoZWFkIG9wdGlvbiBpcyB0dXJuZWQgb24uCiAgICAgICAgICAgIHRoaXMuX3ByZXNzZWRMZXR0ZXJzID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyBhbnkgdGltZSB0aGUgVEFCIGtleSBpcyBwcmVzc2VkLCBzbyBjb21wb25lbnRzIGNhbiByZWFjdAogICAgICAgICAgICAgKiB3aGVuIGZvY3VzIGlzIHNoaWZ0ZWQgb2ZmIG9mIHRoZSBsaXN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy50YWJPdXQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbmV2ZXIgdGhlIGFjdGl2ZSBpdGVtIG9mIHRoZSBsaXN0IG1hbmFnZXIgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLy8gV2UgYWxsb3cgZm9yIHRoZSBpdGVtcyB0byBiZSBhbiBhcnJheSBiZWNhdXNlLCBpbiBzb21lIGNhc2VzLCB0aGUgY29uc3VtZXIgbWF5CiAgICAgICAgICAgIC8vIG5vdCBoYXZlIGFjY2VzcyB0byBhIFF1ZXJ5TGlzdCBvZiB0aGUgaXRlbXMgdGhleSB3YW50IHRvIG1hbmFnZSAoZS5nLiB3aGVuIHRoZQogICAgICAgICAgICAvLyBpdGVtcyBhcmVuJ3QgYmVpbmcgY29sbGVjdGVkIHZpYSBgVmlld0NoaWxkcmVuYCBvciBgQ29udGVudENoaWxkcmVuYCkuCiAgICAgICAgICAgIGlmIChfaXRlbXMgaW5zdGFuY2VvZiBRdWVyeUxpc3QpIHsKICAgICAgICAgICAgICAgIF9pdGVtcy5jaGFuZ2VzLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG5ld0l0ZW1zCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAobmV3SXRlbXMpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlSXRlbSkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW1BcnJheSA9IG5ld0l0ZW1zLnRvQXJyYXkoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdJbmRleCA9IGl0ZW1BcnJheS5pbmRleE9mKHRoaXMuX2FjdGl2ZUl0ZW0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAobmV3SW5kZXggPiAtMSAmJiBuZXdJbmRleCAhPT0gdGhpcy5fYWN0aXZlSXRlbUluZGV4KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPSBuZXdJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoaWNoIGl0ZW1zIHNob3VsZCBiZSBza2lwcGVkIGJ5IHRoZQogICAgICAgICAqIGxpc3Qga2V5IG1hbmFnZXIuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IHByZWRpY2F0ZSBGdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgZ2l2ZW4gaXRlbSBzaG91bGQgYmUgc2tpcHBlZC4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHNraXBQcmVkaWNhdGUocHJlZGljYXRlKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3NraXBQcmVkaWNhdGVGbiA9IHByZWRpY2F0ZTsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbmZpZ3VyZXMgd3JhcHBpbmcgbW9kZSwgd2hpY2ggZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBhY3RpdmUgaXRlbSB3aWxsIHdyYXAgdG8KICAgICAgICAgKiB0aGUgb3RoZXIgZW5kIG9mIGxpc3Qgd2hlbiB0aGVyZSBhcmUgbm8gbW9yZSBpdGVtcyBpbiB0aGUgZ2l2ZW4gZGlyZWN0aW9uLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/PX0gc2hvdWxkV3JhcCBXaGV0aGVyIHRoZSBsaXN0IHNob3VsZCB3cmFwIHdoZW4gcmVhY2hpbmcgdGhlIGVuZC4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhXcmFwKHNob3VsZFdyYXAgPSB0cnVlKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3dyYXAgPSBzaG91bGRXcmFwOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uZmlndXJlcyB3aGV0aGVyIHRoZSBrZXkgbWFuYWdlciBzaG91bGQgYmUgYWJsZSB0byBtb3ZlIHRoZSBzZWxlY3Rpb24gdmVydGljYWxseS4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IGVuYWJsZWQgV2hldGhlciB2ZXJ0aWNhbCBzZWxlY3Rpb24gc2hvdWxkIGJlIGVuYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoVmVydGljYWxPcmllbnRhdGlvbihlbmFibGVkID0gdHJ1ZSkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl92ZXJ0aWNhbCA9IGVuYWJsZWQ7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25maWd1cmVzIHRoZSBrZXkgbWFuYWdlciB0byBtb3ZlIHRoZSBzZWxlY3Rpb24gaG9yaXpvbnRhbGx5LgogICAgICAgICAqIFBhc3NpbmcgaW4gYG51bGxgIHdpbGwgZGlzYWJsZSBob3Jpem9udGFsIG1vdmVtZW50LgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3Rpb24gRGlyZWN0aW9uIGluIHdoaWNoIHRoZSBzZWxlY3Rpb24gY2FuIGJlIG1vdmVkLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgd2l0aEhvcml6b250YWxPcmllbnRhdGlvbihkaXJlY3Rpb24pIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5faG9yaXpvbnRhbCA9IGRpcmVjdGlvbjsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1vZGlmaWVyIGtleXMgd2hpY2ggYXJlIGFsbG93ZWQgdG8gYmUgaGVsZCBkb3duIGFuZCB3aG9zZSBkZWZhdWx0IGFjdGlvbnMgd2lsbCBiZSBwcmV2ZW50ZWQKICAgICAgICAgKiBhcyB0aGUgdXNlciBpcyBwcmVzc2luZyB0aGUgYXJyb3cga2V5cy4gRGVmYXVsdHMgdG8gbm90IGFsbG93aW5nIGFueSBtb2RpZmllciBrZXlzLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBrZXlzCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoQWxsb3dlZE1vZGlmaWVyS2V5cyhrZXlzKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FsbG93ZWRNb2RpZmllcktleXMgPSBrZXlzOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVHVybnMgb24gdHlwZWFoZWFkIG1vZGUgd2hpY2ggYWxsb3dzIHVzZXJzIHRvIHNldCB0aGUgYWN0aXZlIGl0ZW0gYnkgdHlwaW5nLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVib3VuY2VJbnRlcnZhbCBUaW1lIHRvIHdhaXQgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3RpdmUgaXRlbS4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhUeXBlQWhlYWQoZGVib3VuY2VJbnRlcnZhbCA9IDIwMCkgewogICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5faXRlbXMubGVuZ3RoICYmICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2l0ZW1zLnNvbWUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGl0ZW0gPT4gdHlwZW9mIGl0ZW0uZ2V0TGFiZWwgIT09ICdmdW5jdGlvbicpKSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0xpc3RLZXlNYW5hZ2VyIGl0ZW1zIGluIHR5cGVhaGVhZCBtb2RlIG11c3QgaW1wbGVtZW50IHRoZSBgZ2V0TGFiZWxgIG1ldGhvZC4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl90eXBlYWhlYWRTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgLy8gRGVib3VuY2UgdGhlIHByZXNzZXMgb2Ygbm9uLW5hdmlnYXRpb25hbCBrZXlzLCBjb2xsZWN0IHRoZSBvbmVzIHRoYXQgY29ycmVzcG9uZCB0byBsZXR0ZXJzCiAgICAgICAgICAgIC8vIGFuZCBjb252ZXJ0IHRob3NlIGxldHRlcnMgYmFjayBpbnRvIGEgc3RyaW5nLiBBZnRlcndhcmRzIGZpbmQgdGhlIGZpcnN0IGl0ZW0gdGhhdCBzdGFydHMKICAgICAgICAgICAgLy8gd2l0aCB0aGF0IHN0cmluZyBhbmQgc2VsZWN0IGl0LgogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl90eXBlYWhlYWRTdWJzY3JpcHRpb24gPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9sZXR0ZXJLZXlTdHJlYW0ucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGxldHRlcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbGV0dGVyID0+ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZXNzZWRMZXR0ZXJzLnB1c2gobGV0dGVyKSkpLCBkZWJvdW5jZVRpbWUoZGVib3VuY2VJbnRlcnZhbCksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wcmVzc2VkTGV0dGVycy5sZW5ndGggPiAwKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wcmVzc2VkTGV0dGVycy5qb2luKCcnKSkpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGlucHV0U3RyaW5nCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbnB1dFN0cmluZyA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpdGVtcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2dldEl0ZW1zQXJyYXkoKTsKICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGF0IDEgYmVjYXVzZSB3ZSB3YW50IHRvIHN0YXJ0IHNlYXJjaGluZyBhdCB0aGUgaXRlbSBpbW1lZGlhdGVseQogICAgICAgICAgICAgICAgLy8gZm9sbG93aW5nIHRoZSBjdXJyZW50IGFjdGl2ZSBpdGVtLgogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBpdGVtcy5sZW5ndGggKyAxOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fYWN0aXZlSXRlbUluZGV4ICsgaSkgJSBpdGVtcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGl0ZW0gPSBpdGVtc1tpbmRleF07CiAgICAgICAgICAgICAgICAgICAgaWYgKCEoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9za2lwUHJlZGljYXRlRm4oaXRlbSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGl0ZW0uZ2V0TGFiZWwpKSgpLnRvVXBwZXJDYXNlKCkudHJpbSgpLmluZGV4T2YoaW5wdXRTdHJpbmcpID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuc2V0QWN0aXZlSXRlbShpbmRleCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZXNzZWRMZXR0ZXJzID0gW107CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0QWN0aXZlSXRlbShpdGVtKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNJbmRleCA9IHRoaXMuX2FjdGl2ZUl0ZW1JbmRleDsKICAgICAgICAgICAgdGhpcy51cGRhdGVBY3RpdmVJdGVtKGl0ZW0pOwogICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlSXRlbUluZGV4ICE9PSBwcmV2aW91c0luZGV4KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZS5uZXh0KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgYWN0aXZlIGl0ZW0gZGVwZW5kaW5nIG9uIHRoZSBrZXkgZXZlbnQgcGFzc2VkIGluLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQgS2V5Ym9hcmQgZXZlbnQgdG8gYmUgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgd2hpY2ggZWxlbWVudCBzaG91bGQgYmUgYWN0aXZlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25LZXlkb3duKGV2ZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbW9kaWZpZXJzID0gWydhbHRLZXknLCAnY3RybEtleScsICdtZXRhS2V5JywgJ3NoaWZ0S2V5J107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNNb2RpZmllckFsbG93ZWQgPSBtb2RpZmllcnMuZXZlcnkoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG1vZGlmaWVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtb2RpZmllciA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gIWV2ZW50W21vZGlmaWVyXSB8fCB0aGlzLl9hbGxvd2VkTW9kaWZpZXJLZXlzLmluZGV4T2YobW9kaWZpZXIpID4gLTE7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgc3dpdGNoIChrZXlDb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFRBQjoKICAgICAgICAgICAgICAgICAgICB0aGlzLnRhYk91dC5uZXh0KCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgY2FzZSBET1dOX0FSUk9XOgogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl92ZXJ0aWNhbCAmJiBpc01vZGlmaWVyQWxsb3dlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNldE5leHRJdGVtQWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgVVBfQVJST1c6CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ZlcnRpY2FsICYmIGlzTW9kaWZpZXJBbGxvd2VkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UHJldmlvdXNJdGVtQWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgUklHSFRfQVJST1c6CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hvcml6b250YWwgJiYgaXNNb2RpZmllckFsbG93ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faG9yaXpvbnRhbCA9PT0gJ3J0bCcgPyB0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpIDogdGhpcy5zZXROZXh0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIExFRlRfQVJST1c6CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hvcml6b250YWwgJiYgaXNNb2RpZmllckFsbG93ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faG9yaXpvbnRhbCA9PT0gJ3J0bCcgPyB0aGlzLnNldE5leHRJdGVtQWN0aXZlKCkgOiB0aGlzLnNldFByZXZpb3VzSXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGlmIChpc01vZGlmaWVyQWxsb3dlZCB8fCBoYXNNb2RpZmllcktleShldmVudCwgJ3NoaWZ0S2V5JykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byB1c2UgdGhlIGBldmVudC5rZXlgIHdoaWNoIGFsc28gbWFwcyBpdCB0byB0aGUgdXNlcidzIGtleWJvYXJkIGxhbmd1YWdlLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBvdGhlcndpc2UgZmFsbCBiYWNrIHRvIHJlc29sdmluZyBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyB2aWEgdGhlIGtleUNvZGUuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXkgJiYgZXZlbnQua2V5Lmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGV0dGVyS2V5U3RyZWFtLm5leHQoZXZlbnQua2V5LnRvTG9jYWxlVXBwZXJDYXNlKCkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKChrZXlDb2RlID49IEEgJiYga2V5Q29kZSA8PSBaKSB8fCAoa2V5Q29kZSA+PSBaRVJPICYmIGtleUNvZGUgPD0gTklORSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xldHRlcktleVN0cmVhbS5uZXh0KFN0cmluZy5mcm9tQ2hhckNvZGUoa2V5Q29kZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSByZXR1cm4gaGVyZSwgaW4gb3JkZXIgdG8gYXZvaWQgcHJldmVudGluZwogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZWZhdWx0IGFjdGlvbiBvZiBub24tbmF2aWdhdGlvbmFsIGtleXMuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ByZXNzZWRMZXR0ZXJzID0gW107CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEluZGV4IG9mIHRoZSBjdXJyZW50bHkgYWN0aXZlIGl0ZW0uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYWN0aXZlSXRlbUluZGV4KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYWN0aXZlSXRlbUluZGV4OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYWN0aXZlIGl0ZW0uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYWN0aXZlSXRlbSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZUl0ZW07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgd2hldGhlciB0aGUgdXNlciBpcyBjdXJyZW50bHkgdHlwaW5nIGludG8gdGhlIG1hbmFnZXIgdXNpbmcgdGhlIHR5cGVhaGVhZCBmZWF0dXJlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaXNUeXBpbmcoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmVzc2VkTGV0dGVycy5sZW5ndGggPiAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBhY3RpdmUgaXRlbSB0byB0aGUgZmlyc3QgZW5hYmxlZCBpdGVtIGluIHRoZSBsaXN0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0Rmlyc3RJdGVtQWN0aXZlKCkgewogICAgICAgICAgICB0aGlzLl9zZXRBY3RpdmVJdGVtQnlJbmRleCgwLCAxKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgYWN0aXZlIGl0ZW0gdG8gdGhlIGxhc3QgZW5hYmxlZCBpdGVtIGluIHRoZSBsaXN0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0TGFzdEl0ZW1BY3RpdmUoKSB7CiAgICAgICAgICAgIHRoaXMuX3NldEFjdGl2ZUl0ZW1CeUluZGV4KHRoaXMuX2l0ZW1zLmxlbmd0aCAtIDEsIC0xKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgYWN0aXZlIGl0ZW0gdG8gdGhlIG5leHQgZW5hYmxlZCBpdGVtIGluIHRoZSBsaXN0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0TmV4dEl0ZW1BY3RpdmUoKSB7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCA8IDAgPyB0aGlzLnNldEZpcnN0SXRlbUFjdGl2ZSgpIDogdGhpcy5fc2V0QWN0aXZlSXRlbUJ5RGVsdGEoMSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGFjdGl2ZSBpdGVtIHRvIGEgcHJldmlvdXMgZW5hYmxlZCBpdGVtIGluIHRoZSBsaXN0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0UHJldmlvdXNJdGVtQWN0aXZlKCkgewogICAgICAgICAgICB0aGlzLl9hY3RpdmVJdGVtSW5kZXggPCAwICYmIHRoaXMuX3dyYXAgPyB0aGlzLnNldExhc3RJdGVtQWN0aXZlKCkKICAgICAgICAgICAgICAgIDogdGhpcy5fc2V0QWN0aXZlSXRlbUJ5RGVsdGEoLTEpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUFjdGl2ZUl0ZW0oaXRlbSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW1BcnJheSA9IHRoaXMuX2dldEl0ZW1zQXJyYXkoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleCA9IHR5cGVvZiBpdGVtID09PSAnbnVtYmVyJyA/IGl0ZW0gOiBpdGVtQXJyYXkuaW5kZXhPZihpdGVtKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhY3RpdmVJdGVtID0gaXRlbUFycmF5W2luZGV4XTsKICAgICAgICAgICAgLy8gRXhwbGljaXRseSBjaGVjayBmb3IgYG51bGxgIGFuZCBgdW5kZWZpbmVkYCBiZWNhdXNlIG90aGVyIGZhbHN5IHZhbHVlcyBhcmUgdmFsaWQuCiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZUl0ZW0gPSBhY3RpdmVJdGVtID09IG51bGwgPyBudWxsIDogYWN0aXZlSXRlbTsKICAgICAgICAgICAgdGhpcy5fYWN0aXZlSXRlbUluZGV4ID0gaW5kZXg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIGFjdGl2ZSBpdGVtLCBnaXZlbiBhIGxpc3Qgb2YgaXRlbXMgYW5kIHRoZSBkZWx0YSBiZXR3ZWVuIHRoZQogICAgICAgICAqIGN1cnJlbnRseSBhY3RpdmUgaXRlbSBhbmQgdGhlIG5ldyBhY3RpdmUgaXRlbS4gSXQgd2lsbCBjYWxjdWxhdGUgZGlmZmVyZW50bHkKICAgICAgICAgKiBkZXBlbmRpbmcgb24gd2hldGhlciB3cmFwIG1vZGUgaXMgdHVybmVkIG9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWx0YQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldEFjdGl2ZUl0ZW1CeURlbHRhKGRlbHRhKSB7CiAgICAgICAgICAgIHRoaXMuX3dyYXAgPyB0aGlzLl9zZXRBY3RpdmVJbldyYXBNb2RlKGRlbHRhKSA6IHRoaXMuX3NldEFjdGl2ZUluRGVmYXVsdE1vZGUoZGVsdGEpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBhY3RpdmUgaXRlbSBwcm9wZXJseSBnaXZlbiAid3JhcCIgbW9kZS4gSW4gb3RoZXIgd29yZHMsIGl0IHdpbGwgY29udGludWUgdG8gbW92ZQogICAgICAgICAqIGRvd24gdGhlIGxpc3QgdW50aWwgaXQgZmluZHMgYW4gaXRlbSB0aGF0IGlzIG5vdCBkaXNhYmxlZCwgYW5kIGl0IHdpbGwgd3JhcCBpZiBpdAogICAgICAgICAqIGVuY291bnRlcnMgZWl0aGVyIGVuZCBvZiB0aGUgbGlzdC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZGVsdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRBY3RpdmVJbldyYXBNb2RlKGRlbHRhKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0FycmF5KCk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAxOyBpIDw9IGl0ZW1zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9ICh0aGlzLl9hY3RpdmVJdGVtSW5kZXggKyAoZGVsdGEgKiBpKSArIGl0ZW1zLmxlbmd0aCkgJSBpdGVtcy5sZW5ndGg7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpdGVtID0gaXRlbXNbaW5kZXhdOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9za2lwUHJlZGljYXRlRm4oaXRlbSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldEFjdGl2ZUl0ZW0oaW5kZXgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBhY3RpdmUgaXRlbSBwcm9wZXJseSBnaXZlbiB0aGUgZGVmYXVsdCBtb2RlLiBJbiBvdGhlciB3b3JkcywgaXQgd2lsbAogICAgICAgICAqIGNvbnRpbnVlIHRvIG1vdmUgZG93biB0aGUgbGlzdCB1bnRpbCBpdCBmaW5kcyBhbiBpdGVtIHRoYXQgaXMgbm90IGRpc2FibGVkLiBJZgogICAgICAgICAqIGl0IGVuY291bnRlcnMgZWl0aGVyIGVuZCBvZiB0aGUgbGlzdCwgaXQgd2lsbCBzdG9wIGFuZCBub3Qgd3JhcC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZGVsdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRBY3RpdmVJbkRlZmF1bHRNb2RlKGRlbHRhKSB7CiAgICAgICAgICAgIHRoaXMuX3NldEFjdGl2ZUl0ZW1CeUluZGV4KHRoaXMuX2FjdGl2ZUl0ZW1JbmRleCArIGRlbHRhLCBkZWx0YSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGFjdGl2ZSBpdGVtIHRvIHRoZSBmaXJzdCBlbmFibGVkIGl0ZW0gc3RhcnRpbmcgYXQgdGhlIGluZGV4IHNwZWNpZmllZC4gSWYgdGhlCiAgICAgICAgICogaXRlbSBpcyBkaXNhYmxlZCwgaXQgd2lsbCBtb3ZlIGluIHRoZSBmYWxsYmFja0RlbHRhIGRpcmVjdGlvbiB1bnRpbCBpdCBlaXRoZXIKICAgICAgICAgKiBmaW5kcyBhbiBlbmFibGVkIGl0ZW0gb3IgZW5jb3VudGVycyB0aGUgZW5kIG9mIHRoZSBsaXN0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEBwYXJhbSB7P30gZmFsbGJhY2tEZWx0YQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldEFjdGl2ZUl0ZW1CeUluZGV4KGluZGV4LCBmYWxsYmFja0RlbHRhKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXRlbXMgPSB0aGlzLl9nZXRJdGVtc0FycmF5KCk7CiAgICAgICAgICAgIGlmICghaXRlbXNbaW5kZXhdKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgd2hpbGUgKHRoaXMuX3NraXBQcmVkaWNhdGVGbihpdGVtc1tpbmRleF0pKSB7CiAgICAgICAgICAgICAgICBpbmRleCArPSBmYWxsYmFja0RlbHRhOwogICAgICAgICAgICAgICAgaWYgKCFpdGVtc1tpbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zZXRBY3RpdmVJdGVtKGluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaXRlbXMgYXMgYW4gYXJyYXkuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRJdGVtc0FycmF5KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faXRlbXMgaW5zdGFuY2VvZiBRdWVyeUxpc3QgPyB0aGlzLl9pdGVtcy50b0FycmF5KCkgOiB0aGlzLl9pdGVtczsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyIGV4dGVuZHMgTGlzdEtleU1hbmFnZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldEFjdGl2ZUl0ZW0oaW5kZXgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlSXRlbSkgewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtLnNldEluYWN0aXZlU3R5bGVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VwZXIuc2V0QWN0aXZlSXRlbShpbmRleCk7CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlSXRlbS5zZXRBY3RpdmVTdHlsZXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgRm9jdXNLZXlNYW5hZ2VyIGV4dGVuZHMgTGlzdEtleU1hbmFnZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICB0aGlzLl9vcmlnaW4gPSAncHJvZ3JhbSc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGZvY3VzIG9yaWdpbiB0aGF0IHdpbGwgYmUgcGFzc2VkIGluIHRvIHRoZSBpdGVtcyBmb3IgYW55IHN1YnNlcXVlbnQgYGZvY3VzYCBjYWxscy4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luIEZvY3VzIG9yaWdpbiB0byBiZSB1c2VkIHdoZW4gZm9jdXNpbmcgaXRlbXMuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBzZXRGb2N1c09yaWdpbihvcmlnaW4pIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3JpZ2luID0gb3JpZ2luOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRBY3RpdmVJdGVtKGl0ZW0pIHsKICAgICAgICAgICAgc3VwZXIuc2V0QWN0aXZlSXRlbShpdGVtKTsKICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlSXRlbSkgewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVJdGVtLmZvY3VzKHRoaXMuX29yaWdpbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvaW50ZXJhY3Rpdml0eS1jaGVja2VyL2ludGVyYWN0aXZpdHktY2hlY2tlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBUaGUgSW50ZXJhY3Rpdml0eUNoZWNrZXIgbGVhbnMgaGVhdmlseSBvbiB0aGUgYWxseS5qcyBhY2Nlc3NpYmlsaXR5IHV0aWxpdGllcy4KICAgIC8vIE1ldGhvZHMgbGlrZSBgaXNUYWJiYWJsZWAgYXJlIG9ubHkgY292ZXJpbmcgc3BlY2lmaWMgZWRnZS1jYXNlcyBmb3IgdGhlIGJyb3dzZXJzIHdoaWNoIGFyZQogICAgLy8gc3VwcG9ydGVkLgogICAgLyoqCiAgICAgKiBVdGlsaXR5IGZvciBjaGVja2luZyB0aGUgaW50ZXJhY3Rpdml0eSBvZiBhbiBlbGVtZW50LCBzdWNoIGFzIHdoZXRoZXIgaXMgaXMgZm9jdXNhYmxlIG9yCiAgICAgKiB0YWJiYWJsZS4KICAgICAqLwogICAgY2xhc3MgSW50ZXJhY3Rpdml0eUNoZWNrZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BsYXRmb3JtKSB7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBkaXNhYmxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBFbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAgICogQHJldHVybiB7P30gV2hldGhlciB0aGUgZWxlbWVudCBpcyBkaXNhYmxlZC4KICAgICAgICAgKi8KICAgICAgICBpc0Rpc2FibGVkKGVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gVGhpcyBkb2VzIG5vdCBjYXB0dXJlIHNvbWUgY2FzZXMsIHN1Y2ggYXMgYSBub24tZm9ybSBjb250cm9sIHdpdGggYSBkaXNhYmxlZCBhdHRyaWJ1dGUgb3IKICAgICAgICAgICAgLy8gYSBmb3JtIGNvbnRyb2wgaW5zaWRlIG9mIGEgZGlzYWJsZWQgZm9ybSwgYnV0IHNob3VsZCBjYXB0dXJlIHRoZSBtb3N0IGNvbW1vbiBjYXNlcy4KICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdkaXNhYmxlZCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyB2aXNpYmxlIGZvciB0aGUgcHVycG9zZXMgb2YgaW50ZXJhY3Rpdml0eS4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgd2lsbCBjYXB0dXJlIHN0YXRlcyBsaWtlIGBkaXNwbGF5OiBub25lYCBhbmQgYHZpc2liaWxpdHk6IGhpZGRlbmAsIGJ1dCBub3QgdGhpbmdzIGxpa2UKICAgICAgICAgKiBiZWluZyBjbGlwcGVkIGJ5IGFuIGBvdmVyZmxvdzogaGlkZGVuYCBwYXJlbnQgb3IgYmVpbmcgb3V0c2lkZSB0aGUgdmlld3BvcnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHZpc2libGUuCiAgICAgICAgICovCiAgICAgICAgaXNWaXNpYmxlKGVsZW1lbnQpIHsKICAgICAgICAgICAgcmV0dXJuIGhhc0dlb21ldHJ5KGVsZW1lbnQpICYmIGdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkudmlzaWJpbGl0eSA9PT0gJ3Zpc2libGUnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBjYW4gYmUgcmVhY2hlZCB2aWEgVGFiIGtleS4KICAgICAgICAgKiBBc3N1bWVzIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGFscmVhZHkgYmVlbiBjaGVja2VkIHdpdGggaXNGb2N1c2FibGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCB0byBiZSBjaGVja2VkLgogICAgICAgICAqIEByZXR1cm4gez99IFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgdGFiYmFibGUuCiAgICAgICAgICovCiAgICAgICAgaXNUYWJiYWJsZShlbGVtZW50KSB7CiAgICAgICAgICAgIC8vIE5vdGhpbmcgaXMgdGFiYmFibGUgb24gdGhlIHNlcnZlciDwn5iOCiAgICAgICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmcmFtZUVsZW1lbnQgPSBnZXRGcmFtZUVsZW1lbnQoZ2V0V2luZG93KGVsZW1lbnQpKTsKICAgICAgICAgICAgaWYgKGZyYW1lRWxlbWVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZnJhbWVUeXBlID0gZnJhbWVFbGVtZW50ICYmIGZyYW1lRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgLy8gRnJhbWUgZWxlbWVudHMgaW5oZXJpdCB0aGVpciB0YWJpbmRleCBvbnRvIGFsbCBjaGlsZCBlbGVtZW50cy4KICAgICAgICAgICAgICAgIGlmIChnZXRUYWJJbmRleFZhbHVlKGZyYW1lRWxlbWVudCkgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gV2Via2l0IGFuZCBCbGluayBjb25zaWRlciBhbnl0aGluZyBpbnNpZGUgb2YgYW4gPG9iamVjdD4gZWxlbWVudCBhcyBub24tdGFiYmFibGUuCiAgICAgICAgICAgICAgICBpZiAoKHRoaXMuX3BsYXRmb3JtLkJMSU5LIHx8IHRoaXMuX3BsYXRmb3JtLldFQktJVCkgJiYgZnJhbWVUeXBlID09PSAnb2JqZWN0JykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIFdlYmtpdCBhbmQgQmxpbmsgZGlzYWJsZSB0YWJiaW5nIHRvIGFuIGVsZW1lbnQgaW5zaWRlIG9mIGFuIGludmlzaWJsZSBmcmFtZS4KICAgICAgICAgICAgICAgIGlmICgodGhpcy5fcGxhdGZvcm0uQkxJTksgfHwgdGhpcy5fcGxhdGZvcm0uV0VCS0lUKSAmJiAhdGhpcy5pc1Zpc2libGUoZnJhbWVFbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdGFiSW5kZXhWYWx1ZSA9IGdldFRhYkluZGV4VmFsdWUoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0YWJJbmRleFZhbHVlICE9PSAtMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdpZnJhbWUnKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgZnJhbWVzIG1heSBiZSB0YWJiYWJsZSBkZXBlbmRpbmcgb24gY29udGVudCwgYnV0IGl0J3Mgbm90IHBvc3NpYmx5IHRvIHJlbGlhYmx5CiAgICAgICAgICAgICAgICAvLyBpbnZlc3RpZ2F0ZSB0aGUgY29udGVudCBvZiB0aGUgZnJhbWVzLgogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ2F1ZGlvJykgewogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udHJvbHMnKSkgewogICAgICAgICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQgYW4gPGF1ZGlvPiBlbGVtZW50IHdpdGhvdXQgdGhlIGNvbnRyb2xzIGVuYWJsZWQgaXMgbm90IHRhYmJhYmxlLgogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3BsYXRmb3JtLkJMSU5LKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW4gQmxpbmsgPGF1ZGlvIGNvbnRyb2xzPiBlbGVtZW50cyBhcmUgYWx3YXlzIHRhYmJhYmxlLgogICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChub2RlTmFtZSA9PT0gJ3ZpZGVvJykgewogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udHJvbHMnKSAmJiB0aGlzLl9wbGF0Zm9ybS5UUklERU5UKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW4gVHJpZGVudCBhIDx2aWRlbz4gZWxlbWVudCB3aXRob3V0IHRoZSBjb250cm9scyBlbmFibGVkIGlzIG5vdCB0YWJiYWJsZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9wbGF0Zm9ybS5CTElOSyB8fCB0aGlzLl9wbGF0Zm9ybS5GSVJFRk9YKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW4gQ2hyb21lIGFuZCBGaXJlZm94IDx2aWRlbyBjb250cm9scz4gZWxlbWVudHMgYXJlIGFsd2F5cyB0YWJiYWJsZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAobm9kZU5hbWUgPT09ICdvYmplY3QnICYmICh0aGlzLl9wbGF0Zm9ybS5CTElOSyB8fCB0aGlzLl9wbGF0Zm9ybS5XRUJLSVQpKSB7CiAgICAgICAgICAgICAgICAvLyBJbiBhbGwgQmxpbmsgYW5kIFdlYktpdCBiYXNlZCBicm93c2VycyA8b2JqZWN0PiBlbGVtZW50cyBhcmUgbmV2ZXIgdGFiYmFibGUuCiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW4gaU9TIHRoZSBicm93c2VyIG9ubHkgY29uc2lkZXJzIHNvbWUgc3BlY2lmaWMgZWxlbWVudHMgYXMgdGFiYmFibGUuCiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybS5XRUJLSVQgJiYgdGhpcy5fcGxhdGZvcm0uSU9TICYmICFpc1BvdGVudGlhbGx5VGFiYmFibGVJT1MoZWxlbWVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZWxlbWVudC50YWJJbmRleCA+PSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBjYW4gYmUgZm9jdXNlZCBieSB0aGUgdXNlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBFbGVtZW50IHRvIGJlIGNoZWNrZWQuCiAgICAgICAgICogQHJldHVybiB7P30gV2hldGhlciB0aGUgZWxlbWVudCBpcyBmb2N1c2FibGUuCiAgICAgICAgICovCiAgICAgICAgaXNGb2N1c2FibGUoZWxlbWVudCkgewogICAgICAgICAgICAvLyBQZXJmb3JtIGNoZWNrcyBpbiBvcmRlciBvZiBsZWZ0IHRvIG1vc3QgZXhwZW5zaXZlLgogICAgICAgICAgICAvLyBBZ2FpbiwgbmFpdmUgYXBwcm9hY2ggdGhhdCBkb2VzIG5vdCBjYXB0dXJlIG1hbnkgZWRnZSBjYXNlcyBhbmQgYnJvd3NlciBxdWlya3MuCiAgICAgICAgICAgIHJldHVybiBpc1BvdGVudGlhbGx5Rm9jdXNhYmxlKGVsZW1lbnQpICYmICF0aGlzLmlzRGlzYWJsZWQoZWxlbWVudCkgJiYgdGhpcy5pc1Zpc2libGUoZWxlbWVudCk7CiAgICAgICAgfQogICAgfQogICAgSW50ZXJhY3Rpdml0eUNoZWNrZXIuybVmYWMgPSBmdW5jdGlvbiBJbnRlcmFjdGl2aXR5Q2hlY2tlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBJbnRlcmFjdGl2aXR5Q2hlY2tlcikoybXJtWluamVjdChQbGF0Zm9ybSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBJbnRlcmFjdGl2aXR5Q2hlY2tlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW50ZXJhY3Rpdml0eUNoZWNrZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBJbnRlcmFjdGl2aXR5Q2hlY2tlcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEludGVyYWN0aXZpdHlDaGVja2VyKMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfSwgdG9rZW46IEludGVyYWN0aXZpdHlDaGVja2VyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGZyYW1lIGVsZW1lbnQgZnJvbSBhIHdpbmRvdyBvYmplY3QuIFNpbmNlIGJyb3dzZXJzIGxpa2UgTVMgRWRnZSB0aHJvdyBlcnJvcnMgaWYKICAgICAqIHRoZSBmcmFtZUVsZW1lbnQgcHJvcGVydHkgaXMgYmVpbmcgYWNjZXNzZWQgZnJvbSBhIGRpZmZlcmVudCBob3N0IGFkZHJlc3MsIHRoaXMgcHJvcGVydHkKICAgICAqIHNob3VsZCBiZSBhY2Nlc3NlZCBjYXJlZnVsbHkuCiAgICAgKiBAcGFyYW0gez99IHdpbmRvdwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RnJhbWVFbGVtZW50KHdpbmRvdykgewogICAgICAgIHRyeSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAod2luZG93LmZyYW1lRWxlbWVudCkpOwogICAgICAgIH0KICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaGFzIGFueSBnZW9tZXRyeSAvIHJlY3RhbmdsZXMuCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGhhc0dlb21ldHJ5KGVsZW1lbnQpIHsKICAgICAgICAvLyBVc2UgbG9naWMgZnJvbSBqUXVlcnkgdG8gY2hlY2sgZm9yIGFuIGludmlzaWJsZSBlbGVtZW50LgogICAgICAgIC8vIFNlZSBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9ibG9iL21hc3Rlci9zcmMvY3NzL2hpZGRlblZpc2libGVTZWxlY3RvcnMuanMjTDEyCiAgICAgICAgcmV0dXJuICEhKGVsZW1lbnQub2Zmc2V0V2lkdGggfHwgZWxlbWVudC5vZmZzZXRIZWlnaHQgfHwKICAgICAgICAgICAgKHR5cGVvZiBlbGVtZW50LmdldENsaWVudFJlY3RzID09PSAnZnVuY3Rpb24nICYmIGVsZW1lbnQuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpKTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB3aGV0aGVyIGFuIGVsZW1lbnQncwogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc05hdGl2ZUZvcm1FbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIHJldHVybiBub2RlTmFtZSA9PT0gJ2lucHV0JyB8fAogICAgICAgICAgICBub2RlTmFtZSA9PT0gJ3NlbGVjdCcgfHwKICAgICAgICAgICAgbm9kZU5hbWUgPT09ICdidXR0b24nIHx8CiAgICAgICAgICAgIG5vZGVOYW1lID09PSAndGV4dGFyZWEnOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBhbiBgPGlucHV0IHR5cGU9ImhpZGRlbiI+YC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNIaWRkZW5JbnB1dChlbGVtZW50KSB7CiAgICAgICAgcmV0dXJuIGlzSW5wdXRFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQudHlwZSA9PSAnaGlkZGVuJzsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgYW4gYW5jaG9yIHRoYXQgaGFzIGFuIGhyZWYgYXR0cmlidXRlLgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0FuY2hvcldpdGhIcmVmKGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gaXNBbmNob3JFbGVtZW50KGVsZW1lbnQpICYmIGVsZW1lbnQuaGFzQXR0cmlidXRlKCdocmVmJyk7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIGFuIGlucHV0IGVsZW1lbnQuCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzSW5wdXRFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICByZXR1cm4gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09ICdpbnB1dCc7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIGFuIGFuY2hvciBlbGVtZW50LgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0FuY2hvckVsZW1lbnQoZWxlbWVudCkgewogICAgICAgIHJldHVybiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT0gJ2EnOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBoYXMgYSB2YWxpZCB0YWJpbmRleC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaGFzVmFsaWRUYWJJbmRleChlbGVtZW50KSB7CiAgICAgICAgaWYgKCFlbGVtZW50Lmhhc0F0dHJpYnV0ZSgndGFiaW5kZXgnKSB8fCBlbGVtZW50LnRhYkluZGV4ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHRhYkluZGV4ID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoJ3RhYmluZGV4Jyk7CiAgICAgICAgLy8gSUUxMSBwYXJzZXMgdGFiaW5kZXg9IiIgYXMgdGhlIHZhbHVlICItMzI3NjgiCiAgICAgICAgaWYgKHRhYkluZGV4ID09ICctMzI3NjgnKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuICEhKHRhYkluZGV4ICYmICFpc05hTihwYXJzZUludCh0YWJJbmRleCwgMTApKSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHBhcnNlZCB0YWJpbmRleCBmcm9tIHRoZSBlbGVtZW50IGF0dHJpYnV0ZXMgaW5zdGVhZCBvZiByZXR1cm5pbmcgdGhlCiAgICAgKiBldmFsdWF0ZWQgdGFiaW5kZXggZnJvbSB0aGUgYnJvd3NlcnMgZGVmYXVsdHMuCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRhYkluZGV4VmFsdWUoZWxlbWVudCkgewogICAgICAgIGlmICghaGFzVmFsaWRUYWJJbmRleChlbGVtZW50KSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gU2VlIGJyb3dzZXIgaXNzdWUgaW4gR2Vja28gaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTEyODA1NAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YWJJbmRleCA9IHBhcnNlSW50KGVsZW1lbnQuZ2V0QXR0cmlidXRlKCd0YWJpbmRleCcpIHx8ICcnLCAxMCk7CiAgICAgICAgcmV0dXJuIGlzTmFOKHRhYkluZGV4KSA/IC0xIDogdGFiSW5kZXg7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZWxlbWVudCBpcyBwb3RlbnRpYWxseSB0YWJiYWJsZSBvbiBpT1MKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNQb3RlbnRpYWxseVRhYmJhYmxlSU9TKGVsZW1lbnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG5vZGVOYW1lID0gZWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgaW5wdXRUeXBlID0gbm9kZU5hbWUgPT09ICdpbnB1dCcgJiYgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLnR5cGU7CiAgICAgICAgcmV0dXJuIGlucHV0VHlwZSA9PT0gJ3RleHQnCiAgICAgICAgICAgIHx8IGlucHV0VHlwZSA9PT0gJ3Bhc3N3b3JkJwogICAgICAgICAgICB8fCBub2RlTmFtZSA9PT0gJ3NlbGVjdCcKICAgICAgICAgICAgfHwgbm9kZU5hbWUgPT09ICd0ZXh0YXJlYSc7CiAgICB9CiAgICAvKioKICAgICAqIEdldHMgd2hldGhlciBhbiBlbGVtZW50IGlzIHBvdGVudGlhbGx5IGZvY3VzYWJsZSB3aXRob3V0IHRha2luZyBjdXJyZW50IHZpc2libGUvZGlzYWJsZWQgc3RhdGUKICAgICAqIGludG8gYWNjb3VudC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNQb3RlbnRpYWxseUZvY3VzYWJsZShlbGVtZW50KSB7CiAgICAgICAgLy8gSW5wdXRzIGFyZSBwb3RlbnRpYWxseSBmb2N1c2FibGUgKnVubGVzcyogdGhleSdyZSB0eXBlPSJoaWRkZW4iLgogICAgICAgIGlmIChpc0hpZGRlbklucHV0KGVsZW1lbnQpKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlzTmF0aXZlRm9ybUVsZW1lbnQoZWxlbWVudCkgfHwKICAgICAgICAgICAgaXNBbmNob3JXaXRoSHJlZihlbGVtZW50KSB8fAogICAgICAgICAgICBlbGVtZW50Lmhhc0F0dHJpYnV0ZSgnY29udGVudGVkaXRhYmxlJykgfHwKICAgICAgICAgICAgaGFzVmFsaWRUYWJJbmRleChlbGVtZW50KTsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgcGFyZW50IHdpbmRvdyBvZiBhIERPTSBub2RlIHdpdGggcmVnYXJkcyBvZiBiZWluZyBpbnNpZGUgb2YgYW4gaWZyYW1lLgogICAgICogQHBhcmFtIHs/fSBub2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRXaW5kb3cobm9kZSkgewogICAgICAgIC8vIG93bmVyRG9jdW1lbnQgaXMgbnVsbCBpZiBgbm9kZWAgaXRzZWxmICppcyogYSBkb2N1bWVudC4KICAgICAgICByZXR1cm4gbm9kZS5vd25lckRvY3VtZW50ICYmIG5vZGUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldyB8fCB3aW5kb3c7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvZm9jdXMtdHJhcC9mb2N1cy10cmFwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ2xhc3MgdGhhdCBhbGxvd3MgZm9yIHRyYXBwaW5nIGZvY3VzIHdpdGhpbiBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoaXMgY2xhc3MgY3VycmVudGx5IHVzZXMgYSByZWxhdGl2ZWx5IHNpbXBsZSBhcHByb2FjaCB0byBmb2N1cyB0cmFwcGluZy4KICAgICAqIEl0IGFzc3VtZXMgdGhhdCB0aGUgdGFiIG9yZGVyIGlzIHRoZSBzYW1lIGFzIERPTSBvcmRlciwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUuCiAgICAgKiBUaGluZ3MgbGlrZSBgdGFiSW5kZXggPiAwYCwgZmxleCBgb3JkZXJgLCBhbmQgc2hhZG93IHJvb3RzIGNhbiBjYXVzZSB0byB0d28gdG8gbWlzYWxpZ24uCiAgICAgKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGBDb25maWd1cmFibGVGb2N1c1RyYXBgIGluc3RlYWQuCiAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSBmb3IgMTEuMC4wIFJlbW92ZSB0aGlzIGNsYXNzLgogICAgICovCiAgICBjbGFzcyBGb2N1c1RyYXAgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGVja2VyCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBkZWZlckFuY2hvcnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX2NoZWNrZXIsIF9uZ1pvbmUsIF9kb2N1bWVudCwgZGVmZXJBbmNob3JzID0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudCA9IF9lbGVtZW50OwogICAgICAgICAgICB0aGlzLl9jaGVja2VyID0gX2NoZWNrZXI7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgICAgICB0aGlzLl9oYXNBdHRhY2hlZCA9IGZhbHNlOwogICAgICAgICAgICAvLyBFdmVudCBsaXN0ZW5lcnMgZm9yIHRoZSBhbmNob3JzLiBOZWVkIHRvIGJlIHJlZ3VsYXIgZnVuY3Rpb25zIHNvIHRoYXQgd2UgY2FuIHVuYmluZCB0aGVtIGxhdGVyLgogICAgICAgICAgICB0aGlzLnN0YXJ0QW5jaG9yTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLmZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudCgpKTsKICAgICAgICAgICAgdGhpcy5lbmRBbmNob3JMaXN0ZW5lciA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuZm9jdXNGaXJzdFRhYmJhYmxlRWxlbWVudCgpKTsKICAgICAgICAgICAgdGhpcy5fZW5hYmxlZCA9IHRydWU7CiAgICAgICAgICAgIGlmICghZGVmZXJBbmNob3JzKSB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaEFuY2hvcnMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBmb2N1cyB0cmFwIGlzIGFjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBlbmFibGVkKCkgeyByZXR1cm4gdGhpcy5fZW5hYmxlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBlbmFibGVkKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2VuYWJsZWQgPSB2YWx1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXJ0QW5jaG9yICYmIHRoaXMuX2VuZEFuY2hvcikgewogICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQW5jaG9yVGFiSW5kZXgodmFsdWUsIHRoaXMuX3N0YXJ0QW5jaG9yKTsKICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUFuY2hvclRhYkluZGV4KHZhbHVlLCB0aGlzLl9lbmRBbmNob3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERlc3Ryb3lzIHRoZSBmb2N1cyB0cmFwIGJ5IGNsZWFuaW5nIHVwIHRoZSBhbmNob3JzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVzdHJveSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFydEFuY2hvciA9IHRoaXMuX3N0YXJ0QW5jaG9yOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZEFuY2hvciA9IHRoaXMuX2VuZEFuY2hvcjsKICAgICAgICAgICAgaWYgKHN0YXJ0QW5jaG9yKSB7CiAgICAgICAgICAgICAgICBzdGFydEFuY2hvci5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICBpZiAoc3RhcnRBbmNob3IucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgICAgIHN0YXJ0QW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoc3RhcnRBbmNob3IpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChlbmRBbmNob3IpIHsKICAgICAgICAgICAgICAgIGVuZEFuY2hvci5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZW5kQW5jaG9yTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgaWYgKGVuZEFuY2hvci5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgZW5kQW5jaG9yLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZW5kQW5jaG9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zdGFydEFuY2hvciA9IHRoaXMuX2VuZEFuY2hvciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEluc2VydHMgdGhlIGFuY2hvcnMgaW50byB0aGUgRE9NLiBUaGlzIGlzIHVzdWFsbHkgZG9uZSBhdXRvbWF0aWNhbGx5CiAgICAgICAgICogaW4gdGhlIGNvbnN0cnVjdG9yLCBidXQgY2FuIGJlIGRlZmVycmVkIGZvciBjYXNlcyBsaWtlIGRpcmVjdGl2ZXMgd2l0aCBgKm5nSWZgLgogICAgICAgICAqIEByZXR1cm4gez99IFdoZXRoZXIgdGhlIGZvY3VzIHRyYXAgbWFuYWdlZCB0byBhdHRhY2ggc3VjY2Vzc2Z1bHkuIFRoaXMgbWF5IG5vdCBiZSB0aGUgY2FzZQogICAgICAgICAqIGlmIHRoZSB0YXJnZXQgZWxlbWVudCBpc24ndCBjdXJyZW50bHkgaW4gdGhlIERPTS4KICAgICAgICAgKi8KICAgICAgICBhdHRhY2hBbmNob3JzKCkgewogICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3Qgb24gdGhlIGJyb3dzZXIsIHRoZXJlIGNhbiBiZSBubyBmb2N1cyB0byB0cmFwLgogICAgICAgICAgICBpZiAodGhpcy5faGFzQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3N0YXJ0QW5jaG9yKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RhcnRBbmNob3IgPSB0aGlzLl9jcmVhdGVBbmNob3IoKTsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fc3RhcnRBbmNob3IpKS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuc3RhcnRBbmNob3JMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2VuZEFuY2hvcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2VuZEFuY2hvciA9IHRoaXMuX2NyZWF0ZUFuY2hvcigpOwogICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbmRBbmNob3IpKS5hZGRFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuZW5kQW5jaG9yTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50LnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N0YXJ0QW5jaG9yKSksIHRoaXMuX2VsZW1lbnQpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5wYXJlbnROb2RlLmluc2VydEJlZm9yZSgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZW5kQW5jaG9yKSksIHRoaXMuX2VsZW1lbnQubmV4dFNpYmxpbmcpOwogICAgICAgICAgICAgICAgdGhpcy5faGFzQXR0YWNoZWQgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNBdHRhY2hlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2FpdHMgZm9yIHRoZSB6b25lIHRvIHN0YWJpbGl6ZSwgdGhlbiBlaXRoZXIgZm9jdXNlcyB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IHRoZQogICAgICAgICAqIHVzZXIgc3BlY2lmaWVkLCBvciB0aGUgZmlyc3QgdGFiYmFibGUgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBib29sZWFuLCBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB3aGV0aGVyIGZvY3VzIHdhcyBtb3ZlZCBzdWNjZXNzZnVseS4KICAgICAgICAgKi8KICAgICAgICBmb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlc29sdmUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlc29sdmUgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fZXhlY3V0ZU9uU3RhYmxlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHJlc29sdmUodGhpcy5mb2N1c0luaXRpYWxFbGVtZW50KCkpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2FpdHMgZm9yIHRoZSB6b25lIHRvIHN0YWJpbGl6ZSwgdGhlbiBmb2N1c2VzCiAgICAgICAgICogdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQgd2l0aGluIHRoZSBmb2N1cyB0cmFwIHJlZ2lvbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBSZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggYSBib29sZWFuLCBkZXBlbmRpbmcKICAgICAgICAgKiBvbiB3aGV0aGVyIGZvY3VzIHdhcyBtb3ZlZCBzdWNjZXNzZnVseS4KICAgICAgICAgKi8KICAgICAgICBmb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50V2hlblJlYWR5KCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlc29sdmUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJlc29sdmUgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fZXhlY3V0ZU9uU3RhYmxlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHJlc29sdmUodGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KCkpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2FpdHMgZm9yIHRoZSB6b25lIHRvIHN0YWJpbGl6ZSwgdGhlbiBmb2N1c2VzCiAgICAgICAgICogdGhlIGxhc3QgdGFiYmFibGUgZWxlbWVudCB3aXRoaW4gdGhlIGZvY3VzIHRyYXAgcmVnaW9uLgogICAgICAgICAqIEByZXR1cm4gez99IFJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCBhIGJvb2xlYW4sIGRlcGVuZGluZwogICAgICAgICAqIG9uIHdoZXRoZXIgZm9jdXMgd2FzIG1vdmVkIHN1Y2Nlc3NmdWx5LgogICAgICAgICAqLwogICAgICAgIGZvY3VzTGFzdFRhYmJhYmxlRWxlbWVudFdoZW5SZWFkeSgpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZXNvbHZlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICByZXNvbHZlID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2V4ZWN1dGVPblN0YWJsZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiByZXNvbHZlKHRoaXMuZm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KCkpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBzcGVjaWZpZWQgYm91bmRhcnkgZWxlbWVudCBvZiB0aGUgdHJhcHBlZCByZWdpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGJvdW5kIFRoZSBib3VuZGFyeSB0byBnZXQgKHN0YXJ0IG9yIGVuZCBvZiB0cmFwcGVkIHJlZ2lvbikuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIGJvdW5kYXJ5IGVsZW1lbnQuCiAgICAgICAgICovCiAgICAgICAgX2dldFJlZ2lvbkJvdW5kYXJ5KGJvdW5kKSB7CiAgICAgICAgICAgIC8vIENvbnRhaW5zIHRoZSBkZXByZWNhdGVkIHZlcnNpb24gb2Ygc2VsZWN0b3IsIGZvciB0ZW1wb3JhcnkgYmFja3dhcmRzIGNvbXBhcmFiaWxpdHkuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG1hcmtlcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGBbY2RrLWZvY3VzLXJlZ2lvbi0ke2JvdW5kfV0sIGAgKwogICAgICAgICAgICAgICAgYFtjZGtGb2N1c1JlZ2lvbiR7Ym91bmR9XSwgYCArCiAgICAgICAgICAgICAgICBgW2Nkay1mb2N1cy0ke2JvdW5kfV1gKSkpOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1hcmtlcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAgICAgICAgICAgIGlmIChtYXJrZXJzW2ldLmhhc0F0dHJpYnV0ZShgY2RrLWZvY3VzLSR7Ym91bmR9YCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLSR7Ym91bmR9JywgYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGB1c2UgJ2Nka0ZvY3VzUmVnaW9uJHtib3VuZH0nIGluc3RlYWQuIFRoZSBkZXByZWNhdGVkIGAgKwogICAgICAgICAgICAgICAgICAgICAgICBgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBpbiA4LjAuMC5gLCBtYXJrZXJzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1hcmtlcnNbaV0uaGFzQXR0cmlidXRlKGBjZGstZm9jdXMtcmVnaW9uLSR7Ym91bmR9YCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEZvdW5kIHVzZSBvZiBkZXByZWNhdGVkIGF0dHJpYnV0ZSAnY2RrLWZvY3VzLXJlZ2lvbi0ke2JvdW5kfScsIGAgKwogICAgICAgICAgICAgICAgICAgICAgICBgdXNlICdjZGtGb2N1c1JlZ2lvbiR7Ym91bmR9JyBpbnN0ZWFkLiBUaGUgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGB3aWxsIGJlIHJlbW92ZWQgaW4gOC4wLjAuYCwgbWFya2Vyc1tpXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJvdW5kID09ICdzdGFydCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiBtYXJrZXJzLmxlbmd0aCA/IG1hcmtlcnNbMF0gOiB0aGlzLl9nZXRGaXJzdFRhYmJhYmxlRWxlbWVudCh0aGlzLl9lbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbWFya2Vycy5sZW5ndGggPwogICAgICAgICAgICAgICAgbWFya2Vyc1ttYXJrZXJzLmxlbmd0aCAtIDFdIDogdGhpcy5fZ2V0TGFzdFRhYmJhYmxlRWxlbWVudCh0aGlzLl9lbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyB0aGUgZWxlbWVudCB0aGF0IHNob3VsZCBiZSBmb2N1c2VkIHdoZW4gdGhlIGZvY3VzIHRyYXAgaXMgaW5pdGlhbGl6ZWQuCiAgICAgICAgICogQHJldHVybiB7P30gV2hldGhlciBmb2N1cyB3YXMgbW92ZWQgc3VjY2Vzc2Z1bHkuCiAgICAgICAgICovCiAgICAgICAgZm9jdXNJbml0aWFsRWxlbWVudCgpIHsKICAgICAgICAgICAgLy8gQ29udGFpbnMgdGhlIGRlcHJlY2F0ZWQgdmVyc2lvbiBvZiBzZWxlY3RvciwgZm9yIHRlbXBvcmFyeSBiYWNrd2FyZHMgY29tcGFyYWJpbGl0eS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWRpcmVjdFRvRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYFtjZGstZm9jdXMtaW5pdGlhbF0sIGAgKwogICAgICAgICAgICAgICAgYFtjZGtGb2N1c0luaXRpYWxdYCkpKTsKICAgICAgICAgICAgaWYgKHJlZGlyZWN0VG9FbGVtZW50KSB7CiAgICAgICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAgICAgICAgICAgICAgICBpZiAocmVkaXJlY3RUb0VsZW1lbnQuaGFzQXR0cmlidXRlKGBjZGstZm9jdXMtaW5pdGlhbGApKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGBGb3VuZCB1c2Ugb2YgZGVwcmVjYXRlZCBhdHRyaWJ1dGUgJ2Nkay1mb2N1cy1pbml0aWFsJywgYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGB1c2UgJ2Nka0ZvY3VzSW5pdGlhbCcgaW5zdGVhZC4gVGhlIGRlcHJlY2F0ZWQgYXR0cmlidXRlIGAgKwogICAgICAgICAgICAgICAgICAgICAgICBgd2lsbCBiZSByZW1vdmVkIGluIDguMC4wYCwgcmVkaXJlY3RUb0VsZW1lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gV2FybiB0aGUgY29uc3VtZXIgaWYgdGhlIGVsZW1lbnQgdGhleSd2ZSBwb2ludGVkIHRvCiAgICAgICAgICAgICAgICAvLyBpc24ndCBmb2N1c2FibGUsIHdoZW4gbm90IGluIHByb2R1Y3Rpb24gbW9kZS4KICAgICAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiAhdGhpcy5fY2hlY2tlci5pc0ZvY3VzYWJsZShyZWRpcmVjdFRvRWxlbWVudCkpIHsKICAgICAgICAgICAgICAgICAgICBjb25zb2xlLndhcm4oYEVsZW1lbnQgbWF0Y2hpbmcgJ1tjZGtGb2N1c0luaXRpYWxdJyBpcyBub3QgZm9jdXNhYmxlLmAsIHJlZGlyZWN0VG9FbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJlZGlyZWN0VG9FbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgdGhlIGZpcnN0IHRhYmJhYmxlIGVsZW1lbnQgd2l0aGluIHRoZSBmb2N1cyB0cmFwIHJlZ2lvbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIGZvY3VzIHdhcyBtb3ZlZCBzdWNjZXNzZnVseS4KICAgICAgICAgKi8KICAgICAgICBmb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VG9FbGVtZW50ID0gdGhpcy5fZ2V0UmVnaW9uQm91bmRhcnkoJ3N0YXJ0Jyk7CiAgICAgICAgICAgIGlmIChyZWRpcmVjdFRvRWxlbWVudCkgewogICAgICAgICAgICAgICAgcmVkaXJlY3RUb0VsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gISFyZWRpcmVjdFRvRWxlbWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyB0aGUgbGFzdCB0YWJiYWJsZSBlbGVtZW50IHdpdGhpbiB0aGUgZm9jdXMgdHJhcCByZWdpb24uCiAgICAgICAgICogQHJldHVybiB7P30gV2hldGhlciBmb2N1cyB3YXMgbW92ZWQgc3VjY2Vzc2Z1bHkuCiAgICAgICAgICovCiAgICAgICAgZm9jdXNMYXN0VGFiYmFibGVFbGVtZW50KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlZGlyZWN0VG9FbGVtZW50ID0gdGhpcy5fZ2V0UmVnaW9uQm91bmRhcnkoJ2VuZCcpOwogICAgICAgICAgICBpZiAocmVkaXJlY3RUb0VsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHJlZGlyZWN0VG9FbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICEhcmVkaXJlY3RUb0VsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBmb2N1cyB0cmFwIGhhcyBzdWNjZXNzZnVseSBiZWVuIGF0dGFjaGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFzQXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9oYXNBdHRhY2hlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBmaXJzdCB0YWJiYWJsZSBlbGVtZW50IGZyb20gYSBET00gc3VidHJlZSAoaW5jbHVzaXZlKS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcm9vdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEZpcnN0VGFiYmFibGVFbGVtZW50KHJvb3QpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NoZWNrZXIuaXNGb2N1c2FibGUocm9vdCkgJiYgdGhpcy5fY2hlY2tlci5pc1RhYmJhYmxlKHJvb3QpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gcm9vdDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJdGVyYXRlIGluIERPTSBvcmRlci4gTm90ZSB0aGF0IElFIGRvZXNuJ3QgaGF2ZSBgY2hpbGRyZW5gIGZvciBTVkcgc28gd2UgZmFsbAogICAgICAgICAgICAvLyBiYWNrIHRvIGBjaGlsZE5vZGVzYCB3aGljaCBpbmNsdWRlcyB0ZXh0IG5vZGVzLCBjb21tZW50cyBldGMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNoaWxkcmVuID0gcm9vdC5jaGlsZHJlbiB8fCByb290LmNoaWxkTm9kZXM7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCB0YWJiYWJsZUNoaWxkID0gY2hpbGRyZW5baV0ubm9kZVR5cGUgPT09IHRoaXMuX2RvY3VtZW50LkVMRU1FTlRfTk9ERSA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0Rmlyc3RUYWJiYWJsZUVsZW1lbnQoKC8qKiBAdHlwZSB7P30gKi8gKGNoaWxkcmVuW2ldKSkpIDoKICAgICAgICAgICAgICAgICAgICBudWxsOwogICAgICAgICAgICAgICAgaWYgKHRhYmJhYmxlQ2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiYmFibGVDaGlsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBsYXN0IHRhYmJhYmxlIGVsZW1lbnQgZnJvbSBhIERPTSBzdWJ0cmVlIChpbmNsdXNpdmUpLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSByb290CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0TGFzdFRhYmJhYmxlRWxlbWVudChyb290KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jaGVja2VyLmlzRm9jdXNhYmxlKHJvb3QpICYmIHRoaXMuX2NoZWNrZXIuaXNUYWJiYWJsZShyb290KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHJvb3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSXRlcmF0ZSBpbiByZXZlcnNlIERPTSBvcmRlci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY2hpbGRyZW4gPSByb290LmNoaWxkcmVuIHx8IHJvb3QuY2hpbGROb2RlczsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IGNoaWxkcmVuLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgdGFiYmFibGVDaGlsZCA9IGNoaWxkcmVuW2ldLm5vZGVUeXBlID09PSB0aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREUgPwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2dldExhc3RUYWJiYWJsZUVsZW1lbnQoKC8qKiBAdHlwZSB7P30gKi8gKGNoaWxkcmVuW2ldKSkpIDoKICAgICAgICAgICAgICAgICAgICBudWxsOwogICAgICAgICAgICAgICAgaWYgKHRhYmJhYmxlQ2hpbGQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFiYmFibGVDaGlsZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBhbmNob3IgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUFuY2hvcigpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmNob3IgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQW5jaG9yVGFiSW5kZXgodGhpcy5fZW5hYmxlZCwgYW5jaG9yKTsKICAgICAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5hZGQoJ2Nkay12aXN1YWxseS1oaWRkZW4nKTsKICAgICAgICAgICAgYW5jaG9yLmNsYXNzTGlzdC5hZGQoJ2Nkay1mb2N1cy10cmFwLWFuY2hvcicpOwogICAgICAgICAgICBhbmNob3Iuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgIHJldHVybiBhbmNob3I7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRvZ2dsZXMgdGhlIGB0YWJpbmRleGAgb2YgYW4gYW5jaG9yLCBiYXNlZCBvbiB0aGUgZW5hYmxlZCBzdGF0ZSBvZiB0aGUgZm9jdXMgdHJhcC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaXNFbmFibGVkIFdoZXRoZXIgdGhlIGZvY3VzIHRyYXAgaXMgZW5hYmxlZC4KICAgICAgICAgKiBAcGFyYW0gez99IGFuY2hvciBBbmNob3Igb24gd2hpY2ggdG8gdG9nZ2xlIHRoZSB0YWJpbmRleC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF90b2dnbGVBbmNob3JUYWJJbmRleChpc0VuYWJsZWQsIGFuY2hvcikgewogICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRhYmluZGV4IGNvbXBsZXRlbHksIHJhdGhlciB0aGFuIHNldHRpbmcgaXQgdG8gLTEsIGJlY2F1c2UgaWYgdGhlCiAgICAgICAgICAgIC8vIGVsZW1lbnQgaGFzIGEgdGFiaW5kZXgsIHRoZSB1c2VyIG1pZ2h0IHN0aWxsIGhpdCBpdCB3aGVuIG5hdmlnYXRpbmcgd2l0aCB0aGUgYXJyb3cga2V5cy4KICAgICAgICAgICAgaXNFbmFibGVkID8gYW5jaG9yLnNldEF0dHJpYnV0ZSgndGFiaW5kZXgnLCAnMCcpIDogYW5jaG9yLnJlbW92ZUF0dHJpYnV0ZSgndGFiaW5kZXgnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVG9nZ2xlcyB0aGVgdGFiaW5kZXhgIG9mIGJvdGggYW5jaG9ycyB0byBlaXRoZXIgdHJhcCBUYWIgZm9jdXMgb3IgYWxsb3cgaXQgdG8gZXNjYXBlLgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcGFyYW0gez99IGVuYWJsZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvZ2dsZUFuY2hvcnMoZW5hYmxlZCkgewogICAgICAgICAgICBpZiAodGhpcy5fc3RhcnRBbmNob3IgJiYgdGhpcy5fZW5kQW5jaG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleChlbmFibGVkLCB0aGlzLl9zdGFydEFuY2hvcik7CiAgICAgICAgICAgICAgICB0aGlzLl90b2dnbGVBbmNob3JUYWJJbmRleChlbmFibGVkLCB0aGlzLl9lbmRBbmNob3IpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEV4ZWN1dGVzIGEgZnVuY3Rpb24gd2hlbiB0aGUgem9uZSBpcyBzdGFibGUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZXhlY3V0ZU9uU3RhYmxlKGZuKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9uZ1pvbmUuaXNTdGFibGUpIHsKICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoZm4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBGYWN0b3J5IHRoYXQgYWxsb3dzIGVhc3kgaW5zdGFudGlhdGlvbiBvZiBmb2N1cyB0cmFwcy4KICAgICAqIEBkZXByZWNhdGVkIFVzZSBgQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeWAgaW5zdGVhZC4KICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIGZvciAxMS4wLjAgUmVtb3ZlIHRoaXMgY2xhc3MuCiAgICAgKi8KICAgIGNsYXNzIEZvY3VzVHJhcEZhY3RvcnkgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2NoZWNrZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9jaGVja2VyLCBfbmdab25lLCBfZG9jdW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fY2hlY2tlciA9IF9jaGVja2VyOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZvY3VzLXRyYXBwZWQgcmVnaW9uIGFyb3VuZCB0aGUgZ2l2ZW4gZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgVGhlIGVsZW1lbnQgYXJvdW5kIHdoaWNoIGZvY3VzIHdpbGwgYmUgdHJhcHBlZC4KICAgICAgICAgKiBAcGFyYW0gez89fSBkZWZlckNhcHR1cmVFbGVtZW50cyBEZWZlcnMgdGhlIGNyZWF0aW9uIG9mIGZvY3VzLWNhcHR1cmluZyBlbGVtZW50cyB0byBiZSBkb25lCiAgICAgICAgICogICAgIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLgogICAgICAgICAqIEByZXR1cm4gez99IFRoZSBjcmVhdGVkIGZvY3VzIHRyYXAgaW5zdGFuY2UuCiAgICAgICAgICovCiAgICAgICAgY3JlYXRlKGVsZW1lbnQsIGRlZmVyQ2FwdHVyZUVsZW1lbnRzID0gZmFsc2UpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBGb2N1c1RyYXAoZWxlbWVudCwgdGhpcy5fY2hlY2tlciwgdGhpcy5fbmdab25lLCB0aGlzLl9kb2N1bWVudCwgZGVmZXJDYXB0dXJlRWxlbWVudHMpOwogICAgICAgIH0KICAgIH0KICAgIEZvY3VzVHJhcEZhY3RvcnkuybVmYWMgPSBmdW5jdGlvbiBGb2N1c1RyYXBGYWN0b3J5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvY3VzVHJhcEZhY3RvcnkpKMm1ybVpbmplY3QoSW50ZXJhY3Rpdml0eUNoZWNrZXIpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBGb2N1c1RyYXBGYWN0b3J5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSW50ZXJhY3Rpdml0eUNoZWNrZXIgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBGb2N1c1RyYXBGYWN0b3J5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRm9jdXNUcmFwRmFjdG9yeV9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEZvY3VzVHJhcEZhY3RvcnkoybXJtWluamVjdChJbnRlcmFjdGl2aXR5Q2hlY2tlciksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChET0NVTUVOVCQxKSk7IH0sIHRva2VuOiBGb2N1c1RyYXBGYWN0b3J5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIERpcmVjdGl2ZSBmb3IgdHJhcHBpbmcgZm9jdXMgd2l0aGluIGEgcmVnaW9uLgogICAgICovCiAgICBjbGFzcyBDZGtUcmFwRm9jdXMgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9mb2N1c1RyYXBGYWN0b3J5CiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX2ZvY3VzVHJhcEZhY3RvcnksIF9kb2N1bWVudCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVHJhcEZhY3RvcnkgPSBfZm9jdXNUcmFwRmFjdG9yeTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFByZXZpb3VzbHkgZm9jdXNlZCBlbGVtZW50IHRvIHJlc3RvcmUgZm9jdXMgdG8gdXBvbiBkZXN0cm95IHdoZW4gdXNpbmcgYXV0b0NhcHR1cmUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAgPSB0aGlzLl9mb2N1c1RyYXBGYWN0b3J5LmNyZWF0ZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRydWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBmb2N1cyB0cmFwIGlzIGFjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBlbmFibGVkKCkgeyByZXR1cm4gdGhpcy5mb2N1c1RyYXAuZW5hYmxlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBlbmFibGVkKHZhbHVlKSB7IHRoaXMuZm9jdXNUcmFwLmVuYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgZGlyZWN0aXZlIHNob3VsZCBhdXRvbWF0aWFsbHkgbW92ZSBmb2N1cyBpbnRvIHRoZSB0cmFwcGVkIHJlZ2lvbiB1cG9uCiAgICAgICAgICogaW5pdGlhbGl6YXRpb24gYW5kIHJldHVybiBmb2N1cyB0byB0aGUgcHJldmlvdXMgYWN0aXZlRWxlbWVudCB1cG9uIGRlc3RydWN0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGF1dG9DYXB0dXJlKCkgeyByZXR1cm4gdGhpcy5fYXV0b0NhcHR1cmU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgYXV0b0NhcHR1cmUodmFsdWUpIHsgdGhpcy5fYXV0b0NhcHR1cmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAuZGVzdHJveSgpOwogICAgICAgICAgICAvLyBJZiB3ZSBzdG9yZWQgYSBwcmV2aW91c2x5IGZvY3VzZWQgZWxlbWVudCB3aGVuIHVzaW5nIGF1dG9DYXB0dXJlLCByZXR1cm4gZm9jdXMgdG8gdGhhdAogICAgICAgICAgICAvLyBlbGVtZW50IG5vdyB0aGF0IHRoZSB0cmFwcGVkIHJlZ2lvbiBpcyBiZWluZyBkZXN0cm95ZWQuCiAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2aW91c2x5Rm9jdXNlZEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzbHlGb2N1c2VkRWxlbWVudC5mb2N1cygpOwogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c1RyYXAuYXR0YWNoQW5jaG9ycygpOwogICAgICAgICAgICBpZiAodGhpcy5hdXRvQ2FwdHVyZSkgewogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNseUZvY3VzZWRFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNUcmFwLmZvY3VzSW5pdGlhbEVsZW1lbnRXaGVuUmVhZHkoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nRG9DaGVjaygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmZvY3VzVHJhcC5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmZvY3VzVHJhcC5hdHRhY2hBbmNob3JzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBDZGtUcmFwRm9jdXMuybVmYWMgPSBmdW5jdGlvbiBDZGtUcmFwRm9jdXNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrVHJhcEZvY3VzKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvY3VzVHJhcEZhY3RvcnkpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKICAgIENka1RyYXBGb2N1cy7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtUcmFwRm9jdXMsIHNlbGVjdG9yczogW1siIiwgImNka1RyYXBGb2N1cyIsICIiXV0sIGlucHV0czogeyBlbmFibGVkOiBbImNka1RyYXBGb2N1cyIsICJlbmFibGVkIl0sIGF1dG9DYXB0dXJlOiBbImNka1RyYXBGb2N1c0F1dG9DYXB0dXJlIiwgImF1dG9DYXB0dXJlIl0gfSwgZXhwb3J0QXM6IFsiY2RrVHJhcEZvY3VzIl0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka1RyYXBGb2N1cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IEZvY3VzVHJhcEZhY3RvcnkgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KICAgIF07CiAgICBDZGtUcmFwRm9jdXMucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZW5hYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrVHJhcEZvY3VzJyxdIH1dLAogICAgICAgIGF1dG9DYXB0dXJlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtUcmFwRm9jdXNBdXRvQ2FwdHVyZScsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9mb2N1cy10cmFwL2NvbmZpZ3VyYWJsZS1mb2N1cy10cmFwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ2xhc3MgdGhhdCBhbGxvd3MgZm9yIHRyYXBwaW5nIGZvY3VzIHdpdGhpbiBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoaXMgY2xhc3MgdXNlcyBhIHN0cmF0ZWd5IHBhdHRlcm4gdGhhdCBkZXRlcm1pbmVzIGhvdyBpdCB0cmFwcyBmb2N1cy4KICAgICAqIFNlZSBGb2N1c1RyYXBJbmVydFN0cmF0ZWd5LgogICAgICovCiAgICBjbGFzcyBDb25maWd1cmFibGVGb2N1c1RyYXAgZXh0ZW5kcyBGb2N1c1RyYXAgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGVja2VyCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IF9mb2N1c1RyYXBNYW5hZ2VyCiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5lcnRTdHJhdGVneQogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnQsIF9jaGVja2VyLCBfbmdab25lLCBfZG9jdW1lbnQsIF9mb2N1c1RyYXBNYW5hZ2VyLCBfaW5lcnRTdHJhdGVneSwgY29uZmlnKSB7CiAgICAgICAgICAgIHN1cGVyKF9lbGVtZW50LCBfY2hlY2tlciwgX25nWm9uZSwgX2RvY3VtZW50LCBjb25maWcuZGVmZXIpOwogICAgICAgICAgICB0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyID0gX2ZvY3VzVHJhcE1hbmFnZXI7CiAgICAgICAgICAgIHRoaXMuX2luZXJ0U3RyYXRlZ3kgPSBfaW5lcnRTdHJhdGVneTsKICAgICAgICAgICAgdGhpcy5fZm9jdXNUcmFwTWFuYWdlci5yZWdpc3Rlcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgRm9jdXNUcmFwIGlzIGVuYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZW5hYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2VuYWJsZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZW5hYmxlZCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9lbmFibGVkID0gdmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLl9lbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLnJlZ2lzdGVyKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNUcmFwTWFuYWdlci5kZXJlZ2lzdGVyKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE5vdGlmaWVzIHRoZSBGb2N1c1RyYXBNYW5hZ2VyIHRoYXQgdGhpcyBGb2N1c1RyYXAgd2lsbCBiZSBkZXN0cm95ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLmRlcmVnaXN0ZXIodGhpcyk7CiAgICAgICAgICAgIHN1cGVyLmRlc3Ryb3koKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUgSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYW5hZ2VkRm9jdXNUcmFwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2VuYWJsZSgpIHsKICAgICAgICAgICAgdGhpcy5faW5lcnRTdHJhdGVneS5wcmV2ZW50Rm9jdXModGhpcyk7CiAgICAgICAgICAgIHRoaXMudG9nZ2xlQW5jaG9ycyh0cnVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUgSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYW5hZ2VkRm9jdXNUcmFwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Rpc2FibGUoKSB7CiAgICAgICAgICAgIHRoaXMuX2luZXJ0U3RyYXRlZ3kuYWxsb3dGb2N1cyh0aGlzKTsKICAgICAgICAgICAgdGhpcy50b2dnbGVBbmNob3JzKGZhbHNlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvZm9jdXMtdHJhcC9wb2x5ZmlsbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogSUUgMTEgY29tcGF0aWJsZSBjbG9zZXN0IGltcGxlbWVudGF0aW9uIHRoYXQgaXMgYWJsZSB0byBzdGFydCBmcm9tIG5vbi1FbGVtZW50IE5vZGVzLgogICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgKiBAcGFyYW0gez99IHNlbGVjdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjbG9zZXN0KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICAgICAgaWYgKCEoZWxlbWVudCBpbnN0YW5jZW9mIE5vZGUpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGN1cnIgPSBlbGVtZW50OwogICAgICAgIHdoaWxlIChjdXJyICE9IG51bGwgJiYgIShjdXJyIGluc3RhbmNlb2YgRWxlbWVudCkpIHsKICAgICAgICAgICAgY3VyciA9IGN1cnIucGFyZW50Tm9kZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnIgJiYgKC8qKiBAdHlwZSB7P30gKi8gKChoYXNOYXRpdmVDbG9zZXN0ID8KICAgICAgICAgICAgY3Vyci5jbG9zZXN0KHNlbGVjdG9yKSA6IHBvbHlmaWxsQ2xvc2VzdChjdXJyLCBzZWxlY3RvcikpKSk7CiAgICB9CiAgICAvKioKICAgICAqIFBvbHlmaWxsIGZvciBicm93c2VycyB3aXRob3V0IEVsZW1lbnQuY2xvc2VzdC4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcG9seWZpbGxDbG9zZXN0KGVsZW1lbnQsIHNlbGVjdG9yKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBjdXJyID0gZWxlbWVudDsKICAgICAgICB3aGlsZSAoY3VyciAhPSBudWxsICYmICEoY3VyciBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgbWF0Y2hlcyhjdXJyLCBzZWxlY3RvcikpKSB7CiAgICAgICAgICAgIGN1cnIgPSBjdXJyLnBhcmVudE5vZGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKGN1cnIgfHwgbnVsbCkpKTsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGhhc05hdGl2ZUNsb3Nlc3QgPSB0eXBlb2YgRWxlbWVudCAhPSAndW5kZWZpbmVkJyAmJiAhIUVsZW1lbnQucHJvdG90eXBlLmNsb3Nlc3Q7CiAgICAvKioKICAgICAqIElFIDExIGNvbXBhdGlibGUgbWF0Y2hlcyBpbXBsZW1lbnRhdGlvbi4KICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICogQHBhcmFtIHs/fSBzZWxlY3RvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWF0Y2hlcyhlbGVtZW50LCBzZWxlY3RvcikgewogICAgICAgIHJldHVybiBlbGVtZW50Lm1hdGNoZXMgPwogICAgICAgICAgICBlbGVtZW50Lm1hdGNoZXMoc2VsZWN0b3IpIDoKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpWydtc01hdGNoZXNTZWxlY3RvciddKHNlbGVjdG9yKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9mb2N1cy10cmFwL2V2ZW50LWxpc3RlbmVyLWluZXJ0LXN0cmF0ZWd5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogTGlnaHR3ZWlnaHQgRm9jdXNUcmFwSW5lcnRTdHJhdGVneSB0aGF0IGFkZHMgYSBkb2N1bWVudCBmb2N1cyBldmVudAogICAgICogbGlzdGVuZXIgdG8gcmVkaXJlY3QgZm9jdXMgYmFjayBpbnNpZGUgdGhlIEZvY3VzVHJhcC4KICAgICAqLwogICAgY2xhc3MgRXZlbnRMaXN0ZW5lckZvY3VzVHJhcEluZXJ0U3RyYXRlZ3kgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRm9jdXMgZXZlbnQgaGFuZGxlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIGRvY3VtZW50IGV2ZW50IGxpc3RlbmVyIHRoYXQga2VlcHMgZm9jdXMgaW5zaWRlIHRoZSBGb2N1c1RyYXAuCiAgICAgICAgICogQHBhcmFtIHs/fSBmb2N1c1RyYXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByZXZlbnRGb2N1cyhmb2N1c1RyYXApIHsKICAgICAgICAgICAgLy8gRW5zdXJlIHRoZXJlJ3Mgb25seSBvbmUgbGlzdGVuZXIgcGVyIGRvY3VtZW50CiAgICAgICAgICAgIGlmICh0aGlzLl9saXN0ZW5lcikgewogICAgICAgICAgICAgICAgZm9jdXNUcmFwLl9kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsICgvKiogQHR5cGUgez99ICovICh0aGlzLl9saXN0ZW5lcikpLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9saXN0ZW5lciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZSkgPT4gdGhpcy5fdHJhcEZvY3VzKGZvY3VzVHJhcCwgZSkpOwogICAgICAgICAgICBmb2N1c1RyYXAuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBmb2N1c1RyYXAuX2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2xpc3RlbmVyKSksIHRydWUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgdGhlIGV2ZW50IGxpc3RlbmVyIGFkZGVkIGluIHByZXZlbnRGb2N1cy4KICAgICAgICAgKiBAcGFyYW0gez99IGZvY3VzVHJhcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWxsb3dGb2N1cyhmb2N1c1RyYXApIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9saXN0ZW5lcikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvY3VzVHJhcC5fZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZm9jdXMnLCAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fbGlzdGVuZXIpKSwgdHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVmb2N1c2VzIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBGb2N1c1RyYXAgaWYgdGhlIGZvY3VzIGV2ZW50IHRhcmdldCB3YXMgb3V0c2lkZQogICAgICAgICAqIHRoZSBGb2N1c1RyYXAuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGlzIGFuIGV2ZW50IGxpc3RlbmVyIGNhbGxiYWNrLiBUaGUgZXZlbnQgbGlzdGVuZXIgaXMgYWRkZWQgaW4gcnVuT3V0c2lkZUFuZ3VsYXIsCiAgICAgICAgICogc28gYWxsIHRoaXMgY29kZSBydW5zIG91dHNpZGUgQW5ndWxhciBhcyB3ZWxsLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBmb2N1c1RyYXAKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdHJhcEZvY3VzKGZvY3VzVHJhcCwgZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZm9jdXNUcmFwUm9vdCA9IGZvY3VzVHJhcC5fZWxlbWVudDsKICAgICAgICAgICAgLy8gRG9uJ3QgcmVmb2N1cyBpZiB0YXJnZXQgd2FzIGluIGFuIG92ZXJsYXksIGJlY2F1c2UgdGhlIG92ZXJsYXkgbWlnaHQgYmUgYXNzb2NpYXRlZAogICAgICAgICAgICAvLyB3aXRoIGFuIGVsZW1lbnQgaW5zaWRlIHRoZSBGb2N1c1RyYXAsIGV4LiBtYXQtc2VsZWN0LgogICAgICAgICAgICBpZiAoIWZvY3VzVHJhcFJvb3QuY29udGFpbnModGFyZ2V0KSAmJiBjbG9zZXN0KHRhcmdldCwgJ2Rpdi5jZGstb3ZlcmxheS1wYW5lJykgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8vIFNvbWUgbGVnYWN5IEZvY3VzVHJhcCB1c2FnZXMgaGF2ZSBsb2dpYyB0aGF0IGZvY3VzZXMgc29tZSBlbGVtZW50IG9uIHRoZSBwYWdlCiAgICAgICAgICAgICAgICAvLyBqdXN0IGJlZm9yZSBGb2N1c1RyYXAgaXMgZGVzdHJveWVkLiBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIHdhaXQKICAgICAgICAgICAgICAgIC8vIHRvIGJlIHN1cmUgRm9jdXNUcmFwIGlzIHN0aWxsIGVuYWJsZWQgYmVmb3JlIHJlZm9jdXNpbmcuCiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGZvY3VzIHdhc24ndCBwdXQgYmFjayBpbnRvIHRoZSBmb2N1cyB0cmFwIHdoaWxlIHRoZSB0aW1lb3V0IHdhcyBwZW5kaW5nLgogICAgICAgICAgICAgICAgICAgIGlmIChmb2N1c1RyYXAuZW5hYmxlZCAmJiAhZm9jdXNUcmFwUm9vdC5jb250YWlucyhmb2N1c1RyYXAuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvY3VzVHJhcC5mb2N1c0ZpcnN0VGFiYmFibGVFbGVtZW50KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLXRyYXAvY29uZmlndXJhYmxlLWZvY3VzLXRyYXAtY29uZmlnLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBjcmVhdGluZyBhIENvbmZpZ3VyYWJsZUZvY3VzVHJhcC4KICAgICAqLwogICAgY2xhc3MgQ29uZmlndXJhYmxlRm9jdXNUcmFwQ29uZmlnIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdG8gZGVmZXIgdGhlIGNyZWF0aW9uIG9mIEZvY3VzVHJhcCBlbGVtZW50cyB0byBiZQogICAgICAgICAgICAgKiBkb25lIG1hbnVhbGx5IGJ5IHRoZSB1c2VyLiBEZWZhdWx0IGlzIHRvIGNyZWF0ZSB0aGVtCiAgICAgICAgICAgICAqIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRlZmVyID0gZmFsc2U7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLXRyYXAvZm9jdXMtdHJhcC1pbmVydC1zdHJhdGVneS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRoZSBpbmplY3Rpb24gdG9rZW4gdXNlZCB0byBzcGVjaWZ5IHRoZSBpbmVydCBzdHJhdGVneS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBGT0NVU19UUkFQX0lORVJUX1NUUkFURUdZID0gbmV3IEluamVjdGlvblRva2VuKCdGT0NVU19UUkFQX0lORVJUX1NUUkFURUdZJyk7CiAgICAvKioKICAgICAqIEluamVjdGFibGUgdGhhdCBlbnN1cmVzIG9ubHkgdGhlIG1vc3QgcmVjZW50bHkgZW5hYmxlZCBGb2N1c1RyYXAgaXMgYWN0aXZlLgogICAgICovCiAgICBjbGFzcyBGb2N1c1RyYXBNYW5hZ2VyIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLy8gQSBzdGFjayBvZiB0aGUgRm9jdXNUcmFwcyBvbiB0aGUgcGFnZS4gT25seSB0aGUgRm9jdXNUcmFwIGF0IHRoZQogICAgICAgICAgICAvLyB0b3Agb2YgdGhlIHN0YWNrIGlzIGFjdGl2ZS4KICAgICAgICAgICAgdGhpcy5fZm9jdXNUcmFwU3RhY2sgPSBbXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGlzYWJsZXMgdGhlIEZvY3VzVHJhcCBhdCB0aGUgdG9wIG9mIHRoZSBzdGFjaywgYW5kIHRoZW4gcHVzaGVzCiAgICAgICAgICogdGhlIG5ldyBGb2N1c1RyYXAgb250byB0aGUgc3RhY2suCiAgICAgICAgICogQHBhcmFtIHs/fSBmb2N1c1RyYXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyKGZvY3VzVHJhcCkgewogICAgICAgICAgICAvLyBEZWR1cGUgZm9jdXNUcmFwcyB0aGF0IHJlZ2lzdGVyIG11bHRpcGxlIHRpbWVzLgogICAgICAgICAgICB0aGlzLl9mb2N1c1RyYXBTdGFjayA9IHRoaXMuX2ZvY3VzVHJhcFN0YWNrLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChmdCkgPT4gZnQgIT09IGZvY3VzVHJhcCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdGFjayA9IHRoaXMuX2ZvY3VzVHJhcFN0YWNrOwogICAgICAgICAgICBpZiAoc3RhY2subGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5fZGlzYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YWNrLnB1c2goZm9jdXNUcmFwKTsKICAgICAgICAgICAgZm9jdXNUcmFwLl9lbmFibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgRm9jdXNUcmFwIGZyb20gdGhlIHN0YWNrLCBhbmQgYWN0aXZhdGVzIHRoZQogICAgICAgICAqIEZvY3VzVHJhcCB0aGF0IGlzIHRoZSBuZXcgdG9wIG9mIHRoZSBzdGFjay4KICAgICAgICAgKiBAcGFyYW0gez99IGZvY3VzVHJhcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVyZWdpc3Rlcihmb2N1c1RyYXApIHsKICAgICAgICAgICAgZm9jdXNUcmFwLl9kaXNhYmxlKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhY2sgPSB0aGlzLl9mb2N1c1RyYXBTdGFjazsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpID0gc3RhY2suaW5kZXhPZihmb2N1c1RyYXApOwogICAgICAgICAgICBpZiAoaSAhPT0gLTEpIHsKICAgICAgICAgICAgICAgIHN0YWNrLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICAgIGlmIChzdGFjay5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICBzdGFja1tzdGFjay5sZW5ndGggLSAxXS5fZW5hYmxlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBGb2N1c1RyYXBNYW5hZ2VyLsm1ZmFjID0gZnVuY3Rpb24gRm9jdXNUcmFwTWFuYWdlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb2N1c1RyYXBNYW5hZ2VyKSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEZvY3VzVHJhcE1hbmFnZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBGb2N1c1RyYXBNYW5hZ2VyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgRm9jdXNUcmFwTWFuYWdlcigpOyB9LCB0b2tlbjogRm9jdXNUcmFwTWFuYWdlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9hMTF5L2ZvY3VzLXRyYXAvY29uZmlndXJhYmxlLWZvY3VzLXRyYXAtZmFjdG9yeS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEZhY3RvcnkgdGhhdCBhbGxvd3MgZWFzeSBpbnN0YW50aWF0aW9uIG9mIGNvbmZpZ3VyYWJsZSBmb2N1cyB0cmFwcy4KICAgICAqLwogICAgY2xhc3MgQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfY2hlY2tlcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzVHJhcE1hbmFnZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IF9pbmVydFN0cmF0ZWd5CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2NoZWNrZXIsIF9uZ1pvbmUsIF9mb2N1c1RyYXBNYW5hZ2VyLCBfZG9jdW1lbnQsIF9pbmVydFN0cmF0ZWd5KSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrZXIgPSBfY2hlY2tlcjsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgdGhpcy5fZm9jdXNUcmFwTWFuYWdlciA9IF9mb2N1c1RyYXBNYW5hZ2VyOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgICAgICAgICAgLy8gVE9ETyBzcGxpdCB1cCB0aGUgc3RyYXRlZ2llcyBpbnRvIGRpZmZlcmVudCBtb2R1bGVzLCBzaW1pbGFyIHRvIERhdGVBZGFwdGVyLgogICAgICAgICAgICB0aGlzLl9pbmVydFN0cmF0ZWd5ID0gX2luZXJ0U3RyYXRlZ3kgfHwgbmV3IEV2ZW50TGlzdGVuZXJGb2N1c1RyYXBJbmVydFN0cmF0ZWd5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlKGVsZW1lbnQsIGNvbmZpZyA9IG5ldyBDb25maWd1cmFibGVGb2N1c1RyYXBDb25maWcoKSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjb25maWdPYmplY3Q7CiAgICAgICAgICAgIGlmICh0eXBlb2YgY29uZmlnID09PSAnYm9vbGVhbicpIHsKICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdCA9IG5ldyBDb25maWd1cmFibGVGb2N1c1RyYXBDb25maWcoKTsKICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdC5kZWZlciA9IGNvbmZpZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbmZpZ09iamVjdCA9IGNvbmZpZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3IENvbmZpZ3VyYWJsZUZvY3VzVHJhcChlbGVtZW50LCB0aGlzLl9jaGVja2VyLCB0aGlzLl9uZ1pvbmUsIHRoaXMuX2RvY3VtZW50LCB0aGlzLl9mb2N1c1RyYXBNYW5hZ2VyLCB0aGlzLl9pbmVydFN0cmF0ZWd5LCBjb25maWdPYmplY3QpOwogICAgICAgIH0KICAgIH0KICAgIENvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkuybVmYWMgPSBmdW5jdGlvbiBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkpKMm1ybVpbmplY3QoSW50ZXJhY3Rpdml0eUNoZWNrZXIpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRm9jdXNUcmFwTWFuYWdlciksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoRk9DVVNfVFJBUF9JTkVSVF9TVFJBVEVHWSwgOCkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSW50ZXJhY3Rpdml0eUNoZWNrZXIgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogRm9jdXNUcmFwTWFuYWdlciB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtGT0NVU19UUkFQX0lORVJUX1NUUkFURUdZLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5Lsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gQ29uZmlndXJhYmxlRm9jdXNUcmFwRmFjdG9yeV9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IENvbmZpZ3VyYWJsZUZvY3VzVHJhcEZhY3RvcnkoybXJtWluamVjdChJbnRlcmFjdGl2aXR5Q2hlY2tlciksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChGb2N1c1RyYXBNYW5hZ2VyKSwgybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChGT0NVU19UUkFQX0lORVJUX1NUUkFURUdZLCA4KSk7IH0sIHRva2VuOiBDb25maWd1cmFibGVGb2N1c1RyYXBGYWN0b3J5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvbGl2ZS1hbm5vdW5jZXIvbGl2ZS1hbm5vdW5jZXItdG9rZW5zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2xpdmVBbm5vdW5jZXJFbGVtZW50JywgewogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiBMSVZFX0FOTk9VTkNFUl9FTEVNRU5UX1RPS0VOX0ZBQ1RPUlksCiAgICB9KTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU5fRkFDVE9SWSgpIHsKICAgICAgICByZXR1cm4gbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIHRoZSBMaXZlQW5ub3VuY2VyLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IExJVkVfQU5OT1VOQ0VSX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTElWRV9BTk5PVU5DRVJfREVGQVVMVF9PUFRJT05TJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvbGl2ZS1hbm5vdW5jZXIvbGl2ZS1hbm5vdW5jZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTGl2ZUFubm91bmNlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50VG9rZW4KICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IF9kZWZhdWx0T3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRUb2tlbiwgX25nWm9uZSwgX2RvY3VtZW50LCBfZGVmYXVsdE9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgdGhpcy5fZGVmYXVsdE9wdGlvbnMgPSBfZGVmYXVsdE9wdGlvbnM7CiAgICAgICAgICAgIC8vIFdlIGluamVjdCB0aGUgbGl2ZSBlbGVtZW50IGFuZCBkb2N1bWVudCBhcyBgYW55YCBiZWNhdXNlIHRoZSBjb25zdHJ1Y3RvciBzaWduYXR1cmUgY2Fubm90CiAgICAgICAgICAgIC8vIHJlZmVyZW5jZSBicm93c2VyIGdsb2JhbHMgKEhUTUxFbGVtZW50LCBEb2N1bWVudCkgb24gbm9uLWJyb3dzZXIgZW52aXJvbm1lbnRzLCBzaW5jZSBoYXZpbmcKICAgICAgICAgICAgLy8gYSBjbGFzcyBkZWNvcmF0b3IgY2F1c2VzIFR5cGVTY3JpcHQgdG8gcHJlc2VydmUgdGhlIGNvbnN0cnVjdG9yIHNpZ25hdHVyZSB0eXBlcy4KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX2xpdmVFbGVtZW50ID0gZWxlbWVudFRva2VuIHx8IHRoaXMuX2NyZWF0ZUxpdmVFbGVtZW50KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZQogICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYW5ub3VuY2UobWVzc2FnZSwgLi4uYXJncykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRlZmF1bHRPcHRpb25zID0gdGhpcy5fZGVmYXVsdE9wdGlvbnM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBvbGl0ZW5lc3M7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGR1cmF0aW9uOwogICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPT09IDEgJiYgdHlwZW9mIGFyZ3NbMF0gPT09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICBkdXJhdGlvbiA9IGFyZ3NbMF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBbcG9saXRlbmVzcywgZHVyYXRpb25dID0gYXJnczsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNsZWFyKCk7CiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9wcmV2aW91c1RpbWVvdXQpOwogICAgICAgICAgICBpZiAoIXBvbGl0ZW5lc3MpIHsKICAgICAgICAgICAgICAgIHBvbGl0ZW5lc3MgPQogICAgICAgICAgICAgICAgICAgIChkZWZhdWx0T3B0aW9ucyAmJiBkZWZhdWx0T3B0aW9ucy5wb2xpdGVuZXNzKSA/IGRlZmF1bHRPcHRpb25zLnBvbGl0ZW5lc3MgOiAncG9saXRlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZHVyYXRpb24gPT0gbnVsbCAmJiBkZWZhdWx0T3B0aW9ucykgewogICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkZWZhdWx0T3B0aW9ucy5kdXJhdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPOiBlbnN1cmUgY2hhbmdpbmcgdGhlIHBvbGl0ZW5lc3Mgd29ya3Mgb24gYWxsIGVudmlyb25tZW50cyB3ZSBzdXBwb3J0LgogICAgICAgICAgICB0aGlzLl9saXZlRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsIHBvbGl0ZW5lc3MpOwogICAgICAgICAgICAvLyBUaGlzIDEwMG1zIHRpbWVvdXQgaXMgbmVjZXNzYXJ5IGZvciBzb21lIGJyb3dzZXIgKyBzY3JlZW4tcmVhZGVyIGNvbWJpbmF0aW9uczoKICAgICAgICAgICAgLy8gLSBCb3RoIEpBV1MgYW5kIE5WREEgb3ZlciBJRTExIHdpbGwgbm90IGFubm91bmNlIGFueXRoaW5nIHdpdGhvdXQgYSBub24temVybyB0aW1lb3V0LgogICAgICAgICAgICAvLyAtIFdpdGggQ2hyb21lIGFuZCBJRTExIHdpdGggTlZEQSBvciBKQVdTLCBhIHJlcGVhdGVkIChpZGVudGljYWwpIG1lc3NhZ2Ugd29uJ3QgYmUgcmVhZCBhCiAgICAgICAgICAgIC8vICAgc2Vjb25kIHRpbWUgd2l0aG91dCBjbGVhcmluZyBhbmQgdGhlbiB1c2luZyBhIG5vbi16ZXJvIGRlbGF5LgogICAgICAgICAgICAvLyAodXNpbmcgSkFXUyAxNyBhdCB0aW1lIG9mIHRoaXMgd3JpdGluZykuCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVzb2x2ZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmVzb2x2ZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZXZpb3VzVGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50ID0gbWVzc2FnZTsKICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGR1cmF0aW9uID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNUaW1lb3V0ID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLmNsZWFyKCkpLCBkdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSwgMTAwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIGN1cnJlbnQgdGV4dCBmcm9tIHRoZSBhbm5vdW5jZXIgZWxlbWVudC4gQ2FuIGJlIHVzZWQgdG8gcHJldmVudAogICAgICAgICAqIHNjcmVlbiByZWFkZXJzIGZyb20gcmVhZGluZyB0aGUgdGV4dCBvdXQgYWdhaW4gd2hpbGUgdGhlIHVzZXIgaXMgZ29pbmcKICAgICAgICAgKiB0aHJvdWdoIHRoZSBwYWdlIGxhbmRtYXJrcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICBpZiAodGhpcy5fbGl2ZUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2xpdmVFbGVtZW50LnRleHRDb250ZW50ID0gJyc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3ByZXZpb3VzVGltZW91dCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9saXZlRWxlbWVudCAmJiB0aGlzLl9saXZlRWxlbWVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9saXZlRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2xpdmVFbGVtZW50KTsKICAgICAgICAgICAgICAgIHRoaXMuX2xpdmVFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUxpdmVFbGVtZW50KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRDbGFzcyA9ICdjZGstbGl2ZS1hbm5vdW5jZXItZWxlbWVudCc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNFbGVtZW50cyA9IHRoaXMuX2RvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZWxlbWVudENsYXNzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsaXZlRWwgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgLy8gUmVtb3ZlIGFueSBvbGQgY29udGFpbmVycy4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gY29taW5nIGluIGZyb20gYSBzZXJ2ZXItc2lkZS1yZW5kZXJlZCBwYWdlLgogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHByZXZpb3VzRWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChwcmV2aW91c0VsZW1lbnRzW2ldLnBhcmVudE5vZGUpKS5yZW1vdmVDaGlsZChwcmV2aW91c0VsZW1lbnRzW2ldKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsaXZlRWwuY2xhc3NMaXN0LmFkZChlbGVtZW50Q2xhc3MpOwogICAgICAgICAgICBsaXZlRWwuY2xhc3NMaXN0LmFkZCgnY2RrLXZpc3VhbGx5LWhpZGRlbicpOwogICAgICAgICAgICBsaXZlRWwuc2V0QXR0cmlidXRlKCdhcmlhLWF0b21pYycsICd0cnVlJyk7CiAgICAgICAgICAgIGxpdmVFbC5zZXRBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScsICdwb2xpdGUnKTsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChsaXZlRWwpOwogICAgICAgICAgICByZXR1cm4gbGl2ZUVsOwogICAgICAgIH0KICAgIH0KICAgIExpdmVBbm5vdW5jZXIuybVmYWMgPSBmdW5jdGlvbiBMaXZlQW5ub3VuY2VyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExpdmVBbm5vdW5jZXIpKMm1ybVpbmplY3QoTElWRV9BTk5PVU5DRVJfRUxFTUVOVF9UT0tFTiwgOCksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChMSVZFX0FOTk9VTkNFUl9ERUZBVUxUX09QVElPTlMsIDgpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTGl2ZUFubm91bmNlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMSVZFX0FOTk9VTkNFUl9FTEVNRU5UX1RPS0VOLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMSVZFX0FOTk9VTkNFUl9ERUZBVUxUX09QVElPTlMsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIExpdmVBbm5vdW5jZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBMaXZlQW5ub3VuY2VyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgTGl2ZUFubm91bmNlcijJtcm1aW5qZWN0KExJVkVfQU5OT1VOQ0VSX0VMRU1FTlRfVE9LRU4sIDgpLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoTElWRV9BTk5PVU5DRVJfREVGQVVMVF9PUFRJT05TLCA4KSk7IH0sIHRva2VuOiBMaXZlQW5ub3VuY2VyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIEEgZGlyZWN0aXZlIHRoYXQgd29ya3Mgc2ltaWxhcmx5IHRvIGFyaWEtbGl2ZSwgYnV0IHVzZXMgdGhlIExpdmVBbm5vdW5jZXIgdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkKICAgICAqIHdpdGggYSB3aWRlciByYW5nZSBvZiBicm93c2VycyBhbmQgc2NyZWVuIHJlYWRlcnMuCiAgICAgKi8KICAgIGNsYXNzIENka0FyaWFMaXZlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfbGl2ZUFubm91bmNlcgogICAgICAgICAqIEBwYXJhbSB7P30gX2NvbnRlbnRPYnNlcnZlcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfbGl2ZUFubm91bmNlciwgX2NvbnRlbnRPYnNlcnZlciwgX25nWm9uZSkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2xpdmVBbm5vdW5jZXIgPSBfbGl2ZUFubm91bmNlcjsKICAgICAgICAgICAgdGhpcy5fY29udGVudE9ic2VydmVyID0gX2NvbnRlbnRPYnNlcnZlcjsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgdGhpcy5fcG9saXRlbmVzcyA9ICdvZmYnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXJpYS1saXZlIHBvbGl0ZW5lc3MgbGV2ZWwgdG8gdXNlIHdoZW4gYW5ub3VuY2luZyBtZXNzYWdlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwb2xpdGVuZXNzKCkgeyByZXR1cm4gdGhpcy5fcG9saXRlbmVzczsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBwb2xpdGVuZXNzKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3BvbGl0ZW5lc3MgPSB2YWx1ZSA9PT0gJ3BvbGl0ZScgfHwgdmFsdWUgPT09ICdhc3NlcnRpdmUnID8gdmFsdWUgOiAnb2ZmJzsKICAgICAgICAgICAgaWYgKHRoaXMuX3BvbGl0ZW5lc3MgPT09ICdvZmYnKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghdGhpcy5fc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24gPSB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50T2JzZXJ2ZXIKICAgICAgICAgICAgICAgICAgICAgICAgLm9ic2VydmUodGhpcy5fZWxlbWVudFJlZikKICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSB1c2UgdGV4dENvbnRlbnQgaGVyZSwgcmF0aGVyIHRoYW4gaW5uZXJUZXh0LCBpbiBvcmRlciB0byBhdm9pZCBhIHJlZmxvdy4KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlbGVtZW50VGV4dCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC50ZXh0Q29udGVudDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGBNdXRhdGlvbk9ic2VydmVyYCBmaXJlcyBhbHNvIGZvciBhdHRyaWJ1dGUKICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlcyB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGFubm91bmNlLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAoZWxlbWVudFRleHQgIT09IHRoaXMuX3ByZXZpb3VzQW5ub3VuY2VkVGV4dCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGl2ZUFubm91bmNlci5hbm5vdW5jZShlbGVtZW50VGV4dCwgdGhpcy5fcG9saXRlbmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0Fubm91bmNlZFRleHQgPSBlbGVtZW50VGV4dDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fc3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIENka0FyaWFMaXZlLsm1ZmFjID0gZnVuY3Rpb24gQ2RrQXJpYUxpdmVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrQXJpYUxpdmUpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTGl2ZUFubm91bmNlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ29udGVudE9ic2VydmVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpKTsgfTsKICAgIENka0FyaWFMaXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0FyaWFMaXZlLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtBcmlhTGl2ZSIsICIiXV0sIGlucHV0czogeyBwb2xpdGVuZXNzOiBbImNka0FyaWFMaXZlIiwgInBvbGl0ZW5lc3MiXSB9LCBleHBvcnRBczogWyJjZGtBcmlhTGl2ZSJdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtBcmlhTGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IExpdmVBbm5vdW5jZXIgfSwKICAgICAgICB7IHR5cGU6IENvbnRlbnRPYnNlcnZlciB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0KICAgIF07CiAgICBDZGtBcmlhTGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBwb2xpdGVuZXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtBcmlhTGl2ZScsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9mYWtlLW1vdXNlZG93bi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogU2NyZWVucmVhZGVycyB3aWxsIG9mdGVuIGZpcmUgZmFrZSBtb3VzZWRvd24gZXZlbnRzIHdoZW4gYSBmb2N1c2FibGUgZWxlbWVudAogICAgICogaXMgYWN0aXZhdGVkIHVzaW5nIHRoZSBrZXlib2FyZC4gV2UgY2FuIHR5cGljYWxseSBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZXNlIGZha2VkCiAgICAgKiBtb3VzZWRvd24gZXZlbnRzIGFuZCByZWFsIG1vdXNlZG93biBldmVudHMgdXNpbmcgdGhlICJidXR0b25zIiBwcm9wZXJ0eS4gV2hpbGUKICAgICAqIHJlYWwgbW91c2Vkb3ducyB3aWxsIGluZGljYXRlIHRoZSBtb3VzZSBidXR0b24gdGhhdCB3YXMgcHJlc3NlZCAoZS5nLiAiMSIgZm9yCiAgICAgKiB0aGUgbGVmdCBtb3VzZSBidXR0b24pLCBmYWtlZCBtb3VzZWRvd25zIHdpbGwgdXN1YWxseSBzZXQgdGhlIHByb3BlcnR5IHZhbHVlIHRvIDAuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50KSB7CiAgICAgICAgcmV0dXJuIGV2ZW50LmJ1dHRvbnMgPT09IDA7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2ExMXkvZm9jdXMtbW9uaXRvci9mb2N1cy1tb25pdG9yLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIFRoaXMgaXMgdGhlIHZhbHVlIHVzZWQgYnkgQW5ndWxhckpTIE1hdGVyaWFsLiBUaHJvdWdoIHRyaWFsIGFuZCBlcnJvciAob24gaVBob25lIDZTKSB0aGV5IGZvdW5kCiAgICAvLyB0aGF0IGEgdmFsdWUgb2YgYXJvdW5kIDY1MG1zIHNlZW1zIGFwcHJvcHJpYXRlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVE9VQ0hfQlVGRkVSX01TID0gNjUwOwogICAgLyoqCiAgICAgKiBJbmplY3Rpb25Ub2tlbiBmb3IgRm9jdXNNb25pdG9yT3B0aW9ucy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBGT0NVU19NT05JVE9SX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignY2RrLWZvY3VzLW1vbml0b3ItZGVmYXVsdC1vcHRpb25zJyk7CiAgICAvKioKICAgICAqIEV2ZW50IGxpc3RlbmVyIG9wdGlvbnMgdGhhdCBlbmFibGUgY2FwdHVyaW5nIGFuZCBhbHNvCiAgICAgKiBtYXJrIHRoZSBsaXN0ZW5lciBhcyBwYXNzaXZlIGlmIHRoZSBicm93c2VyIHN1cHBvcnRzIGl0LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyA9IG5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMoewogICAgICAgIHBhc3NpdmU6IHRydWUsCiAgICAgICAgY2FwdHVyZTogdHJ1ZQogICAgfSk7CiAgICAvKioKICAgICAqIE1vbml0b3JzIG1vdXNlIGFuZCBrZXlib2FyZCBldmVudHMgdG8gZGV0ZXJtaW5lIHRoZSBjYXVzZSBvZiBmb2N1cyBldmVudHMuCiAgICAgKi8KICAgIGNsYXNzIEZvY3VzTW9uaXRvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX25nWm9uZSwgX3BsYXRmb3JtLCAKICAgICAgICAvKiogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgbWFrZSBkb2N1bWVudCByZXF1aXJlZCAqLwogICAgICAgIGRvY3VtZW50LCBvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGZvY3VzIG9yaWdpbiB0aGF0IHRoZSBuZXh0IGZvY3VzIGV2ZW50IGlzIGEgcmVzdWx0IG9mLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb3JpZ2luID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIHdpbmRvdyBoYXMganVzdCBiZWVuIGZvY3VzZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl93aW5kb3dGb2N1c2VkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXAgb2YgZWxlbWVudHMgYmVpbmcgbW9uaXRvcmVkIHRvIHRoZWlyIGluZm8uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9lbGVtZW50SW5mbyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgY3VycmVudGx5IGJlaW5nIG1vbml0b3JlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX21vbml0b3JlZEVsZW1lbnRDb3VudCA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgcm9vdCBub2RlcyB0byB3aGljaCB3ZSd2ZSBjdXJyZW50bHkgYm91bmQgYSBmb2N1cy9ibHVyIGhhbmRsZXIsCiAgICAgICAgICAgICAqIGFzIHdlbGwgYXMgdGhlIG51bWJlciBvZiBtb25pdG9yZWQgZWxlbWVudHMgdGhhdCB0aGV5IGNvbnRhaW4uIFdlIGhhdmUgdG8gdHJlYXQgZm9jdXMvYmx1cgogICAgICAgICAgICAgKiBoYW5kbGVycyBkaWZmZXJlbnRseSBmcm9tIHRoZSByZXN0IG9mIHRoZSBldmVudHMsIGJlY2F1c2UgdGhlIGJyb3dzZXIgd29uJ3QgZW1pdCBldmVudHMKICAgICAgICAgICAgICogdG8gdGhlIGRvY3VtZW50IHdoZW4gZm9jdXMgbW92ZXMgaW5zaWRlIG9mIGEgc2hhZG93IHJvb3QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGxpc3RlbmVyIGZvciBga2V5ZG93bmAgZXZlbnRzIG9uIHRoZSBkb2N1bWVudC4KICAgICAgICAgICAgICogTmVlZHMgdG8gYmUgYW4gYXJyb3cgZnVuY3Rpb24gaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGNvbnRleHQgd2hlbiBpdCBnZXRzIGJvdW5kLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBPbiBrZXlkb3duIHJlY29yZCB0aGUgb3JpZ2luIGFuZCBjbGVhciBhbnkgdG91Y2ggZXZlbnQgdGhhdCBtYXkgYmUgaW4gcHJvZ3Jlc3MuCiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VG91Y2hUYXJnZXQgPSBudWxsOwogICAgICAgICAgICAgICAgdGhpcy5fc2V0T3JpZ2luRm9yQ3VycmVudEV2ZW50UXVldWUoJ2tleWJvYXJkJyk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgbGlzdGVuZXIgZm9yIGBtb3VzZWRvd25gIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQuCiAgICAgICAgICAgICAqIE5lZWRzIHRvIGJlIGFuIGFycm93IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBjb250ZXh0IHdoZW4gaXQgZ2V0cyBib3VuZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50TW91c2Vkb3duTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgLy8gT24gbW91c2Vkb3duIHJlY29yZCB0aGUgb3JpZ2luIG9ubHkgaWYgdGhlcmUgaXMgbm90IHRvdWNoCiAgICAgICAgICAgICAgICAvLyB0YXJnZXQsIHNpbmNlIGEgbW91c2Vkb3duIGNhbiBoYXBwZW4gYXMgYSByZXN1bHQgb2YgYSB0b3VjaCBldmVudC4KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbGFzdFRvdWNoVGFyZ2V0KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSW4gc29tZSBjYXNlcyBzY3JlZW4gcmVhZGVycyBmaXJlIGZha2UgYG1vdXNlZG93bmAgZXZlbnRzIGluc3RlYWQgb2YgYGtleWRvd25gLgogICAgICAgICAgICAgICAgICAgIC8vIFJlc29sdmUgdGhlIGZvY3VzIHNvdXJjZSB0byBga2V5Ym9hcmRgIGlmIHdlIGRldGVjdCBvbmUgb2YgdGhlbS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291cmNlID0gaXNGYWtlTW91c2Vkb3duRnJvbVNjcmVlblJlYWRlcihldmVudCkgPyAna2V5Ym9hcmQnIDogJ21vdXNlJzsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRPcmlnaW5Gb3JDdXJyZW50RXZlbnRRdWV1ZShzb3VyY2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGxpc3RlbmVyIGZvciBgdG91Y2hzdGFydGAgZXZlbnRzIG9uIHRoZSBkb2N1bWVudC4KICAgICAgICAgICAgICogTmVlZHMgdG8gYmUgYW4gYXJyb3cgZnVuY3Rpb24gaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGNvbnRleHQgd2hlbiBpdCBnZXRzIGJvdW5kLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnRUb3VjaHN0YXJ0TGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgdG91Y2hzdGFydCBldmVudCBmaXJlcyB0aGUgZm9jdXMgZXZlbnQgaXMgbm90IHlldCBpbiB0aGUgZXZlbnQgcXVldWUuIFRoaXMgbWVhbnMKICAgICAgICAgICAgICAgIC8vIHdlIGNhbid0IHJlbHkgb24gdGhlIHRyaWNrIHVzZWQgYWJvdmUgKHNldHRpbmcgdGltZW91dCBvZiAxbXMpLiBJbnN0ZWFkIHdlIHdhaXQgNjUwbXMgdG8KICAgICAgICAgICAgICAgIC8vIHNlZSBpZiBhIGZvY3VzIGhhcHBlbnMuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdG91Y2hUaW1lb3V0SWQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90b3VjaFRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9sYXN0VG91Y2hUYXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpOwogICAgICAgICAgICAgICAgdGhpcy5fdG91Y2hUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX2xhc3RUb3VjaFRhcmdldCA9IG51bGwpLCBUT1VDSF9CVUZGRVJfTVMpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGxpc3RlbmVyIGZvciBgZm9jdXNgIGV2ZW50cyBvbiB0aGUgd2luZG93LgogICAgICAgICAgICAgKiBOZWVkcyB0byBiZSBhbiBhcnJvdyBmdW5jdGlvbiBpbiBvcmRlciB0byBwcmVzZXJ2ZSB0aGUgY29udGV4dCB3aGVuIGl0IGdldHMgYm91bmQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl93aW5kb3dGb2N1c0xpc3RlbmVyID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gTWFrZSBhIG5vdGUgb2Ygd2hlbiB0aGUgd2luZG93IHJlZ2FpbnMgZm9jdXMsIHNvIHdlIGNhbgogICAgICAgICAgICAgICAgLy8gcmVzdG9yZSB0aGUgb3JpZ2luIGluZm8gZm9yIHRoZSBmb2N1c2VkIGVsZW1lbnQuCiAgICAgICAgICAgICAgICB0aGlzLl93aW5kb3dGb2N1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl93aW5kb3dGb2N1c2VkID0gZmFsc2UpKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBsaXN0ZW5lciBmb3IgYGZvY3VzYCBhbmQgJ2JsdXInIGV2ZW50cyBvbiB0aGUgZG9jdW1lbnQuCiAgICAgICAgICAgICAqIE5lZWRzIHRvIGJlIGFuIGFycm93IGZ1bmN0aW9uIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSBjb250ZXh0IHdoZW4gaXQgZ2V0cyBib3VuZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdGFyZ2V0ID0gZ2V0VGFyZ2V0KGV2ZW50KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGhhbmRsZXIgPSBldmVudC50eXBlID09PSAnZm9jdXMnID8gdGhpcy5fb25Gb2N1cyA6IHRoaXMuX29uQmx1cjsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gd2FsayB1cCB0aGUgYW5jZXN0b3IgY2hhaW4gaW4gb3JkZXIgdG8gc3VwcG9ydCBgY2hlY2tDaGlsZHJlbmAuCiAgICAgICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50ID0gdGFyZ2V0OyBlbGVtZW50OyBlbGVtZW50ID0gZWxlbWVudC5wYXJlbnRFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsICgvKiogQHR5cGUgez99ICovIChldmVudCkpLCBlbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX2RldGVjdGlvbk1vZGUgPSAob3B0aW9ucyA9PT0gbnVsbCB8fCBvcHRpb25zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBvcHRpb25zLmRldGVjdGlvbk1vZGUpIHx8IDAgLyogSU1NRURJQVRFICovOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBjaGVja0NoaWxkcmVuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtb25pdG9yKGVsZW1lbnQsIGNoZWNrQ2hpbGRyZW4gPSBmYWxzZSkgewogICAgICAgICAgICAvLyBEbyBub3RoaW5nIGlmIHdlJ3JlIG5vdCBvbiB0aGUgYnJvd3NlciBwbGF0Zm9ybS4KICAgICAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnQpOwogICAgICAgICAgICAvLyBJZiB0aGUgZWxlbWVudCBpcyBpbnNpZGUgdGhlIHNoYWRvdyBET00sIHdlIG5lZWQgdG8gYmluZCBvdXIgZm9jdXMvYmx1ciBsaXN0ZW5lcnMgdG8KICAgICAgICAgICAgLy8gdGhlIHNoYWRvdyByb290LCByYXRoZXIgdGhhbiB0aGUgYGRvY3VtZW50YCwgYmVjYXVzZSB0aGUgYnJvd3NlciB3b24ndCBlbWl0IGZvY3VzIGV2ZW50cwogICAgICAgICAgICAvLyB0byB0aGUgYGRvY3VtZW50YCwgaWYgZm9jdXMgaXMgbW92aW5nIHdpdGhpbiB0aGUgc2FtZSBzaGFkb3cgcm9vdC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByb290Tm9kZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoX2dldFNoYWRvd1Jvb3QobmF0aXZlRWxlbWVudCkpKSkgfHwgdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYWNoZWRJbmZvID0gdGhpcy5fZWxlbWVudEluZm8uZ2V0KG5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICAvLyBDaGVjayBpZiB3ZSdyZSBhbHJlYWR5IG1vbml0b3JpbmcgdGhpcyBlbGVtZW50LgogICAgICAgICAgICBpZiAoY2FjaGVkSW5mbykgewogICAgICAgICAgICAgICAgaWYgKGNoZWNrQ2hpbGRyZW4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKENPTVAtMzE4KTogdGhpcyBjYW4gYmUgcHJvYmxlbWF0aWMsIGJlY2F1c2UgaXQnbGwgdHVybiBhbGwgbm9uLWNoZWNrQ2hpbGRyZW4KICAgICAgICAgICAgICAgICAgICAvLyBvYnNlcnZlcnMgaW50byBvbmVzIHRoYXQgYmVoYXZlIGFzIGlmIGBjaGVja0NoaWxkcmVuYCB3YXMgdHVybmVkIG9uLiBXZSBuZWVkIGEgbW9yZQogICAgICAgICAgICAgICAgICAgIC8vIHJvYnVzdCBzb2x1dGlvbi4KICAgICAgICAgICAgICAgICAgICBjYWNoZWRJbmZvLmNoZWNrQ2hpbGRyZW4gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlZEluZm8uc3ViamVjdC5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDcmVhdGUgbW9uaXRvcmVkIGVsZW1lbnQgaW5mby4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmZvID0gewogICAgICAgICAgICAgICAgY2hlY2tDaGlsZHJlbjogY2hlY2tDaGlsZHJlbiwKICAgICAgICAgICAgICAgIHN1YmplY3Q6IG5ldyBTdWJqZWN0KCksCiAgICAgICAgICAgICAgICByb290Tm9kZQogICAgICAgICAgICB9OwogICAgICAgICAgICB0aGlzLl9lbGVtZW50SW5mby5zZXQobmF0aXZlRWxlbWVudCwgaW5mbyk7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyR2xvYmFsTGlzdGVuZXJzKGluZm8pOwogICAgICAgICAgICByZXR1cm4gaW5mby5zdWJqZWN0LmFzT2JzZXJ2YWJsZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0b3BNb25pdG9yaW5nKGVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50SW5mbyA9IHRoaXMuX2VsZW1lbnRJbmZvLmdldChuYXRpdmVFbGVtZW50KTsKICAgICAgICAgICAgaWYgKGVsZW1lbnRJbmZvKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50SW5mby5zdWJqZWN0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRDbGFzc2VzKG5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudEluZm8uZGVsZXRlKG5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKGVsZW1lbnRJbmZvKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvY3VzVmlhKGVsZW1lbnQsIG9yaWdpbiwgb3B0aW9ucykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnQpOwogICAgICAgICAgICB0aGlzLl9zZXRPcmlnaW5Gb3JDdXJyZW50RXZlbnRRdWV1ZShvcmlnaW4pOwogICAgICAgICAgICAvLyBgZm9jdXNgIGlzbid0IGF2YWlsYWJsZSBvbiB0aGUgc2VydmVyCiAgICAgICAgICAgIGlmICh0eXBlb2YgbmF0aXZlRWxlbWVudC5mb2N1cyA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgLy8gQ2FzdCB0aGUgZWxlbWVudCB0byBgYW55YCwgYmVjYXVzZSB0aGUgVFMgdHlwaW5ncyBkb24ndCBoYXZlIHRoZSBgb3B0aW9uc2AgcGFyYW1ldGVyIHlldC4KICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAobmF0aXZlRWxlbWVudCkpKS5mb2N1cyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50SW5mby5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfaW5mbwogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfaW5mbywgZWxlbWVudCkgPT4gdGhpcy5zdG9wTW9uaXRvcmluZyhlbGVtZW50KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBY2Nlc3MgaW5qZWN0ZWQgZG9jdW1lbnQgaWYgYXZhaWxhYmxlIG9yIGZhbGxiYWNrIHRvIGdsb2JhbCBkb2N1bWVudCByZWZlcmVuY2UKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldERvY3VtZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFdpbmRvdygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb2MgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgICAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNsYXNzTmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gc2hvdWxkU2V0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdG9nZ2xlQ2xhc3MoZWxlbWVudCwgY2xhc3NOYW1lLCBzaG91bGRTZXQpIHsKICAgICAgICAgICAgaWYgKHNob3VsZFNldCkgewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY2xhc3NOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRGb2N1c09yaWdpbihldmVudCkgewogICAgICAgICAgICAvLyBJZiB3ZSBjb3VsZG4ndCBkZXRlY3QgYSBjYXVzZSBmb3IgdGhlIGZvY3VzIGV2ZW50LCBpdCdzIGR1ZSB0byBvbmUgb2YgdGhyZWUgcmVhc29uczoKICAgICAgICAgICAgLy8gMSkgVGhlIHdpbmRvdyBoYXMganVzdCByZWdhaW5lZCBmb2N1cywgaW4gd2hpY2ggY2FzZSB3ZSB3YW50IHRvIHJlc3RvcmUgdGhlIGZvY3VzZWQgc3RhdGUgb2YKICAgICAgICAgICAgLy8gICAgdGhlIGVsZW1lbnQgZnJvbSBiZWZvcmUgdGhlIHdpbmRvdyBibHVycmVkLgogICAgICAgICAgICAvLyAyKSBJdCB3YXMgY2F1c2VkIGJ5IGEgdG91Y2ggZXZlbnQsIGluIHdoaWNoIGNhc2Ugd2UgbWFyayB0aGUgb3JpZ2luIGFzICd0b3VjaCcuCiAgICAgICAgICAgIC8vIDMpIFRoZSBlbGVtZW50IHdhcyBwcm9ncmFtbWF0aWNhbGx5IGZvY3VzZWQsIGluIHdoaWNoIGNhc2Ugd2Ugc2hvdWxkIG1hcmsgdGhlIG9yaWdpbiBhcwogICAgICAgICAgICAvLyAgICAncHJvZ3JhbScuCiAgICAgICAgICAgIGlmICh0aGlzLl9vcmlnaW4pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmlnaW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3dpbmRvd0ZvY3VzZWQgJiYgdGhpcy5fbGFzdEZvY3VzT3JpZ2luKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFzdEZvY3VzT3JpZ2luOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX3dhc0NhdXNlZEJ5VG91Y2goZXZlbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3RvdWNoJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiAncHJvZ3JhbSc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZm9jdXMgY2xhc3NlcyBvbiB0aGUgZWxlbWVudCBiYXNlZCBvbiB0aGUgZ2l2ZW4gZm9jdXMgb3JpZ2luLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBlbGVtZW50IHRvIHVwZGF0ZSB0aGUgY2xhc3NlcyBvbi4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcmlnaW4gVGhlIGZvY3VzIG9yaWdpbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRDbGFzc2VzKGVsZW1lbnQsIG9yaWdpbikgewogICAgICAgICAgICB0aGlzLl90b2dnbGVDbGFzcyhlbGVtZW50LCAnY2RrLWZvY3VzZWQnLCAhIW9yaWdpbik7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKGVsZW1lbnQsICdjZGstdG91Y2gtZm9jdXNlZCcsIG9yaWdpbiA9PT0gJ3RvdWNoJyk7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKGVsZW1lbnQsICdjZGsta2V5Ym9hcmQtZm9jdXNlZCcsIG9yaWdpbiA9PT0gJ2tleWJvYXJkJyk7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKGVsZW1lbnQsICdjZGstbW91c2UtZm9jdXNlZCcsIG9yaWdpbiA9PT0gJ21vdXNlJyk7CiAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzKGVsZW1lbnQsICdjZGstcHJvZ3JhbS1mb2N1c2VkJywgb3JpZ2luID09PSAncHJvZ3JhbScpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBvcmlnaW4gYW5kIHNjaGVkdWxlcyBhbiBhc3luYyBmdW5jdGlvbiB0byBjbGVhciBpdCBhdCB0aGUgZW5kIG9mIHRoZSBldmVudCBxdWV1ZS4KICAgICAgICAgKiBJZiB0aGUgZGV0ZWN0aW9uIG1vZGUgaXMgJ2V2ZW50dWFsJywgdGhlIG9yaWdpbiBpcyBuZXZlciBjbGVhcmVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW4gVGhlIG9yaWdpbiB0byBzZXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0T3JpZ2luRm9yQ3VycmVudEV2ZW50UXVldWUob3JpZ2luKSB7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9vcmlnaW4gPSBvcmlnaW47CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fZGV0ZWN0aW9uTW9kZSA9PT0gMCAvKiBJTU1FRElBVEUgKi8pIHsKICAgICAgICAgICAgICAgICAgICAvLyBTb21ldGltZXMgdGhlIGZvY3VzIG9yaWdpbiB3b24ndCBiZSB2YWxpZCBpbiBGaXJlZm94IGJlY2F1c2UgRmlyZWZveCBzZWVtcyB0byBmb2N1cyAqb25lKgogICAgICAgICAgICAgICAgICAgIC8vIHRpY2sgYWZ0ZXIgdGhlIGludGVyYWN0aW9uIGV2ZW50IGZpcmVkLiBUbyBlbnN1cmUgdGhlIGZvY3VzIG9yaWdpbiBpcyBhbHdheXMgY29ycmVjdCwKICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZm9jdXMgb3JpZ2luIHdpbGwgYmUgZGV0ZXJtaW5lZCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHRpY2suCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luVGltZW91dElkID0gc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl9vcmlnaW4gPSBudWxsKSwgMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGZvY3VzIGV2ZW50IHdhcyBjYXVzZWQgYnkgYSB0b3VjaHN0YXJ0IGV2ZW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudCBUaGUgZm9jdXMgZXZlbnQgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybiB7P30gV2hldGhlciB0aGUgZXZlbnQgd2FzIGNhdXNlZCBieSBhIHRvdWNoLgogICAgICAgICAqLwogICAgICAgIF93YXNDYXVzZWRCeVRvdWNoKGV2ZW50KSB7CiAgICAgICAgICAgIC8vIE5vdGUobW1hbGVyYmEpOiBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBxdWl0ZSBwZXJmZWN0LCB0aGVyZSBpcyBhIHNtYWxsIGVkZ2UgY2FzZS4KICAgICAgICAgICAgLy8gQ29uc2lkZXIgdGhlIGZvbGxvd2luZyBkb20gc3RydWN0dXJlOgogICAgICAgICAgICAvLwogICAgICAgICAgICAvLyA8ZGl2ICNwYXJlbnQgdGFiaW5kZXg9IjAiIGNka0ZvY3VzQ2xhc3Nlcz4KICAgICAgICAgICAgLy8gICA8ZGl2ICNjaGlsZCAoY2xpY2spPSIjcGFyZW50LmZvY3VzKCkiPjwvZGl2PgogICAgICAgICAgICAvLyA8L2Rpdj4KICAgICAgICAgICAgLy8KICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIgdG91Y2hlcyB0aGUgI2NoaWxkIGVsZW1lbnQgYW5kIHRoZSAjcGFyZW50IGlzIHByb2dyYW1tYXRpY2FsbHkgZm9jdXNlZCBhcyBhCiAgICAgICAgICAgIC8vIHJlc3VsdCwgdGhpcyBjb2RlIHdpbGwgc3RpbGwgY29uc2lkZXIgaXQgdG8gaGF2ZSBiZWVuIGNhdXNlZCBieSB0aGUgdG91Y2ggZXZlbnQgYW5kIHdpbGwKICAgICAgICAgICAgLy8gYXBwbHkgdGhlIGNkay10b3VjaC1mb2N1c2VkIGNsYXNzIHJhdGhlciB0aGFuIHRoZSBjZGstcHJvZ3JhbS1mb2N1c2VkIGNsYXNzLiBUaGlzIGlzIGEKICAgICAgICAgICAgLy8gcmVsYXRpdmVseSBzbWFsbCBlZGdlLWNhc2UgdGhhdCBjYW4gYmUgd29ya2VkIGFyb3VuZCBieSB1c2luZwogICAgICAgICAgICAvLyBmb2N1c1ZpYShwYXJlbnRFbCwgJ3Byb2dyYW0nKSB0byBmb2N1cyB0aGUgcGFyZW50IGVsZW1lbnQuCiAgICAgICAgICAgIC8vCiAgICAgICAgICAgIC8vIElmIHdlIGRlY2lkZSB0aGF0IHdlIGFic29sdXRlbHkgbXVzdCBoYW5kbGUgdGhpcyBjYXNlIGNvcnJlY3RseSwgd2UgY2FuIGRvIHNvIGJ5IGxpc3RlbmluZwogICAgICAgICAgICAvLyBmb3IgdGhlIGZpcnN0IGZvY3VzIGV2ZW50IGFmdGVyIHRoZSB0b3VjaHN0YXJ0LCBhbmQgdGhlbiB0aGUgZmlyc3QgYmx1ciBldmVudCBhZnRlciB0aGF0CiAgICAgICAgICAgIC8vIGZvY3VzIGV2ZW50LiBXaGVuIHRoYXQgYmx1ciBldmVudCBmaXJlcyB3ZSBrbm93IHRoYXQgd2hhdGV2ZXIgZm9sbG93cyBpcyBub3QgYSByZXN1bHQgb2YgdGhlCiAgICAgICAgICAgIC8vIHRvdWNoc3RhcnQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZm9jdXNUYXJnZXQgPSBnZXRUYXJnZXQoZXZlbnQpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFzdFRvdWNoVGFyZ2V0IGluc3RhbmNlb2YgTm9kZSAmJiBmb2N1c1RhcmdldCBpbnN0YW5jZW9mIE5vZGUgJiYKICAgICAgICAgICAgICAgIChmb2N1c1RhcmdldCA9PT0gdGhpcy5fbGFzdFRvdWNoVGFyZ2V0IHx8IGZvY3VzVGFyZ2V0LmNvbnRhaW5zKHRoaXMuX2xhc3RUb3VjaFRhcmdldCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGZvY3VzIGV2ZW50cyBvbiBhIHJlZ2lzdGVyZWQgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQgVGhlIGZvY3VzIGV2ZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBUaGUgbW9uaXRvcmVkIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25Gb2N1cyhldmVudCwgZWxlbWVudCkgewogICAgICAgICAgICAvLyBOT1RFKG1tYWxlcmJhKTogV2UgY3VycmVudGx5IHNldCB0aGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgZm9jdXMgb3JpZ2luIG9mIHRoZSBtb3N0IHJlY2VudAogICAgICAgICAgICAvLyBmb2N1cyBldmVudCBhZmZlY3RpbmcgdGhlIG1vbml0b3JlZCBlbGVtZW50LiBJZiB3ZSB3YW50IHRvIHVzZSB0aGUgb3JpZ2luIG9mIHRoZSBmaXJzdCBldmVudAogICAgICAgICAgICAvLyBpbnN0ZWFkIHdlIHNob3VsZCBjaGVjayBmb3IgdGhlIGNkay1mb2N1c2VkIGNsYXNzIGhlcmUgYW5kIHJldHVybiBpZiB0aGUgZWxlbWVudCBhbHJlYWR5IGhhcwogICAgICAgICAgICAvLyBpdC4gKFRoaXMgb25seSBtYXR0ZXJzIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgaW5jbHVkZXNDaGlsZHJlbiA9IHRydWUpLgogICAgICAgICAgICAvLyBOT1RFKG1tYWxlcmJhKTogV2UgY3VycmVudGx5IHNldCB0aGUgY2xhc3NlcyBiYXNlZCBvbiB0aGUgZm9jdXMgb3JpZ2luIG9mIHRoZSBtb3N0IHJlY2VudAogICAgICAgICAgICAvLyBmb2N1cyBldmVudCBhZmZlY3RpbmcgdGhlIG1vbml0b3JlZCBlbGVtZW50LiBJZiB3ZSB3YW50IHRvIHVzZSB0aGUgb3JpZ2luIG9mIHRoZSBmaXJzdCBldmVudAogICAgICAgICAgICAvLyBpbnN0ZWFkIHdlIHNob3VsZCBjaGVjayBmb3IgdGhlIGNkay1mb2N1c2VkIGNsYXNzIGhlcmUgYW5kIHJldHVybiBpZiB0aGUgZWxlbWVudCBhbHJlYWR5IGhhcwogICAgICAgICAgICAvLyBpdC4gKFRoaXMgb25seSBtYXR0ZXJzIGZvciBlbGVtZW50cyB0aGF0IGhhdmUgaW5jbHVkZXNDaGlsZHJlbiA9IHRydWUpLgogICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGNvdW50aW5nIGNoaWxkLWVsZW1lbnQtZm9jdXMgYXMgZm9jdXNlZCwgbWFrZSBzdXJlIHRoYXQgdGhlIGV2ZW50IHRhcmdldCBpcyB0aGUKICAgICAgICAgICAgLy8gbW9uaXRvcmVkIGVsZW1lbnQgaXRzZWxmLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRJbmZvID0gdGhpcy5fZWxlbWVudEluZm8uZ2V0KGVsZW1lbnQpOwogICAgICAgICAgICBpZiAoIWVsZW1lbnRJbmZvIHx8ICghZWxlbWVudEluZm8uY2hlY2tDaGlsZHJlbiAmJiBlbGVtZW50ICE9PSBnZXRUYXJnZXQoZXZlbnQpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3JpZ2luID0gdGhpcy5fZ2V0Rm9jdXNPcmlnaW4oZXZlbnQpOwogICAgICAgICAgICB0aGlzLl9zZXRDbGFzc2VzKGVsZW1lbnQsIG9yaWdpbik7CiAgICAgICAgICAgIHRoaXMuX2VtaXRPcmlnaW4oZWxlbWVudEluZm8uc3ViamVjdCwgb3JpZ2luKTsKICAgICAgICAgICAgdGhpcy5fbGFzdEZvY3VzT3JpZ2luID0gb3JpZ2luOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIGJsdXIgZXZlbnRzIG9uIGEgcmVnaXN0ZXJlZCBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQgVGhlIGJsdXIgZXZlbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50IFRoZSBtb25pdG9yZWQgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbkJsdXIoZXZlbnQsIGVsZW1lbnQpIHsKICAgICAgICAgICAgLy8gSWYgd2UgYXJlIGNvdW50aW5nIGNoaWxkLWVsZW1lbnQtZm9jdXMgYXMgZm9jdXNlZCwgbWFrZSBzdXJlIHRoYXQgd2UgYXJlbid0IGp1c3QgYmx1cnJpbmcgaW4KICAgICAgICAgICAgLy8gb3JkZXIgdG8gZm9jdXMgYW5vdGhlciBjaGlsZCBvZiB0aGUgbW9uaXRvcmVkIGVsZW1lbnQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudEluZm8gPSB0aGlzLl9lbGVtZW50SW5mby5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmICghZWxlbWVudEluZm8gfHwgKGVsZW1lbnRJbmZvLmNoZWNrQ2hpbGRyZW4gJiYgZXZlbnQucmVsYXRlZFRhcmdldCBpbnN0YW5jZW9mIE5vZGUgJiYKICAgICAgICAgICAgICAgIGVsZW1lbnQuY29udGFpbnMoZXZlbnQucmVsYXRlZFRhcmdldCkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc2V0Q2xhc3NlcyhlbGVtZW50KTsKICAgICAgICAgICAgdGhpcy5fZW1pdE9yaWdpbihlbGVtZW50SW5mby5zdWJqZWN0LCBudWxsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHN1YmplY3QKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2VtaXRPcmlnaW4oc3ViamVjdCwgb3JpZ2luKSB7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gc3ViamVjdC5uZXh0KG9yaWdpbikpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRJbmZvCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVnaXN0ZXJHbG9iYWxMaXN0ZW5lcnMoZWxlbWVudEluZm8pIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlID0gZWxlbWVudEluZm8ucm9vdE5vZGU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGVGb2N1c0xpc3RlbmVycyA9IHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50LmdldChyb290Tm9kZSkgfHwgMDsKICAgICAgICAgICAgaWYgKCFyb290Tm9kZUZvY3VzTGlzdGVuZXJzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJvb3ROb2RlLmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICByb290Tm9kZS5hZGRFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fcm9vdE5vZGVGb2N1c0FuZEJsdXJMaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9yb290Tm9kZUZvY3VzTGlzdGVuZXJDb3VudC5zZXQocm9vdE5vZGUsIHJvb3ROb2RlRm9jdXNMaXN0ZW5lcnMgKyAxKTsKICAgICAgICAgICAgLy8gUmVnaXN0ZXIgZ2xvYmFsIGxpc3RlbmVycyB3aGVuIGZpcnN0IGVsZW1lbnQgaXMgbW9uaXRvcmVkLgogICAgICAgICAgICBpZiAoKyt0aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQgPT09IDEpIHsKICAgICAgICAgICAgICAgIC8vIE5vdGU6IHdlIGxpc3RlbiB0byBldmVudHMgaW4gdGhlIGNhcHR1cmUgcGhhc2Ugc28gd2UKICAgICAgICAgICAgICAgIC8vIGNhbiBkZXRlY3QgdGhlbSBldmVuIGlmIHRoZSB1c2VyIHN0b3BzIHByb3BhZ2F0aW9uLgogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnQgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fZG9jdW1lbnRLZXlkb3duTGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fZG9jdW1lbnRNb3VzZWRvd25MaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fZG9jdW1lbnRUb3VjaHN0YXJ0TGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgdGhpcy5fd2luZG93Rm9jdXNMaXN0ZW5lcik7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRJbmZvCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlR2xvYmFsTGlzdGVuZXJzKGVsZW1lbnRJbmZvKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm9vdE5vZGUgPSBlbGVtZW50SW5mby5yb290Tm9kZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3Jvb3ROb2RlRm9jdXNMaXN0ZW5lckNvdW50Lmhhcyhyb290Tm9kZSkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJvb3ROb2RlRm9jdXNMaXN0ZW5lcnMgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuZ2V0KHJvb3ROb2RlKSkpOwogICAgICAgICAgICAgICAgaWYgKHJvb3ROb2RlRm9jdXNMaXN0ZW5lcnMgPiAxKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuc2V0KHJvb3ROb2RlLCByb290Tm9kZUZvY3VzTGlzdGVuZXJzIC0gMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByb290Tm9kZS5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgcm9vdE5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX3Jvb3ROb2RlRm9jdXNBbmRCbHVyTGlzdGVuZXIsIGNhcHR1cmVFdmVudExpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcm9vdE5vZGVGb2N1c0xpc3RlbmVyQ291bnQuZGVsZXRlKHJvb3ROb2RlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBVbnJlZ2lzdGVyIGdsb2JhbCBsaXN0ZW5lcnMgd2hlbiBsYXN0IGVsZW1lbnQgaXMgdW5tb25pdG9yZWQuCiAgICAgICAgICAgIGlmICghLS10aGlzLl9tb25pdG9yZWRFbGVtZW50Q291bnQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigna2V5ZG93bicsIHRoaXMuX2RvY3VtZW50S2V5ZG93bkxpc3RlbmVyLCBjYXB0dXJlRXZlbnRMaXN0ZW5lck9wdGlvbnMpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fZG9jdW1lbnRNb3VzZWRvd25MaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9kb2N1bWVudFRvdWNoc3RhcnRMaXN0ZW5lciwgY2FwdHVyZUV2ZW50TGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHRoaXMuX3dpbmRvd0ZvY3VzTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGltZW91dHMgZm9yIGFsbCBwb3RlbnRpYWxseSBwZW5kaW5nIHRpbWVvdXRzIHRvIHByZXZlbnQgdGhlIGxlYWtzLgogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRoaXMuX3dpbmRvd0ZvY3VzVGltZW91dElkKTsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90b3VjaFRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fb3JpZ2luVGltZW91dElkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEZvY3VzTW9uaXRvci7JtWZhYyA9IGZ1bmN0aW9uIEZvY3VzTW9uaXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb2N1c01vbml0b3IpKMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChQbGF0Zm9ybSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCksIMm1ybVpbmplY3QoRk9DVVNfTU9OSVRPUl9ERUZBVUxUX09QVElPTlMsIDgpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRm9jdXNNb25pdG9yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0ZPQ1VTX01PTklUT1JfREVGQVVMVF9PUFRJT05TLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBGb2N1c01vbml0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBGb2N1c01vbml0b3JfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBGb2N1c01vbml0b3IoybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChET0NVTUVOVCQxLCA4KSwgybXJtWluamVjdChGT0NVU19NT05JVE9SX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9LCB0b2tlbjogRm9jdXNNb25pdG9yLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIEdldHMgdGhlIHRhcmdldCBvZiBhbiBldmVudCwgYWNjb3VudGluZyBmb3IgU2hhZG93IERPTS4KICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRhcmdldChldmVudCkgewogICAgICAgIC8vIElmIGFuIGV2ZW50IGlzIGJvdW5kIG91dHNpZGUgdGhlIFNoYWRvdyBET00sIHRoZSBgZXZlbnQudGFyZ2V0YCB3aWxsCiAgICAgICAgLy8gcG9pbnQgdG8gdGhlIHNoYWRvdyByb290IHNvIHdlIGhhdmUgdG8gdXNlIGBjb21wb3NlZFBhdGhgIGluc3RlYWQuCiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoZXZlbnQuY29tcG9zZWRQYXRoID8gZXZlbnQuY29tcG9zZWRQYXRoKClbMF0gOiBldmVudC50YXJnZXQpKSk7CiAgICB9CiAgICAvKioKICAgICAqIERpcmVjdGl2ZSB0aGF0IGRldGVybWluZXMgaG93IGEgcGFydGljdWxhciBlbGVtZW50IHdhcyBmb2N1c2VkICh2aWEga2V5Ym9hcmQsIG1vdXNlLCB0b3VjaCwgb3IKICAgICAqIHByb2dyYW1tYXRpY2FsbHkpIGFuZCBhZGRzIGNvcnJlc3BvbmRpbmcgY2xhc3NlcyB0byB0aGUgZWxlbWVudC4KICAgICAqCiAgICAgKiBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzIG9mIHRoaXMgZGlyZWN0aXZlOgogICAgICogMSkgY2RrTW9uaXRvckVsZW1lbnRGb2N1czogZG9lcyBub3QgY29uc2lkZXIgYW4gZWxlbWVudCB0byBiZSBmb2N1c2VkIGlmIG9uZSBvZiBpdHMgY2hpbGRyZW4gaXMKICAgICAqICAgIGZvY3VzZWQuCiAgICAgKiAyKSBjZGtNb25pdG9yU3VidHJlZUZvY3VzOiBjb25zaWRlcnMgYW4gZWxlbWVudCBmb2N1c2VkIGlmIGl0IG9yIGFueSBvZiBpdHMgY2hpbGRyZW4gYXJlIGZvY3VzZWQuCiAgICAgKi8KICAgIGNsYXNzIENka01vbml0b3JGb2N1cyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzTW9uaXRvcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfZm9jdXNNb25pdG9yKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICAgICAgdGhpcy5jZGtGb2N1c0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5fbW9uaXRvclN1YnNjcmlwdGlvbiA9IHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5oYXNBdHRyaWJ1dGUoJ2Nka01vbml0b3JTdWJ0cmVlRm9jdXMnKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3JpZ2luID0+IHRoaXMuY2RrRm9jdXNDaGFuZ2UuZW1pdChvcmlnaW4pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5fbW9uaXRvclN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KICAgIENka01vbml0b3JGb2N1cy7JtWZhYyA9IGZ1bmN0aW9uIENka01vbml0b3JGb2N1c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtNb25pdG9yRm9jdXMpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSk7IH07CiAgICBDZGtNb25pdG9yRm9jdXMuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrTW9uaXRvckZvY3VzLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtNb25pdG9yRWxlbWVudEZvY3VzIiwgIiJdLCBbIiIsICJjZGtNb25pdG9yU3VidHJlZUZvY3VzIiwgIiJdXSwgb3V0cHV0czogeyBjZGtGb2N1c0NoYW5nZTogImNka0ZvY3VzQ2hhbmdlIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtNb25pdG9yRm9jdXMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfQogICAgXTsKICAgIENka01vbml0b3JGb2N1cy5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjZGtGb2N1c0NoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgYm9keSB3aGVuIGluIGJsYWNrLW9uLXdoaXRlIGhpZ2gtY29udHJhc3QgbW9kZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBCTEFDS19PTl9XSElURV9DU1NfQ0xBU1MgPSAnY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUnOwogICAgLyoqCiAgICAgKiBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgYm9keSB3aGVuIGluIHdoaXRlLW9uLWJsYWNrIGhpZ2gtY29udHJhc3QgbW9kZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBXSElURV9PTl9CTEFDS19DU1NfQ0xBU1MgPSAnY2RrLWhpZ2gtY29udHJhc3Qtd2hpdGUtb24tYmxhY2snOwogICAgLyoqCiAgICAgKiBDU1MgY2xhc3MgYXBwbGllZCB0byB0aGUgZG9jdW1lbnQgYm9keSB3aGVuIGluIGhpZ2gtY29udHJhc3QgbW9kZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBISUdIX0NPTlRSQVNUX01PREVfQUNUSVZFX0NTU19DTEFTUyA9ICdjZGstaGlnaC1jb250cmFzdC1hY3RpdmUnOwogICAgLyoqCiAgICAgKiBTZXJ2aWNlIHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBicm93c2VyIGlzIGN1cnJlbnRseSBpbiBhIGhpZ2gtY29udHJhc3QtbW9kZSBlbnZpcm9ubWVudC4KICAgICAqCiAgICAgKiBNaWNyb3NvZnQgV2luZG93cyBzdXBwb3J0cyBhbiBhY2Nlc3NpYmlsaXR5IGZlYXR1cmUgY2FsbGVkICJIaWdoIENvbnRyYXN0IE1vZGUiLiBUaGlzIG1vZGUKICAgICAqIGNoYW5nZXMgdGhlIGFwcGVhcmFuY2Ugb2YgYWxsIGFwcGxpY2F0aW9ucywgaW5jbHVkaW5nIHdlYiBhcHBsaWNhdGlvbnMsIHRvIGRyYW1hdGljYWxseSBpbmNyZWFzZQogICAgICogY29udHJhc3QuCiAgICAgKgogICAgICogSUUsIEVkZ2UsIGFuZCBGaXJlZm94IGN1cnJlbnRseSBzdXBwb3J0IHRoaXMgbW9kZS4gQ2hyb21lIGRvZXMgbm90IHN1cHBvcnQgV2luZG93cyBIaWdoIENvbnRyYXN0CiAgICAgKiBNb2RlLiBUaGlzIHNlcnZpY2UgZG9lcyBub3QgZGV0ZWN0IGhpZ2gtY29udHJhc3QgbW9kZSBhcyBhZGRlZCBieSB0aGUgQ2hyb21lICJIaWdoIENvbnRyYXN0IgogICAgICogYnJvd3NlciBleHRlbnNpb24uCiAgICAgKi8KICAgIGNsYXNzIEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BsYXRmb3JtLCBkb2N1bWVudCkgewogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCBoaWdoLWNvbnRyYXN0LW1vZGUgZm9yIHRoZSBwYWdlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0SGlnaENvbnRyYXN0TW9kZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIE5PTkUgKi87CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ3JlYXRlIGEgdGVzdCBlbGVtZW50IHdpdGggYW4gYXJiaXRyYXJ5IGJhY2tncm91bmQtY29sb3IgdGhhdCBpcyBuZWl0aGVyIGJsYWNrIG5vcgogICAgICAgICAgICAvLyB3aGl0ZTsgaGlnaC1jb250cmFzdCBtb2RlIHdpbGwgY29lcmNlIHRoZSBjb2xvciB0byBlaXRoZXIgYmxhY2sgb3Igd2hpdGUuIEFsc28gZW5zdXJlIHRoYXQKICAgICAgICAgICAgLy8gYXBwZW5kaW5nIHRoZSB0ZXN0IGVsZW1lbnQgdG8gdGhlIERPTSBkb2VzIG5vdCBhZmZlY3QgbGF5b3V0IGJ5IGFic29sdXRlbHkgcG9zaXRpb25pbmcgaXQKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXN0RWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICB0ZXN0RWxlbWVudC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSAncmdiKDEsMiwzKSc7CiAgICAgICAgICAgIHRlc3RFbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJzsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbWVudCk7CiAgICAgICAgICAgIC8vIEdldCB0aGUgY29tcHV0ZWQgc3R5bGUgZm9yIHRoZSBiYWNrZ3JvdW5kIGNvbG9yLCBjb2xsYXBzaW5nIHNwYWNlcyB0byBub3JtYWxpemUgYmV0d2VlbgogICAgICAgICAgICAvLyBicm93c2Vycy4gT25jZSB3ZSBnZXQgdGhpcyBjb2xvciwgd2Ugbm8gbG9uZ2VyIG5lZWQgdGhlIHRlc3QgZWxlbWVudC4gQWNjZXNzIHRoZSBgd2luZG93YAogICAgICAgICAgICAvLyB2aWEgdGhlIGRvY3VtZW50IHNvIHdlIGNhbiBmYWtlIGl0IGluIHRlc3RzLiBOb3RlIHRoYXQgd2UgaGF2ZSBleHRyYSBudWxsIGNoZWNrcywgYmVjYXVzZQogICAgICAgICAgICAvLyB0aGlzIGxvZ2ljIHdpbGwgbGlrZWx5IHJ1biBkdXJpbmcgYXBwIGJvb3RzdHJhcCBhbmQgdGhyb3dpbmcgY2FuIGJyZWFrIHRoZSBlbnRpcmUgYXBwLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50V2luZG93ID0gdGhpcy5fZG9jdW1lbnQuZGVmYXVsdFZpZXcgfHwgd2luZG93OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkU3R5bGUgPSAoZG9jdW1lbnRXaW5kb3cgJiYgZG9jdW1lbnRXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSkgPwogICAgICAgICAgICAgICAgZG9jdW1lbnRXaW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSh0ZXN0RWxlbWVudCkgOiBudWxsOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXB1dGVkQ29sb3IgPSAoY29tcHV0ZWRTdHlsZSAmJiBjb21wdXRlZFN0eWxlLmJhY2tncm91bmRDb2xvciB8fCAnJykucmVwbGFjZSgvIC9nLCAnJyk7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmJvZHkucmVtb3ZlQ2hpbGQodGVzdEVsZW1lbnQpOwogICAgICAgICAgICBzd2l0Y2ggKGNvbXB1dGVkQ29sb3IpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ3JnYigwLDAsMCknOiByZXR1cm4gMiAvKiBXSElURV9PTl9CTEFDSyAqLzsKICAgICAgICAgICAgICAgIGNhc2UgJ3JnYigyNTUsMjU1LDI1NSknOiByZXR1cm4gMSAvKiBCTEFDS19PTl9XSElURSAqLzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMCAvKiBOT05FICovOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWVzIENTUyBjbGFzc2VzIGluZGljYXRpbmcgaGlnaC1jb250cmFzdCBtb2RlIHRvIGRvY3VtZW50IGJvZHkgKGJyb3dzZXItb25seSkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlCb2R5SGlnaENvbnRyYXN0TW9kZUNzc0NsYXNzZXMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIgJiYgdGhpcy5fZG9jdW1lbnQuYm9keSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYm9keUNsYXNzZXMgPSB0aGlzLl9kb2N1bWVudC5ib2R5LmNsYXNzTGlzdDsKICAgICAgICAgICAgICAgIC8vIElFMTEgZG9lc24ndCBzdXBwb3J0IGBjbGFzc0xpc3RgIG9wZXJhdGlvbnMgd2l0aCBtdWx0aXBsZSBhcmd1bWVudHMKICAgICAgICAgICAgICAgIGJvZHlDbGFzc2VzLnJlbW92ZShISUdIX0NPTlRSQVNUX01PREVfQUNUSVZFX0NTU19DTEFTUyk7CiAgICAgICAgICAgICAgICBib2R5Q2xhc3Nlcy5yZW1vdmUoQkxBQ0tfT05fV0hJVEVfQ1NTX0NMQVNTKTsKICAgICAgICAgICAgICAgIGJvZHlDbGFzc2VzLnJlbW92ZShXSElURV9PTl9CTEFDS19DU1NfQ0xBU1MpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbW9kZSA9IHRoaXMuZ2V0SGlnaENvbnRyYXN0TW9kZSgpOwogICAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IDEgLyogQkxBQ0tfT05fV0hJVEUgKi8pIHsKICAgICAgICAgICAgICAgICAgICBib2R5Q2xhc3Nlcy5hZGQoSElHSF9DT05UUkFTVF9NT0RFX0FDVElWRV9DU1NfQ0xBU1MpOwogICAgICAgICAgICAgICAgICAgIGJvZHlDbGFzc2VzLmFkZChCTEFDS19PTl9XSElURV9DU1NfQ0xBU1MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAobW9kZSA9PT0gMiAvKiBXSElURV9PTl9CTEFDSyAqLykgewogICAgICAgICAgICAgICAgICAgIGJvZHlDbGFzc2VzLmFkZChISUdIX0NPTlRSQVNUX01PREVfQUNUSVZFX0NTU19DTEFTUyk7CiAgICAgICAgICAgICAgICAgICAgYm9keUNsYXNzZXMuYWRkKFdISVRFX09OX0JMQUNLX0NTU19DTEFTUyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBIaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IuybVmYWMgPSBmdW5jdGlvbiBIaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGlnaENvbnRyYXN0TW9kZURldGVjdG9yKSjJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvcijJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChET0NVTUVOVCQxKSk7IH0sIHRva2VuOiBIaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvYTExeS9hMTF5LW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBBMTF5TW9kdWxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGhpZ2hDb250cmFzdE1vZGVEZXRlY3RvcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGhpZ2hDb250cmFzdE1vZGVEZXRlY3RvcikgewogICAgICAgICAgICBoaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IuX2FwcGx5Qm9keUhpZ2hDb250cmFzdE1vZGVDc3NDbGFzc2VzKCk7CiAgICAgICAgfQogICAgfQogICAgQTExeU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEExMXlNb2R1bGUgfSk7CiAgICBBMTF5TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQTExeU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBMTF5TW9kdWxlKSjJtcm1aW5qZWN0KEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvcikpOyB9LCBpbXBvcnRzOiBbW1BsYXRmb3JtTW9kdWxlLCBPYnNlcnZlcnNNb2R1bGVdXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQTExeU1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvciB9CiAgICBdOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQTExeU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtBcmlhTGl2ZSwKICAgICAgICAgICAgQ2RrVHJhcEZvY3VzLAogICAgICAgICAgICBDZGtNb25pdG9yRm9jdXNdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbUGxhdGZvcm1Nb2R1bGUsIE9ic2VydmVyc01vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtBcmlhTGl2ZSwKICAgICAgICAgICAgQ2RrVHJhcEZvY3VzLAogICAgICAgICAgICBDZGtNb25pdG9yRm9jdXNdOyB9IH0pOyB9KSgpOwoKICAgIGNvbnN0IERJUl9ET0NVTUVOVCA9IG5ldyBJbmplY3Rpb25Ub2tlbignY2RrLWRpci1kb2MnLCB7CiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6IERJUl9ET0NVTUVOVF9GQUNUT1JZLAogICAgfSk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBESVJfRE9DVU1FTlRfRkFDVE9SWSgpIHsKICAgICAgICByZXR1cm4gaW5qZWN0KERPQ1VNRU5UJDEpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9iaWRpL2RpcmVjdGlvbmFsaXR5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhlIGRpcmVjdGlvbmFsaXR5IChMVFIgLyBSVEwpIGNvbnRleHQgZm9yIHRoZSBhcHBsaWNhdGlvbiAob3IgYSBzdWJ0cmVlIG9mIGl0KS4KICAgICAqIEV4cG9zZXMgdGhlIGN1cnJlbnQgZGlyZWN0aW9uIGFuZCBhIHN0cmVhbSBvZiBkaXJlY3Rpb24gY2hhbmdlcy4KICAgICAqLwogICAgY2xhc3MgRGlyZWN0aW9uYWxpdHkgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9kb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9kb2N1bWVudCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGN1cnJlbnQgJ2x0cicgb3IgJ3J0bCcgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnZhbHVlID0gJ2x0cic7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgJ2x0cicgLyAncnRsJyBzdGF0ZSBjaGFuZ2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIGlmIChfZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSAnYXV0bycgdmFsdWUgLQogICAgICAgICAgICAgICAgLy8gV2Ugc3RpbGwgbmVlZCB0byBhY2NvdW50IGZvciBkaXI9ImF1dG8iLgogICAgICAgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSBIVE1MRWxlbWVuZXQuZGlyIGlzIGFsc28gImF1dG8iIHdoZW4gdGhhdCdzIHNldCB0byB0aGUgYXR0cmlidXRlLAogICAgICAgICAgICAgICAgLy8gYnV0IGdldENvbXB1dGVkU3R5bGUgcmV0dXJuIGVpdGhlciAibHRyIiBvciAicnRsIi4gYXZvaWRpbmcgZ2V0Q29tcHV0ZWRTdHlsZSBmb3Igbm93CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBib2R5RGlyID0gX2RvY3VtZW50LmJvZHkgPyBfZG9jdW1lbnQuYm9keS5kaXIgOiBudWxsOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaHRtbERpciA9IF9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgPyBfZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmRpciA6IG51bGw7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGJvZHlEaXIgfHwgaHRtbERpcjsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSAodmFsdWUgPT09ICdsdHInIHx8IHZhbHVlID09PSAncnRsJykgPyB2YWx1ZSA6ICdsdHInOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuY2hhbmdlLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgRGlyZWN0aW9uYWxpdHkuybVmYWMgPSBmdW5jdGlvbiBEaXJlY3Rpb25hbGl0eV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEaXJlY3Rpb25hbGl0eSkoybXJtWluamVjdChESVJfRE9DVU1FTlQsIDgpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRGlyZWN0aW9uYWxpdHkuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRElSX0RPQ1VNRU5ULF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEaXJlY3Rpb25hbGl0eS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIERpcmVjdGlvbmFsaXR5X0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgRGlyZWN0aW9uYWxpdHkoybXJtWluamVjdChESVJfRE9DVU1FTlQsIDgpKTsgfSwgdG9rZW46IERpcmVjdGlvbmFsaXR5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2JpZGkvZGlyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogRGlyZWN0aXZlIHRvIGxpc3RlbiBmb3IgY2hhbmdlcyBvZiBkaXJlY3Rpb24gb2YgcGFydCBvZiB0aGUgRE9NLgogICAgICoKICAgICAqIFByb3ZpZGVzIGl0c2VsZiBhcyBEaXJlY3Rpb25hbGl0eSBzdWNoIHRoYXQgZGVzY2VuZGFudCBkaXJlY3RpdmVzIG9ubHkgbmVlZCB0byBldmVyIGluamVjdAogICAgICogRGlyZWN0aW9uYWxpdHkgdG8gZ2V0IHRoZSBjbG9zZXN0IGRpcmVjdGlvbi4KICAgICAqLwogICAgY2xhc3MgRGlyIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5vcm1hbGl6ZWQgZGlyZWN0aW9uIHRoYXQgYWNjb3VudHMgZm9yIGludmFsaWQvdW5zdXBwb3J0ZWQgdmFsdWVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGlyID0gJ2x0cic7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBgdmFsdWVgIGhhcyBiZWVuIHNldCB0byBpdHMgaW5pdGlhbCB2YWx1ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXIoKSB7IHJldHVybiB0aGlzLl9kaXI7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlyKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb2xkID0gdGhpcy5fZGlyOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID8gdmFsdWUudG9Mb3dlckNhc2UoKSA6IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9yYXdEaXIgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fZGlyID0gKG5vcm1hbGl6ZWRWYWx1ZSA9PT0gJ2x0cicgfHwgbm9ybWFsaXplZFZhbHVlID09PSAncnRsJykgPyBub3JtYWxpemVkVmFsdWUgOiAnbHRyJzsKICAgICAgICAgICAgaWYgKG9sZCAhPT0gdGhpcy5fZGlyICYmIHRoaXMuX2lzSW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQodGhpcy5fZGlyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDdXJyZW50IGxheW91dCBkaXJlY3Rpb24gb2YgdGhlIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLmRpcjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemUgb25jZSBkZWZhdWx0IHZhbHVlIGhhcyBiZWVuIHNldC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuY2hhbmdlLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgRGlyLsm1ZmFjID0gZnVuY3Rpb24gRGlyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERpcikoKTsgfTsKICAgIERpci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBEaXIsIHNlbGVjdG9yczogW1siIiwgImRpciIsICIiXV0sIGhvc3RWYXJzOiAxLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIERpcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoImRpciIsIGN0eC5fcmF3RGlyKTsKICAgICAgICB9IH0sIGlucHV0czogeyBkaXI6ICJkaXIiIH0sIG91dHB1dHM6IHsgY2hhbmdlOiAiZGlyQ2hhbmdlIiB9LCBleHBvcnRBczogWyJkaXIiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbeyBwcm92aWRlOiBEaXJlY3Rpb25hbGl0eSwgdXNlRXhpc3Rpbmc6IERpciB9XSldIH0pOwogICAgRGlyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNoYW5nZTogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ2RpckNoYW5nZScsXSB9XSwKICAgICAgICBkaXI6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9iaWRpL2JpZGktbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEJpZGlNb2R1bGUgewogICAgfQogICAgQmlkaU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEJpZGlNb2R1bGUgfSk7CiAgICBCaWRpTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQmlkaU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBCaWRpTW9kdWxlKSgpOyB9IH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQmlkaU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtEaXJdLCBleHBvcnRzOiBbRGlyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKiBDdXJyZW50IHZlcnNpb24gb2YgdGhlIEFuZ3VsYXIgQ29tcG9uZW50IERldmVsb3BtZW50IEtpdC4gKi8KICAgIGNvbnN0IFZFUlNJT04kMyA9IG5ldyBWZXJzaW9uKCc5LjIuNCcpOwoKICAgIGNvbnN0IF9jMCA9IFsiKiIsIFtbIm1hdC1vcHRpb24iXSwgWyJuZy1jb250YWluZXIiXV1dOwogICAgY29uc3QgX2MxID0gWyIqIiwgIm1hdC1vcHRpb24sIG5nLWNvbnRhaW5lciJdOwogICAgZnVuY3Rpb24gTWF0T3B0aW9uX21hdF9wc2V1ZG9fY2hlY2tib3hfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWF0LXBzZXVkby1jaGVja2JveCIsIDMpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJzdGF0ZSIsIGN0eF9yMC5zZWxlY3RlZCA/ICJjaGVja2VkIiA6ICJ1bmNoZWNrZWQiKSgiZGlzYWJsZWQiLCBjdHhfcjAuZGlzYWJsZWQpOwogICAgfSB9CiAgICBjb25zdCBfYzIgPSBbIioiXTsKICAgIGNvbnN0IFZFUlNJT04kNCA9IG5ldyBWZXJzaW9uKCc5LjIuNCcpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvYW5pbWF0aW9uL2FuaW1hdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgQW5pbWF0aW9uQ3VydmVzIHsKICAgIH0KICAgIEFuaW1hdGlvbkN1cnZlcy5TVEFOREFSRF9DVVJWRSA9ICdjdWJpYy1iZXppZXIoMC40LDAuMCwwLjIsMSknOwogICAgQW5pbWF0aW9uQ3VydmVzLkRFQ0VMRVJBVElPTl9DVVJWRSA9ICdjdWJpYy1iZXppZXIoMC4wLDAuMCwwLjIsMSknOwogICAgQW5pbWF0aW9uQ3VydmVzLkFDQ0VMRVJBVElPTl9DVVJWRSA9ICdjdWJpYy1iZXppZXIoMC40LDAuMCwxLDEpJzsKICAgIEFuaW1hdGlvbkN1cnZlcy5TSEFSUF9DVVJWRSA9ICdjdWJpYy1iZXppZXIoMC40LDAuMCwwLjYsMSknOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBBbmltYXRpb25EdXJhdGlvbnMgewogICAgfQogICAgQW5pbWF0aW9uRHVyYXRpb25zLkNPTVBMRVggPSAnMzc1bXMnOwogICAgQW5pbWF0aW9uRHVyYXRpb25zLkVOVEVSSU5HID0gJzIyNW1zJzsKICAgIEFuaW1hdGlvbkR1cmF0aW9ucy5FWElUSU5HID0gJzE5NW1zJzsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2NvbW1vbi1iZWhhdmlvcnMvY29tbW9uLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBQcml2YXRlIHZlcnNpb24gY29uc3RhbnQgdG8gY2lyY3VtdmVudCB0ZXN0L2J1aWxkIGlzc3VlcywKICAgIC8vIGkuZS4gYXZvaWQgY29yZSB0byBkZXBlbmQgb24gdGhlIEBhbmd1bGFyL21hdGVyaWFsIHByaW1hcnkgZW50cnktcG9pbnQKICAgIC8vIENhbiBiZSByZW1vdmVkIG9uY2UgdGhlIE1hdGVyaWFsIHByaW1hcnkgZW50cnktcG9pbnQgbm8gbG9uZ2VyCiAgICAvLyByZS1leHBvcnRzIGFsbCBzZWNvbmRhcnkgZW50cnktcG9pbnRzCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBWRVJTSU9OJDEkMSA9IG5ldyBWZXJzaW9uKCc5LjIuNCcpOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFURVJJQUxfU0FOSVRZX0NIRUNLU19GQUNUT1JZKCkgewogICAgICAgIHJldHVybiB0cnVlOwogICAgfQogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjb25maWd1cmVzIHdoZXRoZXIgdGhlIE1hdGVyaWFsIHNhbml0eSBjaGVja3MgYXJlIGVuYWJsZWQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFURVJJQUxfU0FOSVRZX0NIRUNLUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LXNhbml0eS1jaGVja3MnLCB7CiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6IE1BVEVSSUFMX1NBTklUWV9DSEVDS1NfRkFDVE9SWSwKICAgIH0pOwogICAgLyoqCiAgICAgKiBNb2R1bGUgdGhhdCBjYXB0dXJlcyBhbnl0aGluZyB0aGF0IHNob3VsZCBiZSBsb2FkZWQgYW5kL29yIHJ1biBmb3IgKmFsbCogQW5ndWxhciBNYXRlcmlhbAogICAgICogY29tcG9uZW50cy4gVGhpcyBpbmNsdWRlcyBCaWRpLCBldGMuCiAgICAgKgogICAgICogVGhpcyBtb2R1bGUgc2hvdWxkIGJlIGltcG9ydGVkIHRvIGVhY2ggdG9wLWxldmVsIGNvbXBvbmVudCBtb2R1bGUgKGUuZy4sIE1hdFRhYnNNb2R1bGUpLgogICAgICovCiAgICBjbGFzcyBNYXRDb21tb25Nb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaGlnaENvbnRyYXN0TW9kZURldGVjdG9yCiAgICAgICAgICogQHBhcmFtIHs/fSBzYW5pdHlDaGVja3MKICAgICAgICAgKiBAcGFyYW0gez89fSBkb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvciwgc2FuaXR5Q2hlY2tzLCAKICAgICAgICAvKiogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgbWFrZSBkb2N1bWVudCByZXF1aXJlZCAqLwogICAgICAgIGRvY3VtZW50KSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHdlJ3ZlIGRvbmUgdGhlIGdsb2JhbCBzYW5pdHkgY2hlY2tzIChlLmcuIGEgdGhlbWUgaXMgbG9hZGVkLCB0aGVyZSBpcyBhIGRvY3R5cGUpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faGFzRG9uZUdsb2JhbENoZWNrcyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgICAgICAvLyBXaGlsZSBBMTF5TW9kdWxlIGFsc28gZG9lcyB0aGlzLCB3ZSByZXBlYXQgaXQgaGVyZSB0byBhdm9pZCBpbXBvcnRpbmcgQTExeU1vZHVsZQogICAgICAgICAgICAvLyBpbiBNYXRDb21tb25Nb2R1bGUuCiAgICAgICAgICAgIGhpZ2hDb250cmFzdE1vZGVEZXRlY3Rvci5fYXBwbHlCb2R5SGlnaENvbnRyYXN0TW9kZUNzc0NsYXNzZXMoKTsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGBfc2FuaXR5Q2hlY2tzYCBpcyB0eXBlZCB0byBgYW55YCwgYmVjYXVzZSBBb1QKICAgICAgICAgICAgLy8gdGhyb3dzIGFuIGVycm9yIGlmIHdlIHVzZSB0aGUgYFNhbml0eUNoZWNrc2AgdHlwZSBkaXJlY3RseS4KICAgICAgICAgICAgdGhpcy5fc2FuaXR5Q2hlY2tzID0gc2FuaXR5Q2hlY2tzOwogICAgICAgICAgICBpZiAoIXRoaXMuX2hhc0RvbmVHbG9iYWxDaGVja3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrRG9jdHlwZUlzRGVmaW5lZCgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tUaGVtZUlzUHJlc2VudCgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tDZGtWZXJzaW9uTWF0Y2goKTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc0RvbmVHbG9iYWxDaGVja3MgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFjY2VzcyBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIGRvY3VtZW50IHJlZmVyZW5jZQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0RG9jdW1lbnQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZG9jID0gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgZG9jID09PSAnb2JqZWN0JyAmJiBkb2MgPyBkb2MgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVc2UgZGVmYXVsdFZpZXcgb2YgaW5qZWN0ZWQgZG9jdW1lbnQgaWYgYXZhaWxhYmxlIG9yIGZhbGxiYWNrIHRvIGdsb2JhbCB3aW5kb3cgcmVmZXJlbmNlCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRXaW5kb3coKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZG9jID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB3aW4gPSAoZG9jID09PSBudWxsIHx8IGRvYyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZG9jLmRlZmF1bHRWaWV3KSB8fCB3aW5kb3c7CiAgICAgICAgICAgIHJldHVybiB0eXBlb2Ygd2luID09PSAnb2JqZWN0JyAmJiB3aW4gPyB3aW4gOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIGFueSBzYW5pdHkgY2hlY2tzIGFyZSBlbmFibGVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2hlY2tzQXJlRW5hYmxlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIGlzRGV2TW9kZSgpICYmICF0aGlzLl9pc1Rlc3RFbnYoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY29kZSBpcyBydW5uaW5nIGluIHRlc3RzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNUZXN0RW52KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9nZXRXaW5kb3coKSkpOwogICAgICAgICAgICByZXR1cm4gd2luZG93ICYmICh3aW5kb3cuX19rYXJtYV9fIHx8IHdpbmRvdy5qYXNtaW5lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja0RvY3R5cGVJc0RlZmluZWQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNFbmFibGVkID0gdGhpcy5fY2hlY2tzQXJlRW5hYmxlZCgpICYmCiAgICAgICAgICAgICAgICAodGhpcy5fc2FuaXR5Q2hlY2tzID09PSB0cnVlIHx8ICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fc2FuaXR5Q2hlY2tzKSkpLmRvY3R5cGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCAmJiBkb2N1bWVudCAmJiAhZG9jdW1lbnQuZG9jdHlwZSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdDdXJyZW50IGRvY3VtZW50IGRvZXMgbm90IGhhdmUgYSBkb2N0eXBlLiBUaGlzIG1heSBjYXVzZSAnICsKICAgICAgICAgICAgICAgICAgICAnc29tZSBBbmd1bGFyIE1hdGVyaWFsIGNvbXBvbmVudHMgbm90IHRvIGJlaGF2ZSBhcyBleHBlY3RlZC4nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrVGhlbWVJc1ByZXNlbnQoKSB7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gYXNzZXJ0IHRoYXQgdGhlIGBib2R5YCBpcyBkZWZpbmVkLCBiZWNhdXNlIHRoZXNlIGNoZWNrcyBydW4gdmVyeSBlYXJseQogICAgICAgICAgICAvLyBhbmQgdGhlIGBib2R5YCB3b24ndCBiZSBkZWZpbmVkIGlmIHRoZSBjb25zdW1lciBwdXQgdGhlaXIgc2NyaXB0cyBpbiB0aGUgYGhlYWRgLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzRGlzYWJsZWQgPSAhdGhpcy5fY2hlY2tzQXJlRW5hYmxlZCgpIHx8CiAgICAgICAgICAgICAgICAodGhpcy5fc2FuaXR5Q2hlY2tzID09PSBmYWxzZSB8fCAhKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9zYW5pdHlDaGVja3MpKSkudGhlbWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgaWYgKGlzRGlzYWJsZWQgfHwgIWRvY3VtZW50IHx8ICFkb2N1bWVudC5ib2R5IHx8CiAgICAgICAgICAgICAgICB0eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGVzdEVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdGVzdEVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWF0LXRoZW1lLWxvYWRlZC1tYXJrZXInKTsKICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXN0RWxlbWVudCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29tcHV0ZWRTdHlsZSA9IGdldENvbXB1dGVkU3R5bGUodGVzdEVsZW1lbnQpOwogICAgICAgICAgICAvLyBJbiBzb21lIHNpdHVhdGlvbnMgdGhlIGNvbXB1dGVkIHN0eWxlIG9mIHRoZSB0ZXN0IGVsZW1lbnQgY2FuIGJlIG51bGwuIEZvciBleGFtcGxlIGluCiAgICAgICAgICAgIC8vIEZpcmVmb3gsIHRoZSBjb21wdXRlZCBzdHlsZSBpcyBudWxsIGlmIGFuIGFwcGxpY2F0aW9uIGlzIHJ1bm5pbmcgaW5zaWRlIG9mIGEgaGlkZGVuIGlmcmFtZS4KICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD01NDgzOTcKICAgICAgICAgICAgaWYgKGNvbXB1dGVkU3R5bGUgJiYgY29tcHV0ZWRTdHlsZS5kaXNwbGF5ICE9PSAnbm9uZScpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignQ291bGQgbm90IGZpbmQgQW5ndWxhciBNYXRlcmlhbCBjb3JlIHRoZW1lLiBNb3N0IE1hdGVyaWFsICcgKwogICAgICAgICAgICAgICAgICAgICdjb21wb25lbnRzIG1heSBub3Qgd29yayBhcyBleHBlY3RlZC4gRm9yIG1vcmUgaW5mbyByZWZlciAnICsKICAgICAgICAgICAgICAgICAgICAndG8gdGhlIHRoZW1pbmcgZ3VpZGU6IGh0dHBzOi8vbWF0ZXJpYWwuYW5ndWxhci5pby9ndWlkZS90aGVtaW5nJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5yZW1vdmVDaGlsZCh0ZXN0RWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBtYXRlcmlhbCB2ZXJzaW9uIG1hdGNoZXMgdGhlIGNkayB2ZXJzaW9uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja0Nka1ZlcnNpb25NYXRjaCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSB0aGlzLl9jaGVja3NBcmVFbmFibGVkKCkgJiYKICAgICAgICAgICAgICAgICh0aGlzLl9zYW5pdHlDaGVja3MgPT09IHRydWUgfHwgKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9zYW5pdHlDaGVja3MpKSkudmVyc2lvbik7CiAgICAgICAgICAgIGlmIChpc0VuYWJsZWQgJiYgVkVSU0lPTiQxJDEuZnVsbCAhPT0gVkVSU0lPTiQzLmZ1bGwpIHsKICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybignVGhlIEFuZ3VsYXIgTWF0ZXJpYWwgdmVyc2lvbiAoJyArIFZFUlNJT04kMSQxLmZ1bGwgKyAnKSBkb2VzIG5vdCBtYXRjaCAnICsKICAgICAgICAgICAgICAgICAgICAndGhlIEFuZ3VsYXIgQ0RLIHZlcnNpb24gKCcgKyBWRVJTSU9OJDMuZnVsbCArICcpLlxuJyArCiAgICAgICAgICAgICAgICAgICAgJ1BsZWFzZSBlbnN1cmUgdGhlIHZlcnNpb25zIG9mIHRoZXNlIHR3byBwYWNrYWdlcyBleGFjdGx5IG1hdGNoLicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0Q29tbW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0Q29tbW9uTW9kdWxlIH0pOwogICAgTWF0Q29tbW9uTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0Q29tbW9uTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdENvbW1vbk1vZHVsZSkoybXJtWluamVjdChIaWdoQ29udHJhc3RNb2RlRGV0ZWN0b3IpLCDJtcm1aW5qZWN0KE1BVEVSSUFMX1NBTklUWV9DSEVDS1MsIDgpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfSwgaW1wb3J0czogW1tCaWRpTW9kdWxlXSwKICAgICAgICAgICAgQmlkaU1vZHVsZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdENvbW1vbk1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEhpZ2hDb250cmFzdE1vZGVEZXRlY3RvciB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVEVSSUFMX1NBTklUWV9DSEVDS1MsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0Q29tbW9uTW9kdWxlLCB7IGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtCaWRpTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0JpZGlNb2R1bGVdOyB9IH0pOyB9KSgpOwogICAgLyoqCiAgICAgKiBNaXhpbiB0byBhdWdtZW50IGEgZGlyZWN0aXZlIHdpdGggYSBgZGlzYWJsZWRgIHByb3BlcnR5LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gYmFzZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5EaXNhYmxlZChiYXNlKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3MKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogTWl4aW4gdG8gYXVnbWVudCBhIGRpcmVjdGl2ZSB3aXRoIGEgYGNvbG9yYCBwcm9wZXJ0eS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGJhc2UKICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRDb2xvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5Db2xvcihiYXNlLCBkZWZhdWx0Q29sb3IpIHsKICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgY29sb3IgdGhhdCBjYW4gYmUgc3BlY2lmaWVkIGZyb20gdGhlIG1peGluLgogICAgICAgICAgICAgICAgdGhpcy5jb2xvciA9IGRlZmF1bHRDb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldCBjb2xvcigpIHsgcmV0dXJuIHRoaXMuX2NvbG9yOyB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXQgY29sb3IodmFsdWUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbG9yUGFsZXR0ZSA9IHZhbHVlIHx8IGRlZmF1bHRDb2xvcjsKICAgICAgICAgICAgICAgIGlmIChjb2xvclBhbGV0dGUgIT09IHRoaXMuX2NvbG9yKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbG9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKGBtYXQtJHt0aGlzLl9jb2xvcn1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKGNvbG9yUGFsZXR0ZSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NMaXN0LmFkZChgbWF0LSR7Y29sb3JQYWxldHRlfWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb2xvciA9IGNvbG9yUGFsZXR0ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIE1peGluIHRvIGF1Z21lbnQgYSBkaXJlY3RpdmUgd2l0aCBhIGBkaXNhYmxlUmlwcGxlYCBwcm9wZXJ0eS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGJhc2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluRGlzYWJsZVJpcHBsZShiYXNlKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3MKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVJpcHBsZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSByaXBwbGUgZWZmZWN0IGlzIGRpc2FibGVkIG9yIG5vdC4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldCBkaXNhYmxlUmlwcGxlKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZVJpcHBsZTsgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc2V0IGRpc2FibGVSaXBwbGUodmFsdWUpIHsgdGhpcy5fZGlzYWJsZVJpcHBsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBNaXhpbiB0byBhdWdtZW50IGEgZGlyZWN0aXZlIHdpdGggYSBgdGFiSW5kZXhgIHByb3BlcnR5LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gYmFzZQogICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdFRhYkluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtaXhpblRhYkluZGV4KGJhc2UsIGRlZmF1bHRUYWJJbmRleCA9IDApIHsKICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgICAgICAgICB0aGlzLl90YWJJbmRleCA9IGRlZmF1bHRUYWJJbmRleDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGdldCB0YWJJbmRleCgpIHsgcmV0dXJuIHRoaXMuZGlzYWJsZWQgPyAtMSA6IHRoaXMuX3RhYkluZGV4OyB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXQgdGFiSW5kZXgodmFsdWUpIHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzcGVjaWZpZWQgdGFiSW5kZXggdmFsdWUgaXMgbnVsbCBvciB1bmRlZmluZWQsIGZhbGwgYmFjayB0byB0aGUgZGVmYXVsdCB2YWx1ZS4KICAgICAgICAgICAgICAgIHRoaXMuX3RhYkluZGV4ID0gdmFsdWUgIT0gbnVsbCA/IHZhbHVlIDogZGVmYXVsdFRhYkluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogTWl4aW4gdG8gYXVnbWVudCBhIGRpcmVjdGl2ZSB3aXRoIHVwZGF0ZUVycm9yU3RhdGUgbWV0aG9kLgogICAgICogRm9yIGNvbXBvbmVudCB3aXRoIGBlcnJvclN0YXRlYCBhbmQgbmVlZCB0byB1cGRhdGUgYGVycm9yU3RhdGVgLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gYmFzZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5FcnJvclN0YXRlKGJhc2UpIHsKICAgICAgICByZXR1cm4gY2xhc3MgZXh0ZW5kcyBiYXNlIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7Li4uP30gYXJncwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29uc3RydWN0b3IoLi4uYXJncykgewogICAgICAgICAgICAgICAgc3VwZXIoLi4uYXJncyk7CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBhbiBlcnJvciBzdGF0ZS4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdGhpcy5lcnJvclN0YXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW5ldmVyIHRoZSBzdGF0ZSBvZiB0aGUgaW5wdXQgY2hhbmdlcyBzdWNoIHRoYXQgdGhlIHdyYXBwaW5nCiAgICAgICAgICAgICAgICAgKiBgTWF0Rm9ybUZpZWxkYCBuZWVkcyB0byBydW4gY2hhbmdlIGRldGVjdGlvbi4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdXBkYXRlRXJyb3JTdGF0ZSgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9sZFN0YXRlID0gdGhpcy5lcnJvclN0YXRlOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50Rm9ybUdyb3VwIHx8IHRoaXMuX3BhcmVudEZvcm07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVyID0gdGhpcy5lcnJvclN0YXRlTWF0Y2hlciB8fCB0aGlzLl9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5uZ0NvbnRyb2wgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5uZ0NvbnRyb2wuY29udHJvbCkpIDogbnVsbDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5ld1N0YXRlID0gbWF0Y2hlci5pc0Vycm9yU3RhdGUoY29udHJvbCwgcGFyZW50KTsKICAgICAgICAgICAgICAgIGlmIChuZXdTdGF0ZSAhPT0gb2xkU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVycm9yU3RhdGUgPSBuZXdTdGF0ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBNaXhpbiB0byBhdWdtZW50IGEgZGlyZWN0aXZlIHdpdGggYW4gaW5pdGlhbGl6ZWQgcHJvcGVydHkgdGhhdCB3aWxsIGVtaXRzIHdoZW4gbmdPbkluaXQgZW5kcy4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGJhc2UKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1peGluSW5pdGlhbGl6ZWQoYmFzZSkgewogICAgICAgIHJldHVybiBjbGFzcyBleHRlbmRzIGJhc2UgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHsuLi4/fSBhcmdzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdHJ1Y3RvciguLi5hcmdzKSB7CiAgICAgICAgICAgICAgICBzdXBlciguLi5hcmdzKTsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogV2hldGhlciB0aGlzIGRpcmVjdGl2ZSBoYXMgYmVlbiBtYXJrZWQgYXMgaW5pdGlhbGl6ZWQuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogTGlzdCBvZiBzdWJzY3JpYmVycyB0aGF0IHN1YnNjcmliZWQgYmVmb3JlIHRoZSBkaXJlY3RpdmUgd2FzIGluaXRpYWxpemVkLiBTaG91bGQgYmUgbm90aWZpZWQKICAgICAgICAgICAgICAgICAqIGR1cmluZyBfbWFya0luaXRpYWxpemVkLiBTZXQgdG8gbnVsbCBhZnRlciBwZW5kaW5nIHN1YnNjcmliZXJzIGFyZSBub3RpZmllZCwgYW5kIHNob3VsZAogICAgICAgICAgICAgICAgICogbm90IGV4cGVjdCB0byBiZSBwb3B1bGF0ZWQgYWZ0ZXIuCiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdTdWJzY3JpYmVycyA9IFtdOwogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBPYnNlcnZhYmxlIHN0cmVhbSB0aGF0IGVtaXRzIHdoZW4gdGhlIGRpcmVjdGl2ZSBpbml0aWFsaXplcy4gSWYgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlCiAgICAgICAgICAgICAgICAgKiBzdWJzY3JpYmVyIGlzIHN0b3JlZCB0byBiZSBub3RpZmllZCBvbmNlIF9tYXJrSW5pdGlhbGl6ZWQgaXMgY2FsbGVkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdWJzY3JpYmVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBJZiBpbml0aWFsaXplZCwgaW1tZWRpYXRlbHkgbm90aWZ5IHRoZSBzdWJzY3JpYmVyLiBPdGhlcndpc2Ugc3RvcmUgdGhlIHN1YnNjcmliZXIgdG8gbm90aWZ5CiAgICAgICAgICAgICAgICAgICAgLy8gd2hlbiBfbWFya0luaXRpYWxpemVkIGlzIGNhbGxlZC4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9ub3RpZnlTdWJzY3JpYmVyKHN1YnNjcmliZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3BlbmRpbmdTdWJzY3JpYmVycykpLnB1c2goc3Vic2NyaWJlcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXJrcyB0aGUgc3RhdGUgYXMgaW5pdGlhbGl6ZWQgYW5kIG5vdGlmaWVzIHBlbmRpbmcgc3Vic2NyaWJlcnMuIFNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIGVuZAogICAgICAgICAgICAgKiBvZiBuZ09uSW5pdC4KICAgICAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIF9tYXJrSW5pdGlhbGl6ZWQoKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNJbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGlzIGRpcmVjdGl2ZSBoYXMgYWxyZWFkeSBiZWVuIG1hcmtlZCBhcyBpbml0aWFsaXplZCBhbmQgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICdzaG91bGQgbm90IGJlIGNhbGxlZCB0d2ljZS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3BlbmRpbmdTdWJzY3JpYmVycykpLmZvckVhY2godGhpcy5fbm90aWZ5U3Vic2NyaWJlcik7CiAgICAgICAgICAgICAgICB0aGlzLl9wZW5kaW5nU3Vic2NyaWJlcnMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyBhbmQgY29tcGxldGVzIHRoZSBzdWJzY3JpYmVyIHN0cmVhbSAoc2hvdWxkIG9ubHkgZW1pdCBvbmNlKS4KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdWJzY3JpYmVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBfbm90aWZ5U3Vic2NyaWJlcihzdWJzY3JpYmVyKSB7CiAgICAgICAgICAgICAgICBzdWJzY3JpYmVyLm5leHQoKTsKICAgICAgICAgICAgICAgIHN1YnNjcmliZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9jb21tb24tYmVoYXZpb3JzL2luZGV4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2RhdGV0aW1lL2RhdGUtYWRhcHRlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEluamVjdGlvblRva2VuIGZvciBkYXRlcGlja2VyIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgZGVmYXVsdCBsb2NhbGUgY29kZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfREFURV9MT0NBTEUgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01BVF9EQVRFX0xPQ0FMRScsIHsKICAgICAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICAgICAgZmFjdG9yeTogTUFUX0RBVEVfTE9DQUxFX0ZBQ1RPUlksCiAgICB9KTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIE1BVF9EQVRFX0xPQ0FMRV9GQUNUT1JZKCkgewogICAgICAgIHJldHVybiBpbmplY3QoTE9DQUxFX0lEJDEpOwogICAgfQogICAgLyoqCiAgICAgKiBBZGFwdHMgdHlwZSBgRGAgdG8gYmUgdXNhYmxlIGFzIGEgZGF0ZSBieSBjZGstYmFzZWQgY29tcG9uZW50cyB0aGF0IHdvcmsgd2l0aCBkYXRlcy4KICAgICAqIEBhYnN0cmFjdAogICAgICogQHRlbXBsYXRlIEQKICAgICAqLwogICAgY2xhc3MgRGF0ZUFkYXB0ZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9sb2NhbGVDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBzdHJlYW0gdGhhdCBlbWl0cyB3aGVuIHRoZSBsb2NhbGUgY2hhbmdlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBsb2NhbGVDaGFuZ2VzKCkgeyByZXR1cm4gdGhpcy5fbG9jYWxlQ2hhbmdlczsgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGVtcHRzIHRvIGRlc2VyaWFsaXplIGEgdmFsdWUgdG8gYSB2YWxpZCBkYXRlIG9iamVjdC4gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBwYXJzaW5nIGluIHRoYXQKICAgICAgICAgKiBkZXNlcmlhbGl6ZSBzaG91bGQgb25seSBhY2NlcHQgbm9uLWFtYmlndW91cywgbG9jYWxlLWluZGVwZW5kZW50IGZvcm1hdHMgKGUuZy4gYSBJU08gODYwMQogICAgICAgICAqIHN0cmluZykuIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGFsbG93IGFueSBkZXNlcmlhbGl6YXRpb24sIGl0IHNpbXBseSBjaGVja3MgdGhhdAogICAgICAgICAqIHRoZSBnaXZlbiB2YWx1ZSBpcyBhbHJlYWR5IGEgdmFsaWQgZGF0ZSBvYmplY3Qgb3IgbnVsbC4gVGhlIGA8bWF0LWRhdGVwaWNrZXI+YCB3aWxsIGNhbGwgdGhpcwogICAgICAgICAqIG1ldGhvZCBvbiBhbGwgb2YgaXRzIGBcQElucHV0KClgIHByb3BlcnRpZXMgdGhhdCBhY2NlcHQgZGF0ZXMuIEl0IGlzIHRoZXJlZm9yZSBwb3NzaWJsZSB0bwogICAgICAgICAqIHN1cHBvcnQgcGFzc2luZyB2YWx1ZXMgZnJvbSB5b3VyIGJhY2tlbmQgZGlyZWN0bHkgdG8gdGhlc2UgcHJvcGVydGllcyBieSBvdmVycmlkaW5nIHRoaXMgbWV0aG9kCiAgICAgICAgICogdG8gYWxzbyBkZXNlcmlhbGl6ZSB0aGUgZm9ybWF0IHVzZWQgYnkgeW91ciBiYWNrZW5kLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlIHRvIGJlIGRlc2VyaWFsaXplZCBpbnRvIGEgZGF0ZSBvYmplY3QuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIGRlc2VyaWFsaXplZCBkYXRlIG9iamVjdCwgZWl0aGVyIGEgdmFsaWQgZGF0ZSwgbnVsbCBpZiB0aGUgdmFsdWUgY2FuIGJlCiAgICAgICAgICogICAgIGRlc2VyaWFsaXplZCBpbnRvIGEgbnVsbCBkYXRlIChlLmcuIHRoZSBlbXB0eSBzdHJpbmcpLCBvciBhbiBpbnZhbGlkIGRhdGUuCiAgICAgICAgICovCiAgICAgICAgZGVzZXJpYWxpemUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwgfHwgdGhpcy5pc0RhdGVJbnN0YW5jZSh2YWx1ZSkgJiYgdGhpcy5pc1ZhbGlkKHZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmludmFsaWQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgbG9jYWxlIHVzZWQgZm9yIGFsbCBkYXRlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGxvY2FsZSBUaGUgbmV3IGxvY2FsZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldExvY2FsZShsb2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgICAgIHRoaXMuX2xvY2FsZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wYXJlcyB0d28gZGF0ZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSBmaXJzdCBUaGUgZmlyc3QgZGF0ZSB0byBjb21wYXJlLgogICAgICAgICAqIEBwYXJhbSB7P30gc2Vjb25kIFRoZSBzZWNvbmQgZGF0ZSB0byBjb21wYXJlLgogICAgICAgICAqIEByZXR1cm4gez99IDAgaWYgdGhlIGRhdGVzIGFyZSBlcXVhbCwgYSBudW1iZXIgbGVzcyB0aGFuIDAgaWYgdGhlIGZpcnN0IGRhdGUgaXMgZWFybGllciwKICAgICAgICAgKiAgICAgYSBudW1iZXIgZ3JlYXRlciB0aGFuIDAgaWYgdGhlIGZpcnN0IGRhdGUgaXMgbGF0ZXIuCiAgICAgICAgICovCiAgICAgICAgY29tcGFyZURhdGUoZmlyc3QsIHNlY29uZCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRZZWFyKGZpcnN0KSAtIHRoaXMuZ2V0WWVhcihzZWNvbmQpIHx8CiAgICAgICAgICAgICAgICB0aGlzLmdldE1vbnRoKGZpcnN0KSAtIHRoaXMuZ2V0TW9udGgoc2Vjb25kKSB8fAogICAgICAgICAgICAgICAgdGhpcy5nZXREYXRlKGZpcnN0KSAtIHRoaXMuZ2V0RGF0ZShzZWNvbmQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgaWYgdHdvIGRhdGVzIGFyZSBlcXVhbC4KICAgICAgICAgKiBAcGFyYW0gez99IGZpcnN0IFRoZSBmaXJzdCBkYXRlIHRvIGNoZWNrLgogICAgICAgICAqIEBwYXJhbSB7P30gc2Vjb25kIFRoZSBzZWNvbmQgZGF0ZSB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSB0d28gZGF0ZXMgYXJlIGVxdWFsLgogICAgICAgICAqICAgICBOdWxsIGRhdGVzIGFyZSBjb25zaWRlcmVkIGVxdWFsIHRvIG90aGVyIG51bGwgZGF0ZXMuCiAgICAgICAgICovCiAgICAgICAgc2FtZURhdGUoZmlyc3QsIHNlY29uZCkgewogICAgICAgICAgICBpZiAoZmlyc3QgJiYgc2Vjb25kKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgZmlyc3RWYWxpZCA9IHRoaXMuaXNWYWxpZChmaXJzdCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgc2Vjb25kVmFsaWQgPSB0aGlzLmlzVmFsaWQoc2Vjb25kKTsKICAgICAgICAgICAgICAgIGlmIChmaXJzdFZhbGlkICYmIHNlY29uZFZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0aGlzLmNvbXBhcmVEYXRlKGZpcnN0LCBzZWNvbmQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZpcnN0VmFsaWQgPT0gc2Vjb25kVmFsaWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZpcnN0ID09IHNlY29uZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xhbXAgdGhlIGdpdmVuIGRhdGUgYmV0d2VlbiBtaW4gYW5kIG1heCBkYXRlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGRhdGUgVGhlIGRhdGUgdG8gY2xhbXAuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbWluIFRoZSBtaW5pbXVtIHZhbHVlIHRvIGFsbG93LiBJZiBudWxsIG9yIG9taXR0ZWQgbm8gbWluIGlzIGVuZm9yY2VkLgogICAgICAgICAqIEBwYXJhbSB7Pz19IG1heCBUaGUgbWF4aW11bSB2YWx1ZSB0byBhbGxvdy4gSWYgbnVsbCBvciBvbWl0dGVkIG5vIG1heCBpcyBlbmZvcmNlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBgbWluYCBpZiBgZGF0ZWAgaXMgbGVzcyB0aGFuIGBtaW5gLCBgbWF4YCBpZiBkYXRlIGlzIGdyZWF0ZXIgdGhhbiBgbWF4YCwKICAgICAgICAgKiAgICAgb3RoZXJ3aXNlIGBkYXRlYC4KICAgICAgICAgKi8KICAgICAgICBjbGFtcERhdGUoZGF0ZSwgbWluLCBtYXgpIHsKICAgICAgICAgICAgaWYgKG1pbiAmJiB0aGlzLmNvbXBhcmVEYXRlKGRhdGUsIG1pbikgPCAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWluOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChtYXggJiYgdGhpcy5jb21wYXJlRGF0ZShkYXRlLCBtYXgpID4gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG1heDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZGF0ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9kYXRldGltZS9kYXRlLWZvcm1hdHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTUFUX0RBVEVfRk9STUFUUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWRhdGUtZm9ybWF0cycpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvZGF0ZXRpbWUvbmF0aXZlLWRhdGUtYWRhcHRlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBUT0RPKG1tYWxlcmJhKTogUmVtb3ZlIHdoZW4gd2Ugbm8gbG9uZ2VyIHN1cHBvcnQgc2FmYXJpIDkuCiAgICAvKioKICAgICAqIFdoZXRoZXIgdGhlIGJyb3dzZXIgc3VwcG9ydHMgdGhlIEludGwgQVBJLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBTVVBQT1JUU19JTlRMX0FQSTsKICAgIC8vIFdlIG5lZWQgYSB0cnkvY2F0Y2ggYXJvdW5kIHRoZSByZWZlcmVuY2UgdG8gYEludGxgLCBiZWNhdXNlIGFjY2Vzc2luZyBpdCBpbiBzb21lIGNhc2VzIGNhbgogICAgLy8gY2F1c2UgSUUgdG8gdGhyb3cuIFRoZXNlIGNhc2VzIGFyZSB0aWVkIHRvIHBhcnRpY3VsYXIgdmVyc2lvbnMgb2YgV2luZG93cyBhbmQgY2FuIGhhcHBlbiBpZgogICAgLy8gdGhlIGNvbnN1bWVyIGlzIHByb3ZpZGluZyBhIHBvbHlmaWxsZWQgYE1hcGAuIFNlZToKICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvQ2hha3JhQ29yZS9pc3N1ZXMvMzE4OQogICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTU2ODcKICAgIHRyeSB7CiAgICAgICAgU1VQUE9SVFNfSU5UTF9BUEkgPSB0eXBlb2YgSW50bCAhPSAndW5kZWZpbmVkJzsKICAgIH0KICAgIGNhdGNoIChfYSkgewogICAgICAgIFNVUFBPUlRTX0lOVExfQVBJID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBkZWZhdWx0IG1vbnRoIG5hbWVzIHRvIHVzZSBpZiBJbnRsIEFQSSBpcyBub3QgYXZhaWxhYmxlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IERFRkFVTFRfTU9OVEhfTkFNRVMgPSB7CiAgICAgICAgJ2xvbmcnOiBbCiAgICAgICAgICAgICdKYW51YXJ5JywgJ0ZlYnJ1YXJ5JywgJ01hcmNoJywgJ0FwcmlsJywgJ01heScsICdKdW5lJywgJ0p1bHknLCAnQXVndXN0JywgJ1NlcHRlbWJlcicsCiAgICAgICAgICAgICdPY3RvYmVyJywgJ05vdmVtYmVyJywgJ0RlY2VtYmVyJwogICAgICAgIF0sCiAgICAgICAgJ3Nob3J0JzogWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsICdPY3QnLCAnTm92JywgJ0RlYyddLAogICAgICAgICduYXJyb3cnOiBbJ0onLCAnRicsICdNJywgJ0EnLCAnTScsICdKJywgJ0onLCAnQScsICdTJywgJ08nLCAnTicsICdEJ10KICAgIH07CiAgICBjb25zdCDJtTAkOSA9IC8qKgogICAgICogQHBhcmFtIHs/fSBpCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBpID0+IFN0cmluZyhpICsgMSk7CiAgICAvKioKICAgICAqIFRoZSBkZWZhdWx0IGRhdGUgbmFtZXMgdG8gdXNlIGlmIEludGwgQVBJIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgREVGQVVMVF9EQVRFX05BTUVTID0gcmFuZ2UoMzEsICjJtTAkOSkpOwogICAgLyoqCiAgICAgKiBUaGUgZGVmYXVsdCBkYXkgb2YgdGhlIHdlZWsgbmFtZXMgdG8gdXNlIGlmIEludGwgQVBJIGlzIG5vdCBhdmFpbGFibGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgREVGQVVMVF9EQVlfT0ZfV0VFS19OQU1FUyA9IHsKICAgICAgICAnbG9uZyc6IFsnU3VuZGF5JywgJ01vbmRheScsICdUdWVzZGF5JywgJ1dlZG5lc2RheScsICdUaHVyc2RheScsICdGcmlkYXknLCAnU2F0dXJkYXknXSwKICAgICAgICAnc2hvcnQnOiBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddLAogICAgICAgICduYXJyb3cnOiBbJ1MnLCAnTScsICdUJywgJ1cnLCAnVCcsICdGJywgJ1MnXQogICAgfTsKICAgIC8qKgogICAgICogTWF0Y2hlcyBzdHJpbmdzIHRoYXQgaGF2ZSB0aGUgZm9ybSBvZiBhIHZhbGlkIFJGQyAzMzM5IHN0cmluZwogICAgICogKGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzMzM5KS4gTm90ZSB0aGF0IHRoZSBzdHJpbmcgbWF5IG5vdCBhY3R1YWxseSBiZSBhIHZhbGlkIGRhdGUKICAgICAqIGJlY2F1c2UgdGhlIHJlZ2V4IHdpbGwgbWF0Y2ggc3RyaW5ncyBhbiB3aXRoIG91dCBvZiBib3VuZHMgbW9udGgsIGRhdGUsIGV0Yy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBJU09fODYwMV9SRUdFWCA9IC9eXGR7NH0tXGR7Mn0tXGR7Mn0oPzpUXGR7Mn06XGR7Mn06XGR7Mn0oPzpcLlxkKyk/KD86WnwoPzooPzpcK3wtKVxkezJ9OlxkezJ9KSk/KT8kLzsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBhcnJheSBhbmQgZmlsbHMgaXQgd2l0aCB2YWx1ZXMuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICogQHBhcmFtIHs/fSBsZW5ndGgKICAgICAqIEBwYXJhbSB7P30gdmFsdWVGdW5jdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmFuZ2UobGVuZ3RoLCB2YWx1ZUZ1bmN0aW9uKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHZhbHVlc0FycmF5ID0gQXJyYXkobGVuZ3RoKTsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgIHZhbHVlc0FycmF5W2ldID0gdmFsdWVGdW5jdGlvbihpKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHZhbHVlc0FycmF5OwogICAgfQogICAgLyoqCiAgICAgKiBBZGFwdHMgdGhlIG5hdGl2ZSBKUyBEYXRlIGZvciB1c2Ugd2l0aCBjZGstYmFzZWQgY29tcG9uZW50cyB0aGF0IHdvcmsgd2l0aCBkYXRlcy4KICAgICAqLwogICAgY2xhc3MgTmF0aXZlRGF0ZUFkYXB0ZXIgZXh0ZW5kcyBEYXRlQWRhcHRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtYXREYXRlTG9jYWxlCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG1hdERhdGVMb2NhbGUsIHBsYXRmb3JtKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRvIHVzZSBgdGltZVpvbmU6ICd1dGMnYCB3aXRoIGBJbnRsLkRhdGVUaW1lRm9ybWF0YCB3aGVuIGZvcm1hdHRpbmcgZGF0ZXMuCiAgICAgICAgICAgICAqIFdpdGhvdXQgdGhpcyBgSW50bC5EYXRlVGltZUZvcm1hdGAgc29tZXRpbWVzIGNob29zZXMgdGhlIHdyb25nIHRpbWVab25lLCB3aGljaCBjYW4gdGhyb3cgb2ZmCiAgICAgICAgICAgICAqIHRoZSByZXN1bHQuIChlLmcuIGluIHRoZSBlbi1VUyBsb2NhbGUgYG5ldyBEYXRlKDE4MDAsIDcsIDE0KS50b0xvY2FsZURhdGVTdHJpbmcoKWAKICAgICAgICAgICAgICogd2lsbCBwcm9kdWNlIGAnOC8xMy8xODAwJ2AuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFRPRE8obW1hbGVyYmEpOiBkcm9wIHRoaXMgdmFyaWFibGUuIEl0J3Mgbm90IGJlaW5nIHVzZWQgaW4gdGhlIGNvZGUgcmlnaHQgbm93LiBXZSdyZSBub3cKICAgICAgICAgICAgICogZ2V0dGluZyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZnJvbSBpdHMgdXRjIHJlcHJlc2VudGF0aW9uLiBXZSdyZSBrZWVwaW5nCiAgICAgICAgICAgICAqIGl0IGhlcmUgZm9yIHNvbWV0aW1lLCBqdXN0IGZvciBwcmVjYXV0aW9uLCBpbiBjYXNlIHdlIGRlY2lkZSB0byByZXZlcnQgc29tZSBvZiB0aGVzZSBjaGFuZ2VzCiAgICAgICAgICAgICAqIHRob3VnaC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudXNlVXRjRm9yRGlzcGxheSA9IHRydWU7CiAgICAgICAgICAgIHN1cGVyLnNldExvY2FsZShtYXREYXRlTG9jYWxlKTsKICAgICAgICAgICAgLy8gSUUgZG9lcyBpdHMgb3duIHRpbWUgem9uZSBjb3JyZWN0aW9uLCBzbyB3ZSBkaXNhYmxlIHRoaXMgb24gSUUuCiAgICAgICAgICAgIHRoaXMudXNlVXRjRm9yRGlzcGxheSA9ICFwbGF0Zm9ybS5UUklERU5UOwogICAgICAgICAgICB0aGlzLl9jbGFtcERhdGUgPSBwbGF0Zm9ybS5UUklERU5UIHx8IHBsYXRmb3JtLkVER0U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0WWVhcihkYXRlKSB7CiAgICAgICAgICAgIHJldHVybiBkYXRlLmdldEZ1bGxZZWFyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TW9udGgoZGF0ZSkgewogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXRNb250aCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldERhdGUoZGF0ZSkgewogICAgICAgICAgICByZXR1cm4gZGF0ZS5nZXREYXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0RGF5T2ZXZWVrKGRhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIGRhdGUuZ2V0RGF5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldE1vbnRoTmFtZXMoc3R5bGUpIHsKICAgICAgICAgICAgaWYgKFNVUFBPUlRTX0lOVExfQVBJKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkdGYgPSBuZXcgSW50bC5EYXRlVGltZUZvcm1hdCh0aGlzLmxvY2FsZSwgeyBtb250aDogc3R5bGUsIHRpbWVab25lOiAndXRjJyB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZSgxMiwgKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpID0+IHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChkdGYsIG5ldyBEYXRlKDIwMTcsIGksIDEpKSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gREVGQVVMVF9NT05USF9OQU1FU1tzdHlsZV07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0RGF0ZU5hbWVzKCkgewogICAgICAgICAgICBpZiAoU1VQUE9SVFNfSU5UTF9BUEkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCB7IGRheTogJ251bWVyaWMnLCB0aW1lWm9uZTogJ3V0YycgfSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmFuZ2UoMzEsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgaSA9PiB0aGlzLl9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyh0aGlzLl9mb3JtYXQoZHRmLCBuZXcgRGF0ZSgyMDE3LCAwLCBpICsgMSkpKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBERUZBVUxUX0RBVEVfTkFNRVM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3R5bGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldERheU9mV2Vla05hbWVzKHN0eWxlKSB7CiAgICAgICAgICAgIGlmIChTVVBQT1JUU19JTlRMX0FQSSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIHsgd2Vla2RheTogc3R5bGUsIHRpbWVab25lOiAndXRjJyB9KTsKICAgICAgICAgICAgICAgIHJldHVybiByYW5nZSg3LCAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGkgPT4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnModGhpcy5fZm9ybWF0KGR0ZiwgbmV3IERhdGUoMjAxNywgMCwgaSArIDEpKSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gREVGQVVMVF9EQVlfT0ZfV0VFS19OQU1FU1tzdHlsZV07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0WWVhck5hbWUoZGF0ZSkgewogICAgICAgICAgICBpZiAoU1VQUE9SVFNfSU5UTF9BUEkpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGR0ZiA9IG5ldyBJbnRsLkRhdGVUaW1lRm9ybWF0KHRoaXMubG9jYWxlLCB7IHllYXI6ICdudW1lcmljJywgdGltZVpvbmU6ICd1dGMnIH0pOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChkdGYsIGRhdGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gU3RyaW5nKHRoaXMuZ2V0WWVhcihkYXRlKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Rmlyc3REYXlPZldlZWsoKSB7CiAgICAgICAgICAgIC8vIFdlIGNhbid0IHRlbGwgdXNpbmcgbmF0aXZlIEpTIERhdGUgd2hhdCB0aGUgZmlyc3QgZGF5IG9mIHRoZSB3ZWVrIGlzLCB3ZSBkZWZhdWx0IHRvIFN1bmRheS4KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TnVtRGF5c0luTW9udGgoZGF0ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXREYXRlKHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKGRhdGUpLCB0aGlzLmdldE1vbnRoKGRhdGUpICsgMSwgMCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsb25lKGRhdGUpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKGRhdGUuZ2V0VGltZSgpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB5ZWFyCiAgICAgICAgICogQHBhcmFtIHs/fSBtb250aAogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlRGF0ZSh5ZWFyLCBtb250aCwgZGF0ZSkgewogICAgICAgICAgICAvLyBDaGVjayBmb3IgaW52YWxpZCBtb250aCBhbmQgZGF0ZSAoZXhjZXB0IHVwcGVyIGJvdW5kIG9uIGRhdGUgd2hpY2ggd2UgaGF2ZSB0byBjaGVjayBhZnRlcgogICAgICAgICAgICAvLyBjcmVhdGluZyB0aGUgRGF0ZSkuCiAgICAgICAgICAgIGlmIChtb250aCA8IDAgfHwgbW9udGggPiAxMSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYEludmFsaWQgbW9udGggaW5kZXggIiR7bW9udGh9Ii4gTW9udGggaW5kZXggaGFzIHRvIGJlIGJldHdlZW4gMCBhbmQgMTEuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGUgPCAxKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgSW52YWxpZCBkYXRlICIke2RhdGV9Ii4gRGF0ZSBoYXMgdG8gYmUgZ3JlYXRlciB0aGFuIDAuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh5ZWFyLCBtb250aCwgZGF0ZSk7CiAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGRhdGUgd2Fzbid0IGFib3ZlIHRoZSB1cHBlciBib3VuZCBmb3IgdGhlIG1vbnRoLCBjYXVzaW5nIHRoZSBtb250aCB0byBvdmVyZmxvdwogICAgICAgICAgICBpZiAocmVzdWx0LmdldE1vbnRoKCkgIT0gbW9udGgpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBJbnZhbGlkIGRhdGUgIiR7ZGF0ZX0iIGZvciBtb250aCB3aXRoIGluZGV4ICIke21vbnRofSIuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b2RheSgpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHBhcnNlKHZhbHVlKSB7CiAgICAgICAgICAgIC8vIFdlIGhhdmUgbm8gd2F5IHVzaW5nIHRoZSBuYXRpdmUgSlMgRGF0ZSB0byBzZXQgdGhlIHBhcnNlIGZvcm1hdCBvciBsb2NhbGUsIHNvIHdlIGlnbm9yZSB0aGVzZQogICAgICAgICAgICAvLyBwYXJhbWV0ZXJzLgogICAgICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09ICdudW1iZXInKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IERhdGUodmFsdWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB2YWx1ZSA/IG5ldyBEYXRlKERhdGUucGFyc2UodmFsdWUpKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZGlzcGxheUZvcm1hdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9ybWF0KGRhdGUsIGRpc3BsYXlGb3JtYXQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmlzVmFsaWQoZGF0ZSkpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdOYXRpdmVEYXRlQWRhcHRlcjogQ2Fubm90IGZvcm1hdCBpbnZhbGlkIGRhdGUuJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKFNVUFBPUlRTX0lOVExfQVBJKSB7CiAgICAgICAgICAgICAgICAvLyBPbiBJRSBhbmQgRWRnZSB0aGUgaTE4biBBUEkgd2lsbCB0aHJvdyBhIGhhcmQgZXJyb3IgdGhhdCBjYW4gY3Jhc2ggdGhlIGVudGlyZSBhcHAKICAgICAgICAgICAgICAgIC8vIGlmIHdlIGF0dGVtcHQgdG8gZm9ybWF0IGEgZGF0ZSB3aG9zZSB5ZWFyIGlzIGxlc3MgdGhhbiAxIG9yIGdyZWF0ZXIgdGhhbiA5OTk5LgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NsYW1wRGF0ZSAmJiAoZGF0ZS5nZXRGdWxsWWVhcigpIDwgMSB8fCBkYXRlLmdldEZ1bGxZZWFyKCkgPiA5OTk5KSkgewogICAgICAgICAgICAgICAgICAgIGRhdGUgPSB0aGlzLmNsb25lKGRhdGUpOwogICAgICAgICAgICAgICAgICAgIGRhdGUuc2V0RnVsbFllYXIoTWF0aC5tYXgoMSwgTWF0aC5taW4oOTk5OSwgZGF0ZS5nZXRGdWxsWWVhcigpKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGlzcGxheUZvcm1hdCksIHsgdGltZVpvbmU6ICd1dGMnIH0pOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZHRmID0gbmV3IEludGwuRGF0ZVRpbWVGb3JtYXQodGhpcy5sb2NhbGUsIGRpc3BsYXlGb3JtYXQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0cmlwRGlyZWN0aW9uYWxpdHlDaGFyYWN0ZXJzKHRoaXMuX2Zvcm1hdChkdGYsIGRhdGUpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fc3RyaXBEaXJlY3Rpb25hbGl0eUNoYXJhY3RlcnMoZGF0ZS50b0RhdGVTdHJpbmcoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30geWVhcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZENhbGVuZGFyWWVhcnMoZGF0ZSwgeWVhcnMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWRkQ2FsZW5kYXJNb250aHMoZGF0ZSwgeWVhcnMgKiAxMik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbW9udGhzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRDYWxlbmRhck1vbnRocyhkYXRlLCBtb250aHMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbmV3RGF0ZSA9IHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKGRhdGUpLCB0aGlzLmdldE1vbnRoKGRhdGUpICsgbW9udGhzLCB0aGlzLmdldERhdGUoZGF0ZSkpOwogICAgICAgICAgICAvLyBJdCdzIHBvc3NpYmxlIHRvIHdpbmQgdXAgaW4gdGhlIHdyb25nIG1vbnRoIGlmIHRoZSBvcmlnaW5hbCBtb250aCBoYXMgbW9yZSBkYXlzIHRoYW4gdGhlIG5ldwogICAgICAgICAgICAvLyBtb250aC4gSW4gdGhpcyBjYXNlIHdlIHdhbnQgdG8gZ28gdG8gdGhlIGxhc3QgZGF5IG9mIHRoZSBkZXNpcmVkIG1vbnRoLgogICAgICAgICAgICAvLyBOb3RlOiB0aGUgYWRkaXRpb25hbCArIDEyICUgMTIgZW5zdXJlcyB3ZSBlbmQgdXAgd2l0aCBhIHBvc2l0aXZlIG51bWJlciwgc2luY2UgSlMgJSBkb2Vzbid0CiAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGlzLgogICAgICAgICAgICBpZiAodGhpcy5nZXRNb250aChuZXdEYXRlKSAhPSAoKHRoaXMuZ2V0TW9udGgoZGF0ZSkgKyBtb250aHMpICUgMTIgKyAxMikgJSAxMikgewogICAgICAgICAgICAgICAgbmV3RGF0ZSA9IHRoaXMuX2NyZWF0ZURhdGVXaXRoT3ZlcmZsb3codGhpcy5nZXRZZWFyKG5ld0RhdGUpLCB0aGlzLmdldE1vbnRoKG5ld0RhdGUpLCAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbmV3RGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXlzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRDYWxlbmRhckRheXMoZGF0ZSwgZGF5cykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY3JlYXRlRGF0ZVdpdGhPdmVyZmxvdyh0aGlzLmdldFllYXIoZGF0ZSksIHRoaXMuZ2V0TW9udGgoZGF0ZSksIHRoaXMuZ2V0RGF0ZShkYXRlKSArIGRheXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvSXNvODYwMShkYXRlKSB7CiAgICAgICAgICAgIHJldHVybiBbCiAgICAgICAgICAgICAgICBkYXRlLmdldFVUQ0Z1bGxZZWFyKCksCiAgICAgICAgICAgICAgICB0aGlzLl8yZGlnaXQoZGF0ZS5nZXRVVENNb250aCgpICsgMSksCiAgICAgICAgICAgICAgICB0aGlzLl8yZGlnaXQoZGF0ZS5nZXRVVENEYXRlKCkpCiAgICAgICAgICAgIF0uam9pbignLScpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBnaXZlbiB2YWx1ZSBpZiBnaXZlbiBhIHZhbGlkIERhdGUgb3IgbnVsbC4gRGVzZXJpYWxpemVzIHZhbGlkIElTTyA4NjAxIHN0cmluZ3MKICAgICAgICAgKiAoaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0KSBpbnRvIHZhbGlkIERhdGVzIGFuZCBlbXB0eSBzdHJpbmcgaW50byBudWxsLiBSZXR1cm5zIGFuCiAgICAgICAgICogaW52YWxpZCBkYXRlIGZvciBhbGwgb3RoZXIgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlc2VyaWFsaXplKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICBpZiAoIXZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBUaGUgYERhdGVgIGNvbnN0cnVjdG9yIGFjY2VwdHMgZm9ybWF0cyBvdGhlciB0aGFuIElTTyA4NjAxLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGUKICAgICAgICAgICAgICAgIC8vIHN0cmluZyBpcyB0aGUgcmlnaHQgZm9ybWF0IGZpcnN0LgogICAgICAgICAgICAgICAgaWYgKElTT184NjAxX1JFR0VYLnRlc3QodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBkYXRlID0gbmV3IERhdGUodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzVmFsaWQoZGF0ZSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdXBlci5kZXNlcmlhbGl6ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc0RhdGVJbnN0YW5jZShvYmopIHsKICAgICAgICAgICAgcmV0dXJuIG9iaiBpbnN0YW5jZW9mIERhdGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaXNWYWxpZChkYXRlKSB7CiAgICAgICAgICAgIHJldHVybiAhaXNOYU4oZGF0ZS5nZXRUaW1lKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGludmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0ZShOYU4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZGF0ZSBidXQgYWxsb3dzIHRoZSBtb250aCBhbmQgZGF0ZSB0byBvdmVyZmxvdy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30geWVhcgogICAgICAgICAqIEBwYXJhbSB7P30gbW9udGgKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVEYXRlV2l0aE92ZXJmbG93KHllYXIsIG1vbnRoLCBkYXRlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gbmV3IERhdGUoeWVhciwgbW9udGgsIGRhdGUpOwogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGNvcnJlY3QgZm9yIHRoZSBmYWN0IHRoYXQgSlMgbmF0aXZlIERhdGUgdHJlYXRzIHllYXJzIGluIHJhbmdlIFswLCA5OV0gYXMKICAgICAgICAgICAgLy8gYWJicmV2aWF0aW9ucyBmb3IgMTl4eC4KICAgICAgICAgICAgaWYgKHllYXIgPj0gMCAmJiB5ZWFyIDwgMTAwKSB7CiAgICAgICAgICAgICAgICByZXN1bHQuc2V0RnVsbFllYXIodGhpcy5nZXRZZWFyKHJlc3VsdCkgLSAxOTAwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQYWRzIGEgbnVtYmVyIHRvIG1ha2UgaXQgdHdvIGRpZ2l0cy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbiBUaGUgbnVtYmVyIHRvIHBhZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcGFkZGVkIG51bWJlci4KICAgICAgICAgKi8KICAgICAgICBfMmRpZ2l0KG4pIHsKICAgICAgICAgICAgcmV0dXJuICgnMDAnICsgbikuc2xpY2UoLTIpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdHJpcCBvdXQgdW5pY29kZSBMVFIgYW5kIFJUTCBjaGFyYWN0ZXJzLiBFZGdlIGFuZCBJRSBpbnNlcnQgdGhlc2UgaW50byBmb3JtYXR0ZWQgZGF0ZXMgd2hpbGUKICAgICAgICAgKiBvdGhlciBicm93c2VycyBkbyBub3QuIFdlIHJlbW92ZSB0aGVtIHRvIG1ha2Ugb3V0cHV0IGNvbnNpc3RlbnQgYW5kIGJlY2F1c2UgdGhleSBpbnRlcmZlcmUgd2l0aAogICAgICAgICAqIGRhdGUgcGFyc2luZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gc3RyIFRoZSBzdHJpbmcgdG8gc3RyaXAgZGlyZWN0aW9uIGNoYXJhY3RlcnMgZnJvbS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgc3RyaXBwZWQgc3RyaW5nLgogICAgICAgICAqLwogICAgICAgIF9zdHJpcERpcmVjdGlvbmFsaXR5Q2hhcmFjdGVycyhzdHIpIHsKICAgICAgICAgICAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bXHUyMDBlXHUyMDBmXS9nLCAnJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gY29udmVydGluZyBEYXRlIG9iamVjdCB0byBzdHJpbmcsIGphdmFzY3JpcHQgYnVpbHQtaW4gZnVuY3Rpb25zIG1heSByZXR1cm4gd3JvbmcKICAgICAgICAgKiByZXN1bHRzIGJlY2F1c2UgaXQgYXBwbGllcyBpdHMgaW50ZXJuYWwgRFNUIHJ1bGVzLiBUaGUgRFNUIHJ1bGVzIGFyb3VuZCB0aGUgd29ybGQgY2hhbmdlCiAgICAgICAgICogdmVyeSBmcmVxdWVudGx5LCBhbmQgdGhlIGN1cnJlbnQgdmFsaWQgcnVsZSBpcyBub3QgYWx3YXlzIHZhbGlkIGluIHByZXZpb3VzIHllYXJzIHRob3VnaC4KICAgICAgICAgKiBXZSB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0gYnVpbGRpbmcgYSBuZXcgRGF0ZSBvYmplY3Qgd2hpY2ggaGFzIGl0cyBpbnRlcm5hbCBVVEMKICAgICAgICAgKiByZXByZXNlbnRhdGlvbiB3aXRoIHRoZSBsb2NhbCBkYXRlIGFuZCB0aW1lLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBkdGYgSW50bC5EYXRlVGltZUZvcm1hdCBvYmplY3QsIGNvbnRhaW5nIHRoZSBkZXNpcmVkIHN0cmluZyBmb3JtYXQuIEl0IG11c3QgaGF2ZQogICAgICAgICAqICAgIHRpbWVab25lIHNldCB0byAndXRjJyB0byB3b3JrIGZpbmUuCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRlIERhdGUgZnJvbSB3aGljaCB3ZSB3YW50IHRvIGdldCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGFjY29yZGluZyB0byBkdGYKICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIERhdGUgb2JqZWN0IHdpdGggaXRzIFVUQyByZXByZXNlbnRhdGlvbiBiYXNlZCBvbiB0aGUgcGFzc2VkIGluIGRhdGUgaW5mbwogICAgICAgICAqLwogICAgICAgIF9mb3JtYXQoZHRmLCBkYXRlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKERhdGUuVVRDKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSwgZGF0ZS5nZXRIb3VycygpLCBkYXRlLmdldE1pbnV0ZXMoKSwgZGF0ZS5nZXRTZWNvbmRzKCksIGRhdGUuZ2V0TWlsbGlzZWNvbmRzKCkpKTsKICAgICAgICAgICAgcmV0dXJuIGR0Zi5mb3JtYXQoZCk7CiAgICAgICAgfQogICAgfQogICAgTmF0aXZlRGF0ZUFkYXB0ZXIuybVmYWMgPSBmdW5jdGlvbiBOYXRpdmVEYXRlQWRhcHRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOYXRpdmVEYXRlQWRhcHRlcikoybXJtWluamVjdChNQVRfREFURV9MT0NBTEUsIDgpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSk7IH07CiAgICBOYXRpdmVEYXRlQWRhcHRlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBOYXRpdmVEYXRlQWRhcHRlciwgZmFjdG9yeTogTmF0aXZlRGF0ZUFkYXB0ZXIuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE5hdGl2ZURhdGVBZGFwdGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9EQVRFX0xPQ0FMRSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvZGF0ZXRpbWUvbmF0aXZlLWRhdGUtZm9ybWF0cy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE1BVF9OQVRJVkVfREFURV9GT1JNQVRTID0gewogICAgICAgIHBhcnNlOiB7CiAgICAgICAgICAgIGRhdGVJbnB1dDogbnVsbCwKICAgICAgICB9LAogICAgICAgIGRpc3BsYXk6IHsKICAgICAgICAgICAgZGF0ZUlucHV0OiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdudW1lcmljJywgZGF5OiAnbnVtZXJpYycgfSwKICAgICAgICAgICAgbW9udGhZZWFyTGFiZWw6IHsgeWVhcjogJ251bWVyaWMnLCBtb250aDogJ3Nob3J0JyB9LAogICAgICAgICAgICBkYXRlQTExeUxhYmVsOiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJywgZGF5OiAnbnVtZXJpYycgfSwKICAgICAgICAgICAgbW9udGhZZWFyQTExeUxhYmVsOiB7IHllYXI6ICdudW1lcmljJywgbW9udGg6ICdsb25nJyB9LAogICAgICAgIH0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9kYXRldGltZS9pbmRleC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBOYXRpdmVEYXRlTW9kdWxlIHsKICAgIH0KICAgIE5hdGl2ZURhdGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBOYXRpdmVEYXRlTW9kdWxlIH0pOwogICAgTmF0aXZlRGF0ZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE5hdGl2ZURhdGVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmF0aXZlRGF0ZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgIHsgcHJvdmlkZTogRGF0ZUFkYXB0ZXIsIHVzZUNsYXNzOiBOYXRpdmVEYXRlQWRhcHRlciB9LAogICAgICAgIF0sIGltcG9ydHM6IFtbUGxhdGZvcm1Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE5hdGl2ZURhdGVNb2R1bGUsIHsgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW1BsYXRmb3JtTW9kdWxlXTsgfSB9KTsgfSkoKTsKICAgIGNvbnN0IMm1MCQxJDMgPSBNQVRfTkFUSVZFX0RBVEVfRk9STUFUUzsKICAgIGNsYXNzIE1hdE5hdGl2ZURhdGVNb2R1bGUgewogICAgfQogICAgTWF0TmF0aXZlRGF0ZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdE5hdGl2ZURhdGVNb2R1bGUgfSk7CiAgICBNYXROYXRpdmVEYXRlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0TmF0aXZlRGF0ZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXROYXRpdmVEYXRlTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1BVF9EQVRFX0ZPUk1BVFMsIHVzZVZhbHVlOiDJtTAkMSQzIH1dLCBpbXBvcnRzOiBbW05hdGl2ZURhdGVNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdE5hdGl2ZURhdGVNb2R1bGUsIHsgaW1wb3J0czogW05hdGl2ZURhdGVNb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvZXJyb3IvZXJyb3Itb3B0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEVycm9yIHN0YXRlIG1hdGNoZXIgdGhhdCBtYXRjaGVzIHdoZW4gYSBjb250cm9sIGlzIGludmFsaWQgYW5kIGRpcnR5LgogICAgICovCiAgICBjbGFzcyBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IGZvcm0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzRXJyb3JTdGF0ZShjb250cm9sLCBmb3JtKSB7CiAgICAgICAgICAgIHJldHVybiAhIShjb250cm9sICYmIGNvbnRyb2wuaW52YWxpZCAmJiAoY29udHJvbC5kaXJ0eSB8fCAoZm9ybSAmJiBmb3JtLnN1Ym1pdHRlZCkpKTsKICAgICAgICB9CiAgICB9CiAgICBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyLsm1ZmFjID0gZnVuY3Rpb24gU2hvd09uRGlydHlFcnJvclN0YXRlTWF0Y2hlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyKSgpOyB9OwogICAgU2hvd09uRGlydHlFcnJvclN0YXRlTWF0Y2hlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyLCBmYWN0b3J5OiBTaG93T25EaXJ0eUVycm9yU3RhdGVNYXRjaGVyLsm1ZmFjIH0pOwogICAgLyoqCiAgICAgKiBQcm92aWRlciB0aGF0IGRlZmluZXMgaG93IGZvcm0gY29udHJvbHMgYmVoYXZlIHdpdGggcmVnYXJkcyB0byBkaXNwbGF5aW5nIGVycm9yIG1lc3NhZ2VzLgogICAgICovCiAgICBjbGFzcyBFcnJvclN0YXRlTWF0Y2hlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHBhcmFtIHs/fSBmb3JtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc0Vycm9yU3RhdGUoY29udHJvbCwgZm9ybSkgewogICAgICAgICAgICByZXR1cm4gISEoY29udHJvbCAmJiBjb250cm9sLmludmFsaWQgJiYgKGNvbnRyb2wudG91Y2hlZCB8fCAoZm9ybSAmJiBmb3JtLnN1Ym1pdHRlZCkpKTsKICAgICAgICB9CiAgICB9CiAgICBFcnJvclN0YXRlTWF0Y2hlci7JtWZhYyA9IGZ1bmN0aW9uIEVycm9yU3RhdGVNYXRjaGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEVycm9yU3RhdGVNYXRjaGVyKSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEVycm9yU3RhdGVNYXRjaGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gRXJyb3JTdGF0ZU1hdGNoZXJfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBFcnJvclN0YXRlTWF0Y2hlcigpOyB9LCB0b2tlbjogRXJyb3JTdGF0ZU1hdGNoZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2dlc3R1cmVzL2dlc3R1cmUtY29uZmlnLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSBvcHRpb25zIHRvIHRoZSBIYW1tZXJqcyBpbnN0YW5jZS4KICAgICAqIE1vcmUgaW5mbyBhdCBodHRwOi8vaGFtbWVyanMuZ2l0aHViLmlvL2FwaS8uCiAgICAgKiBAZGVwcmVjYXRlZCBObyBsb25nZXIgYmVpbmcgdXNlZC4gVG8gYmUgcmVtb3ZlZC4KICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9IQU1NRVJfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX0hBTU1FUl9PUFRJT05TJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBBTkdVTEFSX01BVEVSSUFMX1NVUFBPUlRFRF9IQU1NRVJfR0VTVFVSRVMgPSBbCiAgICAgICAgJ2xvbmdwcmVzcycsCiAgICAgICAgJ3NsaWRlJywKICAgICAgICAnc2xpZGVzdGFydCcsCiAgICAgICAgJ3NsaWRlZW5kJywKICAgICAgICAnc2xpZGVyaWdodCcsCiAgICAgICAgJ3NsaWRlbGVmdCcKICAgIF07CiAgICBjb25zdCDJtTAkMiQyID0gLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7IH0sIMm1MSQ1ID0gLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoKSA9PiB7IH07CiAgICAvKioKICAgICAqIEZha2UgSGFtbWVySW5zdGFuY2UgdGhhdCBpcyB1c2VkIHdoZW4gYSBIYW1tZXIgaW5zdGFuY2UgaXMgcmVxdWVzdGVkIHdoZW4gSGFtbWVySlMgaGFzIG5vdAogICAgICogYmVlbiBsb2FkZWQgb24gdGhlIHBhZ2UuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3Qgbm9vcEhhbW1lckluc3RhbmNlID0gewogICAgICAgIG9uOiAoybUwJDIkMiksCiAgICAgICAgb2ZmOiAoybUxJDUpLAogICAgfTsKICAgIC8qKgogICAgICogQWRqdXN0cyBjb25maWd1cmF0aW9uIG9mIG91ciBnZXN0dXJlIGxpYnJhcnksIEhhbW1lci4KICAgICAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBiZWluZyB1c2VkLiBUbyBiZSByZW1vdmVkLgogICAgICogXEBicmVha2luZy1jaGFuZ2UgMTAuMC4wCiAgICAgKi8KICAgIGNsYXNzIEdlc3R1cmVDb25maWcgZXh0ZW5kcyBIYW1tZXJHZXN0dXJlQ29uZmlnIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBfaGFtbWVyT3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Pz19IF9jb21tb25Nb2R1bGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfaGFtbWVyT3B0aW9ucywgX2NvbW1vbk1vZHVsZSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9oYW1tZXJPcHRpb25zID0gX2hhbW1lck9wdGlvbnM7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBMaXN0IG9mIG5ldyBldmVudCBuYW1lcyB0byBhZGQgdG8gdGhlIGdlc3R1cmUgc3VwcG9ydCBsaXN0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmV2ZW50cyA9IEFOR1VMQVJfTUFURVJJQUxfU1VQUE9SVEVEX0hBTU1FUl9HRVNUVVJFUzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQnVpbGRzIEhhbW1lciBpbnN0YW5jZSBtYW51YWxseSB0byBhZGQgY3VzdG9tIHJlY29nbml6ZXJzIHRoYXQgbWF0Y2ggdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLgogICAgICAgICAqCiAgICAgICAgICogT3VyIGdlc3R1cmUgbmFtZXMgY29tZSBmcm9tIHRoZSBNYXRlcmlhbCBEZXNpZ24gZ2VzdHVyZXMgc3BlYzoKICAgICAgICAgKiBodHRwczovL21hdGVyaWFsLmlvL2Rlc2lnbi8jZ2VzdHVyZXMtdG91Y2gtbWVjaGFuaWNzCiAgICAgICAgICoKICAgICAgICAgKiBNb3JlIGluZm9ybWF0aW9uIG9uIGRlZmF1bHQgcmVjb2duaXplcnMgY2FuIGJlIGZvdW5kIGluIEhhbW1lciBkb2NzOgogICAgICAgICAqIGh0dHA6Ly9oYW1tZXJqcy5naXRodWIuaW8vcmVjb2duaXplci1wYW4vCiAgICAgICAgICogaHR0cDovL2hhbW1lcmpzLmdpdGh1Yi5pby9yZWNvZ25pemVyLXByZXNzLwogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50IEVsZW1lbnQgdG8gd2hpY2ggdG8gYXNzaWduIHRoZSBuZXcgSGFtbWVySlMgZ2VzdHVyZXMuCiAgICAgICAgICogQHJldHVybiB7P30gTmV3bHktY3JlYXRlZCBIYW1tZXJKUyBpbnN0YW5jZS4KICAgICAgICAgKi8KICAgICAgICBidWlsZEhhbW1lcihlbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGFtbWVyID0gdHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgPyAoKC8qKiBAdHlwZSB7P30gKi8gKHdpbmRvdykpKS5IYW1tZXIgOiBudWxsOwogICAgICAgICAgICBpZiAoIWhhbW1lcikgewogICAgICAgICAgICAgICAgLy8gSWYgSGFtbWVySlMgaXMgbm90IGxvYWRlZCBoZXJlLCByZXR1cm4gdGhlIG5vb3AgSGFtbWVySW5zdGFuY2UuIFRoaXMgaXMgbmVjZXNzYXJ5IHRvCiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCBvbWl0dGluZyBIYW1tZXJKUyBjb21wbGV0ZWx5IHdpbGwgbm90IGNhdXNlIGFueSBlcnJvcnMgd2hpbGUgKmFsc28qIHN1cHBvcnRpbmcKICAgICAgICAgICAgICAgIC8vIHRoZSBsYXp5LWxvYWRpbmcgb2YgSGFtbWVySlMgdmlhIHRoZSBIQU1NRVJfTE9BREVSIHRva2VuIGludHJvZHVjZWQgaW4gQW5ndWxhciA2LjEuCiAgICAgICAgICAgICAgICAvLyBCZWNhdXNlIHdlIGNhbid0IGRlcGVuZCBvbiBIQU1NRVJfTE9BREVSJ3MgZXhpc3RhbmNlIHVudGlsIDcuMCwgd2UgaGF2ZSB0byBhbHdheXMgc2V0CiAgICAgICAgICAgICAgICAvLyBgdGhpcy5ldmVudHNgIHRvIHRoZSBzZXQgd2Ugc3VwcG9ydCwgaW5zdGVhZCBvZiBjb25kaXRpb25hbGx5IHNldHRpbmcgaXQgdG8gYFtdYCBpZgogICAgICAgICAgICAgICAgLy8gYEhBTU1FUl9MT0FERVJgIGlzIHByZXNlbnQgKGFuZCB0aGVuIHRocm93aW5nIGFuIEVycm9yIGhlcmUgaWYgYHdpbmRvdy5IYW1tZXJgIGlzCiAgICAgICAgICAgICAgICAvLyB1bmRlZmluZWQpLgogICAgICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAgICAgICAgcmV0dXJuIG5vb3BIYW1tZXJJbnN0YW5jZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1jID0gbmV3IGhhbW1lcihlbGVtZW50LCB0aGlzLl9oYW1tZXJPcHRpb25zIHx8IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIC8vIERlZmF1bHQgSGFtbWVyIFJlY29nbml6ZXJzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhbiA9IG5ldyBoYW1tZXIuUGFuKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3dpcGUgPSBuZXcgaGFtbWVyLlN3aXBlKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJlc3MgPSBuZXcgaGFtbWVyLlByZXNzKCk7CiAgICAgICAgICAgIC8vIE5vdGljZSB0aGF0IGEgSGFtbWVySlMgcmVjb2duaXplciBjYW4gb25seSBkZXBlbmQgb24gb25lIG90aGVyIHJlY29nbml6ZXIgb25jZS4KICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBwcmV2aW91cyBgcmVjb2duaXplV2l0aGAgd2lsbCBiZSBkcm9wcGVkLgogICAgICAgICAgICAvLyBUT0RPOiBDb25maXJtIHRocmVzaG9sZCBudW1iZXJzIHdpdGggTWF0ZXJpYWwgRGVzaWduIFVYIFRlYW0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzbGlkZSA9IHRoaXMuX2NyZWF0ZVJlY29nbml6ZXIocGFuLCB7IGV2ZW50OiAnc2xpZGUnLCB0aHJlc2hvbGQ6IDAgfSwgc3dpcGUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxvbmdwcmVzcyA9IHRoaXMuX2NyZWF0ZVJlY29nbml6ZXIocHJlc3MsIHsgZXZlbnQ6ICdsb25ncHJlc3MnLCB0aW1lOiA1MDAgfSk7CiAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgZGVmYXVsdCBgcGFuYCBldmVudCB0byB1c2UgdGhlIHN3aXBlIGV2ZW50LgogICAgICAgICAgICBwYW4ucmVjb2duaXplV2l0aChzd2lwZSk7CiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBzbGlkZSBldmVudCB0aHJlc2hvbGQgaXMgc2V0IHRvIHplcm8sIHRoZSBzbGlkZSByZWNvZ25pemVyIGNhbiBmaXJlIGFuZAogICAgICAgICAgICAvLyBhY2NpZGVudGFsbHkgcmVzZXQgdGhlIGxvbmdwcmVzcyByZWNvZ25pemVyLiBJbiBvcmRlciB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdHdvCiAgICAgICAgICAgIC8vIHJlY29nbml6ZXJzIGNhbiBydW4gc2ltdWx0YW5lb3VzbHkgYnV0IGRvbid0IGFmZmVjdCBlYWNoIG90aGVyLCB3ZSBhbGxvdyB0aGUgc2xpZGUKICAgICAgICAgICAgLy8gcmVjb2duaXplciB0byByZWNvZ25pemUgd2hpbGUgYSBsb25ncHJlc3MgaXMgYmVpbmcgcHJvY2Vzc2VkLgogICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9oYW1tZXJqcy9oYW1tZXIuanMvYmxvYi9tYXN0ZXIvc3JjL21hbmFnZXIuanMjTDEyMy1MMTI0CiAgICAgICAgICAgIGxvbmdwcmVzcy5yZWNvZ25pemVXaXRoKHNsaWRlKTsKICAgICAgICAgICAgLy8gQWRkIGN1c3RvbWl6ZWQgZ2VzdHVyZXMgdG8gSGFtbWVyIG1hbmFnZXIKICAgICAgICAgICAgbWMuYWRkKFtzd2lwZSwgcHJlc3MsIHBhbiwgc2xpZGUsIGxvbmdwcmVzc10pOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKG1jKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgcmVjb2duaXplciwgd2l0aG91dCBhZmZlY3RpbmcgdGhlIGRlZmF1bHQgcmVjb2duaXplcnMgb2YgSGFtbWVySlMKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYmFzZQogICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Li4uP30gaW5oZXJpdGFuY2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUmVjb2duaXplcihiYXNlLCBvcHRpb25zLCAuLi5pbmhlcml0YW5jZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVjb2duaXplciA9IG5ldyAoKC8qKiBAdHlwZSB7P30gKi8gKGJhc2UuY29uc3RydWN0b3IpKSkob3B0aW9ucyk7CiAgICAgICAgICAgIGluaGVyaXRhbmNlcy5wdXNoKGJhc2UpOwogICAgICAgICAgICBpbmhlcml0YW5jZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaXRlbSA9PiByZWNvZ25pemVyLnJlY29nbml6ZVdpdGgoaXRlbSkpKTsKICAgICAgICAgICAgcmV0dXJuIHJlY29nbml6ZXI7CiAgICAgICAgfQogICAgfQogICAgR2VzdHVyZUNvbmZpZy7JtWZhYyA9IGZ1bmN0aW9uIEdlc3R1cmVDb25maWdfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR2VzdHVyZUNvbmZpZykoybXJtWluamVjdChNQVRfSEFNTUVSX09QVElPTlMsIDgpLCDJtcm1aW5qZWN0KE1hdENvbW1vbk1vZHVsZSwgOCkpOyB9OwogICAgR2VzdHVyZUNvbmZpZy7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBHZXN0dXJlQ29uZmlnLCBmYWN0b3J5OiBHZXN0dXJlQ29uZmlnLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBHZXN0dXJlQ29uZmlnLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9IQU1NRVJfT1BUSU9OUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBNYXRDb21tb25Nb2R1bGUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9saW5lL2xpbmUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBTaGFyZWQgZGlyZWN0aXZlIHRvIGNvdW50IGxpbmVzIGluc2lkZSBhIHRleHQgYXJlYSwgc3VjaCBhcyBhIGxpc3QgaXRlbS4KICAgICAqIExpbmUgZWxlbWVudHMgY2FuIGJlIGV4dHJhY3RlZCB3aXRoIGEgXEBDb250ZW50Q2hpbGRyZW4oTWF0TGluZSkgcXVlcnksIHRoZW4KICAgICAqIGNvdW50ZWQgYnkgY2hlY2tpbmcgdGhlIHF1ZXJ5IGxpc3QncyBsZW5ndGguCiAgICAgKi8KICAgIGNsYXNzIE1hdExpbmUgewogICAgfQogICAgTWF0TGluZS7JtWZhYyA9IGZ1bmN0aW9uIE1hdExpbmVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0TGluZSkoKTsgfTsKICAgIE1hdExpbmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0TGluZSwgc2VsZWN0b3JzOiBbWyIiLCAibWF0LWxpbmUiLCAiIl0sIFsiIiwgIm1hdExpbmUiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWxpbmUiXSB9KTsKICAgIGNsYXNzIE1hdExpbmVNb2R1bGUgewogICAgfQogICAgTWF0TGluZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdExpbmVNb2R1bGUgfSk7CiAgICBNYXRMaW5lTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0TGluZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRMaW5lTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW01hdENvbW1vbk1vZHVsZV0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRMaW5lTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW01hdExpbmVdLCBpbXBvcnRzOiBbTWF0Q29tbW9uTW9kdWxlXSwgZXhwb3J0czogW01hdExpbmUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7IH0pKCk7CiAgICAvKioKICAgICAqIFJlZmVyZW5jZSB0byBhIHByZXZpb3VzbHkgbGF1bmNoZWQgcmlwcGxlIGVsZW1lbnQuCiAgICAgKi8KICAgIGNsYXNzIFJpcHBsZVJlZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9yZW5kZXJlciwgZWxlbWVudCwgY29uZmlnKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLmNvbmZpZyA9IGNvbmZpZzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHJpcHBsZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAzIC8qIEhJRERFTiAqLzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRmFkZXMgb3V0IHRoZSByaXBwbGUgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZhZGVPdXQoKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLmZhZGVPdXRSaXBwbGUodGhpcyk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZWZhdWx0IHJpcHBsZSBhbmltYXRpb24gY29uZmlndXJhdGlvbiBmb3IgcmlwcGxlcyB3aXRob3V0IGFuIGV4cGxpY2l0CiAgICAgKiBhbmltYXRpb24gY29uZmlnIHNwZWNpZmllZC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBkZWZhdWx0UmlwcGxlQW5pbWF0aW9uQ29uZmlnID0gewogICAgICAgIGVudGVyRHVyYXRpb246IDQ1MCwKICAgICAgICBleGl0RHVyYXRpb246IDQwMAogICAgfTsKICAgIC8qKgogICAgICogVGltZW91dCBmb3IgaWdub3JpbmcgbW91c2UgZXZlbnRzLiBNb3VzZSBldmVudHMgd2lsbCBiZSB0ZW1wb3JhcnkgaWdub3JlZCBhZnRlciB0b3VjaAogICAgICogZXZlbnRzIHRvIGF2b2lkIHN5bnRoZXRpYyBtb3VzZSBldmVudHMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgaWdub3JlTW91c2VFdmVudHNUaW1lb3V0ID0gODAwOwogICAgLyoqCiAgICAgKiBPcHRpb25zIHRoYXQgYXBwbHkgdG8gYWxsIHRoZSBldmVudCBsaXN0ZW5lcnMgdGhhdCBhcmUgYm91bmQgYnkgdGhlIHJpcHBsZSByZW5kZXJlci4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBwYXNzaXZlRXZlbnRPcHRpb25zID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSk7CiAgICAvKioKICAgICAqIEV2ZW50cyB0aGF0IHNpZ25hbCB0aGF0IHRoZSBwb2ludGVyIGlzIGRvd24uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgcG9pbnRlckRvd25FdmVudHMgPSBbJ21vdXNlZG93bicsICd0b3VjaHN0YXJ0J107CiAgICAvKioKICAgICAqIEV2ZW50cyB0aGF0IHNpZ25hbCB0aGF0IHRoZSBwb2ludGVyIGlzIHVwLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHBvaW50ZXJVcEV2ZW50cyA9IFsnbW91c2V1cCcsICdtb3VzZWxlYXZlJywgJ3RvdWNoZW5kJywgJ3RvdWNoY2FuY2VsJ107CiAgICAvKioKICAgICAqIEhlbHBlciBzZXJ2aWNlIHRoYXQgcGVyZm9ybXMgRE9NIG1hbmlwdWxhdGlvbnMuIE5vdCBpbnRlbmRlZCB0byBiZSB1c2VkIG91dHNpZGUgdGhpcyBtb2R1bGUuCiAgICAgKiBUaGUgY29uc3RydWN0b3IgdGFrZXMgYSByZWZlcmVuY2UgdG8gdGhlIHJpcHBsZSBkaXJlY3RpdmUncyBob3N0IGVsZW1lbnQgYW5kIGEgbWFwIG9mIERPTQogICAgICogZXZlbnQgaGFuZGxlcnMgdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcnMgcmlwcGxlIGFuaW1hdGlvbnMuCiAgICAgKiBUaGlzIHdpbGwgZXZlbnR1YWxseSBiZWNvbWUgYSBjdXN0b20gcmVuZGVyZXIgb25jZSBBbmd1bGFyIHN1cHBvcnQgZXhpc3RzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgUmlwcGxlUmVuZGVyZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3RhcmdldAogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudE9yRWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfdGFyZ2V0LCBfbmdab25lLCBlbGVtZW50T3JFbGVtZW50UmVmLCBwbGF0Zm9ybSkgewogICAgICAgICAgICB0aGlzLl90YXJnZXQgPSBfdGFyZ2V0OwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgcG9pbnRlciBpcyBjdXJyZW50bHkgZG93biBvciBub3QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9pc1BvaW50ZXJEb3duID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTZXQgb2YgY3VycmVudGx5IGFjdGl2ZSByaXBwbGUgcmVmZXJlbmNlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZVJpcHBsZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHBvaW50ZXItdXAgZXZlbnQgbGlzdGVuZXJzIGhhdmUgYmVlbiByZWdpc3RlcmVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZCA9IGZhbHNlOwogICAgICAgICAgICAvLyBPbmx5IGRvIGFueXRoaW5nIGlmIHdlJ3JlIG9uIHRoZSBicm93c2VyLgogICAgICAgICAgICBpZiAocGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50T3JFbGVtZW50UmVmKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGYWRlcyBpbiBhIHJpcHBsZSBhdCB0aGUgZ2l2ZW4gY29vcmRpbmF0ZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSB4IENvb3JkaW5hdGUgd2l0aGluIHRoZSBlbGVtZW50LCBhbG9uZyB0aGUgWCBheGlzIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSByaXBwbGUuCiAgICAgICAgICogQHBhcmFtIHs/fSB5IENvb3JkaW5hdGUgd2l0aGluIHRoZSBlbGVtZW50LCBhbG9uZyB0aGUgWSBheGlzIGF0IHdoaWNoIHRvIHN0YXJ0IHRoZSByaXBwbGUuCiAgICAgICAgICogQHBhcmFtIHs/PX0gY29uZmlnIEV4dHJhIHJpcHBsZSBvcHRpb25zLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmFkZUluUmlwcGxlKHgsIHksIGNvbmZpZyA9IHt9KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVjdCA9IHRoaXMuX2NvbnRhaW5lclJlY3QgPQogICAgICAgICAgICAgICAgdGhpcy5fY29udGFpbmVyUmVjdCB8fCB0aGlzLl9jb250YWluZXJFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuaW1hdGlvbkNvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdFJpcHBsZUFuaW1hdGlvbkNvbmZpZyksIGNvbmZpZy5hbmltYXRpb24pOwogICAgICAgICAgICBpZiAoY29uZmlnLmNlbnRlcmVkKSB7CiAgICAgICAgICAgICAgICB4ID0gY29udGFpbmVyUmVjdC5sZWZ0ICsgY29udGFpbmVyUmVjdC53aWR0aCAvIDI7CiAgICAgICAgICAgICAgICB5ID0gY29udGFpbmVyUmVjdC50b3AgKyBjb250YWluZXJSZWN0LmhlaWdodCAvIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByYWRpdXMgPSBjb25maWcucmFkaXVzIHx8IGRpc3RhbmNlVG9GdXJ0aGVzdENvcm5lcih4LCB5LCBjb250YWluZXJSZWN0KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvZmZzZXRYID0geCAtIGNvbnRhaW5lclJlY3QubGVmdDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvZmZzZXRZID0geSAtIGNvbnRhaW5lclJlY3QudG9wOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGR1cmF0aW9uID0gYW5pbWF0aW9uQ29uZmlnLmVudGVyRHVyYXRpb247CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmlwcGxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHJpcHBsZS5jbGFzc0xpc3QuYWRkKCdtYXQtcmlwcGxlLWVsZW1lbnQnKTsKICAgICAgICAgICAgcmlwcGxlLnN0eWxlLmxlZnQgPSBgJHtvZmZzZXRYIC0gcmFkaXVzfXB4YDsKICAgICAgICAgICAgcmlwcGxlLnN0eWxlLnRvcCA9IGAke29mZnNldFkgLSByYWRpdXN9cHhgOwogICAgICAgICAgICByaXBwbGUuc3R5bGUuaGVpZ2h0ID0gYCR7cmFkaXVzICogMn1weGA7CiAgICAgICAgICAgIHJpcHBsZS5zdHlsZS53aWR0aCA9IGAke3JhZGl1cyAqIDJ9cHhgOwogICAgICAgICAgICAvLyBJZiBhIGN1c3RvbSBjb2xvciBoYXMgYmVlbiBzcGVjaWZpZWQsIHNldCBpdCBhcyBpbmxpbmUgc3R5bGUuIElmIG5vIGNvbG9yIGlzCiAgICAgICAgICAgIC8vIHNldCwgdGhlIGRlZmF1bHQgY29sb3Igd2lsbCBiZSBhcHBsaWVkIHRocm91Z2ggdGhlIHJpcHBsZSB0aGVtZSBzdHlsZXMuCiAgICAgICAgICAgIGlmIChjb25maWcuY29sb3IgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmlwcGxlLnN0eWxlLmJhY2tncm91bmRDb2xvciA9IGNvbmZpZy5jb2xvcjsKICAgICAgICAgICAgfQogICAgICAgICAgICByaXBwbGUuc3R5bGUudHJhbnNpdGlvbkR1cmF0aW9uID0gYCR7ZHVyYXRpb259bXNgOwogICAgICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50LmFwcGVuZENoaWxkKHJpcHBsZSk7CiAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGJyb3dzZXIgZG9lcyBub3QgcmVjYWxjdWxhdGUgdGhlIHN0eWxlcyBvZiBkeW5hbWljYWxseSBjcmVhdGVkCiAgICAgICAgICAgIC8vIHJpcHBsZSBlbGVtZW50cy4gVGhpcyBpcyBjcml0aWNhbCBiZWNhdXNlIHRoZW4gdGhlIGBzY2FsZWAgd291bGQgbm90IGFuaW1hdGUgcHJvcGVybHkuCiAgICAgICAgICAgIGVuZm9yY2VTdHlsZVJlY2FsY3VsYXRpb24ocmlwcGxlKTsKICAgICAgICAgICAgcmlwcGxlLnN0eWxlLnRyYW5zZm9ybSA9ICdzY2FsZSgxKSc7CiAgICAgICAgICAgIC8vIEV4cG9zZWQgcmVmZXJlbmNlIHRvIHRoZSByaXBwbGUgdGhhdCB3aWxsIGJlIHJldHVybmVkLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJpcHBsZVJlZiA9IG5ldyBSaXBwbGVSZWYodGhpcywgcmlwcGxlLCBjb25maWcpOwogICAgICAgICAgICByaXBwbGVSZWYuc3RhdGUgPSAwIC8qIEZBRElOR19JTiAqLzsKICAgICAgICAgICAgLy8gQWRkIHRoZSByaXBwbGUgcmVmZXJlbmNlIHRvIHRoZSBsaXN0IG9mIGFsbCBhY3RpdmUgcmlwcGxlcy4KICAgICAgICAgICAgdGhpcy5fYWN0aXZlUmlwcGxlcy5hZGQocmlwcGxlUmVmKTsKICAgICAgICAgICAgaWYgKCFjb25maWcucGVyc2lzdGVudCkgewogICAgICAgICAgICAgICAgdGhpcy5fbW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZSA9IHJpcHBsZVJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXYWl0IGZvciB0aGUgcmlwcGxlIGVsZW1lbnQgdG8gYmUgY29tcGxldGVseSBmYWRlZCBpbi4KICAgICAgICAgICAgLy8gT25jZSBpdCdzIGZhZGVkIGluLCB0aGUgcmlwcGxlIGNhbiBiZSBoaWRkZW4gaW1tZWRpYXRlbHkgaWYgdGhlIG1vdXNlIGlzIHJlbGVhc2VkLgogICAgICAgICAgICB0aGlzLl9ydW5UaW1lb3V0T3V0c2lkZVpvbmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaXNNb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlID0gcmlwcGxlUmVmID09PSB0aGlzLl9tb3N0UmVjZW50VHJhbnNpZW50UmlwcGxlOwogICAgICAgICAgICAgICAgcmlwcGxlUmVmLnN0YXRlID0gMSAvKiBWSVNJQkxFICovOwogICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgdGltZXIgcnVucyBvdXQgd2hpbGUgdGhlIHVzZXIgaGFzIGtlcHQgdGhlaXIgcG9pbnRlciBkb3duLCB3ZSB3YW50IHRvCiAgICAgICAgICAgICAgICAvLyBrZWVwIG9ubHkgdGhlIHBlcnNpc3RlbnQgcmlwcGxlcyBhbmQgdGhlIGxhdGVzdCB0cmFuc2llbnQgcmlwcGxlLiBXZSBkbyB0aGlzLAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBkb24ndCB3YW50IHN0YWNrZWQgdHJhbnNpZW50IHJpcHBsZXMgdG8gYXBwZWFyIGFmdGVyIHRoZWlyIGVudGVyCiAgICAgICAgICAgICAgICAvLyBhbmltYXRpb24gaGFzIGZpbmlzaGVkLgogICAgICAgICAgICAgICAgaWYgKCFjb25maWcucGVyc2lzdGVudCAmJiAoIWlzTW9zdFJlY2VudFRyYW5zaWVudFJpcHBsZSB8fCAhdGhpcy5faXNQb2ludGVyRG93bikpIHsKICAgICAgICAgICAgICAgICAgICByaXBwbGVSZWYuZmFkZU91dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSwgZHVyYXRpb24pOwogICAgICAgICAgICByZXR1cm4gcmlwcGxlUmVmOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGYWRlcyBvdXQgYSByaXBwbGUgcmVmZXJlbmNlLgogICAgICAgICAqIEBwYXJhbSB7P30gcmlwcGxlUmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmYWRlT3V0UmlwcGxlKHJpcHBsZVJlZikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdhc0FjdGl2ZSA9IHRoaXMuX2FjdGl2ZVJpcHBsZXMuZGVsZXRlKHJpcHBsZVJlZik7CiAgICAgICAgICAgIGlmIChyaXBwbGVSZWYgPT09IHRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX21vc3RSZWNlbnRUcmFuc2llbnRSaXBwbGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENsZWFyIG91dCB0aGUgY2FjaGVkIGJvdW5kaW5nIHJlY3QgaWYgd2UgaGF2ZSBubyBtb3JlIHJpcHBsZXMuCiAgICAgICAgICAgIGlmICghdGhpcy5fYWN0aXZlUmlwcGxlcy5zaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXJSZWN0ID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGb3IgcmlwcGxlcyB0aGF0IGFyZSBub3QgYWN0aXZlIGFueW1vcmUsIGRvbid0IHJlLXJ1biB0aGUgZmFkZS1vdXQgYW5pbWF0aW9uLgogICAgICAgICAgICBpZiAoIXdhc0FjdGl2ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmlwcGxlRWwgPSByaXBwbGVSZWYuZWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbmltYXRpb25Db25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRSaXBwbGVBbmltYXRpb25Db25maWcpLCByaXBwbGVSZWYuY29uZmlnLmFuaW1hdGlvbik7CiAgICAgICAgICAgIHJpcHBsZUVsLnN0eWxlLnRyYW5zaXRpb25EdXJhdGlvbiA9IGAke2FuaW1hdGlvbkNvbmZpZy5leGl0RHVyYXRpb259bXNgOwogICAgICAgICAgICByaXBwbGVFbC5zdHlsZS5vcGFjaXR5ID0gJzAnOwogICAgICAgICAgICByaXBwbGVSZWYuc3RhdGUgPSAyIC8qIEZBRElOR19PVVQgKi87CiAgICAgICAgICAgIC8vIE9uY2UgdGhlIHJpcHBsZSBmYWRlZCBvdXQsIHRoZSByaXBwbGUgY2FuIGJlIHNhZmVseSByZW1vdmVkIGZyb20gdGhlIERPTS4KICAgICAgICAgICAgdGhpcy5fcnVuVGltZW91dE91dHNpZGVab25lKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHJpcHBsZVJlZi5zdGF0ZSA9IDMgLyogSElEREVOICovOwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHJpcHBsZUVsLnBhcmVudE5vZGUpKS5yZW1vdmVDaGlsZChyaXBwbGVFbCk7CiAgICAgICAgICAgIH0pLCBhbmltYXRpb25Db25maWcuZXhpdER1cmF0aW9uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRmFkZXMgb3V0IGFsbCBjdXJyZW50bHkgYWN0aXZlIHJpcHBsZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmYWRlT3V0QWxsKCkgewogICAgICAgICAgICB0aGlzLl9hY3RpdmVSaXBwbGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJpcHBsZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmlwcGxlID0+IHJpcHBsZS5mYWRlT3V0KCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB1cCB0aGUgdHJpZ2dlciBldmVudCBsaXN0ZW5lcnMKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPckVsZW1lbnRSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldHVwVHJpZ2dlckV2ZW50cyhlbGVtZW50T3JFbGVtZW50UmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGNvZXJjZUVsZW1lbnQoZWxlbWVudE9yRWxlbWVudFJlZik7CiAgICAgICAgICAgIGlmICghZWxlbWVudCB8fCBlbGVtZW50ID09PSB0aGlzLl90cmlnZ2VyRWxlbWVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgcHJldmlvdXNseSByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSB0cmlnZ2VyIGVsZW1lbnQuCiAgICAgICAgICAgIHRoaXMuX3JlbW92ZVRyaWdnZXJFdmVudHMoKTsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlckVsZW1lbnQgPSBlbGVtZW50OwogICAgICAgICAgICB0aGlzLl9yZWdpc3RlckV2ZW50cyhwb2ludGVyRG93bkV2ZW50cyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgYWxsIHJlZ2lzdGVyZWQgZXZlbnRzLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFuZGxlRXZlbnQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnR5cGUgPT09ICdtb3VzZWRvd24nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlZG93bigoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQudHlwZSA9PT0gJ3RvdWNoc3RhcnQnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoU3RhcnQoKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fb25Qb2ludGVyVXAoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiBwb2ludGVyLXVwIGV2ZW50cyBoYXZlbid0IGJlZW4gcmVnaXN0ZXJlZCB5ZXQsIGRvIHNvIG5vdy4KICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBvbi1kZW1hbmQgaW4gb3JkZXIgdG8gcmVkdWNlIHRoZSB0b3RhbCBudW1iZXIgb2YgZXZlbnQgbGlzdGVuZXJzCiAgICAgICAgICAgIC8vIHJlZ2lzdGVyZWQgYnkgdGhlIHJpcHBsZXMsIHdoaWNoIHNwZWVkcyB1cCB0aGUgcmVuZGVyaW5nIHRpbWUgZm9yIGxhcmdlIFVJcy4KICAgICAgICAgICAgaWYgKCF0aGlzLl9wb2ludGVyVXBFdmVudHNSZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RlckV2ZW50cyhwb2ludGVyVXBFdmVudHMpOwogICAgICAgICAgICAgICAgdGhpcy5fcG9pbnRlclVwRXZlbnRzUmVnaXN0ZXJlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRnVuY3Rpb24gYmVpbmcgY2FsbGVkIHdoZW5ldmVyIHRoZSB0cmlnZ2VyIGlzIGJlaW5nIHByZXNzZWQgdXNpbmcgbW91c2UuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25Nb3VzZWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgLy8gU2NyZWVuIHJlYWRlcnMgd2lsbCBmaXJlIGZha2UgbW91c2UgZXZlbnRzIGZvciBzcGFjZS9lbnRlci4gU2tpcCBsYXVuY2hpbmcgYQogICAgICAgICAgICAvLyByaXBwbGUgaW4gdGhpcyBjYXNlIGZvciBjb25zaXN0ZW5jeSB3aXRoIHRoZSBub24tc2NyZWVuLXJlYWRlciBleHBlcmllbmNlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzRmFrZU1vdXNlZG93biA9IGlzRmFrZU1vdXNlZG93bkZyb21TY3JlZW5SZWFkZXIoZXZlbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzU3ludGhldGljRXZlbnQgPSB0aGlzLl9sYXN0VG91Y2hTdGFydEV2ZW50ICYmCiAgICAgICAgICAgICAgICBEYXRlLm5vdygpIDwgdGhpcy5fbGFzdFRvdWNoU3RhcnRFdmVudCArIGlnbm9yZU1vdXNlRXZlbnRzVGltZW91dDsKICAgICAgICAgICAgaWYgKCF0aGlzLl90YXJnZXQucmlwcGxlRGlzYWJsZWQgJiYgIWlzRmFrZU1vdXNlZG93biAmJiAhaXNTeW50aGV0aWNFdmVudCkgewogICAgICAgICAgICAgICAgdGhpcy5faXNQb2ludGVyRG93biA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmZhZGVJblJpcHBsZShldmVudC5jbGllbnRYLCBldmVudC5jbGllbnRZLCB0aGlzLl90YXJnZXQucmlwcGxlQ29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGdW5jdGlvbiBiZWluZyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHRyaWdnZXIgaXMgYmVpbmcgcHJlc3NlZCB1c2luZyB0b3VjaC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vblRvdWNoU3RhcnQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl90YXJnZXQucmlwcGxlRGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIC8vIFNvbWUgYnJvd3NlcnMgZmlyZSBtb3VzZSBldmVudHMgYWZ0ZXIgYSBgdG91Y2hzdGFydGAgZXZlbnQuIFRob3NlIHN5bnRoZXRpYyBtb3VzZQogICAgICAgICAgICAgICAgLy8gZXZlbnRzIHdpbGwgbGF1bmNoIGEgc2Vjb25kIHJpcHBsZSBpZiB3ZSBkb24ndCBpZ25vcmUgbW91c2UgZXZlbnRzIGZvciBhIHNwZWNpZmljCiAgICAgICAgICAgICAgICAvLyB0aW1lIGFmdGVyIGEgdG91Y2hzdGFydCBldmVudC4KICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RUb3VjaFN0YXJ0RXZlbnQgPSBEYXRlLm5vdygpOwogICAgICAgICAgICAgICAgdGhpcy5faXNQb2ludGVyRG93biA9IHRydWU7CiAgICAgICAgICAgICAgICAvLyBVc2UgYGNoYW5nZWRUb3VjaGVzYCBzbyB3ZSBza2lwIGFueSB0b3VjaGVzIHdoZXJlIHRoZSB1c2VyIHB1dAogICAgICAgICAgICAgICAgLy8gdGhlaXIgZmluZ2VyIGRvd24sIGJ1dCB1c2VkIGFub3RoZXIgZmluZ2VyIHRvIHRhcCB0aGUgZWxlbWVudCBhZ2Fpbi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRvdWNoZXMgPSBldmVudC5jaGFuZ2VkVG91Y2hlczsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdG91Y2hlcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZmFkZUluUmlwcGxlKHRvdWNoZXNbaV0uY2xpZW50WCwgdG91Y2hlc1tpXS5jbGllbnRZLCB0aGlzLl90YXJnZXQucmlwcGxlQ29uZmlnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGdW5jdGlvbiBiZWluZyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHRyaWdnZXIgaXMgYmVpbmcgcmVsZWFzZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vblBvaW50ZXJVcCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1BvaW50ZXJEb3duKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNQb2ludGVyRG93biA9IGZhbHNlOwogICAgICAgICAgICAvLyBGYWRlLW91dCBhbGwgcmlwcGxlcyB0aGF0IGFyZSB2aXNpYmxlIGFuZCBub3QgcGVyc2lzdGVudC4KICAgICAgICAgICAgdGhpcy5fYWN0aXZlUmlwcGxlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByaXBwbGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJpcHBsZSA9PiB7CiAgICAgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCBvbmx5IHJpcHBsZXMgdGhhdCBhcmUgY29tcGxldGVseSB2aXNpYmxlIHdpbGwgZmFkZSBvdXQgb24gcG9pbnRlciByZWxlYXNlLgogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGB0ZXJtaW5hdGVPblBvaW50ZXJVcGAgb3B0aW9uIGlzIHNldCwgcmlwcGxlcyB0aGF0IHN0aWxsIGZhZGUgaW4gd2lsbCBhbHNvIGZhZGUgb3V0LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaXNWaXNpYmxlID0gcmlwcGxlLnN0YXRlID09PSAxIC8qIFZJU0lCTEUgKi8gfHwKICAgICAgICAgICAgICAgICAgICByaXBwbGUuY29uZmlnLnRlcm1pbmF0ZU9uUG9pbnRlclVwICYmIHJpcHBsZS5zdGF0ZSA9PT0gMCAvKiBGQURJTkdfSU4gKi87CiAgICAgICAgICAgICAgICBpZiAoIXJpcHBsZS5jb25maWcucGVyc2lzdGVudCAmJiBpc1Zpc2libGUpIHsKICAgICAgICAgICAgICAgICAgICByaXBwbGUuZmFkZU91dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJ1bnMgYSB0aW1lb3V0IG91dHNpZGUgb2YgdGhlIEFuZ3VsYXIgem9uZSB0byBhdm9pZCB0cmlnZ2VyaW5nIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlbGF5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcnVuVGltZW91dE91dHNpZGVab25lKGZuLCBkZWxheSA9IDApIHsKICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHNldFRpbWVvdXQoZm4sIGRlbGF5KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgZXZlbnQgbGlzdGVuZXJzIGZvciBhIGdpdmVuIGxpc3Qgb2YgZXZlbnRzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudFR5cGVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVnaXN0ZXJFdmVudHMoZXZlbnRUeXBlcykgewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgZXZlbnRUeXBlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHR5cGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdHJpZ2dlckVsZW1lbnQpKS5hZGRFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMsIHBhc3NpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgcHJldmlvdXNseSByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycyBmcm9tIHRoZSB0cmlnZ2VyIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlVHJpZ2dlckV2ZW50cygpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXJFbGVtZW50KSB7CiAgICAgICAgICAgICAgICBwb2ludGVyRG93bkV2ZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHR5cGUpID0+IHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdHJpZ2dlckVsZW1lbnQpKS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMsIHBhc3NpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BvaW50ZXJVcEV2ZW50c1JlZ2lzdGVyZWQpIHsKICAgICAgICAgICAgICAgICAgICBwb2ludGVyVXBFdmVudHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0eXBlCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAodHlwZSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdHJpZ2dlckVsZW1lbnQpKS5yZW1vdmVFdmVudExpc3RlbmVyKHR5cGUsIHRoaXMsIHBhc3NpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogRW5mb3JjZXMgYSBzdHlsZSByZWNhbGN1bGF0aW9uIG9mIGEgRE9NIGVsZW1lbnQgYnkgY29tcHV0aW5nIGl0cyBzdHlsZXMuCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGVuZm9yY2VTdHlsZVJlY2FsY3VsYXRpb24oZWxlbWVudCkgewogICAgICAgIC8vIEVuZm9yY2UgYSBzdHlsZSByZWNhbGN1bGF0aW9uIGJ5IGNhbGxpbmcgYGdldENvbXB1dGVkU3R5bGVgIGFuZCBhY2Nlc3NpbmcgYW55IHByb3BlcnR5LgogICAgICAgIC8vIENhbGxpbmcgYGdldFByb3BlcnR5VmFsdWVgIGlzIGltcG9ydGFudCB0byBsZXQgb3B0aW1pemVycyBrbm93IHRoYXQgdGhpcyBpcyBub3QgYSBub29wLgogICAgICAgIC8vIFNlZTogaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vcGF1bGlyaXNoLzVkNTJmYjA4MWIzNTcwYzgxZTNhCiAgICAgICAgd2luZG93LmdldENvbXB1dGVkU3R5bGUoZWxlbWVudCkuZ2V0UHJvcGVydHlWYWx1ZSgnb3BhY2l0eScpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBwb2ludCAoeCwgeSkgdG8gdGhlIGZ1cnRoZXN0IGNvcm5lciBvZiBhIHJlY3RhbmdsZS4KICAgICAqIEBwYXJhbSB7P30geAogICAgICogQHBhcmFtIHs/fSB5CiAgICAgKiBAcGFyYW0gez99IHJlY3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGRpc3RhbmNlVG9GdXJ0aGVzdENvcm5lcih4LCB5LCByZWN0KSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpc3RYID0gTWF0aC5tYXgoTWF0aC5hYnMoeCAtIHJlY3QubGVmdCksIE1hdGguYWJzKHggLSByZWN0LnJpZ2h0KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpc3RZID0gTWF0aC5tYXgoTWF0aC5hYnMoeSAtIHJlY3QudG9wKSwgTWF0aC5hYnMoeSAtIHJlY3QuYm90dG9tKSk7CiAgICAgICAgcmV0dXJuIE1hdGguc3FydChkaXN0WCAqIGRpc3RYICsgZGlzdFkgKiBkaXN0WSk7CiAgICB9CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGdsb2JhbCByaXBwbGUgb3B0aW9ucy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtcmlwcGxlLWdsb2JhbC1vcHRpb25zJyk7CiAgICBjbGFzcyBNYXRSaXBwbGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez89fSBnbG9iYWxPcHRpb25zCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2FuaW1hdGlvbk1vZGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgbmdab25lLCBwbGF0Zm9ybSwgZ2xvYmFsT3B0aW9ucywgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJZiBzZXQsIHRoZSByYWRpdXMgaW4gcGl4ZWxzIG9mIGZvcmVncm91bmQgcmlwcGxlcyB3aGVuIGZ1bGx5IGV4cGFuZGVkLiBJZiB1bnNldCwgdGhlIHJhZGl1cwogICAgICAgICAgICAgKiB3aWxsIGJlIHRoZSBkaXN0YW5jZSBmcm9tIHRoZSBjZW50ZXIgb2YgdGhlIHJpcHBsZSB0byB0aGUgZnVydGhlc3QgY29ybmVyIG9mIHRoZSBob3N0IGVsZW1lbnQncwogICAgICAgICAgICAgKiBib3VuZGluZyByZWN0YW5nbGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnJhZGl1cyA9IDA7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHJpcHBsZSBkaXJlY3RpdmUgaXMgaW5pdGlhbGl6ZWQgYW5kIHRoZSBpbnB1dCBiaW5kaW5ncyBhcmUgc2V0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsaXplZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9nbG9iYWxPcHRpb25zID0gZ2xvYmFsT3B0aW9ucyB8fCB7fTsKICAgICAgICAgICAgdGhpcy5fcmlwcGxlUmVuZGVyZXIgPSBuZXcgUmlwcGxlUmVuZGVyZXIodGhpcywgbmdab25lLCBfZWxlbWVudFJlZiwgcGxhdGZvcm0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIGNsaWNrIGV2ZW50cyB3aWxsIG5vdCB0cmlnZ2VyIHRoZSByaXBwbGUuIFJpcHBsZXMgY2FuIGJlIHN0aWxsIGxhdW5jaGVkIG1hbnVhbGx5CiAgICAgICAgICogYnkgdXNpbmcgdGhlIGBsYXVuY2goKWAgbWV0aG9kLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpc2FibGVkKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBlbGVtZW50IHRoYXQgdHJpZ2dlcnMgdGhlIHJpcHBsZSB3aGVuIGNsaWNrIGV2ZW50cyBhcmUgcmVjZWl2ZWQuCiAgICAgICAgICogRGVmYXVsdHMgdG8gdGhlIGRpcmVjdGl2ZSdzIGhvc3QgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0cmlnZ2VyKCkgeyByZXR1cm4gdGhpcy5fdHJpZ2dlciB8fCB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRyaWdnZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0cmlnZ2VyKHRyaWdnZXIpIHsKICAgICAgICAgICAgdGhpcy5fdHJpZ2dlciA9IHRyaWdnZXI7CiAgICAgICAgICAgIHRoaXMuX3NldHVwVHJpZ2dlckV2ZW50c0lmRW5hYmxlZCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLl9pc0luaXRpYWxpemVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fc2V0dXBUcmlnZ2VyRXZlbnRzSWZFbmFibGVkKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3JpcHBsZVJlbmRlcmVyLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZhZGVzIG91dCBhbGwgY3VycmVudGx5IHNob3dpbmcgcmlwcGxlIGVsZW1lbnRzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmFkZU91dEFsbCgpIHsKICAgICAgICAgICAgdGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZU91dEFsbCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSaXBwbGUgY29uZmlndXJhdGlvbiBmcm9tIHRoZSBkaXJlY3RpdmUncyBpbnB1dCB2YWx1ZXMuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUgSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBSaXBwbGVUYXJnZXQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByaXBwbGVDb25maWcoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjZW50ZXJlZDogdGhpcy5jZW50ZXJlZCwKICAgICAgICAgICAgICAgIHJhZGl1czogdGhpcy5yYWRpdXMsCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5jb2xvciwKICAgICAgICAgICAgICAgIGFuaW1hdGlvbjogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2dsb2JhbE9wdGlvbnMuYW5pbWF0aW9uKSwgKHRoaXMuX2FuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycgPyB7IGVudGVyRHVyYXRpb246IDAsIGV4aXREdXJhdGlvbjogMCB9IDoge30pKSwgdGhpcy5hbmltYXRpb24pLAogICAgICAgICAgICAgICAgdGVybWluYXRlT25Qb2ludGVyVXA6IHRoaXMuX2dsb2JhbE9wdGlvbnMudGVybWluYXRlT25Qb2ludGVyVXAsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgcmlwcGxlcyBvbiBwb2ludGVyLWRvd24gYXJlIGRpc2FibGVkIG9yIG5vdC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFJpcHBsZVRhcmdldAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJpcHBsZURpc2FibGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCAhIXRoaXMuX2dsb2JhbE9wdGlvbnMuZGlzYWJsZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdXAgdGhlIHRyaWdnZXIgZXZlbnQgbGlzdGVuZXJzIGlmIHJpcHBsZXMgYXJlIGVuYWJsZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXR1cFRyaWdnZXJFdmVudHNJZkVuYWJsZWQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCAmJiB0aGlzLl9pc0luaXRpYWxpemVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yaXBwbGVSZW5kZXJlci5zZXR1cFRyaWdnZXJFdmVudHModGhpcy50cmlnZ2VyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMYXVuY2hlcyBhIG1hbnVhbCByaXBwbGUgYXQgdGhlIHNwZWNpZmllZCBjb29yZGluYXRlZCBvciBqdXN0IGJ5IHRoZSByaXBwbGUgY29uZmlnLgogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnT3JYCiAgICAgICAgICogQHBhcmFtIHs/PX0geQogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbGF1bmNoKGNvbmZpZ09yWCwgeSA9IDAsIGNvbmZpZykgewogICAgICAgICAgICBpZiAodHlwZW9mIGNvbmZpZ09yWCA9PT0gJ251bWJlcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9yaXBwbGVSZW5kZXJlci5mYWRlSW5SaXBwbGUoY29uZmlnT3JYLCB5LCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMucmlwcGxlQ29uZmlnKSwgY29uZmlnKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmlwcGxlUmVuZGVyZXIuZmFkZUluUmlwcGxlKDAsIDAsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5yaXBwbGVDb25maWcpLCBjb25maWdPclgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE1hdFJpcHBsZS7JtWZhYyA9IGZ1bmN0aW9uIE1hdFJpcHBsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRSaXBwbGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUywgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSk7IH07CiAgICBNYXRSaXBwbGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0UmlwcGxlLCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtcmlwcGxlIiwgIiJdLCBbIiIsICJtYXRSaXBwbGUiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXJpcHBsZSJdLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRSaXBwbGVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtcmlwcGxlLXVuYm91bmRlZCIsIGN0eC51bmJvdW5kZWQpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IHJhZGl1czogWyJtYXRSaXBwbGVSYWRpdXMiLCAicmFkaXVzIl0sIGRpc2FibGVkOiBbIm1hdFJpcHBsZURpc2FibGVkIiwgImRpc2FibGVkIl0sIHRyaWdnZXI6IFsibWF0UmlwcGxlVHJpZ2dlciIsICJ0cmlnZ2VyIl0sIGNvbG9yOiBbIm1hdFJpcHBsZUNvbG9yIiwgImNvbG9yIl0sIHVuYm91bmRlZDogWyJtYXRSaXBwbGVVbmJvdW5kZWQiLCAidW5ib3VuZGVkIl0sIGNlbnRlcmVkOiBbIm1hdFJpcHBsZUNlbnRlcmVkIiwgImNlbnRlcmVkIl0sIGFuaW1hdGlvbjogWyJtYXRSaXBwbGVBbmltYXRpb24iLCAiYW5pbWF0aW9uIl0gfSwgZXhwb3J0QXM6IFsibWF0UmlwcGxlIl0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFJpcHBsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9CiAgICBdOwogICAgTWF0UmlwcGxlLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNvbG9yOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRSaXBwbGVDb2xvcicsXSB9XSwKICAgICAgICB1bmJvdW5kZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFJpcHBsZVVuYm91bmRlZCcsXSB9XSwKICAgICAgICBjZW50ZXJlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0UmlwcGxlQ2VudGVyZWQnLF0gfV0sCiAgICAgICAgcmFkaXVzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRSaXBwbGVSYWRpdXMnLF0gfV0sCiAgICAgICAgYW5pbWF0aW9uOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRSaXBwbGVBbmltYXRpb24nLF0gfV0sCiAgICAgICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFJpcHBsZURpc2FibGVkJyxdIH1dLAogICAgICAgIHRyaWdnZXI6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFJpcHBsZVRyaWdnZXInLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY29yZS9yaXBwbGUvaW5kZXgudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0UmlwcGxlTW9kdWxlIHsKICAgIH0KICAgIE1hdFJpcHBsZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFJpcHBsZU1vZHVsZSB9KTsKICAgIE1hdFJpcHBsZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFJpcHBsZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRSaXBwbGVNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbTWF0Q29tbW9uTW9kdWxlLCBQbGF0Zm9ybU1vZHVsZV0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRSaXBwbGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0UmlwcGxlXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgUGxhdGZvcm1Nb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0UmlwcGxlLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvc2VsZWN0aW9uL3BzZXVkby1jaGVja2JveC9wc2V1ZG8tY2hlY2tib3gudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDb21wb25lbnQgdGhhdCBzaG93cyBhIHNpbXBsaWZpZWQgY2hlY2tib3ggd2l0aG91dCBpbmNsdWRpbmcgYW55IGtpbmQgb2YgInJlYWwiIGNoZWNrYm94LgogICAgICogTWVhbnQgdG8gYmUgdXNlZCB3aGVuIHRoZSBjaGVja2JveCBpcyBwdXJlbHkgZGVjb3JhdGl2ZSBhbmQgYSBsYXJnZSBudW1iZXIgb2YgdGhlbSB3aWxsIGJlCiAgICAgKiBpbmNsdWRlZCwgc3VjaCBhcyBmb3IgdGhlIG9wdGlvbnMgaW4gYSBtdWx0aS1zZWxlY3QuIFVzZXMgbm8gU1ZHcyBvciBjb21wbGV4IGFuaW1hdGlvbnMuCiAgICAgKiBOb3RlIHRoYXQgdGhlbWluZyBpcyBtZWFudCB0byBiZSBoYW5kbGVkIGJ5IHRoZSBwYXJlbnQgZWxlbWVudCwgZS5nLgogICAgICogYG1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94YC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhpcyBjb21wb25lbnQgd2lsbCBiZSBjb21wbGV0ZWx5IGludmlzaWJsZSB0byBzY3JlZW4tcmVhZGVyIHVzZXJzLiBUaGlzIGlzICpub3QqCiAgICAgKiBpbnRlcmNoYW5nZWFibGUgd2l0aCBgPG1hdC1jaGVja2JveD5gIGFuZCBzaG91bGQgKm5vdCogYmUgdXNlZCBpZiB0aGUgdXNlciB3b3VsZCBkaXJlY3RseQogICAgICogaW50ZXJhY3Qgd2l0aCB0aGUgY2hlY2tib3guIFRoZSBwc2V1ZG8tY2hlY2tib3ggc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwKICAgICAqIG9mIG1vcmUgY29tcGxleCBjb21wb25lbnRzIHRoYXQgYXBwcm9wcmlhdGVseSBoYW5kbGUgc2VsZWN0ZWQgLyBjaGVja2VkIHN0YXRlLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0UHNldWRvQ2hlY2tib3ggewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9hbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uTW9kZSA9IF9hbmltYXRpb25Nb2RlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRGlzcGxheSBzdGF0ZSBvZiB0aGUgY2hlY2tib3guCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnN0YXRlID0gJ3VuY2hlY2tlZCc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyBkaXNhYmxlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBNYXRQc2V1ZG9DaGVja2JveC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFBzZXVkb0NoZWNrYm94X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFBzZXVkb0NoZWNrYm94KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgTWF0UHNldWRvQ2hlY2tib3guybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0UHNldWRvQ2hlY2tib3gsIHNlbGVjdG9yczogW1sibWF0LXBzZXVkby1jaGVja2JveCJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1wc2V1ZG8tY2hlY2tib3giXSwgaG9zdFZhcnM6IDgsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0UHNldWRvQ2hlY2tib3hfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUiLCBjdHguc3RhdGUgPT09ICJpbmRldGVybWluYXRlIikoIm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZCIsIGN0eC5zdGF0ZSA9PT0gImNoZWNrZWQiKSgibWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiKTsKICAgICAgICB9IH0sIGlucHV0czogeyBzdGF0ZTogInN0YXRlIiwgZGlzYWJsZWQ6ICJkaXNhYmxlZCIgfSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRQc2V1ZG9DaGVja2JveF9UZW1wbGF0ZShyZiwgY3R4KSB7IH0sIHN0eWxlczogWyIubWF0LXBzZXVkby1jaGVja2JveHt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2JvcmRlcjoycHggc29saWQ7Ym9yZGVyLXJhZGl1czoycHg7Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7dmVydGljYWwtYWxpZ246bWlkZGxlO2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4LXNocmluazowO3RyYW5zaXRpb246Ym9yZGVyLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKSxiYWNrZ3JvdW5kLWNvbG9yIDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0ubWF0LXBzZXVkby1jaGVja2JveDo6YWZ0ZXJ7cG9zaXRpb246YWJzb2x1dGU7b3BhY2l0eTowO2NvbnRlbnQ6XCJcIjtib3JkZXItYm90dG9tOjJweCBzb2xpZCBjdXJyZW50Q29sb3I7dHJhbnNpdGlvbjpvcGFjaXR5IDkwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0ubWF0LXBzZXVkby1jaGVja2JveC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXBzZXVkby1jaGVja2JveHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wc2V1ZG8tY2hlY2tib3g6OmFmdGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0ubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlOjphZnRlcnt0b3A6NXB4O2xlZnQ6MXB4O3dpZHRoOjEwcHg7b3BhY2l0eToxO2JvcmRlci1yYWRpdXM6MnB4fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQ6OmFmdGVye3RvcDoyLjRweDtsZWZ0OjFweDt3aWR0aDo4cHg7aGVpZ2h0OjNweDtib3JkZXItbGVmdDoycHggc29saWQgY3VycmVudENvbG9yO3RyYW5zZm9ybTpyb3RhdGUoLTQ1ZGVnKTtvcGFjaXR5OjE7Ym94LXNpemluZzpjb250ZW50LWJveH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFBzZXVkb0NoZWNrYm94LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KICAgIF07CiAgICBNYXRQc2V1ZG9DaGVja2JveC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBzdGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvc2VsZWN0aW9uL2luZGV4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlIHsKICAgIH0KICAgIE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0UHNldWRvQ2hlY2tib3hNb2R1bGUgfSk7CiAgICBNYXRQc2V1ZG9DaGVja2JveE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFBzZXVkb0NoZWNrYm94TW9kdWxlKSgpOyB9IH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0UHNldWRvQ2hlY2tib3hNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTWF0UHNldWRvQ2hlY2tib3hdLCBleHBvcnRzOiBbTWF0UHNldWRvQ2hlY2tib3hdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvb3B0aW9uL29wdGdyb3VwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0T3B0Z3JvdXAuCiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdE9wdGdyb3VwQmFzZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0T3B0Z3JvdXBNaXhpbkJhc2UgPSBtaXhpbkRpc2FibGVkKE1hdE9wdGdyb3VwQmFzZSk7CiAgICAvLyBDb3VudGVyIGZvciB1bmlxdWUgZ3JvdXAgaWRzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IF91bmlxdWVPcHRncm91cElkQ291bnRlciA9IDA7CiAgICAvKioKICAgICAqIENvbXBvbmVudCB0aGF0IGlzIHVzZWQgdG8gZ3JvdXAgaW5zdGFuY2VzIG9mIGBtYXQtb3B0aW9uYC4KICAgICAqLwogICAgY2xhc3MgTWF0T3B0Z3JvdXAgZXh0ZW5kcyBfTWF0T3B0Z3JvdXBNaXhpbkJhc2UgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVW5pcXVlIGlkIGZvciB0aGUgdW5kZXJseWluZyBsYWJlbC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2xhYmVsSWQgPSBgbWF0LW9wdGdyb3VwLWxhYmVsLSR7X3VuaXF1ZU9wdGdyb3VwSWRDb3VudGVyKyt9YDsKICAgICAgICB9CiAgICB9CiAgICBNYXRPcHRncm91cC7JtWZhYyA9IGZ1bmN0aW9uIE1hdE9wdGdyb3VwX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRPcHRncm91cF9CYXNlRmFjdG9yeSh0IHx8IE1hdE9wdGdyb3VwKTsgfTsKICAgIE1hdE9wdGdyb3VwLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdE9wdGdyb3VwLCBzZWxlY3RvcnM6IFtbIm1hdC1vcHRncm91cCJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAiZ3JvdXAiLCAxLCAibWF0LW9wdGdyb3VwIl0sIGhvc3RWYXJzOiA0LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdE9wdGdyb3VwX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZC50b1N0cmluZygpKSgiYXJpYS1sYWJlbGxlZGJ5IiwgY3R4Ll9sYWJlbElkKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LW9wdGdyb3VwLWRpc2FibGVkIiwgY3R4LmRpc2FibGVkKTsKICAgICAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgbGFiZWw6ICJsYWJlbCIgfSwgZXhwb3J0QXM6IFsibWF0T3B0Z3JvdXAiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzEsIGRlY2xzOiA0LCB2YXJzOiAyLCBjb25zdHM6IFtbMSwgIm1hdC1vcHRncm91cC1sYWJlbCIsIDMsICJpZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdE9wdGdyb3VwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZihfYzApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJsYWJlbCIsIDApOwogICAgICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICAgICAgybXJtXByb2plY3Rpb24oMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDMsIDEpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImlkIiwgY3R4Ll9sYWJlbElkKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIiLCBjdHgubGFiZWwsICIgIik7CiAgICAgICAgfSB9LCBzdHlsZXM6IFsiLm1hdC1vcHRncm91cC1sYWJlbHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1vcHRncm91cC1sYWJlbFtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAtbGFiZWx7dGV4dC1hbGlnbjpyaWdodH0ubWF0LW9wdGdyb3VwLWxhYmVsIC5tYXQtaWNvbnttYXJnaW4tcmlnaHQ6MTZweDt2ZXJ0aWNhbC1hbGlnbjptaWRkbGV9Lm1hdC1vcHRncm91cC1sYWJlbCAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1vcHRncm91cC1sYWJlbCAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICBNYXRPcHRncm91cC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBsYWJlbDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICBjb25zdCDJtU1hdE9wdGdyb3VwX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0T3B0Z3JvdXApOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NvcmUvb3B0aW9uL29wdGlvbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIE9wdGlvbiBJRHMgbmVlZCB0byBiZSB1bmlxdWUgYWNyb3NzIGNvbXBvbmVudHMsIHNvIHRoaXMgY291bnRlciBleGlzdHMgb3V0c2lkZSBvZgogICAgICogdGhlIGNvbXBvbmVudCBkZWZpbml0aW9uLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBfdW5pcXVlSWRDb3VudGVyID0gMDsKICAgIC8qKgogICAgICogRXZlbnQgb2JqZWN0IGVtaXR0ZWQgYnkgTWF0T3B0aW9uIHdoZW4gc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZC4KICAgICAqLwogICAgY2xhc3MgTWF0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzVXNlcklucHV0CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc291cmNlLCBpc1VzZXJJbnB1dCA9IGZhbHNlKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICB0aGlzLmlzVXNlcklucHV0ID0gaXNVc2VySW5wdXQ7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdXNlZCB0byBwcm92aWRlIHRoZSBwYXJlbnQgY29tcG9uZW50IHRvIG9wdGlvbnMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5UID0gbmV3IEluamVjdGlvblRva2VuKCdNQVRfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQnKTsKICAgIC8qKgogICAgICogU2luZ2xlIG9wdGlvbiBpbnNpZGUgb2YgYSBgPG1hdC1zZWxlY3Q+YCBlbGVtZW50LgogICAgICovCiAgICBjbGFzcyBNYXRPcHRpb24gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudAogICAgICAgICAqIEBwYXJhbSB7P30gZ3JvdXAKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX2NoYW5nZURldGVjdG9yUmVmLCBfcGFyZW50LCBncm91cCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBfcGFyZW50OwogICAgICAgICAgICB0aGlzLmdyb3VwID0gZ3JvdXA7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9tb3N0UmVjZW50Vmlld1ZhbHVlID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgdW5pcXVlIElEIG9mIHRoZSBvcHRpb24uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlkID0gYG1hdC1vcHRpb24tJHtfdW5pcXVlSWRDb3VudGVyKyt9YDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgb3B0aW9uIGlzIHNlbGVjdGVkIG9yIGRlc2VsZWN0ZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeAogICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgc3RhdGUgb2YgdGhlIG9wdGlvbiBjaGFuZ2VzIGFuZCBhbnkgcGFyZW50cyBoYXZlIHRvIGJlIG5vdGlmaWVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgd3JhcHBpbmcgY29tcG9uZW50IGlzIGluIG11bHRpcGxlIHNlbGVjdGlvbiBtb2RlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG11bHRpcGxlKCkgeyByZXR1cm4gdGhpcy5fcGFyZW50ICYmIHRoaXMuX3BhcmVudC5tdWx0aXBsZTsgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBvcHRpb24gaXMgY3VycmVudGx5IHNlbGVjdGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBvcHRpb24gaXMgZGlzYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiAodGhpcy5ncm91cCAmJiB0aGlzLmdyb3VwLmRpc2FibGVkKSB8fCB0aGlzLl9kaXNhYmxlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkgeyB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHJpcHBsZXMgZm9yIHRoZSBvcHRpb24gYXJlIGRpc2FibGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpc2FibGVSaXBwbGUoKSB7IHJldHVybiB0aGlzLl9wYXJlbnQgJiYgdGhpcy5fcGFyZW50LmRpc2FibGVSaXBwbGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgb3B0aW9uIGlzIGN1cnJlbnRseSBhY3RpdmUgYW5kIHJlYWR5IHRvIGJlIHNlbGVjdGVkLgogICAgICAgICAqIEFuIGFjdGl2ZSBvcHRpb24gZGlzcGxheXMgc3R5bGVzIGFzIGlmIGl0IGlzIGZvY3VzZWQsIGJ1dCB0aGUKICAgICAgICAgKiBmb2N1cyBpcyBhY3R1YWxseSByZXRhaW5lZCBzb21ld2hlcmUgZWxzZS4gVGhpcyBjb21lcyBpbiBoYW5keQogICAgICAgICAqIGZvciBjb21wb25lbnRzIGxpa2UgYXV0b2NvbXBsZXRlIHdoZXJlIGZvY3VzIG11c3QgcmVtYWluIG9uIHRoZSBpbnB1dC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBhY3RpdmUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hY3RpdmU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaXNwbGF5ZWQgdmFsdWUgb2YgdGhlIG9wdGlvbi4gSXQgaXMgbmVjZXNzYXJ5IHRvIHNob3cgdGhlIHNlbGVjdGVkIG9wdGlvbiBpbiB0aGUKICAgICAgICAgKiBzZWxlY3QncyB0cmlnZ2VyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZpZXdWYWx1ZSgpIHsKICAgICAgICAgICAgLy8gVE9ETyhrYXJhKTogQWRkIGlucHV0IHByb3BlcnR5IGFsdGVybmF0aXZlIGZvciBub2RlIGVudnMuCiAgICAgICAgICAgIHJldHVybiAodGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS50ZXh0Q29udGVudCB8fCAnJykudHJpbSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZWxlY3RzIHRoZSBvcHRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZWxlY3QoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICAgICAgdGhpcy5fZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZWxlY3RzIHRoZSBvcHRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXNlbGVjdCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0U2VsZWN0aW9uQ2hhbmdlRXZlbnQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGZvY3VzIG9udG8gdGhpcyBvcHRpb24uCiAgICAgICAgICogQHBhcmFtIHs/PX0gX29yaWdpbgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvY3VzKF9vcmlnaW4sIG9wdGlvbnMpIHsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGFyZW4ndCB1c2luZyBgX29yaWdpbmAsIGJ1dCB3ZSBuZWVkIHRvIGtlZXAgaXQgYmVjYXVzZSBzb21lIGludGVybmFsIGNvbnN1bWVycwogICAgICAgICAgICAvLyB1c2UgYE1hdE9wdGlvbmAgaW4gYSBgRm9jdXNLZXlNYW5hZ2VyYCBhbmQgd2UgbmVlZCBpdCB0byBtYXRjaCBgRm9jdXNhYmxlT3B0aW9uYC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZ2V0SG9zdEVsZW1lbnQoKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiBlbGVtZW50LmZvY3VzID09PSAnZnVuY3Rpb24nKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgZGlzcGxheSBzdHlsZXMgb24gdGhlIG9wdGlvbiB0byBtYWtlIGl0IGFwcGVhcgogICAgICAgICAqIGFjdGl2ZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciBzbyBrZXkKICAgICAgICAgKiBldmVudHMgd2lsbCBkaXNwbGF5IHRoZSBwcm9wZXIgb3B0aW9ucyBhcyBhY3RpdmUgb24gYXJyb3cga2V5IGV2ZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldEFjdGl2ZVN0eWxlcygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9hY3RpdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FjdGl2ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZW1vdmVzIGRpc3BsYXkgc3R5bGVzIG9uIHRoZSBvcHRpb24gdGhhdCBtYWRlIGl0IGFwcGVhcgogICAgICAgICAqIGFjdGl2ZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBBY3RpdmVEZXNjZW5kYW50S2V5TWFuYWdlciBzbyBrZXkKICAgICAgICAgKiBldmVudHMgd2lsbCBkaXNwbGF5IHRoZSBwcm9wZXIgb3B0aW9ucyBhcyBhY3RpdmUgb24gYXJyb3cga2V5IGV2ZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldEluYWN0aXZlU3R5bGVzKCkgewogICAgICAgICAgICBpZiAodGhpcy5fYWN0aXZlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGxhYmVsIHRvIGJlIHVzZWQgd2hlbiBkZXRlcm1pbmluZyB3aGV0aGVyIHRoZSBvcHRpb24gc2hvdWxkIGJlIGZvY3VzZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRMYWJlbCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudmlld1ZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbnN1cmVzIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQgd2hlbiBhY3RpdmF0ZWQgZnJvbSB0aGUga2V5Ym9hcmQuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKChldmVudC5rZXlDb2RlID09PSBFTlRFUiB8fCBldmVudC5rZXlDb2RlID09PSBTUEFDRSkgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0VmlhSW50ZXJhY3Rpb24oKTsKICAgICAgICAgICAgICAgIC8vIFByZXZlbnQgdGhlIHBhZ2UgZnJvbSBzY3JvbGxpbmcgZG93biBhbmQgZm9ybSBzdWJtaXRzLgogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBgU2VsZWN0cyB0aGUgb3B0aW9uIHdoaWxlIGluZGljYXRpbmcgdGhlIHNlbGVjdGlvbiBjYW1lIGZyb20gdGhlIHVzZXIuIFVzZWQgdG8KICAgICAgICAgKiBkZXRlcm1pbmUgaWYgdGhlIHNlbGVjdCdzIHZpZXcgLT4gbW9kZWwgY2FsbGJhY2sgc2hvdWxkIGJlIGludm9rZWQuYAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NlbGVjdFZpYUludGVyYWN0aW9uKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdGhpcy5tdWx0aXBsZSA/ICF0aGlzLl9zZWxlY3RlZCA6IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRTZWxlY3Rpb25DaGFuZ2VFdmVudCh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBgYXJpYS1zZWxlY3RlZGAgdmFsdWUgZm9yIHRoZSBvcHRpb24uIFdlIGV4cGxpY2l0bHkgb21pdCB0aGUgYGFyaWEtc2VsZWN0ZWRgCiAgICAgICAgICogYXR0cmlidXRlIGZyb20gc2luZ2xlLXNlbGVjdGlvbiwgdW5zZWxlY3RlZCBvcHRpb25zLiBJbmNsdWRpbmcgdGhlIGBhcmlhLXNlbGVjdGVkPSJmYWxzZSJgCiAgICAgICAgICogYXR0cmlidXRlcyBhZGRzIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIG5vaXNlIHRvIHNjcmVlbi1yZWFkZXIgdXNlcnMgd2l0aG91dCBwcm92aWRpbmcgdXNlZnVsCiAgICAgICAgICogaW5mb3JtYXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0QXJpYVNlbGVjdGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3RlZCB8fCAodGhpcy5tdWx0aXBsZSA/IGZhbHNlIDogbnVsbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGNvcnJlY3QgdGFiaW5kZXggZm9yIHRoZSBvcHRpb24gZGVwZW5kaW5nIG9uIGRpc2FibGVkIHN0YXRlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFRhYkluZGV4KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCA/ICctMScgOiAnMCc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGhvc3QgRE9NIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0SG9zdEVsZW1lbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlclZpZXdDaGVja2VkKCkgewogICAgICAgICAgICAvLyBTaW5jZSBwYXJlbnQgY29tcG9uZW50cyBjb3VsZCBiZSB1c2luZyB0aGUgb3B0aW9uJ3MgbGFiZWwgdG8gZGlzcGxheSB0aGUgc2VsZWN0ZWQgdmFsdWVzCiAgICAgICAgICAgIC8vIChlLmcuIGBtYXQtc2VsZWN0YCkgYW5kIHRoZXkgZG9uJ3QgaGF2ZSBhIHdheSBvZiBrbm93aW5nIGlmIHRoZSBvcHRpb24ncyBsYWJlbCBoYXMgY2hhbmdlZAogICAgICAgICAgICAvLyB3ZSBoYXZlIHRvIGNoZWNrIGZvciBjaGFuZ2VzIGluIHRoZSBET00gb3Vyc2VsdmVzIGFuZCBkaXNwYXRjaCBhbiBldmVudC4gVGhlc2UgY2hlY2tzIGFyZQogICAgICAgICAgICAvLyByZWxhdGl2ZWx5IGNoZWFwLCBob3dldmVyIHdlIHN0aWxsIGxpbWl0IHRoZW0gb25seSB0byBzZWxlY3RlZCBvcHRpb25zIGluIG9yZGVyIHRvIGF2b2lkCiAgICAgICAgICAgIC8vIGhpdHRpbmcgdGhlIERPTSB0b28gb2Z0ZW4uCiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgdmlld1ZhbHVlID0gdGhpcy52aWV3VmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodmlld1ZhbHVlICE9PSB0aGlzLl9tb3N0UmVjZW50Vmlld1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbW9zdFJlY2VudFZpZXdWYWx1ZSA9IHZpZXdWYWx1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB0aGUgc2VsZWN0aW9uIGNoYW5nZSBldmVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzVXNlcklucHV0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZW1pdFNlbGVjdGlvbkNoYW5nZUV2ZW50KGlzVXNlcklucHV0ID0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KG5ldyBNYXRPcHRpb25TZWxlY3Rpb25DaGFuZ2UodGhpcywgaXNVc2VySW5wdXQpKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRPcHRpb24uybVmYWMgPSBmdW5jdGlvbiBNYXRPcHRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0T3B0aW9uKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdE9wdGdyb3VwLCA4KSk7IH07CiAgICBNYXRPcHRpb24uybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0T3B0aW9uLCBzZWxlY3RvcnM6IFtbIm1hdC1vcHRpb24iXV0sIGhvc3RBdHRyczogWyJyb2xlIiwgIm9wdGlvbiIsIDEsICJtYXQtb3B0aW9uIiwgIm1hdC1mb2N1cy1pbmRpY2F0b3IiXSwgaG9zdFZhcnM6IDEyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdE9wdGlvbl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRPcHRpb25fY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9zZWxlY3RWaWFJbnRlcmFjdGlvbigpOyB9KSgia2V5ZG93biIsIGZ1bmN0aW9uIE1hdE9wdGlvbl9rZXlkb3duX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlS2V5ZG93bigkZXZlbnQpOyB9KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWhvc3RQcm9wZXJ0eSgiaWQiLCBjdHguaWQpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ0YWJpbmRleCIsIGN0eC5fZ2V0VGFiSW5kZXgoKSkoImFyaWEtc2VsZWN0ZWQiLCBjdHguX2dldEFyaWFTZWxlY3RlZCgpKSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZC50b1N0cmluZygpKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXNlbGVjdGVkIiwgY3R4LnNlbGVjdGVkKSgibWF0LW9wdGlvbi1tdWx0aXBsZSIsIGN0eC5tdWx0aXBsZSkoIm1hdC1hY3RpdmUiLCBjdHguYWN0aXZlKSgibWF0LW9wdGlvbi1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgaWQ6ICJpZCIsIGRpc2FibGVkOiAiZGlzYWJsZWQiLCB2YWx1ZTogInZhbHVlIiB9LCBvdXRwdXRzOiB7IG9uU2VsZWN0aW9uQ2hhbmdlOiAib25TZWxlY3Rpb25DaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm1hdE9wdGlvbiJdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMiwgZGVjbHM6IDQsIHZhcnM6IDMsIGNvbnN0czogW1siY2xhc3MiLCAibWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3giLCAzLCAic3RhdGUiLCAiZGlzYWJsZWQiLCA0LCAibmdJZiJdLCBbMSwgIm1hdC1vcHRpb24tdGV4dCJdLCBbIm1hdC1yaXBwbGUiLCAiIiwgMSwgIm1hdC1vcHRpb24tcmlwcGxlIiwgMywgIm1hdFJpcHBsZVRyaWdnZXIiLCAibWF0UmlwcGxlRGlzYWJsZWQiXSwgWzEsICJtYXQtb3B0aW9uLXBzZXVkby1jaGVja2JveCIsIDMsICJzdGF0ZSIsICJkaXNhYmxlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdE9wdGlvbl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDAsIE1hdE9wdGlvbl9tYXRfcHNldWRvX2NoZWNrYm94XzBfVGVtcGxhdGUsIDEsIDIsICJtYXQtcHNldWRvLWNoZWNrYm94IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAxKTsKICAgICAgICAgICAgybXJtXByb2plY3Rpb24oMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDMsICJkaXYiLCAyKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Lm11bHRpcGxlKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlVHJpZ2dlciIsIGN0eC5fZ2V0SG9zdEVsZW1lbnQoKSkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4LmRpc2FibGVkIHx8IGN0eC5kaXNhYmxlUmlwcGxlKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBNYXRSaXBwbGUsCiAgICAgICAgICAgIE1hdFBzZXVkb0NoZWNrYm94XSwgc3R5bGVzOiBbIi5tYXQtb3B0aW9ue3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2xpbmUtaGVpZ2h0OjQ4cHg7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7dGV4dC1hbGlnbjpsZWZ0O3RleHQtZGVjb3JhdGlvbjpub25lO21heC13aWR0aDoxMDAlO3Bvc2l0aW9uOnJlbGF0aXZlO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246cm93O21heC13aWR0aDoxMDAlO2JveC1zaXppbmc6Ym9yZGVyLWJveDthbGlnbi1pdGVtczpjZW50ZXI7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtb3B0aW9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH1bZGlyPXJ0bF0gLm1hdC1vcHRpb257dGV4dC1hbGlnbjpyaWdodH0ubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLXJpZ2h0OjE2cHg7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtb3B0aW9uIC5tYXQtaWNvbiBzdmd7dmVydGljYWwtYWxpZ246dG9wfVtkaXI9cnRsXSAubWF0LW9wdGlvbiAubWF0LWljb257bWFyZ2luLWxlZnQ6MTZweDttYXJnaW4tcmlnaHQ6MH0ubWF0LW9wdGlvblthcmlhLWRpc2FibGVkPXRydWVdey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LW9wdGdyb3VwIC5tYXQtb3B0aW9uOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7cGFkZGluZy1sZWZ0OjMycHh9W2Rpcj1ydGxdIC5tYXQtb3B0Z3JvdXAgLm1hdC1vcHRpb246bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtwYWRkaW5nLWxlZnQ6MTZweDtwYWRkaW5nLXJpZ2h0OjMycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbnttYXJnaW46MCAxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JvcmRlcjpzb2xpZCAxcHggY3VycmVudENvbG9yO21hcmdpbjowfS5tYXQtb3B0aW9uLXRleHR7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1vcHRpb24gLm1hdC1vcHRpb24tcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW9wdGlvbiAubWF0LW9wdGlvbi1yaXBwbGV7b3BhY2l0eTouNX0ubWF0LW9wdGlvbi1wc2V1ZG8tY2hlY2tib3h7bWFyZ2luLXJpZ2h0OjhweH1bZGlyPXJ0bF0gLm1hdC1vcHRpb24tcHNldWRvLWNoZWNrYm94e21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6MH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdE9wdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX09QVElPTl9QQVJFTlRfQ09NUE9ORU5ULF0gfV0gfSwKICAgICAgICB7IHR5cGU6IE1hdE9wdGdyb3VwLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9CiAgICBdOwogICAgTWF0T3B0aW9uLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uU2VsZWN0aW9uQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIENvdW50cyB0aGUgYW1vdW50IG9mIG9wdGlvbiBncm91cCBsYWJlbHMgdGhhdCBwcmVjZWRlIHRoZSBzcGVjaWZpZWQgb3B0aW9uLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3B0aW9uSW5kZXggSW5kZXggb2YgdGhlIG9wdGlvbiBhdCB3aGljaCB0byBzdGFydCBjb3VudGluZy4KICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucyBGbGF0IGxpc3Qgb2YgYWxsIG9mIHRoZSBvcHRpb25zLgogICAgICogQHBhcmFtIHs/fSBvcHRpb25Hcm91cHMgRmxhdCBsaXN0IG9mIGFsbCBvZiB0aGUgb3B0aW9uIGdyb3Vwcy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9jb3VudEdyb3VwTGFiZWxzQmVmb3JlT3B0aW9uKG9wdGlvbkluZGV4LCBvcHRpb25zLCBvcHRpb25Hcm91cHMpIHsKICAgICAgICBpZiAob3B0aW9uR3JvdXBzLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvcHRpb25zQXJyYXkgPSBvcHRpb25zLnRvQXJyYXkoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZ3JvdXBzID0gb3B0aW9uR3JvdXBzLnRvQXJyYXkoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZ3JvdXBDb3VudGVyID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25JbmRleCArIDE7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnNBcnJheVtpXS5ncm91cCAmJiBvcHRpb25zQXJyYXlbaV0uZ3JvdXAgPT09IGdyb3Vwc1tncm91cENvdW50ZXJdKSB7CiAgICAgICAgICAgICAgICAgICAgZ3JvdXBDb3VudGVyKys7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGdyb3VwQ291bnRlcjsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIDA7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgdGhlIHBvc2l0aW9uIHRvIHdoaWNoIHRvIHNjcm9sbCBhIHBhbmVsIGluIG9yZGVyIGZvciBhbiBvcHRpb24gdG8gYmUgaW50byB2aWV3LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3B0aW9uSW5kZXggSW5kZXggb2YgdGhlIG9wdGlvbiB0byBiZSBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3LgogICAgICogQHBhcmFtIHs/fSBvcHRpb25IZWlnaHQgSGVpZ2h0IG9mIHRoZSBvcHRpb25zLgogICAgICogQHBhcmFtIHs/fSBjdXJyZW50U2Nyb2xsUG9zaXRpb24gQ3VycmVudCBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIHBhbmVsLgogICAgICogQHBhcmFtIHs/fSBwYW5lbEhlaWdodCBIZWlnaHQgb2YgdGhlIHBhbmVsLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2dldE9wdGlvblNjcm9sbFBvc2l0aW9uKG9wdGlvbkluZGV4LCBvcHRpb25IZWlnaHQsIGN1cnJlbnRTY3JvbGxQb3NpdGlvbiwgcGFuZWxIZWlnaHQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3B0aW9uT2Zmc2V0ID0gb3B0aW9uSW5kZXggKiBvcHRpb25IZWlnaHQ7CiAgICAgICAgaWYgKG9wdGlvbk9mZnNldCA8IGN1cnJlbnRTY3JvbGxQb3NpdGlvbikgewogICAgICAgICAgICByZXR1cm4gb3B0aW9uT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBpZiAob3B0aW9uT2Zmc2V0ICsgb3B0aW9uSGVpZ2h0ID4gY3VycmVudFNjcm9sbFBvc2l0aW9uICsgcGFuZWxIZWlnaHQpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDAsIG9wdGlvbk9mZnNldCAtIHBhbmVsSGVpZ2h0ICsgb3B0aW9uSGVpZ2h0KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGN1cnJlbnRTY3JvbGxQb3NpdGlvbjsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL29wdGlvbi9pbmRleC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRPcHRpb25Nb2R1bGUgewogICAgfQogICAgTWF0T3B0aW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0T3B0aW9uTW9kdWxlIH0pOwogICAgTWF0T3B0aW9uTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0T3B0aW9uTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdE9wdGlvbk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tNYXRSaXBwbGVNb2R1bGUsIENvbW1vbk1vZHVsZSwgTWF0UHNldWRvQ2hlY2tib3hNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdE9wdGlvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRPcHRpb24sCiAgICAgICAgICAgIE1hdE9wdGdyb3VwXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFJpcHBsZU1vZHVsZSwKICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBNYXRQc2V1ZG9DaGVja2JveE1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRPcHRpb24sCiAgICAgICAgICAgIE1hdE9wdGdyb3VwXTsgfSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jb3JlL2xhYmVsL2xhYmVsLW9wdGlvbnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBJbmplY3Rpb25Ub2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGdsb2JhbCBsYWJlbCBvcHRpb25zLgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGBNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlNgIGluamVjdGlvbiB0b2tlbiBmcm9tCiAgICAgKiAgICAgYFxAYW5ndWxhci9tYXRlcmlhbC9mb3JtLWZpZWxkYCBpbnN0ZWFkLgogICAgICogXEBicmVha2luZy1jaGFuZ2UgMTEuMC4wCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0xBQkVMX0dMT0JBTF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtbGFiZWwtZ2xvYmFsLW9wdGlvbnMnKTsKCiAgICBjb25zdCBfYzAkMSA9IFsiKiIsIFtbIm1hdC10b29sYmFyLXJvdyJdXV07CiAgICBjb25zdCBfYzEkMSA9IFsiKiIsICJtYXQtdG9vbGJhci1yb3ciXTsKICAgIGNsYXNzIE1hdFRvb2xiYXJCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9NYXRUb29sYmFyTWl4aW5CYXNlID0gbWl4aW5Db2xvcihNYXRUb29sYmFyQmFzZSk7CiAgICBjbGFzcyBNYXRUb29sYmFyUm93IHsKICAgIH0KICAgIE1hdFRvb2xiYXJSb3cuybVmYWMgPSBmdW5jdGlvbiBNYXRUb29sYmFyUm93X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRvb2xiYXJSb3cpKCk7IH07CiAgICBNYXRUb29sYmFyUm93Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFRvb2xiYXJSb3csIHNlbGVjdG9yczogW1sibWF0LXRvb2xiYXItcm93Il1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXRvb2xiYXItcm93Il0sIGV4cG9ydEFzOiBbIm1hdFRvb2xiYXJSb3ciXSB9KTsKICAgIGNsYXNzIE1hdFRvb2xiYXIgZXh0ZW5kcyBfTWF0VG9vbGJhck1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez89fSBkb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9wbGF0Zm9ybSwgZG9jdW1lbnQpIHsKICAgICAgICAgICAgc3VwZXIoZWxlbWVudFJlZik7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgICAgICAvLyBUT0RPOiBtYWtlIHRoZSBkb2N1bWVudCBhIHJlcXVpcmVkIHBhcmFtIHdoZW4gZG9pbmcgYnJlYWtpbmcgY2hhbmdlcy4KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyVmlld0luaXQoKSB7CiAgICAgICAgICAgIGlmICghaXNEZXZNb2RlKCkgfHwgIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NoZWNrVG9vbGJhck1peGVkTW9kZXMoKTsKICAgICAgICAgICAgdGhpcy5fdG9vbGJhclJvd3MuY2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fY2hlY2tUb29sYmFyTWl4ZWRNb2RlcygpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gd2hlbiBkZXZlbG9wZXJzIGFyZSBhdHRlbXB0aW5nIHRvIGNvbWJpbmUgdGhlIGRpZmZlcmVudCB0b29sYmFyIHJvdyBtb2Rlcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrVG9vbGJhck1peGVkTW9kZXMoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fdG9vbGJhclJvd3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgYXJlIGFueSBvdGhlciBET00gbm9kZXMgdGhhdCBjYW4gZGlzcGxheSBjb250ZW50IGJ1dCBhcmVuJ3QgaW5zaWRlIG9mCiAgICAgICAgICAgIC8vIGEgPG1hdC10b29sYmFyLXJvdz4gZWxlbWVudC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0NvbWJpbmVkVXNhZ2UgPSBBcnJheS5mcm9tKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jaGlsZE5vZGVzKQogICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiAhKG5vZGUuY2xhc3NMaXN0ICYmIG5vZGUuY2xhc3NMaXN0LmNvbnRhaW5zKCdtYXQtdG9vbGJhci1yb3cnKSkpKQogICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiBub2RlLm5vZGVUeXBlICE9PSAodGhpcy5fZG9jdW1lbnQgPyB0aGlzLl9kb2N1bWVudC5DT01NRU5UX05PREUgOiA4KSkpCiAgICAgICAgICAgICAgICAuc29tZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbm9kZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgbm9kZSA9PiAhIShub2RlLnRleHRDb250ZW50ICYmIG5vZGUudGV4dENvbnRlbnQudHJpbSgpKSkpOwogICAgICAgICAgICBpZiAoaXNDb21iaW5lZFVzYWdlKSB7CiAgICAgICAgICAgICAgICB0aHJvd1Rvb2xiYXJNaXhlZE1vZGVzRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE1hdFRvb2xiYXIuybVmYWMgPSBmdW5jdGlvbiBNYXRUb29sYmFyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRvb2xiYXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKICAgIE1hdFRvb2xiYXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0VG9vbGJhciwgc2VsZWN0b3JzOiBbWyJtYXQtdG9vbGJhciJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdFRvb2xiYXJfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRUb29sYmFyUm93LCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll90b29sYmFyUm93cyA9IF90KTsKICAgICAgICB9IH0sIGhvc3RBdHRyczogWzEsICJtYXQtdG9vbGJhciJdLCBob3N0VmFyczogNCwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRUb29sYmFyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRvb2xiYXItbXVsdGlwbGUtcm93cyIsIGN0eC5fdG9vbGJhclJvd3MubGVuZ3RoID4gMCkoIm1hdC10b29sYmFyLXNpbmdsZS1yb3ciLCBjdHguX3Rvb2xiYXJSb3dzLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgY29sb3I6ICJjb2xvciIgfSwgZXhwb3J0QXM6IFsibWF0VG9vbGJhciJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMSQxLCBkZWNsczogMiwgdmFyczogMCwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRvb2xiYXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKF9jMCQxKTsKICAgICAgICAgICAgybXJtXByb2plY3Rpb24oMCk7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDEsIDEpOwogICAgICAgIH0gfSwgc3R5bGVzOiBbIi5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sYmFye291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7ZGlzcGxheTpmbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlO2ZsZXgtZGlyZWN0aW9uOnJvdzthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze2Rpc3BsYXk6ZmxleDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZmxleC1kaXJlY3Rpb246Y29sdW1uO3dpZHRoOjEwMCV9Lm1hdC10b29sYmFyLW11bHRpcGxlLXJvd3N7bWluLWhlaWdodDo2NHB4fS5tYXQtdG9vbGJhci1yb3csLm1hdC10b29sYmFyLXNpbmdsZS1yb3d7aGVpZ2h0OjY0cHh9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdG9vbGJhci1tdWx0aXBsZS1yb3dze21pbi1oZWlnaHQ6NTZweH0ubWF0LXRvb2xiYXItcm93LC5tYXQtdG9vbGJhci1zaW5nbGUtcm93e2hlaWdodDo1NnB4fX1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFRvb2xiYXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIE1hdFRvb2xiYXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgX3Rvb2xiYXJSb3dzOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRUb29sYmFyUm93LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XQogICAgfTsKICAgIC8qKgogICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gY29tYmluZSB0aGUgZGlmZmVyZW50IHRvb2xiYXIgcm93IG1vZGVzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93VG9vbGJhck1peGVkTW9kZXNFcnJvcigpIHsKICAgICAgICB0aHJvdyBFcnJvcignTWF0VG9vbGJhcjogQXR0ZW1wdGluZyB0byBjb21iaW5lIGRpZmZlcmVudCB0b29sYmFyIG1vZGVzLiAnICsKICAgICAgICAgICAgJ0VpdGhlciBzcGVjaWZ5IG11bHRpcGxlIGA8bWF0LXRvb2xiYXItcm93PmAgZWxlbWVudHMgZXhwbGljaXRseSBvciBqdXN0IHBsYWNlIGNvbnRlbnQgJyArCiAgICAgICAgICAgICdpbnNpZGUgb2YgYSBgPG1hdC10b29sYmFyPmAgZm9yIGEgc2luZ2xlIHJvdy4nKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90b29sYmFyL3Rvb2xiYXItbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1hdFRvb2xiYXJNb2R1bGUgewogICAgfQogICAgTWF0VG9vbGJhck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFRvb2xiYXJNb2R1bGUgfSk7CiAgICBNYXRUb29sYmFyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0VG9vbGJhck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUb29sYmFyTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW01hdENvbW1vbk1vZHVsZV0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRUb29sYmFyTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFRvb2xiYXIsCiAgICAgICAgICAgIE1hdFRvb2xiYXJSb3ddOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFRvb2xiYXIsCiAgICAgICAgICAgIE1hdFRvb2xiYXJSb3csCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0gfSk7IH0pKCk7CgogICAgLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKiogRGF0YS1yZWxhdGVkIHR5cGVzICovCiAgICB2YXIgRGF0YUxvYWRTdGF0ZTsKICAgIChmdW5jdGlvbiAoRGF0YUxvYWRTdGF0ZSkgewogICAgICAgIERhdGFMb2FkU3RhdGVbRGF0YUxvYWRTdGF0ZVsiTk9UX0xPQURFRCJdID0gMF0gPSAiTk9UX0xPQURFRCI7CiAgICAgICAgRGF0YUxvYWRTdGF0ZVtEYXRhTG9hZFN0YXRlWyJMT0FERUQiXSA9IDFdID0gIkxPQURFRCI7CiAgICAgICAgRGF0YUxvYWRTdGF0ZVtEYXRhTG9hZFN0YXRlWyJMT0FESU5HIl0gPSAyXSA9ICJMT0FESU5HIjsKICAgICAgICBEYXRhTG9hZFN0YXRlW0RhdGFMb2FkU3RhdGVbIkZBSUxFRCJdID0gM10gPSAiRkFJTEVEIjsKICAgIH0pKERhdGFMb2FkU3RhdGUgfHwgKERhdGFMb2FkU3RhdGUgPSB7fSkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvc3RvcmUvY29yZV90eXBlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDT1JFX0ZFQVRVUkVfS0VZID0gJ2NvcmUnOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdGlhbFN0YXRlID0gewogICAgICAgIGFjdGl2ZVBsdWdpbjogbnVsbCwKICAgICAgICBwbHVnaW5zOiB7fSwKICAgICAgICBwbHVnaW5zTGlzdExvYWRlZDogewogICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgICAgICBsYXN0TG9hZGVkVGltZUluTXM6IG51bGwsCiAgICAgICAgICAgIGZhaWx1cmVDb2RlOiBudWxsLAogICAgICAgIH0sCiAgICAgICAgcmVsb2FkUGVyaW9kSW5NczogMzAwMDAsCiAgICAgICAgcmVsb2FkRW5hYmxlZDogZmFsc2UsCiAgICAgICAgcGFnZVNpemU6IDEyLAogICAgICAgIGVudmlyb25tZW50OiB7CiAgICAgICAgICAgIGRhdGFfbG9jYXRpb246ICcnLAogICAgICAgICAgICB3aW5kb3dfdGl0bGU6ICcnLAogICAgICAgIH0sCiAgICAgICAgcG9seW1lckludGVyb3BSdW5zOiBbXSwKICAgICAgICBwb2x5bWVySW50ZXJvcFJ1blNlbGVjdGlvbjogbmV3IFNldCgpLAogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3N0b3JlL2NvcmVfcmVkdWNlcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVkdWNlciA9IGNyZWF0ZVJlZHVjZXIoaW5pdGlhbFN0YXRlLCBvbihjaGFuZ2VQbHVnaW4sIHBsdWdpblVybEhhc2hDaGFuZ2VkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IHBsdWdpbiB9KSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGFjdGl2ZVBsdWdpbjogcGx1Z2luIH0pOwogICAgfSkpLCBvbihwbHVnaW5zTGlzdGluZ1JlcXVlc3RlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHBsdWdpbnNMaXN0TG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnBsdWdpbnNMaXN0TG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FESU5HIH0pIH0pOwogICAgfSkpLCBvbihwbHVnaW5zTGlzdGluZ0ZhaWxlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBmYWlsdXJlQ29kZSB9KSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHBsdWdpbnNMaXN0TG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnBsdWdpbnNMaXN0TG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5GQUlMRUQsIGZhaWx1cmVDb2RlIH0pIH0pOwogICAgfSkpLCBvbihwbHVnaW5zTGlzdGluZ0xvYWRlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBwbHVnaW5zIH0pID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZmlyc3RFbmFibGVkUGx1Z2luSWQgPSBPYmplY3Qua2V5cyhwbHVnaW5zKS5maW5kKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsdWdpbklkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocGx1Z2luSWQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIHBsdWdpbnNbcGx1Z2luSWRdLmVuYWJsZWQ7CiAgICAgICAgfSkpIHx8IG51bGw7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFjdGl2ZVBsdWdpbiA9IHN0YXRlLmFjdGl2ZVBsdWdpbiB8fCBmaXJzdEVuYWJsZWRQbHVnaW5JZDsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgYWN0aXZlUGx1Z2luLAogICAgICAgICAgICBwbHVnaW5zLCBwbHVnaW5zTGlzdExvYWRlZDogewogICAgICAgICAgICAgICAgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BREVELAogICAgICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBEYXRlLm5vdygpLAogICAgICAgICAgICAgICAgZmFpbHVyZUNvZGU6IG51bGwsCiAgICAgICAgICAgIH0gfSk7CiAgICB9KSksIG9uKGVudmlyb25tZW50TG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IGVudmlyb25tZW50IH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZW52aXJvbm1lbnQ6IGVudmlyb25tZW50IH0pOwogICAgfSkpLCBvbih0b2dnbGVSZWxvYWRFbmFibGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcmVsb2FkRW5hYmxlZDogIXN0YXRlLnJlbG9hZEVuYWJsZWQgfSk7CiAgICB9KSksIG9uKGNoYW5nZVJlbG9hZFBlcmlvZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBwZXJpb2RJbk1zIH0pID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV4dFJlbG9hZFBlcmlvZCA9IHBlcmlvZEluTXMgPiAwID8gcGVyaW9kSW5NcyA6IHN0YXRlLnJlbG9hZFBlcmlvZEluTXM7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHJlbG9hZFBlcmlvZEluTXM6IG5leHRSZWxvYWRQZXJpb2QgfSk7CiAgICB9KSksIG9uKGNoYW5nZVBhZ2VTaXplLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IHNpemUgfSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXh0UGFnZVNpemUgPSBzaXplID4gMCA/IHNpemUgOiBzdGF0ZS5wYWdlU2l6ZTsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcGFnZVNpemU6IG5leHRQYWdlU2l6ZSB9KTsKICAgIH0pKSwgb24oZmV0Y2hSdW5TdWNjZWVkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgcnVucyB9KSA9PiB7CiAgICAgICAgLy8gRG8gbm90IG1vZGlmeSB0aGUgcnVuU2VsZWN0aW9uIHNpbmNlIHRoZSBQb2x5bWVyIGNvbXBvbmVudCBpcyB0aGUKICAgICAgICAvLyBzb3VyY2Ugb2YgdHJ1dGggZm9yIHRoZSBQb2x5bWVyIEludGVyb3AuCiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHBvbHltZXJJbnRlcm9wUnVuczogcnVucyB9KTsKICAgIH0pKSwgb24ocG9seW1lckludGVyb3BSdW5TZWxlY3Rpb25DaGFuZ2VkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IG5leHRTZWxlY3Rpb24gfSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBwb2x5bWVySW50ZXJvcFJ1blNlbGVjdGlvbjogbmV3IFNldChuZXh0U2VsZWN0aW9uKSB9KTsKICAgIH0pKSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZWR1Y2VycyhzdGF0ZSwgYWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHJlZHVjZXIoc3RhdGUsIGFjdGlvbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvY29yZS9zdG9yZS9jb3JlX3NlbGVjdG9ycy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzZWxlY3RDb3JlU3RhdGUgPSBjcmVhdGVGZWF0dXJlU2VsZWN0b3IoQ09SRV9GRUFUVVJFX0tFWSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRQbHVnaW5zTGlzdExvYWRlZCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiBzdGF0ZS5wbHVnaW5zTGlzdExvYWRlZCkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0QWN0aXZlUGx1Z2luID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0Q29yZVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuYWN0aXZlUGx1Z2luOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0UGx1Z2lucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnBsdWdpbnM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRFbnZpcm9ubWVudCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmVudmlyb25tZW50OwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0UmVsb2FkRW5hYmxlZCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdENvcmVTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnJlbG9hZEVuYWJsZWQ7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRSZWxvYWRQZXJpb2RJbk1zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0Q29yZVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUucmVsb2FkUGVyaW9kSW5NczsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldFBhZ2VTaXplID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0Q29yZVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUucGFnZVNpemU7CiAgICB9KSk7CgogICAgZnVuY3Rpb24gdGhyb3dOdWxsUG9ydGFsRXJyb3IoKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ011c3QgcHJvdmlkZSBhIHBvcnRhbCB0byBhdHRhY2gnKTsKICAgIH0KICAgIC8qKgogICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGEgcG9ydGFsIHRvIGEgaG9zdCB0aGF0IGlzIGFscmVhZHkgYXR0YWNoZWQuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdGhyb3dQb3J0YWxBbHJlYWR5QXR0YWNoZWRFcnJvcigpIHsKICAgICAgICB0aHJvdyBFcnJvcignSG9zdCBhbHJlYWR5IGhhcyBhIHBvcnRhbCBhdHRhY2hlZCcpOwogICAgfQogICAgLyoqCiAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIHdoZW4gYXR0ZW1wdGluZyB0byBhdHRhY2ggYSBwb3J0YWwgdG8gYW4gYWxyZWFkeS1kaXNwb3NlZCBob3N0LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93UG9ydGFsT3V0bGV0QWxyZWFkeURpc3Bvc2VkRXJyb3IoKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoJ1RoaXMgUG9ydGFsT3V0bGV0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQnKTsKICAgIH0KICAgIC8qKgogICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGFuIHVua25vd24gcG9ydGFsIHR5cGUuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdGhyb3dVbmtub3duUG9ydGFsVHlwZUVycm9yKCkgewogICAgICAgIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBhbiB1bmtub3duIFBvcnRhbCB0eXBlLiBCYXNlUG9ydGFsT3V0bGV0IGFjY2VwdHMgZWl0aGVyICcgKwogICAgICAgICAgICAnYSBDb21wb25lbnRQb3J0YWwgb3IgYSBUZW1wbGF0ZVBvcnRhbC4nKTsKICAgIH0KICAgIC8qKgogICAgICogVGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGEgcG9ydGFsIHRvIGEgbnVsbCBob3N0LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93TnVsbFBvcnRhbE91dGxldEVycm9yKCkgewogICAgICAgIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBhIHBvcnRhbCB0byBhIG51bGwgUG9ydGFsT3V0bGV0Jyk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gd2hlbiBhdHRlbXB0aW5nIHRvIGRldGFjaCBhIHBvcnRhbCB0aGF0IGlzIG5vdCBhdHRhY2hlZC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB0aHJvd05vUG9ydGFsQXR0YWNoZWRFcnJvcigpIHsKICAgICAgICB0aHJvdyBFcnJvcignQXR0ZW1wdGluZyB0byBkZXRhY2ggYSBwb3J0YWwgdGhhdCBpcyBub3QgYXR0YWNoZWQgdG8gYSBob3N0Jyk7CiAgICB9CiAgICAvKioKICAgICAqIEEgYFBvcnRhbGAgaXMgc29tZXRoaW5nIHRoYXQgeW91IHdhbnQgdG8gcmVuZGVyIHNvbWV3aGVyZSBlbHNlLgogICAgICogSXQgY2FuIGJlIGF0dGFjaCB0byAvIGRldGFjaGVkIGZyb20gYSBgUG9ydGFsT3V0bGV0YC4KICAgICAqIEBhYnN0cmFjdAogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgUG9ydGFsIHsKICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2ggdGhpcyBwb3J0YWwgdG8gYSBob3N0LgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoKGhvc3QpIHsKICAgICAgICAgICAgaWYgKGhvc3QgPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhyb3dOdWxsUG9ydGFsT3V0bGV0RXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaG9zdC5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aHJvd1BvcnRhbEFscmVhZHlBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRIb3N0ID0gaG9zdDsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChob3N0LmF0dGFjaCh0aGlzKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2ggdGhpcyBwb3J0YWwgZnJvbSBpdHMgaG9zdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBob3N0ID0gdGhpcy5fYXR0YWNoZWRIb3N0OwogICAgICAgICAgICBpZiAoaG9zdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvd05vUG9ydGFsQXR0YWNoZWRFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRIb3N0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGhvc3QuZGV0YWNoKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGlzIHBvcnRhbCBpcyBhdHRhY2hlZCB0byBhIGhvc3QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaXNBdHRhY2hlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaGVkSG9zdCAhPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBQb3J0YWxPdXRsZXQgcmVmZXJlbmNlIHdpdGhvdXQgcGVyZm9ybWluZyBgYXR0YWNoKClgLiBUaGlzIGlzIHVzZWQgZGlyZWN0bHkgYnkKICAgICAgICAgKiB0aGUgUG9ydGFsT3V0bGV0IHdoZW4gaXQgaXMgcGVyZm9ybWluZyBhbiBgYXR0YWNoKClgIG9yIGBkZXRhY2goKWAuCiAgICAgICAgICogQHBhcmFtIHs/fSBob3N0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRBdHRhY2hlZEhvc3QoaG9zdCkgewogICAgICAgICAgICB0aGlzLl9hdHRhY2hlZEhvc3QgPSBob3N0OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBgQ29tcG9uZW50UG9ydGFsYCBpcyBhIHBvcnRhbCB0aGF0IGluc3RhbnRpYXRlcyBzb21lIENvbXBvbmVudCB1cG9uIGF0dGFjaG1lbnQuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBDb21wb25lbnRQb3J0YWwgZXh0ZW5kcyBQb3J0YWwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50CiAgICAgICAgICogQHBhcmFtIHs/PX0gdmlld0NvbnRhaW5lclJlZgogICAgICAgICAqIEBwYXJhbSB7Pz19IGluamVjdG9yCiAgICAgICAgICogQHBhcmFtIHs/PX0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29tcG9uZW50LCB2aWV3Q29udGFpbmVyUmVmLCBpbmplY3RvciwgY29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50ID0gY29tcG9uZW50OwogICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXJSZWYgPSB2aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICB0aGlzLmluamVjdG9yID0gaW5qZWN0b3I7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBgVGVtcGxhdGVQb3J0YWxgIGlzIGEgcG9ydGFsIHRoYXQgcmVwcmVzZW50cyBzb21lIGVtYmVkZGVkIHRlbXBsYXRlIChUZW1wbGF0ZVJlZikuCiAgICAgKiBAdGVtcGxhdGUgQwogICAgICovCiAgICBjbGFzcyBUZW1wbGF0ZVBvcnRhbCBleHRlbmRzIFBvcnRhbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSwgdmlld0NvbnRhaW5lclJlZiwgY29udGV4dCkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLnRlbXBsYXRlUmVmID0gdGVtcGxhdGU7CiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lclJlZiA9IHZpZXdDb250YWluZXJSZWY7CiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG9yaWdpbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMudGVtcGxhdGVSZWYuZWxlbWVudFJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoIHRoZSBwb3J0YWwgdG8gdGhlIHByb3ZpZGVkIGBQb3J0YWxPdXRsZXRgLgogICAgICAgICAqIFdoZW4gYSBjb250ZXh0IGlzIHByb3ZpZGVkIGl0IHdpbGwgb3ZlcnJpZGUgdGhlIGBjb250ZXh0YCBwcm9wZXJ0eSBvZiB0aGUgYFRlbXBsYXRlUG9ydGFsYAogICAgICAgICAqIGluc3RhbmNlLgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaChob3N0LCBjb250ZXh0ID0gdGhpcy5jb250ZXh0KSB7CiAgICAgICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5hdHRhY2goaG9zdCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoKCkgewogICAgICAgICAgICB0aGlzLmNvbnRleHQgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgIHJldHVybiBzdXBlci5kZXRhY2goKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEEgYERvbVBvcnRhbGAgaXMgYSBwb3J0YWwgd2hvc2UgRE9NIGVsZW1lbnQgd2lsbCBiZSB0YWtlbiBmcm9tIGl0cyBjdXJyZW50IHBvc2l0aW9uCiAgICAgKiBpbiB0aGUgRE9NIGFuZCBtb3ZlZCBpbnRvIGEgcG9ydGFsIG91dGxldCwgd2hlbiBpdCBpcyBhdHRhY2hlZC4gT24gZGV0YWNoLCB0aGUgY29udGVudAogICAgICogd2lsbCBiZSByZXN0b3JlZCB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24uCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBEb21Qb3J0YWwgZXh0ZW5kcyBQb3J0YWwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnQpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudCBpbnN0YW5jZW9mIEVsZW1lbnRSZWYgPyBlbGVtZW50Lm5hdGl2ZUVsZW1lbnQgOiBlbGVtZW50OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiBQb3J0YWxPdXRsZXQgdGhhdCBoYW5kbGVzIGF0dGFjaGluZwogICAgICogQ29tcG9uZW50UG9ydGFsIGFuZCBUZW1wbGF0ZVBvcnRhbC4KICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBCYXNlUG9ydGFsT3V0bGV0IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhpcyBob3N0IGhhcyBhbHJlYWR5IGJlZW4gcGVybWFuZW50bHkgZGlzcG9zZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wIGBhdHRhY2hEb21Qb3J0YWxgIHRvIGJlY29tZSBhIHJlcXVpcmVkIGFic3RyYWN0IG1ldGhvZC4KICAgICAgICAgICAgdGhpcy5hdHRhY2hEb21Qb3J0YWwgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoaXMgaG9zdCBoYXMgYW4gYXR0YWNoZWQgcG9ydGFsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFzQXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuX2F0dGFjaGVkUG9ydGFsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2hlcyBhIHBvcnRhbC4KICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoKHBvcnRhbCkgewogICAgICAgICAgICBpZiAoIXBvcnRhbCkgewogICAgICAgICAgICAgICAgdGhyb3dOdWxsUG9ydGFsRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aHJvd1BvcnRhbEFscmVhZHlBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQpIHsKICAgICAgICAgICAgICAgIHRocm93UG9ydGFsT3V0bGV0QWxyZWFkeURpc3Bvc2VkRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9ydGFsIGluc3RhbmNlb2YgQ29tcG9uZW50UG9ydGFsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdHRhY2hlZFBvcnRhbCA9IHBvcnRhbDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHBvcnRhbCBpbnN0YW5jZW9mIFRlbXBsYXRlUG9ydGFsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdHRhY2hlZFBvcnRhbCA9IHBvcnRhbDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCk7CiAgICAgICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMCByZW1vdmUgbnVsbCBjaGVjayBmb3IgYHRoaXMuYXR0YWNoRG9tUG9ydGFsYC4KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLmF0dGFjaERvbVBvcnRhbCAmJiBwb3J0YWwgaW5zdGFuY2VvZiBEb21Qb3J0YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsID0gcG9ydGFsOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXR0YWNoRG9tUG9ydGFsKHBvcnRhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhyb3dVbmtub3duUG9ydGFsVHlwZUVycm9yKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGFjaGVzIGEgcHJldmlvdXNseSBhdHRhY2hlZCBwb3J0YWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXRhY2goKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hdHRhY2hlZFBvcnRhbCkgewogICAgICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwuc2V0QXR0YWNoZWRIb3N0KG51bGwpOwogICAgICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2ludm9rZURpc3Bvc2VGbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQZXJtYW5lbnRseSBkaXNwb3NlIG9mIHRoaXMgcG9ydGFsIGhvc3QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNwb3NlKCkgewogICAgICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRldGFjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2ludm9rZURpc3Bvc2VGbigpOwogICAgICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNwb3NlRm4oZm4pIHsKICAgICAgICAgICAgdGhpcy5fZGlzcG9zZUZuID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW52b2tlRGlzcG9zZUZuKCkgewogICAgICAgICAgICBpZiAodGhpcy5fZGlzcG9zZUZuKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwb3NlRm4oKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3Bvc2VGbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3BvcnRhbC9kb20tcG9ydGFsLW91dGxldC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEEgUG9ydGFsT3V0bGV0IGZvciBhdHRhY2hpbmcgcG9ydGFscyB0byBhbiBhcmJpdHJhcnkgRE9NIGVsZW1lbnQgb3V0c2lkZSBvZiB0aGUgQW5ndWxhcgogICAgICogYXBwbGljYXRpb24gY29udGV4dC4KICAgICAqLwogICAgY2xhc3MgRG9tUG9ydGFsT3V0bGV0IGV4dGVuZHMgQmFzZVBvcnRhbE91dGxldCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvdXRsZXRFbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBfY29tcG9uZW50RmFjdG9yeVJlc29sdmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfYXBwUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGVmYXVsdEluamVjdG9yCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2RvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iob3V0bGV0RWxlbWVudCwgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX2FwcFJlZiwgX2RlZmF1bHRJbmplY3RvciwgCiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgYF9kb2N1bWVudGAgUGFyYW1ldGVyIHRvIGJlIG1hZGUgcmVxdWlyZWQuCiAgICAgICAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAgICAgKi8KICAgICAgICBfZG9jdW1lbnQpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5vdXRsZXRFbGVtZW50ID0gb3V0bGV0RWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgICAgICAgICAgdGhpcy5fYXBwUmVmID0gX2FwcFJlZjsKICAgICAgICAgICAgdGhpcy5fZGVmYXVsdEluamVjdG9yID0gX2RlZmF1bHRJbmplY3RvcjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF0dGFjaGVzIGEgRE9NIHBvcnRhbCBieSB0cmFuc2ZlcnJpbmcgaXRzIGNvbnRlbnQgaW50byB0aGUgb3V0bGV0LgogICAgICAgICAgICAgKiBAcGFyYW0gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZC4KICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgVG8gYmUgdHVybmVkIGludG8gYSBtZXRob2QuCiAgICAgICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hdHRhY2hEb21Qb3J0YWwgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocG9ydGFsKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMCBSZW1vdmUgY2hlY2sgYW5kIGVycm9yIG9uY2UgdGhlCiAgICAgICAgICAgICAgICAvLyBgX2RvY3VtZW50YCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQuCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2RvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0Nhbm5vdCBhdHRhY2ggRE9NIHBvcnRhbCB3aXRob3V0IF9kb2N1bWVudCBjb25zdHJ1Y3RvciBwYXJhbWV0ZXInKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBwb3J0YWwuZWxlbWVudDsKICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0RPTSBwb3J0YWwgY29udGVudCBtdXN0IGJlIGF0dGFjaGVkIHRvIGEgcGFyZW50IG5vZGUuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBBbmNob3IgdXNlZCB0byBzYXZlIHRoZSBlbGVtZW50J3MgcHJldmlvdXMgcG9zaXRpb24gc28KICAgICAgICAgICAgICAgIC8vIHRoYXQgd2UgY2FuIHJlc3RvcmUgaXQgd2hlbiB0aGUgcG9ydGFsIGlzIGRldGFjaGVkLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYW5jaG9yTm9kZSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUNvbW1lbnQoJ2RvbS1wb3J0YWwnKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW5jaG9yTm9kZSwgZWxlbWVudCk7CiAgICAgICAgICAgICAgICB0aGlzLm91dGxldEVsZW1lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgICAgICAgICAgICAgICBzdXBlci5zZXREaXNwb3NlRm4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbid0IHVzZSBgcmVwbGFjZVdpdGhgIGhlcmUgYmVjYXVzZSBJRSBkb2Vzbid0IHN1cHBvcnQgaXQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGFuY2hvck5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBhbmNob3JOb2RlLnBhcmVudE5vZGUucmVwbGFjZUNoaWxkKGVsZW1lbnQsIGFuY2hvck5vZGUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2ggdGhlIGdpdmVuIENvbXBvbmVudFBvcnRhbCB0byBET00gZWxlbWVudCB1c2luZyB0aGUgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgICAgICogQHBhcmFtIHs/fSBwb3J0YWwgUG9ydGFsIHRvIGJlIGF0dGFjaGVkCiAgICAgICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBhdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzb2x2ZXIgPSBwb3J0YWwuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyIHx8IHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wb25lbnRGYWN0b3J5ID0gcmVzb2x2ZXIucmVzb2x2ZUNvbXBvbmVudEZhY3RvcnkocG9ydGFsLmNvbXBvbmVudCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbXBvbmVudFJlZjsKICAgICAgICAgICAgLy8gSWYgdGhlIHBvcnRhbCBzcGVjaWZpZXMgYSBWaWV3Q29udGFpbmVyUmVmLCB3ZSB3aWxsIHVzZSB0aGF0IGFzIHRoZSBhdHRhY2htZW50IHBvaW50CiAgICAgICAgICAgIC8vIGZvciB0aGUgY29tcG9uZW50IChpbiB0ZXJtcyBvZiBBbmd1bGFyJ3MgY29tcG9uZW50IHRyZWUsIG5vdCByZW5kZXJpbmcpLgogICAgICAgICAgICAvLyBXaGVuIHRoZSBWaWV3Q29udGFpbmVyUmVmIGlzIG1pc3NpbmcsIHdlIHVzZSB0aGUgZmFjdG9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBkaXJlY3RseQogICAgICAgICAgICAvLyBhbmQgdGhlbiBtYW51YWxseSBhdHRhY2ggdGhlIHZpZXcgdG8gdGhlIGFwcGxpY2F0aW9uLgogICAgICAgICAgICBpZiAocG9ydGFsLnZpZXdDb250YWluZXJSZWYpIHsKICAgICAgICAgICAgICAgIGNvbXBvbmVudFJlZiA9IHBvcnRhbC52aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5LCBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5sZW5ndGgsIHBvcnRhbC5pbmplY3RvciB8fCBwb3J0YWwudmlld0NvbnRhaW5lclJlZi5pbmplY3Rvcik7CiAgICAgICAgICAgICAgICB0aGlzLnNldERpc3Bvc2VGbigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBjb21wb25lbnRSZWYuZGVzdHJveSgpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYgPSBjb21wb25lbnRGYWN0b3J5LmNyZWF0ZShwb3J0YWwuaW5qZWN0b3IgfHwgdGhpcy5fZGVmYXVsdEluamVjdG9yKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcFJlZi5hdHRhY2hWaWV3KGNvbXBvbmVudFJlZi5ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICB0aGlzLnNldERpc3Bvc2VGbigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXBwUmVmLmRldGFjaFZpZXcoY29tcG9uZW50UmVmLmhvc3RWaWV3KTsKICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRSZWYuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEF0IHRoaXMgcG9pbnQgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBpbnN0YW50aWF0ZWQsIHNvIHdlIG1vdmUgaXQgdG8gdGhlIGxvY2F0aW9uIGluIHRoZSBET00KICAgICAgICAgICAgLy8gd2hlcmUgd2Ugd2FudCBpdCB0byBiZSByZW5kZXJlZC4KICAgICAgICAgICAgdGhpcy5vdXRsZXRFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2dldENvbXBvbmVudFJvb3ROb2RlKGNvbXBvbmVudFJlZikpOwogICAgICAgICAgICByZXR1cm4gY29tcG9uZW50UmVmOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2hlcyBhIHRlbXBsYXRlIHBvcnRhbCB0byB0aGUgRE9NIGFzIGFuIGVtYmVkZGVkIHZpZXcuCiAgICAgICAgICogQHRlbXBsYXRlIEMKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQuCiAgICAgICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGVtYmVkZGVkIHZpZXcuCiAgICAgICAgICovCiAgICAgICAgYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZpZXdDb250YWluZXIgPSBwb3J0YWwudmlld0NvbnRhaW5lclJlZjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmlld1JlZiA9IHZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHBvcnRhbC50ZW1wbGF0ZVJlZiwgcG9ydGFsLmNvbnRleHQpOwogICAgICAgICAgICB2aWV3UmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICAgICAgLy8gVGhlIG1ldGhvZCBgY3JlYXRlRW1iZWRkZWRWaWV3YCB3aWxsIGFkZCB0aGUgdmlldyBhcyBhIGNoaWxkIG9mIHRoZSB2aWV3Q29udGFpbmVyLgogICAgICAgICAgICAvLyBCdXQgZm9yIHRoZSBEb21Qb3J0YWxPdXRsZXQgdGhlIHZpZXcgY2FuIGJlIGFkZGVkIGV2ZXJ5d2hlcmUgaW4gdGhlIERPTQogICAgICAgICAgICAvLyAoZS5nIE92ZXJsYXkgQ29udGFpbmVyKSBUbyBtb3ZlIHRoZSB2aWV3IHRvIHRoZSBzcGVjaWZpZWQgaG9zdCBlbGVtZW50LiBXZSBqdXN0CiAgICAgICAgICAgIC8vIHJlLWFwcGVuZCB0aGUgZXhpc3Rpbmcgcm9vdCBub2Rlcy4KICAgICAgICAgICAgdmlld1JlZi5yb290Tm9kZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm9vdE5vZGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHJvb3ROb2RlID0+IHRoaXMub3V0bGV0RWxlbWVudC5hcHBlbmRDaGlsZChyb290Tm9kZSkpKTsKICAgICAgICAgICAgdGhpcy5zZXREaXNwb3NlRm4oKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBpbmRleCA9IHZpZXdDb250YWluZXIuaW5kZXhPZih2aWV3UmVmKTsKICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29udGFpbmVyLnJlbW92ZShpbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIC8vIFRPRE8oamVsYm91cm4pOiBSZXR1cm4gbG9jYWxzIGZyb20gdmlldy4KICAgICAgICAgICAgcmV0dXJuIHZpZXdSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyBvdXQgYSBwb3J0YWwgZnJvbSB0aGUgRE9NLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgc3VwZXIuZGlzcG9zZSgpOwogICAgICAgICAgICBpZiAodGhpcy5vdXRsZXRFbGVtZW50LnBhcmVudE5vZGUgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5vdXRsZXRFbGVtZW50LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGhpcy5vdXRsZXRFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSByb290IEhUTUxFbGVtZW50IGZvciBhbiBpbnN0YW50aWF0ZWQgY29tcG9uZW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRDb21wb25lbnRSb290Tm9kZShjb21wb25lbnRSZWYpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKGNvbXBvbmVudFJlZi5ob3N0VmlldykpKS5yb290Tm9kZXNbMF0pKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3BvcnRhbC9wb3J0YWwtZGlyZWN0aXZlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIERpcmVjdGl2ZSB2ZXJzaW9uIG9mIGEgYFRlbXBsYXRlUG9ydGFsYC4gQmVjYXVzZSB0aGUgZGlyZWN0aXZlICppcyogYSBUZW1wbGF0ZVBvcnRhbCwKICAgICAqIHRoZSBkaXJlY3RpdmUgaW5zdGFuY2UgaXRzZWxmIGNhbiBiZSBhdHRhY2hlZCB0byBhIGhvc3QsIGVuYWJsaW5nIGRlY2xhcmF0aXZlIHVzZSBvZiBwb3J0YWxzLgogICAgICovCiAgICBjbGFzcyBDZGtQb3J0YWwgZXh0ZW5kcyBUZW1wbGF0ZVBvcnRhbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgIHN1cGVyKHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmKTsKICAgICAgICB9CiAgICB9CiAgICBDZGtQb3J0YWwuybVmYWMgPSBmdW5jdGlvbiBDZGtQb3J0YWxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrUG9ydGFsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSk7IH07CiAgICBDZGtQb3J0YWwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrUG9ydGFsLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtQb3J0YWwiLCAiIl1dLCBleHBvcnRBczogWyJjZGtQb3J0YWwiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrUG9ydGFsLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSwKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGBDZGtQb3J0YWxgIGluc3RlYWQuCiAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA5LjAuMAogICAgICovCiAgICBjbGFzcyBUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZSBleHRlbmRzIENka1BvcnRhbCB7CiAgICB9CiAgICBUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZS7JtWZhYyA9IGZ1bmN0aW9uIFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gybVUZW1wbGF0ZVBvcnRhbERpcmVjdGl2ZV9CYXNlRmFjdG9yeSh0IHx8IFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlKTsgfTsKICAgIFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlLCBzZWxlY3RvcnM6IFtbIiIsICJjZGstcG9ydGFsIiwgIiJdLCBbIiIsICJwb3J0YWwiLCAiIl1dLCBleHBvcnRBczogWyJjZGtQb3J0YWwiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IENka1BvcnRhbCwKICAgICAgICAgICAgICAgICAgICB1c2VFeGlzdGluZzogVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUKICAgICAgICAgICAgICAgIH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICBjb25zdCDJtVRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUpOwogICAgLyoqCiAgICAgKiBEaXJlY3RpdmUgdmVyc2lvbiBvZiBhIFBvcnRhbE91dGxldC4gQmVjYXVzZSB0aGUgZGlyZWN0aXZlICppcyogYSBQb3J0YWxPdXRsZXQsIHBvcnRhbHMgY2FuIGJlCiAgICAgKiBkaXJlY3RseSBhdHRhY2hlZCB0byBpdCwgZW5hYmxpbmcgZGVjbGFyYXRpdmUgdXNlLgogICAgICoKICAgICAqIFVzYWdlOgogICAgICogYDxuZy10ZW1wbGF0ZSBbY2RrUG9ydGFsT3V0bGV0XT0iZ3JlZXRpbmciPjwvbmctdGVtcGxhdGU+YAogICAgICovCiAgICBjbGFzcyBDZGtQb3J0YWxPdXRsZXQgZXh0ZW5kcyBCYXNlUG9ydGFsT3V0bGV0IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyUmVmCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2RvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX3ZpZXdDb250YWluZXJSZWYsIAogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIGBfZG9jdW1lbnRgIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgICAgICAqIEBicmVha2luZy1jaGFuZ2UgOS4wLjAKICAgICAgICAgKi8KICAgICAgICBfZG9jdW1lbnQpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgcG9ydGFsIGNvbXBvbmVudCBpcyBpbml0aWFsaXplZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXRzIHdoZW4gYSBwb3J0YWwgaXMgYXR0YWNoZWQgdG8gdGhlIG91dGxldC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXR0YWNoZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBdHRhY2hlcyB0aGUgZ2l2ZW4gRG9tUG9ydGFsIHRvIHRoaXMgUG9ydGFsSG9zdCBieSBtb3ZpbmcgYWxsIG9mIHRoZSBwb3J0YWwgY29udGVudCBpbnRvIGl0LgogICAgICAgICAgICAgKiBAcGFyYW0gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZC4KICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgVG8gYmUgdHVybmVkIGludG8gYSBtZXRob2QuCiAgICAgICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hdHRhY2hEb21Qb3J0YWwgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocG9ydGFsKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDkuMC4wIFJlbW92ZSBjaGVjayBhbmQgZXJyb3Igb25jZSB0aGUKICAgICAgICAgICAgICAgIC8vIGBfZG9jdW1lbnRgIGNvbnN0cnVjdG9yIHBhcmFtZXRlciBpcyByZXF1aXJlZC4KICAgICAgICAgICAgICAgIGlmICghdGhpcy5fZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignQ2Fubm90IGF0dGFjaCBET00gcG9ydGFsIHdpdGhvdXQgX2RvY3VtZW50IGNvbnN0cnVjdG9yIHBhcmFtZXRlcicpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHBvcnRhbC5lbGVtZW50OwogICAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignRE9NIHBvcnRhbCBjb250ZW50IG11c3QgYmUgYXR0YWNoZWQgdG8gYSBwYXJlbnQgbm9kZS4nKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEFuY2hvciB1c2VkIHRvIHNhdmUgdGhlIGVsZW1lbnQncyBwcmV2aW91cyBwb3NpdGlvbiBzbwogICAgICAgICAgICAgICAgLy8gdGhhdCB3ZSBjYW4gcmVzdG9yZSBpdCB3aGVuIHRoZSBwb3J0YWwgaXMgZGV0YWNoZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhbmNob3JOb2RlID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlQ29tbWVudCgnZG9tLXBvcnRhbCcpOwogICAgICAgICAgICAgICAgcG9ydGFsLnNldEF0dGFjaGVkSG9zdCh0aGlzKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoYW5jaG9yTm9kZSwgZWxlbWVudCk7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRSb290Tm9kZSgpLmFwcGVuZENoaWxkKGVsZW1lbnQpOwogICAgICAgICAgICAgICAgc3VwZXIuc2V0RGlzcG9zZUZuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoYW5jaG9yTm9kZS5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChhbmNob3JOb2RlLnBhcmVudE5vZGUpKS5yZXBsYWNlQ2hpbGQoZWxlbWVudCwgYW5jaG9yTm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFBvcnRhbCBhc3NvY2lhdGVkIHdpdGggdGhlIFBvcnRhbCBvdXRsZXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcG9ydGFsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRQb3J0YWw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcG9ydGFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcG9ydGFsKHBvcnRhbCkgewogICAgICAgICAgICAvLyBJZ25vcmUgdGhlIGNhc2VzIHdoZXJlIHRoZSBgcG9ydGFsYCBpcyBzZXQgdG8gYSBmYWxzeSB2YWx1ZSBiZWZvcmUgdGhlIGxpZmVjeWNsZSBob29rcyBoYXZlCiAgICAgICAgICAgIC8vIHJ1bi4gVGhpcyBoYW5kbGVzIHRoZSBjYXNlcyB3aGVyZSB0aGUgdXNlciBtaWdodCBkbyBzb21ldGhpbmcgbGlrZSBgPGRpdiBjZGtQb3J0YWxPdXRsZXQ+YAogICAgICAgICAgICAvLyBhbmQgYXR0YWNoIGEgcG9ydGFsIHByb2dyYW1tYXRpY2FsbHkgaW4gdGhlIHBhcmVudCBjb21wb25lbnQuIFdoZW4gQW5ndWxhciBkb2VzIHRoZSBmaXJzdCBDRAogICAgICAgICAgICAvLyByb3VuZCwgaXQgd2lsbCBmaXJlIHRoZSBzZXR0ZXIgd2l0aCBlbXB0eSBzdHJpbmcsIGNhdXNpbmcgdGhlIHVzZXIncyBjb250ZW50IHRvIGJlIGNsZWFyZWQuCiAgICAgICAgICAgIGlmICh0aGlzLmhhc0F0dGFjaGVkKCkgJiYgIXBvcnRhbCAmJiAhdGhpcy5faXNJbml0aWFsaXplZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgIHN1cGVyLmRldGFjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwb3J0YWwpIHsKICAgICAgICAgICAgICAgIHN1cGVyLmF0dGFjaChwb3J0YWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsID0gcG9ydGFsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21wb25lbnQgb3IgdmlldyByZWZlcmVuY2UgdGhhdCBpcyBhdHRhY2hlZCB0byB0aGUgcG9ydGFsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGF0dGFjaGVkUmVmKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNoZWRSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBzdXBlci5kaXNwb3NlKCk7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUG9ydGFsID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRSZWYgPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2ggdGhlIGdpdmVuIENvbXBvbmVudFBvcnRhbCB0byB0aGlzIFBvcnRhbE91dGxldCB1c2luZyB0aGUgQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyLgogICAgICAgICAqCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHBvcnRhbCBvdXRsZXQuCiAgICAgICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBjcmVhdGVkIGNvbXBvbmVudC4KICAgICAgICAgKi8KICAgICAgICBhdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKSB7CiAgICAgICAgICAgIHBvcnRhbC5zZXRBdHRhY2hlZEhvc3QodGhpcyk7CiAgICAgICAgICAgIC8vIElmIHRoZSBwb3J0YWwgc3BlY2lmaWVzIGFuIG9yaWdpbiwgdXNlIHRoYXQgYXMgdGhlIGxvZ2ljYWwgbG9jYXRpb24gb2YgdGhlIGNvbXBvbmVudAogICAgICAgICAgICAvLyBpbiB0aGUgYXBwbGljYXRpb24gdHJlZS4gT3RoZXJ3aXNlIHVzZSB0aGUgbG9jYXRpb24gb2YgdGhpcyBQb3J0YWxPdXRsZXQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgdmlld0NvbnRhaW5lclJlZiA9IHBvcnRhbC52aWV3Q29udGFpbmVyUmVmICE9IG51bGwgPwogICAgICAgICAgICAgICAgcG9ydGFsLnZpZXdDb250YWluZXJSZWYgOgogICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXNvbHZlciA9IHBvcnRhbC5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfHwgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSByZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShwb3J0YWwuY29tcG9uZW50KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZWYgPSB2aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5LCB2aWV3Q29udGFpbmVyUmVmLmxlbmd0aCwgcG9ydGFsLmluamVjdG9yIHx8IHZpZXdDb250YWluZXJSZWYuaW5qZWN0b3IpOwogICAgICAgICAgICAvLyBJZiB3ZSdyZSB1c2luZyBhIHZpZXcgY29udGFpbmVyIHRoYXQncyBkaWZmZXJlbnQgZnJvbSB0aGUgaW5qZWN0ZWQgb25lIChlLmcuIHdoZW4gdGhlIHBvcnRhbAogICAgICAgICAgICAvLyBzcGVjaWZpZXMgaXRzIG93bikgd2UgbmVlZCB0byBtb3ZlIHRoZSBjb21wb25lbnQgaW50byB0aGUgb3V0bGV0LCBvdGhlcndpc2UgaXQnbGwgYmUgcmVuZGVyZWQKICAgICAgICAgICAgLy8gaW5zaWRlIG9mIHRoZSBhbHRlcm5hdGUgdmlldyBjb250YWluZXIuCiAgICAgICAgICAgIGlmICh2aWV3Q29udGFpbmVyUmVmICE9PSB0aGlzLl92aWV3Q29udGFpbmVyUmVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9nZXRSb290Tm9kZSgpLmFwcGVuZENoaWxkKCgoLyoqIEB0eXBlIHs/fSAqLyAocmVmLmhvc3RWaWV3KSkpLnJvb3ROb2Rlc1swXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3VwZXIuc2V0RGlzcG9zZUZuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHJlZi5kZXN0cm95KCkpKTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwgPSBwb3J0YWw7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUmVmID0gcmVmOwogICAgICAgICAgICB0aGlzLmF0dGFjaGVkLmVtaXQocmVmKTsKICAgICAgICAgICAgcmV0dXJuIHJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoIHRoZSBnaXZlbiBUZW1wbGF0ZVBvcnRhbCB0byB0aGlzIFBvcnRhbEhvc3QgYXMgYW4gZW1iZWRkZWQgVmlldy4KICAgICAgICAgKiBAdGVtcGxhdGUgQwogICAgICAgICAqIEBwYXJhbSB7P30gcG9ydGFsIFBvcnRhbCB0byBiZSBhdHRhY2hlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBSZWZlcmVuY2UgdG8gdGhlIGNyZWF0ZWQgZW1iZWRkZWQgdmlldy4KICAgICAgICAgKi8KICAgICAgICBhdHRhY2hUZW1wbGF0ZVBvcnRhbChwb3J0YWwpIHsKICAgICAgICAgICAgcG9ydGFsLnNldEF0dGFjaGVkSG9zdCh0aGlzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcocG9ydGFsLnRlbXBsYXRlUmVmLCBwb3J0YWwuY29udGV4dCk7CiAgICAgICAgICAgIHN1cGVyLnNldERpc3Bvc2VGbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmNsZWFyKCkpKTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRQb3J0YWwgPSBwb3J0YWw7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkUmVmID0gdmlld1JlZjsKICAgICAgICAgICAgdGhpcy5hdHRhY2hlZC5lbWl0KHZpZXdSZWYpOwogICAgICAgICAgICByZXR1cm4gdmlld1JlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgcm9vdCBub2RlIG9mIHRoZSBwb3J0YWwgb3V0bGV0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0Um9vdE5vZGUoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmF0aXZlRWxlbWVudCA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZWxlbWVudC5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAvLyBUaGUgZGlyZWN0aXZlIGNvdWxkIGJlIHNldCBvbiBhIHRlbXBsYXRlIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgY29tbWVudAogICAgICAgICAgICAvLyBub2RlIGJlaW5nIHRoZSByb290LiBVc2UgdGhlIGNvbW1lbnQncyBwYXJlbnQgbm9kZSBpZiB0aGF0IGlzIHRoZSBjYXNlLgogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKChuYXRpdmVFbGVtZW50Lm5vZGVUeXBlID09PSBuYXRpdmVFbGVtZW50LkVMRU1FTlRfTk9ERSA/CiAgICAgICAgICAgICAgICBuYXRpdmVFbGVtZW50IDogKC8qKiBAdHlwZSB7P30gKi8gKG5hdGl2ZUVsZW1lbnQucGFyZW50Tm9kZSkpKSkpOwogICAgICAgIH0KICAgIH0KICAgIENka1BvcnRhbE91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIENka1BvcnRhbE91dGxldF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtQb3J0YWxPdXRsZXQpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICBDZGtQb3J0YWxPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrUG9ydGFsT3V0bGV0LCBzZWxlY3RvcnM6IFtbIiIsICJjZGtQb3J0YWxPdXRsZXQiLCAiIl1dLCBpbnB1dHM6IHsgcG9ydGFsOiBbImNka1BvcnRhbE91dGxldCIsICJwb3J0YWwiXSB9LCBvdXRwdXRzOiB7IGF0dGFjaGVkOiAiYXR0YWNoZWQiIH0sIGV4cG9ydEFzOiBbImNka1BvcnRhbE91dGxldCJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtQb3J0YWxPdXRsZXQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfSwKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KICAgIF07CiAgICBDZGtQb3J0YWxPdXRsZXQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgYXR0YWNoZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogQGRlcHJlY2F0ZWQgVXNlIGBDZGtQb3J0YWxPdXRsZXRgIGluc3RlYWQuCiAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA5LjAuMAogICAgICovCiAgICBjbGFzcyBQb3J0YWxIb3N0RGlyZWN0aXZlIGV4dGVuZHMgQ2RrUG9ydGFsT3V0bGV0IHsKICAgIH0KICAgIFBvcnRhbEhvc3REaXJlY3RpdmUuybVmYWMgPSBmdW5jdGlvbiBQb3J0YWxIb3N0RGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gybVQb3J0YWxIb3N0RGlyZWN0aXZlX0Jhc2VGYWN0b3J5KHQgfHwgUG9ydGFsSG9zdERpcmVjdGl2ZSk7IH07CiAgICBQb3J0YWxIb3N0RGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IFBvcnRhbEhvc3REaXJlY3RpdmUsIHNlbGVjdG9yczogW1siIiwgImNka1BvcnRhbEhvc3QiLCAiIl0sIFsiIiwgInBvcnRhbEhvc3QiLCAiIl1dLCBpbnB1dHM6IHsgcG9ydGFsOiBbImNka1BvcnRhbEhvc3QiLCAicG9ydGFsIl0gfSwgZXhwb3J0QXM6IFsiY2RrUG9ydGFsSG9zdCJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ2RrUG9ydGFsT3V0bGV0LAogICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBQb3J0YWxIb3N0RGlyZWN0aXZlCiAgICAgICAgICAgICAgICB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgY29uc3QgybVQb3J0YWxIb3N0RGlyZWN0aXZlX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoUG9ydGFsSG9zdERpcmVjdGl2ZSk7CiAgICBjbGFzcyBQb3J0YWxNb2R1bGUgewogICAgfQogICAgUG9ydGFsTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogUG9ydGFsTW9kdWxlIH0pOwogICAgUG9ydGFsTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUG9ydGFsTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBvcnRhbE1vZHVsZSkoKTsgfSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFBvcnRhbE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtDZGtQb3J0YWwsCiAgICAgICAgICAgIENka1BvcnRhbE91dGxldCwKICAgICAgICAgICAgVGVtcGxhdGVQb3J0YWxEaXJlY3RpdmUsCiAgICAgICAgICAgIFBvcnRhbEhvc3REaXJlY3RpdmVdLCBleHBvcnRzOiBbQ2RrUG9ydGFsLAogICAgICAgICAgICBDZGtQb3J0YWxPdXRsZXQsCiAgICAgICAgICAgIFRlbXBsYXRlUG9ydGFsRGlyZWN0aXZlLAogICAgICAgICAgICBQb3J0YWxIb3N0RGlyZWN0aXZlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvcG9ydGFsL3BvcnRhbC1pbmplY3Rvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogQ3VzdG9tIGluamVjdG9yIHRvIGJlIHVzZWQgd2hlbiBwcm92aWRpbmcgY3VzdG9tCiAgICAgKiBpbmplY3Rpb24gdG9rZW5zIHRvIGNvbXBvbmVudHMgaW5zaWRlIGEgcG9ydGFsLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgUG9ydGFsSW5qZWN0b3IgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEluamVjdG9yCiAgICAgICAgICogQHBhcmFtIHs/fSBfY3VzdG9tVG9rZW5zCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BhcmVudEluamVjdG9yLCBfY3VzdG9tVG9rZW5zKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudEluamVjdG9yID0gX3BhcmVudEluamVjdG9yOwogICAgICAgICAgICB0aGlzLl9jdXN0b21Ub2tlbnMgPSBfY3VzdG9tVG9rZW5zOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRva2VuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbm90Rm91bmRWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0aGlzLl9jdXN0b21Ub2tlbnMuZ2V0KHRva2VuKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50SW5qZWN0b3IuZ2V0KHRva2VuLCBub3RGb3VuZFZhbHVlKTsKICAgICAgICB9CiAgICB9CgogICAgY2xhc3MgRGF0YVNvdXJjZSB7CiAgICB9CiAgICAvKioKICAgICAqIENoZWNrcyB3aGV0aGVyIGFuIG9iamVjdCBpcyBhIGRhdGEgc291cmNlLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNEYXRhU291cmNlKHZhbHVlKSB7CiAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHZhbHVlIGlzIGEgRGF0YVNvdXJjZSBieSBvYnNlcnZpbmcgaWYgaXQgaGFzIGEgY29ubmVjdCBmdW5jdGlvbi4gQ2Fubm90CiAgICAgICAgLy8gYmUgY2hlY2tlZCBhcyBhbiBgaW5zdGFuY2VvZiBEYXRhU291cmNlYCBzaW5jZSBwZW9wbGUgY291bGQgY3JlYXRlIHRoZWlyIG93biBzb3VyY2VzCiAgICAgICAgLy8gdGhhdCBtYXRjaCB0aGUgaW50ZXJmYWNlLCBidXQgZG9uJ3QgZXh0ZW5kIERhdGFTb3VyY2UuCiAgICAgICAgcmV0dXJuIHZhbHVlICYmIHR5cGVvZiB2YWx1ZS5jb25uZWN0ID09PSAnZnVuY3Rpb24nOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jb2xsZWN0aW9ucy9hcnJheS1kYXRhLXNvdXJjZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIERhdGFTb3VyY2Ugd3JhcHBlciBmb3IgYSBuYXRpdmUgYXJyYXkuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBBcnJheURhdGFTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9kYXRhCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2RhdGEpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fZGF0YSA9IF9kYXRhOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvbm5lY3QoKSB7CiAgICAgICAgICAgIHJldHVybiBpc09ic2VydmFibGUodGhpcy5fZGF0YSkgPyB0aGlzLl9kYXRhIDogb2YodGhpcy5fZGF0YSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzY29ubmVjdCgpIHsgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jb2xsZWN0aW9ucy9zZWxlY3Rpb24tbW9kZWwudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDbGFzcyB0byBiZSB1c2VkIHRvIHBvd2VyIHNlbGVjdGluZyBvbmUgb3IgbW9yZSBvcHRpb25zIGZyb20gYSBsaXN0LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgU2VsZWN0aW9uTW9kZWwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9tdWx0aXBsZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGluaXRpYWxseVNlbGVjdGVkVmFsdWVzCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2VtaXRDaGFuZ2VzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX211bHRpcGxlID0gZmFsc2UsIGluaXRpYWxseVNlbGVjdGVkVmFsdWVzLCBfZW1pdENoYW5nZXMgPSB0cnVlKSB7CiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlID0gX211bHRpcGxlOwogICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlcyA9IF9lbWl0Q2hhbmdlczsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEN1cnJlbnRseS1zZWxlY3RlZCB2YWx1ZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb24gPSBuZXcgU2V0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZGVzZWxlY3RlZCBvcHRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGVtaXR0ZWQgYnkgdGhlIGNoYW5nZSBldmVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQgPSBbXTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBzZWxlY3RlZCBvcHRpb25zIHRoYXQgaGF2ZW4ndCBiZWVuIGVtaXR0ZWQgYnkgdGhlIGNoYW5nZSBldmVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVG9FbWl0ID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHZhbHVlIGhhcyBjaGFuZ2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jaGFuZ2VkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgaWYgKGluaXRpYWxseVNlbGVjdGVkVmFsdWVzICYmIGluaXRpYWxseVNlbGVjdGVkVmFsdWVzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKF9tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgIGluaXRpYWxseVNlbGVjdGVkVmFsdWVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIHZhbHVlID0+IHRoaXMuX21hcmtTZWxlY3RlZCh2YWx1ZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcmtTZWxlY3RlZChpbml0aWFsbHlTZWxlY3RlZFZhbHVlc1swXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgYXJyYXkgaW4gb3JkZXIgdG8gYXZvaWQgZmlyaW5nIHRoZSBjaGFuZ2UgZXZlbnQgZm9yIHByZXNlbGVjdGVkIHZhbHVlcy4KICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVG9FbWl0Lmxlbmd0aCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2VsZWN0ZWQgdmFsdWVzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IEFycmF5LmZyb20odGhpcy5fc2VsZWN0aW9uLnZhbHVlcygpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlbGVjdHMgYSB2YWx1ZSBvciBhbiBhcnJheSBvZiB2YWx1ZXMuCiAgICAgICAgICogQHBhcmFtIHsuLi4/fSB2YWx1ZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNlbGVjdCguLi52YWx1ZXMpIHsKICAgICAgICAgICAgdGhpcy5fdmVyaWZ5VmFsdWVBc3NpZ25tZW50KHZhbHVlcyk7CiAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFsdWUgPT4gdGhpcy5fbWFya1NlbGVjdGVkKHZhbHVlKSkpOwogICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZWxlY3RzIGEgdmFsdWUgb3IgYW4gYXJyYXkgb2YgdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7Li4uP30gdmFsdWVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXNlbGVjdCguLi52YWx1ZXMpIHsKICAgICAgICAgICAgdGhpcy5fdmVyaWZ5VmFsdWVBc3NpZ25tZW50KHZhbHVlcyk7CiAgICAgICAgICAgIHZhbHVlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdmFsdWUgPT4gdGhpcy5fdW5tYXJrU2VsZWN0ZWQodmFsdWUpKSk7CiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUb2dnbGVzIGEgdmFsdWUgYmV0d2VlbiBzZWxlY3RlZCBhbmQgZGVzZWxlY3RlZC4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b2dnbGUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5pc1NlbGVjdGVkKHZhbHVlKSA/IHRoaXMuZGVzZWxlY3QodmFsdWUpIDogdGhpcy5zZWxlY3QodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgYWxsIG9mIHRoZSBzZWxlY3RlZCB2YWx1ZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbGVhcigpIHsKICAgICAgICAgICAgdGhpcy5fdW5tYXJrQWxsKCk7CiAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZSBpcyBzZWxlY3RlZC4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc1NlbGVjdGVkKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb24uaGFzKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBtb2RlbCBkb2VzIG5vdCBoYXZlIGEgdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc0VtcHR5KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2VsZWN0aW9uLnNpemUgPT09IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgbW9kZWwgaGFzIGEgdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYXNWYWx1ZSgpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLmlzRW1wdHkoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU29ydHMgdGhlIHNlbGVjdGVkIHZhbHVlcyBiYXNlZCBvbiBhIHByZWRpY2F0ZSBmdW5jdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez89fSBwcmVkaWNhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNvcnQocHJlZGljYXRlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9tdWx0aXBsZSAmJiB0aGlzLnNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fc2VsZWN0ZWQpKS5zb3J0KHByZWRpY2F0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB3aGV0aGVyIG11bHRpcGxlIHZhbHVlcyBjYW4gYmUgc2VsZWN0ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc011bHRpcGxlU2VsZWN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbXVsdGlwbGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIGEgY2hhbmdlIGV2ZW50IGFuZCBjbGVhcnMgdGhlIHJlY29yZHMgb2Ygc2VsZWN0ZWQgYW5kIGRlc2VsZWN0ZWQgdmFsdWVzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZW1pdENoYW5nZUV2ZW50KCkgewogICAgICAgICAgICAvLyBDbGVhciB0aGUgc2VsZWN0ZWQgdmFsdWVzIHNvIHRoZXkgY2FuIGJlIHJlLWNhY2hlZC4KICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBudWxsOwogICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRUb0VtaXQubGVuZ3RoIHx8IHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNoYW5nZWQubmV4dCh7CiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aGlzLAogICAgICAgICAgICAgICAgICAgIGFkZGVkOiB0aGlzLl9zZWxlY3RlZFRvRW1pdCwKICAgICAgICAgICAgICAgICAgICByZW1vdmVkOiB0aGlzLl9kZXNlbGVjdGVkVG9FbWl0CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rlc2VsZWN0ZWRUb0VtaXQgPSBbXTsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkVG9FbWl0ID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2VsZWN0cyBhIHZhbHVlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX21hcmtTZWxlY3RlZCh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuaXNTZWxlY3RlZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91bm1hcmtBbGwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbi5hZGQodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXRDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWRUb0VtaXQucHVzaCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVzZWxlY3RzIGEgdmFsdWUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdW5tYXJrU2VsZWN0ZWQodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbi5kZWxldGUodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXRDaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGVzZWxlY3RlZFRvRW1pdC5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgb3V0IHRoZSBzZWxlY3RlZCB2YWx1ZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91bm1hcmtBbGwoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbi5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHZhbHVlID0+IHRoaXMuX3VubWFya1NlbGVjdGVkKHZhbHVlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFZlcmlmaWVzIHRoZSB2YWx1ZSBhc3NpZ25tZW50IGFuZCB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBhcnJheSBpcwogICAgICAgICAqIGluY2x1ZGluZyBtdWx0aXBsZSB2YWx1ZXMgd2hpbGUgdGhlIHNlbGVjdGlvbiBtb2RlbCBpcyBub3Qgc3VwcG9ydGluZyBtdWx0aXBsZSB2YWx1ZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3ZlcmlmeVZhbHVlQXNzaWdubWVudCh2YWx1ZXMpIHsKICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAxICYmICF0aGlzLl9tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TXVsdGlwbGVWYWx1ZXNJblNpbmdsZVNlbGVjdGlvbkVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gZXJyb3IgdGhhdCByZXBvcnRzIHRoYXQgbXVsdGlwbGUgdmFsdWVzIGFyZSBwYXNzZWQgaW50byBhIHNlbGVjdGlvbiBtb2RlbAogICAgICogd2l0aCBhIHNpbmdsZSB2YWx1ZS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRNdWx0aXBsZVZhbHVlc0luU2luZ2xlU2VsZWN0aW9uRXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKCdDYW5ub3QgcGFzcyBtdWx0aXBsZSB2YWx1ZXMgaW50byBTZWxlY3Rpb25Nb2RlbCB3aXRoIHNpbmdsZS12YWx1ZSBtb2RlLicpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jb2xsZWN0aW9ucy91bmlxdWUtc2VsZWN0aW9uLWRpc3BhdGNoZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDbGFzcyB0byBjb29yZGluYXRlIHVuaXF1ZSBzZWxlY3Rpb24gYmFzZWQgb24gbmFtZS4KICAgICAqIEludGVuZGVkIHRvIGJlIGNvbnN1bWVkIGFzIGFuIEFuZ3VsYXIgc2VydmljZS4KICAgICAqIFRoaXMgc2VydmljZSBpcyBuZWVkZWQgYmVjYXVzZSBuYXRpdmUgcmFkaW8gY2hhbmdlIGV2ZW50cyBhcmUgb25seSBmaXJlZCBvbiB0aGUgaXRlbSBjdXJyZW50bHkKICAgICAqIGJlaW5nIHNlbGVjdGVkLCBhbmQgd2Ugc3RpbGwgbmVlZCB0byB1bmNoZWNrIHRoZSBwcmV2aW91cyBzZWxlY3Rpb24uCiAgICAgKgogICAgICogVGhpcyBzZXJ2aWNlIGRvZXMgbm90ICpzdG9yZSogYW55IElEcyBhbmQgbmFtZXMgYmVjYXVzZSB0aGV5IG1heSBjaGFuZ2UgYXQgYW55IHRpbWUsIHNvIGl0IGlzCiAgICAgKiBsZXNzIGVycm9yLXByb25lIGlmIHRoZXkgYXJlIHNpbXBseSBwYXNzZWQgdGhyb3VnaCB3aGVuIHRoZSBldmVudHMgb2NjdXIuCiAgICAgKi8KICAgIGNsYXNzIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLl9saXN0ZW5lcnMgPSBbXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm90aWZ5IG90aGVyIGl0ZW1zIHRoYXQgc2VsZWN0aW9uIGZvciB0aGUgZ2l2ZW4gbmFtZSBoYXMgYmVlbiBzZXQuCiAgICAgICAgICogQHBhcmFtIHs/fSBpZCBJRCBvZiB0aGUgaXRlbS4KICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgTmFtZSBvZiB0aGUgaXRlbS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5vdGlmeShpZCwgbmFtZSkgewogICAgICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiB0aGlzLl9saXN0ZW5lcnMpIHsKICAgICAgICAgICAgICAgIGxpc3RlbmVyKGlkLCBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMaXN0ZW4gZm9yIGZ1dHVyZSBjaGFuZ2VzIHRvIGl0ZW0gc2VsZWN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gbGlzdGVuZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fSBGdW5jdGlvbiB1c2VkIHRvIGRlcmVnaXN0ZXIgbGlzdGVuZXIKICAgICAgICAgKi8KICAgICAgICBsaXN0ZW4obGlzdGVuZXIpIHsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzLnB1c2gobGlzdGVuZXIpOwogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gdGhpcy5fbGlzdGVuZXJzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlZ2lzdGVyZWQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChyZWdpc3RlcmVkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxpc3RlbmVyICE9PSByZWdpc3RlcmVkOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuZXJzID0gW107CiAgICAgICAgfQogICAgfQogICAgVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlci7JtWZhYyA9IGZ1bmN0aW9uIFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlcikoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBVbmlxdWVTZWxlY3Rpb25EaXNwYXRjaGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gVW5pcXVlU2VsZWN0aW9uRGlzcGF0Y2hlcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXIoKTsgfSwgdG9rZW46IFVuaXF1ZVNlbGVjdGlvbkRpc3BhdGNoZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCiAgICBjb25zdCBfYzAkMiA9IFsiY29udGVudFdyYXBwZXIiXTsKICAgIGNvbnN0IF9jMSQyID0gWyIqIl07CiAgICBjb25zdCBWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSA9IG5ldyBJbmplY3Rpb25Ub2tlbignVklSVFVBTF9TQ1JPTExfU1RSQVRFR1knKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL2ZpeGVkLXNpemUtdmlydHVhbC1zY3JvbGwudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBWaXJ0dWFsIHNjcm9sbGluZyBzdHJhdGVneSBmb3IgbGlzdHMgd2l0aCBpdGVtcyBvZiBrbm93biBmaXhlZCBzaXplLgogICAgICovCiAgICBjbGFzcyBGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbVNpemUgVGhlIHNpemUgb2YgdGhlIGl0ZW1zIGluIHRoZSB2aXJ0dWFsbHkgc2Nyb2xsaW5nIGxpc3QuCiAgICAgICAgICogQHBhcmFtIHs/fSBtaW5CdWZmZXJQeCBUaGUgbWluaW11bSBhbW91bnQgb2YgYnVmZmVyIChpbiBwaXhlbHMpIGJlZm9yZSBuZWVkaW5nIHRvIHJlbmRlciBtb3JlCiAgICAgICAgICogQHBhcmFtIHs/fSBtYXhCdWZmZXJQeCBUaGUgYW1vdW50IG9mIGJ1ZmZlciAoaW4gcGl4ZWxzKSB0byByZW5kZXIgd2hlbiByZW5kZXJpbmcgbW9yZS4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihpdGVtU2l6ZSwgbWluQnVmZmVyUHgsIG1heEJ1ZmZlclB4KSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkSW5kZXhDaGFuZ2UgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkb2NzLXByaXZhdGUgSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3kuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNjcm9sbGVkSW5kZXhDaGFuZ2UgPSB0aGlzLl9zY3JvbGxlZEluZGV4Q2hhbmdlLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgYXR0YWNoZWQgdmlld3BvcnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2l0ZW1TaXplID0gaXRlbVNpemU7CiAgICAgICAgICAgIHRoaXMuX21pbkJ1ZmZlclB4ID0gbWluQnVmZmVyUHg7CiAgICAgICAgICAgIHRoaXMuX21heEJ1ZmZlclB4ID0gbWF4QnVmZmVyUHg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IHRvIGEgdmlld3BvcnQuCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3cG9ydCBUaGUgdmlld3BvcnQgdG8gYXR0YWNoIHRoaXMgc3RyYXRlZ3kgdG8uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhdHRhY2godmlld3BvcnQpIHsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnQgPSB2aWV3cG9ydDsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVG90YWxDb250ZW50U2l6ZSgpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGFjaGVzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IGZyb20gdGhlIGN1cnJlbnRseSBhdHRhY2hlZCB2aWV3cG9ydC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRldGFjaCgpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsZWRJbmRleENoYW5nZS5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgaXRlbSBzaXplIGFuZCBidWZmZXIgc2l6ZS4KICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW1TaXplIFRoZSBzaXplIG9mIHRoZSBpdGVtcyBpbiB0aGUgdmlydHVhbGx5IHNjcm9sbGluZyBsaXN0LgogICAgICAgICAqIEBwYXJhbSB7P30gbWluQnVmZmVyUHggVGhlIG1pbmltdW0gYW1vdW50IG9mIGJ1ZmZlciAoaW4gcGl4ZWxzKSBiZWZvcmUgbmVlZGluZyB0byByZW5kZXIgbW9yZQogICAgICAgICAqIEBwYXJhbSB7P30gbWF4QnVmZmVyUHggVGhlIGFtb3VudCBvZiBidWZmZXIgKGluIHBpeGVscykgdG8gcmVuZGVyIHdoZW4gcmVuZGVyaW5nIG1vcmUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVJdGVtQW5kQnVmZmVyU2l6ZShpdGVtU2l6ZSwgbWluQnVmZmVyUHgsIG1heEJ1ZmZlclB4KSB7CiAgICAgICAgICAgIGlmIChtYXhCdWZmZXJQeCA8IG1pbkJ1ZmZlclB4KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignQ0RLIHZpcnR1YWwgc2Nyb2xsOiBtYXhCdWZmZXJQeCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBtaW5CdWZmZXJQeCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2l0ZW1TaXplID0gaXRlbVNpemU7CiAgICAgICAgICAgIHRoaXMuX21pbkJ1ZmZlclB4ID0gbWluQnVmZmVyUHg7CiAgICAgICAgICAgIHRoaXMuX21heEJ1ZmZlclB4ID0gbWF4QnVmZmVyUHg7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUmVuZGVyZWRSYW5nZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFZpcnR1YWxTY3JvbGxTdHJhdGVneS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ29udGVudFNjcm9sbGVkKCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgVmlydHVhbFNjcm9sbFN0cmF0ZWd5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25EYXRhTGVuZ3RoQ2hhbmdlZCgpIHsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVG90YWxDb250ZW50U2l6ZSgpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVSZW5kZXJlZFJhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgVmlydHVhbFNjcm9sbFN0cmF0ZWd5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Db250ZW50UmVuZGVyZWQoKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZSBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIFZpcnR1YWxTY3JvbGxTdHJhdGVneS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uUmVuZGVyZWRPZmZzZXRDaGFuZ2VkKCkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2Nyb2xsIHRvIHRoZSBvZmZzZXQgZm9yIHRoZSBnaXZlbiBpbmRleC4KICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4IFRoZSBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBzY3JvbGwgdG8uCiAgICAgICAgICogQHBhcmFtIHs/fSBiZWhhdmlvciBUaGUgU2Nyb2xsQmVoYXZpb3IgdG8gdXNlIHdoZW4gc2Nyb2xsaW5nLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdwb3J0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydC5zY3JvbGxUb09mZnNldChpbmRleCAqIHRoaXMuX2l0ZW1TaXplLCBiZWhhdmlvcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlIHRoZSB2aWV3cG9ydCdzIHRvdGFsIGNvbnRlbnQgc2l6ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVRvdGFsQ29udGVudFNpemUoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fdmlld3BvcnQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92aWV3cG9ydC5zZXRUb3RhbENvbnRlbnRTaXplKHRoaXMuX3ZpZXdwb3J0LmdldERhdGFMZW5ndGgoKSAqIHRoaXMuX2l0ZW1TaXplKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlIHRoZSB2aWV3cG9ydCdzIHJlbmRlcmVkIHJhbmdlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlUmVuZGVyZWRSYW5nZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl92aWV3cG9ydCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsT2Zmc2V0ID0gdGhpcy5fdmlld3BvcnQubWVhc3VyZVNjcm9sbE9mZnNldCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZpcnN0VmlzaWJsZUluZGV4ID0gc2Nyb2xsT2Zmc2V0IC8gdGhpcy5faXRlbVNpemU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRSYW5nZSA9IHRoaXMuX3ZpZXdwb3J0LmdldFJlbmRlcmVkUmFuZ2UoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXdSYW5nZSA9IHsgc3RhcnQ6IHJlbmRlcmVkUmFuZ2Uuc3RhcnQsIGVuZDogcmVuZGVyZWRSYW5nZS5lbmQgfTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSB0aGlzLl92aWV3cG9ydC5nZXRWaWV3cG9ydFNpemUoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkYXRhTGVuZ3RoID0gdGhpcy5fdmlld3BvcnQuZ2V0RGF0YUxlbmd0aCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0YXJ0QnVmZmVyID0gc2Nyb2xsT2Zmc2V0IC0gbmV3UmFuZ2Uuc3RhcnQgKiB0aGlzLl9pdGVtU2l6ZTsKICAgICAgICAgICAgaWYgKHN0YXJ0QnVmZmVyIDwgdGhpcy5fbWluQnVmZmVyUHggJiYgbmV3UmFuZ2Uuc3RhcnQgIT0gMCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXhwYW5kU3RhcnQgPSBNYXRoLmNlaWwoKHRoaXMuX21heEJ1ZmZlclB4IC0gc3RhcnRCdWZmZXIpIC8gdGhpcy5faXRlbVNpemUpOwogICAgICAgICAgICAgICAgbmV3UmFuZ2Uuc3RhcnQgPSBNYXRoLm1heCgwLCBuZXdSYW5nZS5zdGFydCAtIGV4cGFuZFN0YXJ0KTsKICAgICAgICAgICAgICAgIG5ld1JhbmdlLmVuZCA9IE1hdGgubWluKGRhdGFMZW5ndGgsIE1hdGguY2VpbChmaXJzdFZpc2libGVJbmRleCArICh2aWV3cG9ydFNpemUgKyB0aGlzLl9taW5CdWZmZXJQeCkgLyB0aGlzLl9pdGVtU2l6ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kQnVmZmVyID0gbmV3UmFuZ2UuZW5kICogdGhpcy5faXRlbVNpemUgLSAoc2Nyb2xsT2Zmc2V0ICsgdmlld3BvcnRTaXplKTsKICAgICAgICAgICAgICAgIGlmIChlbmRCdWZmZXIgPCB0aGlzLl9taW5CdWZmZXJQeCAmJiBuZXdSYW5nZS5lbmQgIT0gZGF0YUxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBhbmRFbmQgPSBNYXRoLmNlaWwoKHRoaXMuX21heEJ1ZmZlclB4IC0gZW5kQnVmZmVyKSAvIHRoaXMuX2l0ZW1TaXplKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZXhwYW5kRW5kID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZS5lbmQgPSBNYXRoLm1pbihkYXRhTGVuZ3RoLCBuZXdSYW5nZS5lbmQgKyBleHBhbmRFbmQpOwogICAgICAgICAgICAgICAgICAgICAgICBuZXdSYW5nZS5zdGFydCA9IE1hdGgubWF4KDAsIE1hdGguZmxvb3IoZmlyc3RWaXNpYmxlSW5kZXggLSB0aGlzLl9taW5CdWZmZXJQeCAvIHRoaXMuX2l0ZW1TaXplKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0LnNldFJlbmRlcmVkUmFuZ2UobmV3UmFuZ2UpOwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydC5zZXRSZW5kZXJlZENvbnRlbnRPZmZzZXQodGhpcy5faXRlbVNpemUgKiBuZXdSYW5nZS5zdGFydCk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkSW5kZXhDaGFuZ2UubmV4dChNYXRoLmZsb29yKGZpcnN0VmlzaWJsZUluZGV4KSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBQcm92aWRlciBmYWN0b3J5IGZvciBgRml4ZWRTaXplVmlydHVhbFNjcm9sbFN0cmF0ZWd5YCB0aGF0IHNpbXBseSBleHRyYWN0cyB0aGUgYWxyZWFkeSBjcmVhdGVkCiAgICAgKiBgRml4ZWRTaXplVmlydHVhbFNjcm9sbFN0cmF0ZWd5YCBmcm9tIHRoZSBnaXZlbiBkaXJlY3RpdmUuCiAgICAgKiBAcGFyYW0gez99IGZpeGVkU2l6ZURpciBUaGUgaW5zdGFuY2Ugb2YgYENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxgIHRvIGV4dHJhY3QgdGhlCiAgICAgKiAgICAgYEZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneWAgZnJvbS4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9maXhlZFNpemVWaXJ0dWFsU2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KGZpeGVkU2l6ZURpcikgewogICAgICAgIHJldHVybiBmaXhlZFNpemVEaXIuX3Njcm9sbFN0cmF0ZWd5OwogICAgfQogICAgLyoqCiAgICAgKiBBIHZpcnR1YWwgc2Nyb2xsIHN0cmF0ZWd5IHRoYXQgc3VwcG9ydHMgZml4ZWQtc2l6ZSBpdGVtcy4KICAgICAqLwogICAgY2xhc3MgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2l0ZW1TaXplID0gMjA7CiAgICAgICAgICAgIHRoaXMuX21pbkJ1ZmZlclB4ID0gMTAwOwogICAgICAgICAgICB0aGlzLl9tYXhCdWZmZXJQeCA9IDIwMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBzY3JvbGwgc3RyYXRlZ3kgdXNlZCBieSB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gbmV3IEZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneSh0aGlzLml0ZW1TaXplLCB0aGlzLm1pbkJ1ZmZlclB4LCB0aGlzLm1heEJ1ZmZlclB4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHNpemUgb2YgdGhlIGl0ZW1zIGluIHRoZSBsaXN0IChpbiBwaXhlbHMpLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGl0ZW1TaXplKCkgeyByZXR1cm4gdGhpcy5faXRlbVNpemU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgaXRlbVNpemUodmFsdWUpIHsgdGhpcy5faXRlbVNpemUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7IH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbWluaW11bSBhbW91bnQgb2YgYnVmZmVyIHJlbmRlcmVkIGJleW9uZCB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuCiAgICAgICAgICogSWYgdGhlIGFtb3VudCBvZiBidWZmZXIgZGlwcyBiZWxvdyB0aGlzIG51bWJlciwgbW9yZSBpdGVtcyB3aWxsIGJlIHJlbmRlcmVkLiBEZWZhdWx0cyB0byAxMDBweC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtaW5CdWZmZXJQeCgpIHsgcmV0dXJuIHRoaXMuX21pbkJ1ZmZlclB4OyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1pbkJ1ZmZlclB4KHZhbHVlKSB7IHRoaXMuX21pbkJ1ZmZlclB4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG51bWJlciBvZiBwaXhlbHMgd29ydGggb2YgYnVmZmVyIHRvIHJlbmRlciBmb3Igd2hlbiByZW5kZXJpbmcgbmV3IGl0ZW1zLiBEZWZhdWx0cyB0byAyMDBweC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtYXhCdWZmZXJQeCgpIHsgcmV0dXJuIHRoaXMuX21heEJ1ZmZlclB4OyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1heEJ1ZmZlclB4KHZhbHVlKSB7IHRoaXMuX21heEJ1ZmZlclB4ID0gY29lcmNlTnVtYmVyUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcygpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kudXBkYXRlSXRlbUFuZEJ1ZmZlclNpemUodGhpcy5pdGVtU2l6ZSwgdGhpcy5taW5CdWZmZXJQeCwgdGhpcy5tYXhCdWZmZXJQeCk7CiAgICAgICAgfQogICAgfQogICAgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbC7JtWZhYyA9IGZ1bmN0aW9uIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCkoKTsgfTsKICAgIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCwgc2VsZWN0b3JzOiBbWyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLCAiaXRlbVNpemUiLCAiIl1dLCBpbnB1dHM6IHsgaXRlbVNpemU6ICJpdGVtU2l6ZSIsIG1pbkJ1ZmZlclB4OiAibWluQnVmZmVyUHgiLCBtYXhCdWZmZXJQeDogIm1heEJ1ZmZlclB4IiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksCiAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogX2ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGxTdHJhdGVneUZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgZGVwczogW2ZvcndhcmRSZWYoKCAvKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8oKSA9PiBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsKSldCiAgICAgICAgICAgICAgICB9XSksIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBpdGVtU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbWluQnVmZmVyUHg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1heEJ1ZmZlclB4OiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3Njcm9sbC1kaXNwYXRjaGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGltZSBpbiBtcyB0byB0aHJvdHRsZSB0aGUgc2Nyb2xsaW5nIGV2ZW50cyBieSBkZWZhdWx0LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IERFRkFVTFRfU0NST0xMX1RJTUUgPSAyMDsKICAgIC8qKgogICAgICogU2VydmljZSBjb250YWluZWQgYWxsIHJlZ2lzdGVyZWQgU2Nyb2xsYWJsZSByZWZlcmVuY2VzIGFuZCBlbWl0cyBhbiBldmVudCB3aGVuIGFueSBvbmUgb2YgdGhlCiAgICAgKiBTY3JvbGxhYmxlIHJlZmVyZW5jZXMgZW1pdCBhIHNjcm9sbGVkIGV2ZW50LgogICAgICovCiAgICBjbGFzcyBTY3JvbGxEaXNwYXRjaGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX25nWm9uZSwgX3BsYXRmb3JtLCAKICAgICAgICAvKiogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgbWFrZSBkb2N1bWVudCByZXF1aXJlZCAqLwogICAgICAgIGRvY3VtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoYXQgYSByZWdpc3RlcmVkIHNjcm9sbGFibGUgcmVmZXJlbmNlIGVsZW1lbnQgaGFzIGJlZW4gc2Nyb2xsZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zY3JvbGxlZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgZ2xvYmFsIGBzY3JvbGxgIGFuZCBgcmVzaXplYCBzdWJzY3JpcHRpb25zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBhbW91bnQgb2Ygc3Vic2NyaXB0aW9ucyB0byBgc2Nyb2xsZWRgLiBVc2VkIGZvciBjbGVhbmluZyB1cCBhZnRlcndhcmRzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc2Nyb2xsZWRDb3VudCA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXAgb2YgYWxsIHRoZSBzY3JvbGxhYmxlIHJlZmVyZW5jZXMgdGhhdCBhcmUgcmVnaXN0ZXJlZCB3aXRoIHRoZSBzZXJ2aWNlIGFuZCB0aGVpcgogICAgICAgICAgICAgKiBzY3JvbGwgZXZlbnQgc3Vic2NyaXB0aW9ucy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVycyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgc2Nyb2xsYWJsZSBpbnN0YW5jZSB3aXRoIHRoZSBzZXJ2aWNlIGFuZCBsaXN0ZW5zIGZvciBpdHMgc2Nyb2xsZWQgZXZlbnRzLiBXaGVuIHRoZQogICAgICAgICAqIHNjcm9sbGFibGUgaXMgc2Nyb2xsZWQsIHRoZSBzZXJ2aWNlIGVtaXRzIHRoZSBldmVudCB0byBpdHMgc2Nyb2xsZWQgb2JzZXJ2YWJsZS4KICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbGFibGUgU2Nyb2xsYWJsZSBpbnN0YW5jZSB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXIoc2Nyb2xsYWJsZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuc2Nyb2xsQ29udGFpbmVycy5oYXMoc2Nyb2xsYWJsZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsQ29udGFpbmVycy5zZXQoc2Nyb2xsYWJsZSwgc2Nyb2xsYWJsZS5lbGVtZW50U2Nyb2xsZWQoKQogICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2Nyb2xsZWQubmV4dChzY3JvbGxhYmxlKSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXJlZ2lzdGVycyBhIFNjcm9sbGFibGUgcmVmZXJlbmNlIGFuZCB1bnN1YnNjcmliZXMgZnJvbSBpdHMgc2Nyb2xsIGV2ZW50IG9ic2VydmFibGUuCiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxhYmxlIFNjcm9sbGFibGUgaW5zdGFuY2UgdG8gYmUgZGVyZWdpc3RlcmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVyZWdpc3RlcihzY3JvbGxhYmxlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZVJlZmVyZW5jZSA9IHRoaXMuc2Nyb2xsQ29udGFpbmVycy5nZXQoc2Nyb2xsYWJsZSk7CiAgICAgICAgICAgIGlmIChzY3JvbGxhYmxlUmVmZXJlbmNlKSB7CiAgICAgICAgICAgICAgICBzY3JvbGxhYmxlUmVmZXJlbmNlLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lcnMuZGVsZXRlKHNjcm9sbGFibGUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGFuIGV2ZW50IHdoZW5ldmVyIGFueSBvZiB0aGUgcmVnaXN0ZXJlZCBTY3JvbGxhYmxlCiAgICAgICAgICogcmVmZXJlbmNlcyAob3Igd2luZG93LCBkb2N1bWVudCwgb3IgYm9keSkgZmlyZSBhIHNjcm9sbGVkIGV2ZW50LiBDYW4gcHJvdmlkZSBhIHRpbWUgaW4gbXMKICAgICAgICAgKiB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCAidGhyb3R0bGUiIHRpbWUuCiAgICAgICAgICoKICAgICAgICAgKiAqKk5vdGU6KiogaW4gb3JkZXIgdG8gYXZvaWQgaGl0dGluZyBjaGFuZ2UgZGV0ZWN0aW9uIGZvciBldmVyeSBzY3JvbGwgZXZlbnQsCiAgICAgICAgICogYWxsIG9mIHRoZSBldmVudHMgZW1pdHRlZCBmcm9tIHRoaXMgc3RyZWFtIHdpbGwgYmUgcnVuIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4KICAgICAgICAgKiBJZiB5b3UgbmVlZCB0byB1cGRhdGUgYW55IGRhdGEgYmluZGluZ3MgYXMgYSByZXN1bHQgb2YgYSBzY3JvbGwgZXZlbnQsIHlvdSBoYXZlCiAgICAgICAgICogdG8gcnVuIHRoZSBjYWxsYmFjayB1c2luZyBgTmdab25lLnJ1bmAuCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXVkaXRUaW1lSW5NcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsZWQoYXVkaXRUaW1lSW5NcyA9IERFRkFVTFRfU0NST0xMX1RJTUUpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvYnNlcnZlcikgPT4gewogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRHbG9iYWxMaXN0ZW5lcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSAwbXMgZGVsYXksIHVzZSBhbiBvYnNlcnZhYmxlIHdpdGhvdXQgYXVkaXRUaW1lCiAgICAgICAgICAgICAgICAvLyBzaW5jZSBpdCBkb2VzIGFkZCBhIHBlcmNlcHRpYmxlIGRlbGF5IGluIHByb2Nlc3Npbmcgb3ZlcmhlYWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzdWJzY3JpcHRpb24gPSBhdWRpdFRpbWVJbk1zID4gMCA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsZWQucGlwZShhdWRpdFRpbWUoYXVkaXRUaW1lSW5NcykpLnN1YnNjcmliZShvYnNlcnZlcikgOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkLnN1YnNjcmliZShvYnNlcnZlcik7CiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxlZENvdW50Kys7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbGVkQ291bnQtLTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3Njcm9sbGVkQ291bnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsTGlzdGVuZXIoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9yZW1vdmVHbG9iYWxMaXN0ZW5lcigpOwogICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKF8sIGNvbnRhaW5lcikgPT4gdGhpcy5kZXJlZ2lzdGVyKGNvbnRhaW5lcikpKTsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsZWQuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbmV2ZXIgYW55IG9mIHRoZQogICAgICAgICAqIHNjcm9sbGFibGUgYW5jZXN0b3JzIG9mIGFuIGVsZW1lbnQgYXJlIHNjcm9sbGVkLgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZiBFbGVtZW50IHdob3NlIGFuY2VzdG9ycyB0byBsaXN0ZW4gZm9yLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGF1ZGl0VGltZUluTXMgVGltZSB0byB0aHJvdHRsZSB0aGUgc2Nyb2xsIGV2ZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFuY2VzdG9yU2Nyb2xsZWQoZWxlbWVudFJlZiwgYXVkaXRUaW1lSW5NcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFuY2VzdG9ycyA9IHRoaXMuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKGVsZW1lbnRSZWYpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5zY3JvbGxlZChhdWRpdFRpbWVJbk1zKS5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0YXJnZXQgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuICF0YXJnZXQgfHwgYW5jZXN0b3JzLmluZGV4T2YodGFyZ2V0KSA+IC0xOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFsbCByZWdpc3RlcmVkIFNjcm9sbGFibGVzIHRoYXQgY29udGFpbiB0aGUgcHJvdmlkZWQgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEFuY2VzdG9yU2Nyb2xsQ29udGFpbmVycyhlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsaW5nQ29udGFpbmVycyA9IFtdOwogICAgICAgICAgICB0aGlzLnNjcm9sbENvbnRhaW5lcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX3N1YnNjcmlwdGlvbgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbGFibGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfc3Vic2NyaXB0aW9uLCBzY3JvbGxhYmxlKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudChzY3JvbGxhYmxlLCBlbGVtZW50UmVmKSkgewogICAgICAgICAgICAgICAgICAgIHNjcm9sbGluZ0NvbnRhaW5lcnMucHVzaChzY3JvbGxhYmxlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gc2Nyb2xsaW5nQ29udGFpbmVyczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWNjZXNzIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgZG9jdW1lbnQgcmVmZXJlbmNlCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXREb2N1bWVudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RvY3VtZW50IHx8IGRvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVc2UgZGVmYXVsdFZpZXcgb2YgaW5qZWN0ZWQgZG9jdW1lbnQgaWYgYXZhaWxhYmxlIG9yIGZhbGxiYWNrIHRvIGdsb2JhbCB3aW5kb3cgcmVmZXJlbmNlCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRXaW5kb3coKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZG9jID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgcmV0dXJuIGRvYy5kZWZhdWx0VmlldyB8fCB3aW5kb3c7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBjb250YWluZWQgd2l0aGluIHRoZSBwcm92aWRlZCBTY3JvbGxhYmxlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxhYmxlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2Nyb2xsYWJsZUNvbnRhaW5zRWxlbWVudChzY3JvbGxhYmxlLCBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNjcm9sbGFibGVFbGVtZW50ID0gc2Nyb2xsYWJsZS5nZXRFbGVtZW50UmVmKCkubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLy8gVHJhdmVyc2UgdGhyb3VnaCB0aGUgZWxlbWVudCBwYXJlbnRzIHVudGlsIHdlIHJlYWNoIG51bGwsIGNoZWNraW5nIGlmIGFueSBvZiB0aGUgZWxlbWVudHMKICAgICAgICAgICAgLy8gYXJlIHRoZSBzY3JvbGxhYmxlJ3MgZWxlbWVudC4KICAgICAgICAgICAgZG8gewogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQgPT0gc2Nyb2xsYWJsZUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSB3aGlsZSAoZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkucGFyZW50RWxlbWVudCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB1cCB0aGUgZ2xvYmFsIHNjcm9sbCBsaXN0ZW5lcnMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hZGRHbG9iYWxMaXN0ZW5lcigpIHsKICAgICAgICAgICAgdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uID0gdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudCh3aW5kb3cuZG9jdW1lbnQsICdzY3JvbGwnKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2Nyb2xsZWQubmV4dCgpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYW5zIHVwIHRoZSBnbG9iYWwgc2Nyb2xsIGxpc3RlbmVyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlR2xvYmFsTGlzdGVuZXIoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9nbG9iYWxTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX2dsb2JhbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fZ2xvYmFsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFNjcm9sbERpc3BhdGNoZXIuybVmYWMgPSBmdW5jdGlvbiBTY3JvbGxEaXNwYXRjaGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNjcm9sbERpc3BhdGNoZXIpKMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChQbGF0Zm9ybSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTY3JvbGxEaXNwYXRjaGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFNjcm9sbERpc3BhdGNoZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBTY3JvbGxEaXNwYXRjaGVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgU2Nyb2xsRGlzcGF0Y2hlcijJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfSwgdG9rZW46IFNjcm9sbERpc3BhdGNoZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3Njcm9sbGFibGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBTZW5kcyBhbiBldmVudCB3aGVuIHRoZSBkaXJlY3RpdmUncyBlbGVtZW50IGlzIHNjcm9sbGVkLiBSZWdpc3RlcnMgaXRzZWxmIHdpdGggdGhlCiAgICAgKiBTY3JvbGxEaXNwYXRjaGVyIHNlcnZpY2UgdG8gaW5jbHVkZSBpdHNlbGYgYXMgcGFydCBvZiBpdHMgY29sbGVjdGlvbiBvZiBzY3JvbGxpbmcgZXZlbnRzIHRoYXQgaXQKICAgICAqIGNhbiBiZSBsaXN0ZW5lZCB0byB0aHJvdWdoIHRoZSBzZXJ2aWNlLgogICAgICovCiAgICBjbGFzcyBDZGtTY3JvbGxhYmxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbERpc3BhdGNoZXIKICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRpcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIHNjcm9sbERpc3BhdGNoZXIsIG5nWm9uZSwgZGlyKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlzcGF0Y2hlciA9IHNjcm9sbERpc3BhdGNoZXI7CiAgICAgICAgICAgIHRoaXMubmdab25lID0gbmdab25lOwogICAgICAgICAgICB0aGlzLmRpciA9IGRpcjsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFNjcm9sbGVkID0gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAob2JzZXJ2ZXIpID0+IHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IGZyb21FdmVudCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3Njcm9sbCcpLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKG9ic2VydmVyKSkpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlzcGF0Y2hlci5yZWdpc3Rlcih0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXNwYXRjaGVyLmRlcmVnaXN0ZXIodGhpcyk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIG9ic2VydmFibGUgdGhhdCBlbWl0cyB3aGVuIGEgc2Nyb2xsIGV2ZW50IGlzIGZpcmVkIG9uIHRoZSBob3N0IGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbGVtZW50U2Nyb2xsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9lbGVtZW50U2Nyb2xsZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIEVsZW1lbnRSZWYgZm9yIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEVsZW1lbnRSZWYoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNjcm9sbHMgdG8gdGhlIHNwZWNpZmllZCBvZmZzZXRzLiBUaGlzIGlzIGEgbm9ybWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBicm93c2VyJ3MgbmF0aXZlIHNjcm9sbFRvCiAgICAgICAgICogbWV0aG9kLCBzaW5jZSBicm93c2VycyBhcmUgbm90IGNvbnNpc3RlbnQgYWJvdXQgd2hhdCBzY3JvbGxMZWZ0IG1lYW5zIGluIFJUTC4gRm9yIHRoaXMgbWV0aG9kCiAgICAgICAgICogbGVmdCBhbmQgcmlnaHQgYWx3YXlzIHJlZmVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBzaWRlIG9mIHRoZSBzY3JvbGxpbmcgY29udGFpbmVyIGlycmVzcGVjdGl2ZQogICAgICAgICAqIG9mIHRoZSBsYXlvdXQgZGlyZWN0aW9uLiBzdGFydCBhbmQgZW5kIHJlZmVyIHRvIGxlZnQgYW5kIHJpZ2h0IGluIGFuIExUUiBjb250ZXh0IGFuZCB2aWNlLXZlcnNhCiAgICAgICAgICogaW4gYW4gUlRMIGNvbnRleHQuCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zIHNwZWNpZmllZCB0aGUgb2Zmc2V0cyB0byBzY3JvbGwgdG8uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzY3JvbGxUbyhvcHRpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWwgPSB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1J0bCA9IHRoaXMuZGlyICYmIHRoaXMuZGlyLnZhbHVlID09ICdydGwnOwogICAgICAgICAgICAvLyBSZXdyaXRlIHN0YXJ0ICYgZW5kIG9mZnNldHMgYXMgcmlnaHQgb3IgbGVmdCBvZmZzZXRzLgogICAgICAgICAgICBpZiAob3B0aW9ucy5sZWZ0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMubGVmdCA9IGlzUnRsID8gb3B0aW9ucy5lbmQgOiBvcHRpb25zLnN0YXJ0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvcHRpb25zLnJpZ2h0ID09IG51bGwpIHsKICAgICAgICAgICAgICAgIG9wdGlvbnMucmlnaHQgPSBpc1J0bCA/IG9wdGlvbnMuc3RhcnQgOiBvcHRpb25zLmVuZDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXdyaXRlIHRoZSBib3R0b20gb2Zmc2V0IGFzIGEgdG9wIG9mZnNldC4KICAgICAgICAgICAgaWYgKG9wdGlvbnMuYm90dG9tICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9ucykpKS50b3AgPQogICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodCAtIG9wdGlvbnMuYm90dG9tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJld3JpdGUgdGhlIHJpZ2h0IG9mZnNldCBhcyBhIGxlZnQgb2Zmc2V0LgogICAgICAgICAgICBpZiAoaXNSdGwgJiYgZ2V0UnRsU2Nyb2xsQXhpc1R5cGUoKSAhPSAwIC8qIE5PUk1BTCAqLykgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMubGVmdCAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpLnJpZ2h0ID0KICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2Nyb2xsV2lkdGggLSBlbC5jbGllbnRXaWR0aCAtIG9wdGlvbnMubGVmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChnZXRSdGxTY3JvbGxBeGlzVHlwZSgpID09IDIgLyogSU5WRVJURUQgKi8pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxlZnQgPSBvcHRpb25zLnJpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZ2V0UnRsU2Nyb2xsQXhpc1R5cGUoKSA9PSAxIC8qIE5FR0FURUQgKi8pIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmxlZnQgPSBvcHRpb25zLnJpZ2h0ID8gLW9wdGlvbnMucmlnaHQgOiBvcHRpb25zLnJpZ2h0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMucmlnaHQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9ucykpKS5sZWZ0ID0KICAgICAgICAgICAgICAgICAgICAgICAgZWwuc2Nyb2xsV2lkdGggLSBlbC5jbGllbnRXaWR0aCAtIG9wdGlvbnMucmlnaHQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYXBwbHlTY3JvbGxUb09wdGlvbnMob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlTY3JvbGxUb09wdGlvbnMob3B0aW9ucykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChzdXBwb3J0c1Njcm9sbEJlaGF2aW9yKCkpIHsKICAgICAgICAgICAgICAgIGVsLnNjcm9sbFRvKG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMudG9wICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBlbC5zY3JvbGxUb3AgPSBvcHRpb25zLnRvcDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLmxlZnQgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGVsLnNjcm9sbExlZnQgPSBvcHRpb25zLmxlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWVhc3VyZXMgdGhlIHNjcm9sbCBvZmZzZXQgcmVsYXRpdmUgdG8gdGhlIHNwZWNpZmllZCBlZGdlIG9mIHRoZSB2aWV3cG9ydC4gVGhpcyBtZXRob2QgY2FuIGJlCiAgICAgICAgICogdXNlZCBpbnN0ZWFkIG9mIGRpcmVjdGx5IGNoZWNraW5nIHNjcm9sbExlZnQgb3Igc2Nyb2xsVG9wLCBzaW5jZSBicm93c2VycyBhcmUgbm90IGNvbnNpc3RlbnQKICAgICAgICAgKiBhYm91dCB3aGF0IHNjcm9sbExlZnQgbWVhbnMgaW4gUlRMLiBUaGUgdmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGFyZSBub3JtYWxpemVkIHN1Y2ggdGhhdAogICAgICAgICAqIGxlZnQgYW5kIHJpZ2h0IGFsd2F5cyByZWZlciB0byB0aGUgbGVmdCBhbmQgcmlnaHQgc2lkZSBvZiB0aGUgc2Nyb2xsaW5nIGNvbnRhaW5lciBpcnJlc3BlY3RpdmUKICAgICAgICAgKiBvZiB0aGUgbGF5b3V0IGRpcmVjdGlvbi4gc3RhcnQgYW5kIGVuZCByZWZlciB0byBsZWZ0IGFuZCByaWdodCBpbiBhbiBMVFIgY29udGV4dCBhbmQgdmljZS12ZXJzYQogICAgICAgICAqIGluIGFuIFJUTCBjb250ZXh0LgogICAgICAgICAqIEBwYXJhbSB7P30gZnJvbSBUaGUgZWRnZSB0byBtZWFzdXJlIGZyb20uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtZWFzdXJlU2Nyb2xsT2Zmc2V0KGZyb20pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBMRUZUID0gJ2xlZnQnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IFJJR0hUID0gJ3JpZ2h0JzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbCA9IHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICBpZiAoZnJvbSA9PSAndG9wJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGVsLnNjcm9sbFRvcDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZnJvbSA9PSAnYm90dG9tJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGVsLnNjcm9sbEhlaWdodCAtIGVsLmNsaWVudEhlaWdodCAtIGVsLnNjcm9sbFRvcDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBSZXdyaXRlIHN0YXJ0ICYgZW5kIGFzIGxlZnQgb3IgcmlnaHQgb2Zmc2V0cy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1J0bCA9IHRoaXMuZGlyICYmIHRoaXMuZGlyLnZhbHVlID09ICdydGwnOwogICAgICAgICAgICBpZiAoZnJvbSA9PSAnc3RhcnQnKSB7CiAgICAgICAgICAgICAgICBmcm9tID0gaXNSdGwgPyBSSUdIVCA6IExFRlQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoZnJvbSA9PSAnZW5kJykgewogICAgICAgICAgICAgICAgZnJvbSA9IGlzUnRsID8gTEVGVCA6IFJJR0hUOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1J0bCAmJiBnZXRSdGxTY3JvbGxBeGlzVHlwZSgpID09IDIgLyogSU5WRVJURUQgKi8pIHsKICAgICAgICAgICAgICAgIC8vIEZvciBJTlZFUlRFRCwgc2Nyb2xsTGVmdCBpcyAoc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSBsZWZ0IGFuZAogICAgICAgICAgICAgICAgLy8gMCB3aGVuIHNjcm9sbGVkIGFsbCB0aGUgd2F5IHJpZ2h0LgogICAgICAgICAgICAgICAgaWYgKGZyb20gPT0gTEVGVCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5zY3JvbGxXaWR0aCAtIGVsLmNsaWVudFdpZHRoIC0gZWwuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5zY3JvbGxMZWZ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzUnRsICYmIGdldFJ0bFNjcm9sbEF4aXNUeXBlKCkgPT0gMSAvKiBORUdBVEVEICovKSB7CiAgICAgICAgICAgICAgICAvLyBGb3IgTkVHQVRFRCwgc2Nyb2xsTGVmdCBpcyAtKHNjcm9sbFdpZHRoIC0gY2xpZW50V2lkdGgpIHdoZW4gc2Nyb2xsZWQgYWxsIHRoZSB3YXkgbGVmdCBhbmQKICAgICAgICAgICAgICAgIC8vIDAgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSByaWdodC4KICAgICAgICAgICAgICAgIGlmIChmcm9tID09IExFRlQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuc2Nyb2xsTGVmdCArIGVsLnNjcm9sbFdpZHRoIC0gZWwuY2xpZW50V2lkdGg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gLWVsLnNjcm9sbExlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBGb3IgTk9STUFMLCBhcyB3ZWxsIGFzIG5vbi1SVEwgY29udGV4dHMsIHNjcm9sbExlZnQgaXMgMCB3aGVuIHNjcm9sbGVkIGFsbCB0aGUgd2F5IGxlZnQgYW5kCiAgICAgICAgICAgICAgICAvLyAoc2Nyb2xsV2lkdGggLSBjbGllbnRXaWR0aCkgd2hlbiBzY3JvbGxlZCBhbGwgdGhlIHdheSByaWdodC4KICAgICAgICAgICAgICAgIGlmIChmcm9tID09IExFRlQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZWwuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBlbC5zY3JvbGxXaWR0aCAtIGVsLmNsaWVudFdpZHRoIC0gZWwuc2Nyb2xsTGVmdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIENka1Njcm9sbGFibGUuybVmYWMgPSBmdW5jdGlvbiBDZGtTY3JvbGxhYmxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka1Njcm9sbGFibGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoU2Nyb2xsRGlzcGF0Y2hlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCkpOyB9OwogICAgQ2RrU2Nyb2xsYWJsZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtTY3JvbGxhYmxlLCBzZWxlY3RvcnM6IFtbIiIsICJjZGstc2Nyb2xsYWJsZSIsICIiXSwgWyIiLCAiY2RrU2Nyb2xsYWJsZSIsICIiXV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka1Njcm9sbGFibGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBTY3JvbGxEaXNwYXRjaGVyIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9zY3JvbGxpbmcvdmlld3BvcnQtcnVsZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBUaW1lIGluIG1zIHRvIHRocm90dGxlIHRoZSByZXNpemUgZXZlbnRzIGJ5IGRlZmF1bHQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgREVGQVVMVF9SRVNJWkVfVElNRSA9IDIwOwogICAgLyoqCiAgICAgKiBTaW1wbGUgdXRpbGl0eSBmb3IgZ2V0dGluZyB0aGUgYm91bmRzIG9mIHRoZSBicm93c2VyIHZpZXdwb3J0LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgVmlld3BvcnRSdWxlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BsYXRmb3JtLCBuZ1pvbmUsIAogICAgICAgIC8qKiBAYnJlYWtpbmctY2hhbmdlIDExLjAuMCBtYWtlIGRvY3VtZW50IHJlcXVpcmVkICovCiAgICAgICAgZG9jdW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZSA9IF9wbGF0Zm9ybS5pc0Jyb3dzZXIgPwogICAgICAgICAgICAgICAgICAgIG1lcmdlKGZyb21FdmVudCh3aW5kb3csICdyZXNpemUnKSwgZnJvbUV2ZW50KHdpbmRvdywgJ29yaWVudGF0aW9uY2hhbmdlJykpIDoKICAgICAgICAgICAgICAgICAgICBvZigpOwogICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG5lZWQgdG8gZG8gdGhlIHN1YnNjcmlwdGlvbiBpbnNpZGUgYHJ1bk91dHNpZGVBbmd1bGFyYAogICAgICAgICAgICAgICAgLy8gc2luY2Ugc3Vic2NyaWJpbmcgaXMgd2hhdCBjYXVzZXMgdGhlIGV2ZW50IGxpc3RlbmVyIHRvIGJlIGFkZGVkLgogICAgICAgICAgICAgICAgdGhpcy5faW52YWxpZGF0ZUNhY2hlID0gdGhpcy5jaGFuZ2UoKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fdXBkYXRlVmlld3BvcnRTaXplKCkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9pbnZhbGlkYXRlQ2FjaGUudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdmlld3BvcnQncyB3aWR0aCBhbmQgaGVpZ2h0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld3BvcnRTaXplKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3ZpZXdwb3J0U2l6ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmlld3BvcnRTaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdXRwdXQgPSB7IHdpZHRoOiB0aGlzLl92aWV3cG9ydFNpemUud2lkdGgsIGhlaWdodDogdGhpcy5fdmlld3BvcnRTaXplLmhlaWdodCB9OwogICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3Qgb24gYSBicm93c2VyLCBkb24ndCBjYWNoZSB0aGUgc2l6ZSBzaW5jZSBpdCdsbCBiZSBtb2NrZWQgb3V0IGFueXdheS4KICAgICAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0U2l6ZSA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhIENsaWVudFJlY3QgZm9yIHRoZSB2aWV3cG9ydCdzIGJvdW5kcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFZpZXdwb3J0UmVjdCgpIHsKICAgICAgICAgICAgLy8gVXNlIHRoZSBkb2N1bWVudCBlbGVtZW50J3MgYm91bmRpbmcgcmVjdCByYXRoZXIgdGhhbiB0aGUgd2luZG93IHNjcm9sbCBwcm9wZXJ0aWVzCiAgICAgICAgICAgIC8vIChlLmcuIHBhZ2VZT2Zmc2V0LCBzY3JvbGxZKSBkdWUgdG8gaW4gaXNzdWUgaW4gQ2hyb21lIGFuZCBJRSB3aGVyZSB3aW5kb3cgc2Nyb2xsCiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMgYW5kIGNsaWVudCBjb29yZGluYXRlcyAoYm91bmRpbmdDbGllbnRSZWN0LCBjbGllbnRYL1ksIGV0Yy4pIGFyZSBpbiBkaWZmZXJlbnQKICAgICAgICAgICAgLy8gY29uY2VwdHVhbCB2aWV3cG9ydHMuIFVuZGVyIG1vc3QgY2lyY3Vtc3RhbmNlcyB0aGVzZSB2aWV3cG9ydHMgYXJlIGVxdWl2YWxlbnQsIGJ1dCB0aGV5CiAgICAgICAgICAgIC8vIGNhbiBkaXNhZ3JlZSB3aGVuIHRoZSBwYWdlIGlzIHBpbmNoLXpvb21lZCAob24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgdG91Y2gpLgogICAgICAgICAgICAvLyBTZWUgaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDg5MjA2I2M0CiAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgZG9jdW1lbnRFbGVtZW50IGluc3RlYWQgb2YgdGhlIGJvZHkgYmVjYXVzZSwgYnkgZGVmYXVsdCAod2l0aG91dCBhIGNzcyByZXNldCkKICAgICAgICAgICAgLy8gYnJvd3NlcnMgdHlwaWNhbGx5IGdpdmUgdGhlIGRvY3VtZW50IGJvZHkgYW4gOHB4IG1hcmdpbiwgd2hpY2ggaXMgbm90IGluY2x1ZGVkIGluCiAgICAgICAgICAgIC8vIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7CiAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5nZXRWaWV3cG9ydFNpemUoKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHRvcDogc2Nyb2xsUG9zaXRpb24udG9wLAogICAgICAgICAgICAgICAgbGVmdDogc2Nyb2xsUG9zaXRpb24ubGVmdCwKICAgICAgICAgICAgICAgIGJvdHRvbTogc2Nyb2xsUG9zaXRpb24udG9wICsgaGVpZ2h0LAogICAgICAgICAgICAgICAgcmlnaHQ6IHNjcm9sbFBvc2l0aW9uLmxlZnQgKyB3aWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgIHdpZHRoLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSAodG9wLCBsZWZ0KSBzY3JvbGwgcG9zaXRpb24gb2YgdGhlIHZpZXdwb3J0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Vmlld3BvcnRTY3JvbGxQb3NpdGlvbigpIHsKICAgICAgICAgICAgLy8gV2hpbGUgd2UgY2FuIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgZmFrZSBkb2N1bWVudAogICAgICAgICAgICAvLyBkdXJpbmcgU1NSLCBpdCBkb2Vzbid0IGhhdmUgZ2V0Qm91bmRpbmdDbGllbnRSZWN0LgogICAgICAgICAgICBpZiAoIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgdG9wOiAwLCBsZWZ0OiAwIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIHRvcC1sZWZ0LWNvcm5lciBvZiB0aGUgdmlld3BvcnQgaXMgZGV0ZXJtaW5lZCBieSB0aGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBkb2N1bWVudAogICAgICAgICAgICAvLyBib2R5LCBub3JtYWxseSBqdXN0IChzY3JvbGxMZWZ0LCBzY3JvbGxUb3ApLiBIb3dldmVyLCBDaHJvbWUgYW5kIEZpcmVmb3ggZGlzYWdyZWUgYWJvdXQKICAgICAgICAgICAgLy8gd2hldGhlciBgZG9jdW1lbnQuYm9keWAgb3IgYGRvY3VtZW50LmRvY3VtZW50RWxlbWVudGAgaXMgdGhlIHNjcm9sbGVkIGVsZW1lbnQsIHNvIHJlYWRpbmcKICAgICAgICAgICAgLy8gYHNjcm9sbFRvcGAgYW5kIGBzY3JvbGxMZWZ0YCBpcyBpbmNvbnNpc3RlbnQuIEhvd2V2ZXIsIHVzaW5nIHRoZSBib3VuZGluZyByZWN0IG9mCiAgICAgICAgICAgIC8vIGBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRgIHdvcmtzIGNvbnNpc3RlbnRseSwgd2hlcmUgdGhlIGB0b3BgIGFuZCBgbGVmdGAgdmFsdWVzIHdpbGwKICAgICAgICAgICAgLy8gZXF1YWwgbmVnYXRpdmUgdGhlIHNjcm9sbCBwb3NpdGlvbi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50UmVjdCA9IGRvY3VtZW50RWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0b3AgPSAtZG9jdW1lbnRSZWN0LnRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCB3aW5kb3cuc2Nyb2xsWSB8fAogICAgICAgICAgICAgICAgZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxlZnQgPSAtZG9jdW1lbnRSZWN0LmxlZnQgfHwgZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0IHx8IHdpbmRvdy5zY3JvbGxYIHx8CiAgICAgICAgICAgICAgICBkb2N1bWVudEVsZW1lbnQuc2Nyb2xsTGVmdCB8fCAwOwogICAgICAgICAgICByZXR1cm4geyB0b3AsIGxlZnQgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHdoZW5ldmVyIHRoZSBzaXplIG9mIHRoZSB2aWV3cG9ydCBjaGFuZ2VzLgogICAgICAgICAqIEBwYXJhbSB7Pz19IHRocm90dGxlVGltZSBUaW1lIGluIG1pbGxpc2Vjb25kcyB0byB0aHJvdHRsZSB0aGUgc3RyZWFtLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2hhbmdlKHRocm90dGxlVGltZSA9IERFRkFVTFRfUkVTSVpFX1RJTUUpIHsKICAgICAgICAgICAgcmV0dXJuIHRocm90dGxlVGltZSA+IDAgPyB0aGlzLl9jaGFuZ2UucGlwZShhdWRpdFRpbWUodGhyb3R0bGVUaW1lKSkgOiB0aGlzLl9jaGFuZ2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFjY2VzcyBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIGRvY3VtZW50IHJlZmVyZW5jZQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0RG9jdW1lbnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kb2N1bWVudCB8fCBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIGRlZmF1bHRWaWV3IG9mIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgd2luZG93IHJlZmVyZW5jZQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0V2luZG93KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvYyA9IHRoaXMuX2dldERvY3VtZW50KCk7CiAgICAgICAgICAgIHJldHVybiBkb2MuZGVmYXVsdFZpZXcgfHwgd2luZG93OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBjYWNoZWQgdmlld3BvcnQgc2l6ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVZpZXdwb3J0U2l6ZSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRTaXplID0gdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyID8KICAgICAgICAgICAgICAgIHsgd2lkdGg6IHdpbmRvdy5pbm5lcldpZHRoLCBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodCB9IDoKICAgICAgICAgICAgICAgIHsgd2lkdGg6IDAsIGhlaWdodDogMCB9OwogICAgICAgIH0KICAgIH0KICAgIFZpZXdwb3J0UnVsZXIuybVmYWMgPSBmdW5jdGlvbiBWaWV3cG9ydFJ1bGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFZpZXdwb3J0UnVsZXIpKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KE5nWm9uZSksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBWaWV3cG9ydFJ1bGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFZpZXdwb3J0UnVsZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBWaWV3cG9ydFJ1bGVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgVmlld3BvcnRSdWxlcijJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfSwgdG9rZW46IFZpZXdwb3J0UnVsZXIsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3ZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ2hlY2tzIGlmIHRoZSBnaXZlbiByYW5nZXMgYXJlIGVxdWFsLgogICAgICogQHBhcmFtIHs/fSByMQogICAgICogQHBhcmFtIHs/fSByMgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmFuZ2VzRXF1YWwocjEsIHIyKSB7CiAgICAgICAgcmV0dXJuIHIxLnN0YXJ0ID09IHIyLnN0YXJ0ICYmIHIxLmVuZCA9PSByMi5lbmQ7CiAgICB9CiAgICAvKioKICAgICAqIFNjaGVkdWxlciB0byBiZSB1c2VkIGZvciBzY3JvbGwgZXZlbnRzLiBOZWVkcyB0byBmYWxsIGJhY2sgdG8KICAgICAqIHNvbWV0aGluZyB0aGF0IGRvZXNuJ3QgcmVseSBvbiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgb24gZW52aXJvbm1lbnRzCiAgICAgKiB0aGF0IGRvbid0IHN1cHBvcnQgaXQgKGUuZy4gc2VydmVyLXNpZGUgcmVuZGVyaW5nKS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBTQ1JPTExfU0NIRURVTEVSID0gdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgPyBhbmltYXRpb25GcmFtZSA6IGFzYXA7CiAgICAvKioKICAgICAqIEEgdmlld3BvcnQgdGhhdCB2aXJ0dWFsaXplcyBpdHMgc2Nyb2xsaW5nIHdpdGggdGhlIGhlbHAgb2YgYENka1ZpcnR1YWxGb3JPZmAuCiAgICAgKi8KICAgIGNsYXNzIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCBleHRlbmRzIENka1Njcm9sbGFibGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBuZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9zY3JvbGxTdHJhdGVneQogICAgICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxEaXNwYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/PX0gdmlld3BvcnRSdWxlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgbmdab25lLCBfc2Nyb2xsU3RyYXRlZ3ksIGRpciwgc2Nyb2xsRGlzcGF0Y2hlciwgCiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgYHZpZXdwb3J0UnVsZXJgIHBhcmFtZXRlciB0byBiZWNvbWUgcmVxdWlyZWQuCiAgICAgICAgICogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAKICAgICAgICAgKi8KICAgICAgICB2aWV3cG9ydFJ1bGVyKSB7CiAgICAgICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIHNjcm9sbERpc3BhdGNoZXIsIG5nWm9uZSwgZGlyKTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gX3Njcm9sbFN0cmF0ZWd5OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgdmlld3BvcnQgaXMgZGV0YWNoZWQgZnJvbSBhIENka1ZpcnR1YWxGb3JPZi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2RldGFjaGVkU3ViamVjdCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuIHRoZSByZW5kZXJlZCByYW5nZSBjaGFuZ2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICB0aGlzLl9vcmllbnRhdGlvbiA9ICd2ZXJ0aWNhbCc7CiAgICAgICAgICAgIC8vIE5vdGU6IHdlIGRvbid0IHVzZSB0aGUgdHlwaWNhbCBFdmVudEVtaXR0ZXIgaGVyZSBiZWNhdXNlIHdlIG5lZWQgdG8gc3Vic2NyaWJlIHRvIHRoZSBzY3JvbGwKICAgICAgICAgICAgLy8gc3RyYXRlZ3kgbGF6aWx5IChpLmUuIG9ubHkgaWYgdGhlIHVzZXIgaXMgYWN0dWFsbHkgbGlzdGVuaW5nIHRvIHRoZSBldmVudHMpLiBXZSBkbyB0aGlzIGJlY2F1c2UKICAgICAgICAgICAgLy8gZGVwZW5kaW5nIG9uIGhvdyB0aGUgc3RyYXRlZ3kgY2FsY3VsYXRlcyB0aGUgc2Nyb2xsZWQgaW5kZXgsIGl0IG1heSBjb21lIGF0IGEgY29zdCB0bwogICAgICAgICAgICAvLyBwZXJmb3JtYW5jZS4KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXRzIHdoZW4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBlbGVtZW50IHZpc2libGUgaW4gdGhlIHZpZXdwb3J0IGNoYW5nZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNjcm9sbGVkSW5kZXhDaGFuZ2UgPSBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvYnNlcnZlcikgPT4gdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsZWRJbmRleENoYW5nZS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBpbmRleCA9PiBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMubmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBvYnNlcnZlci5uZXh0KGluZGV4KSkpKSkpKSkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBzdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmVuZGVyZWQgcmFuZ2UgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucmVuZGVyZWRSYW5nZVN0cmVhbSA9IHRoaXMuX3JlbmRlcmVkUmFuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIHRvdGFsIHNpemUgb2YgYWxsIGNvbnRlbnQgKGluIHBpeGVscyksIGluY2x1ZGluZyBjb250ZW50IHRoYXQgaXMgbm90IGN1cnJlbnRseSByZW5kZXJlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RvdGFsQ29udGVudFNpemUgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBgc3R5bGUud2lkdGhgIHByb3BlcnR5IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RvdGFsQ29udGVudFdpZHRoID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGBzdHlsZS5oZWlnaHRgIHByb3BlcnR5IHZhbHVlIHRvIGJlIHVzZWQgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RvdGFsQ29udGVudEhlaWdodCA9ICcnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGN1cnJlbnRseSByZW5kZXJlZCByYW5nZSBvZiBpbmRpY2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRSYW5nZSA9IHsgc3RhcnQ6IDAsIGVuZDogMCB9OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGxlbmd0aCBvZiB0aGUgZGF0YSBib3VuZCB0byB0aGlzIHZpZXdwb3J0IChpbiBudW1iZXIgb2YgaXRlbXMpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGF0YUxlbmd0aCA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgc2l6ZSBvZiB0aGUgdmlld3BvcnQgKGluIHBpeGVscykuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFNpemUgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGxhc3QgcmVuZGVyZWQgY29udGVudCBvZmZzZXQgdGhhdCB3YXMgc2V0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0ID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGxhc3QgcmVuZGVyZWQgY29udGVudCBvZmZzZXQgd2FzIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRlbnQgKGFuZCB0aGVyZWZvcmUgbmVlZHMgdG8KICAgICAgICAgICAgICogYmUgcmV3cml0dGVuIGFzIGFuIG9mZnNldCB0byB0aGUgc3RhcnQgb2YgdGhlIGNvbnRlbnQpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZXJlIGlzIGEgcGVuZGluZyBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIGxpc3Qgb2YgZnVuY3Rpb25zIHRvIHJ1biBhZnRlciB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24gPSBbXTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YnNjcmlwdGlvbiB0byBjaGFuZ2VzIGluIHRoZSB2aWV3cG9ydCBzaXplLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRDaGFuZ2VzID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICBpZiAoIV9zY3JvbGxTdHJhdGVneSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0Vycm9yOiBjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQgcmVxdWlyZXMgdGhlICJpdGVtU2l6ZSIgcHJvcGVydHkgdG8gYmUgc2V0LicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTEuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgdmlld3BvcnRSdWxlcmAuCiAgICAgICAgICAgIGlmICh2aWV3cG9ydFJ1bGVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl92aWV3cG9ydENoYW5nZXMgPSB2aWV3cG9ydFJ1bGVyLmNoYW5nZSgpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja1ZpZXdwb3J0U2l6ZSgpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaXJlY3Rpb24gdGhlIHZpZXdwb3J0IHNjcm9sbHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgb3JpZW50YXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcmllbnRhdGlvbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvcmllbnRhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG9yaWVudGF0aW9uKG9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vcmllbnRhdGlvbiAhPT0gb3JpZW50YXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX29yaWVudGF0aW9uID0gb3JpZW50YXRpb247CiAgICAgICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVTcGFjZXJTaXplKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgc3VwZXIubmdPbkluaXQoKTsKICAgICAgICAgICAgLy8gSXQncyBzdGlsbCB0b28gZWFybHkgdG8gbWVhc3VyZSB0aGUgdmlld3BvcnQgYXQgdGhpcyBwb2ludC4gRGVmZXJyaW5nIHdpdGggYSBwcm9taXNlIGFsbG93cwogICAgICAgICAgICAvLyB0aGUgVmlld3BvcnQgdG8gYmUgcmVuZGVyZWQgd2l0aCB0aGUgY29ycmVjdCBzaXplIGJlZm9yZSB3ZSBtZWFzdXJlLiBXZSBydW4gdGhpcyBvdXRzaWRlIHRoZQogICAgICAgICAgICAvLyB6b25lIHRvIGF2b2lkIGNhdXNpbmcgbW9yZSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlcy4gV2UgaGFuZGxlIHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGxvb3AKICAgICAgICAgICAgLy8gb3Vyc2VsdmVzIGluc3RlYWQuCiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbWVhc3VyZVZpZXdwb3J0U2l6ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuYXR0YWNoKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50U2Nyb2xsZWQoKQogICAgICAgICAgICAgICAgICAgIC5waXBlKAogICAgICAgICAgICAgICAgLy8gU3RhcnQgb2ZmIHdpdGggYSBmYWtlIHNjcm9sbCBldmVudCBzbyB3ZSBwcm9wZXJseSBkZXRlY3Qgb3VyIGluaXRpYWwgcG9zaXRpb24uCiAgICAgICAgICAgICAgICBzdGFydFdpdGgoKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSksIAogICAgICAgICAgICAgICAgLy8gQ29sbGVjdCBtdWx0aXBsZSBldmVudHMgaW50byBvbmUgdW50aWwgdGhlIG5leHQgYW5pbWF0aW9uIGZyYW1lLiBUaGlzIHdheSBpZgogICAgICAgICAgICAgICAgLy8gdGhlcmUgYXJlIG11bHRpcGxlIHNjcm9sbCBldmVudHMgaW4gdGhlIHNhbWUgZnJhbWUgd2Ugb25seSBuZWVkIHRvIHJlY2hlY2sKICAgICAgICAgICAgICAgIC8vIG91ciBsYXlvdXQgb25jZS4KICAgICAgICAgICAgICAgIGF1ZGl0VGltZSgwLCBTQ1JPTExfU0NIRURVTEVSKSkKICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uQ29udGVudFNjcm9sbGVkKCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKTsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuZGV0YWNoKCk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmRldGFjaCgpOwogICAgICAgICAgICAvLyBDb21wbGV0ZSBhbGwgc3ViamVjdHMKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRSYW5nZVN1YmplY3QuY29tcGxldGUoKTsKICAgICAgICAgICAgdGhpcy5fZGV0YWNoZWRTdWJqZWN0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0Q2hhbmdlcy51bnN1YnNjcmliZSgpOwogICAgICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2hlcyBhIGBDZGtWaXJ0dWFsRm9yT2ZgIHRvIHRoaXMgdmlld3BvcnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBmb3JPZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoKGZvck9mKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9mb3JPZikgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ0Nka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCBpcyBhbHJlYWR5IGF0dGFjaGVkLicpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgZGF0YSBzdHJlYW0gb2YgdGhlIENka1ZpcnR1YWxGb3JPZiB0byBrZWVwIHRyYWNrIG9mIHdoZW4gdGhlIGRhdGEgbGVuZ3RoCiAgICAgICAgICAgIC8vIGNoYW5nZXMuIFJ1biBvdXRzaWRlIHRoZSB6b25lIHRvIGF2b2lkIHRyaWdnZXJpbmcgY2hhbmdlIGRldGVjdGlvbiwgc2luY2Ugd2UncmUgbWFuYWdpbmcgdGhlCiAgICAgICAgICAgIC8vIGNoYW5nZSBkZXRlY3Rpb24gbG9vcCBvdXJzZWx2ZXMuCiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvck9mID0gZm9yT2Y7CiAgICAgICAgICAgICAgICB0aGlzLl9mb3JPZi5kYXRhU3RyZWFtLnBpcGUodGFrZVVudGlsKHRoaXMuX2RldGFjaGVkU3ViamVjdCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRhdGEgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdMZW5ndGggPSBkYXRhLmxlbmd0aDsKICAgICAgICAgICAgICAgICAgICBpZiAobmV3TGVuZ3RoICE9PSB0aGlzLl9kYXRhTGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RhdGFMZW5ndGggPSBuZXdMZW5ndGg7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uRGF0YUxlbmd0aENoYW5nZWQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9DaGFuZ2VEZXRlY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyB0aGUgY3VycmVudCBgQ2RrVmlydHVhbEZvck9mYC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRldGFjaCgpIHsKICAgICAgICAgICAgdGhpcy5fZm9yT2YgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9kZXRhY2hlZFN1YmplY3QubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBsZW5ndGggb2YgdGhlIGRhdGEgYm91bmQgdG8gdGhpcyB2aWV3cG9ydCAoaW4gbnVtYmVyIG9mIGl0ZW1zKS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldERhdGFMZW5ndGgoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kYXRhTGVuZ3RoOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBzaXplIG9mIHRoZSB2aWV3cG9ydCAoaW4gcGl4ZWxzKS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFZpZXdwb3J0U2l6ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZpZXdwb3J0U2l6ZTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhtbWFsZXJiYSk6IFRoaXMgaXMgdGVjaG5pY2FsbHkgb3V0IG9mIHN5bmMgd2l0aCB3aGF0J3MgcmVhbGx5IHJlbmRlcmVkIHVudGlsIGEgcmVuZGVyCiAgICAgICAgLy8gY3ljbGUgaGFwcGVucy4gSSdtIGJlaW5nIGNhcmVmdWwgdG8gb25seSBjYWxsIGl0IGFmdGVyIHRoZSByZW5kZXIgY3ljbGUgaXMgY29tcGxldGUgYW5kIGJlZm9yZQogICAgICAgIC8vIHNldHRpbmcgaXQgdG8gc29tZXRoaW5nIGVsc2UsIGJ1dCBpdHMgZXJyb3IgcHJvbmUgYW5kIHNob3VsZCBwcm9iYWJseSBiZSBzcGxpdCBpbnRvCiAgICAgICAgLy8gYHBlbmRpbmdSYW5nZWAgYW5kIGByZW5kZXJlZFJhbmdlYCwgdGhlIGxhdHRlciByZWZsZWN0aW5nIHdoYXRzIGFjdHVhbGx5IGluIHRoZSBET00uCiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBjdXJyZW50IHJlbmRlcmVkIHJhbmdlIG9mIGl0ZW1zLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UmVuZGVyZWRSYW5nZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlbmRlcmVkUmFuZ2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHRvdGFsIHNpemUgb2YgYWxsIGNvbnRlbnQgKGluIHBpeGVscyksIGluY2x1ZGluZyBjb250ZW50IHRoYXQgaXMgbm90IGN1cnJlbnRseQogICAgICAgICAqIHJlbmRlcmVkLgogICAgICAgICAqIEBwYXJhbSB7P30gc2l6ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0VG90YWxDb250ZW50U2l6ZShzaXplKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl90b3RhbENvbnRlbnRTaXplICE9PSBzaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbENvbnRlbnRTaXplID0gc2l6ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2NhbGN1bGF0ZVNwYWNlclNpemUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgcmVuZGVyZWQgcmFuZ2Ugb2YgaW5kaWNlcy4KICAgICAgICAgKiBAcGFyYW0gez99IHJhbmdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRSZW5kZXJlZFJhbmdlKHJhbmdlKSB7CiAgICAgICAgICAgIGlmICghcmFuZ2VzRXF1YWwodGhpcy5fcmVuZGVyZWRSYW5nZSwgcmFuZ2UpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFJhbmdlU3ViamVjdC5uZXh0KHRoaXMuX3JlbmRlcmVkUmFuZ2UgPSByYW5nZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3Njcm9sbFN0cmF0ZWd5Lm9uQ29udGVudFJlbmRlcmVkKCkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IHRvIHRoZSBzdGFydCBvZiB0aGUgcmVuZGVyZWQgZGF0YSAoaW4gcGl4ZWxzKS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldE9mZnNldFRvUmVuZGVyZWRDb250ZW50U3RhcnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGUgPyBudWxsIDogdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IHRvIGVpdGhlciB0aGUgc3RhcnQgb3IgZW5kIG9mIHRoZSByZW5kZXJlZCBkYXRhCiAgICAgICAgICogKGluIHBpeGVscykuCiAgICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXQKICAgICAgICAgKiBAcGFyYW0gez89fSB0bwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KG9mZnNldCwgdG8gPSAndG8tc3RhcnQnKSB7CiAgICAgICAgICAgIC8vIEZvciBhIGhvcml6b250YWwgdmlld3BvcnQgaW4gYSByaWdodC10by1sZWZ0IGxhbmd1YWdlIHdlIG5lZWQgdG8gdHJhbnNsYXRlIGFsb25nIHRoZSB4LWF4aXMKICAgICAgICAgICAgLy8gaW4gdGhlIG5lZ2F0aXZlIGRpcmVjdGlvbi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1J0bCA9IHRoaXMuZGlyICYmIHRoaXMuZGlyLnZhbHVlID09ICdydGwnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzSG9yaXpvbnRhbCA9IHRoaXMub3JpZW50YXRpb24gPT0gJ2hvcml6b250YWwnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF4aXMgPSBpc0hvcml6b250YWwgPyAnWCcgOiAnWSc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXhpc0RpcmVjdGlvbiA9IGlzSG9yaXpvbnRhbCAmJiBpc1J0bCA/IC0xIDogMTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdHJhbnNmb3JtID0gYHRyYW5zbGF0ZSR7YXhpc30oJHtOdW1iZXIoYXhpc0RpcmVjdGlvbiAqIG9mZnNldCl9cHgpYDsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0ID0gb2Zmc2V0OwogICAgICAgICAgICBpZiAodG8gPT09ICd0by1lbmQnKSB7CiAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gKz0gYCB0cmFuc2xhdGUke2F4aXN9KC0xMDAlKWA7CiAgICAgICAgICAgICAgICAvLyBUaGUgdmlld3BvcnQgc2hvdWxkIHJld3JpdGUgdGhpcyBhcyBhIGB0by1zdGFydGAgb2Zmc2V0IG9uIHRoZSBuZXh0IHJlbmRlciBjeWNsZS4gT3RoZXJ3aXNlCiAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyB3aWxsIGFwcGVhciB0byBleHBhbmQgaW4gdGhlIHdyb25nIGRpcmVjdGlvbiAoZS5nLiBgbWF0LWV4cGFuc2lvbi1wYW5lbGAgd291bGQKICAgICAgICAgICAgICAgIC8vIGV4cGFuZCB1cHdhcmQpLgogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyZWRDb250ZW50VHJhbnNmb3JtICE9IHRyYW5zZm9ybSkgewogICAgICAgICAgICAgICAgLy8gV2Uga25vdyB0aGlzIHZhbHVlIGlzIHNhZmUgYmVjYXVzZSB3ZSBwYXJzZSBgb2Zmc2V0YCB3aXRoIGBOdW1iZXIoKWAgYmVmb3JlIHBhc3NpbmcgaXQKICAgICAgICAgICAgICAgIC8vIGludG8gdGhlIHN0cmluZy4KICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybSA9IHRyYW5zZm9ybTsKICAgICAgICAgICAgICAgIHRoaXMuX21hcmtDaGFuZ2VEZXRlY3Rpb25OZWVkZWQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJlZENvbnRlbnRPZmZzZXROZWVkc1Jld3JpdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0IC09IHRoaXMubWVhc3VyZVJlbmRlcmVkQ29udGVudFNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRDb250ZW50T2Zmc2V0TmVlZHNSZXdyaXRlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UmVuZGVyZWRDb250ZW50T2Zmc2V0KHRoaXMuX3JlbmRlcmVkQ29udGVudE9mZnNldCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5vblJlbmRlcmVkT2Zmc2V0Q2hhbmdlZCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTY3JvbGxzIHRvIHRoZSBnaXZlbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0LiBQbGVhc2Ugbm90ZSB0aGF0IHRoaXMgaXMgbm90IGFsd2F5cwogICAgICAgICAqIHRoZSBzYW1lIGFzIHNldHRpbmcgYHNjcm9sbFRvcGAgb3IgYHNjcm9sbExlZnRgLiBJbiBhIGhvcml6b250YWwgdmlld3BvcnQgd2l0aCByaWdodC10by1sZWZ0CiAgICAgICAgICogZGlyZWN0aW9uLCB0aGlzIHdvdWxkIGJlIHRoZSBlcXVpdmFsZW50IG9mIHNldHRpbmcgYSBmaWN0aW9uYWwgYHNjcm9sbFJpZ2h0YCBwcm9wZXJ0eS4KICAgICAgICAgKiBAcGFyYW0gez99IG9mZnNldCBUaGUgb2Zmc2V0IHRvIHNjcm9sbCB0by4KICAgICAgICAgKiBAcGFyYW0gez89fSBiZWhhdmlvciBUaGUgU2Nyb2xsQmVoYXZpb3IgdG8gdXNlIHdoZW4gc2Nyb2xsaW5nLiBEZWZhdWx0IGlzIGJlaGF2aW9yIGlzIGBhdXRvYC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNjcm9sbFRvT2Zmc2V0KG9mZnNldCwgYmVoYXZpb3IgPSAnYXV0bycpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcHRpb25zID0geyBiZWhhdmlvciB9OwogICAgICAgICAgICBpZiAodGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnKSB7CiAgICAgICAgICAgICAgICBvcHRpb25zLnN0YXJ0ID0gb2Zmc2V0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgb3B0aW9ucy50b3AgPSBvZmZzZXQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zY3JvbGxUbyhvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2Nyb2xscyB0byB0aGUgb2Zmc2V0IGZvciB0aGUgZ2l2ZW4gaW5kZXguCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gc2Nyb2xsIHRvLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGJlaGF2aW9yIFRoZSBTY3JvbGxCZWhhdmlvciB0byB1c2Ugd2hlbiBzY3JvbGxpbmcuIERlZmF1bHQgaXMgYmVoYXZpb3IgaXMgYGF1dG9gLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IgPSAnYXV0bycpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuc2Nyb2xsVG9JbmRleChpbmRleCwgYmVoYXZpb3IpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50IHNjcm9sbCBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZpZXdwb3J0IChpbiBwaXhlbHMpLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGZyb20gVGhlIGVkZ2UgdG8gbWVhc3VyZSB0aGUgb2Zmc2V0IGZyb20uIERlZmF1bHRzIHRvICd0b3AnIGluIHZlcnRpY2FsIG1vZGUgYW5kICdzdGFydCcKICAgICAgICAgKiAgICAgaW4gaG9yaXpvbnRhbCBtb2RlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWVhc3VyZVNjcm9sbE9mZnNldChmcm9tKSB7CiAgICAgICAgICAgIHJldHVybiBmcm9tID8KICAgICAgICAgICAgICAgIHN1cGVyLm1lYXN1cmVTY3JvbGxPZmZzZXQoZnJvbSkgOgogICAgICAgICAgICAgICAgc3VwZXIubWVhc3VyZVNjcm9sbE9mZnNldCh0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnc3RhcnQnIDogJ3RvcCcpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNZWFzdXJlIHRoZSBjb21iaW5lZCBzaXplIG9mIGFsbCBvZiB0aGUgcmVuZGVyZWQgaXRlbXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtZWFzdXJlUmVuZGVyZWRDb250ZW50U2l6ZSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250ZW50RWwgPSB0aGlzLl9jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICByZXR1cm4gdGhpcy5vcmllbnRhdGlvbiA9PT0gJ2hvcml6b250YWwnID8gY29udGVudEVsLm9mZnNldFdpZHRoIDogY29udGVudEVsLm9mZnNldEhlaWdodDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWVhc3VyZSB0aGUgdG90YWwgY29tYmluZWQgc2l6ZSBvZiB0aGUgZ2l2ZW4gcmFuZ2UuIFRocm93cyBpZiB0aGUgcmFuZ2UgaW5jbHVkZXMgaXRlbXMgdGhhdCBhcmUKICAgICAgICAgKiBub3QgcmVuZGVyZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSByYW5nZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWVhc3VyZVJhbmdlU2l6ZShyYW5nZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2Zvck9mKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9yT2YubWVhc3VyZVJhbmdlU2l6ZShyYW5nZSwgdGhpcy5vcmllbnRhdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgdmlld3BvcnQgZGltZW5zaW9ucyBhbmQgcmUtcmVuZGVyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2hlY2tWaWV3cG9ydFNpemUoKSB7CiAgICAgICAgICAgIC8vIFRPRE86IENsZWFudXAgbGF0ZXIgd2hlbiBhZGQgbG9naWMgZm9yIGhhbmRsaW5nIGNvbnRlbnQgcmVzaXplCiAgICAgICAgICAgIHRoaXMuX21lYXN1cmVWaWV3cG9ydFNpemUoKTsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kub25EYXRhTGVuZ3RoQ2hhbmdlZCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNZWFzdXJlIHRoZSB2aWV3cG9ydCBzaXplLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbWVhc3VyZVZpZXdwb3J0U2l6ZSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3cG9ydEVsID0gdGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0U2l6ZSA9IHRoaXMub3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJyA/CiAgICAgICAgICAgICAgICB2aWV3cG9ydEVsLmNsaWVudFdpZHRoIDogdmlld3BvcnRFbC5jbGllbnRIZWlnaHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFF1ZXVlIHVwIGNoYW5nZSBkZXRlY3Rpb24gdG8gcnVuLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gcnVuQWZ0ZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9tYXJrQ2hhbmdlRGV0ZWN0aW9uTmVlZGVkKHJ1bkFmdGVyKSB7CiAgICAgICAgICAgIGlmIChydW5BZnRlcikgewogICAgICAgICAgICAgICAgdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24ucHVzaChydW5BZnRlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXNlIGEgUHJvbWlzZSB0byBiYXRjaCB0b2dldGhlciBjYWxscyB0byBgX2RvQ2hhbmdlRGV0ZWN0aW9uYC4gVGhpcyB3YXkgaWYgd2Ugc2V0IGEgYnVuY2ggb2YKICAgICAgICAgICAgLy8gcHJvcGVydGllcyBzZXF1ZW50aWFsbHkgd2Ugb25seSBoYXZlIHRvIHJ1biBgX2RvQ2hhbmdlRGV0ZWN0aW9uYCBvbmNlIGF0IHRoZSBlbmQuCiAgICAgICAgICAgIGlmICghdGhpcy5faXNDaGFuZ2VEZXRlY3Rpb25QZW5kaW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pc0NoYW5nZURldGVjdGlvblBlbmRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZG9DaGFuZ2VEZXRlY3Rpb24oKTsKICAgICAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJ1biBjaGFuZ2UgZGV0ZWN0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZG9DaGFuZ2VEZXRlY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2lzQ2hhbmdlRGV0ZWN0aW9uUGVuZGluZyA9IGZhbHNlOwogICAgICAgICAgICAvLyBBcHBseSB0aGUgY29udGVudCB0cmFuc2Zvcm0uIFRoZSB0cmFuc2Zvcm0gY2FuJ3QgYmUgc2V0IHZpYSBhbiBBbmd1bGFyIGJpbmRpbmcgYmVjYXVzZQogICAgICAgICAgICAvLyBieXBhc3NTZWN1cml0eVRydXN0U3R5bGUgaXMgYmFubmVkIGluIEdvb2dsZS4gSG93ZXZlciB0aGUgdmFsdWUgaXMgc2FmZSwgaXQncyBjb21wb3NlZCBvZgogICAgICAgICAgICAvLyBzdHJpbmcgbGl0ZXJhbHMsIGEgdmFyaWFibGUgdGhhdCBjYW4gb25seSBiZSAnWCcgb3IgJ1knLCBhbmQgdXNlciBpbnB1dCB0aGF0IGlzIHJ1biB0aHJvdWdoCiAgICAgICAgICAgIC8vIHRoZSBgTnVtYmVyYCBmdW5jdGlvbiBmaXJzdCB0byBjb2VyY2UgaXQgdG8gYSBudW1lcmljIHZhbHVlLgogICAgICAgICAgICB0aGlzLl9jb250ZW50V3JhcHBlci5uYXRpdmVFbGVtZW50LnN0eWxlLnRyYW5zZm9ybSA9IHRoaXMuX3JlbmRlcmVkQ29udGVudFRyYW5zZm9ybTsKICAgICAgICAgICAgLy8gQXBwbHkgY2hhbmdlcyB0byBBbmd1bGFyIGJpbmRpbmdzLiBOb3RlOiBXZSBtdXN0IGNhbGwgYG1hcmtGb3JDaGVja2AgdG8gcnVuIGNoYW5nZSBkZXRlY3Rpb24KICAgICAgICAgICAgLy8gZnJvbSB0aGUgcm9vdCwgc2luY2UgdGhlIHJlcGVhdGVkIGl0ZW1zIGFyZSBjb250ZW50IHByb2plY3RlZCBpbi4gQ2FsbGluZyBgZGV0ZWN0Q2hhbmdlc2AKICAgICAgICAgICAgLy8gaW5zdGVhZCBkb2VzIG5vdCBwcm9wZXJseSBjaGVjayB0aGUgcHJvamVjdGVkIGNvbnRlbnQuCiAgICAgICAgICAgIHRoaXMubmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJ1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uID0gdGhpcy5fcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb247CiAgICAgICAgICAgIHRoaXMuX3J1bkFmdGVyQ2hhbmdlRGV0ZWN0aW9uID0gW107CiAgICAgICAgICAgIGZvciAoY29uc3QgZm4gb2YgcnVuQWZ0ZXJDaGFuZ2VEZXRlY3Rpb24pIHsKICAgICAgICAgICAgICAgIGZuKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsY3VsYXRlcyB0aGUgYHN0eWxlLndpZHRoYCBhbmQgYHN0eWxlLmhlaWdodGAgZm9yIHRoZSBzcGFjZXIgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhbGN1bGF0ZVNwYWNlclNpemUoKSB7CiAgICAgICAgICAgIHRoaXMuX3RvdGFsQ29udGVudEhlaWdodCA9CiAgICAgICAgICAgICAgICB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyAnJyA6IGAke3RoaXMuX3RvdGFsQ29udGVudFNpemV9cHhgOwogICAgICAgICAgICB0aGlzLl90b3RhbENvbnRlbnRXaWR0aCA9CiAgICAgICAgICAgICAgICB0aGlzLm9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcgPyBgJHt0aGlzLl90b3RhbENvbnRlbnRTaXplfXB4YCA6ICcnOwogICAgICAgIH0KICAgIH0KICAgIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC7JtWZhYyA9IGZ1bmN0aW9uIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoVklSVFVBTF9TQ1JPTExfU1RSQVRFR1ksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChTY3JvbGxEaXNwYXRjaGVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3cG9ydFJ1bGVyLCA4KSk7IH07CiAgICBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBzZWxlY3RvcnM6IFtbImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJDIsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2NvbnRlbnRXcmFwcGVyID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCJdLCBob3N0VmFyczogNCwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJjZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCIsIGN0eC5vcmllbnRhdGlvbiA9PT0gImhvcml6b250YWwiKSgiY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIiwgY3R4Lm9yaWVudGF0aW9uICE9PSAiaG9yaXpvbnRhbCIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IG9yaWVudGF0aW9uOiAib3JpZW50YXRpb24iIH0sIG91dHB1dHM6IHsgc2Nyb2xsZWRJbmRleENoYW5nZTogInNjcm9sbGVkSW5kZXhDaGFuZ2UiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sKICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBDZGtTY3JvbGxhYmxlLAogICAgICAgICAgICAgICAgICAgIHVzZUV4aXN0aW5nOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQKICAgICAgICAgICAgICAgIH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJDIsIGRlY2xzOiA0LCB2YXJzOiA0LCBjb25zdHM6IFtbMSwgImNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXIiXSwgWyJjb250ZW50V3JhcHBlciIsICIiXSwgWzEsICJjZGstdmlydHVhbC1zY3JvbGwtc3BhY2VyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICAgICAgybXJtXByb2plY3Rpb24oMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDMsICJkaXYiLCAyKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVzdHlsZVByb3AoIndpZHRoIiwgY3R4Ll90b3RhbENvbnRlbnRXaWR0aCkoImhlaWdodCIsIGN0eC5fdG90YWxDb250ZW50SGVpZ2h0KTsKICAgICAgICB9IH0sIHN0eWxlczogWyJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnR7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtvdmVyZmxvdzphdXRvO2NvbnRhaW46c3RyaWN0O3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApO3dpbGwtY2hhbmdlOnNjcm9sbC1wb3NpdGlvbjstd2Via2l0LW92ZXJmbG93LXNjcm9sbGluZzp0b3VjaH0uY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtsZWZ0OjA7Y29udGFpbjpjb250ZW50fVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcntyaWdodDowO2xlZnQ6YXV0b30uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXJ7bWluLWhlaWdodDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5kbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLWhvcml6b250YWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+b2w6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi1ob3Jpem9udGFsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24taG9yaXpvbnRhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj51bDpub3QoW2Nka1ZpcnR1YWxGb3JdKXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjA7bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MDtib3JkZXItbGVmdC13aWR0aDowO2JvcmRlci1yaWdodC13aWR0aDowO291dGxpbmU6bm9uZX0uY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVye21pbi13aWR0aDoxMDAlfS5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+ZGw6bm90KFtjZGtWaXJ0dWFsRm9yXSksLmNkay12aXJ0dWFsLXNjcm9sbC1vcmllbnRhdGlvbi12ZXJ0aWNhbCAuY2RrLXZpcnR1YWwtc2Nyb2xsLWNvbnRlbnQtd3JhcHBlcj5vbDpub3QoW2Nka1ZpcnR1YWxGb3JdKSwuY2RrLXZpcnR1YWwtc2Nyb2xsLW9yaWVudGF0aW9uLXZlcnRpY2FsIC5jZGstdmlydHVhbC1zY3JvbGwtY29udGVudC13cmFwcGVyPnRhYmxlOm5vdChbY2RrVmlydHVhbEZvcl0pLC5jZGstdmlydHVhbC1zY3JvbGwtb3JpZW50YXRpb24tdmVydGljYWwgLmNkay12aXJ0dWFsLXNjcm9sbC1jb250ZW50LXdyYXBwZXI+dWw6bm90KFtjZGtWaXJ0dWFsRm9yXSl7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21hcmdpbi10b3A6MDttYXJnaW4tYm90dG9tOjA7Ym9yZGVyLXRvcC13aWR0aDowO2JvcmRlci1ib3R0b20td2lkdGg6MDtvdXRsaW5lOm5vbmV9LmNkay12aXJ0dWFsLXNjcm9sbC1zcGFjZXJ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowO2hlaWdodDoxcHg7d2lkdGg6MXB4O3RyYW5zZm9ybS1vcmlnaW46MCAwfVtkaXI9cnRsXSAuY2RrLXZpcnR1YWwtc2Nyb2xsLXNwYWNlcntyaWdodDowO2xlZnQ6YXV0bzt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtWSVJUVUFMX1NDUk9MTF9TVFJBVEVHWSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IFNjcm9sbERpc3BhdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CiAgICBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgb3JpZW50YXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNjcm9sbGVkSW5kZXhDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBfY29udGVudFdyYXBwZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydjb250ZW50V3JhcHBlcicsIHsgc3RhdGljOiB0cnVlIH0sXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvc2Nyb2xsaW5nL3ZpcnR1YWwtZm9yLW9mLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSGVscGVyIHRvIGV4dHJhY3Qgc2l6ZSBmcm9tIGEgRE9NIE5vZGUuCiAgICAgKiBAcGFyYW0gez99IG9yaWVudGF0aW9uCiAgICAgKiBAcGFyYW0gez99IG5vZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNpemUob3JpZW50YXRpb24sIG5vZGUpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAobm9kZSkpOwogICAgICAgIGlmICghZWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KSB7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgIHJldHVybiBvcmllbnRhdGlvbiA9PSAnaG9yaXpvbnRhbCcgPyByZWN0LndpZHRoIDogcmVjdC5oZWlnaHQ7CiAgICB9CiAgICAvKioKICAgICAqIEEgZGlyZWN0aXZlIHNpbWlsYXIgdG8gYG5nRm9yT2ZgIHRvIGJlIHVzZWQgZm9yIHJlbmRlcmluZyBkYXRhIGluc2lkZSBhIHZpcnR1YWwgc2Nyb2xsaW5nCiAgICAgKiBjb250YWluZXIuCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBDZGtWaXJ0dWFsRm9yT2YgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF90ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gX2RpZmZlcnMKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3cG9ydAogICAgICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYsIF90ZW1wbGF0ZSwgX2RpZmZlcnMsIF92aWV3cG9ydCwgbmdab25lKSB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYgPSBfdmlld0NvbnRhaW5lclJlZjsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSBfdGVtcGxhdGU7CiAgICAgICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVyczsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnQgPSBfdmlld3BvcnQ7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuIHRoZSByZW5kZXJlZCB2aWV3IG9mIHRoZSBkYXRhIGNoYW5nZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnZpZXdDaGFuZ2UgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3ViamVjdCB0aGF0IGVtaXRzIHdoZW4gYSBuZXcgRGF0YVNvdXJjZSBpbnN0YW5jZSBpcyBnaXZlbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBzaXplIG9mIHRoZSBjYWNoZSB1c2VkIHRvIHN0b3JlIHRlbXBsYXRlcyB0aGF0IGFyZSBub3QgYmVpbmcgdXNlZCBmb3IgcmUtdXNlIGxhdGVyLgogICAgICAgICAgICAgKiBTZXR0aW5nIHRoZSBjYWNoZSBzaXplIHRvIGAwYCB3aWxsIGRpc2FibGUgY2FjaGluZy4gRGVmYXVsdHMgdG8gMjAgdGVtcGxhdGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemUgPSAyMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXRzIHdoZW5ldmVyIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50IERhdGFTb3VyY2UgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZGF0YVN0cmVhbSA9IHRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzCiAgICAgICAgICAgICAgICAucGlwZSgKICAgICAgICAgICAgLy8gU3RhcnQgb2ZmIHdpdGggbnVsbCBgRGF0YVNvdXJjZWAuCiAgICAgICAgICAgIHN0YXJ0V2l0aCgoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpKSwgCiAgICAgICAgICAgIC8vIEJ1bmRsZSB1cCB0aGUgcHJldmlvdXMgYW5kIGN1cnJlbnQgZGF0YSBzb3VyY2VzIHNvIHdlIGNhbiB3b3JrIHdpdGggYm90aC4KICAgICAgICAgICAgcGFpcndpc2UoKSwgCiAgICAgICAgICAgIC8vIFVzZSBgX2NoYW5nZURhdGFTb3VyY2VgIHRvIGRpc2Nvbm5lY3QgZnJvbSB0aGUgcHJldmlvdXMgZGF0YSBzb3VyY2UgYW5kIGNvbm5lY3QgdG8gdGhlCiAgICAgICAgICAgIC8vIG5ldyBvbmUsIHBhc3NpbmcgYmFjayBhIHN0cmVhbSBvZiBkYXRhIGNoYW5nZXMgd2hpY2ggd2UgcnVuIHRocm91Z2ggYHN3aXRjaE1hcGAgdG8gZ2l2ZQogICAgICAgICAgICAvLyB1cyBhIGRhdGEgc3RyZWFtIHRoYXQgZW1pdHMgdGhlIGxhdGVzdCBkYXRhIGZyb20gd2hhdGV2ZXIgdGhlIGN1cnJlbnQgYERhdGFTb3VyY2VgIGlzLgogICAgICAgICAgICBzd2l0Y2hNYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtwcmV2LCBjdXJdKSA9PiB0aGlzLl9jaGFuZ2VEYXRhU291cmNlKHByZXYsIGN1cikpKSwgCiAgICAgICAgICAgIC8vIFJlcGxheSB0aGUgbGFzdCBlbWl0dGVkIGRhdGEgd2hlbiBzb21lb25lIHN1YnNjcmliZXMuCiAgICAgICAgICAgIHNoYXJlUmVwbGF5KDEpKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBkaWZmZXIgdXNlZCB0byBjYWxjdWxhdGUgY2hhbmdlcyB0byB0aGUgZGF0YS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2RpZmZlciA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgdGVtcGxhdGUgY2FjaGUgdXNlZCB0byBob2xkIG9uIG90IHRlbXBsYXRlIGluc3RhbmNlc3MgdGhhdCBoYXZlIGJlZW4gc3RhbXBlZCBvdXQsIGJ1dCBkb24ndAogICAgICAgICAgICAgKiBjdXJyZW50bHkgbmVlZCB0byBiZSByZW5kZXJlZC4gVGhlc2UgaW5zdGFuY2VzIHdpbGwgYmUgcmV1c2VkIGluIHRoZSBmdXR1cmUgcmF0aGVyIHRoYW4KICAgICAgICAgICAgICogc3RhbXBpbmcgb3V0IGJyYW5kIG5ldyBvbmVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVDYWNoZSA9IFtdOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgcmVuZGVyZWQgZGF0YSBzaG91bGQgYmUgdXBkYXRlZCBkdXJpbmcgdGhlIG5leHQgbmdEb0NoZWNrIGN5Y2xlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgdGhpcy5kYXRhU3RyZWFtLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGF0YSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhID0gZGF0YTsKICAgICAgICAgICAgICAgIHRoaXMuX29uUmVuZGVyZWREYXRhQ2hhbmdlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnQucmVuZGVyZWRSYW5nZVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJhbmdlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICByYW5nZSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlZFJhbmdlID0gcmFuZ2U7CiAgICAgICAgICAgICAgICBuZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMudmlld0NoYW5nZS5uZXh0KHRoaXMuX3JlbmRlcmVkUmFuZ2UpKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9vblJlbmRlcmVkRGF0YUNoYW5nZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0LmF0dGFjaCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIERhdGFTb3VyY2UgdG8gZGlzcGxheS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjZGtWaXJ0dWFsRm9yT2YoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZGtWaXJ0dWFsRm9yT2Y7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBjZGtWaXJ0dWFsRm9yT2YodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fY2RrVmlydHVhbEZvck9mID0gdmFsdWU7CiAgICAgICAgICAgIGlmIChpc0RhdGFTb3VyY2UodmFsdWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFNsaWNlIHRoZSB2YWx1ZSBpZiBpdHMgYW4gTmdJdGVyYWJsZSB0byBlbnN1cmUgd2UncmUgd29ya2luZyB3aXRoIGFuIGFycmF5LgogICAgICAgICAgICAgICAgdGhpcy5fZGF0YVNvdXJjZUNoYW5nZXMubmV4dChuZXcgQXJyYXlEYXRhU291cmNlKGlzT2JzZXJ2YWJsZSh2YWx1ZSkgPyB2YWx1ZSA6IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKHZhbHVlIHx8IFtdKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBgVHJhY2tCeUZ1bmN0aW9uYCB0byB1c2UgZm9yIHRyYWNraW5nIGNoYW5nZXMuIFRoZSBgVHJhY2tCeUZ1bmN0aW9uYCB0YWtlcyB0aGUgaW5kZXggYW5kCiAgICAgICAgICogdGhlIGl0ZW0gYW5kIHByb2R1Y2VzIGEgdmFsdWUgdG8gYmUgdXNlZCBhcyB0aGUgaXRlbSdzIGlkZW50aXR5IHdoZW4gdHJhY2tpbmcgY2hhbmdlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjZGtWaXJ0dWFsRm9yVHJhY2tCeSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Nka1ZpcnR1YWxGb3JUcmFja0J5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgY2RrVmlydHVhbEZvclRyYWNrQnkoZm4pIHsKICAgICAgICAgICAgdGhpcy5fbmVlZHNVcGRhdGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9jZGtWaXJ0dWFsRm9yVHJhY2tCeSA9IGZuID8KICAgICAgICAgICAgICAgICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGluZGV4LCBpdGVtKSA9PiBmbihpbmRleCArICh0aGlzLl9yZW5kZXJlZFJhbmdlID8gdGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCA6IDApLCBpdGVtKSkgOgogICAgICAgICAgICAgICAgdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdGVtcGxhdGUgdXNlZCB0byBzdGFtcCBvdXQgbmV3IGVsZW1lbnRzLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBjZGtWaXJ0dWFsRm9yVGVtcGxhdGUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1lYXN1cmVzIHRoZSBjb21iaW5lZCBzaXplICh3aWR0aCBmb3IgaG9yaXpvbnRhbCBvcmllbnRhdGlvbiwgaGVpZ2h0IGZvciB2ZXJ0aWNhbCkgb2YgYWxsIGl0ZW1zCiAgICAgICAgICogaW4gdGhlIHNwZWNpZmllZCByYW5nZS4gVGhyb3dzIGFuIGVycm9yIGlmIHRoZSByYW5nZSBpbmNsdWRlcyBpdGVtcyB0aGF0IGFyZSBub3QgY3VycmVudGx5CiAgICAgICAgICogcmVuZGVyZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSByYW5nZQogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZW50YXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1lYXN1cmVSYW5nZVNpemUocmFuZ2UsIG9yaWVudGF0aW9uKSB7CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydCA+PSByYW5nZS5lbmQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChyYW5nZS5zdGFydCA8IHRoaXMuX3JlbmRlcmVkUmFuZ2Uuc3RhcnQgfHwgcmFuZ2UuZW5kID4gdGhpcy5fcmVuZGVyZWRSYW5nZS5lbmQpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBFcnJvcjogYXR0ZW1wdGVkIHRvIG1lYXN1cmUgYW4gaXRlbSB0aGF0IGlzbid0IHJlbmRlcmVkLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBpbmRleCBpbnRvIHRoZSBsaXN0IG9mIHJlbmRlcmVkIHZpZXdzIGZvciB0aGUgZmlyc3QgaXRlbSBpbiB0aGUgcmFuZ2UuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVuZGVyZWRTdGFydEluZGV4ID0gcmFuZ2Uuc3RhcnQgLSB0aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0OwogICAgICAgICAgICAvLyBUaGUgbGVuZ3RoIG9mIHRoZSByYW5nZSB3ZSdyZSBtZWFzdXJpbmcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmFuZ2VMZW4gPSByYW5nZS5lbmQgLSByYW5nZS5zdGFydDsKICAgICAgICAgICAgLy8gTG9vcCBvdmVyIGFsbCByb290IG5vZGVzIGZvciBhbGwgaXRlbXMgaW4gdGhlIHJhbmdlIGFuZCBzdW0gdXAgdGhlaXIgc2l6ZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdG90YWxTaXplID0gMDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaSA9IHJhbmdlTGVuOwogICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZ2V0KGkgKyByZW5kZXJlZFN0YXJ0SW5kZXgpKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgaiA9IHZpZXcgPyB2aWV3LnJvb3ROb2Rlcy5sZW5ndGggOiAwOwogICAgICAgICAgICAgICAgd2hpbGUgKGotLSkgewogICAgICAgICAgICAgICAgICAgIHRvdGFsU2l6ZSArPSBnZXRTaXplKG9yaWVudGF0aW9uLCAoLyoqIEB0eXBlIHs/fSAqLyAodmlldykpLnJvb3ROb2Rlc1tqXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0RvQ2hlY2soKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9kaWZmZXIgJiYgdGhpcy5fbmVlZHNVcGRhdGUpIHsKICAgICAgICAgICAgICAgIC8vIFRPRE8obW1hbGVyYmEpOiBXZSBzaG91bGQgZGlmZmVyZW50aWF0ZSBuZWVkcyB1cGRhdGUgZHVlIHRvIHNjcm9sbGluZyBhbmQgYSBuZXcgcG9ydGlvbiBvZgogICAgICAgICAgICAgICAgLy8gdGhpcyBsaXN0IGJlaW5nIHJlbmRlcmVkIChjYW4gdXNlIHNpbXBsZXIgYWxnb3JpdGhtKSB2cyBuZWVkcyB1cGRhdGUgZHVlIHRvIGRhdGEgYWN0dWFsbHkKICAgICAgICAgICAgICAgIC8vIGNoYW5naW5nIChuZWVkIHRvIGRvIHRoaXMgZGlmZikuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VzID0gdGhpcy5fZGlmZmVyLmRpZmYodGhpcy5fcmVuZGVyZWRJdGVtcyk7CiAgICAgICAgICAgICAgICBpZiAoIWNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVDb250ZXh0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBseUNoYW5nZXMoY2hhbmdlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0LmRldGFjaCgpOwogICAgICAgICAgICB0aGlzLl9kYXRhU291cmNlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX2RhdGFTb3VyY2VDaGFuZ2VzLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMudmlld0NoYW5nZS5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTsKICAgICAgICAgICAgZm9yIChsZXQgdmlldyBvZiB0aGlzLl90ZW1wbGF0ZUNhY2hlKSB7CiAgICAgICAgICAgICAgICB2aWV3LmRlc3Ryb3koKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWFjdCB0byBzY3JvbGwgc3RhdGUgY2hhbmdlcyBpbiB0aGUgdmlld3BvcnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vblJlbmRlcmVkRGF0YUNoYW5nZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9yZW5kZXJlZFJhbmdlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVuZGVyZWRJdGVtcyA9IHRoaXMuX2RhdGEuc2xpY2UodGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCwgdGhpcy5fcmVuZGVyZWRSYW5nZS5lbmQpOwogICAgICAgICAgICBpZiAoIXRoaXMuX2RpZmZlcikgewogICAgICAgICAgICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHRoaXMuX3JlbmRlcmVkSXRlbXMpLmNyZWF0ZSh0aGlzLmNka1ZpcnR1YWxGb3JUcmFja0J5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN3YXAgb3V0IG9uZSBgRGF0YVNvdXJjZWAgZm9yIGFub3RoZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG9sZERzCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdEcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoYW5nZURhdGFTb3VyY2Uob2xkRHMsIG5ld0RzKSB7CiAgICAgICAgICAgIGlmIChvbGREcykgewogICAgICAgICAgICAgICAgb2xkRHMuZGlzY29ubmVjdCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9uZWVkc1VwZGF0ZSA9IHRydWU7CiAgICAgICAgICAgIHJldHVybiBuZXdEcyA/IG5ld0RzLmNvbm5lY3QodGhpcykgOiBvZigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGUgdGhlIGBDZGtWaXJ0dWFsRm9yT2ZDb250ZXh0YCBmb3IgYWxsIHZpZXdzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlQ29udGV4dCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3VudCA9IHRoaXMuX2RhdGEubGVuZ3RoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5sZW5ndGg7CiAgICAgICAgICAgIHdoaWxlIChpLS0pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZ2V0KGkpKSk7CiAgICAgICAgICAgICAgICB2aWV3LmNvbnRleHQuaW5kZXggPSB0aGlzLl9yZW5kZXJlZFJhbmdlLnN0YXJ0ICsgaTsKICAgICAgICAgICAgICAgIHZpZXcuY29udGV4dC5jb3VudCA9IGNvdW50OwogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ29tcHV0ZWRDb250ZXh0UHJvcGVydGllcyh2aWV3LmNvbnRleHQpOwogICAgICAgICAgICAgICAgdmlldy5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbHkgY2hhbmdlcyB0byB0aGUgRE9NLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlDaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgLy8gUmVhcnJhbmdlIHRoZSB2aWV3cyB0byBwdXQgdGhlbSBpbiB0aGUgcmlnaHQgbG9jYXRpb24uCiAgICAgICAgICAgIGNoYW5nZXMuZm9yRWFjaE9wZXJhdGlvbigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVjb3JkCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWRqdXN0ZWRQcmV2aW91c0luZGV4CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudEluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVjb3JkLCBhZGp1c3RlZFByZXZpb3VzSW5kZXgsIGN1cnJlbnRJbmRleCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlY29yZC5wcmV2aW91c0luZGV4ID09IG51bGwpIHsgLy8gSXRlbSBhZGRlZC4KICAgICAgICAgICAgICAgICAgICAvLyBJdGVtIGFkZGVkLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gdGhpcy5faW5zZXJ0Vmlld0Zvck5ld0l0ZW0oKC8qKiBAdHlwZSB7P30gKi8gKGN1cnJlbnRJbmRleCkpKTsKICAgICAgICAgICAgICAgICAgICB2aWV3LmNvbnRleHQuJGltcGxpY2l0ID0gcmVjb3JkLml0ZW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJyZW50SW5kZXggPT0gbnVsbCkgeyAvLyBJdGVtIHJlbW92ZWQuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVWaWV3KHRoaXMuX2RldGFjaFZpZXcoKC8qKiBAdHlwZSB7P30gKi8gKGFkanVzdGVkUHJldmlvdXNJbmRleCkpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gSXRlbSBtb3ZlZC4KICAgICAgICAgICAgICAgICAgICAvLyBJdGVtIG1vdmVkLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2aWV3ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZ2V0KCgvKiogQHR5cGUgez99ICovIChhZGp1c3RlZFByZXZpb3VzSW5kZXgpKSkpKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmLm1vdmUodmlldywgY3VycmVudEluZGV4KTsKICAgICAgICAgICAgICAgICAgICB2aWV3LmNvbnRleHQuJGltcGxpY2l0ID0gcmVjb3JkLml0ZW07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gVXBkYXRlICRpbXBsaWNpdCBmb3IgYW55IGl0ZW1zIHRoYXQgaGFkIGFuIGlkZW50aXR5IGNoYW5nZS4KICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlY29yZCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldCgoLyoqIEB0eXBlIHs/fSAqLyAocmVjb3JkLmN1cnJlbnRJbmRleCkpKSkpOwogICAgICAgICAgICAgICAgdmlldy5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgY29udGV4dCB2YXJpYWJsZXMgb24gYWxsIGl0ZW1zLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvdW50ID0gdGhpcy5fZGF0YS5sZW5ndGg7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGkgPSB0aGlzLl92aWV3Q29udGFpbmVyUmVmLmxlbmd0aDsKICAgICAgICAgICAgd2hpbGUgKGktLSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmlldyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl92aWV3Q29udGFpbmVyUmVmLmdldChpKSkpOwogICAgICAgICAgICAgICAgdmlldy5jb250ZXh0LmluZGV4ID0gdGhpcy5fcmVuZGVyZWRSYW5nZS5zdGFydCArIGk7CiAgICAgICAgICAgICAgICB2aWV3LmNvbnRleHQuY291bnQgPSBjb3VudDsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbXB1dGVkQ29udGV4dFByb3BlcnRpZXModmlldy5jb250ZXh0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWNoZSB0aGUgZ2l2ZW4gZGV0YWNoZWQgdmlldy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmlldwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhY2hlVmlldyh2aWV3KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl90ZW1wbGF0ZUNhY2hlLmxlbmd0aCA8IHRoaXMuY2RrVmlydHVhbEZvclRlbXBsYXRlQ2FjaGVTaXplKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZUNhY2hlLnB1c2godmlldyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5kZXhPZih2aWV3KTsKICAgICAgICAgICAgICAgIC8vIEl0J3MgdmVyeSB1bmxpa2VseSB0aGF0IHRoZSBpbmRleCB3aWxsIGV2ZXIgYmUgLTEsIGJ1dCBqdXN0IGluIGNhc2UsCiAgICAgICAgICAgICAgICAvLyBkZXN0cm95IHRoZSB2aWV3IG9uIGl0cyBvd24sIG90aGVyd2lzZSBkZXN0cm95IGl0IHRocm91Z2ggdGhlCiAgICAgICAgICAgICAgICAvLyBjb250YWluZXIgdG8gZW5zdXJlIHRoYXQgYWxsIHRoZSByZWZlcmVuY2VzIGFyZSByZW1vdmVkLgogICAgICAgICAgICAgICAgaWYgKGluZGV4ID09PSAtMSkgewogICAgICAgICAgICAgICAgICAgIHZpZXcuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZi5yZW1vdmUoaW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEluc2VydHMgYSB2aWV3IGZvciBhIG5ldyBpdGVtLCBlaXRoZXIgZnJvbSB0aGUgY2FjaGUgb3IgYnkgY3JlYXRpbmcgYSBuZXcgb25lLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luc2VydFZpZXdGb3JOZXdJdGVtKGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbnNlcnRWaWV3RnJvbUNhY2hlKGluZGV4KSB8fCB0aGlzLl9jcmVhdGVFbWJlZGRlZFZpZXdBdChpbmRleCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgY29tcHV0ZWQgcHJvcGVydGllcyBvbiB0aGUgYENka1ZpcnR1YWxGb3JPZkNvbnRleHRgLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250ZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlQ29tcHV0ZWRDb250ZXh0UHJvcGVydGllcyhjb250ZXh0KSB7CiAgICAgICAgICAgIGNvbnRleHQuZmlyc3QgPSBjb250ZXh0LmluZGV4ID09PSAwOwogICAgICAgICAgICBjb250ZXh0Lmxhc3QgPSBjb250ZXh0LmluZGV4ID09PSBjb250ZXh0LmNvdW50IC0gMTsKICAgICAgICAgICAgY29udGV4dC5ldmVuID0gY29udGV4dC5pbmRleCAlIDIgPT09IDA7CiAgICAgICAgICAgIGNvbnRleHQub2RkID0gIWNvbnRleHQuZXZlbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBlbWJlZGRlZCB2aWV3IGFuZCBtb3ZlcyBpdCB0byB0aGUgZ2l2ZW4gaW5kZXgKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVFbWJlZGRlZFZpZXdBdChpbmRleCkgewogICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBpbXBvcnRhbnQgdGhhdCB3ZSBpbnNlcnQgdGhlIGl0ZW0gZGlyZWN0bHkgYXQgdGhlIHByb3BlciBpbmRleCwKICAgICAgICAgICAgLy8gcmF0aGVyIHRoYW4gaW5zZXJ0aW5nIGl0IGFuZCB0aGUgbW92aW5nIGl0IGluIHBsYWNlLCBiZWNhdXNlIGlmIHRoZXJlJ3MgYSBkaXJlY3RpdmUKICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgbm9kZSB0aGF0IGluamVjdHMgdGhlIGBWaWV3Q29udGFpbmVyUmVmYCwgQW5ndWxhciB3aWxsIGluc2VydCBhbm90aGVyCiAgICAgICAgICAgIC8vIGNvbW1lbnQgbm9kZSB3aGljaCBjYW4gdGhyb3cgb2ZmIHRoZSBtb3ZlIHdoZW4gaXQncyBiZWluZyByZXBlYXRlZCBmb3IgYWxsIGl0ZW1zLgogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5fdGVtcGxhdGUsIHsKICAgICAgICAgICAgICAgICRpbXBsaWNpdDogKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwKICAgICAgICAgICAgICAgIC8vIEl0J3MgZ3VhcmFudGVlZCB0aGF0IHRoZSBpdGVyYWJsZSBpcyBub3QgInVuZGVmaW5lZCIgb3IgIm51bGwiIGJlY2F1c2Ugd2Ugb25seQogICAgICAgICAgICAgICAgLy8gZ2VuZXJhdGUgdmlld3MgZm9yIGVsZW1lbnRzIGlmIHRoZSAiY2RrVmlydHVhbEZvck9mIiBpdGVyYWJsZSBoYXMgZWxlbWVudHMuCiAgICAgICAgICAgICAgICBjZGtWaXJ0dWFsRm9yT2Y6ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9jZGtWaXJ0dWFsRm9yT2YpKSwKICAgICAgICAgICAgICAgIGluZGV4OiAtMSwKICAgICAgICAgICAgICAgIGNvdW50OiAtMSwKICAgICAgICAgICAgICAgIGZpcnN0OiBmYWxzZSwKICAgICAgICAgICAgICAgIGxhc3Q6IGZhbHNlLAogICAgICAgICAgICAgICAgb2RkOiBmYWxzZSwKICAgICAgICAgICAgICAgIGV2ZW46IGZhbHNlCiAgICAgICAgICAgIH0sIGluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0cyBhIHJlY3ljbGVkIHZpZXcgZnJvbSB0aGUgY2FjaGUgYXQgdGhlIGdpdmVuIGluZGV4LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luc2VydFZpZXdGcm9tQ2FjaGUoaW5kZXgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYWNoZWRWaWV3ID0gdGhpcy5fdGVtcGxhdGVDYWNoZS5wb3AoKTsKICAgICAgICAgICAgaWYgKGNhY2hlZFZpZXcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXJSZWYuaW5zZXJ0KGNhY2hlZFZpZXcsIGluZGV4KTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY2FjaGVkVmlldyB8fCBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyB0aGUgZW1iZWRkZWQgdmlldyBhdCB0aGUgZ2l2ZW4gaW5kZXguCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZGV0YWNoVmlldyhpbmRleCkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3ZpZXdDb250YWluZXJSZWYuZGV0YWNoKGluZGV4KSkpOwogICAgICAgIH0KICAgIH0KICAgIENka1ZpcnR1YWxGb3JPZi7JtWZhYyA9IGZ1bmN0aW9uIENka1ZpcnR1YWxGb3JPZl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtWaXJ0dWFsRm9yT2YpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEl0ZXJhYmxlRGlmZmVycyksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCA0KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpKTsgfTsKICAgIENka1ZpcnR1YWxGb3JPZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtWaXJ0dWFsRm9yT2YsIHNlbGVjdG9yczogW1siIiwgImNka1ZpcnR1YWxGb3IiLCAiIiwgImNka1ZpcnR1YWxGb3JPZiIsICIiXV0sIGlucHV0czogeyBjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemU6ICJjZGtWaXJ0dWFsRm9yVGVtcGxhdGVDYWNoZVNpemUiLCBjZGtWaXJ0dWFsRm9yT2Y6ICJjZGtWaXJ0dWFsRm9yT2YiLCBjZGtWaXJ0dWFsRm9yVHJhY2tCeTogImNka1ZpcnR1YWxGb3JUcmFja0J5IiwgY2RrVmlydHVhbEZvclRlbXBsYXRlOiAiY2RrVmlydHVhbEZvclRlbXBsYXRlIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtWaXJ0dWFsRm9yT2YuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICAgICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9LAogICAgICAgIHsgdHlwZTogSXRlcmFibGVEaWZmZXJzIH0sCiAgICAgICAgeyB0eXBlOiBDZGtWaXJ0dWFsU2Nyb2xsVmlld3BvcnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IFNraXBTZWxmIH1dIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfQogICAgXTsKICAgIENka1ZpcnR1YWxGb3JPZi5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjZGtWaXJ0dWFsRm9yT2Y6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNka1ZpcnR1YWxGb3JUcmFja0J5OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjZGtWaXJ0dWFsRm9yVGVtcGxhdGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNka1ZpcnR1YWxGb3JUZW1wbGF0ZUNhY2hlU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3Njcm9sbGluZy9zY3JvbGxpbmctbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIENka1Njcm9sbGFibGVNb2R1bGUgewogICAgfQogICAgQ2RrU2Nyb2xsYWJsZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IENka1Njcm9sbGFibGVNb2R1bGUgfSk7CiAgICBDZGtTY3JvbGxhYmxlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQ2RrU2Nyb2xsYWJsZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtTY3JvbGxhYmxlTW9kdWxlKSgpOyB9IH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQ2RrU2Nyb2xsYWJsZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtDZGtTY3JvbGxhYmxlXSwgZXhwb3J0czogW0Nka1Njcm9sbGFibGVdIH0pOyB9KSgpOwogICAgY2xhc3MgU2Nyb2xsaW5nTW9kdWxlIHsKICAgIH0KICAgIFNjcm9sbGluZ01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFNjcm9sbGluZ01vZHVsZSB9KTsKICAgIFNjcm9sbGluZ01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNjcm9sbGluZ01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTY3JvbGxpbmdNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBCaWRpTW9kdWxlLAogICAgICAgICAgICAgICAgUGxhdGZvcm1Nb2R1bGUsCiAgICAgICAgICAgICAgICBDZGtTY3JvbGxhYmxlTW9kdWxlCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIEJpZGlNb2R1bGUsCiAgICAgICAgICAgIENka1Njcm9sbGFibGVNb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU2Nyb2xsaW5nTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0Nka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwsCiAgICAgICAgICAgIENka1ZpcnR1YWxGb3JPZiwKICAgICAgICAgICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0XTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0JpZGlNb2R1bGUsCiAgICAgICAgICAgIFBsYXRmb3JtTW9kdWxlLAogICAgICAgICAgICBDZGtTY3JvbGxhYmxlTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0JpZGlNb2R1bGUsCiAgICAgICAgICAgIENka1Njcm9sbGFibGVNb2R1bGUsCiAgICAgICAgICAgIENka0ZpeGVkU2l6ZVZpcnR1YWxTY3JvbGwsCiAgICAgICAgICAgIENka1ZpcnR1YWxGb3JPZiwKICAgICAgICAgICAgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0XTsgfSB9KTsgfSkoKTsKCiAgICBmdW5jdGlvbiBNYXRUYWJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1cHJvamVjdGlvbigwKTsKICAgIH0gfQogICAgY29uc3QgX2MwJDMgPSBbIioiXTsKICAgIGZ1bmN0aW9uIE1hdFRhYkJvZHlfbmdfdGVtcGxhdGVfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IH0KICAgIGNvbnN0IF9jMSQzID0gZnVuY3Rpb24gKGEwKSB7IHJldHVybiB7IGFuaW1hdGlvbkR1cmF0aW9uOiBhMCB9OyB9OwogICAgY29uc3QgX2MyJDEgPSBmdW5jdGlvbiAoYTAsIGExKSB7IHJldHVybiB7IHZhbHVlOiBhMCwgcGFyYW1zOiBhMSB9OyB9OwogICAgY29uc3QgX2MzID0gWyJ0YWJCb2R5V3JhcHBlciJdOwogICAgY29uc3QgX2M0ID0gWyJ0YWJIZWFkZXIiXTsKICAgIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX2Rpdl8yX25nX3RlbXBsYXRlXzJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IH0KICAgIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX2Rpdl8yX25nX3RlbXBsYXRlXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXRlbXBsYXRlKDAsIE1hdFRhYkdyb3VwX2Rpdl8yX25nX3RlbXBsYXRlXzJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZSwgMCwgMCwgIm5nLXRlbXBsYXRlIiwgOSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCB0YWJfcjQgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtXByb3BlcnR5KCJjZGtQb3J0YWxPdXRsZXQiLCB0YWJfcjQudGVtcGxhdGVMYWJlbCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX2Rpdl8yX25nX3RlbXBsYXRlXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXRleHQoMCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCB0YWJfcjQgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZSh0YWJfcjQudGV4dExhYmVsKTsKICAgIH0gfQogICAgZnVuY3Rpb24gTWF0VGFiR3JvdXBfZGl2XzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IxMiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDYpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRUYWJHcm91cF9kaXZfMl9UZW1wbGF0ZV9kaXZfY2xpY2tfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTIpOyBjb25zdCB0YWJfcjQgPSBjdHguJGltcGxpY2l0OyBjb25zdCBpX3I1ID0gY3R4LmluZGV4OyBjb25zdCBjdHhfcjExID0gybXJtW5leHRDb250ZXh0KCk7IGNvbnN0IF9yMCA9IMm1ybVyZWZlcmVuY2UoMSk7IHJldHVybiBjdHhfcjExLl9oYW5kbGVDbGljayh0YWJfcjQsIF9yMCwgaV9yNSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDcpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBNYXRUYWJHcm91cF9kaXZfMl9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlLCAxLCAxLCAibmctdGVtcGxhdGUiLCA4KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMywgTWF0VGFiR3JvdXBfZGl2XzJfbmdfdGVtcGxhdGVfM19UZW1wbGF0ZSwgMSwgMSwgIm5nLXRlbXBsYXRlIiwgOCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgdGFiX3I0ID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBpX3I1ID0gY3R4LmluZGV4OwogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10YWItbGFiZWwtYWN0aXZlIiwgY3R4X3IxLnNlbGVjdGVkSW5kZXggPT0gaV9yNSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJpZCIsIGN0eF9yMS5fZ2V0VGFiTGFiZWxJZChpX3I1KSkoImRpc2FibGVkIiwgdGFiX3I0LmRpc2FibGVkKSgibWF0UmlwcGxlRGlzYWJsZWQiLCB0YWJfcjQuZGlzYWJsZWQgfHwgY3R4X3IxLmRpc2FibGVSaXBwbGUpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoInRhYkluZGV4IiwgY3R4X3IxLl9nZXRUYWJJbmRleCh0YWJfcjQsIGlfcjUpKSgiYXJpYS1wb3NpbnNldCIsIGlfcjUgKyAxKSgiYXJpYS1zZXRzaXplIiwgY3R4X3IxLl90YWJzLmxlbmd0aCkoImFyaWEtY29udHJvbHMiLCBjdHhfcjEuX2dldFRhYkNvbnRlbnRJZChpX3I1KSkoImFyaWEtc2VsZWN0ZWQiLCBjdHhfcjEuc2VsZWN0ZWRJbmRleCA9PSBpX3I1KSgiYXJpYS1sYWJlbCIsIHRhYl9yNC5hcmlhTGFiZWwgfHwgbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsICF0YWJfcjQuYXJpYUxhYmVsICYmIHRhYl9yNC5hcmlhTGFiZWxsZWRieSA/IHRhYl9yNC5hcmlhTGFiZWxsZWRieSA6IG51bGwpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIHRhYl9yNC50ZW1wbGF0ZUxhYmVsKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhdGFiX3I0LnRlbXBsYXRlTGFiZWwpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRUYWJHcm91cF9tYXRfdGFiX2JvZHlfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjE2ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXRhYi1ib2R5IiwgMTApOwogICAgICAgIMm1ybVsaXN0ZW5lcigiX29uQ2VudGVyZWQiLCBmdW5jdGlvbiBNYXRUYWJHcm91cF9tYXRfdGFiX2JvZHlfNV9UZW1wbGF0ZV9tYXRfdGFiX2JvZHlfX29uQ2VudGVyZWRfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTYpOyBjb25zdCBjdHhfcjE1ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjE1Ll9yZW1vdmVUYWJCb2R5V3JhcHBlckhlaWdodCgpOyB9KSgiX29uQ2VudGVyaW5nIiwgZnVuY3Rpb24gTWF0VGFiR3JvdXBfbWF0X3RhYl9ib2R5XzVfVGVtcGxhdGVfbWF0X3RhYl9ib2R5X19vbkNlbnRlcmluZ18wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxNik7IGNvbnN0IGN0eF9yMTcgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTcuX3NldFRhYkJvZHlXcmFwcGVySGVpZ2h0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCB0YWJfcjEzID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBpX3IxNCA9IGN0eC5pbmRleDsKICAgICAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtdGFiLWJvZHktYWN0aXZlIiwgY3R4X3IzLnNlbGVjdGVkSW5kZXggPT0gaV9yMTQpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiaWQiLCBjdHhfcjMuX2dldFRhYkNvbnRlbnRJZChpX3IxNCkpKCJjb250ZW50IiwgdGFiX3IxMy5jb250ZW50KSgicG9zaXRpb24iLCB0YWJfcjEzLnBvc2l0aW9uKSgib3JpZ2luIiwgdGFiX3IxMy5vcmlnaW4pKCJhbmltYXRpb25EdXJhdGlvbiIsIGN0eF9yMy5hbmltYXRpb25EdXJhdGlvbik7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1sYWJlbGxlZGJ5IiwgY3R4X3IzLl9nZXRUYWJMYWJlbElkKGlfcjE0KSk7CiAgICB9IH0KICAgIGNvbnN0IF9jNSA9IFsidGFiTGlzdENvbnRhaW5lciJdOwogICAgY29uc3QgX2M2ID0gWyJ0YWJMaXN0Il07CiAgICBjb25zdCBfYzcgPSBbIm5leHRQYWdpbmF0b3IiXTsKICAgIGNvbnN0IF9jOCA9IFsicHJldmlvdXNQYWdpbmF0b3IiXTsKICAgIGNvbnN0IF9jOSA9IFsibWF0LXRhYi1uYXYtYmFyIiwgIiJdOwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gZm9yIHRoZSBNYXRJbmtCYXIncyBQb3NpdGlvbmVyLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IF9NQVRfSU5LX0JBUl9QT1NJVElPTkVSID0gbmV3IEluamVjdGlvblRva2VuKCdNYXRJbmtCYXJQb3NpdGlvbmVyJywgewogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiBfTUFUX0lOS19CQVJfUE9TSVRJT05FUl9GQUNUT1JZCiAgICB9KTsKICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgcG9zaXRpb25lciBmdW5jdGlvbiBmb3IgdGhlIE1hdElua0Jhci4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfTUFUX0lOS19CQVJfUE9TSVRJT05FUl9GQUNUT1JZKCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtZXRob2QgPSAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZWxlbWVudCkgPT4gKHsKICAgICAgICAgICAgbGVmdDogZWxlbWVudCA/IChlbGVtZW50Lm9mZnNldExlZnQgfHwgMCkgKyAncHgnIDogJzAnLAogICAgICAgICAgICB3aWR0aDogZWxlbWVudCA/IChlbGVtZW50Lm9mZnNldFdpZHRoIHx8IDApICsgJ3B4JyA6ICcwJywKICAgICAgICB9KSk7CiAgICAgICAgcmV0dXJuIG1ldGhvZDsKICAgIH0KICAgIC8qKgogICAgICogVGhlIGluay1iYXIgaXMgdXNlZCB0byBkaXNwbGF5IGFuZCBhbmltYXRlIHRoZSBsaW5lIHVuZGVybmVhdGggdGhlIGN1cnJlbnQgYWN0aXZlIHRhYiBsYWJlbC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdElua0JhciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2lua0JhclBvc2l0aW9uZXIKICAgICAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfbmdab25lLCBfaW5rQmFyUG9zaXRpb25lciwgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9pbmtCYXJQb3NpdGlvbmVyID0gX2lua0JhclBvc2l0aW9uZXI7CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbk1vZGUgPSBfYW5pbWF0aW9uTW9kZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsY3VsYXRlcyB0aGUgc3R5bGVzIGZyb20gdGhlIHByb3ZpZGVkIGVsZW1lbnQgaW4gb3JkZXIgdG8gYWxpZ24gdGhlIGluay1iYXIgdG8gdGhhdCBlbGVtZW50LgogICAgICAgICAqIFNob3dzIHRoZSBpbmsgYmFyIGlmIHByZXZpb3VzbHkgc2V0IGFzIGhpZGRlbi4KICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFsaWduVG9FbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5zaG93KCk7CiAgICAgICAgICAgIGlmICh0eXBlb2YgcmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2V0U3R5bGVzKGVsZW1lbnQpKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRTdHlsZXMoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIGluayBiYXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzaG93KCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGlkZXMgdGhlIGluayBiYXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoaWRlKCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBwcm9wZXIgc3R5bGVzIHRvIHRoZSBpbmsgYmFyIGVsZW1lbnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRTdHlsZXMoZWxlbWVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IHRoaXMuX2lua0JhclBvc2l0aW9uZXIoZWxlbWVudCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5rQmFyID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICBpbmtCYXIuc3R5bGUubGVmdCA9IHBvc2l0aW9ucy5sZWZ0OwogICAgICAgICAgICBpbmtCYXIuc3R5bGUud2lkdGggPSBwb3NpdGlvbnMud2lkdGg7CiAgICAgICAgfQogICAgfQogICAgTWF0SW5rQmFyLsm1ZmFjID0gZnVuY3Rpb24gTWF0SW5rQmFyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdElua0JhcikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KF9NQVRfSU5LX0JBUl9QT1NJVElPTkVSKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKICAgIE1hdElua0Jhci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRJbmtCYXIsIHNlbGVjdG9yczogW1sibWF0LWluay1iYXIiXV0sIGhvc3RBdHRyczogWzEsICJtYXQtaW5rLWJhciJdLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRJbmtCYXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICAgICAgfSB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRJbmtCYXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbX01BVF9JTktfQkFSX1BPU0lUSU9ORVIsXSB9XSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWItY29udGVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIERlY29yYXRlcyB0aGUgYG5nLXRlbXBsYXRlYCB0YWdzIGFuZCByZWFkcyBvdXQgdGhlIHRlbXBsYXRlIGZyb20gaXQuCiAgICAgKi8KICAgIGNsYXNzIE1hdFRhYkNvbnRlbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSkgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgfQogICAgfQogICAgTWF0VGFiQ29udGVudC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYkNvbnRlbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0VGFiQ29udGVudCkoybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZikpOyB9OwogICAgTWF0VGFiQ29udGVudC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRUYWJDb250ZW50LCBzZWxlY3RvcnM6IFtbIiIsICJtYXRUYWJDb250ZW50IiwgIiJdXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0VGFiQ29udGVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWItbGFiZWwudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBVc2VkIHRvIGZsYWcgdGFiIGxhYmVscyBmb3IgdXNlIHdpdGggdGhlIHBvcnRhbCBkaXJlY3RpdmUKICAgICAqLwogICAgY2xhc3MgTWF0VGFiTGFiZWwgZXh0ZW5kcyBDZGtQb3J0YWwgewogICAgfQogICAgTWF0VGFiTGFiZWwuybVmYWMgPSBmdW5jdGlvbiBNYXRUYWJMYWJlbF9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0VGFiTGFiZWxfQmFzZUZhY3RvcnkodCB8fCBNYXRUYWJMYWJlbCk7IH07CiAgICBNYXRUYWJMYWJlbC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRUYWJMYWJlbCwgc2VsZWN0b3JzOiBbWyIiLCAibWF0LXRhYi1sYWJlbCIsICIiXSwgWyIiLCAibWF0VGFiTGFiZWwiLCAiIl1dLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgY29uc3QgybVNYXRUYWJMYWJlbF9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdFRhYkxhYmVsKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdFRhYi4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0VGFiQmFzZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0VGFiTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlZChNYXRUYWJCYXNlKTsKICAgIC8qKgogICAgICogVXNlZCB0byBwcm92aWRlIGEgdGFiIGdyb3VwIHRvIGEgdGFiIHdpdGhvdXQgY2F1c2luZyBhIGNpcmN1bGFyIGRlcGVuZGVuY3kuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9UQUJfR1JPVVAgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01BVF9UQUJfR1JPVVAnKTsKICAgIGNsYXNzIE1hdFRhYiBleHRlbmRzIF9NYXRUYWJNaXhpbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAgICAgKiBAcGFyYW0gez89fSBfY2xvc2VzdFRhYkdyb3VwCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZpZXdDb250YWluZXJSZWYsIF9jbG9zZXN0VGFiR3JvdXApIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICB0aGlzLl9jbG9zZXN0VGFiR3JvdXAgPSBfY2xvc2VzdFRhYkdyb3VwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUGxhaW4gdGV4dCBsYWJlbCBmb3IgdGhlIHRhYiwgdXNlZCB3aGVuIHRoZXJlIGlzIG5vIHRlbXBsYXRlIGxhYmVsLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy50ZXh0TGFiZWwgPSAnJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFBvcnRhbCB0aGF0IHdpbGwgYmUgdGhlIGhvc3RlZCBjb250ZW50IG9mIHRoZSB0YWIKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NvbnRlbnRQb3J0YWwgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIGludGVybmFsIHN0YXRlIG9mIHRoZSB0YWIgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgcmVsYXRpdmVseSBpbmRleGVkIHBvc2l0aW9uIHdoZXJlIDAgcmVwcmVzZW50cyB0aGUgY2VudGVyLCBuZWdhdGl2ZSBpcyBsZWZ0LCBhbmQgcG9zaXRpdmUKICAgICAgICAgICAgICogcmVwcmVzZW50cyB0aGUgcmlnaHQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBpbml0aWFsIHJlbGF0aXZlbHkgaW5kZXggb3JpZ2luIG9mIHRoZSB0YWIgaWYgaXQgd2FzIGNyZWF0ZWQgYW5kIHNlbGVjdGVkIGFmdGVyIHRoZXJlCiAgICAgICAgICAgICAqIHdhcyBhbHJlYWR5IGEgc2VsZWN0ZWQgdGFiLiBQcm92aWRlcyBjb250ZXh0IG9mIHdoYXQgcG9zaXRpb24gdGhlIHRhYiBzaG91bGQgb3JpZ2luYXRlIGZyb20uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9yaWdpbiA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSB0YWIgaXMgY3VycmVudGx5IGFjdGl2ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaXNBY3RpdmUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29udGVudCBmb3IgdGhlIHRhYiBsYWJlbCBnaXZlbiBieSBgPG5nLXRlbXBsYXRlIG1hdC10YWItbGFiZWw+YC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0ZW1wbGF0ZUxhYmVsKCkgeyByZXR1cm4gdGhpcy5fdGVtcGxhdGVMYWJlbDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0ZW1wbGF0ZUxhYmVsKHZhbHVlKSB7CiAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSB0ZW1wbGF0ZUxhYmVsIHZpYSBxdWVyeSBpZiB0aGVyZSBpcyBhY3R1YWxseQogICAgICAgICAgICAvLyBhIE1hdFRhYkxhYmVsIGZvdW5kLiBUaGlzIHdvcmtzIGFyb3VuZCBhbiBpc3N1ZSB3aGVyZSBhIHVzZXIgbWF5IGhhdmUKICAgICAgICAgICAgLy8gbWFudWFsbHkgc2V0IGB0ZW1wbGF0ZUxhYmVsYCBkdXJpbmcgY3JlYXRpb24gbW9kZSwgd2hpY2ggd291bGQgdGhlbiBnZXQgY2xvYmJlcmVkCiAgICAgICAgICAgIC8vIGJ5IGB1bmRlZmluZWRgIHdoZW4gdGhpcyBxdWVyeSByZXNvbHZlcy4KICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90ZW1wbGF0ZUxhYmVsID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250ZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudFBvcnRhbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCd0ZXh0TGFiZWwnKSB8fCBjaGFuZ2VzLmhhc093blByb3BlcnR5KCdkaXNhYmxlZCcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLl9jb250ZW50UG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuX2V4cGxpY2l0Q29udGVudCB8fCB0aGlzLl9pbXBsaWNpdENvbnRlbnQsIHRoaXMuX3ZpZXdDb250YWluZXJSZWYpOwogICAgICAgIH0KICAgIH0KICAgIE1hdFRhYi7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWIpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1RBQl9HUk9VUCwgOCkpOyB9OwogICAgTWF0VGFiLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFRhYiwgc2VsZWN0b3JzOiBbWyJtYXQtdGFiIl1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0VGFiX0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0VGFiTGFiZWwsIHRydWUpOwogICAgICAgICAgICDJtcm1c3RhdGljQ29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRUYWJDb250ZW50LCB0cnVlLCBUZW1wbGF0ZVJlZik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC50ZW1wbGF0ZUxhYmVsID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9leHBsaWNpdENvbnRlbnQgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCB2aWV3UXVlcnk6IGZ1bmN0aW9uIE1hdFRhYl9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShUZW1wbGF0ZVJlZiwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW1wbGljaXRDb250ZW50ID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCB0ZXh0TGFiZWw6IFsibGFiZWwiLCAidGV4dExhYmVsIl0sIGFyaWFMYWJlbDogWyJhcmlhLWxhYmVsIiwgImFyaWFMYWJlbCJdLCBhcmlhTGFiZWxsZWRieTogWyJhcmlhLWxhYmVsbGVkYnkiLCAiYXJpYUxhYmVsbGVkYnkiXSB9LCBleHBvcnRBczogWyJtYXRUYWIiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzAkMywgZGVjbHM6IDEsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRUYWJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgwLCBNYXRUYWJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZSwgMSwgMCwgIm5nLXRlbXBsYXRlIik7CiAgICAgICAgfSB9LCBlbmNhcHN1bGF0aW9uOiAyIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRUYWIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1RBQl9HUk9VUCxdIH1dIH0KICAgIF07CiAgICBNYXRUYWIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdGVtcGxhdGVMYWJlbDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0VGFiTGFiZWwsXSB9XSwKICAgICAgICBfZXhwbGljaXRDb250ZW50OiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNYXRUYWJDb250ZW50LCB7IHJlYWQ6IFRlbXBsYXRlUmVmLCBzdGF0aWM6IHRydWUgfSxdIH1dLAogICAgICAgIF9pbXBsaWNpdENvbnRlbnQ6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1RlbXBsYXRlUmVmLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgdGV4dExhYmVsOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydsYWJlbCcsXSB9XSwKICAgICAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICAgICAgYXJpYUxhYmVsbGVkYnk6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWxsZWRieScsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYnMtYW5pbWF0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuaW1hdGlvbnMgdXNlZCBieSB0aGUgTWF0ZXJpYWwgdGFicy4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgbWF0VGFic0FuaW1hdGlvbnMgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQW5pbWF0aW9uIHRyYW5zbGF0ZXMgYSB0YWIgYWxvbmcgdGhlIFggYXhpcy4KICAgICAgICAgKi8KICAgICAgICB0cmFuc2xhdGVUYWI6IHRyaWdnZXIoJ3RyYW5zbGF0ZVRhYicsIFsKICAgICAgICAgICAgLy8gTm90ZTogdHJhbnNpdGlvbnMgdG8gYG5vbmVgIGluc3RlYWQgb2YgMCwgYmVjYXVzZSBzb21lIGJyb3dzZXJzIG1pZ2h0IGJsdXIgdGhlIGNvbnRlbnQuCiAgICAgICAgICAgIHN0YXRlKCdjZW50ZXIsIHZvaWQsIGxlZnQtb3JpZ2luLWNlbnRlciwgcmlnaHQtb3JpZ2luLWNlbnRlcicsIHN0eWxlKHsgdHJhbnNmb3JtOiAnbm9uZScgfSkpLAogICAgICAgICAgICAvLyBJZiB0aGUgdGFiIGlzIGVpdGhlciBvbiB0aGUgbGVmdCBvciByaWdodCwgd2UgYWRkaXRpb25hbGx5IGFkZCBhIGBtaW4taGVpZ2h0YCBvZiAxcHgKICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gZW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGEgaGVpZ2h0IGJlZm9yZSBpdHMgc3RhdGUgY2hhbmdlcy4gVGhpcyBpcwogICAgICAgICAgICAvLyBuZWNlc3NhcnkgYmVjYXVzZSBDaHJvbWUgZG9lcyBzZWVtIHRvIHNraXAgdGhlIHRyYW5zaXRpb24gaW4gUlRMIG1vZGUgaWYgdGhlIGVsZW1lbnQgZG9lcwogICAgICAgICAgICAvLyBub3QgaGF2ZSBhIHN0YXRpYyBoZWlnaHQgYW5kIGlzIG5vdCByZW5kZXJlZC4gU2VlIHJlbGF0ZWQgaXNzdWU6ICM5NDY1CiAgICAgICAgICAgIHN0YXRlKCdsZWZ0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgtMTAwJSwgMCwgMCknLCBtaW5IZWlnaHQ6ICcxcHgnIH0pKSwKICAgICAgICAgICAgc3RhdGUoJ3JpZ2h0Jywgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScsIG1pbkhlaWdodDogJzFweCcgfSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IGxlZnQsICogPT4gcmlnaHQsIGxlZnQgPT4gY2VudGVyLCByaWdodCA9PiBjZW50ZXInLCBhbmltYXRlKCd7e2FuaW1hdGlvbkR1cmF0aW9ufX0gY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJykpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGxlZnQtb3JpZ2luLWNlbnRlcicsIFsKICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlM2QoLTEwMCUsIDAsIDApJyB9KSwKICAgICAgICAgICAgICAgIGFuaW1hdGUoJ3t7YW5pbWF0aW9uRHVyYXRpb259fSBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSknKQogICAgICAgICAgICBdKSwKICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiByaWdodC1vcmlnaW4tY2VudGVyJywgWwogICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGUzZCgxMDAlLCAwLCAwKScgfSksCiAgICAgICAgICAgICAgICBhbmltYXRlKCd7e2FuaW1hdGlvbkR1cmF0aW9ufX0gY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpJykKICAgICAgICAgICAgXSkKICAgICAgICBdKQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1ib2R5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhlIHBvcnRhbCBob3N0IGRpcmVjdGl2ZSBmb3IgdGhlIGNvbnRlbnRzIG9mIHRoZSB0YWIuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRUYWJCb2R5UG9ydGFsIGV4dGVuZHMgQ2RrUG9ydGFsT3V0bGV0IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2hvc3QKICAgICAgICAgKiBAcGFyYW0gez89fSBfZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHZpZXdDb250YWluZXJSZWYsIF9ob3N0LCAKICAgICAgICAvKioKICAgICAgICAgKiBAZGVwcmVjYXRlZCBgX2RvY3VtZW50YCBwYXJhbWV0ZXIgdG8gYmUgbWFkZSByZXF1aXJlZC4KICAgICAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDkuMC4wCiAgICAgICAgICovCiAgICAgICAgX2RvY3VtZW50KSB7CiAgICAgICAgICAgIHN1cGVyKGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgdmlld0NvbnRhaW5lclJlZiwgX2RvY3VtZW50KTsKICAgICAgICAgICAgdGhpcy5faG9zdCA9IF9ob3N0OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIGV2ZW50cyBmb3Igd2hlbiB0aGUgdGFiIGJvZHkgYmVnaW5zIGNlbnRlcmluZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NlbnRlcmluZ1N1YiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YnNjcmlwdGlvbiB0byBldmVudHMgZm9yIHdoZW4gdGhlIHRhYiBib2R5IGZpbmlzaGVzIGxlYXZpbmcgZnJvbSBjZW50ZXIgcG9zaXRpb24uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9sZWF2aW5nU3ViID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXQgaW5pdGlhbCB2aXNpYmlsaXR5IG9yIHNldCB1cCBzdWJzY3JpcHRpb24gZm9yIGNoYW5naW5nIHZpc2liaWxpdHkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgc3VwZXIubmdPbkluaXQoKTsKICAgICAgICAgICAgdGhpcy5fY2VudGVyaW5nU3ViID0gdGhpcy5faG9zdC5fYmVmb3JlQ2VudGVyaW5nCiAgICAgICAgICAgICAgICAucGlwZShzdGFydFdpdGgodGhpcy5faG9zdC5faXNDZW50ZXJQb3NpdGlvbih0aGlzLl9ob3N0Ll9wb3NpdGlvbikpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXNDZW50ZXJpbmcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpc0NlbnRlcmluZykgPT4gewogICAgICAgICAgICAgICAgaWYgKGlzQ2VudGVyaW5nICYmICF0aGlzLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dGFjaCh0aGlzLl9ob3N0Ll9jb250ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl9sZWF2aW5nU3ViID0gdGhpcy5faG9zdC5fYWZ0ZXJMZWF2aW5nQ2VudGVyLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmRldGFjaCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFuIHVwIGNlbnRlcmluZyBzdWJzY3JpcHRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgc3VwZXIubmdPbkRlc3Ryb3koKTsKICAgICAgICAgICAgdGhpcy5fY2VudGVyaW5nU3ViLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX2xlYXZpbmdTdWIudW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRUYWJCb2R5UG9ydGFsLsm1ZmFjID0gZnVuY3Rpb24gTWF0VGFiQm9keVBvcnRhbF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWJCb2R5UG9ydGFsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoZm9yd2FyZFJlZigoIC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovKCkgPT4gTWF0VGFiQm9keSkpKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICBNYXRUYWJCb2R5UG9ydGFsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFRhYkJvZHlQb3J0YWwsIHNlbGVjdG9yczogW1siIiwgIm1hdFRhYkJvZHlIb3N0IiwgIiJdXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0VGFiQm9keVBvcnRhbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9LAogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgICAgIHsgdHlwZTogTWF0VGFiQm9keSwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoKSA9PiBNYXRUYWJCb2R5KSksXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKgogICAgICogQmFzZSBjbGFzcyB3aXRoIGFsbCBvZiB0aGUgYE1hdFRhYkJvZHlgIGZ1bmN0aW9uYWxpdHkuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lCiAgICBjbGFzcyBfTWF0VGFiQm9keUJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9kaXIKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9kaXIsIGNoYW5nZURldGVjdG9yUmVmKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YnNjcmlwdGlvbiB0byB0aGUgZGlyZWN0aW9uYWxpdHkgY2hhbmdlIG9ic2VydmFibGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuIGFuIGFuaW1hdGlvbiBvbiB0aGUgdGFiIGlzIGNvbXBsZXRlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlVGFiQ29tcGxldGUgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSB0YWIgYmVnaW5zIHRvIGFuaW1hdGUgdG93YXJkcyB0aGUgY2VudGVyIGFzIHRoZSBhY3RpdmUgdGFiLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25DZW50ZXJpbmcgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIGJlZm9yZSB0aGUgY2VudGVyaW5nIG9mIHRoZSB0YWIgYmVnaW5zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fYmVmb3JlQ2VudGVyaW5nID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCBiZWZvcmUgdGhlIGNlbnRlcmluZyBvZiB0aGUgdGFiIGJlZ2lucy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2FmdGVyTGVhdmluZ0NlbnRlciA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgdGFiIGNvbXBsZXRlcyBpdHMgYW5pbWF0aW9uIHRvd2FyZHMgdGhlIGNlbnRlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX29uQ2VudGVyZWQgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpOwogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgd2lsbCBhbHdheXMgYmUgb3ZlcndyaXR0ZW4gYnkgYE1hdFRhYkJvZHlgLCBidXQgd2UgbmVlZCBvbmUKICAgICAgICAgICAgLy8gYW55d2F5IHRvIHByZXZlbnQgdGhlIGFuaW1hdGlvbnMgbW9kdWxlIGZyb20gdGhyb3dpbmcgYW4gZXJyb3IgaWYgdGhlIGJvZHkgaXMgdXNlZCBvbiBpdHMgb3duLgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRHVyYXRpb24gZm9yIHRoZSB0YWIncyBhbmltYXRpb24uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkR1cmF0aW9uID0gJzUwMG1zJzsKICAgICAgICAgICAgaWYgKF9kaXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbiA9IF9kaXIuY2hhbmdlLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGRpcikgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NvbXB1dGVQb3NpdGlvbkFuaW1hdGlvblN0YXRlKGRpcik7CiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZ2V0IHVuaXF1ZSBhbmltYXRpb24gZXZlbnRzLCBiZWNhdXNlIHRoZSBgLmRvbmVgIGNhbGxiYWNrIGNhbiBnZXQKICAgICAgICAgICAgLy8gaW52b2tlZCB0d2ljZSBpbiBzb21lIGJyb3dzZXJzLiBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjQwODQuCiAgICAgICAgICAgIHRoaXMuX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHgKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeCwgeSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHguZnJvbVN0YXRlID09PSB5LmZyb21TdGF0ZSAmJiB4LnRvU3RhdGUgPT09IHkudG9TdGF0ZTsKICAgICAgICAgICAgfSkpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdHJhbnNpdGlvbiB0byB0aGUgY2VudGVyIGlzIGNvbXBsZXRlLCBlbWl0IGFuIGV2ZW50LgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzQ2VudGVyUG9zaXRpb24oZXZlbnQudG9TdGF0ZSkgJiYgdGhpcy5faXNDZW50ZXJQb3NpdGlvbih0aGlzLl9wb3NpdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNlbnRlcmVkLmVtaXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc0NlbnRlclBvc2l0aW9uKGV2ZW50LmZyb21TdGF0ZSkgJiYgIXRoaXMuX2lzQ2VudGVyUG9zaXRpb24odGhpcy5fcG9zaXRpb24pKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJMZWF2aW5nQ2VudGVyLmVtaXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2hpZnRlZCBpbmRleCBwb3NpdGlvbiBvZiB0aGUgdGFiIGJvZHksIHdoZXJlIHplcm8gcmVwcmVzZW50cyB0aGUgYWN0aXZlIGNlbnRlciB0YWIuCiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHBvc2l0aW9uKHBvc2l0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uSW5kZXggPSBwb3NpdGlvbjsKICAgICAgICAgICAgdGhpcy5fY29tcHV0ZVBvc2l0aW9uQW5pbWF0aW9uU3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWZ0ZXIgaW5pdGlhbGl6ZWQsIGNoZWNrIGlmIHRoZSBjb250ZW50IGlzIGNlbnRlcmVkIGFuZCBoYXMgYW4gb3JpZ2luLiBJZiBzbywgc2V0IHRoZQogICAgICAgICAqIHNwZWNpYWwgcG9zaXRpb24gc3RhdGVzIHRoYXQgdHJhbnNpdGlvbiB0aGUgdGFiIGZyb20gdGhlIGxlZnQgb3IgcmlnaHQgYmVmb3JlIGNlbnRlcmluZy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24gPT0gJ2NlbnRlcicgJiYgdGhpcy5vcmlnaW4gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSB0aGlzLl9jb21wdXRlUG9zaXRpb25Gcm9tT3JpZ2luKHRoaXMub3JpZ2luKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9kaXJDaGFuZ2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5fdHJhbnNsYXRlVGFiQ29tcGxldGUuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uVHJhbnNsYXRlVGFiU3RhcnRlZChldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzQ2VudGVyaW5nID0gdGhpcy5faXNDZW50ZXJQb3NpdGlvbihldmVudC50b1N0YXRlKTsKICAgICAgICAgICAgdGhpcy5fYmVmb3JlQ2VudGVyaW5nLmVtaXQoaXNDZW50ZXJpbmcpOwogICAgICAgICAgICBpZiAoaXNDZW50ZXJpbmcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29uQ2VudGVyaW5nLmVtaXQodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsaWVudEhlaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRleHQgZGlyZWN0aW9uIG9mIHRoZSBjb250YWluaW5nIGFwcC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRMYXlvdXREaXJlY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXIgJiYgdGhpcy5fZGlyLnZhbHVlID09PSAncnRsJyA/ICdydGwnIDogJ2x0cic7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHByb3ZpZGVkIHBvc2l0aW9uIHN0YXRlIGlzIGNvbnNpZGVyZWQgY2VudGVyLCByZWdhcmRsZXNzIG9mIG9yaWdpbi4KICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNDZW50ZXJQb3NpdGlvbihwb3NpdGlvbikgewogICAgICAgICAgICByZXR1cm4gcG9zaXRpb24gPT0gJ2NlbnRlcicgfHwKICAgICAgICAgICAgICAgIHBvc2l0aW9uID09ICdsZWZ0LW9yaWdpbi1jZW50ZXInIHx8CiAgICAgICAgICAgICAgICBwb3NpdGlvbiA9PSAncmlnaHQtb3JpZ2luLWNlbnRlcic7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGVzIHRoZSBwb3NpdGlvbiBzdGF0ZSB0aGF0IHdpbGwgYmUgdXNlZCBmb3IgdGhlIHRhYi1ib2R5IGFuaW1hdGlvbiB0cmlnZ2VyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZGlyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY29tcHV0ZVBvc2l0aW9uQW5pbWF0aW9uU3RhdGUoZGlyID0gdGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uSW5kZXggPCAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IGRpciA9PSAnbHRyJyA/ICdsZWZ0JyA6ICdyaWdodCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5fcG9zaXRpb25JbmRleCA+IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gZGlyID09ICdsdHInID8gJ3JpZ2h0JyA6ICdsZWZ0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uID0gJ2NlbnRlcic7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcHV0ZXMgdGhlIHBvc2l0aW9uIHN0YXRlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgb3JpZ2luIHBvc2l0aW9uLiBUaGlzIGlzIHVzZWQgaWYgdGhlCiAgICAgICAgICogdGFiIGlzIGJlY29taW5nIHZpc2libGUgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NvbXB1dGVQb3NpdGlvbkZyb21PcmlnaW4ob3JpZ2luKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk7CiAgICAgICAgICAgIGlmICgoZGlyID09ICdsdHInICYmIG9yaWdpbiA8PSAwKSB8fCAoZGlyID09ICdydGwnICYmIG9yaWdpbiA+IDApKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ2xlZnQtb3JpZ2luLWNlbnRlcic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICdyaWdodC1vcmlnaW4tY2VudGVyJzsKICAgICAgICB9CiAgICB9CiAgICBfTWF0VGFiQm9keUJhc2UuybVmYWMgPSBmdW5jdGlvbiBfTWF0VGFiQm9keUJhc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgX01hdFRhYkJvZHlCYXNlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZikpOyB9OwogICAgX01hdFRhYkJvZHlCYXNlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IF9NYXRUYWJCb2R5QmFzZSwgaW5wdXRzOiB7IGFuaW1hdGlvbkR1cmF0aW9uOiAiYW5pbWF0aW9uRHVyYXRpb24iLCBwb3NpdGlvbjogInBvc2l0aW9uIiwgX2NvbnRlbnQ6IFsiY29udGVudCIsICJfY29udGVudCJdLCBvcmlnaW46ICJvcmlnaW4iIH0sIG91dHB1dHM6IHsgX29uQ2VudGVyaW5nOiAiX29uQ2VudGVyaW5nIiwgX2JlZm9yZUNlbnRlcmluZzogIl9iZWZvcmVDZW50ZXJpbmciLCBfYWZ0ZXJMZWF2aW5nQ2VudGVyOiAiX2FmdGVyTGVhdmluZ0NlbnRlciIsIF9vbkNlbnRlcmVkOiAiX29uQ2VudGVyZWQiIH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIF9NYXRUYWJCb2R5QmFzZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfQogICAgXTsKICAgIF9NYXRUYWJCb2R5QmFzZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBfb25DZW50ZXJpbmc6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBfYmVmb3JlQ2VudGVyaW5nOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgX2FmdGVyTGVhdmluZ0NlbnRlcjogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIF9vbkNlbnRlcmVkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgX2NvbnRlbnQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2NvbnRlbnQnLF0gfV0sCiAgICAgICAgb3JpZ2luOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhbmltYXRpb25EdXJhdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcG9zaXRpb246IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBXcmFwcGVyIGZvciB0aGUgY29udGVudHMgb2YgYSB0YWIuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRUYWJCb2R5IGV4dGVuZHMgX01hdFRhYkJvZHlCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBkaXIsIGNoYW5nZURldGVjdG9yUmVmKSB7CiAgICAgICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGRpciwgY2hhbmdlRGV0ZWN0b3JSZWYpOwogICAgICAgIH0KICAgIH0KICAgIE1hdFRhYkJvZHkuybVmYWMgPSBmdW5jdGlvbiBNYXRUYWJCb2R5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkJvZHkpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSk7IH07CiAgICBNYXRUYWJCb2R5Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFRhYkJvZHksIHNlbGVjdG9yczogW1sibWF0LXRhYi1ib2R5Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIE1hdFRhYkJvZHlfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoUG9ydGFsSG9zdERpcmVjdGl2ZSwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcG9ydGFsSG9zdCA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGhvc3RBdHRyczogWzEsICJtYXQtdGFiLWJvZHkiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgZGVjbHM6IDMsIHZhcnM6IDYsIGNvbnN0czogW1sxLCAibWF0LXRhYi1ib2R5LWNvbnRlbnQiXSwgWyJjb250ZW50IiwgIiJdLCBbIm1hdFRhYkJvZHlIb3N0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRhYkJvZHlfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIkB0cmFuc2xhdGVUYWIuc3RhcnQiLCBmdW5jdGlvbiBNYXRUYWJCb2R5X1RlbXBsYXRlX2Rpdl9hbmltYXRpb25fdHJhbnNsYXRlVGFiX3N0YXJ0XzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX29uVHJhbnNsYXRlVGFiU3RhcnRlZCgkZXZlbnQpOyB9KSgiQHRyYW5zbGF0ZVRhYi5kb25lIiwgZnVuY3Rpb24gTWF0VGFiQm9keV9UZW1wbGF0ZV9kaXZfYW5pbWF0aW9uX3RyYW5zbGF0ZVRhYl9kb25lXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX3RyYW5zbGF0ZVRhYkNvbXBsZXRlLm5leHQoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBNYXRUYWJCb2R5X25nX3RlbXBsYXRlXzJfVGVtcGxhdGUsIDAsIDAsICJuZy10ZW1wbGF0ZSIsIDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIkB0cmFuc2xhdGVUYWIiLCDJtcm1cHVyZUZ1bmN0aW9uMigzLCBfYzIkMSwgY3R4Ll9wb3NpdGlvbiwgybXJtXB1cmVGdW5jdGlvbjEoMSwgX2MxJDMsIGN0eC5hbmltYXRpb25EdXJhdGlvbikpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRUYWJCb2R5UG9ydGFsXSwgc3R5bGVzOiBbIi5tYXQtdGFiLWJvZHktY29udGVudHtoZWlnaHQ6MTAwJTtvdmVyZmxvdzphdXRvfS5tYXQtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IC5tYXQtdGFiLWJvZHktY29udGVudHtvdmVyZmxvdzpoaWRkZW59XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgZGF0YTogeyBhbmltYXRpb246IFttYXRUYWJzQW5pbWF0aW9ucy50cmFuc2xhdGVUYWJdIH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFRhYkJvZHkuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0KICAgIF07CiAgICBNYXRUYWJCb2R5LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIF9wb3J0YWxIb3N0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtQb3J0YWxIb3N0RGlyZWN0aXZlLF0gfV0KICAgIH07CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyB0aGUgdGFicyBtb2R1bGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX1RBQlNfQ09ORklHID0gbmV3IEluamVjdGlvblRva2VuKCdNQVRfVEFCU19DT05GSUcnKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1ncm91cC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFVzZWQgdG8gZ2VuZXJhdGUgdW5pcXVlIElEJ3MgZm9yIGVhY2ggdGFiIGNvbXBvbmVudAogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBuZXh0SWQkMSA9IDA7CiAgICAvKioKICAgICAqIEEgc2ltcGxlIGNoYW5nZSBldmVudCBlbWl0dGVkIG9uIGZvY3VzIG9yIHNlbGVjdGlvbiBjaGFuZ2VzLgogICAgICovCiAgICBjbGFzcyBNYXRUYWJDaGFuZ2VFdmVudCB7CiAgICB9CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdFRhYkdyb3VwLgogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRUYWJHcm91cE1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0VGFiR3JvdXBNaXhpbkJhc2UgPSBtaXhpbkNvbG9yKG1peGluRGlzYWJsZVJpcHBsZShNYXRUYWJHcm91cE1peGluQmFzZSksICdwcmltYXJ5Jyk7CiAgICAvKioKICAgICAqIEJhc2UgY2xhc3Mgd2l0aCBhbGwgb2YgdGhlIGBNYXRUYWJHcm91cEJhc2VgIGZ1bmN0aW9uYWxpdHkuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lCiAgICBjbGFzcyBfTWF0VGFiR3JvdXBCYXNlIGV4dGVuZHMgX01hdFRhYkdyb3VwTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRDb25maWcKICAgICAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgZGVmYXVsdENvbmZpZywgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgc3VwZXIoZWxlbWVudFJlZik7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBbGwgb2YgdGhlIHRhYnMgdGhhdCBiZWxvbmcgdG8gdGhlIGdyb3VwLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdGFicyA9IG5ldyBRdWVyeUxpc3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSB0YWIgaW5kZXggdGhhdCBzaG91bGQgYmUgc2VsZWN0ZWQgYWZ0ZXIgdGhlIGNvbnRlbnQgaGFzIGJlZW4gY2hlY2tlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2luZGV4VG9TZWxlY3QgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU25hcHNob3Qgb2YgdGhlIGhlaWdodCBvZiB0aGUgdGFiIGJvZHkgd3JhcHBlciBiZWZvcmUgYW5vdGhlciB0YWIgaXMgYWN0aXZhdGVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdGFiQm9keVdyYXBwZXJIZWlnaHQgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIHRhYnMgYmVpbmcgYWRkZWQvcmVtb3ZlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RhYnNTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJzY3JpcHRpb24gdG8gY2hhbmdlcyBpbiB0aGUgdGFiIGxhYmVscy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RhYkxhYmVsU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICB0aGlzLl9keW5hbWljSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUG9zaXRpb24gb2YgdGhlIHRhYiBoZWFkZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmhlYWRlclBvc2l0aW9uID0gJ2Fib3ZlJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE91dHB1dCB0byBlbmFibGUgc3VwcG9ydCBmb3IgdHdvLXdheSBiaW5kaW5nIG9uIGBbKHNlbGVjdGVkSW5kZXgpXWAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBmb2N1cyBoYXMgY2hhbmdlZCB3aXRoaW4gYSB0YWIgZ3JvdXAuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmZvY3VzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBib2R5IGFuaW1hdGlvbiBoYXMgY29tcGxldGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFuaW1hdGlvbkRvbmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHRhYiBzZWxlY3Rpb24gaGFzIGNoYW5nZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkVGFiQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTsKICAgICAgICAgICAgdGhpcy5fZ3JvdXBJZCA9IG5leHRJZCQxKys7CiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uRHVyYXRpb24gPSBkZWZhdWx0Q29uZmlnICYmIGRlZmF1bHRDb25maWcuYW5pbWF0aW9uRHVyYXRpb24gPwogICAgICAgICAgICAgICAgZGVmYXVsdENvbmZpZy5hbmltYXRpb25EdXJhdGlvbiA6ICc1MDBtcyc7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZVBhZ2luYXRpb24gPSBkZWZhdWx0Q29uZmlnICYmIGRlZmF1bHRDb25maWcuZGlzYWJsZVBhZ2luYXRpb24gIT0gbnVsbCA/CiAgICAgICAgICAgICAgICBkZWZhdWx0Q29uZmlnLmRpc2FibGVQYWdpbmF0aW9uIDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHRhYiBncm91cCBzaG91bGQgZ3JvdyB0byB0aGUgc2l6ZSBvZiB0aGUgYWN0aXZlIHRhYi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkeW5hbWljSGVpZ2h0KCkgeyByZXR1cm4gdGhpcy5fZHluYW1pY0hlaWdodDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkeW5hbWljSGVpZ2h0KHZhbHVlKSB7IHRoaXMuX2R5bmFtaWNIZWlnaHQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4OyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHNlbGVjdGVkSW5kZXgodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5faW5kZXhUb1NlbGVjdCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlLCBudWxsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRHVyYXRpb24gZm9yIHRoZSB0YWIgYW5pbWF0aW9uLiBXaWxsIGJlIG5vcm1hbGl6ZWQgdG8gbWlsbGlzZWNvbmRzIGlmIG5vIHVuaXRzIGFyZSBzZXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYW5pbWF0aW9uRHVyYXRpb24oKSB7IHJldHVybiB0aGlzLl9hbmltYXRpb25EdXJhdGlvbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBhbmltYXRpb25EdXJhdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25EdXJhdGlvbiA9IC9eXGQrJC8udGVzdCh2YWx1ZSkgPyB2YWx1ZSArICdtcycgOiB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGFiIGdyb3VwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGJhY2tncm91bmRDb2xvcigpIHsgcmV0dXJuIHRoaXMuX2JhY2tncm91bmRDb2xvcjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBiYWNrZ3JvdW5kQ29sb3IodmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICBuYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYG1hdC1iYWNrZ3JvdW5kLSR7dGhpcy5iYWNrZ3JvdW5kQ29sb3J9YCk7CiAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgbmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBtYXQtYmFja2dyb3VuZC0ke3ZhbHVlfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmRDb2xvciA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZnRlciB0aGUgY29udGVudCBpcyBjaGVja2VkLCB0aGlzIGNvbXBvbmVudCBrbm93cyB3aGF0IHRhYnMgaGF2ZSBiZWVuIGRlZmluZWQKICAgICAgICAgKiBhbmQgd2hhdCB0aGUgc2VsZWN0ZWQgaW5kZXggc2hvdWxkIGJlLiBUaGlzIGlzIHdoZXJlIHdlIGNhbiBrbm93IGV4YWN0bHkgd2hhdCBwb3NpdGlvbgogICAgICAgICAqIGVhY2ggdGFiIHNob3VsZCBiZSBpbiBhY2NvcmRpbmcgdG8gdGhlIG5ldyBzZWxlY3RlZCBpbmRleCwgYW5kIGFkZGl0aW9uYWxseSB3ZSBrbm93IGhvdwogICAgICAgICAqIGEgbmV3IHNlbGVjdGVkIHRhYiBzaG91bGQgdHJhbnNpdGlvbiBpbiAoZnJvbSB0aGUgbGVmdCBvciByaWdodCkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7CiAgICAgICAgICAgIC8vIERvbid0IGNsYW1wIHRoZSBgaW5kZXhUb1NlbGVjdGAgaW1tZWRpYXRlbHkgaW4gdGhlIHNldHRlciBiZWNhdXNlIGl0IGNhbiBoYXBwZW4gdGhhdAogICAgICAgICAgICAvLyB0aGUgYW1vdW50IG9mIHRhYnMgY2hhbmdlcyBiZWZvcmUgdGhlIGFjdHVhbCBjaGFuZ2UgZGV0ZWN0aW9uIHJ1bnMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXhUb1NlbGVjdCA9IHRoaXMuX2luZGV4VG9TZWxlY3QgPSB0aGlzLl9jbGFtcFRhYkluZGV4KHRoaXMuX2luZGV4VG9TZWxlY3QpOwogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIGNoYW5nZSBpbiBzZWxlY3RlZCBpbmRleCwgZW1pdCBhIGNoYW5nZSBldmVudC4gU2hvdWxkIG5vdCB0cmlnZ2VyIGlmCiAgICAgICAgICAgIC8vIHRoZSBzZWxlY3RlZCBpbmRleCBoYXMgbm90IHlldCBiZWVuIGluaXRpYWxpemVkLgogICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0ZWRJbmRleCAhPSBpbmRleFRvU2VsZWN0KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc0ZpcnN0UnVuID0gdGhpcy5fc2VsZWN0ZWRJbmRleCA9PSBudWxsOwogICAgICAgICAgICAgICAgaWYgKCFpc0ZpcnN0UnVuKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFRhYkNoYW5nZS5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KGluZGV4VG9TZWxlY3QpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIENoYW5naW5nIHRoZXNlIHZhbHVlcyBhZnRlciBjaGFuZ2UgZGV0ZWN0aW9uIGhhcyBydW4KICAgICAgICAgICAgICAgIC8vIHNpbmNlIHRoZSBjaGVja2VkIGNvbnRlbnQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byB0aGVtLgogICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGFicy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhYgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICh0YWIsIGluZGV4KSA9PiB0YWIuaXNBY3RpdmUgPSBpbmRleCA9PT0gaW5kZXhUb1NlbGVjdCkpOwogICAgICAgICAgICAgICAgICAgIGlmICghaXNGaXJzdFJ1bikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXhDaGFuZ2UuZW1pdChpbmRleFRvU2VsZWN0KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2V0dXAgdGhlIHBvc2l0aW9uIGZvciBlYWNoIHRhYiBhbmQgb3B0aW9uYWxseSBzZXR1cCBhbiBvcmlnaW4gb24gdGhlIG5leHQgc2VsZWN0ZWQgdGFiLgogICAgICAgICAgICB0aGlzLl90YWJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhYgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodGFiLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgdGFiLnBvc2l0aW9uID0gaW5kZXggLSBpbmRleFRvU2VsZWN0OwogICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhIHNlbGVjdGVkIHRhYiwgdGhlbiBzZXQgdXAgYW4gb3JpZ2luIGZvciB0aGUgbmV4dCBzZWxlY3RlZCB0YWIKICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXNuJ3QgaGF2ZSBvbmUgYWxyZWFkeS4KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9IG51bGwgJiYgdGFiLnBvc2l0aW9uID09IDAgJiYgIXRhYi5vcmlnaW4pIHsKICAgICAgICAgICAgICAgICAgICB0YWIub3JpZ2luID0gaW5kZXhUb1NlbGVjdCAtIHRoaXMuX3NlbGVjdGVkSW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkSW5kZXggIT09IGluZGV4VG9TZWxlY3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSBpbmRleFRvU2VsZWN0OwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZVRvQWxsVGFiQ2hhbmdlcygpOwogICAgICAgICAgICB0aGlzLl9zdWJzY3JpYmVUb1RhYkxhYmVscygpOwogICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiB0aGUgYW1vdW50IG9mIHRhYnMsIGluIG9yZGVyIHRvIGJlCiAgICAgICAgICAgIC8vIGFibGUgdG8gcmUtcmVuZGVyIHRoZSBjb250ZW50IGFzIG5ldyB0YWJzIGFyZSBhZGRlZCBvciByZW1vdmVkLgogICAgICAgICAgICB0aGlzLl90YWJzU3Vic2NyaXB0aW9uID0gdGhpcy5fdGFicy5jaGFuZ2VzLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmRleFRvU2VsZWN0ID0gdGhpcy5fY2xhbXBUYWJJbmRleCh0aGlzLl9pbmRleFRvU2VsZWN0KTsKICAgICAgICAgICAgICAgIC8vIE1haW50YWluIHRoZSBwcmV2aW91c2x5LXNlbGVjdGVkIHRhYiBpZiBhIG5ldyB0YWIgaXMgYWRkZWQgb3IgcmVtb3ZlZCBhbmQgdGhlcmUgaXMgbm8KICAgICAgICAgICAgICAgIC8vIGV4cGxpY2l0IGNoYW5nZSB0aGF0IHNlbGVjdHMgYSBkaWZmZXJlbnQgdGFiLgogICAgICAgICAgICAgICAgaWYgKGluZGV4VG9TZWxlY3QgPT09IHRoaXMuX3NlbGVjdGVkSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGFicyA9IHRoaXMuX3RhYnMudG9BcnJheSgpOwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGFicy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFic1tpXS5pc0FjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXNzaWduIGJvdGggdG8gdGhlIGBfaW5kZXhUb1NlbGVjdGAgYW5kIGBfc2VsZWN0ZWRJbmRleGAgc28gd2UgZG9uJ3QgZmlyZSBhIGNoYW5nZWQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LCBvdGhlcndpc2UgdGhlIGNvbnN1bWVyIG1heSBlbmQgdXAgaW4gYW4gaW5maW5pdGUgbG9vcCBpbiBzb21lIGVkZ2UgY2FzZXMgbGlrZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkaW5nIGEgdGFiIHdpdGhpbiB0aGUgYHNlbGVjdGVkSW5kZXhDaGFuZ2VgIGV2ZW50LgogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXhUb1NlbGVjdCA9IHRoaXMuX3NlbGVjdGVkSW5kZXggPSBpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMaXN0ZW5zIHRvIGNoYW5nZXMgaW4gYWxsIG9mIHRoZSB0YWJzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3Vic2NyaWJlVG9BbGxUYWJDaGFuZ2VzKCkgewogICAgICAgICAgICAvLyBTaW5jZSB3ZSB1c2UgYSBxdWVyeSB3aXRoIGBkZXNjZW5kYW50czogdHJ1ZWAgdG8gcGljayB1cCB0aGUgdGFicywgd2UgbWF5IGVuZCB1cCBjYXRjaGluZwogICAgICAgICAgICAvLyBzb21lIHRoYXQgYXJlIGluc2lkZSBvZiBuZXN0ZWQgdGFiIGdyb3Vwcy4gV2UgZmlsdGVyIHRoZW0gb3V0IG1hbnVhbGx5IGJ5IGNoZWNraW5nIHRoYXQKICAgICAgICAgICAgLy8gdGhlIGNsb3Nlc3QgZ3JvdXAgdG8gdGhlIHRhYiBpcyB0aGUgY3VycmVudCBvbmUuCiAgICAgICAgICAgIHRoaXMuX2FsbFRhYnMuY2hhbmdlcwogICAgICAgICAgICAgICAgLnBpcGUoc3RhcnRXaXRoKHRoaXMuX2FsbFRhYnMpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGFicwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHRhYnMpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3RhYnMucmVzZXQodGFicy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YWIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRhYiA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAgUmVtb3ZlIG51bGwgY2hlY2sgZm9yIGBfY2xvc2VzdFRhYkdyb3VwYAogICAgICAgICAgICAgICAgICAgIC8vIG9uY2UgaXQgYmVjb21lcyBhIHJlcXVpcmVkIHBhcmFtZXRlciBpbiBNYXRUYWIuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICF0YWIuX2Nsb3Nlc3RUYWJHcm91cCB8fCB0YWIuX2Nsb3Nlc3RUYWJHcm91cCA9PT0gdGhpczsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICB0aGlzLl90YWJzLm5vdGlmeU9uQ2hhbmdlcygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3RhYnMuZGVzdHJveSgpOwogICAgICAgICAgICB0aGlzLl90YWJzU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX3RhYkxhYmVsU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlLWFsaWducyB0aGUgaW5rIGJhciB0byB0aGUgc2VsZWN0ZWQgdGFiIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWFsaWduSW5rQmFyKCkgewogICAgICAgICAgICBpZiAodGhpcy5fdGFiSGVhZGVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90YWJIZWFkZXIuX2FsaWduSW5rQmFyVG9TZWxlY3RlZFRhYigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb2N1c0NoYW5nZWQoaW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5mb2N1c0NoYW5nZS5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KGluZGV4KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUNoYW5nZUV2ZW50KGluZGV4KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWF0VGFiQ2hhbmdlRXZlbnQ7CiAgICAgICAgICAgIGV2ZW50LmluZGV4ID0gaW5kZXg7CiAgICAgICAgICAgIGlmICh0aGlzLl90YWJzICYmIHRoaXMuX3RhYnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBldmVudC50YWIgPSB0aGlzLl90YWJzLnRvQXJyYXkoKVtpbmRleF07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdWJzY3JpYmVzIHRvIGNoYW5nZXMgaW4gdGhlIHRhYiBsYWJlbHMuIFRoaXMgaXMgbmVlZGVkLCBiZWNhdXNlIHRoZSBcQElucHV0IGZvciB0aGUgbGFiZWwgaXMKICAgICAgICAgKiBvbiB0aGUgTWF0VGFiIGNvbXBvbmVudCwgd2hlcmVhcyB0aGUgZGF0YSBiaW5kaW5nIGlzIGluc2lkZSB0aGUgTWF0VGFiR3JvdXAuIEluIG9yZGVyIGZvciB0aGUKICAgICAgICAgKiBiaW5kaW5nIHRvIGJlIHVwZGF0ZWQsIHdlIG5lZWQgdG8gc3Vic2NyaWJlIHRvIGNoYW5nZXMgaW4gaXQgYW5kIHRyaWdnZXIgY2hhbmdlIGRldGVjdGlvbgogICAgICAgICAqIG1hbnVhbGx5LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3Vic2NyaWJlVG9UYWJMYWJlbHMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fdGFiTGFiZWxTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90YWJMYWJlbFN1YnNjcmlwdGlvbiA9IG1lcmdlKC4uLnRoaXMuX3RhYnMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YWIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRhYiA9PiB0YWIuX3N0YXRlQ2hhbmdlcykpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGFtcHMgdGhlIGdpdmVuIGluZGV4IHRvIHRoZSBib3VuZHMgb2YgMCBhbmQgdGhlIHRhYnMgbGVuZ3RoLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NsYW1wVGFiSW5kZXgoaW5kZXgpIHsKICAgICAgICAgICAgLy8gTm90ZSB0aGUgYHx8IDBgLCB3aGljaCBlbnN1cmVzIHRoYXQgdmFsdWVzIGxpa2UgTmFOIGNhbid0IGdldCB0aHJvdWdoCiAgICAgICAgICAgIC8vIGFuZCB3aGljaCB3b3VsZCBvdGhlcndpc2UgdGhyb3cgdGhlIGNvbXBvbmVudCBpbnRvIGFuIGluZmluaXRlIGxvb3AKICAgICAgICAgICAgLy8gKHNpbmNlIE1hdGgubWF4KE5hTiwgMCkgPT09IE5hTikuCiAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbih0aGlzLl90YWJzLmxlbmd0aCAtIDEsIE1hdGgubWF4KGluZGV4IHx8IDAsIDApKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHVuaXF1ZSBpZCBmb3IgZWFjaCB0YWIgbGFiZWwgZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFRhYkxhYmVsSWQoaSkgewogICAgICAgICAgICByZXR1cm4gYG1hdC10YWItbGFiZWwtJHt0aGlzLl9ncm91cElkfS0ke2l9YDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHVuaXF1ZSBpZCBmb3IgZWFjaCB0YWIgY29udGVudCBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0VGFiQ29udGVudElkKGkpIHsKICAgICAgICAgICAgcmV0dXJuIGBtYXQtdGFiLWNvbnRlbnQtJHt0aGlzLl9ncm91cElkfS0ke2l9YDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgaGVpZ2h0IG9mIHRoZSBib2R5IHdyYXBwZXIgdG8gdGhlIGhlaWdodCBvZiB0aGUgYWN0aXZhdGluZyB0YWIgaWYgZHluYW1pYwogICAgICAgICAqIGhlaWdodCBwcm9wZXJ0eSBpcyB0cnVlLgogICAgICAgICAqIEBwYXJhbSB7P30gdGFiSGVpZ2h0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VGFiQm9keVdyYXBwZXJIZWlnaHQodGFiSGVpZ2h0KSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fZHluYW1pY0hlaWdodCB8fCAhdGhpcy5fdGFiQm9keVdyYXBwZXJIZWlnaHQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdyYXBwZXIgPSB0aGlzLl90YWJCb2R5V3JhcHBlci5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICB3cmFwcGVyLnN0eWxlLmhlaWdodCA9IHRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0ICsgJ3B4JzsKICAgICAgICAgICAgLy8gVGhpcyBjb25kaXRpb25hbCBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcGFpbnQgdGhlIGhlaWdodCBzbyB0aGF0CiAgICAgICAgICAgIC8vIHRoZSBhbmltYXRpb24gdG8gdGhlIG5ldyBoZWlnaHQgY2FuIGhhdmUgYW4gb3JpZ2luLgogICAgICAgICAgICBpZiAodGhpcy5fdGFiQm9keVdyYXBwZXIubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQpIHsKICAgICAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gdGFiSGVpZ2h0ICsgJ3B4JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIHRoZSBoZWlnaHQgb2YgdGhlIHRhYiBib2R5IHdyYXBwZXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlVGFiQm9keVdyYXBwZXJIZWlnaHQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd3JhcHBlciA9IHRoaXMuX3RhYkJvZHlXcmFwcGVyLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX3RhYkJvZHlXcmFwcGVySGVpZ2h0ID0gd3JhcHBlci5jbGllbnRIZWlnaHQ7CiAgICAgICAgICAgIHdyYXBwZXIuc3R5bGUuaGVpZ2h0ID0gJyc7CiAgICAgICAgICAgIHRoaXMuYW5pbWF0aW9uRG9uZS5lbWl0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZSBjbGljayBldmVudHMsIHNldHRpbmcgbmV3IHNlbGVjdGVkIGluZGV4IGlmIGFwcHJvcHJpYXRlLgogICAgICAgICAqIEBwYXJhbSB7P30gdGFiCiAgICAgICAgICogQHBhcmFtIHs/fSB0YWJIZWFkZXIKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFuZGxlQ2xpY2sodGFiLCB0YWJIZWFkZXIsIGluZGV4KSB7CiAgICAgICAgICAgIGlmICghdGFiLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSB0YWJIZWFkZXIuZm9jdXNJbmRleCA9IGluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgdGFiaW5kZXggZm9yIHRoZSB0YWIuCiAgICAgICAgICogQHBhcmFtIHs/fSB0YWIKICAgICAgICAgKiBAcGFyYW0gez99IGlkeAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFRhYkluZGV4KHRhYiwgaWR4KSB7CiAgICAgICAgICAgIGlmICh0YWIuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkSW5kZXggPT09IGlkeCA/IDAgOiAtMTsKICAgICAgICB9CiAgICB9CiAgICBfTWF0VGFiR3JvdXBCYXNlLsm1ZmFjID0gZnVuY3Rpb24gX01hdFRhYkdyb3VwQmFzZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0VGFiR3JvdXBCYXNlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfVEFCU19DT05GSUcsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgX01hdFRhYkdyb3VwQmFzZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBfTWF0VGFiR3JvdXBCYXNlLCBpbnB1dHM6IHsgaGVhZGVyUG9zaXRpb246ICJoZWFkZXJQb3NpdGlvbiIsIGFuaW1hdGlvbkR1cmF0aW9uOiAiYW5pbWF0aW9uRHVyYXRpb24iLCBkaXNhYmxlUGFnaW5hdGlvbjogImRpc2FibGVQYWdpbmF0aW9uIiwgZHluYW1pY0hlaWdodDogImR5bmFtaWNIZWlnaHQiLCBzZWxlY3RlZEluZGV4OiAic2VsZWN0ZWRJbmRleCIsIGJhY2tncm91bmRDb2xvcjogImJhY2tncm91bmRDb2xvciIgfSwgb3V0cHV0czogeyBzZWxlY3RlZEluZGV4Q2hhbmdlOiAic2VsZWN0ZWRJbmRleENoYW5nZSIsIGZvY3VzQ2hhbmdlOiAiZm9jdXNDaGFuZ2UiLCBhbmltYXRpb25Eb25lOiAiYW5pbWF0aW9uRG9uZSIsIHNlbGVjdGVkVGFiQ2hhbmdlOiAic2VsZWN0ZWRUYWJDaGFuZ2UiIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIF9NYXRUYWJHcm91cEJhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfVEFCU19DT05GSUcsXSB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQogICAgXTsKICAgIF9NYXRUYWJHcm91cEJhc2UucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZHluYW1pY0hlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2VsZWN0ZWRJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaGVhZGVyUG9zaXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFuaW1hdGlvbkR1cmF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkaXNhYmxlUGFnaW5hdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYmFja2dyb3VuZENvbG9yOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzZWxlY3RlZEluZGV4Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgZm9jdXNDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBhbmltYXRpb25Eb25lOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgc2VsZWN0ZWRUYWJDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogTWF0ZXJpYWwgZGVzaWduIHRhYi1ncm91cCBjb21wb25lbnQuIFN1cHBvcnRzIGJhc2ljIHRhYiBwYWlycyAobGFiZWwgKyBjb250ZW50KSBhbmQgaW5jbHVkZXMKICAgICAqIGFuaW1hdGVkIGluay1iYXIsIGtleWJvYXJkIG5hdmlnYXRpb24sIGFuZCBzY3JlZW4gcmVhZGVyLgogICAgICogU2VlOiBodHRwczovL21hdGVyaWFsLmlvL2Rlc2lnbi9jb21wb25lbnRzL3RhYnMuaHRtbAogICAgICovCiAgICBjbGFzcyBNYXRUYWJHcm91cCBleHRlbmRzIF9NYXRUYWJHcm91cEJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0Q29uZmlnCiAgICAgICAgICogQHBhcmFtIHs/PX0gYW5pbWF0aW9uTW9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCBkZWZhdWx0Q29uZmlnLCBhbmltYXRpb25Nb2RlKSB7CiAgICAgICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGNoYW5nZURldGVjdG9yUmVmLCBkZWZhdWx0Q29uZmlnLCBhbmltYXRpb25Nb2RlKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRUYWJHcm91cC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYkdyb3VwX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkdyb3VwKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfVEFCU19DT05GSUcsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgTWF0VGFiR3JvdXAuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0VGFiR3JvdXAsIHNlbGVjdG9yczogW1sibWF0LXRhYi1ncm91cCJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdFRhYkdyb3VwX0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0VGFiLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9hbGxUYWJzID0gX3QpOwogICAgICAgIH0gfSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRUYWJHcm91cF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXZpZXdRdWVyeShfYzMsIHRydWUpOwogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jNCwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGFiQm9keVdyYXBwZXIgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3RhYkhlYWRlciA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGhvc3RBdHRyczogWzEsICJtYXQtdGFiLWdyb3VwIl0sIGhvc3RWYXJzOiA0LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFRhYkdyb3VwX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1ncm91cC1keW5hbWljLWhlaWdodCIsIGN0eC5keW5hbWljSGVpZ2h0KSgibWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIiLCBjdHguaGVhZGVyUG9zaXRpb24gPT09ICJiZWxvdyIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGNvbG9yOiAiY29sb3IiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIgfSwgZXhwb3J0QXM6IFsibWF0VGFiR3JvdXAiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1BVF9UQUJfR1JPVVAsCiAgICAgICAgICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IE1hdFRhYkdyb3VwCiAgICAgICAgICAgICAgICB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBkZWNsczogNiwgdmFyczogNywgY29uc3RzOiBbWzMsICJzZWxlY3RlZEluZGV4IiwgImRpc2FibGVSaXBwbGUiLCAiZGlzYWJsZVBhZ2luYXRpb24iLCAiaW5kZXhGb2N1c2VkIiwgInNlbGVjdEZvY3VzZWRJbmRleCJdLCBbInRhYkhlYWRlciIsICIiXSwgWyJjbGFzcyIsICJtYXQtdGFiLWxhYmVsIG1hdC1mb2N1cy1pbmRpY2F0b3IiLCAicm9sZSIsICJ0YWIiLCAibWF0VGFiTGFiZWxXcmFwcGVyIiwgIiIsICJtYXQtcmlwcGxlIiwgIiIsICJjZGtNb25pdG9yRWxlbWVudEZvY3VzIiwgIiIsIDMsICJpZCIsICJtYXQtdGFiLWxhYmVsLWFjdGl2ZSIsICJkaXNhYmxlZCIsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJjbGljayIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsxLCAibWF0LXRhYi1ib2R5LXdyYXBwZXIiXSwgWyJ0YWJCb2R5V3JhcHBlciIsICIiXSwgWyJyb2xlIiwgInRhYnBhbmVsIiwgMywgImlkIiwgIm1hdC10YWItYm9keS1hY3RpdmUiLCAiY29udGVudCIsICJwb3NpdGlvbiIsICJvcmlnaW4iLCAiYW5pbWF0aW9uRHVyYXRpb24iLCAiX29uQ2VudGVyZWQiLCAiX29uQ2VudGVyaW5nIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWyJyb2xlIiwgInRhYiIsICJtYXRUYWJMYWJlbFdyYXBwZXIiLCAiIiwgIm1hdC1yaXBwbGUiLCAiIiwgImNka01vbml0b3JFbGVtZW50Rm9jdXMiLCAiIiwgMSwgIm1hdC10YWItbGFiZWwiLCAibWF0LWZvY3VzLWluZGljYXRvciIsIDMsICJpZCIsICJkaXNhYmxlZCIsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJjbGljayJdLCBbMSwgIm1hdC10YWItbGFiZWwtY29udGVudCJdLCBbMywgIm5nSWYiXSwgWzMsICJjZGtQb3J0YWxPdXRsZXQiXSwgWyJyb2xlIiwgInRhYnBhbmVsIiwgMywgImlkIiwgImNvbnRlbnQiLCAicG9zaXRpb24iLCAib3JpZ2luIiwgImFuaW1hdGlvbkR1cmF0aW9uIiwgIl9vbkNlbnRlcmVkIiwgIl9vbkNlbnRlcmluZyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRhYkdyb3VwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtYXQtdGFiLWhlYWRlciIsIDAsIDEpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImluZGV4Rm9jdXNlZCIsIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX1RlbXBsYXRlX21hdF90YWJfaGVhZGVyX2luZGV4Rm9jdXNlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9mb2N1c0NoYW5nZWQoJGV2ZW50KTsgfSkoInNlbGVjdEZvY3VzZWRJbmRleCIsIGZ1bmN0aW9uIE1hdFRhYkdyb3VwX1RlbXBsYXRlX21hdF90YWJfaGVhZGVyX3NlbGVjdEZvY3VzZWRJbmRleF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LnNlbGVjdGVkSW5kZXggPSAkZXZlbnQ7IH0pOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMiwgTWF0VGFiR3JvdXBfZGl2XzJfVGVtcGxhdGUsIDQsIDE0LCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDMsIDQpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNSwgTWF0VGFiR3JvdXBfbWF0X3RhYl9ib2R5XzVfVGVtcGxhdGUsIDEsIDgsICJtYXQtdGFiLWJvZHkiLCA1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJzZWxlY3RlZEluZGV4IiwgY3R4LnNlbGVjdGVkSW5kZXggfHwgMCkoImRpc2FibGVSaXBwbGUiLCBjdHguZGlzYWJsZVJpcHBsZSkoImRpc2FibGVQYWdpbmF0aW9uIiwgY3R4LmRpc2FibGVQYWdpbmF0aW9uKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5fdGFicyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguX3RhYnMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFRhYkhlYWRlciwgTmdGb3JPZiwgTWF0VGFiTGFiZWxXcmFwcGVyLCBNYXRSaXBwbGUsIENka01vbml0b3JGb2N1cywgTmdJZiwgQ2RrUG9ydGFsT3V0bGV0LCBNYXRUYWJCb2R5XTsgfSwgc3R5bGVzOiBbIi5tYXQtdGFiLWdyb3Vwe2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1hdC10YWItZ3JvdXAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJ7ZmxleC1kaXJlY3Rpb246Y29sdW1uLXJldmVyc2V9Lm1hdC10YWItbGFiZWx7aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDI0cHg7Y3Vyc29yOnBvaW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O29wYWNpdHk6LjY7bWluLXdpZHRoOjE2MHB4O3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1sYWJlbDpmb2N1czpub3QoLm1hdC10YWItZGlzYWJsZWQpe29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsOmZvY3Vze291dGxpbmU6ZG90dGVkIDJweDtvdXRsaW5lLW9mZnNldDotMnB4fS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVke29wYWNpdHk6LjV9Lm1hdC10YWItbGFiZWwgLm1hdC10YWItbGFiZWwtY29udGVudHtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVse29wYWNpdHk6MX1AbWVkaWEobWF4LXdpZHRoOiA1OTlweCl7Lm1hdC10YWItbGFiZWx7cGFkZGluZzowIDEycHh9fUBtZWRpYShtYXgtd2lkdGg6IDk1OXB4KXsubWF0LXRhYi1sYWJlbHtwYWRkaW5nOjAgMTJweH19Lm1hdC10YWItZ3JvdXBbbWF0LXN0cmV0Y2gtdGFic10+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVse2ZsZXgtYmFzaXM6MDtmbGV4LWdyb3c6MX0ubWF0LXRhYi1ib2R5LXdyYXBwZXJ7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuO2Rpc3BsYXk6ZmxleDt0cmFuc2l0aW9uOmhlaWdodCA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC10YWItYm9keS13cmFwcGVye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ib2R5e3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2Rpc3BsYXk6YmxvY2s7b3ZlcmZsb3c6aGlkZGVuO2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXRhYi1ib2R5Lm1hdC10YWItYm9keS1hY3RpdmV7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvO3otaW5kZXg6MTtmbGV4LWdyb3c6MX0ubWF0LXRhYi1ncm91cC5tYXQtdGFiLWdyb3VwLWR5bmFtaWMtaGVpZ2h0IC5tYXQtdGFiLWJvZHkubWF0LXRhYi1ib2R5LWFjdGl2ZXtvdmVyZmxvdy15OmhpZGRlbn1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRUYWJHcm91cC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9UQUJTX0NPTkZJRyxdIH0sIHsgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9CiAgICBdOwogICAgTWF0VGFiR3JvdXAucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgX2FsbFRhYnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdFRhYiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sCiAgICAgICAgX3RhYkJvZHlXcmFwcGVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsndGFiQm9keVdyYXBwZXInLF0gfV0sCiAgICAgICAgX3RhYkhlYWRlcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RhYkhlYWRlcicsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1sYWJlbC13cmFwcGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0VGFiTGFiZWxXcmFwcGVyLgogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRUYWJMYWJlbFdyYXBwZXJCYXNlIHsKICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9NYXRUYWJMYWJlbFdyYXBwZXJNaXhpbkJhc2UgPSBtaXhpbkRpc2FibGVkKE1hdFRhYkxhYmVsV3JhcHBlckJhc2UpOwogICAgLyoqCiAgICAgKiBVc2VkIGluIHRoZSBgbWF0LXRhYi1ncm91cGAgdmlldyB0byBkaXNwbGF5IHRhYiBsYWJlbHMuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRUYWJMYWJlbFdyYXBwZXIgZXh0ZW5kcyBfTWF0VGFiTGFiZWxXcmFwcGVyTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgZm9jdXMgb24gdGhlIHdyYXBwZXIgZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0T2Zmc2V0TGVmdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm9mZnNldExlZnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0T2Zmc2V0V2lkdGgoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDsKICAgICAgICB9CiAgICB9CiAgICBNYXRUYWJMYWJlbFdyYXBwZXIuybVmYWMgPSBmdW5jdGlvbiBNYXRUYWJMYWJlbFdyYXBwZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0VGFiTGFiZWxXcmFwcGVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIE1hdFRhYkxhYmVsV3JhcHBlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRUYWJMYWJlbFdyYXBwZXIsIHNlbGVjdG9yczogW1siIiwgIm1hdFRhYkxhYmVsV3JhcHBlciIsICIiXV0sIGhvc3RWYXJzOiAzLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFRhYkxhYmVsV3JhcHBlcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCAhIWN0eC5kaXNhYmxlZCk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10YWItZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFRhYkxhYmVsV3JhcHBlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3BhZ2luYXRlZC10YWItaGVhZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ29uZmlnIHVzZWQgdG8gYmluZCBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycwogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovIChub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogdHJ1ZSB9KSkpOwogICAgLyoqCiAgICAgKiBUaGUgZGlzdGFuY2UgaW4gcGl4ZWxzIHRoYXQgd2lsbCBiZSBvdmVyc2hvdCB3aGVuIHNjcm9sbGluZyBhIHRhYiBsYWJlbCBpbnRvIHZpZXcuIFRoaXMgaGVscHMKICAgICAqIHByb3ZpZGUgYSBzbWFsbCBhZmZvcmRhbmNlIHRvIHRoZSBsYWJlbCBuZXh0IHRvIGl0LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEVYQUdHRVJBVEVEX09WRVJTQ1JPTEwgPSA2MDsKICAgIC8qKgogICAgICogQW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGJlZm9yZSBzdGFydGluZyB0byBzY3JvbGwgdGhlIGhlYWRlciBhdXRvbWF0aWNhbGx5LgogICAgICogU2V0IGEgbGl0dGxlIGNvbnNlcnZhdGl2ZWx5IGluIG9yZGVyIHRvIGhhbmRsZSBmYWtlIGV2ZW50cyBkaXNwYXRjaGVkIG9uIHRvdWNoIGRldmljZXMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSEVBREVSX1NDUk9MTF9ERUxBWSA9IDY1MDsKICAgIC8qKgogICAgICogSW50ZXJ2YWwgaW4gbWlsbGlzZWNvbmRzIGF0IHdoaWNoIHRvIHNjcm9sbCB0aGUgaGVhZGVyCiAgICAgKiB3aGlsZSB0aGUgdXNlciBpcyBob2xkaW5nIHRoZWlyIHBvaW50ZXIuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSEVBREVSX1NDUk9MTF9JTlRFUlZBTCA9IDEwMDsKICAgIC8qKgogICAgICogQmFzZSBjbGFzcyBmb3IgYSB0YWIgaGVhZGVyIHRoYXQgc3VwcG9ydGVkIHBhZ2luYXRpb24uCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIE1hdFBhZ2luYXRlZFRhYkhlYWRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7Pz19IF9wbGF0Zm9ybQogICAgICAgICAqIEBwYXJhbSB7Pz19IF9hbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgX3ZpZXdwb3J0UnVsZXIsIF9kaXIsIF9uZ1pvbmUsIF9wbGF0Zm9ybSwgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uTW9kZSA9IF9hbmltYXRpb25Nb2RlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGRpc3RhbmNlIGluIHBpeGVscyB0aGF0IHRoZSB0YWIgbGFiZWxzIHNob3VsZCBiZSB0cmFuc2xhdGVkIHRvIHRoZSBsZWZ0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlzdGFuY2UgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgaGVhZGVyIHNob3VsZCBzY3JvbGwgdG8gdGhlIHNlbGVjdGVkIGluZGV4IGFmdGVyIHRoZSB2aWV3IGhhcyBiZWVuIGNoZWNrZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IGlzIGRlc3Ryb3llZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjb250cm9scyBmb3IgcGFnaW5hdGlvbiBzaG91bGQgYmUgZGlzcGxheWVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSB0YWIgbGlzdCBjYW4gYmUgc2Nyb2xsZWQgbW9yZSB0b3dhcmRzIHRoZSBlbmQgb2YgdGhlIHRhYiBsYWJlbCBsaXN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyID0gdHJ1ZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIHRhYiBsaXN0IGNhbiBiZSBzY3JvbGxlZCBtb3JlIHRvd2FyZHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFiIGxhYmVsIGxpc3QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlU2Nyb2xsQmVmb3JlID0gdHJ1ZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN0cmVhbSB0aGF0IHdpbGwgc3RvcCB0aGUgYXV0b21hdGVkIHNjcm9sbGluZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3N0b3BTY3JvbGxpbmcgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBwYWdpbmF0aW9uIHNob3VsZCBiZSBkaXNhYmxlZC4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCB1bm5lY2Vzc2FyeQogICAgICAgICAgICAgKiBsYXlvdXQgcmVjYWxjdWxhdGlvbnMgaWYgaXQncyBrbm93biB0aGF0IHBhZ2luYXRpb24gd29uJ3QgYmUgcmVxdWlyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRpc2FibGVQYWdpbmF0aW9uID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkSW5kZXggPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBvcHRpb24gaXMgc2VsZWN0ZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNlbGVjdEZvY3VzZWRJbmRleCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiBhIGxhYmVsIGlzIGZvY3VzZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmluZGV4Rm9jdXNlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLy8gQmluZCB0aGUgYG1vdXNlbGVhdmVgIGV2ZW50IG9uIHRoZSBvdXRzaWRlIHNpbmNlIGl0IGRvZXNuJ3QgY2hhbmdlIGFueXRoaW5nIGluIHRoZSB2aWV3LgogICAgICAgICAgICBfbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGZyb21FdmVudChfZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnbW91c2VsZWF2ZScpCiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpCiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc3RvcEludGVydmFsKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGluZGV4IG9mIHRoZSBhY3RpdmUgdGFiLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkSW5kZXgoKSB7IHJldHVybiB0aGlzLl9zZWxlY3RlZEluZGV4OyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHNlbGVjdGVkSW5kZXgodmFsdWUpIHsKICAgICAgICAgICAgdmFsdWUgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3RlZEluZGV4ICE9IHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4ID0gdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fa2V5TWFuYWdlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSh2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyVmlld0luaXQoKSB7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gaGFuZGxlIHRoZXNlIGV2ZW50cyBtYW51YWxseSwgYmVjYXVzZSB3ZSB3YW50IHRvIGJpbmQgcGFzc2l2ZSBldmVudCBsaXN0ZW5lcnMuCiAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLl9wcmV2aW91c1BhZ2luYXRvci5uYXRpdmVFbGVtZW50LCAndG91Y2hzdGFydCcsIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucykKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9oYW5kbGVQYWdpbmF0b3JQcmVzcygnYmVmb3JlJyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgZnJvbUV2ZW50KHRoaXMuX25leHRQYWdpbmF0b3IubmF0aXZlRWxlbWVudCwgJ3RvdWNoc3RhcnQnLCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMpCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5faGFuZGxlUGFnaW5hdG9yUHJlc3MoJ2FmdGVyJyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyQ2hhbmdlID0gdGhpcy5fZGlyID8gdGhpcy5fZGlyLmNoYW5nZSA6IG9mKG51bGwpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZSA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKDE1MCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVhbGlnbiA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlUGFnaW5hdGlvbigpOwogICAgICAgICAgICAgICAgdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLl9pdGVtcykKICAgICAgICAgICAgICAgIC53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2dldExheW91dERpcmVjdGlvbigpKQogICAgICAgICAgICAgICAgLndpdGhXcmFwKCk7CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbSgwKTsKICAgICAgICAgICAgLy8gRGVmZXIgdGhlIGZpcnN0IGNhbGwgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIHNsb3dlciBicm93c2VycyB0byBsYXkgb3V0IHRoZSBlbGVtZW50cy4KICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBpbiBjYXNlcyB3aGVyZSB0aGUgdXNlciBsYW5kcyBkaXJlY3RseSBvbiBhIHBhZ2Ugd2l0aCBwYWdpbmF0ZWQgdGFicy4KICAgICAgICAgICAgdHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSAhPT0gJ3VuZGVmaW5lZCcgPyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUocmVhbGlnbikgOiByZWFsaWduKCk7CiAgICAgICAgICAgIC8vIE9uIGRpciBjaGFuZ2Ugb3Igd2luZG93IHJlc2l6ZSwgcmVhbGlnbiB0aGUgaW5rIGJhciBhbmQgdXBkYXRlIHRoZSBvcmllbnRhdGlvbiBvZgogICAgICAgICAgICAvLyB0aGUga2V5IG1hbmFnZXIgaWYgdGhlIGRpcmVjdGlvbiBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgbWVyZ2UoZGlyQ2hhbmdlLCByZXNpemUsIHRoaXMuX2l0ZW1zLmNoYW5nZXMpLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoaXMgdG8gZ2l2ZSB0aGUgYnJvd3NlciBzb21lIHRpbWUgdG8gcmVjYWxjdWxhdGUgdGhlIGVsZW1lbnQgZGltZW5zaW9ucy4KICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4ocmVhbGlnbik7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgY2hhbmdlIGluIHRoZSBmb2N1cyBrZXkgbWFuYWdlciB3ZSBuZWVkIHRvIGVtaXQgdGhlIGBpbmRleEZvY3VzZWRgCiAgICAgICAgICAgIC8vIGV2ZW50IGluIG9yZGVyIHRvIHByb3ZpZGUgYSBwdWJsaWMgZXZlbnQgdGhhdCBub3RpZmllcyBhYm91dCBmb2N1cyBjaGFuZ2VzLiBBbHNvIHdlIHJlYWxpZ24KICAgICAgICAgICAgLy8gdGhlIHRhYnMgY29udGFpbmVyIGJ5IHNjcm9sbGluZyB0aGUgbmV3IGZvY3VzZWQgdGFiIGludG8gdGhlIHZpc2libGUgc2VjdGlvbi4KICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuZXdGb2N1c0luZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuZXdGb2N1c0luZGV4ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuaW5kZXhGb2N1c2VkLmVtaXQobmV3Rm9jdXNJbmRleCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUYWJGb2N1cyhuZXdGb2N1c0luZGV4KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBvZiB0YWIgbGFiZWxzIGhhdmUgY2hhbmdlZCwgY2hlY2sgaWYgc2Nyb2xsaW5nIHNob3VsZCBiZSBlbmFibGVkCiAgICAgICAgICAgIGlmICh0aGlzLl90YWJMYWJlbENvdW50ICE9IHRoaXMuX2l0ZW1zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7CiAgICAgICAgICAgICAgICB0aGlzLl90YWJMYWJlbENvdW50ID0gdGhpcy5faXRlbXMubGVuZ3RoOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIHNlbGVjdGVkIGluZGV4IGhhcyBjaGFuZ2VkLCBzY3JvbGwgdG8gdGhlIGxhYmVsIGFuZCBjaGVjayBpZiB0aGUgc2Nyb2xsaW5nIGNvbnRyb2xzCiAgICAgICAgICAgIC8vIHNob3VsZCBiZSBkaXNhYmxlZC4KICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkSW5kZXhDaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb0xhYmVsKHRoaXMuX3NlbGVjdGVkSW5kZXgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpOwogICAgICAgICAgICAgICAgdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZEluZGV4Q2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIHNjcm9sbCBkaXN0YW5jZSBoYXMgYmVlbiBjaGFuZ2VkICh0YWIgc2VsZWN0ZWQsIGZvY3VzZWQsIHNjcm9sbCBjb250cm9scyBhY3RpdmF0ZWQpLAogICAgICAgICAgICAvLyB0aGVuIHRyYW5zbGF0ZSB0aGUgaGVhZGVyIHRvIHJlZmxlY3QgdGhpcy4KICAgICAgICAgICAgaWYgKHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGFiU2Nyb2xsUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX3N0b3BTY3JvbGxpbmcuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlcyBrZXlib2FyZCBldmVudHMgb24gdGhlIGhlYWRlci4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFuZGxlS2V5ZG93bihldmVudCkgewogICAgICAgICAgICAvLyBXZSBkb24ndCBoYW5kbGUgYW55IGtleSBiaW5kaW5ncyB3aXRoIGEgbW9kaWZpZXIga2V5LgogICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlIEhPTUU6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBFTkQ6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIEVOVEVSOgogICAgICAgICAgICAgICAgY2FzZSBTUEFDRToKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5mb2N1c0luZGV4ICE9PSB0aGlzLnNlbGVjdGVkSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RGb2N1c2VkSW5kZXguZW1pdCh0aGlzLmZvY3VzSW5kZXgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pdGVtU2VsZWN0ZWQoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5vbktleWRvd24oZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIGZvciB3aGVuIHRoZSBNdXRhdGlvbk9ic2VydmVyIGRldGVjdHMgdGhhdCB0aGUgY29udGVudCBoYXMgY2hhbmdlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbkNvbnRlbnRDaGFuZ2VzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRleHRDb250ZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnRleHRDb250ZW50OwogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRpZmYgdGhlIHRleHQgY29udGVudCBvZiB0aGUgaGVhZGVyLCBiZWNhdXNlIHRoZSBNdXRhdGlvbk9ic2VydmVyIGNhbGxiYWNrCiAgICAgICAgICAgIC8vIHdpbGwgZmlyZSBldmVuIGlmIHRoZSB0ZXh0IGNvbnRlbnQgZGlkbid0IGNoYW5nZSB3aGljaCBpcyBpbmVmZmljaWVudCBhbmQgaXMgcHJvbmUKICAgICAgICAgICAgLy8gdG8gaW5maW5pdGUgbG9vcHMgaWYgYSBwb29ybHkgY29uc3RydWN0ZWQgZXhwcmVzc2lvbiBpcyBwYXNzZWQgaW4gKHNlZSAjMTQyNDkpLgogICAgICAgICAgICBpZiAodGV4dENvbnRlbnQgIT09IHRoaXMuX2N1cnJlbnRUZXh0Q29udGVudCkgewogICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRleHRDb250ZW50ID0gdGV4dENvbnRlbnQgfHwgJyc7CiAgICAgICAgICAgICAgICAvLyBUaGUgY29udGVudCBvYnNlcnZlciBydW5zIG91dHNpZGUgdGhlIGBOZ1pvbmVgIGJ5IGRlZmF1bHQsIHdoaWNoCiAgICAgICAgICAgICAgICAvLyBtZWFucyB0aGF0IHdlIG5lZWQgdG8gYnJpbmcgdGhlIGNhbGxiYWNrIGJhY2sgaW4gb3Vyc2VsdmVzLgogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQYWdpbmF0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgdmlldyB3aGV0aGVyIHBhZ2luYXRpb24gc2hvdWxkIGJlIGVuYWJsZWQgb3Igbm90LgogICAgICAgICAqCiAgICAgICAgICogV0FSTklORzogQ2FsbGluZyB0aGlzIG1ldGhvZCBjYW4gYmUgdmVyeSBjb3N0bHkgaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UuIEl0IHNob3VsZCBiZSBjYWxsZWQKICAgICAgICAgKiBhcyBpbmZyZXF1ZW50bHkgYXMgcG9zc2libGUgZnJvbSBvdXRzaWRlIG9mIHRoZSBUYWJzIGNvbXBvbmVudCBhcyBpdCBjYXVzZXMgYSByZWZsb3cgb2YgdGhlCiAgICAgICAgICogcGFnZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBhZ2luYXRpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKTsKICAgICAgICAgICAgdGhpcy5fY2hlY2tTY3JvbGxpbmdDb250cm9scygpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVUYWJTY3JvbGxQb3NpdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmFja3Mgd2hpY2ggZWxlbWVudCBoYXMgZm9jdXM7IHVzZWQgZm9yIGtleWJvYXJkIG5hdmlnYXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb2N1c0luZGV4KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5TWFuYWdlciA/ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW1JbmRleCkpIDogMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiB0aGUgZm9jdXMgaW5kZXggaXMgc2V0LCB3ZSBtdXN0IG1hbnVhbGx5IHNlbmQgZm9jdXMgdG8gdGhlIGNvcnJlY3QgbGFiZWwKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZm9jdXNJbmRleCh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2lzVmFsaWRJbmRleCh2YWx1ZSkgfHwgdGhpcy5mb2N1c0luZGV4ID09PSB2YWx1ZSB8fCAhdGhpcy5fa2V5TWFuYWdlcikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgaWYgYW4gaW5kZXggaXMgdmFsaWQuICBJZiB0aGUgdGFicyBhcmUgbm90IHJlYWR5IHlldCwgd2UgYXNzdW1lIHRoYXQgdGhlIHVzZXIgaXMKICAgICAgICAgKiBwcm92aWRpbmcgYSB2YWxpZCBpbmRleCBhbmQgcmV0dXJuIHRydWUuCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2lzVmFsaWRJbmRleChpbmRleCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRhYiA9IHRoaXMuX2l0ZW1zID8gdGhpcy5faXRlbXMudG9BcnJheSgpW2luZGV4XSA6IG51bGw7CiAgICAgICAgICAgIHJldHVybiAhIXRhYiAmJiAhdGFiLmRpc2FibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGZvY3VzIG9uIHRoZSBIVE1MIGVsZW1lbnQgZm9yIHRoZSBsYWJlbCB3cmFwcGVyIGFuZCBzY3JvbGxzIGl0IGludG8gdGhlIHZpZXcgaWYKICAgICAgICAgKiBzY3JvbGxpbmcgaXMgZW5hYmxlZC4KICAgICAgICAgKiBAcGFyYW0gez99IHRhYkluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VGFiRm9jdXModGFiSW5kZXgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Nob3dQYWdpbmF0aW9uQ29udHJvbHMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvTGFiZWwodGFiSW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9pdGVtcyAmJiB0aGlzLl9pdGVtcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2l0ZW1zLnRvQXJyYXkoKVt0YWJJbmRleF0uZm9jdXMoKTsKICAgICAgICAgICAgICAgIC8vIERvIG5vdCBsZXQgdGhlIGJyb3dzZXIgbWFuYWdlIHNjcm9sbGluZyB0byBmb2N1cyB0aGUgZWxlbWVudCwgdGhpcyB3aWxsIGJlIGhhbmRsZWQKICAgICAgICAgICAgICAgIC8vIGJ5IHVzaW5nIHRyYW5zbGF0aW9uLiBJbiBMVFIsIHRoZSBzY3JvbGwgbGVmdCBzaG91bGQgYmUgMC4gSW4gUlRMLCB0aGUgc2Nyb2xsIHdpZHRoCiAgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgdGhlIGZ1bGwgd2lkdGggbWludXMgdGhlIG9mZnNldCB3aWR0aC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckVsID0gdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGlyID0gdGhpcy5fZ2V0TGF5b3V0RGlyZWN0aW9uKCk7CiAgICAgICAgICAgICAgICBpZiAoZGlyID09ICdsdHInKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyRWwuc2Nyb2xsTGVmdCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250YWluZXJFbC5zY3JvbGxMZWZ0ID0gY29udGFpbmVyRWwuc2Nyb2xsV2lkdGggLSBjb250YWluZXJFbC5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGF5b3V0IGRpcmVjdGlvbiBvZiB0aGUgY29udGFpbmluZyBhcHAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0TGF5b3V0RGlyZWN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZGlyICYmIHRoaXMuX2Rpci52YWx1ZSA9PT0gJ3J0bCcgPyAncnRsJyA6ICdsdHInOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQZXJmb3JtcyB0aGUgQ1NTIHRyYW5zZm9ybWF0aW9uIG9uIHRoZSB0YWIgbGlzdCB0aGF0IHdpbGwgY2F1c2UgdGhlIGxpc3QgdG8gc2Nyb2xsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVRhYlNjcm9sbFBvc2l0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlUGFnaW5hdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsRGlzdGFuY2UgPSB0aGlzLnNjcm9sbERpc3RhbmNlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBsYXRmb3JtID0gdGhpcy5fcGxhdGZvcm07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdHJhbnNsYXRlWCA9IHRoaXMuX2dldExheW91dERpcmVjdGlvbigpID09PSAnbHRyJyA/IC1zY3JvbGxEaXN0YW5jZSA6IHNjcm9sbERpc3RhbmNlOwogICAgICAgICAgICAvLyBEb24ndCB1c2UgYHRyYW5zbGF0ZTNkYCBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBjcmVhdGUgYSBuZXcgbGF5ZXIuIEEgbmV3IGxheWVyCiAgICAgICAgICAgIC8vIHNlZW1zIHRvIGNhdXNlIGZsaWNrZXJpbmcgYW5kIG92ZXJmbG93IGluIEludGVybmV0IEV4cGxvcmVyLiBGb3IgZXhhbXBsZSwgdGhlIGluayBiYXIKICAgICAgICAgICAgLy8gYW5kIHJpcHBsZXMgd2lsbCBleGNlZWQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIHZpc2libGUgdGFiIGJhci4KICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xMDI3NgogICAgICAgICAgICAvLyBXZSByb3VuZCB0aGUgYHRyYW5zZm9ybWAgaGVyZSwgYmVjYXVzZSB0cmFuc2Zvcm1zIHdpdGggc3ViLXBpeGVsIHByZWNpc2lvbiBjYXVzZSBzb21lCiAgICAgICAgICAgIC8vIGJyb3dzZXJzIHRvIGJsdXIgdGhlIGNvbnRlbnQgb2YgdGhlIGVsZW1lbnQuCiAgICAgICAgICAgIHRoaXMuX3RhYkxpc3QubmF0aXZlRWxlbWVudC5zdHlsZS50cmFuc2Zvcm0gPSBgdHJhbnNsYXRlWCgke01hdGgucm91bmQodHJhbnNsYXRlWCl9cHgpYDsKICAgICAgICAgICAgLy8gU2V0dGluZyB0aGUgYHRyYW5zZm9ybWAgb24gSUUgd2lsbCBjaGFuZ2UgdGhlIHNjcm9sbCBvZmZzZXQgb2YgdGhlIHBhcmVudCwgY2F1c2luZyB0aGUKICAgICAgICAgICAgLy8gcG9zaXRpb24gdG8gYmUgdGhyb3duIG9mZiBpbiBzb21lIGNhc2VzLiBXZSBoYXZlIHRvIHJlc2V0IGl0IG91cnNlbHZlcyB0byBlbnN1cmUgdGhhdAogICAgICAgICAgICAvLyBpdCBkb2Vzbid0IGdldCB0aHJvd24gb2ZmLiBOb3RlIHRoYXQgd2Ugc2NvcGUgaXQgb25seSB0byBJRSBhbmQgRWRnZSwgYmVjYXVzZSBtZXNzaW5nCiAgICAgICAgICAgIC8vIHdpdGggdGhlIHNjcm9sbCBwb3NpdGlvbiB0aHJvd3Mgb2ZmIENocm9tZSA3MSsgaW4gUlRMIG1vZGUgKHNlZSAjMTQ2ODkpLgogICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDkuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgcGxhdGZvcm1gIGFmdGVyIGl0IGNhbiBubyBsb25nZXIgYmUgdW5kZWZpbmVkLgogICAgICAgICAgICBpZiAocGxhdGZvcm0gJiYgKHBsYXRmb3JtLlRSSURFTlQgfHwgcGxhdGZvcm0uRURHRSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5zY3JvbGxMZWZ0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkaXN0YW5jZSBpbiBwaXhlbHMgdGhhdCB0aGUgdGFiIGhlYWRlciBzaG91bGQgYmUgdHJhbnNmb3JtZWQgaW4gdGhlIFgtYXhpcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzY3JvbGxEaXN0YW5jZSgpIHsgcmV0dXJuIHRoaXMuX3Njcm9sbERpc3RhbmNlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHNjcm9sbERpc3RhbmNlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZXMgdGhlIHRhYiBsaXN0IGluIHRoZSAnYmVmb3JlJyBvciAnYWZ0ZXInIGRpcmVjdGlvbiAodG93YXJkcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0IG9yCiAgICAgICAgICogdGhlIGVuZCBvZiB0aGUgbGlzdCwgcmVzcGVjdGl2ZWx5KS4gVGhlIGRpc3RhbmNlIHRvIHNjcm9sbCBpcyBjb21wdXRlZCB0byBiZSBhIHRoaXJkIG9mIHRoZQogICAgICAgICAqIGxlbmd0aCBvZiB0aGUgdGFiIGxpc3QgdmlldyB3aW5kb3cuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIGlzIGFuIGV4cGVuc2l2ZSBjYWxsIHRoYXQgZm9yY2VzIGEgbGF5b3V0IHJlZmxvdyB0byBjb21wdXRlIGJveCBhbmQgc2Nyb2xsIG1ldHJpY3MgYW5kCiAgICAgICAgICogc2hvdWxkIGJlIGNhbGxlZCBzcGFyaW5nbHkuCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zY3JvbGxIZWFkZXIoZGlyZWN0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgdmlld0xlbmd0aCA9IHRoaXMuX3RhYkxpc3RDb250YWluZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgLy8gTW92ZSB0aGUgc2Nyb2xsIGRpc3RhbmNlIG9uZS10aGlyZCB0aGUgbGVuZ3RoIG9mIHRoZSB0YWIgbGlzdCdzIHZpZXdwb3J0LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNjcm9sbEFtb3VudCA9IChkaXJlY3Rpb24gPT0gJ2JlZm9yZScgPyAtMSA6IDEpICogdmlld0xlbmd0aCAvIDM7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zY3JvbGxUbyh0aGlzLl9zY3JvbGxEaXN0YW5jZSArIHNjcm9sbEFtb3VudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBwYWdpbmF0aW9uIGFycm93cy4KICAgICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZVBhZ2luYXRvckNsaWNrKGRpcmVjdGlvbikgewogICAgICAgICAgICB0aGlzLl9zdG9wSW50ZXJ2YWwoKTsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsSGVhZGVyKGRpcmVjdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIHRoZSB0YWIgbGlzdCBzdWNoIHRoYXQgdGhlIGRlc2lyZWQgdGFiIGxhYmVsIChtYXJrZWQgYnkgaW5kZXgpIGlzIG1vdmVkIGludG8gdmlldy4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgaXMgYW4gZXhwZW5zaXZlIGNhbGwgdGhhdCBmb3JjZXMgYSBsYXlvdXQgcmVmbG93IHRvIGNvbXB1dGUgYm94IGFuZCBzY3JvbGwgbWV0cmljcyBhbmQKICAgICAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHNwYXJpbmdseS4KICAgICAgICAgKiBAcGFyYW0gez99IGxhYmVsSW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zY3JvbGxUb0xhYmVsKGxhYmVsSW5kZXgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZVBhZ2luYXRpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkTGFiZWwgPSB0aGlzLl9pdGVtcyA/IHRoaXMuX2l0ZW1zLnRvQXJyYXkoKVtsYWJlbEluZGV4XSA6IG51bGw7CiAgICAgICAgICAgIGlmICghc2VsZWN0ZWRMYWJlbCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSB2aWV3IGxlbmd0aCBpcyB0aGUgdmlzaWJsZSB3aWR0aCBvZiB0aGUgdGFiIGxhYmVscy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3TGVuZ3RoID0gdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgICAgICBjb25zdCB7IG9mZnNldExlZnQsIG9mZnNldFdpZHRoIH0gPSBzZWxlY3RlZExhYmVsLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbGFiZWxCZWZvcmVQb3M7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGxhYmVsQWZ0ZXJQb3M7CiAgICAgICAgICAgIGlmICh0aGlzLl9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PSAnbHRyJykgewogICAgICAgICAgICAgICAgbGFiZWxCZWZvcmVQb3MgPSBvZmZzZXRMZWZ0OwogICAgICAgICAgICAgICAgbGFiZWxBZnRlclBvcyA9IGxhYmVsQmVmb3JlUG9zICsgb2Zmc2V0V2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBsYWJlbEFmdGVyUG9zID0gdGhpcy5fdGFiTGlzdC5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIC0gb2Zmc2V0TGVmdDsKICAgICAgICAgICAgICAgIGxhYmVsQmVmb3JlUG9zID0gbGFiZWxBZnRlclBvcyAtIG9mZnNldFdpZHRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVmb3JlVmlzaWJsZVBvcyA9IHRoaXMuc2Nyb2xsRGlzdGFuY2U7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWZ0ZXJWaXNpYmxlUG9zID0gdGhpcy5zY3JvbGxEaXN0YW5jZSArIHZpZXdMZW5ndGg7CiAgICAgICAgICAgIGlmIChsYWJlbEJlZm9yZVBvcyA8IGJlZm9yZVZpc2libGVQb3MpIHsKICAgICAgICAgICAgICAgIC8vIFNjcm9sbCBoZWFkZXIgdG8gbW92ZSBsYWJlbCB0byB0aGUgYmVmb3JlIGRpcmVjdGlvbgogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxEaXN0YW5jZSAtPSBiZWZvcmVWaXNpYmxlUG9zIC0gbGFiZWxCZWZvcmVQb3MgKyBFWEFHR0VSQVRFRF9PVkVSU0NST0xMOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGxhYmVsQWZ0ZXJQb3MgPiBhZnRlclZpc2libGVQb3MpIHsKICAgICAgICAgICAgICAgIC8vIFNjcm9sbCBoZWFkZXIgdG8gbW92ZSBsYWJlbCB0byB0aGUgYWZ0ZXIgZGlyZWN0aW9uCiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbERpc3RhbmNlICs9IGxhYmVsQWZ0ZXJQb3MgLSBhZnRlclZpc2libGVQb3MgKyBFWEFHR0VSQVRFRF9PVkVSU0NST0xMOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEV2YWx1YXRlIHdoZXRoZXIgdGhlIHBhZ2luYXRpb24gY29udHJvbHMgc2hvdWxkIGJlIGRpc3BsYXllZC4gSWYgdGhlIHNjcm9sbCB3aWR0aCBvZiB0aGUKICAgICAgICAgKiB0YWIgbGlzdCBpcyB3aWRlciB0aGFuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgY29udGFpbmVyLCB0aGVuIHRoZSBwYWdpbmF0aW9uIGNvbnRyb2xzIHNob3VsZAogICAgICAgICAqIGJlIHNob3duLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgY2FsbCB0aGF0IGZvcmNlcyBhIGxheW91dCByZWZsb3cgdG8gY29tcHV0ZSBib3ggYW5kIHNjcm9sbCBtZXRyaWNzIGFuZAogICAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgc3BhcmluZ2x5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrUGFnaW5hdGlvbkVuYWJsZWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVQYWdpbmF0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zaG93UGFnaW5hdGlvbkNvbnRyb2xzID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc0VuYWJsZWQgPSB0aGlzLl90YWJMaXN0Lm5hdGl2ZUVsZW1lbnQuc2Nyb2xsV2lkdGggPiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgICAgICBpZiAoIWlzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2Nyb2xsRGlzdGFuY2UgPSAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzRW5hYmxlZCAhPT0gdGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fc2hvd1BhZ2luYXRpb25Db250cm9scyA9IGlzRW5hYmxlZDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFdmFsdWF0ZSB3aGV0aGVyIHRoZSBiZWZvcmUgYW5kIGFmdGVyIGNvbnRyb2xzIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkLgogICAgICAgICAqIElmIHRoZSBoZWFkZXIgaXMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdCAoc2Nyb2xsIGRpc3RhbmNlIGlzIGVxdWFsIHRvIDApIHRoZW4gZGlzYWJsZSB0aGUKICAgICAgICAgKiBiZWZvcmUgYnV0dG9uLiBJZiB0aGUgaGVhZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgKHNjcm9sbCBkaXN0YW5jZSBpcyBlcXVhbCB0byB0aGUKICAgICAgICAgKiBtYXhpbXVtIGRpc3RhbmNlIHdlIGNhbiBzY3JvbGwpLCB0aGVuIGRpc2FibGUgdGhlIGFmdGVyIGJ1dHRvbi4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgaXMgYW4gZXhwZW5zaXZlIGNhbGwgdGhhdCBmb3JjZXMgYSBsYXlvdXQgcmVmbG93IHRvIGNvbXB1dGUgYm94IGFuZCBzY3JvbGwgbWV0cmljcyBhbmQKICAgICAgICAgKiBzaG91bGQgYmUgY2FsbGVkIHNwYXJpbmdseS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja1Njcm9sbGluZ0NvbnRyb2xzKCkgewogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlUGFnaW5hdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fZGlzYWJsZVNjcm9sbEFmdGVyID0gdGhpcy5fZGlzYWJsZVNjcm9sbEJlZm9yZSA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGUgcGFnaW5hdGlvbiBhcnJvd3Mgc2hvdWxkIGJlIGFjdGl2YXRlZC4KICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVTY3JvbGxCZWZvcmUgPSB0aGlzLnNjcm9sbERpc3RhbmNlID09IDA7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlU2Nyb2xsQWZ0ZXIgPSB0aGlzLnNjcm9sbERpc3RhbmNlID09IHRoaXMuX2dldE1heFNjcm9sbERpc3RhbmNlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoYXQgaXMgdGhlIG1heGltdW0gbGVuZ3RoIGluIHBpeGVscyB0aGF0IGNhbiBiZSBzZXQgZm9yIHRoZSBzY3JvbGwgZGlzdGFuY2UuIFRoaXMKICAgICAgICAgKiBpcyBlcXVhbCB0byB0aGUgZGlmZmVyZW5jZSBpbiB3aWR0aCBiZXR3ZWVuIHRoZSB0YWIgbGlzdCBjb250YWluZXIgYW5kIHRhYiBoZWFkZXIgY29udGFpbmVyLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyBhbiBleHBlbnNpdmUgY2FsbCB0aGF0IGZvcmNlcyBhIGxheW91dCByZWZsb3cgdG8gY29tcHV0ZSBib3ggYW5kIHNjcm9sbCBtZXRyaWNzIGFuZAogICAgICAgICAqIHNob3VsZCBiZSBjYWxsZWQgc3BhcmluZ2x5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE1heFNjcm9sbERpc3RhbmNlKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxlbmd0aE9mVGFiTGlzdCA9IHRoaXMuX3RhYkxpc3QubmF0aXZlRWxlbWVudC5zY3JvbGxXaWR0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3TGVuZ3RoID0gdGhpcy5fdGFiTGlzdENvbnRhaW5lci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoOwogICAgICAgICAgICByZXR1cm4gKGxlbmd0aE9mVGFiTGlzdCAtIHZpZXdMZW5ndGgpIHx8IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRlbGxzIHRoZSBpbmstYmFyIHRvIGFsaWduIGl0c2VsZiB0byB0aGUgY3VycmVudCBsYWJlbCB3cmFwcGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWxpZ25JbmtCYXJUb1NlbGVjdGVkVGFiKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkSXRlbSA9IHRoaXMuX2l0ZW1zICYmIHRoaXMuX2l0ZW1zLmxlbmd0aCA/CiAgICAgICAgICAgICAgICB0aGlzLl9pdGVtcy50b0FycmF5KClbdGhpcy5zZWxlY3RlZEluZGV4XSA6IG51bGw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRMYWJlbFdyYXBwZXIgPSBzZWxlY3RlZEl0ZW0gPyBzZWxlY3RlZEl0ZW0uZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IDogbnVsbDsKICAgICAgICAgICAgaWYgKHNlbGVjdGVkTGFiZWxXcmFwcGVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbmtCYXIuYWxpZ25Ub0VsZW1lbnQoc2VsZWN0ZWRMYWJlbFdyYXBwZXIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5faW5rQmFyLmhpZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdG9wcyB0aGUgY3VycmVudGx5LXJ1bm5pbmcgcGFnaW5hdG9yIGludGVydmFsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N0b3BJbnRlcnZhbCgpIHsKICAgICAgICAgICAgdGhpcy5fc3RvcFNjcm9sbGluZy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgdGhlIHVzZXIgcHJlc3NpbmcgZG93biBvbiBvbmUgb2YgdGhlIHBhZ2luYXRvcnMuCiAgICAgICAgICogU3RhcnRzIHNjcm9sbGluZyB0aGUgaGVhZGVyIGFmdGVyIGEgY2VydGFpbiBhbW91bnQgb2YgdGltZS4KICAgICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGlvbiBJbiB3aGljaCBkaXJlY3Rpb24gdGhlIHBhZ2luYXRvciBzaG91bGQgYmUgc2Nyb2xsZWQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gbW91c2VFdmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZVBhZ2luYXRvclByZXNzKGRpcmVjdGlvbiwgbW91c2VFdmVudCkgewogICAgICAgICAgICAvLyBEb24ndCBzdGFydCBhdXRvIHNjcm9sbGluZyBmb3IgcmlnaHQgbW91c2UgYnV0dG9uIGNsaWNrcy4gTm90ZSB0aGF0IHdlIHNob3VsZG4ndCBoYXZlIHRvCiAgICAgICAgICAgIC8vIG51bGwgY2hlY2sgdGhlIGBidXR0b25gLCBidXQgd2UgZG8gaXQgc28gd2UgZG9uJ3QgYnJlYWsgdGVzdHMgdGhhdCB1c2UgZmFrZSBldmVudHMuCiAgICAgICAgICAgIGlmIChtb3VzZUV2ZW50ICYmIG1vdXNlRXZlbnQuYnV0dG9uICE9IG51bGwgJiYgbW91c2VFdmVudC5idXR0b24gIT09IDApIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBdm9pZCBvdmVybGFwcGluZyB0aW1lcnMuCiAgICAgICAgICAgIHRoaXMuX3N0b3BJbnRlcnZhbCgpOwogICAgICAgICAgICAvLyBTdGFydCBhIHRpbWVyIGFmdGVyIHRoZSBkZWxheSBhbmQga2VlcCBmaXJpbmcgYmFzZWQgb24gdGhlIGludGVydmFsLgogICAgICAgICAgICB0aW1lcihIRUFERVJfU0NST0xMX0RFTEFZLCBIRUFERVJfU0NST0xMX0lOVEVSVkFMKQogICAgICAgICAgICAgICAgLy8gS2VlcCB0aGUgdGltZXIgZ29pbmcgdW50aWwgc29tZXRoaW5nIHRlbGxzIGl0IHRvIHN0b3Agb3IgdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwobWVyZ2UodGhpcy5fc3RvcFNjcm9sbGluZywgdGhpcy5fZGVzdHJveWVkKSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgbWF4U2Nyb2xsRGlzdGFuY2UsIGRpc3RhbmNlIH0gPSB0aGlzLl9zY3JvbGxIZWFkZXIoZGlyZWN0aW9uKTsKICAgICAgICAgICAgICAgIC8vIFN0b3AgdGhlIHRpbWVyIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIHN0YXJ0IG9yIHRoZSBlbmQuCiAgICAgICAgICAgICAgICBpZiAoZGlzdGFuY2UgPT09IDAgfHwgZGlzdGFuY2UgPj0gbWF4U2Nyb2xsRGlzdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zdG9wSW50ZXJ2YWwoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTY3JvbGxzIHRoZSBoZWFkZXIgdG8gYSBnaXZlbiBwb3NpdGlvbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24gUG9zaXRpb24gdG8gd2hpY2ggdG8gc2Nyb2xsLgogICAgICAgICAqIEByZXR1cm4gez99IEluZm9ybWF0aW9uIG9uIHRoZSBjdXJyZW50IHNjcm9sbCBkaXN0YW5jZSBhbmQgdGhlIG1heGltdW0uCiAgICAgICAgICovCiAgICAgICAgX3Njcm9sbFRvKHBvc2l0aW9uKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVQYWdpbmF0aW9uKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtYXhTY3JvbGxEaXN0YW5jZTogMCwgZGlzdGFuY2U6IDAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heFNjcm9sbERpc3RhbmNlID0gdGhpcy5fZ2V0TWF4U2Nyb2xsRGlzdGFuY2UoKTsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlzdGFuY2UgPSBNYXRoLm1heCgwLCBNYXRoLm1pbihtYXhTY3JvbGxEaXN0YW5jZSwgcG9zaXRpb24pKTsKICAgICAgICAgICAgLy8gTWFyayB0aGF0IHRoZSBzY3JvbGwgZGlzdGFuY2UgaGFzIGNoYW5nZWQgc28gdGhhdCBhZnRlciB0aGUgdmlldyBpcyBjaGVja2VkLCB0aGUgQ1NTCiAgICAgICAgICAgIC8vIHRyYW5zZm9ybWF0aW9uIGNhbiBtb3ZlIHRoZSBoZWFkZXIuCiAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpc3RhbmNlQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrU2Nyb2xsaW5nQ29udHJvbHMoKTsKICAgICAgICAgICAgcmV0dXJuIHsgbWF4U2Nyb2xsRGlzdGFuY2UsIGRpc3RhbmNlOiB0aGlzLl9zY3JvbGxEaXN0YW5jZSB9OwogICAgICAgIH0KICAgIH0KICAgIE1hdFBhZ2luYXRlZFRhYkhlYWRlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFBhZ2luYXRlZFRhYkhlYWRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRQYWdpbmF0ZWRUYWJIZWFkZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKICAgIE1hdFBhZ2luYXRlZFRhYkhlYWRlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRQYWdpbmF0ZWRUYWJIZWFkZXIsIGlucHV0czogeyBkaXNhYmxlUGFnaW5hdGlvbjogImRpc2FibGVQYWdpbmF0aW9uIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRQYWdpbmF0ZWRUYWJIZWFkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQogICAgXTsKICAgIE1hdFBhZ2luYXRlZFRhYkhlYWRlci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBkaXNhYmxlUGFnaW5hdGlvbjogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWItaGVhZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQmFzZSBjbGFzcyB3aXRoIGFsbCBvZiB0aGUgYE1hdFRhYkhlYWRlcmAgZnVuY3Rpb25hbGl0eS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNsYXNzLW5hbWUKICAgIGNsYXNzIF9NYXRUYWJIZWFkZXJCYXNlIGV4dGVuZHMgTWF0UGFnaW5hdGVkVGFiSGVhZGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3cG9ydFJ1bGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgCiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBgX2FuaW1hdGlvbk1vZGVgIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgICAgIGFuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgcmlwcGxlIGVmZmVjdCBpcyBkaXNhYmxlZCBvciBub3QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZVJpcHBsZSgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVSaXBwbGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZVJpcHBsZSh2YWx1ZSkgeyB0aGlzLl9kaXNhYmxlUmlwcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXRlbVNlbGVjdGVkKGV2ZW50KSB7CiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgfQogICAgfQogICAgX01hdFRhYkhlYWRlckJhc2UuybVmYWMgPSBmdW5jdGlvbiBfTWF0VGFiSGVhZGVyQmFzZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0VGFiSGVhZGVyQmFzZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld3BvcnRSdWxlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgX01hdFRhYkhlYWRlckJhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogX01hdFRhYkhlYWRlckJhc2UsIGlucHV0czogeyBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIgfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgX01hdFRhYkhlYWRlckJhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQogICAgXTsKICAgIF9NYXRUYWJIZWFkZXJCYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGRpc2FibGVSaXBwbGU6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBUaGUgaGVhZGVyIG9mIHRoZSB0YWIgZ3JvdXAgd2hpY2ggZGlzcGxheXMgYSBsaXN0IG9mIGFsbCB0aGUgdGFicyBpbiB0aGUgdGFiIGdyb3VwLiBJbmNsdWRlcwogICAgICogYW4gaW5rIGJhciB0aGF0IGZvbGxvd3MgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCB0YWIuIFdoZW4gdGhlIHRhYnMgbGlzdCdzIHdpZHRoIGV4Y2VlZHMgdGhlCiAgICAgKiB3aWR0aCBvZiB0aGUgaGVhZGVyIGNvbnRhaW5lciwgdGhlbiBhcnJvd3Mgd2lsbCBiZSBkaXNwbGF5ZWQgdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2Nyb2xsCiAgICAgKiBsZWZ0IGFuZCByaWdodCBhY3Jvc3MgdGhlIGhlYWRlci4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdFRhYkhlYWRlciBleHRlbmRzIF9NYXRUYWJIZWFkZXJCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3cG9ydFJ1bGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgCiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBgX2FuaW1hdGlvbk1vZGVgIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgICAgIGFuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7CiAgICAgICAgfQogICAgfQogICAgTWF0VGFiSGVhZGVyLsm1ZmFjID0gZnVuY3Rpb24gTWF0VGFiSGVhZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRhYkhlYWRlcikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld3BvcnRSdWxlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgTWF0VGFiSGVhZGVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFRhYkhlYWRlciwgc2VsZWN0b3JzOiBbWyJtYXQtdGFiLWhlYWRlciJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9Db250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJJbmRleCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdFRhYkxhYmVsV3JhcHBlciwgZmFsc2UpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2l0ZW1zID0gX3QpOwogICAgICAgIH0gfSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoTWF0SW5rQmFyLCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzUsIHRydWUpOwogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KF9jNiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2M3LCB0cnVlKTsKICAgICAgICAgICAgybXJtXZpZXdRdWVyeShfYzgsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2lua0JhciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGFiTGlzdENvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGFiTGlzdCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fbmV4dFBhZ2luYXRvciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcHJldmlvdXNQYWdpbmF0b3IgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LXRhYi1oZWFkZXIiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0VGFiSGVhZGVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIiwgY3R4Ll9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwgY3R4Ll9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PSAicnRsIik7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgc2VsZWN0ZWRJbmRleDogInNlbGVjdGVkSW5kZXgiIH0sIG91dHB1dHM6IHsgc2VsZWN0Rm9jdXNlZEluZGV4OiAic2VsZWN0Rm9jdXNlZEluZGV4IiwgaW5kZXhGb2N1c2VkOiAiaW5kZXhGb2N1c2VkIiB9LCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMCQzLCBkZWNsczogMTMsIHZhcnM6IDgsIGNvbnN0czogW1siYXJpYS1oaWRkZW4iLCAidHJ1ZSIsICJtYXQtcmlwcGxlIiwgIiIsIDEsICJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIiwgIm1hdC1lbGV2YXRpb24tejQiLCAzLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAiY2xpY2siLCAibW91c2Vkb3duIiwgInRvdWNoZW5kIl0sIFsicHJldmlvdXNQYWdpbmF0b3IiLCAiIl0sIFsxLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIl0sIFsxLCAibWF0LXRhYi1sYWJlbC1jb250YWluZXIiLCAzLCAia2V5ZG93biJdLCBbInRhYkxpc3RDb250YWluZXIiLCAiIl0sIFsicm9sZSIsICJ0YWJsaXN0IiwgMSwgIm1hdC10YWItbGlzdCIsIDMsICJjZGtPYnNlcnZlQ29udGVudCJdLCBbInRhYkxpc3QiLCAiIl0sIFsxLCAibWF0LXRhYi1sYWJlbHMiXSwgWyJhcmlhLWhpZGRlbiIsICJ0cnVlIiwgIm1hdC1yaXBwbGUiLCAiIiwgMSwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciIsICJtYXQtZWxldmF0aW9uLXo0IiwgMywgIm1hdFJpcHBsZURpc2FibGVkIiwgIm1vdXNlZG93biIsICJjbGljayIsICJ0b3VjaGVuZCJdLCBbIm5leHRQYWdpbmF0b3IiLCAiIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0VGFiSGVhZGVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9UZW1wbGF0ZV9kaXZfY2xpY2tfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImJlZm9yZSIpOyB9KSgibW91c2Vkb3duIiwgZnVuY3Rpb24gTWF0VGFiSGVhZGVyX1RlbXBsYXRlX2Rpdl9tb3VzZWRvd25fMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImJlZm9yZSIsICRldmVudCk7IH0pKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9UZW1wbGF0ZV9kaXZfdG91Y2hlbmRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5fc3RvcEludGVydmFsKCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDMsIDQpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X2tleWRvd25fM19saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlS2V5ZG93bigkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgNSwgNik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2RrT2JzZXJ2ZUNvbnRlbnQiLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X2Nka09ic2VydmVDb250ZW50XzVfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX29uQ29udGVudENoYW5nZXMoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIsIDcpOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbig4KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoOSwgIm1hdC1pbmstYmFyIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJkaXYiLCA4LCA5KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJtb3VzZWRvd24iLCBmdW5jdGlvbiBNYXRUYWJIZWFkZXJfVGVtcGxhdGVfZGl2X21vdXNlZG93bl8xMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImFmdGVyIiwgJGV2ZW50KTsgfSkoImNsaWNrIiwgZnVuY3Rpb24gTWF0VGFiSGVhZGVyX1RlbXBsYXRlX2Rpdl9jbGlja18xMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImFmdGVyIik7IH0pKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uIE1hdFRhYkhlYWRlcl9UZW1wbGF0ZV9kaXZfdG91Y2hlbmRfMTBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX3N0b3BJbnRlcnZhbCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMTIsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEJlZm9yZSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlRGlzYWJsZWQiLCBjdHguX2Rpc2FibGVTY3JvbGxCZWZvcmUgfHwgY3R4LmRpc2FibGVSaXBwbGUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCBjdHguX2FuaW1hdGlvbk1vZGUgPT09ICJOb29wQW5pbWF0aW9ucyIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEFmdGVyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJtYXRSaXBwbGVEaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEFmdGVyIHx8IGN0eC5kaXNhYmxlUmlwcGxlKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRSaXBwbGUsIENka09ic2VydmVDb250ZW50LCBNYXRJbmtCYXJdLCBzdHlsZXM6IFsiLm1hdC10YWItaGVhZGVye2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21pbi13aWR0aDozMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6Mjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dG91Y2gtYWN0aW9uOm5vbmV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntkaXNwbGF5OmZsZXh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1sZWZ0OjRweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLXJpZ2h0OjRweH0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjJweCAycHggMCAwO2NvbnRlbnQ6XCJcIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC1pbmstYmFye3Bvc2l0aW9uOmFic29sdXRlO2JvdHRvbTowO2hlaWdodDoycHg7dHJhbnNpdGlvbjo1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1pbmstYmFye3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXIgLm1hdC1pbmstYmFye2JvdHRvbTphdXRvO3RvcDowfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1pbmstYmFye291dGxpbmU6c29saWQgMnB4O2hlaWdodDowfS5tYXQtdGFiLWxhYmVsc3tkaXNwbGF5OmZsZXh9W21hdC1hbGlnbi10YWJzPWNlbnRlcl0+Lm1hdC10YWItaGVhZGVyIC5tYXQtdGFiLWxhYmVsc3tqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyfVttYXQtYWxpZ24tdGFicz1lbmRdPi5tYXQtdGFiLWhlYWRlciAubWF0LXRhYi1sYWJlbHN7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtdGFiLWxhYmVsLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXRhYi1saXN0e3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXRhYi1sYWJlbHtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweDtjdXJzb3I6cG9pbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7b3BhY2l0eTouNjttaW4td2lkdGg6MTYwcHg7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXA7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpub25lfS5tYXQtdGFiLWxhYmVsOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWw6Zm9jdXN7b3V0bGluZTpkb3R0ZWQgMnB4O291dGxpbmUtb2Zmc2V0Oi0ycHh9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1sYWJlbCAubWF0LXRhYi1sYWJlbC1jb250ZW50e2Rpc3BsYXk6aW5saW5lLWZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7d2hpdGUtc3BhY2U6bm93cmFwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGFiZWx7b3BhY2l0eToxfUBtZWRpYShtYXgtd2lkdGg6IDU5OXB4KXsubWF0LXRhYi1sYWJlbHttaW4td2lkdGg6NzJweH19XG4iXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0VGFiSGVhZGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KICAgIF07CiAgICBNYXRUYWJIZWFkZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgX2l0ZW1zOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRUYWJMYWJlbFdyYXBwZXIsIHsgZGVzY2VuZGFudHM6IGZhbHNlIH0sXSB9XSwKICAgICAgICBfaW5rQmFyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRJbmtCYXIsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgICAgICBfdGFiTGlzdENvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RhYkxpc3RDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgX3RhYkxpc3Q6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyd0YWJMaXN0JywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLAogICAgICAgIF9uZXh0UGFnaW5hdG9yOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnbmV4dFBhZ2luYXRvcicsXSB9XSwKICAgICAgICBfcHJldmlvdXNQYWdpbmF0b3I6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwcmV2aW91c1BhZ2luYXRvcicsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJzL3RhYi1uYXYtYmFyL3RhYi1uYXYtYmFyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQmFzZSBjbGFzcyB3aXRoIGFsbCBvZiB0aGUgYE1hdFRhYk5hdmAgZnVuY3Rpb25hbGl0eS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNsYXNzLW5hbWUKICAgIGNsYXNzIF9NYXRUYWJOYXZCYXNlIGV4dGVuZHMgTWF0UGFnaW5hdGVkVGFiSGVhZGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7Pz19IHBsYXRmb3JtCiAgICAgICAgICogQHBhcmFtIHs/PX0gYW5pbWF0aW9uTW9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIGRpciwgbmdab25lLCBjaGFuZ2VEZXRlY3RvclJlZiwgdmlld3BvcnRSdWxlciwgCiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBgcGxhdGZvcm1gIHBhcmFtZXRlciB0byBiZWNvbWUgcmVxdWlyZWQuCiAgICAgICAgICovCiAgICAgICAgcGxhdGZvcm0sIGFuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIGRpciwgbmdab25lLCBwbGF0Zm9ybSwgYW5pbWF0aW9uTW9kZSk7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZW1lIGNvbG9yIG9mIHRoZSBuYXYgYmFyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jb2xvciA9ICdwcmltYXJ5JzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQmFja2dyb3VuZCBjb2xvciBvZiB0aGUgdGFiIG5hdi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBiYWNrZ3JvdW5kQ29sb3IoKSB7IHJldHVybiB0aGlzLl9iYWNrZ3JvdW5kQ29sb3I7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgYmFja2dyb3VuZENvbG9yKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdDsKICAgICAgICAgICAgY2xhc3NMaXN0LnJlbW92ZShgbWF0LWJhY2tncm91bmQtJHt0aGlzLmJhY2tncm91bmRDb2xvcn1gKTsKICAgICAgICAgICAgaWYgKHZhbHVlKSB7CiAgICAgICAgICAgICAgICBjbGFzc0xpc3QuYWRkKGBtYXQtYmFja2dyb3VuZC0ke3ZhbHVlfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2JhY2tncm91bmRDb2xvciA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSByaXBwbGUgZWZmZWN0IGlzIGRpc2FibGVkIG9yIG5vdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlUmlwcGxlKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZVJpcHBsZTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXNhYmxlUmlwcGxlKHZhbHVlKSB7IHRoaXMuX2Rpc2FibGVSaXBwbGUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2l0ZW1TZWxlY3RlZCgpIHsKICAgICAgICAgICAgLy8gbm9vcAogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICAgICAgLy8gV2UgbmVlZCB0aGlzIHRvIHJ1biBiZWZvcmUgdGhlIGBjaGFuZ2VzYCBzdWJzY3JpcHRpb24gaW4gcGFyZW50IHRvIGVuc3VyZSB0aGF0IHRoZQogICAgICAgICAgICAvLyBzZWxlY3RlZEluZGV4IGlzIHVwLXRvLWRhdGUgYnkgdGhlIHRpbWUgdGhlIHN1cGVyIGNsYXNzIHN0YXJ0cyBsb29raW5nIGZvciBpdC4KICAgICAgICAgICAgdGhpcy5faXRlbXMuY2hhbmdlcy5waXBlKHN0YXJ0V2l0aChudWxsKSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZUxpbmsoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBzdXBlci5uZ0FmdGVyQ29udGVudEluaXQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm90aWZpZXMgdGhlIGNvbXBvbmVudCB0aGF0IHRoZSBhY3RpdmUgbGluayBoYXMgYmVlbiBjaGFuZ2VkLgogICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wIGBlbGVtZW50YCBwYXJhbWV0ZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgICAgKiBAcGFyYW0gez89fSBfZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlQWN0aXZlTGluayhfZWxlbWVudCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2l0ZW1zKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtcyA9IHRoaXMuX2l0ZW1zLnRvQXJyYXkoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpdGVtcy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKGl0ZW1zW2ldLmFjdGl2ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJbmRleCA9IGk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBpbmsgYmFyIHNob3VsZCBoaWRlIGl0c2VsZiBpZiBubyBpdGVtcyBhcmUgYWN0aXZlLgogICAgICAgICAgICB0aGlzLnNlbGVjdGVkSW5kZXggPSAtMTsKICAgICAgICAgICAgdGhpcy5faW5rQmFyLmhpZGUoKTsKICAgICAgICB9CiAgICB9CiAgICBfTWF0VGFiTmF2QmFzZS7JtWZhYyA9IGZ1bmN0aW9uIF9NYXRUYWJOYXZCYXNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IF9NYXRUYWJOYXZCYXNlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3cG9ydFJ1bGVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSk7IH07CiAgICBfTWF0VGFiTmF2QmFzZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBfTWF0VGFiTmF2QmFzZSwgaW5wdXRzOiB7IGNvbG9yOiAiY29sb3IiLCBiYWNrZ3JvdW5kQ29sb3I6ICJiYWNrZ3JvdW5kQ29sb3IiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIgfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgX01hdFRhYk5hdkJhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KICAgIF07CiAgICBfTWF0VGFiTmF2QmFzZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBiYWNrZ3JvdW5kQ29sb3I6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRpc2FibGVSaXBwbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbG9yOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogTmF2aWdhdGlvbiBjb21wb25lbnQgbWF0Y2hpbmcgdGhlIHN0eWxlcyBvZiB0aGUgdGFiIGdyb3VwIGhlYWRlci4KICAgICAqIFByb3ZpZGVzIGFuY2hvcmVkIG5hdmlnYXRpb24gd2l0aCBhbmltYXRlZCBpbmsgYmFyLgogICAgICovCiAgICBjbGFzcyBNYXRUYWJOYXYgZXh0ZW5kcyBfTWF0VGFiTmF2QmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdwb3J0UnVsZXIKICAgICAgICAgKiBAcGFyYW0gez89fSBwbGF0Zm9ybQogICAgICAgICAqIEBwYXJhbSB7Pz19IGFuaW1hdGlvbk1vZGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBkaXIsIG5nWm9uZSwgY2hhbmdlRGV0ZWN0b3JSZWYsIHZpZXdwb3J0UnVsZXIsIAogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgYHBsYXRmb3JtYCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLgogICAgICAgICAqLwogICAgICAgIHBsYXRmb3JtLCBhbmltYXRpb25Nb2RlKSB7CiAgICAgICAgICAgIHN1cGVyKGVsZW1lbnRSZWYsIGRpciwgbmdab25lLCBjaGFuZ2VEZXRlY3RvclJlZiwgdmlld3BvcnRSdWxlciwgcGxhdGZvcm0sIGFuaW1hdGlvbk1vZGUpOwogICAgICAgIH0KICAgIH0KICAgIE1hdFRhYk5hdi7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYk5hdl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWJOYXYpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKICAgIE1hdFRhYk5hdi7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRUYWJOYXYsIHNlbGVjdG9yczogW1siIiwgIm1hdC10YWItbmF2LWJhciIsICIiXV0sIGNvbnRlbnRRdWVyaWVzOiBmdW5jdGlvbiBNYXRUYWJOYXZfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRUYWJMaW5rLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9pdGVtcyA9IF90KTsKICAgICAgICB9IH0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0VGFiTmF2X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KE1hdElua0JhciwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2M1LCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzYsIHRydWUpOwogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jNywgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2M4LCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9pbmtCYXIgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3RhYkxpc3RDb250YWluZXIgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3RhYkxpc3QgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX25leHRQYWdpbmF0b3IgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3ByZXZpb3VzUGFnaW5hdG9yID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC10YWItbmF2LWJhciIsICJtYXQtdGFiLWhlYWRlciJdLCBob3N0VmFyczogMTAsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0VGFiTmF2X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jb250cm9scy1lbmFibGVkIiwgY3R4Ll9zaG93UGFnaW5hdGlvbkNvbnRyb2xzKSgibWF0LXRhYi1oZWFkZXItcnRsIiwgY3R4Ll9nZXRMYXlvdXREaXJlY3Rpb24oKSA9PSAicnRsIikoIm1hdC1wcmltYXJ5IiwgY3R4LmNvbG9yICE9PSAid2FybiIgJiYgY3R4LmNvbG9yICE9PSAiYWNjZW50IikoIm1hdC1hY2NlbnQiLCBjdHguY29sb3IgPT09ICJhY2NlbnQiKSgibWF0LXdhcm4iLCBjdHguY29sb3IgPT09ICJ3YXJuIik7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgY29sb3I6ICJjb2xvciIgfSwgZXhwb3J0QXM6IFsibWF0VGFiTmF2QmFyIiwgIm1hdFRhYk5hdiJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBhdHRyczogX2M5LCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMCQzLCBkZWNsczogMTMsIHZhcnM6IDgsIGNvbnN0czogW1siYXJpYS1oaWRkZW4iLCAidHJ1ZSIsICJtYXQtcmlwcGxlIiwgIiIsIDEsICJtYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uIiwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlIiwgIm1hdC1lbGV2YXRpb24tejQiLCAzLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAiY2xpY2siLCAibW91c2Vkb3duIiwgInRvdWNoZW5kIl0sIFsicHJldmlvdXNQYWdpbmF0b3IiLCAiIl0sIFsxLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uIl0sIFsxLCAibWF0LXRhYi1saW5rLWNvbnRhaW5lciIsIDMsICJrZXlkb3duIl0sIFsidGFiTGlzdENvbnRhaW5lciIsICIiXSwgWzEsICJtYXQtdGFiLWxpc3QiLCAzLCAiY2RrT2JzZXJ2ZUNvbnRlbnQiXSwgWyJ0YWJMaXN0IiwgIiJdLCBbMSwgIm1hdC10YWItbGlua3MiXSwgWyJhcmlhLWhpZGRlbiIsICJ0cnVlIiwgIm1hdC1yaXBwbGUiLCAiIiwgMSwgIm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24iLCAibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlciIsICJtYXQtZWxldmF0aW9uLXo0IiwgMywgIm1hdFJpcHBsZURpc2FibGVkIiwgIm1vdXNlZG93biIsICJjbGljayIsICJ0b3VjaGVuZCJdLCBbIm5leHRQYWdpbmF0b3IiLCAiIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFRhYk5hdl9UZW1wbGF0ZV9kaXZfY2xpY2tfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImJlZm9yZSIpOyB9KSgibW91c2Vkb3duIiwgZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlX2Rpdl9tb3VzZWRvd25fMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImJlZm9yZSIsICRldmVudCk7IH0pKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uIE1hdFRhYk5hdl9UZW1wbGF0ZV9kaXZfdG91Y2hlbmRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5fc3RvcEludGVydmFsKCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDMsIDQpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiBNYXRUYWJOYXZfVGVtcGxhdGVfZGl2X2tleWRvd25fM19saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlS2V5ZG93bigkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgNSwgNik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2RrT2JzZXJ2ZUNvbnRlbnQiLCBmdW5jdGlvbiBNYXRUYWJOYXZfVGVtcGxhdGVfZGl2X2Nka09ic2VydmVDb250ZW50XzVfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX29uQ29udGVudENoYW5nZXMoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIsIDcpOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbig4KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoOSwgIm1hdC1pbmstYmFyIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJkaXYiLCA4LCA5KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJtb3VzZWRvd24iLCBmdW5jdGlvbiBNYXRUYWJOYXZfVGVtcGxhdGVfZGl2X21vdXNlZG93bl8xMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yUHJlc3MoImFmdGVyIiwgJGV2ZW50KTsgfSkoImNsaWNrIiwgZnVuY3Rpb24gTWF0VGFiTmF2X1RlbXBsYXRlX2Rpdl9jbGlja18xMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5faGFuZGxlUGFnaW5hdG9yQ2xpY2soImFmdGVyIik7IH0pKCJ0b3VjaGVuZCIsIGZ1bmN0aW9uIE1hdFRhYk5hdl9UZW1wbGF0ZV9kaXZfdG91Y2hlbmRfMTBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX3N0b3BJbnRlcnZhbCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMTIsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEJlZm9yZSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlRGlzYWJsZWQiLCBjdHguX2Rpc2FibGVTY3JvbGxCZWZvcmUgfHwgY3R4LmRpc2FibGVSaXBwbGUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCBjdHguX2FuaW1hdGlvbk1vZGUgPT09ICJOb29wQW5pbWF0aW9ucyIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEFmdGVyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJtYXRSaXBwbGVEaXNhYmxlZCIsIGN0eC5fZGlzYWJsZVNjcm9sbEFmdGVyIHx8IGN0eC5kaXNhYmxlUmlwcGxlKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRSaXBwbGUsIENka09ic2VydmVDb250ZW50LCBNYXRJbmtCYXJdLCBzdHlsZXM6IFsiLm1hdC10YWItaGVhZGVye2Rpc3BsYXk6ZmxleDtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmU7ZmxleC1zaHJpbms6MH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7cG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpub25lO2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO21pbi13aWR0aDozMnB4O2N1cnNvcjpwb2ludGVyO3otaW5kZXg6Mjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dG91Y2gtYWN0aW9uOm5vbmV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntkaXNwbGF5OmZsZXh9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYmVmb3JlLC5tYXQtdGFiLWhlYWRlci1ydGwgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tYWZ0ZXJ7cGFkZGluZy1sZWZ0OjRweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1iZWZvcmUgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSgtMTM1ZGVnKX0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSwubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1hZnRlcntwYWRkaW5nLXJpZ2h0OjRweH0ubWF0LXRhYi1oZWFkZXItcnRsIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWJlZm9yZSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWFmdGVyIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItc3R5bGU6c29saWQ7Ym9yZGVyLXdpZHRoOjJweCAycHggMCAwO2NvbnRlbnQ6XCJcIjtoZWlnaHQ6OHB4O3dpZHRoOjhweH0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZHtib3gtc2hhZG93Om5vbmU7Y3Vyc29yOmRlZmF1bHR9Lm1hdC10YWItbGlzdHtmbGV4LWdyb3c6MTtwb3NpdGlvbjpyZWxhdGl2ZTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA1MDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Lm1hdC10YWItbGlua3N7ZGlzcGxheTpmbGV4fVttYXQtYWxpZ24tdGFicz1jZW50ZXJdPi5tYXQtdGFiLWxpbmstY29udGFpbmVyIC5tYXQtdGFiLWxpbmtze2p1c3RpZnktY29udGVudDpjZW50ZXJ9W21hdC1hbGlnbi10YWJzPWVuZF0+Lm1hdC10YWItbGluay1jb250YWluZXIgLm1hdC10YWItbGlua3N7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kfS5tYXQtaW5rLWJhcntwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MnB4O3RyYW5zaXRpb246NTAwbXMgY3ViaWMtYmV6aWVyKDAuMzUsIDAsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtaW5rLWJhcnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtaW5rLWJhcntib3R0b206YXV0bzt0b3A6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaW5rLWJhcntvdXRsaW5lOnNvbGlkIDJweDtoZWlnaHQ6MH0ubWF0LXRhYi1saW5rLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVuO3otaW5kZXg6MX0ubWF0LXRhYi1saW5re2hlaWdodDo0OHB4O3BhZGRpbmc6MCAyNHB4O2N1cnNvcjpwb2ludGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5Oi42O21pbi13aWR0aDoxNjBweDt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1mbGV4O2p1c3RpZnktY29udGVudDpjZW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyO3doaXRlLXNwYWNlOm5vd3JhcDt2ZXJ0aWNhbC1hbGlnbjp0b3A7dGV4dC1kZWNvcmF0aW9uOm5vbmU7cG9zaXRpb246cmVsYXRpdmU7b3ZlcmZsb3c6aGlkZGVuOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXRhYi1saW5rOmZvY3Vze291dGxpbmU6bm9uZX0ubWF0LXRhYi1saW5rOmZvY3VzOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7b3BhY2l0eToxfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10YWItbGluazpmb2N1c3tvdXRsaW5lOmRvdHRlZCAycHg7b3V0bGluZS1vZmZzZXQ6LTJweH0ubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y3Vyc29yOmRlZmF1bHR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LXRhYi1saW5rIC5tYXQtdGFiLWxhYmVsLWNvbnRlbnR7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjt3aGl0ZS1zcGFjZTpub3dyYXB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXRhYi1saW5re29wYWNpdHk6MX1bbWF0LXN0cmV0Y2gtdGFic10gLm1hdC10YWItbGlua3tmbGV4LWJhc2lzOjA7ZmxleC1ncm93OjF9Lm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke3BvaW50ZXItZXZlbnRzOm5vbmV9QG1lZGlhKG1heC13aWR0aDogNTk5cHgpey5tYXQtdGFiLWxpbmt7bWluLXdpZHRoOjcycHh9fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFRhYk5hdi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgICAgIHsgdHlwZTogUGxhdGZvcm0sIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQogICAgXTsKICAgIE1hdFRhYk5hdi5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBfaXRlbXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW2ZvcndhcmRSZWYoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gTWF0VGFiTGluaykpLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgICAgICBfaW5rQmFyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRJbmtCYXIsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgICAgICBfdGFiTGlzdENvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RhYkxpc3RDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgX3RhYkxpc3Q6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyd0YWJMaXN0JywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLAogICAgICAgIF9uZXh0UGFnaW5hdG9yOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnbmV4dFBhZ2luYXRvcicsXSB9XSwKICAgICAgICBfcHJldmlvdXNQYWdpbmF0b3I6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwcmV2aW91c1BhZ2luYXRvcicsXSB9XQogICAgfTsKICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0VGFiTGluay4KICAgIGNsYXNzIE1hdFRhYkxpbmtNaXhpbkJhc2UgewogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdFRhYkxpbmtNaXhpbkJhc2UgPSBtaXhpblRhYkluZGV4KG1peGluRGlzYWJsZVJpcHBsZShtaXhpbkRpc2FibGVkKE1hdFRhYkxpbmtNaXhpbkJhc2UpKSk7CiAgICAvKioKICAgICAqIEJhc2UgY2xhc3Mgd2l0aCBhbGwgb2YgdGhlIGBNYXRUYWJMaW5rYCBmdW5jdGlvbmFsaXR5LgogICAgICovCiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y2xhc3MtbmFtZQogICAgY2xhc3MgX01hdFRhYkxpbmtCYXNlIGV4dGVuZHMgX01hdFRhYkxpbmtNaXhpbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3RhYk5hdkJhcgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gZ2xvYmFsUmlwcGxlT3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7P30gdGFiSW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IF9mb2N1c01vbml0b3IKICAgICAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3RhYk5hdkJhciwgZWxlbWVudFJlZiwgZ2xvYmFsUmlwcGxlT3B0aW9ucywgdGFiSW5kZXgsIF9mb2N1c01vbml0b3IsIGFuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fdGFiTmF2QmFyID0gX3RhYk5hdkJhcjsKICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIHRhYiBsaW5rIGlzIGFjdGl2ZSBvciBub3QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9pc0FjdGl2ZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnJpcHBsZUNvbmZpZyA9IGdsb2JhbFJpcHBsZU9wdGlvbnMgfHwge307CiAgICAgICAgICAgIHRoaXMudGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCkgfHwgMDsKICAgICAgICAgICAgaWYgKGFuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucycpIHsKICAgICAgICAgICAgICAgIHRoaXMucmlwcGxlQ29uZmlnLmFuaW1hdGlvbiA9IHsgZW50ZXJEdXJhdGlvbjogMCwgZXhpdER1cmF0aW9uOiAwIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgX2ZvY3VzTW9uaXRvci5tb25pdG9yKGVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBsaW5rIGlzIGFjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBhY3RpdmUoKSB7IHJldHVybiB0aGlzLl9pc0FjdGl2ZTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBhY3RpdmUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9pc0FjdGl2ZSkgewogICAgICAgICAgICAgICAgdGhpcy5faXNBY3RpdmUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX3RhYk5hdkJhci51cGRhdGVBY3RpdmVMaW5rKHRoaXMuZWxlbWVudFJlZik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciByaXBwbGVzIGFyZSBkaXNhYmxlZCBvbiBpbnRlcmFjdGlvbi4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJpcHBsZURpc2FibGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlZCB8fCB0aGlzLmRpc2FibGVSaXBwbGUgfHwgdGhpcy5fdGFiTmF2QmFyLmRpc2FibGVSaXBwbGUgfHwKICAgICAgICAgICAgICAgICEhdGhpcy5yaXBwbGVDb25maWcuZGlzYWJsZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLmVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgIH0KICAgIF9NYXRUYWJMaW5rQmFzZS7JtWZhYyA9IGZ1bmN0aW9uIF9NYXRUYWJMaW5rQmFzZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0VGFiTGlua0Jhc2UpKMm1ybVkaXJlY3RpdmVJbmplY3QoX01hdFRhYk5hdkJhc2UpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9SSVBQTEVfR0xPQkFMX09QVElPTlMsIDgpLCDJtcm1aW5qZWN0QXR0cmlidXRlKCd0YWJpbmRleCcpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvY3VzTW9uaXRvciksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSk7IH07CiAgICBfTWF0VGFiTGlua0Jhc2UuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogX01hdFRhYkxpbmtCYXNlLCBpbnB1dHM6IHsgYWN0aXZlOiAiYWN0aXZlIiB9LCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBfTWF0VGFiTGlua0Jhc2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBfTWF0VGFiTmF2QmFzZSB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9SSVBQTEVfR0xPQkFMX09QVElPTlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsndGFiaW5kZXgnLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEZvY3VzTW9uaXRvciB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KICAgIF07CiAgICBfTWF0VGFiTGlua0Jhc2UucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgYWN0aXZlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogTGluayBpbnNpZGUgb2YgYSBgbWF0LXRhYi1uYXYtYmFyYC4KICAgICAqLwogICAgY2xhc3MgTWF0VGFiTGluayBleHRlbmRzIF9NYXRUYWJMaW5rQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0YWJOYXZCYXIKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IG5nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IGdsb2JhbFJpcHBsZU9wdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IHRhYkluZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBmb2N1c01vbml0b3IKICAgICAgICAgKiBAcGFyYW0gez89fSBhbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IodGFiTmF2QmFyLCBlbGVtZW50UmVmLCBuZ1pvbmUsIHBsYXRmb3JtLCBnbG9iYWxSaXBwbGVPcHRpb25zLCB0YWJJbmRleCwgZm9jdXNNb25pdG9yLCBhbmltYXRpb25Nb2RlKSB7CiAgICAgICAgICAgIHN1cGVyKHRhYk5hdkJhciwgZWxlbWVudFJlZiwgZ2xvYmFsUmlwcGxlT3B0aW9ucywgdGFiSW5kZXgsIGZvY3VzTW9uaXRvciwgYW5pbWF0aW9uTW9kZSk7CiAgICAgICAgICAgIHRoaXMuX3RhYkxpbmtSaXBwbGUgPSBuZXcgUmlwcGxlUmVuZGVyZXIodGhpcywgbmdab25lLCBlbGVtZW50UmVmLCBwbGF0Zm9ybSk7CiAgICAgICAgICAgIHRoaXMuX3RhYkxpbmtSaXBwbGUuc2V0dXBUcmlnZ2VyRXZlbnRzKGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHN1cGVyLm5nT25EZXN0cm95KCk7CiAgICAgICAgICAgIHRoaXMuX3RhYkxpbmtSaXBwbGUuX3JlbW92ZVRyaWdnZXJFdmVudHMoKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRUYWJMaW5rLsm1ZmFjID0gZnVuY3Rpb24gTWF0VGFiTGlua19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWJMaW5rKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdFRhYk5hdiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1JJUFBMRV9HTE9CQUxfT1BUSU9OUywgOCksIMm1ybVpbmplY3RBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpKTsgfTsKICAgIE1hdFRhYkxpbmsuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0VGFiTGluaywgc2VsZWN0b3JzOiBbWyIiLCAibWF0LXRhYi1saW5rIiwgIiJdLCBbIiIsICJtYXRUYWJMaW5rIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC10YWItbGluayIsICJtYXQtZm9jdXMtaW5kaWNhdG9yIl0sIGhvc3RWYXJzOiA3LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFRhYkxpbmtfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWN1cnJlbnQiLCBjdHguYWN0aXZlID8gInBhZ2UiIDogbnVsbCkoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJ0YWJJbmRleCIsIGN0eC50YWJJbmRleCk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10YWItZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtdGFiLWxhYmVsLWFjdGl2ZSIsIGN0eC5hY3RpdmUpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIsIHRhYkluZGV4OiAidGFiSW5kZXgiIH0sIGV4cG9ydEFzOiBbIm1hdFRhYkxpbmsiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0VGFiTGluay5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE1hdFRhYk5hdiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9SSVBQTEVfR0xPQkFMX09QVElPTlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsndGFiaW5kZXgnLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEZvY3VzTW9uaXRvciB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0FOSU1BVElPTl9NT0RVTEVfVFlQRSxdIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFicy90YWJzLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRUYWJzTW9kdWxlIHsKICAgIH0KICAgIE1hdFRhYnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRUYWJzTW9kdWxlIH0pOwogICAgTWF0VGFic01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFRhYnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0VGFic01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIFBvcnRhbE1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdFJpcHBsZU1vZHVsZSwKICAgICAgICAgICAgICAgIE9ic2VydmVyc01vZHVsZSwKICAgICAgICAgICAgICAgIEExMXlNb2R1bGUsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRUYWJzTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFRhYkdyb3VwLAogICAgICAgICAgICBNYXRUYWJMYWJlbCwKICAgICAgICAgICAgTWF0VGFiLAogICAgICAgICAgICBNYXRJbmtCYXIsCiAgICAgICAgICAgIE1hdFRhYkxhYmVsV3JhcHBlciwKICAgICAgICAgICAgTWF0VGFiTmF2LAogICAgICAgICAgICBNYXRUYWJMaW5rLAogICAgICAgICAgICBNYXRUYWJCb2R5LAogICAgICAgICAgICBNYXRUYWJCb2R5UG9ydGFsLAogICAgICAgICAgICBNYXRUYWJIZWFkZXIsCiAgICAgICAgICAgIE1hdFRhYkNvbnRlbnRdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIFBvcnRhbE1vZHVsZSwKICAgICAgICAgICAgTWF0UmlwcGxlTW9kdWxlLAogICAgICAgICAgICBPYnNlcnZlcnNNb2R1bGUsCiAgICAgICAgICAgIEExMXlNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBNYXRUYWJHcm91cCwKICAgICAgICAgICAgTWF0VGFiTGFiZWwsCiAgICAgICAgICAgIE1hdFRhYiwKICAgICAgICAgICAgTWF0VGFiTmF2LAogICAgICAgICAgICBNYXRUYWJMaW5rLAogICAgICAgICAgICBNYXRUYWJDb250ZW50XTsgfSB9KTsgfSkoKTsKCiAgICBjb25zdCBfYzAkNCA9IFsidW5kZXJsaW5lIl07CiAgICBjb25zdCBfYzEkNCA9IFsiY29ubmVjdGlvbkNvbnRhaW5lciJdOwogICAgY29uc3QgX2MyJDIgPSBbImlucHV0Q29udGFpbmVyIl07CiAgICBjb25zdCBfYzMkMSA9IFsibGFiZWwiXTsKICAgIGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9uZ19jb250YWluZXJfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDE0KTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMTUpOwogICAgICAgIMm1ybVlbGVtZW50KDMsICJkaXYiLCAxNik7CiAgICAgICAgybXJtWVsZW1lbnQoNCwgImRpdiIsIDE3KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDE4KTsKICAgICAgICDJtcm1ZWxlbWVudCg2LCAiZGl2IiwgMTUpOwogICAgICAgIMm1ybVlbGVtZW50KDcsICJkaXYiLCAxNik7CiAgICAgICAgybXJtWVsZW1lbnQoOCwgImRpdiIsIDE3KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxOSk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMSwgMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX2xhYmVsXzlfbmdfY29udGFpbmVyXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgwKTsKICAgICAgICDJtcm1cHJvamVjdGlvbigxLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yMTAuX2NvbnRyb2wucGxhY2Vob2xkZXIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVwcm9qZWN0aW9uKDAsIDMsIFsiKm5nU3dpdGNoQ2FzZSIsICJ0cnVlIl0pOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV9zcGFuXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDIzKTsKICAgICAgICDJtcm1dGV4dCgxLCAiICoiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjE0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibGFiZWwiLCAyMCwgMjEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2RrT2JzZXJ2ZUNvbnRlbnQiLCBmdW5jdGlvbiBNYXRGb3JtRmllbGRfbGFiZWxfOV9UZW1wbGF0ZV9sYWJlbF9jZGtPYnNlcnZlQ29udGVudF8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxNCk7IGNvbnN0IGN0eF9yMTMgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTMudXBkYXRlT3V0bGluZUdhcCgpOyB9KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgTWF0Rm9ybUZpZWxkX2xhYmVsXzlfbmdfY29udGFpbmVyXzJfVGVtcGxhdGUsIDQsIDEsICJuZy1jb250YWluZXIiLCAxMik7CiAgICAgICAgybXJtXRlbXBsYXRlKDMsIE1hdEZvcm1GaWVsZF9sYWJlbF85XzNfVGVtcGxhdGUsIDEsIDAsIHVuZGVmaW5lZCwgMTIpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBNYXRGb3JtRmllbGRfbGFiZWxfOV9zcGFuXzRfVGVtcGxhdGUsIDIsIDAsICJzcGFuIiwgMjIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtZW1wdHkiLCBjdHhfcjQuX2NvbnRyb2wuZW1wdHkgJiYgIWN0eF9yNC5fc2hvdWxkQWx3YXlzRmxvYXQpKCJtYXQtZm9ybS1maWVsZC1lbXB0eSIsIGN0eF9yNC5fY29udHJvbC5lbXB0eSAmJiAhY3R4X3I0Ll9zaG91bGRBbHdheXNGbG9hdCkoIm1hdC1hY2NlbnQiLCBjdHhfcjQuY29sb3IgPT0gImFjY2VudCIpKCJtYXQtd2FybiIsIGN0eF9yNC5jb2xvciA9PSAid2FybiIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsIGN0eF9yNC5hcHBlYXJhbmNlICE9ICJvdXRsaW5lIikoImlkIiwgY3R4X3I0Ll9sYWJlbElkKSgibmdTd2l0Y2giLCBjdHhfcjQuX2hhc0xhYmVsKCkpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoImZvciIsIGN0eF9yNC5fY29udHJvbC5pZCkoImFyaWEtb3ducyIsIGN0eF9yNC5fY29udHJvbC5pZCk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCBmYWxzZSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCB0cnVlKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4X3I0LmhpZGVSZXF1aXJlZE1hcmtlciAmJiBjdHhfcjQuX2NvbnRyb2wucmVxdWlyZWQgJiYgIWN0eF9yNC5fY29udHJvbC5kaXNhYmxlZCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9kaXZfMTBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjQpOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDEsIDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9kaXZfMTFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjUsIDI2KTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAic3BhbiIsIDI3KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I2ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWFjY2VudCIsIGN0eF9yNi5jb2xvciA9PSAiYWNjZW50IikoIm1hdC13YXJuIiwgY3R4X3I2LmNvbG9yID09ICJ3YXJuIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9kaXZfMTNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgybXJtXByb2plY3Rpb24oMSwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiQHRyYW5zaXRpb25NZXNzYWdlcyIsIGN0eF9yNy5fc3Vic2NyaXB0QW5pbWF0aW9uU3RhdGUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRGb3JtRmllbGRfZGl2XzE0X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDMxKTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxNiA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoImlkIiwgY3R4X3IxNi5faGludExhYmVsSWQpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4X3IxNi5oaW50TGFiZWwpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRGb3JtRmllbGRfZGl2XzE0X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDI4KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMSwgTWF0Rm9ybUZpZWxkX2Rpdl8xNF9kaXZfMV9UZW1wbGF0ZSwgMiwgMiwgImRpdiIsIDI5KTsKICAgICAgICDJtcm1cHJvamVjdGlvbigyLCA2KTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAiZGl2IiwgMzApOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDQsIDcpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjggPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoIkB0cmFuc2l0aW9uTWVzc2FnZXMiLCBjdHhfcjguX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjguaGludExhYmVsKTsKICAgIH0gfQogICAgY29uc3QgX2M0JDEgPSBbIioiLCBbWyIiLCAibWF0UHJlZml4IiwgIiJdXSwgW1sibWF0LXBsYWNlaG9sZGVyIl1dLCBbWyJtYXQtbGFiZWwiXV0sIFtbIiIsICJtYXRTdWZmaXgiLCAiIl1dLCBbWyJtYXQtZXJyb3IiXV0sIFtbIm1hdC1oaW50IiwgMywgImFsaWduIiwgImVuZCJdXSwgW1sibWF0LWhpbnQiLCAiYWxpZ24iLCAiZW5kIl1dXTsKICAgIGNvbnN0IF9jNSQxID0gWyIqIiwgIlttYXRQcmVmaXhdIiwgIm1hdC1wbGFjZWhvbGRlciIsICJtYXQtbGFiZWwiLCAiW21hdFN1ZmZpeF0iLCAibWF0LWVycm9yIiwgIm1hdC1oaW50Om5vdChbYWxpZ249J2VuZCddKSIsICJtYXQtaGludFthbGlnbj0nZW5kJ10iXTsKICAgIGxldCBuZXh0VW5pcXVlSWQgPSAwOwogICAgLyoqCiAgICAgKiBTaW5nbGUgZXJyb3IgbWVzc2FnZSB0byBiZSBzaG93biB1bmRlcm5lYXRoIHRoZSBmb3JtIGZpZWxkLgogICAgICovCiAgICBjbGFzcyBNYXRFcnJvciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuaWQgPSBgbWF0LWVycm9yLSR7bmV4dFVuaXF1ZUlkKyt9YDsKICAgICAgICB9CiAgICB9CiAgICBNYXRFcnJvci7JtWZhYyA9IGZ1bmN0aW9uIE1hdEVycm9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEVycm9yKSgpOyB9OwogICAgTWF0RXJyb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0RXJyb3IsIHNlbGVjdG9yczogW1sibWF0LWVycm9yIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJhbGVydCIsIDEsICJtYXQtZXJyb3IiXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0RXJyb3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5pZCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgaWQ6ICJpZCIgfSB9KTsKICAgIE1hdEVycm9yLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGlkOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtYW5pbWF0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuaW1hdGlvbnMgdXNlZCBieSB0aGUgTWF0Rm9ybUZpZWxkLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBtYXRGb3JtRmllbGRBbmltYXRpb25zID0gewogICAgICAgIC8qKgogICAgICAgICAqIEFuaW1hdGlvbiB0aGF0IHRyYW5zaXRpb25zIHRoZSBmb3JtIGZpZWxkJ3MgZXJyb3IgYW5kIGhpbnQgbWVzc2FnZXMuCiAgICAgICAgICovCiAgICAgICAgdHJhbnNpdGlvbk1lc3NhZ2VzOiB0cmlnZ2VyKCd0cmFuc2l0aW9uTWVzc2FnZXMnLCBbCiAgICAgICAgICAgIC8vIFRPRE8obW1hbGVyYmEpOiBVc2UgYW5ndWxhciBhbmltYXRpb25zIGZvciBsYWJlbCBhbmltYXRpb24gYXMgd2VsbC4KICAgICAgICAgICAgc3RhdGUoJ2VudGVyJywgc3R5bGUoeyBvcGFjaXR5OiAxLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDAlKScgfSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IGVudGVyJywgWwogICAgICAgICAgICAgICAgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0xMDAlKScgfSksCiAgICAgICAgICAgICAgICBhbmltYXRlKCczMDBtcyBjdWJpYy1iZXppZXIoMC41NSwgMCwgMC41NSwgMC4yKScpLAogICAgICAgICAgICBdKSwKICAgICAgICBdKQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtY29udHJvbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuIGludGVyZmFjZSB3aGljaCBhbGxvd3MgYSBjb250cm9sIHRvIHdvcmsgaW5zaWRlIG9mIGEgYE1hdEZvcm1GaWVsZGAuCiAgICAgKiBAYWJzdHJhY3QKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIE1hdEZvcm1GaWVsZENvbnRyb2wgewogICAgfQogICAgTWF0Rm9ybUZpZWxkQ29udHJvbC7JtWZhYyA9IGZ1bmN0aW9uIE1hdEZvcm1GaWVsZENvbnRyb2xfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0Rm9ybUZpZWxkQ29udHJvbCkoKTsgfTsKICAgIE1hdEZvcm1GaWVsZENvbnRyb2wuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0Rm9ybUZpZWxkQ29udHJvbCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9mb3JtLWZpZWxkL2Zvcm0tZmllbGQtZXJyb3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0Rm9ybUZpZWxkUGxhY2Vob2xkZXJDb25mbGljdEVycm9yKCkgewogICAgICAgIHJldHVybiBFcnJvcignUGxhY2Vob2xkZXIgYXR0cmlidXRlIGFuZCBjaGlsZCBlbGVtZW50IHdlcmUgYm90aCBzcGVjaWZpZWQuJyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGFsaWduCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRNYXRGb3JtRmllbGREdXBsaWNhdGVkSGludEVycm9yKGFsaWduKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBBIGhpbnQgd2FzIGFscmVhZHkgZGVjbGFyZWQgZm9yICdhbGlnbj0iJHthbGlnbn0iJy5gKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE1hdEZvcm1GaWVsZE1pc3NpbmdDb250cm9sRXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKCdtYXQtZm9ybS1maWVsZCBtdXN0IGNvbnRhaW4gYSBNYXRGb3JtRmllbGRDb250cm9sLicpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvaGludC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV4dFVuaXF1ZUlkJDEgPSAwOwogICAgLyoqCiAgICAgKiBIaW50IHRleHQgdG8gYmUgc2hvd24gdW5kZXJuZWF0aCB0aGUgZm9ybSBmaWVsZCBjb250cm9sLgogICAgICovCiAgICBjbGFzcyBNYXRIaW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdG8gYWxpZ24gdGhlIGhpbnQgbGFiZWwgYXQgdGhlIHN0YXJ0IG9yIGVuZCBvZiB0aGUgbGluZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYWxpZ24gPSAnc3RhcnQnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVW5pcXVlIElEIGZvciB0aGUgaGludC4gVXNlZCBmb3IgdGhlIGFyaWEtZGVzY3JpYmVkYnkgb24gdGhlIGZvcm0gZmllbGQgY29udHJvbC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaWQgPSBgbWF0LWhpbnQtJHtuZXh0VW5pcXVlSWQkMSsrfWA7CiAgICAgICAgfQogICAgfQogICAgTWF0SGludC7JtWZhYyA9IGZ1bmN0aW9uIE1hdEhpbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SGludCkoKTsgfTsKICAgIE1hdEhpbnQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0SGludCwgc2VsZWN0b3JzOiBbWyJtYXQtaGludCJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1oaW50Il0sIGhvc3RWYXJzOiA0LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdEhpbnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5pZCkoImFsaWduIiwgbnVsbCk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1yaWdodCIsIGN0eC5hbGlnbiA9PSAiZW5kIik7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgYWxpZ246ICJhbGlnbiIsIGlkOiAiaWQiIH0gfSk7CiAgICBNYXRIaW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGFsaWduOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9sYWJlbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRoZSBmbG9hdGluZyBsYWJlbCBmb3IgYSBgbWF0LWZvcm0tZmllbGRgLgogICAgICovCiAgICBjbGFzcyBNYXRMYWJlbCB7CiAgICB9CiAgICBNYXRMYWJlbC7JtWZhYyA9IGZ1bmN0aW9uIE1hdExhYmVsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdExhYmVsKSgpOyB9OwogICAgTWF0TGFiZWwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0TGFiZWwsIHNlbGVjdG9yczogW1sibWF0LWxhYmVsIl1dIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvcGxhY2Vob2xkZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBUaGUgcGxhY2Vob2xkZXIgdGV4dCBmb3IgYW4gYE1hdEZvcm1GaWVsZGAuCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYDxtYXQtbGFiZWw+YCB0byBzcGVjaWZ5IHRoZSBsYWJlbCBhbmQgdGhlIGBwbGFjZWhvbGRlcmAgYXR0cmlidXRlIHRvIHNwZWNpZnkgdGhlCiAgICAgKiAgICAgcGxhY2Vob2xkZXIuCiAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICovCiAgICBjbGFzcyBNYXRQbGFjZWhvbGRlciB7CiAgICB9CiAgICBNYXRQbGFjZWhvbGRlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFBsYWNlaG9sZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFBsYWNlaG9sZGVyKSgpOyB9OwogICAgTWF0UGxhY2Vob2xkZXIuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0UGxhY2Vob2xkZXIsIHNlbGVjdG9yczogW1sibWF0LXBsYWNlaG9sZGVyIl1dIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvcHJlZml4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUHJlZml4IHRvIGJlIHBsYWNlZCBpbiBmcm9udCBvZiB0aGUgZm9ybSBmaWVsZC4KICAgICAqLwogICAgY2xhc3MgTWF0UHJlZml4IHsKICAgIH0KICAgIE1hdFByZWZpeC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFByZWZpeF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRQcmVmaXgpKCk7IH07CiAgICBNYXRQcmVmaXguybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0UHJlZml4LCBzZWxlY3RvcnM6IFtbIiIsICJtYXRQcmVmaXgiLCAiIl1dIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2Zvcm0tZmllbGQvc3VmZml4LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogU3VmZml4IHRvIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBmb3JtIGZpZWxkLgogICAgICovCiAgICBjbGFzcyBNYXRTdWZmaXggewogICAgfQogICAgTWF0U3VmZml4Lsm1ZmFjID0gZnVuY3Rpb24gTWF0U3VmZml4X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFN1ZmZpeCkoKTsgfTsKICAgIE1hdFN1ZmZpeC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRTdWZmaXgsIHNlbGVjdG9yczogW1siIiwgIm1hdFN1ZmZpeCIsICIiXV0gfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9mb3JtLWZpZWxkLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZXh0VW5pcXVlSWQkMiA9IDA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmbG9hdGluZ0xhYmVsU2NhbGUgPSAwLjc1OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgb3V0bGluZUdhcFBhZGRpbmcgPSA1OwogICAgLyoqCiAgICAgKiBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdEZvcm1GaWVsZC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdEZvcm1GaWVsZEJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBCYXNlIGNsYXNzIHRvIHdoaWNoIHdlJ3JlIGFwcGx5aW5nIHRoZSBmb3JtIGZpZWxkIG1peGlucy4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgX01hdEZvcm1GaWVsZE1peGluQmFzZSA9IG1peGluQ29sb3IoTWF0Rm9ybUZpZWxkQmFzZSwgJ3ByaW1hcnknKTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZQogICAgICogZGVmYXVsdCBvcHRpb25zIGZvciBhbGwgZm9ybSBmaWVsZCB3aXRoaW4gYW4gYXBwLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9GT1JNX0ZJRUxEX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TJyk7CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGluamVjdCBhbiBpbnN0YW5jZXMgb2YgYE1hdEZvcm1GaWVsZGAuIEl0IHNlcnZlcwogICAgICogYXMgYWx0ZXJuYXRpdmUgdG9rZW4gdG8gdGhlIGFjdHVhbCBgTWF0Rm9ybUZpZWxkYCBjbGFzcyB3aGljaCB3b3VsZCBjYXVzZSB1bm5lY2Vzc2FyeQogICAgICogcmV0ZW50aW9uIG9mIHRoZSBgTWF0Rm9ybUZpZWxkYCBjbGFzcyBhbmQgaXRzIGNvbXBvbmVudCBtZXRhZGF0YS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfRk9STV9GSUVMRCA9IG5ldyBJbmplY3Rpb25Ub2tlbignTWF0Rm9ybUZpZWxkJyk7CiAgICAvKioKICAgICAqIENvbnRhaW5lciBmb3IgZm9ybSBjb250cm9scyB0aGF0IGFwcGxpZXMgTWF0ZXJpYWwgRGVzaWduIHN0eWxpbmcgYW5kIGJlaGF2aW9yLgogICAgICovCiAgICBjbGFzcyBNYXRGb3JtRmllbGQgZXh0ZW5kcyBfTWF0Rm9ybUZpZWxkTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKiBAcGFyYW0gez99IGxhYmVsT3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRzCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9hbmltYXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgbGFiZWxPcHRpb25zLCBfZGlyLCBfZGVmYXVsdHMsIF9wbGF0Zm9ybSwgX25nWm9uZSwgX2FuaW1hdGlvbk1vZGUpIHsKICAgICAgICAgICAgc3VwZXIoX2VsZW1lbnRSZWYpOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0cyA9IF9kZWZhdWx0czsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdXRsaW5lIGdhcCBuZWVkcyB0byBiZSBjYWxjdWxhdGVkCiAgICAgICAgICAgICAqIGltbWVkaWF0ZWx5IG9uIHRoZSBuZXh0IGNoYW5nZSBkZXRlY3Rpb24gcnVuLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHkgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIG91dGxpbmUgZ2FwIG5lZWRzIHRvIGJlIGNhbGN1bGF0ZWQgbmV4dCB0aW1lIHRoZSB6b25lIGhhcyBzdGFiaWxpemVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkT25TdGFibGUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE92ZXJyaWRlIGZvciB0aGUgbG9naWMgdGhhdCBkaXNhYmxlcyB0aGUgbGFiZWwgYW5pbWF0aW9uIGluIGNlcnRhaW4gY2FzZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zaG93QWx3YXlzQW5pbWF0ZSA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RhdGUgb2YgdGhlIG1hdC1oaW50IGFuZCBtYXQtZXJyb3IgYW5pbWF0aW9ucy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3N1YnNjcmlwdEFuaW1hdGlvblN0YXRlID0gJyc7CiAgICAgICAgICAgIHRoaXMuX2hpbnRMYWJlbCA9ICcnOwogICAgICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoZSBoaW50IGxhYmVsLgogICAgICAgICAgICB0aGlzLl9oaW50TGFiZWxJZCA9IGBtYXQtaGludC0ke25leHRVbmlxdWVJZCQyKyt9YDsKICAgICAgICAgICAgLy8gVW5pcXVlIGlkIGZvciB0aGUgaW50ZXJuYWwgZm9ybSBmaWVsZCBsYWJlbC4KICAgICAgICAgICAgdGhpcy5fbGFiZWxJZCA9IGBtYXQtZm9ybS1maWVsZC1sYWJlbC0ke25leHRVbmlxdWVJZCQyKyt9YDsKICAgICAgICAgICAgdGhpcy5fbGFiZWxPcHRpb25zID0gbGFiZWxPcHRpb25zID8gbGFiZWxPcHRpb25zIDoge307CiAgICAgICAgICAgIHRoaXMuZmxvYXRMYWJlbCA9IHRoaXMuX2dldERlZmF1bHRGbG9hdExhYmVsU3RhdGUoKTsKICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uc0VuYWJsZWQgPSBfYW5pbWF0aW9uTW9kZSAhPT0gJ05vb3BBbmltYXRpb25zJzsKICAgICAgICAgICAgLy8gU2V0IHRoZSBkZWZhdWx0IHRocm91Z2ggaGVyZSBzbyB3ZSBpbnZva2UgdGhlIHNldHRlciBvbiB0aGUgZmlyc3QgcnVuLgogICAgICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPSAoX2RlZmF1bHRzICYmIF9kZWZhdWx0cy5hcHBlYXJhbmNlKSA/IF9kZWZhdWx0cy5hcHBlYXJhbmNlIDogJ2xlZ2FjeSc7CiAgICAgICAgICAgIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlciA9IChfZGVmYXVsdHMgJiYgX2RlZmF1bHRzLmhpZGVSZXF1aXJlZE1hcmtlciAhPSBudWxsKSA/CiAgICAgICAgICAgICAgICBfZGVmYXVsdHMuaGlkZVJlcXVpcmVkTWFya2VyIDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBmb3JtLWZpZWxkIGFwcGVhcmFuY2Ugc3R5bGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXBwZWFyYW5jZSgpIHsgcmV0dXJuIHRoaXMuX2FwcGVhcmFuY2U7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgYXBwZWFyYW5jZSh2YWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy5fYXBwZWFyYW5jZTsKICAgICAgICAgICAgdGhpcy5fYXBwZWFyYW5jZSA9IHZhbHVlIHx8ICh0aGlzLl9kZWZhdWx0cyAmJiB0aGlzLl9kZWZhdWx0cy5hcHBlYXJhbmNlKSB8fCAnbGVnYWN5JzsKICAgICAgICAgICAgaWYgKHRoaXMuX2FwcGVhcmFuY2UgPT09ICdvdXRsaW5lJyAmJiBvbGRWYWx1ZSAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSByZXF1aXJlZCBtYXJrZXIgc2hvdWxkIGJlIGhpZGRlbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBoaWRlUmVxdWlyZWRNYXJrZXIoKSB7IHJldHVybiB0aGlzLl9oaWRlUmVxdWlyZWRNYXJrZXI7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgaGlkZVJlcXVpcmVkTWFya2VyKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2hpZGVSZXF1aXJlZE1hcmtlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGZsb2F0aW5nIGxhYmVsIHNob3VsZCBhbHdheXMgZmxvYXQgb3Igbm90LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF9zaG91bGRBbHdheXNGbG9hdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmxvYXRMYWJlbCA9PT0gJ2Fsd2F5cycgJiYgIXRoaXMuX3Nob3dBbHdheXNBbmltYXRlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBsYWJlbCBjYW4gZmxvYXQgb3Igbm90LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF9jYW5MYWJlbEZsb2F0KCkgeyByZXR1cm4gdGhpcy5mbG9hdExhYmVsICE9PSAnbmV2ZXInOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGV4dCBmb3IgdGhlIGZvcm0gZmllbGQgaGludC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBoaW50TGFiZWwoKSB7IHJldHVybiB0aGlzLl9oaW50TGFiZWw7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgaGludExhYmVsKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2hpbnRMYWJlbCA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9wcm9jZXNzSGludHMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgbGFiZWwgc2hvdWxkIGFsd2F5cyBmbG9hdCwgbmV2ZXIgZmxvYXQgb3IgZmxvYXQgYXMgdGhlIHVzZXIgdHlwZXMuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlOiBvbmx5IHRoZSBsZWdhY3kgYXBwZWFyYW5jZSBzdXBwb3J0cyB0aGUgYG5ldmVyYCBvcHRpb24uIGBuZXZlcmAgd2FzIG9yaWdpbmFsbHkgYWRkZWQgYXMgYQogICAgICAgICAqIHdheSB0byBtYWtlIHRoZSBmbG9hdGluZyBsYWJlbCBlbXVsYXRlIHRoZSBiZWhhdmlvciBvZiBhIHN0YW5kYXJkIGlucHV0IHBsYWNlaG9sZGVyLiBIb3dldmVyCiAgICAgICAgICogdGhlIGZvcm0gZmllbGQgbm93IHN1cHBvcnRzIGJvdGggZmxvYXRpbmcgbGFiZWxzIGFuZCBwbGFjZWhvbGRlcnMuIFRoZXJlZm9yZSBpbiB0aGUgbm9uLWxlZ2FjeQogICAgICAgICAqIGFwcGVhcmFuY2VzIHRoZSBgbmV2ZXJgIG9wdGlvbiBoYXMgYmVlbiBkaXNhYmxlZCBpbiBmYXZvciBvZiBqdXN0IHVzaW5nIHRoZSBwbGFjZWhvbGRlci4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmbG9hdExhYmVsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBlYXJhbmNlICE9PSAnbGVnYWN5JyAmJiB0aGlzLl9mbG9hdExhYmVsID09PSAnbmV2ZXInID8gJ2F1dG8nIDogdGhpcy5fZmxvYXRMYWJlbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGZsb2F0TGFiZWwodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLl9mbG9hdExhYmVsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mbG9hdExhYmVsID0gdmFsdWUgfHwgdGhpcy5fZ2V0RGVmYXVsdEZsb2F0TGFiZWxTdGF0ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgX2NvbnRyb2woKSB7CiAgICAgICAgICAgIC8vIFRPRE8oY3Jpc2JldG8pOiB3ZSBuZWVkIHRoaXMgd29ya2Fyb3VuZCBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLgogICAgICAgICAgICAvLyAgV2Ugc2hvdWxkIGNsZWFuIHRoaXMgdXAgb25jZSBJdnkgaXMgdGhlIGRlZmF1bHQgcmVuZGVyZXIuCiAgICAgICAgICAgIHJldHVybiB0aGlzLl9leHBsaWNpdEZvcm1GaWVsZENvbnRyb2wgfHwgdGhpcy5fY29udHJvbE5vblN0YXRpYyB8fCB0aGlzLl9jb250cm9sU3RhdGljOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgX2NvbnRyb2wodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZXhwbGljaXRGb3JtRmllbGRDb250cm9sID0gdmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF9sYWJlbENoaWxkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fbGFiZWxDaGlsZE5vblN0YXRpYyB8fCB0aGlzLl9sYWJlbENoaWxkU3RhdGljOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFuIEVsZW1lbnRSZWYgZm9yIHRoZSBlbGVtZW50IHRoYXQgYSBvdmVybGF5IGF0dGFjaGVkIHRvIHRoZSBmb3JtLWZpZWxkIHNob3VsZCBiZQogICAgICAgICAqIHBvc2l0aW9uZWQgcmVsYXRpdmUgdG8uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY29ubmVjdGlvbkNvbnRhaW5lclJlZiB8fCB0aGlzLl9lbGVtZW50UmVmOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVDb250cm9sQ2hpbGQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250cm9sID0gdGhpcy5fY29udHJvbDsKICAgICAgICAgICAgaWYgKGNvbnRyb2wuY29udHJvbFR5cGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBtYXQtZm9ybS1maWVsZC10eXBlLSR7Y29udHJvbC5jb250cm9sVHlwZX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiB0aGUgY2hpbGQgY29udHJvbCBzdGF0ZSBpbiBvcmRlciB0byB1cGRhdGUgdGhlIGZvcm0gZmllbGQgVUkuCiAgICAgICAgICAgIGNvbnRyb2wuc3RhdGVDaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKCgvKiogQHR5cGUgez99ICovIChudWxsKSkpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVQbGFjZWhvbGRlcnMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3N5bmNEZXNjcmliZWRCeUlkcygpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gUnVuIGNoYW5nZSBkZXRlY3Rpb24gaWYgdGhlIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICAgIGlmIChjb250cm9sLm5nQ29udHJvbCAmJiBjb250cm9sLm5nQ29udHJvbC52YWx1ZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgIGNvbnRyb2wubmdDb250cm9sLnZhbHVlQ2hhbmdlcwogICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKQogICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byBydW4gb3V0c2lkZSBvZiB0aGUgYE5nWm9uZWAgZXhwbGljaXRseSwKICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gYXZvaWQgdGhyb3dpbmcgdXNlcnMgaW50byBhbiBpbmZpbml0ZSBsb29wCiAgICAgICAgICAgIC8vIGlmIGB6b25lLXBhdGNoLXJ4anNgIGlzIGluY2x1ZGVkLgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlT3V0bGluZUdhcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBSdW4gY2hhbmdlIGRldGVjdGlvbiBhbmQgdXBkYXRlIHRoZSBvdXRsaW5lIGlmIHRoZSBzdWZmaXggb3IgcHJlZml4IGNoYW5nZXMuCiAgICAgICAgICAgIG1lcmdlKHRoaXMuX3ByZWZpeENoaWxkcmVuLmNoYW5nZXMsIHRoaXMuX3N1ZmZpeENoaWxkcmVuLmNoYW5nZXMpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBSZS12YWxpZGF0ZSB3aGVuIHRoZSBudW1iZXIgb2YgaGludHMgY2hhbmdlcy4KICAgICAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9jZXNzSGludHMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgYXJpYS1kZXNjcmliZWQgYnkgd2hlbiB0aGUgbnVtYmVyIG9mIGVycm9ycyBjaGFuZ2VzLgogICAgICAgICAgICB0aGlzLl9lcnJvckNoaWxkcmVuLmNoYW5nZXMucGlwZShzdGFydFdpdGgobnVsbCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9zeW5jRGVzY3JpYmVkQnlJZHMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9kaXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpci5jaGFuZ2UucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9PT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMudXBkYXRlT3V0bGluZUdhcCgpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlT3V0bGluZUdhcCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50Q2hlY2tlZCgpIHsKICAgICAgICAgICAgdGhpcy5fdmFsaWRhdGVDb250cm9sQ2hpbGQoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5KSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZU91dGxpbmVHYXAoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHsKICAgICAgICAgICAgLy8gQXZvaWQgYW5pbWF0aW9ucyBvbiBsb2FkLgogICAgICAgICAgICB0aGlzLl9zdWJzY3JpcHRBbmltYXRpb25TdGF0ZSA9ICdlbnRlcic7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciBhIGNsYXNzIGZyb20gdGhlIE5nQ29udHJvbCBzaG91bGQgYmUgZm9yd2FyZGVkIHRvIHRoZSBob3N0IGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkRm9yd2FyZChwcm9wKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmdDb250cm9sID0gdGhpcy5fY29udHJvbCA/IHRoaXMuX2NvbnRyb2wubmdDb250cm9sIDogbnVsbDsKICAgICAgICAgICAgcmV0dXJuIG5nQ29udHJvbCAmJiBuZ0NvbnRyb2xbcHJvcF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhc1BsYWNlaG9sZGVyKCkgewogICAgICAgICAgICByZXR1cm4gISEodGhpcy5fY29udHJvbCAmJiB0aGlzLl9jb250cm9sLnBsYWNlaG9sZGVyIHx8IHRoaXMuX3BsYWNlaG9sZGVyQ2hpbGQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYXNMYWJlbCgpIHsKICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5fbGFiZWxDaGlsZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2hvdWxkTGFiZWxGbG9hdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NhbkxhYmVsRmxvYXQgJiYgKHRoaXMuX2NvbnRyb2wuc2hvdWxkTGFiZWxGbG9hdCB8fCB0aGlzLl9zaG91bGRBbHdheXNGbG9hdCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hpZGVDb250cm9sUGxhY2Vob2xkZXIoKSB7CiAgICAgICAgICAgIC8vIEluIHRoZSBsZWdhY3kgYXBwZWFyYW5jZSB0aGUgcGxhY2Vob2xkZXIgaXMgcHJvbW90ZWQgdG8gYSBsYWJlbCBpZiBubyBsYWJlbCBpcyBnaXZlbi4KICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwZWFyYW5jZSA9PT0gJ2xlZ2FjeScgJiYgIXRoaXMuX2hhc0xhYmVsKCkgfHwKICAgICAgICAgICAgICAgIHRoaXMuX2hhc0xhYmVsKCkgJiYgIXRoaXMuX3Nob3VsZExhYmVsRmxvYXQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFzRmxvYXRpbmdMYWJlbCgpIHsKICAgICAgICAgICAgLy8gSW4gdGhlIGxlZ2FjeSBhcHBlYXJhbmNlIHRoZSBwbGFjZWhvbGRlciBpcyBwcm9tb3RlZCB0byBhIGxhYmVsIGlmIG5vIGxhYmVsIGlzIGdpdmVuLgogICAgICAgICAgICByZXR1cm4gdGhpcy5faGFzTGFiZWwoKSB8fCB0aGlzLmFwcGVhcmFuY2UgPT09ICdsZWdhY3knICYmIHRoaXMuX2hhc1BsYWNlaG9sZGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0byBkaXNwbGF5IGhpbnRzIG9yIGVycm9ycy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXREaXNwbGF5ZWRNZXNzYWdlcygpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9lcnJvckNoaWxkcmVuICYmIHRoaXMuX2Vycm9yQ2hpbGRyZW4ubGVuZ3RoID4gMCAmJgogICAgICAgICAgICAgICAgdGhpcy5fY29udHJvbC5lcnJvclN0YXRlKSA/ICdlcnJvcicgOiAnaGludCc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFuaW1hdGVzIHRoZSBwbGFjZWhvbGRlciB1cCBhbmQgbG9ja3MgaXQgaW4gcG9zaXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYW5pbWF0ZUFuZExvY2tMYWJlbCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0Zsb2F0aW5nTGFiZWwoKSAmJiB0aGlzLl9jYW5MYWJlbEZsb2F0KSB7CiAgICAgICAgICAgICAgICAvLyBJZiBhbmltYXRpb25zIGFyZSBkaXNhYmxlZCwgd2Ugc2hvdWxkbid0IGdvIGluIGhlcmUsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSBgdHJhbnNpdGlvbmVuZGAgd2lsbCBuZXZlciBmaXJlLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2FuaW1hdGlvbnNFbmFibGVkICYmIHRoaXMuX2xhYmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Fsd2F5c0FuaW1hdGUgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIGZyb21FdmVudCh0aGlzLl9sYWJlbC5uYXRpdmVFbGVtZW50LCAndHJhbnNpdGlvbmVuZCcpLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2hvd0Fsd2F5c0FuaW1hdGUgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmZsb2F0TGFiZWwgPSAnYWx3YXlzJzsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVuc3VyZSB0aGF0IHRoZXJlIGlzIG9ubHkgb25lIHBsYWNlaG9sZGVyIChlaXRoZXIgYHBsYWNlaG9sZGVyYCBhdHRyaWJ1dGUgb24gdGhlIGNoaWxkIGNvbnRyb2wKICAgICAgICAgKiBvciBjaGlsZCBlbGVtZW50IHdpdGggdGhlIGBtYXQtcGxhY2Vob2xkZXJgIGRpcmVjdGl2ZSkuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZVBsYWNlaG9sZGVycygpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRyb2wucGxhY2Vob2xkZXIgJiYgdGhpcy5fcGxhY2Vob2xkZXJDaGlsZCkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0Rm9ybUZpZWxkUGxhY2Vob2xkZXJDb25mbGljdEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRG9lcyBhbnkgZXh0cmEgcHJvY2Vzc2luZyB0aGF0IGlzIHJlcXVpcmVkIHdoZW4gaGFuZGxpbmcgdGhlIGhpbnRzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcHJvY2Vzc0hpbnRzKCkgewogICAgICAgICAgICB0aGlzLl92YWxpZGF0ZUhpbnRzKCk7CiAgICAgICAgICAgIHRoaXMuX3N5bmNEZXNjcmliZWRCeUlkcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbnN1cmUgdGhhdCB0aGVyZSBpcyBhIG1heGltdW0gb2Ygb25lIG9mIGVhY2ggYDxtYXQtaGludD5gIGFsaWdubWVudCBzcGVjaWZpZWQsIHdpdGggdGhlCiAgICAgICAgICogYXR0cmlidXRlIGJlaW5nIGNvbnNpZGVyZWQgYXMgYGFsaWduPSJzdGFydCJgLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdmFsaWRhdGVIaW50cygpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2hpbnRDaGlsZHJlbikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHN0YXJ0SGludDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBlbmRIaW50OwogICAgICAgICAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBoaW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoaGludCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChoaW50LmFsaWduID09PSAnc3RhcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdGFydEhpbnQgfHwgdGhpcy5oaW50TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGdldE1hdEZvcm1GaWVsZER1cGxpY2F0ZWRIaW50RXJyb3IoJ3N0YXJ0Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRIaW50ID0gaGludDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoaGludC5hbGlnbiA9PT0gJ2VuZCcpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVuZEhpbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IGdldE1hdEZvcm1GaWVsZER1cGxpY2F0ZWRIaW50RXJyb3IoJ2VuZCcpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVuZEhpbnQgPSBoaW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IGZsb2F0IGxhYmVsIHN0YXRlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0RGVmYXVsdEZsb2F0TGFiZWxTdGF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9kZWZhdWx0cyAmJiB0aGlzLl9kZWZhdWx0cy5mbG9hdExhYmVsKSB8fCB0aGlzLl9sYWJlbE9wdGlvbnMuZmxvYXQgfHwgJ2F1dG8nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIGVsZW1lbnQgSURzIHRoYXQgZGVzY3JpYmUgdGhlIGNoaWxkIGNvbnRyb2wuIFRoaXMgYWxsb3dzIHRoZSBjb250cm9sIHRvIHVwZGF0ZQogICAgICAgICAqIGl0cyBgYXJpYS1kZXNjcmliZWRieWAgYXR0cmlidXRlIGFjY29yZGluZ2x5LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3luY0Rlc2NyaWJlZEJ5SWRzKCkgewogICAgICAgICAgICBpZiAodGhpcy5fY29udHJvbCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGlkcyA9IFtdOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2dldERpc3BsYXllZE1lc3NhZ2VzKCkgPT09ICdoaW50JykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGFydEhpbnQgPSB0aGlzLl9oaW50Q2hpbGRyZW4gPwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9oaW50Q2hpbGRyZW4uZmluZCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaGludAogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgaGludCA9PiBoaW50LmFsaWduID09PSAnc3RhcnQnKSkgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlbmRIaW50ID0gdGhpcy5faGludENoaWxkcmVuID8KICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faGludENoaWxkcmVuLmZpbmQoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGhpbnQKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIGhpbnQgPT4gaGludC5hbGlnbiA9PT0gJ2VuZCcpKSA6IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXJ0SGludCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChzdGFydEhpbnQuaWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9oaW50TGFiZWwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWRzLnB1c2godGhpcy5faGludExhYmVsSWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAoZW5kSGludCkgewogICAgICAgICAgICAgICAgICAgICAgICBpZHMucHVzaChlbmRIaW50LmlkKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9lcnJvckNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICAgICAgaWRzID0gdGhpcy5fZXJyb3JDaGlsZHJlbi5tYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGVycm9yID0+IGVycm9yLmlkKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jb250cm9sLnNldERlc2NyaWJlZEJ5SWRzKGlkcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBmb3JtIGZpZWxkJ3MgY29udHJvbCBpcyBtaXNzaW5nLgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF92YWxpZGF0ZUNvbnRyb2xDaGlsZCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9jb250cm9sKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRGb3JtRmllbGRNaXNzaW5nQ29udHJvbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgd2lkdGggYW5kIHBvc2l0aW9uIG9mIHRoZSBnYXAgaW4gdGhlIG91dGxpbmUuIE9ubHkgcmVsZXZhbnQgZm9yIHRoZSBvdXRsaW5lCiAgICAgICAgICogYXBwZWFyYW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZU91dGxpbmVHYXAoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGFiZWxFbCA9IHRoaXMuX2xhYmVsID8gdGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudCA6IG51bGw7CiAgICAgICAgICAgIGlmICh0aGlzLmFwcGVhcmFuY2UgIT09ICdvdXRsaW5lJyB8fCAhbGFiZWxFbCB8fCAhbGFiZWxFbC5jaGlsZHJlbi5sZW5ndGggfHwKICAgICAgICAgICAgICAgICFsYWJlbEVsLnRleHRDb250ZW50LnRyaW0oKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICAvLyBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXNuJ3QgYXZhaWxhYmxlIG9uIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIGVsZW1lbnQgaXMgbm90IHByZXNlbnQgaW4gdGhlIERPTSwgdGhlIG91dGxpbmUgZ2FwIHdpbGwgbmVlZCB0byBiZSBjYWxjdWxhdGVkCiAgICAgICAgICAgIC8vIHRoZSBuZXh0IHRpbWUgaXQgaXMgY2hlY2tlZCBhbmQgaW4gdGhlIERPTS4KICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0F0dGFjaGVkVG9ET00oKSkgewogICAgICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHkgPSB0cnVlOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0YXJ0V2lkdGggPSAwOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBnYXBXaWR0aCA9IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29ubmVjdGlvbkNvbnRhaW5lclJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0YXJ0RWxzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Jyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZ2FwRWxzID0gY29udGFpbmVyLnF1ZXJ5U2VsZWN0b3JBbGwoJy5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcCcpOwogICAgICAgICAgICBpZiAodGhpcy5fbGFiZWwgJiYgdGhpcy5fbGFiZWwubmF0aXZlRWxlbWVudC5jaGlsZHJlbi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclJlY3QgPSBjb250YWluZXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgY29udGFpbmVyJ3Mgd2lkdGggYW5kIGhlaWdodCBhcmUgemVybywgaXQgbWVhbnMgdGhhdCB0aGUgZWxlbWVudCBpcwogICAgICAgICAgICAgICAgLy8gaW52aXNpYmxlIGFuZCB3ZSBjYW4ndCBjYWxjdWxhdGUgdGhlIG91dGxpbmUgZ2FwLiBNYXJrIHRoZSBlbGVtZW50IGFzIG5lZWRpbmcKICAgICAgICAgICAgICAgIC8vIHRvIGJlIGNoZWNrZWQgdGhlIG5leHQgdGltZSB0aGUgem9uZSBzdGFiaWxpemVzLiBXZSBjYW4ndCBkbyB0aGlzIGltbWVkaWF0ZWx5CiAgICAgICAgICAgICAgICAvLyBvbiB0aGUgbmV4dCBjaGFuZ2UgZGV0ZWN0aW9uLCBiZWNhdXNlIGV2ZW4gaWYgdGhlIGVsZW1lbnQgYmVjb21lcyB2aXNpYmxlLAogICAgICAgICAgICAgICAgLy8gdGhlIGBDbGllbnRSZWN0YCB3b24ndCBiZSByZWNsYWN1bGF0ZWQgaW1tZWRpYXRlbHkuIFdlIHJlc2V0IHRoZQogICAgICAgICAgICAgICAgLy8gYF9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRJbW1lZGlhdGVseWAgZmxhZyBzb21lIHdlIGRvbid0IHJ1biB0aGUgY2hlY2tzIHR3aWNlLgogICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lclJlY3Qud2lkdGggPT09IDAgJiYgY29udGFpbmVyUmVjdC5oZWlnaHQgPT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vdXRsaW5lR2FwQ2FsY3VsYXRpb25OZWVkZWRPblN0YWJsZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3V0bGluZUdhcENhbGN1bGF0aW9uTmVlZGVkSW1tZWRpYXRlbHkgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXJTdGFydCA9IHRoaXMuX2dldFN0YXJ0RW5kKGNvbnRhaW5lclJlY3QpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGFiZWxTdGFydCA9IHRoaXMuX2dldFN0YXJ0RW5kKGxhYmVsRWwuY2hpbGRyZW5bMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGxhYmVsV2lkdGggPSAwOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBsYWJlbEVsLmNoaWxkcmVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGFiZWxXaWR0aCArPSBjaGlsZC5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXJ0V2lkdGggPSBNYXRoLmFicyhsYWJlbFN0YXJ0IC0gY29udGFpbmVyU3RhcnQpIC0gb3V0bGluZUdhcFBhZGRpbmc7CiAgICAgICAgICAgICAgICBnYXBXaWR0aCA9IGxhYmVsV2lkdGggPiAwID8gbGFiZWxXaWR0aCAqIGZsb2F0aW5nTGFiZWxTY2FsZSArIG91dGxpbmVHYXBQYWRkaW5nICogMiA6IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGFydEVscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgc3RhcnRFbHNbaV0uc3R5bGUud2lkdGggPSBgJHtzdGFydFdpZHRofXB4YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGdhcEVscy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgZ2FwRWxzW2ldLnN0eWxlLndpZHRoID0gYCR7Z2FwV2lkdGh9cHhgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZE9uU3RhYmxlID0KICAgICAgICAgICAgICAgIHRoaXMuX291dGxpbmVHYXBDYWxjdWxhdGlvbk5lZWRlZEltbWVkaWF0ZWx5ID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHN0YXJ0IGVuZCBvZiB0aGUgcmVjdCBjb25zaWRlcmluZyB0aGUgY3VycmVudCBkaXJlY3Rpb25hbGl0eS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmVjdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFN0YXJ0RW5kKHJlY3QpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9kaXIgJiYgdGhpcy5fZGlyLnZhbHVlID09PSAncnRsJykgPyByZWN0LnJpZ2h0IDogcmVjdC5sZWZ0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZm9ybSBmaWVsZCBpcyBhdHRhY2hlZCB0byB0aGUgRE9NLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNBdHRhY2hlZFRvRE9NKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIGlmIChlbGVtZW50LmdldFJvb3ROb2RlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByb290Tm9kZSA9IGVsZW1lbnQuZ2V0Um9vdE5vZGUoKTsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzIGluc2lkZSB0aGUgRE9NIHRoZSByb290IG5vZGUgd2lsbCBiZSBlaXRoZXIgdGhlIGRvY3VtZW50CiAgICAgICAgICAgICAgICAvLyBvciB0aGUgY2xvc2VzdCBzaGFkb3cgcm9vdCwgb3RoZXJ3aXNlIGl0J2xsIGJlIHRoZSBlbGVtZW50IGl0c2VsZi4KICAgICAgICAgICAgICAgIHJldHVybiByb290Tm9kZSAmJiByb290Tm9kZSAhPT0gZWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBPdGhlcndpc2UgZmFsbCBiYWNrIHRvIGNoZWNraW5nIGlmIGl0J3MgaW4gdGhlIGRvY3VtZW50LiBUaGlzIGRvZXNuJ3QgYWNjb3VudCBmb3IKICAgICAgICAgICAgLy8gc2hhZG93IERPTSwgaG93ZXZlciBicm93c2VyIHRoYXQgc3VwcG9ydCBzaGFkb3cgRE9NIHNob3VsZCBzdXBwb3J0IGBnZXRSb290Tm9kZWAgYXMgd2VsbC4KICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKS5jb250YWlucyhlbGVtZW50KTsKICAgICAgICB9CiAgICB9CiAgICBNYXRGb3JtRmllbGQuybVmYWMgPSBmdW5jdGlvbiBNYXRGb3JtRmllbGRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0Rm9ybUZpZWxkKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfTEFCRUxfR0xPQkFMX09QVElPTlMsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfRk9STV9GSUVMRF9ERUZBVUxUX09QVElPTlMsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgTWF0Rm9ybUZpZWxkLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEZvcm1GaWVsZCwgc2VsZWN0b3JzOiBbWyJtYXQtZm9ybS1maWVsZCJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9Db250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJJbmRleCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdEZvcm1GaWVsZENvbnRyb2wsIHRydWUpOwogICAgICAgICAgICDJtcm1c3RhdGljQ29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRGb3JtRmllbGRDb250cm9sLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0TGFiZWwsIHRydWUpOwogICAgICAgICAgICDJtcm1c3RhdGljQ29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRMYWJlbCwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdFBsYWNlaG9sZGVyLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0RXJyb3IsIHRydWUpOwogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRIaW50LCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0UHJlZml4LCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0U3VmZml4LCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9jb250cm9sTm9uU3RhdGljID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9jb250cm9sU3RhdGljID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9sYWJlbENoaWxkTm9uU3RhdGljID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9sYWJlbENoaWxkU3RhdGljID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9wbGFjZWhvbGRlckNoaWxkID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9lcnJvckNoaWxkcmVuID0gX3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9oaW50Q2hpbGRyZW4gPSBfdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3ByZWZpeENoaWxkcmVuID0gX3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9zdWZmaXhDaGlsZHJlbiA9IF90KTsKICAgICAgICB9IH0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0Rm9ybUZpZWxkX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMCQ0LCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzEkNCwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2MyJDIsIHRydWUpOwogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMyQxLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnVuZGVybGluZVJlZiA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fY29ubmVjdGlvbkNvbnRhaW5lclJlZiA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW5wdXRDb250YWluZXJSZWYgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2xhYmVsID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1mb3JtLWZpZWxkIl0sIGhvc3RWYXJzOiA0NCwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRGb3JtRmllbGRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIiwgY3R4LmFwcGVhcmFuY2UgPT0gInN0YW5kYXJkIikoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCIsIGN0eC5hcHBlYXJhbmNlID09ICJmaWxsIikoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSIsIGN0eC5hcHBlYXJhbmNlID09ICJvdXRsaW5lIikoIm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IiwgY3R4LmFwcGVhcmFuY2UgPT0gImxlZ2FjeSIpKCJtYXQtZm9ybS1maWVsZC1pbnZhbGlkIiwgY3R4Ll9jb250cm9sLmVycm9yU3RhdGUpKCJtYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQiLCBjdHguX2NhbkxhYmVsRmxvYXQpKCJtYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQiLCBjdHguX3Nob3VsZExhYmVsRmxvYXQoKSkoIm1hdC1mb3JtLWZpZWxkLWhhcy1sYWJlbCIsIGN0eC5faGFzRmxvYXRpbmdMYWJlbCgpKSgibWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciIsIGN0eC5faGlkZUNvbnRyb2xQbGFjZWhvbGRlcigpKSgibWF0LWZvcm0tZmllbGQtZGlzYWJsZWQiLCBjdHguX2NvbnRyb2wuZGlzYWJsZWQpKCJtYXQtZm9ybS1maWVsZC1hdXRvZmlsbGVkIiwgY3R4Ll9jb250cm9sLmF1dG9maWxsZWQpKCJtYXQtZm9jdXNlZCIsIGN0eC5fY29udHJvbC5mb2N1c2VkKSgibWF0LWFjY2VudCIsIGN0eC5jb2xvciA9PSAiYWNjZW50IikoIm1hdC13YXJuIiwgY3R4LmNvbG9yID09ICJ3YXJuIikoIm5nLXVudG91Y2hlZCIsIGN0eC5fc2hvdWxkRm9yd2FyZCgidW50b3VjaGVkIikpKCJuZy10b3VjaGVkIiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJ0b3VjaGVkIikpKCJuZy1wcmlzdGluZSIsIGN0eC5fc2hvdWxkRm9yd2FyZCgicHJpc3RpbmUiKSkoIm5nLWRpcnR5IiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJkaXJ0eSIpKSgibmctdmFsaWQiLCBjdHguX3Nob3VsZEZvcndhcmQoInZhbGlkIikpKCJuZy1pbnZhbGlkIiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJpbnZhbGlkIikpKCJuZy1wZW5kaW5nIiwgY3R4Ll9zaG91bGRGb3J3YXJkKCJwZW5kaW5nIikpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsICFjdHguX2FuaW1hdGlvbnNFbmFibGVkKTsKICAgICAgICB9IH0sIGlucHV0czogeyBjb2xvcjogImNvbG9yIiwgZmxvYXRMYWJlbDogImZsb2F0TGFiZWwiLCBhcHBlYXJhbmNlOiAiYXBwZWFyYW5jZSIsIGhpZGVSZXF1aXJlZE1hcmtlcjogImhpZGVSZXF1aXJlZE1hcmtlciIsIGhpbnRMYWJlbDogImhpbnRMYWJlbCIgfSwgZXhwb3J0QXM6IFsibWF0Rm9ybUZpZWxkIl0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoWwogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNQVRfRk9STV9GSUVMRCwgdXNlRXhpc3Rpbmc6IE1hdEZvcm1GaWVsZCB9LAogICAgICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2M1JDEsIGRlY2xzOiAxNSwgdmFyczogOCwgY29uc3RzOiBbWzEsICJtYXQtZm9ybS1maWVsZC13cmFwcGVyIl0sIFsxLCAibWF0LWZvcm0tZmllbGQtZmxleCIsIDMsICJjbGljayJdLCBbImNvbm5lY3Rpb25Db250YWluZXIiLCAiIl0sIFs0LCAibmdJZiJdLCBbImNsYXNzIiwgIm1hdC1mb3JtLWZpZWxkLXByZWZpeCIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LWZvcm0tZmllbGQtaW5maXgiXSwgWyJpbnB1dENvbnRhaW5lciIsICIiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIl0sIFsiY2xhc3MiLCAibWF0LWZvcm0tZmllbGQtbGFiZWwiLCAzLCAiY2RrT2JzZXJ2ZUNvbnRlbnREaXNhYmxlZCIsICJpZCIsICJtYXQtZW1wdHkiLCAibWF0LWZvcm0tZmllbGQtZW1wdHkiLCAibWF0LWFjY2VudCIsICJtYXQtd2FybiIsICJuZ1N3aXRjaCIsICJjZGtPYnNlcnZlQ29udGVudCIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAibWF0LWZvcm0tZmllbGQtc3VmZml4IiwgNCwgIm5nSWYiXSwgWyJjbGFzcyIsICJtYXQtZm9ybS1maWVsZC11bmRlcmxpbmUiLCA0LCAibmdJZiJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIiwgMywgIm5nU3dpdGNoIl0sIFs0LCAibmdTd2l0Y2hDYXNlIl0sIFsiY2xhc3MiLCAibWF0LWZvcm0tZmllbGQtaGludC13cmFwcGVyIiwgNCwgIm5nU3dpdGNoQ2FzZSJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0Il0sIFsxLCAibWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXAiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZCJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLW91dGxpbmUiLCAibWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGljayJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXByZWZpeCJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLWxhYmVsIiwgMywgImNka09ic2VydmVDb250ZW50RGlzYWJsZWQiLCAiaWQiLCAibmdTd2l0Y2giLCAiY2RrT2JzZXJ2ZUNvbnRlbnQiXSwgWyJsYWJlbCIsICIiXSwgWyJjbGFzcyIsICJtYXQtcGxhY2Vob2xkZXItcmVxdWlyZWQgbWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyIiwgImFyaWEtaGlkZGVuIiwgInRydWUiLCA0LCAibmdJZiJdLCBbImFyaWEtaGlkZGVuIiwgInRydWUiLCAxLCAibWF0LXBsYWNlaG9sZGVyLXJlcXVpcmVkIiwgIm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlciJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCJdLCBbMSwgIm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSJdLCBbInVuZGVybGluZSIsICIiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1yaXBwbGUiXSwgWzEsICJtYXQtZm9ybS1maWVsZC1oaW50LXdyYXBwZXIiXSwgWyJjbGFzcyIsICJtYXQtaGludCIsIDMsICJpZCIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LWZvcm0tZmllbGQtaGludC1zcGFjZXIiXSwgWzEsICJtYXQtaGludCIsIDMsICJpZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEZvcm1GaWVsZF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoX2M0JDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSwgMik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRGb3JtRmllbGRfVGVtcGxhdGVfZGl2X2NsaWNrXzFfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX2NvbnRyb2wub25Db250YWluZXJDbGljayAmJiBjdHguX2NvbnRyb2wub25Db250YWluZXJDbGljaygkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDMsIE1hdEZvcm1GaWVsZF9uZ19jb250YWluZXJfM19UZW1wbGF0ZSwgOSwgMCwgIm5nLWNvbnRhaW5lciIsIDMpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNCwgTWF0Rm9ybUZpZWxkX2Rpdl80X1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDUsIDYpOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbig3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAic3BhbiIsIDcpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoOSwgTWF0Rm9ybUZpZWxkX2xhYmVsXzlfVGVtcGxhdGUsIDUsIDE2LCAibGFiZWwiLCA4KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEwLCBNYXRGb3JtRmllbGRfZGl2XzEwX1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgOSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxMSwgTWF0Rm9ybUZpZWxkX2Rpdl8xMV9UZW1wbGF0ZSwgMywgNCwgImRpdiIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMiwgImRpdiIsIDExKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEzLCBNYXRGb3JtRmllbGRfZGl2XzEzX1RlbXBsYXRlLCAyLCAxLCAiZGl2IiwgMTIpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMTQsIE1hdEZvcm1GaWVsZF9kaXZfMTRfVGVtcGxhdGUsIDUsIDIsICJkaXYiLCAxMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguYXBwZWFyYW5jZSA9PSAib3V0bGluZSIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Ll9wcmVmaXhDaGlsZHJlbi5sZW5ndGgpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Ll9oYXNGbG9hdGluZ0xhYmVsKCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Ll9zdWZmaXhDaGlsZHJlbi5sZW5ndGgpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmFwcGVhcmFuY2UgIT0gIm91dGxpbmUiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCBjdHguX2dldERpc3BsYXllZE1lc3NhZ2VzKCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCAiZXJyb3IiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgImhpbnQiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBDZGtPYnNlcnZlQ29udGVudF0sIHN0eWxlczogWyIubWF0LWZvcm0tZmllbGR7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246cmVsYXRpdmU7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSAubWF0LWZvcm0tZmllbGR7dGV4dC1hbGlnbjpyaWdodH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQtZmxleHtkaXNwbGF5OmlubGluZS1mbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO2JveC1zaXppbmc6Ym9yZGVyLWJveDt3aWR0aDoxMDAlfS5tYXQtZm9ybS1maWVsZC1wcmVmaXgsLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt3aGl0ZS1zcGFjZTpub3dyYXA7ZmxleDpub25lO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtZm9ybS1maWVsZC1pbmZpeHtkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlO2ZsZXg6YXV0bzttaW4td2lkdGg6MDt3aWR0aDoxODBweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1pbmZpeHtib3JkZXItaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRyYW5zcGFyZW50LCB0cmFuc3BhcmVudCl9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO2JveC1zaXppbmc6Y29udGVudC1ib3g7d2lkdGg6MTAwJTtoZWlnaHQ6MTAwJTtvdmVyZmxvdzpoaWRkZW47cG9pbnRlci1ldmVudHM6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1mb3JtLWZpZWxkLWxhYmVse3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDtmb250OmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTt3aWR0aDoxMDAlO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO292ZXJmbG93OmhpZGRlbjt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxjb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSx3aWR0aCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtkaXNwbGF5Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm0tb3JpZ2luOjEwMCUgMDtsZWZ0OmF1dG87cmlnaHQ6MH0ubWF0LWZvcm0tZmllbGQtZW1wdHkubWF0LWZvcm0tZmllbGQtbGFiZWwsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVse2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpibG9jazt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtaW5wdXQtc2VydmVyW3BsYWNlaG9sZGVyXTpub3QoOnBsYWNlaG9sZGVyLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbcGxhY2Vob2xkZXJdOm5vdCg6cGxhY2Vob2xkZXItc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtkaXNwbGF5OmJsb2NrfS5tYXQtZm9ybS1maWVsZC1sYWJlbDpub3QoLm1hdC1mb3JtLWZpZWxkLWVtcHR5KXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxMDAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNmb3JtOnNjYWxlM2QoMSwgMS4wMDAxLCAxKX0ubWF0LWZvcm0tZmllbGQtcmlwcGxle3Bvc2l0aW9uOmFic29sdXRlO2xlZnQ6MDt3aWR0aDoxMDAlO3RyYW5zZm9ybS1vcmlnaW46NTAlO3RyYW5zZm9ybTpzY2FsZVgoMC41KTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxlLC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpzY2FsZVgoMSk7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMzAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksb3BhY2l0eSAxMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDMwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW59Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWljb257d2lkdGg6MWVtO2hlaWdodDoxZW07Zm9udC1zaXplOmluaGVyaXQ7dmVydGljYWwtYWxpZ246YmFzZWxpbmV9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtd3JhcHBlcntkaXNwbGF5OmZsZXh9Lm1hdC1mb3JtLWZpZWxkLWhpbnQtc3BhY2Vye2ZsZXg6MSAwIDFlbX0ubWF0LWVycm9ye2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkLWNvbnRyb2wtd3JhcHBlcntwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWZvcm0tZmllbGQuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtcmlwcGxle3RyYW5zaXRpb246bm9uZX1cbiIsICIubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JvcmRlci1yYWRpdXM6NHB4IDRweCAwIDA7cGFkZGluZzouNzVlbSAuNzVlbSAwIC43NWVtfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtZmxleHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtjb250ZW50OlwiXCI7ZGlzcGxheTpibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtib3R0b206MDtoZWlnaHQ6MXB4O3dpZHRoOjEwMCV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JvdHRvbTowO2hlaWdodDoycHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlOm5vdCgubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQpIC5tYXQtZm9ybS1maWVsZC1mbGV4OmhvdmVyfi5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmUgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJ7cGFkZGluZzowIDFlbX1cbiIsICIubWF0LWlucHV0LWVsZW1lbnR7Zm9udDppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6Y3VycmVudENvbG9yO2JvcmRlcjpub25lO291dGxpbmU6bm9uZTtwYWRkaW5nOjA7bWFyZ2luOjA7d2lkdGg6MTAwJTttYXgtd2lkdGg6MTAwJTt2ZXJ0aWNhbC1hbGlnbjpib3R0b207dGV4dC1hbGlnbjppbmhlcml0fS5tYXQtaW5wdXQtZWxlbWVudDotbW96LXVpLWludmFsaWR7Ym94LXNoYWRvdzpub25lfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLWNsZWFyLC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLXJldmVhbHtkaXNwbGF5Om5vbmV9Lm1hdC1pbnB1dC1lbGVtZW50LC5tYXQtaW5wdXQtZWxlbWVudDo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LXNlYXJjaC1yZXN1bHRzLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtc2VhcmNoLXJlc3VsdHMtZGVjb3JhdGlvbnstd2Via2l0LWFwcGVhcmFuY2U6bm9uZX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY29udGFjdHMtYXV0by1maWxsLWJ1dHRvbiwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY2Fwcy1sb2NrLWluZGljYXRvciwubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtY3JlZGVudGlhbHMtYXV0by1maWxsLWJ1dHRvbnt2aXNpYmlsaXR5OmhpZGRlbn0ubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRlXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZV0sLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9ZGF0ZXRpbWUtbG9jYWxdLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPW1vbnRoXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT13ZWVrXSwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT10aW1lXXtsaW5lLWhlaWdodDoxfS5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGVdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT1kYXRldGltZV06OmFmdGVyLC5tYXQtaW5wdXQtZWxlbWVudFt0eXBlPWRhdGV0aW1lLWxvY2FsXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9bW9udGhdOjphZnRlciwubWF0LWlucHV0LWVsZW1lbnRbdHlwZT13ZWVrXTo6YWZ0ZXIsLm1hdC1pbnB1dC1lbGVtZW50W3R5cGU9dGltZV06OmFmdGVye2NvbnRlbnQ6XCIgXCI7d2hpdGUtc3BhY2U6cHJlO3dpZHRoOjFweH0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24sLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNhbGVuZGFyLXBpY2tlci1pbmRpY2F0b3IsLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWNsZWFyLWJ1dHRvbntmb250LXNpemU6Ljc1ZW19Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtaW5wdXQtZWxlbWVudDo6cGxhY2Vob2xkZXI6LW1zLWlucHV0LXBsYWNlaG9sZGVyey1tcy11c2VyLXNlbGVjdDp0ZXh0fS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcnstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtaW5wdXQtZWxlbWVudDo6LW1vei1wbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVyOi1tcy1pbnB1dC1wbGFjZWhvbGRlcnstbXMtdXNlci1zZWxlY3Q6dGV4dH0ubWF0LWlucHV0LWVsZW1lbnQ6LW1zLWlucHV0LXBsYWNlaG9sZGVyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTt0cmFuc2l0aW9uOmNvbG9yIDQwMG1zIDEzMy4zMzMzMzMzMzMzbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1pbnB1dC1lbGVtZW50Oi1tcy1pbnB1dC1wbGFjZWhvbGRlcjotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7LW1zLXVzZXItc2VsZWN0OnRleHR9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjp0cmFuc3BhcmVudCAhaW1wb3J0YW50Oy13ZWJraXQtdGV4dC1maWxsLWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246bm9uZX0ubWF0LWZvcm0tZmllbGQtaGlkZS1wbGFjZWhvbGRlciAubWF0LWlucHV0LWVsZW1lbnQ6Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1pbnB1dC1lbGVtZW50Ojotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnRyYW5zcGFyZW50ICFpbXBvcnRhbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lfS5tYXQtZm9ybS1maWVsZC1oaWRlLXBsYWNlaG9sZGVyIC5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQgIWltcG9ydGFudDstd2Via2l0LXRleHQtZmlsbC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm5vbmV9dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnR7cmVzaXplOnZlcnRpY2FsO292ZXJmbG93OmF1dG99dGV4dGFyZWEubWF0LWlucHV0LWVsZW1lbnQuY2RrLXRleHRhcmVhLWF1dG9zaXple3Jlc2l6ZTpub25lfXRleHRhcmVhLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmc6MnB4IDA7bWFyZ2luOi0ycHggMH1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnR7LW1vei1hcHBlYXJhbmNlOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7cG9zaXRpb246cmVsYXRpdmU7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1mbGV4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nLXRvcDoxZW07dG9wOi0xZW07bWFyZ2luLWJvdHRvbTotMWVtfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDo6LW1zLWV4cGFuZHtkaXNwbGF5Om5vbmV9c2VsZWN0Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfXNlbGVjdC5tYXQtaW5wdXQtZWxlbWVudDpub3QoOmRpc2FibGVkKXtjdXJzb3I6cG9pbnRlcn1zZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy12YWx1ZXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6bm9uZX0ubWF0LWZvY3VzZWQgLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSBzZWxlY3QubWF0LWlucHV0LWVsZW1lbnQ6Oi1tcy12YWx1ZXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29udGVudDpcIlwiO3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci1yaWdodDo1cHggc29saWQgdHJhbnNwYXJlbnQ7Ym9yZGVyLXRvcDo1cHggc29saWQ7cG9zaXRpb246YWJzb2x1dGU7dG9wOjUwJTtyaWdodDowO21hcmdpbi10b3A6LTIuNXB4O3BvaW50ZXItZXZlbnRzOm5vbmV9W2Rpcj1ydGxdIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7cmlnaHQ6YXV0bztsZWZ0OjB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MTVweH1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1pbnB1dC1lbGVtZW50e3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MTVweH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdCAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnttYXgtd2lkdGg6Y2FsYygxMDAlIC0gMTBweCl9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7bWFyZ2luLXRvcDotNXB4fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye21hcmdpbi10b3A6LTEwcHh9XG4iLCAiLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06cGVyc3BlY3RpdmUoMTAwcHgpOy1tcy10cmFuc2Zvcm06bm9uZX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue3dpZHRoOjFlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257Zm9udDppbmhlcml0O3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29uLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2ZvbnQtc2l6ZTppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2hlaWdodDoxcHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtoZWlnaHQ6MDtib3JkZXItdG9wOnNvbGlkIDFweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXt0b3A6MDtoZWlnaHQ6MnB4O292ZXJmbG93OmhpZGRlbn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtcmlwcGxle2hlaWdodDowO2JvcmRlci10b3A6c29saWQgMnB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtcG9zaXRpb246MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7Ym9yZGVyLXRvcC1zdHlsZTpkb3R0ZWQ7Ym9yZGVyLXRvcC13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWludmFsaWQ6bm90KC5tYXQtZm9jdXNlZCkgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtoZWlnaHQ6MXB4fVxuIiwgIi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJ7bWFyZ2luOi4yNWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtZmxleHtwYWRkaW5nOjAgLjc1ZW0gMCAuNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW07cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtcHJlZml4LC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeHt0b3A6LjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7dG9wOi4yNWVtO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWVuZHtib3JkZXI6MXB4IHNvbGlkIGN1cnJlbnRDb2xvcjttaW4td2lkdGg6NXB4fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnR7Ym9yZGVyLXJhZGl1czo1cHggMCAwIDVweDtib3JkZXItcmlnaHQtc3R5bGU6bm9uZX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1zdGFydHtib3JkZXItcmlnaHQtc3R5bGU6c29saWQ7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtib3JkZXItcmFkaXVzOjAgNXB4IDVweCAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5ke2JvcmRlci1yYWRpdXM6MCA1cHggNXB4IDA7Ym9yZGVyLWxlZnQtc3R5bGU6bm9uZTtmbGV4LWdyb3c6MX1bZGlyPXJ0bF0gLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmR7Ym9yZGVyLWxlZnQtc3R5bGU6c29saWQ7Ym9yZGVyLXJpZ2h0LXN0eWxlOm5vbmU7Ym9yZGVyLXJhZGl1czo1cHggMCAwIDVweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLWdhcHtib3JkZXItcmFkaXVzOi4wMDAwMDFweDtib3JkZXI6MXB4IHNvbGlkIGN1cnJlbnRDb2xvcjtib3JkZXItbGVmdC1zdHlsZTpub25lO2JvcmRlci1yaWdodC1zdHlsZTpub25lfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7Ym9yZGVyLXRvcC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre29wYWNpdHk6MH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXN0YXJ0LC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZW5kLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2sgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtZ2Fwe2JvcmRlci13aWR0aDoycHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZSwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAxMDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja3tvcGFjaXR5OjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3ZlciAubWF0LWZvcm0tZmllbGQtb3V0bGluZXtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDYwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmU6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXg6aG92ZXIgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7b3BhY2l0eToxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVye3BhZGRpbmc6MCAxZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtb3V0bGluZSwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtc3RhcnQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1lbmQsLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWZvcm0tZmllbGQtb3V0bGluZS1nYXB7dHJhbnNpdGlvbjpub25lfVxuIiwgIi5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC1mbGV4e3BhZGRpbmctdG9wOi43NWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmV7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAxcHh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtib3R0b206MDtoZWlnaHQ6MnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZXtoZWlnaHQ6MDtib3JkZXItdG9wOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtcG9zaXRpb246MDtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtib3JkZXItdG9wLXN0eWxlOmRvdHRlZDtib3JkZXItdG9wLXdpZHRoOjJweH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZDpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7b3BhY2l0eToxO3RyYW5zZm9ybTpub25lO3RyYW5zaXRpb246b3BhY2l0eSA2MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZTpub3QoLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkKSAubWF0LWZvcm0tZmllbGQtZmxleDpob3Zlcn4ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7dHJhbnNpdGlvbjpub25lfVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGRhdGE6IHsgYW5pbWF0aW9uOiBbbWF0Rm9ybUZpZWxkQW5pbWF0aW9ucy50cmFuc2l0aW9uTWVzc2FnZXNdIH0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0Rm9ybUZpZWxkLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfTEFCRUxfR0xPQkFMX09QVElPTlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0ZPUk1fRklFTERfREVGQVVMVF9PUFRJT05TLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9CiAgICBdOwogICAgTWF0Rm9ybUZpZWxkLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGFwcGVhcmFuY2U6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGhpZGVSZXF1aXJlZE1hcmtlcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaGludExhYmVsOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmbG9hdExhYmVsOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB1bmRlcmxpbmVSZWY6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyd1bmRlcmxpbmUnLF0gfV0sCiAgICAgICAgX2Nvbm5lY3Rpb25Db250YWluZXJSZWY6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydjb25uZWN0aW9uQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUgfSxdIH1dLAogICAgICAgIF9pbnB1dENvbnRhaW5lclJlZjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2lucHV0Q29udGFpbmVyJyxdIH1dLAogICAgICAgIF9sYWJlbDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2xhYmVsJyxdIH1dLAogICAgICAgIF9jb250cm9sTm9uU3RhdGljOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtNYXRGb3JtRmllbGRDb250cm9sLF0gfV0sCiAgICAgICAgX2NvbnRyb2xTdGF0aWM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW01hdEZvcm1GaWVsZENvbnRyb2wsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgICAgICBfbGFiZWxDaGlsZE5vblN0YXRpYzogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0TGFiZWwsXSB9XSwKICAgICAgICBfbGFiZWxDaGlsZFN0YXRpYzogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0TGFiZWwsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgICAgICBfcGxhY2Vob2xkZXJDaGlsZDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0UGxhY2Vob2xkZXIsXSB9XSwKICAgICAgICBfZXJyb3JDaGlsZHJlbjogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0RXJyb3IsIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dLAogICAgICAgIF9oaW50Q2hpbGRyZW46IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdEhpbnQsIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dLAogICAgICAgIF9wcmVmaXhDaGlsZHJlbjogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0UHJlZml4LCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgICAgICBfc3VmZml4Q2hpbGRyZW46IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdFN1ZmZpeCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZm9ybS1maWVsZC9mb3JtLWZpZWxkLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRGb3JtRmllbGRNb2R1bGUgewogICAgfQogICAgTWF0Rm9ybUZpZWxkTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0Rm9ybUZpZWxkTW9kdWxlIH0pOwogICAgTWF0Rm9ybUZpZWxkTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0Rm9ybUZpZWxkTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEZvcm1GaWVsZE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE9ic2VydmVyc01vZHVsZSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdEZvcm1GaWVsZE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRFcnJvciwKICAgICAgICAgICAgTWF0Rm9ybUZpZWxkLAogICAgICAgICAgICBNYXRIaW50LAogICAgICAgICAgICBNYXRMYWJlbCwKICAgICAgICAgICAgTWF0UGxhY2Vob2xkZXIsCiAgICAgICAgICAgIE1hdFByZWZpeCwKICAgICAgICAgICAgTWF0U3VmZml4XTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBPYnNlcnZlcnNNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBNYXRFcnJvciwKICAgICAgICAgICAgTWF0Rm9ybUZpZWxkLAogICAgICAgICAgICBNYXRIaW50LAogICAgICAgICAgICBNYXRMYWJlbCwKICAgICAgICAgICAgTWF0UGxhY2Vob2xkZXIsCiAgICAgICAgICAgIE1hdFByZWZpeCwKICAgICAgICAgICAgTWF0U3VmZml4XTsgfSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9zY3JvbGwvYmxvY2stc2Nyb2xsLXN0cmF0ZWd5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogU3RyYXRlZ3kgdGhhdCB3aWxsIHByZXZlbnQgdGhlIHVzZXIgZnJvbSBzY3JvbGxpbmcgd2hpbGUgdGhlIG92ZXJsYXkgaXMgdmlzaWJsZS4KICAgICAqLwogICAgY2xhc3MgQmxvY2tTY3JvbGxTdHJhdGVneSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfdmlld3BvcnRSdWxlciwgZG9jdW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMgPSB7IHRvcDogJycsIGxlZnQ6ICcnIH07CiAgICAgICAgICAgIHRoaXMuX2lzRW5hYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2hlcyB0aGlzIHNjcm9sbCBzdHJhdGVneSB0byBhbiBvdmVybGF5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoKCkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQmxvY2tzIHBhZ2UtbGV2ZWwgc2Nyb2xsIHdoaWxlIHRoZSBhdHRhY2hlZCBvdmVybGF5IGlzIG9wZW4uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbmFibGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYW5CZUVuYWJsZWQoKSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgcm9vdCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24gPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIC8vIENhY2hlIHRoZSBwcmV2aW91cyBpbmxpbmUgc3R5bGVzIGluIGNhc2UgdGhlIHVzZXIgaGFkIHNldCB0aGVtLgogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNIVE1MU3R5bGVzLmxlZnQgPSByb290LnN0eWxlLmxlZnQgfHwgJyc7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c0hUTUxTdHlsZXMudG9wID0gcm9vdC5zdHlsZS50b3AgfHwgJyc7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSdyZSB1c2luZyB0aGUgYGh0bWxgIG5vZGUsIGluc3RlYWQgb2YgdGhlIGBib2R5YCwgYmVjYXVzZSB0aGUgYGJvZHlgIG1heQogICAgICAgICAgICAgICAgLy8gaGF2ZSB0aGUgdXNlciBhZ2VudCBtYXJnaW4sIHdoZXJlYXMgdGhlIGBodG1sYCBpcyBndWFyYW50ZWVkIG5vdCB0byBoYXZlIG9uZS4KICAgICAgICAgICAgICAgIHJvb3Quc3R5bGUubGVmdCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoLXRoaXMuX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24ubGVmdCk7CiAgICAgICAgICAgICAgICByb290LnN0eWxlLnRvcCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoLXRoaXMuX3ByZXZpb3VzU2Nyb2xsUG9zaXRpb24udG9wKTsKICAgICAgICAgICAgICAgIHJvb3QuY2xhc3NMaXN0LmFkZCgnY2RrLWdsb2JhbC1zY3JvbGxibG9jaycpOwogICAgICAgICAgICAgICAgdGhpcy5faXNFbmFibGVkID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVbmJsb2NrcyBwYWdlLWxldmVsIHNjcm9sbCB3aGlsZSB0aGUgYXR0YWNoZWQgb3ZlcmxheSBpcyBvcGVuLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzRW5hYmxlZCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaHRtbCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJvZHkgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuYm9keSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaHRtbFN0eWxlID0gKC8qKiBAdHlwZSB7P30gKi8gKGh0bWwuc3R5bGUpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJvZHlTdHlsZSA9ICgvKiogQHR5cGUgez99ICovIChib2R5LnN0eWxlKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0h0bWxTY3JvbGxCZWhhdmlvciA9IGh0bWxTdHlsZS5zY3JvbGxCZWhhdmlvciB8fCAnJzsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzQm9keVNjcm9sbEJlaGF2aW9yID0gYm9keVN0eWxlLnNjcm9sbEJlaGF2aW9yIHx8ICcnOwogICAgICAgICAgICAgICAgdGhpcy5faXNFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICBodG1sU3R5bGUubGVmdCA9IHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy5sZWZ0OwogICAgICAgICAgICAgICAgaHRtbFN0eWxlLnRvcCA9IHRoaXMuX3ByZXZpb3VzSFRNTFN0eWxlcy50b3A7CiAgICAgICAgICAgICAgICBodG1sLmNsYXNzTGlzdC5yZW1vdmUoJ2Nkay1nbG9iYWwtc2Nyb2xsYmxvY2snKTsKICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdXNlci1kZWZpbmVkIHNtb290aCBzY3JvbGxpbmcgdGVtcG9yYXJpbHkgd2hpbGUgd2UgcmVzdG9yZSB0aGUgc2Nyb2xsIHBvc2l0aW9uLgogICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0NTUy9zY3JvbGwtYmVoYXZpb3IKICAgICAgICAgICAgICAgIGh0bWxTdHlsZS5zY3JvbGxCZWhhdmlvciA9IGJvZHlTdHlsZS5zY3JvbGxCZWhhdmlvciA9ICdhdXRvJzsKICAgICAgICAgICAgICAgIHdpbmRvdy5zY3JvbGwodGhpcy5fcHJldmlvdXNTY3JvbGxQb3NpdGlvbi5sZWZ0LCB0aGlzLl9wcmV2aW91c1Njcm9sbFBvc2l0aW9uLnRvcCk7CiAgICAgICAgICAgICAgICBodG1sU3R5bGUuc2Nyb2xsQmVoYXZpb3IgPSBwcmV2aW91c0h0bWxTY3JvbGxCZWhhdmlvcjsKICAgICAgICAgICAgICAgIGJvZHlTdHlsZS5zY3JvbGxCZWhhdmlvciA9IHByZXZpb3VzQm9keVNjcm9sbEJlaGF2aW9yOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2FuQmVFbmFibGVkKCkgewogICAgICAgICAgICAvLyBTaW5jZSB0aGUgc2Nyb2xsIHN0cmF0ZWdpZXMgY2FuJ3QgYmUgc2luZ2xldG9ucywgd2UgaGF2ZSB0byB1c2UgYSBnbG9iYWwgQ1NTIGNsYXNzCiAgICAgICAgICAgIC8vIChgY2RrLWdsb2JhbC1zY3JvbGxibG9ja2ApIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGRvbid0IHRyeSB0byBkaXNhYmxlIGdsb2JhbAogICAgICAgICAgICAvLyBzY3JvbGxpbmcgbXVsdGlwbGUgdGltZXMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaHRtbCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKTsKICAgICAgICAgICAgaWYgKGh0bWwuY2xhc3NMaXN0LmNvbnRhaW5zKCdjZGstZ2xvYmFsLXNjcm9sbGJsb2NrJykgfHwgdGhpcy5faXNFbmFibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBib2R5ID0gdGhpcy5fZG9jdW1lbnQuYm9keTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3cG9ydCA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCk7CiAgICAgICAgICAgIHJldHVybiBib2R5LnNjcm9sbEhlaWdodCA+IHZpZXdwb3J0LmhlaWdodCB8fCBib2R5LnNjcm9sbFdpZHRoID4gdmlld3BvcnQud2lkdGg7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIHRvIGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gYXR0YWNoIGFuIGFscmVhZHktYXR0YWNoZWQgc2Nyb2xsIHN0cmF0ZWd5LgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0U2Nyb2xsU3RyYXRlZ3lBbHJlYWR5QXR0YWNoZWRFcnJvcigpIHsKICAgICAgICByZXR1cm4gRXJyb3IoYFNjcm9sbCBzdHJhdGVneSBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkLmApOwogICAgfQogICAgLyoqCiAgICAgKiBTdHJhdGVneSB0aGF0IHdpbGwgY2xvc2UgdGhlIG92ZXJsYXkgYXMgc29vbiBhcyB0aGUgdXNlciBzdGFydHMgc2Nyb2xsaW5nLgogICAgICovCiAgICBjbGFzcyBDbG9zZVNjcm9sbFN0cmF0ZWd5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9zY3JvbGxEaXNwYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9jb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfc2Nyb2xsRGlzcGF0Y2hlciwgX25nWm9uZSwgX3ZpZXdwb3J0UnVsZXIsIF9jb25maWcpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlzcGF0Y2hlciA9IF9zY3JvbGxEaXNwYXRjaGVyOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyID0gX3ZpZXdwb3J0UnVsZXI7CiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBEZXRhY2hlcyB0aGUgb3ZlcmxheSByZWYgYW5kIGRpc2FibGVzIHRoZSBzY3JvbGwgc3RyYXRlZ3kuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kZXRhY2ggPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmRpc2FibGUoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IHRvIGFuIG92ZXJsYXkuCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5UmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhdHRhY2gob3ZlcmxheVJlZikgewogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0U2Nyb2xsU3RyYXRlZ3lBbHJlYWR5QXR0YWNoZWRFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBvdmVybGF5UmVmOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHRoZSBjbG9zaW5nIG9mIHRoZSBhdHRhY2hlZCBvdmVybGF5IG9uIHNjcm9sbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVuYWJsZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RyZWFtID0gdGhpcy5fc2Nyb2xsRGlzcGF0Y2hlci5zY3JvbGxlZCgwKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZyAmJiB0aGlzLl9jb25maWcudGhyZXNob2xkICYmIHRoaXMuX2NvbmZpZy50aHJlc2hvbGQgPiAxKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsU2Nyb2xsUG9zaXRpb24gPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKS50b3A7CiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24gPSBzdHJlYW0uc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2Nyb2xsUG9zaXRpb24oKS50b3A7CiAgICAgICAgICAgICAgICAgICAgaWYgKE1hdGguYWJzKHNjcm9sbFBvc2l0aW9uIC0gdGhpcy5faW5pdGlhbFNjcm9sbFBvc2l0aW9uKSA+ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fY29uZmlnKSkudGhyZXNob2xkKSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGV0YWNoKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gc3RyZWFtLnN1YnNjcmliZSh0aGlzLl9kZXRhY2gpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoZSBjbG9zaW5nIHRoZSBhdHRhY2hlZCBvdmVybGF5IG9uIHNjcm9sbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpc2FibGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRldGFjaCgpIHsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9zY3JvbGwvbm9vcC1zY3JvbGwtc3RyYXRlZ3kudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFNjcm9sbCBzdHJhdGVneSB0aGF0IGRvZXNuJ3QgZG8gYW55dGhpbmcuCiAgICAgKi8KICAgIGNsYXNzIE5vb3BTY3JvbGxTdHJhdGVneSB7CiAgICAgICAgLyoqCiAgICAgICAgICogRG9lcyBub3RoaW5nLCBhcyB0aGlzIHNjcm9sbCBzdHJhdGVneSBpcyBhIG5vLW9wLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZW5hYmxlKCkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogRG9lcyBub3RoaW5nLCBhcyB0aGlzIHNjcm9sbCBzdHJhdGVneSBpcyBhIG5vLW9wLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzYWJsZSgpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIERvZXMgbm90aGluZywgYXMgdGhpcyBzY3JvbGwgc3RyYXRlZ3kgaXMgYSBuby1vcC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaCgpIHsgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Bvc2l0aW9uL3Njcm9sbC1jbGlwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLy8gVE9ETyhqZWxib3Vybik6IG1vdmUgdGhpcyB0byBsaXZlIHdpdGggdGhlIHJlc3Qgb2YgdGhlIHNjcm9sbGluZyBjb2RlCiAgICAvLyBUT0RPKGplbGJvdXJuKTogc29tZWRheSByZXBsYWNlIHRoaXMgd2l0aCBJbnRlcnNlY3Rpb25PYnNlcnZlcnMKICAgIC8qKgogICAgICogR2V0cyB3aGV0aGVyIGFuIGVsZW1lbnQgaXMgc2Nyb2xsZWQgb3V0c2lkZSBvZiB2aWV3IGJ5IGFueSBvZiBpdHMgcGFyZW50IHNjcm9sbGluZyBjb250YWluZXJzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZWxlbWVudCBEaW1lbnNpb25zIG9mIHRoZSBlbGVtZW50IChmcm9tIGdldEJvdW5kaW5nQ2xpZW50UmVjdCkKICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsQ29udGFpbmVycyBEaW1lbnNpb25zIG9mIGVsZW1lbnQncyBzY3JvbGxpbmcgY29udGFpbmVycyAoZnJvbSBnZXRCb3VuZGluZ0NsaWVudFJlY3QpCiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHNjcm9sbGVkIG91dCBvZiB2aWV3CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzRWxlbWVudFNjcm9sbGVkT3V0c2lkZVZpZXcoZWxlbWVudCwgc2Nyb2xsQ29udGFpbmVycykgewogICAgICAgIHJldHVybiBzY3JvbGxDb250YWluZXJzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udGFpbmVyQm91bmRzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb250YWluZXJCb3VuZHMgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG91dHNpZGVBYm92ZSA9IGVsZW1lbnQuYm90dG9tIDwgY29udGFpbmVyQm91bmRzLnRvcDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdXRzaWRlQmVsb3cgPSBlbGVtZW50LnRvcCA+IGNvbnRhaW5lckJvdW5kcy5ib3R0b207CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3V0c2lkZUxlZnQgPSBlbGVtZW50LnJpZ2h0IDwgY29udGFpbmVyQm91bmRzLmxlZnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3V0c2lkZVJpZ2h0ID0gZWxlbWVudC5sZWZ0ID4gY29udGFpbmVyQm91bmRzLnJpZ2h0OwogICAgICAgICAgICByZXR1cm4gb3V0c2lkZUFib3ZlIHx8IG91dHNpZGVCZWxvdyB8fCBvdXRzaWRlTGVmdCB8fCBvdXRzaWRlUmlnaHQ7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBHZXRzIHdoZXRoZXIgYW4gZWxlbWVudCBpcyBjbGlwcGVkIGJ5IGFueSBvZiBpdHMgc2Nyb2xsaW5nIGNvbnRhaW5lcnMuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBlbGVtZW50IERpbWVuc2lvbnMgb2YgdGhlIGVsZW1lbnQgKGZyb20gZ2V0Qm91bmRpbmdDbGllbnRSZWN0KQogICAgICogQHBhcmFtIHs/fSBzY3JvbGxDb250YWluZXJzIERpbWVuc2lvbnMgb2YgZWxlbWVudCdzIHNjcm9sbGluZyBjb250YWluZXJzIChmcm9tIGdldEJvdW5kaW5nQ2xpZW50UmVjdCkKICAgICAqIEByZXR1cm4gez99IFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgY2xpcHBlZAogICAgICovCiAgICBmdW5jdGlvbiBpc0VsZW1lbnRDbGlwcGVkQnlTY3JvbGxpbmcoZWxlbWVudCwgc2Nyb2xsQ29udGFpbmVycykgewogICAgICAgIHJldHVybiBzY3JvbGxDb250YWluZXJzLnNvbWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsQ29udGFpbmVyUmVjdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsQ29udGFpbmVyUmVjdCA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2xpcHBlZEFib3ZlID0gZWxlbWVudC50b3AgPCBzY3JvbGxDb250YWluZXJSZWN0LnRvcDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjbGlwcGVkQmVsb3cgPSBlbGVtZW50LmJvdHRvbSA+IHNjcm9sbENvbnRhaW5lclJlY3QuYm90dG9tOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsaXBwZWRMZWZ0ID0gZWxlbWVudC5sZWZ0IDwgc2Nyb2xsQ29udGFpbmVyUmVjdC5sZWZ0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsaXBwZWRSaWdodCA9IGVsZW1lbnQucmlnaHQgPiBzY3JvbGxDb250YWluZXJSZWN0LnJpZ2h0OwogICAgICAgICAgICByZXR1cm4gY2xpcHBlZEFib3ZlIHx8IGNsaXBwZWRCZWxvdyB8fCBjbGlwcGVkTGVmdCB8fCBjbGlwcGVkUmlnaHQ7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBTdHJhdGVneSB0aGF0IHdpbGwgdXBkYXRlIHRoZSBlbGVtZW50IHBvc2l0aW9uIGFzIHRoZSB1c2VyIGlzIHNjcm9sbGluZy4KICAgICAqLwogICAgY2xhc3MgUmVwb3NpdGlvblNjcm9sbFN0cmF0ZWd5IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9zY3JvbGxEaXNwYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7Pz19IF9jb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfc2Nyb2xsRGlzcGF0Y2hlciwgX3ZpZXdwb3J0UnVsZXIsIF9uZ1pvbmUsIF9jb25maWcpIHsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsRGlzcGF0Y2hlciA9IF9zY3JvbGxEaXNwYXRjaGVyOwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyID0gX3ZpZXdwb3J0UnVsZXI7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIHRoaXMgc2Nyb2xsIHN0cmF0ZWd5IHRvIGFuIG92ZXJsYXkuCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5UmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhdHRhY2gob3ZlcmxheVJlZikgewogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0U2Nyb2xsU3RyYXRlZ3lBbHJlYWR5QXR0YWNoZWRFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBvdmVybGF5UmVmOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbmFibGVzIHJlcG9zaXRpb25pbmcgb2YgdGhlIGF0dGFjaGVkIG92ZXJsYXkgb24gc2Nyb2xsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZW5hYmxlKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdGhyb3R0bGUgPSB0aGlzLl9jb25maWcgPyB0aGlzLl9jb25maWcuc2Nyb2xsVGhyb3R0bGUgOiAwOwogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gdGhpcy5fc2Nyb2xsRGlzcGF0Y2hlci5zY3JvbGxlZCh0aHJvdHRsZSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IG1ha2UgYGNsb3NlYCBvbiBieSBkZWZhdWx0IG9uY2UgYWxsIGNvbXBvbmVudHMgY2FuIGhhbmRsZSBpdC4KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnICYmIHRoaXMuX2NvbmZpZy5hdXRvQ2xvc2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvdmVybGF5UmVjdCA9IHRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgd2lkdGgsIGhlaWdodCB9ID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNpemUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IGluY2x1ZGUgYWxsIGFuY2VzdG9yIHNjcm9sbCBjb250YWluZXJzIGhlcmUgb25jZQogICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlIGEgd2F5IG9mIGV4cG9zaW5nIHRoZSB0cmlnZ2VyIGVsZW1lbnQgdG8gdGhlIHNjcm9sbCBzdHJhdGVneS4KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJlbnRSZWN0cyA9IFt7IHdpZHRoLCBoZWlnaHQsIGJvdHRvbTogaGVpZ2h0LCByaWdodDogd2lkdGgsIHRvcDogMCwgbGVmdDogMCB9XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzRWxlbWVudFNjcm9sbGVkT3V0c2lkZVZpZXcob3ZlcmxheVJlY3QsIHBhcmVudFJlY3RzKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNhYmxlcyByZXBvc2l0aW9uaW5nIG9mIHRoZSBhdHRhY2hlZCBvdmVybGF5IG9uIHNjcm9sbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpc2FibGUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRldGFjaCgpIHsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlKCk7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9zY3JvbGwvc2Nyb2xsLXN0cmF0ZWd5LW9wdGlvbnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBPcHRpb25zIGZvciBob3cgYW4gb3ZlcmxheSB3aWxsIGhhbmRsZSBzY3JvbGxpbmcuCiAgICAgKgogICAgICogVXNlcnMgY2FuIHByb3ZpZGUgYSBjdXN0b20gdmFsdWUgZm9yIGBTY3JvbGxTdHJhdGVneU9wdGlvbnNgIHRvIHJlcGxhY2UgdGhlIGRlZmF1bHQKICAgICAqIGJlaGF2aW9ycy4gVGhpcyBjbGFzcyBwcmltYXJpbHkgYWN0cyBhcyBhIGZhY3RvcnkgZm9yIFNjcm9sbFN0cmF0ZWd5IGluc3RhbmNlcy4KICAgICAqLwogICAgY2xhc3MgU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9zY3JvbGxEaXNwYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfc2Nyb2xsRGlzcGF0Y2hlciwgX3ZpZXdwb3J0UnVsZXIsIF9uZ1pvbmUsIGRvY3VtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpc3BhdGNoZXIgPSBfc2Nyb2xsRGlzcGF0Y2hlcjsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRG8gbm90aGluZyBvbiBzY3JvbGwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm5vb3AgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBuZXcgTm9vcFNjcm9sbFN0cmF0ZWd5KCkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2xvc2UgdGhlIG92ZXJsYXkgYXMgc29vbiBhcyB0aGUgdXNlciBzY3JvbGxzLgogICAgICAgICAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCBpbnNpZGUgdGhlIHNjcm9sbCBzdHJhdGVneS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2xvc2UgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbmZpZykgPT4gbmV3IENsb3NlU2Nyb2xsU3RyYXRlZ3kodGhpcy5fc2Nyb2xsRGlzcGF0Y2hlciwgdGhpcy5fbmdab25lLCB0aGlzLl92aWV3cG9ydFJ1bGVyLCBjb25maWcpKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEJsb2NrIHNjcm9sbGluZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYmxvY2sgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBuZXcgQmxvY2tTY3JvbGxTdHJhdGVneSh0aGlzLl92aWV3cG9ydFJ1bGVyLCB0aGlzLl9kb2N1bWVudCkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVXBkYXRlIHRoZSBvdmVybGF5J3MgcG9zaXRpb24gb24gc2Nyb2xsLgogICAgICAgICAgICAgKiBAcGFyYW0gY29uZmlnIENvbmZpZ3VyYXRpb24gdG8gYmUgdXNlZCBpbnNpZGUgdGhlIHNjcm9sbCBzdHJhdGVneS4KICAgICAgICAgICAgICogQWxsb3dzIGRlYm91bmNpbmcgdGhlIHJlcG9zaXRpb24gY2FsbHMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnJlcG9zaXRpb24gPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbmZpZykgPT4gbmV3IFJlcG9zaXRpb25TY3JvbGxTdHJhdGVneSh0aGlzLl9zY3JvbGxEaXNwYXRjaGVyLCB0aGlzLl92aWV3cG9ydFJ1bGVyLCB0aGlzLl9uZ1pvbmUsIGNvbmZpZykpOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgIH0KICAgIH0KICAgIFNjcm9sbFN0cmF0ZWd5T3B0aW9ucy7JtWZhYyA9IGZ1bmN0aW9uIFNjcm9sbFN0cmF0ZWd5T3B0aW9uc19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTY3JvbGxTdHJhdGVneU9wdGlvbnMpKMm1ybVpbmplY3QoU2Nyb2xsRGlzcGF0Y2hlciksIMm1ybVpbmplY3QoVmlld3BvcnRSdWxlciksIMm1ybVpbmplY3QoTmdab25lKSwgybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFNjcm9sbFN0cmF0ZWd5T3B0aW9ucy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFNjcm9sbERpc3BhdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTY3JvbGxTdHJhdGVneU9wdGlvbnMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBTY3JvbGxTdHJhdGVneU9wdGlvbnNfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBTY3JvbGxTdHJhdGVneU9wdGlvbnMoybXJtWluamVjdChTY3JvbGxEaXNwYXRjaGVyKSwgybXJtWluamVjdChWaWV3cG9ydFJ1bGVyKSwgybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfSwgdG9rZW46IFNjcm9sbFN0cmF0ZWd5T3B0aW9ucywgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Njcm9sbC9pbmRleC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS1jb25maWcudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBJbml0aWFsIGNvbmZpZ3VyYXRpb24gdXNlZCB3aGVuIGNyZWF0aW5nIGFuIG92ZXJsYXkuCiAgICAgKi8KICAgIGNsYXNzIE92ZXJsYXlDb25maWcgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZykgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyYXRlZ3kgdG8gYmUgdXNlZCB3aGVuIGhhbmRsaW5nIHNjcm9sbCBldmVudHMgd2hpbGUgdGhlIG92ZXJsYXkgaXMgb3Blbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kgPSBuZXcgTm9vcFNjcm9sbFN0cmF0ZWd5KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDdXN0b20gY2xhc3MgdG8gYWRkIHRvIHRoZSBvdmVybGF5IHBhbmUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnBhbmVsQ2xhc3MgPSAnJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgaGFzIGEgYmFja2Ryb3AuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmhhc0JhY2tkcm9wID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDdXN0b20gY2xhc3MgdG8gYWRkIHRvIHRoZSBiYWNrZHJvcAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5iYWNrZHJvcENsYXNzID0gJ2Nkay1vdmVybGF5LWRhcmstYmFja2Ryb3AnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBzaG91bGQgYmUgZGlzcG9zZWQgb2Ygd2hlbiB0aGUgdXNlciBnb2VzIGJhY2t3YXJkcy9mb3J3YXJkcyBpbiBoaXN0b3J5LgogICAgICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyB1c3VhbGx5IGRvZXNuJ3QgaW5jbHVkZSBjbGlja2luZyBvbiBsaW5rcyAodW5sZXNzIHRoZSB1c2VyIGlzIHVzaW5nCiAgICAgICAgICAgICAqIHRoZSBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZGlzcG9zZU9uTmF2aWdhdGlvbiA9IGZhbHNlOwogICAgICAgICAgICBpZiAoY29uZmlnKSB7CiAgICAgICAgICAgICAgICAvLyBVc2UgYEl0ZXJhYmxlYCBpbnN0ZWFkIG9mIGBBcnJheWAgYmVjYXVzZSBUeXBlU2NyaXB0LCBhcyBvZiAzLjYuMywKICAgICAgICAgICAgICAgIC8vIGxvc2VzIHRoZSBhcnJheSBnZW5lcmljIHR5cGUgaW4gdGhlIGBmb3Igb2ZgLiBCdXQgd2UgKmFsc28qIGhhdmUgdG8gdXNlIGBBcnJheWAgYmVjYXVzZQogICAgICAgICAgICAgICAgLy8gdHlwZXNjcmlwdCB3b24ndCBpdGVyYXRlIG92ZXIgYW4gYEl0ZXJhYmxlYCB1bmxlc3MgeW91IGNvbXBpbGUgd2l0aCBgLS1kb3dubGV2ZWxJdGVyYXRpb25gCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb25maWdLZXlzID0gKC8qKiBAdHlwZSB7P30gKi8gKE9iamVjdC5rZXlzKGNvbmZpZykpKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3Qga2V5IG9mIGNvbmZpZ0tleXMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoY29uZmlnW2tleV0gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBUeXBlU2NyaXB0LCBhcyBvZiB2ZXJzaW9uIDMuNSwgc2VlcyB0aGUgbGVmdC1oYW5kLXNpZGUgb2YgdGhpcyBleHByZXNzaW9uCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFzICJJIGRvbid0IGtub3cgKndoaWNoKiBrZXkgdGhpcyBpcywgc28gdGhlIG9ubHkgdmFsaWQgdmFsdWUgaXMgdGhlIGludGVyc2VjdGlvbgogICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBhbGwgdGhlIHBvc2libGUgdmFsdWVzLiIgSW4gdGhpcyBjYXNlLCB0aGF0IGhhcHBlbnMgdG8gYmUgYHVuZGVmaW5lZGAuIFR5cGVTY3JpcHQKICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgbm90IHNtYXJ0IGVub3VnaCB0byBzZWUgdGhhdCB0aGUgcmlnaHQtaGFuZC1zaWRlIGlzIGFjdHVhbGx5IGFuIGFjY2VzcyBvZiB0aGUgc2FtZQogICAgICAgICAgICAgICAgICAgICAgICAvLyBleGFjdCB0eXBlIHdpdGggdGhlIHNhbWUgZXhhY3Qga2V5LCBtZWFuaW5nIHRoYXQgdGhlIHZhbHVlIHR5cGUgbXVzdCBiZSBpZGVudGljYWwuCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNvIHdlIHVzZSBgYW55YCB0byB3b3JrIGFyb3VuZCB0aGlzLgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoY29uZmlnW2tleV0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBwb2ludHMgb2YgdGhlIG9yaWdpbiBlbGVtZW50IGFuZCB0aGUgb3ZlcmxheSBlbGVtZW50IHRvIGNvbm5lY3QuCiAgICAgKi8KICAgIGNsYXNzIENvbm5lY3Rpb25Qb3NpdGlvblBhaXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5CiAgICAgICAgICogQHBhcmFtIHs/PX0gb2Zmc2V0WAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9mZnNldFkKICAgICAgICAgKiBAcGFyYW0gez89fSBwYW5lbENsYXNzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iob3JpZ2luLCBvdmVybGF5LCBvZmZzZXRYLCBvZmZzZXRZLCBwYW5lbENsYXNzKSB7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0WCA9IG9mZnNldFg7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0WSA9IG9mZnNldFk7CiAgICAgICAgICAgIHRoaXMucGFuZWxDbGFzcyA9IHBhbmVsQ2xhc3M7CiAgICAgICAgICAgIHRoaXMub3JpZ2luWCA9IG9yaWdpbi5vcmlnaW5YOwogICAgICAgICAgICB0aGlzLm9yaWdpblkgPSBvcmlnaW4ub3JpZ2luWTsKICAgICAgICAgICAgdGhpcy5vdmVybGF5WCA9IG92ZXJsYXkub3ZlcmxheVg7CiAgICAgICAgICAgIHRoaXMub3ZlcmxheVkgPSBvdmVybGF5Lm92ZXJsYXlZOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogU2V0IG9mIHByb3BlcnRpZXMgcmVnYXJkaW5nIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3JpZ2luIGFuZCBvdmVybGF5IHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydAogICAgICogd2l0aCByZXNwZWN0IHRvIHRoZSBjb250YWluaW5nIFNjcm9sbGFibGUgZWxlbWVudHMuCiAgICAgKgogICAgICogVGhlIG92ZXJsYXkgYW5kIG9yaWdpbiBhcmUgY2xpcHBlZCBpZiBhbnkgcGFydCBvZiB0aGVpciBib3VuZGluZyBjbGllbnQgcmVjdGFuZ2xlIGV4Y2VlZHMgdGhlCiAgICAgKiBib3VuZHMgb2YgYW55IG9uZSBvZiB0aGUgc3RyYXRlZ3kncyBTY3JvbGxhYmxlJ3MgYm91bmRpbmcgY2xpZW50IHJlY3RhbmdsZS4KICAgICAqCiAgICAgKiBUaGUgb3ZlcmxheSBhbmQgb3JpZ2luIGFyZSBvdXRzaWRlIHZpZXcgaWYgdGhlcmUgaXMgbm8gb3ZlcmxhcCBiZXR3ZWVuIHRoZWlyIGJvdW5kaW5nIGNsaWVudAogICAgICogcmVjdGFuZ2xlIGFuZCBhbnkgb25lIG9mIHRoZSBzdHJhdGVneSdzIFNjcm9sbGFibGUncyBib3VuZGluZyBjbGllbnQgcmVjdGFuZ2xlLgogICAgICoKICAgICAqICAgICAgIC0tLS0tLS0tLS0tICAgICAgICAgICAgICAgICAgICAtLS0tLS0tLS0tLQogICAgICogICAgICAgfCBvdXRzaWRlIHwgICAgICAgICAgICAgICAgICAgIHwgY2xpcHBlZCB8CiAgICAgKiAgICAgICB8ICB2aWV3ICAgfCAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgICAqICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgfCAgICAgICAgfAogICAgICogICAgICAgLS0tLS0tLS0tLSAgICAgICAgICAgICAgIHwgICAgIC0tLS0tLS0tLS0tICAgICAgICB8CiAgICAgKiAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgICB8ICAgICAgU2Nyb2xsYWJsZSAgICAgICAgfAogICAgICogIHwgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIHwgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgKiAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKiAgfCAgICAgIFNjcm9sbGFibGUgICAgICAgIHwKICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICogIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgICAgKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgU2Nyb2xsaW5nVmlzaWJpbGl0eSB7CiAgICB9CiAgICAvKioKICAgICAqIFRoZSBjaGFuZ2UgZXZlbnQgZW1pdHRlZCBieSB0aGUgc3RyYXRlZ3kgd2hlbiBhIGZhbGxiYWNrIHBvc2l0aW9uIGlzIHVzZWQuCiAgICAgKi8KICAgIGNsYXNzIENvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbkNoYW5nZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25uZWN0aW9uUGFpcgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29ubmVjdGlvblBhaXIsIHNjcm9sbGFibGVWaWV3UHJvcGVydGllcykgewogICAgICAgICAgICB0aGlzLmNvbm5lY3Rpb25QYWlyID0gY29ubmVjdGlvblBhaXI7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzID0gc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQ29ubmVjdGlvblBvc2l0aW9uUGFpciB9LAogICAgICAgIHsgdHlwZTogU2Nyb2xsaW5nVmlzaWJpbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQogICAgXTsKICAgIC8qKgogICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYSB2ZXJ0aWNhbCBwb3NpdGlvbiBwcm9wZXJ0eSBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZXMuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwcm9wZXJ0eSBOYW1lIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyB2YWxpZGF0ZWQuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlIFZhbHVlIG9mIHRoZSBwcm9wZXJ0eSBiZWluZyB2YWxpZGF0ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24ocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlICE9PSAndG9wJyAmJiB2YWx1ZSAhPT0gJ2JvdHRvbScgJiYgdmFsdWUgIT09ICdjZW50ZXInKSB7CiAgICAgICAgICAgIHRocm93IEVycm9yKGBDb25uZWN0ZWRQb3NpdGlvbjogSW52YWxpZCAke3Byb3BlcnR5fSAiJHt2YWx1ZX0iLiBgICsKICAgICAgICAgICAgICAgIGBFeHBlY3RlZCAidG9wIiwgImJvdHRvbSIgb3IgImNlbnRlciIuYCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBWYWxpZGF0ZXMgd2hldGhlciBhIGhvcml6b250YWwgcG9zaXRpb24gcHJvcGVydHkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdmFsdWVzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcHJvcGVydHkgTmFtZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgdmFsaWRhdGVkLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZSBWYWx1ZSBvZiB0aGUgcHJvcGVydHkgYmVpbmcgdmFsaWRhdGVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdmFsaWRhdGVIb3Jpem9udGFsUG9zaXRpb24ocHJvcGVydHksIHZhbHVlKSB7CiAgICAgICAgaWYgKHZhbHVlICE9PSAnc3RhcnQnICYmIHZhbHVlICE9PSAnZW5kJyAmJiB2YWx1ZSAhPT0gJ2NlbnRlcicpIHsKICAgICAgICAgICAgdGhyb3cgRXJyb3IoYENvbm5lY3RlZFBvc2l0aW9uOiBJbnZhbGlkICR7cHJvcGVydHl9ICIke3ZhbHVlfSIuIGAgKwogICAgICAgICAgICAgICAgYEV4cGVjdGVkICJzdGFydCIsICJlbmQiIG9yICJjZW50ZXIiLmApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvb3ZlcmxheS9rZXlib2FyZC9vdmVybGF5LWtleWJvYXJkLWRpc3BhdGNoZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBTZXJ2aWNlIGZvciBkaXNwYXRjaGluZyBrZXlib2FyZCBldmVudHMgdGhhdCBsYW5kIG9uIHRoZSBib2R5IHRvIGFwcHJvcHJpYXRlIG92ZXJsYXkgcmVmLAogICAgICogaWYgYW55LiBJdCBtYWludGFpbnMgYSBsaXN0IG9mIGF0dGFjaGVkIG92ZXJsYXlzIHRvIGRldGVybWluZSBiZXN0IHN1aXRlZCBvdmVybGF5IGJhc2VkCiAgICAgKiBvbiBldmVudCB0YXJnZXQgYW5kIG9yZGVyIG9mIG92ZXJsYXkgb3BlbnMuCiAgICAgKi8KICAgIGNsYXNzIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihkb2N1bWVudCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ3VycmVudGx5IGF0dGFjaGVkIG92ZXJsYXlzIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgYXR0YWNoZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hdHRhY2hlZE92ZXJsYXlzID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZXlib2FyZCBldmVudCBsaXN0ZW5lciB0aGF0IHdpbGwgYmUgYXR0YWNoZWQgdG8gdGhlIGJvZHkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9rZXlkb3duTGlzdGVuZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb3ZlcmxheXMgPSB0aGlzLl9hdHRhY2hlZE92ZXJsYXlzOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IG92ZXJsYXlzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRGlzcGF0Y2ggdGhlIGtleWRvd24gZXZlbnQgdG8gdGhlIHRvcCBvdmVybGF5IHdoaWNoIGhhcyBzdWJzY3JpYmVycyB0byBpdHMga2V5ZG93biBldmVudHMuCiAgICAgICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB0YXJnZXQgdGhlIG1vc3QgcmVjZW50IG92ZXJsYXksIHJhdGhlciB0aGFuIHRyeWluZyB0byBtYXRjaCB3aGVyZSB0aGUgZXZlbnQgY2FtZQogICAgICAgICAgICAgICAgICAgIC8vIGZyb20sIGJlY2F1c2Ugc29tZSBjb21wb25lbnRzIG1pZ2h0IG9wZW4gYW4gb3ZlcmxheSwgYnV0IGtlZXAgZm9jdXMgb24gYSB0cmlnZ2VyIGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBmb3Igc2VsZWN0IGFuZCBhdXRvY29tcGxldGUpLiBXZSBza2lwIG92ZXJsYXlzIHdpdGhvdXQga2V5ZG93biBldmVudCBzdWJzY3JpcHRpb25zLAogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCBvdmVybGF5cyB0aGF0IGRvbid0IGhhbmRsZSBrZXlib2FyZCBldmVudHMgdG8gYmxvY2sgdGhlIG9uZXMgYmVsb3cKICAgICAgICAgICAgICAgICAgICAvLyB0aGVtIHRoYXQgZG8uCiAgICAgICAgICAgICAgICAgICAgaWYgKG92ZXJsYXlzW2ldLl9rZXlkb3duRXZlbnRzLm9ic2VydmVycy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlzW2ldLl9rZXlkb3duRXZlbnRzLm5leHQoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9kZXRhY2goKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIGEgbmV3IG92ZXJsYXkgdG8gdGhlIGxpc3Qgb2YgYXR0YWNoZWQgb3ZlcmxheSByZWZzLgogICAgICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkKG92ZXJsYXlSZWYpIHsKICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgd2UgZG9uJ3QgZ2V0IHRoZSBzYW1lIG92ZXJsYXkgbXVsdGlwbGUgdGltZXMuCiAgICAgICAgICAgIHRoaXMucmVtb3ZlKG92ZXJsYXlSZWYpOwogICAgICAgICAgICAvLyBMYXppbHkgc3RhcnQgZGlzcGF0Y2hlciBvbmNlIGZpcnN0IG92ZXJsYXkgaXMgYWRkZWQKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0F0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kb2N1bWVudC5ib2R5LmFkZEV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9rZXlkb3duTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgdGhpcy5faXNBdHRhY2hlZCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWRPdmVybGF5cy5wdXNoKG92ZXJsYXlSZWYpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmUgYW4gb3ZlcmxheSBmcm9tIHRoZSBsaXN0IG9mIGF0dGFjaGVkIG92ZXJsYXkgcmVmcy4KICAgICAgICAgKiBAcGFyYW0gez99IG92ZXJsYXlSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZShvdmVybGF5UmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLmluZGV4T2Yob3ZlcmxheVJlZik7CiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdHRhY2hlZE92ZXJsYXlzLnNwbGljZShpbmRleCwgMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBnbG9iYWwgbGlzdGVuZXIgb25jZSB0aGVyZSBhcmUgbm8gbW9yZSBvdmVybGF5cy4KICAgICAgICAgICAgaWYgKHRoaXMuX2F0dGFjaGVkT3ZlcmxheXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRhY2goKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyB0aGUgZ2xvYmFsIGtleWJvYXJkIGV2ZW50IGxpc3RlbmVyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZGV0YWNoKCkgewogICAgICAgICAgICBpZiAodGhpcy5faXNBdHRhY2hlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5yZW1vdmVFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5fa2V5ZG93bkxpc3RlbmVyKTsKICAgICAgICAgICAgICAgIHRoaXMuX2lzQXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIuybVmYWMgPSBmdW5jdGlvbiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH0sIHRva2VuOiBPdmVybGF5S2V5Ym9hcmREaXNwYXRjaGVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlIFxAZGVwcmVjYXRlZCBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICogQHBhcmFtIHs/fSBkaXNwYXRjaGVyCiAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gT1ZFUkxBWV9LRVlCT0FSRF9ESVNQQVRDSEVSX1BST1ZJREVSX0ZBQ1RPUlkoZGlzcGF0Y2hlciwgX2RvY3VtZW50KSB7CiAgICAgICAgcmV0dXJuIGRpc3BhdGNoZXIgfHwgbmV3IE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIoX2RvY3VtZW50KTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUgXEBkZXByZWNhdGVkIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgT1ZFUkxBWV9LRVlCT0FSRF9ESVNQQVRDSEVSX1BST1ZJREVSID0gewogICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlciBhdmFpbGFibGUsIHVzZSB0aGF0LgogICAgICAgIC8vIE90aGVyd2lzZSwgcHJvdmlkZSBhIG5ldyBvbmUuCiAgICAgICAgcHJvdmlkZTogT3ZlcmxheUtleWJvYXJkRGlzcGF0Y2hlciwKICAgICAgICBkZXBzOiBbCiAgICAgICAgICAgIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXJdLAogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoCiAgICAgICAgICAgIC8vIENvZXJjZSB0byBgSW5qZWN0aW9uVG9rZW5gIHNvIHRoYXQgdGhlIGBkZXBzYCBtYXRjaCB0aGUgInNoYXBlIgogICAgICAgICAgICAvLyBvZiB0aGUgdHlwZSBleHBlY3RlZCBieSBBbmd1bGFyCiAgICAgICAgICAgIERPQ1VNRU5UJDEpKQogICAgICAgIF0sCiAgICAgICAgdXNlRmFjdG9yeTogT1ZFUkxBWV9LRVlCT0FSRF9ESVNQQVRDSEVSX1BST1ZJREVSX0ZBQ1RPUlkKICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS1jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBXaGV0aGVyIHdlJ3JlIGluIGEgdGVzdGluZyBlbnZpcm9ubWVudC4KICAgICAqIFRPRE8oY3Jpc2JldG8pOiByZW1vdmUgdGhpcyBvbmNlIHdlIGhhdmUgYW4gb3ZlcmxheSB0ZXN0aW5nIG1vZHVsZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBpc1Rlc3RFbnZpcm9ubWVudCA9IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnICYmICEhd2luZG93ICYmCiAgICAgICAgISEoKCgvKiogQHR5cGUgez99ICovICh3aW5kb3cpKSkuX19rYXJtYV9fIHx8ICgoLyoqIEB0eXBlIHs/fSAqLyAod2luZG93KSkpLmphc21pbmUpOwogICAgLyoqCiAgICAgKiBDb250YWluZXIgaW5zaWRlIHdoaWNoIGFsbCBvdmVybGF5cyB3aWxsIHJlbmRlci4KICAgICAqLwogICAgY2xhc3MgT3ZlcmxheUNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IF9wbGF0Zm9ybQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRvY3VtZW50LCBfcGxhdGZvcm0pIHsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fY29udGFpbmVyRWxlbWVudDsKICAgICAgICAgICAgaWYgKGNvbnRhaW5lciAmJiBjb250YWluZXIucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgY29udGFpbmVyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoY29udGFpbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvdmVybGF5IGNvbnRhaW5lciBlbGVtZW50LiBJdCB3aWxsIGxhemlseQogICAgICAgICAqIGNyZWF0ZSB0aGUgZWxlbWVudCB0aGUgZmlyc3QgdGltZSAgaXQgaXMgY2FsbGVkIHRvIGZhY2lsaXRhdGUgdXNpbmcKICAgICAgICAgKiB0aGUgY29udGFpbmVyIGluIG5vbi1icm93c2VyIGVudmlyb25tZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fSB0aGUgY29udGFpbmVyIGVsZW1lbnQKICAgICAgICAgKi8KICAgICAgICBnZXRDb250YWluZXJFbGVtZW50KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2NvbnRhaW5lckVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZUNvbnRhaW5lcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250YWluZXJFbGVtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgdGhlIG92ZXJsYXkgY29udGFpbmVyIGVsZW1lbnQsIHdoaWNoIGlzIHNpbXBseSBhIGRpdgogICAgICAgICAqIHdpdGggdGhlICdjZGstb3ZlcmxheS1jb250YWluZXInIGNsYXNzIG9uIHRoZSBkb2N1bWVudCBib2R5LgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVDb250YWluZXIoKSB7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTAuMC4wIFJlbW92ZSBudWxsIGNoZWNrIGZvciBgX3BsYXRmb3JtYC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0Jyb3dzZXIgPSB0aGlzLl9wbGF0Zm9ybSA/IHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlciA6IHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lckNsYXNzID0gJ2Nkay1vdmVybGF5LWNvbnRhaW5lcic7CiAgICAgICAgICAgIGlmIChpc0Jyb3dzZXIgfHwgaXNUZXN0RW52aXJvbm1lbnQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9wcG9zaXRlUGxhdGZvcm1Db250YWluZXJzID0gdGhpcy5fZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChgLiR7Y29udGFpbmVyQ2xhc3N9W3BsYXRmb3JtPSJzZXJ2ZXIiXSwgYCArCiAgICAgICAgICAgICAgICAgICAgYC4ke2NvbnRhaW5lckNsYXNzfVtwbGF0Zm9ybT0idGVzdCJdYCk7CiAgICAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IG9sZCBjb250YWluZXJzIGZyb20gdGhlIG9wcG9zaXRlIHBsYXRmb3JtLgogICAgICAgICAgICAgICAgLy8gVGhpcyBjYW4gaGFwcGVuIHdoZW4gdHJhbnNpdGlvbmluZyBmcm9tIHRoZSBzZXJ2ZXIgdG8gdGhlIGNsaWVudC4KICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgb3Bwb3NpdGVQbGF0Zm9ybUNvbnRhaW5lcnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAob3Bwb3NpdGVQbGF0Zm9ybUNvbnRhaW5lcnNbaV0ucGFyZW50Tm9kZSkpLnJlbW92ZUNoaWxkKG9wcG9zaXRlUGxhdGZvcm1Db250YWluZXJzW2ldKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICBjb250YWluZXIuY2xhc3NMaXN0LmFkZChjb250YWluZXJDbGFzcyk7CiAgICAgICAgICAgIC8vIEEgbG9uZyB0aW1lIGFnbyB3ZSBrZXB0IGFkZGluZyBuZXcgb3ZlcmxheSBjb250YWluZXJzIHdoZW5ldmVyIGEgbmV3IGFwcCB3YXMgaW5zdGFudGlhdGVkLAogICAgICAgICAgICAvLyBidXQgYXQgc29tZSBwb2ludCB3ZSBhZGRlZCBsb2dpYyB3aGljaCBjbGVhcnMgdGhlIGR1cGxpY2F0ZSBvbmVzIGluIG9yZGVyIHRvIGF2b2lkIGxlYWtzLgogICAgICAgICAgICAvLyBUaGUgbmV3IGxvZ2ljIHdhcyBhIGxpdHRsZSB0b28gYWdncmVzc2l2ZSBzaW5jZSBpdCB3YXMgYnJlYWtpbmcgc29tZSBsZWdpdGltYXRlIHVzZSBjYXNlcy4KICAgICAgICAgICAgLy8gVG8gbWl0aWdhdGUgdGhlIHByb2JsZW0gd2UgbWFkZSBpdCBzbyB0aGF0IG9ubHkgY29udGFpbmVycyBmcm9tIGEgZGlmZmVyZW50IHBsYXRmb3JtIGFyZQogICAgICAgICAgICAvLyBjbGVhcmVkLCBidXQgdGhlIHNpZGUtZWZmZWN0IHdhcyB0aGF0IHBlb3BsZSBzdGFydGVkIGRlcGVuZGluZyBvbiB0aGUgb3Zlcmx5LWFnZ3Jlc3NpdmUKICAgICAgICAgICAgLy8gbG9naWMgdG8gY2xlYW4gdXAgdGhlaXIgdGVzdHMgZm9yIHRoZW0uIFVudGlsIHdlIGNhbiBpbnRyb2R1Y2UgYW4gb3ZlcmxheS1zcGVjaWZpYyB0ZXN0aW5nCiAgICAgICAgICAgIC8vIG1vZHVsZSB3aGljaCBkb2VzIHRoZSBjbGVhbnVwLCB3ZSB0cnkgdG8gZGV0ZWN0IHRoYXQgd2UncmUgaW4gYSB0ZXN0IGVudmlyb25tZW50IGFuZCB3ZQogICAgICAgICAgICAvLyBhbHdheXMgY2xlYXIgdGhlIGNvbnRhaW5lci4gU2VlICMxNzAwNi4KICAgICAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IHJlbW92ZSB0aGUgdGVzdCBlbnZpcm9ubWVudCBjaGVjayBvbmNlIHdlIGhhdmUgYW4gb3ZlcmxheSB0ZXN0aW5nIG1vZHVsZS4KICAgICAgICAgICAgaWYgKGlzVGVzdEVudmlyb25tZW50KSB7CiAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0QXR0cmlidXRlKCdwbGF0Zm9ybScsICd0ZXN0Jyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgY29udGFpbmVyLnNldEF0dHJpYnV0ZSgncGxhdGZvcm0nLCAnc2VydmVyJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChjb250YWluZXIpOwogICAgICAgICAgICB0aGlzLl9jb250YWluZXJFbGVtZW50ID0gY29udGFpbmVyOwogICAgICAgIH0KICAgIH0KICAgIE92ZXJsYXlDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBPdmVybGF5Q29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE92ZXJsYXlDb250YWluZXIpKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgT3ZlcmxheUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE92ZXJsYXlDb250YWluZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBPdmVybGF5Q29udGFpbmVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgT3ZlcmxheUNvbnRhaW5lcijJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSk7IH0sIHRva2VuOiBPdmVybGF5Q29udGFpbmVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlIFxAZGVwcmVjYXRlZCBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICogQHBhcmFtIHs/fSBwYXJlbnRDb250YWluZXIKICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBPVkVSTEFZX0NPTlRBSU5FUl9QUk9WSURFUl9GQUNUT1JZKHBhcmVudENvbnRhaW5lciwgX2RvY3VtZW50KSB7CiAgICAgICAgcmV0dXJuIHBhcmVudENvbnRhaW5lciB8fCBuZXcgT3ZlcmxheUNvbnRhaW5lcihfZG9jdW1lbnQpOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZSBcQGRlcHJlY2F0ZWQgXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBPVkVSTEFZX0NPTlRBSU5FUl9QUk9WSURFUiA9IHsKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIE92ZXJsYXlDb250YWluZXIgYXZhaWxhYmxlLCB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBwcm92aWRlIGEgbmV3IG9uZS4KICAgICAgICBwcm92aWRlOiBPdmVybGF5Q29udGFpbmVyLAogICAgICAgIGRlcHM6IFsKICAgICAgICAgICAgW25ldyBPcHRpb25hbCgpLCBuZXcgU2tpcFNlbGYoKSwgT3ZlcmxheUNvbnRhaW5lcl0sCiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChET0NVTUVOVCQxKSkKICAgICAgICBdLAogICAgICAgIHVzZUZhY3Rvcnk6IE9WRVJMQVlfQ09OVEFJTkVSX1BST1ZJREVSX0ZBQ1RPUlkKICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS1yZWYudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBSZWZlcmVuY2UgdG8gYW4gb3ZlcmxheSB0aGF0IGhhcyBiZWVuIGNyZWF0ZWQgd2l0aCB0aGUgT3ZlcmxheSBzZXJ2aWNlLgogICAgICogVXNlZCB0byBtYW5pcHVsYXRlIG9yIGRpc3Bvc2Ugb2Ygc2FpZCBvdmVybGF5LgogICAgICovCiAgICBjbGFzcyBPdmVybGF5UmVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9wb3J0YWxPdXRsZXQKICAgICAgICAgKiBAcGFyYW0gez99IF9ob3N0CiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFuZQogICAgICAgICAqIEBwYXJhbSB7P30gX2NvbmZpZwogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2tleWJvYXJkRGlzcGF0Y2hlcgogICAgICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/PX0gX2xvY2F0aW9uCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BvcnRhbE91dGxldCwgX2hvc3QsIF9wYW5lLCBfY29uZmlnLCBfbmdab25lLCBfa2V5Ym9hcmREaXNwYXRjaGVyLCBfZG9jdW1lbnQsIF9sb2NhdGlvbikgewogICAgICAgICAgICB0aGlzLl9wb3J0YWxPdXRsZXQgPSBfcG9ydGFsT3V0bGV0OwogICAgICAgICAgICB0aGlzLl9ob3N0ID0gX2hvc3Q7CiAgICAgICAgICAgIHRoaXMuX3BhbmUgPSBfcGFuZTsKICAgICAgICAgICAgdGhpcy5fY29uZmlnID0gX2NvbmZpZzsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyID0gX2tleWJvYXJkRGlzcGF0Y2hlcjsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX2xvY2F0aW9uID0gX2xvY2F0aW9uOwogICAgICAgICAgICB0aGlzLl9iYWNrZHJvcEVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9iYWNrZHJvcENsaWNrID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICB0aGlzLl9kZXRhY2htZW50cyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX2xvY2F0aW9uQ2hhbmdlcyA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3BDbGlja0hhbmRsZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gdGhpcy5fYmFja2Ryb3BDbGljay5uZXh0KGV2ZW50KSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gb2Yga2V5ZG93biBldmVudHMgZGlzcGF0Y2hlZCB0byB0aGlzIG92ZXJsYXkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9rZXlkb3duRXZlbnRzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgaWYgKF9jb25maWcuc2Nyb2xsU3RyYXRlZ3kpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gX2NvbmZpZy5zY3JvbGxTdHJhdGVneTsKICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5LmF0dGFjaCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5ID0gX2NvbmZpZy5wb3NpdGlvblN0cmF0ZWd5OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgb3ZlcmxheSdzIEhUTUwgZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG92ZXJsYXlFbGVtZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFuZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG92ZXJsYXkncyBiYWNrZHJvcCBIVE1MIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYmFja2Ryb3BFbGVtZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFja2Ryb3BFbGVtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXcmFwcGVyIGFyb3VuZCB0aGUgcGFuZWwgZWxlbWVudC4gQ2FuIGJlIHVzZWQgZm9yIGFkdmFuY2VkCiAgICAgICAgICogcG9zaXRpb25pbmcgd2hlcmUgYSB3cmFwcGVyIHdpdGggc3BlY2lmaWMgc3R5bGluZyBpcwogICAgICAgICAqIHJlcXVpcmVkIGFyb3VuZCB0aGUgb3ZlcmxheSBwYW5lLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGhvc3RFbGVtZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5faG9zdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgY29udGVudCwgZ2l2ZW4gdmlhIGEgUG9ydGFsLCB0byB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBJZiB0aGUgb3ZlcmxheSBpcyBjb25maWd1cmVkIHRvIGhhdmUgYSBiYWNrZHJvcCwgaXQgd2lsbCBiZSBjcmVhdGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBwb3J0YWwgUG9ydGFsIGluc3RhbmNlIHRvIHdoaWNoIHRvIGF0dGFjaCB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgcG9ydGFsIGF0dGFjaG1lbnQgcmVzdWx0LgogICAgICAgICAqLwogICAgICAgIGF0dGFjaChwb3J0YWwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYXR0YWNoUmVzdWx0ID0gdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaChwb3J0YWwpOwogICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBhbmUgZWxlbWVudCB3aXRoIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uLgogICAgICAgICAgICBpZiAoIXRoaXMuX2hvc3QucGFyZW50RWxlbWVudCAmJiB0aGlzLl9wcmV2aW91c0hvc3RQYXJlbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudC5hcHBlbmRDaGlsZCh0aGlzLl9ob3N0KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5hdHRhY2godGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdXBkYXRlU3RhY2tpbmdPcmRlcigpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVFbGVtZW50U2l6ZSgpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVFbGVtZW50RGlyZWN0aW9uKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxTdHJhdGVneSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kuZW5hYmxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwb3NpdGlvbiBvbmNlIHRoZSB6b25lIGlzIHN0YWJsZSBzbyB0aGF0IHRoZSBvdmVybGF5IHdpbGwgYmUgZnVsbHkgcmVuZGVyZWQKICAgICAgICAgICAgLy8gYmVmb3JlIGF0dGVtcHRpbmcgdG8gcG9zaXRpb24gaXQsIGFzIHRoZSBwb3NpdGlvbiBtYXkgZGVwZW5kIG9uIHRoZSBzaXplIG9mIHRoZSByZW5kZXJlZAogICAgICAgICAgICAvLyBjb250ZW50LgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUKICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKQogICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gVGhlIG92ZXJsYXkgY291bGQndmUgYmVlbiBkZXRhY2hlZCBiZWZvcmUgdGhlIHpvbmUgaGFzIHN0YWJpbGl6ZWQuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIEVuYWJsZSBwb2ludGVyIGV2ZW50cyBmb3IgdGhlIG92ZXJsYXkgcGFuZSBlbGVtZW50LgogICAgICAgICAgICB0aGlzLl90b2dnbGVQb2ludGVyRXZlbnRzKHRydWUpOwogICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmhhc0JhY2tkcm9wKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdHRhY2hCYWNrZHJvcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcucGFuZWxDbGFzcykgewogICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3Nlcyh0aGlzLl9wYW5lLCB0aGlzLl9jb25maWcucGFuZWxDbGFzcywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gT25seSBlbWl0IHRoZSBgYXR0YWNobWVudHNgIGV2ZW50IG9uY2UgYWxsIG90aGVyIHNldHVwIGlzIGRvbmUuCiAgICAgICAgICAgIHRoaXMuX2F0dGFjaG1lbnRzLm5leHQoKTsKICAgICAgICAgICAgLy8gVHJhY2sgdGhpcyBvdmVybGF5IGJ5IHRoZSBrZXlib2FyZCBkaXNwYXRjaGVyCiAgICAgICAgICAgIHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlci5hZGQodGhpcyk7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjAgcmVtb3ZlIHRoZSBudWxsIGNoZWNrIGZvciBgX2xvY2F0aW9uYAogICAgICAgICAgICAvLyBvbmNlIHRoZSBjb25zdHJ1Y3RvciBwYXJhbWV0ZXIgaXMgbWFkZSByZXF1aXJlZC4KICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5kaXNwb3NlT25OYXZpZ2F0aW9uICYmIHRoaXMuX2xvY2F0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9sb2NhdGlvbkNoYW5nZXMgPSB0aGlzLl9sb2NhdGlvbi5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5kaXNwb3NlKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYXR0YWNoUmVzdWx0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyBhbiBvdmVybGF5IGZyb20gYSBwb3J0YWwuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIHBvcnRhbCBkZXRhY2htZW50IHJlc3VsdC4KICAgICAgICAgKi8KICAgICAgICBkZXRhY2goKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kZXRhY2hCYWNrZHJvcCgpOwogICAgICAgICAgICAvLyBXaGVuIHRoZSBvdmVybGF5IGlzIGRldGFjaGVkLCB0aGUgcGFuZSBlbGVtZW50IHNob3VsZCBkaXNhYmxlIHBvaW50ZXIgZXZlbnRzLgogICAgICAgICAgICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgcGFuZSBlbGVtZW50IHdpbGwgY292ZXIgdGhlIHBhZ2UgYW5kIGRpc2FibGUKICAgICAgICAgICAgLy8gcG9pbnRlciBldmVudHMgdGhlcmVmb3JlLiBEZXBlbmRzIG9uIHRoZSBwb3NpdGlvbiBzdHJhdGVneSBhbmQgdGhlIGFwcGxpZWQgcGFuZSBib3VuZGFyaWVzLgogICAgICAgICAgICB0aGlzLl90b2dnbGVQb2ludGVyRXZlbnRzKGZhbHNlKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kgJiYgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kZXRhY2gpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGV0YWNoKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3Njcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneS5kaXNhYmxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZXRhY2htZW50UmVzdWx0ID0gdGhpcy5fcG9ydGFsT3V0bGV0LmRldGFjaCgpOwogICAgICAgICAgICAvLyBPbmx5IGVtaXQgYWZ0ZXIgZXZlcnl0aGluZyBpcyBkZXRhY2hlZC4KICAgICAgICAgICAgdGhpcy5fZGV0YWNobWVudHMubmV4dCgpOwogICAgICAgICAgICAvLyBSZW1vdmUgdGhpcyBvdmVybGF5IGZyb20ga2V5Ym9hcmQgZGlzcGF0Y2hlciB0cmFja2luZy4KICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyLnJlbW92ZSh0aGlzKTsKICAgICAgICAgICAgLy8gS2VlcGluZyB0aGUgaG9zdCBlbGVtZW50IGluIHRoZSBET00gY2FuIGNhdXNlIHNjcm9sbCBqYW5rLCBiZWNhdXNlIGl0IHN0aWxsIGdldHMKICAgICAgICAgICAgLy8gcmVuZGVyZWQsIGV2ZW4gdGhvdWdoIGl0J3MgdHJhbnNwYXJlbnQgYW5kIHVuY2xpY2thYmxlIHdoaWNoIGlzIHdoeSB3ZSByZW1vdmUgaXQuCiAgICAgICAgICAgIHRoaXMuX2RldGFjaENvbnRlbnRXaGVuU3RhYmxlKCk7CiAgICAgICAgICAgIC8vIFN0b3AgbGlzdGVuaW5nIGZvciBsb2NhdGlvbiBjaGFuZ2VzLgogICAgICAgICAgICB0aGlzLl9sb2NhdGlvbkNoYW5nZXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgcmV0dXJuIGRldGFjaG1lbnRSZXN1bHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFucyB1cCB0aGUgb3ZlcmxheSBmcm9tIHRoZSBET00uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNwb3NlKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzQXR0YWNoZWQgPSB0aGlzLmhhc0F0dGFjaGVkKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9wb3NpdGlvblN0cmF0ZWd5KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LmRpc3Bvc2UoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kaXNwb3NlU2Nyb2xsU3RyYXRlZ3koKTsKICAgICAgICAgICAgdGhpcy5kZXRhY2hCYWNrZHJvcCgpOwogICAgICAgICAgICB0aGlzLl9sb2NhdGlvbkNoYW5nZXMudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyLnJlbW92ZSh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fcG9ydGFsT3V0bGV0LmRpc3Bvc2UoKTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNobWVudHMuY29tcGxldGUoKTsKICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3BDbGljay5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLl9rZXlkb3duRXZlbnRzLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9ob3N0ICYmIHRoaXMuX2hvc3QucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgdGhpcy5faG9zdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRoaXMuX2hvc3QpOwogICAgICAgICAgICAgICAgdGhpcy5faG9zdCA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNIb3N0UGFyZW50ID0gdGhpcy5fcGFuZSA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgICAgIGlmIChpc0F0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kZXRhY2htZW50cy5uZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGV0YWNobWVudHMuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBoYXMgYXR0YWNoZWQgY29udGVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc0F0dGFjaGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIGJhY2tkcm9wIGhhcyBiZWVuIGNsaWNrZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBiYWNrZHJvcENsaWNrKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYmFja2Ryb3BDbGljay5hc09ic2VydmFibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgb3ZlcmxheSBoYXMgYmVlbiBhdHRhY2hlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaG1lbnRzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fYXR0YWNobWVudHMuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4gdGhlIG92ZXJsYXkgaGFzIGJlZW4gZGV0YWNoZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXRhY2htZW50cygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RldGFjaG1lbnRzLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFuIG9ic2VydmFibGUgb2Yga2V5ZG93biBldmVudHMgdGFyZ2V0ZWQgdG8gdGhpcyBvdmVybGF5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAga2V5ZG93bkV2ZW50cygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2tleWRvd25FdmVudHMuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGN1cnJlbnQgb3ZlcmxheSBjb25maWd1cmF0aW9uLCB3aGljaCBpcyBpbW11dGFibGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRDb25maWcoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb25maWc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5IGJhc2VkIG9uIHRoZSBwb3NpdGlvbiBzdHJhdGVneS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBvc2l0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5fcG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5hcHBseSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN3aXRjaGVzIHRvIGEgbmV3IHBvc2l0aW9uIHN0cmF0ZWd5IGFuZCB1cGRhdGVzIHRoZSBvdmVybGF5IHBvc2l0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gc3RyYXRlZ3kKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBvc2l0aW9uU3RyYXRlZ3koc3RyYXRlZ3kpIHsKICAgICAgICAgICAgaWYgKHN0cmF0ZWd5ID09PSB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGlzcG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kgPSBzdHJhdGVneTsKICAgICAgICAgICAgaWYgKHRoaXMuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICAgICAgc3RyYXRlZ3kuYXR0YWNoKHRoaXMpOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVQb3NpdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgc2l6ZSBwcm9wZXJ0aWVzIG9mIHRoZSBvdmVybGF5LgogICAgICAgICAqIEBwYXJhbSB7P30gc2l6ZUNvbmZpZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU2l6ZShzaXplQ29uZmlnKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fY29uZmlnKSwgc2l6ZUNvbmZpZyk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVsZW1lbnRTaXplKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIExUUi9SVEwgZGlyZWN0aW9uIGZvciB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlyZWN0aW9uKGRpcikgewogICAgICAgICAgICB0aGlzLl9jb25maWcgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRoaXMuX2NvbmZpZyksIHsgZGlyZWN0aW9uOiBkaXIgfSk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUVsZW1lbnREaXJlY3Rpb24oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIGEgQ1NTIGNsYXNzIG9yIGFuIGFycmF5IG9mIGNsYXNzZXMgdG8gdGhlIG92ZXJsYXkgcGFuZS4KICAgICAgICAgKiBAcGFyYW0gez99IGNsYXNzZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZFBhbmVsQ2xhc3MoY2xhc3NlcykgewogICAgICAgICAgICBpZiAodGhpcy5fcGFuZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3Nlcyh0aGlzLl9wYW5lLCBjbGFzc2VzLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmUgYSBDU1MgY2xhc3Mgb3IgYW4gYXJyYXkgb2YgY2xhc3NlcyBmcm9tIHRoZSBvdmVybGF5IHBhbmUuCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVQYW5lbENsYXNzKGNsYXNzZXMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3BhbmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fcGFuZSwgY2xhc3NlcywgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGxheW91dCBkaXJlY3Rpb24gb2YgdGhlIG92ZXJsYXkgcGFuZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXREaXJlY3Rpb24oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gdGhpcy5fY29uZmlnLmRpcmVjdGlvbjsKICAgICAgICAgICAgaWYgKCFkaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiAnbHRyJzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHlwZW9mIGRpcmVjdGlvbiA9PT0gJ3N0cmluZycgPyBkaXJlY3Rpb24gOiBkaXJlY3Rpb24udmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN3aXRjaGVzIHRvIGEgbmV3IHNjcm9sbCBzdHJhdGVneS4KICAgICAgICAgKiBAcGFyYW0gez99IHN0cmF0ZWd5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVTY3JvbGxTdHJhdGVneShzdHJhdGVneSkgewogICAgICAgICAgICBpZiAoc3RyYXRlZ3kgPT09IHRoaXMuX3Njcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGlzcG9zZVNjcm9sbFN0cmF0ZWd5KCk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gc3RyYXRlZ3k7CiAgICAgICAgICAgIGlmICh0aGlzLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgIHN0cmF0ZWd5LmF0dGFjaCh0aGlzKTsKICAgICAgICAgICAgICAgIHN0cmF0ZWd5LmVuYWJsZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHRleHQgZGlyZWN0aW9uIG9mIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlRWxlbWVudERpcmVjdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5faG9zdC5zZXRBdHRyaWJ1dGUoJ2RpcicsIHRoaXMuZ2V0RGlyZWN0aW9uKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBzaXplIG9mIHRoZSBvdmVybGF5IGVsZW1lbnQgYmFzZWQgb24gdGhlIG92ZXJsYXkgY29uZmlnLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlRWxlbWVudFNpemUoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fcGFuZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSB0aGlzLl9wYW5lLnN0eWxlOwogICAgICAgICAgICBzdHlsZS53aWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy5fY29uZmlnLndpZHRoKTsKICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLl9jb25maWcuaGVpZ2h0KTsKICAgICAgICAgICAgc3R5bGUubWluV2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMuX2NvbmZpZy5taW5XaWR0aCk7CiAgICAgICAgICAgIHN0eWxlLm1pbkhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUodGhpcy5fY29uZmlnLm1pbkhlaWdodCk7CiAgICAgICAgICAgIHN0eWxlLm1heFdpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZSh0aGlzLl9jb25maWcubWF4V2lkdGgpOwogICAgICAgICAgICBzdHlsZS5tYXhIZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKHRoaXMuX2NvbmZpZy5tYXhIZWlnaHQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUb2dnbGVzIHRoZSBwb2ludGVyIGV2ZW50cyBmb3IgdGhlIG92ZXJsYXkgcGFuZSBlbGVtZW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbmFibGVQb2ludGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdG9nZ2xlUG9pbnRlckV2ZW50cyhlbmFibGVQb2ludGVyKSB7CiAgICAgICAgICAgIHRoaXMuX3BhbmUuc3R5bGUucG9pbnRlckV2ZW50cyA9IGVuYWJsZVBvaW50ZXIgPyAnYXV0bycgOiAnbm9uZSc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIGEgYmFja2Ryb3AgZm9yIHRoaXMgb3ZlcmxheS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2F0dGFjaEJhY2tkcm9wKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNob3dpbmdDbGFzcyA9ICdjZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nJzsKICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3BFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdjZGstb3ZlcmxheS1iYWNrZHJvcCcpOwogICAgICAgICAgICBpZiAodGhpcy5fY29uZmlnLmJhY2tkcm9wQ2xhc3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fYmFja2Ryb3BFbGVtZW50LCB0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcywgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW5zZXJ0IHRoZSBiYWNrZHJvcCBiZWZvcmUgdGhlIHBhbmUgaW4gdGhlIERPTSBvcmRlciwKICAgICAgICAgICAgLy8gaW4gb3JkZXIgdG8gaGFuZGxlIHN0YWNrZWQgb3ZlcmxheXMgcHJvcGVybHkuCiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQpKS5pbnNlcnRCZWZvcmUodGhpcy5fYmFja2Ryb3BFbGVtZW50LCB0aGlzLl9ob3N0KTsKICAgICAgICAgICAgLy8gRm9yd2FyZCBiYWNrZHJvcCBjbGlja3Mgc3VjaCB0aGF0IHRoZSBjb25zdW1lciBvZiB0aGUgb3ZlcmxheSBjYW4gcGVyZm9ybSB3aGF0ZXZlcgogICAgICAgICAgICAvLyBhY3Rpb24gZGVzaXJlZCB3aGVuIHN1Y2ggYSBjbGljayBvY2N1cnMgKHVzdWFsbHkgY2xvc2luZyB0aGUgb3ZlcmxheSkuCiAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMuX2JhY2tkcm9wQ2xpY2tIYW5kbGVyKTsKICAgICAgICAgICAgLy8gQWRkIGNsYXNzIHRvIGZhZGUtaW4gdGhlIGJhY2tkcm9wIGFmdGVyIG9uZSBmcmFtZS4KICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJlcXVlc3RBbmltYXRpb25GcmFtZSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9iYWNrZHJvcEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wRWxlbWVudC5jbGFzc0xpc3QuYWRkKHNob3dpbmdDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9iYWNrZHJvcEVsZW1lbnQuY2xhc3NMaXN0LmFkZChzaG93aW5nQ2xhc3MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHN0YWNraW5nIG9yZGVyIG9mIHRoZSBlbGVtZW50LCBtb3ZpbmcgaXQgdG8gdGhlIHRvcCBpZiBuZWNlc3NhcnkuCiAgICAgICAgICogVGhpcyBpcyByZXF1aXJlZCBpbiBjYXNlcyB3aGVyZSBvbmUgb3ZlcmxheSB3YXMgZGV0YWNoZWQsIHdoaWxlIGFub3RoZXIgb25lLAogICAgICAgICAqIHRoYXQgc2hvdWxkIGJlIGJlaGluZCBpdCwgd2FzIGRlc3Ryb3llZC4gVGhlIG5leHQgdGltZSBib3RoIG9mIHRoZW0gYXJlIG9wZW5lZCwKICAgICAgICAgKiB0aGUgc3RhY2tpbmcgd2lsbCBiZSB3cm9uZywgYmVjYXVzZSB0aGUgZGV0YWNoZWQgZWxlbWVudCdzIHBhbmUgd2lsbCBzdGlsbCBiZQogICAgICAgICAqIGluIGl0cyBvcmlnaW5hbCBET00gcG9zaXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVTdGFja2luZ09yZGVyKCkgewogICAgICAgICAgICBpZiAodGhpcy5faG9zdC5uZXh0U2libGluZykgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2hvc3QucGFyZW50Tm9kZSkpLmFwcGVuZENoaWxkKHRoaXMuX2hvc3QpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGFjaGVzIHRoZSBiYWNrZHJvcCAoaWYgYW55KSBhc3NvY2lhdGVkIHdpdGggdGhlIG92ZXJsYXkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXRhY2hCYWNrZHJvcCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYmFja2Ryb3BUb0RldGFjaCA9IHRoaXMuX2JhY2tkcm9wRWxlbWVudDsKICAgICAgICAgICAgaWYgKCFiYWNrZHJvcFRvRGV0YWNoKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdGltZW91dElkOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBmaW5pc2hEZXRhY2ggPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBJdCBtYXkgbm90IGJlIGF0dGFjaGVkIHRvIGFueXRoaW5nIGluIGNlcnRhaW4gY2FzZXMgKGUuZy4gdW5pdCB0ZXN0cykuCiAgICAgICAgICAgICAgICBpZiAoYmFja2Ryb3BUb0RldGFjaCkgewogICAgICAgICAgICAgICAgICAgIGJhY2tkcm9wVG9EZXRhY2gucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLl9iYWNrZHJvcENsaWNrSGFuZGxlcik7CiAgICAgICAgICAgICAgICAgICAgYmFja2Ryb3BUb0RldGFjaC5yZW1vdmVFdmVudExpc3RlbmVyKCd0cmFuc2l0aW9uZW5kJywgZmluaXNoRGV0YWNoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYmFja2Ryb3BUb0RldGFjaC5wYXJlbnROb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tkcm9wVG9EZXRhY2gucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChiYWNrZHJvcFRvRGV0YWNoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSB0aGF0IGEgbmV3IHBvcnRhbCBoYXMgYmVlbiBhdHRhY2hlZCB0byB0aGlzIG92ZXJsYXkgc2luY2Ugd2Ugc3RhcnRlZAogICAgICAgICAgICAgICAgLy8gcmVtb3ZpbmcgdGhlIGJhY2tkcm9wLiBJZiB0aGF0IGlzIHRoZSBjYXNlLCBvbmx5IGNsZWFyIHRoZSBiYWNrZHJvcCByZWZlcmVuY2UgaWYgaXQKICAgICAgICAgICAgICAgIC8vIGlzIHN0aWxsIHRoZSBzYW1lIGluc3RhbmNlIHRoYXQgd2Ugc3RhcnRlZCB0byByZW1vdmUuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYmFja2Ryb3BFbGVtZW50ID09IGJhY2tkcm9wVG9EZXRhY2gpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9iYWNrZHJvcEVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5iYWNrZHJvcENsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG9nZ2xlQ2xhc3NlcygoLyoqIEB0eXBlIHs/fSAqLyAoYmFja2Ryb3BUb0RldGFjaCkpLCB0aGlzLl9jb25maWcuYmFja2Ryb3BDbGFzcywgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRJZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBiYWNrZHJvcFRvRGV0YWNoLmNsYXNzTGlzdC5yZW1vdmUoJ2Nkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmcnKTsKICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChiYWNrZHJvcFRvRGV0YWNoKSkuYWRkRXZlbnRMaXN0ZW5lcigndHJhbnNpdGlvbmVuZCcsIGZpbmlzaERldGFjaCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGJhY2tkcm9wIGRvZXNuJ3QgaGF2ZSBhIHRyYW5zaXRpb24sIHRoZSBgdHJhbnNpdGlvbmVuZGAgZXZlbnQgd29uJ3QgZmlyZS4KICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIG1ha2UgaXQgdW5jbGlja2FibGUgYW5kIHdlIHRyeSB0byByZW1vdmUgaXQgYWZ0ZXIgYSBkZWxheS4KICAgICAgICAgICAgYmFja2Ryb3BUb0RldGFjaC5zdHlsZS5wb2ludGVyRXZlbnRzID0gJ25vbmUnOwogICAgICAgICAgICAvLyBSdW4gdGhpcyBvdXRzaWRlIHRoZSBBbmd1bGFyIHpvbmUgYmVjYXVzZSB0aGVyZSdzIG5vdGhpbmcgdGhhdCBBbmd1bGFyIGNhcmVzIGFib3V0LgogICAgICAgICAgICAvLyBJZiBpdCB3ZXJlIHRvIHJ1biBpbnNpZGUgdGhlIEFuZ3VsYXIgem9uZSwgZXZlcnkgdGVzdCB0aGF0IHVzZWQgT3ZlcmxheSB3b3VsZCBoYXZlIHRvIGJlCiAgICAgICAgICAgIC8vIGVpdGhlciBhc3luYyBvciBmYWtlQXN5bmMuCiAgICAgICAgICAgIHRpbWVvdXRJZCA9IHRoaXMuX25nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBzZXRUaW1lb3V0KGZpbmlzaERldGFjaCwgNTAwKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUb2dnbGVzIGEgc2luZ2xlIENTUyBjbGFzcyBvciBhbiBhcnJheSBvZiBjbGFzc2VzIG9uIGFuIGVsZW1lbnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IGNzc0NsYXNzZXMKICAgICAgICAgKiBAcGFyYW0gez99IGlzQWRkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdG9nZ2xlQ2xhc3NlcyhlbGVtZW50LCBjc3NDbGFzc2VzLCBpc0FkZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsYXNzTGlzdCA9IGVsZW1lbnQuY2xhc3NMaXN0OwogICAgICAgICAgICBjb2VyY2VBcnJheShjc3NDbGFzc2VzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjc3NDbGFzcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3NzQ2xhc3MgPT4gewogICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgZG8gYSBzcHJlYWQgaGVyZSwgYmVjYXVzZSBJRSBkb2Vzbid0IHN1cHBvcnQgc2V0dGluZyBtdWx0aXBsZSBjbGFzc2VzLgogICAgICAgICAgICAgICAgLy8gQWxzbyB0cnlpbmcgdG8gYWRkIGFuIGVtcHR5IHN0cmluZyB0byBhIERPTVRva2VuTGlzdCB3aWxsIHRocm93LgogICAgICAgICAgICAgICAgaWYgKGNzc0NsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgaXNBZGQgPyBjbGFzc0xpc3QuYWRkKGNzc0NsYXNzKSA6IGNsYXNzTGlzdC5yZW1vdmUoY3NzQ2xhc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGFjaGVzIHRoZSBvdmVybGF5IGNvbnRlbnQgbmV4dCB0aW1lIHRoZSB6b25lIHN0YWJpbGl6ZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9kZXRhY2hDb250ZW50V2hlblN0YWJsZSgpIHsKICAgICAgICAgICAgLy8gTm9ybWFsbHkgd2Ugd291bGRuJ3QgaGF2ZSB0byBleHBsaWNpdGx5IHJ1biB0aGlzIG91dHNpZGUgdGhlIGBOZ1pvbmVgLCBob3dldmVyCiAgICAgICAgICAgIC8vIGlmIHRoZSBjb25zdW1lciBpcyB1c2luZyBgem9uZS1wYXRjaC1yeGpzYCwgdGhlIGBTdWJzY3JpcHRpb24udW5zdWJzY3JpYmVgIGNhbGwgd2lsbAogICAgICAgICAgICAvLyBiZSBwYXRjaGVkIHRvIHJ1biBpbnNpZGUgdGhlIHpvbmUsIHdoaWNoIHdpbGwgdGhyb3cgdXMgaW50byBhbiBpbmZpbml0ZSBsb29wLgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gV2UgY2FuJ3QgcmVtb3ZlIHRoZSBob3N0IGhlcmUgaW1tZWRpYXRlbHksIGJlY2F1c2UgdGhlIG92ZXJsYXkgcGFuZSdzIGNvbnRlbnQKICAgICAgICAgICAgICAgIC8vIG1pZ2h0IHN0aWxsIGJlIGFuaW1hdGluZy4gVGhpcyBzdHJlYW0gaGVscHMgdXMgYXZvaWQgaW50ZXJydXB0aW5nIHRoZSBhbmltYXRpb24KICAgICAgICAgICAgICAgIC8vIGJ5IHdhaXRpbmcgZm9yIHRoZSBwYW5lIHRvIGJlY29tZSBlbXB0eS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN1YnNjcmlwdGlvbiA9IHRoaXMuX25nWm9uZS5vblN0YWJsZQogICAgICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKQogICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbChtZXJnZSh0aGlzLl9hdHRhY2htZW50cywgdGhpcy5fZGV0YWNobWVudHMpKSkKICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBOZWVkcyBhIGNvdXBsZSBvZiBjaGVja3MgZm9yIHRoZSBwYW5lIGFuZCBob3N0LCBiZWNhdXNlCiAgICAgICAgICAgICAgICAgICAgLy8gdGhleSBtYXkgaGF2ZSBiZWVuIHJlbW92ZWQgYnkgdGhlIHRpbWUgdGhlIHpvbmUgc3RhYmlsaXplcy4KICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3BhbmUgfHwgIXRoaXMuX2hvc3QgfHwgdGhpcy5fcGFuZS5jaGlsZHJlbi5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhbmUgJiYgdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RvZ2dsZUNsYXNzZXModGhpcy5fcGFuZSwgdGhpcy5fY29uZmlnLnBhbmVsQ2xhc3MsIGZhbHNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5faG9zdCAmJiB0aGlzLl9ob3N0LnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudCA9IHRoaXMuX2hvc3QucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzSG9zdFBhcmVudC5yZW1vdmVDaGlsZCh0aGlzLl9ob3N0KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGlzcG9zZXMgb2YgYSBzY3JvbGwgc3RyYXRlZ3kuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9kaXNwb3NlU2Nyb2xsU3RyYXRlZ3koKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3RyYXRlZ3kgPSB0aGlzLl9zY3JvbGxTdHJhdGVneTsKICAgICAgICAgICAgaWYgKHNjcm9sbFN0cmF0ZWd5KSB7CiAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneS5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsU3RyYXRlZ3kuZGV0YWNoKSB7CiAgICAgICAgICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3kuZGV0YWNoKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvcG9zaXRpb24vZmxleGlibGUtY29ubmVjdGVkLXBvc2l0aW9uLXN0cmF0ZWd5LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIFRPRE86IHJlZmFjdG9yIGNsaXBwaW5nIGRldGVjdGlvbiBpbnRvIGEgc2VwYXJhdGUgdGhpbmcgKHBhcnQgb2Ygc2Nyb2xsaW5nIG1vZHVsZSkKICAgIC8vIFRPRE86IGRvZXNuJ3QgaGFuZGxlIGJvdGggZmxleGlibGUgd2lkdGggYW5kIGhlaWdodCB3aGVuIGl0IGhhcyB0byBzY3JvbGwgYWxvbmcgYm90aCBheGlzLgogICAgLyoqCiAgICAgKiBDbGFzcyB0byBiZSBhZGRlZCB0byB0aGUgb3ZlcmxheSBib3VuZGluZyBib3guCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgYm91bmRpbmdCb3hDbGFzcyA9ICdjZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94JzsKICAgIC8qKgogICAgICogUmVnZXggdXNlZCB0byBzcGxpdCBhIHN0cmluZyBvbiBpdHMgQ1NTIHVuaXRzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGNzc1VuaXRQYXR0ZXJuID0gLyhbQS1aYS16JV0rKSQvOwogICAgLyoqCiAgICAgKiBBIHN0cmF0ZWd5IGZvciBwb3NpdGlvbmluZyBvdmVybGF5cy4gVXNpbmcgdGhpcyBzdHJhdGVneSwgYW4gb3ZlcmxheSBpcyBnaXZlbiBhbgogICAgICogaW1wbGljaXQgcG9zaXRpb24gcmVsYXRpdmUgc29tZSBvcmlnaW4gZWxlbWVudC4gVGhlIHJlbGF0aXZlIHBvc2l0aW9uIGlzIGRlZmluZWQgaW4gdGVybXMgb2YKICAgICAqIGEgcG9pbnQgb24gdGhlIG9yaWdpbiBlbGVtZW50IHRoYXQgaXMgY29ubmVjdGVkIHRvIGEgcG9pbnQgb24gdGhlIG92ZXJsYXkgZWxlbWVudC4gRm9yIGV4YW1wbGUsCiAgICAgKiBhIGJhc2ljIGRyb3Bkb3duIGlzIGNvbm5lY3RpbmcgdGhlIGJvdHRvbS1sZWZ0IGNvcm5lciBvZiB0aGUgb3JpZ2luIHRvIHRoZSB0b3AtbGVmdCBjb3JuZXIKICAgICAqIG9mIHRoZSBvdmVybGF5LgogICAgICovCiAgICBjbGFzcyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29ubmVjdGVkVG8KICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3cG9ydFJ1bGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICAgICAqIEBwYXJhbSB7P30gX292ZXJsYXlDb250YWluZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb25uZWN0ZWRUbywgX3ZpZXdwb3J0UnVsZXIsIF9kb2N1bWVudCwgX3BsYXRmb3JtLCBfb3ZlcmxheUNvbnRhaW5lcikgewogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyID0gX3ZpZXdwb3J0UnVsZXI7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUNvbnRhaW5lciA9IF9vdmVybGF5Q29udGFpbmVyOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTGFzdCBzaXplIHVzZWQgZm9yIHRoZSBib3VuZGluZyBib3guIFVzZWQgdG8gYXZvaWQgcmVzaXppbmcgdGhlIG92ZXJsYXkgYWZ0ZXIgb3Blbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUgPSB7IHdpZHRoOiAwLCBoZWlnaHQ6IDAgfTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgd2FzIHB1c2hlZCBpbiBhIHByZXZpb3VzIHBvc2l0aW9uaW5nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faXNQdXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgY2FuIGJlIHB1c2hlZCBvbi1zY3JlZW4gb24gdGhlIGluaXRpYWwgb3Blbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NhblB1c2ggPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBjYW4gZ3JvdyB2aWEgZmxleGlibGUgd2lkdGgvaGVpZ2h0IGFmdGVyIHRoZSBpbml0aWFsIG9wZW4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9ncm93QWZ0ZXJPcGVuID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5J3Mgd2lkdGggYW5kIGhlaWdodCBjYW4gYmUgY29uc3RyYWluZWQgdG8gZml0IHdpdGhpbiB0aGUgdmlld3BvcnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnMgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBwb3NpdGlvbiBpcyBsb2NrZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkxvY2tlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQW1vdW50IG9mIHNwYWNlIHRoYXQgbXVzdCBiZSBtYWludGFpbmVkIGJldHdlZW4gdGhlIG92ZXJsYXkgYW5kIHRoZSBlZGdlIG9mIHRoZSB2aWV3cG9ydC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0TWFyZ2luID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBTY3JvbGxhYmxlIGNvbnRhaW5lcnMgdXNlZCB0byBjaGVjayBzY3JvbGxhYmxlIHZpZXcgcHJvcGVydGllcyBvbiBwb3NpdGlvbiBjaGFuZ2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zY3JvbGxhYmxlcyA9IFtdOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogT3JkZXJlZCBsaXN0IG9mIHByZWZlcnJlZCBwb3NpdGlvbnMsIGZyb20gbW9zdCB0byBsZWFzdCBkZXNpcmFibGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMgPSBbXTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YmplY3QgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcG9zaXRpb24gY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJzY3JpcHRpb24gdG8gdmlld3BvcnQgc2l6ZSBjaGFuZ2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRGVmYXVsdCBvZmZzZXQgZm9yIHRoZSBvdmVybGF5IGFsb25nIHRoZSB4IGF4aXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vZmZzZXRYID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIERlZmF1bHQgb2Zmc2V0IGZvciB0aGUgb3ZlcmxheSBhbG9uZyB0aGUgeSBheGlzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBLZWVwcyB0cmFjayBvZiB0aGUgQ1NTIGNsYXNzZXMgdGhhdCB0aGUgcG9zaXRpb24gc3RyYXRlZ3kgaGFzIGFwcGxpZWQgb24gdGhlIG92ZXJsYXkgcGFuZWwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBPYnNlcnZhYmxlIHNlcXVlbmNlIG9mIHBvc2l0aW9uIGNoYW5nZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnBvc2l0aW9uQ2hhbmdlcyA9IHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5hc09ic2VydmFibGUoKTsKICAgICAgICAgICAgdGhpcy5zZXRPcmlnaW4oY29ubmVjdGVkVG8pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBPcmRlcmVkIGxpc3Qgb2YgcHJlZmVycmVkIHBvc2l0aW9ucywgZnJvbSBtb3N0IHRvIGxlYXN0IGRlc2lyYWJsZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwb3NpdGlvbnMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIHRoaXMgcG9zaXRpb24gc3RyYXRlZ3kgdG8gYW4gb3ZlcmxheS4KICAgICAgICAgKiBAcGFyYW0gez99IG92ZXJsYXlSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaChvdmVybGF5UmVmKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmICYmIG92ZXJsYXlSZWYgIT09IHRoaXMuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdUaGlzIHBvc2l0aW9uIHN0cmF0ZWd5IGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gYW4gb3ZlcmxheScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRlUG9zaXRpb25zKCk7CiAgICAgICAgICAgIG92ZXJsYXlSZWYuaG9zdEVsZW1lbnQuY2xhc3NMaXN0LmFkZChib3VuZGluZ0JveENsYXNzKTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG92ZXJsYXlSZWY7CiAgICAgICAgICAgIHRoaXMuX2JvdW5kaW5nQm94ID0gb3ZlcmxheVJlZi5ob3N0RWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fcGFuZSA9IG92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsUmVuZGVyID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fbGFzdFBvc2l0aW9uID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVzaXplU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc2l6ZVN1YnNjcmlwdGlvbiA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuY2hhbmdlKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHdpbmRvdyBpcyByZXNpemVkLCB3ZSB3YW50IHRvIHRyaWdnZXIgdGhlIG5leHQgcmVwb3NpdGlvbiBhcyBpZiBpdAogICAgICAgICAgICAgICAgLy8gd2FzIGFuIGluaXRpYWwgcmVuZGVyLCBpbiBvcmRlciBmb3IgdGhlIHN0cmF0ZWd5IHRvIHBpY2sgYSBuZXcgb3B0aW1hbCBwb3NpdGlvbiwKICAgICAgICAgICAgICAgIC8vIG90aGVyd2lzZSBwb3NpdGlvbiBsb2NraW5nIHdpbGwgY2F1c2UgaXQgdG8gc3RheSBhdCB0aGUgb2xkIG9uZS4KICAgICAgICAgICAgICAgIHRoaXMuX2lzSW5pdGlhbFJlbmRlciA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmFwcGx5KCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgcG9zaXRpb24gb2YgdGhlIG92ZXJsYXkgZWxlbWVudCwgdXNpbmcgd2hpY2hldmVyIHByZWZlcnJlZCBwb3NpdGlvbiByZWxhdGl2ZQogICAgICAgICAqIHRvIHRoZSBvcmlnaW4gYmVzdCBmaXRzIG9uLXNjcmVlbi4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBzZWxlY3Rpb24gb2YgYSBwb3NpdGlvbiBnb2VzIGFzIGZvbGxvd3M6CiAgICAgICAgICogIC0gSWYgYW55IHBvc2l0aW9ucyBmaXQgY29tcGxldGVseSB3aXRoaW4gdGhlIHZpZXdwb3J0IGFzLWlzLAogICAgICAgICAqICAgICAgY2hvb3NlIHRoZSBmaXJzdCBwb3NpdGlvbiB0aGF0IGRvZXMgc28uCiAgICAgICAgICogIC0gSWYgZmxleGlibGUgZGltZW5zaW9ucyBhcmUgZW5hYmxlZCBhbmQgYXQgbGVhc3Qgb25lIHNhdGlmaWVzIHRoZSBnaXZlbiBtaW5pbXVtIHdpZHRoL2hlaWdodCwKICAgICAgICAgKiAgICAgIGNob29zZSB0aGUgcG9zaXRpb24gd2l0aCB0aGUgZ3JlYXRlc3QgYXZhaWxhYmxlIHNpemUgbW9kaWZpZWQgYnkgdGhlIHBvc2l0aW9ucycgd2VpZ2h0LgogICAgICAgICAqICAtIElmIHB1c2hpbmcgaXMgZW5hYmxlZCwgdGFrZSB0aGUgcG9zaXRpb24gdGhhdCB3ZW50IG9mZi1zY3JlZW4gdGhlIGxlYXN0IGFuZCBwdXNoIGl0CiAgICAgICAgICogICAgICBvbi1zY3JlZW4uCiAgICAgICAgICogIC0gSWYgbm9uZSBvZiB0aGUgcHJldmlvdXMgY3JpdGVyaWEgd2VyZSBtZXQsIHVzZSB0aGUgcG9zaXRpb24gdGhhdCBnb2VzIG9mZi1zY3JlZW4gdGhlIGxlYXN0LgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhcHBseSgpIHsKICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGRvIGFueXRoaW5nIGlmIHRoZSBzdHJhdGVneSB3YXMgZGlzcG9zZWQgb3Igd2UncmUgb24gdGhlIHNlcnZlci4KICAgICAgICAgICAgaWYgKHRoaXMuX2lzRGlzcG9zZWQgfHwgIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHRoZSBwb3NpdGlvbiBoYXMgYmVlbiBhcHBsaWVkIGFscmVhZHkgKGUuZy4gd2hlbiB0aGUgb3ZlcmxheSB3YXMgb3BlbmVkKSBhbmQgdGhlCiAgICAgICAgICAgIC8vIGNvbnN1bWVyIG9wdGVkIGludG8gbG9ja2luZyBpbiB0aGUgcG9zaXRpb24sIHJlLXVzZSB0aGUgb2xkIHBvc2l0aW9uLCBpbiBvcmRlciB0bwogICAgICAgICAgICAvLyBwcmV2ZW50IHRoZSBvdmVybGF5IGZyb20ganVtcGluZyBhcm91bmQuCiAgICAgICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsUmVuZGVyICYmIHRoaXMuX3Bvc2l0aW9uTG9ja2VkICYmIHRoaXMuX2xhc3RQb3NpdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5yZWFwcGx5TGFzdFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2xlYXJQYW5lbENsYXNzZXMoKTsKICAgICAgICAgICAgdGhpcy5fcmVzZXRPdmVybGF5RWxlbWVudFN0eWxlcygpOwogICAgICAgICAgICB0aGlzLl9yZXNldEJvdW5kaW5nQm94U3R5bGVzKCk7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdGhlIGJvdW5kaW5nIHJlY3RzIGZvciB0aGUgb3JpZ2luIGFuZCB0aGUgb3ZlcmxheSB0byBkZXRlcm1pbmUgaG93IHRvIHBvc2l0aW9uCiAgICAgICAgICAgIC8vIHRoZSBvdmVybGF5IHJlbGF0aXZlIHRvIHRoZSBvcmlnaW4uCiAgICAgICAgICAgIC8vIFdlIHVzZSB0aGUgdmlld3BvcnQgcmVjdCB0byBkZXRlcm1pbmUgd2hldGhlciBhIHBvc2l0aW9uIHdvdWxkIGdvIG9mZi1zY3JlZW4uCiAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0UmVjdCA9IHRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX29yaWdpblJlY3QgPSB0aGlzLl9nZXRPcmlnaW5SZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWN0ID0gdGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcmlnaW5SZWN0ID0gdGhpcy5fb3JpZ2luUmVjdDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdmVybGF5UmVjdCA9IHRoaXMuX292ZXJsYXlSZWN0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0UmVjdCA9IHRoaXMuX3ZpZXdwb3J0UmVjdDsKICAgICAgICAgICAgLy8gUG9zaXRpb25zIHdoZXJlIHRoZSBvdmVybGF5IHdpbGwgZml0IHdpdGggZmxleGlibGUgZGltZW5zaW9ucy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmbGV4aWJsZUZpdHMgPSBbXTsKICAgICAgICAgICAgLy8gRmFsbGJhY2sgaWYgbm9uZSBvZiB0aGUgcHJlZmVycmVkIHBvc2l0aW9ucyBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZmFsbGJhY2s7CiAgICAgICAgICAgIC8vIEdvIHRocm91Z2ggZWFjaCBvZiB0aGUgcHJlZmVycmVkIHBvc2l0aW9ucyBsb29raW5nIGZvciBhIGdvb2QgZml0LgogICAgICAgICAgICAvLyBJZiBhIGdvb2QgZml0IGlzIGZvdW5kLCBpdCB3aWxsIGJlIGFwcGxpZWQgaW1tZWRpYXRlbHkuCiAgICAgICAgICAgIGZvciAobGV0IHBvcyBvZiB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMpIHsKICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgZXhhY3QgKHgsIHkpIGNvb3JkaW5hdGUgZm9yIHRoZSBwb2ludC1vZi1vcmlnaW4gb24gdGhlIG9yaWdpbiBlbGVtZW50LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG9yaWdpblBvaW50ID0gdGhpcy5fZ2V0T3JpZ2luUG9pbnQob3JpZ2luUmVjdCwgcG9zKTsKICAgICAgICAgICAgICAgIC8vIEZyb20gdGhhdCBwb2ludC1vZi1vcmlnaW4sIGdldCB0aGUgZXhhY3QgKHgsIHkpIGNvb3JkaW5hdGUgZm9yIHRoZSB0b3AtbGVmdCBjb3JuZXIgb2YgdGhlCiAgICAgICAgICAgICAgICAvLyBvdmVybGF5IGluIHRoaXMgcG9zaXRpb24uIFdlIHVzZSB0aGUgdG9wLWxlZnQgY29ybmVyIGZvciBjYWxjdWxhdGlvbnMgYW5kIGxhdGVyIHRyYW5zbGF0ZQogICAgICAgICAgICAgICAgLy8gdGhpcyBpbnRvIGFuIGFwcHJvcHJpYXRlICh0b3AsIGxlZnQsIGJvdHRvbSwgcmlnaHQpIHN0eWxlLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG92ZXJsYXlQb2ludCA9IHRoaXMuX2dldE92ZXJsYXlQb2ludChvcmlnaW5Qb2ludCwgb3ZlcmxheVJlY3QsIHBvcyk7CiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgaG93IHdlbGwgdGhlIG92ZXJsYXkgd291bGQgZml0IGludG8gdGhlIHZpZXdwb3J0IHdpdGggdGhpcyBwb2ludC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBvdmVybGF5Rml0ID0gdGhpcy5fZ2V0T3ZlcmxheUZpdChvdmVybGF5UG9pbnQsIG92ZXJsYXlSZWN0LCB2aWV3cG9ydFJlY3QsIHBvcyk7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb3ZlcmxheSwgd2l0aG91dCBhbnkgZnVydGhlciB3b3JrLCBmaXRzIGludG8gdGhlIHZpZXdwb3J0LCB1c2UgdGhpcyBwb3NpdGlvbi4KICAgICAgICAgICAgICAgIGlmIChvdmVybGF5Rml0LmlzQ29tcGxldGVseVdpdGhpblZpZXdwb3J0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faXNQdXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9hcHBseVBvc2l0aW9uKHBvcywgb3JpZ2luUG9pbnQpOwogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZSBvdmVybGF5IGhhcyBmbGV4aWJsZSBkaW1lbnNpb25zLCB3ZSBjYW4gdXNlIHRoaXMgcG9zaXRpb24KICAgICAgICAgICAgICAgIC8vIHNvIGxvbmcgYXMgdGhlcmUncyBlbm91Z2ggc3BhY2UgZm9yIHRoZSBtaW5pbXVtIGRpbWVuc2lvbnMuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FuRml0V2l0aEZsZXhpYmxlRGltZW5zaW9ucyhvdmVybGF5Rml0LCBvdmVybGF5UG9pbnQsIHZpZXdwb3J0UmVjdCkpIHsKICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHBvc2l0aW9ucyB3aGVyZSB0aGUgb3ZlcmxheSB3aWxsIGZpdCB3aXRoIGZsZXhpYmxlIGRpbWVuc2lvbnMuIFdlIHdpbGwgdXNlIHRoZXNlCiAgICAgICAgICAgICAgICAgICAgLy8gaWYgbm9uZSBvZiB0aGUgcG9zaXRpb25zIGZpdCAqd2l0aG91dCogZmxleGlibGUgZGltZW5zaW9ucy4KICAgICAgICAgICAgICAgICAgICBmbGV4aWJsZUZpdHMucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiBwb3MsCiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbjogb3JpZ2luUG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIG92ZXJsYXlSZWN0LAogICAgICAgICAgICAgICAgICAgICAgICBib3VuZGluZ0JveFJlY3Q6IHRoaXMuX2NhbGN1bGF0ZUJvdW5kaW5nQm94UmVjdChvcmlnaW5Qb2ludCwgcG9zKQogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgcHJlZmVycmVkIHBvc2l0aW9uIGRvZXMgbm90IGZpdCBvbiB0aGUgc2NyZWVuLCByZW1lbWJlciB0aGUgcG9zaXRpb24KICAgICAgICAgICAgICAgIC8vIGlmIGl0IGhhcyBtb3JlIHZpc2libGUgYXJlYSBvbi1zY3JlZW4gdGhhbiB3ZSd2ZSBzZWVuIGFuZCBtb3ZlIG9udG8gdGhlIG5leHQgcHJlZmVycmVkCiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbi4KICAgICAgICAgICAgICAgIGlmICghZmFsbGJhY2sgfHwgZmFsbGJhY2sub3ZlcmxheUZpdC52aXNpYmxlQXJlYSA8IG92ZXJsYXlGaXQudmlzaWJsZUFyZWEpIHsKICAgICAgICAgICAgICAgICAgICBmYWxsYmFjayA9IHsgb3ZlcmxheUZpdCwgb3ZlcmxheVBvaW50LCBvcmlnaW5Qb2ludCwgcG9zaXRpb246IHBvcywgb3ZlcmxheVJlY3QgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiB0aGVyZSBhcmUgYW55IHBvc2l0aW9ucyB3aGVyZSB0aGUgb3ZlcmxheSB3b3VsZCBmaXQgd2l0aCBmbGV4aWJsZSBkaW1lbnNpb25zLCBjaG9vc2UgdGhlCiAgICAgICAgICAgIC8vIG9uZSB0aGF0IGhhcyB0aGUgZ3JlYXRlc3QgYXJlYSBhdmFpbGFibGUgbW9kaWZpZWQgYnkgdGhlIHBvc2l0aW9uJ3Mgd2VpZ2h0CiAgICAgICAgICAgIGlmIChmbGV4aWJsZUZpdHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgYmVzdEZpdCA9IG51bGw7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgYmVzdFNjb3JlID0gLTE7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGZpdCBvZiBmbGV4aWJsZUZpdHMpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcmUgPSBmaXQuYm91bmRpbmdCb3hSZWN0LndpZHRoICogZml0LmJvdW5kaW5nQm94UmVjdC5oZWlnaHQgKiAoZml0LnBvc2l0aW9uLndlaWdodCB8fCAxKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7CiAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGaXQgPSBmaXQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5faXNQdXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5UG9zaXRpb24oKC8qKiBAdHlwZSB7P30gKi8gKGJlc3RGaXQpKS5wb3NpdGlvbiwgKC8qKiBAdHlwZSB7P30gKi8gKGJlc3RGaXQpKS5vcmlnaW4pOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdoZW4gbm9uZSBvZiB0aGUgcHJlZmVycmVkIHBvc2l0aW9ucyBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydCwgdGFrZSB0aGUgcG9zaXRpb24KICAgICAgICAgICAgLy8gdGhhdCB3ZW50IG9mZi1zY3JlZW4gdGhlIGxlYXN0IGFuZCBhdHRlbXB0IHRvIHB1c2ggaXQgb24tc2NyZWVuLgogICAgICAgICAgICBpZiAodGhpcy5fY2FuUHVzaCkgewogICAgICAgICAgICAgICAgLy8gVE9ETyhqZWxib3Vybik6IGFmdGVyIHB1c2hpbmcsIHRoZSBvcGVuaW5nICJkaXJlY3Rpb24iIG9mIHRoZSBvdmVybGF5IG1pZ2h0IG5vdCBtYWtlIHNlbnNlLgogICAgICAgICAgICAgICAgdGhpcy5faXNQdXNoZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQb3NpdGlvbigoLyoqIEB0eXBlIHs/fSAqLyAoZmFsbGJhY2spKS5wb3NpdGlvbiwgKC8qKiBAdHlwZSB7P30gKi8gKGZhbGxiYWNrKSkub3JpZ2luUG9pbnQpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFsbCBvcHRpb25zIGZvciBnZXR0aW5nIHRoZSBvdmVybGF5IHdpdGhpbiB0aGUgdmlld3BvcnQgaGF2ZSBiZWVuIGV4aGF1c3RlZCwgc28gZ28gd2l0aCB0aGUKICAgICAgICAgICAgLy8gcG9zaXRpb24gdGhhdCB3ZW50IG9mZi1zY3JlZW4gdGhlIGxlYXN0LgogICAgICAgICAgICB0aGlzLl9hcHBseVBvc2l0aW9uKCgvKiogQHR5cGUgez99ICovIChmYWxsYmFjaykpLnBvc2l0aW9uLCAoLyoqIEB0eXBlIHs/fSAqLyAoZmFsbGJhY2spKS5vcmlnaW5Qb2ludCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoKCkgewogICAgICAgICAgICB0aGlzLl9jbGVhclBhbmVsQ2xhc3NlcygpOwogICAgICAgICAgICB0aGlzLl9sYXN0UG9zaXRpb24gPSBudWxsOwogICAgICAgICAgICB0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9yZXNpemVTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYW51cCBhZnRlciB0aGUgZWxlbWVudCBnZXRzIGRlc3Ryb3llZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2UgY2FuJ3QgdXNlIGBfcmVzZXRCb3VuZGluZ0JveFN0eWxlc2AgaGVyZSwgYmVjYXVzZSBpdCByZXNldHMKICAgICAgICAgICAgLy8gc29tZSBwcm9wZXJ0aWVzIHRvIHplcm8sIHJhdGhlciB0aGFuIHJlbW92aW5nIHRoZW0uCiAgICAgICAgICAgIGlmICh0aGlzLl9ib3VuZGluZ0JveCkgewogICAgICAgICAgICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuX2JvdW5kaW5nQm94LnN0eWxlLCAoLyoqIEB0eXBlIHs/fSAqLyAoewogICAgICAgICAgICAgICAgICAgIHRvcDogJycsCiAgICAgICAgICAgICAgICAgICAgbGVmdDogJycsCiAgICAgICAgICAgICAgICAgICAgcmlnaHQ6ICcnLAogICAgICAgICAgICAgICAgICAgIGJvdHRvbTogJycsCiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAnJywKICAgICAgICAgICAgICAgICAgICB3aWR0aDogJycsCiAgICAgICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJycsCiAgICAgICAgICAgICAgICAgICAganVzdGlmeUNvbnRlbnQ6ICcnLAogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcGFuZSkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRPdmVybGF5RWxlbWVudFN0eWxlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmhvc3RFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYm91bmRpbmdCb3hDbGFzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kZXRhY2goKTsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25DaGFuZ2VzLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9ib3VuZGluZ0JveCA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGlzIHJlLWFsaWducyB0aGUgb3ZlcmxheSBlbGVtZW50IHdpdGggdGhlIHRyaWdnZXIgaW4gaXRzIGxhc3QgY2FsY3VsYXRlZCBwb3NpdGlvbiwKICAgICAgICAgKiBldmVuIGlmIGEgcG9zaXRpb24gaGlnaGVyIGluIHRoZSAicHJlZmVycmVkIHBvc2l0aW9ucyIgbGlzdCB3b3VsZCBub3cgZml0LiBUaGlzCiAgICAgICAgICogYWxsb3dzIG9uZSB0byByZS1hbGlnbiB0aGUgcGFuZWwgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3JpZW50YXRpb24gb2YgdGhlIHBhbmVsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVhcHBseUxhc3RQb3NpdGlvbigpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc0Rpc3Bvc2VkICYmICghdGhpcy5fcGxhdGZvcm0gfHwgdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSkgewogICAgICAgICAgICAgICAgdGhpcy5fb3JpZ2luUmVjdCA9IHRoaXMuX2dldE9yaWdpblJlY3QoKTsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWN0ID0gdGhpcy5fcGFuZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0UmVjdCA9IHRoaXMuX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsYXN0UG9zaXRpb24gPSB0aGlzLl9sYXN0UG9zaXRpb24gfHwgdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zWzBdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luUG9pbnQgPSB0aGlzLl9nZXRPcmlnaW5Qb2ludCh0aGlzLl9vcmlnaW5SZWN0LCBsYXN0UG9zaXRpb24pOwogICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlQb3NpdGlvbihsYXN0UG9zaXRpb24sIG9yaWdpblBvaW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBsaXN0IG9mIFNjcm9sbGFibGUgY29udGFpbmVycyB0aGF0IGhvc3QgdGhlIG9yaWdpbiBlbGVtZW50IHNvIHRoYXQKICAgICAgICAgKiBvbiByZXBvc2l0aW9uIHdlIGNhbiBldmFsdWF0ZSBpZiBpdCBvciB0aGUgb3ZlcmxheSBoYXMgYmVlbiBjbGlwcGVkIG9yIG91dHNpZGUgdmlldy4gRXZlcnkKICAgICAgICAgKiBTY3JvbGxhYmxlIG11c3QgYmUgYW4gYW5jZXN0b3IgZWxlbWVudCBvZiB0aGUgc3RyYXRlZ3kncyBvcmlnaW4gZWxlbWVudC4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsYWJsZXMKICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhTY3JvbGxhYmxlQ29udGFpbmVycyhzY3JvbGxhYmxlcykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9zY3JvbGxhYmxlcyA9IHNjcm9sbGFibGVzOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBuZXcgcHJlZmVycmVkIHBvc2l0aW9ucy4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb25zIExpc3Qgb2YgcG9zaXRpb25zIG9wdGlvbnMgZm9yIHRoaXMgb3ZlcmxheS4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhQb3NpdGlvbnMocG9zaXRpb25zKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZWZlcnJlZFBvc2l0aW9ucyA9IHBvc2l0aW9uczsKICAgICAgICAgICAgLy8gSWYgdGhlIGxhc3QgY2FsY3VsYXRlZCBwb3NpdGlvbiBvYmplY3QgaXNuJ3QgcGFydCBvZiB0aGUgcG9zaXRpb25zIGFueW1vcmUsIGNsZWFyCiAgICAgICAgICAgIC8vIGl0IGluIG9yZGVyIHRvIGF2b2lkIGl0IGJlaW5nIHBpY2tlZCB1cCBpZiB0aGUgY29uc3VtZXIgdHJpZXMgdG8gcmUtYXBwbHkuCiAgICAgICAgICAgIGlmIChwb3NpdGlvbnMuaW5kZXhPZigoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fbGFzdFBvc2l0aW9uKSkpID09PSAtMSkgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fbGFzdFBvc2l0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl92YWxpZGF0ZVBvc2l0aW9ucygpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBhIG1pbmltdW0gZGlzdGFuY2UgdGhlIG92ZXJsYXkgbWF5IGJlIHBvc2l0aW9uZWQgdG8gdGhlIGVkZ2Ugb2YgdGhlIHZpZXdwb3J0LgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBtYXJnaW4gUmVxdWlyZWQgbWFyZ2luIGJldHdlZW4gdGhlIG92ZXJsYXkgYW5kIHRoZSB2aWV3cG9ydCBlZGdlIGluIHBpeGVscy4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhWaWV3cG9ydE1hcmdpbihtYXJnaW4pIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fdmlld3BvcnRNYXJnaW4gPSBtYXJnaW47CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIG92ZXJsYXkncyB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZSBjb25zdHJhaW5lZCB0byBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IGZsZXhpYmxlRGltZW5zaW9ucwogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgd2l0aEZsZXhpYmxlRGltZW5zaW9ucyhmbGV4aWJsZURpbWVuc2lvbnMgPSB0cnVlKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2hhc0ZsZXhpYmxlRGltZW5zaW9ucyA9IGZsZXhpYmxlRGltZW5zaW9uczsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgb3ZlcmxheSBjYW4gZ3JvdyBhZnRlciB0aGUgaW5pdGlhbCBvcGVuIHZpYSBmbGV4aWJsZSB3aWR0aC9oZWlnaHQuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez89fSBncm93QWZ0ZXJPcGVuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoR3Jvd0FmdGVyT3Blbihncm93QWZ0ZXJPcGVuID0gdHJ1ZSkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9ncm93QWZ0ZXJPcGVuID0gZ3Jvd0FmdGVyT3BlbjsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgb3ZlcmxheSBjYW4gYmUgcHVzaGVkIG9uLXNjcmVlbiBpZiBub25lIG9mIHRoZSBwcm92aWRlZCBwb3NpdGlvbnMgZml0LgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/PX0gY2FuUHVzaAogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgd2l0aFB1c2goY2FuUHVzaCA9IHRydWUpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fY2FuUHVzaCA9IGNhblB1c2g7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIG92ZXJsYXkncyBwb3NpdGlvbiBzaG91bGQgYmUgbG9ja2VkIGluIGFmdGVyIGl0IGlzIHBvc2l0aW9uZWQKICAgICAgICAgKiBpbml0aWFsbHkuIFdoZW4gYW4gb3ZlcmxheSBpcyBsb2NrZWQgaW4sIGl0IHdvbid0IGF0dGVtcHQgdG8gcmVwb3NpdGlvbiBpdHNlbGYKICAgICAgICAgKiB3aGVuIHRoZSBwb3NpdGlvbiBpcyByZS1hcHBsaWVkIChlLmcuIHdoZW4gdGhlIHVzZXIgc2Nyb2xscyBhd2F5KS4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzTG9ja2VkIFdoZXRoZXIgdGhlIG92ZXJsYXkgc2hvdWxkIGxvY2tlZCBpbi4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhMb2NrZWRQb3NpdGlvbihpc0xvY2tlZCA9IHRydWUpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcG9zaXRpb25Mb2NrZWQgPSBpc0xvY2tlZDsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG9yaWdpbiwgcmVsYXRpdmUgdG8gd2hpY2ggdG8gcG9zaXRpb24gdGhlIG92ZXJsYXkuCiAgICAgICAgICogVXNpbmcgYW4gZWxlbWVudCBvcmlnaW4gaXMgdXNlZnVsIGZvciBidWlsZGluZyBjb21wb25lbnRzIHRoYXQgbmVlZCB0byBiZSBwb3NpdGlvbmVkCiAgICAgICAgICogcmVsYXRpdmVseSB0byBhIHRyaWdnZXIgKGUuZy4gZHJvcGRvd24gbWVudXMgb3IgdG9vbHRpcHMpLCB3aGVyZWFzIHVzaW5nIGEgcG9pbnQgY2FuIGJlCiAgICAgICAgICogdXNlZCBmb3IgY2FzZXMgbGlrZSBjb250ZXh0dWFsIG1lbnVzIHdoaWNoIG9wZW4gcmVsYXRpdmUgdG8gdGhlIHVzZXIncyBwb2ludGVyLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW4gUmVmZXJlbmNlIHRvIHRoZSBuZXcgb3JpZ2luLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgc2V0T3JpZ2luKG9yaWdpbikgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vcmlnaW4gPSBvcmlnaW47CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IG9mZnNldCBmb3IgdGhlIG92ZXJsYXkncyBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSB4LWF4aXMuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG9mZnNldCBOZXcgb2Zmc2V0IGluIHRoZSBYIGF4aXMuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoRGVmYXVsdE9mZnNldFgob2Zmc2V0KSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX29mZnNldFggPSBvZmZzZXQ7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBkZWZhdWx0IG9mZnNldCBmb3IgdGhlIG92ZXJsYXkncyBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSB5LWF4aXMuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG9mZnNldCBOZXcgb2Zmc2V0IGluIHRoZSBZIGF4aXMuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoRGVmYXVsdE9mZnNldFkob2Zmc2V0KSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX29mZnNldFkgPSBvZmZzZXQ7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25maWd1cmVzIHRoYXQgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IHNob3VsZCBzZXQgYSBgdHJhbnNmb3JtLW9yaWdpbmAgb24gc29tZSBlbGVtZW50cwogICAgICAgICAqIGluc2lkZSB0aGUgb3ZlcmxheSwgZGVwZW5kaW5nIG9uIHRoZSBjdXJyZW50IHBvc2l0aW9uIHRoYXQgaXMgYmVpbmcgYXBwbGllZC4gVGhpcyBpcwogICAgICAgICAqIHVzZWZ1bCBmb3IgdGhlIGNhc2VzIHdoZXJlIHRoZSBvcmlnaW4gb2YgYW4gYW5pbWF0aW9uIGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIHRoZQogICAgICAgICAqIGFsaWdubWVudCBvZiB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0b3IgQ1NTIHNlbGVjdG9yIHRoYXQgd2lsbCBiZSB1c2VkIHRvIGZpbmQgdGhlIHRhcmdldAogICAgICAgICAqICAgIGVsZW1lbnRzIG9udG8gd2hpY2ggdG8gc2V0IHRoZSB0cmFuc2Zvcm0gb3JpZ2luLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgd2l0aFRyYW5zZm9ybU9yaWdpbk9uKHNlbGVjdG9yKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3RyYW5zZm9ybU9yaWdpblNlbGVjdG9yID0gc2VsZWN0b3I7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSAoeCwgeSkgY29vcmRpbmF0ZSBvZiBhIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIG9yaWdpbiBiYXNlZCBvbiBhIHJlbGF0aXZlIHBvc2l0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW5SZWN0CiAgICAgICAgICogQHBhcmFtIHs/fSBwb3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPcmlnaW5Qb2ludChvcmlnaW5SZWN0LCBwb3MpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgeDsKICAgICAgICAgICAgaWYgKHBvcy5vcmlnaW5YID09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3aGVuIGNlbnRlcmluZyB3ZSBzaG91bGQgYWx3YXlzIHVzZSB0aGUgYGxlZnRgCiAgICAgICAgICAgICAgICAvLyBvZmZzZXQsIG90aGVyd2lzZSB0aGUgcG9zaXRpb24gd2lsbCBiZSB3cm9uZyBpbiBSVEwuCiAgICAgICAgICAgICAgICB4ID0gb3JpZ2luUmVjdC5sZWZ0ICsgKG9yaWdpblJlY3Qud2lkdGggLyAyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0WCA9IHRoaXMuX2lzUnRsKCkgPyBvcmlnaW5SZWN0LnJpZ2h0IDogb3JpZ2luUmVjdC5sZWZ0OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kWCA9IHRoaXMuX2lzUnRsKCkgPyBvcmlnaW5SZWN0LmxlZnQgOiBvcmlnaW5SZWN0LnJpZ2h0OwogICAgICAgICAgICAgICAgeCA9IHBvcy5vcmlnaW5YID09ICdzdGFydCcgPyBzdGFydFggOiBlbmRYOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHk7CiAgICAgICAgICAgIGlmIChwb3Mub3JpZ2luWSA9PSAnY2VudGVyJykgewogICAgICAgICAgICAgICAgeSA9IG9yaWdpblJlY3QudG9wICsgKG9yaWdpblJlY3QuaGVpZ2h0IC8gMik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB5ID0gcG9zLm9yaWdpblkgPT0gJ3RvcCcgPyBvcmlnaW5SZWN0LnRvcCA6IG9yaWdpblJlY3QuYm90dG9tOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IHgsIHkgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgKHgsIHkpIGNvb3JkaW5hdGUgb2YgdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiB0aGUgb3ZlcmxheSBnaXZlbiBhIGdpdmVuIHBvc2l0aW9uIGFuZAogICAgICAgICAqIG9yaWdpbiBwb2ludCB0byB3aGljaCB0aGUgb3ZlcmxheSBzaG91bGQgYmUgY29ubmVjdGVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW5Qb2ludAogICAgICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlY3QKICAgICAgICAgKiBAcGFyYW0gez99IHBvcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE92ZXJsYXlQb2ludChvcmlnaW5Qb2ludCwgb3ZlcmxheVJlY3QsIHBvcykgewogICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIChvdmVybGF5U3RhcnRYLCBvdmVybGF5U3RhcnRZKSwgdGhlIHN0YXJ0IG9mIHRoZQogICAgICAgICAgICAvLyBwb3RlbnRpYWwgb3ZlcmxheSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgb3JpZ2luIHBvaW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvdmVybGF5U3RhcnRYOwogICAgICAgICAgICBpZiAocG9zLm92ZXJsYXlYID09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5U3RhcnRYID0gLW92ZXJsYXlSZWN0LndpZHRoIC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwb3Mub3ZlcmxheVggPT09ICdzdGFydCcpIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlTdGFydFggPSB0aGlzLl9pc1J0bCgpID8gLW92ZXJsYXlSZWN0LndpZHRoIDogMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlTdGFydFggPSB0aGlzLl9pc1J0bCgpID8gMCA6IC1vdmVybGF5UmVjdC53aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvdmVybGF5U3RhcnRZOwogICAgICAgICAgICBpZiAocG9zLm92ZXJsYXlZID09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5U3RhcnRZID0gLW92ZXJsYXlSZWN0LmhlaWdodCAvIDI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBvdmVybGF5U3RhcnRZID0gcG9zLm92ZXJsYXlZID09ICd0b3AnID8gMCA6IC1vdmVybGF5UmVjdC5oZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlICh4LCB5KSBjb29yZGluYXRlcyBvZiB0aGUgb3ZlcmxheS4KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHg6IG9yaWdpblBvaW50LnggKyBvdmVybGF5U3RhcnRYLAogICAgICAgICAgICAgICAgeTogb3JpZ2luUG9pbnQueSArIG92ZXJsYXlTdGFydFksCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgaG93IHdlbGwgYW4gb3ZlcmxheSBhdCB0aGUgZ2l2ZW4gcG9pbnQgd2lsbCBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcG9pbnQKICAgICAgICAgKiBAcGFyYW0gez99IG92ZXJsYXkKICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdwb3J0CiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE92ZXJsYXlGaXQocG9pbnQsIG92ZXJsYXksIHZpZXdwb3J0LCBwb3NpdGlvbikgewogICAgICAgICAgICBsZXQgeyB4LCB5IH0gPSBwb2ludDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb2Zmc2V0WCA9IHRoaXMuX2dldE9mZnNldChwb3NpdGlvbiwgJ3gnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb2Zmc2V0WSA9IHRoaXMuX2dldE9mZnNldChwb3NpdGlvbiwgJ3knKTsKICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgdGhlIG9mZnNldHMgc2luY2UgdGhleSBjb3VsZCBwdXNoIHRoZSBvdmVybGF5IG91dCBvZiB0aGUgdmlld3BvcnQuCiAgICAgICAgICAgIGlmIChvZmZzZXRYKSB7CiAgICAgICAgICAgICAgICB4ICs9IG9mZnNldFg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG9mZnNldFkpIHsKICAgICAgICAgICAgICAgIHkgKz0gb2Zmc2V0WTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBIb3cgbXVjaCB0aGUgb3ZlcmxheSB3b3VsZCBvdmVyZmxvdyBhdCB0aGlzIHBvc2l0aW9uLCBvbiBlYWNoIHNpZGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGxlZnRPdmVyZmxvdyA9IDAgLSB4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByaWdodE92ZXJmbG93ID0gKHggKyBvdmVybGF5LndpZHRoKSAtIHZpZXdwb3J0LndpZHRoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0b3BPdmVyZmxvdyA9IDAgLSB5OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBib3R0b21PdmVyZmxvdyA9ICh5ICsgb3ZlcmxheS5oZWlnaHQpIC0gdmlld3BvcnQuaGVpZ2h0OwogICAgICAgICAgICAvLyBWaXNpYmxlIHBhcnRzIG9mIHRoZSBlbGVtZW50IG9uIGVhY2ggYXhpcy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmlzaWJsZVdpZHRoID0gdGhpcy5fc3VidHJhY3RPdmVyZmxvd3Mob3ZlcmxheS53aWR0aCwgbGVmdE92ZXJmbG93LCByaWdodE92ZXJmbG93KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmlzaWJsZUhlaWdodCA9IHRoaXMuX3N1YnRyYWN0T3ZlcmZsb3dzKG92ZXJsYXkuaGVpZ2h0LCB0b3BPdmVyZmxvdywgYm90dG9tT3ZlcmZsb3cpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB2aXNpYmxlQXJlYSA9IHZpc2libGVXaWR0aCAqIHZpc2libGVIZWlnaHQ7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB2aXNpYmxlQXJlYSwKICAgICAgICAgICAgICAgIGlzQ29tcGxldGVseVdpdGhpblZpZXdwb3J0OiAob3ZlcmxheS53aWR0aCAqIG92ZXJsYXkuaGVpZ2h0KSA9PT0gdmlzaWJsZUFyZWEsCiAgICAgICAgICAgICAgICBmaXRzSW5WaWV3cG9ydFZlcnRpY2FsbHk6IHZpc2libGVIZWlnaHQgPT09IG92ZXJsYXkuaGVpZ2h0LAogICAgICAgICAgICAgICAgZml0c0luVmlld3BvcnRIb3Jpem9udGFsbHk6IHZpc2libGVXaWR0aCA9PSBvdmVybGF5LndpZHRoLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBvdmVybGF5IGNhbiBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydCB3aGVuIGl0IG1heSByZXNpemUgZWl0aGVyIGl0cyB3aWR0aCBvciBoZWlnaHQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGZpdCBIb3cgd2VsbCB0aGUgb3ZlcmxheSBmaXRzIGluIHRoZSB2aWV3cG9ydCBhdCBzb21lIHBvc2l0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gcG9pbnQgVGhlICh4LCB5KSBjb29yZGluYXRlcyBvZiB0aGUgb3ZlcmxhdCBhdCBzb21lIHBvc2l0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnQgVGhlIGdlb21ldHJ5IG9mIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jYW5GaXRXaXRoRmxleGlibGVEaW1lbnNpb25zKGZpdCwgcG9pbnQsIHZpZXdwb3J0KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGF2YWlsYWJsZUhlaWdodCA9IHZpZXdwb3J0LmJvdHRvbSAtIHBvaW50Lnk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhdmFpbGFibGVXaWR0aCA9IHZpZXdwb3J0LnJpZ2h0IC0gcG9pbnQueDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1pbkhlaWdodCA9IGdldFBpeGVsVmFsdWUodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5taW5IZWlnaHQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWluV2lkdGggPSBnZXRQaXhlbFZhbHVlKHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWluV2lkdGgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmVydGljYWxGaXQgPSBmaXQuZml0c0luVmlld3BvcnRWZXJ0aWNhbGx5IHx8CiAgICAgICAgICAgICAgICAgICAgKG1pbkhlaWdodCAhPSBudWxsICYmIG1pbkhlaWdodCA8PSBhdmFpbGFibGVIZWlnaHQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaG9yaXpvbnRhbEZpdCA9IGZpdC5maXRzSW5WaWV3cG9ydEhvcml6b250YWxseSB8fAogICAgICAgICAgICAgICAgICAgIChtaW5XaWR0aCAhPSBudWxsICYmIG1pbldpZHRoIDw9IGF2YWlsYWJsZVdpZHRoKTsKICAgICAgICAgICAgICAgIHJldHVybiB2ZXJ0aWNhbEZpdCAmJiBob3Jpem9udGFsRml0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgcG9pbnQgYXQgd2hpY2ggdGhlIG92ZXJsYXkgY2FuIGJlICJwdXNoZWQiIG9uLXNjcmVlbi4gSWYgdGhlIG92ZXJsYXkgaXMgbGFyZ2VyIHRoYW4KICAgICAgICAgKiB0aGUgdmlld3BvcnQsIHRoZSB0b3AtbGVmdCBjb3JuZXIgd2lsbCBiZSBwdXNoZWQgb24tc2NyZWVuICh3aXRoIG92ZXJmbG93IG9jY3VyaW5nIG9uIHRoZQogICAgICAgICAqIHJpZ2h0IGFuZCBib3R0b20pLgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXJ0IFN0YXJ0aW5nIHBvaW50IGZyb20gd2hpY2ggdGhlIG92ZXJsYXkgaXMgcHVzaGVkLgogICAgICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheSBEaW1lbnNpb25zIG9mIHRoZSBvdmVybGF5LgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsUG9zaXRpb24gQ3VycmVudCB2aWV3cG9ydCBzY3JvbGwgcG9zaXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIHBvaW50IGF0IHdoaWNoIHRvIHBvc2l0aW9uIHRoZSBvdmVybGF5IGFmdGVyIHB1c2hpbmcuIFRoaXMgaXMgZWZmZWN0aXZlbHkgYSBuZXcKICAgICAgICAgKiAgICAgb3JpZ2luUG9pbnQuCiAgICAgICAgICovCiAgICAgICAgX3B1c2hPdmVybGF5T25TY3JlZW4oc3RhcnQsIG92ZXJsYXksIHNjcm9sbFBvc2l0aW9uKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBwb3NpdGlvbiBpcyBsb2NrZWQgYW5kIHdlJ3ZlIHB1c2hlZCB0aGUgb3ZlcmxheSBhbHJlYWR5LCByZXVzZSB0aGUgcHJldmlvdXMgcHVzaAogICAgICAgICAgICAvLyBhbW91bnQsIHJhdGhlciB0aGFuIHB1c2hpbmcgaXQgYWdhaW4uIElmIHdlIHdlcmUgdG8gY29udGludWUgcHVzaGluZywgdGhlIGVsZW1lbnQgd291bGQKICAgICAgICAgICAgLy8gcmVtYWluIGluIHRoZSB2aWV3cG9ydCwgd2hpY2ggZ29lcyBhZ2FpbnN0IHRoZSBleHBlY3RhdGlvbnMgd2hlbiBwb3NpdGlvbiBsb2NraW5nIGlzIGVuYWJsZWQuCiAgICAgICAgICAgIGlmICh0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQgJiYgdGhpcy5fcG9zaXRpb25Mb2NrZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgeDogc3RhcnQueCArIHRoaXMuX3ByZXZpb3VzUHVzaEFtb3VudC54LAogICAgICAgICAgICAgICAgICAgIHk6IHN0YXJ0LnkgKyB0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQueQogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdmlld3BvcnRSZWN0OwogICAgICAgICAgICAvLyBEZXRlcm1pbmUgaG93IG11Y2ggdGhlIG92ZXJsYXkgZ29lcyBvdXRzaWRlIHRoZSB2aWV3cG9ydCBvbiBlYWNoCiAgICAgICAgICAgIC8vIHNpZGUsIHdoaWNoIHdlJ2xsIHVzZSB0byBkZWNpZGUgd2hpY2ggZGlyZWN0aW9uIHRvIHB1c2ggaXQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3ZlcmZsb3dSaWdodCA9IE1hdGgubWF4KHN0YXJ0LnggKyBvdmVybGF5LndpZHRoIC0gdmlld3BvcnQucmlnaHQsIDApOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJmbG93Qm90dG9tID0gTWF0aC5tYXgoc3RhcnQueSArIG92ZXJsYXkuaGVpZ2h0IC0gdmlld3BvcnQuYm90dG9tLCAwKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdmVyZmxvd1RvcCA9IE1hdGgubWF4KHZpZXdwb3J0LnRvcCAtIHNjcm9sbFBvc2l0aW9uLnRvcCAtIHN0YXJ0LnksIDApOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJmbG93TGVmdCA9IE1hdGgubWF4KHZpZXdwb3J0LmxlZnQgLSBzY3JvbGxQb3NpdGlvbi5sZWZ0IC0gc3RhcnQueCwgMCk7CiAgICAgICAgICAgIC8vIEFtb3VudCBieSB3aGljaCB0byBwdXNoIHRoZSBvdmVybGF5IGluIGVhY2ggYXhpcyBzdWNoIHRoYXQgaXQgcmVtYWlucyBvbi1zY3JlZW4uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHB1c2hYID0gMDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcHVzaFkgPSAwOwogICAgICAgICAgICAvLyBJZiB0aGUgb3ZlcmxheSBmaXRzIGNvbXBsZXRlbHkgd2l0aGluIHRoZSBib3VuZHMgb2YgdGhlIHZpZXdwb3J0LCBwdXNoIGl0IGZyb20gd2hpY2hldmVyCiAgICAgICAgICAgIC8vIGRpcmVjdGlvbiBpcyBnb2VzIG9mZi1zY3JlZW4uIE90aGVyd2lzZSwgcHVzaCB0aGUgdG9wLWxlZnQgY29ybmVyIHN1Y2ggdGhhdCBpdHMgaW4gdGhlCiAgICAgICAgICAgIC8vIHZpZXdwb3J0IGFuZCBhbGxvdyBmb3IgdGhlIHRyYWlsaW5nIGVuZCBvZiB0aGUgb3ZlcmxheSB0byBnbyBvdXQgb2YgYm91bmRzLgogICAgICAgICAgICBpZiAob3ZlcmxheS53aWR0aCA8PSB2aWV3cG9ydC53aWR0aCkgewogICAgICAgICAgICAgICAgcHVzaFggPSBvdmVyZmxvd0xlZnQgfHwgLW92ZXJmbG93UmlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwdXNoWCA9IHN0YXJ0LnggPCB0aGlzLl92aWV3cG9ydE1hcmdpbiA/ICh2aWV3cG9ydC5sZWZ0IC0gc2Nyb2xsUG9zaXRpb24ubGVmdCkgLSBzdGFydC54IDogMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3ZlcmxheS5oZWlnaHQgPD0gdmlld3BvcnQuaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICBwdXNoWSA9IG92ZXJmbG93VG9wIHx8IC1vdmVyZmxvd0JvdHRvbTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHB1c2hZID0gc3RhcnQueSA8IHRoaXMuX3ZpZXdwb3J0TWFyZ2luID8gKHZpZXdwb3J0LnRvcCAtIHNjcm9sbFBvc2l0aW9uLnRvcCkgLSBzdGFydC55IDogMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wcmV2aW91c1B1c2hBbW91bnQgPSB7IHg6IHB1c2hYLCB5OiBwdXNoWSB9OwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgeDogc3RhcnQueCArIHB1c2hYLAogICAgICAgICAgICAgICAgeTogc3RhcnQueSArIHB1c2hZLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWVzIGEgY29tcHV0ZWQgcG9zaXRpb24gdG8gdGhlIG92ZXJsYXkgYW5kIGVtaXRzIGEgcG9zaXRpb24gY2hhbmdlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gcHJlZmVyZW5jZQogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9pbnQgVGhlIHBvaW50IG9uIHRoZSBvcmlnaW4gZWxlbWVudCB3aGVyZSB0aGUgb3ZlcmxheSBpcyBjb25uZWN0ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlQb3NpdGlvbihwb3NpdGlvbiwgb3JpZ2luUG9pbnQpIHsKICAgICAgICAgICAgdGhpcy5fc2V0VHJhbnNmb3JtT3JpZ2luKHBvc2l0aW9uKTsKICAgICAgICAgICAgdGhpcy5fc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMob3JpZ2luUG9pbnQsIHBvc2l0aW9uKTsKICAgICAgICAgICAgdGhpcy5fc2V0Qm91bmRpbmdCb3hTdHlsZXMob3JpZ2luUG9pbnQsIHBvc2l0aW9uKTsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uLnBhbmVsQ2xhc3MpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FkZFBhbmVsQ2xhc3Nlcyhwb3NpdGlvbi5wYW5lbENsYXNzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXN0IGNvbm5lY3RlZCBwb3NpdGlvbiBpbiBjYXNlIHRoZSBwb3NpdGlvbiBuZWVkcyB0byBiZSByZS1jYWxjdWxhdGVkLgogICAgICAgICAgICB0aGlzLl9sYXN0UG9zaXRpb24gPSBwb3NpdGlvbjsKICAgICAgICAgICAgLy8gTm90aWZ5IHRoYXQgdGhlIHBvc2l0aW9uIGhhcyBiZWVuIGNoYW5nZWQgYWxvbmcgd2l0aCBpdHMgY2hhbmdlIHByb3BlcnRpZXMuCiAgICAgICAgICAgIC8vIFdlIG9ubHkgZW1pdCBpZiB3ZSd2ZSBnb3QgYW55IHN1YnNjcmlwdGlvbnMsIGJlY2F1c2UgdGhlIHNjcm9sbCB2aXNpYmlsaXR5CiAgICAgICAgICAgIC8vIGNhbGN1bGNhdGlvbnMgY2FuIGJlIHNvbWV3aGF0IGV4cGVuc2l2ZS4KICAgICAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uQ2hhbmdlcy5vYnNlcnZlcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzY3JvbGxhYmxlVmlld1Byb3BlcnRpZXMgPSB0aGlzLl9nZXRTY3JvbGxWaXNpYmlsaXR5KCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGFuZ2VFdmVudCA9IG5ldyBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UocG9zaXRpb24sIHNjcm9sbGFibGVWaWV3UHJvcGVydGllcyk7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbkNoYW5nZXMubmV4dChjaGFuZ2VFdmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNJbml0aWFsUmVuZGVyID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHRyYW5zZm9ybSBvcmlnaW4gYmFzZWQgb24gdGhlIGNvbmZpZ3VyZWQgc2VsZWN0b3IgYW5kIHRoZSBwYXNzZWQtaW4gcG9zaXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VHJhbnNmb3JtT3JpZ2luKHBvc2l0aW9uKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3IpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2JvdW5kaW5nQm94KSkucXVlcnlTZWxlY3RvckFsbCh0aGlzLl90cmFuc2Zvcm1PcmlnaW5TZWxlY3Rvcik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHhPcmlnaW47CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHlPcmlnaW4gPSBwb3NpdGlvbi5vdmVybGF5WTsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uLm92ZXJsYXlYID09PSAnY2VudGVyJykgewogICAgICAgICAgICAgICAgeE9yaWdpbiA9ICdjZW50ZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2lzUnRsKCkpIHsKICAgICAgICAgICAgICAgIHhPcmlnaW4gPSBwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ3N0YXJ0JyA/ICdyaWdodCcgOiAnbGVmdCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB4T3JpZ2luID0gcG9zaXRpb24ub3ZlcmxheVggPT09ICdzdGFydCcgPyAnbGVmdCcgOiAncmlnaHQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGVsZW1lbnRzW2ldLnN0eWxlLnRyYW5zZm9ybU9yaWdpbiA9IGAke3hPcmlnaW59ICR7eU9yaWdpbn1gOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHBvc2l0aW9uIGFuZCBzaXplIG9mIHRoZSBvdmVybGF5J3Mgc2l6aW5nIGNvbnRhaW5lci4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm8gbWVhc3VyaW5nIGFuZCBhcHBsaWVzIG5vIHN0eWxlcyBzbyB0aGF0IHdlIGNhbiBjaGVhcGx5IGNvbXB1dGUgdGhlCiAgICAgICAgICogYm91bmRzIGZvciBhbGwgcG9zaXRpb25zIGFuZCBjaG9vc2UgdGhlIGJlc3QgZml0IGJhc2VkIG9uIHRoZXNlIHJlc3VsdHMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jYWxjdWxhdGVCb3VuZGluZ0JveFJlY3Qob3JpZ2luLCBwb3NpdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0ID0gdGhpcy5fdmlld3BvcnRSZWN0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzUnRsID0gdGhpcy5faXNSdGwoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaGVpZ2h0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0b3A7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGJvdHRvbTsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uLm92ZXJsYXlZID09PSAndG9wJykgewogICAgICAgICAgICAgICAgLy8gT3ZlcmxheSBpcyBvcGVuaW5nICJkb3dud2FyZCIgYW5kIHRodXMgaXMgYm91bmQgYnkgdGhlIGJvdHRvbSB2aWV3cG9ydCBlZGdlLgogICAgICAgICAgICAgICAgdG9wID0gb3JpZ2luLnk7CiAgICAgICAgICAgICAgICBoZWlnaHQgPSB2aWV3cG9ydC5oZWlnaHQgLSB0b3AgKyB0aGlzLl92aWV3cG9ydE1hcmdpbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5vdmVybGF5WSA9PT0gJ2JvdHRvbScpIHsKICAgICAgICAgICAgICAgIC8vIE92ZXJsYXkgaXMgb3BlbmluZyAidXB3YXJkIiBhbmQgdGh1cyBpcyBib3VuZCBieSB0aGUgdG9wIHZpZXdwb3J0IGVkZ2UuIFdlIG5lZWQgdG8gYWRkCiAgICAgICAgICAgICAgICAvLyB0aGUgdmlld3BvcnQgbWFyZ2luIGJhY2sgaW4sIGJlY2F1c2UgdGhlIHZpZXdwb3J0IHJlY3QgaXMgbmFycm93ZWQgZG93biB0byByZW1vdmUgdGhlCiAgICAgICAgICAgICAgICAvLyBtYXJnaW4sIHdoZXJlYXMgdGhlIGBvcmlnaW5gIHBvc2l0aW9uIGlzIGNhbGN1bGF0ZWQgYmFzZWQgb24gaXRzIGBDbGllbnRSZWN0YC4KICAgICAgICAgICAgICAgIGJvdHRvbSA9IHZpZXdwb3J0LmhlaWdodCAtIG9yaWdpbi55ICsgdGhpcy5fdmlld3BvcnRNYXJnaW4gKiAyOwogICAgICAgICAgICAgICAgaGVpZ2h0ID0gdmlld3BvcnQuaGVpZ2h0IC0gYm90dG9tICsgdGhpcy5fdmlld3BvcnRNYXJnaW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBJZiBuZWl0aGVyIHRvcCBub3IgYm90dG9tLCBpdCBtZWFucyB0aGF0IHRoZSBvdmVybGF5IGlzIHZlcnRpY2FsbHkgY2VudGVyZWQgb24gdGhlCiAgICAgICAgICAgICAgICAvLyBvcmlnaW4gcG9pbnQuIE5vdGUgdGhhdCB3ZSB3YW50IHRoZSBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQsIHJhdGhlciB0aGFuCiAgICAgICAgICAgICAgICAvLyB0aGUgcGFnZSwgd2hpY2ggaXMgd2h5IHdlIGRvbid0IHVzZSBzb21ldGhpbmcgbGlrZSBgdmlld3BvcnQuYm90dG9tIC0gb3JpZ2luLnlgIGFuZAogICAgICAgICAgICAgICAgLy8gYG9yaWdpbi55IC0gdmlld3BvcnQudG9wYC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNtYWxsZXN0RGlzdGFuY2VUb1ZpZXdwb3J0RWRnZSA9IE1hdGgubWluKHZpZXdwb3J0LmJvdHRvbSAtIG9yaWdpbi55ICsgdmlld3BvcnQudG9wLCBvcmlnaW4ueSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c0hlaWdodCA9IHRoaXMuX2xhc3RCb3VuZGluZ0JveFNpemUuaGVpZ2h0OwogICAgICAgICAgICAgICAgaGVpZ2h0ID0gc21hbGxlc3REaXN0YW5jZVRvVmlld3BvcnRFZGdlICogMjsKICAgICAgICAgICAgICAgIHRvcCA9IG9yaWdpbi55IC0gc21hbGxlc3REaXN0YW5jZVRvVmlld3BvcnRFZGdlOwogICAgICAgICAgICAgICAgaWYgKGhlaWdodCA+IHByZXZpb3VzSGVpZ2h0ICYmICF0aGlzLl9pc0luaXRpYWxSZW5kZXIgJiYgIXRoaXMuX2dyb3dBZnRlck9wZW4pIHsKICAgICAgICAgICAgICAgICAgICB0b3AgPSBvcmlnaW4ueSAtIChwcmV2aW91c0hlaWdodCAvIDIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBvdmVybGF5IGlzIG9wZW5pbmcgJ3JpZ2h0LXdhcmQnICh0aGUgY29udGVudCBmbG93cyB0byB0aGUgcmlnaHQpLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzQm91bmRlZEJ5UmlnaHRWaWV3cG9ydEVkZ2UgPSAocG9zaXRpb24ub3ZlcmxheVggPT09ICdzdGFydCcgJiYgIWlzUnRsKSB8fAogICAgICAgICAgICAgICAgKHBvc2l0aW9uLm92ZXJsYXlYID09PSAnZW5kJyAmJiBpc1J0bCk7CiAgICAgICAgICAgIC8vIFRoZSBvdmVybGF5IGlzIG9wZW5pbmcgJ2xlZnQtd2FyZCcgKHRoZSBjb250ZW50IGZsb3dzIHRvIHRoZSBsZWZ0KS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0JvdW5kZWRCeUxlZnRWaWV3cG9ydEVkZ2UgPSAocG9zaXRpb24ub3ZlcmxheVggPT09ICdlbmQnICYmICFpc1J0bCkgfHwKICAgICAgICAgICAgICAgIChwb3NpdGlvbi5vdmVybGF5WCA9PT0gJ3N0YXJ0JyAmJiBpc1J0bCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHdpZHRoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBsZWZ0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByaWdodDsKICAgICAgICAgICAgaWYgKGlzQm91bmRlZEJ5TGVmdFZpZXdwb3J0RWRnZSkgewogICAgICAgICAgICAgICAgcmlnaHQgPSB2aWV3cG9ydC53aWR0aCAtIG9yaWdpbi54ICsgdGhpcy5fdmlld3BvcnRNYXJnaW47CiAgICAgICAgICAgICAgICB3aWR0aCA9IG9yaWdpbi54IC0gdGhpcy5fdmlld3BvcnRNYXJnaW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNCb3VuZGVkQnlSaWdodFZpZXdwb3J0RWRnZSkgewogICAgICAgICAgICAgICAgbGVmdCA9IG9yaWdpbi54OwogICAgICAgICAgICAgICAgd2lkdGggPSB2aWV3cG9ydC5yaWdodCAtIG9yaWdpbi54OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gSWYgbmVpdGhlciBzdGFydCBub3IgZW5kLCBpdCBtZWFucyB0aGF0IHRoZSBvdmVybGF5IGlzIGhvcml6b250YWxseSBjZW50ZXJlZCBvbiB0aGUKICAgICAgICAgICAgICAgIC8vIG9yaWdpbiBwb2ludC4gTm90ZSB0aGF0IHdlIHdhbnQgdGhlIHBvc2l0aW9uIHJlbGF0aXZlIHRvIHRoZSB2aWV3cG9ydCwgcmF0aGVyIHRoYW4KICAgICAgICAgICAgICAgIC8vIHRoZSBwYWdlLCB3aGljaCBpcyB3aHkgd2UgZG9uJ3QgdXNlIHNvbWV0aGluZyBsaWtlIGB2aWV3cG9ydC5yaWdodCAtIG9yaWdpbi54YCBhbmQKICAgICAgICAgICAgICAgIC8vIGBvcmlnaW4ueCAtIHZpZXdwb3J0LmxlZnRgLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc21hbGxlc3REaXN0YW5jZVRvVmlld3BvcnRFZGdlID0gTWF0aC5taW4odmlld3BvcnQucmlnaHQgLSBvcmlnaW4ueCArIHZpZXdwb3J0LmxlZnQsIG9yaWdpbi54KTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzV2lkdGggPSB0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoOwogICAgICAgICAgICAgICAgd2lkdGggPSBzbWFsbGVzdERpc3RhbmNlVG9WaWV3cG9ydEVkZ2UgKiAyOwogICAgICAgICAgICAgICAgbGVmdCA9IG9yaWdpbi54IC0gc21hbGxlc3REaXN0YW5jZVRvVmlld3BvcnRFZGdlOwogICAgICAgICAgICAgICAgaWYgKHdpZHRoID4gcHJldmlvdXNXaWR0aCAmJiAhdGhpcy5faXNJbml0aWFsUmVuZGVyICYmICF0aGlzLl9ncm93QWZ0ZXJPcGVuKSB7CiAgICAgICAgICAgICAgICAgICAgbGVmdCA9IG9yaWdpbi54IC0gKHByZXZpb3VzV2lkdGggLyAyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyB0b3A6ICgvKiogQHR5cGUgez99ICovICh0b3ApKSwgbGVmdDogKC8qKiBAdHlwZSB7P30gKi8gKGxlZnQpKSwgYm90dG9tOiAoLyoqIEB0eXBlIHs/fSAqLyAoYm90dG9tKSksIHJpZ2h0OiAoLyoqIEB0eXBlIHs/fSAqLyAocmlnaHQpKSwgd2lkdGgsIGhlaWdodCB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBwb3NpdGlvbiBhbmQgc2l6ZSBvZiB0aGUgb3ZlcmxheSdzIHNpemluZyB3cmFwcGVyLiBUaGUgd3JhcHBlciBpcyBwb3NpdGlvbmVkIG9uIHRoZQogICAgICAgICAqIG9yaWdpbidzIGNvbm5lY3Rpb24gcG9pbnQgYW5kIHN0ZXRjaGVzIHRvIHRoZSBib3VuZHMgb2YgdGhlIHZpZXdwb3J0LgogICAgICAgICAqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbiBUaGUgcG9pbnQgb24gdGhlIG9yaWdpbiBlbGVtZW50IHdoZXJlIHRoZSBvdmVybGF5IGlzIGNvbm5lY3RlZC4KICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBwcmVmZXJlbmNlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0Qm91bmRpbmdCb3hTdHlsZXMob3JpZ2luLCBwb3NpdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJvdW5kaW5nQm94UmVjdCA9IHRoaXMuX2NhbGN1bGF0ZUJvdW5kaW5nQm94UmVjdChvcmlnaW4sIHBvc2l0aW9uKTsKICAgICAgICAgICAgLy8gSXQncyB3ZWlyZCBpZiB0aGUgb3ZlcmxheSAqZ3Jvd3MqIHdoaWxlIHNjcm9sbGluZywgc28gd2UgdGFrZSB0aGUgbGFzdCBzaXplIGludG8gYWNjb3VudAogICAgICAgICAgICAvLyB3aGVuIGFwcGx5aW5nIGEgbmV3IHNpemUuCiAgICAgICAgICAgIGlmICghdGhpcy5faXNJbml0aWFsUmVuZGVyICYmICF0aGlzLl9ncm93QWZ0ZXJPcGVuKSB7CiAgICAgICAgICAgICAgICBib3VuZGluZ0JveFJlY3QuaGVpZ2h0ID0gTWF0aC5taW4oYm91bmRpbmdCb3hSZWN0LmhlaWdodCwgdGhpcy5fbGFzdEJvdW5kaW5nQm94U2l6ZS5oZWlnaHQpOwogICAgICAgICAgICAgICAgYm91bmRpbmdCb3hSZWN0LndpZHRoID0gTWF0aC5taW4oYm91bmRpbmdCb3hSZWN0LndpZHRoLCB0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplLndpZHRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0eWxlcyA9ICgvKiogQHR5cGUgez99ICovICh7fSkpOwogICAgICAgICAgICBpZiAodGhpcy5faGFzRXhhY3RQb3NpdGlvbigpKSB7CiAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gc3R5bGVzLmxlZnQgPSAnMCc7CiAgICAgICAgICAgICAgICBzdHlsZXMuYm90dG9tID0gc3R5bGVzLnJpZ2h0ID0gc3R5bGVzLm1heEhlaWdodCA9IHN0eWxlcy5tYXhXaWR0aCA9ICcnOwogICAgICAgICAgICAgICAgc3R5bGVzLndpZHRoID0gc3R5bGVzLmhlaWdodCA9ICcxMDAlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkubWF4SGVpZ2h0OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWF4V2lkdGggPSB0aGlzLl9vdmVybGF5UmVmLmdldENvbmZpZygpLm1heFdpZHRoOwogICAgICAgICAgICAgICAgc3R5bGVzLmhlaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoYm91bmRpbmdCb3hSZWN0LmhlaWdodCk7CiAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShib3VuZGluZ0JveFJlY3QudG9wKTsKICAgICAgICAgICAgICAgIHN0eWxlcy5ib3R0b20gPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGJvdW5kaW5nQm94UmVjdC5ib3R0b20pOwogICAgICAgICAgICAgICAgc3R5bGVzLndpZHRoID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShib3VuZGluZ0JveFJlY3Qud2lkdGgpOwogICAgICAgICAgICAgICAgc3R5bGVzLmxlZnQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKGJvdW5kaW5nQm94UmVjdC5sZWZ0KTsKICAgICAgICAgICAgICAgIHN0eWxlcy5yaWdodCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoYm91bmRpbmdCb3hSZWN0LnJpZ2h0KTsKICAgICAgICAgICAgICAgIC8vIFB1c2ggdGhlIHBhbmUgY29udGVudCB0b3dhcmRzIHRoZSBwcm9wZXIgZGlyZWN0aW9uLgogICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uLm92ZXJsYXlYID09PSAnY2VudGVyJykgewogICAgICAgICAgICAgICAgICAgIHN0eWxlcy5hbGlnbkl0ZW1zID0gJ2NlbnRlcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZXMuYWxpZ25JdGVtcyA9IHBvc2l0aW9uLm92ZXJsYXlYID09PSAnZW5kJyA/ICdmbGV4LWVuZCcgOiAnZmxleC1zdGFydCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24ub3ZlcmxheVkgPT09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICAgICAgc3R5bGVzLmp1c3RpZnlDb250ZW50ID0gJ2NlbnRlcic7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZXMuanVzdGlmeUNvbnRlbnQgPSBwb3NpdGlvbi5vdmVybGF5WSA9PT0gJ2JvdHRvbScgPyAnZmxleC1lbmQnIDogJ2ZsZXgtc3RhcnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1heEhlaWdodCkgewogICAgICAgICAgICAgICAgICAgIHN0eWxlcy5tYXhIZWlnaHQgPSBjb2VyY2VDc3NQaXhlbFZhbHVlKG1heEhlaWdodCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAobWF4V2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZXMubWF4V2lkdGggPSBjb2VyY2VDc3NQaXhlbFZhbHVlKG1heFdpZHRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9sYXN0Qm91bmRpbmdCb3hTaXplID0gYm91bmRpbmdCb3hSZWN0OwogICAgICAgICAgICBleHRlbmRTdHlsZXMoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2JvdW5kaW5nQm94KSkuc3R5bGUsIHN0eWxlcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB0aGUgc3R5bGVzIGZvciB0aGUgYm91bmRpbmcgYm94IHNvIHRoYXQgYSBuZXcgcG9zaXRpb25pbmcgY2FuIGJlIGNvbXB1dGVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVzZXRCb3VuZGluZ0JveFN0eWxlcygpIHsKICAgICAgICAgICAgZXh0ZW5kU3R5bGVzKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9ib3VuZGluZ0JveCkpLnN0eWxlLCAoLyoqIEB0eXBlIHs/fSAqLyAoewogICAgICAgICAgICAgICAgdG9wOiAnMCcsCiAgICAgICAgICAgICAgICBsZWZ0OiAnMCcsCiAgICAgICAgICAgICAgICByaWdodDogJzAnLAogICAgICAgICAgICAgICAgYm90dG9tOiAnMCcsCiAgICAgICAgICAgICAgICBoZWlnaHQ6ICcnLAogICAgICAgICAgICAgICAgd2lkdGg6ICcnLAogICAgICAgICAgICAgICAgYWxpZ25JdGVtczogJycsCiAgICAgICAgICAgICAgICBqdXN0aWZ5Q29udGVudDogJycsCiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB0aGUgc3R5bGVzIGZvciB0aGUgb3ZlcmxheSBwYW5lIHNvIHRoYXQgYSBuZXcgcG9zaXRpb25pbmcgY2FuIGJlIGNvbXB1dGVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVzZXRPdmVybGF5RWxlbWVudFN0eWxlcygpIHsKICAgICAgICAgICAgZXh0ZW5kU3R5bGVzKHRoaXMuX3BhbmUuc3R5bGUsICgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgICAgICAgICB0b3A6ICcnLAogICAgICAgICAgICAgICAgbGVmdDogJycsCiAgICAgICAgICAgICAgICBib3R0b206ICcnLAogICAgICAgICAgICAgICAgcmlnaHQ6ICcnLAogICAgICAgICAgICAgICAgcG9zaXRpb246ICcnLAogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAnJywKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyBwb3NpdGlvbmluZyBzdHlsZXMgdG8gdGhlIG92ZXJsYXkgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9pbnQKICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0T3ZlcmxheUVsZW1lbnRTdHlsZXMob3JpZ2luUG9pbnQsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHt9KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGFzRXhhY3RQb3NpdGlvbiA9IHRoaXMuX2hhc0V4YWN0UG9zaXRpb24oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYXNGbGV4aWJsZURpbWVuc2lvbnMgPSB0aGlzLl9oYXNGbGV4aWJsZURpbWVuc2lvbnM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKTsKICAgICAgICAgICAgaWYgKGhhc0V4YWN0UG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICBleHRlbmRTdHlsZXMoc3R5bGVzLCB0aGlzLl9nZXRFeGFjdE92ZXJsYXlZKHBvc2l0aW9uLCBvcmlnaW5Qb2ludCwgc2Nyb2xsUG9zaXRpb24pKTsKICAgICAgICAgICAgICAgIGV4dGVuZFN0eWxlcyhzdHlsZXMsIHRoaXMuX2dldEV4YWN0T3ZlcmxheVgocG9zaXRpb24sIG9yaWdpblBvaW50LCBzY3JvbGxQb3NpdGlvbikpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3R5bGVzLnBvc2l0aW9uID0gJ3N0YXRpYyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXNlIGEgdHJhbnNmb3JtIHRvIGFwcGx5IHRoZSBvZmZzZXRzLiBXZSBkbyB0aGlzIGJlY2F1c2UgdGhlIGBjZW50ZXJgIHBvc2l0aW9ucyByZWx5IG9uCiAgICAgICAgICAgIC8vIGJlaW5nIGluIHRoZSBub3JtYWwgZmxleCBmbG93IGFuZCBzZXR0aW5nIGEgYHRvcGAgLyBgbGVmdGAgYXQgYWxsIHdpbGwgY29tcGxldGVseSB0aHJvdwogICAgICAgICAgICAvLyBvZmYgdGhlIHBvc2l0aW9uLiBXZSBhbHNvIGNhbid0IHVzZSBtYXJnaW5zLCBiZWNhdXNlIHRoZXkgd29uJ3QgaGF2ZSBhbiBlZmZlY3QgaW4gc29tZQogICAgICAgICAgICAvLyBjYXNlcyB3aGVyZSB0aGUgZWxlbWVudCBkb2Vzbid0IGhhdmUgYW55dGhpbmcgdG8gInB1c2ggb2ZmIG9mIi4gRmluYWxseSwgdGhpcyB3b3JrcwogICAgICAgICAgICAvLyBiZXR0ZXIgYm90aCB3aXRoIGZsZXhpYmxlIGFuZCBub24tZmxleGlibGUgcG9zaXRpb25pbmcuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHRyYW5zZm9ybVN0cmluZyA9ICcnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvZmZzZXRYID0gdGhpcy5fZ2V0T2Zmc2V0KHBvc2l0aW9uLCAneCcpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvZmZzZXRZID0gdGhpcy5fZ2V0T2Zmc2V0KHBvc2l0aW9uLCAneScpOwogICAgICAgICAgICBpZiAob2Zmc2V0WCkgewogICAgICAgICAgICAgICAgdHJhbnNmb3JtU3RyaW5nICs9IGB0cmFuc2xhdGVYKCR7b2Zmc2V0WH1weCkgYDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob2Zmc2V0WSkgewogICAgICAgICAgICAgICAgdHJhbnNmb3JtU3RyaW5nICs9IGB0cmFuc2xhdGVZKCR7b2Zmc2V0WX1weClgOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0eWxlcy50cmFuc2Zvcm0gPSB0cmFuc2Zvcm1TdHJpbmcudHJpbSgpOwogICAgICAgICAgICAvLyBJZiBhIG1heFdpZHRoIG9yIG1heEhlaWdodCBpcyBzcGVjaWZpZWQgb24gdGhlIG92ZXJsYXksIHdlIHJlbW92ZSB0aGVtLiBXZSBkbyB0aGlzIGJlY2F1c2UKICAgICAgICAgICAgLy8gd2UgbmVlZCB0aGVzZSB2YWx1ZXMgdG8gYm90aCBiZSBzZXQgdG8gIjEwMCUiIGZvciB0aGUgYXV0b21hdGljIGZsZXhpYmxlIHNpemluZyB0byB3b3JrLgogICAgICAgICAgICAvLyBUaGUgbWF4SGVpZ2h0IGFuZCBtYXhXaWR0aCBhcmUgc2V0IG9uIHRoZSBib3VuZGluZ0JveCBpbiBvcmRlciB0byBlbmZvcmNlIHRoZSBjb25zdHJhaW50LgogICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBkb2Vzbid0IGFwcGx5IHdoZW4gd2UgaGF2ZSBhbiBleGFjdCBwb3NpdGlvbiwgaW4gd2hpY2ggY2FzZSB3ZSBkbyB3YW50IHRvCiAgICAgICAgICAgIC8vIGFwcGx5IHRoZW0gYmVjYXVzZSB0aGV5J2xsIGJlIGNsZWFyZWQgZnJvbSB0aGUgYm91bmRpbmcgYm94LgogICAgICAgICAgICBpZiAoY29uZmlnLm1heEhlaWdodCkgewogICAgICAgICAgICAgICAgaWYgKGhhc0V4YWN0UG9zaXRpb24pIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZXMubWF4SGVpZ2h0ID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShjb25maWcubWF4SGVpZ2h0KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhc0ZsZXhpYmxlRGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIHN0eWxlcy5tYXhIZWlnaHQgPSAnJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY29uZmlnLm1heFdpZHRoKSB7CiAgICAgICAgICAgICAgICBpZiAoaGFzRXhhY3RQb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgIHN0eWxlcy5tYXhXaWR0aCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUoY29uZmlnLm1heFdpZHRoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhhc0ZsZXhpYmxlRGltZW5zaW9ucykgewogICAgICAgICAgICAgICAgICAgIHN0eWxlcy5tYXhXaWR0aCA9ICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGV4dGVuZFN0eWxlcyh0aGlzLl9wYW5lLnN0eWxlLCBzdHlsZXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBleGFjdCB0b3AvYm90dG9tIGZvciB0aGUgb3ZlcmxheSB3aGVuIG5vdCB1c2luZyBmbGV4aWJsZSBzaXppbmcgb3Igd2hlbiBwdXNoaW5nLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9pbnQKICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbFBvc2l0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0RXhhY3RPdmVybGF5WShwb3NpdGlvbiwgb3JpZ2luUG9pbnQsIHNjcm9sbFBvc2l0aW9uKSB7CiAgICAgICAgICAgIC8vIFJlc2V0IGFueSBleGlzdGluZyBzdHlsZXMuIFRoaXMgaXMgbmVjZXNzYXJ5IGluIGNhc2UgdGhlCiAgICAgICAgICAgIC8vIHByZWZlcnJlZCBwb3NpdGlvbiBoYXMgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBgYXBwbHlgLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdHlsZXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoeyB0b3A6ICcnLCBib3R0b206ICcnIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb3ZlcmxheVBvaW50ID0gdGhpcy5fZ2V0T3ZlcmxheVBvaW50KG9yaWdpblBvaW50LCB0aGlzLl9vdmVybGF5UmVjdCwgcG9zaXRpb24pOwogICAgICAgICAgICBpZiAodGhpcy5faXNQdXNoZWQpIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlQb2ludCA9IHRoaXMuX3B1c2hPdmVybGF5T25TY3JlZW4ob3ZlcmxheVBvaW50LCB0aGlzLl9vdmVybGF5UmVjdCwgc2Nyb2xsUG9zaXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZpcnR1YWxLZXlib2FyZE9mZnNldCA9IHRoaXMuX292ZXJsYXlDb250YWluZXIuZ2V0Q29udGFpbmVyRWxlbWVudCgpLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLnRvcDsKICAgICAgICAgICAgLy8gTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSB6ZXJvLCBob3dldmVyIHdoZW4gdGhlIG92ZXJsYXkgaXMgYXR0YWNoZWQgdG8gYW4gaW5wdXQgKGUuZy4gaW4gYW4KICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlKSwgbW9iaWxlIGJyb3dzZXJzIHdpbGwgc2hpZnQgZXZlcnl0aGluZyBpbiBvcmRlciB0byBwdXQgdGhlIGlucHV0IGluIHRoZSBtaWRkbGUKICAgICAgICAgICAgLy8gb2YgdGhlIHNjcmVlbiBhbmQgdG8gbWFrZSBzcGFjZSBmb3IgdGhlIHZpcnR1YWwga2V5Ym9hcmQuIFdlIG5lZWQgdG8gYWNjb3VudCBmb3IgdGhpcyBvZmZzZXQsCiAgICAgICAgICAgIC8vIG90aGVyd2lzZSBvdXIgcG9zaXRpb25pbmcgd2lsbCBiZSB0aHJvd24gb2ZmLgogICAgICAgICAgICBvdmVybGF5UG9pbnQueSAtPSB2aXJ0dWFsS2V5Ym9hcmRPZmZzZXQ7CiAgICAgICAgICAgIC8vIFdlIHdhbnQgdG8gc2V0IGVpdGhlciBgdG9wYCBvciBgYm90dG9tYCBiYXNlZCBvbiB3aGV0aGVyIHRoZSBvdmVybGF5IHdhbnRzIHRvIGFwcGVhcgogICAgICAgICAgICAvLyBhYm92ZSBvciBiZWxvdyB0aGUgb3JpZ2luIGFuZCB0aGUgZGlyZWN0aW9uIGluIHdoaWNoIHRoZSBlbGVtZW50IHdpbGwgZXhwYW5kLgogICAgICAgICAgICBpZiAocG9zaXRpb24ub3ZlcmxheVkgPT09ICdib3R0b20nKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIHVzaW5nIGBib3R0b21gLCB3ZSBhZGp1c3QgdGhlIHkgcG9zaXRpb24gc3VjaCB0aGF0IGl0IGlzIHRoZSBkaXN0YW5jZQogICAgICAgICAgICAgICAgLy8gZnJvbSB0aGUgYm90dG9tIG9mIHRoZSB2aWV3cG9ydCByYXRoZXIgdGhhbiB0aGUgdG9wLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZG9jdW1lbnRIZWlnaHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAgICAgc3R5bGVzLmJvdHRvbSA9IGAke2RvY3VtZW50SGVpZ2h0IC0gKG92ZXJsYXlQb2ludC55ICsgdGhpcy5fb3ZlcmxheVJlY3QuaGVpZ2h0KX1weGA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdHlsZXMudG9wID0gY29lcmNlQ3NzUGl4ZWxWYWx1ZShvdmVybGF5UG9pbnQueSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN0eWxlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgZXhhY3QgbGVmdC9yaWdodCBmb3IgdGhlIG92ZXJsYXkgd2hlbiBub3QgdXNpbmcgZmxleGlibGUgc2l6aW5nIG9yIHdoZW4gcHVzaGluZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpblBvaW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxQb3NpdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEV4YWN0T3ZlcmxheVgocG9zaXRpb24sIG9yaWdpblBvaW50LCBzY3JvbGxQb3NpdGlvbikgewogICAgICAgICAgICAvLyBSZXNldCBhbnkgZXhpc3Rpbmcgc3R5bGVzLiBUaGlzIGlzIG5lY2Vzc2FyeSBpbiBjYXNlIHRoZSBwcmVmZXJyZWQgcG9zaXRpb24gaGFzCiAgICAgICAgICAgIC8vIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgYGFwcGx5YC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3R5bGVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHsgbGVmdDogJycsIHJpZ2h0OiAnJyB9KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG92ZXJsYXlQb2ludCA9IHRoaXMuX2dldE92ZXJsYXlQb2ludChvcmlnaW5Qb2ludCwgdGhpcy5fb3ZlcmxheVJlY3QsIHBvc2l0aW9uKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzUHVzaGVkKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5UG9pbnQgPSB0aGlzLl9wdXNoT3ZlcmxheU9uU2NyZWVuKG92ZXJsYXlQb2ludCwgdGhpcy5fb3ZlcmxheVJlY3QsIHNjcm9sbFBvc2l0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSB3YW50IHRvIHNldCBlaXRoZXIgYGxlZnRgIG9yIGByaWdodGAgYmFzZWQgb24gd2hldGhlciB0aGUgb3ZlcmxheSB3YW50cyB0byBhcHBlYXIgImJlZm9yZSIKICAgICAgICAgICAgLy8gb3IgImFmdGVyIiB0aGUgb3JpZ2luLCB3aGljaCBkZXRlcm1pbmVzIHRoZSBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIGVsZW1lbnQgd2lsbCBleHBhbmQuCiAgICAgICAgICAgIC8vIEZvciB0aGUgaG9yaXpvbnRhbCBheGlzLCB0aGUgbWVhbmluZyBvZiAiYmVmb3JlIiBhbmQgImFmdGVyIiBjaGFuZ2UgYmFzZWQgb24gd2hldGhlciB0aGUKICAgICAgICAgICAgLy8gcGFnZSBpcyBpbiBSVEwgb3IgTFRSLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBob3Jpem9udGFsU3R5bGVQcm9wZXJ0eTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzUnRsKCkpIHsKICAgICAgICAgICAgICAgIGhvcml6b250YWxTdHlsZVByb3BlcnR5ID0gcG9zaXRpb24ub3ZlcmxheVggPT09ICdlbmQnID8gJ2xlZnQnIDogJ3JpZ2h0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGhvcml6b250YWxTdHlsZVByb3BlcnR5ID0gcG9zaXRpb24ub3ZlcmxheVggPT09ICdlbmQnID8gJ3JpZ2h0JyA6ICdsZWZ0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXaGVuIHdlJ3JlIHNldHRpbmcgYHJpZ2h0YCwgd2UgYWRqdXN0IHRoZSB4IHBvc2l0aW9uIHN1Y2ggdGhhdCBpdCBpcyB0aGUgZGlzdGFuY2UKICAgICAgICAgICAgLy8gZnJvbSB0aGUgcmlnaHQgZWRnZSBvZiB0aGUgdmlld3BvcnQgcmF0aGVyIHRoYW4gdGhlIGxlZnQgZWRnZS4KICAgICAgICAgICAgaWYgKGhvcml6b250YWxTdHlsZVByb3BlcnR5ID09PSAncmlnaHQnKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkb2N1bWVudFdpZHRoID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50LmRvY3VtZW50RWxlbWVudCkpLmNsaWVudFdpZHRoOwogICAgICAgICAgICAgICAgc3R5bGVzLnJpZ2h0ID0gYCR7ZG9jdW1lbnRXaWR0aCAtIChvdmVybGF5UG9pbnQueCArIHRoaXMuX292ZXJsYXlSZWN0LndpZHRoKX1weGA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdHlsZXMubGVmdCA9IGNvZXJjZUNzc1BpeGVsVmFsdWUob3ZlcmxheVBvaW50LngpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdHlsZXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHZpZXcgcHJvcGVydGllcyBvZiB0aGUgdHJpZ2dlciBhbmQgb3ZlcmxheSwgaW5jbHVkaW5nIHdoZXRoZXIgdGhleSBhcmUgY2xpcHBlZAogICAgICAgICAqIG9yIGNvbXBsZXRlbHkgb3V0c2lkZSB0aGUgdmlldyBvZiBhbnkgb2YgdGhlIHN0cmF0ZWd5J3Mgc2Nyb2xsYWJsZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRTY3JvbGxWaXNpYmlsaXR5KCkgewogICAgICAgICAgICAvLyBOb3RlOiBuZWVkcyBmcmVzaCByZWN0cyBzaW5jZSB0aGUgcG9zaXRpb24gY291bGQndmUgY2hhbmdlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcmlnaW5Cb3VuZHMgPSB0aGlzLl9nZXRPcmlnaW5SZWN0KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUJvdW5kcyA9IHRoaXMuX3BhbmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIC8vIFRPRE8oamVsYm91cm4pOiBpbnN0ZWFkIG9mIG5lZWRpbmcgYWxsIG9mIHRoZSBjbGllbnQgcmVjdHMgZm9yIHRoZXNlIHNjcm9sbGluZyBjb250YWluZXJzCiAgICAgICAgICAgIC8vIGV2ZXJ5IHRpbWUsIHdlIHNob3VsZCBiZSBhYmxlIHRvIHVzZSB0aGUgc2Nyb2xsVG9wIG9mIHRoZSBjb250YWluZXJzIGlmIHRoZSBzaXplIG9mIHRob3NlCiAgICAgICAgICAgIC8vIGNvbnRhaW5lcnMgaGFzbid0IGNoYW5nZWQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsQ29udGFpbmVyQm91bmRzID0gdGhpcy5fc2Nyb2xsYWJsZXMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxhYmxlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzY3JvbGxhYmxlID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBzY3JvbGxhYmxlLmdldEVsZW1lbnRSZWYoKS5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBpc09yaWdpbkNsaXBwZWQ6IGlzRWxlbWVudENsaXBwZWRCeVNjcm9sbGluZyhvcmlnaW5Cb3VuZHMsIHNjcm9sbENvbnRhaW5lckJvdW5kcyksCiAgICAgICAgICAgICAgICBpc09yaWdpbk91dHNpZGVWaWV3OiBpc0VsZW1lbnRTY3JvbGxlZE91dHNpZGVWaWV3KG9yaWdpbkJvdW5kcywgc2Nyb2xsQ29udGFpbmVyQm91bmRzKSwKICAgICAgICAgICAgICAgIGlzT3ZlcmxheUNsaXBwZWQ6IGlzRWxlbWVudENsaXBwZWRCeVNjcm9sbGluZyhvdmVybGF5Qm91bmRzLCBzY3JvbGxDb250YWluZXJCb3VuZHMpLAogICAgICAgICAgICAgICAgaXNPdmVybGF5T3V0c2lkZVZpZXc6IGlzRWxlbWVudFNjcm9sbGVkT3V0c2lkZVZpZXcob3ZlcmxheUJvdW5kcywgc2Nyb2xsQ29udGFpbmVyQm91bmRzKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3VidHJhY3RzIHRoZSBhbW91bnQgdGhhdCBhbiBlbGVtZW50IGlzIG92ZXJmbG93aW5nIG9uIGFuIGF4aXMgZnJvbSBpdHMgbGVuZ3RoLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBsZW5ndGgKICAgICAgICAgKiBAcGFyYW0gey4uLj99IG92ZXJmbG93cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N1YnRyYWN0T3ZlcmZsb3dzKGxlbmd0aCwgLi4ub3ZlcmZsb3dzKSB7CiAgICAgICAgICAgIHJldHVybiBvdmVyZmxvd3MucmVkdWNlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50VmFsdWUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjdXJyZW50T3ZlcmZsb3cKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjdXJyZW50VmFsdWUsIGN1cnJlbnRPdmVyZmxvdykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRWYWx1ZSAtIE1hdGgubWF4KGN1cnJlbnRPdmVyZmxvdywgMCk7CiAgICAgICAgICAgIH0pLCBsZW5ndGgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBOYXJyb3dzIHRoZSBnaXZlbiB2aWV3cG9ydCByZWN0IGJ5IHRoZSBjdXJyZW50IF92aWV3cG9ydE1hcmdpbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE5hcnJvd2VkVmlld3BvcnRSZWN0KCkgewogICAgICAgICAgICAvLyBXZSByZWNhbGN1bGF0ZSB0aGUgdmlld3BvcnQgcmVjdCBoZXJlIG91cnNlbHZlcywgcmF0aGVyIHRoYW4gdXNpbmcgdGhlIFZpZXdwb3J0UnVsZXIsCiAgICAgICAgICAgIC8vIGJlY2F1c2Ugd2Ugd2FudCB0byB1c2UgdGhlIGBjbGllbnRXaWR0aGAgYW5kIGBjbGllbnRIZWlnaHRgIGFzIHRoZSBiYXNlLiBUaGUgZGlmZmVyZW5jZQogICAgICAgICAgICAvLyBiZWluZyB0aGF0IHRoZSBjbGllbnQgcHJvcGVydGllcyBkb24ndCBpbmNsdWRlIHRoZSBzY3JvbGxiYXIsIGFzIG9wcG9zZWQgdG8gYGlubmVyV2lkdGhgCiAgICAgICAgICAgIC8vIGFuZCBgaW5uZXJIZWlnaHRgIHRoYXQgZG8uIFRoaXMgaXMgbmVjZXNzYXJ5LCBiZWNhdXNlIHRoZSBvdmVybGF5IGNvbnRhaW5lciB1c2VzCiAgICAgICAgICAgIC8vIDEwMCUgYHdpZHRoYCBhbmQgYGhlaWdodGAgd2hpY2ggZG9uJ3QgaW5jbHVkZSB0aGUgc2Nyb2xsYmFyIGVpdGhlci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB3aWR0aCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpKS5jbGllbnRXaWR0aDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoZWlnaHQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50KSkuY2xpZW50SGVpZ2h0OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNjcm9sbFBvc2l0aW9uID0gdGhpcy5fdmlld3BvcnRSdWxlci5nZXRWaWV3cG9ydFNjcm9sbFBvc2l0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0b3A6IHNjcm9sbFBvc2l0aW9uLnRvcCArIHRoaXMuX3ZpZXdwb3J0TWFyZ2luLAogICAgICAgICAgICAgICAgbGVmdDogc2Nyb2xsUG9zaXRpb24ubGVmdCArIHRoaXMuX3ZpZXdwb3J0TWFyZ2luLAogICAgICAgICAgICAgICAgcmlnaHQ6IHNjcm9sbFBvc2l0aW9uLmxlZnQgKyB3aWR0aCAtIHRoaXMuX3ZpZXdwb3J0TWFyZ2luLAogICAgICAgICAgICAgICAgYm90dG9tOiBzY3JvbGxQb3NpdGlvbi50b3AgKyBoZWlnaHQgLSB0aGlzLl92aWV3cG9ydE1hcmdpbiwKICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCAtICgyICogdGhpcy5fdmlld3BvcnRNYXJnaW4pLAogICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQgLSAoMiAqIHRoaXMuX3ZpZXdwb3J0TWFyZ2luKSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgd2UncmUgZGVhbGluZyB3aXRoIGFuIFJUTCBjb250ZXh0CiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1J0bCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWYuZ2V0RGlyZWN0aW9uKCkgPT09ICdydGwnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIG92ZXJsYXkgdXNlcyBleGFjdCBvciBmbGV4aWJsZSBwb3NpdGlvbmluZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhc0V4YWN0UG9zaXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5faGFzRmxleGlibGVEaW1lbnNpb25zIHx8IHRoaXMuX2lzUHVzaGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG9mZnNldCBvZiBhIHBvc2l0aW9uIGFsb25nIHRoZSB4IG9yIHkgYXhpcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IGF4aXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPZmZzZXQocG9zaXRpb24sIGF4aXMpIHsKICAgICAgICAgICAgaWYgKGF4aXMgPT09ICd4JykgewogICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgZG8gc29tZXRoaW5nIGxpa2UgYHBvc2l0aW9uWydvZmZzZXQnICsgYXhpc11gIGluCiAgICAgICAgICAgICAgICAvLyBvcmRlciB0byBhdm9pZCBicmVraW5nIG1pbmlmaWVycyB0aGF0IHJlbmFtZSBwcm9wZXJ0aWVzLgogICAgICAgICAgICAgICAgcmV0dXJuIHBvc2l0aW9uLm9mZnNldFggPT0gbnVsbCA/IHRoaXMuX29mZnNldFggOiBwb3NpdGlvbi5vZmZzZXRYOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbi5vZmZzZXRZID09IG51bGwgPyB0aGlzLl9vZmZzZXRZIDogcG9zaXRpb24ub2Zmc2V0WTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVmFsaWRhdGVzIHRoYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24gbWF0Y2ggdGhlIGV4cGVjdGVkIHZhbHVlcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlUG9zaXRpb25zKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKCdGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3k6IEF0IGxlYXN0IG9uZSBwb3NpdGlvbiBpcyByZXF1aXJlZC4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUT0RPKGNyaXNiZXRvKTogcmVtb3ZlIHRoZXNlIG9uY2UgQW5ndWxhcidzIHRlbXBsYXRlIHR5cGUKICAgICAgICAgICAgLy8gY2hlY2tpbmcgaXMgYWR2YW5jZWQgZW5vdWdoIHRvIGNhdGNoIHRoZXNlIGNhc2VzLgogICAgICAgICAgICB0aGlzLl9wcmVmZXJyZWRQb3NpdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGFpcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGFpciA9PiB7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZUhvcml6b250YWxQb3NpdGlvbignb3JpZ2luWCcsIHBhaXIub3JpZ2luWCk7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24oJ29yaWdpblknLCBwYWlyLm9yaWdpblkpOwogICAgICAgICAgICAgICAgdmFsaWRhdGVIb3Jpem9udGFsUG9zaXRpb24oJ292ZXJsYXlYJywgcGFpci5vdmVybGF5WCk7CiAgICAgICAgICAgICAgICB2YWxpZGF0ZVZlcnRpY2FsUG9zaXRpb24oJ292ZXJsYXlZJywgcGFpci5vdmVybGF5WSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIHNpbmdsZSBDU1MgY2xhc3Mgb3IgYW4gYXJyYXkgb2YgY2xhc3NlcyBvbiB0aGUgb3ZlcmxheSBwYW5lbC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY3NzQ2xhc3NlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FkZFBhbmVsQ2xhc3Nlcyhjc3NDbGFzc2VzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wYW5lKSB7CiAgICAgICAgICAgICAgICBjb2VyY2VBcnJheShjc3NDbGFzc2VzKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3NzQ2xhc3MKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNzc0NsYXNzID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY3NzQ2xhc3MgIT09ICcnICYmIHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMuaW5kZXhPZihjc3NDbGFzcykgPT09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FwcGxpZWRQYW5lbENsYXNzZXMucHVzaChjc3NDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhbmUuY2xhc3NMaXN0LmFkZChjc3NDbGFzcyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFycyB0aGUgY2xhc3NlcyB0aGF0IHRoZSBwb3NpdGlvbiBzdHJhdGVneSBoYXMgYXBwbGllZCBmcm9tIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2xlYXJQYW5lbENsYXNzZXMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wYW5lKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjc3NDbGFzcwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY3NzQ2xhc3MgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhbmUuY2xhc3NMaXN0LnJlbW92ZShjc3NDbGFzcyk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBsaWVkUGFuZWxDbGFzc2VzID0gW107CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgQ2xpZW50UmVjdCBvZiB0aGUgY3VycmVudCBvcmlnaW4uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPcmlnaW5SZWN0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9yaWdpbiA9IHRoaXMuX29yaWdpbjsKICAgICAgICAgICAgaWYgKG9yaWdpbiBpbnN0YW5jZW9mIEVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW4ubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDaGVjayBmb3IgRWxlbWVudCBzbyBTVkcgZWxlbWVudHMgYXJlIGFsc28gc3VwcG9ydGVkLgogICAgICAgICAgICBpZiAob3JpZ2luIGluc3RhbmNlb2YgRWxlbWVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdpZHRoID0gb3JpZ2luLndpZHRoIHx8IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGVpZ2h0ID0gb3JpZ2luLmhlaWdodCB8fCAwOwogICAgICAgICAgICAvLyBJZiB0aGUgb3JpZ2luIGlzIGEgcG9pbnQsIHJldHVybiBhIGNsaWVudCByZWN0IGFzIGlmIGl0IHdhcyBhIDB4MCBlbGVtZW50IGF0IHRoZSBwb2ludC4KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHRvcDogb3JpZ2luLnksCiAgICAgICAgICAgICAgICBib3R0b206IG9yaWdpbi55ICsgaGVpZ2h0LAogICAgICAgICAgICAgICAgbGVmdDogb3JpZ2luLngsCiAgICAgICAgICAgICAgICByaWdodDogb3JpZ2luLnggKyB3aWR0aCwKICAgICAgICAgICAgICAgIGhlaWdodCwKICAgICAgICAgICAgICAgIHdpZHRoCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBTaGFsbG93LWV4dGVuZHMgYSBzdHlsZXNoZWV0IG9iamVjdCB3aXRoIGFub3RoZXIgc3R5bGVzaGVldCBvYmplY3QuCiAgICAgKiBAcGFyYW0gez99IGRlc3RpbmF0aW9uCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZXh0ZW5kU3R5bGVzKGRlc3RpbmF0aW9uLCBzb3VyY2UpIHsKICAgICAgICBmb3IgKGxldCBrZXkgaW4gc291cmNlKSB7CiAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBkZXN0aW5hdGlvbjsKICAgIH0KICAgIC8qKgogICAgICogRXh0cmFjdHMgdGhlIHBpeGVsIHZhbHVlIGFzIGEgbnVtYmVyIGZyb20gYSB2YWx1ZSwgaWYgaXQncyBhIG51bWJlcgogICAgICogb3IgYSBDU1MgcGl4ZWwgc3RyaW5nIChlLmcuIGAxMzM3cHhgKS4gT3RoZXJ3aXNlIHJldHVybnMgbnVsbC4KICAgICAqIEBwYXJhbSB7P30gaW5wdXQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFBpeGVsVmFsdWUoaW5wdXQpIHsKICAgICAgICBpZiAodHlwZW9mIGlucHV0ICE9PSAnbnVtYmVyJyAmJiBpbnB1dCAhPSBudWxsKSB7CiAgICAgICAgICAgIGNvbnN0IFt2YWx1ZSwgdW5pdHNdID0gaW5wdXQuc3BsaXQoY3NzVW5pdFBhdHRlcm4pOwogICAgICAgICAgICByZXR1cm4gKCF1bml0cyB8fCB1bml0cyA9PT0gJ3B4JykgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpbnB1dCB8fCBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Bvc2l0aW9uL2Nvbm5lY3RlZC1wb3NpdGlvbi1zdHJhdGVneS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEEgc3RyYXRlZ3kgZm9yIHBvc2l0aW9uaW5nIG92ZXJsYXlzLiBVc2luZyB0aGlzIHN0cmF0ZWd5LCBhbiBvdmVybGF5IGlzIGdpdmVuIGFuCiAgICAgKiBpbXBsaWNpdCBwb3NpdGlvbiByZWxhdGl2ZSB0byBzb21lIG9yaWdpbiBlbGVtZW50LiBUaGUgcmVsYXRpdmUgcG9zaXRpb24gaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZgogICAgICogYSBwb2ludCBvbiB0aGUgb3JpZ2luIGVsZW1lbnQgdGhhdCBpcyBjb25uZWN0ZWQgdG8gYSBwb2ludCBvbiB0aGUgb3ZlcmxheSBlbGVtZW50LiBGb3IgZXhhbXBsZSwKICAgICAqIGEgYmFzaWMgZHJvcGRvd24gaXMgY29ubmVjdGluZyB0aGUgYm90dG9tLWxlZnQgY29ybmVyIG9mIHRoZSBvcmlnaW4gdG8gdGhlIHRvcC1sZWZ0IGNvcm5lcgogICAgICogb2YgdGhlIG92ZXJsYXkuCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneWAgaW5zdGVhZC4KICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAgICAgKi8KICAgIGNsYXNzIENvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3kgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9zCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5UG9zCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25uZWN0ZWRUbwogICAgICAgICAqIEBwYXJhbSB7P30gdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7P30gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5Q29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iob3JpZ2luUG9zLCBvdmVybGF5UG9zLCBjb25uZWN0ZWRUbywgdmlld3BvcnRSdWxlciwgZG9jdW1lbnQsIHBsYXRmb3JtLCBvdmVybGF5Q29udGFpbmVyKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBPcmRlcmVkIGxpc3Qgb2YgcHJlZmVycmVkIHBvc2l0aW9ucywgZnJvbSBtb3N0IHRvIGxlYXN0IGRlc2lyYWJsZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3ByZWZlcnJlZFBvc2l0aW9ucyA9IFtdOwogICAgICAgICAgICAvLyBTaW5jZSB0aGUgYENvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3lgIGlzIGRlcHJlY2F0ZWQgYW5kIHdlIGRvbid0IHdhbnQgdG8gbWFpbnRhaW4KICAgICAgICAgICAgLy8gdGhlIGV4dHJhIGxvZ2ljLCB3ZSBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgdGhlIHBvc2l0aW9uaW5nIHN0cmF0ZWd5IHRoYXQgaGFzIHNvbWUKICAgICAgICAgICAgLy8gZGVmYXVsdHMgdGhhdCBtYWtlIGl0IGJlaGF2ZSBhcyB0aGUgb2xkIHBvc2l0aW9uIHN0cmF0ZWd5IGFuZCB0byB3aGljaCB3ZSdsbAogICAgICAgICAgICAvLyBwcm94eSBhbGwgb2YgdGhlIEFQSSBjYWxscy4KICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneSA9IG5ldyBGbGV4aWJsZUNvbm5lY3RlZFBvc2l0aW9uU3RyYXRlZ3koY29ubmVjdGVkVG8sIHZpZXdwb3J0UnVsZXIsIGRvY3VtZW50LCBwbGF0Zm9ybSwgb3ZlcmxheUNvbnRhaW5lcikKICAgICAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKQogICAgICAgICAgICAgICAgLndpdGhQdXNoKGZhbHNlKQogICAgICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbigwKTsKICAgICAgICAgICAgdGhpcy53aXRoRmFsbGJhY2tQb3NpdGlvbihvcmlnaW5Qb3MsIG92ZXJsYXlQb3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSB3ZSdyZSBkZWFsaW5nIHdpdGggYW4gUlRMIGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfaXNSdGwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmLmdldERpcmVjdGlvbigpID09PSAncnRsJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgYW4gZXZlbnQgd2hlbiB0aGUgY29ubmVjdGlvbiBwb2ludCBjaGFuZ2VzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG9uUG9zaXRpb25DaGFuZ2UoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogT3JkZXJlZCBsaXN0IG9mIHByZWZlcnJlZCBwb3NpdGlvbnMsIGZyb20gbW9zdCB0byBsZWFzdCBkZXNpcmFibGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcG9zaXRpb25zKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcHJlZmVycmVkUG9zaXRpb25zOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2ggdGhpcyBwb3NpdGlvbiBzdHJhdGVneSB0byBhbiBvdmVybGF5LgogICAgICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVJlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoKG92ZXJsYXlSZWYpIHsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG92ZXJsYXlSZWY7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuYXR0YWNoKG92ZXJsYXlSZWYpOwogICAgICAgICAgICBpZiAodGhpcy5fZGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLnNldERpcmVjdGlvbih0aGlzLl9kaXJlY3Rpb24pOwogICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNwb3NlcyBhbGwgcmVzb3VyY2VzIHVzZWQgYnkgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzcG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5kaXNwb3NlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXRhY2goKSB7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuZGV0YWNoKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5IGVsZW1lbnQsIHVzaW5nIHdoaWNoZXZlciBwcmVmZXJyZWQgcG9zaXRpb24gcmVsYXRpdmUKICAgICAgICAgKiB0byB0aGUgb3JpZ2luIGZpdHMgb24tc2NyZWVuLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhcHBseSgpIHsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25TdHJhdGVneS5hcHBseSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZS1wb3NpdGlvbnMgdGhlIG92ZXJsYXkgZWxlbWVudCB3aXRoIHRoZSB0cmlnZ2VyIGluIGl0cyBsYXN0IGNhbGN1bGF0ZWQgcG9zaXRpb24sCiAgICAgICAgICogZXZlbiBpZiBhIHBvc2l0aW9uIGhpZ2hlciBpbiB0aGUgInByZWZlcnJlZCBwb3NpdGlvbnMiIGxpc3Qgd291bGQgbm93IGZpdC4gVGhpcwogICAgICAgICAqIGFsbG93cyBvbmUgdG8gcmUtYWxpZ24gdGhlIHBhbmVsIHdpdGhvdXQgY2hhbmdpbmcgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBwYW5lbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlY2FsY3VsYXRlTGFzdFBvc2l0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnJlYXBwbHlMYXN0UG9zaXRpb24oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgbGlzdCBvZiBTY3JvbGxhYmxlIGNvbnRhaW5lcnMgdGhhdCBob3N0IHRoZSBvcmlnaW4gZWxlbWVudCBzbyB0aGF0CiAgICAgICAgICogb24gcmVwb3NpdGlvbiB3ZSBjYW4gZXZhbHVhdGUgaWYgaXQgb3IgdGhlIG92ZXJsYXkgaGFzIGJlZW4gY2xpcHBlZCBvciBvdXRzaWRlIHZpZXcuIEV2ZXJ5CiAgICAgICAgICogU2Nyb2xsYWJsZSBtdXN0IGJlIGFuIGFuY2VzdG9yIGVsZW1lbnQgb2YgdGhlIHN0cmF0ZWd5J3Mgb3JpZ2luIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxhYmxlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVzKSB7CiAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aFNjcm9sbGFibGVDb250YWluZXJzKHNjcm9sbGFibGVzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIG5ldyBwcmVmZXJyZWQgZmFsbGJhY2sgcG9zaXRpb24uCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpblBvcwogICAgICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheVBvcwogICAgICAgICAqIEBwYXJhbSB7Pz19IG9mZnNldFgKICAgICAgICAgKiBAcGFyYW0gez89fSBvZmZzZXRZCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoRmFsbGJhY2tQb3NpdGlvbihvcmlnaW5Qb3MsIG92ZXJsYXlQb3MsIG9mZnNldFgsIG9mZnNldFkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IG5ldyBDb25uZWN0aW9uUG9zaXRpb25QYWlyKG9yaWdpblBvcywgb3ZlcmxheVBvcywgb2Zmc2V0WCwgb2Zmc2V0WSk7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZWZlcnJlZFBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uKTsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcG9zaXRpb25TdHJhdGVneS53aXRoUG9zaXRpb25zKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZWZlcnJlZFBvc2l0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBsYXlvdXQgZGlyZWN0aW9uIHNvIHRoZSBvdmVybGF5J3MgcG9zaXRpb24gY2FuIGJlIGFkanVzdGVkIHRvIG1hdGNoLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgTmV3IGxheW91dCBkaXJlY3Rpb24uCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoRGlyZWN0aW9uKGRpcikgewogICAgICAgICAgICAvLyBTaW5jZSB0aGUgZGlyZWN0aW9uIG1pZ2h0IGJlIGRlY2xhcmVkIGJlZm9yZSB0aGUgc3RyYXRlZ3kgaXMgYXR0YWNoZWQsCiAgICAgICAgICAgIC8vIHdlIHNhdmUgdGhlIHZhbHVlIGluIGEgdGVtcG9yYXJ5IHByb3BlcnR5IGFuZCB3ZSdsbCB0cmFuc2ZlciBpdCB0byB0aGUKICAgICAgICAgICAgLy8gb3ZlcmxheSByZWYgb24gYXR0YWNobWVudC4KICAgICAgICAgICAgaWYgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYuc2V0RGlyZWN0aW9uKGRpcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9kaXJlY3Rpb24gPSBkaXI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYW4gb2Zmc2V0IGZvciB0aGUgb3ZlcmxheSdzIGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIHgtYXhpcwogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXQgTmV3IG9mZnNldCBpbiB0aGUgWCBheGlzLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgd2l0aE9mZnNldFgob2Zmc2V0KSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3Bvc2l0aW9uU3RyYXRlZ3kud2l0aERlZmF1bHRPZmZzZXRYKG9mZnNldCk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGFuIG9mZnNldCBmb3IgdGhlIG92ZXJsYXkncyBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSB5LWF4aXMKICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gb2Zmc2V0IE5ldyBvZmZzZXQgaW4gdGhlIFkgYXhpcy4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhPZmZzZXRZKG9mZnNldCkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhEZWZhdWx0T2Zmc2V0WShvZmZzZXQpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBvdmVybGF5J3MgcG9zaXRpb24gc2hvdWxkIGJlIGxvY2tlZCBpbiBhZnRlciBpdCBpcyBwb3NpdGlvbmVkCiAgICAgICAgICogaW5pdGlhbGx5LiBXaGVuIGFuIG92ZXJsYXkgaXMgbG9ja2VkIGluLCBpdCB3b24ndCBhdHRlbXB0IHRvIHJlcG9zaXRpb24gaXRzZWxmCiAgICAgICAgICogd2hlbiB0aGUgcG9zaXRpb24gaXMgcmUtYXBwbGllZCAoZS5nLiB3aGVuIHRoZSB1c2VyIHNjcm9sbHMgYXdheSkuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IGlzTG9ja2VkIFdoZXRoZXIgdGhlIG92ZXJsYXkgc2hvdWxkIGxvY2tlZCBpbi4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpdGhMb2NrZWRQb3NpdGlvbihpc0xvY2tlZCkgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wb3NpdGlvblN0cmF0ZWd5LndpdGhMb2NrZWRQb3NpdGlvbihpc0xvY2tlZCk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBPdmVyd3JpdGVzIHRoZSBjdXJyZW50IHNldCBvZiBwb3NpdGlvbnMgd2l0aCBhbiBhcnJheSBvZiBuZXcgb25lcy4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb25zIFBvc2l0aW9uIHBhaXJzIHRvIGJlIHNldCBvbiB0aGUgc3RyYXRlZ3kuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB3aXRoUG9zaXRpb25zKHBvc2l0aW9ucykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9wcmVmZXJyZWRQb3NpdGlvbnMgPSBwb3NpdGlvbnMuc2xpY2UoKTsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcG9zaXRpb25TdHJhdGVneS53aXRoUG9zaXRpb25zKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3ByZWZlcnJlZFBvc2l0aW9ucyk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBvcmlnaW4gZWxlbWVudCwgcmVsYXRpdmUgdG8gd2hpY2ggdG8gcG9zaXRpb24gdGhlIG92ZXJsYXkuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbiBSZWZlcmVuY2UgdG8gdGhlIG5ldyBvcmlnaW4gZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHNldE9yaWdpbihvcmlnaW4pIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcG9zaXRpb25TdHJhdGVneS5zZXRPcmlnaW4ob3JpZ2luKTsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L3Bvc2l0aW9uL2dsb2JhbC1wb3NpdGlvbi1zdHJhdGVneS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogQ2xhc3MgdG8gYmUgYWRkZWQgdG8gdGhlIG92ZXJsYXkgcGFuZSB3cmFwcGVyLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHdyYXBwZXJDbGFzcyA9ICdjZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcic7CiAgICAvKioKICAgICAqIEEgc3RyYXRlZ3kgZm9yIHBvc2l0aW9uaW5nIG92ZXJsYXlzLiBVc2luZyB0aGlzIHN0cmF0ZWd5LCBhbiBvdmVybGF5IGlzIGdpdmVuIGFuCiAgICAgKiBleHBsaWNpdCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYnJvd3NlcidzIHZpZXdwb3J0LiBXZSB1c2UgZmxleGJveCwgaW5zdGVhZCBvZgogICAgICogdHJhbnNmb3JtcywgaW4gb3JkZXIgdG8gYXZvaWQgaXNzdWVzIHdpdGggc3VicGl4ZWwgcmVuZGVyaW5nIHdoaWNoIGNhbiBjYXVzZSB0aGUKICAgICAqIGVsZW1lbnQgdG8gYmVjb21lIGJsdXJyeS4KICAgICAqLwogICAgY2xhc3MgR2xvYmFsUG9zaXRpb25TdHJhdGVneSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX2Nzc1Bvc2l0aW9uID0gJ3N0YXRpYyc7CiAgICAgICAgICAgIHRoaXMuX3RvcE9mZnNldCA9ICcnOwogICAgICAgICAgICB0aGlzLl9ib3R0b21PZmZzZXQgPSAnJzsKICAgICAgICAgICAgdGhpcy5fbGVmdE9mZnNldCA9ICcnOwogICAgICAgICAgICB0aGlzLl9yaWdodE9mZnNldCA9ICcnOwogICAgICAgICAgICB0aGlzLl9hbGlnbkl0ZW1zID0gJyc7CiAgICAgICAgICAgIHRoaXMuX2p1c3RpZnlDb250ZW50ID0gJyc7CiAgICAgICAgICAgIHRoaXMuX3dpZHRoID0gJyc7CiAgICAgICAgICAgIHRoaXMuX2hlaWdodCA9ICcnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG92ZXJsYXlSZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaChvdmVybGF5UmVmKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29uZmlnID0gb3ZlcmxheVJlZi5nZXRDb25maWcoKTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG92ZXJsYXlSZWY7CiAgICAgICAgICAgIGlmICh0aGlzLl93aWR0aCAmJiAhY29uZmlnLndpZHRoKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoeyB3aWR0aDogdGhpcy5fd2lkdGggfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2hlaWdodCAmJiAhY29uZmlnLmhlaWdodCkgewogICAgICAgICAgICAgICAgb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgaGVpZ2h0OiB0aGlzLl9oZWlnaHQgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgb3ZlcmxheVJlZi5ob3N0RWxlbWVudC5jbGFzc0xpc3QuYWRkKHdyYXBwZXJDbGFzcyk7CiAgICAgICAgICAgIHRoaXMuX2lzRGlzcG9zZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdG9wIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5LiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IHZlcnRpY2FsIHBvc2l0aW9uLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/PX0gdmFsdWUgTmV3IHRvcCBvZmZzZXQuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB0b3AodmFsdWUgPSAnJykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9ib3R0b21PZmZzZXQgPSAnJzsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fdG9wT2Zmc2V0ID0gdmFsdWU7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FsaWduSXRlbXMgPSAnZmxleC1zdGFydCc7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBsZWZ0IHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5LiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBOZXcgbGVmdCBvZmZzZXQuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBsZWZ0KHZhbHVlID0gJycpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fcmlnaHRPZmZzZXQgPSAnJzsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fbGVmdE9mZnNldCA9IHZhbHVlOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9qdXN0aWZ5Q29udGVudCA9ICdmbGV4LXN0YXJ0JzsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGJvdHRvbSBwb3NpdGlvbiBvZiB0aGUgb3ZlcmxheS4gQ2xlYXJzIGFueSBwcmV2aW91c2x5IHNldCB2ZXJ0aWNhbCBwb3NpdGlvbi4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIE5ldyBib3R0b20gb2Zmc2V0LgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgYm90dG9tKHZhbHVlID0gJycpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fdG9wT2Zmc2V0ID0gJyc7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2JvdHRvbU9mZnNldCA9IHZhbHVlOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9hbGlnbkl0ZW1zID0gJ2ZsZXgtZW5kJzsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHJpZ2h0IHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5LiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBOZXcgcmlnaHQgb2Zmc2V0LgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgcmlnaHQodmFsdWUgPSAnJykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9sZWZ0T2Zmc2V0ID0gJyc7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3JpZ2h0T2Zmc2V0ID0gdmFsdWU7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2p1c3RpZnlDb250ZW50ID0gJ2ZsZXgtZW5kJzsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG92ZXJsYXkgd2lkdGggYW5kIGNsZWFycyBhbnkgcHJldmlvdXNseSBzZXQgd2lkdGguCiAgICAgICAgICogQGRlcHJlY2F0ZWQgUGFzcyB0aGUgYHdpZHRoYCB0aHJvdWdoIHRoZSBgT3ZlcmxheUNvbmZpZ2AuCiAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIE5ldyB3aWR0aCBmb3IgdGhlIG92ZXJsYXkKICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHdpZHRoKHZhbHVlID0gJycpIHsKICAgICAgICAgICAgaWYgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYudXBkYXRlU2l6ZSh7IHdpZHRoOiB2YWx1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX3dpZHRoID0gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG92ZXJsYXkgaGVpZ2h0IGFuZCBjbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IGhlaWdodC4KICAgICAgICAgKiBAZGVwcmVjYXRlZCBQYXNzIHRoZSBgaGVpZ2h0YCB0aHJvdWdoIHRoZSBgT3ZlcmxheUNvbmZpZ2AuCiAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIE5ldyBoZWlnaHQgZm9yIHRoZSBvdmVybGF5CiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBoZWlnaHQodmFsdWUgPSAnJykgewogICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgaGVpZ2h0OiB2YWx1ZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2hlaWdodCA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDZW50ZXJzIHRoZSBvdmVybGF5IGhvcml6b250YWxseSB3aXRoIGFuIG9wdGlvbmFsIG9mZnNldC4KICAgICAgICAgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IG9mZnNldCBPdmVybGF5IG9mZnNldCBmcm9tIHRoZSBob3Jpem9udGFsIGNlbnRlci4KICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIGNlbnRlckhvcml6b250YWxseShvZmZzZXQgPSAnJykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLmxlZnQob2Zmc2V0KTsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fanVzdGlmeUNvbnRlbnQgPSAnY2VudGVyJzsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENlbnRlcnMgdGhlIG92ZXJsYXkgdmVydGljYWxseSB3aXRoIGFuIG9wdGlvbmFsIG9mZnNldC4KICAgICAgICAgKiBDbGVhcnMgYW55IHByZXZpb3VzbHkgc2V0IHZlcnRpY2FsIHBvc2l0aW9uLgogICAgICAgICAqCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez89fSBvZmZzZXQgT3ZlcmxheSBvZmZzZXQgZnJvbSB0aGUgdmVydGljYWwgY2VudGVyLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgY2VudGVyVmVydGljYWxseShvZmZzZXQgPSAnJykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLnRvcChvZmZzZXQpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9hbGlnbkl0ZW1zID0gJ2NlbnRlcic7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBseSB0aGUgcG9zaXRpb24gdG8gdGhlIGVsZW1lbnQuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGx5KCkgewogICAgICAgICAgICAvLyBTaW5jZSB0aGUgb3ZlcmxheSByZWYgYXBwbGllcyB0aGUgc3RyYXRlZ3kgYXN5bmNocm9ub3VzbHksIGl0IGNvdWxkCiAgICAgICAgICAgIC8vIGhhdmUgYmVlbiBkaXNwb3NlZCBiZWZvcmUgaXQgZW5kcyB1cCBiZWluZyBhcHBsaWVkLiBJZiB0aGF0IGlzIHRoZQogICAgICAgICAgICAvLyBjYXNlLCB3ZSBzaG91bGRuJ3QgZG8gYW55dGhpbmcuCiAgICAgICAgICAgIGlmICghdGhpcy5fb3ZlcmxheVJlZiB8fCAhdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLl9vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudFN0eWxlcyA9IHRoaXMuX292ZXJsYXlSZWYuaG9zdEVsZW1lbnQuc3R5bGU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29uZmlnID0gdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKTsKICAgICAgICAgICAgY29uc3QgeyB3aWR0aCwgaGVpZ2h0LCBtYXhXaWR0aCwgbWF4SGVpZ2h0IH0gPSBjb25maWc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2hvdWxkQmVGbHVzaEhvcml6b250YWxseSA9ICh3aWR0aCA9PT0gJzEwMCUnIHx8IHdpZHRoID09PSAnMTAwdncnKSAmJgogICAgICAgICAgICAgICAgKCFtYXhXaWR0aCB8fCBtYXhXaWR0aCA9PT0gJzEwMCUnIHx8IG1heFdpZHRoID09PSAnMTAwdncnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzaG91bGRCZUZsdXNoVmVydGljYWxseSA9IChoZWlnaHQgPT09ICcxMDAlJyB8fCBoZWlnaHQgPT09ICcxMDB2aCcpICYmCiAgICAgICAgICAgICAgICAoIW1heEhlaWdodCB8fCBtYXhIZWlnaHQgPT09ICcxMDAlJyB8fCBtYXhIZWlnaHQgPT09ICcxMDB2aCcpOwogICAgICAgICAgICBzdHlsZXMucG9zaXRpb24gPSB0aGlzLl9jc3NQb3NpdGlvbjsKICAgICAgICAgICAgc3R5bGVzLm1hcmdpbkxlZnQgPSBzaG91bGRCZUZsdXNoSG9yaXpvbnRhbGx5ID8gJzAnIDogdGhpcy5fbGVmdE9mZnNldDsKICAgICAgICAgICAgc3R5bGVzLm1hcmdpblRvcCA9IHNob3VsZEJlRmx1c2hWZXJ0aWNhbGx5ID8gJzAnIDogdGhpcy5fdG9wT2Zmc2V0OwogICAgICAgICAgICBzdHlsZXMubWFyZ2luQm90dG9tID0gdGhpcy5fYm90dG9tT2Zmc2V0OwogICAgICAgICAgICBzdHlsZXMubWFyZ2luUmlnaHQgPSB0aGlzLl9yaWdodE9mZnNldDsKICAgICAgICAgICAgaWYgKHNob3VsZEJlRmx1c2hIb3Jpem9udGFsbHkpIHsKICAgICAgICAgICAgICAgIHBhcmVudFN0eWxlcy5qdXN0aWZ5Q29udGVudCA9ICdmbGV4LXN0YXJ0JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9qdXN0aWZ5Q29udGVudCA9PT0gJ2NlbnRlcicpIHsKICAgICAgICAgICAgICAgIHBhcmVudFN0eWxlcy5qdXN0aWZ5Q29udGVudCA9ICdjZW50ZXInOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX292ZXJsYXlSZWYuZ2V0Q29uZmlnKCkuZGlyZWN0aW9uID09PSAncnRsJykgewogICAgICAgICAgICAgICAgLy8gSW4gUlRMIHRoZSBicm93c2VyIHdpbGwgaW52ZXJ0IGBmbGV4LXN0YXJ0YCBhbmQgYGZsZXgtZW5kYCBhdXRvbWF0aWNhbGx5LCBidXQgd2UKICAgICAgICAgICAgICAgIC8vIGRvbid0IHdhbnQgdGhhdCBiZWNhdXNlIG91ciBwb3NpdGlvbmluZyBpcyBleHBsaWNpdGx5IGBsZWZ0YCBhbmQgYHJpZ2h0YCwgaGVuY2UKICAgICAgICAgICAgICAgIC8vIHdoeSB3ZSBkbyBhbm90aGVyIGludmVyc2lvbiB0byBlbnN1cmUgdGhhdCB0aGUgb3ZlcmxheSBzdGF5cyBpbiB0aGUgc2FtZSBwb3NpdGlvbi4KICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlY29uc2lkZXIgdGhpcyBpZiB3ZSBhZGQgYHN0YXJ0YCBhbmQgYGVuZGAgbWV0aG9kcy4KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9qdXN0aWZ5Q29udGVudCA9PT0gJ2ZsZXgtc3RhcnQnKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50U3R5bGVzLmp1c3RpZnlDb250ZW50ID0gJ2ZsZXgtZW5kJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2p1c3RpZnlDb250ZW50ID09PSAnZmxleC1lbmQnKSB7CiAgICAgICAgICAgICAgICAgICAgcGFyZW50U3R5bGVzLmp1c3RpZnlDb250ZW50ID0gJ2ZsZXgtc3RhcnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcGFyZW50U3R5bGVzLmp1c3RpZnlDb250ZW50ID0gdGhpcy5fanVzdGlmeUNvbnRlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcGFyZW50U3R5bGVzLmFsaWduSXRlbXMgPSBzaG91bGRCZUZsdXNoVmVydGljYWxseSA/ICdmbGV4LXN0YXJ0JyA6IHRoaXMuX2FsaWduSXRlbXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsZWFucyB1cCB0aGUgRE9NIGNoYW5nZXMgZnJvbSB0aGUgcG9zaXRpb24gc3RyYXRlZ3kuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpc3Bvc2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0Rpc3Bvc2VkIHx8ICF0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZXMgPSB0aGlzLl9vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LnN0eWxlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMuX292ZXJsYXlSZWYuaG9zdEVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50U3R5bGVzID0gcGFyZW50LnN0eWxlOwogICAgICAgICAgICBwYXJlbnQuY2xhc3NMaXN0LnJlbW92ZSh3cmFwcGVyQ2xhc3MpOwogICAgICAgICAgICBwYXJlbnRTdHlsZXMuanVzdGlmeUNvbnRlbnQgPSBwYXJlbnRTdHlsZXMuYWxpZ25JdGVtcyA9IHN0eWxlcy5tYXJnaW5Ub3AgPQogICAgICAgICAgICAgICAgc3R5bGVzLm1hcmdpbkJvdHRvbSA9IHN0eWxlcy5tYXJnaW5MZWZ0ID0gc3R5bGVzLm1hcmdpblJpZ2h0ID0gc3R5bGVzLnBvc2l0aW9uID0gJyc7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAobnVsbCkpOwogICAgICAgICAgICB0aGlzLl9pc0Rpc3Bvc2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvcG9zaXRpb24vb3ZlcmxheS1wb3NpdGlvbi1idWlsZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQnVpbGRlciBmb3Igb3ZlcmxheSBwb3NpdGlvbiBzdHJhdGVneS4KICAgICAqLwogICAgY2xhc3MgT3ZlcmxheVBvc2l0aW9uQnVpbGRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld3BvcnRSdWxlcgogICAgICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IF9vdmVybGF5Q29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZpZXdwb3J0UnVsZXIsIF9kb2N1bWVudCwgX3BsYXRmb3JtLCBfb3ZlcmxheUNvbnRhaW5lcikgewogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyID0gX3ZpZXdwb3J0UnVsZXI7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUNvbnRhaW5lciA9IF9vdmVybGF5Q29udGFpbmVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgZ2xvYmFsIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2xvYmFsKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IEdsb2JhbFBvc2l0aW9uU3RyYXRlZ3koKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIHJlbGF0aXZlIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSBgZmxleGlibGVDb25uZWN0ZWRUb2AgaW5zdGVhZC4KICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luUG9zCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5UG9zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb25uZWN0ZWRUbyhlbGVtZW50UmVmLCBvcmlnaW5Qb3MsIG92ZXJsYXlQb3MpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5KG9yaWdpblBvcywgb3ZlcmxheVBvcywgZWxlbWVudFJlZiwgdGhpcy5fdmlld3BvcnRSdWxlciwgdGhpcy5fZG9jdW1lbnQsIHRoaXMuX3BsYXRmb3JtLCB0aGlzLl9vdmVybGF5Q29udGFpbmVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIGZsZXhpYmxlIHBvc2l0aW9uIHN0cmF0ZWd5LgogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luIE9yaWdpbiByZWxhdGl2ZSB0byB3aGljaCB0byBwb3NpdGlvbiB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZsZXhpYmxlQ29ubmVjdGVkVG8ob3JpZ2luKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRmxleGlibGVDb25uZWN0ZWRQb3NpdGlvblN0cmF0ZWd5KG9yaWdpbiwgdGhpcy5fdmlld3BvcnRSdWxlciwgdGhpcy5fZG9jdW1lbnQsIHRoaXMuX3BsYXRmb3JtLCB0aGlzLl9vdmVybGF5Q29udGFpbmVyKTsKICAgICAgICB9CiAgICB9CiAgICBPdmVybGF5UG9zaXRpb25CdWlsZGVyLsm1ZmFjID0gZnVuY3Rpb24gT3ZlcmxheVBvc2l0aW9uQnVpbGRlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBPdmVybGF5UG9zaXRpb25CdWlsZGVyKSjJtcm1aW5qZWN0KFZpZXdwb3J0UnVsZXIpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSwgybXJtWluamVjdChPdmVybGF5Q29udGFpbmVyKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBWaWV3cG9ydFJ1bGVyIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgICAgICB7IHR5cGU6IE92ZXJsYXlDb250YWluZXIgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBPdmVybGF5UG9zaXRpb25CdWlsZGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gT3ZlcmxheVBvc2l0aW9uQnVpbGRlcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIoybXJtWluamVjdChWaWV3cG9ydFJ1bGVyKSwgybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChQbGF0Zm9ybSksIMm1ybVpbmplY3QoT3ZlcmxheUNvbnRhaW5lcikpOyB9LCB0b2tlbjogT3ZlcmxheVBvc2l0aW9uQnVpbGRlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L292ZXJsYXkudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBOZXh0IG92ZXJsYXkgdW5pcXVlIElELgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBuZXh0VW5pcXVlSWQkMyA9IDA7CiAgICAvLyBOb3RlIHRoYXQgT3ZlcmxheSBpcyAqbm90KiBzY29wZWQgdG8gdGhlIGFwcCByb290IGJlY2F1c2Ugb2YgdGhlIENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgogICAgLy8gd2hpY2ggbmVlZHMgdG8gYmUgZGlmZmVyZW50IGRlcGVuZGluZyBvbiB3aGVyZSBPdmVybGF5TW9kdWxlIGlzIGltcG9ydGVkLgogICAgLyoqCiAgICAgKiBTZXJ2aWNlIHRvIGNyZWF0ZSBPdmVybGF5cy4gT3ZlcmxheXMgYXJlIGR5bmFtaWNhbGx5IGFkZGVkIHBpZWNlcyBvZiBmbG9hdGluZyBVSSwgbWVhbnQgdG8gYmUKICAgICAqIHVzZWQgYXMgYSBsb3ctbGV2ZWwgYnVpbGRpbmcgYmxvY2sgZm9yIG90aGVyIGNvbXBvbmVudHMuIERpYWxvZ3MsIHRvb2x0aXBzLCBtZW51cywKICAgICAqIHNlbGVjdHMsIGV0Yy4gY2FuIGFsbCBiZSBidWlsdCB1c2luZyBvdmVybGF5cy4gVGhlIHNlcnZpY2Ugc2hvdWxkIHByaW1hcmlseSBiZSB1c2VkIGJ5IGF1dGhvcnMKICAgICAqIG9mIHJlLXVzYWJsZSBjb21wb25lbnRzIHJhdGhlciB0aGFuIGRldmVsb3BlcnMgYnVpbGRpbmcgZW5kLXVzZXIgYXBwbGljYXRpb25zLgogICAgICoKICAgICAqIEFuIG92ZXJsYXkgKmlzKiBhIFBvcnRhbE91dGxldCwgc28gYW55IGtpbmQgb2YgUG9ydGFsIGNhbiBiZSBsb2FkZWQgaW50byBvbmUuCiAgICAgKi8KICAgIGNsYXNzIE92ZXJsYXkgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsU3RyYXRlZ2llcwogICAgICAgICAqIEBwYXJhbSB7P30gX292ZXJsYXlDb250YWluZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9wb3NpdGlvbkJ1aWxkZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9rZXlib2FyZERpc3BhdGNoZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9pbmplY3RvcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlyZWN0aW9uYWxpdHkKICAgICAgICAgKiBAcGFyYW0gez89fSBfbG9jYXRpb24KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzY3JvbGxTdHJhdGVnaWVzLCBfb3ZlcmxheUNvbnRhaW5lciwgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX3Bvc2l0aW9uQnVpbGRlciwgX2tleWJvYXJkRGlzcGF0Y2hlciwgX2luamVjdG9yLCBfbmdab25lLCBfZG9jdW1lbnQsIF9kaXJlY3Rpb25hbGl0eSwgX2xvY2F0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ2llcyA9IHNjcm9sbFN0cmF0ZWdpZXM7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlDb250YWluZXIgPSBfb3ZlcmxheUNvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5fY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlcjsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb25CdWlsZGVyID0gX3Bvc2l0aW9uQnVpbGRlcjsKICAgICAgICAgICAgdGhpcy5fa2V5Ym9hcmREaXNwYXRjaGVyID0gX2tleWJvYXJkRGlzcGF0Y2hlcjsKICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb25hbGl0eSA9IF9kaXJlY3Rpb25hbGl0eTsKICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24gPSBfbG9jYXRpb247CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gb3ZlcmxheS4KICAgICAgICAgKiBAcGFyYW0gez89fSBjb25maWcgQ29uZmlndXJhdGlvbiBhcHBsaWVkIHRvIHRoZSBvdmVybGF5LgogICAgICAgICAqIEByZXR1cm4gez99IFJlZmVyZW5jZSB0byB0aGUgY3JlYXRlZCBvdmVybGF5LgogICAgICAgICAqLwogICAgICAgIGNyZWF0ZShjb25maWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBob3N0ID0gdGhpcy5fY3JlYXRlSG9zdEVsZW1lbnQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYW5lID0gdGhpcy5fY3JlYXRlUGFuZUVsZW1lbnQoaG9zdCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcG9ydGFsT3V0bGV0ID0gdGhpcy5fY3JlYXRlUG9ydGFsT3V0bGV0KHBhbmUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyhjb25maWcpOwogICAgICAgICAgICBvdmVybGF5Q29uZmlnLmRpcmVjdGlvbiA9IG92ZXJsYXlDb25maWcuZGlyZWN0aW9uIHx8IHRoaXMuX2RpcmVjdGlvbmFsaXR5LnZhbHVlOwogICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlSZWYocG9ydGFsT3V0bGV0LCBob3N0LCBwYW5lLCBvdmVybGF5Q29uZmlnLCB0aGlzLl9uZ1pvbmUsIHRoaXMuX2tleWJvYXJkRGlzcGF0Y2hlciwgdGhpcy5fZG9jdW1lbnQsIHRoaXMuX2xvY2F0aW9uKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhIHBvc2l0aW9uIGJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCwgdmlhIGZsdWVudCBBUEksCiAgICAgICAgICogdG8gY29uc3RydWN0IGFuZCBjb25maWd1cmUgYSBwb3NpdGlvbiBzdHJhdGVneS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBbiBvdmVybGF5IHBvc2l0aW9uIGJ1aWxkZXIuCiAgICAgICAgICovCiAgICAgICAgcG9zaXRpb24oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbkJ1aWxkZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgdGhlIERPTSBlbGVtZW50IGZvciBhbiBvdmVybGF5IGFuZCBhcHBlbmRzIGl0IHRvIHRoZSBvdmVybGF5IGNvbnRhaW5lci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICAgICAqIEByZXR1cm4gez99IE5ld2x5LWNyZWF0ZWQgcGFuZSBlbGVtZW50CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVBhbmVFbGVtZW50KGhvc3QpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYW5lID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7CiAgICAgICAgICAgIHBhbmUuaWQgPSBgY2RrLW92ZXJsYXktJHtuZXh0VW5pcXVlSWQkMysrfWA7CiAgICAgICAgICAgIHBhbmUuY2xhc3NMaXN0LmFkZCgnY2RrLW92ZXJsYXktcGFuZScpOwogICAgICAgICAgICBob3N0LmFwcGVuZENoaWxkKHBhbmUpOwogICAgICAgICAgICByZXR1cm4gcGFuZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyB0aGUgaG9zdCBlbGVtZW50IHRoYXQgd3JhcHMgYXJvdW5kIGFuIG92ZXJsYXkKICAgICAgICAgKiBhbmQgY2FuIGJlIHVzZWQgZm9yIGFkdmFuY2VkIHBvc2l0aW9uaW5nLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30gTmV3bHktY3JlYXRlIGhvc3QgZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlSG9zdEVsZW1lbnQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG9zdCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpOwogICAgICAgICAgICB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKS5hcHBlbmRDaGlsZChob3N0KTsKICAgICAgICAgICAgcmV0dXJuIGhvc3Q7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZSBhIERvbVBvcnRhbE91dGxldCBpbnRvIHdoaWNoIHRoZSBvdmVybGF5IGNvbnRlbnQgY2FuIGJlIGxvYWRlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcGFuZSBUaGUgRE9NIGVsZW1lbnQgdG8gdHVybiBpbnRvIGEgcG9ydGFsIG91dGxldC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIHBvcnRhbCBvdXRsZXQgZm9yIHRoZSBnaXZlbiBET00gZWxlbWVudC4KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlUG9ydGFsT3V0bGV0KHBhbmUpIHsKICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byByZXNvbHZlIHRoZSBBcHBsaWNhdGlvblJlZiBsYXRlciBpbiBvcmRlciB0byBhbGxvdyBwZW9wbGUKICAgICAgICAgICAgLy8gdG8gdXNlIG92ZXJsYXktYmFzZWQgcHJvdmlkZXJzIGR1cmluZyBhcHAgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgICAgIGlmICghdGhpcy5fYXBwUmVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBSZWYgPSB0aGlzLl9pbmplY3Rvci5nZXQoQXBwbGljYXRpb25SZWYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgRG9tUG9ydGFsT3V0bGV0KHBhbmUsIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgdGhpcy5fYXBwUmVmLCB0aGlzLl9pbmplY3RvciwgdGhpcy5fZG9jdW1lbnQpOwogICAgICAgIH0KICAgIH0KICAgIE92ZXJsYXkuybVmYWMgPSBmdW5jdGlvbiBPdmVybGF5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE92ZXJsYXkpKMm1ybVpbmplY3QoU2Nyb2xsU3RyYXRlZ3lPcHRpb25zKSwgybXJtWluamVjdChPdmVybGF5Q29udGFpbmVyKSwgybXJtWluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1aW5qZWN0KE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIpLCDJtcm1aW5qZWN0KE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIpLCDJtcm1aW5qZWN0KEluamVjdG9yKSwgybXJtWluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KERpcmVjdGlvbmFsaXR5KSwgybXJtWluamVjdChMb2NhdGlvbiwgOCkpOyB9OwogICAgT3ZlcmxheS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBPdmVybGF5LCBmYWN0b3J5OiBPdmVybGF5Lsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBPdmVybGF5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU2Nyb2xsU3RyYXRlZ3lPcHRpb25zIH0sCiAgICAgICAgeyB0eXBlOiBPdmVybGF5Q29udGFpbmVyIH0sCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfSwKICAgICAgICB7IHR5cGU6IE92ZXJsYXlQb3NpdGlvbkJ1aWxkZXIgfSwKICAgICAgICB7IHR5cGU6IE92ZXJsYXlLZXlib2FyZERpc3BhdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IEluamVjdG9yIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSB9LAogICAgICAgIHsgdHlwZTogTG9jYXRpb24sIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL292ZXJsYXkvb3ZlcmxheS1kaXJlY3RpdmVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogRGVmYXVsdCBzZXQgb2YgcG9zaXRpb25zIGZvciB0aGUgb3ZlcmxheS4gRm9sbG93cyB0aGUgYmVoYXZpb3Igb2YgYSBkcm9wZG93bi4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBkZWZhdWx0UG9zaXRpb25MaXN0ID0gWwogICAgICAgIHsKICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JywKICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsCiAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLAogICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JywKICAgICAgICAgICAgb3JpZ2luWTogJ3RvcCcsCiAgICAgICAgICAgIG92ZXJsYXlYOiAnc3RhcnQnLAogICAgICAgICAgICBvdmVybGF5WTogJ2JvdHRvbScKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgb3JpZ2luWDogJ2VuZCcsCiAgICAgICAgICAgIG9yaWdpblk6ICd0b3AnLAogICAgICAgICAgICBvdmVybGF5WDogJ2VuZCcsCiAgICAgICAgICAgIG92ZXJsYXlZOiAnYm90dG9tJwogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBvcmlnaW5YOiAnZW5kJywKICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsCiAgICAgICAgICAgIG92ZXJsYXlYOiAnZW5kJywKICAgICAgICAgICAgb3ZlcmxheVk6ICd0b3AnCiAgICAgICAgfQogICAgXTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2Nyb2xsIGhhbmRsaW5nIHdoaWxlIHRoZSBjb25uZWN0ZWQgb3ZlcmxheSBpcyBvcGVuLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENES19DT05ORUNURURfT1ZFUkxBWV9TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ2Nkay1jb25uZWN0ZWQtb3ZlcmxheS1zY3JvbGwtc3RyYXRlZ3knKTsKICAgIC8qKgogICAgICogRGlyZWN0aXZlIGFwcGxpZWQgdG8gYW4gZWxlbWVudCB0byBtYWtlIGl0IHVzYWJsZSBhcyBhbiBvcmlnaW4gZm9yIGFuIE92ZXJsYXkgdXNpbmcgYQogICAgICogQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneS4KICAgICAqLwogICAgY2xhc3MgQ2RrT3ZlcmxheU9yaWdpbiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmOwogICAgICAgIH0KICAgIH0KICAgIENka092ZXJsYXlPcmlnaW4uybVmYWMgPSBmdW5jdGlvbiBDZGtPdmVybGF5T3JpZ2luX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka092ZXJsYXlPcmlnaW4pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwogICAgQ2RrT3ZlcmxheU9yaWdpbi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtPdmVybGF5T3JpZ2luLCBzZWxlY3RvcnM6IFtbIiIsICJjZGstb3ZlcmxheS1vcmlnaW4iLCAiIl0sIFsiIiwgIm92ZXJsYXktb3JpZ2luIiwgIiJdLCBbIiIsICJjZGtPdmVybGF5T3JpZ2luIiwgIiJdXSwgZXhwb3J0QXM6IFsiY2RrT3ZlcmxheU9yaWdpbiJdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtPdmVybGF5T3JpZ2luLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgLyoqCiAgICAgKiBEaXJlY3RpdmUgdG8gZmFjaWxpdGF0ZSBkZWNsYXJhdGl2ZSBjcmVhdGlvbiBvZiBhbgogICAgICogT3ZlcmxheSB1c2luZyBhIEZsZXhpYmxlQ29ubmVjdGVkUG9zaXRpb25TdHJhdGVneS4KICAgICAqLwogICAgY2xhc3MgQ2RrQ29ubmVjdGVkT3ZlcmxheSB7CiAgICAgICAgLy8gVE9ETyhqZWxib3Vybik6IGlucHV0cyBmb3Igc2l6ZSwgc2Nyb2xsIGJlaGF2aW9yLCBhbmltYXRpb24sIGV0Yy4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9vdmVybGF5CiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZVJlZgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5CiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX292ZXJsYXksIHRlbXBsYXRlUmVmLCB2aWV3Q29udGFpbmVyUmVmLCBzY3JvbGxTdHJhdGVneUZhY3RvcnksIF9kaXIpIHsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheSA9IF9vdmVybGF5OwogICAgICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgICAgICB0aGlzLl9oYXNCYWNrZHJvcCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9sb2NrUG9zaXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZ3Jvd0FmdGVyT3BlbiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnMgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fcHVzaCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9iYWNrZHJvcFN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1hcmdpbiBiZXR3ZWVuIHRoZSBvdmVybGF5IGFuZCB0aGUgdmlld3BvcnQgZWRnZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnZpZXdwb3J0TWFyZ2luID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgaXMgb3Blbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub3BlbiA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBiYWNrZHJvcCBpcyBjbGlja2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5iYWNrZHJvcENsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBwb3NpdGlvbiBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucG9zaXRpb25DaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIG92ZXJsYXkgaGFzIGJlZW4gYXR0YWNoZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmF0dGFjaCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgb3ZlcmxheSBoYXMgYmVlbiBkZXRhY2hlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZGV0YWNoID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGVyZSBhcmUga2V5Ym9hcmQgZXZlbnRzIHRoYXQgYXJlIHRhcmdldGVkIGF0IHRoZSBvdmVybGF5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vdmVybGF5S2V5ZG93biA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGVQb3J0YWwgPSBuZXcgVGVtcGxhdGVQb3J0YWwodGVtcGxhdGVSZWYsIHZpZXdDb250YWluZXJSZWYpOwogICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkgPSBzY3JvbGxTdHJhdGVneUZhY3Rvcnk7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsU3RyYXRlZ3kgPSB0aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG9mZnNldCBpbiBwaXhlbHMgZm9yIHRoZSBvdmVybGF5IGNvbm5lY3Rpb24gcG9pbnQgb24gdGhlIHgtYXhpcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG9mZnNldFgoKSB7IHJldHVybiB0aGlzLl9vZmZzZXRYOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBvZmZzZXRYCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgb2Zmc2V0WChvZmZzZXRYKSB7CiAgICAgICAgICAgIHRoaXMuX29mZnNldFggPSBvZmZzZXRYOwogICAgICAgICAgICBpZiAodGhpcy5fcG9zaXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVBvc2l0aW9uU3RyYXRlZ3kodGhpcy5fcG9zaXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBvZmZzZXQgaW4gcGl4ZWxzIGZvciB0aGUgb3ZlcmxheSBjb25uZWN0aW9uIHBvaW50IG9uIHRoZSB5LWF4aXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBvZmZzZXRZKCkgeyByZXR1cm4gdGhpcy5fb2Zmc2V0WTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gb2Zmc2V0WQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG9mZnNldFkob2Zmc2V0WSkgewogICAgICAgICAgICB0aGlzLl9vZmZzZXRZID0gb2Zmc2V0WTsKICAgICAgICAgICAgaWYgKHRoaXMuX3Bvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHRoaXMuX3Bvc2l0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgb3ZlcmxheSBzaG91bGQgYXR0YWNoIGEgYmFja2Ryb3AuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaGFzQmFja2Ryb3AoKSB7IHJldHVybiB0aGlzLl9oYXNCYWNrZHJvcDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBoYXNCYWNrZHJvcCh2YWx1ZSkgeyB0aGlzLl9oYXNCYWNrZHJvcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgb3ZlcmxheSBzaG91bGQgYmUgbG9ja2VkIHdoZW4gc2Nyb2xsaW5nLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGxvY2tQb3NpdGlvbigpIHsgcmV0dXJuIHRoaXMuX2xvY2tQb3NpdGlvbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBsb2NrUG9zaXRpb24odmFsdWUpIHsgdGhpcy5fbG9ja1Bvc2l0aW9uID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkncyB3aWR0aCBhbmQgaGVpZ2h0IGNhbiBiZSBjb25zdHJhaW5lZCB0byBmaXQgd2l0aGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmbGV4aWJsZURpbWVuc2lvbnMoKSB7IHJldHVybiB0aGlzLl9mbGV4aWJsZURpbWVuc2lvbnM7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZmxleGlibGVEaW1lbnNpb25zKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2ZsZXhpYmxlRGltZW5zaW9ucyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG92ZXJsYXkgY2FuIGdyb3cgYWZ0ZXIgdGhlIGluaXRpYWwgb3BlbiB3aGVuIGZsZXhpYmxlIHBvc2l0aW9uaW5nIGlzIHR1cm5lZCBvbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBncm93QWZ0ZXJPcGVuKCkgeyByZXR1cm4gdGhpcy5fZ3Jvd0FmdGVyT3BlbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBncm93QWZ0ZXJPcGVuKHZhbHVlKSB7IHRoaXMuX2dyb3dBZnRlck9wZW4gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgb3ZlcmxheSBjYW4gYmUgcHVzaGVkIG9uLXNjcmVlbiBpZiBub25lIG9mIHRoZSBwcm92aWRlZCBwb3NpdGlvbnMgZml0LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHB1c2goKSB7IHJldHVybiB0aGlzLl9wdXNoOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHB1c2godmFsdWUpIHsgdGhpcy5fcHVzaCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBvdmVybGF5IHJlZmVyZW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBvdmVybGF5UmVmKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGVsZW1lbnQncyBsYXlvdXQgZGlyZWN0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpcigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RpciA/IHRoaXMuX2Rpci52YWx1ZSA6ICdsdHInOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wb3NpdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb25TdHJhdGVneSh0aGlzLl9wb3NpdGlvbik7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLnVwZGF0ZVNpemUoewogICAgICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLndpZHRoLAogICAgICAgICAgICAgICAgICAgIG1pbldpZHRoOiB0aGlzLm1pbldpZHRoLAogICAgICAgICAgICAgICAgICAgIGhlaWdodDogdGhpcy5oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgbWluSGVpZ2h0OiB0aGlzLm1pbkhlaWdodCwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ29yaWdpbiddICYmIHRoaXMub3BlbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uLmFwcGx5KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ29wZW4nXSkgewogICAgICAgICAgICAgICAgdGhpcy5vcGVuID8gdGhpcy5fYXR0YWNoT3ZlcmxheSgpIDogdGhpcy5fZGV0YWNoT3ZlcmxheSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gb3ZlcmxheQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlT3ZlcmxheSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnBvc2l0aW9ucyB8fCAhdGhpcy5wb3NpdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9ucyA9IGRlZmF1bHRQb3NpdGlvbkxpc3Q7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXkuY3JlYXRlKHRoaXMuX2J1aWxkQ29uZmlnKCkpOwogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheUtleWRvd24ubmV4dChldmVudCk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbnQua2V5Q29kZSA9PT0gRVNDQVBFICYmICFoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RldGFjaE92ZXJsYXkoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBCdWlsZHMgdGhlIG92ZXJsYXkgY29uZmlnIGJhc2VkIG9uIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2J1aWxkQ29uZmlnKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9wb3NpdGlvbiA9CiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uU3RyYXRlZ3kgfHwgdGhpcy5fY3JlYXRlUG9zaXRpb25TdHJhdGVneSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZyh7CiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuX2RpciwKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3ksCiAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5zY3JvbGxTdHJhdGVneSwKICAgICAgICAgICAgICAgIGhhc0JhY2tkcm9wOiB0aGlzLmhhc0JhY2tkcm9wCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAodGhpcy53aWR0aCB8fCB0aGlzLndpZHRoID09PSAwKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5Q29uZmlnLndpZHRoID0gdGhpcy53aWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5oZWlnaHQgfHwgdGhpcy5oZWlnaHQgPT09IDApIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlDb25maWcuaGVpZ2h0ID0gdGhpcy5oZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubWluV2lkdGggfHwgdGhpcy5taW5XaWR0aCA9PT0gMCkgewogICAgICAgICAgICAgICAgb3ZlcmxheUNvbmZpZy5taW5XaWR0aCA9IHRoaXMubWluV2lkdGg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMubWluSGVpZ2h0IHx8IHRoaXMubWluSGVpZ2h0ID09PSAwKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5Q29uZmlnLm1pbkhlaWdodCA9IHRoaXMubWluSGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmJhY2tkcm9wQ2xhc3MpIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlDb25maWcuYmFja2Ryb3BDbGFzcyA9IHRoaXMuYmFja2Ryb3BDbGFzczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5wYW5lbENsYXNzKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5Q29uZmlnLnBhbmVsQ2xhc3MgPSB0aGlzLnBhbmVsQ2xhc3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG92ZXJsYXlDb25maWc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHN0YXRlIG9mIGEgcG9zaXRpb24gc3RyYXRlZ3ksIGJhc2VkIG9uIHRoZSB2YWx1ZXMgb2YgdGhlIGRpcmVjdGl2ZSBpbnB1dHMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uU3RyYXRlZ3kKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVQb3NpdGlvblN0cmF0ZWd5KHBvc2l0aW9uU3RyYXRlZ3kpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSB0aGlzLnBvc2l0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRQb3NpdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uID0+ICh7CiAgICAgICAgICAgICAgICBvcmlnaW5YOiBjdXJyZW50UG9zaXRpb24ub3JpZ2luWCwKICAgICAgICAgICAgICAgIG9yaWdpblk6IGN1cnJlbnRQb3NpdGlvbi5vcmlnaW5ZLAogICAgICAgICAgICAgICAgb3ZlcmxheVg6IGN1cnJlbnRQb3NpdGlvbi5vdmVybGF5WCwKICAgICAgICAgICAgICAgIG92ZXJsYXlZOiBjdXJyZW50UG9zaXRpb24ub3ZlcmxheVksCiAgICAgICAgICAgICAgICBvZmZzZXRYOiBjdXJyZW50UG9zaXRpb24ub2Zmc2V0WCB8fCB0aGlzLm9mZnNldFgsCiAgICAgICAgICAgICAgICBvZmZzZXRZOiBjdXJyZW50UG9zaXRpb24ub2Zmc2V0WSB8fCB0aGlzLm9mZnNldFksCiAgICAgICAgICAgICAgICBwYW5lbENsYXNzOiBjdXJyZW50UG9zaXRpb24ucGFuZWxDbGFzcyB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvblN0cmF0ZWd5CiAgICAgICAgICAgICAgICAuc2V0T3JpZ2luKHRoaXMub3JpZ2luLmVsZW1lbnRSZWYpCiAgICAgICAgICAgICAgICAud2l0aFBvc2l0aW9ucyhwb3NpdGlvbnMpCiAgICAgICAgICAgICAgICAud2l0aEZsZXhpYmxlRGltZW5zaW9ucyh0aGlzLmZsZXhpYmxlRGltZW5zaW9ucykKICAgICAgICAgICAgICAgIC53aXRoUHVzaCh0aGlzLnB1c2gpCiAgICAgICAgICAgICAgICAud2l0aEdyb3dBZnRlck9wZW4odGhpcy5ncm93QWZ0ZXJPcGVuKQogICAgICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbih0aGlzLnZpZXdwb3J0TWFyZ2luKQogICAgICAgICAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbih0aGlzLmxvY2tQb3NpdGlvbikKICAgICAgICAgICAgICAgIC53aXRoVHJhbnNmb3JtT3JpZ2luT24odGhpcy50cmFuc2Zvcm1PcmlnaW5TZWxlY3Rvcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IG9mIHRoZSBvdmVybGF5IHRvIGJlIHNldCBvbiB0aGUgb3ZlcmxheSBjb25maWcKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZVBvc2l0aW9uU3RyYXRlZ3koKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLm9yaWdpbi5lbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb25TdHJhdGVneShzdHJhdGVneSk7CiAgICAgICAgICAgIHN0cmF0ZWd5LnBvc2l0aW9uQ2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHAgPT4gdGhpcy5wb3NpdGlvbkNoYW5nZS5lbWl0KHApKSk7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVneTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhlIG92ZXJsYXkgYW5kIHN1YnNjcmliZXMgdG8gYmFja2Ryb3AgY2xpY2tzIGlmIGJhY2tkcm9wIGV4aXN0cwogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXR0YWNoT3ZlcmxheSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVPdmVybGF5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIG92ZXJsYXkgc2l6ZSwgaW4gY2FzZSB0aGUgZGlyZWN0aXZlJ3MgaW5wdXRzIGhhdmUgY2hhbmdlZAogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5oYXNCYWNrZHJvcCA9IHRoaXMuaGFzQmFja2Ryb3A7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3RlbXBsYXRlUG9ydGFsKTsKICAgICAgICAgICAgICAgIHRoaXMuYXR0YWNoLmVtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5oYXNCYWNrZHJvcCkgewogICAgICAgICAgICAgICAgdGhpcy5fYmFja2Ryb3BTdWJzY3JpcHRpb24gPSB0aGlzLl9vdmVybGF5UmVmLmJhY2tkcm9wQ2xpY2soKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuYmFja2Ryb3BDbGljay5lbWl0KGV2ZW50KTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2JhY2tkcm9wU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0YWNoZXMgdGhlIG92ZXJsYXkgYW5kIHVuc3Vic2NyaWJlcyB0byBiYWNrZHJvcCBjbGlja3MgaWYgYmFja2Ryb3AgZXhpc3RzCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9kZXRhY2hPdmVybGF5KCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2goKTsKICAgICAgICAgICAgICAgIHRoaXMuZGV0YWNoLmVtaXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9iYWNrZHJvcFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgIH0KICAgIENka0Nvbm5lY3RlZE92ZXJsYXkuybVmYWMgPSBmdW5jdGlvbiBDZGtDb25uZWN0ZWRPdmVybGF5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka0Nvbm5lY3RlZE92ZXJsYXkpKMm1ybVkaXJlY3RpdmVJbmplY3QoT3ZlcmxheSksIMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENES19DT05ORUNURURfT1ZFUkxBWV9TQ1JPTExfU1RSQVRFR1kpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSk7IH07CiAgICBDZGtDb25uZWN0ZWRPdmVybGF5Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0Nvbm5lY3RlZE92ZXJsYXksIHNlbGVjdG9yczogW1siIiwgImNkay1jb25uZWN0ZWQtb3ZlcmxheSIsICIiXSwgWyIiLCAiY29ubmVjdGVkLW92ZXJsYXkiLCAiIl0sIFsiIiwgImNka0Nvbm5lY3RlZE92ZXJsYXkiLCAiIl1dLCBpbnB1dHM6IHsgdmlld3BvcnRNYXJnaW46IFsiY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luIiwgInZpZXdwb3J0TWFyZ2luIl0sIG9wZW46IFsiY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW4iLCAib3BlbiJdLCBzY3JvbGxTdHJhdGVneTogWyJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLCAic2Nyb2xsU3RyYXRlZ3kiXSwgb2Zmc2V0WDogWyJjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCIsICJvZmZzZXRYIl0sIG9mZnNldFk6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheU9mZnNldFkiLCAib2Zmc2V0WSJdLCBoYXNCYWNrZHJvcDogWyJjZGtDb25uZWN0ZWRPdmVybGF5SGFzQmFja2Ryb3AiLCAiaGFzQmFja2Ryb3AiXSwgbG9ja1Bvc2l0aW9uOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCAibG9ja1Bvc2l0aW9uIl0sIGZsZXhpYmxlRGltZW5zaW9uczogWyJjZGtDb25uZWN0ZWRPdmVybGF5RmxleGlibGVEaW1lbnNpb25zIiwgImZsZXhpYmxlRGltZW5zaW9ucyJdLCBncm93QWZ0ZXJPcGVuOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlHcm93QWZ0ZXJPcGVuIiwgImdyb3dBZnRlck9wZW4iXSwgcHVzaDogWyJjZGtDb25uZWN0ZWRPdmVybGF5UHVzaCIsICJwdXNoIl0sIHBvc2l0aW9uczogWyJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25zIiwgInBvc2l0aW9ucyJdLCBvcmlnaW46IFsiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsICJvcmlnaW4iXSwgcG9zaXRpb25TdHJhdGVneTogWyJjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25TdHJhdGVneSIsICJwb3NpdGlvblN0cmF0ZWd5Il0sIHdpZHRoOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlXaWR0aCIsICJ3aWR0aCJdLCBoZWlnaHQ6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodCIsICJoZWlnaHQiXSwgbWluV2lkdGg6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoIiwgIm1pbldpZHRoIl0sIG1pbkhlaWdodDogWyJjZGtDb25uZWN0ZWRPdmVybGF5TWluSGVpZ2h0IiwgIm1pbkhlaWdodCJdLCBiYWNrZHJvcENsYXNzOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlCYWNrZHJvcENsYXNzIiwgImJhY2tkcm9wQ2xhc3MiXSwgcGFuZWxDbGFzczogWyJjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcyIsICJwYW5lbENsYXNzIl0sIHRyYW5zZm9ybU9yaWdpblNlbGVjdG9yOiBbImNka0Nvbm5lY3RlZE92ZXJsYXlUcmFuc2Zvcm1PcmlnaW5PbiIsICJ0cmFuc2Zvcm1PcmlnaW5TZWxlY3RvciJdIH0sIG91dHB1dHM6IHsgYmFja2Ryb3BDbGljazogImJhY2tkcm9wQ2xpY2siLCBwb3NpdGlvbkNoYW5nZTogInBvc2l0aW9uQ2hhbmdlIiwgYXR0YWNoOiAiYXR0YWNoIiwgZGV0YWNoOiAiZGV0YWNoIiwgb3ZlcmxheUtleWRvd246ICJvdmVybGF5S2V5ZG93biIgfSwgZXhwb3J0QXM6IFsiY2RrQ29ubmVjdGVkT3ZlcmxheSJdLCBmZWF0dXJlczogW8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtDb25uZWN0ZWRPdmVybGF5LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogT3ZlcmxheSB9LAogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSwKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0RLX0NPTk5FQ1RFRF9PVkVSTEFZX1NDUk9MTF9TVFJBVEVHWSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQogICAgXTsKICAgIENka0Nvbm5lY3RlZE92ZXJsYXkucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgb3JpZ2luOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luJyxdIH1dLAogICAgICAgIHBvc2l0aW9uczogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucycsXSB9XSwKICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25TdHJhdGVneScsXSB9XSwKICAgICAgICBvZmZzZXRYOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WCcsXSB9XSwKICAgICAgICBvZmZzZXRZOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5T2Zmc2V0WScsXSB9XSwKICAgICAgICB3aWR0aDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheVdpZHRoJyxdIH1dLAogICAgICAgIGhlaWdodDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUhlaWdodCcsXSB9XSwKICAgICAgICBtaW5XaWR0aDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheU1pbldpZHRoJyxdIH1dLAogICAgICAgIG1pbkhlaWdodDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheU1pbkhlaWdodCcsXSB9XSwKICAgICAgICBiYWNrZHJvcENsYXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5QmFja2Ryb3BDbGFzcycsXSB9XSwKICAgICAgICBwYW5lbENsYXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5UGFuZWxDbGFzcycsXSB9XSwKICAgICAgICB2aWV3cG9ydE1hcmdpbjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheVZpZXdwb3J0TWFyZ2luJyxdIH1dLAogICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3knLF0gfV0sCiAgICAgICAgb3BlbjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW4nLF0gfV0sCiAgICAgICAgdHJhbnNmb3JtT3JpZ2luU2VsZWN0b3I6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlUcmFuc2Zvcm1PcmlnaW5PbicsXSB9XSwKICAgICAgICBoYXNCYWNrZHJvcDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUhhc0JhY2tkcm9wJyxdIH1dLAogICAgICAgIGxvY2tQb3NpdGlvbjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUxvY2tQb3NpdGlvbicsXSB9XSwKICAgICAgICBmbGV4aWJsZURpbWVuc2lvbnM6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0Nvbm5lY3RlZE92ZXJsYXlGbGV4aWJsZURpbWVuc2lvbnMnLF0gfV0sCiAgICAgICAgZ3Jvd0FmdGVyT3BlbjogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheUdyb3dBZnRlck9wZW4nLF0gfV0sCiAgICAgICAgcHVzaDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29ubmVjdGVkT3ZlcmxheVB1c2gnLF0gfV0sCiAgICAgICAgYmFja2Ryb3BDbGljazogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIHBvc2l0aW9uQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgYXR0YWNoOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgZGV0YWNoOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb3ZlcmxheUtleWRvd246IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gb3ZlcmxheQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gQ0RLX0NPTk5FQ1RFRF9PVkVSTEFZX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZKG92ZXJsYXkpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQ0RLX0NPTk5FQ1RFRF9PVkVSTEFZX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUiA9IHsKICAgICAgICBwcm92aWRlOiBDREtfQ09OTkVDVEVEX09WRVJMQVlfU0NST0xMX1NUUkFURUdZLAogICAgICAgIGRlcHM6IFtPdmVybGF5XSwKICAgICAgICB1c2VGYWN0b3J5OiBDREtfQ09OTkVDVEVEX09WRVJMQVlfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlksCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L292ZXJsYXktbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE92ZXJsYXlNb2R1bGUgewogICAgfQogICAgT3ZlcmxheU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE92ZXJsYXlNb2R1bGUgfSk7CiAgICBPdmVybGF5TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gT3ZlcmxheU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBPdmVybGF5TW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgT3ZlcmxheSwKICAgICAgICAgICAgQ0RLX0NPTk5FQ1RFRF9PVkVSTEFZX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUiwKICAgICAgICBdLCBpbXBvcnRzOiBbW0JpZGlNb2R1bGUsIFBvcnRhbE1vZHVsZSwgU2Nyb2xsaW5nTW9kdWxlXSwKICAgICAgICAgICAgU2Nyb2xsaW5nTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE92ZXJsYXlNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ2RrQ29ubmVjdGVkT3ZlcmxheSwKICAgICAgICAgICAgQ2RrT3ZlcmxheU9yaWdpbl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtCaWRpTW9kdWxlLCBQb3J0YWxNb2R1bGUsIFNjcm9sbGluZ01vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtDb25uZWN0ZWRPdmVybGF5LAogICAgICAgICAgICBDZGtPdmVybGF5T3JpZ2luLAogICAgICAgICAgICBTY3JvbGxpbmdNb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9vdmVybGF5L2Z1bGxzY3JlZW4tb3ZlcmxheS1jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBbHRlcm5hdGl2ZSB0byBPdmVybGF5Q29udGFpbmVyIHRoYXQgc3VwcG9ydHMgY29ycmVjdCBkaXNwbGF5aW5nIG9mIG92ZXJsYXkgZWxlbWVudHMgaW4KICAgICAqIEZ1bGxzY3JlZW4gbW9kZQogICAgICogaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvQVBJL0VsZW1lbnQvcmVxdWVzdEZ1bGxTY3JlZW4KICAgICAqCiAgICAgKiBTaG91bGQgYmUgcHJvdmlkZWQgaW4gdGhlIHJvb3QgY29tcG9uZW50LgogICAgICovCiAgICBjbGFzcyBGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lciBleHRlbmRzIE92ZXJsYXlDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/PX0gcGxhdGZvcm0KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZG9jdW1lbnQsIAogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIGBwbGF0Zm9ybWAgcGFyYW1ldGVyIHRvIGJlY29tZSByZXF1aXJlZC4KICAgICAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAqLwogICAgICAgIHBsYXRmb3JtKSB7CiAgICAgICAgICAgIHN1cGVyKF9kb2N1bWVudCwgcGxhdGZvcm0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBzdXBlci5uZ09uRGVzdHJveSgpOwogICAgICAgICAgICBpZiAodGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSAmJiB0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIodGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSwgdGhpcy5fZnVsbFNjcmVlbkxpc3RlbmVyKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlQ29udGFpbmVyKCkgewogICAgICAgICAgICBzdXBlci5fY3JlYXRlQ29udGFpbmVyKCk7CiAgICAgICAgICAgIHRoaXMuX2FkanVzdFBhcmVudEZvckZ1bGxzY3JlZW5DaGFuZ2UoKTsKICAgICAgICAgICAgdGhpcy5fYWRkRnVsbHNjcmVlbkNoYW5nZUxpc3RlbmVyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX2FkanVzdFBhcmVudEZvckZ1bGxzY3JlZW5DaGFuZ2UoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FkanVzdFBhcmVudEZvckZ1bGxzY3JlZW5DaGFuZ2UoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fY29udGFpbmVyRWxlbWVudCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZnVsbHNjcmVlbkVsZW1lbnQgPSB0aGlzLmdldEZ1bGxzY3JlZW5FbGVtZW50KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gZnVsbHNjcmVlbkVsZW1lbnQgfHwgdGhpcy5fZG9jdW1lbnQuYm9keTsKICAgICAgICAgICAgcGFyZW50LmFwcGVuZENoaWxkKHRoaXMuX2NvbnRhaW5lckVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hZGRGdWxsc2NyZWVuQ2hhbmdlTGlzdGVuZXIoZm4pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBldmVudE5hbWUgPSB0aGlzLl9nZXRFdmVudE5hbWUoKTsKICAgICAgICAgICAgaWYgKGV2ZW50TmFtZSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2Z1bGxTY3JlZW5MaXN0ZW5lcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCB0aGlzLl9mdWxsU2NyZWVuTGlzdGVuZXIpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZuKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxTY3JlZW5MaXN0ZW5lciA9IGZuOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0RXZlbnROYW1lKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWUpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IF9kb2N1bWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudCkpOwogICAgICAgICAgICAgICAgaWYgKF9kb2N1bWVudC5mdWxsc2NyZWVuRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Z1bGxTY3JlZW5FdmVudE5hbWUgPSAnZnVsbHNjcmVlbmNoYW5nZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChfZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lID0gJ3dlYmtpdGZ1bGxzY3JlZW5jaGFuZ2UnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoX2RvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSA9ICdtb3pmdWxsc2NyZWVuY2hhbmdlJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKF9kb2N1bWVudC5tc0Z1bGxzY3JlZW5FbmFibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZnVsbFNjcmVlbkV2ZW50TmFtZSA9ICdNU0Z1bGxzY3JlZW5DaGFuZ2UnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mdWxsU2NyZWVuRXZlbnROYW1lOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRoZSBwYWdlIGlzIHB1dCBpbnRvIGZ1bGxzY3JlZW4gbW9kZSwgYSBzcGVjaWZpYyBlbGVtZW50IGlzIHNwZWNpZmllZC4KICAgICAgICAgKiBPbmx5IHRoYXQgZWxlbWVudCBhbmQgaXRzIGNoaWxkcmVuIGFyZSB2aXNpYmxlIHdoZW4gaW4gZnVsbHNjcmVlbiBtb2RlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0RnVsbHNjcmVlbkVsZW1lbnQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgX2RvY3VtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50KSk7CiAgICAgICAgICAgIHJldHVybiBfZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwKICAgICAgICAgICAgICAgIF9kb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fAogICAgICAgICAgICAgICAgX2RvY3VtZW50Lm1vekZ1bGxTY3JlZW5FbGVtZW50IHx8CiAgICAgICAgICAgICAgICBfZG9jdW1lbnQubXNGdWxsc2NyZWVuRWxlbWVudCB8fAogICAgICAgICAgICAgICAgbnVsbDsKICAgICAgICB9CiAgICB9CiAgICBGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1aW5qZWN0KFBsYXRmb3JtKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRnVsbHNjcmVlbk92ZXJsYXlDb250YWluZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBGdWxsc2NyZWVuT3ZlcmxheUNvbnRhaW5lcl9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyKMm1ybVpbmplY3QoRE9DVU1FTlQkMSksIMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfSwgdG9rZW46IEZ1bGxzY3JlZW5PdmVybGF5Q29udGFpbmVyLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CgogICAgLyoqCiAgICAgKiBAbGljZW5zZSBBbmd1bGFyIHY5LjEuMTIKICAgICAqIChjKSAyMDEwLTIwMjAgR29vZ2xlIExMQy4gaHR0cHM6Ly9hbmd1bGFyLmlvLwogICAgICogTGljZW5zZTogTUlUCiAgICAgKi8KICAgIC8qKgogICAgICogVXNlZCB0byBwcm92aWRlIGEgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3IgZm9ybSBjb250cm9scy4KICAgICAqCiAgICAgKiBTZWUgYERlZmF1bHRWYWx1ZUFjY2Vzc29yYCBmb3IgaG93IHRvIGltcGxlbWVudCBvbmUuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBOR19WQUxVRV9BQ0NFU1NPUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignTmdWYWx1ZUFjY2Vzc29yJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9jaGVja2JveF92YWx1ZV9hY2Nlc3Nvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDSEVDS0JPWF9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yKSksCiAgICAgICAgbXVsdGk6IHRydWUsCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHdyaXRpbmcgYSB2YWx1ZSBhbmQgbGlzdGVuaW5nIHRvIGNoYW5nZXMgb24gYSBjaGVja2JveCBpbnB1dAogICAgICogZWxlbWVudC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgVXNpbmcgYSBjaGVja2JveCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIGNoZWNrYm94IHdpdGggYSByZWFjdGl2ZSBmb3JtLgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCByZW1lbWJlckxvZ2luQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpOwogICAgICogYGBgCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIFtmb3JtQ29udHJvbF09InJlbWVtYmVyTG9naW5Db250cm9sIj4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogICAgICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3JlbmRlcmVyLCBfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGNoYW5nZSBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAiY2hlY2tlZCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBjaGVja2VkIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2NoZWNrZWQnLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAiZGlzYWJsZWQiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7CiAgICAgICAgfQogICAgfQogICAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvci7JtWZhYyA9IGZ1bmN0aW9uIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvciwgc2VsZWN0b3JzOiBbWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgImZvcm1Db250cm9sIiwgIiJdLCBbImlucHV0IiwgInR5cGUiLCAiY2hlY2tib3giLCAibmdNb2RlbCIsICIiXV0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcl9jaGFuZ2VfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uQ2hhbmdlKCRldmVudC50YXJnZXQuY2hlY2tlZCk7IH0pKCJibHVyIiwgZnVuY3Rpb24gQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvcl9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblRvdWNoZWQoKTsgfSk7CiAgICAgICAgfSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtDSEVDS0JPWF9WQUxVRV9BQ0NFU1NPUl0pXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvZGVmYXVsdF92YWx1ZV9hY2Nlc3Nvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUZBVUxUX1ZBTFVFX0FDQ0VTU09SID0gewogICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IERlZmF1bHRWYWx1ZUFjY2Vzc29yKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIFdlIG11c3QgY2hlY2sgd2hldGhlciB0aGUgYWdlbnQgaXMgQW5kcm9pZCBiZWNhdXNlIGNvbXBvc2l0aW9uIGV2ZW50cwogICAgICogYmVoYXZlIGRpZmZlcmVudGx5IGJldHdlZW4gaU9TIGFuZCBBbmRyb2lkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2lzQW5kcm9pZCgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgdXNlckFnZW50ID0gZ2V0RE9NKCkgPyBnZXRET00oKS5nZXRVc2VyQWdlbnQoKSA6ICcnOwogICAgICAgIHJldHVybiAvYW5kcm9pZCAoXGQrKS8udGVzdCh1c2VyQWdlbnQudG9Mb3dlckNhc2UoKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFByb3ZpZGUgdGhpcyB0b2tlbiB0byBjb250cm9sIGlmIGZvcm0gZGlyZWN0aXZlcyBidWZmZXIgSU1FIGlucHV0IHVudGlsCiAgICAgKiB0aGUgImNvbXBvc2l0aW9uZW5kIiBldmVudCBvY2N1cnMuCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENPTVBPU0lUSU9OX0JVRkZFUl9NT0RFID0gbmV3IEluamVjdGlvblRva2VuKCdDb21wb3NpdGlvbkV2ZW50TW9kZScpOwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgZGVmYXVsdCBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIGEgdmFsdWUgYW5kIGxpc3RlbmluZyB0byBjaGFuZ2VzIG9uIGlucHV0CiAgICAgKiBlbGVtZW50cy4gVGhlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQKICAgICAqIGBOZ01vZGVsYCBkaXJlY3RpdmVzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBVc2luZyB0aGUgZGVmYXVsdCB2YWx1ZSBhY2Nlc3NvcgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIGFuIGlucHV0IGVsZW1lbnQgdGhhdCBhY3RpdmF0ZXMgdGhlIGRlZmF1bHQgdmFsdWUgYWNjZXNzb3IKICAgICAqIChpbiB0aGlzIGNhc2UsIGEgdGV4dCBmaWVsZCkuCiAgICAgKgogICAgICogYGBgdHMKICAgICAqIGNvbnN0IGZpcnN0TmFtZUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIGBgYAogICAgICogPGlucHV0IHR5cGU9InRleHQiIFtmb3JtQ29udHJvbF09ImZpcnN0TmFtZUNvbnRyb2wiPgogICAgICogYGBgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBEZWZhdWx0VmFsdWVBY2Nlc3NvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfY29tcG9zaXRpb25Nb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3JlbmRlcmVyLCBfZWxlbWVudFJlZiwgX2NvbXBvc2l0aW9uTW9kZSkgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9jb21wb3NpdGlvbk1vZGUgPSBfY29tcG9zaXRpb25Nb2RlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhbiBpbnB1dCBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgdXNlciBpcyBjcmVhdGluZyBhIGNvbXBvc2l0aW9uIHN0cmluZyAoSU1FIGV2ZW50cykuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jb21wb3NpbmcgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBvc2l0aW9uTW9kZSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb21wb3NpdGlvbk1vZGUgPSAhX2lzQW5kcm9pZCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlICJ2YWx1ZSIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBjaGVja2VkIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgbm9ybWFsaXplZFZhbHVlID0gdmFsdWUgPT0gbnVsbCA/ICcnIDogdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgbm9ybWFsaXplZFZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPbkNoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLm9uQ2hhbmdlID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBpcyB0b3VjaGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlICJkaXNhYmxlZCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVJbnB1dCh2YWx1ZSkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2NvbXBvc2l0aW9uTW9kZSB8fCAodGhpcy5fY29tcG9zaXRpb25Nb2RlICYmICF0aGlzLl9jb21wb3NpbmcpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uQ2hhbmdlKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY29tcG9zaXRpb25TdGFydCgpIHsKICAgICAgICAgICAgdGhpcy5fY29tcG9zaW5nID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jb21wb3NpdGlvbkVuZCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9jb21wb3NpbmcgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY29tcG9zaXRpb25Nb2RlICYmIHRoaXMub25DaGFuZ2UodmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yLsm1ZmFjID0gZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVmYXVsdFZhbHVlQWNjZXNzb3IpKMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDT01QT1NJVElPTl9CVUZGRVJfTU9ERSwgOCkpOyB9OwogICAgRGVmYXVsdFZhbHVlQWNjZXNzb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRGVmYXVsdFZhbHVlQWNjZXNzb3IsIHNlbGVjdG9yczogW1siaW5wdXQiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiIsIDMsICJ0eXBlIiwgImNoZWNrYm94Il0sIFsidGV4dGFyZWEiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbImlucHV0IiwgImZvcm1Db250cm9sIiwgIiIsIDMsICJ0eXBlIiwgImNoZWNrYm94Il0sIFsidGV4dGFyZWEiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiaW5wdXQiLCAibmdNb2RlbCIsICIiLCAzLCAidHlwZSIsICJjaGVja2JveCJdLCBbInRleHRhcmVhIiwgIm5nTW9kZWwiLCAiIl0sIFsiIiwgIm5nRGVmYXVsdENvbnRyb2wiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIERlZmF1bHRWYWx1ZUFjY2Vzc29yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIERlZmF1bHRWYWx1ZUFjY2Vzc29yX2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlSW5wdXQoJGV2ZW50LnRhcmdldC52YWx1ZSk7IH0pKCJibHVyIiwgZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25Ub3VjaGVkKCk7IH0pKCJjb21wb3NpdGlvbnN0YXJ0IiwgZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfY29tcG9zaXRpb25zdGFydF9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX2NvbXBvc2l0aW9uU3RhcnQoKTsgfSkoImNvbXBvc2l0aW9uZW5kIiwgZnVuY3Rpb24gRGVmYXVsdFZhbHVlQWNjZXNzb3JfY29tcG9zaXRpb25lbmRfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9jb21wb3NpdGlvbkVuZCgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSk7CiAgICAgICAgfSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtERUZBVUxUX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBEZWZhdWx0VmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogQm9vbGVhbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtDT01QT1NJVElPTl9CVUZGRVJfTU9ERSxdIH1dIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9hYnN0cmFjdF9jb250cm9sX2RpcmVjdGl2ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEJhc2UgY2xhc3MgZm9yIGNvbnRyb2wgZGlyZWN0aXZlcy4KICAgICAqCiAgICAgKiBUaGlzIGNsYXNzIGlzIG9ubHkgdXNlZCBpbnRlcm5hbGx5IGluIHRoZSBgUmVhY3RpdmVGb3Jtc01vZHVsZWAgYW5kIHRoZSBgRm9ybXNNb2R1bGVgLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB0aGUgdmFsdWUgb2YgdGhlIGNvbnRyb2wgaWYgaXQgaXMgcHJlc2VudCwgb3RoZXJ3aXNlIG51bGwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudmFsdWUgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIHZhbGlkLiBBIGNvbnRyb2wgaXMgY29uc2lkZXJlZCB2YWxpZCBpZiBubwogICAgICAgICAqIHZhbGlkYXRpb24gZXJyb3JzIGV4aXN0IHdpdGggdGhlIGN1cnJlbnQgdmFsdWUuCiAgICAgICAgICogSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wudmFsaWQgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGludmFsaWQsIG1lYW5pbmcgdGhhdCBhbiBlcnJvciBleGlzdHMgaW4gdGhlIGlucHV0IHZhbHVlLgogICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGludmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuaW52YWxpZCA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgYSBjb250cm9sIGlzIHBlbmRpbmcsIG1lYW5pbmcgdGhhdCB0aGF0IGFzeW5jIHZhbGlkYXRpb24gaXMgb2NjdXJyaW5nIGFuZAogICAgICAgICAqIGVycm9ycyBhcmUgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBpbnB1dCB2YWx1ZS4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMKICAgICAgICAgKiByZXR1cm5lZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwZW5kaW5nKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnBlbmRpbmcgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGRpc2FibGVkLCBtZWFuaW5nIHRoYXQgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQKICAgICAgICAgKiBpbiB0aGUgVUkgYW5kIGlzIGV4ZW1wdCBmcm9tIHZhbGlkYXRpb24gY2hlY2tzIGFuZCBleGNsdWRlZCBmcm9tIGFnZ3JlZ2F0ZQogICAgICAgICAqIHZhbHVlcyBvZiBhbmNlc3RvciBjb250cm9scy4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuZGlzYWJsZWQgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGVuYWJsZWQsIG1lYW5pbmcgdGhhdCB0aGUgY29udHJvbCBpcyBpbmNsdWRlZCBpbiBhbmNlc3RvcgogICAgICAgICAqIGNhbGN1bGF0aW9ucyBvZiB2YWxpZGl0eSBvciB2YWx1ZS4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZW5hYmxlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5lbmFibGVkIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlcG9ydHMgdGhlIGNvbnRyb2wncyB2YWxpZGF0aW9uIGVycm9ycy4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZXJyb3JzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLmVycm9ycyA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgcHJpc3RpbmUsIG1lYW5pbmcgdGhhdCB0aGUgdXNlciBoYXMgbm90IHlldCBjaGFuZ2VkCiAgICAgICAgICogdGhlIHZhbHVlIGluIHRoZSBVSS4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcHJpc3RpbmUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wucHJpc3RpbmUgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyB3aGV0aGVyIHRoZSBjb250cm9sIGlzIGRpcnR5LCBtZWFuaW5nIHRoYXQgdGhlIHVzZXIgaGFzIGNoYW5nZWQKICAgICAgICAgKiB0aGUgdmFsdWUgaW4gdGhlIFVJLiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXJ0eSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC5kaXJ0eSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdG91Y2hlZCwgbWVhbmluZyB0aGF0IHRoZSB1c2VyIGhhcyB0cmlnZ2VyZWQKICAgICAgICAgKiBhIGBibHVyYCBldmVudCBvbiBpdC4gSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdG91Y2hlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC50b3VjaGVkIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlcG9ydHMgdGhlIHZhbGlkYXRpb24gc3RhdHVzIG9mIHRoZSBjb250cm9sLiBQb3NzaWJsZSB2YWx1ZXMgaW5jbHVkZToKICAgICAgICAgKiAnVkFMSUQnLCAnSU5WQUxJRCcsICdESVNBQkxFRCcsIGFuZCAnUEVORElORycuCiAgICAgICAgICogSWYgdGhlIGNvbnRyb2wgaXMgbm90IHByZXNlbnQsIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc3RhdHVzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnN0YXR1cyA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgdW50b3VjaGVkLCBtZWFuaW5nIHRoYXQgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgdHJpZ2dlcmVkCiAgICAgICAgICogYSBgYmx1cmAgZXZlbnQgb24gaXQuIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHVudG91Y2hlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC51bnRvdWNoZWQgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhIG11bHRpY2FzdGluZyBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgYSB2YWxpZGF0aW9uIHN0YXR1cyB3aGVuZXZlciBpdCBpcwogICAgICAgICAqIGNhbGN1bGF0ZWQgZm9yIHRoZSBjb250cm9sLiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgbnVsbCBpcyByZXR1cm5lZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzdGF0dXNDaGFuZ2VzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sID8gdGhpcy5jb250cm9sLnN0YXR1c0NoYW5nZXMgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhIG11bHRpY2FzdGluZyBvYnNlcnZhYmxlIG9mIHZhbHVlIGNoYW5nZXMgZm9yIHRoZSBjb250cm9sIHRoYXQgZW1pdHMgZXZlcnkgdGltZSB0aGUKICAgICAgICAgKiB2YWx1ZSBvZiB0aGUgY29udHJvbCBjaGFuZ2VzIGluIHRoZSBVSSBvciBwcm9ncmFtbWF0aWNhbGx5LgogICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBudWxsIGlzIHJldHVybmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZhbHVlQ2hhbmdlcygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbCA/IHRoaXMuY29udHJvbC52YWx1ZUNoYW5nZXMgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggZnJvbSB0aGUgdG9wLWxldmVsIGZvcm0gdG8gdGhpcyBjb250cm9sLgogICAgICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXNldHMgdGhlIGNvbnRyb2wgd2l0aCB0aGUgcHJvdmlkZWQgdmFsdWUgaWYgdGhlIGNvbnRyb2wgaXMgcHJlc2VudC4KICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzZXQodmFsdWUgPSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbCkKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5yZXNldCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGNvbnRyb2wgd2l0aCB0aGUgZ2l2ZW4gcGF0aCBoYXMgdGhlIGVycm9yIHNwZWNpZmllZC4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqIEZvciBleGFtcGxlLCBmb3IgdGhlIGZvbGxvd2luZyBgRm9ybUdyb3VwYDoKICAgICAgICAgKgogICAgICAgICAqIGBgYAogICAgICAgICAqIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAgICAgKiAgIGFkZHJlc3M6IG5ldyBGb3JtR3JvdXAoeyBzdHJlZXQ6IG5ldyBGb3JtQ29udHJvbCgpIH0pCiAgICAgICAgICogfSk7CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgcGF0aCB0byB0aGUgJ3N0cmVldCcgY29udHJvbCBmcm9tIHRoZSByb290IGZvcm0gd291bGQgYmUgJ2FkZHJlc3MnIC0+ICdzdHJlZXQnLgogICAgICAgICAqCiAgICAgICAgICogSXQgY2FuIGJlIHByb3ZpZGVkIHRvIHRoaXMgbWV0aG9kIGluIG9uZSBvZiB0d28gZm9ybWF0czoKICAgICAgICAgKgogICAgICAgICAqIDEuIEFuIGFycmF5IG9mIHN0cmluZyBjb250cm9sIG5hbWVzLCBlLmcuIGBbJ2FkZHJlc3MnLCAnc3RyZWV0J11gCiAgICAgICAgICogMS4gQSBwZXJpb2QtZGVsaW1pdGVkIGxpc3Qgb2YgY29udHJvbCBuYW1lcyBpbiBvbmUgc3RyaW5nLCBlLmcuIGAnYWRkcmVzcy5zdHJlZXQnYAogICAgICAgICAqCiAgICAgICAgICogSWYgbm8gcGF0aCBpcyBnaXZlbiwgdGhpcyBtZXRob2QgY2hlY2tzIGZvciB0aGUgZXJyb3Igb24gdGhlIGN1cnJlbnQgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JDb2RlIFRoZSBjb2RlIG9mIHRoZSBlcnJvciB0byBjaGVjawogICAgICAgICAqIEBwYXJhbSB7Pz19IHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbAogICAgICAgICAqIHRvIHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIGJlIHF1ZXJpZWQgZm9yIGVycm9ycy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IHdoZXRoZXIgdGhlIGdpdmVuIGVycm9yIGlzIHByZXNlbnQgaW4gdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgY29udHJvbCBpcyBub3QgcHJlc2VudCwgZmFsc2UgaXMgcmV0dXJuZWQuCiAgICAgICAgICovCiAgICAgICAgaGFzRXJyb3IoZXJyb3JDb2RlLCBwYXRoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuaGFzRXJyb3IoZXJyb3JDb2RlLCBwYXRoKSA6IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVwb3J0cyBlcnJvciBkYXRhIGZvciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGBGb3JtR3JvdXBgOgogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICogZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICAgICAqICAgYWRkcmVzczogbmV3IEZvcm1Hcm91cCh7IHN0cmVldDogbmV3IEZvcm1Db250cm9sKCkgfSkKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIFRoZSBwYXRoIHRvIHRoZSAnc3RyZWV0JyBjb250cm9sIGZyb20gdGhlIHJvb3QgZm9ybSB3b3VsZCBiZSAnYWRkcmVzcycgLT4gJ3N0cmVldCcuCiAgICAgICAgICoKICAgICAgICAgKiBJdCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhpcyBtZXRob2QgaW4gb25lIG9mIHR3byBmb3JtYXRzOgogICAgICAgICAqCiAgICAgICAgICogMS4gQW4gYXJyYXkgb2Ygc3RyaW5nIGNvbnRyb2wgbmFtZXMsIGUuZy4gYFsnYWRkcmVzcycsICdzdHJlZXQnXWAKICAgICAgICAgKiAxLiBBIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiBjb250cm9sIG5hbWVzIGluIG9uZSBzdHJpbmcsIGUuZy4gYCdhZGRyZXNzLnN0cmVldCdgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGVycm9yQ29kZSBUaGUgY29kZSBvZiB0aGUgZXJyb3IgdG8gY2hlY2sKICAgICAgICAgKiBAcGFyYW0gez89fSBwYXRoIEEgbGlzdCBvZiBjb250cm9sIG5hbWVzIHRoYXQgZGVzaWduYXRlcyBob3cgdG8gbW92ZSBmcm9tIHRoZSBjdXJyZW50IGNvbnRyb2wKICAgICAgICAgKiB0byB0aGUgY29udHJvbCB0aGF0IHNob3VsZCBiZSBxdWVyaWVkIGZvciBlcnJvcnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBlcnJvciBkYXRhIGZvciB0aGF0IHBhcnRpY3VsYXIgZXJyb3IuIElmIHRoZSBjb250cm9sIG9yIGVycm9yIGlzIG5vdCBwcmVzZW50LAogICAgICAgICAqIG51bGwgaXMgcmV0dXJuZWQuCiAgICAgICAgICovCiAgICAgICAgZ2V0RXJyb3IoZXJyb3JDb2RlLCBwYXRoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2wgPyB0aGlzLmNvbnRyb2wuZ2V0RXJyb3IoZXJyb3JDb2RlLCBwYXRoKSA6IG51bGw7CiAgICAgICAgfQogICAgfQogICAgQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlLsm1ZmFjID0gZnVuY3Rpb24gQWJzdHJhY3RDb250cm9sRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZSkoKTsgfTsKICAgIEFic3RyYWN0Q29udHJvbERpcmVjdGl2ZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9jb250cm9sX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgYmFzZSBjbGFzcyBmb3IgZGlyZWN0aXZlcyB0aGF0IGNvbnRhaW4gbXVsdGlwbGUgcmVnaXN0ZXJlZCBpbnN0YW5jZXMgb2YgYE5nQ29udHJvbGAuCiAgICAgKiBPbmx5IHVzZWQgYnkgdGhlIGZvcm1zIG1vZHVsZS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIENvbnRyb2xDb250YWluZXIgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUgewogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgdG9wLWxldmVsIGZvcm0gZGlyZWN0aXZlIGZvciB0aGUgY29udHJvbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgfQogICAgQ29udHJvbENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIENvbnRyb2xDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiDJtUNvbnRyb2xDb250YWluZXJfQmFzZUZhY3RvcnkodCB8fCBDb250cm9sQ29udGFpbmVyKTsgfTsKICAgIENvbnRyb2xDb250YWluZXIuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ29udHJvbENvbnRhaW5lciwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIGNvbnN0IMm1Q29udHJvbENvbnRhaW5lcl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KENvbnRyb2xDb250YWluZXIpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvbmdfY29udHJvbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHVuaW1wbGVtZW50ZWQoKSB7CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmltcGxlbWVudGVkJyk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgYmFzZSBjbGFzcyB0aGF0IGFsbCBjb250cm9sIGBGb3JtQ29udHJvbGAtYmFzZWQgZGlyZWN0aXZlcyBleHRlbmQuIEl0IGJpbmRzIGEgYEZvcm1Db250cm9sYAogICAgICogb2JqZWN0IHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBOZ0NvbnRyb2wgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmUgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgcGFyZW50IGZvcm0gZm9yIHRoZSBjb250cm9sLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgbmFtZSBmb3IgdGhlIGNvbnRyb2wKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubmFtZSA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSB2YWx1ZSBhY2Nlc3NvciBmb3IgdGhlIGNvbnRyb2wKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSB1bmNvbXBvc2VkIGFycmF5IG9mIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgZm9yIHRoZSBjb250cm9sCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3Jhd1ZhbGlkYXRvcnMgPSBbXTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogVGhlIHVuY29tcG9zZWQgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9ycyBmb3IgdGhlIGNvbnRyb2wKICAgICAgICAgICAgICoKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmF3QXN5bmNWYWxpZGF0b3JzID0gW107CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24gZm9yIHRoZSBjb250cm9sCiAgICAgICAgICoKICAgICAgICAgKiBAdGhyb3dzIEFuIGV4Y2VwdGlvbiB0aGF0IHRoaXMgbWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZhbGlkYXRvcigpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh1bmltcGxlbWVudGVkKCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBmb3IgdGhlIGNvbnRyb2wKICAgICAgICAgKgogICAgICAgICAqIEB0aHJvd3MgQW4gZXhjZXB0aW9uIHRoYXQgdGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXN5bmNWYWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodW5pbXBsZW1lbnRlZCgpKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvbmdfY29udHJvbF9zdGF0dXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQWJzdHJhY3RDb250cm9sU3RhdHVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY2QpIHsKICAgICAgICAgICAgdGhpcy5fY2QgPSBjZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmdDbGFzc1VudG91Y2hlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLnVudG91Y2hlZCA6IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBuZ0NsYXNzVG91Y2hlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NkLmNvbnRyb2wgPyB0aGlzLl9jZC5jb250cm9sLnRvdWNoZWQgOiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmdDbGFzc1ByaXN0aW5lKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wucHJpc3RpbmUgOiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmdDbGFzc0RpcnR5KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wuZGlydHkgOiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmdDbGFzc1ZhbGlkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wudmFsaWQgOiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmdDbGFzc0ludmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jZC5jb250cm9sID8gdGhpcy5fY2QuY29udHJvbC5pbnZhbGlkIDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG5nQ2xhc3NQZW5kaW5nKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2QuY29udHJvbCA/IHRoaXMuX2NkLmNvbnRyb2wucGVuZGluZyA6IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogRGlyZWN0aXZlIGF1dG9tYXRpY2FsbHkgYXBwbGllZCB0byBBbmd1bGFyIGZvcm0gY29udHJvbHMgdGhhdCBzZXRzIENTUyBjbGFzc2VzCiAgICAgKiBiYXNlZCBvbiBjb250cm9sIHN0YXR1cy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgQ1NTIGNsYXNzZXMgYXBwbGllZAogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBhcmUgYXBwbGllZCBhcyB0aGUgcHJvcGVydGllcyBiZWNvbWUgdHJ1ZToKICAgICAqCiAgICAgKiAqIG5nLXZhbGlkCiAgICAgKiAqIG5nLWludmFsaWQKICAgICAqICogbmctcGVuZGluZwogICAgICogKiBuZy1wcmlzdGluZQogICAgICogKiBuZy1kaXJ0eQogICAgICogKiBuZy11bnRvdWNoZWQKICAgICAqICogbmctdG91Y2hlZAogICAgICoKICAgICAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogICAgICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTmdDb250cm9sU3RhdHVzIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sU3RhdHVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY2QpIHsKICAgICAgICAgICAgc3VwZXIoY2QpOwogICAgICAgIH0KICAgIH0KICAgIE5nQ29udHJvbFN0YXR1cy7JtWZhYyA9IGZ1bmN0aW9uIE5nQ29udHJvbFN0YXR1c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ0NvbnRyb2xTdGF0dXMpKMm1ybVkaXJlY3RpdmVJbmplY3QoTmdDb250cm9sLCAyKSk7IH07CiAgICBOZ0NvbnRyb2xTdGF0dXMuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdDb250cm9sU3RhdHVzLCBzZWxlY3RvcnM6IFtbIiIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiIiwgIm5nTW9kZWwiLCAiIl0sIFsiIiwgImZvcm1Db250cm9sIiwgIiJdXSwgaG9zdFZhcnM6IDE0LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE5nQ29udHJvbFN0YXR1c19Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm5nLXVudG91Y2hlZCIsIGN0eC5uZ0NsYXNzVW50b3VjaGVkKSgibmctdG91Y2hlZCIsIGN0eC5uZ0NsYXNzVG91Y2hlZCkoIm5nLXByaXN0aW5lIiwgY3R4Lm5nQ2xhc3NQcmlzdGluZSkoIm5nLWRpcnR5IiwgY3R4Lm5nQ2xhc3NEaXJ0eSkoIm5nLXZhbGlkIiwgY3R4Lm5nQ2xhc3NWYWxpZCkoIm5nLWludmFsaWQiLCBjdHgubmdDbGFzc0ludmFsaWQpKCJuZy1wZW5kaW5nIiwgY3R4Lm5nQ2xhc3NQZW5kaW5nKTsKICAgICAgICB9IH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE5nQ29udHJvbFN0YXR1cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE5nQ29udHJvbCwgZGVjb3JhdG9yczogW3sgdHlwZTogU2VsZiB9XSB9CiAgICBdOwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBEaXJlY3RpdmUgYXV0b21hdGljYWxseSBhcHBsaWVkIHRvIEFuZ3VsYXIgZm9ybSBncm91cHMgdGhhdCBzZXRzIENTUyBjbGFzc2VzCiAgICAgKiBiYXNlZCBvbiBjb250cm9sIHN0YXR1cyAodmFsaWQvaW52YWxpZC9kaXJ0eS9ldGMpLgogICAgICoKICAgICAqIEBzZWUgYE5nQ29udHJvbFN0YXR1c2AKICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIE5nQ29udHJvbFN0YXR1c0dyb3VwIGV4dGVuZHMgQWJzdHJhY3RDb250cm9sU3RhdHVzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY2QpIHsKICAgICAgICAgICAgc3VwZXIoY2QpOwogICAgICAgIH0KICAgIH0KICAgIE5nQ29udHJvbFN0YXR1c0dyb3VwLsm1ZmFjID0gZnVuY3Rpb24gTmdDb250cm9sU3RhdHVzR3JvdXBfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdDb250cm9sU3RhdHVzR3JvdXApKMm1ybVkaXJlY3RpdmVJbmplY3QoQ29udHJvbENvbnRhaW5lciwgMikpOyB9OwogICAgTmdDb250cm9sU3RhdHVzR3JvdXAuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdDb250cm9sU3RhdHVzR3JvdXAsIHNlbGVjdG9yczogW1siIiwgImZvcm1Hcm91cE5hbWUiLCAiIl0sIFsiIiwgImZvcm1BcnJheU5hbWUiLCAiIl0sIFsiIiwgIm5nTW9kZWxHcm91cCIsICIiXSwgWyIiLCAiZm9ybUdyb3VwIiwgIiJdLCBbImZvcm0iLCAzLCAibmdOb0Zvcm0iLCAiIl0sIFsiIiwgIm5nRm9ybSIsICIiXV0sIGhvc3RWYXJzOiAxNCwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBOZ0NvbnRyb2xTdGF0dXNHcm91cF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm5nLXVudG91Y2hlZCIsIGN0eC5uZ0NsYXNzVW50b3VjaGVkKSgibmctdG91Y2hlZCIsIGN0eC5uZ0NsYXNzVG91Y2hlZCkoIm5nLXByaXN0aW5lIiwgY3R4Lm5nQ2xhc3NQcmlzdGluZSkoIm5nLWRpcnR5IiwgY3R4Lm5nQ2xhc3NEaXJ0eSkoIm5nLXZhbGlkIiwgY3R4Lm5nQ2xhc3NWYWxpZCkoIm5nLWludmFsaWQiLCBjdHgubmdDbGFzc0ludmFsaWQpKCJuZy1wZW5kaW5nIiwgY3R4Lm5nQ2xhc3NQZW5kaW5nKTsKICAgICAgICB9IH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE5nQ29udHJvbFN0YXR1c0dyb3VwLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQ29udHJvbENvbnRhaW5lciwgZGVjb3JhdG9yczogW3sgdHlwZTogU2VsZiB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL3ZhbGlkYXRvcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0VtcHR5SW5wdXRWYWx1ZSh2YWx1ZSkgewogICAgICAgIC8vIHdlIGRvbid0IGNoZWNrIGZvciBzdHJpbmcgaGVyZSBzbyBpdCBhbHNvIHdvcmtzIHdpdGggYXJyYXlzCiAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGwgfHwgdmFsdWUubGVuZ3RoID09PSAwOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBbiBgSW5qZWN0aW9uVG9rZW5gIGZvciByZWdpc3RlcmluZyBhZGRpdGlvbmFsIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdXNlZCB3aXRoCiAgICAgKiBgQWJzdHJhY3RDb250cm9sYHMuCiAgICAgKgogICAgICogQHNlZSBgTkdfQVNZTkNfVkFMSURBVE9SU2AKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgUHJvdmlkaW5nIGEgY3VzdG9tIHZhbGlkYXRvcgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSByZWdpc3RlcnMgYSBjdXN0b20gdmFsaWRhdG9yIGRpcmVjdGl2ZS4gQWRkaW5nIHRoZSB2YWxpZGF0b3IgdG8gdGhlCiAgICAgKiBleGlzdGluZyBjb2xsZWN0aW9uIG9mIHZhbGlkYXRvcnMgcmVxdWlyZXMgdGhlIGBtdWx0aTogdHJ1ZWAgb3B0aW9uLgogICAgICoKICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAqIFxARGlyZWN0aXZlKHsKICAgICAqICAgc2VsZWN0b3I6ICdbY3VzdG9tVmFsaWRhdG9yXScsCiAgICAgKiAgIHByb3ZpZGVyczogW3twcm92aWRlOiBOR19WQUxJREFUT1JTLCB1c2VFeGlzdGluZzogQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlLCBtdWx0aTogdHJ1ZX1dCiAgICAgKiB9KQogICAgICogY2xhc3MgQ3VzdG9tVmFsaWRhdG9yRGlyZWN0aXZlIGltcGxlbWVudHMgVmFsaWRhdG9yIHsKICAgICAqICAgdmFsaWRhdGUoY29udHJvbDogQWJzdHJhY3RDb250cm9sKTogVmFsaWRhdGlvbkVycm9ycyB8IG51bGwgewogICAgICogICAgIHJldHVybiB7ICdjdXN0b20nOiB0cnVlIH07CiAgICAgKiAgIH0KICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTkdfVkFMSURBVE9SUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTmdWYWxpZGF0b3JzJyk7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEFuIGBJbmplY3Rpb25Ub2tlbmAgZm9yIHJlZ2lzdGVyaW5nIGFkZGl0aW9uYWwgYXN5bmNocm9ub3VzIHZhbGlkYXRvcnMgdXNlZCB3aXRoCiAgICAgKiBgQWJzdHJhY3RDb250cm9sYHMuCiAgICAgKgogICAgICogQHNlZSBgTkdfVkFMSURBVE9SU2AKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE5HX0FTWU5DX1ZBTElEQVRPUlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ05nQXN5bmNWYWxpZGF0b3JzJyk7CiAgICAvKioKICAgICAqIEEgcmVndWxhciBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyB2YWxpZCBlLW1haWwgYWRkcmVzc2VzLgogICAgICoKICAgICAqIEF0IGEgaGlnaCBsZXZlbCwgdGhpcyByZWdleHAgbWF0Y2hlcyBlLW1haWwgYWRkcmVzc2VzIG9mIHRoZSBmb3JtYXQgYGxvY2FsLXBhcnRcQHRsZGAsIHdoZXJlOgogICAgICogLSBgbG9jYWwtcGFydGAgY29uc2lzdHMgb2Ygb25lIG9yIG1vcmUgb2YgdGhlIGFsbG93ZWQgY2hhcmFjdGVycyAoYWxwaGFudW1lcmljIGFuZCBzb21lCiAgICAgKiAgIHB1bmN0dWF0aW9uIHN5bWJvbHMpLgogICAgICogLSBgbG9jYWwtcGFydGAgY2Fubm90IGJlZ2luIG9yIGVuZCB3aXRoIGEgcGVyaW9kIChgLmApLgogICAgICogLSBgbG9jYWwtcGFydGAgY2Fubm90IGJlIGxvbmdlciB0aGFuIDY0IGNoYXJhY3RlcnMuCiAgICAgKiAtIGB0bGRgIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIGBsYWJlbHNgIHNlcGFyYXRlZCBieSBwZXJpb2RzIChgLmApLiBGb3IgZXhhbXBsZSBgbG9jYWxob3N0YCBvcgogICAgICogICBgZm9vLmNvbWAuCiAgICAgKiAtIEEgYGxhYmVsYCBjb25zaXN0cyBvZiBvbmUgb3IgbW9yZSBvZiB0aGUgYWxsb3dlZCBjaGFyYWN0ZXJzIChhbHBoYW51bWVyaWMsIGRhc2hlcyAoYC1gKSBhbmQKICAgICAqICAgcGVyaW9kcyAoYC5gKSkuCiAgICAgKiAtIEEgYGxhYmVsYCBjYW5ub3QgYmVnaW4gb3IgZW5kIHdpdGggYSBkYXNoIChgLWApIG9yIGEgcGVyaW9kIChgLmApLgogICAgICogLSBBIGBsYWJlbGAgY2Fubm90IGJlIGxvbmdlciB0aGFuIDYzIGNoYXJhY3RlcnMuCiAgICAgKiAtIFRoZSB3aG9sZSBhZGRyZXNzIGNhbm5vdCBiZSBsb25nZXIgdGhhbiAyNTQgY2hhcmFjdGVycy4KICAgICAqCiAgICAgKiAjIyBJbXBsZW1lbnRhdGlvbiBiYWNrZ3JvdW5kCiAgICAgKgogICAgICogVGhpcyByZWdleHAgd2FzIHBvcnRlZCBvdmVyIGZyb20gQW5ndWxhckpTIChzZWUgdGhlcmUgZm9yIGdpdCBoaXN0b3J5KToKICAgICAqIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIuanMvYmxvYi9jMTMzZWY4MzYvc3JjL25nL2RpcmVjdGl2ZS9pbnB1dC5qcyNMMjcKICAgICAqIEl0IGlzIGJhc2VkIG9uIHRoZQogICAgICogW1dIQVRXRyB2ZXJzaW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI3ZhbGlkLWUtbWFpbC1hZGRyZXNzKSB3aXRoCiAgICAgKiBzb21lIGVuaGFuY2VtZW50cyB0byBpbmNvcnBvcmF0ZSBtb3JlIFJGQyBydWxlcyAoc3VjaCBhcyBydWxlcyByZWxhdGVkIHRvIGRvbWFpbiBuYW1lcyBhbmQgdGhlCiAgICAgKiBsZW5ndGhzIG9mIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgYWRkcmVzcykuIFRoZSBtYWluIGRpZmZlcmVuY2VzIGZyb20gdGhlIFdIQVRXRyB2ZXJzaW9uIGFyZToKICAgICAqICAgLSBEaXNhbGxvdyBgbG9jYWwtcGFydGAgdG8gYmVnaW4gb3IgZW5kIHdpdGggYSBwZXJpb2QgKGAuYCkuCiAgICAgKiAgIC0gRGlzYWxsb3cgYGxvY2FsLXBhcnRgIGxlbmd0aCB0byBleGNlZWQgNjQgY2hhcmFjdGVycy4KICAgICAqICAgLSBEaXNhbGxvdyB0b3RhbCBhZGRyZXNzIGxlbmd0aCB0byBleGNlZWQgMjU0IGNoYXJhY3RlcnMuCiAgICAgKgogICAgICogU2VlIFt0aGlzIGNvbW1pdF0oaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci5qcy9jb21taXQvZjNmNWNmNzJlKSBmb3IgbW9yZSBkZXRhaWxzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEVNQUlMX1JFR0VYUCA9IC9eKD89LnsxLDI1NH0kKSg/PS57MSw2NH1AKVthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSsoPzpcLlthLXpBLVowLTkhIyQlJicqKy89P15fYHt8fX4tXSspKkBbYS16QS1aMC05XSg/OlthLXpBLVowLTktXXswLDYxfVthLXpBLVowLTldKT8oPzpcLlthLXpBLVowLTldKD86W2EtekEtWjAtOS1dezAsNjF9W2EtekEtWjAtOV0pPykqJC87CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFByb3ZpZGVzIGEgc2V0IG9mIGJ1aWx0LWluIHZhbGlkYXRvcnMgdGhhdCBjYW4gYmUgdXNlZCBieSBmb3JtIGNvbnRyb2xzLgogICAgICoKICAgICAqIEEgdmFsaWRhdG9yIGlzIGEgZnVuY3Rpb24gdGhhdCBwcm9jZXNzZXMgYSBgRm9ybUNvbnRyb2xgIG9yIGNvbGxlY3Rpb24gb2YKICAgICAqIGNvbnRyb2xzIGFuZCByZXR1cm5zIGFuIGVycm9yIG1hcCBvciBudWxsLiBBIG51bGwgbWFwIG1lYW5zIHRoYXQgdmFsaWRhdGlvbiBoYXMgcGFzc2VkLgogICAgICoKICAgICAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oL2d1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBWYWxpZGF0b3JzIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG51bWJlci4KICAgICAgICAgKiBUaGUgdmFsaWRhdG9yIGV4aXN0cyBvbmx5IGFzIGEgZnVuY3Rpb24gYW5kIG5vdCBhcyBhIGRpcmVjdGl2ZS4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqCiAgICAgICAgICogIyMjIFZhbGlkYXRlIGFnYWluc3QgYSBtaW5pbXVtIG9mIDMKICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKDIsIFZhbGlkYXRvcnMubWluKDMpKTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge21pbjoge21pbjogMywgYWN0dWFsOiAyfX0KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gbWluCiAgICAgICAgICogQHJldHVybiB7P30gQSB2YWxpZGF0b3IgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIGVycm9yIG1hcCB3aXRoIHRoZQogICAgICAgICAqIGBtaW5gIHByb3BlcnR5IGlmIHRoZSB2YWxpZGF0aW9uIGNoZWNrIGZhaWxzLCBvdGhlcndpc2UgYG51bGxgLgogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG1pbihtaW4pIHsKICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGlzRW1wdHlJbnB1dFZhbHVlKGNvbnRyb2wudmFsdWUpIHx8IGlzRW1wdHlJbnB1dFZhbHVlKG1pbikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IG9wdGlvbmFsIGNvbnRyb2xzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IHBhcnNlRmxvYXQoY29udHJvbC52YWx1ZSk7CiAgICAgICAgICAgICAgICAvLyBDb250cm9scyB3aXRoIE5hTiB2YWx1ZXMgYWZ0ZXIgcGFyc2luZyBzaG91bGQgYmUgdHJlYXRlZCBhcyBub3QgaGF2aW5nIGEKICAgICAgICAgICAgICAgIC8vIG1pbmltdW0sIHBlciB0aGUgSFRNTCBmb3JtcyBzcGVjOiBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZm9ybXMuaHRtbCNhdHRyLWlucHV0LW1pbgogICAgICAgICAgICAgICAgcmV0dXJuICFpc05hTih2YWx1ZSkgJiYgdmFsdWUgPCBtaW4gPyB7ICdtaW4nOiB7ICdtaW4nOiBtaW4sICdhY3R1YWwnOiBjb250cm9sLnZhbHVlIH0gfSA6IG51bGw7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSB0byBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHByb3ZpZGVkIG51bWJlci4KICAgICAgICAgKiBUaGUgdmFsaWRhdG9yIGV4aXN0cyBvbmx5IGFzIGEgZnVuY3Rpb24gYW5kIG5vdCBhcyBhIGRpcmVjdGl2ZS4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqCiAgICAgICAgICogIyMjIFZhbGlkYXRlIGFnYWluc3QgYSBtYXhpbXVtIG9mIDE1CiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgxNiwgVmFsaWRhdG9ycy5tYXgoMTUpKTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge21heDoge21heDogMTUsIGFjdHVhbDogMTZ9fQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHNlZSBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBtYXgKICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIHZhbGlkYXRvciBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWFwIHdpdGggdGhlCiAgICAgICAgICogYG1heGAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgbWF4KG1heCkgewogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eUlucHV0VmFsdWUoY29udHJvbC52YWx1ZSkgfHwgaXNFbXB0eUlucHV0VmFsdWUobWF4KSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gcGFyc2VGbG9hdChjb250cm9sLnZhbHVlKTsKICAgICAgICAgICAgICAgIC8vIENvbnRyb2xzIHdpdGggTmFOIHZhbHVlcyBhZnRlciBwYXJzaW5nIHNob3VsZCBiZSB0cmVhdGVkIGFzIG5vdCBoYXZpbmcgYQogICAgICAgICAgICAgICAgLy8gbWF4aW11bSwgcGVyIHRoZSBIVE1MIGZvcm1zIHNwZWM6IGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9mb3Jtcy5odG1sI2F0dHItaW5wdXQtbWF4CiAgICAgICAgICAgICAgICByZXR1cm4gIWlzTmFOKHZhbHVlKSAmJiB2YWx1ZSA+IG1heCA/IHsgJ21heCc6IHsgJ21heCc6IG1heCwgJ2FjdHVhbCc6IGNvbnRyb2wudmFsdWUgfSB9IDogbnVsbDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyB0aGUgY29udHJvbCBoYXZlIGEgbm9uLWVtcHR5IHZhbHVlLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICoKICAgICAgICAgKiAjIyMgVmFsaWRhdGUgdGhhdCB0aGUgZmllbGQgaXMgbm9uLWVtcHR5CiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgVmFsaWRhdG9ycy5yZXF1aXJlZCk7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHtyZXF1aXJlZDogdHJ1ZX0KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99IEFuIGVycm9yIG1hcCB3aXRoIHRoZSBgcmVxdWlyZWRgIHByb3BlcnR5CiAgICAgICAgICogaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgcmVxdWlyZWQoY29udHJvbCkgewogICAgICAgICAgICByZXR1cm4gaXNFbXB0eUlucHV0VmFsdWUoY29udHJvbC52YWx1ZSkgPyB7ICdyZXF1aXJlZCc6IHRydWUgfSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBWYWxpZGF0b3IgdGhhdCByZXF1aXJlcyB0aGUgY29udHJvbCdzIHZhbHVlIGJlIHRydWUuIFRoaXMgdmFsaWRhdG9yIGlzIGNvbW1vbmx5CiAgICAgICAgICogdXNlZCBmb3IgcmVxdWlyZWQgY2hlY2tib3hlcy4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqCiAgICAgICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIHZhbHVlIGlzIHRydWUKICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkVHJ1ZSk7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLmVycm9ycyk7IC8vIHtyZXF1aXJlZDogdHJ1ZX0KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99IEFuIGVycm9yIG1hcCB0aGF0IGNvbnRhaW5zIHRoZSBgcmVxdWlyZWRgIHByb3BlcnR5CiAgICAgICAgICogc2V0IHRvIGB0cnVlYCBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyByZXF1aXJlZFRydWUoY29udHJvbCkgewogICAgICAgICAgICByZXR1cm4gY29udHJvbC52YWx1ZSA9PT0gdHJ1ZSA/IG51bGwgOiB7ICdyZXF1aXJlZCc6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBjb250cm9sJ3MgdmFsdWUgcGFzcyBhbiBlbWFpbCB2YWxpZGF0aW9uIHRlc3QuCiAgICAgICAgICoKICAgICAgICAgKiBUZXN0cyB0aGUgdmFsdWUgdXNpbmcgYSBbcmVndWxhcgogICAgICAgICAqIGV4cHJlc3Npb25dKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvR3VpZGUvUmVndWxhcl9FeHByZXNzaW9ucykKICAgICAgICAgKiBwYXR0ZXJuIHN1aXRhYmxlIGZvciBjb21tb24gdXNlY2FzZXMuIFRoZSBwYXR0ZXJuIGlzIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uIG9mIGEgdmFsaWQgZW1haWwKICAgICAgICAgKiBhZGRyZXNzIGluIHRoZSBbV0hBVFdHIEhUTUwKICAgICAgICAgKiBzcGVjaWZpY2F0aW9uXShodHRwczovL2h0bWwuc3BlYy53aGF0d2cub3JnL211bHRpcGFnZS9pbnB1dC5odG1sI3ZhbGlkLWUtbWFpbC1hZGRyZXNzKSB3aXRoCiAgICAgICAgICogc29tZSBlbmhhbmNlbWVudHMgdG8gaW5jb3Jwb3JhdGUgbW9yZSBSRkMgcnVsZXMgKHN1Y2ggYXMgcnVsZXMgcmVsYXRlZCB0byBkb21haW4gbmFtZXMgYW5kIHRoZQogICAgICAgICAqIGxlbmd0aHMgb2YgZGlmZmVyZW50IHBhcnRzIG9mIHRoZSBhZGRyZXNzKS4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBkaWZmZXJlbmNlcyBmcm9tIHRoZSBXSEFUV0cgdmVyc2lvbiBpbmNsdWRlOgogICAgICAgICAqIC0gRGlzYWxsb3cgYGxvY2FsLXBhcnRgICh0aGUgcGFydCBiZWZvcmUgdGhlIGBcQGAgc3ltYm9sKSB0byBiZWdpbiBvciBlbmQgd2l0aCBhIHBlcmlvZCAoYC5gKS4KICAgICAgICAgKiAtIERpc2FsbG93IGBsb2NhbC1wYXJ0YCB0byBiZSBsb25nZXIgdGhhbiA2NCBjaGFyYWN0ZXJzLgogICAgICAgICAqIC0gRGlzYWxsb3cgdGhlIHdob2xlIGFkZHJlc3MgdG8gYmUgbG9uZ2VyIHRoYW4gMjU0IGNoYXJhY3RlcnMuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGlzIHBhdHRlcm4gZG9lcyBub3Qgc2F0aXNmeSB5b3VyIGJ1c2luZXNzIG5lZWRzLCB5b3UgY2FuIHVzZSBgVmFsaWRhdG9ycy5wYXR0ZXJuKClgIHRvCiAgICAgICAgICogdmFsaWRhdGUgdGhlIHZhbHVlIGFnYWluc3QgYSBkaWZmZXJlbnQgcGF0dGVybi4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqCiAgICAgICAgICogIyMjIFZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIG1hdGNoZXMgYSB2YWxpZCBlbWFpbCBwYXR0ZXJuCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnYmFkXEAnLCBWYWxpZGF0b3JzLmVtYWlsKTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge2VtYWlsOiB0cnVlfQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHNlZSBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30gQW4gZXJyb3IgbWFwIHdpdGggdGhlIGBlbWFpbGAgcHJvcGVydHkKICAgICAgICAgKiBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBlbWFpbChjb250cm9sKSB7CiAgICAgICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7IC8vIGRvbid0IHZhbGlkYXRlIGVtcHR5IHZhbHVlcyB0byBhbGxvdyBvcHRpb25hbCBjb250cm9scwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBFTUFJTF9SRUdFWFAudGVzdChjb250cm9sLnZhbHVlKSA/IG51bGwgOiB7ICdlbWFpbCc6IHRydWUgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFZhbGlkYXRvciB0aGF0IHJlcXVpcmVzIHRoZSBsZW5ndGggb2YgdGhlIGNvbnRyb2wncyB2YWx1ZSB0byBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwKICAgICAgICAgKiB0byB0aGUgcHJvdmlkZWQgbWluaW11bSBsZW5ndGguIFRoaXMgdmFsaWRhdG9yIGlzIGFsc28gcHJvdmlkZWQgYnkgZGVmYXVsdCBpZiB5b3UgdXNlIHRoZQogICAgICAgICAqIHRoZSBIVE1MNSBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuIE5vdGUgdGhhdCB0aGUgYG1pbkxlbmd0aGAgdmFsaWRhdG9yIGlzIGludGVuZGVkIHRvIGJlIHVzZWQKICAgICAgICAgKiBvbmx5IGZvciB0eXBlcyB0aGF0IGhhdmUgYSBudW1lcmljIGBsZW5ndGhgIHByb3BlcnR5LCBzdWNoIGFzIHN0cmluZ3Mgb3IgYXJyYXlzLiBUaGUKICAgICAgICAgKiBgbWluTGVuZ3RoYCB2YWxpZGF0b3IgbG9naWMgaXMgYWxzbyBub3QgaW52b2tlZCBmb3IgdmFsdWVzIHdoZW4gdGhlaXIgYGxlbmd0aGAgcHJvcGVydHkgaXMgMAogICAgICAgICAqIChmb3IgZXhhbXBsZSBpbiBjYXNlIG9mIGFuIGVtcHR5IHN0cmluZyBvciBhbiBlbXB0eSBhcnJheSksIHRvIHN1cHBvcnQgb3B0aW9uYWwgY29udHJvbHMuIFlvdQogICAgICAgICAqIGNhbiB1c2UgdGhlIHN0YW5kYXJkIGByZXF1aXJlZGAgdmFsaWRhdG9yIGlmIGVtcHR5IHZhbHVlcyBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdmFsaWQuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKgogICAgICAgICAqICMjIyBWYWxpZGF0ZSB0aGF0IHRoZSBmaWVsZCBoYXMgYSBtaW5pbXVtIG9mIDMgY2hhcmFjdGVycwogICAgICAgICAqCiAgICAgICAgICogYGBgdHlwZXNjcmlwdAogICAgICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woJ25nJywgVmFsaWRhdG9ycy5taW5MZW5ndGgoMykpOwogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7bWlubGVuZ3RoOiB7cmVxdWlyZWRMZW5ndGg6IDMsIGFjdHVhbExlbmd0aDogMn19CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBgYGBodG1sCiAgICAgICAgICogPGlucHV0IG1pbmxlbmd0aD0iNSI+CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG1pbkxlbmd0aAogICAgICAgICAqIEByZXR1cm4gez99IEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGUKICAgICAgICAgKiBgbWlubGVuZ3RoYCBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBtaW5MZW5ndGgobWluTGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgICAgIGlmIChpc0VtcHR5SW5wdXRWYWx1ZShjb250cm9sLnZhbHVlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOyAvLyBkb24ndCB2YWxpZGF0ZSBlbXB0eSB2YWx1ZXMgdG8gYWxsb3cgb3B0aW9uYWwgY29udHJvbHMKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGNvbnRyb2wudmFsdWUgPyBjb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoIDwgbWluTGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICB7ICdtaW5sZW5ndGgnOiB7ICdyZXF1aXJlZExlbmd0aCc6IG1pbkxlbmd0aCwgJ2FjdHVhbExlbmd0aCc6IGxlbmd0aCB9IH0gOgogICAgICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGxlbmd0aCBvZiB0aGUgY29udHJvbCdzIHZhbHVlIHRvIGJlIGxlc3MgdGhhbiBvciBlcXVhbAogICAgICAgICAqIHRvIHRoZSBwcm92aWRlZCBtYXhpbXVtIGxlbmd0aC4gVGhpcyB2YWxpZGF0b3IgaXMgYWxzbyBwcm92aWRlZCBieSBkZWZhdWx0IGlmIHlvdSB1c2UgdGhlCiAgICAgICAgICogdGhlIEhUTUw1IGBtYXhsZW5ndGhgIGF0dHJpYnV0ZS4gTm90ZSB0aGF0IHRoZSBgbWF4TGVuZ3RoYCB2YWxpZGF0b3IgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZAogICAgICAgICAqIG9ubHkgZm9yIHR5cGVzIHRoYXQgaGF2ZSBhIG51bWVyaWMgYGxlbmd0aGAgcHJvcGVydHksIHN1Y2ggYXMgc3RyaW5ncyBvciBhcnJheXMuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKgogICAgICAgICAqICMjIyBWYWxpZGF0ZSB0aGF0IHRoZSBmaWVsZCBoYXMgbWF4aW11bSBvZiA1IGNoYXJhY3RlcnMKICAgICAgICAgKgogICAgICAgICAqIGBgYHR5cGVzY3JpcHQKICAgICAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdBbmd1bGFyJywgVmFsaWRhdG9ycy5tYXhMZW5ndGgoNSkpOwogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2coY29udHJvbC5lcnJvcnMpOyAvLyB7bWF4bGVuZ3RoOiB7cmVxdWlyZWRMZW5ndGg6IDUsIGFjdHVhbExlbmd0aDogN319CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBgYGBodG1sCiAgICAgICAgICogPGlucHV0IG1heGxlbmd0aD0iNSI+CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG1heExlbmd0aAogICAgICAgICAqIEByZXR1cm4gez99IEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGUKICAgICAgICAgKiBgbWF4bGVuZ3RoYCBwcm9wZXJ0eSBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBtYXhMZW5ndGgobWF4TGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGxlbmd0aCA9IGNvbnRyb2wudmFsdWUgPyBjb250cm9sLnZhbHVlLmxlbmd0aCA6IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gbGVuZ3RoID4gbWF4TGVuZ3RoID8KICAgICAgICAgICAgICAgICAgICB7ICdtYXhsZW5ndGgnOiB7ICdyZXF1aXJlZExlbmd0aCc6IG1heExlbmd0aCwgJ2FjdHVhbExlbmd0aCc6IGxlbmd0aCB9IH0gOgogICAgICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVmFsaWRhdG9yIHRoYXQgcmVxdWlyZXMgdGhlIGNvbnRyb2wncyB2YWx1ZSB0byBtYXRjaCBhIHJlZ2V4IHBhdHRlcm4uIFRoaXMgdmFsaWRhdG9yIGlzIGFsc28KICAgICAgICAgKiBwcm92aWRlZCBieSBkZWZhdWx0IGlmIHlvdSB1c2UgdGhlIEhUTUw1IGBwYXR0ZXJuYCBhdHRyaWJ1dGUuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKgogICAgICAgICAqICMjIyBWYWxpZGF0ZSB0aGF0IHRoZSBmaWVsZCBvbmx5IGNvbnRhaW5zIGxldHRlcnMgb3Igc3BhY2VzCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0eXBlc2NyaXB0CiAgICAgICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnMScsIFZhbGlkYXRvcnMucGF0dGVybignW2EtekEtWiBdKicpKTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wuZXJyb3JzKTsgLy8ge3BhdHRlcm46IHtyZXF1aXJlZFBhdHRlcm46ICdeW2EtekEtWiBdKiQnLCBhY3R1YWxWYWx1ZTogJzEnfX0KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIGBgYGh0bWwKICAgICAgICAgKiA8aW5wdXQgcGF0dGVybj0iW2EtekEtWiBdKiI+CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHBhdHRlcm4gQSByZWd1bGFyIGV4cHJlc3Npb24gdG8gYmUgdXNlZCBhcyBpcyB0byB0ZXN0IHRoZSB2YWx1ZXMsIG9yIGEgc3RyaW5nLgogICAgICAgICAqIElmIGEgc3RyaW5nIGlzIHBhc3NlZCwgdGhlIGBeYCBjaGFyYWN0ZXIgaXMgcHJlcGVuZGVkIGFuZCB0aGUgYCRgIGNoYXJhY3RlciBpcwogICAgICAgICAqIGFwcGVuZGVkIHRvIHRoZSBwcm92aWRlZCBzdHJpbmcgKGlmIG5vdCBhbHJlYWR5IHByZXNlbnQpLCBhbmQgdGhlIHJlc3VsdGluZyByZWd1bGFyCiAgICAgICAgICogZXhwcmVzc2lvbiBpcyB1c2VkIHRvIHRlc3QgdGhlIHZhbHVlcy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGUKICAgICAgICAgKiBgcGF0dGVybmAgcHJvcGVydHkgaWYgdGhlIHZhbGlkYXRpb24gY2hlY2sgZmFpbHMsIG90aGVyd2lzZSBgbnVsbGAuCiAgICAgICAgICoKICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgcGF0dGVybihwYXR0ZXJuKSB7CiAgICAgICAgICAgIGlmICghcGF0dGVybikKICAgICAgICAgICAgICAgIHJldHVybiBWYWxpZGF0b3JzLm51bGxWYWxpZGF0b3I7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlZ2V4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByZWdleFN0cjsKICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXR0ZXJuID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgcmVnZXhTdHIgPSAnJzsKICAgICAgICAgICAgICAgIGlmIChwYXR0ZXJuLmNoYXJBdCgwKSAhPT0gJ14nKQogICAgICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9ICdeJzsKICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9IHBhdHRlcm47CiAgICAgICAgICAgICAgICBpZiAocGF0dGVybi5jaGFyQXQocGF0dGVybi5sZW5ndGggLSAxKSAhPT0gJyQnKQogICAgICAgICAgICAgICAgICAgIHJlZ2V4U3RyICs9ICckJzsKICAgICAgICAgICAgICAgIHJlZ2V4ID0gbmV3IFJlZ0V4cChyZWdleFN0cik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZWdleFN0ciA9IHBhdHRlcm4udG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIHJlZ2V4ID0gcGF0dGVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoaXNFbXB0eUlucHV0VmFsdWUoY29udHJvbC52YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsgLy8gZG9uJ3QgdmFsaWRhdGUgZW1wdHkgdmFsdWVzIHRvIGFsbG93IG9wdGlvbmFsIGNvbnRyb2xzCiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2wudmFsdWU7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVnZXgudGVzdCh2YWx1ZSkgPyBudWxsIDoKICAgICAgICAgICAgICAgICAgICB7ICdwYXR0ZXJuJzogeyAncmVxdWlyZWRQYXR0ZXJuJzogcmVnZXhTdHIsICdhY3R1YWxWYWx1ZSc6IHZhbHVlIH0gfTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBWYWxpZGF0b3IgdGhhdCBwZXJmb3JtcyBubyBvcGVyYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KClgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBudWxsVmFsaWRhdG9yKGNvbnRyb2wpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGNvbXBvc2UodmFsaWRhdG9ycykgewogICAgICAgICAgICBpZiAoIXZhbGlkYXRvcnMpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVzZW50VmFsaWRhdG9ycyA9ICgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3JzLmZpbHRlcihpc1ByZXNlbnQpKSk7CiAgICAgICAgICAgIGlmIChwcmVzZW50VmFsaWRhdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChjb250cm9sKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gX21lcmdlRXJyb3JzKF9leGVjdXRlVmFsaWRhdG9ycyhjb250cm9sLCBwcmVzZW50VmFsaWRhdG9ycykpOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIENvbXBvc2UgbXVsdGlwbGUgYXN5bmMgdmFsaWRhdG9ycyBpbnRvIGEgc2luZ2xlIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgdW5pb24KICAgICAgICAgKiBvZiB0aGUgaW5kaXZpZHVhbCBlcnJvciBvYmplY3RzIGZvciB0aGUgcHJvdmlkZWQgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICAgICAqIEByZXR1cm4gez99IEEgdmFsaWRhdG9yIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBhbiBlcnJvciBtYXAgd2l0aCB0aGUKICAgICAgICAgKiBtZXJnZWQgZXJyb3Igb2JqZWN0cyBvZiB0aGUgYXN5bmMgdmFsaWRhdG9ycyBpZiB0aGUgdmFsaWRhdGlvbiBjaGVjayBmYWlscywgb3RoZXJ3aXNlIGBudWxsYC4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjb21wb3NlQXN5bmModmFsaWRhdG9ycykgewogICAgICAgICAgICBpZiAoIXZhbGlkYXRvcnMpCiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmVzZW50VmFsaWRhdG9ycyA9ICgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3JzLmZpbHRlcihpc1ByZXNlbnQpKSk7CiAgICAgICAgICAgIGlmIChwcmVzZW50VmFsaWRhdG9ycy5sZW5ndGggPT0gMCkKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChjb250cm9sKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IF9leGVjdXRlQXN5bmNWYWxpZGF0b3JzKGNvbnRyb2wsIHByZXNlbnRWYWxpZGF0b3JzKS5tYXAodG9PYnNlcnZhYmxlKTsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihvYnNlcnZhYmxlcykucGlwZShtYXAoX21lcmdlRXJyb3JzKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1ByZXNlbnQobykgewogICAgICAgIHJldHVybiBvICE9IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdG9PYnNlcnZhYmxlKHIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb2JzID0gaXNQcm9taXNlJDEocikgPyBmcm9tKHIpIDogcjsKICAgICAgICBpZiAoIShpc09ic2VydmFibGUkMShvYnMpKSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIHZhbGlkYXRvciB0byByZXR1cm4gUHJvbWlzZSBvciBPYnNlcnZhYmxlLmApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gb2JzOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2V4ZWN1dGVWYWxpZGF0b3JzKGNvbnRyb2wsIHZhbGlkYXRvcnMpIHsKICAgICAgICByZXR1cm4gdmFsaWRhdG9ycy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdiA9PiB2KGNvbnRyb2wpKSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHBhcmFtIHs/fSB2YWxpZGF0b3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfZXhlY3V0ZUFzeW5jVmFsaWRhdG9ycyhjb250cm9sLCB2YWxpZGF0b3JzKSB7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHYgPT4gdihjb250cm9sKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFycmF5T2ZFcnJvcnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9tZXJnZUVycm9ycyhhcnJheU9mRXJyb3JzKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCByZXMgPSB7fTsKICAgICAgICAvLyBOb3QgdXNpbmcgQXJyYXkucmVkdWNlIGhlcmUgZHVlIHRvIGEgQ2hyb21lIDgwIGJ1ZwogICAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNDk5ODIKICAgICAgICBhcnJheU9mRXJyb3JzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZXJyb3JzKSA9PiB7CiAgICAgICAgICAgIHJlcyA9IGVycm9ycyAhPSBudWxsID8gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCAoLyoqIEB0eXBlIHs/fSAqLyAocmVzKSkpLCBlcnJvcnMpIDogKC8qKiBAdHlwZSB7P30gKi8gKHJlcykpOwogICAgICAgIH0pKTsKICAgICAgICByZXR1cm4gT2JqZWN0LmtleXMocmVzKS5sZW5ndGggPT09IDAgPyBudWxsIDogcmVzOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvbm9ybWFsaXplX3ZhbGlkYXRvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub3JtYWxpemVWYWxpZGF0b3IodmFsaWRhdG9yKSB7CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnZhbGlkYXRlKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGMpID0+ICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnZhbGlkYXRlKGMpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbm9ybWFsaXplQXN5bmNWYWxpZGF0b3IodmFsaWRhdG9yKSB7CiAgICAgICAgaWYgKCgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnZhbGlkYXRlKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGMpID0+ICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnZhbGlkYXRlKGMpKTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvbnVtYmVyX3ZhbHVlX2FjY2Vzc29yLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5VTUJFUl9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBOdW1iZXJWYWx1ZUFjY2Vzc29yKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIGEgbnVtYmVyIHZhbHVlIGFuZCBsaXN0ZW5pbmcgdG8gbnVtYmVyIGlucHV0IGNoYW5nZXMuCiAgICAgKiBUaGUgdmFsdWUgYWNjZXNzb3IgaXMgdXNlZCBieSB0aGUgYEZvcm1Db250cm9sRGlyZWN0aXZlYCwgYEZvcm1Db250cm9sTmFtZWAsIGFuZCAgYE5nTW9kZWxgCiAgICAgKiBkaXJlY3RpdmVzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBVc2luZyBhIG51bWJlciBpbnB1dCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHVzZSBhIG51bWJlciBpbnB1dCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgdG90YWxDb3VudENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIGBgYAogICAgICogPGlucHV0IHR5cGU9Im51bWJlciIgW2Zvcm1Db250cm9sXT0idG90YWxDb3VudENvbnRyb2wiPgogICAgICogYGBgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBOdW1iZXJWYWx1ZUFjY2Vzc29yIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9yZW5kZXJlcgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2hhbmdlIG9yIGlucHV0IGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQKICAgICAgICAgICAgICogZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKF8pID0+IHsgfSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlICJ2YWx1ZSIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBjaGVja2VkIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBuZWVkcyB0byBiZSBub3JtYWxpemVkIGZvciBJRTksIG90aGVyd2lzZSBpdCBpcyBzZXQgdG8gJ251bGwnIHdoZW4gbnVsbAogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRWYWx1ZSA9IHZhbHVlID09IG51bGwgPyAnJyA6IHZhbHVlOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIG5vcm1hbGl6ZWRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZhbHVlKSA9PiB7CiAgICAgICAgICAgICAgICBmbih2YWx1ZSA9PSAnJyA/IG51bGwgOiBwYXJzZUZsb2F0KHZhbHVlKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAiZGlzYWJsZWQiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7CiAgICAgICAgfQogICAgfQogICAgTnVtYmVyVmFsdWVBY2Nlc3Nvci7JtWZhYyA9IGZ1bmN0aW9uIE51bWJlclZhbHVlQWNjZXNzb3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTnVtYmVyVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIE51bWJlclZhbHVlQWNjZXNzb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTnVtYmVyVmFsdWVBY2Nlc3Nvciwgc2VsZWN0b3JzOiBbWyJpbnB1dCIsICJ0eXBlIiwgIm51bWJlciIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJudW1iZXIiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJudW1iZXIiLCAibmdNb2RlbCIsICIiXV0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTnVtYmVyVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gTnVtYmVyVmFsdWVBY2Nlc3Nvcl9jaGFuZ2VfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uQ2hhbmdlKCRldmVudC50YXJnZXQudmFsdWUpOyB9KSgiaW5wdXQiLCBmdW5jdGlvbiBOdW1iZXJWYWx1ZUFjY2Vzc29yX2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSkoImJsdXIiLCBmdW5jdGlvbiBOdW1iZXJWYWx1ZUFjY2Vzc29yX2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Lm9uVG91Y2hlZCgpOyB9KTsKICAgICAgICB9IH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW05VTUJFUl9WQUxVRV9BQ0NFU1NPUl0pXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTnVtYmVyVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmFkaW9fY29udHJvbF92YWx1ZV9hY2Nlc3Nvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSQURJT19WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIENsYXNzIHVzZWQgYnkgQW5ndWxhciB0byB0cmFjayByYWRpbyBidXR0b25zLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAgICAgKi8KICAgIGNsYXNzIFJhZGlvQ29udHJvbFJlZ2lzdHJ5IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5fYWNjZXNzb3JzID0gW107CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBBZGRzIGEgY29udHJvbCB0byB0aGUgaW50ZXJuYWwgcmVnaXN0cnkuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IGFjY2Vzc29yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGQoY29udHJvbCwgYWNjZXNzb3IpIHsKICAgICAgICAgICAgdGhpcy5fYWNjZXNzb3JzLnB1c2goW2NvbnRyb2wsIGFjY2Vzc29yXSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZW1vdmVzIGEgY29udHJvbCBmcm9tIHRoZSBpbnRlcm5hbCByZWdpc3RyeS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICAgICAqIEBwYXJhbSB7P30gYWNjZXNzb3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZShhY2Nlc3NvcikgewogICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5fYWNjZXNzb3JzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fYWNjZXNzb3JzW2ldWzFdID09PSBhY2Nlc3NvcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FjY2Vzc29ycy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBTZWxlY3RzIGEgcmFkaW8gYnV0dG9uLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAgICAgICAgICogQHBhcmFtIHs/fSBhY2Nlc3NvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2VsZWN0KGFjY2Vzc29yKSB7CiAgICAgICAgICAgIHRoaXMuX2FjY2Vzc29ycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYykgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2FtZUdyb3VwKGMsIGFjY2Vzc29yKSAmJiBjWzFdICE9PSBhY2Nlc3NvcikgewogICAgICAgICAgICAgICAgICAgIGNbMV0uZmlyZVVuY2hlY2soYWNjZXNzb3IudmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sUGFpcgogICAgICAgICAqIEBwYXJhbSB7P30gYWNjZXNzb3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1NhbWVHcm91cChjb250cm9sUGFpciwgYWNjZXNzb3IpIHsKICAgICAgICAgICAgaWYgKCFjb250cm9sUGFpclswXS5jb250cm9sKQogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICByZXR1cm4gY29udHJvbFBhaXJbMF0uX3BhcmVudCA9PT0gYWNjZXNzb3IuX2NvbnRyb2wuX3BhcmVudCAmJgogICAgICAgICAgICAgICAgY29udHJvbFBhaXJbMV0ubmFtZSA9PT0gYWNjZXNzb3IubmFtZTsKICAgICAgICB9CiAgICB9CiAgICBSYWRpb0NvbnRyb2xSZWdpc3RyeS7JtWZhYyA9IGZ1bmN0aW9uIFJhZGlvQ29udHJvbFJlZ2lzdHJ5X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJhZGlvQ29udHJvbFJlZ2lzdHJ5KSgpOyB9OwogICAgUmFkaW9Db250cm9sUmVnaXN0cnkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogUmFkaW9Db250cm9sUmVnaXN0cnksIGZhY3Rvcnk6IFJhZGlvQ29udHJvbFJlZ2lzdHJ5Lsm1ZmFjIH0pOwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyByYWRpbyBjb250cm9sIHZhbHVlcyBhbmQgbGlzdGVuaW5nIHRvIHJhZGlvIGNvbnRyb2wKICAgICAqIGNoYW5nZXMuIFRoZSB2YWx1ZSBhY2Nlc3NvciBpcyB1c2VkIGJ5IHRoZSBgRm9ybUNvbnRyb2xEaXJlY3RpdmVgLCBgRm9ybUNvbnRyb2xOYW1lYCwgYW5kCiAgICAgKiBgTmdNb2RlbGAgZGlyZWN0aXZlcy4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgVXNpbmcgcmFkaW8gYnV0dG9ucyB3aXRoIHJlYWN0aXZlIGZvcm0gZGlyZWN0aXZlcwogICAgICoKICAgICAqIFRoZSBmb2xsb3cgZXhhbXBsZSBzaG93cyBob3cgdG8gdXNlIHJhZGlvIGJ1dHRvbnMgaW4gYSByZWFjdGl2ZSBmb3JtLiBXaGVuIHVzaW5nIHJhZGlvIGJ1dHRvbnMgaW4KICAgICAqIGEgcmVhY3RpdmUgZm9ybSwgcmFkaW8gYnV0dG9ucyBpbiB0aGUgc2FtZSBncm91cCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBgZm9ybUNvbnRyb2xOYW1lYC4KICAgICAqIFByb3ZpZGluZyBhIGBuYW1lYCBhdHRyaWJ1dGUgaXMgb3B0aW9uYWwuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBmb3Jtcy90cy9yZWFjdGl2ZVJhZGlvQnV0dG9ucy9yZWFjdGl2ZV9yYWRpb19idXR0b25fZXhhbXBsZS50cyByZWdpb249J1JlYWN0aXZlJ30KICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX3JlZ2lzdHJ5CiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfcmVuZGVyZXIsIF9lbGVtZW50UmVmLCBfcmVnaXN0cnksIF9pbmplY3RvcikgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9yZWdpc3RyeSA9IF9yZWdpc3RyeTsKICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUaGUgcmVnaXN0ZXJlZCBjYWxsYmFjayBmdW5jdGlvbiBjYWxsZWQgd2hlbiBhIGJsdXIgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUgaXMgaW5pdGlhbGl6ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLl9jb250cm9sID0gdGhpcy5faW5qZWN0b3IuZ2V0KE5nQ29udHJvbCk7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrTmFtZSgpOwogICAgICAgICAgICB0aGlzLl9yZWdpc3RyeS5hZGQodGhpcy5fY29udHJvbCwgdGhpcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdHJ5LnJlbW92ZSh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFNldHMgdGhlICJjaGVja2VkIiBwcm9wZXJ0eSB2YWx1ZSBvbiB0aGUgcmFkaW8gaW5wdXQgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHdyaXRlVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSB2YWx1ZSA9PT0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnY2hlY2tlZCcsIHRoaXMuX3N0YXRlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPbkNoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLl9mbiA9IGZuOwogICAgICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgZm4odGhpcy52YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9yZWdpc3RyeS5zZWxlY3QodGhpcyk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAidmFsdWUiIG9uIHRoZSByYWRpbyBpbnB1dCBlbGVtZW50IGFuZCB1bmNoZWNrcyBpdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpcmVVbmNoZWNrKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBpcyB0b3VjaGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlICJkaXNhYmxlZCIgcHJvcGVydHkgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQgVGhlIGRpc2FibGVkIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAnZGlzYWJsZWQnLCBpc0Rpc2FibGVkKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja05hbWUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm5hbWUgJiYgdGhpcy5mb3JtQ29udHJvbE5hbWUgJiYgdGhpcy5uYW1lICE9PSB0aGlzLmZvcm1Db250cm9sTmFtZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdGhyb3dOYW1lRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMubmFtZSAmJiB0aGlzLmZvcm1Db250cm9sTmFtZSkKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMuZm9ybUNvbnRyb2xOYW1lOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Rocm93TmFtZUVycm9yKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYAogICAgICBJZiB5b3UgZGVmaW5lIGJvdGggYSBuYW1lIGFuZCBhIGZvcm1Db250cm9sTmFtZSBhdHRyaWJ1dGUgb24geW91ciByYWRpbyBidXR0b24sIHRoZWlyIHZhbHVlcwogICAgICBtdXN0IG1hdGNoLiBFeDogPGlucHV0IHR5cGU9InJhZGlvIiBmb3JtQ29udHJvbE5hbWU9ImZvb2QiIG5hbWU9ImZvb2QiPgogICAgYCk7CiAgICAgICAgfQogICAgfQogICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci7JtWZhYyA9IGZ1bmN0aW9uIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJhZGlvQ29udHJvbFJlZ2lzdHJ5KSwgybXJtWRpcmVjdGl2ZUluamVjdChJbmplY3RvcikpOyB9OwogICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3Nvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLCBzZWxlY3RvcnM6IFtbImlucHV0IiwgInR5cGUiLCAicmFkaW8iLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbImlucHV0IiwgInR5cGUiLCAicmFkaW8iLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJyYWRpbyIsICJuZ01vZGVsIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yX2NoYW5nZV9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25DaGFuZ2UoKTsgfSkoImJsdXIiLCBmdW5jdGlvbiBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yX2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Lm9uVG91Y2hlZCgpOyB9KTsKICAgICAgICB9IH0sIGlucHV0czogeyBuYW1lOiAibmFtZSIsIGZvcm1Db250cm9sTmFtZTogImZvcm1Db250cm9sTmFtZSIsIHZhbHVlOiAidmFsdWUiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW1JBRElPX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogUmVuZGVyZXIyIH0sCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBSYWRpb0NvbnRyb2xSZWdpc3RyeSB9LAogICAgICAgIHsgdHlwZTogSW5qZWN0b3IgfQogICAgXTsKICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZm9ybUNvbnRyb2xOYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9yYW5nZV92YWx1ZV9hY2Nlc3Nvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSQU5HRV9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBSYW5nZVZhbHVlQWNjZXNzb3IpKSwKICAgICAgICBtdWx0aTogdHJ1ZQogICAgfTsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogVGhlIGBDb250cm9sVmFsdWVBY2Nlc3NvcmAgZm9yIHdyaXRpbmcgYSByYW5nZSB2YWx1ZSBhbmQgbGlzdGVuaW5nIHRvIHJhbmdlIGlucHV0IGNoYW5nZXMuCiAgICAgKiBUaGUgdmFsdWUgYWNjZXNzb3IgaXMgdXNlZCBieSB0aGUgYEZvcm1Db250cm9sRGlyZWN0aXZlYCwgYEZvcm1Db250cm9sTmFtZWAsIGFuZCAgYE5nTW9kZWxgCiAgICAgKiBkaXJlY3RpdmVzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBVc2luZyBhIHJhbmdlIGlucHV0IHdpdGggYSByZWFjdGl2ZSBmb3JtCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byB1c2UgYSByYW5nZSBpbnB1dCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgYWdlQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpOwogICAgICogYGBgCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8aW5wdXQgdHlwZT0icmFuZ2UiIFtmb3JtQ29udHJvbF09ImFnZUNvbnRyb2wiPgogICAgICogYGBgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBSYW5nZVZhbHVlQWNjZXNzb3IgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2Ugb3IgaW5wdXQgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dAogICAgICAgICAgICAgKiBlbGVtZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoXykgPT4geyB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBibHVyIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgInZhbHVlIiBwcm9wZXJ0eSBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGNoZWNrZWQgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHdyaXRlVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCBwYXJzZUZsb2F0KHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZhbHVlKSA9PiB7CiAgICAgICAgICAgICAgICBmbih2YWx1ZSA9PSAnJyA/IG51bGwgOiBwYXJzZUZsb2F0KHZhbHVlKSk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAiZGlzYWJsZWQiIHByb3BlcnR5IG9uIHRoZSByYW5nZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7CiAgICAgICAgfQogICAgfQogICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLsm1ZmFjID0gZnVuY3Rpb24gUmFuZ2VWYWx1ZUFjY2Vzc29yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJhbmdlVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIFJhbmdlVmFsdWVBY2Nlc3Nvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBSYW5nZVZhbHVlQWNjZXNzb3IsIHNlbGVjdG9yczogW1siaW5wdXQiLCAidHlwZSIsICJyYW5nZSIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiaW5wdXQiLCAidHlwZSIsICJyYW5nZSIsICJmb3JtQ29udHJvbCIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgInJhbmdlIiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFJhbmdlVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gUmFuZ2VWYWx1ZUFjY2Vzc29yX2NoYW5nZV9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSk7IH0pKCJpbnB1dCIsIGZ1bmN0aW9uIFJhbmdlVmFsdWVBY2Nlc3Nvcl9pbnB1dF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25DaGFuZ2UoJGV2ZW50LnRhcmdldC52YWx1ZSk7IH0pKCJibHVyIiwgZnVuY3Rpb24gUmFuZ2VWYWx1ZUFjY2Vzc29yX2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Lm9uVG91Y2hlZCgpOyB9KTsKICAgICAgICB9IH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW1JBTkdFX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBSYW5nZVZhbHVlQWNjZXNzb3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBSZW5kZXJlcjIgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL2Vycm9yX2V4YW1wbGVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEZvcm1FcnJvckV4YW1wbGVzID0gewogICAgICAgIGZvcm1Db250cm9sTmFtZTogYAogICAgPGRpdiBbZm9ybUdyb3VwXT0ibXlHcm91cCI+CiAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+CiAgICA8L2Rpdj4KCiAgICBJbiB5b3VyIGNsYXNzOgoKICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoewogICAgICAgZmlyc3ROYW1lOiBuZXcgRm9ybUNvbnRyb2woKQogICAgfSk7YCwKICAgICAgICBmb3JtR3JvdXBOYW1lOiBgCiAgICA8ZGl2IFtmb3JtR3JvdXBdPSJteUdyb3VwIj4KICAgICAgIDxkaXYgZm9ybUdyb3VwTmFtZT0icGVyc29uIj4KICAgICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+CiAgICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIEluIHlvdXIgY2xhc3M6CgogICAgdGhpcy5teUdyb3VwID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgICBwZXJzb246IG5ldyBGb3JtR3JvdXAoeyBmaXJzdE5hbWU6IG5ldyBGb3JtQ29udHJvbCgpIH0pCiAgICB9KTtgLAogICAgICAgIGZvcm1BcnJheU5hbWU6IGAKICAgIDxkaXYgW2Zvcm1Hcm91cF09Im15R3JvdXAiPgogICAgICA8ZGl2IGZvcm1BcnJheU5hbWU9ImNpdGllcyI+CiAgICAgICAgPGRpdiAqbmdGb3I9ImxldCBjaXR5IG9mIGNpdHlBcnJheS5jb250cm9sczsgaW5kZXggYXMgaSI+CiAgICAgICAgICA8aW5wdXQgW2Zvcm1Db250cm9sTmFtZV09ImkiPgogICAgICAgIDwvZGl2PgogICAgICA8L2Rpdj4KICAgIDwvZGl2PgoKICAgIEluIHlvdXIgY2xhc3M6CgogICAgdGhpcy5jaXR5QXJyYXkgPSBuZXcgRm9ybUFycmF5KFtuZXcgRm9ybUNvbnRyb2woJ1NGJyldKTsKICAgIHRoaXMubXlHcm91cCA9IG5ldyBGb3JtR3JvdXAoewogICAgICBjaXRpZXM6IHRoaXMuY2l0eUFycmF5CiAgICB9KTtgLAogICAgICAgIG5nTW9kZWxHcm91cDogYAogICAgPGZvcm0+CiAgICAgICA8ZGl2IG5nTW9kZWxHcm91cD0icGVyc29uIj4KICAgICAgICAgIDxpbnB1dCBbKG5nTW9kZWwpXT0icGVyc29uLm5hbWUiIG5hbWU9ImZpcnN0TmFtZSI+CiAgICAgICA8L2Rpdj4KICAgIDwvZm9ybT5gLAogICAgICAgIG5nTW9kZWxXaXRoRm9ybUdyb3VwOiBgCiAgICA8ZGl2IFtmb3JtR3JvdXBdPSJteUdyb3VwIj4KICAgICAgIDxpbnB1dCBmb3JtQ29udHJvbE5hbWU9ImZpcnN0TmFtZSI+CiAgICAgICA8aW5wdXQgWyhuZ01vZGVsKV09InNob3dNb3JlQ29udHJvbHMiIFtuZ01vZGVsT3B0aW9uc109IntzdGFuZGFsb25lOiB0cnVlfSI+CiAgICA8L2Rpdj4KICBgCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmVhY3RpdmVfZXJyb3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJlYWN0aXZlRXJyb3JzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBjb250cm9sUGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcm1Db250cm9sTmFtZSBtdXN0IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLiAgWW91J2xsIHdhbnQgdG8gYWRkIGEgZm9ybUdyb3VwCiAgICAgICBkaXJlY3RpdmUgYW5kIHBhc3MgaXQgYW4gZXhpc3RpbmcgRm9ybUdyb3VwIGluc3RhbmNlICh5b3UgY2FuIGNyZWF0ZSBvbmUgaW4geW91ciBjbGFzcykuCgogICAgICBFeGFtcGxlOgoKICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5mb3JtQ29udHJvbE5hbWV9YCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG5nTW9kZWxHcm91cEV4Y2VwdGlvbigpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtQ29udHJvbE5hbWUgY2Fubm90IGJlIHVzZWQgd2l0aCBhbiBuZ01vZGVsR3JvdXAgcGFyZW50LiBJdCBpcyBvbmx5IGNvbXBhdGlibGUgd2l0aCBwYXJlbnRzCiAgICAgICB0aGF0IGFsc28gaGF2ZSBhICJmb3JtIiBwcmVmaXg6IGZvcm1Hcm91cE5hbWUsIGZvcm1BcnJheU5hbWUsIG9yIGZvcm1Hcm91cC4KCiAgICAgICBPcHRpb24gMTogIFVwZGF0ZSB0aGUgcGFyZW50IHRvIGJlIGZvcm1Hcm91cE5hbWUgKHJlYWN0aXZlIGZvcm0gc3RyYXRlZ3kpCgogICAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMuZm9ybUdyb3VwTmFtZX0KCiAgICAgICAgT3B0aW9uIDI6IFVzZSBuZ01vZGVsIGluc3RlYWQgb2YgZm9ybUNvbnRyb2xOYW1lICh0ZW1wbGF0ZS1kcml2ZW4gc3RyYXRlZ3kpCgogICAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMubmdNb2RlbEdyb3VwfWApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBtaXNzaW5nRm9ybUV4Y2VwdGlvbigpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtR3JvdXAgZXhwZWN0cyBhIEZvcm1Hcm91cCBpbnN0YW5jZS4gUGxlYXNlIHBhc3Mgb25lIGluLgoKICAgICAgIEV4YW1wbGU6CgogICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5mb3JtQ29udHJvbE5hbWV9YCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGdyb3VwUGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYGZvcm1Hcm91cE5hbWUgbXVzdCBiZSB1c2VkIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwIGRpcmVjdGl2ZS4gIFlvdSdsbCB3YW50IHRvIGFkZCBhIGZvcm1Hcm91cAogICAgICBkaXJlY3RpdmUgYW5kIHBhc3MgaXQgYW4gZXhpc3RpbmcgRm9ybUdyb3VwIGluc3RhbmNlICh5b3UgY2FuIGNyZWF0ZSBvbmUgaW4geW91ciBjbGFzcykuCgogICAgICBFeGFtcGxlOgoKICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5mb3JtR3JvdXBOYW1lfWApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBhcnJheVBhcmVudEV4Y2VwdGlvbigpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBmb3JtQXJyYXlOYW1lIG11c3QgYmUgdXNlZCB3aXRoIGEgcGFyZW50IGZvcm1Hcm91cCBkaXJlY3RpdmUuICBZb3UnbGwgd2FudCB0byBhZGQgYSBmb3JtR3JvdXAKICAgICAgIGRpcmVjdGl2ZSBhbmQgcGFzcyBpdCBhbiBleGlzdGluZyBGb3JtR3JvdXAgaW5zdGFuY2UgKHlvdSBjYW4gY3JlYXRlIG9uZSBpbiB5b3VyIGNsYXNzKS4KCiAgICAgICAgRXhhbXBsZToKCiAgICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5mb3JtQXJyYXlOYW1lfWApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBkaXNhYmxlZEF0dHJXYXJuaW5nKCkgewogICAgICAgICAgICBjb25zb2xlLndhcm4oYAogICAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyB0aGUgZGlzYWJsZWQgYXR0cmlidXRlIHdpdGggYSByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZS4gSWYgeW91IHNldCBkaXNhYmxlZCB0byB0cnVlCiAgICAgIHdoZW4geW91IHNldCB1cCB0aGlzIGNvbnRyb2wgaW4geW91ciBjb21wb25lbnQgY2xhc3MsIHRoZSBkaXNhYmxlZCBhdHRyaWJ1dGUgd2lsbCBhY3R1YWxseSBiZSBzZXQgaW4gdGhlIERPTSBmb3IKICAgICAgeW91LiBXZSByZWNvbW1lbmQgdXNpbmcgdGhpcyBhcHByb2FjaCB0byBhdm9pZCAnY2hhbmdlZCBhZnRlciBjaGVja2VkJyBlcnJvcnMuCiAgICAgICAKICAgICAgRXhhbXBsZTogCiAgICAgIGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAgICBmaXJzdDogbmV3IEZvcm1Db250cm9sKHt2YWx1ZTogJ05hbmN5JywgZGlzYWJsZWQ6IHRydWV9LCBWYWxpZGF0b3JzLnJlcXVpcmVkKSwKICAgICAgICBsYXN0OiBuZXcgRm9ybUNvbnRyb2woJ0RyZXcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKQogICAgICB9KTsKICAgIGApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZU5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBuZ01vZGVsV2FybmluZyhkaXJlY3RpdmVOYW1lKSB7CiAgICAgICAgICAgIGNvbnNvbGUud2FybihgCiAgICBJdCBsb29rcyBsaWtlIHlvdSdyZSB1c2luZyBuZ01vZGVsIG9uIHRoZSBzYW1lIGZvcm0gZmllbGQgYXMgJHtkaXJlY3RpdmVOYW1lfS4gCiAgICBTdXBwb3J0IGZvciB1c2luZyB0aGUgbmdNb2RlbCBpbnB1dCBwcm9wZXJ0eSBhbmQgbmdNb2RlbENoYW5nZSBldmVudCB3aXRoIAogICAgcmVhY3RpdmUgZm9ybSBkaXJlY3RpdmVzIGhhcyBiZWVuIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgd2lsbCBiZSByZW1vdmVkIAogICAgaW4gQW5ndWxhciB2Ny4KICAgIAogICAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhpcywgc2VlIG91ciBBUEkgZG9jcyBoZXJlOgogICAgaHR0cHM6Ly9hbmd1bGFyLmlvL2FwaS9mb3Jtcy8ke2RpcmVjdGl2ZU5hbWUgPT09ICdmb3JtQ29udHJvbCcgPyAnRm9ybUNvbnRyb2xEaXJlY3RpdmUnIDoKICAgICAgICAgICAgJ0Zvcm1Db250cm9sTmFtZSd9I3VzZS13aXRoLW5nbW9kZWwKICAgIGApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL3NlbGVjdF9jb250cm9sX3ZhbHVlX2FjY2Vzc29yLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNFTEVDVF9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcikpLAogICAgICAgIG11bHRpOiB0cnVlCiAgICB9OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfYnVpbGRWYWx1ZVN0cmluZyhpZCwgdmFsdWUpIHsKICAgICAgICBpZiAoaWQgPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIGAke3ZhbHVlfWA7CiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpCiAgICAgICAgICAgIHZhbHVlID0gJ09iamVjdCc7CiAgICAgICAgcmV0dXJuIGAke2lkfTogJHt2YWx1ZX1gLnNsaWNlKDAsIDUwKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZVN0cmluZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2V4dHJhY3RJZCh2YWx1ZVN0cmluZykgewogICAgICAgIHJldHVybiB2YWx1ZVN0cmluZy5zcGxpdCgnOicpWzBdOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBUaGUgYENvbnRyb2xWYWx1ZUFjY2Vzc29yYCBmb3Igd3JpdGluZyBzZWxlY3QgY29udHJvbCB2YWx1ZXMgYW5kIGxpc3RlbmluZyB0byBzZWxlY3QgY29udHJvbAogICAgICogY2hhbmdlcy4gVGhlIHZhbHVlIGFjY2Vzc29yIGlzIHVzZWQgYnkgdGhlIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAsIGBGb3JtQ29udHJvbE5hbWVgLCBhbmQKICAgICAqIGBOZ01vZGVsYCBkaXJlY3RpdmVzLgogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBVc2luZyBzZWxlY3QgY29udHJvbHMgaW4gYSByZWFjdGl2ZSBmb3JtCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IGhvdyB0byB1c2UgYSBzZWxlY3QgY29udHJvbCBpbiBhIHJlYWN0aXZlIGZvcm0uCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBmb3Jtcy90cy9yZWFjdGl2ZVNlbGVjdENvbnRyb2wvcmVhY3RpdmVfc2VsZWN0X2NvbnRyb2xfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAgICAgKgogICAgICogIyMjIFVzaW5nIHNlbGVjdCBjb250cm9scyBpbiBhIHRlbXBsYXRlLWRyaXZlbiBmb3JtCiAgICAgKgogICAgICogVG8gdXNlIGEgc2VsZWN0IGluIGEgdGVtcGxhdGUtZHJpdmVuIGZvcm0sIHNpbXBseSBhZGQgYW4gYG5nTW9kZWxgIGFuZCBhIGBuYW1lYAogICAgICogYXR0cmlidXRlIHRvIHRoZSBtYWluIGA8c2VsZWN0PmAgdGFnLgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvc2VsZWN0Q29udHJvbC9zZWxlY3RfY29udHJvbF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICAgICAqCiAgICAgKiAjIyMgQ3VzdG9taXppbmcgb3B0aW9uIHNlbGVjdGlvbgogICAgICoKICAgICAqIEFuZ3VsYXIgdXNlcyBvYmplY3QgaWRlbnRpdHkgdG8gc2VsZWN0IG9wdGlvbi4gSXQncyBwb3NzaWJsZSBmb3IgdGhlIGlkZW50aXRpZXMgb2YgaXRlbXMKICAgICAqIHRvIGNoYW5nZSB3aGlsZSB0aGUgZGF0YSBkb2VzIG5vdC4gVGhpcyBjYW4gaGFwcGVuLCBmb3IgZXhhbXBsZSwgaWYgdGhlIGl0ZW1zIGFyZSBwcm9kdWNlZAogICAgICogZnJvbSBhbiBSUEMgdG8gdGhlIHNlcnZlciwgYW5kIHRoYXQgUlBDIGlzIHJlLXJ1bi4gRXZlbiBpZiB0aGUgZGF0YSBoYXNuJ3QgY2hhbmdlZCwgdGhlCiAgICAgKiBzZWNvbmQgcmVzcG9uc2Ugd2lsbCBwcm9kdWNlIG9iamVjdHMgd2l0aCBkaWZmZXJlbnQgaWRlbnRpdGllcy4KICAgICAqCiAgICAgKiBUbyBjdXN0b21pemUgdGhlIGRlZmF1bHQgb3B0aW9uIGNvbXBhcmlzb24gYWxnb3JpdGhtLCBgPHNlbGVjdD5gIHN1cHBvcnRzIGBjb21wYXJlV2l0aGAgaW5wdXQuCiAgICAgKiBgY29tcGFyZVdpdGhgIHRha2VzIGEgKipmdW5jdGlvbioqIHdoaWNoIGhhcyB0d28gYXJndW1lbnRzOiBgb3B0aW9uMWAgYW5kIGBvcHRpb24yYC4KICAgICAqIElmIGBjb21wYXJlV2l0aGAgaXMgZ2l2ZW4sIEFuZ3VsYXIgc2VsZWN0cyBvcHRpb24gYnkgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24uCiAgICAgKgogICAgICogYGBgdHMKICAgICAqIGNvbnN0IHNlbGVjdGVkQ291bnRyaWVzQ29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgpOwogICAgICogYGBgCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8c2VsZWN0IFtjb21wYXJlV2l0aF09ImNvbXBhcmVGbiIgIFtmb3JtQ29udHJvbF09InNlbGVjdGVkQ291bnRyaWVzQ29udHJvbCI+CiAgICAgKiAgICAgPG9wdGlvbiAqbmdGb3I9ImxldCBjb3VudHJ5IG9mIGNvdW50cmllcyIgW25nVmFsdWVdPSJjb3VudHJ5Ij4KICAgICAqICAgICAgICAge3tjb3VudHJ5Lm5hbWV9fQogICAgICogICAgIDwvb3B0aW9uPgogICAgICogPC9zZWxlY3Q+CiAgICAgKgogICAgICogY29tcGFyZUZuKGMxOiBDb3VudHJ5LCBjMjogQ291bnRyeSk6IGJvb2xlYW4gewogICAgICogICAgIHJldHVybiBjMSAmJiBjMiA/IGMxLmlkID09PSBjMi5pZCA6IGMxID09PSBjMjsKICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqICoqTm90ZToqKiBXZSBsaXN0ZW4gdG8gdGhlICdjaGFuZ2UnIGV2ZW50IGJlY2F1c2UgJ2lucHV0JyBldmVudHMgYXJlbid0IGZpcmVkCiAgICAgKiBmb3Igc2VsZWN0cyBpbiBGaXJlZm94IGFuZCBJRToKICAgICAqIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTEwMjQzNTAKICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzQ2NjAwNDUvCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3JlbmRlcmVyLCBfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlciA9IF9yZW5kZXJlcjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb3B0aW9uTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faWRDb3VudGVyID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBjaGFuZ2UgZXZlbnQgb2NjdXJzIG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoXykgPT4geyB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogVGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2sgZnVuY3Rpb24gY2FsbGVkIHdoZW4gYSBibHVyIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBsb29zZUlkZW50aWNhbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRyYWNrcyB0aGUgb3B0aW9uIGNvbXBhcmlzb24gYWxnb3JpdGhtIGZvciB0cmFja2luZyBpZGVudGl0aWVzIHdoZW4KICAgICAgICAgKiBjaGVja2luZyBmb3IgY2hhbmdlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgY29tcGFyZVdpdGgoZm4pIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBjb21wYXJlV2l0aCBtdXN0IGJlIGEgZnVuY3Rpb24sIGJ1dCByZWNlaXZlZCAke0pTT04uc3RyaW5naWZ5KGZuKX1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jb21wYXJlV2l0aCA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAidmFsdWUiIHByb3BlcnR5IG9uIHRoZSBpbnB1dCBlbGVtZW50LiBUaGUgInNlbGVjdGVkSW5kZXgiCiAgICAgICAgICogcHJvcGVydHkgaXMgYWxzbyBzZXQgaWYgYW4gSUQgaXMgcHJvdmlkZWQgb24gdGhlIG9wdGlvbiBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgY2hlY2tlZCB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd3JpdGVWYWx1ZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaWQgPSB0aGlzLl9nZXRPcHRpb25JZCh2YWx1ZSk7CiAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdzZWxlY3RlZEluZGV4JywgLTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWVTdHJpbmcgPSBfYnVpbGRWYWx1ZVN0cmluZyhpZCwgdmFsdWUpOwogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlU3RyaW5nKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBjYWxsYmFjayBmdW5jdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPbkNoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLm9uQ2hhbmdlID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlU3RyaW5nCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWVTdHJpbmcpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9nZXRPcHRpb25WYWx1ZSh2YWx1ZVN0cmluZyk7CiAgICAgICAgICAgICAgICBmbih0aGlzLnZhbHVlKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBmdW5jdGlvbiBjYWxsZWQgd2hlbiB0aGUgY29udHJvbCBpcyB0b3VjaGVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgICAgIHRoaXMub25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlICJkaXNhYmxlZCIgcHJvcGVydHkgb24gdGhlIHNlbGVjdCBpbnB1dCBlbGVtZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkIFRoZSBkaXNhYmxlZCB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyLnNldFByb3BlcnR5KHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2Rpc2FibGVkJywgaXNEaXNhYmxlZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZWdpc3Rlck9wdGlvbigpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9pZENvdW50ZXIrKykudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPcHRpb25JZCh2YWx1ZSkgewogICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIEFycmF5LmZyb20odGhpcy5fb3B0aW9uTWFwLmtleXMoKSkpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9jb21wYXJlV2l0aCh0aGlzLl9vcHRpb25NYXAuZ2V0KGlkKSwgdmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVTdHJpbmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPcHRpb25WYWx1ZSh2YWx1ZVN0cmluZykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlkID0gX2V4dHJhY3RJZCh2YWx1ZVN0cmluZyk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25NYXAuaGFzKGlkKSA/IHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpIDogdmFsdWVTdHJpbmc7CiAgICAgICAgfQogICAgfQogICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IuybVmYWMgPSBmdW5jdGlvbiBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBzZWxlY3RvcnM6IFtbInNlbGVjdCIsICJmb3JtQ29udHJvbE5hbWUiLCAiIiwgMywgIm11bHRpcGxlIiwgIiJdLCBbInNlbGVjdCIsICJmb3JtQ29udHJvbCIsICIiLCAzLCAibXVsdGlwbGUiLCAiIl0sIFsic2VsZWN0IiwgIm5nTW9kZWwiLCAiIiwgMywgIm11bHRpcGxlIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JfY2hhbmdlX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkNoYW5nZSgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSkoImJsdXIiLCBmdW5jdGlvbiBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvcl9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblRvdWNoZWQoKTsgfSk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgY29tcGFyZVdpdGg6ICJjb21wYXJlV2l0aCIgfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbU0VMRUNUX1ZBTFVFX0FDQ0VTU09SXSldIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY29tcGFyZVdpdGg6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBNYXJrcyBgPG9wdGlvbj5gIGFzIGR5bmFtaWMsIHNvIEFuZ3VsYXIgY2FuIGJlIG5vdGlmaWVkIHdoZW4gb3B0aW9ucyBjaGFuZ2UuCiAgICAgKgogICAgICogQHNlZSBgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBOZ1NlbGVjdE9wdGlvbiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfc2VsZWN0CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnQsIF9yZW5kZXJlciwgX3NlbGVjdCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX3JlbmRlcmVyID0gX3JlbmRlcmVyOwogICAgICAgICAgICB0aGlzLl9zZWxlY3QgPSBfc2VsZWN0OwogICAgICAgICAgICBpZiAodGhpcy5fc2VsZWN0KQogICAgICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuX3NlbGVjdC5fcmVnaXN0ZXJPcHRpb24oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRyYWNrcyB0aGUgdmFsdWUgYm91bmQgdG8gdGhlIG9wdGlvbiBlbGVtZW50LiBVbmxpa2UgdGhlIHZhbHVlIGJpbmRpbmcsCiAgICAgICAgICogbmdWYWx1ZSBzdXBwb3J0cyBiaW5kaW5nIHRvIG9iamVjdHMuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG5nVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCA9PSBudWxsKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9zZWxlY3QuX29wdGlvbk1hcC5zZXQodGhpcy5pZCwgdmFsdWUpOwogICAgICAgICAgICB0aGlzLl9zZXRFbGVtZW50VmFsdWUoX2J1aWxkVmFsdWVTdHJpbmcodGhpcy5pZCwgdmFsdWUpKTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRyYWNrcyBzaW1wbGUgc3RyaW5nIHZhbHVlcyBib3VuZCB0byB0aGUgb3B0aW9uIGVsZW1lbnQuCiAgICAgICAgICogRm9yIG9iamVjdHMsIHVzZSB0aGUgYG5nVmFsdWVgIGlucHV0IGJpbmRpbmcuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3QpCiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Qud3JpdGVWYWx1ZSh0aGlzLl9zZWxlY3QudmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldEVsZW1lbnRWYWx1ZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQsICd2YWx1ZScsIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIExpZmVjeWNsZSBtZXRob2QgY2FsbGVkIGJlZm9yZSB0aGUgZGlyZWN0aXZlJ3MgaW5zdGFuY2UgaXMgZGVzdHJveWVkLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0Ll9vcHRpb25NYXAuZGVsZXRlKHRoaXMuaWQpOwogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE5nU2VsZWN0T3B0aW9uLsm1ZmFjID0gZnVuY3Rpb24gTmdTZWxlY3RPcHRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdTZWxlY3RPcHRpb24pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoUmVuZGVyZXIyKSwgybXJtWRpcmVjdGl2ZUluamVjdChTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciwgOSkpOyB9OwogICAgTmdTZWxlY3RPcHRpb24uybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTmdTZWxlY3RPcHRpb24sIHNlbGVjdG9yczogW1sib3B0aW9uIl1dLCBpbnB1dHM6IHsgbmdWYWx1ZTogIm5nVmFsdWUiLCB2YWx1ZTogInZhbHVlIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ1NlbGVjdE9wdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3IsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSG9zdCB9XSB9CiAgICBdOwogICAgTmdTZWxlY3RPcHRpb24ucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmdWYWx1ZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdWYWx1ZScsXSB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsndmFsdWUnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9zZWxlY3RfbXVsdGlwbGVfY29udHJvbF92YWx1ZV9hY2Nlc3Nvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTRUxFQ1RfTVVMVElQTEVfVkFMVUVfQUNDRVNTT1IgPSB7CiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvcikpLAogICAgICAgIG11bHRpOiB0cnVlCiAgICB9OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfYnVpbGRWYWx1ZVN0cmluZyQxKGlkLCB2YWx1ZSkgewogICAgICAgIGlmIChpZCA9PSBudWxsKQogICAgICAgICAgICByZXR1cm4gYCR7dmFsdWV9YDsKICAgICAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykKICAgICAgICAgICAgdmFsdWUgPSBgJyR7dmFsdWV9J2A7CiAgICAgICAgaWYgKHZhbHVlICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcpCiAgICAgICAgICAgIHZhbHVlID0gJ09iamVjdCc7CiAgICAgICAgcmV0dXJuIGAke2lkfTogJHt2YWx1ZX1gLnNsaWNlKDAsIDUwKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWx1ZVN0cmluZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2V4dHJhY3RJZCQxKHZhbHVlU3RyaW5nKSB7CiAgICAgICAgcmV0dXJuIHZhbHVlU3RyaW5nLnNwbGl0KCc6JylbMF07CiAgICB9CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFRoZSBgQ29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB3cml0aW5nIG11bHRpLXNlbGVjdCBjb250cm9sIHZhbHVlcyBhbmQgbGlzdGVuaW5nIHRvIG11bHRpLXNlbGVjdAogICAgICogY29udHJvbCBjaGFuZ2VzLiBUaGUgdmFsdWUgYWNjZXNzb3IgaXMgdXNlZCBieSB0aGUgYEZvcm1Db250cm9sRGlyZWN0aXZlYCwgYEZvcm1Db250cm9sTmFtZWAsIGFuZAogICAgICogYE5nTW9kZWxgIGRpcmVjdGl2ZXMuCiAgICAgKgogICAgICogQHNlZSBgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JgCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIFVzaW5nIGEgbXVsdGktc2VsZWN0IGNvbnRyb2wKICAgICAqCiAgICAgKiBUaGUgZm9sbG93IGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byB1c2UgYSBtdWx0aS1zZWxlY3QgY29udHJvbCB3aXRoIGEgcmVhY3RpdmUgZm9ybS4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgY291bnRyeUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTsKICAgICAqIGBgYAogICAgICoKICAgICAqIGBgYAogICAgICogPHNlbGVjdCBtdWx0aXBsZSBuYW1lPSJjb3VudHJpZXMiIFtmb3JtQ29udHJvbF09ImNvdW50cnlDb250cm9sIj4KICAgICAqICAgPG9wdGlvbiAqbmdGb3I9ImxldCBjb3VudHJ5IG9mIGNvdW50cmllcyIgW25nVmFsdWVdPSJjb3VudHJ5Ij4KICAgICAqICAgICB7eyBjb3VudHJ5Lm5hbWUgfX0KICAgICAqICAgPC9vcHRpb24+CiAgICAgKiA8L3NlbGVjdD4KICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBDdXN0b21pemluZyBvcHRpb24gc2VsZWN0aW9uCiAgICAgKgogICAgICogVG8gY3VzdG9taXplIHRoZSBkZWZhdWx0IG9wdGlvbiBjb21wYXJpc29uIGFsZ29yaXRobSwgYDxzZWxlY3Q+YCBzdXBwb3J0cyBgY29tcGFyZVdpdGhgIGlucHV0LgogICAgICogU2VlIHRoZSBgU2VsZWN0Q29udHJvbFZhbHVlQWNjZXNzb3JgIGZvciB1c2FnZS4KICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3JlbmRlcmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9yZW5kZXJlciwgX2VsZW1lbnRSZWYpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX29wdGlvbk1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2lkQ291bnRlciA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgY2hhbmdlIGV2ZW50IG9jY3VycyBvbiB0aGUgaW5wdXQgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKF8pID0+IHsgfSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIFRoZSByZWdpc3RlcmVkIGNhbGxiYWNrIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIGEgYmx1ciBldmVudCBvY2N1cnMgb24gdGhlIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgICAgIHRoaXMuX2NvbXBhcmVXaXRoID0gbG9vc2VJZGVudGljYWw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUcmFja3MgdGhlIG9wdGlvbiBjb21wYXJpc29uIGFsZ29yaXRobSBmb3IgdHJhY2tpbmcgaWRlbnRpdGllcyB3aGVuCiAgICAgICAgICogY2hlY2tpbmcgZm9yIGNoYW5nZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGNvbXBhcmVXaXRoKGZuKSB7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZm4gIT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgY29tcGFyZVdpdGggbXVzdCBiZSBhIGZ1bmN0aW9uLCBidXQgcmVjZWl2ZWQgJHtKU09OLnN0cmluZ2lmeShmbil9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFNldHMgdGhlICJ2YWx1ZSIgcHJvcGVydHkgb24gb25lIG9yIG9mIG1vcmUKICAgICAgICAgKiBvZiB0aGUgc2VsZWN0J3Mgb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlcjsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAvLyBjb252ZXJ0IHZhbHVlcyB0byBpZHMKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGlkcyA9IHZhbHVlLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh2KSA9PiB0aGlzLl9nZXRPcHRpb25JZCh2KSkpOwogICAgICAgICAgICAgICAgb3B0aW9uU2VsZWN0ZWRTdGF0ZVNldHRlciA9ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0CiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG8KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChvcHQsIG8pID0+IHsKICAgICAgICAgICAgICAgICAgICBvcHQuX3NldFNlbGVjdGVkKGlkcy5pbmRleE9mKG8udG9TdHJpbmcoKSkgPiAtMSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG9wdGlvblNlbGVjdGVkU3RhdGVTZXR0ZXIgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAob3B0LCBvKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgb3B0Ll9zZXRTZWxlY3RlZChmYWxzZSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9vcHRpb25NYXAuZm9yRWFjaChvcHRpb25TZWxlY3RlZFN0YXRlU2V0dGVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlZ2lzdGVycyBhIGZ1bmN0aW9uIGNhbGxlZCB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGNoYW5nZXMKICAgICAgICAgKiBhbmQgd3JpdGVzIGFuIGFycmF5IG9mIHRoZSBzZWxlY3RlZCBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoXykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWQgPSBbXTsKICAgICAgICAgICAgICAgIGlmIChfLmhhc093blByb3BlcnR5KCdzZWxlY3RlZE9wdGlvbnMnKSkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gXy5zZWxlY3RlZE9wdGlvbnM7CiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBvcHRpb25zLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0ID0gb3B0aW9ucy5pdGVtKGkpOwogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX2dldE9wdGlvblZhbHVlKG9wdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLnB1c2godmFsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBEZWdyYWRlIG9uIElFCiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovIChfLm9wdGlvbnMpKTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9wdGlvbnMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvcHQgPSBvcHRpb25zLml0ZW0oaSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvcHQuc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbCA9IHRoaXMuX2dldE9wdGlvblZhbHVlKG9wdC52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZC5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gc2VsZWN0ZWQ7CiAgICAgICAgICAgICAgICBmbihzZWxlY3RlZCk7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVnaXN0ZXJzIGEgZnVuY3Rpb24gY2FsbGVkIHdoZW4gdGhlIGNvbnRyb2wgaXMgdG91Y2hlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uVG91Y2hlZChmbikgewogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSAiZGlzYWJsZWQiIHByb3BlcnR5IG9uIHRoZSBzZWxlY3QgaW5wdXQgZWxlbWVudC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZCBUaGUgZGlzYWJsZWQgdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJlci5zZXRQcm9wZXJ0eSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkaXNhYmxlZCcsIGlzRGlzYWJsZWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3JlZ2lzdGVyT3B0aW9uKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaWQgPSAodGhpcy5faWRDb3VudGVyKyspLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIHRoaXMuX29wdGlvbk1hcC5zZXQoaWQsIHZhbHVlKTsKICAgICAgICAgICAgcmV0dXJuIGlkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE9wdGlvbklkKHZhbHVlKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgaWQgb2YgQXJyYXkuZnJvbSh0aGlzLl9vcHRpb25NYXAua2V5cygpKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBhcmVXaXRoKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9vcHRpb25NYXAuZ2V0KGlkKSkpLl92YWx1ZSwgdmFsdWUpKQogICAgICAgICAgICAgICAgICAgIHJldHVybiBpZDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVTdHJpbmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPcHRpb25WYWx1ZSh2YWx1ZVN0cmluZykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlkID0gX2V4dHJhY3RJZCQxKHZhbHVlU3RyaW5nKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29wdGlvbk1hcC5oYXMoaWQpID8gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX29wdGlvbk1hcC5nZXQoaWQpKSkuX3ZhbHVlIDogdmFsdWVTdHJpbmc7CiAgICAgICAgfQogICAgfQogICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvci7JtWZhYyA9IGZ1bmN0aW9uIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvcikoybXJtWRpcmVjdGl2ZUluamVjdChSZW5kZXJlcjIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvciwgc2VsZWN0b3JzOiBbWyJzZWxlY3QiLCAibXVsdGlwbGUiLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyJzZWxlY3QiLCAibXVsdGlwbGUiLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbInNlbGVjdCIsICJtdWx0aXBsZSIsICIiLCAibmdNb2RlbCIsICIiXV0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvcl9jaGFuZ2VfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uQ2hhbmdlKCRldmVudC50YXJnZXQpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIFNlbGVjdE11bHRpcGxlQ29udHJvbFZhbHVlQWNjZXNzb3JfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25Ub3VjaGVkKCk7IH0pOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGNvbXBhcmVXaXRoOiAiY29tcGFyZVdpdGgiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW1NFTEVDVF9NVUxUSVBMRV9WQUxVRV9BQ0NFU1NPUl0pXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3Nvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjb21wYXJlV2l0aDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIE1hcmtzIGA8b3B0aW9uPmAgYXMgZHluYW1pYywgc28gQW5ndWxhciBjYW4gYmUgbm90aWZpZWQgd2hlbiBvcHRpb25zIGNoYW5nZS4KICAgICAqCiAgICAgKiBAc2VlIGBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yYAogICAgICoKICAgICAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogICAgICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBfcmVuZGVyZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9zZWxlY3QKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX3JlbmRlcmVyLCBfc2VsZWN0KSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBfZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIgPSBfcmVuZGVyZXI7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdCA9IF9zZWxlY3Q7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLl9zZWxlY3QuX3JlZ2lzdGVyT3B0aW9uKHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUcmFja3MgdGhlIHZhbHVlIGJvdW5kIHRvIHRoZSBvcHRpb24gZWxlbWVudC4gVW5saWtlIHRoZSB2YWx1ZSBiaW5kaW5nLAogICAgICAgICAqIG5nVmFsdWUgc3VwcG9ydHMgYmluZGluZyB0byBvYmplY3RzLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBuZ1ZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3QgPT0gbnVsbCkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fc2V0RWxlbWVudFZhbHVlKF9idWlsZFZhbHVlU3RyaW5nJDEodGhpcy5pZCwgdmFsdWUpKTsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRyYWNrcyBzaW1wbGUgc3RyaW5nIHZhbHVlcyBib3VuZCB0byB0aGUgb3B0aW9uIGVsZW1lbnQuCiAgICAgICAgICogRm9yIG9iamVjdHMsIHVzZSB0aGUgYG5nVmFsdWVgIGlucHV0IGJpbmRpbmcuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRFbGVtZW50VmFsdWUoX2J1aWxkVmFsdWVTdHJpbmckMSh0aGlzLmlkLCB2YWx1ZSkpOwogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0LndyaXRlVmFsdWUodGhpcy5fc2VsZWN0LnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NldEVsZW1lbnRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRFbGVtZW50VmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCAndmFsdWUnLCB2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IHNlbGVjdGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpIHsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyZXIuc2V0UHJvcGVydHkodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LCAnc2VsZWN0ZWQnLCBzZWxlY3RlZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3QpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdC5fb3B0aW9uTWFwLmRlbGV0ZSh0aGlzLmlkKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdC53cml0ZVZhbHVlKHRoaXMuX3NlbGVjdC52YWx1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24uybVmYWMgPSBmdW5jdGlvbiDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb25fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJlbmRlcmVyMiksIMm1ybVkaXJlY3RpdmVJbmplY3QoU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciwgOSkpOyB9OwogICAgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbiwgc2VsZWN0b3JzOiBbWyJvcHRpb24iXV0sIGlucHV0czogeyBuZ1ZhbHVlOiAibmdWYWx1ZSIsIHZhbHVlOiAidmFsdWUiIH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIMm1TmdTZWxlY3RNdWx0aXBsZU9wdGlvbi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFJlbmRlcmVyMiB9LAogICAgICAgIHsgdHlwZTogU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBIb3N0IH1dIH0KICAgIF07CiAgICDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24ucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmdWYWx1ZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdWYWx1ZScsXSB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsndmFsdWUnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9zaGFyZWQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb250cm9sUGF0aChuYW1lLCBwYXJlbnQpIHsKICAgICAgICByZXR1cm4gWy4uLigvKiogQHR5cGUgez99ICovIChwYXJlbnQucGF0aCkpLCAoLyoqIEB0eXBlIHs/fSAqLyAobmFtZSkpXTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc2V0VXBDb250cm9sKGNvbnRyb2wsIGRpcikgewogICAgICAgIGlmICghY29udHJvbCkKICAgICAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnQ2Fubm90IGZpbmQgY29udHJvbCB3aXRoJyk7CiAgICAgICAgaWYgKCFkaXIudmFsdWVBY2Nlc3NvcikKICAgICAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnTm8gdmFsdWUgYWNjZXNzb3IgZm9yIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICAgICAgY29udHJvbC52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoWygvKiogQHR5cGUgez99ICovIChjb250cm9sLnZhbGlkYXRvcikpLCBkaXIudmFsaWRhdG9yXSk7CiAgICAgICAgY29udHJvbC5hc3luY1ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKFsoLyoqIEB0eXBlIHs/fSAqLyAoY29udHJvbC5hc3luY1ZhbGlkYXRvcikpLCBkaXIuYXN5bmNWYWxpZGF0b3JdKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS53cml0ZVZhbHVlKGNvbnRyb2wudmFsdWUpOwogICAgICAgIHNldFVwVmlld0NoYW5nZVBpcGVsaW5lKGNvbnRyb2wsIGRpcik7CiAgICAgICAgc2V0VXBNb2RlbENoYW5nZVBpcGVsaW5lKGNvbnRyb2wsIGRpcik7CiAgICAgICAgc2V0VXBCbHVyUGlwZWxpbmUoY29udHJvbCwgZGlyKTsKICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGRpci52YWx1ZUFjY2Vzc29yKSkuc2V0RGlzYWJsZWRTdGF0ZSkgewogICAgICAgICAgICBjb250cm9sLnJlZ2lzdGVyT25EaXNhYmxlZENoYW5nZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGlzRGlzYWJsZWQpID0+IHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS5zZXREaXNhYmxlZFN0YXRlKSkoaXNEaXNhYmxlZCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLy8gcmUtcnVuIHZhbGlkYXRpb24gd2hlbiB2YWxpZGF0b3IgYmluZGluZyBjaGFuZ2VzLCBlLmcuIG1pbmxlbmd0aD0zIC0+IG1pbmxlbmd0aD00CiAgICAgICAgZGlyLl9yYXdWYWxpZGF0b3JzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsaWRhdG9yKSA9PiB7CiAgICAgICAgICAgIGlmICgoKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpKS5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKQogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yKSkpLnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UpKSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiBjb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKSkpOwogICAgICAgIH0pKTsKICAgICAgICBkaXIuX3Jhd0FzeW5jVmFsaWRhdG9ycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHZhbGlkYXRvcikgPT4gewogICAgICAgICAgICBpZiAoKCgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3IpKSkucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSkKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICgoKC8qKiBAdHlwZSB7P30gKi8gKHZhbGlkYXRvcikpKS5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKSkoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gY29udHJvbC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCkpKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsZWFuVXBDb250cm9sKGNvbnRyb2wsIGRpcikgewogICAgICAgICgvKiogQHR5cGUgez99ICovIChkaXIudmFsdWVBY2Nlc3NvcikpLnJlZ2lzdGVyT25DaGFuZ2UoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gX25vQ29udHJvbEVycm9yKGRpcikpKTsKICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS5yZWdpc3Rlck9uVG91Y2hlZCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBfbm9Db250cm9sRXJyb3IoZGlyKSkpOwogICAgICAgIGRpci5fcmF3VmFsaWRhdG9ycy5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHZhbGlkYXRvcikgPT4gewogICAgICAgICAgICBpZiAodmFsaWRhdG9yLnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIHZhbGlkYXRvci5yZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKG51bGwpOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGRpci5fcmF3QXN5bmNWYWxpZGF0b3JzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodmFsaWRhdG9yKSA9PiB7CiAgICAgICAgICAgIGlmICh2YWxpZGF0b3IucmVnaXN0ZXJPblZhbGlkYXRvckNoYW5nZSkgewogICAgICAgICAgICAgICAgdmFsaWRhdG9yLnJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgaWYgKGNvbnRyb2wpCiAgICAgICAgICAgIGNvbnRyb2wuX2NsZWFyQ2hhbmdlRm5zKCk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFVwVmlld0NoYW5nZVBpcGVsaW5lKGNvbnRyb2wsIGRpcikgewogICAgICAgICgvKiogQHR5cGUgez99ICovIChkaXIudmFsdWVBY2Nlc3NvcikpLnJlZ2lzdGVyT25DaGFuZ2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChuZXdWYWx1ZSkgPT4gewogICAgICAgICAgICBjb250cm9sLl9wZW5kaW5nVmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgY29udHJvbC5fcGVuZGluZ0NoYW5nZSA9IHRydWU7CiAgICAgICAgICAgIGNvbnRyb2wuX3BlbmRpbmdEaXJ0eSA9IHRydWU7CiAgICAgICAgICAgIGlmIChjb250cm9sLnVwZGF0ZU9uID09PSAnY2hhbmdlJykKICAgICAgICAgICAgICAgIHVwZGF0ZUNvbnRyb2woY29udHJvbCwgZGlyKTsKICAgICAgICB9KSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFVwQmx1clBpcGVsaW5lKGNvbnRyb2wsIGRpcikgewogICAgICAgICgvKiogQHR5cGUgez99ICovIChkaXIudmFsdWVBY2Nlc3NvcikpLnJlZ2lzdGVyT25Ub3VjaGVkKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IHsKICAgICAgICAgICAgY29udHJvbC5fcGVuZGluZ1RvdWNoZWQgPSB0cnVlOwogICAgICAgICAgICBpZiAoY29udHJvbC51cGRhdGVPbiA9PT0gJ2JsdXInICYmIGNvbnRyb2wuX3BlbmRpbmdDaGFuZ2UpCiAgICAgICAgICAgICAgICB1cGRhdGVDb250cm9sKGNvbnRyb2wsIGRpcik7CiAgICAgICAgICAgIGlmIChjb250cm9sLnVwZGF0ZU9uICE9PSAnc3VibWl0JykKICAgICAgICAgICAgICAgIGNvbnRyb2wubWFya0FzVG91Y2hlZCgpOwogICAgICAgIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdXBkYXRlQ29udHJvbChjb250cm9sLCBkaXIpIHsKICAgICAgICBpZiAoY29udHJvbC5fcGVuZGluZ0RpcnR5KQogICAgICAgICAgICBjb250cm9sLm1hcmtBc0RpcnR5KCk7CiAgICAgICAgY29udHJvbC5zZXRWYWx1ZShjb250cm9sLl9wZW5kaW5nVmFsdWUsIHsgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSB9KTsKICAgICAgICBkaXIudmlld1RvTW9kZWxVcGRhdGUoY29udHJvbC5fcGVuZGluZ1ZhbHVlKTsKICAgICAgICBjb250cm9sLl9wZW5kaW5nQ2hhbmdlID0gZmFsc2U7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNldFVwTW9kZWxDaGFuZ2VQaXBlbGluZShjb250cm9sLCBkaXIpIHsKICAgICAgICBjb250cm9sLnJlZ2lzdGVyT25DaGFuZ2UoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAgICAgKiBAcGFyYW0gez99IGVtaXRNb2RlbEV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobmV3VmFsdWUsIGVtaXRNb2RlbEV2ZW50KSA9PiB7CiAgICAgICAgICAgIC8vIGNvbnRyb2wgLT4gdmlldwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnZhbHVlQWNjZXNzb3IpKS53cml0ZVZhbHVlKG5ld1ZhbHVlKTsKICAgICAgICAgICAgLy8gY29udHJvbCAtPiBuZ01vZGVsCiAgICAgICAgICAgIGlmIChlbWl0TW9kZWxFdmVudCkKICAgICAgICAgICAgICAgIGRpci52aWV3VG9Nb2RlbFVwZGF0ZShuZXdWYWx1ZSk7CiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZXRVcEZvcm1Db250YWluZXIoY29udHJvbCwgZGlyKSB7CiAgICAgICAgaWYgKGNvbnRyb2wgPT0gbnVsbCkKICAgICAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnQ2Fubm90IGZpbmQgY29udHJvbCB3aXRoJyk7CiAgICAgICAgY29udHJvbC52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoW2NvbnRyb2wudmFsaWRhdG9yLCBkaXIudmFsaWRhdG9yXSk7CiAgICAgICAgY29udHJvbC5hc3luY1ZhbGlkYXRvciA9IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKFtjb250cm9sLmFzeW5jVmFsaWRhdG9yLCBkaXIuYXN5bmNWYWxpZGF0b3JdKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIF9ub0NvbnRyb2xFcnJvcihkaXIpIHsKICAgICAgICByZXR1cm4gX3Rocm93RXJyb3IoZGlyLCAnVGhlcmUgaXMgbm8gRm9ybUNvbnRyb2wgaW5zdGFuY2UgYXR0YWNoZWQgdG8gZm9ybSBjb250cm9sIGVsZW1lbnQgd2l0aCcpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICogQHBhcmFtIHs/fSBtZXNzYWdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBfdGhyb3dFcnJvcihkaXIsIG1lc3NhZ2UpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IG1lc3NhZ2VFbmQ7CiAgICAgICAgaWYgKCgvKiogQHR5cGUgez99ICovIChkaXIucGF0aCkpLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgbWVzc2FnZUVuZCA9IGBwYXRoOiAnJHsoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnBhdGgpKS5qb2luKCcgLT4gJyl9J2A7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKCgvKiogQHR5cGUgez99ICovIChkaXIucGF0aCkpWzBdKSB7CiAgICAgICAgICAgIG1lc3NhZ2VFbmQgPSBgbmFtZTogJyR7ZGlyLnBhdGh9J2A7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBtZXNzYWdlRW5kID0gJ3Vuc3BlY2lmaWVkIG5hbWUgYXR0cmlidXRlJzsKICAgICAgICB9CiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAke21lc3NhZ2V9ICR7bWVzc2FnZUVuZH1gKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2YWxpZGF0b3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb21wb3NlVmFsaWRhdG9ycyh2YWxpZGF0b3JzKSB7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnMgIT0gbnVsbCA/IFZhbGlkYXRvcnMuY29tcG9zZSh2YWxpZGF0b3JzLm1hcChub3JtYWxpemVWYWxpZGF0b3IpKSA6IG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh2YWxpZGF0b3JzKSB7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRvcnMgIT0gbnVsbCA/IFZhbGlkYXRvcnMuY29tcG9zZUFzeW5jKHZhbGlkYXRvcnMubWFwKG5vcm1hbGl6ZUFzeW5jVmFsaWRhdG9yKSkgOgogICAgICAgICAgICBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAqIEBwYXJhbSB7P30gdmlld01vZGVsCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB2aWV3TW9kZWwpIHsKICAgICAgICBpZiAoIWNoYW5nZXMuaGFzT3duUHJvcGVydHkoJ21vZGVsJykpCiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY2hhbmdlID0gY2hhbmdlc1snbW9kZWwnXTsKICAgICAgICBpZiAoY2hhbmdlLmlzRmlyc3RDaGFuZ2UoKSkKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgcmV0dXJuICFsb29zZUlkZW50aWNhbCh2aWV3TW9kZWwsIGNoYW5nZS5jdXJyZW50VmFsdWUpOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgQlVJTFRJTl9BQ0NFU1NPUlMgPSBbCiAgICAgICAgQ2hlY2tib3hDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICBSYW5nZVZhbHVlQWNjZXNzb3IsCiAgICAgICAgTnVtYmVyVmFsdWVBY2Nlc3NvciwKICAgICAgICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgIFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3IsCiAgICBdOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHZhbHVlQWNjZXNzb3IKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzQnVpbHRJbkFjY2Vzc29yKHZhbHVlQWNjZXNzb3IpIHsKICAgICAgICByZXR1cm4gQlVJTFRJTl9BQ0NFU1NPUlMuc29tZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhID0+IHZhbHVlQWNjZXNzb3IuY29uc3RydWN0b3IgPT09IGEpKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmb3JtCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGl2ZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN5bmNQZW5kaW5nQ29udHJvbHMoZm9ybSwgZGlyZWN0aXZlcykgewogICAgICAgIGZvcm0uX3N5bmNQZW5kaW5nQ29udHJvbHMoKTsKICAgICAgICBkaXJlY3RpdmVzLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXIgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRyb2wgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLmNvbnRyb2wpKTsKICAgICAgICAgICAgaWYgKGNvbnRyb2wudXBkYXRlT24gPT09ICdzdWJtaXQnICYmIGNvbnRyb2wuX3BlbmRpbmdDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIGRpci52aWV3VG9Nb2RlbFVwZGF0ZShjb250cm9sLl9wZW5kaW5nVmFsdWUpOwogICAgICAgICAgICAgICAgY29udHJvbC5fcGVuZGluZ0NoYW5nZSA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgfQogICAgLy8gVE9ETzogdnNhdmtpbiByZW1vdmUgaXQgb25jZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8zMDExIGlzIGltcGxlbWVudGVkCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZGlyCiAgICAgKiBAcGFyYW0gez99IHZhbHVlQWNjZXNzb3JzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzZWxlY3RWYWx1ZUFjY2Vzc29yKGRpciwgdmFsdWVBY2Nlc3NvcnMpIHsKICAgICAgICBpZiAoIXZhbHVlQWNjZXNzb3JzKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWVBY2Nlc3NvcnMpKQogICAgICAgICAgICBfdGhyb3dFcnJvcihkaXIsICdWYWx1ZSBhY2Nlc3NvciB3YXMgbm90IHByb3ZpZGVkIGFzIGFuIGFycmF5IGZvciBmb3JtIGNvbnRyb2wgd2l0aCcpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgZGVmYXVsdEFjY2Vzc29yID0gdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYnVpbHRpbkFjY2Vzc29yID0gdW5kZWZpbmVkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgY3VzdG9tQWNjZXNzb3IgPSB1bmRlZmluZWQ7CiAgICAgICAgdmFsdWVBY2Nlc3NvcnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAodikgPT4gewogICAgICAgICAgICBpZiAodi5jb25zdHJ1Y3RvciA9PT0gRGVmYXVsdFZhbHVlQWNjZXNzb3IpIHsKICAgICAgICAgICAgICAgIGRlZmF1bHRBY2Nlc3NvciA9IHY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNCdWlsdEluQWNjZXNzb3IodikpIHsKICAgICAgICAgICAgICAgIGlmIChidWlsdGluQWNjZXNzb3IpCiAgICAgICAgICAgICAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnTW9yZSB0aGFuIG9uZSBidWlsdC1pbiB2YWx1ZSBhY2Nlc3NvciBtYXRjaGVzIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICAgICAgICAgICAgICBidWlsdGluQWNjZXNzb3IgPSB2OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgaWYgKGN1c3RvbUFjY2Vzc29yKQogICAgICAgICAgICAgICAgICAgIF90aHJvd0Vycm9yKGRpciwgJ01vcmUgdGhhbiBvbmUgY3VzdG9tIHZhbHVlIGFjY2Vzc29yIG1hdGNoZXMgZm9ybSBjb250cm9sIHdpdGgnKTsKICAgICAgICAgICAgICAgIGN1c3RvbUFjY2Vzc29yID0gdjsKICAgICAgICAgICAgfQogICAgICAgIH0pKTsKICAgICAgICBpZiAoY3VzdG9tQWNjZXNzb3IpCiAgICAgICAgICAgIHJldHVybiBjdXN0b21BY2Nlc3NvcjsKICAgICAgICBpZiAoYnVpbHRpbkFjY2Vzc29yKQogICAgICAgICAgICByZXR1cm4gYnVpbHRpbkFjY2Vzc29yOwogICAgICAgIGlmIChkZWZhdWx0QWNjZXNzb3IpCiAgICAgICAgICAgIHJldHVybiBkZWZhdWx0QWNjZXNzb3I7CiAgICAgICAgX3Rocm93RXJyb3IoZGlyLCAnTm8gdmFsaWQgdmFsdWUgYWNjZXNzb3IgZm9yIGZvcm0gY29udHJvbCB3aXRoJyk7CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKiBAcGFyYW0gez99IGxpc3QKICAgICAqIEBwYXJhbSB7P30gZWwKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZURpcihsaXN0LCBlbCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBpbmRleCA9IGxpc3QuaW5kZXhPZihlbCk7CiAgICAgICAgaWYgKGluZGV4ID4gLTEpCiAgICAgICAgICAgIGxpc3Quc3BsaWNlKGluZGV4LCAxKTsKICAgIH0KICAgIC8vIFRPRE8oa2FyYSk6IHJlbW92ZSBhZnRlciBkZXByZWNhdGlvbiBwZXJpb2QKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgKiBAcGFyYW0gez99IHR5cGUKICAgICAqIEBwYXJhbSB7P30gaW5zdGFuY2UKICAgICAqIEBwYXJhbSB7P30gd2FybmluZ0NvbmZpZwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX25nTW9kZWxXYXJuaW5nKG5hbWUsIHR5cGUsIGluc3RhbmNlLCB3YXJuaW5nQ29uZmlnKSB7CiAgICAgICAgaWYgKCFpc0Rldk1vZGUoKSB8fCB3YXJuaW5nQ29uZmlnID09PSAnbmV2ZXInKQogICAgICAgICAgICByZXR1cm47CiAgICAgICAgaWYgKCgod2FybmluZ0NvbmZpZyA9PT0gbnVsbCB8fCB3YXJuaW5nQ29uZmlnID09PSAnb25jZScpICYmICF0eXBlLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlKSB8fAogICAgICAgICAgICAod2FybmluZ0NvbmZpZyA9PT0gJ2Fsd2F5cycgJiYgIWluc3RhbmNlLl9uZ01vZGVsV2FybmluZ1NlbnQpKSB7CiAgICAgICAgICAgIFJlYWN0aXZlRXJyb3JzLm5nTW9kZWxXYXJuaW5nKG5hbWUpOwogICAgICAgICAgICB0eXBlLl9uZ01vZGVsV2FybmluZ1NlbnRPbmNlID0gdHJ1ZTsKICAgICAgICAgICAgaW5zdGFuY2UuX25nTW9kZWxXYXJuaW5nU2VudCA9IHRydWU7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL21vZGVsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUmVwb3J0cyB0aGF0IGEgRm9ybUNvbnRyb2wgaXMgdmFsaWQsIG1lYW5pbmcgdGhhdCBubyBlcnJvcnMgZXhpc3QgaW4gdGhlIGlucHV0IHZhbHVlLgogICAgICoKICAgICAqIEBzZWUgYHN0YXR1c2AKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBWQUxJRCA9ICdWQUxJRCc7CiAgICAvKioKICAgICAqIFJlcG9ydHMgdGhhdCBhIEZvcm1Db250cm9sIGlzIGludmFsaWQsIG1lYW5pbmcgdGhhdCBhbiBlcnJvciBleGlzdHMgaW4gdGhlIGlucHV0IHZhbHVlLgogICAgICoKICAgICAqIEBzZWUgYHN0YXR1c2AKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBJTlZBTElEID0gJ0lOVkFMSUQnOwogICAgLyoqCiAgICAgKiBSZXBvcnRzIHRoYXQgYSBGb3JtQ29udHJvbCBpcyBwZW5kaW5nLCBtZWFuaW5nIHRoYXQgdGhhdCBhc3luYyB2YWxpZGF0aW9uIGlzIG9jY3VycmluZyBhbmQKICAgICAqIGVycm9ycyBhcmUgbm90IHlldCBhdmFpbGFibGUgZm9yIHRoZSBpbnB1dCB2YWx1ZS4KICAgICAqCiAgICAgKiBAc2VlIGBtYXJrQXNQZW5kaW5nYAogICAgICogQHNlZSBgc3RhdHVzYAogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFBFTkRJTkcgPSAnUEVORElORyc7CiAgICAvKioKICAgICAqIFJlcG9ydHMgdGhhdCBhIEZvcm1Db250cm9sIGlzIGRpc2FibGVkLCBtZWFuaW5nIHRoYXQgdGhlIGNvbnRyb2wgaXMgZXhlbXB0IGZyb20gYW5jZXN0b3IKICAgICAqIGNhbGN1bGF0aW9ucyBvZiB2YWxpZGl0eSBvciB2YWx1ZS4KICAgICAqCiAgICAgKiBAc2VlIGBtYXJrQXNEaXNhYmxlZGAKICAgICAqIEBzZWUgYHN0YXR1c2AKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBESVNBQkxFRCA9ICdESVNBQkxFRCc7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgKiBAcGFyYW0gez99IGRlbGltaXRlcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2ZpbmQoY29udHJvbCwgcGF0aCwgZGVsaW1pdGVyKSB7CiAgICAgICAgaWYgKHBhdGggPT0gbnVsbCkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHBhdGgpKSB7CiAgICAgICAgICAgIHBhdGggPSBwYXRoLnNwbGl0KGRlbGltaXRlcik7CiAgICAgICAgfQogICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBhdGgpICYmIHBhdGgubGVuZ3RoID09PSAwKQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAvLyBOb3QgdXNpbmcgQXJyYXkucmVkdWNlIGhlcmUgZHVlIHRvIGEgQ2hyb21lIDgwIGJ1ZwogICAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTEwNDk5ODIKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IGNvbnRyb2xUb0ZpbmQgPSBjb250cm9sOwogICAgICAgIHBhdGguZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobmFtZSkgPT4gewogICAgICAgICAgICBpZiAoY29udHJvbFRvRmluZCBpbnN0YW5jZW9mIEZvcm1Hcm91cCkgewogICAgICAgICAgICAgICAgY29udHJvbFRvRmluZCA9IGNvbnRyb2xUb0ZpbmQuY29udHJvbHMuaGFzT3duUHJvcGVydHkoKC8qKiBAdHlwZSB7P30gKi8gKG5hbWUpKSkgPwogICAgICAgICAgICAgICAgICAgIGNvbnRyb2xUb0ZpbmQuY29udHJvbHNbbmFtZV0gOgogICAgICAgICAgICAgICAgICAgIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbFRvRmluZCBpbnN0YW5jZW9mIEZvcm1BcnJheSkgewogICAgICAgICAgICAgICAgY29udHJvbFRvRmluZCA9IGNvbnRyb2xUb0ZpbmQuYXQoKC8qKiBAdHlwZSB7P30gKi8gKG5hbWUpKSkgfHwgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnRyb2xUb0ZpbmQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBjb250cm9sVG9GaW5kOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSB2YWxpZGF0b3JPck9wdHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvZXJjZVRvVmFsaWRhdG9yKHZhbGlkYXRvck9yT3B0cykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKGlzT3B0aW9uc09iaih2YWxpZGF0b3JPck9wdHMpID8gKCgvKiogQHR5cGUgez99ICovICh2YWxpZGF0b3JPck9wdHMpKSkudmFsaWRhdG9ycyA6CiAgICAgICAgICAgIHZhbGlkYXRvck9yT3B0cykpKTsKICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWxpZGF0b3IpID8gY29tcG9zZVZhbGlkYXRvcnModmFsaWRhdG9yKSA6IHZhbGlkYXRvciB8fCBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez89fSBhc3luY1ZhbGlkYXRvcgogICAgICogQHBhcmFtIHs/PX0gdmFsaWRhdG9yT3JPcHRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb2VyY2VUb0FzeW5jVmFsaWRhdG9yKGFzeW5jVmFsaWRhdG9yLCB2YWxpZGF0b3JPck9wdHMpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgb3JpZ0FzeW5jVmFsaWRhdG9yID0gKC8qKiBAdHlwZSB7P30gKi8gKChpc09wdGlvbnNPYmoodmFsaWRhdG9yT3JPcHRzKSA/ICgoLyoqIEB0eXBlIHs/fSAqLyAodmFsaWRhdG9yT3JPcHRzKSkpLmFzeW5jVmFsaWRhdG9ycyA6CiAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9yKSkpOwogICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KG9yaWdBc3luY1ZhbGlkYXRvcikgPyBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKG9yaWdBc3luY1ZhbGlkYXRvcikgOgogICAgICAgICAgICBvcmlnQXN5bmNWYWxpZGF0b3IgfHwgbnVsbDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/PX0gdmFsaWRhdG9yT3JPcHRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc09wdGlvbnNPYmoodmFsaWRhdG9yT3JPcHRzKSB7CiAgICAgICAgcmV0dXJuIHZhbGlkYXRvck9yT3B0cyAhPSBudWxsICYmICFBcnJheS5pc0FycmF5KHZhbGlkYXRvck9yT3B0cykgJiYKICAgICAgICAgICAgdHlwZW9mIHZhbGlkYXRvck9yT3B0cyA9PT0gJ29iamVjdCc7CiAgICB9CiAgICAvKioKICAgICAqIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIGBGb3JtQ29udHJvbGAsIGBGb3JtR3JvdXBgLCBhbmQgYEZvcm1BcnJheWAuCiAgICAgKgogICAgICogSXQgcHJvdmlkZXMgc29tZSBvZiB0aGUgc2hhcmVkIGJlaGF2aW9yIHRoYXQgYWxsIGNvbnRyb2xzIGFuZCBncm91cHMgb2YgY29udHJvbHMgaGF2ZSwgbGlrZQogICAgICogcnVubmluZyB2YWxpZGF0b3JzLCBjYWxjdWxhdGluZyBzdGF0dXMsIGFuZCByZXNldHRpbmcgc3RhdGUuIEl0IGFsc28gZGVmaW5lcyB0aGUgcHJvcGVydGllcwogICAgICogdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gYWxsIHN1Yi1jbGFzc2VzLCBsaWtlIGB2YWx1ZWAsIGB2YWxpZGAsIGFuZCBgZGlydHlgLiBJdCBzaG91bGRuJ3QgYmUKICAgICAqIGluc3RhbnRpYXRlZCBkaXJlY3RseS4KICAgICAqCiAgICAgKiBAc2VlIFtGb3JtcyBHdWlkZV0oL2d1aWRlL2Zvcm1zKQogICAgICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKC9ndWlkZS9yZWFjdGl2ZS1mb3JtcykKICAgICAqIEBzZWUgW0R5bmFtaWMgRm9ybXMgR3VpZGVdKC9ndWlkZS9keW5hbWljLWZvcm0pCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBBYnN0cmFjdENvbnRyb2wgewogICAgICAgIC8qKgogICAgICAgICAqIEluaXRpYWxpemUgdGhlIEFic3RyYWN0Q29udHJvbCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9yIFRoZSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIHN5bmNocm9ub3VzIHZhbGlkaXR5IG9mIHRoaXMgY29udHJvbC4KICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jVmFsaWRhdG9yIFRoZSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgdGhlIGFzeW5jaHJvbm91cyB2YWxpZGl0eSBvZiB0aGlzCiAgICAgICAgICogY29udHJvbC4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgICAgIHRoaXMudmFsaWRhdG9yID0gdmFsaWRhdG9yOwogICAgICAgICAgICB0aGlzLmFzeW5jVmFsaWRhdG9yID0gYXN5bmNWYWxpZGF0b3I7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBjb250cm9sIGlzIGBwcmlzdGluZWAgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgY2hhbmdlZAogICAgICAgICAgICAgKiB0aGUgdmFsdWUgaW4gdGhlIFVJLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgY2hhbmdlZCB0aGUgdmFsdWUgaW4gdGhlIFVJOyBjb21wYXJlIGBkaXJ0eWAuCiAgICAgICAgICAgICAqIFByb2dyYW1tYXRpYyBjaGFuZ2VzIHRvIGEgY29udHJvbCdzIHZhbHVlIGRvIG5vdCBtYXJrIGl0IGRpcnR5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5wcmlzdGluZSA9IHRydWU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUcnVlIGlmIHRoZSBjb250cm9sIGlzIG1hcmtlZCBhcyBgdG91Y2hlZGAuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEEgY29udHJvbCBpcyBtYXJrZWQgYHRvdWNoZWRgIG9uY2UgdGhlIHVzZXIgaGFzIHRyaWdnZXJlZAogICAgICAgICAgICAgKiBhIGBibHVyYCBldmVudCBvbiBpdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudG91Y2hlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25EaXNhYmxlZENoYW5nZSA9IFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcGFyZW50IGNvbnRyb2wuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGFyZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYHZhbGlkYCB3aGVuIGl0cyBgc3RhdHVzYCBpcyBgVkFMSURgLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9CiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoZSBjb250cm9sIGhhcyBwYXNzZWQgYWxsIG9mIGl0cyB2YWxpZGF0aW9uIHRlc3RzLAogICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBnZXQgdmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gVkFMSUQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEEgY29udHJvbCBpcyBgaW52YWxpZGAgd2hlbiBpdHMgYHN0YXR1c2AgaXMgYElOVkFMSURgLgogICAgICAgICAqCiAgICAgICAgICogQHNlZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbC5zdGF0dXN9CiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoaXMgY29udHJvbCBoYXMgZmFpbGVkIG9uZSBvciBtb3JlIG9mIGl0cyB2YWxpZGF0aW9uIGNoZWNrcywKICAgICAgICAgKiBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgZ2V0IGludmFsaWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gSU5WQUxJRDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBjb250cm9sIGlzIGBwZW5kaW5nYCB3aGVuIGl0cyBgc3RhdHVzYCBpcyBgUEVORElOR2AuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhpcyBjb250cm9sIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbmR1Y3RpbmcgYSB2YWxpZGF0aW9uIGNoZWNrLAogICAgICAgICAqIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBnZXQgcGVuZGluZygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RhdHVzID09IFBFTkRJTkc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEEgY29udHJvbCBpcyBgZGlzYWJsZWRgIHdoZW4gaXRzIGBzdGF0dXNgIGlzIGBESVNBQkxFRGAuCiAgICAgICAgICoKICAgICAgICAgKiBEaXNhYmxlZCBjb250cm9scyBhcmUgZXhlbXB0IGZyb20gdmFsaWRhdGlvbiBjaGVja3MgYW5kCiAgICAgICAgICogYXJlIG5vdCBpbmNsdWRlZCBpbiB0aGUgYWdncmVnYXRlIHZhbHVlIG9mIHRoZWlyIGFuY2VzdG9yCiAgICAgICAgICogY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnN0YXR1cyA9PT0gRElTQUJMRUQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEEgY29udHJvbCBpcyBgZW5hYmxlZGAgYXMgbG9uZyBhcyBpdHMgYHN0YXR1c2AgaXMgbm90IGBESVNBQkxFRGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIGNvbnRyb2wgaGFzIGFueSBzdGF0dXMgb3RoZXIgdGhhbiAnRElTQUJMRUQnLAogICAgICAgICAqIGZhbHNlIGlmIHRoZSBzdGF0dXMgaXMgJ0RJU0FCTEVEJy4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGdldCBlbmFibGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdGF0dXMgIT09IERJU0FCTEVEOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYGRpcnR5YCBpZiB0aGUgdXNlciBoYXMgY2hhbmdlZCB0aGUgdmFsdWUKICAgICAgICAgKiBpbiB0aGUgVUkuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoZSB1c2VyIGhhcyBjaGFuZ2VkIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbnRyb2wgaW4gdGhlIFVJOyBjb21wYXJlIGBwcmlzdGluZWAuCiAgICAgICAgICogUHJvZ3JhbW1hdGljIGNoYW5nZXMgdG8gYSBjb250cm9sJ3MgdmFsdWUgZG8gbm90IG1hcmsgaXQgZGlydHkuCiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpcnR5KCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMucHJpc3RpbmU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRydWUgaWYgdGhlIGNvbnRyb2wgaGFzIG5vdCBiZWVuIG1hcmtlZCBhcyB0b3VjaGVkCiAgICAgICAgICoKICAgICAgICAgKiBBIGNvbnRyb2wgaXMgYHVudG91Y2hlZGAgaWYgdGhlIHVzZXIgaGFzIG5vdCB5ZXQgdHJpZ2dlcmVkCiAgICAgICAgICogYSBgYmx1cmAgZXZlbnQgb24gaXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdW50b3VjaGVkKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMudG91Y2hlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVwb3J0cyB0aGUgdXBkYXRlIHN0cmF0ZWd5IG9mIHRoZSBgQWJzdHJhY3RDb250cm9sYCAobWVhbmluZwogICAgICAgICAqIHRoZSBldmVudCBvbiB3aGljaCB0aGUgY29udHJvbCB1cGRhdGVzIGl0c2VsZikuCiAgICAgICAgICogUG9zc2libGUgdmFsdWVzOiBgJ2NoYW5nZSdgIHwgYCdibHVyJ2AgfCBgJ3N1Ym1pdCdgCiAgICAgICAgICogRGVmYXVsdCB2YWx1ZTogYCdjaGFuZ2UnYAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHVwZGF0ZU9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdXBkYXRlT24gPyB0aGlzLl91cGRhdGVPbiA6ICh0aGlzLnBhcmVudCA/IHRoaXMucGFyZW50LnVwZGF0ZU9uIDogJ2NoYW5nZScpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBzeW5jaHJvbm91cyB2YWxpZGF0b3JzIHRoYXQgYXJlIGFjdGl2ZSBvbiB0aGlzIGNvbnRyb2wuICBDYWxsaW5nCiAgICAgICAgICogdGhpcyBvdmVyd3JpdGVzIGFueSBleGlzdGluZyBzeW5jIHZhbGlkYXRvcnMuCiAgICAgICAgICoKICAgICAgICAgKiBXaGVuIHlvdSBhZGQgb3IgcmVtb3ZlIGEgdmFsaWRhdG9yIGF0IHJ1biB0aW1lLCB5b3UgbXVzdCBjYWxsCiAgICAgICAgICogYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAgZm9yIHRoZSBuZXcgdmFsaWRhdGlvbiB0byB0YWtlIGVmZmVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gbmV3VmFsaWRhdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRWYWxpZGF0b3JzKG5ld1ZhbGlkYXRvcikgewogICAgICAgICAgICB0aGlzLnZhbGlkYXRvciA9IGNvZXJjZVRvVmFsaWRhdG9yKG5ld1ZhbGlkYXRvcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGFzeW5jIHZhbGlkYXRvcnMgdGhhdCBhcmUgYWN0aXZlIG9uIHRoaXMgY29udHJvbC4gQ2FsbGluZyB0aGlzCiAgICAgICAgICogb3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgYXN5bmMgdmFsaWRhdG9ycy4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4geW91IGFkZCBvciByZW1vdmUgYSB2YWxpZGF0b3IgYXQgcnVuIHRpbWUsIHlvdSBtdXN0IGNhbGwKICAgICAgICAgKiBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYCBmb3IgdGhlIG5ldyB2YWxpZGF0aW9uIHRvIHRha2UgZWZmZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWxpZGF0b3IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldEFzeW5jVmFsaWRhdG9ycyhuZXdWYWxpZGF0b3IpIHsKICAgICAgICAgICAgdGhpcy5hc3luY1ZhbGlkYXRvciA9IGNvZXJjZVRvQXN5bmNWYWxpZGF0b3IobmV3VmFsaWRhdG9yKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRW1wdGllcyBvdXQgdGhlIHN5bmMgdmFsaWRhdG9yIGxpc3QuCiAgICAgICAgICoKICAgICAgICAgKiBXaGVuIHlvdSBhZGQgb3IgcmVtb3ZlIGEgdmFsaWRhdG9yIGF0IHJ1biB0aW1lLCB5b3UgbXVzdCBjYWxsCiAgICAgICAgICogYHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKWAgZm9yIHRoZSBuZXcgdmFsaWRhdGlvbiB0byB0YWtlIGVmZmVjdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xlYXJWYWxpZGF0b3JzKCkgewogICAgICAgICAgICB0aGlzLnZhbGlkYXRvciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtcHRpZXMgb3V0IHRoZSBhc3luYyB2YWxpZGF0b3IgbGlzdC4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4geW91IGFkZCBvciByZW1vdmUgYSB2YWxpZGF0b3IgYXQgcnVuIHRpbWUsIHlvdSBtdXN0IGNhbGwKICAgICAgICAgKiBgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpYCBmb3IgdGhlIG5ldyB2YWxpZGF0aW9uIHRvIHRha2UgZWZmZWN0LgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbGVhckFzeW5jVmFsaWRhdG9ycygpIHsKICAgICAgICAgICAgdGhpcy5hc3luY1ZhbGlkYXRvciA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGB0b3VjaGVkYC4gQSBjb250cm9sIGlzIHRvdWNoZWQgYnkgZm9jdXMgYW5kCiAgICAgICAgICogYmx1ciBldmVudHMgdGhhdCBkbyBub3QgY2hhbmdlIHRoZSB2YWx1ZS4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgYG1hcmtBc1VudG91Y2hlZCgpYCAvIGBtYXJrQXNEaXJ0eSgpYCAvIGBtYXJrQXNQcmlzdGluZSgpYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcwogICAgICAgICAqIGFuZCBlbWl0cyBldmVudHMgYWZ0ZXIgbWFya2luZyBpcyBhcHBsaWVkLgogICAgICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAgICAgKiBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hcmtBc1RvdWNoZWQob3B0cyA9IHt9KSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS50b3VjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikgewogICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc1RvdWNoZWQob3B0cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFya3MgdGhlIGNvbnRyb2wgYW5kIGFsbCBpdHMgZGVzY2VuZGFudCBjb250cm9scyBhcyBgdG91Y2hlZGAuCiAgICAgICAgICogQHNlZSBgbWFya0FzVG91Y2hlZCgpYAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWFya0FsbEFzVG91Y2hlZCgpIHsKICAgICAgICAgICAgdGhpcy5tYXJrQXNUb3VjaGVkKHsgb25seVNlbGY6IHRydWUgfSk7CiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wubWFya0FsbEFzVG91Y2hlZCgpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGB1bnRvdWNoZWRgLgogICAgICAgICAqCiAgICAgICAgICogSWYgdGhlIGNvbnRyb2wgaGFzIGFueSBjaGlsZHJlbiwgYWxzbyBtYXJrcyBhbGwgY2hpbGRyZW4gYXMgYHVudG91Y2hlZGAKICAgICAgICAgKiBhbmQgcmVjYWxjdWxhdGVzIHRoZSBgdG91Y2hlZGAgc3RhdHVzIG9mIGFsbCBwYXJlbnQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGBtYXJrQXNUb3VjaGVkKClgIC8gYG1hcmtBc0RpcnR5KClgIC8gYG1hcmtBc1ByaXN0aW5lKClgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRzIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzCiAgICAgICAgICogYW5kIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgbWFya2luZyBpcyBhcHBsaWVkLgogICAgICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAgICAgKiBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hcmtBc1VudG91Y2hlZChvcHRzID0ge30pIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnRvdWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fcGVuZGluZ1RvdWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICAgICAgY29udHJvbC5tYXJrQXNVbnRvdWNoZWQoeyBvbmx5U2VsZjogdHJ1ZSB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQob3B0cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFya3MgdGhlIGNvbnRyb2wgYXMgYGRpcnR5YC4gQSBjb250cm9sIGJlY29tZXMgZGlydHkgd2hlbgogICAgICAgICAqIHRoZSBjb250cm9sJ3MgdmFsdWUgaXMgY2hhbmdlZCB0aHJvdWdoIHRoZSBVSTsgY29tcGFyZSBgbWFya0FzVG91Y2hlZGAuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGBtYXJrQXNUb3VjaGVkKClgIC8gYG1hcmtBc1VudG91Y2hlZCgpYCAvIGBtYXJrQXNQcmlzdGluZSgpYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcwogICAgICAgICAqIGFuZCBlbWl0cyBldmVudHMgYWZ0ZXIgbWFya2luZyBpcyBhcHBsaWVkLgogICAgICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBtYXJrIG9ubHkgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAgICAgKiBtYXJrcyBhbGwgZGlyZWN0IGFuY2VzdG9ycy4gRGVmYXVsdCBpcyBmYWxzZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hcmtBc0RpcnR5KG9wdHMgPSB7fSkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkucHJpc3RpbmUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX3BhcmVudCAmJiAhb3B0cy5vbmx5U2VsZikgewogICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50Lm1hcmtBc0RpcnR5KG9wdHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGBwcmlzdGluZWAuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgY29udHJvbCBoYXMgYW55IGNoaWxkcmVuLCBtYXJrcyBhbGwgY2hpbGRyZW4gYXMgYHByaXN0aW5lYCwKICAgICAgICAgKiBhbmQgcmVjYWxjdWxhdGVzIHRoZSBgcHJpc3RpbmVgIHN0YXR1cyBvZiBhbGwgcGFyZW50CiAgICAgICAgICogY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIGBtYXJrQXNUb3VjaGVkKClgIC8gYG1hcmtBc1VudG91Y2hlZCgpYCAvIGBtYXJrQXNEaXJ0eSgpYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIGVtaXRzIGV2ZW50cyBhZnRlcgogICAgICAgICAqIG1hcmtpbmcgaXMgYXBwbGllZC4KICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsCiAgICAgICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXJrQXNQcmlzdGluZShvcHRzID0ge30pIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnByaXN0aW5lID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fcGVuZGluZ0RpcnR5ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgICAgIGNvbnRyb2wubWFya0FzUHJpc3RpbmUoeyBvbmx5U2VsZjogdHJ1ZSB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVByaXN0aW5lKG9wdHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBjb250cm9sIGFzIGBwZW5kaW5nYC4KICAgICAgICAgKgogICAgICAgICAqIEEgY29udHJvbCBpcyBwZW5kaW5nIHdoaWxlIHRoZSBjb250cm9sIHBlcmZvcm1zIGFzeW5jIHZhbGlkYXRpb24uCiAgICAgICAgICoKICAgICAgICAgKiBAc2VlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sLnN0YXR1c30KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdHMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kCiAgICAgICAgICogZW1pdHMgZXZlbnRzIGFmdGVyIG1hcmtpbmcgaXMgYXBwbGllZC4KICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgbWFyayBvbmx5IHRoaXMgY29udHJvbC4gV2hlbiBmYWxzZSBvciBub3Qgc3VwcGxpZWQsCiAgICAgICAgICogbWFya3MgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuCiAgICAgICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCB0aGUgYHN0YXR1c0NoYW5nZXNgCiAgICAgICAgICogb2JzZXJ2YWJsZSBlbWl0cyBhbiBldmVudCB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIHRoZSBjb250cm9sIGlzIG1hcmtlZCBwZW5kaW5nLgogICAgICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWFya0FzUGVuZGluZyhvcHRzID0ge30pIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN0YXR1cyA9IFBFTkRJTkc7CiAgICAgICAgICAgIGlmIChvcHRzLmVtaXRFdmVudCAhPT0gZmFsc2UpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5zdGF0dXNDaGFuZ2VzKSkpLmVtaXQodGhpcy5zdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5tYXJrQXNQZW5kaW5nKG9wdHMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoZSBjb250cm9sLiBUaGlzIG1lYW5zIHRoZSBjb250cm9sIGlzIGV4ZW1wdCBmcm9tIHZhbGlkYXRpb24gY2hlY2tzIGFuZAogICAgICAgICAqIGV4Y2x1ZGVkIGZyb20gdGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiBhbnkgcGFyZW50LiBJdHMgc3RhdHVzIGlzIGBESVNBQkxFRGAuCiAgICAgICAgICoKICAgICAgICAgKiBJZiB0aGUgY29udHJvbCBoYXMgY2hpbGRyZW4sIGFsbCBjaGlsZHJlbiBhcmUgYWxzbyBkaXNhYmxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUge1xAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMKICAgICAgICAgKiBjaGFuZ2VzIGFuZCBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIGNvbnRyb2wgaXMgZGlzYWJsZWQuCiAgICAgICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLAogICAgICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLgogICAgICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZAogICAgICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCBpcyBkaXNhYmxlZC4KICAgICAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNhYmxlKG9wdHMgPSB7fSkgewogICAgICAgICAgICAvLyBJZiBwYXJlbnQgaGFzIGJlZW4gbWFya2VkIGFydGlmaWNpYWxseSBkaXJ0eSB3ZSBkb24ndCB3YW50IHRvIHJlLWNhbGN1bGF0ZSB0aGUKICAgICAgICAgICAgLy8gcGFyZW50J3MgZGlydGluZXNzIGJhc2VkIG9uIHRoZSBjaGlsZHJlbi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBza2lwUHJpc3RpbmVDaGVjayA9IHRoaXMuX3BhcmVudE1hcmtlZERpcnR5KG9wdHMub25seVNlbGYpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzID0gRElTQUJMRUQ7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5lcnJvcnMgPSBudWxsOwogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgICAgICBjb250cm9sLmRpc2FibGUoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcHRzKSwgeyBvbmx5U2VsZjogdHJ1ZSB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVmFsdWUoKTsKICAgICAgICAgICAgaWYgKG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLnZhbHVlQ2hhbmdlcykpKS5lbWl0KHRoaXMudmFsdWUpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLnN0YXR1c0NoYW5nZXMpKSkuZW1pdCh0aGlzLnN0YXR1cyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fdXBkYXRlQW5jZXN0b3JzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0cyksIHsgc2tpcFByaXN0aW5lQ2hlY2sgfSkpOwogICAgICAgICAgICB0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZUZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2hhbmdlRm4pID0+IGNoYW5nZUZuKHRydWUpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVuYWJsZXMgdGhlIGNvbnRyb2wuIFRoaXMgbWVhbnMgdGhlIGNvbnRyb2wgaXMgaW5jbHVkZWQgaW4gdmFsaWRhdGlvbiBjaGVja3MgYW5kCiAgICAgICAgICogdGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiBpdHMgcGFyZW50LiBJdHMgc3RhdHVzIHJlY2FsY3VsYXRlcyBiYXNlZCBvbiBpdHMgdmFsdWUgYW5kCiAgICAgICAgICogaXRzIHZhbGlkYXRvcnMuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0LCBpZiB0aGUgY29udHJvbCBoYXMgY2hpbGRyZW4sIGFsbCBjaGlsZHJlbiBhcmUgZW5hYmxlZC4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUge1xAbGluayBBYnN0cmFjdENvbnRyb2wuc3RhdHVzfQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmUgb3B0aW9ucyB0aGF0IGNvbnRyb2wgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcyBhbmQKICAgICAgICAgKiBlbWl0cyBldmVudHMgd2hlbiBtYXJrZWQgYXMgdW50b3VjaGVkCiAgICAgICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIG1hcmsgb25seSB0aGlzIGNvbnRyb2wuIFdoZW4gZmFsc2Ugb3Igbm90IHN1cHBsaWVkLAogICAgICAgICAqIG1hcmtzIGFsbCBkaXJlY3QgYW5jZXN0b3JzLiBEZWZhdWx0IGlzIGZhbHNlLgogICAgICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZAogICAgICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCBpcyBlbmFibGVkLgogICAgICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGVuYWJsZShvcHRzID0ge30pIHsKICAgICAgICAgICAgLy8gSWYgcGFyZW50IGhhcyBiZWVuIG1hcmtlZCBhcnRpZmljaWFsbHkgZGlydHkgd2UgZG9uJ3Qgd2FudCB0byByZS1jYWxjdWxhdGUgdGhlCiAgICAgICAgICAgIC8vIHBhcmVudCdzIGRpcnRpbmVzcyBiYXNlZCBvbiB0aGUgY2hpbGRyZW4uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2tpcFByaXN0aW5lQ2hlY2sgPSB0aGlzLl9wYXJlbnRNYXJrZWREaXJ0eShvcHRzLm9ubHlTZWxmKTsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN0YXR1cyA9IFZBTElEOwogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sKSA9PiB7CiAgICAgICAgICAgICAgICBjb250cm9sLmVuYWJsZShPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9wdHMpLCB7IG9ubHlTZWxmOiB0cnVlIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRzLmVtaXRFdmVudCB9KTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlQW5jZXN0b3JzKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgb3B0cyksIHsgc2tpcFByaXN0aW5lQ2hlY2sgfSkpOwogICAgICAgICAgICB0aGlzLl9vbkRpc2FibGVkQ2hhbmdlLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZUZuCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2hhbmdlRm4pID0+IGNoYW5nZUZuKGZhbHNlKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gb3B0cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZUFuY2VzdG9ycyhvcHRzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdHMpOwogICAgICAgICAgICAgICAgaWYgKCFvcHRzLnNraXBQcmlzdGluZUNoZWNrKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVQcmlzdGluZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50Ll91cGRhdGVUb3VjaGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQgU2V0cyB0aGUgcGFyZW50IG9mIHRoZSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRQYXJlbnQocGFyZW50KSB7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVjYWxjdWxhdGVzIHRoZSB2YWx1ZSBhbmQgdmFsaWRhdGlvbiBzdGF0dXMgb2YgdGhlIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBCeSBkZWZhdWx0LCBpdCBhbHNvIHVwZGF0ZXMgdGhlIHZhbHVlIGFuZCB2YWxpZGl0eSBvZiBpdHMgYW5jZXN0b3JzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cyBDb25maWd1cmF0aW9uIG9wdGlvbnMgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kIGVtaXRzIGV2ZW50cwogICAgICAgICAqIGFmdGVyIHVwZGF0ZXMgYW5kIHZhbGlkaXR5IGNoZWNrcyBhcmUgYXBwbGllZC4KICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgb25seSB1cGRhdGUgdGhpcyBjb250cm9sLiBXaGVuIGZhbHNlIG9yIG5vdCBzdXBwbGllZCwKICAgICAgICAgKiB1cGRhdGUgYWxsIGRpcmVjdCBhbmNlc3RvcnMuIERlZmF1bHQgaXMgZmFsc2UuCiAgICAgICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgICAgICogYHZhbHVlQ2hhbmdlc2AKICAgICAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHVwZGF0ZWQuCiAgICAgICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRzID0ge30pIHsKICAgICAgICAgICAgdGhpcy5fc2V0SW5pdGlhbFN0YXR1cygpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZSgpOwogICAgICAgICAgICBpZiAodGhpcy5lbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jYW5jZWxFeGlzdGluZ1N1YnNjcmlwdGlvbigpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLmVycm9ycyA9IHRoaXMuX3J1blZhbGlkYXRvcigpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN0YXR1cyA9IHRoaXMuX2NhbGN1bGF0ZVN0YXR1cygpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID09PSBWQUxJRCB8fCB0aGlzLnN0YXR1cyA9PT0gUEVORElORykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3J1bkFzeW5jVmFsaWRhdG9yKG9wdHMuZW1pdEV2ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAob3B0cy5lbWl0RXZlbnQgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMudmFsdWVDaGFuZ2VzKSkpLmVtaXQodGhpcy52YWx1ZSk7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuc3RhdHVzQ2hhbmdlcykpKS5lbWl0KHRoaXMuc3RhdHVzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVRyZWVWYWxpZGl0eShvcHRzID0geyBlbWl0RXZlbnQ6IHRydWUgfSkgewogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGN0cmwKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjdHJsKSA9PiBjdHJsLl91cGRhdGVUcmVlVmFsaWRpdHkob3B0cykpKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0cy5lbWl0RXZlbnQgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0SW5pdGlhbFN0YXR1cygpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN0YXR1cyA9IHRoaXMuX2FsbENvbnRyb2xzRGlzYWJsZWQoKSA/IERJU0FCTEVEIDogVkFMSUQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcnVuVmFsaWRhdG9yKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy52YWxpZGF0b3IgPyB0aGlzLnZhbGlkYXRvcih0aGlzKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZW1pdEV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcnVuQXN5bmNWYWxpZGF0b3IoZW1pdEV2ZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLmFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzID0gUEVORElORzsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9icyA9IHRvT2JzZXJ2YWJsZSh0aGlzLmFzeW5jVmFsaWRhdG9yKHRoaXMpKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdGlvblN1YnNjcmlwdGlvbiA9CiAgICAgICAgICAgICAgICAgICAgb2JzLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChlcnJvcnMpID0+IHRoaXMuc2V0RXJyb3JzKGVycm9ycywgeyBlbWl0RXZlbnQgfSkpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhbmNlbEV4aXN0aW5nU3Vic2NyaXB0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5fYXN5bmNWYWxpZGF0aW9uU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hc3luY1ZhbGlkYXRpb25TdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIGVycm9ycyBvbiBhIGZvcm0gY29udHJvbCB3aGVuIHJ1bm5pbmcgdmFsaWRhdGlvbnMgbWFudWFsbHksIHJhdGhlciB0aGFuIGF1dG9tYXRpY2FsbHkuCiAgICAgICAgICoKICAgICAgICAgKiBDYWxsaW5nIGBzZXRFcnJvcnNgIGFsc28gdXBkYXRlcyB0aGUgdmFsaWRpdHkgb2YgdGhlIHBhcmVudCBjb250cm9sLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICoKICAgICAgICAgKiAjIyMgTWFudWFsbHkgc2V0IHRoZSBlcnJvcnMgZm9yIGEgY29udHJvbAogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgbG9naW4gPSBuZXcgRm9ybUNvbnRyb2woJ3NvbWVMb2dpbicpOwogICAgICAgICAqIGxvZ2luLnNldEVycm9ycyh7CiAgICAgICAgICogICBub3RVbmlxdWU6IHRydWUKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIGV4cGVjdChsb2dpbi52YWxpZCkudG9FcXVhbChmYWxzZSk7CiAgICAgICAgICogZXhwZWN0KGxvZ2luLmVycm9ycykudG9FcXVhbCh7IG5vdFVuaXF1ZTogdHJ1ZSB9KTsKICAgICAgICAgKgogICAgICAgICAqIGxvZ2luLnNldFZhbHVlKCdzb21lT3RoZXJMb2dpbicpOwogICAgICAgICAqCiAgICAgICAgICogZXhwZWN0KGxvZ2luLnZhbGlkKS50b0VxdWFsKHRydWUpOwogICAgICAgICAqIGBgYAogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JzCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RXJyb3JzKGVycm9ycywgb3B0cyA9IHt9KSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5lcnJvcnMgPSBlcnJvcnM7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNvbnRyb2xzRXJyb3JzKG9wdHMuZW1pdEV2ZW50ICE9PSBmYWxzZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyBhIGNoaWxkIGNvbnRyb2wgZ2l2ZW4gdGhlIGNvbnRyb2wncyBuYW1lIG9yIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgUmV0cmlldmUgYSBuZXN0ZWQgY29udHJvbAogICAgICAgICAqCiAgICAgICAgICogRm9yIGV4YW1wbGUsIHRvIGdldCBhIGBuYW1lYCBjb250cm9sIG5lc3RlZCB3aXRoaW4gYSBgcGVyc29uYCBzdWItZ3JvdXA6CiAgICAgICAgICoKICAgICAgICAgKiAqIGB0aGlzLmZvcm0uZ2V0KCdwZXJzb24ubmFtZScpO2AKICAgICAgICAgKgogICAgICAgICAqIC1PUi0KICAgICAgICAgKgogICAgICAgICAqICogYHRoaXMuZm9ybS5nZXQoWydwZXJzb24nLCAnbmFtZSddKTtgCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoIEEgZG90LWRlbGltaXRlZCBzdHJpbmcgb3IgYXJyYXkgb2Ygc3RyaW5nL251bWJlciB2YWx1ZXMgdGhhdCBkZWZpbmUgdGhlIHBhdGggdG8gdGhlCiAgICAgICAgICogY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuIF9maW5kKHRoaXMsIHBhdGgsICcuJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXBvcnRzIGVycm9yIGRhdGEgZm9yIHRoZSBjb250cm9sIHdpdGggdGhlIGdpdmVuIHBhdGguCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiBGb3IgZXhhbXBsZSwgZm9yIHRoZSBmb2xsb3dpbmcgYEZvcm1Hcm91cGA6CiAgICAgICAgICoKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgICAgICogICBhZGRyZXNzOiBuZXcgRm9ybUdyb3VwKHsgc3RyZWV0OiBuZXcgRm9ybUNvbnRyb2woKSB9KQogICAgICAgICAqIH0pOwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogVGhlIHBhdGggdG8gdGhlICdzdHJlZXQnIGNvbnRyb2wgZnJvbSB0aGUgcm9vdCBmb3JtIHdvdWxkIGJlICdhZGRyZXNzJyAtPiAnc3RyZWV0Jy4KICAgICAgICAgKgogICAgICAgICAqIEl0IGNhbiBiZSBwcm92aWRlZCB0byB0aGlzIG1ldGhvZCBpbiBvbmUgb2YgdHdvIGZvcm1hdHM6CiAgICAgICAgICoKICAgICAgICAgKiAxLiBBbiBhcnJheSBvZiBzdHJpbmcgY29udHJvbCBuYW1lcywgZS5nLiBgWydhZGRyZXNzJywgJ3N0cmVldCddYAogICAgICAgICAqIDEuIEEgcGVyaW9kLWRlbGltaXRlZCBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgaW4gb25lIHN0cmluZywgZS5nLiBgJ2FkZHJlc3Muc3RyZWV0J2AKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3JDb2RlIFRoZSBjb2RlIG9mIHRoZSBlcnJvciB0byBjaGVjawogICAgICAgICAqIEBwYXJhbSB7Pz19IHBhdGggQSBsaXN0IG9mIGNvbnRyb2wgbmFtZXMgdGhhdCBkZXNpZ25hdGVzIGhvdyB0byBtb3ZlIGZyb20gdGhlIGN1cnJlbnQgY29udHJvbAogICAgICAgICAqIHRvIHRoZSBjb250cm9sIHRoYXQgc2hvdWxkIGJlIHF1ZXJpZWQgZm9yIGVycm9ycy4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99IGVycm9yIGRhdGEgZm9yIHRoYXQgcGFydGljdWxhciBlcnJvci4gSWYgdGhlIGNvbnRyb2wgb3IgZXJyb3IgaXMgbm90IHByZXNlbnQsCiAgICAgICAgICogbnVsbCBpcyByZXR1cm5lZC4KICAgICAgICAgKi8KICAgICAgICBnZXRFcnJvcihlcnJvckNvZGUsIHBhdGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250cm9sID0gcGF0aCA/IHRoaXMuZ2V0KHBhdGgpIDogdGhpczsKICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2wgJiYgY29udHJvbC5lcnJvcnMgPyBjb250cm9sLmVycm9yc1tlcnJvckNvZGVdIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgY29udHJvbCB3aXRoIHRoZSBnaXZlbiBwYXRoIGhhcyB0aGUgZXJyb3Igc3BlY2lmaWVkLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogRm9yIGV4YW1wbGUsIGZvciB0aGUgZm9sbG93aW5nIGBGb3JtR3JvdXBgOgogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICogZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICAgICAqICAgYWRkcmVzczogbmV3IEZvcm1Hcm91cCh7IHN0cmVldDogbmV3IEZvcm1Db250cm9sKCkgfSkKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIFRoZSBwYXRoIHRvIHRoZSAnc3RyZWV0JyBjb250cm9sIGZyb20gdGhlIHJvb3QgZm9ybSB3b3VsZCBiZSAnYWRkcmVzcycgLT4gJ3N0cmVldCcuCiAgICAgICAgICoKICAgICAgICAgKiBJdCBjYW4gYmUgcHJvdmlkZWQgdG8gdGhpcyBtZXRob2QgaW4gb25lIG9mIHR3byBmb3JtYXRzOgogICAgICAgICAqCiAgICAgICAgICogMS4gQW4gYXJyYXkgb2Ygc3RyaW5nIGNvbnRyb2wgbmFtZXMsIGUuZy4gYFsnYWRkcmVzcycsICdzdHJlZXQnXWAKICAgICAgICAgKiAxLiBBIHBlcmlvZC1kZWxpbWl0ZWQgbGlzdCBvZiBjb250cm9sIG5hbWVzIGluIG9uZSBzdHJpbmcsIGUuZy4gYCdhZGRyZXNzLnN0cmVldCdgCiAgICAgICAgICoKICAgICAgICAgKiBJZiBubyBwYXRoIGlzIGdpdmVuLCB0aGlzIG1ldGhvZCBjaGVja3MgZm9yIHRoZSBlcnJvciBvbiB0aGUgY3VycmVudCBjb250cm9sLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvckNvZGUgVGhlIGNvZGUgb2YgdGhlIGVycm9yIHRvIGNoZWNrCiAgICAgICAgICogQHBhcmFtIHs/PX0gcGF0aCBBIGxpc3Qgb2YgY29udHJvbCBuYW1lcyB0aGF0IGRlc2lnbmF0ZXMgaG93IHRvIG1vdmUgZnJvbSB0aGUgY3VycmVudCBjb250cm9sCiAgICAgICAgICogdG8gdGhlIGNvbnRyb2wgdGhhdCBzaG91bGQgYmUgcXVlcmllZCBmb3IgZXJyb3JzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gd2hldGhlciB0aGUgZ2l2ZW4gZXJyb3IgaXMgcHJlc2VudCBpbiB0aGUgY29udHJvbCBhdCB0aGUgZ2l2ZW4gcGF0aC4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoZSBjb250cm9sIGlzIG5vdCBwcmVzZW50LCBmYWxzZSBpcyByZXR1cm5lZC4KICAgICAgICAgKi8KICAgICAgICBoYXNFcnJvcihlcnJvckNvZGUsIHBhdGgpIHsKICAgICAgICAgICAgcmV0dXJuICEhdGhpcy5nZXRFcnJvcihlcnJvckNvZGUsIHBhdGgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIHRvcC1sZXZlbCBhbmNlc3RvciBvZiB0aGlzIGNvbnRyb2wuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcm9vdCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgeCA9IHRoaXM7CiAgICAgICAgICAgIHdoaWxlICh4Ll9wYXJlbnQpIHsKICAgICAgICAgICAgICAgIHggPSB4Ll9wYXJlbnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGVtaXRFdmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZUNvbnRyb2xzRXJyb3JzKGVtaXRFdmVudCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzID0gdGhpcy5fY2FsY3VsYXRlU3RhdHVzKCk7CiAgICAgICAgICAgIGlmIChlbWl0RXZlbnQpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5zdGF0dXNDaGFuZ2VzKSkpLmVtaXQodGhpcy5zdGF0dXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlQ29udHJvbHNFcnJvcnMoZW1pdEV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW5pdE9ic2VydmFibGVzKCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkudmFsdWVDaGFuZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3RhdHVzQ2hhbmdlcyA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jYWxjdWxhdGVTdGF0dXMoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9hbGxDb250cm9sc0Rpc2FibGVkKCkpCiAgICAgICAgICAgICAgICByZXR1cm4gRElTQUJMRUQ7CiAgICAgICAgICAgIGlmICh0aGlzLmVycm9ycykKICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEOwogICAgICAgICAgICBpZiAodGhpcy5fYW55Q29udHJvbHNIYXZlU3RhdHVzKFBFTkRJTkcpKQogICAgICAgICAgICAgICAgcmV0dXJuIFBFTkRJTkc7CiAgICAgICAgICAgIGlmICh0aGlzLl9hbnlDb250cm9sc0hhdmVTdGF0dXMoSU5WQUxJRCkpCiAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRDsKICAgICAgICAgICAgcmV0dXJuIFZBTElEOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0dXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hbnlDb250cm9sc0hhdmVTdGF0dXMoc3RhdHVzKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbnlDb250cm9scygoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuc3RhdHVzID09PSBzdGF0dXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FueUNvbnRyb2xzRGlydHkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hbnlDb250cm9scygoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuZGlydHkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FueUNvbnRyb2xzVG91Y2hlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FueUNvbnRyb2xzKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCkgPT4gY29udHJvbC50b3VjaGVkKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlUHJpc3RpbmUob3B0cyA9IHt9KSB7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5wcmlzdGluZSA9ICF0aGlzLl9hbnlDb250cm9sc0RpcnR5KCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9wYXJlbnQgJiYgIW9wdHMub25seVNlbGYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudC5fdXBkYXRlUHJpc3RpbmUob3B0cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVUb3VjaGVkKG9wdHMgPSB7fSkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkudG91Y2hlZCA9IHRoaXMuX2FueUNvbnRyb2xzVG91Y2hlZCgpOwogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50ICYmICFvcHRzLm9ubHlTZWxmKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXJlbnQuX3VwZGF0ZVRvdWNoZWQob3B0cyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gZm9ybVN0YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNCb3hlZFZhbHVlKGZvcm1TdGF0ZSkgewogICAgICAgICAgICByZXR1cm4gdHlwZW9mIGZvcm1TdGF0ZSA9PT0gJ29iamVjdCcgJiYgZm9ybVN0YXRlICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhmb3JtU3RhdGUpLmxlbmd0aCA9PT0gMiAmJiAndmFsdWUnIGluIGZvcm1TdGF0ZSAmJiAnZGlzYWJsZWQnIGluIGZvcm1TdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UgPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRVcGRhdGVTdHJhdGVneShvcHRzKSB7CiAgICAgICAgICAgIGlmIChpc09wdGlvbnNPYmoob3B0cykgJiYgKCgvKiogQHR5cGUgez99ICovIChvcHRzKSkpLnVwZGF0ZU9uICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZU9uID0gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqIEB0eXBlIHs/fSAqLyAob3B0cykpKS51cGRhdGVPbikpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrIHRvIHNlZSBpZiBwYXJlbnQgaGFzIGJlZW4gbWFya2VkIGFydGlmaWNpYWxseSBkaXJ0eS4KICAgICAgICAgKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IG9ubHlTZWxmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcGFyZW50TWFya2VkRGlydHkob25seVNlbGYpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnREaXJ0eSA9IHRoaXMuX3BhcmVudCAmJiB0aGlzLl9wYXJlbnQuZGlydHk7CiAgICAgICAgICAgIHJldHVybiAhb25seVNlbGYgJiYgcGFyZW50RGlydHkgJiYgIXRoaXMuX3BhcmVudC5fYW55Q29udHJvbHNEaXJ0eSgpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVHJhY2tzIHRoZSB2YWx1ZSBhbmQgdmFsaWRhdGlvbiBzdGF0dXMgb2YgYW4gaW5kaXZpZHVhbCBmb3JtIGNvbnRyb2wuCiAgICAgKgogICAgICogVGhpcyBpcyBvbmUgb2YgdGhlIHRocmVlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyBvZiBBbmd1bGFyIGZvcm1zLCBhbG9uZyB3aXRoCiAgICAgKiBgRm9ybUdyb3VwYCBhbmQgYEZvcm1BcnJheWAuIEl0IGV4dGVuZHMgdGhlIGBBYnN0cmFjdENvbnRyb2xgIGNsYXNzIHRoYXQKICAgICAqIGltcGxlbWVudHMgbW9zdCBvZiB0aGUgYmFzZSBmdW5jdGlvbmFsaXR5IGZvciBhY2Nlc3NpbmcgdGhlIHZhbHVlLCB2YWxpZGF0aW9uIHN0YXR1cywKICAgICAqIHVzZXIgaW50ZXJhY3Rpb25zIGFuZCBldmVudHMuIFNlZSBbdXNhZ2UgZXhhbXBsZXMgYmVsb3ddKCN1c2FnZS1ub3RlcykuCiAgICAgKgogICAgICogQHNlZSBgQWJzdHJhY3RDb250cm9sYAogICAgICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKQogICAgICogQHNlZSBbVXNhZ2UgTm90ZXNdKCN1c2FnZS1ub3RlcykKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgSW5pdGlhbGl6aW5nIEZvcm0gQ29udHJvbHMKICAgICAqCiAgICAgKiBJbnN0YW50aWF0ZSBhIGBGb3JtQ29udHJvbGAsIHdpdGggYW4gaW5pdGlhbCB2YWx1ZS4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnc29tZSB2YWx1ZScpOwogICAgICogY29uc29sZS5sb2coY29udHJvbC52YWx1ZSk7ICAgICAvLyAnc29tZSB2YWx1ZScKICAgICAqIGBgYAogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbml0aWFsaXplcyB0aGUgY29udHJvbCB3aXRoIGEgZm9ybSBzdGF0ZSBvYmplY3QuIFRoZSBgdmFsdWVgCiAgICAgKiBhbmQgYGRpc2FibGVkYCBrZXlzIGFyZSByZXF1aXJlZCBpbiB0aGlzIGNhc2UuCiAgICAgKgogICAgICogYGBgdHMKICAgICAqIGNvbnN0IGNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woeyB2YWx1ZTogJ24vYScsIGRpc2FibGVkOiB0cnVlIH0pOwogICAgICogY29uc29sZS5sb2coY29udHJvbC52YWx1ZSk7ICAgICAvLyAnbi9hJwogICAgICogY29uc29sZS5sb2coY29udHJvbC5zdGF0dXMpOyAgICAvLyAnRElTQUJMRUQnCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgaW5pdGlhbGl6ZXMgdGhlIGNvbnRyb2wgd2l0aCBhIHN5bmMgdmFsaWRhdG9yLgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCBWYWxpZGF0b3JzLnJlcXVpcmVkKTsKICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAgICAgIC8vICcnCiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLnN0YXR1cyk7ICAgICAvLyAnSU5WQUxJRCcKICAgICAqIGBgYAogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbml0aWFsaXplcyB0aGUgY29udHJvbCB1c2luZyBhbiBvcHRpb25zIG9iamVjdC4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgewogICAgICogICAgdmFsaWRhdG9yczogVmFsaWRhdG9ycy5yZXF1aXJlZCwKICAgICAqICAgIGFzeW5jVmFsaWRhdG9yczogbXlBc3luY1ZhbGlkYXRvcgogICAgICogfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgQ29uZmlndXJlIHRoZSBjb250cm9sIHRvIHVwZGF0ZSBvbiBhIGJsdXIgZXZlbnQKICAgICAqCiAgICAgKiBTZXQgdGhlIGB1cGRhdGVPbmAgb3B0aW9uIHRvIGAnYmx1cidgIHRvIHVwZGF0ZSBvbiB0aGUgYmx1ciBgZXZlbnRgLgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCcnLCB7IHVwZGF0ZU9uOiAnYmx1cicgfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgQ29uZmlndXJlIHRoZSBjb250cm9sIHRvIHVwZGF0ZSBvbiBhIHN1Ym1pdCBldmVudAogICAgICoKICAgICAqIFNldCB0aGUgYHVwZGF0ZU9uYCBvcHRpb24gdG8gYCdzdWJtaXQnYCB0byB1cGRhdGUgb24gYSBzdWJtaXQgYGV2ZW50YC4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogY29uc3QgY29udHJvbCA9IG5ldyBGb3JtQ29udHJvbCgnJywgeyB1cGRhdGVPbjogJ3N1Ym1pdCcgfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgUmVzZXQgdGhlIGNvbnRyb2wgYmFjayB0byBhbiBpbml0aWFsIHZhbHVlCiAgICAgKgogICAgICogWW91IHJlc2V0IHRvIGEgc3BlY2lmaWMgZm9ybSBzdGF0ZSBieSBwYXNzaW5nIHRocm91Z2ggYSBzdGFuZGFsb25lCiAgICAgKiB2YWx1ZSBvciBhIGZvcm0gc3RhdGUgb2JqZWN0IHRoYXQgY29udGFpbnMgYm90aCBhIHZhbHVlIGFuZCBhIGRpc2FibGVkIHN0YXRlCiAgICAgKiAodGhlc2UgYXJlIHRoZSBvbmx5IHR3byBwcm9wZXJ0aWVzIHRoYXQgY2Fubm90IGJlIGNhbGN1bGF0ZWQpLgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdOYW5jeScpOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnTmFuY3knCiAgICAgKgogICAgICogY29udHJvbC5yZXNldCgnRHJldycpOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnRHJldycKICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBSZXNldCB0aGUgY29udHJvbCBiYWNrIHRvIGFuIGluaXRpYWwgdmFsdWUgYW5kIGRpc2FibGVkCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdCBjb250cm9sID0gbmV3IEZvcm1Db250cm9sKCdOYW5jeScpOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGNvbnRyb2wudmFsdWUpOyAvLyAnTmFuY3knCiAgICAgKiBjb25zb2xlLmxvZyhjb250cm9sLnN0YXR1cyk7IC8vICdWQUxJRCcKICAgICAqCiAgICAgKiBjb250cm9sLnJlc2V0KHsgdmFsdWU6ICdEcmV3JywgZGlzYWJsZWQ6IHRydWUgfSk7CiAgICAgKgogICAgICogY29uc29sZS5sb2coY29udHJvbC52YWx1ZSk7IC8vICdEcmV3JwogICAgICogY29uc29sZS5sb2coY29udHJvbC5zdGF0dXMpOyAvLyAnRElTQUJMRUQnCiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBGb3JtQ29udHJvbCBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBgRm9ybUNvbnRyb2xgIGluc3RhbmNlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gZm9ybVN0YXRlIEluaXRpYWxpemVzIHRoZSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCB2YWx1ZSwKICAgICAgICAgKiBvciBhbiBvYmplY3QgdGhhdCBkZWZpbmVzIHRoZSBpbml0aWFsIHZhbHVlIGFuZCBkaXNhYmxlZCBzdGF0ZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbGlkYXRvck9yT3B0cyBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YKICAgICAgICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zIHZhbGlkYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICogYW5kIGEgdmFsaWRhdGlvbiB0cmlnZ2VyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXN5bmNWYWxpZGF0b3IgQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGZvcm1TdGF0ZSA9IG51bGwsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpIHsKICAgICAgICAgICAgc3VwZXIoY29lcmNlVG9WYWxpZGF0b3IodmFsaWRhdG9yT3JPcHRzKSwgY29lcmNlVG9Bc3luY1ZhbGlkYXRvcihhc3luY1ZhbGlkYXRvciwgdmFsaWRhdG9yT3JPcHRzKSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IFtdOwogICAgICAgICAgICB0aGlzLl9hcHBseUZvcm1TdGF0ZShmb3JtU3RhdGUpOwogICAgICAgICAgICB0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSh2YWxpZGF0b3JPck9wdHMpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICAgICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgYSBuZXcgdmFsdWUgZm9yIHRoZSBmb3JtIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBjb250cm9sLgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMKICAgICAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCN1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5CiAgICAgICAgICogdXBkYXRlVmFsdWVBbmRWYWxpZGl0eX0gbWV0aG9kLgogICAgICAgICAqCiAgICAgICAgICogKiBgb25seVNlbGZgOiBXaGVuIHRydWUsIGVhY2ggY2hhbmdlIG9ubHkgYWZmZWN0cyB0aGlzIGNvbnRyb2wsIGFuZCBub3QgaXRzIHBhcmVudC4gRGVmYXVsdCBpcwogICAgICAgICAqIGZhbHNlLgogICAgICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZAogICAgICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBpcyB1cGRhdGVkLgogICAgICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAgICAgKiAqIGBlbWl0TW9kZWxUb1ZpZXdDaGFuZ2VgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICAodGhlIGRlZmF1bHQpLCBlYWNoIGNoYW5nZSB0cmlnZ2VycyBhbgogICAgICAgICAqIGBvbkNoYW5nZWAgZXZlbnQgdG8KICAgICAgICAgKiB1cGRhdGUgdGhlIHZpZXcuCiAgICAgICAgICogKiBgZW1pdFZpZXdUb01vZGVsQ2hhbmdlYDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBlYWNoIGNoYW5nZSB0cmlnZ2VycyBhbgogICAgICAgICAqIGBuZ01vZGVsQ2hhbmdlYAogICAgICAgICAqIGV2ZW50IHRvIHVwZGF0ZSB0aGUgbW9kZWwuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlKHZhbHVlLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0gdGhpcy5fcGVuZGluZ1ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLl9vbkNoYW5nZS5sZW5ndGggJiYgb3B0aW9ucy5lbWl0TW9kZWxUb1ZpZXdDaGFuZ2UgIT09IGZhbHNlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlRm4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChjaGFuZ2VGbikgPT4gY2hhbmdlRm4odGhpcy52YWx1ZSwgb3B0aW9ucy5lbWl0Vmlld1RvTW9kZWxDaGFuZ2UgIT09IGZhbHNlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUGF0Y2hlcyB0aGUgdmFsdWUgb2YgYSBjb250cm9sLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBmdW5jdGlvbiBpcyBmdW5jdGlvbmFsbHkgdGhlIHNhbWUgYXMge1xAbGluayBGb3JtQ29udHJvbCNzZXRWYWx1ZSBzZXRWYWx1ZX0gYXQgdGhpcyBsZXZlbC4KICAgICAgICAgKiBJdCBleGlzdHMgZm9yIHN5bW1ldHJ5IHdpdGgge1xAbGluayBGb3JtR3JvdXAjcGF0Y2hWYWx1ZSBwYXRjaFZhbHVlfSBvbiBgRm9ybUdyb3Vwc2AgYW5kCiAgICAgICAgICogYEZvcm1BcnJheXNgLCB3aGVyZSBpdCBkb2VzIGJlaGF2ZSBkaWZmZXJlbnRseS4KICAgICAgICAgKgogICAgICAgICAqIEBzZWUgYHNldFZhbHVlYCBmb3Igb3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXRjaFZhbHVlKHZhbHVlLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgdGhpcy5zZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB0aGUgZm9ybSBjb250cm9sLCBtYXJraW5nIGl0IGBwcmlzdGluZWAgYW5kIGB1bnRvdWNoZWRgLCBhbmQgc2V0dGluZwogICAgICAgICAqIHRoZSB2YWx1ZSB0byBudWxsLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gZm9ybVN0YXRlIFJlc2V0cyB0aGUgY29udHJvbCB3aXRoIGFuIGluaXRpYWwgdmFsdWUsCiAgICAgICAgICogb3IgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgaW5pdGlhbCB2YWx1ZSBhbmQgZGlzYWJsZWQgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzCiAgICAgICAgICogYW5kIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgKgogICAgICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQgaXMKICAgICAgICAgKiBmYWxzZS4KICAgICAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgaXMgcmVzZXQuCiAgICAgICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldChmb3JtU3RhdGUgPSBudWxsLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgdGhpcy5fYXBwbHlGb3JtU3RhdGUoZm9ybVN0YXRlKTsKICAgICAgICAgICAgdGhpcy5tYXJrQXNQcmlzdGluZShvcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5tYXJrQXNVbnRvdWNoZWQob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuc2V0VmFsdWUodGhpcy52YWx1ZSwgb3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmdDaGFuZ2UgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVZhbHVlKCkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gY29uZGl0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYW55Q29udHJvbHMoY29uZGl0aW9uKSB7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FsbENvbnRyb2xzRGlzYWJsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBjaGFuZ2UgZXZlbnRzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgbWV0aG9kIHRoYXQgaXMgY2FsbGVkIHdoZW4gdGhlIHZhbHVlIGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UucHVzaChmbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jbGVhckNoYW5nZUZucygpIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBbXTsKICAgICAgICAgICAgdGhpcy5fb25EaXNhYmxlZENoYW5nZSA9IFtdOwogICAgICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlciBhIGxpc3RlbmVyIGZvciBkaXNhYmxlZCBldmVudHMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGZuIFRoZSBtZXRob2QgdGhhdCBpcyBjYWxsZWQgd2hlbiB0aGUgZGlzYWJsZWQgc3RhdHVzIGNoYW5nZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uRGlzYWJsZWRDaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25EaXNhYmxlZENoYW5nZS5wdXNoKGZuKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gY2IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb3JFYWNoQ2hpbGQoY2IpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zeW5jUGVuZGluZ0NvbnRyb2xzKCkgewogICAgICAgICAgICBpZiAodGhpcy51cGRhdGVPbiA9PT0gJ3N1Ym1pdCcpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wZW5kaW5nRGlydHkpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdUb3VjaGVkKQogICAgICAgICAgICAgICAgICAgIHRoaXMubWFya0FzVG91Y2hlZCgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BlbmRpbmdDaGFuZ2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNldFZhbHVlKHRoaXMuX3BlbmRpbmdWYWx1ZSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdE1vZGVsVG9WaWV3Q2hhbmdlOiBmYWxzZSB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBmb3JtU3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hcHBseUZvcm1TdGF0ZShmb3JtU3RhdGUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzQm94ZWRWYWx1ZShmb3JtU3RhdGUpKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkudmFsdWUgPSB0aGlzLl9wZW5kaW5nVmFsdWUgPSBmb3JtU3RhdGUudmFsdWU7CiAgICAgICAgICAgICAgICBmb3JtU3RhdGUuZGlzYWJsZWQgPyB0aGlzLmRpc2FibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KSA6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lbmFibGUoeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS52YWx1ZSA9IHRoaXMuX3BlbmRpbmdWYWx1ZSA9IGZvcm1TdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogVHJhY2tzIHRoZSB2YWx1ZSBhbmQgdmFsaWRpdHkgc3RhdGUgb2YgYSBncm91cCBvZiBgRm9ybUNvbnRyb2xgIGluc3RhbmNlcy4KICAgICAqCiAgICAgKiBBIGBGb3JtR3JvdXBgIGFnZ3JlZ2F0ZXMgdGhlIHZhbHVlcyBvZiBlYWNoIGNoaWxkIGBGb3JtQ29udHJvbGAgaW50byBvbmUgb2JqZWN0LAogICAgICogd2l0aCBlYWNoIGNvbnRyb2wgbmFtZSBhcyB0aGUga2V5LiAgSXQgY2FsY3VsYXRlcyBpdHMgc3RhdHVzIGJ5IHJlZHVjaW5nIHRoZSBzdGF0dXMgdmFsdWVzCiAgICAgKiBvZiBpdHMgY2hpbGRyZW4uIEZvciBleGFtcGxlLCBpZiBvbmUgb2YgdGhlIGNvbnRyb2xzIGluIGEgZ3JvdXAgaXMgaW52YWxpZCwgdGhlIGVudGlyZQogICAgICogZ3JvdXAgYmVjb21lcyBpbnZhbGlkLgogICAgICoKICAgICAqIGBGb3JtR3JvdXBgIGlzIG9uZSBvZiB0aGUgdGhyZWUgZnVuZGFtZW50YWwgYnVpbGRpbmcgYmxvY2tzIHVzZWQgdG8gZGVmaW5lIGZvcm1zIGluIEFuZ3VsYXIsCiAgICAgKiBhbG9uZyB3aXRoIGBGb3JtQ29udHJvbGAgYW5kIGBGb3JtQXJyYXlgLgogICAgICoKICAgICAqIFdoZW4gaW5zdGFudGlhdGluZyBhIGBGb3JtR3JvdXBgLCBwYXNzIGluIGEgY29sbGVjdGlvbiBvZiBjaGlsZCBjb250cm9scyBhcyB0aGUgZmlyc3QKICAgICAqIGFyZ3VtZW50LiBUaGUga2V5IGZvciBlYWNoIGNoaWxkIHJlZ2lzdGVycyB0aGUgbmFtZSBmb3IgdGhlIGNvbnRyb2wuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIENyZWF0ZSBhIGZvcm0gZ3JvdXAgd2l0aCAyIGNvbnRyb2xzCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JywgVmFsaWRhdG9ycy5taW5MZW5ndGgoMikpLAogICAgICogICBsYXN0OiBuZXcgRm9ybUNvbnRyb2woJ0RyZXcnKSwKICAgICAqIH0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogJ05hbmN5JywgbGFzdDsgJ0RyZXcnfQogICAgICogY29uc29sZS5sb2coZm9ybS5zdGF0dXMpOyAgLy8gJ1ZBTElEJwogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIENyZWF0ZSBhIGZvcm0gZ3JvdXAgd2l0aCBhIGdyb3VwLWxldmVsIHZhbGlkYXRvcgogICAgICoKICAgICAqIFlvdSBpbmNsdWRlIGdyb3VwLWxldmVsIHZhbGlkYXRvcnMgYXMgdGhlIHNlY29uZCBhcmcsIG9yIGdyb3VwLWxldmVsIGFzeW5jCiAgICAgKiB2YWxpZGF0b3JzIGFzIHRoZSB0aGlyZCBhcmcuIFRoZXNlIGNvbWUgaW4gaGFuZHkgd2hlbiB5b3Ugd2FudCB0byBwZXJmb3JtIHZhbGlkYXRpb24KICAgICAqIHRoYXQgY29uc2lkZXJzIHRoZSB2YWx1ZSBvZiBtb3JlIHRoYW4gb25lIGNoaWxkIGNvbnRyb2wuCiAgICAgKgogICAgICogYGBgCiAgICAgKiBjb25zdCBmb3JtID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgKiAgIHBhc3N3b3JkOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDIpKSwKICAgICAqICAgcGFzc3dvcmRDb25maXJtOiBuZXcgRm9ybUNvbnRyb2woJycsIFZhbGlkYXRvcnMubWluTGVuZ3RoKDIpKSwKICAgICAqIH0sIHBhc3N3b3JkTWF0Y2hWYWxpZGF0b3IpOwogICAgICoKICAgICAqCiAgICAgKiBmdW5jdGlvbiBwYXNzd29yZE1hdGNoVmFsaWRhdG9yKGc6IEZvcm1Hcm91cCkgewogICAgICogICAgcmV0dXJuIGcuZ2V0KCdwYXNzd29yZCcpLnZhbHVlID09PSBnLmdldCgncGFzc3dvcmRDb25maXJtJykudmFsdWUKICAgICAqICAgICAgID8gbnVsbCA6IHsnbWlzbWF0Y2gnOiB0cnVlfTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqIExpa2UgYEZvcm1Db250cm9sYCBpbnN0YW5jZXMsIHlvdSBjaG9vc2UgdG8gcGFzcyBpbgogICAgICogdmFsaWRhdG9ycyBhbmQgYXN5bmMgdmFsaWRhdG9ycyBhcyBwYXJ0IG9mIGFuIG9wdGlvbnMgb2JqZWN0LgogICAgICoKICAgICAqIGBgYAogICAgICogY29uc3QgZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICogICBwYXNzd29yZDogbmV3IEZvcm1Db250cm9sKCcnKQogICAgICogICBwYXNzd29yZENvbmZpcm06IG5ldyBGb3JtQ29udHJvbCgnJykKICAgICAqIH0sIHsgdmFsaWRhdG9yczogcGFzc3dvcmRNYXRjaFZhbGlkYXRvciwgYXN5bmNWYWxpZGF0b3JzOiBvdGhlclZhbGlkYXRvciB9KTsKICAgICAqIGBgYAogICAgICoKICAgICAqICMjIyBTZXQgdGhlIHVwZGF0ZU9uIHByb3BlcnR5IGZvciBhbGwgY29udHJvbHMgaW4gYSBmb3JtIGdyb3VwCiAgICAgKgogICAgICogVGhlIG9wdGlvbnMgb2JqZWN0IGlzIHVzZWQgdG8gc2V0IGEgZGVmYXVsdCB2YWx1ZSBmb3IgZWFjaCBjaGlsZAogICAgICogY29udHJvbCdzIGB1cGRhdGVPbmAgcHJvcGVydHkuIElmIHlvdSBzZXQgYHVwZGF0ZU9uYCB0byBgJ2JsdXInYCBhdCB0aGUKICAgICAqIGdyb3VwIGxldmVsLCBhbGwgY2hpbGQgY29udHJvbHMgZGVmYXVsdCB0byAnYmx1cicsIHVubGVzcyB0aGUgY2hpbGQKICAgICAqIGhhcyBleHBsaWNpdGx5IHNwZWNpZmllZCBhIGRpZmZlcmVudCBgdXBkYXRlT25gIHZhbHVlLgogICAgICoKICAgICAqIGBgYHRzCiAgICAgKiBjb25zdCBjID0gbmV3IEZvcm1Hcm91cCh7CiAgICAgKiAgIG9uZTogbmV3IEZvcm1Db250cm9sKCkKICAgICAqIH0sIHsgdXBkYXRlT246ICdibHVyJyB9KTsKICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEZvcm1Hcm91cCBleHRlbmRzIEFic3RyYWN0Q29udHJvbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBgRm9ybUdyb3VwYCBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbHMgQSBjb2xsZWN0aW9uIG9mIGNoaWxkIGNvbnRyb2xzLiBUaGUga2V5IGZvciBlYWNoIGNoaWxkIGlzIHRoZSBuYW1lCiAgICAgICAgICogdW5kZXIgd2hpY2ggaXQgaXMgcmVnaXN0ZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbGlkYXRvck9yT3B0cyBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YKICAgICAgICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zIHZhbGlkYXRpb24gZnVuY3Rpb25zCiAgICAgICAgICogYW5kIGEgdmFsaWRhdGlvbiB0cmlnZ2VyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXN5bmNWYWxpZGF0b3IgQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbnRyb2xzLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgICAgIHN1cGVyKGNvZXJjZVRvVmFsaWRhdG9yKHZhbGlkYXRvck9yT3B0cyksIGNvZXJjZVRvQXN5bmNWYWxpZGF0b3IoYXN5bmNWYWxpZGF0b3IsIHZhbGlkYXRvck9yT3B0cykpOwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzID0gY29udHJvbHM7CiAgICAgICAgICAgIHRoaXMuX2luaXRPYnNlcnZhYmxlcygpOwogICAgICAgICAgICB0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSh2YWxpZGF0b3JPck9wdHMpOwogICAgICAgICAgICB0aGlzLl9zZXRVcENvbnRyb2xzKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjb250cm9sIHdpdGggdGhlIGdyb3VwJ3MgbGlzdCBvZiBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHVwZGF0ZSB0aGUgdmFsdWUgb3IgdmFsaWRpdHkgb2YgdGhlIGNvbnRyb2wuCiAgICAgICAgICogVXNlIHtcQGxpbmsgRm9ybUdyb3VwI2FkZENvbnRyb2wgYWRkQ29udHJvbH0gaW5zdGVhZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgY29udHJvbCBuYW1lIHRvIHJlZ2lzdGVyIGluIHRoZSBjb2xsZWN0aW9uCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sIFByb3ZpZGVzIHRoZSBjb250cm9sIGZvciB0aGUgZ2l2ZW4gbmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJDb250cm9sKG5hbWUsIGNvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbbmFtZV0pCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sc1tuYW1lXTsKICAgICAgICAgICAgdGhpcy5jb250cm9sc1tuYW1lXSA9IGNvbnRyb2w7CiAgICAgICAgICAgIGNvbnRyb2wuc2V0UGFyZW50KHRoaXMpOwogICAgICAgICAgICBjb250cm9sLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpOwogICAgICAgICAgICByZXR1cm4gY29udHJvbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIGEgY29udHJvbCB0byB0aGlzIGdyb3VwLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBtZXRob2QgYWxzbyB1cGRhdGVzIHRoZSB2YWx1ZSBhbmQgdmFsaWRpdHkgb2YgdGhlIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGNvbnRyb2wgbmFtZSB0byBhZGQgdG8gdGhlIGNvbGxlY3Rpb24KICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgUHJvdmlkZXMgdGhlIGNvbnRyb2wgZm9yIHRoZSBnaXZlbiBuYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRDb250cm9sKG5hbWUsIGNvbnRyb2wpIHsKICAgICAgICAgICAgdGhpcy5yZWdpc3RlckNvbnRyb2wobmFtZSwgY29udHJvbCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOwogICAgICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlIGEgY29udHJvbCBmcm9tIHRoaXMgZ3JvdXAuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGNvbnRyb2wgbmFtZSB0byByZW1vdmUgZnJvbSB0aGUgY29sbGVjdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlQ29udHJvbChuYW1lKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2xzW25hbWVdKQogICAgICAgICAgICAgICAgdGhpcy5jb250cm9sc1tuYW1lXS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4geyB9KSk7CiAgICAgICAgICAgIGRlbGV0ZSAodGhpcy5jb250cm9sc1tuYW1lXSk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOwogICAgICAgICAgICB0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZSBhbiBleGlzdGluZyBjb250cm9sLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lIFRoZSBjb250cm9sIG5hbWUgdG8gcmVwbGFjZSBpbiB0aGUgY29sbGVjdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbCBQcm92aWRlcyB0aGUgY29udHJvbCBmb3IgdGhlIGdpdmVuIG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldENvbnRyb2wobmFtZSwgY29udHJvbCkgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sc1tuYW1lXSkKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHNbbmFtZV0uX3JlZ2lzdGVyT25Db2xsZWN0aW9uQ2hhbmdlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsgfSkpOwogICAgICAgICAgICBkZWxldGUgKHRoaXMuY29udHJvbHNbbmFtZV0pOwogICAgICAgICAgICBpZiAoY29udHJvbCkKICAgICAgICAgICAgICAgIHRoaXMucmVnaXN0ZXJDb250cm9sKG5hbWUsIGNvbnRyb2wpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTsKICAgICAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrIHdoZXRoZXIgdGhlcmUgaXMgYW4gZW5hYmxlZCBjb250cm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgaW4gdGhlIGdyb3VwLgogICAgICAgICAqCiAgICAgICAgICogUmVwb3J0cyBmYWxzZSBmb3IgZGlzYWJsZWQgY29udHJvbHMuIElmIHlvdSdkIGxpa2UgdG8gY2hlY2sgZm9yIGV4aXN0ZW5jZSBpbiB0aGUgZ3JvdXAKICAgICAgICAgKiBvbmx5LCB1c2Uge1xAbGluayBBYnN0cmFjdENvbnRyb2wjZ2V0IGdldH0gaW5zdGVhZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbE5hbWUgVGhlIGNvbnRyb2wgbmFtZSB0byBjaGVjayBmb3IgZXhpc3RlbmNlIGluIHRoZSBjb2xsZWN0aW9uCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBmYWxzZSBmb3IgZGlzYWJsZWQgY29udHJvbHMsIHRydWUgb3RoZXJ3aXNlLgogICAgICAgICAqLwogICAgICAgIGNvbnRhaW5zKGNvbnRyb2xOYW1lKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmhhc093blByb3BlcnR5KGNvbnRyb2xOYW1lKSAmJiB0aGlzLmNvbnRyb2xzW2NvbnRyb2xOYW1lXS5lbmFibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1Hcm91cGAuIEl0IGFjY2VwdHMgYW4gb2JqZWN0IHRoYXQgbWF0Y2hlcwogICAgICAgICAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdyb3VwLCB3aXRoIGNvbnRyb2wgbmFtZXMgYXMga2V5cy4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqICMjIyBTZXQgdGhlIGNvbXBsZXRlIHZhbHVlIGZvciB0aGUgZm9ybSBncm91cAogICAgICAgICAqCiAgICAgICAgICogYGBgCiAgICAgICAgICogY29uc3QgZm9ybSA9IG5ldyBGb3JtR3JvdXAoewogICAgICAgICAqICAgZmlyc3Q6IG5ldyBGb3JtQ29udHJvbCgpLAogICAgICAgICAqICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCkKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgIC8vIHtmaXJzdDogbnVsbCwgbGFzdDogbnVsbH0KICAgICAgICAgKgogICAgICAgICAqIGZvcm0uc2V0VmFsdWUoe2ZpcnN0OiAnTmFuY3knLCBsYXN0OiAnRHJldyd9KTsKICAgICAgICAgKiBjb25zb2xlLmxvZyhmb3JtLnZhbHVlKTsgICAvLyB7Zmlyc3Q6ICdOYW5jeScsIGxhc3Q6ICdEcmV3J30KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEB0aHJvd3MgV2hlbiBzdHJpY3QgY2hlY2tzIGZhaWwsIHN1Y2ggYXMgc2V0dGluZyB0aGUgdmFsdWUgb2YgYSBjb250cm9sCiAgICAgICAgICogdGhhdCBkb2Vzbid0IGV4aXN0IG9yIGlmIHlvdSBleGNsdWRlIGEgdmFsdWUgb2YgYSBjb250cm9sIHRoYXQgZG9lcyBleGlzdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGNvbnRyb2wgdGhhdCBtYXRjaGVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGdyb3VwLgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMKICAgICAgICAgKiBhbmQgZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSB2YWx1ZSBjaGFuZ2VzLgogICAgICAgICAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUge1xAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eQogICAgICAgICAqIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHl9IG1ldGhvZC4KICAgICAgICAgKgogICAgICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQgaXMKICAgICAgICAgKiBmYWxzZS4KICAgICAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgaXMgdXBkYXRlZC4KICAgICAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRWYWx1ZSh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrQWxsVmFsdWVzUHJlc2VudCh2YWx1ZSk7CiAgICAgICAgICAgIE9iamVjdC5rZXlzKHZhbHVlKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBuYW1lID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3Rocm93SWZDb250cm9sTWlzc2luZyhuYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHNbbmFtZV0uc2V0VmFsdWUodmFsdWVbbmFtZV0sIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQYXRjaGVzIHRoZSB2YWx1ZSBvZiB0aGUgYEZvcm1Hcm91cGAuIEl0IGFjY2VwdHMgYW4gb2JqZWN0IHdpdGggY29udHJvbAogICAgICAgICAqIG5hbWVzIGFzIGtleXMsIGFuZCBkb2VzIGl0cyBiZXN0IHRvIG1hdGNoIHRoZSB2YWx1ZXMgdG8gdGhlIGNvcnJlY3QgY29udHJvbHMKICAgICAgICAgKiBpbiB0aGUgZ3JvdXAuCiAgICAgICAgICoKICAgICAgICAgKiBJdCBhY2NlcHRzIGJvdGggc3VwZXItc2V0cyBhbmQgc3ViLXNldHMgb2YgdGhlIGdyb3VwIHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3IuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgUGF0Y2ggdGhlIHZhbHVlIGZvciBhIGZvcm0gZ3JvdXAKICAgICAgICAgKgogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAgICAgKiAgICBmaXJzdDogbmV3IEZvcm1Db250cm9sKCksCiAgICAgICAgICogICAgbGFzdDogbmV3IEZvcm1Db250cm9sKCkKICAgICAgICAgKiB9KTsKICAgICAgICAgKiBjb25zb2xlLmxvZyhmb3JtLnZhbHVlKTsgICAvLyB7Zmlyc3Q6IG51bGwsIGxhc3Q6IG51bGx9CiAgICAgICAgICoKICAgICAgICAgKiBmb3JtLnBhdGNoVmFsdWUoe2ZpcnN0OiAnTmFuY3knfSk7CiAgICAgICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAgLy8ge2ZpcnN0OiAnTmFuY3knLCBsYXN0OiBudWxsfQogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgb2JqZWN0IHRoYXQgbWF0Y2hlcyB0aGUgc3RydWN0dXJlIG9mIHRoZSBncm91cC4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzIGFuZAogICAgICAgICAqIGVtaXRzIGV2ZW50cyBhZnRlciB0aGUgdmFsdWUgaXMgcGF0Y2hlZC4KICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQgaXMKICAgICAgICAgKiB0cnVlLgogICAgICAgICAqICogYGVtaXRFdmVudGA6IFdoZW4gdHJ1ZSBvciBub3Qgc3VwcGxpZWQgKHRoZSBkZWZhdWx0KSwgYm90aCB0aGUgYHN0YXR1c0NoYW5nZXNgIGFuZAogICAgICAgICAqIGB2YWx1ZUNoYW5nZXNgCiAgICAgICAgICogb2JzZXJ2YWJsZXMgZW1pdCBldmVudHMgd2l0aCB0aGUgbGF0ZXN0IHN0YXR1cyBhbmQgdmFsdWUgd2hlbiB0aGUgY29udHJvbCB2YWx1ZSBpcyB1cGRhdGVkLgogICAgICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHkKICAgICAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXRjaFZhbHVlKHZhbHVlLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgT2JqZWN0LmtleXModmFsdWUpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG5hbWUgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbbmFtZV0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzW25hbWVdLnBhdGNoVmFsdWUodmFsdWVbbmFtZV0sIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdGhlIGBGb3JtR3JvdXBgLCBtYXJrcyBhbGwgZGVzY2VuZGFudHMgYXJlIG1hcmtlZCBgcHJpc3RpbmVgIGFuZCBgdW50b3VjaGVkYCwgYW5kCiAgICAgICAgICogdGhlIHZhbHVlIG9mIGFsbCBkZXNjZW5kYW50cyB0byBudWxsLgogICAgICAgICAqCiAgICAgICAgICogWW91IHJlc2V0IHRvIGEgc3BlY2lmaWMgZm9ybSBzdGF0ZSBieSBwYXNzaW5nIGluIGEgbWFwIG9mIHN0YXRlcwogICAgICAgICAqIHRoYXQgbWF0Y2hlcyB0aGUgc3RydWN0dXJlIG9mIHlvdXIgZm9ybSwgd2l0aCBjb250cm9sIG5hbWVzIGFzIGtleXMuIFRoZSBzdGF0ZQogICAgICAgICAqIGlzIGEgc3RhbmRhbG9uZSB2YWx1ZSBvciBhIGZvcm0gc3RhdGUgb2JqZWN0IHdpdGggYm90aCBhIHZhbHVlIGFuZCBhIGRpc2FibGVkCiAgICAgICAgICogc3RhdHVzLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICoKICAgICAgICAgKiAjIyMgUmVzZXQgdGhlIGZvcm0gZ3JvdXAgdmFsdWVzCiAgICAgICAgICoKICAgICAgICAgKiBgYGB0cwogICAgICAgICAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ2ZpcnN0IG5hbWUnKSwKICAgICAgICAgKiAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnbGFzdCBuYW1lJykKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKGZvcm0udmFsdWUpOyAgLy8ge2ZpcnN0OiAnZmlyc3QgbmFtZScsIGxhc3Q6ICdsYXN0IG5hbWUnfQogICAgICAgICAqCiAgICAgICAgICogZm9ybS5yZXNldCh7IGZpcnN0OiAnbmFtZScsIGxhc3Q6ICdsYXN0IG5hbWUnIH0pOwogICAgICAgICAqCiAgICAgICAgICogY29uc29sZS5sb2coZm9ybS52YWx1ZSk7ICAvLyB7Zmlyc3Q6ICduYW1lJywgbGFzdDogJ2xhc3QgbmFtZSd9CiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiAjIyMgUmVzZXQgdGhlIGZvcm0gZ3JvdXAgdmFsdWVzIGFuZCBkaXNhYmxlZCBzdGF0dXMKICAgICAgICAgKgogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGZvcm0gPSBuZXcgRm9ybUdyb3VwKHsKICAgICAgICAgKiAgIGZpcnN0OiBuZXcgRm9ybUNvbnRyb2woJ2ZpcnN0IG5hbWUnKSwKICAgICAgICAgKiAgIGxhc3Q6IG5ldyBGb3JtQ29udHJvbCgnbGFzdCBuYW1lJykKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIGZvcm0ucmVzZXQoewogICAgICAgICAqICAgZmlyc3Q6IHt2YWx1ZTogJ25hbWUnLCBkaXNhYmxlZDogdHJ1ZX0sCiAgICAgICAgICogICBsYXN0OiAnbGFzdCcKICAgICAgICAgKiB9KTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKHRoaXMuZm9ybS52YWx1ZSk7ICAvLyB7Zmlyc3Q6ICduYW1lJywgbGFzdDogJ2xhc3QgbmFtZSd9CiAgICAgICAgICogY29uc29sZS5sb2codGhpcy5mb3JtLmdldCgnZmlyc3QnKS5zdGF0dXMpOyAgLy8gJ0RJU0FCTEVEJwogICAgICAgICAqIGBgYAogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFJlc2V0cyB0aGUgY29udHJvbCB3aXRoIGFuIGluaXRpYWwgdmFsdWUsCiAgICAgICAgICogb3IgYW4gb2JqZWN0IHRoYXQgZGVmaW5lcyB0aGUgaW5pdGlhbCB2YWx1ZSBhbmQgZGlzYWJsZWQgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyB0aGF0IGRldGVybWluZSBob3cgdGhlIGNvbnRyb2wgcHJvcGFnYXRlcyBjaGFuZ2VzCiAgICAgICAgICogYW5kIGVtaXRzIGV2ZW50cyB3aGVuIHRoZSBncm91cCBpcyByZXNldC4KICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0IGlzCiAgICAgICAgICogZmFsc2UuCiAgICAgICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgICAgICogYHZhbHVlQ2hhbmdlc2AKICAgICAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHJlc2V0LgogICAgICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHkKICAgICAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc2V0KHZhbHVlID0ge30sIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCwgbmFtZSkgPT4gewogICAgICAgICAgICAgICAgY29udHJvbC5yZXNldCh2YWx1ZVtuYW1lXSwgeyBvbmx5U2VsZjogdHJ1ZSwgZW1pdEV2ZW50OiBvcHRpb25zLmVtaXRFdmVudCB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVQcmlzdGluZShvcHRpb25zKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVG91Y2hlZChvcHRpb25zKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYWdncmVnYXRlIHZhbHVlIG9mIHRoZSBgRm9ybUdyb3VwYCwgaW5jbHVkaW5nIGFueSBkaXNhYmxlZCBjb250cm9scy4KICAgICAgICAgKgogICAgICAgICAqIFJldHJpZXZlcyBhbGwgdmFsdWVzIHJlZ2FyZGxlc3Mgb2YgZGlzYWJsZWQgc3RhdHVzLgogICAgICAgICAqIFRoZSBgdmFsdWVgIHByb3BlcnR5IGlzIHRoZSBiZXN0IHdheSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBncm91cCwgYmVjYXVzZQogICAgICAgICAqIGl0IGV4Y2x1ZGVzIGRpc2FibGVkIGNvbnRyb2xzIGluIHRoZSBgRm9ybUdyb3VwYC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFJhd1ZhbHVlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVkdWNlQ2hpbGRyZW4oe30sICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY2MKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGFjYywgY29udHJvbCwgbmFtZSkgPT4gewogICAgICAgICAgICAgICAgYWNjW25hbWVdID0gY29udHJvbCBpbnN0YW5jZW9mIEZvcm1Db250cm9sID8gY29udHJvbC52YWx1ZSA6ICgoLyoqIEB0eXBlIHs/fSAqLyAoY29udHJvbCkpKS5nZXRSYXdWYWx1ZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGFjYzsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3luY1BlbmRpbmdDb250cm9scygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc3VidHJlZVVwZGF0ZWQgPSB0aGlzLl9yZWR1Y2VDaGlsZHJlbihmYWxzZSwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHVwZGF0ZWQKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjaGlsZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHVwZGF0ZWQsIGNoaWxkKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpbGQuX3N5bmNQZW5kaW5nQ29udHJvbHMoKSA/IHRydWUgOiB1cGRhdGVkOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmIChzdWJ0cmVlVXBkYXRlZCkKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IG9ubHlTZWxmOiB0cnVlIH0pOwogICAgICAgICAgICByZXR1cm4gc3VidHJlZVVwZGF0ZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF90aHJvd0lmQ29udHJvbE1pc3NpbmcobmFtZSkgewogICAgICAgICAgICBpZiAoIU9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAKICAgICAgICBUaGVyZSBhcmUgbm8gZm9ybSBjb250cm9scyByZWdpc3RlcmVkIHdpdGggdGhpcyBncm91cCB5ZXQuICBJZiB5b3UncmUgdXNpbmcgbmdNb2RlbCwKICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS4KICAgICAgYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xzW25hbWVdKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCBmaW5kIGZvcm0gY29udHJvbCB3aXRoIG5hbWU6ICR7bmFtZX0uYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gY2IKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb3JFYWNoQ2hpbGQoY2IpIHsKICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5jb250cm9scykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gawogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgayA9PiBjYih0aGlzLmNvbnRyb2xzW2tdLCBrKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VXBDb250cm9scygpIHsKICAgICAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICAgICAgY29udHJvbC5zZXRQYXJlbnQodGhpcyk7CiAgICAgICAgICAgICAgICBjb250cm9sLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSh0aGlzLl9vbkNvbGxlY3Rpb25DaGFuZ2UpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVWYWx1ZSgpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnZhbHVlID0gdGhpcy5fcmVkdWNlVmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gY29uZGl0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYW55Q29udHJvbHMoY29uZGl0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlcyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCwgbmFtZSkgPT4gewogICAgICAgICAgICAgICAgcmVzID0gcmVzIHx8ICh0aGlzLmNvbnRhaW5zKG5hbWUpICYmIGNvbmRpdGlvbihjb250cm9sKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3JlZHVjZVZhbHVlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcmVkdWNlQ2hpbGRyZW4oe30sICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY2MKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGFjYywgY29udHJvbCwgbmFtZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKGNvbnRyb2wuZW5hYmxlZCB8fCB0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgYWNjW25hbWVdID0gY29udHJvbC52YWx1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBhY2M7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gaW5pdFZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3JlZHVjZUNoaWxkcmVuKGluaXRWYWx1ZSwgZm4pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcmVzID0gaW5pdFZhbHVlOwogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCwgbmFtZSkgPT4gewogICAgICAgICAgICAgICAgcmVzID0gZm4ocmVzLCBjb250cm9sLCBuYW1lKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWxsQ29udHJvbHNEaXNhYmxlZCgpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sTmFtZSBvZiBPYmplY3Qua2V5cyh0aGlzLmNvbnRyb2xzKSkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuY29udHJvbHNbY29udHJvbE5hbWVdLmVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuY29udHJvbHMpLmxlbmd0aCA+IDAgfHwgdGhpcy5kaXNhYmxlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja0FsbFZhbHVlc1ByZXNlbnQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wsIG5hbWUpID0+IHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZVtuYW1lXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBNdXN0IHN1cHBseSBhIHZhbHVlIGZvciBmb3JtIGNvbnRyb2wgd2l0aCBuYW1lOiAnJHtuYW1lfScuYCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFRyYWNrcyB0aGUgdmFsdWUgYW5kIHZhbGlkaXR5IHN0YXRlIG9mIGFuIGFycmF5IG9mIGBGb3JtQ29udHJvbGAsCiAgICAgKiBgRm9ybUdyb3VwYCBvciBgRm9ybUFycmF5YCBpbnN0YW5jZXMuCiAgICAgKgogICAgICogQSBgRm9ybUFycmF5YCBhZ2dyZWdhdGVzIHRoZSB2YWx1ZXMgb2YgZWFjaCBjaGlsZCBgRm9ybUNvbnRyb2xgIGludG8gYW4gYXJyYXkuCiAgICAgKiBJdCBjYWxjdWxhdGVzIGl0cyBzdGF0dXMgYnkgcmVkdWNpbmcgdGhlIHN0YXR1cyB2YWx1ZXMgb2YgaXRzIGNoaWxkcmVuLiBGb3IgZXhhbXBsZSwgaWYgb25lIG9mCiAgICAgKiB0aGUgY29udHJvbHMgaW4gYSBgRm9ybUFycmF5YCBpcyBpbnZhbGlkLCB0aGUgZW50aXJlIGFycmF5IGJlY29tZXMgaW52YWxpZC4KICAgICAqCiAgICAgKiBgRm9ybUFycmF5YCBpcyBvbmUgb2YgdGhlIHRocmVlIGZ1bmRhbWVudGFsIGJ1aWxkaW5nIGJsb2NrcyB1c2VkIHRvIGRlZmluZSBmb3JtcyBpbiBBbmd1bGFyLAogICAgICogYWxvbmcgd2l0aCBgRm9ybUNvbnRyb2xgIGFuZCBgRm9ybUdyb3VwYC4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgQ3JlYXRlIGFuIGFycmF5IG9mIGZvcm0gY29udHJvbHMKICAgICAqCiAgICAgKiBgYGAKICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICogICBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JywgVmFsaWRhdG9ycy5taW5MZW5ndGgoMikpLAogICAgICogICBuZXcgRm9ybUNvbnRyb2woJ0RyZXcnKSwKICAgICAqIF0pOwogICAgICoKICAgICAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gWydOYW5jeScsICdEcmV3J10KICAgICAqIGNvbnNvbGUubG9nKGFyci5zdGF0dXMpOyAgLy8gJ1ZBTElEJwogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIENyZWF0ZSBhIGZvcm0gYXJyYXkgd2l0aCBhcnJheS1sZXZlbCB2YWxpZGF0b3JzCiAgICAgKgogICAgICogWW91IGluY2x1ZGUgYXJyYXktbGV2ZWwgdmFsaWRhdG9ycyBhbmQgYXN5bmMgdmFsaWRhdG9ycy4gVGhlc2UgY29tZSBpbiBoYW5keQogICAgICogd2hlbiB5b3Ugd2FudCB0byBwZXJmb3JtIHZhbGlkYXRpb24gdGhhdCBjb25zaWRlcnMgdGhlIHZhbHVlIG9mIG1vcmUgdGhhbiBvbmUgY2hpbGQKICAgICAqIGNvbnRyb2wuCiAgICAgKgogICAgICogVGhlIHR3byB0eXBlcyBvZiB2YWxpZGF0b3JzIGFyZSBwYXNzZWQgaW4gc2VwYXJhdGVseSBhcyB0aGUgc2Vjb25kIGFuZCB0aGlyZCBhcmcKICAgICAqIHJlc3BlY3RpdmVseSwgb3IgdG9nZXRoZXIgYXMgcGFydCBvZiBhbiBvcHRpb25zIG9iamVjdC4KICAgICAqCiAgICAgKiBgYGAKICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICogICBuZXcgRm9ybUNvbnRyb2woJ05hbmN5JyksCiAgICAgKiAgIG5ldyBGb3JtQ29udHJvbCgnRHJldycpCiAgICAgKiBdLCB7dmFsaWRhdG9yczogbXlWYWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yczogbXlBc3luY1ZhbGlkYXRvcn0pOwogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIFNldCB0aGUgdXBkYXRlT24gcHJvcGVydHkgZm9yIGFsbCBjb250cm9scyBpbiBhIGZvcm0gYXJyYXkKICAgICAqCiAgICAgKiBUaGUgb3B0aW9ucyBvYmplY3QgaXMgdXNlZCB0byBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciBlYWNoIGNoaWxkCiAgICAgKiBjb250cm9sJ3MgYHVwZGF0ZU9uYCBwcm9wZXJ0eS4gSWYgeW91IHNldCBgdXBkYXRlT25gIHRvIGAnYmx1cidgIGF0IHRoZQogICAgICogYXJyYXkgbGV2ZWwsIGFsbCBjaGlsZCBjb250cm9scyBkZWZhdWx0IHRvICdibHVyJywgdW5sZXNzIHRoZSBjaGlsZAogICAgICogaGFzIGV4cGxpY2l0bHkgc3BlY2lmaWVkIGEgZGlmZmVyZW50IGB1cGRhdGVPbmAgdmFsdWUuCiAgICAgKgogICAgICogYGBgdHMKICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICogICAgbmV3IEZvcm1Db250cm9sKCkKICAgICAqIF0sIHt1cGRhdGVPbjogJ2JsdXInfSk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgQWRkaW5nIG9yIHJlbW92aW5nIGNvbnRyb2xzIGZyb20gYSBmb3JtIGFycmF5CiAgICAgKgogICAgICogVG8gY2hhbmdlIHRoZSBjb250cm9scyBpbiB0aGUgYXJyYXksIHVzZSB0aGUgYHB1c2hgLCBgaW5zZXJ0YCwgYHJlbW92ZUF0YCBvciBgY2xlYXJgIG1ldGhvZHMKICAgICAqIGluIGBGb3JtQXJyYXlgIGl0c2VsZi4gVGhlc2UgbWV0aG9kcyBlbnN1cmUgdGhlIGNvbnRyb2xzIGFyZSBwcm9wZXJseSB0cmFja2VkIGluIHRoZQogICAgICogZm9ybSdzIGhpZXJhcmNoeS4gRG8gbm90IG1vZGlmeSB0aGUgYXJyYXkgb2YgYEFic3RyYWN0Q29udHJvbGBzIHVzZWQgdG8gaW5zdGFudGlhdGUKICAgICAqIHRoZSBgRm9ybUFycmF5YCBkaXJlY3RseSwgYXMgdGhhdCByZXN1bHQgaW4gc3RyYW5nZSBhbmQgdW5leHBlY3RlZCBiZWhhdmlvciBzdWNoCiAgICAgKiBhcyBicm9rZW4gY2hhbmdlIGRldGVjdGlvbi4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBGb3JtQXJyYXkgZXh0ZW5kcyBBYnN0cmFjdENvbnRyb2wgewogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgYEZvcm1BcnJheWAgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2xzIEFuIGFycmF5IG9mIGNoaWxkIGNvbnRyb2xzLiBFYWNoIGNoaWxkIGNvbnRyb2wgaXMgZ2l2ZW4gYW4gaW5kZXgKICAgICAgICAgKiB3aGVyZSBpdCBpcyByZWdpc3RlcmVkLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gdmFsaWRhdG9yT3JPcHRzIEEgc3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uLCBvciBhbiBhcnJheSBvZgogICAgICAgICAqIHN1Y2ggZnVuY3Rpb25zLCBvciBhbiBgQWJzdHJhY3RDb250cm9sT3B0aW9uc2Agb2JqZWN0IHRoYXQgY29udGFpbnMgdmFsaWRhdGlvbiBmdW5jdGlvbnMKICAgICAgICAgKiBhbmQgYSB2YWxpZGF0aW9uIHRyaWdnZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSBhc3luY1ZhbGlkYXRvciBBIHNpbmdsZSBhc3luYyB2YWxpZGF0b3Igb3IgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9ucwogICAgICAgICAqCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29udHJvbHMsIHZhbGlkYXRvck9yT3B0cywgYXN5bmNWYWxpZGF0b3IpIHsKICAgICAgICAgICAgc3VwZXIoY29lcmNlVG9WYWxpZGF0b3IodmFsaWRhdG9yT3JPcHRzKSwgY29lcmNlVG9Bc3luY1ZhbGlkYXRvcihhc3luY1ZhbGlkYXRvciwgdmFsaWRhdG9yT3JPcHRzKSk7CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMgPSBjb250cm9sczsKICAgICAgICAgICAgdGhpcy5faW5pdE9ic2VydmFibGVzKCk7CiAgICAgICAgICAgIHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KHZhbGlkYXRvck9yT3B0cyk7CiAgICAgICAgICAgIHRoaXMuX3NldFVwQ29udHJvbHMoKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCB0aGUgYEFic3RyYWN0Q29udHJvbGAgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gcmV0cmlldmUgdGhlIGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0KGluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzW2luZGV4XTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW5zZXJ0IGEgbmV3IGBBYnN0cmFjdENvbnRyb2xgIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sIEZvcm0gY29udHJvbCB0byBiZSBpbnNlcnRlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcHVzaChjb250cm9sKSB7CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMucHVzaChjb250cm9sKTsKICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJDb250cm9sKGNvbnRyb2wpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTsKICAgICAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEluc2VydCBhIG5ldyBgQWJzdHJhY3RDb250cm9sYCBhdCB0aGUgZ2l2ZW4gYGluZGV4YCBpbiB0aGUgYXJyYXkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4IEluZGV4IGluIHRoZSBhcnJheSB0byBpbnNlcnQgdGhlIGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgRm9ybSBjb250cm9sIHRvIGJlIGluc2VydGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbnNlcnQoaW5kZXgsIGNvbnRyb2wpIHsKICAgICAgICAgICAgdGhpcy5jb250cm9scy5zcGxpY2UoaW5kZXgsIDAsIGNvbnRyb2wpOwogICAgICAgICAgICB0aGlzLl9yZWdpc3RlckNvbnRyb2woY29udHJvbCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmUgdGhlIGNvbnRyb2wgYXQgdGhlIGdpdmVuIGBpbmRleGAgaW4gdGhlIGFycmF5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleCBJbmRleCBpbiB0aGUgYXJyYXkgdG8gcmVtb3ZlIHRoZSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVBdChpbmRleCkgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sc1tpbmRleF0pCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzW2luZGV4XS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4geyB9KSk7CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlcGxhY2UgYW4gZXhpc3RpbmcgY29udHJvbC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXggSW5kZXggaW4gdGhlIGFycmF5IHRvIHJlcGxhY2UgdGhlIGNvbnRyb2wKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wgVGhlIGBBYnN0cmFjdENvbnRyb2xgIGNvbnRyb2wgdG8gcmVwbGFjZSB0aGUgZXhpc3RpbmcgY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0Q29udHJvbChpbmRleCwgY29udHJvbCkgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sc1tpbmRleF0pCiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xzW2luZGV4XS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4geyB9KSk7CiAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKGluZGV4LCAxKTsKICAgICAgICAgICAgaWYgKGNvbnRyb2wpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbHMuc3BsaWNlKGluZGV4LCAwLCBjb250cm9sKTsKICAgICAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyQ29udHJvbChjb250cm9sKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoKTsKICAgICAgICAgICAgdGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIExlbmd0aCBvZiB0aGUgY29udHJvbCBhcnJheS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBsZW5ndGgoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQXJyYXlgLiBJdCBhY2NlcHRzIGFuIGFycmF5IHRoYXQgbWF0Y2hlcwogICAgICAgICAqIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRyb2wuCiAgICAgICAgICoKICAgICAgICAgKiBUaGlzIG1ldGhvZCBwZXJmb3JtcyBzdHJpY3QgY2hlY2tzLCBhbmQgdGhyb3dzIGFuIGVycm9yIGlmIHlvdSB0cnkKICAgICAgICAgKiB0byBzZXQgdGhlIHZhbHVlIG9mIGEgY29udHJvbCB0aGF0IGRvZXNuJ3QgZXhpc3Qgb3IgaWYgeW91IGV4Y2x1ZGUgdGhlCiAgICAgICAgICogdmFsdWUgb2YgYSBjb250cm9sLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogIyMjIFNldCB0aGUgdmFsdWVzIGZvciB0aGUgY29udHJvbHMgaW4gdGhlIGZvcm0gYXJyYXkKICAgICAgICAgKgogICAgICAgICAqIGBgYAogICAgICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICAgICAqICAgbmV3IEZvcm1Db250cm9sKCksCiAgICAgICAgICogICBuZXcgRm9ybUNvbnRyb2woKQogICAgICAgICAqIF0pOwogICAgICAgICAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gW251bGwsIG51bGxdCiAgICAgICAgICoKICAgICAgICAgKiBhcnIuc2V0VmFsdWUoWydOYW5jeScsICdEcmV3J10pOwogICAgICAgICAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gWydOYW5jeScsICdEcmV3J10KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgQXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgY29udHJvbHMKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyZSBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kCiAgICAgICAgICogZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgICAgICoKICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0CiAgICAgICAgICogaXMgZmFsc2UuCiAgICAgICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgICAgICogYHZhbHVlQ2hhbmdlc2AKICAgICAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIHZhbHVlIGlzIHVwZGF0ZWQuCiAgICAgICAgICogV2hlbiBmYWxzZSwgbm8gZXZlbnRzIGFyZSBlbWl0dGVkLgogICAgICAgICAqIFRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXJlIHBhc3NlZCB0byB0aGUge1xAbGluayBBYnN0cmFjdENvbnRyb2wjdXBkYXRlVmFsdWVBbmRWYWxpZGl0eQogICAgICAgICAqIHVwZGF0ZVZhbHVlQW5kVmFsaWRpdHl9IG1ldGhvZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFZhbHVlKHZhbHVlLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgdGhpcy5fY2hlY2tBbGxWYWx1ZXNQcmVzZW50KHZhbHVlKTsKICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmV3VmFsdWUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5ld1ZhbHVlLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fdGhyb3dJZkNvbnRyb2xNaXNzaW5nKGluZGV4KTsKICAgICAgICAgICAgICAgIHRoaXMuYXQoaW5kZXgpLnNldFZhbHVlKG5ld1ZhbHVlLCB7IG9ubHlTZWxmOiB0cnVlLCBlbWl0RXZlbnQ6IG9wdGlvbnMuZW1pdEV2ZW50IH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUGF0Y2hlcyB0aGUgdmFsdWUgb2YgdGhlIGBGb3JtQXJyYXlgLiBJdCBhY2NlcHRzIGFuIGFycmF5IHRoYXQgbWF0Y2hlcyB0aGUKICAgICAgICAgKiBzdHJ1Y3R1cmUgb2YgdGhlIGNvbnRyb2wsIGFuZCBkb2VzIGl0cyBiZXN0IHRvIG1hdGNoIHRoZSB2YWx1ZXMgdG8gdGhlIGNvcnJlY3QKICAgICAgICAgKiBjb250cm9scyBpbiB0aGUgZ3JvdXAuCiAgICAgICAgICoKICAgICAgICAgKiBJdCBhY2NlcHRzIGJvdGggc3VwZXItc2V0cyBhbmQgc3ViLXNldHMgb2YgdGhlIGFycmF5IHdpdGhvdXQgdGhyb3dpbmcgYW4gZXJyb3IuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgUGF0Y2ggdGhlIHZhbHVlcyBmb3IgY29udHJvbHMgaW4gYSBmb3JtIGFycmF5CiAgICAgICAgICoKICAgICAgICAgKiBgYGAKICAgICAgICAgKiBjb25zdCBhcnIgPSBuZXcgRm9ybUFycmF5KFsKICAgICAgICAgKiAgICBuZXcgRm9ybUNvbnRyb2woKSwKICAgICAgICAgKiAgICBuZXcgRm9ybUNvbnRyb2woKQogICAgICAgICAqIF0pOwogICAgICAgICAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gW251bGwsIG51bGxdCiAgICAgICAgICoKICAgICAgICAgKiBhcnIucGF0Y2hWYWx1ZShbJ05hbmN5J10pOwogICAgICAgICAqIGNvbnNvbGUubG9nKGFyci52YWx1ZSk7ICAgLy8gWydOYW5jeScsIG51bGxdCiAgICAgICAgICogYGBgCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIEFycmF5IG9mIGxhdGVzdCB2YWx1ZXMgZm9yIHRoZSBjb250cm9scwogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMgQ29uZmlndXJlIG9wdGlvbnMgdGhhdCBkZXRlcm1pbmUgaG93IHRoZSBjb250cm9sIHByb3BhZ2F0ZXMgY2hhbmdlcyBhbmQKICAgICAgICAgKiBlbWl0cyBldmVudHMgYWZ0ZXIgdGhlIHZhbHVlIGNoYW5nZXMKICAgICAgICAgKgogICAgICAgICAqICogYG9ubHlTZWxmYDogV2hlbiB0cnVlLCBlYWNoIGNoYW5nZSBvbmx5IGFmZmVjdHMgdGhpcyBjb250cm9sLCBhbmQgbm90IGl0cyBwYXJlbnQuIERlZmF1bHQKICAgICAgICAgKiBpcyBmYWxzZS4KICAgICAgICAgKiAqIGBlbWl0RXZlbnRgOiBXaGVuIHRydWUgb3Igbm90IHN1cHBsaWVkICh0aGUgZGVmYXVsdCksIGJvdGggdGhlIGBzdGF0dXNDaGFuZ2VzYCBhbmQKICAgICAgICAgKiBgdmFsdWVDaGFuZ2VzYAogICAgICAgICAqIG9ic2VydmFibGVzIGVtaXQgZXZlbnRzIHdpdGggdGhlIGxhdGVzdCBzdGF0dXMgYW5kIHZhbHVlIHdoZW4gdGhlIGNvbnRyb2wgdmFsdWUgaXMgdXBkYXRlZC4KICAgICAgICAgKiBXaGVuIGZhbHNlLCBubyBldmVudHMgYXJlIGVtaXR0ZWQuCiAgICAgICAgICogVGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBhcmUgcGFzc2VkIHRvIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCN1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5CiAgICAgICAgICogdXBkYXRlVmFsdWVBbmRWYWxpZGl0eX0gbWV0aG9kLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGF0Y2hWYWx1ZSh2YWx1ZSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHZhbHVlLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChuZXdWYWx1ZSwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmF0KGluZGV4KSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYXQoaW5kZXgpLnBhdGNoVmFsdWUobmV3VmFsdWUsIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdGhlIGBGb3JtQXJyYXlgIGFuZCBhbGwgZGVzY2VuZGFudHMgYXJlIG1hcmtlZCBgcHJpc3RpbmVgIGFuZCBgdW50b3VjaGVkYCwgYW5kIHRoZQogICAgICAgICAqIHZhbHVlIG9mIGFsbCBkZXNjZW5kYW50cyB0byBudWxsIG9yIG51bGwgbWFwcy4KICAgICAgICAgKgogICAgICAgICAqIFlvdSByZXNldCB0byBhIHNwZWNpZmljIGZvcm0gc3RhdGUgYnkgcGFzc2luZyBpbiBhbiBhcnJheSBvZiBzdGF0ZXMKICAgICAgICAgKiB0aGF0IG1hdGNoZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29udHJvbC4gVGhlIHN0YXRlIGlzIGEgc3RhbmRhbG9uZSB2YWx1ZQogICAgICAgICAqIG9yIGEgZm9ybSBzdGF0ZSBvYmplY3Qgd2l0aCBib3RoIGEgdmFsdWUgYW5kIGEgZGlzYWJsZWQgc3RhdHVzLgogICAgICAgICAqCiAgICAgICAgICogXEB1c2FnZU5vdGVzCiAgICAgICAgICogIyMjIFJlc2V0IHRoZSB2YWx1ZXMgaW4gYSBmb3JtIGFycmF5CiAgICAgICAgICoKICAgICAgICAgKiBgYGB0cwogICAgICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpLAogICAgICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpCiAgICAgICAgICogXSk7CiAgICAgICAgICogYXJyLnJlc2V0KFsnbmFtZScsICdsYXN0IG5hbWUnXSk7CiAgICAgICAgICoKICAgICAgICAgKiBjb25zb2xlLmxvZyh0aGlzLmFyci52YWx1ZSk7ICAvLyBbJ25hbWUnLCAnbGFzdCBuYW1lJ10KICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqICMjIyBSZXNldCB0aGUgdmFsdWVzIGluIGEgZm9ybSBhcnJheSBhbmQgdGhlIGRpc2FibGVkIHN0YXR1cyBmb3IgdGhlIGZpcnN0IGNvbnRyb2wKICAgICAgICAgKgogICAgICAgICAqIGBgYAogICAgICAgICAqIHRoaXMuYXJyLnJlc2V0KFsKICAgICAgICAgKiAgIHt2YWx1ZTogJ25hbWUnLCBkaXNhYmxlZDogdHJ1ZX0sCiAgICAgICAgICogICAnbGFzdCcKICAgICAgICAgKiBdKTsKICAgICAgICAgKgogICAgICAgICAqIGNvbnNvbGUubG9nKHRoaXMuYXJyLnZhbHVlKTsgIC8vIFsnbmFtZScsICdsYXN0IG5hbWUnXQogICAgICAgICAqIGNvbnNvbGUubG9nKHRoaXMuYXJyLmdldCgwKS5zdGF0dXMpOyAgLy8gJ0RJU0FCTEVEJwogICAgICAgICAqIGBgYAogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gdmFsdWUgQXJyYXkgb2YgdmFsdWVzIGZvciB0aGUgY29udHJvbHMKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyZSBvcHRpb25zIHRoYXQgZGV0ZXJtaW5lIGhvdyB0aGUgY29udHJvbCBwcm9wYWdhdGVzIGNoYW5nZXMgYW5kCiAgICAgICAgICogZW1pdHMgZXZlbnRzIGFmdGVyIHRoZSB2YWx1ZSBjaGFuZ2VzCiAgICAgICAgICoKICAgICAgICAgKiAqIGBvbmx5U2VsZmA6IFdoZW4gdHJ1ZSwgZWFjaCBjaGFuZ2Ugb25seSBhZmZlY3RzIHRoaXMgY29udHJvbCwgYW5kIG5vdCBpdHMgcGFyZW50LiBEZWZhdWx0CiAgICAgICAgICogaXMgZmFsc2UuCiAgICAgICAgICogKiBgZW1pdEV2ZW50YDogV2hlbiB0cnVlIG9yIG5vdCBzdXBwbGllZCAodGhlIGRlZmF1bHQpLCBib3RoIHRoZSBgc3RhdHVzQ2hhbmdlc2AgYW5kCiAgICAgICAgICogYHZhbHVlQ2hhbmdlc2AKICAgICAgICAgKiBvYnNlcnZhYmxlcyBlbWl0IGV2ZW50cyB3aXRoIHRoZSBsYXRlc3Qgc3RhdHVzIGFuZCB2YWx1ZSB3aGVuIHRoZSBjb250cm9sIGlzIHJlc2V0LgogICAgICAgICAqIFdoZW4gZmFsc2UsIG5vIGV2ZW50cyBhcmUgZW1pdHRlZC4KICAgICAgICAgKiBUaGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFyZSBwYXNzZWQgdG8gdGhlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI3VwZGF0ZVZhbHVlQW5kVmFsaWRpdHkKICAgICAgICAgKiB1cGRhdGVWYWx1ZUFuZFZhbGlkaXR5fSBtZXRob2QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldCh2YWx1ZSA9IFtdLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgdGhpcy5fZm9yRWFjaENoaWxkKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sLCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgY29udHJvbC5yZXNldCh2YWx1ZVtpbmRleF0sIHsgb25seVNlbGY6IHRydWUsIGVtaXRFdmVudDogb3B0aW9ucy5lbWl0RXZlbnQgfSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUHJpc3RpbmUob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRvdWNoZWQob3B0aW9ucyk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlVmFsdWVBbmRWYWxpZGl0eShvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIGFnZ3JlZ2F0ZSB2YWx1ZSBvZiB0aGUgYXJyYXksIGluY2x1ZGluZyBhbnkgZGlzYWJsZWQgY29udHJvbHMuCiAgICAgICAgICoKICAgICAgICAgKiBSZXBvcnRzIGFsbCB2YWx1ZXMgcmVnYXJkbGVzcyBvZiBkaXNhYmxlZCBzdGF0dXMuCiAgICAgICAgICogRm9yIGVuYWJsZWQgY29udHJvbHMgb25seSwgdGhlIGB2YWx1ZWAgcHJvcGVydHkgaXMgdGhlIGJlc3Qgd2F5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGFycmF5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UmF3VmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sIGluc3RhbmNlb2YgRm9ybUNvbnRyb2wgPyBjb250cm9sLnZhbHVlIDogKCgvKiogQHR5cGUgez99ICovIChjb250cm9sKSkpLmdldFJhd1ZhbHVlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlIGFsbCBjb250cm9scyBpbiB0aGUgYEZvcm1BcnJheWAuCiAgICAgICAgICoKICAgICAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAgICAgKiAjIyMgUmVtb3ZlIGFsbCBlbGVtZW50cyBmcm9tIGEgRm9ybUFycmF5CiAgICAgICAgICoKICAgICAgICAgKiBgYGB0cwogICAgICAgICAqIGNvbnN0IGFyciA9IG5ldyBGb3JtQXJyYXkoWwogICAgICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpLAogICAgICAgICAqICAgIG5ldyBGb3JtQ29udHJvbCgpCiAgICAgICAgICogXSk7CiAgICAgICAgICogY29uc29sZS5sb2coYXJyLmxlbmd0aCk7ICAvLyAyCiAgICAgICAgICoKICAgICAgICAgKiBhcnIuY2xlYXIoKTsKICAgICAgICAgKiBjb25zb2xlLmxvZyhhcnIubGVuZ3RoKTsgIC8vIDAKICAgICAgICAgKiBgYGAKICAgICAgICAgKgogICAgICAgICAqIEl0J3MgYSBzaW1wbGVyIGFuZCBtb3JlIGVmZmljaWVudCBhbHRlcm5hdGl2ZSB0byByZW1vdmluZyBhbGwgZWxlbWVudHMgb25lIGJ5IG9uZToKICAgICAgICAgKgogICAgICAgICAqIGBgYHRzCiAgICAgICAgICogY29uc3QgYXJyID0gbmV3IEZvcm1BcnJheShbCiAgICAgICAgICogICAgbmV3IEZvcm1Db250cm9sKCksCiAgICAgICAgICogICAgbmV3IEZvcm1Db250cm9sKCkKICAgICAgICAgKiBdKTsKICAgICAgICAgKgogICAgICAgICAqIHdoaWxlIChhcnIubGVuZ3RoKSB7CiAgICAgICAgICogICAgYXJyLnJlbW92ZUF0KDApOwogICAgICAgICAqIH0KICAgICAgICAgKiBgYGAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsZWFyKCkgewogICAgICAgICAgICBpZiAodGhpcy5jb250cm9scy5sZW5ndGggPCAxKQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb250cm9sKSA9PiBjb250cm9sLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pKSkpOwogICAgICAgICAgICB0aGlzLmNvbnRyb2xzLnNwbGljZSgwKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zeW5jUGVuZGluZ0NvbnRyb2xzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdWJ0cmVlVXBkYXRlZCA9IHRoaXMuY29udHJvbHMucmVkdWNlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVkCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpbGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh1cGRhdGVkLCBjaGlsZCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkLl9zeW5jUGVuZGluZ0NvbnRyb2xzKCkgPyB0cnVlIDogdXBkYXRlZDsKICAgICAgICAgICAgfSksIGZhbHNlKTsKICAgICAgICAgICAgaWYgKHN1YnRyZWVVcGRhdGVkKQogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgb25seVNlbGY6IHRydWUgfSk7CiAgICAgICAgICAgIHJldHVybiBzdWJ0cmVlVXBkYXRlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF90aHJvd0lmQ29udHJvbE1pc3NpbmcoaW5kZXgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRyb2xzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAKICAgICAgICBUaGVyZSBhcmUgbm8gZm9ybSBjb250cm9scyByZWdpc3RlcmVkIHdpdGggdGhpcyBhcnJheSB5ZXQuICBJZiB5b3UncmUgdXNpbmcgbmdNb2RlbCwKICAgICAgICB5b3UgbWF5IHdhbnQgdG8gY2hlY2sgbmV4dCB0aWNrIChlLmcuIHVzZSBzZXRUaW1lb3V0KS4KICAgICAgYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLmF0KGluZGV4KSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBmb3JtIGNvbnRyb2wgYXQgaW5kZXggJHtpbmRleH1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBjYgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2ZvckVhY2hDaGlsZChjYikgewogICAgICAgICAgICB0aGlzLmNvbnRyb2xzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wsIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgICBjYihjb250cm9sLCBpbmRleCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVZhbHVlKCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkudmFsdWUgPQogICAgICAgICAgICAgICAgdGhpcy5jb250cm9scy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY29udHJvbCkgPT4gY29udHJvbC5lbmFibGVkIHx8IHRoaXMuZGlzYWJsZWQpKQogICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY29udHJvbCkgPT4gY29udHJvbC52YWx1ZSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25kaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hbnlDb250cm9scyhjb25kaXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29udHJvbHMuc29tZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IGNvbnRyb2wuZW5hYmxlZCAmJiBjb25kaXRpb24oY29udHJvbCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFVwQ29udHJvbHMoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvckVhY2hDaGlsZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbnRyb2wpID0+IHRoaXMuX3JlZ2lzdGVyQ29udHJvbChjb250cm9sKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrQWxsVmFsdWVzUHJlc2VudCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9mb3JFYWNoQ2hpbGQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29udHJvbCwgaSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHZhbHVlW2ldID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE11c3Qgc3VwcGx5IGEgdmFsdWUgZm9yIGZvcm0gY29udHJvbCBhdCBpbmRleDogJHtpfS5gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWxsQ29udHJvbHNEaXNhYmxlZCgpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjb250cm9sIG9mIHRoaXMuY29udHJvbHMpIHsKICAgICAgICAgICAgICAgIGlmIChjb250cm9sLmVuYWJsZWQpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2xzLmxlbmd0aCA+IDAgfHwgdGhpcy5kaXNhYmxlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZWdpc3RlckNvbnRyb2woY29udHJvbCkgewogICAgICAgICAgICBjb250cm9sLnNldFBhcmVudCh0aGlzKTsKICAgICAgICAgICAgY29udHJvbC5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UodGhpcy5fb25Db2xsZWN0aW9uQ2hhbmdlKTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9uZ19mb3JtLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZvcm1EaXJlY3RpdmVQcm92aWRlciA9IHsKICAgICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IE5nRm9ybSkpCiAgICB9OwogICAgY29uc3QgybUwJGIgPSAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHJlc29sdmVkUHJvbWlzZSA9ICgoybUwJGIpKSgpOwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBDcmVhdGVzIGEgdG9wLWxldmVsIGBGb3JtR3JvdXBgIGluc3RhbmNlIGFuZCBiaW5kcyBpdCB0byBhIGZvcm0KICAgICAqIHRvIHRyYWNrIGFnZ3JlZ2F0ZSBmb3JtIHZhbHVlIGFuZCB2YWxpZGF0aW9uIHN0YXR1cy4KICAgICAqCiAgICAgKiBBcyBzb29uIGFzIHlvdSBpbXBvcnQgdGhlIGBGb3Jtc01vZHVsZWAsIHRoaXMgZGlyZWN0aXZlIGJlY29tZXMgYWN0aXZlIGJ5IGRlZmF1bHQgb24KICAgICAqIGFsbCBgPGZvcm0+YCB0YWdzLiAgWW91IGRvbid0IG5lZWQgdG8gYWRkIGEgc3BlY2lhbCBzZWxlY3Rvci4KICAgICAqCiAgICAgKiBZb3Ugb3B0aW9uYWxseSBleHBvcnQgdGhlIGRpcmVjdGl2ZSBpbnRvIGEgbG9jYWwgdGVtcGxhdGUgdmFyaWFibGUgdXNpbmcgYG5nRm9ybWAgYXMgdGhlIGtleQogICAgICogKGV4OiBgI215Rm9ybT0ibmdGb3JtImApLiBUaGlzIGlzIG9wdGlvbmFsLCBidXQgdXNlZnVsLiAgTWFueSBwcm9wZXJ0aWVzIGZyb20gdGhlIHVuZGVybHlpbmcKICAgICAqIGBGb3JtR3JvdXBgIGluc3RhbmNlIGFyZSBkdXBsaWNhdGVkIG9uIHRoZSBkaXJlY3RpdmUgaXRzZWxmLCBzbyBhIHJlZmVyZW5jZSB0byBpdAogICAgICogZ2l2ZXMgeW91IGFjY2VzcyB0byB0aGUgYWdncmVnYXRlIHZhbHVlIGFuZCB2YWxpZGl0eSBzdGF0dXMgb2YgdGhlIGZvcm0sIGFzIHdlbGwgYXMKICAgICAqIHVzZXIgaW50ZXJhY3Rpb24gcHJvcGVydGllcyBsaWtlIGBkaXJ0eWAgYW5kIGB0b3VjaGVkYC4KICAgICAqCiAgICAgKiBUbyByZWdpc3RlciBjaGlsZCBjb250cm9scyB3aXRoIHRoZSBmb3JtLCB1c2UgYE5nTW9kZWxgIHdpdGggYSBgbmFtZWAKICAgICAqIGF0dHJpYnV0ZS4gWW91IG1heSB1c2UgYE5nTW9kZWxHcm91cGAgdG8gY3JlYXRlIHN1Yi1ncm91cHMgd2l0aGluIHRoZSBmb3JtLgogICAgICoKICAgICAqIElmIG5lY2Vzc2FyeSwgbGlzdGVuIHRvIHRoZSBkaXJlY3RpdmUncyBgbmdTdWJtaXRgIGV2ZW50IHRvIGJlIG5vdGlmaWVkIHdoZW4gdGhlIHVzZXIgaGFzCiAgICAgKiB0cmlnZ2VyZWQgYSBmb3JtIHN1Ym1pc3Npb24uIFRoZSBgbmdTdWJtaXRgIGV2ZW50IGVtaXRzIHRoZSBvcmlnaW5hbCBmb3JtCiAgICAgKiBzdWJtaXNzaW9uIGV2ZW50LgogICAgICoKICAgICAqIEluIHRlbXBsYXRlIGRyaXZlbiBmb3JtcywgYWxsIGA8Zm9ybT5gIHRhZ3MgYXJlIGF1dG9tYXRpY2FsbHkgdGFnZ2VkIGFzIGBOZ0Zvcm1gLgogICAgICogVG8gaW1wb3J0IHRoZSBgRm9ybXNNb2R1bGVgIGJ1dCBza2lwIGl0cyB1c2FnZSBpbiBzb21lIGZvcm1zLAogICAgICogZm9yIGV4YW1wbGUsIHRvIHVzZSBuYXRpdmUgSFRNTDUgdmFsaWRhdGlvbiwgYWRkIHRoZSBgbmdOb0Zvcm1gIGFuZCB0aGUgYDxmb3JtPmAKICAgICAqIHRhZ3Mgd29uJ3QgY3JlYXRlIGFuIGBOZ0Zvcm1gIGRpcmVjdGl2ZS4gSW4gcmVhY3RpdmUgZm9ybXMsIHVzaW5nIGBuZ05vRm9ybWAgaXMKICAgICAqIHVubmVjZXNzYXJ5IGJlY2F1c2UgdGhlIGA8Zm9ybT5gIHRhZ3MgYXJlIGluZXJ0LiBJbiB0aGF0IGNhc2UsIHlvdSB3b3VsZAogICAgICogcmVmcmFpbiBmcm9tIHVzaW5nIHRoZSBgZm9ybUdyb3VwYCBkaXJlY3RpdmUuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIExpc3RlbmluZyBmb3IgZm9ybSBzdWJtaXNzaW9uCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byBjYXB0dXJlIHRoZSBmb3JtIHZhbHVlcyBmcm9tIHRoZSAibmdTdWJtaXQiIGV2ZW50LgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvc2ltcGxlRm9ybS9zaW1wbGVfZm9ybV9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICAgICAqCiAgICAgKiAjIyMgU2V0dGluZyB0aGUgdXBkYXRlIG9wdGlvbnMKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byBjaGFuZ2UgdGhlICJ1cGRhdGVPbiIgb3B0aW9uIGZyb20gaXRzIGRlZmF1bHQgdXNpbmcKICAgICAqIG5nRm9ybU9wdGlvbnMuCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGZvcm0gW25nRm9ybU9wdGlvbnNdPSJ7dXBkYXRlT246ICdibHVyJ30iPgogICAgICogICAgPGlucHV0IG5hbWU9Im9uZSIgbmdNb2RlbD4gIDwhLS0gdGhpcyBuZ01vZGVsIHdpbGwgdXBkYXRlIG9uIGJsdXIgLS0+CiAgICAgKiA8L2Zvcm0+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgTmF0aXZlIERPTSB2YWxpZGF0aW9uIFVJCiAgICAgKgogICAgICogSW4gb3JkZXIgdG8gcHJldmVudCB0aGUgbmF0aXZlIERPTSBmb3JtIHZhbGlkYXRpb24gVUkgZnJvbSBpbnRlcmZlcmluZyB3aXRoIEFuZ3VsYXIncyBmb3JtCiAgICAgKiB2YWxpZGF0aW9uLCBBbmd1bGFyIGF1dG9tYXRpY2FsbHkgYWRkcyB0aGUgYG5vdmFsaWRhdGVgIGF0dHJpYnV0ZSBvbiBhbnkgYDxmb3JtPmAgd2hlbmV2ZXIKICAgICAqIGBGb3JtTW9kdWxlYCBvciBgUmVhY3RpdmVGb3JtTW9kdWxlYCBhcmUgaW1wb3J0ZWQgaW50byB0aGUgYXBwbGljYXRpb24uCiAgICAgKiBJZiB5b3Ugd2FudCB0byBleHBsaWNpdGx5IGVuYWJsZSBuYXRpdmUgRE9NIHZhbGlkYXRpb24gVUkgd2l0aCBBbmd1bGFyIGZvcm1zLCB5b3UgY2FuIGFkZCB0aGUKICAgICAqIGBuZ05hdGl2ZVZhbGlkYXRlYCBhdHRyaWJ1dGUgdG8gdGhlIGA8Zm9ybT5gIGVsZW1lbnQ6CiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGZvcm0gbmdOYXRpdmVWYWxpZGF0ZT4KICAgICAqICAgLi4uCiAgICAgKiA8L2Zvcm0+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBOZ0Zvcm0gZXh0ZW5kcyBDb250cm9sQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jVmFsaWRhdG9ycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhlIGZvcm0gc3VibWlzc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVzID0gW107CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZXIgZm9yIHRoZSAibmdTdWJtaXQiIGV2ZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm5nU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmZvcm0gPQogICAgICAgICAgICAgICAgbmV3IEZvcm1Hcm91cCh7fSwgY29tcG9zZVZhbGlkYXRvcnModmFsaWRhdG9ycyksIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnMoYXN5bmNWYWxpZGF0b3JzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBhZnRlciB0aGUgdmlldyBpcyBpbml0aWFsaXplZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgICAgICB0aGlzLl9zZXRVcGRhdGVTdHJhdGVneSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSBpbnRlcm5hbCBgRm9ybUdyb3VwYCBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250cm9sKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSByZXByZXNlbnRpbmcgdGhlIHBhdGggdG8gdGhpcyBncm91cC4gQmVjYXVzZSB0aGlzIGRpcmVjdGl2ZQogICAgICAgICAqIGFsd2F5cyBsaXZlcyBhdCB0aGUgdG9wIGxldmVsIG9mIGEgZm9ybSwgaXQgaXMgYWx3YXlzIGFuIGVtcHR5IGFycmF5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBhdGgoKSB7CiAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJldHVybnMgYSBtYXAgb2YgdGhlIGNvbnRyb2xzIGluIHRoaXMgZ3JvdXAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY29udHJvbHMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm0uY29udHJvbHM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBNZXRob2QgdGhhdCBzZXRzIHVwIHRoZSBjb250cm9sIGRpcmVjdGl2ZSBpbiB0aGlzIGdyb3VwLCByZS1jYWxjdWxhdGVzIGl0cyB2YWx1ZQogICAgICAgICAqIGFuZCB2YWxpZGl0eSwgYW5kIGFkZHMgdGhlIGluc3RhbmNlIHRvIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGRpcmVjdGl2ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYE5nTW9kZWxgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZENvbnRyb2woZGlyKSB7CiAgICAgICAgICAgIHJlc29sdmVkUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2ZpbmRDb250YWluZXIoZGlyLnBhdGgpOwogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChkaXIpKSkuY29udHJvbCA9CiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGNvbnRhaW5lci5yZWdpc3RlckNvbnRyb2woZGlyLm5hbWUsIGRpci5jb250cm9sKSkpOwogICAgICAgICAgICAgICAgc2V0VXBDb250cm9sKGRpci5jb250cm9sLCBkaXIpOwogICAgICAgICAgICAgICAgZGlyLmNvbnRyb2wudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXJlY3RpdmVzLnB1c2goZGlyKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0cmlldmVzIHRoZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlIGZyb20gdGhlIHByb3ZpZGVkIGBOZ01vZGVsYCBkaXJlY3RpdmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYE5nTW9kZWxgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldENvbnRyb2woZGlyKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtLmdldChkaXIucGF0aCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlbW92ZXMgdGhlIGBOZ01vZGVsYCBpbnN0YW5jZSBmcm9tIHRoZSBpbnRlcm5hbCBsaXN0IG9mIGRpcmVjdGl2ZXMKICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgTmdNb2RlbGAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlQ29udHJvbChkaXIpIHsKICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNvbnRyb2woZGlyLm5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmVtb3ZlRGlyKHRoaXMuX2RpcmVjdGl2ZXMsIGRpcik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIEFkZHMgYSBuZXcgYE5nTW9kZWxHcm91cGAgZGlyZWN0aXZlIGluc3RhbmNlIHRvIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZEZvcm1Hcm91cChkaXIpIHsKICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBncm91cCA9IG5ldyBGb3JtR3JvdXAoe30pOwogICAgICAgICAgICAgICAgc2V0VXBGb3JtQ29udGFpbmVyKGdyb3VwLCBkaXIpOwogICAgICAgICAgICAgICAgY29udGFpbmVyLnJlZ2lzdGVyQ29udHJvbChkaXIubmFtZSwgZ3JvdXApOwogICAgICAgICAgICAgICAgZ3JvdXAudXBkYXRlVmFsdWVBbmRWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlbW92ZXMgdGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZSBmcm9tIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZUZvcm1Hcm91cChkaXIpIHsKICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gdGhpcy5fZmluZENvbnRhaW5lcihkaXIucGF0aCk7CiAgICAgICAgICAgICAgICBpZiAoY29udGFpbmVyKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLnJlbW92ZUNvbnRyb2woZGlyLm5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGBGb3JtR3JvdXBgIGZvciBhIHByb3ZpZGVkIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBOZ01vZGVsR3JvdXBgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEZvcm1Hcm91cChkaXIpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSBwcm92aWRlZCBgTmdDb250cm9sYCBkaXJlY3RpdmUuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYE5nQ29udHJvbGAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG5ldyB2YWx1ZSBmb3IgdGhlIGRpcmVjdGl2ZSdzIGNvbnRyb2wuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVNb2RlbChkaXIsIHZhbHVlKSB7CiAgICAgICAgICAgIHJlc29sdmVkUHJvbWlzZS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGN0cmwgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtLmdldCgoLyoqIEB0eXBlIHs/fSAqLyAoZGlyLnBhdGgpKSkpKTsKICAgICAgICAgICAgICAgIGN0cmwuc2V0VmFsdWUodmFsdWUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBTZXRzIHRoZSB2YWx1ZSBmb3IgdGhpcyBgRm9ybUdyb3VwYC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIG5ldyB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0VmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5jb250cm9sLnNldFZhbHVlKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIE1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgInN1Ym1pdCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLgogICAgICAgICAqIFRyaWdnZXJzIHRoZSBgbmdTdWJtaXRgIGVtaXR0ZXIgdG8gZW1pdCB0aGUgInN1Ym1pdCIgZXZlbnQgYXMgaXRzIHBheWxvYWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99ICRldmVudCBUaGUgInN1Ym1pdCIgZXZlbnQgb2JqZWN0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblN1Ym1pdCgkZXZlbnQpIHsKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzKSkpLnN1Ym1pdHRlZCA9IHRydWU7CiAgICAgICAgICAgIHN5bmNQZW5kaW5nQ29udHJvbHModGhpcy5mb3JtLCB0aGlzLl9kaXJlY3RpdmVzKTsKICAgICAgICAgICAgdGhpcy5uZ1N1Ym1pdC5lbWl0KCRldmVudCk7CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIE1ldGhvZCBjYWxsZWQgd2hlbiB0aGUgInJlc2V0IiBldmVudCBpcyB0cmlnZ2VyZWQgb24gdGhlIGZvcm0uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblJlc2V0KCkgewogICAgICAgICAgICB0aGlzLnJlc2V0Rm9ybSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVzZXRzIHRoZSBmb3JtIHRvIGFuIGluaXRpYWwgdmFsdWUgYW5kIHJlc2V0cyBpdHMgc3VibWl0dGVkIHN0YXR1cy4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFRoZSBuZXcgdmFsdWUgZm9yIHRoZSBmb3JtLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzZXRGb3JtKHZhbHVlID0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHRoaXMuZm9ybS5yZXNldCh2YWx1ZSk7CiAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpKS5zdWJtaXR0ZWQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRVcGRhdGVTdHJhdGVneSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMudXBkYXRlT24gIT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtLl91cGRhdGVPbiA9IHRoaXMub3B0aW9ucy51cGRhdGVPbjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmluZENvbnRhaW5lcihwYXRoKSB7CiAgICAgICAgICAgIHBhdGgucG9wKCk7CiAgICAgICAgICAgIHJldHVybiBwYXRoLmxlbmd0aCA/ICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uZ2V0KHBhdGgpKSkgOiB0aGlzLmZvcm07CiAgICAgICAgfQogICAgfQogICAgTmdGb3JtLsm1ZmFjID0gZnVuY3Rpb24gTmdGb3JtX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5nRm9ybSkoybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApKTsgfTsKICAgIE5nRm9ybS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBOZ0Zvcm0sIHNlbGVjdG9yczogW1siZm9ybSIsIDMsICJuZ05vRm9ybSIsICIiLCAzLCAiZm9ybUdyb3VwIiwgIiJdLCBbIm5nLWZvcm0iXSwgWyIiLCAibmdGb3JtIiwgIiJdXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBOZ0Zvcm1fSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoInN1Ym1pdCIsIGZ1bmN0aW9uIE5nRm9ybV9zdWJtaXRfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uU3VibWl0KCRldmVudCk7IH0pKCJyZXNldCIsIGZ1bmN0aW9uIE5nRm9ybV9yZXNldF9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25SZXNldCgpOyB9KTsKICAgICAgICB9IH0sIGlucHV0czogeyBvcHRpb25zOiBbIm5nRm9ybU9wdGlvbnMiLCAib3B0aW9ucyJdIH0sIG91dHB1dHM6IHsgbmdTdWJtaXQ6ICJuZ1N1Ym1pdCIgfSwgZXhwb3J0QXM6IFsibmdGb3JtIl0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW2Zvcm1EaXJlY3RpdmVQcm92aWRlcl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTmdGb3JtLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9CiAgICBdOwogICAgTmdGb3JtLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG9wdGlvbnM6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ25nRm9ybU9wdGlvbnMnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9hYnN0cmFjdF9mb3JtX2dyb3VwX2RpcmVjdGl2ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgYmFzZSBjbGFzcyBmb3IgY29kZSBzaGFyZWQgYmV0d2VlbiB0aGUgYE5nTW9kZWxHcm91cGAgYW5kIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmVzLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlIGV4dGVuZHMgQ29udHJvbENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIEFuIGludGVybmFsIGNhbGxiYWNrIG1ldGhvZCB0cmlnZ2VyZWQgb24gdGhlIGluc3RhbmNlIGFmdGVyIHRoZSBpbnB1dHMgYXJlIHNldC4KICAgICAgICAgKiBSZWdpc3RlcnMgdGhlIGdyb3VwIHdpdGggaXRzIHBhcmVudCBncm91cC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLl9jaGVja1BhcmVudFR5cGUoKTsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybURpcmVjdGl2ZSkpLmFkZEZvcm1Hcm91cCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIEFuIGludGVybmFsIGNhbGxiYWNrIG1ldGhvZCB0cmlnZ2VyZWQgYmVmb3JlIHRoZSBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuCiAgICAgICAgICogUmVtb3ZlcyB0aGUgZ3JvdXAgZnJvbSBpdHMgcGFyZW50IGdyb3VwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVGb3JtR3JvdXAodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSBgRm9ybUdyb3VwYCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250cm9sKCkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybURpcmVjdGl2ZSkpLmdldEZvcm1Hcm91cCh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSBwYXRoIHRvIHRoaXMgZ3JvdXAgZnJvbSB0aGUgdG9wLWxldmVsIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwYXRoKCkgewogICAgICAgICAgICByZXR1cm4gY29udHJvbFBhdGgodGhpcy5uYW1lID09IG51bGwgPyB0aGlzLm5hbWUgOiB0aGlzLm5hbWUudG9TdHJpbmcoKSwgdGhpcy5fcGFyZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSB0b3AtbGV2ZWwgZGlyZWN0aXZlIGZvciB0aGlzIGdyb3VwIGlmIHByZXNlbnQsIG90aGVyd2lzZSBudWxsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGZvcm1EaXJlY3RpdmUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyB0aGlzLl9wYXJlbnQuZm9ybURpcmVjdGl2ZSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycyByZWdpc3RlcmVkIHdpdGggdGhpcyBncm91cC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB2YWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl92YWxpZGF0b3JzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSBhc3luYyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGdyb3VwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGFzeW5jVmFsaWRhdG9yKCkgewogICAgICAgICAgICByZXR1cm4gY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9hc3luY1ZhbGlkYXRvcnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2hlY2tQYXJlbnRUeXBlKCkgeyB9CiAgICB9CiAgICBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZS7JtWZhYyA9IGZ1bmN0aW9uIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gybVBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZV9CYXNlRmFjdG9yeSh0IHx8IEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlKTsgfTsKICAgIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgY29uc3QgybVBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZV9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL3RlbXBsYXRlX2RyaXZlbl9lcnJvcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGVtcGxhdGVEcml2ZW5FcnJvcnMgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIG1vZGVsUGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYAogICAgICBuZ01vZGVsIGNhbm5vdCBiZSB1c2VkIHRvIHJlZ2lzdGVyIGZvcm0gY29udHJvbHMgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLiAgVHJ5IHVzaW5nCiAgICAgIGZvcm1Hcm91cCdzIHBhcnRuZXIgZGlyZWN0aXZlICJmb3JtQ29udHJvbE5hbWUiIGluc3RlYWQuICBFeGFtcGxlOgoKICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5mb3JtQ29udHJvbE5hbWV9CgogICAgICBPciwgaWYgeW91J2QgbGlrZSB0byBhdm9pZCByZWdpc3RlcmluZyB0aGlzIGZvcm0gY29udHJvbCwgaW5kaWNhdGUgdGhhdCBpdCdzIHN0YW5kYWxvbmUgaW4gbmdNb2RlbE9wdGlvbnM6CgogICAgICBFeGFtcGxlOgoKICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5uZ01vZGVsV2l0aEZvcm1Hcm91cH1gKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgZm9ybUdyb3VwTmFtZUV4Y2VwdGlvbigpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAKICAgICAgbmdNb2RlbCBjYW5ub3QgYmUgdXNlZCB0byByZWdpc3RlciBmb3JtIGNvbnRyb2xzIHdpdGggYSBwYXJlbnQgZm9ybUdyb3VwTmFtZSBvciBmb3JtQXJyYXlOYW1lIGRpcmVjdGl2ZS4KCiAgICAgIE9wdGlvbiAxOiBVc2UgZm9ybUNvbnRyb2xOYW1lIGluc3RlYWQgb2YgbmdNb2RlbCAocmVhY3RpdmUgc3RyYXRlZ3kpOgoKICAgICAgJHtGb3JtRXJyb3JFeGFtcGxlcy5mb3JtR3JvdXBOYW1lfQoKICAgICAgT3B0aW9uIDI6ICBVcGRhdGUgbmdNb2RlbCdzIHBhcmVudCBiZSBuZ01vZGVsR3JvdXAgKHRlbXBsYXRlLWRyaXZlbiBzdHJhdGVneSk6CgogICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLm5nTW9kZWxHcm91cH1gKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgbWlzc2luZ05hbWVFeGNlcHRpb24oKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWYgbmdNb2RlbCBpcyB1c2VkIHdpdGhpbiBhIGZvcm0gdGFnLCBlaXRoZXIgdGhlIG5hbWUgYXR0cmlidXRlIG11c3QgYmUgc2V0IG9yIHRoZSBmb3JtCiAgICAgIGNvbnRyb2wgbXVzdCBiZSBkZWZpbmVkIGFzICdzdGFuZGFsb25lJyBpbiBuZ01vZGVsT3B0aW9ucy4KCiAgICAgIEV4YW1wbGUgMTogPGlucHV0IFsobmdNb2RlbCldPSJwZXJzb24uZmlyc3ROYW1lIiBuYW1lPSJmaXJzdCI+CiAgICAgIEV4YW1wbGUgMjogPGlucHV0IFsobmdNb2RlbCldPSJwZXJzb24uZmlyc3ROYW1lIiBbbmdNb2RlbE9wdGlvbnNdPSJ7c3RhbmRhbG9uZTogdHJ1ZX0iPmApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyBtb2RlbEdyb3VwUGFyZW50RXhjZXB0aW9uKCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYAogICAgICBuZ01vZGVsR3JvdXAgY2Fubm90IGJlIHVzZWQgd2l0aCBhIHBhcmVudCBmb3JtR3JvdXAgZGlyZWN0aXZlLgoKICAgICAgT3B0aW9uIDE6IFVzZSBmb3JtR3JvdXBOYW1lIGluc3RlYWQgb2YgbmdNb2RlbEdyb3VwIChyZWFjdGl2ZSBzdHJhdGVneSk6CgogICAgICAke0Zvcm1FcnJvckV4YW1wbGVzLmZvcm1Hcm91cE5hbWV9CgogICAgICBPcHRpb24gMjogIFVzZSBhIHJlZ3VsYXIgZm9ybSB0YWcgaW5zdGVhZCBvZiB0aGUgZm9ybUdyb3VwIGRpcmVjdGl2ZSAodGVtcGxhdGUtZHJpdmVuIHN0cmF0ZWd5KToKCiAgICAgICR7Rm9ybUVycm9yRXhhbXBsZXMubmdNb2RlbEdyb3VwfWApOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL25nX21vZGVsX2dyb3VwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IG1vZGVsR3JvdXBQcm92aWRlciA9IHsKICAgICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IE5nTW9kZWxHcm91cCkpCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBDcmVhdGVzIGFuZCBiaW5kcyBhIGBGb3JtR3JvdXBgIGluc3RhbmNlIHRvIGEgRE9NIGVsZW1lbnQuCiAgICAgKgogICAgICogVGhpcyBkaXJlY3RpdmUgY2FuIG9ubHkgYmUgdXNlZCBhcyBhIGNoaWxkIG9mIGBOZ0Zvcm1gICh3aXRoaW4gYDxmb3JtPmAgdGFncykuCiAgICAgKgogICAgICogVXNlIHRoaXMgZGlyZWN0aXZlIHRvIHZhbGlkYXRlIGEgc3ViLWdyb3VwIG9mIHlvdXIgZm9ybSBzZXBhcmF0ZWx5IGZyb20gdGhlCiAgICAgKiByZXN0IG9mIHlvdXIgZm9ybSwgb3IgaWYgc29tZSB2YWx1ZXMgaW4geW91ciBkb21haW4gbW9kZWwgbWFrZSBtb3JlIHNlbnNlCiAgICAgKiB0byBjb25zdW1lIHRvZ2V0aGVyIGluIGEgbmVzdGVkIG9iamVjdC4KICAgICAqCiAgICAgKiBQcm92aWRlIGEgbmFtZSBmb3IgdGhlIHN1Yi1ncm91cCBhbmQgaXQgd2lsbCBiZWNvbWUgdGhlIGtleQogICAgICogZm9yIHRoZSBzdWItZ3JvdXAgaW4gdGhlIGZvcm0ncyBmdWxsIHZhbHVlLiBJZiB5b3UgbmVlZCBkaXJlY3QgYWNjZXNzLCBleHBvcnQgdGhlIGRpcmVjdGl2ZSBpbnRvCiAgICAgKiBhIGxvY2FsIHRlbXBsYXRlIHZhcmlhYmxlIHVzaW5nIGBuZ01vZGVsR3JvdXBgIChleDogYCNteUdyb3VwPSJuZ01vZGVsR3JvdXAiYCkuCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIENvbnN1bWluZyBjb250cm9scyBpbiBhIGdyb3VwaW5nCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHlvdSBob3cgdG8gY29tYmluZSBjb250cm9scyB0b2dldGhlciBpbiBhIHN1Yi1ncm91cAogICAgICogb2YgdGhlIGZvcm0uCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBmb3Jtcy90cy9uZ01vZGVsR3JvdXAvbmdfbW9kZWxfZ3JvdXBfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAgICAgKgogICAgICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTmdNb2RlbEdyb3VwIGV4dGVuZHMgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWxpZGF0b3JzCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3luY1ZhbGlkYXRvcnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzOwogICAgICAgICAgICB0aGlzLl9hc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja1BhcmVudFR5cGUoKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIE5nTW9kZWxHcm91cCkgJiYgISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBOZ0Zvcm0pKSB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5tb2RlbEdyb3VwUGFyZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBOZ01vZGVsR3JvdXAuybVmYWMgPSBmdW5jdGlvbiBOZ01vZGVsR3JvdXBfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTmdNb2RlbEdyb3VwKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbnRyb2xDb250YWluZXIsIDUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX1ZBTElEQVRPUlMsIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19BU1lOQ19WQUxJREFUT1JTLCAxMCkpOyB9OwogICAgTmdNb2RlbEdyb3VwLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nTW9kZWxHcm91cCwgc2VsZWN0b3JzOiBbWyIiLCAibmdNb2RlbEdyb3VwIiwgIiJdXSwgaW5wdXRzOiB7IG5hbWU6IFsibmdNb2RlbEdyb3VwIiwgIm5hbWUiXSB9LCBleHBvcnRBczogWyJuZ01vZGVsR3JvdXAiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbbW9kZWxHcm91cFByb3ZpZGVyXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ01vZGVsR3JvdXAuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb250cm9sQ29udGFpbmVyLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBIb3N0IH0sIHsgdHlwZTogU2tpcFNlbGYgfV0gfSwKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxJREFUT1JTLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19BU1lOQ19WQUxJREFUT1JTLF0gfV0gfQogICAgXTsKICAgIE5nTW9kZWxHcm91cC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduZ01vZGVsR3JvdXAnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9uZ19tb2RlbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb3JtQ29udHJvbEJpbmRpbmcgPSB7CiAgICAgICAgcHJvdmlkZTogTmdDb250cm9sLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IE5nTW9kZWwpKQogICAgfTsKICAgIGNvbnN0IMm1MCQxJDQgPSAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgICgpID0+IFByb21pc2UucmVzb2x2ZShudWxsKTsKICAgIC8qKgogICAgICogYG5nTW9kZWxgIGZvcmNlcyBhbiBhZGRpdGlvbmFsIGNoYW5nZSBkZXRlY3Rpb24gcnVuIHdoZW4gaXRzIGlucHV0cyBjaGFuZ2U6CiAgICAgKiBFLmcuOgogICAgICogYGBgCiAgICAgKiA8ZGl2Pnt7bXlNb2RlbC52YWxpZH19PC9kaXY+CiAgICAgKiA8aW5wdXQgWyhuZ01vZGVsKV09Im15VmFsdWUiICNteU1vZGVsPSJuZ01vZGVsIj4KICAgICAqIGBgYAogICAgICogSS5lLiBgbmdNb2RlbGAgY2FuIGV4cG9ydCBpdHNlbGYgb24gdGhlIGVsZW1lbnQgYW5kIHRoZW4gYmUgdXNlZCBpbiB0aGUgdGVtcGxhdGUuCiAgICAgKiBOb3JtYWxseSwgdGhpcyB3b3VsZCByZXN1bHQgaW4gZXhwcmVzc2lvbnMgYmVmb3JlIHRoZSBgaW5wdXRgIHRoYXQgdXNlIHRoZSBleHBvcnRlZCBkaXJlY3RpdmUKICAgICAqIHRvIGhhdmUgYW5kIG9sZCB2YWx1ZSBhcyB0aGV5IGhhdmUgYmVlbgogICAgICogZGlydHkgY2hlY2tlZCBiZWZvcmUuIEFzIHRoaXMgaXMgYSB2ZXJ5IGNvbW1vbiBjYXNlIGZvciBgbmdNb2RlbGAsIHdlIGFkZGVkIHRoaXMgc2Vjb25kIGNoYW5nZQogICAgICogZGV0ZWN0aW9uIHJ1bi4KICAgICAqCiAgICAgKiBOb3RlczoKICAgICAqIC0gdGhpcyBpcyBqdXN0IG9uZSBleHRyYSBydW4gbm8gbWF0dGVyIGhvdyBtYW55IGBuZ01vZGVsYCBoYXZlIGJlZW4gY2hhbmdlZC4KICAgICAqIC0gdGhpcyBpcyBhIGdlbmVyYWwgcHJvYmxlbSB3aGVuIHVzaW5nIGBleHBvcnRBc2AgZm9yIGRpcmVjdGl2ZXMhCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgcmVzb2x2ZWRQcm9taXNlJDEgPSAoKMm1MCQxJDQpKSgpOwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBDcmVhdGVzIGEgYEZvcm1Db250cm9sYCBpbnN0YW5jZSBmcm9tIGEgZG9tYWluIG1vZGVsIGFuZCBiaW5kcyBpdAogICAgICogdG8gYSBmb3JtIGNvbnRyb2wgZWxlbWVudC4KICAgICAqCiAgICAgKiBUaGUgYEZvcm1Db250cm9sYCBpbnN0YW5jZSB0cmFja3MgdGhlIHZhbHVlLCB1c2VyIGludGVyYWN0aW9uLCBhbmQKICAgICAqIHZhbGlkYXRpb24gc3RhdHVzIG9mIHRoZSBjb250cm9sIGFuZCBrZWVwcyB0aGUgdmlldyBzeW5jZWQgd2l0aCB0aGUgbW9kZWwuIElmIHVzZWQKICAgICAqIHdpdGhpbiBhIHBhcmVudCBmb3JtLCB0aGUgZGlyZWN0aXZlIGFsc28gcmVnaXN0ZXJzIGl0c2VsZiB3aXRoIHRoZSBmb3JtIGFzIGEgY2hpbGQKICAgICAqIGNvbnRyb2wuCiAgICAgKgogICAgICogVGhpcyBkaXJlY3RpdmUgaXMgdXNlZCBieSBpdHNlbGYgb3IgYXMgcGFydCBvZiBhIGxhcmdlciBmb3JtLiBVc2UgdGhlCiAgICAgKiBgbmdNb2RlbGAgc2VsZWN0b3IgdG8gYWN0aXZhdGUgaXQuCiAgICAgKgogICAgICogSXQgYWNjZXB0cyBhIGRvbWFpbiBtb2RlbCBhcyBhbiBvcHRpb25hbCBgSW5wdXRgLiBJZiB5b3UgaGF2ZSBhIG9uZS13YXkgYmluZGluZwogICAgICogdG8gYG5nTW9kZWxgIHdpdGggYFtdYCBzeW50YXgsIGNoYW5naW5nIHRoZSB2YWx1ZSBvZiB0aGUgZG9tYWluIG1vZGVsIGluIHRoZSBjb21wb25lbnQKICAgICAqIGNsYXNzIHNldHMgdGhlIHZhbHVlIGluIHRoZSB2aWV3LiBJZiB5b3UgaGF2ZSBhIHR3by13YXkgYmluZGluZyB3aXRoIGBbKCldYCBzeW50YXgKICAgICAqIChhbHNvIGtub3duIGFzICdiYW5hbmEtYm94IHN5bnRheCcpLCB0aGUgdmFsdWUgaW4gdGhlIFVJIGFsd2F5cyBzeW5jcyBiYWNrIHRvCiAgICAgKiB0aGUgZG9tYWluIG1vZGVsIGluIHlvdXIgY2xhc3MuCiAgICAgKgogICAgICogVG8gaW5zcGVjdCB0aGUgcHJvcGVydGllcyBvZiB0aGUgYXNzb2NpYXRlZCBgRm9ybUNvbnRyb2xgIChsaWtlIHZhbGlkaXR5IHN0YXRlKSwKICAgICAqIGV4cG9ydCB0aGUgZGlyZWN0aXZlIGludG8gYSBsb2NhbCB0ZW1wbGF0ZSB2YXJpYWJsZSB1c2luZyBgbmdNb2RlbGAgYXMgdGhlIGtleSAoZXg6CiAgICAgKiBgI215VmFyPSJuZ01vZGVsImApLiBZb3UgdGhlbiBhY2Nlc3MgdGhlIGNvbnRyb2wgdXNpbmcgdGhlIGRpcmVjdGl2ZSdzIGBjb250cm9sYCBwcm9wZXJ0eSwgYnV0CiAgICAgKiBtb3N0IHByb3BlcnRpZXMgdXNlZCAobGlrZSBgdmFsaWRgIGFuZCBgZGlydHlgKSBmYWxsIHRocm91Z2ggdG8gdGhlIGNvbnRyb2wgYW55d2F5IGZvciBkaXJlY3QKICAgICAqIGFjY2Vzcy4gU2VlIGEgZnVsbCBsaXN0IG9mIHByb3BlcnRpZXMgZGlyZWN0bHkgYXZhaWxhYmxlIGluIGBBYnN0cmFjdENvbnRyb2xEaXJlY3RpdmVgLgogICAgICoKICAgICAqIEBzZWUgYFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JgCiAgICAgKiBAc2VlIGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmAKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgVXNpbmcgbmdNb2RlbCBvbiBhIHN0YW5kYWxvbmUgY29udHJvbAogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZXMgc2hvdyBhIHNpbXBsZSBzdGFuZGFsb25lIGNvbnRyb2wgdXNpbmcgYG5nTW9kZWxgOgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvc2ltcGxlTmdNb2RlbC9zaW1wbGVfbmdfbW9kZWxfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAgICAgKgogICAgICogV2hlbiB1c2luZyB0aGUgYG5nTW9kZWxgIHdpdGhpbiBgPGZvcm0+YCB0YWdzLCB5b3UnbGwgYWxzbyBuZWVkIHRvIHN1cHBseSBhIGBuYW1lYCBhdHRyaWJ1dGUKICAgICAqIHNvIHRoYXQgdGhlIGNvbnRyb2wgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcGFyZW50IGZvcm0gdW5kZXIgdGhhdCBuYW1lLgogICAgICoKICAgICAqIEluIHRoZSBjb250ZXh0IG9mIGEgcGFyZW50IGZvcm0sIGl0J3Mgb2Z0ZW4gdW5uZWNlc3NhcnkgdG8gaW5jbHVkZSBvbmUtd2F5IG9yIHR3by13YXkgYmluZGluZywKICAgICAqIGFzIHRoZSBwYXJlbnQgZm9ybSBzeW5jcyB0aGUgdmFsdWUgZm9yIHlvdS4gWW91IGFjY2VzcyBpdHMgcHJvcGVydGllcyBieSBleHBvcnRpbmcgaXQgaW50byBhCiAgICAgKiBsb2NhbCB0ZW1wbGF0ZSB2YXJpYWJsZSB1c2luZyBgbmdGb3JtYCBzdWNoIGFzIChgI2Y9Im5nRm9ybSJgKS4gVXNlIHRoZSB2YXJpYWJsZSB3aGVyZQogICAgICogbmVlZGVkIG9uIGZvcm0gc3VibWlzc2lvbi4KICAgICAqCiAgICAgKiBJZiB5b3UgZG8gbmVlZCB0byBwb3B1bGF0ZSBpbml0aWFsIHZhbHVlcyBpbnRvIHlvdXIgZm9ybSwgdXNpbmcgYSBvbmUtd2F5IGJpbmRpbmcgZm9yCiAgICAgKiBgbmdNb2RlbGAgdGVuZHMgdG8gYmUgc3VmZmljaWVudCBhcyBsb25nIGFzIHlvdSB1c2UgdGhlIGV4cG9ydGVkIGZvcm0ncyB2YWx1ZSByYXRoZXIKICAgICAqIHRoYW4gdGhlIGRvbWFpbiBtb2RlbCdzIHZhbHVlIG9uIHN1Ym1pdC4KICAgICAqCiAgICAgKiAjIyMgVXNpbmcgbmdNb2RlbCB3aXRoaW4gYSBmb3JtCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGNvbnRyb2xzIHVzaW5nIGBuZ01vZGVsYCB3aXRoaW4gYSBmb3JtOgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvc2ltcGxlRm9ybS9zaW1wbGVfZm9ybV9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICAgICAqCiAgICAgKiAjIyMgVXNpbmcgYSBzdGFuZGFsb25lIG5nTW9kZWwgd2l0aGluIGEgZ3JvdXAKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgeW91IGhvdyB0byB1c2UgYSBzdGFuZGFsb25lIG5nTW9kZWwgY29udHJvbAogICAgICogd2l0aGluIGEgZm9ybS4gVGhpcyBjb250cm9scyB0aGUgZGlzcGxheSBvZiB0aGUgZm9ybSwgYnV0IGRvZXNuJ3QgY29udGFpbiBmb3JtIGRhdGEuCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGZvcm0+CiAgICAgKiAgIDxpbnB1dCBuYW1lPSJsb2dpbiIgbmdNb2RlbCBwbGFjZWhvbGRlcj0iTG9naW4iPgogICAgICogICA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5nTW9kZWwgW25nTW9kZWxPcHRpb25zXT0ie3N0YW5kYWxvbmU6IHRydWV9Ij4gU2hvdyBtb3JlIG9wdGlvbnM/CiAgICAgKiA8L2Zvcm0+CiAgICAgKiA8IS0tIGZvcm0gdmFsdWU6IHtsb2dpbjogJyd9IC0tPgogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIFNldHRpbmcgdGhlIG5nTW9kZWwgbmFtZSBhdHRyaWJ1dGUgdGhyb3VnaCBvcHRpb25zCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHlvdSBhbiBhbHRlcm5hdGUgd2F5IHRvIHNldCB0aGUgbmFtZSBhdHRyaWJ1dGUuIFRoZSBuYW1lIGF0dHJpYnV0ZSBpcwogICAgICogdXNlZCB3aXRoaW4gYSBjdXN0b20gZm9ybSBjb21wb25lbnQsIGFuZCB0aGUgbmFtZSBgXEBJbnB1dGAgcHJvcGVydHkgc2VydmVzIGEgZGlmZmVyZW50IHB1cnBvc2UuCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGZvcm0+CiAgICAgKiAgIDxteS1wZXJzb24tY29udHJvbCBuYW1lPSJOYW5jeSIgbmdNb2RlbCBbbmdNb2RlbE9wdGlvbnNdPSJ7bmFtZTogJ3VzZXInfSI+CiAgICAgKiAgIDwvbXktcGVyc29uLWNvbnRyb2w+CiAgICAgKiA8L2Zvcm0+CiAgICAgKiA8IS0tIGZvcm0gdmFsdWU6IHt1c2VyOiAnJ30gLS0+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBOZ01vZGVsIGV4dGVuZHMgTmdDb250cm9sIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICAgICAqIEBwYXJhbSB7P30gYXN5bmNWYWxpZGF0b3JzCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZUFjY2Vzc29ycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzLCB2YWx1ZUFjY2Vzc29ycykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLmNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3JlZ2lzdGVyZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlciBmb3IgcHJvZHVjaW5nIHRoZSBgbmdNb2RlbENoYW5nZWAgZXZlbnQgYWZ0ZXIKICAgICAgICAgICAgICogdGhlIHZpZXcgbW9kZWwgdXBkYXRlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudXBkYXRlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHRoaXMuX3Jhd1ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzIHx8IFtdOwogICAgICAgICAgICB0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnMgfHwgW107CiAgICAgICAgICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlCiAgICAgICAgICogb25seS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrRm9yRXJyb3JzKCk7CiAgICAgICAgICAgIGlmICghdGhpcy5fcmVnaXN0ZXJlZCkKICAgICAgICAgICAgICAgIHRoaXMuX3NldFVwQ29udHJvbCgpOwogICAgICAgICAgICBpZiAoJ2lzRGlzYWJsZWQnIGluIGNoYW5nZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpc2FibGVkKGNoYW5nZXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1Byb3BlcnR5VXBkYXRlZChjaGFuZ2VzLCB0aGlzLnZpZXdNb2RlbCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlKHRoaXMubW9kZWwpOwogICAgICAgICAgICAgICAgdGhpcy52aWV3TW9kZWwgPSB0aGlzLm1vZGVsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBMaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsCiAgICAgICAgICogdXNlIG9ubHkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5mb3JtRGlyZWN0aXZlICYmIHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVDb250cm9sKHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggZnJvbSB0aGUgdG9wLWxldmVsIGZvcm0gdG8gdGhpcyBjb250cm9sLgogICAgICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmVudCA/IGNvbnRyb2xQYXRoKHRoaXMubmFtZSwgdGhpcy5fcGFyZW50KSA6IFt0aGlzLm5hbWVdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVGhlIHRvcC1sZXZlbCBkaXJlY3RpdmUgZm9yIHRoaXMgY29udHJvbCBpZiBwcmVzZW50LCBvdGhlcndpc2UgbnVsbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmUgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogU3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycwogICAgICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB2YWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl9yYXdWYWxpZGF0b3JzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKICAgICAgICAgKiBkaXJlY3RpdmUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXN5bmNWYWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBTZXRzIHRoZSBuZXcgdmFsdWUgZm9yIHRoZSB2aWV3IG1vZGVsIGFuZCBlbWl0cyBhbiBgbmdNb2RlbENoYW5nZWAgZXZlbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlIFRoZSBuZXcgdmFsdWUgZW1pdHRlZCBieSBgbmdNb2RlbENoYW5nZWAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2aWV3VG9Nb2RlbFVwZGF0ZShuZXdWYWx1ZSkgewogICAgICAgICAgICB0aGlzLnZpZXdNb2RlbCA9IG5ld1ZhbHVlOwogICAgICAgICAgICB0aGlzLnVwZGF0ZS5lbWl0KG5ld1ZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRVcENvbnRyb2woKSB7CiAgICAgICAgICAgIHRoaXMuX3NldFVwZGF0ZVN0cmF0ZWd5KCk7CiAgICAgICAgICAgIHRoaXMuX2lzU3RhbmRhbG9uZSgpID8gdGhpcy5fc2V0VXBTdGFuZGFsb25lKCkgOiB0aGlzLmZvcm1EaXJlY3RpdmUuYWRkQ29udHJvbCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5fcmVnaXN0ZXJlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VXBkYXRlU3RyYXRlZ3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMgJiYgdGhpcy5vcHRpb25zLnVwZGF0ZU9uICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5fdXBkYXRlT24gPSB0aGlzLm9wdGlvbnMudXBkYXRlT247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1N0YW5kYWxvbmUoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5fcGFyZW50IHx8ICEhKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMuc3RhbmRhbG9uZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VXBTdGFuZGFsb25lKCkgewogICAgICAgICAgICBzZXRVcENvbnRyb2wodGhpcy5jb250cm9sLCB0aGlzKTsKICAgICAgICAgICAgdGhpcy5jb250cm9sLnVwZGF0ZVZhbHVlQW5kVmFsaWRpdHkoeyBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrRm9yRXJyb3JzKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2lzU3RhbmRhbG9uZSgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja1BhcmVudFR5cGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jaGVja05hbWUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja1BhcmVudFR5cGUoKSB7CiAgICAgICAgICAgIGlmICghKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIE5nTW9kZWxHcm91cCkgJiYKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEFic3RyYWN0Rm9ybUdyb3VwRGlyZWN0aXZlKSB7CiAgICAgICAgICAgICAgICBUZW1wbGF0ZURyaXZlbkVycm9ycy5mb3JtR3JvdXBOYW1lRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBOZ01vZGVsR3JvdXApICYmICEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgTmdGb3JtKSkgewogICAgICAgICAgICAgICAgVGVtcGxhdGVEcml2ZW5FcnJvcnMubW9kZWxQYXJlbnRFeGNlcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrTmFtZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucyAmJiB0aGlzLm9wdGlvbnMubmFtZSkKICAgICAgICAgICAgICAgIHRoaXMubmFtZSA9IHRoaXMub3B0aW9ucy5uYW1lOwogICAgICAgICAgICBpZiAoIXRoaXMuX2lzU3RhbmRhbG9uZSgpICYmICF0aGlzLm5hbWUpIHsKICAgICAgICAgICAgICAgIFRlbXBsYXRlRHJpdmVuRXJyb3JzLm1pc3NpbmdOYW1lRXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgcmVzb2x2ZWRQcm9taXNlJDEudGhlbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuc2V0VmFsdWUodmFsdWUsIHsgZW1pdFZpZXdUb01vZGVsQ2hhbmdlOiBmYWxzZSB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZURpc2FibGVkKGNoYW5nZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaXNhYmxlZFZhbHVlID0gY2hhbmdlc1snaXNEaXNhYmxlZCddLmN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0Rpc2FibGVkID0gZGlzYWJsZWRWYWx1ZSA9PT0gJycgfHwgKGRpc2FibGVkVmFsdWUgJiYgZGlzYWJsZWRWYWx1ZSAhPT0gJ2ZhbHNlJyk7CiAgICAgICAgICAgIHJlc29sdmVkUHJvbWlzZSQxLnRoZW4oKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKGlzRGlzYWJsZWQgJiYgIXRoaXMuY29udHJvbC5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY29udHJvbC5kaXNhYmxlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghaXNEaXNhYmxlZCAmJiB0aGlzLmNvbnRyb2wuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2wuZW5hYmxlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICBOZ01vZGVsLsm1ZmFjID0gZnVuY3Rpb24gTmdNb2RlbF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOZ01vZGVsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbnRyb2xDb250YWluZXIsIDkpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX1ZBTElEQVRPUlMsIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19BU1lOQ19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfVkFMVUVfQUNDRVNTT1IsIDEwKSk7IH07CiAgICBOZ01vZGVsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE5nTW9kZWwsIHNlbGVjdG9yczogW1siIiwgIm5nTW9kZWwiLCAiIiwgMywgImZvcm1Db250cm9sTmFtZSIsICIiLCAzLCAiZm9ybUNvbnRyb2wiLCAiIl1dLCBpbnB1dHM6IHsgbmFtZTogIm5hbWUiLCBpc0Rpc2FibGVkOiBbImRpc2FibGVkIiwgImlzRGlzYWJsZWQiXSwgbW9kZWw6IFsibmdNb2RlbCIsICJtb2RlbCJdLCBvcHRpb25zOiBbIm5nTW9kZWxPcHRpb25zIiwgIm9wdGlvbnMiXSB9LCBvdXRwdXRzOiB7IHVwZGF0ZTogIm5nTW9kZWxDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm5nTW9kZWwiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbZm9ybUNvbnRyb2xCaW5kaW5nXSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBOZ01vZGVsLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQ29udHJvbENvbnRhaW5lciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBIb3N0IH1dIH0sCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMSURBVE9SUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfQVNZTkNfVkFMSURBVE9SUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMVUVfQUNDRVNTT1IsXSB9XSB9CiAgICBdOwogICAgTmdNb2RlbC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpc0Rpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydkaXNhYmxlZCcsXSB9XSwKICAgICAgICBtb2RlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdNb2RlbCcsXSB9XSwKICAgICAgICBvcHRpb25zOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWyduZ01vZGVsT3B0aW9ucycsXSB9XSwKICAgICAgICB1cGRhdGU6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWyduZ01vZGVsQ2hhbmdlJyxdIH1dCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvbmdfbm9fdmFsaWRhdGVfZGlyZWN0aXZlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICoKICAgICAqIEFkZHMgYG5vdmFsaWRhdGVgIGF0dHJpYnV0ZSB0byBhbGwgZm9ybXMgYnkgZGVmYXVsdC4KICAgICAqCiAgICAgKiBgbm92YWxpZGF0ZWAgaXMgdXNlZCB0byBkaXNhYmxlIGJyb3dzZXIncyBuYXRpdmUgZm9ybSB2YWxpZGF0aW9uLgogICAgICoKICAgICAqIElmIHlvdSB3YW50IHRvIHVzZSBuYXRpdmUgdmFsaWRhdGlvbiB3aXRoIEFuZ3VsYXIgZm9ybXMsIGp1c3QgYWRkIGBuZ05hdGl2ZVZhbGlkYXRlYCBhdHRyaWJ1dGU6CiAgICAgKgogICAgICogYGBgCiAgICAgKiA8Zm9ybSBuZ05hdGl2ZVZhbGlkYXRlPjwvZm9ybT4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAbmdNb2R1bGUgRm9ybXNNb2R1bGUKICAgICAqLwogICAgY2xhc3MgybVOZ05vVmFsaWRhdGUgewogICAgfQogICAgybVOZ05vVmFsaWRhdGUuybVmYWMgPSBmdW5jdGlvbiDJtU5nTm9WYWxpZGF0ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCDJtU5nTm9WYWxpZGF0ZSkoKTsgfTsKICAgIMm1TmdOb1ZhbGlkYXRlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IMm1TmdOb1ZhbGlkYXRlLCBzZWxlY3RvcnM6IFtbImZvcm0iLCAzLCAibmdOb0Zvcm0iLCAiIiwgMywgIm5nTmF0aXZlVmFsaWRhdGUiLCAiIl1dLCBob3N0QXR0cnM6IFsibm92YWxpZGF0ZSIsICIiXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9kaXJlY3RpdmVzL3JlYWN0aXZlX2RpcmVjdGl2ZXMvZm9ybV9jb250cm9sX2RpcmVjdGl2ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRva2VuIHRvIHByb3ZpZGUgdG8gdHVybiBvZmYgdGhlIG5nTW9kZWwgd2FybmluZyBvbiBmb3JtQ29udHJvbCBhbmQgZm9ybUNvbnRyb2xOYW1lLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ05nTW9kZWxXaXRoRm9ybUNvbnRyb2xXYXJuaW5nJyk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb3JtQ29udHJvbEJpbmRpbmckMSA9IHsKICAgICAgICBwcm92aWRlOiBOZ0NvbnRyb2wsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gRm9ybUNvbnRyb2xEaXJlY3RpdmUpKQogICAgfTsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogU3luY2hyb25pemVzIGEgc3RhbmRhbG9uZSBgRm9ybUNvbnRyb2xgIGluc3RhbmNlIHRvIGEgZm9ybSBjb250cm9sIGVsZW1lbnQuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHN1cHBvcnQgZm9yIHVzaW5nIHRoZSBgbmdNb2RlbGAgaW5wdXQgcHJvcGVydHkgYW5kIGBuZ01vZGVsQ2hhbmdlYCBldmVudCB3aXRoIHJlYWN0aXZlCiAgICAgKiBmb3JtIGRpcmVjdGl2ZXMgd2FzIGRlcHJlY2F0ZWQgaW4gQW5ndWxhciB2NiBhbmQgaXMgc2NoZWR1bGVkIGZvciByZW1vdmFsIGluCiAgICAgKiBhIGZ1dHVyZSB2ZXJzaW9uIG9mIEFuZ3VsYXIuCiAgICAgKiBGb3IgZGV0YWlscywgc2VlIFtEZXByZWNhdGVkIGZlYXR1cmVzXShndWlkZS9kZXByZWNhdGlvbnMjbmdtb2RlbC13aXRoLXJlYWN0aXZlLWZvcm1zKS4KICAgICAqCiAgICAgKiBAc2VlIFtSZWFjdGl2ZSBGb3JtcyBHdWlkZV0oZ3VpZGUvcmVhY3RpdmUtZm9ybXMpCiAgICAgKiBAc2VlIGBGb3JtQ29udHJvbGAKICAgICAqIEBzZWUgYEFic3RyYWN0Q29udHJvbGAKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgc2hvd3MgaG93IHRvIHJlZ2lzdGVyIGEgc3RhbmRhbG9uZSBjb250cm9sIGFuZCBzZXQgaXRzIHZhbHVlLgogICAgICoKICAgICAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvc2ltcGxlRm9ybUNvbnRyb2wvc2ltcGxlX2Zvcm1fY29udHJvbF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEZvcm1Db250cm9sRGlyZWN0aXZlIGV4dGVuZHMgTmdDb250cm9sIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jVmFsaWRhdG9ycwogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVBY2Nlc3NvcnMKICAgICAgICAgKiBAcGFyYW0gez99IF9uZ01vZGVsV2FybmluZ0NvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycywgdmFsdWVBY2Nlc3NvcnMsIF9uZ01vZGVsV2FybmluZ0NvbmZpZykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9uZ01vZGVsV2FybmluZ0NvbmZpZyA9IF9uZ01vZGVsV2FybmluZ0NvbmZpZzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIGFzIG9mIHY2CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnVwZGF0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogSW5zdGFuY2UgcHJvcGVydHkgdXNlZCB0byB0cmFjayB3aGV0aGVyIGFuIG5nTW9kZWwgd2FybmluZyBoYXMgYmVlbiBzZW50IG91dCBmb3IgdGhpcwogICAgICAgICAgICAgKiBwYXJ0aWN1bGFyIGBGb3JtQ29udHJvbERpcmVjdGl2ZWAgaW5zdGFuY2UuIFVzZWQgdG8gc3VwcG9ydCB3YXJuaW5nIGNvbmZpZyBvZiAiYWx3YXlzIi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbmdNb2RlbFdhcm5pbmdTZW50ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3Jhd1ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzIHx8IFtdOwogICAgICAgICAgICB0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnMgfHwgW107CiAgICAgICAgICAgIHRoaXMudmFsdWVBY2Nlc3NvciA9IHNlbGVjdFZhbHVlQWNjZXNzb3IodGhpcywgdmFsdWVBY2Nlc3NvcnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVHJpZ2dlcnMgYSB3YXJuaW5nIHRoYXQgdGhpcyBpbnB1dCBzaG91bGQgbm90IGJlIHVzZWQgd2l0aCByZWFjdGl2ZSBmb3Jtcy4KICAgICAgICAgKiBAcGFyYW0gez99IGlzRGlzYWJsZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBpc0Rpc2FibGVkKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgUmVhY3RpdmVFcnJvcnMuZGlzYWJsZWRBdHRyV2FybmluZygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlCiAgICAgICAgICogb25seS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9pc0NvbnRyb2xDaGFuZ2VkKGNoYW5nZXMpKSB7CiAgICAgICAgICAgICAgICBzZXRVcENvbnRyb2wodGhpcy5mb3JtLCB0aGlzKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNvbnRyb2wuZGlzYWJsZWQgJiYgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMudmFsdWVBY2Nlc3NvcikpLnNldERpc2FibGVkU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMudmFsdWVBY2Nlc3NvcikpLnNldERpc2FibGVkU3RhdGUpKSh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZm9ybS51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaXNQcm9wZXJ0eVVwZGF0ZWQoY2hhbmdlcywgdGhpcy52aWV3TW9kZWwpKSB7CiAgICAgICAgICAgICAgICBfbmdNb2RlbFdhcm5pbmcoJ2Zvcm1Db250cm9sJywgRm9ybUNvbnRyb2xEaXJlY3RpdmUsIHRoaXMsIHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnKTsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybS5zZXRWYWx1ZSh0aGlzLm1vZGVsKTsKICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGVsID0gdGhpcy5tb2RlbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggZnJvbSB0aGUgdG9wLWxldmVsIGZvcm0gdG8gdGhpcyBjb250cm9sLgogICAgICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogU3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycwogICAgICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB2YWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl9yYXdWYWxpZGF0b3JzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKICAgICAgICAgKiBkaXJlY3RpdmUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXN5bmNWYWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wb3NlQXN5bmNWYWxpZGF0b3JzKHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgYEZvcm1Db250cm9sYCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250cm9sKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5mb3JtOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogU2V0cyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbCBhbmQgZW1pdHMgYW4gYG5nTW9kZWxDaGFuZ2VgIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMudmlld01vZGVsID0gbmV3VmFsdWU7CiAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQobmV3VmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2lzQ29udHJvbENoYW5nZWQoY2hhbmdlcykgewogICAgICAgICAgICByZXR1cm4gY2hhbmdlcy5oYXNPd25Qcm9wZXJ0eSgnZm9ybScpOwogICAgICAgIH0KICAgIH0KICAgIEZvcm1Db250cm9sRGlyZWN0aXZlLsm1ZmFjID0gZnVuY3Rpb24gRm9ybUNvbnRyb2xEaXJlY3RpdmVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRm9ybUNvbnRyb2xEaXJlY3RpdmUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMsIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxVRV9BQ0NFU1NPUiwgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcsIDgpKTsgfTsKICAgIEZvcm1Db250cm9sRGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEZvcm1Db250cm9sRGlyZWN0aXZlLCBzZWxlY3RvcnM6IFtbIiIsICJmb3JtQ29udHJvbCIsICIiXV0sIGlucHV0czogeyBpc0Rpc2FibGVkOiBbImRpc2FibGVkIiwgImlzRGlzYWJsZWQiXSwgZm9ybTogWyJmb3JtQ29udHJvbCIsICJmb3JtIl0sIG1vZGVsOiBbIm5nTW9kZWwiLCAibW9kZWwiXSB9LCBvdXRwdXRzOiB7IHVwZGF0ZTogIm5nTW9kZWxDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm5nRm9ybSJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtmb3JtQ29udHJvbEJpbmRpbmckMV0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogU3RhdGljIHByb3BlcnR5IHVzZWQgdG8gdHJhY2sgd2hldGhlciBhbnkgbmdNb2RlbCB3YXJuaW5ncyBoYXZlIGJlZW4gc2VudCBhY3Jvc3MKICAgICAqIGFsbCBpbnN0YW5jZXMgb2YgRm9ybUNvbnRyb2xEaXJlY3RpdmUuIFVzZWQgdG8gc3VwcG9ydCB3YXJuaW5nIGNvbmZpZyBvZiAib25jZSIuCiAgICAgKgogICAgICogXEBpbnRlcm5hbAogICAgICovCiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSA9IGZhbHNlOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxJREFUT1JTLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19BU1lOQ19WQUxJREFUT1JTLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19WQUxVRV9BQ0NFU1NPUixdIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfTU9ERUxfV0lUSF9GT1JNX0NPTlRST0xfV0FSTklORyxdIH1dIH0KICAgIF07CiAgICBGb3JtQ29udHJvbERpcmVjdGl2ZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBmb3JtOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydmb3JtQ29udHJvbCcsXSB9XSwKICAgICAgICBpc0Rpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydkaXNhYmxlZCcsXSB9XSwKICAgICAgICBtb2RlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbmdNb2RlbCcsXSB9XSwKICAgICAgICB1cGRhdGU6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWyduZ01vZGVsQ2hhbmdlJyxdIH1dCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmVhY3RpdmVfZGlyZWN0aXZlcy9mb3JtX2dyb3VwX2RpcmVjdGl2ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb3JtRGlyZWN0aXZlUHJvdmlkZXIkMSA9IHsKICAgICAgICBwcm92aWRlOiBDb250cm9sQ29udGFpbmVyLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IEZvcm1Hcm91cERpcmVjdGl2ZSkpCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogQmluZHMgYW4gZXhpc3RpbmcgYEZvcm1Hcm91cGAgdG8gYSBET00gZWxlbWVudC4KICAgICAqCiAgICAgKiBUaGlzIGRpcmVjdGl2ZSBhY2NlcHRzIGFuIGV4aXN0aW5nIGBGb3JtR3JvdXBgIGluc3RhbmNlLiBJdCB3aWxsIHRoZW4gdXNlIHRoaXMKICAgICAqIGBGb3JtR3JvdXBgIGluc3RhbmNlIHRvIG1hdGNoIGFueSBjaGlsZCBgRm9ybUNvbnRyb2xgLCBgRm9ybUdyb3VwYCwKICAgICAqIGFuZCBgRm9ybUFycmF5YCBpbnN0YW5jZXMgdG8gY2hpbGQgYEZvcm1Db250cm9sTmFtZWAsIGBGb3JtR3JvdXBOYW1lYCwKICAgICAqIGFuZCBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlcy4KICAgICAqCiAgICAgKiBAc2VlIFtSZWFjdGl2ZSBGb3JtcyBHdWlkZV0oZ3VpZGUvcmVhY3RpdmUtZm9ybXMpCiAgICAgKiBAc2VlIGBBYnN0cmFjdENvbnRyb2xgCiAgICAgKgogICAgICogIyMjIFJlZ2lzdGVyIEZvcm0gR3JvdXAKICAgICAqCiAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmVnaXN0ZXJzIGEgYEZvcm1Hcm91cGAgd2l0aCBmaXJzdCBuYW1lIGFuZCBsYXN0IG5hbWUgY29udHJvbHMsCiAgICAgKiBhbmQgbGlzdGVucyBmb3IgdGhlICpuZ1N1Ym1pdCogZXZlbnQgd2hlbiB0aGUgYnV0dG9uIGlzIGNsaWNrZWQuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtR3JvdXAvc2ltcGxlX2Zvcm1fZ3JvdXBfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBGb3JtR3JvdXBEaXJlY3RpdmUgZXh0ZW5kcyBDb250cm9sQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF92YWxpZGF0b3JzCiAgICAgICAgICogQHBhcmFtIHs/fSBfYXN5bmNWYWxpZGF0b3JzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3ZhbGlkYXRvcnMsIF9hc3luY1ZhbGlkYXRvcnMpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fdmFsaWRhdG9ycyA9IF92YWxpZGF0b3JzOwogICAgICAgICAgICB0aGlzLl9hc3luY1ZhbGlkYXRvcnMgPSBfYXN5bmNWYWxpZGF0b3JzOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBSZXBvcnRzIHdoZXRoZXIgdGhlIGZvcm0gc3VibWlzc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnN1Ym1pdHRlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAgICAgKiBUcmFja3MgdGhlIGxpc3Qgb2YgYWRkZWQgYEZvcm1Db250cm9sTmFtZWAgaW5zdGFuY2VzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZXMgPSBbXTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgICAgICogVHJhY2tzIHRoZSBgRm9ybUdyb3VwYCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZm9ybSA9ICgvKiogQHR5cGUgez99ICovIChudWxsKSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIEVtaXRzIGFuIGV2ZW50IHdoZW4gdGhlIGZvcm0gc3VibWlzc2lvbiBoYXMgYmVlbiB0cmlnZ2VyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm5nU3VibWl0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMgQSBvYmplY3Qgb2Yga2V5L3ZhbHVlIHBhaXJzIGZvciB0aGUgc2V0IG9mIGNoYW5nZWQgaW5wdXRzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICB0aGlzLl9jaGVja0Zvcm1QcmVzZW50KCk7CiAgICAgICAgICAgIGlmIChjaGFuZ2VzLmhhc093blByb3BlcnR5KCdmb3JtJykpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbGlkYXRvcnMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURvbVZhbHVlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVSZWdpc3RyYXRpb25zKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJldHVybnMgdGhpcyBkaXJlY3RpdmUncyBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJldHVybnMgdGhlIGBGb3JtR3JvdXBgIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNvbnRyb2woKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvcm07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHJlcHJlc2VudGluZyB0aGUgcGF0aCB0byB0aGlzIGdyb3VwLiBCZWNhdXNlIHRoaXMgZGlyZWN0aXZlCiAgICAgICAgICogYWx3YXlzIGxpdmVzIGF0IHRoZSB0b3AgbGV2ZWwgb2YgYSBmb3JtLCBpdCBhbHdheXMgYW4gZW1wdHkgYXJyYXkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogTWV0aG9kIHRoYXQgc2V0cyB1cCB0aGUgY29udHJvbCBkaXJlY3RpdmUgaW4gdGhpcyBncm91cCwgcmUtY2FsY3VsYXRlcyBpdHMgdmFsdWUKICAgICAgICAgKiBhbmQgdmFsaWRpdHksIGFuZCBhZGRzIHRoZSBpbnN0YW5jZSB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkaXJlY3RpdmVzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtQ29udHJvbE5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZENvbnRyb2woZGlyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpOwogICAgICAgICAgICBzZXRVcENvbnRyb2woY3RybCwgZGlyKTsKICAgICAgICAgICAgY3RybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLnB1c2goZGlyKTsKICAgICAgICAgICAgcmV0dXJuIGN0cmw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGBGb3JtQ29udHJvbGAgaW5zdGFuY2UgZnJvbSB0aGUgcHJvdmlkZWQgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29udHJvbChkaXIpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVtb3ZlcyB0aGUgYEZvcm1Db250cm9sTmFtZWAgaW5zdGFuY2UgZnJvbSB0aGUgaW50ZXJuYWwgbGlzdCBvZiBkaXJlY3RpdmVzCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGRpciBUaGUgYEZvcm1Db250cm9sTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlQ29udHJvbChkaXIpIHsKICAgICAgICAgICAgcmVtb3ZlRGlyKHRoaXMuZGlyZWN0aXZlcywgZGlyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIG5ldyBgRm9ybUdyb3VwTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlIHRvIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRGb3JtR3JvdXAoZGlyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpOwogICAgICAgICAgICBzZXRVcEZvcm1Db250YWluZXIoY3RybCwgZGlyKTsKICAgICAgICAgICAgY3RybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm8tb3AgbWV0aG9kIHRvIHJlbW92ZSB0aGUgZm9ybSBncm91cC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgRm9ybUdyb3VwTmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlRm9ybUdyb3VwKGRpcikgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgYEZvcm1Hcm91cGAgZm9yIGEgcHJvdmlkZWQgYEZvcm1Hcm91cE5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZQogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtR3JvdXBOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRGb3JtR3JvdXAoZGlyKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtLmdldChkaXIucGF0aCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIG5ldyBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlIHRvIHRoZSBmb3JtLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIgVGhlIGBGb3JtQXJyYXlOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRGb3JtQXJyYXkoZGlyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3RybCA9IHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpOwogICAgICAgICAgICBzZXRVcEZvcm1Db250YWluZXIoY3RybCwgZGlyKTsKICAgICAgICAgICAgY3RybC51cGRhdGVWYWx1ZUFuZFZhbGlkaXR5KHsgZW1pdEV2ZW50OiBmYWxzZSB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTm8tb3AgbWV0aG9kIHRvIHJlbW92ZSB0aGUgZm9ybSBhcnJheS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlRm9ybUFycmF5KGRpcikgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgYEZvcm1BcnJheWAgZm9yIGEgcHJvdmlkZWQgYEZvcm1BcnJheU5hbWVgIGRpcmVjdGl2ZSBpbnN0YW5jZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgRm9ybUFycmF5TmFtZWAgZGlyZWN0aXZlIGluc3RhbmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Rm9ybUFycmF5KGRpcikgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG5ldyB2YWx1ZSBmb3IgdGhlIHByb3ZpZGVkIGBGb3JtQ29udHJvbE5hbWVgIGRpcmVjdGl2ZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZGlyIFRoZSBgRm9ybUNvbnRyb2xOYW1lYCBkaXJlY3RpdmUgaW5zdGFuY2UuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgZGlyZWN0aXZlJ3MgY29udHJvbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZU1vZGVsKGRpciwgdmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjdHJsID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybS5nZXQoZGlyLnBhdGgpKSk7CiAgICAgICAgICAgIGN0cmwuc2V0VmFsdWUodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogTWV0aG9kIGNhbGxlZCB3aXRoIHRoZSAic3VibWl0IiBldmVudCBpcyB0cmlnZ2VyZWQgb24gdGhlIGZvcm0uCiAgICAgICAgICogVHJpZ2dlcnMgdGhlIGBuZ1N1Ym1pdGAgZW1pdHRlciB0byBlbWl0IHRoZSAic3VibWl0IiBldmVudCBhcyBpdHMgcGF5bG9hZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gJGV2ZW50IFRoZSAic3VibWl0IiBldmVudCBvYmplY3QKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU3VibWl0KCRldmVudCkgewogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3VibWl0dGVkID0gdHJ1ZTsKICAgICAgICAgICAgc3luY1BlbmRpbmdDb250cm9scyh0aGlzLmZvcm0sIHRoaXMuZGlyZWN0aXZlcyk7CiAgICAgICAgICAgIHRoaXMubmdTdWJtaXQuZW1pdCgkZXZlbnQpOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBNZXRob2QgY2FsbGVkIHdoZW4gdGhlICJyZXNldCIgZXZlbnQgaXMgdHJpZ2dlcmVkIG9uIHRoZSBmb3JtLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25SZXNldCgpIHsKICAgICAgICAgICAgdGhpcy5yZXNldEZvcm0oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFJlc2V0cyB0aGUgZm9ybSB0byBhbiBpbml0aWFsIHZhbHVlIGFuZCByZXNldHMgaXRzIHN1Ym1pdHRlZCBzdGF0dXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgZm9ybS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlc2V0Rm9ybSh2YWx1ZSA9IHVuZGVmaW5lZCkgewogICAgICAgICAgICB0aGlzLmZvcm0ucmVzZXQodmFsdWUpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuc3VibWl0dGVkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVEb21WYWx1ZSgpIHsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGlyID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5ld0N0cmwgPSB0aGlzLmZvcm0uZ2V0KGRpci5wYXRoKTsKICAgICAgICAgICAgICAgIGlmIChkaXIuY29udHJvbCAhPT0gbmV3Q3RybCkgewogICAgICAgICAgICAgICAgICAgIGNsZWFuVXBDb250cm9sKGRpci5jb250cm9sLCBkaXIpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdDdHJsKQogICAgICAgICAgICAgICAgICAgICAgICBzZXRVcENvbnRyb2wobmV3Q3RybCwgZGlyKTsKICAgICAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKGRpcikpKS5jb250cm9sID0gbmV3Q3RybDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLmZvcm0uX3VwZGF0ZVRyZWVWYWxpZGl0eSh7IGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlUmVnaXN0cmF0aW9ucygpIHsKICAgICAgICAgICAgdGhpcy5mb3JtLl9yZWdpc3Rlck9uQ29sbGVjdGlvbkNoYW5nZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl91cGRhdGVEb21WYWx1ZSgpKSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9vbGRGb3JtKQogICAgICAgICAgICAgICAgdGhpcy5fb2xkRm9ybS5fcmVnaXN0ZXJPbkNvbGxlY3Rpb25DaGFuZ2UoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4geyB9KSk7CiAgICAgICAgICAgIHRoaXMuX29sZEZvcm0gPSB0aGlzLmZvcm07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlVmFsaWRhdG9ycygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzeW5jID0gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7CiAgICAgICAgICAgIHRoaXMuZm9ybS52YWxpZGF0b3IgPSBWYWxpZGF0b3JzLmNvbXBvc2UoWygvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0udmFsaWRhdG9yKSksICgvKiogQHR5cGUgez99ICovIChzeW5jKSldKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhc3luYyA9IGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsKICAgICAgICAgICAgdGhpcy5mb3JtLmFzeW5jVmFsaWRhdG9yID0gVmFsaWRhdG9ycy5jb21wb3NlQXN5bmMoWygvKiogQHR5cGUgez99ICovICh0aGlzLmZvcm0uYXN5bmNWYWxpZGF0b3IpKSwgKC8qKiBAdHlwZSB7P30gKi8gKGFzeW5jKSldKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja0Zvcm1QcmVzZW50KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuZm9ybSkgewogICAgICAgICAgICAgICAgUmVhY3RpdmVFcnJvcnMubWlzc2luZ0Zvcm1FeGNlcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEZvcm1Hcm91cERpcmVjdGl2ZS7JtWZhYyA9IGZ1bmN0aW9uIEZvcm1Hcm91cERpcmVjdGl2ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb3JtR3JvdXBEaXJlY3RpdmUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMsIDEwKSk7IH07CiAgICBGb3JtR3JvdXBEaXJlY3RpdmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRm9ybUdyb3VwRGlyZWN0aXZlLCBzZWxlY3RvcnM6IFtbIiIsICJmb3JtR3JvdXAiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIEZvcm1Hcm91cERpcmVjdGl2ZV9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigic3VibWl0IiwgZnVuY3Rpb24gRm9ybUdyb3VwRGlyZWN0aXZlX3N1Ym1pdF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25TdWJtaXQoJGV2ZW50KTsgfSkoInJlc2V0IiwgZnVuY3Rpb24gRm9ybUdyb3VwRGlyZWN0aXZlX3Jlc2V0X0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5vblJlc2V0KCk7IH0pOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGZvcm06IFsiZm9ybUdyb3VwIiwgImZvcm0iXSB9LCBvdXRwdXRzOiB7IG5nU3VibWl0OiAibmdTdWJtaXQiIH0sIGV4cG9ydEFzOiBbIm5nRm9ybSJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtmb3JtRGlyZWN0aXZlUHJvdmlkZXIkMV0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRm9ybUdyb3VwRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9CiAgICBdOwogICAgRm9ybUdyb3VwRGlyZWN0aXZlLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGZvcm06IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Zvcm1Hcm91cCcsXSB9XSwKICAgICAgICBuZ1N1Ym1pdDogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL2RpcmVjdGl2ZXMvcmVhY3RpdmVfZGlyZWN0aXZlcy9mb3JtX2dyb3VwX25hbWUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZm9ybUdyb3VwTmFtZVByb3ZpZGVyID0gewogICAgICAgIHByb3ZpZGU6IENvbnRyb2xDb250YWluZXIsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gRm9ybUdyb3VwTmFtZSkpCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKgogICAgICogU3luY3MgYSBuZXN0ZWQgYEZvcm1Hcm91cGAgdG8gYSBET00gZWxlbWVudC4KICAgICAqCiAgICAgKiBUaGlzIGRpcmVjdGl2ZSBjYW4gb25seSBiZSB1c2VkIHdpdGggYSBwYXJlbnQgYEZvcm1Hcm91cERpcmVjdGl2ZWAuCiAgICAgKgogICAgICogSXQgYWNjZXB0cyB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIG5lc3RlZCBgRm9ybUdyb3VwYCB0byBsaW5rLCBhbmQKICAgICAqIGxvb2tzIGZvciBhIGBGb3JtR3JvdXBgIHJlZ2lzdGVyZWQgd2l0aCB0aGF0IG5hbWUgaW4gdGhlIHBhcmVudAogICAgICogYEZvcm1Hcm91cGAgaW5zdGFuY2UgeW91IHBhc3NlZCBpbnRvIGBGb3JtR3JvdXBEaXJlY3RpdmVgLgogICAgICoKICAgICAqIFVzZSBuZXN0ZWQgZm9ybSBncm91cHMgdG8gdmFsaWRhdGUgYSBzdWItZ3JvdXAgb2YgYQogICAgICogZm9ybSBzZXBhcmF0ZWx5IGZyb20gdGhlIHJlc3Qgb3IgdG8gZ3JvdXAgdGhlIHZhbHVlcyBvZiBjZXJ0YWluCiAgICAgKiBjb250cm9scyBpbnRvIHRoZWlyIG93biBuZXN0ZWQgb2JqZWN0LgogICAgICoKICAgICAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcykKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgQWNjZXNzIHRoZSBncm91cCBieSBuYW1lCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHVzZXMgdGhlIHtcQGxpbmsgQWJzdHJhY3RDb250cm9sI2dldCBnZXR9IG1ldGhvZCB0byBhY2Nlc3MgdGhlCiAgICAgKiBhc3NvY2lhdGVkIGBGb3JtR3JvdXBgCiAgICAgKgogICAgICogYGBgdHMKICAgICAqICAgdGhpcy5mb3JtLmdldCgnbmFtZScpOwogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIEFjY2VzcyBpbmRpdmlkdWFsIGNvbnRyb2xzIGluIHRoZSBncm91cAogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSB1c2VzIHRoZSB7XEBsaW5rIEFic3RyYWN0Q29udHJvbCNnZXQgZ2V0fSBtZXRob2QgdG8gYWNjZXNzCiAgICAgKiBpbmRpdmlkdWFsIGNvbnRyb2xzIHdpdGhpbiB0aGUgZ3JvdXAgdXNpbmcgZG90IHN5bnRheC4KICAgICAqCiAgICAgKiBgYGB0cwogICAgICogICB0aGlzLmZvcm0uZ2V0KCduYW1lLmZpcnN0Jyk7CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiAjIyMgUmVnaXN0ZXIgYSBuZXN0ZWQgYEZvcm1Hcm91cGAuCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHJlZ2lzdGVycyBhIG5lc3RlZCAqbmFtZSogYEZvcm1Hcm91cGAgd2l0aGluIGFuIGV4aXN0aW5nIGBGb3JtR3JvdXBgLAogICAgICogYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gcmV0cmlldmUgdGhlIG5lc3RlZCBgRm9ybUdyb3VwYCBhbmQgaW5kaXZpZHVhbCBjb250cm9scy4KICAgICAqCiAgICAgKiB7XEBleGFtcGxlIGZvcm1zL3RzL25lc3RlZEZvcm1Hcm91cC9uZXN0ZWRfZm9ybV9ncm91cF9leGFtcGxlLnRzIHJlZ2lvbj0nQ29tcG9uZW50J30KICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEZvcm1Hcm91cE5hbWUgZXh0ZW5kcyBBYnN0cmFjdEZvcm1Hcm91cERpcmVjdGl2ZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJlbnQKICAgICAgICAgKiBAcGFyYW0gez99IHZhbGlkYXRvcnMKICAgICAgICAgKiBAcGFyYW0gez99IGFzeW5jVmFsaWRhdG9ycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHBhcmVudCwgdmFsaWRhdG9ycywgYXN5bmNWYWxpZGF0b3JzKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgdGhpcy5fdmFsaWRhdG9ycyA9IHZhbGlkYXRvcnM7CiAgICAgICAgICAgIHRoaXMuX2FzeW5jVmFsaWRhdG9ycyA9IGFzeW5jVmFsaWRhdG9yczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrUGFyZW50VHlwZSgpIHsKICAgICAgICAgICAgaWYgKF9oYXNJbnZhbGlkUGFyZW50KHRoaXMuX3BhcmVudCkpIHsKICAgICAgICAgICAgICAgIFJlYWN0aXZlRXJyb3JzLmdyb3VwUGFyZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBGb3JtR3JvdXBOYW1lLsm1ZmFjID0gZnVuY3Rpb24gRm9ybUdyb3VwTmFtZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb3JtR3JvdXBOYW1lKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbnRyb2xDb250YWluZXIsIDEzKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxJREFUT1JTLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfQVNZTkNfVkFMSURBVE9SUywgMTApKTsgfTsKICAgIEZvcm1Hcm91cE5hbWUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRm9ybUdyb3VwTmFtZSwgc2VsZWN0b3JzOiBbWyIiLCAiZm9ybUdyb3VwTmFtZSIsICIiXV0sIGlucHV0czogeyBuYW1lOiBbImZvcm1Hcm91cE5hbWUiLCAibmFtZSJdIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW2Zvcm1Hcm91cE5hbWVQcm92aWRlcl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRm9ybUdyb3VwTmFtZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IENvbnRyb2xDb250YWluZXIsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSG9zdCB9LCB7IHR5cGU6IFNraXBTZWxmIH1dIH0sCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfVkFMSURBVE9SUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTkdfQVNZTkNfVkFMSURBVE9SUyxdIH1dIH0KICAgIF07CiAgICBGb3JtR3JvdXBOYW1lLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG5hbWU6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Zvcm1Hcm91cE5hbWUnLF0gfV0KICAgIH07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBmb3JtQXJyYXlOYW1lUHJvdmlkZXIgPSB7CiAgICAgICAgcHJvdmlkZTogQ29udHJvbENvbnRhaW5lciwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBGb3JtQXJyYXlOYW1lKSkKICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqCiAgICAgKiBTeW5jcyBhIG5lc3RlZCBgRm9ybUFycmF5YCB0byBhIERPTSBlbGVtZW50LgogICAgICoKICAgICAqIFRoaXMgZGlyZWN0aXZlIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgd2l0aCBhIHBhcmVudCBgRm9ybUdyb3VwRGlyZWN0aXZlYCAoc2VsZWN0b3I6CiAgICAgKiBgW2Zvcm1Hcm91cF1gKS4KICAgICAqCiAgICAgKiBJdCBhY2NlcHRzIHRoZSBzdHJpbmcgbmFtZSBvZiB0aGUgbmVzdGVkIGBGb3JtQXJyYXlgIHlvdSB3YW50IHRvIGxpbmssIGFuZAogICAgICogd2lsbCBsb29rIGZvciBhIGBGb3JtQXJyYXlgIHJlZ2lzdGVyZWQgd2l0aCB0aGF0IG5hbWUgaW4gdGhlIHBhcmVudAogICAgICogYEZvcm1Hcm91cGAgaW5zdGFuY2UgeW91IHBhc3NlZCBpbnRvIGBGb3JtR3JvdXBEaXJlY3RpdmVgLgogICAgICoKICAgICAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcykKICAgICAqIEBzZWUgYEFic3RyYWN0Q29udHJvbGAKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgRXhhbXBsZQogICAgICoKICAgICAqIHtcQGV4YW1wbGUgZm9ybXMvdHMvbmVzdGVkRm9ybUFycmF5L25lc3RlZF9mb3JtX2FycmF5X2V4YW1wbGUudHMgcmVnaW9uPSdDb21wb25lbnQnfQogICAgICoKICAgICAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgRm9ybUFycmF5TmFtZSBleHRlbmRzIENvbnRyb2xDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWxpZGF0b3JzCiAgICAgICAgICogQHBhcmFtIHs/fSBhc3luY1ZhbGlkYXRvcnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihwYXJlbnQsIHZhbGlkYXRvcnMsIGFzeW5jVmFsaWRhdG9ycykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9wYXJlbnQgPSBwYXJlbnQ7CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvcnMgPSB2YWxpZGF0b3JzOwogICAgICAgICAgICB0aGlzLl9hc3luY1ZhbGlkYXRvcnMgPSBhc3luY1ZhbGlkYXRvcnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBhcmUgaW5pdGlhbGl6ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAgICAgKgogICAgICAgICAqIEB0aHJvd3MgSWYgdGhlIGRpcmVjdGl2ZSBkb2VzIG5vdCBoYXZlIGEgdmFsaWQgcGFyZW50LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5mb3JtRGlyZWN0aXZlKSkuYWRkRm9ybUFycmF5KHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCBiZWZvcmUgdGhlIGRpcmVjdGl2ZSdzIGluc3RhbmNlIGlzIGRlc3Ryb3llZC4gRm9yIGludGVybmFsIHVzZSBvbmx5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmZvcm1EaXJlY3RpdmUpIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS5yZW1vdmVGb3JtQXJyYXkodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSBgRm9ybUFycmF5YCBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjb250cm9sKCkgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuZm9ybURpcmVjdGl2ZSkpLmdldEZvcm1BcnJheSh0aGlzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFRoZSB0b3AtbGV2ZWwgZGlyZWN0aXZlIGZvciB0aGlzIGdyb3VwIGlmIHByZXNlbnQsIG90aGVyd2lzZSBudWxsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGZvcm1EaXJlY3RpdmUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnQgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmUpKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZXR1cm5zIGFuIGFycmF5IHRoYXQgcmVwcmVzZW50cyB0aGUgcGF0aCBmcm9tIHRoZSB0b3AtbGV2ZWwgZm9ybSB0byB0aGlzIGNvbnRyb2wuCiAgICAgICAgICogRWFjaCBpbmRleCBpcyB0aGUgc3RyaW5nIG5hbWUgb2YgdGhlIGNvbnRyb2wgb24gdGhhdCBsZXZlbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwYXRoKCkgewogICAgICAgICAgICByZXR1cm4gY29udHJvbFBhdGgodGhpcy5uYW1lID09IG51bGwgPyB0aGlzLm5hbWUgOiB0aGlzLm5hbWUudG9TdHJpbmcoKSwgdGhpcy5fcGFyZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIFN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIHN5bmNocm9ub3VzIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKICAgICAgICAgKiBkaXJlY3RpdmUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmFsaWRhdG9yKCkgewogICAgICAgICAgICByZXR1cm4gY29tcG9zZVZhbGlkYXRvcnModGhpcy5fdmFsaWRhdG9ycyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBBc3luYyB2YWxpZGF0b3IgZnVuY3Rpb24gY29tcG9zZWQgb2YgYWxsIHRoZSBhc3luYyB2YWxpZGF0b3JzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBhc3luY1ZhbGlkYXRvcigpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbXBvc2VBc3luY1ZhbGlkYXRvcnModGhpcy5fYXN5bmNWYWxpZGF0b3JzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGVja1BhcmVudFR5cGUoKSB7CiAgICAgICAgICAgIGlmIChfaGFzSW52YWxpZFBhcmVudCh0aGlzLl9wYXJlbnQpKSB7CiAgICAgICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5hcnJheVBhcmVudEV4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgRm9ybUFycmF5TmFtZS7JtWZhYyA9IGZ1bmN0aW9uIEZvcm1BcnJheU5hbWVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRm9ybUFycmF5TmFtZSkoybXJtWRpcmVjdGl2ZUluamVjdChDb250cm9sQ29udGFpbmVyLCAxMyksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMsIDEwKSk7IH07CiAgICBGb3JtQXJyYXlOYW1lLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEZvcm1BcnJheU5hbWUsIHNlbGVjdG9yczogW1siIiwgImZvcm1BcnJheU5hbWUiLCAiIl1dLCBpbnB1dHM6IHsgbmFtZTogWyJmb3JtQXJyYXlOYW1lIiwgIm5hbWUiXSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtmb3JtQXJyYXlOYW1lUHJvdmlkZXJdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEZvcm1BcnJheU5hbWUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb250cm9sQ29udGFpbmVyLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9CiAgICBdOwogICAgRm9ybUFycmF5TmFtZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydmb3JtQXJyYXlOYW1lJyxdIH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gX2hhc0ludmFsaWRQYXJlbnQocGFyZW50KSB7CiAgICAgICAgcmV0dXJuICEocGFyZW50IGluc3RhbmNlb2YgRm9ybUdyb3VwTmFtZSkgJiYgIShwYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBEaXJlY3RpdmUpICYmCiAgICAgICAgICAgICEocGFyZW50IGluc3RhbmNlb2YgRm9ybUFycmF5TmFtZSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZGlyZWN0aXZlcy9yZWFjdGl2ZV9kaXJlY3RpdmVzL2Zvcm1fY29udHJvbF9uYW1lLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGNvbnRyb2xOYW1lQmluZGluZyA9IHsKICAgICAgICBwcm92aWRlOiBOZ0NvbnRyb2wsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gRm9ybUNvbnRyb2xOYW1lKSkKICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFN5bmNzIGEgYEZvcm1Db250cm9sYCBpbiBhbiBleGlzdGluZyBgRm9ybUdyb3VwYCB0byBhIGZvcm0gY29udHJvbAogICAgICogZWxlbWVudCBieSBuYW1lLgogICAgICoKICAgICAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXShndWlkZS9yZWFjdGl2ZS1mb3JtcykKICAgICAqIEBzZWUgYEZvcm1Db250cm9sYAogICAgICogQHNlZSBgQWJzdHJhY3RDb250cm9sYAogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBSZWdpc3RlciBgRm9ybUNvbnRyb2xgIHdpdGhpbiBhIGdyb3VwCiAgICAgKgogICAgICogVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIGhvdyB0byByZWdpc3RlciBtdWx0aXBsZSBmb3JtIGNvbnRyb2xzIHdpdGhpbiBhIGZvcm0gZ3JvdXAKICAgICAqIGFuZCBzZXQgdGhlaXIgdmFsdWUuCiAgICAgKgogICAgICoge1xAZXhhbXBsZSBmb3Jtcy90cy9zaW1wbGVGb3JtR3JvdXAvc2ltcGxlX2Zvcm1fZ3JvdXBfZXhhbXBsZS50cyByZWdpb249J0NvbXBvbmVudCd9CiAgICAgKgogICAgICogVG8gc2VlIGBmb3JtQ29udHJvbE5hbWVgIGV4YW1wbGVzIHdpdGggZGlmZmVyZW50IGZvcm0gY29udHJvbCB0eXBlcywgc2VlOgogICAgICoKICAgICAqICogUmFkaW8gYnV0dG9uczogYFJhZGlvQ29udHJvbFZhbHVlQWNjZXNzb3JgCiAgICAgKiAqIFNlbGVjdHM6IGBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvcmAKICAgICAqCiAgICAgKiAjIyMgVXNlIHdpdGggbmdNb2RlbCBpcyBkZXByZWNhdGVkCiAgICAgKgogICAgICogU3VwcG9ydCBmb3IgdXNpbmcgdGhlIGBuZ01vZGVsYCBpbnB1dCBwcm9wZXJ0eSBhbmQgYG5nTW9kZWxDaGFuZ2VgIGV2ZW50IHdpdGggcmVhY3RpdmUKICAgICAqIGZvcm0gZGlyZWN0aXZlcyBoYXMgYmVlbiBkZXByZWNhdGVkIGluIEFuZ3VsYXIgdjYgYW5kIGlzIHNjaGVkdWxlZCBmb3IgcmVtb3ZhbCBpbgogICAgICogYSBmdXR1cmUgdmVyc2lvbiBvZiBBbmd1bGFyLgogICAgICoKICAgICAqIEZvciBkZXRhaWxzLCBzZWUgW0RlcHJlY2F0ZWQgZmVhdHVyZXNdKGd1aWRlL2RlcHJlY2F0aW9ucyNuZ21vZGVsLXdpdGgtcmVhY3RpdmUtZm9ybXMpLgogICAgICoKICAgICAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgRm9ybUNvbnRyb2xOYW1lIGV4dGVuZHMgTmdDb250cm9sIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhcmVudAogICAgICAgICAqIEBwYXJhbSB7P30gdmFsaWRhdG9ycwogICAgICAgICAqIEBwYXJhbSB7P30gYXN5bmNWYWxpZGF0b3JzCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZUFjY2Vzc29ycwogICAgICAgICAqIEBwYXJhbSB7P30gX25nTW9kZWxXYXJuaW5nQ29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IocGFyZW50LCB2YWxpZGF0b3JzLCBhc3luY1ZhbGlkYXRvcnMsIHZhbHVlQWNjZXNzb3JzLCBfbmdNb2RlbFdhcm5pbmdDb25maWcpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fbmdNb2RlbFdhcm5pbmdDb25maWcgPSBfbmdNb2RlbFdhcm5pbmdDb25maWc7CiAgICAgICAgICAgIHRoaXMuX2FkZGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAZGVwcmVjYXRlZCBhcyBvZiB2NgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy51cGRhdGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICAgICAqIEluc3RhbmNlIHByb3BlcnR5IHVzZWQgdG8gdHJhY2sgd2hldGhlciBhbiBuZ01vZGVsIHdhcm5pbmcgaGFzIGJlZW4gc2VudCBvdXQgZm9yIHRoaXMKICAgICAgICAgICAgICogcGFydGljdWxhciBGb3JtQ29udHJvbE5hbWUgaW5zdGFuY2UuIFVzZWQgdG8gc3VwcG9ydCB3YXJuaW5nIGNvbmZpZyBvZiAiYWx3YXlzIi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogXEBpbnRlcm5hbAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbmdNb2RlbFdhcm5pbmdTZW50ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgICAgICAgdGhpcy5fcmF3VmFsaWRhdG9ycyA9IHZhbGlkYXRvcnMgfHwgW107CiAgICAgICAgICAgIHRoaXMuX3Jhd0FzeW5jVmFsaWRhdG9ycyA9IGFzeW5jVmFsaWRhdG9ycyB8fCBbXTsKICAgICAgICAgICAgdGhpcy52YWx1ZUFjY2Vzc29yID0gc2VsZWN0VmFsdWVBY2Nlc3Nvcih0aGlzLCB2YWx1ZUFjY2Vzc29ycyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUcmlnZ2VycyBhIHdhcm5pbmcgdGhhdCB0aGlzIGlucHV0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHJlYWN0aXZlIGZvcm1zLgogICAgICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGlzRGlzYWJsZWQoaXNEaXNhYmxlZCkgewogICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5kaXNhYmxlZEF0dHJXYXJuaW5nKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fYWRkZWQpCiAgICAgICAgICAgICAgICB0aGlzLl9zZXRVcENvbnRyb2woKTsKICAgICAgICAgICAgaWYgKGlzUHJvcGVydHlVcGRhdGVkKGNoYW5nZXMsIHRoaXMudmlld01vZGVsKSkgewogICAgICAgICAgICAgICAgX25nTW9kZWxXYXJuaW5nKCdmb3JtQ29udHJvbE5hbWUnLCBGb3JtQ29udHJvbE5hbWUsIHRoaXMsIHRoaXMuX25nTW9kZWxXYXJuaW5nQ29uZmlnKTsKICAgICAgICAgICAgICAgIHRoaXMudmlld01vZGVsID0gdGhpcy5tb2RlbDsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybURpcmVjdGl2ZS51cGRhdGVNb2RlbCh0aGlzLCB0aGlzLm1vZGVsKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogTGlmZWN5Y2xlIG1ldGhvZCBjYWxsZWQgYmVmb3JlIHRoZSBkaXJlY3RpdmUncyBpbnN0YW5jZSBpcyBkZXN0cm95ZWQuIEZvciBpbnRlcm5hbCB1c2Ugb25seS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5mb3JtRGlyZWN0aXZlKSB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm1EaXJlY3RpdmUucmVtb3ZlQ29udHJvbCh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogU2V0cyB0aGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbCBhbmQgZW1pdHMgYW4gYG5nTW9kZWxDaGFuZ2VgIGV2ZW50LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZSBUaGUgbmV3IHZhbHVlIGZvciB0aGUgdmlldyBtb2RlbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZpZXdUb01vZGVsVXBkYXRlKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMudmlld01vZGVsID0gbmV3VmFsdWU7CiAgICAgICAgICAgIHRoaXMudXBkYXRlLmVtaXQobmV3VmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmV0dXJucyBhbiBhcnJheSB0aGF0IHJlcHJlc2VudHMgdGhlIHBhdGggZnJvbSB0aGUgdG9wLWxldmVsIGZvcm0gdG8gdGhpcyBjb250cm9sLgogICAgICAgICAqIEVhY2ggaW5kZXggaXMgdGhlIHN0cmluZyBuYW1lIG9mIHRoZSBjb250cm9sIG9uIHRoYXQgbGV2ZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xQYXRoKHRoaXMubmFtZSA9PSBudWxsID8gdGhpcy5uYW1lIDogdGhpcy5uYW1lLnRvU3RyaW5nKCksICgvKiogQHR5cGUgez99ICovICh0aGlzLl9wYXJlbnQpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUaGUgdG9wLWxldmVsIGRpcmVjdGl2ZSBmb3IgdGhpcyBncm91cCBpZiBwcmVzZW50LCBvdGhlcndpc2UgbnVsbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb3JtRGlyZWN0aXZlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50ID8gdGhpcy5fcGFyZW50LmZvcm1EaXJlY3RpdmUgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogU3luY2hyb25vdXMgdmFsaWRhdG9yIGZ1bmN0aW9uIGNvbXBvc2VkIG9mIGFsbCB0aGUgc3luY2hyb25vdXMgdmFsaWRhdG9ycwogICAgICAgICAqIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB2YWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiBjb21wb3NlVmFsaWRhdG9ycyh0aGlzLl9yYXdWYWxpZGF0b3JzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIEFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbiBjb21wb3NlZCBvZiBhbGwgdGhlIGFzeW5jIHZhbGlkYXRvcnMgcmVnaXN0ZXJlZCB3aXRoIHRoaXMKICAgICAgICAgKiBkaXJlY3RpdmUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXN5bmNWYWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9zZUFzeW5jVmFsaWRhdG9ycyh0aGlzLl9yYXdBc3luY1ZhbGlkYXRvcnMpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2hlY2tQYXJlbnRUeXBlKCkgewogICAgICAgICAgICBpZiAoISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBOYW1lKSAmJgogICAgICAgICAgICAgICAgdGhpcy5fcGFyZW50IGluc3RhbmNlb2YgQWJzdHJhY3RGb3JtR3JvdXBEaXJlY3RpdmUpIHsKICAgICAgICAgICAgICAgIFJlYWN0aXZlRXJyb3JzLm5nTW9kZWxHcm91cEV4Y2VwdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCEodGhpcy5fcGFyZW50IGluc3RhbmNlb2YgRm9ybUdyb3VwTmFtZSkgJiYgISh0aGlzLl9wYXJlbnQgaW5zdGFuY2VvZiBGb3JtR3JvdXBEaXJlY3RpdmUpICYmCiAgICAgICAgICAgICAgICAhKHRoaXMuX3BhcmVudCBpbnN0YW5jZW9mIEZvcm1BcnJheU5hbWUpKSB7CiAgICAgICAgICAgICAgICBSZWFjdGl2ZUVycm9ycy5jb250cm9sUGFyZW50RXhjZXB0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRVcENvbnRyb2woKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrUGFyZW50VHlwZSgpOwogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKSkuY29udHJvbCA9IHRoaXMuZm9ybURpcmVjdGl2ZS5hZGRDb250cm9sKHRoaXMpOwogICAgICAgICAgICBpZiAodGhpcy5jb250cm9sLmRpc2FibGVkICYmICgvKiogQHR5cGUgez99ICovICh0aGlzLnZhbHVlQWNjZXNzb3IpKS5zZXREaXNhYmxlZFN0YXRlKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMudmFsdWVBY2Nlc3NvcikpLnNldERpc2FibGVkU3RhdGUpKSh0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9hZGRlZCA9IHRydWU7CiAgICAgICAgfQogICAgfQogICAgRm9ybUNvbnRyb2xOYW1lLsm1ZmFjID0gZnVuY3Rpb24gRm9ybUNvbnRyb2xOYW1lX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvcm1Db250cm9sTmFtZSkoybXJtWRpcmVjdGl2ZUluamVjdChDb250cm9sQ29udGFpbmVyLCAxMyksIMm1ybVkaXJlY3RpdmVJbmplY3QoTkdfVkFMSURBVE9SUywgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX0FTWU5DX1ZBTElEQVRPUlMsIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChOR19WQUxVRV9BQ0NFU1NPUiwgMTApLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5HX01PREVMX1dJVEhfRk9STV9DT05UUk9MX1dBUk5JTkcsIDgpKTsgfTsKICAgIEZvcm1Db250cm9sTmFtZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBGb3JtQ29udHJvbE5hbWUsIHNlbGVjdG9yczogW1siIiwgImZvcm1Db250cm9sTmFtZSIsICIiXV0sIGlucHV0czogeyBpc0Rpc2FibGVkOiBbImRpc2FibGVkIiwgImlzRGlzYWJsZWQiXSwgbmFtZTogWyJmb3JtQ29udHJvbE5hbWUiLCAibmFtZSJdLCBtb2RlbDogWyJuZ01vZGVsIiwgIm1vZGVsIl0gfSwgb3V0cHV0czogeyB1cGRhdGU6ICJuZ01vZGVsQ2hhbmdlIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtjb250cm9sTmFtZUJpbmRpbmddKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFN0YXRpYyBwcm9wZXJ0eSB1c2VkIHRvIHRyYWNrIHdoZXRoZXIgYW55IG5nTW9kZWwgd2FybmluZ3MgaGF2ZSBiZWVuIHNlbnQgYWNyb3NzCiAgICAgKiBhbGwgaW5zdGFuY2VzIG9mIEZvcm1Db250cm9sTmFtZS4gVXNlZCB0byBzdXBwb3J0IHdhcm5pbmcgY29uZmlnIG9mICJvbmNlIi4KICAgICAqCiAgICAgKiBcQGludGVybmFsCiAgICAgKi8KICAgIEZvcm1Db250cm9sTmFtZS5fbmdNb2RlbFdhcm5pbmdTZW50T25jZSA9IGZhbHNlOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBGb3JtQ29udHJvbE5hbWUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb250cm9sQ29udGFpbmVyLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEhvc3QgfSwgeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX0FTWU5DX1ZBTElEQVRPUlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05HX1ZBTFVFX0FDQ0VTU09SLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtOR19NT0RFTF9XSVRIX0ZPUk1fQ09OVFJPTF9XQVJOSU5HLF0gfV0gfQogICAgXTsKICAgIEZvcm1Db250cm9sTmFtZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydmb3JtQ29udHJvbE5hbWUnLF0gfV0sCiAgICAgICAgaXNEaXNhYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnZGlzYWJsZWQnLF0gfV0sCiAgICAgICAgbW9kZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ25nTW9kZWwnLF0gfV0sCiAgICAgICAgdXBkYXRlOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnbmdNb2RlbENoYW5nZScsXSB9XQogICAgfTsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgUmVxdWlyZWRWYWxpZGF0b3JgIHRvIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBSRVFVSVJFRF9WQUxJREFUT1IgPSB7CiAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUywKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBSZXF1aXJlZFZhbGlkYXRvcikpLAogICAgICAgIG11bHRpOiB0cnVlCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBQcm92aWRlciB3aGljaCBhZGRzIGBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yYCB0byB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQ0hFQ0tCT1hfUkVRVUlSRURfVkFMSURBVE9SID0gewogICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcikpLAogICAgICAgIG11bHRpOiB0cnVlCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBBIGRpcmVjdGl2ZSB0aGF0IGFkZHMgdGhlIGByZXF1aXJlZGAgdmFsaWRhdG9yIHRvIGFueSBjb250cm9scyBtYXJrZWQgd2l0aCB0aGUKICAgICAqIGByZXF1aXJlZGAgYXR0cmlidXRlLiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogICAgICoKICAgICAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oZ3VpZGUvZm9ybS12YWxpZGF0aW9uKQogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBBZGRpbmcgYSByZXF1aXJlZCB2YWxpZGF0b3IgdXNpbmcgdGVtcGxhdGUtZHJpdmVuIGZvcm1zCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8aW5wdXQgbmFtZT0iZnVsbE5hbWUiIG5nTW9kZWwgcmVxdWlyZWQ+CiAgICAgKiBgYGAKICAgICAqCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFJlcXVpcmVkVmFsaWRhdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogVHJhY2tzIGNoYW5nZXMgdG8gdGhlIHJlcXVpcmVkIGF0dHJpYnV0ZSBib3VuZCB0byB0aGlzIGRpcmVjdGl2ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByZXF1aXJlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcmVxdWlyZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSB2YWx1ZSAhPSBudWxsICYmIHZhbHVlICE9PSBmYWxzZSAmJiBgJHt2YWx1ZX1gICE9PSAnZmFsc2UnOwogICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpCiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgZW1wdHkuCiAgICAgICAgICogUmV0dXJucyB0aGUgdmFsaWRhdGlvbiByZXN1bHQgaWYgZW5hYmxlZCwgb3RoZXJ3aXNlIG51bGwuCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZShjb250cm9sKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVpcmVkID8gVmFsaWRhdG9ycy5yZXF1aXJlZChjb250cm9sKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgICAgICB9CiAgICB9CiAgICBSZXF1aXJlZFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIFJlcXVpcmVkVmFsaWRhdG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlcXVpcmVkVmFsaWRhdG9yKSgpOyB9OwogICAgUmVxdWlyZWRWYWxpZGF0b3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogUmVxdWlyZWRWYWxpZGF0b3IsIHNlbGVjdG9yczogW1siIiwgInJlcXVpcmVkIiwgIiIsICJmb3JtQ29udHJvbE5hbWUiLCAiIiwgMywgInR5cGUiLCAiY2hlY2tib3giXSwgWyIiLCAicmVxdWlyZWQiLCAiIiwgImZvcm1Db250cm9sIiwgIiIsIDMsICJ0eXBlIiwgImNoZWNrYm94Il0sIFsiIiwgInJlcXVpcmVkIiwgIiIsICJuZ01vZGVsIiwgIiIsIDMsICJ0eXBlIiwgImNoZWNrYm94Il1dLCBob3N0VmFyczogMSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBSZXF1aXJlZFZhbGlkYXRvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoInJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkID8gIiIgOiBudWxsKTsKICAgICAgICB9IH0sIGlucHV0czogeyByZXF1aXJlZDogInJlcXVpcmVkIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtSRVFVSVJFRF9WQUxJREFUT1JdKV0gfSk7CiAgICBSZXF1aXJlZFZhbGlkYXRvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICByZXF1aXJlZDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIEEgRGlyZWN0aXZlIHRoYXQgYWRkcyB0aGUgYHJlcXVpcmVkYCB2YWxpZGF0b3IgdG8gY2hlY2tib3ggY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAgICAgKiBgcmVxdWlyZWRgIGF0dHJpYnV0ZS4gVGhlIGRpcmVjdGl2ZSBpcyBwcm92aWRlZCB3aXRoIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICAgICAqCiAgICAgKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgQWRkaW5nIGEgcmVxdWlyZWQgY2hlY2tib3ggdmFsaWRhdG9yIHVzaW5nIHRlbXBsYXRlLWRyaXZlbiBmb3JtcwogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgY2hlY2tib3ggcmVxdWlyZWQgdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuCiAgICAgKiBuZ01vZGVsIGJpbmRpbmcuCiAgICAgKgogICAgICogYGBgCiAgICAgKiA8aW5wdXQgdHlwZT0iY2hlY2tib3giIG5hbWU9ImFjdGl2ZSIgbmdNb2RlbCByZXF1aXJlZD4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqLwogICAgY2xhc3MgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciBleHRlbmRzIFJlcXVpcmVkVmFsaWRhdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgb3Igbm90IHRoZSBjaGVja2JveCBoYXMgYmVlbiBjaGVja2VkLgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVuYWJsZWQsIG90aGVyd2lzZSBudWxsLgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGUoY29udHJvbCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1aXJlZCA/IFZhbGlkYXRvcnMucmVxdWlyZWRUcnVlKGNvbnRyb2wpIDogbnVsbDsKICAgICAgICB9CiAgICB9CiAgICBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLsm1ZmFjID0gZnVuY3Rpb24gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9CYXNlRmFjdG9yeSh0IHx8IENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IpOyB9OwogICAgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbImlucHV0IiwgInR5cGUiLCAiY2hlY2tib3giLCAicmVxdWlyZWQiLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgInJlcXVpcmVkIiwgIiIsICJmb3JtQ29udHJvbCIsICIiXSwgWyJpbnB1dCIsICJ0eXBlIiwgImNoZWNrYm94IiwgInJlcXVpcmVkIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoInJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkID8gIiIgOiBudWxsKTsKICAgICAgICB9IH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW0NIRUNLQk9YX1JFUVVJUkVEX1ZBTElEQVRPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIGNvbnN0IMm1Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IpOwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBQcm92aWRlciB3aGljaCBhZGRzIGBFbWFpbFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEVNQUlMX1ZBTElEQVRPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IEVtYWlsVmFsaWRhdG9yKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyB0aGUgYGVtYWlsYCB2YWxpZGF0b3IgdG8gY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAgICAgKiBgZW1haWxgIGF0dHJpYnV0ZS4gVGhlIGRpcmVjdGl2ZSBpcyBwcm92aWRlZCB3aXRoIHRoZSBgTkdfVkFMSURBVE9SU2AgbXVsdGktcHJvdmlkZXIgbGlzdC4KICAgICAqCiAgICAgKiBAc2VlIFtGb3JtIFZhbGlkYXRpb25dKGd1aWRlL2Zvcm0tdmFsaWRhdGlvbikKICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqCiAgICAgKiAjIyMgQWRkaW5nIGFuIGVtYWlsIHZhbGlkYXRvcgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGFuIGVtYWlsIHZhbGlkYXRvciB0byBhbiBpbnB1dCBhdHRhY2hlZCB0byBhbiBuZ01vZGVsCiAgICAgKiBiaW5kaW5nLgogICAgICoKICAgICAqIGBgYAogICAgICogPGlucHV0IHR5cGU9ImVtYWlsIiBuYW1lPSJlbWFpbCIgbmdNb2RlbCBlbWFpbD4KICAgICAqIDxpbnB1dCB0eXBlPSJlbWFpbCIgbmFtZT0iZW1haWwiIG5nTW9kZWwgZW1haWw9InRydWUiPgogICAgICogPGlucHV0IHR5cGU9ImVtYWlsIiBuYW1lPSJlbWFpbCIgbmdNb2RlbCBbZW1haWxdPSJ0cnVlIj4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqLwogICAgY2xhc3MgRW1haWxWYWxpZGF0b3IgewogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBUcmFja3MgY2hhbmdlcyB0byB0aGUgZW1haWwgYXR0cmlidXRlIGJvdW5kIHRvIHRoaXMgZGlyZWN0aXZlLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBlbWFpbCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9lbmFibGVkID0gdmFsdWUgPT09ICcnIHx8IHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSAndHJ1ZSc7CiAgICAgICAgICAgIGlmICh0aGlzLl9vbkNoYW5nZSkKICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBNZXRob2QgdGhhdCB2YWxpZGF0ZXMgd2hldGhlciBhbiBlbWFpbCBhZGRyZXNzIGlzIHZhbGlkLgogICAgICAgICAqIFJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVuYWJsZWQsIG90aGVyd2lzZSBudWxsLgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGUoY29udHJvbCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZW5hYmxlZCA/IFZhbGlkYXRvcnMuZW1haWwoY29udHJvbCkgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSB2YWxpZGF0b3IgaW5wdXRzIGNoYW5nZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47CiAgICAgICAgfQogICAgfQogICAgRW1haWxWYWxpZGF0b3IuybVmYWMgPSBmdW5jdGlvbiBFbWFpbFZhbGlkYXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFbWFpbFZhbGlkYXRvcikoKTsgfTsKICAgIEVtYWlsVmFsaWRhdG9yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEVtYWlsVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbIiIsICJlbWFpbCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIiIsICJlbWFpbCIsICIiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiIiwgImVtYWlsIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgaW5wdXRzOiB7IGVtYWlsOiAiZW1haWwiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW0VNQUlMX1ZBTElEQVRPUl0pXSB9KTsKICAgIEVtYWlsVmFsaWRhdG9yLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGVtYWlsOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogUHJvdmlkZXIgd2hpY2ggYWRkcyBgTWluTGVuZ3RoVmFsaWRhdG9yYCB0byB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUlOX0xFTkdUSF9WQUxJREFUT1IgPSB7CiAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUywKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBNaW5MZW5ndGhWYWxpZGF0b3IpKSwKICAgICAgICBtdWx0aTogdHJ1ZQogICAgfTsKICAgIC8qKgogICAgICogQSBkaXJlY3RpdmUgdGhhdCBhZGRzIG1pbmltdW0gbGVuZ3RoIHZhbGlkYXRpb24gdG8gY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAgICAgKiBgbWlubGVuZ3RoYCBhdHRyaWJ1dGUuIFRoZSBkaXJlY3RpdmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAgICAgKgogICAgICogQHNlZSBbRm9ybSBWYWxpZGF0aW9uXShndWlkZS9mb3JtLXZhbGlkYXRpb24pCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIEFkZGluZyBhIG1pbmltdW0gbGVuZ3RoIHZhbGlkYXRvcgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgbWluaW11bSBsZW5ndGggdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuCiAgICAgKiBuZ01vZGVsIGJpbmRpbmcuCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGlucHV0IG5hbWU9ImZpcnN0TmFtZSIgbmdNb2RlbCBtaW5sZW5ndGg9IjQiPgogICAgICogYGBgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBNaW5MZW5ndGhWYWxpZGF0b3IgewogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBBIGxpZmVjeWNsZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGRpcmVjdGl2ZSdzIGlucHV0cyBjaGFuZ2UuIEZvciBpbnRlcm5hbCB1c2UKICAgICAgICAgKiBvbmx5LgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzIEEgb2JqZWN0IG9mIGtleS92YWx1ZSBwYWlycyBmb3IgdGhlIHNldCBvZiBjaGFuZ2VkIGlucHV0cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgaWYgKCdtaW5sZW5ndGgnIGluIGNoYW5nZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NyZWF0ZVZhbGlkYXRvcigpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX29uQ2hhbmdlKQogICAgICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogXEBkZXNjcmlwdGlvbgogICAgICAgICAqIE1ldGhvZCB0aGF0IHZhbGlkYXRlcyB3aGV0aGVyIHRoZSB2YWx1ZSBtZWV0cyBhIG1pbmltdW0gbGVuZ3RoCiAgICAgICAgICogcmVxdWlyZW1lbnQuIFJldHVybnMgdGhlIHZhbGlkYXRpb24gcmVzdWx0IGlmIGVuYWJsZWQsIG90aGVyd2lzZSBudWxsLgogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdmFsaWRhdGUoY29udHJvbCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5taW5sZW5ndGggPT0gbnVsbCA/IG51bGwgOiB0aGlzLl92YWxpZGF0b3IoY29udHJvbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVWYWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMubWluTGVuZ3RoKHR5cGVvZiB0aGlzLm1pbmxlbmd0aCA9PT0gJ251bWJlcicgPyB0aGlzLm1pbmxlbmd0aCA6IHBhcnNlSW50KHRoaXMubWlubGVuZ3RoLCAxMCkpOwogICAgICAgIH0KICAgIH0KICAgIE1pbkxlbmd0aFZhbGlkYXRvci7JtWZhYyA9IGZ1bmN0aW9uIE1pbkxlbmd0aFZhbGlkYXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNaW5MZW5ndGhWYWxpZGF0b3IpKCk7IH07CiAgICBNaW5MZW5ndGhWYWxpZGF0b3IuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWluTGVuZ3RoVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbIiIsICJtaW5sZW5ndGgiLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyIiLCAibWlubGVuZ3RoIiwgIiIsICJmb3JtQ29udHJvbCIsICIiXSwgWyIiLCAibWlubGVuZ3RoIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWluTGVuZ3RoVmFsaWRhdG9yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgibWlubGVuZ3RoIiwgY3R4Lm1pbmxlbmd0aCA/IGN0eC5taW5sZW5ndGggOiBudWxsKTsKICAgICAgICB9IH0sIGlucHV0czogeyBtaW5sZW5ndGg6ICJtaW5sZW5ndGgiIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW01JTl9MRU5HVEhfVkFMSURBVE9SXSksIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgTWluTGVuZ3RoVmFsaWRhdG9yLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG1pbmxlbmd0aDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIFByb3ZpZGVyIHdoaWNoIGFkZHMgYE1heExlbmd0aFZhbGlkYXRvcmAgdG8gdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BWF9MRU5HVEhfVkFMSURBVE9SID0gewogICAgICAgIHByb3ZpZGU6IE5HX1ZBTElEQVRPUlMsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gTWF4TGVuZ3RoVmFsaWRhdG9yKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyBtYXggbGVuZ3RoIHZhbGlkYXRpb24gdG8gY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAgICAgKiBgbWF4bGVuZ3RoYCBhdHRyaWJ1dGUuIFRoZSBkaXJlY3RpdmUgaXMgcHJvdmlkZWQgd2l0aCB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAgICAgKgogICAgICogQHNlZSBbRm9ybSBWYWxpZGF0aW9uXShndWlkZS9mb3JtLXZhbGlkYXRpb24pCiAgICAgKgogICAgICogXEB1c2FnZU5vdGVzCiAgICAgKgogICAgICogIyMjIEFkZGluZyBhIG1heGltdW0gbGVuZ3RoIHZhbGlkYXRvcgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgbWF4aW11bSBsZW5ndGggdmFsaWRhdG9yIHRvIGFuIGlucHV0IGF0dGFjaGVkIHRvIGFuCiAgICAgKiBuZ01vZGVsIGJpbmRpbmcuCiAgICAgKgogICAgICogYGBgaHRtbAogICAgICogPGlucHV0IG5hbWU9ImZpcnN0TmFtZSIgbmdNb2RlbCBtYXhsZW5ndGg9IjI1Ij4KICAgICAqIGBgYAogICAgICoKICAgICAqIFxAbmdNb2R1bGUgUmVhY3RpdmVGb3Jtc01vZHVsZQogICAgICogXEBuZ01vZHVsZSBGb3Jtc01vZHVsZQogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgTWF4TGVuZ3RoVmFsaWRhdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlCiAgICAgICAgICogb25seS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICgnbWF4bGVuZ3RoJyBpbiBjaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jcmVhdGVWYWxpZGF0b3IoKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vbkNoYW5nZSkKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBNZXRob2QgdGhhdCB2YWxpZGF0ZXMgd2hldGhlciB0aGUgdmFsdWUgZXhjZWVkcwogICAgICAgICAqIHRoZSBtYXhpbXVtIGxlbmd0aCByZXF1aXJlbWVudC4KICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbGlkYXRlKGNvbnRyb2wpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubWF4bGVuZ3RoICE9IG51bGwgPyB0aGlzLl92YWxpZGF0b3IoY29udHJvbCkgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgZnVuY3Rpb24gdG8gY2FsbCB3aGVuIHRoZSB2YWxpZGF0b3IgaW5wdXRzIGNoYW5nZS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uVmFsaWRhdG9yQ2hhbmdlKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlVmFsaWRhdG9yKCkgewogICAgICAgICAgICB0aGlzLl92YWxpZGF0b3IgPSBWYWxpZGF0b3JzLm1heExlbmd0aCh0eXBlb2YgdGhpcy5tYXhsZW5ndGggPT09ICdudW1iZXInID8gdGhpcy5tYXhsZW5ndGggOiBwYXJzZUludCh0aGlzLm1heGxlbmd0aCwgMTApKTsKICAgICAgICB9CiAgICB9CiAgICBNYXhMZW5ndGhWYWxpZGF0b3IuybVmYWMgPSBmdW5jdGlvbiBNYXhMZW5ndGhWYWxpZGF0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF4TGVuZ3RoVmFsaWRhdG9yKSgpOyB9OwogICAgTWF4TGVuZ3RoVmFsaWRhdG9yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1heExlbmd0aFZhbGlkYXRvciwgc2VsZWN0b3JzOiBbWyIiLCAibWF4bGVuZ3RoIiwgIiIsICJmb3JtQ29udHJvbE5hbWUiLCAiIl0sIFsiIiwgIm1heGxlbmd0aCIsICIiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiIiwgIm1heGxlbmd0aCIsICIiLCAibmdNb2RlbCIsICIiXV0sIGhvc3RWYXJzOiAxLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1heExlbmd0aFZhbGlkYXRvcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoIm1heGxlbmd0aCIsIGN0eC5tYXhsZW5ndGggPyBjdHgubWF4bGVuZ3RoIDogbnVsbCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgbWF4bGVuZ3RoOiAibWF4bGVuZ3RoIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtNQVhfTEVOR1RIX1ZBTElEQVRPUl0pLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKICAgIE1heExlbmd0aFZhbGlkYXRvci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBtYXhsZW5ndGg6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgKiBQcm92aWRlciB3aGljaCBhZGRzIGBQYXR0ZXJuVmFsaWRhdG9yYCB0byB0aGUgYE5HX1ZBTElEQVRPUlNgIG11bHRpLXByb3ZpZGVyIGxpc3QuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgUEFUVEVSTl9WQUxJREFUT1IgPSB7CiAgICAgICAgcHJvdmlkZTogTkdfVkFMSURBVE9SUywKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBQYXR0ZXJuVmFsaWRhdG9yKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAqIEEgZGlyZWN0aXZlIHRoYXQgYWRkcyByZWdleCBwYXR0ZXJuIHZhbGlkYXRpb24gdG8gY29udHJvbHMgbWFya2VkIHdpdGggdGhlCiAgICAgKiBgcGF0dGVybmAgYXR0cmlidXRlLiBUaGUgcmVnZXggbXVzdCBtYXRjaCB0aGUgZW50aXJlIGNvbnRyb2wgdmFsdWUuCiAgICAgKiBUaGUgZGlyZWN0aXZlIGlzIHByb3ZpZGVkIHdpdGggdGhlIGBOR19WQUxJREFUT1JTYCBtdWx0aS1wcm92aWRlciBsaXN0LgogICAgICoKICAgICAqIEBzZWUgW0Zvcm0gVmFsaWRhdGlvbl0oZ3VpZGUvZm9ybS12YWxpZGF0aW9uKQogICAgICoKICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICoKICAgICAqICMjIyBBZGRpbmcgYSBwYXR0ZXJuIHZhbGlkYXRvcgogICAgICoKICAgICAqIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBzaG93cyBob3cgdG8gYWRkIGEgcGF0dGVybiB2YWxpZGF0b3IgdG8gYW4gaW5wdXQgYXR0YWNoZWQgdG8gYW4KICAgICAqIG5nTW9kZWwgYmluZGluZy4KICAgICAqCiAgICAgKiBgYGBodG1sCiAgICAgKiA8aW5wdXQgbmFtZT0iZmlyc3ROYW1lIiBuZ01vZGVsIHBhdHRlcm49IlthLXpBLVogXSoiPgogICAgICogYGBgCiAgICAgKgogICAgICogXEBuZ01vZHVsZSBSZWFjdGl2ZUZvcm1zTW9kdWxlCiAgICAgKiBcQG5nTW9kdWxlIEZvcm1zTW9kdWxlCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBQYXR0ZXJuVmFsaWRhdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogQSBsaWZlY3ljbGUgbWV0aG9kIGNhbGxlZCB3aGVuIHRoZSBkaXJlY3RpdmUncyBpbnB1dHMgY2hhbmdlLiBGb3IgaW50ZXJuYWwgdXNlCiAgICAgICAgICogb25seS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcyBBIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgZm9yIHRoZSBzZXQgb2YgY2hhbmdlZCBpbnB1dHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICgncGF0dGVybicgaW4gY2hhbmdlcykgewogICAgICAgICAgICAgICAgdGhpcy5fY3JlYXRlVmFsaWRhdG9yKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fb25DaGFuZ2UpCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGRlc2NyaXB0aW9uCiAgICAgICAgICogTWV0aG9kIHRoYXQgdmFsaWRhdGVzIHdoZXRoZXIgdGhlIHZhbHVlIG1hdGNoZXMgdGhlCiAgICAgICAgICogdGhlIHBhdHRlcm4gcmVxdWlyZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZShjb250cm9sKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl92YWxpZGF0b3IoY29udHJvbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIHZhbGlkYXRvciBpbnB1dHMgY2hhbmdlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25WYWxpZGF0b3JDaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVWYWxpZGF0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuX3ZhbGlkYXRvciA9IFZhbGlkYXRvcnMucGF0dGVybih0aGlzLnBhdHRlcm4pOwogICAgICAgIH0KICAgIH0KICAgIFBhdHRlcm5WYWxpZGF0b3IuybVmYWMgPSBmdW5jdGlvbiBQYXR0ZXJuVmFsaWRhdG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBhdHRlcm5WYWxpZGF0b3IpKCk7IH07CiAgICBQYXR0ZXJuVmFsaWRhdG9yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IFBhdHRlcm5WYWxpZGF0b3IsIHNlbGVjdG9yczogW1siIiwgInBhdHRlcm4iLCAiIiwgImZvcm1Db250cm9sTmFtZSIsICIiXSwgWyIiLCAicGF0dGVybiIsICIiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsiIiwgInBhdHRlcm4iLCAiIiwgIm5nTW9kZWwiLCAiIl1dLCBob3N0VmFyczogMSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBQYXR0ZXJuVmFsaWRhdG9yX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgicGF0dGVybiIsIGN0eC5wYXR0ZXJuID8gY3R4LnBhdHRlcm4gOiBudWxsKTsKICAgICAgICB9IH0sIGlucHV0czogeyBwYXR0ZXJuOiAicGF0dGVybiIgfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbUEFUVEVSTl9WQUxJREFUT1JdKSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CiAgICBQYXR0ZXJuVmFsaWRhdG9yLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHBhdHRlcm46IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBJbnRlcm5hbCBtb2R1bGUgdXNlZCBmb3Igc2hhcmluZyBkaXJlY3RpdmVzIGJldHdlZW4gRm9ybXNNb2R1bGUgYW5kIFJlYWN0aXZlRm9ybXNNb2R1bGUKICAgICAqLwogICAgY2xhc3MgybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlIHsKICAgIH0KICAgIMm1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IMm1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZSB9KTsKICAgIMm1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIMm1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCDJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZSjJtUludGVybmFsRm9ybXNTaGFyZWRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbybVOZ05vVmFsaWRhdGUsCiAgICAgICAgICAgIE5nU2VsZWN0T3B0aW9uLAogICAgICAgICAgICDJtU5nU2VsZWN0TXVsdGlwbGVPcHRpb24sCiAgICAgICAgICAgIERlZmF1bHRWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBOdW1iZXJWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBSYW5nZVZhbHVlQWNjZXNzb3IsCiAgICAgICAgICAgIENoZWNrYm94Q29udHJvbFZhbHVlQWNjZXNzb3IsCiAgICAgICAgICAgIFNlbGVjdENvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBTZWxlY3RNdWx0aXBsZUNvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBSYWRpb0NvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBOZ0NvbnRyb2xTdGF0dXMsCiAgICAgICAgICAgIE5nQ29udHJvbFN0YXR1c0dyb3VwLAogICAgICAgICAgICBSZXF1aXJlZFZhbGlkYXRvciwKICAgICAgICAgICAgTWluTGVuZ3RoVmFsaWRhdG9yLAogICAgICAgICAgICBNYXhMZW5ndGhWYWxpZGF0b3IsCiAgICAgICAgICAgIFBhdHRlcm5WYWxpZGF0b3IsCiAgICAgICAgICAgIENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IsCiAgICAgICAgICAgIEVtYWlsVmFsaWRhdG9yXSwgZXhwb3J0czogW8m1TmdOb1ZhbGlkYXRlLAogICAgICAgICAgICBOZ1NlbGVjdE9wdGlvbiwKICAgICAgICAgICAgybVOZ1NlbGVjdE11bHRpcGxlT3B0aW9uLAogICAgICAgICAgICBEZWZhdWx0VmFsdWVBY2Nlc3NvciwKICAgICAgICAgICAgTnVtYmVyVmFsdWVBY2Nlc3NvciwKICAgICAgICAgICAgUmFuZ2VWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBDaGVja2JveENvbnRyb2xWYWx1ZUFjY2Vzc29yLAogICAgICAgICAgICBTZWxlY3RDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICAgICAgU2VsZWN0TXVsdGlwbGVDb250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICAgICAgUmFkaW9Db250cm9sVmFsdWVBY2Nlc3NvciwKICAgICAgICAgICAgTmdDb250cm9sU3RhdHVzLAogICAgICAgICAgICBOZ0NvbnRyb2xTdGF0dXNHcm91cCwKICAgICAgICAgICAgUmVxdWlyZWRWYWxpZGF0b3IsCiAgICAgICAgICAgIE1pbkxlbmd0aFZhbGlkYXRvciwKICAgICAgICAgICAgTWF4TGVuZ3RoVmFsaWRhdG9yLAogICAgICAgICAgICBQYXR0ZXJuVmFsaWRhdG9yLAogICAgICAgICAgICBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLAogICAgICAgICAgICBFbWFpbFZhbGlkYXRvcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9mb3Jtcy9zcmMvZm9ybV9idWlsZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBvcHRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0Fic3RyYWN0Q29udHJvbE9wdGlvbnMob3B0aW9ucykgewogICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSkuYXN5bmNWYWxpZGF0b3JzICE9PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpLnZhbGlkYXRvcnMgIT09IHVuZGVmaW5lZCB8fAogICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSkudXBkYXRlT24gIT09IHVuZGVmaW5lZDsKICAgIH0KICAgIC8qKgogICAgICogXEBkZXNjcmlwdGlvbgogICAgICogQ3JlYXRlcyBhbiBgQWJzdHJhY3RDb250cm9sYCBmcm9tIGEgdXNlci1zcGVjaWZpZWQgY29uZmlndXJhdGlvbi4KICAgICAqCiAgICAgKiBUaGUgYEZvcm1CdWlsZGVyYCBwcm92aWRlcyBzeW50YWN0aWMgc3VnYXIgdGhhdCBzaG9ydGVucyBjcmVhdGluZyBpbnN0YW5jZXMgb2YgYSBgRm9ybUNvbnRyb2xgLAogICAgICogYEZvcm1Hcm91cGAsIG9yIGBGb3JtQXJyYXlgLiBJdCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgYm9pbGVycGxhdGUgbmVlZGVkIHRvIGJ1aWxkIGNvbXBsZXgKICAgICAqIGZvcm1zLgogICAgICoKICAgICAqIEBzZWUgW1JlYWN0aXZlIEZvcm1zIEd1aWRlXSgvZ3VpZGUvcmVhY3RpdmUtZm9ybXMpCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgRm9ybUJ1aWxkZXIgewogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYEZvcm1Hcm91cGAgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2xzQ29uZmlnIEEgY29sbGVjdGlvbiBvZiBjaGlsZCBjb250cm9scy4gVGhlIGtleSBmb3IgZWFjaCBjaGlsZCBpcyB0aGUgbmFtZQogICAgICAgICAqIHVuZGVyIHdoaWNoIGl0IGlzIHJlZ2lzdGVyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBvYmplY3QgZm9yIHRoZSBgRm9ybUdyb3VwYC4gVGhlIG9iamVjdCBjYW4KICAgICAgICAgKiBoYXZlIHR3byBzaGFwZXM6CiAgICAgICAgICoKICAgICAgICAgKiAxKSBgQWJzdHJhY3RDb250cm9sT3B0aW9uc2Agb2JqZWN0IChwcmVmZXJyZWQpLCB3aGljaCBjb25zaXN0cyBvZjoKICAgICAgICAgKiAqIGB2YWxpZGF0b3JzYDogQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mIHZhbGlkYXRvciBmdW5jdGlvbnMKICAgICAgICAgKiAqIGBhc3luY1ZhbGlkYXRvcnNgOiBBIHNpbmdsZSBhc3luYyB2YWxpZGF0b3Igb3IgYXJyYXkgb2YgYXN5bmMgdmFsaWRhdG9yIGZ1bmN0aW9ucwogICAgICAgICAqICogYHVwZGF0ZU9uYDogVGhlIGV2ZW50IHVwb24gd2hpY2ggdGhlIGNvbnRyb2wgc2hvdWxkIGJlIHVwZGF0ZWQgKG9wdGlvbnM6ICdjaGFuZ2UnIHwgJ2JsdXInIHwKICAgICAgICAgKiBzdWJtaXQnKQogICAgICAgICAqCiAgICAgICAgICogMikgTGVnYWN5IGNvbmZpZ3VyYXRpb24gb2JqZWN0LCB3aGljaCBjb25zaXN0cyBvZjoKICAgICAgICAgKiAqIGB2YWxpZGF0b3JgOiBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YgdmFsaWRhdG9yIGZ1bmN0aW9ucwogICAgICAgICAqICogYGFzeW5jVmFsaWRhdG9yYDogQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvciBmdW5jdGlvbnMKICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ3JvdXAoY29udHJvbHNDb25maWcsIG9wdGlvbnMgPSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSB0aGlzLl9yZWR1Y2VDb250cm9scyhjb250cm9sc0NvbmZpZyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbGlkYXRvcnMgPSBudWxsOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBhc3luY1ZhbGlkYXRvcnMgPSBudWxsOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB1cGRhdGVPbiA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgaWYgKG9wdGlvbnMgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKGlzQWJzdHJhY3RDb250cm9sT3B0aW9ucyhvcHRpb25zKSkgewogICAgICAgICAgICAgICAgICAgIC8vIGBvcHRpb25zYCBhcmUgYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgCiAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycyA9IG9wdGlvbnMudmFsaWRhdG9ycyAhPSBudWxsID8gb3B0aW9ucy52YWxpZGF0b3JzIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICBhc3luY1ZhbGlkYXRvcnMgPSBvcHRpb25zLmFzeW5jVmFsaWRhdG9ycyAhPSBudWxsID8gb3B0aW9ucy5hc3luY1ZhbGlkYXRvcnMgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIHVwZGF0ZU9uID0gb3B0aW9ucy51cGRhdGVPbiAhPSBudWxsID8gb3B0aW9ucy51cGRhdGVPbiA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIGBvcHRpb25zYCBhcmUgbGVnYWN5IGZvcm0gZ3JvdXAgb3B0aW9ucwogICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvcnMgPSBvcHRpb25zWyd2YWxpZGF0b3InXSAhPSBudWxsID8gb3B0aW9uc1sndmFsaWRhdG9yJ10gOiBudWxsOwogICAgICAgICAgICAgICAgICAgIGFzeW5jVmFsaWRhdG9ycyA9IG9wdGlvbnNbJ2FzeW5jVmFsaWRhdG9yJ10gIT0gbnVsbCA/IG9wdGlvbnNbJ2FzeW5jVmFsaWRhdG9yJ10gOiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybUdyb3VwKGNvbnRyb2xzLCB7IGFzeW5jVmFsaWRhdG9ycywgdXBkYXRlT24sIHZhbGlkYXRvcnMgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYEZvcm1Db250cm9sYCB3aXRoIHRoZSBnaXZlbiBzdGF0ZSwgdmFsaWRhdG9ycyBhbmQgb3B0aW9ucy4KICAgICAgICAgKgogICAgICAgICAqIFxAdXNhZ2VOb3RlcwogICAgICAgICAqCiAgICAgICAgICogIyMjIEluaXRpYWxpemUgYSBjb250cm9sIGFzIGRpc2FibGVkCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgZm9sbG93aW5nIGV4YW1wbGUgcmV0dXJucyBhIGNvbnRyb2wgd2l0aCBhbiBpbml0aWFsIHZhbHVlIGluIGEgZGlzYWJsZWQgc3RhdGUuCiAgICAgICAgICoKICAgICAgICAgKiA8Y29kZS1leGFtcGxlIHBhdGg9ImZvcm1zL3RzL2Zvcm1CdWlsZGVyL2Zvcm1fYnVpbGRlcl9leGFtcGxlLnRzIiByZWdpb249ImRpc2FibGVkLWNvbnRyb2wiPgogICAgICAgICAqIDwvY29kZS1leGFtcGxlPgogICAgICAgICAqIEBwYXJhbSB7P30gZm9ybVN0YXRlIEluaXRpYWxpemVzIHRoZSBjb250cm9sIHdpdGggYW4gaW5pdGlhbCBzdGF0ZSB2YWx1ZSwgb3IKICAgICAgICAgKiB3aXRoIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zIGJvdGggYSB2YWx1ZSBhbmQgYSBkaXNhYmxlZCBzdGF0dXMuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez89fSB2YWxpZGF0b3JPck9wdHMgQSBzeW5jaHJvbm91cyB2YWxpZGF0b3IgZnVuY3Rpb24sIG9yIGFuIGFycmF5IG9mCiAgICAgICAgICogc3VjaCBmdW5jdGlvbnMsIG9yIGFuIGBBYnN0cmFjdENvbnRyb2xPcHRpb25zYCBvYmplY3QgdGhhdCBjb250YWlucwogICAgICAgICAqIHZhbGlkYXRpb24gZnVuY3Rpb25zIGFuZCBhIHZhbGlkYXRpb24gdHJpZ2dlci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGFzeW5jVmFsaWRhdG9yIEEgc2luZ2xlIGFzeW5jIHZhbGlkYXRvciBvciBhcnJheSBvZiBhc3luYyB2YWxpZGF0b3IKICAgICAgICAgKiBmdW5jdGlvbnMuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgRm9ybUNvbnRyb2woZm9ybVN0YXRlLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBgRm9ybUFycmF5YCBmcm9tIHRoZSBnaXZlbiBhcnJheSBvZiBjb25maWd1cmF0aW9ucywKICAgICAgICAgKiB2YWxpZGF0b3JzIGFuZCBvcHRpb25zLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sc0NvbmZpZyBBbiBhcnJheSBvZiBjaGlsZCBjb250cm9scyBvciBjb250cm9sIGNvbmZpZ3MuIEVhY2gKICAgICAgICAgKiBjaGlsZCBjb250cm9sIGlzIGdpdmVuIGFuIGluZGV4IHdoZW4gaXQgaXMgcmVnaXN0ZXJlZC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbGlkYXRvck9yT3B0cyBBIHN5bmNocm9ub3VzIHZhbGlkYXRvciBmdW5jdGlvbiwgb3IgYW4gYXJyYXkgb2YKICAgICAgICAgKiBzdWNoIGZ1bmN0aW9ucywgb3IgYW4gYEFic3RyYWN0Q29udHJvbE9wdGlvbnNgIG9iamVjdCB0aGF0IGNvbnRhaW5zCiAgICAgICAgICogdmFsaWRhdGlvbiBmdW5jdGlvbnMgYW5kIGEgdmFsaWRhdGlvbiB0cmlnZ2VyLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXN5bmNWYWxpZGF0b3IgQSBzaW5nbGUgYXN5bmMgdmFsaWRhdG9yIG9yIGFycmF5IG9mIGFzeW5jIHZhbGlkYXRvcgogICAgICAgICAqIGZ1bmN0aW9ucy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFycmF5KGNvbnRyb2xzQ29uZmlnLCB2YWxpZGF0b3JPck9wdHMsIGFzeW5jVmFsaWRhdG9yKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udHJvbHMgPSBjb250cm9sc0NvbmZpZy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGMgPT4gdGhpcy5fY3JlYXRlQ29udHJvbChjKSkpOwogICAgICAgICAgICByZXR1cm4gbmV3IEZvcm1BcnJheShjb250cm9scywgdmFsaWRhdG9yT3JPcHRzLCBhc3luY1ZhbGlkYXRvcik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2xzQ29uZmlnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVkdWNlQ29udHJvbHMoY29udHJvbHNDb25maWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb250cm9scyA9IHt9OwogICAgICAgICAgICBPYmplY3Qua2V5cyhjb250cm9sc0NvbmZpZykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbE5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbnRyb2xOYW1lID0+IHsKICAgICAgICAgICAgICAgIGNvbnRyb2xzW2NvbnRyb2xOYW1lXSA9IHRoaXMuX2NyZWF0ZUNvbnRyb2woY29udHJvbHNDb25maWdbY29udHJvbE5hbWVdKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICByZXR1cm4gY29udHJvbHM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFxAaW50ZXJuYWwKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2xDb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVDb250cm9sKGNvbnRyb2xDb25maWcpIHsKICAgICAgICAgICAgaWYgKGNvbnRyb2xDb25maWcgaW5zdGFuY2VvZiBGb3JtQ29udHJvbCB8fCBjb250cm9sQ29uZmlnIGluc3RhbmNlb2YgRm9ybUdyb3VwIHx8CiAgICAgICAgICAgICAgICBjb250cm9sQ29uZmlnIGluc3RhbmNlb2YgRm9ybUFycmF5KSB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udHJvbENvbmZpZzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGNvbnRyb2xDb25maWcpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGNvbnRyb2xDb25maWdbMF07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZGF0b3IgPSBjb250cm9sQ29uZmlnLmxlbmd0aCA+IDEgPyBjb250cm9sQ29uZmlnWzFdIDogbnVsbDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGFzeW5jVmFsaWRhdG9yID0gY29udHJvbENvbmZpZy5sZW5ndGggPiAyID8gY29udHJvbENvbmZpZ1syXSA6IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb250cm9sKHZhbHVlLCB2YWxpZGF0b3IsIGFzeW5jVmFsaWRhdG9yKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRyb2woY29udHJvbENvbmZpZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBGb3JtQnVpbGRlci7JtWZhYyA9IGZ1bmN0aW9uIEZvcm1CdWlsZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvcm1CdWlsZGVyKSgpOyB9OwogICAgRm9ybUJ1aWxkZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRm9ybUJ1aWxkZXIsIGZhY3Rvcnk6IEZvcm1CdWlsZGVyLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvZm9ybXMvc3JjL3ZlcnNpb24udHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFZFUlNJT04kNSA9IG5ldyBWZXJzaW9uKCc5LjEuMTInKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2Zvcm1zL3NyYy9mb3JtX3Byb3ZpZGVycy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEV4cG9ydHMgdGhlIHJlcXVpcmVkIHByb3ZpZGVycyBhbmQgZGlyZWN0aXZlcyBmb3IgdGVtcGxhdGUtZHJpdmVuIGZvcm1zLAogICAgICogbWFraW5nIHRoZW0gYXZhaWxhYmxlIGZvciBpbXBvcnQgYnkgTmdNb2R1bGVzIHRoYXQgaW1wb3J0IHRoaXMgbW9kdWxlLgogICAgICoKICAgICAqIEBzZWUgW0Zvcm1zIE92ZXJ2aWV3XSgvZ3VpZGUvZm9ybXMtb3ZlcnZpZXcpCiAgICAgKiBAc2VlIFtUZW1wbGF0ZS1kcml2ZW4gRm9ybXMgR3VpZGVdKC9ndWlkZS9mb3JtcykKICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBGb3Jtc01vZHVsZSB7CiAgICB9CiAgICBGb3Jtc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEZvcm1zTW9kdWxlIH0pOwogICAgRm9ybXNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBGb3Jtc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGb3Jtc01vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbUmFkaW9Db250cm9sUmVnaXN0cnldLCBpbXBvcnRzOiBbybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEZvcm1zTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW05nTW9kZWwsCiAgICAgICAgICAgIE5nTW9kZWxHcm91cCwKICAgICAgICAgICAgTmdGb3JtXSwgZXhwb3J0czogW8m1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZSwKICAgICAgICAgICAgTmdNb2RlbCwKICAgICAgICAgICAgTmdNb2RlbEdyb3VwLAogICAgICAgICAgICBOZ0Zvcm1dIH0pOyB9KSgpOwogICAgLyoqCiAgICAgKiBFeHBvcnRzIHRoZSByZXF1aXJlZCBpbmZyYXN0cnVjdHVyZSBhbmQgZGlyZWN0aXZlcyBmb3IgcmVhY3RpdmUgZm9ybXMsCiAgICAgKiBtYWtpbmcgdGhlbSBhdmFpbGFibGUgZm9yIGltcG9ydCBieSBOZ01vZHVsZXMgdGhhdCBpbXBvcnQgdGhpcyBtb2R1bGUuCiAgICAgKgogICAgICogQHNlZSBbRm9ybXMgT3ZlcnZpZXddKGd1aWRlL2Zvcm1zLW92ZXJ2aWV3KQogICAgICogQHNlZSBbUmVhY3RpdmUgRm9ybXMgR3VpZGVdKGd1aWRlL3JlYWN0aXZlLWZvcm1zKQogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIFJlYWN0aXZlRm9ybXNNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIFxAZGVzY3JpcHRpb24KICAgICAgICAgKiBQcm92aWRlcyBvcHRpb25zIGZvciBjb25maWd1cmluZyB0aGUgcmVhY3RpdmUgZm9ybXMgbW9kdWxlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRzIEFuIG9iamVjdCBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMKICAgICAgICAgKiAqIGB3YXJuT25OZ01vZGVsV2l0aEZvcm1Db250cm9sYCBDb25maWd1cmVzIHdoZW4gdG8gZW1pdCBhIHdhcm5pbmcgd2hlbiBhbiBgbmdNb2RlbGAKICAgICAgICAgKiBiaW5kaW5nIGlzIHVzZWQgd2l0aCByZWFjdGl2ZSBmb3JtIGRpcmVjdGl2ZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgd2l0aENvbmZpZyhvcHRzKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBuZ01vZHVsZTogUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTkdfTU9ERUxfV0lUSF9GT1JNX0NPTlRST0xfV0FSTklORywgdXNlVmFsdWU6IG9wdHMud2Fybk9uTmdNb2RlbFdpdGhGb3JtQ29udHJvbCB9CiAgICAgICAgICAgICAgICBdCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgUmVhY3RpdmVGb3Jtc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFJlYWN0aXZlRm9ybXNNb2R1bGUgfSk7CiAgICBSZWFjdGl2ZUZvcm1zTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUmVhY3RpdmVGb3Jtc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSZWFjdGl2ZUZvcm1zTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFtGb3JtQnVpbGRlciwgUmFkaW9Db250cm9sUmVnaXN0cnldLCBpbXBvcnRzOiBbybVJbnRlcm5hbEZvcm1zU2hhcmVkTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFJlYWN0aXZlRm9ybXNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbRm9ybUNvbnRyb2xEaXJlY3RpdmUsCiAgICAgICAgICAgIEZvcm1Hcm91cERpcmVjdGl2ZSwKICAgICAgICAgICAgRm9ybUNvbnRyb2xOYW1lLAogICAgICAgICAgICBGb3JtR3JvdXBOYW1lLAogICAgICAgICAgICBGb3JtQXJyYXlOYW1lXSwgZXhwb3J0czogW8m1SW50ZXJuYWxGb3Jtc1NoYXJlZE1vZHVsZSwKICAgICAgICAgICAgRm9ybUNvbnRyb2xEaXJlY3RpdmUsCiAgICAgICAgICAgIEZvcm1Hcm91cERpcmVjdGl2ZSwKICAgICAgICAgICAgRm9ybUNvbnRyb2xOYW1lLAogICAgICAgICAgICBGb3JtR3JvdXBOYW1lLAogICAgICAgICAgICBGb3JtQXJyYXlOYW1lXSB9KTsgfSkoKTsKCiAgICBjb25zdCBfYzAkNSA9IFsidHJpZ2dlciJdOwogICAgY29uc3QgX2MxJDUgPSBbInBhbmVsIl07CiAgICBmdW5jdGlvbiBNYXRTZWxlY3Rfc3Bhbl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCA4KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHhfcjIucGxhY2Vob2xkZXIgfHwgIlx1MDBBMCIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRTZWxlY3Rfc3Bhbl81X3NwYW5fMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNSA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yNS50cmlnZ2VyVmFsdWUgfHwgIlx1MDBBMCIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRTZWxlY3Rfc3Bhbl81XzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXByb2plY3Rpb24oMCwgMCwgWyIqbmdTd2l0Y2hDYXNlIiwgInRydWUiXSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdFNlbGVjdF9zcGFuXzVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDkpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBNYXRTZWxlY3Rfc3Bhbl81X3NwYW5fMV9UZW1wbGF0ZSwgMiwgMSwgInNwYW4iLCAxMCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIE1hdFNlbGVjdF9zcGFuXzVfMl9UZW1wbGF0ZSwgMSwgMCwgdW5kZWZpbmVkLCAxMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCAhIWN0eF9yMy5jdXN0b21UcmlnZ2VyKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIHRydWUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRTZWxlY3RfbmdfdGVtcGxhdGVfOF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjkgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTMsIDE0KTsKICAgICAgICDJtcm1bGlzdGVuZXIoIkB0cmFuc2Zvcm1QYW5lbC5kb25lIiwgZnVuY3Rpb24gTWF0U2VsZWN0X25nX3RlbXBsYXRlXzhfVGVtcGxhdGVfZGl2X2FuaW1hdGlvbl90cmFuc2Zvcm1QYW5lbF9kb25lXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjkpOyBjb25zdCBjdHhfcjggPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yOC5fcGFuZWxEb25lQW5pbWF0aW5nU3RyZWFtLm5leHQoJGV2ZW50LnRvU3RhdGUpOyB9KSgia2V5ZG93biIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9uZ190ZW1wbGF0ZV84X1RlbXBsYXRlX2Rpdl9rZXlkb3duXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjkpOyBjb25zdCBjdHhfcjEwID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEwLl9oYW5kbGVLZXlkb3duKCRldmVudCk7IH0pOwogICAgICAgIMm1ybVwcm9qZWN0aW9uKDMsIDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiQHRyYW5zZm9ybVBhbmVsV3JhcCIsIHVuZGVmaW5lZCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtWNsYXNzTWFwSW50ZXJwb2xhdGUxKCJtYXQtc2VsZWN0LXBhbmVsICIsIGN0eF9yNC5fZ2V0UGFuZWxUaGVtZSgpLCAiIik7CiAgICAgICAgybXJtXN0eWxlUHJvcCgidHJhbnNmb3JtLW9yaWdpbiIsIGN0eF9yNC5fdHJhbnNmb3JtT3JpZ2luKSgiZm9udC1zaXplIiwgY3R4X3I0Ll90cmlnZ2VyRm9udFNpemUsICJweCIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIGN0eF9yNC5wYW5lbENsYXNzKSgiQHRyYW5zZm9ybVBhbmVsIiwgY3R4X3I0Lm11bHRpcGxlID8gInNob3dpbmctbXVsdGlwbGUiIDogInNob3dpbmciKTsKICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eF9yNC5pZCArICItcGFuZWwiKTsKICAgIH0gfQogICAgY29uc3QgX2MyJDMgPSBbW1sibWF0LXNlbGVjdC10cmlnZ2VyIl1dLCAiKiJdOwogICAgY29uc3QgX2MzJDIgPSBbIm1hdC1zZWxlY3QtdHJpZ2dlciIsICIqIl07CiAgICBjb25zdCBtYXRTZWxlY3RBbmltYXRpb25zID0gewogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgYW5pbWF0aW9uIGVuc3VyZXMgdGhlIHNlbGVjdCdzIG92ZXJsYXkgcGFuZWwgYW5pbWF0aW9uICh0cmFuc2Zvcm1QYW5lbCkgaXMgY2FsbGVkIHdoZW4KICAgICAgICAgKiBjbG9zaW5nIHRoZSBzZWxlY3QuCiAgICAgICAgICogVGhpcyBpcyBuZWVkZWQgZHVlIHRvIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzIzMzAyCiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtUGFuZWxXcmFwOiB0cmlnZ2VyKCd0cmFuc2Zvcm1QYW5lbFdyYXAnLCBbCiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCcsIHF1ZXJ5KCdAdHJhbnNmb3JtUGFuZWwnLCBbYW5pbWF0ZUNoaWxkKCldLCB7IG9wdGlvbmFsOiB0cnVlIH0pKQogICAgICAgIF0pLAogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgYW5pbWF0aW9uIHRyYW5zZm9ybXMgdGhlIHNlbGVjdCdzIG92ZXJsYXkgcGFuZWwgb24gYW5kIG9mZiB0aGUgcGFnZS4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4gdGhlIHBhbmVsIGlzIGF0dGFjaGVkIHRvIHRoZSBET00sIGl0IGV4cGFuZHMgaXRzIHdpZHRoIGJ5IHRoZSBhbW91bnQgb2YgcGFkZGluZywgc2NhbGVzIGl0CiAgICAgICAgICogdXAgdG8gMTAwJSBvbiB0aGUgWSBheGlzLCBmYWRlcyBpbiBpdHMgYm9yZGVyLCBhbmQgdHJhbnNsYXRlcyBzbGlnaHRseSB1cCBhbmQgdG8gdGhlCiAgICAgICAgICogc2lkZSB0byBlbnN1cmUgdGhlIG9wdGlvbiB0ZXh0IGNvcnJlY3RseSBvdmVybGFwcyB0aGUgdHJpZ2dlciB0ZXh0LgogICAgICAgICAqCiAgICAgICAgICogV2hlbiB0aGUgcGFuZWwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBET00sIGl0IHNpbXBseSBmYWRlcyBvdXQgbGluZWFybHkuCiAgICAgICAgICovCiAgICAgICAgdHJhbnNmb3JtUGFuZWw6IHRyaWdnZXIoJ3RyYW5zZm9ybVBhbmVsJywgWwogICAgICAgICAgICBzdGF0ZSgndm9pZCcsIHN0eWxlKHsKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgwLjgpJywKICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnMTAwJScsCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwCiAgICAgICAgICAgIH0pKSwKICAgICAgICAgICAgc3RhdGUoJ3Nob3dpbmcnLCBzdHlsZSh7CiAgICAgICAgICAgICAgICBvcGFjaXR5OiAxLAogICAgICAgICAgICAgICAgbWluV2lkdGg6ICdjYWxjKDEwMCUgKyAzMnB4KScsCiAgICAgICAgICAgICAgICAvLyAzMnB4ID0gMiAqIDE2cHggcGFkZGluZwogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGVZKDEpJwogICAgICAgICAgICB9KSksCiAgICAgICAgICAgIHN0YXRlKCdzaG93aW5nLW11bHRpcGxlJywgc3R5bGUoewogICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgICAgIG1pbldpZHRoOiAnY2FsYygxMDAlICsgNjRweCknLAogICAgICAgICAgICAgICAgLy8gNjRweCA9IDQ4cHggcGFkZGluZyBvbiB0aGUgbGVmdCArIDE2cHggcGFkZGluZyBvbiB0aGUgcmlnaHQKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlWSgxKScKICAgICAgICAgICAgfSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCd2b2lkID0+IConLCBhbmltYXRlKCcxMjBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScpKSwKICAgICAgICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkJywgYW5pbWF0ZSgnMTAwbXMgMjVtcyBsaW5lYXInLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpKQogICAgICAgIF0pCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NlbGVjdC9zZWxlY3QtZXJyb3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGNoYW5nZSBhIHNlbGVjdCdzIGBtdWx0aXBsZWAgb3B0aW9uCiAgICAgKiBhZnRlciBpbml0aWFsaXphdGlvbi4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRNYXRTZWxlY3REeW5hbWljTXVsdGlwbGVFcnJvcigpIHsKICAgICAgICByZXR1cm4gRXJyb3IoJ0Nhbm5vdCBjaGFuZ2UgYG11bHRpcGxlYCBtb2RlIG9mIHNlbGVjdCBhZnRlciBpbml0aWFsaXphdGlvbi4nKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBhc3NpZ24gYSBub24tYXJyYXkgdmFsdWUgdG8gYSBzZWxlY3QKICAgICAqIGluIGBtdWx0aXBsZWAgbW9kZS4gTm90ZSB0aGF0IGB1bmRlZmluZWRgIGFuZCBgbnVsbGAgYXJlIHN0aWxsIHZhbGlkIHZhbHVlcyB0byBhbGxvdyBmb3IKICAgICAqIHJlc2V0dGluZyB0aGUgdmFsdWUuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0U2VsZWN0Tm9uQXJyYXlWYWx1ZUVycm9yKCkgewogICAgICAgIHJldHVybiBFcnJvcignVmFsdWUgbXVzdCBiZSBhbiBhcnJheSBpbiBtdWx0aXBsZS1zZWxlY3Rpb24gbW9kZS4nKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4gYXNzaWduaW5nIGEgbm9uLWZ1bmN0aW9uIHZhbHVlIHRvIHRoZSBjb21wYXJhdG9yCiAgICAgKiB1c2VkIHRvIGRldGVybWluZSBpZiBhIHZhbHVlIGNvcnJlc3BvbmRzIHRvIGFuIG9wdGlvbi4gTm90ZSB0aGF0IHdoZXRoZXIgdGhlIGZ1bmN0aW9uCiAgICAgKiBhY3R1YWxseSB0YWtlcyB0d28gdmFsdWVzIGFuZCByZXR1cm5zIGEgYm9vbGVhbiBpcyBub3QgY2hlY2tlZC4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldE1hdFNlbGVjdE5vbkZ1bmN0aW9uVmFsdWVFcnJvcigpIHsKICAgICAgICByZXR1cm4gRXJyb3IoJ2Bjb21wYXJlV2l0aGAgbXVzdCBiZSBhIGZ1bmN0aW9uLicpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NlbGVjdC9zZWxlY3QudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5leHRVbmlxdWVJZCQ0ID0gMDsKICAgIC8qKgogICAgICogVGhlIG1heCBoZWlnaHQgb2YgdGhlIHNlbGVjdCdzIG92ZXJsYXkgcGFuZWwKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCA9IDI1NjsKICAgIC8qKgogICAgICogVGhlIHBhbmVsJ3MgcGFkZGluZyBvbiB0aGUgeC1heGlzCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgU0VMRUNUX1BBTkVMX1BBRERJTkdfWCA9IDE2OwogICAgLyoqCiAgICAgKiBUaGUgcGFuZWwncyB4IGF4aXMgcGFkZGluZyBpZiBpdCBpcyBpbmRlbnRlZCAoZS5nLiB0aGVyZSBpcyBhbiBvcHRpb24gZ3JvdXApLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFNFTEVDVF9QQU5FTF9JTkRFTlRfUEFERElOR19YID0gU0VMRUNUX1BBTkVMX1BBRERJTkdfWCAqIDI7CiAgICAvKioKICAgICAqIFRoZSBoZWlnaHQgb2YgdGhlIHNlbGVjdCBpdGVtcyBpbiBgZW1gIHVuaXRzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFNFTEVDVF9JVEVNX0hFSUdIVF9FTSA9IDM7CiAgICAvLyBUT0RPKGpvc2VwaHBlcnJvdHQpOiBSZXZlcnQgdG8gYSBjb25zdGFudCBhZnRlciAyMDE4IHNwZWMgdXBkYXRlcyBhcmUgZnVsbHkgbWVyZ2VkLgogICAgLyoqCiAgICAgKiBEaXN0YW5jZSBiZXR3ZWVuIHRoZSBwYW5lbCBlZGdlIGFuZCB0aGUgb3B0aW9uIHRleHQgaW4KICAgICAqIG11bHRpLXNlbGVjdGlvbiBtb2RlLgogICAgICoKICAgICAqIENhbGN1bGF0ZWQgYXM6CiAgICAgKiAoU0VMRUNUX1BBTkVMX1BBRERJTkdfWCAqIDEuNSkgKyAxNiA9IDQwCiAgICAgKiBUaGUgcGFkZGluZyBpcyBtdWx0aXBsaWVkIGJ5IDEuNSBiZWNhdXNlIHRoZSBjaGVja2JveCdzIG1hcmdpbiBpcyBoYWxmIHRoZSBwYWRkaW5nLgogICAgICogVGhlIGNoZWNrYm94IHdpZHRoIGlzIDE2cHguCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgU0VMRUNUX01VTFRJUExFX1BBTkVMX1BBRERJTkdfWCA9IFNFTEVDVF9QQU5FTF9QQURESU5HX1ggKiAxLjUgKyAxNjsKICAgIC8qKgogICAgICogVGhlIHNlbGVjdCBwYW5lbCB3aWxsIG9ubHkgImZpdCIgaW5zaWRlIHRoZSB2aWV3cG9ydCBpZiBpdCBpcyBwb3NpdGlvbmVkIGF0CiAgICAgKiB0aGlzIHZhbHVlIG9yIG1vcmUgYXdheSBmcm9tIHRoZSB2aWV3cG9ydCBib3VuZGFyeS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBTRUxFQ1RfUEFORUxfVklFV1BPUlRfUEFERElORyA9IDg7CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSBhIHNlbGVjdCBpcyBvcGVuLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtc2VsZWN0LXNjcm9sbC1zdHJhdGVneScpOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBvdmVybGF5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUl9GQUNUT1JZKG92ZXJsYXkpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSk7CiAgICB9CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyB0aGUgc2VsZWN0IG1vZHVsZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfU0VMRUNUX0NPTkZJRyA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX1NFTEVDVF9DT05GSUcnKTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUiA9IHsKICAgICAgICBwcm92aWRlOiBNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWSwKICAgICAgICBkZXBzOiBbT3ZlcmxheV0sCiAgICAgICAgdXNlRmFjdG9yeTogTUFUX1NFTEVDVF9TQ1JPTExfU1RSQVRFR1lfUFJPVklERVJfRkFDVE9SWSwKICAgIH07CiAgICAvKioKICAgICAqIENoYW5nZSBldmVudCBvYmplY3QgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIHNlbGVjdCB2YWx1ZSBoYXMgY2hhbmdlZC4KICAgICAqLwogICAgY2xhc3MgTWF0U2VsZWN0Q2hhbmdlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRTZWxlY3QuCiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdFNlbGVjdEJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9wYXJlbnRGb3JtCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybUdyb3VwCiAgICAgICAgICogQHBhcmFtIHs/fSBuZ0NvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgX3BhcmVudEZvcm0sIF9wYXJlbnRGb3JtR3JvdXAsIG5nQ29udHJvbCkgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciA9IF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudEZvcm0gPSBfcGFyZW50Rm9ybTsKICAgICAgICAgICAgdGhpcy5fcGFyZW50Rm9ybUdyb3VwID0gX3BhcmVudEZvcm1Hcm91cDsKICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSBuZ0NvbnRyb2w7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdFNlbGVjdE1peGluQmFzZSA9IG1peGluRGlzYWJsZVJpcHBsZShtaXhpblRhYkluZGV4KG1peGluRGlzYWJsZWQobWl4aW5FcnJvclN0YXRlKE1hdFNlbGVjdEJhc2UpKSkpOwogICAgLyoqCiAgICAgKiBBbGxvd3MgdGhlIHVzZXIgdG8gY3VzdG9taXplIHRoZSB0cmlnZ2VyIHRoYXQgaXMgZGlzcGxheWVkIHdoZW4gdGhlIHNlbGVjdCBoYXMgYSB2YWx1ZS4KICAgICAqLwogICAgY2xhc3MgTWF0U2VsZWN0VHJpZ2dlciB7CiAgICB9CiAgICBNYXRTZWxlY3RUcmlnZ2VyLsm1ZmFjID0gZnVuY3Rpb24gTWF0U2VsZWN0VHJpZ2dlcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTZWxlY3RUcmlnZ2VyKSgpOyB9OwogICAgTWF0U2VsZWN0VHJpZ2dlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRTZWxlY3RUcmlnZ2VyLCBzZWxlY3RvcnM6IFtbIm1hdC1zZWxlY3QtdHJpZ2dlciJdXSB9KTsKICAgIGNsYXNzIE1hdFNlbGVjdCBleHRlbmRzIF9NYXRTZWxlY3RNaXhpbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdwb3J0UnVsZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IF9wYXJlbnRGb3JtR3JvdXAKICAgICAgICAgKiBAcGFyYW0gez99IF9wYXJlbnRGb3JtRmllbGQKICAgICAgICAgKiBAcGFyYW0gez99IG5nQ29udHJvbAogICAgICAgICAqIEBwYXJhbSB7P30gdGFiSW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbFN0cmF0ZWd5RmFjdG9yeQogICAgICAgICAqIEBwYXJhbSB7P30gX2xpdmVBbm5vdW5jZXIKICAgICAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0cwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF92aWV3cG9ydFJ1bGVyLCBfY2hhbmdlRGV0ZWN0b3JSZWYsIF9uZ1pvbmUsIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIGVsZW1lbnRSZWYsIF9kaXIsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBfcGFyZW50Rm9ybUZpZWxkLCBuZ0NvbnRyb2wsIHRhYkluZGV4LCBzY3JvbGxTdHJhdGVneUZhY3RvcnksIF9saXZlQW5ub3VuY2VyLCBkZWZhdWx0cykgewogICAgICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBfcGFyZW50Rm9ybSwgX3BhcmVudEZvcm1Hcm91cCwgbmdDb250cm9sKTsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAgICAgdGhpcy5fcGFyZW50Rm9ybUZpZWxkID0gX3BhcmVudEZvcm1GaWVsZDsKICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSBuZ0NvbnRyb2w7CiAgICAgICAgICAgIHRoaXMuX2xpdmVBbm5vdW5jZXIgPSBfbGl2ZUFubm91bmNlcjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBvdmVybGF5IHBhbmVsIGlzIG9wZW4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wYW5lbE9wZW4gPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgZmlsbGluZyBvdXQgdGhlIHNlbGVjdCBpcyByZXF1aXJlZCBpbiB0aGUgZm9ybS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgc2Nyb2xsIHBvc2l0aW9uIG9mIHRoZSBvdmVybGF5IHBhbmVsLCBjYWxjdWxhdGVkIHRvIGNlbnRlciB0aGUgc2VsZWN0ZWQgb3B0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBpbiBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDb21wYXJpc29uIGZ1bmN0aW9uIHRvIHNwZWNpZnkgd2hpY2ggb3B0aW9uIGlzIGRpc3BsYXllZC4gRGVmYXVsdHMgdG8gb2JqZWN0IGVxdWFsaXR5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbzEKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvMgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG8xLCBvMikgPT4gbzEgPT09IG8yKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFVuaXF1ZSBpZCBmb3IgdGhpcyBpbnB1dC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3VpZCA9IGBtYXQtc2VsZWN0LSR7bmV4dFVuaXF1ZUlkJDQrK31gOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBpcyBkZXN0cm95ZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBjYWNoZWQgZm9udC1zaXplIG9mIHRoZSB0cmlnZ2VyIGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl90cmlnZ2VyRm9udFNpemUgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogYFZpZXcgLT4gbW9kZWwgY2FsbGJhY2sgY2FsbGVkIHdoZW4gdmFsdWUgY2hhbmdlc2AKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGBWaWV3IC0+IG1vZGVsIGNhbGxiYWNrIGNhbGxlZCB3aGVuIHNlbGVjdCBoYXMgYmVlbiB0b3VjaGVkYAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBJRHMgb2YgY2hpbGQgb3B0aW9ucyB0byBiZSBwYXNzZWQgdG8gdGhlIGFyaWEtb3ducyBhdHRyaWJ1dGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vcHRpb25JZHMgPSAnJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgc2VsZWN0IHBhbmVsJ3MgdHJhbnNmb3JtLW9yaWdpbiBwcm9wZXJ0eS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9ICd0b3AnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgcGFuZWwgZWxlbWVudCBpcyBmaW5pc2hlZCB0cmFuc2Zvcm1pbmcgaW4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wYW5lbERvbmVBbmltYXRpbmdTdHJlYW0gPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIHktb2Zmc2V0IG9mIHRoZSBvdmVybGF5IHBhbmVsIGluIHJlbGF0aW9uIHRvIHRoZSB0cmlnZ2VyJ3MgdG9wIHN0YXJ0IGNvcm5lci4KICAgICAgICAgICAgICogVGhpcyBtdXN0IGJlIGFkanVzdGVkIHRvIGFsaWduIHRoZSBzZWxlY3RlZCBvcHRpb24gdGV4dCBvdmVyIHRoZSB0cmlnZ2VyIHRleHQuCiAgICAgICAgICAgICAqIHdoZW4gdGhlIHBhbmVsIG9wZW5zLiBXaWxsIGNoYW5nZSBiYXNlZCBvbiB0aGUgeS1wb3NpdGlvbiBvZiB0aGUgc2VsZWN0ZWQgb3B0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGlzIHBvc2l0aW9uIGNvbmZpZyBlbnN1cmVzIHRoYXQgdGhlIHRvcCAic3RhcnQiIGNvcm5lciBvZiB0aGUgb3ZlcmxheQogICAgICAgICAgICAgKiBpcyBhbGlnbmVkIHdpdGggd2l0aCB0aGUgdG9wICJzdGFydCIgb2YgdGhlIG9yaWdpbiBieSBkZWZhdWx0IChvdmVybGFwcGluZwogICAgICAgICAgICAgKiB0aGUgdHJpZ2dlciBjb21wbGV0ZWx5KS4gSWYgdGhlIHBhbmVsIGNhbm5vdCBmaXQgYmVsb3cgdGhlIHRyaWdnZXIsIGl0CiAgICAgICAgICAgICAqIHdpbGwgZmFsbCBiYWNrIHRvIGEgcG9zaXRpb24gYWJvdmUgdGhlIHRyaWdnZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wb3NpdGlvbnMgPSBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogJ3N0YXJ0JywKICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiAndG9wJywKICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogJ3N0YXJ0JywKICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogJ3RvcCcsCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgIG9yaWdpblg6ICdzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWTogJ2JvdHRvbScsCiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVg6ICdzdGFydCcsCiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6ICdib3R0b20nLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgXTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxpbmcgY2VudGVyaW5nIG9mIHRoZSBhY3RpdmUgb3B0aW9uIG92ZXIgdGhlIHRyaWdnZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEEgbmFtZSBmb3IgdGhpcyBjb250cm9sIHRoYXQgY2FuIGJlIHVzZWQgYnkgYG1hdC1mb3JtLWZpZWxkYC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29udHJvbFR5cGUgPSAnbWF0LXNlbGVjdCc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBcmlhIGxhYmVsIG9mIHRoZSBzZWxlY3QuIElmIG5vdCBzcGVjaWZpZWQsIHRoZSBwbGFjZWhvbGRlciB3aWxsIGJlIHVzZWQgYXMgbGFiZWwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFyaWFMYWJlbCA9ICcnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29tYmluZWQgc3RyZWFtIG9mIGFsbCBvZiB0aGUgY2hpbGQgb3B0aW9ucycgY2hhbmdlIGV2ZW50cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcyA9ICgvKiogQHR5cGUgez99ICovIChkZWZlcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb25zID0gdGhpcy5vcHRpb25zOwogICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9ucy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG9wdGlvbnMpLCBzd2l0Y2hNYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gbWVyZ2UoLi4ub3B0aW9ucy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBvcHRpb24gPT4gb3B0aW9uLm9uU2VsZWN0aW9uQ2hhbmdlKSkpKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25nWm9uZS5vblN0YWJsZQogICAgICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKQogICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLm9wdGlvblNlbGVjdGlvbkNoYW5nZXMpKSk7CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgcGFuZWwgaGFzIGJlZW4gdG9nZ2xlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub3BlbmVkQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgaGFzIGJlZW4gb3BlbmVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb3BlbmVkU3RyZWFtID0gdGhpcy5vcGVuZWRDaGFuZ2UucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG8gPT4gbykpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KSkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3QgaGFzIGJlZW4gY2xvc2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY2xvc2VkU3RyZWFtID0gdGhpcy5vcGVuZWRDaGFuZ2UucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG8gPT4gIW8pKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSkpKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgc2VsZWN0ZWQgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBieSB0aGUgdXNlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmF3IHZhbHVlIG9mIHRoZSBzZWxlY3QgY2hhbmdlcy4gVGhpcyBpcyBoZXJlIHByaW1hcmlseQogICAgICAgICAgICAgKiB0byBmYWNpbGl0YXRlIHRoZSB0d28td2F5IGJpbmRpbmcgZm9yIHRoZSBgdmFsdWVgIGlucHV0LgogICAgICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSBwcm92aWRlIHRoZSB2YWx1ZSBhY2Nlc3NvciB0aHJvdWdoIGhlcmUsIGluc3RlYWQgb2YKICAgICAgICAgICAgICAgIC8vIHRoZSBgcHJvdmlkZXJzYCB0byBhdm9pZCBydW5uaW5nIGludG8gYSBjaXJjdWxhciBpbXBvcnQuCiAgICAgICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpczsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zY3JvbGxTdHJhdGVneUZhY3RvcnkgPSBzY3JvbGxTdHJhdGVneUZhY3Rvcnk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gdGhpcy5fc2Nyb2xsU3RyYXRlZ3lGYWN0b3J5KCk7CiAgICAgICAgICAgIHRoaXMudGFiSW5kZXggPSBwYXJzZUludCh0YWJJbmRleCkgfHwgMDsKICAgICAgICAgICAgLy8gRm9yY2Ugc2V0dGVyIHRvIGJlIGNhbGxlZCBpbiBjYXNlIGlkIHdhcyBub3Qgc3BlY2lmaWVkLgogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5pZDsKICAgICAgICAgICAgaWYgKGRlZmF1bHRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZGVmYXVsdHMuZGlzYWJsZU9wdGlvbkNlbnRlcmluZyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlT3B0aW9uQ2VudGVyaW5nID0gZGVmYXVsdHMuZGlzYWJsZU9wdGlvbkNlbnRlcmluZzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChkZWZhdWx0cy50eXBlYWhlYWREZWJvdW5jZUludGVydmFsICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwgPSBkZWZhdWx0cy50eXBlYWhlYWREZWJvdW5jZUludGVydmFsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHNlbGVjdCBpcyBmb2N1c2VkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGZvY3VzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9mb2N1c2VkIHx8IHRoaXMuX3BhbmVsT3BlbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUGxhY2Vob2xkZXIgdG8gYmUgc2hvd24gaWYgbm8gdmFsdWUgaGFzIGJlZW4gc2VsZWN0ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGxhY2Vob2xkZXIoKSB7IHJldHVybiB0aGlzLl9wbGFjZWhvbGRlcjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyByZXF1aXJlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByZXF1aXJlZCgpIHsgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHJlcXVpcmVkKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHNlbGVjdCBtdWx0aXBsZSBvcHRpb25zLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG11bHRpcGxlKCkgeyByZXR1cm4gdGhpcy5fbXVsdGlwbGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbXVsdGlwbGUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRTZWxlY3REeW5hbWljTXVsdGlwbGVFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byBjZW50ZXIgdGhlIGFjdGl2ZSBvcHRpb24gb3ZlciB0aGUgdHJpZ2dlci4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZU9wdGlvbkNlbnRlcmluZzsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXNhYmxlT3B0aW9uQ2VudGVyaW5nKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVPcHRpb25DZW50ZXJpbmcgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGdW5jdGlvbiB0byBjb21wYXJlIHRoZSBvcHRpb24gdmFsdWVzIHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlcy4gVGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICogaXMgYSB2YWx1ZSBmcm9tIGFuIG9wdGlvbi4gVGhlIHNlY29uZCBpcyBhIHZhbHVlIGZyb20gdGhlIHNlbGVjdGlvbi4gQSBib29sZWFuCiAgICAgICAgICogc2hvdWxkIGJlIHJldHVybmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNvbXBhcmVXaXRoKCkgeyByZXR1cm4gdGhpcy5fY29tcGFyZVdpdGg7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgY29tcGFyZVdpdGgoZm4pIHsKICAgICAgICAgICAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0U2VsZWN0Tm9uRnVuY3Rpb25WYWx1ZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsKSB7CiAgICAgICAgICAgICAgICAvLyBBIGRpZmZlcmVudCBjb21wYXJhdG9yIG1lYW5zIHRoZSBzZWxlY3Rpb24gY291bGQgY2hhbmdlLgogICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFZhbHVlIG9mIHRoZSBzZWxlY3QgY29udHJvbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB2YWx1ZSgpIHsgcmV0dXJuIHRoaXMuX3ZhbHVlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIGlmIChuZXdWYWx1ZSAhPT0gdGhpcy5fdmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMud3JpdGVWYWx1ZShuZXdWYWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZSA9IG5ld1ZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRpbWUgdG8gd2FpdCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgdGhlIGxhc3Qga2V5c3Ryb2tlIGJlZm9yZSBtb3ZpbmcgZm9jdXMgdG8gYW4gaXRlbS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0eXBlYWhlYWREZWJvdW5jZUludGVydmFsKCkgeyByZXR1cm4gdGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0eXBlYWhlYWREZWJvdW5jZUludGVydmFsKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwgPSBjb2VyY2VOdW1iZXJQcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVuaXF1ZSBpZCBvZiB0aGUgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBpZCgpIHsgcmV0dXJuIHRoaXMuX2lkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGlkKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2lkID0gdmFsdWUgfHwgdGhpcy5fdWlkOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsKHRoaXMubXVsdGlwbGUpOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgYGRpc3RpbmN0VW50aWxDaGFuZ2VkYCBoZXJlLCBiZWNhdXNlIHNvbWUgYnJvd3NlcnMgd2lsbAogICAgICAgICAgICAvLyBmaXJlIHRoZSBhbmltYXRpb24gZW5kIGV2ZW50IHR3aWNlIGZvciB0aGUgc2FtZSBhbmltYXRpb24uIFNlZToKICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvYW5ndWxhci9pc3N1ZXMvMjQwODQKICAgICAgICAgICAgdGhpcy5fcGFuZWxEb25lQW5pbWF0aW5nU3RyZWFtCiAgICAgICAgICAgICAgICAucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhbmVsT3BlbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvcCA9IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuZWRDaGFuZ2UuZW1pdCh0cnVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbmVkQ2hhbmdlLmVtaXQoZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheURpci5vZmZzZXRYID0gMDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFJ1bGVyLmNoYW5nZSgpCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmlnZ2VyUmVjdCA9IHRoaXMudHJpZ2dlci5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlckNvbnRlbnRJbml0KCkgewogICAgICAgICAgICB0aGlzLl9pbml0S2V5TWFuYWdlcigpOwogICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jaGFuZ2VkLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICBldmVudC5hZGRlZC5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnNlbGVjdCgpKSk7CiAgICAgICAgICAgICAgICBldmVudC5yZW1vdmVkLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb24KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uZGVzZWxlY3QoKSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9yZXNldE9wdGlvbnMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2luaXRpYWxpemVTZWxlY3Rpb24oKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nRG9DaGVjaygpIHsKICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUVycm9yU3RhdGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgLy8gVXBkYXRpbmcgdGhlIGRpc2FibGVkIHN0YXRlIGlzIGhhbmRsZWQgYnkgYG1peGluRGlzYWJsZWRgLCBidXQgd2UgbmVlZCB0byBhZGRpdGlvbmFsbHkgbGV0CiAgICAgICAgICAgIC8vIHRoZSBwYXJlbnQgZm9ybSBmaWVsZCBrbm93IHRvIHJ1biBjaGFuZ2UgZGV0ZWN0aW9uIHdoZW4gdGhlIGRpc2FibGVkIHN0YXRlIGNoYW5nZXMuCiAgICAgICAgICAgIGlmIChjaGFuZ2VzWydkaXNhYmxlZCddKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwnXSAmJiB0aGlzLl9rZXlNYW5hZ2VyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLndpdGhUeXBlQWhlYWQodGhpcy5fdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveS5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3kuY29tcGxldGUoKTsKICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVG9nZ2xlcyB0aGUgb3ZlcmxheSBwYW5lbCBvcGVuIG9yIGNsb3NlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvZ2dsZSgpIHsKICAgICAgICAgICAgdGhpcy5wYW5lbE9wZW4gPyB0aGlzLmNsb3NlKCkgOiB0aGlzLm9wZW4oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogT3BlbnMgdGhlIG92ZXJsYXkgcGFuZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvcGVuKCkgewogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5vcHRpb25zIHx8ICF0aGlzLm9wdGlvbnMubGVuZ3RoIHx8IHRoaXMuX3BhbmVsT3BlbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJSZWN0ID0gdGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBjb21wdXRlZCBmb250LXNpemUgd2lsbCBiZSBhIHN0cmluZyBwaXhlbCB2YWx1ZSAoZS5nLiAiMTZweCIpLgogICAgICAgICAgICAvLyBgcGFyc2VJbnRgIGlnbm9yZXMgdGhlIHRyYWlsaW5nICdweCcgYW5kIGNvbnZlcnRzIHRoaXMgdG8gYSBudW1iZXIuCiAgICAgICAgICAgIHRoaXMuX3RyaWdnZXJGb250U2l6ZSA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUodGhpcy50cmlnZ2VyLm5hdGl2ZUVsZW1lbnQpLmZvbnRTaXplIHx8ICcwJyk7CiAgICAgICAgICAgIHRoaXMuX3BhbmVsT3BlbiA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIud2l0aEhvcml6b250YWxPcmllbnRhdGlvbihudWxsKTsKICAgICAgICAgICAgdGhpcy5fY2FsY3VsYXRlT3ZlcmxheVBvc2l0aW9uKCk7CiAgICAgICAgICAgIHRoaXMuX2hpZ2hsaWdodENvcnJlY3RPcHRpb24oKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIC8vIFNldCB0aGUgZm9udCBzaXplIG9uIHRoZSBwYW5lbCBlbGVtZW50IG9uY2UgaXQgZXhpc3RzLgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUuYXNPYnNlcnZhYmxlKCkucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3RyaWdnZXJGb250U2l6ZSAmJiB0aGlzLm92ZXJsYXlEaXIub3ZlcmxheVJlZiAmJgogICAgICAgICAgICAgICAgICAgIHRoaXMub3ZlcmxheURpci5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vdmVybGF5RGlyLm92ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuc3R5bGUuZm9udFNpemUgPSBgJHt0aGlzLl90cmlnZ2VyRm9udFNpemV9cHhgOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsb3NlcyB0aGUgb3ZlcmxheSBwYW5lbCBhbmQgZm9jdXNlcyB0aGUgaG9zdCBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xvc2UoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhbmVsT3BlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2lzUnRsKCkgPyAncnRsJyA6ICdsdHInKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgc2VsZWN0J3MgdmFsdWUuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZQogICAgICAgICAqIHJlcXVpcmVkIHRvIGludGVncmF0ZSB3aXRoIEFuZ3VsYXIncyBjb3JlIGZvcm1zIEFQSS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgTmV3IHZhbHVlIHRvIGJlIHdyaXR0ZW4gdG8gdGhlIG1vZGVsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd3JpdGVWYWx1ZSh2YWx1ZSkgewogICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTYXZlcyBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgd2hlbiB0aGUgc2VsZWN0J3MgdmFsdWUKICAgICAgICAgKiBjaGFuZ2VzIGZyb20gdXNlciBpbnB1dC4gUGFydCBvZiB0aGUgQ29udHJvbFZhbHVlQWNjZXNzb3IgaW50ZXJmYWNlCiAgICAgICAgICogcmVxdWlyZWQgdG8gaW50ZWdyYXRlIHdpdGggQW5ndWxhcidzIGNvcmUgZm9ybXMgQVBJLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBDYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2F2ZXMgYSBjYWxsYmFjayBmdW5jdGlvbiB0byBiZSBpbnZva2VkIHdoZW4gdGhlIHNlbGVjdCBpcyBibHVycmVkCiAgICAgICAgICogYnkgdGhlIHVzZXIuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZSByZXF1aXJlZAogICAgICAgICAqIHRvIGludGVncmF0ZSB3aXRoIEFuZ3VsYXIncyBjb3JlIGZvcm1zIEFQSS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4gQ2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiB0b3VjaGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGVzIHRoZSBzZWxlY3QuIFBhcnQgb2YgdGhlIENvbnRyb2xWYWx1ZUFjY2Vzc29yIGludGVyZmFjZSByZXF1aXJlZAogICAgICAgICAqIHRvIGludGVncmF0ZSB3aXRoIEFuZ3VsYXIncyBjb3JlIGZvcm1zIEFQSS4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZCBTZXRzIHdoZXRoZXIgdGhlIGNvbXBvbmVudCBpcyBkaXNhYmxlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZCkgewogICAgICAgICAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIG92ZXJsYXkgcGFuZWwgaXMgb3Blbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwYW5lbE9wZW4oKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYW5lbE9wZW47CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgb3B0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkIDogdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB2YWx1ZSBkaXNwbGF5ZWQgaW4gdGhlIHRyaWdnZXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdHJpZ2dlclZhbHVlKCkgewogICAgICAgICAgICBpZiAodGhpcy5lbXB0eSkgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWQubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnZpZXdWYWx1ZSkpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzUnRsKCkpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE9wdGlvbnMucmV2ZXJzZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gVE9ETyhjcmlzYmV0byk6IGRlbGltaXRlciBzaG91bGQgYmUgY29uZmlndXJhYmxlIGZvciBwcm9wZXIgbG9jYWxpemF0aW9uLgogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkT3B0aW9ucy5qb2luKCcsICcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXS52aWV3VmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGVsZW1lbnQgaXMgaW4gUlRMIG1vZGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNSdGwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXIgPyB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnIDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgYWxsIGtleWRvd24gZXZlbnRzIG9uIHRoZSBzZWxlY3QuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBhbmVsT3BlbiA/IHRoaXMuX2hhbmRsZU9wZW5LZXlkb3duKGV2ZW50KSA6IHRoaXMuX2hhbmRsZUNsb3NlZEtleWRvd24oZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMga2V5Ym9hcmQgZXZlbnRzIHdoaWxlIHRoZSBzZWxlY3QgaXMgY2xvc2VkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUNsb3NlZEtleWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc0Fycm93S2V5ID0ga2V5Q29kZSA9PT0gRE9XTl9BUlJPVyB8fCBrZXlDb2RlID09PSBVUF9BUlJPVyB8fAogICAgICAgICAgICAgICAga2V5Q29kZSA9PT0gTEVGVF9BUlJPVyB8fCBrZXlDb2RlID09PSBSSUdIVF9BUlJPVzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc09wZW5LZXkgPSBrZXlDb2RlID09PSBFTlRFUiB8fCBrZXlDb2RlID09PSBTUEFDRTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYW5hZ2VyID0gdGhpcy5fa2V5TWFuYWdlcjsKICAgICAgICAgICAgLy8gT3BlbiB0aGUgc2VsZWN0IG9uIEFMVCArIGFycm93IGtleSB0byBtYXRjaCB0aGUgbmF0aXZlIDxzZWxlY3Q+CiAgICAgICAgICAgIGlmICghbWFuYWdlci5pc1R5cGluZygpICYmIChpc09wZW5LZXkgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KSkgfHwKICAgICAgICAgICAgICAgICgodGhpcy5tdWx0aXBsZSB8fCBldmVudC5hbHRLZXkpICYmIGlzQXJyb3dLZXkpKSB7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOyAvLyBwcmV2ZW50cyB0aGUgcGFnZSBmcm9tIHNjcm9sbGluZyBkb3duIHdoZW4gcHJlc3Npbmcgc3BhY2UKICAgICAgICAgICAgICAgIHRoaXMub3BlbigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLm11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2aW91c2x5U2VsZWN0ZWRPcHRpb24gPSB0aGlzLnNlbGVjdGVkOwogICAgICAgICAgICAgICAgaWYgKGtleUNvZGUgPT09IEhPTUUgfHwga2V5Q29kZSA9PT0gRU5EKSB7CiAgICAgICAgICAgICAgICAgICAga2V5Q29kZSA9PT0gSE9NRSA/IG1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCkgOiBtYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIG1hbmFnZXIub25LZXlkb3duKGV2ZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkT3B0aW9uID0gdGhpcy5zZWxlY3RlZDsKICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSB2YWx1ZSBoYXMgY2hhbmdlZCwgd2UgbmVlZCB0byBhbm5vdW5jZSBpdCBvdXJzZWx2ZXMuCiAgICAgICAgICAgICAgICBpZiAoc2VsZWN0ZWRPcHRpb24gJiYgcHJldmlvdXNseVNlbGVjdGVkT3B0aW9uICE9PSBzZWxlY3RlZE9wdGlvbikgewogICAgICAgICAgICAgICAgICAgIC8vIFdlIHNldCBhIGR1cmF0aW9uIG9uIHRoZSBsaXZlIGFubm91bmNlbWVudCwgYmVjYXVzZSB3ZSB3YW50IHRoZSBsaXZlIGVsZW1lbnQgdG8gYmUKICAgICAgICAgICAgICAgICAgICAvLyBjbGVhcmVkIGFmdGVyIGEgd2hpbGUgc28gdGhhdCB1c2VycyBjYW4ndCBuYXZpZ2F0ZSB0byBpdCB1c2luZyB0aGUgYXJyb3cga2V5cy4KICAgICAgICAgICAgICAgICAgICB0aGlzLl9saXZlQW5ub3VuY2VyLmFubm91bmNlKCgoLyoqIEB0eXBlIHs/fSAqLyAoc2VsZWN0ZWRPcHRpb24pKSkudmlld1ZhbHVlLCAxMDAwMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlcyBrZXlib2FyZCBldmVudHMgd2hlbiB0aGUgc2VsZWN0ZWQgaXMgb3Blbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVPcGVuS2V5ZG93bihldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1hbmFnZXIgPSB0aGlzLl9rZXlNYW5hZ2VyOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzQXJyb3dLZXkgPSBrZXlDb2RlID09PSBET1dOX0FSUk9XIHx8IGtleUNvZGUgPT09IFVQX0FSUk9XOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzVHlwaW5nID0gbWFuYWdlci5pc1R5cGluZygpOwogICAgICAgICAgICBpZiAoa2V5Q29kZSA9PT0gSE9NRSB8fCBrZXlDb2RlID09PSBFTkQpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBrZXlDb2RlID09PSBIT01FID8gbWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKSA6IG1hbmFnZXIuc2V0TGFzdEl0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc0Fycm93S2V5ICYmIGV2ZW50LmFsdEtleSkgewogICAgICAgICAgICAgICAgLy8gQ2xvc2UgdGhlIHNlbGVjdCBvbiBBTFQgKyBhcnJvdyBrZXkgdG8gbWF0Y2ggdGhlIG5hdGl2ZSA8c2VsZWN0PgogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGluIHRoaXMgY2FzZSBpZiB0aGUgdXNlciBpcyB0eXBpbmcsCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIHRoZSB0eXBpbmcgc2VxdWVuY2UgY2FuIGluY2x1ZGUgdGhlIHNwYWNlIGtleS4KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICghaXNUeXBpbmcgJiYgKGtleUNvZGUgPT09IEVOVEVSIHx8IGtleUNvZGUgPT09IFNQQUNFKSAmJiBtYW5hZ2VyLmFjdGl2ZUl0ZW0gJiYKICAgICAgICAgICAgICAgICFoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW0uX3NlbGVjdFZpYUludGVyYWN0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIWlzVHlwaW5nICYmIHRoaXMuX211bHRpcGxlICYmIGtleUNvZGUgPT09IEEgJiYgZXZlbnQuY3RybEtleSkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGhhc0Rlc2VsZWN0ZWRPcHRpb25zID0gdGhpcy5vcHRpb25zLnNvbWUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG9wdCA9PiAhb3B0LmRpc2FibGVkICYmICFvcHQuc2VsZWN0ZWQpKTsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9ucy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBvcHRpb24gPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghb3B0aW9uLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhhc0Rlc2VsZWN0ZWRPcHRpb25zID8gb3B0aW9uLnNlbGVjdCgpIDogb3B0aW9uLmRlc2VsZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcHJldmlvdXNseUZvY3VzZWRJbmRleCA9IG1hbmFnZXIuYWN0aXZlSXRlbUluZGV4OwogICAgICAgICAgICAgICAgbWFuYWdlci5vbktleWRvd24oZXZlbnQpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX211bHRpcGxlICYmIGlzQXJyb3dLZXkgJiYgZXZlbnQuc2hpZnRLZXkgJiYgbWFuYWdlci5hY3RpdmVJdGVtICYmCiAgICAgICAgICAgICAgICAgICAgbWFuYWdlci5hY3RpdmVJdGVtSW5kZXggIT09IHByZXZpb3VzbHlGb2N1c2VkSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLmFjdGl2ZUl0ZW0uX3NlbGVjdFZpYUludGVyYWN0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25Gb2N1cygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxscyB0aGUgdG91Y2hlZCBjYWxsYmFjayBvbmx5IGlmIHRoZSBwYW5lbCBpcyBjbG9zZWQuIE90aGVyd2lzZSwgdGhlIHRyaWdnZXIgd2lsbAogICAgICAgICAqICJibHVyIiB0byB0aGUgcGFuZWwgd2hlbiBpdCBvcGVucywgY2F1c2luZyBhIGZhbHNlIHBvc2l0aXZlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uQmx1cigpIHsKICAgICAgICAgICAgdGhpcy5fZm9jdXNlZCA9IGZhbHNlOwogICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgIXRoaXMucGFuZWxPcGVuKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGxiYWNrIHRoYXQgaXMgaW52b2tlZCB3aGVuIHRoZSBvdmVybGF5IHBhbmVsIGhhcyBiZWVuIGF0dGFjaGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uQXR0YWNoZWQoKSB7CiAgICAgICAgICAgIHRoaXMub3ZlcmxheURpci5wb3NpdGlvbkNoYW5nZS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WCgpOwogICAgICAgICAgICAgICAgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IHRoaXMuX3Njcm9sbFRvcDsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSB0aGVtZSB0byBiZSB1c2VkIG9uIHRoZSBwYW5lbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRQYW5lbFRoZW1lKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Rm9ybUZpZWxkID8gYG1hdC0ke3RoaXMuX3BhcmVudEZvcm1GaWVsZC5jb2xvcn1gIDogJyc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIHNlbGVjdCBoYXMgYSB2YWx1ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBlbXB0eSgpIHsKICAgICAgICAgICAgcmV0dXJuICF0aGlzLl9zZWxlY3Rpb25Nb2RlbCB8fCB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc0VtcHR5KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW5pdGlhbGl6ZVNlbGVjdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZXIgc2V0dGluZyB0aGUgdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlICJFeHByZXNzaW9uCiAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkIiBlcnJvcnMgZnJvbSBBbmd1bGFyLgogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5uZ0NvbnRyb2wgPyB0aGlzLm5nQ29udHJvbC52YWx1ZSA6IHRoaXMuX3ZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBzZWxlY3RlZCBvcHRpb24gYmFzZWQgb24gYSB2YWx1ZS4gSWYgbm8gb3B0aW9uIGNhbiBiZQogICAgICAgICAqIGZvdW5kIHdpdGggdGhlIGRlc2lnbmF0ZWQgdmFsdWUsIHRoZSBzZWxlY3QgdHJpZ2dlciBpcyBjbGVhcmVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFNlbGVjdGlvbkJ5VmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHRoaXMubXVsdGlwbGUgJiYgdmFsdWUpIHsKICAgICAgICAgICAgICAgIGlmICghQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRTZWxlY3ROb25BcnJheVZhbHVlRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudFZhbHVlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY3VycmVudFZhbHVlKSA9PiB0aGlzLl9zZWxlY3RWYWx1ZShjdXJyZW50VmFsdWUpKSk7CiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0VmFsdWVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5jbGVhcigpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29ycmVzcG9uZGluZ09wdGlvbiA9IHRoaXMuX3NlbGVjdFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGZvY3VzIHRvIHRoZSBhY3RpdmUgaXRlbS4gTm90ZSB0aGF0IHdlIHNob3VsZG4ndCBkbyB0aGlzIGluIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBtb2RlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCBvcHRpb24gdGhlIHVzZXIgaW50ZXJhY3RlZCB3aXRoIGxhc3QuCiAgICAgICAgICAgICAgICBpZiAoY29ycmVzcG9uZGluZ09wdGlvbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShjb3JyZXNwb25kaW5nT3B0aW9uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLnBhbmVsT3BlbikgewogICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSByZXNldCB0aGUgaGlnaGxpZ2h0ZWQgb3B0aW9uLiBOb3RlIHRoYXQgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgd2hpbGUKICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZWQsIGJlY2F1c2UgZG9pbmcgaXQgd2hpbGUgb3BlbiBjYW4gc2hpZnQgdGhlIHVzZXIncyBmb2N1cyB1bm5lY2Vzc2FyaWx5LgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSgtMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGFuZCBzZWxlY3RzIGFuZCBvcHRpb24gYmFzZWQgb24gaXRzIHZhbHVlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99IE9wdGlvbiB0aGF0IGhhcyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZS4KICAgICAgICAgKi8KICAgICAgICBfc2VsZWN0VmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5vcHRpb25zLmZpbmQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG9wdGlvbikgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyBUcmVhdCBudWxsIGFzIGEgc3BlY2lhbCByZXNldCB2YWx1ZS4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3B0aW9uLnZhbHVlICE9IG51bGwgJiYgdGhpcy5fY29tcGFyZVdpdGgob3B0aW9uLnZhbHVlLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNEZXZNb2RlKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90aWZ5IGRldmVsb3BlcnMgb2YgZXJyb3JzIGluIHRoZWlyIGNvbXBhcmF0b3IuCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnNvbGUud2FybihlcnJvcik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAoY29ycmVzcG9uZGluZ09wdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGNvcnJlc3BvbmRpbmdPcHRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBjb3JyZXNwb25kaW5nT3B0aW9uOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHVwIGEga2V5IG1hbmFnZXIgdG8gbGlzdGVuIHRvIGtleWJvYXJkIGV2ZW50cyBvbiB0aGUgb3ZlcmxheSBwYW5lbC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luaXRLZXlNYW5hZ2VyKCkgewogICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyKHRoaXMub3B0aW9ucykKICAgICAgICAgICAgICAgIC53aXRoVHlwZUFoZWFkKHRoaXMuX3R5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwpCiAgICAgICAgICAgICAgICAud2l0aFZlcnRpY2FsT3JpZW50YXRpb24oKQogICAgICAgICAgICAgICAgLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24odGhpcy5faXNSdGwoKSA/ICdydGwnIDogJ2x0cicpCiAgICAgICAgICAgICAgICAud2l0aEFsbG93ZWRNb2RpZmllcktleXMoWydzaGlmdEtleSddKTsKICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci50YWJPdXQucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIGFjdGl2ZSBpdGVtIHdoZW4gdGFiYmluZyBhd2F5LiBUaGlzIGlzIGNvbnNpc3RlbnQgd2l0aCBob3cgdGhlIG5hdGl2ZQogICAgICAgICAgICAgICAgICAgIC8vIHNlbGVjdCBiZWhhdmVzLiBOb3RlIHRoYXQgd2Ugb25seSB3YW50IHRvIGRvIHRoaXMgaW4gc2luZ2xlIHNlbGVjdGlvbiBtb2RlLgogICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aXBsZSAmJiB0aGlzLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBSZXN0b3JlIGZvY3VzIHRvIHRoZSB0cmlnZ2VyIGJlZm9yZSBjbG9zaW5nLiBFbnN1cmVzIHRoYXQgdGhlIGZvY3VzCiAgICAgICAgICAgICAgICAgICAgLy8gcG9zaXRpb24gd29uJ3QgYmUgbG9zdCBpZiB0aGUgdXNlciBnb3QgZm9jdXMgaW50byB0aGUgb3ZlcmxheS4KICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuY2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3kpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BhbmVsT3BlbiAmJiB0aGlzLnBhbmVsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsQWN0aXZlT3B0aW9uSW50b1ZpZXcoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLl9wYW5lbE9wZW4gJiYgIXRoaXMubXVsdGlwbGUgJiYgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERyb3BzIGN1cnJlbnQgb3B0aW9uIHN1YnNjcmlwdGlvbnMgYW5kIElEcyBhbmQgcmVzZXRzIGZyb20gc2NyYXRjaC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Jlc2V0T3B0aW9ucygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaGFuZ2VkT3JEZXN0cm95ZWQgPSBtZXJnZSh0aGlzLm9wdGlvbnMuY2hhbmdlcywgdGhpcy5fZGVzdHJveSk7CiAgICAgICAgICAgIHRoaXMub3B0aW9uU2VsZWN0aW9uQ2hhbmdlcy5waXBlKHRha2VVbnRpbChjaGFuZ2VkT3JEZXN0cm95ZWQpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9vblNlbGVjdChldmVudC5zb3VyY2UsIGV2ZW50LmlzVXNlcklucHV0KTsKICAgICAgICAgICAgICAgIGlmIChldmVudC5pc1VzZXJJbnB1dCAmJiAhdGhpcy5tdWx0aXBsZSAmJiB0aGlzLl9wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIExpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSBpbnRlcm5hbCBzdGF0ZSBvZiB0aGUgb3B0aW9ucyBhbmQgcmVhY3QgYWNjb3JkaW5nbHkuCiAgICAgICAgICAgIC8vIEhhbmRsZXMgY2FzZXMgbGlrZSB0aGUgbGFiZWxzIG9mIHRoZSBzZWxlY3RlZCBvcHRpb25zIGNoYW5naW5nLgogICAgICAgICAgICBtZXJnZSguLi50aGlzLm9wdGlvbnMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uX3N0YXRlQ2hhbmdlcykpKQogICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKGNoYW5nZWRPckRlc3Ryb3llZCkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX3NldE9wdGlvbklkcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbnZva2VkIHdoZW4gYW4gb3B0aW9uIGlzIGNsaWNrZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAqIEBwYXJhbSB7P30gaXNVc2VySW5wdXQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vblNlbGVjdChvcHRpb24sIGlzVXNlcklucHV0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd2FzU2VsZWN0ZWQgPSB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5pc1NlbGVjdGVkKG9wdGlvbik7CiAgICAgICAgICAgIGlmIChvcHRpb24udmFsdWUgPT0gbnVsbCAmJiAhdGhpcy5fbXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgIG9wdGlvbi5kZXNlbGVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3Byb3BhZ2F0ZUNoYW5nZXMob3B0aW9uLnZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCAhPT0gb3B0aW9uLnNlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgb3B0aW9uLnNlbGVjdGVkID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KG9wdGlvbikgOgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5kZXNlbGVjdChvcHRpb24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzVXNlcklucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKG9wdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRWYWx1ZXMoKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNVc2VySW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgdXNlciBzZWxlY3RlZCB0aGUgb3B0aW9uIHdpdGggdGhlaXIgbW91c2UsIHdlCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdhbnQgdG8gcmVzdG9yZSBmb2N1cyBiYWNrIHRvIHRoZSB0cmlnZ2VyLCBpbiBvcmRlciB0bwogICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHRoZSBzZWxlY3Qga2V5Ym9hcmQgY29udHJvbHMgZnJvbSBjbGFzaGluZyB3aXRoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBvbmVzIGZyb20gYG1hdC1vcHRpb25gLgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3YXNTZWxlY3RlZCAhPT0gdGhpcy5fc2VsZWN0aW9uTW9kZWwuaXNTZWxlY3RlZChvcHRpb24pKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcm9wYWdhdGVDaGFuZ2VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTb3J0cyB0aGUgc2VsZWN0ZWQgdmFsdWVzIGluIHRoZSBzZWxlY3RlZCBiYXNlZCBvbiB0aGVpciBvcmRlciBpbiB0aGUgcGFuZWwuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zb3J0VmFsdWVzKCkgewogICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb3B0aW9ucyA9IHRoaXMub3B0aW9ucy50b0FycmF5KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zb3J0KCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYQogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoYSwgYikgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNvcnRDb21wYXJhdG9yID8gdGhpcy5zb3J0Q29tcGFyYXRvcihhLCBiLCBvcHRpb25zKSA6CiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5kZXhPZihhKSAtIG9wdGlvbnMuaW5kZXhPZihiKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyBjaGFuZ2UgZXZlbnQgdG8gc2V0IHRoZSBtb2RlbCB2YWx1ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGZhbGxiYWNrVmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9wcm9wYWdhdGVDaGFuZ2VzKGZhbGxiYWNrVmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgdmFsdWVUb0VtaXQgPSBudWxsOwogICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgdmFsdWVUb0VtaXQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuc2VsZWN0ZWQpKSkubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3B0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBvcHRpb24gPT4gb3B0aW9uLnZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YWx1ZVRvRW1pdCA9IHRoaXMuc2VsZWN0ZWQgPyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuc2VsZWN0ZWQpKSkudmFsdWUgOiBmYWxsYmFja1ZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWVUb0VtaXQ7CiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh2YWx1ZVRvRW1pdCk7CiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKHZhbHVlVG9FbWl0KTsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdChuZXcgTWF0U2VsZWN0Q2hhbmdlKHRoaXMsIHZhbHVlVG9FbWl0KSk7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWNvcmRzIG9wdGlvbiBJRHMgdG8gcGFzcyB0byB0aGUgYXJpYS1vd25zIHByb3BlcnR5LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0T3B0aW9uSWRzKCkgewogICAgICAgICAgICB0aGlzLl9vcHRpb25JZHMgPSB0aGlzLm9wdGlvbnMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIG9wdGlvbiA9PiBvcHRpb24uaWQpKS5qb2luKCcgJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhpZ2hsaWdodHMgdGhlIHNlbGVjdGVkIGl0ZW0uIElmIG5vIG9wdGlvbiBpcyBzZWxlY3RlZCwgaXQgd2lsbCBoaWdobGlnaHQKICAgICAgICAgKiB0aGUgZmlyc3QgaXRlbSBpbnN0ZWFkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGlnaGxpZ2h0Q29ycmVjdE9wdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2tleU1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmVtcHR5KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbSh0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZFswXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2Nyb2xscyB0aGUgYWN0aXZlIG9wdGlvbiBpbnRvIHZpZXcuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zY3JvbGxBY3RpdmVPcHRpb25JbnRvVmlldygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhY3RpdmVPcHRpb25JbmRleCA9IHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4IHx8IDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGFiZWxDb3VudCA9IF9jb3VudEdyb3VwTGFiZWxzQmVmb3JlT3B0aW9uKGFjdGl2ZU9wdGlvbkluZGV4LCB0aGlzLm9wdGlvbnMsIHRoaXMub3B0aW9uR3JvdXBzKTsKICAgICAgICAgICAgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCA9IF9nZXRPcHRpb25TY3JvbGxQb3NpdGlvbihhY3RpdmVPcHRpb25JbmRleCArIGxhYmVsQ291bnQsIHRoaXMuX2dldEl0ZW1IZWlnaHQoKSwgdGhpcy5wYW5lbC5uYXRpdmVFbGVtZW50LnNjcm9sbFRvcCwgU0VMRUNUX1BBTkVMX01BWF9IRUlHSFQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIHRoZSBzZWxlY3QgZWxlbWVudC4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb2N1cyhvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5mb2N1cyhvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhlIHByb3ZpZGVkIG9wdGlvbiBpbiB0aGUgb3B0aW9uIGxpc3QuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE9wdGlvbkluZGV4KG9wdGlvbikgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zLnJlZHVjZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVzdWx0CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudAogICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVzdWx0LCBjdXJyZW50LCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHJlc3VsdCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvcHRpb24gPT09IGN1cnJlbnQgPyBpbmRleCA6IHVuZGVmaW5lZDsKICAgICAgICAgICAgfSksIHVuZGVmaW5lZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBhbmQgeC0gYW5kIHktb2Zmc2V0cyBvZiB0aGUgb3ZlcmxheSBwYW5lbC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhbGN1bGF0ZU92ZXJsYXlQb3NpdGlvbigpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gdGhpcy5fZ2V0SXRlbUNvdW50KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFuZWxIZWlnaHQgPSBNYXRoLm1pbihpdGVtcyAqIGl0ZW1IZWlnaHQsIFNFTEVDVF9QQU5FTF9NQVhfSEVJR0hUKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzY3JvbGxDb250YWluZXJIZWlnaHQgPSBpdGVtcyAqIGl0ZW1IZWlnaHQ7CiAgICAgICAgICAgIC8vIFRoZSBmYXJ0aGVzdCB0aGUgcGFuZWwgY2FuIGJlIHNjcm9sbGVkIGJlZm9yZSBpdCBoaXRzIHRoZSBib3R0b20KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXhTY3JvbGwgPSBzY3JvbGxDb250YWluZXJIZWlnaHQgLSBwYW5lbEhlaWdodDsKICAgICAgICAgICAgLy8gSWYgbm8gdmFsdWUgaXMgc2VsZWN0ZWQgd2Ugb3BlbiB0aGUgcG9wdXAgdG8gdGhlIGZpcnN0IGl0ZW0uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNlbGVjdGVkT3B0aW9uT2Zmc2V0ID0gdGhpcy5lbXB0eSA/IDAgOiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZ2V0T3B0aW9uSW5kZXgodGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0ZWRbMF0pKSk7CiAgICAgICAgICAgIHNlbGVjdGVkT3B0aW9uT2Zmc2V0ICs9IF9jb3VudEdyb3VwTGFiZWxzQmVmb3JlT3B0aW9uKHNlbGVjdGVkT3B0aW9uT2Zmc2V0LCB0aGlzLm9wdGlvbnMsIHRoaXMub3B0aW9uR3JvdXBzKTsKICAgICAgICAgICAgLy8gV2UgbXVzdCBtYWludGFpbiBhIHNjcm9sbCBidWZmZXIgc28gdGhlIHNlbGVjdGVkIG9wdGlvbiB3aWxsIGJlIHNjcm9sbGVkIHRvIHRoZQogICAgICAgICAgICAvLyBjZW50ZXIgb2YgdGhlIG92ZXJsYXkgcGFuZWwgcmF0aGVyIHRoYW4gdGhlIHRvcC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzY3JvbGxCdWZmZXIgPSBwYW5lbEhlaWdodCAvIDI7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFRvcCA9IHRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlTY3JvbGwoc2VsZWN0ZWRPcHRpb25PZmZzZXQsIHNjcm9sbEJ1ZmZlciwgbWF4U2Nyb2xsKTsKICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSA9IHRoaXMuX2NhbGN1bGF0ZU92ZXJsYXlPZmZzZXRZKHNlbGVjdGVkT3B0aW9uT2Zmc2V0LCBzY3JvbGxCdWZmZXIsIG1heFNjcm9sbCk7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrT3ZlcmxheVdpdGhpblZpZXdwb3J0KG1heFNjcm9sbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIHNjcm9sbCBwb3NpdGlvbiBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbC4KICAgICAgICAgKgogICAgICAgICAqIEF0dGVtcHRzIHRvIGNlbnRlciB0aGUgc2VsZWN0ZWQgb3B0aW9uIGluIHRoZSBwYW5lbC4gSWYgdGhlIG9wdGlvbiBpcwogICAgICAgICAqIHRvbyBoaWdoIG9yIHRvbyBsb3cgaW4gdGhlIHBhbmVsIHRvIGJlIHNjcm9sbGVkIHRvIHRoZSBjZW50ZXIsIGl0IGNsYW1wcyB0aGUKICAgICAgICAgKiBzY3JvbGwgcG9zaXRpb24gdG8gdGhlIG1pbiBvciBtYXggc2Nyb2xsIHBvc2l0aW9ucyByZXNwZWN0aXZlbHkuCiAgICAgICAgICogQHBhcmFtIHs/fSBzZWxlY3RlZEluZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxCdWZmZXIKICAgICAgICAgKiBAcGFyYW0gez99IG1heFNjcm9sbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhbGN1bGF0ZU92ZXJsYXlTY3JvbGwoc2VsZWN0ZWRJbmRleCwgc2Nyb2xsQnVmZmVyLCBtYXhTY3JvbGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbk9mZnNldEZyb21TY3JvbGxUb3AgPSBpdGVtSGVpZ2h0ICogc2VsZWN0ZWRJbmRleDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYWxmT3B0aW9uSGVpZ2h0ID0gaXRlbUhlaWdodCAvIDI7CiAgICAgICAgICAgIC8vIFN0YXJ0cyBhdCB0aGUgb3B0aW9uT2Zmc2V0RnJvbVNjcm9sbFRvcCwgd2hpY2ggc2Nyb2xscyB0aGUgb3B0aW9uIHRvIHRoZSB0b3Agb2YgdGhlCiAgICAgICAgICAgIC8vIHNjcm9sbCBjb250YWluZXIsIHRoZW4gc3VidHJhY3RzIHRoZSBzY3JvbGwgYnVmZmVyIHRvIHNjcm9sbCB0aGUgb3B0aW9uIGRvd24gdG8KICAgICAgICAgICAgLy8gdGhlIGNlbnRlciBvZiB0aGUgb3ZlcmxheSBwYW5lbC4gSGFsZiB0aGUgb3B0aW9uIGhlaWdodCBtdXN0IGJlIHJlLWFkZGVkIHRvIHRoZQogICAgICAgICAgICAvLyBzY3JvbGxUb3Agc28gdGhlIG9wdGlvbiBpcyBjZW50ZXJlZCBiYXNlZCBvbiBpdHMgbWlkZGxlLCBub3QgaXRzIHRvcCBlZGdlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGltYWxTY3JvbGxQb3NpdGlvbiA9IG9wdGlvbk9mZnNldEZyb21TY3JvbGxUb3AgLSBzY3JvbGxCdWZmZXIgKyBoYWxmT3B0aW9uSGVpZ2h0OwogICAgICAgICAgICByZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoMCwgb3B0aW1hbFNjcm9sbFBvc2l0aW9uKSwgbWF4U2Nyb2xsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgYXJpYS1sYWJlbCBvZiB0aGUgc2VsZWN0IGNvbXBvbmVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBcmlhTGFiZWwoKSB7CiAgICAgICAgICAgIC8vIElmIGFuIGFyaWFMYWJlbGxlZGJ5IHZhbHVlIGhhcyBiZWVuIHNldCBieSB0aGUgY29uc3VtZXIsIHRoZSBzZWxlY3Qgc2hvdWxkIG5vdCBvdmVyd3JpdGUgdGhlCiAgICAgICAgICAgIC8vIGBhcmlhLWxhYmVsbGVkYnlgIHZhbHVlIGJ5IHNldHRpbmcgdGhlIGFyaWFMYWJlbCB0byB0aGUgcGxhY2Vob2xkZXIuCiAgICAgICAgICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbGxlZGJ5ID8gbnVsbCA6IHRoaXMuYXJpYUxhYmVsIHx8IHRoaXMucGxhY2Vob2xkZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGFyaWEtbGFiZWxsZWRieSBvZiB0aGUgc2VsZWN0IGNvbXBvbmVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBcmlhTGFiZWxsZWRieSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuYXJpYUxhYmVsbGVkYnkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFyaWFMYWJlbGxlZGJ5OwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE5vdGU6IHdlIHVzZSBgX2dldEFyaWFMYWJlbGAgaGVyZSwgYmVjYXVzZSB3ZSB3YW50IHRvIGNoZWNrIHdoZXRoZXIgdGhlcmUncyBhCiAgICAgICAgICAgIC8vIGNvbXB1dGVkIGxhYmVsLiBgdGhpcy5hcmlhTGFiZWxgIGlzIG9ubHkgdGhlIHVzZXItc3BlY2lmaWVkIGxhYmVsLgogICAgICAgICAgICBpZiAoIXRoaXMuX3BhcmVudEZvcm1GaWVsZCB8fCAhdGhpcy5fcGFyZW50Rm9ybUZpZWxkLl9oYXNGbG9hdGluZ0xhYmVsKCkgfHwKICAgICAgICAgICAgICAgIHRoaXMuX2dldEFyaWFMYWJlbCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50Rm9ybUZpZWxkLl9sYWJlbElkIHx8IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIGBhcmlhLWFjdGl2ZWRlc2NlbmRhbnRgIHRvIGJlIHNldCBvbiB0aGUgaG9zdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBcmlhQWN0aXZlRGVzY2VuZGFudCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMucGFuZWxPcGVuICYmIHRoaXMuX2tleU1hbmFnZXIgJiYgdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fa2V5TWFuYWdlci5hY3RpdmVJdGVtLmlkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSB4LW9mZnNldCBvZiB0aGUgb3ZlcmxheSBwYW5lbCBpbiByZWxhdGlvbiB0byB0aGUgdHJpZ2dlcidzIHRvcCBzdGFydCBjb3JuZXIuCiAgICAgICAgICogVGhpcyBtdXN0IGJlIGFkanVzdGVkIHRvIGFsaWduIHRoZSBzZWxlY3RlZCBvcHRpb24gdGV4dCBvdmVyIHRoZSB0cmlnZ2VyIHRleHQgd2hlbgogICAgICAgICAqIHRoZSBwYW5lbCBvcGVucy4gV2lsbCBjaGFuZ2UgYmFzZWQgb24gTFRSIG9yIFJUTCB0ZXh0IGRpcmVjdGlvbi4gTm90ZSB0aGF0IHRoZSBvZmZzZXQKICAgICAgICAgKiBjYW4ndCBiZSBjYWxjdWxhdGVkIHVudGlsIHRoZSBwYW5lbCBoYXMgYmVlbiBhdHRhY2hlZCwgYmVjYXVzZSB3ZSBuZWVkIHRvIGtub3cgdGhlCiAgICAgICAgICogY29udGVudCB3aWR0aCBpbiBvcmRlciB0byBjb25zdHJhaW4gdGhlIHBhbmVsIHdpdGhpbiB0aGUgdmlld3BvcnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jYWxjdWxhdGVPdmVybGF5T2Zmc2V0WCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdmVybGF5UmVjdCA9IHRoaXMub3ZlcmxheURpci5vdmVybGF5UmVmLm92ZXJsYXlFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdwb3J0U2l6ZSA9IHRoaXMuX3ZpZXdwb3J0UnVsZXIuZ2V0Vmlld3BvcnRTaXplKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNSdGwgPSB0aGlzLl9pc1J0bCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhZGRpbmdXaWR0aCA9IHRoaXMubXVsdGlwbGUgPyBTRUxFQ1RfTVVMVElQTEVfUEFORUxfUEFERElOR19YICsgU0VMRUNUX1BBTkVMX1BBRERJTkdfWCA6CiAgICAgICAgICAgICAgICBTRUxFQ1RfUEFORUxfUEFERElOR19YICogMjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb2Zmc2V0WDsKICAgICAgICAgICAgLy8gQWRqdXN0IHRoZSBvZmZzZXQsIGRlcGVuZGluZyBvbiB0aGUgb3B0aW9uIHBhZGRpbmcuCiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICBvZmZzZXRYID0gU0VMRUNUX01VTFRJUExFX1BBTkVMX1BBRERJTkdfWDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBzZWxlY3RlZCA9IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdIHx8IHRoaXMub3B0aW9ucy5maXJzdDsKICAgICAgICAgICAgICAgIG9mZnNldFggPSBzZWxlY3RlZCAmJiBzZWxlY3RlZC5ncm91cCA/IFNFTEVDVF9QQU5FTF9JTkRFTlRfUEFERElOR19YIDogU0VMRUNUX1BBTkVMX1BBRERJTkdfWDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJbnZlcnQgdGhlIG9mZnNldCBpbiBMVFIuCiAgICAgICAgICAgIGlmICghaXNSdGwpIHsKICAgICAgICAgICAgICAgIG9mZnNldFggKj0gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRGV0ZXJtaW5lIGhvdyBtdWNoIHRoZSBzZWxlY3Qgb3ZlcmZsb3dzIG9uIGVhY2ggc2lkZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsZWZ0T3ZlcmZsb3cgPSAwIC0gKG92ZXJsYXlSZWN0LmxlZnQgKyBvZmZzZXRYIC0gKGlzUnRsID8gcGFkZGluZ1dpZHRoIDogMCkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJpZ2h0T3ZlcmZsb3cgPSBvdmVybGF5UmVjdC5yaWdodCArIG9mZnNldFggLSB2aWV3cG9ydFNpemUud2lkdGgKICAgICAgICAgICAgICAgICsgKGlzUnRsID8gMCA6IHBhZGRpbmdXaWR0aCk7CiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IG92ZXJmbG93cyBvbiBlaXRoZXIgc2lkZSwgcmVkdWNlIHRoZSBvZmZzZXQgdG8gYWxsb3cgaXQgdG8gZml0LgogICAgICAgICAgICBpZiAobGVmdE92ZXJmbG93ID4gMCkgewogICAgICAgICAgICAgICAgb2Zmc2V0WCArPSBsZWZ0T3ZlcmZsb3cgKyBTRUxFQ1RfUEFORUxfVklFV1BPUlRfUEFERElORzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyaWdodE92ZXJmbG93ID4gMCkgewogICAgICAgICAgICAgICAgb2Zmc2V0WCAtPSByaWdodE92ZXJmbG93ICsgU0VMRUNUX1BBTkVMX1ZJRVdQT1JUX1BBRERJTkc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2V0IHRoZSBvZmZzZXQgZGlyZWN0bHkgaW4gb3JkZXIgdG8gYXZvaWQgaGF2aW5nIHRvIGdvIHRocm91Z2ggY2hhbmdlIGRldGVjdGlvbiBhbmQKICAgICAgICAgICAgLy8gcG90ZW50aWFsbHkgdHJpZ2dlcmluZyAiY2hhbmdlZCBhZnRlciBpdCB3YXMgY2hlY2tlZCIgZXJyb3JzLiBSb3VuZCB0aGUgdmFsdWUgdG8gYXZvaWQKICAgICAgICAgICAgLy8gYmx1cnJ5IGNvbnRlbnQgaW4gc29tZSBicm93c2Vycy4KICAgICAgICAgICAgdGhpcy5vdmVybGF5RGlyLm9mZnNldFggPSBNYXRoLnJvdW5kKG9mZnNldFgpOwogICAgICAgICAgICB0aGlzLm92ZXJsYXlEaXIub3ZlcmxheVJlZi51cGRhdGVQb3NpdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSB5LW9mZnNldCBvZiB0aGUgc2VsZWN0J3Mgb3ZlcmxheSBwYW5lbCBpbiByZWxhdGlvbiB0byB0aGUKICAgICAgICAgKiB0b3Agc3RhcnQgY29ybmVyIG9mIHRoZSB0cmlnZ2VyLiBJdCBoYXMgdG8gYmUgYWRqdXN0ZWQgaW4gb3JkZXIgZm9yIHRoZQogICAgICAgICAqIHNlbGVjdGVkIG9wdGlvbiB0byBiZSBhbGlnbmVkIG92ZXIgdGhlIHRyaWdnZXIgd2hlbiB0aGUgcGFuZWwgb3BlbnMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHNlbGVjdGVkSW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbEJ1ZmZlcgogICAgICAgICAqIEBwYXJhbSB7P30gbWF4U2Nyb2xsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2FsY3VsYXRlT3ZlcmxheU9mZnNldFkoc2VsZWN0ZWRJbmRleCwgc2Nyb2xsQnVmZmVyLCBtYXhTY3JvbGwpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkhlaWdodEFkanVzdG1lbnQgPSAoaXRlbUhlaWdodCAtIHRoaXMuX3RyaWdnZXJSZWN0LmhlaWdodCkgLyAyOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heE9wdGlvbnNEaXNwbGF5ZWQgPSBNYXRoLmZsb29yKFNFTEVDVF9QQU5FTF9NQVhfSEVJR0hUIC8gaXRlbUhlaWdodCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG9wdGlvbk9mZnNldEZyb21QYW5lbFRvcDsKICAgICAgICAgICAgLy8gRGlzYWJsZSBvZmZzZXQgaWYgcmVxdWVzdGVkIGJ5IHVzZXIgYnkgcmV0dXJuaW5nIDAgYXMgdmFsdWUgdG8gb2Zmc2V0CiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNhYmxlT3B0aW9uQ2VudGVyaW5nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fc2Nyb2xsVG9wID09PSAwKSB7CiAgICAgICAgICAgICAgICBvcHRpb25PZmZzZXRGcm9tUGFuZWxUb3AgPSBzZWxlY3RlZEluZGV4ICogaXRlbUhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLl9zY3JvbGxUb3AgPT09IG1heFNjcm9sbCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmlyc3REaXNwbGF5ZWRJbmRleCA9IHRoaXMuX2dldEl0ZW1Db3VudCgpIC0gbWF4T3B0aW9uc0Rpc3BsYXllZDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkRGlzcGxheUluZGV4ID0gc2VsZWN0ZWRJbmRleCAtIGZpcnN0RGlzcGxheWVkSW5kZXg7CiAgICAgICAgICAgICAgICAvLyBUaGUgZmlyc3QgaXRlbSBpcyBwYXJ0aWFsbHkgb3V0IG9mIHRoZSB2aWV3cG9ydC4gVGhlcmVmb3JlIHdlIG5lZWQgdG8gY2FsY3VsYXRlIHdoYXQKICAgICAgICAgICAgICAgIC8vIHBvcnRpb24gb2YgaXQgaXMgc2hvd24gaW4gdGhlIHZpZXdwb3J0IGFuZCBhY2NvdW50IGZvciBpdCBpbiBvdXIgb2Zmc2V0LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHBhcnRpYWxJdGVtSGVpZ2h0ID0gaXRlbUhlaWdodCAtICh0aGlzLl9nZXRJdGVtQ291bnQoKSAqIGl0ZW1IZWlnaHQgLSBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCkgJSBpdGVtSGVpZ2h0OwogICAgICAgICAgICAgICAgLy8gQmVjYXVzZSB0aGUgcGFuZWwgaGVpZ2h0IGlzIGxvbmdlciB0aGFuIHRoZSBoZWlnaHQgb2YgdGhlIG9wdGlvbnMgYWxvbmUsCiAgICAgICAgICAgICAgICAvLyB0aGVyZSBpcyBhbHdheXMgZXh0cmEgcGFkZGluZyBhdCB0aGUgdG9wIG9yIGJvdHRvbSBvZiB0aGUgcGFuZWwuIFdoZW4KICAgICAgICAgICAgICAgIC8vIHNjcm9sbGVkIHRvIHRoZSB2ZXJ5IGJvdHRvbSwgdGhpcyBwYWRkaW5nIGlzIGF0IHRoZSB0b3Agb2YgdGhlIHBhbmVsIGFuZAogICAgICAgICAgICAgICAgLy8gbXVzdCBiZSBhZGRlZCB0byB0aGUgb2Zmc2V0LgogICAgICAgICAgICAgICAgb3B0aW9uT2Zmc2V0RnJvbVBhbmVsVG9wID0gc2VsZWN0ZWREaXNwbGF5SW5kZXggKiBpdGVtSGVpZ2h0ICsgcGFydGlhbEl0ZW1IZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgb3B0aW9uIHdhcyBzY3JvbGxlZCB0byB0aGUgbWlkZGxlIG9mIHRoZSBwYW5lbCB1c2luZyBhIHNjcm9sbCBidWZmZXIsCiAgICAgICAgICAgICAgICAvLyBpdHMgb2Zmc2V0IHdpbGwgYmUgdGhlIHNjcm9sbCBidWZmZXIgbWludXMgdGhlIGhhbGYgaGVpZ2h0IHRoYXQgd2FzIGFkZGVkIHRvCiAgICAgICAgICAgICAgICAvLyBjZW50ZXIgaXQuCiAgICAgICAgICAgICAgICBvcHRpb25PZmZzZXRGcm9tUGFuZWxUb3AgPSBzY3JvbGxCdWZmZXIgLSBpdGVtSGVpZ2h0IC8gMjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBUaGUgZmluYWwgb2Zmc2V0IGlzIHRoZSBvcHRpb24ncyBvZmZzZXQgZnJvbSB0aGUgdG9wLCBhZGp1c3RlZCBmb3IgdGhlIGhlaWdodCBkaWZmZXJlbmNlLAogICAgICAgICAgICAvLyBtdWx0aXBsaWVkIGJ5IC0xIHRvIGVuc3VyZSB0aGF0IHRoZSBvdmVybGF5IG1vdmVzIGluIHRoZSBjb3JyZWN0IGRpcmVjdGlvbiB1cCB0aGUgcGFnZS4KICAgICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIHJvdW5kZWQgdG8gcHJldmVudCBzb21lIGJyb3dzZXJzIGZyb20gYmx1cnJpbmcgdGhlIGNvbnRlbnQuCiAgICAgICAgICAgIHJldHVybiBNYXRoLnJvdW5kKG9wdGlvbk9mZnNldEZyb21QYW5lbFRvcCAqIC0xIC0gb3B0aW9uSGVpZ2h0QWRqdXN0bWVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB0aGF0IHRoZSBhdHRlbXB0ZWQgb3ZlcmxheSBwb3NpdGlvbiB3aWxsIGZpdCB3aXRoaW4gdGhlIHZpZXdwb3J0LgogICAgICAgICAqIElmIGl0IHdpbGwgbm90IGZpdCwgdHJpZXMgdG8gYWRqdXN0IHRoZSBzY3JvbGwgcG9zaXRpb24gYW5kIHRoZSBhc3NvY2lhdGVkCiAgICAgICAgICogeS1vZmZzZXQgc28gdGhlIHBhbmVsIGNhbiBvcGVuIGZ1bGx5IG9uLXNjcmVlbi4gSWYgaXQgc3RpbGwgd29uJ3QgZml0LAogICAgICAgICAqIHNldHMgdGhlIG9mZnNldCBiYWNrIHRvIDAgdG8gYWxsb3cgdGhlIGZhbGxiYWNrIHBvc2l0aW9uIHRvIHRha2Ugb3Zlci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbWF4U2Nyb2xsCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2hlY2tPdmVybGF5V2l0aGluVmlld3BvcnQobWF4U2Nyb2xsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXRlbUhlaWdodCA9IHRoaXMuX2dldEl0ZW1IZWlnaHQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3cG9ydFNpemUgPSB0aGlzLl92aWV3cG9ydFJ1bGVyLmdldFZpZXdwb3J0U2l6ZSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRvcFNwYWNlQXZhaWxhYmxlID0gdGhpcy5fdHJpZ2dlclJlY3QudG9wIC0gU0VMRUNUX1BBTkVMX1ZJRVdQT1JUX1BBRERJTkc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm90dG9tU3BhY2VBdmFpbGFibGUgPSB2aWV3cG9ydFNpemUuaGVpZ2h0IC0gdGhpcy5fdHJpZ2dlclJlY3QuYm90dG9tIC0gU0VMRUNUX1BBTkVMX1ZJRVdQT1JUX1BBRERJTkc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFuZWxIZWlnaHRUb3AgPSBNYXRoLmFicyh0aGlzLl9vZmZzZXRZKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0b3RhbFBhbmVsSGVpZ2h0ID0gTWF0aC5taW4odGhpcy5fZ2V0SXRlbUNvdW50KCkgKiBpdGVtSGVpZ2h0LCBTRUxFQ1RfUEFORUxfTUFYX0hFSUdIVCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFuZWxIZWlnaHRCb3R0b20gPSB0b3RhbFBhbmVsSGVpZ2h0IC0gcGFuZWxIZWlnaHRUb3AgLSB0aGlzLl90cmlnZ2VyUmVjdC5oZWlnaHQ7CiAgICAgICAgICAgIGlmIChwYW5lbEhlaWdodEJvdHRvbSA+IGJvdHRvbVNwYWNlQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGp1c3RQYW5lbFVwKHBhbmVsSGVpZ2h0Qm90dG9tLCBib3R0b21TcGFjZUF2YWlsYWJsZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocGFuZWxIZWlnaHRUb3AgPiB0b3BTcGFjZUF2YWlsYWJsZSkgewogICAgICAgICAgICAgICAgdGhpcy5fYWRqdXN0UGFuZWxEb3duKHBhbmVsSGVpZ2h0VG9wLCB0b3BTcGFjZUF2YWlsYWJsZSwgbWF4U2Nyb2xsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGp1c3RzIHRoZSBvdmVybGF5IHBhbmVsIHVwIHRvIGZpdCBpbiB0aGUgdmlld3BvcnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBhbmVsSGVpZ2h0Qm90dG9tCiAgICAgICAgICogQHBhcmFtIHs/fSBib3R0b21TcGFjZUF2YWlsYWJsZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FkanVzdFBhbmVsVXAocGFuZWxIZWlnaHRCb3R0b20sIGJvdHRvbVNwYWNlQXZhaWxhYmxlKSB7CiAgICAgICAgICAgIC8vIEJyb3dzZXJzIGlnbm9yZSBmcmFjdGlvbmFsIHNjcm9sbCBvZmZzZXRzLCBzbyB3ZSBuZWVkIHRvIHJvdW5kLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpc3RhbmNlQmVsb3dWaWV3cG9ydCA9IE1hdGgucm91bmQocGFuZWxIZWlnaHRCb3R0b20gLSBib3R0b21TcGFjZUF2YWlsYWJsZSk7CiAgICAgICAgICAgIC8vIFNjcm9sbHMgdGhlIHBhbmVsIHVwIGJ5IHRoZSBkaXN0YW5jZSBpdCB3YXMgZXh0ZW5kaW5nIHBhc3QgdGhlIGJvdW5kYXJ5LCB0aGVuCiAgICAgICAgICAgIC8vIGFkanVzdHMgdGhlIG9mZnNldCBieSB0aGF0IGFtb3VudCB0byBtb3ZlIHRoZSBwYW5lbCB1cCBpbnRvIHRoZSB2aWV3cG9ydC4KICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wIC09IGRpc3RhbmNlQmVsb3dWaWV3cG9ydDsKICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSAtPSBkaXN0YW5jZUJlbG93Vmlld3BvcnQ7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKTsKICAgICAgICAgICAgLy8gSWYgdGhlIHBhbmVsIGlzIHNjcm9sbGVkIHRvIHRoZSB2ZXJ5IHRvcCwgaXQgd29uJ3QgYmUgYWJsZSB0byBmaXQgdGhlIHBhbmVsCiAgICAgICAgICAgIC8vIGJ5IHNjcm9sbGluZywgc28gc2V0IHRoZSBvZmZzZXQgdG8gMCB0byBhbGxvdyB0aGUgZmFsbGJhY2sgcG9zaXRpb24gdG8gdGFrZQogICAgICAgICAgICAvLyBlZmZlY3QuCiAgICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxUb3AgPD0gMCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX29mZnNldFkgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNmb3JtT3JpZ2luID0gYDUwJSBib3R0b20gMHB4YDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGp1c3RzIHRoZSBvdmVybGF5IHBhbmVsIGRvd24gdG8gZml0IGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcGFuZWxIZWlnaHRUb3AKICAgICAgICAgKiBAcGFyYW0gez99IHRvcFNwYWNlQXZhaWxhYmxlCiAgICAgICAgICogQHBhcmFtIHs/fSBtYXhTY3JvbGwKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hZGp1c3RQYW5lbERvd24ocGFuZWxIZWlnaHRUb3AsIHRvcFNwYWNlQXZhaWxhYmxlLCBtYXhTY3JvbGwpIHsKICAgICAgICAgICAgLy8gQnJvd3NlcnMgaWdub3JlIGZyYWN0aW9uYWwgc2Nyb2xsIG9mZnNldHMsIHNvIHdlIG5lZWQgdG8gcm91bmQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlzdGFuY2VBYm92ZVZpZXdwb3J0ID0gTWF0aC5yb3VuZChwYW5lbEhlaWdodFRvcCAtIHRvcFNwYWNlQXZhaWxhYmxlKTsKICAgICAgICAgICAgLy8gU2Nyb2xscyB0aGUgcGFuZWwgZG93biBieSB0aGUgZGlzdGFuY2UgaXQgd2FzIGV4dGVuZGluZyBwYXN0IHRoZSBib3VuZGFyeSwgdGhlbgogICAgICAgICAgICAvLyBhZGp1c3RzIHRoZSBvZmZzZXQgYnkgdGhhdCBhbW91bnQgdG8gbW92ZSB0aGUgcGFuZWwgZG93biBpbnRvIHRoZSB2aWV3cG9ydC4KICAgICAgICAgICAgdGhpcy5fc2Nyb2xsVG9wICs9IGRpc3RhbmNlQWJvdmVWaWV3cG9ydDsKICAgICAgICAgICAgdGhpcy5fb2Zmc2V0WSArPSBkaXN0YW5jZUFib3ZlVmlld3BvcnQ7CiAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IHRoaXMuX2dldE9yaWdpbkJhc2VkT25PcHRpb24oKTsKICAgICAgICAgICAgLy8gSWYgdGhlIHBhbmVsIGlzIHNjcm9sbGVkIHRvIHRoZSB2ZXJ5IGJvdHRvbSwgaXQgd29uJ3QgYmUgYWJsZSB0byBmaXQgdGhlCiAgICAgICAgICAgIC8vIHBhbmVsIGJ5IHNjcm9sbGluZywgc28gc2V0IHRoZSBvZmZzZXQgdG8gMCB0byBhbGxvdyB0aGUgZmFsbGJhY2sgcG9zaXRpb24KICAgICAgICAgICAgLy8gdG8gdGFrZSBlZmZlY3QuCiAgICAgICAgICAgIGlmICh0aGlzLl9zY3JvbGxUb3AgPj0gbWF4U2Nyb2xsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb3AgPSBtYXhTY3JvbGw7CiAgICAgICAgICAgICAgICB0aGlzLl9vZmZzZXRZID0gMDsKICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zZm9ybU9yaWdpbiA9IGA1MCUgdG9wIDBweGA7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgdHJhbnNmb3JtIG9yaWdpbiBwb2ludCBiYXNlZCBvbiB0aGUgc2VsZWN0ZWQgb3B0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0T3JpZ2luQmFzZWRPbk9wdGlvbigpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtSGVpZ2h0ID0gdGhpcy5fZ2V0SXRlbUhlaWdodCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9wdGlvbkhlaWdodEFkanVzdG1lbnQgPSAoaXRlbUhlaWdodCAtIHRoaXMuX3RyaWdnZXJSZWN0LmhlaWdodCkgLyAyOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9yaWdpblkgPSBNYXRoLmFicyh0aGlzLl9vZmZzZXRZKSAtIG9wdGlvbkhlaWdodEFkanVzdG1lbnQgKyBpdGVtSGVpZ2h0IC8gMjsKICAgICAgICAgICAgcmV0dXJuIGA1MCUgJHtvcmlnaW5ZfXB4IDBweGA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIGFtb3VudCBvZiBpdGVtcyBpbiB0aGUgc2VsZWN0LiBUaGlzIGluY2x1ZGVzIG9wdGlvbnMgYW5kIGdyb3VwIGxhYmVscy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEl0ZW1Db3VudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5sZW5ndGggKyB0aGlzLm9wdGlvbkdyb3Vwcy5sZW5ndGg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIGhlaWdodCBvZiB0aGUgc2VsZWN0J3Mgb3B0aW9ucy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEl0ZW1IZWlnaHQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl90cmlnZ2VyRm9udFNpemUgKiBTRUxFQ1RfSVRFTV9IRUlHSFRfRU07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaWRzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREZXNjcmliZWRCeUlkcyhpZHMpIHsKICAgICAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlZGJ5ID0gaWRzLmpvaW4oJyAnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkNvbnRhaW5lckNsaWNrKCkgewogICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgIHRoaXMub3BlbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzaG91bGRMYWJlbEZsb2F0KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFuZWxPcGVuIHx8ICF0aGlzLmVtcHR5OwogICAgICAgIH0KICAgIH0KICAgIE1hdFNlbGVjdC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNlbGVjdF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTZWxlY3QpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld3BvcnRSdWxlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoRXJyb3JTdGF0ZU1hdGNoZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ0Zvcm0sIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvcm1Hcm91cERpcmVjdGl2ZSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0ZPUk1fRklFTEQsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nQ29udHJvbCwgMTApLCDJtcm1aW5qZWN0QXR0cmlidXRlKCd0YWJpbmRleCcpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZKSwgybXJtWRpcmVjdGl2ZUluamVjdChMaXZlQW5ub3VuY2VyKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfU0VMRUNUX0NPTkZJRywgOCkpOyB9OwogICAgTWF0U2VsZWN0Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFNlbGVjdCwgc2VsZWN0b3JzOiBbWyJtYXQtc2VsZWN0Il1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0U2VsZWN0X0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0U2VsZWN0VHJpZ2dlciwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdE9wdGlvbiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdE9wdGdyb3VwLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmN1c3RvbVRyaWdnZXIgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgub3B0aW9ucyA9IF90KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5vcHRpb25Hcm91cHMgPSBfdCk7CiAgICAgICAgfSB9LCB2aWV3UXVlcnk6IGZ1bmN0aW9uIE1hdFNlbGVjdF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXZpZXdRdWVyeShfYzAkNSwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2MxJDUsIHRydWUpOwogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KENka0Nvbm5lY3RlZE92ZXJsYXksIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgudHJpZ2dlciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5wYW5lbCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5vdmVybGF5RGlyID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbInJvbGUiLCAibGlzdGJveCIsIDEsICJtYXQtc2VsZWN0Il0sIGhvc3RWYXJzOiAxOSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRTZWxlY3RfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImtleWRvd24iLCBmdW5jdGlvbiBNYXRTZWxlY3Rfa2V5ZG93bl9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX2hhbmRsZUtleWRvd24oJGV2ZW50KTsgfSkoImZvY3VzIiwgZnVuY3Rpb24gTWF0U2VsZWN0X2ZvY3VzX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25Gb2N1cygpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25CbHVyKCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5pZCkoInRhYmluZGV4IiwgY3R4LnRhYkluZGV4KSgiYXJpYS1sYWJlbCIsIGN0eC5fZ2V0QXJpYUxhYmVsKCkpKCJhcmlhLWxhYmVsbGVkYnkiLCBjdHguX2dldEFyaWFMYWJlbGxlZGJ5KCkpKCJhcmlhLXJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkLnRvU3RyaW5nKCkpKCJhcmlhLWRpc2FibGVkIiwgY3R4LmRpc2FibGVkLnRvU3RyaW5nKCkpKCJhcmlhLWludmFsaWQiLCBjdHguZXJyb3JTdGF0ZSkoImFyaWEtb3ducyIsIGN0eC5wYW5lbE9wZW4gPyBjdHguX29wdGlvbklkcyA6IG51bGwpKCJhcmlhLW11bHRpc2VsZWN0YWJsZSIsIGN0eC5tdWx0aXBsZSkoImFyaWEtZGVzY3JpYmVkYnkiLCBjdHguX2FyaWFEZXNjcmliZWRieSB8fCBudWxsKSgiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiwgY3R4Ll9nZXRBcmlhQWN0aXZlRGVzY2VuZGFudCgpKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXNlbGVjdC1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoIm1hdC1zZWxlY3QtaW52YWxpZCIsIGN0eC5lcnJvclN0YXRlKSgibWF0LXNlbGVjdC1yZXF1aXJlZCIsIGN0eC5yZXF1aXJlZCkoIm1hdC1zZWxlY3QtZW1wdHkiLCBjdHguZW1wdHkpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIsIHRhYkluZGV4OiAidGFiSW5kZXgiLCBhcmlhTGFiZWw6IFsiYXJpYS1sYWJlbCIsICJhcmlhTGFiZWwiXSwgaWQ6ICJpZCIsIGRpc2FibGVPcHRpb25DZW50ZXJpbmc6ICJkaXNhYmxlT3B0aW9uQ2VudGVyaW5nIiwgdHlwZWFoZWFkRGVib3VuY2VJbnRlcnZhbDogInR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWwiLCBwbGFjZWhvbGRlcjogInBsYWNlaG9sZGVyIiwgcmVxdWlyZWQ6ICJyZXF1aXJlZCIsIG11bHRpcGxlOiAibXVsdGlwbGUiLCBjb21wYXJlV2l0aDogImNvbXBhcmVXaXRoIiwgdmFsdWU6ICJ2YWx1ZSIsIHBhbmVsQ2xhc3M6ICJwYW5lbENsYXNzIiwgYXJpYUxhYmVsbGVkYnk6IFsiYXJpYS1sYWJlbGxlZGJ5IiwgImFyaWFMYWJlbGxlZGJ5Il0sIGVycm9yU3RhdGVNYXRjaGVyOiAiZXJyb3JTdGF0ZU1hdGNoZXIiLCBzb3J0Q29tcGFyYXRvcjogInNvcnRDb21wYXJhdG9yIiB9LCBvdXRwdXRzOiB7IG9wZW5lZENoYW5nZTogIm9wZW5lZENoYW5nZSIsIF9vcGVuZWRTdHJlYW06ICJvcGVuZWQiLCBfY2xvc2VkU3RyZWFtOiAiY2xvc2VkIiwgc2VsZWN0aW9uQ2hhbmdlOiAic2VsZWN0aW9uQ2hhbmdlIiwgdmFsdWVDaGFuZ2U6ICJ2YWx1ZUNoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0U2VsZWN0Il0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoWwogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNYXRGb3JtRmllbGRDb250cm9sLCB1c2VFeGlzdGluZzogTWF0U2VsZWN0IH0sCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE1BVF9PUFRJT05fUEFSRU5UX0NPTVBPTkVOVCwgdXNlRXhpc3Rpbmc6IE1hdFNlbGVjdCB9CiAgICAgICAgICAgIF0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzMkMiwgZGVjbHM6IDksIHZhcnM6IDksIGNvbnN0czogW1siY2RrLW92ZXJsYXktb3JpZ2luIiwgIiIsICJhcmlhLWhpZGRlbiIsICJ0cnVlIiwgMSwgIm1hdC1zZWxlY3QtdHJpZ2dlciIsIDMsICJjbGljayJdLCBbIm9yaWdpbiIsICJjZGtPdmVybGF5T3JpZ2luIiwgInRyaWdnZXIiLCAiIl0sIFsxLCAibWF0LXNlbGVjdC12YWx1ZSIsIDMsICJuZ1N3aXRjaCJdLCBbImNsYXNzIiwgIm1hdC1zZWxlY3QtcGxhY2Vob2xkZXIiLCA0LCAibmdTd2l0Y2hDYXNlIl0sIFsiY2xhc3MiLCAibWF0LXNlbGVjdC12YWx1ZS10ZXh0IiwgMywgIm5nU3dpdGNoIiwgNCwgIm5nU3dpdGNoQ2FzZSJdLCBbMSwgIm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlciJdLCBbMSwgIm1hdC1zZWxlY3QtYXJyb3ciXSwgWyJjZGstY29ubmVjdGVkLW92ZXJsYXkiLCAiIiwgImNka0Nvbm5lY3RlZE92ZXJsYXlMb2NrUG9zaXRpb24iLCAiIiwgImNka0Nvbm5lY3RlZE92ZXJsYXlIYXNCYWNrZHJvcCIsICIiLCAiY2RrQ29ubmVjdGVkT3ZlcmxheUJhY2tkcm9wQ2xhc3MiLCAiY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AiLCAzLCAiY2RrQ29ubmVjdGVkT3ZlcmxheVNjcm9sbFN0cmF0ZWd5IiwgImNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4iLCAiY2RrQ29ubmVjdGVkT3ZlcmxheU9wZW4iLCAiY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9ucyIsICJjZGtDb25uZWN0ZWRPdmVybGF5TWluV2lkdGgiLCAiY2RrQ29ubmVjdGVkT3ZlcmxheU9mZnNldFkiLCAiYmFja2Ryb3BDbGljayIsICJhdHRhY2giLCAiZGV0YWNoIl0sIFsxLCAibWF0LXNlbGVjdC1wbGFjZWhvbGRlciJdLCBbMSwgIm1hdC1zZWxlY3QtdmFsdWUtdGV4dCIsIDMsICJuZ1N3aXRjaCJdLCBbNCwgIm5nU3dpdGNoRGVmYXVsdCJdLCBbNCwgIm5nU3dpdGNoQ2FzZSJdLCBbMSwgIm1hdC1zZWxlY3QtcGFuZWwtd3JhcCJdLCBbMywgIm5nQ2xhc3MiLCAia2V5ZG93biJdLCBbInBhbmVsIiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFNlbGVjdF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoX2MyJDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwLCAxKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9UZW1wbGF0ZV9kaXZfY2xpY2tfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC50b2dnbGUoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNCwgTWF0U2VsZWN0X3NwYW5fNF9UZW1wbGF0ZSwgMiwgMSwgInNwYW4iLCAzKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDUsIE1hdFNlbGVjdF9zcGFuXzVfVGVtcGxhdGUsIDMsIDIsICJzcGFuIiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg3LCAiZGl2IiwgNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg4LCBNYXRTZWxlY3RfbmdfdGVtcGxhdGVfOF9UZW1wbGF0ZSwgNCwgMTEsICJuZy10ZW1wbGF0ZSIsIDcpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImJhY2tkcm9wQ2xpY2siLCBmdW5jdGlvbiBNYXRTZWxlY3RfVGVtcGxhdGVfbmdfdGVtcGxhdGVfYmFja2Ryb3BDbGlja184X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LmNsb3NlKCk7IH0pKCJhdHRhY2giLCBmdW5jdGlvbiBNYXRTZWxlY3RfVGVtcGxhdGVfbmdfdGVtcGxhdGVfYXR0YWNoXzhfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX29uQXR0YWNoZWQoKTsgfSkoImRldGFjaCIsIGZ1bmN0aW9uIE1hdFNlbGVjdF9UZW1wbGF0ZV9uZ190ZW1wbGF0ZV9kZXRhY2hfOF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5jbG9zZSgpOyB9KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgY29uc3QgX3IwID0gybXJtXJlZmVyZW5jZSgxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCBjdHguZW1wdHkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCB0cnVlKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgZmFsc2UpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJjZGtDb25uZWN0ZWRPdmVybGF5U2Nyb2xsU3RyYXRlZ3kiLCBjdHguX3Njcm9sbFN0cmF0ZWd5KSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbiIsIF9yMCkoImNka0Nvbm5lY3RlZE92ZXJsYXlPcGVuIiwgY3R4LnBhbmVsT3BlbikoImNka0Nvbm5lY3RlZE92ZXJsYXlQb3NpdGlvbnMiLCBjdHguX3Bvc2l0aW9ucykoImNka0Nvbm5lY3RlZE92ZXJsYXlNaW5XaWR0aCIsIGN0eC5fdHJpZ2dlclJlY3QgPT0gbnVsbCA/IG51bGwgOiBjdHguX3RyaWdnZXJSZWN0LndpZHRoKSgiY2RrQ29ubmVjdGVkT3ZlcmxheU9mZnNldFkiLCBjdHguX29mZnNldFkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0Nka092ZXJsYXlPcmlnaW4sIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UsIENka0Nvbm5lY3RlZE92ZXJsYXksIE5nU3dpdGNoRGVmYXVsdCwgTmdDbGFzc10sIHN0eWxlczogWyIubWF0LXNlbGVjdHtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxMDAlO291dGxpbmU6bm9uZX0ubWF0LXNlbGVjdC10cmlnZ2Vye2Rpc3BsYXk6aW5saW5lLXRhYmxlO2N1cnNvcjpwb2ludGVyO3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LXNlbGVjdC1kaXNhYmxlZCAubWF0LXNlbGVjdC10cmlnZ2Vyey13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6ZGVmYXVsdH0ubWF0LXNlbGVjdC12YWx1ZXtkaXNwbGF5OnRhYmxlLWNlbGw7bWF4LXdpZHRoOjA7d2lkdGg6MTAwJTtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczt3aGl0ZS1zcGFjZTpub3dyYXB9Lm1hdC1zZWxlY3QtdmFsdWUtdGV4dHt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXN9Lm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcntkaXNwbGF5OnRhYmxlLWNlbGw7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lIC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTI1JSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtaGFzLWxhYmVsIC5tYXQtc2VsZWN0Om5vdCgubWF0LXNlbGVjdC1lbXB0eSkgLm1hdC1zZWxlY3QtYXJyb3ctd3JhcHBlcnt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWVtcHR5IC5tYXQtc2VsZWN0LWFycm93LXdyYXBwZXJ7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1lbXB0eSAubWF0LXNlbGVjdC1hcnJvdy13cmFwcGVye3RyYW5zaXRpb246bm9uZX0ubWF0LXNlbGVjdC1hcnJvd3t3aWR0aDowO2hlaWdodDowO2JvcmRlci1sZWZ0OjVweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmlnaHQ6NXB4IHNvbGlkIHRyYW5zcGFyZW50O2JvcmRlci10b3A6NXB4IHNvbGlkO21hcmdpbjowIDRweH0ubWF0LXNlbGVjdC1wYW5lbC13cmFwe2ZsZXgtYmFzaXM6MTAwJX0ubWF0LXNlbGVjdC1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7cGFkZGluZy10b3A6MDtwYWRkaW5nLWJvdHRvbTowO21heC1oZWlnaHQ6MjU2cHg7bWluLXdpZHRoOjEwMCU7Ym9yZGVyLXJhZGl1czo0cHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNlbGVjdC1wYW5lbHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXNlbGVjdC1wYW5lbCAubWF0LW9wdGdyb3VwLWxhYmVsLC5tYXQtc2VsZWN0LXBhbmVsIC5tYXQtb3B0aW9ue2ZvbnQtc2l6ZTppbmhlcml0O2xpbmUtaGVpZ2h0OjNlbTtoZWlnaHQ6M2VtfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1zZWxlY3Q6bm90KC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCkgLm1hdC1mb3JtLWZpZWxkLWZsZXh7Y3Vyc29yOnBvaW50ZXJ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LXNlbGVjdCAubWF0LWZvcm0tZmllbGQtbGFiZWx7d2lkdGg6Y2FsYygxMDAlIC0gMThweCl9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7dHJhbnNpdGlvbjpjb2xvciA0MDBtcyAxMzMuMzMzMzMzMzMzM21zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNlbGVjdC1wbGFjZWhvbGRlcnt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1mb3JtLWZpZWxkLWhpZGUtcGxhY2Vob2xkZXIgLm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6dHJhbnNwYXJlbnQ7LXdlYmtpdC10ZXh0LWZpbGwtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpub25lO2Rpc3BsYXk6YmxvY2t9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgZGF0YTogeyBhbmltYXRpb246IFsKICAgICAgICAgICAgICAgIG1hdFNlbGVjdEFuaW1hdGlvbnMudHJhbnNmb3JtUGFuZWxXcmFwLAogICAgICAgICAgICAgICAgbWF0U2VsZWN0QW5pbWF0aW9ucy50cmFuc2Zvcm1QYW5lbAogICAgICAgICAgICBdIH0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0U2VsZWN0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVmlld3BvcnRSdWxlciB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogRXJyb3JTdGF0ZU1hdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogTmdGb3JtLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRm9ybUdyb3VwRGlyZWN0aXZlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogTWF0Rm9ybUZpZWxkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9GT1JNX0ZJRUxELF0gfV0gfSwKICAgICAgICB7IHR5cGU6IE5nQ29udHJvbCwgZGVjb3JhdG9yczogW3sgdHlwZTogU2VsZiB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEF0dHJpYnV0ZSwgYXJnczogWyd0YWJpbmRleCcsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfU0VMRUNUX1NDUk9MTF9TVFJBVEVHWSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBMaXZlQW5ub3VuY2VyIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1NFTEVDVF9DT05GSUcsXSB9XSB9CiAgICBdOwogICAgTWF0U2VsZWN0LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHRyaWdnZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyd0cmlnZ2VyJyxdIH1dLAogICAgICAgIHBhbmVsOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsncGFuZWwnLF0gfV0sCiAgICAgICAgb3ZlcmxheURpcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbQ2RrQ29ubmVjdGVkT3ZlcmxheSxdIH1dLAogICAgICAgIG9wdGlvbnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdE9wdGlvbiwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sCiAgICAgICAgb3B0aW9uR3JvdXBzOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRPcHRncm91cCwgeyBkZXNjZW5kYW50czogdHJ1ZSB9LF0gfV0sCiAgICAgICAgcGFuZWxDbGFzczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY3VzdG9tVHJpZ2dlcjogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0U2VsZWN0VHJpZ2dlcixdIH1dLAogICAgICAgIHBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICByZXF1aXJlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbXVsdGlwbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRpc2FibGVPcHRpb25DZW50ZXJpbmc6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbXBhcmVXaXRoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYXJpYUxhYmVsOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydhcmlhLWxhYmVsJyxdIH1dLAogICAgICAgIGFyaWFMYWJlbGxlZGJ5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydhcmlhLWxhYmVsbGVkYnknLF0gfV0sCiAgICAgICAgZXJyb3JTdGF0ZU1hdGNoZXI6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHR5cGVhaGVhZERlYm91bmNlSW50ZXJ2YWw6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNvcnRDb21wYXJhdG9yOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb3BlbmVkQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgX29wZW5lZFN0cmVhbTogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ29wZW5lZCcsXSB9XSwKICAgICAgICBfY2xvc2VkU3RyZWFtOiBbeyB0eXBlOiBPdXRwdXQsIGFyZ3M6IFsnY2xvc2VkJyxdIH1dLAogICAgICAgIHNlbGVjdGlvbkNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIHZhbHVlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvc2VsZWN0L3NlbGVjdC1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0U2VsZWN0TW9kdWxlIHsKICAgIH0KICAgIE1hdFNlbGVjdE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFNlbGVjdE1vZHVsZSB9KTsKICAgIE1hdFNlbGVjdE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFNlbGVjdE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTZWxlY3RNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW01BVF9TRUxFQ1RfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE92ZXJsYXlNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRPcHRpb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIENka1Njcm9sbGFibGVNb2R1bGUsCiAgICAgICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwKICAgICAgICAgICAgTWF0T3B0aW9uTW9kdWxlLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0U2VsZWN0TW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFNlbGVjdCwKICAgICAgICAgICAgTWF0U2VsZWN0VHJpZ2dlcl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE92ZXJsYXlNb2R1bGUsCiAgICAgICAgICAgIE1hdE9wdGlvbk1vZHVsZSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0Nka1Njcm9sbGFibGVNb2R1bGUsCiAgICAgICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwKICAgICAgICAgICAgTWF0U2VsZWN0LAogICAgICAgICAgICBNYXRTZWxlY3RUcmlnZ2VyLAogICAgICAgICAgICBNYXRPcHRpb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvaGVhZGVyL3BsdWdpbl9zZWxlY3Rvcl9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X3RhYl8xX25nX3RlbXBsYXRlXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I1ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDUpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9tYXRfdGFiXzFfbmdfdGVtcGxhdGVfMV9UZW1wbGF0ZV9zcGFuX2NsaWNrXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjUpOyBjb25zdCBwbHVnaW5fcjIgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7IGNvbnN0IGN0eF9yNCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I0Lm9uQWN0aXZlUGx1Z2luU2VsZWN0aW9uKCRldmVudCwgcGx1Z2luX3IyLmlkKTsgfSk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IHBsdWdpbl9yMiA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsKICAgICAgICDJtcm1YXR0cmlidXRlKCJkYXRhLXBsdWdpbi1pZCIsIHBsdWdpbl9yMi5pZCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBwbHVnaW5fcjIudGFiX25hbWUsICIgIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X21hdF90YWJfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtYXQtdGFiIiwgMyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X21hdF90YWJfMV9uZ190ZW1wbGF0ZV8xX1RlbXBsYXRlLCAyLCAyLCAibmctdGVtcGxhdGUiLCA0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgcGx1Z2luX3IyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoImRpc2FibGVkIiwgIXBsdWdpbl9yMi5lbmFibGVkKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X2Zvcm1fZmllbGRfMl9tYXRfb3B0aW9uXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LW9wdGlvbiIsIDkpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBwbHVnaW5fcjkgPSBjdHguJGltcGxpY2l0OwogICAgICAgIMm1ybVwcm9wZXJ0eSgidmFsdWUiLCBwbHVnaW5fcjkuaWQpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoImRhdGEtcGx1Z2luLWlkIiwgcGx1Z2luX3I5LmlkKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIHBsdWdpbl9yOS50YWJfbmFtZSwgIiAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUGx1Z2luU2VsZWN0b3JDb21wb25lbnRfbWF0X2Zvcm1fZmllbGRfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjExID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LWZvcm0tZmllbGQiLCA2KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJtYXQtbGFiZWwiKTsKICAgICAgICDJtcm1dGV4dCgyLCAiSW5hY3RpdmUiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgIm1hdC1zZWxlY3QiLCA3KTsKICAgICAgICDJtcm1bGlzdGVuZXIoInNlbGVjdGlvbkNoYW5nZSIsIGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X21hdF9mb3JtX2ZpZWxkXzJfVGVtcGxhdGVfbWF0X3NlbGVjdF9zZWxlY3Rpb25DaGFuZ2VfM19saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTEpOyBjb25zdCBjdHhfcjEwID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEwLm9uRGlzYWJsZWRQbHVnaW5TZWxlY3Rpb25DaGFuZ2VkKCRldmVudCk7IH0pOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9tYXRfZm9ybV9maWVsZF8yX21hdF9vcHRpb25fNF9UZW1wbGF0ZSwgMiwgMywgIm1hdC1vcHRpb24iLCA4KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY3R4X3IxLnNlbGVjdGVkUGx1Z2luKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHhfcjEuZGlzYWJsZWRQbHVnaW5zKTsKICAgIH0gfQogICAgY2xhc3MgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRBY3RpdmVQbHVnaW5JbmRleCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlUGx1Z2lucy5maW5kSW5kZXgoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHsgaWQgfSkgPT4gaWQgPT09IHRoaXMuc2VsZWN0ZWRQbHVnaW4pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2luSWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQWN0aXZlUGx1Z2luU2VsZWN0aW9uKGV2ZW50LCBwbHVnaW5JZCkgewogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgdGhpcy5vblBsdWdpblNlbGVjdGlvbkNoYW5nZWQuZW1pdChwbHVnaW5JZCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc2VsZWN0Q2hhbmdlRXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRGlzYWJsZWRQbHVnaW5TZWxlY3Rpb25DaGFuZ2VkKHNlbGVjdENoYW5nZUV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMub25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkLmVtaXQoc2VsZWN0Q2hhbmdlRXZlbnQudmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vcGx1Z2luX3NlbGVjdG9yX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9wbHVnaW5fc2VsZWN0b3JfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgYWN0aXZlUGx1Z2luczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzYWJsZWRQbHVnaW5zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzZWxlY3RlZFBsdWdpbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luU2VsZWN0b3JDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQbHVnaW5TZWxlY3RvckNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5TZWxlY3RvckNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBQbHVnaW5TZWxlY3RvckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJwbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgYWN0aXZlUGx1Z2luczogImFjdGl2ZVBsdWdpbnMiLCBkaXNhYmxlZFBsdWdpbnM6ICJkaXNhYmxlZFBsdWdpbnMiLCBzZWxlY3RlZFBsdWdpbjogInNlbGVjdGVkUGx1Z2luIiB9LCBvdXRwdXRzOiB7IG9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZDogIm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCIgfSwgZGVjbHM6IDMsIHZhcnM6IDMsIGNvbnN0czogW1siYW5pbWF0aW9uRHVyYXRpb24iLCAiMTAwbXMiLCAxLCAiYWN0aXZlLXBsdWdpbi1saXN0IiwgMywgInNlbGVjdGVkSW5kZXgiXSwgWzMsICJkaXNhYmxlZCIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsiZmxvYXRMYWJlbCIsICJuZXZlciIsIDQsICJuZ0lmIl0sIFszLCAiZGlzYWJsZWQiXSwgWyJtYXQtdGFiLWxhYmVsIiwgIiJdLCBbMSwgInBsdWdpbi1uYW1lIiwgMywgImNsaWNrIl0sIFsiZmxvYXRMYWJlbCIsICJuZXZlciJdLCBbMywgInZhbHVlIiwgInNlbGVjdGlvbkNoYW5nZSJdLCBbMywgInZhbHVlIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzMsICJ2YWx1ZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtYXQtdGFiLWdyb3VwIiwgMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9tYXRfdGFiXzFfVGVtcGxhdGUsIDIsIDEsICJtYXQtdGFiIiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBQbHVnaW5TZWxlY3RvckNvbXBvbmVudF9tYXRfZm9ybV9maWVsZF8yX1RlbXBsYXRlLCA1LCAyLCAibWF0LWZvcm0tZmllbGQiLCAyKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJzZWxlY3RlZEluZGV4IiwgY3R4LmdldEFjdGl2ZVBsdWdpbkluZGV4KCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4LmFjdGl2ZVBsdWdpbnMpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmRpc2FibGVkUGx1Z2lucy5sZW5ndGggPiAwKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRUYWJHcm91cCwgTmdGb3JPZiwgTmdJZiwgTWF0VGFiLCBNYXRUYWJMYWJlbCwgTWF0Rm9ybUZpZWxkLCBNYXRMYWJlbCwgTWF0U2VsZWN0LCBNYXRPcHRpb25dLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXg6MSAxIGF1dG87Zm9udC1zaXplOjE0cHg7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6aGlkZGVufW1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjAgMDttYXJnaW4tdG9wOjVweDt3aWR0aDoxMzBweH1tYXQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCBtYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NTAwO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX0uYWN0aXZlLXBsdWdpbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1zZWxmOnN0cmV0Y2g7ZmxleDoxIDEgYXV0bztvdmVyZmxvdzpoaWRkZW59LnBsdWdpbi1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtoZWlnaHQ6MTAwJTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3BhZGRpbmc6MCAxMnB4O3dpZHRoOjEwMCV9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1sYWJlbCwgW19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1saW5re2NvbG9yOmluaGVyaXQ7b3BhY2l0eTouN31bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItbGFiZWwtYWN0aXZlLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1sYWJlbC1hY3RpdmV7b3BhY2l0eToxfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6Y3VycmVudENvbG9yfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWR7dmlzaWJpbGl0eTpoaWRkZW59W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1kaXNhYmxlZHtkaXNwbGF5Om5vbmV9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCAubWF0LXRhYi1oZWFkZXIsIFtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItbGFiZWxzLCBbX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVse2hlaWdodDoxMDAlfVtfbmdob3N0LSVDT01QJV0gICAgIC5hY3RpdmUtcGx1Z2luLWxpc3QgLm1hdC10YWItbGFiZWx7bWluLXdpZHRoOjQ4cHg7cGFkZGluZzowO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZX1bX25naG9zdC0lQ09NUCVdICAgICAuYWN0aXZlLXBsdWdpbi1saXN0IC5tYXQtdGFiLWxhYmVsLWNvbnRlbnR7aGVpZ2h0OjEwMCV9W19uZ2hvc3QtJUNPTVAlXSAgICAgLmFjdGl2ZS1wbHVnaW4tbGlzdCBtYXQtdGFiLWhlYWRlcjpub3QoLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY29udHJvbHMtZW5hYmxlZCl7cGFkZGluZzowIDM2cHh9Il0gfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvaGVhZGVyL3BsdWdpbl9zZWxlY3Rvcl9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0VWlQbHVnaW5zID0gY3JlYXRlU2VsZWN0b3IoZ2V0UGx1Z2lucywgKC8qKgogICAgICogQHBhcmFtIHs/fSBsaXN0aW5nCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAobGlzdGluZykgPT4gT2JqZWN0LmtleXMobGlzdGluZykubWFwKCgvKioKICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoa2V5KSA9PiBPYmplY3QuYXNzaWduKHt9LCB7IGlkOiBrZXkgfSwgbGlzdGluZ1trZXldKSkpKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXREaXNhYmxlZFBsdWdpbnMgPSBjcmVhdGVTZWxlY3RvcihnZXRVaVBsdWdpbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gcGx1Z2lucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHBsdWdpbnMpID0+IHBsdWdpbnMuZmlsdGVyKCgvKioKICAgICAqIEBwYXJhbSB7P30gcGx1Z2luCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAocGx1Z2luKSA9PiAhcGx1Z2luLmVuYWJsZWQpKSkpOwogICAgY2xhc3MgUGx1Z2luU2VsZWN0b3JDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlUGx1Z2luJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0QWN0aXZlUGx1Z2luKSk7CiAgICAgICAgICAgIHRoaXMucGx1Z2lucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFVpUGx1Z2lucykpOwogICAgICAgICAgICB0aGlzLmRpc2FibGVkUGx1Z2lucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldERpc2FibGVkUGx1Z2lucykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBsdWdpbklkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblBsdWdpblNlbGVjdGlvbkNoYW5nZShwbHVnaW5JZCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGNoYW5nZVBsdWdpbih7IHBsdWdpbjogcGx1Z2luSWQgfSkpOwogICAgICAgIH0KICAgIH0KICAgIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwbHVnaW4tc2VsZWN0b3InLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8cGx1Z2luLXNlbGVjdG9yLWNvbXBvbmVudAogICAgICBbYWN0aXZlUGx1Z2luc109InBsdWdpbnMkIHwgYXN5bmMiCiAgICAgIFtkaXNhYmxlZFBsdWdpbnNdPSJkaXNhYmxlZFBsdWdpbnMkIHwgYXN5bmMiCiAgICAgIFtzZWxlY3RlZFBsdWdpbl09ImFjdGl2ZVBsdWdpbiQgfCBhc3luYyIKICAgICAgKG9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCk9Im9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlKCRldmVudCkiCiAgICA+PC9wbHVnaW4tc2VsZWN0b3ItY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5TZWxlY3RvckNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsdWdpblNlbGVjdG9yQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luU2VsZWN0b3JDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUGx1Z2luU2VsZWN0b3JDb250YWluZXIsIHNlbGVjdG9yczogW1sicGx1Z2luLXNlbGVjdG9yIl1dLCBkZWNsczogNCwgdmFyczogOSwgY29uc3RzOiBbWzMsICJhY3RpdmVQbHVnaW5zIiwgImRpc2FibGVkUGx1Z2lucyIsICJzZWxlY3RlZFBsdWdpbiIsICJvblBsdWdpblNlbGVjdGlvbkNoYW5nZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBQbHVnaW5TZWxlY3RvckNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAicGx1Z2luLXNlbGVjdG9yLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uUGx1Z2luU2VsZWN0aW9uQ2hhbmdlZCIsIGZ1bmN0aW9uIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyX1RlbXBsYXRlX3BsdWdpbl9zZWxlY3Rvcl9jb21wb25lbnRfb25QbHVnaW5TZWxlY3Rpb25DaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25QbHVnaW5TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiYWN0aXZlUGx1Z2lucyIsIMm1ybVwaXBlQmluZDEoMSwgMywgY3R4LnBsdWdpbnMkKSkoImRpc2FibGVkUGx1Z2lucyIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4LmRpc2FibGVkUGx1Z2lucyQpKSgic2VsZWN0ZWRQbHVnaW4iLCDJtcm1cGlwZUJpbmQxKDMsIDcsIGN0eC5hY3RpdmVQbHVnaW4kKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbUGx1Z2luU2VsZWN0b3JDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgZnVuY3Rpb24gTWF0RGlhbG9nQ29udGFpbmVyX25nX3RlbXBsYXRlXzBfVGVtcGxhdGUocmYsIGN0eCkgeyB9CiAgICAvKioKICAgICAqIENvbmZpZ3VyYXRpb24gZm9yIG9wZW5pbmcgYSBtb2RhbCBkaWFsb2cgd2l0aCB0aGUgTWF0RGlhbG9nIHNlcnZpY2UuCiAgICAgKiBAdGVtcGxhdGUgRAogICAgICovCiAgICBjbGFzcyBNYXREaWFsb2dDb25maWcgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIEFSSUEgcm9sZSBvZiB0aGUgZGlhbG9nIGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnJvbGUgPSAnZGlhbG9nJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEN1c3RvbSBjbGFzcyBmb3IgdGhlIG92ZXJsYXkgcGFuZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucGFuZWxDbGFzcyA9ICcnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgZGlhbG9nIGhhcyBhIGJhY2tkcm9wLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5oYXNCYWNrZHJvcCA9IHRydWU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDdXN0b20gY2xhc3MgZm9yIHRoZSBiYWNrZHJvcC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYmFja2Ryb3BDbGFzcyA9ICcnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgdXNlciBjYW4gdXNlIGVzY2FwZSBvciBjbGlja2luZyBvbiB0aGUgYmFja2Ryb3AgdG8gY2xvc2UgdGhlIG1vZGFsLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2xvc2UgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdpZHRoIG9mIHRoZSBkaWFsb2cuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLndpZHRoID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIZWlnaHQgb2YgdGhlIGRpYWxvZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXgtd2lkdGggb2YgdGhlIGRpYWxvZy4gSWYgYSBudW1iZXIgaXMgcHJvdmlkZWQsIGFzc3VtZXMgcGl4ZWwgdW5pdHMuIERlZmF1bHRzIHRvIDgwdncuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm1heFdpZHRoID0gJzgwdncnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRGF0YSBiZWluZyBpbmplY3RlZCBpbnRvIHRoZSBjaGlsZCBjb21wb25lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRhdGEgPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSUQgb2YgdGhlIGVsZW1lbnQgdGhhdCBkZXNjcmliZXMgdGhlIGRpYWxvZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXJpYURlc2NyaWJlZEJ5ID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElEIG9mIHRoZSBlbGVtZW50IHRoYXQgbGFiZWxzIHRoZSBkaWFsb2cuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFyaWFMYWJlbGxlZEJ5ID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFyaWEgbGFiZWwgdG8gYXNzaWduIHRvIHRoZSBkaWFsb2cgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXJpYUxhYmVsID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgZm9jdXMgdGhlIGZpcnN0IGZvY3VzYWJsZSBlbGVtZW50IG9uIG9wZW4uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmF1dG9Gb2N1cyA9IHRydWU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBkaWFsb2cgc2hvdWxkIHJlc3RvcmUgZm9jdXMgdG8gdGhlCiAgICAgICAgICAgICAqIHByZXZpb3VzbHktZm9jdXNlZCBlbGVtZW50LCBhZnRlciBpdCdzIGNsb3NlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucmVzdG9yZUZvY3VzID0gdHJ1ZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGRpYWxvZyBzaG91bGQgY2xvc2Ugd2hlbiB0aGUgdXNlciBnb2VzIGJhY2t3YXJkcy9mb3J3YXJkcyBpbiBoaXN0b3J5LgogICAgICAgICAgICAgKiBOb3RlIHRoYXQgdGhpcyB1c3VhbGx5IGRvZXNuJ3QgaW5jbHVkZSBjbGlja2luZyBvbiBsaW5rcyAodW5sZXNzIHRoZSB1c2VyIGlzIHVzaW5nCiAgICAgICAgICAgICAqIHRoZSBgSGFzaExvY2F0aW9uU3RyYXRlZ3lgKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2xvc2VPbk5hdmlnYXRpb24gPSB0cnVlOwogICAgICAgICAgICAvLyBUT0RPKGplbGJvdXJuKTogYWRkIGNvbmZpZ3VyYXRpb24gZm9yIGxpZmVjeWNsZSBob29rcywgQVJJQSBsYWJlbGxpbmcuCiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2RpYWxvZy9kaWFsb2ctYW5pbWF0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuaW1hdGlvbnMgdXNlZCBieSBNYXREaWFsb2cuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IG1hdERpYWxvZ0FuaW1hdGlvbnMgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQW5pbWF0aW9uIHRoYXQgaXMgYXBwbGllZCBvbiB0aGUgZGlhbG9nIGNvbnRhaW5lciBieSBkZWZhbHQuCiAgICAgICAgICovCiAgICAgICAgZGlhbG9nQ29udGFpbmVyOiB0cmlnZ2VyKCdkaWFsb2dDb250YWluZXInLCBbCiAgICAgICAgICAgIC8vIE5vdGU6IFRoZSBgZW50ZXJgIGFuaW1hdGlvbiB0cmFuc2l0aW9ucyB0byBgdHJhbnNmb3JtOiBub25lYCwgYmVjYXVzZSBmb3Igc29tZSByZWFzb24KICAgICAgICAgICAgLy8gc3BlY2lmeWluZyB0aGUgdHJhbnNmb3JtIGV4cGxpY2l0bHksIGNhdXNlcyBJRSBib3RoIHRvIGJsdXIgdGhlIGRpYWxvZyBjb250ZW50IGFuZAogICAgICAgICAgICAvLyBkZWNpbWF0ZSB0aGUgYW5pbWF0aW9uIHBlcmZvcm1hbmNlLiBMZWF2aW5nIGl0IGFzIGBub25lYCBzb2x2ZXMgYm90aCBpc3N1ZXMuCiAgICAgICAgICAgIHN0YXRlKCd2b2lkLCBleGl0Jywgc3R5bGUoeyBvcGFjaXR5OiAwLCB0cmFuc2Zvcm06ICdzY2FsZSgwLjcpJyB9KSksCiAgICAgICAgICAgIHN0YXRlKCdlbnRlcicsIHN0eWxlKHsgdHJhbnNmb3JtOiAnbm9uZScgfSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IGVudGVyJywgYW5pbWF0ZSgnMTUwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknLCBzdHlsZSh7IHRyYW5zZm9ybTogJ25vbmUnLCBvcGFjaXR5OiAxIH0pKSksCiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gdm9pZCwgKiA9PiBleGl0JywgYW5pbWF0ZSgnNzVtcyBjdWJpYy1iZXppZXIoMC40LCAwLjAsIDAuMiwgMSknLCBzdHlsZSh7IG9wYWNpdHk6IDAgfSkpKSwKICAgICAgICBdKQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9kaWFsb2cvZGlhbG9nLWNvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gZm9yIHRoZSBjYXNlIHdoZW4gYSBDb21wb25lbnRQb3J0YWwgaXMKICAgICAqIGF0dGFjaGVkIHRvIGEgRG9tUG9ydGFsT3V0bGV0IHdpdGhvdXQgYW4gb3JpZ2luLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93TWF0RGlhbG9nQ29udGVudEFscmVhZHlBdHRhY2hlZEVycm9yKCkgewogICAgICAgIHRocm93IEVycm9yKCdBdHRlbXB0aW5nIHRvIGF0dGFjaCBkaWFsb2cgY29udGVudCBhZnRlciBjb250ZW50IGlzIGFscmVhZHkgYXR0YWNoZWQnKTsKICAgIH0KICAgIC8qKgogICAgICogSW50ZXJuYWwgY29tcG9uZW50IHRoYXQgd3JhcHMgdXNlci1wcm92aWRlZCBkaWFsb2cgY29udGVudC4KICAgICAqIEFuaW1hdGlvbiBpcyBiYXNlZCBvbiBodHRwczovL21hdGVyaWFsLmlvL2d1aWRlbGluZXMvbW90aW9uL2Nob3Jlb2dyYXBoeS5odG1sLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0RGlhbG9nQ29udGFpbmVyIGV4dGVuZHMgQmFzZVBvcnRhbE91dGxldCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzVHJhcEZhY3RvcnkKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBfY29uZmlnCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9mb2N1c1RyYXBGYWN0b3J5LCBfY2hhbmdlRGV0ZWN0b3JSZWYsIF9kb2N1bWVudCwgX2NvbmZpZykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzVHJhcEZhY3RvcnkgPSBfZm9jdXNUcmFwRmFjdG9yeTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuX2NvbmZpZyA9IF9jb25maWc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbGVtZW50IHRoYXQgd2FzIGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgd2FzIG9wZW5lZC4gU2F2ZSB0aGlzIHRvIHJlc3RvcmUgdXBvbiBjbG9zZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN0YXRlIG9mIHRoZSBkaWFsb2cgYW5pbWF0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAnZW50ZXInOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiBhbiBhbmltYXRpb24gc3RhdGUgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF0dGFjaGVzIGEgRE9NIHBvcnRhbCB0byB0aGUgZGlhbG9nIGNvbnRhaW5lci4KICAgICAgICAgICAgICogQHBhcmFtIHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQuCiAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHR1cm5lZCBpbnRvIGEgbWV0aG9kLgogICAgICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXR0YWNoRG9tUG9ydGFsID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHBvcnRhbCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3dNYXREaWFsb2dDb250ZW50QWxyZWFkeUF0dGFjaGVkRXJyb3IoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3NldHVwRm9jdXNUcmFwKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaERvbVBvcnRhbChwb3J0YWwpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fYXJpYUxhYmVsbGVkQnkgPSBfY29uZmlnLmFyaWFMYWJlbGxlZEJ5IHx8IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2ggYSBDb21wb25lbnRQb3J0YWwgYXMgY29udGVudCB0byB0aGlzIGRpYWxvZyBjb250YWluZXIuCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQgYXMgdGhlIGRpYWxvZyBjb250ZW50LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCkgewogICAgICAgICAgICBpZiAodGhpcy5fcG9ydGFsT3V0bGV0Lmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgIHRocm93TWF0RGlhbG9nQ29udGVudEFscmVhZHlBdHRhY2hlZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc2V0dXBGb2N1c1RyYXAoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnRhbE91dGxldC5hdHRhY2hDb21wb25lbnRQb3J0YWwocG9ydGFsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoIGEgVGVtcGxhdGVQb3J0YWwgYXMgY29udGVudCB0byB0aGlzIGRpYWxvZyBjb250YWluZXIuCiAgICAgICAgICogQHRlbXBsYXRlIEMKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbCBQb3J0YWwgdG8gYmUgYXR0YWNoZWQgYXMgdGhlIGRpYWxvZyBjb250ZW50LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9wb3J0YWxPdXRsZXQuaGFzQXR0YWNoZWQoKSkgewogICAgICAgICAgICAgICAgdGhyb3dNYXREaWFsb2dDb250ZW50QWxyZWFkeUF0dGFjaGVkRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zZXR1cEZvY3VzVHJhcCgpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1vdmVzIGZvY3VzIGJhY2sgaW50byB0aGUgZGlhbG9nIGlmIGl0IHdhcyBtb3ZlZCBvdXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVjYXB0dXJlRm9jdXMoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fY29udGFpbnNGb2N1cygpKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmb2N1c1dhc1RyYXBwZWQgPSB0aGlzLl9mb2N1c1RyYXAuZm9jdXNJbml0aWFsRWxlbWVudCgpOwogICAgICAgICAgICAgICAgaWYgKCFmb2N1c1dhc1RyYXBwZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNb3ZlcyB0aGUgZm9jdXMgaW5zaWRlIHRoZSBmb2N1cyB0cmFwLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdHJhcEZvY3VzKCkgewogICAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIHRvIGF0dGVtcHQgdG8gZm9jdXMgaW1tZWRpYXRlbHksIHRoZW4gdGhlIGNvbnRlbnQgb2YgdGhlIGRpYWxvZyB3b3VsZCBub3QgeWV0IGJlCiAgICAgICAgICAgIC8vIHJlYWR5IGluIGluc3RhbmNlcyB3aGVyZSBjaGFuZ2UgZGV0ZWN0aW9uIGhhcyB0byBydW4gZmlyc3QuIFRvIGRlYWwgd2l0aCB0aGlzLCB3ZSBzaW1wbHkKICAgICAgICAgICAgLy8gd2FpdCBmb3IgdGhlIG1pY3JvdGFzayBxdWV1ZSB0byBiZSBlbXB0eS4KICAgICAgICAgICAgaWYgKHRoaXMuX2NvbmZpZy5hdXRvRm9jdXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzVHJhcC5mb2N1c0luaXRpYWxFbGVtZW50V2hlblJlYWR5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuX2NvbnRhaW5zRm9jdXMoKSkgewogICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGVuc3VyZSB0aGF0IGZvY3VzIGlzIG9uIHRoZSBkaWFsb2cgY29udGFpbmVyLiBJdCdzIHBvc3NpYmxlIHRoYXQgYSBkaWZmZXJlbnQKICAgICAgICAgICAgICAgIC8vIGNvbXBvbmVudCB0cmllZCB0byBtb3ZlIGZvY3VzIHdoaWxlIHRoZSBvcGVuIGFuaW1hdGlvbiB3YXMgcnVubmluZy4gU2VlOgogICAgICAgICAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL2FuZ3VsYXIvY29tcG9uZW50cy9pc3N1ZXMvMTYyMTUuIE5vdGUgdGhhdCB3ZSBvbmx5IHdhbnQgdG8gZG8gdGhpcwogICAgICAgICAgICAgICAgLy8gaWYgdGhlIGZvY3VzIGlzbid0IGluc2lkZSB0aGUgZGlhbG9nIGFscmVhZHksIGJlY2F1c2UgaXQncyBwb3NzaWJsZSB0aGF0IHRoZSBjb25zdW1lcgogICAgICAgICAgICAgICAgLy8gdHVybmVkIG9mZiBgYXV0b0ZvY3VzYCBpbiBvcmRlciB0byBtb3ZlIGZvY3VzIHRoZW1zZWx2ZXMuCiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXN0b3JlcyBmb2N1cyB0byB0aGUgZWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgZGlhbG9nIG9wZW5lZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Jlc3RvcmVGb2N1cygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0b0ZvY3VzID0gdGhpcy5fZWxlbWVudEZvY3VzZWRCZWZvcmVEaWFsb2dXYXNPcGVuZWQ7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdGhlIGV4dHJhIGNoZWNrLCBiZWNhdXNlIElFIGNhbiBzZXQgdGhlIGBhY3RpdmVFbGVtZW50YCB0byBudWxsIGluIHNvbWUgY2FzZXMuCiAgICAgICAgICAgIGlmICh0aGlzLl9jb25maWcucmVzdG9yZUZvY3VzICYmIHRvRm9jdXMgJiYgdHlwZW9mIHRvRm9jdXMuZm9jdXMgPT09ICdmdW5jdGlvbicpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUVsZW1lbnQgPSB0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGZvY3VzIGlzIHN0aWxsIGluc2lkZSB0aGUgZGlhbG9nIG9yIGlzIG9uIHRoZSBib2R5ICh1c3VhbGx5IGJlY2F1c2UgYQogICAgICAgICAgICAgICAgLy8gbm9uLWZvY3VzYWJsZSBlbGVtZW50IGxpa2UgdGhlIGJhY2tkcm9wIHdhcyBjbGlja2VkKSBiZWZvcmUgbW92aW5nIGl0LiBJdCdzIHBvc3NpYmxlIHRoYXQKICAgICAgICAgICAgICAgIC8vIHRoZSBjb25zdW1lciBtb3ZlZCBpdCB0aGVtc2VsdmVzIGJlZm9yZSB0aGUgYW5pbWF0aW9uIHdhcyBkb25lLCBpbiB3aGljaCBjYXNlIHdlIHNob3VsZG4ndAogICAgICAgICAgICAgICAgLy8gZG8gYW55dGhpbmcuCiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZUVsZW1lbnQgfHwgYWN0aXZlRWxlbWVudCA9PT0gdGhpcy5fZG9jdW1lbnQuYm9keSB8fCBhY3RpdmVFbGVtZW50ID09PSBlbGVtZW50IHx8CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jb250YWlucyhhY3RpdmVFbGVtZW50KSkgewogICAgICAgICAgICAgICAgICAgIHRvRm9jdXMuZm9jdXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZm9jdXNUcmFwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c1RyYXAuZGVzdHJveSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdXAgdGhlIGZvY3VzIHRyYW5kIGFuZCBzYXZlcyBhIHJlZmVyZW5jZSB0byB0aGUKICAgICAgICAgKiBlbGVtZW50IHRoYXQgd2FzIGZvY3VzZWQgYmVmb3JlIHRoZSBkaWFsb2cgd2FzIG9wZW5lZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldHVwRm9jdXNUcmFwKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2ZvY3VzVHJhcCkgewogICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNUcmFwID0gdGhpcy5fZm9jdXNUcmFwRmFjdG9yeS5jcmVhdGUodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fZG9jdW1lbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRGb2N1c2VkQmVmb3JlRGlhbG9nV2FzT3BlbmVkID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQpKTsKICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBmb2N1cyBtZXRob2Qgd2hlbiByZW5kZXJpbmcgb24gdGhlIHNlcnZlci4KICAgICAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMpIHsKICAgICAgICAgICAgICAgICAgICAvLyBNb3ZlIGZvY3VzIG9udG8gdGhlIGRpYWxvZyBpbW1lZGlhdGVseSBpbiBvcmRlciB0byBwcmV2ZW50IHRoZSB1c2VyIGZyb20gYWNjaWRlbnRhbGx5CiAgICAgICAgICAgICAgICAgICAgLy8gb3BlbmluZyBtdWx0aXBsZSBkaWFsb2dzIGF0IHRoZSBzYW1lIHRpbWUuIE5lZWRzIHRvIGJlIGFzeW5jLCBiZWNhdXNlIHRoZSBlbGVtZW50CiAgICAgICAgICAgICAgICAgICAgLy8gbWF5IG5vdCBiZSBmb2N1c2FibGUgaW1tZWRpYXRlbHkuCiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgd2hldGhlciBmb2N1cyBpcyBpbnNpZGUgdGhlIGRpYWxvZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NvbnRhaW5zRm9jdXMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhY3RpdmVFbGVtZW50ID0gdGhpcy5fZG9jdW1lbnQuYWN0aXZlRWxlbWVudDsKICAgICAgICAgICAgcmV0dXJuIGVsZW1lbnQgPT09IGFjdGl2ZUVsZW1lbnQgfHwgZWxlbWVudC5jb250YWlucyhhY3RpdmVFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2ssIGludm9rZWQgd2hlbmV2ZXIgYW4gYW5pbWF0aW9uIG9uIHRoZSBob3N0IGNvbXBsZXRlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25BbmltYXRpb25Eb25lKGV2ZW50KSB7CiAgICAgICAgICAgIGlmIChldmVudC50b1N0YXRlID09PSAnZW50ZXInKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90cmFwRm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChldmVudC50b1N0YXRlID09PSAnZXhpdCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVGb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2ssIGludm9rZWQgd2hlbiBhbiBhbmltYXRpb24gb24gdGhlIGhvc3Qgc3RhcnRzLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbkFuaW1hdGlvblN0YXJ0KGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5lbWl0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3RhcnRzIHRoZSBkaWFsb2cgZXhpdCBhbmltYXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3RhcnRFeGl0QW5pbWF0aW9uKCkgewogICAgICAgICAgICB0aGlzLl9zdGF0ZSA9ICdleGl0JzsKICAgICAgICAgICAgLy8gTWFyayB0aGUgY29udGFpbmVyIGZvciBjaGVjayBzbyBpdCBjYW4gcmVhY3QgaWYgdGhlCiAgICAgICAgICAgIC8vIHZpZXcgY29udGFpbmVyIGlzIHVzaW5nIE9uUHVzaCBjaGFuZ2UgZGV0ZWN0aW9uLgogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICB9CiAgICBNYXREaWFsb2dDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvY3VzVHJhcEZhY3RvcnkpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXREaWFsb2dDb25maWcpKTsgfTsKICAgIE1hdERpYWxvZ0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXREaWFsb2dDb250YWluZXIsIHNlbGVjdG9yczogW1sibWF0LWRpYWxvZy1jb250YWluZXIiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0RGlhbG9nQ29udGFpbmVyX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KENka1BvcnRhbE91dGxldCwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcG9ydGFsT3V0bGV0ID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbInRhYmluZGV4IiwgIi0xIiwgImFyaWEtbW9kYWwiLCAidHJ1ZSIsIDEsICJtYXQtZGlhbG9nLWNvbnRhaW5lciJdLCBob3N0VmFyczogNiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1Y29tcG9uZW50SG9zdFN5bnRoZXRpY0xpc3RlbmVyKCJAZGlhbG9nQ29udGFpbmVyLnN0YXJ0IiwgZnVuY3Rpb24gTWF0RGlhbG9nQ29udGFpbmVyX2FuaW1hdGlvbl9kaWFsb2dDb250YWluZXJfc3RhcnRfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbkFuaW1hdGlvblN0YXJ0KCRldmVudCk7IH0pKCJAZGlhbG9nQ29udGFpbmVyLmRvbmUiLCBmdW5jdGlvbiBNYXREaWFsb2dDb250YWluZXJfYW5pbWF0aW9uX2RpYWxvZ0NvbnRhaW5lcl9kb25lX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5fb25BbmltYXRpb25Eb25lKCRldmVudCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5faWQpKCJyb2xlIiwgY3R4Ll9jb25maWcucm9sZSkoImFyaWEtbGFiZWxsZWRieSIsIGN0eC5fY29uZmlnLmFyaWFMYWJlbCA/IG51bGwgOiBjdHguX2FyaWFMYWJlbGxlZEJ5KSgiYXJpYS1sYWJlbCIsIGN0eC5fY29uZmlnLmFyaWFMYWJlbCkoImFyaWEtZGVzY3JpYmVkYnkiLCBjdHguX2NvbmZpZy5hcmlhRGVzY3JpYmVkQnkgfHwgbnVsbCk7CiAgICAgICAgICAgIMm1ybV1cGRhdGVTeW50aGV0aWNIb3N0QmluZGluZygiQGRpYWxvZ0NvbnRhaW5lciIsIGN0eC5fc3RhdGUpOwogICAgICAgIH0gfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgZGVjbHM6IDEsIHZhcnM6IDAsIGNvbnN0czogW1siY2RrUG9ydGFsT3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdERpYWxvZ0NvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDAsIE1hdERpYWxvZ0NvbnRhaW5lcl9uZ190ZW1wbGF0ZV8wX1RlbXBsYXRlLCAwLCAwLCAibmctdGVtcGxhdGUiLCAwKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtDZGtQb3J0YWxPdXRsZXRdLCBzdHlsZXM6IFsiLm1hdC1kaWFsb2ctY29udGFpbmVye2Rpc3BsYXk6YmxvY2s7cGFkZGluZzoyNHB4O2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzphdXRvO291dGxpbmU6MDt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO21pbi1oZWlnaHQ6aW5oZXJpdDttYXgtaGVpZ2h0OmluaGVyaXR9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWRpYWxvZy1jb250YWluZXJ7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1kaWFsb2ctY29udGVudHtkaXNwbGF5OmJsb2NrO21hcmdpbjowIC0yNHB4O3BhZGRpbmc6MCAyNHB4O21heC1oZWlnaHQ6NjV2aDtvdmVyZmxvdzphdXRvOy13ZWJraXQtb3ZlcmZsb3ctc2Nyb2xsaW5nOnRvdWNofS5tYXQtZGlhbG9nLXRpdGxle21hcmdpbjowIDAgMjBweDtkaXNwbGF5OmJsb2NrfS5tYXQtZGlhbG9nLWFjdGlvbnN7cGFkZGluZzo4cHggMDtkaXNwbGF5OmZsZXg7ZmxleC13cmFwOndyYXA7bWluLWhlaWdodDo1MnB4O2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOi0yNHB4fS5tYXQtZGlhbG9nLWFjdGlvbnNbYWxpZ249ZW5kXXtqdXN0aWZ5LWNvbnRlbnQ6ZmxleC1lbmR9Lm1hdC1kaWFsb2ctYWN0aW9uc1thbGlnbj1jZW50ZXJde2p1c3RpZnktY29udGVudDpjZW50ZXJ9Lm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LWJ1dHRvbi1iYXNlKy5tYXQtYnV0dG9uLWJhc2UsLm1hdC1kaWFsb2ctYWN0aW9ucyAubWF0LW1kYy1idXR0b24tYmFzZSsubWF0LW1kYy1idXR0b24tYmFzZXttYXJnaW4tbGVmdDo4cHh9W2Rpcj1ydGxdIC5tYXQtZGlhbG9nLWFjdGlvbnMgLm1hdC1idXR0b24tYmFzZSsubWF0LWJ1dHRvbi1iYXNlLFtkaXI9cnRsXSAubWF0LWRpYWxvZy1hY3Rpb25zIC5tYXQtbWRjLWJ1dHRvbi1iYXNlKy5tYXQtbWRjLWJ1dHRvbi1iYXNle21hcmdpbi1sZWZ0OjA7bWFyZ2luLXJpZ2h0OjhweH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBkYXRhOiB7IGFuaW1hdGlvbjogW21hdERpYWxvZ0FuaW1hdGlvbnMuZGlhbG9nQ29udGFpbmVyXSB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXREaWFsb2dDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c1RyYXBGYWN0b3J5IH0sCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgICAgIHsgdHlwZTogTWF0RGlhbG9nQ29uZmlnIH0KICAgIF07CiAgICBNYXREaWFsb2dDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgX3BvcnRhbE91dGxldDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbQ2RrUG9ydGFsT3V0bGV0LCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvZGlhbG9nL2RpYWxvZy1yZWYudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gVE9ETyhqZWxib3Vybik6IHJlc2l6aW5nCiAgICAvLyBDb3VudGVyIGZvciB1bmlxdWUgZGlhbG9nIGlkcy4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCB1bmlxdWVJZCA9IDA7CiAgICAvKioKICAgICAqIFJlZmVyZW5jZSB0byBhIGRpYWxvZyBvcGVuZWQgdmlhIHRoZSBNYXREaWFsb2cgc2VydmljZS4KICAgICAqIEB0ZW1wbGF0ZSBULCBSCiAgICAgKi8KICAgIGNsYXNzIE1hdERpYWxvZ1JlZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheVJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2NvbnRhaW5lckluc3RhbmNlCiAgICAgICAgICogQHBhcmFtIHs/PX0gaWQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfb3ZlcmxheVJlZiwgX2NvbnRhaW5lckluc3RhbmNlLCBpZCA9IGBtYXQtZGlhbG9nLSR7dW5pcXVlSWQrK31gKSB7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSBfb3ZlcmxheVJlZjsKICAgICAgICAgICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UgPSBfY29udGFpbmVySW5zdGFuY2U7CiAgICAgICAgICAgIHRoaXMuaWQgPSBpZDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIHVzZXIgaXMgYWxsb3dlZCB0byBjbG9zZSB0aGUgZGlhbG9nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5kaXNhYmxlQ2xvc2UgPSB0aGlzLl9jb250YWluZXJJbnN0YW5jZS5fY29uZmlnLmRpc2FibGVDbG9zZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YmplY3QgZm9yIG5vdGlmeWluZyB0aGUgdXNlciB0aGF0IHRoZSBkaWFsb2cgaGFzIGZpbmlzaGVkIG9wZW5pbmcuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hZnRlck9wZW5lZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgZGlhbG9nIGhhcyBmaW5pc2hlZCBjbG9zaW5nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fYWZ0ZXJDbG9zZWQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3ViamVjdCBmb3Igbm90aWZ5aW5nIHRoZSB1c2VyIHRoYXQgdGhlIGRpYWxvZyBoYXMgc3RhcnRlZCBjbG9zaW5nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fYmVmb3JlQ2xvc2VkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIGRpYWxvZy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3N0YXRlID0gMCAvKiBPUEVOICovOwogICAgICAgICAgICAvLyBQYXNzIHRoZSBpZCBhbG9uZyB0byB0aGUgY29udGFpbmVyLgogICAgICAgICAgICBfY29udGFpbmVySW5zdGFuY2UuX2lkID0gaWQ7CiAgICAgICAgICAgIC8vIEVtaXQgd2hlbiBvcGVuaW5nIGFuaW1hdGlvbiBjb21wbGV0ZXMKICAgICAgICAgICAgX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiBldmVudC5waGFzZU5hbWUgPT09ICdkb25lJyAmJiBldmVudC50b1N0YXRlID09PSAnZW50ZXInKSksIHRha2UoMSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkLm5leHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gRGlzcG9zZSBvdmVybGF5IHdoZW4gY2xvc2luZyBhbmltYXRpb24gaXMgY29tcGxldGUKICAgICAgICAgICAgX2NvbnRhaW5lckluc3RhbmNlLl9hbmltYXRpb25TdGF0ZUNoYW5nZWQucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiBldmVudC5waGFzZU5hbWUgPT09ICdkb25lJyAmJiBldmVudC50b1N0YXRlID09PSAnZXhpdCcpKSwgdGFrZSgxKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jbG9zZUZhbGxiYWNrVGltZW91dCk7CiAgICAgICAgICAgICAgICB0aGlzLl9maW5pc2hEaWFsb2dDbG9zZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIF9vdmVybGF5UmVmLmRldGFjaG1lbnRzKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KHRoaXMuX3Jlc3VsdCk7CiAgICAgICAgICAgICAgICB0aGlzLl9iZWZvcmVDbG9zZWQuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyQ2xvc2VkLm5leHQodGhpcy5fcmVzdWx0KTsKICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyQ2xvc2VkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudEluc3RhbmNlID0gKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKTsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIF9vdmVybGF5UmVmLmtleWRvd25FdmVudHMoKQogICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSAmJiAhdGhpcy5kaXNhYmxlQ2xvc2UgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50KTsKICAgICAgICAgICAgfSkpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgX292ZXJsYXlSZWYuYmFja2Ryb3BDbGljaygpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlQ2xvc2UpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jb250YWluZXJJbnN0YW5jZS5fcmVjYXB0dXJlRm9jdXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2UoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9zZSB0aGUgZGlhbG9nLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGRpYWxvZ1Jlc3VsdCBPcHRpb25hbCByZXN1bHQgdG8gcmV0dXJuIHRvIHRoZSBkaWFsb2cgb3BlbmVyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xvc2UoZGlhbG9nUmVzdWx0KSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc3VsdCA9IGRpYWxvZ1Jlc3VsdDsKICAgICAgICAgICAgLy8gVHJhbnNpdGlvbiB0aGUgYmFja2Ryb3AgaW4gcGFyYWxsZWwgdG8gdGhlIGRpYWxvZy4KICAgICAgICAgICAgdGhpcy5fY29udGFpbmVySW5zdGFuY2UuX2FuaW1hdGlvblN0YXRlQ2hhbmdlZC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV2ZW50ID0+IGV2ZW50LnBoYXNlTmFtZSA9PT0gJ3N0YXJ0JykpLCB0YWtlKDEpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2JlZm9yZUNsb3NlZC5uZXh0KGRpYWxvZ1Jlc3VsdCk7CiAgICAgICAgICAgICAgICB0aGlzLl9iZWZvcmVDbG9zZWQuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoQmFja2Ryb3AoKTsKICAgICAgICAgICAgICAgIC8vIFRoZSBsb2dpYyB0aGF0IGRpc3Bvc2VzIG9mIHRoZSBvdmVybGF5IGRlcGVuZHMgb24gdGhlIGV4aXQgYW5pbWF0aW9uIGNvbXBsZXRpbmcsIGhvd2V2ZXIKICAgICAgICAgICAgICAgIC8vIGl0IGlzbid0IGd1YXJhbnRlZWQgaWYgdGhlIHBhcmVudCB2aWV3IGlzIGRlc3Ryb3llZCB3aGlsZSBpdCdzIHJ1bm5pbmcuIEFkZCBhIGZhbGxiYWNrCiAgICAgICAgICAgICAgICAvLyB0aW1lb3V0IHdoaWNoIHdpbGwgY2xlYW4gZXZlcnl0aGluZyB1cCBpZiB0aGUgYW5pbWF0aW9uIGhhc24ndCBmaXJlZCB3aXRoaW4gdGhlIHNwZWNpZmllZAogICAgICAgICAgICAgICAgLy8gYW1vdW50IG9mIHRpbWUgcGx1cyAxMDBtcy4gV2UgZG9uJ3QgbmVlZCB0byBydW4gdGhpcyBvdXRzaWRlIHRoZSBOZ1pvbmUsIGJlY2F1c2UgZm9yIHRoZQogICAgICAgICAgICAgICAgLy8gdmFzdCBtYWpvcml0eSBvZiBjYXNlcyB0aGUgdGltZW91dCB3aWxsIGhhdmUgYmVlbiBjbGVhcmVkIGJlZm9yZSBpdCBoYXMgdGhlIGNoYW5jZSB0byBmaXJlLgogICAgICAgICAgICAgICAgdGhpcy5fY2xvc2VGYWxsYmFja1RpbWVvdXQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX2ZpbmlzaERpYWxvZ0Nsb3NlKCkpLCBldmVudC50b3RhbFRpbWUgKyAxMDApOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRhaW5lckluc3RhbmNlLl9zdGFydEV4aXRBbmltYXRpb24oKTsKICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAxIC8qIENMT1NJTkcgKi87CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIGRpYWxvZyBpcyBmaW5pc2hlZCBvcGVuaW5nLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJPcGVuZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZnRlck9wZW5lZC5hc09ic2VydmFibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgaXMgbm90aWZpZWQgd2hlbiB0aGUgZGlhbG9nIGlzIGZpbmlzaGVkIGNsb3NpbmcuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZnRlckNsb3NlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2FmdGVyQ2xvc2VkLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFuIG9ic2VydmFibGUgdGhhdCBpcyBub3RpZmllZCB3aGVuIHRoZSBkaWFsb2cgaGFzIHN0YXJ0ZWQgY2xvc2luZy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGJlZm9yZUNsb3NlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2JlZm9yZUNsb3NlZC5hc09ic2VydmFibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgZW1pdHMgd2hlbiB0aGUgb3ZlcmxheSdzIGJhY2tkcm9wIGhhcyBiZWVuIGNsaWNrZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBiYWNrZHJvcENsaWNrKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheVJlZi5iYWNrZHJvcENsaWNrKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHdoZW4ga2V5ZG93biBldmVudHMgYXJlIHRhcmdldGVkIG9uIHRoZSBvdmVybGF5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAga2V5ZG93bkV2ZW50cygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBkaWFsb2cncyBwb3NpdGlvbi4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7Pz19IHBvc2l0aW9uIE5ldyBkaWFsb2cgcG9zaXRpb24uCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVQb3NpdGlvbihwb3NpdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdHJhdGVneSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2dldFBvc2l0aW9uU3RyYXRlZ3koKTsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uICYmIChwb3NpdGlvbi5sZWZ0IHx8IHBvc2l0aW9uLnJpZ2h0KSkgewogICAgICAgICAgICAgICAgcG9zaXRpb24ubGVmdCA/IHN0cmF0ZWd5LmxlZnQocG9zaXRpb24ubGVmdCkgOiBzdHJhdGVneS5yaWdodChwb3NpdGlvbi5yaWdodCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJhdGVneS5jZW50ZXJIb3Jpem9udGFsbHkoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocG9zaXRpb24gJiYgKHBvc2l0aW9uLnRvcCB8fCBwb3NpdGlvbi5ib3R0b20pKSB7CiAgICAgICAgICAgICAgICBwb3NpdGlvbi50b3AgPyBzdHJhdGVneS50b3AocG9zaXRpb24udG9wKSA6IHN0cmF0ZWd5LmJvdHRvbShwb3NpdGlvbi5ib3R0b20pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgc3RyYXRlZ3kuY2VudGVyVmVydGljYWxseSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGRpYWxvZydzIHdpZHRoIGFuZCBoZWlnaHQuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez89fSB3aWR0aCBOZXcgd2lkdGggb2YgdGhlIGRpYWxvZy4KICAgICAgICAgKiBAcGFyYW0gez89fSBoZWlnaHQgTmV3IGhlaWdodCBvZiB0aGUgZGlhbG9nLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU2l6ZSh3aWR0aCA9ICcnLCBoZWlnaHQgPSAnJykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9nZXRQb3NpdGlvblN0cmF0ZWd5KCkud2lkdGgod2lkdGgpLmhlaWdodChoZWlnaHQpOwogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9vdmVybGF5UmVmLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGQgYSBDU1MgY2xhc3Mgb3IgYW4gYXJyYXkgb2YgY2xhc3NlcyB0byB0aGUgb3ZlcmxheSBwYW5lLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBhZGRQYW5lbENsYXNzKGNsYXNzZXMpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi5hZGRQYW5lbENsYXNzKGNsYXNzZXMpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlIGEgQ1NTIGNsYXNzIG9yIGFuIGFycmF5IG9mIGNsYXNzZXMgZnJvbSB0aGUgb3ZlcmxheSBwYW5lLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVQYW5lbENsYXNzKGNsYXNzZXMpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fb3ZlcmxheVJlZi5yZW1vdmVQYW5lbENsYXNzKGNsYXNzZXMpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgZGlhbG9nJ3MgbGlmZWN5Y2xlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0U3RhdGUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRmluaXNoZXMgdGhlIGRpYWxvZyBjbG9zZSBieSB1cGRhdGluZyB0aGUgc3RhdGUgb2YgdGhlIGRpYWxvZwogICAgICAgICAqIGFuZCBkaXNwb3NpbmcgdGhlIG92ZXJsYXkuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9maW5pc2hEaWFsb2dDbG9zZSgpIHsKICAgICAgICAgICAgdGhpcy5fc3RhdGUgPSAyIC8qIENMT1NFRCAqLzsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZldGNoZXMgdGhlIHBvc2l0aW9uIHN0cmF0ZWd5IG9iamVjdCBmcm9tIHRoZSBvdmVybGF5IHJlZi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFBvc2l0aW9uU3RyYXRlZ3koKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb3ZlcmxheVJlZi5nZXRDb25maWcoKS5wb3NpdGlvblN0cmF0ZWd5KSk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2RpYWxvZy9kaWFsb2cudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBhY2Nlc3MgdGhlIGRhdGEgdGhhdCB3YXMgcGFzc2VkIGluIHRvIGEgZGlhbG9nLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9ESUFMT0dfREFUQSA9IG5ldyBJbmplY3Rpb25Ub2tlbignTWF0RGlhbG9nRGF0YScpOwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgZGlhbG9nIG9wdGlvbnMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0RJQUxPR19ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1kaWFsb2ctZGVmYXVsdC1vcHRpb25zJyk7CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSB0aGUgZGlhbG9nIGlzIG9wZW4uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0RJQUxPR19TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1kaWFsb2ctc2Nyb2xsLXN0cmF0ZWd5Jyk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlkob3ZlcmxheSkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMuYmxvY2soKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0RJQUxPR19TQ1JPTExfU1RSQVRFR1lfUFJPVklERVIgPSB7CiAgICAgICAgcHJvdmlkZTogTUFUX0RJQUxPR19TQ1JPTExfU1RSQVRFR1ksCiAgICAgICAgZGVwczogW092ZXJsYXldLAogICAgICAgIHVzZUZhY3Rvcnk6IE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZX1BST1ZJREVSX0ZBQ1RPUlksCiAgICB9OwogICAgLyoqCiAgICAgKiBTZXJ2aWNlIHRvIG9wZW4gTWF0ZXJpYWwgRGVzaWduIG1vZGFsIGRpYWxvZ3MuCiAgICAgKi8KICAgIGNsYXNzIE1hdERpYWxvZyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheQogICAgICAgICAqIEBwYXJhbSB7P30gX2luamVjdG9yCiAgICAgICAgICogQHBhcmFtIHs/fSBfbG9jYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0T3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsU3RyYXRlZ3kKICAgICAgICAgKiBAcGFyYW0gez99IF9wYXJlbnREaWFsb2cKICAgICAgICAgKiBAcGFyYW0gez99IF9vdmVybGF5Q29udGFpbmVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX292ZXJsYXksIF9pbmplY3RvciwgCiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgYF9sb2NhdGlvbmAgcGFyYW1ldGVyIHRvIGJlIHJlbW92ZWQuCiAgICAgICAgICogQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAgICAgKi8KICAgICAgICBfbG9jYXRpb24sIF9kZWZhdWx0T3B0aW9ucywgc2Nyb2xsU3RyYXRlZ3ksIF9wYXJlbnREaWFsb2csIF9vdmVybGF5Q29udGFpbmVyKSB7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXkgPSBfb3ZlcmxheTsKICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRPcHRpb25zID0gX2RlZmF1bHRPcHRpb25zOwogICAgICAgICAgICB0aGlzLl9wYXJlbnREaWFsb2cgPSBfcGFyZW50RGlhbG9nOwogICAgICAgICAgICB0aGlzLl9vdmVybGF5Q29udGFpbmVyID0gX292ZXJsYXlDb250YWluZXI7CiAgICAgICAgICAgIHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWwgPSBbXTsKICAgICAgICAgICAgdGhpcy5fYWZ0ZXJBbGxDbG9zZWRBdFRoaXNMZXZlbCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkQXRUaGlzTGV2ZWwgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICB0aGlzLl9hcmlhSGlkZGVuRWxlbWVudHMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8vIFRPRE8gKGplbGJvdXJuKTogdGlnaHRlbiB0aGUgdHlwaW5nIHJpZ2h0LWhhbmQgc2lkZSBvZiB0aGlzIGV4cHJlc3Npb24uCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGFsbCBvcGVuIGRpYWxvZyBoYXZlIGZpbmlzaGVkIGNsb3NpbmcuCiAgICAgICAgICAgICAqIFdpbGwgZW1pdCBvbiBzdWJzY3JpYmUgaWYgdGhlcmUgYXJlIG5vIG9wZW4gZGlhbG9ncyB0byBiZWdpbiB3aXRoLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hZnRlckFsbENsb3NlZCA9ICgvKiogQHR5cGUgez99ICovIChkZWZlcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aCA/CiAgICAgICAgICAgICAgICB0aGlzLl9hZnRlckFsbENsb3NlZCA6CiAgICAgICAgICAgICAgICB0aGlzLl9hZnRlckFsbENsb3NlZC5waXBlKHN0YXJ0V2l0aCh1bmRlZmluZWQpKSkpKSk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gc2Nyb2xsU3RyYXRlZ3k7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50bHktb3BlbiBkaWFsb2dzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG9wZW5EaWFsb2dzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fcGFyZW50RGlhbG9nID8gdGhpcy5fcGFyZW50RGlhbG9nLm9wZW5EaWFsb2dzIDogdGhpcy5fb3BlbkRpYWxvZ3NBdFRoaXNMZXZlbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbiBhIGRpYWxvZyBoYXMgYmVlbiBvcGVuZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYWZ0ZXJPcGVuZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wYXJlbnREaWFsb2cgPyB0aGlzLl9wYXJlbnREaWFsb2cuYWZ0ZXJPcGVuZWQgOiB0aGlzLl9hZnRlck9wZW5lZEF0VGhpc0xldmVsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfYWZ0ZXJBbGxDbG9zZWQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50RGlhbG9nOwogICAgICAgICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Ll9hZnRlckFsbENsb3NlZCA6IHRoaXMuX2FmdGVyQWxsQ2xvc2VkQXRUaGlzTGV2ZWw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE9wZW5zIGEgbW9kYWwgZGlhbG9nIGNvbnRhaW5pbmcgdGhlIGdpdmVuIGNvbXBvbmVudC4KICAgICAgICAgKiBAdGVtcGxhdGUgVCwgRCwgUgogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50T3JUZW1wbGF0ZVJlZiBUeXBlIG9mIHRoZSBjb21wb25lbnQgdG8gbG9hZCBpbnRvIHRoZSBkaWFsb2csCiAgICAgICAgICogICAgIG9yIGEgVGVtcGxhdGVSZWYgdG8gaW5zdGFudGlhdGUgYXMgdGhlIGRpYWxvZyBjb250ZW50LgogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZyBFeHRyYSBjb25maWd1cmF0aW9uIG9wdGlvbnMuCiAgICAgICAgICogQHJldHVybiB7P30gUmVmZXJlbmNlIHRvIHRoZSBuZXdseS1vcGVuZWQgZGlhbG9nLgogICAgICAgICAqLwogICAgICAgIG9wZW4oY29tcG9uZW50T3JUZW1wbGF0ZVJlZiwgY29uZmlnKSB7CiAgICAgICAgICAgIGNvbmZpZyA9IF9hcHBseUNvbmZpZ0RlZmF1bHRzKGNvbmZpZywgdGhpcy5fZGVmYXVsdE9wdGlvbnMgfHwgbmV3IE1hdERpYWxvZ0NvbmZpZygpKTsKICAgICAgICAgICAgaWYgKGNvbmZpZy5pZCAmJiB0aGlzLmdldERpYWxvZ0J5SWQoY29uZmlnLmlkKSkgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYERpYWxvZyB3aXRoIGlkICIke2NvbmZpZy5pZH0iIGV4aXN0cyBhbHJlYWR5LiBUaGUgZGlhbG9nIGlkIG11c3QgYmUgdW5pcXVlLmApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3ZlcmxheVJlZiA9IHRoaXMuX2NyZWF0ZU92ZXJsYXkoY29uZmlnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaWFsb2dDb250YWluZXIgPSB0aGlzLl9hdHRhY2hEaWFsb2dDb250YWluZXIob3ZlcmxheVJlZiwgY29uZmlnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkaWFsb2dSZWYgPSB0aGlzLl9hdHRhY2hEaWFsb2dDb250ZW50KGNvbXBvbmVudE9yVGVtcGxhdGVSZWYsIGRpYWxvZ0NvbnRhaW5lciwgb3ZlcmxheVJlZiwgY29uZmlnKTsKICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3QgZGlhbG9nIHRoYXQgd2UncmUgb3BlbmluZywgaGlkZSBhbGwgdGhlIG5vbi1vdmVybGF5IGNvbnRlbnQuCiAgICAgICAgICAgIGlmICghdGhpcy5vcGVuRGlhbG9ncy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2hpZGVOb25EaWFsb2dDb250ZW50RnJvbUFzc2lzdGl2ZVRlY2hub2xvZ3koKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9wZW5EaWFsb2dzLnB1c2goZGlhbG9nUmVmKTsKICAgICAgICAgICAgZGlhbG9nUmVmLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX3JlbW92ZU9wZW5EaWFsb2coZGlhbG9nUmVmKSkpOwogICAgICAgICAgICB0aGlzLmFmdGVyT3BlbmVkLm5leHQoZGlhbG9nUmVmKTsKICAgICAgICAgICAgcmV0dXJuIGRpYWxvZ1JlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xvc2VzIGFsbCBvZiB0aGUgY3VycmVudGx5LW9wZW4gZGlhbG9ncy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsb3NlQWxsKCkgewogICAgICAgICAgICB0aGlzLl9jbG9zZURpYWxvZ3ModGhpcy5vcGVuRGlhbG9ncyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGFuIG9wZW4gZGlhbG9nIGJ5IGl0cyBpZC4KICAgICAgICAgKiBAcGFyYW0gez99IGlkIElEIHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgdGhlIGRpYWxvZy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldERpYWxvZ0J5SWQoaWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMub3BlbkRpYWxvZ3MuZmluZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlhbG9nCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkaWFsb2cgPT4gZGlhbG9nLmlkID09PSBpZCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICAvLyBPbmx5IGNsb3NlIHRoZSBkaWFsb2dzIGF0IHRoaXMgbGV2ZWwgb24gZGVzdHJveQogICAgICAgICAgICAvLyBzaW5jZSB0aGUgcGFyZW50IHNlcnZpY2UgbWF5IHN0aWxsIGJlIGFjdGl2ZS4KICAgICAgICAgICAgdGhpcy5fY2xvc2VEaWFsb2dzKHRoaXMuX29wZW5EaWFsb2dzQXRUaGlzTGV2ZWwpOwogICAgICAgICAgICB0aGlzLl9hZnRlckFsbENsb3NlZEF0VGhpc0xldmVsLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX2FmdGVyT3BlbmVkQXRUaGlzTGV2ZWwuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyB0aGUgb3ZlcmxheSBpbnRvIHdoaWNoIHRoZSBkaWFsb2cgd2lsbCBiZSBsb2FkZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBUaGUgZGlhbG9nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30gQSBwcm9taXNlIHJlc29sdmluZyB0byB0aGUgT3ZlcmxheVJlZiBmb3IgdGhlIGNyZWF0ZWQgb3ZlcmxheS4KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlT3ZlcmxheShjb25maWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdmVybGF5Q29uZmlnID0gdGhpcy5fZ2V0T3ZlcmxheUNvbmZpZyhjb25maWcpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheS5jcmVhdGUob3ZlcmxheUNvbmZpZyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW4gb3ZlcmxheSBjb25maWcgZnJvbSBhIGRpYWxvZyBjb25maWcuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGRpYWxvZ0NvbmZpZyBUaGUgZGlhbG9nIGNvbmZpZ3VyYXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIG92ZXJsYXkgY29uZmlndXJhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBfZ2V0T3ZlcmxheUNvbmZpZyhkaWFsb2dDb25maWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGF0ZSA9IG5ldyBPdmVybGF5Q29uZmlnKHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKS5nbG9iYWwoKSwKICAgICAgICAgICAgICAgIHNjcm9sbFN0cmF0ZWd5OiBkaWFsb2dDb25maWcuc2Nyb2xsU3RyYXRlZ3kgfHwgdGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSwKICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IGRpYWxvZ0NvbmZpZy5wYW5lbENsYXNzLAogICAgICAgICAgICAgICAgaGFzQmFja2Ryb3A6IGRpYWxvZ0NvbmZpZy5oYXNCYWNrZHJvcCwKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogZGlhbG9nQ29uZmlnLmRpcmVjdGlvbiwKICAgICAgICAgICAgICAgIG1pbldpZHRoOiBkaWFsb2dDb25maWcubWluV2lkdGgsCiAgICAgICAgICAgICAgICBtaW5IZWlnaHQ6IGRpYWxvZ0NvbmZpZy5taW5IZWlnaHQsCiAgICAgICAgICAgICAgICBtYXhXaWR0aDogZGlhbG9nQ29uZmlnLm1heFdpZHRoLAogICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBkaWFsb2dDb25maWcubWF4SGVpZ2h0LAogICAgICAgICAgICAgICAgZGlzcG9zZU9uTmF2aWdhdGlvbjogZGlhbG9nQ29uZmlnLmNsb3NlT25OYXZpZ2F0aW9uCiAgICAgICAgICAgIH0pOwogICAgICAgICAgICBpZiAoZGlhbG9nQ29uZmlnLmJhY2tkcm9wQ2xhc3MpIHsKICAgICAgICAgICAgICAgIHN0YXRlLmJhY2tkcm9wQ2xhc3MgPSBkaWFsb2dDb25maWcuYmFja2Ryb3BDbGFzczsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaGVzIGFuIE1hdERpYWxvZ0NvbnRhaW5lciB0byBhIGRpYWxvZydzIGFscmVhZHktY3JlYXRlZCBvdmVybGF5LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5IFJlZmVyZW5jZSB0byB0aGUgZGlhbG9nJ3MgdW5kZXJseWluZyBvdmVybGF5LgogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnIFRoZSBkaWFsb2cgY29uZmlndXJhdGlvbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIHByb21pc2UgcmVzb2x2aW5nIHRvIGEgQ29tcG9uZW50UmVmIGZvciB0aGUgYXR0YWNoZWQgY29udGFpbmVyLgogICAgICAgICAqLwogICAgICAgIF9hdHRhY2hEaWFsb2dDb250YWluZXIob3ZlcmxheSwgY29uZmlnKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdXNlckluamVjdG9yID0gY29uZmlnICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmICYmIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLmluamVjdG9yOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gSW5qZWN0b3IuY3JlYXRlKHsKICAgICAgICAgICAgICAgIHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBNYXREaWFsb2dDb25maWcsIHVzZVZhbHVlOiBjb25maWcgfV0KICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChNYXREaWFsb2dDb250YWluZXIsIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3RvciwgY29uZmlnLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVmID0gb3ZlcmxheS5hdHRhY2goY29udGFpbmVyUG9ydGFsKTsKICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5lclJlZi5pbnN0YW5jZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhlIHVzZXItcHJvdmlkZWQgY29tcG9uZW50IHRvIHRoZSBhbHJlYWR5LWNyZWF0ZWQgTWF0RGlhbG9nQ29udGFpbmVyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRlbXBsYXRlIFQsIFIKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudE9yVGVtcGxhdGVSZWYgVGhlIHR5cGUgb2YgY29tcG9uZW50IGJlaW5nIGxvYWRlZCBpbnRvIHRoZSBkaWFsb2csCiAgICAgICAgICogICAgIG9yIGEgVGVtcGxhdGVSZWYgdG8gaW5zdGFudGlhdGUgYXMgdGhlIGNvbnRlbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBkaWFsb2dDb250YWluZXIgUmVmZXJlbmNlIHRvIHRoZSB3cmFwcGluZyBNYXREaWFsb2dDb250YWluZXIuCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5UmVmIFJlZmVyZW5jZSB0byB0aGUgb3ZlcmxheSBpbiB3aGljaCB0aGUgZGlhbG9nIHJlc2lkZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcgVGhlIGRpYWxvZyBjb25maWd1cmF0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99IEEgcHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIE1hdERpYWxvZ1JlZiB0aGF0IHNob3VsZCBiZSByZXR1cm5lZCB0byB0aGUgdXNlci4KICAgICAgICAgKi8KICAgICAgICBfYXR0YWNoRGlhbG9nQ29udGVudChjb21wb25lbnRPclRlbXBsYXRlUmVmLCBkaWFsb2dDb250YWluZXIsIG92ZXJsYXlSZWYsIGNvbmZpZykgewogICAgICAgICAgICAvLyBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIGRpYWxvZyB3ZSdyZSBjcmVhdGluZyBpbiBvcmRlciB0byBnaXZlIHRoZSB1c2VyIGEgaGFuZGxlCiAgICAgICAgICAgIC8vIHRvIG1vZGlmeSBhbmQgY2xvc2UgaXQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlhbG9nUmVmID0gbmV3IE1hdERpYWxvZ1JlZihvdmVybGF5UmVmLCBkaWFsb2dDb250YWluZXIsIGNvbmZpZy5pZCk7CiAgICAgICAgICAgIGlmIChjb21wb25lbnRPclRlbXBsYXRlUmVmIGluc3RhbmNlb2YgVGVtcGxhdGVSZWYpIHsKICAgICAgICAgICAgICAgIGRpYWxvZ0NvbnRhaW5lci5hdHRhY2hUZW1wbGF0ZVBvcnRhbChuZXcgVGVtcGxhdGVQb3J0YWwoY29tcG9uZW50T3JUZW1wbGF0ZVJlZiwgKC8qKiBAdHlwZSB7P30gKi8gKG51bGwpKSwgKC8qKiBAdHlwZSB7P30gKi8gKHsgJGltcGxpY2l0OiBjb25maWcuZGF0YSwgZGlhbG9nUmVmIH0pKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSB0aGlzLl9jcmVhdGVJbmplY3Rvcihjb25maWcsIGRpYWxvZ1JlZiwgZGlhbG9nQ29udGFpbmVyKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRSZWYgPSBkaWFsb2dDb250YWluZXIuYXR0YWNoQ29tcG9uZW50UG9ydGFsKG5ldyBDb21wb25lbnRQb3J0YWwoY29tcG9uZW50T3JUZW1wbGF0ZVJlZiwgY29uZmlnLnZpZXdDb250YWluZXJSZWYsIGluamVjdG9yKSk7CiAgICAgICAgICAgICAgICBkaWFsb2dSZWYuY29tcG9uZW50SW5zdGFuY2UgPSBjb250ZW50UmVmLmluc3RhbmNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGRpYWxvZ1JlZgogICAgICAgICAgICAgICAgLnVwZGF0ZVNpemUoY29uZmlnLndpZHRoLCBjb25maWcuaGVpZ2h0KQogICAgICAgICAgICAgICAgLnVwZGF0ZVBvc2l0aW9uKGNvbmZpZy5wb3NpdGlvbik7CiAgICAgICAgICAgIHJldHVybiBkaWFsb2dSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBjdXN0b20gaW5qZWN0b3IgdG8gYmUgdXNlZCBpbnNpZGUgdGhlIGRpYWxvZy4gVGhpcyBhbGxvd3MgYSBjb21wb25lbnQgbG9hZGVkIGluc2lkZQogICAgICAgICAqIG9mIGEgZGlhbG9nIHRvIGNsb3NlIGl0c2VsZiBhbmQsIG9wdGlvbmFsbHksIHRvIHJldHVybiBhIHZhbHVlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBDb25maWcgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGRpYWxvZy4KICAgICAgICAgKiBAcGFyYW0gez99IGRpYWxvZ1JlZiBSZWZlcmVuY2UgdG8gdGhlIGRpYWxvZy4KICAgICAgICAgKiBAcGFyYW0gez99IGRpYWxvZ0NvbnRhaW5lcgogICAgICAgICAqIEByZXR1cm4gez99IFRoZSBjdXN0b20gaW5qZWN0b3IgdGhhdCBjYW4gYmUgdXNlZCBpbnNpZGUgdGhlIGRpYWxvZy4KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlSW5qZWN0b3IoY29uZmlnLCBkaWFsb2dSZWYsIGRpYWxvZ0NvbnRhaW5lcikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVzZXJJbmplY3RvciA9IGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjsKICAgICAgICAgICAgLy8gVGhlIE1hdERpYWxvZ0NvbnRhaW5lciBpcyBpbmplY3RlZCBpbiB0aGUgcG9ydGFsIGFzIHRoZSBNYXREaWFsb2dDb250YWluZXIgYW5kIHRoZSBkaWFsb2cncwogICAgICAgICAgICAvLyBjb250ZW50IGFyZSBjcmVhdGVkIG91dCBvZiB0aGUgc2FtZSBWaWV3Q29udGFpbmVyUmVmIGFuZCBhcyBzdWNoLCBhcmUgc2libGluZ3MgZm9yIGluamVjdG9yCiAgICAgICAgICAgIC8vIHB1cnBvc2VzLiBUbyBhbGxvdyB0aGUgaGllcmFyY2h5IHRoYXQgaXMgZXhwZWN0ZWQsIHRoZSBNYXREaWFsb2dDb250YWluZXIgaXMgZXhwbGljaXRseQogICAgICAgICAgICAvLyBhZGRlZCB0byB0aGUgaW5qZWN0aW9uIHRva2Vucy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcm92aWRlcnMgPSBbCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE1hdERpYWxvZ0NvbnRhaW5lciwgdXNlVmFsdWU6IGRpYWxvZ0NvbnRhaW5lciB9LAogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNQVRfRElBTE9HX0RBVEEsIHVzZVZhbHVlOiBjb25maWcuZGF0YSB9LAogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNYXREaWFsb2dSZWYsIHVzZVZhbHVlOiBkaWFsb2dSZWYgfQogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoY29uZmlnLmRpcmVjdGlvbiAmJgogICAgICAgICAgICAgICAgKCF1c2VySW5qZWN0b3IgfHwgIXVzZXJJbmplY3Rvci5nZXQoRGlyZWN0aW9uYWxpdHksIG51bGwpKSkgewogICAgICAgICAgICAgICAgcHJvdmlkZXJzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IERpcmVjdGlvbmFsaXR5LAogICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiB7IHZhbHVlOiBjb25maWcuZGlyZWN0aW9uLCBjaGFuZ2U6IG9mKCkgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEluamVjdG9yLmNyZWF0ZSh7IHBhcmVudDogdXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLCBwcm92aWRlcnMgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYSBkaWFsb2cgZnJvbSB0aGUgYXJyYXkgb2Ygb3BlbiBkaWFsb2dzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBkaWFsb2dSZWYgRGlhbG9nIHRvIGJlIHJlbW92ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlT3BlbkRpYWxvZyhkaWFsb2dSZWYpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbmRleCA9IHRoaXMub3BlbkRpYWxvZ3MuaW5kZXhPZihkaWFsb2dSZWYpOwogICAgICAgICAgICBpZiAoaW5kZXggPiAtMSkgewogICAgICAgICAgICAgICAgdGhpcy5vcGVuRGlhbG9ncy5zcGxpY2UoaW5kZXgsIDEpOwogICAgICAgICAgICAgICAgLy8gSWYgYWxsIHRoZSBkaWFsb2dzIHdlcmUgY2xvc2VkLCByZW1vdmUvcmVzdG9yZSB0aGUgYGFyaWEtaGlkZGVuYAogICAgICAgICAgICAgICAgLy8gdG8gYSB0aGUgc2libGluZ3MgYW5kIGVtaXQgdG8gdGhlIGBhZnRlckFsbENsb3NlZGAgc3RyZWFtLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm9wZW5EaWFsb2dzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHByZXZpb3VzVmFsdWUKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChwcmV2aW91c1ZhbHVlLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwcmV2aW91c1ZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCBwcmV2aW91c1ZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdhcmlhLWhpZGRlbicpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5jbGVhcigpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2FmdGVyQWxsQ2xvc2VkLm5leHQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyBhbGwgb2YgdGhlIGNvbnRlbnQgdGhhdCBpc24ndCBhbiBvdmVybGF5IGZyb20gYXNzaXN0aXZlIHRlY2hub2xvZ3kuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oaWRlTm9uRGlhbG9nQ29udGVudEZyb21Bc3Npc3RpdmVUZWNobm9sb2d5KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlDb250YWluZXIgPSB0aGlzLl9vdmVybGF5Q29udGFpbmVyLmdldENvbnRhaW5lckVsZW1lbnQoKTsKICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgdGhlIG92ZXJsYXkgY29udGFpbmVyIGlzIGF0dGFjaGVkIHRvIHRoZSBET00uCiAgICAgICAgICAgIGlmIChvdmVybGF5Q29udGFpbmVyLnBhcmVudEVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNpYmxpbmdzID0gb3ZlcmxheUNvbnRhaW5lci5wYXJlbnRFbGVtZW50LmNoaWxkcmVuOwogICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHNpYmxpbmdzLmxlbmd0aCAtIDE7IGkgPiAtMTsgaS0tKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBzaWJsaW5nID0gc2libGluZ3NbaV07CiAgICAgICAgICAgICAgICAgICAgaWYgKHNpYmxpbmcgIT09IG92ZXJsYXlDb250YWluZXIgJiYKICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NDUklQVCcgJiYKICAgICAgICAgICAgICAgICAgICAgICAgc2libGluZy5ub2RlTmFtZSAhPT0gJ1NUWUxFJyAmJgogICAgICAgICAgICAgICAgICAgICAgICAhc2libGluZy5oYXNBdHRyaWJ1dGUoJ2FyaWEtbGl2ZScpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FyaWFIaWRkZW5FbGVtZW50cy5zZXQoc2libGluZywgc2libGluZy5nZXRBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJykpOwogICAgICAgICAgICAgICAgICAgICAgICBzaWJsaW5nLnNldEF0dHJpYnV0ZSgnYXJpYS1oaWRkZW4nLCAndHJ1ZScpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9zZXMgYWxsIG9mIHRoZSBkaWFsb2dzIGluIGFuIGFycmF5LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBkaWFsb2dzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2xvc2VEaWFsb2dzKGRpYWxvZ3MpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaSA9IGRpYWxvZ3MubGVuZ3RoOwogICAgICAgICAgICB3aGlsZSAoaS0tKSB7CiAgICAgICAgICAgICAgICAvLyBUaGUgYF9vcGVuRGlhbG9nc2AgcHJvcGVydHkgaXNuJ3QgdXBkYXRlZCBhZnRlciBjbG9zZSB1bnRpbCB0aGUgcnhqcyBzdWJzY3JpcHRpb24KICAgICAgICAgICAgICAgIC8vIHJ1bnMgb24gdGhlIG5leHQgbWljcm90YXNrLCBpbiBhZGRpdGlvbiB0byBtb2RpZnlpbmcgdGhlIGFycmF5IGFzIHdlJ3JlIGdvaW5nCiAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIGl0LiBXZSBsb29wIHRocm91Z2ggYWxsIG9mIHRoZW0gYW5kIGNhbGwgY2xvc2Ugd2l0aG91dCBhc3N1bWluZyB0aGF0CiAgICAgICAgICAgICAgICAvLyB0aGV5J2xsIGJlIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBpbnN0YW50YW5lb3VzbHkuCiAgICAgICAgICAgICAgICBkaWFsb2dzW2ldLmNsb3NlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBNYXREaWFsb2cuybVmYWMgPSBmdW5jdGlvbiBNYXREaWFsb2dfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nKSjJtcm1aW5qZWN0KE92ZXJsYXkpLCDJtcm1aW5qZWN0KEluamVjdG9yKSwgybXJtWluamVjdChMb2NhdGlvbiwgOCksIMm1ybVpbmplY3QoTUFUX0RJQUxPR19ERUZBVUxUX09QVElPTlMsIDgpLCDJtcm1aW5qZWN0KE1BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZKSwgybXJtWluamVjdChNYXREaWFsb2csIDEyKSwgybXJtWluamVjdChPdmVybGF5Q29udGFpbmVyKSk7IH07CiAgICBNYXREaWFsb2cuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTWF0RGlhbG9nLCBmYWN0b3J5OiBNYXREaWFsb2cuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdERpYWxvZy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE92ZXJsYXkgfSwKICAgICAgICB7IHR5cGU6IEluamVjdG9yIH0sCiAgICAgICAgeyB0eXBlOiBMb2NhdGlvbiwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IE1hdERpYWxvZ0NvbmZpZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfRElBTE9HX0RFRkFVTFRfT1BUSU9OUyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9ESUFMT0dfU0NST0xMX1NUUkFURUdZLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IE1hdERpYWxvZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgICAgIHsgdHlwZTogT3ZlcmxheUNvbnRhaW5lciB9CiAgICBdOwogICAgLyoqCiAgICAgKiBBcHBsaWVzIGRlZmF1bHQgb3B0aW9ucyB0byB0aGUgZGlhbG9nIGNvbmZpZy4KICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZyBDb25maWcgdG8gYmUgbW9kaWZpZWQuCiAgICAgKiBAcGFyYW0gez89fSBkZWZhdWx0T3B0aW9ucyBEZWZhdWx0IG9wdGlvbnMgcHJvdmlkZWQuCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgbmV3IGNvbmZpZ3VyYXRpb24gb2JqZWN0LgogICAgICovCiAgICBmdW5jdGlvbiBfYXBwbHlDb25maWdEZWZhdWx0cyhjb25maWcsIGRlZmF1bHRPcHRpb25zKSB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdE9wdGlvbnMpLCBjb25maWcpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2RpYWxvZy9kaWFsb2ctY29udGVudC1kaXJlY3RpdmVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ291bnRlciB1c2VkIHRvIGdlbmVyYXRlIHVuaXF1ZSBJRHMgZm9yIGRpYWxvZyBlbGVtZW50cy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBsZXQgZGlhbG9nRWxlbWVudFVpZCA9IDA7CiAgICAvKioKICAgICAqIEJ1dHRvbiB0aGF0IHdpbGwgY2xvc2UgdGhlIGN1cnJlbnQgZGlhbG9nLgogICAgICovCiAgICBjbGFzcyBNYXREaWFsb2dDbG9zZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaWFsb2dSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlhbG9nCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZGlhbG9nUmVmLCBfZWxlbWVudFJlZiwgX2RpYWxvZykgewogICAgICAgICAgICB0aGlzLmRpYWxvZ1JlZiA9IGRpYWxvZ1JlZjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9kaWFsb2cgPSBfZGlhbG9nOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRGVmYXVsdCB0byAiYnV0dG9uIiB0byBwcmV2ZW50cyBhY2NpZGVudGFsIGZvcm0gc3VibWl0cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudHlwZSA9ICdidXR0b24nOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuZGlhbG9nUmVmKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoaXMgZGlyZWN0aXZlIGlzIGluY2x1ZGVkIGluIGEgZGlhbG9nIHZpYSBUZW1wbGF0ZVJlZiAocmF0aGVyIHRoYW4gYmVpbmcKICAgICAgICAgICAgICAgIC8vIGluIGEgQ29tcG9uZW50KSwgdGhlIERpYWxvZ1JlZiBpc24ndCBhdmFpbGFibGUgdmlhIGluamVjdGlvbiBiZWNhdXNlIGVtYmVkZGVkCiAgICAgICAgICAgICAgICAvLyB2aWV3cyBjYW5ub3QgYmUgZ2l2ZW4gYSBjdXN0b20gaW5qZWN0b3IuIEluc3RlYWQsIHdlIGxvb2sgdXAgdGhlIERpYWxvZ1JlZiBieQogICAgICAgICAgICAgICAgLy8gSUQuIFRoaXMgbXVzdCBvY2N1ciBpbiBgb25Jbml0YCwgYXMgdGhlIElEIGJpbmRpbmcgZm9yIHRoZSBkaWFsb2cgY29udGFpbmVyIHdvbid0CiAgICAgICAgICAgICAgICAvLyBiZSByZXNvbHZlZCBhdCBjb25zdHJ1Y3RvciB0aW1lLgogICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ2V0Q2xvc2VzdERpYWxvZyh0aGlzLl9lbGVtZW50UmVmLCB0aGlzLl9kaWFsb2cub3BlbkRpYWxvZ3MpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJveGllZENoYW5nZSA9IGNoYW5nZXNbJ19tYXREaWFsb2dDbG9zZSddIHx8IGNoYW5nZXNbJ19tYXREaWFsb2dDbG9zZVJlc3VsdCddOwogICAgICAgICAgICBpZiAocHJveGllZENoYW5nZSkgewogICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dSZXN1bHQgPSBwcm94aWVkQ2hhbmdlLmN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE1hdERpYWxvZ0Nsb3NlLsm1ZmFjID0gZnVuY3Rpb24gTWF0RGlhbG9nQ2xvc2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nQ2xvc2UpKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0RGlhbG9nUmVmLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXREaWFsb2cpKTsgfTsKICAgIE1hdERpYWxvZ0Nsb3NlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdERpYWxvZ0Nsb3NlLCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtZGlhbG9nLWNsb3NlIiwgIiJdLCBbIiIsICJtYXREaWFsb2dDbG9zZSIsICIiXV0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdERpYWxvZ0Nsb3NlX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdERpYWxvZ0Nsb3NlX2NsaWNrX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5kaWFsb2dSZWYuY2xvc2UoY3R4LmRpYWxvZ1Jlc3VsdCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgY3R4LmFyaWFMYWJlbCB8fCBudWxsKSgidHlwZSIsIGN0eC50eXBlKTsKICAgICAgICB9IH0sIGlucHV0czogeyB0eXBlOiAidHlwZSIsIGRpYWxvZ1Jlc3VsdDogWyJtYXQtZGlhbG9nLWNsb3NlIiwgImRpYWxvZ1Jlc3VsdCJdLCBhcmlhTGFiZWw6IFsiYXJpYS1sYWJlbCIsICJhcmlhTGFiZWwiXSwgX21hdERpYWxvZ0Nsb3NlOiBbIm1hdERpYWxvZ0Nsb3NlIiwgIl9tYXREaWFsb2dDbG9zZSJdIH0sIGV4cG9ydEFzOiBbIm1hdERpYWxvZ0Nsb3NlIl0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdERpYWxvZ0Nsb3NlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogTWF0RGlhbG9nUmVmLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogTWF0RGlhbG9nIH0KICAgIF07CiAgICBNYXREaWFsb2dDbG9zZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICAgICAgdHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlhbG9nUmVzdWx0OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXQtZGlhbG9nLWNsb3NlJyxdIH1dLAogICAgICAgIF9tYXREaWFsb2dDbG9zZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0RGlhbG9nQ2xvc2UnLF0gfV0KICAgIH07CiAgICAvKioKICAgICAqIFRpdGxlIG9mIGEgZGlhbG9nIGVsZW1lbnQuIFN0YXlzIGZpeGVkIHRvIHRoZSB0b3Agb2YgdGhlIGRpYWxvZyB3aGVuIHNjcm9sbGluZy4KICAgICAqLwogICAgY2xhc3MgTWF0RGlhbG9nVGl0bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2RpYWxvZ1JlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9kaWFsb2cKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZGlhbG9nUmVmLCBfZWxlbWVudFJlZiwgX2RpYWxvZykgewogICAgICAgICAgICB0aGlzLl9kaWFsb2dSZWYgPSBfZGlhbG9nUmVmOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2RpYWxvZyA9IF9kaWFsb2c7CiAgICAgICAgICAgIHRoaXMuaWQgPSBgbWF0LWRpYWxvZy10aXRsZS0ke2RpYWxvZ0VsZW1lbnRVaWQrK31gOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2RpYWxvZ1JlZikgewogICAgICAgICAgICAgICAgdGhpcy5fZGlhbG9nUmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKGdldENsb3Nlc3REaWFsb2codGhpcy5fZWxlbWVudFJlZiwgdGhpcy5fZGlhbG9nLm9wZW5EaWFsb2dzKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9kaWFsb2dSZWYpIHsKICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250YWluZXIgPSB0aGlzLl9kaWFsb2dSZWYuX2NvbnRhaW5lckluc3RhbmNlOwogICAgICAgICAgICAgICAgICAgIGlmIChjb250YWluZXIgJiYgIWNvbnRhaW5lci5fYXJpYUxhYmVsbGVkQnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyLl9hcmlhTGFiZWxsZWRCeSA9IHRoaXMuaWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0RGlhbG9nVGl0bGUuybVmYWMgPSBmdW5jdGlvbiBNYXREaWFsb2dUaXRsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXREaWFsb2dUaXRsZSkoybXJtWRpcmVjdGl2ZUluamVjdChNYXREaWFsb2dSZWYsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdERpYWxvZykpOyB9OwogICAgTWF0RGlhbG9nVGl0bGUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0RGlhbG9nVGl0bGUsIHNlbGVjdG9yczogW1siIiwgIm1hdC1kaWFsb2ctdGl0bGUiLCAiIl0sIFsiIiwgIm1hdERpYWxvZ1RpdGxlIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1kaWFsb2ctdGl0bGUiXSwgaG9zdFZhcnM6IDEsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0RGlhbG9nVGl0bGVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1aG9zdFByb3BlcnR5KCJpZCIsIGN0eC5pZCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgaWQ6ICJpZCIgfSwgZXhwb3J0QXM6IFsibWF0RGlhbG9nVGl0bGUiXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0RGlhbG9nVGl0bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBNYXREaWFsb2dSZWYsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBNYXREaWFsb2cgfQogICAgXTsKICAgIE1hdERpYWxvZ1RpdGxlLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGlkOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogU2Nyb2xsYWJsZSBjb250ZW50IGNvbnRhaW5lciBvZiBhIGRpYWxvZy4KICAgICAqLwogICAgY2xhc3MgTWF0RGlhbG9nQ29udGVudCB7CiAgICB9CiAgICBNYXREaWFsb2dDb250ZW50Lsm1ZmFjID0gZnVuY3Rpb24gTWF0RGlhbG9nQ29udGVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXREaWFsb2dDb250ZW50KSgpOyB9OwogICAgTWF0RGlhbG9nQ29udGVudC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXREaWFsb2dDb250ZW50LCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtZGlhbG9nLWNvbnRlbnQiLCAiIl0sIFsibWF0LWRpYWxvZy1jb250ZW50Il0sIFsiIiwgIm1hdERpYWxvZ0NvbnRlbnQiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWRpYWxvZy1jb250ZW50Il0gfSk7CiAgICAvKioKICAgICAqIENvbnRhaW5lciBmb3IgdGhlIGJvdHRvbSBhY3Rpb24gYnV0dG9ucyBpbiBhIGRpYWxvZy4KICAgICAqIFN0YXlzIGZpeGVkIHRvIHRoZSBib3R0b20gd2hlbiBzY3JvbGxpbmcuCiAgICAgKi8KICAgIGNsYXNzIE1hdERpYWxvZ0FjdGlvbnMgewogICAgfQogICAgTWF0RGlhbG9nQWN0aW9ucy7JtWZhYyA9IGZ1bmN0aW9uIE1hdERpYWxvZ0FjdGlvbnNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nQWN0aW9ucykoKTsgfTsKICAgIE1hdERpYWxvZ0FjdGlvbnMuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0RGlhbG9nQWN0aW9ucywgc2VsZWN0b3JzOiBbWyIiLCAibWF0LWRpYWxvZy1hY3Rpb25zIiwgIiJdLCBbIm1hdC1kaWFsb2ctYWN0aW9ucyJdLCBbIiIsICJtYXREaWFsb2dBY3Rpb25zIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1kaWFsb2ctYWN0aW9ucyJdIH0pOwogICAgLyoqCiAgICAgKiBGaW5kcyB0aGUgY2xvc2VzdCBNYXREaWFsb2dSZWYgdG8gYW4gZWxlbWVudCBieSBsb29raW5nIGF0IHRoZSBET00uCiAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQgRWxlbWVudCByZWxhdGl2ZSB0byB3aGljaCB0byBsb29rIGZvciBhIGRpYWxvZy4KICAgICAqIEBwYXJhbSB7P30gb3BlbkRpYWxvZ3MgUmVmZXJlbmNlcyB0byB0aGUgY3VycmVudGx5LW9wZW4gZGlhbG9ncy4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENsb3Nlc3REaWFsb2coZWxlbWVudCwgb3BlbkRpYWxvZ3MpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHBhcmVudCA9IGVsZW1lbnQubmF0aXZlRWxlbWVudC5wYXJlbnRFbGVtZW50OwogICAgICAgIHdoaWxlIChwYXJlbnQgJiYgIXBhcmVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1kaWFsb2ctY29udGFpbmVyJykpIHsKICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LnBhcmVudEVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJlbnQgPyBvcGVuRGlhbG9ncy5maW5kKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRpYWxvZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlhbG9nID0+IGRpYWxvZy5pZCA9PT0gKC8qKiBAdHlwZSB7P30gKi8gKHBhcmVudCkpLmlkKSkgOiBudWxsOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2RpYWxvZy9kaWFsb2ctbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1hdERpYWxvZ01vZHVsZSB7CiAgICB9CiAgICBNYXREaWFsb2dNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXREaWFsb2dNb2R1bGUgfSk7CiAgICBNYXREaWFsb2dNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXREaWFsb2dNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0RGlhbG9nTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgTWF0RGlhbG9nLAogICAgICAgICAgICBNQVRfRElBTE9HX1NDUk9MTF9TVFJBVEVHWV9QUk9WSURFUiwKICAgICAgICBdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgT3ZlcmxheU1vZHVsZSwKICAgICAgICAgICAgICAgIFBvcnRhbE1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdERpYWxvZ01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXREaWFsb2dDb250YWluZXIsCiAgICAgICAgICAgIE1hdERpYWxvZ0Nsb3NlLAogICAgICAgICAgICBNYXREaWFsb2dUaXRsZSwKICAgICAgICAgICAgTWF0RGlhbG9nQWN0aW9ucywKICAgICAgICAgICAgTWF0RGlhbG9nQ29udGVudF07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtPdmVybGF5TW9kdWxlLAogICAgICAgICAgICBQb3J0YWxNb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXREaWFsb2dDb250YWluZXIsCiAgICAgICAgICAgIE1hdERpYWxvZ0Nsb3NlLAogICAgICAgICAgICBNYXREaWFsb2dUaXRsZSwKICAgICAgICAgICAgTWF0RGlhbG9nQ29udGVudCwKICAgICAgICAgICAgTWF0RGlhbG9nQWN0aW9ucywKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKCiAgICBjb25zdCBfYzAkNiA9IFsibWF0LWJ1dHRvbiIsICIiXTsKICAgIGNvbnN0IF9jMSQ2ID0gWyIqIl07CiAgICBjb25zdCBERUZBVUxUX1JPVU5EX0JVVFRPTl9DT0xPUiA9ICdhY2NlbnQnOwogICAgLyoqCiAgICAgKiBMaXN0IG9mIGNsYXNzZXMgdG8gYWRkIHRvIE1hdEJ1dHRvbiBpbnN0YW5jZXMgYmFzZWQgb24gaG9zdCBhdHRyaWJ1dGVzIHRvCiAgICAgKiBzdHlsZSBhcyBkaWZmZXJlbnQgdmFyaWFudHMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQlVUVE9OX0hPU1RfQVRUUklCVVRFUyA9IFsKICAgICAgICAnbWF0LWJ1dHRvbicsCiAgICAgICAgJ21hdC1mbGF0LWJ1dHRvbicsCiAgICAgICAgJ21hdC1pY29uLWJ1dHRvbicsCiAgICAgICAgJ21hdC1yYWlzZWQtYnV0dG9uJywKICAgICAgICAnbWF0LXN0cm9rZWQtYnV0dG9uJywKICAgICAgICAnbWF0LW1pbmktZmFiJywKICAgICAgICAnbWF0LWZhYicsCiAgICBdOwogICAgLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRCdXR0b24uCiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdEJ1dHRvbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdEJ1dHRvbk1peGluQmFzZSA9IG1peGluQ29sb3IobWl4aW5EaXNhYmxlZChtaXhpbkRpc2FibGVSaXBwbGUoTWF0QnV0dG9uQmFzZSkpKTsKICAgIC8qKgogICAgICogTWF0ZXJpYWwgZGVzaWduIGJ1dHRvbi4KICAgICAqLwogICAgY2xhc3MgTWF0QnV0dG9uIGV4dGVuZHMgX01hdEJ1dHRvbk1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZm9jdXNNb25pdG9yCiAgICAgICAgICogQHBhcmFtIHs/fSBfYW5pbWF0aW9uTW9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9mb2N1c01vbml0b3IsIF9hbmltYXRpb25Nb2RlKSB7CiAgICAgICAgICAgIHN1cGVyKGVsZW1lbnRSZWYpOwogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IgPSBfZm9jdXNNb25pdG9yOwogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBidXR0b24gaXMgcm91bmQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlzUm91bmRCdXR0b24gPSB0aGlzLl9oYXNIb3N0QXR0cmlidXRlcygnbWF0LWZhYicsICdtYXQtbWluaS1mYWInKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGJ1dHRvbiBpcyBpY29uIGJ1dHRvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaXNJY29uQnV0dG9uID0gdGhpcy5faGFzSG9zdEF0dHJpYnV0ZXMoJ21hdC1pY29uLWJ1dHRvbicpOwogICAgICAgICAgICAvLyBGb3IgZWFjaCBvZiB0aGUgdmFyaWFudCBzZWxlY3RvcnMgdGhhdCBpcyBwcmVzZW50IGluIHRoZSBidXR0b24ncyBob3N0CiAgICAgICAgICAgIC8vIGF0dHJpYnV0ZXMsIGFkZCB0aGUgY29ycmVjdCBjb3JyZXNwb25kaW5nIGNsYXNzLgogICAgICAgICAgICBmb3IgKGNvbnN0IGF0dHIgb2YgQlVUVE9OX0hPU1RfQVRUUklCVVRFUykgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0hvc3RBdHRyaWJ1dGVzKGF0dHIpKSB7CiAgICAgICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9nZXRIb3N0RWxlbWVudCgpKSkpLmNsYXNzTGlzdC5hZGQoYXR0cik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQWRkIGEgY2xhc3MgdGhhdCBhcHBsaWVzIHRvIGFsbCBidXR0b25zLiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byB0YXJnZXQgaWYgc29tZWJvZHkKICAgICAgICAgICAgLy8gd2FudHMgdG8gdGFyZ2V0IGFsbCBNYXRlcmlhbCBidXR0b25zLiBXZSBkbyBpdCBoZXJlIHJhdGhlciB0aGFuIGBob3N0YCB0byBlbnN1cmUgdGhhdAogICAgICAgICAgICAvLyB0aGUgY2xhc3MgaXMgYXBwbGllZCB0byBkZXJpdmVkIGNsYXNzZXMuCiAgICAgICAgICAgIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXQtYnV0dG9uLWJhc2UnKTsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwgdHJ1ZSk7CiAgICAgICAgICAgIGlmICh0aGlzLmlzUm91bmRCdXR0b24pIHsKICAgICAgICAgICAgICAgIHRoaXMuY29sb3IgPSBERUZBVUxUX1JPVU5EX0JVVFRPTl9DT0xPUjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgdGhlIGJ1dHRvbi4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcmlnaW4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb2N1cyhvcmlnaW4gPSAncHJvZ3JhbScsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2dldEhvc3RFbGVtZW50KCksIG9yaWdpbiwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEhvc3RFbGVtZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1JpcHBsZURpc2FibGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5kaXNhYmxlUmlwcGxlIHx8IHRoaXMuZGlzYWJsZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgd2hldGhlciB0aGUgYnV0dG9uIGhhcyBvbmUgb2YgdGhlIGdpdmVuIGF0dHJpYnV0ZXMuCiAgICAgICAgICogQHBhcmFtIHsuLi4/fSBhdHRyaWJ1dGVzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFzSG9zdEF0dHJpYnV0ZXMoLi4uYXR0cmlidXRlcykgewogICAgICAgICAgICByZXR1cm4gYXR0cmlidXRlcy5zb21lKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhdHRyaWJ1dGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGF0dHJpYnV0ZSA9PiB0aGlzLl9nZXRIb3N0RWxlbWVudCgpLmhhc0F0dHJpYnV0ZShhdHRyaWJ1dGUpKSk7CiAgICAgICAgfQogICAgfQogICAgTWF0QnV0dG9uLsm1ZmFjID0gZnVuY3Rpb24gTWF0QnV0dG9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEJ1dHRvbikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgTWF0QnV0dG9uLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEJ1dHRvbiwgc2VsZWN0b3JzOiBbWyJidXR0b24iLCAibWF0LWJ1dHRvbiIsICIiXSwgWyJidXR0b24iLCAibWF0LXJhaXNlZC1idXR0b24iLCAiIl0sIFsiYnV0dG9uIiwgIm1hdC1pY29uLWJ1dHRvbiIsICIiXSwgWyJidXR0b24iLCAibWF0LWZhYiIsICIiXSwgWyJidXR0b24iLCAibWF0LW1pbmktZmFiIiwgIiJdLCBbImJ1dHRvbiIsICJtYXQtc3Ryb2tlZC1idXR0b24iLCAiIl0sIFsiYnV0dG9uIiwgIm1hdC1mbGF0LWJ1dHRvbiIsICIiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0QnV0dG9uX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KE1hdFJpcHBsZSwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5yaXBwbGUgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogMywgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRCdXR0b25fSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCB8fCBudWxsKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCBjdHguX2FuaW1hdGlvbk1vZGUgPT09ICJOb29wQW5pbWF0aW9ucyIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIsIGNvbG9yOiAiY29sb3IiIH0sIGV4cG9ydEFzOiBbIm1hdEJ1dHRvbiJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBhdHRyczogX2MwJDYsIG5nQ29udGVudFNlbGVjdG9yczogX2MxJDYsIGRlY2xzOiA0LCB2YXJzOiA1LCBjb25zdHM6IFtbMSwgIm1hdC1idXR0b24td3JhcHBlciJdLCBbIm1hdFJpcHBsZSIsICIiLCAxLCAibWF0LWJ1dHRvbi1yaXBwbGUiLCAzLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAibWF0UmlwcGxlQ2VudGVyZWQiLCAibWF0UmlwcGxlVHJpZ2dlciJdLCBbMSwgIm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEJ1dHRvbl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDApOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbigxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMiwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgzLCAiZGl2IiwgMik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtYnV0dG9uLXJpcHBsZS1yb3VuZCIsIGN0eC5pc1JvdW5kQnV0dG9uIHx8IGN0eC5pc0ljb25CdXR0b24pOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4Ll9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVDZW50ZXJlZCIsIGN0eC5pc0ljb25CdXR0b24pKCJtYXRSaXBwbGVUcmlnZ2VyIiwgY3R4Ll9nZXRIb3N0RWxlbWVudCgpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRSaXBwbGVdLCBzdHlsZXM6IFsiLm1hdC1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowfS5tYXQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjA0fUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowfX0ubWF0LWJ1dHRvbiwubWF0LWljb24tYnV0dG9uLC5tYXQtc3Ryb2tlZC1idXR0b24sLm1hdC1mbGF0LWJ1dHRvbntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF0sLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZsYXQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mbGF0LWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1pY29uLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LXN0cm9rZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtZmxhdC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1yYWlzZWQtYnV0dG9ue2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpfS5tYXQtcmFpc2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtcmFpc2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtcmFpc2VkLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcmFpc2VkLWJ1dHRvbnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1zdHJva2VkLWJ1dHRvbntib3JkZXI6MXB4IHNvbGlkIGN1cnJlbnRDb2xvcjtwYWRkaW5nOjAgMTVweDtsaW5lLWhlaWdodDozNHB4fS5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGUsLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RvcDotMXB4O2xlZnQ6LTFweDtyaWdodDotMXB4O2JvdHRvbTotMXB4fS5tYXQtZmFie2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO21pbi13aWR0aDowO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjU2cHg7aGVpZ2h0OjU2cHg7cGFkZGluZzowO2ZsZXgtc2hyaW5rOjB9Lm1hdC1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1mYWJbZGlzYWJsZWRde2N1cnNvcjpkZWZhdWx0fS5tYXQtZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1mYWIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtZmFiOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVye3BhZGRpbmc6MTZweCAwO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1taW5pLWZhYntib3gtc2l6aW5nOmJvcmRlci1ib3g7cG9zaXRpb246cmVsYXRpdmU7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2N1cnNvcjpwb2ludGVyO291dGxpbmU6bm9uZTtib3JkZXI6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtZGVjb3JhdGlvbjpub25lO3ZlcnRpY2FsLWFsaWduOmJhc2VsaW5lO3RleHQtYWxpZ246Y2VudGVyO21hcmdpbjowO21pbi13aWR0aDo2NHB4O2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7Ym9yZGVyLXJhZGl1czo0cHg7b3ZlcmZsb3c6dmlzaWJsZTt0cmFuc2Zvcm06dHJhbnNsYXRlM2QoMCwgMCwgMCk7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTttaW4td2lkdGg6MDtib3JkZXItcmFkaXVzOjUwJTt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O3BhZGRpbmc6MDtmbGV4LXNocmluazowfS5tYXQtbWluaS1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1taW5pLWZhYltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1taW5pLWZhYi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtbWluaS1mYWIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5tYXQtbWluaS1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1taW5pLWZhYnt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1taW5pLWZhYiAubWF0LWJ1dHRvbi13cmFwcGVye3BhZGRpbmc6OHB4IDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MjRweH0ubWF0LWljb24tYnV0dG9ue3BhZGRpbmc6MDttaW4td2lkdGg6MDt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O2ZsZXgtc2hyaW5rOjA7bGluZS1oZWlnaHQ6NDBweDtib3JkZXItcmFkaXVzOjUwJX0ubWF0LWljb24tYnV0dG9uIGksLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257bGluZS1oZWlnaHQ6MjRweH0ubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmU7Ym9yZGVyLXJhZGl1czppbmhlcml0fS5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSAyMDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciAyMDBtcyBjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dHJhbnNpdGlvbjpub25lfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LmNkay1oaWdoLWNvbnRyYXN0LWJsYWNrLW9uLXdoaXRlIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXJpcHBsZS1yb3VuZHtib3JkZXItcmFkaXVzOjUwJTt6LWluZGV4OjF9Lm1hdC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtZmxhdC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtc3Ryb2tlZC1idXR0b24gLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtcmFpc2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1pY29uLWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1mYWIgLm1hdC1idXR0b24td3JhcHBlcj4qLC5tYXQtbWluaS1mYWIgLm1hdC1idXR0b24td3JhcHBlcj4qe3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b257ZGlzcGxheTpibG9jaztmb250LXNpemU6aW5oZXJpdDt3aWR0aDoyLjVlbTtoZWlnaHQ6Mi41ZW19LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtZmxhdC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXJhaXNlZC1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWljb24tYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mYWIsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1pbmktZmFie291dGxpbmU6c29saWQgMXB4fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0QnV0dG9uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogRm9jdXNNb25pdG9yIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfQogICAgXTsKICAgIE1hdEJ1dHRvbi5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICByaXBwbGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW01hdFJpcHBsZSxdIH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBNYXRlcmlhbCBkZXNpZ24gYW5jaG9yIGJ1dHRvbi4KICAgICAqLwogICAgY2xhc3MgTWF0QW5jaG9yIGV4dGVuZHMgTWF0QnV0dG9uIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZvY3VzTW9uaXRvcgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTW9kZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGZvY3VzTW9uaXRvciwgZWxlbWVudFJlZiwgYW5pbWF0aW9uTW9kZSkgewogICAgICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBmb2N1c01vbml0b3IsIGFuaW1hdGlvbk1vZGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFsdERpc2FibGVkRXZlbnRzKGV2ZW50KSB7CiAgICAgICAgICAgIC8vIEEgZGlzYWJsZWQgYnV0dG9uIHNob3VsZG4ndCBhcHBseSBhbnkgYWN0aW9ucwogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0QW5jaG9yLsm1ZmFjID0gZnVuY3Rpb24gTWF0QW5jaG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEFuY2hvcikoybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCkpOyB9OwogICAgTWF0QW5jaG9yLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEFuY2hvciwgc2VsZWN0b3JzOiBbWyJhIiwgIm1hdC1idXR0b24iLCAiIl0sIFsiYSIsICJtYXQtcmFpc2VkLWJ1dHRvbiIsICIiXSwgWyJhIiwgIm1hdC1pY29uLWJ1dHRvbiIsICIiXSwgWyJhIiwgIm1hdC1mYWIiLCAiIl0sIFsiYSIsICJtYXQtbWluaS1mYWIiLCAiIl0sIFsiYSIsICJtYXQtc3Ryb2tlZC1idXR0b24iLCAiIl0sIFsiYSIsICJtYXQtZmxhdC1idXR0b24iLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogNSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRBbmNob3JfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0QW5jaG9yX2NsaWNrX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFsdERpc2FibGVkRXZlbnRzKCRldmVudCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ0YWJpbmRleCIsIGN0eC5kaXNhYmxlZCA/IDAgLSAxIDogY3R4LnRhYkluZGV4IHx8IDApKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCB8fCBudWxsKSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZC50b1N0cmluZygpKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCBjdHguX2FuaW1hdGlvbk1vZGUgPT09ICJOb29wQW5pbWF0aW9ucyIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIsIGNvbG9yOiAiY29sb3IiLCB0YWJJbmRleDogInRhYkluZGV4IiB9LCBleHBvcnRBczogWyJtYXRCdXR0b24iLCAibWF0QW5jaG9yIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGF0dHJzOiBfYzAkNiwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzEkNiwgZGVjbHM6IDQsIHZhcnM6IDUsIGNvbnN0czogW1sxLCAibWF0LWJ1dHRvbi13cmFwcGVyIl0sIFsibWF0UmlwcGxlIiwgIiIsIDEsICJtYXQtYnV0dG9uLXJpcHBsZSIsIDMsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJtYXRSaXBwbGVDZW50ZXJlZCIsICJtYXRSaXBwbGVUcmlnZ2VyIl0sIFsxLCAibWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0QW5jaG9yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIiwgMCk7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgyLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDMsICJkaXYiLCAyKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1idXR0b24tcmlwcGxlLXJvdW5kIiwgY3R4LmlzUm91bmRCdXR0b24gfHwgY3R4LmlzSWNvbkJ1dHRvbik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlRGlzYWJsZWQiLCBjdHguX2lzUmlwcGxlRGlzYWJsZWQoKSkoIm1hdFJpcHBsZUNlbnRlcmVkIiwgY3R4LmlzSWNvbkJ1dHRvbikoIm1hdFJpcHBsZVRyaWdnZXIiLCBjdHguX2dldEhvc3RFbGVtZW50KCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdFJpcHBsZV0sIHN0eWxlczogWyIubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjB9Lm1hdC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uOmhvdmVyIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMDR9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWJ1dHRvbjpob3ZlciAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b246aG92ZXIgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjB9fS5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9ue2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtaWNvbi1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1zdHJva2VkLWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWZsYXQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtYnV0dG9uW2Rpc2FibGVkXSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSwubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1pY29uLWJ1dHRvbi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b24uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtZmxhdC1idXR0b24uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZsYXQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwubWF0LWljb24tYnV0dG9uOjotbW96LWZvY3VzLWlubmVyLC5tYXQtc3Ryb2tlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXIsLm1hdC1mbGF0LWJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LXJhaXNlZC1idXR0b257Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSl9Lm1hdC1yYWlzZWQtYnV0dG9uOjotbW96LWZvY3VzLWlubmVye2JvcmRlcjowfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1yYWlzZWQtYnV0dG9uLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1yYWlzZWQtYnV0dG9uLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi4xMn0ubWF0LXJhaXNlZC1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1yYWlzZWQtYnV0dG9ue3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXN0cm9rZWQtYnV0dG9ue2JvcmRlcjoxcHggc29saWQgY3VycmVudENvbG9yO3BhZGRpbmc6MCAxNXB4O2xpbmUtaGVpZ2h0OjM0cHh9Lm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi1yaXBwbGUubWF0LXJpcHBsZSwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOi0xcHg7bGVmdDotMXB4O3JpZ2h0Oi0xcHg7Ym90dG9tOi0xcHh9Lm1hdC1mYWJ7Ym94LXNpemluZzpib3JkZXItYm94O3Bvc2l0aW9uOnJlbGF0aXZlOy13ZWJraXQtdXNlci1zZWxlY3Q6bm9uZTstbW96LXVzZXItc2VsZWN0Om5vbmU7LW1zLXVzZXItc2VsZWN0Om5vbmU7dXNlci1zZWxlY3Q6bm9uZTtjdXJzb3I6cG9pbnRlcjtvdXRsaW5lOm5vbmU7Ym9yZGVyOm5vbmU7LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O2Rpc3BsYXk6aW5saW5lLWJsb2NrO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LWRlY29yYXRpb246bm9uZTt2ZXJ0aWNhbC1hbGlnbjpiYXNlbGluZTt0ZXh0LWFsaWduOmNlbnRlcjttYXJnaW46MDttaW4td2lkdGg6NjRweDtsaW5lLWhlaWdodDozNnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1yYWRpdXM6NHB4O292ZXJmbG93OnZpc2libGU7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YmFja2dyb3VuZCA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3gtc2hhZG93IDI4MG1zIGN1YmljLWJlemllcigwLjQsIDAsIDAuMiwgMSk7bWluLXdpZHRoOjA7Ym9yZGVyLXJhZGl1czo1MCU7d2lkdGg6NTZweDtoZWlnaHQ6NTZweDtwYWRkaW5nOjA7ZmxleC1zaHJpbms6MH0ubWF0LWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LWZhYltkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9Lm1hdC1mYWIuY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1mYWI6Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1mYWJ7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXJ7cGFkZGluZzoxNnB4IDA7ZGlzcGxheTppbmxpbmUtYmxvY2s7bGluZS1oZWlnaHQ6MjRweH0ubWF0LW1pbmktZmFie2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb3NpdGlvbjpyZWxhdGl2ZTstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDtkaXNwbGF5OmlubGluZS1ibG9jazt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7dmVydGljYWwtYWxpZ246YmFzZWxpbmU7dGV4dC1hbGlnbjpjZW50ZXI7bWFyZ2luOjA7bWluLXdpZHRoOjY0cHg7bGluZS1oZWlnaHQ6MzZweDtwYWRkaW5nOjAgMTZweDtib3JkZXItcmFkaXVzOjRweDtvdmVyZmxvdzp2aXNpYmxlO3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgwLCAwLCAwKTt0cmFuc2l0aW9uOmJhY2tncm91bmQgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYm94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO21pbi13aWR0aDowO2JvcmRlci1yYWRpdXM6NTAlO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7cGFkZGluZzowO2ZsZXgtc2hyaW5rOjB9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LW1pbmktZmFiW2Rpc2FibGVkXXtjdXJzb3I6ZGVmYXVsdH0ubWF0LW1pbmktZmFiLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1taW5pLWZhYi5jZGstcHJvZ3JhbS1mb2N1c2VkIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouMTJ9Lm1hdC1taW5pLWZhYjo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LW1pbmktZmFie3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LW1pbmktZmFiIC5tYXQtYnV0dG9uLXdyYXBwZXJ7cGFkZGluZzo4cHggMDtkaXNwbGF5OmlubGluZS1ibG9jaztsaW5lLWhlaWdodDoyNHB4fS5tYXQtaWNvbi1idXR0b257cGFkZGluZzowO21pbi13aWR0aDowO3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7ZmxleC1zaHJpbms6MDtsaW5lLWhlaWdodDo0MHB4O2JvcmRlci1yYWRpdXM6NTAlfS5tYXQtaWNvbi1idXR0b24gaSwubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbntsaW5lLWhlaWdodDoyNHB4fS5tYXQtYnV0dG9uLXJpcHBsZS5tYXQtcmlwcGxlLC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXR9Lm1hdC1idXR0b24tcmlwcGxlLm1hdC1yaXBwbGU6bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2ZmZn0uY2RrLWhpZ2gtY29udHJhc3QtYmxhY2stb24td2hpdGUgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tcmlwcGxlLXJvdW5ke2JvcmRlci1yYWRpdXM6NTAlO3otaW5kZXg6MX0ubWF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1mbGF0LWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1zdHJva2VkLWJ1dHRvbiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1yYWlzZWQtYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWljb24tYnV0dG9uIC5tYXQtYnV0dG9uLXdyYXBwZXI+KiwubWF0LWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPiosLm1hdC1taW5pLWZhYiAubWF0LWJ1dHRvbi13cmFwcGVyPip7dmVydGljYWwtYWxpZ246bWlkZGxlfS5tYXQtZm9ybS1maWVsZDpub3QoLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5KSAubWF0LWZvcm0tZmllbGQtcHJlZml4IC5tYXQtaWNvbi1idXR0b24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntkaXNwbGF5OmJsb2NrO2ZvbnQtc2l6ZTppbmhlcml0O3dpZHRoOjIuNWVtO2hlaWdodDoyLjVlbX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1mbGF0LWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtcmFpc2VkLWJ1dHRvbiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtaWNvbi1idXR0b24sLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWZhYiwuY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtbWluaS1mYWJ7b3V0bGluZTpzb2xpZCAxcHh9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRBbmNob3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9CiAgICBdOwogICAgTWF0QW5jaG9yLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9idXR0b24vYnV0dG9uLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRCdXR0b25Nb2R1bGUgewogICAgfQogICAgTWF0QnV0dG9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0QnV0dG9uTW9kdWxlIH0pOwogICAgTWF0QnV0dG9uTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0QnV0dG9uTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEJ1dHRvbk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIE1hdFJpcHBsZU1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdEJ1dHRvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRCdXR0b24sCiAgICAgICAgICAgIE1hdEFuY2hvcl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRSaXBwbGVNb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRCdXR0b24sCiAgICAgICAgICAgIE1hdEFuY2hvciwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKCiAgICBjbGFzcyBQZW5kaW5nQ29weSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZXh0CiAgICAgICAgICogQHBhcmFtIHs/fSBfZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0ZXh0LCBfZG9jdW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGV4dGFyZWEgPSB0aGlzLl90ZXh0YXJlYSA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVzID0gdGV4dGFyZWEuc3R5bGU7CiAgICAgICAgICAgIC8vIEhpZGUgdGhlIGVsZW1lbnQgZm9yIGRpc3BsYXkgYW5kIGFjY2Vzc2liaWxpdHkuIFNldCBhbgogICAgICAgICAgICAvLyBhYnNvbHV0ZSBwb3NpdGlvbiBzbyB0aGUgcGFnZSBsYXlvdXQgaXNuJ3QgYWZmZWN0ZWQuCiAgICAgICAgICAgIHN0eWxlcy5vcGFjaXR5ID0gJzAnOwogICAgICAgICAgICBzdHlsZXMucG9zaXRpb24gPSAnYWJzb2x1dGUnOwogICAgICAgICAgICBzdHlsZXMubGVmdCA9IHN0eWxlcy50b3AgPSAnLTk5OWVtJzsKICAgICAgICAgICAgdGV4dGFyZWEuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgIHRleHRhcmVhLnZhbHVlID0gdGV4dDsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZCh0ZXh0YXJlYSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZpbmlzaGVzIGNvcHlpbmcgdGhlIHRleHQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb3B5KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5fdGV4dGFyZWE7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN1Y2Nlc3NmdWwgPSBmYWxzZTsKICAgICAgICAgICAgdHJ5IHsgLy8gT2xkZXIgYnJvd3NlcnMgY291bGQgdGhyb3cgaWYgY29weSBpcyBub3Qgc3VwcG9ydGVkLgogICAgICAgICAgICAgICAgaWYgKHRleHRhcmVhKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRGb2N1cyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kb2N1bWVudC5hY3RpdmVFbGVtZW50KSk7CiAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuc2VsZWN0KCk7CiAgICAgICAgICAgICAgICAgICAgdGV4dGFyZWEuc2V0U2VsZWN0aW9uUmFuZ2UoMCwgdGV4dGFyZWEudmFsdWUubGVuZ3RoKTsKICAgICAgICAgICAgICAgICAgICBzdWNjZXNzZnVsID0gdGhpcy5fZG9jdW1lbnQuZXhlY0NvbW1hbmQoJ2NvcHknKTsKICAgICAgICAgICAgICAgICAgICBpZiAoY3VycmVudEZvY3VzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnRGb2N1cy5mb2N1cygpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBjYXRjaCAoX2EpIHsKICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgZXJyb3IuCiAgICAgICAgICAgICAgICAvLyBJbml0aWFsIHNldHRpbmcgb2Yge0Bjb2RlIHN1Y2Nlc3NmdWx9IHdpbGwgcmVwcmVzZW50IGZhaWx1cmUgaGVyZS4KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3VjY2Vzc2Z1bDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYW5zIHVwIERPTSBjaGFuZ2VzIHVzZWQgdG8gcGVyZm9ybSB0aGUgY29weSBvcGVyYXRpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXN0cm95KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRleHRhcmVhID0gdGhpcy5fdGV4dGFyZWE7CiAgICAgICAgICAgIGlmICh0ZXh0YXJlYSkgewogICAgICAgICAgICAgICAgaWYgKHRleHRhcmVhLnBhcmVudE5vZGUpIHsKICAgICAgICAgICAgICAgICAgICB0ZXh0YXJlYS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHRleHRhcmVhKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhID0gdW5kZWZpbmVkOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9jbGlwYm9hcmQvY2xpcGJvYXJkLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQSBzZXJ2aWNlIGZvciBjb3B5aW5nIHRleHQgdG8gdGhlIGNsaXBib2FyZC4KICAgICAqLwogICAgY2xhc3MgQ2xpcGJvYXJkIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZG9jdW1lbnQpIHsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29waWVzIHRoZSBwcm92aWRlZCB0ZXh0IGludG8gdGhlIHVzZXIncyBjbGlwYm9hcmQuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHRleHQgVGhlIHN0cmluZyB0byBjb3B5LgogICAgICAgICAqIEByZXR1cm4gez99IFdoZXRoZXIgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KICAgICAgICAgKi8KICAgICAgICBjb3B5KHRleHQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwZW5kaW5nQ29weSA9IHRoaXMuYmVnaW5Db3B5KHRleHQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN1Y2Nlc3NmdWwgPSBwZW5kaW5nQ29weS5jb3B5KCk7CiAgICAgICAgICAgIHBlbmRpbmdDb3B5LmRlc3Ryb3koKTsKICAgICAgICAgICAgcmV0dXJuIHN1Y2Nlc3NmdWw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFByZXBhcmVzIGEgc3RyaW5nIHRvIGJlIGNvcGllZCBsYXRlci4gVGhpcyBpcyB1c2VmdWwgZm9yIGxhcmdlIHN0cmluZ3MKICAgICAgICAgKiB3aGljaCB0YWtlIHRvbyBsb25nIHRvIHN1Y2Nlc3NmdWxseSByZW5kZXIgYW5kIGJlIGNvcGllZCBpbiB0aGUgc2FtZSB0aWNrLgogICAgICAgICAqCiAgICAgICAgICogVGhlIGNhbGxlciBtdXN0IGNhbGwgYGRlc3Ryb3lgIG9uIHRoZSByZXR1cm5lZCBgUGVuZGluZ0NvcHlgLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZXh0IFRoZSBzdHJpbmcgdG8gY29weS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSB0aGUgcGVuZGluZyBjb3B5IG9wZXJhdGlvbi4KICAgICAgICAgKi8KICAgICAgICBiZWdpbkNvcHkodGV4dCkgewogICAgICAgICAgICByZXR1cm4gbmV3IFBlbmRpbmdDb3B5KHRleHQsIHRoaXMuX2RvY3VtZW50KTsKICAgICAgICB9CiAgICB9CiAgICBDbGlwYm9hcmQuybVmYWMgPSBmdW5jdGlvbiBDbGlwYm9hcmRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2xpcGJvYXJkKSjJtcm1aW5qZWN0KERPQ1VNRU5UJDEpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2xpcGJvYXJkLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDbGlwYm9hcmQuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBDbGlwYm9hcmRfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBDbGlwYm9hcmQoybXJtWluamVjdChET0NVTUVOVCQxKSk7IH0sIHRva2VuOiBDbGlwYm9hcmQsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJvdmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIHRvIGBDZGtDb3B5VG9DbGlwYm9hcmRgLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IENLRF9DT1BZX1RPX0NMSVBCT0FSRF9DT05GSUcgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ0NLRF9DT1BZX1RPX0NMSVBCT0FSRF9DT05GSUcnKTsKICAgIC8qKgogICAgICogUHJvdmlkZXMgYmVoYXZpb3IgZm9yIGEgYnV0dG9uIHRoYXQgd2hlbiBjbGlja2VkIGNvcGllcyBjb250ZW50IGludG8gdXNlcidzCiAgICAgKiBjbGlwYm9hcmQuCiAgICAgKi8KICAgIGNsYXNzIENka0NvcHlUb0NsaXBib2FyZCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfY2xpcGJvYXJkCiAgICAgICAgICogQHBhcmFtIHs/PX0gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9jbGlwYm9hcmQsIF9uZ1pvbmUsIGNvbmZpZykgewogICAgICAgICAgICB0aGlzLl9jbGlwYm9hcmQgPSBfY2xpcGJvYXJkOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29udGVudCB0byBiZSBjb3BpZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnRleHQgPSAnJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEhvdyBtYW55IHRpbWVzIHRvIGF0dGVtcHQgdG8gY29weSB0aGUgdGV4dC4gVGhpcyBtYXkgYmUgbmVjZXNzYXJ5IGZvciBsb25nZXIgdGV4dCwgYmVjYXVzZQogICAgICAgICAgICAgKiB0aGUgYnJvd3NlciBuZWVkcyB0aW1lIHRvIGZpbGwgYW4gaW50ZXJtZWRpYXRlIHRleHRhcmVhIGVsZW1lbnQgYW5kIGNvcHkgdGhlIGNvbnRlbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmF0dGVtcHRzID0gMTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXRzIHdoZW4gc29tZSB0ZXh0IGlzIGNvcGllZCB0byB0aGUgY2xpcGJvYXJkLiBUaGUKICAgICAgICAgICAgICogZW1pdHRlZCB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlciBjb3B5aW5nIHdhcyBzdWNjZXNzZnVsLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jb3BpZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuIHNvbWUgdGV4dCBpcyBjb3BpZWQgdG8gdGhlIGNsaXBib2FyZC4gVGhlCiAgICAgICAgICAgICAqIGVtaXR0ZWQgdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIgY29weWluZyB3YXMgc3VjY2Vzc2Z1bC4KICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWRgIGluc3RlYWQuCiAgICAgICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGVwcmVjYXRlZENvcGllZCA9IHRoaXMuY29waWVkOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29waWVzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBhdHRlbXB0ZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wZW5kaW5nID0gbmV3IFNldCgpOwogICAgICAgICAgICBpZiAoY29uZmlnICYmIGNvbmZpZy5hdHRlbXB0cyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLmF0dGVtcHRzID0gY29uZmlnLmF0dGVtcHRzOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvcGllcyB0aGUgY3VycmVudCB0ZXh0IHRvIHRoZSBjbGlwYm9hcmQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gYXR0ZW1wdHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNvcHkoYXR0ZW1wdHMgPSB0aGlzLmF0dGVtcHRzKSB7CiAgICAgICAgICAgIGlmIChhdHRlbXB0cyA+IDEpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCByZW1haW5pbmdBdHRlbXB0cyA9IGF0dGVtcHRzOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGVuZGluZyA9IHRoaXMuX2NsaXBib2FyZC5iZWdpbkNvcHkodGhpcy50ZXh0KTsKICAgICAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcuYWRkKHBlbmRpbmcpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYXR0ZW1wdCA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3VjY2Vzc2Z1bCA9IHBlbmRpbmcuY29weSgpOwogICAgICAgICAgICAgICAgICAgIGlmICghc3VjY2Vzc2Z1bCAmJiAtLXJlbWFpbmluZ0F0dGVtcHRzICYmICF0aGlzLl9kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAgUmVtb3ZlIG51bGwgY2hlY2sgZm9yIGBfbmdab25lYC4KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX25nWm9uZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fY3VycmVudFRpbWVvdXQgPSB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gc2V0VGltZW91dChhdHRlbXB0LCAxKSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgdXNlIDEgZm9yIHRoZSB0aW1lb3V0IHNpbmNlIGl0J3MgbW9yZSBwcmVkaWN0YWJsZSB3aGVuIGZsdXNoaW5nIGluIHVuaXQgdGVzdHMuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50VGltZW91dCA9IHNldFRpbWVvdXQoYXR0ZW1wdCwgMSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRUaW1lb3V0ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVuZGluZy5kZWxldGUocGVuZGluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIHBlbmRpbmcuZGVzdHJveSgpOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNvcGllZC5lbWl0KHN1Y2Nlc3NmdWwpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgYXR0ZW1wdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5jb3BpZWQuZW1pdCh0aGlzLl9jbGlwYm9hcmQuY29weSh0aGlzLnRleHQpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudFRpbWVvdXQpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9jdXJyZW50VGltZW91dCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGVuZGluZy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb3B5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb3B5ID0+IGNvcHkuZGVzdHJveSgpKSk7CiAgICAgICAgICAgIHRoaXMuX3BlbmRpbmcuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICBDZGtDb3B5VG9DbGlwYm9hcmQuybVmYWMgPSBmdW5jdGlvbiBDZGtDb3B5VG9DbGlwYm9hcmRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrQ29weVRvQ2xpcGJvYXJkKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENsaXBib2FyZCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChDS0RfQ09QWV9UT19DTElQQk9BUkRfQ09ORklHLCA4KSk7IH07CiAgICBDZGtDb3B5VG9DbGlwYm9hcmQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQ29weVRvQ2xpcGJvYXJkLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtDb3B5VG9DbGlwYm9hcmQiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIENka0NvcHlUb0NsaXBib2FyZF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBDZGtDb3B5VG9DbGlwYm9hcmRfY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4LmNvcHkoKTsgfSk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgdGV4dDogWyJjZGtDb3B5VG9DbGlwYm9hcmQiLCAidGV4dCJdLCBhdHRlbXB0czogWyJjZGtDb3B5VG9DbGlwYm9hcmRBdHRlbXB0cyIsICJhdHRlbXB0cyJdIH0sIG91dHB1dHM6IHsgY29waWVkOiAiY2RrQ29weVRvQ2xpcGJvYXJkQ29waWVkIiwgX2RlcHJlY2F0ZWRDb3BpZWQ6ICJjb3BpZWQiIH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka0NvcHlUb0NsaXBib2FyZC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IENsaXBib2FyZCB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0tEX0NPUFlfVE9fQ0xJUEJPQVJEX0NPTkZJRyxdIH1dIH0KICAgIF07CiAgICBDZGtDb3B5VG9DbGlwYm9hcmQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdGV4dDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29weVRvQ2xpcGJvYXJkJyxdIH1dLAogICAgICAgIGF0dGVtcHRzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtDb3B5VG9DbGlwYm9hcmRBdHRlbXB0cycsXSB9XSwKICAgICAgICBjb3BpZWQ6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydjZGtDb3B5VG9DbGlwYm9hcmRDb3BpZWQnLF0gfV0sCiAgICAgICAgX2RlcHJlY2F0ZWRDb3BpZWQ6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydjb3BpZWQnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL2NsaXBib2FyZC9jbGlwYm9hcmQtbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIENsaXBib2FyZE1vZHVsZSB7CiAgICB9CiAgICBDbGlwYm9hcmRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBDbGlwYm9hcmRNb2R1bGUgfSk7CiAgICBDbGlwYm9hcmRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBDbGlwYm9hcmRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2xpcGJvYXJkTW9kdWxlKSgpOyB9IH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQ2xpcGJvYXJkTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0Nka0NvcHlUb0NsaXBib2FyZF0sIGV4cG9ydHM6IFtDZGtDb3B5VG9DbGlwYm9hcmRdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGxpY2Vuc2UgQW5ndWxhciB2OS4xLjEyCiAgICAgKiAoYykgMjAxMC0yMDIwIEdvb2dsZSBMTEMuIGh0dHBzOi8vYW5ndWxhci5pby8KICAgICAqIExpY2Vuc2U6IE1JVAogICAgICovCiAgICBjbGFzcyBIdHRwSGFuZGxlciB7CiAgICB9CiAgICAvKioKICAgICAqIEEgZmluYWwgYEh0dHBIYW5kbGVyYCB3aGljaCB3aWxsIGRpc3BhdGNoIHRoZSByZXF1ZXN0IHZpYSBicm93c2VyIEhUVFAgQVBJcyB0byBhIGJhY2tlbmQuCiAgICAgKgogICAgICogSW50ZXJjZXB0b3JzIHNpdCBiZXR3ZWVuIHRoZSBgSHR0cENsaWVudGAgaW50ZXJmYWNlIGFuZCB0aGUgYEh0dHBCYWNrZW5kYC4KICAgICAqCiAgICAgKiBXaGVuIGluamVjdGVkLCBgSHR0cEJhY2tlbmRgIGRpc3BhdGNoZXMgcmVxdWVzdHMgZGlyZWN0bHkgdG8gdGhlIGJhY2tlbmQsIHdpdGhvdXQgZ29pbmcKICAgICAqIHRocm91Z2ggdGhlIGludGVyY2VwdG9yIGNoYWluLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgSHR0cEJhY2tlbmQgewogICAgfQogICAgLyoqCiAgICAgKiBSZXByZXNlbnRzIHRoZSBoZWFkZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciBhbiBIVFRQIHJlcXVlc3QuCiAgICAgKiBJbnN0YW5jZXMgYXJlIGltbXV0YWJsZS4gTW9kaWZ5aW5nIG1ldGhvZHMgcmV0dXJuIGEgY2xvbmVkCiAgICAgKiBpbnN0YW5jZSB3aXRoIHRoZSBjaGFuZ2UuIFRoZSBvcmlnaW5hbCBvYmplY3QgaXMgbmV2ZXIgY2hhbmdlZC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBIdHRwSGVhZGVycyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ29uc3RydWN0cyBhIG5ldyBIVFRQIGhlYWRlciBvYmplY3Qgd2l0aCB0aGUgZ2l2ZW4gdmFsdWVzLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGhlYWRlcnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihoZWFkZXJzKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbnRlcm5hbCBtYXAgb2YgbG93ZXJjYXNlZCBoZWFkZXIgbmFtZXMgdG8gdGhlIG5vcm1hbGl6ZWQKICAgICAgICAgICAgICogZm9ybSBvZiB0aGUgbmFtZSAodGhlIGZvcm0gc2VlbiBmaXJzdCkuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWROYW1lcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFF1ZXVlZCB1cGRhdGVzIHRvIGJlIG1hdGVyaWFsaXplZCB0aGUgbmV4dCBpbml0aWFsaXphdGlvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubGF6eVVwZGF0ZSA9IG51bGw7CiAgICAgICAgICAgIGlmICghaGVhZGVycykgewogICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzID0gbmV3IE1hcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBoZWFkZXJzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgdGhpcy5sYXp5SW5pdCA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVycy5zcGxpdCgnXG4nKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGxpbmUKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGxpbmUgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gbGluZS5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBsaW5lLnNsaWNlKDAsIGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGtleSA9IG5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gbGluZS5zbGljZShpbmRleCArIDEpLnRyaW0oKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVTZXROb3JtYWxpemVkTmFtZShuYW1lLCBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaGVhZGVycy5oYXMoa2V5KSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLmhlYWRlcnMuZ2V0KGtleSkpKS5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoa2V5LCBbdmFsdWVdKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5sYXp5SW5pdCA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXMoaGVhZGVycykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBuYW1lID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVzID0gaGVhZGVyc1tuYW1lXTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBrZXkgPSBuYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdmFsdWVzID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gW3ZhbHVlc107CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmhlYWRlcnMuc2V0KGtleSwgdmFsdWVzKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubWF5YmVTZXROb3JtYWxpemVkTmFtZShuYW1lLCBrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIGZvciBleGlzdGVuY2Ugb2YgYSBnaXZlbiBoZWFkZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lIHRvIGNoZWNrIGZvciBleGlzdGVuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBUcnVlIGlmIHRoZSBoZWFkZXIgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuCiAgICAgICAgICovCiAgICAgICAgaGFzKG5hbWUpIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmhlYWRlcnMuaGFzKG5hbWUudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHJpZXZlcyB0aGUgZmlyc3QgdmFsdWUgb2YgYSBnaXZlbiBoZWFkZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIHZhbHVlIHN0cmluZyBpZiB0aGUgaGVhZGVyIGV4aXN0cywgbnVsbCBvdGhlcndpc2UKICAgICAgICAgKi8KICAgICAgICBnZXQobmFtZSkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSB0aGlzLmhlYWRlcnMuZ2V0KG5hbWUudG9Mb3dlckNhc2UoKSk7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZXMgJiYgdmFsdWVzLmxlbmd0aCA+IDAgPyB2YWx1ZXNbMF0gOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIG5hbWVzIG9mIHRoZSBoZWFkZXJzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gQSBsaXN0IG9mIGhlYWRlciBuYW1lcy4KICAgICAgICAgKi8KICAgICAgICBrZXlzKCkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5ub3JtYWxpemVkTmFtZXMudmFsdWVzKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgYSBsaXN0IG9mIHZhbHVlcyBmb3IgYSBnaXZlbiBoZWFkZXIuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lIGZyb20gd2hpY2ggdG8gcmV0cmlldmUgdmFsdWVzLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gQSBzdHJpbmcgb2YgdmFsdWVzIGlmIHRoZSBoZWFkZXIgZXhpc3RzLCBudWxsIG90aGVyd2lzZS4KICAgICAgICAgKi8KICAgICAgICBnZXRBbGwobmFtZSkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGVhZGVycy5nZXQobmFtZS50b0xvd2VyQ2FzZSgpKSB8fCBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBlbmRzIGEgbmV3IHZhbHVlIHRvIHRoZSBleGlzdGluZyBzZXQgb2YgdmFsdWVzIGZvciBhIGhlYWRlcgogICAgICAgICAqIGFuZCByZXR1cm5zIHRoZW0gaW4gYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lIGZvciB3aGljaCB0byBhcHBlbmQgdGhlIHZhbHVlcy4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSB2YWx1ZSB0byBhcHBlbmQuCiAgICAgICAgICoKICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIGNsb25lIG9mIHRoZSBIVFRQIGhlYWRlcnMgb2JqZWN0IHdpdGggdGhlIHZhbHVlIGFwcGVuZGVkIHRvIHRoZSBnaXZlbiBoZWFkZXIuCiAgICAgICAgICovCiAgICAgICAgYXBwZW5kKG5hbWUsIHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNsb25lKHsgbmFtZSwgdmFsdWUsIG9wOiAnYScgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgb3IgbW9kaWZpZXMgYSB2YWx1ZSBmb3IgYSBnaXZlbiBoZWFkZXIgaW4gYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UuCiAgICAgICAgICogSWYgdGhlIGhlYWRlciBhbHJlYWR5IGV4aXN0cywgaXRzIHZhbHVlIGlzIHJlcGxhY2VkIHdpdGggdGhlIGdpdmVuIHZhbHVlCiAgICAgICAgICogaW4gdGhlIHJldHVybmVkIG9iamVjdC4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZSBUaGUgaGVhZGVyIG5hbWUuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBUaGUgdmFsdWUgb3IgdmFsdWVzIHRvIHNldCBvciBvdmVyaWRlIGZvciB0aGUgZ2l2ZW4gaGVhZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gQSBjbG9uZSBvZiB0aGUgSFRUUCBoZWFkZXJzIG9iamVjdCB3aXRoIHRoZSBuZXdseSBzZXQgaGVhZGVyIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIHNldChuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IG5hbWUsIHZhbHVlLCBvcDogJ3MnIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZWxldGVzIHZhbHVlcyBmb3IgYSBnaXZlbiBoZWFkZXIgaW4gYSBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgaW5zdGFuY2UuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUgVGhlIGhlYWRlciBuYW1lLgogICAgICAgICAqIEBwYXJhbSB7Pz19IHZhbHVlIFRoZSB2YWx1ZSBvciB2YWx1ZXMgdG8gZGVsZXRlIGZvciB0aGUgZ2l2ZW4gaGVhZGVyLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30gQSBjbG9uZSBvZiB0aGUgSFRUUCBoZWFkZXJzIG9iamVjdCB3aXRoIHRoZSBnaXZlbiB2YWx1ZSBkZWxldGVkLgogICAgICAgICAqLwogICAgICAgIGRlbGV0ZShuYW1lLCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IG5hbWUsIHZhbHVlLCBvcDogJ2QnIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEBwYXJhbSB7P30gbGNOYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXliZVNldE5vcm1hbGl6ZWROYW1lKG5hbWUsIGxjTmFtZSkgewogICAgICAgICAgICBpZiAoIXRoaXMubm9ybWFsaXplZE5hbWVzLmhhcyhsY05hbWUpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWROYW1lcy5zZXQobGNOYW1lLCBuYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW5pdCgpIHsKICAgICAgICAgICAgaWYgKCEhdGhpcy5sYXp5SW5pdCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMubGF6eUluaXQgaW5zdGFuY2VvZiBIdHRwSGVhZGVycykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY29weUZyb20odGhpcy5sYXp5SW5pdCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxhenlJbml0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmxhenlJbml0ID0gbnVsbDsKICAgICAgICAgICAgICAgIGlmICghIXRoaXMubGF6eVVwZGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eVVwZGF0ZS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHVwZGF0ZQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgdXBkYXRlID0+IHRoaXMuYXBwbHlVcGRhdGUodXBkYXRlKSkpOwogICAgICAgICAgICAgICAgICAgIHRoaXMubGF6eVVwZGF0ZSA9IG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG90aGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjb3B5RnJvbShvdGhlcikgewogICAgICAgICAgICBvdGhlci5pbml0KCk7CiAgICAgICAgICAgIEFycmF5LmZyb20ob3RoZXIuaGVhZGVycy5rZXlzKCkpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAga2V5ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoa2V5LCAoLyoqIEB0eXBlIHs/fSAqLyAob3RoZXIuaGVhZGVycy5nZXQoa2V5KSkpKTsKICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZE5hbWVzLnNldChrZXksICgvKiogQHR5cGUgez99ICovIChvdGhlci5ub3JtYWxpemVkTmFtZXMuZ2V0KGtleSkpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHVwZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xvbmUodXBkYXRlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2xvbmUgPSBuZXcgSHR0cEhlYWRlcnMoKTsKICAgICAgICAgICAgY2xvbmUubGF6eUluaXQgPQogICAgICAgICAgICAgICAgKCEhdGhpcy5sYXp5SW5pdCAmJiB0aGlzLmxhenlJbml0IGluc3RhbmNlb2YgSHR0cEhlYWRlcnMpID8gdGhpcy5sYXp5SW5pdCA6IHRoaXM7CiAgICAgICAgICAgIGNsb25lLmxhenlVcGRhdGUgPSAodGhpcy5sYXp5VXBkYXRlIHx8IFtdKS5jb25jYXQoW3VwZGF0ZV0pOwogICAgICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFwcGx5VXBkYXRlKHVwZGF0ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGtleSA9IHVwZGF0ZS5uYW1lLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIHN3aXRjaCAodXBkYXRlLm9wKSB7CiAgICAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgICAgIGNhc2UgJ3MnOgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlLnZhbHVlKSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBbdmFsdWVdOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXliZVNldE5vcm1hbGl6ZWROYW1lKHVwZGF0ZS5uYW1lLCBrZXkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKHVwZGF0ZS5vcCA9PT0gJ2EnID8gdGhpcy5oZWFkZXJzLmdldChrZXkpIDogdW5kZWZpbmVkKSB8fCBbXTsKICAgICAgICAgICAgICAgICAgICBiYXNlLnB1c2goLi4udmFsdWUpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5zZXQoa2V5LCBiYXNlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJ2QnOgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB0b0RlbGV0ZSA9ICgvKiogQHR5cGUgez99ICovICh1cGRhdGUudmFsdWUpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoIXRvRGVsZXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVkTmFtZXMuZGVsZXRlKGtleSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBleGlzdGluZyA9IHRoaXMuaGVhZGVycy5nZXQoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFleGlzdGluZykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gZXhpc3RpbmcuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPT4gdG9EZWxldGUuaW5kZXhPZih2YWx1ZSkgPT09IC0xKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChleGlzdGluZy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycy5kZWxldGUoa2V5KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm9ybWFsaXplZE5hbWVzLmRlbGV0ZShrZXkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5oZWFkZXJzLnNldChrZXksIGV4aXN0aW5nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBcQGludGVybmFsCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9yRWFjaChmbikgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLm5vcm1hbGl6ZWROYW1lcy5rZXlzKCkpCiAgICAgICAgICAgICAgICAuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBrZXkgPT4gZm4oKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubm9ybWFsaXplZE5hbWVzLmdldChrZXkpKSksICgvKiogQHR5cGUgez99ICovICh0aGlzLmhlYWRlcnMuZ2V0KGtleSkpKSkpKTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFByb3ZpZGVzIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBVUkwgcGFyYW1ldGVyIGFuZCBxdWVyeS1zdHJpbmcgdmFsdWVzLgogICAgICoKICAgICAqIFNlcmlhbGl6ZXMgYW5kIHBhcnNlcyBVUkwgcGFyYW1ldGVyIGtleXMgYW5kIHZhbHVlcyB0byBlbmNvZGUgYW5kIGRlY29kZSB0aGVtLgogICAgICogSWYgeW91IHBhc3MgVVJMIHF1ZXJ5IHBhcmFtZXRlcnMgd2l0aG91dCBlbmNvZGluZywKICAgICAqIHRoZSBxdWVyeSBwYXJhbWV0ZXJzIGNhbiBiZSBtaXNpbnRlcnByZXRlZCBhdCB0aGUgcmVjZWl2aW5nIGVuZC4KICAgICAqCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSHR0cFVybEVuY29kaW5nQ29kZWMgewogICAgICAgIC8qKgogICAgICAgICAqIEVuY29kZXMgYSBrZXkgbmFtZSBmb3IgYSBVUkwgcGFyYW1ldGVyIG9yIHF1ZXJ5LXN0cmluZy4KICAgICAgICAgKiBAcGFyYW0gez99IGtleSBUaGUga2V5IG5hbWUuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIGVuY29kZWQga2V5IG5hbWUuCiAgICAgICAgICovCiAgICAgICAgZW5jb2RlS2V5KGtleSkgewogICAgICAgICAgICByZXR1cm4gc3RhbmRhcmRFbmNvZGluZyhrZXkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbmNvZGVzIHRoZSB2YWx1ZSBvZiBhIFVSTCBwYXJhbWV0ZXIgb3IgcXVlcnktc3RyaW5nLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIHZhbHVlLgogICAgICAgICAqIEByZXR1cm4gez99IFRoZSBlbmNvZGVkIHZhbHVlLgogICAgICAgICAqLwogICAgICAgIGVuY29kZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHJldHVybiBzdGFuZGFyZEVuY29kaW5nKHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVjb2RlcyBhbiBlbmNvZGVkIFVSTCBwYXJhbWV0ZXIgb3IgcXVlcnktc3RyaW5nIGtleS4KICAgICAgICAgKiBAcGFyYW0gez99IGtleSBUaGUgZW5jb2RlZCBrZXkgbmFtZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgZGVjb2RlZCBrZXkgbmFtZS4KICAgICAgICAgKi8KICAgICAgICBkZWNvZGVLZXkoa2V5KSB7CiAgICAgICAgICAgIHJldHVybiBkZWNvZGVVUklDb21wb25lbnQoa2V5KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGVjb2RlcyBhbiBlbmNvZGVkIFVSTCBwYXJhbWV0ZXIgb3IgcXVlcnktc3RyaW5nIHZhbHVlLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgVGhlIGVuY29kZWQgdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30gVGhlIGRlY29kZWQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgZGVjb2RlVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh2YWx1ZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJhd1BhcmFtcwogICAgICogQHBhcmFtIHs/fSBjb2RlYwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFyYW1QYXJzZXIocmF3UGFyYW1zLCBjb2RlYykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgaWYgKHJhd1BhcmFtcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gcmF3UGFyYW1zLnNwbGl0KCcmJyk7CiAgICAgICAgICAgIHBhcmFtcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHBhcmFtKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlcUlkeCA9IHBhcmFtLmluZGV4T2YoJz0nKTsKICAgICAgICAgICAgICAgIGNvbnN0IFtrZXksIHZhbF0gPSBlcUlkeCA9PSAtMSA/CiAgICAgICAgICAgICAgICAgICAgW2NvZGVjLmRlY29kZUtleShwYXJhbSksICcnXSA6CiAgICAgICAgICAgICAgICAgICAgW2NvZGVjLmRlY29kZUtleShwYXJhbS5zbGljZSgwLCBlcUlkeCkpLCBjb2RlYy5kZWNvZGVWYWx1ZShwYXJhbS5zbGljZShlcUlkeCArIDEpKV07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsaXN0ID0gbWFwLmdldChrZXkpIHx8IFtdOwogICAgICAgICAgICAgICAgbGlzdC5wdXNoKHZhbCk7CiAgICAgICAgICAgICAgICBtYXAuc2V0KGtleSwgbGlzdCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hcDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSB2CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzdGFuZGFyZEVuY29kaW5nKHYpIHsKICAgICAgICByZXR1cm4gZW5jb2RlVVJJQ29tcG9uZW50KHYpCiAgICAgICAgICAgIC5yZXBsYWNlKC8lNDAvZ2ksICdAJykKICAgICAgICAgICAgLnJlcGxhY2UoLyUzQS9naSwgJzonKQogICAgICAgICAgICAucmVwbGFjZSgvJTI0L2dpLCAnJCcpCiAgICAgICAgICAgIC5yZXBsYWNlKC8lMkMvZ2ksICcsJykKICAgICAgICAgICAgLnJlcGxhY2UoLyUzQi9naSwgJzsnKQogICAgICAgICAgICAucmVwbGFjZSgvJTJCL2dpLCAnKycpCiAgICAgICAgICAgIC5yZXBsYWNlKC8lM0QvZ2ksICc9JykKICAgICAgICAgICAgLnJlcGxhY2UoLyUzRi9naSwgJz8nKQogICAgICAgICAgICAucmVwbGFjZSgvJTJGL2dpLCAnLycpOwogICAgfQogICAgLyoqCiAgICAgKiBBbiBIVFRQIHJlcXVlc3QvcmVzcG9uc2UgYm9keSB0aGF0IHJlcHJlc2VudHMgc2VyaWFsaXplZCBwYXJhbWV0ZXJzLAogICAgICogcGVyIHRoZSBNSU1FIHR5cGUgYGFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZGAuCiAgICAgKgogICAgICogVGhpcyBjbGFzcyBpcyBpbW11dGFibGU7IGFsbCBtdXRhdGlvbiBvcGVyYXRpb25zIHJldHVybiBhIG5ldyBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBIdHRwUGFyYW1zIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iob3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovICh7fSkpKSB7CiAgICAgICAgICAgIHRoaXMudXBkYXRlcyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuY2xvbmVGcm9tID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5lbmNvZGVyID0gb3B0aW9ucy5lbmNvZGVyIHx8IG5ldyBIdHRwVXJsRW5jb2RpbmdDb2RlYygpOwogICAgICAgICAgICBpZiAoISFvcHRpb25zLmZyb21TdHJpbmcpIHsKICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMuZnJvbU9iamVjdCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IHNwZWNpZnkgYm90aCBmcm9tU3RyaW5nIGFuZCBmcm9tT2JqZWN0LmApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5tYXAgPSBwYXJhbVBhcnNlcihvcHRpb25zLmZyb21TdHJpbmcsIHRoaXMuZW5jb2Rlcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoISFvcHRpb25zLmZyb21PYmplY3QpIHsKICAgICAgICAgICAgICAgIHRoaXMubWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICAgICAgT2JqZWN0LmtleXMob3B0aW9ucy5mcm9tT2JqZWN0KS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBrZXkgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAob3B0aW9ucy5mcm9tT2JqZWN0KSkpW2tleV07CiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuc2V0KGtleSwgQXJyYXkuaXNBcnJheSh2YWx1ZSkgPyB2YWx1ZSA6IFt2YWx1ZV0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5tYXAgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlcG9ydHMgd2hldGhlciB0aGUgYm9keSBpbmNsdWRlcyBvbmUgb3IgbW9yZSB2YWx1ZXMgZm9yIGEgZ2l2ZW4gcGFyYW1ldGVyLgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW0gVGhlIHBhcmFtZXRlciBuYW1lLgogICAgICAgICAqIEByZXR1cm4gez99IFRydWUgaWYgdGhlIHBhcmFtZXRlciBoYXMgb25lIG9yIG1vcmUgdmFsdWVzLAogICAgICAgICAqIGZhbHNlIGlmIGl0IGhhcyBubyB2YWx1ZSBvciBpcyBub3QgcHJlc2VudC4KICAgICAgICAgKi8KICAgICAgICBoYXMocGFyYW0pIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5oYXMocGFyYW0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXRyaWV2ZXMgdGhlIGZpcnN0IHZhbHVlIGZvciBhIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtIFRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBUaGUgZmlyc3QgdmFsdWUgb2YgdGhlIGdpdmVuIHBhcmFtZXRlciwKICAgICAgICAgKiBvciBgbnVsbGAgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QgcHJlc2VudC4KICAgICAgICAgKi8KICAgICAgICBnZXQocGFyYW0pIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZ2V0KHBhcmFtKTsKICAgICAgICAgICAgcmV0dXJuICEhcmVzID8gcmVzWzBdIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFsbCB2YWx1ZXMgZm9yIGEgIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtIFRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBbGwgdmFsdWVzIGluIGEgc3RyaW5nIGFycmF5LAogICAgICAgICAqIG9yIGBudWxsYCBpZiB0aGUgcGFyYW1ldGVyIG5vdCBwcmVzZW50LgogICAgICAgICAqLwogICAgICAgIGdldEFsbChwYXJhbSkgewogICAgICAgICAgICB0aGlzLmluaXQoKTsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLmdldChwYXJhbSkgfHwgbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0cmlldmVzIGFsbCB0aGUgcGFyYW1ldGVycyBmb3IgdGhpcyBib2R5LgogICAgICAgICAqIEByZXR1cm4gez99IFRoZSBwYXJhbWV0ZXIgbmFtZXMgaW4gYSBzdHJpbmcgYXJyYXkuCiAgICAgICAgICovCiAgICAgICAga2V5cygpIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKCgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLmtleXMoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFwcGVuZHMgYSBuZXcgdmFsdWUgdG8gZXhpc3RpbmcgdmFsdWVzIGZvciBhIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtIFRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBuZXcgdmFsdWUgdG8gYWRkLgogICAgICAgICAqIEByZXR1cm4gez99IEEgbmV3IGJvZHkgd2l0aCB0aGUgYXBwZW5kZWQgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgYXBwZW5kKHBhcmFtLCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IHBhcmFtLCB2YWx1ZSwgb3A6ICdhJyB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVwbGFjZXMgdGhlIHZhbHVlIGZvciBhIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtIFRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIFRoZSBuZXcgdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30gQSBuZXcgYm9keSB3aXRoIHRoZSBuZXcgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgc2V0KHBhcmFtLCB2YWx1ZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jbG9uZSh7IHBhcmFtLCB2YWx1ZSwgb3A6ICdzJyB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGdpdmVuIHZhbHVlIG9yIGFsbCB2YWx1ZXMgZnJvbSBhIHBhcmFtZXRlci4KICAgICAgICAgKiBAcGFyYW0gez99IHBhcmFtIFRoZSBwYXJhbWV0ZXIgbmFtZS4KICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZSBUaGUgdmFsdWUgdG8gcmVtb3ZlLCBpZiBwcm92aWRlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIG5ldyBib2R5IHdpdGggdGhlIGdpdmVuIHZhbHVlIHJlbW92ZWQsIG9yIHdpdGggYWxsIHZhbHVlcwogICAgICAgICAqIHJlbW92ZWQgaWYgbm8gdmFsdWUgaXMgc3BlY2lmaWVkLgogICAgICAgICAqLwogICAgICAgIGRlbGV0ZShwYXJhbSwgdmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2xvbmUoeyBwYXJhbSwgdmFsdWUsIG9wOiAnZCcgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlcmlhbGl6ZXMgdGhlIGJvZHkgdG8gYW4gZW5jb2RlZCBzdHJpbmcsIHdoZXJlIGtleS12YWx1ZSBwYWlycyAoc2VwYXJhdGVkIGJ5IGA9YCkgYXJlCiAgICAgICAgICogc2VwYXJhdGVkIGJ5IGAmYHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b1N0cmluZygpIHsKICAgICAgICAgICAgdGhpcy5pbml0KCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmtleXMoKQogICAgICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBrZXkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZUtleSA9IHRoaXMuZW5jb2Rlci5lbmNvZGVLZXkoa2V5KTsKICAgICAgICAgICAgICAgIC8vIGBhOiBbJzEnXWAgcHJvZHVjZXMgYCdhPTEnYAogICAgICAgICAgICAgICAgLy8gYGI6IFtdYCBwcm9kdWNlcyBgJydgCiAgICAgICAgICAgICAgICAvLyBgYzogWycxJywgJzInXWAgcHJvZHVjZXMgYCdjPTEmYz0yJ2AKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZ2V0KGtleSkpKS5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdmFsdWUgPT4gZUtleSArICc9JyArIHRoaXMuZW5jb2Rlci5lbmNvZGVWYWx1ZSh2YWx1ZSkpKQogICAgICAgICAgICAgICAgICAgIC5qb2luKCcmJyk7CiAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAgLy8gZmlsdGVyIG91dCBlbXB0eSB2YWx1ZXMgYmVjYXVzZSBgYjogW11gIHByb2R1Y2VzIGAnJ2AKICAgICAgICAgICAgICAgIC8vIHdoaWNoIHJlc3VsdHMgaW4gYGE9MSYmYz0xJmM9MmAgaW5zdGVhZCBvZiBgYT0xJmM9MSZjPTJgIGlmIHdlIGRvbid0CiAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcGFyYW0gPT4gcGFyYW0gIT09ICcnKSkKICAgICAgICAgICAgICAgIC5qb2luKCcmJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsb25lKHVwZGF0ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsb25lID0gbmV3IEh0dHBQYXJhbXMoKC8qKiBAdHlwZSB7P30gKi8gKHsgZW5jb2RlcjogdGhpcy5lbmNvZGVyIH0pKSk7CiAgICAgICAgICAgIGNsb25lLmNsb25lRnJvbSA9IHRoaXMuY2xvbmVGcm9tIHx8IHRoaXM7CiAgICAgICAgICAgIGNsb25lLnVwZGF0ZXMgPSAodGhpcy51cGRhdGVzIHx8IFtdKS5jb25jYXQoW3VwZGF0ZV0pOwogICAgICAgICAgICByZXR1cm4gY2xvbmU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbml0KCkgewogICAgICAgICAgICBpZiAodGhpcy5tYXAgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMubWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLmNsb25lRnJvbSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5jbG9uZUZyb20uaW5pdCgpOwogICAgICAgICAgICAgICAgdGhpcy5jbG9uZUZyb20ua2V5cygpLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGtleSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5zZXQoa2V5LCAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovICh0aGlzLmNsb25lRnJvbSkpLm1hcCkpLmdldChrZXkpKSkpKSk7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy51cGRhdGVzKSkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHVwZGF0ZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdXBkYXRlID0+IHsKICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHVwZGF0ZS5vcCkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlID0gKHVwZGF0ZS5vcCA9PT0gJ2EnID8gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZ2V0KHVwZGF0ZS5wYXJhbSkgOiB1bmRlZmluZWQpIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZS5wdXNoKCgvKiogQHR5cGUgez99ICovICh1cGRhdGUudmFsdWUpKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tYXApKS5zZXQodXBkYXRlLnBhcmFtLCBiYXNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdkJzoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGUudmFsdWUgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYmFzZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLmdldCh1cGRhdGUucGFyYW0pIHx8IFtdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBiYXNlLmluZGV4T2YodXBkYXRlLnZhbHVlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaWR4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLnNwbGljZShpZHgsIDEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYmFzZS5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLm1hcCkpLnNldCh1cGRhdGUucGFyYW0sIGJhc2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZGVsZXRlKHVwZGF0ZS5wYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMubWFwKSkuZGVsZXRlKHVwZGF0ZS5wYXJhbSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgdGhpcy5jbG9uZUZyb20gPSB0aGlzLnVwZGF0ZXMgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gSFRUUCBtZXRob2QgbWF5IGluY2x1ZGUgYSBib2R5LgogICAgICogQHBhcmFtIHs/fSBtZXRob2QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1pZ2h0SGF2ZUJvZHkobWV0aG9kKSB7CiAgICAgICAgc3dpdGNoIChtZXRob2QpIHsKICAgICAgICAgICAgY2FzZSAnREVMRVRFJzoKICAgICAgICAgICAgY2FzZSAnR0VUJzoKICAgICAgICAgICAgY2FzZSAnSEVBRCc6CiAgICAgICAgICAgIGNhc2UgJ09QVElPTlMnOgogICAgICAgICAgICBjYXNlICdKU09OUCc6CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNhZmVseSBhc3NlcnQgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYW4gQXJyYXlCdWZmZXIuCiAgICAgKgogICAgICogSW4gc29tZSBleGVjdXRpb24gZW52aXJvbm1lbnRzIEFycmF5QnVmZmVyIGlzIG5vdCBkZWZpbmVkLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNBcnJheUJ1ZmZlcih2YWx1ZSkgewogICAgICAgIHJldHVybiB0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXI7CiAgICB9CiAgICAvKioKICAgICAqIFNhZmVseSBhc3NlcnQgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBCbG9iLgogICAgICoKICAgICAqIEluIHNvbWUgZXhlY3V0aW9uIGVudmlyb25tZW50cyBCbG9iIGlzIG5vdCBkZWZpbmVkLgogICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaXNCbG9iKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBCbG9iICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEJsb2I7CiAgICB9CiAgICAvKioKICAgICAqIFNhZmVseSBhc3NlcnQgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBGb3JtRGF0YSBpbnN0YW5jZS4KICAgICAqCiAgICAgKiBJbiBzb21lIGV4ZWN1dGlvbiBlbnZpcm9ubWVudHMgRm9ybURhdGEgaXMgbm90IGRlZmluZWQuCiAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBpc0Zvcm1EYXRhKHZhbHVlKSB7CiAgICAgICAgcmV0dXJuIHR5cGVvZiBGb3JtRGF0YSAhPT0gJ3VuZGVmaW5lZCcgJiYgdmFsdWUgaW5zdGFuY2VvZiBGb3JtRGF0YTsKICAgIH0KICAgIC8qKgogICAgICogQW4gb3V0Z29pbmcgSFRUUCByZXF1ZXN0IHdpdGggYW4gb3B0aW9uYWwgdHlwZWQgYm9keS4KICAgICAqCiAgICAgKiBgSHR0cFJlcXVlc3RgIHJlcHJlc2VudHMgYW4gb3V0Z29pbmcgcmVxdWVzdCwgaW5jbHVkaW5nIFVSTCwgbWV0aG9kLAogICAgICogaGVhZGVycywgYm9keSwgYW5kIG90aGVyIHJlcXVlc3QgY29uZmlndXJhdGlvbiBvcHRpb25zLiBJbnN0YW5jZXMgc2hvdWxkIGJlCiAgICAgKiBhc3N1bWVkIHRvIGJlIGltbXV0YWJsZS4gVG8gbW9kaWZ5IGEgYEh0dHBSZXF1ZXN0YCwgdGhlIGBjbG9uZWAKICAgICAqIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgSHR0cFJlcXVlc3QgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0aG9kCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcGFyYW0gez89fSB0aGlyZAogICAgICAgICAqIEBwYXJhbSB7Pz19IGZvdXJ0aAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgdXJsLCB0aGlyZCwgZm91cnRoKSB7CiAgICAgICAgICAgIHRoaXMudXJsID0gdXJsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIHJlcXVlc3QgYm9keSwgb3IgYG51bGxgIGlmIG9uZSBpc24ndCBzZXQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEJvZGllcyBhcmUgbm90IGVuZm9yY2VkIHRvIGJlIGltbXV0YWJsZSwgYXMgdGhleSBjYW4gaW5jbHVkZSBhIHJlZmVyZW5jZSB0byBhbnkKICAgICAgICAgICAgICogdXNlci1kZWZpbmVkIGRhdGEgdHlwZS4gSG93ZXZlciwgaW50ZXJjZXB0b3JzIHNob3VsZCB0YWtlIGNhcmUgdG8gcHJlc2VydmUKICAgICAgICAgICAgICogaWRlbXBvdGVuY2UgYnkgdHJlYXRpbmcgdGhlbSBhcyBzdWNoLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5ib2R5ID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBtYWRlIGluIGEgd2F5IHRoYXQgZXhwb3NlcyBwcm9ncmVzcyBldmVudHMuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFByb2dyZXNzIGV2ZW50cyBhcmUgZXhwZW5zaXZlIChjaGFuZ2UgZGV0ZWN0aW9uIHJ1bnMgb24gZWFjaCBldmVudCkgYW5kIHNvCiAgICAgICAgICAgICAqIHRoZXkgc2hvdWxkIG9ubHkgYmUgcmVxdWVzdGVkIGlmIHRoZSBjb25zdW1lciBpbnRlbmRzIHRvIG1vbml0b3IgdGhlbS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucmVwb3J0UHJvZ3Jlc3MgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhpcyByZXF1ZXN0IHNob3VsZCBiZSBzZW50IHdpdGggb3V0Z29pbmcgY3JlZGVudGlhbHMgKGNvb2tpZXMpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy53aXRoQ3JlZGVudGlhbHMgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBleHBlY3RlZCByZXNwb25zZSB0eXBlIG9mIHRoZSBzZXJ2ZXIuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIFRoaXMgaXMgdXNlZCB0byBwYXJzZSB0aGUgcmVzcG9uc2UgYXBwcm9wcmlhdGVseSBiZWZvcmUgcmV0dXJuaW5nIGl0IHRvCiAgICAgICAgICAgICAqIHRoZSByZXF1ZXN0ZWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnJlc3BvbnNlVHlwZSA9ICdqc29uJzsKICAgICAgICAgICAgdGhpcy5tZXRob2QgPSBtZXRob2QudG9VcHBlckNhc2UoKTsKICAgICAgICAgICAgLy8gTmV4dCwgbmVlZCB0byBmaWd1cmUgb3V0IHdoaWNoIGFyZ3VtZW50IGhvbGRzIHRoZSBIdHRwUmVxdWVzdEluaXQKICAgICAgICAgICAgLy8gb3B0aW9ucywgaWYgYW55LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvcHRpb25zOwogICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGEgYm9keSBhcmd1bWVudCBpcyBleHBlY3RlZC4gVGhlIG9ubHkgdmFsaWQgd2F5IHRvIG9taXQKICAgICAgICAgICAgLy8gdGhlIGJvZHkgYXJndW1lbnQgaXMgdG8gdXNlIGEga25vd24gbm8tYm9keSBtZXRob2QgbGlrZSBHRVQuCiAgICAgICAgICAgIGlmIChtaWdodEhhdmVCb2R5KHRoaXMubWV0aG9kKSB8fCAhIWZvdXJ0aCkgewogICAgICAgICAgICAgICAgLy8gQm9keSBpcyB0aGUgdGhpcmQgYXJndW1lbnQsIG9wdGlvbnMgYXJlIHRoZSBmb3VydGguCiAgICAgICAgICAgICAgICB0aGlzLmJvZHkgPSAodGhpcmQgIT09IHVuZGVmaW5lZCkgPyAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcmQpKSA6IG51bGw7CiAgICAgICAgICAgICAgICBvcHRpb25zID0gZm91cnRoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gYm9keSByZXF1aXJlZCwgb3B0aW9ucyBhcmUgdGhlIHRoaXJkIGFyZ3VtZW50LiBUaGUgYm9keSBzdGF5cyBudWxsLgogICAgICAgICAgICAgICAgb3B0aW9ucyA9ICgvKiogQHR5cGUgez99ICovICh0aGlyZCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIG9wdGlvbnMgaGF2ZSBiZWVuIHBhc3NlZCwgaW50ZXJwcmV0IHRoZW0uCiAgICAgICAgICAgIGlmIChvcHRpb25zKSB7CiAgICAgICAgICAgICAgICAvLyBOb3JtYWxpemUgcmVwb3J0UHJvZ3Jlc3MgYW5kIHdpdGhDcmVkZW50aWFscy4KICAgICAgICAgICAgICAgIHRoaXMucmVwb3J0UHJvZ3Jlc3MgPSAhIW9wdGlvbnMucmVwb3J0UHJvZ3Jlc3M7CiAgICAgICAgICAgICAgICB0aGlzLndpdGhDcmVkZW50aWFscyA9ICEhb3B0aW9ucy53aXRoQ3JlZGVudGlhbHM7CiAgICAgICAgICAgICAgICAvLyBPdmVycmlkZSBkZWZhdWx0IHJlc3BvbnNlIHR5cGUgb2YgJ2pzb24nIGlmIG9uZSBpcyBwcm92aWRlZC4KICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMucmVzcG9uc2VUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zZVR5cGUgPSBvcHRpb25zLnJlc3BvbnNlVHlwZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIE92ZXJyaWRlIGhlYWRlcnMgaWYgdGhleSdyZSBwcm92aWRlZC4KICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMuaGVhZGVycykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG9wdGlvbnMuaGVhZGVyczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICghIW9wdGlvbnMucGFyYW1zKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYXJhbXMgPSBvcHRpb25zLnBhcmFtczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiBubyBoZWFkZXJzIGhhdmUgYmVlbiBwYXNzZWQgaW4sIGNvbnN0cnVjdCBhIG5ldyBIdHRwSGVhZGVycyBpbnN0YW5jZS4KICAgICAgICAgICAgaWYgKCF0aGlzLmhlYWRlcnMpIHsKICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIG5vIHBhcmFtZXRlcnMgaGF2ZSBiZWVuIHBhc3NlZCBpbiwgY29uc3RydWN0IGEgbmV3IEh0dHBVcmxFbmNvZGVkUGFyYW1zIGluc3RhbmNlLgogICAgICAgICAgICBpZiAoIXRoaXMucGFyYW1zKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBhcmFtcyA9IG5ldyBIdHRwUGFyYW1zKCk7CiAgICAgICAgICAgICAgICB0aGlzLnVybFdpdGhQYXJhbXMgPSB1cmw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvLyBFbmNvZGUgdGhlIHBhcmFtZXRlcnMgdG8gYSBzdHJpbmcgaW4gcHJlcGFyYXRpb24gZm9yIGluY2x1c2lvbiBpbiB0aGUgVVJMLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gdGhpcy5wYXJhbXMudG9TdHJpbmcoKTsKICAgICAgICAgICAgICAgIGlmIChwYXJhbXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm8gcGFyYW1ldGVycywgdGhlIHZpc2libGUgVVJMIGlzIGp1c3QgdGhlIFVSTCBnaXZlbiBhdCBjcmVhdGlvbiB0aW1lLgogICAgICAgICAgICAgICAgICAgIHRoaXMudXJsV2l0aFBhcmFtcyA9IHVybDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIERvZXMgdGhlIFVSTCBhbHJlYWR5IGhhdmUgcXVlcnkgcGFyYW1ldGVycz8gTG9vayBmb3IgJz8nLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBxSWR4ID0gdXJsLmluZGV4T2YoJz8nKTsKICAgICAgICAgICAgICAgICAgICAvLyBUaGVyZSBhcmUgMyBjYXNlcyB0byBoYW5kbGU6CiAgICAgICAgICAgICAgICAgICAgLy8gMSkgTm8gZXhpc3RpbmcgcGFyYW1ldGVycyAtPiBhcHBlbmQgJz8nIGZvbGxvd2VkIGJ5IHBhcmFtcy4KICAgICAgICAgICAgICAgICAgICAvLyAyKSAnPycgZXhpc3RzIGFuZCBpcyBmb2xsb3dlZCBieSBleGlzdGluZyBxdWVyeSBzdHJpbmcgLT4KICAgICAgICAgICAgICAgICAgICAvLyAgICBhcHBlbmQgJyYnIGZvbGxvd2VkIGJ5IHBhcmFtcy4KICAgICAgICAgICAgICAgICAgICAvLyAzKSAnPycgZXhpc3RzIGF0IHRoZSBlbmQgb2YgdGhlIHVybCAtPiBhcHBlbmQgcGFyYW1zIGRpcmVjdGx5LgogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgYmFzaWNhbGx5IGFtb3VudHMgdG8gZGV0ZXJtaW5pbmcgdGhlIGNoYXJhY3RlciwgaWYgYW55LCB3aXRoCiAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggdG8gam9pbiB0aGUgVVJMIGFuZCBwYXJhbWV0ZXJzLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzZXAgPSBxSWR4ID09PSAtMSA/ICc/JyA6IChxSWR4IDwgdXJsLmxlbmd0aCAtIDEgPyAnJicgOiAnJyk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy51cmxXaXRoUGFyYW1zID0gdXJsICsgc2VwICsgcGFyYW1zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRyYW5zZm9ybSB0aGUgZnJlZS1mb3JtIGJvZHkgaW50byBhIHNlcmlhbGl6ZWQgZm9ybWF0IHN1aXRhYmxlIGZvcgogICAgICAgICAqIHRyYW5zbWlzc2lvbiB0byB0aGUgc2VydmVyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2VyaWFsaXplQm9keSgpIHsKICAgICAgICAgICAgLy8gSWYgbm8gYm9keSBpcyBwcmVzZW50LCBubyBuZWVkIHRvIHNlcmlhbGl6ZSBpdC4KICAgICAgICAgICAgaWYgKHRoaXMuYm9keSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgYm9keSBpcyBhbHJlYWR5IGluIGEgc2VyaWFsaXplZCBmb3JtLiBJZiBzbywKICAgICAgICAgICAgLy8gaXQgY2FuIGp1c3QgYmUgcmV0dXJuZWQgZGlyZWN0bHkuCiAgICAgICAgICAgIGlmIChpc0FycmF5QnVmZmVyKHRoaXMuYm9keSkgfHwgaXNCbG9iKHRoaXMuYm9keSkgfHwgaXNGb3JtRGF0YSh0aGlzLmJvZHkpIHx8CiAgICAgICAgICAgICAgICB0eXBlb2YgdGhpcy5ib2R5ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9keTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBib2R5IGlzIGFuIGluc3RhbmNlIG9mIEh0dHBVcmxFbmNvZGVkUGFyYW1zLgogICAgICAgICAgICBpZiAodGhpcy5ib2R5IGluc3RhbmNlb2YgSHR0cFBhcmFtcykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuYm9keS50b1N0cmluZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGJvZHkgaXMgYW4gb2JqZWN0IG9yIGFycmF5LCBhbmQgc2VyaWFsaXplIHdpdGggSlNPTiBpZiBzby4KICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0aGlzLmJvZHkgPT09ICdib29sZWFuJyB8fAogICAgICAgICAgICAgICAgQXJyYXkuaXNBcnJheSh0aGlzLmJvZHkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkodGhpcy5ib2R5KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGYWxsIGJhY2sgb24gdG9TdHJpbmcoKSBmb3IgZXZlcnl0aGluZyBlbHNlLgogICAgICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICh0aGlzLmJvZHkpKSkudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRXhhbWluZSB0aGUgYm9keSBhbmQgYXR0ZW1wdCB0byBpbmZlciBhbiBhcHByb3ByaWF0ZSBNSU1FIHR5cGUKICAgICAgICAgKiBmb3IgaXQuCiAgICAgICAgICoKICAgICAgICAgKiBJZiBubyBzdWNoIHR5cGUgY2FuIGJlIGluZmVycmVkLCB0aGlzIG1ldGhvZCB3aWxsIHJldHVybiBgbnVsbGAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXRlY3RDb250ZW50VHlwZUhlYWRlcigpIHsKICAgICAgICAgICAgLy8gQW4gZW1wdHkgYm9keSBoYXMgbm8gY29udGVudCB0eXBlLgogICAgICAgICAgICBpZiAodGhpcy5ib2R5ID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGb3JtRGF0YSBib2RpZXMgcmVseSBvbiB0aGUgYnJvd3NlcidzIGNvbnRlbnQgdHlwZSBhc3NpZ25tZW50LgogICAgICAgICAgICBpZiAoaXNGb3JtRGF0YSh0aGlzLmJvZHkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCbG9icyB1c3VhbGx5IGhhdmUgdGhlaXIgb3duIGNvbnRlbnQgdHlwZS4gSWYgaXQgZG9lc24ndCwgdGhlbgogICAgICAgICAgICAvLyBubyB0eXBlIGNhbiBiZSBpbmZlcnJlZC4KICAgICAgICAgICAgaWYgKGlzQmxvYih0aGlzLmJvZHkpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ib2R5LnR5cGUgfHwgbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBcnJheSBidWZmZXJzIGhhdmUgdW5rbm93biBjb250ZW50cyBhbmQgdGh1cyBubyB0eXBlIGNhbiBiZSBpbmZlcnJlZC4KICAgICAgICAgICAgaWYgKGlzQXJyYXlCdWZmZXIodGhpcy5ib2R5KSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGVjaG5pY2FsbHksIHN0cmluZ3MgY291bGQgYmUgYSBmb3JtIG9mIEpTT04gZGF0YSwgYnV0IGl0J3Mgc2FmZSBlbm91Z2gKICAgICAgICAgICAgLy8gdG8gYXNzdW1lIHRoZXkncmUgcGxhaW4gc3RyaW5ncy4KICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09ICdzdHJpbmcnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3RleHQvcGxhaW4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIGBIdHRwVXJsRW5jb2RlZFBhcmFtc2AgaGFzIGl0cyBvd24gY29udGVudC10eXBlLgogICAgICAgICAgICBpZiAodGhpcy5ib2R5IGluc3RhbmNlb2YgSHR0cFBhcmFtcykgewogICAgICAgICAgICAgICAgcmV0dXJuICdhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQ7Y2hhcnNldD1VVEYtOCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gQXJyYXlzLCBvYmplY3RzLCBhbmQgbnVtYmVycyB3aWxsIGJlIGVuY29kZWQgYXMgSlNPTi4KICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLmJvZHkgPT09ICdvYmplY3QnIHx8IHR5cGVvZiB0aGlzLmJvZHkgPT09ICdudW1iZXInIHx8CiAgICAgICAgICAgICAgICBBcnJheS5pc0FycmF5KHRoaXMuYm9keSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiAnYXBwbGljYXRpb24vanNvbic7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTm8gdHlwZSBjb3VsZCBiZSBpbmZlcnJlZC4KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IHVwZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xvbmUodXBkYXRlID0ge30pIHsKICAgICAgICAgICAgLy8gRm9yIG1ldGhvZCwgdXJsLCBhbmQgcmVzcG9uc2VUeXBlLCB0YWtlIHRoZSBjdXJyZW50IHZhbHVlIHVubGVzcwogICAgICAgICAgICAvLyBpdCBpcyBvdmVycmlkZGVuIGluIHRoZSB1cGRhdGUgaGFzaC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtZXRob2QgPSB1cGRhdGUubWV0aG9kIHx8IHRoaXMubWV0aG9kOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVybCA9IHVwZGF0ZS51cmwgfHwgdGhpcy51cmw7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VUeXBlID0gdXBkYXRlLnJlc3BvbnNlVHlwZSB8fCB0aGlzLnJlc3BvbnNlVHlwZTsKICAgICAgICAgICAgLy8gVGhlIGJvZHkgaXMgc29tZXdoYXQgc3BlY2lhbCAtIGEgYG51bGxgIHZhbHVlIGluIHVwZGF0ZS5ib2R5IG1lYW5zCiAgICAgICAgICAgIC8vIHdoYXRldmVyIGN1cnJlbnQgYm9keSBpcyBwcmVzZW50IGlzIGJlaW5nIG92ZXJyaWRkZW4gd2l0aCBhbiBlbXB0eQogICAgICAgICAgICAvLyBib2R5LCB3aGVyZWFzIGFuIGB1bmRlZmluZWRgIHZhbHVlIGluIHVwZGF0ZS5ib2R5IGltcGxpZXMgbm8KICAgICAgICAgICAgLy8gb3ZlcnJpZGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm9keSA9ICh1cGRhdGUuYm9keSAhPT0gdW5kZWZpbmVkKSA/IHVwZGF0ZS5ib2R5IDogdGhpcy5ib2R5OwogICAgICAgICAgICAvLyBDYXJlZnVsbHkgaGFuZGxlIHRoZSBib29sZWFuIG9wdGlvbnMgdG8gZGlmZmVyZW50aWF0ZSBiZXR3ZWVuCiAgICAgICAgICAgIC8vIGBmYWxzZWAgYW5kIGB1bmRlZmluZWRgIGluIHRoZSB1cGRhdGUgYXJncy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB3aXRoQ3JlZGVudGlhbHMgPSAodXBkYXRlLndpdGhDcmVkZW50aWFscyAhPT0gdW5kZWZpbmVkKSA/IHVwZGF0ZS53aXRoQ3JlZGVudGlhbHMgOiB0aGlzLndpdGhDcmVkZW50aWFsczsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXBvcnRQcm9ncmVzcyA9ICh1cGRhdGUucmVwb3J0UHJvZ3Jlc3MgIT09IHVuZGVmaW5lZCkgPyB1cGRhdGUucmVwb3J0UHJvZ3Jlc3MgOiB0aGlzLnJlcG9ydFByb2dyZXNzOwogICAgICAgICAgICAvLyBIZWFkZXJzIGFuZCBwYXJhbXMgbWF5IGJlIGFwcGVuZGVkIHRvIGlmIGBzZXRIZWFkZXJzYCBvcgogICAgICAgICAgICAvLyBgc2V0UGFyYW1zYCBhcmUgdXNlZC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgaGVhZGVycyA9IHVwZGF0ZS5oZWFkZXJzIHx8IHRoaXMuaGVhZGVyczsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcGFyYW1zID0gdXBkYXRlLnBhcmFtcyB8fCB0aGlzLnBhcmFtczsKICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgY2FsbGVyIGhhcyBhc2tlZCB0byBhZGQgaGVhZGVycy4KICAgICAgICAgICAgaWYgKHVwZGF0ZS5zZXRIZWFkZXJzICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIC8vIFNldCBldmVyeSByZXF1ZXN0ZWQgaGVhZGVyLgogICAgICAgICAgICAgICAgaGVhZGVycyA9CiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmtleXModXBkYXRlLnNldEhlYWRlcnMpCiAgICAgICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaGVhZGVycwogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKGhlYWRlcnMsIG5hbWUpID0+IGhlYWRlcnMuc2V0KG5hbWUsICgvKiogQHR5cGUgez99ICovICh1cGRhdGUuc2V0SGVhZGVycykpW25hbWVdKSksIGhlYWRlcnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGNhbGxlciBoYXMgYXNrZWQgdG8gc2V0IHBhcmFtcy4KICAgICAgICAgICAgaWYgKHVwZGF0ZS5zZXRQYXJhbXMpIHsKICAgICAgICAgICAgICAgIC8vIFNldCBldmVyeSByZXF1ZXN0ZWQgcGFyYW0uCiAgICAgICAgICAgICAgICBwYXJhbXMgPSBPYmplY3Qua2V5cyh1cGRhdGUuc2V0UGFyYW1zKQogICAgICAgICAgICAgICAgICAgIC5yZWR1Y2UoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW0KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChwYXJhbXMsIHBhcmFtKSA9PiBwYXJhbXMuc2V0KHBhcmFtLCAoLyoqIEB0eXBlIHs/fSAqLyAodXBkYXRlLnNldFBhcmFtcykpW3BhcmFtXSkpLCBwYXJhbXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEZpbmFsbHksIGNvbnN0cnVjdCB0aGUgbmV3IEh0dHBSZXF1ZXN0IHVzaW5nIHRoZSBwaWVjZXMgZnJvbSBhYm92ZS4KICAgICAgICAgICAgcmV0dXJuIG5ldyBIdHRwUmVxdWVzdChtZXRob2QsIHVybCwgYm9keSwgewogICAgICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICAgICAgaGVhZGVycywKICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzLAogICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlLAogICAgICAgICAgICAgICAgd2l0aENyZWRlbnRpYWxzLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vaHR0cC9zcmMvcmVzcG9uc2UudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBIdHRwRXZlbnRUeXBlID0gewogICAgICAgIC8qKgogICAgICAgICAqIFRoZSByZXF1ZXN0IHdhcyBzZW50IG91dCBvdmVyIHRoZSB3aXJlLgogICAgICAgICAqLwogICAgICAgIFNlbnQ6IDAsCiAgICAgICAgLyoqCiAgICAgICAgICogQW4gdXBsb2FkIHByb2dyZXNzIGV2ZW50IHdhcyByZWNlaXZlZC4KICAgICAgICAgKi8KICAgICAgICBVcGxvYWRQcm9ncmVzczogMSwKICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcmVzcG9uc2Ugc3RhdHVzIGNvZGUgYW5kIGhlYWRlcnMgd2VyZSByZWNlaXZlZC4KICAgICAgICAgKi8KICAgICAgICBSZXNwb25zZUhlYWRlcjogMiwKICAgICAgICAvKioKICAgICAgICAgKiBBIGRvd25sb2FkIHByb2dyZXNzIGV2ZW50IHdhcyByZWNlaXZlZC4KICAgICAgICAgKi8KICAgICAgICBEb3dubG9hZFByb2dyZXNzOiAzLAogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBmdWxsIHJlc3BvbnNlIGluY2x1ZGluZyB0aGUgYm9keSB3YXMgcmVjZWl2ZWQuCiAgICAgICAgICovCiAgICAgICAgUmVzcG9uc2U6IDQsCiAgICAgICAgLyoqCiAgICAgICAgICogQSBjdXN0b20gZXZlbnQgZnJvbSBhbiBpbnRlcmNlcHRvciBvciBhIGJhY2tlbmQuCiAgICAgICAgICovCiAgICAgICAgVXNlcjogNSwKICAgIH07CiAgICBIdHRwRXZlbnRUeXBlW0h0dHBFdmVudFR5cGUuU2VudF0gPSAnU2VudCc7CiAgICBIdHRwRXZlbnRUeXBlW0h0dHBFdmVudFR5cGUuVXBsb2FkUHJvZ3Jlc3NdID0gJ1VwbG9hZFByb2dyZXNzJzsKICAgIEh0dHBFdmVudFR5cGVbSHR0cEV2ZW50VHlwZS5SZXNwb25zZUhlYWRlcl0gPSAnUmVzcG9uc2VIZWFkZXInOwogICAgSHR0cEV2ZW50VHlwZVtIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3NdID0gJ0Rvd25sb2FkUHJvZ3Jlc3MnOwogICAgSHR0cEV2ZW50VHlwZVtIdHRwRXZlbnRUeXBlLlJlc3BvbnNlXSA9ICdSZXNwb25zZSc7CiAgICBIdHRwRXZlbnRUeXBlW0h0dHBFdmVudFR5cGUuVXNlcl0gPSAnVXNlcic7CiAgICAvKioKICAgICAqIEJhc2UgY2xhc3MgZm9yIGJvdGggYEh0dHBSZXNwb25zZWAgYW5kIGBIdHRwSGVhZGVyUmVzcG9uc2VgLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgSHR0cFJlc3BvbnNlQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogU3VwZXItY29uc3RydWN0b3IgZm9yIGFsbCByZXNwb25zZXMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgc2luZ2xlIHBhcmFtZXRlciBhY2NlcHRlZCBpcyBhbiBpbml0aWFsaXphdGlvbiBoYXNoLiBBbnkgcHJvcGVydGllcwogICAgICAgICAqIG9mIHRoZSByZXNwb25zZSBwYXNzZWQgdGhlcmUgd2lsbCBvdmVycmlkZSB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSBpbml0CiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdFN0YXR1cwogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRTdGF0dXNUZXh0CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaW5pdCwgZGVmYXVsdFN0YXR1cyA9IDIwMCwgZGVmYXVsdFN0YXR1c1RleHQgPSAnT0snKSB7CiAgICAgICAgICAgIC8vIElmIHRoZSBoYXNoIGhhcyB2YWx1ZXMgcGFzc2VkLCB1c2UgdGhlbSB0byBpbml0aWFsaXplIHRoZSByZXNwb25zZS4KICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHVzZSB0aGUgZGVmYXVsdCB2YWx1ZXMuCiAgICAgICAgICAgIHRoaXMuaGVhZGVycyA9IGluaXQuaGVhZGVycyB8fCBuZXcgSHR0cEhlYWRlcnMoKTsKICAgICAgICAgICAgdGhpcy5zdGF0dXMgPSBpbml0LnN0YXR1cyAhPT0gdW5kZWZpbmVkID8gaW5pdC5zdGF0dXMgOiBkZWZhdWx0U3RhdHVzOwogICAgICAgICAgICB0aGlzLnN0YXR1c1RleHQgPSBpbml0LnN0YXR1c1RleHQgfHwgZGVmYXVsdFN0YXR1c1RleHQ7CiAgICAgICAgICAgIHRoaXMudXJsID0gaW5pdC51cmwgfHwgbnVsbDsKICAgICAgICAgICAgLy8gQ2FjaGUgdGhlIG9rIHZhbHVlIHRvIGF2b2lkIGRlZmluaW5nIGEgZ2V0dGVyLgogICAgICAgICAgICB0aGlzLm9rID0gdGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgMzAwOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBwYXJ0aWFsIEhUVFAgcmVzcG9uc2Ugd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgc3RhdHVzIGFuZCBoZWFkZXIgZGF0YSwKICAgICAqIGJ1dCBubyByZXNwb25zZSBib2R5LgogICAgICoKICAgICAqIGBIdHRwSGVhZGVyUmVzcG9uc2VgIGlzIGEgYEh0dHBFdmVudGAgYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZQogICAgICogZXZlbnQgc3RyZWFtLCBvbmx5IHdoZW4gcHJvZ3Jlc3MgZXZlbnRzIGFyZSByZXF1ZXN0ZWQuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSHR0cEhlYWRlclJlc3BvbnNlIGV4dGVuZHMgSHR0cFJlc3BvbnNlQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlIGEgbmV3IGBIdHRwSGVhZGVyUmVzcG9uc2VgIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlcnMuCiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5pdAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGluaXQgPSB7fSkgewogICAgICAgICAgICBzdXBlcihpbml0KTsKICAgICAgICAgICAgdGhpcy50eXBlID0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZUhlYWRlcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29weSB0aGlzIGBIdHRwSGVhZGVyUmVzcG9uc2VgLCBvdmVycmlkaW5nIGl0cyBjb250ZW50cyB3aXRoIHRoZQogICAgICAgICAqIGdpdmVuIHBhcmFtZXRlciBoYXNoLgogICAgICAgICAqIEBwYXJhbSB7Pz19IHVwZGF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2xvbmUodXBkYXRlID0ge30pIHsKICAgICAgICAgICAgLy8gUGVyZm9ybSBhIHN0cmFpZ2h0Zm9yd2FyZCBpbml0aWFsaXphdGlvbiBvZiB0aGUgbmV3IEh0dHBIZWFkZXJSZXNwb25zZSwKICAgICAgICAgICAgLy8gb3ZlcnJpZGluZyB0aGUgY3VycmVudCBwYXJhbWV0ZXJzIHdpdGggbmV3IG9uZXMgaWYgZ2l2ZW4uCiAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cEhlYWRlclJlc3BvbnNlKHsKICAgICAgICAgICAgICAgIGhlYWRlcnM6IHVwZGF0ZS5oZWFkZXJzIHx8IHRoaXMuaGVhZGVycywKICAgICAgICAgICAgICAgIHN0YXR1czogdXBkYXRlLnN0YXR1cyAhPT0gdW5kZWZpbmVkID8gdXBkYXRlLnN0YXR1cyA6IHRoaXMuc3RhdHVzLAogICAgICAgICAgICAgICAgc3RhdHVzVGV4dDogdXBkYXRlLnN0YXR1c1RleHQgfHwgdGhpcy5zdGF0dXNUZXh0LAogICAgICAgICAgICAgICAgdXJsOiB1cGRhdGUudXJsIHx8IHRoaXMudXJsIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBIGZ1bGwgSFRUUCByZXNwb25zZSwgaW5jbHVkaW5nIGEgdHlwZWQgcmVzcG9uc2UgYm9keSAod2hpY2ggbWF5IGJlIGBudWxsYAogICAgICogaWYgb25lIHdhcyBub3QgcmV0dXJuZWQpLgogICAgICoKICAgICAqIGBIdHRwUmVzcG9uc2VgIGlzIGEgYEh0dHBFdmVudGAgYXZhaWxhYmxlIG9uIHRoZSByZXNwb25zZSBldmVudAogICAgICogc3RyZWFtLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAdGVtcGxhdGUgVAogICAgICovCiAgICBjbGFzcyBIdHRwUmVzcG9uc2UgZXh0ZW5kcyBIdHRwUmVzcG9uc2VCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3QgYSBuZXcgYEh0dHBSZXNwb25zZWAuCiAgICAgICAgICogQHBhcmFtIHs/PX0gaW5pdAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGluaXQgPSB7fSkgewogICAgICAgICAgICBzdXBlcihpbml0KTsKICAgICAgICAgICAgdGhpcy50eXBlID0gSHR0cEV2ZW50VHlwZS5SZXNwb25zZTsKICAgICAgICAgICAgdGhpcy5ib2R5ID0gaW5pdC5ib2R5ICE9PSB1bmRlZmluZWQgPyBpbml0LmJvZHkgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez89fSB1cGRhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsb25lKHVwZGF0ZSA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiBuZXcgSHR0cFJlc3BvbnNlKHsKICAgICAgICAgICAgICAgIGJvZHk6ICh1cGRhdGUuYm9keSAhPT0gdW5kZWZpbmVkKSA/IHVwZGF0ZS5ib2R5IDogdGhpcy5ib2R5LAogICAgICAgICAgICAgICAgaGVhZGVyczogdXBkYXRlLmhlYWRlcnMgfHwgdGhpcy5oZWFkZXJzLAogICAgICAgICAgICAgICAgc3RhdHVzOiAodXBkYXRlLnN0YXR1cyAhPT0gdW5kZWZpbmVkKSA/IHVwZGF0ZS5zdGF0dXMgOiB0aGlzLnN0YXR1cywKICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHVwZGF0ZS5zdGF0dXNUZXh0IHx8IHRoaXMuc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgIHVybDogdXBkYXRlLnVybCB8fCB0aGlzLnVybCB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSByZXNwb25zZSB0aGF0IHJlcHJlc2VudHMgYW4gZXJyb3Igb3IgZmFpbHVyZSwgZWl0aGVyIGZyb20gYQogICAgICogbm9uLXN1Y2Nlc3NmdWwgSFRUUCBzdGF0dXMsIGFuIGVycm9yIHdoaWxlIGV4ZWN1dGluZyB0aGUgcmVxdWVzdCwKICAgICAqIG9yIHNvbWUgb3RoZXIgZmFpbHVyZSB3aGljaCBvY2N1cnJlZCBkdXJpbmcgdGhlIHBhcnNpbmcgb2YgdGhlIHJlc3BvbnNlLgogICAgICoKICAgICAqIEFueSBlcnJvciByZXR1cm5lZCBvbiB0aGUgYE9ic2VydmFibGVgIHJlc3BvbnNlIHN0cmVhbSB3aWxsIGJlCiAgICAgKiB3cmFwcGVkIGluIGFuIGBIdHRwRXJyb3JSZXNwb25zZWAgdG8gcHJvdmlkZSBhZGRpdGlvbmFsIGNvbnRleHQgYWJvdXQKICAgICAqIHRoZSBzdGF0ZSBvZiB0aGUgSFRUUCBsYXllciB3aGVuIHRoZSBlcnJvciBvY2N1cnJlZC4gVGhlIGVycm9yIHByb3BlcnR5CiAgICAgKiB3aWxsIGNvbnRhaW4gZWl0aGVyIGEgd3JhcHBlZCBFcnJvciBvYmplY3Qgb3IgdGhlIGVycm9yIHJlc3BvbnNlIHJldHVybmVkCiAgICAgKiBmcm9tIHRoZSBzZXJ2ZXIuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSHR0cEVycm9yUmVzcG9uc2UgZXh0ZW5kcyBIdHRwUmVzcG9uc2VCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGluaXQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihpbml0KSB7CiAgICAgICAgICAgIC8vIEluaXRpYWxpemUgd2l0aCBhIGRlZmF1bHQgc3RhdHVzIG9mIDAgLyBVbmtub3duIEVycm9yLgogICAgICAgICAgICBzdXBlcihpbml0LCAwLCAnVW5rbm93biBFcnJvcicpOwogICAgICAgICAgICB0aGlzLm5hbWUgPSAnSHR0cEVycm9yUmVzcG9uc2UnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXJyb3JzIGFyZSBuZXZlciBva2F5LCBldmVuIHdoZW4gdGhlIHN0YXR1cyBjb2RlIGlzIGluIHRoZSAyeHggc3VjY2VzcyByYW5nZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub2sgPSBmYWxzZTsKICAgICAgICAgICAgLy8gSWYgdGhlIHJlc3BvbnNlIHdhcyBzdWNjZXNzZnVsLCB0aGVuIHRoaXMgd2FzIGEgcGFyc2UgZXJyb3IuIE90aGVyd2lzZSwgaXQgd2FzCiAgICAgICAgICAgIC8vIGEgcHJvdG9jb2wtbGV2ZWwgZmFpbHVyZSBvZiBzb21lIHNvcnQuIEVpdGhlciB0aGUgcmVxdWVzdCBmYWlsZWQgaW4gdHJhbnNpdAogICAgICAgICAgICAvLyBvciB0aGUgc2VydmVyIHJldHVybmVkIGFuIHVuc3VjY2Vzc2Z1bCBzdGF0dXMgY29kZS4KICAgICAgICAgICAgaWYgKHRoaXMuc3RhdHVzID49IDIwMCAmJiB0aGlzLnN0YXR1cyA8IDMwMCkgewogICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlID0gYEh0dHAgZmFpbHVyZSBkdXJpbmcgcGFyc2luZyBmb3IgJHtpbml0LnVybCB8fCAnKHVua25vd24gdXJsKSd9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMubWVzc2FnZSA9IGBIdHRwIGZhaWx1cmUgcmVzcG9uc2UgZm9yICR7aW5pdC51cmwgfHwgJyh1bmtub3duIHVybCknfTogJHtpbml0LnN0YXR1c30gJHtpbml0LnN0YXR1c1RleHR9YDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmVycm9yID0gaW5pdC5lcnJvciB8fCBudWxsOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9odHRwL3NyYy9jbGllbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mIGBIdHRwUmVxdWVzdE9wdGlvbnM8VD5gIGZyb20gYSBzb3VyY2UgYEh0dHBNZXRob2RPcHRpb25zYCBhbmQKICAgICAqIHRoZSBnaXZlbiBgYm9keWAuIFRoaXMgZnVuY3Rpb24gY2xvbmVzIHRoZSBvYmplY3QgYW5kIGFkZHMgdGhlIGJvZHkuCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoZSBgcmVzcG9uc2VUeXBlYCAqb3B0aW9ucyogdmFsdWUgaXMgYSBTdHJpbmcgdGhhdCBpZGVudGlmaWVzIHRoZQogICAgICogc2luZ2xlIGRhdGEgdHlwZSBvZiB0aGUgcmVzcG9uc2UuCiAgICAgKiBBIHNpbmdsZSBvdmVybG9hZCB2ZXJzaW9uIG9mIHRoZSBtZXRob2QgaGFuZGxlcyBlYWNoIHJlc3BvbnNlIHR5cGUuCiAgICAgKiBUaGUgdmFsdWUgb2YgYHJlc3BvbnNlVHlwZWAgY2Fubm90IGJlIGEgdW5pb24sIGFzIHRoZSBjb21iaW5lZCBzaWduYXR1cmUgY291bGQgaW1wbHkuCiAgICAgKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gb3B0aW9ucwogICAgICogQHBhcmFtIHs/fSBib2R5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhZGRCb2R5KG9wdGlvbnMsIGJvZHkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBib2R5LAogICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsCiAgICAgICAgICAgIG9ic2VydmU6IG9wdGlvbnMub2JzZXJ2ZSwKICAgICAgICAgICAgcGFyYW1zOiBvcHRpb25zLnBhcmFtcywKICAgICAgICAgICAgcmVwb3J0UHJvZ3Jlc3M6IG9wdGlvbnMucmVwb3J0UHJvZ3Jlc3MsCiAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUsCiAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogUGVyZm9ybXMgSFRUUCByZXF1ZXN0cy4KICAgICAqIFRoaXMgc2VydmljZSBpcyBhdmFpbGFibGUgYXMgYW4gaW5qZWN0YWJsZSBjbGFzcywgd2l0aCBtZXRob2RzIHRvIHBlcmZvcm0gSFRUUCByZXF1ZXN0cy4KICAgICAqIEVhY2ggcmVxdWVzdCBtZXRob2QgaGFzIG11bHRpcGxlIHNpZ25hdHVyZXMsIGFuZCB0aGUgcmV0dXJuIHR5cGUgdmFyaWVzIGJhc2VkIG9uCiAgICAgKiB0aGUgc2lnbmF0dXJlIHRoYXQgaXMgY2FsbGVkIChtYWlubHkgdGhlIHZhbHVlcyBvZiBgb2JzZXJ2ZWAgYW5kIGByZXNwb25zZVR5cGVgKS4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgdGhlIGByZXNwb25zZVR5cGVgICpvcHRpb25zKiB2YWx1ZSBpcyBhIFN0cmluZyB0aGF0IGlkZW50aWZpZXMgdGhlCiAgICAgKiBzaW5nbGUgZGF0YSB0eXBlIG9mIHRoZSByZXNwb25zZS4KICAgICAqIEEgc2luZ2xlIG92ZXJsb2FkIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBoYW5kbGVzIGVhY2ggcmVzcG9uc2UgdHlwZS4KICAgICAqIFRoZSB2YWx1ZSBvZiBgcmVzcG9uc2VUeXBlYCBjYW5ub3QgYmUgYSB1bmlvbiwgYXMgdGhlIGNvbWJpbmVkIHNpZ25hdHVyZSBjb3VsZCBpbXBseS4KICAgICAqCiAgICAgKiBcQHVzYWdlTm90ZXMKICAgICAqIFNhbXBsZSBIVFRQIHJlcXVlc3RzIGZvciB0aGUgW1RvdXIgb2YgSGVyb2VzXSgvdHV0b3JpYWwvdG9oLXB0MCkgYXBwbGljYXRpb24uCiAgICAgKgogICAgICogIyMjIEhUVFAgUmVxdWVzdCBFeGFtcGxlCiAgICAgKgogICAgICogYGBgCiAgICAgKiAgLy8gR0VUIGhlcm9lcyB3aG9zZSBuYW1lIGNvbnRhaW5zIHNlYXJjaCB0ZXJtCiAgICAgKiBzZWFyY2hIZXJvZXModGVybTogc3RyaW5nKTogb2JzZXJ2YWJsZTxIZXJvW10+ewogICAgICoKICAgICAqICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcyh7ZnJvbVN0cmluZzogJ25hbWU9dGVybSd9KTsKICAgICAqICAgIHJldHVybiB0aGlzLmh0dHBDbGllbnQucmVxdWVzdCgnR0VUJywgdGhpcy5oZXJvZXNVcmwsIHtyZXNwb25zZVR5cGU6J2pzb24nLCBwYXJhbXN9KTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICogIyMjIEpTT05QIEV4YW1wbGUKICAgICAqIGBgYAogICAgICogcmVxdWVzdEpzb25wKHVybCwgY2FsbGJhY2sgPSAnY2FsbGJhY2snKSB7CiAgICAgKiAgcmV0dXJuIHRoaXMuaHR0cENsaWVudC5qc29ucCh0aGlzLmhlcm9lc1VSTCwgY2FsbGJhY2spOwogICAgICogfQogICAgICogYGBgCiAgICAgKgogICAgICogIyMjIFBBVENIIEV4YW1wbGUKICAgICAqIGBgYAogICAgICogLy8gUEFUQ0ggb25lIG9mIHRoZSBoZXJvZXMnIG5hbWUKICAgICAqIHBhdGNoSGVybyAoaWQ6IG51bWJlciwgaGVyb05hbWU6IHN0cmluZyk6IE9ic2VydmFibGU8e30+IHsKICAgICAqIGNvbnN0IHVybCA9IGAke3RoaXMuaGVyb2VzVXJsfS8ke2lkfWA7ICAgLy8gUEFUQ0ggYXBpL2hlcm9lcy80MgogICAgICogIHJldHVybiB0aGlzLmh0dHBDbGllbnQucGF0Y2godXJsLCB7bmFtZTogaGVyb05hbWV9LCBodHRwT3B0aW9ucykKICAgICAqICAgIC5waXBlKGNhdGNoRXJyb3IodGhpcy5oYW5kbGVFcnJvcigncGF0Y2hIZXJvJykpKTsKICAgICAqIH0KICAgICAqIGBgYAogICAgICoKICAgICAqIEBzZWUgW0hUVFAgR3VpZGVdKGd1aWRlL2h0dHApCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSHR0cENsaWVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBoYW5kbGVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaGFuZGxlcikgewogICAgICAgICAgICB0aGlzLmhhbmRsZXIgPSBoYW5kbGVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgZm9yIGEgZ2VuZXJpYyBIVFRQIHJlcXVlc3QgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLAogICAgICAgICAqIGZpcmVzIHRoZSByZXF1ZXN0IHRocm91Z2ggdGhlIGNoYWluIG9mIHJlZ2lzdGVyZWQgaW50ZXJjZXB0b3JzIGFuZCBvbiB0byB0aGUKICAgICAgICAgKiBzZXJ2ZXIuCiAgICAgICAgICoKICAgICAgICAgKiBZb3UgY2FuIHBhc3MgYW4gYEh0dHBSZXF1ZXN0YCBkaXJlY3RseSBhcyB0aGUgb25seSBwYXJhbWV0ZXIuIEluIHRoaXMgY2FzZSwKICAgICAgICAgKiB0aGUgY2FsbCByZXR1cm5zIGFuIG9ic2VydmFibGUgb2YgdGhlIHJhdyBgSHR0cEV2ZW50YCBzdHJlYW0uCiAgICAgICAgICoKICAgICAgICAgKiBBbHRlcm5hdGl2ZWx5IHlvdSBjYW4gcGFzcyBhbiBIVFRQIG1ldGhvZCBhcyB0aGUgZmlyc3QgcGFyYW1ldGVyLAogICAgICAgICAqIGEgVVJMIHN0cmluZyBhcyB0aGUgc2Vjb25kLCBhbmQgYW4gb3B0aW9ucyBoYXNoIGNvbnRhaW5pbmcgdGhlIHJlcXVlc3QgYm9keSBhcyB0aGUgdGhpcmQuCiAgICAgICAgICogU2VlIGBhZGRCb2R5KClgLiBJbiB0aGlzIGNhc2UsIHRoZSBzcGVjaWZpZWQgYHJlc3BvbnNlVHlwZWAgYW5kIGBvYnNlcnZlYCBvcHRpb25zIGRldGVybWluZSB0aGUKICAgICAgICAgKiB0eXBlIG9mIHJldHVybmVkIG9ic2VydmFibGUuCiAgICAgICAgICogICAqIFRoZSBgcmVzcG9uc2VUeXBlYCB2YWx1ZSBkZXRlcm1pbmVzIGhvdyBhIHN1Y2Nlc3NmdWwgcmVzcG9uc2UgYm9keSBpcyBwYXJzZWQuCiAgICAgICAgICogICAqIElmIGByZXNwb25zZVR5cGVgIGlzIHRoZSBkZWZhdWx0IGBqc29uYCwgeW91IGNhbiBwYXNzIGEgdHlwZSBpbnRlcmZhY2UgZm9yIHRoZSByZXN1bHRpbmcKICAgICAgICAgKiBvYmplY3QgYXMgYSB0eXBlIHBhcmFtZXRlciB0byB0aGUgY2FsbC4KICAgICAgICAgKgogICAgICAgICAqIFRoZSBgb2JzZXJ2ZWAgdmFsdWUgZGV0ZXJtaW5lcyB0aGUgcmV0dXJuIHR5cGUsIGFjY29yZGluZyB0byB3aGF0IHlvdSBhcmUgaW50ZXJlc3RlZCBpbgogICAgICAgICAqIG9ic2VydmluZy4KICAgICAgICAgKiAgICogQW4gYG9ic2VydmVgIHZhbHVlIG9mIGV2ZW50cyByZXR1cm5zIGFuIG9ic2VydmFibGUgb2YgdGhlIHJhdyBgSHR0cEV2ZW50YCBzdHJlYW0sIGluY2x1ZGluZwogICAgICAgICAqIHByb2dyZXNzIGV2ZW50cyBieSBkZWZhdWx0LgogICAgICAgICAqICAgKiBBbiBgb2JzZXJ2ZWAgdmFsdWUgb2YgcmVzcG9uc2UgcmV0dXJucyBhbiBvYnNlcnZhYmxlIG9mIGBIdHRwUmVzcG9uc2U8VD5gLAogICAgICAgICAqIHdoZXJlIHRoZSBgVGAgcGFyYW1ldGVyIGRlcGVuZHMgb24gdGhlIGByZXNwb25zZVR5cGVgIGFuZCBhbnkgb3B0aW9uYWxseSBwcm92aWRlZCB0eXBlCiAgICAgICAgICogcGFyYW1ldGVyLgogICAgICAgICAqICAgKiBBbiBgb2JzZXJ2ZWAgdmFsdWUgb2YgYm9keSByZXR1cm5zIGFuIG9ic2VydmFibGUgb2YgYDxUPmAgd2l0aCB0aGUgc2FtZSBgVGAgYm9keSB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBmaXJzdAogICAgICAgICAqIEBwYXJhbSB7Pz19IHVybAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlcXVlc3QoZmlyc3QsIHVybCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlcTsKICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHdoZXRoZXIgdGhlIHByaW1hcnkgYXJndW1lbnQgaXMgYW4gaW5zdGFuY2Ugb2YgYEh0dHBSZXF1ZXN0YC4KICAgICAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgSHR0cFJlcXVlc3QpIHsKICAgICAgICAgICAgICAgIC8vIEl0IGlzLiBUaGUgb3RoZXIgYXJndW1lbnRzIG11c3QgYmUgdW5kZWZpbmVkIChwZXIgdGhlIHNpZ25hdHVyZXMpIGFuZCBjYW4gYmUKICAgICAgICAgICAgICAgIC8vIGlnbm9yZWQuCiAgICAgICAgICAgICAgICByZXEgPSBmaXJzdDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIEl0J3MgYSBzdHJpbmcsIHNvIGl0IHJlcHJlc2VudHMgYSBVUkwuIENvbnN0cnVjdCBhIHJlcXVlc3QgYmFzZWQgb24gaXQsCiAgICAgICAgICAgICAgICAvLyBhbmQgaW5jb3Jwb3JhdGUgdGhlIHJlbWFpbmluZyBhcmd1bWVudHMgKGFzc3VtaW5nIGBHRVRgIHVubGVzcyBhIG1ldGhvZCBpcwogICAgICAgICAgICAgICAgLy8gcHJvdmlkZWQuCiAgICAgICAgICAgICAgICAvLyBGaWd1cmUgb3V0IHRoZSBoZWFkZXJzLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGhlYWRlcnMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5oZWFkZXJzIGluc3RhbmNlb2YgSHR0cEhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICBoZWFkZXJzID0gb3B0aW9ucy5oZWFkZXJzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaGVhZGVycyA9IG5ldyBIdHRwSGVhZGVycyhvcHRpb25zLmhlYWRlcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU29ydCBvdXQgcGFyYW1ldGVycy4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBwYXJhbXMgPSB1bmRlZmluZWQ7CiAgICAgICAgICAgICAgICBpZiAoISFvcHRpb25zLnBhcmFtcykgewogICAgICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnBhcmFtcyBpbnN0YW5jZW9mIEh0dHBQYXJhbXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zID0gb3B0aW9ucy5wYXJhbXM7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygoLyoqIEB0eXBlIHs/fSAqLyAoeyBmcm9tT2JqZWN0OiBvcHRpb25zLnBhcmFtcyB9KSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIENvbnN0cnVjdCB0aGUgcmVxdWVzdC4KICAgICAgICAgICAgICAgIHJlcSA9IG5ldyBIdHRwUmVxdWVzdChmaXJzdCwgKC8qKiBAdHlwZSB7P30gKi8gKHVybCkpLCAob3B0aW9ucy5ib2R5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmJvZHkgOiBudWxsKSwgewogICAgICAgICAgICAgICAgICAgIGhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICAgICAgICAgIHJlcG9ydFByb2dyZXNzOiBvcHRpb25zLnJlcG9ydFByb2dyZXNzLAogICAgICAgICAgICAgICAgICAgIC8vIEJ5IGRlZmF1bHQsIEpTT04gaXMgYXNzdW1lZCB0byBiZSByZXR1cm5lZCBmb3IgYWxsIGNhbGxzLgogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlVHlwZTogb3B0aW9ucy5yZXNwb25zZVR5cGUgfHwgJ2pzb24nLAogICAgICAgICAgICAgICAgICAgIHdpdGhDcmVkZW50aWFsczogb3B0aW9ucy53aXRoQ3JlZGVudGlhbHMsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTdGFydCB3aXRoIGFuIE9ic2VydmFibGUub2YoKSB0aGUgaW5pdGlhbCByZXF1ZXN0LCBhbmQgcnVuIHRoZSBoYW5kbGVyICh3aGljaAogICAgICAgICAgICAvLyBpbmNsdWRlcyBhbGwgaW50ZXJjZXB0b3JzKSBpbnNpZGUgYSBjb25jYXRNYXAoKS4gVGhpcyB3YXksIHRoZSBoYW5kbGVyIHJ1bnMKICAgICAgICAgICAgLy8gaW5zaWRlIGFuIE9ic2VydmFibGUgY2hhaW4sIHdoaWNoIGNhdXNlcyBpbnRlcmNlcHRvcnMgdG8gYmUgcmUtcnVuIG9uIGV2ZXJ5CiAgICAgICAgICAgIC8vIHN1YnNjcmlwdGlvbiAodGhpcyBhbHNvIG1ha2VzIHJldHJpZXMgcmUtcnVuIHRoZSBoYW5kbGVyLCBpbmNsdWRpbmcgaW50ZXJjZXB0b3JzKS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBldmVudHMkID0gb2YocmVxKS5waXBlKGNvbmNhdE1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVxCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVxKSA9PiB0aGlzLmhhbmRsZXIuaGFuZGxlKHJlcSkpKSk7CiAgICAgICAgICAgIC8vIElmIGNvbWluZyB2aWEgdGhlIEFQSSBzaWduYXR1cmUgd2hpY2ggYWNjZXB0cyBhIHByZXZpb3VzbHkgY29uc3RydWN0ZWQgSHR0cFJlcXVlc3QsCiAgICAgICAgICAgIC8vIHRoZSBvbmx5IG9wdGlvbiBpcyB0byBnZXQgdGhlIGV2ZW50IHN0cmVhbS4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGV2ZW50IHN0cmVhbSBpZgogICAgICAgICAgICAvLyB0aGF0IGlzIHdoYXQgd2FzIHJlcXVlc3RlZC4KICAgICAgICAgICAgaWYgKGZpcnN0IGluc3RhbmNlb2YgSHR0cFJlcXVlc3QgfHwgb3B0aW9ucy5vYnNlcnZlID09PSAnZXZlbnRzJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGV2ZW50cyQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3RlZCBzdHJlYW0gY29udGFpbnMgZWl0aGVyIHRoZSBmdWxsIHJlc3BvbnNlIG9yIHRoZSBib2R5LiBJbiBlaXRoZXIKICAgICAgICAgICAgLy8gY2FzZSwgdGhlIGZpcnN0IHN0ZXAgaXMgdG8gZmlsdGVyIHRoZSBldmVudCBzdHJlYW0gdG8gZXh0cmFjdCBhIHN0cmVhbSBvZgogICAgICAgICAgICAvLyByZXNwb25zZXMocykuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzJCA9ICgvKiogQHR5cGUgez99ICovIChldmVudHMkLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiBldmVudCBpbnN0YW5jZW9mIEh0dHBSZXNwb25zZSkpKSkpOwogICAgICAgICAgICAvLyBEZWNpZGUgd2hpY2ggc3RyZWFtIHRvIHJldHVybi4KICAgICAgICAgICAgc3dpdGNoIChvcHRpb25zLm9ic2VydmUgfHwgJ2JvZHknKSB7CiAgICAgICAgICAgICAgICBjYXNlICdib2R5JzoKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVxdWVzdGVkIHN0cmVhbSBpcyB0aGUgYm9keS4gTWFwIHRoZSByZXNwb25zZSBzdHJlYW0gdG8gdGhlIHJlc3BvbnNlCiAgICAgICAgICAgICAgICAgICAgLy8gYm9keS4gVGhpcyBjb3VsZCBiZSBkb25lIG1vcmUgc2ltcGx5LCBidXQgYSBtaXNiZWhhdmluZyBpbnRlcmNlcHRvciBtaWdodAogICAgICAgICAgICAgICAgICAgIC8vIHRyYW5zZm9ybSB0aGUgcmVzcG9uc2UgYm9keSBpbnRvIGEgZGlmZmVyZW50IGZvcm1hdCBhbmQgaWdub3JlIHRoZSByZXF1ZXN0ZWQKICAgICAgICAgICAgICAgICAgICAvLyByZXNwb25zZVR5cGUuIEd1YXJkIGFnYWluc3QgdGhpcyBieSB2YWxpZGF0aW5nIHRoYXQgdGhlIHJlc3BvbnNlIGlzIG9mIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3RlZCB0eXBlLgogICAgICAgICAgICAgICAgICAgIHN3aXRjaCAocmVxLnJlc3BvbnNlVHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhcnJheWJ1ZmZlcic6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGJvZHkgaXMgYW4gQXJyYXlCdWZmZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5ib2R5ICE9PSBudWxsICYmICEocmVzLmJvZHkgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBpcyBub3QgYW4gQXJyYXlCdWZmZXIuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2Jsb2InOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZXMKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZXMpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBWYWxpZGF0ZSB0aGF0IHRoZSBib2R5IGlzIGEgQmxvYi4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzLmJvZHkgIT09IG51bGwgJiYgIShyZXMuYm9keSBpbnN0YW5jZW9mIEJsb2IpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUmVzcG9uc2UgaXMgbm90IGEgQmxvYi4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcy5ib2R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAndGV4dCc6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlcykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGJvZHkgaXMgYSBzdHJpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcy5ib2R5ICE9PSBudWxsICYmIHR5cGVvZiByZXMuYm9keSAhPT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdSZXNwb25zZSBpcyBub3QgYSBzdHJpbmcuJyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMuYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2pzb24nOgogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gdmFsaWRhdGlvbiBuZWVkZWQgZm9yIEpTT04gcmVzcG9uc2VzLCBhcyB0aGV5IGNhbiBiZSBvZiBhbnkgdHlwZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXMkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAocmVzKSA9PiByZXMuYm9keSkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICdyZXNwb25zZSc6CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlc3BvbnNlIHN0cmVhbSB3YXMgcmVxdWVzdGVkIGRpcmVjdGx5LCBzbyByZXR1cm4gaXQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlcyQ7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8vIEd1YXJkIGFnYWluc3QgbmV3IGZ1dHVyZSBvYnNlcnZlIHR5cGVzIGJlaW5nIGFkZGVkLgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5yZWFjaGFibGU6IHVuaGFuZGxlZCBvYnNlcnZlIHR5cGUgJHtvcHRpb25zLm9ic2VydmV9fWApOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW4gb2JzZXJ2YWJsZSB0aGF0LCB3aGVuIHN1YnNjcmliZWQsIGNhdXNlcyB0aGUgY29uZmlndXJlZAogICAgICAgICAqIGBERUxFVEVgIHJlcXVlc3QgdG8gZXhlY3V0ZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICAgICAqIGRldGFpbHMgb24gdGhlIHJldHVybiB0eXBlLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwgICAgIFRoZSBlbmRwb2ludCBVUkwuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBUaGUgSFRUUCBvcHRpb25zIHRvIHNlbmQgd2l0aCB0aGUgcmVxdWVzdC4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVsZXRlKHVybCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0RFTEVURScsIHVybCwgKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW4gb2JzZXJ2YWJsZSB0aGF0LCB3aGVuIHN1YnNjcmliZWQsIGNhdXNlcyB0aGUgY29uZmlndXJlZAogICAgICAgICAqIGBHRVRgIHJlcXVlc3QgdG8gZXhlY3V0ZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICAgICAqIGRldGFpbHMgb24gdGhlIHJldHVybiB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0KHVybCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0dFVCcsIHVybCwgKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW4gb2JzZXJ2YWJsZSB0aGF0LCB3aGVuIHN1YnNjcmliZWQsIGNhdXNlcyB0aGUgY29uZmlndXJlZAogICAgICAgICAqIGBIRUFEYCByZXF1ZXN0IHRvIGV4ZWN1dGUgb24gdGhlIHNlcnZlci4gVGhlIGBIRUFEYCBtZXRob2QgcmV0dXJucwogICAgICAgICAqIG1ldGEgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHJlc291cmNlIHdpdGhvdXQgdHJhbnNmZXJyaW5nIHRoZQogICAgICAgICAqIHJlc291cmNlIGl0c2VsZi4gU2VlIHRoZSBpbmRpdmlkdWFsIG92ZXJsb2FkcyBmb3IKICAgICAgICAgKiBkZXRhaWxzIG9uIHRoZSByZXR1cm4gdHlwZS4KICAgICAgICAgKiBAcGFyYW0gez99IHVybAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhlYWQodXJsLCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnSEVBRCcsIHVybCwgKC8qKiBAdHlwZSB7P30gKi8gKG9wdGlvbnMpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbnN0cnVjdHMgYW4gYE9ic2VydmFibGVgIHRoYXQsIHdoZW4gc3Vic2NyaWJlZCwgY2F1c2VzIGEgcmVxdWVzdCB3aXRoIHRoZSBzcGVjaWFsIG1ldGhvZAogICAgICAgICAqIGBKU09OUGAgdG8gYmUgZGlzcGF0Y2hlZCB2aWEgdGhlIGludGVyY2VwdG9yIHBpcGVsaW5lLgogICAgICAgICAqIFRoZSBbSlNPTlAgcGF0dGVybl0oaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSlNPTlApIHdvcmtzIGFyb3VuZCBsaW1pdGF0aW9ucyBvZiBjZXJ0YWluCiAgICAgICAgICogQVBJIGVuZHBvaW50cyB0aGF0IGRvbid0IHN1cHBvcnQgbmV3ZXIsCiAgICAgICAgICogYW5kIHByZWZlcmFibGUgW0NPUlNdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hUVFAvQ09SUykgcHJvdG9jb2wuCiAgICAgICAgICogSlNPTlAgdHJlYXRzIHRoZSBlbmRwb2ludCBBUEkgYXMgYSBKYXZhU2NyaXB0IGZpbGUgYW5kIHRyaWNrcyB0aGUgYnJvd3NlciB0byBwcm9jZXNzIHRoZQogICAgICAgICAqIHJlcXVlc3RzIGV2ZW4gaWYgdGhlIEFQSSBlbmRwb2ludCBpcyBub3QgbG9jYXRlZCBvbiB0aGUgc2FtZSBkb21haW4gKG9yaWdpbikgYXMgdGhlIGNsaWVudC1zaWRlCiAgICAgICAgICogYXBwbGljYXRpb24gbWFraW5nIHRoZSByZXF1ZXN0LgogICAgICAgICAqIFRoZSBlbmRwb2ludCBBUEkgbXVzdCBzdXBwb3J0IEpTT05QIGNhbGxiYWNrIGZvciBKU09OUCByZXF1ZXN0cyB0byB3b3JrLgogICAgICAgICAqIFRoZSByZXNvdXJjZSBBUEkgcmV0dXJucyB0aGUgSlNPTiByZXNwb25zZSB3cmFwcGVkIGluIGEgY2FsbGJhY2sgZnVuY3Rpb24uCiAgICAgICAgICogWW91IGNhbiBwYXNzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBuYW1lIGFzIG9uZSBvZiB0aGUgcXVlcnkgcGFyYW1ldGVycy4KICAgICAgICAgKiBOb3RlIHRoYXQgSlNPTlAgcmVxdWVzdHMgY2FuIG9ubHkgYmUgdXNlZCB3aXRoIGBHRVRgIHJlcXVlc3RzLgogICAgICAgICAqCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IHVybCBUaGUgcmVzb3VyY2UgVVJMLgogICAgICAgICAqIEBwYXJhbSB7P30gY2FsbGJhY2tQYXJhbSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gbmFtZS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAganNvbnAodXJsLCBjYWxsYmFja1BhcmFtKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ0pTT05QJywgdXJsLCB7CiAgICAgICAgICAgICAgICBwYXJhbXM6IG5ldyBIdHRwUGFyYW1zKCkuYXBwZW5kKGNhbGxiYWNrUGFyYW0sICdKU09OUF9DQUxMQkFDSycpLAogICAgICAgICAgICAgICAgb2JzZXJ2ZTogJ2JvZHknLAogICAgICAgICAgICAgICAgcmVzcG9uc2VUeXBlOiAnanNvbicsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIGBPYnNlcnZhYmxlYCB0aGF0LCB3aGVuIHN1YnNjcmliZWQsIGNhdXNlcyB0aGUgY29uZmlndXJlZAogICAgICAgICAqIGBPUFRJT05TYCByZXF1ZXN0IHRvIGV4ZWN1dGUgb24gdGhlIHNlcnZlci4gVGhpcyBtZXRob2QgYWxsb3dzIHRoZSBjbGllbnQKICAgICAgICAgKiB0byBkZXRlcm1pbmUgdGhlIHN1cHBvcnRlZCBIVFRQIG1ldGhvZHMgYW5kIG90aGVyIGNhcGFiaWxpdGVzIG9mIGFuIGVuZHBvaW50LAogICAgICAgICAqIHdpdGhvdXQgaW1wbHlpbmcgYSByZXNvdXJjZSBhY3Rpb24uIFNlZSB0aGUgaW5kaXZpZHVhbCBvdmVybG9hZHMgZm9yCiAgICAgICAgICogZGV0YWlscyBvbiB0aGUgcmV0dXJuIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvcHRpb25zKHVybCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ09QVElPTlMnLCB1cmwsICgvKiogQHR5cGUgez99ICovIChvcHRpb25zKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAgICAgKiBgUEFUQ0hgIHJlcXVlc3QgdG8gZXhlY3V0ZSBvbiB0aGUgc2VydmVyLiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvcgogICAgICAgICAqIGRldGFpbHMgb24gdGhlIHJldHVybiB0eXBlLgogICAgICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgICAgICogQHBhcmFtIHs/fSBib2R5CiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGF0Y2godXJsLCBib2R5LCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVxdWVzdCgnUEFUQ0gnLCB1cmwsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAgICAgKiBgUE9TVGAgcmVxdWVzdCB0byBleGVjdXRlIG9uIHRoZSBzZXJ2ZXIuIFRoZSBzZXJ2ZXIgcmVzcG9uZHMgd2l0aCB0aGUgbG9jYXRpb24gb2YKICAgICAgICAgKiB0aGUgcmVwbGFjZWQgcmVzb3VyY2UuIFNlZSB0aGUgaW5kaXZpZHVhbCBvdmVybG9hZHMgZm9yCiAgICAgICAgICogZGV0YWlscyBvbiB0aGUgcmV0dXJuIHR5cGUuCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcGFyYW0gez99IGJvZHkKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwb3N0KHVybCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnJlcXVlc3QoJ1BPU1QnLCB1cmwsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb25zdHJ1Y3RzIGFuIG9ic2VydmFibGUgdGhhdCwgd2hlbiBzdWJzY3JpYmVkLCBjYXVzZXMgdGhlIGNvbmZpZ3VyZWQKICAgICAgICAgKiBgUFVUYCByZXF1ZXN0IHRvIGV4ZWN1dGUgb24gdGhlIHNlcnZlci4gVGhlIGBQVVRgIG1ldGhvZCByZXBsYWNlcyBhbiBleGlzdGluZyByZXNvdXJjZQogICAgICAgICAqIHdpdGggYSBuZXcgc2V0IG9mIHZhbHVlcy4KICAgICAgICAgKiBTZWUgdGhlIGluZGl2aWR1YWwgb3ZlcmxvYWRzIGZvciBkZXRhaWxzIG9uIHRoZSByZXR1cm4gdHlwZS4KICAgICAgICAgKiBAcGFyYW0gez99IHVybAogICAgICAgICAqIEBwYXJhbSB7P30gYm9keQogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHB1dCh1cmwsIGJvZHksIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5yZXF1ZXN0KCdQVVQnLCB1cmwsIGFkZEJvZHkob3B0aW9ucywgYm9keSkpOwogICAgICAgIH0KICAgIH0KICAgIEh0dHBDbGllbnQuybVmYWMgPSBmdW5jdGlvbiBIdHRwQ2xpZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEh0dHBDbGllbnQpKMm1ybVpbmplY3QoSHR0cEhhbmRsZXIpKTsgfTsKICAgIEh0dHBDbGllbnQuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSHR0cENsaWVudCwgZmFjdG9yeTogSHR0cENsaWVudC7JtWZhYyB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgSHR0cENsaWVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEh0dHBIYW5kbGVyIH0KICAgIF07CiAgICAvKioKICAgICAqIGBIdHRwSGFuZGxlcmAgd2hpY2ggYXBwbGllcyBhbiBgSHR0cEludGVyY2VwdG9yYCB0byBhbiBgSHR0cFJlcXVlc3RgLgogICAgICoKICAgICAqCiAgICAgKi8KICAgIGNsYXNzIEh0dHBJbnRlcmNlcHRvckhhbmRsZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICAgICAqIEBwYXJhbSB7P30gaW50ZXJjZXB0b3IKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihuZXh0LCBpbnRlcmNlcHRvcikgewogICAgICAgICAgICB0aGlzLm5leHQgPSBuZXh0OwogICAgICAgICAgICB0aGlzLmludGVyY2VwdG9yID0gaW50ZXJjZXB0b3I7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVxCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGUocmVxKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmludGVyY2VwdG9yLmludGVyY2VwdChyZXEsIHRoaXMubmV4dCk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBIG11bHRpLXByb3ZpZGVyIHRva2VuIHRoYXQgcmVwcmVzZW50cyB0aGUgYXJyYXkgb2YgcmVnaXN0ZXJlZAogICAgICogYEh0dHBJbnRlcmNlcHRvcmAgb2JqZWN0cy4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEhUVFBfSU5URVJDRVBUT1JTID0gbmV3IEluamVjdGlvblRva2VuKCdIVFRQX0lOVEVSQ0VQVE9SUycpOwogICAgY2xhc3MgTm9vcEludGVyY2VwdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlcQogICAgICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW50ZXJjZXB0KHJlcSwgbmV4dCkgewogICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTsKICAgICAgICB9CiAgICB9CiAgICBOb29wSW50ZXJjZXB0b3IuybVmYWMgPSBmdW5jdGlvbiBOb29wSW50ZXJjZXB0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTm9vcEludGVyY2VwdG9yKSgpOyB9OwogICAgTm9vcEludGVyY2VwdG9yLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IE5vb3BJbnRlcmNlcHRvciwgZmFjdG9yeTogTm9vcEludGVyY2VwdG9yLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL2h0dHAvc3JjL2pzb25wLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIEV2ZXJ5IHJlcXVlc3QgbWFkZSB0aHJvdWdoIEpTT05QIG5lZWRzIGEgY2FsbGJhY2sgbmFtZSB0aGF0J3MgdW5pcXVlIGFjcm9zcyB0aGUKICAgIC8vIHdob2xlIHBhZ2UuIEVhY2ggcmVxdWVzdCBpcyBhc3NpZ25lZCBhbiBpZCBhbmQgdGhlIGNhbGxiYWNrIG5hbWUgaXMgY29uc3RydWN0ZWQKICAgIC8vIGZyb20gdGhhdC4gVGhlIG5leHQgaWQgdG8gYmUgYXNzaWduZWQgaXMgdHJhY2tlZCBpbiBhIGdsb2JhbCB2YXJpYWJsZSBoZXJlIHRoYXQKICAgIC8vIGlzIHNoYXJlZCBhbW9uZyBhbGwgYXBwbGljYXRpb25zIG9uIHRoZSBwYWdlLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5leHRSZXF1ZXN0SWQgPSAwOwogICAgLy8gRXJyb3IgdGV4dCBnaXZlbiB3aGVuIGEgSlNPTlAgc2NyaXB0IGlzIGluamVjdGVkLCBidXQgZG9lc24ndCBpbnZva2UgdGhlIGNhbGxiYWNrCiAgICAvLyBwYXNzZWQgaW4gaXRzIFVSTC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEpTT05QX0VSUl9OT19DQUxMQkFDSyA9ICdKU09OUCBpbmplY3RlZCBzY3JpcHQgZGlkIG5vdCBpbnZva2UgY2FsbGJhY2suJzsKICAgIC8vIEVycm9yIHRleHQgZ2l2ZW4gd2hlbiBhIHJlcXVlc3QgaXMgcGFzc2VkIHRvIHRoZSBKc29ucENsaWVudEJhY2tlbmQgdGhhdCBkb2Vzbid0CiAgICAvLyBoYXZlIGEgcmVxdWVzdCBtZXRob2QgSlNPTlAuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBKU09OUF9FUlJfV1JPTkdfTUVUSE9EID0gJ0pTT05QIHJlcXVlc3RzIG11c3QgdXNlIEpTT05QIHJlcXVlc3QgbWV0aG9kLic7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBKU09OUF9FUlJfV1JPTkdfUkVTUE9OU0VfVFlQRSA9ICdKU09OUCByZXF1ZXN0cyBtdXN0IHVzZSBKc29uIHJlc3BvbnNlIHR5cGUuJzsKICAgIC8qKgogICAgICogREkgdG9rZW4vYWJzdHJhY3QgdHlwZSByZXByZXNlbnRpbmcgYSBtYXAgb2YgSlNPTlAgY2FsbGJhY2tzLgogICAgICoKICAgICAqIEluIHRoZSBicm93c2VyLCB0aGlzIHNob3VsZCBhbHdheXMgYmUgdGhlIGB3aW5kb3dgIG9iamVjdC4KICAgICAqCiAgICAgKgogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIEpzb25wQ2FsbGJhY2tDb250ZXh0IHsKICAgIH0KICAgIC8qKgogICAgICogUHJvY2Vzc2VzIGFuIGBIdHRwUmVxdWVzdGAgd2l0aCB0aGUgSlNPTlAgbWV0aG9kLAogICAgICogYnkgcGVyZm9ybWluZyBKU09OUCBzdHlsZSByZXF1ZXN0cy4KICAgICAqIEBzZWUgYEh0dHBIYW5kbGVyYAogICAgICogQHNlZSBgSHR0cFhockJhY2tlbmRgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSnNvbnBDbGllbnRCYWNrZW5kIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNhbGxiYWNrTWFwCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNhbGxiYWNrTWFwLCBkb2N1bWVudCkgewogICAgICAgICAgICB0aGlzLmNhbGxiYWNrTWFwID0gY2FsbGJhY2tNYXA7CiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBuYW1lIG9mIHRoZSBuZXh0IGNhbGxiYWNrIG1ldGhvZCwgYnkgaW5jcmVtZW50aW5nIHRoZSBnbG9iYWwgYG5leHRSZXF1ZXN0SWRgLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZXh0Q2FsbGJhY2soKSB7CiAgICAgICAgICAgIHJldHVybiBgbmdfanNvbnBfY2FsbGJhY2tfJHtuZXh0UmVxdWVzdElkKyt9YDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJvY2Vzc2VzIGEgSlNPTlAgcmVxdWVzdCBhbmQgcmV0dXJucyBhbiBldmVudCBzdHJlYW0gb2YgdGhlIHJlc3VsdHMuCiAgICAgICAgICogQHBhcmFtIHs/fSByZXEgVGhlIHJlcXVlc3Qgb2JqZWN0LgogICAgICAgICAqIEByZXR1cm4gez99IEFuIG9ic2VydmFibGUgb2YgdGhlIHJlc3BvbnNlIGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqLwogICAgICAgIGhhbmRsZShyZXEpIHsKICAgICAgICAgICAgLy8gRmlyc3RseSwgY2hlY2sgYm90aCB0aGUgbWV0aG9kIGFuZCByZXNwb25zZSB0eXBlLiBJZiBlaXRoZXIgZG9lc24ndCBtYXRjaAogICAgICAgICAgICAvLyB0aGVuIHRoZSByZXF1ZXN0IHdhcyBpbXByb3Blcmx5IHJvdXRlZCBoZXJlIGFuZCBjYW5ub3QgYmUgaGFuZGxlZC4KICAgICAgICAgICAgaWYgKHJlcS5tZXRob2QgIT09ICdKU09OUCcpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OUF9FUlJfV1JPTkdfTUVUSE9EKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChyZXEucmVzcG9uc2VUeXBlICE9PSAnanNvbicpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihKU09OUF9FUlJfV1JPTkdfUkVTUE9OU0VfVFlQRSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRXZlcnl0aGluZyBlbHNlIGhhcHBlbnMgaW5zaWRlIHRoZSBPYnNlcnZhYmxlIGJvdW5kYXJ5LgogICAgICAgICAgICByZXR1cm4gbmV3IE9ic2VydmFibGUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9ic2VydmVyCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAob2JzZXJ2ZXIpID0+IHsKICAgICAgICAgICAgICAgIC8vIFRoZSBmaXJzdCBzdGVwIHRvIG1ha2UgYSByZXF1ZXN0IGlzIHRvIGdlbmVyYXRlIHRoZSBjYWxsYmFjayBuYW1lLCBhbmQgcmVwbGFjZSB0aGUKICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrIHBsYWNlaG9sZGVyIGluIHRoZSBVUkwgd2l0aCB0aGUgbmFtZS4gQ2FyZSBoYXMgdG8gYmUgdGFrZW4gaGVyZSB0byBlbnN1cmUKICAgICAgICAgICAgICAgIC8vIGEgdHJhaWxpbmcgJiwgaWYgbWF0Y2hlZCwgZ2V0cyBpbnNlcnRlZCBiYWNrIGludG8gdGhlIFVSTCBpbiB0aGUgY29ycmVjdCBwbGFjZS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNhbGxiYWNrID0gdGhpcy5uZXh0Q2FsbGJhY2soKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IHJlcS51cmxXaXRoUGFyYW1zLnJlcGxhY2UoLz1KU09OUF9DQUxMQkFDSygmfCQpLywgYD0ke2NhbGxiYWNrfSQxYCk7CiAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgdGhlIDxzY3JpcHQ+IHRhZyBhbmQgcG9pbnQgaXQgYXQgdGhlIFVSTC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5vZGUgPSB0aGlzLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NjcmlwdCcpOwogICAgICAgICAgICAgICAgbm9kZS5zcmMgPSB1cmw7CiAgICAgICAgICAgICAgICAvLyBBIEpTT05QIHJlcXVlc3QgcmVxdWlyZXMgd2FpdGluZyBmb3IgbXVsdGlwbGUgY2FsbGJhY2tzLiBUaGVzZSB2YXJpYWJsZXMKICAgICAgICAgICAgICAgIC8vIGFyZSBjbG9zZWQgb3ZlciBhbmQgdHJhY2sgc3RhdGUgYWNyb3NzIHRob3NlIGNhbGxiYWNrcy4KICAgICAgICAgICAgICAgIC8vIFRoZSByZXNwb25zZSBvYmplY3QsIGlmIG9uZSBoYXMgYmVlbiByZWNlaXZlZCwgb3IgbnVsbCBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgYm9keSA9IG51bGw7CiAgICAgICAgICAgICAgICAvLyBXaGV0aGVyIHRoZSByZXNwb25zZSBjYWxsYmFjayBoYXMgYmVlbiBjYWxsZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgZmluaXNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIC8vIFdoZXRoZXIgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY2FuY2VsbGVkIChhbmQgdGh1cyBhbnkgb3RoZXIgY2FsbGJhY2tzKQogICAgICAgICAgICAgICAgLy8gc2hvdWxkIGJlIGlnbm9yZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgY2FuY2VsbGVkID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlc3BvbnNlIGNhbGxiYWNrIGluIHRoaXMuY2FsbGJhY2tNYXAgKHdoaWNoIHdpbGwgYmUgdGhlIHdpbmRvdwogICAgICAgICAgICAgICAgLy8gb2JqZWN0IGluIHRoZSBicm93c2VyLiBUaGUgc2NyaXB0IGJlaW5nIGxvYWRlZCB2aWEgdGhlIDxzY3JpcHQ+IHRhZyB3aWxsCiAgICAgICAgICAgICAgICAvLyBldmVudHVhbGx5IGNhbGwgdGhpcyBjYWxsYmFjay4KICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2tNYXBbY2FsbGJhY2tdID0gKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/PX0gZGF0YQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGRhdGEpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBEYXRhIGhhcyBiZWVuIHJlY2VpdmVkIGZyb20gdGhlIEpTT05QIHNjcmlwdC4gRmlyc3RseSwgZGVsZXRlIHRoaXMgY2FsbGJhY2suCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgICAgIC8vIE5leHQsIG1ha2Ugc3VyZSB0aGUgcmVxdWVzdCB3YXNuJ3QgY2FuY2VsbGVkIGluIHRoZSBtZWFudGltZS4KICAgICAgICAgICAgICAgICAgICBpZiAoY2FuY2VsbGVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHN0YXRlIHRvIGluZGljYXRlIGRhdGEgd2FzIHJlY2VpdmVkLgogICAgICAgICAgICAgICAgICAgIGJvZHkgPSBkYXRhOwogICAgICAgICAgICAgICAgICAgIGZpbmlzaGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gY2xlYW51cCgpIGlzIGEgdXRpbGl0eSBjbG9zdXJlIHRoYXQgcmVtb3ZlcyB0aGUgPHNjcmlwdD4gZnJvbSB0aGUgcGFnZSBhbmQKICAgICAgICAgICAgICAgIC8vIHRoZSByZXNwb25zZSBjYWxsYmFjayBmcm9tIHRoZSB3aW5kb3cuIFRoaXMgbG9naWMgaXMgdXNlZCBpbiBib3RoIHRoZQogICAgICAgICAgICAgICAgLy8gc3VjY2VzcywgZXJyb3IsIGFuZCBjYW5jZWxsYXRpb24gcGF0aHMsIHNvIGl0J3MgZXh0cmFjdGVkIG91dCBmb3IgY29udmVuaWVuY2UuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjbGVhbnVwID0gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgPHNjcmlwdD4gdGFnIGlmIGl0J3Mgc3RpbGwgb24gdGhlIHBhZ2UuCiAgICAgICAgICAgICAgICAgICAgaWYgKG5vZGUucGFyZW50Tm9kZSkgewogICAgICAgICAgICAgICAgICAgICAgICBub2RlLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQobm9kZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgcmVzcG9uc2UgY2FsbGJhY2sgZnJvbSB0aGUgY2FsbGJhY2tNYXAgKHdpbmRvdyBvYmplY3QgaW4gdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gYnJvd3NlcikuCiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY2FsbGJhY2tNYXBbY2FsbGJhY2tdOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBvbkxvYWQoKSBpcyB0aGUgc3VjY2VzcyBjYWxsYmFjayB3aGljaCBydW5zIGFmdGVyIHRoZSByZXNwb25zZSBjYWxsYmFjawogICAgICAgICAgICAgICAgLy8gaWYgdGhlIEpTT05QIHNjcmlwdCBsb2FkcyBzdWNjZXNzZnVsbHkuIFRoZSBldmVudCBpdHNlbGYgaXMgdW5pbXBvcnRhbnQuCiAgICAgICAgICAgICAgICAvLyBJZiBzb21ldGhpbmcgd2VudCB3cm9uZywgb25Mb2FkKCkgbWF5IHJ1biB3aXRob3V0IHRoZSByZXNwb25zZSBjYWxsYmFjawogICAgICAgICAgICAgICAgLy8gaGF2aW5nIGJlZW4gaW52b2tlZC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9uTG9hZCA9ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIERvIG5vdGhpbmcgaWYgdGhlIHJlcXVlc3QgaGFzIGJlZW4gY2FuY2VsbGVkLgogICAgICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBDbGVhbnVwIHRoZSBwYWdlLgogICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTsKICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSByZXNwb25zZSBjYWxsYmFjayBoYXMgcnVuLgogICAgICAgICAgICAgICAgICAgIGlmICghZmluaXNoZWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgaGFzbid0LCBzb21ldGhpbmcgd2VudCB3cm9uZyB3aXRoIHRoZSByZXF1ZXN0LiBSZXR1cm4gYW4gZXJyb3IgdmlhCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBPYnNlcnZhYmxlIGVycm9yIHBhdGguIEFsbCBKU09OUCBlcnJvcnMgaGF2ZSBzdGF0dXMgMC4KICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuZXJyb3IobmV3IEh0dHBFcnJvclJlc3BvbnNlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICdKU09OUCBFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogbmV3IEVycm9yKEpTT05QX0VSUl9OT19DQUxMQkFDSyksCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBTdWNjZXNzLiBib2R5IGVpdGhlciBjb250YWlucyB0aGUgcmVzcG9uc2UgYm9keSBvciBudWxsIGlmIG5vbmUgd2FzCiAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuZWQuCiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChuZXcgSHR0cFJlc3BvbnNlKHsKICAgICAgICAgICAgICAgICAgICAgICAgYm9keSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiAyMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICdPSycsCiAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgLy8gQ29tcGxldGUgdGhlIHN0cmVhbSwgdGhlIHJlc3BvbnNlIGlzIG92ZXIuCiAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgLy8gb25FcnJvcigpIGlzIHRoZSBlcnJvciBjYWxsYmFjaywgd2hpY2ggcnVucyBpZiB0aGUgc2NyaXB0IHJldHVybmVkIGdlbmVyYXRlcwogICAgICAgICAgICAgICAgLy8gYSBKYXZhc2NyaXB0IGVycm9yLiBJdCBlbWl0cyB0aGUgZXJyb3IgdmlhIHRoZSBPYnNlcnZhYmxlIGVycm9yIGNoYW5uZWwgYXMKICAgICAgICAgICAgICAgIC8vIGEgSHR0cEVycm9yUmVzcG9uc2UuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbkVycm9yID0gKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgd2FzIGFscmVhZHkgY2FuY2VsbGVkLCBubyBuZWVkIHRvIGVtaXQgYW55dGhpbmcuCiAgICAgICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNsZWFudXAoKTsKICAgICAgICAgICAgICAgICAgICAvLyBXcmFwIHRoZSBlcnJvciBpbiBhIEh0dHBFcnJvclJlc3BvbnNlLgogICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKG5ldyBIdHRwRXJyb3JSZXNwb25zZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yLAogICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXM6IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6ICdKU09OUCBFcnJvcicsCiAgICAgICAgICAgICAgICAgICAgICAgIHVybCwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byBib3RoIHRoZSBzdWNjZXNzIChsb2FkKSBhbmQgZXJyb3IgZXZlbnRzIG9uIHRoZSA8c2NyaXB0PiB0YWcsCiAgICAgICAgICAgICAgICAvLyBhbmQgYWRkIGl0IHRvIHRoZSBwYWdlLgogICAgICAgICAgICAgICAgbm9kZS5hZGRFdmVudExpc3RlbmVyKCdsb2FkJywgb25Mb2FkKTsKICAgICAgICAgICAgICAgIG5vZGUuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChub2RlKTsKICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGhhcyBub3cgYmVlbiBzdWNjZXNzZnVsbHkgc2VudC4KICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiBIdHRwRXZlbnRUeXBlLlNlbnQgfSk7CiAgICAgICAgICAgICAgICAvLyBDYW5jZWxsYXRpb24gaGFuZGxlci4KICAgICAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gVHJhY2sgdGhlIGNhbmNlbGxhdGlvbiBzbyBldmVudCBsaXN0ZW5lcnMgd29uJ3QgZG8gYW55dGhpbmcgZXZlbiBpZiBhbHJlYWR5IHNjaGVkdWxlZC4KICAgICAgICAgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgZXZlbnQgbGlzdGVuZXJzIHNvIHRoZXkgd29uJ3QgcnVuIGlmIHRoZSBldmVudHMgbGF0ZXIgZmlyZS4KICAgICAgICAgICAgICAgICAgICBub2RlLnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpOwogICAgICAgICAgICAgICAgICAgIG5vZGUucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgICAgICAvLyBBbmQgZmluYWxseSwgY2xlYW4gdXAgdGhlIHBhZ2UuCiAgICAgICAgICAgICAgICAgICAgY2xlYW51cCgpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICBKc29ucENsaWVudEJhY2tlbmQuybVmYWMgPSBmdW5jdGlvbiBKc29ucENsaWVudEJhY2tlbmRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSnNvbnBDbGllbnRCYWNrZW5kKSjJtcm1aW5qZWN0KEpzb25wQ2FsbGJhY2tDb250ZXh0KSwgybXJtWluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICBKc29ucENsaWVudEJhY2tlbmQuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSnNvbnBDbGllbnRCYWNrZW5kLCBmYWN0b3J5OiBKc29ucENsaWVudEJhY2tlbmQuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEpzb25wQ2xpZW50QmFja2VuZC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEpzb25wQ2FsbGJhY2tDb250ZXh0IH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9CiAgICBdOwogICAgLyoqCiAgICAgKiBJZGVudGlmaWVzIHJlcXVlc3RzIHdpdGggdGhlIG1ldGhvZCBKU09OUCBhbmQKICAgICAqIHNoaWZ0cyB0aGVtIHRvIHRoZSBgSnNvbnBDbGllbnRCYWNrZW5kYC4KICAgICAqCiAgICAgKiBAc2VlIGBIdHRwSW50ZXJjZXB0b3JgCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSnNvbnBJbnRlcmNlcHRvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBqc29ucAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGpzb25wKSB7CiAgICAgICAgICAgIHRoaXMuanNvbnAgPSBqc29ucDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSWRlbnRpZmllcyBhbmQgaGFuZGxlcyBhIGdpdmVuIEpTT05QIHJlcXVlc3QuCiAgICAgICAgICogQHBhcmFtIHs/fSByZXEgVGhlIG91dGdvaW5nIHJlcXVlc3Qgb2JqZWN0IHRvIGhhbmRsZS4KICAgICAgICAgKiBAcGFyYW0gez99IG5leHQgVGhlIG5leHQgaW50ZXJjZXB0b3IgaW4gdGhlIGNoYWluLCBvciB0aGUgYmFja2VuZAogICAgICAgICAqIGlmIG5vIGludGVyY2VwdG9ycyByZW1haW4gaW4gdGhlIGNoYWluLgogICAgICAgICAqIEByZXR1cm4gez99IEFuIG9ic2VydmFibGUgb2YgdGhlIGV2ZW50IHN0cmVhbS4KICAgICAgICAgKi8KICAgICAgICBpbnRlcmNlcHQocmVxLCBuZXh0KSB7CiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSAnSlNPTlAnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5qc29ucC5oYW5kbGUoKC8qKiBAdHlwZSB7P30gKi8gKHJlcSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGYWxsIHRocm91Z2ggZm9yIG5vcm1hbCBIVFRQIHJlcXVlc3RzLgogICAgICAgICAgICByZXR1cm4gbmV4dC5oYW5kbGUocmVxKTsKICAgICAgICB9CiAgICB9CiAgICBKc29ucEludGVyY2VwdG9yLsm1ZmFjID0gZnVuY3Rpb24gSnNvbnBJbnRlcmNlcHRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBKc29ucEludGVyY2VwdG9yKSjJtcm1aW5qZWN0KEpzb25wQ2xpZW50QmFja2VuZCkpOyB9OwogICAgSnNvbnBJbnRlcmNlcHRvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBKc29ucEludGVyY2VwdG9yLCBmYWN0b3J5OiBKc29ucEludGVyY2VwdG9yLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBKc29ucEludGVyY2VwdG9yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSnNvbnBDbGllbnRCYWNrZW5kIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBwYWNrYWdlcy9jb21tb24vaHR0cC9zcmMveGhyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFhTU0lfUFJFRklYID0gL15cKVxdXH0nLD9cbi87CiAgICAvKioKICAgICAqIERldGVybWluZSBhbiBhcHByb3ByaWF0ZSBVUkwgZm9yIHRoZSByZXNwb25zZSwgYnkgY2hlY2tpbmcgZWl0aGVyCiAgICAgKiBYTUxIdHRwUmVxdWVzdC5yZXNwb25zZVVSTCBvciB0aGUgWC1SZXF1ZXN0LVVSTCBoZWFkZXIuCiAgICAgKiBAcGFyYW0gez99IHhocgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UmVzcG9uc2VVcmwoeGhyKSB7CiAgICAgICAgaWYgKCdyZXNwb25zZVVSTCcgaW4geGhyICYmIHhoci5yZXNwb25zZVVSTCkgewogICAgICAgICAgICByZXR1cm4geGhyLnJlc3BvbnNlVVJMOwogICAgICAgIH0KICAgICAgICBpZiAoL15YLVJlcXVlc3QtVVJMOi9tLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSkgewogICAgICAgICAgICByZXR1cm4geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdYLVJlcXVlc3QtVVJMJyk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgfQogICAgLyoqCiAgICAgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBgWE1MSHR0cFJlcXVlc3RgIGNvbnN0cnVjdG9yLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgWGhyRmFjdG9yeSB7CiAgICB9CiAgICAvKioKICAgICAqIEEgZmFjdG9yeSBmb3IgYEh0dHBYaHJCYWNrZW5kYCB0aGF0IHVzZXMgdGhlIGBYTUxIdHRwUmVxdWVzdGAgYnJvd3NlciBBUEkuCiAgICAgKgogICAgICovCiAgICBjbGFzcyBCcm93c2VyWGhyIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYnVpbGQoKSB7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoKG5ldyBYTUxIdHRwUmVxdWVzdCgpKSkpOwogICAgICAgIH0KICAgIH0KICAgIEJyb3dzZXJYaHIuybVmYWMgPSBmdW5jdGlvbiBCcm93c2VyWGhyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEJyb3dzZXJYaHIpKCk7IH07CiAgICBCcm93c2VyWGhyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEJyb3dzZXJYaHIsIGZhY3Rvcnk6IEJyb3dzZXJYaHIuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEJyb3dzZXJYaHIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbXTsKICAgIC8qKgogICAgICogVXNlcyBgWE1MSHR0cFJlcXVlc3RgIHRvIHNlbmQgcmVxdWVzdHMgdG8gYSBiYWNrZW5kIHNlcnZlci4KICAgICAqIEBzZWUgYEh0dHBIYW5kbGVyYAogICAgICogQHNlZSBgSnNvbnBDbGllbnRCYWNrZW5kYAogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEh0dHBYaHJCYWNrZW5kIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHhockZhY3RvcnkKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih4aHJGYWN0b3J5KSB7CiAgICAgICAgICAgIHRoaXMueGhyRmFjdG9yeSA9IHhockZhY3Rvcnk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFByb2Nlc3NlcyBhIHJlcXVlc3QgYW5kIHJldHVybnMgYSBzdHJlYW0gb2YgcmVzcG9uc2UgZXZlbnRzLgogICAgICAgICAqIEBwYXJhbSB7P30gcmVxIFRoZSByZXF1ZXN0IG9iamVjdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBbiBvYnNlcnZhYmxlIG9mIHRoZSByZXNwb25zZSBldmVudHMuCiAgICAgICAgICovCiAgICAgICAgaGFuZGxlKHJlcSkgewogICAgICAgICAgICAvLyBRdWljayBjaGVjayB0byBnaXZlIGEgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBhIHVzZXIgYXR0ZW1wdHMgdG8gdXNlCiAgICAgICAgICAgIC8vIEh0dHBDbGllbnQuanNvbnAoKSB3aXRob3V0IGluc3RhbGxpbmcgdGhlIEpzb25wQ2xpZW50TW9kdWxlCiAgICAgICAgICAgIGlmIChyZXEubWV0aG9kID09PSAnSlNPTlAnKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHRlZCB0byBjb25zdHJ1Y3QgSnNvbnAgcmVxdWVzdCB3aXRob3V0IEpzb25wQ2xpZW50TW9kdWxlIGluc3RhbGxlZC5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBFdmVyeXRoaW5nIGhhcHBlbnMgb24gT2JzZXJ2YWJsZSBzdWJzY3JpcHRpb24uCiAgICAgICAgICAgIHJldHVybiBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvYnNlcnZlcikgPT4gewogICAgICAgICAgICAgICAgLy8gU3RhcnQgYnkgc2V0dGluZyB1cCB0aGUgWEhSIG9iamVjdCB3aXRoIHJlcXVlc3QgbWV0aG9kLCBVUkwsIGFuZCB3aXRoQ3JlZGVudGlhbHMgZmxhZy4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHhociA9IHRoaXMueGhyRmFjdG9yeS5idWlsZCgpOwogICAgICAgICAgICAgICAgeGhyLm9wZW4ocmVxLm1ldGhvZCwgcmVxLnVybFdpdGhQYXJhbXMpOwogICAgICAgICAgICAgICAgaWYgKCEhcmVxLndpdGhDcmVkZW50aWFscykgewogICAgICAgICAgICAgICAgICAgIHhoci53aXRoQ3JlZGVudGlhbHMgPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gQWRkIGFsbCB0aGUgcmVxdWVzdGVkIGhlYWRlcnMuCiAgICAgICAgICAgICAgICByZXEuaGVhZGVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZXMKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChuYW1lLCB2YWx1ZXMpID0+IHhoci5zZXRSZXF1ZXN0SGVhZGVyKG5hbWUsIHZhbHVlcy5qb2luKCcsJykpKSk7CiAgICAgICAgICAgICAgICAvLyBBZGQgYW4gQWNjZXB0IGhlYWRlciBpZiBvbmUgaXNuJ3QgcHJlc2VudCBhbHJlYWR5LgogICAgICAgICAgICAgICAgaWYgKCFyZXEuaGVhZGVycy5oYXMoJ0FjY2VwdCcpKSB7CiAgICAgICAgICAgICAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoJ0FjY2VwdCcsICdhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L3BsYWluLCAqLyonKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIEF1dG8tZGV0ZWN0IHRoZSBDb250ZW50LVR5cGUgaGVhZGVyIGlmIG9uZSBpc24ndCBwcmVzZW50IGFscmVhZHkuCiAgICAgICAgICAgICAgICBpZiAoIXJlcS5oZWFkZXJzLmhhcygnQ29udGVudC1UeXBlJykpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGV0ZWN0ZWRUeXBlID0gcmVxLmRldGVjdENvbnRlbnRUeXBlSGVhZGVyKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gU29tZXRpbWVzIENvbnRlbnQtVHlwZSBkZXRlY3Rpb24gZmFpbHMuCiAgICAgICAgICAgICAgICAgICAgaWYgKGRldGVjdGVkVHlwZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcignQ29udGVudC1UeXBlJywgZGV0ZWN0ZWRUeXBlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIHJlc3BvbnNlVHlwZSBpZiBvbmUgd2FzIHJlcXVlc3RlZC4KICAgICAgICAgICAgICAgIGlmIChyZXEucmVzcG9uc2VUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlVHlwZSA9IHJlcS5yZXNwb25zZVR5cGUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgICAgICAgICAvLyBKU09OIHJlc3BvbnNlcyBuZWVkIHRvIGJlIHByb2Nlc3NlZCBhcyB0ZXh0LiBUaGlzIGlzIGJlY2F1c2UgaWYgdGhlIHNlcnZlcgogICAgICAgICAgICAgICAgICAgIC8vIHJldHVybnMgYW4gWFNTSS1wcmVmaXhlZCBKU09OIHJlc3BvbnNlLCB0aGUgYnJvd3NlciB3aWxsIGZhaWwgdG8gcGFyc2UgaXQsCiAgICAgICAgICAgICAgICAgICAgLy8geGhyLnJlc3BvbnNlIHdpbGwgYmUgbnVsbCwgYW5kIHhoci5yZXNwb25zZVRleHQgY2Fubm90IGJlIGFjY2Vzc2VkIHRvCiAgICAgICAgICAgICAgICAgICAgLy8gcmV0cmlldmUgdGhlIHByZWZpeGVkIEpTT04gZGF0YSBpbiBvcmRlciB0byBzdHJpcCB0aGUgcHJlZml4LiBUaHVzLCBhbGwgSlNPTgogICAgICAgICAgICAgICAgICAgIC8vIGlzIHBhcnNlZCBieSBmaXJzdCByZXF1ZXN0aW5nIHRleHQgYW5kIHRoZW4gYXBwbHlpbmcgSlNPTi5wYXJzZS4KICAgICAgICAgICAgICAgICAgICB4aHIucmVzcG9uc2VUeXBlID0gKC8qKiBAdHlwZSB7P30gKi8gKCgocmVzcG9uc2VUeXBlICE9PSAnanNvbicpID8gcmVzcG9uc2VUeXBlIDogJ3RleHQnKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gU2VyaWFsaXplIHRoZSByZXF1ZXN0IGJvZHkgaWYgb25lIGlzIHByZXNlbnQuIElmIG5vdCwgdGhpcyB3aWxsIGJlIHNldCB0byBudWxsLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVxQm9keSA9IHJlcS5zZXJpYWxpemVCb2R5KCk7CiAgICAgICAgICAgICAgICAvLyBJZiBwcm9ncmVzcyBldmVudHMgYXJlIGVuYWJsZWQsIHJlc3BvbnNlIGhlYWRlcnMgd2lsbCBiZSBkZWxpdmVyZWQKICAgICAgICAgICAgICAgIC8vIGluIHR3byBldmVudHMgLSB0aGUgSHR0cEhlYWRlclJlc3BvbnNlIGV2ZW50IGFuZCB0aGUgZnVsbCBIdHRwUmVzcG9uc2UKICAgICAgICAgICAgICAgIC8vIGV2ZW50LiBIb3dldmVyLCBzaW5jZSByZXNwb25zZSBoZWFkZXJzIGRvbid0IGNoYW5nZSBpbiBiZXR3ZWVuIHRoZXNlCiAgICAgICAgICAgICAgICAvLyB0d28gZXZlbnRzLCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2UgdG8gcGFyc2UgdGhlbSB0d2ljZS4gU28gaGVhZGVyUmVzcG9uc2UKICAgICAgICAgICAgICAgIC8vIGNhY2hlcyB0aGUgZGF0YSBleHRyYWN0ZWQgZnJvbSB0aGUgcmVzcG9uc2Ugd2hlbmV2ZXIgaXQncyBmaXJzdCBwYXJzZWQsCiAgICAgICAgICAgICAgICAvLyB0byBlbnN1cmUgcGFyc2luZyBpc24ndCBkdXBsaWNhdGVkLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGhlYWRlclJlc3BvbnNlID0gbnVsbDsKICAgICAgICAgICAgICAgIC8vIHBhcnRpYWxGcm9tWGhyIGV4dHJhY3RzIHRoZSBIdHRwSGVhZGVyUmVzcG9uc2UgZnJvbSB0aGUgY3VycmVudCBYTUxIdHRwUmVxdWVzdAogICAgICAgICAgICAgICAgLy8gc3RhdGUsIGFuZCBtZW1vaXplcyBpdCBpbnRvIGhlYWRlclJlc3BvbnNlLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcGFydGlhbEZyb21YaHIgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGhlYWRlclJlc3BvbnNlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFkZXJSZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBzdGF0dXMgYW5kIG5vcm1hbGl6ZSBhbiBJRTkgYnVnIChodHRwOi8vYnVncy5qcXVlcnkuY29tL3RpY2tldC8xNDUwKS4KICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RhdHVzID0geGhyLnN0YXR1cyA9PT0gMTIyMyA/IDIwNCA6IHhoci5zdGF0dXM7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YXR1c1RleHQgPSB4aHIuc3RhdHVzVGV4dCB8fCAnT0snOwogICAgICAgICAgICAgICAgICAgIC8vIFBhcnNlIGhlYWRlcnMgZnJvbSBYTUxIdHRwUmVxdWVzdCAtIHRoaXMgc3RlcCBpcyBsYXp5LgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gbmV3IEh0dHBIZWFkZXJzKHhoci5nZXRBbGxSZXNwb25zZUhlYWRlcnMoKSk7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCB0aGUgcmVzcG9uc2UgVVJMIGZyb20gdGhlIFhNTEh0dHBSZXNwb25zZSBpbnN0YW5jZSBhbmQgZmFsbCBiYWNrIG9uIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgVVJMLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB1cmwgPSBnZXRSZXNwb25zZVVybCh4aHIpIHx8IHJlcS51cmw7CiAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRoZSBIdHRwSGVhZGVyUmVzcG9uc2UgYW5kIG1lbW9pemUgaXQuCiAgICAgICAgICAgICAgICAgICAgaGVhZGVyUmVzcG9uc2UgPSBuZXcgSHR0cEhlYWRlclJlc3BvbnNlKHsgaGVhZGVycywgc3RhdHVzLCBzdGF0dXNUZXh0LCB1cmwgfSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhlYWRlclJlc3BvbnNlOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBOZXh0LCBhIGZldyBjbG9zdXJlcyBhcmUgZGVmaW5lZCBmb3IgdGhlIHZhcmlvdXMgZXZlbnRzIHdoaWNoIFhNTEh0dHBSZXF1ZXN0IGNhbgogICAgICAgICAgICAgICAgLy8gZW1pdC4gVGhpcyBhbGxvd3MgdGhlbSB0byBiZSB1bnJlZ2lzdGVyZWQgYXMgZXZlbnQgbGlzdGVuZXJzIGxhdGVyLgogICAgICAgICAgICAgICAgLy8gRmlyc3QgdXAgaXMgdGhlIGxvYWQgZXZlbnQsIHdoaWNoIHJlcHJlc2VudHMgYSByZXNwb25zZSBiZWluZyBmdWxseSBhdmFpbGFibGUuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbkxvYWQgPSAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCByZXNwb25zZSBzdGF0ZSBmcm9tIHRoZSBtZW1vaXplZCBwYXJ0aWFsIGRhdGEuCiAgICAgICAgICAgICAgICAgICAgbGV0IHsgaGVhZGVycywgc3RhdHVzLCBzdGF0dXNUZXh0LCB1cmwgfSA9IHBhcnRpYWxGcm9tWGhyKCk7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGJvZHkgd2lsbCBiZSByZWFkIG91dCBpZiBwcmVzZW50LgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgYm9keSA9IG51bGw7CiAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPT0gMjA0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzZSBYTUxIdHRwUmVxdWVzdC5yZXNwb25zZSBpZiBzZXQsIHJlc3BvbnNlVGV4dCBvdGhlcndpc2UuCiAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSAodHlwZW9mIHhoci5yZXNwb25zZSA9PT0gJ3VuZGVmaW5lZCcpID8geGhyLnJlc3BvbnNlVGV4dCA6IHhoci5yZXNwb25zZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gTm9ybWFsaXplIGFub3RoZXIgcG90ZW50aWFsIGJ1ZyAodGhpcyBvbmUgY29tZXMgZnJvbSBDT1JTKS4KICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICEhYm9keSA/IDIwMCA6IDA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIG9rIGRldGVybWluZXMgd2hldGhlciB0aGUgcmVzcG9uc2Ugd2lsbCBiZSB0cmFuc21pdHRlZCBvbiB0aGUgZXZlbnQgb3IKICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBjaGFubmVsLiBVbnN1Y2Nlc3NmdWwgc3RhdHVzIGNvZGVzIChub3QgMnh4KSB3aWxsIGFsd2F5cyBiZSBlcnJvcnMsCiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGEgc3VjY2Vzc2Z1bCBzdGF0dXMgY29kZSBjYW4gc3RpbGwgcmVzdWx0IGluIGFuIGVycm9yIGlmIHRoZSB1c2VyCiAgICAgICAgICAgICAgICAgICAgLy8gYXNrZWQgZm9yIEpTT04gZGF0YSBhbmQgdGhlIGJvZHkgY2Fubm90IGJlIHBhcnNlZCBhcyBzdWNoLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgb2sgPSBzdGF0dXMgPj0gMjAwICYmIHN0YXR1cyA8IDMwMDsKICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSBib2R5IG5lZWRzIHRvIGJlIHBhcnNlZCBhcyBKU09OIChpbiBtYW55IGNhc2VzIHRoZSBicm93c2VyCiAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBoYXZlIGRvbmUgdGhhdCBhbHJlYWR5KS4KICAgICAgICAgICAgICAgICAgICBpZiAocmVxLnJlc3BvbnNlVHlwZSA9PT0gJ2pzb24nICYmIHR5cGVvZiBib2R5ID09PSAnc3RyaW5nJykgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBvcmlnaW5hbCBib2R5LCBiZWZvcmUgYXR0ZW1wdGluZyBYU1NJIHByZWZpeCBzdHJpcHBpbmcuCiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb3JpZ2luYWxCb2R5ID0gYm9keTsKICAgICAgICAgICAgICAgICAgICAgICAgYm9keSA9IGJvZHkucmVwbGFjZShYU1NJX1BSRUZJWCwgJycpOwogICAgICAgICAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW1wdCB0aGUgcGFyc2UuIElmIGl0IGZhaWxzLCBhIHBhcnNlIGVycm9yIHNob3VsZCBiZSBkZWxpdmVyZWQgdG8gdGhlIHVzZXIuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gYm9keSAhPT0gJycgPyBKU09OLnBhcnNlKGJvZHkpIDogbnVsbDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBKU09OLnBhcnNlIGZhaWxlZCwgaXQncyByZWFzb25hYmxlIHRvIGFzc3VtZSB0aGlzIG1pZ2h0IG5vdCBoYXZlIGJlZW4gYQogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSlNPTiByZXNwb25zZS4gUmVzdG9yZSB0aGUgb3JpZ2luYWwgYm9keSAoaW5jbHVkaW5nIGFueSBYU1NJIHByZWZpeCkgdG8gZGVsaXZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBiZXR0ZXIgZXJyb3IgcmVzcG9uc2UuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib2R5ID0gb3JpZ2luYWxCb2R5OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyB3YXMgYW4gZXJyb3IgcmVxdWVzdCB0byBiZWdpbiB3aXRoLCBsZWF2ZSBpdCBhcyBhIHN0cmluZywgaXQgcHJvYmFibHkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgaXNuJ3QgSlNPTi4gT3RoZXJ3aXNlLCBkZWxpdmVyIHRoZSBwYXJzaW5nIGVycm9yIHRvIHRoZSB1c2VyLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRXZlbiB0aG91Z2ggdGhlIHJlc3BvbnNlIHN0YXR1cyB3YXMgMnh4LCB0aGlzIGlzIHN0aWxsIGFuIGVycm9yLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9rID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHBhcnNlIGVycm9yIGNvbnRhaW5zIHRoZSB0ZXh0IG9mIHRoZSBib2R5IHRoYXQgZmFpbGVkIHRvIHBhcnNlLgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHkgPSAoLyoqIEB0eXBlIHs/fSAqLyAoeyBlcnJvciwgdGV4dDogYm9keSB9KSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKG9rKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3VjY2Vzc2Z1bCByZXNwb25zZSBpcyBkZWxpdmVyZWQgb24gdGhlIGV2ZW50IHN0cmVhbS4KICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChuZXcgSHR0cFJlc3BvbnNlKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvZHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzVGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVybDogdXJsIHx8IHVuZGVmaW5lZCwKICAgICAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZnVsbCBib2R5IGhhcyBiZWVuIHJlY2VpdmVkIGFuZCBkZWxpdmVyZWQsIG5vIGZ1cnRoZXIgZXZlbnRzCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZSBwb3NzaWJsZS4gVGhpcyByZXF1ZXN0IGlzIGNvbXBsZXRlLgogICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5jb21wbGV0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gdW5zdWNjZXNzZnVsIHJlcXVlc3QgaXMgZGVsaXZlcmVkIG9uIHRoZSBlcnJvciBjaGFubmVsLgogICAgICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5lcnJvcihuZXcgSHR0cEVycm9yUmVzcG9uc2UoewogICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGVycm9yIGluIHRoaXMgY2FzZSBpcyB0aGUgcmVzcG9uc2UgYm9keSAoZXJyb3IgZnJvbSB0aGUgc2VydmVyKS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiBib2R5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHVybCB8fCB1bmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFRoZSBvbkVycm9yIGNhbGxiYWNrIGlzIGNhbGxlZCB3aGVuIHNvbWV0aGluZyBnb2VzIHdyb25nIGF0IHRoZSBuZXR3b3JrIGxldmVsLgogICAgICAgICAgICAgICAgLy8gQ29ubmVjdGlvbiB0aW1lb3V0LCBETlMgZXJyb3IsIG9mZmxpbmUsIGV0Yy4gVGhlc2UgYXJlIGFjdHVhbCBlcnJvcnMsIGFuZCBhcmUKICAgICAgICAgICAgICAgIC8vIHRyYW5zbWl0dGVkIG9uIHRoZSBlcnJvciBjaGFubmVsLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb25FcnJvciA9ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlcnJvcikgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdXJsIH0gPSBwYXJ0aWFsRnJvbVhocigpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCByZXMgPSBuZXcgSHR0cEVycm9yUmVzcG9uc2UoewogICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzOiB4aHIuc3RhdHVzIHx8IDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IHhoci5zdGF0dXNUZXh0IHx8ICdVbmtub3duIEVycm9yJywKICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB1cmwgfHwgdW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKHJlcyk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIFRoZSBzZW50SGVhZGVycyBmbGFnIHRyYWNrcyB3aGV0aGVyIHRoZSBIdHRwUmVzcG9uc2VIZWFkZXJzIGV2ZW50CiAgICAgICAgICAgICAgICAvLyBoYXMgYmVlbiBzZW50IG9uIHRoZSBzdHJlYW0uIFRoaXMgaXMgbmVjZXNzYXJ5IHRvIHRyYWNrIGlmIHByb2dyZXNzCiAgICAgICAgICAgICAgICAvLyBpcyBlbmFibGVkIHNpbmNlIHRoZSBldmVudCB3aWxsIGJlIHNlbnQgb24gb25seSB0aGUgZmlyc3QgZG93bmxvYWQKICAgICAgICAgICAgICAgIC8vIHByb2dlcnNzIGV2ZW50LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHNlbnRIZWFkZXJzID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvLyBUaGUgZG93bmxvYWQgcHJvZ3Jlc3MgZXZlbnQgaGFuZGxlciwgd2hpY2ggaXMgb25seSByZWdpc3RlcmVkIGlmCiAgICAgICAgICAgICAgICAvLyBwcm9ncmVzcyBldmVudHMgYXJlIGVuYWJsZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbkRvd25Qcm9ncmVzcyA9ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIEh0dHBSZXNwb25zZUhlYWRlcnMgZXZlbnQgaWYgaXQgaGFzbid0IGJlZW4gc2VudCBhbHJlYWR5LgogICAgICAgICAgICAgICAgICAgIGlmICghc2VudEhlYWRlcnMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChwYXJ0aWFsRnJvbVhocigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2VudEhlYWRlcnMgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBTdGFydCBidWlsZGluZyB0aGUgZG93bmxvYWQgcHJvZ3Jlc3MgZXZlbnQgdG8gZGVsaXZlciBvbiB0aGUgcmVzcG9uc2UKICAgICAgICAgICAgICAgICAgICAvLyBldmVudCBzdHJlYW0uCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBwcm9ncmVzc0V2ZW50ID0gewogICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiBIdHRwRXZlbnRUeXBlLkRvd25sb2FkUHJvZ3Jlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRlZDogZXZlbnQubG9hZGVkLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgLy8gU2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGV2ZW50IGlmIGl0J3MgYXZhaWxhYmxlLgogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRXZlbnQudG90YWwgPSBldmVudC50b3RhbDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3Qgd2FzIGZvciB0ZXh0IGNvbnRlbnQgYW5kIGEgcGFydGlhbCByZXNwb25zZSBpcwogICAgICAgICAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBvbiBYTUxIdHRwUmVxdWVzdCwgaW5jbHVkZSBpdCBpbiB0aGUgcHJvZ3Jlc3MgZXZlbnQKICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBmb3Igc3RyZWFtaW5nIHJlYWRzLgogICAgICAgICAgICAgICAgICAgIGlmIChyZXEucmVzcG9uc2VUeXBlID09PSAndGV4dCcgJiYgISF4aHIucmVzcG9uc2VUZXh0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzRXZlbnQucGFydGlhbFRleHQgPSB4aHIucmVzcG9uc2VUZXh0OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAvLyBGaW5hbGx5LCBmaXJlIHRoZSBldmVudC4KICAgICAgICAgICAgICAgICAgICBvYnNlcnZlci5uZXh0KHByb2dyZXNzRXZlbnQpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBUaGUgdXBsb2FkIHByb2dyZXNzIGV2ZW50IGhhbmRsZXIsIHdoaWNoIGlzIG9ubHkgcmVnaXN0ZXJlZCBpZgogICAgICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgZXZlbnRzIGFyZSBlbmFibGVkLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb25VcFByb2dyZXNzID0gKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gVXBsb2FkIHByb2dyZXNzIGV2ZW50cyBhcmUgc2ltcGxlci4gQmVnaW4gYnVpbGRpbmcgdGhlIHByb2dyZXNzCiAgICAgICAgICAgICAgICAgICAgLy8gZXZlbnQuCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogSHR0cEV2ZW50VHlwZS5VcGxvYWRQcm9ncmVzcywKICAgICAgICAgICAgICAgICAgICAgICAgbG9hZGVkOiBldmVudC5sb2FkZWQsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGJlaW5nIHVwbG9hZGVkIGlzIGF2YWlsYWJsZSwgaW5jbHVkZQogICAgICAgICAgICAgICAgICAgIC8vIGl0LgogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5sZW5ndGhDb21wdXRhYmxlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLnRvdGFsID0gZXZlbnQudG90YWw7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGV2ZW50LgogICAgICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQocHJvZ3Jlc3MpOwogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCByZWdpc3RlciBmb3IgbG9hZCBhbmQgZXJyb3IgZXZlbnRzLgogICAgICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2xvYWQnLCBvbkxvYWQpOwogICAgICAgICAgICAgICAgeGhyLmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgb25FcnJvcik7CiAgICAgICAgICAgICAgICAvLyBQcm9ncmVzcyBldmVudHMgYXJlIG9ubHkgZW5hYmxlZCBpZiByZXF1ZXN0ZWQuCiAgICAgICAgICAgICAgICBpZiAocmVxLnJlcG9ydFByb2dyZXNzKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gRG93bmxvYWQgcHJvZ3Jlc3MgaXMgYWx3YXlzIGVuYWJsZWQgaWYgcmVxdWVzdGVkLgogICAgICAgICAgICAgICAgICAgIHhoci5hZGRFdmVudExpc3RlbmVyKCdwcm9ncmVzcycsIG9uRG93blByb2dyZXNzKTsKICAgICAgICAgICAgICAgICAgICAvLyBVcGxvYWQgcHJvZ3Jlc3MgZGVwZW5kcyBvbiB3aGV0aGVyIHRoZXJlIGlzIGEgYm9keSB0byB1cGxvYWQuCiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcUJvZHkgIT09IG51bGwgJiYgeGhyLnVwbG9hZCkgewogICAgICAgICAgICAgICAgICAgICAgICB4aHIudXBsb2FkLmFkZEV2ZW50TGlzdGVuZXIoJ3Byb2dyZXNzJywgb25VcFByb2dyZXNzKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvLyBGaXJlIHRoZSByZXF1ZXN0LCBhbmQgbm90aWZ5IHRoZSBldmVudCBzdHJlYW0gdGhhdCBpdCB3YXMgZmlyZWQuCiAgICAgICAgICAgICAgICB4aHIuc2VuZCgoLyoqIEB0eXBlIHs/fSAqLyAocmVxQm9keSkpKTsKICAgICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoeyB0eXBlOiBIdHRwRXZlbnRUeXBlLlNlbnQgfSk7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSByZXR1cm4gZnJvbSB0aGUgT2JzZXJ2YWJsZSBmdW5jdGlvbiwgd2hpY2ggaXMgdGhlCiAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGNhbmNlbGxhdGlvbiBoYW5kbGVyLgogICAgICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBPbiBhIGNhbmNlbGxhdGlvbiwgcmVtb3ZlIGFsbCByZWdpc3RlcmVkIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgICAgICAgICAgICB4aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBvbkVycm9yKTsKICAgICAgICAgICAgICAgICAgICB4aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcignbG9hZCcsIG9uTG9hZCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJlcS5yZXBvcnRQcm9ncmVzcykgewogICAgICAgICAgICAgICAgICAgICAgICB4aHIucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBvbkRvd25Qcm9ncmVzcyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXFCb2R5ICE9PSBudWxsICYmIHhoci51cGxvYWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHhoci51cGxvYWQucmVtb3ZlRXZlbnRMaXN0ZW5lcigncHJvZ3Jlc3MnLCBvblVwUHJvZ3Jlc3MpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIC8vIEZpbmFsbHksIGFib3J0IHRoZSBpbi1mbGlnaHQgcmVxdWVzdC4KICAgICAgICAgICAgICAgICAgICB4aHIuYWJvcnQoKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgSHR0cFhockJhY2tlbmQuybVmYWMgPSBmdW5jdGlvbiBIdHRwWGhyQmFja2VuZF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIdHRwWGhyQmFja2VuZCkoybXJtWluamVjdChYaHJGYWN0b3J5KSk7IH07CiAgICBIdHRwWGhyQmFja2VuZC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIdHRwWGhyQmFja2VuZCwgZmFjdG9yeTogSHR0cFhockJhY2tlbmQuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEh0dHBYaHJCYWNrZW5kLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogWGhyRmFjdG9yeSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogcGFja2FnZXMvY29tbW9uL2h0dHAvc3JjL3hzcmYudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgWFNSRl9DT09LSUVfTkFNRSA9IG5ldyBJbmplY3Rpb25Ub2tlbignWFNSRl9DT09LSUVfTkFNRScpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgWFNSRl9IRUFERVJfTkFNRSA9IG5ldyBJbmplY3Rpb25Ub2tlbignWFNSRl9IRUFERVJfTkFNRScpOwogICAgLyoqCiAgICAgKiBSZXRyaWV2ZXMgdGhlIGN1cnJlbnQgWFNSRiB0b2tlbiB0byB1c2Ugd2l0aCB0aGUgbmV4dCBvdXRnb2luZyByZXF1ZXN0LgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgSHR0cFhzcmZUb2tlbkV4dHJhY3RvciB7CiAgICB9CiAgICAvKioKICAgICAqIGBIdHRwWHNyZlRva2VuRXh0cmFjdG9yYCB3aGljaCByZXRyaWV2ZXMgdGhlIHRva2VuIGZyb20gYSBjb29raWUuCiAgICAgKi8KICAgIGNsYXNzIEh0dHBYc3JmQ29va2llRXh0cmFjdG9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRvYwogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IGNvb2tpZU5hbWUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihkb2MsIHBsYXRmb3JtLCBjb29raWVOYW1lKSB7CiAgICAgICAgICAgIHRoaXMuZG9jID0gZG9jOwogICAgICAgICAgICB0aGlzLnBsYXRmb3JtID0gcGxhdGZvcm07CiAgICAgICAgICAgIHRoaXMuY29va2llTmFtZSA9IGNvb2tpZU5hbWU7CiAgICAgICAgICAgIHRoaXMubGFzdENvb2tpZVN0cmluZyA9ICcnOwogICAgICAgICAgICB0aGlzLmxhc3RUb2tlbiA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBcQGludGVybmFsIGZvciB0ZXN0aW5nCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnBhcnNlQ291bnQgPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFRva2VuKCkgewogICAgICAgICAgICBpZiAodGhpcy5wbGF0Zm9ybSA9PT0gJ3NlcnZlcicpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29va2llU3RyaW5nID0gdGhpcy5kb2MuY29va2llIHx8ICcnOwogICAgICAgICAgICBpZiAoY29va2llU3RyaW5nICE9PSB0aGlzLmxhc3RDb29raWVTdHJpbmcpIHsKICAgICAgICAgICAgICAgIHRoaXMucGFyc2VDb3VudCsrOwogICAgICAgICAgICAgICAgdGhpcy5sYXN0VG9rZW4gPSBwYXJzZUNvb2tpZVZhbHVlKGNvb2tpZVN0cmluZywgdGhpcy5jb29raWVOYW1lKTsKICAgICAgICAgICAgICAgIHRoaXMubGFzdENvb2tpZVN0cmluZyA9IGNvb2tpZVN0cmluZzsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5sYXN0VG9rZW47CiAgICAgICAgfQogICAgfQogICAgSHR0cFhzcmZDb29raWVFeHRyYWN0b3IuybVmYWMgPSBmdW5jdGlvbiBIdHRwWHNyZkNvb2tpZUV4dHJhY3Rvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIdHRwWHNyZkNvb2tpZUV4dHJhY3RvcikoybXJtWluamVjdChET0NVTUVOVCQxKSwgybXJtWluamVjdChQTEFURk9STV9JRCksIMm1ybVpbmplY3QoWFNSRl9DT09LSUVfTkFNRSkpOyB9OwogICAgSHR0cFhzcmZDb29raWVFeHRyYWN0b3IuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSHR0cFhzcmZDb29raWVFeHRyYWN0b3IsIGZhY3Rvcnk6IEh0dHBYc3JmQ29va2llRXh0cmFjdG9yLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBIdHRwWHNyZkNvb2tpZUV4dHJhY3Rvci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW1BMQVRGT1JNX0lELF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbWFNSRl9DT09LSUVfTkFNRSxdIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIGBIdHRwSW50ZXJjZXB0b3JgIHdoaWNoIGFkZHMgYW4gWFNSRiB0b2tlbiB0byBlbGlnaWJsZSBvdXRnb2luZyByZXF1ZXN0cy4KICAgICAqLwogICAgY2xhc3MgSHR0cFhzcmZJbnRlcmNlcHRvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2tlblNlcnZpY2UKICAgICAgICAgKiBAcGFyYW0gez99IGhlYWRlck5hbWUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0b2tlblNlcnZpY2UsIGhlYWRlck5hbWUpIHsKICAgICAgICAgICAgdGhpcy50b2tlblNlcnZpY2UgPSB0b2tlblNlcnZpY2U7CiAgICAgICAgICAgIHRoaXMuaGVhZGVyTmFtZSA9IGhlYWRlck5hbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVxCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXh0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbnRlcmNlcHQocmVxLCBuZXh0KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGNVcmwgPSByZXEudXJsLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIC8vIFNraXAgYm90aCBub24tbXV0YXRpbmcgcmVxdWVzdHMgYW5kIGFic29sdXRlIFVSTHMuCiAgICAgICAgICAgIC8vIE5vbi1tdXRhdGluZyByZXF1ZXN0cyBkb24ndCByZXF1aXJlIGEgdG9rZW4sIGFuZCBhYnNvbHV0ZSBVUkxzIHJlcXVpcmUgc3BlY2lhbCBoYW5kbGluZwogICAgICAgICAgICAvLyBhbnl3YXkgYXMgdGhlIGNvb2tpZSBzZXQKICAgICAgICAgICAgLy8gb24gb3VyIG9yaWdpbiBpcyBub3QgdGhlIHNhbWUgYXMgdGhlIHRva2VuIGV4cGVjdGVkIGJ5IGFub3RoZXIgb3JpZ2luLgogICAgICAgICAgICBpZiAocmVxLm1ldGhvZCA9PT0gJ0dFVCcgfHwgcmVxLm1ldGhvZCA9PT0gJ0hFQUQnIHx8IGxjVXJsLnN0YXJ0c1dpdGgoJ2h0dHA6Ly8nKSB8fAogICAgICAgICAgICAgICAgbGNVcmwuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuaGFuZGxlKHJlcSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMudG9rZW5TZXJ2aWNlLmdldFRva2VuKCk7CiAgICAgICAgICAgIC8vIEJlIGNhcmVmdWwgbm90IHRvIG92ZXJ3cml0ZSBhbiBleGlzdGluZyBoZWFkZXIgb2YgdGhlIHNhbWUgbmFtZS4KICAgICAgICAgICAgaWYgKHRva2VuICE9PSBudWxsICYmICFyZXEuaGVhZGVycy5oYXModGhpcy5oZWFkZXJOYW1lKSkgewogICAgICAgICAgICAgICAgcmVxID0gcmVxLmNsb25lKHsgaGVhZGVyczogcmVxLmhlYWRlcnMuc2V0KHRoaXMuaGVhZGVyTmFtZSwgdG9rZW4pIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpOwogICAgICAgIH0KICAgIH0KICAgIEh0dHBYc3JmSW50ZXJjZXB0b3IuybVmYWMgPSBmdW5jdGlvbiBIdHRwWHNyZkludGVyY2VwdG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEh0dHBYc3JmSW50ZXJjZXB0b3IpKMm1ybVpbmplY3QoSHR0cFhzcmZUb2tlbkV4dHJhY3RvciksIMm1ybVpbmplY3QoWFNSRl9IRUFERVJfTkFNRSkpOyB9OwogICAgSHR0cFhzcmZJbnRlcmNlcHRvci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIdHRwWHNyZkludGVyY2VwdG9yLCBmYWN0b3J5OiBIdHRwWHNyZkludGVyY2VwdG9yLsm1ZmFjIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBIdHRwWHNyZkludGVyY2VwdG9yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSHR0cFhzcmZUb2tlbkV4dHJhY3RvciB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtYU1JGX0hFQURFUl9OQU1FLF0gfV0gfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHBhY2thZ2VzL2NvbW1vbi9odHRwL3NyYy9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBbiBpbmplY3RhYmxlIGBIdHRwSGFuZGxlcmAgdGhhdCBhcHBsaWVzIG11bHRpcGxlIGludGVyY2VwdG9ycwogICAgICogdG8gYSByZXF1ZXN0IGJlZm9yZSBwYXNzaW5nIGl0IHRvIHRoZSBnaXZlbiBgSHR0cEJhY2tlbmRgLgogICAgICoKICAgICAqIFRoZSBpbnRlcmNlcHRvcnMgYXJlIGxvYWRlZCBsYXppbHkgZnJvbSB0aGUgaW5qZWN0b3IsIHRvIGFsbG93CiAgICAgKiBpbnRlcmNlcHRvcnMgdG8gdGhlbXNlbHZlcyBpbmplY3QgY2xhc3NlcyBkZXBlbmRpbmcgaW5kaXJlY3RseQogICAgICogb24gYEh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyYCBpdHNlbGYuCiAgICAgKiBAc2VlIGBIdHRwSW50ZXJjZXB0b3JgCiAgICAgKi8KICAgIGNsYXNzIEh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGJhY2tlbmQKICAgICAgICAgKiBAcGFyYW0gez99IGluamVjdG9yCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYmFja2VuZCwgaW5qZWN0b3IpIHsKICAgICAgICAgICAgdGhpcy5iYWNrZW5kID0gYmFja2VuZDsKICAgICAgICAgICAgdGhpcy5pbmplY3RvciA9IGluamVjdG9yOwogICAgICAgICAgICB0aGlzLmNoYWluID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZXEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhbmRsZShyZXEpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY2hhaW4gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGludGVyY2VwdG9ycyA9IHRoaXMuaW5qZWN0b3IuZ2V0KEhUVFBfSU5URVJDRVBUT1JTLCBbXSk7CiAgICAgICAgICAgICAgICB0aGlzLmNoYWluID0gaW50ZXJjZXB0b3JzLnJlZHVjZVJpZ2h0KCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmV4dAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbnRlcmNlcHRvcgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKG5leHQsIGludGVyY2VwdG9yKSA9PiBuZXcgSHR0cEludGVyY2VwdG9ySGFuZGxlcihuZXh0LCBpbnRlcmNlcHRvcikpLCB0aGlzLmJhY2tlbmQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNoYWluLmhhbmRsZShyZXEpOwogICAgICAgIH0KICAgIH0KICAgIEh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyLsm1ZmFjID0gZnVuY3Rpb24gSHR0cEludGVyY2VwdGluZ0hhbmRsZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cEludGVyY2VwdGluZ0hhbmRsZXIpKMm1ybVpbmplY3QoSHR0cEJhY2tlbmQpLCDJtcm1aW5qZWN0KEluamVjdG9yKSk7IH07CiAgICBIdHRwSW50ZXJjZXB0aW5nSGFuZGxlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBIdHRwSW50ZXJjZXB0aW5nSGFuZGxlciwgZmFjdG9yeTogSHR0cEludGVyY2VwdGluZ0hhbmRsZXIuybVmYWMgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEh0dHBJbnRlcmNlcHRpbmdIYW5kbGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSHR0cEJhY2tlbmQgfSwKICAgICAgICB7IHR5cGU6IEluamVjdG9yIH0KICAgIF07CiAgICAvKioKICAgICAqIEZhY3RvcnkgZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXJlIHRvIHN0b3JlIEpTT05QIGNhbGxiYWNrcy4KICAgICAqCiAgICAgKiBPcmRpbmFyaWx5IEpTT05QIGNhbGxiYWNrcyBhcmUgc3RvcmVkIG9uIHRoZSBgd2luZG93YCBvYmplY3QsIGJ1dCB0aGlzIG1heSBub3QgZXhpc3QKICAgICAqIGluIHRlc3QgZW52aXJvbm1lbnRzLiBJbiB0aGF0IGNhc2UsIGNhbGxiYWNrcyBhcmUgc3RvcmVkIG9uIGFuIGFub255bW91cyBvYmplY3QgaW5zdGVhZC4KICAgICAqCiAgICAgKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24ganNvbnBDYWxsYmFja0NvbnRleHQoKSB7CiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICdvYmplY3QnKSB7CiAgICAgICAgICAgIHJldHVybiB3aW5kb3c7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7fTsKICAgIH0KICAgIC8qKgogICAgICogQ29uZmlndXJlcyBYU1JGIHByb3RlY3Rpb24gc3VwcG9ydCBmb3Igb3V0Z29pbmcgcmVxdWVzdHMuCiAgICAgKgogICAgICogRm9yIGEgc2VydmVyIHRoYXQgc3VwcG9ydHMgYSBjb29raWUtYmFzZWQgWFNSRiBwcm90ZWN0aW9uIHN5c3RlbSwKICAgICAqIHVzZSBkaXJlY3RseSB0byBjb25maWd1cmUgWFNSRiBwcm90ZWN0aW9uIHdpdGggdGhlIGNvcnJlY3QKICAgICAqIGNvb2tpZSBhbmQgaGVhZGVyIG5hbWVzLgogICAgICoKICAgICAqIElmIG5vIG5hbWVzIGFyZSBzdXBwbGllZCwgdGhlIGRlZmF1bHQgY29va2llIG5hbWUgaXMgYFhTUkYtVE9LRU5gCiAgICAgKiBhbmQgdGhlIGRlZmF1bHQgaGVhZGVyIG5hbWUgaXMgYFgtWFNSRi1UT0tFTmAuCiAgICAgKgogICAgICogXEBwdWJsaWNBcGkKICAgICAqLwogICAgY2xhc3MgSHR0cENsaWVudFhzcmZNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIERpc2FibGUgdGhlIGRlZmF1bHQgWFNSRiBwcm90ZWN0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGRpc2FibGUoKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBuZ01vZHVsZTogSHR0cENsaWVudFhzcmZNb2R1bGUsCiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IEh0dHBYc3JmSW50ZXJjZXB0b3IsIHVzZUNsYXNzOiBOb29wSW50ZXJjZXB0b3IgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbmZpZ3VyZSBYU1JGIHByb3RlY3Rpb24uCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucyBBbiBvYmplY3QgdGhhdCBjYW4gc3BlY2lmeSBlaXRoZXIgb3IgYm90aAogICAgICAgICAqIGNvb2tpZSBuYW1lIG9yIGhlYWRlciBuYW1lLgogICAgICAgICAqIC0gQ29va2llIG5hbWUgZGVmYXVsdCBpcyBgWFNSRi1UT0tFTmAuCiAgICAgICAgICogLSBIZWFkZXIgbmFtZSBkZWZhdWx0IGlzIGBYLVhTUkYtVE9LRU5gLgogICAgICAgICAqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdGF0aWMgd2l0aE9wdGlvbnMob3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBuZ01vZHVsZTogSHR0cENsaWVudFhzcmZNb2R1bGUsCiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmNvb2tpZU5hbWUgPyB7IHByb3ZpZGU6IFhTUkZfQ09PS0lFX05BTUUsIHVzZVZhbHVlOiBvcHRpb25zLmNvb2tpZU5hbWUgfSA6IFtdLAogICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaGVhZGVyTmFtZSA/IHsgcHJvdmlkZTogWFNSRl9IRUFERVJfTkFNRSwgdXNlVmFsdWU6IG9wdGlvbnMuaGVhZGVyTmFtZSB9IDogW10sCiAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIEh0dHBDbGllbnRYc3JmTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogSHR0cENsaWVudFhzcmZNb2R1bGUgfSk7CiAgICBIdHRwQ2xpZW50WHNyZk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEh0dHBDbGllbnRYc3JmTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEh0dHBDbGllbnRYc3JmTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgSHR0cFhzcmZJbnRlcmNlcHRvciwKICAgICAgICAgICAgeyBwcm92aWRlOiBIVFRQX0lOVEVSQ0VQVE9SUywgdXNlRXhpc3Rpbmc6IEh0dHBYc3JmSW50ZXJjZXB0b3IsIG11bHRpOiB0cnVlIH0sCiAgICAgICAgICAgIHsgcHJvdmlkZTogSHR0cFhzcmZUb2tlbkV4dHJhY3RvciwgdXNlQ2xhc3M6IEh0dHBYc3JmQ29va2llRXh0cmFjdG9yIH0sCiAgICAgICAgICAgIHsgcHJvdmlkZTogWFNSRl9DT09LSUVfTkFNRSwgdXNlVmFsdWU6ICdYU1JGLVRPS0VOJyB9LAogICAgICAgICAgICB7IHByb3ZpZGU6IFhTUkZfSEVBREVSX05BTUUsIHVzZVZhbHVlOiAnWC1YU1JGLVRPS0VOJyB9LAogICAgICAgIF0gfSk7CiAgICAvKioKICAgICAqIENvbmZpZ3VyZXMgdGhlIFtkZXBlbmRlbmN5IGluamVjdG9yXShndWlkZS9nbG9zc2FyeSNpbmplY3RvcikgZm9yIGBIdHRwQ2xpZW50YAogICAgICogd2l0aCBzdXBwb3J0aW5nIHNlcnZpY2VzIGZvciBYU1JGLiBBdXRvbWF0aWNhbGx5IGltcG9ydGVkIGJ5IGBIdHRwQ2xpZW50TW9kdWxlYC4KICAgICAqCiAgICAgKiBZb3UgY2FuIGFkZCBpbnRlcmNlcHRvcnMgdG8gdGhlIGNoYWluIGJlaGluZCBgSHR0cENsaWVudGAgYnkgYmluZGluZyB0aGVtIHRvIHRoZQogICAgICogbXVsdGlwcm92aWRlciBmb3IgYnVpbHQtaW4gW0RJIHRva2VuXShndWlkZS9nbG9zc2FyeSNkaS10b2tlbikgYEhUVFBfSU5URVJDRVBUT1JTYC4KICAgICAqCiAgICAgKiBcQHB1YmxpY0FwaQogICAgICovCiAgICBjbGFzcyBIdHRwQ2xpZW50TW9kdWxlIHsKICAgIH0KICAgIEh0dHBDbGllbnRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIdHRwQ2xpZW50TW9kdWxlIH0pOwogICAgSHR0cENsaWVudE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEh0dHBDbGllbnRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cENsaWVudE1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgIEh0dHBDbGllbnQsCiAgICAgICAgICAgIHsgcHJvdmlkZTogSHR0cEhhbmRsZXIsIHVzZUNsYXNzOiBIdHRwSW50ZXJjZXB0aW5nSGFuZGxlciB9LAogICAgICAgICAgICBIdHRwWGhyQmFja2VuZCwKICAgICAgICAgICAgeyBwcm92aWRlOiBIdHRwQmFja2VuZCwgdXNlRXhpc3Rpbmc6IEh0dHBYaHJCYWNrZW5kIH0sCiAgICAgICAgICAgIEJyb3dzZXJYaHIsCiAgICAgICAgICAgIHsgcHJvdmlkZTogWGhyRmFjdG9yeSwgdXNlRXhpc3Rpbmc6IEJyb3dzZXJYaHIgfSwKICAgICAgICBdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgSHR0cENsaWVudFhzcmZNb2R1bGUud2l0aE9wdGlvbnMoewogICAgICAgICAgICAgICAgICAgIGNvb2tpZU5hbWU6ICdYU1JGLVRPS0VOJywKICAgICAgICAgICAgICAgICAgICBoZWFkZXJOYW1lOiAnWC1YU1JGLVRPS0VOJwogICAgICAgICAgICAgICAgfSksCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoSHR0cENsaWVudE1vZHVsZSwgeyBpbXBvcnRzOiBbSHR0cENsaWVudFhzcmZNb2R1bGVdIH0pOyB9KSgpOwogICAgLyoqCiAgICAgKiBDb25maWd1cmVzIHRoZSBbZGVwZW5kZW5jeSBpbmplY3Rvcl0oZ3VpZGUvZ2xvc3NhcnkjaW5qZWN0b3IpIGZvciBgSHR0cENsaWVudGAKICAgICAqIHdpdGggc3VwcG9ydGluZyBzZXJ2aWNlcyBmb3IgSlNPTlAuCiAgICAgKiBXaXRob3V0IHRoaXMgbW9kdWxlLCBKc29ucCByZXF1ZXN0cyByZWFjaCB0aGUgYmFja2VuZAogICAgICogd2l0aCBtZXRob2QgSlNPTlAsIHdoZXJlIHRoZXkgYXJlIHJlamVjdGVkLgogICAgICoKICAgICAqIFlvdSBjYW4gYWRkIGludGVyY2VwdG9ycyB0byB0aGUgY2hhaW4gYmVoaW5kIGBIdHRwQ2xpZW50YCBieSBiaW5kaW5nIHRoZW0gdG8gdGhlCiAgICAgKiBtdWx0aXByb3ZpZGVyIGZvciBidWlsdC1pbiBbREkgdG9rZW5dKGd1aWRlL2dsb3NzYXJ5I2RpLXRva2VuKSBgSFRUUF9JTlRFUkNFUFRPUlNgLgogICAgICoKICAgICAqIFxAcHVibGljQXBpCiAgICAgKi8KICAgIGNsYXNzIEh0dHBDbGllbnRKc29ucE1vZHVsZSB7CiAgICB9CiAgICBIdHRwQ2xpZW50SnNvbnBNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIdHRwQ2xpZW50SnNvbnBNb2R1bGUgfSk7CiAgICBIdHRwQ2xpZW50SnNvbnBNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBIdHRwQ2xpZW50SnNvbnBNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSHR0cENsaWVudEpzb25wTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgSnNvbnBDbGllbnRCYWNrZW5kLAogICAgICAgICAgICB7IHByb3ZpZGU6IEpzb25wQ2FsbGJhY2tDb250ZXh0LCB1c2VGYWN0b3J5OiBqc29ucENhbGxiYWNrQ29udGV4dCB9LAogICAgICAgICAgICB7IHByb3ZpZGU6IEhUVFBfSU5URVJDRVBUT1JTLCB1c2VDbGFzczogSnNvbnBJbnRlcmNlcHRvciwgbXVsdGk6IHRydWUgfSwKICAgICAgICBdIH0pOwoKICAgIGNvbnN0IF9jMCQ3ID0gWyIqIl07CiAgICBmdW5jdGlvbiBnZXRNYXRJY29uTmFtZU5vdEZvdW5kRXJyb3IoaWNvbk5hbWUpIHsKICAgICAgICByZXR1cm4gRXJyb3IoYFVuYWJsZSB0byBmaW5kIGljb24gd2l0aCB0aGUgbmFtZSAiJHtpY29uTmFtZX0iYCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuIHRoZSBjb25zdW1lciBhdHRlbXB0cyB0byB1c2UKICAgICAqIGA8bWF0LWljb24+YCB3aXRob3V0IGluY2x1ZGluZyBcQGFuZ3VsYXIvY29tbW9uL2h0dHAuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0SWNvbk5vSHR0cFByb3ZpZGVyRXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKCdDb3VsZCBub3QgZmluZCBIdHRwQ2xpZW50IHByb3ZpZGVyIGZvciB1c2Ugd2l0aCBBbmd1bGFyIE1hdGVyaWFsIGljb25zLiAnICsKICAgICAgICAgICAgJ1BsZWFzZSBpbmNsdWRlIHRoZSBIdHRwQ2xpZW50TW9kdWxlIGZyb20gQGFuZ3VsYXIvY29tbW9uL2h0dHAgaW4geW91ciAnICsKICAgICAgICAgICAgJ2FwcCBpbXBvcnRzLicpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhIFVSTCBjb3VsZG4ndCBiZSBzYW5pdGl6ZWQuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSB1cmwgVVJMIHRoYXQgd2FzIGF0dGVtcHRlZCB0byBiZSBzYW5pdGl6ZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRNYXRJY29uRmFpbGVkVG9TYW5pdGl6ZVVybEVycm9yKHVybCkgewogICAgICAgIHJldHVybiBFcnJvcihgVGhlIFVSTCBwcm92aWRlZCB0byBNYXRJY29uUmVnaXN0cnkgd2FzIG5vdCB0cnVzdGVkIGFzIGEgcmVzb3VyY2UgVVJMIGAgKwogICAgICAgICAgICBgdmlhIEFuZ3VsYXIncyBEb21TYW5pdGl6ZXIuIEF0dGVtcHRlZCBVUkwgd2FzICIke3VybH0iLmApOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24gd2hlbiBhIEhUTUwgc3RyaW5nIGNvdWxkbid0IGJlIHNhbml0aXplZC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGxpdGVyYWwgSFRNTCB0aGF0IHdhcyBhdHRlbXB0ZWQgdG8gYmUgc2FuaXRpemVkLgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0SWNvbkZhaWxlZFRvU2FuaXRpemVMaXRlcmFsRXJyb3IobGl0ZXJhbCkgewogICAgICAgIHJldHVybiBFcnJvcihgVGhlIGxpdGVyYWwgcHJvdmlkZWQgdG8gTWF0SWNvblJlZ2lzdHJ5IHdhcyBub3QgdHJ1c3RlZCBhcyBzYWZlIEhUTUwgYnkgYCArCiAgICAgICAgICAgIGBBbmd1bGFyJ3MgRG9tU2FuaXRpemVyLiBBdHRlbXB0ZWQgbGl0ZXJhbCB3YXMgIiR7bGl0ZXJhbH0iLmApOwogICAgfQogICAgLyoqCiAgICAgKiBDb25maWd1cmF0aW9uIGZvciBhbiBpY29uLCBpbmNsdWRpbmcgdGhlIFVSTCBhbmQgcG9zc2libHkgdGhlIGNhY2hlZCBTVkcgZWxlbWVudC4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIFN2Z0ljb25Db25maWcgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihkYXRhLCBvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IG9wdGlvbnM7CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYGluc3RhbmNlb2YgU1ZHRWxlbWVudGAgaGVyZSwKICAgICAgICAgICAgLy8gYmVjYXVzZSBpdCdsbCBicmVhayBkdXJpbmcgc2VydmVyLXNpZGUgcmVuZGVyaW5nLgogICAgICAgICAgICBpZiAoISEoKC8qKiBAdHlwZSB7P30gKi8gKGRhdGEpKSkubm9kZU5hbWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3ZnRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChkYXRhKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnVybCA9ICgvKiogQHR5cGUgez99ICovIChkYXRhKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIFNlcnZpY2UgdG8gcmVnaXN0ZXIgYW5kIGRpc3BsYXkgaWNvbnMgdXNlZCBieSB0aGUgYDxtYXQtaWNvbj5gIGNvbXBvbmVudC4KICAgICAqIC0gUmVnaXN0ZXJzIGljb24gVVJMcyBieSBuYW1lc3BhY2UgYW5kIG5hbWUuCiAgICAgKiAtIFJlZ2lzdGVycyBpY29uIHNldCBVUkxzIGJ5IG5hbWVzcGFjZS4KICAgICAqIC0gUmVnaXN0ZXJzIGFsaWFzZXMgZm9yIENTUyBjbGFzc2VzLCBmb3IgdXNlIHdpdGggaWNvbiBmb250cy4KICAgICAqIC0gTG9hZHMgaWNvbnMgZnJvbSBVUkxzIGFuZCBleHRyYWN0cyBpbmRpdmlkdWFsIGljb25zIGZyb20gaWNvbiBzZXRzLgogICAgICovCiAgICBjbGFzcyBNYXRJY29uUmVnaXN0cnkgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2h0dHBDbGllbnQKICAgICAgICAgKiBAcGFyYW0gez99IF9zYW5pdGl6ZXIKICAgICAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/PX0gX2Vycm9ySGFuZGxlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9odHRwQ2xpZW50LCBfc2FuaXRpemVyLCBkb2N1bWVudCwgX2Vycm9ySGFuZGxlcikgewogICAgICAgICAgICB0aGlzLl9odHRwQ2xpZW50ID0gX2h0dHBDbGllbnQ7CiAgICAgICAgICAgIHRoaXMuX3Nhbml0aXplciA9IF9zYW5pdGl6ZXI7CiAgICAgICAgICAgIHRoaXMuX2Vycm9ySGFuZGxlciA9IF9lcnJvckhhbmRsZXI7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBVUkxzIGFuZCBjYWNoZWQgU1ZHIGVsZW1lbnRzIGZvciBpbmRpdmlkdWFsIGljb25zLiBLZXlzIGFyZSBvZiB0aGUgZm9ybWF0ICJbbmFtZXNwYWNlXTpbaWNvbl0iLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc3ZnSWNvbkNvbmZpZ3MgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdmdJY29uQ29uZmlnIG9iamVjdHMgYW5kIGNhY2hlZCBTVkcgZWxlbWVudHMgZm9yIGljb24gc2V0cywga2V5ZWQgYnkgbmFtZXNwYWNlLgogICAgICAgICAgICAgKiBNdWx0aXBsZSBpY29uIHNldHMgY2FuIGJlIHJlZ2lzdGVyZWQgdW5kZXIgdGhlIHNhbWUgbmFtZXNwYWNlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faWNvblNldENvbmZpZ3MgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWNoZSBmb3IgaWNvbnMgbG9hZGVkIGJ5IGRpcmVjdCBVUkxzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY2FjaGVkSWNvbnNCeVVybCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEluLXByb2dyZXNzIGljb24gZmV0Y2hlcy4gVXNlZCB0byBjb2FsZXNjZSBtdWx0aXBsZSByZXF1ZXN0cyB0byB0aGUgc2FtZSBVUkwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9pblByb2dyZXNzVXJsRmV0Y2hlcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1hcCBmcm9tIGZvbnQgaWRlbnRpZmllcnMgdG8gdGhlaXIgQ1NTIGNsYXNzIG5hbWVzLiBVc2VkIGZvciBpY29uIGZvbnRzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZm9udENzc0NsYXNzZXNCeUFsaWFzID0gbmV3IE1hcCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIENTUyBjbGFzcyB0byBhcHBseSB3aGVuIGFuIGA8bWF0LWljb24+YCBjb21wb25lbnQgaGFzIG5vIGljb24gbmFtZSwgdXJsLCBvciBmb250IHNwZWNpZmllZC4KICAgICAgICAgICAgICogVGhlIGRlZmF1bHQgJ21hdGVyaWFsLWljb25zJyB2YWx1ZSBhc3N1bWVzIHRoYXQgdGhlIG1hdGVyaWFsIGljb24gZm9udCBoYXMgYmVlbiBsb2FkZWQgYXMKICAgICAgICAgICAgICogZGVzY3JpYmVkIGF0IGh0dHA6Ly9nb29nbGUuZ2l0aHViLmlvL21hdGVyaWFsLWRlc2lnbi1pY29ucy8jaWNvbi1mb250LWZvci10aGUtd2ViCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzID0gJ21hdGVyaWFsLWljb25zJzsKICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBkb2N1bWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGljb24gYnkgVVJMIGluIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gaWNvbk5hbWUgTmFtZSB1bmRlciB3aGljaCB0aGUgaWNvbiBzaG91bGQgYmUgcmVnaXN0ZXJlZC4KICAgICAgICAgKiBAcGFyYW0gez99IHVybAogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIGFkZFN2Z0ljb24oaWNvbk5hbWUsIHVybCwgb3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5hZGRTdmdJY29uSW5OYW1lc3BhY2UoJycsIGljb25OYW1lLCB1cmwsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaWNvbiB1c2luZyBhbiBIVE1MIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IGljb25OYW1lIE5hbWUgdW5kZXIgd2hpY2ggdGhlIGljb24gc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBsaXRlcmFsIFNWRyBzb3VyY2Ugb2YgdGhlIGljb24uCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgYWRkU3ZnSWNvbkxpdGVyYWwoaWNvbk5hbWUsIGxpdGVyYWwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuYWRkU3ZnSWNvbkxpdGVyYWxJbk5hbWVzcGFjZSgnJywgaWNvbk5hbWUsIGxpdGVyYWwsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaWNvbiBieSBVUkwgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW4gd2hpY2ggdGhlIGljb24gc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBpY29uTmFtZSBOYW1lIHVuZGVyIHdoaWNoIHRoZSBpY29uIHNob3VsZCBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7P30gdXJsCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgYWRkU3ZnSWNvbkluTmFtZXNwYWNlKG5hbWVzcGFjZSwgaWNvbk5hbWUsIHVybCwgb3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fYWRkU3ZnSWNvbkNvbmZpZyhuYW1lc3BhY2UsIGljb25OYW1lLCBuZXcgU3ZnSWNvbkNvbmZpZyh1cmwsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGljb24gdXNpbmcgYW4gSFRNTCBzdHJpbmcgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW4gd2hpY2ggdGhlIGljb24gc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBpY29uTmFtZSBOYW1lIHVuZGVyIHdoaWNoIHRoZSBpY29uIHNob3VsZCBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEBwYXJhbSB7P30gbGl0ZXJhbCBTVkcgc291cmNlIG9mIHRoZSBpY29uLgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIGFkZFN2Z0ljb25MaXRlcmFsSW5OYW1lc3BhY2UobmFtZXNwYWNlLCBpY29uTmFtZSwgbGl0ZXJhbCwgb3B0aW9ucykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNhbml0aXplZExpdGVyYWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LkhUTUwsIGxpdGVyYWwpOwogICAgICAgICAgICBpZiAoIXNhbml0aXplZExpdGVyYWwpIHsKICAgICAgICAgICAgICAgIHRocm93IGdldE1hdEljb25GYWlsZWRUb1Nhbml0aXplTGl0ZXJhbEVycm9yKGxpdGVyYWwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3ZnRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2NyZWF0ZVN2Z0VsZW1lbnRGb3JTaW5nbGVJY29uKHNhbml0aXplZExpdGVyYWwsIG9wdGlvbnMpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fYWRkU3ZnSWNvbkNvbmZpZyhuYW1lc3BhY2UsIGljb25OYW1lLCBuZXcgU3ZnSWNvbkNvbmZpZyhzdmdFbGVtZW50LCBvcHRpb25zKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHNldCBieSBVUkwgaW4gdGhlIGRlZmF1bHQgbmFtZXNwYWNlLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBhZGRTdmdJY29uU2V0KHVybCwgb3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5hZGRTdmdJY29uU2V0SW5OYW1lc3BhY2UoJycsIHVybCwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhbiBpY29uIHNldCB1c2luZyBhbiBIVE1MIHN0cmluZyBpbiB0aGUgZGVmYXVsdCBuYW1lc3BhY2UuCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IGxpdGVyYWwgU1ZHIHNvdXJjZSBvZiB0aGUgaWNvbiBzZXQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgYWRkU3ZnSWNvblNldExpdGVyYWwobGl0ZXJhbCwgb3B0aW9ucykgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5hZGRTdmdJY29uU2V0TGl0ZXJhbEluTmFtZXNwYWNlKCcnLCBsaXRlcmFsLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGljb24gc2V0IGJ5IFVSTCBpbiB0aGUgc3BlY2lmaWVkIG5hbWVzcGFjZS4KICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbiB3aGljaCB0byByZWdpc3RlciB0aGUgaWNvbiBzZXQuCiAgICAgICAgICogQHBhcmFtIHs/fSB1cmwKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBhZGRTdmdJY29uU2V0SW5OYW1lc3BhY2UobmFtZXNwYWNlLCB1cmwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FkZFN2Z0ljb25TZXRDb25maWcobmFtZXNwYWNlLCBuZXcgU3ZnSWNvbkNvbmZpZyh1cmwsIG9wdGlvbnMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGljb24gc2V0IHVzaW5nIGFuIEhUTUwgc3RyaW5nIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBpY29uIHNldC4KICAgICAgICAgKiBAcGFyYW0gez99IGxpdGVyYWwgU1ZHIHNvdXJjZSBvZiB0aGUgaWNvbiBzZXQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgYWRkU3ZnSWNvblNldExpdGVyYWxJbk5hbWVzcGFjZShuYW1lc3BhY2UsIGxpdGVyYWwsIG9wdGlvbnMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzYW5pdGl6ZWRMaXRlcmFsID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5IVE1MLCBsaXRlcmFsKTsKICAgICAgICAgICAgaWYgKCFzYW5pdGl6ZWRMaXRlcmFsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRJY29uRmFpbGVkVG9TYW5pdGl6ZUxpdGVyYWxFcnJvcihsaXRlcmFsKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN2Z0VsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9zdmdFbGVtZW50RnJvbVN0cmluZyhzYW5pdGl6ZWRMaXRlcmFsKTsKICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2FkZFN2Z0ljb25TZXRDb25maWcobmFtZXNwYWNlLCBuZXcgU3ZnSWNvbkNvbmZpZyhzdmdFbGVtZW50LCBvcHRpb25zKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERlZmluZXMgYW4gYWxpYXMgZm9yIGEgQ1NTIGNsYXNzIG5hbWUgdG8gYmUgdXNlZCBmb3IgaWNvbiBmb250cy4gQ3JlYXRpbmcgYW4gbWF0SWNvbgogICAgICAgICAqIGNvbXBvbmVudCB3aXRoIHRoZSBhbGlhcyBhcyB0aGUgZm9udFNldCBpbnB1dCB3aWxsIGNhdXNlIHRoZSBjbGFzcyBuYW1lIHRvIGJlIGFwcGxpZWQKICAgICAgICAgKiB0byB0aGUgYDxtYXQtaWNvbj5gIGVsZW1lbnQuCiAgICAgICAgICoKICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gYWxpYXMgQWxpYXMgZm9yIHRoZSBmb250LgogICAgICAgICAqIEBwYXJhbSB7Pz19IGNsYXNzTmFtZSBDbGFzcyBuYW1lIG92ZXJyaWRlIHRvIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgYWxpYXMuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICByZWdpc3RlckZvbnRDbGFzc0FsaWFzKGFsaWFzLCBjbGFzc05hbWUgPSBhbGlhcykgewogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9mb250Q3NzQ2xhc3Nlc0J5QWxpYXMuc2V0KGFsaWFzLCBjbGFzc05hbWUpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgQ1NTIGNsYXNzIG5hbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBhbGlhcyBieSBhIHByZXZpb3VzIGNhbGwgdG8KICAgICAgICAgKiByZWdpc3RlckZvbnRDbGFzc0FsaWFzLiBJZiBubyBDU1MgY2xhc3MgaGFzIGJlZW4gYXNzb2NpYXRlZCwgcmV0dXJucyB0aGUgYWxpYXMgdW5tb2RpZmllZC4KICAgICAgICAgKiBAcGFyYW0gez99IGFsaWFzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbGFzc05hbWVGb3JGb250QWxpYXMoYWxpYXMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZvbnRDc3NDbGFzc2VzQnlBbGlhcy5nZXQoYWxpYXMpIHx8IGFsaWFzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSB1c2VkIGZvciBpY29uIGZvbnRzIHdoZW4gYW4gYDxtYXQtaWNvbj5gIGNvbXBvbmVudCBkb2VzIG5vdAogICAgICAgICAqIGhhdmUgYSBmb250U2V0IGlucHV0IHZhbHVlLCBhbmQgaXMgbm90IGxvYWRpbmcgYW4gaWNvbiBieSBuYW1lIG9yIFVSTC4KICAgICAgICAgKgogICAgICAgICAqIEB0ZW1wbGF0ZSBUSElTCiAgICAgICAgICogQHRoaXMge1RISVN9CiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWUKICAgICAgICAgKiBAcmV0dXJuIHtUSElTfQogICAgICAgICAqLwogICAgICAgIHNldERlZmF1bHRGb250U2V0Q2xhc3MoY2xhc3NOYW1lKSB7CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2RlZmF1bHRGb250U2V0Q2xhc3MgPSBjbGFzc05hbWU7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBDU1MgY2xhc3MgbmFtZSB0byBiZSB1c2VkIGZvciBpY29uIGZvbnRzIHdoZW4gYW4gYDxtYXQtaWNvbj5gIGNvbXBvbmVudCBkb2VzIG5vdAogICAgICAgICAqIGhhdmUgYSBmb250U2V0IGlucHV0IHZhbHVlLCBhbmQgaXMgbm90IGxvYWRpbmcgYW4gaWNvbiBieSBuYW1lIG9yIFVSTC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldERlZmF1bHRGb250U2V0Q2xhc3MoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kZWZhdWx0Rm9udFNldENsYXNzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgdGhhdCBwcm9kdWNlcyB0aGUgaWNvbiAoYXMgYW4gYDxzdmc+YCBET00gZWxlbWVudCkgZnJvbSB0aGUgZ2l2ZW4gVVJMLgogICAgICAgICAqIFRoZSByZXNwb25zZSBmcm9tIHRoZSBVUkwgbWF5IGJlIGNhY2hlZCBzbyB0aGlzIHdpbGwgbm90IGFsd2F5cyBjYXVzZSBhbiBIVFRQIHJlcXVlc3QsIGJ1dAogICAgICAgICAqIHRoZSBwcm9kdWNlZCBlbGVtZW50IHdpbGwgYWx3YXlzIGJlIGEgbmV3IGNvcHkgb2YgdGhlIG9yaWdpbmFsbHkgZmV0Y2hlZCBpY29uLiAoVGhhdCBpcywKICAgICAgICAgKiBpdCB3aWxsIG5vdCBjb250YWluIGFueSBtb2RpZmljYXRpb25zIG1hZGUgdG8gZWxlbWVudHMgcHJldmlvdXNseSByZXR1cm5lZCkuCiAgICAgICAgICoKICAgICAgICAgKiBAcGFyYW0gez99IHNhZmVVcmwgVVJMIGZyb20gd2hpY2ggdG8gZmV0Y2ggdGhlIFNWRyBpY29uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0U3ZnSWNvbkZyb21Vcmwoc2FmZVVybCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVybCA9IHRoaXMuX3Nhbml0aXplci5zYW5pdGl6ZShTZWN1cml0eUNvbnRleHQuUkVTT1VSQ0VfVVJMLCBzYWZlVXJsKTsKICAgICAgICAgICAgaWYgKCF1cmwpIHsKICAgICAgICAgICAgICAgIHRocm93IGdldE1hdEljb25GYWlsZWRUb1Nhbml0aXplVXJsRXJyb3Ioc2FmZVVybCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYWNoZWRJY29uID0gdGhpcy5fY2FjaGVkSWNvbnNCeVVybC5nZXQodXJsKTsKICAgICAgICAgICAgaWYgKGNhY2hlZEljb24pIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZihjbG9uZVN2ZyhjYWNoZWRJY29uKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRTdmdJY29uRnJvbUNvbmZpZyhuZXcgU3ZnSWNvbkNvbmZpZyhzYWZlVXJsKSkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN2ZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3ZnID0+IHRoaXMuX2NhY2hlZEljb25zQnlVcmwuc2V0KCgvKiogQHR5cGUgez99ICovICh1cmwpKSwgc3ZnKSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN2ZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3ZnID0+IGNsb25lU3ZnKHN2ZykpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB0aGF0IHByb2R1Y2VzIHRoZSBpY29uIChhcyBhbiBgPHN2Zz5gIERPTSBlbGVtZW50KSB3aXRoIHRoZSBnaXZlbiBuYW1lCiAgICAgICAgICogYW5kIG5hbWVzcGFjZS4gVGhlIGljb24gbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSByZWdpc3RlcmVkIHdpdGggYWRkSWNvbiBvciBhZGRJY29uU2V0OwogICAgICAgICAqIGlmIG5vdCwgdGhlIE9ic2VydmFibGUgd2lsbCB0aHJvdyBhbiBlcnJvci4KICAgICAgICAgKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZSBOYW1lIG9mIHRoZSBpY29uIHRvIGJlIHJldHJpZXZlZC4KICAgICAgICAgKiBAcGFyYW0gez89fSBuYW1lc3BhY2UgTmFtZXNwYWNlIGluIHdoaWNoIHRvIGxvb2sgZm9yIHRoZSBpY29uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TmFtZWRTdmdJY29uKG5hbWUsIG5hbWVzcGFjZSA9ICcnKSB7CiAgICAgICAgICAgIC8vIFJldHVybiAoY29weSBvZikgY2FjaGVkIGljb24gaWYgcG9zc2libGUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5ID0gaWNvbktleShuYW1lc3BhY2UsIG5hbWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX3N2Z0ljb25Db25maWdzLmdldChrZXkpOwogICAgICAgICAgICBpZiAoY29uZmlnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0U3ZnRnJvbUNvbmZpZyhjb25maWcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNlZSBpZiB3ZSBoYXZlIGFueSBpY29uIHNldHMgcmVnaXN0ZXJlZCBmb3IgdGhlIG5hbWVzcGFjZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpY29uU2V0Q29uZmlncyA9IHRoaXMuX2ljb25TZXRDb25maWdzLmdldChuYW1lc3BhY2UpOwogICAgICAgICAgICBpZiAoaWNvblNldENvbmZpZ3MpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9nZXRTdmdGcm9tSWNvblNldENvbmZpZ3MobmFtZSwgaWNvblNldENvbmZpZ3MpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGdldE1hdEljb25OYW1lTm90Rm91bmRFcnJvcihrZXkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fc3ZnSWNvbkNvbmZpZ3MuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5faWNvblNldENvbmZpZ3MuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5fY2FjaGVkSWNvbnNCeVVybC5jbGVhcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgaWNvbiBmb3IgYSBTdmdJY29uQ29uZmlnIGlmIGF2YWlsYWJsZSwgb3IgZmV0Y2hlcyBpdCBmcm9tIGl0cyBVUkwgaWYgbm90LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRTdmdGcm9tQ29uZmlnKGNvbmZpZykgewogICAgICAgICAgICBpZiAoY29uZmlnLnN2Z0VsZW1lbnQpIHsKICAgICAgICAgICAgICAgIC8vIFdlIGFscmVhZHkgaGF2ZSB0aGUgU1ZHIGVsZW1lbnQgZm9yIHRoaXMgaWNvbiwgcmV0dXJuIGEgY29weS4KICAgICAgICAgICAgICAgIHJldHVybiBvZihjbG9uZVN2Zyhjb25maWcuc3ZnRWxlbWVudCkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gRmV0Y2ggdGhlIGljb24gZnJvbSB0aGUgY29uZmlnJ3MgVVJMLCBjYWNoZSBpdCwgYW5kIHJldHVybiBhIGNvcHkuCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKGNvbmZpZykucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHN2ZyA9PiBjb25maWcuc3ZnRWxlbWVudCA9IHN2ZykpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHN2ZyA9PiBjbG9uZVN2ZyhzdmcpKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGVtcHRzIHRvIGZpbmQgYW4gaWNvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiBhbnkgb2YgdGhlIFNWRyBpY29uIHNldHMuCiAgICAgICAgICogRmlyc3Qgc2VhcmNoZXMgdGhlIGF2YWlsYWJsZSBjYWNoZWQgaWNvbnMgZm9yIGEgbmVzdGVkIGVsZW1lbnQgd2l0aCBhIG1hdGNoaW5nIG5hbWUsIGFuZAogICAgICAgICAqIGlmIGZvdW5kIGNvcGllcyB0aGUgZWxlbWVudCB0byBhIG5ldyBgPHN2Zz5gIGVsZW1lbnQuIElmIG5vdCBmb3VuZCwgZmV0Y2hlcyBhbGwgaWNvbiBzZXRzCiAgICAgICAgICogdGhhdCBoYXZlIG5vdCBiZWVuIGNhY2hlZCwgYW5kIHNlYXJjaGVzIGFnYWluIGFmdGVyIGFsbCBmZXRjaGVzIGFyZSBjb21wbGV0ZWQuCiAgICAgICAgICogVGhlIHJldHVybmVkIE9ic2VydmFibGUgcHJvZHVjZXMgdGhlIFNWRyBlbGVtZW50IGlmIHBvc3NpYmxlLCBhbmQgdGhyb3dzCiAgICAgICAgICogYW4gZXJyb3IgaWYgbm8gaWNvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBjYW4gYmUgZm91bmQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGljb25TZXRDb25maWdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0U3ZnRnJvbUljb25TZXRDb25maWdzKG5hbWUsIGljb25TZXRDb25maWdzKSB7CiAgICAgICAgICAgIC8vIEZvciBhbGwgdGhlIGljb24gc2V0IFNWRyBlbGVtZW50cyB3ZSd2ZSBmZXRjaGVkLCBzZWUgaWYgYW55IGNvbnRhaW4gYW4gaWNvbiB3aXRoIHRoZQogICAgICAgICAgICAvLyByZXF1ZXN0ZWQgbmFtZS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYW1lZEljb24gPSB0aGlzLl9leHRyYWN0SWNvbldpdGhOYW1lRnJvbUFueVNldChuYW1lLCBpY29uU2V0Q29uZmlncyk7CiAgICAgICAgICAgIGlmIChuYW1lZEljb24pIHsKICAgICAgICAgICAgICAgIC8vIFdlIGNvdWxkIGNhY2hlIG5hbWVkSWNvbiBpbiBfc3ZnSWNvbkNvbmZpZ3MsIGJ1dCBzaW5jZSB3ZSBoYXZlIHRvIG1ha2UgYSBjb3B5IGV2ZXJ5CiAgICAgICAgICAgICAgICAvLyB0aW1lIGFueXdheSwgdGhlcmUncyBwcm9iYWJseSBub3QgbXVjaCBhZHZhbnRhZ2UgY29tcGFyZWQgdG8ganVzdCBhbHdheXMgZXh0cmFjdGluZwogICAgICAgICAgICAgICAgLy8gaXQgZnJvbSB0aGUgaWNvbiBzZXQuCiAgICAgICAgICAgICAgICByZXR1cm4gb2YobmFtZWRJY29uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBOb3QgZm91bmQgaW4gYW55IGNhY2hlZCBpY29uIHNldHMuIElmIHRoZXJlIGFyZSBpY29uIHNldHMgd2l0aCBVUkxzIHRoYXQgd2UgaGF2ZW4ndAogICAgICAgICAgICAvLyBmZXRjaGVkLCBmZXRjaCB0aGVtIG5vdyBhbmQgbG9vayBmb3IgaWNvbk5hbWUgaW4gdGhlIHJlc3VsdHMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaWNvblNldEZldGNoUmVxdWVzdHMgPSBpY29uU2V0Q29uZmlncwogICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaWNvblNldENvbmZpZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaWNvblNldENvbmZpZyA9PiAhaWNvblNldENvbmZpZy5zdmdFbGVtZW50KSkKICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGljb25TZXRDb25maWcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGljb25TZXRDb25maWcgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2xvYWRTdmdJY29uU2V0RnJvbUNvbmZpZyhpY29uU2V0Q29uZmlnKS5waXBlKGNhdGNoRXJyb3IoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlcnIpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5fc2FuaXRpemVyLnNhbml0aXplKFNlY3VyaXR5Q29udGV4dC5SRVNPVVJDRV9VUkwsIGljb25TZXRDb25maWcudXJsKTsKICAgICAgICAgICAgICAgICAgICAvLyBTd2FsbG93IGVycm9ycyBmZXRjaGluZyBpbmRpdmlkdWFsIFVSTHMgc28gdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gY29tYmluZWQgT2JzZXJ2YWJsZSB3b24ndCBuZWNlc3NhcmlseSBmYWlsLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBlcnJvck1lc3NhZ2UgPSBgTG9hZGluZyBpY29uIHNldCBVUkw6ICR7dXJsfSBmYWlsZWQ6ICR7ZXJyLm1lc3NhZ2V9YDsKICAgICAgICAgICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDkuMC4wIF9lcnJvckhhbmRsZXIgcGFyYW1ldGVyIHRvIGJlIG1hZGUgcmVxdWlyZWQKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Vycm9ySGFuZGxlci5oYW5kbGVFcnJvcihuZXcgRXJyb3IoZXJyb3JNZXNzYWdlKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKGVycm9yTWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihudWxsKTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gRmV0Y2ggYWxsIHRoZSBpY29uIHNldCBVUkxzLiBXaGVuIHRoZSByZXF1ZXN0cyBjb21wbGV0ZSwgZXZlcnkgSWNvblNldCBzaG91bGQgaGF2ZSBhCiAgICAgICAgICAgIC8vIGNhY2hlZCBTVkcgZWxlbWVudCAodW5sZXNzIHRoZSByZXF1ZXN0IGZhaWxlZCksIGFuZCB3ZSBjYW4gY2hlY2sgYWdhaW4gZm9yIHRoZSBpY29uLgogICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oaWNvblNldEZldGNoUmVxdWVzdHMpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kSWNvbiA9IHRoaXMuX2V4dHJhY3RJY29uV2l0aE5hbWVGcm9tQW55U2V0KG5hbWUsIGljb25TZXRDb25maWdzKTsKICAgICAgICAgICAgICAgIGlmICghZm91bmRJY29uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0SWNvbk5hbWVOb3RGb3VuZEVycm9yKG5hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGZvdW5kSWNvbjsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2VhcmNoZXMgdGhlIGNhY2hlZCBTVkcgZWxlbWVudHMgZm9yIHRoZSBnaXZlbiBpY29uIHNldHMgZm9yIGEgbmVzdGVkIGljb24gZWxlbWVudCB3aG9zZSAiaWQiCiAgICAgICAgICogdGFnIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBuYW1lLiBJZiBmb3VuZCwgY29waWVzIHRoZSBuZXN0ZWQgZWxlbWVudCB0byBhIG5ldyBTVkcgZWxlbWVudCBhbmQKICAgICAgICAgKiByZXR1cm5zIGl0LiBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaWNvbk5hbWUKICAgICAgICAgKiBAcGFyYW0gez99IGljb25TZXRDb25maWdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZXh0cmFjdEljb25XaXRoTmFtZUZyb21BbnlTZXQoaWNvbk5hbWUsIGljb25TZXRDb25maWdzKSB7CiAgICAgICAgICAgIC8vIEl0ZXJhdGUgYmFja3dhcmRzLCBzbyBpY29uIHNldHMgYWRkZWQgbGF0ZXIgaGF2ZSBwcmVjZWRlbmNlLgogICAgICAgICAgICBmb3IgKGxldCBpID0gaWNvblNldENvbmZpZ3MubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IGljb25TZXRDb25maWdzW2ldOwogICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5zdmdFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvdW5kSWNvbiA9IHRoaXMuX2V4dHJhY3RTdmdJY29uRnJvbVNldChjb25maWcuc3ZnRWxlbWVudCwgaWNvbk5hbWUsIGNvbmZpZy5vcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmRJY29uKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmb3VuZEljb247CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMb2FkcyB0aGUgY29udGVudCBvZiB0aGUgaWNvbiBVUkwgc3BlY2lmaWVkIGluIHRoZSBTdmdJY29uQ29uZmlnIGFuZCBjcmVhdGVzIGFuIFNWRyBlbGVtZW50CiAgICAgICAgICogZnJvbSBpdC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbG9hZFN2Z0ljb25Gcm9tQ29uZmlnKGNvbmZpZykgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2hVcmwoY29uZmlnLnVybCkKICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3ZnVGV4dAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3ZnVGV4dCA9PiB0aGlzLl9jcmVhdGVTdmdFbGVtZW50Rm9yU2luZ2xlSWNvbihzdmdUZXh0LCBjb25maWcub3B0aW9ucykpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIExvYWRzIHRoZSBjb250ZW50IG9mIHRoZSBpY29uIHNldCBVUkwgc3BlY2lmaWVkIGluIHRoZSBTdmdJY29uQ29uZmlnIGFuZCBjcmVhdGVzIGFuIFNWRyBlbGVtZW50CiAgICAgICAgICogZnJvbSBpdC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbG9hZFN2Z0ljb25TZXRGcm9tQ29uZmlnKGNvbmZpZykgewogICAgICAgICAgICAvLyBJZiB0aGUgU1ZHIGZvciB0aGlzIGljb24gc2V0IGhhcyBhbHJlYWR5IGJlZW4gcGFyc2VkLCBkbyBub3RoaW5nLgogICAgICAgICAgICBpZiAoY29uZmlnLnN2Z0VsZW1lbnQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBvZihjb25maWcuc3ZnRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoVXJsKGNvbmZpZy51cmwpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdmdUZXh0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdmdUZXh0ID0+IHsKICAgICAgICAgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIGljb24gc2V0IHdhcyBwYXJzZWQgYW5kIGNhY2hlZCBieSBhbiBlYXJsaWVyIHJlcXVlc3QsIHNvIHBhcnNpbmcKICAgICAgICAgICAgICAgIC8vIG9ubHkgbmVlZHMgdG8gb2NjdXIgaWYgdGhlIGNhY2hlIGlzIHlldCB1bnNldC4KICAgICAgICAgICAgICAgIGlmICghY29uZmlnLnN2Z0VsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWcuc3ZnRWxlbWVudCA9IHRoaXMuX3N2Z0VsZW1lbnRGcm9tU3RyaW5nKHN2Z1RleHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZy5zdmdFbGVtZW50OwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgRE9NIGVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gU1ZHIHN0cmluZywgYW5kIGFkZHMgZGVmYXVsdCBhdHRyaWJ1dGVzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSByZXNwb25zZVRleHQKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlU3ZnRWxlbWVudEZvclNpbmdsZUljb24ocmVzcG9uc2VUZXh0LCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3ZnID0gdGhpcy5fc3ZnRWxlbWVudEZyb21TdHJpbmcocmVzcG9uc2VUZXh0KTsKICAgICAgICAgICAgdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyhzdmcsIG9wdGlvbnMpOwogICAgICAgICAgICByZXR1cm4gc3ZnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZWFyY2hlcyB0aGUgY2FjaGVkIGVsZW1lbnQgb2YgdGhlIGdpdmVuIFN2Z0ljb25Db25maWcgZm9yIGEgbmVzdGVkIGljb24gZWxlbWVudCB3aG9zZSAiaWQiCiAgICAgICAgICogdGFnIG1hdGNoZXMgdGhlIHNwZWNpZmllZCBuYW1lLiBJZiBmb3VuZCwgY29waWVzIHRoZSBuZXN0ZWQgZWxlbWVudCB0byBhIG5ldyBTVkcgZWxlbWVudCBhbmQKICAgICAgICAgKiByZXR1cm5zIGl0LiBSZXR1cm5zIG51bGwgaWYgbm8gbWF0Y2hpbmcgZWxlbWVudCBpcyBmb3VuZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaWNvblNldAogICAgICAgICAqIEBwYXJhbSB7P30gaWNvbk5hbWUKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZXh0cmFjdFN2Z0ljb25Gcm9tU2V0KGljb25TZXQsIGljb25OYW1lLCBvcHRpb25zKSB7CiAgICAgICAgICAgIC8vIFVzZSB0aGUgYGlkPSJpY29uTmFtZSJgIHN5bnRheCBpbiBvcmRlciB0byBlc2NhcGUgc3BlY2lhbAogICAgICAgICAgICAvLyBjaGFyYWN0ZXJzIGluIHRoZSBJRCAodmVyc3VzIHVzaW5nIHRoZSAjaWNvbk5hbWUgc3ludGF4KS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpY29uU291cmNlID0gaWNvblNldC5xdWVyeVNlbGVjdG9yKGBbaWQ9IiR7aWNvbk5hbWV9Il1gKTsKICAgICAgICAgICAgaWYgKCFpY29uU291cmNlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBDbG9uZSB0aGUgZWxlbWVudCBhbmQgcmVtb3ZlIHRoZSBJRCB0byBwcmV2ZW50IG11bHRpcGxlIGVsZW1lbnRzIGZyb20gYmVpbmcgYWRkZWQKICAgICAgICAgICAgLy8gdG8gdGhlIHBhZ2Ugd2l0aCB0aGUgc2FtZSBJRC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpY29uRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChpY29uU291cmNlLmNsb25lTm9kZSh0cnVlKSkpOwogICAgICAgICAgICBpY29uRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2lkJyk7CiAgICAgICAgICAgIC8vIElmIHRoZSBpY29uIG5vZGUgaXMgaXRzZWxmIGFuIDxzdmc+IG5vZGUsIGNsb25lIGFuZCByZXR1cm4gaXQgZGlyZWN0bHkuIElmIG5vdCwgc2V0IGl0IGFzCiAgICAgICAgICAgIC8vIHRoZSBjb250ZW50IG9mIGEgbmV3IDxzdmc+IG5vZGUuCiAgICAgICAgICAgIGlmIChpY29uRWxlbWVudC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSAnc3ZnJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NldFN2Z0F0dHJpYnV0ZXMoKC8qKiBAdHlwZSB7P30gKi8gKGljb25FbGVtZW50KSksIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIElmIHRoZSBub2RlIGlzIGEgPHN5bWJvbD4sIGl0IHdvbid0IGJlIHJlbmRlcmVkIHNvIHdlIGhhdmUgdG8gY29udmVydCBpdCBpbnRvIDxzdmc+LiBOb3RlCiAgICAgICAgICAgIC8vIHRoYXQgdGhlIHNhbWUgY291bGQgYmUgYWNoaWV2ZWQgYnkgcmVmZXJyaW5nIHRvIGl0IHZpYSA8dXNlIGhyZWY9IiNpZCI+LCBob3dldmVyIHRoZSA8dXNlPgogICAgICAgICAgICAvLyB0YWcgaXMgcHJvYmxlbWF0aWMgb24gRmlyZWZveCwgYmVjYXVzZSBpdCBuZWVkcyB0byBpbmNsdWRlIHRoZSBjdXJyZW50IHBhZ2UgcGF0aC4KICAgICAgICAgICAgaWYgKGljb25FbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdzeW1ib2wnKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyh0aGlzLl90b1N2Z0VsZW1lbnQoaWNvbkVsZW1lbnQpLCBvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBjcmVhdGVFbGVtZW50KCdTVkcnKSBkb2Vzbid0IHdvcmsgYXMgZXhwZWN0ZWQ7IHRoZSBET00gZW5kcyB1cCB3aXRoCiAgICAgICAgICAgIC8vIHRoZSBjb3JyZWN0IG5vZGVzLCBidXQgdGhlIFNWRyBjb250ZW50IGRvZXNuJ3QgcmVuZGVyLiBJbnN0ZWFkIHdlCiAgICAgICAgICAgIC8vIGhhdmUgdG8gY3JlYXRlIGFuIGVtcHR5IFNWRyBub2RlIHVzaW5nIGlubmVySFRNTCBhbmQgYXBwZW5kIGl0cyBjb250ZW50LgogICAgICAgICAgICAvLyBFbGVtZW50cyBjcmVhdGVkIHVzaW5nIERPTVBhcnNlci5wYXJzZUZyb21TdHJpbmcgaGF2ZSB0aGUgc2FtZSBwcm9ibGVtLgogICAgICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzIzMDAzMjc4L3N2Zy1pbm5lcmh0bWwtaW4tZmlyZWZveC1jYW4tbm90LWRpc3BsYXkKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygnPHN2Zz48L3N2Zz4nKTsKICAgICAgICAgICAgLy8gQ2xvbmUgdGhlIG5vZGUgc28gd2UgZG9uJ3QgcmVtb3ZlIGl0IGZyb20gdGhlIHBhcmVudCBpY29uIHNldCBlbGVtZW50LgogICAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoaWNvbkVsZW1lbnQpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2V0U3ZnQXR0cmlidXRlcyhzdmcsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGVzIGEgRE9NIGVsZW1lbnQgZnJvbSB0aGUgZ2l2ZW4gU1ZHIHN0cmluZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gc3RyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3ZnRWxlbWVudEZyb21TdHJpbmcoc3RyKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGl2ID0gdGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnRElWJyk7CiAgICAgICAgICAgIGRpdi5pbm5lckhUTUwgPSBzdHI7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3ZnID0gKC8qKiBAdHlwZSB7P30gKi8gKGRpdi5xdWVyeVNlbGVjdG9yKCdzdmcnKSkpOwogICAgICAgICAgICBpZiAoIXN2ZykgewogICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJzxzdmc+IHRhZyBub3QgZm91bmQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc3ZnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb252ZXJ0cyBhbiBlbGVtZW50IGludG8gYW4gU1ZHIG5vZGUgYnkgY2xvbmluZyBhbGwgb2YgaXRzIGNoaWxkcmVuLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdG9TdmdFbGVtZW50KGVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdmcgPSB0aGlzLl9zdmdFbGVtZW50RnJvbVN0cmluZygnPHN2Zz48L3N2Zz4nKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhdHRyaWJ1dGVzID0gZWxlbWVudC5hdHRyaWJ1dGVzOwogICAgICAgICAgICAvLyBDb3B5IG92ZXIgYWxsIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGBzeW1ib2xgIHRvIHRoZSBuZXcgU1ZHLCBleGNlcHQgdGhlIGlkLgogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGF0dHJpYnV0ZXMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgbmFtZSwgdmFsdWUgfSA9IGF0dHJpYnV0ZXNbaV07CiAgICAgICAgICAgICAgICBpZiAobmFtZSAhPT0gJ2lkJykgewogICAgICAgICAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZWxlbWVudC5jaGlsZE5vZGVzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzW2ldLm5vZGVUeXBlID09PSB0aGlzLl9kb2N1bWVudC5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgICAgICBzdmcuYXBwZW5kQ2hpbGQoZWxlbWVudC5jaGlsZE5vZGVzW2ldLmNsb25lTm9kZSh0cnVlKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN2ZzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgZGVmYXVsdCBhdHRyaWJ1dGVzIGZvciBhbiBTVkcgZWxlbWVudCB0byBiZSB1c2VkIGFzIGFuIGljb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHN2ZwogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRTdmdBdHRyaWJ1dGVzKHN2Zywgb3B0aW9ucykgewogICAgICAgICAgICBzdmcuc2V0QXR0cmlidXRlKCdmaXQnLCAnJyk7CiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2hlaWdodCcsICcxMDAlJyk7CiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3dpZHRoJywgJzEwMCUnKTsKICAgICAgICAgICAgc3ZnLnNldEF0dHJpYnV0ZSgncHJlc2VydmVBc3BlY3RSYXRpbycsICd4TWlkWU1pZCBtZWV0Jyk7CiAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ2ZvY3VzYWJsZScsICdmYWxzZScpOyAvLyBEaXNhYmxlIElFMTEgZGVmYXVsdCBiZWhhdmlvciB0byBtYWtlIFNWR3MgZm9jdXNhYmxlLgogICAgICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnZpZXdCb3gpIHsKICAgICAgICAgICAgICAgIHN2Zy5zZXRBdHRyaWJ1dGUoJ3ZpZXdCb3gnLCBvcHRpb25zLnZpZXdCb3gpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzdmc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gT2JzZXJ2YWJsZSB3aGljaCBwcm9kdWNlcyB0aGUgc3RyaW5nIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBVUkwuIFJlc3VsdHMgbWF5IGJlCiAgICAgICAgICogY2FjaGVkLCBzbyBmdXR1cmUgY2FsbHMgd2l0aCB0aGUgc2FtZSBVUkwgbWF5IG5vdCBjYXVzZSBhbm90aGVyIEhUVFAgcmVxdWVzdC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gc2FmZVVybAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2ZldGNoVXJsKHNhZmVVcmwpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9odHRwQ2xpZW50KSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRJY29uTm9IdHRwUHJvdmlkZXJFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChzYWZlVXJsID09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBDYW5ub3QgZmV0Y2ggaWNvbiBmcm9tIFVSTCAiJHtzYWZlVXJsfSIuYCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB1cmwgPSB0aGlzLl9zYW5pdGl6ZXIuc2FuaXRpemUoU2VjdXJpdHlDb250ZXh0LlJFU09VUkNFX1VSTCwgc2FmZVVybCk7CiAgICAgICAgICAgIGlmICghdXJsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRNYXRJY29uRmFpbGVkVG9TYW5pdGl6ZVVybEVycm9yKHNhZmVVcmwpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN0b3JlIGluLXByb2dyZXNzIGZldGNoZXMgdG8gYXZvaWQgc2VuZGluZyBhIGR1cGxpY2F0ZSByZXF1ZXN0IGZvciBhIFVSTCB3aGVuIHRoZXJlIGlzCiAgICAgICAgICAgIC8vIGFscmVhZHkgYSByZXF1ZXN0IGluIHByb2dyZXNzIGZvciB0aGF0IFVSTC4gSXQncyBuZWNlc3NhcnkgdG8gY2FsbCBzaGFyZSgpIG9uIHRoZQogICAgICAgICAgICAvLyBPYnNlcnZhYmxlIHJldHVybmVkIGJ5IGh0dHAuZ2V0KCkgc28gdGhhdCBtdWx0aXBsZSBzdWJzY3JpYmVycyBkb24ndCBjYXVzZSBtdWx0aXBsZSBYSFJzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluUHJvZ3Jlc3NGZXRjaCA9IHRoaXMuX2luUHJvZ3Jlc3NVcmxGZXRjaGVzLmdldCh1cmwpOwogICAgICAgICAgICBpZiAoaW5Qcm9ncmVzc0ZldGNoKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gaW5Qcm9ncmVzc0ZldGNoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRPRE8oamVsYm91cm4pOiBmb3Igc29tZSByZWFzb24sIHRoZSBgZmluYWxpemVgIG9wZXJhdG9yICJsb3NlcyIgdGhlIGdlbmVyaWMgdHlwZSBvbiB0aGUKICAgICAgICAgICAgLy8gT2JzZXJ2YWJsZS4gRmlndXJlIG91dCB3aHkgYW5kIGZpeCBpdC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXEgPSB0aGlzLl9odHRwQ2xpZW50LmdldCh1cmwsIHsgcmVzcG9uc2VUeXBlOiAndGV4dCcgfSkucGlwZShmaW5hbGl6ZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9pblByb2dyZXNzVXJsRmV0Y2hlcy5kZWxldGUodXJsKSkpLCBzaGFyZSgpKTsKICAgICAgICAgICAgdGhpcy5faW5Qcm9ncmVzc1VybEZldGNoZXMuc2V0KHVybCwgcmVxKTsKICAgICAgICAgICAgcmV0dXJuIHJlcTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGFuIGljb24gY29uZmlnIGJ5IG5hbWUgaW4gdGhlIHNwZWNpZmllZCBuYW1lc3BhY2UuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAdGVtcGxhdGUgVEhJUwogICAgICAgICAqIEB0aGlzIHtUSElTfQogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlIE5hbWVzcGFjZSBpbiB3aGljaCB0byByZWdpc3RlciB0aGUgaWNvbiBjb25maWcuCiAgICAgICAgICogQHBhcmFtIHs/fSBpY29uTmFtZSBOYW1lIHVuZGVyIHdoaWNoIHRvIHJlZ2lzdGVyIHRoZSBjb25maWcuCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcgQ29uZmlnIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHJldHVybiB7VEhJU30KICAgICAgICAgKi8KICAgICAgICBfYWRkU3ZnSWNvbkNvbmZpZyhuYW1lc3BhY2UsIGljb25OYW1lLCBjb25maWcpIHsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKS5fc3ZnSWNvbkNvbmZpZ3Muc2V0KGljb25LZXkobmFtZXNwYWNlLCBpY29uTmFtZSksIGNvbmZpZyk7CiAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYW4gaWNvbiBzZXQgY29uZmlnIGluIHRoZSBzcGVjaWZpZWQgbmFtZXNwYWNlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRlbXBsYXRlIFRISVMKICAgICAgICAgKiBAdGhpcyB7VEhJU30KICAgICAgICAgKiBAcGFyYW0gez99IG5hbWVzcGFjZSBOYW1lc3BhY2UgaW4gd2hpY2ggdG8gcmVnaXN0ZXIgdGhlIGljb24gY29uZmlnLgogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnIENvbmZpZyB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEByZXR1cm4ge1RISVN9CiAgICAgICAgICovCiAgICAgICAgX2FkZFN2Z0ljb25TZXRDb25maWcobmFtZXNwYWNlLCBjb25maWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb25maWdOYW1lc3BhY2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcykpLl9pY29uU2V0Q29uZmlncy5nZXQobmFtZXNwYWNlKTsKICAgICAgICAgICAgaWYgKGNvbmZpZ05hbWVzcGFjZSkgewogICAgICAgICAgICAgICAgY29uZmlnTmFtZXNwYWNlLnB1c2goY29uZmlnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzKSkuX2ljb25TZXRDb25maWdzLnNldChuYW1lc3BhY2UsIFtjb25maWddKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMpKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRJY29uUmVnaXN0cnkuybVmYWMgPSBmdW5jdGlvbiBNYXRJY29uUmVnaXN0cnlfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SWNvblJlZ2lzdHJ5KSjJtcm1aW5qZWN0KEh0dHBDbGllbnQsIDgpLCDJtcm1aW5qZWN0KERvbVNhbml0aXplciksIMm1ybVpbmplY3QoRE9DVU1FTlQkMSwgOCksIMm1ybVpbmplY3QoRXJyb3JIYW5kbGVyLCA4KSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdEljb25SZWdpc3RyeS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEh0dHBDbGllbnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBEb21TYW5pdGl6ZXIgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEVycm9ySGFuZGxlciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYXRJY29uUmVnaXN0cnkuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRJY29uUmVnaXN0cnlfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBNYXRJY29uUmVnaXN0cnkoybXJtWluamVjdChIdHRwQ2xpZW50LCA4KSwgybXJtWluamVjdChEb21TYW5pdGl6ZXIpLCDJtcm1aW5qZWN0KERPQ1VNRU5UJDEsIDgpLCDJtcm1aW5qZWN0KEVycm9ySGFuZGxlciwgOCkpOyB9LCB0b2tlbjogTWF0SWNvblJlZ2lzdHJ5LCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IHBhcmVudFJlZ2lzdHJ5CiAgICAgKiBAcGFyYW0gez99IGh0dHBDbGllbnQKICAgICAqIEBwYXJhbSB7P30gc2FuaXRpemVyCiAgICAgKiBAcGFyYW0gez89fSBkb2N1bWVudAogICAgICogQHBhcmFtIHs/PX0gZXJyb3JIYW5kbGVyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBJQ09OX1JFR0lTVFJZX1BST1ZJREVSX0ZBQ1RPUlkocGFyZW50UmVnaXN0cnksIGh0dHBDbGllbnQsIHNhbml0aXplciwgZG9jdW1lbnQsIGVycm9ySGFuZGxlcikgewogICAgICAgIHJldHVybiBwYXJlbnRSZWdpc3RyeSB8fCBuZXcgTWF0SWNvblJlZ2lzdHJ5KGh0dHBDbGllbnQsIHNhbml0aXplciwgZG9jdW1lbnQsIGVycm9ySGFuZGxlcik7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgSUNPTl9SRUdJU1RSWV9QUk9WSURFUiA9IHsKICAgICAgICAvLyBJZiB0aGVyZSBpcyBhbHJlYWR5IGFuIE1hdEljb25SZWdpc3RyeSBhdmFpbGFibGUsIHVzZSB0aGF0LiBPdGhlcndpc2UsIHByb3ZpZGUgYSBuZXcgb25lLgogICAgICAgIHByb3ZpZGU6IE1hdEljb25SZWdpc3RyeSwKICAgICAgICBkZXBzOiBbCiAgICAgICAgICAgIFtuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE1hdEljb25SZWdpc3RyeV0sCiAgICAgICAgICAgIFtuZXcgT3B0aW9uYWwoKSwgSHR0cENsaWVudF0sCiAgICAgICAgICAgIERvbVNhbml0aXplciwKICAgICAgICAgICAgW25ldyBPcHRpb25hbCgpLCBFcnJvckhhbmRsZXJdLAogICAgICAgICAgICBbbmV3IE9wdGlvbmFsKCksICgvKiogQHR5cGUgez99ICovIChET0NVTUVOVCQxKSldLAogICAgICAgIF0sCiAgICAgICAgdXNlRmFjdG9yeTogSUNPTl9SRUdJU1RSWV9QUk9WSURFUl9GQUNUT1JZLAogICAgfTsKICAgIC8qKgogICAgICogQ2xvbmVzIGFuIFNWR0VsZW1lbnQgd2hpbGUgcHJlc2VydmluZyB0eXBlIGluZm9ybWF0aW9uLgogICAgICogQHBhcmFtIHs/fSBzdmcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNsb25lU3ZnKHN2ZykgewogICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoc3ZnLmNsb25lTm9kZSh0cnVlKSkpOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZSBrZXkgdG8gdXNlIGZvciBhbiBpY29uIG5hbWVzcGFjZSBhbmQgbmFtZS4KICAgICAqIEBwYXJhbSB7P30gbmFtZXNwYWNlCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGljb25LZXkobmFtZXNwYWNlLCBuYW1lKSB7CiAgICAgICAgcmV0dXJuIG5hbWVzcGFjZSArICc6JyArIG5hbWU7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvaWNvbi9pY29uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0SWNvbi4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0SWNvbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdEljb25NaXhpbkJhc2UgPSBtaXhpbkNvbG9yKE1hdEljb25CYXNlKTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHVzZWQgdG8gcHJvdmlkZSB0aGUgY3VycmVudCBsb2NhdGlvbiB0byBgTWF0SWNvbmAuCiAgICAgKiBVc2VkIHRvIGhhbmRsZSBzZXJ2ZXItc2lkZSByZW5kZXJpbmcgYW5kIHRvIHN0dWIgb3V0IGR1cmluZyB1bml0IHRlc3RzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfSUNPTl9MT0NBVElPTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWljb24tbG9jYXRpb24nLCB7CiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6IE1BVF9JQ09OX0xPQ0FUSU9OX0ZBQ1RPUlkKICAgIH0pOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFUX0lDT05fTE9DQVRJT05fRkFDVE9SWSgpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgX2RvY3VtZW50ID0gaW5qZWN0KERPQ1VNRU5UJDEpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBfbG9jYXRpb24gPSBfZG9jdW1lbnQgPyBfZG9jdW1lbnQubG9jYXRpb24gOiBudWxsOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG5lZWRzIHRvIGJlIGEgZnVuY3Rpb24sIHJhdGhlciB0aGFuIGEgcHJvcGVydHksIGJlY2F1c2UgQW5ndWxhcgogICAgICAgICAgICAvLyB3aWxsIG9ubHkgcmVzb2x2ZSBpdCBvbmNlLCBidXQgd2Ugd2FudCB0aGUgY3VycmVudCBwYXRoIG9uIGVhY2ggY2FsbC4KICAgICAgICAgICAgZ2V0UGF0aG5hbWU6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IF9sb2NhdGlvbiA/IChfbG9jYXRpb24ucGF0aG5hbWUgKyBfbG9jYXRpb24uc2VhcmNoKSA6ICcnKQogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFNWRyBhdHRyaWJ1dGVzIHRoYXQgYWNjZXB0IGEgRnVuY0lSSSAoZS5nLiBgdXJsKDxzb21ldGhpbmc+KWApLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGZ1bmNJcmlBdHRyaWJ1dGVzID0gWwogICAgICAgICdjbGlwLXBhdGgnLAogICAgICAgICdjb2xvci1wcm9maWxlJywKICAgICAgICAnc3JjJywKICAgICAgICAnY3Vyc29yJywKICAgICAgICAnZmlsbCcsCiAgICAgICAgJ2ZpbHRlcicsCiAgICAgICAgJ21hcmtlcicsCiAgICAgICAgJ21hcmtlci1zdGFydCcsCiAgICAgICAgJ21hcmtlci1taWQnLAogICAgICAgICdtYXJrZXItZW5kJywKICAgICAgICAnbWFzaycsCiAgICAgICAgJ3N0cm9rZScKICAgIF07CiAgICBjb25zdCDJtTAkYyA9IC8qKgogICAgICogQHBhcmFtIHs/fSBhdHRyCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBhdHRyID0+IGBbJHthdHRyfV1gOwogICAgLyoqCiAgICAgKiBTZWxlY3RvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGZpbmQgYWxsIGVsZW1lbnRzIHRoYXQgYXJlIHVzaW5nIGEgYEZ1bmNJUklgLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGZ1bmNJcmlBdHRyaWJ1dGVTZWxlY3RvciA9IGZ1bmNJcmlBdHRyaWJ1dGVzLm1hcCgoybUwJGMpKS5qb2luKCcsICcpOwogICAgLyoqCiAgICAgKiBSZWdleCB0aGF0IGNhbiBiZSB1c2VkIHRvIGV4dHJhY3QgdGhlIGlkIG91dCBvZiBhIEZ1bmNJUkkuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgZnVuY0lyaVBhdHRlcm4gPSAvXnVybFwoWyciXT8jKC4qPylbJyJdP1wpJC87CiAgICAvKioKICAgICAqIENvbXBvbmVudCB0byBkaXNwbGF5IGFuIGljb24uIEl0IGNhbiBiZSB1c2VkIGluIHRoZSBmb2xsb3dpbmcgd2F5czoKICAgICAqCiAgICAgKiAtIFNwZWNpZnkgdGhlIHN2Z0ljb24gaW5wdXQgdG8gbG9hZCBhbiBTVkcgaWNvbiBmcm9tIGEgVVJMIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIHRoZQogICAgICogICBhZGRTdmdJY29uLCBhZGRTdmdJY29uSW5OYW1lc3BhY2UsIGFkZFN2Z0ljb25TZXQsIG9yIGFkZFN2Z0ljb25TZXRJbk5hbWVzcGFjZSBtZXRob2RzIG9mCiAgICAgKiAgIE1hdEljb25SZWdpc3RyeS4gSWYgdGhlIHN2Z0ljb24gdmFsdWUgY29udGFpbnMgYSBjb2xvbiBpdCBpcyBhc3N1bWVkIHRvIGJlIGluIHRoZSBmb3JtYXQKICAgICAqICAgIltuYW1lc3BhY2VdOltuYW1lXSIsIGlmIG5vdCB0aGUgdmFsdWUgd2lsbCBiZSB0aGUgbmFtZSBvZiBhbiBpY29uIGluIHRoZSBkZWZhdWx0IG5hbWVzcGFjZS4KICAgICAqICAgRXhhbXBsZXM6CiAgICAgKiAgICAgYDxtYXQtaWNvbiBzdmdJY29uPSJsZWZ0LWFycm93Ij48L21hdC1pY29uPgogICAgICogICAgIDxtYXQtaWNvbiBzdmdJY29uPSJhbmltYWxzOmNhdCI+PC9tYXQtaWNvbj5gCiAgICAgKgogICAgICogLSBVc2UgYSBmb250IGxpZ2F0dXJlIGFzIGFuIGljb24gYnkgcHV0dGluZyB0aGUgbGlnYXR1cmUgdGV4dCBpbiB0aGUgY29udGVudCBvZiB0aGUgYDxtYXQtaWNvbj5gCiAgICAgKiAgIGNvbXBvbmVudC4gQnkgZGVmYXVsdCB0aGUgTWF0ZXJpYWwgaWNvbnMgZm9udCBpcyB1c2VkIGFzIGRlc2NyaWJlZCBhdAogICAgICogICBodHRwOi8vZ29vZ2xlLmdpdGh1Yi5pby9tYXRlcmlhbC1kZXNpZ24taWNvbnMvI2ljb24tZm9udC1mb3ItdGhlLXdlYi4gWW91IGNhbiBzcGVjaWZ5IGFuCiAgICAgKiAgIGFsdGVybmF0ZSBmb250IGJ5IHNldHRpbmcgdGhlIGZvbnRTZXQgaW5wdXQgdG8gZWl0aGVyIHRoZSBDU1MgY2xhc3MgdG8gYXBwbHkgdG8gdXNlIHRoZQogICAgICogICBkZXNpcmVkIGZvbnQsIG9yIHRvIGFuIGFsaWFzIHByZXZpb3VzbHkgcmVnaXN0ZXJlZCB3aXRoIE1hdEljb25SZWdpc3RyeS5yZWdpc3RlckZvbnRDbGFzc0FsaWFzLgogICAgICogICBFeGFtcGxlczoKICAgICAqICAgICBgPG1hdC1pY29uPmhvbWU8L21hdC1pY29uPgogICAgICogICAgIDxtYXQtaWNvbiBmb250U2V0PSJteWZvbnQiPnN1bjwvbWF0LWljb24+YAogICAgICoKICAgICAqIC0gU3BlY2lmeSBhIGZvbnQgZ2x5cGggdG8gYmUgaW5jbHVkZWQgdmlhIENTUyBydWxlcyBieSBzZXR0aW5nIHRoZSBmb250U2V0IGlucHV0IHRvIHNwZWNpZnkgdGhlCiAgICAgKiAgIGZvbnQsIGFuZCB0aGUgZm9udEljb24gaW5wdXQgdG8gc3BlY2lmeSB0aGUgaWNvbi4gVHlwaWNhbGx5IHRoZSBmb250SWNvbiB3aWxsIHNwZWNpZnkgYQogICAgICogICBDU1MgY2xhc3Mgd2hpY2ggY2F1c2VzIHRoZSBnbHlwaCB0byBiZSBkaXNwbGF5ZWQgdmlhIGEgOmJlZm9yZSBzZWxlY3RvciwgYXMgaW4KICAgICAqICAgaHR0cHM6Ly9mb3J0YXdlc29tZS5naXRodWIuaW8vRm9udC1Bd2Vzb21lL2V4YW1wbGVzLwogICAgICogICBFeGFtcGxlOgogICAgICogICAgIGA8bWF0LWljb24gZm9udFNldD0iZmEiIGZvbnRJY29uPSJhbGFybSI+PC9tYXQtaWNvbj5gCiAgICAgKi8KICAgIGNsYXNzIE1hdEljb24gZXh0ZW5kcyBfTWF0SWNvbk1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfaWNvblJlZ2lzdHJ5CiAgICAgICAgICogQHBhcmFtIHs/fSBhcmlhSGlkZGVuCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2xvY2F0aW9uCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2Vycm9ySGFuZGxlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9pY29uUmVnaXN0cnksIGFyaWFIaWRkZW4sIF9sb2NhdGlvbiwgX2Vycm9ySGFuZGxlcikgewogICAgICAgICAgICBzdXBlcihlbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5faWNvblJlZ2lzdHJ5ID0gX2ljb25SZWdpc3RyeTsKICAgICAgICAgICAgdGhpcy5fbG9jYXRpb24gPSBfbG9jYXRpb247CiAgICAgICAgICAgIHRoaXMuX2Vycm9ySGFuZGxlciA9IF9lcnJvckhhbmRsZXI7CiAgICAgICAgICAgIHRoaXMuX2lubGluZSA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBjdXJyZW50IGluLXByb2dyZXNzIFNWRyBpY29uIHJlcXVlc3QuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jdXJyZW50SWNvbkZldGNoID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICAvLyBJZiB0aGUgdXNlciBoYXMgbm90IGV4cGxpY2l0bHkgc2V0IGFyaWEtaGlkZGVuLCBtYXJrIHRoZSBpY29uIGFzIGhpZGRlbiwgYXMgdGhpcyBpcwogICAgICAgICAgICAvLyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8gZm9yIHRoZSBtYWpvcml0eSBvZiBpY29uIHVzZS1jYXNlcy4KICAgICAgICAgICAgaWYgKCFhcmlhSGlkZGVuKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgaWNvbiBzaG91bGQgYmUgaW5saW5lZCwgYXV0b21hdGljYWxseSBzaXppbmcgdGhlIGljb24gdG8gbWF0Y2ggdGhlIGZvbnQgc2l6ZSBvZgogICAgICAgICAqIHRoZSBlbGVtZW50IHRoZSBpY29uIGlzIGNvbnRhaW5lZCBpbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBpbmxpbmUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9pbmxpbmU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5saW5lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgaW5saW5lKGlubGluZSkgewogICAgICAgICAgICB0aGlzLl9pbmxpbmUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkoaW5saW5lKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9udCBzZXQgdGhhdCB0aGUgaWNvbiBpcyBhIHBhcnQgb2YuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZm9udFNldCgpIHsgcmV0dXJuIHRoaXMuX2ZvbnRTZXQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZm9udFNldCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9mb250U2V0ID0gdGhpcy5fY2xlYW51cEZvbnRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE5hbWUgb2YgYW4gaWNvbiB3aXRoaW4gYSBmb250IHNldC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb250SWNvbigpIHsgcmV0dXJuIHRoaXMuX2ZvbnRJY29uOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGZvbnRJY29uKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvbnRJY29uID0gdGhpcy5fY2xlYW51cEZvbnRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNwbGl0cyBhbiBzdmdJY29uIGJpbmRpbmcgdmFsdWUgaW50byBpdHMgaWNvbiBzZXQgYW5kIGljb24gbmFtZSBjb21wb25lbnRzLgogICAgICAgICAqIFJldHVybnMgYSAyLWVsZW1lbnQgYXJyYXkgb2YgWyhpY29uIHNldCksIChpY29uIG5hbWUpXS4KICAgICAgICAgKiBUaGUgc2VwYXJhdG9yIGZvciB0aGUgdHdvIGZpZWxkcyBpcyAnOicuIElmIHRoZXJlIGlzIG5vIHNlcGFyYXRvciwgYW4gZW1wdHkKICAgICAgICAgKiBzdHJpbmcgaXMgcmV0dXJuZWQgZm9yIHRoZSBpY29uIHNldCBhbmQgdGhlIGVudGlyZSB2YWx1ZSBpcyByZXR1cm5lZCBmb3IKICAgICAgICAgKiB0aGUgaWNvbiBuYW1lLiBJZiB0aGUgYXJndW1lbnQgaXMgZmFsc3ksIHJldHVybnMgYW4gYXJyYXkgb2YgdHdvIGVtcHR5IHN0cmluZ3MuCiAgICAgICAgICogVGhyb3dzIGFuIGVycm9yIGlmIHRoZSBuYW1lIGNvbnRhaW5zIHR3byBvciBtb3JlICc6JyBzZXBhcmF0b3JzLgogICAgICAgICAqIEV4YW1wbGVzOgogICAgICAgICAqICAgYCdzb2NpYWw6Y2FrZScgLT4gWydzb2NpYWwnLCAnY2FrZSddCiAgICAgICAgICogICAncGVuZ3VpbicgLT4gWycnLCAncGVuZ3VpbiddCiAgICAgICAgICogICBudWxsIC0+IFsnJywgJyddCiAgICAgICAgICogICAnYTpiOmMnIC0+ICh0aHJvd3MgRXJyb3IpYAogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpY29uTmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NwbGl0SWNvbk5hbWUoaWNvbk5hbWUpIHsKICAgICAgICAgICAgaWYgKCFpY29uTmFtZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFsnJywgJyddOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFydHMgPSBpY29uTmFtZS5zcGxpdCgnOicpOwogICAgICAgICAgICBzd2l0Y2ggKHBhcnRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gWycnLCBwYXJ0c1swXV07IC8vIFVzZSBkZWZhdWx0IG5hbWVzcGFjZS4KICAgICAgICAgICAgICAgIGNhc2UgMjogcmV0dXJuICgvKiogQHR5cGUgez99ICovIChwYXJ0cykpOwogICAgICAgICAgICAgICAgZGVmYXVsdDogdGhyb3cgRXJyb3IoYEludmFsaWQgaWNvbiBuYW1lOiAiJHtpY29uTmFtZX0iYCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIC8vIE9ubHkgdXBkYXRlIHRoZSBpbmxpbmUgU1ZHIGljb24gaWYgdGhlIGlucHV0cyBjaGFuZ2VkLCB0byBhdm9pZCB1bm5lY2Vzc2FyeSBET00gb3BlcmF0aW9ucy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdmdJY29uQ2hhbmdlcyA9IGNoYW5nZXNbJ3N2Z0ljb24nXTsKICAgICAgICAgICAgaWYgKHN2Z0ljb25DaGFuZ2VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jdXJyZW50SWNvbkZldGNoLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5zdmdJY29uKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgW25hbWVzcGFjZSwgaWNvbk5hbWVdID0gdGhpcy5fc3BsaXRJY29uTmFtZSh0aGlzLnN2Z0ljb24pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJY29uRmV0Y2ggPSB0aGlzLl9pY29uUmVnaXN0cnkuZ2V0TmFtZWRTdmdJY29uKGljb25OYW1lLCBuYW1lc3BhY2UpCiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3ZnCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBzdmcgPT4gdGhpcy5fc2V0U3ZnRWxlbWVudChzdmcpKSwgKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoZXJyKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZXJyb3JNZXNzYWdlID0gYEVycm9yIHJldHJpZXZpbmcgaWNvbiAke25hbWVzcGFjZX06JHtpY29uTmFtZX0hICR7ZXJyLm1lc3NhZ2V9YDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBfZXJyb3JIYW5kbGVyIHBhcmFtZXRlciB0byBiZSBtYWRlIHJlcXVpcmVkLgogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fZXJyb3JIYW5kbGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9lcnJvckhhbmRsZXIuaGFuZGxlRXJyb3IobmV3IEVycm9yKGVycm9yTWVzc2FnZSkpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnJvck1lc3NhZ2UpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc3ZnSWNvbkNoYW5nZXMucHJldmlvdXNWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsZWFyU3ZnRWxlbWVudCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl91c2luZ0ZvbnRJY29uKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUZvbnRJY29uQ2xhc3NlcygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIC8vIFVwZGF0ZSBmb250IGNsYXNzZXMgYmVjYXVzZSBuZ09uQ2hhbmdlcyB3b24ndCBiZSBjYWxsZWQgaWYgbm9uZSBvZiB0aGUgaW5wdXRzIGFyZSBwcmVzZW50LAogICAgICAgICAgICAvLyBlLmcuIDxtYXQtaWNvbj5hcnJvdzwvbWF0LWljb24+IEluIHRoaXMgY2FzZSB3ZSBuZWVkIHRvIGFkZCBhIENTUyBjbGFzcyBmb3IgdGhlIGRlZmF1bHQgZm9udC4KICAgICAgICAgICAgaWYgKHRoaXMuX3VzaW5nRm9udEljb24oKSkgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRm9udEljb25DbGFzc2VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyVmlld0NoZWNrZWQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2FjaGVkRWxlbWVudHMgPSB0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXM7CiAgICAgICAgICAgIGlmIChjYWNoZWRFbGVtZW50cyAmJiB0aGlzLl9sb2NhdGlvbiAmJiBjYWNoZWRFbGVtZW50cy5zaXplKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXdQYXRoID0gdGhpcy5fbG9jYXRpb24uZ2V0UGF0aG5hbWUoKTsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gY2hlY2sgd2hldGhlciB0aGUgVVJMIGhhcyBjaGFuZ2VkIG9uIGVhY2ggY2hhbmdlIGRldGVjdGlvbiBzaW5jZQogICAgICAgICAgICAgICAgLy8gdGhlIGJyb3dzZXIgZG9lc24ndCBoYXZlIGFuIEFQSSB0aGF0IHdpbGwgbGV0IHVzIHJlYWN0IG9uIGxpbmsgY2xpY2tzIGFuZAogICAgICAgICAgICAgICAgLy8gd2UgY2FuJ3QgZGVwZW5kIG9uIHRoZSBBbmd1bGFyIHJvdXRlci4gVGhlIHJlZmVyZW5jZXMgbmVlZCB0byBiZSB1cGRhdGVkLAogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB3aGlsZSBtb3N0IGJyb3dzZXJzIGRvbid0IGNhcmUgd2hldGhlciB0aGUgVVJMIGlzIGNvcnJlY3QgYWZ0ZXIKICAgICAgICAgICAgICAgIC8vIHRoZSBmaXJzdCByZW5kZXIsIFNhZmFyaSB3aWxsIGJyZWFrIGlmIHRoZSB1c2VyIG5hdmlnYXRlcyB0byBhIGRpZmZlcmVudAogICAgICAgICAgICAgICAgLy8gcGFnZSBhbmQgdGhlIFNWRyBpc24ndCByZS1yZW5kZXJlZC4KICAgICAgICAgICAgICAgIGlmIChuZXdQYXRoICE9PSB0aGlzLl9wcmV2aW91c1BhdGgpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1BhdGggPSBuZXdQYXRoOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKG5ld1BhdGgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRJY29uRmV0Y2gudW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlcykgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91c2luZ0ZvbnRJY29uKCkgewogICAgICAgICAgICByZXR1cm4gIXRoaXMuc3ZnSWNvbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHN2ZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFN2Z0VsZW1lbnQoc3ZnKSB7CiAgICAgICAgICAgIHRoaXMuX2NsZWFyU3ZnRWxlbWVudCgpOwogICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBJRTExIGFuZCBFZGdlIGlnbm9yaW5nIGBzdHlsZWAgdGFncyBpbnNpZGUgZHluYW1pY2FsbHktY3JlYXRlZCBTVkdzLgogICAgICAgICAgICAvLyBTZWU6IGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzEwODk4NDY5LwogICAgICAgICAgICAvLyBEbyB0aGlzIGJlZm9yZSBpbnNlcnRpbmcgdGhlIGVsZW1lbnQgaW50byB0aGUgRE9NLCBpbiBvcmRlciB0byBhdm9pZCBhIHN0eWxlIHJlY2FsY3VsYXRpb24uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGVUYWdzID0gKC8qKiBAdHlwZSB7P30gKi8gKHN2Zy5xdWVyeVNlbGVjdG9yQWxsKCdzdHlsZScpKSk7CiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3R5bGVUYWdzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBzdHlsZVRhZ3NbaV0udGV4dENvbnRlbnQgKz0gJyAnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE5vdGU6IHdlIGRvIHRoaXMgZml4IGhlcmUsIHJhdGhlciB0aGFuIHRoZSBpY29uIHJlZ2lzdHJ5LCBiZWNhdXNlIHRoZQogICAgICAgICAgICAvLyByZWZlcmVuY2VzIGhhdmUgdG8gcG9pbnQgdG8gdGhlIFVSTCBhdCB0aGUgdGltZSB0aGF0IHRoZSBpY29uIHdhcyBjcmVhdGVkLgogICAgICAgICAgICBpZiAodGhpcy5fbG9jYXRpb24pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhdGggPSB0aGlzLl9sb2NhdGlvbi5nZXRQYXRobmFtZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNQYXRoID0gcGF0aDsKICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlQ2hpbGRyZW5XaXRoRXh0ZXJuYWxSZWZlcmVuY2VzKHN2Zyk7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmVwZW5kUGF0aFRvUmVmZXJlbmNlcyhwYXRoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQoc3ZnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jbGVhclN2Z0VsZW1lbnQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGF5b3V0RWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY2hpbGRDb3VudCA9IGxheW91dEVsZW1lbnQuY2hpbGROb2Rlcy5sZW5ndGg7CiAgICAgICAgICAgIGlmICh0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlcy5jbGVhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlbW92ZSBleGlzdGluZyBub24tZWxlbWVudCBjaGlsZCBub2RlcyBhbmQgU1ZHcywgYW5kIGFkZCB0aGUgbmV3IFNWRyBlbGVtZW50LiBOb3RlIHRoYXQKICAgICAgICAgICAgLy8gd2UgY2FuJ3QgdXNlIGlubmVySFRNTCwgYmVjYXVzZSBJRSB3aWxsIHRocm93IGlmIHRoZSBlbGVtZW50IGhhcyBhIGRhdGEgYmluZGluZy4KICAgICAgICAgICAgd2hpbGUgKGNoaWxkQ291bnQtLSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2hpbGQgPSBsYXlvdXRFbGVtZW50LmNoaWxkTm9kZXNbY2hpbGRDb3VudF07CiAgICAgICAgICAgICAgICAvLyAxIGNvcnJlc3BvbmRzIHRvIE5vZGUuRUxFTUVOVF9OT0RFLiBXZSByZW1vdmUgYWxsIG5vbi1lbGVtZW50IG5vZGVzIGluIG9yZGVyIHRvIGdldCByaWQKICAgICAgICAgICAgICAgIC8vIG9mIGFueSBsb29zZSB0ZXh0IG5vZGVzLCBhcyB3ZWxsIGFzIGFueSBTVkcgZWxlbWVudHMgaW4gb3JkZXIgdG8gcmVtb3ZlIGFueSBvbGQgaWNvbnMuCiAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IDEgfHwgY2hpbGQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gJ3N2ZycpIHsKICAgICAgICAgICAgICAgICAgICBsYXlvdXRFbGVtZW50LnJlbW92ZUNoaWxkKGNoaWxkKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZUZvbnRJY29uQ2xhc3NlcygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl91c2luZ0ZvbnRJY29uKCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW0gPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZm9udFNldENsYXNzID0gdGhpcy5mb250U2V0ID8KICAgICAgICAgICAgICAgIHRoaXMuX2ljb25SZWdpc3RyeS5jbGFzc05hbWVGb3JGb250QWxpYXModGhpcy5mb250U2V0KSA6CiAgICAgICAgICAgICAgICB0aGlzLl9pY29uUmVnaXN0cnkuZ2V0RGVmYXVsdEZvbnRTZXRDbGFzcygpOwogICAgICAgICAgICBpZiAoZm9udFNldENsYXNzICE9IHRoaXMuX3ByZXZpb3VzRm9udFNldENsYXNzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MpIHsKICAgICAgICAgICAgICAgICAgICBlbGVtLmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGZvbnRTZXRDbGFzcykgewogICAgICAgICAgICAgICAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZChmb250U2V0Q2xhc3MpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNGb250U2V0Q2xhc3MgPSBmb250U2V0Q2xhc3M7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuZm9udEljb24gIT0gdGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNGb250SWNvbkNsYXNzKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbS5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5mb250SWNvbikgewogICAgICAgICAgICAgICAgICAgIGVsZW0uY2xhc3NMaXN0LmFkZCh0aGlzLmZvbnRJY29uKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzRm9udEljb25DbGFzcyA9IHRoaXMuZm9udEljb247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYW5zIHVwIGEgdmFsdWUgdG8gYmUgdXNlZCBhcyBhIGZvbnRJY29uIG9yIGZvbnRTZXQuCiAgICAgICAgICogU2luY2UgdGhlIHZhbHVlIGVuZHMgdXAgYmVpbmcgYXNzaWduZWQgYXMgYSBDU1MgY2xhc3MsIHdlCiAgICAgICAgICogaGF2ZSB0byB0cmltIHRoZSB2YWx1ZSBhbmQgb21pdCBzcGFjZS1zZXBhcmF0ZWQgdmFsdWVzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NsZWFudXBGb250VmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZS50cmltKCkuc3BsaXQoJyAnKVswXSA6IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQcmVwZW5kcyB0aGUgY3VycmVudCBwYXRoIHRvIGFsbCBlbGVtZW50cyB0aGF0IGhhdmUgYW4gYXR0cmlidXRlIHBvaW50aW5nIHRvIGEgYEZ1bmNJUklgCiAgICAgICAgICogcmVmZXJlbmNlLiBUaGlzIGlzIHJlcXVpcmVkIGJlY2F1c2UgV2ViS2l0IGJyb3dzZXJzIHJlcXVpcmUgcmVmZXJlbmNlcyB0byBiZSBwcmVmaXhlZCB3aXRoCiAgICAgICAgICogdGhlIGN1cnJlbnQgcGF0aCwgaWYgdGhlIHBhZ2UgaGFzIGEgYGJhc2VgIHRhZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3ByZXBlbmRQYXRoVG9SZWZlcmVuY2VzKHBhdGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50cyA9IHRoaXMuX2VsZW1lbnRzV2l0aEV4dGVybmFsUmVmZXJlbmNlczsKICAgICAgICAgICAgaWYgKGVsZW1lbnRzKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXR0cnMKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGF0dHJzLCBlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgYXR0cnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhdHRyCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBhdHRyID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBgdXJsKCcke3BhdGh9IyR7YXR0ci52YWx1ZX0nKWApOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWNoZXMgdGhlIGNoaWxkcmVuIG9mIGFuIFNWRyBlbGVtZW50IHRoYXQgaGF2ZSBgdXJsKClgCiAgICAgICAgICogcmVmZXJlbmNlcyB0aGF0IHdlIG5lZWQgdG8gcHJlZml4IHdpdGggdGhlIGN1cnJlbnQgcGF0aC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhY2hlQ2hpbGRyZW5XaXRoRXh0ZXJuYWxSZWZlcmVuY2VzKGVsZW1lbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50c1dpdGhGdW5jSXJpID0gZWxlbWVudC5xdWVyeVNlbGVjdG9yQWxsKGZ1bmNJcmlBdHRyaWJ1dGVTZWxlY3Rvcik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSB0aGlzLl9lbGVtZW50c1dpdGhFeHRlcm5hbFJlZmVyZW5jZXMgPQogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudHNXaXRoRXh0ZXJuYWxSZWZlcmVuY2VzIHx8IG5ldyBNYXAoKTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbGVtZW50c1dpdGhGdW5jSXJpLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICBmdW5jSXJpQXR0cmlidXRlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYXR0cgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgYXR0ciA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRXaXRoUmVmZXJlbmNlID0gZWxlbWVudHNXaXRoRnVuY0lyaVtpXTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbGVtZW50V2l0aFJlZmVyZW5jZS5nZXRBdHRyaWJ1dGUoYXR0cik7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gdmFsdWUgPyB2YWx1ZS5tYXRjaChmdW5jSXJpUGF0dGVybikgOiBudWxsOwogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaCkgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGVzID0gZWxlbWVudHMuZ2V0KGVsZW1lbnRXaXRoUmVmZXJlbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFhdHRyaWJ1dGVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzID0gW107CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5zZXQoZWxlbWVudFdpdGhSZWZlcmVuY2UsIGF0dHJpYnV0ZXMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChhdHRyaWJ1dGVzKSkucHVzaCh7IG5hbWU6IGF0dHIsIHZhbHVlOiBtYXRjaFsxXSB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBNYXRJY29uLsm1ZmFjID0gZnVuY3Rpb24gTWF0SWNvbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRJY29uKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdEljb25SZWdpc3RyeSksIMm1ybVpbmplY3RBdHRyaWJ1dGUoJ2FyaWEtaGlkZGVuJyksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0lDT05fTE9DQVRJT04sIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVycm9ySGFuZGxlciwgOCkpOyB9OwogICAgTWF0SWNvbi7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRJY29uLCBzZWxlY3RvcnM6IFtbIm1hdC1pY29uIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJpbWciLCAxLCAibWF0LWljb24iLCAibm90cmFuc2xhdGUiXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0SWNvbl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1pY29uLWlubGluZSIsIGN0eC5pbmxpbmUpKCJtYXQtaWNvbi1uby1jb2xvciIsIGN0eC5jb2xvciAhPT0gInByaW1hcnkiICYmIGN0eC5jb2xvciAhPT0gImFjY2VudCIgJiYgY3R4LmNvbG9yICE9PSAid2FybiIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGNvbG9yOiAiY29sb3IiLCBpbmxpbmU6ICJpbmxpbmUiLCBmb250U2V0OiAiZm9udFNldCIsIGZvbnRJY29uOiAiZm9udEljb24iLCBzdmdJY29uOiAic3ZnSWNvbiIgfSwgZXhwb3J0QXM6IFsibWF0SWNvbiJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMCQ3LCBkZWNsczogMSwgdmFyczogMCwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEljb25fVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDApOwogICAgICAgIH0gfSwgc3R5bGVzOiBbIi5tYXQtaWNvbntiYWNrZ3JvdW5kLXJlcGVhdDpuby1yZXBlYXQ7ZGlzcGxheTppbmxpbmUtYmxvY2s7ZmlsbDpjdXJyZW50Q29sb3I7aGVpZ2h0OjI0cHg7d2lkdGg6MjRweH0ubWF0LWljb24ubWF0LWljb24taW5saW5le2ZvbnQtc2l6ZTppbmhlcml0O2hlaWdodDppbmhlcml0O2xpbmUtaGVpZ2h0OmluaGVyaXQ7d2lkdGg6aW5oZXJpdH1bZGlyPXJ0bF0gLm1hdC1pY29uLXJ0bC1taXJyb3J7dHJhbnNmb3JtOnNjYWxlKC0xLCAxKX0ubWF0LWZvcm0tZmllbGQ6bm90KC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSkgLm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29ue2Rpc3BsYXk6YmxvY2t9Lm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1wcmVmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkOm5vdCgubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kpIC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbiAubWF0LWljb257bWFyZ2luOmF1dG99XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRJY29uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogTWF0SWNvblJlZ2lzdHJ5IH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEF0dHJpYnV0ZSwgYXJnczogWydhcmlhLWhpZGRlbicsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9JQ09OX0xPQ0FUSU9OLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEVycm9ySGFuZGxlciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfQogICAgXTsKICAgIE1hdEljb24ucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgaW5saW5lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzdmdJY29uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb250U2V0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb250SWNvbjogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvaWNvbi9pY29uLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRJY29uTW9kdWxlIHsKICAgIH0KICAgIE1hdEljb25Nb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRJY29uTW9kdWxlIH0pOwogICAgTWF0SWNvbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdEljb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SWNvbk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tNYXRDb21tb25Nb2R1bGVdLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0SWNvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRJY29uXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRJY29uLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3RiZGV2X3VwbG9hZC90YmRldl91cGxvYWRfZGlhbG9nX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaWFsb2dSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihkaWFsb2dSZWYpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2dSZWYgPSBkaWFsb2dSZWY7CiAgICAgICAgICAgIHRoaXMudGVuc29yYm9hcmREb3REZXZVcmwgPSAnaHR0cHM6Ly90ZW5zb3Jib2FyZC5kZXYvP3V0bV9zb3VyY2U9dGVuc29yYm9hcmQnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ2xvc2UoKSB7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nUmVmLmNsb3NlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29tbWFuZFRleHQoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5sb2dkaXIpIHsKICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgbG9nZGlyIHdlIHByaW50IGEgbGl0ZXJhbCAne2xvZ2Rpcn0nIHN0cmluZyB0aGF0IHVzZXIgd2lsbAogICAgICAgICAgICAgICAgLy8gaGF2ZSB0byBtYW51YWxseSBzdWJzdGl0dXRlLgogICAgICAgICAgICAgICAgcmV0dXJuICd0ZW5zb3Jib2FyZCBkZXYgdXBsb2FkIC0tbG9nZGlyIHtsb2dkaXJ9JzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFdpdGggbG9nZGlyIHdlIHN1YnN0aXR1dGUgdGhlIHZhbHVlIGludG8gdGhlIGNvbW1hbmQgZm9yIHRoZSB1c2VyLgogICAgICAgICAgICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgbG9nZGlyIGlzIHN1ZmZpY2llbnRseSBsb25nIHRoYXQgd2Ugd2FudCB0byBwcmludCBpdCBvbgogICAgICAgICAgICAgICAgLy8gdGhlIG5leHQgbGluZS4gSWYgdGhlIGxvZ2RpciB2YWx1ZSBpcyBzdGlsbCB0b28gbG9uZyB0aGVuIHRoZSBDU1Mgd2lsbAogICAgICAgICAgICAgICAgLy8gcmVuZGVyIGEgc2Nyb2xsYmFyIHVuZGVybmVhdGguCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlc2NhcGVkTG9nZGlyID0gdGhpcy5sb2dkaXIucmVwbGFjZSgvJy9nLCAiJ1xcJyciKTsKICAgICAgICAgICAgICAgIHJldHVybiAidGVuc29yYm9hcmQgZGV2IHVwbG9hZCAtLWxvZ2RpciBcXFxuICAgICciICsgZXNjYXBlZExvZ2RpciArICInIjsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0YmRldi11cGxvYWQtZGlhbG9nLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3RiZGV2X3VwbG9hZF9kaWFsb2dfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3RiZGV2X3VwbG9hZF9kaWFsb2dfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE1hdERpYWxvZ1JlZiB9CiAgICBdOwogICAgVGJkZXZVcGxvYWREaWFsb2dDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbG9nZGlyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUYmRldlVwbG9hZERpYWxvZ0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdERpYWxvZ1JlZikpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInRiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgbG9nZGlyOiAibG9nZGlyIiB9LCBkZWNsczogMjEsIHZhcnM6IDQsIGNvbnN0czogW1sidGFyZ2V0IiwgIl9ibGFuayIsICJyZWwiLCAibm9yZWZlcnJlciBub29wZW5lciIsIDEsICJhbmNob3ItdGV4dCIsIDMsICJocmVmIl0sIFsxLCAiY29tbWFuZCJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidGl0bGUiLCAiQ2xpY2sgdG8gY29weSB0aGUgY29tbWFuZCIsIDEsICJjb21tYW5kLWNvcHkiLCAzLCAiY2RrQ29weVRvQ2xpcGJvYXJkIl0sIFsic3ZnSWNvbiIsICJjb250ZW50X2NvcHlfMjRweCJdLCBbMSwgImJvdHRvbS1idXR0b25zIl0sIFsibWF0LWZsYXQtYnV0dG9uIiwgIiIsIDEsICJjbG9zZS1idXR0b24iLCAzLCAiY2xpY2siXSwgWyJtYXQtZmxhdC1idXR0b24iLCAiIiwgInRhcmdldCIsICJfYmxhbmsiLCAicmVsIiwgIm5vcmVmZXJyZXIgbm9vcGVuZXIiLCAxLCAibGVhcm4tbW9yZS1idXR0b24iLCAzLCAiaHJlZiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJoMyIpOwogICAgICAgICAgICDJtcm1dGV4dCgxLCAiVXBsb2FkIHRvIFRlbnNvckJvYXJkLmRldiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJwIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImEiLCAwKTsKICAgICAgICAgICAgybXJtXRleHQoNCwgIiBUZW5zb3JCb2FyZC5kZXYiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRleHQoNSwgIiBlbmFibGVzIHlvdSB0byBlYXNpbHkgaG9zdCwgdHJhY2ssIGFuZCBzaGFyZSB5b3VyIE1MIGV4cGVyaW1lbnRzIHdpdGggZXZlcnlvbmUuIFlvdSBjYW4gc2hhcmUgYSBsaW5rIHRvIHRoZSB1cGxvYWRlZCBUZW5zb3JCb2FyZCBpbiBwYXBlcnMsIGJsb2cgcG9zdHMsIGFuZCBzb2NpYWwgbWVkaWEuIFRoaXMgY2FuIHNob3djYXNlIHRoZSByZXN1bHRzIG1vcmUgZWZmZWN0aXZlbHkgYW5kIGhlbHBzIHJlcHJvZHVjaWJpbGl0eS5cbiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJwIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDcsICJUbyB1cGxvYWQgYSBsb2dkaXIgdG8gVGVuc29yQm9hcmQuZGV2LCBydW4gdGhlIGNvbW1hbmQ6Iik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOCwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDksICJwcmUiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMCwgImNvZGUiKTsKICAgICAgICAgICAgybXJtXRleHQoMTEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAiYnV0dG9uIiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDEzLCAibWF0LWljb24iLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNCwgInAiKTsKICAgICAgICAgICAgybXJtXRleHQoMTUsICIgT25seSBjZXJ0YWluIHBsdWdpbnMgYXJlIGN1cnJlbnRseSBzdXBwb3J0ZWQuIFVwbG9hZGVkIFRlbnNvckJvYXJkcyBhcmUgcHVibGljIGFuZCB2aXNpYmxlIHRvIGV2ZXJ5b25lOyBkbyBub3QgdXBsb2FkIHNlbnNpdGl2ZSBkYXRhLlxuIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTYsICJkaXYiLCA0KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNywgImJ1dHRvbiIsIDUpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGJkZXZVcGxvYWREaWFsb2dDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzE3X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uQ2xvc2UoKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDE4LCAiIENsb3NlICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE5LCAiYSIsIDYpOwogICAgICAgICAgICDJtcm1dGV4dCgyMCwgIiBMZWFybiBtb3JlICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoImhyZWYiLCBjdHgudGVuc29yYm9hcmREb3REZXZVcmwsIMm1ybVzYW5pdGl6ZVVybCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDgpOwogICAgICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eC5nZXRDb21tYW5kVGV4dCgpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiY2RrQ29weVRvQ2xpcGJvYXJkIiwgY3R4LmdldENvbW1hbmRUZXh0KCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg3KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoImhyZWYiLCBjdHgudGVuc29yYm9hcmREb3REZXZVcmwsIMm1ybVzYW5pdGl6ZVVybCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0QnV0dG9uLCBDZGtDb3B5VG9DbGlwYm9hcmQsIE1hdEljb24sIE1hdEFuY2hvcl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfWRpdltfbmdjb250ZW50LSVDT01QJV0sIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjoxNnB4IDB9W19uZ2hvc3QtJUNPTVAlXSA+IFtfbmdjb250ZW50LSVDT01QJV06Zmlyc3QtY2hpbGR7bWFyZ2luLXRvcDowfVtfbmdob3N0LSVDT01QJV0gPiBbX25nY29udGVudC0lQ09NUCVdOmxhc3QtY2hpbGR7bWFyZ2luLWJvdHRvbTowfWgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDA7bGluZS1oZWlnaHQ6MS41fXBbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Zm9udC1zaXplOjEycHg7bGluZS1oZWlnaHQ6MS41fS5hbmNob3ItdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzE5NzZkMjt0ZXh0LWRlY29yYXRpb246bm9uZX0uY29tbWFuZFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JhY2tncm91bmQ6I2Y1ZjZmNztib3JkZXItcmFkaXVzOjRweDtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47cGFkZGluZzoycHggMTJweH1wcmVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93LXg6YXV0b31jb2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtsaW5lLWhlaWdodDoxLjV9LmJvdHRvbS1idXR0b25zW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpmbGV4LWVuZH0uY2xvc2UtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO3RleHQtdHJhbnNmb3JtOnVwcGVyY2FzZTttYXJnaW4tcmlnaHQ6OHB4fS5sZWFybi1tb3JlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzE5NzZkMjt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Il0gfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvdGJkZXZfdXBsb2FkL3RiZGV2X3VwbG9hZF9kaWFsb2dfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldExvZ2RpciA9IGNyZWF0ZVNlbGVjdG9yKGdldEVudmlyb25tZW50LCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGVudmlyb25tZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZW52aXJvbm1lbnQpID0+IGVudmlyb25tZW50LmRhdGFfbG9jYXRpb24pKTsKICAgIGNsYXNzIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmxvZ2RpciQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldExvZ2RpcikpOwogICAgICAgIH0KICAgIH0KICAgIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0YmRldi11cGxvYWQtZGlhbG9nJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHRiZGV2LXVwbG9hZC1kaWFsb2ctY29tcG9uZW50CiAgICAgIFtsb2dkaXJdPSJsb2dkaXIkIHwgYXN5bmMiCiAgICA+PC90YmRldi11cGxvYWQtZGlhbG9nLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGJkZXZVcGxvYWREaWFsb2dDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRiZGV2LXVwbG9hZC1kaWFsb2ciXV0sIGRlY2xzOiAyLCB2YXJzOiAzLCBjb25zdHM6IFtbMywgImxvZ2RpciJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAidGJkZXYtdXBsb2FkLWRpYWxvZy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibG9nZGlyIiwgybXJtXBpcGVCaW5kMSgxLCAxLCBjdHgubG9nZGlyJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1RiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3RiZGV2X3VwbG9hZC90YmRldl91cGxvYWRfYnV0dG9uX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudF9idXR0b25fMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCAxKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRfYnV0dG9uXzBfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjIpOyBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMS5vcGVuRGlhbG9nKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAyKTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAibWF0LWljb24iLCAzKTsKICAgICAgICDJtcm1dGV4dCgzLCAiIFVwbG9hZCAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIC8vIEEgbGlzdCBvZiBob3N0bmFtZSB2YWx1ZXMgdGhhdCB3aWxsIHRyaWdnZXIgdGhlIGJ1dHRvbiB0byBhcHBlYXIuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBMT0NBTF9IT1NUTkFNRVMgPSBbJ2xvY2FsaG9zdCcsICcxMjcuMC4wLjEnXTsKICAgIGNsYXNzIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHdpbmRvdwogICAgICAgICAqIEBwYXJhbSB7P30gZGlhbG9nCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iod2luZG93LCBkaWFsb2cpIHsKICAgICAgICAgICAgdGhpcy53aW5kb3cgPSB3aW5kb3c7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nID0gZGlhbG9nOwogICAgICAgICAgICB0aGlzLnNob3duID0gTE9DQUxfSE9TVE5BTUVTLmluY2x1ZGVzKHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3BlbkRpYWxvZygpIHsKICAgICAgICAgICAgdGhpcy5kaWFsb2cub3BlbihUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lciwgewogICAgICAgICAgICAgICAgd2lkdGg6ICc1NjBweCcsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0YmRldi11cGxvYWQtYnV0dG9uJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vdGJkZXZfdXBsb2FkX2J1dHRvbl9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vdGJkZXZfdXBsb2FkX2J1dHRvbl9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogV2luZG93LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFsnd2luZG93JyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBNYXREaWFsb2cgfQogICAgXTsKICAgIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHNob3duOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy5zaG93bicsXSB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KCd3aW5kb3cnKSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXREaWFsb2cpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0YmRldi11cGxvYWQtYnV0dG9uIl1dLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoInNob3duIiwgY3R4LnNob3duKTsKICAgICAgICB9IH0sIGRlY2xzOiAxLCB2YXJzOiAxLCBjb25zdHM6IFtbIm1hdC1zdHJva2VkLWJ1dHRvbiIsICIiLCAzLCAiY2xpY2siLCA0LCAibmdJZiJdLCBbIm1hdC1zdHJva2VkLWJ1dHRvbiIsICIiLCAzLCAiY2xpY2siXSwgWzEsICJidXR0b24tY29udGVudHMiXSwgWyJzdmdJY29uIiwgImluZm9fb3V0bGluZV8yNHB4Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgwLCBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudF9idXR0b25fMF9UZW1wbGF0ZSwgNCwgMCwgImJ1dHRvbiIsIDApOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguc2hvd24pOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIE1hdEJ1dHRvbiwgTWF0SWNvbl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV0gICBidXR0b24ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmVifS5idXR0b24tY29udGVudHNbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tcmlnaHQ6NnB4fSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2hlYWRlci9yZWxvYWRfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGlzUmVsb2FkRGlzYWJsZWRCeVBsdWdpbiA9IGNyZWF0ZVNlbGVjdG9yKGdldFBsdWdpbnMsIGdldEFjdGl2ZVBsdWdpbiwgKC8qKgogICAgICogQHBhcmFtIHs/fSBwbHVnaW5zCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAocGx1Z2lucywgaWQpID0+IHsKICAgICAgICBpZiAoIWlkIHx8ICFwbHVnaW5zW2lkXSkKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIHJldHVybiBwbHVnaW5zW2lkXS5kaXNhYmxlX3JlbG9hZDsKICAgIH0pKTsKICAgIGNsYXNzIFJlbG9hZENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5yZWxvYWREaXNhYmxlZCQgPSB0aGlzLnN0b3JlLnNlbGVjdChpc1JlbG9hZERpc2FibGVkQnlQbHVnaW4pOwogICAgICAgICAgICB0aGlzLmlzUmVsb2FkaW5nJCA9IHRoaXMuc3RvcmUKICAgICAgICAgICAgICAgIC5zZWxlY3QoZ2V0UGx1Z2luc0xpc3RMb2FkZWQpCiAgICAgICAgICAgICAgICAucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnJlbG9hZERpc2FibGVkJCksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2xvYWRlZCwgcmVsb2FkRGlzYWJsZWRdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gIXJlbG9hZERpc2FibGVkICYmIGxvYWRlZC5zdGF0ZSA9PT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmxhc3RMb2FkZWRUaW1lSW5NcyQgPSB0aGlzLnN0b3JlCiAgICAgICAgICAgICAgICAuc2VsZWN0KGdldFBsdWdpbnNMaXN0TG9hZGVkKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsb2FkZWQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChsb2FkZWQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBsb2FkZWQubGFzdExvYWRlZFRpbWVJbk1zOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJSZWxvYWQoKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWFudWFsUmVsb2FkKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGVTdHJpbmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFJlbG9hZFRpdGxlKGRhdGVTdHJpbmcpIHsKICAgICAgICAgICAgaWYgKCFkYXRlU3RyaW5nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ0xvYWRpbmcuLi4nOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBgTGFzdCBVcGRhdGVkOiAke2RhdGVTdHJpbmd9YDsKICAgICAgICB9CiAgICB9CiAgICBSZWxvYWRDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2FwcC1oZWFkZXItcmVsb2FkJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGJ1dHRvbgogICAgICBjbGFzcz0icmVsb2FkLWJ1dHRvbiIKICAgICAgW2NsYXNzLmxvYWRpbmddPSJpc1JlbG9hZGluZyQgfCBhc3luYyIKICAgICAgbWF0LWljb24tYnV0dG9uCiAgICAgIChjbGljayk9InRyaWdnZXJSZWxvYWQoKSIKICAgICAgW3RpdGxlXT0iZ2V0UmVsb2FkVGl0bGUobGFzdExvYWRlZFRpbWVJbk1zJCB8IGFzeW5jIHwgZGF0ZTogJ21lZGl1bScpIgogICAgICBbZGlzYWJsZWRdPSJyZWxvYWREaXNhYmxlZCQgfCBhc3luYyIKICAgID4KICAgICAgPG1hdC1pY29uIGNsYXNzPSJyZWZyZXNoLWljb24iIHN2Z0ljb249InJlZnJlc2hfMjRweCI+PC9tYXQtaWNvbj4KICAgIDwvYnV0dG9uPgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgLnJlbG9hZC1idXR0b24sCiAgICAgIC5yZWZyZXNoLWljb24gewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjsKICAgICAgfQoKICAgICAgLnJlbG9hZC1idXR0b24ubG9hZGluZyB7CiAgICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMnMgbGluZWFyIGluZmluaXRlOwogICAgICB9CgogICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7CiAgICAgICAgMCUgewogICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMGRlZyk7CiAgICAgICAgfQogICAgICAgIDUwJSB7CiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgxODBkZWcpOwogICAgICAgIH0KICAgICAgICAxMDAlIHsKICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDM2MGRlZyk7CiAgICAgICAgfQogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJlbG9hZENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmVsb2FkQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gUmVsb2FkQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlbG9hZENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJlbG9hZENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSZWxvYWRDb250YWluZXIsIHNlbGVjdG9yczogW1siYXBwLWhlYWRlci1yZWxvYWQiXV0sIGRlY2xzOiA2LCB2YXJzOiAxMywgY29uc3RzOiBbWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMSwgInJlbG9hZC1idXR0b24iLCAzLCAidGl0bGUiLCAiZGlzYWJsZWQiLCAiY2xpY2siXSwgWyJzdmdJY29uIiwgInJlZnJlc2hfMjRweCIsIDEsICJyZWZyZXNoLWljb24iXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBSZWxvYWRDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImJ1dHRvbiIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gUmVsb2FkQ29udGFpbmVyX1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LnRyaWdnZXJSZWxvYWQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiZGF0ZSIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDUsICJtYXQtaWNvbiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJsb2FkaW5nIiwgybXJtXBpcGVCaW5kMSgxLCA0LCBjdHguaXNSZWxvYWRpbmckKSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgidGl0bGUiLCBjdHguZ2V0UmVsb2FkVGl0bGUoybXJtXBpcGVCaW5kMigyLCA2LCDJtcm1cGlwZUJpbmQxKDMsIDksIGN0eC5sYXN0TG9hZGVkVGltZUluTXMkKSwgIm1lZGl1bSIpKSkoImRpc2FibGVkIiwgybXJtXBpcGVCaW5kMSg0LCAxMSwgY3R4LnJlbG9hZERpc2FibGVkJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdEJ1dHRvbiwgTWF0SWNvbl0sIHBpcGVzOiBbQXN5bmNQaXBlLCBEYXRlUGlwZV0sIHN0eWxlczogWyIucmVsb2FkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5yZWZyZXNoLWljb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgICB9XG5cbiAgICAgIC5yZWxvYWQtYnV0dG9uLmxvYWRpbmdbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYW5pbWF0aW9uOiByb3RhdGUgMnMgbGluZWFyIGluZmluaXRlO1xuICAgICAgfVxuXG4gICAgICBAa2V5ZnJhbWVzIHJvdGF0ZSB7XG4gICAgICAgIDAlIHtcbiAgICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgwZGVnKTtcbiAgICAgICAgfVxuICAgICAgICA1MCUge1xuICAgICAgICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7XG4gICAgICAgIH1cbiAgICAgICAgMTAwJSB7XG4gICAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKTtcbiAgICAgICAgfVxuICAgICAgfSJdIH0pOwoKICAgIGNvbnN0IF9jMCQ4ID0gWyJpbnB1dCJdOwogICAgY29uc3QgX2MxJDcgPSBmdW5jdGlvbiAoKSB7IHJldHVybiB7IGVudGVyRHVyYXRpb246IDE1MCB9OyB9OwogICAgY29uc3QgX2MyJDQgPSBbIioiXTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRvIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgYG1hdC1jaGVja2JveGAuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0NIRUNLQk9YX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LWNoZWNrYm94LWRlZmF1bHQtb3B0aW9ucycsIHsKICAgICAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICAgICAgZmFjdG9yeTogTUFUX0NIRUNLQk9YX0RFRkFVTFRfT1BUSU9OU19GQUNUT1JZCiAgICB9KTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIE1BVF9DSEVDS0JPWF9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjb2xvcjogJ2FjY2VudCcsCiAgICAgICAgICAgIGNsaWNrQWN0aW9uOiAnY2hlY2staW5kZXRlcm1pbmF0ZScsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgY2hlY2tib3ggY2xpY2sgYmVoYXZpb3IuCiAgICAgKiBAZGVwcmVjYXRlZCBJbmplY3Rpb24gdG9rZW4gd2lsbCBiZSByZW1vdmVkLCB1c2UgYE1BVF9DSEVDS0JPWF9ERUZBVUxUX09QVElPTlNgIGluc3RlYWQuCiAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfQ0hFQ0tCT1hfQ0xJQ0tfQUNUSU9OID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtY2hlY2tib3gtY2xpY2stYWN0aW9uJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvY2hlY2tib3gvY2hlY2tib3gudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gSW5jcmVhc2luZyBpbnRlZ2VyIGZvciBnZW5lcmF0aW5nIHVuaXF1ZSBpZHMgZm9yIGNoZWNrYm94IGNvbXBvbmVudHMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV4dFVuaXF1ZUlkJDUgPSAwOwogICAgLyoqCiAgICAgKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIG1hdC1jaGVja2JveCB0byByZWdpc3RlciBhcyBhIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICogVGhpcyBhbGxvd3MgaXQgdG8gc3VwcG9ydCBbKG5nTW9kZWwpXS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0NIRUNLQk9YX0NPTlRST0xfVkFMVUVfQUNDRVNTT1IgPSB7CiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gTWF0Q2hlY2tib3gpKSwKICAgICAgICBtdWx0aTogdHJ1ZQogICAgfTsKICAgIC8qKgogICAgICogQ2hhbmdlIGV2ZW50IG9iamVjdCBlbWl0dGVkIGJ5IE1hdENoZWNrYm94LgogICAgICovCiAgICBjbGFzcyBNYXRDaGVja2JveENoYW5nZSB7CiAgICB9CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdENoZWNrYm94LgogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRDaGVja2JveEJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdENoZWNrYm94TWl4aW5CYXNlID0gbWl4aW5UYWJJbmRleChtaXhpbkNvbG9yKG1peGluRGlzYWJsZVJpcHBsZShtaXhpbkRpc2FibGVkKE1hdENoZWNrYm94QmFzZSkpKSk7CiAgICAvKioKICAgICAqIEEgbWF0ZXJpYWwgZGVzaWduIGNoZWNrYm94IGNvbXBvbmVudC4gU3VwcG9ydHMgYWxsIG9mIHRoZSBmdW5jdGlvbmFsaXR5IG9mIGFuIEhUTUw1IGNoZWNrYm94LAogICAgICogYW5kIGV4cG9zZXMgYSBzaW1pbGFyIEFQSS4gQSBNYXRDaGVja2JveCBjYW4gYmUgZWl0aGVyIGNoZWNrZWQsIHVuY2hlY2tlZCwgaW5kZXRlcm1pbmF0ZSwgb3IKICAgICAqIGRpc2FibGVkLiBOb3RlIHRoYXQgYWxsIGFkZGl0aW9uYWwgYWNjZXNzaWJpbGl0eSBhdHRyaWJ1dGVzIGFyZSB0YWtlbiBjYXJlIG9mIGJ5IHRoZSBjb21wb25lbnQsCiAgICAgKiBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHByb3ZpZGUgdGhlbSB5b3Vyc2VsZi4gSG93ZXZlciwgaWYgeW91IHdhbnQgdG8gb21pdCBhIGxhYmVsIGFuZCBzdGlsbAogICAgICogaGF2ZSB0aGUgY2hlY2tib3ggYmUgYWNjZXNzaWJsZSwgeW91IG1heSBzdXBwbHkgYW4gW2FyaWEtbGFiZWxdIGlucHV0LgogICAgICogU2VlOiBodHRwczovL21hdGVyaWFsLmlvL2Rlc2lnbi9jb21wb25lbnRzL3NlbGVjdGlvbi1jb250cm9scy5odG1sCiAgICAgKi8KICAgIGNsYXNzIE1hdENoZWNrYm94IGV4dGVuZHMgX01hdENoZWNrYm94TWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzTW9uaXRvcgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gdGFiSW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IF9jbGlja0FjdGlvbgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9hbmltYXRpb25Nb2RlCiAgICAgICAgICogQHBhcmFtIHs/PX0gX29wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihlbGVtZW50UmVmLCBfY2hhbmdlRGV0ZWN0b3JSZWYsIF9mb2N1c01vbml0b3IsIF9uZ1pvbmUsIHRhYkluZGV4LCBfY2xpY2tBY3Rpb24sIF9hbmltYXRpb25Nb2RlLCBfb3B0aW9ucykgewogICAgICAgICAgICBzdXBlcihlbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvciA9IF9mb2N1c01vbml0b3I7CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX2NsaWNrQWN0aW9uID0gX2NsaWNrQWN0aW9uOwogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25Nb2RlID0gX2FuaW1hdGlvbk1vZGU7CiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9uczsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEF0dGFjaGVkIHRvIHRoZSBhcmlhLWxhYmVsIGF0dHJpYnV0ZSBvZiB0aGUgaG9zdCBlbGVtZW50LiBJbiBtb3N0IGNhc2VzLCBhcmlhLWxhYmVsbGVkYnkgd2lsbAogICAgICAgICAgICAgKiB0YWtlIHByZWNlZGVuY2Ugc28gdGhpcyBtYXkgYmUgb21pdHRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXJpYUxhYmVsID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBVc2VycyBjYW4gc3BlY2lmeSB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFyaWFMYWJlbGxlZGJ5ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fdW5pcXVlSWQgPSBgbWF0LWNoZWNrYm94LSR7KytuZXh0VW5pcXVlSWQkNX1gOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSB1bmlxdWUgaWQgZm9yIHRoZSBjaGVja2JveCBpbnB1dC4gSWYgbm9uZSBpcyBzdXBwbGllZCwgaXQgd2lsbCBiZSBhdXRvLWdlbmVyYXRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLl91bmlxdWVJZDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBhcHBlYXIgYWZ0ZXIgb3IgYmVmb3JlIHRoZSBjaGVja2JveC4gRGVmYXVsdHMgdG8gJ2FmdGVyJwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5sYWJlbFBvc2l0aW9uID0gJ2FmdGVyJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE5hbWUgdmFsdWUgd2lsbCBiZSBhcHBsaWVkIHRvIHRoZSBpbnB1dCBlbGVtZW50IGlmIHByZXNlbnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubmFtZSA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGNoZWNrYm94J3MgYGNoZWNrZWRgIHZhbHVlIGNoYW5nZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgY2hlY2tib3gncyBgaW5kZXRlcm1pbmF0ZWAgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaW5kZXRlcm1pbmF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaGVja2JveCBpcyBibHVycmVkLiBOZWVkZWQgdG8gcHJvcGVybHkgaW1wbGVtZW50IENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgdGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzID0gJyc7CiAgICAgICAgICAgIHRoaXMuX2N1cnJlbnRDaGVja1N0YXRlID0gMCAvKiBJbml0ICovOwogICAgICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9pbmRldGVybWluYXRlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSB0aGlzLl9vcHRpb25zIHx8IHt9OwogICAgICAgICAgICBpZiAodGhpcy5fb3B0aW9ucy5jb2xvcikgewogICAgICAgICAgICAgICAgdGhpcy5jb2xvciA9IHRoaXMuX29wdGlvbnMuY29sb3I7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4KSB8fCAwOwogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IubW9uaXRvcihlbGVtZW50UmVmLCB0cnVlKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZvY3VzT3JpZ2luCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb2N1c09yaWdpbiA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIWZvY3VzT3JpZ2luKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBhIGZvY3VzZWQgZWxlbWVudCBiZWNvbWVzIGRpc2FibGVkLCB0aGUgYnJvd3NlciAqaW1tZWRpYXRlbHkqIGZpcmVzIGEgYmx1ciBldmVudC4KICAgICAgICAgICAgICAgICAgICAvLyBBbmd1bGFyIGRvZXMgbm90IGV4cGVjdCBldmVudHMgdG8gYmUgcmFpc2VkIGR1cmluZyBjaGFuZ2UgZGV0ZWN0aW9uLCBzbyBhbnkgc3RhdGUgY2hhbmdlCiAgICAgICAgICAgICAgICAgICAgLy8gKHN1Y2ggYXMgYSBmb3JtIGNvbnRyb2wncyAnbmctdG91Y2hlZCcpIHdpbGwgY2F1c2UgYSBjaGFuZ2VkLWFmdGVyLWNoZWNrZWQgZXJyb3IuCiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2FuZ3VsYXIvaXNzdWVzLzE3NzkzLiBUbyB3b3JrIGFyb3VuZCB0aGlzLCB3ZSBkZWZlcgogICAgICAgICAgICAgICAgICAgIC8vIHRlbGxpbmcgdGhlIGZvcm0gY29udHJvbCBpdCBoYXMgYmVlbiB0b3VjaGVkIHVudGlsIHRoZSBuZXh0IHRpY2suCiAgICAgICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICBfY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGFmdGVyIHRoZSBgX2NsaWNrQWN0aW9uYCBwYXJhbWV0ZXIgaXMgcmVtb3ZlZCBhcyBhbiBpbmplY3Rpb24gcGFyYW1ldGVyLgogICAgICAgICAgICB0aGlzLl9jbGlja0FjdGlvbiA9IHRoaXMuX2NsaWNrQWN0aW9uIHx8IHRoaXMuX29wdGlvbnMuY2xpY2tBY3Rpb247CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBpZCBmb3IgdGhlIHZpc3VhbCBoaWRkZW4gaW5wdXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaW5wdXRJZCgpIHsgcmV0dXJuIGAke3RoaXMuaWQgfHwgdGhpcy5fdW5pcXVlSWR9LWlucHV0YDsgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIHJlcXVpcmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJlcXVpcmVkKCkgeyByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcmVxdWlyZWQodmFsdWUpIHsgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyVmlld0luaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX3N5bmNJbmRldGVybWluYXRlKHRoaXMuX2luZGV0ZXJtaW5hdGUpOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPOiBEZWxldGUgbmV4dCBtYWpvciByZXZpc2lvbi4KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHsgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY2hlY2tib3ggaXMgY2hlY2tlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjaGVja2VkKCkgeyByZXR1cm4gdGhpcy5fY2hlY2tlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBjaGVja2VkKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSAhPSB0aGlzLmNoZWNrZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrZWQgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGNoZWNrYm94IGlzIGRpc2FibGVkLiBUaGlzIGZ1bGx5IG92ZXJyaWRlcyB0aGUgaW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkKICAgICAgICAgKiBtaXhpbkRpc2FibGVkLCBidXQgdGhlIG1peGluIGlzIHN0aWxsIHJlcXVpcmVkIGJlY2F1c2UgbWl4aW5UYWJJbmRleCByZXF1aXJlcyBpdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGRpc2FibGVkKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICBpZiAobmV3VmFsdWUgIT09IHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gbmV3VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjaGVja2JveCBpcyBpbmRldGVybWluYXRlLiBUaGlzIGlzIGFsc28ga25vd24gYXMgIm1peGVkIiBtb2RlIGFuZCBjYW4gYmUgdXNlZCB0bwogICAgICAgICAqIHJlcHJlc2VudCBhIGNoZWNrYm94IHdpdGggdGhyZWUgc3RhdGVzLCBlLmcuIGEgY2hlY2tib3ggdGhhdCByZXByZXNlbnRzIGEgbmVzdGVkIGxpc3Qgb2YKICAgICAgICAgKiBjaGVja2FibGUgaXRlbXMuIE5vdGUgdGhhdCB3aGVuZXZlciBjaGVja2JveCBpcyBtYW51YWxseSBjbGlja2VkLCBpbmRldGVybWluYXRlIGlzIGltbWVkaWF0ZWx5CiAgICAgICAgICogc2V0IHRvIGZhbHNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGluZGV0ZXJtaW5hdGUoKSB7IHJldHVybiB0aGlzLl9pbmRldGVybWluYXRlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGluZGV0ZXJtaW5hdGUodmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjaGFuZ2VkID0gdmFsdWUgIT0gdGhpcy5faW5kZXRlcm1pbmF0ZTsKICAgICAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgIGlmIChjaGFuZ2VkKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5faW5kZXRlcm1pbmF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RyYW5zaXRpb25DaGVja1N0YXRlKDMgLyogSW5kZXRlcm1pbmF0ZSAqLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl90cmFuc2l0aW9uQ2hlY2tTdGF0ZSh0aGlzLmNoZWNrZWQgPyAxIC8qIENoZWNrZWQgKi8gOiAyIC8qIFVuY2hlY2tlZCAqLyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zeW5jSW5kZXRlcm1pbmF0ZSh0aGlzLl9pbmRldGVybWluYXRlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNSaXBwbGVEaXNhYmxlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZVJpcHBsZSB8fCB0aGlzLmRpc2FibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNZXRob2QgYmVpbmcgY2FsbGVkIHdoZW5ldmVyIHRoZSBsYWJlbCB0ZXh0IGNoYW5nZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25MYWJlbFRleHRDaGFuZ2UoKSB7CiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSBldmVudCBvZiB0aGUgYGNka09ic2VydmVDb250ZW50YCBkaXJlY3RpdmUgcnVucyBvdXRzaWRlIG9mIHRoZSB6b25lLCB0aGUgY2hlY2tib3gKICAgICAgICAgICAgLy8gY29tcG9uZW50IHdpbGwgYmUgb25seSBtYXJrZWQgZm9yIGNoZWNrLCBidXQgbm8gYWN0dWFsIGNoYW5nZSBkZXRlY3Rpb24gcnVucyBhdXRvbWF0aWNhbGx5LgogICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIGdvaW5nIGJhY2sgaW50byB0aGUgem9uZSBpbiBvcmRlciB0byB0cmlnZ2VyIGEgY2hhbmdlIGRldGVjdGlvbiB3aGljaCBjYXVzZXMKICAgICAgICAgICAgLy8gKmFsbCogY29tcG9uZW50cyB0byBiZSBjaGVja2VkIChpZiBleHBsaWNpdGx5IG1hcmtlZCBvciBub3QgdXNpbmcgT25QdXNoKSwgd2Ugb25seSB0cmlnZ2VyCiAgICAgICAgICAgIC8vIGFuIGV4cGxpY2l0IGNoYW5nZSBkZXRlY3Rpb24gZm9yIHRoZSBjaGVja2JveCB2aWV3IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICB9CiAgICAgICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuY2hlY2tlZCA9ICEhdmFsdWU7CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPbkNoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuID0gZm47CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldEFyaWFDaGVja2VkKCkgewogICAgICAgICAgICBpZiAodGhpcy5jaGVja2VkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJ3RydWUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmluZGV0ZXJtaW5hdGUgPyAnbWl4ZWQnIDogJ2ZhbHNlJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG5ld1N0YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdHJhbnNpdGlvbkNoZWNrU3RhdGUobmV3U3RhdGUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb2xkU3RhdGUgPSB0aGlzLl9jdXJyZW50Q2hlY2tTdGF0ZTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgaWYgKG9sZFN0YXRlID09PSBuZXdTdGF0ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKHRoaXMuX2N1cnJlbnRBbmltYXRpb25DbGFzcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzID0gdGhpcy5fZ2V0QW5pbWF0aW9uQ2xhc3NGb3JDaGVja1N0YXRlVHJhbnNpdGlvbihvbGRTdGF0ZSwgbmV3U3RhdGUpOwogICAgICAgICAgICB0aGlzLl9jdXJyZW50Q2hlY2tTdGF0ZSA9IG5ld1N0YXRlOwogICAgICAgICAgICBpZiAodGhpcy5fY3VycmVudEFuaW1hdGlvbkNsYXNzLmxlbmd0aCA+IDApIHsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3MpOwogICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBhbmltYXRpb24gY2xhc3MgdG8gYXZvaWQgYW5pbWF0aW9uIHdoZW4gdGhlIGNoZWNrYm94IGlzIG1vdmVkIGJldHdlZW4gY29udGFpbmVycwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYW5pbWF0aW9uQ2xhc3MgPSB0aGlzLl9jdXJyZW50QW5pbWF0aW9uQ2xhc3M7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoYW5pbWF0aW9uQ2xhc3MpOwogICAgICAgICAgICAgICAgICAgIH0pLCAxMDAwKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2VtaXRDaGFuZ2VFdmVudCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBldmVudCA9IG5ldyBNYXRDaGVja2JveENoYW5nZSgpOwogICAgICAgICAgICBldmVudC5zb3VyY2UgPSB0aGlzOwogICAgICAgICAgICBldmVudC5jaGVja2VkID0gdGhpcy5jaGVja2VkOwogICAgICAgICAgICB0aGlzLl9jb250cm9sVmFsdWVBY2Nlc3NvckNoYW5nZUZuKHRoaXMuY2hlY2tlZCk7CiAgICAgICAgICAgIHRoaXMuY2hhbmdlLmVtaXQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUb2dnbGVzIHRoZSBgY2hlY2tlZGAgc3RhdGUgb2YgdGhlIGNoZWNrYm94LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9nZ2xlKCkgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFdmVudCBoYW5kbGVyIGZvciBjaGVja2JveCBpbnB1dCBlbGVtZW50LgogICAgICAgICAqIFRvZ2dsZXMgY2hlY2tlZCBzdGF0ZSBpZiBlbGVtZW50IGlzIG5vdCBkaXNhYmxlZC4KICAgICAgICAgKiBEbyBub3QgdG9nZ2xlIG9uIChjaGFuZ2UpIGV2ZW50IHNpbmNlIElFIGRvZXNuJ3QgZmlyZSBjaGFuZ2UgZXZlbnQgd2hlbgogICAgICAgICAqICAgaW5kZXRlcm1pbmF0ZSBjaGVja2JveCBpcyBjbGlja2VkLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbklucHV0Q2xpY2soZXZlbnQpIHsKICAgICAgICAgICAgLy8gV2UgaGF2ZSB0byBzdG9wIHByb3BhZ2F0aW9uIGZvciBjbGljayBldmVudHMgb24gdGhlIHZpc3VhbCBoaWRkZW4gaW5wdXQgZWxlbWVudC4KICAgICAgICAgICAgLy8gQnkgZGVmYXVsdCwgd2hlbiBhIHVzZXIgY2xpY2tzIG9uIGEgbGFiZWwgZWxlbWVudCwgYSBnZW5lcmF0ZWQgY2xpY2sgZXZlbnQgd2lsbCBiZQogICAgICAgICAgICAvLyBkaXNwYXRjaGVkIG9uIHRoZSBhc3NvY2lhdGVkIGlucHV0IGVsZW1lbnQuIFNpbmNlIHdlIGFyZSB1c2luZyBhIGxhYmVsIGVsZW1lbnQgYXMgb3VyCiAgICAgICAgICAgIC8vIHJvb3QgY29udGFpbmVyLCB0aGUgY2xpY2sgZXZlbnQgb24gdGhlIGBjaGVja2JveGAgd2lsbCBiZSBleGVjdXRlZCB0d2ljZS4KICAgICAgICAgICAgLy8gVGhlIHJlYWwgY2xpY2sgZXZlbnQgd2lsbCBidWJibGUgdXAsIGFuZCB0aGUgZ2VuZXJhdGVkIGNsaWNrIGV2ZW50IGFsc28gdHJpZXMgdG8gYnViYmxlIHVwLgogICAgICAgICAgICAvLyBUaGlzIHdpbGwgbGVhZCB0byBtdWx0aXBsZSBjbGljayBldmVudHMuCiAgICAgICAgICAgIC8vIFByZXZlbnRpbmcgYnViYmxpbmcgZm9yIHRoZSBzZWNvbmQgZXZlbnQgd2lsbCBzb2x2ZSB0aGF0IGlzc3VlLgogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgLy8gSWYgcmVzZXRJbmRldGVybWluYXRlIGlzIGZhbHNlLCBhbmQgdGhlIGN1cnJlbnQgc3RhdGUgaXMgaW5kZXRlcm1pbmF0ZSwgZG8gbm90aGluZyBvbiBjbGljawogICAgICAgICAgICBpZiAoIXRoaXMuZGlzYWJsZWQgJiYgdGhpcy5fY2xpY2tBY3Rpb24gIT09ICdub29wJykgewogICAgICAgICAgICAgICAgLy8gV2hlbiB1c2VyIG1hbnVhbGx5IGNsaWNrIG9uIHRoZSBjaGVja2JveCwgYGluZGV0ZXJtaW5hdGVgIGlzIHNldCB0byBmYWxzZS4KICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV0ZXJtaW5hdGUgJiYgdGhpcy5fY2xpY2tBY3Rpb24gIT09ICdjaGVjaycpIHsKICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5kZXRlcm1pbmF0ZSA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV0ZXJtaW5hdGVDaGFuZ2UuZW1pdCh0aGlzLl9pbmRldGVybWluYXRlKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fdHJhbnNpdGlvbkNoZWNrU3RhdGUodGhpcy5fY2hlY2tlZCA/IDEgLyogQ2hlY2tlZCAqLyA6IDIgLyogVW5jaGVja2VkICovKTsKICAgICAgICAgICAgICAgIC8vIEVtaXQgb3VyIGN1c3RvbSBjaGFuZ2UgZXZlbnQgaWYgdGhlIG5hdGl2ZSBpbnB1dCBlbWl0dGVkIG9uZS4KICAgICAgICAgICAgICAgIC8vIEl0IGlzIGltcG9ydGFudCB0byBvbmx5IGVtaXQgaXQsIGlmIHRoZSBuYXRpdmUgaW5wdXQgdHJpZ2dlcmVkIG9uZSwgYmVjYXVzZQogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgd2FudCB0byB0cmlnZ2VyIGEgY2hhbmdlIGV2ZW50LCB3aGVuIHRoZSBgY2hlY2tlZGAgdmFyaWFibGUgY2hhbmdlcyBmb3IgZXhhbXBsZS4KICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKCF0aGlzLmRpc2FibGVkICYmIHRoaXMuX2NsaWNrQWN0aW9uID09PSAnbm9vcCcpIHsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IG5hdGl2ZSBpbnB1dCB3aGVuIGNsaWNrZWQgd2l0aCBub29wLiBUaGUgbmF0aXZlIGNoZWNrYm94IGJlY29tZXMgY2hlY2tlZCBhZnRlcgogICAgICAgICAgICAgICAgLy8gY2xpY2ssIHJlc2V0IGl0IHRvIGJlIGFsaWduIHdpdGggYGNoZWNrZWRgIHZhbHVlIG9mIGBtYXQtY2hlY2tib3hgLgogICAgICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZCA9IHRoaXMuY2hlY2tlZDsKICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmluZGV0ZXJtaW5hdGUgPSB0aGlzLmluZGV0ZXJtaW5hdGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyB0aGUgY2hlY2tib3guCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3JpZ2luCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMob3JpZ2luID0gJ2tleWJvYXJkJywgb3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5faW5wdXRFbGVtZW50LCBvcmlnaW4sIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25JbnRlcmFjdGlvbkV2ZW50KGV2ZW50KSB7CiAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBoYXZlIHRvIHN0b3AgcHJvcGFnYXRpb24gb24gdGhlIGNoYW5nZSBldmVudC4KICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHRoZSBjaGFuZ2UgZXZlbnQsIGZyb20gdGhlIGlucHV0IGVsZW1lbnQsIHdpbGwgYnViYmxlIHVwIGFuZAogICAgICAgICAgICAvLyBlbWl0IGl0cyBldmVudCBvYmplY3QgdG8gdGhlIGBjaGFuZ2VgIG91dHB1dC4KICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvbGRTdGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbmV3U3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBbmltYXRpb25DbGFzc0ZvckNoZWNrU3RhdGVUcmFuc2l0aW9uKG9sZFN0YXRlLCBuZXdTdGF0ZSkgewogICAgICAgICAgICAvLyBEb24ndCB0cmFuc2l0aW9uIGlmIGFuaW1hdGlvbnMgYXJlIGRpc2FibGVkLgogICAgICAgICAgICBpZiAodGhpcy5fYW5pbWF0aW9uTW9kZSA9PT0gJ05vb3BBbmltYXRpb25zJykgewogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGFuaW1TdWZmaXggPSAnJzsKICAgICAgICAgICAgc3dpdGNoIChvbGRTdGF0ZSkgewogICAgICAgICAgICAgICAgY2FzZSAwIC8qIEluaXQgKi86CiAgICAgICAgICAgICAgICAgICAgLy8gSGFuZGxlIGVkZ2UgY2FzZSB3aGVyZSB1c2VyIGludGVyYWN0cyB3aXRoIGNoZWNrYm94IHRoYXQgZG9lcyBub3QgaGF2ZSBbKG5nTW9kZWwpXSBvcgogICAgICAgICAgICAgICAgICAgIC8vIFtjaGVja2VkXSBib3VuZCB0byBpdC4KICAgICAgICAgICAgICAgICAgICBpZiAobmV3U3RhdGUgPT09IDEgLyogQ2hlY2tlZCAqLykgewogICAgICAgICAgICAgICAgICAgICAgICBhbmltU3VmZml4ID0gJ3VuY2hlY2tlZC1jaGVja2VkJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobmV3U3RhdGUgPT0gMyAvKiBJbmRldGVybWluYXRlICovKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1TdWZmaXggPSAndW5jaGVja2VkLWluZGV0ZXJtaW5hdGUnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMiAvKiBVbmNoZWNrZWQgKi86CiAgICAgICAgICAgICAgICAgICAgYW5pbVN1ZmZpeCA9IG5ld1N0YXRlID09PSAxIC8qIENoZWNrZWQgKi8gPwogICAgICAgICAgICAgICAgICAgICAgICAndW5jaGVja2VkLWNoZWNrZWQnIDogJ3VuY2hlY2tlZC1pbmRldGVybWluYXRlJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMSAvKiBDaGVja2VkICovOgogICAgICAgICAgICAgICAgICAgIGFuaW1TdWZmaXggPSBuZXdTdGF0ZSA9PT0gMiAvKiBVbmNoZWNrZWQgKi8gPwogICAgICAgICAgICAgICAgICAgICAgICAnY2hlY2tlZC11bmNoZWNrZWQnIDogJ2NoZWNrZWQtaW5kZXRlcm1pbmF0ZSc7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDMgLyogSW5kZXRlcm1pbmF0ZSAqLzoKICAgICAgICAgICAgICAgICAgICBhbmltU3VmZml4ID0gbmV3U3RhdGUgPT09IDEgLyogQ2hlY2tlZCAqLyA/CiAgICAgICAgICAgICAgICAgICAgICAgICdpbmRldGVybWluYXRlLWNoZWNrZWQnIDogJ2luZGV0ZXJtaW5hdGUtdW5jaGVja2VkJzsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYG1hdC1jaGVja2JveC1hbmltLSR7YW5pbVN1ZmZpeH1gOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTeW5jcyB0aGUgaW5kZXRlcm1pbmF0ZSB2YWx1ZSB3aXRoIHRoZSBjaGVja2JveCBET00gbm9kZS4KICAgICAgICAgKgogICAgICAgICAqIFdlIHN5bmMgYGluZGV0ZXJtaW5hdGVgIGRpcmVjdGx5IG9uIHRoZSBET00gbm9kZSwgYmVjYXVzZSBpbiBJdnkgdGhlIGNoZWNrIGZvciB3aGV0aGVyIGEKICAgICAgICAgKiBwcm9wZXJ0eSBpcyBzdXBwb3J0ZWQgb24gYW4gZWxlbWVudCBib2lscyBkb3duIHRvIGBpZiAocHJvcE5hbWUgaW4gZWxlbWVudClgLiBEb21pbm8ncwogICAgICAgICAqIEhUTUxJbnB1dEVsZW1lbnQgZG9lc24ndCBoYXZlIGFuIGBpbmRldGVybWluYXRlYCBwcm9wZXJ0eSBzbyBJdnkgd2lsbCB3YXJuIGR1cmluZwogICAgICAgICAqIHNlcnZlci1zaWRlIHJlbmRlcmluZy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zeW5jSW5kZXRlcm1pbmF0ZSh2YWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hdGl2ZUNoZWNrYm94ID0gdGhpcy5faW5wdXRFbGVtZW50OwogICAgICAgICAgICBpZiAobmF0aXZlQ2hlY2tib3gpIHsKICAgICAgICAgICAgICAgIG5hdGl2ZUNoZWNrYm94Lm5hdGl2ZUVsZW1lbnQuaW5kZXRlcm1pbmF0ZSA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0Q2hlY2tib3guybVmYWMgPSBmdW5jdGlvbiBNYXRDaGVja2JveF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRDaGVja2JveCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1aW5qZWN0QXR0cmlidXRlKCd0YWJpbmRleCcpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9DSEVDS0JPWF9DTElDS19BQ1RJT04sIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0NIRUNLQk9YX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9OwogICAgTWF0Q2hlY2tib3guybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0Q2hlY2tib3gsIHNlbGVjdG9yczogW1sibWF0LWNoZWNrYm94Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIE1hdENoZWNrYm94X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMCQ4LCB0cnVlKTsKICAgICAgICAgICAgybXJtXZpZXdRdWVyeShNYXRSaXBwbGUsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2lucHV0RWxlbWVudCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5yaXBwbGUgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LWNoZWNrYm94Il0sIGhvc3RWYXJzOiAxMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRDaGVja2JveF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVob3N0UHJvcGVydHkoImlkIiwgY3R4LmlkKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidGFiaW5kZXgiLCBudWxsKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUiLCBjdHguaW5kZXRlcm1pbmF0ZSkoIm1hdC1jaGVja2JveC1jaGVja2VkIiwgY3R4LmNoZWNrZWQpKCJtYXQtY2hlY2tib3gtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtY2hlY2tib3gtbGFiZWwtYmVmb3JlIiwgY3R4LmxhYmVsUG9zaXRpb24gPT0gImJlZm9yZSIpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uTW9kZSA9PT0gIk5vb3BBbmltYXRpb25zIik7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCBjb2xvcjogImNvbG9yIiwgdGFiSW5kZXg6ICJ0YWJJbmRleCIsIGFyaWFMYWJlbDogWyJhcmlhLWxhYmVsIiwgImFyaWFMYWJlbCJdLCBhcmlhTGFiZWxsZWRieTogWyJhcmlhLWxhYmVsbGVkYnkiLCAiYXJpYUxhYmVsbGVkYnkiXSwgaWQ6ICJpZCIsIGxhYmVsUG9zaXRpb246ICJsYWJlbFBvc2l0aW9uIiwgbmFtZTogIm5hbWUiLCByZXF1aXJlZDogInJlcXVpcmVkIiwgY2hlY2tlZDogImNoZWNrZWQiLCBkaXNhYmxlZDogImRpc2FibGVkIiwgaW5kZXRlcm1pbmF0ZTogImluZGV0ZXJtaW5hdGUiLCB2YWx1ZTogInZhbHVlIiB9LCBvdXRwdXRzOiB7IGNoYW5nZTogImNoYW5nZSIsIGluZGV0ZXJtaW5hdGVDaGFuZ2U6ICJpbmRldGVybWluYXRlQ2hhbmdlIiB9LCBleHBvcnRBczogWyJtYXRDaGVja2JveCJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtNQVRfQ0hFQ0tCT1hfQ09OVFJPTF9WQUxVRV9BQ0NFU1NPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzIkNCwgZGVjbHM6IDE3LCB2YXJzOiAxOSwgY29uc3RzOiBbWzEsICJtYXQtY2hlY2tib3gtbGF5b3V0Il0sIFsibGFiZWwiLCAiIl0sIFsxLCAibWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lciJdLCBbInR5cGUiLCAiY2hlY2tib3giLCAxLCAibWF0LWNoZWNrYm94LWlucHV0IiwgImNkay12aXN1YWxseS1oaWRkZW4iLCAzLCAiaWQiLCAicmVxdWlyZWQiLCAiY2hlY2tlZCIsICJkaXNhYmxlZCIsICJ0YWJJbmRleCIsICJjaGFuZ2UiLCAiY2xpY2siXSwgWyJpbnB1dCIsICIiXSwgWyJtYXRSaXBwbGUiLCAiIiwgMSwgIm1hdC1jaGVja2JveC1yaXBwbGUiLCAibWF0LWZvY3VzLWluZGljYXRvciIsIDMsICJtYXRSaXBwbGVUcmlnZ2VyIiwgIm1hdFJpcHBsZURpc2FibGVkIiwgIm1hdFJpcHBsZVJhZGl1cyIsICJtYXRSaXBwbGVDZW50ZXJlZCIsICJtYXRSaXBwbGVBbmltYXRpb24iXSwgWzEsICJtYXQtcmlwcGxlLWVsZW1lbnQiLCAibWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxlIl0sIFsxLCAibWF0LWNoZWNrYm94LWZyYW1lIl0sIFsxLCAibWF0LWNoZWNrYm94LWJhY2tncm91bmQiXSwgWyJ2ZXJzaW9uIiwgIjEuMSIsICJmb2N1c2FibGUiLCAiZmFsc2UiLCAidmlld0JveCIsICIwIDAgMjQgMjQiLCAwLCAieG1sIiwgInNwYWNlIiwgInByZXNlcnZlIiwgMSwgIm1hdC1jaGVja2JveC1jaGVja21hcmsiXSwgWyJmaWxsIiwgIm5vbmUiLCAic3Ryb2tlIiwgIndoaXRlIiwgImQiLCAiTTQuMSwxMi43IDksMTcuNiAyMC4zLDYuMyIsIDEsICJtYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGgiXSwgWzEsICJtYXQtY2hlY2tib3gtbWl4ZWRtYXJrIl0sIFsxLCAibWF0LWNoZWNrYm94LWxhYmVsIiwgMywgImNka09ic2VydmVDb250ZW50Il0sIFsiY2hlY2tib3hMYWJlbCIsICIiXSwgWzIsICJkaXNwbGF5IiwgIm5vbmUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRDaGVja2JveF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibGFiZWwiLCAwLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImlucHV0IiwgMywgNCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gTWF0Q2hlY2tib3hfVGVtcGxhdGVfaW5wdXRfY2hhbmdlXzNfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX29uSW50ZXJhY3Rpb25FdmVudCgkZXZlbnQpOyB9KSgiY2xpY2siLCBmdW5jdGlvbiBNYXRDaGVja2JveF9UZW1wbGF0ZV9pbnB1dF9jbGlja18zX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbklucHV0Q2xpY2soJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg2LCAiZGl2IiwgNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDcsICJkaXYiLCA3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg5LCAic3ZnIiwgOSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDEwLCAicGF0aCIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtW5hbWVzcGFjZUhUTUwoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMTEsICJkaXYiLCAxMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTIsICJzcGFuIiwgMTIsIDEzKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjZGtPYnNlcnZlQ29udGVudCIsIGZ1bmN0aW9uIE1hdENoZWNrYm94X1RlbXBsYXRlX3NwYW5fY2RrT2JzZXJ2ZUNvbnRlbnRfMTJfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX29uTGFiZWxUZXh0Q2hhbmdlKCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE0LCAic3BhbiIsIDE0KTsKICAgICAgICAgICAgybXJtXRleHQoMTUsICJcdTAwQTAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXByb2plY3Rpb24oMTYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICBjb25zdCBfcjAgPSDJtcm1cmVmZXJlbmNlKDEpOwogICAgICAgICAgICBjb25zdCBfcjIgPSDJtcm1cmVmZXJlbmNlKDEzKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgiZm9yIiwgY3R4LmlucHV0SWQpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lci1uby1zaWRlLW1hcmdpbiIsICFfcjIudGV4dENvbnRlbnQgfHwgIV9yMi50ZXh0Q29udGVudC50cmltKCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJpZCIsIGN0eC5pbnB1dElkKSgicmVxdWlyZWQiLCBjdHgucmVxdWlyZWQpKCJjaGVja2VkIiwgY3R4LmNoZWNrZWQpKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoInRhYkluZGV4IiwgY3R4LnRhYkluZGV4KTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidmFsdWUiLCBjdHgudmFsdWUpKCJuYW1lIiwgY3R4Lm5hbWUpKCJhcmlhLWxhYmVsIiwgY3R4LmFyaWFMYWJlbCB8fCBudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IiwgY3R4LmFyaWFMYWJlbGxlZGJ5KSgiYXJpYS1jaGVja2VkIiwgY3R4Ll9nZXRBcmlhQ2hlY2tlZCgpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlVHJpZ2dlciIsIF9yMCkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4Ll9pc1JpcHBsZURpc2FibGVkKCkpKCJtYXRSaXBwbGVSYWRpdXMiLCAyMCkoIm1hdFJpcHBsZUNlbnRlcmVkIiwgdHJ1ZSkoIm1hdFJpcHBsZUFuaW1hdGlvbiIsIMm1ybVwdXJlRnVuY3Rpb24wKDE4LCBfYzEkNykpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdFJpcHBsZSwgQ2RrT2JzZXJ2ZUNvbnRlbnRdLCBzdHlsZXM6IFsiQGtleWZyYW1lcyBtYXQtY2hlY2tib3gtZmFkZS1pbi1iYWNrZ3JvdW5kezAle29wYWNpdHk6MH01MCV7b3BhY2l0eToxfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1mYWRlLW91dC1iYWNrZ3JvdW5kezAlLDUwJXtvcGFjaXR5OjF9MTAwJXtvcGFjaXR5OjB9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LXVuY2hlY2tlZC1jaGVja2VkLWNoZWNrbWFyay1wYXRoezAlLDUwJXtzdHJva2UtZGFzaG9mZnNldDoyMi45MTAyNTl9NTAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKX0xMDAle3N0cm9rZS1kYXNob2Zmc2V0OjB9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LXVuY2hlY2tlZC1pbmRldGVybWluYXRlLW1peGVkbWFya3swJSw2OC4yJXt0cmFuc2Zvcm06c2NhbGVYKDApfTY4LjIle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsIDAsIDAsIDEpfTEwMCV7dHJhbnNmb3JtOnNjYWxlWCgxKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtY2hlY2tlZC11bmNoZWNrZWQtY2hlY2ttYXJrLXBhdGh7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjQsIDAsIDEsIDEpO3N0cm9rZS1kYXNob2Zmc2V0OjB9dG97c3Ryb2tlLWRhc2hvZmZzZXQ6LTIyLjkxMDI1OX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtY2hlY2tlZC1pbmRldGVybWluYXRlLWNoZWNrbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKTtvcGFjaXR5OjE7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX10b3tvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9fUBrZXlmcmFtZXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1jaGVja21hcmt7ZnJvbXthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjE0LCAwLCAwLCAxKTtvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9dG97b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtY2hlY2tlZC1pbmRldGVybWluYXRlLW1peGVkbWFya3tmcm9te2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246Y3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMC4xKTtvcGFjaXR5OjA7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfXRve29wYWNpdHk6MTt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtbWl4ZWRtYXJre2Zyb217YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4xNCwgMCwgMCwgMSk7b3BhY2l0eToxO3RyYW5zZm9ybTpyb3RhdGUoMGRlZyl9dG97b3BhY2l0eTowO3RyYW5zZm9ybTpyb3RhdGUoMzE1ZGVnKX19QGtleWZyYW1lcyBtYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQtbWl4ZWRtYXJrezAle2FuaW1hdGlvbi10aW1pbmctZnVuY3Rpb246bGluZWFyO29wYWNpdHk6MTt0cmFuc2Zvcm06c2NhbGVYKDEpfTMyLjglLDEwMCV7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZVgoMCl9fS5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWZyYW1le3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6MnB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwb2ludGVyLWV2ZW50czpub25lfS5tYXQtY2hlY2tib3h7dHJhbnNpdGlvbjpiYWNrZ3JvdW5kIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJveC1zaGFkb3cgMjgwbXMgY3ViaWMtYmV6aWVyKDAuNCwgMCwgMC4yLCAxKTtjdXJzb3I6cG9pbnRlcjstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1jaGVja2JveHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1jaGVja2JveCAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxlKXtvcGFjaXR5Oi4xNn0ubWF0LWNoZWNrYm94LWxheW91dHstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOmluaGVyaXQ7YWxpZ24taXRlbXM6YmFzZWxpbmU7dmVydGljYWwtYWxpZ246bWlkZGxlO2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwfS5tYXQtY2hlY2tib3gtbGFiZWx7LXdlYmtpdC11c2VyLXNlbGVjdDphdXRvOy1tb3otdXNlci1zZWxlY3Q6YXV0bzstbXMtdXNlci1zZWxlY3Q6YXV0bzt1c2VyLXNlbGVjdDphdXRvfS5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjA7bWFyZ2luOmF1dG87bWFyZ2luLXJpZ2h0OjhweDtvcmRlcjowO3Bvc2l0aW9uOnJlbGF0aXZlO3ZlcnRpY2FsLWFsaWduOm1pZGRsZTt3aGl0ZS1zcGFjZTpub3dyYXA7d2lkdGg6MTZweDtmbGV4LXNocmluazowfVtkaXI9cnRsXSAubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcnttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OmF1dG99Lm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXItbm8tc2lkZS1tYXJnaW57bWFyZ2luLWxlZnQ6MDttYXJnaW4tcmlnaHQ6MH0ubWF0LWNoZWNrYm94LWZyYW1le2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpib3JkZXItY29sb3IgOTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAwLjEpO2JvcmRlci13aWR0aDoycHg7Ym9yZGVyLXN0eWxlOnNvbGlkfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LWNoZWNrYm94LWZyYW1le3RyYW5zaXRpb246bm9uZX0ubWF0LWNoZWNrYm94LmNkay1rZXlib2FyZC1mb2N1c2VkIC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItc3R5bGU6ZG90dGVkfS5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTppbmxpbmUtZmxleDtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3RyYW5zaXRpb246YmFja2dyb3VuZC1jb2xvciA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSksb3BhY2l0eSA5MG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDAuMSl9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHt0cmFuc2l0aW9uOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWNoZWNrYm94IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kOm5vbmV9Lm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXt3aWR0aDoxMDAlO2hlaWdodDoxMDAlO3RyYW5zZm9ybTpub25lfS5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVyOmhvdmVyIC5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGV7b3BhY2l0eTouMDR9Lm1hdC1jaGVja2JveC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjEyfS5tYXQtY2hlY2tib3gtcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1jaGVja2JveC5tYXQtY2hlY2tib3gtZGlzYWJsZWQgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXI6aG92ZXIgLm1hdC1jaGVja2JveC1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5OjB9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWNoZWNrYm94LWlubmVyLWNvbnRhaW5lcjpob3ZlciAubWF0LWNoZWNrYm94LXBlcnNpc3RlbnQtcmlwcGxle2Rpc3BsYXk6bm9uZX19Lm1hdC1jaGVja2JveC1jaGVja21hcmt7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MTAwJX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjIyLjkxMDI1OTtzdHJva2UtZGFzaGFycmF5OjIyLjkxMDI1OTtzdHJva2Utd2lkdGg6Mi4xMzMzMzMzMzMzcHh9LmNkay1oaWdoLWNvbnRyYXN0LWJsYWNrLW9uLXdoaXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7c3Ryb2tlOiMwMDAgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya3t3aWR0aDpjYWxjKDEwMCUgLSA2cHgpO2hlaWdodDoycHg7b3BhY2l0eTowO3RyYW5zZm9ybTpzY2FsZVgoMCkgcm90YXRlKDBkZWcpO2JvcmRlci1yYWRpdXM6MnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHg7bWFyZ2luLXRvcDoycHh9Lm1hdC1jaGVja2JveC1sYWJlbC1iZWZvcmUgLm1hdC1jaGVja2JveC1pbm5lci1jb250YWluZXJ7b3JkZXI6MTttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OmF1dG99W2Rpcj1ydGxdIC5tYXQtY2hlY2tib3gtbGFiZWwtYmVmb3JlIC5tYXQtY2hlY2tib3gtaW5uZXItY29udGFpbmVye21hcmdpbi1sZWZ0OmF1dG87bWFyZ2luLXJpZ2h0OjhweH0ubWF0LWNoZWNrYm94LWNoZWNrZWQgLm1hdC1jaGVja2JveC1jaGVja21hcmt7b3BhY2l0eToxfS5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoe3N0cm9rZS1kYXNob2Zmc2V0OjB9Lm1hdC1jaGVja2JveC1jaGVja2VkIC5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre3RyYW5zZm9ybTpzY2FsZVgoMSkgcm90YXRlKC00NWRlZyl9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre29wYWNpdHk6MDt0cmFuc2Zvcm06cm90YXRlKDQ1ZGVnKX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2UtZGFzaG9mZnNldDowfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LW1peGVkbWFya3tvcGFjaXR5OjE7dHJhbnNmb3JtOnNjYWxlWCgxKSByb3RhdGUoMGRlZyl9Lm1hdC1jaGVja2JveC11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jaGVja2JveC1kaXNhYmxlZHtjdXJzb3I6ZGVmYXVsdH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtY2hlY2tib3gtZGlzYWJsZWR7b3BhY2l0eTouNX0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWNoZWNrZWQgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5ke2FuaW1hdGlvbjoxODBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1mYWRlLWluLWJhY2tncm91bmR9Lm1hdC1jaGVja2JveC1hbmltLXVuY2hlY2tlZC1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LXVuY2hlY2tlZC1jaGVja2VkLWNoZWNrbWFyay1wYXRofS5tYXQtY2hlY2tib3gtYW5pbS11bmNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtaW4tYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0tdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtdW5jaGVja2VkLWluZGV0ZXJtaW5hdGUtbWl4ZWRtYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1jaGVja2VkLXVuY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YW5pbWF0aW9uOjE4MG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWZhZGUtb3V0LWJhY2tncm91bmR9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGh7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtY2hlY2tlZC11bmNoZWNrZWQtY2hlY2ttYXJrLXBhdGh9Lm1hdC1jaGVja2JveC1hbmltLWNoZWNrZWQtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWNoZWNrbWFya3thbmltYXRpb246OTBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1jaGVja2VkLWluZGV0ZXJtaW5hdGUtY2hlY2ttYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1jaGVja2VkLWluZGV0ZXJtaW5hdGUgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjkwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtY2hlY2tlZC1pbmRldGVybWluYXRlLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS1jaGVja2VkIC5tYXQtY2hlY2tib3gtY2hlY2ttYXJre2FuaW1hdGlvbjo1MDBtcyBsaW5lYXIgMG1zIG1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLWNoZWNrZWQtY2hlY2ttYXJrfS5tYXQtY2hlY2tib3gtYW5pbS1pbmRldGVybWluYXRlLWNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjUwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtY2hlY2tlZC1taXhlZG1hcmt9Lm1hdC1jaGVja2JveC1hbmltLWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHthbmltYXRpb246MTgwbXMgbGluZWFyIDBtcyBtYXQtY2hlY2tib3gtZmFkZS1vdXQtYmFja2dyb3VuZH0ubWF0LWNoZWNrYm94LWFuaW0taW5kZXRlcm1pbmF0ZS11bmNoZWNrZWQgLm1hdC1jaGVja2JveC1taXhlZG1hcmt7YW5pbWF0aW9uOjMwMG1zIGxpbmVhciAwbXMgbWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUtdW5jaGVja2VkLW1peGVkbWFya30ubWF0LWNoZWNrYm94LWlucHV0e2JvdHRvbTowO2xlZnQ6NTAlfS5tYXQtY2hlY2tib3ggLm1hdC1jaGVja2JveC1yaXBwbGV7cG9zaXRpb246YWJzb2x1dGU7bGVmdDpjYWxjKDUwJSAtIDIwcHgpO3RvcDpjYWxjKDUwJSAtIDIwcHgpO2hlaWdodDo0MHB4O3dpZHRoOjQwcHg7ei1pbmRleDoxO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRDaGVja2JveC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsndGFiaW5kZXgnLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfQ0hFQ0tCT1hfQ0xJQ0tfQUNUSU9OLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9DSEVDS0JPWF9ERUZBVUxUX09QVElPTlMsXSB9XSB9CiAgICBdOwogICAgTWF0Q2hlY2tib3gucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgYXJpYUxhYmVsOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydhcmlhLWxhYmVsJyxdIH1dLAogICAgICAgIGFyaWFMYWJlbGxlZGJ5OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydhcmlhLWxhYmVsbGVkYnknLF0gfV0sCiAgICAgICAgaWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHJlcXVpcmVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBsYWJlbFBvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBpbmRldGVybWluYXRlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIF9pbnB1dEVsZW1lbnQ6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydpbnB1dCcsXSB9XSwKICAgICAgICByaXBwbGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW01hdFJpcHBsZSxdIH1dLAogICAgICAgIGNoZWNrZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpbmRldGVybWluYXRlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jaGVja2JveC9jaGVja2JveC1yZXF1aXJlZC12YWxpZGF0b3IudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTUFUX0NIRUNLQk9YX1JFUVVJUkVEX1ZBTElEQVRPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IE1hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IpKSwKICAgICAgICBtdWx0aTogdHJ1ZQogICAgfTsKICAgIC8qKgogICAgICogVmFsaWRhdG9yIGZvciBNYXRlcmlhbCBjaGVja2JveCdzIHJlcXVpcmVkIGF0dHJpYnV0ZSBpbiB0ZW1wbGF0ZS1kcml2ZW4gY2hlY2tib3guCiAgICAgKiBDdXJyZW50IENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3Igb25seSB3b3JrIHdpdGggYGlucHV0IHR5cGU9Y2hlY2tib3hgIGFuZCBkb2VzIG5vdAogICAgICogd29yayB3aXRoIGBtYXQtY2hlY2tib3hgLgogICAgICovCiAgICBjbGFzcyBNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yIGV4dGVuZHMgQ2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvciB7CiAgICB9CiAgICBNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLsm1ZmFjID0gZnVuY3Rpb24gTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9CYXNlRmFjdG9yeSh0IHx8IE1hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IpOyB9OwogICAgTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yLCBzZWxlY3RvcnM6IFtbIm1hdC1jaGVja2JveCIsICJyZXF1aXJlZCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIm1hdC1jaGVja2JveCIsICJyZXF1aXJlZCIsICIiLCAiZm9ybUNvbnRyb2wiLCAiIl0sIFsibWF0LWNoZWNrYm94IiwgInJlcXVpcmVkIiwgIiIsICJuZ01vZGVsIiwgIiJdXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbTUFUX0NIRUNLQk9YX1JFUVVJUkVEX1ZBTElEQVRPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIGNvbnN0IMm1TWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3IpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2NoZWNrYm94L2NoZWNrYm94LW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRoaXMgbW9kdWxlIGlzIHVzZWQgYnkgYm90aCBvcmlnaW5hbCBhbmQgTURDLWJhc2VkIGNoZWNrYm94IGltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNsYXNzLW5hbWUKICAgIGNsYXNzIF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlIHsKICAgIH0KICAgIF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUgfSk7CiAgICBfTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlKSgpOyB9IH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTWF0Q2hlY2tib3hSZXF1aXJlZFZhbGlkYXRvcl0sIGV4cG9ydHM6IFtNYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yXSB9KTsgfSkoKTsKICAgIGNsYXNzIE1hdENoZWNrYm94TW9kdWxlIHsKICAgIH0KICAgIE1hdENoZWNrYm94TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0Q2hlY2tib3hNb2R1bGUgfSk7CiAgICBNYXRDaGVja2JveE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdENoZWNrYm94TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdENoZWNrYm94TW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgTWF0UmlwcGxlTW9kdWxlLCBNYXRDb21tb25Nb2R1bGUsIE9ic2VydmVyc01vZHVsZSwKICAgICAgICAgICAgICAgIF9NYXRDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0Q2hlY2tib3hNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q2hlY2tib3hdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0UmlwcGxlTW9kdWxlLCBNYXRDb21tb25Nb2R1bGUsIE9ic2VydmVyc01vZHVsZSwKICAgICAgICAgICAgX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q2hlY2tib3gsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgX01hdENoZWNrYm94UmVxdWlyZWRWYWxpZGF0b3JNb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIGNvbnN0IGxpc3RlbmVyT3B0aW9ucyA9IG5vcm1hbGl6ZVBhc3NpdmVMaXN0ZW5lck9wdGlvbnMoeyBwYXNzaXZlOiB0cnVlIH0pOwogICAgLyoqCiAgICAgKiBBbiBpbmplY3RhYmxlIHNlcnZpY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBtb25pdG9yIHRoZSBhdXRvZmlsbCBzdGF0ZSBvZiBhbiBpbnB1dC4KICAgICAqIEJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYmxvZyBwb3N0OgogICAgICogaHR0cHM6Ly9tZWRpdW0uY29tL1xAYnJ1bm4vZGV0ZWN0aW5nLWF1dG9maWxsZWQtZmllbGRzLWluLWphdmFzY3JpcHQtYWVkNTk4ZDI1ZGE3CiAgICAgKi8KICAgIGNsYXNzIEF1dG9maWxsTW9uaXRvciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfcGxhdGZvcm0sIF9uZ1pvbmUpIHsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX21vbml0b3JlZEVsZW1lbnRzID0gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRPclJlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbW9uaXRvcihlbGVtZW50T3JSZWYpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wbGF0Zm9ybS5pc0Jyb3dzZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiBFTVBUWTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBjb2VyY2VFbGVtZW50KGVsZW1lbnRPclJlZik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5mbyA9IHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLmdldChlbGVtZW50KTsKICAgICAgICAgICAgaWYgKGluZm8pIHsKICAgICAgICAgICAgICAgIHJldHVybiBpbmZvLnN1YmplY3QuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNzc0NsYXNzID0gJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsZWQnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxpc3RlbmVyID0gKC8qKiBAdHlwZSB7P30gKi8gKCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgLy8gQW5pbWF0aW9uIGV2ZW50cyBmaXJlIG9uIGluaXRpYWwgZWxlbWVudCByZW5kZXIsIHdlIGNoZWNrIGZvciB0aGUgcHJlc2VuY2Ugb2YgdGhlIGF1dG9maWxsCiAgICAgICAgICAgICAgICAvLyBDU1MgY2xhc3MgdG8gbWFrZSBzdXJlIHRoaXMgaXMgYSByZWFsIGNoYW5nZSBpbiBzdGF0ZSwgbm90IGp1c3QgdGhlIGluaXRpYWwgcmVuZGVyIGJlZm9yZQogICAgICAgICAgICAgICAgLy8gd2UgZmlyZSBvZmYgZXZlbnRzLgogICAgICAgICAgICAgICAgaWYgKGV2ZW50LmFuaW1hdGlvbk5hbWUgPT09ICdjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCcgJiYKICAgICAgICAgICAgICAgICAgICAhZWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoY3NzQ2xhc3MpKSB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKGNzc0NsYXNzKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHJlc3VsdC5uZXh0KHsgdGFyZ2V0OiAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSksIGlzQXV0b2ZpbGxlZDogdHJ1ZSB9KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQuYW5pbWF0aW9uTmFtZSA9PT0gJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCcgJiYKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5jb250YWlucyhjc3NDbGFzcykpIHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoY3NzQ2xhc3MpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gcmVzdWx0Lm5leHQoeyB0YXJnZXQ6ICgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKSwgaXNBdXRvZmlsbGVkOiBmYWxzZSB9KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkpKTsKICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignYW5pbWF0aW9uc3RhcnQnLCBsaXN0ZW5lciwgbGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkJyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fbW9uaXRvcmVkRWxlbWVudHMuc2V0KGVsZW1lbnQsIHsKICAgICAgICAgICAgICAgIHN1YmplY3Q6IHJlc3VsdCwKICAgICAgICAgICAgICAgIHVubGlzdGVuOiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdhbmltYXRpb25zdGFydCcsIGxpc3RlbmVyLCBsaXN0ZW5lck9wdGlvbnMpOwogICAgICAgICAgICAgICAgfSkKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQuYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudE9yUmVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzdG9wTW9uaXRvcmluZyhlbGVtZW50T3JSZWYpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gY29lcmNlRWxlbWVudChlbGVtZW50T3JSZWYpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZm8gPSB0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5nZXQoZWxlbWVudCk7CiAgICAgICAgICAgIGlmIChpbmZvKSB7CiAgICAgICAgICAgICAgICBpbmZvLnVubGlzdGVuKCk7CiAgICAgICAgICAgICAgICBpbmZvLnN1YmplY3QuY29tcGxldGUoKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSgnY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkJyk7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Nkay10ZXh0LWZpZWxkLWF1dG9maWxsZWQnKTsKICAgICAgICAgICAgICAgIHRoaXMuX21vbml0b3JlZEVsZW1lbnRzLmRlbGV0ZShlbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9tb25pdG9yZWRFbGVtZW50cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfaW5mbwogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfaW5mbywgZWxlbWVudCkgPT4gdGhpcy5zdG9wTW9uaXRvcmluZyhlbGVtZW50KSkpOwogICAgICAgIH0KICAgIH0KICAgIEF1dG9maWxsTW9uaXRvci7JtWZhYyA9IGZ1bmN0aW9uIEF1dG9maWxsTW9uaXRvcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBdXRvZmlsbE1vbml0b3IpKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KE5nWm9uZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBdXRvZmlsbE1vbml0b3IuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQXV0b2ZpbGxNb25pdG9yLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gQXV0b2ZpbGxNb25pdG9yX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgQXV0b2ZpbGxNb25pdG9yKMm1ybVpbmplY3QoUGxhdGZvcm0pLCDJtcm1aW5qZWN0KE5nWm9uZSkpOyB9LCB0b2tlbjogQXV0b2ZpbGxNb25pdG9yLCBwcm92aWRlZEluOiAicm9vdCIgfSk7CiAgICAvKioKICAgICAqIEEgZGlyZWN0aXZlIHRoYXQgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciB0aGUgYXV0b2ZpbGwgc3RhdGUgb2YgYW4gaW5wdXQuCiAgICAgKi8KICAgIGNsYXNzIENka0F1dG9maWxsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfYXV0b2ZpbGxNb25pdG9yCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9hdXRvZmlsbE1vbml0b3IpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9hdXRvZmlsbE1vbml0b3IgPSBfYXV0b2ZpbGxNb25pdG9yOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgYXV0b2ZpbGwgc3RhdGUgb2YgdGhlIGVsZW1lbnQgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2RrQXV0b2ZpbGwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2F1dG9maWxsTW9uaXRvcgogICAgICAgICAgICAgICAgLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZikKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB0aGlzLmNka0F1dG9maWxsLmVtaXQoZXZlbnQpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2F1dG9maWxsTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICB9CiAgICB9CiAgICBDZGtBdXRvZmlsbC7JtWZhYyA9IGZ1bmN0aW9uIENka0F1dG9maWxsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka0F1dG9maWxsKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEF1dG9maWxsTW9uaXRvcikpOyB9OwogICAgQ2RrQXV0b2ZpbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQXV0b2ZpbGwsIHNlbGVjdG9yczogW1siIiwgImNka0F1dG9maWxsIiwgIiJdXSwgb3V0cHV0czogeyBjZGtBdXRvZmlsbDogImNka0F1dG9maWxsIiB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtBdXRvZmlsbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IEF1dG9maWxsTW9uaXRvciB9CiAgICBdOwogICAgQ2RrQXV0b2ZpbGwucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2RrQXV0b2ZpbGw6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvdGV4dC1maWVsZC9hdXRvc2l6ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIERpcmVjdGl2ZSB0byBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBhIHRleHRhcmVhIHRvIGZpdCBpdHMgY29udGVudC4KICAgICAqLwogICAgY2xhc3MgQ2RrVGV4dGFyZWFBdXRvc2l6ZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/PX0gZG9jdW1lbnQKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX3BsYXRmb3JtLCBfbmdab25lLCAKICAgICAgICAvKiogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgbWFrZSBkb2N1bWVudCByZXF1aXJlZCAqLwogICAgICAgIGRvY3VtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA9IF9uZ1pvbmU7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIHRoaXMuX2VuYWJsZWQgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVmFsdWUgb2YgbWluUm93cyBhcyBvZiBsYXN0IHJlc2l6ZS4gSWYgdGhlIG1pblJvd3MgaGFzIGRlY3JlYXNlZCwgdGhlCiAgICAgICAgICAgICAqIGhlaWdodCBvZiB0aGUgdGV4dGFyZWEgbmVlZHMgdG8gYmUgcmVjb21wdXRlZCB0byByZWZsZWN0IHRoZSBuZXcgbWluaW11bS4gVGhlIG1heEhlaWdodAogICAgICAgICAgICAgKiBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIHByb2JsZW0gYmVjYXVzZSBpdCBkb2VzIG5vdCBhZmZlY3QgdGhlIHRleHRhcmVhJ3Mgc2Nyb2xsSGVpZ2h0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNNaW5Sb3dzID0gLTE7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gZG9jdW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX3RleHRhcmVhRWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTsKICAgICAgICAgICAgdGhpcy5fbWVhc3VyaW5nQ2xhc3MgPSBfcGxhdGZvcm0uRklSRUZPWCA/CiAgICAgICAgICAgICAgICAnY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94JyA6CiAgICAgICAgICAgICAgICAnY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZyc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1pbmltdW0gYW1vdW50IG9mIHJvd3MgaW4gdGhlIHRleHRhcmVhLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG1pblJvd3MoKSB7IHJldHVybiB0aGlzLl9taW5Sb3dzOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1pblJvd3ModmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fbWluUm93cyA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fc2V0TWluSGVpZ2h0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1heGltdW0gYW1vdW50IG9mIHJvd3MgaW4gdGhlIHRleHRhcmVhLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG1heFJvd3MoKSB7IHJldHVybiB0aGlzLl9tYXhSb3dzOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1heFJvd3ModmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fbWF4Um93cyA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fc2V0TWF4SGVpZ2h0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgYXV0b3NpemluZyBpcyBlbmFibGVkIG9yIG5vdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGVuYWJsZWQoKSB7IHJldHVybiB0aGlzLl9lbmFibGVkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGVuYWJsZWQodmFsdWUpIHsKICAgICAgICAgICAgdmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAvLyBPbmx5IGFjdCBpZiB0aGUgYWN0dWFsIHZhbHVlIGNoYW5nZWQuIFRoaXMgc3BlY2lmaWNhbGx5IGhlbHBzIHRvIG5vdCBydW4KICAgICAgICAgICAgLy8gcmVzaXplVG9GaXRDb250ZW50IHRvbyBlYXJseSAoaS5lLiBiZWZvcmUgbmdBZnRlclZpZXdJbml0KQogICAgICAgICAgICBpZiAodGhpcy5fZW5hYmxlZCAhPT0gdmFsdWUpIHsKICAgICAgICAgICAgICAgICh0aGlzLl9lbmFibGVkID0gdmFsdWUpID8gdGhpcy5yZXNpemVUb0ZpdENvbnRlbnQodHJ1ZSkgOiB0aGlzLnJlc2V0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgbWluaW11bSBoZWlnaHQgb2YgdGhlIHRleHRhcmVhIGFzIGRldGVybWluZWQgYnkgbWluUm93cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRNaW5IZWlnaHQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWluSGVpZ2h0ID0gdGhpcy5taW5Sb3dzICYmIHRoaXMuX2NhY2hlZExpbmVIZWlnaHQgPwogICAgICAgICAgICAgICAgYCR7dGhpcy5taW5Sb3dzICogdGhpcy5fY2FjaGVkTGluZUhlaWdodH1weGAgOiBudWxsOwogICAgICAgICAgICBpZiAobWluSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0YXJlYUVsZW1lbnQuc3R5bGUubWluSGVpZ2h0ID0gbWluSGVpZ2h0OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSB0ZXh0YXJlYSBhcyBkZXRlcm1pbmVkIGJ5IG1heFJvd3MuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0TWF4SGVpZ2h0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heEhlaWdodCA9IHRoaXMubWF4Um93cyAmJiB0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0ID8KICAgICAgICAgICAgICAgIGAke3RoaXMubWF4Um93cyAqIHRoaXMuX2NhY2hlZExpbmVIZWlnaHR9cHhgIDogbnVsbDsKICAgICAgICAgICAgaWYgKG1heEhlaWdodCkgewogICAgICAgICAgICAgICAgdGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLm1heEhlaWdodCA9IG1heEhlaWdodDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgLy8gUmVtZW1iZXIgdGhlIGhlaWdodCB3aGljaCB3ZSBzdGFydGVkIHdpdGggaW4gY2FzZSBhdXRvc2l6aW5nIGlzIGRpc2FibGVkCiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsSGVpZ2h0ID0gdGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLmhlaWdodDsKICAgICAgICAgICAgICAgIHRoaXMucmVzaXplVG9GaXRDb250ZW50KCk7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICAgICAgICAgICAgICBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykKICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUoYXVkaXRUaW1lKDE2KSwgdGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpCiAgICAgICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5yZXNpemVUb0ZpdENvbnRlbnQodHJ1ZSkpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQubmV4dCgpOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2FjaGUgdGhlIGhlaWdodCBvZiBhIHNpbmdsZS1yb3cgdGV4dGFyZWEgaWYgaXQgaGFzIG5vdCBhbHJlYWR5IGJlZW4gY2FjaGVkLgogICAgICAgICAqCiAgICAgICAgICogV2UgbmVlZCB0byBrbm93IGhvdyBsYXJnZSBhIHNpbmdsZSAicm93IiBvZiBhIHRleHRhcmVhIGlzIGluIG9yZGVyIHRvIGFwcGx5IG1pblJvd3MgYW5kCiAgICAgICAgICogbWF4Um93cy4gRm9yIHRoZSBpbml0aWFsIHZlcnNpb24sIHdlIHdpbGwgYXNzdW1lIHRoYXQgdGhlIGhlaWdodCBvZiBhIHNpbmdsZSBsaW5lIGluIHRoZQogICAgICAgICAqIHRleHRhcmVhIGRvZXMgbm90IGV2ZXIgY2hhbmdlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2FjaGVUZXh0YXJlYUxpbmVIZWlnaHQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9jYWNoZWRMaW5lSGVpZ2h0KSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXNlIGEgY2xvbmUgZWxlbWVudCBiZWNhdXNlIHdlIGhhdmUgdG8gb3ZlcnJpZGUgc29tZSBzdHlsZXMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHRleHRhcmVhQ2xvbmUgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdGV4dGFyZWFFbGVtZW50LmNsb25lTm9kZShmYWxzZSkpKTsKICAgICAgICAgICAgdGV4dGFyZWFDbG9uZS5yb3dzID0gMTsKICAgICAgICAgICAgLy8gVXNlIGBwb3NpdGlvbjogYWJzb2x1dGVgIHNvIHRoYXQgdGhpcyBkb2Vzbid0IGNhdXNlIGEgYnJvd3NlciBsYXlvdXQgYW5kIHVzZQogICAgICAgICAgICAvLyBgdmlzaWJpbGl0eTogaGlkZGVuYCBzbyB0aGF0IG5vdGhpbmcgaXMgcmVuZGVyZWQuIENsZWFyIGFueSBvdGhlciBzdHlsZXMgdGhhdAogICAgICAgICAgICAvLyB3b3VsZCBhZmZlY3QgdGhlIGhlaWdodC4KICAgICAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7CiAgICAgICAgICAgIHRleHRhcmVhQ2xvbmUuc3R5bGUudmlzaWJpbGl0eSA9ICdoaWRkZW4nOwogICAgICAgICAgICB0ZXh0YXJlYUNsb25lLnN0eWxlLmJvcmRlciA9ICdub25lJzsKICAgICAgICAgICAgdGV4dGFyZWFDbG9uZS5zdHlsZS5wYWRkaW5nID0gJzAnOwogICAgICAgICAgICB0ZXh0YXJlYUNsb25lLnN0eWxlLmhlaWdodCA9ICcnOwogICAgICAgICAgICB0ZXh0YXJlYUNsb25lLnN0eWxlLm1pbkhlaWdodCA9ICcnOwogICAgICAgICAgICB0ZXh0YXJlYUNsb25lLnN0eWxlLm1heEhlaWdodCA9ICcnOwogICAgICAgICAgICAvLyBJbiBGaXJlZm94IGl0IGhhcHBlbnMgdGhhdCB0ZXh0YXJlYSBlbGVtZW50cyBhcmUgYWx3YXlzIGJpZ2dlciB0aGFuIHRoZSBzcGVjaWZpZWQgYW1vdW50CiAgICAgICAgICAgIC8vIG9mIHJvd3MuIFRoaXMgaXMgYmVjYXVzZSBGaXJlZm94IHRyaWVzIHRvIGFkZCBleHRyYSBzcGFjZSBmb3IgdGhlIGhvcml6b250YWwgc2Nyb2xsYmFyLgogICAgICAgICAgICAvLyBBcyBhIHdvcmthcm91bmQgdGhhdCByZW1vdmVzIHRoZSBleHRyYSBzcGFjZSBmb3IgdGhlIHNjcm9sbGJhciwgd2UgY2FuIGp1c3Qgc2V0IG92ZXJmbG93CiAgICAgICAgICAgIC8vIHRvIGhpZGRlbi4gVGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgaXMgbm8gaW52YWxpZCBjYWxjdWxhdGlvbiBvZiB0aGUgbGluZSBoZWlnaHQuCiAgICAgICAgICAgIC8vIFNlZSBGaXJlZm94IGJ1ZyByZXBvcnQ6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTMzNjU0CiAgICAgICAgICAgIHRleHRhcmVhQ2xvbmUuc3R5bGUub3ZlcmZsb3cgPSAnaGlkZGVuJzsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RleHRhcmVhRWxlbWVudC5wYXJlbnROb2RlKSkuYXBwZW5kQ2hpbGQodGV4dGFyZWFDbG9uZSk7CiAgICAgICAgICAgIHRoaXMuX2NhY2hlZExpbmVIZWlnaHQgPSB0ZXh0YXJlYUNsb25lLmNsaWVudEhlaWdodDsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3RleHRhcmVhRWxlbWVudC5wYXJlbnROb2RlKSkucmVtb3ZlQ2hpbGQodGV4dGFyZWFDbG9uZSk7CiAgICAgICAgICAgIC8vIE1pbiBhbmQgbWF4IGhlaWdodHMgaGF2ZSB0byBiZSByZS1jYWxjdWxhdGVkIGlmIHRoZSBjYWNoZWQgbGluZSBoZWlnaHQgY2hhbmdlcwogICAgICAgICAgICB0aGlzLl9zZXRNaW5IZWlnaHQoKTsKICAgICAgICAgICAgdGhpcy5fc2V0TWF4SGVpZ2h0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdEb0NoZWNrKCkgewogICAgICAgICAgICBpZiAodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlc2l6ZVRvRml0Q29udGVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2l6ZSB0aGUgdGV4dGFyZWEgdG8gZml0IGl0cyBjb250ZW50LgogICAgICAgICAqIEBwYXJhbSB7Pz19IGZvcmNlIFdoZXRoZXIgdG8gZm9yY2UgYSBoZWlnaHQgcmVjYWxjdWxhdGlvbi4gQnkgZGVmYXVsdCB0aGUgaGVpZ2h0IHdpbGwgYmUKICAgICAgICAgKiAgICByZWNhbGN1bGF0ZWQgb25seSBpZiB0aGUgdmFsdWUgY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCBjYWxsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzaXplVG9GaXRDb250ZW50KGZvcmNlID0gZmFsc2UpIHsKICAgICAgICAgICAgLy8gSWYgYXV0b3NpemluZyBpcyBkaXNhYmxlZCwganVzdCBza2lwIGV2ZXJ5dGhpbmcgZWxzZQogICAgICAgICAgICBpZiAoIXRoaXMuX2VuYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jYWNoZVRleHRhcmVhTGluZUhlaWdodCgpOwogICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGRldGVybWluZWQgdGhlIGxpbmUtaGVpZ2h0IHlldCwgd2Uga25vdyB3ZSdyZSBzdGlsbCBoaWRkZW4gYW5kIHRoZXJlJ3Mgbm8gcG9pbnQKICAgICAgICAgICAgLy8gaW4gY2hlY2tpbmcgdGhlIGhlaWdodCBvZiB0aGUgdGV4dGFyZWEuCiAgICAgICAgICAgIGlmICghdGhpcy5fY2FjaGVkTGluZUhlaWdodCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGV4dGFyZWEgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB0ZXh0YXJlYS52YWx1ZTsKICAgICAgICAgICAgLy8gT25seSByZXNpemUgaWYgdGhlIHZhbHVlIG9yIG1pblJvd3MgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZXNlIGNhbGN1bGF0aW9ucyBjYW4gYmUgZXhwZW5zaXZlLgogICAgICAgICAgICBpZiAoIWZvcmNlICYmIHRoaXMuX21pblJvd3MgPT09IHRoaXMuX3ByZXZpb3VzTWluUm93cyAmJiB2YWx1ZSA9PT0gdGhpcy5fcHJldmlvdXNWYWx1ZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXJUZXh0ID0gdGV4dGFyZWEucGxhY2Vob2xkZXI7CiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSB0ZXh0YXJlYSBoZWlnaHQgdG8gYXV0byBpbiBvcmRlciB0byBzaHJpbmsgYmFjayB0byBpdHMgZGVmYXVsdCBzaXplLgogICAgICAgICAgICAvLyBBbHNvIHRlbXBvcmFyaWx5IGZvcmNlIG92ZXJmbG93OmhpZGRlbiwgc28gc2Nyb2xsIGJhcnMgZG8gbm90IGludGVyZmVyZSB3aXRoIGNhbGN1bGF0aW9ucy4KICAgICAgICAgICAgLy8gTG9uZyBwbGFjZWhvbGRlcnMgdGhhdCBhcmUgd2lkZXIgdGhhbiB0aGUgdGV4dGFyZWEgd2lkdGggbWF5IGxlYWQgdG8gYSBiaWdnZXIgc2Nyb2xsSGVpZ2h0CiAgICAgICAgICAgIC8vIHZhbHVlLiBUbyBlbnN1cmUgdGhhdCB0aGUgc2Nyb2xsSGVpZ2h0IGlzIG5vdCBiaWdnZXIgdGhhbiB0aGUgY29udGVudCwgdGhlIHBsYWNlaG9sZGVycwogICAgICAgICAgICAvLyBuZWVkIHRvIGJlIHJlbW92ZWQgdGVtcG9yYXJpbHkuCiAgICAgICAgICAgIHRleHRhcmVhLmNsYXNzTGlzdC5hZGQodGhpcy5fbWVhc3VyaW5nQ2xhc3MpOwogICAgICAgICAgICB0ZXh0YXJlYS5wbGFjZWhvbGRlciA9ICcnOwogICAgICAgICAgICAvLyBUaGUgbWVhc3VyaW5nIGNsYXNzIGluY2x1ZGVzIGEgMnB4IHBhZGRpbmcgdG8gd29ya2Fyb3VuZCBhbiBpc3N1ZSB3aXRoIENocm9tZSwKICAgICAgICAgICAgLy8gc28gd2UgYWNjb3VudCBmb3IgdGhhdCBleHRyYSBzcGFjZSBoZXJlIGJ5IHN1YnRyYWN0aW5nIDQgKDJweCB0b3AgKyAycHggYm90dG9tKS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoZWlnaHQgPSB0ZXh0YXJlYS5zY3JvbGxIZWlnaHQgLSA0OwogICAgICAgICAgICAvLyBVc2UgdGhlIHNjcm9sbEhlaWdodCB0byBrbm93IGhvdyBsYXJnZSB0aGUgdGV4dGFyZWEgKndvdWxkKiBiZSBpZiBmaXQgaXRzIGVudGlyZSB2YWx1ZS4KICAgICAgICAgICAgdGV4dGFyZWEuc3R5bGUuaGVpZ2h0ID0gYCR7aGVpZ2h0fXB4YDsKICAgICAgICAgICAgdGV4dGFyZWEuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLl9tZWFzdXJpbmdDbGFzcyk7CiAgICAgICAgICAgIHRleHRhcmVhLnBsYWNlaG9sZGVyID0gcGxhY2Vob2xkZXJUZXh0OwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX3Njcm9sbFRvQ2FyZXRQb3NpdGlvbih0ZXh0YXJlYSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2Nyb2xsVG9DYXJldFBvc2l0aW9uKHRleHRhcmVhKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzVmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNNaW5Sb3dzID0gdGhpcy5fbWluUm93czsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzZXRzIHRoZSB0ZXh0YXJlYSB0byBpdHMgb3JpZ2luYWwgc2l6ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzZXQoKSB7CiAgICAgICAgICAgIC8vIERvIG5vdCB0cnkgdG8gY2hhbmdlIHRoZSB0ZXh0YXJlYSwgaWYgdGhlIGluaXRpYWxIZWlnaHQgaGFzIG5vdCBiZWVuIGRldGVybWluZWQgeWV0CiAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgcG90ZW50aWFsbHkgcmVtb3ZlIHN0eWxlcyB3aGVuIHJlc2V0KCkgaXMgY2FsbGVkIGJlZm9yZSBuZ0FmdGVyVmlld0luaXQKICAgICAgICAgICAgaWYgKHRoaXMuX2luaXRpYWxIZWlnaHQgIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhpcy5fdGV4dGFyZWFFbGVtZW50LnN0eWxlLmhlaWdodCA9IHRoaXMuX2luaXRpYWxIZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSW4gSXZ5IHRoZSBgaG9zdGAgbWV0YWRhdGEgd2lsbCBiZSBtZXJnZWQsIHdoZXJlYXMgaW4gVmlld0VuZ2luZSBpdCBpcyBvdmVycmlkZGVuLiBJbiBvcmRlcgogICAgICAgIC8vIHRvIGF2b2lkIGRvdWJsZSBldmVudCBsaXN0ZW5lcnMsIHdlIG5lZWQgdG8gdXNlIGBIb3N0TGlzdGVuZXJgLiBPbmNlIEl2eSBpcyB0aGUgZGVmYXVsdCwgd2UKICAgICAgICAvLyBjYW4gbW92ZSB0aGlzIGJhY2sgaW50byBgaG9zdGAuCiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8taG9zdC1kZWNvcmF0b3ItaW4tY29uY3JldGUKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ub29wSW5wdXRIYW5kbGVyKCkgewogICAgICAgICAgICAvLyBuby1vcCBoYW5kbGVyIHRoYXQgZW5zdXJlcyB3ZSdyZSBydW5uaW5nIGNoYW5nZSBkZXRlY3Rpb24gb24gaW5wdXQgZXZlbnRzLgogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBY2Nlc3MgaW5qZWN0ZWQgZG9jdW1lbnQgaWYgYXZhaWxhYmxlIG9yIGZhbGxiYWNrIHRvIGdsb2JhbCBkb2N1bWVudCByZWZlcmVuY2UKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldERvY3VtZW50KCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZG9jdW1lbnQgfHwgZG9jdW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFdpbmRvdygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb2MgPSB0aGlzLl9nZXREb2N1bWVudCgpOwogICAgICAgICAgICByZXR1cm4gZG9jLmRlZmF1bHRWaWV3IHx8IHdpbmRvdzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2Nyb2xscyBhIHRleHRhcmVhIHRvIHRoZSBjYXJldCBwb3NpdGlvbi4gT24gRmlyZWZveCByZXNpemluZyB0aGUgdGV4dGFyZWEgd2lsbAogICAgICAgICAqIHByZXZlbnQgaXQgZnJvbSBzY3JvbGxpbmcgdG8gdGhlIGNhcmV0IHBvc2l0aW9uLiBXZSBuZWVkIHRvIHJlLXNldCB0aGUgc2VsZWN0aW9uCiAgICAgICAgICogaW4gb3JkZXIgZm9yIGl0IHRvIHNjcm9sbCB0byB0aGUgcHJvcGVyIHBvc2l0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZXh0YXJlYQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Njcm9sbFRvQ2FyZXRQb3NpdGlvbih0ZXh0YXJlYSkgewogICAgICAgICAgICBjb25zdCB7IHNlbGVjdGlvblN0YXJ0LCBzZWxlY3Rpb25FbmQgfSA9IHRleHRhcmVhOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5fZ2V0RG9jdW1lbnQoKTsKICAgICAgICAgICAgLy8gSUUgd2lsbCB0aHJvdyBhbiAiVW5zcGVjaWZpZWQgZXJyb3IiIGlmIHdlIHRyeSB0byBzZXQgdGhlIHNlbGVjdGlvbiByYW5nZSBhZnRlciB0aGUKICAgICAgICAgICAgLy8gZWxlbWVudCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIERPTS4gQXNzZXJ0IHRoYXQgdGhlIGRpcmVjdGl2ZSBoYXNuJ3QgYmVlbiBkZXN0cm95ZWQKICAgICAgICAgICAgLy8gYmV0d2VlbiB0aGUgdGltZSB3ZSByZXF1ZXN0ZWQgdGhlIGFuaW1hdGlvbiBmcmFtZSBhbmQgd2hlbiBpdCB3YXMgZXhlY3V0ZWQuCiAgICAgICAgICAgIC8vIEFsc28gbm90ZSB0aGF0IHdlIGhhdmUgdG8gYXNzZXJ0IHRoYXQgdGhlIHRleHRhcmVhIGlzIGZvY3VzZWQgYmVmb3JlIHdlIHNldCB0aGUKICAgICAgICAgICAgLy8gc2VsZWN0aW9uIHJhbmdlLiBTZXR0aW5nIHRoZSBzZWxlY3Rpb24gcmFuZ2Ugb24gYSBub24tZm9jdXNlZCB0ZXh0YXJlYSB3aWxsIGNhdXNlCiAgICAgICAgICAgIC8vIGl0IHRvIHJlY2VpdmUgZm9jdXMgb24gSUUgYW5kIEVkZ2UuCiAgICAgICAgICAgIGlmICghdGhpcy5fZGVzdHJveWVkLmlzU3RvcHBlZCAmJiBkb2N1bWVudC5hY3RpdmVFbGVtZW50ID09PSB0ZXh0YXJlYSkgewogICAgICAgICAgICAgICAgdGV4dGFyZWEuc2V0U2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uU3RhcnQsIHNlbGVjdGlvbkVuZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBDZGtUZXh0YXJlYUF1dG9zaXplLsm1ZmFjID0gZnVuY3Rpb24gQ2RrVGV4dGFyZWFBdXRvc2l6ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtUZXh0YXJlYUF1dG9zaXplKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfTsKICAgIENka1RleHRhcmVhQXV0b3NpemUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrVGV4dGFyZWFBdXRvc2l6ZSwgc2VsZWN0b3JzOiBbWyJ0ZXh0YXJlYSIsICJjZGtUZXh0YXJlYUF1dG9zaXplIiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvd3MiLCAiMSIsIDEsICJjZGstdGV4dGFyZWEtYXV0b3NpemUiXSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBDZGtUZXh0YXJlYUF1dG9zaXplX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIENka1RleHRhcmVhQXV0b3NpemVfaW5wdXRfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9ub29wSW5wdXRIYW5kbGVyKCk7IH0pOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IG1pblJvd3M6IFsiY2RrQXV0b3NpemVNaW5Sb3dzIiwgIm1pblJvd3MiXSwgbWF4Um93czogWyJjZGtBdXRvc2l6ZU1heFJvd3MiLCAibWF4Um93cyJdLCBlbmFibGVkOiBbImNka1RleHRhcmVhQXV0b3NpemUiLCAiZW5hYmxlZCJdIH0sIGV4cG9ydEFzOiBbImNka1RleHRhcmVhQXV0b3NpemUiXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrVGV4dGFyZWFBdXRvc2l6ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIENka1RleHRhcmVhQXV0b3NpemUucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbWluUm93czogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQXV0b3NpemVNaW5Sb3dzJyxdIH1dLAogICAgICAgIG1heFJvd3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2Nka0F1dG9zaXplTWF4Um93cycsXSB9XSwKICAgICAgICBlbmFibGVkOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjZGtUZXh0YXJlYUF1dG9zaXplJyxdIH1dLAogICAgICAgIF9ub29wSW5wdXRIYW5kbGVyOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnaW5wdXQnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3RleHQtZmllbGQvdGV4dC1maWVsZC1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGV4dEZpZWxkTW9kdWxlIHsKICAgIH0KICAgIFRleHRGaWVsZE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFRleHRGaWVsZE1vZHVsZSB9KTsKICAgIFRleHRGaWVsZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRleHRGaWVsZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXh0RmllbGRNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbUGxhdGZvcm1Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFRleHRGaWVsZE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtBdXRvZmlsbCwKICAgICAgICAgICAgQ2RrVGV4dGFyZWFBdXRvc2l6ZV07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtQbGF0Zm9ybU1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtBdXRvZmlsbCwKICAgICAgICAgICAgQ2RrVGV4dGFyZWFBdXRvc2l6ZV07IH0gfSk7IH0pKCk7CgogICAgY2xhc3MgTWF0VGV4dGFyZWFBdXRvc2l6ZSBleHRlbmRzIENka1RleHRhcmVhQXV0b3NpemUgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG1hdEF1dG9zaXplTWluUm93cygpIHsgcmV0dXJuIHRoaXMubWluUm93czsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBtYXRBdXRvc2l6ZU1pblJvd3ModmFsdWUpIHsgdGhpcy5taW5Sb3dzID0gdmFsdWU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtYXRBdXRvc2l6ZU1heFJvd3MoKSB7IHJldHVybiB0aGlzLm1heFJvd3M7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbWF0QXV0b3NpemVNYXhSb3dzKHZhbHVlKSB7IHRoaXMubWF4Um93cyA9IHZhbHVlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbWF0QXV0b3NpemUoKSB7IHJldHVybiB0aGlzLmVuYWJsZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbWF0QXV0b3NpemUodmFsdWUpIHsgdGhpcy5lbmFibGVkID0gdmFsdWU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtYXRUZXh0YXJlYUF1dG9zaXplKCkgeyByZXR1cm4gdGhpcy5lbmFibGVkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1hdFRleHRhcmVhQXV0b3NpemUodmFsdWUpIHsgdGhpcy5lbmFibGVkID0gdmFsdWU7IH0KICAgIH0KICAgIE1hdFRleHRhcmVhQXV0b3NpemUuybVmYWMgPSBmdW5jdGlvbiBNYXRUZXh0YXJlYUF1dG9zaXplX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRUZXh0YXJlYUF1dG9zaXplX0Jhc2VGYWN0b3J5KHQgfHwgTWF0VGV4dGFyZWFBdXRvc2l6ZSk7IH07CiAgICBNYXRUZXh0YXJlYUF1dG9zaXplLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFRleHRhcmVhQXV0b3NpemUsIHNlbGVjdG9yczogW1sidGV4dGFyZWEiLCAibWF0LWF1dG9zaXplIiwgIiJdLCBbInRleHRhcmVhIiwgIm1hdFRleHRhcmVhQXV0b3NpemUiLCAiIl1dLCBob3N0QXR0cnM6IFsicm93cyIsICIxIiwgMSwgImNkay10ZXh0YXJlYS1hdXRvc2l6ZSIsICJtYXQtYXV0b3NpemUiXSwgaW5wdXRzOiB7IGNka0F1dG9zaXplTWluUm93czogImNka0F1dG9zaXplTWluUm93cyIsIGNka0F1dG9zaXplTWF4Um93czogImNka0F1dG9zaXplTWF4Um93cyIsIG1hdEF1dG9zaXplTWluUm93czogIm1hdEF1dG9zaXplTWluUm93cyIsIG1hdEF1dG9zaXplTWF4Um93czogIm1hdEF1dG9zaXplTWF4Um93cyIsIG1hdEF1dG9zaXplOiBbIm1hdC1hdXRvc2l6ZSIsICJtYXRBdXRvc2l6ZSJdLCBtYXRUZXh0YXJlYUF1dG9zaXplOiAibWF0VGV4dGFyZWFBdXRvc2l6ZSIgfSwgZXhwb3J0QXM6IFsibWF0VGV4dGFyZWFBdXRvc2l6ZSJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgTWF0VGV4dGFyZWFBdXRvc2l6ZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBtYXRBdXRvc2l6ZU1pblJvd3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1hdEF1dG9zaXplTWF4Um93czogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbWF0QXV0b3NpemU6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdC1hdXRvc2l6ZScsXSB9XSwKICAgICAgICBtYXRUZXh0YXJlYUF1dG9zaXplOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIGNvbnN0IMm1TWF0VGV4dGFyZWFBdXRvc2l6ZV9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdFRleHRhcmVhQXV0b3NpemUpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL2lucHV0L2lucHV0LWVycm9ycy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBsaWNlbnNlCiAgICAgKiBDb3B5cmlnaHQgR29vZ2xlIExMQyBBbGwgUmlnaHRzIFJlc2VydmVkLgogICAgICoKICAgICAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCiAgICAgKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vYW5ndWxhci5pby9saWNlbnNlCiAgICAgKi8KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gdHlwZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0SW5wdXRVbnN1cHBvcnRlZFR5cGVFcnJvcih0eXBlKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBJbnB1dCB0eXBlICIke3R5cGV9IiBpc24ndCBzdXBwb3J0ZWQgYnkgbWF0SW5wdXQuYCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvaW5wdXQvaW5wdXQtdmFsdWUtYWNjZXNzb3IudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBUaGlzIHRva2VuIGlzIHVzZWQgdG8gaW5qZWN0IHRoZSBvYmplY3Qgd2hvc2UgdmFsdWUgc2hvdWxkIGJlIHNldCBpbnRvIGBNYXRJbnB1dGAuIElmIG5vbmUgaXMKICAgICAqIHByb3ZpZGVkLCB0aGUgbmF0aXZlIGBIVE1MSW5wdXRFbGVtZW50YCBpcyB1c2VkLiBEaXJlY3RpdmVzIGxpa2UgYE1hdERhdGVwaWNrZXJJbnB1dGAgY2FuIHByb3ZpZGUKICAgICAqIHRoZW1zZWx2ZXMgZm9yIHRoaXMgdG9rZW4sIGluIG9yZGVyIHRvIG1ha2UgYE1hdElucHV0YCBkZWxlZ2F0ZSB0aGUgZ2V0dGluZyBhbmQgc2V0dGluZyBvZiB0aGUKICAgICAqIHZhbHVlIHRvIHRoZW0uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0lOUFVUX1ZBTFVFX0FDQ0VTU09SID0gbmV3IEluamVjdGlvblRva2VuKCdNQVRfSU5QVVRfVkFMVUVfQUNDRVNTT1InKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pbnB1dC9pbnB1dC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBJbnZhbGlkIGlucHV0IHR5cGUuIFVzaW5nIG9uZSBvZiB0aGVzZSB3aWxsIHRocm93IGFuIE1hdElucHV0VW5zdXBwb3J0ZWRUeXBlRXJyb3IuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBNQVRfSU5QVVRfSU5WQUxJRF9UWVBFUyA9IFsKICAgICAgICAnYnV0dG9uJywKICAgICAgICAnY2hlY2tib3gnLAogICAgICAgICdmaWxlJywKICAgICAgICAnaGlkZGVuJywKICAgICAgICAnaW1hZ2UnLAogICAgICAgICdyYWRpbycsCiAgICAgICAgJ3JhbmdlJywKICAgICAgICAncmVzZXQnLAogICAgICAgICdzdWJtaXQnCiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgbGV0IG5leHRVbmlxdWVJZCQ2ID0gMDsKICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0SW5wdXQuCiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdElucHV0QmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybQogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm1Hcm91cAogICAgICAgICAqIEBwYXJhbSB7P30gbmdDb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciwgX3BhcmVudEZvcm0sIF9wYXJlbnRGb3JtR3JvdXAsIG5nQ29udHJvbCkgewogICAgICAgICAgICB0aGlzLl9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIgPSBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRGb3JtID0gX3BhcmVudEZvcm07CiAgICAgICAgICAgIHRoaXMuX3BhcmVudEZvcm1Hcm91cCA9IF9wYXJlbnRGb3JtR3JvdXA7CiAgICAgICAgICAgIHRoaXMubmdDb250cm9sID0gbmdDb250cm9sOwogICAgICAgIH0KICAgIH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IF9NYXRJbnB1dE1peGluQmFzZSA9IG1peGluRXJyb3JTdGF0ZShNYXRJbnB1dEJhc2UpOwogICAgLyoqCiAgICAgKiBEaXJlY3RpdmUgdGhhdCBhbGxvd3MgYSBuYXRpdmUgaW5wdXQgdG8gd29yayBpbnNpZGUgYSBgTWF0Rm9ybUZpZWxkYC4KICAgICAqLwogICAgY2xhc3MgTWF0SW5wdXQgZXh0ZW5kcyBfTWF0SW5wdXRNaXhpbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9wbGF0Zm9ybQogICAgICAgICAqIEBwYXJhbSB7P30gbmdDb250cm9sCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybQogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm1Hcm91cAogICAgICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcgogICAgICAgICAqIEBwYXJhbSB7P30gaW5wdXRWYWx1ZUFjY2Vzc29yCiAgICAgICAgICogQHBhcmFtIHs/fSBfYXV0b2ZpbGxNb25pdG9yCiAgICAgICAgICogQHBhcmFtIHs/fSBuZ1pvbmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgX3BsYXRmb3JtLCBuZ0NvbnRyb2wsIF9wYXJlbnRGb3JtLCBfcGFyZW50Rm9ybUdyb3VwLCBfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBpbnB1dFZhbHVlQWNjZXNzb3IsIF9hdXRvZmlsbE1vbml0b3IsIG5nWm9uZSkgewogICAgICAgICAgICBzdXBlcihfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBfcGFyZW50Rm9ybSwgX3BhcmVudEZvcm1Hcm91cCwgbmdDb250cm9sKTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSBuZ0NvbnRyb2w7CiAgICAgICAgICAgIHRoaXMuX2F1dG9maWxsTW9uaXRvciA9IF9hdXRvZmlsbE1vbml0b3I7CiAgICAgICAgICAgIHRoaXMuX3VpZCA9IGBtYXQtaW5wdXQtJHtuZXh0VW5pcXVlSWQkNisrfWA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmZvY3VzZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY29udHJvbFR5cGUgPSAnbWF0LWlucHV0JzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXV0b2ZpbGxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9yZXF1aXJlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl90eXBlID0gJ3RleHQnOwogICAgICAgICAgICB0aGlzLl9yZWFkb25seSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9uZXZlckVtcHR5SW5wdXRUeXBlcyA9IFsKICAgICAgICAgICAgICAgICdkYXRlJywKICAgICAgICAgICAgICAgICdkYXRldGltZScsCiAgICAgICAgICAgICAgICAnZGF0ZXRpbWUtbG9jYWwnLAogICAgICAgICAgICAgICAgJ21vbnRoJywKICAgICAgICAgICAgICAgICd0aW1lJywKICAgICAgICAgICAgICAgICd3ZWVrJwogICAgICAgICAgICBdLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdCA9PiBnZXRTdXBwb3J0ZWRJbnB1dFR5cGVzKCkuaGFzKHQpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBub2RlTmFtZSA9IGVsZW1lbnQubm9kZU5hbWUudG9Mb3dlckNhc2UoKTsKICAgICAgICAgICAgLy8gSWYgbm8gaW5wdXQgdmFsdWUgYWNjZXNzb3Igd2FzIGV4cGxpY2l0bHkgc3BlY2lmaWVkLCB1c2UgdGhlIGVsZW1lbnQgYXMgdGhlIGlucHV0IHZhbHVlCiAgICAgICAgICAgIC8vIGFjY2Vzc29yLgogICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlQWNjZXNzb3IgPSBpbnB1dFZhbHVlQWNjZXNzb3IgfHwgZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgIC8vIEZvcmNlIHNldHRlciB0byBiZSBjYWxsZWQgaW4gY2FzZSBpZCB3YXMgbm90IHNwZWNpZmllZC4KICAgICAgICAgICAgdGhpcy5pZCA9IHRoaXMuaWQ7CiAgICAgICAgICAgIC8vIE9uIHNvbWUgdmVyc2lvbnMgb2YgaU9TIHRoZSBjYXJldCBnZXRzIHN0dWNrIGluIHRoZSB3cm9uZyBwbGFjZSB3aGVuIGhvbGRpbmcgZG93biB0aGUgZGVsZXRlCiAgICAgICAgICAgIC8vIGtleS4gSW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGlzIHdlIG5lZWQgdG8gImppZ2dsZSIgdGhlIGNhcmV0IGxvb3NlLiBTaW5jZSB0aGlzIGJ1ZyBvbmx5CiAgICAgICAgICAgIC8vIGV4aXN0cyBvbiBpT1MsIHdlIG9ubHkgYm90aGVyIHRvIGluc3RhbGwgdGhlIGxpc3RlbmVyIG9uIGlPUy4KICAgICAgICAgICAgaWYgKF9wbGF0Zm9ybS5JT1MpIHsKICAgICAgICAgICAgICAgIG5nWm9uZS5ydW5PdXRzaWRlQW5ndWxhcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXl1cCcsICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBsZXQgZWwgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZWwudmFsdWUgJiYgIWVsLnNlbGVjdGlvblN0YXJ0ICYmICFlbC5zZWxlY3Rpb25FbmQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IEp1c3Qgc2V0dGluZyBgMCwgMGAgZG9lc24ndCBmaXggdGhlIGlzc3VlLiBTZXR0aW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgMSwgMWAgZml4ZXMgaXQgZm9yIHRoZSBmaXJzdCB0aW1lIHRoYXQgeW91IHR5cGUgdGV4dCBhbmQKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZW4gaG9sZCBkZWxldGUuIFRvZ2dsaW5nIHRvIGAxLCAxYCBhbmQgdGhlbiBiYWNrIHRvCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBgMCwgMGAgc2VlbXMgdG8gY29tcGxldGVseSBmaXggaXQuCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbC5zZXRTZWxlY3Rpb25SYW5nZSgxLCAxKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsLnNldFNlbGVjdGlvblJhbmdlKDAsIDApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2lzU2VydmVyID0gIXRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcjsKICAgICAgICAgICAgdGhpcy5faXNOYXRpdmVTZWxlY3QgPSBub2RlTmFtZSA9PT0gJ3NlbGVjdCc7CiAgICAgICAgICAgIHRoaXMuX2lzVGV4dGFyZWEgPSBub2RlTmFtZSA9PT0gJ3RleHRhcmVhJzsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzTmF0aXZlU2VsZWN0KSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRyb2xUeXBlID0gKCgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSkpLm11bHRpcGxlID8gJ21hdC1uYXRpdmUtc2VsZWN0LW11bHRpcGxlJyA6CiAgICAgICAgICAgICAgICAgICAgJ21hdC1uYXRpdmUtc2VsZWN0JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlZCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sICYmIHRoaXMubmdDb250cm9sLmRpc2FibGVkICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICAvLyBCcm93c2VycyBtYXkgbm90IGZpcmUgdGhlIGJsdXIgZXZlbnQgaWYgdGhlIGlucHV0IGlzIGRpc2FibGVkIHRvbyBxdWlja2x5LgogICAgICAgICAgICAvLyBSZXNldCBmcm9tIGhlcmUgdG8gZW5zdXJlIHRoYXQgdGhlIGVsZW1lbnQgZG9lc24ndCBiZWNvbWUgc3R1Y2suCiAgICAgICAgICAgIGlmICh0aGlzLmZvY3VzZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGlkKCkgeyByZXR1cm4gdGhpcy5faWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgaWQodmFsdWUpIHsgdGhpcy5faWQgPSB2YWx1ZSB8fCB0aGlzLl91aWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByZXF1aXJlZCgpIHsgcmV0dXJuIHRoaXMuX3JlcXVpcmVkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHJlcXVpcmVkKHZhbHVlKSB7IHRoaXMuX3JlcXVpcmVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIElucHV0IHR5cGUgb2YgdGhlIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdHlwZSgpIHsgcmV0dXJuIHRoaXMuX3R5cGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgdHlwZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl90eXBlID0gdmFsdWUgfHwgJ3RleHQnOwogICAgICAgICAgICB0aGlzLl92YWxpZGF0ZVR5cGUoKTsKICAgICAgICAgICAgLy8gV2hlbiB1c2luZyBBbmd1bGFyIGlucHV0cywgZGV2ZWxvcGVycyBhcmUgbm8gbG9uZ2VyIGFibGUgdG8gc2V0IHRoZSBwcm9wZXJ0aWVzIG9uIHRoZSBuYXRpdmUKICAgICAgICAgICAgLy8gaW5wdXQgZWxlbWVudC4gVG8gZW5zdXJlIHRoYXQgYmluZGluZ3MgZm9yIGB0eXBlYCB3b3JrLCB3ZSBuZWVkIHRvIHN5bmMgdGhlIHNldHRlcgogICAgICAgICAgICAvLyB3aXRoIHRoZSBuYXRpdmUgcHJvcGVydHkuIFRleHRhcmVhIGVsZW1lbnRzIGRvbid0IHN1cHBvcnQgdGhlIHR5cGUgcHJvcGVydHkgb3IgYXR0cmlidXRlLgogICAgICAgICAgICBpZiAoIXRoaXMuX2lzVGV4dGFyZWEgJiYgZ2V0U3VwcG9ydGVkSW5wdXRUeXBlcygpLmhhcyh0aGlzLl90eXBlKSkgewogICAgICAgICAgICAgICAgKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKSkudHlwZSA9IHRoaXMuX3R5cGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmFsdWUoKSB7IHJldHVybiB0aGlzLl9pbnB1dFZhbHVlQWNjZXNzb3IudmFsdWU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgdmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSB0aGlzLnZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pbnB1dFZhbHVlQWNjZXNzb3IudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBlbGVtZW50IGlzIHJlYWRvbmx5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJlYWRvbmx5KCkgeyByZXR1cm4gdGhpcy5fcmVhZG9ubHk7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcmVhZG9ubHkodmFsdWUpIHsgdGhpcy5fcmVhZG9ubHkgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtLmlzQnJvd3NlcikgewogICAgICAgICAgICAgICAgdGhpcy5fYXV0b2ZpbGxNb25pdG9yLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgZXZlbnQgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuYXV0b2ZpbGxlZCA9IGV2ZW50LmlzQXV0b2ZpbGxlZDsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcygpIHsKICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5jb21wbGV0ZSgpOwogICAgICAgICAgICBpZiAodGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdXRvZmlsbE1vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nRG9DaGVjaygpIHsKICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7CiAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHJlLWV2YWx1YXRlIHRoaXMgb24gZXZlcnkgY2hhbmdlIGRldGVjdGlvbiBjeWNsZSwgYmVjYXVzZSB0aGVyZSBhcmUgc29tZQogICAgICAgICAgICAgICAgLy8gZXJyb3IgdHJpZ2dlcnMgdGhhdCB3ZSBjYW4ndCBzdWJzY3JpYmUgdG8gKGUuZy4gcGFyZW50IGZvcm0gc3VibWlzc2lvbnMpLiBUaGlzIG1lYW5zCiAgICAgICAgICAgICAgICAvLyB0aGF0IHdoYXRldmVyIGxvZ2ljIGlzIGluIGhlcmUgaGFzIHRvIGJlIHN1cGVyIGxlYW4gb3Igd2UgcmlzayBkZXN0cm95aW5nIHRoZSBwZXJmb3JtYW5jZS4KICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlRXJyb3JTdGF0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZGlydHktY2hlY2sgdGhlIG5hdGl2ZSBlbGVtZW50J3MgdmFsdWUsIGJlY2F1c2UgdGhlcmUgYXJlIHNvbWUgY2FzZXMgd2hlcmUKICAgICAgICAgICAgLy8gd2Ugd29uJ3QgYmUgbm90aWZpZWQgd2hlbiBpdCBjaGFuZ2VzIChlLmcuIHRoZSBjb25zdW1lciBpc24ndCB1c2luZyBmb3JtcyBvciB0aGV5J3JlCiAgICAgICAgICAgIC8vIHVwZGF0aW5nIHRoZSB2YWx1ZSB1c2luZyBgZW1pdEV2ZW50OiBmYWxzZWApLgogICAgICAgICAgICB0aGlzLl9kaXJ0eUNoZWNrTmF0aXZlVmFsdWUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyB0aGUgaW5wdXQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMob3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgYEhvc3RMaXN0ZW5lcmAgaGVyZSBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLgogICAgICAgIC8vIEluIEl2eSB0aGUgYGhvc3RgIGJpbmRpbmdzIHdpbGwgYmUgbWVyZ2VkIHdoZW4gdGhpcyBjbGFzcyBpcyBleHRlbmRlZCwgd2hlcmVhcyBpbgogICAgICAgIC8vIFZpZXdFbmdpbmUgdGhleSdyZSBvdmVyd3JpdHRlbi4KICAgICAgICAvLyBUT0RPKGNyaXNiZXRvKTogd2UgbW92ZSB0aGlzIGJhY2sgaW50byBgaG9zdGAgb25jZSBJdnkgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICAgICAgLyoqCiAgICAgICAgICogQ2FsbGJhY2sgZm9yIHRoZSBjYXNlcyB3aGVyZSB0aGUgZm9jdXNlZCBzdGF0ZSBvZiB0aGUgaW5wdXQgY2hhbmdlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGlzRm9jdXNlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgLy8gdHNsaW50OmRpc2FibGU6bm8taG9zdC1kZWNvcmF0b3ItaW4tY29uY3JldGUKICAgICAgICAvLyB0c2xpbnQ6ZW5hYmxlOm5vLWhvc3QtZGVjb3JhdG9yLWluLWNvbmNyZXRlCiAgICAgICAgX2ZvY3VzQ2hhbmdlZChpc0ZvY3VzZWQpIHsKICAgICAgICAgICAgaWYgKGlzRm9jdXNlZCAhPT0gdGhpcy5mb2N1c2VkICYmICghdGhpcy5yZWFkb25seSB8fCAhaXNGb2N1c2VkKSkgewogICAgICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gaXNGb2N1c2VkOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgYEhvc3RMaXN0ZW5lcmAgaGVyZSBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLgogICAgICAgIC8vIEluIEl2eSB0aGUgYGhvc3RgIGJpbmRpbmdzIHdpbGwgYmUgbWVyZ2VkIHdoZW4gdGhpcyBjbGFzcyBpcyBleHRlbmRlZCwgd2hlcmVhcyBpbgogICAgICAgIC8vIFZpZXdFbmdpbmUgdGhleSdyZSBvdmVyd3JpdHRlbi4KICAgICAgICAvLyBUT0RPKGNyaXNiZXRvKTogd2UgbW92ZSB0aGlzIGJhY2sgaW50byBgaG9zdGAgb25jZSBJdnkgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWhvc3QtZGVjb3JhdG9yLWluLWNvbmNyZXRlCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25JbnB1dCgpIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBhIG5vb3AgZnVuY3Rpb24gYW5kIGlzIHVzZWQgdG8gbGV0IEFuZ3VsYXIga25vdyB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgICAgLy8gQW5ndWxhciB3aWxsIHJ1biBhIG5ldyBjaGFuZ2UgZGV0ZWN0aW9uIGVhY2ggdGltZSB0aGUgYGlucHV0YCBldmVudCBoYXMgYmVlbiBkaXNwYXRjaGVkLgogICAgICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0aGF0IEFuZ3VsYXIgcmVjb2duaXplcyB0aGUgdmFsdWUgY2hhbmdlLCBiZWNhdXNlIHdoZW4gZmxvYXRpbmdMYWJlbAogICAgICAgICAgICAvLyBpcyBzZXQgdG8gZmFsc2UgYW5kIEFuZ3VsYXIgZm9ybXMgYXJlbid0IHVzZWQsIHRoZSBwbGFjZWhvbGRlciB3b24ndCByZWNvZ25pemUgdGhlCiAgICAgICAgICAgIC8vIHZhbHVlIGNoYW5nZXMgYW5kIHdpbGwgbm90IGRpc2FwcGVhci4KICAgICAgICAgICAgLy8gTGlzdGVuaW5nIHRvIHRoZSBpbnB1dCBldmVudCB3b3VsZG4ndCBiZSBuZWNlc3Nhcnkgd2hlbiB0aGUgaW5wdXQgaXMgdXNpbmcgdGhlCiAgICAgICAgICAgIC8vIEZvcm1zTW9kdWxlIG9yIFJlYWN0aXZlRm9ybXNNb2R1bGUsIGJlY2F1c2UgQW5ndWxhciBmb3JtcyBhbHNvIGxpc3RlbnMgdG8gaW5wdXQgZXZlbnRzLgogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEb2VzIHNvbWUgbWFudWFsIGRpcnR5IGNoZWNraW5nIG9uIHRoZSBuYXRpdmUgaW5wdXQgYHZhbHVlYCBwcm9wZXJ0eS4KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZGlydHlDaGVja05hdGl2ZVZhbHVlKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnZhbHVlOwogICAgICAgICAgICBpZiAodGhpcy5fcHJldmlvdXNOYXRpdmVWYWx1ZSAhPT0gbmV3VmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ByZXZpb3VzTmF0aXZlVmFsdWUgPSBuZXdWYWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNYWtlIHN1cmUgdGhlIGlucHV0IGlzIGEgc3VwcG9ydGVkIHR5cGUuCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3ZhbGlkYXRlVHlwZSgpIHsKICAgICAgICAgICAgaWYgKE1BVF9JTlBVVF9JTlZBTElEX1RZUEVTLmluZGV4T2YodGhpcy5fdHlwZSkgPiAtMSkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0SW5wdXRVbnN1cHBvcnRlZFR5cGVFcnJvcih0aGlzLl90eXBlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgaW5wdXQgdHlwZSBpcyBvbmUgb2YgdGhlIHR5cGVzIHRoYXQgYXJlIG5ldmVyIGVtcHR5LgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc05ldmVyRW1wdHkoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uZXZlckVtcHR5SW5wdXRUeXBlcy5pbmRleE9mKHRoaXMuX3R5cGUpID4gLTE7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBpbnB1dCBpcyBpbnZhbGlkIGJhc2VkIG9uIHRoZSBuYXRpdmUgdmFsaWRhdGlvbi4KICAgICAgICAgKiBAcHJvdGVjdGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNCYWRJbnB1dCgpIHsKICAgICAgICAgICAgLy8gVGhlIGB2YWxpZGl0eWAgcHJvcGVydHkgd29uJ3QgYmUgcHJlc2VudCBvbiBwbGF0Zm9ybS1zZXJ2ZXIuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbGlkaXR5ID0gKCgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKSkudmFsaWRpdHk7CiAgICAgICAgICAgIHJldHVybiB2YWxpZGl0eSAmJiB2YWxpZGl0eS5iYWRJbnB1dDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZW1wdHkoKSB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5faXNOZXZlckVtcHR5KCkgJiYgIXRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSAmJiAhdGhpcy5faXNCYWRJbnB1dCgpICYmCiAgICAgICAgICAgICAgICAhdGhpcy5hdXRvZmlsbGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzaG91bGRMYWJlbEZsb2F0KCkgewogICAgICAgICAgICBpZiAodGhpcy5faXNOYXRpdmVTZWxlY3QpIHsKICAgICAgICAgICAgICAgIC8vIEZvciBhIHNpbmdsZS1zZWxlY3Rpb24gYDxzZWxlY3Q+YCwgdGhlIGxhYmVsIHNob3VsZCBmbG9hdCB3aGVuIHRoZSBzZWxlY3RlZCBvcHRpb24gaGFzCiAgICAgICAgICAgICAgICAvLyBhIG5vbi1lbXB0eSBkaXNwbGF5IHZhbHVlLiBGb3IgYSBgPHNlbGVjdCBtdWx0aXBsZT5gLCB0aGUgbGFiZWwgKmFsd2F5cyogZmxvYXRzIHRvIGF2b2lkCiAgICAgICAgICAgICAgICAvLyBvdmVybGFwcGluZyB0aGUgbGFiZWwgd2l0aCB0aGUgb3B0aW9ucy4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdEVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmaXJzdE9wdGlvbiA9IHNlbGVjdEVsZW1lbnQub3B0aW9uc1swXTsKICAgICAgICAgICAgICAgIC8vIE9uIG1vc3QgYnJvd3NlcnMgdGhlIGBzZWxlY3RlZEluZGV4YCB3aWxsIGFsd2F5cyBiZSAwLCBob3dldmVyIG9uIElFIGFuZCBFZGdlIGl0J2xsIGJlCiAgICAgICAgICAgICAgICAvLyAtMSBpZiB0aGUgYHZhbHVlYCBpcyBzZXQgdG8gc29tZXRoaW5nLCB0aGF0IGlzbid0IGluIHRoZSBsaXN0IG9mIG9wdGlvbnMsIGF0IGEgbGF0ZXIgcG9pbnQuCiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8IHNlbGVjdEVsZW1lbnQubXVsdGlwbGUgfHwgIXRoaXMuZW1wdHkgfHwKICAgICAgICAgICAgICAgICAgICAhIShzZWxlY3RFbGVtZW50LnNlbGVjdGVkSW5kZXggPiAtMSAmJiBmaXJzdE9wdGlvbiAmJiBmaXJzdE9wdGlvbi5sYWJlbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mb2N1c2VkIHx8ICF0aGlzLmVtcHR5OwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaWRzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREZXNjcmliZWRCeUlkcyhpZHMpIHsKICAgICAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlZGJ5ID0gaWRzLmpvaW4oJyAnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkNvbnRhaW5lckNsaWNrKCkgewogICAgICAgICAgICAvLyBEbyBub3QgcmUtZm9jdXMgdGhlIGlucHV0IGVsZW1lbnQgaWYgdGhlIGVsZW1lbnQgaXMgYWxyZWFkeSBmb2N1c2VkLiBPdGhlcndpc2UgaXQgY2FuIGhhcHBlbgogICAgICAgICAgICAvLyB0aGF0IHNvbWVvbmUgY2xpY2tzIG9uIGEgdGltZSBpbnB1dCBhbmQgdGhlIGN1cnNvciByZXNldHMgdG8gdGhlICJob3VycyIgZmllbGQgd2hpbGUgdGhlCiAgICAgICAgICAgIC8vICJtaW51dGVzIiBmaWVsZCB3YXMgYWN0dWFsbHkgY2xpY2tlZC4gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9jb21wb25lbnRzL2lzc3Vlcy8xMjg0OQogICAgICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkgewogICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0SW5wdXQuybVmYWMgPSBmdW5jdGlvbiBNYXRJbnB1dF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRJbnB1dCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdDb250cm9sLCAxMCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdGb3JtLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChGb3JtR3JvdXBEaXJlY3RpdmUsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVycm9yU3RhdGVNYXRjaGVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfSU5QVVRfVkFMVUVfQUNDRVNTT1IsIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChBdXRvZmlsbE1vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSkpOyB9OwogICAgTWF0SW5wdXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0SW5wdXQsIHNlbGVjdG9yczogW1siaW5wdXQiLCAibWF0SW5wdXQiLCAiIl0sIFsidGV4dGFyZWEiLCAibWF0SW5wdXQiLCAiIl0sIFsic2VsZWN0IiwgIm1hdE5hdGl2ZUNvbnRyb2wiLCAiIl0sIFsiaW5wdXQiLCAibWF0TmF0aXZlQ29udHJvbCIsICIiXSwgWyJ0ZXh0YXJlYSIsICJtYXROYXRpdmVDb250cm9sIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1pbnB1dC1lbGVtZW50IiwgIm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2wiXSwgaG9zdFZhcnM6IDEwLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdElucHV0X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJmb2N1cyIsIGZ1bmN0aW9uIE1hdElucHV0X2ZvY3VzX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fZm9jdXNDaGFuZ2VkKHRydWUpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIE1hdElucHV0X2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9mb2N1c0NoYW5nZWQoZmFsc2UpOyB9KSgiaW5wdXQiLCBmdW5jdGlvbiBNYXRJbnB1dF9pbnB1dF9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX29uSW5wdXQoKTsgfSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVob3N0UHJvcGVydHkoImRpc2FibGVkIiwgY3R4LmRpc2FibGVkKSgicmVxdWlyZWQiLCBjdHgucmVxdWlyZWQpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJpZCIsIGN0eC5pZCkoInBsYWNlaG9sZGVyIiwgY3R4LnBsYWNlaG9sZGVyKSgicmVhZG9ubHkiLCBjdHgucmVhZG9ubHkgJiYgIWN0eC5faXNOYXRpdmVTZWxlY3QgfHwgbnVsbCkoImFyaWEtZGVzY3JpYmVkYnkiLCBjdHguX2FyaWFEZXNjcmliZWRieSB8fCBudWxsKSgiYXJpYS1pbnZhbGlkIiwgY3R4LmVycm9yU3RhdGUpKCJhcmlhLXJlcXVpcmVkIiwgY3R4LnJlcXVpcmVkLnRvU3RyaW5nKCkpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtaW5wdXQtc2VydmVyIiwgY3R4Ll9pc1NlcnZlcik7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgaWQ6ICJpZCIsIGRpc2FibGVkOiAiZGlzYWJsZWQiLCByZXF1aXJlZDogInJlcXVpcmVkIiwgdHlwZTogInR5cGUiLCB2YWx1ZTogInZhbHVlIiwgcmVhZG9ubHk6ICJyZWFkb25seSIsIHBsYWNlaG9sZGVyOiAicGxhY2Vob2xkZXIiLCBlcnJvclN0YXRlTWF0Y2hlcjogImVycm9yU3RhdGVNYXRjaGVyIiB9LCBleHBvcnRBczogWyJtYXRJbnB1dCJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IE1hdEZvcm1GaWVsZENvbnRyb2wsIHVzZUV4aXN0aW5nOiBNYXRJbnB1dCB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRJbnB1dC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiBOZ0NvbnRyb2wsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogU2VsZiB9XSB9LAogICAgICAgIHsgdHlwZTogTmdGb3JtLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRm9ybUdyb3VwRGlyZWN0aXZlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRXJyb3JTdGF0ZU1hdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0lOUFVUX1ZBTFVFX0FDQ0VTU09SLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IEF1dG9maWxsTW9uaXRvciB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0KICAgIF07CiAgICBNYXRJbnB1dC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICByZXF1aXJlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZXJyb3JTdGF0ZU1hdGNoZXI6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICByZWFkb25seTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgX2ZvY3VzQ2hhbmdlZDogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2ZvY3VzJywgWyd0cnVlJ10sXSB9LCB7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydibHVyJywgWydmYWxzZSddLF0gfV0sCiAgICAgICAgX29uSW5wdXQ6IFt7IHR5cGU6IEhvc3RMaXN0ZW5lciwgYXJnczogWydpbnB1dCcsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9pbnB1dC9pbnB1dC1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0SW5wdXRNb2R1bGUgewogICAgfQogICAgTWF0SW5wdXRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRJbnB1dE1vZHVsZSB9KTsKICAgIE1hdElucHV0TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0SW5wdXRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SW5wdXRNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW0Vycm9yU3RhdGVNYXRjaGVyXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIFRleHRGaWVsZE1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgVGV4dEZpZWxkTW9kdWxlLAogICAgICAgICAgICAvLyBXZSByZS1leHBvcnQgdGhlIGBNYXRGb3JtRmllbGRNb2R1bGVgIHNpbmNlIGBNYXRJbnB1dGAgd2lsbCBhbG1vc3QgYWx3YXlzCiAgICAgICAgICAgIC8vIGJlIHVzZWQgdG9nZXRoZXIgd2l0aCBgTWF0Rm9ybUZpZWxkYC4KICAgICAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdElucHV0TW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdElucHV0LAogICAgICAgICAgICBNYXRUZXh0YXJlYUF1dG9zaXplXTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW1RleHRGaWVsZE1vZHVsZSwKICAgICAgICAgICAgTWF0Rm9ybUZpZWxkTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW1RleHRGaWVsZE1vZHVsZSwKICAgICAgICAgICAgLy8gV2UgcmUtZXhwb3J0IHRoZSBgTWF0Rm9ybUZpZWxkTW9kdWxlYCBzaW5jZSBgTWF0SW5wdXRgIHdpbGwgYWxtb3N0IGFsd2F5cwogICAgICAgICAgICAvLyBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggYE1hdEZvcm1GaWVsZGAuCiAgICAgICAgICAgIE1hdEZvcm1GaWVsZE1vZHVsZSwKICAgICAgICAgICAgTWF0SW5wdXQsCiAgICAgICAgICAgIE1hdFRleHRhcmVhQXV0b3NpemVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3NldHRpbmdzL2RpYWxvZ19jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gU2V0dGluZ3NEaWFsb2dDb21wb25lbnRfbWF0X2Vycm9yXzEwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1lcnJvciIpOwogICAgICAgIMm1ybV0ZXh0KDEsICIgUmVsb2FkIHBlcmlvZCBoYXMgdG8gYmUgbWluaW11bSBvZiAxNSBzZWNvbmRzLiAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICBmdW5jdGlvbiBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudF9tYXRfZXJyb3JfMTRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LWVycm9yIik7CiAgICAgICAgybXJtXRleHQoMSwgIiBQYWdlIHNpemUgaGFzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0UmVsb2FkUGVyaW9kSW5TZWMgPSBjcmVhdGVTZWxlY3RvcihnZXRSZWxvYWRQZXJpb2RJbk1zLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHBlcmlvZEluTXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChwZXJpb2RJbk1zKSA9PiBNYXRoLnJvdW5kKHBlcmlvZEluTXMgLyAxMDAwKSkpOwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVJbnRlZ2VyVmFsaWRhdG9yKCkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY29udHJvbCkgPT4gewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG51bVZhbHVlID0gTnVtYmVyKGNvbnRyb2wudmFsdWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gTWF0aC5yb3VuZChudW1WYWx1ZSkgPT09IGNvbnRyb2wudmFsdWU7CiAgICAgICAgICAgIHJldHVybiB2YWxpZCA/IG51bGwgOiB7IGludGVnZXI6IHsgdmFsdWU6IGNvbnRyb2wudmFsdWUgfSB9OwogICAgICAgIH0pOwogICAgfQogICAgY2xhc3MgU2V0dGluZ3NEaWFsb2dDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMucmVsb2FkRW5hYmxlZCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFJlbG9hZEVuYWJsZWQpKTsKICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFBhZ2VTaXplKSk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kSW5TZWMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRSZWxvYWRQZXJpb2RJblNlYykpOwogICAgICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2woMTUsIFsKICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsCiAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLm1pbigxNSksCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25Db250cm9sID0gbmV3IEZvcm1Db250cm9sKDEsIFsKICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMucmVxdWlyZWQsCiAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLm1pbigxKSwKICAgICAgICAgICAgICAgIGNyZWF0ZUludGVnZXJWYWxpZGF0b3IoKSwKICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kSW5TZWMkCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZhbHVlKSA9PiB2YWx1ZSAhPT0gdGhpcy5yZWxvYWRQZXJpb2RDb250cm9sLnZhbHVlKSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZhbHVlKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkRW5hYmxlZCQKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHZhbHVlKQogICAgICAgICAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC5lbmFibGUoKTsKICAgICAgICAgICAgICAgIGVsc2UKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wuZGlzYWJsZSgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWx1ZUNoYW5nZXMKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBkZWJvdW5jZVRpbWUoNTAwKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWxpZCkpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMucmVsb2FkUGVyaW9kQ29udHJvbC52YWxpZCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBlcmlvZEluTXMgPSB0aGlzLnJlbG9hZFBlcmlvZENvbnRyb2wudmFsdWUgKiAxMDAwOwogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChjaGFuZ2VSZWxvYWRQZXJpb2QoeyBwZXJpb2RJbk1zIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLnBhZ2VTaXplJAogICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZSkgPT4gdmFsdWUgIT09IHRoaXMucGFnaW5hdGlvbkNvbnRyb2wudmFsdWUpKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWUpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNvbnRyb2wuc2V0VmFsdWUodmFsdWUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMucGFnaW5hdGlvbkNvbnRyb2wudmFsdWVDaGFuZ2VzCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZGVib3VuY2VUaW1lKDUwMCksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnBhZ2luYXRpb25Db250cm9sLnZhbGlkKSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goY2hhbmdlUGFnZVNpemUoeyBzaXplOiB0aGlzLnBhZ2luYXRpb25Db250cm9sLnZhbHVlIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpOwogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblJlbG9hZFRvZ2dsZSgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh0b2dnbGVSZWxvYWRFbmFibGVkKCkpOwogICAgICAgIH0KICAgIH0KICAgIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzZXR0aW5ncy1kaWFsb2cnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8aDM+U2V0dGluZ3M8L2gzPgogICAgPGRpdj4KICAgICAgPGRpdiBjbGFzcz0icmVsb2FkLXRvZ2dsZSI+CiAgICAgICAgPG1hdC1jaGVja2JveAogICAgICAgICAgW2NoZWNrZWRdPSJyZWxvYWRFbmFibGVkJCB8IGFzeW5jIgogICAgICAgICAgKGNoYW5nZSk9Im9uUmVsb2FkVG9nZ2xlKCkiCiAgICAgICAgICA+UmVsb2FkIGRhdGE8L21hdC1jaGVja2JveAogICAgICAgID4KICAgICAgPC9kaXY+CiAgICAgIDxkaXY+CiAgICAgICAgPG1hdC1mb3JtLWZpZWxkPgogICAgICAgICAgPGlucHV0CiAgICAgICAgICAgIGNsYXNzPSJyZWxvYWQtcGVyaW9kIgogICAgICAgICAgICBtYXRJbnB1dAogICAgICAgICAgICB0eXBlPSJudW1iZXIiCiAgICAgICAgICAgIHBsYWNlaG9sZGVyPSJSZWxvYWQgUGVyaW9kIgogICAgICAgICAgICBbZm9ybUNvbnRyb2xdPSJyZWxvYWRQZXJpb2RDb250cm9sIgogICAgICAgICAgLz4KICAgICAgICA8L21hdC1mb3JtLWZpZWxkPgogICAgICAgIDxtYXQtZXJyb3IKICAgICAgICAgICpuZ0lmPSIKICAgICAgICAgICAgcmVsb2FkUGVyaW9kQ29udHJvbC5oYXNFcnJvcignbWluJykgfHwKICAgICAgICAgICAgcmVsb2FkUGVyaW9kQ29udHJvbC5oYXNFcnJvcigncmVxdWlyZWQnKQogICAgICAgICAgIgogICAgICAgID4KICAgICAgICAgIFJlbG9hZCBwZXJpb2QgaGFzIHRvIGJlIG1pbmltdW0gb2YgMTUgc2Vjb25kcy4KICAgICAgICA8L21hdC1lcnJvcj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICAgIDxkaXY+CiAgICAgIDxtYXQtZm9ybS1maWVsZD4KICAgICAgICA8aW5wdXQKICAgICAgICAgIGNsYXNzPSJwYWdlLXNpemUiCiAgICAgICAgICBtYXRJbnB1dAogICAgICAgICAgdHlwZT0ibnVtYmVyIgogICAgICAgICAgcGxhY2Vob2xkZXI9IlBhZ2luYXRpb24gTGltaXQiCiAgICAgICAgICBbZm9ybUNvbnRyb2xdPSJwYWdpbmF0aW9uQ29udHJvbCIKICAgICAgICAvPgogICAgICA8L21hdC1mb3JtLWZpZWxkPgogICAgICA8bWF0LWVycm9yICpuZ0lmPSJwYWdpbmF0aW9uQ29udHJvbC5pbnZhbGlkIj4KICAgICAgICBQYWdlIHNpemUgaGFzIHRvIGJlIGEgcG9zaXRpdmUgaW50ZWdlci4KICAgICAgPC9tYXQtZXJyb3I+CiAgICA8L2Rpdj4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2RpYWxvZ19jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNldHRpbmdzRGlhbG9nQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NEaWFsb2dDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU2V0dGluZ3NEaWFsb2dDb21wb25lbnQsIHNlbGVjdG9yczogW1sic2V0dGluZ3MtZGlhbG9nIl1dLCBkZWNsczogMTUsIHZhcnM6IDcsIGNvbnN0czogW1sxLCAicmVsb2FkLXRvZ2dsZSJdLCBbMywgImNoZWNrZWQiLCAiY2hhbmdlIl0sIFsibWF0SW5wdXQiLCAiIiwgInR5cGUiLCAibnVtYmVyIiwgInBsYWNlaG9sZGVyIiwgIlJlbG9hZCBQZXJpb2QiLCAxLCAicmVsb2FkLXBlcmlvZCIsIDMsICJmb3JtQ29udHJvbCJdLCBbNCwgIm5nSWYiXSwgWyJtYXRJbnB1dCIsICIiLCAidHlwZSIsICJudW1iZXIiLCAicGxhY2Vob2xkZXIiLCAiUGFnaW5hdGlvbiBMaW1pdCIsIDEsICJwYWdlLXNpemUiLCAzLCAiZm9ybUNvbnRyb2wiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiaDMiKTsKICAgICAgICAgICAgybXJtXRleHQoMSwgIlNldHRpbmdzIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAibWF0LWNoZWNrYm94IiwgMSk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gU2V0dGluZ3NEaWFsb2dDb21wb25lbnRfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NoYW5nZV80X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uUmVsb2FkVG9nZ2xlKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXRleHQoNiwgIlJlbG9hZCBkYXRhIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDgsICJtYXQtZm9ybS1maWVsZCIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg5LCAiaW5wdXQiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEwLCBTZXR0aW5nc0RpYWxvZ0NvbXBvbmVudF9tYXRfZXJyb3JfMTBfVGVtcGxhdGUsIDIsIDAsICJtYXQtZXJyb3IiLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMSwgImRpdiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAibWF0LWZvcm0tZmllbGQiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMTMsICJpbnB1dCIsIDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMTQsIFNldHRpbmdzRGlhbG9nQ29tcG9uZW50X21hdF9lcnJvcl8xNF9UZW1wbGF0ZSwgMiwgMCwgIm1hdC1lcnJvciIsIDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJjaGVja2VkIiwgybXJtXBpcGVCaW5kMSg1LCA1LCBjdHgucmVsb2FkRW5hYmxlZCQpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiZm9ybUNvbnRyb2wiLCBjdHgucmVsb2FkUGVyaW9kQ29udHJvbCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucmVsb2FkUGVyaW9kQ29udHJvbC5oYXNFcnJvcigibWluIikgfHwgY3R4LnJlbG9hZFBlcmlvZENvbnRyb2wuaGFzRXJyb3IoInJlcXVpcmVkIikpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJmb3JtQ29udHJvbCIsIGN0eC5wYWdpbmF0aW9uQ29udHJvbCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucGFnaW5hdGlvbkNvbnRyb2wuaW52YWxpZCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0Q2hlY2tib3gsIE1hdEZvcm1GaWVsZCwgTWF0SW5wdXQsIE51bWJlclZhbHVlQWNjZXNzb3IsIERlZmF1bHRWYWx1ZUFjY2Vzc29yLCBOZ0NvbnRyb2xTdGF0dXMsIEZvcm1Db250cm9sRGlyZWN0aXZlLCBOZ0lmLCBNYXRFcnJvcl0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICBmb250LXNpemU6IDE1cHg7XG59XG5cbltfbmdob3N0LSVDT01QJV0gICAgPiBkaXZbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luOiAxMHB4IDA7XG59XG5cbltfbmdob3N0LSVDT01QJV0gICAgPiBbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LWNoaWxkIHtcbiAgbWFyZ2luLXRvcDogMDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICA+IFtfbmdjb250ZW50LSVDT01QJV06bGFzdC1jaGlsZCB7XG4gIG1hcmdpbi1ib3R0b206IDA7XG59XG5cbmgzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtc2l6ZTogMjBweDtcbn1cblxuLnJlbG9hZC10b2dnbGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luLWJvdHRvbTogMTBweDtcbn0iXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9zZXR0aW5ncy9zZXR0aW5nc19idXR0b25fY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGRpYWxvZwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRpYWxvZykgewogICAgICAgICAgICB0aGlzLmRpYWxvZyA9IGRpYWxvZzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvcGVuRGlhbG9nKCkgewogICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuKFNldHRpbmdzRGlhbG9nQ29tcG9uZW50LCB7CiAgICAgICAgICAgICAgICB3aWR0aDogJzQwMHB4JywKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgU2V0dGluZ3NCdXR0b25Db21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3NldHRpbmdzLWJ1dHRvbicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxidXR0b24gbWF0LWljb24tYnV0dG9uIChjbGljayk9Im9wZW5EaWFsb2coKSI+CiAgICAgIDxtYXQtaWNvbiBzdmdJY29uPSJzZXR0aW5nc18yNHB4Ij48L21hdC1pY29uPgogICAgPC9idXR0b24+CiAgYCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU2V0dGluZ3NCdXR0b25Db21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBNYXREaWFsb2cgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc0J1dHRvbkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNldHRpbmdzQnV0dG9uQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdERpYWxvZykpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNldHRpbmdzQnV0dG9uQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInNldHRpbmdzLWJ1dHRvbiJdXSwgZGVjbHM6IDIsIHZhcnM6IDAsIGNvbnN0czogW1sibWF0LWljb24tYnV0dG9uIiwgIiIsIDMsICJjbGljayJdLCBbInN2Z0ljb24iLCAic2V0dGluZ3NfMjRweCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFNldHRpbmdzQnV0dG9uQ29tcG9uZW50X1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9wZW5EaWFsb2coKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDEsICJtYXQtaWNvbiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdEJ1dHRvbiwgTWF0SWNvbl0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvaGVhZGVyL2hlYWRlcl9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSGVhZGVyQ29tcG9uZW50IHsKICAgIH0KICAgIEhlYWRlckNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnYXBwLWhlYWRlcicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxtYXQtdG9vbGJhciBjb2xvcj0icHJpbWFyeSI+CiAgICAgIDxzcGFuIGNsYXNzPSJicmFuZCI+VGVuc29yQm9hcmQ8L3NwYW4+CiAgICAgIDxwbHVnaW4tc2VsZWN0b3IgY2xhc3M9InBsdWdpbnMiPjwvcGx1Z2luLXNlbGVjdG9yPgogICAgICA8dGJkZXYtdXBsb2FkLWJ1dHRvbj48L3RiZGV2LXVwbG9hZC1idXR0b24+CiAgICAgIDxhcHAtaGVhZGVyLXJlbG9hZD48L2FwcC1oZWFkZXItcmVsb2FkPgogICAgICA8c2V0dGluZ3MtYnV0dG9uPjwvc2V0dGluZ3MtYnV0dG9uPgogICAgICA8YQogICAgICAgIGNsYXNzPSJyZWFkbWUiCiAgICAgICAgbWF0LWljb24tYnV0dG9uCiAgICAgICAgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIgogICAgICAgIHJlbD0ibm9vcGVuZXIgbm9yZWZlcnJlciIKICAgICAgICB0YXJnZXQ9Il9ibGFuayIKICAgICAgICBhcmlhLWxhYmVsPSJIZWxwIgogICAgICA+CiAgICAgICAgPG1hdC1pY29uIHN2Z0ljb249ImhlbHBfb3V0bGluZV8yNHB4Ij48L21hdC1pY29uPgogICAgICA8L2E+CiAgICA8L21hdC10b29sYmFyPgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgbWF0LXRvb2xiYXIgewogICAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBoZWlnaHQ6IDY0cHg7CiAgICAgICAgb3ZlcmZsb3c6IGhpZGRlbjsKICAgICAgICB3aWR0aDogMTAwJTsKICAgICAgfQoKICAgICAgdGJkZXYtdXBsb2FkLWJ1dHRvbi5zaG93biB7CiAgICAgICAgbWFyZ2luOiAwIDhweCAwIDE2cHg7CiAgICAgIH0KCiAgICAgIC5icmFuZCwKICAgICAgLnJlYWRtZSwKICAgICAgYXBwLWhlYWRlci1yZWxvYWQsCiAgICAgIHNldHRpbmdzLWJ1dHRvbiB7CiAgICAgICAgZmxleDogMCAwIGF1dG87CiAgICAgIH0KCiAgICAgIC5icmFuZCB7CiAgICAgICAgbGV0dGVyLXNwYWNpbmc6IC0wLjAyNWVtOwogICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4OwogICAgICAgIHRleHQtcmVuZGVyaW5nOiBvcHRpbWl6ZUxlZ2liaWxpdHk7CiAgICAgIH0KCiAgICAgIC5wbHVnaW5zIHsKICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyOwogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgICAgZmxleDogMSAxIGF1dG87CiAgICAgICAgZm9udC1zaXplOiAxNHB4OwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGVhZGVyQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gSGVhZGVyQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhlYWRlckNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSGVhZGVyQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImFwcC1oZWFkZXIiXV0sIGRlY2xzOiA5LCB2YXJzOiAwLCBjb25zdHM6IFtbImNvbG9yIiwgInByaW1hcnkiXSwgWzEsICJicmFuZCJdLCBbMSwgInBsdWdpbnMiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgImhyZWYiLCAiaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIiwgInJlbCIsICJub29wZW5lciBub3JlZmVycmVyIiwgInRhcmdldCIsICJfYmxhbmsiLCAiYXJpYS1sYWJlbCIsICJIZWxwIiwgMSwgInJlYWRtZSJdLCBbInN2Z0ljb24iLCAiaGVscF9vdXRsaW5lXzI0cHgiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBIZWFkZXJDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC10b29sYmFyIiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMiwgIlRlbnNvckJvYXJkIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDMsICJwbHVnaW4tc2VsZWN0b3IiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNCwgInRiZGV2LXVwbG9hZC1idXR0b24iKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNSwgImFwcC1oZWFkZXItcmVsb2FkIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDYsICJzZXR0aW5ncy1idXR0b24iKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiYSIsIDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg4LCAibWF0LWljb24iLCA0KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRUb29sYmFyLCBQbHVnaW5TZWxlY3RvckNvbnRhaW5lciwgVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQsIFJlbG9hZENvbnRhaW5lciwgU2V0dGluZ3NCdXR0b25Db21wb25lbnQsIE1hdEFuY2hvciwgTWF0SWNvbl0sIHN0eWxlczogWyJtYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBoZWlnaHQ6IDY0cHg7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHdpZHRoOiAxMDAlO1xuICAgICAgfVxuXG4gICAgICB0YmRldi11cGxvYWQtYnV0dG9uLnNob3duW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIG1hcmdpbjogMCA4cHggMCAxNnB4O1xuICAgICAgfVxuXG4gICAgICAuYnJhbmRbX25nY29udGVudC0lQ09NUCVdLCAucmVhZG1lW19uZ2NvbnRlbnQtJUNPTVAlXSwgYXBwLWhlYWRlci1yZWxvYWRbX25nY29udGVudC0lQ09NUCVdLCBzZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleDogMCAwIGF1dG87XG4gICAgICB9XG5cbiAgICAgIC5icmFuZFtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBsZXR0ZXItc3BhY2luZzogLTAuMDI1ZW07XG4gICAgICAgIG1hcmdpbi1sZWZ0OiAxMHB4O1xuICAgICAgICB0ZXh0LXJlbmRlcmluZzogb3B0aW1pemVMZWdpYmlsaXR5O1xuICAgICAgfVxuXG4gICAgICAucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgICBmbGV4OiAxIDEgYXV0bztcbiAgICAgICAgZm9udC1zaXplOiAxNHB4O1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICB9Il0gfSk7CgogICAgdmFyIFJvdXRlS2luZDsKICAgIChmdW5jdGlvbiAoUm91dGVLaW5kKSB7CiAgICAgICAgUm91dGVLaW5kW1JvdXRlS2luZFsiVU5LTk9XTiJdID0gMF0gPSAiVU5LTk9XTiI7CiAgICAgICAgUm91dGVLaW5kW1JvdXRlS2luZFsiRVhQRVJJTUVOVFMiXSA9IDFdID0gIkVYUEVSSU1FTlRTIjsKICAgICAgICBSb3V0ZUtpbmRbUm91dGVLaW5kWyJFWFBFUklNRU5UIl0gPSAyXSA9ICJFWFBFUklNRU5UIjsKICAgICAgICBSb3V0ZUtpbmRbUm91dGVLaW5kWyJDT01QQVJFX0VYUEVSSU1FTlQiXSA9IDNdID0gIkNPTVBBUkVfRVhQRVJJTUVOVCI7CiAgICB9KShSb3V0ZUtpbmQgfHwgKFJvdXRlS2luZCA9IHt9KSk7CiAgICBjb25zdCBERUZBVUxUX0VYUEVSSU1FTlRfSUQgPSAnZGVmYXVsdEV4cGVyaW1lbnRJZCc7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFBhcnNlcyBzaG9ydCBleHBlcmltZW50IG5hbWUgdG8gaWQgbWFwIGVuY29kZWQgaW4gc3RyaW5nIGZvciBjb21wYXJlIHJvdXRlLgogICAgICoKICAgICAqIGUuZy4sIC9jb21wYXJlL2V4cDE6MTIzNDUsZXhwMjo5OTk5OSByZXN1bHRzLAogICAgICogWwogICAgICogICB7bmFtZTogJ2V4cDEnLCBpZDogJzEyMzQ1J30sCiAgICAgKiAgIHtuYW1lOiAnZXhwMicsIGlkOiAnOTk5OTknfQogICAgICogXQogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZUNvbXBhcmVFeHBlcmltZW50U3RyKGVpZFN0cikgewogICAgICAgIHJldHVybiBlaWRTdHIuc3BsaXQoJywnKS5tYXAoKG5hbWVUb0lkU3RyKSA9PiB7CiAgICAgICAgICAgIGNvbnN0IGNvbG9uSW5kZXggPSBuYW1lVG9JZFN0ci5pbmRleE9mKCc6Jyk7CiAgICAgICAgICAgIGlmIChjb2xvbkluZGV4IDwgMCkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3QgY29sb24gZGVsaW1pdGluZyBuYW1lIGFuZCBJRDogJHtuYW1lVG9JZFN0cn1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBuYW1lID0gbmFtZVRvSWRTdHIuc2xpY2UoMCwgY29sb25JbmRleCk7CiAgICAgICAgICAgIGNvbnN0IGlkID0gbmFtZVRvSWRTdHIuc2xpY2UoY29sb25JbmRleCArIDEpOwogICAgICAgICAgICBpZiAoIW5hbWUpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0IG5hbWUgdG8gYmUgbm9uLWZhbHN5OiAke25hbWVUb0lkU3RyfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0IGlkIHRvIGJlIG5vbi1mYWxzeTogJHtuYW1lVG9JZFN0cn1gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyBuYW1lLCBpZCB9OwogICAgICAgIH0pOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGV4cGVyaW1lbnRJZHMgZnJvbSByb3V0ZSBwYXJhbWV0ZXIuIEZvciBhIHJvdXRlIHRoYXQgZG9lcyBub3QgY29udGFpbgogICAgICogYW55IGV4cGVyaW1lbnQgaWRzLCBpdCByZXR1cm5zIG51bGwuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEV4cGVyaW1lbnRJZHNGcm9tUm91dGVQYXJhbXMocm91dGVLaW5kLCBwYXJhbXMpIHsKICAgICAgICBzd2l0Y2ggKHJvdXRlS2luZCkgewogICAgICAgICAgICBjYXNlIFJvdXRlS2luZC5FWFBFUklNRU5UOiB7CiAgICAgICAgICAgICAgICAvLyBUaGUgcm91dGUgbWF5IHJlbHkgb24gdGhlIGltcGxpY2l0LCBkZWZhdWx0IGV4cGVyaW1lbnQgaWQsIGlmIHRoZSBVUkwKICAgICAgICAgICAgICAgIC8vIGRvZXMgbm90IGNvbnRhaW4gdGhlIGV4cGVyaW1lbnQgcGFyYW0uCiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHBhcmFtcywgJ2V4cGVyaW1lbnRJZCcpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtwYXJhbXMuZXhwZXJpbWVudElkXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBbREVGQVVMVF9FWFBFUklNRU5UX0lEXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFJvdXRlS2luZC5DT01QQVJFX0VYUEVSSU1FTlQ6IHsKICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUGFyYW1zID0gcGFyYW1zOwogICAgICAgICAgICAgICAgcmV0dXJuIHBhcnNlQ29tcGFyZUV4cGVyaW1lbnRTdHIodHlwZWRQYXJhbXMuZXhwZXJpbWVudElkcykubWFwKCh7IGlkIH0pID0+IGlkKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFJvdXRlS2luZC5FWFBFUklNRU5UUzoKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyBrbm93biB0b3AtbGV2ZWwgcm91dGVzLiBJdCBpcyBzaW1pbGFyCiAgICAgKiB0byBgdXJsYCBidXQgaWdub3JlcyBoYXNoIGFuZCByZXR1cm5zICJ1bmtub3duIiBmb3IgdW5rbm93biByb3V0ZXMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFJvdXRlSWQocm91dGVLaW5kLCBwYXJhbXMpIHsKICAgICAgICBzd2l0Y2ggKHJvdXRlS2luZCkgewogICAgICAgICAgICBjYXNlIFJvdXRlS2luZC5DT01QQVJFX0VYUEVSSU1FTlQ6IHsKICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVkUGFyYW1zID0gcGFyYW1zOwogICAgICAgICAgICAgICAgcmV0dXJuIGAke3JvdXRlS2luZH0vJHt0eXBlZFBhcmFtcy5leHBlcmltZW50SWRzfWA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBSb3V0ZUtpbmQuRVhQRVJJTUVOVDogewogICAgICAgICAgICAgICAgY29uc3QgdHlwZWRQYXJhbXMgPSBwYXJhbXM7CiAgICAgICAgICAgICAgICByZXR1cm4gYCR7cm91dGVLaW5kfS8ke3R5cGVkUGFyYW1zLmV4cGVyaW1lbnRJZH1gOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgUm91dGVLaW5kLkVYUEVSSU1FTlRTOgogICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZyhyb3V0ZUtpbmQpOwogICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgIH0KICAgIH0KICAgIGZ1bmN0aW9uIGNyZWF0ZVVSTFNlYXJjaFBhcmFtc0Zyb21TZXJpYWxpemFibGVRdWVyeVBhcmFtcyhwYXJhbXMpIHsKICAgICAgICBjb25zdCBzZWFyY2hQYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICAgICAgZm9yIChjb25zdCB7IGtleSwgdmFsdWUgfSBvZiBwYXJhbXMpIHsKICAgICAgICAgICAgc2VhcmNoUGFyYW1zLmFwcGVuZChrZXksIHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNlYXJjaFBhcmFtczsKICAgIH0KICAgIC8qKgogICAgICogQ2hlY2tzIHdoZXRoZXIgdHdvIFJvdXRlT3JOYXZzIGFyZSBlcXVhbC4gUm91dGVPck5hdiBpcyBkZWZpbmVkIHRvIGJlIFJvdXRlCiAgICAgKiBvciBOYXZpZ2F0aW9uLgogICAgICoKICAgICAqIExpbWl0YXRpb25zOiBjdXJyZW50bHksIHRoZXkgb25seSBtYXRjaCBwYXRobmFtZSBhbmQgcXVlcnkgcGFyYW1ldGVyIChvcmRlcgogICAgICogb2YgdGhlIHBhcmFtcyBoYXZlIHRvIGJlIGVxdWFsIHRvbzsgZS5nLiwgYT0xJmI9MiB3aWxsIG5vdCBlcXVhbCBiPTImYT0xKS4KICAgICAqLwogICAgZnVuY3Rpb24gYXJlUm91dGVzRXF1YWwoYVJvdXRlLCBiUm91dGUpIHsKICAgICAgICAvLyBUT0RPKHN0ZXBoYW53bGVlKTogc3VwcG9ydCBoYXNoZXMuCiAgICAgICAgaWYgKGFSb3V0ZS5wYXRobmFtZSAhPT0gYlJvdXRlLnBhdGhuYW1lIHx8CiAgICAgICAgICAgIGFSb3V0ZS5xdWVyeVBhcmFtcy5sZW5ndGggIT09IGJSb3V0ZS5xdWVyeVBhcmFtcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gYVJvdXRlLnF1ZXJ5UGFyYW1zLmV2ZXJ5KChwYXJhbUEsIGluZGV4KSA9PiB7CiAgICAgICAgICAgIGNvbnN0IHBhcmFtQiA9IGJSb3V0ZS5xdWVyeVBhcmFtc1tpbmRleF07CiAgICAgICAgICAgIHJldHVybiBwYXJhbUEua2V5ID09PSBwYXJhbUIua2V5ICYmIHBhcmFtQS52YWx1ZSA9PT0gcGFyYW1CLnZhbHVlOwogICAgICAgIH0pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9yb3V0aW5nL3JvdXRlX2NvbmZpZy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGF0aAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UGF0aEZyYWdtZW50cyhwYXRoKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHBhcnRzID0gZ2V0UGF0aFBhcnRzKHBhdGgpOwogICAgICAgIHJldHVybiBwYXJ0cy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFydAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHBhcnQpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpc1BhcmFtID0gcGFydC5zdGFydHNXaXRoKCc6Jyk7CiAgICAgICAgICAgIGlmICghaXNQYXJhbSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgcGF0aFBhcnQ6IHBhcnQsIGlzUGFyYW0gfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgcGF0aFBhcnQ6IHBhcnQsCiAgICAgICAgICAgICAgICBpc1BhcmFtOiB0cnVlLAogICAgICAgICAgICAgICAgcGFyYW1OYW1lOiBwYXJ0LnNsaWNlKDEpLAogICAgICAgICAgICB9OwogICAgICAgIH0pKTsKICAgIH0KICAgIGNsYXNzIFJvdXRlQ29uZmlnTWF0Y2hlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWcpIHsKICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7CiAgICAgICAgICAgIHRoaXMudmFsaWRhdGVDb25maWcoY29uZmlnKTsKICAgICAgICAgICAgdGhpcy5wYXRoRnJhZ21lbnRzID0gZ2V0UGF0aEZyYWdtZW50cyhjb25maWcucGF0aCk7CiAgICAgICAgICAgIHRoaXMucGF0aE1hdGNoZXJzID0gdGhpcy5nZXRQYXRoTWF0Y2hlcnModGhpcy5wYXRoRnJhZ21lbnRzKTsKICAgICAgICAgICAgdGhpcy5yZWRpcmVjdGlvbkZyYWdtZW50cyA9CiAgICAgICAgICAgICAgICBjb25maWcucm91dGVLaW5kID09PSBudWxsCiAgICAgICAgICAgICAgICAgICAgPyBnZXRQYXRoRnJhZ21lbnRzKGNvbmZpZy5yZWRpcmVjdGlvblBhdGgpCiAgICAgICAgICAgICAgICAgICAgOiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB2YWxpZGF0ZUNvbmZpZyh7IHBhdGggfSkgewogICAgICAgICAgICBpZiAoIXBhdGguc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgY29uZmlnLnBhdGggc2hvdWxkIHN0YXJ0IHdpdGggJy8nLiAke3BhdGh9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgY29sb25JbmRleCA9IDA7CiAgICAgICAgICAgIHdoaWxlICgoY29sb25JbmRleCA9IHBhdGguaW5kZXhPZignOicsIGNvbG9uSW5kZXggKyAxKSkgPj0gMCkgewogICAgICAgICAgICAgICAgaWYgKHBhdGhbY29sb25JbmRleCAtIDFdICE9PSAnLycpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgY29uZmlnLnBhdGggcGFyYW1ldGVyIHNob3VsZCBjb21lIGFmdGVyICcvJy4gJHtwYXRofWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBhdGhbY29sb25JbmRleCArIDFdID09PSB1bmRlZmluZWQgfHwgcGF0aFtjb2xvbkluZGV4ICsgMV0gPT09ICcvJykgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBjb25maWcucGF0aCBwYXJhbWV0ZXIgc2hvdWxkIGhhdmUgbm9uLWVtcHR5IG5hbWUuICR7cGF0aH1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcGF0aEZyYWdtZW50cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aE1hdGNoZXJzKHBhdGhGcmFnbWVudHMpIHsKICAgICAgICAgICAgcmV0dXJuIHBhdGhGcmFnbWVudHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmcmFnbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGZyYWdtZW50KSA9PiB7CiAgICAgICAgICAgICAgICBjb25zdCB7IHBhdGhQYXJ0IH0gPSBmcmFnbWVudDsKICAgICAgICAgICAgICAgIGlmIChmcmFnbWVudC5pc1BhcmFtKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhQYXJ0UXVlcnkKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChwYXRoUGFydFF1ZXJ5KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BhcmFtUGF0aFBhcnQ6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0TWF0Y2hlZDogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtTmFtZTogZnJhZ21lbnQucGFyYW1OYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1WYWx1ZTogcGF0aFBhcnRRdWVyeSwKICAgICAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhQYXJ0UXVlcnkKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChwYXRoUGFydFF1ZXJ5KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaXNQYXJhbVBhdGhQYXJ0OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgcGFydE1hdGNoZWQ6IHBhdGhQYXJ0UXVlcnkgPT09IHBhdGhQYXJ0LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbiBjYXNlIG9mIHBhcmFtZXRlciByZXByb2plY3Rpb24gZmFpbHVyZSAoY2Fubm90IGNyZWF0ZSByZWRpcmVjdGlvbgogICAgICAgICAqIHBhdGhuYW1lIGZyb20gcGFyYW1ldGVyIHByZXNlbnQgaW4gY3VycmVudCBwYXRobmFtZSksIGl0IHRocm93cyBhCiAgICAgICAgICogUmFuZ2VFcnJvci4KICAgICAgICAgKiBAcGFyYW0gez99IHBhdGhQYXJ0cwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWF0Y2gocGF0aFBhcnRzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGNvbWJpbmVkUGFyYW1zID0ge307CiAgICAgICAgICAgIGlmICh0aGlzLnBhdGhNYXRjaGVycy5sZW5ndGggIT09IHBhdGhQYXJ0cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IHJlc3VsdDogZmFsc2UgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBwYXRoSW5kZXggPSAwOwogICAgICAgICAgICBmb3IgKGNvbnN0IG1hdGNoZXIgb2YgdGhpcy5wYXRoTWF0Y2hlcnMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhUb01hdGNoID0gcGF0aFBhcnRzW3BhdGhJbmRleCsrXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlcihwYXRoVG9NYXRjaCk7CiAgICAgICAgICAgICAgICBpZiAoIW1hdGNoLnBhcnRNYXRjaGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzdWx0OiBmYWxzZSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKG1hdGNoLmlzUGFyYW1QYXRoUGFydCkgewogICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkUGFyYW1zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBjb21iaW5lZFBhcmFtcyksIHsgW21hdGNoLnBhcmFtTmFtZV06IG1hdGNoLnBhcmFtVmFsdWUgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMucmVkaXJlY3Rpb25GcmFnbWVudHMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhdGhQYXJ0cyA9IHRoaXMucmVwcm9qZWN0UGF0aEJ5UGFyYW1zKHRoaXMucmVkaXJlY3Rpb25GcmFnbWVudHMsIGNvbWJpbmVkUGFyYW1zKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcmVzdWx0OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczogY29tYmluZWRQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgcGF0aFBhcnRzOiBuZXdQYXRoUGFydHMsCiAgICAgICAgICAgICAgICAgICAgaXNSZWRpcmVjdGlvbjogdHJ1ZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJlc3VsdDogdHJ1ZSwKICAgICAgICAgICAgICAgIHBhcmFtczogY29tYmluZWRQYXJhbXMsCiAgICAgICAgICAgICAgICBwYXRoUGFydHMsCiAgICAgICAgICAgICAgICBpc1JlZGlyZWN0aW9uOiBmYWxzZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVwcm9qZWN0cyByb3V0ZSBwYXJhbWV0ZXIgdmFsdWVzIHRvIHBhdGggZnJhZ21lbnRzIGZvciBwYXRoIHBhcnRzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoRnJhZ21lbnRzCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXJhbXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlcHJvamVjdFBhdGhCeVBhcmFtcyhwYXRoRnJhZ21lbnRzLCBwYXJhbXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXRoUGFydHMgPSBbXTsKICAgICAgICAgICAgZm9yIChjb25zdCBmcmFnbWVudCBvZiBwYXRoRnJhZ21lbnRzKSB7CiAgICAgICAgICAgICAgICBpZiAoZnJhZ21lbnQuaXNQYXJhbSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcGFyYW1OYW1lIH0gPSBmcmFnbWVudDsKICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtcy5oYXNPd25Qcm9wZXJ0eShwYXJhbU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBGYWlsZWQgdG8gcmVwcm9qZWN0IHBhcmFtZXRlci4gIiR7cGFyYW1OYW1lfSIgcGFyYW1ldGVyIGAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3Nob3VsZCBiZSBwcmVzZW50LicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwYXRoUGFydHMucHVzaChwYXJhbXNbcGFyYW1OYW1lXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBwYXRoUGFydHMucHVzaChmcmFnbWVudC5wYXRoUGFydCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBhdGhQYXJ0czsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW4gY2FzZSBvZiBwYXJhbWV0ZXIgcHJvamVjdGlvbiBmYWlsdXJlIChjYW5ub3QgY3JlYXRlIHBhdGhuYW1lKSwgaXQgdGhyb3dzCiAgICAgICAgICogYSBSYW5nZUVycm9yLgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXRjaEJ5UGFyYW1zKHBhcmFtcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhdGhQYXJ0cyA9IHRoaXMucmVwcm9qZWN0UGF0aEJ5UGFyYW1zKHRoaXMucGF0aEZyYWdtZW50cywgcGFyYW1zKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJlc3VsdDogdHJ1ZSwKICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgIHBhdGhQYXJ0cywKICAgICAgICAgICAgICAgIGlzUmVkaXJlY3Rpb246IGZhbHNlLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFJvdXRlQ29uZmlncyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWdzCiAgICAgICAgICogQHBhcmFtIHs/PX0gbWF4UmVkaXJlY3Rpb24KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWdzLCBtYXhSZWRpcmVjdGlvbiA9IDMpIHsKICAgICAgICAgICAgdGhpcy5tYXhSZWRpcmVjdGlvbiA9IG1heFJlZGlyZWN0aW9uOwogICAgICAgICAgICBpZiAobWF4UmVkaXJlY3Rpb24gPCAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignbWF4UmVkaXJlY3Rpb24gaGFzIHRvIGJlIG5vbi1uZWdhdGl2ZSBudW1iZXInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnZhbGlkYXRlUm91dGVDb25maWdzKGNvbmZpZ3MpOwogICAgICAgICAgICB0aGlzLmRlZmF1bHRSb3V0ZUNvbmZpZyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucm91dGVLaW5kVG9Db25maWdNYXRjaGVycyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgdGhpcy5jb25maWdNYXRjaGVycyA9IFtdOwogICAgICAgICAgICBmb3IgKGNvbnN0IGNvbmZpZyBvZiBjb25maWdzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtYXRjaGVyID0gbmV3IFJvdXRlQ29uZmlnTWF0Y2hlcihjb25maWcpOwogICAgICAgICAgICAgICAgdGhpcy5jb25maWdNYXRjaGVycy5wdXNoKG1hdGNoZXIpOwogICAgICAgICAgICAgICAgaWYgKG1hdGNoZXIuY29uZmlnLnJvdXRlS2luZCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMucm91dGVLaW5kVG9Db25maWdNYXRjaGVycy5zZXQobWF0Y2hlci5jb25maWcucm91dGVLaW5kLCBtYXRjaGVyKTsKICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2hlci5jb25maWcuZGVmYXVsdFJvdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGVmYXVsdFJvdXRlQ29uZmlnID0gbWF0Y2hlcjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHZhbGlkYXRlUm91dGVDb25maWdzKGNvbmZpZ3MpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZWZhdWx0Um91dGVzID0gY29uZmlncy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJvdXRlRGVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocm91dGVEZWYpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKHJvdXRlRGVmLnJvdXRlS2luZCAhPT0gbnVsbCAmJiByb3V0ZURlZi5kZWZhdWx0Um91dGUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmIChkZWZhdWx0Um91dGVzLmxlbmd0aCA+IDEpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBhdGhzID0gZGVmYXVsdFJvdXRlcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh7IHBhdGggfSkgPT4gcGF0aCkpLmpvaW4oJywgJyk7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgVGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgZGVmYXVsdFJvdXRlcy4gJHtwYXRoc31gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChkZWZhdWx0Um91dGVzLmxlbmd0aCA9PT0gMSkgewogICAgICAgICAgICAgICAgY29uc3QgeyBwYXRoIH0gPSBkZWZhdWx0Um91dGVzWzBdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaGFzUGFyYW0gPSBCb29sZWFuKGdldFBhdGhGcmFnbWVudHMocGF0aCkuZmluZCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHsgaXNQYXJhbSB9KSA9PiBpc1BhcmFtKSkpOwogICAgICAgICAgICAgICAgaWYgKGhhc1BhcmFtKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEEgZGVmYXVsdFJvdXRlIGNhbm5vdCBoYXZlIGFueSBwYXJhbXMuICR7cGF0aH1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvdXRlS2luZENvbmZpZyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgZm9yIChjb25zdCB7IHJvdXRlS2luZCB9IG9mIGNvbmZpZ3MpIHsKICAgICAgICAgICAgICAgIGlmIChyb3V0ZUtpbmQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChyb3V0ZUtpbmRDb25maWcuaGFzKHJvdXRlS2luZCkpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgTXVsdGlwbGUgcm91dGUgY29uZmlndXJhdGlvbiBmb3Iga2luZDogJHtyb3V0ZUtpbmR9LiBgICsKICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbmZpZ3VyYXRpb25zIHNob3VsZCBoYXZlIHVuaXF1ZSByb3V0ZUtpbmRzJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByb3V0ZUtpbmRDb25maWcuYWRkKHJvdXRlS2luZCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuYXZpZ2F0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXRjaChuYXZpZ2F0aW9uKSB7CiAgICAgICAgICAgIGlmICghbmF2aWdhdGlvbi5wYXRobmFtZS5zdGFydHNXaXRoKCcvJykpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdOYXZpZ2F0aW9uIGhhcyB0byBtYWRlIHdpdGggcGF0aG5hbWUgdGhhdCBzdGFydHMgd2l0aCAiLyInKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBwYXRoUGFydHMgPSBnZXRQYXRoUGFydHMobmF2aWdhdGlvbi5wYXRobmFtZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHJlZGlyZWN0aW9uQ291bnQgPSAwOwogICAgICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHdhc1JlZGlyZWN0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWF0Y2hlciBvZiB0aGlzLmNvbmZpZ01hdGNoZXJzKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGNoID0gbWF0Y2hlci5tYXRjaChwYXRoUGFydHMpOwogICAgICAgICAgICAgICAgICAgIGlmIChtYXRjaC5yZXN1bHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBwYXJhbXMsIHBhdGhQYXJ0czogbmV3UGF0aFBhcnRzLCBpc1JlZGlyZWN0aW9uIH0gPSBtYXRjaDsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzUmVkaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhQYXJ0cyA9IG5ld1BhdGhQYXJ0czsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhc1JlZGlyZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25maWcgPSAoLyoqIEB0eXBlIHs/fSAqLyAobWF0Y2hlci5jb25maWcpKTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlS2luZDogY29uZmlnLnJvdXRlS2luZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBnZXRQYXRoRnJvbVBhcnRzKG5ld1BhdGhQYXJ0cyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWVwTGlua1Byb3ZpZGVyOiBjb25maWcuZGVlcExpbmtQcm92aWRlciB8fCBudWxsLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh3YXNSZWRpcmVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgcmVkaXJlY3Rpb25Db3VudCsrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJlZGlyZWN0aW9uQ291bnQgPiB0aGlzLm1heFJlZGlyZWN0aW9uIHx8ICF3YXNSZWRpcmVjdGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgbm90IHJlZGlyZWN0ZWQsIG5vIG5lZWQgdG8gcmVtYXRjaCB0aGUgcm91dGVzLiBBYm9ydC4KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAocmVkaXJlY3Rpb25Db3VudCA+IHRoaXMubWF4UmVkaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUG90ZW50aWFsIHJlZGlyZWN0aW9uIGxvb3AgKHJlZGlyZWN0aW5nIG1vcmUgdGhhbiBgICsKICAgICAgICAgICAgICAgICAgICBgJHt0aGlzLm1heFJlZGlyZWN0aW9ufSB0aW1lcy4gUGxlYXNlIGRvIG5vdCBoYXZlIGN5Y2xlcyBpbiB0aGUgYCArCiAgICAgICAgICAgICAgICAgICAgYHJvdXRlcy5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0Um91dGVDb25maWcpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLmRlZmF1bHRSb3V0ZUNvbmZpZy5jb25maWcpKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcm91dGVLaW5kOiBjb25maWcucm91dGVLaW5kLAogICAgICAgICAgICAgICAgICAgIHBhcmFtczoge30sCiAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU6IGNvbmZpZy5wYXRoLAogICAgICAgICAgICAgICAgICAgIGRlZXBMaW5rUHJvdmlkZXI6IGNvbmZpZy5kZWVwTGlua1Byb3ZpZGVyIHx8IG51bGwsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJvdXRlS2luZAogICAgICAgICAqIEBwYXJhbSB7P30gcGFyYW1zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXRjaEJ5Um91dGVLaW5kKHJvdXRlS2luZCwgcGFyYW1zKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWF0Y2hlciA9IHRoaXMucm91dGVLaW5kVG9Db25maWdNYXRjaGVycy5nZXQocm91dGVLaW5kKTsKICAgICAgICAgICAgaWYgKCFtYXRjaGVyIHx8ICFtYXRjaGVyLmNvbmZpZy5yb3V0ZUtpbmQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBSZXF1aXJlcyBjb25maWd1cmF0aW9uIGZvciByb3V0ZUtpbmQ6ICR7cm91dGVLaW5kfWApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWF0Y2ggPSBtYXRjaGVyLm1hdGNoQnlQYXJhbXMocGFyYW1zKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb25maWcgPSBtYXRjaGVyLmNvbmZpZzsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHJvdXRlS2luZCwKICAgICAgICAgICAgICAgIHBhcmFtcywKICAgICAgICAgICAgICAgIHBhdGhuYW1lOiBnZXRQYXRoRnJvbVBhcnRzKG1hdGNoLnBhdGhQYXJ0cyksCiAgICAgICAgICAgICAgICBkZWVwTGlua1Byb3ZpZGVyOiBjb25maWcuZGVlcExpbmtQcm92aWRlciB8fCBudWxsLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXRoUGFydHMocGF0aCkgewogICAgICAgIHJldHVybiBwYXRoLnNwbGl0KCcvJykuc2xpY2UoMSk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcGF0aFBhcnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQYXRoRnJvbVBhcnRzKHBhdGhQYXJ0cykgewogICAgICAgIHJldHVybiAnLycgKyBwYXRoUGFydHMuam9pbignLycpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9yb3V0aW5nL3JvdXRlX3JlZ2lzdHJ5X3R5cGVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJPVVRFX0NPTkZJR1NfVE9LRU4gPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1tBcHAgUm91dGluZ10gUm91dGUgQ29uZmlnJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYXBwX3JvdXRpbmcvcm91dGVfcmVnaXN0cnlfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJvdXRlUmVnaXN0cnlNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnc0xpc3QKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb25maWdzTGlzdCkgewogICAgICAgICAgICB0aGlzLnJvdXRlQ29uZmlncyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMucm91dGVLaW5kVG9OZ0NvbXBvbmVudCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgaWYgKCFjb25maWdzTGlzdCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29uZmlncyA9IFtdOwogICAgICAgICAgICBmb3IgKGNvbnN0IHJvdXRlRGVmTGlzdCBvZiBjb25maWdzTGlzdCkgewogICAgICAgICAgICAgICAgZm9yIChjb25zdCByb3V0ZURlZiBvZiByb3V0ZURlZkxpc3QpIHsKICAgICAgICAgICAgICAgICAgICBjb25maWdzLnB1c2gocm91dGVEZWYpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucm91dGVDb25maWdzID0gbmV3IFJvdXRlQ29uZmlncyhjb25maWdzKTsKICAgICAgICAgICAgY29uZmlncy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb25maWcpID0+IHsKICAgICAgICAgICAgICAgIGlmIChjb25maWcucm91dGVLaW5kKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yb3V0ZUtpbmRUb05nQ29tcG9uZW50LnNldChjb25maWcucm91dGVLaW5kLCBjb25maWcubmdDb21wb25lbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgUm91dGVDb25maWdzIG9mIGN1cnJlbnQgcm91dGUgY29uZmlndXJhdGlvbi4gUmV0dXJuc24gbnVsbCBpZiBubwogICAgICAgICAqIHJvdXRlcyBhcmUgcmVnaXN0ZXJlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFJvdXRlQ29uZmlncygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVDb25maWdzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJvdXRlS2luZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TmdDb21wb25lbnRCeVJvdXRlS2luZChyb3V0ZUtpbmQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucm91dGVLaW5kVG9OZ0NvbXBvbmVudC5nZXQocm91dGVLaW5kKSB8fCBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBbiBOZ01vZHVsZSB0aGF0IHJlZ2lzdGVycyByb3V0ZXMuCiAgICAgICAgICoKICAgICAgICAgKiBOb3RlOiBlc3BlY2lhbGx5IGJlY2F1c2UgUG9seW1lciBiYXNlZCBUZW5zb3JCb2FyZCByZXF1aXJlcyByZWxhdGl2ZSBwYXRocwogICAgICAgICAqIGZvciBtYWtpbmcgcmVxdWVzdHMsIGFsdGhvdWdoIG5vdCByZXF1aXJlZCwgcHJlZmVyIHRvIGhhdmUgcGF0aCB0aGF0IGVuZHMKICAgICAgICAgKiB3aXRoICIvIi4KICAgICAgICAgKgogICAgICAgICAqIEV4YW1wbGU6CiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiByb3V0ZVByb3ZpZGVyKCkgewogICAgICAgICAqICAgcmV0dXJuIFt7CiAgICAgICAgICogICAgIHBhdGg6ICcvZXhwZXJpbWVudHMvJywKICAgICAgICAgKiAgICAgbmdDb21wb25lbnQ6IFNjYWxhcnNEYXNoYm9hcmQsCiAgICAgICAgICogICAgIHJvdXRlS2luZDogUm91dGVLaW5kLkVYUEVSSU1FTlRTLAogICAgICAgICAqICAgfV07CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXEBOZ01vZHVsZSh7CiAgICAgICAgICogICBpbXBvcnRzOiBbCiAgICAgICAgICogICAgIFJvdXRlUmVnaXN0cnlNb2R1bGUucmVnaXN0ZXJSb3V0ZXMocm91dGVzUHJvdmlkZXIpLAogICAgICAgICAqICAgXSwKICAgICAgICAgKiAgIGVudHJ5Q29tcG9uZW50czogW1NjYWxhcnNEYXNoYm9hcmRdCiAgICAgICAgICogfSkKICAgICAgICAgKiBAcGFyYW0gez99IHJvdXRlQ29uZmlnUHJvdmlkZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyByZWdpc3RlclJvdXRlcyhyb3V0ZUNvbmZpZ1Byb3ZpZGVyKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBuZ01vZHVsZTogUm91dGVSZWdpc3RyeU1vZHVsZSwKICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogUk9VVEVfQ09ORklHU19UT0tFTiwKICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IHJvdXRlQ29uZmlnUHJvdmlkZXIsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgUm91dGVSZWdpc3RyeU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7fSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBSb3V0ZVJlZ2lzdHJ5TW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbUk9VVEVfQ09ORklHU19UT0tFTixdIH1dIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUm91dGVSZWdpc3RyeU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFJvdXRlUmVnaXN0cnlNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUm91dGVSZWdpc3RyeU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFJvdXRlUmVnaXN0cnlNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUm91dGVSZWdpc3RyeU1vZHVsZSkoybXJtWluamVjdChST1VURV9DT05GSUdTX1RPS0VOLCA4KSk7IH0gfSk7CgogICAgY29uc3QgQVBQX1JPVVRJTkdfRkVBVFVSRV9LRVkgPSAnYXBwX3JvdXRpbmcnOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3QgZ2V0QXBwUm91dGluZ1N0YXRlID0gY3JlYXRlRmVhdHVyZVNlbGVjdG9yKEFQUF9ST1VUSU5HX0ZFQVRVUkVfS0VZKTsKICAgIGNvbnN0IGdldEFjdGl2ZVJvdXRlID0gY3JlYXRlU2VsZWN0b3IoZ2V0QXBwUm91dGluZ1N0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuYWN0aXZlUm91dGU7CiAgICB9KTsKICAgIGNvbnN0IGdldE5leHRSb3V0ZUZvclJvdXRlck91dGxldE9ubHkgPSBjcmVhdGVTZWxlY3RvcihnZXRBcHBSb3V0aW5nU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5uZXh0Um91dGU7CiAgICB9KTsKICAgIGNvbnN0IGdldFJvdXRlS2luZCA9IGNyZWF0ZVNlbGVjdG9yKGdldEFjdGl2ZVJvdXRlLCAoYWN0aXZlUm91dGUpID0+IHsKICAgICAgICByZXR1cm4gYWN0aXZlUm91dGUgPyBhY3RpdmVSb3V0ZS5yb3V0ZUtpbmQgOiBSb3V0ZUtpbmQuVU5LTk9XTjsKICAgIH0pOwogICAgY29uc3QgZ2V0Um91dGVQYXJhbXMgPSBjcmVhdGVTZWxlY3RvcihnZXRBY3RpdmVSb3V0ZSwgKGFjdGl2ZVJvdXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIGFjdGl2ZVJvdXRlID8gYWN0aXZlUm91dGUucGFyYW1zIDoge307CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBleHBlcmltZW50IGlkcyBhY3RpdmF0ZWQgYnkgcm91dGUuIFRoZSB2YWx1ZSBjYW4gYmUgbnVsbCBpZiBjdXJyZW50CiAgICAgKiByb3V0ZSBkb2VzIG5vdCBoYXZlIGVpZHMuCiAgICAgKi8KICAgIGNvbnN0IGdldEV4cGVyaW1lbnRJZHNGcm9tUm91dGUgPSBjcmVhdGVTZWxlY3RvcihnZXRSb3V0ZUtpbmQsIGdldFJvdXRlUGFyYW1zLCAocm91dGVLaW5kLCByb3V0ZVBhcmFtcykgPT4gewogICAgICAgIHJldHVybiBnZXRFeHBlcmltZW50SWRzRnJvbVJvdXRlUGFyYW1zKHJvdXRlS2luZCwgcm91dGVQYXJhbXMpOwogICAgfSk7CiAgICBjb25zdCBnZXRSb3V0ZUlkJDEgPSBjcmVhdGVTZWxlY3RvcihnZXRSb3V0ZUtpbmQsIGdldFJvdXRlUGFyYW1zLCAocm91dGVLaW5kLCByb3V0ZVBhcmFtcykgPT4gewogICAgICAgIHJldHVybiBnZXRSb3V0ZUlkKHJvdXRlS2luZCwgcm91dGVQYXJhbXMpOwogICAgfSk7CiAgICBjb25zdCBnZXRFeHBlcmltZW50SWRUb0FsaWFzTWFwID0gY3JlYXRlU2VsZWN0b3IoZ2V0Um91dGVLaW5kLCBnZXRSb3V0ZVBhcmFtcywgKHJvdXRlS2luZCwgcm91dGVQYXJhbXMpID0+IHsKICAgICAgICBjb25zdCBpZFRvRGlzcGxheU5hbWUgPSB7fTsKICAgICAgICBpZiAocm91dGVLaW5kICE9PSBSb3V0ZUtpbmQuQ09NUEFSRV9FWFBFUklNRU5UKSB7CiAgICAgICAgICAgIHJldHVybiBpZFRvRGlzcGxheU5hbWU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGNvbXBhcmVQYXJhbXMgPSByb3V0ZVBhcmFtczsKICAgICAgICBjb25zdCBuYW1lQW5kSWRzID0gcGFyc2VDb21wYXJlRXhwZXJpbWVudFN0cihjb21wYXJlUGFyYW1zLmV4cGVyaW1lbnRJZHMpOwogICAgICAgIGZvciAoY29uc3QgeyBpZCwgbmFtZSB9IG9mIG5hbWVBbmRJZHMpIHsKICAgICAgICAgICAgaWRUb0Rpc3BsYXlOYW1lW2lkXSA9IG5hbWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBpZFRvRGlzcGxheU5hbWU7CiAgICB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hcHBfcm91dGluZy92aWV3cy9yb3V0ZXJfb3V0bGV0X2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkOSA9IFsicm91dGVDb250YWluZXIiXTsKICAgIGNsYXNzIFJvdXRlck91dGxldENvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpIHsKICAgICAgICAgICAgdGhpcy5jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgPSBjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFjdGl2ZUNvbXBvbmVudENoYW5nZSA9IGNoYW5nZXNbJ2FjdGl2ZU5nQ29tcG9uZW50J107CiAgICAgICAgICAgIGlmIChhY3RpdmVDb21wb25lbnRDaGFuZ2UpIHsKICAgICAgICAgICAgICAgIHRoaXMucm91dGVDb250YWluZXIuY2xlYXIoKTsKICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDb21wb25lbnRDaGFuZ2UuY3VycmVudFZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShhY3RpdmVDb21wb25lbnRDaGFuZ2UuY3VycmVudFZhbHVlKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnJvdXRlQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFJvdXRlck91dGxldENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAncm91dGVyLW91dGxldC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgIDxuZy1jb250YWluZXIgI3JvdXRlQ29udGFpbmVyPjwvbmctY29udGFpbmVyPiBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBSb3V0ZXJPdXRsZXRDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfQogICAgXTsKICAgIFJvdXRlck91dGxldENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICByb3V0ZUNvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3JvdXRlQ29udGFpbmVyJywgeyBzdGF0aWM6IHRydWUsIHJlYWQ6IFZpZXdDb250YWluZXJSZWYgfSxdIH1dLAogICAgICAgIGFjdGl2ZU5nQ29tcG9uZW50OiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSb3V0ZXJPdXRsZXRDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBSb3V0ZXJPdXRsZXRDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUm91dGVyT3V0bGV0Q29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlcikpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJvdXRlck91dGxldENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSb3V0ZXJPdXRsZXRDb21wb25lbnQsIHNlbGVjdG9yczogW1sicm91dGVyLW91dGxldC1jb21wb25lbnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gUm91dGVyT3V0bGV0Q29tcG9uZW50X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KF9jMCQ5LCB0cnVlLCBWaWV3Q29udGFpbmVyUmVmKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnJvdXRlQ29udGFpbmVyID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGFjdGl2ZU5nQ29tcG9uZW50OiAiYWN0aXZlTmdDb21wb25lbnQiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0sIGRlY2xzOiAyLCB2YXJzOiAwLCBjb25zdHM6IFtbInJvdXRlQ29udGFpbmVyIiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFJvdXRlck91dGxldENvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMCwgbnVsbCwgMCk7CiAgICAgICAgfSB9LCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYXBwX3JvdXRpbmcvdmlld3Mvcm91dGVyX291dGxldF9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUm91dGVyT3V0bGV0Q29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICogQHBhcmFtIHs/fSByZWdpc3RyeQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlLCByZWdpc3RyeSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKICAgICAgICAgICAgdGhpcy5hY3RpdmVOZ0NvbXBvbmVudCQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJvdXRlKSwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldE5leHRSb3V0ZUZvclJvdXRlck91dGxldE9ubHkpLAogICAgICAgICAgICBdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2FjdGl2ZVJvdXRlLCBuZXh0Um91dGVdKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIWFjdGl2ZVJvdXRlKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc1JvdXRlVHJhbnNpdGlvbmluZyA9IG5leHRSb3V0ZSAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgIGdldFJvdXRlSWQobmV4dFJvdXRlLnJvdXRlS2luZCwgbmV4dFJvdXRlLnBhcmFtcykgIT09CiAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvdXRlSWQoYWN0aXZlUm91dGUucm91dGVLaW5kLCBhY3RpdmVSb3V0ZS5wYXJhbXMpOwogICAgICAgICAgICAgICAgcmV0dXJuIGlzUm91dGVUcmFuc2l0aW9uaW5nCiAgICAgICAgICAgICAgICAgICAgPyBudWxsCiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJlZ2lzdHJ5LmdldE5nQ29tcG9uZW50QnlSb3V0ZUtpbmQoYWN0aXZlUm91dGUucm91dGVLaW5kKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICB9CiAgICBSb3V0ZXJPdXRsZXRDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3JvdXRlci1vdXRsZXQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8cm91dGVyLW91dGxldC1jb21wb25lbnQKICAgICAgW2FjdGl2ZU5nQ29tcG9uZW50XT0iYWN0aXZlTmdDb21wb25lbnQkIHwgYXN5bmMiCiAgICA+PC9yb3V0ZXItb3V0bGV0LWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBSb3V0ZXJPdXRsZXRDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogUm91dGVSZWdpc3RyeU1vZHVsZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJvdXRlck91dGxldENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFJvdXRlck91dGxldENvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSb3V0ZXJPdXRsZXRDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFJvdXRlUmVnaXN0cnlNb2R1bGUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSb3V0ZXJPdXRsZXRDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUm91dGVyT3V0bGV0Q29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInJvdXRlci1vdXRsZXQiXV0sIGRlY2xzOiAyLCB2YXJzOiAzLCBjb25zdHM6IFtbMywgImFjdGl2ZU5nQ29tcG9uZW50Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUm91dGVyT3V0bGV0Q29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAicm91dGVyLW91dGxldC1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiYWN0aXZlTmdDb21wb25lbnQiLCDJtcm1cGlwZUJpbmQxKDEsIDEsIGN0eC5hY3RpdmVOZ0NvbXBvbmVudCQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtSb3V0ZXJPdXRsZXRDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICBjbGFzcyBMYXlvdXRNb2R1bGUgewogICAgfQogICAgTGF5b3V0TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTGF5b3V0TW9kdWxlIH0pOwogICAgTGF5b3V0TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTGF5b3V0TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExheW91dE1vZHVsZSkoKTsgfSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvbGF5b3V0L21lZGlhLW1hdGNoZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBHbG9iYWwgcmVnaXN0cnkgZm9yIGFsbCBkeW5hbWljYWxseS1jcmVhdGVkLCBpbmplY3RlZCBtZWRpYSBxdWVyaWVzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IG1lZGlhUXVlcmllc0ZvcldlYmtpdENvbXBhdGliaWxpdHkgPSBuZXcgU2V0KCk7CiAgICAvKioKICAgICAqIFN0eWxlIHRhZyB0aGF0IGhvbGRzIGFsbCBvZiB0aGUgZHluYW1pY2FsbHktY3JlYXRlZCBtZWRpYSBxdWVyaWVzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGxldCBtZWRpYVF1ZXJ5U3R5bGVOb2RlOwogICAgLyoqCiAgICAgKiBBIHV0aWxpdHkgZm9yIGNhbGxpbmcgbWF0Y2hNZWRpYSBxdWVyaWVzLgogICAgICovCiAgICBjbGFzcyBNZWRpYU1hdGNoZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BsYXRmb3JtKSB7CiAgICAgICAgICAgIHRoaXMuX3BsYXRmb3JtID0gX3BsYXRmb3JtOwogICAgICAgICAgICB0aGlzLl9tYXRjaE1lZGlhID0gdGhpcy5fcGxhdGZvcm0uaXNCcm93c2VyICYmIHdpbmRvdy5tYXRjaE1lZGlhID8KICAgICAgICAgICAgICAgIC8vIG1hdGNoTWVkaWEgaXMgYm91bmQgdG8gdGhlIHdpbmRvdyBzY29wZSBpbnRlbnRpb25hbGx5IGFzIGl0IGlzIGFuIGlsbGVnYWwgaW52b2NhdGlvbiB0bwogICAgICAgICAgICAgICAgLy8gY2FsbCBpdCBmcm9tIGEgZGlmZmVyZW50IHNjb3BlLgogICAgICAgICAgICAgICAgd2luZG93Lm1hdGNoTWVkaWEuYmluZCh3aW5kb3cpIDoKICAgICAgICAgICAgICAgIG5vb3BNYXRjaE1lZGlhOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFdmFsdWF0ZXMgdGhlIGdpdmVuIG1lZGlhIHF1ZXJ5IGFuZCByZXR1cm5zIHRoZSBuYXRpdmUgTWVkaWFRdWVyeUxpc3QgZnJvbSB3aGljaCByZXN1bHRzCiAgICAgICAgICogY2FuIGJlIHJldHJpZXZlZC4KICAgICAgICAgKiBDb25maXJtcyB0aGUgbGF5b3V0IGVuZ2luZSB3aWxsIHRyaWdnZXIgZm9yIHRoZSBzZWxlY3RvciBxdWVyeSBwcm92aWRlZCBhbmQgcmV0dXJucyB0aGUKICAgICAgICAgKiBNZWRpYVF1ZXJ5TGlzdCBmb3IgdGhlIHF1ZXJ5IHByb3ZpZGVkLgogICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1hdGNoTWVkaWEocXVlcnkpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3BsYXRmb3JtLldFQktJVCkgewogICAgICAgICAgICAgICAgY3JlYXRlRW1wdHlTdHlsZVJ1bGUocXVlcnkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tYXRjaE1lZGlhKHF1ZXJ5KTsKICAgICAgICB9CiAgICB9CiAgICBNZWRpYU1hdGNoZXIuybVmYWMgPSBmdW5jdGlvbiBNZWRpYU1hdGNoZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWVkaWFNYXRjaGVyKSjJtcm1aW5qZWN0KFBsYXRmb3JtKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1lZGlhTWF0Y2hlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWVkaWFNYXRjaGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gTWVkaWFNYXRjaGVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgTWVkaWFNYXRjaGVyKMm1ybVpbmplY3QoUGxhdGZvcm0pKTsgfSwgdG9rZW46IE1lZGlhTWF0Y2hlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwogICAgLyoqCiAgICAgKiBGb3IgV2Via2l0IGVuZ2luZXMgdGhhdCBvbmx5IHRyaWdnZXIgdGhlIE1lZGlhUXVlcnlMaXN0TGlzdGVuZXIgd2hlbgogICAgICogdGhlcmUgaXMgYXQgbGVhc3Qgb25lIENTUyBzZWxlY3RvciBmb3IgdGhlIHJlc3BlY3RpdmUgbWVkaWEgcXVlcnkuCiAgICAgKiBAcGFyYW0gez99IHF1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVFbXB0eVN0eWxlUnVsZShxdWVyeSkgewogICAgICAgIGlmIChtZWRpYVF1ZXJpZXNGb3JXZWJraXRDb21wYXRpYmlsaXR5LmhhcyhxdWVyeSkpIHsKICAgICAgICAgICAgcmV0dXJuOwogICAgICAgIH0KICAgICAgICB0cnkgewogICAgICAgICAgICBpZiAoIW1lZGlhUXVlcnlTdHlsZU5vZGUpIHsKICAgICAgICAgICAgICAgIG1lZGlhUXVlcnlTdHlsZU5vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgbWVkaWFRdWVyeVN0eWxlTm9kZS5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCAndGV4dC9jc3MnKTsKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5oZWFkKSkuYXBwZW5kQ2hpbGQobWVkaWFRdWVyeVN0eWxlTm9kZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKG1lZGlhUXVlcnlTdHlsZU5vZGUuc2hlZXQpIHsKICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAobWVkaWFRdWVyeVN0eWxlTm9kZS5zaGVldCkpKQogICAgICAgICAgICAgICAgICAgIC5pbnNlcnRSdWxlKGBAbWVkaWEgJHtxdWVyeX0gey5meC1xdWVyeS10ZXN0eyB9fWAsIDApOwogICAgICAgICAgICAgICAgbWVkaWFRdWVyaWVzRm9yV2Via2l0Q29tcGF0aWJpbGl0eS5hZGQocXVlcnkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNhdGNoIChlKSB7CiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBOby1vcCBtYXRjaE1lZGlhIHJlcGxhY2VtZW50IGZvciBub24tYnJvd3NlciBwbGF0Zm9ybXMuCiAgICAgKiBAcGFyYW0gez99IHF1ZXJ5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBub29wTWF0Y2hNZWRpYShxdWVyeSkgewogICAgICAgIC8vIFVzZSBgYXMgYW55YCBoZXJlIHRvIGF2b2lkIGFkZGluZyBhZGRpdGlvbmFsIG5lY2Vzc2FyeSBwcm9wZXJ0aWVzIGZvcgogICAgICAgIC8vIHRoZSBub29wIG1hdGNoZXIuCiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgICAgIG1hdGNoZXM6IHF1ZXJ5ID09PSAnYWxsJyB8fCBxdWVyeSA9PT0gJycsCiAgICAgICAgICAgIG1lZGlhOiBxdWVyeSwKICAgICAgICAgICAgYWRkTGlzdGVuZXI6ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSksCiAgICAgICAgICAgIHJlbW92ZUxpc3RlbmVyOiAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pCiAgICAgICAgfSkpOwogICAgfQogICAgLyoqCiAgICAgKiBVdGlsaXR5IGZvciBjaGVja2luZyB0aGUgbWF0Y2hpbmcgc3RhdGUgb2YgXEBtZWRpYSBxdWVyaWVzLgogICAgICovCiAgICBjbGFzcyBCcmVha3BvaW50T2JzZXJ2ZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX21lZGlhTWF0Y2hlcgogICAgICAgICAqIEBwYXJhbSB7P30gX3pvbmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfbWVkaWFNYXRjaGVyLCBfem9uZSkgewogICAgICAgICAgICB0aGlzLl9tZWRpYU1hdGNoZXIgPSBfbWVkaWFNYXRjaGVyOwogICAgICAgICAgICB0aGlzLl96b25lID0gX3pvbmU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIG1hcCBvZiBhbGwgbWVkaWEgcXVlcmllcyBjdXJyZW50bHkgYmVpbmcgbGlzdGVuZWQgZm9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcXVlcmllcyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEEgc3ViamVjdCBmb3IgYWxsIG90aGVyIG9ic2VydmFibGVzIHRvIHRha2VVbnRpbCBiYXNlZCBvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lTdWJqZWN0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcGxldGVzIHRoZSBhY3RpdmUgc3ViamVjdCwgc2lnbmFsbGluZyB0byBhbGwgb3RoZXIgb2JzZXJ2YWJsZXMgdG8gY29tcGxldGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveVN1YmplY3QubmV4dCgpOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95U3ViamVjdC5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9uZSBvciBtb3JlIG1lZGlhIHF1ZXJpZXMgbWF0Y2ggdGhlIGN1cnJlbnQgdmlld3BvcnQgc2l6ZS4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlIE9uZSBvciBtb3JlIG1lZGlhIHF1ZXJpZXMgdG8gY2hlY2suCiAgICAgICAgICogQHJldHVybiB7P30gV2hldGhlciBhbnkgb2YgdGhlIG1lZGlhIHF1ZXJpZXMgbWF0Y2guCiAgICAgICAgICovCiAgICAgICAgaXNNYXRjaGVkKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcXVlcmllcyA9IHNwbGl0UXVlcmllcyhjb2VyY2VBcnJheSh2YWx1ZSkpOwogICAgICAgICAgICByZXR1cm4gcXVlcmllcy5zb21lKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBtZWRpYVF1ZXJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBtZWRpYVF1ZXJ5ID0+IHRoaXMuX3JlZ2lzdGVyUXVlcnkobWVkaWFRdWVyeSkubXFsLm1hdGNoZXMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIG9mIHJlc3VsdHMgZm9yIHRoZSBnaXZlbiBxdWVyaWVzIHRoYXQgd2lsbCBlbWl0IG5ldyByZXN1bHRzIGZvciBhbnkgY2hhbmdlcwogICAgICAgICAqIGluIG1hdGNoaW5nIG9mIHRoZSBnaXZlbiBxdWVyaWVzLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUgT25lIG9yIG1vcmUgbWVkaWEgcXVlcmllcyB0byBjaGVjay4KICAgICAgICAgKiBAcmV0dXJuIHs/fSBBIHN0cmVhbSBvZiBtYXRjaGVzIGZvciB0aGUgZ2l2ZW4gcXVlcmllcy4KICAgICAgICAgKi8KICAgICAgICBvYnNlcnZlKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcXVlcmllcyA9IHNwbGl0UXVlcmllcyhjb2VyY2VBcnJheSh2YWx1ZSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGVzID0gcXVlcmllcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBxdWVyeSA9PiB0aGlzLl9yZWdpc3RlclF1ZXJ5KHF1ZXJ5KS5vYnNlcnZhYmxlKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHN0YXRlT2JzZXJ2YWJsZSA9IGNvbWJpbmVMYXRlc3Qob2JzZXJ2YWJsZXMpOwogICAgICAgICAgICAvLyBFbWl0IHRoZSBmaXJzdCBzdGF0ZSBpbW1lZGlhdGVseSwgYW5kIHRoZW4gZGVib3VuY2UgdGhlIHN1YnNlcXVlbnQgZW1pc3Npb25zLgogICAgICAgICAgICBzdGF0ZU9ic2VydmFibGUgPSBjb25jYXQoc3RhdGVPYnNlcnZhYmxlLnBpcGUodGFrZSgxKSksIHN0YXRlT2JzZXJ2YWJsZS5waXBlKHNraXAoMSksIGRlYm91bmNlVGltZSgwKSkpOwogICAgICAgICAgICByZXR1cm4gc3RhdGVPYnNlcnZhYmxlLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBicmVha3BvaW50U3RhdGVzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYnJlYWtwb2ludFN0YXRlcykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVzcG9uc2UgPSB7CiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlczogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtwb2ludHM6IHt9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIGJyZWFrcG9pbnRTdGF0ZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoc3RhdGUpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5tYXRjaGVzID0gcmVzcG9uc2UubWF0Y2hlcyB8fCBzdGF0ZS5tYXRjaGVzOwogICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmJyZWFrcG9pbnRzW3N0YXRlLnF1ZXJ5XSA9IHN0YXRlLm1hdGNoZXM7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzcG9uc2U7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZ2lzdGVycyBhIHNwZWNpZmljIHF1ZXJ5IHRvIGJlIGxpc3RlbmVkIGZvci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZWdpc3RlclF1ZXJ5KHF1ZXJ5KSB7CiAgICAgICAgICAgIC8vIE9ubHkgc2V0IHVwIGEgbmV3IE1lZGlhUXVlcnlMaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGJlaW5nIGxpc3RlbmVkIGZvci4KICAgICAgICAgICAgaWYgKHRoaXMuX3F1ZXJpZXMuaGFzKHF1ZXJ5KSkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLl9xdWVyaWVzLmdldChxdWVyeSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1xbCA9IHRoaXMuX21lZGlhTWF0Y2hlci5tYXRjaE1lZGlhKHF1ZXJ5KTsKICAgICAgICAgICAgLy8gQ3JlYXRlIGNhbGxiYWNrIGZvciBtYXRjaCBjaGFuZ2VzIGFuZCBhZGQgaXQgaXMgYXMgYSBsaXN0ZW5lci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBxdWVyeU9ic2VydmFibGUgPSBuZXcgT2JzZXJ2YWJsZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb2JzZXJ2ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvYnNlcnZlcikgPT4gewogICAgICAgICAgICAgICAgLy8gTGlzdGVuZXIgY2FsbGJhY2sgbWV0aG9kcyBhcmUgd3JhcHBlZCB0byBiZSBwbGFjZWQgYmFjayBpbiBuZ1pvbmUuIENhbGxiYWNrcyBtdXN0IGJlIHBsYWNlZAogICAgICAgICAgICAgICAgLy8gYmFjayBpbnRvIHRoZSB6b25lIGJlY2F1c2UgbWF0Y2hNZWRpYSBpcyBvbmx5IGluY2x1ZGVkIGluIFpvbmUuanMgYnkgbG9hZGluZyB0aGUKICAgICAgICAgICAgICAgIC8vIHdlYmFwaXMtbWVkaWEtcXVlcnkuanMgZmlsZSBhbG9uZ3NpZGUgdGhlIHpvbmUuanMgZmlsZS4gIEFkZGl0aW9uYWxseSwgc29tZSBicm93c2VycyBkbyBub3QKICAgICAgICAgICAgICAgIC8vIGhhdmUgTWVkaWFRdWVyeUxpc3QgaW5oZXJpdCBmcm9tIEV2ZW50VGFyZ2V0LCB3aGljaCBjYXVzZXMgaW5jb25zaXN0ZW5jaWVzIGluIGhvdyBab25lLmpzCiAgICAgICAgICAgICAgICAvLyBwYXRjaGVzIGl0LgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9ICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGUpID0+IHRoaXMuX3pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IG9ic2VydmVyLm5leHQoZSkpKSk7CiAgICAgICAgICAgICAgICBtcWwuYWRkTGlzdGVuZXIoaGFuZGxlcik7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIG1xbC5yZW1vdmVMaXN0ZW5lcihoYW5kbGVyKTsKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9KSkucGlwZShzdGFydFdpdGgobXFsKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuZXh0TXFsCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobmV4dE1xbCkgPT4gKHsgcXVlcnksIG1hdGNoZXM6IG5leHRNcWwubWF0Y2hlcyB9KSkpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveVN1YmplY3QpKTsKICAgICAgICAgICAgLy8gQWRkIHRoZSBNZWRpYVF1ZXJ5TGlzdCB0byB0aGUgc2V0IG9mIHF1ZXJpZXMuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3V0cHV0ID0geyBvYnNlcnZhYmxlOiBxdWVyeU9ic2VydmFibGUsIG1xbCB9OwogICAgICAgICAgICB0aGlzLl9xdWVyaWVzLnNldChxdWVyeSwgb3V0cHV0KTsKICAgICAgICAgICAgcmV0dXJuIG91dHB1dDsKICAgICAgICB9CiAgICB9CiAgICBCcmVha3BvaW50T2JzZXJ2ZXIuybVmYWMgPSBmdW5jdGlvbiBCcmVha3BvaW50T2JzZXJ2ZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQnJlYWtwb2ludE9ic2VydmVyKSjJtcm1aW5qZWN0KE1lZGlhTWF0Y2hlciksIMm1ybVpbmplY3QoTmdab25lKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEJyZWFrcG9pbnRPYnNlcnZlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE1lZGlhTWF0Y2hlciB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQnJlYWtwb2ludE9ic2VydmVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gQnJlYWtwb2ludE9ic2VydmVyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgQnJlYWtwb2ludE9ic2VydmVyKMm1ybVpbmplY3QoTWVkaWFNYXRjaGVyKSwgybXJtWluamVjdChOZ1pvbmUpKTsgfSwgdG9rZW46IEJyZWFrcG9pbnRPYnNlcnZlciwgcHJvdmlkZWRJbjogInJvb3QiIH0pOwogICAgLyoqCiAgICAgKiBTcGxpdCBlYWNoIHF1ZXJ5IHN0cmluZyBpbnRvIHNlcGFyYXRlIHF1ZXJ5IHN0cmluZ3MgaWYgdHdvIHF1ZXJpZXMgYXJlIHByb3ZpZGVkIGFzIGNvbW1hCiAgICAgKiBzZXBhcmF0ZWQuCiAgICAgKiBAcGFyYW0gez99IHF1ZXJpZXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHNwbGl0UXVlcmllcyhxdWVyaWVzKSB7CiAgICAgICAgcmV0dXJuIHF1ZXJpZXMubWFwKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHF1ZXJ5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAocXVlcnkpID0+IHF1ZXJ5LnNwbGl0KCcsJykpKQogICAgICAgICAgICAucmVkdWNlKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGExCiAgICAgICAgICogQHBhcmFtIHs/fSBhMgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGExLCBhMikgPT4gYTEuY29uY2F0KGEyKSkpCiAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHF1ZXJ5ID0+IHF1ZXJ5LnRyaW0oKSkpOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL2Nkay9sYXlvdXQvYnJlYWtwb2ludHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gUGFzY2FsQ2FzZSBpcyBiZWluZyB1c2VkIGFzIEJyZWFrcG9pbnRzIGlzIHVzZWQgbGlrZSBhbiBlbnVtLgogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOnZhcmlhYmxlLW5hbWUKICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBCcmVha3BvaW50cyA9IHsKICAgICAgICBYU21hbGw6ICcobWF4LXdpZHRoOiA1OTkuOTlweCknLAogICAgICAgIFNtYWxsOiAnKG1pbi13aWR0aDogNjAwcHgpIGFuZCAobWF4LXdpZHRoOiA5NTkuOTlweCknLAogICAgICAgIE1lZGl1bTogJyhtaW4td2lkdGg6IDk2MHB4KSBhbmQgKG1heC13aWR0aDogMTI3OS45OXB4KScsCiAgICAgICAgTGFyZ2U6ICcobWluLXdpZHRoOiAxMjgwcHgpIGFuZCAobWF4LXdpZHRoOiAxOTE5Ljk5cHgpJywKICAgICAgICBYTGFyZ2U6ICcobWluLXdpZHRoOiAxOTIwcHgpJywKICAgICAgICBIYW5kc2V0OiAnKG1heC13aWR0aDogNTk5Ljk5cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KSwgJyArCiAgICAgICAgICAgICcobWF4LXdpZHRoOiA5NTkuOTlweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKScsCiAgICAgICAgVGFibGV0OiAnKG1pbi13aWR0aDogNjAwcHgpIGFuZCAobWF4LXdpZHRoOiA4MzkuOTlweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpLCAnICsKICAgICAgICAgICAgJyhtaW4td2lkdGg6IDk2MHB4KSBhbmQgKG1heC13aWR0aDogMTI3OS45OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJywKICAgICAgICBXZWI6ICcobWluLXdpZHRoOiA4NDBweCkgYW5kIChvcmllbnRhdGlvbjogcG9ydHJhaXQpLCAnICsKICAgICAgICAgICAgJyhtaW4td2lkdGg6IDEyODBweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKScsCiAgICAgICAgSGFuZHNldFBvcnRyYWl0OiAnKG1heC13aWR0aDogNTk5Ljk5cHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KScsCiAgICAgICAgVGFibGV0UG9ydHJhaXQ6ICcobWluLXdpZHRoOiA2MDBweCkgYW5kIChtYXgtd2lkdGg6IDgzOS45OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBwb3J0cmFpdCknLAogICAgICAgIFdlYlBvcnRyYWl0OiAnKG1pbi13aWR0aDogODQwcHgpIGFuZCAob3JpZW50YXRpb246IHBvcnRyYWl0KScsCiAgICAgICAgSGFuZHNldExhbmRzY2FwZTogJyhtYXgtd2lkdGg6IDk1OS45OXB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJywKICAgICAgICBUYWJsZXRMYW5kc2NhcGU6ICcobWluLXdpZHRoOiA5NjBweCkgYW5kIChtYXgtd2lkdGg6IDEyNzkuOTlweCkgYW5kIChvcmllbnRhdGlvbjogbGFuZHNjYXBlKScsCiAgICAgICAgV2ViTGFuZHNjYXBlOiAnKG1pbi13aWR0aDogMTI4MHB4KSBhbmQgKG9yaWVudGF0aW9uOiBsYW5kc2NhcGUpJywKICAgIH07CgogICAgZnVuY3Rpb24gU2ltcGxlU25hY2tCYXJfZGl2XzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IyID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiYnV0dG9uIiwgMik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFNpbXBsZVNuYWNrQmFyX2Rpdl8yX1RlbXBsYXRlX2J1dHRvbl9jbGlja18xX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyKTsgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEuYWN0aW9uKCk7IH0pOwogICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4X3IwLmRhdGEuYWN0aW9uKTsKICAgIH0gfQogICAgZnVuY3Rpb24gTWF0U25hY2tCYXJDb250YWluZXJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IH0KICAgIC8qKgogICAgICogTWF4aW11bSBhbW91bnQgb2YgbWlsbGlzZWNvbmRzIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvIHNldFRpbWVvdXQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFYX1RJTUVPVVQgPSBNYXRoLnBvdygyLCAzMSkgLSAxOwogICAgLyoqCiAgICAgKiBSZWZlcmVuY2UgdG8gYSBzbmFjayBiYXIgZGlzcGF0Y2hlZCBmcm9tIHRoZSBzbmFjayBiYXIgc2VydmljZS4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIE1hdFNuYWNrQmFyUmVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRhaW5lckluc3RhbmNlCiAgICAgICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheVJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbnRhaW5lckluc3RhbmNlLCBfb3ZlcmxheVJlZikgewogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gX292ZXJsYXlSZWY7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgc25hY2sgYmFyIGhhcyBiZWVuIGRpc21pc3NlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2FmdGVyRGlzbWlzc2VkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YmplY3QgZm9yIG5vdGlmeWluZyB0aGUgdXNlciB0aGF0IHRoZSBzbmFjayBiYXIgaGFzIG9wZW5lZCBhbmQgYXBwZWFyZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hZnRlck9wZW5lZCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhlIHVzZXIgdGhhdCB0aGUgc25hY2sgYmFyIGFjdGlvbiB3YXMgY2FsbGVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25BY3Rpb24gPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgc25hY2sgYmFyIHdhcyBkaXNtaXNzZWQgdXNpbmcgdGhlIGFjdGlvbiBidXR0b24uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kaXNtaXNzZWRCeUFjdGlvbiA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmNvbnRhaW5lckluc3RhbmNlID0gY29udGFpbmVySW5zdGFuY2U7CiAgICAgICAgICAgIC8vIERpc21pc3Mgc25hY2tiYXIgb24gYWN0aW9uLgogICAgICAgICAgICB0aGlzLm9uQWN0aW9uKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuZGlzbWlzcygpKSk7CiAgICAgICAgICAgIGNvbnRhaW5lckluc3RhbmNlLl9vbkV4aXQuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX2ZpbmlzaERpc21pc3MoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNtaXNzZXMgdGhlIHNuYWNrIGJhci4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRpc21pc3MoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fYWZ0ZXJEaXNtaXNzZWQuY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvbnRhaW5lckluc3RhbmNlLmV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fZHVyYXRpb25UaW1lb3V0SWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyB0aGUgc25hY2tiYXIgYWN0aW9uIGNsaWNrZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNtaXNzV2l0aEFjdGlvbigpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9vbkFjdGlvbi5jbG9zZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX29uQWN0aW9uLm5leHQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uQWN0aW9uLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFya3MgdGhlIHNuYWNrYmFyIGFjdGlvbiBjbGlja2VkLgogICAgICAgICAqIEBkZXByZWNhdGVkIFVzZSBgZGlzbWlzc1dpdGhBY3Rpb25gIGluc3RlYWQuCiAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsb3NlV2l0aEFjdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5kaXNtaXNzV2l0aEFjdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNtaXNzZXMgdGhlIHNuYWNrIGJhciBhZnRlciBzb21lIGR1cmF0aW9uCiAgICAgICAgICogQHBhcmFtIHs/fSBkdXJhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Rpc21pc3NBZnRlcihkdXJhdGlvbikgewogICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBjYXAgdGhlIGR1cmF0aW9uIHRvIHRoZSBtYXhpbXVtIHZhbHVlIGZvciBzZXRUaW1lb3V0LCBiZWNhdXNlCiAgICAgICAgICAgIC8vIGl0J2xsIHJldmVydCB0byAxIGlmIHNvbWVib2R5IHBhc3NlcyBpbiBzb21ldGhpbmcgZ3JlYXRlciAoZS5nLiBgSW5maW5pdHlgKS4gU2VlICMxNzIzNC4KICAgICAgICAgICAgdGhpcy5fZHVyYXRpb25UaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuZGlzbWlzcygpKSwgTWF0aC5taW4oZHVyYXRpb24sIE1BWF9USU1FT1VUKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1hcmtzIHRoZSBzbmFja2JhciBhcyBvcGVuZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vcGVuKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2FmdGVyT3BlbmVkLmNsb3NlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJPcGVuZWQubmV4dCgpOwogICAgICAgICAgICAgICAgdGhpcy5fYWZ0ZXJPcGVuZWQuY29tcGxldGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhbnMgdXAgdGhlIERPTSBhZnRlciBjbG9zaW5nLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmluaXNoRGlzbWlzcygpIHsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7CiAgICAgICAgICAgIGlmICghdGhpcy5fb25BY3Rpb24uY2xvc2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkFjdGlvbi5jb21wbGV0ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2FmdGVyRGlzbWlzc2VkLm5leHQoeyBkaXNtaXNzZWRCeUFjdGlvbjogdGhpcy5fZGlzbWlzc2VkQnlBY3Rpb24gfSk7CiAgICAgICAgICAgIHRoaXMuX2FmdGVyRGlzbWlzc2VkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX2Rpc21pc3NlZEJ5QWN0aW9uID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgYW4gb2JzZXJ2YWJsZSB0aGF0IGlzIG5vdGlmaWVkIHdoZW4gdGhlIHNuYWNrIGJhciBpcyBmaW5pc2hlZCBjbG9zaW5nLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJEaXNtaXNzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9hZnRlckRpc21pc3NlZC5hc09ic2VydmFibGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyBhbiBvYnNlcnZhYmxlIHRoYXQgaXMgbm90aWZpZWQgd2hlbiB0aGUgc25hY2sgYmFyIGhhcyBvcGVuZWQgYW5kIGFwcGVhcmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWZ0ZXJPcGVuZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmNvbnRhaW5lckluc3RhbmNlLl9vbkVudGVyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGFuIG9ic2VydmFibGUgdGhhdCBpcyBub3RpZmllZCB3aGVuIHRoZSBzbmFjayBiYXIgYWN0aW9uIGlzIGNhbGxlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQWN0aW9uKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb25BY3Rpb24uYXNPYnNlcnZhYmxlKCk7CiAgICAgICAgfQogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NuYWNrLWJhci9zbmFjay1iYXItY29uZmlnLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSBkYXRhIHRoYXQgd2FzIHBhc3NlZCBpbiB0byBhIHNuYWNrIGJhci4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfU05BQ0tfQkFSX0RBVEEgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01hdFNuYWNrQmFyRGF0YScpOwogICAgLyoqCiAgICAgKiBDb25maWd1cmF0aW9uIHVzZWQgd2hlbiBvcGVuaW5nIGEgc25hY2stYmFyLgogICAgICogQHRlbXBsYXRlIEQKICAgICAqLwogICAgY2xhc3MgTWF0U25hY2tCYXJDb25maWcgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIHBvbGl0ZW5lc3MgbGV2ZWwgZm9yIHRoZSBNYXRBcmlhTGl2ZUFubm91bmNlciBhbm5vdW5jZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnBvbGl0ZW5lc3MgPSAnYXNzZXJ0aXZlJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1lc3NhZ2UgdG8gYmUgYW5ub3VuY2VkIGJ5IHRoZSBMaXZlQW5ub3VuY2VyLiBXaGVuIG9wZW5pbmcgYSBzbmFja2JhciB3aXRob3V0IGEgY3VzdG9tCiAgICAgICAgICAgICAqIGNvbXBvbmVudCBvciB0ZW1wbGF0ZSwgdGhlIGFubm91bmNlbWVudCBtZXNzYWdlIHdpbGwgZGVmYXVsdCB0byB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFubm91bmNlbWVudE1lc3NhZ2UgPSAnJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBsZW5ndGggb2YgdGltZSBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBiZWZvcmUgYXV0b21hdGljYWxseSBkaXNtaXNzaW5nIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmR1cmF0aW9uID0gMDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIERhdGEgYmVpbmcgaW5qZWN0ZWQgaW50byB0aGUgY2hpbGQgY29tcG9uZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5kYXRhID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBob3Jpem9udGFsIHBvc2l0aW9uIHRvIHBsYWNlIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmhvcml6b250YWxQb3NpdGlvbiA9ICdjZW50ZXInOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIHZlcnRpY2FsIHBvc2l0aW9uIHRvIHBsYWNlIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnZlcnRpY2FsUG9zaXRpb24gPSAnYm90dG9tJzsKICAgICAgICB9CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvc25hY2stYmFyL3NpbXBsZS1zbmFjay1iYXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBBIGNvbXBvbmVudCB1c2VkIHRvIG9wZW4gYXMgdGhlIGRlZmF1bHQgc25hY2sgYmFyLCBtYXRjaGluZyBtYXRlcmlhbCBzcGVjLgogICAgICogVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIHNuYWNrIGJhciBzZXJ2aWNlLgogICAgICovCiAgICBjbGFzcyBTaW1wbGVTbmFja0JhciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzbmFja0JhclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHNuYWNrQmFyUmVmLCBkYXRhKSB7CiAgICAgICAgICAgIHRoaXMuc25hY2tCYXJSZWYgPSBzbmFja0JhclJlZjsKICAgICAgICAgICAgdGhpcy5kYXRhID0gZGF0YTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUGVyZm9ybXMgdGhlIGFjdGlvbiBvbiB0aGUgc25hY2sgYmFyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWN0aW9uKCkgewogICAgICAgICAgICB0aGlzLnNuYWNrQmFyUmVmLmRpc21pc3NXaXRoQWN0aW9uKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIElmIHRoZSBhY3Rpb24gYnV0dG9uIHNob3VsZCBiZSBzaG93bi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBoYXNBY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAhIXRoaXMuZGF0YS5hY3Rpb247CiAgICAgICAgfQogICAgfQogICAgU2ltcGxlU25hY2tCYXIuybVmYWMgPSBmdW5jdGlvbiBTaW1wbGVTbmFja0Jhcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTaW1wbGVTbmFja0JhcikoybXJtWRpcmVjdGl2ZUluamVjdChNYXRTbmFja0JhclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1NOQUNLX0JBUl9EQVRBKSk7IH07CiAgICBTaW1wbGVTbmFja0Jhci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTaW1wbGVTbmFja0Jhciwgc2VsZWN0b3JzOiBbWyJzaW1wbGUtc25hY2stYmFyIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXNpbXBsZS1zbmFja2JhciJdLCBkZWNsczogMywgdmFyczogMiwgY29uc3RzOiBbWyJjbGFzcyIsICJtYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb24iXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDMsICJjbGljayJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFNpbXBsZVNuYWNrQmFyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMiwgU2ltcGxlU25hY2tCYXJfZGl2XzJfVGVtcGxhdGUsIDMsIDEsICJkaXYiLCAwKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4LmRhdGEubWVzc2FnZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguaGFzQWN0aW9uKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBNYXRCdXR0b25dLCBzdHlsZXM6IFsiLm1hdC1zaW1wbGUtc25hY2tiYXJ7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2FsaWduLWl0ZW1zOmNlbnRlcjtsaW5lLWhlaWdodDoyMHB4O29wYWNpdHk6MX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257ZmxleC1zaHJpbms6MDttYXJnaW46LThweCAtOHB4IC04cHggOHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbiBidXR0b257bWF4LWhlaWdodDozNnB4O21pbi13aWR0aDowfVtkaXI9cnRsXSAubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb257bWFyZ2luLWxlZnQ6LThweDttYXJnaW4tcmlnaHQ6OHB4fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU2ltcGxlU25hY2tCYXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBNYXRTbmFja0JhclJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfU05BQ0tfQkFSX0RBVEEsXSB9XSB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NuYWNrLWJhci9zbmFjay1iYXItYW5pbWF0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEFuaW1hdGlvbnMgdXNlZCBieSB0aGUgTWF0ZXJpYWwgc25hY2sgYmFyLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBtYXRTbmFja0JhckFuaW1hdGlvbnMgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQW5pbWF0aW9uIHRoYXQgc2hvd3MgYW5kIGhpZGVzIGEgc25hY2sgYmFyLgogICAgICAgICAqLwogICAgICAgIHNuYWNrQmFyU3RhdGU6IHRyaWdnZXIoJ3N0YXRlJywgWwogICAgICAgICAgICBzdGF0ZSgndm9pZCwgaGlkZGVuJywgc3R5bGUoewogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMC44KScsCiAgICAgICAgICAgICAgICBvcGFjaXR5OiAwLAogICAgICAgICAgICB9KSksCiAgICAgICAgICAgIHN0YXRlKCd2aXNpYmxlJywgc3R5bGUoewogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiAnc2NhbGUoMSknLAogICAgICAgICAgICAgICAgb3BhY2l0eTogMSwKICAgICAgICAgICAgfSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IHZpc2libGUnLCBhbmltYXRlKCcxNTBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScpKSwKICAgICAgICAgICAgdHJhbnNpdGlvbignKiA9PiB2b2lkLCAqID0+IGhpZGRlbicsIGFuaW1hdGUoJzc1bXMgY3ViaWMtYmV6aWVyKDAuNCwgMC4wLCAxLCAxKScsIHN0eWxlKHsKICAgICAgICAgICAgICAgIG9wYWNpdHk6IDAKICAgICAgICAgICAgfSkpKSwKICAgICAgICBdKQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zbmFjay1iYXIvc25hY2stYmFyLWNvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEludGVybmFsIGNvbXBvbmVudCB0aGF0IHdyYXBzIHVzZXItcHJvdmlkZWQgc25hY2sgYmFyIGNvbnRlbnQuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRTbmFja0JhckNvbnRhaW5lciBleHRlbmRzIEJhc2VQb3J0YWxPdXRsZXQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gc25hY2tCYXJDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfbmdab25lLCBfZWxlbWVudFJlZiwgX2NoYW5nZURldGVjdG9yUmVmLCBzbmFja0JhckNvbmZpZykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgICAgICB0aGlzLnNuYWNrQmFyQ29uZmlnID0gc25hY2tCYXJDb25maWc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gZGVzdHJveWVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhhdCB0aGUgc25hY2sgYmFyIGhhcyBleGl0ZWQgZnJvbSB2aWV3LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25FeGl0ID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN1YmplY3QgZm9yIG5vdGlmeWluZyB0aGF0IHRoZSBzbmFjayBiYXIgaGFzIGZpbmlzaGVkIGVudGVyaW5nIHRoZSB2aWV3LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25FbnRlciA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgc3RhdGUgb2YgdGhlIHNuYWNrIGJhciBhbmltYXRpb25zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uU3RhdGUgPSAndm9pZCc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBdHRhY2hlcyBhIERPTSBwb3J0YWwgdG8gdGhlIHNuYWNrIGJhciBjb250YWluZXIuCiAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIFRvIGJlIHR1cm5lZCBpbnRvIGEgbWV0aG9kLgogICAgICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYXR0YWNoRG9tUG9ydGFsID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHBvcnRhbCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fYXNzZXJ0Tm90QXR0YWNoZWQoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2FwcGx5U25hY2tCYXJDbGFzc2VzKCk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaERvbVBvcnRhbChwb3J0YWwpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gQmFzZWQgb24gdGhlIEFSSUEgc3BlYywgYGFsZXJ0YCBhbmQgYHN0YXR1c2Agcm9sZXMgaGF2ZSBhbgogICAgICAgICAgICAvLyBpbXBsaWNpdCBgYXNzZXJ0aXZlYCBhbmQgYHBvbGl0ZWAgcG9saXRlbmVzcyByZXNwZWN0aXZlbHkuCiAgICAgICAgICAgIGlmIChzbmFja0JhckNvbmZpZy5wb2xpdGVuZXNzID09PSAnYXNzZXJ0aXZlJyAmJiAhc25hY2tCYXJDb25maWcuYW5ub3VuY2VtZW50TWVzc2FnZSkgewogICAgICAgICAgICAgICAgdGhpcy5fcm9sZSA9ICdhbGVydCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc25hY2tCYXJDb25maWcucG9saXRlbmVzcyA9PT0gJ29mZicpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JvbGUgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fcm9sZSA9ICdzdGF0dXMnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEF0dGFjaCBhIGNvbXBvbmVudCBwb3J0YWwgYXMgY29udGVudCB0byB0aGlzIHNuYWNrIGJhciBjb250YWluZXIuCiAgICAgICAgICogQHRlbXBsYXRlIFQKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCkgewogICAgICAgICAgICB0aGlzLl9hc3NlcnROb3RBdHRhY2hlZCgpOwogICAgICAgICAgICB0aGlzLl9hcHBseVNuYWNrQmFyQ2xhc3NlcygpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fcG9ydGFsT3V0bGV0LmF0dGFjaENvbXBvbmVudFBvcnRhbChwb3J0YWwpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRhY2ggYSB0ZW1wbGF0ZSBwb3J0YWwgYXMgY29udGVudCB0byB0aGlzIHNuYWNrIGJhciBjb250YWluZXIuCiAgICAgICAgICogQHRlbXBsYXRlIEMKICAgICAgICAgKiBAcGFyYW0gez99IHBvcnRhbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKSB7CiAgICAgICAgICAgIHRoaXMuX2Fzc2VydE5vdEF0dGFjaGVkKCk7CiAgICAgICAgICAgIHRoaXMuX2FwcGx5U25hY2tCYXJDbGFzc2VzKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9wb3J0YWxPdXRsZXQuYXR0YWNoVGVtcGxhdGVQb3J0YWwocG9ydGFsKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlIGVuZCBvZiBhbmltYXRpb25zLCB1cGRhdGluZyB0aGUgc3RhdGUgb2YgdGhlIHNuYWNrYmFyLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQW5pbWF0aW9uRW5kKGV2ZW50KSB7CiAgICAgICAgICAgIGNvbnN0IHsgZnJvbVN0YXRlLCB0b1N0YXRlIH0gPSBldmVudDsKICAgICAgICAgICAgaWYgKCh0b1N0YXRlID09PSAndm9pZCcgJiYgZnJvbVN0YXRlICE9PSAndm9pZCcpIHx8IHRvU3RhdGUgPT09ICdoaWRkZW4nKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jb21wbGV0ZUV4aXQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodG9TdGF0ZSA9PT0gJ3Zpc2libGUnKSB7CiAgICAgICAgICAgICAgICAvLyBOb3RlOiB3ZSBzaG91bGRuJ3QgdXNlIGB0aGlzYCBpbnNpZGUgdGhlIHpvbmUgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAvLyBiZWNhdXNlIGl0IGNhbiBjYXVzZSBhIG1lbW9yeSBsZWFrLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb25FbnRlciA9IHRoaXMuX29uRW50ZXI7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBvbkVudGVyLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICBvbkVudGVyLmNvbXBsZXRlKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQmVnaW4gYW5pbWF0aW9uIG9mIHNuYWNrIGJhciBlbnRyYW5jZSBpbnRvIHZpZXcuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbnRlcigpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9kZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvblN0YXRlID0gJ3Zpc2libGUnOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEJlZ2luIGFuaW1hdGlvbiBvZiB0aGUgc25hY2sgYmFyIGV4aXRpbmcgZnJvbSB2aWV3LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZXhpdCgpIHsKICAgICAgICAgICAgLy8gTm90ZTogdGhpcyBvbmUgdHJhbnNpdGlvbnMgdG8gYGhpZGRlbmAsIHJhdGhlciB0aGFuIGB2b2lkYCwgaW4gb3JkZXIgdG8gaGFuZGxlIHRoZSBjYXNlCiAgICAgICAgICAgIC8vIHdoZXJlIG11bHRpcGxlIHNuYWNrIGJhcnMgYXJlIG9wZW5lZCBpbiBxdWljayBzdWNjZXNzaW9uIChlLmcuIHR3byBjb25zZWN1dGl2ZSBjYWxscyB0bwogICAgICAgICAgICAvLyBgTWF0U25hY2tCYXIub3BlbmApLgogICAgICAgICAgICB0aGlzLl9hbmltYXRpb25TdGF0ZSA9ICdoaWRkZW4nOwogICAgICAgICAgICAvLyBNYXJrIHRoaXMgZWxlbWVudCB3aXRoIGFuICdleGl0JyBhdHRyaWJ1dGUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgc25hY2tiYXIgaGFzCiAgICAgICAgICAgIC8vIGJlZW4gZGlzbWlzc2VkIGFuZCB3aWxsIHNvb24gYmUgcmVtb3ZlZCBmcm9tIHRoZSBET00uIFRoaXMgaXMgdXNlZCBieSB0aGUgc25hY2tiYXIKICAgICAgICAgICAgLy8gdGVzdCBoYXJuZXNzLgogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuc2V0QXR0cmlidXRlKCdtYXQtZXhpdCcsICcnKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX29uRXhpdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFrZXMgc3VyZSB0aGUgZXhpdCBjYWxsYmFja3MgaGF2ZSBiZWVuIGludm9rZWQgd2hlbiB0aGUgZWxlbWVudCBpcyBkZXN0cm95ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fY29tcGxldGVFeGl0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdhaXRzIGZvciB0aGUgem9uZSB0byBzZXR0bGUgYmVmb3JlIHJlbW92aW5nIHRoZSBlbGVtZW50LiBIZWxwcyBwcmV2ZW50CiAgICAgICAgICogZXJyb3JzIHdoZXJlIHdlIGVuZCB1cCByZW1vdmluZyBhbiBlbGVtZW50IHdoaWNoIGlzIGluIHRoZSBtaWRkbGUgb2YgYW4gYW5pbWF0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY29tcGxldGVFeGl0KCkgewogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25NaWNyb3Rhc2tFbXB0eS5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkV4aXQubmV4dCgpOwogICAgICAgICAgICAgICAgdGhpcy5fb25FeGl0LmNvbXBsZXRlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXBwbGllcyB0aGUgdmFyaW91cyBwb3NpdGlvbmluZyBhbmQgdXNlci1jb25maWd1cmVkIENTUyBjbGFzc2VzIHRvIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hcHBseVNuYWNrQmFyQ2xhc3NlcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhbmVsQ2xhc3NlcyA9IHRoaXMuc25hY2tCYXJDb25maWcucGFuZWxDbGFzczsKICAgICAgICAgICAgaWYgKHBhbmVsQ2xhc3NlcykgewogICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocGFuZWxDbGFzc2VzKSkgewogICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgYSBzcHJlYWQgaGVyZSwgYmVjYXVzZSBJRSBkb2Vzbid0IHN1cHBvcnQgbXVsdGlwbGUgYXJndW1lbnRzLgogICAgICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3Nlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNzc0NsYXNzCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICBjc3NDbGFzcyA9PiBlbGVtZW50LmNsYXNzTGlzdC5hZGQoY3NzQ2xhc3MpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQocGFuZWxDbGFzc2VzKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zbmFja0JhckNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPT09ICdjZW50ZXInKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoJ21hdC1zbmFjay1iYXItY2VudGVyJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc25hY2tCYXJDb25maWcudmVydGljYWxQb3NpdGlvbiA9PT0gJ3RvcCcpIHsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnbWF0LXNuYWNrLWJhci10b3AnKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBc3NlcnRzIHRoYXQgbm8gY29udGVudCBpcyBhbHJlYWR5IGF0dGFjaGVkIHRvIHRoZSBjb250YWluZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hc3NlcnROb3RBdHRhY2hlZCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3BvcnRhbE91dGxldC5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcignQXR0ZW1wdGluZyB0byBhdHRhY2ggc25hY2sgYmFyIGNvbnRlbnQgYWZ0ZXIgY29udGVudCBpcyBhbHJlYWR5IGF0dGFjaGVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBNYXRTbmFja0JhckNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNuYWNrQmFyQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNuYWNrQmFyQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdFNuYWNrQmFyQ29uZmlnKSk7IH07CiAgICBNYXRTbmFja0JhckNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRTbmFja0JhckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJzbmFjay1iYXItY29udGFpbmVyIl1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIE1hdFNuYWNrQmFyQ29udGFpbmVyX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KENka1BvcnRhbE91dGxldCwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fcG9ydGFsT3V0bGV0ID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1zbmFjay1iYXItY29udGFpbmVyIl0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFNuYWNrQmFyQ29udGFpbmVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbXBvbmVudEhvc3RTeW50aGV0aWNMaXN0ZW5lcigiQHN0YXRlLmRvbmUiLCBmdW5jdGlvbiBNYXRTbmFja0JhckNvbnRhaW5lcl9hbmltYXRpb25fc3RhdGVfZG9uZV9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25BbmltYXRpb25FbmQoJGV2ZW50KTsgfSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoInJvbGUiLCBjdHguX3JvbGUpOwogICAgICAgICAgICDJtcm1dXBkYXRlU3ludGhldGljSG9zdEJpbmRpbmcoIkBzdGF0ZSIsIGN0eC5fYW5pbWF0aW9uU3RhdGUpOwogICAgICAgIH0gfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgZGVjbHM6IDEsIHZhcnM6IDAsIGNvbnN0czogW1siY2RrUG9ydGFsT3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFNuYWNrQmFyQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMCwgTWF0U25hY2tCYXJDb250YWluZXJfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZSwgMCwgMCwgIm5nLXRlbXBsYXRlIiwgMCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbQ2RrUG9ydGFsT3V0bGV0XSwgc3R5bGVzOiBbIi5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntib3JkZXItcmFkaXVzOjRweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpibG9jazttYXJnaW46MjRweDttYXgtd2lkdGg6MzN2dzttaW4td2lkdGg6MzQ0cHg7cGFkZGluZzoxNHB4IDE2cHg7bWluLWhlaWdodDo0OHB4O3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbmFjay1iYXItY29udGFpbmVye2JvcmRlcjpzb2xpZCAxcHh9Lm1hdC1zbmFjay1iYXItaGFuZHNldHt3aWR0aDoxMDAlfS5tYXQtc25hY2stYmFyLWhhbmRzZXQgLm1hdC1zbmFjay1iYXItY29udGFpbmVye21hcmdpbjo4cHg7bWF4LXdpZHRoOjEwMCU7bWluLXdpZHRoOjA7d2lkdGg6MTAwJX1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBkYXRhOiB7IGFuaW1hdGlvbjogW21hdFNuYWNrQmFyQW5pbWF0aW9ucy5zbmFja0JhclN0YXRlXSB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRTbmFja0JhckNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IE1hdFNuYWNrQmFyQ29uZmlnIH0KICAgIF07CiAgICBNYXRTbmFja0JhckNvbnRhaW5lci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBfcG9ydGFsT3V0bGV0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtDZGtQb3J0YWxPdXRsZXQsIHsgc3RhdGljOiB0cnVlIH0sXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zbmFjay1iYXIvc25hY2stYmFyLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRTbmFja0Jhck1vZHVsZSB7CiAgICB9CiAgICBNYXRTbmFja0Jhck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFNuYWNrQmFyTW9kdWxlIH0pOwogICAgTWF0U25hY2tCYXJNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRTbmFja0Jhck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTbmFja0Jhck1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIE92ZXJsYXlNb2R1bGUsCiAgICAgICAgICAgICAgICBQb3J0YWxNb2R1bGUsCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRTbmFja0Jhck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRTbmFja0JhckNvbnRhaW5lciwKICAgICAgICAgICAgU2ltcGxlU25hY2tCYXJdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbT3ZlcmxheU1vZHVsZSwKICAgICAgICAgICAgUG9ydGFsTW9kdWxlLAogICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFNuYWNrQmFyQ29udGFpbmVyLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NuYWNrLWJhci9zbmFjay1iYXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdGhhdCBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGRlZmF1bHQgc25hY2sgYmFyLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9TTkFDS19CQVJfREVGQVVMVF9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCdtYXQtc25hY2stYmFyLWRlZmF1bHQtb3B0aW9ucycsIHsKICAgICAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICAgICAgZmFjdG9yeTogTUFUX1NOQUNLX0JBUl9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSwKICAgIH0pOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFUX1NOQUNLX0JBUl9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSgpIHsKICAgICAgICByZXR1cm4gbmV3IE1hdFNuYWNrQmFyQ29uZmlnKCk7CiAgICB9CiAgICAvKioKICAgICAqIFNlcnZpY2UgdG8gZGlzcGF0Y2ggTWF0ZXJpYWwgRGVzaWduIHNuYWNrIGJhciBtZXNzYWdlcy4KICAgICAqLwogICAgY2xhc3MgTWF0U25hY2tCYXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX292ZXJsYXkKICAgICAgICAgKiBAcGFyYW0gez99IF9saXZlCiAgICAgICAgICogQHBhcmFtIHs/fSBfaW5qZWN0b3IKICAgICAgICAgKiBAcGFyYW0gez99IF9icmVha3BvaW50T2JzZXJ2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9wYXJlbnRTbmFja0JhcgogICAgICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRDb25maWcKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfb3ZlcmxheSwgX2xpdmUsIF9pbmplY3RvciwgX2JyZWFrcG9pbnRPYnNlcnZlciwgX3BhcmVudFNuYWNrQmFyLCBfZGVmYXVsdENvbmZpZykgewogICAgICAgICAgICB0aGlzLl9vdmVybGF5ID0gX292ZXJsYXk7CiAgICAgICAgICAgIHRoaXMuX2xpdmUgPSBfbGl2ZTsKICAgICAgICAgICAgdGhpcy5faW5qZWN0b3IgPSBfaW5qZWN0b3I7CiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlciA9IF9icmVha3BvaW50T2JzZXJ2ZXI7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudFNuYWNrQmFyID0gX3BhcmVudFNuYWNrQmFyOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0Q29uZmlnID0gX2RlZmF1bHRDb25maWc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBSZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgc25hY2sgYmFyIGluIHRoZSB2aWV3ICphdCB0aGlzIGxldmVsKiAoaW4gdGhlIEFuZ3VsYXIgaW5qZWN0b3IgdHJlZSkuCiAgICAgICAgICAgICAqIElmIHRoZXJlIGlzIGEgcGFyZW50IHNuYWNrLWJhciBzZXJ2aWNlLCBhbGwgb3BlcmF0aW9ucyBzaG91bGQgZGVsZWdhdGUgdG8gdGhhdCBwYXJlbnQKICAgICAgICAgICAgICogdmlhIGBfb3BlbmVkU25hY2tCYXJSZWZgLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlZmVyZW5jZSB0byB0aGUgY3VycmVudGx5IG9wZW5lZCBzbmFja2JhciBhdCAqYW55KiBsZXZlbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfb3BlbmVkU25hY2tCYXJSZWYoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyZW50ID0gdGhpcy5fcGFyZW50U25hY2tCYXI7CiAgICAgICAgICAgIHJldHVybiBwYXJlbnQgPyBwYXJlbnQuX29wZW5lZFNuYWNrQmFyUmVmIDogdGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IF9vcGVuZWRTbmFja0JhclJlZih2YWx1ZSkgewogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50U25hY2tCYXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudFNuYWNrQmFyLl9vcGVuZWRTbmFja0JhclJlZiA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbCA9IHZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYW5kIGRpc3BhdGNoZXMgYSBzbmFjayBiYXIgd2l0aCBhIGN1c3RvbSBjb21wb25lbnQgZm9yIHRoZSBjb250ZW50LCByZW1vdmluZyBhbnkKICAgICAgICAgKiBjdXJyZW50bHkgb3BlbmVkIHNuYWNrIGJhcnMuCiAgICAgICAgICoKICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gY29tcG9uZW50IENvbXBvbmVudCB0byBiZSBpbnN0YW50aWF0ZWQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gY29uZmlnIEV4dHJhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvcGVuRnJvbUNvbXBvbmVudChjb21wb25lbnQsIGNvbmZpZykgewogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2F0dGFjaChjb21wb25lbnQsIGNvbmZpZykpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbmQgZGlzcGF0Y2hlcyBhIHNuYWNrIGJhciB3aXRoIGEgY3VzdG9tIHRlbXBsYXRlIGZvciB0aGUgY29udGVudCwgcmVtb3ZpbmcgYW55CiAgICAgICAgICogY3VycmVudGx5IG9wZW5lZCBzbmFjayBiYXJzLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZSBUZW1wbGF0ZSB0byBiZSBpbnN0YW50aWF0ZWQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gY29uZmlnIEV4dHJhIGNvbmZpZ3VyYXRpb24gZm9yIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvcGVuRnJvbVRlbXBsYXRlKHRlbXBsYXRlLCBjb25maWcpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2F0dGFjaCh0ZW1wbGF0ZSwgY29uZmlnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogT3BlbnMgYSBzbmFja2JhciB3aXRoIGEgbWVzc2FnZSBhbmQgYW4gb3B0aW9uYWwgYWN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gbWVzc2FnZSBUaGUgbWVzc2FnZSB0byBzaG93IGluIHRoZSBzbmFja2Jhci4KICAgICAgICAgKiBAcGFyYW0gez89fSBhY3Rpb24gVGhlIGxhYmVsIGZvciB0aGUgc25hY2tiYXIgYWN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbmZpZyBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIHNuYWNrYmFyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3BlbihtZXNzYWdlLCBhY3Rpb24gPSAnJywgY29uZmlnKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgX2NvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5fZGVmYXVsdENvbmZpZyksIGNvbmZpZyk7CiAgICAgICAgICAgIC8vIFNpbmNlIHRoZSB1c2VyIGRvZXNuJ3QgaGF2ZSBhY2Nlc3MgdG8gdGhlIGNvbXBvbmVudCwgd2UgY2FuCiAgICAgICAgICAgIC8vIG92ZXJyaWRlIHRoZSBkYXRhIHRvIHBhc3MgaW4gb3VyIG93biBtZXNzYWdlIGFuZCBhY3Rpb24uCiAgICAgICAgICAgIF9jb25maWcuZGF0YSA9IHsgbWVzc2FnZSwgYWN0aW9uIH07CiAgICAgICAgICAgIGlmICghX2NvbmZpZy5hbm5vdW5jZW1lbnRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICBfY29uZmlnLmFubm91bmNlbWVudE1lc3NhZ2UgPSBtZXNzYWdlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLm9wZW5Gcm9tQ29tcG9uZW50KFNpbXBsZVNuYWNrQmFyLCBfY29uZmlnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGlzbWlzc2VzIHRoZSBjdXJyZW50bHktdmlzaWJsZSBzbmFjayBiYXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkaXNtaXNzKCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3BlbmVkU25hY2tCYXJSZWYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmLmRpc21pc3MoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICAvLyBPbmx5IGRpc21pc3MgdGhlIHNuYWNrIGJhciBhdCB0aGUgY3VycmVudCBsZXZlbCBvbiBkZXN0cm95LgogICAgICAgICAgICBpZiAodGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbCkgewogICAgICAgICAgICAgICAgdGhpcy5fc25hY2tCYXJSZWZBdFRoaXNMZXZlbC5kaXNtaXNzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhlIHNuYWNrIGJhciBjb250YWluZXIgY29tcG9uZW50IHRvIHRoZSBvdmVybGF5LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBvdmVybGF5UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hdHRhY2hTbmFja0JhckNvbnRhaW5lcihvdmVybGF5UmVmLCBjb25maWcpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB1c2VySW5qZWN0b3IgPSBjb25maWcgJiYgY29uZmlnLnZpZXdDb250YWluZXJSZWYgJiYgY29uZmlnLnZpZXdDb250YWluZXJSZWYuaW5qZWN0b3I7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5qZWN0b3IgPSBuZXcgUG9ydGFsSW5qZWN0b3IodXNlckluamVjdG9yIHx8IHRoaXMuX2luamVjdG9yLCBuZXcgV2Vha01hcChbCiAgICAgICAgICAgICAgICBbTWF0U25hY2tCYXJDb25maWcsIGNvbmZpZ10KICAgICAgICAgICAgXSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lclBvcnRhbCA9IG5ldyBDb21wb25lbnRQb3J0YWwoTWF0U25hY2tCYXJDb250YWluZXIsIGNvbmZpZy52aWV3Q29udGFpbmVyUmVmLCBpbmplY3Rvcik7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udGFpbmVyUmVmID0gb3ZlcmxheVJlZi5hdHRhY2goY29udGFpbmVyUG9ydGFsKTsKICAgICAgICAgICAgY29udGFpbmVyUmVmLmluc3RhbmNlLnNuYWNrQmFyQ29uZmlnID0gY29uZmlnOwogICAgICAgICAgICByZXR1cm4gY29udGFpbmVyUmVmLmluc3RhbmNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQbGFjZXMgYSBuZXcgY29tcG9uZW50IG9yIGEgdGVtcGxhdGUgYXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNuYWNrIGJhciBjb250YWluZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gY29udGVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IHVzZXJDb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hdHRhY2goY29udGVudCwgdXNlckNvbmZpZykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXcgTWF0U25hY2tCYXJDb25maWcoKSksIHRoaXMuX2RlZmF1bHRDb25maWcpLCB1c2VyQ29uZmlnKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdmVybGF5UmVmID0gdGhpcy5fY3JlYXRlT3ZlcmxheShjb25maWcpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRhaW5lciA9IHRoaXMuX2F0dGFjaFNuYWNrQmFyQ29udGFpbmVyKG92ZXJsYXlSZWYsIGNvbmZpZyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc25hY2tCYXJSZWYgPSBuZXcgTWF0U25hY2tCYXJSZWYoY29udGFpbmVyLCBvdmVybGF5UmVmKTsKICAgICAgICAgICAgaWYgKGNvbnRlbnQgaW5zdGFuY2VvZiBUZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKGNvbnRlbnQsICgvKiogQHR5cGUgez99ICovIChudWxsKSksICgvKiogQHR5cGUgez99ICovICh7CiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBjb25maWcuZGF0YSwKICAgICAgICAgICAgICAgICAgICBzbmFja0JhclJlZgogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIHNuYWNrQmFyUmVmLmluc3RhbmNlID0gY29udGFpbmVyLmF0dGFjaFRlbXBsYXRlUG9ydGFsKHBvcnRhbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpbmplY3RvciA9IHRoaXMuX2NyZWF0ZUluamVjdG9yKGNvbmZpZywgc25hY2tCYXJSZWYpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcG9ydGFsID0gbmV3IENvbXBvbmVudFBvcnRhbChjb250ZW50LCB1bmRlZmluZWQsIGluamVjdG9yKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRSZWYgPSBjb250YWluZXIuYXR0YWNoQ29tcG9uZW50UG9ydGFsKHBvcnRhbCk7CiAgICAgICAgICAgICAgICAvLyBXZSBjYW4ndCBwYXNzIHRoaXMgdmlhIHRoZSBpbmplY3RvciwgYmVjYXVzZSB0aGUgaW5qZWN0b3IgaXMgY3JlYXRlZCBlYXJsaWVyLgogICAgICAgICAgICAgICAgc25hY2tCYXJSZWYuaW5zdGFuY2UgPSBjb250ZW50UmVmLmluc3RhbmNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFN1YnNjcmliZSB0byB0aGUgYnJlYWtwb2ludCBvYnNlcnZlciBhbmQgYXR0YWNoIHRoZSBtYXQtc25hY2stYmFyLWhhbmRzZXQgY2xhc3MgYXMKICAgICAgICAgICAgLy8gYXBwcm9wcmlhdGUuIFRoaXMgY2xhc3MgaXMgYXBwbGllZCB0byB0aGUgb3ZlcmxheSBlbGVtZW50IGJlY2F1c2UgdGhlIG92ZXJsYXkgbXVzdCBleHBhbmQgdG8KICAgICAgICAgICAgLy8gZmlsbCB0aGUgd2lkdGggb2YgdGhlIHNjcmVlbiBmb3IgZnVsbCB3aWR0aCBzbmFja2JhcnMuCiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlci5vYnNlcnZlKEJyZWFrcG9pbnRzLkhhbmRzZXRQb3J0cmFpdCkucGlwZSh0YWtlVW50aWwob3ZlcmxheVJlZi5kZXRhY2htZW50cygpKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3RhdGUgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2xhc3NMaXN0ID0gb3ZlcmxheVJlZi5vdmVybGF5RWxlbWVudC5jbGFzc0xpc3Q7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjbGFzc05hbWUgPSAnbWF0LXNuYWNrLWJhci1oYW5kc2V0JzsKICAgICAgICAgICAgICAgIHN0YXRlLm1hdGNoZXMgPyBjbGFzc0xpc3QuYWRkKGNsYXNzTmFtZSkgOiBjbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5fYW5pbWF0ZVNuYWNrQmFyKHNuYWNrQmFyUmVmLCBjb25maWcpOwogICAgICAgICAgICB0aGlzLl9vcGVuZWRTbmFja0JhclJlZiA9IHNuYWNrQmFyUmVmOwogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3BlbmVkU25hY2tCYXJSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFuaW1hdGVzIHRoZSBvbGQgc25hY2sgYmFyIG91dCBhbmQgdGhlIG5ldyBvbmUgaW4uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHNuYWNrQmFyUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBjb25maWcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9hbmltYXRlU25hY2tCYXIoc25hY2tCYXJSZWYsIGNvbmZpZykgewogICAgICAgICAgICAvLyBXaGVuIHRoZSBzbmFja2JhciBpcyBkaXNtaXNzZWQsIGNsZWFyIHRoZSByZWZlcmVuY2UgdG8gaXQuCiAgICAgICAgICAgIHNuYWNrQmFyUmVmLmFmdGVyRGlzbWlzc2VkKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSBzbmFja2JhciByZWYgaWYgaXQgaGFzbid0IGFscmVhZHkgYmVlbiByZXBsYWNlZCBieSBhIG5ld2VyIHNuYWNrYmFyLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmID09IHNuYWNrQmFyUmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3BlbmVkU25hY2tCYXJSZWYgPSBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGNvbmZpZy5hbm5vdW5jZW1lbnRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGl2ZS5jbGVhcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9vcGVuZWRTbmFja0JhclJlZikgewogICAgICAgICAgICAgICAgLy8gSWYgYSBzbmFjayBiYXIgaXMgYWxyZWFkeSBpbiB2aWV3LCBkaXNtaXNzIGl0IGFuZCBlbnRlciB0aGUKICAgICAgICAgICAgICAgIC8vIG5ldyBzbmFjayBiYXIgYWZ0ZXIgZXhpdCBhbmltYXRpb24gaXMgY29tcGxldGUuCiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWRTbmFja0JhclJlZi5hZnRlckRpc21pc3NlZCgpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgc25hY2tCYXJSZWYuY29udGFpbmVySW5zdGFuY2UuZW50ZXIoKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHRoaXMuX29wZW5lZFNuYWNrQmFyUmVmLmRpc21pc3MoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIElmIG5vIHNuYWNrIGJhciBpcyBpbiB2aWV3LCBlbnRlciB0aGUgbmV3IHNuYWNrIGJhci4KICAgICAgICAgICAgICAgIHNuYWNrQmFyUmVmLmNvbnRhaW5lckluc3RhbmNlLmVudGVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgYSBkaXNtaXNzIHRpbWVvdXQgaXMgcHJvdmlkZWQsIHNldCB1cCBkaXNtaXNzIGJhc2VkIG9uIGFmdGVyIHRoZSBzbmFja2JhciBpcyBvcGVuZWQuCiAgICAgICAgICAgIGlmIChjb25maWcuZHVyYXRpb24gJiYgY29uZmlnLmR1cmF0aW9uID4gMCkgewogICAgICAgICAgICAgICAgc25hY2tCYXJSZWYuYWZ0ZXJPcGVuZWQoKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gc25hY2tCYXJSZWYuX2Rpc21pc3NBZnRlcigoLyoqIEB0eXBlIHs/fSAqLyAoY29uZmlnLmR1cmF0aW9uKSkpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNvbmZpZy5hbm5vdW5jZW1lbnRNZXNzYWdlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9saXZlLmFubm91bmNlKGNvbmZpZy5hbm5vdW5jZW1lbnRNZXNzYWdlLCBjb25maWcucG9saXRlbmVzcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhIG5ldyBvdmVybGF5IGFuZCBwbGFjZXMgaXQgaW4gdGhlIGNvcnJlY3QgbG9jYXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZyBUaGUgdXNlci1zcGVjaWZpZWQgc25hY2sgYmFyIGNvbmZpZy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVPdmVybGF5KGNvbmZpZykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlDb25maWcgPSBuZXcgT3ZlcmxheUNvbmZpZygpOwogICAgICAgICAgICBvdmVybGF5Q29uZmlnLmRpcmVjdGlvbiA9IGNvbmZpZy5kaXJlY3Rpb247CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBvc2l0aW9uU3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkuZ2xvYmFsKCk7CiAgICAgICAgICAgIC8vIFNldCBob3Jpem9udGFsIHBvc2l0aW9uLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzUnRsID0gY29uZmlnLmRpcmVjdGlvbiA9PT0gJ3J0bCc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNMZWZ0ID0gKGNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPT09ICdsZWZ0JyB8fAogICAgICAgICAgICAgICAgKGNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPT09ICdzdGFydCcgJiYgIWlzUnRsKSB8fAogICAgICAgICAgICAgICAgKGNvbmZpZy5ob3Jpem9udGFsUG9zaXRpb24gPT09ICdlbmQnICYmIGlzUnRsKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNSaWdodCA9ICFpc0xlZnQgJiYgY29uZmlnLmhvcml6b250YWxQb3NpdGlvbiAhPT0gJ2NlbnRlcic7CiAgICAgICAgICAgIGlmIChpc0xlZnQpIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3kubGVmdCgnMCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzUmlnaHQpIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3kucmlnaHQoJzAnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3kuY2VudGVySG9yaXpvbnRhbGx5KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU2V0IGhvcml6b250YWwgcG9zaXRpb24uCiAgICAgICAgICAgIGlmIChjb25maWcudmVydGljYWxQb3NpdGlvbiA9PT0gJ3RvcCcpIHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3kudG9wKCcwJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LmJvdHRvbSgnMCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIG92ZXJsYXlDb25maWcucG9zaXRpb25TdHJhdGVneSA9IHBvc2l0aW9uU3RyYXRlZ3k7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5LmNyZWF0ZShvdmVybGF5Q29uZmlnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyBhbiBpbmplY3RvciB0byBiZSB1c2VkIGluc2lkZSBvZiBhIHNuYWNrIGJhciBjb21wb25lbnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAdGVtcGxhdGUgVAogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlnIENvbmZpZyB0aGF0IHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGUgc25hY2sgYmFyLgogICAgICAgICAqIEBwYXJhbSB7P30gc25hY2tCYXJSZWYgUmVmZXJlbmNlIHRvIHRoZSBzbmFjayBiYXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlSW5qZWN0b3IoY29uZmlnLCBzbmFja0JhclJlZikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHVzZXJJbmplY3RvciA9IGNvbmZpZyAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZiAmJiBjb25maWcudmlld0NvbnRhaW5lclJlZi5pbmplY3RvcjsKICAgICAgICAgICAgcmV0dXJuIG5ldyBQb3J0YWxJbmplY3Rvcih1c2VySW5qZWN0b3IgfHwgdGhpcy5faW5qZWN0b3IsIG5ldyBXZWFrTWFwKFsKICAgICAgICAgICAgICAgIFtNYXRTbmFja0JhclJlZiwgc25hY2tCYXJSZWZdLAogICAgICAgICAgICAgICAgW01BVF9TTkFDS19CQVJfREFUQSwgY29uZmlnLmRhdGFdCiAgICAgICAgICAgIF0pKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRTbmFja0Jhci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNuYWNrQmFyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNuYWNrQmFyKSjJtcm1aW5qZWN0KE92ZXJsYXkpLCDJtcm1aW5qZWN0KExpdmVBbm5vdW5jZXIpLCDJtcm1aW5qZWN0KEluamVjdG9yKSwgybXJtWluamVjdChCcmVha3BvaW50T2JzZXJ2ZXIpLCDJtcm1aW5qZWN0KE1hdFNuYWNrQmFyLCAxMiksIMm1ybVpbmplY3QoTUFUX1NOQUNLX0JBUl9ERUZBVUxUX09QVElPTlMpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0U25hY2tCYXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBPdmVybGF5IH0sCiAgICAgICAgeyB0eXBlOiBMaXZlQW5ub3VuY2VyIH0sCiAgICAgICAgeyB0eXBlOiBJbmplY3RvciB9LAogICAgICAgIHsgdHlwZTogQnJlYWtwb2ludE9ic2VydmVyIH0sCiAgICAgICAgeyB0eXBlOiBNYXRTbmFja0JhciwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTa2lwU2VsZiB9XSB9LAogICAgICAgIHsgdHlwZTogTWF0U25hY2tCYXJDb25maWcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9TTkFDS19CQVJfREVGQVVMVF9PUFRJT05TLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYXRTbmFja0Jhci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFNuYWNrQmFyX0ZhY3RvcnkoKSB7IHJldHVybiBuZXcgTWF0U25hY2tCYXIoybXJtWluamVjdChPdmVybGF5KSwgybXJtWluamVjdChMaXZlQW5ub3VuY2VyKSwgybXJtWluamVjdChJTkpFQ1RPUiksIMm1ybVpbmplY3QoQnJlYWtwb2ludE9ic2VydmVyKSwgybXJtWluamVjdChNYXRTbmFja0JhciwgMTIpLCDJtcm1aW5qZWN0KE1BVF9TTkFDS19CQVJfREVGQVVMVF9PUFRJT05TKSk7IH0sIHRva2VuOiBNYXRTbmFja0JhciwgcHJvdmlkZWRJbjogTWF0U25hY2tCYXJNb2R1bGUgfSk7CgogICAgY29uc3QgRVhQRVJJTUVOVFNfRkVBVFVSRV9LRVkgPSAnZXhwZXJpbWVudHMnOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3QgZ2V0RXhwZXJpbWVudHNTdGF0ZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcihFWFBFUklNRU5UU19GRUFUVVJFX0tFWSk7CiAgICBjb25zdCBnZXREYXRhU3RhdGUgPSBjcmVhdGVTZWxlY3RvcihnZXRFeHBlcmltZW50c1N0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuZGF0YTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyBhbiBleHBlcmltZW50LgogICAgICovCiAgICBjb25zdCBnZXRFeHBlcmltZW50ID0gY3JlYXRlU2VsZWN0b3IoZ2V0RGF0YVN0YXRlLCAoc3RhdGUsIHByb3BzKSA9PiB7CiAgICAgICAgY29uc3QgeyBleHBlcmltZW50SWQgfSA9IHByb3BzOwogICAgICAgIHJldHVybiBzdGF0ZS5leHBlcmltZW50TWFwW2V4cGVyaW1lbnRJZF0gfHwgbnVsbDsKICAgIH0pOwoKICAgIGNvbnN0IEFMRVJUX0ZFQVRVUkVfS0VZID0gJ2FsZXJ0cyc7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBzZWxlY3RBbGVydFN0YXRlID0gY3JlYXRlRmVhdHVyZVNlbGVjdG9yKEFMRVJUX0ZFQVRVUkVfS0VZKTsKICAgIGNvbnN0IGdldExhdGVzdEFsZXJ0ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0QWxlcnRTdGF0ZSwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmxhdGVzdEFsZXJ0OwogICAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvZmVhdHVyZV9mbGFnL3N0b3JlL2ZlYXR1cmVfZmxhZ190eXBlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEZFQVVUVVJFX0ZMQUdfRkVBVFVSRV9LRVkgPSAnZmVhdHVyZSc7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvZmVhdHVyZV9mbGFnL3N0b3JlL2ZlYXR1cmVfZmxhZ19zZWxlY3RvcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2VsZWN0RmVhdHVyZUZsYWdTdGF0ZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcihGRUFVVFVSRV9GTEFHX0ZFQVRVUkVfS0VZKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldElzRmVhdHVyZUZsYWdzTG9hZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RmVhdHVyZUZsYWdTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmlzRmVhdHVyZUZsYWdzTG9hZGVkOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0RmVhdHVyZSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEZlYXR1cmVGbGFnU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gZmVhdHVyZUlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIGZlYXR1cmVJZCkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5mZWF0dXJlc1tmZWF0dXJlSWRdIHx8IG51bGw7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRFbmFibGVkRXhwZXJpbWVudGFsUGx1Z2lucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEZlYXR1cmVGbGFnU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5mZWF0dXJlcy5lbmFibGVkRXhwZXJpbWVudGFsUGx1Z2lucyB8fCBbXTsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldElzSW5Db2xhYiA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEZlYXR1cmVGbGFnU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiAhIXN0YXRlLmZlYXR1cmVzLmluQ29sYWI7CiAgICB9KSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX2h0dHBfY2xpZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmb3JtRGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY29udmVydEZvcm1EYXRhVG9PYmplY3QoZm9ybURhdGEpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcmVzdWx0ID0gKC8qKiBAdHlwZSB7P30gKi8gKHt9KSk7CiAgICAgICAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgZm9ybURhdGEuZW50cmllcygpKSB7CiAgICAgICAgICAgIHJlc3VsdFtrZXldID0gKC8qKiBAdHlwZSB7P30gKi8gKHZhbHVlKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CiAgICBjbGFzcyBUQkh0dHBDbGllbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaHR0cAogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihodHRwLCBzdG9yZSkgewogICAgICAgICAgICB0aGlzLmh0dHAgPSBodHRwOwogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBSZXNwb25zZVR5cGUKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQocGF0aCwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHBhdGgsIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAdGVtcGxhdGUgUmVzcG9uc2VUeXBlCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHBhcmFtIHs/fSBib2R5CiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcG9zdChwYXRoLCBib2R5LCBvcHRpb25zID0ge30pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2VsZWN0KGdldElzRmVhdHVyZUZsYWdzTG9hZGVkKS5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXNMb2FkZWQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpc0xvYWRlZCkgPT4gQm9vbGVhbihpc0xvYWRlZCkpKSwgdGFrZSgxKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0SXNJbkNvbGFiKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBpc0luQ29sYWJdKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBHb29nbGUtaW50ZXJuYWwgQ29sYWIgZG9lcyBub3Qgc3VwcG9ydCBIVFRQIFBPU1QgcmVxdWVzdHMsIHNvIHdlIGZhbGwKICAgICAgICAgICAgICAgIC8vIGJhY2sgdG8gSFRUUCBHRVQgKGV2ZW4gdGhvdWdoIHB1YmxpYyBDb2xhYiBzdXBwb3J0cyBQT1NUKQogICAgICAgICAgICAgICAgLy8gU2VlIGIvNzI5MzIxNjQuCiAgICAgICAgICAgICAgICBpZiAoaXNJbkNvbGFiKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQocGF0aCwgewogICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBvcHRpb25zLmhlYWRlcnMsCiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtczogY29udmVydEZvcm1EYXRhVG9PYmplY3QoYm9keSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QocGF0aCwgYm9keSwgb3B0aW9ucyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0ZW1wbGF0ZSBSZXNwb25zZVR5cGUKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAgICAgKiBAcGFyYW0gez99IGJvZHkKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwdXQocGF0aCwgYm9keSwgb3B0aW9ucyA9IHt9KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAucHV0KHBhdGgsIGJvZHksIG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAdGVtcGxhdGUgUmVzcG9uc2VUeXBlCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGVsZXRlKHBhdGgsIG9wdGlvbnMgPSB7fSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmRlbGV0ZShwYXRoLCBvcHRpb25zKTsKICAgICAgICB9CiAgICB9CiAgICBUQkh0dHBDbGllbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFRCSHR0cENsaWVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEh0dHBDbGllbnQgfSwKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJIdHRwQ2xpZW50Lsm1ZmFjID0gZnVuY3Rpb24gVEJIdHRwQ2xpZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCSHR0cENsaWVudCkoybXJtWluamVjdChIdHRwQ2xpZW50KSwgybXJtWluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRCSHR0cENsaWVudC7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUQkh0dHBDbGllbnQsIGZhY3Rvcnk6IFRCSHR0cENsaWVudC7JtWZhYyB9KTsKCiAgICBjb25zdCBNRVRSSUNTX1BMVUdJTl9JRCA9ICd0aW1lc2VyaWVzJzsKICAgIHZhciBQbHVnaW5UeXBlOwogICAgKGZ1bmN0aW9uIChQbHVnaW5UeXBlKSB7CiAgICAgICAgUGx1Z2luVHlwZVsiU0NBTEFSUyJdID0gInNjYWxhcnMiOwogICAgICAgIFBsdWdpblR5cGVbIkhJU1RPR1JBTVMiXSA9ICJoaXN0b2dyYW1zIjsKICAgICAgICBQbHVnaW5UeXBlWyJJTUFHRVMiXSA9ICJpbWFnZXMiOwogICAgfSkoUGx1Z2luVHlwZSB8fCAoUGx1Z2luVHlwZSA9IHt9KSk7CiAgICBmdW5jdGlvbiBpc1BsdWdpblR5cGUodGV4dCkgewogICAgICAgIHJldHVybiAodGV4dCA9PT0gUGx1Z2luVHlwZS5TQ0FMQVJTIHx8CiAgICAgICAgICAgIHRleHQgPT09IFBsdWdpblR5cGUuSElTVE9HUkFNUyB8fAogICAgICAgICAgICB0ZXh0ID09PSBQbHVnaW5UeXBlLklNQUdFUyk7CiAgICB9CiAgICBjb25zdCBzYW1wbGVkUGx1Z2luVHlwZXMgPSBbUGx1Z2luVHlwZS5JTUFHRVNdOwogICAgZnVuY3Rpb24gaXNTYW1wbGVkUGx1Z2luKHBsdWdpbikgewogICAgICAgIHJldHVybiBzYW1wbGVkUGx1Z2luVHlwZXMuaW5jbHVkZXMocGx1Z2luKTsKICAgIH0KICAgIGNvbnN0IHNpbmdsZVJ1blBsdWdpblR5cGVzID0gW1BsdWdpblR5cGUuSElTVE9HUkFNUywgUGx1Z2luVHlwZS5JTUFHRVNdOwogICAgZnVuY3Rpb24gaXNTaW5nbGVSdW5QbHVnaW4ocGx1Z2luKSB7CiAgICAgICAgcmV0dXJuIHNpbmdsZVJ1blBsdWdpblR5cGVzLmluY2x1ZGVzKHBsdWdpbik7CiAgICB9CiAgICBmdW5jdGlvbiBpc1NpbmdsZVJ1blRpbWVTZXJpZXNSZXF1ZXN0KHJlcXVlc3QpIHsKICAgICAgICByZXR1cm4gaXNTaW5nbGVSdW5QbHVnaW4ocmVxdWVzdC5wbHVnaW4pOwogICAgfQogICAgY2xhc3MgTWV0cmljc0RhdGFTb3VyY2UgewogICAgfQogICAgZnVuY3Rpb24gaXNGYWlsZWRUaW1lU2VyaWVzUmVzcG9uc2UocmVzcG9uc2UpIHsKICAgICAgICByZXR1cm4gcmVzcG9uc2UuaGFzT3duUHJvcGVydHkoJ2Vycm9yJyk7CiAgICB9CgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgSFRUUF9QQVRIX1BSRUZJWCA9ICdkYXRhL3BsdWdpbi90aW1lc2VyaWVzJzsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBydW5JZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcGFyc2VSdW5JZChydW5JZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzbGFzaEluZGV4ID0gcnVuSWQuaW5kZXhPZignLycpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJ1bjogcnVuSWQuc3Vic3RyaW5nKHNsYXNoSW5kZXggKyAxKSwKICAgICAgICAgICAgZXhwZXJpbWVudElkOiBydW5JZC5zdWJzdHJpbmcoMCwgc2xhc2hJbmRleCksCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBydW4KICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBydW5Ub1J1bklkKHJ1biwgZXhwZXJpbWVudElkKSB7CiAgICAgICAgcmV0dXJuIGAke2V4cGVyaW1lbnRJZH0vJHtydW59YDsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBiYWNrZW5kUmVzcG9uc2UKICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBidWlsZEZyb250ZW5kVGltZVNlcmllc1Jlc3BvbnNlKGJhY2tlbmRSZXNwb25zZSwgZXhwZXJpbWVudElkKSB7CiAgICAgICAgY29uc3QgeyBydW5Ub1NlcmllcywgcnVuIH0gPSBiYWNrZW5kUmVzcG9uc2UsIHJlc3BvbnNlUmVzdCA9IF9fcmVzdChiYWNrZW5kUmVzcG9uc2UsIFsicnVuVG9TZXJpZXMiLCAicnVuIl0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXNwb25zZSA9ICgvKiogQHR5cGUgez99ICovIChPYmplY3QuYXNzaWduKHt9LCByZXNwb25zZVJlc3QpKSk7CiAgICAgICAgaWYgKHJ1blRvU2VyaWVzKSB7CiAgICAgICAgICAgIHJlc3BvbnNlLnJ1blRvU2VyaWVzID0gYnVpbGRSdW5JZEtleWVkT2JqZWN0KHJ1blRvU2VyaWVzLCBleHBlcmltZW50SWQpOwogICAgICAgIH0KICAgICAgICBpZiAocnVuKSB7CiAgICAgICAgICAgIHJlc3BvbnNlLnJ1bklkID0gcnVuVG9SdW5JZChydW4sIGV4cGVyaW1lbnRJZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXNwb25zZTsKICAgIH0KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gYmFja2VuZE9iamVjdAogICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkUnVuSWRLZXllZE9iamVjdChiYWNrZW5kT2JqZWN0LCBleHBlcmltZW50SWQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZnJvbnRlbmRPYmplY3QgPSAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKTsKICAgICAgICBmb3IgKGNvbnN0IHJ1biBpbiBiYWNrZW5kT2JqZWN0KSB7CiAgICAgICAgICAgIGlmIChiYWNrZW5kT2JqZWN0Lmhhc093blByb3BlcnR5KHJ1bikpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJ1bklkID0gcnVuVG9SdW5JZChydW4sIGV4cGVyaW1lbnRJZCk7CiAgICAgICAgICAgICAgICBmcm9udGVuZE9iamVjdFtydW5JZF0gPSBiYWNrZW5kT2JqZWN0W3J1bl07CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChmcm9udGVuZE9iamVjdCkpOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGJhY2tlbmRUYWdNZXRhZGF0YQogICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkRnJvbnRlbmRUYWdNZXRhZGF0YShiYWNrZW5kVGFnTWV0YWRhdGEsIGV4cGVyaW1lbnRJZCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB0YWdNZXRhZGF0YSA9ICgvKiogQHR5cGUgez99ICovICh7fSkpOwogICAgICAgIGZvciAoY29uc3QgcGx1Z2luVHlwZSBvZiBPYmplY3Qua2V5cyhiYWNrZW5kVGFnTWV0YWRhdGEpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gKC8qKiBAdHlwZSB7P30gKi8gKHBsdWdpblR5cGUpKTsKICAgICAgICAgICAgaWYgKGlzU2FtcGxlZFBsdWdpbihwbHVnaW4pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBfYSA9IGJhY2tlbmRUYWdNZXRhZGF0YVtwbHVnaW5dLCB7IHRhZ1J1blNhbXBsZWRJbmZvIH0gPSBfYSwgcmVzdCA9IF9fcmVzdChfYSwgWyJ0YWdSdW5TYW1wbGVkSW5mbyJdKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ZW5kVGFnUnVuU2FtcGxlZEluZm8gPSAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIGluIHRhZ1J1blNhbXBsZWRJbmZvKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRhZ1J1blNhbXBsZWRJbmZvLmhhc093blByb3BlcnR5KHRhZykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZnJvbnRlbmRUYWdSdW5TYW1wbGVkSW5mb1t0YWddID0gYnVpbGRSdW5JZEtleWVkT2JqZWN0KHRhZ1J1blNhbXBsZWRJbmZvW3RhZ10sIGV4cGVyaW1lbnRJZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGFnTWV0YWRhdGFbcGx1Z2luXSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVzdCksIHsgdGFnUnVuU2FtcGxlZEluZm86IGZyb250ZW5kVGFnUnVuU2FtcGxlZEluZm8gfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBjb25zdCBfYiA9IGJhY2tlbmRUYWdNZXRhZGF0YVtwbHVnaW5dLCB7IHJ1blRhZ0luZm8gfSA9IF9iLCByZXN0ID0gX19yZXN0KF9iLCBbInJ1blRhZ0luZm8iXSk7CiAgICAgICAgICAgICAgICB0YWdNZXRhZGF0YVtwbHVnaW5dID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCByZXN0KSwgeyBydW5UYWdJbmZvOiBidWlsZFJ1bklkS2V5ZWRPYmplY3QocnVuVGFnSW5mbywgZXhwZXJpbWVudElkKSB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFnTWV0YWRhdGE7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcmVzdWx0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYnVpbGRDb21iaW5lZFRhZ01ldGFkYXRhKHJlc3VsdHMpIHsKICAgICAgICAvLyBDb2xsYXRlIHJlc3VsdHMgZnJvbSBkaWZmZXJlbnQgZXhwZXJpbWVudHMuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhZ01ldGFkYXRhID0gKC8qKiBAdHlwZSB7P30gKi8gKHt9KSk7CiAgICAgICAgZm9yIChjb25zdCBleHBlcmltZW50VGFnTWV0YWRhdGEgb2YgcmVzdWx0cykgewogICAgICAgICAgICBmb3IgKGNvbnN0IHBsdWdpbiBvZiBPYmplY3QudmFsdWVzKFBsdWdpblR5cGUpKSB7CiAgICAgICAgICAgICAgICBpZiAoaXNTYW1wbGVkUGx1Z2luKHBsdWdpbikpIHsKICAgICAgICAgICAgICAgICAgICB0YWdNZXRhZGF0YVtwbHVnaW5dID0gdGFnTWV0YWRhdGFbcGx1Z2luXSB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0Rlc2NyaXB0aW9uczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ1J1blNhbXBsZWRJbmZvOiB7fSwKICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgdGFnRGVzY3JpcHRpb25zLCB0YWdSdW5TYW1wbGVkSW5mbyB9ID0gZXhwZXJpbWVudFRhZ01ldGFkYXRhW3BsdWdpbl07CiAgICAgICAgICAgICAgICAgICAgdGFnTWV0YWRhdGFbcGx1Z2luXS50YWdEZXNjcmlwdGlvbnMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHRhZ01ldGFkYXRhW3BsdWdpbl0udGFnRGVzY3JpcHRpb25zKSwgdGFnRGVzY3JpcHRpb25zKTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY29tYmluZWRUYWdSdW5TYW1wbGVkSW5mbyA9IHRhZ01ldGFkYXRhW3BsdWdpbl0udGFnUnVuU2FtcGxlZEluZm87CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB0YWcgb2YgT2JqZWN0LmtleXModGFnUnVuU2FtcGxlZEluZm8pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkVGFnUnVuU2FtcGxlZEluZm9bdGFnXSA9IGNvbWJpbmVkVGFnUnVuU2FtcGxlZEluZm9bdGFnXSB8fCB7fTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBydW5JZCBvZiBPYmplY3Qua2V5cyh0YWdSdW5TYW1wbGVkSW5mb1t0YWddKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRUYWdSdW5TYW1wbGVkSW5mb1t0YWddW3J1bklkXSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFnUnVuU2FtcGxlZEluZm9bdGFnXVtydW5JZF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0YWdNZXRhZGF0YVtwbHVnaW5dID0gdGFnTWV0YWRhdGFbcGx1Z2luXSB8fCB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRhZ0Rlc2NyaXB0aW9uczoge30sCiAgICAgICAgICAgICAgICAgICAgICAgIHJ1blRhZ0luZm86IHt9LAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgY29uc3QgeyB0YWdEZXNjcmlwdGlvbnMsIHJ1blRhZ0luZm8gfSA9IGV4cGVyaW1lbnRUYWdNZXRhZGF0YVtwbHVnaW5dOwogICAgICAgICAgICAgICAgICAgIHRhZ01ldGFkYXRhW3BsdWdpbl0udGFnRGVzY3JpcHRpb25zID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0YWdNZXRhZGF0YVtwbHVnaW5dLnRhZ0Rlc2NyaXB0aW9ucyksIHRhZ0Rlc2NyaXB0aW9ucyk7CiAgICAgICAgICAgICAgICAgICAgdGFnTWV0YWRhdGFbcGx1Z2luXS5ydW5UYWdJbmZvID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCB0YWdNZXRhZGF0YVtwbHVnaW5dLnJ1blRhZ0luZm8pLCBydW5UYWdJbmZvKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFnTWV0YWRhdGE7CiAgICB9CiAgICAvKioKICAgICAqIEFuIGltcGxlbWVudGF0aW9uIG9mIE1ldHJpY3NEYXRhU291cmNlIHRoYXQgdHJlYXRzIFJ1bklkcyBhcyBpZGVudGlmaWVycwogICAgICogY29udGFpbmluZyBydW4gbmFtZSBhbmQgZXhwZXJpbWVudElkLgogICAgICovCiAgICBjbGFzcyBUQk1ldHJpY3NEYXRhU291cmNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGh0dHAKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihodHRwKSB7CiAgICAgICAgICAgIHRoaXMuaHR0cCA9IGh0dHA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hUYWdNZXRhZGF0YShleHBlcmltZW50SWRzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmV0Y2hlcyA9IGV4cGVyaW1lbnRJZHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChleHBlcmltZW50SWQpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHVybCA9IGAvZXhwZXJpbWVudC8ke2V4cGVyaW1lbnRJZH0vJHtIVFRQX1BBVEhfUFJFRklYfS90YWdzYDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHVybCkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YWdNZXRhZGF0YQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHRhZ01ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkRnJvbnRlbmRUYWdNZXRhZGF0YSh0YWdNZXRhZGF0YSwgZXhwZXJpbWVudElkKTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKGZldGNoZXMpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByZXN1bHRzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVzdWx0cykgPT4gYnVpbGRDb21iaW5lZFRhZ01ldGFkYXRhKHJlc3VsdHMpKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUT0RPKHBzeWJ1enopOiB3ZSBvbmx5IHJlcXVlc3QgMSBhdCBhIHRpbWUsIGNvbnNpZGVyIHVwZGF0aW5nIHRoZSBiYWNrZW5kIHRvCiAgICAgICAgICogdGFrZSBhIEJhY2tlbmRUaW1lU2VyaWVzUmVxdWVzdCBpbnN0ZWFkIG9mIGFuIGFycmF5LgogICAgICAgICAqIEBwYXJhbSB7P30gcmVxdWVzdHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoVGltZVNlcmllcyhyZXF1ZXN0cykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZldGNoZXMgPSByZXF1ZXN0cy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcXVlc3QKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZXF1ZXN0KSA9PiB7CiAgICAgICAgICAgICAgICAvLyBPbmUgc2luZ2xlLXJ1biByZXF1ZXN0LgogICAgICAgICAgICAgICAgaWYgKGlzU2luZ2xlUnVuUGx1Z2luKHJlcXVlc3QucGx1Z2luKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IF9hID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlcXVlc3QpKSwgeyBydW5JZCB9ID0gX2EsIHJlcXVlc3RSZXN0ID0gX19yZXN0KF9hLCBbInJ1bklkIl0pOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcnVuLCBleHBlcmltZW50SWQgfSA9IHBhcnNlUnVuSWQocnVuSWQpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZW5kUmVxdWVzdCA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgcmVxdWVzdFJlc3QpLCB7IHJ1biB9KTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRpbWVTZXJpZXNCYWNrZW5kUmVxdWVzdChiYWNrZW5kUmVxdWVzdCwgZXhwZXJpbWVudElkKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICh7IHJlc3BvbnNlLCBleHBlcmltZW50SWQgfSkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRGcm9udGVuZFRpbWVTZXJpZXNSZXNwb25zZShyZXNwb25zZSwgZXhwZXJpbWVudElkKTsKICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gT25lIG11bHRpLXJ1biByZXF1ZXN0IGdlbmVyYXRlcyBtYW55IHJlc3BvbnNlcyB3aXRoIGRpZmZlcmVudAogICAgICAgICAgICAgICAgLy8gJ3J1blRvU2VyaWVzJywgJ2Vycm9yJyBmaWVsZHMuIENvbWJpbmUgdGhlbSBpbnRvIG9uZS4KICAgICAgICAgICAgICAgIGNvbnN0IF9iID0gKC8qKiBAdHlwZSB7P30gKi8gKHJlcXVlc3QpKSwgeyBleHBlcmltZW50SWRzIH0gPSBfYiwgcmVxdWVzdFJlc3QgPSBfX3Jlc3QoX2IsIFsiZXhwZXJpbWVudElkcyJdKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHBlckV4cGVyaW1lbnRSZXF1ZXN0cyA9IGV4cGVyaW1lbnRJZHMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXhwZXJpbWVudElkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hUaW1lU2VyaWVzQmFja2VuZFJlcXVlc3QocmVxdWVzdFJlc3QsIGV4cGVyaW1lbnRJZCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4ocGVyRXhwZXJpbWVudFJlcXVlc3RzKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBlckV4cGVyaW1lbnRSZXN1bHRzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocGVyRXhwZXJpbWVudFJlc3VsdHMpID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBfYSA9IHBlckV4cGVyaW1lbnRSZXN1bHRzWzBdLnJlc3BvbnNlLCByZXNwb25zZVJlc3QgPSBfX3Jlc3QoX2EsIFsicnVuVG9TZXJpZXMiLCAiZXJyb3IiXSk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbWJpbmVkUmVzcG9uc2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAocmVzcG9uc2VSZXN0KSk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB7IHJlc3BvbnNlLCBleHBlcmltZW50SWQgfSBvZiBwZXJFeHBlcmltZW50UmVzdWx0cykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZyb250ZW5kUmVzcG9uc2UgPSBidWlsZEZyb250ZW5kVGltZVNlcmllc1Jlc3BvbnNlKHJlc3BvbnNlLCBleHBlcmltZW50SWQpOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29tYmluZWRSZXNwb25zZS5lcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyBydW5Ub1NlcmllcywgZXJyb3IgfSA9IGZyb250ZW5kUmVzcG9uc2U7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRSZXNwb25zZS5lcnJvciA9IGVycm9yOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRSZXNwb25zZS5ydW5Ub1NlcmllcyA9IHVuZGVmaW5lZDsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbWJpbmVkUmVzcG9uc2UucnVuVG9TZXJpZXMgPSBjb21iaW5lZFJlc3BvbnNlLnJ1blRvU2VyaWVzIHx8IHt9OwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBydW4gb2YgT2JqZWN0LmtleXMoKC8qKiBAdHlwZSB7P30gKi8gKHJ1blRvU2VyaWVzKSkpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tYmluZWRSZXNwb25zZS5ydW5Ub1Nlcmllc1tydW5dID0gKC8qKiBAdHlwZSB7P30gKi8gKHJ1blRvU2VyaWVzKSlbcnVuXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29tYmluZWRSZXNwb25zZTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKGZldGNoZXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYmFja2VuZFJlcXVlc3QKICAgICAgICAgKiBAcGFyYW0gez99IGV4cGVyaW1lbnRJZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hUaW1lU2VyaWVzQmFja2VuZFJlcXVlc3QoYmFja2VuZFJlcXVlc3QsIGV4cGVyaW1lbnRJZCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJvZHkgPSBuZXcgRm9ybURhdGEoKTsKICAgICAgICAgICAgYm9keS5hcHBlbmQoJ3JlcXVlc3RzJywgSlNPTi5zdHJpbmdpZnkoW2JhY2tlbmRSZXF1ZXN0XSkpOwogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwCiAgICAgICAgICAgICAgICAucG9zdChgL2V4cGVyaW1lbnQvJHtleHBlcmltZW50SWR9LyR7SFRUUF9QQVRIX1BSRUZJWH0vdGltZVNlcmllc2AsIGJvZHkpCiAgICAgICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlc3BvbnNlcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlc3BvbnNlcykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHsgcmVzcG9uc2U6IHJlc3BvbnNlc1swXSwgZXhwZXJpbWVudElkIH07CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW1hZ2VJZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaW1hZ2VVcmwoaW1hZ2VJZCkgewogICAgICAgICAgICByZXR1cm4gYCR7SFRUUF9QQVRIX1BSRUZJWH0vaW1hZ2VEYXRhP2ltYWdlSWQ9JHtpbWFnZUlkfWA7CiAgICAgICAgfQogICAgfQogICAgVEJNZXRyaWNzRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgVEJNZXRyaWNzRGF0YVNvdXJjZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFRCSHR0cENsaWVudCB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRCTWV0cmljc0RhdGFTb3VyY2UuybVmYWMgPSBmdW5jdGlvbiBUQk1ldHJpY3NEYXRhU291cmNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCTWV0cmljc0RhdGFTb3VyY2UpKMm1ybVpbmplY3QoVEJIdHRwQ2xpZW50KSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJNZXRyaWNzRGF0YVNvdXJjZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUQk1ldHJpY3NEYXRhU291cmNlLCBmYWN0b3J5OiBUQk1ldHJpY3NEYXRhU291cmNlLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dlYmFwcF9kYXRhX3NvdXJjZS90Yl9odHRwX2NsaWVudF9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVEJIdHRwQ2xpZW50TW9kdWxlIHsKICAgIH0KICAgIFRCSHR0cENsaWVudE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0h0dHBDbGllbnRNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW1RCSHR0cENsaWVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJIdHRwQ2xpZW50TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVEJIdHRwQ2xpZW50TW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRCSHR0cENsaWVudE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRCSHR0cENsaWVudE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUQkh0dHBDbGllbnRNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW1RCSHR0cENsaWVudF0sIGltcG9ydHM6IFtbSHR0cENsaWVudE1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVEJIdHRwQ2xpZW50TW9kdWxlLCB7IGltcG9ydHM6IFtIdHRwQ2xpZW50TW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL2RhdGFfc291cmNlL21ldHJpY3NfZGF0YV9zb3VyY2VfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1ldHJpY3NEYXRhU291cmNlTW9kdWxlIHsKICAgIH0KICAgIE1ldHJpY3NEYXRhU291cmNlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IE1ldHJpY3NEYXRhU291cmNlLCB1c2VDbGFzczogVEJNZXRyaWNzRGF0YVNvdXJjZSB9XSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzRGF0YVNvdXJjZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1ldHJpY3NEYXRhU291cmNlTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY3NEYXRhU291cmNlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWV0cmljc0RhdGFTb3VyY2VNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWV0cmljc0RhdGFTb3VyY2VNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWV0cmljc0RhdGFTb3VyY2UsIHVzZUNsYXNzOiBUQk1ldHJpY3NEYXRhU291cmNlIH1dLCBpbXBvcnRzOiBbW1RCSHR0cENsaWVudE1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWV0cmljc0RhdGFTb3VyY2VNb2R1bGUsIHsgaW1wb3J0czogW1RCSHR0cENsaWVudE1vZHVsZV0gfSk7IH0pKCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIGxvYWRhYmxlIGluZm9ybWF0aW9uIGZvciBhIHNwZWNpZmljIHRhZywgY29udGFpbmluZyBpdHMgc2VyaWVzCiAgICAgKiBkYXRhIGFuZCBsb2FkIHN0YXRlLiBSZXR1cm5zIGBudWxsYCB3aGVuIHRoZSByZXF1ZXN0ZWQgdGFnIGhhcyBubyBpbml0aWFsCiAgICAgKiBsb2FkYWJsZSBpbiBgdGltZVNlcmllc0RhdGFgLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRUaW1lU2VyaWVzTG9hZGFibGUodGltZVNlcmllc0RhdGEsIHBsdWdpbiwgdGFnLCBzYW1wbGUpIHsKICAgICAgICBjb25zdCBwbHVnaW5EYXRhID0gdGltZVNlcmllc0RhdGFbcGx1Z2luXTsKICAgICAgICBpZiAoIXBsdWdpbkRhdGEuaGFzT3duUHJvcGVydHkodGFnKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgaWYgKGlzU2FtcGxlZFBsdWdpbihwbHVnaW4pKSB7CiAgICAgICAgICAgIGlmICghdGltZVNlcmllc0RhdGFbcGx1Z2luXVt0YWddLmhhc093blByb3BlcnR5KHNhbXBsZSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aW1lU2VyaWVzRGF0YVtwbHVnaW5dW3RhZ11bc2FtcGxlXTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRpbWVTZXJpZXNEYXRhW3BsdWdpbl1bdGFnXTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlIGEgbmV3IHBsdWdpbiBkYXRhIHdpdGggbmV3IHJlZmVyZW5jZXMgdG8gYSBuZXcgdGltZSBzZXJpZXMgbG9hZGFibGUuCiAgICAgKiBUaGUgcmV0dXJuIG9iamVjdCBpcyBhIHNoYWxsb3cgY2xvbmUsIHNvIGNvbnN1bWVycyBtdXN0IGNsb25lIGZpZWxkcyBhcwogICAgICogbmVlZGVkLgogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVQbHVnaW5EYXRhV2l0aExvYWRhYmxlKHRpbWVTZXJpZXNEYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKSB7CiAgICAgICAgaWYgKGlzU2FtcGxlZFBsdWdpbihwbHVnaW4pKSB7CiAgICAgICAgICAgIGNvbnN0IHBsdWdpbkRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aW1lU2VyaWVzRGF0YVtwbHVnaW5dKTsKICAgICAgICAgICAgY29uc3QgdGFnRGF0YSA9IGNyZWF0ZVNhbXBsZWRUYWdEYXRhV2l0aExvYWRhYmxlKHBsdWdpbkRhdGEsIHRhZywgc2FtcGxlKTsKICAgICAgICAgICAgcGx1Z2luRGF0YVt0YWddID0gdGFnRGF0YTsKICAgICAgICAgICAgcmV0dXJuIHBsdWdpbkRhdGE7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHBsdWdpbkRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCB0aW1lU2VyaWVzRGF0YVtwbHVnaW5dKTsKICAgICAgICBjb25zdCBoYXNUYWcgPSBwbHVnaW5EYXRhLmhhc093blByb3BlcnR5KHRhZyk7CiAgICAgICAgcGx1Z2luRGF0YVt0YWddID0gaGFzVGFnCiAgICAgICAgICAgID8gT2JqZWN0LmFzc2lnbih7fSwgcGx1Z2luRGF0YVt0YWddKSA6IGJ1aWxkVGltZVNlcmllc0xvYWRhYmxlKCk7CiAgICAgICAgcmV0dXJuIHBsdWdpbkRhdGE7CiAgICB9CiAgICBmdW5jdGlvbiBjcmVhdGVTYW1wbGVkVGFnRGF0YVdpdGhMb2FkYWJsZShwbHVnaW5EYXRhLCB0YWcsIHNhbXBsZSkgewogICAgICAgIGNvbnN0IGhhc1RhZyA9IHBsdWdpbkRhdGEuaGFzT3duUHJvcGVydHkodGFnKTsKICAgICAgICBjb25zdCB0YWdEYXRhID0gaGFzVGFnID8gT2JqZWN0LmFzc2lnbih7fSwgcGx1Z2luRGF0YVt0YWddKSA6IHt9OwogICAgICAgIGNvbnN0IGhhc1NhbXBsZSA9IHRhZ0RhdGEuaGFzT3duUHJvcGVydHkoc2FtcGxlKTsKICAgICAgICB0YWdEYXRhW3NhbXBsZV0gPSBoYXNTYW1wbGUKICAgICAgICAgICAgPyBPYmplY3QuYXNzaWduKHt9LCB0YWdEYXRhW3NhbXBsZV0pIDogYnVpbGRUaW1lU2VyaWVzTG9hZGFibGUoKTsKICAgICAgICByZXR1cm4gdGFnRGF0YTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkVGltZVNlcmllc0xvYWRhYmxlKCkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHJ1blRvU2VyaWVzOiB7fSwKICAgICAgICAgICAgcnVuVG9Mb2FkU3RhdGU6IHt9LAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIE5vdGU6IGRvIG5vdCByZWx5IG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZXNlIElEIGdlbmVyYXRvcnMgYmVsb3cuCiAgICAgKiBDbGllbnRzIHNob3VsZCBvcGVyYXRlIG9uIGBDYXJkSWRgcywgd2hvc2UgdHlwZSBtYXkgYmUgb3BlbiB0byBjaGFuZ2UuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENhcmRJZChjYXJkTWV0YWRhdGEpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY2FyZE1ldGFkYXRhKTsKICAgIH0KICAgIGZ1bmN0aW9uIGdldFBpbm5lZENhcmRJZChiYXNlQ2FyZElkKSB7CiAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KHsgYmFzZUNhcmRJZCB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ3JlYXRlcyBhIFJ1blRvTG9hZFN0YXRlIHdpdGggYSBzcGVjaWZpYyBsb2FkIHN0YXRlIGZvciBhbGwgc3BlY2lmaWVkIHJ1bnMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVJ1blRvTG9hZFN0YXRlKGxvYWRTdGF0ZSwgcnVucywgcHJldlJ1blRvTG9hZFN0YXRlKSB7CiAgICAgICAgY29uc3QgcnVuVG9Mb2FkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBwcmV2UnVuVG9Mb2FkU3RhdGUpOwogICAgICAgIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMpIHsKICAgICAgICAgICAgcnVuVG9Mb2FkU3RhdGVbcnVuXSA9IGxvYWRTdGF0ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJ1blRvTG9hZFN0YXRlOwogICAgfQogICAgZnVuY3Rpb24gZ2V0UnVuSWRzKHRhZ01ldGFkYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKSB7CiAgICAgICAgaWYgKGlzU2FtcGxlZFBsdWdpbihwbHVnaW4pKSB7CiAgICAgICAgICAgIGNvbnN0IHRhZ1J1blNhbXBsZWRJbmZvID0gdGFnTWV0YWRhdGFbcGx1Z2luXS50YWdSdW5TYW1wbGVkSW5mbzsKICAgICAgICAgICAgaWYgKCF0YWdSdW5TYW1wbGVkSW5mby5oYXNPd25Qcm9wZXJ0eSh0YWcpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgcnVuSWRzID0gT2JqZWN0LmtleXModGFnUnVuU2FtcGxlZEluZm9bdGFnXSk7CiAgICAgICAgICAgIHJldHVybiBydW5JZHMuZmlsdGVyKChydW5JZCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHNhbXBsZSA8IHRhZ1J1blNhbXBsZWRJbmZvW3RhZ11bcnVuSWRdLm1heFNhbXBsZXNQZXJTdGVwOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgY29uc3QgdGFnVG9SdW5JZHMgPSB0YWdNZXRhZGF0YVtwbHVnaW5dLnRhZ1RvUnVuczsKICAgICAgICByZXR1cm4gdGFnVG9SdW5JZHMuaGFzT3duUHJvcGVydHkodGFnKSA/IHRhZ1RvUnVuSWRzW3RhZ10gOiBbXTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBDYXJkTWV0YWRhdGEgZXhhY3RseSBtYXRjaGVzIHRoZSBwaW5uZWQgY2FyZCBmcm9tCiAgICAgKiBzdG9yYWdlLgogICAgICovCiAgICBmdW5jdGlvbiBjYXJkTWF0Y2hlc0NhcmRVbmlxdWVJbmZvKGNhcmRNZXRhZGF0YSwgY2FyZFVuaXF1ZUluZm8pIHsKICAgICAgICBjb25zdCBub1J1bklkID0gIWNhcmRNZXRhZGF0YS5ydW5JZCAmJiAhY2FyZFVuaXF1ZUluZm8ucnVuSWQ7CiAgICAgICAgcmV0dXJuIChjYXJkTWV0YWRhdGEucGx1Z2luID09PSBjYXJkVW5pcXVlSW5mby5wbHVnaW4gJiYKICAgICAgICAgICAgY2FyZE1ldGFkYXRhLnRhZyA9PT0gY2FyZFVuaXF1ZUluZm8udGFnICYmCiAgICAgICAgICAgIGNhcmRNZXRhZGF0YS5zYW1wbGUgPT09IGNhcmRVbmlxdWVJbmZvLnNhbXBsZSAmJgogICAgICAgICAgICAoY2FyZE1ldGFkYXRhLnJ1bklkID09PSBjYXJkVW5pcXVlSW5mby5ydW5JZCB8fCBub1J1bklkKSk7CiAgICB9CiAgICAvKioKICAgICAqIEF0dGVtcHRzIHRvIHJlc29sdmUgdGhlIGltcG9ydGVkIHBpbnMgYWdhaW5zdCB0aGUgbGlzdCBvZiBub24tcGlubmVkIGNhcmRzCiAgICAgKiBwcm92aWRlZC4gUmV0dXJucyB0aGUgcmVzdWx0aW5nIHN0YXRlLgogICAgICoKICAgICAqIE5vdGU6IHRoaXMgYXNzdW1lcyBpbnB1dCBoYXMgYWxyZWFkeSBiZWVuIHNhbml0aXplZCBhbmQgdmFsaWRhdGVkLiBVbnRydXN0ZWQKICAgICAqIGRhdGEgZnJvbSBVUkxzIG11c3QgYmUgY2xlYW5lZCBiZWZvcmUgYmVpbmcgcGFzc2VkIHRvIHRoZSBzdG9yZS4KICAgICAqLwogICAgZnVuY3Rpb24gYnVpbGRPclJldHVyblN0YXRlV2l0aFVucmVzb2x2ZWRJbXBvcnRlZFBpbnModW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMsIG5vblBpbm5lZENhcmRzLCBjYXJkTWV0YWRhdGFNYXAsIGNhcmRUb1Bpbm5lZENvcHksIHBpbm5lZENhcmRUb09yaWdpbmFsLCBjYXJkU3RlcEluZGV4TWFwKSB7CiAgICAgICAgY29uc3QgdW5yZXNvbHZlZFBpblNldCA9IG5ldyBTZXQodW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMpOwogICAgICAgIGNvbnN0IG5vblBpbm5lZENhcmRzV2l0aE1hdGNoID0gW107CiAgICAgICAgZm9yIChjb25zdCB1bnJlc29sdmVkUGluIG9mIHVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzKSB7CiAgICAgICAgICAgIGZvciAoY29uc3Qgbm9uUGlubmVkQ2FyZElkIG9mIG5vblBpbm5lZENhcmRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjYXJkTWV0YWRhdGEgPSBjYXJkTWV0YWRhdGFNYXBbbm9uUGlubmVkQ2FyZElkXTsKICAgICAgICAgICAgICAgIGlmIChjYXJkTWF0Y2hlc0NhcmRVbmlxdWVJbmZvKGNhcmRNZXRhZGF0YSwgdW5yZXNvbHZlZFBpbikpIHsKICAgICAgICAgICAgICAgICAgICBub25QaW5uZWRDYXJkc1dpdGhNYXRjaC5wdXNoKG5vblBpbm5lZENhcmRJZCk7CiAgICAgICAgICAgICAgICAgICAgdW5yZXNvbHZlZFBpblNldC5kZWxldGUodW5yZXNvbHZlZFBpbik7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCFub25QaW5uZWRDYXJkc1dpdGhNYXRjaC5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzLAogICAgICAgICAgICAgICAgY2FyZE1ldGFkYXRhTWFwLAogICAgICAgICAgICAgICAgY2FyZFRvUGlubmVkQ29weSwKICAgICAgICAgICAgICAgIHBpbm5lZENhcmRUb09yaWdpbmFsLAogICAgICAgICAgICAgICAgY2FyZFN0ZXBJbmRleDogY2FyZFN0ZXBJbmRleE1hcCwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgbGV0IHN0YXRlV2l0aFJlc29sdmVkUGlucyA9IHsKICAgICAgICAgICAgY2FyZFRvUGlubmVkQ29weSwKICAgICAgICAgICAgcGlubmVkQ2FyZFRvT3JpZ2luYWwsCiAgICAgICAgICAgIGNhcmRTdGVwSW5kZXg6IGNhcmRTdGVwSW5kZXhNYXAsCiAgICAgICAgICAgIGNhcmRNZXRhZGF0YU1hcCwKICAgICAgICB9OwogICAgICAgIGZvciAoY29uc3QgY2FyZFRvUGluIG9mIG5vblBpbm5lZENhcmRzV2l0aE1hdGNoKSB7CiAgICAgICAgICAgIHN0YXRlV2l0aFJlc29sdmVkUGlucyA9IGJ1aWxkT3JSZXR1cm5TdGF0ZVdpdGhQaW5uZWRDb3B5KGNhcmRUb1Bpbiwgc3RhdGVXaXRoUmVzb2x2ZWRQaW5zLmNhcmRUb1Bpbm5lZENvcHksIHN0YXRlV2l0aFJlc29sdmVkUGlucy5waW5uZWRDYXJkVG9PcmlnaW5hbCwgc3RhdGVXaXRoUmVzb2x2ZWRQaW5zLmNhcmRTdGVwSW5kZXgsIHN0YXRlV2l0aFJlc29sdmVkUGlucy5jYXJkTWV0YWRhdGFNYXApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZVdpdGhSZXNvbHZlZFBpbnMpLCB7IHVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzOiBbLi4udW5yZXNvbHZlZFBpblNldF0gfSk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybiB0aGUgc3RhdGUgcHJvZHVjZWQgYnkgY3JlYXRpbmcgYSBuZXcgcGlubmVkIGNvcHkgb2YgdGhlIHByb3ZpZGVkIGNhcmQuCiAgICAgKiBNYXkgdGhyb3cgaWYgdGhlIGNhcmQgcHJvdmlkZWQgaGFzIG5vIG1ldGFkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBidWlsZE9yUmV0dXJuU3RhdGVXaXRoUGlubmVkQ29weShjYXJkSWQsIGNhcmRUb1Bpbm5lZENvcHksIHBpbm5lZENhcmRUb09yaWdpbmFsLCBjYXJkU3RlcEluZGV4TWFwLCBjYXJkTWV0YWRhdGFNYXApIHsKICAgICAgICAvLyBOby1vcCBpZiB0aGUgY2FyZCBhbHJlYWR5IGhhcyBhIHBpbm5lZCBjb3B5LgogICAgICAgIGlmIChjYXJkVG9QaW5uZWRDb3B5LmhhcyhjYXJkSWQpKSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjYXJkVG9QaW5uZWRDb3B5LAogICAgICAgICAgICAgICAgcGlubmVkQ2FyZFRvT3JpZ2luYWwsCiAgICAgICAgICAgICAgICBjYXJkU3RlcEluZGV4OiBjYXJkU3RlcEluZGV4TWFwLAogICAgICAgICAgICAgICAgY2FyZE1ldGFkYXRhTWFwLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXh0Q2FyZFRvUGlubmVkQ29weSA9IG5ldyBNYXAoY2FyZFRvUGlubmVkQ29weSk7CiAgICAgICAgY29uc3QgbmV4dFBpbm5lZENhcmRUb09yaWdpbmFsID0gbmV3IE1hcChwaW5uZWRDYXJkVG9PcmlnaW5hbCk7CiAgICAgICAgY29uc3QgbmV4dENhcmRTdGVwSW5kZXhNYXAgPSBPYmplY3QuYXNzaWduKHt9LCBjYXJkU3RlcEluZGV4TWFwKTsKICAgICAgICBjb25zdCBuZXh0Q2FyZE1ldGFkYXRhTWFwID0gT2JqZWN0LmFzc2lnbih7fSwgY2FyZE1ldGFkYXRhTWFwKTsKICAgICAgICAvLyBDcmVhdGUgYSBwaW5uZWQgY29weS4gQ29waWVzIHN0ZXAgaW5kZXggZnJvbSB0aGUgb3JpZ2luYWwgY2FyZC4KICAgICAgICBjb25zdCBwaW5uZWRDYXJkSWQgPSBnZXRQaW5uZWRDYXJkSWQoY2FyZElkKTsKICAgICAgICBuZXh0Q2FyZFRvUGlubmVkQ29weS5zZXQoY2FyZElkLCBwaW5uZWRDYXJkSWQpOwogICAgICAgIG5leHRQaW5uZWRDYXJkVG9PcmlnaW5hbC5zZXQocGlubmVkQ2FyZElkLCBjYXJkSWQpOwogICAgICAgIGlmIChjYXJkU3RlcEluZGV4TWFwLmhhc093blByb3BlcnR5KGNhcmRJZCkpIHsKICAgICAgICAgICAgbmV4dENhcmRTdGVwSW5kZXhNYXBbcGlubmVkQ2FyZElkXSA9IGNhcmRTdGVwSW5kZXhNYXBbY2FyZElkXTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbWV0YWRhdGEgPSBjYXJkTWV0YWRhdGFNYXBbY2FyZElkXTsKICAgICAgICBpZiAoIW1ldGFkYXRhKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IHBpbiBhIGNhcmQgd2l0aG91dCBtZXRhZGF0YScpOwogICAgICAgIH0KICAgICAgICBuZXh0Q2FyZE1ldGFkYXRhTWFwW3Bpbm5lZENhcmRJZF0gPSBtZXRhZGF0YTsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBjYXJkVG9QaW5uZWRDb3B5OiBuZXh0Q2FyZFRvUGlubmVkQ29weSwKICAgICAgICAgICAgcGlubmVkQ2FyZFRvT3JpZ2luYWw6IG5leHRQaW5uZWRDYXJkVG9PcmlnaW5hbCwKICAgICAgICAgICAgY2FyZFN0ZXBJbmRleDogbmV4dENhcmRTdGVwSW5kZXhNYXAsCiAgICAgICAgICAgIGNhcmRNZXRhZGF0YU1hcDogbmV4dENhcmRNZXRhZGF0YU1hcCwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGlucyB3ZSBhbGxvdyB0aGUgdXNlciB0byBjcmVhdGUuIFRoaXMgaXMgaW50ZW50aW9uYWxseQogICAgICogZmluaXRlIGF0IHRoZSBtb21lbnQgdG8gbWl0aWdhdGUgc3VwZXIgbG9uZyBVUkwgbGVuZ3RocywgdW50aWwgdGhlcmUgaXMgbW9yZQogICAgICogZHVyYWJsZSB2YWx1ZSBzdG9yYWdlIGZvciBwaW5zLgogICAgICogaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzQyNDIKICAgICAqLwogICAgY29uc3QgdXRpbCA9IHsKICAgICAgICBNQVhfUElOX0NPVU5UOiAxMCwKICAgIH07CiAgICBmdW5jdGlvbiBjYW5DcmVhdGVOZXdQaW5zKHN0YXRlKSB7CiAgICAgICAgY29uc3QgcGluQ291bnRJblVSTCA9IHN0YXRlLnBpbm5lZENhcmRUb09yaWdpbmFsLnNpemUgKwogICAgICAgICAgICBzdGF0ZS51bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcy5sZW5ndGg7CiAgICAgICAgcmV0dXJuIHBpbkNvdW50SW5VUkwgPCB1dGlsLk1BWF9QSU5fQ09VTlQ7CiAgICB9CgogICAgY29uc3QgTUVUUklDU19GRUFUVVJFX0tFWSA9ICdtZXRyaWNzJzsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNvbnN0IHNlbGVjdE1ldHJpY3NTdGF0ZSA9IGNyZWF0ZUZlYXR1cmVTZWxlY3RvcihNRVRSSUNTX0ZFQVRVUkVfS0VZKTsKICAgIGNvbnN0IGdldE1ldHJpY3NUYWdNZXRhZGF0YUxvYWRlZCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE1ldHJpY3NTdGF0ZSwgKHN0YXRlKSA9PiBzdGF0ZS50YWdNZXRhZGF0YUxvYWRlZCk7CiAgICBjb25zdCBnZXRNZXRyaWNzVGFnTWV0YWRhdGEgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS50YWdNZXRhZGF0YTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBDYXJkcwogICAgICovCiAgICBjb25zdCBnZXRDYXJkSWRzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuY2FyZExpc3Q7CiAgICB9KTsKICAgIGNvbnN0IGdldENhcmRMb2FkU3RhdGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSwgY2FyZElkKSA9PiB7CiAgICAgICAgaWYgKCFzdGF0ZS5jYXJkTWV0YWRhdGFNYXAuaGFzT3duUHJvcGVydHkoY2FyZElkKSkgewogICAgICAgICAgICByZXR1cm4gRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVEOwogICAgICAgIH0KICAgICAgICBjb25zdCB7IHBsdWdpbiwgdGFnLCBydW5JZCwgc2FtcGxlIH0gPSBzdGF0ZS5jYXJkTWV0YWRhdGFNYXBbY2FyZElkXTsKICAgICAgICBjb25zdCBsb2FkYWJsZSA9IGdldFRpbWVTZXJpZXNMb2FkYWJsZShzdGF0ZS50aW1lU2VyaWVzRGF0YSwgcGx1Z2luLCB0YWcsIHNhbXBsZSk7CiAgICAgICAgaWYgKCFsb2FkYWJsZSkgewogICAgICAgICAgICByZXR1cm4gRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVEOwogICAgICAgIH0KICAgICAgICBjb25zdCBydW5Ub0xvYWRTdGF0ZSA9IGxvYWRhYmxlLnJ1blRvTG9hZFN0YXRlOwogICAgICAgIGlmIChydW5JZCkgewogICAgICAgICAgICByZXR1cm4gcnVuVG9Mb2FkU3RhdGUuaGFzT3duUHJvcGVydHkocnVuSWQpCiAgICAgICAgICAgICAgICA/IHJ1blRvTG9hZFN0YXRlW3J1bklkXQogICAgICAgICAgICAgICAgOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJ1bklkcyA9IGdldFJ1bklkcyhzdGF0ZS50YWdNZXRhZGF0YSwgcGx1Z2luLCB0YWcsIHNhbXBsZSk7CiAgICAgICAgaWYgKCFydW5JZHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2Fubm90IGxvYWQgYSBjYXJkIHdob3NlIHRhZyBoYXMgbm8gcnVucycpOwogICAgICAgIH0KICAgICAgICBpZiAocnVuSWRzLmV2ZXJ5KChydW5JZCkgPT4gcnVuVG9Mb2FkU3RhdGVbcnVuSWRdID09PSBEYXRhTG9hZFN0YXRlLkxPQURFRCkpIHsKICAgICAgICAgICAgcmV0dXJuIERhdGFMb2FkU3RhdGUuTE9BREVEOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcnVuSWRzLnNvbWUoKHJ1bklkKSA9PiBydW5Ub0xvYWRTdGF0ZVtydW5JZF0gPT09IERhdGFMb2FkU3RhdGUuTE9BRElORykKICAgICAgICAgICAgPyBEYXRhTG9hZFN0YXRlLkxPQURJTkcKICAgICAgICAgICAgOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQ7CiAgICB9KTsKICAgIGNvbnN0IGdldENhcmRUaW1lU2VyaWVzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUsIGNhcmRJZCkgPT4gewogICAgICAgIGlmICghc3RhdGUuY2FyZE1ldGFkYXRhTWFwLmhhc093blByb3BlcnR5KGNhcmRJZCkpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgcGx1Z2luLCB0YWcsIHNhbXBsZSB9ID0gc3RhdGUuY2FyZE1ldGFkYXRhTWFwW2NhcmRJZF07CiAgICAgICAgY29uc3QgbG9hZGFibGUgPSBnZXRUaW1lU2VyaWVzTG9hZGFibGUoc3RhdGUudGltZVNlcmllc0RhdGEsIHBsdWdpbiwgdGFnLCBzYW1wbGUpOwogICAgICAgIHJldHVybiBsb2FkYWJsZSA/IGxvYWRhYmxlLnJ1blRvU2VyaWVzIDogbnVsbDsKICAgIH0pOwogICAgY29uc3QgZ2V0Q2FyZE1ldGFkYXRhTWFwID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuY2FyZE1ldGFkYXRhTWFwOwogICAgfSk7CiAgICBjb25zdCBnZXRDYXJkTWV0YWRhdGEgPSBjcmVhdGVTZWxlY3RvcihnZXRDYXJkTWV0YWRhdGFNYXAsIChtZXRhZGF0YU1hcCwgY2FyZElkKSA9PiB7CiAgICAgICAgaWYgKCFtZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShjYXJkSWQpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXBbY2FyZElkXTsKICAgIH0pOwogICAgLy8gQSBjaGVhcCBpZGVudGl0eSBzZWxlY3RvciB0byBza2lwIHJlY29tcHV0aW5nIHNlbGVjdG9ycy4KICAgIGNvbnN0IGdldFZpc2libGVDYXJkSWRTZXQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS52aXNpYmxlQ2FyZHM7CiAgICB9KTsKICAgIGNvbnN0IGdldFZpc2libGVDYXJkSWRzID0gY3JlYXRlU2VsZWN0b3IoZ2V0VmlzaWJsZUNhcmRJZFNldCwgKGNhcmRJZFNldCkgPT4gewogICAgICAgIHJldHVybiBbLi4uY2FyZElkU2V0XTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGN1cnJlbnQgbGlzdCBvZiBjYXJkIGRhdGEgd2hvc2UgbWV0YWRhdGEgaXMgbG9hZGVkLgogICAgICovCiAgICBjb25zdCBnZXROb25FbXB0eUNhcmRJZHNXaXRoTWV0YWRhdGEgPSBjcmVhdGVTZWxlY3RvcihnZXRDYXJkSWRzLCBnZXRDYXJkTWV0YWRhdGFNYXAsIChjYXJkSWRzLCBtZXRhZGF0YU1hcCkgPT4gewogICAgICAgIHJldHVybiBjYXJkSWRzCiAgICAgICAgICAgIC5maWx0ZXIoKGNhcmRJZCkgPT4gewogICAgICAgICAgICByZXR1cm4gbWV0YWRhdGFNYXAuaGFzT3duUHJvcGVydHkoY2FyZElkKTsKICAgICAgICB9KQogICAgICAgICAgICAubWFwKChjYXJkSWQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBjYXJkSWQgfSwgbWV0YWRhdGFNYXBbY2FyZElkXSk7CiAgICAgICAgfSk7CiAgICB9KTsKICAgIC8qKgogICAgICogVGhlIGluZGV4IGludG8gdGhlIHN0ZXAgdmFsdWVzIGFycmF5IGZvciBhIGNhcmQncyBVSS4gVGhpcyBtYXkgYmUgZ3JlYXRlcgogICAgICogdGhhbiB0aGUgbnVtYmVyIG9mIHN0ZXAgdmFsdWVzIGF2YWlsYWJsZSwgaWYgdGltZSBzZXJpZXMgZGF0YSBpcyBub3QgbG9hZGVkLgogICAgICovCiAgICBjb25zdCBnZXRDYXJkU3RlcEluZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUsIGNhcmRJZCkgPT4gewogICAgICAgIGlmICghc3RhdGUuY2FyZFN0ZXBJbmRleC5oYXNPd25Qcm9wZXJ0eShjYXJkSWQpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhdGUuY2FyZFN0ZXBJbmRleFtjYXJkSWRdOwogICAgfSk7CiAgICBjb25zdCBnZXRDYXJkVG9QaW5uZWRDb3B5ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuY2FyZFRvUGlubmVkQ29weTsKICAgIH0pOwogICAgY29uc3QgZ2V0UGlubmVkQ2FyZFRvT3JpZ2luYWwgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5waW5uZWRDYXJkVG9PcmlnaW5hbDsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIG9yZGVyZWQgbGlzdCBvZiB0aGUgY2FyZHMgaW4gdGhlIHBpbm5lZCBsb2NhdGlvbi4KICAgICAqLwogICAgY29uc3QgZ2V0UGlubmVkQ2FyZHNXaXRoTWV0YWRhdGEgPSBjcmVhdGVTZWxlY3RvcihnZXRDYXJkVG9QaW5uZWRDb3B5LCBnZXRDYXJkTWV0YWRhdGFNYXAsIChjYXJkVG9QaW5uZWRDb3B5LCBtZXRhZGF0YU1hcCkgPT4gewogICAgICAgIHJldHVybiBbLi4uY2FyZFRvUGlubmVkQ29weS52YWx1ZXMoKV0KICAgICAgICAgICAgLmZpbHRlcigoY2FyZElkKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBtZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShjYXJkSWQpOwogICAgICAgIH0pCiAgICAgICAgICAgIC5tYXAoKGNhcmRJZCkgPT4gewogICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbih7IGNhcmRJZCB9LCBtZXRhZGF0YU1hcFtjYXJkSWRdKTsKICAgICAgICB9KTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHRydWUgaWYgYSBjYXJkIGlzIHBpbm5lZCBvciBhIHNlcGFyYXRlIGNhcmQgZXhpc3RzIHRoYXQgaXMgYSBwaW5uZWQKICAgICAqIGNvcHkgb2YgdGhpcyBjYXJkLiBEZWZhdWx0cyB0byBmYWxzZSBpZiB0aGUgY2FyZCBpcyB1bmtub3duLgogICAgICovCiAgICBjb25zdCBnZXRDYXJkUGlubmVkU3RhdGUgPSBjcmVhdGVTZWxlY3RvcihnZXRDYXJkVG9QaW5uZWRDb3B5LCBnZXRQaW5uZWRDYXJkVG9PcmlnaW5hbCwgKGNhcmRUb1Bpbm5lZENvcHksIHBpbm5lZENhcmRUb09yaWdpbmFsLCBjYXJkSWQpID0+IHsKICAgICAgICByZXR1cm4gY2FyZFRvUGlubmVkQ29weS5oYXMoY2FyZElkKSB8fCBwaW5uZWRDYXJkVG9PcmlnaW5hbC5oYXMoY2FyZElkKTsKICAgIH0pOwogICAgY29uc3QgZ2V0VW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS51bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkczsKICAgIH0pOwogICAgLyoqCiAgICAgKiBXaGV0aGVyIHRoZSBVSSBpcyBhbGxvd2VkIHRvIHBpbiBtb3JlIGNhcmRzLiBUaGlzIG1heSBiZSBsaW1pdGVkIGlmIHRoZSBVUkwKICAgICAqIGNvbnRhaW5zIHRvbyBtYW55IHBpbnMgYWxyZWFkeS4KICAgICAqLwogICAgY29uc3QgZ2V0Q2FuQ3JlYXRlTmV3UGlucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE1ldHJpY3NTdGF0ZSwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIGNhbkNyZWF0ZU5ld1BpbnMoc3RhdGUpOwogICAgfSk7CiAgICAvKioKICAgICAqIFNldHRpbmdzLgogICAgICovCiAgICBjb25zdCBnZXRNZXRyaWNzVG9vbHRpcFNvcnQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gc3RhdGUuc2V0dGluZ3MudG9vbHRpcFNvcnQpOwogICAgY29uc3QgZ2V0TWV0cmljc0lnbm9yZU91dGxpZXJzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUpID0+IHN0YXRlLnNldHRpbmdzLmlnbm9yZU91dGxpZXJzKTsKICAgIGNvbnN0IGdldE1ldHJpY3NYQXhpc1R5cGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gc3RhdGUuc2V0dGluZ3MueEF4aXNUeXBlKTsKICAgIGNvbnN0IGdldE1ldHJpY3NIaXN0b2dyYW1Nb2RlID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUpID0+IHN0YXRlLnNldHRpbmdzLmhpc3RvZ3JhbU1vZGUpOwogICAgY29uc3QgZ2V0TWV0cmljc1NjYWxhclNtb290aGluZyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE1ldHJpY3NTdGF0ZSwgKHN0YXRlKSA9PiBzdGF0ZS5zZXR0aW5ncy5zY2FsYXJTbW9vdGhpbmcpOwogICAgY29uc3QgZ2V0TWV0cmljc0ltYWdlQnJpZ2h0bmVzc0luTWlsbGkgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gc3RhdGUuc2V0dGluZ3MuaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSk7CiAgICBjb25zdCBnZXRNZXRyaWNzSW1hZ2VDb250cmFzdEluTWlsbGkgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gc3RhdGUuc2V0dGluZ3MuaW1hZ2VDb250cmFzdEluTWlsbGkpOwogICAgY29uc3QgZ2V0TWV0cmljc0ltYWdlU2hvd0FjdHVhbFNpemUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RNZXRyaWNzU3RhdGUsIChzdGF0ZSkgPT4gc3RhdGUuc2V0dGluZ3MuaW1hZ2VTaG93QWN0dWFsU2l6ZSk7CiAgICBjb25zdCBnZXRNZXRyaWNzVGFnRmlsdGVyID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TWV0cmljc1N0YXRlLCAoc3RhdGUpID0+IHN0YXRlLnRhZ0ZpbHRlcik7CiAgICBjb25zdCBnZXRNZXRyaWNzVGFnR3JvdXBFeHBhbnNpb25TdGF0ZSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE1ldHJpY3NTdGF0ZSwgKHN0YXRlLCB0YWdHcm91cCkgPT4gewogICAgICAgIHJldHVybiBCb29sZWFuKHN0YXRlLnRhZ0dyb3VwRXhwYW5kZWQuZ2V0KHRhZ0dyb3VwKSk7CiAgICB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBUeXBlcyBkZWZpbmVkIGluIHRlbnNvcmJvYXJkL3BsdWdpbnMvaHBhcmFtcy9hcGkucHJvdG8gYW5kCiAgICAgKiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2hwYXJhbXMvaHR0cF9hcGkubWQuCiAgICAgKi8KICAgIHZhciBEYXRhc2V0VHlwZTsKICAgIChmdW5jdGlvbiAoRGF0YXNldFR5cGUpIHsKICAgICAgICBEYXRhc2V0VHlwZVsiREFUQVNFVF9VTktOT1dOIl0gPSAiREFUQVNFVF9VTktOT1dOIjsKICAgICAgICBEYXRhc2V0VHlwZVsiREFUQVNFVF9UUkFJTklORyJdID0gIkRBVEFTRVRfVFJBSU5JTkciOwogICAgICAgIERhdGFzZXRUeXBlWyJEQVRBU0VUX1ZBTElEQVRJT04iXSA9ICJEQVRBU0VUX1ZBTElEQVRJT04iOwogICAgfSkoRGF0YXNldFR5cGUgfHwgKERhdGFzZXRUeXBlID0ge30pKTsKICAgIHZhciBSdW5TdGF0dXM7CiAgICAoZnVuY3Rpb24gKFJ1blN0YXR1cykgewogICAgICAgIFJ1blN0YXR1c1siU1RBVFVTX1VOS05PV04iXSA9ICJTVEFUVVNfVU5LTk9XTiI7CiAgICAgICAgUnVuU3RhdHVzWyJTVEFUVVNfU1VDQ0VTUyJdID0gIlNUQVRVU19TVUNDRVNTIjsKICAgICAgICBSdW5TdGF0dXNbIlNUQVRVU19GQUlMVVJFIl0gPSAiU1RBVFVTX0ZBSUxVUkUiOwogICAgICAgIFJ1blN0YXR1c1siU1RBVFVTX1JVTk5JTkciXSA9ICJTVEFUVVNfUlVOTklORyI7CiAgICB9KShSdW5TdGF0dXMgfHwgKFJ1blN0YXR1cyA9IHt9KSk7CiAgICB2YXIgQmFja2VuZEhwYXJhbXNWYWx1ZVR5cGU7CiAgICAoZnVuY3Rpb24gKEJhY2tlbmRIcGFyYW1zVmFsdWVUeXBlKSB7CiAgICAgICAgQmFja2VuZEhwYXJhbXNWYWx1ZVR5cGVbIkRBVEFfVFlQRV9VTlNFVCJdID0gIkRBVEFfVFlQRV9VTlNFVCI7CiAgICAgICAgQmFja2VuZEhwYXJhbXNWYWx1ZVR5cGVbIkRBVEFfVFlQRV9TVFJJTkciXSA9ICJEQVRBX1RZUEVfU1RSSU5HIjsKICAgICAgICBCYWNrZW5kSHBhcmFtc1ZhbHVlVHlwZVsiREFUQV9UWVBFX0JPT0wiXSA9ICJEQVRBX1RZUEVfQk9PTCI7CiAgICAgICAgQmFja2VuZEhwYXJhbXNWYWx1ZVR5cGVbIkRBVEFfVFlQRV9GTE9BVDY0Il0gPSAiREFUQV9UWVBFX0ZMT0FUNjQiOwogICAgfSkoQmFja2VuZEhwYXJhbXNWYWx1ZVR5cGUgfHwgKEJhY2tlbmRIcGFyYW1zVmFsdWVUeXBlID0ge30pKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9ydW5zL2RhdGFfc291cmNlL3J1bnNfZGF0YV9zb3VyY2VfdHlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBEb21haW5UeXBlID0gewogICAgICAgIERJU0NSRVRFOiAwLAogICAgICAgIElOVEVSVkFMOiAxLAogICAgfTsKICAgIERvbWFpblR5cGVbRG9tYWluVHlwZS5ESVNDUkVURV0gPSAnRElTQ1JFVEUnOwogICAgRG9tYWluVHlwZVtEb21haW5UeXBlLklOVEVSVkFMXSA9ICdJTlRFUlZBTCc7CiAgICAvKioKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBSdW5zRGF0YVNvdXJjZSB7CiAgICB9CiAgICBSdW5zRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSwgYXJnczogW3sgcHJvdmlkZWRJbjogJ3Jvb3QnIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zRGF0YVNvdXJjZS7JtWZhYyA9IGZ1bmN0aW9uIFJ1bnNEYXRhU291cmNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNEYXRhU291cmNlKSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJ1bnNEYXRhU291cmNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFJ1bnNEYXRhU291cmNlLCBmYWN0b3J5OiBSdW5zRGF0YVNvdXJjZS7JtWZhYywgcHJvdmlkZWRJbjogJ3Jvb3QnIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBDb21iaW5lcyBocGFyYW1zIGFuZCBtZXRyaWNzIHNwZWMgZnJvbSBkaWZmZXJlbnQgZXhwZXJpbWVudHMuCiAgICAgKgogICAgICogRGlmZmVyZW50IGV4cGVyaW1lbnRzIGNhbiBiZSB0ZXN0aW5nIGh5cG90aGVzaXMgb24gZGlmZmVyZW50IHNldHMgb2YgaHBhcmFtcwogICAgICogYW5kIG1ldHJpY3MuIFRoaXMgdXRpbGl0eSBjb21iaW5lcyB0aGUgc3BlY3Mgd2hlbiBwb3NzaWJsZSBhbmQgdGhyb3dzCiAgICAgKiB2YWxpZGF0aW9uIGVycm9ycyB3aGVuIGtleSAoYG5hbWVgIGZvciBocGFyYW1zIGFuZCBgdGFnYCBmb3IgbWV0cmljcykgY29sbGlkZQogICAgICogd2l0aCBkaWZmZXJlbnQgc3BlY3MuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNvbWJpbmVIcGFyYW1BbmRNZXRyaWNTcGVjcyguLi5zcGVjcykgewogICAgICAgIGNvbnN0IGhwYXJhbXMgPSBuZXcgTWFwKCk7CiAgICAgICAgY29uc3QgaHBhcmFtRGlzcGxheU5hbWVzID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IG1ldHJpY3MgPSBuZXcgTWFwKCk7CiAgICAgICAgY29uc3QgbWV0cmljRGlzcGxheU5hbWVzID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IHZhbGlkYXRpb25FcnJvciA9IFtdOwogICAgICAgIGZvciAoY29uc3Qgc3BlYyBvZiBzcGVjcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IGhwYXJhbVNwZWMgb2Ygc3BlYy5ocGFyYW1zKSB7CiAgICAgICAgICAgICAgICBpZiAoIWhwYXJhbURpc3BsYXlOYW1lcy5oYXMoaHBhcmFtU3BlYy5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgIGhwYXJhbURpc3BsYXlOYW1lcy5zZXQoaHBhcmFtU3BlYy5uYW1lLCBuZXcgU2V0KCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaHBhcmFtRGlzcGxheU5hbWVzLmdldChocGFyYW1TcGVjLm5hbWUpLmFkZChocGFyYW1TcGVjLmRpc3BsYXlOYW1lKTsKICAgICAgICAgICAgICAgIGlmICghaHBhcmFtcy5oYXMoaHBhcmFtU3BlYy5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgIGhwYXJhbXMuc2V0KGhwYXJhbVNwZWMubmFtZSwgT2JqZWN0LmFzc2lnbih7fSwgaHBhcmFtU3BlYykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3BlY0EgPSBocGFyYW1zLmdldChocGFyYW1TcGVjLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwZWNCID0gaHBhcmFtU3BlYzsKICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY0EudHlwZSAhPT0gc3BlY0IudHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IucHVzaChgSHBhcmFtLCAke3NwZWNCLm5hbWV9LCB0eXBlcyBoYXZlIHRvIG1hdGNoLiBHb3Q6IGAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3BlY0EudHlwZX0gdnMuICR7c3BlY0IudHlwZX1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWNBLmRvbWFpbi50eXBlID09PSBEb21haW5UeXBlLklOVEVSVkFMICYmCiAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNCLmRvbWFpbi50eXBlID09PSBEb21haW5UeXBlLklOVEVSVkFMKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcGVjQS5kb21haW4ubWluVmFsdWUgIT09IHNwZWNCLmRvbWFpbi5taW5WYWx1ZSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY0EuZG9tYWluLm1heFZhbHVlICE9PSBzcGVjQi5kb21haW4ubWF4VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRpb25FcnJvci5wdXNoKGBIcGFyYW0sICR7c3BlY0IubmFtZX0sIGRvbWFpbnMgaGF2ZSB0byBtYXRjaC4gYCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdDogJHtzcGVjQS5kb21haW59IHZzLiAke3NwZWNCLmRvbWFpbn1gKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzcGVjQS5kb21haW4udHlwZSA9PT0gRG9tYWluVHlwZS5ESVNDUkVURSAmJgogICAgICAgICAgICAgICAgICAgICAgICBzcGVjQi5kb21haW4udHlwZSA9PT0gRG9tYWluVHlwZS5ESVNDUkVURSkgewogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZVNldCA9IG5ldyBTZXQoWwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4uc3BlY0EuZG9tYWluLnZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLnNwZWNCLmRvbWFpbi52YWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlY0EuZG9tYWluLnZhbHVlcy5sZW5ndGggIT09IHNwZWNCLmRvbWFpbi52YWx1ZXMubGVuZ3RoIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcGVjQS5kb21haW4udmFsdWVzLmxlbmd0aCAhPT0gdmFsdWVTZXQuc2l6ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbkVycm9yLnB1c2goYEhwYXJhbSwgJHtzcGVjQi5uYW1lfSwgZG9tYWlucyBoYXZlIHRvIG1hdGNoLiBgICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgR290OiAke3NwZWNBLmRvbWFpbn0gdnMuICR7c3BlY0IuZG9tYWlufWApOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IucHVzaChgSHBhcmFtLCAke3NwZWNCLm5hbWV9LCBkb21haW5zIGhhdmUgdG8gbWF0Y2guIGAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYEdvdDogJHtzcGVjQS5kb21haW59IHZzLiAke3NwZWNCLmRvbWFpbn1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCBtZXRyaWNTcGVjIG9mIHNwZWMubWV0cmljcykgewogICAgICAgICAgICAgICAgaWYgKCFtZXRyaWNEaXNwbGF5TmFtZXMuaGFzKG1ldHJpY1NwZWMudGFnKSkgewogICAgICAgICAgICAgICAgICAgIG1ldHJpY0Rpc3BsYXlOYW1lcy5zZXQobWV0cmljU3BlYy50YWcsIG5ldyBTZXQoKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBtZXRyaWNEaXNwbGF5TmFtZXMuZ2V0KG1ldHJpY1NwZWMudGFnKS5hZGQobWV0cmljU3BlYy5kaXNwbGF5TmFtZSk7CiAgICAgICAgICAgICAgICBpZiAoIW1ldHJpY3MuaGFzKG1ldHJpY1NwZWMudGFnKSkgewogICAgICAgICAgICAgICAgICAgIG1ldHJpY3Muc2V0KG1ldHJpY1NwZWMudGFnLCBPYmplY3QuYXNzaWduKHt9LCBtZXRyaWNTcGVjKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjQSA9IG1ldHJpY3MuZ2V0KG1ldHJpY1NwZWMudGFnKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjQiA9IG1ldHJpY1NwZWM7CiAgICAgICAgICAgICAgICAgICAgaWYgKHNwZWNBLmRhdGFzZXRUeXBlICE9PSBzcGVjQi5kYXRhc2V0VHlwZSkgewogICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0aW9uRXJyb3IucHVzaChgTWV0cmljLCAke3NwZWNCLnRhZ30sIGRhdGFzZXRUeXBlcyBoYXZlIHRvIG1hdGNoLiBHb3Q6IGAgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYCR7c3BlY0EuZGF0YXNldFR5cGV9IHZzLiAke3NwZWNCLmRhdGFzZXRUeXBlfWApOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAodmFsaWRhdGlvbkVycm9yLmxlbmd0aCkgewogICAgICAgICAgICAvLyBUT0RPKGIvMTU3NzMzMTc5KTogaGFuZGxlIHRoZSBlcnJvciBncmFjZWZ1bGx5IG9uIHRoZSB2aWV3IHNpZGUuCiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVmFsaWRhdGlvbiBlcnJvcjoKJHt2YWxpZGF0aW9uRXJyb3Iuam9pbignXG4nKX1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaHBhcmFtczogWy4uLmhwYXJhbXNdLm1hcCgoW2hwYXJhbU5hbWUsIHNwZWNdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzcGVjKSwgeyBkaXNwbGF5TmFtZTogWy4uLmhwYXJhbURpc3BsYXlOYW1lcy5nZXQoaHBhcmFtTmFtZSldLmpvaW4oJyBvciAnKSB9KTsKICAgICAgICAgICAgfSksCiAgICAgICAgICAgIG1ldHJpY3M6IFsuLi5tZXRyaWNzXS5tYXAoKFttZXRyaWNUYWcsIHNwZWNdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzcGVjKSwgeyBkaXNwbGF5TmFtZTogWy4uLm1ldHJpY0Rpc3BsYXlOYW1lcy5nZXQobWV0cmljVGFnKV0uam9pbignIG9yICcpIH0pOwogICAgICAgICAgICB9KSwKICAgICAgICB9OwogICAgfQoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBLZXkgdXNlZCB0byBuYW1lc3BhY2UgdGhlIGV4cGVyaW1lbnRzIHJlZHVjZXIuCiAgICAgKi8KICAgIGNvbnN0IFJVTlNfRkVBVFVSRV9LRVkgPSAncnVucyc7CiAgICAvKioKICAgICAqIFdoZW4gcnVucyBzZWxlY3RvciB3YXMgbmV2ZXIgbW9kaWZpZWQgYnkgdXNlciBhbmQgdGhlcmUgYXJlIGxlc3MgdGhhbiBvcgogICAgICogZXF1YWwgdG8gTUFYX05VTV9SVU5TX1RPX0VOQUJMRV9CWV9ERUZBVUxUIGluIGFuIGV4cGVyaW1lbnQsIHdlIGRlZmF1bHQKICAgICAqIHNlbGVjdCBhbGwgcnVucy4KICAgICAqLwogICAgY29uc3QgTUFYX05VTV9SVU5TX1RPX0VOQUJMRV9CWV9ERUZBVUxUID0gNDA7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBmdW5jdGlvbiBzZXJpYWxpemVFeHBlcmltZW50SWRzKGV4cGVyaW1lbnRJZHMpIHsKICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoZXhwZXJpbWVudElkcy5zbGljZSgpLnNvcnQoKSk7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBnZXRSdW5zU3RhdGUgPSBjcmVhdGVGZWF0dXJlU2VsZWN0b3IoUlVOU19GRUFUVVJFX0tFWSk7CiAgICBjb25zdCBnZXREYXRhU3RhdGUkMSA9IGNyZWF0ZVNlbGVjdG9yKGdldFJ1bnNTdGF0ZSwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmRhdGE7CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgcnVuIG9iamVjdC4KICAgICAqLwogICAgY29uc3QgZ2V0RXhwZXJpbWVudElkRm9yUnVuSWQgPSBjcmVhdGVTZWxlY3RvcihnZXREYXRhU3RhdGUkMSwgKHN0YXRlLCBwcm9wcykgPT4gewogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gKF9hID0gc3RhdGUucnVuSWRUb0V4cElkW3Byb3BzLnJ1bklkXSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogbnVsbDsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyBydW4gb2JqZWN0LgogICAgICovCiAgICBjb25zdCBnZXRSdW4gPSBjcmVhdGVTZWxlY3RvcihnZXREYXRhU3RhdGUkMSwgKHN0YXRlLCBwcm9wcykgPT4gewogICAgICAgIHZhciBfYTsKICAgICAgICByZXR1cm4gKF9hID0gc3RhdGUucnVuTWV0YWRhdGFbcHJvcHMucnVuSWRdKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBudWxsOwogICAgfSk7CiAgICAvKioKICAgICAqIFJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHJ1bnMgbGlzdCBmb3IgYW4gZXhwZXJpbWVudC4KICAgICAqLwogICAgY29uc3QgZ2V0UnVucyA9IGNyZWF0ZVNlbGVjdG9yKGdldERhdGFTdGF0ZSQxLCAoc3RhdGUsIHByb3BzKSA9PiB7CiAgICAgICAgY29uc3QgcnVuSWRzID0gc3RhdGUucnVuSWRzW3Byb3BzLmV4cGVyaW1lbnRJZF0gfHwgW107CiAgICAgICAgcmV0dXJuIHJ1bklkcwogICAgICAgICAgICAuZmlsdGVyKChpZCkgPT4gQm9vbGVhbihzdGF0ZS5ydW5NZXRhZGF0YVtpZF0pKQogICAgICAgICAgICAubWFwKChpZCkgPT4gc3RhdGUucnVuTWV0YWRhdGFbaWRdKTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyBsb2FkIHN0YXRlIG9mIHRoZSBydW5zIGxpc3QuCiAgICAgKi8KICAgIGNvbnN0IGdldFJ1bnNMb2FkU3RhdGUgPSBjcmVhdGVTZWxlY3RvcihnZXREYXRhU3RhdGUkMSwgKHN0YXRlLCBwcm9wcykgPT4gewogICAgICAgIHJldHVybiAoc3RhdGUucnVuc0xvYWRTdGF0ZVtwcm9wcy5leHBlcmltZW50SWRdIHx8IHsKICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBudWxsLAogICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgIH0pOwogICAgfSk7CiAgICAvKioKICAgICAqIGBzZWxlY3RIcGFyYW1BbmRNZXRyaWNTcGVjYCBpcyBtZWFudCBmb3IgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIHRoYXQKICAgICAqIGxldmVyYWdlcyB0aGUgbWVtb2l6YXRpb24uCiAgICAgKi8KICAgIGNvbnN0IHNlbGVjdEhwYXJhbUFuZE1ldHJpY1NwZWMgPSBjcmVhdGVTZWxlY3RvcihnZXREYXRhU3RhdGUkMSwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmhwYXJhbUFuZE1ldHJpY1NwZWM7CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgaHBhcmFtcyBhbmQgbWV0cmljcyBzcGVjcyBvZiBleHBlcmltZW50cy4KICAgICAqLwogICAgY29uc3QgZ2V0RXhwZXJpbWVudHNIcGFyYW1zQW5kTWV0cmljcyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEhwYXJhbUFuZE1ldHJpY1NwZWMsIChyZWNvcmQsIHByb3BzKSA9PiB7CiAgICAgICAgcmV0dXJuIGNvbWJpbmVIcGFyYW1BbmRNZXRyaWNTcGVjcyguLi5wcm9wcy5leHBlcmltZW50SWRzLm1hcCgoZWlkKSA9PiByZWNvcmRbZWlkXSkuZmlsdGVyKEJvb2xlYW4pKTsKICAgIH0pOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIE9ic2VydmFibGUgdGhhdCBlbWl0cyBzZWxlY3Rpb24gc3RhdGUgb2YgcnVucy4gSWYgdGhlIHJ1bnMgZm9yIHRoZQogICAgICogY3VycmVudCByb3V0ZSBhcmUgZGVzaXJlZCwgcGxlYXNlIHNlZSB1aV9zZWxlY3RvcnMudHMncwogICAgICogZ2V0Q3VycmVudFJvdXRlUnVuU2VsZWN0aW9uIGluc3RlYWQuCiAgICAgKi8KICAgIGNvbnN0IGdldFJ1blNlbGVjdGlvbk1hcCA9IGNyZWF0ZVNlbGVjdG9yKGdldERhdGFTdGF0ZSQxLCAoZGF0YVN0YXRlLCBwcm9wcykgPT4gewogICAgICAgIGNvbnN0IHN0YXRlS2V5ID0gc2VyaWFsaXplRXhwZXJpbWVudElkcyhwcm9wcy5leHBlcmltZW50SWRzKTsKICAgICAgICByZXR1cm4gZGF0YVN0YXRlLnNlbGVjdGlvblN0YXRlLmdldChzdGF0ZUtleSkgfHwgbmV3IE1hcCgpOwogICAgfSk7CiAgICBjb25zdCBnZXRVaVN0YXRlID0gY3JlYXRlU2VsZWN0b3IoZ2V0UnVuc1N0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUudWk7CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgcGFnaW5hdGlvbiBvcHRpb24gb24gdGhlIHJ1biBzZWxlY3Rvci4KICAgICAqLwogICAgY29uc3QgZ2V0UnVuU2VsZWN0b3JQYWdpbmF0aW9uT3B0aW9uID0gY3JlYXRlU2VsZWN0b3IoZ2V0VWlTdGF0ZSwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnBhZ2luYXRpb25PcHRpb247CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgcmVnZXggZmlsdGVyIG9uIHRoZSBydW4gc2VsZWN0b3IuCiAgICAgKi8KICAgIGNvbnN0IGdldFJ1blNlbGVjdG9yUmVnZXhGaWx0ZXIgPSBjcmVhdGVTZWxlY3RvcihnZXRVaVN0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUucmVnZXhGaWx0ZXI7CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgc29ydCBvcHRpb25zIG9uIHRoZSBydW4gc2VsZWN0b3IuCiAgICAgKi8KICAgIGNvbnN0IGdldFJ1blNlbGVjdG9yU29ydCA9IGNyZWF0ZVNlbGVjdG9yKGdldFVpU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5zb3J0OwogICAgfSk7CiAgICAvKioKICAgICAqIFJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIG1hcCBvZiBydW4gaWQgdG8gcnVuIGNvbG9yIChoZXgpLgogICAgICovCiAgICBjb25zdCBnZXRSdW5Db2xvck1hcCA9IGNyZWF0ZVNlbGVjdG9yKGdldFVpU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXAoWy4uLnN0YXRlLmRlZmF1bHRSdW5Db2xvciwgLi4uc3RhdGUucnVuQ29sb3JPdmVycmlkZV0pOwogICAgICAgIGNvbnN0IGNvbG9yT2JqZWN0ID0ge307CiAgICAgICAgbWFwLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHsKICAgICAgICAgICAgY29sb3JPYmplY3Rba2V5XSA9IHZhbHVlOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBjb2xvck9iamVjdDsKICAgIH0pOwogICAgLy8gQ2hlYXAgaWRlbnRpdHkgc2VsZWN0b3JzIHRvIHNraXAgcmVjb21wdXRpbmcgc2VsZWN0b3JzLgogICAgY29uc3QgZ2V0SHBhcmFtRGVmYXVsdEZpbHRlciA9IGNyZWF0ZVNlbGVjdG9yKGdldFVpU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5ocGFyYW1EZWZhdWx0RmlsdGVyczsKICAgIH0pOwogICAgY29uc3QgZ2V0SHBhcmFtRmlsdGVyID0gY3JlYXRlU2VsZWN0b3IoZ2V0VWlTdGF0ZSwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmhwYXJhbUZpbHRlcnM7CiAgICB9KTsKICAgIGNvbnN0IGdldE1ldHJpY0RlZmF1bHRGaWx0ZXIgPSBjcmVhdGVTZWxlY3RvcihnZXRVaVN0YXRlLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUubWV0cmljRGVmYXVsdEZpbHRlcnM7CiAgICB9KTsKICAgIGNvbnN0IGdldE1ldHJpY0ZpbHRlciA9IGNyZWF0ZVNlbGVjdG9yKGdldFVpU3RhdGUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5tZXRyaWNGaWx0ZXJzOwogICAgfSk7CiAgICAvKioKICAgICAqIFJldHVybnMgT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIG1hcCBvZiBocGFyYW0gbmFtZSB0byBmaWx0ZXIgdmFsdWVzLgogICAgICovCiAgICBjb25zdCBnZXRSdW5IcGFyYW1GaWx0ZXJNYXAgPSBjcmVhdGVTZWxlY3RvcihnZXRIcGFyYW1EZWZhdWx0RmlsdGVyLCBnZXRIcGFyYW1GaWx0ZXIsIChkZWZhdWx0RmlsdGVyTWFwLCBmaWx0ZXJNYXApID0+IHsKICAgICAgICByZXR1cm4gbmV3IE1hcChbLi4uZGVmYXVsdEZpbHRlck1hcCwgLi4uZmlsdGVyTWFwXSk7CiAgICB9KTsKICAgIC8qKgogICAgICogUmV0dXJucyBPYnNlcnZhYmxlIHRoYXQgZW1pdHMgbWFwIG9mIG1ldHJpYyB0YWcgdG8gZmlsdGVyIHZhbHVlcy4KICAgICAqLwogICAgY29uc3QgZ2V0UnVuTWV0cmljRmlsdGVyTWFwID0gY3JlYXRlU2VsZWN0b3IoZ2V0TWV0cmljRGVmYXVsdEZpbHRlciwgZ2V0TWV0cmljRmlsdGVyLCAoZGVmYXVsdEZpbHRlck1hcCwgZmlsdGVyTWFwKSA9PiB7CiAgICAgICAgcmV0dXJuIG5ldyBNYXAoWy4uLmRlZmF1bHRGaWx0ZXJNYXAsIC4uLmZpbHRlck1hcF0pOwogICAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIFNlbGVjdHMgdGhlIHJ1biBzZWxlY3Rpb24gKHJ1bklkIHRvIGJvb2xlYW4pIG9mIGN1cnJlbnQgcm91dGVJZC4KICAgICAqCiAgICAgKiBOb3RlIHRoYXQgZW1pdHMgbnVsbCB3aGVuIGN1cnJlbnQgcm91dGUgaXMgbm90IGFib3V0IGFuIGV4cGVyaW1lbnQuCiAgICAgKi8KICAgIGNvbnN0IGdldEN1cnJlbnRSb3V0ZVJ1blNlbGVjdGlvbiA9IGNyZWF0ZVNlbGVjdG9yKChzdGF0ZSkgPT4gewogICAgICAgIGNvbnN0IGV4cGVyaW1lbnRJZHMgPSBnZXRFeHBlcmltZW50SWRzRnJvbVJvdXRlKHN0YXRlKTsKICAgICAgICBpZiAoZXhwZXJpbWVudElkcyA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGdldFJ1blNlbGVjdGlvbk1hcChzdGF0ZSwgeyBleHBlcmltZW50SWRzIH0pOwogICAgfSwgKHJ1blNlbGVjdGlvbikgPT4gcnVuU2VsZWN0aW9uKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogVGhpcyByZWdleCBlc2NhcGUgY2hhcmFjdGVyIHNldCBpcyBhbHNvIHVzZWQgaW4gbG9kYXNoJ3MgYGVzY2FwZVJlZ0V4cGAuCiAgICAgKi8KICAgIGNvbnN0IFJFR0VYUF9FU0NBUEVfQ0hBUlMgPSAvW1xcXiQuKis/KClbXF17fXxdL2c7CiAgICAvKioKICAgICAqIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBmb3JtIHRoYXQgaGFzIGJlZW4gZXNjYXBlZCBmb3IgdXNlIGFzIGEgbGl0ZXJhbAogICAgICogYXJndW1lbnQgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24gY29uc3RydWN0b3IuCiAgICAgKgogICAgICogVGFrZXMgYSBzdHJpbmcgViBhbmQgZXNjYXBlcyBjaGFyYWN0ZXJzIHRvIHByb2R1Y2UgYSBuZXcgc3RyaW5nIEUsIHN1Y2ggdGhhdAogICAgICogbmV3IFJlZ0V4cChFKS50ZXN0KFYpID09PSB0cnVlLgogICAgICovCiAgICBmdW5jdGlvbiBlc2NhcGVGb3JSZWdleCh2YWx1ZSkgewogICAgICAgIC8vICckJicgaW4gYSByZWdleCByZXBsYWNlbWVudCBpbmRpY2F0ZXMgdGhlIGxhc3QgbWF0Y2guCiAgICAgICAgcmV0dXJuIHZhbHVlLnJlcGxhY2UoUkVHRVhQX0VTQ0FQRV9DSEFSUywgJ1xcJCYnKTsKICAgIH0KICAgIC8qKgogICAgICogUHJvY2Vzc2VzIHRleHQgZnJvbSBsZWZ0LXRvLXJpZ2h0LCBzcGxpdHRpbmcgaXQgaW50byBwaWVjZXMgYmFzZWQgb24gdGhlCiAgICAgKiByZWdleC4gRWFjaCBwaWVjZSBpcyBlaXRoZXIgYW4gdW5tYXRjaGVkIG9yIGEgbWF0Y2hlZCBzdWJzdHJpbmcuCiAgICAgKgogICAgICogRm9yIGV4YW1wbGUsCiAgICAgKiBzcGxpdEJ5UmVnZXgoImEgaW5wdXQxIGIgaW5wdXQyIGMgaW5wdXQzIiwgL2lucHV0XGQvKQogICAgICogcmV0dXJucwogICAgICogWwogICAgICogICAge2luZGV4OiAwLCAgbWF0Y2hlc1JlZ2V4OiBmYWxzZSwgdGV4dDogImEgIn0sCiAgICAgKiAgICB7aW5kZXg6IDIsICBtYXRjaGVzUmVnZXg6IHRydWUsICB0ZXh0OiAiaW5wdXQxIn0sCiAgICAgKiAgICB7aW5kZXg6IDgsICBtYXRjaGVzUmVnZXg6IGZhbHNlLCB0ZXh0OiAiIGIgIn0sCiAgICAgKiAgICB7aW5kZXg6IDExLCBtYXRjaGVzUmVnZXg6IHRydWUsICB0ZXh0OiAiaW5wdXQyIn0sCiAgICAgKiAgICB7aW5kZXg6IDE3LCBtYXRjaGVzUmVnZXg6IGZhbHNlLCB0ZXh0OiAiIGMgIn0sCiAgICAgKiAgICB7aW5kZXg6IDIwLCBtYXRjaGVzUmVnZXg6IHRydWUsICB0ZXh0OiAiaW5wdXQzIn0sCiAgICAgKiBdCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNwbGl0QnlSZWdleCh0ZXh0LCByZWdleCkgewogICAgICAgIC8vICdtYXRjaEFsbCcgcmVxdWlyZXMgYSByZWdleCB3aXRoIHRoZSAnZ2xvYmFsJyBmbGFnLgogICAgICAgIGlmICghcmVnZXguZmxhZ3MuaW5jbHVkZXMoJ2cnKSkgewogICAgICAgICAgICByZWdleCA9IG5ldyBSZWdFeHAocmVnZXgsIHJlZ2V4LmZsYWdzICsgJ2cnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgLy8gSW5kZXggb2YgdGhlIGVhcmxpZXN0IHVudmlzaXRlZCBjaGFyYWN0ZXIuCiAgICAgICAgbGV0IGxhc3RJbmRleCA9IDA7CiAgICAgICAgZm9yIChjb25zdCBtYXRjaCBvZiB0ZXh0Lm1hdGNoQWxsKHJlZ2V4KSkgewogICAgICAgICAgICBjb25zdCBpbmRleCA9IG1hdGNoLmluZGV4OwogICAgICAgICAgICBjb25zdCBtYXRjaGluZ1RleHQgPSBtYXRjaFswXTsKICAgICAgICAgICAgLy8gQWRkIGFueSB0ZXh0IGJldHdlZW4gdGhlIGxhc3QgbWF0Y2ggYW5kIHRoaXMgY3VycmVudCBvbmUuCiAgICAgICAgICAgIGlmIChpbmRleCA+IGxhc3RJbmRleCkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goewogICAgICAgICAgICAgICAgICAgIGluZGV4OiBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgdGV4dDogdGV4dC5zdWJzdHJpbmcobGFzdEluZGV4LCBpbmRleCksCiAgICAgICAgICAgICAgICAgICAgbWF0Y2hlc1JlZ2V4OiBmYWxzZSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsKICAgICAgICAgICAgICAgIGluZGV4LAogICAgICAgICAgICAgICAgdGV4dDogbWF0Y2hpbmdUZXh0LAogICAgICAgICAgICAgICAgbWF0Y2hlc1JlZ2V4OiB0cnVlLAogICAgICAgICAgICB9KTsKICAgICAgICAgICAgbGFzdEluZGV4ID0gaW5kZXggKyBtYXRjaGluZ1RleHQubGVuZ3RoOwogICAgICAgIH0KICAgICAgICAvLyBBZGQgdGhlIHJlbWFpbmluZyB0ZXh0IHBpZWNlLCBpZiBhbnkuCiAgICAgICAgaWYgKHRleHQubGVuZ3RoID4gbGFzdEluZGV4KSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKHsKICAgICAgICAgICAgICAgIGluZGV4OiBsYXN0SW5kZXgsCiAgICAgICAgICAgICAgICB0ZXh0OiB0ZXh0LnN1YnN0cmluZyhsYXN0SW5kZXgsIHRleHQubGVuZ3RoKSwKICAgICAgICAgICAgICAgIG1hdGNoZXNSZWdleDogZmFsc2UsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgfQogICAgLy8gQmFzZWQgb24KICAgIC8vIGh0dHBzOi8vY3MuY2hyb21pdW0ub3JnL2Nocm9taXVtL3NyYy90aGlyZF9wYXJ0eS9kZXZ0b29scy1mcm9udGVuZC9zcmMvZnJvbnRfZW5kL2NvbnNvbGUvQ29uc29sZVZpZXdNZXNzYWdlLmpzP3E9bGlua3N0cmluZ3JlZ2V4CiAgICBjb25zdCBVUkxfQ09OVFJPTF9DT0RFUyA9ICdcXHUwMDAwLVxcdTAwMjBcXHUwMDdmLVxcdTAwOWYnOwogICAgY29uc3QgTElOS0lGWV9VUkxfUkVHRVggPSBuZXcgUmVnRXhwKCcoPzpbYS16QS1aXVthLXpBLVowLTkrLi1dezIsfTpcXC9cXC98ZGF0YTp8d3d3XFwuKVteXFxzJyArCiAgICAgICAgVVJMX0NPTlRST0xfQ09ERVMgKwogICAgICAgICciXXsyLH1bXlxccycgKwogICAgICAgIFVSTF9DT05UUk9MX0NPREVTICsKICAgICAgICAnIlwnKX1cXF0sOjsuIT9dJywgJ2d1Jyk7CiAgICAvKioKICAgICAqIFNwbGl0cyB0aGUgc3RyaW5nIGludG8gcGllY2VzIHRoYXQgYXJlIFVSTHMgYW5kIG5vbi1VUkxzIGZvciBsaW5raWZpY2F0aW9uLgogICAgICogSW52YWxpZCBsaW5rcyAoZS5nLiAnamF2YXNjcmlwdDonKSBhcmUgbm90IGxpbmtpZmllZC4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSwKICAgICAqIHNwbGl0QnlVUkwoInZpc2l0IGh0dHA6Ly9leGFtcGxlLmNvbSB0b2RheSIpCiAgICAgKiBSZXR1cm5zCiAgICAgKiBbCiAgICAgKiAgIHtpc1VybDogZmFsc2UsIHRleHQ6ICJ2aXNpdCAifSwKICAgICAqICAge2lzVXJsOiB0cnVlLCAgdGV4dDogImh0dHA6Ly9leGFtcGxlLmNvbSJ9LAogICAgICogICB7aXNVcmw6IGZhbHNlLCB0ZXh0OiAiIHRvZGF5In0sCiAgICAgKiBdCiAgICAgKi8KICAgIGZ1bmN0aW9uIHNwbGl0QnlVUkwodGV4dCkgewogICAgICAgIHJldHVybiBzcGxpdEJ5UmVnZXgodGV4dCwgTElOS0lGWV9VUkxfUkVHRVgpLm1hcCgoeyBtYXRjaGVzUmVnZXgsIHRleHQgfSkgPT4gewogICAgICAgICAgICByZXR1cm4geyBpc1VSTDogbWF0Y2hlc1JlZ2V4LCB0ZXh0IH07CiAgICAgICAgfSk7CiAgICB9CgogICAgdmFyIEkxOE5fMDsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgQSBidXR0b24gdG8gY2xvc2UgdGhlIHNuYWNrYmFyIG1lc3NhZ2UKICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzE1MzYwODc1MTk3NDM3MDczNjIkJFRFTlNPUkJPQVJEX1dFQkFQUF9BTEVSVF9WSUVXU19BTEVSVF9ESVNQTEFZX1NOQUNLQkFSX0NPTlRBSU5FUl9UU18xID0gZ29vZy5nZXRNc2coIkRpc21pc3MiKTsKICAgICAgICBJMThOXzAgPSBNU0dfRVhURVJOQUxfMTUzNjA4NzUxOTc0MzcwNzM2MiQkVEVOU09SQk9BUkRfV0VCQVBQX0FMRVJUX1ZJRVdTX0FMRVJUX0RJU1BMQVlfU05BQ0tCQVJfQ09OVEFJTkVSX1RTXzE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzAgPSAkbG9jYWxpemUgYDpBIGJ1dHRvbiB0byBjbG9zZSB0aGUgc25hY2tiYXIgbWVzc2FnZeKQn2VhNGQ5ZmU2MTQyMGEzZmNlODFjZjU0YzRjNjE1ZTNjMTljNjQ2YTbikJ8xNTM2MDg3NTE5NzQzNzA3MzYyOkRpc21pc3NgOwogICAgfQogICAgY29uc3QgX2MyJDUgPSBbImFyaWEtbGFiZWwiLCBJMThOXzBdOwogICAgZnVuY3Rpb24gQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXJfbmdfY29udGFpbmVyXzFfbmdfY29udGFpbmVyXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgwKTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgcGllY2VfcjIgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBwaWVjZV9yMi50ZXh0LCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lcl9uZ19jb250YWluZXJfMV9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImEiLCA3KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgcGllY2VfcjIgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoImhyZWYiLCBwaWVjZV9yMi50ZXh0LCDJtcm1c2FuaXRpemVVcmwpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUocGllY2VfcjIudGV4dCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyX25nX2NvbnRhaW5lcl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyX25nX2NvbnRhaW5lcl8xX25nX2NvbnRhaW5lcl8xX1RlbXBsYXRlLCAyLCAxLCAibmctY29udGFpbmVyIiwgNSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyX25nX2NvbnRhaW5lcl8xX25nX3RlbXBsYXRlXzJfVGVtcGxhdGUsIDIsIDIsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDYsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IHBpZWNlX3IyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBfcjQgPSDJtcm1cmVmZXJlbmNlKDMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFwaWVjZV9yMi5pc1VSTCkoIm5nSWZFbHNlIiwgX3I0KTsKICAgIH0gfQogICAgZnVuY3Rpb24gQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXJfYnV0dG9uXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I5ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYnV0dG9uIiwgOCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyX2J1dHRvbl8zX1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I5KTsgY29uc3QgY3R4X3I4ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjgub25BY3Rpb25CdXR0b25DbGlja2VkKCk7IH0pOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yMS5hbGVydC5mb2xsb3d1cEFjdGlvbi5sb2NhbGl6ZWRMYWJlbCwgIiAiKTsKICAgIH0gfQogICAgY2xhc3MgQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc25hY2tCYXJSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHVua25vd25EYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHNuYWNrQmFyUmVmLCB1bmtub3duRGF0YSwgc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zbmFja0JhclJlZiA9IHNuYWNrQmFyUmVmOwogICAgICAgICAgICB0aGlzLnVua25vd25EYXRhID0gdW5rbm93bkRhdGE7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5zcGxpdEJ5VVJMID0gc3BsaXRCeVVSTDsKICAgICAgICAgICAgdGhpcy5hbGVydCA9ICgvKiogQHR5cGUgez99ICovICh1bmtub3duRGF0YSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQWN0aW9uQnV0dG9uQ2xpY2tlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgICAgIHRoaXMuc25hY2tCYXJSZWYuZGlzbWlzcygpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZm9sbG93dXBBY3Rpb24gPSB5aWVsZCAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5hbGVydC5mb2xsb3d1cEFjdGlvbikpLmdldEZvbGxvd3VwQWN0aW9uKHRoaXMuc3RvcmUpOwogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChmb2xsb3d1cEFjdGlvbik7CiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ2xvc2VCdXR0b25DbGlja2VkKCkgewogICAgICAgICAgICB0aGlzLnNuYWNrQmFyUmVmLmRpc21pc3MoKTsKICAgICAgICB9CiAgICB9CiAgICBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnYWxlcnQtZGlzcGxheS1zbmFja2JhcicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2FsZXJ0X2Rpc3BsYXlfc25hY2tiYXJfY29udGFpbmVyLm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2FsZXJ0X2Rpc3BsYXlfc25hY2tiYXJfY29udGFpbmVyLmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IE1hdFNuYWNrQmFyUmVmIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9TTkFDS19CQVJfREFUQSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0U25hY2tCYXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9TTkFDS19CQVJfREFUQSksIMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJhbGVydC1kaXNwbGF5LXNuYWNrYmFyIl1dLCBkZWNsczogNywgdmFyczogMiwgY29uc3RzOiBbWzEsICJtZXNzYWdlIl0sIFs0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMSwgImNvbnRyb2xzIl0sIFsibWF0LWJ1dHRvbiIsICIiLCAiY2xhc3MiLCAiZm9sbG93dXAtYnV0dG9uIiwgMywgImNsaWNrIiwgNCwgIm5nSWYiXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDEsICJkaXNtaXNzLWJ1dHRvbiIsIDMsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImxpbmtQaWVjZSIsICIiXSwgWyJyZWwiLCAibm9yZWZlcnJlciBub29wZW5lciIsICJ0YXJnZXQiLCAiX2JsYW5rIiwgMywgImhyZWYiXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDEsICJmb2xsb3d1cC1idXR0b24iLCAzLCAiY2xpY2siXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lcl9uZ19jb250YWluZXJfMV9UZW1wbGF0ZSwgNCwgMiwgIm5nLWNvbnRhaW5lciIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDMsIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyX2J1dHRvbl8zX1RlbXBsYXRlLCAyLCAxLCAiYnV0dG9uIiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImJ1dHRvbiIsIDQpOwogICAgICAgICAgICDJtcm1aTE4bkF0dHJpYnV0ZXMoNSwgX2MyJDUpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXJfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzRfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25DbG9zZUJ1dHRvbkNsaWNrZWQoKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDYsICIgRGlzbWlzcyAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5zcGxpdEJ5VVJMKGN0eC5hbGVydC5sb2NhbGl6ZWRNZXNzYWdlKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguYWxlcnQuZm9sbG93dXBBY3Rpb24pOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nRm9yT2YsIE5nSWYsIE1hdEJ1dHRvbl0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LXdyYXA6d3JhcH0ubWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7YWxpZ24tc2VsZjpjZW50ZXI7bWFyZ2luOjVweCAwO3dvcmQtYnJlYWs6YnJlYWstd29yZH0ubWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV0gICBhW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO21hcmdpbi1sZWZ0OmF1dG99YnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2V9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hbGVydC92aWV3cy9hbGVydF9zbmFja2Jhcl9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBSZW5kZXJzIGFsZXJ0cyBpbiBhICdzbmFja2JhcicgdG8gaW5kaWNhdGUgdGhlbSB0byB0aGUgdXNlci4KICAgICAqLwogICAgY2xhc3MgQWxlcnRTbmFja2JhckNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gc25hY2tCYXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSwgc25hY2tCYXIpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLnNuYWNrQmFyID0gc25hY2tCYXI7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUKICAgICAgICAgICAgICAgIC5zZWxlY3QoZ2V0TGF0ZXN0QWxlcnQpCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbGVydAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGFsZXJ0KSA9PiBCb29sZWFuKGFsZXJ0KSkpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWxlcnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhbGVydCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zaG93QWxlcnQoKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0KSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gYWxlcnRJbmZvCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzaG93QWxlcnQoYWxlcnRJbmZvKSB7CiAgICAgICAgICAgIHRoaXMuc25hY2tCYXIub3BlbkZyb21Db21wb25lbnQoQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXIsIHsKICAgICAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAwLAogICAgICAgICAgICAgICAgaG9yaXpvbnRhbFBvc2l0aW9uOiAnc3RhcnQnLAogICAgICAgICAgICAgICAgdmVydGljYWxQb3NpdGlvbjogJ2JvdHRvbScsCiAgICAgICAgICAgICAgICBkYXRhOiBhbGVydEluZm8sCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgIH0KICAgIEFsZXJ0U25hY2tiYXJDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2FsZXJ0LXNuYWNrYmFyJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJycsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEFsZXJ0U25hY2tiYXJDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogTWF0U25hY2tCYXIgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydFNuYWNrYmFyQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gQWxlcnRTbmFja2JhckNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbGVydFNuYWNrYmFyQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSwgybXJtWRpcmVjdGl2ZUluamVjdChNYXRTbmFja0JhcikpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0U25hY2tiYXJDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQWxlcnRTbmFja2JhckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJhbGVydC1zbmFja2JhciJdXSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBBbGVydFNuYWNrYmFyQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgfSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2RlZXBsaW5rL2hhc2gudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvLyBUT0RPKHRlbnNvcmJvYXJkLXRlYW0pOiBtZXJnZSB0aGlzIG1vZHVsZSB3aXRoIHRmX3N0b3JhZ2Uvc3RvcmFnZS50cyB3aGVuCiAgICAvLyB0Zl90c19saWJyYXJ5IGNhbiBiZSByZWZlcmVuY2VkIGJ5IHRmX3dlYl9saWJyYXJ5LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVEFCJDEgPSAnX190YWJfXyc7CiAgICBjbGFzcyBIYXNoRGVlcExpbmtlciB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMudGZTdG9yYWdlID0gKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RmLXN0b3JhZ2UnKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRmR2xvYmFscyA9ICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd0Zi1nbG9iYWxzJykpKTsKICAgICAgICAgICAgLy8gTm90ZTogYG1pZ3JhdGVMZWdhY3lVUkxTY2hlbWUoKWAgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGBzZXRVc2VIYXNoYCwgc28KICAgICAgICAgICAgLy8gdGhhdCB0ZlN0b3JhZ2UgcmVhZHMgZnJvbSB0aGUgYWN0dWFsIFVSTCwgbm90IHRoZSBmYWtlIGhhc2ggZm9yIHRlc3RzCiAgICAgICAgICAgIC8vIG9ubHkuCiAgICAgICAgICAgIHRmR2xvYmFscy50Zl9nbG9iYWxzLnNldFVzZUhhc2godHJ1ZSk7CiAgICAgICAgICAgIHRoaXMudGZTdG9yYWdlLnRmX3N0b3JhZ2UubWlncmF0ZUxlZ2FjeVVSTFNjaGVtZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0U3RyaW5nKGtleSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy50ZlN0b3JhZ2UudGZfc3RvcmFnZS5nZXRTdHJpbmcoa2V5KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0U3RyaW5nKGtleSwgdmFsdWUsIG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy50ZlN0b3JhZ2UudGZfc3RvcmFnZS5zZXRTdHJpbmcoa2V5LCB2YWx1ZSwgb3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UGx1Z2luSWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmdldFN0cmluZyhUQUIkMSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2luSWQKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRQbHVnaW5JZChwbHVnaW5JZCwgb3B0aW9ucykgewogICAgICAgICAgICB0aGlzLnNldFN0cmluZyhUQUIkMSwgcGx1Z2luSWQsIG9wdGlvbnMpOwogICAgICAgIH0KICAgIH0KICAgIEhhc2hEZWVwTGlua2VyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBIYXNoRGVlcExpbmtlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFtdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEhhc2hEZWVwTGlua2VyLsm1ZmFjID0gZnVuY3Rpb24gSGFzaERlZXBMaW5rZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFzaERlZXBMaW5rZXIpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGFzaERlZXBMaW5rZXIuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogSGFzaERlZXBMaW5rZXIsIGZhY3Rvcnk6IEhhc2hEZWVwTGlua2VyLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvdmlld3MvaGFzaF9zdG9yYWdlX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IENoYW5nZWRQcm9wID0gewogICAgICAgIEFDVElWRV9QTFVHSU46IDAsCiAgICB9OwogICAgQ2hhbmdlZFByb3BbQ2hhbmdlZFByb3AuQUNUSVZFX1BMVUdJTl0gPSAnQUNUSVZFX1BMVUdJTic7CiAgICBjbGFzcyBIYXNoU3RvcmFnZUNvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWVwTGlua2VyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZGVlcExpbmtlcikgewogICAgICAgICAgICB0aGlzLmRlZXBMaW5rZXIgPSBkZWVwTGlua2VyOwogICAgICAgICAgICB0aGlzLm9uSGFzaENoYW5nZSA9IHRoaXMub25IYXNoQ2hhbmdlZEltcGwuYmluZCh0aGlzKTsKICAgICAgICAgICAgdGhpcy5vblZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25IYXNoQ2hhbmdlZEltcGwoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWN0aXZlUGx1Z2luSWQgPSB0aGlzLmRlZXBMaW5rZXIuZ2V0UGx1Z2luSWQoKTsKICAgICAgICAgICAgaWYgKGFjdGl2ZVBsdWdpbklkICE9PSB0aGlzLmFjdGl2ZVBsdWdpbklkKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uVmFsdWVDaGFuZ2UuZW1pdCh7CiAgICAgICAgICAgICAgICAgICAgcHJvcDogQ2hhbmdlZFByb3AuQUNUSVZFX1BMVUdJTiwKICAgICAgICAgICAgICAgICAgICB2YWx1ZTogYWN0aXZlUGx1Z2luSWQsCiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICAvLyBDYW5ub3QgdXNlIHRoZSB0Zl9zdG9yYWdlIGhhc2ggbGlzdGVuZXIgYmVjYXVzZSBpdCBiaW5kcyB0byBldmVudCBiZWZvcmUgdGhlCiAgICAgICAgICAgIC8vIHpvbmUuanMgcGF0Y2guIEFjY29yZGluZyB0byBbMV0sIHpvbmUuanMgcGF0Y2hlcyB2YXJpb3VzIGFzeW5jaHJvbm9zIGNhbGxzIGFuZAogICAgICAgICAgICAvLyBldmVudCBsaXN0ZW5lcnMgdG8gZGV0ZWN0ICJjaGFuZ2VzIiBhbmQgbWFyayBjb21wb25lbnRzIGFzIGRpcnR5IGZvciByZS1yZW5kZXIuCiAgICAgICAgICAgIC8vIFdoZW4gdXNpbmcgdGZfc3RvcmFnZSBoYXNoIGxpc3RlbmVyLCBpdCBjYXVzZXMgYmFkIHJlbmRlcnMgaW4gQW5ndWxhciBkdWUgdG8KICAgICAgICAgICAgLy8gbWlzc2luZyBkaXJ0aW5lc3MgZGV0ZWN0aW9uLgogICAgICAgICAgICAvLyBbMV06IGh0dHBzOi8vYmxvZy5hbmd1bGFyLXVuaXZlcnNpdHkuaW8vaG93LWRvZXMtYW5ndWxhci0yLWNoYW5nZS1kZXRlY3Rpb24tcmVhbGx5LXdvcmsvCiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdoYXNoY2hhbmdlJywgdGhpcy5vbkhhc2hDaGFuZ2UpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignaGFzaGNoYW5nZScsIHRoaXMub25IYXNoQ2hhbmdlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmIChjaGFuZ2VzWydhY3RpdmVQbHVnaW5JZCddKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBhY3RpdmVQbHVnaW5JZENoYW5nZSA9IGNoYW5nZXNbJ2FjdGl2ZVBsdWdpbklkJ107CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvcHRpb24gPSB7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlOiAnJywKICAgICAgICAgICAgICAgICAgICB1c2VMb2NhdGlvblJlcGxhY2U6IGFjdGl2ZVBsdWdpbklkQ2hhbmdlLnByZXZpb3VzVmFsdWUgPT09IG51bGwgfHwKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGx1Z2luSWRDaGFuZ2UuZmlyc3RDaGFuZ2UsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBhY3RpdmVQbHVnaW5JZENoYW5nZS5jdXJyZW50VmFsdWUgPT09IG51bGwKICAgICAgICAgICAgICAgICAgICA/ICcnCiAgICAgICAgICAgICAgICAgICAgOiBhY3RpdmVQbHVnaW5JZENoYW5nZS5jdXJyZW50VmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmRlZXBMaW5rZXIuc2V0UGx1Z2luSWQodmFsdWUsIG9wdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBIYXNoU3RvcmFnZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnaGFzaC1zdG9yYWdlLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICcnLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBIYXNoU3RvcmFnZUNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEhhc2hEZWVwTGlua2VyIH0KICAgIF07CiAgICBIYXNoU3RvcmFnZUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBhY3RpdmVQbHVnaW5JZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25WYWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEhhc2hTdG9yYWdlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gSGFzaFN0b3JhZ2VDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFzaFN0b3JhZ2VDb21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoSGFzaERlZXBMaW5rZXIpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIYXNoU3RvcmFnZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBIYXNoU3RvcmFnZUNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJoYXNoLXN0b3JhZ2UtY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgYWN0aXZlUGx1Z2luSWQ6ICJhY3RpdmVQbHVnaW5JZCIgfSwgb3V0cHV0czogeyBvblZhbHVlQ2hhbmdlOiAib25WYWx1ZUNoYW5nZSIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBIYXNoU3RvcmFnZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IH0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3ZpZXdzL2hhc2hfc3RvcmFnZV9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSGFzaFN0b3JhZ2VDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlUGx1Z2luSWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRBY3RpdmVQbHVnaW4pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVmFsdWVDaGFuZ2VkKGNoYW5nZSkgewogICAgICAgICAgICBzd2l0Y2ggKGNoYW5nZS5wcm9wKSB7CiAgICAgICAgICAgICAgICBjYXNlIENoYW5nZWRQcm9wLkFDVElWRV9QTFVHSU46CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChwbHVnaW5VcmxIYXNoQ2hhbmdlZCh7IHBsdWdpbjogY2hhbmdlLnZhbHVlIH0pKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEhhc2hTdG9yYWdlQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdoYXNoLXN0b3JhZ2UnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8aGFzaC1zdG9yYWdlLWNvbXBvbmVudAogICAgICBbYWN0aXZlUGx1Z2luSWRdPSJhY3RpdmVQbHVnaW5JZCQgfCBhc3luYyIKICAgICAgKG9uVmFsdWVDaGFuZ2UpPSJvblZhbHVlQ2hhbmdlZCgkZXZlbnQpIgogICAgPgogICAgPC9oYXNoLXN0b3JhZ2UtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgSGFzaFN0b3JhZ2VDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEhhc2hTdG9yYWdlQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gSGFzaFN0b3JhZ2VDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGFzaFN0b3JhZ2VDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIYXNoU3RvcmFnZUNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBIYXNoU3RvcmFnZUNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJoYXNoLXN0b3JhZ2UiXV0sIGRlY2xzOiAyLCB2YXJzOiAzLCBjb25zdHM6IFtbMywgImFjdGl2ZVBsdWdpbklkIiwgIm9uVmFsdWVDaGFuZ2UiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBIYXNoU3RvcmFnZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiaGFzaC1zdG9yYWdlLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uVmFsdWVDaGFuZ2UiLCBmdW5jdGlvbiBIYXNoU3RvcmFnZUNvbnRhaW5lcl9UZW1wbGF0ZV9oYXNoX3N0b3JhZ2VfY29tcG9uZW50X29uVmFsdWVDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblZhbHVlQ2hhbmdlZCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiYWN0aXZlUGx1Z2luSWQiLCDJtcm1cGlwZUJpbmQxKDEsIDEsIGN0eC5hY3RpdmVQbHVnaW5JZCQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtIYXNoU3RvcmFnZUNvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBub25lO1xuICAgICAgfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvY29yZS92aWV3cy9wYWdlX3RpdGxlX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBQYWdlVGl0bGVDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICBpZiAoY2hhbmdlc1sndGl0bGUnXSkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQudGl0bGUgPSBjaGFuZ2VzWyd0aXRsZSddLmN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFBhZ2VUaXRsZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAncGFnZS10aXRsZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiAnJywKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFBhZ2VUaXRsZUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICB0aXRsZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFnZVRpdGxlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gUGFnZVRpdGxlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBhZ2VUaXRsZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQYWdlVGl0bGVDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUGFnZVRpdGxlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInBhZ2UtdGl0bGUtY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgdGl0bGU6ICJ0aXRsZSIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBQYWdlVGl0bGVDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyB9LCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvY29yZS92aWV3cy9wYWdlX3RpdGxlX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBQYWdlVGl0bGVDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMudGl0bGUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRFbnZpcm9ubWVudCksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW52CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZW52KSA9PiBlbnYud2luZG93X3RpdGxlIHx8ICdUZW5zb3JCb2FyZCcpKSwgCiAgICAgICAgICAgIC8vIChpdCdzIGFuIGVtcHR5IHN0cmluZyB3aGVuIHRoZSBgLS13aW5kb3dfdGl0bGVgIGZsYWcgaXMgbm90IHNldCkKICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSk7CiAgICAgICAgfQogICAgfQogICAgUGFnZVRpdGxlQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwYWdlLXRpdGxlJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHBhZ2UtdGl0bGUtY29tcG9uZW50IFt0aXRsZV09InRpdGxlJCB8IGFzeW5jIj48L3BhZ2UtdGl0bGUtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IG5vbmU7CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUGFnZVRpdGxlQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQYWdlVGl0bGVDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBQYWdlVGl0bGVDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGFnZVRpdGxlQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFnZVRpdGxlQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFBhZ2VUaXRsZUNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJwYWdlLXRpdGxlIl1dLCBkZWNsczogMiwgdmFyczogMywgY29uc3RzOiBbWzMsICJ0aXRsZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBhZ2VUaXRsZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInBhZ2UtdGl0bGUtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInRpdGxlIiwgybXJtXBpcGVCaW5kMSgxLCAxLCBjdHgudGl0bGUkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbUGFnZVRpdGxlQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IG5vbmU7XG4gICAgICB9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9zZXR0aW5ncy9wb2x5bWVyX2ludGVyb3BfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogU2V0dGluZ3NQb2x5bWVySW50ZXJvcCBpcyBhIHRlbXBvcmFyeSBpbnRlcm9wIG1vZHVsZSB0aGF0IHdyaXRlcyBzZXR0aW5ncyBpbgogICAgICogTmdyeCBzdG9yZSB0byBQb2x5bWVyLWJhc2VkIFRlbnNvckJvYXJkIGNvbXBvbmVudHMuIEFzIGxvbmcgYXMgVGVuc29yQm9hcmQKICAgICAqIHJlbmRlcnMgUG9seW1lciBjb21wb25lbnRzLCB0aGlzIG1vZHVsZSBzaG91bGQgYmUgdXNlZC4KICAgICAqCiAgICAgKiBOT1RFOiB0aGVyZSBhcmUgdHdvIGNsYXNzZXMgb2Ygc2V0dGluZ3MgaW4gdGhlIFBvbHltZXIgbGFuZDogKDEpIG9uZXMKICAgICAqIHBlcnNpc3RlZCBpbiBVUkwgYW5kICgyKSBvbmVzIHN0b3JlZCBpbiBKYXZhU2NyaXB0LiBUaGlzIG1vZHVsZSBpbnRlcm9wcyB3aXRoCiAgICAgKiBvbmx5ICgyKSBraW5kcy4gRm9yICgxKSwgcGxlYXNlIHJlZmVyIHRvIHRoZSBoYXNoX3N0b3JhZ2UuCiAgICAgKi8KICAgIGNsYXNzIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIHRoaXMuZ2V0UGFnZVNpemUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRQYWdlU2l6ZSkpOwogICAgICAgICAgICB0aGlzLnBhZ2luYXRlZFZpZXdTdG9yZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtcGFnaW5hdGVkLXZpZXctc3RvcmUnKSkpKS50Zl9wYWdpbmF0ZWRfdmlldzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5nZXRQYWdlU2l6ZSQKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGFnZVNpemUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYWdlU2l6ZSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5wYWdpbmF0ZWRWaWV3U3RvcmUuc2V0TGltaXQocGFnZVNpemUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgIH0KICAgIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3NldHRpbmdzLXBvbHltZXItaW50ZXJvcCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICcnLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInNldHRpbmdzLXBvbHltZXItaW50ZXJvcCJdXSwgZGVjbHM6IDAsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgfSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQXBwQ29udGFpbmVyIHsKICAgICAgICAvLyB2Y1JlZiBpcyByZXF1aXJlZCBieSBuZ3gtY29sb3ItcGlja2VyIGluIG9yZGVyIGZvciBpdCB0byBwbGFjZSB0aGUgcG9wdXAKICAgICAgICAvLyBpbiB0aGUgcm9vdCBub2RlIGluIGEgbW9kYWwgbW9kZS4KICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vemVmb3kvbmd4LWNvbG9yLXBpY2tlci9ibG9iLzk0YTdjODYyYmI2MWQ3MjA3ZjIxMjgxNTI2ZmNkOTQ0NTMyMTliNTQvcHJvamVjdHMvbGliL3NyYy9saWIvY29sb3ItcGlja2VyLmRpcmVjdGl2ZS50cyNMMTY4LUwxNzUKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICogQHBhcmFtIHs/fSB2Y1JlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlLCB2Y1JlZikgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMudmNSZWYgPSB2Y1JlZjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChjb3JlTG9hZGVkKCkpOwogICAgICAgIH0KICAgIH0KICAgIEFwcENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGItd2ViYXBwJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vYXBwX2NvbnRhaW5lci5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9hcHBfY29udGFpbmVyLmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBcHBDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFwcENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEFwcENvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBcHBDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBcHBDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQXBwQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRiLXdlYmFwcCJdXSwgZGVjbHM6IDgsIHZhcnM6IDAsIGNvbnN0czogW1sibWFpbiIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBBcHBDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJhcHAtaGVhZGVyIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgIm1haW4iLCBudWxsLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMywgInJvdXRlci1vdXRsZXQiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNCwgImFsZXJ0LXNuYWNrYmFyIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDUsICJoYXNoLXN0b3JhZ2UiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNiwgInBhZ2UtdGl0bGUiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNywgInNldHRpbmdzLXBvbHltZXItaW50ZXJvcCIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0hlYWRlckNvbXBvbmVudCwgUm91dGVyT3V0bGV0Q29udGFpbmVyLCBBbGVydFNuYWNrYmFyQ29udGFpbmVyLCBIYXNoU3RvcmFnZUNvbnRhaW5lciwgUGFnZVRpdGxlQ29udGFpbmVyLCBTZXR0aW5nc1BvbHltZXJJbnRlcm9wQ29udGFpbmVyXSwgc3R5bGVzOiBbImh0bWxbX25nY29udGVudC0lQ09NUCVdLCBib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG8sIHNhbnMtc2VyaWY7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luOiAwO1xuICBwYWRkaW5nOiAwO1xufVxuXG5bX25naG9zdC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZDogI2Y1ZjVmNTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5hcHAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJveC1zaGFkb3c6IDAgMXB4IDNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjI1KTtcbiAgZmxleDogMCAwO1xuICB6LWluZGV4OiAxOyBcbn1cblxubWFpbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmbGV4LWdyb3c6IDE7XG4gIG92ZXJmbG93OiBhdXRvO1xufSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9yb3V0aW5nL2xvY2F0aW9uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHV0aWxzID0gewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0SHJlZigpIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5ocmVmOwogICAgICAgIH0sCiAgICB9OwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IG5hdk9yUm91dGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzTmF2aWdhdGlvbihuYXZPclJvdXRlKSB7CiAgICAgICAgcmV0dXJuIChuYXZPclJvdXRlLmhhc093blByb3BlcnR5KCdwYXRobmFtZScpICYmCiAgICAgICAgICAgICFuYXZPclJvdXRlLmhhc093blByb3BlcnR5KCdxdWVyeVBhcmFtcycpKTsKICAgIH0KICAgIGNsYXNzIExvY2F0aW9uJDEgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0SHJlZigpIHsKICAgICAgICAgICAgcmV0dXJuIHV0aWxzLmdldEhyZWYoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRTZWFyY2goKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZXJpYWxpemFibGVTZWFyY2hQYXJhbXMgPSBbXTsKICAgICAgICAgICAgLy8gVVJMU2VhcmNoUGFyYW1zIGlzIGEgSXRlcmFibGUgYnV0IFR5cGVTY3JpcHQgZG9lcyBub3Qga25vdyBhYm91dCB0aGF0LgogICAgICAgICAgICBzZWFyY2hQYXJhbXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBrZXkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZSwga2V5KSA9PiB7CiAgICAgICAgICAgICAgICBzZXJpYWxpemFibGVTZWFyY2hQYXJhbXMucHVzaCh7IGtleSwgdmFsdWUgfSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgcmV0dXJuIHNlcmlhbGl6YWJsZVNlYXJjaFBhcmFtczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRIYXNoKCkgewogICAgICAgICAgICByZXR1cm4gd2luZG93LmxvY2F0aW9uLmhhc2g7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UGF0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXBsYWNlU3RhdGUocGF0aCkgewogICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5yZXBsYWNlU3RhdGUobnVsbCwgJycsIHBhdGgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHBhdGgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHB1c2hTdGF0ZShwYXRoKSB7CiAgICAgICAgICAgIHdpbmRvdy5oaXN0b3J5LnB1c2hTdGF0ZShudWxsLCAnJywgcGF0aCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Qb3BTdGF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGZyb21FdmVudCh3aW5kb3csICdwb3BzdGF0ZScpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU6IHRoaXMuZ2V0UGF0aCgpLAogICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLmdldFNlYXJjaCgpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWxhdGl2ZVBhdGgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFJlc29sdmVkUGF0aChyZWxhdGl2ZVBhdGgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHJlbGF0aXZlUGF0aCwgdXRpbHMuZ2V0SHJlZigpKTsKICAgICAgICAgICAgcmV0dXJuIHVybC5wYXRobmFtZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByb3V0ZUxpa2UKICAgICAgICAgKiBAcGFyYW0gez89fSBzaG91bGRQcmVzZXJ2ZUhhc2gKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEZ1bGxQYXRoRnJvbVJvdXRlT3JOYXYocm91dGVMaWtlLCBzaG91bGRQcmVzZXJ2ZUhhc2gpIHsKICAgICAgICAgICAgLy8gVE9ETyhzdGVwaGFud2xlZSk6IHN1cHBvcnQgaGFzaGVzIGluIHRoZSByb3V0ZUxpa2UuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGF0aG5hbWUgPSB0aGlzLmdldFJlc29sdmVkUGF0aChyb3V0ZUxpa2UucGF0aG5hbWUpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzZWFyY2ggPSAnJzsKICAgICAgICAgICAgaWYgKCFpc05hdmlnYXRpb24ocm91dGVMaWtlKSAmJiByb3V0ZUxpa2UucXVlcnlQYXJhbXMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBzZWFyY2ggPQogICAgICAgICAgICAgICAgICAgICc/JyArCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZVVSTFNlYXJjaFBhcmFtc0Zyb21TZXJpYWxpemFibGVRdWVyeVBhcmFtcyhyb3V0ZUxpa2UucXVlcnlQYXJhbXMpLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoYXNoID0gc2hvdWxkUHJlc2VydmVIYXNoID8gdGhpcy5nZXRIYXNoKCkgOiAnJzsKICAgICAgICAgICAgcmV0dXJuIGAke3BhdGhuYW1lfSR7c2VhcmNofSR7aGFzaH1gOwogICAgICAgIH0KICAgIH0KICAgIExvY2F0aW9uJDEuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTG9jYXRpb24kMS7JtWZhYyA9IGZ1bmN0aW9uIExvY2F0aW9uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExvY2F0aW9uJDEpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTG9jYXRpb24kMS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBMb2NhdGlvbiQxLCBmYWN0b3J5OiBMb2NhdGlvbiQxLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9yb3V0aW5nL2FwcF9yb290LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFwcFJvb3RQcm92aWRlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2NhdGlvbgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGxvY2F0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuYXBwUm9vdCA9IHRoaXMuZ2V0QXBwUm9vdEZyb21NZXRhRWxlbWVudChsb2NhdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIGFwcFJvb3QgcGF0aCBzdGFydHMgd2l0aCBgL2AgYW5kIGFsd2F5cyBlbmQgd2l0aCBgL2AuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGxvY2F0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRBcHBSb290RnJvbU1ldGFFbGVtZW50KGxvY2F0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0YUVsID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcignaGVhZCBtZXRhW25hbWU9InRiLXJlbGF0aXZlLXJvb3QiXScpOwogICAgICAgICAgICBpZiAoIW1ldGFFbCkKICAgICAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgICAgIGNvbnN0IHsgcGF0aG5hbWUgfSA9IG5ldyBVUkwoKCgvKiogQHR5cGUgez99ICovIChtZXRhRWwpKSkuY29udGVudCwgbG9jYXRpb24uZ2V0SHJlZigpKTsKICAgICAgICAgICAgcmV0dXJuIHBhdGhuYW1lLnJlcGxhY2UoL1wvKiQvLCAnLycpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGFjdHVhbCBmdWxsIHBhdGhuYW1lIHRoYXQgaW5jbHVkZXMgcGF0aCBwcmVmaXggb2YgdGhlIGFwcGxpY2F0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gYWJzUGF0aG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QoYWJzUGF0aG5hbWUpIHsKICAgICAgICAgICAgLy8gYXBwUm9vdCBoYXMgdHJhaWxpbmcgJy8nLiBSZW1vdmUgb25lIHNvIHdlIGRvbid0IGhhdmUgIi8vIi4KICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwUm9vdC5zbGljZSgwLCAtMSkgKyBhYnNQYXRobmFtZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhYnNQYXRobmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0QXBwUm9vdGxlc3NQYXRobmFtZShhYnNQYXRobmFtZSkgewogICAgICAgICAgICBpZiAoYWJzUGF0aG5hbWUuc3RhcnRzV2l0aCh0aGlzLmFwcFJvb3QpKSB7CiAgICAgICAgICAgICAgICAvLyBhcHBSb290IGVuZHMgd2l0aCAiLyIgYW5kIHdlIG5lZWQgdGhlIHRyaW1tZWQgcGF0aG5hbWUgdG8gc3RhcnQgd2l0aCAiLyIgc2luY2UKICAgICAgICAgICAgICAgIC8vIHJvdXRlcyBhcmUgZGVmaW5lZCB3aXRoIHN0YXJ0aW5nICIvIi4KICAgICAgICAgICAgICAgIHJldHVybiAnLycgKyBhYnNQYXRobmFtZS5zbGljZSh0aGlzLmFwcFJvb3QubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gYWJzUGF0aG5hbWU7CiAgICAgICAgfQogICAgfQogICAgQXBwUm9vdFByb3ZpZGVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBcHBSb290UHJvdmlkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBMb2NhdGlvbiQxIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQXBwUm9vdFByb3ZpZGVyLsm1ZmFjID0gZnVuY3Rpb24gQXBwUm9vdFByb3ZpZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFwcFJvb3RQcm92aWRlcikoybXJtWluamVjdChMb2NhdGlvbiQxKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQXBwUm9vdFByb3ZpZGVyLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEFwcFJvb3RQcm92aWRlciwgZmFjdG9yeTogQXBwUm9vdFByb3ZpZGVyLsm1ZmFjIH0pOwogICAgY2xhc3MgVGVzdGFibGVBcHBSb290UHJvdmlkZXIgZXh0ZW5kcyBBcHBSb290UHJvdmlkZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0QXBwUm9vdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXBwUm9vdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhcHBSb290CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRBcHBSb290KGFwcFJvb3QpIHsKICAgICAgICAgICAgdGhpcy5hcHBSb290ID0gYXBwUm9vdDsKICAgICAgICB9CiAgICB9CiAgICBUZXN0YWJsZUFwcFJvb3RQcm92aWRlci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZXN0YWJsZUFwcFJvb3RQcm92aWRlci7JtWZhYyA9IGZ1bmN0aW9uIFRlc3RhYmxlQXBwUm9vdFByb3ZpZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gybVUZXN0YWJsZUFwcFJvb3RQcm92aWRlcl9CYXNlRmFjdG9yeSh0IHx8IFRlc3RhYmxlQXBwUm9vdFByb3ZpZGVyKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZXN0YWJsZUFwcFJvb3RQcm92aWRlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUZXN0YWJsZUFwcFJvb3RQcm92aWRlciwgZmFjdG9yeTogVGVzdGFibGVBcHBSb290UHJvdmlkZXIuybVmYWMgfSk7CiAgICBjb25zdCDJtVRlc3RhYmxlQXBwUm9vdFByb3ZpZGVyX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoVGVzdGFibGVBcHBSb290UHJvdmlkZXIpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBDcmVhdGVkIHdoZW4gcm91dGVyIHJlaHlkcmF0ZXMgc3RhdGUgZnJvbSB0aGUgVVJMIGFmdGVyIGEgYnJvd3NlciBpbml0aWF0ZWQKICAgICAqIGV2ZW50LiBQbGVhc2UgZG8gbm90ZSB0aGF0IHRoZSBhY3Rpb24gaXMgZmlyZWQgYmVmb3JlIGBuYXZpZ2F0ZWRgIHNvIG1ha2UKICAgICAqIHN1cmUgdGhlIHZpZXcgY2FuIGhhbmRsZSBpbmNvbnNpc3RlbnQgc3RhdGUgcmlnaHQgYmVmb3JlIGEgbmF2aWdhdGlvbi4KICAgICAqLwogICAgY29uc3Qgc3RhdGVSZWh5ZHJhdGVkRnJvbVVybCA9IGNyZWF0ZUFjdGlvbignW0FwcCBSb3V0aW5nXSBTdGF0ZSBSZWh5ZHJhdGVkIEZyb20gVXJsJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIENyZWF0ZWQgd2hlbiB1c2VyIGludGVuZHMgdG8gbmF2aWdhdGUgaW4gdGhlIGFwcGxpY2F0aW9uCiAgICAgKi8KICAgIGNvbnN0IG5hdmlnYXRpb25SZXF1ZXN0ZWQgPSBjcmVhdGVBY3Rpb24oJ1tBcHAgUm91dGluZ10gSW4gQXBwIE5hdmlnYXRpb24gUmVxdWVzdGVkJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIENyZWF0ZWQgYWZ0ZXIgYSByb3V0ZSBpcyBtYXRjaGVkIGJ1dCBiZWZvcmUgbmF2aWdhdGVkLgogICAgICovCiAgICBjb25zdCBuYXZpZ2F0aW5nID0gY3JlYXRlQWN0aW9uKCdbQXBwIFJvdXRpbmddIEluIEFwcCBOYXZpZ2F0aW5nJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIENyZWF0ZWQgYWZ0ZXIgbmF2aWdhdGlvbiBpcyBzdWNjZXNzZnVsLgogICAgICovCiAgICBjb25zdCBuYXZpZ2F0ZWQgPSBjcmVhdGVBY3Rpb24oJ1tBcHAgUm91dGluZ10gSW4gQXBwIE5hdmlnYXRlZCcsIHByb3BzKCkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9yb3V0aW5nL3Byb2dyYW1tYXRpY2FsX25hdmlnYXRpb25fdHlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgTkFWSUdBVElPTl9QUk9WSURFUiA9IG5ldyBJbmplY3Rpb25Ub2tlbignW0FwcCBSb3V0aW5nXSBQcm9ncmFtbWF0aWNhbCBOYXZpZ2F0aW9uIFByb3ZpZGVyJyk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYXBwX3JvdXRpbmcvcHJvZ3JhbW1hdGljYWxfbmF2aWdhdGlvbl9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uTW9kdWxlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHByb3ZpZGVycykgewogICAgICAgICAgICB0aGlzLnByb3ZpZGVycyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgZm9yIChjb25zdCBwcm92aWRlciBvZiBwcm92aWRlcnMgfHwgW10pIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnByb3ZpZGVycy5oYXMocHJvdmlkZXIuYWN0aW9uQ3JlYXRvci50eXBlKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAiJHtwcm92aWRlci5hY3Rpb25DcmVhdG9yLnR5cGV9IiBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIG5hdi5gICsKICAgICAgICAgICAgICAgICAgICAgICAgJyBNdWx0aXBsZSBuYXZpZ2F0aW9ucyBvbiBzYW1lIGtpY2sgaXMgbm90IGFsbG93ZWQuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQocHJvdmlkZXIuYWN0aW9uQ3JlYXRvci50eXBlLCBwcm92aWRlci5sYW1iZGEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXROYXZpZ2F0aW9uKGFjdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxhbWJkYSA9IHRoaXMucHJvdmlkZXJzLmdldChhY3Rpb24udHlwZSk7CiAgICAgICAgICAgIGlmICghbGFtYmRhKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbGFtYmRhKGFjdGlvbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFuIE5nTW9kdWxlIHRoYXQgcHJvdmlkZXMgcHJvZ3JhbW1tYXRpYyBuYXZpZ2F0aW9uIHJvdXRpbmVzLgogICAgICAgICAqIE9uIGFuIGFjdGlvbiBzdWJzY3JpYmVkIGZpcmUsIGl0IGludm9rZXMgYSBuYXZpZ2F0aW9uLgogICAgICAgICAqCiAgICAgICAgICogV0FSTjogaW50ZXJuYWxseSwgaXQgaXMgaW1wbGVtZW50ZWQgd2l0aCBOZ3J4IGNvbXBvc2l0ZSBhY3Rpb25zIHNvIHRoZXJlCiAgICAgICAgICogbWF5IGJlIGEgdGltaW5nIGlzc3VlLiBNaXRpZ2F0ZSB0aGUgaXNzdWUgYnkgYWNjb3VudCBmb3IgcG90ZW50aWFsIGRhdGEKICAgICAgICAgKiBpbmNvbnNpc3RlbmN5IGlzc3VlIGluIHRoZSBjb250YWluZXIuCiAgICAgICAgICoKICAgICAgICAgKiBmdW5jdGlvbiBwcm92aWRlcigpIHsKICAgICAgICAgKiAgIHJldHVybiB7CiAgICAgICAgICogICAgIGFjdGlvbkNyZWF0b3I6IHNvbWV0aGluZ0hhcHBlbmVkLAogICAgICAgICAqICAgICBsYW1iZGE6IChhY3Rpb246IHR5cGVvZiBzb21ldGhpbmdIYXBwZW5lZCkgPT4gewogICAgICAgICAqICAgICAgIHJldHVybiB7cm91dGVLaW5kOiBSb3V0ZUtpbmQuRVhQRVJJTUVOVCwgcm91dGVQYXJhbXM6IHt9fTsKICAgICAgICAgKiAgICAgfSwKICAgICAgICAgKiAgIH07CiAgICAgICAgICogfQogICAgICAgICAqCiAgICAgICAgICogXEBOZ01vZHVsZSh7CiAgICAgICAgICogICBpbXBvcnRzOiBbCiAgICAgICAgICogICAgIFJvdXRlUmVnaXN0cnlNb2R1bGUucmVnaXN0ZXJQcm9ncmFtbWF0aWNhbE5hdmlnYXRpb24ocHJvdmlkZXIpLAogICAgICAgICAqICAgICBSb3V0ZVJlZ2lzdHJ5TW9kdWxlLnJlZ2lzdGVyUHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uKGFub3RoZXJQcm92aWRlciksCiAgICAgICAgICogICBdLAogICAgICAgICAqIH0pCiAgICAgICAgICogQHRlbXBsYXRlIEFDLCBVCiAgICAgICAgICogQHBhcmFtIHs/fSBwcm92aWRlckZhY3RvcnkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0YXRpYyByZWdpc3RlclByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbihwcm92aWRlckZhY3RvcnkpIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG5nTW9kdWxlOiBQcm9ncmFtbWF0aWNhbE5hdmlnYXRpb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHByb3ZpZGU6IE5BVklHQVRJT05fUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBwcm92aWRlckZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgUHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3t9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbk1vZHVsZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEFycmF5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW05BVklHQVRJT05fUFJPVklERVIsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbk1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQcm9ncmFtbWF0aWNhbE5hdmlnYXRpb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBQcm9ncmFtbWF0aWNhbE5hdmlnYXRpb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uTW9kdWxlKSjJtcm1aW5qZWN0KE5BVklHQVRJT05fUFJPVklERVIsIDgpKTsgfSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hcHBfcm91dGluZy9lZmZlY3RzL2FwcF9yb3V0aW5nX2VmZmVjdHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdEFjdGlvbiA9IGNyZWF0ZUFjdGlvbignW0FwcCBSb3V0aW5nXSBFZmZlY3RzIEluaXQnKTsKICAgIGNsYXNzIEFwcFJvdXRpbmdFZmZlY3RzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IHJlZ2lzdHJ5CiAgICAgICAgICogQHBhcmFtIHs/fSBwcm9ncmFtbWF0aWNhbE5hdk1vZHVsZQogICAgICAgICAqIEBwYXJhbSB7P30gYXBwUm9vdFByb3ZpZGVyCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYWN0aW9ucyQsIHN0b3JlLCBsb2NhdGlvbiwgcmVnaXN0cnksIHByb2dyYW1tYXRpY2FsTmF2TW9kdWxlLCBhcHBSb290UHJvdmlkZXIpIHsKICAgICAgICAgICAgdGhpcy5hY3Rpb25zJCA9IGFjdGlvbnMkOwogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgICAgdGhpcy5wcm9ncmFtbWF0aWNhbE5hdk1vZHVsZSA9IHByb2dyYW1tYXRpY2FsTmF2TW9kdWxlOwogICAgICAgICAgICB0aGlzLmFwcFJvb3RQcm92aWRlciA9IGFwcFJvb3RQcm92aWRlcjsKICAgICAgICAgICAgdGhpcy5vbk5hdmlnYXRpb25SZXF1ZXN0ZWQkID0gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShuYXZpZ2F0aW9uUmVxdWVzdGVkKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYXZpZ2F0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobmF2aWdhdGlvbikgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWRQYXRobmFtZSA9IG5hdmlnYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnLycpCiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmFwcFJvb3RQcm92aWRlci5nZXRBYnNQYXRobmFtZVdpdGhBcHBSb290KG5hdmlnYXRpb24ucGF0aG5hbWUpCiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLmxvY2F0aW9uLmdldFJlc29sdmVkUGF0aChuYXZpZ2F0aW9uLnBhdGhuYW1lKTsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5hdmlnYXRpb24pLCB7IHBhdGhuYW1lOiByZXNvbHZlZFBhdGhuYW1lIH0pOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLm9uSW5pdCQgPSB0aGlzLmFjdGlvbnMkCiAgICAgICAgICAgICAgICAucGlwZShvZlR5cGUoaW5pdEFjdGlvbikpCiAgICAgICAgICAgICAgICAucGlwZShkZWxheSgwKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU6IHRoaXMubG9jYXRpb24uZ2V0UGF0aCgpLAogICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpLAogICAgICAgICAgICAgICAgICAgIHJlcGxhY2VTdGF0ZTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICBicm93c2VySW5pdGlhdGVkOiB0cnVlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIElucHV0IG9ic2VydmFibGUgbXVzdCBoYXZlIGFic29sdXRlIHBhdGhuYW1lIHdpdGgsIHdoZW4gYXBwUm9vdCBpcyBwcmVzZW50LAogICAgICAgICAgICAgKiBhcHBSb290IHByZWZpeGVkIChlLmcuLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUpLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy51c2VySW5pdE5hdlJvdXRlJCA9IG1lcmdlKHRoaXMub25OYXZpZ2F0aW9uUmVxdWVzdGVkJCwgdGhpcy5vbkluaXQkLCB0aGlzLmxvY2F0aW9uLm9uUG9wU3RhdGUoKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmF2aWdhdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5hdmlnYXRpb24pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcGF0aG5hbWU6IG5hdmlnYXRpb24ucGF0aG5hbWUsCiAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVN0YXRlOiBuYXZpZ2F0aW9uLnJlcGxhY2VTdGF0ZSwKICAgICAgICAgICAgICAgICAgICBicm93c2VySW5pdGlhdGVkOiB0cnVlLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpKSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hdmlnYXRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChuYXZpZ2F0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBFeHBlY3QgdG8gaGF2ZSBhYnNvbHV0ZSBuYXZpZ2F0aW9uIGhlcmUuCiAgICAgICAgICAgICAgICBpZiAoIW5hdmlnYXRpb24ucGF0aG5hbWUuc3RhcnRzV2l0aCgnLycpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBbQXBwIHJvdXRpbmddIHBhdGhuYW1lIG11c3Qgc3RhcnQgd2l0aCAnLycuIEdvdDogJHtuYXZpZ2F0aW9uLnBhdGhuYW1lfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgbmF2aWdhdGlvbiksIHsgcGF0aG5hbWU6IHRoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFwcFJvb3RsZXNzUGF0aG5hbWUobmF2aWdhdGlvbi5wYXRobmFtZSkgfSk7CiAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBuYXZpZ2F0aW9uV2l0aEFic29sdXRlUGF0aAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5hdmlnYXRpb25XaXRoQWJzb2x1dGVQYXRoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZU1hdGNoID0gdGhpcy5yb3V0ZUNvbmZpZ3MKICAgICAgICAgICAgICAgICAgICA/IHRoaXMucm91dGVDb25maWdzLm1hdGNoKG5hdmlnYXRpb25XaXRoQWJzb2x1dGVQYXRoKQogICAgICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcm91dGVNYXRjaCwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlcGxhY2VTdGF0ZTogbmF2aWdhdGlvbldpdGhBYnNvbHV0ZVBhdGgucmVwbGFjZVN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICBicm93c2VySW5pdGlhdGVkOiBuYXZpZ2F0aW9uV2l0aEFic29sdXRlUGF0aC5icm93c2VySW5pdGlhdGVkLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnByb2dyYW1tdGljYWxOYXZSb3V0ZSQgPSB0aGlzLmFjdGlvbnMkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhY3Rpb24pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnByb2dyYW1tYXRpY2FsTmF2TW9kdWxlLmdldE5hdmlnYXRpb24oYWN0aW9uKTsKICAgICAgICAgICAgfSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG5hdgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG5hdikgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIG5hdiAhPT0gbnVsbDsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHByb2dyYW1tYXRpY2FsTmF2aWdhdGlvbikgPT4gewogICAgICAgICAgICAgICAgY29uc3QgeyByb3V0ZUtpbmQsIHJvdXRlUGFyYW1zIH0gPSAoLyoqIEB0eXBlIHs/fSAqLyAocHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCByb3V0ZU1hdGNoID0gdGhpcy5yb3V0ZUNvbmZpZ3MKICAgICAgICAgICAgICAgICAgICA/IHRoaXMucm91dGVDb25maWdzLm1hdGNoQnlSb3V0ZUtpbmQocm91dGVLaW5kLCByb3V0ZVBhcmFtcykKICAgICAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHJvdXRlTWF0Y2gsCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uczogewogICAgICAgICAgICAgICAgICAgICAgICByZXBsYWNlU3RhdGU6IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICBicm93c2VySW5pdGlhdGVkOiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy52YWxpZGF0ZWRSb3V0ZSQgPSBtZXJnZSh0aGlzLnVzZXJJbml0TmF2Um91dGUkLCB0aGlzLnByb2dyYW1tdGljYWxOYXZSb3V0ZSQpLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IHJvdXRlTWF0Y2ggfSkgPT4gQm9vbGVhbihyb3V0ZU1hdGNoKSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJvdXRlTWF0Y2hBbmRPcHRpb25zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocm91dGVNYXRjaEFuZE9wdGlvbnMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcm91dGVNYXRjaDogKC8qKiBAdHlwZSB7P30gKi8gKHJvdXRlTWF0Y2hBbmRPcHRpb25zLnJvdXRlTWF0Y2gpKSwKICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiByb3V0ZU1hdGNoQW5kT3B0aW9ucy5vcHRpb25zLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEBleHBvcnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZmlyZU5hdmlnYXRlZElmVmFsaWRSb3V0ZSQgPSBjcmVhdGVFZmZlY3QoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsaWRhdGVkUm91dGUkLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoeyByb3V0ZU1hdGNoLCBvcHRpb25zIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy5icm93c2VySW5pdGlhdGVkICYmIHJvdXRlTWF0Y2guZGVlcExpbmtQcm92aWRlcikgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlaHlkcmF0aW5nU3RhdGUgPSByb3V0ZU1hdGNoLmRlZXBMaW5rUHJvdmlkZXIuZGVzZXJpYWxpemVRdWVyeVBhcmFtcyh0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzdGF0ZVJlaHlkcmF0ZWRGcm9tVXJsKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlS2luZDogcm91dGVNYXRjaC5yb3V0ZUtpbmQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsU3RhdGU6IHJlaHlkcmF0aW5nU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHsgcm91dGVNYXRjaCwgb3B0aW9ucyB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXZpZ2F0aW9uT3B0aW9ucyA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZVN0YXRlOiAoX2EgPSBvcHRpb25zLnJlcGxhY2VTdGF0ZSkgIT09IG51bGwgJiYgX2EgIT09IHZvaWQgMCA/IF9hIDogZmFsc2UsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3Qgcm91dGVPYnNlcnZhYmxlV2l0aG91dFF1ZXJ5ID0gb2YoewogICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUtpbmQ6IHJvdXRlTWF0Y2gucm91dGVLaW5kLAogICAgICAgICAgICAgICAgICAgICAgICBwYXJhbXM6IHJvdXRlTWF0Y2gucGFyYW1zLAogICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTogcm91dGVNYXRjaC5wYXRobmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXM6IFtdLAogICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uT3B0aW9ucywKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVNYXRjaC5kZWVwTGlua1Byb3ZpZGVyID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZU9ic2VydmFibGVXaXRob3V0UXVlcnk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAocm91dGVNYXRjaAogICAgICAgICAgICAgICAgICAgICAgICAuZGVlcExpbmtQcm92aWRlcikpLnNlcmlhbGl6ZVN0YXRlVG9RdWVyeVBhcmFtcyh0aGlzLnN0b3JlKQogICAgICAgICAgICAgICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcXVlcnlQYXJhbXMKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAocXVlcnlQYXJhbXMsIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZUtpbmQ6IHJvdXRlTWF0Y2gucm91dGVLaW5kLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zOiByb3V0ZU1hdGNoLnBhcmFtcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGhuYW1lOiByb3V0ZU1hdGNoLnBhdGhuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVlcnlQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXZpZ2F0aW9uT3B0aW9uczogaW5kZXggPT09IDAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG5hdmlnYXRpb25PcHRpb25zCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5hdmlnYXRpb25PcHRpb25zKSwgeyByZXBsYWNlU3RhdGU6IHRydWUgfSksCiAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm91dGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChyb3V0ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIGIvMTYwMTg1MDM5OiBBbGxvd3MgdGhlIHJvdXRlIHN0b3JlICsgcm91dGVyIG91dGxldCB0byBjaGFuZ2UKICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgdGhlIHJvdXRlIGNoYW5nZSBzbyBhbGwgY29tcG9uZW50cyBkbyBub3QgaGF2ZSB0bwogICAgICAgICAgICAgICAgICAgIC8vIHNhZmVndWFyZCBhZ2FpbnN0IHRoZSBjYXNlIHdoZW4gYHJvdXRlSWRgIChyb3V0ZUtpbmQgYW5kCiAgICAgICAgICAgICAgICAgICAgLy8gcm91dGVQYXJhbXMpIGRvIG5vdCBoYXZlIHVuZXhwZWN0ZWQgdmFsdWVzLiBCZWNhdXNlIHdlCiAgICAgICAgICAgICAgICAgICAgLy8gZGVib3VuY2VUaW1lLCB0ZWNobmljYWxseSwgaXQgZG9lcyBub3QgZmlyZSB0d28gYWN0aW9ucwogICAgICAgICAgICAgICAgICAgIC8vIHNlcXVlbnRpYWxseS4KICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5hdmlnYXRpbmcoeyBhZnRlcjogcm91dGUgfSkpOwogICAgICAgICAgICAgICAgfSkpLCAKICAgICAgICAgICAgICAgIC8vIExldCB0aGUgcm91dGVyLW91dGxldCBmbHVzaCB0aGUgY2hhbmdlIGluIGEgbWljcm90YXNrLgogICAgICAgICAgICAgICAgZGVib3VuY2VUaW1lKDApLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSb3V0ZSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChbcm91dGUsIG9sZFJvdXRlXSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBuYXZpZ2F0ZWQoeyBiZWZvcmU6IG9sZFJvdXRlLCBhZnRlcjogcm91dGUgfSk7CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFRPRE8oc3RlcGhhbndsZWUpOiBtb3ZlIHRoaXMgdG8gYSAidmlldyIuCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNoYW5nZUJyb3dzZXJVcmwkID0gY3JlYXRlRWZmZWN0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKG5hdmlnYXRlZCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJvdXRlKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKFssIHJvdXRlXSkgPT4gQm9vbGVhbihyb3V0ZSkpKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoW25hdmlnYXRlZEFjdGlvbiwgcm91dGVdKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gVGhlIFVSTCBoYXNoIGNhbiBiZSBzZXQgdmlhIEhhc2hTdG9yYWdlQ29tcG9uZW50ICh3aGljaCB1c2VzCiAgICAgICAgICAgICAgICAgICAgLy8gUG9seW1lcidzIHRmLXN0b3JhZ2UpLiBEZWVwTGlua1Byb3ZpZGVycyBhbHNvIG1vZGlmeSB0aGUgVVJMIHdoZW4KICAgICAgICAgICAgICAgICAgICAvLyBhIHByb3ZpZGVyJ3Mgc2VyaWFsaXplU3RhdGVUb1F1ZXJ5UGFyYW1zKCkgZW1pdHMuIFRoZXNlIHJlc3VsdCBpbgogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBVUkwgdXBkYXRlZCB3aXRob3V0IHRoZSBwcmV2aW91cyBoYXNoLiBIYXNoU3RvcmFnZUNvbXBvbmVudAogICAgICAgICAgICAgICAgICAgIC8vIG1ha2VzIG5vIGF0dGVtcHQgdG8gcmVzdG9yZSB0aGUgaGFzaCwgc28gaXQgaXMgZHJvcHBlZC4KICAgICAgICAgICAgICAgICAgICAvLyBUaGUgVVJMIGhhc2ggY2FuIGJlIHNldCB2aWEgSGFzaFN0b3JhZ2VDb21wb25lbnQgKHdoaWNoIHVzZXMKICAgICAgICAgICAgICAgICAgICAvLyBQb2x5bWVyJ3MgdGYtc3RvcmFnZSkuIERlZXBMaW5rUHJvdmlkZXJzIGFsc28gbW9kaWZ5IHRoZSBVUkwgd2hlbgogICAgICAgICAgICAgICAgICAgIC8vIGEgcHJvdmlkZXIncyBzZXJpYWxpemVTdGF0ZVRvUXVlcnlQYXJhbXMoKSBlbWl0cy4gVGhlc2UgcmVzdWx0IGluCiAgICAgICAgICAgICAgICAgICAgLy8gdGhlIFVSTCB1cGRhdGVkIHdpdGhvdXQgdGhlIHByZXZpb3VzIGhhc2guIEhhc2hTdG9yYWdlQ29tcG9uZW50CiAgICAgICAgICAgICAgICAgICAgLy8gbWFrZXMgbm8gYXR0ZW1wdCB0byByZXN0b3JlIHRoZSBoYXNoLCBzbyBpdCBpcyBkcm9wcGVkLgogICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgcmVzdWx0cyBpbiBiYWQgYmVoYXZpb3Igd2hlbiByZWZyZXNoaW5nIChlLmcuIGxvc3QgYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgLy8gcGx1Z2luKSBhbmQgd2hlbiBjaGFuZ2luZyBkYXNoYm9hcmRzIChlLmcuIGxvc3QgdGFnRmlsdGVyKS4KICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMTY5Nzk5Njk2KTogZWl0aGVyIEFwcFJvdXRpbmcgc2hvdWxkIG1hbmFnZSB0aGUgVVJMIGVudGlyZWx5CiAgICAgICAgICAgICAgICAgICAgLy8gKGluY2x1ZGluZyBoYXNoKSwgb3Igd2UgbWFrZSB0aGUgYXBwIHdhaXQgZm9yIEFwcFJvdXRpbmcgdG8KICAgICAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGJlZm9yZSBzZXR0aW5nIHRoZSBhY3RpdmUgcGx1Z2luIGhhc2guCiAgICAgICAgICAgICAgICAgICAgLy8gU2VlIGh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2lzc3Vlcy80MjA3LgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRSb3V0ZSA9IG5hdmlnYXRlZEFjdGlvbi5iZWZvcmU7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHByZXNlcnZlSGFzaCA9IG9sZFJvdXRlID09PSBudWxsIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIGdldFJvdXRlSWQob2xkUm91dGUucm91dGVLaW5kLCBvbGRSb3V0ZS5wYXJhbXMpID09PQogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Um91dGVJZCgoLyoqIEB0eXBlIHs/fSAqLyAocm91dGUpKS5yb3V0ZUtpbmQsICgvKiogQHR5cGUgez99ICovIChyb3V0ZSkpLnBhcmFtcyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VydmVIYXNoLAogICAgICAgICAgICAgICAgICAgICAgICByb3V0ZTogKC8qKiBAdHlwZSB7P30gKi8gKHJvdXRlKSksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoeyByb3V0ZSB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFhcmVSb3V0ZXNFcXVhbChyb3V0ZSwgewogICAgICAgICAgICAgICAgICAgICAgICBwYXRobmFtZTogdGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QXBwUm9vdGxlc3NQYXRobmFtZSh0aGlzLmxvY2F0aW9uLmdldFBhdGgoKSksCiAgICAgICAgICAgICAgICAgICAgICAgIHF1ZXJ5UGFyYW1zOiB0aGlzLmxvY2F0aW9uLmdldFNlYXJjaCgpLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfSkpLCB0YXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh7IHByZXNlcnZlSGFzaCwgcm91dGUgfSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5uYXZpZ2F0aW9uT3B0aW9ucy5yZXBsYWNlU3RhdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2NhdGlvbi5yZXBsYWNlU3RhdGUodGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QWJzUGF0aG5hbWVXaXRoQXBwUm9vdCh0aGlzLmxvY2F0aW9uLmdldEZ1bGxQYXRoRnJvbVJvdXRlT3JOYXYocm91dGUsIHByZXNlcnZlSGFzaCkpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9jYXRpb24ucHVzaFN0YXRlKHRoaXMuYXBwUm9vdFByb3ZpZGVyLmdldEFic1BhdGhuYW1lV2l0aEFwcFJvb3QodGhpcy5sb2NhdGlvbi5nZXRGdWxsUGF0aEZyb21Sb3V0ZU9yTmF2KHJvdXRlLCBwcmVzZXJ2ZUhhc2gpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSksIHsgZGlzcGF0Y2g6IGZhbHNlIH0pOwogICAgICAgICAgICB0aGlzLnJvdXRlQ29uZmlncyA9IHJlZ2lzdHJ5LmdldFJvdXRlQ29uZmlncygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ3J4T25Jbml0RWZmZWN0cygpIHsKICAgICAgICAgICAgcmV0dXJuIGluaXRBY3Rpb24oKTsKICAgICAgICB9CiAgICB9CiAgICBBcHBSb3V0aW5nRWZmZWN0cy5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQXBwUm91dGluZ0VmZmVjdHMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBY3Rpb25zIH0sCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogTG9jYXRpb24kMSB9LAogICAgICAgIHsgdHlwZTogUm91dGVSZWdpc3RyeU1vZHVsZSB9LAogICAgICAgIHsgdHlwZTogUHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uTW9kdWxlIH0sCiAgICAgICAgeyB0eXBlOiBBcHBSb290UHJvdmlkZXIgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBcHBSb3V0aW5nRWZmZWN0cy7JtWZhYyA9IGZ1bmN0aW9uIEFwcFJvdXRpbmdFZmZlY3RzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFwcFJvdXRpbmdFZmZlY3RzKSjJtcm1aW5qZWN0KEFjdGlvbnMpLCDJtcm1aW5qZWN0KFN0b3JlKSwgybXJtWluamVjdChMb2NhdGlvbiQxKSwgybXJtWluamVjdChSb3V0ZVJlZ2lzdHJ5TW9kdWxlKSwgybXJtWluamVjdChQcm9ncmFtbWF0aWNhbE5hdmlnYXRpb25Nb2R1bGUpLCDJtcm1aW5qZWN0KEFwcFJvb3RQcm92aWRlcikpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFwcFJvdXRpbmdFZmZlY3RzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IEFwcFJvdXRpbmdFZmZlY3RzLCBmYWN0b3J5OiBBcHBSb3V0aW5nRWZmZWN0cy7JtWZhYyB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hcHBfcm91dGluZy9sb2NhdGlvbl9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTG9jYXRpb25Nb2R1bGUgewogICAgfQogICAgTG9jYXRpb25Nb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW0xvY2F0aW9uJDFdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIExvY2F0aW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTG9jYXRpb25Nb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTG9jYXRpb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBMb2NhdGlvbk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMb2NhdGlvbk1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbTG9jYXRpb24kMV0gfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBpbml0aWFsU3RhdGUkMSA9IHsKICAgICAgICBhY3RpdmVSb3V0ZTogbnVsbCwKICAgICAgICBuZXh0Um91dGU6IG51bGwsCiAgICB9OwogICAgY29uc3QgcmVkdWNlciQxID0gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUkMSwgb24obmF2aWdhdGluZywgKHN0YXRlLCB7IGFmdGVyIH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbmV4dFJvdXRlOiBhZnRlciB9KTsKICAgIH0pLCBvbihuYXZpZ2F0ZWQsIChzdGF0ZSwgeyBhZnRlciB9KSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGFjdGl2ZVJvdXRlOiBhZnRlciwgbmV4dFJvdXRlOiBudWxsIH0pOwogICAgfSkpOwogICAgZnVuY3Rpb24gcmVkdWNlcnMkMShzdGF0ZSwgYWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHJlZHVjZXIkMShzdGF0ZSwgYWN0aW9uKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hcHBfcm91dGluZy9hcHBfcm91dGluZ19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQXBwUm91dGluZ01vZHVsZSB7CiAgICB9CiAgICBBcHBSb3V0aW5nTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoQVBQX1JPVVRJTkdfRkVBVFVSRV9LRVksIHJlZHVjZXJzJDEpLAogICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW0FwcFJvdXRpbmdFZmZlY3RzXSksCiAgICAgICAgICAgICAgICAgICAgICAgIExvY2F0aW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbUHJvZ3JhbW1hdGljYWxOYXZpZ2F0aW9uTW9kdWxlLCBBcHBSb290UHJvdmlkZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFwcFJvdXRpbmdNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBBcHBSb3V0aW5nTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFwcFJvdXRpbmdNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBcHBSb3V0aW5nTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFwcFJvdXRpbmdNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW1Byb2dyYW1tYXRpY2FsTmF2aWdhdGlvbk1vZHVsZSwgQXBwUm9vdFByb3ZpZGVyXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoQVBQX1JPVVRJTkdfRkVBVFVSRV9LRVksIHJlZHVjZXJzJDEpLAogICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtBcHBSb3V0aW5nRWZmZWN0c10pLAogICAgICAgICAgICAgICAgTG9jYXRpb25Nb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQXBwUm91dGluZ01vZHVsZSwgeyBpbXBvcnRzOiBbU3RvcmVGZWF0dXJlTW9kdWxlLCBFZmZlY3RzRmVhdHVyZU1vZHVsZSwgTG9jYXRpb25Nb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FwcF9yb3V0aW5nL3ZpZXdzL3JvdXRlcl9saW5rX2RpcmVjdGl2ZV9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUm91dGVyTGlua0RpcmVjdGl2ZUNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gbG9jYXRpb24KICAgICAgICAgKiBAcGFyYW0gez99IGFwcFJvb3RQcm92aWRlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlLCBsb2NhdGlvbiwgYXBwUm9vdFByb3ZpZGVyKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5sb2NhdGlvbiA9IGxvY2F0aW9uOwogICAgICAgICAgICB0aGlzLmFwcFJvb3RQcm92aWRlciA9IGFwcFJvb3RQcm92aWRlcjsKICAgICAgICAgICAgdGhpcy5wYXRobmFtZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUNsaWNrKGV2ZW50KSB7CiAgICAgICAgICAgIGlmICghdGhpcy5wYXRobmFtZSB8fCBldmVudC5jdHJsS2V5IHx8IGV2ZW50Lm1ldGFLZXkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChuYXZpZ2F0aW9uUmVxdWVzdGVkKHsKICAgICAgICAgICAgICAgIHBhdGhuYW1lOiB0aGlzLnBhdGhuYW1lLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGhyZWYoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5wYXRobmFtZSkKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICByZXR1cm4gdGhpcy5hcHBSb290UHJvdmlkZXIuZ2V0QWJzUGF0aG5hbWVXaXRoQXBwUm9vdCh0aGlzLmxvY2F0aW9uLmdldEZ1bGxQYXRoRnJvbVJvdXRlT3JOYXYoewogICAgICAgICAgICAgICAgcGF0aG5hbWU6IHRoaXMucGF0aG5hbWUsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkIHBhdGhuYW1lIHRvIGEgcm91dGUuCiAgICAgICAgICoKICAgICAgICAgKiBVbmxpa2UgXEBhbmd1bGFyL3JvdXRlcidzIGByb3V0ZXJMaW5rYCwgdGhlIHBhdGggaXMgbWFkZSBzdXJlIHRvIGVuZCAgd2l0aAogICAgICAgICAqICIvIi4KICAgICAgICAgKiBlLmcuLCA8YSBbcm91dGVyTGlua109IlsnZm9vJywgc29tZVBhcmFtV2l0aFZhbHVlRm9yQmFyXSI+IC0+ICdmb28vYmFyLycuCiAgICAgICAgICogQHBhcmFtIHs/fSBwYXRoUGFydHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCByb3V0ZXJMaW5rKHBhdGhQYXJ0cykgewogICAgICAgICAgICBpZiAodHlwZW9mIHBhdGhQYXJ0cyA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHBhdGhQYXJ0cyA9IFtwYXRoUGFydHNdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChwYXRoUGFydHMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigncm91dGVMaW5rIHNob3VsZCBoYXZlIHByb3BlciBwYXRoLiBHb3Qgbm90aGluZy4nKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBBcHBlbmQgIi8iIHN1ZmZpeC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXRobmFtZSA9IFsuLi5wYXRoUGFydHNdLmpvaW4oJy8nKTsKICAgICAgICAgICAgdGhpcy5wYXRobmFtZSA9IHBhdGhuYW1lLmVuZHNXaXRoKCcvJykgPyBwYXRobmFtZSA6IHBhdGhuYW1lICsgJy8nOwogICAgICAgIH0KICAgIH0KICAgIFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IERpcmVjdGl2ZSwgYXJnczogW3sgc2VsZWN0b3I6ICdhW3JvdXRlckxpbmtdJyB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogTG9jYXRpb24kMSB9LAogICAgICAgIHsgdHlwZTogQXBwUm9vdFByb3ZpZGVyIH0KICAgIF07CiAgICBSb3V0ZXJMaW5rRGlyZWN0aXZlQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGhhbmRsZUNsaWNrOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnY2xpY2snLCBbJyRldmVudCddLF0gfV0sCiAgICAgICAgaHJlZjogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnYXR0ci5ocmVmJyxdIH1dLAogICAgICAgIHJvdXRlckxpbms6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBSb3V0ZXJMaW5rRGlyZWN0aXZlQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KExvY2F0aW9uJDEpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFwcFJvb3RQcm92aWRlcikpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXIuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogUm91dGVyTGlua0RpcmVjdGl2ZUNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJhIiwgInJvdXRlckxpbmsiLCAiIl1dLCBob3N0VmFyczogMSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBSb3V0ZXJMaW5rRGlyZWN0aXZlQ29udGFpbmVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXJfY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZUNsaWNrKCRldmVudCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJocmVmIiwgY3R4LmhyZWYsIMm1ybVzYW5pdGl6ZVVybCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgcm91dGVyTGluazogInJvdXRlckxpbmsiIH0gfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYXBwX3JvdXRpbmcvdmlld3MvYXBwX3JvdXRpbmdfdmlld19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQXBwUm91dGluZ1ZpZXdNb2R1bGUgewogICAgfQogICAgQXBwUm91dGluZ1ZpZXdNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIExvY2F0aW9uTW9kdWxlLCBSb3V0ZVJlZ2lzdHJ5TW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbUm91dGVyT3V0bGV0Q29udGFpbmVyLCBSb3V0ZXJMaW5rRGlyZWN0aXZlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVyT3V0bGV0Q29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXJPdXRsZXRDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlckxpbmtEaXJlY3RpdmVDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtBcHBSb290UHJvdmlkZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFwcFJvdXRpbmdWaWV3TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQXBwUm91dGluZ1ZpZXdNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQXBwUm91dGluZ1ZpZXdNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBcHBSb3V0aW5nVmlld01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBcHBSb3V0aW5nVmlld01vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbQXBwUm9vdFByb3ZpZGVyXSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIExvY2F0aW9uTW9kdWxlLCBSb3V0ZVJlZ2lzdHJ5TW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShBcHBSb3V0aW5nVmlld01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtSb3V0ZXJPdXRsZXRDb250YWluZXIsCiAgICAgICAgICAgIFJvdXRlck91dGxldENvbXBvbmVudCwKICAgICAgICAgICAgUm91dGVyTGlua0RpcmVjdGl2ZUNvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIExvY2F0aW9uTW9kdWxlLCBSb3V0ZVJlZ2lzdHJ5TW9kdWxlXSwgZXhwb3J0czogW1JvdXRlck91dGxldENvbnRhaW5lciwgUm91dGVyTGlua0RpcmVjdGl2ZUNvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvY29yZS90eXBlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQGVudW0ge3N0cmluZ30gKi8KICAgIGNvbnN0IFBsdWdpbnNMaXN0RmFpbHVyZUNvZGUgPSB7CiAgICAgICAgVU5LTk9XTjogIlVOS05PV04iLAogICAgICAgIE5PVF9GT1VORDogIk5PVF9GT1VORCIsCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dlYmFwcF9kYXRhX3NvdXJjZS90Yl9zZXJ2ZXJfZGF0YV9zb3VyY2UudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGVuYWJsZWRFeHBlcmltZW50UGx1Z2luSWRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQbHVnaW5zTGlzdGluZ1F1ZXJ5UGFyYW1zKGVuYWJsZWRFeHBlcmltZW50UGx1Z2luSWRzKSB7CiAgICAgICAgaWYgKCFlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcy5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgVVJMU2VhcmNoUGFyYW1zKCk7CiAgICAgICAgZm9yIChjb25zdCBwbHVnaW5JZCBvZiBlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcykgewogICAgICAgICAgICBwYXJhbXMuYXBwZW5kKCdleHBlcmltZW50YWxQbHVnaW4nLCBwbHVnaW5JZCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBwYXJhbXM7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gaGFuZGxlRXJyb3IkMShlKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdGF0dXMgPSBQbHVnaW5zTGlzdEZhaWx1cmVDb2RlLlVOS05PV047CiAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkgewogICAgICAgICAgICBpZiAoZS5zdGF0dXMgPT09IDQwNCkgewogICAgICAgICAgICAgICAgc3RhdHVzID0gUGx1Z2luc0xpc3RGYWlsdXJlQ29kZS5OT1RfRk9VTkQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IFRCU2VydmVyRXJyb3Ioc3RhdHVzKSk7CiAgICB9CiAgICBjbGFzcyBUQlNlcnZlckVycm9yIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZhaWx1cmVDb2RlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZmFpbHVyZUNvZGUpIHsKICAgICAgICAgICAgdGhpcy5mYWlsdXJlQ29kZSA9IGZhaWx1cmVDb2RlOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIFRCU2VydmVyRGF0YVNvdXJjZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBodHRwCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaHR0cCkgewogICAgICAgICAgICB0aGlzLmh0dHAgPSBodHRwOwogICAgICAgICAgICAvLyBUT0RPKHNvZXJnZWwpOiBpbXBsZW1lbnRzIFdlYmFwcERhdGFTb3VyY2UKICAgICAgICAgICAgdGhpcy50ZkJhY2tlbmQgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RmLWJhY2tlbmQnKSkpKS50Zl9iYWNrZW5kOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVuYWJsZWRFeHBlcmltZW50UGx1Z2luSWRzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaFBsdWdpbnNMaXN0aW5nKGVuYWJsZWRFeHBlcmltZW50UGx1Z2luSWRzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gZ2V0UGx1Z2luc0xpc3RpbmdRdWVyeVBhcmFtcyhlbmFibGVkRXhwZXJpbWVudFBsdWdpbklkcyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGF0aFdpdGhQYXJhbXMgPSBwYXJhbXMKICAgICAgICAgICAgICAgID8gYGRhdGEvcGx1Z2luc19saXN0aW5nPyR7cGFyYW1zLnRvU3RyaW5nKCl9YAogICAgICAgICAgICAgICAgOiAnZGF0YS9wbHVnaW5zX2xpc3RpbmcnOwogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwCiAgICAgICAgICAgICAgICAuZ2V0KHBhdGhXaXRoUGFyYW1zKQogICAgICAgICAgICAgICAgLnBpcGUoY2F0Y2hFcnJvcihoYW5kbGVFcnJvciQxKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hFbnZpcm9ubWVudCgpIHsKICAgICAgICAgICAgLy8gTWFrZSBhIHJlcXVlc3QgZm9yIGRhdGEgZm9yIHRoZSBhbmd1bGFyLXNwZWNpZmljIHBvcnRpb24gb2YgdGhlIGFwcC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkYXRhRmV0Y2ggPSB0aGlzLmh0dHAuZ2V0KCdkYXRhL2Vudmlyb25tZW50Jyk7CiAgICAgICAgICAgIC8vIEZvcmNlIGEgZGF0YSBsb2FkIGZvciB0aGUgcG9seW1lci1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBhcHAuCiAgICAgICAgICAgIC8vIFRoaXMgbGVhZHMgdG8gZHVwbGljYXRlIHJlcXVlc3RzIGJ1dCBob3BlZnVsbHkgdGhlIHN0YXRlIGlzIHRlbXBvcmFyeSB1bnRpbAogICAgICAgICAgICAvLyB3ZSBtaWdyYXRlIGV2ZXJ5dGhpbmcgZnJvbSBwb2x5bWVyIHRvIGFuZ3VsYXIuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcG9seW1lckVudmlyb25tZW50UmVmcmVzaCA9IGZyb20odGhpcy50ZkJhY2tlbmQuZW52aXJvbm1lbnRTdG9yZS5yZWZyZXNoKCkpOwogICAgICAgICAgICAvLyBXYWl0IGZvciBib3RoIG9wZXJhdGlvbnMgdG8gY29tcGxldGUgYW5kIHJldHVybiB0aGUgcmVzcG9uc2UgZnJvbSB0aGUKICAgICAgICAgICAgLy8gZXhwbGljaXQgaHR0cCBnZXQgY2FsbC4KICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKFtkYXRhRmV0Y2gsIHBvbHltZXJFbnZpcm9ubWVudFJlZnJlc2hdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2RhdGFdKSA9PiBkYXRhKSksIGNhdGNoRXJyb3IoaGFuZGxlRXJyb3IkMSkpOwogICAgICAgIH0KICAgIH0KICAgIFRCU2VydmVyRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgVEJTZXJ2ZXJEYXRhU291cmNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVEJIdHRwQ2xpZW50IH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJTZXJ2ZXJEYXRhU291cmNlLsm1ZmFjID0gZnVuY3Rpb24gVEJTZXJ2ZXJEYXRhU291cmNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCU2VydmVyRGF0YVNvdXJjZSkoybXJtWluamVjdChUQkh0dHBDbGllbnQpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUQlNlcnZlckRhdGFTb3VyY2UuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVEJTZXJ2ZXJEYXRhU291cmNlLCBmYWN0b3J5OiBUQlNlcnZlckRhdGFTb3VyY2UuybVmYWMgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX3NlcnZlcl9kYXRhX3NvdXJjZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlIHsKICAgIH0KICAgIFRCU2VydmVyRGF0YVNvdXJjZU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW1RCSHR0cENsaWVudE1vZHVsZV0sCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbVEJTZXJ2ZXJEYXRhU291cmNlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUQlNlcnZlckRhdGFTb3VyY2VNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBUQlNlcnZlckRhdGFTb3VyY2VNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCU2VydmVyRGF0YVNvdXJjZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbVEJTZXJ2ZXJEYXRhU291cmNlXSwgaW1wb3J0czogW1tUQkh0dHBDbGllbnRNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFRCU2VydmVyRGF0YVNvdXJjZU1vZHVsZSwgeyBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL2VmZmVjdHMvY29yZV9lZmZlY3RzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIENvcmVFZmZlY3RzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gd2ViYXBwRGF0YVNvdXJjZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGFjdGlvbnMkLCBzdG9yZSwgd2ViYXBwRGF0YVNvdXJjZSkgewogICAgICAgICAgICB0aGlzLmFjdGlvbnMkID0gYWN0aW9ucyQ7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy53ZWJhcHBEYXRhU291cmNlID0gd2ViYXBwRGF0YVNvdXJjZTsKICAgICAgICAgICAgLy8gTmdyeCBhc3N1bWVzIGFsbCBFZmZlY3QgY2xhc3NlcyBoYXZlIHByb3BlcnRpZXMgdGhhdCBpbmhlcml0IGZyb20gdGhlIGJhc2UKICAgICAgICAgICAgLy8gSlMgT2JqZWN0LiBgdGZfYmFja2VuZGAgZG9lcyBub3QsIHNvIHdlIHdyYXAgaXQuCiAgICAgICAgICAgIHRoaXMudGZCYWNrZW5kID0gewogICAgICAgICAgICAgICAgcmVmOiAoKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RmLWJhY2tlbmQnKSkpKS50Zl9iYWNrZW5kLAogICAgICAgICAgICB9OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgKiBSZXF1aXJlcyB0byBiZSBleHBvcnRlZCBmb3IgSlNDb21waWxlci4gSlNDb21waWxlciwgb3RoZXJ3aXNlLAogICAgICAgICAgICAgICAqIHRoaW5rIGl0IGlzIHVudXNlZCBwcm9wZXJ0eSBhbmQgZGVhZGNvZGUgZWxpbWluYXRlIGF3YXkuCiAgICAgICAgICAgICAgICovCiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmZldGNoV2ViQXBwRGF0YSQgPSBjcmVhdGVFZmZlY3QoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShjb3JlTG9hZGVkLCByZWxvYWQsIG1hbnVhbFJlbG9hZCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldFBsdWdpbnNMaXN0TG9hZGVkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RW5hYmxlZEV4cGVyaW1lbnRhbFBsdWdpbnMpKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKHBsdWdpbnNMaXN0aW5nUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCAsIGVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHppcCh0aGlzLndlYmFwcERhdGFTb3VyY2UuZmV0Y2hQbHVnaW5zTGlzdGluZyhlbmFibGVkRXhwZXJpbWVudGFsUGx1Z2lucyksIHRoaXMuZmV0Y2hFbnZpcm9ubWVudCgpLCB0aGlzLnJlZnJlc2hQb2x5bWVyUnVucygpKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKFtwbHVnaW5zXSkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocGx1Z2luc0xpc3RpbmdMb2FkZWQoeyBwbHVnaW5zIH0pKTsKICAgICAgICAgICAgICAgIH0pKSwgY2F0Y2hFcnJvcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGUgaW5zdGFuY2VvZiBUQlNlcnZlckVycm9yKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocGx1Z2luc0xpc3RpbmdGYWlsZWQoeyBmYWlsdXJlQ29kZTogZS5mYWlsdXJlQ29kZSB9KSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHBsdWdpbnNMaXN0aW5nRmFpbGVkKHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVDb2RlOiBQbHVnaW5zTGlzdEZhaWx1cmVDb2RlLlVOS05PV04sCiAgICAgICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSkpKSksIHsgZGlzcGF0Y2g6IGZhbHNlIH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSEFDSzogQ09NUE9TSVRFIEFDVElPTiAtLSBGaXJlIGBjaGFuZ2VQbHVnaW5gIG9uIGZpcnN0IHRydXRoeSB2YWx1ZSBvZgogICAgICAgICAgICAgKiBhY3RpdmVQbHVnaW4gb24gY29yZUxvYWRlZCBvciBwbHVnaW5zTGlzdGluZ0xvYWRlZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogUmF0aW9uYWxlOiBtb3N0IHBsdWdpbnMgd2FudCB0byBiZSBhYmxlIHRvIHRlbGwgd2hlbiBpdCBiZWNvbWVzIGFjdGl2ZSBpbgogICAgICAgICAgICAgKiBvcmRlciB0bywgZm9yIGV4YW1wbGUsIGZldGNoIG5lY2Vzc2FyeSBkYXRhLiBCeSBmaXJpbmcgY2hhbmdlUGx1Z2luIG9uCiAgICAgICAgICAgICAqIGFjdGl2ZVBsdWdpbiBmaXJzdCB2YWx1ZSBzZXQsIHdlIGNhbiBwcmV2ZW50ICgxKSBvdGhlciBmZWF0dXJlIGRldmVsb3BlcgogICAgICAgICAgICAgKiBmcm9tIHJlc3BvbmRpbmcgdG8gdmFsdWVzIGNoYW5nZXMgZnJvbSB0aGUgc3RvcmUgKGNyZWF0ZXMgY29tcG9zaXRlCiAgICAgICAgICAgICAqIGFjdGlvbnMpIGFuZCAoMikgcmUtaW1wbGVtZW50IGNvbXBsZXggYW5kIGJyaXR0bGUgb2JzZXJ2YWJsZSBwYXR0ZXJuLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRpc3BhdGNoQ2hhbmdlUGx1Z2luJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShjb3JlTG9hZGVkLCBwbHVnaW5zTGlzdGluZ0xvYWRlZCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVBsdWdpbikpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChbLCBhY3RpdmVQbHVnaW5dKSA9PiBhY3RpdmVQbHVnaW4pKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWN0aXZlUGx1Z2luCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoYWN0aXZlUGx1Z2luKSA9PiBhY3RpdmVQbHVnaW4gIT09IG51bGwpKSwgdGFrZSgxKSwgdGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2luCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocGx1Z2luKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChjaGFuZ2VQbHVnaW4oeyBwbHVnaW46ICgvKiogQHR5cGUgez99ICovIChwbHVnaW4pKSB9KSk7CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSwgeyBkaXNwYXRjaDogZmFsc2UgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZvcmNlIGEgZGF0YSBsb2FkIGZvciB0aGUgUG9seW1lci1zcGVjaWZpYyBwb3J0aW9uIG9mIHRoZSBhcHAuIFRoaXMgbGVhZHMKICAgICAgICAgKiB0byBkdXBsaWNhdGUgcmVxdWVzdHMgYnV0IGhvcGVmdWxseSB0aGUgc3RhdGUgaXMgdGVtcG9yYXJ5IHVudGlsIHdlIG1pZ3JhdGUKICAgICAgICAgKiBldmVyeXRoaW5nIGZyb20gUG9seW1lciB0byBBbmd1bGFyLgogICAgICAgICAqCiAgICAgICAgICogVGhpcyBpcyBpbnRlbnRpb25hbGx5IGNhbGxlZCBpbiBjb3JlLyByYXRoZXIgdGhhbiBydW5zLyBzbyB0aGF0IFRCCiAgICAgICAgICogZW1iZWRkZXJzIG1heSB1c2UgcnVucyBvdXRzaWRlIG9mIHRoZSBjb3JlIGRhc2hib2FyZCBwYWdlLCB3aXRob3V0IHJlbHlpbmcKICAgICAgICAgKiBvbiB0aGUgUG9seW1lciBydW5zU3RvcmUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZnJlc2hQb2x5bWVyUnVucygpIHsKICAgICAgICAgICAgcmV0dXJuIGZyb20odGhpcy50ZkJhY2tlbmQucmVmLnJ1bnNTdG9yZS5yZWZyZXNoKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hFbnZpcm9ubWVudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMud2ViYXBwRGF0YVNvdXJjZS5mZXRjaEVudmlyb25tZW50KCkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVudmlyb25tZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZW52aXJvbm1lbnQpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZW52aXJvbm1lbnRMb2FkZWQoeyBlbnZpcm9ubWVudCB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgfQogICAgQ29yZUVmZmVjdHMuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENvcmVFZmZlY3RzLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQWN0aW9ucyB9LAogICAgICAgIHsgdHlwZTogU3RvcmUgfSwKICAgICAgICB7IHR5cGU6IFRCU2VydmVyRGF0YVNvdXJjZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIENvcmVFZmZlY3RzLsm1ZmFjID0gZnVuY3Rpb24gQ29yZUVmZmVjdHNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29yZUVmZmVjdHMpKMm1ybVpbmplY3QoQWN0aW9ucyksIMm1ybVpbmplY3QoU3RvcmUpLCDJtcm1aW5qZWN0KFRCU2VydmVyRGF0YVNvdXJjZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIENvcmVFZmZlY3RzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IENvcmVFZmZlY3RzLCBmYWN0b3J5OiBDb3JlRWZmZWN0cy7JtWZhYyB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3N0b3JlL2NvcmVfaW5pdGlhbF9zdGF0ZV9wcm92aWRlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDT1JFX1NUT1JFX0NPTkZJR19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignQ29yZSBGZWF0dXJlIENvbmZpZycpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGRlZXBMaW5rZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldENvbmZpZyhkZWVwTGlua2VyKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgaW5pdGlhbFN0YXRlOiAoLyoqIEB0eXBlIHs/fSAqLyAoT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBpbml0aWFsU3RhdGUpLCB7IGFjdGl2ZVBsdWdpbjogZGVlcExpbmtlci5nZXRQbHVnaW5JZCgpIHx8IG51bGwgfSkpKSwKICAgICAgICB9OwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2NvcmUvY29yZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQ29yZU1vZHVsZSB7CiAgICB9CiAgICBDb3JlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbQ29yZUVmZmVjdHNdKSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShDT1JFX0ZFQVRVUkVfS0VZLCByZWR1Y2VycywgQ09SRV9TVE9SRV9DT05GSUdfVE9LRU4pLAogICAgICAgICAgICAgICAgICAgICAgICBUQlNlcnZlckRhdGFTb3VyY2VNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogQ09SRV9TVE9SRV9DT05GSUdfVE9LRU4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBzOiBbSGFzaERlZXBMaW5rZXJdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogZ2V0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ29yZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IENvcmVNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ29yZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIENvcmVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29yZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IENPUkVfU1RPUkVfQ09ORklHX1RPS0VOLAogICAgICAgICAgICAgICAgZGVwczogW0hhc2hEZWVwTGlua2VyXSwKICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldENvbmZpZywKICAgICAgICAgICAgfSwKICAgICAgICBdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtDb3JlRWZmZWN0c10pLAogICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShDT1JFX0ZFQVRVUkVfS0VZLCByZWR1Y2VycywgQ09SRV9TVE9SRV9DT05GSUdfVE9LRU4pLAogICAgICAgICAgICAgICAgVEJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKENvcmVNb2R1bGUsIHsgaW1wb3J0czogW0VmZmVjdHNGZWF0dXJlTW9kdWxlLCBTdG9yZUZlYXR1cmVNb2R1bGUsIFRCU2VydmVyRGF0YVNvdXJjZU1vZHVsZV0gfSk7IH0pKCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBkZWZhdWx0RXhwZXJpbWVudCA9IHsKICAgICAgICBpZDogREVGQVVMVF9FWFBFUklNRU5UX0lELAogICAgICAgIG5hbWU6ICdEZWZhdWx0IGV4cGVyaW1lbnQnLAogICAgICAgIHN0YXJ0X3RpbWU6IDAsCiAgICB9OwogICAgY29uc3QgaW5pdGlhbERhdGFTdGF0ZSA9IHsKICAgICAgICBleHBlcmltZW50TWFwOiB7IFtkZWZhdWx0RXhwZXJpbWVudC5pZF06IGRlZmF1bHRFeHBlcmltZW50IH0sCiAgICB9OwogICAgY29uc3QgZGF0YVJlZHVjZXIgPSBjcmVhdGVSZWR1Y2VyKGluaXRpYWxEYXRhU3RhdGUpOwogICAgZnVuY3Rpb24gcmVkdWNlcnMkMihzdGF0ZSwgYWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIGNvbWJpbmVSZWR1Y2Vycyh7IGRhdGE6IGRhdGFSZWR1Y2VyIH0pKHN0YXRlLCBhY3Rpb24pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2V4cGVyaW1lbnRzL2V4cGVyaW1lbnRzX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBFeHBlcmltZW50c01vZHVsZSB7CiAgICB9CiAgICBFeHBlcmltZW50c01vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW1N0b3JlTW9kdWxlLmZvckZlYXR1cmUoRVhQRVJJTUVOVFNfRkVBVFVSRV9LRVksIHJlZHVjZXJzJDIpXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBFeHBlcmltZW50c01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEV4cGVyaW1lbnRzTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEV4cGVyaW1lbnRzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRXhwZXJpbWVudHNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRXhwZXJpbWVudHNNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShFWFBFUklNRU5UU19GRUFUVVJFX0tFWSwgcmVkdWNlcnMkMildXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEV4cGVyaW1lbnRzTW9kdWxlLCB7IGltcG9ydHM6IFtTdG9yZUZlYXR1cmVNb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FsZXJ0L2FsZXJ0X2FjdGlvbl9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gV2hpbGUgdGhpcyB0b2tlbiBpcyBub3QgdXNlZCBvdXRzaWRlLCBpdCBtdXN0IGJlIGV4cG9ydGVkIHNvIHRoYXQgc3RyaWN0ZXIKICAgIC8vIGJ1aWxkIHRvb2xzIG1heSBkaXNjb3ZlciBpdCBkdXJpbmcgY29tcGlsYXRpb24uCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBBQ1RJT05fVE9fQUxFUlRfUFJPVklERVIgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ1tBbGVydF0gQWN0aW9uLVRvLUFsZXJ0IFByb3ZpZGVyJyk7CiAgICAvKioKICAgICAqIEFuIE5nTW9kdWxlIHRoYXQgcHJvdmlkZXMgYWxlcnQtcHJvZHVjaW5nIGFjdGlvbnMuIFRoZXNlIGFjdGlvbiBjb25maWdzIGFyZQogICAgICogY29sbGVjdGVkIGJ5IEFsZXJ0TW9kdWxlLCB3aGljaCB0cmFja3MgYXBwbGljYXRpb24gYWxlcnRzLgogICAgICoKICAgICAqIFdoZW4gdGhlIGNvbmZpZ3VyZWQgYWN0aW9uIGZpcmVzLCB0aGUgQWxlcnRNb2R1bGUgbWF5IHJlc3BvbmQuCiAgICAgKgogICAgICogXEBOZ01vZHVsZSh7CiAgICAgKiAgIGltcG9ydHM6IFsKICAgICAqICAgICBBbGVydEFjdGlvbk1vZHVsZS5yZWdpc3RlckFsZXJ0QWN0aW9ucyhbCiAgICAgKiAgICAgICB7CiAgICAgKiAgICAgICAgIGFjdGlvbjogZmV0Y2hLZXlzRmFpbGVkLAogICAgICogICAgICAgICBhbGVydEZyb21BY3Rpb246ICgpID0+IHtsb2NhbGl6ZWRNZXNzYWdlOiAiS2V5cyBmYWlsZWQgdG8gZmV0Y2guIn0sCiAgICAgKiAgICAgICB9LAogICAgICogICAgICAgewogICAgICogICAgICAgICBhY3Rpb246IGdyZWVuQnV0dG9uQ2xpY2tlZCwKICAgICAqICAgICAgICAgYWxlcnRGcm9tQWN0aW9uOiAoYWN0aW9uUGF5bG9hZCkgPT4gewogICAgICogICAgICAgICAgIGlmICghYWN0aW9uUGF5bG9hZC53YXNCdXR0b25FbmFibGVkKSB7CiAgICAgKiAgICAgICAgICAgICByZXR1cm4ge2xvY2FsaXplZE1lc3NhZ2U6ICJHcmVlbiBidXR0b24gZmFpbGVkLiJ9OwogICAgICogICAgICAgICAgIH0KICAgICAqICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAqICAgICAgICAgfQogICAgICogICAgICAgfQogICAgICogICAgIF0pLAogICAgICogICBdLAogICAgICogfSkKICAgICAqLwogICAgY2xhc3MgQWxlcnRBY3Rpb25Nb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcHJvdmlkZXJzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IocHJvdmlkZXJzKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXAgZnJvbSBhY3Rpb24gY3JlYXRvciB0eXBlIHRvIHRyYW5zZm9ybWVyIGZ1bmN0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5wcm92aWRlcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIGZvciAoY29uc3QgY29uZmlncyBvZiBwcm92aWRlcnMgfHwgW10pIHsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgY29uZmlnIG9mIGNvbmZpZ3MpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wcm92aWRlcnMuaGFzKGNvbmZpZy5hY3Rpb25DcmVhdG9yLnR5cGUpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGAiJHtjb25maWcuYWN0aW9uQ3JlYXRvci50eXBlfSIgaXMgYWxyZWFkeSByZWdpc3RlcmVkIGZvciBhbGVydHMuYCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIE11bHRpcGxlIGFsZXJ0cyBmb3IgdGhlIHNhbWUgYWN0aW9uIGlzIG5vdCBhbGxvd2VkLicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLnByb3ZpZGVycy5zZXQoY29uZmlnLmFjdGlvbkNyZWF0b3IudHlwZSwgY29uZmlnLmFsZXJ0RnJvbUFjdGlvbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEFsZXJ0RnJvbUFjdGlvbihhY3Rpb24pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsYW1iZGEgPSB0aGlzLnByb3ZpZGVycy5nZXQoYWN0aW9uLnR5cGUpOwogICAgICAgICAgICBpZiAoIWxhbWJkYSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGxhbWJkYShhY3Rpb24pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByb3ZpZGVyRmFjdG9yeQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIHJlZ2lzdGVyQWxlcnRBY3Rpb25zKHByb3ZpZGVyRmFjdG9yeSkgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmdNb2R1bGU6IEFsZXJ0QWN0aW9uTW9kdWxlLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBBQ1RJT05fVE9fQUxFUlRfUFJPVklERVIsCiAgICAgICAgICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB1c2VGYWN0b3J5OiBwcm92aWRlckZhY3RvcnksCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfQogICAgQWxlcnRBY3Rpb25Nb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbe30sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQWxlcnRBY3Rpb25Nb2R1bGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBcnJheSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBQ1RJT05fVE9fQUxFUlRfUFJPVklERVIsXSB9XSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0QWN0aW9uTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQWxlcnRBY3Rpb25Nb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRBY3Rpb25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBbGVydEFjdGlvbk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbGVydEFjdGlvbk1vZHVsZSkoybXJtWluamVjdChBQ1RJT05fVE9fQUxFUlRfUFJPVklERVIsIDgpKTsgfSB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogRmlyZXMgd2hlbiBhbiBhbGVydCBpcyB0byBiZSByZXBvcnRlZC4KICAgICAqLwogICAgY29uc3QgYWxlcnRSZXBvcnRlZCA9IGNyZWF0ZUFjdGlvbignW0FsZXJ0XSBBbGVydCBSZXBvcnRlZCcsIHByb3BzKCkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FsZXJ0L2VmZmVjdHMvaW5kZXgudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQWxlcnRFZmZlY3RzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gYWxlcnRBY3Rpb25Nb2R1bGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihhY3Rpb25zJCwgc3RvcmUsIGFsZXJ0QWN0aW9uTW9kdWxlKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyQgPSBhY3Rpb25zJDsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmFsZXJ0QWN0aW9uTW9kdWxlID0gYWxlcnRBY3Rpb25Nb2R1bGU7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnJlcG9ydFJlZ2lzdGVyZWRBY3Rpb25BbGVydHMkID0gY3JlYXRlRWZmZWN0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoYWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGFsZXJ0SW5mbyA9IHRoaXMuYWxlcnRBY3Rpb25Nb2R1bGUuZ2V0QWxlcnRGcm9tQWN0aW9uKGFjdGlvbik7CiAgICAgICAgICAgICAgICAgICAgaWYgKGFsZXJ0SW5mbykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGFsZXJ0UmVwb3J0ZWQoYWxlcnRJbmZvKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSksIHsgZGlzcGF0Y2g6IGZhbHNlIH0pOwogICAgICAgIH0KICAgIH0KICAgIEFsZXJ0RWZmZWN0cy5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQWxlcnRFZmZlY3RzLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQWN0aW9ucyB9LAogICAgICAgIHsgdHlwZTogU3RvcmUgfSwKICAgICAgICB7IHR5cGU6IEFsZXJ0QWN0aW9uTW9kdWxlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRFZmZlY3RzLsm1ZmFjID0gZnVuY3Rpb24gQWxlcnRFZmZlY3RzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFsZXJ0RWZmZWN0cykoybXJtWluamVjdChBY3Rpb25zKSwgybXJtWluamVjdChTdG9yZSksIMm1ybVpbmplY3QoQWxlcnRBY3Rpb25Nb2R1bGUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydEVmZmVjdHMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogQWxlcnRFZmZlY3RzLCBmYWN0b3J5OiBBbGVydEVmZmVjdHMuybVmYWMgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBpbml0aWFsU3RhdGUkMiA9IHsKICAgICAgICBsYXRlc3RBbGVydDogbnVsbCwKICAgIH07CiAgICBjb25zdCByZWR1Y2VyJDIgPSBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSQyLCBvbihhbGVydFJlcG9ydGVkLCAoc3RhdGUsIHsgbG9jYWxpemVkTWVzc2FnZSB9KSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGxhdGVzdEFsZXJ0OiB7IGxvY2FsaXplZE1lc3NhZ2UsIGNyZWF0ZWQ6IERhdGUubm93KCkgfSB9KTsKICAgIH0pKTsKICAgIGZ1bmN0aW9uIHJlZHVjZXJzJDMoc3RhdGUsIGFjdGlvbikgewogICAgICAgIHJldHVybiByZWR1Y2VyJDIoc3RhdGUsIGFjdGlvbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYWxlcnQvdmlld3MvYWxlcnRfc25hY2tiYXJfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUHJvdmlkZXMgdGhlICdhbGVydCBzbmFja2Jhcicgdmlldy4KICAgICAqLwogICAgY2xhc3MgQWxlcnRTbmFja2Jhck1vZHVsZSB7CiAgICB9CiAgICBBbGVydFNuYWNrYmFyTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtBbGVydFNuYWNrYmFyQ29udGFpbmVyLCBBbGVydERpc3BsYXlTbmFja2JhckNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0FsZXJ0U25hY2tiYXJDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0U25hY2tCYXJNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogWwogICAgICAgICAgICAgICAgICAgICAgICAvLyBSZXF1aXJlZCBmb3Igbm9uLUl2eSBBbmd1bGFyIGFwcHMuCiAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0RGlzcGxheVNuYWNrYmFyQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRTbmFja2Jhck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFsZXJ0U25hY2tiYXJNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRTbmFja2Jhck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFsZXJ0U25hY2tiYXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQWxlcnRTbmFja2Jhck1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0U25hY2tCYXJNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEFsZXJ0U25hY2tiYXJNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbQWxlcnRTbmFja2JhckNvbnRhaW5lciwgQWxlcnREaXNwbGF5U25hY2tiYXJDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdFNuYWNrQmFyTW9kdWxlXSwgZXhwb3J0czogW0FsZXJ0U25hY2tiYXJDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2FsZXJ0L2FsZXJ0X21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBBbGVydE1vZHVsZSB7CiAgICB9CiAgICBBbGVydE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBBbGVydEFjdGlvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgQWxlcnRTbmFja2Jhck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShBTEVSVF9GRUFUVVJFX0tFWSwgcmVkdWNlcnMkMyksCiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbQWxlcnRFZmZlY3RzXSksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFsZXJ0TW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQWxlcnRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQWxlcnRNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBBbGVydEFjdGlvbk1vZHVsZSwKICAgICAgICAgICAgICAgIEFsZXJ0U25hY2tiYXJNb2R1bGUsCiAgICAgICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JGZWF0dXJlKEFMRVJUX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQzKSwKICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbQWxlcnRFZmZlY3RzXSksCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQWxlcnRNb2R1bGUsIHsgaW1wb3J0czogW0FsZXJ0QWN0aW9uTW9kdWxlLAogICAgICAgICAgICBBbGVydFNuYWNrYmFyTW9kdWxlLCBTdG9yZUZlYXR1cmVNb2R1bGUsIEVmZmVjdHNGZWF0dXJlTW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9kZWVwbGluay9kZWVwbGlua19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgRGVlcExpbmtNb2R1bGUgewogICAgfQogICAgRGVlcExpbmtNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW0hhc2hEZWVwTGlua2VyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWVwTGlua01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IERlZXBMaW5rTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlZXBMaW5rTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRGVlcExpbmtNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVlcExpbmtNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW0hhc2hEZWVwTGlua2VyXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3ZpZXdzL2hhc2hfc3RvcmFnZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSGFzaFN0b3JhZ2VNb2R1bGUgewogICAgfQogICAgSGFzaFN0b3JhZ2VNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0hhc2hTdG9yYWdlQ29udGFpbmVyLCBIYXNoU3RvcmFnZUNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0hhc2hTdG9yYWdlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZWVwTGlua01vZHVsZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGFzaFN0b3JhZ2VNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBIYXNoU3RvcmFnZU1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIYXNoU3RvcmFnZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhhc2hTdG9yYWdlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhhc2hTdG9yYWdlTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgRGVlcExpbmtNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEhhc2hTdG9yYWdlTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0hhc2hTdG9yYWdlQ29udGFpbmVyLCBIYXNoU3RvcmFnZUNvbXBvbmVudF0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIERlZXBMaW5rTW9kdWxlXSwgZXhwb3J0czogW0hhc2hTdG9yYWdlQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9jb3JlL3ZpZXdzL3BhZ2VfdGl0bGVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFBhZ2VUaXRsZU1vZHVsZSB7CiAgICB9CiAgICBQYWdlVGl0bGVNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1BhZ2VUaXRsZUNvbnRhaW5lciwgUGFnZVRpdGxlQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbUGFnZVRpdGxlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQYWdlVGl0bGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBQYWdlVGl0bGVNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFnZVRpdGxlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUGFnZVRpdGxlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBhZ2VUaXRsZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFBhZ2VUaXRsZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtQYWdlVGl0bGVDb250YWluZXIsIFBhZ2VUaXRsZUNvbXBvbmVudF0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLCBleHBvcnRzOiBbUGFnZVRpdGxlQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC93ZWJhcHBfZGF0YV9zb3VyY2UvdGJfZmVhdHVyZV9mbGFnX2RhdGFfc291cmNlX3R5cGVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGFic3RyYWN0CiAgICAgKi8KICAgIGNsYXNzIFRCRmVhdHVyZUZsYWdEYXRhU291cmNlIHsKICAgIH0KICAgIFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1ZmFjID0gZnVuY3Rpb24gVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2UpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2UuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2UsIGZhY3Rvcnk6IFRCRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dlYmFwcF9kYXRhX3NvdXJjZS90Yl9mZWF0dXJlX2ZsYWdfZGF0YV9zb3VyY2UudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBTYXZlIHRoZSBpbml0aWFsIFVSTCBxdWVyeSBwYXJhbXMsIGJlZm9yZSB0aGUgQXBwUm91dGluZ0VmZmVjdHMgaW5pdGlhbGl6ZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBpbml0aWFsVVJMU2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHV0aWwkMSA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFBhcmFtcygpIHsKICAgICAgICAgICAgcmV0dXJuIGluaXRpYWxVUkxTZWFyY2hQYXJhbXM7CiAgICAgICAgfSwKICAgIH07CiAgICBjbGFzcyBRdWVyeVBhcmFtc0ZlYXR1cmVGbGFnRGF0YVNvdXJjZSBleHRlbmRzIFRCRmVhdHVyZUZsYWdEYXRhU291cmNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEZlYXR1cmVzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IHV0aWwkMS5nZXRQYXJhbXMoKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIGVuYWJsZWRFeHBlcmltZW50YWxQbHVnaW5zOiBwYXJhbXMuZ2V0QWxsKCdleHBlcmltZW50YWxQbHVnaW4nKSwKICAgICAgICAgICAgICAgIGluQ29sYWI6IHBhcmFtcy5nZXQoJ3RlbnNvcmJvYXJkQ29sYWInKSA9PT0gJ3RydWUnLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0KICAgIFF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1ZmFjID0gZnVuY3Rpb24gUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2VfRmFjdG9yeSh0KSB7IHJldHVybiDJtVF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlX0Jhc2VGYWN0b3J5KHQgfHwgUXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2UpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFF1ZXJ5UGFyYW1zRmVhdHVyZUZsYWdEYXRhU291cmNlLCBmYWN0b3J5OiBRdWVyeVBhcmFtc0ZlYXR1cmVGbGFnRGF0YVNvdXJjZS7JtWZhYyB9KTsKICAgIGNvbnN0IMm1UXVlcnlQYXJhbXNGZWF0dXJlRmxhZ0RhdGFTb3VyY2VfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShRdWVyeVBhcmFtc0ZlYXR1cmVGbGFnRGF0YVNvdXJjZSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2ViYXBwX2RhdGFfc291cmNlL3RiX2ZlYXR1cmVfZmxhZ19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBUQkZlYXR1cmVGbGFnTW9kdWxlIHsKICAgIH0KICAgIFRCRmVhdHVyZUZsYWdNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBRdWVyeVBhcmFtc0ZlYXR1cmVGbGFnRGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRCRmVhdHVyZUZsYWdNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBUQkZlYXR1cmVGbGFnTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRCRmVhdHVyZUZsYWdNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBUQkZlYXR1cmVGbGFnTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRCRmVhdHVyZUZsYWdNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogWwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcm92aWRlOiBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBRdWVyeVBhcmFtc0ZlYXR1cmVGbGFnRGF0YVNvdXJjZSwKICAgICAgICAgICAgfSwKICAgICAgICBdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2ZlYXR1cmVfZmxhZy9hY3Rpb25zL2ZlYXR1cmVfZmxhZ19hY3Rpb25zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGZlYXR1cmVzTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRkVBVFVSRSBGTEFHXSBGZWF0dXJlcyBMb2FkZWQnLCBwcm9wcygpKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9mZWF0dXJlX2ZsYWcvc3RvcmUvZmVhdHVyZV9mbGFnX3JlZHVjZXJzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGluaXRpYWxTdGF0ZSQzID0gewogICAgICAgIGlzRmVhdHVyZUZsYWdzTG9hZGVkOiBmYWxzZSwKICAgICAgICBmZWF0dXJlczogewogICAgICAgICAgICBlbmFibGVkRXhwZXJpbWVudGFsUGx1Z2luczogW10sCiAgICAgICAgICAgIGluQ29sYWI6IGZhbHNlLAogICAgICAgIH0sCiAgICB9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVkdWNlciQzID0gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUkMywgb24oZmVhdHVyZXNMb2FkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgZmVhdHVyZXMgfSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBpc0ZlYXR1cmVGbGFnc0xvYWRlZDogdHJ1ZSwgZmVhdHVyZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZmVhdHVyZXMpLCBmZWF0dXJlcykgfSk7CiAgICB9KSkpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcmVkdWNlcnMkNChzdGF0ZSwgYWN0aW9uKSB7CiAgICAgICAgcmV0dXJuIHJlZHVjZXIkMyhzdGF0ZSwgYWN0aW9uKTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9mZWF0dXJlX2ZsYWcvZWZmZWN0cy9mZWF0dXJlX2ZsYWdfZWZmZWN0cy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVmZmVjdHNJbml0aWFsaXplZCA9IGNyZWF0ZUFjdGlvbignW0ZFQVRVUkUgRkxBR10gRWZmZWN0cyBJbml0Jyk7CiAgICBjbGFzcyBGZWF0dXJlRmxhZ0VmZmVjdHMgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9ucyQKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGFTb3VyY2UKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihhY3Rpb25zJCwgZGF0YVNvdXJjZSkgewogICAgICAgICAgICB0aGlzLmFjdGlvbnMkID0gYWN0aW9ucyQ7CiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmdldEZlYXR1cmVGbGFncyQgPSBjcmVhdGVFZmZlY3QoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShlZmZlY3RzSW5pdGlhbGl6ZWQpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZXMgPSB0aGlzLmRhdGFTb3VyY2UuZ2V0RmVhdHVyZXMoKTsKICAgICAgICAgICAgICAgIHJldHVybiBmZWF0dXJlc0xvYWRlZCh7IGZlYXR1cmVzIH0pOwogICAgICAgICAgICB9KSkpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBleHBvcnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5ncnhPbkluaXRFZmZlY3RzKCkgewogICAgICAgICAgICByZXR1cm4gZWZmZWN0c0luaXRpYWxpemVkKCk7CiAgICAgICAgfQogICAgfQogICAgRmVhdHVyZUZsYWdFZmZlY3RzLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBGZWF0dXJlRmxhZ0VmZmVjdHMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBY3Rpb25zIH0sCiAgICAgICAgeyB0eXBlOiBUQkZlYXR1cmVGbGFnRGF0YVNvdXJjZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEZlYXR1cmVGbGFnRWZmZWN0cy7JtWZhYyA9IGZ1bmN0aW9uIEZlYXR1cmVGbGFnRWZmZWN0c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBGZWF0dXJlRmxhZ0VmZmVjdHMpKMm1ybVpbmplY3QoQWN0aW9ucyksIMm1ybVpbmplY3QoVEJGZWF0dXJlRmxhZ0RhdGFTb3VyY2UpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBGZWF0dXJlRmxhZ0VmZmVjdHMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogRmVhdHVyZUZsYWdFZmZlY3RzLCBmYWN0b3J5OiBGZWF0dXJlRmxhZ0VmZmVjdHMuybVmYWMgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvZmVhdHVyZV9mbGFnL2ZlYXR1cmVfZmxhZ19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBGZWF0dXJlRmxhZ01vZHVsZSB7CiAgICB9CiAgICBGZWF0dXJlRmxhZ01vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBUQkZlYXR1cmVGbGFnTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JGZWF0dXJlKEZFQVVUVVJFX0ZMQUdfRkVBVFVSRV9LRVksIHJlZHVjZXJzJDQpLAogICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW0ZlYXR1cmVGbGFnRWZmZWN0c10pLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRmVhdHVyZUZsYWdNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBGZWF0dXJlRmxhZ01vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBGZWF0dXJlRmxhZ01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEZlYXR1cmVGbGFnTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZlYXR1cmVGbGFnTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgVEJGZWF0dXJlRmxhZ01vZHVsZSwKICAgICAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoRkVBVVRVUkVfRkxBR19GRUFUVVJFX0tFWSwgcmVkdWNlcnMkNCksCiAgICAgICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW0ZlYXR1cmVGbGFnRWZmZWN0c10pLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEZlYXR1cmVGbGFnTW9kdWxlLCB7IGltcG9ydHM6IFtUQkZlYXR1cmVGbGFnTW9kdWxlLCBTdG9yZUZlYXR1cmVNb2R1bGUsIEVmZmVjdHNGZWF0dXJlTW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9zZXR0aW5ncy9zZXR0aW5nc19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgU2V0dGluZ3NNb2R1bGUgewogICAgfQogICAgU2V0dGluZ3NNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc0J1dHRvbkNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NEaWFsb2dDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbU2V0dGluZ3NCdXR0b25Db21wb25lbnQsIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogW1NldHRpbmdzRGlhbG9nQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdERpYWxvZ01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SW5wdXRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFNldHRpbmdzTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFNldHRpbmdzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gU2V0dGluZ3NNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2V0dGluZ3NNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdERpYWxvZ01vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRJbnB1dE1vZHVsZSwKICAgICAgICAgICAgXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShTZXR0aW5nc01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtTZXR0aW5nc0J1dHRvbkNvbXBvbmVudCwKICAgICAgICAgICAgU2V0dGluZ3NEaWFsb2dDb21wb25lbnQsCiAgICAgICAgICAgIFNldHRpbmdzUG9seW1lckludGVyb3BDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgTWF0RGlhbG9nTW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICBNYXRJbnB1dE1vZHVsZV0sIGV4cG9ydHM6IFtTZXR0aW5nc0J1dHRvbkNvbXBvbmVudCwgU2V0dGluZ3NQb2x5bWVySW50ZXJvcENvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvdGJkZXZfdXBsb2FkL3RiZGV2X3VwbG9hZF9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGJkZXZVcGxvYWRNb2R1bGUgewogICAgfQogICAgVGJkZXZVcGxvYWRNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICBUYmRldlVwbG9hZEJ1dHRvbkNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgVGJkZXZVcGxvYWREaWFsb2dDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFRiZGV2VXBsb2FkRGlhbG9nQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW1RiZGV2VXBsb2FkQnV0dG9uQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IFtUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBDbGlwYm9hcmRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXREaWFsb2dNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFt7IHByb3ZpZGU6ICd3aW5kb3cnLCB1c2VWYWx1ZTogd2luZG93IH1dLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRiZGV2VXBsb2FkTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGJkZXZVcGxvYWRNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGJkZXZVcGxvYWRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBUYmRldlVwbG9hZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUYmRldlVwbG9hZE1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiAnd2luZG93JywgdXNlVmFsdWU6IHdpbmRvdyB9XSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENsaXBib2FyZE1vZHVsZSwKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdERpYWxvZ01vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVGJkZXZVcGxvYWRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnQsCiAgICAgICAgICAgIFRiZGV2VXBsb2FkRGlhbG9nQ29tcG9uZW50LAogICAgICAgICAgICBUYmRldlVwbG9hZERpYWxvZ0NvbnRhaW5lcl0sIGltcG9ydHM6IFtDbGlwYm9hcmRNb2R1bGUsCiAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXREaWFsb2dNb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGVdLCBleHBvcnRzOiBbVGJkZXZVcGxvYWRCdXR0b25Db21wb25lbnRdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL2hlYWRlci9oZWFkZXJfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEhlYWRlck1vZHVsZSB7CiAgICB9CiAgICBIZWFkZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXJDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpblNlbGVjdG9yQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5TZWxlY3RvckNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgUmVsb2FkQ29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0hlYWRlckNvbXBvbmVudCwgUGx1Z2luU2VsZWN0b3JDb250YWluZXIsIFJlbG9hZENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0VGFic01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0VG9vbGJhck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0U2VsZWN0TW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBUYmRldlVwbG9hZE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEhlYWRlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEhlYWRlck1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBIZWFkZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGVhZGVyTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFtdLCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdFRhYnNNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRUb29sYmFyTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0U2VsZWN0TW9kdWxlLAogICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgQ29yZU1vZHVsZSwKICAgICAgICAgICAgICAgIFNldHRpbmdzTW9kdWxlLAogICAgICAgICAgICAgICAgVGJkZXZVcGxvYWRNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoSGVhZGVyTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0hlYWRlckNvbXBvbmVudCwKICAgICAgICAgICAgUGx1Z2luU2VsZWN0b3JDb21wb25lbnQsCiAgICAgICAgICAgIFBsdWdpblNlbGVjdG9yQ29udGFpbmVyLAogICAgICAgICAgICBSZWxvYWRDb250YWluZXJdLCBpbXBvcnRzOiBbTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICBNYXRUYWJzTW9kdWxlLAogICAgICAgICAgICBNYXRUb29sYmFyTW9kdWxlLAogICAgICAgICAgICBNYXRTZWxlY3RNb2R1bGUsCiAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgQ29yZU1vZHVsZSwKICAgICAgICAgICAgU2V0dGluZ3NNb2R1bGUsCiAgICAgICAgICAgIFRiZGV2VXBsb2FkTW9kdWxlXSwgZXhwb3J0czogW0hlYWRlckNvbXBvbmVudCwgUGx1Z2luU2VsZWN0b3JDb250YWluZXIsIFJlbG9hZENvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWF0X2ljb25fbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFNWR19QQVRIID0gJy4vaWNvbl9idW5kbGUuc3ZnJzsKICAgIGNsYXNzIE1hdEljb25Nb2R1bGUkMSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkb21TYW5pdGl6ZXIKICAgICAgICAgKiBAcGFyYW0gez99IGljb25SZWdpc3RyeQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGRvbVNhbml0aXplciwgaWNvblJlZ2lzdHJ5KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdXJsID0gZG9tU2FuaXRpemVyLmJ5cGFzc1NlY3VyaXR5VHJ1c3RSZXNvdXJjZVVybChTVkdfUEFUSCk7CiAgICAgICAgICAgIGljb25SZWdpc3RyeS5hZGRTdmdJY29uU2V0KHVybCk7CiAgICAgICAgfQogICAgfQogICAgTWF0SWNvbk1vZHVsZSQxLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbTWF0SWNvbk1vZHVsZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdEljb25Nb2R1bGUkMS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IERvbVNhbml0aXplciB9LAogICAgICAgIHsgdHlwZTogTWF0SWNvblJlZ2lzdHJ5IH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWF0SWNvbk1vZHVsZSQxLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0SWNvbk1vZHVsZSQxIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1hdEljb25Nb2R1bGUkMS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdEljb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SWNvbk1vZHVsZSQxKSjJtcm1aW5qZWN0KERvbVNhbml0aXplciksIMm1ybVpbmplY3QoTWF0SWNvblJlZ2lzdHJ5KSk7IH0sIGltcG9ydHM6IFtbTWF0SWNvbk1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0SWNvbk1vZHVsZSQxLCB7IGltcG9ydHM6IFtNYXRJY29uTW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAxOSBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHZhciBMb2FkaW5nTWVjaGFuaXNtVHlwZTsKICAgIChmdW5jdGlvbiAoTG9hZGluZ01lY2hhbmlzbVR5cGUpIHsKICAgICAgICBMb2FkaW5nTWVjaGFuaXNtVHlwZVsiQ1VTVE9NX0VMRU1FTlQiXSA9ICJDVVNUT01fRUxFTUVOVCI7CiAgICAgICAgTG9hZGluZ01lY2hhbmlzbVR5cGVbIklGUkFNRSJdID0gIklGUkFNRSI7CiAgICAgICAgTG9hZGluZ01lY2hhbmlzbVR5cGVbIk5HX0NPTVBPTkVOVCJdID0gIk5HX0NPTVBPTkVOVCI7CiAgICAgICAgTG9hZGluZ01lY2hhbmlzbVR5cGVbIk5PTkUiXSA9ICJOT05FIjsKICAgIH0pKExvYWRpbmdNZWNoYW5pc21UeXBlIHx8IChMb2FkaW5nTWVjaGFuaXNtVHlwZSA9IHt9KSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9wbHVnaW5fcmVnaXN0cnlfdHlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gVGhpcyBESSB0b2tlbiBtdXN0IG5vdCBiZSBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUgYXMgUGx1Z2luUmVnaXN0cnlNb2R1bGUKICAgIC8vIG9yIGVsc2UgaXRzIGNvbnN0cnVjdG9yIGluamVjdGlvbiBjYXVzZXMgQW5ndWxhcidzIEFPVCBjb21waWxlciB0byB0aGluawogICAgLy8gdGhlcmUgaXMgYSBjaXJjdWxhciBkZXBlbmRlbmN5LgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUExVR0lOX0NPTkZJR19UT0tFTiA9IG5ldyBJbmplY3Rpb25Ub2tlbignW3BsdWdpbnNdIFBsdWdpbiByZWdpc3RyeSBjb25maWcnKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3BsdWdpbl9yZWdpc3RyeV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcGx1Z2luTmFtZVRvQ29tcG9uZW50ID0gbmV3IE1hcCgpOwogICAgY2xhc3MgUGx1Z2luUmVnaXN0cnlNb2R1bGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29uZmlncwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbmZpZ3MpIHsKICAgICAgICAgICAgaWYgKCFjb25maWdzKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbHVnaW5OYW1lcyA9IG5ldyBTZXQoY29uZmlncy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbmZpZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvbmZpZykgPT4gY29uZmlnLnBsdWdpbk5hbWUpKSk7CiAgICAgICAgICAgIGNvbnNvbGUuYXNzZXJ0KHBsdWdpbk5hbWVzLnNpemUgPT09IGNvbmZpZ3MubGVuZ3RoLCAnQ2Fubm90IHJlZ2lzdGVyIHRoZSBzYW1lIHBsdWdpbiBtdWx0aXBsZSB0aW1lcy4nKTsKICAgICAgICAgICAgZm9yIChjb25zdCBjb25maWcgb2YgY29uZmlncykgewogICAgICAgICAgICAgICAgY29uc3QgeyBwbHVnaW5OYW1lLCBjb21wb25lbnRDbGFzcyB9ID0gY29uZmlnOwogICAgICAgICAgICAgICAgcGx1Z2luTmFtZVRvQ29tcG9uZW50LnNldChwbHVnaW5OYW1lLCAoLyoqIEB0eXBlIHs/fSAqLyAoY29tcG9uZW50Q2xhc3MpKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQW4gTmdNb2R1bGUgdGhhdCBkZWNsYXJlcyBhIENvbXBvbmVudCBjYW4gY2FsbCB0aGlzIG1ldGhvZCB0byByZWdpc3RlciB0aGUKICAgICAgICAgKiBDb21wb25lbnQgdG8gYmUgcmVuZGVyZWQgd2hlbiBhIHBsdWdpbiBpcyByZXF1ZXN0ZWQgYnkgbmFtZS4gTW9kdWxlcwogICAgICAgICAqIHJlZ2lzdGVyIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIGNvbmZpZ3VyYXRpb246CiAgICAgICAgICoKICAgICAgICAgKiBcQE5nTW9kdWxlKHsKICAgICAgICAgKiAgIGltcG9ydHM6IFsKICAgICAgICAgKiAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKCdzY2FsYXJzJywgU2NhbGFyc0Rhc2hib2FyZCkKICAgICAgICAgKiAgIF0sCiAgICAgICAgICogICBlbnRyeUNvbXBvbmVudHM6IFtTY2FsYXJzRGFzaGJvYXJkXQogICAgICAgICAqIH0pCiAgICAgICAgICogQHBhcmFtIHs/fSBwbHVnaW5OYW1lCiAgICAgICAgICogQHBhcmFtIHs/fSBjb21wb25lbnRDbGFzcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RhdGljIGZvclBsdWdpbihwbHVnaW5OYW1lLCBjb21wb25lbnRDbGFzcykgewogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbmdNb2R1bGU6IFBsdWdpblJlZ2lzdHJ5TW9kdWxlLAogICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBQTFVHSU5fQ09ORklHX1RPS0VOLAogICAgICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgdXNlVmFsdWU6IHsgcGx1Z2luTmFtZSwgY29tcG9uZW50Q2xhc3MgfSwKICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBwbHVnaW5OYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRDb21wb25lbnQocGx1Z2luTmFtZSkgewogICAgICAgICAgICByZXR1cm4gcGx1Z2luTmFtZVRvQ29tcG9uZW50LmdldChwbHVnaW5OYW1lKSB8fCBudWxsOwogICAgICAgIH0KICAgIH0KICAgIFBsdWdpblJlZ2lzdHJ5TW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3t9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFBsdWdpblJlZ2lzdHJ5TW9kdWxlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQXJyYXksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbUExVR0lOX0NPTkZJR19UT0tFTixdIH1dIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luUmVnaXN0cnlNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBQbHVnaW5SZWdpc3RyeU1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5SZWdpc3RyeU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFBsdWdpblJlZ2lzdHJ5TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFBsdWdpblJlZ2lzdHJ5TW9kdWxlKSjJtcm1aW5qZWN0KFBMVUdJTl9DT05GSUdfVE9LRU4sIDgpKTsgfSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3BsdWdpbnNfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IF9jMCRhID0gWyJwbHVnaW5Db250YWluZXIiXTsKICAgIGNvbnN0IF9jMSQ4ID0gWyJuZ1BsdWdpbkNvbnRhaW5lciJdOwogICAgZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9kaXZfNF9uZ19jb250YWluZXJfMl9uZ19jb250YWluZXJfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigwKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9kaXZfNF9uZ19jb250YWluZXJfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDApOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X25nX2NvbnRhaW5lcl8yX25nX2NvbnRhaW5lcl8xX1RlbXBsYXRlLCAxLCAwLCAibmctY29udGFpbmVyIiwgOSk7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICBjb25zdCBfcjMgPSDJtcm1cmVmZXJlbmNlKDYpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdUZW1wbGF0ZU91dGxldCIsIGN0eF9yNy5lbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlID8gY3R4X3I3LmVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUgOiBfcjMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X25nX2NvbnRhaW5lcl8zX25nX2NvbnRhaW5lcl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDApOwogICAgfSB9CiAgICBmdW5jdGlvbiBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIFBsdWdpbnNDb21wb25lbnRfZGl2XzRfbmdfY29udGFpbmVyXzNfbmdfY29udGFpbmVyXzFfVGVtcGxhdGUsIDEsIDAsICJuZy1jb250YWluZXIiLCA5KTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I4ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIGNvbnN0IF9yMyA9IMm1ybVyZWZlcmVuY2UoNik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1RlbXBsYXRlT3V0bGV0IiwgY3R4X3I4LmVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZSA/IGN0eF9yOC5lbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGUgOiBfcjMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X25nX2NvbnRhaW5lcl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaDMiLCAxMCk7CiAgICAgICAgybXJtXRleHQoMiwgIiBUaGVyZVx1MjAxOXMgbm8gZGFzaGJvYXJkIGJ5IHRoZSBuYW1lIG9mIFx1MjAxQyIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImNvZGUiKTsKICAgICAgICDJtcm1dGV4dCg0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZXh0KDUsICJcdTIwMUQuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAicCIpOwogICAgICAgIMm1ybV0ZXh0KDcsICJZb3UgY2FuIHNlbGVjdCBhIGRhc2hib2FyZCBmcm9tIHRoZSBsaXN0IGFib3ZlLiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAicCIpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDksIDExKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjkgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgY29uc3QgX3I1ID0gybXJtXJlZmVyZW5jZSg4KTsKICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yOS5hY3RpdmVQbHVnaW5JZCk7CiAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1RlbXBsYXRlT3V0bGV0IiwgX3I1KTsKICAgIH0gfQogICAgZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9kaXZfNF9uZ19jb250YWluZXJfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImgzIiwgMTIpOwogICAgICAgIMm1ybV0ZXh0KDIsICIgTm8gZGFzaGJvYXJkcyBhcmUgYWN0aXZlIGZvciB0aGUgY3VycmVudCBkYXRhIHNldC4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJwIik7CiAgICAgICAgybXJtXRleHQoNCwgIlByb2JhYmxlIGNhdXNlczoiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgInVsIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAibGkiKTsKICAgICAgICDJtcm1dGV4dCg3LCAiWW91IGhhdmVuXHUyMDE5dCB3cml0dGVuIGFueSBkYXRhIHRvIHlvdXIgZXZlbnQgZmlsZXMuIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDgsICJsaSIpOwogICAgICAgIMm1ybV0ZXh0KDksICJUZW5zb3JCb2FyZCBjYW5cdTIwMTl0IGZpbmQgeW91ciBldmVudCBmaWxlcy4iKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoMTAsICIgSWYgeW91XHUyMDE5cmUgbmV3IHRvIHVzaW5nIFRlbnNvckJvYXJkLCBhbmQgd2FudCB0byBmaW5kIG91dCBob3cgdG8gYWRkIGRhdGEgYW5kIHNldCB1cCB5b3VyIGV2ZW50IGZpbGVzLCBjaGVjayBvdXQgdGhlICIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTEsICJhIiwgMTMpOwogICAgICAgIMm1ybV0ZXh0KDEyLCAiUkVBRE1FIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGV4dCgxMywgIiBhbmQgcGVyaGFwcyB0aGUgIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNCwgImEiLCAxNCk7CiAgICAgICAgybXJtXRleHQoMTUsICJUZW5zb3JCb2FyZCB0dXRvcmlhbCIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoMTYsICIuICIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTcsICJwIik7CiAgICAgICAgybXJtXRleHQoMTgsICIgSWYgeW91IHRoaW5rIFRlbnNvckJvYXJkIGlzIGNvbmZpZ3VyZWQgcHJvcGVybHksIHBsZWFzZSBzZWUgIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxOSwgImEiLCAxNSk7CiAgICAgICAgybXJtXRleHQoMjAsICJ0aGUgc2VjdGlvbiBvZiB0aGUgUkVBRE1FIGRldm90ZWQgdG8gbWlzc2luZyBkYXRhIHByb2JsZW1zIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGV4dCgyMSwgIiBhbmQgY29uc2lkZXIgZmlsaW5nIGFuIGlzc3VlIG9uIEdpdEh1Yi4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIyLCAicCIpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDIzLCAxMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIGNvbnN0IF9yNSA9IMm1ybVyZWZlcmVuY2UoOCk7CiAgICAgICAgybXJtWFkdmFuY2UoMjMpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdUZW1wbGF0ZU91dGxldCIsIF9yNSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFBsdWdpbnNDb21wb25lbnRfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgNyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIFBsdWdpbnNDb21wb25lbnRfZGl2XzRfbmdfY29udGFpbmVyXzJfVGVtcGxhdGUsIDIsIDEsICJuZy1jb250YWluZXIiLCA4KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMywgUGx1Z2luc0NvbXBvbmVudF9kaXZfNF9uZ19jb250YWluZXJfM19UZW1wbGF0ZSwgMiwgMSwgIm5nLWNvbnRhaW5lciIsIDgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X25nX2NvbnRhaW5lcl80X1RlbXBsYXRlLCAxMCwgMiwgIm5nLWNvbnRhaW5lciIsIDgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBQbHVnaW5zQ29tcG9uZW50X2Rpdl80X25nX2NvbnRhaW5lcl81X1RlbXBsYXRlLCAyNCwgMSwgIm5nLWNvbnRhaW5lciIsIDgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMiA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCBjdHhfcjIucGx1Z2luTG9hZFN0YXRlKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGN0eF9yMi5QbHVnaW5Mb2FkU3RhdGUuRU5WSVJPTk1FTlRfRkFJTFVSRV9OT1RfRk9VTkQpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgY3R4X3IyLlBsdWdpbkxvYWRTdGF0ZS5FTlZJUk9OTUVOVF9GQUlMVVJFX1VOS05PV04pOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgY3R4X3IyLlBsdWdpbkxvYWRTdGF0ZS5VTktOT1dOX1BMVUdJTl9JRCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCBjdHhfcjIuUGx1Z2luTG9hZFN0YXRlLk5PX0VOQUJMRURfUExVR0lOUyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFBsdWdpbnNDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJoMyIsIDE2KTsKICAgICAgICDJtcm1dGV4dCgxLCAiRGF0YSBjb3VsZCBub3QgYmUgbG9hZGVkLiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAicCIpOwogICAgICAgIMm1ybV0ZXh0KDMsICJUaGUgVGVuc29yQm9hcmQgc2VydmVyIG1heSBiZSBkb3duIG9yIGluYWNjZXNzaWJsZS4iKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgInAiKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcig1LCAxMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIGNvbnN0IF9yNSA9IMm1ybVyZWZlcmVuY2UoOCk7CiAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1RlbXBsYXRlT3V0bGV0IiwgX3I1KTsKICAgIH0gfQogICAgZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9uZ190ZW1wbGF0ZV83X3BfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJwIiwgMTkpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImkiKTsKICAgICAgICDJtcm1dGV4dCgyLCAiTG9nIGRpcmVjdG9yeTogIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yMTMuZGF0YUxvY2F0aW9uKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxNyk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtXBpcGUoMiwgImRhdGUiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBQbHVnaW5zQ29tcG9uZW50X25nX3RlbXBsYXRlXzdfcF8zX1RlbXBsYXRlLCA1LCAxLCAicCIsIDE4KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNiA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJMYXN0IHJlbG9hZDogIiwgybXJtXBpcGVCaW5kMigyLCAyLCBjdHhfcjYubGFzdFVwZGF0ZWQsICJtZWRpdW0iKSwgIiIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yNi5kYXRhTG9jYXRpb24pOwogICAgfSB9CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IFBsdWdpbkxvYWRTdGF0ZSA9IHsKICAgICAgICBFTlZJUk9OTUVOVF9GQUlMVVJFX05PVF9GT1VORDogMCwKICAgICAgICBFTlZJUk9OTUVOVF9GQUlMVVJFX1VOS05PV046IDEsCiAgICAgICAgTk9fRU5BQkxFRF9QTFVHSU5TOiAyLAogICAgICAgIFVOS05PV05fUExVR0lOX0lEOiAzLAogICAgICAgIExPQURFRDogNCwKICAgICAgICBMT0FESU5HOiA1LAogICAgfTsKICAgIFBsdWdpbkxvYWRTdGF0ZVtQbHVnaW5Mb2FkU3RhdGUuRU5WSVJPTk1FTlRfRkFJTFVSRV9OT1RfRk9VTkRdID0gJ0VOVklST05NRU5UX0ZBSUxVUkVfTk9UX0ZPVU5EJzsKICAgIFBsdWdpbkxvYWRTdGF0ZVtQbHVnaW5Mb2FkU3RhdGUuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOXSA9ICdFTlZJUk9OTUVOVF9GQUlMVVJFX1VOS05PV04nOwogICAgUGx1Z2luTG9hZFN0YXRlW1BsdWdpbkxvYWRTdGF0ZS5OT19FTkFCTEVEX1BMVUdJTlNdID0gJ05PX0VOQUJMRURfUExVR0lOUyc7CiAgICBQbHVnaW5Mb2FkU3RhdGVbUGx1Z2luTG9hZFN0YXRlLlVOS05PV05fUExVR0lOX0lEXSA9ICdVTktOT1dOX1BMVUdJTl9JRCc7CiAgICBQbHVnaW5Mb2FkU3RhdGVbUGx1Z2luTG9hZFN0YXRlLkxPQURFRF0gPSAnTE9BREVEJzsKICAgIFBsdWdpbkxvYWRTdGF0ZVtQbHVnaW5Mb2FkU3RhdGUuTE9BRElOR10gPSAnTE9BRElORyc7CiAgICBjbGFzcyBQbHVnaW5zQ29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBvbmVudEZhY3RvcnlSZXNvbHZlcgogICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2luUmVnaXN0cnkKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIsIHBsdWdpblJlZ2lzdHJ5KSB7CiAgICAgICAgICAgIHRoaXMuY29tcG9uZW50RmFjdG9yeVJlc29sdmVyID0gY29tcG9uZW50RmFjdG9yeVJlc29sdmVyOwogICAgICAgICAgICB0aGlzLnBsdWdpblJlZ2lzdHJ5ID0gcGx1Z2luUmVnaXN0cnk7CiAgICAgICAgICAgIHRoaXMuZXhwZXJpbWVudFBsdWdpbkhvc3RMaWIgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtZXhwZXJpbWVudGFsLXBsdWdpbi1ob3N0LWxpYicpKSk7CiAgICAgICAgICAgIHRoaXMuUGx1Z2luTG9hZFN0YXRlID0gUGx1Z2luTG9hZFN0YXRlOwogICAgICAgICAgICB0aGlzLkxvYWRpbmdNZWNoYW5pc21UeXBlID0gTG9hZGluZ01lY2hhbmlzbVR5cGU7CiAgICAgICAgICAgIHRoaXMucGx1Z2luSW5zdGFuY2VzID0gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2hvdWxkQ3JlYXRlUGx1Z2luID0gQm9vbGVhbih0aGlzLmFjdGl2ZUtub3duUGx1Z2luICYmCiAgICAgICAgICAgICAgICAhdGhpcy5wbHVnaW5JbnN0YW5jZXMuaGFzKHRoaXMuYWN0aXZlS25vd25QbHVnaW4uaWQpKTsKICAgICAgICAgICAgaWYgKGNoYW5nZVsnYWN0aXZlS25vd25QbHVnaW4nXSAmJiB0aGlzLmFjdGl2ZUtub3duUGx1Z2luKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2QWN0aXZlS25vd25QbHVnaW4gPSBjaGFuZ2VbJ2FjdGl2ZUtub3duUGx1Z2luJ10ucHJldmlvdXNWYWx1ZTsKICAgICAgICAgICAgICAgIGlmIChwcmV2QWN0aXZlS25vd25QbHVnaW4gJiYKICAgICAgICAgICAgICAgICAgICBwcmV2QWN0aXZlS25vd25QbHVnaW4uaWQgIT09IHRoaXMuYWN0aXZlS25vd25QbHVnaW4uaWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGVQbHVnaW4ocHJldkFjdGl2ZUtub3duUGx1Z2luKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChzaG91bGRDcmVhdGVQbHVnaW4pIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGx1Z2luRWxlbWVudCA9IHRoaXMuY3JlYXRlUGx1Z2luKHRoaXMuYWN0aXZlS25vd25QbHVnaW4pOwogICAgICAgICAgICAgICAgICAgIGlmIChwbHVnaW5FbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGx1Z2luSW5zdGFuY2VzLnNldCh0aGlzLmFjdGl2ZUtub3duUGx1Z2luLmlkLCBwbHVnaW5FbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNob3dQbHVnaW4odGhpcy5hY3RpdmVLbm93blBsdWdpbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlS25vd25QbHVnaW4gJiYKICAgICAgICAgICAgICAgIChzaG91bGRDcmVhdGVQbHVnaW4gfHwgY2hhbmdlWydsYXN0VXBkYXRlZCddKSkgewogICAgICAgICAgICAgICAgdGhpcy5yZWxvYWQodGhpcy5hY3RpdmVLbm93blBsdWdpbiwgc2hvdWxkQ3JlYXRlUGx1Z2luKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2luCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoaWRlUGx1Z2luKHBsdWdpbikgewogICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBhY3RpdmUgcGx1Z2luIGRvZXMgbm90IGhhdmUgYSBET00sIGZvciBleGFtcGxlLCBjb3JlIHBsdWdpbiwgdGhlCiAgICAgICAgICAgIC8vIGluc3RhbmNlIGNhbiBiZSBmYWxzeS4KICAgICAgICAgICAgaWYgKCF0aGlzLnBsdWdpbkluc3RhbmNlcy5oYXMocGx1Z2luLmlkKSkKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnN0YW5jZSA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLnBsdWdpbkluc3RhbmNlcy5nZXQocGx1Z2luLmlkKSkpOwogICAgICAgICAgICBPYmplY3QuYXNzaWduKGluc3RhbmNlLnN0eWxlLCB7CiAgICAgICAgICAgICAgICBtYXhIZWlnaHQ6IDAsCiAgICAgICAgICAgICAgICBvdmVyZmxvdzogJ2hpZGRlbicsCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFdlIGZ1cnRoZXIgbWFrZSBjb250YWluZXJzIGludmlzaWJsZS4gU29tZSBlbGVtZW50cyBtYXkgYW5jaG9yIHRvCiAgICAgICAgICAgICAgICAgKiB0aGUgdmlld3BvcnQgaW5zdGVhZCBvZiB0aGUgY29udGFpbmVyLCBpbiB3aGljaCBjYXNlIHNldHRpbmcgdGhlIG1heAogICAgICAgICAgICAgICAgICogaGVpZ2h0IGhlcmUgdG8gMCB3aWxsIG5vdCBoaWRlIHRoZW0uCiAgICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiAnaGlkZGVuJywKICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBsdWdpbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2hvd1BsdWdpbihwbHVnaW4pIHsKICAgICAgICAgICAgLy8gSW4gY2FzZSB0aGUgYWN0aXZlIHBsdWdpbiBkb2VzIG5vdCBoYXZlIGEgRE9NLCBmb3IgZXhhbXBsZSwgY29yZSBwbHVnaW4sIHRoZQogICAgICAgICAgICAvLyBpbnN0YW5jZSBjYW4gYmUgZmFsc3kuCiAgICAgICAgICAgIGlmICghdGhpcy5wbHVnaW5JbnN0YW5jZXMuaGFzKHBsdWdpbi5pZCkpCiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5zdGFuY2UgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5wbHVnaW5JbnN0YW5jZXMuZ2V0KHBsdWdpbi5pZCkpKTsKICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihpbnN0YW5jZS5zdHlsZSwgewogICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiBudWxsLAogICAgICAgICAgICAgICAgb3ZlcmZsb3c6IG51bGwsCiAgICAgICAgICAgICAgICB2aXNpYmlsaXR5OiBudWxsLAogICAgICAgICAgICAgICAgcG9zaXRpb246IG51bGwsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcGx1Z2luCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVQbHVnaW4ocGx1Z2luKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHBsdWdpbkVsZW1lbnQgPSBudWxsOwogICAgICAgICAgICBzd2l0Y2ggKHBsdWdpbi5sb2FkaW5nX21lY2hhbmlzbS50eXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIExvYWRpbmdNZWNoYW5pc21UeXBlLkNVU1RPTV9FTEVNRU5UOiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGN1c3RvbUVsZW1lbnRQbHVnaW4gPSAoLyoqIEB0eXBlIHs/fSAqLyAocGx1Z2luLmxvYWRpbmdfbWVjaGFuaXNtKSk7CiAgICAgICAgICAgICAgICAgICAgcGx1Z2luRWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoY3VzdG9tRWxlbWVudFBsdWdpbi5lbGVtZW50X25hbWUpOwogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAocGx1Z2luRWxlbWVudCkpKS5yZWxvYWRPblJlYWR5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wbHVnaW5zQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuYXBwZW5kQ2hpbGQocGx1Z2luRWxlbWVudCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlIExvYWRpbmdNZWNoYW5pc21UeXBlLklGUkFNRTogewogICAgICAgICAgICAgICAgICAgIHBsdWdpbkVsZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdpZnJhbWUnKTsKICAgICAgICAgICAgICAgICAgICAvLyBJZGVhbGx5IHNob3VsZCB1c2UgdGhlIERPTVNhbml0aXplciBidXQgaXQgaXMgbm90IHVzYWJsZSBpbiBUeXBlU2NyaXB0LgogICAgICAgICAgICAgICAgICAgIHBsdWdpbkVsZW1lbnQuc2V0QXR0cmlidXRlKCdzcmMnLCBgZGF0YS9wbHVnaW5fZW50cnkuaHRtbD9uYW1lPSR7cGx1Z2luLmlkfWApOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZXhwZXJpbWVudFBsdWdpbkhvc3RMaWIucmVnaXN0ZXJQbHVnaW5JZnJhbWUocGx1Z2luRWxlbWVudCwgcGx1Z2luLmlkKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnBsdWdpbnNDb250YWluZXIubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZChwbHVnaW5FbGVtZW50KTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgTG9hZGluZ01lY2hhbmlzbVR5cGUuTkdfQ09NUE9ORU5UOgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuZ0NvbXBvbmVudENsYXNzID0gdGhpcy5wbHVnaW5SZWdpc3RyeS5nZXRDb21wb25lbnQocGx1Z2luLmlkKTsKICAgICAgICAgICAgICAgICAgICBpZiAobmdDb21wb25lbnRDbGFzcykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudEZhY3RvcnkgPSB0aGlzLmNvbXBvbmVudEZhY3RvcnlSZXNvbHZlci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShuZ0NvbXBvbmVudENsYXNzKTsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwbHVnaW5Db21wb25lbnQgPSB0aGlzLm5nUGx1Z2luQ29udGFpbmVyLmNyZWF0ZUNvbXBvbmVudChjb21wb25lbnRGYWN0b3J5KTsKICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luRWxlbWVudCA9IHBsdWdpbkNvbXBvbmVudC5sb2NhdGlvbi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcihgTm8gcmVnaXN0ZXJlZCBBbmd1bGFyIGNvbXBvbmVudCBmb3IgcGx1Z2luOiAke3BsdWdpbi5pZH1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIExvYWRpbmdNZWNoYW5pc21UeXBlLk5PTkU6CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuZXhwZWN0ZWQgcGx1Z2luJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHBsdWdpbkVsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwbHVnaW4KICAgICAgICAgKiBAcGFyYW0gez99IGluaXRpYWxTdGFtcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVsb2FkKHBsdWdpbiwgaW5pdGlhbFN0YW1wKSB7CiAgICAgICAgICAgIGlmICghaW5pdGlhbFN0YW1wICYmIHBsdWdpbi5kaXNhYmxlX3JlbG9hZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWF5YmVEYXNoYm9hcmQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5wbHVnaW5JbnN0YW5jZXMuZ2V0KHBsdWdpbi5pZCkpKTsKICAgICAgICAgICAgaWYgKG1heWJlRGFzaGJvYXJkICYmIG1heWJlRGFzaGJvYXJkLnJlbG9hZCkgewogICAgICAgICAgICAgICAgbWF5YmVEYXNoYm9hcmQucmVsb2FkKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBQbHVnaW5zQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdwbHVnaW5zLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3BsdWdpbnNfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlczogWwogICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBibG9jazsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLnBsdWdpbnMgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICAgIH0KICAgICAgLndhcm5pbmcgewogICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7CiAgICAgICAgYm90dG9tOiAwOwogICAgICAgIGxlZnQ6IDA7CiAgICAgICAgcG9zaXRpb246IGFic29sdXRlOwogICAgICAgIHJpZ2h0OiAwOwogICAgICAgIHRvcDogMDsKICAgICAgfQogICAgICAud2FybmluZy1tZXNzYWdlIHsKICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwOwogICAgICAgIG1heC13aWR0aDogNTQwcHg7CiAgICAgIH0KICAgICAgLmxhc3QtcmVsb2FkLXRpbWUgewogICAgICAgIGZvbnQtc3R5bGU6IGl0YWxpYzsKICAgICAgfQogICAgICAucGx1Z2lucyA6Om5nLWRlZXAgaWZyYW1lIHsKICAgICAgICBib3JkZXI6IDA7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFBsdWdpbnNDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIgfSwKICAgICAgICB7IHR5cGU6IFBsdWdpblJlZ2lzdHJ5TW9kdWxlIH0KICAgIF07CiAgICBQbHVnaW5zQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHBsdWdpbnNDb250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwbHVnaW5Db250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0sCiAgICAgICAgbmdQbHVnaW5Db250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWyduZ1BsdWdpbkNvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBWaWV3Q29udGFpbmVyUmVmIH0sXSB9XSwKICAgICAgICBhY3RpdmVQbHVnaW5JZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYWN0aXZlS25vd25QbHVnaW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBsdWdpbkxvYWRTdGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGF0YUxvY2F0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBsYXN0VXBkYXRlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5zQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQbHVnaW5zQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGx1Z2luUmVnaXN0cnlNb2R1bGUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQbHVnaW5zQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFBsdWdpbnNDb21wb25lbnQsIHNlbGVjdG9yczogW1sicGx1Z2lucy1jb21wb25lbnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gUGx1Z2luc0NvbXBvbmVudF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzAkYSwgdHJ1ZSwgRWxlbWVudFJlZik7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MxJDgsIHRydWUsIFZpZXdDb250YWluZXJSZWYpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgucGx1Z2luc0NvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5uZ1BsdWdpbkNvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGlucHV0czogeyBhY3RpdmVQbHVnaW5JZDogImFjdGl2ZVBsdWdpbklkIiwgYWN0aXZlS25vd25QbHVnaW46ICJhY3RpdmVLbm93blBsdWdpbiIsIHBsdWdpbkxvYWRTdGF0ZTogInBsdWdpbkxvYWRTdGF0ZSIsIGRhdGFMb2NhdGlvbjogImRhdGFMb2NhdGlvbiIsIGxhc3RVcGRhdGVkOiAibGFzdFVwZGF0ZWQiLCBlbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlOiAiZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZSIsIGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZTogImVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZSIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDksIHZhcnM6IDEsIGNvbnN0czogW1sxLCAicGx1Z2lucyJdLCBbInBsdWdpbkNvbnRhaW5lciIsICIiXSwgWyJuZ1BsdWdpbkNvbnRhaW5lciIsICIiXSwgWyJjbGFzcyIsICJ3YXJuaW5nIiwgMywgIm5nU3dpdGNoIiwgNCwgIm5nSWYiXSwgWyJlbnZpcm9ubWVudEZhaWx1cmVEZWZhdWx0VGVtcGxhdGUiLCAiIl0sIFsiZGF0ZUFuZERhdGFMb2NhdGlvbiIsICIiXSwgWzEsICJ3YXJuaW5nIiwgMywgIm5nU3dpdGNoIl0sIFsxLCAid2FybmluZy1tZXNzYWdlIl0sIFs0LCAibmdTd2l0Y2hDYXNlIl0sIFs0LCAibmdUZW1wbGF0ZU91dGxldCJdLCBbMSwgInVua25vd24tcGx1Z2luIl0sIFszLCAibmdUZW1wbGF0ZU91dGxldCJdLCBbMSwgIm5vLWFjdGl2ZS1wbHVnaW4iXSwgWyJocmVmIiwgImh0dHBzOi8vZ2l0aHViLmNvbS90ZW5zb3JmbG93L3RlbnNvcmJvYXJkL2Jsb2IvbWFzdGVyL1JFQURNRS5tZCJdLCBbImhyZWYiLCAiaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvZ2V0X3N0YXJ0ZWQvc3VtbWFyaWVzX2FuZF90ZW5zb3Jib2FyZCJdLCBbImhyZWYiLCAiaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kI215LXRlbnNvcmJvYXJkLWlzbnQtc2hvd2luZy1hbnktZGF0YS13aGF0cy13cm9uZyJdLCBbMSwgImVudmlyb25tZW50LW5vdC1sb2FkZWQiXSwgWzEsICJsYXN0LXJlbG9hZC10aW1lIl0sIFsiY2xhc3MiLCAiZGF0YS1sb2NhdGlvbiIsIDQsICJuZ0lmIl0sIFsxLCAiZGF0YS1sb2NhdGlvbiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBsdWdpbnNDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigyLCBudWxsLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIFBsdWdpbnNDb21wb25lbnRfZGl2XzRfVGVtcGxhdGUsIDYsIDUsICJkaXYiLCAzKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDUsIFBsdWdpbnNDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZSwgNiwgMSwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNCwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDcsIFBsdWdpbnNDb21wb25lbnRfbmdfdGVtcGxhdGVfN19UZW1wbGF0ZSwgNCwgNSwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNSwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5wbHVnaW5Mb2FkU3RhdGUgIT09IGN0eC5QbHVnaW5Mb2FkU3RhdGUuTE9BREVEICYmIGN0eC5wbHVnaW5Mb2FkU3RhdGUgIT09IGN0eC5QbHVnaW5Mb2FkU3RhdGUuTE9BRElORyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdUZW1wbGF0ZU91dGxldF0sIHBpcGVzOiBbRGF0ZVBpcGVdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBwb3NpdGlvbjogcmVsYXRpdmU7XG4gICAgICB9XG4gICAgICAucGx1Z2luc1tfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBoZWlnaHQ6IDEwMCU7XG4gICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgICAgIH1cbiAgICAgIC53YXJuaW5nW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNmZmY7XG4gICAgICAgIGJvdHRvbTogMDtcbiAgICAgICAgbGVmdDogMDtcbiAgICAgICAgcG9zaXRpb246IGFic29sdXRlO1xuICAgICAgICByaWdodDogMDtcbiAgICAgICAgdG9wOiAwO1xuICAgICAgfVxuICAgICAgLndhcm5pbmctbWVzc2FnZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBtYXJnaW46IDgwcHggYXV0byAwO1xuICAgICAgICBtYXgtd2lkdGg6IDU0MHB4O1xuICAgICAgfVxuICAgICAgLmxhc3QtcmVsb2FkLXRpbWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZm9udC1zdHlsZTogaXRhbGljO1xuICAgICAgfVxuICAgICAgLnBsdWdpbnNbX25nY29udGVudC0lQ09NUCVdICAgICBpZnJhbWUge1xuICAgICAgICBib3JkZXI6IDA7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgICAgd2lkdGg6IDEwMCU7XG4gICAgICB9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3BsdWdpbnNfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGFjdGl2ZVBsdWdpbiA9IGNyZWF0ZVNlbGVjdG9yKGdldFBsdWdpbnMsIGdldEFjdGl2ZVBsdWdpbiwgKC8qKgogICAgICogQHBhcmFtIHs/fSBwbHVnaW5zCiAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAocGx1Z2lucywgaWQpID0+IHsKICAgICAgICBpZiAoIWlkIHx8ICFwbHVnaW5zW2lkXSkKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oeyBpZCB9LCBwbHVnaW5zW2lkXSk7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBsYXN0TG9hZGVkVGltZUluTXMgPSBjcmVhdGVTZWxlY3RvcihnZXRQbHVnaW5zTGlzdExvYWRlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBsb2FkU3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChsb2FkU3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gbG9hZFN0YXRlLmxhc3RMb2FkZWRUaW1lSW5NczsKICAgIH0pKTsKICAgIGNsYXNzIFBsdWdpbnNDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlS25vd25QbHVnaW4kID0gdGhpcy5zdG9yZS5zZWxlY3QoYWN0aXZlUGx1Z2luKTsKICAgICAgICAgICAgdGhpcy5hY3RpdmVQbHVnaW5JZCQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVQbHVnaW4pOwogICAgICAgICAgICB0aGlzLnBsdWdpbkxvYWRTdGF0ZSQgPSBjb21iaW5lTGF0ZXN0KHRoaXMuYWN0aXZlS25vd25QbHVnaW4kLCB0aGlzLmFjdGl2ZVBsdWdpbklkJCwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UGx1Z2luc0xpc3RMb2FkZWQpKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2FjdGl2ZVBsdWdpbiwgYWN0aXZlUGx1Z2luSWQsIGxvYWRTdGF0ZV0pID0+IHsKICAgICAgICAgICAgICAgIGlmIChsb2FkU3RhdGUuZmFpbHVyZUNvZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAvLyBEZXNwaXRlIGl0cyAnUGx1Z2lucyctc3BlY2lmaWMgbmFtZSwgZ2V0UGx1Z2luc0xpc3RMb2FkZWQgYWN0dWFsbHkKICAgICAgICAgICAgICAgICAgICAvLyBlbmNhcHN1bGF0ZXMgbXVsdGlwbGUgcmVxdWVzdHMgdG8gbG9hZCBkaWZmZXJlbnQgcGFydHMgb2YgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gZW52aXJvbm1lbnQuCiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRTdGF0ZS5mYWlsdXJlQ29kZSA9PT0gUGx1Z2luc0xpc3RGYWlsdXJlQ29kZS5OT1RfRk9VTkQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBsdWdpbkxvYWRTdGF0ZS5FTlZJUk9OTUVOVF9GQUlMVVJFX05PVF9GT1VORDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQbHVnaW5Mb2FkU3RhdGUuRU5WSVJPTk1FTlRfRkFJTFVSRV9VTktOT1dOOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhY3RpdmVQbHVnaW4gIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1Z2luTG9hZFN0YXRlLkxPQURFRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChsb2FkU3RhdGUubGFzdExvYWRlZFRpbWVJbk1zID09PSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgbG9hZFN0YXRlLnN0YXRlID09PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1Z2luTG9hZFN0YXRlLkxPQURJTkc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlUGx1Z2luSWQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGx1Z2luTG9hZFN0YXRlLlVOS05PV05fUExVR0lOX0lEOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFBsdWdpbkxvYWRTdGF0ZS5OT19FTkFCTEVEX1BMVUdJTlM7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMubGFzdExvYWRlZFRpbWVJbk1zJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGxhc3RMb2FkZWRUaW1lSW5Ncyk7CiAgICAgICAgICAgIHRoaXMuZGF0YUxvY2F0aW9uJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldEVudmlyb25tZW50KS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW52CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZW52KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZW52LmRhdGFfbG9jYXRpb247CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgfQogICAgUGx1Z2luc0NvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAncGx1Z2lucycsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxwbHVnaW5zLWNvbXBvbmVudAogICAgICBbYWN0aXZlS25vd25QbHVnaW5dPSJhY3RpdmVLbm93blBsdWdpbiQgfCBhc3luYyIKICAgICAgW2FjdGl2ZVBsdWdpbklkXT0iYWN0aXZlUGx1Z2luSWQkIHwgYXN5bmMiCiAgICAgIFtkYXRhTG9jYXRpb25dPSJkYXRhTG9jYXRpb24kIHwgYXN5bmMiCiAgICAgIFtsYXN0VXBkYXRlZF09Imxhc3RMb2FkZWRUaW1lSW5NcyQgfCBhc3luYyIKICAgICAgW3BsdWdpbkxvYWRTdGF0ZV09InBsdWdpbkxvYWRTdGF0ZSQgfCBhc3luYyIKICAgICAgW2Vudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGVdPSJlbnZpcm9ubWVudEZhaWx1cmVOb3RGb3VuZFRlbXBsYXRlIgogICAgICBbZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlXT0iZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIgogICAgPjwvcGx1Z2lucy1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IFsncGx1Z2lucy1jb21wb25lbnQgeyBoZWlnaHQ6IDEwMCU7IH0nXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUGx1Z2luc0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBQbHVnaW5zQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luc0NvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFBsdWdpbnNDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGx1Z2luc0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFBsdWdpbnNDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUGx1Z2luc0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJwbHVnaW5zIl1dLCBpbnB1dHM6IHsgZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZTogImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLCBlbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGU6ICJlbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGUiIH0sIGRlY2xzOiA2LCB2YXJzOiAxNywgY29uc3RzOiBbWzMsICJhY3RpdmVLbm93blBsdWdpbiIsICJhY3RpdmVQbHVnaW5JZCIsICJkYXRhTG9jYXRpb24iLCAibGFzdFVwZGF0ZWQiLCAicGx1Z2luTG9hZFN0YXRlIiwgImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLCAiZW52aXJvbm1lbnRGYWlsdXJlVW5rbm93blRlbXBsYXRlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUGx1Z2luc0NvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInBsdWdpbnMtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDQsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJhY3RpdmVLbm93blBsdWdpbiIsIMm1ybVwaXBlQmluZDEoMSwgNywgY3R4LmFjdGl2ZUtub3duUGx1Z2luJCkpKCJhY3RpdmVQbHVnaW5JZCIsIMm1ybVwaXBlQmluZDEoMiwgOSwgY3R4LmFjdGl2ZVBsdWdpbklkJCkpKCJkYXRhTG9jYXRpb24iLCDJtcm1cGlwZUJpbmQxKDMsIDExLCBjdHguZGF0YUxvY2F0aW9uJCkpKCJsYXN0VXBkYXRlZCIsIMm1ybVwaXBlQmluZDEoNCwgMTMsIGN0eC5sYXN0TG9hZGVkVGltZUluTXMkKSkoInBsdWdpbkxvYWRTdGF0ZSIsIMm1ybVwaXBlQmluZDEoNSwgMTUsIGN0eC5wbHVnaW5Mb2FkU3RhdGUkKSkoImVudmlyb25tZW50RmFpbHVyZU5vdEZvdW5kVGVtcGxhdGUiLCBjdHguZW52aXJvbm1lbnRGYWlsdXJlTm90Rm91bmRUZW1wbGF0ZSkoImVudmlyb25tZW50RmFpbHVyZVVua25vd25UZW1wbGF0ZSIsIGN0eC5lbnZpcm9ubWVudEZhaWx1cmVVbmtub3duVGVtcGxhdGUpOwogICAgICAgIH0gfSwgc3R5bGVzOiBbInBsdWdpbnMtY29tcG9uZW50W19uZ2NvbnRlbnQtJUNPTVAlXSB7IGhlaWdodDogMTAwJTsgfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9wbHVnaW5zX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBQbHVnaW5zTW9kdWxlIHsKICAgIH0KICAgIFBsdWdpbnNNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1BsdWdpbnNDb250YWluZXIsIFBsdWdpbnNDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtQbHVnaW5zQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgQ29tbW9uTW9kdWxlLCBQbHVnaW5SZWdpc3RyeU1vZHVsZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFBsdWdpbnNNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGx1Z2luc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFBsdWdpbnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGx1Z2luc01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb3JlTW9kdWxlLCBDb21tb25Nb2R1bGUsIFBsdWdpblJlZ2lzdHJ5TW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShQbHVnaW5zTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1BsdWdpbnNDb250YWluZXIsIFBsdWdpbnNDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29yZU1vZHVsZSwgQ29tbW9uTW9kdWxlLCBQbHVnaW5SZWdpc3RyeU1vZHVsZV0sIGV4cG9ydHM6IFtQbHVnaW5zQ29udGFpbmVyXSB9KTsgfSkoKTsKICAgIMm1ybVzZXRDb21wb25lbnRTY29wZShQbHVnaW5zQ29udGFpbmVyLCBbTmdDbGFzcywgTmdDb21wb25lbnRPdXRsZXQsIE5nRm9yT2YsIE5nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIE5nU3R5bGUsIE5nU3dpdGNoLCBOZ1N3aXRjaENhc2UsIE5nU3dpdGNoRGVmYXVsdCwgTmdQbHVyYWwsIE5nUGx1cmFsQ2FzZSwgUGx1Z2luc0NvbnRhaW5lciwgUGx1Z2luc0NvbXBvbmVudF0sIFtBc3luY1BpcGUsIFVwcGVyQ2FzZVBpcGUsIExvd2VyQ2FzZVBpcGUsIEpzb25QaXBlLCBTbGljZVBpcGUsIERlY2ltYWxQaXBlLCBQZXJjZW50UGlwZSwgVGl0bGVDYXNlUGlwZSwgQ3VycmVuY3lQaXBlLCBEYXRlUGlwZSwgSTE4blBsdXJhbFBpcGUsIEkxOG5TZWxlY3RQaXBlLCBLZXlWYWx1ZVBpcGVdKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9yZWR1Y2VyX2NvbmZpZy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBjb25zb2xlLmxvZyBhbGwgYWN0aW9ucwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvZ2dlcihyZWR1Y2VyKSB7CiAgICAgICAgcmV0dXJuICgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsKICAgICAgICAgICAgY29uc29sZS5ncm91cENvbGxhcHNlZChhY3Rpb24udHlwZSk7CiAgICAgICAgICAgIGNvbnNvbGUubG9nKCdwcmV2IHN0YXRlJywgc3RhdGUpOwogICAgICAgICAgICBjb25zb2xlLmxvZygnYWN0aW9uJywgYWN0aW9uKTsKICAgICAgICAgICAgY29uc29sZS5sb2coJ25leHQgc3RhdGUnLCByZXN1bHQpOwogICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKCk7CiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvZ2dlck1ldGFSZWR1Y2VyRmFjdG9yeSgpIHsKICAgICAgICByZXR1cm4gIWlzRGV2TW9kZSgpCiAgICAgICAgICAgID8gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlZHVjZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZWR1Y2VyKSA9PiAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVkdWNlcihzdGF0ZSwgYWN0aW9uKTsKICAgICAgICAgICAgfSkpCiAgICAgICAgICAgIDogbG9nZ2VyOwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUk9PVF9SRURVQ0VSUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignUm9vdCByZWR1Y2VycyB0b2tlbicsIHsKICAgICAgICBmYWN0b3J5OiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiAoe30pKSwKICAgIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBUaGUgYWN0aW9uIGNhbiBmaXJlIHdoZW4gbm8gcmVxdWVzdHMgYXJlIGFjdHVhbGx5IG1hZGUgKGkuZS4sIGFuIGVtcHR5CiAgICAgKiByZXF1ZXN0ZWRFeHBlcmltZW50SWRzKS4KICAgICAqLwogICAgY29uc3QgZmV0Y2hSdW5zUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbUnVuc10gRmV0Y2ggUnVucyBSZXF1ZXN0ZWQnLCBwcm9wcygpKTsKICAgIC8qKgogICAgICogVGhlIGFjdGlvbiBjYW4gZmlyZSB3aGVuIG5vIHJlcXVlc3RzIGFyZSBhY3R1YWxseSBtYWRlIChpLmUuLCBhbiBlbXB0eQogICAgICogcmVxdWVzdGVkRXhwZXJpbWVudElkcykuCiAgICAgKi8KICAgIGNvbnN0IGZldGNoUnVuc1N1Y2NlZWRlZCA9IGNyZWF0ZUFjdGlvbignW1J1bnNdIEZldGNoIFJ1bnMgU3VjY2VlZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBmZXRjaFJ1bnNGYWlsZWQgPSBjcmVhdGVBY3Rpb24oJ1tSdW5zXSBGZXRjaCBSdW5zIEZhaWxlZCcsIHByb3BzKCkpOwogICAgY29uc3QgcnVuU2VsZWN0aW9uVG9nZ2xlZCA9IGNyZWF0ZUFjdGlvbignW1J1bnNdIFJ1biBTZWxlY3Rpb24gVG9nZ2xlZCcsIHByb3BzKCkpOwogICAgY29uc3QgcnVuUGFnZVNlbGVjdGlvblRvZ2dsZWQgPSBjcmVhdGVBY3Rpb24oJ1tSdW5zXSBSdW4gUGFnZSBTZWxlY3Rpb24gVG9nZ2xlZCcsIHByb3BzKCkpOwogICAgY29uc3QgcnVuc1NlbGVjdEFsbCA9IGNyZWF0ZUFjdGlvbignW1J1bnNdIFJ1bnMgU2VsZWN0IEFsbCcsIHByb3BzKCkpOwogICAgY29uc3QgcnVuU2VsZWN0b3JQYWdpbmF0aW9uT3B0aW9uQ2hhbmdlZCA9IGNyZWF0ZUFjdGlvbignW1J1bnNdIFJ1biBTZWxlY3RvciBQYWdpbmF0aW9uIE9wdGlvbiBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBydW5TZWxlY3RvclNvcnRDaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbUnVuc10gUnVuIFNlbGVjdG9yIFNvcnQgQ2hhbmdlZCcsIHByb3BzKCkpOwogICAgY29uc3QgcnVuU2VsZWN0b3JSZWdleEZpbHRlckNoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tSdW5zXSBSdW4gU2VsZWN0b3IgUmVnZXggRmlsdGVyIENoYW5nZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IHJ1bkNvbG9yQ2hhbmdlZCA9IGNyZWF0ZUFjdGlvbignW1J1bnNdIFJ1biBDb2xvciBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBydW5UYWJsZVNob3duID0gY3JlYXRlQWN0aW9uKCdbUnVuc10gUnVuIFRhYmxlIFNob3duJywgcHJvcHMoKSk7CiAgICBjb25zdCBydW5EaXNjcmV0ZUhwYXJhbUZpbHRlckNoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tSdW5zXSBSdW4gRGlzY3JldGUgSHBhcmFtIEZpbHRlciBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBydW5JbnRlcnZhbEhwYXJhbUZpbHRlckNoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tSdW5zXSBSdW4gSW50ZXJ2YWwgSHBhcmFtIEZpbHRlciBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBydW5NZXRyaWNGaWx0ZXJDaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbUnVuc10gUnVuIE1ldHJpYyBGaWx0ZXIgQ2hhbmdlZCcsIHByb3BzKCkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvZGF0YV9zb3VyY2UvcnVuc19kYXRhX3NvdXJjZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgKiBAcGFyYW0gez99IGV4cGVyaW1lbnRJZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gcnVuVG9SdW5JZCQxKHJ1biwgZXhwZXJpbWVudElkKSB7CiAgICAgICAgcmV0dXJuIGAke2V4cGVyaW1lbnRJZH0vJHtydW59YDsKICAgIH0KICAgIGNsYXNzIFRCUnVuc0RhdGFTb3VyY2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaHR0cAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGh0dHApIHsKICAgICAgICAgICAgdGhpcy5odHRwID0gaHR0cDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoUnVucyhleHBlcmltZW50SWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoJ2RhdGEvcnVucycpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW5zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocnVucykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWQ6IHJ1blRvUnVuSWQkMShydW4sIGV4cGVyaW1lbnRJZCksCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWU6IHJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGEgZHVtbXkgc3RhcnRUaW1lIGZvciBub3csIHVudGlsIHRoZXJlIGlzIGJhY2tlbmQgc3VwcG9ydC4KICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRUaW1lOiAwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaEhwYXJhbXNNZXRhZGF0YShleHBlcmltZW50SWQpIHsKICAgICAgICAgICAgLy8gUmV0dXJuIGEgc3R1YiBpbXBsZW1lbnRhdGlvbi4KICAgICAgICAgICAgcmV0dXJuIG9mKHsKICAgICAgICAgICAgICAgIGhwYXJhbVNwZWNzOiBbXSwKICAgICAgICAgICAgICAgIG1ldHJpY1NwZWNzOiBbXSwKICAgICAgICAgICAgICAgIHJ1blRvSHBhcmFtc0FuZE1ldHJpY3M6IHt9LAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBUQlJ1bnNEYXRhU291cmNlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUQlJ1bnNEYXRhU291cmNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVEJIdHRwQ2xpZW50IH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVEJSdW5zRGF0YVNvdXJjZS7JtWZhYyA9IGZ1bmN0aW9uIFRCUnVuc0RhdGFTb3VyY2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVEJSdW5zRGF0YVNvdXJjZSkoybXJtWluamVjdChUQkh0dHBDbGllbnQpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUQlJ1bnNEYXRhU291cmNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFRCUnVuc0RhdGFTb3VyY2UsIGZhY3Rvcnk6IFRCUnVuc0RhdGFTb3VyY2UuybVmYWMgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcnVucy9kYXRhX3NvdXJjZS9ydW5zX2RhdGFfc291cmNlX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSdW5zRGF0YVNvdXJjZU1vZHVsZSB7CiAgICB9CiAgICBSdW5zRGF0YVNvdXJjZU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJzOiBbeyBwcm92aWRlOiBSdW5zRGF0YVNvdXJjZSwgdXNlQ2xhc3M6IFRCUnVuc0RhdGFTb3VyY2UgfV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc0RhdGFTb3VyY2VNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBSdW5zRGF0YVNvdXJjZU1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zRGF0YVNvdXJjZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFJ1bnNEYXRhU291cmNlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNEYXRhU291cmNlTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFt7IHByb3ZpZGU6IFJ1bnNEYXRhU291cmNlLCB1c2VDbGFzczogVEJSdW5zRGF0YVNvdXJjZSB9XSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9ydW5zL2VmZmVjdHMvcnVuc19lZmZlY3RzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUnVucyBlZmZlY3QgZm9yIGZldGNoaW5nIGRhdGEgZnJvbSB0aGUgYmFja2VuZC4KICAgICAqLwogICAgY2xhc3MgUnVuc0VmZmVjdHMgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9ucyQKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICogQHBhcmFtIHs/fSBydW5zRGF0YVNvdXJjZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGFjdGlvbnMkLCBzdG9yZSwgcnVuc0RhdGFTb3VyY2UpIHsKICAgICAgICAgICAgdGhpcy5hY3Rpb25zJCA9IGFjdGlvbnMkOwogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMucnVuc0RhdGFTb3VyY2UgPSBydW5zRGF0YVNvdXJjZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuc3VyZXMgcnVucyBhcmUgbG9hZGVkIHdoZW4gYSBydW4gdGFibGUgaXMgc2hvd24uCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIEBleHBvcnQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubG9hZFJ1bnNPblJ1blRhYmxlU2hvd24kID0gY3JlYXRlRWZmZWN0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUocnVuVGFibGVTaG93biksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IGV4cGVyaW1lbnRJZHMgfSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXhwZXJpbWVudHNUb0ZldGNoJCA9IHRoaXMuZ2V0RXhwZXJpbWVudHNXaXRoTG9hZFN0YXRlKGV4cGVyaW1lbnRJZHMsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzdGF0ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdGUgPT09IERhdGFMb2FkU3RhdGUuRkFJTEVEIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID09PSBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVyaW1lbnRzVG9GZXRjaCQucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXhwZXJpbWVudElkcykgPT4gISFleHBlcmltZW50SWRzLmxlbmd0aCkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV4cGVyaW1lbnRJZHNUb0JlRmV0Y2hlZAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGV4cGVyaW1lbnRJZHNUb0JlRmV0Y2hlZCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZldGNoQWxsUnVuc0xpc3QoZXhwZXJpbWVudElkcywgZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkKTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pKSkpLCB7IGRpc3BhdGNoOiBmYWxzZSB9KTsKICAgICAgICAgICAgdGhpcy5leHBlcmltZW50c1dpdGhTdGFsZVJ1bnNPblJvdXRlQ2hhbmdlJCA9IHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUobmF2aWdhdGVkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0Um91dGVJZCQxKSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBwcmV2Um91dGVJZF0sIFssIGN1cnJSb3V0ZUlkXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHByZXZSb3V0ZUlkID09PSBjdXJyUm91dGVJZDsKICAgICAgICAgICAgfSkpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50SWRzRnJvbVJvdXRlKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgZXhwZXJpbWVudElkc10pID0+ICEhZXhwZXJpbWVudElkcykpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIGV4cGVyaW1lbnRJZHNdKSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoZXhwZXJpbWVudElkcykpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXhwZXJpbWVudElkcykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhwZXJpbWVudHNXaXRoTG9hZFN0YXRlKGV4cGVyaW1lbnRJZHMsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzdGF0ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiAoc3RhdGUgPT09IERhdGFMb2FkU3RhdGUuRkFJTEVEIHx8IHN0YXRlID09PSBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQpOwogICAgICAgICAgICAgICAgfSkpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXhwZXJpbWVudElkcywgZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkIH07CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmV4cGVyaW1lbnRzV2l0aFN0YWxlUnVuc09uUmVsb2FkJCA9IHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUocmVsb2FkLCBtYW51YWxSZWxvYWQpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50SWRzRnJvbVJvdXRlKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgZXhwZXJpbWVudElkc10pID0+ICEhZXhwZXJpbWVudElkcykpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIGV4cGVyaW1lbnRJZHNdKSA9PiAoLyoqIEB0eXBlIHs/fSAqLyAoZXhwZXJpbWVudElkcykpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXhwZXJpbWVudElkcykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0RXhwZXJpbWVudHNXaXRoTG9hZFN0YXRlKGV4cGVyaW1lbnRJZHMsICgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzdGF0ZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HOwogICAgICAgICAgICAgICAgfSkpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZXhwZXJpbWVudElkcywgZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkIH07CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRmV0Y2hlcyBydW5zIG9uIG5hdmlnYXRpb24gb3IgaW4tYXBwIHJlbG9hZC4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogQGV4cG9ydAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5sb2FkUnVuc09uTmF2aWdhdGlvbk9yUmVsb2FkJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UodGhpcy5leHBlcmltZW50c1dpdGhTdGFsZVJ1bnNPblJvdXRlQ2hhbmdlJCwgdGhpcy5leHBlcmltZW50c1dpdGhTdGFsZVJ1bnNPblJlbG9hZCQpLnBpcGUobWVyZ2VNYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh7IGV4cGVyaW1lbnRJZHMsIGV4cGVyaW1lbnRJZHNUb0JlRmV0Y2hlZCB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hBbGxSdW5zTGlzdChleHBlcmltZW50SWRzLCBleHBlcmltZW50SWRzVG9CZUZldGNoZWQpOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSksIHsgZGlzcGF0Y2g6IGZhbHNlIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRSdW5zTGlzdExvYWRTdGF0ZShleHBlcmltZW50SWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2VsZWN0KGdldFJ1bnNMb2FkU3RhdGUsIHsgZXhwZXJpbWVudElkIH0pLnBpcGUodGFrZSgxKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2FkU3RhdGVNYXRjaGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRFeHBlcmltZW50c1dpdGhMb2FkU3RhdGUoZXhwZXJpbWVudElkcywgbG9hZFN0YXRlTWF0Y2hlcikgewogICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oZXhwZXJpbWVudElkcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVpZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVpZCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0UnVuc0xpc3RMb2FkU3RhdGUoZWlkKTsKICAgICAgICAgICAgfSkpKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbG9hZFN0YXRlcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGxvYWRTdGF0ZXMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBleHBlcmltZW50SWRzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHVudXNlZAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHVudXNlZCwgaW5kZXgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbG9hZFN0YXRlTWF0Y2hlcihsb2FkU3RhdGVzW2luZGV4XS5zdGF0ZSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIElNUE9SVEFOVDogYWN0aW9ucyBhcmUgZGlzcGF0Y2hlZCBldmVuIHdoZW4gdGhlcmUgYXJlIG5vIGV4cGVyaW1lbnRzIHRvCiAgICAgICAgICogZmV0Y2guCiAgICAgICAgICoKICAgICAgICAgKiBPYnNlcnZhYmxlIG9yZ2FuaXphdGlvbjoKICAgICAgICAgKiAxLiBkaXNwYXRjaCByZXF1ZXN0ZWQgYWN0aW9uCiAgICAgICAgICogMi4gbWFrZSByZXF1ZXN0cyBmb3IgZXhwZXJpbWVudHMgdGhhdCByZXF1aXJlIGZldGNoaW5nIHdoaWxlIHdhaXRpbmcgZm9yCiAgICAgICAgICogICAgcnVucyBpZiBhbHJlYWR5IGxvYWRpbmcgYW5kIHJldHVybiBydW5zCiAgICAgICAgICogMy4gY29tYmluZSB0aGUgcmVzdWx0IGZyb20gbG9jYWwgKyBzZXJ2ZXIgd2hlcmUgc2VydmVyIGRhdGEgdGFrYWVzCiAgICAgICAgICogICAgcHJlY2VkZW5jZS4KICAgICAgICAgKiA0LiBkaXNwYXRjaCBzdWNjZWVkZWQgaWYgc3VjY2Vzc2Z1bC4gZWxzZSwgZGlzcGF0Y2ggZmFpbGVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzCiAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzVG9CZUZldGNoZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoQWxsUnVuc0xpc3QoZXhwZXJpbWVudElkcywgZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkKSB7CiAgICAgICAgICAgIHJldHVybiBvZih7IGV4cGVyaW1lbnRJZHMsIGV4cGVyaW1lbnRJZHNUb0JlRmV0Y2hlZCB9KS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGZldGNoUnVuc1JlcXVlc3RlZCh7CiAgICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudElkcywKICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRFeHBlcmltZW50SWRzOiBleHBlcmltZW50SWRzVG9CZUZldGNoZWQsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWlkc1RvQmVGZXRjaGVkID0gbmV3IFNldChleHBlcmltZW50SWRzVG9CZUZldGNoZWQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmV0Y2hPckdldFJ1bnMgPSBleHBlcmltZW50SWRzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV4cGVyaW1lbnRJZAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGV4cGVyaW1lbnRJZCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmIChlaWRzVG9CZUZldGNoZWQuaGFzKGV4cGVyaW1lbnRJZCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmV0Y2hSdW5zRm9yRXhwZXJpbWVudChleHBlcmltZW50SWQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5tYXliZVdhaXRGb3JSdW5zQW5kR2V0UnVucyhleHBlcmltZW50SWQpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKGZldGNoT3JHZXRSdW5zKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bnNBbmRNZWRhdGFMaXN0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocnVuc0FuZE1lZGF0YUxpc3QpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG5ld1J1bnNBbmRNZXRhZGF0YSA9ICgvKiogQHR5cGUgez99ICovICh7fSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcnVuc0ZvckFsbEV4cGVyaW1lbnRzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bnNBbmRNZWRhdGEgb2YgcnVuc0FuZE1lZGF0YUxpc3QpIHsKICAgICAgICAgICAgICAgICAgICBydW5zRm9yQWxsRXhwZXJpbWVudHMucHVzaCguLi5ydW5zQW5kTWVkYXRhLnJ1bnMpOwogICAgICAgICAgICAgICAgICAgIGlmIChydW5zQW5kTWVkYXRhLmZyb21SZW1vdGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgbmV3UnVuc0FuZE1ldGFkYXRhW3J1bnNBbmRNZWRhdGEuZXhwZXJpbWVudElkXSA9IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnM6IHJ1bnNBbmRNZWRhdGEucnVucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhOiBydW5zQW5kTWVkYXRhLm1ldGFkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7IG5ld1J1bnNBbmRNZXRhZGF0YSwgcnVuc0ZvckFsbEV4cGVyaW1lbnRzIH07CiAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IG5ld1J1bnNBbmRNZXRhZGF0YSwgcnVuc0ZvckFsbEV4cGVyaW1lbnRzIH0pID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZmV0Y2hSdW5zU3VjY2VlZGVkKHsKICAgICAgICAgICAgICAgICAgICBleHBlcmltZW50SWRzLAogICAgICAgICAgICAgICAgICAgIG5ld1J1bnNBbmRNZXRhZGF0YSwKICAgICAgICAgICAgICAgICAgICBydW5zRm9yQWxsRXhwZXJpbWVudHMsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSwgY2F0Y2hFcnJvcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXJyb3IKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChlcnJvcikgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChmZXRjaFJ1bnNGYWlsZWQoewogICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRJZHMsCiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRXhwZXJpbWVudElkczogZXhwZXJpbWVudElkc1RvQmVGZXRjaGVkLAogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG9mKG51bGwpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBudWxsKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBtYXliZVdhaXRGb3JSdW5zQW5kR2V0UnVucyhleHBlcmltZW50SWQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2VsZWN0KGdldFJ1bnNMb2FkU3RhdGUsIHsgZXhwZXJpbWVudElkIH0pLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsb2FkU3RhdGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChsb2FkU3RhdGUpID0+IGxvYWRTdGF0ZS5zdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKSksIHRha2UoMSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsb2FkU3RhdGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChsb2FkU3RhdGUpID0+IHsKICAgICAgICAgICAgICAgIGlmIChsb2FkU3RhdGUuc3RhdGUgPT09IERhdGFMb2FkU3RhdGUuRkFJTEVEKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IobmV3IEVycm9yKCdQZW5kaW5nIHJlcXVlc3QgZmFpbGVkJykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG9mKGxvYWRTdGF0ZSk7CiAgICAgICAgICAgIH0pKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVucywgeyBleHBlcmltZW50SWQgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIHJ1bnNdKSA9PiAoeyBmcm9tUmVtb3RlOiBmYWxzZSwgZXhwZXJpbWVudElkLCBydW5zIH0pKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaFJ1bnNGb3JFeHBlcmltZW50KGV4cGVyaW1lbnRJZCkgewogICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4oWwogICAgICAgICAgICAgICAgdGhpcy5ydW5zRGF0YVNvdXJjZS5mZXRjaFJ1bnMoZXhwZXJpbWVudElkKSwKICAgICAgICAgICAgICAgIHRoaXMucnVuc0RhdGFTb3VyY2UuZmV0Y2hIcGFyYW1zTWV0YWRhdGEoZXhwZXJpbWVudElkKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtydW5zLCBtZXRhZGF0YV0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGZyb21SZW1vdGU6IHRydWUsIGV4cGVyaW1lbnRJZCwgcnVucywgbWV0YWRhdGEgfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICB9CiAgICBSdW5zRWZmZWN0cy5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUnVuc0VmZmVjdHMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBY3Rpb25zIH0sCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogUnVuc0RhdGFTb3VyY2UgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zRWZmZWN0cy7JtWZhYyA9IGZ1bmN0aW9uIFJ1bnNFZmZlY3RzX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNFZmZlY3RzKSjJtcm1aW5qZWN0KEFjdGlvbnMpLCDJtcm1aW5qZWN0KFN0b3JlKSwgybXJtWluamVjdChSdW5zRGF0YVNvdXJjZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJ1bnNFZmZlY3RzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFJ1bnNFZmZlY3RzLCBmYWN0b3J5OiBSdW5zRWZmZWN0cy7JtWZhYyB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogVXRpbGl0eSBmb3IgbWFuYWdpbmcgcm91dGVmdWwgc3RhdGVzLiBJdCByZXR1cm5zIHJvdXRlIGNvbnRleHRlZAogICAgICogYGluaXRpYWxTdGF0ZWAgYW5kIGByZWR1Y2Vyc2AgdGhhdCBoZWxwIG1hbmFnZSB0aGUgcm91dGVmdWwgc3RhdGUuCiAgICAgKgogICAgICogQW4gb3B0aW9uYWwgYG9uUm91dGVJZENoYW5nZWRgIGZ1bmN0aW9uIHdpbGwgbW9kaWZ5IHRoZSBzdGF0ZSBhZnRlciBpdAogICAgICogaXMgbG9hZGVkIGZyb20gdGhlIGNhY2hlLgogICAgICoKICAgICAqIEV4YW1wbGUgdXNhZ2U6CiAgICAgKgogICAgICogY29uc3Qge2luaXRpYWxTdGF0ZSwgcmVkdWNlcnM6IHJvdXRlUmVkdWNlcnN9ID0KICAgICAqICAgIGNyZWF0ZVJvdXRlQ29udGV4dGVkU3RhdGUoCiAgICAgKiAgICAgICAge215Um91dGVmdWxTdGF0ZTogMH0sCiAgICAgKiAgICAgICAge25vblJvdXRlZnVsU3RhdGU6ICdvbmUnfSwKICAgICAqICAgICAgICAoc3RhdGUpID0+IHsKICAgICAqICAgICAgICAgIGNvbnNvbGUubG9nKCdSZXNldCBzdGF0ZSB1cG9uIG1vdW50aW5nIGEgbmV3IHJvdXRlJyk7CiAgICAgKiAgICAgICAgICByZXR1cm4ge215Um91dGVmdWxTdGF0ZTogMCwgbm9uUm91dGVmdWxTdGF0ZTogJ29uZSd9OwogICAgICogICAgICAgIH0KICAgICAqICAgICk7CiAgICAgKgogICAgICogZXhwb3J0IGNvbnN0IHJlZHVjZXJzID0gY29tcG9zZVJlZHVjZXJzKHJvdXRlUmVkdWNlcnMsIHJlZHVjZXIpOwogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVSb3V0ZUNvbnRleHRlZFN0YXRlKHJvdXRlZnVsSW5pdGlhbFN0YXRlLCBub25Sb3V0ZWZ1bEluaXRpYWxTdGF0ZSwgb25Sb3V0ZUlkQ2hhbmdlZCkgewogICAgICAgIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhyb3V0ZWZ1bEluaXRpYWxTdGF0ZSk7CiAgICAgICAgY29uc3QgaW5pdGlhbFN0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHJvdXRlZnVsSW5pdGlhbFN0YXRlKSwgbm9uUm91dGVmdWxJbml0aWFsU3RhdGUpLCB7IHByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlOiB7fSB9KTsKICAgICAgICBjb25zdCByZWR1Y2VycyA9IGNyZWF0ZVJlZHVjZXIoe30sIG9uKG5hdmlnYXRlZCwgKHN0YXRlLCB7IGJlZm9yZSwgYWZ0ZXIgfSkgPT4gewogICAgICAgICAgICBjb25zdCBhZnRlclJvdXRlSWQgPSBnZXRSb3V0ZUlkKGFmdGVyLnJvdXRlS2luZCwgYWZ0ZXIucGFyYW1zKTsKICAgICAgICAgICAgY29uc3QgYmVmb3JlUm91dGVJZCA9IGJlZm9yZQogICAgICAgICAgICAgICAgPyBnZXRSb3V0ZUlkKGJlZm9yZS5yb3V0ZUtpbmQsIGJlZm9yZS5wYXJhbXMpCiAgICAgICAgICAgICAgICA6IG51bGw7CiAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlSWRzIGFyZSB0aGUgc2FtZSwgZG8gbm90IG1vZGlmeSB0aGUgc3RhdGUuCiAgICAgICAgICAgIGlmIChiZWZvcmVSb3V0ZUlkID09PSBhZnRlclJvdXRlSWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBsZXQgbmV4dENvbnRleHRlZFN0YXRlQ2FjaGUgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5wcml2YXRlUm91dGVDb250ZXh0ZWRTdGF0ZSk7CiAgICAgICAgICAgIGlmIChiZWZvcmVSb3V0ZUlkKSB7CiAgICAgICAgICAgICAgICBjb25zdCBjdXJyUm91dGVmdWxTdGF0ZSA9IHt9OwogICAgICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2Yga2V5cykgewogICAgICAgICAgICAgICAgICAgIGN1cnJSb3V0ZWZ1bFN0YXRlW2tleV0gPSBzdGF0ZVtrZXldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbmV4dENvbnRleHRlZFN0YXRlQ2FjaGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5leHRDb250ZXh0ZWRTdGF0ZUNhY2hlKSwgeyBbYmVmb3JlUm91dGVJZF06IGN1cnJSb3V0ZWZ1bFN0YXRlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGxldCBuZXh0Um91dGVmdWxTdGF0ZSA9IHN0YXRlLnByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlICYmCiAgICAgICAgICAgICAgICBzdGF0ZS5wcml2YXRlUm91dGVDb250ZXh0ZWRTdGF0ZVthZnRlclJvdXRlSWRdCiAgICAgICAgICAgICAgICA/IHN0YXRlLnByaXZhdGVSb3V0ZUNvbnRleHRlZFN0YXRlW2FmdGVyUm91dGVJZF0KICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgLy8gU2V0IGBuZXh0Um91dGVmdWxTdGF0ZWAgdG8gdGhlIGluaXRpYWxTdGF0ZSB3aGVuIGBiZWZvcmVgCiAgICAgICAgICAgIC8vIGlzIG5vbi1lbXB0eS4gT24gdGhlIGluaXRpYWwgbG9hZCB3aGVuIGBiZWZvcmVgIGlzIG51bGwsIHRoZQogICAgICAgICAgICAvLyBgc3RhdGVgIGNhbiBhbHJlYWR5IGhhdmUgdmFsdWVzIGZyb20gYm9vdHN0cmFwaW5nIGRlZXBsaW5rcyBhbmQgaXQKICAgICAgICAgICAgLy8gc2hvdWxkIG5vdCBvdmVyd3JpdGUgdGhlIHZhbHVlcy4KICAgICAgICAgICAgaWYgKGJlZm9yZVJvdXRlSWQgJiYgbmV4dFJvdXRlZnVsU3RhdGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIG5leHRSb3V0ZWZ1bFN0YXRlID0gcm91dGVmdWxJbml0aWFsU3RhdGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbGV0IG5leHRGdWxsU3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCBuZXh0Um91dGVmdWxTdGF0ZSksIHsgcHJpdmF0ZVJvdXRlQ29udGV4dGVkU3RhdGU6IG5leHRDb250ZXh0ZWRTdGF0ZUNhY2hlIH0pOwogICAgICAgICAgICBpZiAob25Sb3V0ZUlkQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG9uUm91dGVJZENoYW5nZWQobmV4dEZ1bGxTdGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5leHRGdWxsU3RhdGU7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIGluaXRpYWxTdGF0ZSwKICAgICAgICAgICAgcmVkdWNlcnMsCiAgICAgICAgfTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBUeXBlIGRlZmluaXRpb24gb2YgdGhlIFVJIGRhdGEgdGhhdCBzcGFucyBhY3Rpb24sIHN0b3JlLCB2aWV3LAogICAgICogYW5kIGRhdGEgc291cmNlcy4KICAgICAqLwogICAgdmFyIFNvcnREaXJlY3Rpb247CiAgICAoZnVuY3Rpb24gKFNvcnREaXJlY3Rpb24pIHsKICAgICAgICBTb3J0RGlyZWN0aW9uWyJBU0MiXSA9ICJhc2MiOwogICAgICAgIFNvcnREaXJlY3Rpb25bIkRFU0MiXSA9ICJkZXNjIjsKICAgICAgICBTb3J0RGlyZWN0aW9uWyJVTlNFVCJdID0gIiI7CiAgICB9KShTb3J0RGlyZWN0aW9uIHx8IChTb3J0RGlyZWN0aW9uID0ge30pKTsKICAgIHZhciBTZWFyY2hUb2tlbktleTsKICAgIChmdW5jdGlvbiAoU2VhcmNoVG9rZW5LZXkpIHsKICAgICAgICBTZWFyY2hUb2tlbktleVsiVVNFUiJdID0gInVzZXIiOwogICAgICAgIFNlYXJjaFRva2VuS2V5WyJCRUZPUkUiXSA9ICJiZWZvcmUiOwogICAgICAgIFNlYXJjaFRva2VuS2V5WyJBRlRFUiJdID0gImFmdGVyIjsKICAgICAgICBTZWFyY2hUb2tlbktleVsiUkVHRVgiXSA9ICJyZWdleCI7CiAgICB9KShTZWFyY2hUb2tlbktleSB8fCAoU2VhcmNoVG9rZW5LZXkgPSB7fSkpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3QgQ0hBUlRfQ09MT1JfUEFMTEVURSA9IFsKICAgICAgICAnIzQyNTA2NicsCiAgICAgICAgJyMxMmI1Y2InLAogICAgICAgICcjZTUyNTkyJywKICAgICAgICAnI2Y5YWIwMCcsCiAgICAgICAgJyM5MzM0ZTYnLAogICAgICAgICcjN2NiMzQyJywKICAgICAgICAnI2U4NzEwYScsCiAgICBdOwogICAgbGV0IGNvbG9ySW5kZXggPSAwOwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGhleCBjb2xvciBmb3IgY2hhcnRzLgogICAgICovCiAgICBmdW5jdGlvbiBnZXROZXh0Q2hhcnRDb2xvcigpIHsKICAgICAgICBjb25zdCBjb2xvciA9IENIQVJUX0NPTE9SX1BBTExFVEVbY29sb3JJbmRleF07CiAgICAgICAgY29sb3JJbmRleCA9IChjb2xvckluZGV4ICsgMSkgJSBDSEFSVF9DT0xPUl9QQUxMRVRFLmxlbmd0aDsKICAgICAgICByZXR1cm4gY29sb3I7CiAgICB9CgogICAgZnVuY3Rpb24gY29tcG9zZVJlZHVjZXJzKC4uLmFjdGlvblJlZHVjZXJzKSB7CiAgICAgICAgcmV0dXJuIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgICAgIGxldCBpbnRlcm1lZGlhdGVTdGF0ZSA9IHN0YXRlOwogICAgICAgICAgICBmb3IgKGNvbnN0IHJlZHVjZXIgb2YgYWN0aW9uUmVkdWNlcnMpIHsKICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZVN0YXRlID0gcmVkdWNlcihpbnRlcm1lZGlhdGVTdGF0ZSwgYWN0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gaW50ZXJtZWRpYXRlU3RhdGU7CiAgICAgICAgfTsKICAgIH0KCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNvbnN0IGRhdGFJbml0aWFsU3RhdGUgPSB7CiAgICAgICAgcnVuSWRzOiB7fSwKICAgICAgICBydW5JZFRvRXhwSWQ6IHt9LAogICAgICAgIHJ1bk1ldGFkYXRhOiB7fSwKICAgICAgICBydW5zTG9hZFN0YXRlOiB7fSwKICAgICAgICBocGFyYW1BbmRNZXRyaWNTcGVjOiB7fSwKICAgICAgICBzZWxlY3Rpb25TdGF0ZTogbmV3IE1hcCgpLAogICAgfTsKICAgIGNvbnN0IGRhdGFSZWR1Y2VyJDEgPSBjcmVhdGVSZWR1Y2VyKGRhdGFJbml0aWFsU3RhdGUsIG9uKGZldGNoUnVuc1JlcXVlc3RlZCwgKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgICAgICBjb25zdCBuZXh0UnVuc0xvYWRTdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJ1bnNMb2FkU3RhdGUpOwogICAgICAgIGZvciAoY29uc3QgZWlkIG9mIGFjdGlvbi5yZXF1ZXN0ZWRFeHBlcmltZW50SWRzKSB7CiAgICAgICAgICAgIG5leHRSdW5zTG9hZFN0YXRlW2VpZF0gPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oeyBsYXN0TG9hZGVkVGltZUluTXM6IG51bGwgfSwgbmV4dFJ1bnNMb2FkU3RhdGVbZWlkXSksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHJ1bnNMb2FkU3RhdGU6IG5leHRSdW5zTG9hZFN0YXRlIH0pOwogICAgfSksIG9uKGZldGNoUnVuc1N1Y2NlZWRlZCwgKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgICAgICBjb25zdCBuZXh0UnVuSWRzID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucnVuSWRzKTsKICAgICAgICBjb25zdCBuZXh0UnVuTWV0YWRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ydW5NZXRhZGF0YSk7CiAgICAgICAgY29uc3QgbmV4dFJ1bklkVG9FeHBJZCA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJ1bklkVG9FeHBJZCk7CiAgICAgICAgY29uc3QgbmV4dFJ1bnNMb2FkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ydW5zTG9hZFN0YXRlKTsKICAgICAgICBjb25zdCBuZXh0SHBhcmFtQW5kTWV0cmljU3BlYyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmhwYXJhbUFuZE1ldHJpY1NwZWMpOwogICAgICAgIGNvbnN0IG5leHRTZWxlY3Rpb25TdGF0ZSA9IG5ldyBNYXAoc3RhdGUuc2VsZWN0aW9uU3RhdGUpOwogICAgICAgIGZvciAoY29uc3QgZWlkIG9mIE9iamVjdC5rZXlzKGFjdGlvbi5uZXdSdW5zQW5kTWV0YWRhdGEpKSB7CiAgICAgICAgICAgIGNvbnN0IHsgcnVucywgbWV0YWRhdGEgfSA9IGFjdGlvbi5uZXdSdW5zQW5kTWV0YWRhdGFbZWlkXTsKICAgICAgICAgICAgbmV4dFJ1bklkc1tlaWRdID0gcnVucy5tYXAoKHsgaWQgfSkgPT4gaWQpOwogICAgICAgICAgICBuZXh0UnVuc0xvYWRTdGF0ZVtlaWRdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBuZXh0UnVuc0xvYWRTdGF0ZVtlaWRdKSwgeyBsYXN0TG9hZGVkVGltZUluTXM6IERhdGUubm93KCksIHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURFRCB9KTsKICAgICAgICAgICAgZm9yIChjb25zdCBydW4gb2YgcnVucykgewogICAgICAgICAgICAgICAgY29uc3QgaHBhcmFtQW5kTWV0cmljcyA9IG1ldGFkYXRhLnJ1blRvSHBhcmFtc0FuZE1ldHJpY3NbcnVuLmlkXTsKICAgICAgICAgICAgICAgIG5leHRSdW5NZXRhZGF0YVtydW4uaWRdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBydW4pLCB7IGhwYXJhbXM6IGhwYXJhbUFuZE1ldHJpY3MgPyBocGFyYW1BbmRNZXRyaWNzLmhwYXJhbXMgOiBudWxsLCBtZXRyaWNzOiBocGFyYW1BbmRNZXRyaWNzID8gaHBhcmFtQW5kTWV0cmljcy5tZXRyaWNzIDogbnVsbCB9KTsKICAgICAgICAgICAgICAgIG5leHRSdW5JZFRvRXhwSWRbcnVuLmlkXSA9IGVpZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBuZXh0SHBhcmFtQW5kTWV0cmljU3BlY1tlaWRdID0gewogICAgICAgICAgICAgICAgaHBhcmFtczogbWV0YWRhdGEuaHBhcmFtU3BlY3MsCiAgICAgICAgICAgICAgICBtZXRyaWNzOiBtZXRhZGF0YS5tZXRyaWNTcGVjcywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZWlkc0Jhc2VkS2V5ID0gc2VyaWFsaXplRXhwZXJpbWVudElkcyhhY3Rpb24uZXhwZXJpbWVudElkcyk7CiAgICAgICAgaWYgKCFuZXh0U2VsZWN0aW9uU3RhdGUuaGFzKGVpZHNCYXNlZEtleSkpIHsKICAgICAgICAgICAgY29uc3Qgc2VsZWN0aW9uTWFwID0gbmV3IE1hcCgpOwogICAgICAgICAgICBjb25zdCBydW5TZWxlY3RlZCA9IGFjdGlvbi5ydW5zRm9yQWxsRXhwZXJpbWVudHMubGVuZ3RoIDw9CiAgICAgICAgICAgICAgICBNQVhfTlVNX1JVTlNfVE9fRU5BQkxFX0JZX0RFRkFVTFQ7CiAgICAgICAgICAgIGZvciAoY29uc3QgcnVuIG9mIGFjdGlvbi5ydW5zRm9yQWxsRXhwZXJpbWVudHMpIHsKICAgICAgICAgICAgICAgIHNlbGVjdGlvbk1hcC5zZXQocnVuLmlkLCBydW5TZWxlY3RlZCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV4dFNlbGVjdGlvblN0YXRlLnNldChlaWRzQmFzZWRLZXksIHNlbGVjdGlvbk1hcCk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBiZSBuZXcgcnVucyB0aGF0IHdlcmUgcHJldmlvdXNseSB1bnNlZW4uCiAgICAgICAgICAgIC8vIFBvcHVsYXRlIHRoZWlyIHNlbGVjdGlvbiBzdGF0ZXMuCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGlvbk1hcCA9IG5ldyBNYXAobmV4dFNlbGVjdGlvblN0YXRlLmdldChlaWRzQmFzZWRLZXkpKTsKICAgICAgICAgICAgZm9yIChjb25zdCBydW4gb2YgYWN0aW9uLnJ1bnNGb3JBbGxFeHBlcmltZW50cykgewogICAgICAgICAgICAgICAgaWYgKCFzZWxlY3Rpb25NYXAuaGFzKHJ1bi5pZCkpIHsKICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb25NYXAuc2V0KHJ1bi5pZCwgZmFsc2UpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIG5leHRTZWxlY3Rpb25TdGF0ZS5zZXQoZWlkc0Jhc2VkS2V5LCBzZWxlY3Rpb25NYXApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcnVuSWRzOiBuZXh0UnVuSWRzLCBydW5JZFRvRXhwSWQ6IG5leHRSdW5JZFRvRXhwSWQsIHJ1bk1ldGFkYXRhOiBuZXh0UnVuTWV0YWRhdGEsIHJ1bnNMb2FkU3RhdGU6IG5leHRSdW5zTG9hZFN0YXRlLCBocGFyYW1BbmRNZXRyaWNTcGVjOiBuZXh0SHBhcmFtQW5kTWV0cmljU3BlYywgc2VsZWN0aW9uU3RhdGU6IG5leHRTZWxlY3Rpb25TdGF0ZSB9KTsKICAgIH0pLCBvbihmZXRjaFJ1bnNGYWlsZWQsIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgY29uc3QgbmV4dFJ1bnNMb2FkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ydW5zTG9hZFN0YXRlKTsKICAgICAgICBmb3IgKGNvbnN0IGVpZCBvZiBhY3Rpb24ucmVxdWVzdGVkRXhwZXJpbWVudElkcykgewogICAgICAgICAgICBuZXh0UnVuc0xvYWRTdGF0ZVtlaWRdID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgbGFzdExvYWRlZFRpbWVJbk1zOiBudWxsIH0sIG5leHRSdW5zTG9hZFN0YXRlW2VpZF0pLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkZBSUxFRCB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHJ1bnNMb2FkU3RhdGU6IG5leHRSdW5zTG9hZFN0YXRlIH0pOwogICAgfSksIG9uKHJ1blNlbGVjdGlvblRvZ2dsZWQsIChzdGF0ZSwgeyBleHBlcmltZW50SWRzLCBydW5JZCB9KSA9PiB7CiAgICAgICAgdmFyIF9hOwogICAgICAgIGNvbnN0IHN0YXRlS2V5ID0gc2VyaWFsaXplRXhwZXJpbWVudElkcyhleHBlcmltZW50SWRzKTsKICAgICAgICBjb25zdCBuZXh0U2VsZWN0aW9uU3RhdGUgPSBuZXcgTWFwKHN0YXRlLnNlbGVjdGlvblN0YXRlKTsKICAgICAgICBjb25zdCBzdWJTZWxlY3Rpb25TdGF0ZSA9IG5ldyBNYXAoKF9hID0gbmV4dFNlbGVjdGlvblN0YXRlLmdldChzdGF0ZUtleSkpICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IFtdKTsKICAgICAgICBzdWJTZWxlY3Rpb25TdGF0ZS5zZXQocnVuSWQsICFCb29sZWFuKHN1YlNlbGVjdGlvblN0YXRlLmdldChydW5JZCkpKTsKICAgICAgICBuZXh0U2VsZWN0aW9uU3RhdGUuc2V0KHN0YXRlS2V5LCBzdWJTZWxlY3Rpb25TdGF0ZSk7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNlbGVjdGlvblN0YXRlOiBuZXh0U2VsZWN0aW9uU3RhdGUgfSk7CiAgICB9KSwgb24ocnVuUGFnZVNlbGVjdGlvblRvZ2dsZWQsIChzdGF0ZSwgeyBleHBlcmltZW50SWRzLCBydW5JZHMgfSkgPT4gewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBzdGF0ZUtleSA9IHNlcmlhbGl6ZUV4cGVyaW1lbnRJZHMoZXhwZXJpbWVudElkcyk7CiAgICAgICAgY29uc3QgbmV4dFNlbGVjdGlvblN0YXRlID0gbmV3IE1hcChzdGF0ZS5zZWxlY3Rpb25TdGF0ZSk7CiAgICAgICAgY29uc3Qgc3ViU2VsZWN0aW9uU3RhdGUgPSBuZXcgTWFwKChfYSA9IG5leHRTZWxlY3Rpb25TdGF0ZS5nZXQoc3RhdGVLZXkpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSk7CiAgICAgICAgY29uc3QgbmV4dFZhbHVlID0gIXJ1bklkcy5ldmVyeSgocnVuSWQpID0+IHsKICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4oc3ViU2VsZWN0aW9uU3RhdGUuZ2V0KHJ1bklkKSk7CiAgICAgICAgfSk7CiAgICAgICAgZm9yIChjb25zdCBydW5JZCBvZiBydW5JZHMpIHsKICAgICAgICAgICAgc3ViU2VsZWN0aW9uU3RhdGUuc2V0KHJ1bklkLCBuZXh0VmFsdWUpOwogICAgICAgIH0KICAgICAgICBuZXh0U2VsZWN0aW9uU3RhdGUuc2V0KHN0YXRlS2V5LCBzdWJTZWxlY3Rpb25TdGF0ZSk7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNlbGVjdGlvblN0YXRlOiBuZXh0U2VsZWN0aW9uU3RhdGUgfSk7CiAgICB9KSwgb24ocnVuc1NlbGVjdEFsbCwgKHN0YXRlLCB7IGV4cGVyaW1lbnRJZHMgfSkgPT4gewogICAgICAgIHZhciBfYTsKICAgICAgICBjb25zdCBzdGF0ZUtleSA9IHNlcmlhbGl6ZUV4cGVyaW1lbnRJZHMoZXhwZXJpbWVudElkcyk7CiAgICAgICAgY29uc3QgbmV4dFNlbGVjdGlvblN0YXRlID0gbmV3IE1hcChzdGF0ZS5zZWxlY3Rpb25TdGF0ZSk7CiAgICAgICAgY29uc3Qgc3ViU2VsZWN0aW9uU3RhdGUgPSBuZXcgTWFwKChfYSA9IG5leHRTZWxlY3Rpb25TdGF0ZS5nZXQoc3RhdGVLZXkpKSAhPT0gbnVsbCAmJiBfYSAhPT0gdm9pZCAwID8gX2EgOiBbXSk7CiAgICAgICAgZm9yIChjb25zdCBleHBlcmltZW50SWQgb2YgZXhwZXJpbWVudElkcykgewogICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bklkIG9mIHN0YXRlLnJ1bklkc1tleHBlcmltZW50SWRdKSB7CiAgICAgICAgICAgICAgICBzdWJTZWxlY3Rpb25TdGF0ZS5zZXQocnVuSWQsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5leHRTZWxlY3Rpb25TdGF0ZS5zZXQoc3RhdGVLZXksIHN1YlNlbGVjdGlvblN0YXRlKTsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2VsZWN0aW9uU3RhdGU6IG5leHRTZWxlY3Rpb25TdGF0ZSB9KTsKICAgIH0pKTsKICAgIGNvbnN0IHsgaW5pdGlhbFN0YXRlOiB1aUluaXRpYWxTdGF0ZSwgcmVkdWNlcnM6IHVpUm91dGVDb250ZXh0UmVkdWNlcnMsIH0gPSBjcmVhdGVSb3V0ZUNvbnRleHRlZFN0YXRlKHsKICAgICAgICBwYWdpbmF0aW9uT3B0aW9uOiB7CiAgICAgICAgICAgIHBhZ2VJbmRleDogMCwKICAgICAgICAgICAgcGFnZVNpemU6IDEwLAogICAgICAgIH0sCiAgICAgICAgcmVnZXhGaWx0ZXI6ICcnLAogICAgICAgIHNvcnQ6IHsKICAgICAgICAgICAgY29sdW1uOiBudWxsLAogICAgICAgICAgICBkaXJlY3Rpb246IFNvcnREaXJlY3Rpb24uVU5TRVQsCiAgICAgICAgfSwKICAgICAgICBocGFyYW1GaWx0ZXJzOiBuZXcgTWFwKCksCiAgICAgICAgbWV0cmljRmlsdGVyczogbmV3IE1hcCgpLAogICAgICAgIHJ1bkNvbG9yT3ZlcnJpZGU6IG5ldyBNYXAoKSwKICAgIH0sIHsKICAgICAgICBocGFyYW1EZWZhdWx0RmlsdGVyczogbmV3IE1hcCgpLAogICAgICAgIG1ldHJpY0RlZmF1bHRGaWx0ZXJzOiBuZXcgTWFwKCksCiAgICAgICAgZGVmYXVsdFJ1bkNvbG9yOiBuZXcgTWFwKCksCiAgICB9KTsKICAgIGNvbnN0IHVpUmVkdWNlciA9IGNyZWF0ZVJlZHVjZXIodWlJbml0aWFsU3RhdGUsIG9uKHJ1blNlbGVjdG9yUGFnaW5hdGlvbk9wdGlvbkNoYW5nZWQsIChzdGF0ZSwgeyBwYWdlU2l6ZSwgcGFnZUluZGV4IH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcGFnaW5hdGlvbk9wdGlvbjogewogICAgICAgICAgICAgICAgcGFnZVNpemUsCiAgICAgICAgICAgICAgICBwYWdlSW5kZXgsCiAgICAgICAgICAgIH0gfSk7CiAgICB9KSwgb24ocnVuU2VsZWN0b3JSZWdleEZpbHRlckNoYW5nZWQsIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHJlZ2V4RmlsdGVyOiBhY3Rpb24ucmVnZXhTdHJpbmcsIHBhZ2luYXRpb25PcHRpb246IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucGFnaW5hdGlvbk9wdGlvbiksIHsgCiAgICAgICAgICAgICAgICAvLyBSZXNldCB0aGUgcGFnZSBpbmRleCB0byAwIHRvIGVtdWxhdGUgbWF0LXRhYmxlIGJlaGF2aW9yLgogICAgICAgICAgICAgICAgcGFnZUluZGV4OiAwIH0pIH0pOwogICAgfSksIG9uKHJ1blNlbGVjdG9yU29ydENoYW5nZWQsIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvcnQ6IHsKICAgICAgICAgICAgICAgIGNvbHVtbjogYWN0aW9uLmNvbHVtbiwKICAgICAgICAgICAgICAgIGRpcmVjdGlvbjogYWN0aW9uLmRpcmVjdGlvbiwKICAgICAgICAgICAgfSB9KTsKICAgIH0pLCBvbihmZXRjaFJ1bnNTdWNjZWVkZWQsIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgY29uc3QgbmV4dERlZmF1bHRSdW5Db2xvciA9IG5ldyBNYXAoc3RhdGUuZGVmYXVsdFJ1bkNvbG9yKTsKICAgICAgICBhY3Rpb24ucnVuc0ZvckFsbEV4cGVyaW1lbnRzCiAgICAgICAgICAgIC5maWx0ZXIoKHJ1bikgPT4gIUJvb2xlYW4obmV4dERlZmF1bHRSdW5Db2xvci5nZXQocnVuLmlkKSkpCiAgICAgICAgICAgIC5mb3JFYWNoKChydW4pID0+IHsKICAgICAgICAgICAgbmV4dERlZmF1bHRSdW5Db2xvci5zZXQocnVuLmlkLCBnZXROZXh0Q2hhcnRDb2xvcigpKTsKICAgICAgICB9KTsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZGVmYXVsdFJ1bkNvbG9yOiBuZXh0RGVmYXVsdFJ1bkNvbG9yIH0pOwogICAgfSksIG9uKHJ1bkNvbG9yQ2hhbmdlZCwgKHN0YXRlLCB7IHJ1bklkLCBuZXdDb2xvciB9KSA9PiB7CiAgICAgICAgY29uc3QgbmV4dFJ1bkNvbG9yT3ZlcnJpZGUgPSBuZXcgTWFwKHN0YXRlLnJ1bkNvbG9yT3ZlcnJpZGUpOwogICAgICAgIG5leHRSdW5Db2xvck92ZXJyaWRlLnNldChydW5JZCwgbmV3Q29sb3IpOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBydW5Db2xvck92ZXJyaWRlOiBuZXh0UnVuQ29sb3JPdmVycmlkZSB9KTsKICAgIH0pLCBvbihydW5EaXNjcmV0ZUhwYXJhbUZpbHRlckNoYW5nZWQsIChzdGF0ZSwgeyBocGFyYW1OYW1lLCBmaWx0ZXJWYWx1ZXMsIGluY2x1ZGVVbmRlZmluZWQgfSkgPT4gewogICAgICAgIGNvbnN0IGRlZmF1bHRGaWx0ZXIgPSBzdGF0ZS5ocGFyYW1EZWZhdWx0RmlsdGVycy5nZXQoaHBhcmFtTmFtZSk7CiAgICAgICAgaWYgKCFkZWZhdWx0RmlsdGVyKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBocGFyYW1zOiAke2hwYXJhbU5hbWV9YCk7CiAgICAgICAgfQogICAgICAgIGlmIChkZWZhdWx0RmlsdGVyLnR5cGUgPT09IERvbWFpblR5cGUuSU5URVJWQUwpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhcmlhbnQgZXJyb3I6IEhwYXJhbXMgZmlsdGVyIGlzIElOVEVSVkFMIGJ1dCBnb3QgYSAnICsKICAgICAgICAgICAgICAgJ0RJU0NSRVRFIGNoYW5nZWApOwogICAgICAgIH0KICAgICAgICBjb25zdCBleGlzdGluZ0ZpbHRlciA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGVmYXVsdEZpbHRlciksIHN0YXRlLmhwYXJhbUZpbHRlcnMuZ2V0KGhwYXJhbU5hbWUpKTsKICAgICAgICBjb25zdCBuZXdIcGFyYW1GaWx0ZXJzID0gbmV3IE1hcChzdGF0ZS5ocGFyYW1GaWx0ZXJzKTsKICAgICAgICBuZXdIcGFyYW1GaWx0ZXJzLnNldChocGFyYW1OYW1lLCBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGV4aXN0aW5nRmlsdGVyKSwgeyBpbmNsdWRlVW5kZWZpbmVkLAogICAgICAgICAgICBmaWx0ZXJWYWx1ZXMgfSkpOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBocGFyYW1GaWx0ZXJzOiBuZXdIcGFyYW1GaWx0ZXJzIH0pOwogICAgfSksIG9uKHJ1bkludGVydmFsSHBhcmFtRmlsdGVyQ2hhbmdlZCwgKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgICAgICBjb25zdCB7IGhwYXJhbU5hbWUsIGZpbHRlckxvd2VyVmFsdWUsIGZpbHRlclVwcGVyVmFsdWUsIGluY2x1ZGVVbmRlZmluZWQsIH0gPSBhY3Rpb247CiAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IHN0YXRlLmhwYXJhbURlZmF1bHRGaWx0ZXJzLmdldChocGFyYW1OYW1lKTsKICAgICAgICBpZiAoIWRlZmF1bHRGaWx0ZXIpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGhwYXJhbXM6ICR7aHBhcmFtTmFtZX1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXIudHlwZSA9PT0gRG9tYWluVHlwZS5ESVNDUkVURSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEludmFyaWFudCBlcnJvcjogSHBhcmFtcyBmaWx0ZXIgaXMgRElTQ1JFVEUgYnV0IGdvdCBhICcgKwogICAgICAgICAgICAgICAnSU5URVJWQUwgY2hhbmdlYCk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGV4aXN0aW5nRmlsdGVyID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBkZWZhdWx0RmlsdGVyKSwgc3RhdGUuaHBhcmFtRmlsdGVycy5nZXQoaHBhcmFtTmFtZSkpOwogICAgICAgIGNvbnN0IG5ld0hwYXJhbUZpbHRlcnMgPSBuZXcgTWFwKHN0YXRlLmhwYXJhbUZpbHRlcnMpOwogICAgICAgIG5ld0hwYXJhbUZpbHRlcnMuc2V0KGhwYXJhbU5hbWUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmdGaWx0ZXIpLCB7IGluY2x1ZGVVbmRlZmluZWQsCiAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWUsCiAgICAgICAgICAgIGZpbHRlclVwcGVyVmFsdWUgfSkpOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBocGFyYW1GaWx0ZXJzOiBuZXdIcGFyYW1GaWx0ZXJzIH0pOwogICAgfSksIG9uKHJ1bk1ldHJpY0ZpbHRlckNoYW5nZWQsIChzdGF0ZSwgY2hhbmdlKSA9PiB7CiAgICAgICAgY29uc3QgeyBtZXRyaWNUYWcsIGZpbHRlckxvd2VyVmFsdWUsIGZpbHRlclVwcGVyVmFsdWUsIGluY2x1ZGVVbmRlZmluZWQsIH0gPSBjaGFuZ2U7CiAgICAgICAgY29uc3QgZGVmYXVsdEZpbHRlciA9IHN0YXRlLm1ldHJpY0RlZmF1bHRGaWx0ZXJzLmdldChtZXRyaWNUYWcpOwogICAgICAgIGlmICghZGVmYXVsdEZpbHRlcikgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gbWV0cmljOiAke21ldHJpY1RhZ31gKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgZXhpc3RpbmdGaWx0ZXIgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRlZmF1bHRGaWx0ZXIpLCBzdGF0ZS5tZXRyaWNGaWx0ZXJzLmdldChtZXRyaWNUYWcpKTsKICAgICAgICBjb25zdCBuZXdNZXRyaWNGaWx0ZXJzID0gbmV3IE1hcChzdGF0ZS5tZXRyaWNGaWx0ZXJzKTsKICAgICAgICBuZXdNZXRyaWNGaWx0ZXJzLnNldChtZXRyaWNUYWcsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZXhpc3RpbmdGaWx0ZXIpLCB7IGZpbHRlckxvd2VyVmFsdWUsCiAgICAgICAgICAgIGZpbHRlclVwcGVyVmFsdWUsCiAgICAgICAgICAgIGluY2x1ZGVVbmRlZmluZWQgfSkpOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBtZXRyaWNGaWx0ZXJzOiBuZXdNZXRyaWNGaWx0ZXJzIH0pOwogICAgfSksIAogICAgLyoqCiAgICAgKiBTZXRzIGRlZmF1bHQgZmlsdGVyIHZhbHVlcy4KICAgICAqCiAgICAgKiBJbXBsZW1lbnRhdGlvbiBub3RlOiBocGFyYW0gdmFsdWVzIGFyZSBkZWZpbmVkIGFzIHBhcnQgb2YgdGhlIHNwZWMgYnV0CiAgICAgKiBtZXRyaWNzIGFyZSBkZWZpbmVkIHdpdGggdGhlIGBydW5Ub0hwYXJhbXNBbmRNZXRyaWNzYC4gV2UgbmVlZCB0byBjb2xsZWN0CiAgICAgKiBhbGwgdGhlIHZhbHVlcyBmb3IgbWV0cmljcywgdGhlbiBjb21wdXRlIHRoZSBib3VuZCB0byBjcmVhdGUgdGhlIGRlZmF1bHQKICAgICAqIGZpbHRlciB2YWx1ZS4gV2hlbiB0aGUgbWV0cmljIHZhbHVlcyBhcmUgbWlzc2luZywgd2Ugc2V0IHRoZSBib3VuZCB0byAoMCwKICAgICAqIDEpLgogICAgICovCiAgICBvbihmZXRjaFJ1bnNTdWNjZWVkZWQsIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgdmFyIF9hLCBfYiwgX2MsIF9kOwogICAgICAgIGlmIChPYmplY3Qua2V5cyhhY3Rpb24ubmV3UnVuc0FuZE1ldGFkYXRhKS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICBjb25zdCBuZXdIcGFyYW1GaWx0ZXJzID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IG5ld01ldHJpY0ZpbHRlcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgY29uc3QgZGlzY3JldGVIcGFyYW1zID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IGludGVydmFsSHBhcmFtcyA9IG5ldyBNYXAoKTsKICAgICAgICAvLyBBcmJpdHJhcnkgb3JkZXJlZCBjb2xsZWN0aW9uIG9mIG1ldHJpYyB2YWx1ZXMgY29sbGVjdGVkIGFjcm9zcwogICAgICAgIC8vIGV4cGVyaW1lbnRzIGFuZCBydW5zIHRvIGNvbXB1dGUgZXh0ZW50cyBvZiBtZXRyaWNzLgogICAgICAgIGNvbnN0IG1ldHJpY1ZhbHVlTWluQW5kTWF4ID0gbmV3IE1hcCgpOwogICAgICAgIGNvbnN0IG1ldHJpY1RhZ3MgPSBuZXcgU2V0KCk7CiAgICAgICAgZm9yIChjb25zdCBlaWQgb2YgT2JqZWN0LmtleXMoYWN0aW9uLm5ld1J1bnNBbmRNZXRhZGF0YSkpIHsKICAgICAgICAgICAgY29uc3QgeyBydW5zLCBtZXRhZGF0YSB9ID0gYWN0aW9uLm5ld1J1bnNBbmRNZXRhZGF0YVtlaWRdOwogICAgICAgICAgICAvLyBUYWJ1bGF0ZSBhbGwgdGhlIG1ldHJpYyB2YWx1ZXMgZnJvbSBydW5zLgogICAgICAgICAgICBmb3IgKGNvbnN0IHJ1biBvZiBydW5zKSB7CiAgICAgICAgICAgICAgICBjb25zdCBocGFyYW1BbmRNZXRyaWNzID0gbWV0YWRhdGEucnVuVG9IcGFyYW1zQW5kTWV0cmljc1tydW4uaWRdOwogICAgICAgICAgICAgICAgaWYgKCFocGFyYW1BbmRNZXRyaWNzKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBocGFyYW1BbmRNZXRyaWNzLm1ldHJpY3MpIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtaW5BbmRNYXggPSBtZXRyaWNWYWx1ZU1pbkFuZE1heC5nZXQobWV0cmljLnRhZyk7CiAgICAgICAgICAgICAgICAgICAgbWV0cmljVmFsdWVNaW5BbmRNYXguc2V0KG1ldHJpYy50YWcsIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBtaW5BbmRNYXgKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gTWF0aC5taW4obWluQW5kTWF4Lm1pbiwgbWV0cmljLnZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBtZXRyaWMudmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1heDogbWluQW5kTWF4CiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IE1hdGgubWF4KG1pbkFuZE1heC5tYXgsIG1ldHJpYy52YWx1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbWV0cmljLnZhbHVlLAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlY29yZCBhbmQgY29tYmluZSBhbGwgaHBhcmFtIHNwZWNzIChtdWx0aXBsZSBleHBlcmltZW50cyBjYW4KICAgICAgICAgICAgLy8gaGF2ZSBocGFyYW1zIG9mIHNhbWUgbmFtZSBidXQgZGlzam9pbnQgc2V0IG9mIGRvbWFpbikuCiAgICAgICAgICAgIGZvciAoY29uc3QgeyBuYW1lLCBkb21haW4gfSBvZiBtZXRhZGF0YS5ocGFyYW1TcGVjcykgewogICAgICAgICAgICAgICAgaWYgKGRvbWFpbi50eXBlID09PSBEb21haW5UeXBlLkRJU0NSRVRFKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gZGlzY3JldGVIcGFyYW1zLmdldChuYW1lKSB8fCBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCB2YWx1ZSBvZiBkb21haW4udmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcy5hZGQodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBkaXNjcmV0ZUhwYXJhbXMuc2V0KG5hbWUsIHZhbHVlcyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGludGVydmFsSHBhcmFtcy5nZXQobmFtZSk7CiAgICAgICAgICAgICAgICAgICAgaW50ZXJ2YWxIcGFyYW1zLnNldChuYW1lLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1pblZhbHVlOiBleGlzdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1pbihkb21haW4ubWluVmFsdWUsIGV4aXN0aW5nLm1pblZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkb21haW4ubWluVmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgIG1heFZhbHVlOiBleGlzdGluZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNYXRoLm1heChkb21haW4ubWF4VmFsdWUsIGV4aXN0aW5nLm1heFZhbHVlKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkb21haW4ubWF4VmFsdWUsCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChjb25zdCBtZXRyaWNTcGVjIG9mIG1ldGFkYXRhLm1ldHJpY1NwZWNzKSB7CiAgICAgICAgICAgICAgICBtZXRyaWNUYWdzLmFkZChtZXRyaWNTcGVjLnRhZyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgdmFsdWVzXSBvZiBkaXNjcmV0ZUhwYXJhbXMpIHsKICAgICAgICAgICAgbmV3SHBhcmFtRmlsdGVycy5zZXQobmFtZSwgewogICAgICAgICAgICAgICAgdHlwZTogRG9tYWluVHlwZS5ESVNDUkVURSwKICAgICAgICAgICAgICAgIGluY2x1ZGVVbmRlZmluZWQ6IHRydWUsCiAgICAgICAgICAgICAgICBwb3NzaWJsZVZhbHVlczogWy4uLnZhbHVlc10sCiAgICAgICAgICAgICAgICBmaWx0ZXJWYWx1ZXM6IFsuLi52YWx1ZXNdLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgZm9yIChjb25zdCBbbmFtZSwgeyBtaW5WYWx1ZSwgbWF4VmFsdWUgfV0gb2YgaW50ZXJ2YWxIcGFyYW1zKSB7CiAgICAgICAgICAgIG5ld0hwYXJhbUZpbHRlcnMuc2V0KG5hbWUsIHsKICAgICAgICAgICAgICAgIHR5cGU6IERvbWFpblR5cGUuSU5URVJWQUwsCiAgICAgICAgICAgICAgICBpbmNsdWRlVW5kZWZpbmVkOiB0cnVlLAogICAgICAgICAgICAgICAgbWluVmFsdWUsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZSwKICAgICAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWU6IG1pblZhbHVlLAogICAgICAgICAgICAgICAgZmlsdGVyVXBwZXJWYWx1ZTogbWF4VmFsdWUsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBmb3IgKGNvbnN0IG1ldHJpY1RhZyBvZiBtZXRyaWNUYWdzKSB7CiAgICAgICAgICAgIGNvbnN0IG1pbkFuZE1heCA9IG1ldHJpY1ZhbHVlTWluQW5kTWF4LmdldChtZXRyaWNUYWcpOwogICAgICAgICAgICBuZXdNZXRyaWNGaWx0ZXJzLnNldChtZXRyaWNUYWcsIHsKICAgICAgICAgICAgICAgIHR5cGU6IERvbWFpblR5cGUuSU5URVJWQUwsCiAgICAgICAgICAgICAgICBpbmNsdWRlVW5kZWZpbmVkOiB0cnVlLAogICAgICAgICAgICAgICAgbWluVmFsdWU6IChfYSA9IG1pbkFuZE1heCA9PT0gbnVsbCB8fCBtaW5BbmRNYXggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1pbkFuZE1heC5taW4pICE9PSBudWxsICYmIF9hICE9PSB2b2lkIDAgPyBfYSA6IDAsCiAgICAgICAgICAgICAgICBtYXhWYWx1ZTogKF9iID0gbWluQW5kTWF4ID09PSBudWxsIHx8IG1pbkFuZE1heCA9PT0gdm9pZCAwID8gdm9pZCAwIDogbWluQW5kTWF4Lm1heCkgIT09IG51bGwgJiYgX2IgIT09IHZvaWQgMCA/IF9iIDogMCwKICAgICAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWU6IChfYyA9IG1pbkFuZE1heCA9PT0gbnVsbCB8fCBtaW5BbmRNYXggPT09IHZvaWQgMCA/IHZvaWQgMCA6IG1pbkFuZE1heC5taW4pICE9PSBudWxsICYmIF9jICE9PSB2b2lkIDAgPyBfYyA6IDAsCiAgICAgICAgICAgICAgICBmaWx0ZXJVcHBlclZhbHVlOiAoX2QgPSBtaW5BbmRNYXggPT09IG51bGwgfHwgbWluQW5kTWF4ID09PSB2b2lkIDAgPyB2b2lkIDAgOiBtaW5BbmRNYXgubWF4KSAhPT0gbnVsbCAmJiBfZCAhPT0gdm9pZCAwID8gX2QgOiAwLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGhwYXJhbURlZmF1bHRGaWx0ZXJzOiBuZXdIcGFyYW1GaWx0ZXJzLCBtZXRyaWNEZWZhdWx0RmlsdGVyczogbmV3TWV0cmljRmlsdGVycyB9KTsKICAgIH0pKTsKICAgIGNvbnN0IHJvdXRlU3RhdGVmdWxVaVJlZHVjZXJzID0gY29tcG9zZVJlZHVjZXJzKHVpUmVkdWNlciwgdWlSb3V0ZUNvbnRleHRSZWR1Y2Vycyk7CiAgICAvKioKICAgICAqIFJlZHVjZXJzIGZvciB0aGUgZXhwZXJpbWVudHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZHVjZXJzJDUoc3RhdGUsIGFjdGlvbikgewogICAgICAgIHJldHVybiBjb21iaW5lUmVkdWNlcnMoewogICAgICAgICAgICBkYXRhOiBkYXRhUmVkdWNlciQxLAogICAgICAgICAgICB1aTogcm91dGVTdGF0ZWZ1bFVpUmVkdWNlcnMsCiAgICAgICAgfSkoc3RhdGUsIGFjdGlvbik7CiAgICB9CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IE1vZHVsZSBmb3IgcnVucy4KICAgICAqCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvcnVuc19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhbGVydEFjdGlvblByb3ZpZGVyKCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGFjdGlvbkNyZWF0b3I6IGZldGNoUnVuc0ZhaWxlZCwKICAgICAgICAgICAgICAgIGFsZXJ0RnJvbUFjdGlvbjogKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxvY2FsaXplZE1lc3NhZ2U6ICdGYWlsZWQgdG8gZmV0Y2ggcnVucycgfTsKICAgICAgICAgICAgICAgIH0pLAogICAgICAgICAgICB9LAogICAgICAgIF07CiAgICB9CiAgICBjbGFzcyBSdW5zTW9kdWxlIHsKICAgIH0KICAgIFJ1bnNNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShSVU5TX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQ1KSwKICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtSdW5zRWZmZWN0c10pLAogICAgICAgICAgICAgICAgICAgICAgICBSdW5zRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgQWxlcnRBY3Rpb25Nb2R1bGUucmVnaXN0ZXJBbGVydEFjdGlvbnMoYWxlcnRBY3Rpb25Qcm92aWRlciksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogUnVuc01vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUnVuc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSdW5zTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShSVU5TX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQ1KSwKICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbUnVuc0VmZmVjdHNdKSwKICAgICAgICAgICAgICAgIFJ1bnNEYXRhU291cmNlTW9kdWxlLAogICAgICAgICAgICAgICAgQWxlcnRBY3Rpb25Nb2R1bGUucmVnaXN0ZXJBbGVydEFjdGlvbnMoYWxlcnRBY3Rpb25Qcm92aWRlciksCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoUnVuc01vZHVsZSwgeyBpbXBvcnRzOiBbU3RvcmVGZWF0dXJlTW9kdWxlLCBFZmZlY3RzRmVhdHVyZU1vZHVsZSwgUnVuc0RhdGFTb3VyY2VNb2R1bGUsIEFsZXJ0QWN0aW9uTW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9yZWxvYWRlci9yZWxvYWRlcl9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUmVsb2FkZXJDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKiBAcGFyYW0gez99IGRvY3VtZW50CiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUsIGRvY3VtZW50KSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgICAgICB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSA9IHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlSW1wbC5iaW5kKHRoaXMpOwogICAgICAgICAgICB0aGlzLnJlbG9hZEVuYWJsZWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRSZWxvYWRFbmFibGVkKSk7CiAgICAgICAgICAgIHRoaXMucmVsb2FkUGVyaW9kSW5NcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldFJlbG9hZFBlcmlvZEluTXMpKTsKICAgICAgICAgICAgdGhpcy5yZWxvYWRUaW1lcklkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5taXNzZWRBdXRvUmVsb2FkID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMub25WaXNpYmlsaXR5Q2hhbmdlKTsKICAgICAgICAgICAgY29tYmluZUxhdGVzdCh0aGlzLnJlbG9hZEVuYWJsZWQkLnBpcGUoZGlzdGluY3RVbnRpbENoYW5nZWQoKSksIHRoaXMucmVsb2FkUGVyaW9kSW5NcyQucGlwZShkaXN0aW5jdFVudGlsQ2hhbmdlZCgpKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbZW5hYmxlZCwgcmVsb2FkUGVyaW9kSW5Nc10pID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuY2FuY2VsTG9hZCgpOwogICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYWQoKC8qKiBAdHlwZSB7P30gKi8gKHJlbG9hZFBlcmlvZEluTXMpKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVmlzaWJpbGl0eUNoYW5nZUltcGwoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRvY3VtZW50LnZpc2liaWxpdHlTdGF0ZSA9PT0gJ3Zpc2libGUnICYmIHRoaXMubWlzc2VkQXV0b1JlbG9hZCkgewogICAgICAgICAgICAgICAgdGhpcy5taXNzZWRBdXRvUmVsb2FkID0gZmFsc2U7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlbG9hZCgpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmVsb2FkUGVyaW9kSW5NcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbG9hZChyZWxvYWRQZXJpb2RJbk1zKSB7CiAgICAgICAgICAgIHRoaXMucmVsb2FkVGltZXJJZCA9IHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZG9jdW1lbnQudmlzaWJpbGl0eVN0YXRlID09PSAndmlzaWJsZScpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJlbG9hZCgpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRoaXMubWlzc2VkQXV0b1JlbG9hZCA9IHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmxvYWQocmVsb2FkUGVyaW9kSW5Ncyk7CiAgICAgICAgICAgIH0pLCByZWxvYWRQZXJpb2RJbk1zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNhbmNlbExvYWQoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbG9hZFRpbWVySWQgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnJlbG9hZFRpbWVySWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMucmVsb2FkVGltZXJJZCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuY2FuY2VsTG9hZCgpOwogICAgICAgICAgICB0aGlzLmRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3Zpc2liaWxpdHljaGFuZ2UnLCB0aGlzLm9uVmlzaWJpbGl0eUNoYW5nZSk7CiAgICAgICAgfQogICAgfQogICAgUmVsb2FkZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3JlbG9hZGVyJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogJycsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJlbG9hZGVyQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfSwKICAgICAgICB7IHR5cGU6IERvY3VtZW50LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSZWxvYWRlckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFJlbG9hZGVyQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlbG9hZGVyQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmVsb2FkZXJDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUmVsb2FkZXJDb21wb25lbnQsIHNlbGVjdG9yczogW1sicmVsb2FkZXIiXV0sIGRlY2xzOiAwLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUmVsb2FkZXJDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyB9LCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcmVsb2FkZXIvcmVsb2FkZXJfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJlbG9hZGVyTW9kdWxlIHsKICAgIH0KICAgIFJlbG9hZGVyTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtSZWxvYWRlckNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW1JlbG9hZGVyQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSZWxvYWRlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFJlbG9hZGVyTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJlbG9hZGVyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUmVsb2FkZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmVsb2FkZXJNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShSZWxvYWRlck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtSZWxvYWRlckNvbXBvbmVudF0sIGV4cG9ydHM6IFtSZWxvYWRlckNvbXBvbmVudF0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvdGJfd3JhcHBlci90Yl93cmFwcGVyX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBUZW5zb3JCb2FyZFdyYXBwZXJDb21wb25lbnQgewogICAgfQogICAgVGVuc29yQm9hcmRXcmFwcGVyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0ZW5zb3Jib2FyZC13cmFwcGVyLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxwbHVnaW5zIGNsYXNzPSJwbHVnaW5zIj48L3BsdWdpbnM+CiAgICA8cmVsb2FkZXI+PC9yZWxvYWRlcj4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlczogWwogICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CgogICAgICAucGx1Z2lucyB7CiAgICAgICAgZmxleDogMSAxOwogICAgICAgIG92ZXJmbG93OiBhdXRvOwogICAgICAgIHBvc2l0aW9uOiByZWxhdGl2ZTsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFRlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZW5zb3JCb2FyZFdyYXBwZXJDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGVuc29yQm9hcmRXcmFwcGVyQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFRlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0ZW5zb3Jib2FyZC13cmFwcGVyLWNvbXBvbmVudCJdXSwgZGVjbHM6IDIsIHZhcnM6IDAsIGNvbnN0czogW1sxLCAicGx1Z2lucyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFRlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInBsdWdpbnMiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMSwgInJlbG9hZGVyIik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbUGx1Z2luc0NvbnRhaW5lciwgUmVsb2FkZXJDb21wb25lbnRdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH1cblxuICAgICAgLnBsdWdpbnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleDogMSAxO1xuICAgICAgICBvdmVyZmxvdzogYXV0bztcbiAgICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xuICAgICAgfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvdGJfd3JhcHBlci90Yl93cmFwcGVyX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFByb3ZpZGVzIHRoZSB3cmFwcGVyIGNvbXBvbmVudCB0aGF0IHJlbmRlcnMgdGhlIG1haW4gZGFzaGJvYXJkIHBhZ2UuCiAgICAgKi8KICAgIGNsYXNzIFRlbnNvckJvYXJkV3JhcHBlck1vZHVsZSB7CiAgICB9CiAgICBUZW5zb3JCb2FyZFdyYXBwZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1RlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUGx1Z2luc01vZHVsZSwgUmVsb2FkZXJNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtUZW5zb3JCb2FyZFdyYXBwZXJDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogW1RlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGVuc29yQm9hcmRXcmFwcGVyTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGVuc29yQm9hcmRXcmFwcGVyTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRlbnNvckJvYXJkV3JhcHBlck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRlbnNvckJvYXJkV3JhcHBlck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZW5zb3JCb2FyZFdyYXBwZXJNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBQbHVnaW5zTW9kdWxlLCBSZWxvYWRlck1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVGVuc29yQm9hcmRXcmFwcGVyTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1RlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudF0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFBsdWdpbnNNb2R1bGUsIFJlbG9hZGVyTW9kdWxlXSwgZXhwb3J0czogW1RlbnNvckJvYXJkV3JhcHBlckNvbXBvbmVudF0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9kYXRhX3NvdXJjZS90ZmRiZzJfZGF0YV9zb3VyY2UudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDb252ZXJ0cyB0aGUgYXJyYXkgcmVwcmVzZW50YXRpb24gb2YgYSBzdGFjayBmcmFtZSBpbnRvIHRoZSBvYmplY3QKICAgICAqIHJlcHJlc2VudGF0aW9uLgogICAgICogQHBhcmFtIHs/fSBhcnJheQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gc3RhY2tGcmFtZUFzQXJyYXlUb1N0YWNrRnJhbWUoYXJyYXkpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBob3N0X25hbWU6IGFycmF5WzBdLAogICAgICAgICAgICBmaWxlX3BhdGg6IGFycmF5WzFdLAogICAgICAgICAgICBsaW5lbm86IGFycmF5WzJdLAogICAgICAgICAgICBmdW5jdGlvbl9uYW1lOiBhcnJheVszXSwKICAgICAgICB9OwogICAgfQogICAgY2xhc3MgVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaHR0cAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGh0dHApIHsKICAgICAgICAgICAgdGhpcy5odHRwID0gaHR0cDsKICAgICAgICAgICAgdGhpcy5odHRwUGF0aFByZWZpeCA9ICdkYXRhL3BsdWdpbi9kZWJ1Z2dlci12Mic7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hSdW5zKCkgewogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBPbmNlIHRoZSBiYWNrZW5kIHVzZXMgYW4gRGF0YVByb3ZpZGVyIHRoYXQgdW5pZmllcyB0ZmRiZyBhbmQKICAgICAgICAgICAgLy8gbm9uLXRmZGJnIHBsdWdpbnMsIHN3aXRjaCB0byB1c2luZyBgdGZfYmFja2VuZC5ydW5TdG9yZS5yZWZyZXNoKClgLgogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9ydW5zJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICogQHBhcmFtIHs/fSBiZWdpbgogICAgICAgICAqIEBwYXJhbSB7P30gZW5kCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHMocnVuLCBiZWdpbiwgZW5kKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL2V4ZWN1dGlvbi9kaWdlc3RzJywgewogICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgICAgIGJlZ2luOiBTdHJpbmcoYmVnaW4pLAogICAgICAgICAgICAgICAgICAgIGVuZDogU3RyaW5nKGVuZCksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgKiBAcGFyYW0gez99IGJlZ2luCiAgICAgICAgICogQHBhcmFtIHs/fSBlbmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoRXhlY3V0aW9uRGF0YShydW4sIGJlZ2luLCBlbmQpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvZXhlY3V0aW9uL2RhdGEnLCB7CiAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICBydW4sCiAgICAgICAgICAgICAgICAgICAgYmVnaW46IFN0cmluZyhiZWdpbiksCiAgICAgICAgICAgICAgICAgICAgZW5kOiBTdHJpbmcoZW5kKSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAqIEBwYXJhbSB7P30gYmVnaW4KICAgICAgICAgKiBAcGFyYW0gez99IGVuZAogICAgICAgICAqIEBwYXJhbSB7Pz19IHRyYWNlX2lkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaEdyYXBoRXhlY3V0aW9uRGlnZXN0cyhydW4sIGJlZ2luLCBlbmQsIHRyYWNlX2lkKSB7CiAgICAgICAgICAgIGlmICh0cmFjZV9pZCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3RyYWNlX2lkIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgZmV0Y2hHcmFwaEV4ZWN1dGlvbkRpZ2VzdHMoKSB5ZXQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9ncmFwaF9leGVjdXRpb24vZGlnZXN0cycsIHsKICAgICAgICAgICAgICAgIHBhcmFtczogewogICAgICAgICAgICAgICAgICAgIHJ1biwKICAgICAgICAgICAgICAgICAgICBiZWdpbjogU3RyaW5nKGJlZ2luKSwKICAgICAgICAgICAgICAgICAgICBlbmQ6IFN0cmluZyhlbmQpLAogICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICogQHBhcmFtIHs/fSBiZWdpbgogICAgICAgICAqIEBwYXJhbSB7P30gZW5kCiAgICAgICAgICogQHBhcmFtIHs/PX0gdHJhY2VfaWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoR3JhcGhFeGVjdXRpb25EYXRhKHJ1biwgYmVnaW4sIGVuZCwgdHJhY2VfaWQpIHsKICAgICAgICAgICAgaWYgKHRyYWNlX2lkICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndHJhY2VfaWQgaXMgbm90IGltcGxlbWVudGVkIGZvciBmZXRjaEdyYXBoRXhlY3V0aW9uRGF0YSgpIHlldCcpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL2dyYXBoX2V4ZWN1dGlvbi9kYXRhJywgewogICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgICAgIGJlZ2luOiBTdHJpbmcoYmVnaW4pLAogICAgICAgICAgICAgICAgICAgIGVuZDogU3RyaW5nKGVuZCksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgKiBAcGFyYW0gez99IGdyYXBoX2lkCiAgICAgICAgICogQHBhcmFtIHs/fSBvcF9uYW1lCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaEdyYXBoT3BJbmZvKHJ1biwgZ3JhcGhfaWQsIG9wX25hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvZ3JhcGhzL29wX2luZm8nLCB7CiAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICBydW4sCiAgICAgICAgICAgICAgICAgICAgZ3JhcGhfaWQsCiAgICAgICAgICAgICAgICAgICAgb3BfbmFtZSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hTb3VyY2VGaWxlTGlzdChydW4pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvc291cmNlX2ZpbGVzL2xpc3QnLCB7CiAgICAgICAgICAgICAgICBwYXJhbXM6IHsKICAgICAgICAgICAgICAgICAgICBydW4sCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgKiBAcGFyYW0gez99IGZpbGVJbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hTb3VyY2VGaWxlKHJ1biwgZmlsZUluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL3NvdXJjZV9maWxlcy9maWxlJywgewogICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgICAgIGluZGV4OiBTdHJpbmcoZmlsZUluZGV4KSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAqIEBwYXJhbSB7P30gc3RhY2tGcmFtZUlkcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hTdGFja0ZyYW1lcyhydW4sIHN0YWNrRnJhbWVJZHMpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cAogICAgICAgICAgICAgICAgLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy9zdGFja19mcmFtZXMvc3RhY2tfZnJhbWVzJywgewogICAgICAgICAgICAgICAgcGFyYW1zOiB7CiAgICAgICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgICAgIHN0YWNrX2ZyYW1lX2lkczogc3RhY2tGcmFtZUlkcy5qb2luKCcsJyksCiAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSByYXdSZXNwb25zZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJhd1Jlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHN0YWNrX2ZyYW1lczogcmF3UmVzcG9uc2Uuc3RhY2tfZnJhbWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lQXNBcnJheQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKHN0YWNrRnJhbWVBc0FycmF5KSA9PiBzdGFja0ZyYW1lQXNBcnJheVRvU3RhY2tGcmFtZShzdGFja0ZyYW1lQXNBcnJheSkpKSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICogQHBhcmFtIHs/fSBiZWdpbgogICAgICAgICAqIEBwYXJhbSB7P30gZW5kCiAgICAgICAgICogQHBhcmFtIHs/PX0gYWxlcnRfdHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hBbGVydHMocnVuLCBiZWdpbiwgZW5kLCBhbGVydF90eXBlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gewogICAgICAgICAgICAgICAgcnVuLAogICAgICAgICAgICAgICAgYmVnaW46IFN0cmluZyhiZWdpbiksCiAgICAgICAgICAgICAgICBlbmQ6IFN0cmluZyhlbmQpLAogICAgICAgICAgICB9OwogICAgICAgICAgICBpZiAoYWxlcnRfdHlwZSAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBwYXJhbXNbJ2FsZXJ0X3R5cGUnXSA9IGFsZXJ0X3R5cGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvYWxlcnRzJywgewogICAgICAgICAgICAgICAgcGFyYW1zLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2UuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBUQkh0dHBDbGllbnQgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZS7JtWZhYyA9IGZ1bmN0aW9uIFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlKSjJtcm1aW5qZWN0KFRCSHR0cENsaWVudCkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlLCBmYWN0b3J5OiBUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZS7JtWZhYyB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL2RhdGFfc291cmNlL3RmZGJnMl9kYXRhX3NvdXJjZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSB7CiAgICB9CiAgICBUZmRiZzJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRmZGJnMlNlcnZlckRhdGFTb3VyY2VNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbVGZkYmcySHR0cFNlcnZlckRhdGFTb3VyY2VdLCBpbXBvcnRzOiBbW1RCSHR0cENsaWVudE1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSwgeyBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2luYWN0aXZlL2luYWN0aXZlX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBJbmFjdGl2ZUNvbXBvbmVudCB7CiAgICB9CiAgICBJbmFjdGl2ZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnaW5hY3RpdmUtY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vaW5hY3RpdmVfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2luYWN0aXZlX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEluYWN0aXZlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEluYWN0aXZlQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEluYWN0aXZlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImluYWN0aXZlLWNvbXBvbmVudCJdXSwgZGVjbHM6IDU0LCB2YXJzOiAwLCBjb25zdHM6IFtbMSwgImNvbnRhaW5lciJdLCBbMSwgInRpdGxlIl0sIFsxLCAiY29kZSJdLCBbMSwgImFyZyJdLCBbMSwgImV4aGliaXRzLWNvbnRhaW5lciJdLCBbMSwgImV4aGliaXQiXSwgWzEsICJzY3JlZW5zaG90Il0sIFsic3JjIiwgImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVFlBQUFFMkNBWUFBQURydkw2cEFBQW95SHBVV0hSU1lYY2djSEp2Wm1sc1pTQjBlWEJsSUdWNGFXWUFBSGphclp4cGRoeTVjb1gvWXhWZUF1WmhPUmdDNTNnSFhyNi9pMkpyZW1xcm4rMVdpNlNLeFV3a0VIR0hRSURPL3VzL3Ivc1AvaHV0WlpkTDYzWFU2dmt2anp6aTVJdnVQLytOOXpINC9ENisvMUw5K2lyOC9Mcjc5bzNJNTZSM2ZyN1I1dWR6bUx4ZXZ2L0FYL2NJNitmWFhmLzZUdXhmRi9yNkJoZitqRUIzMXRmbngwSHlldnk4SHZMWGhZWjl2cWlqdHgrSHVyNHV0TC9lK0lieTlUZC9HOWJuay83dGZucWhNVXVuY0tNVW82V1EvUHVZUHlOSW43K1R2KzE5akx3djhOcE1LUVgzK2ZSMU1TYmtwOGY3NjdQM1AwN1FUNVA4MTFmdTE5bi85dFV2a3gvbjErdnBsN21zWDNQazYrKy9FY292cjZkdnQ0ay9oY08zRWNXZnYzRjd6UC95T0Y5Lzd6MzlYdnM4M2N5VkdhMWZFZlVtKzY4WjBoc1hVNTdlajFYK05QNFd2bTd2eitCUDk5TnZsdno0N1JkL2RoZ2hzaXJYaFJ4T21PRUdlNTkzMkF3eFI0dU56ekh1bU41clBiVTQ0azVhcDZ3LzRjYVdSanFwczI0N21tUE5jb3JmeGhMZWZjZTczdzZkTzUvQVcyUGdZbHJxdi8zai9xZHYvanQvM0wxYlV4UjgvelpYakNzcXJobUdWazRmZVJkTEVPN1h1cFUzd1gvOStWcCsvMFA4RUtxc1lIblQzSG5BNmRmbkVxdUU3N0dWM2pvbjNsZjQvRm5qNE5yNXVnQlR4TDBMZ3dtSkZmQTFwQkpxOEMzR0ZnTHoyRm1neWNoanluR3hBcUdVZUJoa3pDblY2RnJzVWZmbVoxcDQ3NDBsMXFpWHdTWVdvcVJLYm5WV2FMSllPUmZpcCtWT0RNMlNTaTZsMU5KS2QyV1VXVlBOdGRSYVd4WEl6WlphYnFYVjFscHZvODJlZXU2bDE5NTY3NlBQRVVjQ0E4dW9vNDAreHBnenVzbU5KdGVhdkgveXlvb3JyYnpLcXF1dHZzYWFtL0RaZVpkZGQ5dDlqejFQUE9rQUU2ZWVkdm9aWjFwd0JsSll0bUxWbW5VYk5pK3hkdFBOdDl4NjIrMTMzUGx0MWI1VzlWLysvQnVyRnI1V0xiNlYwdnZhdDFYalZkZmFYNWNJZ3BPaU5XUEZZZzZzZU5NS0VOQlJhK1o3eURscTViUm1ma1NTb2tRR1diUTI3Z1N0R0V1WUxjUnl3N2UxKzc1eS8yamRYT24vYU4zaW4xYk9hZW4rUDFiT3NYVC91bTYvV2JVam50dHZ4VDVacURuMWlleTdaWnk0M0k1eDFUTG50SmxhUzJYdUZYTUxhWmVRV3oyMXJucUJrOXZQTHQzSHhyZTZaNVlQbk1Na0hMOXlQYUhvUXIybWZPUHhFM2hmcGQwMTAyRnBrNTZ5TTQ2OVRyNjUzMVVZTFpjRy84NDhPN1JqM0xTc3VGZFk1dG8wbml1bGZYbmtsdkkrbnFRc0J3QmRmVzhtZGQ4V29tK3NaT285NTU3KzRvWWtLTDlsbmpaakp5RDVPSFZ6bTZXdVdjNWNaWmVUSnludnpmTzQyWWM2Um84UnJTR1NQbmxNUzIzbmNRbTFmSS9DeGFVZVRpM3dkZHNnd3RwMzdicHV5TVhhWWJKcnYxWUE3dVhUYWNiVDVkRGEzS3pEQ20weWY1VXhNMzNiNVFrOWhGMW40YVozU1JTRXMyOGZ6V0k2Vm1lSXlXeHM0MXErcmg3V09DMGFWekRpdUsvR1BCRVF3U21KQ09uK3hFUmFZOTdNMEViYnZoeml0bmF5b0xHRVBNSnN1MXBpa1FmZ05jdGw2WHNJMXRmTmxoMXozRzhvZHBLRndjTWh1eTZQNGxFVFFPSHVNNDJ5N0I3TlNDSU9UN3A5WHlZL0hPWDJRaUsxZlJaejFIWUVPWGlZZmtyTithUmx1L2hWZlIrUm1HUnR5VEk3blptb2ljZzcvdVp5RDhHOUR6azZFb05vc2FHUGFneDVaUktOY1laOFd6bjdpQXZQOWJQWktHWWtKdmNOUE5EMW5ZYytQQ1J3UFkxUXlIRHRhdFhjNnJYQ3hKZEpiWk9STWhlVmRMQithMHVSbXhJUmhjbGsyT2UwYm9jdzdpeUVKK1p6Vk1EeWdmK2R4TjJZZXNycnIvWFR5Tmk5V3BuNTlNMDAzV09OQlNZVkV2ZFY2QmF1SFBaS0RETldHeFZZS2JlNFdFY1NjR3crRTZFa3hzbkowQk05dEJLWXQ2QWJWejFPR2d1Z0lmZnZIRVQ2SkZvTDR3UWN6bUN5Szh6V1NLTWFod2ZIeUdHR2txWUdFTllCVG5PRGpNdGNaeEZZMmJZVmNBT1FJMklodDd1TnBTUkY5a1JDZENZWVBPVHJHeUEvVnJjdVltSGNYYStGblJseU9Zblp0VkRTM2p3T29kcHRTZkFrd1U4eU55NloxWGpBS2FCWXVaK3doYlVrRkFoYUEvUkpGdm8rUVFWYkF6Q3ViU2NGb3lka0pwTi9iaUhtSElIT3R3dWh0bmRPZTBtRXdRZkxHOGhSMHdnbEt4UkoyMkp4RTFDRGZONFRlcmRid0VER3lQVldkRHN0QUdPMkM4TGI2Qy9tUmdQTG1KaDRnS3JXenlTbWdmNEZGbGZ3ajVjSlVGRGtLa3dPa1hQbmNZMVpKZ0tQRVZhZ0c2blFvSlNJZGtzeGQ4VlFPMW15K1M0a21TMkZ4QllFVk5ZdWx5UWtZNUZRL2lFTWI2Y1FqdU9za3hKaWxGZ0RNb3p3OEtZQkdWRTZSaGl4MWhJOXQyOWtYeWRLWWp5ekxsWWhJMnVZeXBHQ2dlTTFBWGZlR3lBMDg5T2txSnRNZW1mMGkxd0hNRjYrZjI0a0pNaEZoRVhRaWpnQ0hiRU81QnY4dUMvNUltSWxCZ09NQ21vQ2cyUDdUYWlCM0FFQUJWdFJtSk1GSmlTenFHSEFLYTd1QVVPUEJwcDBCbVNRNGdVTklSTmZZUDFGVk56Yy9ENEFkMEdlb28wclV1MENZUkFCVHlxV3UyazRVQlR0dFhoV0l3Uk5yQXN4RGpKM3JkMVg3Y0lLaFd1VEtTQVNlU0JtSDBpWXl0V05zQWFoaHJtamxTV1ZXQ0x6MnpKRU9zWTlGUTZyd3ZiZWJWOGlrRXVrc2xseUxOQ05zemFBNktZSjN5MkxBY3kydVJnMHlaaFdtdWlVeGhVRUFMVlpJbFFQY01UVkd6UlBzdkxvbXhDY0Z4QWFyV1JDd3RhMUNFbTZUUGdRdXhpL2phNnYrQUFlR3NRaXF3MThJdHBZUjBKZU9Dd1dBVWxMWXVyMktzTUkwbzRuSU5YTjVUU1kraHhaOVhQNUZwZGNDbGVnc0VQSFlHSmg0VWoyVWxZZy9OcmxHbk1zSm1NalZMaFpZRVhUbG1JREZWbVd4SlNqb3pBT3hCY3EyWVBsVVU0M041SFUvWWFGdi8vczlFVUd0a3NtYXJvQWRPOExCWkVFWnlJbGRrSlE5VEJyUlI4Y1VyYklYb01QTWszTVNnT3pab0ZGN0JJWEZ6RllHcU5ackJ4NnlMTmVnRXNpbi9xR3VJS3VqaHpQSFRteVJIQ0VCcmxtRWpSOGU5VGxrT2RubGF0WlBhdW53d2ZqbmR3OEkxb1dkQWI3b3lNazQ5QmVxWEhQR01sbEVtT1VSc0FNTkV3MzVxaEFud0J5T2NnOGtET1RtMnY0WXdVaGdLSElCS1VGcENEUEMvcXh0UDU2VUdSc1lMOEZDUThnTFRtSW5wOHhLWkF1ZE1DSThzT1hmQU9vQUxrOERnK1Z6amFXcDBwSG5BZVI2Q2xtNWFUWmk1WFRGOW0vejE3RUoxbU1jb2w1QXgxTUplQU93Y3E5NEIyUlBRZ0pRaGpVSHVnVnBCeU1kQVc0QUdXVU9IUHRqZ0k4Ly9LeVhtM0tBd3h3MlFOUVFocVFOOEZTWC9ub0ViR1c1V0E5MGE3TXJYY0xXMlZvU2lJeUNla3ZySCtUeEtvRXpnMWkxMFpXMkRwRzhnellkM2Q0STI4bWdYVWhjcVJkajBOaWlYZVFCbVErUzVvQnExU1FDUFBGdk1JRXpHNUZvclNSK0loRzVCd2lPeXRtRTdDQXJKODdPVGlJTllSbHhLOXozNW1ZOTdvV0lnZm9aa2FnTVM3TTRJQUpjQzRkbnBtQmNvdUw2WWRIdHRla3VDQnNxdWVBSk9RMnF5bnhESHNzekFEWVRIREJCd2huSHBVdkNJY05tUFlKODJFSWdoSXpTTnd2aDYyL3FGc3doYWVUa0NJMFlDeFNIV3lYK3I5RFRtS0JUajBiOEVBNHMrNHNDeCtoYzUrUmFYdkRJb2hoWTdxMTVIeGo0SnBLWVdhR3lVRVV5RHFzUmt4MTY1M0Z1TUlXeFhWRnpFR1pDSTJUSlhoZFFoekFXNENwdUFIeVpSUm9OQVlML1JnUDI1RVJnWGtvOEdmZWltK1VRMGZBTGNLU2pPQ0JRYkx0OW43Z2F2Q1RzZkRjbmpTMTlBWlZpSG5NRm9NZjh4UkJHcWc1R0JEZmcrbDZ3MDFKd203MHUxdGdXRldnWENSekp2MlJOUTJHSjlZbmlMbXc1MFJySmtpTXlRVnAwb0pLa1RRcXNzMG5Kb1ltM0JVRi9FQzk2TVlFU1VORzgwenh6UkRBakd0b09MdXFkVitFMkVsZDZvSDVLS3JUbGZEMTJZVmZYdmoxTTg4Qmtac25DbGp5eG1JeVVGSzN5dG9OTFE4cXNVK0Uxc0I0SUZnMnVoOCtSQkloRDhrZVJEaHZ3UzB1RkFUMlUrYXBpcThObzFnRFZnWHJwZVVETTJGSWMwQ2V4OUMwcCtQQkw2SVJUYTRNK2Qyckt5ZEV5bnhnalIwQ2JrRWFNQWRWeXd1SnJMeGRzNDdzeFh6aVVnbG1GbjRsd0JrN0FkSGphSnNQYlMydXdHQU54b0JlMGFHUUY3QkdISGtVb2ljeFR3ZlJWRUVCQUlvaXY0cEZpZkR0S3c0bjRTMEdFOXdKZFZnUmJEdG5zOEI0aWFUS1FITVhKWUlXNnZJc1RLN2hpdURDblFGSkpneTloN2NHUzBHNXhGdkp2cWFFaDNJbVNiZEltYXFVYU0xeDM0cmNRUGZpSTlDSHZVYUZqdzNtc2hLQWd4aEg1c0hPQURrMEVGUEFxUjVWaGRmWDB2SnhaZ2VNRWk2YnFTTWZFUzlkdzdFYjVDTWxSN2tkN0RQSVY3SUJHN3RFQ1pmd0dnMEZIQWNUZmdqQTdiQSt0NkpNSTR4dGsrbkVUbHkvSUkyRGwwMVpNcjBVNG5VRG5TajlQVUg5S2prUDlWd0VKaTVoZ0crT3Q2QVlLdmlCYkNETU10UW1kc3prdXlvdGQrRXZzWDVRTUltUDZpWDRXWktPOVFlbE8yQVo4VHU1T0d3NVVBeWgrUVpSamd1WGJpQk5kRWwrR3c2S0M0MUVrbTlpT1pBODFhOVIwWnk0TGloQWhXMVdGb0lrc1J2RSt5aTF3Vmt6TjJSakJ0K3d0Z1NTS2d1NkczR3lBZU83aENsSFZvaGJvWWFpYkpCTlJ3QTI1bzdjUmxlU3UxYzJoY1ZsWmdGZzFwMHhtT1Myblp3TmFnR0lXQlhRRWlXRlk2N2dzRExaVFRDOE5WVkJ5SDl1TFdGM3lId01mVlJkMTBmSWxEQkRCYWFTNWxCUS9lN216alEyd0xaQzE3OFoyei8rcnZzZnZvM2dIWmkzeWRSVUtMczJTUkNNak9GRXZDcER5TWs0VHdEemVuVG80SHQ1dEJWNU51Z2FUTjk4WjRtMjhZZnBDV0pzZjg4a2ZTakk2Z1QrSWtUQ1NJQXl1cmJzQnRnNWVETmwvR1Z0d1dxMURaVjFnZytkamhDend6eXBOb04wUWI1K2dMWFV2dlFWMmdYMlJWa3RlVXlFVnBtcVFudkJKOCtHaWNkKzRUd2J1blFUMndENUJXdHlSQThOVkJ2UFF5RGpJOUFhcjhhQVJXQXNqdHh2Q0VWNEVHL2pzUkZIUWtRQ0UrZWgwVi9CS2tsRFhCWFFNT0ZYVVZwZ0ZtU25Za1p2cW03OGJrU0FkRVNuSTZUSnhiaE5QbkxqcGcyc0JKY2JNbWc5TTA5aU56eTI3Y0JGSFhaVThnUjl4M1NyYXNFaUJsYnd4U1g0SlcwWGtDbmtlSW1JeGJMRkgrVEU1Q21aS1dWRkdzY2pqM0V1NEFnRElZTFIyQ1VPcEEvS0RLMkxZdVk5ZXlxdXF5MzQ0RjVMQjhPbFM3eVBjV0xJN2kxRWRnRzFmbFZyT0ttR2pPOHBRV212Mm5pSU54Z3g0N1RRUXd2elhQd3dINkpRaW9zNDNCKzQrRDdnQlBCSTZYTlJyb0NJR2ZLb3FSSWNoRWc0aVFCaC9ZSmxuUFRLRUJsU0NIWURLaHhra29UR2ozaE93V3lSU3dnejNtODVTQmtmQ0ZBZWhWczJwb21YcWt6OVFFQTErQUlLQmZ6TlhjZ2NqVGtoTXE4S0NuNGtraGhBUnBYckRQQzh5Qnk4eEFGTVpCYk9aSmNxZjRkd3c1aWhDdEVoSkMzeENRWlBSb3ZiNTJhQU92Zm43ZkJLMFZjQmpWRndQSjJuSXc1c1Y3UVhERUpBRUVFb3ZnaHk0bW1OTWJKUzRhcllTcnFxL25zbVM0WDVneDhMZW42QUg3dE1CV2Jnc2ZkVzlSUGtoc2tOa0x3NVl0Y0JKY3kyYXF3TlQwR3VIZFlEcFRWeG1zd2ZBRlFCK29reElRTHc0N1YyOEpNMXhER2VjRkYzR2VyT3ljV0FCT011aUdnRUVLcHF5Sm1RYXdOSzZVT0tHbUlqRXJhUGVFOUd2YmhDWFRsM01wSjFOSW5maW9oQTJ5MWtQSzRSK1lJTTQ1MVFUdVhmQ0hPVkVaSmtQSlBVV2RJTE1HUkJySHlyN0FWNkhVNjRyVHBaS213dlZITVNiSGV4ZWd1Ym5VT3ZTT25FeHpFUVl5dDY4WkxIQ1NBTGlXK0NCQVZNanNZWm5zNldqYnZJQVVNV2NHTXlxd2tIa1FnZUVpcXF2ZkNvd1BpUmVjSlRkZVViZ2dMaU9vUUl5UzNUVkYzUXM3QWl2ak9mczkvU29tMjRDMHNhSVllTG9tem5WVUhIRURrejVxeDYrZXg1QXhlcVEvaFpnWkZ3dE5raCtjZzZUR050VFNWZjhOeS9FaDJvZytoRFBiK3FKdlluUU12R2NyRUVRN1Y0THllOXRodTRicHhEd0EyZ1ZWQkJYcFZuTXYvakoxWHJCODJEWnlGSVhpL0JlQkx1QlRXSFlxL0llaVFVb3dMOHhkam5xSnlBZEF0RitRRlFza1pqU0NWRHJVaTNoSEt6RElGZ3NqekNvOHJ3a3ozanF0VEh1RjNEaVdPRThheFlIdXlvU0lKVVZIWDU3clZBUTYzOVVCMXNUT3ZvU0RqR0JrNys2NHZOdFU4MGdJMkhHdWhBeE5yVlpzRUowbVBNSUJHS0NHeHlwZmRnTFM3UHRVT2RxZ2hweDhaam9WUjNOMlRocks1Q1krT0JDTG8xdnkvMVJTRXlEY2tXK0RmakIrOUlqZmpBbFM5QnVsNEVuYnhpNVNHWVF4ZUc5N1crcUN5Vzl2YUVrcis5K0U4Ly9lMUhCYnZ1NjZkYlRLbytCRlJ4cmR0dlpCQjhwdklNTVlrNlJHYUdxKzJkRmpzcVRvVm5ySStzWFJmVjE0aUZHQkZ6cXQwZTZkTktsdGpXcm9CQzhFck5HUUJ6dURzMGIzRDAxZzVFT3BYcHFxck40TFFyVjNmaUNvS2lvM3VnUmtnVTBUb0FjOUlyUkJGWnNpelBnek1XOHhUVktyQTJrSTU4SHNhNkU1a1dyMHNKc0FocnFCb0N2MGtoSkhTV2FvbS9HMWw0U3ZQb1ZjVUpXWHVGSmdFWUdmQlV4TVpma2grZm04WXowb2g0TEFoY29rSkpQV21URVBDejEyNnFhbzNaZ3lhRVFCeXd6Q0lFbmZhMnQwcFI4QXlhUEwzU2tYUXljcnFYbXlLWWx5T3d3cGZvWTc1R09hSkFtREVZdmdGZEx5U3V3OTVGV0VGVnRneUt4YXpCTFBUOGxtYkU2U0hyUzBoZVZYU2dIWW1lc1FZcklhako1dkZZVnNiTC9ZNkVZWnA0eHVhS2VSRW1hQ1pCbnlsODhHYWtZekR1Yzg2SThQQ0FYQkdWYm5obUtpZzlxeHl6bkJtQVBCSGpxRmtUbXNCNVZzaUoxeVF5WmNaaE9TZ1RFSUFXeUhRVmZ4b3d3a3dEV0VBMHN1NG13SVhVVEhQQ21vQ3RxclJra3JnS0xESTVHV0FUeHN0UGhxT1hWWkJDN1Rpc1FZQitONmtFWlJ0TEtoUkVScU8vRm9NbGdRRThucFh3dy9zeE5pZ1E5cTRxeXV3bG1FWW1abm1SSHNsOU1rZENTK1VWeEwzMkV1NitNQ0wzYkNRSElRajFRYVg0aEE1dXBKTHhVRUhpRjRhdXpLMDI2Z3hGempLRGc3V2NqRE1uNDdSWmh0c2srdkYzQ1AyTDVnQ3A0WjJsblFrMEhpRmZNVERjcTRvcVhjWjBxdXdudlFJOVZOZ1hsa2xoeTZGY1pET0crdzZicHlEL3NMcEhtdy9ZeUNDcjI3WTIrSFpQK3lMWUkwTUh1Q2RpaEF0Z0V3blpDVjVXeEFoQktLT1hDcEZhWW9GaVgzS1FpdVEvT1lLZVpRV1FQT3BBV054ODVZdmIzdW81V05JVGcwRjZtWkl3aXFvMWhRZ0pTeG1OdDBKV0Z0RXZjaFRXa3JQeWkxd0QxSGU4ZW1ORVJuVnQyMTdwcTRrTVpoNFlFcm9maEJ5bDk2WktWZGNtTWhJSTVRMHFJNXo4d1dBNGVWNjBDN09aNE1vcnpVVEt6anVKeTUyYXNPWUU3UndpUnJURkZBTEVLSmxlVlV5T2pjV2ZSQ1pNU3c2U01RUGdERis3Y21IUFgzY2MvdnpaL2MwM1htSFNFNXcvU04ydmN1VXZyNnBIakNkeXFreWtsTENXYzJ6c1hjS0dJN25nUXBBRGEzRWFHTnFUZ2xKSUFwL0FzUU5OVW1QVHRyK3hGancrOHZnUUZSMVFnTkd5N0dZQ1FsUmd5MHdTcnArOGdlSUlERHlzb1RwMjJFOGNXMGZqc2M0TkVHNTRmVGZsV3JWbkpqZFZ0RHRkRDdKTEdhaUV2ZDZ5akpzQjdKaWhzSGJ2R2RPaktobWtzeUNUS05VK0hIU3Y0bVF3d0dtK1RYK3l0V0VqTmhtSm9vRngxZ3MxZkZHVDd1SG5rTmZKdzNLZElHVmNtRDB1aE1iY0lpaE1pQm5XYThtS1NxV055dU9CbVZmS0hCMkROc1pUdHpXSWtSclgxUDRLdUt4U0xmZU9yazN5R1dtTzMxUHhrZmpSTmh6RDV6NEJMd3BtSXp1MVZjZlBBSDJxRFFOSFFObFJ1d3hRYzNLSkhxZ0ZjZUdscXQyVTNobHdXREZCZkhoRzFJZ0s5eVNqdE93YkFnbU9oMk0yVUxza0xGUUppRi9GT2JsMm1WVFVJWXpieHVFeVRMTlhwcVBGVkpBUFN1NVc0T0JscXBLUkZkclNhZHBKQ1VjNGdpaTczU25BTU1DR3hzR081MUs4NGFvWEQ4Zno1M2FzN1BISVNGeFlWRkJTRldoRm5odEd4WkJtTWdXOGQraUpnVTBHQjRIYXVyRmZBQVBNcG5JZlFzMlBpWHNhVUFiVXJGS0FxY2hVYnhsM2VoVTNWQXcxZExzakVNdFpTRVVpSitNU3h6YjhPalBVQ0lQSmRHT3d5cCtLbFh4MmYzckQrNXpiVTBFL0VWejgrVlgzZVRtckN3RTFMTXdIU0dTM2VWazg4c2M4NC9NYkVkcjBkTDVvaWVBZWlKbmJTWnBUbVNCQWlIeXBRL1VtVm8ybGVjME9zb21nY3VTeFFTNGl2aWdVSFNxL0JrL1VSdUlaQThDaXdRR21iWkVJaFZvNW9seXV0MGxzRUJCWFNKVFd5VzBydDhRY1RmU3piYWZTMWxGVHlXaVZjRlJSQ1c3V1B1a2NRbEdZa3JRUDVFd0k2UGtCQUlqMTRHbUdoanhBU0VPdUN6RUt3ajVmalFyS2hRa2k2azBiaFR3L2RBNnBRSnZFZzk1VENUNlVOTStMV1VyeUhLai9oaFFuVFJ6QWpPSkNaR1FZYTZtS2ZER0pBQk42Zld0UEVmTzhrdTJDTGtFOU1PY2dRNUJwU1ZQa1dERUxyWTZ0elFPeTVMeVo1NUg5djQvV244L3UvNHJXbitqUWhWNkFJTjVlaUJEN3Y0bW1EZmVlRWJCdjJCWSthL0RhR3BvenY2NGVkSzUzMGhqd040WW1MTWdXYVlwcmtPL3J1SlZVK3V6cFpLK2V5Ym04ZHVteTloQ0taRG82bmlraDVUcjZ3cW5KRE5nWnVCVDFUWGpWN0dBWGRXQVl3dnVvMVlEQUF5bjR1WWxuRGIxTDNsUVZZVkdDL2FJYk54WUMyTFBYK1lBeFJLUGFSZTBsaExsS3Y5TURSaDZVMkVXOVVvQUF4dXlxazJHczBodTJaOVpTRnBOUjBVY3NPSk1Xc1dUQXdsak1RRk43QlJKK3FXbWt5NldpQWZqT1BnVDR4QVZtK0JvSXhvYmg0OUNUQ1B2dXdCY0dweDNxSExzdUxxL1oxUWdKbXRYTmNzRmFEWHZLYW5BWFZSWFUwem0xU2RCVTVzWFRJMG1Td3pLamgwL3RYYjA2blZERXR2TG9VTVpSRlloSHIxZWx2ZkRLNHZCdlVMK05qT3dabDhsRUE2cEx4bUhJNzl1MmV3VngrYkpqcjNxdkhXdkVJYWxMOGlCOUcxQnZ0Y2JwVlFkZm9BSitBZnI3Q2tEM3Z3N2xueU5ZWXZRM0lmeEx4ZTJIRVA0UjRJZ1RNTEloWG10UmkxNk8rR1A4ZUN5TDljWktWNVF2RDQ5VnE3YXJIRGlDMEJQQlhxVWNuRUJDQTdJQTBGbU1XQWh0bDNPaHMydGxQVnZIZktwWEVnRWF1am9zSnJvWTB1RTJQVmVWWm1CTkVBakVTMHVYWkFXWENoc3A1UnJVTXR6eDlBb2RtQ2hPUk9ZR2FJOHdWOXhWUUdCK0pEZXAvSml2akZocVRNQ0RmUnpIM1JJV016MkNIS2dZVFFXOGhUaE9GUVcwc0dUb0R6K3h5bDBOZmFCY1VrK2IvaTRRRG43VVprZGhOUkhTWXpnVkdEZnordmJhMFVmaFU2WEVEQmIrNzlwemozSFhyZFJWcVZjRGtMU2U0aDZpR3JFd3dJREFaTVBQVUhwN1pTcDhSWWpTWGdKbDhsTjdudHlsbzVIMHM0Qzh1cW53ZkpnV0ZhdHRxUDJOVkdwZ2RuNmRZdkF5d2tyOWt0cTNTeUpuaUFPUm9KMkRBOTFqUWZFVEpLUnlRclk5WTcxNFhsRDRZcDNkWkxWbXVuNnBsUTJsc3hUejFZTUc2clVpc0M3U1hwMTd2cXV2aTFFQWFVbm1VQW9HeGM2VHMvTFplUXpLM2xQY2J6cTNFQ2ZtRk8vZUZrL3pRd3I4S2NMZFAwMkJQMldBKzY2NUp6RkFrQmIxZEJncUdYYUN0dmREOUxZd0hOQWlHTWVIb3ViVlg2RGQvUXUyQTNTWVpnVDB4dWdGbWUwQTZrMFlMMnJuSGlTREg4cFNHR3NuL1ZXZG1XV25NaWdzZ0RndlNkMkNXNW9XVFF4b0V2cEZFQmRHWk9INTMyUUVNb0RmVkhvbEpxd2tOVlduMVlkRHprRXBFdi8xcXB6ZUVZSmphZGRoRXBuVnQ2Rk95MnEzUklYY0FSbW45bzZJMnlFc1o5eXY1OGdWYlEva0dsbHBobll6U1pLbHU1Y2hHZ3IzSzRYbkFSejVCbUc2TXRrMmNOWXdpWFpReUFpOE9DRGd1QXBFUHRST2NORE9mVExSUk9CYytMcklEWGlDSkgwYWRITGd6akNaYXJDL2c4cjFYQmdzWmd4alBtNW45ZmlOT3pMZUQ4SERpNjlmUzVWRXlHRTh6NHAxcVFuQjM5WHdlUlBMSVFIUDhoWGIwSjE2TlJ3alYvRnRta3BwaUgxU0tsMzFjUUh2eHljbXpBaDRGV2JnNG55bnlnN0UrVkJoYkRRUHdpK0diOEFJcGtmb3JqSUQ2UTFXb2F5RERoUGNYdFJBaHNJMjZXdnRwNWRaQTA0VkZjZWpxWDlwa0NwcTA1N05aZGJ1OWxmeHZyM0pES3NYaUp3cGFnR00yaVZJMmtKSzVvV1FoNGYwOEE1b0JhV3BDV1BDNkFDbnF3aFRWby9waG1NQndTVWRwZE0xVVR2Y1hmWDZCb1l2aENTZUFvU2VjM3oyM0h0Vm5YUjF0Q3ByNG5EMG1EVWNFRWE3NHRYQjFqVDd0NDM0Zi96Wi9jMDMvbkVIUVBjUlZSRVdUS3VlOENITGtyU0IxWkJCVmFVaWdLMEFLT1I0K29XaGdEcmQ4TEZKN0V4ZnFBTlpvMi9xY0FuQ3lxdWlGcjJha2hIS1JITHlhaWxSNDJwR2plRmFNSGRvS0J3ZFlsNGRIT0ZEN1RndEorOWNCK0hpdFZtTzk4UjJ0L3FxVk1nUE5Xek85Yng4WGdnUndjTHhPRGJBQ3A5L2tDQTRjaUk1NGlDemYvNFllSnJxQXQ3STRsN1UxeFl5RDZ2K1gzZ0xndEttcVRRTGtTbzJKWkVKOFM2Nnprd1o1bGlubjFqOHJrTTROWWxRaDdZbFZpbmkrNXEzNnAyS2Z2U2FRZmJocUtyWXlKNWR5MmNYSWRma3VFbUJVUHZDZU12S1hXM1lzQkxZZnVZOUlIYU9PdXlnQWpYTFFabHhuMC9IRjNDR2NpZC84VHpadTJ6dzVGb3lKK3JnWGMxNFoxUTV3UjZwNkZqS1ZJc2hkcDgxU0RMQ1pLR0Z2WGJ6UXkxeitFdWZuSHlrUi9oOStyOVJXbG1OOGlnT2kxUFpScVozYmF0VUJjNGVMS2k2TDBFMWtrQWRPOUFaQ0J1M2s5S056V3Q3cTZrM2w4eGdtdFdsSGRRdWh1TzRBV1M4SW1Jc2pxbStEa0hrckZ1Z1RCZWEwemVienZmWExYSzBjdW9OcS85V1luei83UDV2aWZFOUw5eTN4QWo0Uk9RL0RpbURtQWlURVY0RElsNjN2K1JJbURINVpkT1JNZVNacm5lZTE5TS9uSURBTnI0RGFRTDlxMXVNREF0TDRxbCtkaGplUDhSckJuSTJYQ0N6MWlRTHB0cE1rQ0RFZm5OZUxlc0l5c0p0Tzl4MmNZeFJPOUhNY28zcXRjY3E0MzRhY1lQZ1ltSURaQlFHTE1GZFdTaHR2K0NFQVRaN0hlbllHcEJkNTE5QWFSUjhLd2pEWVF1RkFmYm1nbEdHNzVPMHEwNDhxTzl5cVhZR0d1c3d5WFJYeDBSSXU2QkdXZmpiQXFGOGNNUVdrQVRxNDlldWRvWkJzVFBjUGh2dU5KUFVHVis3dFdIcHB6YitIZTdFOTVuZ09TUURvMndyOTc1MEtJWG9RZGRsRlVSaWJ3ZmszV0JwcXFxV29Va3dNQk5ZelVHbGlOSWN6d0JyQU11Z016bE50QUxTNnBEMUt1WWExTkpLVUhKNWJOWk40RDVLTnV5dFhzUWJNcE9nMHgrWW1taWVhYjd2dUNUMnBUSXo0R01KbUczRTR0WDJQTXQ1WHU4ekNTaU5oc3IwT2dUME5udkZFVWdBNXNoVXBCM3Ewb3dhNTZ2aXF2VmxGNTNDUEZzTlNpVE0rbkRIVUNFclZKUm5Kd3F6Q3VyKzFWMmNIZXRvZy8xNkNab2ttdHFyMGl6L3FJenovYlA3VFgzbmQ5V2RIMTk3cFIzTUpkYXU3cFhSYVlBSnk3K0JYaWtWTW1mc2pBaTFRZndVc21ab245bE9RSEdvS0ZpMHAzTFFZSFY0U2UzUzFCYXJuWGZzdEF2cXdrZi9xbHFwWGkva0lkWmF4dVlNc1NiWEJ4NW0wZUdLaVVBQ0pra1VRRnoxUTNCT0xaT3EvamdTcFduL0hOcVdKQXZpQUxSVWxaa1lhbVFGL2RXb1JGamhQR1RSMUxhaFJsa05IVFdGWmpqekhBY1RsWTVHclZqcFJwQ0NtK1I0bTdlOTB3N1ZKeHpHOTlFa1pROXNGWS9DcE5TbVBXbFpCTGRoa0tyeG9QMzk4QWRpcW5vV0s3eVpZUEhhbndzSlZPSEhkQmYxSXZZZ1p3dW5RYTJEL0sxSFVKdlUyNXZHYXlsL2JieERYYmg3YVljUXlGaVlrS0YyT2dGV3JYSmpUQ05jcTYzUnF0YW5UdlFXWnd3OG9xRG02K0RSOWdTdTRTSjhIbVRob2RZTlFXWW9QZGpHQ1pZTENJSkFvYWt5VFNaS20zcW5iVTBVZG1aQTZ0QU42ajVnK1JFUUdSTkhITVUrSUNwbVQ3M3RpR3F6dHFPMk45b3BVWEtQVUlhZWRYNHRxV1c5ZFo5ZjR4M3FLZXJmQ1p5UTcwRmdDQzNSbUZ4Q3g0VlcvNXlwMWxGd1NVaHNJL2JXU1NZam50WHBpK3lkYitXbTltNlV6RldWVlJ3TE1oblFqeGsvZ0hKWEd5eXBPdS9DSEVKSWt1L2RhWThMVFlHczFvYks3QzNxekp0d2oxemd2ZTBsSzU0bmdRVTZtWWNXNnRsWG5Td2RQSWZPa0xGc0h1NC9Gek9vR3JKT3dPbUlVMUVMNjZoSzQ2UGpCZHRRUUhVUDFNM1N4dUxybitTQm5vRUlrbFRBaXNzcUhrMDFQWU1XMHVPTUNRT3BwblVnbm9qQllDTm1vVDNlcGZYc0M3QmNHNVZtekI3NENBQ0dGcHdLcGR5Zmh3cmEybEhKQzhHRTZsVmp2NDVZUnBEMW5SbHAwa293M0lycVFkd3FNUFNrWXpYdm9JNUxCRHJXZzJBR2pEVFFGZFdzaVl3anUzbHN4V3NpS0ZGK2hiUWhqeit0bkJlVjNsRVEyN1RwaFJWZHFhdEJ3VlRvZ2oySzlpQjErby9rMDZteXJoYWNQeHc2ZUovZHJ5L005THVkMi9FM3I3T2VxSnVHbDNPZWh3R3NWSVpZdGhJY3FiTmhwWXlrVXdGRVhLNXFHQXlxZE1FM3BpTmpxRkI3dS9OcU1EYlpCdnhhOE5ORDE3dkwvY2s2TWpqMU9FaUJialZvUytzT25ZOVVwSVdHNkQxRmlLQitWQWxFd3BwL2RLZDhKV1lqL09FSkxrbFRuZW5EMGxpb1IzWkp2VzFCRnErVC93RktVNnBsakJqeUJCdEU3c3Z2dWxXSWEvUnBtOEFOWVVGV3ZnWGRFcGtaOEVDOElna200cFVNVzhHdnJqT01ZYXNyQ0FEUTBTQUFEMzJFYmh6S3BsNVFRS0FuajAwRUdHTXg5VnV5Nk9yMXdIbGxIV3U5d042Vkt1OWxJS1hxYStVTndKUmpQZFNUcno2bnJhMFMxVUVLUU9WNVo1L29SQkRRZ3A3Z3lOb2lPV1dscG9TMnBXaGJKWXNPUWp1OGJxaGRsbk9oWDh0V1I3anN2Rnc3czZ6ejZJUzJDRncxQWVndnFXYVRYNmRSd0JLaTBPZnJpWWhadmZsSmhqQXh2MXEyT3NMTVY4M21yOU9DcEFRbWN0b2RKVVRlYlIxbkpLbTZqblF3ejZCV3l1YlVkcmluQXFkbWdIcngrSk1sQlpzZ1YvV0E0THEzZlB4bEZDU2Nlb0o3ZjNRRVovS2Rxak9YSXpwQ1U2azZuZ3ByYWpTS2tuMldkZm9MMnBpdnNxNU5nMlpiQWd6M1BKcGtxK3FGRWFRbDZkVVBTVTR2OVVsai9PUFY0UXhGL2xUZm9qYjgwSHVHeG9NVFpvU3BKMitwWUhsOGpXRkxUV2JjOGJVRU9mSmJKMTZBRVNPSmwxcEljQVozRTBYYTF6cWZRajVDT3dlVUtnWXBNOWNYczR4ZXJWRERWZUVlZ25MSTZsZHEwakdmNUYrUE9nQ0t3UENBVFh6dDE4aEtLT2tkU24wSFVPTWVDUmZlV05Ld0paRkx4ZmZQdEhHSVVlNzBDME9ISGdLRnJPT0hPb1h4cmltMkFMTlJPR3IzVVJkTWZtMzdPZ0JVTTRiUGZXN1pzRHM2akR0MUlyUEtQbzFJTW5ENXc0cnNxZTBySXAyNWI2bzJ2T08vK00ycmZqRUdpdlNBKzYrT2hiR3NDeXR3R2ZSZ0RVR0pGZ09HTFJsOEFIZXkzTWp0dzgrbEYxczZqd2xwNDRhSWFsWFEzSzA2SnNQVWtpSjg1SnVIUkFPUGp4Nm9pek1CSHlHMk9vUzlQQXlXc0d2VnA4NG5JYWdRTmI0NmozTWsrSEJyeUUxQ2ZhcHd5OUJFdDR4WVBRVjRrSUpPUHlwUUZCMFAxVzdUaHZrQlpsUjhFbGNXTG9SOWtsYkRxZjBCbG45Q1kzN2lnN3RDWGJDWXlKYXRWbGxoRTZGQko0ZVpFeDN6RzJBR3l6KzBWMkllb0YwQmtVMHVCektBbjJMd09wYW1rM2g0U3ZEbzZLd25ZWTJoVklPS2dFMEt0S21BWFZ0VzZUY0RzV1NjamtzT25ocEpvVUtqam9TK3ZnZlVTSEpFQWg1Nlh2Vm5EMEMzNlZpZ05JeUtGc0Fxcm5vZG5SYnM2dFhJMWxxR0owYVh6SHRPU3NlWFJ5bHV2aE1ES2VvYWdWVTY3OGpNdWtYblVMWVJFc2dpdUpqNXlmbWRrOUZPVEkwNHlxc3lzN3F4dFJQc0pKU2hBclZTVjBtRmhlUFdyNjI1NnQ3UHFobnZaRStiQS93MXFidEtuU2lpSnBBY3lPa2dJdUh0VkRjSlJ5YzVNc0dUbVlaeUZFOXhERFd1RVFvb3RLUTZkYml2WmZNcGJWVEc4VHJZcitvMWRKeW1XK0NsS3ZQQUhnWTBKamtxNExFdWRVMlRyb3I1T0tzaVZoeUtlckRQZm5aV1I0eUJST0tDdDhIUzFGUSs5UXNJTWhuOGRqOVZxaVBSWjFDSHRhb1hxQVVKVDlQdnFDRFJnSE5XaTRUU3IySkk2cUVFYWhrZFdWUlAyYS95QSs5Y0RXUU83ZkhMdnBPNEJFL1NNYnNkbWVXVnRCc2NNSlVIWWEwVEkvNkMyVk9IWC9Ec3dPVzRiNGNCTzRvOE5rblFxOU5HTnBOYTNsL2ZLTm1nTTJNQTF3RjhWVkt4TEFSdEZhYkZlQ1BCQ2srUEwwbUszdTVmK1g2dDE0TkNXSHkwQjZScXFQcnhkVjkxM00ybnhuWHZ0OEh5NiszVjRNWUFqclF5bksvRGpKTHdFUnRRNitmNHE5cml3TkpmeTRkcFpLVVpNWVgxdFQ3R1VjeThaVldoYTBvSkJwQWtMY0dpdWc2NURHOEkrdDBOREV2S2YrbjNWRFMxMzZvU0VnUk5iWVhQK1Q0Y0hjZ1QxZEdpWHNKUWxCZkkzWGNtMGRUT05QeCtIY1U2VG4zZWhvcllweDZOaVNUZjJ1a0RNSnZPVm1vZlVJQ3ZYN1lCWlZicFZjRU9VZTYxSjQ0Q3VNeXhtMTd0T1BoczlCYjZCQXA4OUlPS2FXckMwV1pQbDNnRjE4QTRSTmRhOEJLbzYwZFBIUytONkFFbHN0TzJWd096V2FEWHVRdHZYMi9JMFVTR0tOUGlpam9CSDFHRW9LRWVHUThFOFJIeGFxV2FSQmpMa1Z3UlBML3FCYTVOT3h3NGYvMCtEWlYyZWxFbEFSYUVFb1BNVTlwUGhPRmR1Vi9mWDdVQTJUMEJXM2o5SmloU0xFMUNGOXV1T3ErbDN4UVE5QnQrNXRhdnBqQVUzMmc2RTN1Zkw3MEhVYmtNUzBWMHhLNytvL2RUcjU2b0k5ZjhHeFJsVGhFK1RTNVNwZThoUVlwcTRPblJ2VjNTUUQwL3JFWlFYd3h4YWc3dW5Jb1FKQ3BmcUtYNjg3c2ZqbjZ6Q1c5YThBc29kWmR5R3JRaDlYRWRXK2NLY2xUYnNrNEdBYTZPV2ZTTVl1aFg2YWh6WDRwMWZCMGdJTWFBQ0l1U25UbXJaQnJIZk16NzJWZmxXZFJ2dEl3bmRYM2ppZkRxYW1OcUtNQUlUT3R3SWlLVm1OK1cvWTZDZkdndmFnOTZwUFNNNEg2U0Z5eUR3TlUwNS9DQ0FkRFdXWkNzTGR3dWNhSGZ6aFdDVHFxb2s2UWhNVmo4aGJoQytwYWpYeUtoQmhCMVdPZ2IyTGdWbkZ3cTRrNlRxczR0cG5hdFhaWitwWWM2NS9WZHNhNU9DNkpsbU9oY2xVZ3JhYWNDa0dvK2VUMmpBeEszMnM5WDBMbU5kRmpOZ1JObnBwcnlROGR3MVN5Y1ZDTXNQREpKa0xYRnFaTnhPakx6MTYvTWNnaUU5ZmVWSVJ3ajV0VDlOOUN1dGhqZzZ0MTRBQUFCZzJsRFExQkpRME1nY0hKdlptbHNaUUFBZUp4OWtUMUl3MEFjeFY5VHBhSVZCVHVJT0dTb1RoWkVSUnkxQ2tXb0VHcUZWaDFNTHYyQ0pnMUppb3VqNEZwdzhHT3g2dURpckt1RHF5QUlmb0E0T1RvcHVraUovMHNLTFdJOE9PN0h1M3VQdTNlQVVDOHp6ZW9ZQnpUZE5sT0p1SmpKcm9xaFY0UWdvQjg5Q01qTU11WWtLUW5mOFhXUEFGL3ZZanpMLzl5Zm8xZk5XUXdJaU1TenpEQnQ0ZzNpNlUzYjRMeFBIR0ZGV1NVK0p4NHo2WUxFajF4WFBIN2pYSEJaNEprUk01MmFKNDRRaTRVMlZ0cVlGVTJOZUlvNHFtbzY1UXNaajFYT1c1eTFjcFUxNzhsZkdNN3BLOHRjcHptTUJCYXhCQWtpRkZSUlFoazJZclRxcEZoSTBYN2N4ei9rK2lWeUtlUXFnWkZqQVJWb2tGMC8rQi84N3RiS1QwNTRTZUU0MFBuaU9COGpRR2dYYU5RYzUvdlljUm9uUVBBWnVOSmIva29kbVBra3ZkYlNva2RBM3pad2NkM1NsRDNnY2djWWZESmtVM2FsSUUwaG53ZmV6K2lic3NEQUxkQzk1dlhXM01mcEE1Q21ycEkzd01FaE1GcWc3SFdmZDNlMTkvYnZtV1ovUDhhN2NtTHcwWHh2QUFBQUJtSkxSMFFBL3dEL0FQK2d2YWVUQUFBQUNYQklXWE1BQUFzVEFBQUxFd0VBbXB3WUFBQUFCM1JKVFVVSDVBY0NFQjhmQlZ4SHRBQUFJQUJKUkVGVWVOcnNuWGw4Vk9XOS85L1BtUzA3a0lXd2hNVUVBUkVFcEFXMEltb1JwWXExaUZXdy9rVEZ1clNpWGNDNjBOcUNYYkQxdXR3cVdtcXhyZEQySXJkWHNiVEk5WXBMQ3lpaVV0a0RFUklnZXpLVFdjK2M4L3orbUhNbUo1TUppeUlrOEx4ZnIvTUtaQ1l6a3pOblB2bnVYL0g5cjEzQW1xMVZSSDE5R1RieFp1WmQrQUczejF0RjBSMnJXRHR2R0ZETGlobmptTGRoSElzK1dNNzBQS0Q4R2E2NDlGSEtMMTNNOW1jbjA0cWZGYlBHTXUvTjBTellzSndiaXV6dlJ5bGZzWUNIRnIvQzVqMEJmSVZuTWY3bWU3aW1iZ0YzL0M3S3pHVWJXVGllTGtrNEhPYkFnUVBVMU5SUVYxZEhZMk1qVFUxTkJBSUJXbHBhQ0FhRGhNTmh3dUV3MFdpVWFEUktMQllqRm91aDZ6cTZyaE9QeDVPSFlSakpyNFpoWUpxbTg5L0NORTJjaDVUUy9pcWtsTmdISUZLL0FrZ3BoZlhTazE5VHZpZDI3ZHBWWEZCUTBOdm44eFc3WEs1aVRkT0tORTByRUVMa0F6MkFQQ0ZFSHBBTlpBR1pnTmM2WElCbVBaNEpHRURNT3NKQUNBaEtLZjJBWDByWkpLVnNrRkxXRzRaUnArdDZkU1FTcVRsNDhPREJrU05IMWxpUEl4MUh1LzhMSVZKdnM3OEhJSVVRN2I0NkRxbHBHa0lJTkUxTFBhVEw1Y0xsY3FGcEd2YS8zVzUzOHF0OWVEd2UzRzQzaG1IUXZYdDNmRDRmUHArUHpNeE1Nak16eWM3T0ppY25oOXpjWExwMzcwNlBIajBvTEN5a1o4K2U5T25UaDh6TXpHTzQ2dnlzbXp1Sm16ZFBaZFhhK1F4RGtZcDkwYmVlc2hXekdEdnZUVVl2Mk1EeVZtWDZISWl5YnM1WWJsNVZ4QjJyMWpLdmk3MDdzVmlNQXdjT2NPalFJZXJxNm1ob2FLQ3BxUW0vMzU4VXRGQW9SQ1FTSVJLSkhGSFFuR0xtUEV6VEZMYkFwWWhaR3lHenhja3BVcW1DNWZ4L1RVM040SnljbkVGdXQ3dE0wN1JTSWNSQUljUUFZQUNRMFVsT2N3VFlKNlg4eERUTkNzTXc5c1ppc1QyTmpZM2xBd1lNMkowaWNQSXdndGRPQUczaEUwSzBFVHBOMDJTcXlGbkNsaFE1NStFVU41ZkxoV0VZNU9YbDRmVjY4WHE5K0h3K01qSXl5TWpJSUNzckt5bHdlWGw1ZE8vZW5mejhmQW9MQytuVnF4ZDkrdlRCNi9VZVZ0QzJybmlSbDk1Y3hZcFZsUXhiOENyTGJ5aFJLcFlHZHkzUWFsaHRaZkh2MWhQakxDNGNYM1RjQkd6ck0zTlpWaktQK1ZOTDhObmZMVi9CNG5VQjZEdVZTN3VZcU8zZnY1OURodzVSVzF0TGZYMDlqWTJOK1AxK0FvRkFVdERDNGZCaEJVM1g5YVIxbGlwcTZjVE10c3BzWWJQL0tLVVJzamIvMzdWclY4OCtmZnFNOEhnOEkxd3UxOWxDaUxPQnN5RDVWblJtTW9EQlFvakJ0cEI0dlY1eWNuSXdUVE1LYkROTmMyczhIdDhhRG9jLzNybHo1OGZqeG8ycnN5eEZLUk1uU3RyL2Q0cWNsRklLSWV6N0pBWE9NSXlrOVdaYmM5WWhPaEk1cDdDWnBvbW1hWGc4SGp3ZUQxNnZsM0E0ak0vbkl4UUtFUXdHYVdscElSQUk0UGY3YVdwcW9yR3hrWWFHQm1wcmErblZxeGY5K3ZYcitMTzA2Z2wrdDc2SWNUYy95Wk5LMURxMjJJWmNjRDJUSnc2amlGbzJyMXZEQjFWUWV2TlNWczRmVDk1eGVZcEtWc3lheHJ3My9mUWROWkdKbzB2QXY1WDFyMnhnVDZ3dlZ5NWV5Wk9UaTdyRXlhcXVybTduZGpZM055ZmRUcWVnUlNLUmRvSjJCQ3ROMkc1bmlxQ0pEcXl5ZGhiWnRkZGU2MXF5Wk1rWE16SXl2dUJ5dWNZSUljNEZCcDltMS9RdTB6VGYxM1Y5czkvdmYvL3JYLy82Kyt2V3JUTWQ0cFlVT1NHRW1jNmlTMmZOYVpvbTAxaHh1Rnl1TmlJbnBTUXJLeXZwbmpvRnp1djFKcTIzek14TXNyS3lrdTVwdDI3ZDJybW54Y1hGU3FFK3JiQjkvNmF2c0c3OU51cklwYkJzTkZOdm5zYzkwNGNkSjFHenFXWDlpMCt3ZU5rNk5wZFhFYUNRMHZHVHVmbWVlN2hoZE9jWHRlYm1acXFxcXBKV1dqcTNNMTBjVGRkMVlyRlkwa0pMRTBjVHpqaGFHc3RNcEltWDJWYVorTjczdnVkNitPR0hML0Q1Zk9kcG1uYStFT0k4SUVkZDFtMW9rVkt1ajhmajZ3T0J3TWE3N3Jwci9WLys4cGQ0R3FFem5hNnJRK1NjY1RtWmFzbWx4TitrbEpLTWpJeDJzVGV2MTVzVXVJN2liMDczdEtpb2lGNjlldEczYjErNmRldW0zc1hQR21OVHRLTHJPdnYzNzI5anBUVTFOU1d0dEtPSm82VkxEdGlDbG1LZEpkMU1oMFdHVThpa2xGcERROE93bkp5Y2kxd3UxNFZDaUltQXV1cVA4ZStVYVpwdjZicitkblYxOWRzREJ3N2Nib2xiTzZ2T2FkSFoxcHZ6MzNhQ3dTbHlVa3A4UHA5TWwxeEl0ZDdTeGQ5czY2MTc5KzV0ckxkKy9mcmg4WGpVdTZlRTdiTng2TkFoS2lzcjJ5VUhuRzZuTFdxMmxXWmJhRWNyYUlaaEpOMU0welE3RkxOUUtIU3gxK3VkcEduYUpHQ0VlbmVPSy8rT3grT3YrLzMrTndvTEM5OG1rY1UxVThXdUk1R3prdzIydXdyZzlYcVRGbHhIQW1kYmNMYjFab3ViMHoxTlRTNlVsSlRRcTFjdjlZNHBZVHQyZ3NFZysvYnQ0OENCQTFSWFY2ZE5EaHlwZkNQRjdSUXBpUUduZFNaU0xMU2ttSVhENFNsZXIzZUtFR0lLMEZlOU15ZUVLc013L2hFSUJOYm01K2V2cGJWY0phM0lPV055dHFzSzRIYTdwYk04eEJhNUkxbHZxZTVwYm00dWVYbDU5T2pSZzRLQ0FvcUxpK25UcHcvOSsvY25PenRidlZ0SzJJNk8vZnYzSjYwMFp5d3RYWElnTlphV3hrbzdrcUNKMUpoWk1CaTh4T2Z6WFNXRXVGS0pXYWNRdWRWTlRVMnJpNHFLYkV1dWpjaWxXbkgydngzdWFUdUJjN3ZkSFFxYzAzcExUUzZreHQ1S1Nrb09rejFWS0dFREFvRUFuM3p5Q1ZWVlZXMnN0T2JtNWpZMWFVZFpaQ3RzMTlOMk53OWpuV21OalkzRGMzSnl2cVpwMnRXZ2FpMDdLZHRpc2RnckJ3NGMrRnRwYWVsV2g4QVpEcEZ6eHViYVdIRjI5dFFXT1V2WVpEcjNOTlY2YzlhKzJabFQyM3JyMjdjdkF3WU1JRGMzVjcxRFN0amFXMmwyZ2lCZHhyT2pFZzViMU5JSm1yTkx3Q2xvdHBpdFdyVXFZOUtrU2RlNjNlN3BRb2pMMUdYWWRUQk5jMDBvRkhyNXFhZWVldVhCQng4TUEvR09SQzZkd0RscjROSUpuQzF1SFpXR3BHWk83Y1NDc3Q2VXNBRVFDb1hZdTNkdnV3U0JiYVcxdExRa1kybEg2Qnc0bktBSnA5dloxTlEwSWpzNyt6cE4wNjREMUpYWXhmOG02cnIrMHY3OSsvODZhTkNnYlE1WDFVaDFWUjBDSjQ4a2NCMWxUdTNZVzA1T1R0SjZTMDBzbkhIR0dXUmxaYWwzNW5RVnRvTUhEeVpkejVxYW1qWUpnaVBWcFRsRUxhMmdXUVcxYmR6TlVDZzB4ZXYxemhCQ1hLc3V1VlBTaWx2WjFOVDBVbUZoNGV0U3lyZ1F3aWx3aHRPQ3M0WE9HWWRMRmJpT1ltL3A2dDVzMTdSbno1NUoxN1IzNzk2bi9YdmlQcDErV2NNd0tDOHZaOSsrZlJ3OGVERFpFdFhjM0l6Zjd5Y1lEQ1pGTFJxTnB1MGVzQVhORVVkTEsyZzMzbmlqYThtU0pUZTYzZTRiZ1F2VXgvL1VSZE8wYWZuNStkTmlzZGc3TzNmdS9QTXR0OXp5MHNhTkcrT1dtMnBJS2R0bFZnM0RrS1pwU2szVDdGaXNkSllFeGVOeDZTd1hzajBFWnlqRS9xTnIveEVPaFVMSmRxMnlzakpjTHBjU3RsT2RwcVltOXV6WjB5YnI2V3lKT2xLeGJScTNVemk2QkpLQ3RtblRwdHdSSTBiTWNybGNONkZxems0djkwZUlMMlZuWjMvcFgvLzYxemNqa2NqeVpjdVcvZVcyMjI3elc5WmJ2Q09CazFKS1I2RzJVK0JrYWd1ZXM5ZjRTQUpYV2xwSzkrN2RsU3Q2cWxKWldVbEZSUVdWbFpWcGE5UFNGZHNleGtwTEcwUGJ0bTFiajdLeXNsdGNMdGN0d0NEMU1ULzlNQXlEeXNwS0Jnd1lZSCtyUEJLSi9PR1ZWMTc1ODNYWFhkZG9XM0QyWWNYZ3pIUXhPR2ZkbTlNOVRTMExzWXQ2MDlXOGxaU1VNSERnUUVwS1NwU3duVXBJS2RtNWN5ZWZmUEpKc3VEMmNGblAxQTZDRHR4T084dXBTU25GaHg5K21IZldXV2ZOZHJsY3M0RXk5ZkZXd3VZUU5wczk0WEQ0OTMvNjA1K1czM3JycmMxSEVEalQwWFNmMnJrZzAzVXNkSlExdFF0NkJ3d1l3T0RCZzdHNkpaU3dkV1VDZ1FDN2QrOU94dE5xYW1xU1dVOW53VzBIcnFkSWJZVktzZEswK2ZQbnUrYlBuLzlObDh2MVRWVDkyUWw4WXc5QjlRNW9xSUJ3VStJQXlPeWVPUElIUXZFUXlPM1ZtWVROL2tPN0xSUUt2ZkQxcjM5OTJlclZxMk9Xd05raVp6b0V6a3kxM3B3QzUvRjRaRWY5cHM1cElmbjUrZlRzMlpQZXZYdlR2MzkvQmcwYWROclV2SjJTd2xaZFhVMTVlVG43OSsvbjRNR0Q3VW81VXVOcHpvQnNPcmZUVGd6WVdjNUlKSEs5eCtPNUV4aW5sT1lFMFZBQnU5Y2x2aDROK1FOaDBNVEUxMDRpYkE2QjIrajMrNWQyNzk3OUZTR0VuaUp3N1Z4VVJ3ZURUTFhlVW12ZVVndDY3WktRM3IxNzA2OWZQOHJLeWs2TGNVaW5YUEtnb3FLaVRaTEFucHZXVVR6TmFhWFpnVm1uMitsSURHaWhVT2dTcjlkN2w5WHlwRGhSYlBrclZIMTQ3RUs0c1FMNmpvSVJYKzFjMW9RUVk3dDE2emJXTUl3cmEycHFsdmJ1M2Z1ZlRvRkxUVExZQ1FacldJSk1tZDluLy8rb2tneVJTSVJ3T016QWdRT1ZzSFdWZU5xT0hUdllzMmRQc2pYS0hqUFVVVHl0QTllem5kdlowTkF3T0M4djcxdENpRHVVeXB4QTRoSFk4RUxDL2Z5MFZIMlFjRmZQdlE3Y0daM3ExOU0wN1N1OWV2WDZTaXdXVy9MeHh4Ly9mdlRvMGVVT2diUExSQXpBTkUzVHRQZGIyTmxUdTJYUEtXNnBJbWNud0ZMRkxSS0pNR1RJa0ZNMjduWktDRnM0SEdiSGpoMVVWRlMwNmZlMDY5TTZpcWVsV21tV3FDWGR6bG16WnJtZWUrNjV1MTB1MXh4QXpXRSswV3hZQ29IcTQrUEd2djluR0h0VHAvdzFQUjdQN0ZHalJrMEpCb1BQVHBndzRmZWJOMitPQWJwbHZXbTJpeXFsTk8xeDVsWUNTenFISzZRS1hMcFNFV2ZZeFJhM1kxc2tvNFR0aE5EWTJNak9uVHVwcUtoSURvUjBUdVZJVjU5bS9SVnppcHJUU3RPa2xDSVVDazMyK1h6M0FsOVdDbk9TM00vaklXcE9jZHZ5UDUzT0xYWFFOeXNyNnlmdnZ2dnV4VFUxTlV0NjkrNzlsaEFpNW5CUEJhMDlxVExGZ25NS25FeTNGQ2lkZTJwWEFRd2VQSmdlUFhxY1lzTG1YOEdNVWZQWWtIc052L3Z3VVNaMm9SZGZYVjNkcHB6RGJtSlBWM1RyS09VUXRubWV4a3JUS2lzcmV4VVhGOStyYWRwM2xMcWNKQm9xamoybWRyUnVhZCtSSnpTaDhDbmMwNHQ3OWVwMWNUUWEvZlhycjcvK3V5bFRwaHl5M0ZQTktYQ0pYVFRDN01oNmM3aXFISTJiT25qdzRGTXFxZEJsTGJiOSsvZXphOWN1UHZua2syUTVoN09USUYyU0lOVktNd3pEYWFWcGtVaGt1c2ZqK1E0d1JxbkxTV1RYRzYzLzFnL3gwSS8vd2JJR0dEZmo2eXlma0FrWVZINjRpWWRlM2N2NnlnaGtaak42NUFqbVRSL0NhS3NIUExwL053dFdiT0dWdlg0Q1pGQTZ1RDkzVEIvTDlOM3JZT3pBVG44S3ZGN3Z0eTY3N0xMejYrdnJueTBvS0ZndGhIQlo3cW51aUwwSlovd3RqY0IxR0h0THRlQnNnZXZ5VTBMODVheDdaUm51U2FQbXNRY2c4QkkzbDY1ajVrc2JXVmkybFJjWFBNVGlOVnVwaXZyb08yd2lOODlmeUMyajh6ckZheTh2TDJmMzd0MUpVYlBMT1ZLYjJEc1NOV2ZHVTBxcFZWZFg5eXNvS1BpdUVPSXVwU29ubWNBaGFQd2srZCt0cjI5a1JVUEt0ZnZ4djVqeGJEbFZlQ2dkV0l5dm9aWU42OWN6b3g3V2ZtY0lKYzE3bWZQNE83d1doc0xpWW9iUnpJYXRPNW4zZUl5OEg3cVlmTmFoazFMbmRxd0lJVWJuNStjdmpzVml2M25ublhlZXYvamlpeXVGRUpyRFBZMWp0ZkxaazBUc3pLbFQzSnhiejV6TGcrellzbk80UXl3V282eXNLOWFabDdOaXpod1dyZG1HMzVlTGUrYk1DL25kc2plcDhwWnk2UTNYY0dtUm4zVVB6V0wrS2o5OUw1ek9IU1hsdkxKc0ZRdG4rY2xidTVUcEozbXAxUGJ0MjVPRnQ4NmV6OE5rUG9XejE5TlJsNlpKS1VVa0Vwbm04WGkrQjN4QnFVcG5pQzlzYi8xMy9RNFd2TnBJTE9VdVc3ZldFczNMNXNJckxtZnBoQndJN1diV0Q5N2h6YjM3V0I4YXd1U0tmV3oxWk5CMzJGaFczbm9HUmJUdy9LS1hXRmhSeGFxOU1MbStva3NJbTQzSDQ3bHQ0c1NKWTJwcmF4Y1hGUld0c1dKdm1pVnF0dlZHd25DVHFkYWJTSW5Ea2VxaU9qZW4yUUkzZE9qUUxuYmhSS0hvR3VZdm44cmt2Qlc0YjVsM0phOHRlNU1xMzJobXpyK1RpWlR6VEhrZFVNclVlZk9aTnl6S3BXY3RadFdlWFBMOE9MWXJuMWlrbEh6ODhjZnMzcjI3emNKaWUydVVQWmtqSlVtUUttckplTnIyN2R1N2w1V1ZmVi9UdEhsS1RUb1I5UlhXUDJLcytlc0hiS0FINHdhMnNLRkNUOTVsL0xWZlkyTzZBVkFlTDNrZXlCczVrYmRHcG50d0Yza2VTendIanU5U3AwVUljVzVoWWVGemtVamtpVC8rOFkrL25UMTdkcU5sdmVtMGpzZ3liRUZ6eHQ3c1FhZE9jVXRkKzVnUXVTaE5GZS95NXlmMlVqanJQM2xzNXRsZHFCeGtHTlBuRDdPTnQzUXh0akltWGptS0o3Wjl3T0lyeDdKbTFIakdYM29OTSsrWnpMQ1Q1SW5xdXM3SEgzK2M3Q1pJTGJ4TkxlZXcwdG1wV2M5a2dpQVlERjdvOC9ubUNpRW1LeVhwWkZndFV0RzltMWl3S1VMZkN5WnljM3hkRzJHenFmMXdFd3ZlYTZaMmJ4VWI0aGxjZU8wb0pqczMxQjNhelVPdlZsRlpmNGoxRlJwOXg0emxqc0ZBUE5wbFQ0L1A1N3ZuNXB0dlBudlNwRW5QRGh3NDhGMHI5aGF6WEZNaGhEQVNobHByM00zcG1xWk1Fa2tJV3p4QzNkNHR2TDUvUHdmOEp1Nk1Ya3lkdklNUFA0eHo5dGxuZDhtMWYybVRCOFB1WE03YTBTdFl0dXcxMXExZng3SkhYMlBaNzY1azhkb25tWHlDeFMwU2lhUVZOYnZ3TnQwK0FvZWxsdXA2YXJGWTdIYVh5M1VmMEVlcFNDY2swZ3cwOC96eTNWUmw5dU9KcTN1UnR5TDlYZjE3OTdGcWt6L3huN3h1REN0T3FjZnkxN0ptVXdWMUFPNXNocDNSTGJFSS9MTVUvSFlDTkUyYk5HREFnR0Yrdi84LzgvTHkvZ3hvbG51YXROeHdKQlpzajhleTNvVGxzbUthVVJxcnlxbHRDcU9qNGMzcnlhQnpoelAyM0hNNFM2dGc1ODZFcTNyMjJXZVRrWkhSdGM0UmdNL3lVYU5Sd0wrZVorYk1aZEZyZWN4OGNpbXZibHpMUTZPQXVuV3MybnhpWDF3d0dPU2pqejQ2YkoxYVNseE54R0l4WWZkOFdtYTJacHFtVmxWVjFTY2Vqei9tY3JtZVVLTFd1YW45MTBZV1Y4SzRxOGN5OVRDVHJzdXUvaHA3bnY0R0crNDlpN05DMVN4KzlsK3NDVG51TVBnOE5qNTlFOXNXWE13MUJVRmVXL0U2aS9ZYXA4cHA2cE9ibS92VGFEUjYvNnBWcTBxa2xCbldSOWtMZUtTVUxpbWxabC8vVmd4TjJONU1KQklSNFdBejFRMGhvcVlnbytnTVJvNFl6QmtGR2VqTk5SdzRjSUNLaWdwMjd0ekpSeDk5UkRBWTdHSVdtNitJdkZ3Z3NJWUYwMlpSdm5BaGViVnJXTFZxSFZzclAyQnlTUzNyeWdGdkdhTk9ZTElrRUFpMHNkU2NMVksyb0RuSGQ5dXVwMVdmMWlickdRd0dKL2g4dnZ1RUVKY3EyZWprWkJpcytMOERCSUFOeTEraWRIbnJUUnVXLzRVSis3L0NxNWQ1cWRWZDVCWGtVT1J4VVRSNEdOZVViR05oUlMwYnFtRmlmZ3VWWVFOZlhqZEtzc0JYMEorWnc3SjVxVHJJNXAwdGNNN2dVK1owZWIzZTJWT21UQ25kdTNmdk0yZWNjY1o3VnR6TlRpd0lJWVJobXFacEwzaHVHM2R6aVc3ZE1tVkxNRUs0ZWpjYmF6OGh0N0F2WldjT1lxakRYYldQczg4K3U4dE1CM0hqbThnOTg2OWs2NEkxN0NrdnB5cGF3cDFQTHNYLzBBSit0KzUzTEk1NUtUenJVdTZZdDVCYlRsQlRVWE56YzFMVTdHYjIrdnI2ZHU3bllUS2Z5WGhhTkJyOWh0dnR2aDgxL0xGcmtObVRzalA3Y0tFajVGRmJlWWh0ZnBQYzRtTEdueUZZcy94bDVtMkZjVE8reHZJSk9SQnE0SU1HQUMrRm1WQzUvblV1L1o5R2NzZGN6RnUzOWllUE1PWFZZVUFqTDgvYjZYcEdqNE5yZXNtQUFRTUdORFEwUEpXZm4vK0s1WnFLRk5jVVo5ek5Gam1QSjFOMEwrd21QZWdFQTM2YWF6L2hnOW9xYXVPWGNxSFYyZURzVVQzNzdMUHAxcTFiMTRpeGxVMS9rclhUbmQ4ZXo1M1B2c3FkSitFRk5UVTFmV3BSY3lRSnRGdHV1Y1cxZVBIaUgyaWE5aUNuMlc2SExrM0JjQ1pmZXluT3JNNzYzLytabWVzakRMdGtJbytlbDBtdHB5K0ZXL2V6WWZuTFRIb3ZIMTkxTGR2OGtIdm1FS2IyZ2hMUEVNYXRXYytHVGV1WVZGMUVtZDdNaG1vVDh2b3hjMWdtRkE4OTVVNmJFS0tzUjQ4ZXZ3eUZRbjNHangrLzVLT1BQdEljMXB0dWlWa3k3aGFQeDl0a1RLWFhLM01LZWxQWUcyTEJJTzVvTTQyTnliS1JOc2ZaWjUvZDZVZU9kNm9QZkdOajR4RkZMWjM3bVpva09IVG9VTCtDZ29MN2hSQ3psVkowTVlxSEp1YXVIWWFpTDB4a09adFlzR1l2NjNkVlEyWWU0eTRZd2Z5ckJ5VW1GUlFNNGRsN1hTeGFzWVUxZTZ2WlFBWm5EVHVMTzZhUFlXbzNvR0RncVhyMjNKbVptZlBlZSsrOTR0ZGZmLzAzbDE5K2VhVnR1Vm5XVzl5K1k3cWtRdUtMajh6Y0FqSmxDODNONllYTkZyZk8zRi9hYVFaTk9rWE56bjdhb3VhTXFhV3gxT3pXS00wMFRSRUlCTDZRbVpuNWdKcVoxb1hac0xSTjk4RnhwY2NBR0RmcmMzbm9veDAwZVNJd0RHUDF6cDA3Rnc4Yk5td0xFTFd5cGpxUVhBK29hWm9VUXBqV2RGNXA3VlNRenBIajlrVGU3dDI3VTFCUVFLOWV2WklES3p1enVIVUtpODNwZnFhSzJ1SGNUNnZmTStsK2hzUGh5N3hlNzRPb3liWmRtek12Z28wdmZINlBmUnJnY3JtbURCMDZ0S0N5c3ZMcGtwS1N0NnhFZ20yNUlZVEFtVlN3ZzI2dGxsc3lGc2ZoakovaHc0ZDNTcmYwcEF1Yk0xSGdGTFhHeHNhMEV6cFMzTStrcUVXajBSbHV0L3RCNEV5bERGMmMvSUdKS1J6SGU4SkhKNS9zOFRuRTNjYjI2ZE1udjY2dTdxbkN3c0svU1NtZFNRVWRSMUxCSVdEU2NsM2JxVms2Z1JOQ01IejQ4RTZYVURpcHd1WXM2WERHMUd4Uk81ejc2UlMxV0N4Mmg4dmxlb2lUMXZDbE9PNk11QnI4aDQ3ZlRMWWVBeEtQZVpvaGhCaFVVRkR3VUZOVFUwNzM3dDMveTJHNXRRbEYyZUlXajhmVGlsdEhvbVlmSTBhTTZGU2xJQ2ROMklMQllJZUpnalIxYXNLNTQ5TXBhcnF1ejlVMDdTRWdRNm5CS2NhNFdjZG5pbTZQQVREbSt0UDVUQloxNjladGZrdExTM1pPVHM3dm5XNnBVN1RTaVp1ZFhFZ1Z0RlJoMHpTTkVTTkdrSjJkM1NsK1llMWtQS216VGVvb3NwL0N1VUhLanFrOS9mVFRIbDNYZjZocDJrSWxhcWNvN2d6NDBoMEpGL0t6dUovalpwMXl0V3VmZ296czdPd0hRcUhRN1ZkZWVXVzJvMVBCQTdpdFRnV1hhWnJDTUF6aDZGSWdHbzBLKy9NWURBYngrLzAwTlRWUlgxL1BvVU9IcUt5c3BMeThuSTgvL3BoSUpOSXBmbG5Yd3c4L2ZFS2ZVTmQxL3YzdmY3Y1pQZVMwMUZKaWFzTGV5RzRuQ3FTVTR0MTMzODM1eWxlKzhpTk4wMzZnUHYybkFjVkRFN0d4VUpQVlMzcVVWdG81VjUvUUtSNVNTdngrZjZldThmSjRQT2RObXpZTmw4dTFkZDI2ZGZFT3BuZklOSWtEa2VxU09wcnMyeHhGUlVXNFhLN1RSOWlrbEd6WnNxV05xS1hiSkpVNmRzZ3BhanQyN09neGRPalFIMnFhOWwzMWlUK055T3dPSmFNU0l1ZkxTVGhLbmd5SVdUMk11Y1dRWFpnUXNpR1RvUFNDeE0rY1FMcUNzQUc0M2U2eDU1OS92aWd1THQ3K3Q3LzlUWGRtUmpzU042Y0FPdXZaVWdYTy9scGNYSHhTUng2ZDBCaGJSNzJmVHZlem81SU9LYVVvTHk4djZOKy8vNE5DaUx2VkovMDBKYmRYNGxBTmNwOEpuODkzKzIyMzNhWjV2ZDRsdDk5K2V5MjB4czRjVnBsaEdJYnRhYlZKS0RqamE4NDRtOHZsd3Q1YVAzejQ4Rk5mMk96SnR4Mk5IanBNOFczU1VsT2lwbEFjVjNHNzdhYWJiaUlhalQ0M1o4NmNCcWRsbGs3Y2NHUkxPeEsyVkhFN1daTjRUNGdyV2w1ZW50d21kZkRnd1E3SGVhY3I2YkJqYXBiN09VZGRqb3JPU2xkeFJWUGMwakVqUjQ2VVFvaC92L25tbTRabGpiVnpTMVBFcmwyOHpYa09uTzZweStVaVB6Ly8xTFBZOXUvZmY5UXh0WFIxYWs4Ly9iUm41TWlSRDJxYWRvLzY2Q2dVeDUrTWpJemJIM2pnZ2ZpbVRadWVYYjE2TmVrc045TTBEV2d0QmJIS1JlVGgzRkdYeTRYVnBuWEN0MTk5cnNKV1hWMmRYSkdYdW5qbGNERTFaNTNhN05tekg5UTA3ZnZxOGxNb1BqOHlNek8vdFdMRmlsaDJkdlp2YlVGemlKdkVXdEpzK2FiSm1Kc1FRanJkVU9kaHU2TzJ1SjNJdmFXZm03RFpHOXFkN21kSDQ3eFRZMm9weGJjUHFzdE9vZmo4eWNySytrNGdFSWprNXViK2tiWlpVcGxheEd0L1h5U1FIY1haYkt2TkZyY1QxVFQvdVFoYk9CeHVJMnIyNHBYbTV1YkR1cC9XS085a201VFZVYUJRS0U0UU9UazUzMmxzYkF6MTZORmpwV1cxU1ZKaWJKYTRPUzAySVlTUXRxZzVCYzYyMkd4aE8rZWNjOGpNek94NndpYWxaTWVPSGUxMkZLUmFhdFkyS2VjU1kreUZLOUZvZEliVis2azZDaFNLRTB0RzkrN2Q1MVJYVndlTGk0di9MaFA5VjIwKzMvWlhlMkNsWmEyMXNkeWNGcHZUSmZYNWZJd2NPZkp6cjNFNzdzTG1GTFhVN0tlOTk3T2p5YmVtYVlwd09IeVpOYVZETmJRckZDZUhvcUtpb3J2Mjd0M3JQK09NTS82Wllyblo4VGE3OUFPSG9BbE4wMlJIY1RaYjJESXlNajczTXBEakttd1ZGUlhzMmJPSHFxcXFwS1dXNm40NnVncElLZXZRQW9IQUY2eDVhbXIwa0VKeEVoRkNET3Jmdi8vdG16ZHZiaG85ZXZUSGx1V1duTnNtaEdoanRaR1NJVTJOczduZGJ0eHVOMTZ2RjYvWFMwWkdCZ01IRHV6OHdsWmRYWjBVdGVycTZxU28yZjJmRHZlelRhdVVjNXgzWm1ibUE2Z2hrUXBGcDBEVHRDK09HREZpOXNxVkt4K2RObTFhbFVQY3BHTjJHNlpwbW5hbU5KM1Zac2ZhbkJsU2UwTHY1NVVwUFM3Q0ZnZ0VrcE02cXF1cjJ6UzFPMk5xNmNvNnBKVGlsbHR1Y1ZrN0N0UTRiNFdpRStGeXVTNi80b29yYW9jT0hmclk5dTNielJSeHN6T24wdDRxYjR1Yk01bGdXMnoyVjYvWG0zUkpzN0t5UHBjNWJwOVoyS1NVN1ZxbG5KWmF1cWIyMUF6bzRzV0xmNkFXcnlnVW5ST3YxM3ZqdSsrK1c1T2JtL3Q3UzlETUZIR1RxWmxTVGRQYVdHN3BTajk4UGgrWm1abU1HalhxdUNjVFByT3c3ZHk1azMzNzlpWExPbzVtVFY1S0J2UWJxbFpOb2VqYzVPVGszRk5kWFgyb3VMajQ3NENaeGkxdEUzT3p5ajZTNG5hNFdGdFdWaFpEaGd6cFBNSldXVm5acmxhdGcxWXAwbVZBZzhIZ0JHdVpzZHI3cVZCMGJ0eEZSVVYzYk4yNjlkQ3dZY1BldDZ3ejIwcHJseW1OeCtPeW80TGRkTEcyN094c1NrcU8zMGIyVHkwb1RVMU5hV3ZWT2hBMWtiS2xYVHR3NEVBZm44OTNIMm9BalVMUkpSQkNsQTBlUFBpV0YxOTg4Y0FOTjl4d3dPR1NKaTI0bFBxMnBFdWFUdGljNHBhVmxVVk9UczV4R3lEZy9qVDdHdzNUWk0rL3QxSzVldy9WKzZ0b09GUkRjMzA5Z2FabVF2NEFrV0NJU0NoRU5CSkJqOFNFcnNlSTYzRmhHcWFRTWlGc1BUM2hlYUpwMzZYcWNsR2NuRStwQmk0UGFKN0V3RXB2dGpvblI0SEw1YnA0MnJScEZjQlR0TWJiVE5Ja0UxTEZ6WmxJY0xxa3prVEN5SkVqajh2MDNVOWxzWlh2L1lUS3FvTlUxOVRSME5CSXM5OVBTMHVRVUNoTU9CSWhFbzBTamNYUVk3clE0M0hpY1NNeE5saEtJU1ZhckhyMzdVS0l1OVJsb2pocFNCUGlVU0FLc1JZSU5VSkdMbVRrMmQ2VW9nTXlNakp1cnErdnJ5Z29LUGdyWUhTVVRCQkNTRHZlbG1xNU9kMVJwN0RsNU9Rd2VQRGdFeTlzQjZ0cjJGZFp4YUhxV3VvYkdtbHE5aE1JdEJBTWhRaUZJMFFpVWFMUkdIcE1KeUZxY1JJeE5TbWtsQ0pZdGUxQ2w4dDFuN284RkoxTDZBd0lONEVlaHB5ZUNZdE8wU0g1K2ZsM2JOMjZ0Y0tLdDVrcGg1UlN5b1MyQ2VMeGVESTdHbzFHNlVqY01qTXprK1Vmdlh2M1BuSENGZ3FGK1dSL0pRY1AxVkJiWDA5alV6TW9NaklCQUFBZ0FFbEVRVlQrUUFzdFNWR0xFSTNGaU9reDlIaGM2UEU0aHRFNmdtajdodi90N3ZQNTVnSjkxS1doNkpURW8rQS9tQkEzbCtkemY3cDE2OVoxbWwvOW9vc3VPcGE3OXdadUF2YVNpTEcxRVRaQVdpVmRwbUVZeE9OeEdZdkZSRFFhbGZhMnE1YVdsdVMycStycWFxcXFxcWlvcUdEbnpwMlVsWldSa2ZIcFc4V1BTZGoyN3R0UDFjRnFhdXRzVVF2UUVuUllhckVZc1ppT3JzZUZyc2N4REJORFdpNG9pTEl6Qm54ZndHVDE2VkYwYXN3NGhPb1R1eFZPQUdWbmZyYSt5ZkpkMndIdzlmM2lwMzZNYU5XN0FGU2QrZVN4L05nbFlUTzJiVkQ1OTM5TFlxdThnWjFJQUNrUVVrZ3BNRTFKWEVMVWdHQmNhQ0ltTldKb0lvSkxoSENKSUc2WEg3ZXJDWStuRG8vM0VBY1haWEhHR1dkdzVtMGZmYXJmNTZqdDdmMVZCNmlzT2toTmJSMzFqVTAwK3dNRVdvS0V3bUVpNFVSY0xSYUxFZE4xZEQxTzNEQXdERk5JTXhGWGl4emNPVTNUdEhucVU2UG9NcGJiMGE3Nk80M0oxTHpmZW5mZ2p5ZVFtTVRqQTd5V3dlU1NTSmNFVFNLRmlSUUdramdtT2dZeDRrUmxuSWpVQ2Nzb1FUTkt3QXpUYUFTcGkvdXByYTJscHFibVU3K3VveEsyUUVzTCt5c1BjS2ltbHZyNlJwcWIvUVJhV2hMSkFxZW9XZFphc2w3TnlvQlc3M2l2bjhmai9wNjZEQlJkaW5CeklzbWdPTHhQNnVrKzY5bWlXYjA3RURkTmdtWTZ4RTJYcGtpS0d6b1JxUk9TVVZyTUNINGpUR004bUhSUFc0eFB0NEQ1cUZ6UlQvWlZjYUM2aHJyNkJocWJFM0cxWURCTXlKRUJqU1dTQmJhb1lab1NLYVdRU0swZ3Y4ZDNnUytvUytBVTh0YWFZd1NlMjBIa1g5VVlWYUV1OFpwZGZiUEpPSzhudWQ4Y2d0Yk5leFEvSVJON1MzMjVKKzAxZi9MWEozbUdhL241MWIxUDl0bkQ5L09iS0xpaWpzWXhMeE9PdGQ0aUVLTXZ6UnZ4ZFdyNXRlMlNTakNFTTVrQTBrUktBeE1CYU5JUUxpR2tTMnE0aFlaYnV2Q1lVYnpDamM5d296VTNrNW1aU2FVZVlhanIyRVB5UjdUWTlsY2RwT3JnSVdycjZtbXdrZ1dKREtpenNWMXY2NEphR2RDRUM3cHJ1aXJ0T1BYd1AvRXh3UlY3dTR5b0FSaFZRWUlyOXVKLzR1T2oveUU5ck43c284Q25lVzUrYitCUEpqZ3NOaS9nQWR3U3FRR2FCR0ZDV3BjMEtuWENVcmRjMGdoK3Y1K21waVlPNlUwYzBCdVByOFVXRElhb1BIQ1E2dG82R2hxYWt2VnF3WkF0YWpHaWxxakY0M0VSTjZ3c3FPV0NWbjY4dnBmSDQvNk9ldHRQUFNML3F1bXlyejI2cWY3bzd4eVBkc25mc2ZvZmovRFMzbUlLM0g1YUdnTzRoMDFrY0dBTGU1cjhOSWVMR2YrTm16aTM2UGhtZlh0NXV0MEVmSnpPYXBOSUNVS2FTRk1BQmxMR3BTazBZVWczY2FKb3VIRVJsaTY4cGhzUkROTGMzRXl0SGlWSHk2QzdLNHNzelhkOExMWkV2VnBOc2w3TkZyVkVFVzRzVVlTYkdCaHB1YUFtcGpSdEYxUVVGeFhkQzR4Uk1uQnFJUU02WmtPMHk3NStvemFNR2RDUDhwZnR1akcyZU9HWCtPcnM3M0xydHk4blkrTmE2cys5Z3h2dWVKQ1pZLzI4dmE3aXVEK2ZRSXdDcGx0V213L3dTaXZXWm1tTklHRzFZVnR0Y1dtSUdBWXhhUkNWT2hFWkl5U2poRUloV2xwYWFJd0hxWTM3cVlvMUhCOVg5RkIxTFFjT1ZWTmIxNUFvN1docG9TVVlJaHdKRTdXS2NHTkphODJ3dXd2c0xLZ0lIZGd4V2RPRXN0Wk9RVVN1cDJ2L0FvWkU2K3Evd3hIeGtKMmJtMWdha3BsUGRrNHgvZnNsZnVlYzNFemlrYy9OeGY3bUgvLzR4M1BUdUtSMmxsU2taa25qR09qRWlVa3JVMnJxUkNJUlFxRVFUVWFJK25pQVEzb3pOYnIvc3dtYkhvOWJMbWc5RFZacHh5ZnZyT0t2ZjkvQTN1WW9rVmcwVVlTcjY4U2pBZEhVN0Nlc3QzWVh6SnB4amN2bjlkNmI3ckUzLy9SNlNzKzdseGNQcE54UTl6SXp6cHZHUSsrbGNSMys3eWVNdldrWjVVcFRUaU95eVBqMUxmVForVFd5Q3gwWDdJVHp5Rjk5QzcxMzNrM3ZkNjZueHpmN3Q3bUlqM1M3NHZPblQ1OCtNd2VJN2hrT3E4MWpoYjAwYWNYYVpFTFlFdUxXSmtzYUowSkMyTUxoY0tJRUpCNmlMaDdnb041SVhCcWZYdGlTcFIwTmpUVDUvYlFFZzBSMEEwdy9GZVhWaEdLNm5RVWxiaVJNZGRsYWlLczk5L2pQN3dhKzNPR3p4ajVrMGE5ZXAvYW9YbUlMYTFaOVFNblVTeWhUMTh6cFl4Vk9ta0MzUzFNYTAwdkhrUC8wQ0Z3Yi8wbjlWWCtrN3BkMXVPKytuTzVmeXpxNjJ4VW5CRTNUSnE0KzR3ZFRIVmFicDFYY3BJdWt1TFc2cERwRzRwQnhZbEluR28wU2lVUUlHaEg4Um9qR2VJdmxralorT21GcjlnYzRjS2c2VWRyUjFKem9BdzJHaU1STnBBRFpjcENxeG9qZEJ5cmloa3k0MTFJS3BCUU41UjhNZHJsY2N3NzdyRG5aOE1aL3N1aWZMVWQraFhWdjg5SjdnNWg1VVM5MXhad3U1UFluNzRFQkdLOVZZanBDZWU1SlorS3AzVW56STl1SmJXOUUvKzgzYWRuZ3dqZXA3MUhkcmpoeGRITmwzZlRINHR2N09jV050clZ0d2xuYjVyVGFZc1NKeFdKRW8xRkNNa2FMR2FIWkNGRWZiNkU2M2tUQUNCKzdzRlVkU0hRWE5EUTJPVnFtd3NUaUpyaTdrWjhoQ2RmWEVkVGoxdURJNUtRU0laRmFYcDc0MXVabFB5bVpObmt5cFdNbU0vYWFlU3o2Wjl2QW4zZmdWZHd6R1Y3NjZYTnNQa0lNdXZhTnY3UDVDNWN6dWZCdzRyZVB6VnYyNFZmWFV5Y1RxQjU0Si9URjdTd0RHM3NSUmUvZFFON1lqa2JUdVBEY1BZSE11azAwLzNmYlVwTDQwdi9pME9WdkVZdWwvSWpQZFZTM2QwVUdYRDNuVTlXd0ZWODJqMXN2c3djM25zbVZjKy9tSEd0UHNmdWNPL251Tjg0NXhrYzBpUDdnZVE2TWFGdkRkaGo2bnA4eitHcFNFd2xDdUt4RFF4TkpxODFJSkJLSVc0a0VYZGVKeFdLRVpZeVFHU1ZnUkdpS0I2azdveS9oMzF4RXo5ZHZTaDVGLzNGbXUza3NiY285cW12ck9GUlRTNTA5dGNOcW1RcEhvc1RpRWt4QlpsRTNYQWVhOERlN1JKYTN0UThVaVFnZjJINUozYXI1ZDh4Nk5zWU5QMXZDczROaDYvS2ZNK2YreHpocjFVS21KaS93ZkNaLzc5dHN1T2JuUFBUY1ZieDZkMGV6SmcveHlpdjdHRDlyTEhuMnR3Njh6WUtmTG1OenJEL1gzUDF0SmdlZVk4N1NGc3A2dDdENXFWRTgrdFJNaHZtVXBweHd2SVZrL2VKaXNrdmp4RmYraytZTlJYVDd5Wm13SjRycmdiRkV2dk15TGRzTnFOcEg1TlVvK3A0T1lpVkR4OUo5R29SdS9RQzlhRkpLQ01OQU9nVFFOV0VjT2VPaVJPN2JkM1MzbnlZYzJGZkJDOC8reHhIdk4rbUtyL0hGOHk4NnFzZjBYVFNRZ3VlbUFoQmF1WTJtSDZ3OThzOW9ucHZlNlBmQU94ZnQvK2ttSUc0ZGlYNVNwQW5DTkVHQXhBQnBJSVdPSVYzRUVaYXdSV1Nja0JuREp5SmtHbDZhbTNiUXdCZW85NFNURzY1aWRhT1E3T3BZMkE0Y1RHUkJtNXFhQ2JRa0NuSERZYXNJMTVCSWFhRExESEo5UWpSR3drUTBqOUJNS1VpOE9NM3I5ZDZWZDk2M1diazhuN0krT1FCTW5IRTV3NVl0NDRNS21EckM4V1NGbHpELzdwZVo5S3ZIZVA2YXA3a2xYU0g0M3RkNTZlQW81cDJmay96VytxWEw0UGJIV2RsN0s0c2V1SXNadWRONTlybXJLQVBXLy9SZVh0bzVrMkVqbE02YzhMakt0UFBKcW4yVDJ2dGlaUHppTW9xdTkrUC8xbjhUM2dQaWExZFJjRVVQV3JiWFFkVWVBai9hMDhHajlDRDdKeU1Rci82ZHdJY0dUT3JBb252Z2VncG41Q044Y2VJci8wSHozMExIY1B1cFQ1LytBN24va1NlTzYyTkczNmpnd09Dbmp2bm5TbjA5cndIK0RlaUFMcVdNQzd2T1RhS1I2RXJBQk9LWVVwTkN4SVVoUlR5ZXNOcGtuQWh1UW1iQ0pXMm9yR0hIZFM4UXp5aG1lR2EvSTd1aSs2dGFYZEJtZjhJRlRmU0JKa1lSNllZRWFSQ1B4OEhud3lVa2hoN0hxdkxSN3YvYnJ1dUZFRmY2Q25Pby9jZGpUTHZ5U29hZU41blN5LzZERGJFWTZUek9rdW5mNXA2QnUzbmlwMytuTXMzdFcxZjlIZjlGVnpIZVlZSDV2RkM1WXg5YmQrNm1QT29sTDdDUHlnQkFDLzVBNG5iRmlVZjY0NGlpSG5oSEZlUHJDMmJNaDZjdzhXWm9lUzVrNE1qWkxOZjFFOGp0K3duK1grNXpXRjd0WFNMOXViOVJlKzFmYVBqaEx1U2tTZlM0cWNjeDNLNDRrYmlFZHRtbWdUKzV3T0dTZWxwcjI1SWRDWmhPbDVURTlGMWQxNU5kQ1JFWlMzUWxHR0dhakNCMWV1Q3dIUWx1Z0ppdWM2aTZwdFVGRGJaT3c3WHIxZUptUXRpTWVGekVEWUhISllRUk40VmhDbTFvWHFGTGM3bnZCQ2hmOWhDelh1ckZ3bC85bnFsRDh2RUYvczZNeWM5MThQU0R1T1dCcTNocDFuTXNlbU42cXF5eDdCOHhKdjlzRkU3UGN2VGRQK0RLNTVieHU0cEIzUHlySll5dWY1bTUzNzZMeGJRUUhUaUxKNGVvaStta0NOdmYzc0JmZEQ3Wk0rTEVubnFWNW0wOXlQdVBhUlRsdVlCcUFuY2RJWnZsTFNiN213UFFpcURIUDB1dHYySnVCTkR0Lys0a2ErbC9VZnVyT2l1bTJraThEdUxiNnpEUDZrdkJ0S0c0WC9nWDhXVE05UWkzSzA0b1BUM2RyaDJoOWY3WEZ2T2dibGx1VHBkVWdwQVNhVnJpSnVQU0ZDSWVseTZYQ3gwelVRSWlkY0ptakJZalFyTVdwc0Zvb1VadnBzaWRoMGU0MGd2YkFhc1h0TEdweVdwd1Q4eFlpOW9ON3JwTzNBQ2thWThqd2hRdU5CRVhwcFRDazkvdm04QTRhR0h6UDNlVE4rYWJUQitTbjNpR1FBdUh5dy80UnN4aS9wV3ZjL05UeThpTmVaTWxIZEgzWG1hTjd4S1dwcnFWdnY1TXZmc0hURTI2dEZmeDVBdFhFWTJDVDhYV1RpSWhvaStzSmZxQy9mOEEvaHYzZ2RjRnNhT29QWXJWMFRKN09TR254VDNxZkFwL2trWHcxcldFOS9qeFBuQTkzVXUzMFREN3c2Ukl5U2lKbkJzdXZBOWNlNWpiRlNjdFRJSDQ0cklCZDA4ZXNmZUJWVW1YRkd5WDFHcTVRaVJNcDBUNWg1WVlUb2t1VFhSY1JORUp5eGcrMDBPTEViRUtkMXM0cERmUnoxdlEvam5Ea1FpSGFscG5yTFVFZzRuQmtkRldhMDNYZGVKU0lqR0ZFVTh1T2haQ0NIRk5XZSs4RmlHK21YaTRITW9HNWxQM3IyVTgvOC9kYkgzdjd6eDAvMUkraUVHMFEzWExZZUxkMytaU2dnUmFyM0xXdmJTUm9pc3ZaOWhSbmp3bGFwMlVWRkhyVzBydXo4L0RWOWpleFRUMzFCSGY3ampxb2hDTkpyNWZGMFBmV0ljWU40YThiNWJpTHUyQlo5Slk4cTdJSXY3V25rVDErbUZ2VjV4TWVyaXpyNzA3NTh1NXBEVElKMXhScWFWMkpCaUdJUXpEd0ZrQ2ttaVVqeEUwSXdTczhVYTF1cCtJMmI0OVRtdFhzNVpjbmRjcWFyb2V4N0NHajVpbWFTMW1RVWlFZUd6dTJObGVXdlZuOU8wLzVLRVJoM2ppZTdjeDdZRVYrQytieGN6aE9VVHJEMU96Vm5nSjgrOGUyZnFITmZBMkwvMnpGOWRjMWw5ZEVhY2FmZnVUT2FrVVg5OWpMOEdRYS8rUCtoL3VRWHh0RWtWLy93YUZQeTVGdnJxV3hsOVdIOVh0aXBPSFFBeTlzK2VsbDlLMmFMZE5INmxkdEdzbWhBM0RTSlIvNk5MdUpVMklXOGgyU1kwUTlVWUwxWHBUKytmNzV6OWVZbGQ1UmJzRkxmNFd5eVZ0M1R3bG90SEVMb080WVFocFNtM3Jodi9OSDF4MnhqdHduSnNDRHJ6TjgvL01ZZXIwVVJTcGE2SlRjbURjeTEzNjlmZlpjTlV4bUJzRGp1cHVobUZRV1ZuSmdBRURqdnFodS9ET2d3NTU0NDAzMHY5aGtuTFBILzd3aHp1ZWYvNzVPaUFJaElDd0VDSm11YWlHRU1LMHRsbEphOUdMdExkWTJjdGVjbkp5Nk5hdEcvbjUrUlFYRjFOU1VzS2dRWVBhN0VodzE5VzNyMW16VnVjbHJEVnIwMVE4Ym1CWTFwcVVDWFV0R3pqZ2x1TXVhZ0I5THVDVzZVbzhGS2MrRXlkTzdEU3ZwWFV0Nk9kRzZhaFJveVk5Ly96eksrMVlteEJDeHlyL0VFS1lRb2prbWo3bjNsRjdXM3hPVGc1NWVYbms1K2RUVkZSRTc5Njk2ZCsvUDRNR0RhS3NyRldLTkhzcFN6RG9xRm16ZHhmWW9tYjV1NlpwQ3ROcW5kcjBmNnR5WFM3dEZuVnBLaFNLbzZWYnQyN1h6SjA3TnpmcGprcnBzZHpScEV1YVdOZHBDbXU3bGJCTFB4THJCeEt0VnZhbUs3L2ZUMk5qSXpVMU5ZUkNyZldLbWoxbkxSUU90NDc1dHVKcXVwNFV0bmJXMm9oaFEyWUJnOVJiZFhyaTZwVjFlcngyemFYZTdPT0lFS0xzdnZ2dXU1ajJTUVNYbEZKTFRONld3alJOTEdGTDFyVFo0bVkzeU5zejIrd1Zmb2NPSFdwOTJ4SWRCZ2tYTkdLTitVNjRvRHB4bzYyMUppMXI3Y2F2WCsxeXVWdzNxYmZwOU1VM3BxRHJ2dll2RkI2RENxcGFrZU5OZm43K1YwdExTNzFwckRiTnR0b3NjV3RudGRuaVpvODFDZ2FEQkFJQkdoc2JxYTJ0SlJKSkxIL1JuTmFhTXd0cUQ0ODBEQVBUTUszbExBbHJiY21UaTI0RVZPUFNhVXplUFdlVGRYVi9YSDJ6dTQ2bDFqZUw3T2xua0RkbjJOSC9rQ2RUdmRuSDMybzcrKzIzMzU1d05GYmI0U3czcDlYVzNOemN4bXB6Si9ZWFJOUEcxaEsxSkNhR1phMVpGcHZtZHJ0dlZHL1A2WTNXelV2MyswZWQ0cDlBRGJ3NTZzMytIQ2d1THI0Q2VOTVN0cGlVMGkyRWNKTklKR2d5Z2JES1BxUmhHQ0llajh2VVdGc2tFbWxqdGRYVjFWRlNVb0xiS3VXd2Q0SW1sVEZ1MVpFWXBvRXBKVkpLSklqUXdSMVRnQXZVVzZNNDVjbnNCa0o4L3M5akduQm9LN1RVbkRaYnNUUTRiK2VyaTBjTnZ1S09qWmJGNWtGS0hZRkxTZ3dTaGhTbU5ER2tnU0YxNG1hVXVCRW1IZytpeHdQRVlrMUVvZzJFSXpXMGhBL1FIUHlFK3BiZEhQTC9PeUZzeVdMY3VHMnRHUmkyRzJwS3BKbFl6Z0pTZUQyZUdlcUtWNXp5dUgzZ3kvdjhueWZVQ0pXYlFRK2RkcWQ0WU4vaVNjQUhTYXNOUEVJU1IwZ1hDRk1paFpSZ1Npa053OFF3VE9LR2lXNFk2THBCVEk4VDFYWENrU2pCY0pSQU1FeFRvSVc2eG1hMGFDVGhndXB4dlcwVzFISkRyYVFCVWlLYTltNFpJWVM0VmwzMWlsUGJuSEJCVHM4VDgxd3ROYWVscUFGNDNPNnIvdmUzQy9zbExiWkVuQzFsTndLWVVnb2pFV3NUY1NNUis5ZU5PSG84VGl5bUU0MVo0aFlLMHh3STBkQVVRSE9XZHlRTGNXMFgxRFFUYm1qQ1d0T3lzN091VTFlOTRwUzMxUEo2SitKcko0TG1BNmYxNlI0N1lzaUZwR3l6UWxvWlVva21wUlNtbEppbXhMQVRDYmE0eFExaThUalJtRTRrR2lNWWlSSUlobWdNQk5HU1RlNU9VVXRhYTNiQ0FMSHFUNy9MMERSTkNadmkxRVM0d0pzTnViMFMvejVSbk9hYjVuT3lNcTZZT1dWQ2htMjFTVnZjRXJQYUJJbVpSaUpodFVrTXd4UUpsOVNhL3FISGllbHhJcGJWMWhLTzRBOEUwZXdzcUc2NW9IYlNJR210V1NVZWt5NjY0RnFnbi9vRUtFNE5JZE1TMXBrM0I3SUxvWHNKYmZiOG5TaTY4RUxtNDBUSm8zTnZIWmZHSFhWSjBLUzBoWTJrMVJZM1RPSnhFOTIyMnZSV3F5MFVqaElJaFhIcnVJbmp4c0JGWEFvTUtZUWhCWVlsYUpacWF1N0MwdWtuSkVPa1VDaE9LM29XZEw4RWVOdGh0Ym1GeElXUVd1SXZrSlJTSWd3cE1Vd3BEZE1RY2NPUXR1V214MU9zdGxBRXJkVU5qU2RIaFNSYXA2UjlpTWJHeHVGQ2lNdlVXNkJRZEQyaWIvNkdvWGU4ek5aTyt2cmNMdGNsYTVjc1NFMGl1Q3lyTFRuT1NKclNLdGcxTGN1dE5kWm1KeElTVmxzRWQ3SnV6UkkyTTlrVG1oQTFRT1RrNUh4TlhSNEt4UW1rOGpXdXVQTVZ0clYrL01udE9aREowNmN4ZjBvSmh5MUVhZHpGaS8vclovejBNU2R3eWZndUhycnhLWmFsamtiem5NdmlsYk9ZZklTZi91THd3ZU9BVDFLc05oMkJoaVJSK2lHUXBta2xFcXpTRHp0ODFqYldGbXNWdHRha2dUWEZ3elJ0TjFSb21uYTF1dElVaWhPTVp4QUxmanVIRzNvQTZGUnVXczJjUjU5aWJ2YVBlUGJDd3pUeU4yN2pkOHVxeUx0OERHVW50SEhDemFVUFBzYXo0NC85SjNPek15Y0IvMDNiT0pzYlpOeXFraGFtRldzelRGTWFpVDVTbVlpM0dlaEdhNnd0SEkyaHBicWc5b0hWaUJvTUJpOEJocW1yVEtFNHFTcEh5WmdwM0R4RVovT1dHaXIvNTFkdDNjdnFONWcyN1JmODhyK2VZZXdEYjdCSDM4WGMyUTh6ZDVOMXUxN05TNC8vaWduVDVqRDArb1hNV1Z1ZDNFVVNyZHpFUS9jL3pNaHAzMlhvamIvZzloVzdxTFZ1Vy8vNGc0ejkwWitaZS84dm1IVGpmWXk4NHhtZTMzNk1kWGV4U3A2WjgxMnVXRnFaZU03R1RkeCsvWVBjL3FhMTRyejZJeFkrOE1qUVFmMzZEYlVFcmRVZGxiaE1LVFhEbENKdW1DSnFtQmlteE5RakhLenpVeCt6eXovQzdQN3czN3k1UDhUdURXK2gyYUtXTHI0R0NKL1BkNVc2cUJTS2s0MU83ZlozV0xiRHc3QWgrWlJjT0k3Uk5SK3h5bHJSV3Z2K1Iyd3RPWmV2WFhzbkczOTZFYVdlTTNsMHljTThPc2I2OFpvcWFvZC9nMWRYL29xMXM0dFp2K1JsMXJRQXNRb1dMZndMVzRmY3dOcVZqL0hoenliaFc3MkVPYXZyazg5Y1Z4bm0wbnZ2WSswZkZySjBURDJMWG5nL0tYeEhoYmVFVys2OUNQNytaMTZzOUxQdU55dlpQUHdxRmw2WUI3RUtGdnpvUlRZUHVZN1gvL3I0ZWM0NG03UXlvNENtQ1NGY0FqQk5Jb2JFTUVGQ011YVdHSzBHcG1IUzgreHpFNjZvdy8zRWJuYTNEazBJY2FXNnFCU0trNkZsdTVuLy8rWXdQeGxqNjh2RTZiT1pQeWtQT0lkcmhxeGs4WnVWekN2Tlo5MzZLc291dks3am1GcmZjN2xqVWpGNVFONlljeWg3K2cxcWd4RGQ4VFlyZ2lONGR1YVppVEg4SldPWVAvMGRKcXgrbi9JcGx3SlFPT0pMVEM1T1dJMmpSNVRBK21vcUljM1kvaml2UFRLSFVzZDNMcnpuNXl5ZGxJV3ZkQXFQWHI2TkdRdWZKQzlZd3J3bngxRUVSTGU4d1lyZ0NKNmNlU2I5dkZ3Q0xFMjEyb1JJZENJZ2hLbUJRRXJNaFBVbFRNT1VpVGliaGlIQnRGeFNkNnExWnJ1aGdBaUh3MU9BdnVvS1V5aE9kb3d0bFR3bWZ2bE1Gcnk4amZMcCtieTJJNThyYnlzK1dxODI0WUxxRUcwTUVDMCtpeExIMkxtaW52bjRHcXM3dE1wOG55ckc1bUhZVnk5aTlNc3ZVdjdsNjVodS9VN1JSaitCcGdwdXYvNTlnRDREQnZRZjhja24rOTVyRzJkREJ3UVNJWVFRbWtDYTFoUnowelN0amdRd3BVd0ttNVlxYXBhbEJpQzhYdThVZFhVcEZKMlRvdkZqR1YzelBzdit2b1hOSmVPWVduTHNqK0hya1ltdnVwcktXT3YzYW1zYWlQWW9QczZMbEVLc1g3YWF6U1VEOEwyMW1oZXR4V0crbkR4eWUzNko1U3NmWS92S3g5aSs4aisrbUdxeFNkbmFpV0JLaVNHbE1HV3FLMm9tRnBTYWlkSVB6UkkwZTZpYnNNczhMRGRVQ1p0QzBWbkpPWXRyaGpmdzRyS1BLSmt3Z3FTdWVUUHhFYUt5NmNoQmZ0K0lpNWp1Zlo5Rnl5cW9CYUxWbTFpd29vclJVODQ5cnFVaTBTMnZNUGV0Zk9ZOU9JZEh2K3huMGVOdlV3bjRobzlsTWh0WnRLSUNQNUNoTjE2VVlxMGxWL1JKcEdaYW9tYUNFRWlpRVYzb1JweHd3RTlkSEtTWnFHdHpweVlOYkRjMEZBcGRyTnhRaGFJems4WEVTWVB3YmZCejVYakhxUGFTYzdqNTNIZDQ2TTRmcyszQmhUeDZ1SWZ3RG1UZWo3L09nbDh2WmRJMFA5SHNmQ1orZFRaUFR2azBvOS9ieDlqZ0xCYTlNSWtQZnIyQm9objNjVU94QjJaTVkvSTlMekIzOVZrc256S01oVCtleG9KZkwyWENNajlSYjE2ZnkyWitlOGcvbHYzbmh5VDdSbkZKbVJnWmpoQkNBeUdsa0Y2WElLcEhPVmdmdytWeTQ5TWtwbFgrSVhyMjdFazBHaFd4V0l4NFBDNU0wOVNrbEM1ZDEzK21hZHAzMU1XalVCd2RuMmF2S0IrditteVcwS1kvTW1sNUNjdC9lUkVscDhoNURJWWlTM0xHWHZzaTBBSUVnS0NBTUlLb1FPaENZR2hDbUc2WEpyMGVGejZ2UjJiNnZHVDZmR1JsK3NqT3pFQkx6WWFTcUYvVE5FMmJwQzVWaGFMekVtMnM0UGtWMnlqNThybW5qS2dCWkdYNnprdm5pbUxOYWNOdXM1SlNKRG9SVEd1RmdaSHNSTkJTaW5LUlVvcUdob1pocUdVdENrWG5aYy9MWEhIck03elU0eW9XVHNrN3BYNDFJY1RacTUvNVVlOE94RTFJaVVDQ0thMU1xTE9IMURyY3FRM3ZKSHBETDFKWGprTFJpU205aXJVclQ5M2ErVEZubnprTTJHOExtd1NYa0dnSTIyS1RRb0tVZHUrb2RkaGJyWkpaVVZwSEZBbVh5M1dodW5JVUNzWEpvbnRlemlqTFNrdE8ra2djc2xXcnBOMC9LcE9WSFlaMWFLa1cyL2UrOXoyWEVHS2lPclVLaGVKazRYRzd6aHQ1WnIrVWh2aGtuSzExbEJHV0t5cmJ1cU5haWh2S3d3OC9mQUhRVFoxYWhVSnhFdW4yL0NQZkxYVmFiVExSRkovWUZpL0JtcTZMdEVRdE9kTElhYkZaQ0ovUGQ1NDZwd3FGNG1SVFd0SnJTSHRYRkszVkhVMFlaYVoxR0xJMUVhbzV5enhJekY0N1g1MVNoVUp4c3NuSnpqekhZYkcxS2Z1dzlVcGFXVkpwN1Q4MlpHS3NrV1piYTFKS2NlMjExN3FFRU1waVV5Z1VKeDIzeS9XRkFiM3lYU2tXbThzU05FMUtCRmh4dGpidWFHdU1UUUJpeVpJbFh3UnkxQ2xWS0JTZHdXaGI5dWg5L1oyaUpxMTlvemhXOHlYaWJNNmFOb2ZGQnBDUmtmRUZkUzRWQ2tWbjRjd0JmZHNrRUdnYlp5TTF6aWFsaVNuTlZ1VWpVYjgyUnAxS2hVTFJXZWlXbXpXRWRzbUR0bkUySEhFMjAweTBXYmtkWTRxRUVPSmNkU29WQ2tWbndlTjJENmQ5akMzWkw0cXpuaTNwanJaYWJPemF0YXNuTUZpZFNvVkMwVmtRUWd6NjVmZG01WFFrYmlSVUxWblBacnVsZG94TjlPblRSelc5S3hTS1RzZWw1NS9ieHhJeWErQWtHaEpoVDlXVldKVWRWaGVDbEk3c2dzZmpVY0ttVUNnNkhYMkxDL283ckxSMnRXeFlJNHhhdXhBU3dvYVVVcmhjcnJQVktWUW9GSjJObkt6TU14eWkxa2JZckRoYndpT1ZDTXNWRlpyZEl5cUVVTUttVUNnNkhSNlBlMUNLcUxrY0ZodXQ0cFpJSU5pdUtOWWR6bEtuVUtGUWREWTBJWVk0ckxUMkpSOXBFZ2dhSUdwcWFnWnp1SFdCQ29WQ2NTU3FOekYzem9NTW5Yb2ZjOWJyeC9PUmZTc2Z2Ny9RS1dqU21zZEdzdVREVGlBNExMYWNuSnhCNmwxUktFNVgvTHg0L3k5WVZBbFV2OEcwNzc5QjVURS9oczZhRi83Q3VwNVhzZmFsWC9Ea2VFL2JtN2UveElRYmw3SW05dWxlNGREU2ZrV2tMZEsxT3hBU2dxYnJCdUc0WmJHNTNlNHk5ZVlxRktjcExidDRzM0VnRjVaQTdaWnRSSWNQK2hUTFljTFVOdXFVakJqVVpxdDhrdEtMZUhMZUZNWjdQOTFMTE95UlY1ekdIUlZ0RHlrTTB4UzZBVzRwcGRBMHJWUzl1d3JGNmNaVzV0NzZJdXVDWWVwaUhqYmYrQkhSWUlDb3Q1SUpOZGV4ZHQ0NWJlTlRzVXBlZlByUExGNWZSUzJaRER0M0NndnZ1b0JoT1pVODgvMW5lR0pIbk5pT1JZeGRQWlpuRjEvRGFPZlA3bGpMN1kvb1BQcW5iekQremQ4d2NobmNVQnBtM1k1cWFtT1pUTHpwTmg2ZFZJeXY4VzFtM1BvT2VSZG1Vcm05Z2RvbUtQdnlOQmJjT0tSUFcwc3RHVjhUSmxKb2dHN2F4bU0wNFlvS0lRYXFOMW1oT04wWXhxTy9mWVNWTS9veWF1WjMyZmlIT2R4Uk1vajV6enpDVzZtaVJvZzFqei9ERTQxamVIYkpZMnhmY2lmWEJGY3o2L0ZOMUZMQ25iKzhqL25EM1l5NmFSNGJVMFV0SFRVTk1HVVdhMy83Q0cvZE81RDFTMTVtVFV1cmE4endHMWk1K0dFMlBqT05vdlV2OHBNM1E3MHR5Nnk5dUFGU0NPRjJpY1FkM043RURVS0lBZXBOVmloT1IzUzI3Z2hRZGtZeHRGVHlRYXd2dzNxa2MxZTNzR3g5SnROdnVvaGhPVUJPQ1RmY05vNjg5OTloWGVPbmVOcWVaM0hOaU1UYXdMelNNeW1MTlZBYnRHOHM1c0l4QlFsaDdYRU9kMHpJWmVNN08wbzZFRFY3c1Fza0J4VkozTllOU3RnVWl0T015dFhQTUdOWkpmNm1NR3g1a0hXRXFRdDYySHhyQlRjLytEM3VkQWFvbXZ6VVVrQnBUNmM0OWFXRWo5alRDUFQ0REMvRXlqTkVkU0JOREs2b09BLytIZW1YWXJFSkNacEltYVpyeTV1MmE5ZXVZaUJEdmMwS3hlbEZ5WlE3ZWV1WmFZenYreVdXL3VFUlhwMTVKbWRkZFRjYmY1c2lhZ0RkOHlpaW5qMDFiZDNKV3ZJbzdmSDV2czdLeWdiSXpzMzQyYnhiY2pxMDJGTFFDZ29LZXF1M1dLRTRUYW1wb0prdkJxQUFBQ0FBU1VSQlZMeTRoREtnZkU4OUphWEY2ZStYTTRLWjQ4T3NlT0Z0dHJZQUxaVzh1UFFOYXMvOUVoT1B1N0JWc2VwL0svQUQwY3EzZWVMTk1PTW5uTWtYQjUrUjV4Q3kxbnEyRktScDR2YjVmTVhxM1ZVb1RrLzhsUTFRTW9ZOC9KUlhlaWliNHVuZ25sbE12dmRPYXAvK003Tm1yOFFmeTZScy9CU2V2V3NNUmNmOVZlV1NWN21hYWRmdm9qS1d4K2dwTi9Eb3BEeWFkL2ZJNjhCYWExMUdKUkNHYVVnUmpVYnY5SHE5VDZ1M1dLSDRiQmlHUVdWbEpRTUdIRVBJK3VOVjZzUTVhWHliR2JlK3o1Vy9uY01OS1paZ1pYWGRnbjVmdnZrZElHQWZBa0lJSWdJUkV3SkRFOEowYVpwMGE1cFdwTTZtUXFIbzdHUmwrUEljYm1nYlM4MDU1UU1rbXFacEJlcVVLUlNLem83WDQyNFhZeU5kakExd0N5SHkxU2xUS0JTZGdoNFhzSHpsQldsdmNydmJDRnY3UXlKc21kUDRiQlVvQ29WQ2NVSndhVm82VjVRMlZwdFZxS3NCZWVxVUtSU0t6bzZtaVJ6U3hkWmtHM0VURXRDRUVFcllGQXBGcDBlSTlzS1dhcm5aWFZVYWtLMU9tVUtoNlBUQ2x0QXFwL3VacHV0QUpvVXRTNTB5aFVMUkJTeTJ6QlJSYzJpZWJDTndHcENwVHBsQ29lZ0NaQnpHRFcxanRXbWs3YWRYS0JTS1RvZTN2WGVhVHRaUXdxWlFLSTZHRUp0WFBNT0U2Ny9MME8rL1J2bkpFN1oyQ1lOMkFpZGI1NGNyRklwVGxTMS9adExDajRpaXMyN1JRdVp1K2hRYnBDcmY0YUZsZmlZL3ZKRHR2N3lVNDdja3BaNTEvL01HYTZxUDZzNnV3MWhzMWtaNE1HbHRTMUFvRktjb1d6ZFZVRFJtSUQ2cWVHMVBNUmNPOFJ6N2d6UTJVSnZkbHd1SEh1OWNZd092clZqTmEwZTNGa3ZyMEVxelRMWEVKbmdRVWtxcDNucUY0clBUMmFaN2xQL1BrOHhZVVlXL1NjZlhQUk9mbmxqYVVwamRrNXQvM0g2WVpPMm1sNW43bTNkWVg2UGo2M2ttMDJkOW5mbmpDNGl1WDhxRXh6K2lMZ2k1MlptTW4zMGZ6MDVxVy80YXJkekVnbCsvd2lzNy9FU3ppNW40MVdrc25ING1SY0M2UmZjeE4zczJHNzkxWnVMTzYzL0QwTi9rcy96SGVTeTRmeTFibThLUW5Vdlo1YmZ4NmxjcjB5NXplZlMyY3lnQnhQQ3AwNEFnaWVrZWZxQUZDQXFJU3RDQk9DQTFFcGFiUXFFNHhTajc2aHcyL3ZZbXB2WThoMGQvK3dodjNYc09mUytjemNZL3BKbVFXL2thc3g3OWlKSlo4L2h3NVM5WWUxcys2eDVmd3FJOTRCcy9pNDBQanFPdys3azgrYWRIMm9rYXNRb1dMZndMVzRmY3dOcVZqL0hoenliaFc3MkVPYXZyRC84Q1N5NWw1UjltTTcxN0psUG5Qc0tyc3daYU43UmY1dkxRV2orSDFTcVJtQk9lR01xbW9RR0d1Z1FVaWxPVW1pcktldzVpbUJmS3QxZFROcnh2MnJ0dFh2ME9sY09uTUc5OEFUNDhGSTJaeXJ6aERheFlYWEhFcDRodWVac1Z3UkhNbTVtdzBId2xZNWcvdlMrYlY3Ly9LWk1NN1plNXJIOXJHLzcyV3RXK1Y5VENEY1JJcmxOUUtCU25CbHQ1Nkk2L3NLYkpUMTBzazJrM3JrN3NETTEraEFudlQrUFZlV1BhTkluWE5vYkpLeTV3ZkMrTGtwSmMvSlgxUkJtWXNvb3ZSZGdhQTBTTHoycXpLTG1vWno2K3htcHFqOE52a2xqbUVzYWYwS3FqUXVNWTdxeFFLTG9LdzFpNCtHR1dmam1mQys5NmtJMS9tTVhVbmlNU0xtbUtxQUVVOWNqRVgxMlBQL2tkbmNxYUFIazlDZzRyYWdDK0hwbjRxcXVwZENoSmJVMEQwUjdGaWJIaG43R2d6RnJtUWw1N3JaSXBYOXNJVzFoZEJBckZxVWlJOG1vb0s4bUN4bXJLdmNXVWRTQXlvNmQ4aVpKL3IyWFJKajlSRW9tRUo5N1BaL3FVZ1VkOEZ0K0lpNWp1Zlo5Rnl5cW9CYUxWbTFpd29vclJVODZsRENncHljZS81U1BXTitwRUd5dDRmbldGUTZFOCtMdzZ0VFgxUkpQZlM3L01KUThpUi9Wcnk0UXJHbElYZ0VKeEt0TEFCNVVGbkZVQzdLMml0dWVnanV2UFNpNWw2ZHd3YzMvekNDTWZzYktpOTg1bVh1bFJQSTEzSVBOKy9IVVcvSG9wazZiNWlXYm5NL0dyczNseVNtSTRkOW5sMTNIUGxxWGMvdi9XRWUwK2dLa2o4c2xOL25CZnJwa3lrRm0vZVlSSmUrN2tyWm5RMFRJWEtXVTRqWFhtK0w5QUNJa3BUU21rbEI4QUk5VkZvRkI4TnRReWwrUEFZWmE1bUZKdWNZMjQ2b2UwbG5zNEY3cEVCVUlYZ3JnbWhLbEpLZjNxYkNvVWlzNk9sTEtsWTJ2Tm5wMmJRQU9Vc0NrVWlrNlBhY29XaDRESmRJSm1lYVM0cFpSTlFnaDExaFFLeGNubk1NdGNETU1JSE1aaWMrb2FtcFN5UVoxTmhVTFIyWWtiaGovRllwUHB4VTJnU1NucjFTbFRLQlNkbldoTTkzZmdma3JIdWdNQU5NTXc2dFFwVXlnVW5aMVFKQnFnZld4TnRuZEVRZE4xdlZxZE1vVkMwZGxwOGdjN2NrV1RZbWRuQzl5UlNLUW1KeWRIblRXRm9oUHh5WUVhZFJKUytHRDdua0RIb2lhdEZhT0pRV3p1Z3djUEhpd3NMRlJuVGFIb1JBem8wMU9kaEJTcTZ4dnRjZy9URmpXUjhENmw3WUlLSWRBMGdUWnk1TWdhanJZSFM2RlFLRTRPa2JtL1dobzZqQ3Y2Lzl0NzgvaW82bnYvLy9VNTIreExsc2tlRWhLV0VFUkFLK0R2aWxoLzZOV3FiUzlZV3JTOVNsdSthUHVyMUc4TDFRcTl0cUJ0b2N0RmJ5dFdyMWhic0ZxZ1ZXcFJSQlRVRmxjVU5TeWFSQ0FRUXNqQ3pHU1ptWFBPNS9mSG5IUHltWk16U2JCc3d1ZjFlQndUQW1hWk0vUE02NzE5M3RUYUNZKytvM2IzODhlTmk0dnJUQldsOUlBTlpEcmozREpFRExCUlN1aysvdEJ4Y1hHZHFkSjAvYUFOYWhsdXpkeVliQVNrYWJEcHV2NHhmK2k0dUxqT1ZDV1Rhck9EWTNOcytTQWt2Zk9BYXByV3lCODZMaTZ1TTFYeDdwNW1oeEEwYSt1SGxLWmhza0ZSK041a0xpNnVNMEVwYkZqNkE4eC9UVTMvc1dBYWZuN0haMW94aEJ3YklTUmRHUVZBT3pvNjZ2bUR5Y1YxWmluUjlCWVczWGszeGw5M0cycSs5a3NzMk56RW5ESTdORURVYlg0ZWEzZWZyTE5rVzdCcDdTdlkzbkdpUDYrTTZ4YjlDcnZXL1JMdkxCZ0hCVUJEL2I0MkJtWTIxMmFPVXhIcnZ3SUFXbEZSOFJGd25JOFpGeGZYeVZQeVF5eForaVIyVk0zQStzZC9oczBMejBmVHd3OWd3ZmJqZ1ZRUGRyeXdFV3Yybkt6VC8xdXdiczFMMk5aeGNqNjdTNUVSVEFlU2lUdSt2N3pEN3RRSW9JTms5TFNsQ3dna0hZcWExbTRYZ0FuOEdjWEZkZm9WM2Y0U05tQVNIcDE3ZnZvNDczRlhZT24xYitPYXA5NUQ2NVRKaURpY05MdHA2Zi9Ga3NMYjhQTGNTdXg0OU9lWTkydzdvbDBxa251V1lmempBT1FSV0h6ZlhGeWZBMFEzUDRCSmF5VmNWOWlPSFEzdGFGVktjZjNjRzdGNFN2bzQ3OFMyaHpCK1RTSFdyL3c4YWdFQUgyTFIxeDVHOUxzL3gzMFh0dUNSTysvRGlrWVZpVlFQdHY3d0IxZ053RFg4YWp6KzA4dXlIeitlb1c1c1g3c2FTNTdhaGZvdUlGZzJCblBtZmhtM2pnczYvRnU2eHdZMUhZQk9BUW9LQ3FTM3ZoTmlMQmFsZWpySGhuUmx0RTRRQkE0MkxxNHpRRTBOTFVEVlpBTXFhVldQcmtUd3FROVJqOG5wN1U4RGFPTE5QOERyTjBleCtzNjdzVzdLUXF6L1FsNy9mOVNwWXNLaS80dmxaVEphdHorS0dmKzlHbFVyYnNPTmhZTjlkNFg0K2svdndkZXhFL05tUEkzcWV4Y05iVGNDRzJhL3RSNjNQUVVzL09uUGNYMVpDblViZjQrYjcxbVA2b2R2eHBXMkNVOWQxK3ZSUDdlbUE5Q0oyWlJMUVRWS0lZR0FDQ0lFUWdnRlFGVlZyZU5QSnk2dU0wT0pMaFV1UmNwY2ZlZVQ0RXFwSnk1blZEQUNVOHJTSzRValU2N0dEUVVmNDIvdm5hSUR0UlVacmxRUFdqdWlpTUtMMnF1L2ljMFB6TUkwaDdGMVhVdnVRLy84R2hPQ0Vpb1FBSlJDQTFNOEFFQjdlbm8rNEU4bkxxNHpReTZmaEVUU0JyRXVGUWxaR25UUDV5ZFRBR1U1UUxUejFHempkSTJiZ2NlL093YTcxanlBNlYrNUM5UC9hejAydEtpT1AxdXlOMzdRQmpRTjlwWVBRaWhKVDhKVFF2cEdxdWpldlhzNTJMaTR6aEJWMXhRQ2V6NUVYVVo0Mm9SbzJVZ2poeVVEU0NGeHd0YWR4OURVQWdURG5qUjRGQm11Vk9xa1ZSUVRMUzFJakw0TTkvMTBFVjcvMDEyNGIyb1BWdDY5R21zZENoSFI5Z010QnNBMEJtckdaVlJFS1FVRklCQ1N2a3ppVFo0OCtTaUFEL2xUaW92ckRIQnNGMXlCNitYWHNlU2hPdFRIdTlHNit5VXNXTnVPSzc4d0xwMWZ5eWxGYmNGQi9PM2xKa1NSUXV2dTU3SHFmZFgyV1R3b3k1RlIvL1l1MUNlQlJEeUtLQXZDSXp1eGFYYzNnQlRxTnorTlZVY3FjYTJadkI5ZWllcU9YZmpiZTkwQXVsRzMrU1ZzNnJSL2wwR1U1YlJqKzl0TmlBS0lkblFQR1lTdDI1L0FOWGMrZ1UwdEtRQmVSQW9EY0NYN2c3UTNnWStPSGQ3Wmc2eXRIdWxMcHdDSUFKbWtpd2hXOFFDQXJ1djYyNElnak9SUEt5NnUweXlsRWdzWHpjS1MzenlKYTJhM0ErRlNYSG5EclZnK3hXdjhnekxNLy9abG1QZmZ2OEtFMzhzb1BlOENYSGxlQUUwWm4wVEd0SnRtNE1wN25zWTFNNThFd2hXWWY5ZjNjR3VOOGRjK0wzWTkvaXRNZXE4ZDBaeEtYTC93eHI3Q1FlRy9ZZWxOSCtLMmV4WmhWZEtEQ1pkZWdDbWw5bSt5RXJmTW5ZeDV2L2tWSnZ3ZUNKVCtHKzY3YnlhbURhSFh2K3dMTitQQmp2Vlk5djBmNExZdXdGVlFpZXUvZTZOUjRlMXIwS1dVZnVBVWhwSjBWVlNuNmVQWEFFS29MS2JkR2lFRVJCUkZXZGQxQ1lEYzA5TnpxOHZsK2hsL1ZuRnhIYjgrVFF1VG81c2Z3S1NuUitDWis2NFlZbnZHNmRIaG94Mi9MTDdzUDE5RmVrbHlISmxMa25zQmtoSUlWRUtJTGdrQ1ZTU0JLb3FjenJHWmxkRm9OUG8yZjNweWNYR2RLZHJkY0dDZnphMnhPVFpLakpFcW96R1hrblNPalFwc25EcHIxcXkzRFNweWNYRnhuVzdGdi9hRDVTM0lySVJtZ00yOENDR1VrTDRUZENWQ2lIRktPUFN0VzdmcWxOTHRoSkRwL0RIbDRqcDdGWngrSzNhZjRhOXlWZFBlYW1ydDdBYzFZNVNLQXNSd2JlYU1hQnBxYkI4YmpMZTZxcXJiK1czbjR1STYzWXJHdTk5M0NFUFpjSlNtWTFCWWJvMlk3UjdHSDZpWlo0dkZZcS96aDVTTGkrdDBhKy9IQnhzR2dockpPRG1YUUNCR0g1c2dJQ1BIQmtELzFyZSt0UjNBTWY2d2NuRnhuVVlkKzhhaVh6ZGxnWnBEamcyVUNBU0NRS2dnR0k2TkVYM3l5U2RWWGRkZjVvOHJGeGVYa3lnOStWOGpwYXF2MVRVZVlzTlFOUk51Zldld01lRW5DQkVnRUNGZFBDQ0VtSDF1RklDZVNxVmVjYmxjMS9KYnlNWEZCYVM3WVErblBEaVNVS0NCSUo3UVR1clhhMnRyMjVrdERLWHBBZ0tsNXRRQkNGS1VBRlFFcUFpcWkybXdBVll2bTA0cHBTMHRMYThNR3phTTMwMHVMaTdvRk5nUkN3S3VBUHg1UWZoOGZoU2U1Sy81NFVkL3IzZUFtZ1pBTTFsRkNLRkVFQ0FJQW1SWmhxSzQ0SEs1NEhhNzA4Y1dtWVVEMDdGVlZsYnVCdkErdjZWY1hGeUhVMjdBRlVCaFVRbDhQdjhwQ0hWcDNkeHZmcjNORm9hcUJ0UnNSeGFaUFd5Q2tWOUxnMDRRQkFGTW5zMkNtNnFxVy9ndDVlTGlPcEpRNEE4RVQ5blg2K3JxZWczT3ViVytpbWpha0JrdEhnSUVnY0NDbWloWTdSNW1LQXJqZjlTajBlaEwvSlp5Y1ozYm9oVFFxSkRkcWJWdHg4cnZmUVdmdS94aVRML3FQL0REdnpjREFKcWYvQ1l1dmVSaTQvb20vdHc4OUs5WlgvOVJIVEx6YTdiQ0FYVExpQm1UQm9JZ2dCaFFFd1VSa3VuWUdMaFJTcW1lbjUvL2lwN2V2bHpLYnk4WDE3a3BRb0I0VXN1U1U0dmg1ZnNXNDFsOEN5dWUrZytNVkdLSUlRQUFLSjcxTUxaOUlZRkUrOSt4NE1abmp1ZExIcnIyYzFmdHQ0V2d4bVVQUXlrMFZZY2twNkVtc283TnNHOU9TMGMxVGRPZTQ3ZVdpNHZMV2MzNDRNTWthcS8rSEVZR0FMZ0NDTEJINExwY2NCM251dUtlbnA1dDJkd2FJZENRc1hLUFVsM1hxSjUyYkZRUVJJaUNDRkh2N08vWXpMbFJBSG9zRnRzY0RvZS96bThnRnhjWEUzOWk0NTMvaWZ0M0pKR01KNEZmWEl2UC9RS0FNZ1YzL25rSnBycUc5amxlKytNeVBQamtkdXlQS3lpYWVBM21mZis3eU85c2ZOY0dOYXR3WUxSNTZBUklBODM0VE1sNEhPM3hPQVJQQkZWbFBvakVuUWFiZWVtNm5nRzMzTnpjelR3YzVlTGl5bFFlcnY3cE03Z2FlN0h5aHJuWS8vVy80ZDdweDdlSllkK1RQOENQLzE2Qk94L2NoS201Y2J5MjhuYjgrSHUvUGZUZTFwODBHc1pLdFlNTmxPb2doSUlRS2dvaVJLSWhxUko0d2lFRWpUWVBVUlFnZW5JZ3BDMmNrREV2eXBSVWRVM1ROdklieWNYRmRlSzBGeHYvK2lGcXYvcGRUQzEyQWE0OFRMN2xHNWg0OU9tWDRKaGI2ejlLUlVoNk94VWhBREhDVUVFVUlZb2lSRW1DSUlxaTVkak1rQlI5Ky91MHpzNU9Eall1THE0VHFIYTB0L3RSVkJ6bys1Q3JBZ0Z2MjQ1c1lhZ0Z0NHcyRHdBZ1NFTXRYUTBWUlJHU0tLYkJac0tOZ1pyVnp4YUpSRjVCZWtzOEZ4Y1gxd2xRTG5KejR6amNGck0rUW51Yjkvem1qUVAyYW1qS2hCckpQREhYT0NrMy9mK3lVQk5GQ1pJVzY2dUttbStaWTR5c0FkUmtNcm1CM3d3dUxxNVBySXcxZ2FOdzlSZEhvdTZSMytMbDVnU0FOcnp5MndkZVF2OUpnNHpDZ1hXd3BNRW9RUlJBb05ORWtrSVVDWFFLU0pJSWljWWdzWTZOeWJVUnBqcXFIVHAwNk8rVmxaVUwrZDNoNHVJYWlwcWYvQ2ErZkYvZnF1SjNicndZOXdPWTlNTk4rTVhuQXFpWTlYUDhWOXNTM0QvdlN2dzRya0FMalhqWHdhM1pHM01wVE9NbENCQmtCWDZ0Ry9HT0kyanNKSkQ5WlJpWG13TTVNQkpreElnUjZPM3RSVzl2TDBra0VraWxVa1JWVmFMcnVrQXBsWkRlek9wU1ZmV1BnaUJjeVc4WkY1ZXpQazFicW9ZcVNvRzNZMkVVVnB5OHJaeXFxcjQ0dktKc0pZQmU5RzJqTXE5dVFrZ0NRSW9Rb2hKQ2RGRVVxU1RKVkZFVXVOd3U2bmE3NFhGNzRQVjY0ZlA3RVF3RUlFaVNaRHEyak9xb1BSenQ3dTUrbWo5MXViak9MUkVDU0VSSFY5ZkoyL0hVM0h6b1ZZY1FOQVZBSllSa2JxVXkyQ1FJQWtSUm9GWnVUUkloU1JKa1NZS3NLSDNGQTNzUndWWWQxZSsvLy80TkFBN3dXODNGZFc2cFFFbWdLM1p5RHRXbWxEYjkxNDhXNzJMQWxyS0ZvVHJNSTRyTW5RYlcyRlFmdHlSUlNvTk5scUVvU3A5alkvTnNnaUNBb2FNT1FMdnJycnQ2VXFuVU9uNmJ1YmpPTFJVcENkQkVIRWVhbTA2NGM0dkg0ODg5dittNWxKTmJBNGc5djVhR216RVhhb2VhSk11UUZRVXVsd3VTSktVL2FQd2pLb29pMFRTTkNvSUFUZE1vNDlyVUF3Y08vTFdxcXVxNy9GWnpjWjFiNGVnRmdTaU9KTHB4dUMyTzJGRVJYY2tUYzRMdUs2Kzg4bllXdDZZQzFCeDhUM09JR3RKMWFKcEdOVTJGcXFhUVNvbElKa1ZJdlNKNlpRazlMcVVQYkV5dWpRMUhNMlpIUjR3WXNVdFYxZldDSU16Z3Q1dUw2OXlDVzZGYlJhRTdCa3FCekZVcG4weUpaT3B2bHkxYWROVG0xRklBVWdSUVFjd3dGRlFnb0NJQlpCRlFKTUN0RUhnVXdPc0N2RzRnNEFWQ2ZpQTNDQlRrQUlJc3k3QzVOdGdINDQxUkt3M3BTUVFlam5KeG5lT1FPeEhhM1hqZ1ZRZTNsdEhta2JGaXp6aDNUUlRUb2Fna2lwQWtFYklrUXBZa0tJb010MHVCMStQdUE1c29pdVpiYW9hbHpKSGhWblUwUHo5L0M2WDBWWDU3dWJpNFBxazBUZDgrWWViOHhnSGNtdFozL2xyYVhJbUVVRkVnRUFXUlNxSUlVVXpEVFpZa0tMSUV0eUxENDNiQjczVkRVQlFGc2l6RDd0eHNEYnRXRVFHQTJ0WFY5UVMvTlZ4Y1hKOVVCdzYzdmpDQVcxTU50NmFUOUpaM0toQkFFSWpoMUFSSWttQTROUkdLTE1GbHVUVVhBbDVQSDlnY2lnam1pRlhHN0NnQWJmcjA2ZXNvcFh6WkN4Y1gxM0ZMcDdSdTZsZS8vMzRXdDJiTWgvWVZEZEpnTTl5YUtGRFRxYVhiTzJ4dXplTkdNT0NENEhLNWtBVnVHYTZORFVkZmYvMTF0YmUzOTNGK2k3aTR1STVYUjlvNm4yMXE3V1NobGpTdU5OU0llWkpIdW45Tk1QWWFtQzBlYkc1TmtmcmNtcy90UXNEblJZNGRiRGE0c2E3TlBoaXZybG16NWtrQTlmdzJjWEZ4RFZXVTBvWWYzZitISFlPRW9kWkp1UVJBMnEwSkVNVjBiazJTUk1paVpCVU1YSVpiODNrOUNBVzh5QTBISUhnOEhqakJ6VlloWlVOU0RZQTJkKzdjYUc5djd4LzRyZUxpNGhxcVdqdWlHeDVhOTN6Q3lhMFJJR1VVRFRUQVBFZ3k3ZGhFVVRDS0JRSmtVWVFzRzdrMTJZQ2F4NFdBejROd3dJLzhuRkFhYkc2M3UxODRtcVg5STZQMVk4T0dEVThBYU9DM2k0dUxhd2h1clhIWncwKytaWU1hNjlqNldqelNSUU1JaEVDMGlnWnB0MmJPaENxeURMZExoc2Vsd08vMUlCVHdJUzhjUUZGZURnU2Z6d2UzMjIyNU5oWnc5dFlQVzY1Ti9mS1h2OXpSMDlQekdMOWxYRnhjZzdxMTltTlAvL0t4cDN0dElhanAxbFNRdmhWN3Bsc1RCVUxUYmkwZGhxYUJsbGtKOVhuY0NQZzh5QW1tM1pva2lSRDhmais4WG0rR2F6dWUxbzgvL2VsUGoxTksrUW03WEZ4Y0E3bTFQWGYvNW85dk9rRE5kRzBPTFI1RzBVQVVqUllQZXpPdURLL2JCYi9QY0d1aEFJcnljd0FBUWlBUWdNL25nejBrWmVEbTFQcGhWVWkvOFkxdkhPdnU3djQ5djNWY1hGeloxTnphL3ZRRFR6NDNXRzR0b3lGWE1OeWFKQXEwSDlRVUdSNlhLOE90UlhKRGNCdUxUSVZ3T0F6V3RRMVFKYzNxMm1iTm1yV0dVdm82djMxY1hGeDI2YnIrNXZSdi9IQ0hBOVFHY0d1QUtCQklnamxkMERkaDRKSmx1SlYwTTY3ZjUwRTQ0RU5lT0lpaS9GenJhd281T1RrSUJvT1dhM1BLdGJHdWpka2FiMjFyM3JoeFl6SWFqVDdLYnlFWEY1ZGREVTJIbjluVmVFakY0SlZRSFNCVVNCOGtTVVZCZ0NTSmhsdExRMDJSbWZZT2p4dEJueGM1d1FBS2NzUHdldnAybXdyNStma0loOE1JQkFMd2VyMFczRXpITmxUWEZnNkhOK2k2L25kK0c3bTR1RXlsVlBYNWtaK2J0OHZCcVEzdTFzUk10eVliQlFPUDJ4aWQ4bmtRRHZxUW54TkVVU1FuNCtzS0JRVUZ5TTNOUlRBWWhOL3Z0M0p0RGhNSkE3azJsUkNTT25Ma0NIZHRYRnhjbG5ic3F0K0V6R1pjQzJ5R1cxT0g2dFpjVm51SE1Ucmw5eUkzRkVCQlhoZytqenNUYkNVbEpjalB6MGRPVGc3TVFzSlFjbTFtTVlGMWJjWEZ4ZjlJcFZJUDg5dkp4Y1hWMWRPN1p2THM3eCt3UVMyUnphMEpSaVhVeWEwcHNnU1h5Mnp2Y0NIZzkxcnRIU1dSdkg1ZlcvQjRQQ2dxS2tKZVhoNUNvVkRXUW9KVGhkVGUxMFlJU1gzd3dRZVBBVGpJYnlzWDE3a3JDaHo4NitaL2JvTnp3WUIxYXhsOWExWWwxTzdXRktOZzRIYW4yenY4WHVTRmdpakt6NEhIcmZRSEd3Q1VsSlFnRW9tQUxTUjR2VjY0WEM1a0c1TFBsbXViT0hGaWZYZDM5NFA4MW5KeG5iczZjclRqeWEvZSthc09tMVBMNnRaSWhsc1RNODVaY3lreVhJb0NyMXVCejJzVURFSUJSSEpES0NuSWMvejZBZ0FvaW9LaW9pSmtLeVRZcXFUVW5FcXdyK2d6WGR2VXFWTWYwM1g5Ulg1N3ViZ0drZUk3NjM0a1ZkTmUvc3lYYm50akNHNU5NOXlhYms0WlNFYmZXcjhxcUhFeWJzQ2JidS9JRHdkUkZNbUZJa3Zad1FZQTVlWGxNQXNKWmtqcVZFaGdoK1NaR1ZLZGRXMDdkdXhJSGpseWhPZmF1TGdHVTZqa3JQdVJkdTVwZkthcHRkTStYWkFBa0NETUJpckRyZW5FT2tTU1dFNU50bzFOZVR6cGszSE4wenNLOHNJb0w4clArajBJN0IvTWtOUjBiUVAwdGxtdWpabElZSjFicXJpNCtPVmtNdmtiL3N6bDRocEFrWkZubFd1THhyc2Z2WERXN1I4YmJvMkZXdC9BZS8vejFxaElDRTBQdUlzMGZTcXVuT0hXMGhNR1hvU0Rma1J5c29lZ2ptQXJMQ3pNR3BJNmpGdFJTWkl5Q2dtc2F5T0VKTGRzMmJLS1VycURQM3U1dUxLSUNFRDFwVUJPQlNCN1B0VS9pcTdUZHgvNDB6UDJnb0dWV3lOQTBneEJtZlBXcUdDRm9HbW9aWnlLNnhTQzV1ZWlNQzg4NFBmU0wwQXRMUzFGZTNzN290RW80dkU0ZW5wNmtFZ2trRXdta1V3bWtVcWxvS29xVkZXRnBtblFOQTI2cm9OWjA2ZFJTZ1VBNnRWWFgzMjRyYTN0d2R6YzNKWDhHY3pGbGMxZWlFREp1RS85ai9IaG5qM3I3L2p2eCtJT1VFczdOa0xTQlFOQ05DTjlSUVZSaENqTGtGd3VTQzRYWkk4SGl0Y0xsOThQZHpBSWJ6Z01mMTRlZ29XRnlCMDJEQVVqUnFCMDNEZ2dGQnE2WXdPQVVDZ0VwOTYyTEkyN0dTRXBISnAyOC9MeU5xWlNxWWY0czVlTDYreFZQQjVmWFZOVHM0Y0pRVE9nUmdoaDErcnBBTktOdUtKSXpWWXlXWmFoR0p2YzNXNDNQQjRQZkQ0ZkFvRUFjbkp5a0orZmo1S1NFb1FHZ1pvajJJQjBJY0hzYldPSDVMUE5rdHFhZG5WQ2lOVnBUQWhKdmZycXE0OVFTdC9tdDUrTDYreVRydXZ2UFByb295K2lmMTZOaFZyS01Ec2FJVVEzSnBpc3RaOG0xRXl3ZVR3ZWVMMWUrUDEraE1OaDVPWGxvYWlvQ09YbDVVTXp3VTRmbEdVWlpXVmxLQ3dzN0ZjbGRUaHhkNkJDZ2dvZzlkblBmcmFwcmEyTmg2TmNYR2VoOXV6WnMvNDczL2xPTkdzSTJ0ZTNabXgySjFuZG11blVQQjRQL0g0L1FxRVFjbk56VVZoWWlMS3lNc2l5UEtUdlNjcjJGMFZGUmVqbzZFQTBHa1ZYVjFmV1hCdWJaOU4xbmVxNmJtNjEwaWlseEhCdFFpUVMyZFRiMjd2QzVYTE41MDhGTHE2elE4ZU9IWHU0dHJaMjd3QnV6ZG8rWmJnMWFvTE5iUGhublpycDF2eCtQNExCSUhKeWNoQ0pSRkJTVW9LaW9xSWhmMS9TUUg4NWJOZ3dkSFoySWhhTG9idTdPd051WmdIQnVLaXU2OFJXU0tBQWRFcXBWU1g5NHgvLytMOXo1c3daS3dqQ2RQNlU0T0lDOXUzYjk2bjkzbFZWZmVtZWUrNTUyUWExWHB0Ynk4aXJBYUNFRU90ekdDWUlBSkRHUnZxdHdSSHJZOGY3V0EwSU5wL1BoN0t5TXN1MWRYZDNXMkJMcFZKMjEwWTFUU082cmxQakc5TU54MmJtMjRSdmZ2T2JIZE9uVDMrd29xS2lGa0FKZjFwem5ldXFxS2o0dEg3cnphKysrdXFHVmF0VzlUaUVvTDJ3RlF5TXZKcHVPRFZxT0RScTV0TE1Ja0U0SEVadWJpNEtDZ3BRVmxhR3Fxb3ExTmJXRGptM05pU3dBZWxDd3JGanh5elgxdHZibXdFM3R2WERDRWRCMDRMUjEwWW9wV29hemtTb3JLeDhJeHFOL2s4Z0VMaVhQNjI1dUQ2ZE9uanc0Qjh2dWVTU0pnTnFMTkRzSWFocVRpWVJRcXk4bXIxWTRIYTdMY0FGZzBIazV1WWlFb21ndExUMHVLRUdaQ2tlT1AxV1lWdEEyRUY1V3dzSWRSaVNaOGV0VW9TUVpEQVlmQ0taVFBLUkt5NnVNMVIxUzZhaXF1cG1ySTMyLzd0NFBMNjZyS3pzYldTMmRsZ2hxQzJ2WmtITlZnV2wyYURHdG5aOFVrYzdKTEFGQW9HTUZwQlFLT1E0bFdDRG0xa2x6UmlTTngrSTU1OS8vbUZkMTdmd3B4QVhWMXJSdXJWWU11OGFUQjFmZzZxcUdveWZOQjJ6Rnp5Q3JhMW56dmVvcXVyV2xTdFhib0Z6QmRTQUcwMVNTbFZLcWFicnVxNXBtcTVwT3RWaHVUV3FLQXBFdFF2dDdURWs1WFE0R2dnRUVBcUZNbG83QW9IQUovbytwYUgrdy9MeWNzZHBCSWRjVzdhUUZFYk9UU1dFSksrOTl0cERqWTJORDFSVVZGUVFRcXI1MDVyclhGYnIxZ1dZUFc4ZEdvSVRjTzMxODNGREtSRGJ0UTBiTml6Rm5LMnZZY1V6RCtLNnlPbjlIaW1sRGR1M2IzOTZ3WUlGTVljUXRCZnBJZmNrcFdiQmdHaUVwRWVuS05WcEt0R0RoTWVIZ0dHQ3hHZ3ptbzhvQ05lY2x3RTFNNy8yU1VMUTR3WWJBQXdmUHR5eFF1b3daa1YxWFNkbVpRTUExWFdkYlFFaGhCQmgrUERoYjdhM3Q5K2ZrNVB6aStQOVhyaTR6aDZydGhYTEZxeERRMlFtVnExZmpta1d3RzdGTFRjc3dZeVpxN0JrMlZaY3VYd2FYS2ZSckRVMk5xNlpPblZxazgydFpZYWdsS1lMQmtUUVJNSHFWNE1rYU9qdVNhRTNucUJDWGhBdWx3dWlMSUFRRVc1dlptdEhhV2twaGc4Zi9pOTlzOEx4L0dPdjE0dUtpZ29VRnhkbkhFeVo1ZFJkS3N0eXY1RFVOcFdReU0zTjNkRFQwL01yL3V6bU9uZTV0Z1liamlxNGRQNUMwU0F4c2dBQUlBQkpSRUZVQm1wcEJTZmVnc1VMYnNDVmtRUmFiZm12WmFzWFlNYlVHbFNOWDRDdGFkK0hyUS9jaGhsVHg2T21xZ28xazY3QnpVczJvU25CZk1LdHQyRjgxWFFzV3JzYWkyWlB4L2lhS3RTTW40b1pDOWFpemlHZmxxamZnRVd6cDJQc2lJcUhxcXVyMzJlY1dpOTdFVUlTWUErUVRKL2NvWnVOdUxMTEI3OGtVSUhxSUhvNzluN3dBZDQ3bEFRaGNieS82Uzk0NUsvdkl4V0pvUGpJVTVnemF3NXUvLzJmY05zMWsxQlROUlZMNmdCc21vZWFxa2xZc0Qzeis5dTZZRHlxYXVaaEUvdkJwcTNINzVLS2k0c0hkRzFtT01xR3BHWUxpQkdhc3ZrMkFZQXdaY3FVaDk5ODg4MUNXWlp2NGs5enJuTk5kYS90UUJLMXVHS0tVNndad2JSYmwySmF2NDl2dzhwbFZiamkrdmxZVkZXTGFrU3hkZEVNekZtVHdPUWI1bVBwQkJkYVgxdUhsYXR1d2V6b0ttek9jSHNOV0xOb0ZhNmRQeC8zelE4aXVtMFZscTFjaU5sUkZ6WS9lQjM2dm92dFdIWnpIU28rKy9rbjlyZjhnKzFYNnhlQ3NsQURvRk1LU296RlQrbThtZ0ovVVNtS3ZWNzRQQkp5eHBZQnh4cnd3V0UzeGw0eEhSZVBIb054UlVVWTVnMUJrUko0ZnZrS2pMbjJSc3lmV1lXSkVRQk5RM2UvQzJiUCtXVGhYM1YxTmVMeGVOYjJEd1pzR1NFcHBaVHF1bTV2QVNFN2QrNFV0bXpaOHREMDZkTUxSRkc4bWovVnVjNGRKZERhR2dXVUNDSXMxNkt0YUdXZEZsd0lSb0lNbkVveDg3NzFXRDR0YVB6N1RWaXhIWmh3eTRONGRPSEU5TCs3L2pwRVdpZGg0YWEvWWZ2eWFRd2NGVXhlL0RqdXU5SDRnbE9tb0N3eEhUTlhyY0NxdXV1d3NMYnZhNDYvODRuTm56bXk0ZmtOOFI2blhqVjdGVlFsQXRHaFU1MVNuYVpTS1ZBSVVFUVpzaXhUYTdqZGx3NDlKYmtadTQ1NFVUbHVJaTQ1dndMRHk4cFFmU3k5UnEvcWxzZXhmbUh0Y1lmZWRTdVhZTjNCcWs4R05sRVVVVlZWMVE5czdEU0NiY3lLbUlVRUkrZkdGaE1JSVVTNDZxcXJtdXJxNmxiVzFOVGtFVUltOFNjODE3a0N0a1FpRFJFWDh5cmV2dVFhM0xEdWFOOEhBak94NnQzbERKeXFNWGxpa0lsWnI4VHl6VmZhUG5jUTFXVVJZSHNyb2dtZ2p4SXVSTW9pR2RDY09QTTZWSzFhaWUwN1dvRmE4KzhtdkZXdTdIMTYvdno1VVZ0T3JjZTRlbTM5YXVsR1hJbFFVSjFxdWs3VlpDK090U2RvM09WSFVYa0llVVpyUnlBUWdCU1ZJWW91QlBNTHJXWmM4VjBDSUlEYXliV2ZJSjlZajYxYkc0QXhDejU1d2o0Y0RxT3lzdEtDVzdZS0tldmNUTGdaVXdrZ2hKakZCSUVRUW1wcmE5OXJhbXI2YlVsSlNTNGhaQVIvMG5PZC9US0JaZ0RPZURYWDNuSWZWbDJiQUJERnRtWHpzV29vb1ZpMERtdFhyTUNhVGR0UmR6Q0dwR1hRcXROSUdvZ1VaVlVvQTFEZjBBUWdBa3BSMzlQVDl1ZDdaMTdWWW9OYVh3V1V5YXNadVhNcnJ5YkxMaXJMTW1SQnAycWlGL0dlT0pvYlBnTDFUY2Jra3JSamt6c1VTSklMNGNJU1ZGWldJaHdPLzR1UFpTc2FXZ0ZsWXZXL1Zva3NLeXV6QnVSWnVHWEx0UmxRTTRlL3pMQlVNeDRjQWtBb0t5dDcrZWpSby9mbjVlVXRBaERoVDN5dXN4MXNrVWdRU0RhaHFSVkFtZUcxcXFkZ1dqVUFSTkc2U2hsQ2pxa09EOHllZ2VXdEV6Rm40WElzckM1RDBBWFVyYndaQ3pjTjFUdGFPbnFndlh2MTRjT3ZOQ0p6c0wzWElhK1dNdk5xNWpKMWRyckE3WGJEazErRVNpV0ZwcjM3Y0tUaE1EQ2hDams1T1ZEYVhaQWtEL0xMS2xCV1ZuWkNIOVYvdWNWaTFLaFJHYTZORFVudEozOVFTdGw4bTI0T3d4cmhLU0dFRUVvcHljL1AvM3RuWjZjL0ZBb3RCdURtVDM2dXMxbTFsMDVFWU0xVy9HMVRFNzcrOVUvNEF0K3hCbXQyQVpldWVCQ0xyK3NMVVJQQklRWjA5ZStnQ1VDa3FxejM0TUdEcTY1ZThYWWQrdG82elBDVGRXdjlRbEJDcUs0bWswaUpMbmg5TWhSRnNmSnEza0FleXZNUG9MTXRpVlFnalB6OGZMaU91cUVvUGhSVmpSclNMd0Fna1VIZi9vcWdLZ0lrbTVxT3I5M0RTWVFRakJneHdwcE15TS9QdHlZVDdHTlhaZ3VJYmZHeU9YSmx0b0FrQVNUQzRmQ2Z1N3E2ZUJzSTExbXY0TFJiY0gxcEV1K3NXSUJINmhMOXdxdlcxdVFRN0ZZQ1VRQ0pLUFAvSitydy9JNVd1eHNERUVOOVhUMGJ3MkxUcWswNGlER1lNZ29QR2VOU0xOUjZHYmhsbkxGbXZuN05maldCZ0ZJOWhTVHBLeFo0dlY3NFBDbkU0Z1NDUHc5bGhma29LaXBDUldFSWlxSWdtU1NELzN5UkNDS0lvYjYrS2VQbmU2MHV4dnlqYWt5YlZnWHNXbk5pbW1JRGdRQ3FxNnY3RlJJMFRjczJJRDlZTVlGUVNvbmY3MytzdTd2YjQvRjRidWRQZjY2ek54cWRpSVVQTGtMZDdLVllPbU02bnIvdVNsdzZwaFE0Mm9EWE5tM0F0b1lBSnR3eUV4TUh0SDNYNHNyOGRWaTNaRGJtTlZ5SmFyUml4NllOMkhFd0NTQ0tSQlFBVTJ2WXRYdzJaalJjajJzbjVPUG9hMnV3K205SEViNzA5Z2QvTUtuZ0h3Nmhadzh5anlPeU9UV3pFVmVpYmg4UTYwclMrTkVXSkx1RHlBbW4wQk5ydzc3Mk5yUW5YYWllUGhVWEdJZEdqblNOUXVpSkxWaXpaQWx3eGFXNDdzWnBLQnZvNXl0ZGhWWExic2E4Z3pNeHdYVVE3MnphZ09jYkFEQ0w0R3R2V1l5WkcrYWN1Rzcvd3NKQ3gxeWJxcXBzUDF0R1dNb1dFNHhQbzluRDBsbXpaajM4NXovL1dYRzczZC9tcndDdXM1WnR0Vi9INDV0cjhjaXlGVml6ZFMxV3JJc2hxZVNqcW5ZYWJsazVIL092ckI2NFNoaWNocVdQTDROcjBRcHNXTDBTVzExVm1ITDlmWGg4d3ZOWXRMSUpCNW44SFJEQUZZc1dvMnpiQ3F4YzBvQ29xeFFqcjczN2tmcFhmN2tWL2FjS3JCQ1VFQ1FvTlZmb1dWRHJhOEtWWlNpS2o1YUdLSHFpY2NSN1kyZzlITU5SUVVHNHNBcFRwMTZPYS85dEpFcExTMUZWVllYeXkrL0U0amVic1d6REtxeG96Y2UwRzZjTkRQOUhseUc2WUFVMnJWcU9yWUVxVEx4dU1aWk5YSUdGR3pJZmgrV1Byd1JoRDNJN0VkcTllemQyNzk2TnhzWkdIRHAwQ0VlT0hFRjdlM3ZHMFVjR0FBa0RRR0wwdXdrQVJFcXBCRUFHNEtLVXVuLzBveCtGZi9qREg5N2ljcm5tOFpjQTE1a3FUZFBRMU5SMFpwK3h0dlUyakorekZkTld2WXY3REk3RVlySGZmL3ZiMzk3OGh6LzhvWWR4WlQwQXVvMjNQWVFRcTJCQWpHMVQ3UGxxek5IZTFobHI1dnluZWI1YVNVa0poZzhmanBxYUd0VFUxSnpVSC9PRXoyZU9IajNhQ2tudDdSOVpYSnQ1NGk2UVdTbTF3dEtmL09Rbm5aRkk1T0c1YytjS0xwZHJMbjhKY1hHZEdNVmlzVDhzWHJ4NGl3RzFKQU8xSGdacS9VN0RkYXFBc3NVQ244L25lTHgzWldVbFJvOGVmZEovcmhNT05rSUlSbzhlYllITjN2cWhhWnAxNUMrVGI4dFdLYlUrNTNlKzg1MDJSVkVldnVtbW04RGh4c1YxWXFDMmRPblN6U3RXck9oQ1pxR0FiY0RObGxmVEJVRmdOMHhSY3hHTC9jQkkwNjJaVUdPUEJ2L1VnQTBBUEI0UFJvMGExYTlwMTliUDFxK1lZTGcwMDdXeGNDT0VFREp2M3J6V1JDTHh1N2x6NStwdXQ1dUhwVnhjbjFESjd0anZGeTlldkdVQXFMRk9yZC9xUE9QQVNHcDNhdWJLdkZBb1pCMFlXVnhjaklxS0Nvd2FOUW9lejZuWmRpL2VmZmZkSitVVG13ZFFtbkF6SzZRczNHelhZQmluQUxCeDQ4WVVJZVQ5aXkrK1dKVmxtWTllY1oweG9wUWlHbzJlZ0E3Nms2aktxM0hEelRjODh2U3kvMi9MNzM3M3UrNXNUZzBPa3dWc29jQ0Vtc3Zsb3V3SnVQYVZlV2FoWU15WU1jalB6ejlsUCtaSlBRT3RzTEN3M3pTQ1E0VVVUSjdOcXBRQ2dHMWdIb1FRVUVxeGRPbFN2UFhXV3crdVhiczI2ZlY2ZVNzSUY5Y1ExZEhSOGVBVlYxeXg5YTIzM2twbWMycXdIVVBFVmo4eks2QjlUczNjMnM3bTFJcUtpbEJSVVlHUkkwZWlzTER3bFA2Y0ovMXd4L0x5OGd6WHhrNGoyRjFiK3BjZUpRQ29xcW9tM0RRMkxEWGh0bkhqUnZoOHZ2K054V0s5ZnIvL2R2QUpCUzZ1Z2RUYjJ0cjZVRUZCd1QvUS8vVGJnYUNtRVVJMG9lOElvcXpoWnpBWVJEaWNuaW9vS2lyQ3NHSERyT2I5VTYxVGNtcHRkWFYxMXVQRG1WTjJUVHR2NWRwVVZUWC96aEZ1QUJBSUJQN1kwZEhSSFE2SGJ3T2ZMZVhpY3RMUmd3Y1ByakltQ3RqWnp4NWIrT2tJTldiQmNRYlVuRmJubVZBckx5L0hpQkVqVUYxOWVrNzlQMlhIY2RmVTFHVGJpK0RvM0V5NEFlbitvQUhnUm5OeWN0YTN0TFIwUlNLUmIvRlRRYmk0d0JxRit2cjYrdFVqUjQ2c0c4U3BKYkpCamMycFpRcy9uYUIyc252VnpnaXdBY0RZc1dQN3dTMEwyQ3k0bVFtM2JIQXovMXhZV1Boc1kyTmpkTml3WWZNRVFiaUlQNlc1em5WcG12Yld1KysrKytjTEw3eXdFZjFuUHdkcjZiQ2dObGhPellSYVlXRWh5c3ZMVVYxZGpiRmp4NTdXbi8yVWdvMFFnckZqeDJaMWJRNi9iVmdINXdnMzQvTlNTaWtkUG56NFAzYnMyTkU1YnR5NGI0cWllQlYvYW5PZDhUcjJ1NVB5YVZNcGJmT1diYnVldm1ybS9TMU0rR21mL2V3aHhycThUS2hSalJCS1JZRlFVYUJVbG5USW9nNlhwTUl0cS9BcUtmamRTUVE5Q1lTOVBjanpkNkV3RkVkNVhoVFZoWjBZVzk0R0VuMzkzQUViQU1peWJNRnRFTWZHNXR1eXdZMGFINmRtYURweDRzUVAxcTlmdi95YWE2NXBWUlRsYS95VnczV3VxYnM3K2NURGoyMTdmdjRkZjQ0T0FMVmVBaVJBWUt0K1FpTUVhYWlKaE1xeUFFVVc0WEpKMU8yVzRmVW84UGxjQ1BqZENJZTh5TXYxbzZnd2hQTFNYRlFQTDhEWW1sTElrbmphSDRQVHN2TE83WFpqN05peGpuazIxcTJ4SVNraEJLbFVLbjBVU1ByLzAvcllsdW5jWnN5WWNiQ21wdVpYYjd6eHhoRy8zejhmZkxVZjE3a2h0YTA5L3RENGYvdXZsdzgyeCswN0N0anoxRXlvMlp3YWRJR0FDZ0toa2dFMVdSYVE2RXpRenFBTFkzTFNVQXNHR0tnVmhGQldtb3ZxNFJHTUhWTUN0MXMrSXg2STAvYUM5L2w4RnR6c1lMT0hwWVFRYXVUVDdLMGc5Z2tGYXNKdDkrN2RlaUFRZUt5bHBlVndKQks1aFM5bDVqcFR0ZjJlKzNIejBmOFg3LzY2OWhQdkRhV1VOalR1TzdxbWVzS2k5NUc1VGFyZmVXb00xTlNCb0tZb0luVXBJcWlRUkZLUjRmZTVFVENobHVkSFVVR3dEMm8xcGZCNVhhaC85cC9Zbmo4T04zN0c3L0JkeHJIMXZtZXc1T245YUlwSmlJd2JoOFUvbVk0clM4NGlzQUhwYzl6R2poM3I2TmpZdkJ4Ny93YUJHMldkR3dCYVdGajRiRjFkM2VGUm8wWjlYUlRGei9LWEVkZFpaOU5VYmV2Mk54cWVubnIxTDV5V0dkdVA4MDZBOUIzcDNRYzFRZ1VCVkpJRUtrdkVnSm9NdDF1QUpoS0lMaGNDQVRkeVdLZFcxZ2UxUU1BTlFFWGRjNjlnWlVtVkk5aGFuMzBHdHowdFllbGp0K082a2w1cy9kRWF6THZqRFd4KzdDS1VuVTFnQTRCUUtHVEJiUkNvOVlPYmtXOWp6M096Z0diQVRRZWcxOWJXdnIxNjllcERNMmJNK05qdGRzL2hMd1d1TTFXSlo5ZGgvSVBBamFNVDJMcXpEYTFKRjZiZE5oUExQNThIRjFxdzdEL1dZUHZvS3JqMnRLQXBsb0JZTldiMWVTUFZMYis1NXk4eFpMWnoyTU5QYSs2VFVxUUVRalFRNkNiVVJBRlVUZWswbWRRQlFxZ2dFNVNWeXZCNlJHZ1MwTzEyR1ZEelFEdTBIMzk2TG9aTzNZdnlDOGZqaHo4ZWp1dUMrN0hrUDU3QzJrTWFZbGlEU1hzdXdlTVBYNFMrTUVuRmp1Y09JZmp2czNCZGlRVEFqMmx6eHFINkt4OWllK3dpWEorb3c3eXZiRVhrWjdkaTZXZk9BckFCNlkxWEE1V0hUY0FSUXN5TEVrS0ltWE16YzIyNnJsTzJ2NDExYmpmZWVPTWhBUGUzdGJWOW5KdWJld3VBWXY0eTRqb2pkZWdZY05jc2JQNlpIOUZYbjhIME8xN0Nwcy9PeEhVQkFFaWdWUm1EOVgvNVFuUHk0LzEvTEp0d3o5dGIrNWFxSkJtSXNVZDVKd2hCa2xLa1FLQUtJQm9JTklHQUVvSG9va0JBVXhyVmlJQ2NQQmYxU3hUdHJRbTBkSXNvSzNCQmxRVW8zblQ0NlRuNk1WYnZDdUsySDgvQXZNdHo4ZkZqeitMbWIyOUc1QzlYWWZGZmJzV0UyMytOWlNVMzRPVUY5aEdxWHJUR1ZFUktHQ2VYNzBjRXZXZzlDbUQ0TU54eTE3OGpPTzRzY1d5bWNuSnlNdURHUUt3ZjJPek9EUUJoNWtyN09UY0F1dUhlYUY1ZTNsL3I2dW8rSGpWcTFFMmlLRjdPWDBWY1o1eEtxakRUQ09XQ280ZWhPdmtHV21NQUFnQWdvbVp5eFV0N3QzKzQ0WktyZnRHRWdiZXo5OXBDVHhWSWg1NkVRQmNFUWdXQlFKSUlKUnBCVWdjbGdnaVgzNFVSdVVFb1hpK0NBUWtwUlVEVTcwTnhnUXYxcjNXaCtrdWZ4N3pMaHlFbjdFWE9iWmZodXFmWFljMC9wbVBLWUltZWZxc2JSQUFxWWtrQThHUGlaLzFuVHlocWg5dDU1NTNYRDJvRFFJNlN0UHJsM0N3YjE5Y09Zb2FtV20xdDdkcy8rOW5QR3Ivem5lL3M4bnE5L01oeHJqTlhSalVoWVd4ajZVbHBENy95Mk5xWEgzNXVXNDh0bjlaLzd5ZVFwRUNLV0ZDRER2UkJUUlFKbFNRQ1dSS2dlQ1hxN2traDJ0Nk56clllQkNLNU9ML1lqWnl3Z3FSYlJHY29pUEl5TnhwVUwyb3ZISUdjc05kTUpxR3FSTVh6UjNzeDZMaTJZditBQmtCQ1FEbnhEOXNaMXdZUkRvZUhCRGQ3V0dxK2J4eU5wSnRBWTRvS09pSEVkRzc2SFhmY29kOXh4eDMvZStEQWdiMmxwYVUzRTBJbThsY1IxNWtxcXROM2R1MDVzdjd1VnhyM0FvMnFRejR0dzZVUmdpU29CVFNORUdpZzBFRkFCWkZRU1NCVWt0THRISW9pVWdrRXZrSS95djBLZkxLTzVvK080dDJtZkV3WTRVZlNJNkV0TndjanF2TVFyWGdmcjBaMTVqdUxvK0dvaEVqK1lHZFF1QkhKbDlCNktBNGdsUDdRMFRoYTRVUGtKSnhtSkp5Sk56RVVDbUhjdUhFWU9YSWtoZzBiaHVMaVlrUWlFZVRrNUdSYjdVY1ZSUUd6Mm84eXEvMDA0NHoyRklBa0lTUkJDREhQYys4dUx5L2Z1bTdkdWgvMjl2YXU0aThmcmpOUnFxNnRmdkdKTGY5VE8vbC9kaU56ejZmMVBHWXVhMFVlTloyYWNaWmEraGM4Mjg0aEdJMjNJbExIZXJDL1RZWHNkU09VNDBlK1g0TGk4Nkc0S0loOG40SkFRVDdHamFuQkYyY1BSOTJxRjdEaGtBcWdGenNlMllvTkdJTWIvaDhKZ0FTWFMwS2k3UmhhRS8wOTFKVExoaUg2M0hhc2JWU0J4REZzV3ZVTzZzZU53cFJBR3BBN1hteEFmZUlzZFd5bUFvRUF4bzBiQjBFUUhDOUNpUDJ0NWR4U3FaUlpNV1dMQ3BRSlRVMzNwZ0hRdnZTbEx6VUIrRTFUVTlQT2twS1Ntd2doRS9qTGlldDBTOWZwdXgvV3Q2OWYrK0diZTdEc1RaVUpQWk9PTG8yQkdhVjkrd2xJdWo5TkZ5aEZTdGRwVDFLRXp5dENVU1RxZGtsd3UyWGtqMUNnSEl6aG5UZmpvS0tNZ29waG1IMVZHU3JLdlVnRVhEaFlXb0pBd0kzQTU3K0FCNDgrZ3lYLytXc3NpRW1JakI2RHhiK1pqaWxHeUR6bCtuRW91K01wVFAzUFMvRE1FeGVEYlI0Tlh2WHZlUERRYzFnMDk5ZFlaUFN4M2ZlVGllbFdqNlA3c2ZKSFcxSDJtMXV4K1B4Ly9iRTc0VnVxVHJSNmUzdnh3UWNmb0w2K0hnY09ITURodzRkeDlPaFJkSFoySWhxTm9xdXJ5OXA4bFVna3pGMExoTmwrQlYzWENhVlVNQzhqYXlrQmtDbWxpcEhKY0FGd3JWcTFLakpyMXF6cnZWN3YvK0V2TGE3ajBTZmFVcFZsVmpRYTYzbjBnZjk5Y2RzZGR6OFZSMStCZ0IyUFlzUFFkT2dKTnZRa09rSC9Jb0VzQ1pCbGticVV0THZ5dUdWNHZhNk1pWUw4dkFDS0NrSW9MOHV4eHFUT2xJbUNUNzFqc3lKenR4dm5uMzgrUkZIc2Q3SHV6ZWJnc2hVVktKTjdNNHNLT3RKVlV3MkFPbWZPSEczT25Ea1A3ZDI3OTYycXFxb2JSRkdjeGwreVhLY3M3RlQxbDNlK2YrQ1pDeSs3OTJNRFVuYVh4dWJVa2dSSVprd1JvSzgvelhCcVZCU1lJb0VpVWtXUjRIYkpjQnRROC90Y0NBWTh5QWw1a1ovSHpINVdGV0RzbUROajl2T3NBeHVRSHB3ZlAzNDhKRW5xQnpiN1d3WjJWQkFFSWdnQ1ZGV2x6TDZGOU42L3Z0RFVxQlFSelF4TkFhaWpSbzE2ZmNTSUVUdGZmLzMxNjNKeWNtNENVTXBmZGx3blM1VGk0SkhXWTA5K1p0cFAzbWhLejNteVVFczRYRWtIbDlZWGVwcVRCR0pma1NEdDFHUzQzUkxjYmdVK2IzcjJNeFR3SUJ6MklXSkNyU3dYSTRZWFl1eVlVcHlDaFZMbkx0aUFkSHZIZWVlZEIwbVNqZ2R3L1NxbWhCQnFoS1pnblp1WmQwTjZHNzBHUVAzb280L1UzTnpjOVJzM2Juempzc3N1KzZMYjdiNkp2d1M1VHFoQy93ZGRYVjFyL3ZyWHYyNzc2bGZuZFF6aTBneWdFUk5vS2VNWHNYVitHck9iQUpJa09lNzhORSsrdGUvOVpJL3pQcDJIUko1VFlETlZVMU1EV1piTkNpaU1OV0NPSWFvSk4rTXRZZUFHUFMzclNDU3pnZGZKdlYxOTlkV05BSDViVjFmMzZzaVJJMmRLa3ZUdi9CWEo5YThxbFVvOXYyUEhqazJUSjA4K3dBQXRHOVNTRE5SVTlBMndteEdIdFd6Rk9NYmJmSjFRUlZGZ1B5RFNoRnB1Ym03R2lyelRlWnozT1EwMklMMUR3V3p2TUM4V2NFNmhxWEhEcmRDVXFacGFybzBKVFRYR3ZWbFBvdHJhMnJjQXZOL1UxUFJDY1hIeGwvaEp2VnlmUkxxdXY5blEwUERNeUpFamQ1bS9QRzFBU3pxNHRKU0RTOU9aaXhxLzJMTkN6ZXYxd3V2MUloQUlXSHMvQ3dvS0xLaU5IRG55dEN4ZTRXQmpWRjVlbmdFMzgyYWFvYXJkeFJtZ3MrQ1dTcVVvSWNRODhOSmVXTkFad0dXNE53Q3Bzckt5RnkrODhNSi9QdnZzczFmbTVlVjlpUkJTdzErdVhJUG4wZWllNXVibXA2ZFBuNzVqMTY1ZEtwTWZZM05wN051a0RXb3E4MHZYQXBxNUVrOFVSZmFYUFhXNVhCbFFNNWV1bUhzL0k1RUlTa3BLckdYR3AzcEYzc25VU1Z1WWZDcGsybW1uZkp6NWRvQnhMSHRhMUp3cmhRRTRHSEN6R24xTjJBSFFtNXVidGVYTGx6ZWtVcWtYTHJqZ2dtYTMyMTFDQ01uaEw5OXpHbHlPQzVNcHBZMnRyYTJQTFZ5NDhFK3paOC9lZi9Ub1Vic3I2M2RrTjlMTFZYcnQrVFJtY2JIVFJuWW9pa0lWUmVtWFMyT0J4aTVkcWE2dVB1WExqTGxqRzRKeWNuSncvdm5udy96dHhFd2daT1RoMkN1UlNEaUdwb3g3TTRmckJWdDRxZ0ZRamZBMEJTQjE3NzMzSnUrOTk5Ni9MRjI2OUlWdmYvdmIwME9oMEV4K3FDV1hBYlNHMXRiV0RjdVdMWHZybDcvOFpTK1RHM1BLcGJGaGFBcnA0NFZVUW1CR0N4cEEra1lGQVVwQWFQcXBTa0JCUUNtb1RnRktDWFFLYURxRnBnT3FScEhTZ0pRR0pGV0toQW9rVWtCdmlxQW5SYkQ3b3dNQURweFZqLzJuMnJHWmttVVpoWVdGanFlQURISGUxRzdnekJONzJSTkM3TlZUeTcwQjBMWnMyWkw0K2M5L3ZyZTd1L3Y1Q3k2NG9Nbmo4ZVFTUWdyNHkvdmNjMnpCWUxDdXBhWGxEOS83M3ZjZW56MTdkdU0vLy9uUFhnZUgxbStucHkybnBoSmlnZERJcDZXZmk0UUlFQVdSaXBJSVNUSnlhYklNUlVuL2NuZTUzWEM3UGZCNmZmRDUvQWdFQXdpRndzakp5VVYrcEFERnhTVW9IellNVmRVaklFbnlXWGt2enZqSmcrUFZ4eDkvaklhR0JqUTFOVmxUQ2gwZEhZaEdvNGpGWXVqdTdrWjNkemQ2ZTN1UlNDU1FUQ2JOVGZXRVhlcXM2em94TCtOeE1xY1cyTWtGaVZJcUE1Q1JQcnZBdXFxcXFwUlhYbmxsYW1GaDRUV0NJRnpNWC9abnY1TEo1UFkzM25qamhhOTg1U3Z2TnpVMW1TTk5yRU96RndneUhKb3gwOHlNUWhIemx5aGxLNTVtb1l3dEVHUXJFcGp0SEdiNFdWWldocXFxS2xSV1ZwN1Y5K0tzVzNKU1dWa0pqOGRqRHNlYmVZZWhGQmlvVVUwbHFxcGE0YW5aOTJhNk5TTTgxUWNJVDVNQWxJYUdCcVdrcE9RRkFOdjI3dDA3b2JLeWNyb3N5NS9uTC8relQ0bEU0bSs3ZCs5K2RjS0VDWTBNek5pd00ra0FOUloycWdFMXE5cHBnSTJheFFIanVVbVo1NjRGTkRPbnhoWUovSDUvUms2dHVMall5cW1kVFVXQ2N3WnNBRkJZV0FpdjEyc0J6dTEyZzMwUzJPSFcyOXRyQVM2WlRHYkx2VkZLS1dIUGVEUFBkMk9lbUNuRHdWbUFBNkNNR2pYcWRRRHZ2UERDQzA5TW1qVHBVci9mZncxd3dvOTU1enExWVdkVExCWjc3c1VYWDN6N2kxLzg0dEVzUUhPQ211bk9yR0YxSTQrbTI2dWRCdFJnVmp6TjU2dVRTek9oWmk4VW1PMGNadU50SUJBNEorN1BXUmVLMm5NZWUvZnV4YjU5KzNEbzBDRzB0TFNndmIzZEdxQ1B4K1BXQUwwWm1ocEQ5RWdtazFCVjFYUnZHZUdwc1hoR29KUVN3OEdaNGFsNXNTRXFHNnJLQUpRYmJyakJ2WHo1OHNrRkJRV1hTNUxFVC9IOUZFbFYxUmNQSERqdzZ1MjMzNzdycWFlZVNnMFJhQ2s3MEFDMktKQUJNOTJjZDJiRFR0YWx5YklNdHBYRFBra1FEb2VSbTV1THdzTENqSFlPOG1tZGorSmdjMVpUVXhNKy92aGpORFUxb2FXbEJXMXRiUVBtM2N6Y1d5cVZnbmxLQ0FNNFlxd01KT3cxQU9Da0xJQ1RBY2liTjI4dXYraWlpeVlIQW9IcHZCL3VqUDBGdWFlenMvT2xiZHUydmZ2RkwzNnhqUUdTRTlCU1dZQ20yb0ZtSG54cWhwdDJsOFlDemV4UE0xM2FRUG0wdkx3OEZCWVdvcXlzREpXVmxTZ3JPL2VDZzNNQ2JBRFEyZG1aVVZSb2JXMUZSMGNIamgwN2hsZ3NaaDEvMU52YjYxUllnQUUyWXJvM0ZuQk1nWUVGSEZ0a0VBMEhaNGRjeHZYZWUrL1ZWRmRYWCt6eGVDNEhVTUtSY2xwaGRxaTd1L3VsdXJxNkhaTW1UZHFQdmlyNFlFQ3o1ODVZVjJjUE9hbDVJQU9UNDJWZEdqdnI2Umg2c2syMzdNeW5XU1N3OTlSeHNKMkYwalFOOWZYMTJMOS9QNXFibTlIYTJvcTJ0alljTzNiTU90dXRxNnZMT3R1dHQ3YzNBMjRPN3MwTVQ4MHozd1lDM0ZBZ1ozNU0ycjE3OTdpS2lvcUwzRzczWlJ4eXB3NW1QVDA5Mno3NjZLTjN4NDhmMzJnTEY1MkFwZzRSWnYyQUJtc1BCeWdSQ0JSWjdoZDJzaTdOTEJDNFhDNXIzdFBuOHlFWURDSVVDaUV2THcrUlNNVEtwMVZYVjBNVXhYUDJYcDVUWURQVjNOeU1mZnYyNGVEQmd6aHk1RWhHYUJxUHh5MjRzWWRYc25CakFjY1VGd1lDSERIQUpqaUVxWklOYXJMdFk5TE9uVHRIVjFWVlRmQjZ2UmNUUXNaeUJKMDQ2YnBlMTlYVjlkcWVQWHZxTHJyb0l0YVo2UXlZQmdLYXlnQk5wWlNxUnFYYzZuRTBONld4UURNcm5icXVVMEVRNFhhNytnSE5IbnA2UEo1K1EreG02RmxRVUlEUzBsSlVWRlNndUpodmxqd253UVlBM2QzZGFHeHN6T2gzYTI5dng3Rmp4eENQeHhHUHh5MjRPWVdtV2NKVEMzQU9PVGpDT0xpTVhCd0RPQ2ZRWmZ6ZHhvMGJpeSs4OE1MYWNEZzhRWmJsaTJGdHh1QWFvbzZsVXFuWDJ0cmFkdjd6bi8rc256RmpScHNCSUgwQWQrWUVOZmFFalg3RkFNYWhXYmt6Tm9kbUZnWTBUWWNvaXZENXZPendlci9RMDRTYTMrL3YxOHBoaHA3RGh3K0gxK3ZsZC9oY0JwdXBBd2NPNE1DQkF6aDA2QkJhVzFzSHJKcXlvYWt0OXpZWTRNQVdHV3lRTTUyY0dhYUtkcGc1QVE2QU9INzhlUG1SUng2cHFxcXFHdTMzKzgrWEpPa3pBUHo4YVoyaHVLcXFiMFdqMGZmMzd0M2I4STF2ZktPcHJxNnUzK1NJTFhUTUJqUVdadXovbzl1QVpqazA0NElkYUdiWXFhb2FGU1VKQWI4dkEyaHNiMXEycXFjNXhGNWVYbjdXbk1yQndYWUNGWXZGck5DVXJacWE3czFwcjBJVzk1WUJPRjNYN1ZWVVpBbFQ3WkF6UTFVckwrY0FOc24yZDJKRlJZVzRaczJhWVNOSGpxd0toVUtqWlZrK2p4QXk0aHpMazMyVVRDWS82T2pvK0dqMzd0Mzd2dmExcjdVME5UWHBObGZtNU02eXVUVHI3OHhtYk52bnlJQ1p6YUdCclhLYXgybXhoWUZrU29Va1NRaUhnaGt1elF3OTdRMjNiTlhUREQzUGxkNDBEclovd2IyeFZWUFR2Y1Zpc2F3OWJ3NjVOd3R3cG5zeklXY1BVeG5BT1lXcTluQlZ0QUhPNlgzUmZ2M2lGNy93WDNIRkZTV2xwYVhEL0g3L2NGbVdSd2lDTUJyV0t0NVByUks2cnU5SkpwUDFzVmhzMy83OSt3OCs5OXh6TFhmZGRWZVBDWmhCWUpZTmFobnZNODRzSTh4a1EwM1k1b21adzAySXBRaVhBQUFHR1VsRVFWUXRtREV1alRLTnRrZ2tVNUFrR1htNTRheTlhWUZBSU1PbG1hRW5kMmtjYkVOV1YxY1g5dS9mYnpYMDJudmVzaFVXc2dGTzA3VEJBR2QzY1NiZ2lBUGtCQWZJRGZhKzZPQUdoZlhyMStmWDFOUkU4dlB6Qy8xK2Y0a3N5OFdpS0pZUlFzb3g2RXJ2VTZaZVN1a0JUZE1PSnBQSjVuZzgzbnpreUpIV3VycTZ0aTkvK2NzZFlBNG1HQVJtMlJ5YTQvdjI1RDhMTS9RdEFLSnNNY0IwWndBZ1NWSS9vTEY5YVd4eG9LYzNtVDdFb1NDL1g0SEFxVGV0cEtRRXc0WU5nOC9uNHk5V0RyYmoxK0hEaC9zVkZ1enV6ZDdVYTA0c09MZzNxL2VOQlp5bWFTYll3UFRDd2NIRjJTRm5BWXFCM0dDWFlIdGZzTDF2NWY5Ky9ldGYrOGVOR3hjc0tpb0toa0tob05mckRTcUtFcFFrS1NpS1lsQVFCRDhoeEU4SThSRkNQQVlJelFNQXpNOEpCZ3pXMmpoS2FRK2x0SXRTR3RkMVBhNXBXa3hWMVdnaWtZaDJkM2ZIT2pzN284M056YkdkTzNmR0Z5eFkwTTNBaTlwQVJnZUFtVzV6V05wZ2wvMjh2V3d3WTBGbXVqTm1TeG9GQUVWUkxKalpXamd5aWdPeUxLTzdKd2xGVVZCU1hHQTEyOXBkR2xzZ0tDb3E0aTlPRHJaL1RhbFV5aW9zSERseXhOcG5PdFNtM3FFQ3p1YmlXQWMzRU9RY1ljZE1Qd2dEUUUxMEFKdjlZci9PUUJjYzN0cmZ6MGlET2J6UHZoM29zb1BNZm1WemFmM2VONDkrZDRMWVlEQXozN2Z0MUlBb2lxQ1V3dVZ5WlFXYXZlSVo3K3FGeStWQ3hiRFNqR2JiY0RpTS9QeDhGQlFVV0FVQ1daYjVpNUtEN2NUcDJMRmpPSGp3WUwvYzIxRDYzb3laVTN0NG1oR21HdTdOZ3B3eHpXQ0Zxc3g5c3Vma2lBT0Vzc0ZPeUFJemNRaGdZd0VuT0VCdElNQU5CRGM3ME9BQXNZRWNtcDdGcmRrVCs0TkNqQ2tBVUZ1WWFjTE1LZ1F3RmM2TUhSdWlLRkpLS2R4dWR3YlFKRW15SEpxOU9CQ05kY1B0OFdEVWlPSDlLcDVGUlVVb0xTMUZLTVE3ZWpqWVRxSmFXbG95M0JzN2tqVlFhMGcyOThhMmg1alZVNXVMQXpOMGI3bzNlMDRPRG81dVVPRFpxckZPUUJzSWJzZmozSTRIYk1jVGRqb0NqcWxPWmdVWUF5OFdubUJ6WnVhZjJUQ1RYUTdFQUkyeXVUUktLYnhlYjFhWFptL2g2SXgyd2V2MTRmenphcXh6MDB5WGRpNGNMOFRCZGdicHdJRURsbnR6S2k3WXE2ZE9yU0dwVk1weWJqYkFRZGQxNGdBNDFzbkJGcXJhM1p6OXozWW9aWFZpRHVFdUdRUnMyVnliUFNTbEE4QnRJTURwVG45bW9EU1FzN1AvUHhsZmkvMnpMZFNFM1puWmdFWnRsVTdyYkQ5ZDErSHorUVpzdEdWblBOczZZZ2dFZ3BneWFhTGwwbmkxazRQdHRDbVpUT0xRb1VQOWlndHNlRHBZL20wQTl6WWc1TXhpQStQazdHNE9XUnlkSFVSTzE2RE9qQTJIVDBhT3piWlVodzRSZVBZTHRpUGRZUWVaM1pXWnpvekpuMldGbVIxcUp0ZzBUVU13R0J4d2FKMXR0RzA1ZWd6aGNBNnV1UHdTbEpTVVFGRVUvdUxpWUR2OTZ1bnA2UmVlc3RYVG9iU0gyT0ZtbTJCd21rZTFRNDV0SFlGRFhnNDJLTUhCMldFQUp6YlVmSm9UekxJNXRxRVdFdXlBd3dBQWd4MWM5andaa3krRExXOW0zME9iQVRPMmZZTmQxRzNQcFdtYWhuQTRuSFcrMDZ4Mm1tSG53Y1B0eUk4VTRMSkwrSXJhRXltSlB3VC9tandlRDZxcnExRlVWSVREaHc5bkROV3orVGNUY0hZSE4xRDExQUZ3bE1uREVSdmdxQTEwNWtWTm9GRkt6Y01HMlY5b2c0TEtDWVlEd0d5b3B4blNvVUxPWVMwaWJDRWwrMjh6M21lY21TUElISUJHN1V1M0J3TWFlMm1haHB5Y25INWIxOW1qaGN5aDlhS2lJa0NxNXk4aURyWXpWejZmRDlYVjFTZ3VMdTZYZjJQYlEreUFzOCtlWm1rUGNRcFJxUWsxVGRPcy9Kc1Q2RXpBTWE3T2hGMC8xODVBYkRCb1pRUFlKd1ZiVnNBeEo3LzIwYmdQZHJBNXNneUkyY0xNZmlBek42amJROC9Cd2s1N0RzMjhWRlZGZm42K2RheVFIV2htSG8wUHEzT3dmYXJrOVhwUlZWV0ZrcElTSy8vVzF0YVcwZi9tVkVFOUhnZG5DMDh6M0J5YmczTndjSGJZbVhCajMyWkFqLzI3VTVIQ1lCMlg3V1A5NEdWNzZ3Z3hCNkJsNU5CWXFObkR6c0VjbWoySDVuYTdrVXFsVUZKU2t0R1BscGVYWnpYWnV0MXUvaUxoWVB2MHl1MTJXOGN5c3dVR3RvTEtBdTU0Y25BTzdzMnBUY1FPdW40RkI5UFoyUUhIL0preVJRblcxZldqbWhQOGh1TFVuTTdoWnovR2dzdm14dXp1TEFObWJJdEdsdnlaWTdnNVZJZG16NkdaVXdPcFZBcVZsWlhJeWNuSm1CcVFKUDVTTzVYNi93SEYxRm5aOGoxaXh3QUFBQUJKUlU1RXJrSmdnZz09Il0sIFsxLCAiZGVzY3JpcHRpb24iXSwgWyJzcmMiLCAiZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFUWUFBQUUyQ0FZQUFBRHJ2TDZwQUFCTUMzcFVXSFJTWVhjZ2NISnZabWxzWlNCMGVYQmxJR1Y0YVdZQUFIamFyZjFadGlXNWxXVUwva3Nyb2draXFBUm9EaW9aNC9VZ201OXo0aWlOUnRJOUl2eGxtbElMM251dUZNQXUxdG9WcnYzLytYKys2My85ci8vMXZLbWtLK1czbGxiS3pYK3BwUlk2LzZqMzc3OTIvbnp1ZFA0OC84WHk1MS9QdjM3OSt1c2JnYitqbi94OTQrMi92NS9PMS9NL2YrQWY5M2pHdjM3OXFuKytFK3FmQy8zNUJoZitQWUYzOXQvcjd3L0oxOFB2NjAvNmM2RzJmLzhvcmI1L2Y5VHg1MEx6endmUG8vejVuZjU2ck45Zi92L3JYNzd3c2tvcmM2TVl3bzVQdk0rZjZmY0U4ZmU3OC9zOWZ3WSs5L0MxSG1Nc0YzODk4ZjF6TVJia1gxN3ZIMy9mOTk4WDZGOFcrUi8vdXY1OTlmLzYxNzh0ZnVoL3ZoNy9iUzNMbnpXNnkzLzlqU2YvMjlmalg3Y0oveUlPZnoxUitOZHYzQ0hGLzNpZFA3Ky9iOVh2MjcrMzYwaGhTK1dQUkozRmZ2NXhHVDQ0V1BKNGZxenc2K1YzNXQvditkWDRWZTkrVDdaODNmTWUvSnBQZXdLNzhsMVBldGJUbisvWjUrLzVUQjR4aFIxZS9nNWhobmkrVnVNYldwalJmVXIrZXI3d3hoWlhyT3piRFB0aTYxSU1mejNMYys3Ynp2M21VN256ZXZob2VMaVlXLzNmL3JyK2Q5LzhuL3k2dm0rNlJNOWQvMW9ybmlzbzF6eUdPK2VmZklvTmViNC8rNWJQQXYvajE1L3R2LzhtUDRncU81alBNbGRlc04vamQ0bVJuMy9LVmp6N0hQbGM1dStmQ2ozWHUvNWNnQ1hpM3BtSGVTSTdjSmNuNXFjODl4dkMrenlzWTJXRE9rOGVZZ3FESFhoeURvdUhSRjVpQ2RjYmF2RGUvTXo3bk0rR0hFcnd5OWdtTmlMSGdtNVZkcWl6V1NsbDVPZE5GUm5xT2VhVWN5NzV6ZlhLTGZjU1N5cTVsUElXalZ4LzQ1dmUvSmIzZmV2YjNsNWpUVFhYVXQ5YWE2dTloUmF4Z2JtVjlyYmFXdXM5WEowYmRhN1YrWHpuS3lPTU9OTElvNHgzMU5GR240alBURFBQTXQ5Wlo1dDloUlVYWm1LVjlhNjYydXI3dVRhV1lxZWRkOW52cnJ2dC9pRnJYL3pTbDcveXZWLzkydGYvMnJVL3Uvb2Z2LzRIdS9iODJiVndkc3JQdlgvdEdsKzkzdmNmbDNnMEo5azlZOGRDZXRqeDF4MUFvSU43ZHRjbnBlRE91V2QzQ3loRkRqeGtkbSt1OWJoamJHSGFUOGpmODlmZS9YUG4vcS8yN2NyMS8ycmZ3djlwNXk2Mzd2OGZPM2V4ZGYrNWIvL0ZyaTM5M0R3Nzl0TkMxL1NPYUIrZjZhRmUvTDV2L3ZqcmJ4NnA3cDdMNkhuMWtXZGVxYU1pOTc3ZkY0ZnljTm1aWW45M3YxTllPNlV2aHBUZUs5YlFhOFpPNWErTnNkNTdiTmM4c0Radit1cFQ4RnJQZHFuaXpwVTFybjIrYlkvNjFMN2pPOHZIaDNkdVY0bTR5QkV3WllWbHIyRnpFNHhmLzdob1N5ekJ5Ty9xZmMzMDNqUHcxbndYYnh2WTBkeGEvWW8rT283N1lzTy9Pbm1aK0w1ZnFXekQyaG1mSHNZSXZleU1Sd1FJUEx4bG5hT3R0Tk5ZTGZPY3VZWE1wbjdJRXdKVXI0RVJYcFhuQ3FuMVBWL2V1ZWIxZm04cjlldTFqUFkrWDBFb0lxKzVXMThkTzlNeisvSHVaM0NoTjIwOHdYczk3QjR1b3ZZdjU0OHYxUHlsOGQxblQvSGdkY2U2MlUvMnJxZUVvSTVVU3docnR2ZkZ3MVJXWkIzZHVjbzdubDE0elZsSGlqek5ZQWsvMUFJZHdINDlwYWtNbjFMNTdmemwrWlhKbzhWbnQ3ejJxdStlSDF0Y1VKRjVmMzN0d2Q1K01kWTc5ekJTdXRtZDk1bDF6YVVYV3QvZGVjYjhEbDV2ZlVoUFdPTmIrL2xtcnl1OSs3dDRpcXg0N1BjcDczZHZmTUhMejh4UjJteFl5UGQ5NHNhdnpwQnY5Z3VkRDNmSmRhUHJHNmYyN0luRVBTdGNJMDFla2o4aXQrbys5aGZualpjYjNyT2xYZGt5ZGk2dSs5c2pvVm85OFlnN3NJTVlsekpDclNHeC9ST1JhQ24wdlZXbnVUN1dsbHVQK2IwbzNVNEZ1WWozN3JQaWRYZGdDOUM1d2M2OUxoMVh3L1lnRi9uQ1BvVGt4U3BxRm5meC9kdHV3Yi9YTjgvL2YzcGhzNTZuWlRTNzNURTJmWGdZYjNpLzJIZGVJNjFyTEY0bTNQVkxyR0ZpRHpzT0tiY1JlL3RRY09CdVcyTmdtQ2Jid2Y4d1ZteFRiL0Vib1dDcGtLblUzdHd2Zk5OQ013YzdIVkpCcWdlR0I3QUFzcHZJRnpadWJZVGpyZXZMQTJVWmUvS1lOeS9sRFNKcjIrWm10NitOVGoxekZVeGJRMWI3eWx2ZGY3Rkk5K0JSRUtHMVFJeHo4ckUzSEQwc1dJK2V4aHorYnF2MDlhQzAyaWJjNTQ1ZUxjekdNOTJycHJLUnI0YXRpYngxZjduTGcwenNqcWxhcTdRV01GQXBsZHJ2dkxnT3lMOWl4UFljRHlZWlJOWEJWeEdiSWk1ZTZkdFAvbGhXVmd2SlNia2lNYTN4a2JYcUxPbDdFTlFYRlUxeFFpRSszalJyVEJIVittSXdzQVgrTDhUQjVzNCtaOFFmb0x4M1RoZ2w5QmdsMzl3OUxwVDNld0Y2b1E5c2RydmRZdlFUK01YYjgrK1krMTJ3emJIM3Q5NWpZaGZpM2RvM0s0dkNVOTI1WVUxNGhUbEIvckVzbHZ2Q3pNWE5qc3hjbnBSN1RSanE4S1EzSUlNZExxQ0h1d3VMZ3lmSWc0MGFoZWNjdXdGV3h1eGxsWVNIQUVUVW1QSjRja1RVSjJwWHNPOFQzTHJiZk4rdU1MSDNyT1BEc2lEc3ZQbHVHQTNXMFYzRXA3RWsvVVl2THBhNXBNRExEMjFMNHNWUUlDNTJmLzU0WGl4ZndnRU5SR1cvMk4rTVNxTDBmSzQyYm82d2g4MEY5dFc0WTR0NXJyY08xQnpuc0hCeXVES0VEdS9WMGZmWTU1MUtLTS9IdjJ2NVVGOU1PVDh4UDl4RjNEdmp4YUZaRzV1WEU1L0FBS1krc0U2OGJ1VXZURDVlQXVGOGU2cWozQk9GQm1VRE5qRnhlWHdGYlVZaU16N2p3V1d2aFJ0cFhoOW5tOTdhZW1aVjBRaFdGdkhINm1LR2ZlZkJNeU5ocjVMeGZJTW5hL1Y0M3ZXMVdhOUhDeUt3NXhuUkZzeDVMd0ZCd0k2Ni9BOCtHeWVSdElqTlZlVGJCYkRQVzdEUzdGaFQwbDRacEZ1TVVRTktZSGtqdHBSWHkxaFJWaWEvNkQrQ1dWckdrQ00rK0dGMHJRcW52N2xiU1lEUmtqdk9aVnpTZ3c5RzhJWVJac1VBeVZYQzl1SWRtVUpsa0o1VVBrREtoaXYwZ1lnakgwWFA5V0hNY1loTGEzMDlxT1VScFhYano5YUgycmR2K1lIN1F4S2hFQVVRa0dDbUxDYnl4WThoQTdtaU5COHJ6UjgzOXZZdDExc25GMGNKVndlODdiZXlJd3JkTXhZdTgxYmVzTjVUd0lBdmpCcTJyMmM4MkF4NHh3OVIrZmIrOENLOEsrZ0E0SUlSd29oajhZQmxqMjZkN1d2N2d4ME5FTTlDS0VGQktDNkM4RzBXUDdKNkg3NEJ4OUFSaHV2R0NvUjNERnowRER6ajNXTlJGVmtzU0FLUDJwQ0QyWW9jV0JQelljQUJPRHdTOThhVllranc3UkhqdjNqWmpkRkp3Q1ZZSVRkYWVPMWo5TWVHWlAzOUp4ckt6YnAvNzVHZmtBdTdnWVpYRFBlRjdlVWlEU2d4cEVUbFJWdEJGRzk5WE5WYnhlZEdQQ3U3RVNhZVQwY0xhdnhhamdwT3hnMWkwRjhBT3lZVUJYdWZVUEFLZUErMGxnc0F5OUJaeEhoL2d4WExHS0Rlbm5leStxazhENWduZ1RoNUlsWlFnM2E5RS9QTE9wWlBVK2xLN2FjQ0gwWmw2M3NyZWJUMEZxQVcwb2lmSGpqeStRRFlwakdDcXJpaTNUd1hRR3ZQOXVFQUZld0Y2c0dsY0dIVUZDZVBpUk01Z3Qyd1QwL0hGVWo5VURwc1ZQdHV0dkVEZk1PTm5uSTFuQVlxZzNIWkJiREY1b0Fmc1ZxWmpYM0FPTTEzNTJZVmc4NC84WDJRWGN3bC9qR093aWJqYVJIQWRDSHRTRmxjUVVNT21uL1RnaUVDVnNRNG9VQXFjb0JLbEl4anVKVnRkQWlaUDhnRE5BRXVMMkhnbGE1Ym1JTm9LWk1ReDNHV0hoZFhnYVlvOVlPdkJnSytHR04rUEpTV2xueVMxd3NaZ2NYL0ljWjNuZW1hRlRPMVZlOG13Y2REeC91TjBGWFdUY1NSMFV6RUhTL09Wb05YY3BoekF3cnhpWUhMM0N3N05xaVZLN0lIV0xnRy9BTTdJNzFvT1N2MXZLN3lnNTZIaGcvRCtBWXdOZ1FQdVBzaGVlS3Rtcms1cXBVZ1RQdnE2QlF3SVJlY1dBSXpJQWdvUHE4Rk9ZWWFKWWdIZDBIeUoyQ1ZIWi9JRlpqMXczTnZ2QUhmT1Z4K1hWaW14OGpKQ3lYNXg5ZVB2eTUxUFRLRzlmc0FGdVR2SDVuSHB2M3RKNi8vOXovNnJ6OTVuUi9kbytTN1lneDdhdGllQ0pxY1kySk9ZU21JNklQUmhaYUM5TERmQ0duTEVJQ1hIU3Fpa2QvYlh2TklLOWJoeGUyLzgrQUFkTFQrWXlWKzM0QkYrQzJWOTBBWlRORE56YUthenkzblRoY0NPUEZ5b0wrQUhtRnRYaUFyNm9PNkh1VEhQa0prOGdzZDJGMkhrekh1N0tDNEhVQlgvZlBETTErTDdVRzczeFVFZGcvTUFNVU9NczhjdlRXa1plRG1jVzk0dXcrdkpFNkxnTVEzZGpqMERSQWZSam91Y0hEQkdXT0JzWnNOZ2NHQWh4ZTRDS1ptS2JnbmRtMEFjZ0diUEdwTWNXZ1RFcWgxcEx1QmFoTnkzT04xYnk0RnFjR1BiUlpub0Myc0JPYVBqd1RKSUs0K1JGd1lWb2xIR2JBanJMRFJUNGhqYjN1UHZkYW8zMlhvQ3VBcW9GTFAwU3pVRFo0Y1dCQVlOWnRiRW1hdnMvME5HWjA0cHBtZk1NU243RFBVRzJOMGYvbXFjR3VBSmRDZ3ZrcEppaG4zQlB2NEtwNDVENXgrcnR4emRoRllTVktNaENHYSttN3Mwb0kyTDY1OVRUUVNTbGpmSVRwaWpYQ1djVHpwRzlEL1BsZzFlUDZIek1DU3gxZnhkanNISEJaaTFXU1JEMjYrclBGZzJManpCK3dBamVCRElBanZtNTk4S0FSK0FsU0dDUFhDWXQwaS9UZE05TDY5QVY1UVJTSnc2d1JrWHhlcUhmUlVCYnVCdEgxZis0UEhBTzl4WTVqYUVWaGdJZFlzd25nL1hOUDg4RHZvaUJ5eEF0VFp6eXRqL1Jxd0g2eitwTUJ0NWVMbmgxR0tHL3pBNCtYSTNtTjdlQzNlbjMxbmxaOE1Gb3BBOFk0RkRlMEZzYkVmUUUyZUExb0IyVUtxTm9SaXB3UjVZVWVDekF1VThvQ2NNSjZZeEFnOXd0bWh1Q3pYRGVTU29sekZYY2ZEQVhSMW5CbW1KYm8zcGlnd0xlZ2ZzQUdVenU0ME9JQXNtcC9sSGJZdWFjSjlNV1BodVg3OHJPTHRvSmE3djJ3VG9wQjVkNVQxWmxWdVREdTIxVEFHREI2ekNaaUxPTUNobjAyOFhrcW83cnc2SUJ0RWhrNFViUytPQ0hqVFdVejhDWTVCem9Ub1llamhNeDFFQ0JPRlRraTIyTTRIYUFYa2ZEUnNDVDNvN3g0c1BSc3k4S3FHSDlDV0RQRERjMkVuQk1NM2tPY2IyQUJzVHhBbmVqMGVMMkRNV2IzeVhtVWplOXNjQXpDczMreFN5ZTlCaDIvR3Y3RkVPTlpWV1JMamJzOExUT2tiRzdMd2RMT0FqaHJFbW5XL1FOWllpaUJaS3ZuQmlSbzFBYWJBMk8rV0gzWHpoTUxFdkRqWXdyTzNGY01xQUZ4NENlanZaUTN2Y3EzcUhtU2xjSFRNUm9YaUpMNElCSTJTWXZBTnNHM2hqWWFTQXR5SWlnV2k5T29IMVFud3o0MktIQ1lQbU1KVThTQnJ2U0I2bEIvaDRMNmJWY0tKWWM0Q0NpMFpHNVdOQmNITlc3Vzkzd0VoaEc3c0M0SUw5a0hVd2RmNS9NdWRnK096WXBDcWdJMUdZUGtTV05lUTR0d3ZPQmVibnNFdWhpUlFYQVM4WDRDWWdGL0FDNWFOUE9DS3RWdFRtTUR5dWV5b1RsOEdDbUtvYnc0cWNwZTJzbTRMRVF5VkZ3UDZzVGdZRFVRTXRVUmN1VGV5RVJxTUhNd0dhaENsVkd3OEhrcXZpejFselpDTXpUYm1nVEhSaE9QYnI1TTZBYUF2c1JXd0JtejVIU2dkY0NEZjIzSHVyQ0c2L0FFT2NKT2Y0ZllYSEtrQ0FYNDJjdUsvVFVKcEVNYnhaNE5iSWZwWWZvQldRTDVxeU8rRUxYVzhEbDRJSzQyZGwra0JHUGs4SkFLV2lWSzl6NVZnK1RqYXR1N2RxNnJBTnFJRHJHTElJampNYnJtQkt3TmV0OW5ISlAyR29mN2pTZjd4SU5lZkowRVArckdLQm4wRTFYeUszVUZJdjd4T2ZKZTFoZzBYU0RQWUM4VmlkZUpkTko2M0R2M0tNRmRNcnM1QUV0MVFiWDZnMUlKQVk3WmhjNGpBZzZiZmZjbFp2dkxuMW5qeDlQM3o5dGZmN3g4L3dLMW9BeUxLQXAwRjdTdmowZ0c2Qmxta1FjM29tTkUvQmJQSDUydVl0Tnd2VEZxU2loYklmeE5BZzhGYmRERmxzQzhNRFBuK2pPZ202YUN4SUpnanRwVXROY1I5Rm4yMGNDVThVT0N4ZkRmTU5xQVYvd2FpRHMrSVFPSUFqMVJtY2FiNU9TTHpZc1doVk1PYzROL0NHcGR4amRZYm5nSGZjb1JnSEpBbHNQMER0LzV0Zi83cjdibisyaDh0L3dDQjRDenlnLytGMytCWkY2UUhHd2JzeUxWZ09sSTRVY1VicExEbjBVOGo2U2pMdGJDUWErYktDMHpEQmdIbFlkTWIyc2MyYnJ4VWxGc2NvTDZtaUF0K05uQjc2QUFQeHhhRFRGaFlMT1MrSHlEOTB6b3ZLTTNMRTNzNDBFeU1iTkRIdzBsNTZnZUs2MTdpWTkvenFvL3g4cjM3VDFtdXU1UTc3cXJGRXhndnZQdEVHeUcxa3E0VEU0T1h5UnJZdXhPZFRudUFPejVzekY1VjVvOENsSHBOSENIS1hUTHdwd0NURUlRM3duTkJxQkFVS0hkZlQzQnRCMTZONi9POVZRV3VmQ0x5VE93cnVyazBJNGp5UFdEQUtCUm1tTFhwRVNLTW0wd1JVSUhsdUNWYXNtRGVIeXVFMVFVbFNZQ2VWZUhLRzNmMGpBdUVOd3dhR04xSFpoZHFKTlY4eDJkOEdCUU1iT25Rd2hoaVVka05XQS9qOEs5QmxLWHhiNnVFZFNITk1HbURuRHdqa2cxZGdLYU9iMlljN2FOWjZCV3lnS3hsS01xZTBxR3lzWlBHcGtQU25pSlZJMTFHemxwbmxYNTdXeHRPUUFnSHFtaFFkN09yckNFL3paZWtweGhoUStuaXVzREZjWlRnSy9qS1ZSc1cyRFQzL2FwTG9yeHZGMFhZVEFSTXNxT0NPSXFWMnNid3N6TkEwNjVTM0ZCbHZEclBpbndZUUtoNGlucmpiaXJVcU9ua2hpUUtSSSszaVJNVUE3UDdNc3VDZ1kzekI3d2dlUkdva21ZQThFTW82aFZFUWhEdWxjRlArMkExNE92M2JpUWFVaXdJM3puaTh5Rm5IMXF3OGJudkI1VGhKaCtXSEpOVDhKaFR4SmJCSCtyc1BPcTRqUzBYVmcyOE9TZTBjK0FqakFGRFFuR3ZZR040eHNkRmNlR1l6RlpyaWREUUMxNzhMcGRkMGEwNERmZ1JxMmlBazRWUE9HV2VGdyt3WWg5cjUyV0F3NDFQT3JPR0VKaW94dDVmNEp4dDNDRTBicmhrTDNsVTBFMHlBWUFUTytJWFBud3NXbmlYYjZQYUtUem9mdFhuelRkV2dOS2FWOTI0YjFEWWwydENzY0RNQ084TjhYMWdOaXR4dTdxQk94RHUvRDdnSDVNbmNEVXcyTTF0QUF0RDNXbnhNalEwWmNjUTZvQ3R3RHdsdFJpU2dHRCtJM1Jmc1UxUGh0aSswRWgwYmpYRVJ3ZVFWb3NnalNkZkFTMXlZVGRlZUVpbTk2dDEyNWlDRERLK083Z1Vmd3J2aTBhMFFMSWJDM2hYY3pHRkpmcCswUDdrUlpCZ28vT1BJZTBuSmFBekFzVStCaDB5MGczTzNkS0NSemRsNG43TTlRQkpjVk8vbkJKTG5LOGhHRExrZ1JGcGlCdmFiakR4UkkrQkpWSllFRll2RXBrUVVTSGVENUhGdGNNenRMcFFYNlNxWHhpVWtSQUVWZ0YvTnZQaHIxdG5BTGlJUXJXRkhHSjNzUmNMODhicnc5SVN1QWlmZVpzNGVCYVVhRis2U3p3SDJ3U0hob2EycDBZQVBDSnlnMC95RVhiSUw2enc0NEZmU0NBZlFHSzViMGJ1UWY1Z1JSelpCWHBjYnlxRGI0MEoveDc4UmpXNWhLSG5BcW9FUnhqL3VMR3p3TWNuTCtINC9WdmlweHFnV3l3NCtLaWF0OWVjaVhNTnYyaDBxa2JKYndCeG50dWcyOTExeVlhbDBINVkybTV4UFhsR0pRSGx1TVNNWUtLTjBVUldPaEJxcGkrRWJuWE4xcDFydCthU0dneUpBUGlVWmNOaGNTK01jWWpCakVvR1JGU3daUDhQNFJQbi8yM2RNQWg4TUdPckkvQWhvb1daLzk3WGVQYWRKMCtLOFc4bXBkQ3hKZG15eENlYkpHV2ZEVEZoRmZjRzYwTVBCQ2IvZmpzRThzY0Q0NlU0eG4vZS9jRlRZQ25yTUkya1NKdHJTeWNxQWorQmRNU1RoR0xYYTgreFIvTityWWZ4WHArRkxiVmpQMUhSMjlnMVJPTUYvSmYrejl1ZHUwMkRBRnQ0T3V1QkVEd1EzblBodXdCUEY4SmZFM2dmNElRNXg4c1VBd0o0RDN3cWZ0TjBYNnlZaDErdUQ3TVprczh3Ti9LQlFnQlZ4dERXWFB6YlQ2WXZZaWkzQWZ6dlpBbDkxN01nZnkwSCtKZ0hpVGR3UE9DQ3NXMjQxbFp4MVhEaysyS0h4ejNodXJqenJhaUJOYld2a28xK3RoNDhoZGxyLzRlYlhQKzRTejRTQVVqbTNZRUdhTFVMRDhaRDRUQ1l1THNPVDhubjhWL0EvTXQyQUE3bXlmTGhmQzdnYlJ6WTU0eHZlajRVR292c21zNlRqZjNYQi9qYnR2L0xlOFlhUVA0c0RSd0RJd0Zpd29Wa1RmR0o2V0F5Rzl1Q0RVSFpRWmRHa2JxazVlKzdoL1hDK3ZTeEwwZzZXb2xVeXRBTk9PS1hJMllWTVpic2pDZEM1TkZGN0RHODUzMkJ2K0E1SktkWDVDL3F2a3p4S1pENGJ6WUFJaVNNemxXYU5xdUd6amlDRkJGWUJyb3FYOUVHaFpueFJEanc5eTlRV2lhUThTckN1ZkVIbXFPVkU0cUxQOFVsUTVBYjJnUVZLQytXYlV2L2JwT0Z6MUdDWm1Ka1A5aFJkSGMrMTVCY0dNcUJ3dHp4WHVqbU1NOEsxb1RObWh6QmhKWjNjOUc4endhQVJUNHp0WkFoUDMxalBMQW9sejV2bU9tWStJTjlJaERjajJYR3g2ZjY0VzR4bFNiSndDYU5ad1E1cmNMeXN1S3NuUVZsR2FUUjkyWEFjbjBtYmtydlhBVm5oSWlNZW1kWkZUdUM2WjlvMEsvS1pmTHEyMWdZUGphelFkVTh2a1lTdXI0VHhpUHdYaWJSWCtPZDRQUnBUZGtUUGpOVThvcmVzWlhiSUJ2ODMyalpTUVVhNkNycmFld1BxTFlCOGg4MGZ4ZzlqLzBCRUxHemNuMWNTR2RqSnFaa2pDUFNWVUloaURBU3pjcnZZT1k0aHE4SHZFZzc5WWx3dTBNbFByamxoTHNWVEdRR3BVV3I2ZmdaWkMwcktWUEpSNlp3YTl6K1M1Z1NydjJZemxBNFRUVkhscDFWZ1N4Ymh2Q0xhWUg3dTVVajNEc05nQjU3MkxEeUw4eFJQd2hnQnRVQ0xaNTlSZUFsWkNHRHhPUjRvdDIzSVhsSlpJaHZMU3ZEcTFxWTZRU24yRXlBQyt5RE5UUytYdlBKNUQybTZSdDBMQlhUR2NhbzhTMWNURXR1dllOMFZTeXMrY1BIckVPVllJTmdqdlFrQkozNzQyMnhrZGZ6bUhTb2t4M0FXSXhqVzhQUCs4S2p1T01iNElNTGhJQ0lBSEJSYU1UcnRXZ21mZ0F6QUFudkhQY0ZSdkJicUpOcXcrc2hqTE4zSkI4b0JsK3RlTFp2UWVHV2dZNzhHTEpTLy8rNjQ3bWZ5VXo5MHhEaW95VG9kY1R4NExBZy9qSGhic1ZoaVYyREdDQkgrSFNUZ1BuRlU2TUJqOThQeGt1K2ZqWDhOTjVuQW5YYSs1ajZCQ1dDOFhBMlFxQlFqQUx4TGxDV3VGR2tsdkJYSjlsZEFRK2d5WkdLTU9yaVVZQndBNHVERHQ1WVU4Z0NOR3FEQVNyWU8rWDRZTGFRLzJjTjlxMGNIZ2JLUVluQjRQNjVFSmlKUGZwYmprSGNEMEJLdDRub1g4YnZ4eFVqeXB6TDRZcVlHZmpSQi9RQjVKZ2tTKzhEd1MvWDF3Y1lLaTFlQ1NrQ0lnTFNwN2J6T1lrSHhkbTZvQnVqbXcweWd6a3hqM2xqSncycjhQd1krcm9uaGkza29aNXVNVzB5Vjd0TXUzZkxPVUNDU0dRVXRMZWw3UlJuTHdQMzNTRGhTVXpHWDhyKzB2RkhqT1VIdU0zbHBEUitiUDdCdWU0SEJNYjN2NmFSK3IyTTBveHd2TG9CTVRSZUEvcU8wbGFVSE4rYklTbld2U0NrQmk3eGlUeC9SeXl5dFV5Z0YvQkJyZ0NodWs0Qk5VQ0xyNERoNGE1Sk5OSk1la1JVSlBWWFR6ZU56Z0ZhVTQ5dndpSWlnWVloZVN1VXZjUmtyQTV2UFlCSTBiRGNZeFlSUW54Rjg1UHNUckJLUmNxS2pWWU54aGkraDdSQnJ4S0xzVldjU01YWlltQ3hMamk3Y3E5ZkRLQ1VDd3NDclRnTEZrbytQNFFSZ09nQi9qQy9yQStBQTV1QmFPd0Y4QWNDQXFFbUdqYXdKcGdTN2h0R1hTQi9mS0pKQU5sTlJSUld4NkVaTitEZGJqbENONGpCYnFIWFZvcHh6d1MrRW02TXY3MzRCVStIR0ZtT3R3WXc0c0ZPZk1IYUZUZ2pNbTRsandnSm0rM1dtOUVBcXlRZ0dPNFl1Q2hlaEszZDIwcmZ1QUFGdFI1QjRQZFNIN0g0SCtnUEFHN3FxOFBsQSt4cmpNNGlsY3o2V0R0aTZWRzBYTUQ4MmdjdWhHdyt4Z0EvOXVYQnFQUEtyR1JzUTBXQ2txTmd3TEp5RnEyZTlRUFFtenFmM0lScllSTHExYUFQa0lNYmpXOHc5bkxTb3g5V0VYT0g4K0wzeHA0TWpIOTlUZm52Q21mbGZnS2MyMFRXOGI0alh0RVExWG1YOFA2V01Cc1Z3SFpCM1c1ajdvQXRrQ01vQkVTVWdobEJTQkdjVzUveUd2WitrSjU4SVphM0YwTGVZRHdzVUxvYmo5alI3bmJDRWptZnRCYTBJcUI3Vml4aWt0a0xzYWpKVXZQRk9OZXoySlhMNUhkRGk0ZWxBWWNWUVNCQUVhd0t5RzV1RUlxQVFiTEFYbUFMY0I1SXNNVlNaUm85bVplUlFaWnMrZDdvMVJyc2NEUXl0QXllNlRtMm1RYzRvNlYvb28vN00wc3hBYXQ4MFlvanIvZGRNSVdlcmVFU01vZGFjSW8zMXMyeWh3U0EyUEdZaVJ0bkF4UGNsdjRCQ252ZERVOENXTTBJR0VSdHRnc0xiRVJHZUpoN05RK0ZQcUxuR0xaNlNtMEF5dFdFTkkrWFlzWjZBL0JBaFZDajlWaFNjR1B1TUFpQUNKOEg2R0RXTFpyYlJ3YnFRaGJCVCtVK0pka1pzajF3MmhiSVk3QU53QUQ4ZFVZYkZ5M2d5ZU9hV0llTkIvOHNtUUpVMTJyQVFiMk0zQ0lYZ3pIZklSR3N0ZWw2MWpkWG8vaW13WkRxVkpHNE5pK3pmNXQ3ZjRESzl2Wmk2R3MrSUR1WEdBNkFJTnpCTU9YOWpmR3IzTDkzSEpZVkNzbk52N0pxTDA4VTc3UlByU0VnaDBldHByY00yUXdsUE9DZE1LVUdpM0FjaWJWOW1xVU14Z2kzVmVnQXNYNXFReStzTXBUS3pFMHlDbWxwT2xEQVNnWXhpTGNIWW1SRXorb0I2M2JBUVIwRWpzMTdFM0kxdW5VWEQ3dFdVVDBNTURmTTJ6SXpYdTNSam4yOFBqQ2hXU2RvY0EydjBMUmRZTDNCVHNPVmxjTlZlWGJBTjdxMnQ2VVZKb1lBWTcva1BNU2VhL28rMExkREE1QmtOQmMvaEhETEJMSjU3MkpRTm9ZVHVWMnNrZmdJZVFZbnZCVlFQakpFSkJqRGZEQWd3TE0raDZXVEZlakc2a0lGKzR1QUZ4WVpFemI3QXlEdWI3bjJDeFJGYmdBMlpyUmEzTk0wbXBVdmdCM2pJZCswd0hFYWNEdjUwUlBiVDM1NUxHUXhId1Qyb0d0VEo0MU83b3h0NFhkU3JqVjhlS1lFZThDVzNNZ2lXeFdNVnRZcFNlYUtBbDNRNjdRY05nZnJJUTNNNVhJL2tCWldoRXZpK3BOT2FvZk92ckFYdDRXbDc3REt3Mnp1bER1ZWNIczNqSmhlRU9GbE5lU2ZyRVBWMWticlJmamlMMWVMMFRTQ3pKZWc1Y215YWF0VzFBUjVpNldlKzBNSmNEd2cvd2NFQlMvTzJZdjF0bkdNT00vM1JhK240UktUWkR3UVdBQUQyd3pqcjJneGdMVmpTaVZNakFXODB2cnZIdmJmbjFWVGJURHpWeU1SYmhaQzd3d1Faei9EWlpoTGFUeDFtS2c5R0tDbmtLQiswRFEwS1dDWnBneWw1MU8rMEdSQlZqSk5YQWRtQmtJRkE0L3BDbXdDZ0FoUTllaXF6QkFhMWVhbnZ2L3FxZjQ4L2wvSmpUOHZNUEpsMGZ3NjN3SXBIQnVGbUJSYzZZa0NoY090Y3pzeDNtQ1VFb3FibW9GMUhPRDNFekxqd2ZsNjFYZDBQSXJIa1RFQXlkeDhTc2dLbEh0MTAxMnNncnk5N01NTjExcXYrQldvQi9NR0I3TW9zS09xMllQOFQ0dnFCQ2pWTkhJQy9tSnU4c2xnSitTdlllc0FRQmF2SlBQcWtOTU1HSmxZK0c0Y0IzZGtPMEQ2NlViNGZrcFFmbFZzdWs2QW5SVTFyN3NhVHpYYjhhemI2a0U0TEYrWURTZFo4Z1VCWU45Z1Jld1l6bUhqQW5selhIRUN5R1BaNTB3Z25oTVJXc2FlSDJzNWdSMUFWWmJtdzcreGF2bGIxMGtQUUZ4dXFIVGJKdE9NaFVBc3NIK1B4WkxoRzJKOG5xNzhJeG4xMTZNZDBqUk9VOG1GaEV0dVQyejlzMEpsR1Fsby9yaVAwSG8wdjZJMUh2aE1zem01emlBVlV2ajVzMDQ4NHVxWEZ1akd3VGF3dXVXazFZTGxWWGhOaUF0MkJjNkVId1pTbHB3TkNja09BaTRpVy9CejNoSE9CQWErREE3TWYrVEpYT1h4eTZEOWM1WC84MlYrVU9iRm9ZbHNva2I1UVk0TzI4REVBNkJTTU16eXp2SExWb20vaENtd2hwRlp4VkJ1dThRQzY4MWFuQ1JDQXdGalB0RTF5eDRFSVZDYisxZXZMdWRGc3dMTUJpY2ZzUnd3Q0FBbFFCUDZBdmNNbWxhV2gxZEQ5TEZhc29NcktYUTRuQWRFaUlnaWlqQ0EvUDVhZlY1REVjMUE4bmRhWnJDUzJ0d2hmWWJ5QjFDcFRQd0dGMTVHT0lOTzA0UUZhTjVtay8vcHFvME9wLzFMT05QM1d6WVliSTUySnlUUS9ZaWpiTE5rSnBmU3RKUUJTMk1kdnVXeWVSb2RLbTFqOFZ6c21HNWdXTU5Dc2tEdVBXYVMyeHNQQTMwWGlHckcvWElSL0FPWW9nUE4rdUVXMW9WRDdFTGdCYTluOU9lblljdFdqR0tjZy9VVnJVMDQ5ck9hL252SE8xY3ZPMFVQK0RhY0w1UVhzSG4vOUhPZnBIZy9KRk5qbXVJdjRHMkoySEcxL1RVektUVjNEZkNNWnBQWTViYnVDZWUwMUh4dUNDTzZGcXJkVmNiT2NVQzJKSmczZTFtd1pZa01vQjFFamd1d2pCbWtpZ0JhWUdZMDV6SHJmVVJUdjNFcE9YSFczMTU4M0JVZVBPMkNZVDErWDdQa2hGZEFoSThYeFVqaVFuaDNOZ0x6aUVPMi9tRmVGcjd4cWhYa3I3NDl1TTBPb1FRdnNWN0xORW5aQTlxQ0ZiRWFjejFtSGl4bWZNeStWZVB0N09vRE9ZNDYwUEVmcXdNcXYzK3loR0Z3RWJYOCtRQ1crQXZhd2FqdjM0TFpPSEJOMnpVUnUzdExhUkF2WkJiTWhLbXd6Y3NhSThqRGpqZ1JDMTk3ZldmOFFJL3NLeXhDWHZ2bFltejcrbGp4YWkyTHpTUlpQcHZ4MGJmdExpL09BZS8xOXZzRVZYMnVCM0tOMjJ0WW0xMnRBVUhGMFRzd01KNjJ3dzNSUlY1OFdjOWtqdVpUcG1JcGtDNEJTWVRnUG5pYWlkbUwyQ2pRSzFiaUJHYW14ZDVBTHhOMTJpejhlUW1nSk1OS3BsVHZhbTBBVUxzQVk0Vll0aHhabXdKSSs3Uis0S3p2VDVMbHQ3c1hMdFEwbVo0bnZQQlBsaG1iejJaSStBTXJLVjZEWnJIaEZ2MUkwb0hLbVBRblZ3dGo3dGZpL3oydXpEZmJOb0FjNWcrVHZVYXhPa2haSkFBVENMWWx4WHh5V2ZpVytreklyRVZRQWZyYmpCNWFvSDh0Z0FVZ0lTQmQxZVI5WVhkbkxUd0ZHUFMyNThzVldKWUpnaktMSllvNFh3MFZWaFhBL2hwVmczZGNyOTBYY2dKMHFoaVJoOEUrV2lwVExqT0NTTmVvZHhzTmlkZ2JXOGxxdjhaaW80MFZwV05TeG9Qc1h0azZCSHpkKzJCeWdsSEIrU3ZBUWJhQkc0LzEzVWpUOUFYWmQ1TUlzQm1yZE5rSGJIaGtiOENiejlYTVZHMW94eW0zaHNzK1ZtakRDa0I3b0hNd0dyVGlmbm5CdDUzL2krdzh3SWZDNDViN3k4K28ySlFKWXB0MlBVQnFqb3ZFZmlFcTdDbklOdkNEdkFiOGkzMS9DZ3dNZW12NTB3T2hneXNBdm5KRzBBT1lMZDZYajJ6amo3bE1rTmpIbTFkYlFsbExrVjB4RG40YmRoa25tbytrdG1iZUZJbDVQb3NXUkM2UER2SlRFYzQyY21md0Q0N05xc010UjlTc3haUFh0MFVMRk5qRWZiTmFVTUlMNTlNajh1d0tvN3V5clhRRHkxL3lDQ2dTNWl6ZktRMWZCMGJBUTJiYzkyTXMwdG9STTFSdno2ZTFDZE01Z0ZMUnlxcjdtaWhOQXF3SGlTRDJOT09hMGk4M2FtcmY2a28wNTlsTnltUmVmcFpmZFZjQ2MzMExXd2tsK3VVZ3NVVS9hMU9zOVVrblBXbjlaWVQ5M3ljNkZOLy92TmpmN25udWVFd3R5QlpJYWNFdmxvVmRlTEhSb1QvNCtSZjhCYUtHdFJnTkJNdklDYnNCOTlmb2lJbVJiMDZVTlYvdC8vS08vN3doK0FZVHZpeERyU2E4N2M1RmFhM3dTUkhQZ0RCMnVHY0hmZXlvODdyeEF5Y2E5Vm9oZ2FuVXVvU1RQWkFnblNJQ0VZTmVDUVpaUUhsOU5hNlAvN1Q3ZzBjMjNSbGhzUkRmb1Z0S0VkeHhlajh3VWJOWUpJV2hSeWNCZUJsa2JSRXR2aDlZeDdYYy9JQjFRMjNSVjlRT21kUDZOdDhEMHArUi8yVTdGcCtIcEUxNDVFSmI4WkpjRzhaeHdTV1RLZGhmSzlRR1hxSHBGdjFtU0dEaFNzc01NcFNZeDBCaGgybmJVWERMQlhNd1poNEdjUVVSenpCbmNXQkxzWENubVRwLzBVVThjTGF3RDNpQzhEM1JjdGJiTFBSdG4yTlBhTGloU2pRUnFsV1E3RlFiNzl2U25aR3pkMWx6Y292M09oOWZGVUthdHZWNUNSTm5NTXhrcXNFRzY5Z0NYc1VPVHZ2UHJyc2dIYmErbnh3UC95NHo3TzNEQVdYUVFuMHBXNGJjL09xUnBVNTRsOVBSQ3I4d0F3ZW51TnNWMEF0cnVOS2pKNzRQVG40Vm9iRU1BVUV0OGY0YlJKT2ZKNzBXTDVyQXd5aEFLdXZkclptNWJYaTVMTU14N1dyNDlIUGJySHVaM1M1bGlMaXRvV1lkei8vazgzN0JVaGFrSURaQVZsdDgrRUVxTDcwa3pnR2lqVk5ESG4rVVpaMllDczlYc2wwMXRzVzgyVTZ3Yjk4TDY0NzgzZ2FRUm9tb1ZOaXhBOWduYmdtaWd4ZXZ2QnlHTmR2THRhejdlNUM5TzdZS2xGNkdUU2ZTMUsxdVpHdGhNdWltVlhPM3paR1h3QUF0T0cwNDNTNDRXSWkxNEFhQXkraEpUbWlqZGJVTlZGekhmbzdHU3hhOEdnYUNTL0V5a0pwcVlVZTBUdGdRTldzSGVPa2Qzd3FCdzQzVjlySkpBM0UwaEhvSGJQbTh4UXNadHJwdk9TenZrMmE2VUtNeHVqS0FZMEVpWUpCV0JrUGp6SzJjZXBLVkxLQkI4SzFyUU1wQ01kVS9iQi9iL3VCbnc5WUZ2M2hhdEpuRnNva0F4YzNCZVJmM3I5YnVSbmZ0ZHNhaVBuYmRCUXRSY284OEtMeDJRcE10dE9FUnJsb3dYSmFMNWZJcjRsdFc0Q2Y0S3lzUUJGYlR3dlZ4K200TlAwQWZaaEozUkIvSmZvbnRGNjVwRUN5Q1BBTTd5UTZkdklVSklkdU9yZGhXdUc4YlhvNCtkb2pIaVowbGJESTA2WlVUQUNjYWlDM2JDWVVrQTljQUN2TUdsL0pjR0tiSFFrVCtGeUhaRTJDTGJ6c1hodUdoU0o5MXBza2NCdVFlTVBxOXk0NkJ2WmVGRVR4dzA2SGp2TEIrRTdlUXdwa2ZnM0pHYXhYU3hEODZvY01ucVZDYys3SExPZDBYVEhQcVI1TEpLdllIRHhQMTB5Q0dZWUh6S29hZzVBKzFZUVVlcDhkZ1RCMytZZXZHTjdYSTczZGZ0amxBNmNxSk0wRlU2N0JLcDM1cjFldzYxYzhNdnNoNC9ZQ0JxTWxzQUNEbEVXQUF3dTQwODFWOW0ydzduOTcwcy9lMS9Cclg1bTZHbFJxTGdLMnA1b3dlK00zYVVsTkpGTFNhMVlEZUcrd0crVnZHWTc3SDNtQTBrS2Q1Z0ZWZml2WU1Uc3VFT3lLMW95M2hGUU9hZGZqVzJlM2JKQjZvZHdQSnJtSlZTbU9EYjZYUnZjQm5yYkNiblpYdzNXN1ZrQkdLN053STY3UUZvdEUxSzlBZElPTEhOaFY4L3pUaWpFMThiUEpIeUhsKzhET1NadmtiM3FUWitYQnF0WUJHcHcvOE5aN1AweGtIMlhrL0wxaDNYdzZqRU5OKzA1N0pOblFreFlnNkdCblFBWTQzYTJmYStiMTF4VUYyRFhZQVVOcDUzcExWOTNkZjF0V2VkdDFoVzREeFk3NE5Pc01OSUl3ZmJubldoQldQQmdRUWVBUG9GZFpSbXBqelRTa09uU2xVMU5nc1A1QUE2MWd0SzhiSE5FbHJWcGVsL3pCaFJuZHIwaDU4QU5wbldYbC85L1pLWEhqWWVLb1ZyeFd0SVFpMXNCZWdZNmc3b29BT2dUZGZkTk91Tml6OWFjUTlsQjFVYlR2TEJ6RUFoMkM1WHl2VjU3N2ErQldaRG1zUGRidG14Z1BtdHFBWjdaOEJqMTlWOG10MUNBb2dvOXNGMnJibWE2UTVQMTRJMGJqejA0Q2N2Ryt5cHZnQnRYOEZEV1Q1Z0w0MW9HR1ByL3VZcWJxdFM3N05lZWRXT2c3SWZQbjEvcXJ4aDROYzhEbFBISVlEcG9Ib3ozUURLc0pxdXRSZ2pNZUluVld0cHBRTmt0aGlubm41K1Z3NEJUdVJXQXVjckNKcXRCTjErVTVoRW00Y0IyQVBMTjZtM0tnQ3FMNHFVN2NGNFNpSVVVQnpubGUyNnY3cmpyVndwdE92SWp0dXlmZzdzWGpnZURBR3VHM2g2N0NqdU9SaU5RTzBZdXNaMDM3N2hqZGNXQ0tNMU1RczdSYTRLL2NGYUNHYmdxS1RHTFRVWWJGSTlRYkZma2lWN1BDSm9DTkVyL0ZKZk1LS0Y1YWRsMElKMlV0Y29ETkxPbStLYWk1ejZhY0ZIWHNOOWJlYnhYak10T01DOGNMNTdkSHQ5V1Ezd29VVHNjcGpXZXNJVzJQdlFPb0wwN1ZNY3RwbWpwRzBmQVQrRDdSZldlVXdpWUFYZWh4SzBGS0hKdGNMa05tcWVTcXc5djFBbEY0N3lScXV4a2hOTjR4Z2Vid3NPZWlYK05mRFVxNVRwZXRiUGpaajNlV3lsZWt0UDZsRmdzSEh4aExpOXhPMkJVbi9KckxQQXd3aityb0txQjV1R1JkbW5oUjBoSDNvOTRWZi9MYWp2bmdBMXRlNU5tOUplaUpNdC9sSWEvVlEvZmJXZFR1TUJ2Q1Y5T1dnTUVRdWI5dGcrOGJUc3N2UnhnUXc5T24vS0Z6RGZIMDJ3anpzdHVrbnM1cXNYeEJrOFg3N0FQb053WjRpZzQxRHY5QWZxNHJpWmx0ZkVISkkzRGo1aW1aaldEU2d4Wk5QQjhrN2VVd2I2TjVrODNFQzlKN1lKdGJpVGxjMXhMYmpFY1RYQ29ieUxITjJtelY1T3VUT01sSjlYNXoyR0pRVDI0aEFBV01rQ2JMQ0RvQVp0aW9DSm0wMjRRRnZsMk5xRElhRlU0c01qZ2Nvd21aVjkzVXlOTHhVc0RTam4vQTlnTkVlUno1eC9SOCtNalY0amhWd0JFMjI5UWw2SElUUHVRZ1RtdlNnN1RFdWx1T0VrdW9uQUQ1WUhQL1FyVjV6aEF2Q2JEdytBVHhaN2k3RXdqd0NjREFlZWw1bk5mUU9sNzJXTlZ2TEhuVzIzampqNTVRU1NERG1OcGlLcktlNjZnUjBiTGxCK09FcUJnaDVKSk42RTlNQTZkYXdMV014V0ZjZ0JzWTgzRmErTjF3K1pBYmJOTHVXNmJOQ0xDNThWYlpRcWpxSkI1Y0hBZ0syaHcxZ3R5WWt1Z3Y1c1pxa1Q4RU1PajA2U0F5aTRKZ05pOWJnUXhubEFrbkFOQkNMRzFBdjl1aklHUkR4dXdMaS9xSHp4K1kxYVIwUGorMHpQbFVuMnc2a1FPb1RwdlBESkp0WTBYMXR5eGZnbmNYQ09FenRnSXNBSzlIM2ZxclJDN29oY1IvVituNThiTWFCUUwrZUlGbllwMjhyYXdzNkFHb0xxNDhWQW9kZldscjlFdExIUzFoNitKMUY1Z2J2djRpRGRERGJBUzl6U0hZeXNrN29BQkFIckFBVnhjOXo5UkhOSzRNVnl3dHdHTUVVQjI0ZkszU2Z5VWgvWFZONmJ6RDJ4NVhHTDBMQUNseG4ySkpWYTVoYXMwcnJWM1J6NmwzLzdjdkcwSEw5Ynk1NS9mT2EvNzlkOHZxdkh2UC96U1d2Ly8yYnM3eW9JaVEwWUc1dmErS0UwaWY2a0g0TGVUY2NuM0ZJSno4c2crejMrSS9ML0N5SGN4Qit0c01zcGUyK01QZWdudmZmNElCVHUzejkrOWNOSHYwWEwydWRKT1lGTmQ2SW81MVV1ZjFvMTdMTTlBdVhRMXVnWkpnaWZDZFcwTUxuUGord0lod3BoMm84aEhXd1pPOVRGRzFtMUNUb2gwUVR1RFdyTnN2VjNtMFBLZmJ3WE4rK0tCenhySzRab0daVnNEVWVEN3V3d3B3T3ZVR1o0SkhMa25qMFJraHM2T2I2Yk9iN3JIVUdXNVNCWmRoV2d6Vjc5RHNlYXhzVS9PSXgzVlp5Ykl0aGI5dUJIUDBSc0RtZkk1UXNxMzd0K2Zxd3pSbHNpRU5FeFpKOWF2MTVMSVFBRGZNMVRNb0NobXJQN0NmQUFuNkdtZGpFNmJTRDFDOHNhSWZEdEZRQ2pPMFdqanREN3hqT043ekxyakhML1lKeE5TY2c3UURnZHZyTTUydzE1MDdBQ1pwZ0ZPV0hDc091b2cycmVPelA4SDg1MVpyUkJ1cGttZlZuZGFMZjFDZERPNUZLeUkzSjB1L2t0aTRXQzRNSjd0cXdTQ2lDcHNkd2RMRjB5ZGk1ZnZmT1Bwd3pZWkJBOFFrSXlDNGwyeUFDSGlHWXA1MW45bHEzbFg3Y0VrTXB4YlFxeGdkN1RxT0ZKWHF1ejBrZm1kR0VBZHoxY01ySG1Ed3NITjZQaXVUdTlwOUNXTVR4dzJWRDdTUEdaanl1WlJVR0Z5aXAyYXcxOEFNQnAxS0JSMUJFeGZDYlZpQTQ2ME1PdFV3YWhWT2ZHNXpmeGc0bm96YVc0UzRuN1NRTEd1eFVqK0FzYlBOdFJRcStyRDN3NHl2Y2dvcVN3UWE4VGNUeDV6OFZvM3NzaWRadFlNT3hwSC85emZPNkc5WEpmQUJyS09kNisyazZaWXNGS2pmN0J2QzBWdWl6TXNRYVZZQThrRWFpMUUrdi95ZmEzV0JPbU9TTFR6eTdDRS84ZURVVGRJb2pxTW5tODQ0b2djNWliYUJCNXlYc2FmOEZQZ1hRQjVKdXhyVGdDcEs3NUx5T2poOWErOHJZb3duS2YvS3AxRWdXUHljdUVSMWpneHFuV0V5ekJPZENEV3ZZY1U3ZzlUd2gzUlUrTEZWMlROYUZsQ2MyNjh1SHFZSWRkRitESFoyK0g4QUdqSlljdW1tRkRSNThkaE9pZmhWRDRyZ1pOSW1kWEpkUkloTVFvSmlOWEgydnBEbmV6cjU2NFg0cVYwOGpBNmFkV2NXK3JGU2NGS2dERFk1WG04NDhLdG1vMzlkT0k5ZDJMZyt5REw4UW0yMk1VMWI5VDIydGc1ekEzTnpsRG1YUDArQTJzSm1RS0d1ODlycDBxOUFqT09aR0pleTdHTUFnZUpEQk1yRzNSb0RYV2M2RjNmT2t1azl4Mk5yUG1UbGtyUkZZNW5MU2hma3RMckRoZjFnaVVLdzlybzRjYWxoRzdNOHdDZ1FZU2grNkQyMWgvZXhiQ2ZZSll0Yy9jeUFYYUJMLzBFOVMxcENWTHNGYXRXTE96NVJEd1ZhY1VZZjlPZldkSWc2elFRc0FyN2tyZ0lRU3gzVmluTEZZQ2RydlZjbzlmRzNjdUhNRTZzTVhpZ0d0WkFWQWZENlFyejBzNjdTUGFLakdyOVF6WFRhclpYWUJPOEp0UnNDMmQyZmcyYTE4UTFidGVVZ2RDV2RKNFZDQWJYOFkyeGttcnFaTjJQWTBUMlMveUJtN0J1RjdEeDU2TjRza1E4NmlWTVN1MktqRm4vZG9MTEp4TmlObnA2TXBuNVNNYzBDUWJKaHFzTGJ2a043cWFLVDFhODBGOVpuWVBKTTVXalZkbWlIaG5aOXZNZVBud2xNYmlNYlpjbjJQeXdRZTc0a3ZOblE1MnNuK081M1FjVnRZQXNjRWFwNHNjajJ6dzZ4emN6aUYweGpPYXcvUktkQVA5SjZqeXBOWTUyVTMxUWpsUWNTeFRyRWt5M3B1NzIrRjZQUHNXakQ4VHJsN0xTWnJ0eE4ySHJqdGRhZmpEOHcvcnoyanRWSGR5SEoyaGw5dXpuY0tSVUxmVDVrOWhuangyZnV4YlBpWmhnNmM2d1ZkLy9uWGVpcWJIY1ZoNGVkbi93WDZvYklIKytiTFk1UHhkNHZwSFhoMWhpZ2FIclZjMDBMQ25pOVhKbUVMTS90dWJMTGJPM1Izakk4aW5aNitrbk95N3V4a3BGaDRHMkFKQmlvNGQrcEdxODZPTDltUlBkWTJDWmNQVUFwc3hySWo3TkRLWUVrR1BoZGJiVkhyTklyOXZwRnJwdllhY3NDbFlBWlJaQnplWllrUUpwZGZ4dGp3NmdnWHBEU2JjSXhBR2tHV3lRTWNFMGJXR1VkTGlldDJMeUsvcVpyRFIvaXZIdDlqZDRXRGVWdkNzaHl5ZGhlbkZqcVdZdHNEOENDMkdhWTc3YWVQMGJHTUZpZmFBWXh3d0huMjlTVEZ5akkyUXpTdlJhWld0Rm5aQ1dNNENWVWJIeHpYTi9NTkkzMnpOWHhzMVQ0ekcvakJidW5tbGM0d1A3dVRMYUZ3N2hsTDU1N2ozblNNZkF0RFllVXNpejgveTU5NTlPZU1UMFRScTJsQVRFbTRGbzZuSTF5aE8yL3FQVW1KOVN3c216MkdUa2VDN1V3c05zNGpXcnlhTFVhU3o4Q0Y3REdjSnJYTGQ3R3BBZEVjZkJpY0JTYkFlN0NyOTJtQmdKRGd6c3prRE16WXNsckRNa3pZQ2lKdWxHd1lZYWpXS0Y3UjhaTnZTaE5ZWkRML054Y3lzcW42S0EwbHBGdWRuZlo4bmdHZ2IzUk9TdnVnYXhqak1IckFGa0pGNFd1MzAvdk1pZ0tnSDZqcVowc00ybXdyOEdPc3pDNzFZVkwyc2ZZcjVJN1cyNVhpNEZvTWZKLzlzby9Ib1c3UStmS2NXQUsySG5nRkZIbzZjbXJMUzNSaURBYnZVRFU4OEl2QnNzRFRFR2VWUXUvMlh2OSsxNmM1akxLT3YvYzhmWWJtWS95WGovNzZzdjc2OEh1dDk5ZFcvMTkrMm9vMm0yWWNzMkUyMFhtOHVNOTlPOVJnUkl4TGV4elhZbkVGRmc4bnNqNGhweVhiKzFFTllBc1pmeUJCZk1kVXV2bGpPa3V0bWpVQnlpS214Y0ZmcjlXYVZlTDMzZFZxSmRDUVBQcUhqZUtmUk1GcGRCSENHN2RhemFoc01xQUVORWgvbWltNjRjaHBFZ29keHVVMWg4bzR0Z3RiYXhjTUxtVmJ4QnJBUnN2ZWRXY1VtVmQwMUlkd3pFbHNnRmZuV1h3dmJKZzFTaFp4T25vRFZjZHZPNW5GMnVRSFk1ZjRGNVE0ZEllMTJnem5GSVc3Q2cyUkhUNnpiS2kzY3ZlN09tNmt4dGpkVkV3Rk5sYWh0b1J4Vmt5aXFmZmRINU5od0JVd3kwUUhUdkI0MkMyQnA4cjJaMktQQnR1R0dSeU90SUx5eDlNeVBIL1ZNL3V6RUZLSkY5Q2VOdlAzaHkvdE1NZ3NPOHNhdXBQYS9vemsrWDNpei9lZnZ5N1gvMzQ1bkVMOTE3djU3Yi91ZGYxdTl1OFgrM096WVp2Nys0QTV3Vm80R0lDNWZ0WUpldXUwQUpuUVFjRGJudGVmQldubHY3amQvKzNMT1hYcE1tZ0pLbUdsTFRIRkJtbGZJVWFmVW9WWGhoWENYOTd6OWRhSHhjdERhaGxQL05GUkRUZ3QwL1NuZytZM1hYU1YrMDlsSms5d2lza1EwMU95akhNM0R2NENjRWM2VVQ0SDU1bjNodUZhSHhGUTJwRk8yV2h6dUZKQ21VQjNUbHZxanJMVTRSekFQN3M1cVpNTWdQMCsvVFBiWnJldmRSdzM4RHBldTZYdHVCSHMyRDZyMCtkWmZOdEsvenpzNzFGdDFYUFNiOVJsT2k4UWQvUmFaZmZZZkYydVV1dVlaM3pVdkUrelROb0NNajAyUy9Ic3JrNTd5QU5vQlB5NW5hV0tBWWRBUk4xVy9jZmNFNUQvZno0SnBOc2hLZEVaK2RCdWEzdUxJZG9jMFhWbllCUTBKRm4zWkozS1owOTV1OEJMdnF3ZUlyNGlIaTlvbThuRWJ5WlRKM3pNTmlWOFcwTmc3RVpYZEVhTXpaejN3Tm9Laks1b2JNRkptTmIrUCtBU3A1YzBwMDNNRklVV2svZm9qNjIxMVhHNElRR1FNVEh4VkduZzI0ZTlmV1ZjajhQRUJ0cGxGQmlvYU9VOGZqOWhrbk1GYTRyTnkraHloZDEyY1p6U0ZCa2tFQjdvdEk2WXVnMjBsNjFWM1NZQ1BuMU0xWTBuZXV4bTQ0a2l2aWZ3b25EMTNjTnJ0UGdkQ2JyanF0NE9jVmI2TUV0ZnZZenpucTZ6eHlwSFVLajFuZWNnQ2V4S2tIL2IwZFFCR2RaSlllMTRUSStYZURCM0Q4NFhSODRTTFZURWRBQU95RWpseDRJRGNhM3NjOXpGc24rVEpjTTNkU0hDVmdhMHo4dVNRRzdzU0lSL3pDZkhIVG1rQ2NDNUNqemV3WWZnRjRVa0d2QTNiZUhJamZBNndoaDhVUjF1QnIyMFFMSTFnS1V6WCsxcnR1M00rbDdBbzUxcnhyMlg0UkNibzFhUmtiWHhxNlJ3dHgzZmhDMVpqcmJzTnQwNm1yVFpKaDB1eHgrRWhIOEZJSUlDYjhlNkdNazRKWW94T3hrSE1IVWI0clJyYWN2R3JCaDZQV2pEZ24wVERFajhoWVlYNmJNSldyTVlDM0wxOEdKcERJY0JZYmQvTTZET2ZJL2JRVnBPWWdOUVNIWVY3d2VaMzIxZGRhK1RSbmVrS3B3ak8vZDFPRVlrdm80RGRoaitHY0UwbnJ1eXVHYzJGb0RTc3JFNzlacWxXT1djd3ZEdW5PWTRNeXV6Zy9HQmF3cmk0OXptTTRoa2xGL2hub2JVbUlVc0h3UGd6Q3pUU2hpQ0JkRy8wRWhRSE5UVnVUWkNuTGFQVmV2NnVYUTdadjZNZVYrMnpmSVNvaGRyWVZ0M0lJS2xhckJLUU9qRjdqZHNlL0pKSC9reDkrbmpjZHpjdG9LRjFUZVNid0dVbHNpQUZBcjhtQ09icG9ZN3RBY29FQzZQNG5BNmh1VU1wMVJTWkF1MS9aVk12R2N5N2VucmQ5YVZPZW5sK1EvUVFoN3RwSHM2M2hZNVlkZnMzT2UvWmJNaVVtU2dXQzREL012Um1qaUhYNkQzMzRrcjZWSk1YclpTTEZnSzFpc2lzN2tEajQwN09rd2hPQml1UUh2Q3llTTVvVUxzYW5IYVlndWRGdkJ0M1FKN0trVnZUdGlTK0ZsMnM2NWRtMDAxd1JqUDVIbWR2TXVsM3BNYmcwQTUzVzdBT0RxSVk5b0xFZ3pXTEh2Y3NqSzZNekFBOGJvOHJXR2lYc1ZoUGdrRWJsMHdHSUdmZXUzOUErdEg1MjFpRHI1cDgyTXBnaEVicE8xU2JiYVBhZ0l1UHBIbk5LWGNuUC8rQXZkWlVaT1EyUTU5RkhhaDNFdTM3YnlRVkxjUTBLNEpHTnhmWTZzUXlQYzR4WDhiWFNVN05nQjVCOGRRMkJ6Q2wxOVgzY3dvUHRFQ0IxOCtRVTIzU1piM1FsOHcrc1d1SjI5bkhhd1RtQ3Mrb1RrWTM5Nlphbitla1JoZHExMzlheGd5ZlMzeVAyVk1kN292MFZabDI1MjZaZ3NORXE4WXY2ZmRhVGszeHZPRndxL0JIcVlFN0YvUm1oU25POTlHZmZjSm4xeG85d2VOK0R5eUJXenMzTXR6cHNpWG5taVJxWjBrMlJkeXRONi9KSU50NFBubjlLcnJIK09yVEtEQ0dUTmNaN0c1RGljMC9HWHp0T2MxRkN2MStNNjJKZ1pQd1FaOFR0UnhJalFPTWJXckJBczZZTVBmVi9LMFlRN1NaOVExc3owUTRyVTEzcGJPSWsvd1hTRVFLMnByRXR1S3ltcEUwYXpMbWNlbWltNk1xSFBRVVN4Vzg4WHJZYXUxTmRHT3U1NHpNb0IyczhBc1ZySGJHR3hnLy9oSTR3TTJYL3pFYmdXS2R1YnpXbklML3d3NHJYTEdMNy9Bc0FhWUZacGhvOGF0TU5ZRFpYRzJSbEVRUGxCTHV4eTFaVzh5WkhwYlhWeFEvU0JjeXBhL3MvK3NpaTBzRStWenFJbmlzazlTeldCeGMyZzRPajQzMEs4dHkrbnRHSnlXN3o3T3VMVHpGbEtDSlBkamRyR1k4ajBFRmtwNFc4Z1c3UzB2ZGpWYTd2YU9LNVpzbDUvbGx1WmJMVnBIc09wdnN1RnRkR0hnWXZDZEd2Y1puWmRUbkl5UTYzSTlUd0pOWUFpbi9aTzZPeGxkMFVOVU1SMGE0dWtWUnRxR0V3YWhxb2diemdRRDVLRHc0V3d4NEpLalZEd201REswLzFpdENUTTFodWY4VjR3R3JBVHFZRDdFNmdOKzJxa2dIbjZ3OW01TlAyREdIblZQSXpqTE9WOUdjd1ZheGM0c1h1ak1WaXlDWVhTV2wxL09tNjFPbHd6bU1UM0lZMkp0YnE0TWppcFlhUnM3Vzd5U0pjd1dlM2dTVDdkZHhxNlp6d0pCNTc4NzJEZWx6MktVN3FCb1c1Ujl3QVlROFpBSmpicnp2TDdMN3A3SE1qOXIvZTFZemM1dEJrTHdBamR3eEc1ZTRLVGRjZmZuREJSNzI3TnMxK2trZ0tsbEZ0U29INUxvZEhlWVBVNDBPZXI2WG83ZDRvR3FJNVFNNnpsVnhsWk9BRldRaGo5dnFnNmpBc0tNQVo1QkNLOGNxMVdqeDhyWkxmSXRwL0tpQU9PTWREemFuZnA2MGpUZ21BcVFvempVeXFiRktEY280NFRqcjdnZE5aUkFqc2FoOENHYU5SdjM3UFczMHZhY0t1QUV5Uks1UGU4ZUhndlBEWE8vNGJSNG5ua1dGMGlNYStOYnk0QjB6MTJ0ck5tMm56c2tKWmorQjNJNXU5NmhQOWlNZGlZdUE4R3JVME9BQVRycVdmQnI0Y25HK2ZjNlJYK2FmRmJsekFGd2hEbDY1VVNvOGZvc3phbGMxZW5IajUyY0Uvdm5SdkNDa0pyUFNhTGRDYjIydy9NR3dlZ2g3QmRXL3N5RkZZcVpKV3ZsMXJ3NnRON0RFU0FhcUtiOXBJK1R0dU80VGtsalBpTnRlWFVIRVJTN2tzNEc4TXI5eklYVVRPOVR5K0dFdDJLMytQSzRCWUJJZXZGdjBJUExlcGQ1NnRpc3BrQUZzeGwyRzNpVDRjVjB5cDFCeUtjMXJoZWJHQjlyMkVHK2lBWXdydDVuY1AzRmF0ZzZjc1RaZXEwajBGYk1taWRxdi9USmc1Zi9qWjArRVlwZEJ5YkMzcHUvNmNBRk5NaE9ybkFvTzk4WTlVRnA1Nit0KyszaHN4MzgzeTU1M01XLy9CVDdmdjFUcUo3M0RoV2M4WnRmWXJGci8vZEw1cDlYL3R2UDhQUU94NTdyT20yVCswYWRzUnRTYXRERnVqMW1BU2NkMituelg4dEoxckZnWHUvOHBqUE80SFpHbmJPajJqaHZlUDF6WFg3dktFUDlQZS8vN1BtdWYzM0FmenhmQkF5MVZSeW0rOEFUKzJ0YWJqdkl5bXJoUTF5emhXVDNoSGdIZSs4dkovYWw5MCtiMTlFV0RHaG9XSC9rZStVemdqd0Fkb0tSR25iOUhJanpyQytmU2pxTGFDTlE5SmtYWnFaRkIvc3VvOVZuTXZqNDRFZXh2dG5vZkxVa3NaME9pZ2VOeEZuRFJEeTJCMzY2ZktMNkZ1Ti9PTWh6Um9VejFWeWFOTmc3UU8vZVRwNWo5ZTFYckxhaW53cHBpRVVEbmo4TldqcjBmYzE0Q2N2M1hhdlZYNXYwOTF0SUNhN3pVREl3ZHd0T1FBZ1RrUWQvWVdxRFhadllrOWNSQm1VN1IvZ0k2YzBhbVd0NURFenY0VFN6d0NxaXN0WWJCdE4vTm9FTmNVWFZ2d1duckdFZnYzNDdGTlFSY0o0MDhhNXdkWTg2K3V4ZjhBWE9tRnZMVm5mdytKM3Q2ejZPdkhNMmNYVjJKWllFWUx1YUNuZU9IOWluRmlWZmxxUGFUSHhPZkxOMUlOakNid0lFUGJmMGZ2eDY1K0IybUNzc2tvWFJ4ZXBRNCsxR3c5S1JLL3Y3djl1aEl5ZmJ5czlaQldqZm9xTVpyQzJ3V1QyZlV5YUgxWFZPLy84emF1V2NKWlp4cGUwdDhiSVl4a2s1M1FtNU5pVG96VjRqTTdnQThlOVg4Ni95b1FBcU1xK0Rld0wwSlBzRXVBTmMrbkd3OThVS2VKbHQ3UUUzUDRPeHN6ZCtrNGVzeE40aG1DRjNZenJkb3NqOGNadnhXRnp1WEliang1RDBxenZHY3o4bmlLSHZyVGJtWkxQaWJNd1pNbXF6VGdkYW9uUUJSdW5vM2Y0NlhkSnVtbkRuQ2NWdFRxdCt6VkRKSGVNYWhqeUJkZmFtT0VqUUdDOEtnVm0rMjdiY2FscUNPVTVlRURmYThSUEd3aGNvK0tyMXpJYVlRcVRtQ0lPMnh1TkpLZklLbTVReEl1MWRIdGpscVZGRzBJeS9BL0tjTXhWQ2RneUVzUkdXWVkxaUF5dEs0OFFBNTQyYkM3WUxZTnRKNkltWXpkUFdLamltQzEwZGlyZXNLM0RlM2tuSXdXblptTmRZemF0QnhzRkJHQjE5WlFlM2pYek9Gc1dGaFhQZ21BSFdSekRrbE9wcS80NVRCVjdJU2djZTR6bFhPeHJ5Wi9TdXAydkFkeE9BRU40SWJ1RkMvT2NjRFFkY1BMMm1hdU5wSHBaUVlRWHFQblgrc05nejZXZTlEalRCdkw0T0VKbFEvV1dCOTdaSFBEbnUxUW1tQTlLUDZRQUNkdFlEYWNKcHJRZXBnRUpnOUFLSUpUc1haTThITjdsZ0pVOWU2RFk0eTVZK2JMVEhVRFJQV3pLR0hIakd4M0pwUWZaMndCaWtKanRFYm4zT3piYkg3QTdiNEpQUkZkVFc3cmxselpxSnc1RnN0RHZiOThEWlBCT3c1V2p5MzlOVjJEVTczTGVueGxodzRpR3NPem56RnZBeUVCM256TmdEYzN1Y1hDLy9NZ3Zid3FZeS92VFRycitaczV6Ly9xMS8vYzRabW1uYTBJSFl3K0Y0UzlTUXpubHNGakpWcURrZ3k1NDlKMzRqMS9FYzFWTnRRUnVucmdZaFRzbngwSmJjSUFqYjNyTFZGcDdmOGV6RGFjVDFnajBEOG5KMElNWXBiYkpMNVQwWmlQa2pkdUNrLys3ckczUUtDYXM5Tm9jcHNKbzVRSjZxYzJaYXNNRTZ6M040MFd0SU5XRzduajRkNjNwbVROczBkUXBJbXhYL0FHOGUrWWtYRnN5dzhUWTFmbHNOOWo5OHBtS2ZmQndEbXJXT3EwcTFTcThmRUplZUZ4S0FaUTZ2aFl5ZkI5dkJBWmI3MW9LVkFsOHpjT3RKVFhaNVBFNFp4b1JYNnlLQTBtMUQwVzB5ZDZiU2lTTFhYMlRZczI0TVVuaTRubU1oNDVsWWdwTjBydkNKdStWd3JZVjdtVmJvTzlvUjhaaXY0WVBxcUJjd045dDRuai8vNmEvL0RRYTNtZXNjOTJVbTZNaEx2STY0SEdGaDFmNHBTUEhmdmk1OTNicXFmQkQvYTBHRFZZdFdtc0FFZXJ5SzNTZ0E4d3E3M3NYSTJGcWVCd0J5SEE3L2RDWXpiTTA1ZG5Za3hOcUNuaU9ZK1JlZFA1S2hDSVc0TmRyc1dMSVlmOGsxazNOajJWL0RpY01tdkEvVzBJMktuS21yd1ZybjRyRmNGbEk0SWVXazFhLy9OcS91bVhiMllldTRVWWN6a0FvRzRsUVV5UFAwRUtVQldoU000OFB5SmZDK25VeGdCYmZSUUtlZ3JlbjhTNk9aZzgxM3FMZVZMdnM5YzZzdDA5SmFhRS9EbTlGOVF3WVhNS01EVENRUWNMSnVJSEtoaFBtdVRsVi9uQ051QjJIOW5ML0V6MGhMMGpuQXprSG9BLzU5ZzRiZ0ltd2hPM1huQXVwbzVuMC9SMTZCTlp3VU5rMEdkU25lNjd3TFJKQTEzQVpyc0VpR3J6M2lZSUFzYzRjYzgzT21ML3M5U21HM3BtY3VuQnBtMkxWSUJhdmxxWmlJUEk2U0hmSGNTS2crVHN5bXJWR0h1WWpud29BQmNZemRMTlNnVFV3OHJnL28rUzRMOFo3SHR1bmkzTnhzTyszbm9CZ2I3eXdaYm5mQlRCZWpwL0IrVEthbkFWVHJoTE4xRS9HYzNnT2d2SGZGY0g5R0hFQmlXRldMV0lZRDQ3ZERNTG4xNjdsTnNFN2VCRjJ6dkIrSGV0Y0tCbkcwZVA4OHhJN25OR2NUbjJkWVovZm55Q3VQd29IUy9zN0lhcmdvdytYaEhKeUVxN0gvKzNNTXR1ZXdObWUwNEM3UllLUm9mUlVid1NXZFUrUVl6SEp5TGE5aHlBekJCZTE0RWtPdWwzUEhXN1dYd25sdHJPOEh0a2FlbllrbGxQdHpHaU9nRVE3eDA3eFBMTzNRaG5lZHpqbFk1MFQ3YjRQbU94NmxnZi85YjM3VW9IWTk4WVRxSkpYaWFXZkJUbmRXMU1DNFUrNnNuSmJtZTlBZGd2NzhBTldOdEpuZ0c4bE1DVnpkbXdIdEhBRXp6bEdScTZEWW9ER25ERGY3MHhNd3FZS1FuRFg3SENMdHlOSzdmZFhUT3owNTljeDNRZnJyY0R5RGRyTEFMSUQ3RGxENUtydW14SnlJaVpUSHMxODhaUS9rN2FHNHcrSCt3U0ZMOFQ3Qmxwb2R2Z2VLVjU1UGR2QnJUcXF6VzB4bzRQUzY0Y1JGRDBldFFLSzZQQ1BTOFN4ZHN1eXI4azlBaFZVL3ozMGFBVHlmMDdwNGJFbnY3VHFKRjlDbGcyYVZpZWloNVpDOVIrb3ZCN0RCQW9kUTdIQW8vVlFhMjBKbDFROG0wSEdKU04xYkFLTnJuek1ub0dCQi9adU8vQm92YkJzRGFrMmRaNTNZbG92aVBBR2kxUDNCZGViVm9qT2V3NGJKYTVmcC9qcks0MFFLWE16ekxEM2RFZ2tKMnUzYVQvWXpkclBsWUdnd0ZKL0pmNTEzV3IrVCsyK1hkWUgzT2RySEJLNVJUTXUxcW9uaVlEdExZVjJBTnBESUkySi9CQXhrekZZYmN3ZGwyaUNZRWNoVHNXODk4ZkFvd0hsS1psNm5IamhRRTJWemlwNTl5UkNkZld1dHYyakY3ajZObk5PQmRaQ3Zqb1hzdjRraHk5RVA2VitWd29nL01CYnoyNm9IbW9KYVdjRURuVzE1bFgwWDV6eDdDb01UYjA2eDJZdXVCeVVWTTJ3MHhWTnVZckFGclZycDQ2a3RrQWZyR2YvMmlrZUhqZ1pkOXpsQ3B0V0Q2SXNUS29LWml2dmJ4VGtZY1hoZ0FZVFVIdXZYOGRlNWVBNFpodFVVK3R4V2lHREIzOHVXQkNkdzJXdDc2di96TDBiQzR0WlFmMlhwMzUvM3p2aVArRHBrT0dJYllybmxaZjEwSHEvTGcyWFFWQ2ZRVEg0WXhGcXNUNDIvbmhZYzFmcmZYZnJrcllLRDA2OGwrTFp0QVJpTU9GcmRoam1ZeDQ5NTJOQTU2UTYvRmZSWDVvdXR6RVB6RFZ4Q0FZUHRPaWJBTDMyQ2dTZURqWTZiRHg0UGdHTENjczdad0k3QWZEenBHTFY1MDFoMnVLZmJ3ZmJ2OGEzZ1c2aFdIRmM5N1dhbWRPWHlSVnhjelMzb2Y3Y1ZFY09od0NhMUM0N0trNUE5Wm1NYmdCcWVWWHNMdWt5d09ISVhMQ243aTZiY1BxY3RHdE1zUVVwMFRpbHFKNmQ1bzMybUl4OG5WNWFENWhIK2FJTnptUFA2cFNvRmFzSDB0Tk9mMDJEOWxxTjNuZEViNHpyVG1jMnN0VE9ZelVEZjQ0bW96aDdwSnkzem9tdmpOdDFqcVdKeGlxT2xNL3lZODFNcUsvVUFwUjJtV1crUHV3UkhGRHRjQUJrdGdmZGU1eUszUC9OcWVVaVk4TW5Rek5TZEMyU2UrSDR3QUx1ZVNQR011OGJrTWI3WkRCZU91bnFlRk16UU10MTRDbUcrQ3dkV0grY0N2bVUxc0E5NDJuNWJ6MzUxdk1BNlkxdzgwZXh4TGsvK2RWTThmODdWd3NCdFQ2NEJkRjFXVE51UTcvR0FyTE9UL2ZjNUhPWjh0QjYzUEpvbm9Kd0lUc0M3cjRvcmk1NTYrcDFScXg3TW1PRDlWckZBUUowWGpiZXlpTC84VFMwOS8vdUZCTWZtYVFwT2RUUUVacU9EU2Z1VEVUeERVQzlNakdiWmVRZkl5RzBGblFPbUhIYTBUenF0NU44NVB0WmRGYWVzMjBING4vcC82VUtkby9DZHZQM2ZLODNmWnZBV1JITGFCVDNsN1UzNHhWb2RURkE4M3ZKek9Qbjc0ZyszWi9ud285cEtlSWhkM2s2VUN3NTl5MGlRMjQzOFZLTXIwMk5Wc0g4blR2U2UwN1doQ2oxWURjb25ybmhxVFpEa1UzblRuWjU0c3lMb3dMelBJUU9qMlc2SkVFOG5LTnA4YjNHeUliYnlPRGtaaGdEb1NKY05MdGFQV1RtMmh2UGhrc2ZrZ2FFZmg4TUhKNWEvbmdyNjJnemRuTzJwTDNMNnFSV1lucldCdkVIWDM5Zmp3OFR4ai9OOCtSbW5PK0NJZGFaVzdLN29zTTl1L1E0Tyt3WjJPM3I4T2NWeWVBQjJhRHBNNERvaEZBQzUrR1U2MmdGZzViQWdnOVBSVThLRHh4RTUvTXpEVDZ5dGhPeDc4dDN5YURsSWhBS1M4UDAvMG9LY04xTmlnR1pEMTJFNnJjYUoycStORGluODh0SDJiaWZVOFBXY0tTdXRjZVhKUXVkUTdzdGNkUXdaMW0rZWR6aXVZdDNDUWp2UkRldWJLNUl4enhPVHczMldPVEFsb3g4azBldUlLRE9vMXJNU2tXWGRUSUZJMktsUkRKbitDaXcxVE02ZTN0RkRmSzN4N1JhRWJ1TUwyR0hrZFR2MHNUblo2ODlrMDduUElYTWUwcERGYUd4ckd5ZlZoS2tmMjlsbUVtalBTMHltZjh6ai84NDdBdXI5WnJLOEMxT0JlUzJlK1B4cmdiUW1wSjRobmtYRzZRR04xVm5pRmlaaDRxMW1mbXgxeEtmYmpIUTZXS1pudnp6YndWTzRqVGVlZkIydjNlOXdzdWFPbnJSb3pCU1Z3NXo1VEE3QWh2cjFnOWJ2RHlYRHRYbTJXSmFZcHRrU0Fvem1PdEhmRTZsTjRRR2x6cEZHTnBRQTh5d0xIUjYxM2gyaTNKNXFzNEg5V002cmxXQTg1dDNSeXhoMlFHTU1uajJtRHgzUVVCMmNXeXllbHVadExIZ3pjZUV1TzVEV0pDT3N0bDFud2l3MjIvTy95K2U1Z3ZhTlRKZGx0R001a2NQbjlJMDZDT0oyQm9PRFloVE5aRnZyT1FzbExZOXlhaWY1eDI0YVhiSHhxV25lVHZyT1pKd3pSdFhZN1duQVZreGdFdUgxL3RqZGpWTGpBNnRERkpNQmJxOS9oMk1oRHBIU1hFSGVsdG45bU01Uld4N0F4TDdaRzh1NzJyaWhxelljdWJIMmw5VWVyem56Y3pTOURHZW5NN2FwV2ZOd0NsZFc1elhmOTNSOFk1RndtZG5HRzZPQW52c1R6N0hmRitUTmdqVkxTNXI4SXVPNTd6dzhkQ0pqNlJaYllDVkZFaDA2K1EwM2pYM1RJWGd2K1pCZHA5YXd2eDdlaWcyd0VNYUtKcnc2VDJYMGRGcDMrbVhyWVQ4dUNNSEN1WmZsb1IzWXg5SU5aVDN1Z01uVHkwMVlaOTc5NE1udTVaRVlDSUJ6Um9Ta0ZtK0pvTGZGM0dkbTFobG83UkN3dXM4QjMxYTdsUFpkQVMvWjdNMEtUdHdkOXpuc09WblR0RHpCUWpWOXpDdWJFblM0UFBhZWIyZUh3bGI3MTdPbkZmZStMOXVqSFQrRjNtVlAzK3JPQnZEY1AvdFh3bk1PVlBMUUdBOXhxaWJnMkYvSlp2ZkllZyt0d2F6cGY2NXpMQ3JJNWZyL0FwWVRxQThhSmVyWUFBQUJnMmxEUTFCSlEwTWdjSEp2Wm1sc1pRQUFlSng5a1QxSXcwQWN4VjlUcGFJVkJUdUlPR1NvVGhaRVJSeTFDa1dvRUdxRlZoMU1MdjJDSmcxSmlvdWo0RnB3OEdPeDZ1RGlyS3VEcXlBSWZvQTRPVG9wdWtpSi8wc0tMV0k4T083SHUzdVB1M2VBVUM4enplb1lCelRkTmxPSnVKakpyb3FoVjRRZ29CODlDTWpNTXVZa0tRbmY4WFdQQUYvdllqekwvOXlmbzFmTldRd0lpTVN6ekRCdDRnM2k2VTNiNEx4UEhHRkZXU1UrSng0ejZZTEVqMXhYUEg3alhIQlo0SmtSTTUyYUo0NFFpNFUyVnRxWUZVMk5lSW80cW1vNjVRc1pqMVhPVzV5MWNwVTE3OGxmR003cEs4dGNwem1NQkJheEJBa2lGRlJSUWhrMllyVHFwRmhJMFg3Y3h6L2sraVZ5S2VRcWdaRmpBUlZva0YwLytCLzg3dGJLVDA1NFNlRTQwUG5pT0I4alFHZ1hhTlFjNS92WWNSb25RUEFadU5KYi9rb2RtUGtrdmRiU29rZEEzelp3Y2QzU2xEM2djZ2NZZkRKa1UzYWxJRTBobndmZXoraWJzc0RBTGRDOTV2WFczTWZwQTVDbXJwSTN3TUVoTUZxZzdIV2ZkM2UxOS9idm1XWi9QOGE3Y21MdzBYeHZBQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINUFjQ0VDUVNSMS9VTVFBQUlBQkpSRUZVZU5yc1hXZDRGRlhidnMvTTFuVFNFd0pKcUVLb1NxK0NTRkVzS0tKK29vQ2dpSXJTdXdndnZTZ2RRU2tXUkgxRlJJb0ZDL0tDZ0NDQ1FpQzBrSkMydThsdXl2YWRjcjRmT3pOc0dvWVNpdXh6WFhOdHNqdTdNM1Btbkh1ZWVqK0VVb3E3VmY3ODgwK01HREVDZi8vOU44TER3OUd6WjAvRXhzYmlxNisrd3Rtelp3RUFHemR1eE96WnM1R2JtNHRISDMwVUxNc2lKQ1FFYTlhc0FRRHMzYnNYSTBlT3hPblRwNUdZbUloR2pScmh0OTkrdzlpeFkyR3oyYkI1ODJZVUZoYmkwVWNmaGR2dGhzUGh3TkdqUjJFeW1RQUFvYUdoU0U1T2hpaUs0SGtlZ2lBb3I0SWdRQlJGMzcrSktJcnczU2lsOGl1aGxFTGVBSkN5cndCQUtTWFM1U3V2WmQ0ajU4NmRpNG1JaUlqVGFyVXhMTXZHTUF3VHhUQk1CQ0VrSEVBTkFDR0VrQkFBZ1FBQ0FPZ0JhS1NOQmNCSXZ5Y0NFQUI0cE0wSndBSEFUaWt0QVZCQ0tTMmlsRm9vcFdaQkVBbzRqak82WEM1VFhsNWVYdlBtelUzUzcxQ2ZyZHovaEpDeW44bnZBUUFsaEpSNzlka293ekFnaElCaG1MSWJaVmtXTE11Q1lSaklmNnRVS3VWVjN0UnFOZFJxTlRRYURUUWFEYlJhTGJSYUxmUjZQZlI2UFFJREF4RVVGSVRnNEdDRWhZV2hSbzBhaUl5TVJIUjBOT0xqNDNINDhHSFVyWDhQL0hKamhOek53SFk5NHZGNGtKdWJDNFBCZ0lLQ0FsZ3NGaFFWRmFHa3BBUTJtdzEydXgwT2h3TXVsd3N1bHd0dXR4c2Vqd2NlandjY3g0SGpPUEE4WDJxVEFjeDNFMFdSeUFCWEJzeEtBWm44ZnhrQUt3Vll2djl2MjdhdGdWNnZyOGV5YkYyR1llb0FTQ0tFSkFKSUJLQzdUWWJaQmVBU3BUU1RVcG9oaXVKRmp1UFNyVmJyaFFFREJweVh3YzBIMkNvRHZISUFTQWloMG5oUkVISjVZQWdwQlh5K0lPY0xlbVhCemhmMGZNRk9wOWREcDlVaU5EUVVNVEV4Q3NDRmhJUWdMQ3dNNGVIaGlJeU1SRVpHQnRxMjd3UzFXdTFmWEg1Z3UzWVpPWElrVnE1Y2VWdWRVM1IwdEZmTnFRRE1aSzFNQmpiNTNzbWFtaTk0K2Y2L2IvL0I2SmpZMktacXRib3B3ekFwaEpBVUFJMEFhTy93VytnR2NGb1V4Vk9DSUp4eXVaeXA2UmZTVXgvcDI2ZEEwaFI5UVUwc0E0Q2dsQ3IvWDBHam80Umh3QkFHREVQQU1ES1lNWlJoMkFwQmpWV3hVS25VVUt0VVVLblYwS2pWRWhnU3FEVWExRXBJUUVCQUFBSURBeEVjSEl5UWtCRFVxRkVET1RrNWFOcXNKUVJCUUV4TWpCK1ovTUIyODhSb05DSTNOeGNta3drRkJRVW9MQ3hFY1hFeHJGWXJiRFliSEE0SG5FNm5vcVdWMWREK1FVc2pzdGxaQnRCOE5iTlMybGhaVUh1NDd5UHM0bmVXdE5icGRLMFlocm1QRUhJdmdBWjMyVzA2SjRyaW43azVXY2MwR3ZXZlk4ZU0rWFB2M3IyaUQ5aUpsUUNlWk1ZU1NnZ29RRUJJWlNESGdHRVpzQXdEaG1GcEtZQlRzVkN4bDdVMmxXeWlxdFVRUlJIQndVR0lpSWlBWHE5SFFFQ0FZcDRhalViVWIzQVBha2dhWEd4TUxDS2pvdnlMemc5czFTZkZ4Y1hJeWNtQndXQkFmbjUraFdhbjArbUUwK21FMisxV3pFNk80K0R4ZU1EemZDbFE4L0dqRVY4L1dnV2FHYW5BWDZab1ptUEhqbVVmZSt6eFR1R1JVZTJEZ29JN0VFTGFBd2p5M3pIQWJyZkJXbEtNVnZmZGE2T1VIdUo1L3BEVmFqMzg2cXV2SHZyaWl5OTRRa2hab0JNck1tM0xhSEcwbEYrT1VjQU5MTXVBWWIwZ3AySlpzTDdnSmdFY3d6QmdpRmN6TCt0L001dk5xRlU3Q2FHaG9WNFROU0lDMGRIUmlJdUxRM0J3aVArRytvSHR4Z25IY2NqS3lpcWxwUlVWRlNsYVdsWDhhR1cxTkZrNzh3ME95SnFaYkdiNmFHUyt2akpDS1dVc0ZrdmpvS0NnKzFtVzdRS1Fya2VPSEFtTlQ2anR2MWtWU0c3T0piUnAzYnJjYytyUTc0ZjNSVVhIN2k4b3lOL2Z2bTNyTkFuVUt0THF4RXBBN3JJbXh6Q1VJVDRhSE11Q2xiVzRjdHFiQ3FJZ0lqSXlRZ2t3NkhRNjZIUTZGQlVWSVM2dUpnS0RBaEVjSElMUTBGQkZlNHVKaVVWd1VCQ3lzekpodDlzcXZkN0F3Q0FrSmRkRlNHam9MUnZ6a3VKaVpGeThjTXZQVTNXM1RYWktLUXdHQTB3bUUzaEJnTTFxclhBL2k4VUNrOGxVU2p1ejIrMktkdVlMWlA4QVloVkdOV1dIdjJUL2dQajR4OHFDbWNQaDZLYlJhSG93RE5NRFFGUGY4M1E2SFg0RXEwU2NqZ3JISnRUdGN2YlZhclY5YTlaTXdLWHN2Sk04ei85aXM5bCtiWnJTYUQ4aEVIeUJqbEphVHFPVC9ITUFJWlNJSWtSQ3dJZ01CTUpRaGhIQXNneGhHQllzejFLZTVhRlNTUm9jcDRJZzhMRFp0TkJvTklwMjczSzVVRkpTQXExT0Q2ZkxxL2s3SE42NVpyTmFVVkpTZ2lKTEFRSURBeEVXRm5aRkxUWGo0Z1UwYTNIdkxSdnppK25uNFhEWS8xR2JydTd6Vk4xdG9IYnMyREdBTUFnTUNrWmdZQkJpWWt2djQzQTRrSk9URGJlSEI4ZUw0QVFSZ2tnaFVpaXZGS1QwUmxGbW82QVVFQ21GS0ZJaUtwRkw3MWJXeEtTVUVpcVptY1Ficm1PY1RtY2ZqVWJUaHhEU0IwRE5hNzNtSDNmL2dJMGIxc05rTWlJK1BoNGZiL29NNTg2ZHhkQWhnNVI5SmsyWmhvY2Vldmh1eGI4bUtwV3FTVmhZMkJ0Wk9YazVnaUQ4WUxmYmYwcHAxT0FueVZ3VktnVTVTaWtGb2Q0QUt3VWhJa1NSUUJCOEFJNWx3Zk1zV0JWUFZid0tvaWpBNFhDQTR6aW8xV3JGWFdHMzI2RXBMbGFBVG5adE9CeDIyT3cyRkppTUNBME5oYzFtUTJSa0pIUTZYYVdnY1N2bG4wRHRacDNuWFFWc0JvTUJJQXlpWStJcU5sMXljNUdYbXd0VHZnbG1zeGxGaFlXS0g4M2hzTU1wbTUxdU56eHVOenljQjV4SDB0WjRIeDhhTDBBUWVNbmNGQ0dLc3NsSkNhVWlLQVVCS0xsc2Nuci8vKzIzQTkwVEUycy9HaDhmMy9kNndNejNlaGJNbjR1WnMrYWdkZXMyS0NrcEFRRFVxMWNmUC83OEt3RGdwYUdEcTIyOE42eGZoOGNlNzRlSWlJaHk1N1ZzeVRzNGNlSnZhRFFhOUhpd0YwYTgraHBZbGdVQVpHZG5ZOFd5SlRoeDhnUzBXaTE2OXV5Rmw0ZVBVRDZ2RHBHT1dmUEV5Uk12YXJYYUY2ZE1uWll6ZE5qTDM5bnQ5dSthTldtMFh3STRvWXpaV2xhTGs0SVBJa1NSZ1NnU3lnZ0NCSVlGS3pCRVlIbUlva2lkVG1jNVlITTRIRkNyTlY1WGhqUy8zRzQzbkU0WEhBNG5DaTBGRXRBNVlMZmJFUkVSZ2NqSVNMOWE3Z2Myd0dUS1IyQlFjTG4zYlRZYnNyT3p2RGxwK2Ztd0ZGcFFYQ1Q3MFM1SE85MHVGOXdlTnp4dWp4ZlVPQTQ4eDRGVEFJMEhMd2NFRkZBVEpUQ1RFMmk5SUNhYm1hZE9uMjBTRUJqWWoyR1l4KzEyVytQOC9IekV4OGZma09zOWszWWFrWkdSNk5peEV3QW9DNEVRQXExV3EveGRYZkxoeHZYbzNLVkxPV0NiOGZZME5HblNGUCtaUFJmRlJVVVlNL3BOMUV5b2lYNzlub1FvaXBnMFlSeTZkWDhBcytiTWc4bG94TGl4b3hBVkZZMytUdzJvbHZPczVKZzFvNktpaC9WL2FzQ3dyQnpENmM0ZDIrMzR6K3k1Mzc0dzhQOU9BUkFrN1UwZ3hLdVlYOWJrS0tXVVVFSUVTaWtob2loU1FrUUlBa05aMXV1T2NMbGNVS2xVVkE0cXFkVnF1Rnd1cU5SMnlhWGg5ZE82UFI3SlhIV2h1S2hRMGVaY0xoY2NEZ2NjRGdlaW9xS2cxK3V2NmJxLzJ2SWwzbHU5RWovOXNoY0E4TXJMdzJDeFdFcTVZeVpObm9JZUQvWUVBSncrZlFxN2R1NUE4K1l0OEdEUFh0VytYaGZNbjR0dmQrMVU1dWpySTk5RS82Y0dJRDA5SFV2ZVhZeVM0aUlFaDRSaTRxVEpxRlhMNjJjK2VPQTNyRm16K3U0Q05sN2dFUmdZVkVaN3lFRnVUaTZNUmlQTVptOEtoMWRMczE3MnA4blJUby9rVS9QSS9qUXZxQWs4RDU3M0RRZ0l2bWthcEhSQUFNeEhIMytpNjl5bDYxTXN5L1luaFBUeWRhcmFTb3F1K3pxUEh6K0dHZE9uS1pyQTQ0OTZ6Y3grVC9USG9NRkRxdlFiaHc0ZXdNb1Z5MkV3NUNFeE1RbGp4bzVIU3BNbXl1ZDdmOTJERFJ2V0lkOWtRa3hzTElZUEg0RjI3VHNBQUVhKy9pcXlMbVVDQUVhLytRWlVLaFlKQ2JXd2N2VWFpS0tJcmwyNzRlRytmYUhWYWhFZEU0TldyVnZqN0prenltS3FFUjZPNXdZT2hFYWpRVUt0V3VqWXFUUFMwazVYMjd5b3dqRWJFVUlheGNiR1RyaVVuYmZiNlhSc256SDlyUjJmZmJiWkNZQ1hORGNaN0JTUWszMXhoRkJRNmpWVEthWFU3WGFENTNraUJSVW96L053dTkxZ1dSVjROUStPdit5ejVhUmdsTFdrUkFsTWVUeWVVZ0FYR1JsWm9mWW1paUlZaGluM053RGs1ZVhoMjEwN1MrMi81djExeXQ5dWx3dERCcitBanAwNkF3QldyMXFKOVBRTGNOanRxRmV2L3RYWitrMmFLSW5zVnpySHN2OWJ6R2E4dCtZRE5FNUpLZldkV2Y5NUc2TkdqVUh6RmkyeGErY09MRisyRklzV3Z3dVh5NG1GQytaaDVlcTFZTzRtWVBNTkZEaWRUcHc1Y3dabno1N0Z4WXZweU03T1FsNWVIdkx6VFFyQUZSY1h3eXFab2phN0hRNjdBMDZIMHlkWHpRMjMyMDNjYmcveEJoRTg0SG1PU0RscFJCUkZSaFJGaGxMS1VrcloxTk5ubTJkY3lwN2RyZnNESjFRcTFRZStvT2FyUFY2dnRHalJFdHUyNzhLYm84YWdaczBFYk51K0M5dTI3Nm95cUYwNGZ4NXZUWnVDRWErOWpsM2Y3Y1pUQTU3R21ORnZ3R1EwQWdBeU16TXdlOVpNVEp3NEJUdS8vUUdQUFBJWXBrNmRESWZrckYreGNqVzJiZDhGQUZpeWJEbTJiZCtGbGF1OUpXZ013K0M1Z2M4akxLeUcxOWw4TVIwSGZ2c05iZHUyVTdUS0ZTdFhRNmZUS3hQOStMRmphTmFzZWJYTmk2czVKaUdrWjBCQTRNb0ZpOTdaWDc5Qmd5bHIzMS9YakZLcWhUZmhXUU5BRFZBVnBWUWwzM2Q1SGtoemduQWNSenlTTnVaeXVZakw1U0l5V0RtZFRqZ2RUampzRHRqc2R0aHNObGlsd0pYTlprTnhjVEVLQ3d0aE5wdGhNcG1RbDVlSHJLd3NYTHAwQ1c2M1d6blBJMGNPWStya2llQTREaGFMQlM4TkhWSktHMXUwY0Q1R3Z2Rm1wV1B5M1hmZm9sUG5Mb28yT095bGw3SDRuU1dvVTdmdVZZOXZTRWdJTkJwTmhaK3RYL2MrTm4rNkNRQnc0c1RmZVBPTjE4czljTXI2eVI5OTdIRTBiOUVTQUhEUFBZMWdsZ0F6THk4UFlXRTFVTE5temJzdkt1bzFTWTNJenNxV25pTDVLQ3kwNE1LRkM5ajl3L2ZvMXUwQnVGeE9PRjJ1eTZhbnBLVmxabVlnckVZTkVFSWc4RHpoZWErRzV2RzRJUWdDWVZVcThCeEhaSkhOemQ2OSsvUlorOEg2Wi9mOWIrOVRIMjdjQUk3alVMZGVQVXlhUEVWWlRMZVQ3Tnk1SFYzdjc2YVlzTDM3UElUdnZ0dUYzYnQvd01EblgwQkVSQ1EyYlB3WXRXcDcxZjlISG4wTVM1ZThnNnlzUzJqWXNHcjFqcWtuVDJMMHFKRnd1Vnk0djF0M2RPbDZmNFg3clhsdkZmUUJBWGpvNGI0MzdmcXJja3hDU0sySThJaFJRY0hCb3pLemNyZVdsQlIvMVRTbDBTOEE0YVhJcWlCcGJZS3ZCZ2VBOGp4UEdZYVI4eGVwbE5kSUdJWUJMNmdvTC9nbWNYdjl0MDZIbzFRK3BLelJlUlJ6MVd1bVJrbEp2YTFhdGNhdmUzN0J6Qm5Ua1pPVGpTZWZmQXJoRWtocy8yWWI2dGF0aDBhTlV5bzF6YmQrOVNVV0xuNVhlYTh5WUxwZWVmYi9CbUwwcURkZ05oZGczLy8raDFsejVpcWZtUzFtVEo4MkJXYUxHVzNhdE1Yb01lT2cxV3JScjkrVHlqNWZmUDRaZXZidURRQ0lqWTJEeFdKR2VucjYzYVd4aWFLSTlQUUxPSFBtaktTbFhVSmVYaDVNSmhQT3BLV0I1M2xjeXJxa1ZCTEllV3BPaHhOT2x4T1VVbmpjSHVKeHUwdHBhRkxhQnFHaXlCQkNHRW9wMCsrSkoxVVhMbDRhUEc3OGhCKzdkTDEvcTlsc2ZtckY4bVY0ZCtreWZQTHBaMUNyMU5qNjFWZTNiWkFsTHE2MG42OTI3U1FZREhrQWdLQ2dJQnc5K2dlR3Z6d1V6ejM3TkFhL01GQVozNnBLU3BNbTJQM1RIbnp4NVZiazVlVmh3L3AxNWZiNStLTVA4ZnZ2aHpCMzdueW9WRGZuR1Z6VlkxSktZU20wSUNnd0NBekRQQkVXVnVQVFM5bDVXOUxPbm4rMmVmTVdla3FwRHBlSkFYdzFPSVpTeWdpQ3dQQThUM2llSnh6SEVaN241Y0FCY2J2Y3hPVnllVk0vSEU0bFYxSU9IdkE4cjFRc2hJYUdRcS9YdzJReUlUYzNGMWxaV1VoUHZ3QktLWVlQSDRFL2ovNEJyVWFyZ0xUUmFNQ083ZDlnMkxDWEtyMjIzL2J2UTFKeUhjVEd4bDNYV1BidTNSdjkrL2RIZkh3OE9uVG9nUDc5KzZOeDQ4YWw5Z2tLQ3NJcnI3eUtMLy83QmJwMTcxN3F3VGgrL0VTODgrNVNiUHIwYzVqTlpueTlkVXVwNzI3NThyOG9NQmZncWFlZUJnRG85WHBNbmpJTjgrZk52bnMwdHFLaUlwdy9meDZzU2d0VHZoRVdzemMveldyMW1wcFpXWmNRR3hlSDNOd2N4TVRFS0U5Q1ExNGVPSTRESVFTVVVzSnhIZ0FFSE1jUlFlQ0IwaldhWlBOblh3UXZXamgvOEpLbHl3Y1JRcG9lUEhnQTgrWXZCQlZGdkRGcXRHS0NOYnpuSHVUbDVkNldZeFVURXdORFhsNnA5M0p5c3RHeXBUZnZhTi8vOXVMVFRaOWd5ZExsU0toVkN3RFFwVlA3aXJTYWNtRG5kcm53M1hmZm9rK2ZoNkRWNlJBWEY0Y2VQUjdFL3YzN3lrM2FIM2YvZ0dVclZ0MjBoTk9yT2VhUkk0ZWhVYXZSb0dGRDMrdnRHQmdZMkhIN3ptOWZkcnZkbjMzOTlWZi9uVEJ1YkFraFJKQjhjYklXcC9qaUJFR2dsRklxaWlJNGpvTWdpSlJsUlFpaVFBUkJvSUpLZ0NCNFFjODNKOUp1dDBPajBVQ24weW5sV2JMLzdmeTU4eWpJTDhDYU5hc3c4UGxCT0hzbURRdm16OFdreVZPeGM4Y09XRzFXdkRMOEpZQjR5UnlHREhvZWE5WitBSzJVUXZMRjU1L2g1VmRHWFBkNGZ2Lzk5d0NBRGgwNklDTWpBN201NWVmN2hRc1hNSC9lSFB4bjFoeHMzTEFPdFJPVDhQRERmU0VJQWxxMHZGY3hoWHYyN0lYRHYvK3VmTy9YUGIvZ3h4OS93THRMbHBlS2xyZHIzd0h0Mm5lNE96UzI3T3hzbkR4NUVsbFpXY2pLdW9TODNEeVlUSmVEQlVhREFZSWdJaWd3Q0VXRmhZb2ZyU0EvSDRJZ0lDUWtsR2kxT2tJcGhTQUloQmQ0SWdnOFlTUUJ3RHo1WlAvd2k1blpZenQxN25Jb0pqWjJjZHJwVTAyenNpNEJBSktTa2hFVkhZM09uYnNvaTN2SGptL1FvOGVEdHk2UUlwazZBRUFseWlRWmhCN3Urd2oyN3QyRHc0ZC9COC96K09XWG41RjY4Z1I2OXZLNkJNMW1Nd2dCR0paRmNYR1I0aU9oWXVrcWxyajRlQnc2ZUJBY3h5RmZvbW5TYUxYNDVPT1A4UG5ubThGeEhJcUtDckZ2My8vUXJGbXp5NmJ3anUzWTl2VldMRjIrVWpHZnF0MzhydUl4M1c0M2ZqOTBFUFBuemNId1YxNUZZR0JnUllEZVJLZlR6WG4yMmVlK1AzOGhZOFRxOTlaR1NScWNsbEtxb1pTcWZUVTR5US9MZU1rUGVNTHhIUEVHRGR6RTdYWVRsOHNOSDU5Y0tlM05icmZES2lYeHlyNjNyS3hMT0hUb0FPclVxWXR1M1IvQXRPa3pvTkZvWWJGWU1IVFlTL2o4aXkzWStORW5XTE4ySFRRYURUWis5SWtDYXFkUG5ZTGI0NmxXbjZhdkhQM2pDQ1pObm9yN3UzWEh1MHRYNEZUcVNWQktVVnhjakJjRy9wK1NvblQ4K0RFa0pTY3JmMy8wNFViTVg3Q293dkVIL3VYcEhwUlNuRDE3RnBtWm1RckZFS3RTbzZTNEJGYWJGUTY3SFE2bkU5azUyUWdJMEV2T1Y0TGk0bUlRaHNEbGNoTzFXZ1VQNTRFb0NnQkFmT2lCR0FEa2h4OS9DYmwwS1hQWWdmMzdoakVNVXhjQU9uYnNqSU1IRHlJd01CQ2RPM2N0Wnc3UG1UTUxEenpRbzFJZlIzVkwyUVRkQmZQbllzSDh1WGl3WnkrOE5YMEc2dGR2Z0xkbnpzSjdxMWZDa0plSDJvbUpXTGo0WGNSSTJjeDlIbm9ZSjArZXdOQWhMNEJsVlhqczhYNm9YNzhCTElXV1VzY1pNMlljRmk5YTZIMFMxNjZOZFJzK2drYWp3WUtGaTdGeXhUSjg4ZmxuVUt2VjZIcC9Od3dhL0NJQVFCQUVMRnJvTlFPZmZicC9hVE54MCtick5vOHFrcW9lYytScnI0SVFJREV4Q1dQSFRWQjhrRmVRdWxxZGJrYmZSeDU5b2NlRFBULytadHZYbjQwYk83cFkxdDRrLzV1aXhYbFRRNGhJS0FYMVZxaFFRUlFoaWdMaGVSNHN5MUs1Y3FVaWlpdjVZV1V3NUtGR2pYQTBhTkFRWjgrZWdjUGh3Sml4NDZxVTJ2UDVaNS9pcVJ1Y1ZuUGd3SUZLUHh2dzlEUEszeEVSRVJnL1lSSUFJRHc4SEM4T0c0YlhYeDBPU29Ia09uWFE3d212YjIzK3ZEbHd1OTBZNVJOb21QclcyMmpRb0NFS0N5MTRlZGpRZjIrdHFOVnF4Zm56NTNIcDBtVS8ybDkvL1FXR1ZjRnVzOEh1azV1V2xuYjZzdlpDS2RScU5kSHBkTEJhclRMdkZwR0lJQW5ETUlSU3lpUWxKYkY3OXU1L21XWFpsMy82NmNmRysvKzNGelArTXhzQWtKNmVqbmx6WnlNb01CQ0RYeHlLNXMxYktPZTFiT203NERnTzQ4WlByRGdpZVM0TlhidDJyZkoxN3QyNzEwOVFXSWxVTnBhM2NNeE9wNTQ0L3RIeTVjczNmL2ZkZHg0SjRCUVRGZDdhVlBtVnlzWDJETU5RUVJBVS9qZVZTa1ZabG9WYXJZWktwVkxJTFdYVE5DbTVqc1QzSnBGWnhzU2daczBFSkNjbmxVdDN1dEZ5OExmL1ZYbmY5aDI3Vk50NS9DczFOcVBSaUFzWExpQXJ5NXZDNFVzRXliQXFyelBXNllUTDdZTGRiZ2ZQODRpT2lRSFBjWEM2WE1SaHQ0TmhXUkJDaUNBSWNpNmFFdVU4ZmViOE15OE0vTDhSUnFPeGJYeDhQUExLK0E3cTFLa0R1ODJHZ29KOE5HMTYyY1RhL09rbW1NMW16Smc1NjRaZHExNGY0RWV3cXh5Yld6aG1qV3JVQ0orL2MrZk9KMHBLU2o0TUN3dmJRUWpoZkFGTzB1S0lWNHNEcFZTZ29sU3JKL25qSUlvaVVhbFUxSmNWUnRiYUFJS2lvaUx3SEs4ays3cmRicmhkTHJoY1RpUWxKbFVySFZKQVFHQ1Z5cW9DQWdLcmRhRC9kY0NXa1pHQjlQUjBaR2RuSzBtQmN0S3QxV29GdzdCS0tvZkg0NEhGYklGS3BZTGI1U1k4ejROS0JlcmV0QTJHaUNKUEJFRWdBSmcyYmRwMmYyZkowbGNEQXdQN1Rwb3lGVk1uVDBTTjhIQ29WQ3dDeWl5V2pwMDZvNlM0U0VrMk5Cb05XUFBlS2lRazFNS1FRZDRvSXNPdzJQalJKOWQxdlN6THdtNjNWZnVUK0U0VHU4MWFhUWtXYzR2R3pHNnpnbFdwUUFocEV4b2Eya1lRaEw0bWsrbkR1TGk0QTRRUWpsTEtFMEprZ0JOQklJSkNoQ2dxQkptaTZNMGFrYW10UkZGVXpGTUEwT24wc0phVWVGTkNlRGtsaEx0Y3llQnl3K2x5b1pZVTlMblJrbHluM2o4V3dnY0VCQ0s1VHIxcUhldC9qU2xLS2NXWk0yZVFucDZPbkp3Y0dJMUdoV1pJcnZmTXlja0JZUmd2SzBlcHNpaWVlTms0ZUYvNklGbExZMDZrcGpVSURnNStqUkR5eXEweW55b0g4a3lZTFJiRXhNYjcwY3hYYXpma0lqSXlBb20xeTFNNlpXUm13bXkrK1dObU5PUWlJaUlDU1ltbHo0bmp1SFdwcWFrZnQyelo4Z0lBRGdBdlJWSVZINXpNSCtmTENlZERjRW5MbXFVeUpaSWNNWlZUUThMRHd4RVZGWVc0dURqVXJsMjdXa3ZxYnFYOEt6UTJ1WW9nSXlOREFUV3oyWXppNG1LZkluWUgzRzQzUkVwOXk2SUl6L1BnQlI2aVFpdEVDUVVsb0pUMGYyb0F1M0RST3lOWmxuMERRTUxOdUphZzRPQ3Iyajh4c1RieTgwMHdHbklSRkJ4eTEydHVkcHNWTnBzVkFzOVhDR29Ba0pTWUNKUHA1bzJaZkU2aUlKUUROUUJRcTlYRFdyUm8wY2R1dDYvdDNMbnp4OGVPSGZQSUFBZHZrTXEzQUYvaGhwTkJqbUVZSXZuZnFFeFI3dHRjUmdZNFg5WmV1ZWRDdzRZTnI3blc5SGFXTzE1akt5d3N4Tm16WjVVOEdWOE90Ykpra0lXRmhmQldDL0RnS3RmU0dBRGszSVdNbmhxTlpoU0FCMjdtb25TN25Xald0T2xWYTZzWE16SmhzWmdoOENKY3JydVRvMDJ2RHdERHNvaU1pRVJpWXExLzFFWXlNeThodjZBQUFpOVUyNWpwOVFGZ1Zhb0tOYldLUkJURlBTYVRhVjFjWE53K1FvaHZnSUdYTkRkQkFqUlJEaTZ3TEV0OXdJeXExZXBTSkphK1BSYmtCakp5ZDZ5a3BDUTBhTkFBTldyVThBUGJiV051R0kybDBqbGsydTZLR0c3ZGJqZnNkanRjTGhjUktZVWdFVUVxV2hxbEJLRE1rYVBIWXFPaW9rY1JRa2JmN09zeEdmTVFGeHVEdUxnNCtPWHVGby9IcytxWFgzN1oyS2RQSDRNVVlKQTFPTUVuY2lxREc1VzFOVmxUVTZ2VlZHNEJXQmJjZkUzUytQaDRKQ1ltb2tHREJ2K3FKakozckNtYWxaV0ZjK2ZPSVRNelUwbm44RzJ1SXRPNitETGRDb0pBUEI2dUl2WU5CZ0J6NGVLbC9pcVZhalNBKzI3bXRUanNOdGlzSlFDb0g5VDhBZ0RRYURTdjllclZxNFBaYkY0YkVSSHhIU0dFbGNDTjg4bC9JMTRsVHhSOUd2NVFINnA1V2xtdVcyVjFwOVVWVlBBRFd4WGt3b1VMT0gvK3ZBSnFjanBIMmVZcVplaTdDY2R4QUtoODArVXVUOHkyYmR0cWhZU0VqTW04ZVA3Vm0zMHR3Y0hCVUtsVWlJK1BRMnhzckg5RisrV3lPVVZJeS9EdzhEVWVqK2VEMzM3N2JVTzNidDJ5Q1NHTWJKcFNTbmxjWmw0V3ZWNEo2aHNwSmI1UjA3THBJVEo5dlMrMXZjZmpRZDFyWVBEd0E5dDFTbHBhbXBKNEszZU5LaXpGZE9zb0MyckVweGVCNGt1RFZEbmdkcnVmVUt2Vll3RzA4aThsdjl5T29sYXJYK3JhdGV0OStmbjVhNktpb25aTHZqZEdBalZaZTVOVFFjcHFiK1hTUXNwV0x2aDJUcE1CN3A1Nzd1eWtiNUtSa1hGSG5LaGNIaVVIQ1h6OWFXVzFOSjlPVWNSYldPenREQ1duY0ZCS3ljOC8veHlXbUpnNGptR1lDZjZsNDVjN3lQZTJiT3ZXcmVzblRacFVDTURqaytBcnlQNDN1V3BCU2dueDliMVIzd29GdWZWZlVGQlFPYitiSEZTNFU5TkJWSW1KaWJmOVNYSWNoOVRVVk1WM1ZsR0hxQXE2UXZsMlUvY0ZOY1p1dDNmUmFyWGpDU0U5L1V2RkwzZVl2RGwrL1BpVVo1NTVabTFTVXRJUkFDd0FPWHBLVUpySkY2SW9naEFpbDJRUm1mK3RySWJtVzJUdmNEaGd0VnBSVkZTRWxKUVVxTlZxdnlsNm84WGxjaUUxTlZVcGtaS3JDWHhiNGlrOUNTVENQVmxUazAxUENkZ1lTaW5qOFhpR3N5dzdFWUEvbzlVdmQ2UXdETk1qTVRHeGNVbEp5Y3FRa0pBdkFEQ1NlU29ubFpjS0xNZ1dEL1VLa2FzWGZQclk0a3JGOVNrcEtaVjJ4YnB0VGRIYk9kM0RicmVYQXJXeTFRUmxHeGJML2pUSi9KVHJQQmxSRkVsdWJtNThkSFQwQkVMSXEvNmw0WmZiMWQxaU1CaGdOSm9nQ0FKc051cy9mb2ZuK1hWSGpoeFpOM255NUZ4SmM1TXJGNVRpZXArOE4waXBJWElTcjVMekpuZW1MMXVsRUIwZGpabzFheUk1T2ZtMkFMZmc0QkN3TElQbzZPZ3JaaERjdGhxYjFXcXRGTlJraGx1NTk2SnZrRUFHTlovSUoyTzMyenRydGRxSmhKQUgvY3ZITDdjcnFCMDdkZ3dVUkttR3FHSlcyYkQ2RFJ2WDZkcnRnZmM2dEd2ekJ3QUczc2lwVElEcXBVWHkva09sdnJkZWpZMVNMME9TMUFkWDN1UWV1b0pJd1FzVUhDL0M3UkdRbUp5QW9LQmJYOWxpdDl1UW0yZEFibDRlN3J2MzNqc0gySXFMaXhWUWs0dlp6V1p6aFpwYUpaRlB4Wi9tZHJzSHFsU3F5UURxK1plUFgyNVhNUmdNb0NEWFZML0tNRXozV3JWcUo1NU1UVnZSSk9XZUhhQ1VvWUJ2M3cxQm9nc1J2YkVBQ3NrQ0JienJoQ29tcVJ4UmxjeFVVYVFRcVJSTnBTSWFObWlJNEpDUVd6cFdnWUZCQ0F3TWdzbVlCNFBCVUdHYTFHM0ZvUHZERHorZ2ZmdjJpSW1KUWRldVhURmh3Z1RzMmJOSFllaW9LQUxxVnZvUGVIMXEwc2FJb3FpYVAzLytsUFQwOUxYZmYvLzliUU5xUE05ajFLaFJpSTZPUm1ob0tJWVBINjUwZC9MTDNTc21VejZDZ3E4TE1PcUdob1V0UG5mKzR2Q0c5elFLQUtDVHVtZkpQUmRZU3NGU0tuZkxFZ2pQYy9Cd25KZXAxK1dXZWl4NHUyTlpyVllVRnhYQllqSERaRFFoSnljSEdSY3ZJdTFNR2txS2kyK0xNUXNNQ29aUjZweFdWdGdaTTJiY0ZpZTVkKzllOU96WkV5a3BLWGpnZ1FlUWxKU0VvcUlpSEQ1OFdJN3NLSUJXMXZ5VXRUUXZ0YkxBcEtTazFQcjg4OC9uZHUzYWRjeUFBUU9Za0pBUWRPblM1YmE0em9rVEoyTGJ0bTM0OU5OUDhleXp6MkxwMHFVNGRlb1VIbnZzTWYvcXZvc2xOemNYTmNJanJ2cDdwMCtsWXQ1VTdNZUhBQUFnQUVsRVFWU2MyZWpWdXc4QU1DcTF1dU96Ly9kY1NLdldiUzU4dmZVckIrQlYzU296ZnlsQWNMbVJ0MlNPMHN1YnBLa1ZGT1RqME1HREtDd3NSRVJFQklLQ2dxSFQ2ZkQxMTE5aC90eloyTFp0S3dvdGhXZ3BtWWI1K2ZsNGE5b1ViTjY4Q1QvLzlCT2FORzJLME5Bd0FNQmZmeDNIdENtVHNIWHJGaHcvOWlkYXQybDdUVjJ3TkJvTnJOWml4RmZnYTd0dFRORzFhOWVpYWRPbWVPYVpaNUNWbFFWQ0NGcTJiSW1DZ2dLY09YTUdLU2twbFNYZWxnb1NQUGpnZzYwYU5XbzBwVnUzYm4zbG0zZTdpTjF1eDZwVnE3QnAweWFGbXVqOTk5OUh6NTQ5c1dEQmdncWIzdnJsN2hDcnRRVFIxMkNHTnJ5bkVkNmUrWjlTNzZuVjZrRmR1blNKL3VYWC82M3BmbitYRTVSU1JrSTN4VFNWc1UwVUJKR1hmRzJBOTlVTGVCS3dnZUpDK2dWd0hBZVdZUkVSRVlHTWpBeFFBSUdCZ2RpNlpRdldmckFlR28wR1k4ZThpU05IRHFOMTZ6Wll2V29GdW5kL0FIMGZlUlIvL0hFRUMrYk54YXIzMW9MbmVjeWJNd3Z6Rnk1R1VsSXkxbjNnN1N2NjBzdkRyMm5jZkhzRjMzYW1hRkZSRWV4Mk8zSnljbkRod29WU1ByWEV4RVFrSmlZcUtSMTJ1eDM1K2Zta3NMQVFOcHVOdUZ3dUlnZ0NJNG9pazVTVTFQdkhIMzljc256NThyNkVFSFRwMGdWSGp4N0ZXMis5aFhidHZBMTUyN1ZyaDltelo2Tjc5KzRJQ0FoQXZYcjE4UDMzMzJQWnNtVklTRWhBYUdnb2hnMGJwaEQzVVVveGI5NDgxSzlmSHhxTkJoRVJFUmcwYUJEc2RqczhIZythTm0yS0J4KzhISlBZdEdrVHRGb3RqaDgvRGdEbzM3OC9Xclh5RmpVY08zWU1UcWV6Rk45YTU4N2VUdHNIRHg3MHIyNi9sQk96Mll5eFkwWmgwUFAvaDhHREJ1TDNROTU1a3AyZGpRSDluOENUL1I3RnFEZEdsdnJPNUluak1XVFE4MzFtLzJmRzFKU1VsQzRBZEtEVXQ1RU1LNG9pSzY4YnBZa014NkdrcEpnWURIbGVRa3FudDNGelpHUWtHalpvQ0kxV2c1S1NFdVRtNWlBekl3TzdmL2dCS1UyYUlDREFTN0phSTZ3Ry9wTG0vVjkvSFVlWEx0NTVIaG9haXJTMDAvQjRQRERrNVVHbjF5TXB5ZHVZSlR3OEhIOGRQM2JEeCsyV2EyeHlvS0JkdTNiNDl0dHZNWGZ1WE1URnhTRWtKQVI2dlI0eTE3dWMwbUUybXdrQXFGUXFRaW1WdTY0elZxdjFXWTFHTTdWdjM3NzFHelpzaUVXTEZvRmhHTFJ2M3g2UFBQSUlwa3lab2h4ei92ejUyTEZqQnpwMTZvUlhYbmtGL2ZyMXcrT1BQNDdUcDAvajFLbFQ2TmF0R3g1NjZDRTg4Y1FUV0xWcUZSWXVYSWpObXplamNlUEdPSDc4T0FZT0hJam16WnRqekpneCtQREREOUd1WFR0ODhza242TjY5TzBhT0hJbVpNMmVpUllzV0NyQVZGaFlDQUhKeWNoUnc5SG02SWlJaUF0bloyZjVWN0pkeThzWG5tOUdzV1RNTUd2d2kwdFBUc1hyVkNyUnQxeDRKQ1FuNDc1YXRPSGZ1TE9iT0xrMDFQMi9CSW1sdEZiVVovdExROEE4LyttVEY0RUhQZnlzcE1rU3lUamtLQ040SE9CR2xmRjRRUXFoS3BTSnV0OXVyeEFHZ29DQ0VnZHZsZ3MxbVE3NHBId0JCWm1ZR0FnSUNjUEZpT2xZc1d3cEJGQkFzK1FtTGk0dWgxZW13WS9zMytPbW4zZEJvTkxEWmJDZ3BLWUZXcTRYSDQ4SEtGY3VRbTV1TG9xS2lHejV1dDFSajgwM3BFRVVSQXdjT1JOMjZkV0V5bVhEcTFDa2NQWG9VcWFtcEtDa3BnZHZ0UmtsSkNaSEFRSW40TUF6REJBY0h2L0xsbDE4dTBtZzA5ZVdHRnpxZERocU5Cb1FRaFZsVWxuNzkrcUZidDI1UXE5VjQ0b2tuNEhLNU1IZnVYQVFIQjZOdDI3Wm8wcVFKVWxOVEFRQkpTVWxZdjM0OSt2VHBnOFRFUkR6MjJHUG8ycldyOHZsOTk5MkhTWk1tWWZ6NDhSZ3laQWlhTkdtQ0NSTXVWMms5ODh3ekdESEMyNlBSNFhCVW1BdWsxV3FsRGxsKzhVdHBhZDJtTFg3KzZVZDg5T0ZHdUYwdUxINW5TWlcrSjRvaVpzNTRHdy8zZmJUZUF6MGVuSFlxN2R3QUFEcHAwMUJLMWFCVUJZQUZLS09rUndHRVpWWGdPQS94dUQwK3JmN3NjSHM4Y0RnY3NCUmFrSjl2UWxGUkVVNzgvUmZHanh1RDU1NS9BZDI2bGFZdW5EZG5Gakl5TG1MeE8wdWgxV3BMS1ROalJyK0p4bzFUTVBLTk42dGwzRzRac1BrbTM4b3BIUzZYQzNYcTFFR3JWcTNRdUhGalJFUkVRQkFFR0kxRzRuYTdKWFlPN3hOSHpsSGpPRzU4U2tyS2d0VFUxQ3AzcVBBdEk1TUhQQ0Vob1pSVFVnYWF2bjM3b25idDJwZzVjeWFlZSs0NXRHalJBdDk5OTUzVU9NTXIwNmRQUjBSRUJQYnMyWU9QUC81WTZYTlFWdlI2UFR3ZVQ3bjMzVzUzcGYwUi9YS1hBMXZyTmxpNWFnMXFKaVRnNDQ4MjR1MjNwbGJwZSt2WHZRK2RUb2VCejc4QUFGSEJ3Y0Z2ZmYzTjlzRUE5Qks0YVFraGFrS0lpbExLQW1COEFuQ0U0M2g0T0E5UklxWk9KemlQRitoS2lvdGhzVmpnY2J0UlhGS0N4eDkvQWdRRUpkWVNoSWFGS2Vabmg0NmRNUEtOVVZDcjFmQjRQQXB6YjBseE1VYVBHWWZlZlI2Q3krVkNtUFNkT3g3WWZNdWtzck96a1pPVGd5MWJ0dURpeFl0S25ockhjZERyOVFnSkNTR0FsLzdiRjlSV3IxNnQ1amh1T3NNd3MwVlIxSlh0T0g1RisxdFYzZ0t2ck5oM3laSWw2TkNoQXpJek05R2hRd2VzWGJzV3ZYdjNMcldQMFdoRVRrNE9LS1g0OWRkZkt6MXVRa0lDWEM1WEtkV2I0emlZeldiVXJGblR2NHI5VWs3bXpaMk53MGNPbzBlUEJ6RjV5alFjT25RUS96VFg5Ky9maDcyLy9vb3BVOS95bmRlNkprMmFUcm4zM251SE4ydldQQkJTT2dpbFZBMHBIUVFBUzBXUjhEeEhCSUVuUEZjNkhZVG5lYmpkYnNXa1ZHczBjRGdjS0NqSXg4V0w2ZGo5dy9kbzFMZ3hBS0JGaTViS2VmNTU5Q2lTa3BLaDBXZ1FHeGVIMExBd2FDVUxhdisrZldqZW9zV2Q3Mk9UQzlwOWF6K0xpb3FRbjU4UGg4T0I1T1JrMytSYkltczRjdnM3QUdUbnpwMUJQWHYybk1vd3pMaWlvaUtjT25VS1E0Y09yZkI0MTh0T3NHVEpFa3llUEJrelo4NVUzc3ZJeUNnVndYenBwWmZRb2tVTDlPdlhENk5IajBiUG5qMHJCS3FXTFZ0Q3I5ZGozNzU5ZU9TUlI2Ukp1QjhNd3lqQkRiLzR4VmNHRG53Qml4Y3Z3T2ViUDRVb2loZ3pkandZaGtGMmRqYkdqSG9ESE9kQmNYRXhCdlIvQXZmZWR4OG1UWjZLbGN1WHd1Vnk0YlVSTHl1L3MzTDFXZ1FIQjJQQm9uZEd2N05vb2FhZ0lIOWRibTZ1L0lTVm82Vzh0TllFYjJNc3dldGlrL2JoZVlGNk9LODVDZ0lFQndVakxpNGVuMjd5ZHBLLzk5NzdFQndjREo3bjhlcHJJekYvM2h4OCtkOHZvTmZyTVhIeUZFV3BtREwxTGN5YU5RT2NoME90V3JVd1lkS1VPeHZZS0tYbHlxVGs2R2R5Y2pMT256K1AxTlJVQkFRRVFCQUV1TjNlcHdRaFJDYlRJeWtwS1RWbXo1NDlOU0lpNGsyMVdvMHBVNllnSkNRRUF3WlUzTDA2S0NnSUJ3OGV4S0ZEaDY0SlBNTER3M0hnd0FIazV1WkNFQVFzWExnUXAwNmRRbE9wTDhINjlldXhaODhlL1AzMzM2aFhyeDQyYmRxRWwxNTZDZDkrK3kwQTRQUFBQMGRoWVNGR2pCaUJ3TUJBREIwNkZLKy8vanFDZzRPaDBXZ3dmUGh3REJreUJPSGg0ZjVWN0pkeVVxdDJiU3hidnFwQzdmKy9XN1pXK0ozUC8vdFZwYjkzenoyTjhNSDZqYSs1M1c3VjVrODNyWnYrMWxTenRMWjhsQUVHbElxQ0tES2x3QzBvS0FnYXJVYTJua0JBVUNNc0RFbEpTWWlJaUVCTVRDd3lNekxBc2l3YU4wNnAxQi9ZdEdrenJIMS9mYldPMjAwMVJhOVUwQjRVRklUWTJGaUlvaWlibzBRR05aWmxDYVdVWExod0llTDc3NzkvS3k0dTdzMEhIbmdBWGJwMGdWYXJ4Zjc5K3l1MTAxOTc3VFVjT0hBQWd3Y1B2cVp6M3JCaEEwcEtTbEMzYmwyMGE5Y09OcHNOa3laTndwOS8vb21zckN5TUdUTUdVNmRPUllNR0RjQXdERDc0NEFQOCtPT1AyTEJoQXdCZ3k1WXRXTC8rOGsxY3ZIZ3hIbnJvSVR6KytPUG8yN2N2N3IvL2ZpeGJ0c3kvZ3YxeVUwV3IxUTUvYnVEQWwrY3RXQlFGUUN0VkthaTl5bzVTcFVCRTBadDU0RzNBN0Ewb3VOM2VLZ1dIdytFMVN5V2ZtOGxrUW01dUxqSXlNbkQyekpsYmVuMDNqZDBqTFMwTmFXbHBTb3M4dVp1VVhDYmx5M3hiSnZtV1VFckptVE5uYXRTcFUrY3RRc2hJLzdRc0xhSW9JaVB6RWl3V0N3UkJnTXQ1ZDVabzZmUjZzQ3lMOEJvUlNFcXFYV2tRUjdZZXZHTm1CczlYMzVqcDlIcW9WQ3BFaEVjZ0thbHk3c085ZS9laWJ2MmJ6MXJyY2JzLzJMVHBrL2Zmbmo3TkFzQkZDSEZEYVJ4REJFSWdFTUlvRFdQVWFoWFVHZzNWYXFTK3BRRUJDQW9NUkxEVXppOGlJaEt4c2JHb1hiczI2dGFyajNyMXFyZWFzYkkrdkRmRkZKVjdGSlRsVTVNN1NSMC9mdHkzUW9ENDJ2M1NGbFN2WHIycEFQN1ZvR1l3R0s2NlU1RGI3Y0ZmZi8wRlZxVkNjRWlvdjYrbzNZYkNva0lVSE0xSGkrWXRvTkdvS3dTMVAvNDRDb1psRVJSYy9XTm10OXRndGxpUVg1Q1AxcTJ1ekVDZmMvUHpHVi9xMXEyN2VISElpMnMvM0xoQldZZGUwOVJiWWdXSWdpaFNVRzh4UEJVRWtRaThRSlZ1OHo0a2xVNkhBM2E3RFZackNZb0tpMkF1S0NpVmNYQWpwZVlWZnJmYWdTMHJLNnRVajRLeTNka2REZ2RxMTY2dGFHb2VqNmRVN2VmcTFhdlZ3NFlObThvd3pKdndTem5KTStTQlZhbjhuZUFsa1prZmpJWmM1T2JsSXFrQ2h1aUxHWmxnV1BhbWpabnZPV1ZtWGtMaUZmcUwxa3hJdUJYRE5uenF0T2w4UmtiRzJsLzMvRktaaGl0Y0JqdVJVaW9TU3N2M1VlQWxabDZQaDRQTDQ4MkJJNFFnL2laSC9hc1YySXhHbzlJaXIyempsUW82U1pHS3VOUWtVQnZuWDdJVmk3bkFqS0NRVVA5QWxKR2c0QkFVRkpnckJEYUx4WUxnV3pCbVFjRWhLREFYWEJIWWJwa1pyOU85OXY0SDZ6ME42aVd2bDdWYU9hQkF2ZEVGS3BiS015RVVJQVFnY2xkNkVFTEFlTWtzd1RBc1dKYUZpbFZCNVRWZkVSVVZkZWNEbTl5aFhXNlJsNStmWHltZGQxbWZtbS95TGNNd1UvM0x0REkvRVNBSXdsMXZmbGFtSlJVWFdTcjg3RmFOV1dCZ0VJb0xMZGYwM1pMaVltUmN2QUM3M1hiRjMwOUtyb3VRMEdzRGJiMWVQenJ0N0FYWFBRM3FicEx3VEpscVBtTW5YbTdmeDFHTzh4QUorRUFZQXNJd0VyQXhZRmtHS3BYQzFndU5Sb1BRME5BN0Y5aWNUbWNwVUN2THAxWUpTYVRjZklWSXZRbGVZUmhtMnBVWDl0VlRLZDl1VWxXcTQ0cUVFTURwOUhPNVZUb1BLK0c1dTVYQmxXdTlYeGZUejhQaHNGOXhIN3ZkaG95TEY5Q3N4YjNYQWI2Qm8wK2VPdU5vMHJqaFZoOVFvMlUwT0JFQUZVV1I4RHhQblU0SFlWbVdNb1NBRUFZTVF5Q1hObm8zRlZScU5UUnFEUm8xYm54VEtNWnZPTEJSU25IbXpCbWxUWjRjL1N5cnFaV0pmc3FOSlJpSjlmWlpsbVdud1Z2NlVlbHhycEZLK2JhVHFsQWRYNnY4dVBzSGJOeXdIaWFURWZIeDhmaDQwMmM0ZCs0c2hnNFpwT3d6YWNvMFBQVFF3MzRrdkkzbG4wRE5keTVkcjFVYUdocjZ4ckcvVHRwYk5tL3l2YSsyVmdiY0FFQ2tsSHA5YXB5SGVIc3JYQVkyaG1YQk1oS3d5VnFiVm9QR2pWT3F2YTNmRFFjMlgxQXIyOHpZYnJkWFNPZnQ2MWR6T3AyOVZDclZWQUJYTk1pdmgwcjVkalNiL29ucStGb2tOemNYQytiUHhjeFpjOUM2ZFJ1VWxKUUFBT3JWcTQ4ZmYvNFZBUERTME1IVmRsMGIxcS9EWTQvM0s4Vm1JcC9Yc2lYdjRNU0p2NkhSYU5EandWNFk4ZXByWUZrV2dKZVNaOFd5SlRoeDhnUzBXaTE2OXV5Rmw0ZVBVRDZ2RHZtblkzYnAxQjVxdFJxRU1FaEtTc0tRb2NQUXNXT25meXVPUmtWRVJMeTZjdVhLa3RkZmYvMUFHYzJORWtLbzlEK1JtMkR4SE9mbEltY0lKUXdCUXlRL202UzVLY0NtMWtDcjBhSmUvZnJWZWdFM05FRTNJeU1ENmVucGxlYXB5ZFJEVW9zOCtMTGZVa29acTlYYVNxUFJUQVh3ajFkOUE2aVVieitBdXdMVjhUVTlaTkpPSXpJeUVoMDdkb0pHbzFIS3dBZ2hTbWVpNm54eWZyaHhQU3dXYzduM1o3dzlEVFVURXZEMU56dngvZ2NiY09qZ0FXemZ2ZzJBTnlkdjBvUnhhTkR3SG16N1ppZFdyRmlOdmIvdXdkZGJ2NnEyODZ6cU1WZXVYb01kdTc3RGtLSERzSGpoZkd6OWFzc3RtU2VFRU54Nzc3M28yYk1uZXZUb2dmajRxM3U0QzRLQTMzN2JqOGtUeHlNN0s2dXlZOVNMaW9vYXZtREJnc2FTNVNUVGpLdVZ1bEpLNVc3MGhPZDU4SnczOWNOVEt2WERqc0tpUXZ6MDQyNnNYZk1lNXMrZmcvMzc5eUZMT203V3BVc1krZnFyZVBhWnB6Qm0xQnNvS2lwVXp1R2pEemZpdVdlZnhqTlA5OGV1blR0dWpjWm1OQm9WVURNYWpRcW95YmxxdmwzYWZUcTBLNkJtTUJocTZmWDZLUURhVnZYbS9OdWM1b0dCUWJCWnI1OVAvdmp4WTVneGZSbzhFczNNNDQ5NnpjeCtUL1RIb01GRHF2UWJodzRld01vVnkyRXc1Q0V4TVFsanhvNUhTcE1teXVkN2Y5MkREUnZXSWQ5a1FreHNMSVlQSDRGMjdUc0FBRWErL2lxeUxtVUNBRWEvK1FaVUtoWUpDYld3Y3ZVYWlLS0lybDI3NGVHK2ZhSFZhaEVkRTROV3JWc3JtZW9XaXdVMXdzUHgzTUNCMEdnMFNLaFZDeDA3ZFVaYTJ1bHFHL2VyT2FaZXIwZkhqcDJnbmpJTmIwK2ZobDY5Kzl4MFpwYms1R1N3TEl2ZHUzZERxOVdpZS9mdXlNL1BoOFIrVXdxdzVTUmwzNy9mZk9OMTFLeFpFNmRQbjRJZ0NsY0MwTmFKaVluRHhvNGR1K2lkZDk3SmtiVTJINStiSEdBUUJVRUVJYnkzN3BFd2xEQU1DRVBBc0F4eWMzTkJDTUVEUFhvQWxHTEQrbldvVjc4KzlEb2RsaTU1QjQ4OTNnODllanlJTHo3L0RPK3RYb1hKVTZiaHhJbS92WE5zNDBkd3U5MFlQbndZV3Q1N1g1VkIvSVpvYkZhclZXSHE4SzMvbER1M1h5bXRnMUpLWG56eFJUWWlJbUl5SWFSdjFZOVpja01uaTlsc3h1UkpFL0RjczA5ajN0elp0d3pjS3FNNnZocHAwYUlsdG0zZmhUZEhqVUhObWduWXRuMFh0bTNmVldWUXUzRCtQTjZhTmdValhuc2R1NzdiamFjR1BJMHhvOStBU2RJbU16TXpNSHZXVEV5Y09BVTd2LzBCanp6eUdLWk9uYXcwcFZteGNqVzJiZDhGQUZpeWJEbTJiZCtGbGF2WGVDY2N3K0M1Z2M4akxLeUcxeWwrTVIwSGZ2c05iZHQ2NjNnakl5T3hZdVZxNkhSNlpVRWVQM1lNelpvMXI3WXh2NVpqdG03VEZoNk91eVdsUTVHUmtjak56VlY4WGFJb29rYU5HcVgyT1hMa01LWk9uZ2lPNDJDeFdQRFMwQ0d3V0x3UjJYZVhMTVBrS2RPcXBCZ3dETlA3dnZ2dUd4d1RFNk9YdERhZjBpdXdBQmh2UnppUnVGd3U0bks1d0hFZVlqR2JrWmViQzVmVGhlTGlJZ1FHQnFLa3BBUXF0UnFDSUNEMTVBbGtaR1lnTGUyMGN1OGZlcmd2RHY5K0NBQncvdHhadEdqWkVscWREaUdob1dqZnZnUCtPSEw0NXBtaWxOSnlWUVcrbXBwdkJOUzNRN3R2QkhUTm1qV1RDQ0hEYnNSTi8yckxsM2p1MmFmeDdETlBZZjY4T1hDN1hGWDYzdnRyMzhNOTl6VENwNTk5Z2JIakxoTkZtb3hHN055eC9hNXlWTy9jdVIxZDcrK0dqaDA3UWF2Vm9uZWZoM0JQbzBiWXZmc0hBRUJFUkNRMmJQd1lqVk5Td0RBTUhubjBNWEFlRDdLeUxsWDVHS2tuVDZKbmoyNFk5UHh6dUtkUkkzVHBlbitGKzYxNWJ4WDBBUUY0Nk9HK04rMzZxM0pNUWdqQ2E0VERkdjNPK3FzV2pVWURRUkFRRVJHQlRwMDZRUlRGVWtTT0FOQ3FWV3VFUjBSZzVvenBHRHZtVGZSNzRrbUZhT0ZxRzZlb1ZLcm5GeTFhTkJCZUxqZGZrMVFsWVFnalVrb1lob0hINHlFMm13MHVsNHNFQmdiQzdYWkRwVkxCWU1pRDFXcEZkblkyQ2dzdHlNM05SVzVPRGlJam95QW5CUjg2ZUFCV3EzYzg2OVN0aDZOL0hGRW9rbEpUVDhKbXM5MDhZRHQ3OWl3dVhicWtwSFZVcGZkbm1Ram93QnVWcTNiaXhOL1lzdVcvV1B2QmVueTYrUXN3RElQMTY5ZFY2YnZuejUxRGg0NGR5OTM0L1B4ODdOanh6VjBGYkFhREFYRnhwVlgrMnJXVFlERGtBZkN5UEJ3OStnZUd2endVenozN05BYS9NRkRSZEtvcUtVMmFZUGRQZS9ERmwxdVJsNWVIRFJYY3A0OC8raEMvLzM0SWMrZk9yNUJEcnpxa3FzZWtsTUpTYUVIUUxYS0hKQ2NubzFHalJ2anR0OStVb0ZCWjRCMCtmQVQrUFBvSHRCcnRkVDBZOUhvOUJnNGMrS2JCWU9oWmdiL05xN2w1L1cwTUlRU0NJRUN0MWtBUUJPTHh1QkVVRkF4ZUVIRDQ5ME00ZlNvVkRNUEE0WERBWkRLaFY2L2UrT2FicnpGazhQTklUVDJKd0VCdi80VG16VnVnWjY4K0dQbjZDRXlmTmdVQitnRG9BL1EzeDhlV25aMWRMbGZOdDFUS0I5UlFVUVRVYnJkM2xwb1ozNUJaYTdOYUVSUVVqSUNBQURBTWd4ZUh2b1NMRjlPbHhacUhSUXNYSU45a1JHaFlEWXdiUHdHSmlVbjQrZWVmOE44dlBrTm1aaWJtenBrRmpVYUQ1NTU3SGwyNjNvK2xTOTdCc1QrUHdtQXdZUGpMWHI2M3RlK3Z4NGIxNi9Ebm4wZGhOQmlRMHFRSkxxWmZRR1JVTk41NWR5a29wVmk5YWlYKytPTXdPQStIOWgwNjRyWFhSNEpTaW5GalJ1SCtidDN4eUtPUDRjU0p2ekZuOW4rd2J2Mkh0MFYzYlYrSmlZbUJJUyt2MUhzNU9kbG8yZEtiaXJMdmYzdng2YVpQc0dUcGNpVFVxZ1hBR3pXc2FIR1ZCVHUzeTRYdnZ2c1dmZm84QksxT2g3aTRPUFRvOFNEMjc5OVhhcjh0WC80WFArNytBY3RXckxybWhOT3JsYXM1NXBFamg2RlJxOUdnWWNPYmZuK2tza1A4K2VlZkFBQ1daY3RSeTl0c05vd2ZQd1lEbngrRXMyZlNzR0QrWEV5YVBQV2Fna1ZPcHhOYnRteFJBWGpscjcvK01qUnYzdnhQeWRjbVN2NDJKV0pLS1NVTXc4TGpjVk9uMDl1VW5qQU1vcUtpRUJBUUFKMU9oNy8vK2d1aUlNSmlNVU1iRjQvblh4aU1CZzBhNG1KNk9pNWxaaXJIZlc3ZzgzaHU0UE1BZ0plR3ZZaTZkYXRlVUgvTkdsdFJVVkdGdVdxVmdCb3AwNldkeWMzTmpkZHF0Uk54QXp1MHQyN1RGalZyMXNUTHcxN0UxMXUzUUtmVG9YWHJOZ0NBT2JObm9XZlBYdmg0MDJkNC9vVkJtQzVSTEQvd1FBK3NmWDg5YXRhTXg3UzNabUR0KytzVnMyalU2TEdZTUhFS2twS1RzZmI5OWFVNHBOcTJiWWNaTTJjaE16TURIMzJ5R1pjeU0yR3hXR0EwR2hBWUdJQU5Hei9HeDVzMkkvWGtDUncvZmd5RUVFeVpOaDJmYnZvWWFXbW5NWGZPTEV4NzYrMWJCbXJTL2ZCcUg2S29hTklBOEhEZlI3QjM3eDRjUHZ3N2VKN0hMNy84ak5TVEo5Q3pWeS9GSDBrSXdMQXNpb3VMc1BuVFRkTHZsR2FLaVl1UHg2R0RCOEZ4SFBKTkpxODJyTlhpazQ4L3d1ZWZid2JIY1NncUtzUytmZjlEczJiTkxwdkNPN1pqMjlkYnNYVDV5cHZHVTFmVlk3cmRidngrNkNEbXo1dUQ0YSs4ZWtzbzNmUHo4eFdBMG1nMENBc0xLOWNRNWNLRjgramF0UnYrNzdtQm1EWjlCalFhcmVKanV3NnBXNzkrL1JkSGpSb1ZXNUcvalZMS01BekR5RlJqSG84SEhNOFJ6c1BCNDNiRFlYZmd6Smt6aUlxS2d0MWhSMUZSRVFvS0NtQTBHUERISDBld2ZOa1NQUGxVYVY1Rmp1T3c2Wk9QUVlpWHg2MWFOVFpCRUpDZW5xNEVDM3dqb0JXa2RaQXlhUjJFVXNwRVIwZFBJSVE4ZUNOdnVFcWx3b3laczNENlZDcSsvZlpiREg1aElHYk5ub3M2ZGV2aTdKazA5RnpoSmV4cjA2WXQzblc1WURJYUVSMXpiV205V3EwV09yMWVNVnNEQXZUZ09RNnhzWEdJakl6Q3hBbGp3VElzREVhdjM5SHJtNHJBNkRIajhQcXJyK0Q1RndhalNaT210d1RVeWlib0xwZy9Gd3ZtejhXRFBYdmhyZWt6VUw5K0E3dzljeGJlVzcwU2hydzgxRTVNeE1MRjd5SW14cHRmMStlaGgzSHk1QWtNSGZJQ1dGYUZ4eDd2aC9yMUc4QlNwbHhvekpoeFdMeG9JVFp1V0lmYXRXdGozWWFQb05Gb3NHRGhZcXhjc1F4ZmZQNFoxR28xdXQ3ZkRZTUd2NmpNclVVTHZXYmdzMC8zTDIwbWJ0cU0yTmk0R3o0ZVZUM215TmRlQlNGQVltSVN4bzZiY0VQejJJS0RnNnU4YjBaR0JzTEN3dENqUnc4QXdQSGp4OHYxMG1qZXZBV2FOMitockl1eDQ4YmZJUC9yem02dFc3Zk9BTERDUjJzVEFWQkNpRGRHU2tVcTE0dnlQRThad3BBU2F3bmxPUTZob1dHSWpvbUYzVzZIV3FXR1dxM0dybDA3d0RJc25ucjZhYlNYSXV1QWwrSjgrZEozMGJ4NVM4eGZzTGhDYmJPeWNic21ZUE9OZ0ZiR3FWWUcxR1FHQUxsY2FqZ2g1TlViUFVGUG56NEZuVTZIUm8xVDBLaHhDcjc5dGpFKytHQXQ1czFib0poR2lwbkVNS0M0OFZ4MGYvMTFITHQyN3NEU1pTdWcxZWt3WTNycHFqQ0h3d0cxV2cyWHkxbnRBTmFyZHgrNVEzZ3BxVisvQWY2My84cDlURHQyN0ZUcHd0VnF0WmoyMXR1bDNxdW80VzJidHUwcVpIbXRWNzgrbGk1ZldlRnZzeXlMdmZzTzNGU2dyOG94LzJtOGJzUTUyTzIyS2tVcTVhcWI2NVZQUC92aW1yNm5WcXVIYk5pd0llUEZGMS9jQmkvRnJrZ0JLcldTcC9DbWdZaWlLRktCRjhBVERvRUJBVVNyMVZHZFhnZTMyd1dudzF1Tm9GS3IwSzFiZDhUR3hxRldyZHJJeUxpSU9uWHFBZ0E2ZGVxTVRwMDZWM29lZHB1MVVqL29WWnVpZVhsNUNnV1JiMXBIQlJGUStJQ2FvcTNaN2ZZdUxNdE9ySTdKa1hYcEVoYk9ud2U3M1Z0K1lpNG9RR2hvS0xRNkhlbzNhSWdmcGFqZUgzOGNnVnFsUW5UMFAydHJvYUdoS01ndnFMQzdWRVZpTnB1aDErdWgxbWlRbjUvdnpZV1Npb2tOaGp5OHQzb2wzdjlnQXc3Ly9qdU9YRVg0dW5MSGJnRDhjblZqY3l2SHJMSmpSMGRIdzNHRld1ZUFnS3FadkZYZDczcC9LeWdvNkpWMzMzMjNoUkpNa0pyQ3lDYXBuQUlpaWdMaGVRRWN6NFBqUFBCNFpBWmVGeHdPQit3MkcwcUtTN3dNdlBsR0tibS9ha25xZHBzVjBkSFIxdzlzRG9lakZGdkhQd1FMeWlYaHBxV2xoV20xMnZFQXFxVU9xbWV2M3VqY3BTdGVIdllpbm4zbUthU2VQSUhYUjNwcDNLWk9tNDV2ZCszRTRFRURzWEg5T3N6NHo1d3FPVklUYXRWQzIzYnQ4UFNBSi9IQ3dHZGhOQnF1dUgrblRwMmgwK3Z4MUpQOU1IM2FGTlN0Vng5MnV4MDh6MlBtMjlQeDBzdXZvRmJ0MnBqNjF0dFl2SEQrZGZzOTVDZTlYOHBQK3NwS3NKaGJOR1oybXhWc0pScEdYRndjS0JXUmI4eXI4TnlTNjlUN1I5QUtDQWhFY3AwYngxajdEOGVNaTQrUEgvVENDNE5xeU9CR3k0TWJReWtsb2lnUWdlZkJjYnprYi9QQTdYTEI1WFRDN25EQWFyT2l1TGdJRnJNRkpxTVIyVm5aU2wrRnlzYlJaTWdGQ0NvdFA3d3FhdkRVMUZTa3BhVWhNek5UcVFYMU5VVjlLZ3lJckxWSnZqVkdvaUdheFRETWhCc3g2TGVLU3JtNnBUS3E0OHI5TFprd1d5eCtvc2t5WWpUa0lqSXlBb20xeTNPZlpXUm13bXkrK1dObU5PUWlJaUlDU1ZmZ1l6T1pUREFZRE9CNUhsYnI3YzlXNDNLNVZ2WHUzWHM5QUllMHVRQjRDQ0VjQUo0UUloSkNSSWxhWEtZdm9scXRsMW84SUNBQWdZR0JDQTRPUm8wYU5SQVJFWUc0dURqVXJsMGJ5Y25KNVRYRjRHQ29WU3JFeHNaV3FxMWRsWTh0S3lzTDJkblpNSmxNTUp2TkZRWUxQQjVQdWRRT09Wamdjcm1ldUZHZ2RyWE8xanRKcnZhNkVoTnJJei9mQktNaFYyRTV1ZHMxTlp2TkNvSG5Ld1ExQUVoS1RJVEpkUFBHVEQ0blVSQ3VDR3F5U1hxbEJYc2J5bXRaV1ZsbmE5V3F0VmYydHhGQ2xJQUNBSGhaUHdoa2NGT3BWTkJvTk5CcXRkRHI5UXF3aFlhR0lqdzhIRkZSVVlpTGkwT2RPblZRUzBvbnVscXBFckJaclZhbHNxQXNxUG5XZ1BxbWR2aWFvRWFqc1paYXJSNTdxNXl0ZDlLaXZOcEVWRUlJV3JWcWhZc1ptYkJZekNpeVdPQnkzWjBjYlhwOUFCaVdSV1JFSkJJVHI3d2cyclJ1amN6TVM4Z3ZLS2pXTWRQckE4Q3FWUCtvcWQzSlVyTm16Y0ZmZnZubDJhZWVlaW9ibDZPa01yQlJPWkxnSmFma0tjTXdoR1ZaeXJJc1hDNVhLU0pLR2V3Q0FnSVFISnRnME53QUFDQUFTVVJCVkJ5TXNMQ3dhMUppcXJTS1pOUFROd20zZ3NvQ1gxQ1Rxd3NJcFpTSmlJZ1lBNkRWalJ6TTZPaG9HQXpHZngyd3hjZGZmVG9ESVFSMWtwTlFKem5KYjROZXBiYWIrQzhGbTVzcGhKQ1dmZnYySFFCZ0ZRQkI2by9nalpaS3BKVHdFbE5TQ2R6QWNad0NiaXFWcWtKd0N3d01SRWhJQ0pyNGtDOVVWZjR4ZUpDVmxZV2NuQnpGbjFZWnFGM0JCTzFmSGFrZGlyUFZaSURqRG5lZU8rdzJyek1VOUlaeHNmbkZMemRUZERyZGtPenM3TTZReXEwb3BScEl5YnUrZ1FSQkVJZ0ViQXB1eUIydUhCTE5VVW1KTjBxYW41K1BuSndjaGVMb2htbHNkcnU5d253MVg4SklHZGg0bmk5bmdtWm5aOGVxMWVyUjFUV1k5OTU3TDR4R0k0d21FNndseFhja05ianNERTFJcUhtbitWYjg0cGRTRWg4ZlAyamp4bzJwUTRZTUVTUi9tK0JybHBZMVNhWHFCT3BMUkdtMzJ4V3RUUTRzaElTRUlEdzgvS3FxUEs0SWJHWHoxY3BFUG4zejFTb3lRVWxNVE13b0FQZFY1MkRHeE1SY2RTOU92L2pGTDlWaWtyWVlNR0JBL3lGRGhud0FnUGN4U1FYSkpCWGhaZDFWVEZLR1lZaEtwYUl5QzRodllLR29xS2lVcjYxUm8wWlZCN1pNbjZKVFg4blB6OGVaTTJkS01YZVU5YStWRFJ6NGNxeWxwYVgxek1yS0d1Mi8zWDd4eTEwbEwrL1pzK2RvdDI3ZERzdmdCaWxTS2hmTFMwMWc1S3A1aFZQdWN2ZXJ5NlpxV1RPMXFpMzhWSWxoUDVSN2srTUY1Ri9NQW5FYVFOeG1FRTh4Q0djREk5aEJCQmNndUFEQjQ5MUVqbEJSQUNnbDhqYjQvOXF3OWFQM2pQTGZZNy80NWU2VGhHYmkvOVZMcnZIMytZdUZQQUNCQUFKQVpiT1VnUmZOQUNxQ2lqeUY2Q1lRWEJTQ0F4Q3NJSUlPakdBQjRmSkJQTGtnN2t3UTV6bkFsb3I0NUZwUXEvNjU5MFdGd1lPc2JBc01wbUtZTFRZVUZUdGhzN25nY0xyaGRISnd1emw0UER3OEhBK09GOER6SWdTQlFoUXBSRW9KQlpqM2x3MGVDZUFCL3kzMmkxK3VUU2k5YzgrZFpabXVoL2RNZndSeUlNRWJSSkFEQ1N5VmlDbEZrVUlRS0hoZUJNY0w4SEE4UEI0ZWJqY0hwNU9EdyttR3plWkNVYkVUWm9zTkJsTXhMbVZWclZLbm5JK3R1TVNKM0x3aUZCUllVVmprZ05YcWhOM2hCVFdYbTRQYnc4UGpFY0J4QW5oZUpMeEFJUWlVaUpRU1VCREx4WGNic0N6emhuOXErc1V2VnljaUJReVdTSmdLd3lDSUxHeDNkanJpb0FVTEZoeVpPSEhpUmE5SjZnMG1lRTFTaUpJRlNrUkt3QXVFY2dKRFBEeEwzWndLVG84YU5wY2FKVTR0Q20wNkZGajFNQllGSXRzY0JFTnhDUEpLNGxBbmdVTmNlQUVxcTRvc0IydzV1WVV3NVpmQVVtaEhpZFVKbTkwTmg5TURsOHNqZ1JvUGp1UEIrMnByRktBVWhBSk1TSWorTlFBSi9tbnFGNzljSGFnZE8xY2ZZTU1RRkhKbjk4bVZwR1pDN2VUSEowNmN1Qm9BRDIrRVZINFZRUWdGdkczOENDRWdVck5sSXRFZHNTbzFWQ28xVkdvTjFCb3RORm9kdExvQWlDUVF4VFkxOG9vU2tHY093NzMxejFjSWJxVk1VV04rQ1F6R1loUlliQ2dxZHNCcWM4SGg4TURwNHVCeXk2QW15Q1lvNGIwbUtLRWlKWlNDT1BKV2RDZUV2UEp2bW5EanBtM0IvWDNmdVdHL3gvTUNSazMrQXRIMXhpRzA5cHNZUG1vVEhBNlBmMlhmNVdJb2pBVFlNTVRFeHY5cmtzNjFXdTJnUGIvdWE0N0xWT0lhU3VGREplN05uaEJGa1FpQ0FGN2dDYzk1QXdlYzUvL1pPKy93S0tvMml2OW10bVZUSUUxNkNVaEhhVkpFMEFBZlVrUkJCQ3NsSUFncUxZTFNsZDZEOU41RXBTZ0lpaUJLRVpBZWxDSUlVZ1VFRXRKN3NtVm12ajltZDVKTkl5Qk4yZk04KzBCMlpuYnUzcDE1NTIzM0hDc1dxd1dMUThaUDFUNUlKRDR1anVTVUZIUTZBK2dLY3pQZUw5ZHp1eGkyR3hFSlJNY21rNUNnR3JYVU5BdnBHZGJNdkpyRHNObnRzbUMzTzBKUUdVRUJBUkNOUnNQNzdrczBmd3diczVGTlAvek91czk2c1dsMUgzYnUrWk4rZzllNkorWVJSMVI4b2YrY1RpNUF1ZkxsTzJReGJBWlFER1NxVzRuTzFqQkpsZ1hKTG1HMzJ3V2IzWlpaRmJWbVZrVlRVbEpJVEV3a0xqYVd5SnVSZVB2NDN0cXcvWDA5VGcxQjQxSkpURW9qSmRWQ2VwcVZqQXdiRm91aldKRHByU0ZKTXJLc09Bc2NZa2JVdkRjRWdSZmRsMmplU0UyMU1HL3Bic0xHZHlDNGNTV0NHMWRpOGF6T3JGeHprSmhZTi9YUW93cEZBVW5TMzVHbmR1YjBId3dNdmZjcDdUTm5UaE0yYllyR2FlakV4bzNmRU5MbExVSzZkbklSNUltT2ptYmdCd040dTN2WGxpMWF0bXBNRmlweFJWSFVJb0tpaUE3bUh4UkhxNGNrMmJWMkR5ZkZVWWFqNVNNMU5aWGs1Q1NOVWp3eE1RbTdyTSsxMENJQ1dHMTJOUVNOVFNFaEtZM2tGQXRwYVJiU25VYk5XVEN3UzlqdGttQ1haQ1FaeDdJcHhJOC9hcTB6NkhYdlBlZ0w1T25ta3drZDloWEJiY0lJcWpHY0p4cU80ZnV0SjdUdGRadE1aUGpZalZTdFA0cmlsVC9pN1BsSUxCWWJZeVp2cG56TkVYZ1U3VU85cGhQWnNkdFZLTmRtaytnZCtpWGVKZnRUdlBKSGZEcHZlK1lQR0pQTUs1MFg0bGYyQTd4TDl1ZUZWK2R3NFZLVXRyMWoxMFhVYlRJUmdHTy8vMDE2dW8zZ1JwVzA3YzgyVkVYdkQ0WmZkTi9oanlnRUFWTFNoRHM2dG5LVnFvd2FNL2Flam0vK3ZMa3NXN3FFU3hjdmFpU3VBRmV2WG1IRCt2VXNXTFNVWmN0WGN1TEVNWTA4ZGY2OE9UUnI5ajlXZnI2S2Q5OTcvMVVQRDdPSE14ekZVU0VWQkVFSE9JMmJ5dHNtU1VpT1ZVdzJtdzJyTFl1eWZIbzZxU21wSkNhcUlXbDBWQlFKaVZLdU9UWTl3STBiQ1VUSEpCT2ZrRXBTa2xvRlRYTzBkbGlzZHF5YXB5YmhxSUk2dkRVMURQMTQ4RXU5S0tDQys3M0dnbVcvc0hWOVA1bzlWNFhOUC83T0sxMFdjbmpuVUdyWFVCYzd6NWkvazVVTHVtRXk2cWxVb1NnOSszM0JqenYvWU9HbmIxR3BRbEdXZnI2UEYxNmR3L0c5STZsV1JlWHJPbkQ0SXVYS0JuQjB6d2lPbnJoS2ozNmZVOGpIVE0rdWpRa2Q5alVXcTQzd240Y0MwRy93VjRTODl4bjdmMUlabWpxMnEwTjhnbHJldWg2UmdOR29KOEEvODhsc01PZ0k4UGZpMm8wRTl4M3VSZzdFeHNZeWNjSTRZcUtqRUVTUjk5N3JRNE9uRzNMdDJqVUdodmJIWnJQaTYrdkhpcFZmWktZN2huekVqUnZYQVZWMHlkUExpelZyMXdFcXJmK2NXVE5JVEVyRTM4K2Z3VU9IYVZvV0FPdSsvb29ORzlacit3UDBmS2NYUnFPUnNHbFRYTWIyKzRrVFBGVzNMcDZlbnRqdGR2eDgvVGh4L0RqMTZ0WG54SW5qZlBDQlN1amo2K3RicjBTSjRpMHVYYnEwR2JBNVhsb2hRVkVVMlJHU09sWWtTT2gwZHV4Mkd6YWJIcXZOMGFpYm5rNmFTUTFKRXhJU2lJbU53V1RJdmFkTm41NXUxWHJXRXBPeVZFRTFvK2JJcXpseWE0NFExT210Q1NmMmZWeElweE43UFN3WHdsc2Q2OUhzT1pXQThzVldOV2plcENvTGwvL0NvcG1xOW1XYkZrL3lXbnVWYUNRdVBwWFBWaDlnMVpJZXZOUmFWZjJlTnE0amgzNzlpeW16Zm1MbEFsVTV2VmpSUWl5YjB4V1R5VUNsQ2tYNTdmZ1Y1aXplUmMrdWpibDhOWmJTSmYwb1dkd1BUMDhqeStkMjVkcU5lRzA4YjNTb3AvMC9MZDJLaDRjK2x5U3JIb3ZWN3I2TDNjaUJyOWF1cGthTkdvUjBlNXRMbHk0eGY5NGNHanpka0ZLbFN2SDErZzJjUDMrT2llUEh1Und6YWNvMEFCSVRFK2o5VGc4K0dQZ2hvTXIyVFJ3L2x2RVRKMU84ZUhGKytuRXJDK2JQWS9TWXpPTnIxcXFWZzNrNEw0SGx4TVJFUER3OGlJNk9adEtFY1VpeWhJOGpUNWlZbUlqSnc0UHZOMzNIamgzYjhQVDBmTFZIejNmMkxGdTZ4T28wYkk1VkNaSWozNmJJaWlJSWFraXEyQ1c3WUxQckZMMHpKRFdvSVdsNmVqcXBxU2xxU0JvZmowRXZrcDR1WXphN2psRzhFYW1Hb1BHSm1UMXJHZW1aQlFPYnpkbXpsdFZiQTluaHJWV3RYTHduVU8xaHVSRHExSFNsb2FsZXBUaW56dHpRL3E3NGVPWkM4ek5uSTVCbGhZYjF5cnNjMC9qcEN2eHhKbE5YczI3dElFd21nL1ozL2FmSzhlZTVTR1JaWnNpQWxuei80KzhFUGo2UU5xL040YnNmVGxDOVN1N01yR1lQQTFhcmxPTjlpOFdPbDZmUmZSZTdrUVAxNmpkZzU0N3RyUHhzQlphTURNS216eWpRY2JJc00yYjBLTnE4MkpiNjlkVmc2cSsvTG5IdDJ0OE1IenFZN2lGZFdMMzZTNkp1dXVvTFZLcFVtVmM2ZEN6dytFNmYvb09SSTRieVR1OTNhZHJVdFNkLzBvUnhYTDc4RjJIVFoySXltYXAwNjk3amVWd0tDWTRLcVpvU0UxQzlObVJaUXJKTFNIYTdReXRCclpKYUxSWXlMQm1rcDZWcmhZVEV4RVJ1UkNibTlOalVuclVVa2h6ZVdyclRXN000UWxCbno1b2tDNUpkOWRhY3piaG53c2Y0NlhSaXo0ZnBRcEN6YVZ0bVdPem9kSm5GMzZ3R0pMdVZ6L29aV1lWK2pkbmNYYjFlUks4WEVVV1J0aS9VNVBxWktYeS85WGQrM1BrSHc4ZCt5L3hsdXptOFl4aWUyWXhWcVJKK1pHVFlTRWhNdzdld3A1YS9pNDFMcFdSeFgvZGQ3RVpPdzFhdlBuUG5MU1Q4U0RpZnIxeUIwV2hrekxnSnR6eHUyZExGZUhoNDBMbEwxeXk1WWh2RmloVnpDVnYvQ1FvWExreEdSZ1poMDJkU3FGQWhUcHc0VG1GZlgyM2JNNDBhMDZKbEs4MWJMRjY4K0t1OWVyMjdjL0hpaGRZczRhaWRMTHh0TGw2YlhSSjBkcnZpVWlXMVdFalBTQ2MxTlkzazVHVDBPb0dvYUpsaVJRdmg1V25LOU5oaVlwTkpTRXhYZTliU3JWckJ3S1pWUWVWTWIwMVd2VFZuYnUzeGNvKzlEVHorTUYwSTRVY3Z1L3g5Nk1nbGF0ZkluVTIxWXZraTZQVWlCNDljY25uL1FQaEZxbFRLekR1Y3ZlRDZWRHQrOG0rcVZWWUpJWWVNMnNENWkxRjBlZU5wVmkzcHdmNmZQdUxVNlJzY1A1bVRRNnAyamRLWXpRYjJIaml2dmJmdjBBVkVVZURwYkY2akcyNEFUSm80bnZBajRUUnYvanpEaG8vazBLR0RMZy9kM0xCdjMxNzI3TjdOOEJFZnV3Z1dWYWhRZ2FTa0pIN1pzMXZMdDMyLzZUdVhZOCtmUDhmR2pkOFVhR3hQMXFpQjFXckZaREloU1JJSEQreW5aaTFWeTdSV3JkcmFPSS8rOWh0QlFlVXdtVXpsKy9UdDE1eHNSWVRzWHB2czlOclVRa0ptbGRTbUNpOWJNakpJVDFkemJTa3BLY1RFSmhONTA5VnIwOGNucUNzTVVoM2Vtc1ZpVTlkc09VTlFtOE5iazF5OXRkLzJEUGZSNmNTM0g3cWN4SVpmZWFiKzR6emZ0Q29yVmgzZzVPbnJyRnJTSTlkOWZYdzg2TmVyR1lOR3JzZmJ5MFNsQ2tWWi91VitEb1pmWXVyV0Q3WDkvamh6ZzRYTDkvRHUyOEVjL3ZVdjVpemF4ZEk1WFJ4R0w1SStINjVoWHRpYkJQaDdzV0xWQWJ5OVRacGhYUHZORWVJVDBuaXZSekJlWGlaNmRHbE0zOEZyOGZIeHdHalEwenYwUzdwM2VnWi9QeS8zWGV4R0RuVHUzSld3c0Ntc1hiMEtXWllaT09nalJGRjBLUjRrSmlieVdzZFhxUFBVVXd3ZE5vSzVzMmVTa1pGQm4vY3lVOTl6NXkvQ3g4ZUhTVk9tTWZQVDZTeGF1QUJQVDA4R1poTlNQbmIwS0JzMnJLZDkrdzYzSEZ2WnNrRzBiOStCZDN2MVJFSGgyV2VEcVZldlBnRHY5K25INUVrVFdQZjFWNWpOWm9ZTUd3NkFuNzkvaC9hdmROaStjY00zTnNEcU1HNTJWR1VybFcxWGJkcDE1TnBVcnkxcmxkUml0V3E5YlRvUjRoTWtvcUtUS1Y3VVY0dVNoRm1UWCtWR1JEeFJNY25FeDZlU21Ld3VlazlOczJwTHFUSXNrbUMxU3RqdGlpREppcWdvaU5ibytmMTBPakhzWWJvSW5tNCttU2VxbHVEQ1g5RWNPbktKR3RWTE1YMThSNTU5Um0ycHFOdGtJaSszcWNuSWo5cG94MWl0ZGthTy80NHZ2anBFUW1JNnRaNHN6ZmlSYmZsZnNNcjk5T0hJOVp3NUY0R2ZyeWMvLzNJV25VNWthR2dyK3J6VEJGRGJQUVlNL1lydHU4NlFuSkpCblpwbG1EYTJBNDJlVm1YUU9uWmR4T1dyc2Z5NmU3Z2puMllqZE5qWHJQbm1DS0lnMExGZEhXWlBlUU1QRDRQN0xuNkVzZWQ0NWYrazZscHVpSStQbjFqamlhcmZBeWxBS3BBbUNJSUZWZDNLN2xDMWtuVTZuV0l3R2pFWlRZcUhod2tQc3hsUHN5ZGUzbDc0K0JUQ3Q3QXZvZ2dOYTBtVUQzcU1hbFZLVUQ1SXBUVVN4bzk4eVhVWmxjTjdTMDJ6a3A1aEpTUERKbGlzRWphYklraVNMTWd5WXVmWDYray9XOURqTVBEa3cyYllXald2enVpaEx6MnlONGlpZ0NDNHYvdkRNbWNGL2V4SHliQXBpdkpIbzRZTjN2Lzc3NnNwRHVPV0pnaENPbUJCbGV5VFJGR1VSVkZVREFhRG9oSlBlaWdlSGg2WVBjMTRlbnJoN2UxTjRVS0ZFUVNGZWsvS2xDbmxUNlVLeGFqNVJHazhQQXpvVXh5NXRZd01HMVpMMXRVRldSYTVaK3RiV3pxblc1ZUh6YWhsaCtEYisxLzNnMGVlbTBiUklyZS9yRVpTOUZ5T3FreDhraDVKRnNsSWZ6UlZxanpNWm5TaWduOGhPMEZGemlJS2ViZlF5QXBjaWFsTWJJSUpTZGJkc3psVHh5UVRXTmhDMmNmTzN0TElYYjkyN1ZINHFhb3ZXTGo0MlJmYnROcnB5TFhaRkVXeGdXQVhCTFdRSU11eUFDZzJteTNUSU9KWTZTU3JLeFU4VENhMXVUbEZJakVwazlvb3FFd2crdFEwaTRPNUkxdHVUWktSSkZtUUpNV3h5a0I5b1NEcTlib3VELzFUSVdIUkkzRXpwOXY5K1AxQ0tmUUdEM3dLdTNWRlUxTlRpRTlPSWlhaEtqVWZ2NHBKbjVpclVmdjEzQlBvOU9iN01tZXBxU25FSmljUkZmOEU5U3FkeXRlNGxTejFhQkRqRkM5Um9nM3dpOE93V1FHOUlLREgwZGVHcW13bHFNdlFCUVVFUVJRRVJSVFZiZ1JScDhOaXRTS2drSm9ta1p5Y1FYeENHakV4eVpRcTRZZVlubTVUdlRXclN5TXVkcnVFSk1scUpkUkJucVNBa0haemJtdWc4Y000V1lkMkRIM2t3dERJdUNMb0RSNy9LVmFJZndJdkwyK0tGaXVCVHU5QlJGenVpbCtYbzZ1aDA1dnYyNXhsanNuTWxaakt1QUdpS0RiY3MvZEFMVEpKS0EyS291aFFLNlNxTlZNVUZFVldLNlN5TTRyTXVwWlVsU1JJVDdlUmtwcEJZbElhc2ZHcFJFWWxJYVpyUEd0cXo1ck5MbUdYSEViTkdZSm1NbmdJUm9QdVRmZlA4dkFnTnRIMG4yU0YrS2Z3OWlsRVRLSXAxMjF4aWZvSE1tZmVQb1dJU1RDNWZ4d0hTcGN1bmIzMXc4bjhvWE95Zmpob2paQWx0ZjNEN2xna2I3ZlpzRHBhUU5JenJLU21XVWxPeVNBaElZMlkyR1QwRmtzbWVhVFdzNmJtMWdTMWIwMXhXRTZFaENzem54UUU0ZFhiQ2drZjRXVDJ2WjRmU2RZaHlUcTNwNWFIbDVRWUg0c3NneWk2enZlRG1qTjFUSEYzOUpzbkpTWnkrYStMcE9ham9ldmw1VTFRdWNjcFZMandYUm52dlQ2bndXQm91L2FyOVYrOThYckhDMlJTaCtzRlFiQTd3bEZabGV4VEJFbVNGVW1TQk1rdUtVNnZ6VzZ6QVFvV2kweDZ1cFhVVkF1SnllbkV4YVdpVjNOcldaZE55UTV2VFZhTEJnbzQrZGE4dkV5dkYyVEEvekdLNDN2N0ZQY0VuVTZpaUc5Q3ZsVEh1VUVuU285c29hQWdTRTlQZHpGcW9CcVVCemxuNmVscGQvUWcrK3ZTQmRMU1V2UGRKelUxaGN0L1hhUkdyVHAzWmF6MzQ1eTE2OVIrRHJpYUpkZG1kWGh0a3FLb3VUWkZrUlZWeFVweXBUYXkyeEZRc0ZnbE1pdzIxV3RMemlBK01RMTlGdjBDTmE5bXp5d2F5QTVYRUFWaDgxZDlQRVJSZUwwZ1J1MC9SbkY4ejVHYW1rSkVnbCsrVk1kM2l1M2JmbUxGOG1WRVJkMmtSSWtTZlA3bEdzNmZQMGVQN2lIYVBrT0hqK1NGRjlxNGY0aUhHTGN5TUZtdnBYL1RPVDA5dmRxMGU3bjkrdSsrM1dqSnpMVmhFd1JFVUJ5NU5rRlFGQmxKa2hWSmxnUzd1a2dldTkyR0FGaXRNaGtXRytucFZsSlNNMGhLU2tlZm5VRFNuaVczbG5YNVZQT20xVjRGU3Q5cW9Ga3BqdDBvZUlqaTVlWE56VWlabS9GK0ZQT1B2eXVmZStQR0RhWk1uc2lZY1JPb1Y2OCtTVWxKQUZTb1VKSHRPM2NEOEU2UGJ2ZnNleTFmdHBSMkw3Y25JQ0FneDdobXpaak95Wk8vWXpRYWFmNThTOTU3djQvR0tuSHQyalhtekpyQnlWTW5NWmxNdEdqUmtsNjkzOHZCT25FM2NhdHpQdGU0SVFhREFVRVFDUW9Lb251UG5qUnExTmg5OGY1emxCcjU4YWdHMzMyN2NSZmFFaXRGRDBLbVBvSktJYTVremJXcGkrUWxRTUZxazdGWTdHUlliS1NscTdrMjBSbUNTcEtjMmVJaFo3WjQ0R3p4ME9rS3RPVC92MHB4ZkYvQzBueW9qdThFWi84OFEyQmdJSTBhTmNab05CSVlHT2dJeHdSTUpoTW1rOGxsTGVIZHhtY3JsaEVYRjV2ai9kR2pSbEt5VkNrMmZyZVp4VXVXYytqZ0FUWnQrbGIxK0dXWm9ZTS9wRkxsS256NzNXYm16Sm5QbnQyNzJMamhtM3Myem9LZWMrNzhoWHkvWlN2ZGUvUWtiT3BrTm55ei9vRmNKNElnVUtkT0hWcTBhRUh6NXMwcFVlTDJuQWhKa3RpL2Z4L0RobnpFdGIvL3ZpOHBnYkZqUnZIV0c2L1J2VnNYenB3K3JXMzcrK3BWeG84YjA0d3MxVkVjNjBlZERMdVNKQW1TSkFtS0lndVNhdHdFcDdDeUpLa1JwOVZxZC9IYU5NUG0wdDRoT1NtLzFSYVArS3N6bmhBRVd0N3FDL3dUaW1NM1ZNOHRMNnJqMjhIeDQ4ZDR1VzBicGsyZFRHUmtKQyszYmNQTGJkdXc4ck1WQmY2TVF3Y1AwUG10TjJqZUxKZ2UzVVA0NDlRcGwrMTdkdThpcEdzblhtajFQTjI3ZGVIUXdRUGF0bjU5MytmbHRtcG8rOEdBL3J6Y3RnMTkzMzlYTXlMQndVM3BHdElOazhsRWthSkZxVnV2SHVmT25nVWdMaTRPUDM5L09uWHVqTkZvcEZUcDBqUnEvQ3gvL25ubW5zMzc3WnpUYkRiVHFGRmpoZzBmeVpMRkMxMFlaZThYeXBVcmgwNm5ZOXUyYmV6ZHU1ZWFOV3RpTUJoeU5kaTUvWDlBLzc3OHNtYzNaODZjUnBLbDJ6cDM0OGFOMGV2MWVUNGdjdnQ3M2RkZjRlbnB5ZXExWHpONDhGREdqeHVENHJqSVo4Nll6c3Z0WDJtMlp1MjYwbVRUSHdWMGdpQUlvaWc2MTQ0aWF6VUFTWHM1cWRXc0Zqc1pHVGJTMHF5SXpvS0JYU3NZT0xVTXRLS0I0TzNsMGI1Z1Q1STdwemgyUTBWS3F2Q1BjMnkxYXRYbTIwMWJHQkE2a0pJbFMvSHRwaTE4dTJrTElkMjZGK2o0aXhjdThQSEk0YnpYcHk5YnRtN2oxZGRlWitBSC9UWHVyaXRYTGpOKzNCaUdEQm5PNWg5KzRxV1gyakZpeEREUzB0U2svSnk1OC9sMjB4WUFac3lhemJlYnRqQjMva0lBUkZHa1UrY3UrUHFxbnVsZmYxM2l3UDc5Tkdqd05BQ0JnWUhNbVRzZkR3K3pkbk1jUDNhTUdqVnEzck01djVOejFxdmZBS3ZOcGhuays0bkF3RUJ1M0xqaGNDWlVpaTAvUDFkUC84aVJjRVlNRzRMTlppTXVMbzUzZW5RbkxrNFZHLzUweGl5R0RSOTVSdzVJUUVCQW5sNytod05ET1g3c3FHYk1Gc3lmNTdpZXptdS9iOVZxMVRFYWpWeTdwbnFLNTgrZm8wR0RwNmxWdTFhRFhMdzJFUkFWQlVFUUJMWHRROGxhUkhDMGdOaXplbTEyMGpPc2lIWkoxc1JabkdHb3JHU3llS0FvZ2lnS0wvK1RIMkxRd0ZCZTY5aWVrQzV2MGJYem0yelovTDJXMTNpdDR5dTBiL2NpM1VQdTdXS0c3aUZkdUhqeDluUUZ0djMwSTY5MWZJVVhXcmRnOXF5OENmNTI3TmpPNkU5Ry9tZU02K2JObXdodTBwUkdqUnBqTXBsbzFmb0ZxbFN0eWphSGtFZEFRQ0RMVjN4T3RlclZFVVdSbDlxMncyYTE4dmZmVnd0OGpqOU9uYUpGODZhRWRPbEVsYXBWZVM2NFNhNzdMVnd3RDdPbkp5KzB1WDg2UVFVNXB5QUkrUHY1azVKNi8wVjRqRVlqa2lRUkVCQkE0OGFOa1dVWms4bTFQNjV1M1hyNEJ3UXdadlFuREJvNGdQYXZkTURmMzE4Ny9sNmdUOS8rVEp3d25ybHpaclAxaHkxMDZhb1dxQjZ2VUlGZjl1eEJsbVV1WGJyRXpadVJwQ1NyOC9iNDR4WFlzM3NYWGw3ZXpiTVpOWDJtY2N2c2FWTmtSempxMUVlUVZNZE1WWktYc0ZodHBHZllFTE1ZTmExZ0lDdUFvMmlRR2pHM0dYZUJJZmVqSWNOWStjVnE1c3hid09jclYzRHAwaVdOM25ocTJLY1A1UTNlb21VcnZsNi9nVzdkM3VaUlFtUmtKTVdMdStadHlwUUpJakpTWlJYMjl2Ym10OTkrcFhldkhuUjY4M1c2ZGUyY2F5aVNINm8vOFFUYmR1emlxM1ViaUlpSWNGRTRjdUx6bFo5eCtQQWhKazZjbkdmNGM3ZFIwSE1xaWtKY2ZCemVEeWp0VXE1Y09hcFdyY3IrL2Z1MW9sQjJ3OXU3OTNzYy9lMVhURWJUUDNvd21NMW1PbmJzU01lT0hURVlETFJyMTQ2T0hUdnkyR09QdWV6M2VJVUs2ajN6MVJwNjlYNlhRb1hVWFB1cnI3MkJUcStqZTdjdWZQSDVaM2g3ZTJQMlZMM2pRUjhPNXVlZmQvSjI5NjVWdW9hRVZIRVlzNng1TnAyaUtDcFhtM00xZ2l3ak9VTlRXZFk2T2xTdlRjSmlzYUdYc3F3eWNEVGtPc05RQU1GazByZTltejlJNGNLK1BQRmtEUzVlT0UvNThubVRLeVltSmpCNTRnU2lvcUt3MjIxMDZ0eFZZK004YytZME0yZE1KejB0alNKRml6RjAyQWd0TWI1NzE4K3NYdjBsbG93TXFqL3hKQjhNL0ZETFArejZlU2RqUjM5TWVub0dmZnYxMTd5RWI5YXZVNVBYaWtMVFp2K2pXL2NldC93ZVI0NkU4K24wYVlpQ1NNbFNKZkUwZTJyYjhodEQ4MmJCOUIvd0FVdVhMRUpSNFBzdFd4ODZ3MWEwYUZFaUl5SmMzcnQrL1JxMWE2dTlTbnQvMmNPcUw3OWd4c3pabENxdEZzcWZhOXd3MTVzcnU3R3paR1N3ZGVzUHRHNzlBaVlQRDRvWEwwN3o1cyt6Yjk5ZWwvM1dyL3VhN2R0K1l0YWNlWGV0NGZSV3VKMXpIamtTanRGZ29GTGwrNzlFeW1xMVlyZmJPWHBVRGZ0ME9oMFdpOFUxcFpHU3drY2ZEYVJ6bHhET25mMlRLWk1uTW5UWWlEc3FGcVducDdOK3ZWb29hZGV1SFQvODhBTlpGNmRualhCMjcvcVo4Uk1tTVQxc0doTW1UYVpTcGNxWXpXYUdEaHNCUUZKU0VtKzgxb0VTSlVvQ1VLcDBhVDZkTWN0eDMreHErUG5LbFg5a05XeUNJRGpDVVVYSUducXJLVE1KUlJHUUpBVzdYZlhhYkRZN0ZvdGREVVZWYjAwV0hFVURUYWhGVVJSUkVJUzdHZ05FUjBWeDZ1VHZWS2xTTmQvOXpwMDd4LythUDgreUZTdVpNM2NCczJiT3dPcFlHemJxNHhHRWhnN2s4eS9YOE13empWaXlhSUdXcjFtL2ZoMXo1c3huNVJlckFmaGh5MmJ0TTMxOGZGajV4V3BHanhuSC9QbHpBWlZZYi9QbVRTeGN0SlFseXo3anQ5OStZOWZQTy9NZG04VmlZY0s0TVl3YVBaWXZWNitsVE9teTJyWmJqY0Z1dHhNVkZjVzZiNzVsL1RjYkg1anhjblp2QXlpeWpOMXUxNHhRbXhkZllzK2VYWVNISDhadXQvUHp6enY1NDlSSldyUlU2MGV4c2JFSUFvZzZIWW1KQ2F4ZTlhWGpjMXlySHNWTGxPRFF3WVBZYkRhaW8xUkpRcVBKeEJlZnIyVHQydFhZYkRZU0V1TFp1L2NYYXRTb2tSa0tmNytKYnpkdVlPYnN1VnI0ZE0vRDd3S2UwMkt4Y1BqUVFTWlBta0R2ZDkvSHkrditFNFJHUjBkckJzcG9OT0xyNjB0Q2dxdksyY1dMRndnT2JzcGJuVG96OHBQUkdJMG1MY2QycjNEeTVFaytuVEdMNTRLYk1PTGpUL2p0MXlNdTI1T1NrcGcyZFRJdnZ0UTJSemo4OTk5WFdiWjBjYk1zSWFoV1JIQjRiS0lnQ0M3THJGUWFOZGxSSTNETnRlblZTcWlzZVd1eXltRXBBRUo2NUx6V1FNbTc4YVduaDAzRjdHSEdhRExTcDI5L1NwY3BrKy8rTld2V1l2bXlKV3piOWlNNm5SNkxKWVBrNUdRUzR1UHg5dmFoYXJYcUFMelV0aDFObXpVRDRQRGhRMXo3K3lydjluNUhlN0o1ZS90azVoMGM3SjVWcTFYVEV1SGg0WWQ0L3ZtV21NMnFhL3ppaXk4UkhuNllwczMrbCtmWXJsNjl3bU9QRmRHTWM1VnExZGozeTU0Q2pRR2dhMGkzZTVibktBaXlOK2hPbVR5UktaTW44bnlMbG56OHlXZ3FWcXpFcURIaldEQi9McEVSRVpRcFc1YXBZWjlxTW0ydFgyakRxVk1uNmRHOUt6cWRubll2dDZkaXhVckV4YnZlT0FNSGZrall0S21zV0w2VU1tWEtzSFQ1U294R0kxT21oakYzeml5K1dyc0dnOEZBY0pPbWhEakNmVW1TbURaVkRRUGZmTjIxdytqekwxZFRyRmp4dXo0ZkJUMW52ejd2SXdncWMreWdEd2ZmdFQ0MlJRRnZ6NEtYd2k5ZnZveXZyeS9ObXpjSDRQang0MWl0MWh6M3c2MkF1UUFBSUFCSlJFRlVUODJhS2syM1hxOW5VRGFtM0R2RmQ5OTlsM2N1UGNzNWF0V3FUYTFhdGJXL0Z5OWF3TzVkdS9oZjgrZHpGTEg2OTN1ZmxPUVVRcnEvWFdMMDJQRlBObm11MGEvWjhtdzJRYlhrem5CVVVZc0lNb0tnZW15U28xYmd6TFhwSmFmeWxIUDVsSnBiQXhDTVJsM3J1M1h4RFBwd3NFWWJYQkNzWGJNS3U4M09sS25URVFSQmF4OXdoamhPR0F3Ry9QelVKNnpOYWlPNFNWTk5iaXkveEcvV0VDbXJkeTRJZ2xhS3ppKy9rbGV6YUVIR0lHWmY1M09QMExKVmExcTJ5dmtUVnF4WWlWLzJIY3ozMkVhTkd1ZDU0NXBNSmtaK1BNcmx2WGQ2NWVTL3E5L2dhYjVldnlISCt4VXFWbVRtN0xtNWZyWk9wMlBQM2dQMzFkQVg1SnkzbXE5L0FrRUF2YzVPYW1wS2dTcVZpcUp3N05peGYzemVWV3UrdW05ejNLdjNlL1RxbmJ1bSt1dzU4N09tS3VvQng3T0ZvN3BzNGFpZ3lMSWlTWFpFUVVTU0JNZmlna3l2VFpTZFlhaWpHcXFTdVdsaGFHc2VFS0tqWS9EMjhVWVFCSTRmUDBaU1VoS0tvbEM2VEJtU2s1TTVmLzRjQUQvOXVGVVRjcTFYdno0Lzc5eko5ZXVxV096T25UczRlZkwzZk05VHQyNTl0bS9iUm5wNk9qYWJqUisyYkthK296U2RGOHFXRFNJNk9sb3J1VWZjeUpUM3U1TXgvSk1udlRsTGJzK043RWx2enh3OWdROTZ6bkliRTBBUjN3UlNrL01XemZiMExGaklXOUQ5N3VabjNjMXptanc4bW1UejFwdzliYUxqNVNEbFVBUkpraEFFdXlBN284NHNYcHRlQzBNVkJTVkxHSm9XTWJmcDNRcEQ4MEorZ2hTdnZmWTZZOGVNNG9jdFc2aGNwUW9WS2xZa01TR0J3TUJBeG93Yno2ZGgwN0JZTEFRK0ZzaVFvV3Bpc2txVnF2VHJQNENoZ3ovRVpyZFJMcWdjZzRjT3kzY01UOVd0Uzh0V3JYbTNsMW93ZVBhNUpqUnQya3hMaGk1ZHNwaVUxQlJrU1dMZjNyMTA2UnJDUzIzYk1YVDRDRVlNRzRLZnZ6OTZ2VTRySHR6SkdQN0prMTRVNVFJLzZSOGxwS1lrSTRweWpwNUFkYzZrQnpKbnFTbko2RVFwMXo3Rll2NXgzSWoxSnlwU3djdkhMOGZZeXBXdmNNdEY2WjZlWHBRclgrR3VqZmRCbkJNb3NYM0hyc3JQTjI5NmdpdzBSazZqcGhvMkJGbVdIZTRiU0xLZ2RYWTRLNlJDa1VBekZxdGRzRnBsN0pJaXlLcFlpODRXczJDU0tBb2YzTzZvSGlYdTludUJpK2YvSkxoV3dacytMMGRWSmphNWtIdHRiamJjakx4QlFLRWtnaDdMT1plWG95c1RtM1QvNXl5L01UbTl5YWo0UWtUR0IyQ1RqS1Erb3NRdDZlbnBTMXUzYnIwS1ZROGhHVlh3SmQwaCtHSVRCQ1JSRkdTRFhsQ01SaEdUVWErWVBReVl6UVk4elNhOHZFem9uV0dva29YSlExRVVVUlNGNXZjNkNlcEdUbmg3S3JmRjExVW04RHhSOGRXNUdYa0RieDgzTlhocVNqSXBLY25ZYlJtVUNUaVhleW9oOEN4UmNVL2V0emx6amtteXAxTTI4R3krSG5oUi95U0sraWM5NHFJOFNrUGdxeXpocU03QjlxRldSeEVjQytOQmxoVkZWcHQyRlVsUzFBcXBYVUtmclNrWEJZUzR5ek9xY1FkaUxiZWJCSFVqNXcyZzE5bHY2NElXUlptNmxjNXdPYm95Y1lsV0V1TGl5TWg0TkIvMVpyTW5vaWdUVU5oRzJjZk9JUXBLbnRkcHZVb251UkpUbVpnRXl6MmRNN1BaRTUwb0VlQnJvV3pnMlFML3RvOHlPYXNnQ05XM3J1OWJ2SFhIdVg5cHhrMUJoK0RJc1lFZ0tLck5rbVhVYmc1SFpkVDUwcXZVMzluV2hucDdOTG5UUVJYeFRTQWlJY0Z0Mk80QUtTbUpsUFM3ZmNvaVViQlR2c2dmbEMvaWx0KzdIY01SOU5oWmdoNTdPT1QzM0hERlU3V0NxZ0YvT3cyYkFqb2hhd0ZCemJVcGlxTk5UWEtzUm5EMHR5RTZ2RFVCYlcwb2drNFVuN3ZUQVJYemowT1JFb2k2ZVkyMEI3Q083dCtJdE5RVW9pS3VncFJJVWI5L3hzWDJhRC9wSDc0NWN4dTFPNE92cjJjdDFLS0Juc3dDZ2lyMG90R3BLWUtzSURpOE5rR1dsU3dlbTVPZXlPR3hEZXJYVENjSUJQK1RIL0twU3BlNEdlL0R6ZmdBa2hPTnBLUzZmNmk4NE8wRkJwMlZVb0Z4RlBGTmNrK0lHMjRBQnIydVljM3F4UXduL29qVVp3bEhSUVJFQlVVQVFWQVV4eElyeGJHNHdFRzdKc2t5Z3BkWko5anNpaUNwMVZBeCtmcnNwcDVtNDQvdXFYWEREVGNlSkk2ZXVOTG5xZUNKcDhoU0hSVUUwZ0dySUFnMlFVRFdhZFZSSFI0bXZlTGhZY0JzTnFLM1Mxa1d2aXVLY0RNcXNlSDk2b3gzd3cwMzNNalRhelBvS2dOL1pnMUZGUVZSRUZBN09CQ1FaUVc3QklKTlJoRHNhc2dvZ09EaDRTSGE3WFpCVVJSUlVSU2QzVzdmSkFqQzgrNXBkY01OTng0azdIYjdib1BCTURHTHg1WWlDRUlxWUJFRXdTb0lnaVFJZ3F6WDZ4V2owYWc0Nk80VnM5bU02RndYcVNpSzhPcXJyK29FUVdqb25sSTMzSERqUVVPdjE5Y3RXN1pzMXNLQlZrQndPR0t1VkVaWlhvTFJhQlFsU1JJVlJkRWxKaVkyOVBiMjN1V2VVamZjdVA5UUZJWEl5RWh1M294Q2tpUlNVcElmK1RrNWRlcFU3NzU5KzU1MWVteU9WN29nQ0ZiQTd2VGFkRHFkb3Rmck1SZ01pc2xrUXArVnljTER3Nk91Ky9KeXc0MEhZOVNPSFR1R2dxQ3RobkRyOFlLdi8yUGxnUXRrYWZ0d2tFOXFqVFNDSUNBSUFxS29RNi9YbzljYk1oZVdBb0pPcDN2cTMvamxRME5EYWRXcVZZSDJUVWxKUVJBRWR1L2VmY2ZucTFXckZwTW5UNzdUdkFHaG9hRVVLVktFd29VTDA3dDNiMDBFeFkxSEY1R1JrU2dJRkMxV3d0M2NuZ1UrUGo2VnM0V2hvcE40TXF2dFVobUpaTFdmVFpIVkhKdHpuYWdnQ0hYY1UzbHZNV3pZTURadDJzUzZkZXZZdEdrVE8zZnVwRisvZnU2SmVjUVJGUlh0MXVQTkJRYUQ0UWx5NXRpeUdUVUZsVzVOUVZGa0ZGbldkdUQ4K2ZORmdFcnVxYngzU0UxTlpkNjhlWVNGaFJFY0hFeHdjRENMRnk5bTVjcVZ4TVRFdUNmb0VZWWtTWGZrcVowNS9RY0RRL3ZmOC9HZE9YT2FzR2xUMk81UUtuTmk0OFp2Q09ueUZpRmRPN2tJOGtSSFJ6UHdnd0dFZE8xRTN6N3ZjZlhxRlczYmlSUEg2ZmwyTjdxRmRHYjBKeVB6MVdZVkJLSEN5STlIZWVkajNBQUVIQXNObk0yNnpxcW9VS0pFaVNmL0t4ZkpkOTk5Ui8zNjlUR2J6WGg1ZWRHOGVYUE9uWE5sZXZqbGwxK29WcTBhSGg0ZU5HdldqTC8rK2t2Ykpzc3lZOGVPcFhUcDBuaDdlOU9vVVNQMjc5K2Y2N21pbzZONTVaVlg4UFB6dzl2Ym14ZGVlSUVMRnk1bzJ3TURBL253UTVWTjk5aXhZNlNucHhNY25MbXc0OWxubndYZzRNR0Q3cnY3RVVaeThwMnRPcWxjcFNxanhveTlwMk9iUDI4dXk1WXU0ZExGaXk1RzZPclZLMnhZdjU0Rmk1YXliUGxLVHB3NHhwRWo0WTVqNXRDczJmOVkrZmtxdW5WL215bVRKbXFwbUVrVHhqSHlrMUY4dHZKTFNwVXVvMmxtNUlWbm53c3U0VEJrTG9TVGpyQlVXNEdnS2xpcFhwdm0waGtNaHYrRVlmdjk5OTk1NVpWWDZOeTVNMmZPbkdISGpoM2N2SGxUTXk1T3pKbzFpMG1USm5IOCtIRzh2YjFwMXF5WnByd3pjZUpFbGl4WndwSWxTemg1OGlRZE9uU2dlZlBtbk0xRkhEYzBOQlNMeFVKNGVEakhqaDFEbG1WQ1FqTDFCQVlOR3FSeDAxKy9maDJqMFVoQVFFQldWNXVBZ0FDdVhidm12cnZkeUlIWTJGZ0dEUXdscE10YmRBdnB6T0ZENmdQUXFjbmJvWDFiUXZ1N3BqS0dEZmxJOWFLNnZFVzdsMTdnelRkZTFiWmR2SGlSMFA1OTZkNnRDNE0rR01ETm01RXV4Njc3K2l1WC9RRjZ2dE9Mc09rektQLzQ0NjczMm9rVFBGVzNMcDZlS3NtcW42OGZKNDRmMTd5eTU1NVRIK0NGQ3hmbXp6L1BZTFZhaVl5SXdNTnNKaWlvSEFEKy92NmNPSjQvelhueFlzWEtaREZxamp4YjFuQlV5UXhKMVR3YmVsQjcySFE2WGZYL3dvV2dLQXFmZnZvcC9mdXI3bmxRVUJBaElTRXNXTERBWmI5UFB2bUVkdTNhQWJCaXhRcEtsU3JGNXMyYmVlbWxsNWc4ZVRMTGx5L1hDaElEQnc1azE2NWR6Snc1TThmblhMNThtZEtsUzFPeVpFazhQVDFadm55NWk1RWFOaXlUUFRjdExRMFBENDhjWXphWlREbmswOXh3QStDcnRhdXBVYU1HSWQzZTV0S2xTOHlmTjRjR1R6ZlVOSG5QbnovSHhQSGpYSTZaTkdVYW9FcFk5bjZuaDZhL1liVmFtVGgrTE9NblRxWjQ4ZUw4OU9OV0ZzeWZ4K2d4bWNmWHJGVXJoNTVIWHNKRGlZbUplSGg0RUIwZHphUUo0NUJrQ1I5SG5qQXhNUkdUaHdmZmIvcU9IVHUyWVRRYVNVbEpJU2twQ1pQSmhOVnFaZTZjV2R5NGNTT0h3bFoyZUhsN2w4dGkxQndHVGhFZEZBT09YamFjdFFKRlVSUkI3Mnh5RXdUaFAySFlhdGFzU1VCQUFOT25UK2ZNbVRPY1BYdVdYMy85bGFKRlhZdm5qUnRuQ3BVRUJBUlF2bng1L3ZqakQ1NTg4a2xTVTFQcDFxMGJiNytkS1pSc3RWcGRqbkZpeUpBaHZQbm1td1FHQnRLMGFWTmVmUEZGdW5idG11dll6R1p6RGpVaFVDWGRIb1NNbXhzUFArclZiOENjV1RNQWdmcjFHeEEyZlVhQmpwTmxtVEdqUjlIbXhiYlVyOThBVUtVaHIxMzdtK0ZEQjZ2N0tESmUyZlFLS2xXcVRLVktCZGRLUFgzNkQ0Nk5HRXJvQjRNNCsrZWZYTXlTaHBrMFlSd0JnWUdFVFovSnF4MWVkakdJQXo4WXdJc3Z2a1NIanE4eVl0alFmTTloTUJncVpNdXQ1Y3l4b2FDQVZrRFFaMjZnNm4vaFFqaDQ4Q0RObWpXalNaTW1ORzNhbE5kZWU0M3c4SENXTGwyYTcxTklyOWRqTkJvMXJjMDFhOVpRdmJxcnJjL04yMnJidGkzWHIxL24rKysvNThjZmYyVDQ4T0hNbnorZnc0Y1BheTY2RTZWS2xTSWpJNE9FaEFSOGZYMEJzTmxzeE1iR1VySmtTZmRkN0VaT3cxYXZQblBuTFNUOFNEaWZyMXlCMFdoa3pMZ0p0enh1MmRMRmVIaDQwTGxMNWtQV1pyTlJyRmd4VnF6ODRxNk1yWERod21Sa1pCQTJmU2FGQ2hYaXhJbmpGSFpjMTRVTEYrYVpSbzAxa1hOVmh0S2JRb1VLa1pTWXlJU0pVM2o4OGNjNWUvWlA3VjdJQzRJZ1ZNNlNXOHVhWjh0ZVFGQ2NCUVFSRUtLaW9pb0Jwdi9DaGJCZ3dRTHExNi9QMXExYkdUeDRNQzFhdE9ER2pSczVKUFd5NXN1U2s1TzVlUEVpMWF0WHAzejU4cGhNSmk1Y3VFQ0ZDaFcwMTZKRmk5aXlaVXV1SHR2NTgrZnAwcVVMcTFhdFl2LysvWnc2ZFlyampseERWdFN1WFJ1ejJjemV2Wm1xNS92MjdVTVVSWjUrK21uM1hleEdEa3lhT0o3d0krRTBiLzQ4dzRhUDVOQ2hneTdTa2JsaDM3Njk3Tm05bStFalBuYVJxcXhRb1FKSlNVbjhzbWUzbG0vN2ZwT3JUdWo1OCtmWXVQR2JBbzN0eVJvMXNGcXRtRXdtSkVuaTRJSDkxS3lsYXBuV3FsVmJHK2ZSMzM0aktLZ2NScU9SWXNXTFU5alhGNVBEc2RpM2Q2OTJURDR3TFY2NlBEQVhnNmIxc0FGWlBEWkhqczNiMjd2Q2YrVkM4UGYzWitmT25adzhlWktTSlV1eWJ0MDZsaTFiaHArZm44dCs0OGVQcDNIanh2ajYraElhR2tyRmloVnAzYm8xb2lneWNPQkF4bzRkUzdGaXhXallzQ0hyMTY5bnhvd1piTisrUGNmNXpwNDlTNTgrZlpnM2J4NEJBUUdzV0xFQ2IyOXZxbFJSQlcwbVRacEU3ZHExYWRXcUZWNWVYdlRvMFlPK2Zmdmk0K09EMFdpa2QrL2VkTy9lL2I0cG5ydng3MExuemwwSkM1dkMydFdya0dXWmdZTStRaFRGZkJYZTVzNmVTVVpHQm4zZTY2Vjl6dHo1aS9EeDhXSFNsR25NL0hRNml4WXV3TlBUazRIWmhKU1BIVDNLaGczcmFkKyt3eTNIVnJac0VPM2JkK0RkWGoxUlVIajIyV0JOTy9qOVB2MllQR2tDNjc3K0NyUFp6SkJodzdYSWFQaUlqeGszYmpRMnE0M1NwVXN6ZU9qd1c1NnJRb1dLandIWGMvZllIRG9oR3Jla2dpQ0tvb2ZGWWhtZzErc24vMXQvL05EUVVQNzg4MDkrL1BGSFltTmo2ZG16Snp0MzdzUmdNUERVVTAveHhodHYwTE5uVDY1ZXZZcXZyeTgrUGo1TW5UcVZsU3RYOHZmZmY5T29VU01XTGx4SUdZYzZ2YzFtWTh5WU1YejIyV2ZFeE1SUXVYSmxQdm5rRXpwMDZPQjRHdFhpalRmZVlPalFvVVJIUnpOZ3dBQzJiOTlPY25JeWRlclVZZHEwYVRScTFBaFEyejI2ZGV0R1dGaVlsazhMRFExbHpabzFpS0pJeDQ0ZG1UMTdkcTVocmh1UER2YnMyZU5XZDhzSGNiR3hZVFZyVk4rT3VtYlUrVW9UQkNFRFZTbGVFa1ZSWFROcU1DaUNJQWhtdTkwK1V4VEZYdTdwYzhNTnQyRjdHSkdSbnI2NllvVnlYMlF6YktsWkRKdGRFRVJacHhNVnZjR2c2QjNKdWFCLzZ4ZWVOMjhlZmZ2Mi9VLzhlSkdSa1RtcXR3V0JMTXRjdm5LVnVMZzRKRWtpSS8zUlhIdnFZVGFqMCtudzl3c2dLS2dNK1JHbUtvcmltTE5ZN1BaN04yY2Vaak42dlo0QS93Q0Nnc3JlY3YvcjduN0dYQ0ZKVW5FY1RibFpYNHFpcGhIVjdnNFpXUWJKTGlFSWd1QXB5L0pSb0xKNyt2NTlzRmlzbkRoeEFwMWU3OVlWQlZKVFUwaEpUa0tTN05TcVdRdWowWkNyVWZ2MTE5OFFkYnI3b3l2cUdKTXNTOVNyVzlmdHNkMEJGRVU1WDZaVThRL0lKSjEwRWs4NnFjTHRqbkJVMGV2MWlyTzZVTlk5ZGY5T1JFUkdvTlByM2F3UURuaDVlVk8wV0FsME9qMDNJbTdrdXM5Zmw2OGc2blQzYmM2Y1l4SkZIVmV1WEhWZnRIY0FRUkJLWi9QWXN2L2ZwVmxYUEgvK2ZGSEFuYm4rbHlJMkp0Yk5DcEVMdkgwS0VSTVRtK3UydUxpNEJ6Sm4zajZGaUlsMWt4M2NhVlQveWVneDN1VFo4dUhVYlFGUTBBY0VCQlIzejltLzFUMi9jMWFJUjhGelMweUl5M1hiZzVvekx5OXZFdVBqN3VqWXBNUkVMdjkxa2RSOHRIcTl2THdKS3ZjNGhRb1hmbUR6ZmkvSFdiVkt0VUpBVEM3ZW12T093Tm42b1RlWlRFWHYvZzNucGpndUtIeDhDcUhUaVJRcFVvVGl4Vy92R1NNSWtKN3VKcW5NQytsNUVIZyt5T0xLbmY1ZWYxMjZRRnBhL2dLOXFha3BYUDdySWpWcVBUaGF4WHM1enNlS0ZDbVUzVnR6RkE4RTEzQlVVZlE2bmU2dUdqWTN4Zkh0SXpVMWhSc1JrZHlJaU9DcE9uZjNvdHkrN1NkV0xGOUdWTlJOU3BRb3dlZGZydUg4K1hQMDZKN0pRREowK0VoZWVLR04rNGQ0aUhFclk1SDFXdnF2anJOUW9VS0ZzaGd3WjNPdTRGZ01ueldTRWZTaUtENTJONzlZVm9wak53b2Vvbmg1ZVJOMU00TEl5RWlLRlN0MlZ6NzN4bzBiVEprOGtUSGpKbEN2WG4yU2tsVE9yd29WS3JKOTUyNEEzdW5SN1o1OXIrWExsdEx1NWZZdU5FM09jYzJhTVoyVEozL0hhRFRTL1BtV3ZQZCtINDFWNHRxMWE4eVpOWU9UcDA1aU1wbG8wYUlsdlhxL2w0TjE0bTdpVnVkOHJuRkREQVlEZ2lBU0ZCUkU5eDQ5YWRTb3Nmdml2WTh3bXowS3VScTFIQy9IMGtrRlVSVEZnTHQ1Y2pmRjhUOHdjTjQrM0x4NTg2NTkzdGsvenhBWUdFaWpSbzB4R28wRUJnWTZRbGdCaHdhankxckN1NDNQVml3akxpNW5Bbi8wcUpHVUxGV0tqZDl0WnZHUzVSdzZlSUJObTc0RjFKNjhvWU0vcEZMbEtuejczV2JtekpuUG50MjcyTGpobTNzMnpvS2VjKzc4aFh5L1pTdmRlL1FrYk9wa05ueXovb0ZjSjRJZ1VLZE9IVnEwYUVIejVzMHBVZUwybklpREIvWVQwclVUcjcvNkNqTStEZFBXZE5wc05zS21UU0dreTF0MEQrbkN2bjJaYTVyelk4UzlkNUZNS3B1Kys1YWhnMVhhSllQQm1OMWpFM0VVRHJKR2pGYXJGVkVRaEx1NlNOR2R6UDVubnB0ZGt2N3g1eHcvZm95WDI3WmgydFRKUkVaRzhuTGJOcnpjdGcwclAxdFI0TTg0ZFBBQW5kOTZnK2JOZ3VuUlBZUS9UcDF5MmI1bjl5NUN1bmJpaFZiUDA3MWJGdzRkUEtCdDY5ZjNmVjV1cTRhMkh3em96OHR0MjlEMy9YYzFJeEljM0pTdUlkMHdtVXdVS1ZxVXV2WHFjYzVCU2hBWEY0ZWZ2eitkT25mR2FEUlNxblJwR2pWK2xqLy9QSFBQNXYxMnptazJtMm5VcURIRGhvOWt5ZUtGK2RKYTN5dVVLMWNPblU3SHRtM2IyTHQzTHpWcjFzUmdNT1Jxc0xQL1B5TWpuYWxUSmpGeDBsUldyMTFIVEV3TTIzNzZFWUN0UDJ3aEl5T0RsVitzWnZxTVdjeWUrYW5tNWVmRmlGc1FQUEhFRTlwRE5iOHhadjA3SmlhR2QzcDA1OEtGODlydm9OZnJDK1hocVdrdldaYlI2L1dJZ04vZG5QUTdwVGgyUTBWSzhqOHZ0TlNxVlp0dk4yMWhRT2hBU3BZc3hiZWJ0dkR0cGkyRWRPdGVvT012WHJqQXh5T0g4MTZmdm16WnVvMVhYM3VkZ1IvMEo4cmhUVjY1Y3BueDQ4WXdaTWh3TnYvd0V5KzkxSTRSSTRacGFsdHo1czduMjAwcUU4cU1XYlA1ZHRNVzVzNWZDSUFvaW5UcTNBVmZYL1d5Kyt1dlN4ell2NThHRFZSMms4REFRT2JNblkrSGgxbTcwSThmTzBhTkdqWHYyWnpmeVRucjFXK0ExV2JURFBMOVJHQmdJRGR1M05BOEZGbVdjNUE4SERrU3pvaGhRN0RaYk1URnhmRk9qKzdFeGNVUkVSR0JyNjhmSlV1V1JLZlQwYXBWYXc0ZlBnU29yTGZQUHZ1YzQzY1NNQmlNbkR0M1Z0dVdHeU51QVhOamVaSlZMbHU2V0tNR1Azbnlkd2IwVjFjUitmcjY4c1dxTllSMHkrUkUxT2wwdVlXaXVJYWhxa2NyQXZjOGJodzBNSlRYT3JZbnBNdGJkTzM4SmxzMmY2L2xOVjdyK0FydDI3MUk5NUF1OTNRTTNVTzZjUEhpeGRzNlp0dFBQL0pheDFkNG9YVUxacy9LbStCdng0N3RqUDVrNUgvR3VHN2V2SW5nSmsxcDFLZ3hKcE9KVnExZm9FclZxbXh6Q0hrRUJBU3lmTVhuVkt0ZUhWRVVlYWx0TzJ4V0szLy9YZkRtMHo5T25hSkY4NmFFZE9sRWxhcFZlUzY0U2E3N0xWd3dEN09uSnkrMGVmRytmZitDbkZNUUJQejkvRWw1QU1sNm85R0lKRWtFQkFUUXVIRmpaRm5HWkhKbEhhdGJ0eDcrQVFHTUdmMEpnd1lPb1AwckhmRDM5NmRZc2VMRXhjVnk2ZElsN0hZNzRlSGhwS1NvMzhISmlIdnExRW1HRFA0UW84bElZbUtpdHMzSmlEdDN6aXlORWZlZjRzMjNPck5yMTgvTW1UMlRjV05HMDdkZmY2ZDNsaU9uS2dpQ2R6NjVOUmNqcHhjRTRiNGt4RDRhTW94NjllcVRtSmhBcjU1dlU3V2F5bjJXRjczeHc0QVdMVnZSb21VcnZ2NXFMWkdSRVkrTTF4Z1pHVW1GQ2hWZDNpdFRKa2liQTI5dmIzWnMzOGI0OFdOSVNVN0pNNnpJRDlXZmVJSnRPM1lSRVJIQkp4K1BZUG15cGZSOHg1V0g0Zk9WbjNINDhDSG16Sm1QWHErL0w5KzlvT2RVRklXNCtEaThIMURheFJtTzd0Ky9uMXE1OEprSmdrRHYzdS94eHVzZEtWT21yR2FreldZenc0YVBaUEtrOFk3ZnRTeWVack4yM1BmZmJ5STlQWjFKazZjeGUrYW5McCtaRnlOdVhtalZxaFhlM3VyOE9QT0FwMCtmNXZUcDA5byszdDdldlB2dSszd1EybzgzMytwRTVjcDVMeXNUUmRFN256QlVNMm8ybXcwOWNGODVxUXNYOXVXSkoydHc4Y0o1eXBjdm4rZCtpWWtKVEo0NGdhaW9LT3gyRzUwNmQ5WFlPTStjT2MzTUdkTkpUMHVqU05GaURCMDJRb3ZoZCsvNm1kV3J2OFNTa1VIMUo1N2tnNEVmYXZtSFhUL3ZaT3pvajBsUHo2QnZ2LzZhbC9ETituVnE4bHBSYU5yc2YzVHIzdU9XMytQSWtYQStuVDROVVJBcFdhb2tudVpNdHR6OHh0QzhXVEQ5QjN6QTBpV0xVQlQ0ZnN2V2g4NndGUzFhbE1nSVYwTisvZm8xYXRkV1cxSDIvcktIVlY5K3dZeVpzeWxWdWpTZ1ZnMXp1N215R3p0TFJnWmJ0LzVBNjlZdllQTHdvSGp4NGpSdi9yeExvaHBnL2JxdjJiN3RKMmJObVhmZkdrNXY1NXhIam9Sak5CaW9WUG4rTDdHMldxM1k3WGFPSGozcURORnlhR2FrcEtUdzBVY0Q2ZHdsaEhObi8yVEs1SWtNSFRZQ1FSQjR1dUV6UE4zd0dVZnViSzVHUzErNGNHSE1aak5qeDAxQUZFVXNGZ3VGSGZPUUZ5TnVmdmp4UnpWMzk4d3p6M0Q1OG1VdGZIWkplMXk4eU9SSkV4ZzdiZ0lybGkrbFROa2cydVR0S1h0bE0ySlpqSnFRTldSRkJEenY1NDhTSFJYRnFaTy9VNlZLL2t6azU4NmQ0My9ObjJmWmlwWE1tYnVBV1RObllMVmFzVnF0alBwNEJLR2hBL244eXpVODgwd2psaXhhb09WcjFxOWZ4NXc1ODFuNXhXb0FmdGl5V2Z0TUh4OGZWbjZ4bXRGanhqRi8vbHhBSmRiYnZIa1RDeGN0WmNteXovanR0OS9ZOWZQT2ZNZG1zVmlZTUc0TW8wYVA1Y3ZWYXlsVE9uT3A3YTNHWUxmYmlZcUtZdDAzMzdMK200MFB6SGpaN1hhTkJsMlJaZXgydTJhRTJyejRFbnYyN0NJOC9EQjJ1NTJmZjk3Skg2ZE8wcUpsUzBCVlRoSUVFSFU2RWhNVHRCeUpJcnV5RkJjdlVZSkRCdzlpczltSWpvcFN3eWlUaVM4K1g4bmF0YXV4Mld3a0pNU3pkKzh2MUtoUkl6TVUvbjRUMzI3Y3dNelpjKzhiQVdkQnoybXhXRGg4NkNDVEowMmc5N3Z2UHhDdGl1am9hSzJhYlRRYThmWDF6U0dJY3ZIaUJZS0RtL0pXcDg2TS9HUTBScU9KdURqWFZRK0hEeDFreDQ1dFdnOWpyVnExc2R2dGlLSklRa0k4Rnk5ZXBGTEZTdHEyM0JoeC95bCsrL1VJUTRlTm9FblRabnc2Y3c2bi96aVZnKzA2eTRQU25NMm9aWDJHdXBUMzlZRDVmdndZMDhPbVl2WXdZelFaNmRPM1A2VWRwSTU1b1diTldpeGZ0b1J0MjM1RXA5TmpzV1NRbkp4TVFudzgzdDQrVksybTZoRzgxTFlkVFpzMVUzK293NGU0OXZkVjN1MzlUcGFuaWs5bTNzSEI3bG0xV2pVdEVSNGVmb2pubjIrSjJlR092L2ppUzRTSEg2WnBzLy9sT2JhclY2L3cyR05GTk9OY3BWbzE5djJ5cDBCakFPZ2EwdTJ1WEJSM2l1d051bE1tVDJUSzVJazgzNklsSDM4eW1vb1ZLekZxekRnV3pKOUxaRVFFWmNxV1pXcllweFF0cXZiWHRYNmhEYWRPbmFSSDk2N29kSHJhdmR5ZWloVXJFWmR0dWREQWdSOFNObTJxK2lRdVU0YWx5MWRpTkJxWk1qV011WE5tOGRYYU5SZ01Cb0tiTk5XU3hKSWtNVzNxWlBSNlBXKyszdEUxVFB4eU5jV0szZjBWZ0FVOVo3OCs3eU1JS25Qc29BOEgzOVUrTmg4Zm53THZlL255Wlh4OWZUVlp4K1BIaitkSTVOZXNXWXVhTld0cCthcEJXWmh5NCtQajZOV3pCNlZMbDJiaXBDazhWcVNJOXJ1ZU8zZE95M2YzR3hDcWVhNTVNZUlXQkFjT0hNaHoyMnV2djZIOVB5QWdnSThHNXl2czRwRlBHT3F3Y0NLU0pLRUg3c3NkTnVqRHdScHRjRUd3ZHMwcTdEWTdVNlpPUnhBRXJYM0FhWjZkTUJnTStQbXBUMWliMVVad2s2YWEzRmgraWQrc0lWTFdWaTVCRVBKOFltVE5yK1RWTEZxUU1lVEhFM1kzMGJKVmExcTJhcDNqL1lvVksvSEx2dndGbWhzMWFwem5qV3N5bVJqNThTaVg5OTdwMVR2SGZ2VWJQTTNYNnpma2VMOUN4WXJNbkQwMzE4L1c2WFRzMlh2Z3ZocjZncHp6VnZOMU44YVFtcHBTb0ZZcDUrcWVPNFdmbnovcmNva1dzaHZBckFnTURDeXdRdGJkUkVCQWdGWmh6OFZXQ2RudGdTQ0FUcWUyZXp3NDF5RmZkenNHYng5dkJFSGcrUEZqSkNVbG9TZ0twY3VVSVRrNW1mUG5WV1gzbjM3Y1N0aTBLUURVcTErZm4zZnU1UHIxNndEczNMbURreWQvei9jOGRldldaL3UyYmFTbnAyT3oyZmhoeTJicU44aGZXS1ZzMlNDaW82TzFuRUZFbHR6Qm5ZemhuOEJzOXNTTjI1dWJCemxuZVoyN1NKRWlwT1d6cHRyVHMyQWhiMEgzdTFlNHgrTTA1dUtwQ1VvMnI4MFppdW9lMUNUa0owangybXV2TTNiTUtIN1lzb1hLVmFwUW9XSkZFaE1TQ0F3TVpNeTQ4WHdhTmcyTHhVTGdZNEVNR1RwQ0RRbXJWS1ZmL3dFTUhmd2hOcnVOY2tIbEdEeDBXTDVqZUtwdVhWcTJhczI3dmRTQ3diUFBOYUZwVXpXMDNmYlRqeXhkc3BpVTFCUmtTV0xmM3IxMDZSckNTMjNiTVhUNENFWU1HNEtmdno5NnZVNHJIdHpKR083WGsvNVJRbXBLY3A1ZXRmaUE1aXcxSlJsZEhwWFc0c1dMRXhFUlFmVE5DRHk5ZlhLTXJWejVDcmRjWU83cDZVVzU4ZzlXbCtrZWoxT1htOGVXVzk1TlVHNFZkOTBtamg0OVNwRmlibzNNTzBWVTVIWHEzTVpDK011WHJ4QWJGK2RlbTVzTk55TnZFQmdZUU5sY2NybVhyMXdoTnZiK3o5bk55QnNFQkFRUVZEYnYvSEpVVkJTUmtaSFk3WGFTazkyc09OblJwRW1UOWtBYUtvTnVFcG1pTGhZMDdRTkJ2dXZOUVc0UDRwODkwVyszWDZ0czJUSkVSMGNqbnRxUEFBQWdBRWxFUVZSeE0vS0dteHJjTVljcEtjbElkbnV1UmcwZ3FHeFpvcUx1MzV3NXh5UkxVcjVHelJtU0ZuRWs4OTNJRmRuRFRzR1pZeE1FUVYxMUlJcUNvQ2lLaExwRTRhNGdJaUtDeU1pYlBGYlV6Vjk1Kzk3YURVcVVLSDdiN0I2S292RFg1U3ZFeGNVaTJXVXlNaDVOamphejJSTlJweU13SUpDeVpVdmZjb0gvbFN0WGlZNkpRYkpMOTJ6T3pHWlBkSHI5TFQwMU53b0VXUkNFamtCcUZvOHRSUkNFVk1BaUNJSk5FQVM3S0lxS29DaUtGVERjN1hCVUVIVjRlWG5qNmZiY2JvazBoOWdIS0xjVmhycmh4aU1HbXlBSXIyY3hiTWxBc2lBSWFVQkdWc09tQis2NllhdFRwdzQzYjk3a1psUVV5VW1KYmdiZGZPRHQ0NE5CcjZkVXFaTHVFTVFOTi9LSHRhQTdPZzNiWGE4UkZ5MWE5STQwTXQxd3d3MDNDbWpZbEd6L2FoQ0JkUGQ4dWVHR0cvOENaQlRZWTd0eTVZcGJEY1FOTjl4NDZLRW9Tbm91M3BtaU9CUmRuSjFyaXFJbytySmx5NmE2cDh3Tk45eDQyQ0hMY21xVzBGTXpjTm5iUFFSQlFGUVV4VTE1NjRZYmJ2d2JQTGJzekpaS3R2OXJmK3RSZTBIY2NNT05CMy9qdXZWNDg0SGRiay9KWXNDVUxLR29ralVVbFdVWnZhSW9DZmRTcWNnTk45d29tRkZ6Ni9IbUQ0dkZrcHlieCtacXZ6SkQwYmhIYllKS2xTcEZ0V3JWY2hXajhQYjI1clBQUHJ1WFR4MUNRME1wVXFRSWhRc1hwbmZ2M3BvSWlodVBMckxxOGJxWEkrWjU3eVJsODlnVWNtbjFBTld3eFQ2S2szVG16QmttVFpwMDM4ODdiTmd3Tm0zYXhMcDE2OWkwYVJNN2QrNmtYNzkrN3F2MkVZZGJqL2ZXc0ZxdFNWazh0Vnp5YTRMS3JTaUFLRWxTektNNFNlWEtsV1BpeEltY09YUG12cDB6TlRXVmVmUG1FUllXUm5Cd01NSEJ3U3hldkppVksxY1NFeFBqdm5JZllkeXBIdStaMDM4d01MVC9mWEFFVGhNMmJRcmJIVXBsVG16YytBMGhYZDRpcEdzbmxpOWJxcjJmbjhEeWlSUEg2ZmwyTjdxRmRHYjBKeU1Mck0yYW5wNldqR3RUYnJicXFOTmZBOUZtczkxOEZDK2szcjE3VTcxNmRkNTU1NTE4R1hQWHIxL1BrMDgraWRsc3BucjE2aXhkdXRSbCs4OC8vMHlkT25Vd204M1VxMWVQc0xBd0YzSFl3TUJBUHZ4UVpkTTlkdXdZNmVucEJBY0hhOXVmZmZaWkFBNGVQT2krdXg5aDNLa2ViK1VxVlJrMVp1dzlIZHY4ZVhOWnRuUUpseTVlZERGQ1Y2OWVZY1A2OVN4WXRKUmx5MWR5NHNReGpod0pkeHlUdThDeTNXNW4wb1J4alB4a0ZKK3QvSkpTcGN0b21obTNRbEppVWw2aGFJNFZDUHFNakl5b1c2bk4vQmVoMCtsWXNtUUpEUm8wWU5HaVJiejc3cnM1OXRtN2R5K2RPblZpOXV6WnRHclZpcU5IajlLN2QyOTBPaDNkdTNmbjRzV0x0R25UaHI1OSs3Sm16UnArK2VVWCt2ZnY3eUx3TVdqUUlHclhyZzNBOWV2WE1ScU5CQVFFYU5zTkJnTUJBUUZjdTNiTmZYZTdrUU94c2JGTW5EQ09tT2dvQkZIa3ZmZjYwT0RwaGk0a3JiNitmcXhZK1VWbXVtUElSOXk0b1RJNEp5UWs0T25seFpxMTZ3QlZGV3JPckJra0ppWGk3K2ZQNEtIRE5DMExnSFZmZjhXR0RldTEvUUY2dnRNTG85R29NVlU3OGZ1SkV6eFZ0eTZlbnA3WTdYYjhmUDA0Y2Z3NDllclY1OFNKNDN6d3dTREFWV0E1NnVaTlBNeG1nb0xLQWVEdjc4L1BPM2NVYUM1dVJ0MU1Mb0JSVXdEMEVSRVJFWG5Kei8vWDhkUlRUeEVhR3NxUUlVTm8yN2F0cG4zb3hJUUpFK2pSb3dlOWU2dDgvbVhMbHVYU3BVdE1uVHFWN3QyN3MzRGhRcXBVcWNLMGFkUFVwMmZseXB3OGVaTFZxMWU3NU5TY1NFdEx3OFBESThjNFRDWlREdmswTjl3QStHcnRhbXJVcUVGSXQ3ZTVkT2tTOCtmTm9jSFREU2xWcWxTZW1yeVRwcWpYWTJKaUFyM2Y2YUhwYjFpdFZpYU9IOHY0aVpNcFhydzRQLzI0bFFYejV6RjZUT2J4Tld2VnlzRThuSmZ3a0ZOZ09UbzZta2tUeGlISkVqNk9QR0ZXZ2VVZE83WnBBc3RKU1VtWVRDYXNWaXR6NTh6aXhvMGJPUlMyOGc2N1R6dmJQZVM4UERWbk1DcldyRmt6aXR0WWcvVmZ3OWl4WXdrSUNLQnYzNzQ1dHAwNmRZcGx5NWJoN2UydHZVYU9ITW1GQ3hlUUpJbmp4NDlUdjc2clFFMmpSbzN5UEpmWmJNNjFFbXV4V0I2SWpKc2JEei9xMVcvQXpoM2JXZm5aQ2l3WkdRVVdWSkZsbVRHalI5SG14YmJVcjk4QVVLVWhyMTM3bStGREI5TTlwQXVyVjMrcHFiVTVVYWxTWlY3cDBMSEE0enQ5K2c5R2poaktPNzNmcFdsVFYyVzNTUlBHY2ZueVg0Uk5uK21pVkorWW1NakFEd1pRclZwMSt2VWZVTkJUWlV3WVB6WXRuMUJVTTNTQ29EYm9BbHdGS2oyS0Y0Nm5weWNMRnk2a1pjdVdiTnpvcXR4anQ5c1pOR2dRYjcvOWRvN2pSRkZFcjlmbkVBVE9MMTlYcWxRcE1qSXlTRWhJd05mWEYxQlZxMk5qWXlsWjBrMm43a1l1aHExZWZlYk9XMGo0a1hBK1g3a0NvOUhJbUhFVGJubmNzcVdMOGZEd29IT1hydHA3TnB1TllzV0t1WVN0L3dTRkN4Y21JeU9Ec09rektWU29FQ2RPSEtldzQ3ck9TMkM1VUtGQ0pDVW1NbUhpRkI1Ly9ISE9udjFUdXhmeWc2SW9mMmN6WUhJV3p5M24vYWtlbzF4NWxDK2VGaTFhMExselovcjI3YXVKQ0FOVXExYU5reWRQVXFGQ0JlMTE0TUFCWnMyYWhTQUlQUG5ra3h3NWNzVGxzN0wvblJXMWE5ZkdiRGF6ZDIrbTZ2bStmZnNRUlpHbm4zN2FmUmU3a1FPVEpvNG4vRWc0elpzL3o3RGhJemwwNkdDT2gybDI3TnUzbHoyN2R6Tjh4TWN1emFzVktsUWdLU21KWC9iczF2SnQzMi82enVYWTgrZlBzWEhqTndVYTI1TTFhbUMxV2pHWlRFaVN4TUVEKzZsWlM5VXl6VXRndVZqeDRoVDI5Y1hrQ0cvMzdkMnJIWk1mSkVtNm5zMm81ZUd0cWYwZWVrQ1JaZmx5WG9vK2p3cG16SmhCMWFwVlhYSmRRNFlNb1ZXclZvd2VQWnBPblRweCt2UnArdmZ2ejhDQkF3SG8yN2N2czJmUFp1alFvYno5OXRzY09uU0lCUXNXdUlTVmt5Wk5vbmJ0MnJScTFRb3ZMeTk2OU9oQjM3NTk4Zkh4d1dnMDBydDNiN3AzNzM3ZkZNL2QrSGVoYytldWhJVk5ZZTNxVmNpeXpNQkJIeUdLWXI0S2IzTm56eVFqSTRNKzcvWFNQbWZ1L0VYNCtQZ3dhY28wWm40Nm5VVUxGK0RwNmNuQWJEcWl4NDRlWmNPRzliUnYzK0dXWXl0Yk5vajI3VHZ3YnErZUtDZzgrMnl3cGgyY2w4Q3lYcTluK0lpUEdUZHVORGFyamRLbFN6TjQ2SzNGbDIwMlcwUXVIcHVpcXUrNWVtMkNnQ0lJZ3VDZGtaSFJ6MmcwVG54VUxwWlNwVW9SR2hxcXRXRTQ4Y1VYWDlDMWExZFdyRmhCdDI3ZEFGaTFhaFVUSjA3a3dvVUxGQ3RXako0OWV6Snk1RWp0U2ZqVFR6OHhjT0JBTGx5NFFPM2F0V25Rb0FIcjE2L1hkRVVEQXdQcDFxMGJZV0ZoV2o0dE5EU1VOV3ZXSUlvaUhUdDJaUGJzMmJrV0ZkeDRkTEJueng0ZXIxakZQUkY1SUNZbTV0UGFOWi80QlZkYThCUW5MVGdxYmJna2lxS3MwK2xWdzVhVWxOVEcyOXQ3clh2NmJnOG5UNTRrTFMyTkJnMGFhTytOSGoyYUgzNzRnZkR3OFBzMkRsbVd1WHpsS25GeGNVaVNSRWI2bzdsRXk4TnNScWZUNGU4WFFGQlFHVVJSekM5bjQ1aXpXT3oyZXpkbkhtWXplcjJlQVA4QWdvTEt1ZzNiSGVMc24zOE9hLzYvSnFmSktlU1NEamlrOTBSSkZFVlpyOWNwZWtDSmo0Ky8rQ2owc2ttU2ROdnlkdm5kR0JjdVhLQkxseTZzV3JXS1dyVnFjZkxrU2ViTm04Znc0Y1BKalBjTGpzakl5TnVtVTdkWXJKdzRjUUtkWG85UG9jSnUrYjNVRk9JVDRvbjVMWnBhTld0aE5CcHkvZTErL2ZVM1JKME9iNTk3UDJlcHFTbkV4c1VSSFJOTnZicDE4OTMzdXJ1Zk1WY2NPbmdnbHN5Q2dWWTRjREI3T0VKUkJRVUZXWllSQkVId0JJei9aKys3NDV1by8vK2ZkNWRjZHZlbXBZVzJERkdnU0FFL0ZCRi9iQnpnRjBVRlJDeFlrQ0VnSWhRVUZHUXJRZ3NpVTVDbElHSlpBckpreWlwWWhteVEwcWJwYnRPUmNYZS9QMjQwU2ROU29HWG05WGhFYWRaZDNuZjN2TmQ4UGxtVzFRTlF1SmJ3N216cTFLbFl2SGd4MHRMU0VCd2NqTGk0T0l3ZVBicFNiNkU2N1dHSi96N3F4b3NUZXlFc3RMeVhkTzM2RGVUbTVqNFV3V1FmYjIrRU9wSGhjM2xzbGQrL1Eyb0Y5QUV2WTJCMENFVkxBSmdGb1dTR0pFbE9KcE54Sk1xU2NSZGM2M2YzRmg4ZmordlhyOE5rTXVIcTFhc1lNMmJNQXdNMUFNak95bllOVHpzeHJjNE5XVm5PK1IxeWNuSWV5cHBwZFc3SXluYk5CTjlEcXVVaTdGczhiRnM5N0lzSElvT3U2SjJ6TEh2ZXRZU1BsM0hjdlE5UFArbW0wV2pCc2t5RktZbUhzV1lhalJhTWxYRWRuTHMwaThWeUZlWDcxeHo3MkhoMkR3SGNaQVJCY0J6SGNWYXI5WHhGb3hNdWV6U05JSUNTRWhlWFcwVldVZ0hQM2NNc3J0enI4U3JJejhlTjYxZFJWR1NzRkRqRDZvVER6ZDM5b2YyK210aFBvN0h3cGhOQUsrZXhFVVNaN29GTWZLR2twT1NjQzlncTg0NTQybWFEd1FBcnc4QllXRDIwelZxdERqSzVESDYrdmdnTURLejIvZDYxY3dlV0wxc0tneUVEUVVGQldMbHFMUzVmdm9UWS92Mms5NHlObjRDdVhidTVEdklqYk5ldlhVRnhjZVgwUGtWRlJ0eTRmaFdObXpaN292Yno5dTIwMnc2QXhnQmdoYUpCdVljSWJBREFYYnAwNlZ4MGRMVHJES29BMUpLVGt3R0NoRWFyNDJtYkE2cnYrNHVLakVqWFp5QTlQUjNObWxYZlNabVdsb1laMDZmaXk4bGZJenE2QlFvS2VHcWNpSWhJN05xOUR3QXdNUGI5R2x1M1pVdVg0UFh1UGV6WVRNVDltanZuRzZTay9BT2FwdEcrUXljTS9taUlOSHlkbXBxS2hMbHprSEkyQlFxRkFoMDdkc0tIY1lOUmswM2tkOXJtaXpFdlFDNlhneUJJaElXRm9YL3NBTFJ1SGZQQXpzRTdnWVh0dWZRd3JTYjJjLysrdlJrQ2FERWlxTmw3YmJ5WEJsdVZLaEhsV3Jac21RWGdzZ3ZHeXB0ZXJ3Y0lFbjcrZ1RXU205Rm90UER6RHdSQUlEMDl2ZHErOStLL0YrRGo0NFBXcldOQTA3VEVFMGNRQkJRS0JSUUtCV3BTNytMSDVVdVJrMU0rZ1Q5cDRnVFVDZzdHYjc5dndhTEZ5M0QweUdFa0pXMEN3UGZralIwekd2WHFOOENtMzdjZ0lXRUI5dS9iaTk4Mi9scGorMW5WYlNZdVdJak5XN2VqZit3QXpKNDVIUnQvM2VDNk9HcmVxYmd5YzhhMGtzckNVSUlRUWxIWWg2SVEzc0N5TEh1S0pNbEkxM0xhbThHUUNZMVdWK1BiMGVqY1lEQVk3anNrUFgwNkdaTyttQUN6Mll6aTRtSjBmNDBQTTN1ODBSUDkzdTlmcGU4NGV1UXdFaFBtUWE5UFIyaG9HRVo5OGlrYVBmdXM3VjBVeTVZdFFhYkJBUCtBQU1URkRVYXJGLzRIQUJnMjlDUGNFaGhUUjM0OEhESVpoZURnRUNRdVdBaVdaZEcyYlR0MGUrVVZLQlFLK1BuN28zbDBOQzVkdkFpQXIxaDZlbm1oZDU4K29Ha2F3U0VoYUIzVEJ2LytXM05GKzd2WnBrcWxRdXZXTVpESFQ4REVMeWFnVStjdWp4MHpDOE13T0hyMENMWWsvWTRoUTRjak9DUUVBRDhrUC9lN2I1SHl6eG1RSklYWWdSOGlKb1luUXMzTXpNUzBxVk9RblowRm5jNE5ZejRiaTlxMVF5dmREa0VRaUlxS2dvK1BEMWlXeGZuejU1R1dsbGJsL1Z6eDQzTDhzWDNiT1dkaEtBQ1c0emkyTEw5R2NDQUl2a0c5b0VBcUhnQUFaN0ZZa2hVS1JTOFhsTm1ibGJFK2tDcWFScU9Gc1NEdnZyK25hZE1vYkVyYWloMS9iTWZLRlQ5aTlkcWY3K3J6VjY5Y3dlY1Q0akhwcXlsbzNqd2FlL2ZzeHFpUncvSFRxclh3OC9mSHpaczNNR1h5bDVnN2J6NGFOR3lJVGI5dHhQang0N0I1eTNhbzFXb2tKQzZRd3JjNWMrY2hNcktNT0lZa1NmVHUwN2NzSjNQOUdnNGZPb1NQaHZDMFVUNCtQdExuUlcvcWRISXlYdS9lbzhiVy9WNjJHZDJpSmN3V0N5NWR2SWlvWnMwZXlmT1daVm1wOWNqMjN4OFBINHBhdFdyaHdvWHpZR3dxeDl1M2JVVnBhU2xXL0xRR09UazVHUFJoTEJvM2JnSTNOemVKRWZlVlYxL0RpUlBITVdQYVZNei8vb2RLdDErblRoMVFGSVdkTzNkQ29WRGc1WmRmUm1abUppd1dpOU45dFAwN0plVWY3TiszRjdObWYzdmxoVmJSam1Hb2JZNE5Jb0FSQWpocnRWcSszVU5Nd2hVVUZKeHl3Vmg1cTY1Q1FaVzJaVFErOU4rN1pVc1MycjdVRHExYngwQ2hVS0J6bDY1bzBMQWhkZ3A4OTk3ZVBsaTJmQ1dlYWRRSUpFbmkxZGRlaDhWc3hxMWIvMVY1RytmT25rWEg5dTNRcjI5dk5HallFQysyZmNucCt4WitQeDhxdFJwZHU3M3l3SDUvVmJaSkVBUzhQTDFnTERJK2t1ZnM4ZVBITUg3Y1o3QllMTWpKeWNIQTJQN0l5ZUVGNmI2ZE14Zmo0aWVVdTFtZk9YTWFiZHE4S055QUNNamxOQzVkdWlpOTl1S0xQS1c5TFNQdW5XNFlvb2ZHY2Z4RWdLZW5wOTE3bGk1WkpGR0RwNlQ4ZzQrSDh6ZTRLNWN2b1dsVUZHN3hycit0dDhZNENVZkJjWndFY0hJNWJkZWd5NzMxMWx1bndIZjJ1cXdTTzNQbU5EcDFlQmw1ZWJtU2g5T3Y3N3RQVkU0eE1OQytLNzkyN1REbzlYeitUNnZWNHVUSkU0ajdNQmE5MyttRjk5L3JJOTF0cTJxTm5uMFdPLy9jaTUvWGIwUjZlcnFkRUlob0sxZjhpTC8vUG9xcFU2ZFgyeWpjbmF5cTIrUTREam01T2RBK29qMkV6WnRIdzh2YkcxOU8rZ0tmalBvWVBkNzRQNGxCNWs2TXVHZlBwdUN6TWFOQksyams1K2RMcjRtTXVJa0pjeVZHM01xTXBta3dEQU52YjIvRXhNU0FaVms3d2trQWVPZmRQdGk3ZHc4UzVuMkh5VjlPd3RCaHZEQk4zZkFJbkR4eDNEaDB5RWNaRGlHb0hiQUpZRlpPMUlVVWtzY2NBSGIvL3Ywc3gzRkhYZEIxWnlzcEtjR2ExYXVmeU4vbTcrOFB2VU1SNC9idFZJa2IvOEJmKzdGNjFVLzQvUE5KV0wzMjV3cERYWUlneW9HZHFiUVVtMzdiQ0ZNcFQ5b2NHQmlJOXUwNzRNeVowM2J2MjdEK0YremF1UU56dmt0NFlIMVpkN1BONDhlUGdaYkxVYTkrL1lkeWZEcDI3Q2c5SEZtY3hiV1BpeHVNVXlkUFFFRXJxdXp4YnQ2Y2hPWExsbUxhOUZrSWRjaWhWY1NJZTZkd3RHSERoamgwNkpCVWxiYzFyVmFMUVlNK3d2cGZma2E3bDE5Ry9mcjhXRm1USmszUnZrT25rd1pEUm1XZ3hwYk5pWXJCS0svelFNS2VONXkxV3EwdVlLdmlBZHU3WjdmazN0dmF2cjE3OE9IQUQ5Q3Y3N3VZT1dPYWxGTklTMHZEb0E4SG9QYzd2VEJyNW5RcHFmOVE4b1pXcTBTcXliRXNyRmFyQkVMZFhua1YrL2Z2eGJGamY4TnF0V0xQbnQwNGR6WUZIVHQxQXNBTGpCQUVRRklVOHZQenBGQ0NZKzNKVEFPRGduRDB5QkZZTEJaa0dnejhYVnlod0U4clYyRGR1ald3V0N6SXk4dkZnUU4vb1hIanhtV2g4T1lrYlBwdEk3NmJsL2pBZU9xcXVrMlR5WVMvang3QjlHbGZJMjdRUncrbGNKQ1JrWUdkTzNkS0QyZE1Na2FqRVo5K09ncDkrdlpEUUVBQVpreWZXaW03c3hoaWVuaDRZTmJzYitIbDVRV1R5UVIzQWVCRlJ0eGh3MGRBTHBkTGpMaVZtZGxzaHNsa3dzR0RCMkV5bVVCUlZEbHRqNnRYcjJMNnRLL3gxZVN2Y2ZUSVlXemR1a1Y2N2RWWFh6dnJKQXhsYkhOc29tTkdFSVNVcTNOemQ0ZE1LSTl5b2x0WFdGaDR6RVY2ZUdkVHF6WG8yS2tMVnE5YWlTNWR5Z0RxK3ZWcjJMQmhQUklTRmtDaFZHTG1qR25ZdG5VTFh1L2VBM1BuZklQMkhUcWk1NXR2NGRqZlIzSG80SUdIc3UrT0Rib3pway9Gak9sVDBhRmpKM3oreFNSRVJ0YkR4QzhuNC9zRmlkQ25wNk4yYUNobXp2NVc4dGk2ZE8yR3MyZFRFTnYvUFZDVURLOTM3NEhJeUhySXliVUgrVkdqUm1QMnJKbFl2bXdKYXRldWpTWExWb0NtYWN5WU9SdUpDWFB4ODdxMWtNdmxhUHRTTy9SN242ZGZaeGdHczJieVllQTd2ZXk1OTFldVdvT0FnT3B2WXE3cU5vY04rUWdFd1JNc2ZqSjZ6QVB0WTd0YnUzcjFDdHEyYllkM2UvZUIxV3JGM08vbUlDY25wMXhQb2EwMWJScUZjK2ZPZ2lSSjVPWGw0dXJWcTZnbkZINHFZc1N0ekRJek0rM0NYdzhQajNMQ0xTZFBITWZZY2VQeGZQUG1lSzV4RXl4YnVoaGR1M1lEUVJDNGR2M2F0WXBBRFE1VEJ5UkpRU2FqWURZREZFbVZUUjZJSHR0SEgzMTBkTjI2ZGZrQTNGM3dWYm05OFg4OTBhOXZiNGsxRkFEKy92c29VbS85aDBGeEE2VzdsbFpvRlVsSitRY1RCVVdnOElpYTc2cnAxTGtMT25YdVV1NzV5TWg2K090ZzVUcW1yVnZIVkhqaEtoUUtUUGg4b3QxekF6K01LL2UrRmkxYjRaY05HOHM5SHhFWmllL21KVHI5Ym9xaXNQL0E0UWQ2SEt1eXpUdXQxLzJhVGxlOTdVUk5talJGa3lZODViWk1Kc01uRGt5NXpxeEwxMjY0ZE9rUyt2ZmpxOWJEUGg0aGhlUVZNZUpXWmpkdTNJQ0hod2ZhdDI4UEFEaDkrblM1Z3NOYnZkNlcvdTN0N1kxUHg0eVZVbjV4QTJOVG5ZSWFRYkRnT0pZVGpDUkpqaVFKamlCSWFMVmFMamMzaC9mWWJIT2l2L3p5aTNYTm1qVUhTSko4eFFWZEZSdEJFRkNwVkhpalowK3NXbFVtam1FeFc5RDJwWGFTNUpsandya21HMkpkOXZnYVJWRW9LakkrME9GOHg5eG9aUURvNCtOVFpZVXMyL005T1RuNW52Yk5Zckg4cmRmcmJjTlFxd2h1QkE5dW5EUmxRSklnQ0JJa1NZQldLT0R1N3NFWER4eG1ybGlMeFhMUWRhcmRHZGdBb0VmM04zQTc5WmIwZkhTTEZ0aXplN2RFRGI1Nzk1OUlTZmxIY3VlM2I5dktoNE5DR2YxK1RhVlN1dzdHWGE3TncxeXppcmJ0NStlSFltTmhwYW1QcXFaSUhuYUtwanJlbDV1YiswOGxZYWhES0NxTVVwRWtTSUlFU1pKU1ZSUkNJbzRGd0dWa1pMaUFyWXFtVUNyUnAyOVp2cXBCZzRZWU52eGpqQjB6R20vMzZvay9kKzVBY0hBd0FHRDRpRkhZdWVNUDlINm5GN1p0MndxeUdtWWZ4VHU5eSt5dHlGaFk0V3dwK1pEV3JNaFlDS3FDRnBMQXdFQndISXZNakhTbisxYW5ic1Fkd1VDdDFxQk8zWWlIdXU3VnRaK25UcDY0NmdUVXhFZVptQXRCOElVc2tpZ0ROWklFb1ZLcENLdlZTckFzUzNJY1IzRWNKd2VnWUZsMkg0Qm5YWmNJY1BMVUtmZ0gzTC91NTRVTDUxR3JWakRjM055d1o4OXViTisyRmJObWYydjNuZ3o5YlR4L0Y1M3NOMjdjUkhhT2kwSFgwVEwwYWZEeDhVWm83ZkpzdFErTGRaaG45ZlZHbUJNR1hkRU1CZ1AwZWoyc1Zpc0tIMkJqK0tOa0hNZWRiOWV1M1NUd0lpMjI0aTFGQUlvSmdoQTBEZ2lHSUFpV0pFbU9vaWpRTk0zUk5BMkZRZ0VaSDU5S2VSOHBITFZhclh0a01wa0wyQURJcWluL1VWcFNpakdqUi9ISzcxb3RQaHM3cnR3ZFhTNlgzOVYzaG9iV1JtYW1BUm42TkdoMWJpN05BMk1oak1aQ01GYXJVMUFEZ0xEUVVCZ01EMjdOeEgxaUdhWlNVQk5EVWo4L3Y2ZjZHQllXRnY0Tko3azFBSXdZVllxdEhoUkZRUzZYZzZacEtKVktLSlZLcUZRcUVGcXRsckJZTEFURE1BVExzaFRIY1JRQU9pc3I2MlV2TDYrTkxsZ0QwdFBUa2E3UEVCZzRhczRNR2VrSURQQy82eUY0anVOdy9jWk41T1JrZzdHeUtDMTlPc2tuVlNvMVNJcUNqN2NQUWtORDdsaW91WG56UDJSbVpZR3hNalcyWmlxVkdwUk1ka2RQeldWbGR1TEVpVStqbzZPdkFpaEdtY2FCa1NDSUlzR0xNd3Y2Qmd4RlVaeGNMdWNVQ2dXVVNpV25WQ3FoVnF0QnVMbTVFV2F6V1FRMjIzQlV5YkpzTW9CYXJxVUdUcDFLQmtFUTBHaDFVRmZ6SGI2NHlBaGpZUUVBcmxyNTJGem1zc2N3REUwalNYS2tUUmhxQzJ3bEFFb0pnckRSRUtVNG1xWWxZRk9wVkZDcjFYd29TcElreHpDTWJTaktBV0FZaHRsQlVkUUhydVVHbWpXTFFucDZPZ3lHVEJRVzVGWGJzTHBPcDROTUprTlFVQ0FDQWdKY0MrMnlwOXBLU2tyK2duMDExQzRVZGNBb29ZZU54ekNTSkVGUkZDaUtLc3V4aVcwZndsQXBDNEF0TEN6ODA4UER3d1ZzZ2dVR0J0WUlmYmZMWE9ZeTNxNWN1WExHQWRTc0FLd0VRZGkxZWhBT2ZXd2lvSW4vSnNYeXFEaG5aZFBUeG5wNWVmMEo0TFpydVYzbU1wYzlpREMwU1pNbTF3WHdzam84R0Z0UUF3QmI3TElGTjRxaUlHTlpsdU00cm94dDBzWmpBOEJldTNadE8wVlJBMXpMN2pLWHVheUd3OUI5anA2YUE2aUp6TG1jR0YwS1BHOGN3ekJnR0FaV3F4VVdpd1V5aFVJaGtyUkowLzhDMkxFQUdIZDM5KzNlM3Q0dVlIT1p5MXhXbzNiOCtQSGtTc0pRaWRGRDlOQmtNaG5rY2ptRXdnSEV3b0ZXcXdWcEc1dmFjTE5KNGFpdnIrOUJ1RlRpWGVZeWw5VnNHSHF4UllzVy96bUFtZ1VWTUhvNDV0YWtFRlFtNHg4MkZRV0NKRW1PWlZsQ2lHRkZzUVRHYkRadnBtbTZvV3Y1WGVheUdyMjRvZGZya1pGaEFNTXdNQnFmbnNtRHdzTENmYkJ2eXBVZUhNZUpqYmtpd1NSWWx1VXNGZ3RzZEEvQWNad1Vqc3BzUFRiQmErT0lNb1VYRmdDVGxwYTJMU3dzYkl6cjFIT1p5Mm9PMUpLVGs4R0JrS1loL0oraTM3OXp4eDlubkhoclZ2RFRCbmJFa2lSSmNwUk1CbHBPUTZHZ29WQXFvVktxb0ZLcm9GRnJvTlBweWtKUlczQnpERWZyMXExN25tWFpuVS9hWWlZbUprS3BWRDdRYlZxdFZvd1lNUUorZm41d2QzZEhYRndjaW91TFhWZjJVMjU2dlI0Y0NQZ0hCRDExWTNGV3EzVnY3QWZ2WjlzQW04WEJheXNmaG9vRDc3WmhLQ1dEVEM2SFhDNEhLWlBKUkZEamJEdzJ6b2J0Z3dYQUZCY1hKN2xPdi91M2NlUEdJU2twQ2V2WHIwZFNVaEoyNzk2TlljT0d1UmJtS1RlRElSTmFuZHRUK2R2VDA5TU9PUWxCTGFpNGYwMW94aVU1aWhTQVRjYm4xK1F5R2VRMFhSYUtPaFlSQ0lLd2EvMUlTRWpZUEc3Y3VNOEFoTGhPdzN1em9xSWl6SjgvSDZ0V3JVTGJ0cnlVMmFKRmk5Q3hZMGZNbURGRFVtcDMyZE5uRE1QY2s2ZDI0Znc1TEY3MEE3NzlibDZON3QrRkMrZXhkY3RtTkduU0ZCMDZkcEtlLysyM1g3RnA0NjhBUWFCdDIzYjRJSlp2b0toTVlQbk1tZE5JbVBzZHJJd1ZZYUZocWRldVg3L2c0SzFKWWFpSVA0NE51U1JGZ2lRZHZEV2hTa3JUZEpuSFpodUtpdUdvamRmR2pCOC92c1Jpc2Z6NnRKMXdhOWV1UlpNbVRhQlNxVkMzYmwzTW0yZC9BdTNac3dmTm1qV0RTcVZDZEhRMFpzK2ViUWRRUFh2MlJQUG16UUVBeWNuSktDa3BrVUFOQU5xMDRaVzJqeHc1NHJxNm4ySXJMQ3k0cDgvVmI5QVFFNy84cWtiM2JjSDhSQ3hkc2hqWHJsNUZVVkdSOVB4Ly85M0V4ZzBiOFAwUFM3QjAyUXFjT1pPTTQ4ZVBDWi9oQlpaWHJGeU45L3QvZ0JuVHBrcXBtR2xmVDhhRUx5Yml4eFdyNE9QcnQyUHZudDBXWjk0YVFOaFhSRVZ3STBsUXR1TlRBcWpKNUhMSVJkb2lzVHdxdkltaktJcGdHSVlqU1JJTXcwaDVOZ0RXVzdkdWJhcGJ0KzZJcCtWaysrbW5ueEFiRzR0dnZ2a0duVHQzeGw5Ly9ZWGh3NGREclZaandJQUJ1SHIxS3JwMTY0YWhRNGRpN2RxMTB1dTJ5a1U5ZS9aRWJpNnZQM3I3OW0zUU5HMG5xQ0dYeStIdDdZM1UxRlRYMWUyeWNwYWRuWTJwWDA5R1ZxWUJCRWxpOE9BaGFObnFCYVNtcG1MVWlPR3dXTXp3OFBERThoVmw5UFRqUHZzVWFXbjh3RkJlWGg3VUdnM1dybHNQZ0ZlRlNwZzdCL2tGK2ZEeTlNS1lzZU1ra1I0QVdQL0x6OWk0Y1lQMGZnQVlNUEJEMERTTjJiTm0yTzNiUDJmTzRQbm16YUZXcTJHMVd1SHA0WWt6cDA4ak9yb0Z6cHc1alpFalB3RmdMN0JzeU1pQVVxVkNXRmdkMGJNN1ZZRzNaaVVJTWI5R2NBREJFUUJIa0NSSGtTUklrdUtrU0ZNTVF3VnZUYUZRbGdHYlRhN05OaHkxbXgyTmlJaTRZTFZhTjVJaytjYlRjRko5ODgwMytPQ0RENlFjV0dSa0pHN2N1SUhKa3lkandJQUJXTGh3SVJvMGFJQlpzMmJ4ZDgvNjlaR1Nrb0kxYTlaSTMvSDIyMlZpRmNYRnhVNkxGUXFGb3B3c21jdGNCZ0EvcjF1RHhvMGJvOS83SCtEYXRXdFlNRDhCTFZ1OWdPRGdZUHl5WVNNdVg3NkVxVk1tMjMxbTJneitmTXpQejBQY3dGaEpmOE5zTm1QcWxLOHdaZXAwQkFZR1lzY2YyL0g5Z3ZtWTlQak83clFBQUNBQVNVUkJWR1haNTVzMGJWcU9lZmhPQXN1Wm1abVk5dlZrTUN3RG5aQW50QlZZL3ZQUG5aTEFja0ZCQVJRS0JjeG1NK1orOSsyV1pVc1haemw0YXJiZ0pvU2g0UGlIV0RTd1NaL0p5cncxV21qV1ZhbVVJT1Z5T1J5OE5qZ094Z3U5SWd3QUppOHY3NmtKUjgrZlA0OFhYbmpCN3JtWW1Cajg5OTkvTUJxTk9IMzZkRG14MnRhdFcxZjRmU3FWcXB4S0Q4QnJWVDRNZlVxWFBmb1czYUlsZHYrNUN5dCtYQTVUYVdtVkJWVllsc1dYa3lhaTJ5dXZvVVdMbGdCNGFjalUxRnVJSHpzRy9mdjF4Wm8xcTJESXlMRDdYTDE2OWZIRy8vVzhpMnZrSENhTUg0dUJjWVBRcnQzL3N3ZllDZ1NXOC9Qek1Xcmt4L0J3OXpqa3hGdXpMUnBJYkI2MnVUV0tzZ2xEWlJSa01ybU50NmFBU3FXR1RBUTJzV3RYREVjcGl1SUVIVUhiMlZIR3g4ZG5EOE13aHdpQ2FQMmtuMVFxbGNycENTUCtYeWFUbFZNNnIweVVOamc0R0tXbHBjakx5NE9IaHdjQXdHS3hJRHM3RzdWcXVXanZYT1lFMktKYklISCtRaHc3Zmd3clZ5d0hUZFA0Y3ZMWGQvemMwaVdMb0ZRcTBhZnZlOUp6Rm9zRkFRRUJkbUhyL1ppN3V6dEtTMHN4KzV2djRPYm1oak5uVHNOZE9LOUZnZVdPblRwTDNxSldxNFdibXhzSzh2TXhlY3Ewb3krLzFPWjZKZDZhMkx2R2xuVnBDR0VvajFHU1F5YVh5VURMNWFBVkNpaVZLcWcxYXBBMFRVTXU5SDVVRUpMYUZSRUFXSXVLaW41K0drNnFoZzBibGt2cUh6NThHSUdCZ1hCemM4Tnp6ejJINDhlUDI3M3UrTGV0UlVWRlFhVlM0Y0NCTXFIa2d3Y1BnaVJKdEdyVnluVVZ1NnljVFpzNkJjZU9IMFA3OWgwd0xuNENqaDQ5VXU1bTZtZ0hEeDdBL24zN0VELytjenNXNFlpSUNCUVVGT0N2L2Z1a2ZOdm1wTi90UG52NThpWDg5bHZWZ3JMbkdqZUcyV3lHUXFFQXd6QTRjdmdRbWpUbHRVd3JFbGdPQ0F5RXU0Y0g4bkp6ZDFma3JRR0VIWnNIUU5oNGJHVjVOY3JPVzFOQXFWQkNyVlpCcTlGQ0pnSmJSVVVFbTdZUGFSS2hmZnYydng0NWN1UkRnaUFlZTAwRWxtWHh4eDkvbEh1K2JkdTJpSStQUjgrZVBmSHNzOCtpYytmT09IandJT2JNbVlPSkUzbXg0S0ZEaDJMZXZIa1lPM1lzUHZqZ0F4dzllaFRmZi8rOVhWaTVidDA2NU9ibVl2RGd3ZEJvTklpTmpjWFFvVU9oMCtsQTB6VGk0dUxRdjM5L1NUSGJaUzZ6dFQ1OTNzUHMyVE93YnMxcXNDeUxVWjk4Q3BJazdZb0grZm41ZUt2bkcyajIvUE1ZTzI0OEV1ZDloOUxTVWd3Wi9LSDBQWWtMZm9CT3A4TzBHYlB3M2JmZjRJZUYzME90Vm1PVWc0NW84cWxUMkxoeEEzcjArTDg3N2x0b2FCaDY5UGcvRFBwd0FEaHdhTk9tclNRZVhwSEFza3dtdzdqNENlZGZlNlhyMlFxOE5RdEJpS0FtRkEwSThONGFSWUlpS1U0bVZVTGxVdDhhcmFDaFZDbWhGaVlQaUo0OWV5SS9QeCtGaFlVb0tpcENjWEV4U2twS1lES1pDSlBKQkJzOUJKTGpPQmtBT1FCbFVWSFJBSlZLOWZYamZOSWtKaVpXMkJ4Ny9mcDFoSVdGWWRteVpaZ3hZd1p1M0xpQnNMQXdEQjgrSEVPR0RKSGV0MlBIRG93YU5RcFhybHhCVkZRVVdyWnNpUTBiTmtpNm9qMTc5c1NOR3pkdzRzUUpLWjgyWXNRSXJGMjdGaVJKb21mUG5wZzNiOTREbjRCdzJhTmwrL2Z2UjNoa2c2Zml0eG9NaG0rZmoycDhCRHo5dDZocllBUlBCVjVDRUVRcEQzQ0VsVmVob2ppWlRDWXFVSEcyVEI0YXJSWTZuUTZlbnA3dzhmRkZVRkFRd3NMQ1FQVHUzUnQ1ZVhrb0tDaEFVVkVSaW9xS1VGSlNndExTVXBoTUpzSnNOc05xdFpJc3l4STJlZ2owNHNXTHZXSmpZLzhBRVA2MG5vd3BLU2tvTGk1R3k1WXRwZWNtVFpxRWJkdTI0ZGl4WXcvVTY3eHg4ei9rNU9TQVlSaVVsanlkSTFwS2xRb1VSY0hMMHh0aFliVWw4bFJueG5HY3NHYlpzRnByYnMyVUtoVmtNaG04dmJ3UkZoYjYxQU1ieDNIWFBoc3pldUxhTmF1TEFKU2dUTmZBQ0Y1YXJ3U0FXUUEyUnBEV1k0VndrMU1vRmZ4Y3FFb0Z0VVlEblZZTE4zZDNlSGw1dzkvZkQ4SEJJUWlQaUlCTXBWS2hwS1FFTkUzRGJEWkRMcGZEWXJFNFZraHRRMUlHQUROdzRNQ0MzcjE3LzZSVUtpYzlqZ3M4Yk5nd0pDWW0zczhCd3BVclY5QzNiMStzWHIwYVRaczJSVXBLQ3ViUG40LzRlTjd0dnBOS2txUHA5WHI0KzkvZDZMUEpaTWFaTTJkQXlXVFF1Ym03NVBlS2pNak55MFhXeVV3MGJkSVVOQzEzZXV4T25EZ0prcUtnMWRYOG1oVVZHWkdkazRQTXJFeEVDODNhRmRudEo3eWZNVGMzZC9QYU5hdE5OaUdvV1FReUFCWU9ZQWdIYlFQeFB4ekhnV001c0N3TGxtVjVKZytCemNOcXRjQmlzY0JpTnNOc012UEFwbFFxVVZKU1lwZHJrOGxrc0ZxdG9DZ0tETU9BNHppSk5wempPQVlBczNuejVwL2ZmUFBOOXdEVWZkd1dPQ0VoQVFrSkNmZjFIVDE2OUVCOGZEeEdqQmlCdExRMEJBY0g0OU5QUDhYSEgzOHNYVUExYmVuNmRGQXltVXN3V1RDTlJndU5Sb3NNZlJyUzB0TVFGbHJlUzdwKzR5WklpbnBnYTJhN1R6ZHYvb2ZRU21UNGFnVUhQOG5lMnZXbFM1ZWNkQUExbTl4YVdZdEhHYUVrQmJsTTFBM2xxNTZpdDZiVmF1SHU3ZzVQVHkvNCtma2hPRGdZZGNQRDBhalJzeUExR2cyVVNpVVVDZ1ZvbW9adE1VRW9Jb0NpS002bW4wMXMvYkQyNnRVcnQ2U2taT1hUZkNIRng4ZmordlhyTUpsTXVIcjFLc2FNR1ZOcENGVGRscDJWL2RRT1QxZG1XcDBic3JLeW5iNldrNVB6VU5aTXEzTkRWbmJXVTN0TXNyT3preFl2V2xnSys0S0JDRzRTazRkdGl3Y2ZpcEtnWkJSSFVRN051TUtVZ1ZxdGtrRE8yOHNiTXBrTXBGYXJoVnF0aGxLcHhMMjBmcXhidDI0dHgzRXVodDJIY2dlODkrSHBwOEZ6WTFuRzZXc1BhODAwR2kwWUsvT1VucXZjeFc5bXp6cmhCTlRFZkZvNXdSWmU2WjEwbUFmbFI2ZmtBcWlwVkVwb05CcTR1Ym5CdzlNVHZuNitBQUNaVHFlVEtxSkN3Y0F1MXlhVHlUaXIxVW93RE9PMFlUYzJOamIvcmJmZVdxSFJhS1kvNFFjR2VyMGVCb01CVm9hQnNiQjYyRTIxV2gxa2NobjhmSDN2V3RxUElJQ1NFaGVYVzBWV1VnSFAzY01zcnR6cjhTS1NNMEhNVHdhdTVOM2JoaU04d0EySkFoZmxXeTIvb3lBL0h6ZXVYMFZSa2JGU0lBK3JFdzQzZDNka1pHUWtyZnBwUllXNU5UaHB5Q1ZKa3VQNzFtU2NURWJ4b0NhVGc2YkxkQTU0alFNZDc2MTUrMENoNExzTFpCNGVIaWdvS0lEUmFKU3FvV2F6V1FJM3E5VUttVXdHaG1IRXBKM1UweWJrMnF4dnZmWFdtaTFidHJ4QkVFU0xKeFhVa3BPVEFZS0VScXZqMlUyclVkdTRxTWlJZEgwRzB0UFRxMTBKZnRmT0hWaStiQ2tNaGd3RUJRVmg1YXExdUh6NUVtTDc5NVBlTXpaK0FycDI3ZVpDd2tmWkVwT0JxM24zL3ZrcmVTRG1KNE5iMHJGYWR1ZjZ0U3NvTGk2NjQzbDk0L3BWUE51NDZZbDNlcjJaN0FUVW5IcHJrSmh5YllmYzVaREw1SkRUZkRPdVFxR0FVcVdDUnNOUE0zaDY4WGsyMFdTZW5wN0l5OHREWVdHaGJROGJhSnJtcXd3T1hwc042NGVrMXJ4OSszWnpRVUhCais3dTdrOGtzT24xZW9BZzRlZGZNMkxKWW5MWm9FOURlbnA2dFlreXA2V2xZY2IwcWZoeTh0ZUlqbTZCZ2dLZUdpY2lJaEs3ZHU4REFBeU1mYi9HMW0zWjBpVjR2WHNQT3pZVGNiL216dmtHS1NuL2dLWnB0Ty9RQ1lNL0dpSU5YNmVtcGlKaDdoeWtuRTJCUXFGQXg0NmQ4R0hjNEhMRDJkVnBkOXJtaXpFdlFDNlhneUJJaElXRm9YL3NBTFJ1SGZQQXprSGlma0ROQnR5cXkrNEVhcmJnOXQvTm0xdXZYTGxzdllPM3hwVFByVkdRVVJRbmpVN0o1VHdkT0UyWGVXczZMZHc5UE9EdDdXTTNBa242K1BqQXc4TURPcDBPYXJVYUtwVUtDb1ZDeXJVNXk3YzV5N1Y1ZUhoc1psbDIyNU1JYkFaREpqUmFYYzNuWUhSdU1CZ00xZlo5Ri8rOUFCOGZIN1J1SFFPYXBpV2VPSUlnb0ZEd2Q3MjdiVW01Ry90eCtWTGs1SlJQNEUrYU9BRzFnb1B4Mis5YnNHanhNaHc5Y2hoSlNac0E4RDE1WThlTVJyMzZEYkRwOXkxSVNGaUEvZnYyNHJlTk5jZTlVTlZ0Smk1WWlNMWJ0Nk4vN0FETW5qa2RHMy9kNFBJazcyQldxM1ZYbTVnWExqangxQ3IwMWtnN2I2ME0xT1RDUEtoQ3FZUkt4Y3ZzdWJ1NXc4dlRDLzQyM2hvQWtINStmdkR5OG9LYm14dTBXaTNFOWcreFNtb0RiSndOaGJqZGlCWDRhWHlMd1dENDhZazhPSXoxZ1NTYk5Sb3RyRmJyZlgvUDZkUEo2UDVhTjh5YU9SMTZ2UjdkWCt1RzdxOTF3NG9mbDFmNU80NGVPWXcrNzc2TjlpKzNSV3ovZmpoMzlxemQ2L3YzN1VXLzkzcWphK2NPNlA5K1h4dzljbGg2YmRqUWo5RDlOVDYwSGZueGNIUi9yUnVHZmpSSUFwRzJiZHZodlg3dlE2RlF3TS9mSDgyam8zSHA0a1VBZk1YUzA4c0x2ZnYwQVUzVENBNEpRZXVZTnZqMzM1cXJUOTNOTmxVcUZWcTNqc0c0K0FsWXZHaWhIZkhpazJCRlJVVkkrbjBUeG80WlhUMGg2L1hyTzJFL0Uyb0hiQnpIV1RtT1l6aU9ZMW1XNVFoQTh0WktTb3E1VElNQnFiZHVvYUNnb0l5OVE2bUNScU9HUXFIQWd2bUpPSGp3TDZqVWFudGdDd29LZ28rUER6dzlQYUhUNmVEWS9sRkpsYlNjMXhZWUdIallZckVzZWRLQXJib0tCVlhhbHRGNDM5L1J0R2tVTmlWdHhjY2pScUZXcldCc1N0cUtUVWxiMGUvOS9sWDYvTlVyVi9ENWhIZ01IaklVVzdmdnhKdHY5Y0tva2NNbGlwdWJOMjlneXVRdjhkbG44ZGl5YlFkZWZmVjFqQjgvVGhLbFNVaGNnRTFKV3dFQWMrYk93NmFrclVoY3NKQS80VWdTdmZ2MGhZZUhwM0RpWDhQaFE0ZlFzaVZQQXVEajQ0T0V4QVZRS2xVU0VKNU9Ua2JqeGsxcWJNM3ZaWnZSTFZyQ2JMRklnUHc0bWVNUXZmaDNWbFlXQnNiMng1VXJsNnZsUmxKYVdycG0vUGp4dHh4QXplVG9yZkZqVXp5ZU1Bd0RrcVRBc2d3c0Zncy9TUkFlanN5c1RMQWNCNlZDQ1pYUTNuSHMyRkVvbFVxNHVibVgyemFwVXFrUUVCQUFiMjl2dUx1N3c3Yjlvekt2elZsZkcwRVFsblBuenEwRWNOdmxoRCsrdG1WTEV0cSsxQTZ0VzhkQW9WQ2djNWV1YU5Dd0lYYnUzQUVBOFBiMndiTGxLL0ZNbzBZZ1NSS3Z2dlk2TEdZemJ0MzZyOHJiT0hmMkxEcTJiNGQrZlh1alFjT0dlTEh0UzA3ZnQvRDcrVkNwMWVqYTdaVUg5dnVyc2syQ0lPRGw2UVZqa2ZIUk9YQUVvUDBnQ202ai93ZENLWVBxdGZwd0c5Y0doSnZDN20yalI0M0E2ZVJUQUhqRzNPOFh6QWNBZUhoNDRLZlZhOUh2L1ErcVkyOXVIenQyN0s4S1BEWGIzalVXNEhOckZFVnhITWR4RkVXQlpWbE9vVkFJdyswcWVIdDV3V2dzaEVvb0dPVGw1Y0ZzTXVIRkYxK0VYRjUrdW9RRWdLQ2dJUGo2K3NMVDB4TnVibTdRYURSUXE5VlNIc1laQTBoRnViYW9xS2lyeGNYRlB6enBGMy9YemgxUVdQaGtDdHJxOVhvRUJ0cDM1ZGV1SFFhOVBoMEFvTlZxY2ZMa0NjUjlHSXZlNy9UQysrLzFjZW9KVkdhTm5uMFdPLy9jaTUvWGIwUjZlanFXTFMzdjZLOWM4U1ArL3Zzb3BrNmREcGxNOWtCK2UxVzN5WEVjY25Kem9IMkVlZ2lWSFNOQXFPUmdjMHJndmZRMXFOOW9pTkkvcjhMOVUzdnF4Q0ZEaDJQcTExT1FtREFQMjdkdFJkLzMrQXE1ZUcxWGgrWGw1ZjJTbUppWTYrQ3BtWnpuMWppdVRNb1lrTWtvS0pSS21NMW1VQ1NQTmNYRnhTQUlRbkM2RkRoODZCQUdESWlEenMxNW83VU00S2wvQXdJQ2tKT1RVMkhyaDhWaUVXYXlySnpBOXNHeExBdUNJRmlPNHdqYlhGdWJObTFXSGo5K3ZCMUprdTFjL3MvalovNysvdENucDl2ZmZtK25JaXFLYjBVNThOZCtyRjcxRStaOE53L0JJYnhvMllzeEx6ajFhaHpCemxSYWl1M2J0NkZMbDY1UUtKVUlEQXhFKy9ZZGNQRGdBYnYzYlZqL0MzYnQzSUc1Q2ZQaDV1NytRSDczM1d6eitQRmpvT1Z5MUt0Zi80RWZIMFhyRUxqSHZ5ajliZmszRTdtZjdJUzhuamRLdGwyRzlYb3VkTU5iSW5ma0RwaVBwMEg3Z1gwTFVYaEVCRHAyNm95Vks1Wmo1cXh2NE9aMjcxTVljcmtjN2RyWlgrWTdkdXc0TUhyMDZPTlY4TllZQVQ5WXE5WEtDWkVnS0ptTVV5cVVJQWtDTjI1Y2w0WUhlRFlQRFU2ZlRzWkw3VjVHdlFZTjhPL0ZDeFVER3dDRWhJUWdLeXZMYWV1SENHd2l1REVNSXoyRUdWSVdBQ0gydFNVbko1c05Cc09TZ0lDQXB4TFlmdDJ3bnEveWNSemF2ZnovOEg3L1dBQjhtOE5Yazc1QVlXRWhta1pGNGREQkExSXU2a0diYlpHQ1kxbFlyVlpwd3FUYks2OWl5T0E0ZE9qVUNjMmFQWSsvL3RxUGMyZFQ4Tm5ZY1FCNGdSR0NBRWlLUW41K0hyWnUyU0o4ai8xc2JHQlFFSTRlT1lLNmRjT1JsNXNMWHo4LzBBb0ZmbHE1QXZuNWVYaTNkMThVRlJseDRNQmZhTktrTEorMVpYTVNOdjIyRVhNVDVqOHducnFxYnROa011RjA4aW5NbURFTmNZTStlaWlVN3FaRHQyRG90cnI4TWIyZUM3cUpQK1RQK2NGNk13K3FWK3ZCY2prYmNEZ3VPM2Y4Z1gxNzkyREsxOVB3emV4WitIcmFkTlNyZDI4QWJiRllzSE9udlpiNnRXdlh0aFlVRkRoT0Y0Z2VXem1HWElxaVFGSVV3SEZTMzZ4Y0xrZEFZQ0EwR2cxMFdoMysrZWNNL1AwRFFOTUtYTDF5QllVRmhiajQ3d1hrNUdTREpFbkk1WEwwZXZ1ZDhzQW1ocVM1dWJuSXo4K0gwV2hFY1hFeFRDYVRIYmpaZW0wTXczQWN4MEY0U05NSUFDeUJnWUVIVENiVGZKcW1oenhOb0paODZoUzJiRW5Dd2grV2dLSW9mREpxQkVKRHc5RHU1ZitIdVhPK1Fmc09IZEh6emJkdzdPK2pPT1RncFR3b2MyelFuVEY5S21aTW40b09IVHZoOHk4bUlUS3lIaVorT1JuZkwwaUVQajBkdFVORE1YUDJ0NUthVVpldTNYRDJiQXBpKzc4SGlwTGg5ZTQ5RUJsWkR6bTVPWGJiR1RWcU5HYlBtb25seTVhZ2R1M2FXTEpzQldpYXhveVpzNUdZTUJjL3Ixc0x1VnlPdGkrMWsvSTZETU5nMWt3K0RIeW5sejMzL3NwVmF4QVFVUDI5aEZYZDVyQWhINEVnZUlMRlQwYVBlYUI5YkZXeGt1Mlg0ZmJKLzBENXFKSFZleU0wYno0RDk4OWlrRC9qb04zN1VsSlM4TzJjdWZEejk0ZWJ1enRPbmpoK3o4QldiaDlLU240Y04yN2NEUUc4ekk0RkExUXdaUUNBczFnczBHaTFuTnhHdzBBdXA1R1duZ2FaVElZNmRlckN6ODhQMDJmT1JvUDZEZURqNjR1RjM4K0hWcXV6QTdWeXdPYnY3NC9zN0d6azVlVkp3Q2FPV1lrZW00M1g1aGlTMmswakVBUmgzck5uei9KT25UcjlqeUNJcUtjRjJJNGRPNG9PSFRwSnpZS3Z2UElxamgzN0crMWUvbjlJU2ZrSEV3VkZvUENJeUJyZmwwNmR1NkJUNXk3bG5vK01ySWUvRGxhdVk5cTZkVXlGRjY1Q29jQ0V6eWZhUFRmd3c3aHk3MnZSc2hWKzJiQ3gzUE1Sa1pINGJwNXp5aWlLb3JEL3dPRUhlc3lxc3MwN3JkZjltazVYRFgyU0RJZUNtWWVrUDQzTFR3UExUNWQ3MnljMnJMbE5tMGFoYWRQcXVUdzVqanZ6eHg5L09CWU1iSE5yWmltM1JoQ3NRUG5OV2ExV0RnQ1VTaVduMCtta1dkQ2lvbUpjdW5nUi92NEI2TkN4RTgva0lVd1krUGhXUGhwV0xqdGFxMWF0Y3JrMjBXTno4TnFrY0pSbFdWdlZlSWJqT0JLQXRVdVhMdnJzN093ZnZMeThGajVOWHB0dHo2dkFZeWNsbkd1eUlkWmxqNjlSRklXaUl1TWpRV2pnN2UxOVR5bVN0TFMwald2WHJqVTZBVFdUSGFqeG5Hc3NRWUFqU1pLbjlwYnpQV3JpMkpTQ3B1SHQ1WVg2OWVzTHRFUys4UER3Z0krUGo5MWt6cURCemdQQ2N2dzY3dTd1Y05iYlZrSGpMaWZTRzFYVXRPdnQ3YjNkWXJFc2ZscE8wT2JOVzJEWHpwMG9LU21CeFdMQnRxMWIwRUxvMFdyYU5BcmJ0L0Vuek9WTDFkUC9wRktwWGFod2wydnpNTmVzb20zNytmbWgyRmh4bFowTDk3aC9qNm9hdmtNMHRkbyt0MWhhV3JwNjVNaVJGMjFDVUpPRHQyWlhNQ0FJZ2lPRVpuOFpyempGeWVVeVlSYVVsbVpCK1NGM2dTWFgyeHYrL2dHU2R1bGRlV3dBWDBnUXZUWmJxbkJIcjgyMmlDQjZiU3hmQm1PRVNpbEpFQVIxNk5DaFpXM2J0bjJlSUlobVQ5S0ZNK0NEZmlBRTdqVmZYejhrSkM3QTg4MmJvMVBuTGhqMElWOHdhUFBpUzJqWDdtVUF3UEFSby9EbHhNL3g2NGIxQ0krSTRCT21UOUNkL2xHeUltTmhoYTBMNUVOYXN5SmpJYWdLV2tnQ0F3T1JucDZPekl4MHFBV2lCVHNiR2dVdU1mbWVaMGE1Y0E5Z2FQVmxoT3JValpBRzRUbU9PNzFuejU2OVR2SnF0dTBkamtVRGZuUktISnVTeXlDWEM1NGJMWTVObFEyNWUzbDZ3Yy9YcjhveWxVNVhXUzZYSXpnNDJLNklZRXRwSklhaWp1MGZUZ29KVmdDV2R1M2FwV1ptWmk3MDhmRlo5RGhlSkZvbitZOXRmK3lxOFAyOTNuNm5YRElUQVBMeWNqRno5cmR3YzNQRG5qMjdVVkpTVXFWdDNTbHN5TTdKY1FHYmd4bU5oZkR4OVhINm1vK1BON0t6SC95YUdZMkY1UWdCYksxWnMyWXdHQXpRNi9Vb0tzeTM3NVBVQWhoYkcwRHQrOWlEYk9CeWR2VmRGMW9OdEZvTmJ0Njh1ZkhISDM4c3FDZ0VoWU95TzUrVkVaVHZPQTRjeTNJY3k0SmxHVENNbFg5WUxiQmF6TENZUzJFeGw4SlVXZ3hUYVJGdVhyOXk3OEFHQUFFQkFjak56Ylh6MnB6bDJtdzlOb2RDZ3VpMVdRaUNJSDE5ZlhlV2xwYk9WU2dVSHo5dUY0bXNtdTd3cFNXbEdETjZGSy84cnRWSzdSTzJkM1JuWGRTVldXaG9iV1JtR3BDaFQ0Tlc1K2JTUERBV3dtZ3NCR08xSXJTMmN4QUlDdzJGd2ZEZzFremNKNVpoRUJaYU9URDUrZm5aMGU4ODZwYWZuNy9rcFpkZXVsU1J0MFlRaEFoc0RFRVFqTWpjSWFwTzBUUU5sVW9sZUdkbGROOWVYbDd3OVMxVG5XclFvQUVhTm14WTlXdTJzaGRyMTY1ZFlWK2JvOWZHc2l6aFVFZ29WeVZkdFdyVjB2NzkremNpU2JMOTQzU3grUG41SVYyZmNkOFhRRlN6WmxpNHFPSlIycUlpSXdJRDdrN01oU0FJTkcvZUhOZHYzRVJPVGpieWNuSlFXdnAwa2srcVZHcVFGQVVmYngrRWhvWlUrdDRXMGRHNGVmTS9aR1psMWVpYXFWUnFVREladkwyOTd3aHFqNXRacmRaOUV5ZE9QT0FBYXFVaXNBbWdacDlYRTdRTVJDVjN1VnpPeWVWbHhKRzJBT2ZoNFFGdmIyOEVCQVNnZHUyN1d6dmlUb0lqdDI3ZHd2bno1M0h0MmpXa3BxYkNZREFnSnlkSEFqeEhMVklCOUFpV1pRbVdaU21PNHlqd1dxUTB4M0hLR3pkdXRBb05EWjBMNExGU0h6bDFLaGtFUVVDajFVRmR6WGY0NGlJampJVUZBTGhxSjVwMG1jdHF5TklQSFRvME95WW01cFlBWkNYZ05VS0xZSzhQYWl1bHg5aDZhd3FGZ3BQMFFUVzgwTEdIaHdlOHZHekVXZXJXeFRQUFBJT1FrSkM3aTdMdTlJYVFrQkJKVU5reDErYlkraUhLWW5HODJVNGtXSG5uZ2lERHdzS09GeFFVSk9wMHVxbVAwMUZzMWl3SzZlbnBNQmd5VVZpUVZ5MHNIQURmdnlTVHlSQVVGSWlBZ0FEWDVlS3l4OEp1Mzc2OUtpWW1KbFVJTThYUXM5UkpDR29WdkRWcDBGMGlqUlJDVVZ1YWIxRy9RQXhGYTlXcWRkZWdWaVZnNC9NNG9VNXpiVTU2MnNSQ2dtTnZtemh1WlNFSWduSnpjL3ZaWkRMVnBXbDZ3T04wTUFNREE2dU4zZFpsTG50Y3pXZzByZzRPRGo0Ris5WU94eERVWWhPQ3NzNUMwSXBBalZkMTkwRlFVQkJDUTBQdmFSK3JwQk9uMCtrUUVoSmlSMjlreTdnckRxa0svVzEydlcyQzF5YjF0b2tMc1d2WHJpVXN5KzV4blNZdWM5bGpsVmZidjNEaHdqMXdYZ0dWUERZNHpJTUs1SkdjTGFqUkFzVzNHSTdxZEtJb0M1OVhDd2tKdWVlSkRObk5temVyam9JOFZaSFQ3bm54T2ZGMTRTRW04RmloQTU4UXdlMlZWMTVKTzNEZ3dQY2hJU0doQU1KZHA0ekxYUFpvRzhkeDEwNmNPSkgwNmFlZkZqb0pRY3VCbWlDQWJDZW5aNHNmRmVFSUwrUkNnbVZaM0EwKzJRSGIzYmg2dnI2K1RpY1JiQVNXWVVNZlRwaE1KaEFFQVVHNlQyb0JJZmhmUkxacDArWkVUazVPZ3FlbjUreXFoc1V1YzVuTEhvNnpkdTNhdFRWdnZ2bG1xb08zNWl3RXRkcTJkb2pocDhEdktCVU10RnF0WGVncFZqOGpJeVBSdUhGanFOWDNQaUZ5VjJDaVZxc1JHaHBhYm9hMGd2bFJqbVZaUWl3a2NCekhDZ1VGMjZrRTBzdkxhM054Y1hHUVNxVWE0enAzWE9heVI5T3lzN01YaDRlSG43WHgxRXB0SHdSQm1HeEJ6VEVFRlNRR3l1WFZiTUhOVjlEV0RRME52UzlRdTJ0Z0EvZ0Vla1Y4YmM3R3JNVEdYUUhjT0dFcVFjeTNrUURJVnExYUxUbHg0b1MvWEM3djV6cUZYUFlVaDNyUTYvWEl5RENBWVJnWWpZOEdRM05wYWVuUDc3NzdybTIvV3JrUWxPTTRDZFE0am1NRlJseU9aVm1PWVJnN3ZqOHhzaE1mWXBWVW9WQkFyVlpETHBmajBxVkxEeGJZQUNBOFBOenBxSldUYVFSTzZHY1RSNjNFV1ZMYkZoRGluMy8rSWZmczJiTzRmZnYyZmhSRmRYR2Q0aTU3R2tFdE9Ua1pIQWhwR3NML0VkZ3ZpOFh5NTA4clYrekt5Y214T0FFMTJ3a0RmbXlLSUZnQ1lQbDBGSy9lTGpCM2NFb2xMOFNpMFdqNW5qVjNEM2g1ZThIZlB3QzFnb01SWGpkYzB0RzRYN3VuYjZBb0NuWHIxa1Z3Y0REOC9mM2g1ZVZsVnlsVktwVzIrVGRPWkFLeFZiWVMzRlVyK0JZUWMrZk9uVk12WGJxMGtPTzRZNC96Q2JwcDB5WW9sY3FLRXhWV0swYU1HQUUvUHorNHU3c2pMaTVPVW5keTJkTnJlcjBlSEFqNEJ3UTlNbU54TE11ZVBIVHdZTkxFTHlZVU9PVFVTb1JIcVIyb1NYUkVKRmUrQ2xwK3VrRG5wb09IaDZkRVJWUTdOTFJhUU8yZWdRM2dGVzNDd3NJUUZCUUVSMjFTSnlwWG9wcXpYUXVJQTdpWm5ubm1tWlMwdExRRkhNZGRlVkpQNEhIanhpRXBLUW5yMTY5SFVsSVNkdS9laldIRGhybXU3S2ZjRElaTWFIVnVqOHorY0J4MzlkeTVjK3Y3OW5rbnd3SFViQ3VnSmp0UUUzcldTRkthQjRWY0p1Zmt0Q2gwcklCS1pUOWw0T1BqQS8rQUFJU0UxTDR2N1lWcUF6WUFDQTRPUm1ob0tBSURBeVgrdGtyQURiYjliUUovbTBRbExqeE13Y0hCQjNKeWNoSUFaRDVwSjI5UlVSSG16NStQMmJObm8yM2J0bWpidGkwV0xWcUVGU3RXSUNzcnkzVjFQOFhHTU13OWVXb1h6cC9EcUJIRHEzdDNzbTdldkxtNmErY08xMkUvMkc0SGJBUkJXRGlPczRpQ3h4ekhDUnhyRkVlUUpJcUtqTWpOelVHbXdRQUN2TmkwUnEyRzJXVENnYi8rd3BZdG0vSG5ycDN3OXZhdTlzYjMrL2I3NnRXcmg5cTFhMHZnNXVIaFlTZmhad051WWtncTlzT3h6a0pTQUNZZkg1OXQrZm41M3drTFdLUFdxbFVyVEpreUJTKy8vRExVYWpVaUlpTHd4eDkvWU83Y3VRZ09Eb2E3dXpzR0RCZ2dxUzJOR0RFQ25UdDN0dnVPN3QyN1k5Q2dRVTYvdjJmUG5tamV2RGtBSURrNUdTVWxKV2pidHEzMGVwczJiUUFBUjQ0Y2NWM2RUN0VWRmhiYzArZnFOMmlJaVY5K1ZaMjdVcXJYcHk5djA3clZlWlMxZFpUYWhKNjh0MmJYMmtFeUpFbXhITWV4NERqSVpCVE1KaE5VS2pVWEVsSWIvZ0VCU0U5UGgxcXRnVnFqUVVyS1AzamwxVmN4ZXZRWVJFUkU0dkNoUTlXK252ZmRPMFlRQkNJaUlwd3FXam1yam9vdElBQUlBRTZMQ1J6SGtSNGVIdXVOUnFOR285SEUxL1JKTlgzNmRHemV2Qmt4TVRFWU5HZ1FldlRvZ2U3ZHUrUENoUXM0Zi80ODJyVnJoNjVkdStLTk45NjQ2Ky91MmJNbmNuTnpBUUMzYjk4R1RkTjJuRnh5dVJ6ZTN0NUlUVTExWGQwdUsyZloyZG1ZK3ZWa1pHVWFRSkFrQmc4ZWdwYXRYa0JxYWlwR2pSZ09pOFVNRHc5UExGL3hVMW02NDdOUGtaYkdhNWJuNWVWQnJkRmc3YnIxQUlDclY2OGlZZTRjNUJma3c4dlRDMlBHanBORWVnQmcrYktsaTcvNGZQd3BCMUFydFFFM3ZsZ0FXSVJybGlVSXNBUkpjQVJIZ09NNFRpYVRnV1ZaenQzREhRcUZBZ1JCUUorZURyVktEWXFpb0ZhclViOUJRd1RWcW9XaUlpTU9IVHo0TXJuRXdBQUFJQUJKUkVGVTZBRWJ3STljaFllSGx5T2pGTXU4VGdia2JmdmJJSVNrNG1TQ0NHNkVWcXRkV1Z4Y3JGS3BWQ05yOHVUcDBhT0hwSTM0eGh0dllObXlaWmc2ZFNwME9oMWF0bXlKWjU5OUZ1Zk9uYnNuWUh2NzdiZWxmeGNYRnpzdExDZ1VDcGhNSnRkVjdMSnk5dk82TldqY3VESDZ2ZjhCcmwyN2hnWHpFOUN5MVFzSURnN0dMeHMyNHZMbFM1ZzZaYkxkWjZiTm1BVUF5TS9QUTl6QVdJd2NOUm9BWURhYk1YWEtWNWd5ZFRvQ0F3T3g0NC90K0g3QmZFd1NCSWJ5OC9OKytPTHo4WWVkaEo0bGQ4aXJjU3pEaUZSbGtNdHBVWndGUlVWRk1BcHN4a29WSDcxcHRGcjQrdnBpKzdhdHlNL1BSMTVlM3FNSmJBQ3ZjR1ZMSVc3YnRHdmpzZG4ydFVuZ3hwYXA2aklDMEVuZzl0WmJieTFadjM0OXJWUXFhMHpHejNiNlFxRlFTUGxEMFdpYXJoYmdVYWxVTUp2TjVaNDNtVXdQUlovU1pZKytSYmRvaVlTNWN3QVFhTkdpSldaL002ZEtuMk5aRmw5T21vaHVyN3lHRmkxYUFnQ3VYNytHMU5SYmlCL0w5OEt6SEF1Tm9GMVFXRmk0N0oxZWIrMUgrYWtDK3hEVVJrSlBGRHRtR0lhVHkrVWM3NXlBbzJtZUxEWFRZSUJHbzBWMGRBdjgvZmRSdUx0N1FLVlVnbVZaclBoeE9YcjFlaHNObjNrRzQ4ZU5mWFNCRFFEQ3dzTHN0QkVjcHhGc2lDaGg0NjF4QXZpSmt3a1FtdjFBRUFTeFpjc1dZdHEwYVV2aTQrTmxDb1VpcmlaT0hwa1RIdnFLMUtTY1BXK3hXS3EwbmVEZ1lKU1dsaUl2THc4ZUhoN1NaN096czZ2TTVlNnlwd3pZb2xzZ2NmNUNIRHQrREN0WExBZE4wL2h5OHRkMy9OelNKWXVnVkNyUnArOTdkdWRwUUVDQVhkZ0tBRWFqY2NXRStIRjdVMUwrY2V4VGN3UTFPelpjb2RtZW94VUtqcGJMWWJaWVFKRWthSVVDRkVYQjE5Y1hkZXJVaGJ1N0J3aUNRR0JRSUhSYUhSaXJGUk0rbjRqdzhIQmN2UGl2ZEMwOHNzQUdBUFhyMXkrblJlb1lqanA0YlNLOUVXeHlib3lRZ3lNSWdpQysrdXFyUEY5ZjN5VURCdzRrRlFyRndJZDVvdEUwWGM1MXZuVHBVcFU0bzZLaW9xQlNxWERnd0FHOCt1cXJBSUNEQncrQ0pFbTBhdFhLZFJXN3JKeE5tem9GMFMxYW9uMzdEbWdSM1FKdjl1d0JsbVVyN2ZjNmVQQUE5dS9iaDRXTGx0amRpQ01pSWxCUVVJQy85dS9EaTIxZnd0V3JWM0hxNUltZnpwNDl1MmZqeGcwbE5wNWFpY1BEUkJDRVdjaXAyYkhoTWl6THlTZ1paREk1U2twS09IY3ZieWlWU3VoMGJsQW8rUCtYbWtyNUp0eGF3UWdMRFVOQVlDQVVOTTN2NjRFRGFOSzA2YU1QYkFSQm9INzkraEt3T1hwc0RNUFllbXkyNEFaaEZBTkN2czN1TzRjTkc1Wk4wL1NTZnYzNjRXR0NXOHVXTFRGNzltd3NXN1lNelpzM3g2SkZpNUNlbmw3aCs5ZXRXNGZjM0Z3TUhqd1lHbzBHc2JHeEdEcDBLSFE2SFdpYVJseGNIUHIzN3c4dkx5L1hWZXl5Y3RhbnozdVlQWHNHMXExWkRaWmxNZXFUVDBHU3BGM3hJRDgvSDIvMWZBUE5ubjhlWThlTlIrSzg3MUJhV29vaGd6K1V2aWR4d1EvUTZYU1lObU1XdnZ2MkcveXc4SHZRTlAyVGg2Zm5ueHZXLzFJRSswS0JiUU91eVhFT1ZPcFhveWdRRElPU2ttS1VscFp3YXJVYW5sNWVVS2xVcUZlL1BtN2V1SUdqUnc5RHA5T2gxOXZ2SWlRNEJQWHExMGY4K004eGVmSWtXTXdXaElTRVlNelkrRWNmMk1SY1VyMTY5ZXdxcExhNU5pR3ZWcTZZQVB0S3FTMjRFUVJCRUhGeGNaa21rMm5Sd0lFRFdhVlNHZmN3VHJUWFgzOGRJMGVPeE9qUm84R3lMUHIxNjRjQkF3YWd0TlI1WjhxR0RSdHc0OFlOREI0OEdBQXdlL1pzV0sxV2RPL2VIU1JKb21mUG5wZzdkNjdyQ25hWlV3dXBYUnR6NTgxM210YjRaY05HNXpmVFgzNnQ4UHNhTkdpSWhZdVd3R2cwcnBnMWM4YWVaVXNYVndScWtxY21naHBKa2d4UVJob3BveWhPcmxTQ3BoVWMzM3dyaUxLb05YQnpkMGRrWkNUOC9Qd1FGRlFMWVhYcW9HNTRPSlJLSlo1N3JqRitXTFMwUnRmdGpwb0g5Mk1aR1JrNGQrNGNybHk1Z3RUVVZPajFlbVJuWjVmVFN4QkNWMElBUUVKZzRTVTRqaU50TkJQa0hNY3BBQ2duVEpqZ0hoOGZINnRTcVlhNFRuMCtVWHpqNW4vSXlja0J3ekFvTFhrNlI3U1VLaFVvaW9LWHB6ZkN3bXBYR3E1eEhDZXNXVGFzMXBwYk02VktCWmxNQm04dmI0U0ZWVXdSdG4vL2ZvUkhObmdnNjFSWVdMaHNRdnk0dlRiaHB6TlFzMlhzc0lpTUhXSnpQVVhKT0lIZW13YzFwYjI0c2Fkbm1jcFVhRmdZNnRkdkFGOWYzd2QyTHRRb0I1cS92Mys1NFhnbkZWTFk1Tm1rU3Fsd3dkcjJ1SW1GQlV5Wk1nVW5UNTc4WWNPR0RXYTFXbjNQclNBZE9uVEFuMy8rK2NoY21IcTlIdjcrZHpmNmJES1pjZWJNR1ZBeUdYUnU3aTc1dlNJamN2TnlrWFV5RTAyYk5JVllvWE1FdFJNblRvS2tLR2gxTmI5bVJVVkdaT2ZrSURNckU5RkNzM1pGZHJ1Ryt4a0xDZ3ArR0RwazhQNUxseTZhS3dNMWxGVkFKVDFRZ1RoV1VKb2lJSXhPU2F3ZEpDVlFmMU1VNURJWnhQbFF0VklGczhsVTQ3L3RnUUVid0l2QmlPQldXWFZVckpBS3ZXeWMxV29Wd1kyeERVdEZjTnUrZlRzMEdzM1N3c0xDVXExV094S0E4bTczYmRldVhZLzloWnl1VHdjbGs4RS9JQWd1QXpRYUxUUWFMVEwwYVVoTFQwT1lFeUxWNnpkdWdxU29CN1ptdHZ0MDgrWi9DSzFFaHErV1RadFJOVnRwZG5iMjRsWXRteDlHZWZiYmlqdzFLd2lDSVFDR0VEdzFHVVZ4TXBuZ3FZbEQ3V28xdEJvTmRIYWtrWUdvWFRzVWtaR1JDQTBMZStEbndRTmhyUTBQRDY5SVlGa0NPSnU3cVpScnMxcXQ0bXRPd1EwQWREcmRxdHpjM0dJUEQ0L2hBSHlmdGdzNU95c2JXamQzRjZJNW1GYm5ocXlzYktmQWxwT1RBOTFEV0RPdHpnMVoyVm1WQWxzTldaWmVuNzQ4K3Ztb1U3Q2YvWFQwMHV4QkRRS29FU1JIRWlSSGtRSmJCMjFER0NuTWYyb0Z2UUkrQlBWRHJWcDhYdTFoZ05vREF6WSthZG5BS2JBNWVtMmk1eWFDRzhBUENGY0NicHlucCtmR2pJeU1JbDlmMzQ4SWdvaDRXaTVlanJ2MzRlbW53WFBMejh0eCt0ckRXak9OUm92ODNKeDcraXlSbkFsaWZqSnc1ZTY2OURsd1YyK2FzbGEzL20veStUdDRhcVp5b0VZSW9FWVNBZ3V1REhJNXpTbG9rYWxEQURXSkJkY0xiam9kTE9aUzVPVm1Jek5EZzh5TU5LZnJFRlluSEc3dTdvOC9zQUZBbzBhTnlvRmJCY0FtZ1p1WWNLc0kzTVMvL2YzOS83aCsvWHBCN2RxMTQwaVNqSzUrRU9IWlRRMEdBNndNQTJOaDliQ2JhclU2eU9ReStBbTB5SGQxc2hOQVNZbUx5NjBpSzZtQTUrNWhGbGZ1K1hnbEpnTlg3dzdVV0hBbno1WGNXdDg1ZGZaMWxKLzl0Ry9wc011cGxRYzFtUUJxdElMMzFCeUxCYUxJc2RWaWdvZUhSNlhLN1VWRlJ0eTRmaFdObXpaN01vQ05JQWcwYXRTb1FxL05HWmpZZUhCT3dVMzRYbzdqT0s1T25UcUhrNU9UODU1Nzdya0JGRVYxcms1UVMwNU9CZ2dTR3EyT1p6ZXRSbTNqb2lJajB2VVpTRTlQcjNZbCtGMDdkMkQ1c3FVd0dESVFGQlNFbGF2VzR2TGxTNGp0WDhiQ1BqWitBcnAyN2VaQ3drZllpTHNFTlF2SC9IbXc4R0pTbjR5RkdUYmhwK1BzWjRrQWF1WnlPVFU3VUpPREZnU09sUXBCTGsvaldBSDFRMkJRRUl3RmVaV0NtdTA1LzBTRW9xTEo1WElKM083Z3Nkbm0yeW9DTjNId2xoTkQwNmlvcUhNYk4yNmMxYTFidDB5YXB2dFd4ejdyOVhxQUlPSG5Yek5peVdKeTJhQlBRM3A2ZXJWeFU2V2xwV0hHOUtuNGN2TFhpSTV1Z1lJQ25ob25JaUlTdTNidkF3QU1qSDIveG83MXNxVkw4SHIzSG5ac0p1Sit6WjN6RFZKUy9nRk4wMmpmb1JNR2Z6UUVGRVVCQUZKVFU1RXdkdzVTenFaQW9WQ2dZOGRPK0RCdXNQUjZUZGlkdHZsaXpBdVF5K1VnQ0JKaFlXSG9IenNBclZ2SFBKcWVLbXYrZVUzMm9WMWY1UDFXVUFtb2xmUFVCQUxZQ2tDTjcxVlRxa1FSRmwwWnFQbnhiUjFob1dISXo4dXUwZU5VVlNNZnhrYVZTaVVhTldxRThQQndCQWNIUzBMTXRseHVZck9mUXFHUXhGVmxNaGxuSThUTTJISzVDVG1DVWdBbGI3enh4dTBtVFpwOGF6UWF2eEZldnk4ekdES2gwZXBxZkYwME9qY1lESVpxKzc2TC8xNkFqNDhQV3JlT0FVM1Q4UEh4a1R4blFRcXR3cG5ZNnJBZmx5OUZUazUydWVjblRaeUFXc0hCK08zM0xWaTBlQm1PSGptTXBLUk5mUGpFc2hnN1pqVHExVytBVGI5dlFVTENBdXpmdHhlL2JmeTF4dmF6cXR0TVhMQVFtN2R1Ui8vWUFaZzljem8yL3JyaG9WeTAzajkyaDl2by8wbC9leVYwaGJKVEJBQlljNjFGMzdlK052SDNML0oreTNmSXBSVUxqN0xxcHkyb2dXQmdVLzJrS0ZrNVVBTUhaR1ptb3JpNFdNcXArZnI2SWlnd0NLR2hZYWhYdno1b1lWUktQTSthTld1R2poMDdvbjM3OWdnS3Vyc3E5SW9mbDZQM083M3dkcStlMkxwbGM1azNhckZnOXF3WjZOZjNYZlR2MXhjSER4NTQrQjVibVplaVFhTkdqWndOeFpjTFMwV3hWZGhVUzRVVDBuRkNnUlBEMG4vLy9aZlY2WFFyTXpJeTlMNit2b01JZ3JoblVXWXJZMzBneVdhTlJndGp3ZjFUdUp3K25ZeEpYMHlBMld4R2NYRXh1ci9HaDVrOTN1aUpmdS8zcjlKM0hEMXlHSWtKODZEWHB5TTBOQXlqUHZrVWpaNTlWbnA5Lzc2OVdMWnNDVElOQnZnSEJDQXViakJhdmNCZmJNT0dmb1JiLy9GQ3R5TS9IZzZaakVKd2NBZ1NGeXdFeTdKbzI3WWR1cjN5Q2hRS0JmejgvZEU4T2hxWExsNEV3RmNzUGIyODBMdFBIOUEwamVDUUVMU09hWU4vLzcxUVkrdCtOOXRVcVZSbzNUb0c4dmdKbVBqRkJIVHEzT1doTUxObytqU0djVmt5Mkp3U0laemhydjFuemxyendzMnZ6c0plVGNvWm41b1FmaEpXZ0JOQmplVWRCdEttVUNEbmFLRlFrSitmRDBaUW1xSnBHbDVlWlo1YWFCZ1BhbzZTZVhYcTFBRkZVZGk1Y3ljVUNnVmVmdmxsWkdabTJwRkdPTTY5aW4rbnBQekRuMlBMVjhCa01pRXViZ0NpbWoyUG9LQWdiTisyRmFXbHBWangweHJrNU9SZzBJZXhhTnk0aVVRdG5wNmUvbkE4TnRGME9wMVR6ODNUMHhNNm5jNFp4YmlkTUl5b24rRGd1WmtGejYwVVFMRy92LzhmLy83Nzd5U0dZZmJlNjM1V1Y2R2dTdHN5M24vdW9XblRLR3hLMm9xUFI0eENyVnJCMkpTMEZadVN0bFlaMUs1ZXVZTFBKOFJqOEpDaDJMcDlKOTU4cXhkR2pSd09RMFlHQU9EbXpSdVlNdmxMZlBaWlBMWnMyNEZYWDMwZDQ4ZVBrMFJwRWhJWFlGUFNWZ0RBbkxuenNDbHBLeElYTE9SREJKSkU3ejU5NGVIaENZQ24wamw4NkJCYXR1UkpBSHg4ZkpDUXVBQktwVW82MFU4bko2Tng0eVkxdHViM3NzM29GaTFodGxna1FIN1FaamxyZ1BiRDUva2JMMnZkLy9mdGMvTmZ1UGxWQ3V3WmI0c2RIcVVFL3pBRGhBVUV5a0NOeit4d1ZxdUZrOGw1Q3YrOHZIekk1REtvVkNyVUNhdURxR2JQdzh2YkcxcXRGcjYrZnJ5bkZoYUcrdlhxUTZ2Vk9sM1h0TFEweVZsaFdSYWVucDUyNzFtNlpCSFdyRjRGQUVoSitRY2ZEeDhLQUxoeStSS2FSa1ZCb1ZUQ3pkMGRMN3p3UDV3NHp1czhuVGx6R20zYXZDaWNUd1RrY2hxWExwVWRoMWt6cHo5Y1lBTUFkM2QzQ2R4Q1FrTHN3TzBPRk9PMllTa3JoS2JpblVvRXR4SUF4Yzg4ODh5cG4zLytlVXBwYWVseVZ4cjZ6clpsU3hMYXZ0UU9yVnZIUUtGUW9IT1hybWpRc0NGMjd0ekJoMExlUGxpMmZLVWtsZmJxYTYvRFlqYmoxcTMvcXJ5TmMyZlBvbVA3ZHVqWHR6Y2FOR3lJRjl1KzVQUjlDNytmRDVWYWphN2RYbmxndjc4cTJ5UUlBbDZlWGpEV2NCSzh3aHZneWpOUWRZNUFpU2UxT3VIWDVTdTcvVGJtbGdPb09RSmJDUUdVQW9TWmY4QktDS3BTSk1DUklEaWFwam1TSkZGU1hNd1ZGQlRBM2NNZE9xMk9uLzEwYzRPN3V6dFVLaFhjM056NG5Kb0Fhcm9LUkZob21nYkRNUEQyOWtaTVRBeFlscFg0RGtWNzU5MCsyTHQzRHhMbWZZZkpYMDdDMEdHOGZrUGQ4QWljUEhFY1JxTVJCUVVGT0hmdXJIVFR6OC9QaDFLcHhObXpLZmhzekdqUUNocjUrZmtBZ0tUZk55RThQT0xoaGFLMjV1SGhnVWFOR2xWNkVvbi9GeDRjUVJDRXhXTGhiT3NNTE10eXR2MXRZbGdLZ092ZHUzY2FnSVRzN093YlhsNWVnd0RjYzRiK3dvWHppQnNZaTJYTFZ5SWlNaEpMbHl6RzVxUk5rcGRTa1gwMzV4c2NQblFJT1RrNW1EanBTN1I1c2UwakNXeDZ2UjRSRVpGMno5V3VIUWE5bm1jeDBXcTErSFBYVGt5WjhpV01oVWE3TUtLcTF1alpaN0h6ejcxSVQwL0hGNStQeDdLbFN6Qmc0SWQyNzFtNTRrZjgvZmRSSkNRc2NNcVpWeE5XMVcxeUhJZWMzQnhvSDFJUElWZGtTYjg4Zi9lcWhzZUduTUl4aWZ4UkJEWlRCYUduQmVCRXBYYUdBTUVKd0FZS0JDZVh5NkZVcXJpOHZGeFFsQXdCL2dGQzlWTUhOemMzZUhsNVFhL1h3TlBMU3dnL0c5eXhGMDBNUnc4ZE9vU21UdWlKdEZvdEJnMzZDQ05IRE1NNzcvWkcvZnI4dkd5VEprM1JzVk1YREJzNkdPNXU3bENyMUZDcFZkTG5ObTlPUWtsSkNhWk5uNFY1MzMwTEFNakkwR056MHU5SW5QLzlvd0ZzQU9EcDZXa0hiallnVmc3WXhHT0xzaVpld21hdVZBUTZhYTROQUN1UzRubDdlMjg2Zi83OGpYcjE2dldqS09ybGU5MWZ1VnlPdi83YWo0aklTQncrVkRYTzloRWpQOEdJa1o5Z25NQmcrcWlhdjc4LzlBNVVUTGR2cHlJcWltOUZPZkRYZnF4ZTlSUG1mRGNQd1FJUDNZc3hMemk5SVRtQ25hbTBGTnUzYjBPWExsMmhVQ29SR0JpSTl1MDdsRXNBYjFqL0MzYnQzSUc1Q2ZOcnRKSHpYcmQ1L1BneDBISTU2dFd2LzhDUGo1V3g3dnRiZjM1enR4L2pVMUdKT3J0OWdZQ1FldFFBZ2lVSmdpVkFjQ1RIZ2dMSnlVQkNKcE56K2ZsNWNITjNCMk8xd21ESXdMUFBOUzZiS1BEemhWdnFMZmo2K3FGKy9mL2YzcG5IUjFYZSsvL3puR1gyeWI0TXlZU0VrSVJjdHVDbHdyVmlYUzR1VkZzcHVLK1hxcTAvL2ZXNklsYTlyYlYxQlpjcXlxMTZSYXUxZXVVVmJkVWY5ZDY2d3IwZ29sR0pDWVFrSkNRa0lTR1FaU2FabWJNOHZ6L09lVTZlT1psSlFBRkp6UE42SGVaa01wTVp6cHg1bjg5M0wwZnFLTWVJTlp2OTdMUFBBQmp6aU8yZHFCc2FHdkRBL2ZmaW50L2VpN1hQUFl2SmhVVTQyMVRLbDE1Mk9TNjl6RWhzdU9icW4yTHExQkxMeW5PNzNiam50L2RDRUFSRW8xR2twcWJpclRmZlJIK29IOWYrL0pwdjN4UzF3MjNtekprb0tTbEJRVUZCM0ZpLzFOUlV5K2ZtZHJ1WmFVclozRktiV2NyOGJvck5OQjFncHVtcVZhdnVIaGdZZVBMcnZ0ZC9tRDRESDMrOENYVjFPeERnMGpNKzNyd0pLNWJmWXYzODZDT3J2clhvMlloZkRyTzdNUUJRWGJmYVNnSEEyZWY4Q0I5KytENjJiUGtZcXFyaXZmZmV4VmZWMjNER21XY0NNQWFNRUFJSW9vamUzaDdMUjBMMStLRFBwTHc4Yk42MENZcWlvTXVNOWpxY1RyejR4eGZ3eWlzdlExRVU5UFFjd0lZTkgySDI3TmxEcHZDYmY4VWJyMWZpc2NkWEg3VStkUWY3bXRGb0ZCOXYzb1FIN3I4WFA3LzJ1cU1lT09qVEJwKzkvZkhmclQzN2IzZU1abm9PQUlpWTA2UmlBQlJDeklIR0ZMb2dpVlFrQXBVZ1VCa0NIRVNraEFCK2Z3cnk4NE9ZVnY0UGNMbmNjTHZjeU1qSVJFNU9Edkx6OHBHZWxvNjh2THhSb1FZWUVWUW1SQndPQjlMUzBvWTFhZjEwNnllNC9aZDM0cFJUVDhNamp6MkJtcStxNDRLSGlxTGdwUmYvQ0VLQVdiTm1XejVrMVF4azlQUWNRRU5EQThwS3kzRFYxZGZnbFZmWFllMExMeDQ3aW8wM1MyZk9uRGxNc1kyd1VXSXNFRUtzTnVPbWtxTmNncS9PZXJRRDBHKy8vWGI5OXR0di80K1dscGE2L1B6OGZ5R0VISGNvNzlNaHkvQjZQSGp4ank5Z3dVa240YXZxYldQR2gyWlAwSDN3Z2Z2dzRBUDM0ZlF6enNTLy9lcHVsSmFXNGRlLytTM1dQTFVhSGUzdG1GeFlpSWRXUFdKTk0xcjB3N05SWGIwTlZ5MjdBcUlvNGR6RlAwRnBhUm4yMjhxRmJyNzVWcXhhK1pCeEpaNDhHYzgrOXdJY0RnY2VmR2dWVmoveGU3ejZ5cDhoeXpKT1B1VlVYUGt2UHdWZzVDbXVmT2dCU0pLRWl5ODhMOTVNZk9sbEJBS0hQNWZ3WUYvekY5ZGZCMEtBd3NJaTNITHJiVWMxajAwSC9id2hzcmZ5bEpiNzZ0QTRsT0prVTJyV0xjRlFIelVBUmlVQmlBNVFLZ0JVcElSS2dnQlJBMlFpVWlja09OUFNoMm8vZlQ0VUZCUU01YW1aZ1lJZE83WVBpMzRtVzAxTlRVaExTOFBDaFFzQkFKOS8vdm13bVI4WFhEZzA3Q2d6TXhQTGJ4dWFmN0J4NHdZOC90Z2pxS2c0RGc4OHVNcUM1S0lmbm8yNnVqb3N1OUpRYzcrNDRjWmhDbHM2RnI5NHFhbXBtRFZybHRVT2hSQmkzZkw3M0gwVzNBQlFycXBCNTN4d2lVeFRyYUNnNE1QWFhudXQ3cHh6enJuQTVYSXRPOWozcUtncVR2dm5oZmo5WTQvZ2hodHZ4aC9XUEhYTUhjY3p6MXFFTTg5YU5PeiswdEl5ZkxSeDVEbW1KNTY0SU9rWDErbDA0cTUvKzNYY2ZkZjhiSGpmejNuei95bGhNOFNTMGxJODl2anFoSDliRkVWOHVPRi9qK3B4T3BqWEhPMTRmZFBsOXlmUGt4d0loLy8wMnI0UDM3L3JRR1VmWjNyR0VnSE45S2NwQURXZ1JnMmdFUXFkZ0ZJQ1FrVVFLaW9hSkFBeWtReW9RWWJiNHpHU2IvMURQclhzN0J3anBjUE1VL3ZlOXc2K1d0R3EyUG1hYThHQ2s3Qmd3VW5EN3Bja0NiZmN1bnpFNXg2VFlHTWZOQTgzKzVZQWNCYmNGRVdoWm9VQ0gxU2dYS1VDVTI4YUFPMzg4ODl2QmZCa2EydnJsM2w1ZVZjU1FrWnR3cTVyR3I1LzRnSTBOVFhGUlhvRVVZUitCSnQzVHF6eHVVUlJSRGdjaXN1WDFIWDlpMTI3ZGxXZThvTVRkNEJMWnhvQmFqRXlwTkpZZHc2ZEFHYVFnRUFFb1JJRXlCQXNxTGtndytYMHdPUHp3ZWZ6V1Q2MW5CeWpUS3FvTUhHZVdxTGw4WGd4TUJBK3FNY2R5U1VkeXgrMjErdkY3Tm16SVlxaXRZMENPbW9xT0JZeHRRY1ZtRzJxMjAxVEFGb3dHUHhnN2RxMVgxMXd3UVhuZVR5ZW40MzIvakl5TXZCL2YvR3Y2T2Z5M1BMemc5amQzSVJZTEFhcTY2aXRyVUZoWWRFUk8wWnV0MmVDQ29kNGJMN05ZNWJzdFhOeWN0RFJzZGNDV3lqVS8vd2ZYM2orby92dnV6ZGtVMmw4NUpQZmVLaVpaaWQwRTJqVWlId0tWQUtCVEVUcWdBZ0haTGlJRExmREEwOUpEbnhtU2dlREd0LzkxcDZta1d4TktTN0Jyc2I2RWVIbThYZ3hwYmprdXdzMndDaS9zc1BORHJrRUppcFRiL1lxQmNyNTNwaHBxcHVtcVFaQVhiWnNtYlpzMmJKbjZ1cnFQaTB1THI1RUZNVkR5c25JeTh2RHFhZjlNeTYvOUNLa3BLUmFaVXhBZkxySFY5WGI4TVRqdjhmOUR6eUVxU1ZmLzBOT2RLV2ZXRURZSE5LYmFBbmYwakVMaC9vaEpra2htVFJwRXRyYjI5SFIxcnBoZDB2cjIwdVhMRzVLb3RKNG54b0xqTVdHVkpveFJjcTRjQnMxbjRJZ1Vra1NJVWxtaHc2SERBZHJFbW5PS0dEOTFDenpNei9meUZPYlZuNUlxVFlwcWFtb09HN3V0Lzc1SDlHWkI0ZHpVVXF0K1FrdExTM282T2hBVjFjWGVucDYwTnZiaTNBNGpIQTRqRWdrd28vL0k5emdacUxyT3B1bFFBQ3dlUXFpQ1hpWlV1b0E0QURnQk9Bc0tTbHhiZG15NVVlTnUzWmRtUnM0T29NLzkzYnN3ZHhENlBEUjFOU003djM3Snpyb0RqdU9iY2pLeWtSaGdrNFRUYzNONk80KytzZHNiMGNiTWpNelVaU2cwU1NsZEU5blorZC96cGt6NTVPT2pnN0ZCclZvSW9VR0s5cEpWQmlOSVRUVEVxRnNNeXQwSUVrU0pNbWFVd0FuQnphUHh3Ty8zNCswdERSa1pHUWdOemNYK2ZuNW1ESmx5aEd0SmY1T0t6YUx3SVJnNXN5WjdBTWFwdHpzdCtZMkxHSktDS0VtM01Bck4yYWF3cGhHcndGUTYrdnIxWXlNak1vbm4zenlrd1UvT0dWeFJrYm1sVWY2aWk3TDhpRTlwN0J3TXJxNk9yRzNvdzArZjhyRXpJTlFQMEtoZm1pcW1oQnFBRkJVV0lqT3pxTjN6Tmg3MGpVdElkVEM0ZkRMYjd6eHhrZVhYWGJaZ1ZGVVdwUlRhTlpFZGxPbGFTYk1kQTVtUnNkYjJkYksyODMxVWpQYmVXZG5aeU1RQ0dEeTVNa29LU2xCZVhuNW1ENFB4b3hpNDFkRFF3UHE2K3ZSM055TTl2WjI3TnUzRC92MzcwZGZYeDlDb1JEQzRUQUdCd2N0NVdiT1hDRGNHRUJldlFtbWVoTk0wRXNBSkU2OVdRcnUvUTgyVkV3cExsNHFpdUtaUitMLzFibTNIWk1DdVlmY3RvaFNpbDFOemRpL3Z4dWFxaU1TK1c0Mm4zUzdQUkJFRVZtWldTZ3NMQmhWYlRRMzcwYlh2bjNRVk8ySUhUTzMyd05Sa2hJcU5VVlIvcnVxcXVxLzVzK2YzOElCTFJuVUVwbWQ2cERaYVFITm1FMWdBczBvWkk5WGFGNnYxNEphUmtZR3NyS3lNR25TSkJRV0ZxS2twQVJUcDA0ZDgrZkNtQVFiQUxTMHRHRG56cDBXM0RvN08zSGd3QUgwOXZhaXY3OGZBd01EL0dpL1lYRFROSTJZdzV2Wm1EOEdOMmFlc3BGL01nODNBTTVQUHExYWtKT1RlLzdoNnRRN0VBNGgxTjhIZ0I3MlJwTVQ2OWhidXE1dmJXeHNmTHUwdExUV1ZGeDJsUlpMb05LVUJDcE41elpxV2pCSm9lWXgwem44MW55Q2RDUHlhVUt0dExRVUJXWWx5VmhmMGxoOTR3VUZCVENyRG1BV3hWdTNpY3hWMDBTbGdpQVFRUkNnS0FvbGhMQ0dsL2JBZ2hVcEpZUXcwOVE2QVkrZmU5ejdKU1VsbXg1KytPRXpVbEpTemllRWZHM2Q3dmY3SVVrUzh2SW1JUkFJVEh6cngvR2lsTzVvYjIvLzY4S0ZDNnRxYTJzWnpPeSt0SmpOaDhaRHpSWWNzSVlYVTFFVXFTaUsxdmRCbG1YS2V1NHhxSG05WGd0cVJwREFiRHRVV0lpeXNySkRIdjA0QWJZanRISnpjOEdhVVBLQVN3UTF6dmZHWmlFU1JWRkFDR0VKdlpRT0RUWFZiV2toR2dEVm5HK3FtUDQzNWR4enozM3JqanZ1K1BEV1cyODlQUzB0N1h4Q1NQSEUxM2RpSlFEYXJxNnVyci9lZmZmZFc5ZXNXUlBsVE1sWUF0T1QzU3AyczVPZGk4eVh4aWF5MjFXYUxNc1cwT3hRWXdFQ2xzNVJWRlNFc3JLeVllMkV4cndwMnRUVU5PYi9FNUZJQkkyTmpWYTBkTisrZlZhME5CUUtZV0JnQUlPRGc0aEdvNVpaYWhib0VsWXp5Y3hTTG1wS2JLYXBTQ21WbUluSytkOGNBSnkzM0hKTHloVlhYTEV3SlNWbDZUZHBham14eGhYUUd2ZnYzLy9tbWpWclBuMzIyV2NqSEtDVUpFQ0xjYkN6Unp1WlVyT2luY3o4NUt3VXE5czBVMnQ4b0NBMU5SVnBhV25tM004QUNnb0tVRnhjREpmTE5lNk8vWmoxc1NVNGliQmp4dzQwTmpaaXo1NDkyTHQzcndVNEZsUmdnT1A5YnN6M3hnR09tRjE5Q2ZPL0lUNDFSSVFSWEVnRU9NZnk1Y3Y5SzFhc09EVWpJK05jUXNpTWlhLzNkOUtIVnRQWjJmbTNYLzNxVjFYUFBQTk1kQVNnMlRmRk5EdFZEbVlhYjNiYVZacXAxT0tBbGlqeXlZREdVam1LaTRzeGJkcTBNWnZPOFowQkcxdE5UVTFvYkd4RWEydXJwZDRPSERpQXZyNitwRUdGQklHRnVNZ3BVMjhNY2hqS2ZVc0t1T0xpWXNmR2pSdFB5czNOUFZzUWhCTW12dTdqZjJtYXRybWxwZVhkazA0NnFicTF0WlhCaVFlYWNoQkFZOCt6QWdNQUtCL3haQ3FORHhBa0N4S2t4RTFuRHlBWURLSzR1QmhGMzlJZzR3a2YyOWRjUlVWRmZGdWpPQi9jS0FFR2RpVms2bzFxbW1ibHZjSE1kVFBWVzF4d3dlWi9pd0Z3TkRZMk92THk4dDRGOEZGZFhkMmNvcUtpaGJJcy8zamk2ei8rVmpRYWZXdjc5dTMvTTJmT25GMGN6SGlWRmtzQU5TVUowUGpnUUZ5U0xhL1NlTFBUNFhBTTg2Y3gwNU5QNXlnb0tNRFVxVlBIVlpEZ093TTJ3QWdxOEgzYlhDNFgrSlBBRHJkSUpHSUJMaGFMV1pGVEJqY3V1RUQ0a1grc1F3aU1mQ0lWZ0dJcU9BdHdBQnhsWldWYkFIeis3cnZ2dmpwdjNyd2YrSHkrc3dFRUo1QXdwbDBmcmYzOS9lKzgvLzc3bnkxZXZIaGZFcUFsZ3BveWtrSXpMNWg4bEI0c3BzV3RrSlR5QUFBVFRrbEVRVlRtQnVpNlRuVmRoNlpwVmw4eVJWR3NCSFdtNkJ3T0I4TGhNTnh1Ti9yNys5SGIyNHZ0MjdkaisvYnRoK1VZK1AwcEVFWEJTaG1aTUVXUG90K3RycTRPemMzTmFHdHJ3OTY5ZTdGLy8vNFIvVzVtS1ZiQzRBS1gxQXZUTkdXbFdYRkJCcHVKeXB1cU1nREhKWmRjNGxxNWN1WDhuSnljMHlSSk9tMENFMk5ucWFyNmZrdEx5Ly9jZE5OTnRYLzV5MStVZ3dTYWtnQm85cUFBZzVsT2lBQ2p4bE9nZ2loQ0VrV0lyQ1JLa2lFN1pEaGtCNHlwN0taU2M3dmg4WHJoOS9tUmttcU14c3ZLeWtKdUlJQmcwQWdTSEFsL1dwakx3Wng3RE9WZ2ppdXdYWFRSUlhqMTFWZHgvZlhYWS9YcW9YNWZyYTJ0YUdwcXdnMDMzSURQUHZzTTU1NTdMZ29LQ3BMNjNiaUVYcGgrdDVHQ0MyUVV3RWxKQUNjRGtCY3RXbFN3ZHUzYStUazVPUXUvU1Q3Y3hEcWlGOGdkUFQwOUgzejAwVWRmTEY2OHVKdURVaUtnS1VtQXBpWURtdGtqa0RKZkdoRUVpS1l2VFJRTm9FbXlXUm9sT3lBN0hIQ2FVSE83WEhESDVhZ1o2UnhaMmRtbStUbjVxS2lwenIzdHlKc1VPR1p5TWNlZEtTckxNdDU0NHcwODhjUVQxaFVxR0F4Q0VBUlVWMWNETURwMUJnS0JZVDQ0ZXk1Y0xCYURLSXBRRklWbGRaTkU1cW5OQjhjNmhRaW1pU3B4SnFwa252QVcyTmF2WDE4ZkNBU2FBYnkrYmR1MjhxbFRwNTdnZHJ0UEF6QlIxZjd0d3F4dFlHRGdnNXFhbXFwNTgrYnRaajdWZ3dBYXY2bW1RdE1TbVp3TWFJSWdVRXFwbVY5cEpOcUtrZ2hKWkxXZUVtVFpZU2cxRmlSd0dwRlB0eG41OVB1TnlHZEdaZ1p5c25PUmw1ZUh5WVdGMXF6Tkk3MjhQai8yN3QwN0FiWWp0UllzV0lBTkd6Wmd5NVl0bUQ5L3ZuWC94bzBiTVdmT0hHemR1dFVxOWpVbnpjY0JMaHdPVzBHR1NDUmlBYzVVYjlRZVhOQjFuUTh3SkFveWFBQkU4NG90VVVvWjJPeEtUcDQxYTlibkFMNEM4UHoyN2R0bkZSWVdIdTl5dVU2WmdOelJnOW5nNE9CSDlmWDFYMVJVVk96aTFWVVNvS2tIQ2JPRVFPTURBN3F1VTFtV01VeWx4Wm1lVHJqNGRBNnZGN0ZvRkZzLytRUVhYM0lKTWpPemtHT21jeFFWVFlrYlJQeE5WMjF0RGQ1KzYwMVVWTXpCNldjTUw1WDJlbjBJOWZjZU01L2x1QU5iUmtZR1RqMzFWRlJXVnNhQmJkMjZkYmpnZ2d2dzZhZWZJaGdNb3JTMEZCNlBCelUxTmFpc3JFUlBUdy9jYmpmS3k4dVJuNStQd2NGQlNKS0VuVHQzWXQrK2ZkYWdFMG1TYUdabUprUlJKS0ZRQ0pGSWhJcWlDTmF4RndBUlJkRUNuSzdyZ21sMmlHYmtWRFJQZkdhbVNnbEFKNVdYbDI4RjhEbUF0VjkrK2VXMDR1TGlPUjZQNTRTSjNMakR1M1JkcndtSHd4L3YyTEdqNXZqamorZVZtYzZCYVNTZ3FSelE3T1ltaTV6VFpFQmo2UnVxcXNMaGNFQmtIVGtrMDRKZ0tzM2hoTk0xM1BUMHA2Umd6bkhISVJpY2JLUnpGQVNSazNONG81NVBQYmthalkwTkdBaUhoNDFsNU5mUkhDeituUU1iQUN4ZHVoUVBQL3d3SG56d1FRREE0T0FnMXE5Zmo1VXJWMkxGaWhWSVQwL0g3Tm16VVZkWGgrZWZmeDZYWEhJSkNnb0tVRnRiaXpmZmZCT3lMQ01ZREdMMzd0M282dXBDYVdrcFpGbEdUMDhQOXV6Wmc0R0JBYVNtcHRKWUxJWklKRUowWFlmWDY2V2FwaUVTaVVEWGRTcEpFdUdpcU1TOFdnczJNNVd2YU9BM0huVFM3Tm16dnpDVjNLdnIxNitmTkhmdTNPbHBhV2x6WkZrK0FVRHFCSjRPYWZVcWl2SnhkM2YzbDVzMmJXcFlzbVJKTjRZaWtjblVXU0tvOFIwMlZOdHpkVTZoVWI0L0drdXdGU3dmbWhIQkZBU0JPcDB1UGo4TnNzTUJnUkRzM3IwYm1xcENsQ1RNbmpVYitjRWdLQVgrMzl0dlFSQUVwS2RuNEpISEhyZXNrRit1V0k2MnRqMEFnSjZlSG5pOFh2ejVsZGNBR0oxeG52ajlvK2p0NjBWR2VnWnV1LzJYMXBBZUFIanRQMTlGWmVVNjYvRUFjUFUxUDRQRDRjQ3FsUStPbVE5NVhJSnQ4ZUxGdU82NjYxQmRYWTJaTTJkaS9mcjFtRDU5T2dvTEM2M0hlRHdldlB6eXk3ajQ0b3R4N2JYWG9xMnREY0ZnRUtGUUNKczJiVUpGUlFWeWMzUGg5L3VSbFpXRlNDUUNuOCtIZmZ2MlFkTTB1TjF1UkNJUkFLRHA2ZWtRQk1FeVVWVlZoU2lLYk5ZQ2k2SVMwelFWelBzWTRFVHppeUtacWs2MFFZNEhuYlJvMGFKZEFGb0EvTDJpb2tKKzdybm5pb3VMaTZmNWZMN1praVI5RDhCRUsxMmJrRkJWOWRPK3ZyN3F1cnE2eHF1dXVxcTFwcVpHdHlrenpXWTZKZ01hRHpQK09ick4zTFFVbXJraEdkQll6elJDQ0Z3dTF6Q1Z0cWR0RDNLeWN6Qjl4Z3lvcW9ydHRiV1kvMDhuSUQwOUhkLy8vb21JeGFKNDlaVS9ZeG8zMy9UK0IxY2FCTy90d2MrdnVRbzMzWHdyQUdQTzUzMi91d2UvdSs4QlRKbzBDZS84YlQzV1BQVWs3djdOYjYzblZzeVpNNnp6c01QaEdITWYrcmpOWTF1d1lBRmVmLzExekp3NUUrdldyY041NTUwMzdISFYxZFhvNnVwQ1pXVWx1TWxXMEhVZDJkblpjTGxjYUd4c3hNNmRPNjAwRVVWUmtKS1NBcS9YaTRFQm80ZVgzKytIcG1sVVZWVU1EZzRTVlZVaHk3S1ZhMlJHVVZrK0VqWEhhUTFUY0thWmFsVTJjSkJMQkR2cGl5KytrT2JPblZzTllEdUF0d29MQzhXWFgzNTVjbWxwYVhGcWF1bzBXWlpuRWtKS3Zrc1VvNVRXeDJLeHJ3NGNPRkMvZmZ2MjVzc3Z2M3h2YTJ1cmJsTmxpZFJaTXBWbS9ZNGxZOXYrQnU4M2l6TTNlYUJ4Q2VCeFFHTUtqUkFDdDhjOWxNWmhtcDdCWUFGMjF1MUFXMXNiU2twS2NNbGxseUVqM1loNkJnSUJSS05SdU4zdVJDWTJmblAzcjNIMk9UL0d2SG1HUzJiWHJrYTB0cmJnRG5OZ3QwNTFlRzFEVmNyS3BxR3NiTnFZUHcrazhYcUNMMTI2Rkd2WHJzVnR0OTJHdDk5K0cvZmVlKyt3eDZpcWlsdHV1UVUvL2FreDA3Szl2ZDFxT1M2S0l0NTQ0dzI4ODg0N0tDNHV4dVRKa3pGanhneFVWVlZCa2lUNGZENXJpSXZYNjdWU1EyUlpwdEZvRkU2bms1alJVMnFMb0RLd1dWUHNLYVc2ZVIrRG5BQWpSWUF2d0JkdGdCdTIzOXpjTEo1NDRvazdBTlFEZUJlQXVHclZLdC9wcDUrZWw1K2ZQOW5uODAyUlpibEVFSVJwTUhyTGplVVYxWFY5Unl3V2EranY3Mi9ldlh2M25uZmVlV2Z2blhmZU9RZ3VKMndFbUNXRFd0dytwOHppekV5Yk9xTTJvRkcra3d6ZlljWU9OTFlCZ05mampROFFlRHpJeTh2SGpPblRjYUNuQnp2cmRxQzlyUTAzM25RTEp1WGxJUzh2RHp0MzFpVThPUC94N05Od3VWeTQ3UElyclBzVVJVRWdFTURhRjE0Yzl4ZTRjUXUySlV1VzRNWWJiOFRUVHorTnNySXlUSmt5WmRoanBrK2ZqbTNidHFIRUhLWlNVbEtDWjU1NUJoczNic1JWVjEyRlRaczJZZUhDaFZpd1lJR1Y4N1o1ODJhNDNXNzQvWDVycXJYWDY3VWlwdzZIZzVrVmxHOW9xV2thQkVHZ3FxcUNVZ3BSRkNtbGxKaEJCOEtwT0ZaNFR6aklDU2JraEFTUUczSC8xbHR2SFFUUURhQ0dNMzJGeXNyS3JQTHk4dXlzckt4Y244K1hKOHZ5SkZFVWc0U1FBZ0RIU3J1SENLVzBSZE8wUGJGWXJEMFVDclYzZG5aMjFkVFVkRjk0NFlVSE1KU2RyNDhDczJRS0xlRStCelBkRGpNTURRQ2l5ZFJaSXFEWml0YXRqVVhqQWNEbjk4ZVZSdmw4UG16ZCtnbW1UU3ZIcWFlZUJyZmJqWHQvZHcrbWxaZkQ1MHZ1Y2RpNGNRTSsvT0FEL1B2VHo4WWw1WmFVbEtDdnJ3OGZmZmdCZm5EeUtXaG9hRUROVjlYNDBZL1B0UjZ6YzJjZHFxdTM0U2MvV1RvQnRtTnhCWU5CekpzM0QzZmRkUmZ1dlBQT2hJOVpzV0lGempyckxOeDk5OTI0OU5KTFVWTlRnK1hMbCtQbW0yL0dqQmt6a0pXVmhZNk9Edmo5ZmlpS2d2ZmVldytSU0FTeUxDTTlQUjM3OXh1VHozMCtuMVd4d0U1U3Q5c05WVld4Zi85K3FpZ0tmRDRmSkVraWc0T0QwRFNOTWo4R1N4Y1JCSUVWMjRNQmJnVElXWUN5ZFIwWmFlT1RoNFVsUzVZTUFOakQvVjMyR3VUUlJ4LzF6Wm8xS3lVUUNLU2twcWFtZUR5ZUZJZkRrU0pKVW9vb2lpbUNJUGdJSVQ1Q2lKY1E0alpCeUJvQXNOY0NCd1pyYkJ5bGRKQlNHcWFVaG5SZEQybWExcStxYWw4MEd1MGJHQmpvNytucDZXdHZiKy8vOHNzdlE4dVhMeC9nNEVWdElLTWp3RXkzS1N4dHRJMTEwVWdBc2ppWThTQURTNmcxcDZUeDVpYURtYTJ0VUJ6UVdOODBwOU1KU2lsU1UxTnRyYnRUY2RaWlA4Uzc3LzQzR2h2cTRYUTZjZWRkdjRMUDUwTnJheXR1dnZGZm9TZ3g5UGIyNG9Memx1QWY1ODdGN2IrOEU2c2Zmd3lSU0FUWC81K2hDWktybi9vRC9INC83bjl3SlI1NzVHSDg0ZC9Yd09QeDRHYmI0T0dxeno1RFplVzZNUSsyY1ZkNW9Lb3ExcTFiQndCWXVYSWxicnZ0TmpRME5LQzQyT2dCS1VrU1hucnBKVngwMFVVQWdELzk2VSs0Nzc3N1VGOWZqMEFnZ0t1dnZocDMzWFVYQ0NIWXNtVUxycjc2YXRUVzFzTGo4YUM4M0ppdldGVlZoV1hMbHFHMnRoWi8vL3Zmc1hqeFlxdHFZZGV1WFdodWJrWkZSUVVVUmNIT25UdWhxaXFDd1NDYmxvWHU3bTZtMUNBSUFqdXhDZWVMc3lESDloTkFMZzUybkpvVEVvRXN3VDUvbTJqalgyZWtEUWx1N2Z0eGJyQUUrL3p0U0pzZFpQWXRtVW9idHM4Rzl5U0MyR2d3WS91MnhxVUhCVFJlcGZITklIdDZlakJwVWo2OFBpLzhmbk8rcDFuQW5wc2JRSDUrL2lHTndmczJWc1BPN1RqNTVKTW53RFpXVm05dkwvYnMyV1A1Myt6MXBteDRqTDJaSlZkekNtNE1vRlc4ek14VVBzakF5clc0c2kzK2N5STIwTVZCamxJUWdBNkQzU0grbkFoc1BPQ0VCRkFiQ1hBandjME9OQ1NBMkVnS1RVK2kxdXlPL1ZFaFpuczkzbS9HWUdiZGNxYW5mWEEzdFhkdFpqQnp1ZHhJU2ZFUGF3TEpGRnAzZHpjS0poZFp6U0F6TWpPdDRuSy9QMlZNZkUrT0piQ05HMVAwaEJOT3dPYk5tOGRjRUkrL3lLU21wakx6bEhKZEhBalgzWUVRUXVKVUhJeHhnY1R3MDBFQUNFa0VKVW9oMktCSFJnSGFTSEE3Rk9WMktHQTdGTE16R2VDb0RXZ2pBVXkzQXd3Z2xCQlFnSUFRQzJRR3pBUUJBakVoSmdvUStSSW90aG1sVUVOcVRaWWhDQVFDSVZBMURkbXBxY01hUWZyOWZoQkNFQXdHb1drYWZENC9VbE5TNGZWNDBkZmJoNzdldm1QK1JNNFBIbHZOYXNZTjJEWnQyblRVWG9zZjJOemQzUjNYeURJY0RvL1VxZGRTYm9xaVdNck5WRzk4RFNyaEZCemxsQnk3cFRaVGxjRkU1OVVkcjdJSUFVa0VQUTZTbzRGTUdBVm95YUJHRWtCOE5MVkdreWkzWktCamNOSkhlZzV6OXJPWnNwenpQNUVxczhHTVFCRFk3RnFCQ3NMd21ScVNKQmxnazJUSUp0UWNacUt0MCtHQXJ1dVFKQm1abVpsVzVRQnJCQ21LSW9xTHB5TGJuRVV3c1NiQWR0UlhRVUVCY25OejBkYldablhwVFdTZXNvNGhJd0dPM3hqWVJvTWNCemhvbWtZSmt4aERRSXVEalUzaHhVR1BTejBaQmpEVHRCMEpaRWZTeDJiN21TbXBwTUNqaVo3UGRjN0FzSDJEOWdiUUNBRUJBUkVJRlFoQm5Eb3pGQm9WQlFHQ0tFSzBRMDJTSUVuTXAyWkFUWFk0NEpCbE9FeXowNmdxRUNHS0FnS0JnTld1bXpXQ2xHVVowMmZNT09TQjJSTnJBbXlIZFRrY0RoUVZGVm1BNit6c3ROcVE5L1Qwb0wrL2YwVC9XekxBY2Y0M3E0TUlEemt1aWRpQ25HbWVJbjY0UGEvY0NFeEFZUWgySU93N25neFlOcFUzcWorTnNuMDZpbUlqMXMzQlFHNFU0UEUvRytZai8zZHNUbjhBb0xwT0lRZ0NESjRSYXZZL0E3R1VtY0FGQmtUVDdEUnZlWVVtTW9YR0FjMVVhUEhCQVRjOEhzT1hwaW9LSmsrZWJMWHJadE9pb3RIb2lGQWpWVjBnVDFZQjlUMkgvMlF1U1FPOS9qalE0N0lud0RZZUY2VVVIUjBkNk96c2hLcHBoMVRVRzRsRTBOL2ZiNW1qYkV2V3lKSnRsQUk2cFpBa0NVNm5jeVRBUWRNMHZwckJncHdnaUtCVXA3cE9UY0Rwb0JTZ29LejlLZ0JDVFBDWjMzZVlJQndPS2k2Z1JFYTVqZHUzZUhWdy9RenBJU3E1K0RlZjRIZGN6aFpsK2MraUtGclBZZWFscG1rUVJXa1l6QWlmZzJiNHp5eW9qZVpIazAyejArRnd3dUYweEFITjR4bWF2RDRRN2tkcGFTbHljbklRQ0FUZzlYb1A3Z1JiWFFVMDlCeVpFNysrQitUSkt0Qm56NWdBMjNpRVdsVlZGVUFFZUgxK2VMMCs1SDZOMWxLRGc0UG83T3hFZC9jKzlKaVQ2ZnY2K3hBT2hSQU9EMkJ3Y0FDUndRZ2kwUWhpcG5vYkdCeEVKRElJVlZHTXEzcGk4elJ1WTRwTlZWVklrZ1JkcDBTbk9xaXV3d0NjTVJxVlJXVk5BQkRaNFlCdW1ycU1SeXk2TjhRbkFrN05JWWw1eVlNU0IyR0NqZ0kyQWtLU0FpNE9XUEdQNDM0bWhKZWFvSlJhZFpqcy8wZ0lNU3BFSEE3bU82TU1haGJNREQvYWNMTnpSS0N4dGtJdXVOd3V1TjBlZUwwZWVIMCtwSmpwRzJucDZRajM5Nktpb2dJZWorZVF6aXR5cEtER3dXM0NGQjJIcTZPakF5QUNjbksvV2JkUnQ5dU53c0pDQkFLNTZPcnNRdmQrTTdqUTIydVpwd01EWVF3TUdEQ0xScU53ZXp5SXhXTG83K3VGSkVsd3U5MGptcWhNdFdtYUJrVlJJRW55VUpCaENHNUVWWTIvNFhRNnpjZVkvamhSaEs0YjFsczBHaldVaWloaXlKWkZITmdTcEFReGZtQW9ka0VUWGl5U3RhTm1iYURpMVpUMVBHci92Wm5ReklQTkFsZ0NwejhJSWRBMERRNkh3d0lhTXk4QndPbHd4cWRxaUlMMUdWRks0VExyTkYxdUYwUlJ3aGVmVjFsLzErUHhvS1MwRkhtWm1YSHBHM2FGNXZmN2taS2FpdlQwZEdSbVpDSTdKeHV0dTVzT0dXb1Rhd0pzWDN0MWRuYkI2L01mdHIvbmRMb1FMQ2hBWU5Ja00vZXQyMUp3L2YzOUNJVkRHREFWM09CZ0JORm9CQTVaeHVEZ0FIdyszNGcrT0g2THhXS1FaVWRjQWI4Sk9LcUdGQkJDNFBmN1RSVkhDYVU2ZE1wTVZtb01yeUVDWkVuaS9YU2N2MjdJRmNZQnovcUhETzBOZ3g4Yk5HS0RHMVZWMVlJVnBZQ21xU0NFUWhDTWFneEZVVUFFQVpKb3ZDZFZWYURybEJyRjRrTXF6WEw2MnphQkdDYW1wcW5VNVhJTnl6ZGo0T0toRmdxRkVBcUZVRnc4RlM2M0czczdPdERXdGdlelpzMEdVMzNmTzM0ZTB0TFMwTmZYaCtwdFg4THBjR0xHekZsd213ck40L1hBNS9XWkxib05oWmFSa1luczdPekRtbHliK2Z4aUtOV2Q2RnYxdndDQWpDZCtpSUczNmhCNXB6N3BjL3pYSFEvbktVWFlkNEhSanNoNytXeElVOUxSZTgrSEIvMjZveldiUEpiVy93Y2FMdGJ3dU9MVHF3QUFBQUJKUlU1RXJrSmdnZz09Il0sIFsic3JjIiwgImRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBVFlBQUFFMkNBWUFBQURydkw2cEFBQktvbnBVV0hSU1lYY2djSEp2Wm1sc1pTQjBlWEJsSUdWNGFXWUFBSGphcloxdGx1VzRyV1gvYXhSdkNCSy9PUnp4UTJ2MURIcjR2VGNqczF4VnRsLzdyVzZYcXlJejRzYTlFZ2tjbkFNQzBMWC85Ly82cnYvNnIvOTZTbXZoU3JtMjBrdTUrVi9xcVllWFA3VDc1My85L1BlNTAvbnYrVjhzdi83MC9QWDcxeDgvQ0h5TnZ2TG5CL1g5K2ZxOGZELy80eGQrZjhZei92cjlxLzM2U1dpLzN1alhEM2pqbnl2d2svM3ordk5GOHYzdzgvMG4vWHFqdm4vK1VIcXJmNzdVOGV1TjVxOFhua3Y1OVcvNjQ3Sit2dmozNnkvZnFLelN5bnhRREdISEo5N252K25uQ3VMUHZ5Ly8xdlBmd091ZUdQbnpFOXQxdnZ5K0pSYmtMN2YzKyt0OS8zbUIvckxJdi85MC9YMzEvL2pUM3hZL3ZMKytILysybHVYWEd0M2xYLy9neVgvN2Z2empZOEpmek9HUEt3cC8vY0VZNlo5djU5ZS8zN2ZhOSsyZnUzdFRZVVhMTDRzNmkvMzhmaHRlT0ZqeWVINnQ4RS9sMzh5ZjYvbW44MCs3MzN1eTVldWU5K0NmK2ZRbnNDdmY5YVJuUGUvelBmdDhuYy9rRWxQWW9mSTFoQm5pK1Y2TE5mUXdvL3VVL09mNVFvMDlydGpZeXhuMnhmYWxHUDY0bHVkOGJqK2ZONS9HSjYrSGw0YUhOM3Y0bFgvN3ovWGYvZkIvOHMvMWZkTWxldTcyeDFweFhVRzc1akxjT2YvTHE5aUQ1L3UxYi9rczhPOS9mbTMvL1NmN3dWVFp3WHlXdVhHRDd6MSszbUxrNXgrMkZjOCtSMTZYK2ZxenljOVYxNjgzWUluNDdNekZQSkVkdU1zVDgxT2V1NFpRbjRkMWJHelF5NVdIbU1KZ0I1NmN3K0lpUTRxeGhLdUdGdnhzZnFjKzU3VWhoeEw4TnRqRVJ1Ulk4SzNHRHIxc1Zrb1orNm1wWVVOdmpqbmxuRXV1dVYyNTU3ZkVra291cGRRaXlMMDExbFJ6TGJYV1ZudDlXMnlwNVZaYWJhMzE5dmJRSXhpWWUrbTF0OTc3KzRicjVZTmUzdXZsOVMvZkdXSEVrVVllWmRUUlJoL3Z4SHhtbW5tV1dXZWJmYjRyckxpQWlWVldYVzMxOWU3bjJpREZUanZ2c3V0dXUrLzN3OWErK0tVdmYrV3JYL3Y2OS82eGE3OTI5Wi8rK1IvczJ2TnIxOExaS1Y5WC85ZzF2bnZWK3ZzdEh1RWt1MmZzV0VnUE8xN2RBUXc2dUdkM2UxSUs3cHg3ZHZlQVUrVEFSV2IzNWxxUE84WVdwdjJFL0QxLzdOMC9kdTQvMnJjcnQvOW8zOEwvYmVjdXQrNy94ODVkYk4wLzc5dS8yTFZsbkp0bngzNjgwRFc5STk3SGE5N0FGWDFqZmZ5MXhDKy84YXZqMjdOdVlkSWYvK2MvdlY3dlo3LzE0VjdMdStwVGMwaWx2V3h1SEozTEdIUGlWMmxFTDJXL2laZU1IZExYV255NWc5bldNKzg5cmpCbkhMdTJKKzg2ZHN4ZmU0RzZiK3kxVjU0SmU5cVR6MXExMzJ2dDhYQWZNKzkzalRWQ0duenVFL29NcVY1UDQ2MG02NFgxM1h2WG1RWTJzTCtZNy81OE5lMzY4TE9ZNTczbUhwM3RIUFVlVDhwanMyT0EvOHN1WWxUWFRLTFZzK2FxTDhRa3gwMTRmZGZMT25RdU1lVEJubGJXSjR6U0FmWTN6L3FOVk4vd0xTeHJmaVhPWEVlNklEVjEzaXhHYlFtRDdrU1ozc3Yzc01GZjNTekdIUHh4eGEvTkw5eGNudjR6b0NGMThxNnh6b0J6enE5ZGJlV1MwbUtkWnI1SHVWc1A3UHNjUUg3ZnE0VTFTMXhoclB0TCtWc1kwRno0UVk5NXJ4cHEzeVd3RVNtWHE3U0hQZmxxNXVhTU4rdTcyWXpPNjl6WWY3UDV6OHlyY1RIQVFTejl1MGNxMXpEZ3hidVV0UWF3d3EyRnVQRWpEQk96aldzVXRqbHlLWFBFL1BJSkJjZC9CNSs4NDZoY3lvTWg4R3ZYR01lcS9qdUwreGMvbTZXTVdQYVk4Y09wOTJ6ZkZkWXFIZmVPaWJET1BXTWJLVXhYcHNjMlYvYlcxajYzK1h3dllQL0hXMk10SWJBaFJQcjJmQmVoL1FGOUZtQ0NLZlc1dWNmK3hsQXg0bWVYd1hLWDhSVSt2UlI4OHlQQ1l5ZnRUZmViV250NVQ4eDlyblcxOHVVSmlIM0huTXFMRFg3LzdncStmdlBpcjZWdngvcHhRVEdOc0h0Ym9PUDFzb1A4dFh3UkFNSzd1VXBRRE44SEZVYm5mbk1BU2NTczJPVis3N05lYkNBYUJSZi81bzlYNzY5ZVVoNHV2dGZ2aWQvWi9mMDFYZUZsaTJyQldwNVpndWF5ODRRbUxqeGs4LzZzSWV5R1QzMjBsVEJodFlTVHhJY2tQUXgzL1BhajV3NXNhb1JudlBWaks3aitZNWNkTUs2d0JSY3UxZGJmTC9MaGtYZTRObEc2bDhhT0R1Z1NLMVJUK2JCalhqbEhMOXQ3WHZ5aEZaYWtoNmZuRzJzTEtRZnViNy9TNzdyRzgxNnBqRldlZC9JcGdHdHZCQUt3R09OLzhsdnpSK0J2TlU3d2xML09BejR6cHhiM3lDek1malRIY1dOVTE4TTlWWnowVGJNMjdoNUhlOWRSRUptOWxJN0pMbExBMTBKZ0pmK2R5VjcvdVQwL1h2SEtHdzRYSmpmTkJSY2lUK2NlcERVM3hqZUJWVHhhT2xwRHdUS0pydlV0R3lOczd5N2xHNERBZ3BEbGN2ZlJpbXZFUlk5S0dKMVZUSG9IVjlRelZERUJwcE9RcHJrV1ByVHp5ZzF1d25uNC8vZXlpckVOWUpLVjRwNzUwekQyQVR2c3lWcFB2OHJUZExXT05RSlFmT0p1OGRDdXpYczloQzhDWWt4RXhNZFBHUnU4aWdSVklta3BzZDBFOC9SaUd2dGEvVTQ1Z28rZG5jZW5TOFpRSGx5clB4MThZSjltNUJjcWNjWlBXcVcrWHd0N0VqSW4vc1J2YmFJQWNZMzd3RnJaNWtCRVh1bmV4TS8rZU5zdmlBT3lEZEIxMTRKb1drRERBMFpoTWMvZ2QwZHEvVDdzRysrNVFPRmtWRFdDRFlKYzIxWGt4ZWkrQXRCa1FoUG9jRStDL2lEK3M3SjFQanZpOXgzR1V4OUR6cTQ1WFdQaTd2RVJFTURZeGtKeStiemxuQVQrR3JtaU1jcXp1TTNiMEFRUmdPaDhIU3dCL2lOK0dTQXJmTzlLOFNVOGNodjh6U1VocW1DNjVka3BHOGJBSlZaLzg0dG44VEdMbGdGckl4Vy9qemtsc0FFeUVhK1JGb3NPUUk2YXhTaG9GUHpxL25hQU9zQzI5b2RZTFFOQ1JkUWpYb3pBSGNBaXFtamEwaUljZjVOMXV6Wk9DSVpGU0VlcXdENlVZMGxDcHRZRGpFU1FzUzhpVFNHNFZqQ3NOTDZ1dlo4SmZNU1ZoYkV2dlZkSmE5OGd3ZDczT3dpM2tXQ2VYdXc4QXk4ZjcvSHRZcEM1VTJFbFo5dkljYkFLLzBPTHNWdllQcHp0SmtDK2hPUWJ1cGQwcHp1dnRVSW0zTDdiQ3dVRVNzejVXYmxCSE91SFMzUFJtTUtRSlJMU1lERWZzQkhZTlJ5K2x3eDI5bHN0QmJ6aVFSdkN4d2RqZmRBVUdDQXh6VVdGeExWYUNPRmpBOURneFFmZFpITUpKUmU2ekhDQ3pSUGVJVWg0TjVmUDRzUDFRSFo0M3MwTnNVNHBEYUltZG5BTEJqS24vdjVjRmplVzR4VXlSR2krSFhMWUMvNkN4QUtWY0NQOGpoc2hxT1pudndUbXNEYjJuRURWaVRNUVplL2FpWDdZS0phdjhJdlF4ZzVtOTRGNVlFejNCOW9BRzRtTDc4QXc5S2pnM1VSMGRoNEVaM1hlbk5oWjNwZGJ4V1Q3M250ZFMzNUJOQW9ZZDRzRHozZzdMdnBKQS9BYUtCWnZnQk1YMW4yOVdNbWNIZGJSY3lDWUpTVlc1WGQ2dmZTZVJQZ0k4QnRDOWF1ZHdDZ211QTZsSS83Y0IvV1FCa0FNWkJLK1dONVFGd3FoNUFGWTFjNlBCbS9VZVBsczNuWGlWckVNcENCMG5vMURYMWVNSXh2bmVvTkpnZ0VMcmM2YWFrdWJWWGxZbDRWbEJRSWtiTXJOVGMwZFJjZWtHZ2hvcUljMmMrdDU0b2tUTXdBdVFBYmVlMkUxaTFENlFNWUMwZ0NxU2VSWUY4eXVtU0tBanFVcUhpQkljQTU1R1ZFd3NaUlFwRGsvc0creElZU3JDVTBCUjNadVdncHNZY0w1MkRYQXZHdktQVWFpQXdJS2x3V3BXSFB6UGZ3V1ZCTmtqdEF3VENPV2I3NWdub3QrUWhXdndLbnJ2bnJDbTlZTDJ6VHlQVFVBeklRTDRESmtkQVdYRGdxaFBrQ1laMjNlSFJ3QmFOeHEyR3JxT0FnN2VvUFpnQWg0RHVKcWh2ZFRqVE5xc0JjSlhURENSSFI5Mk1EcFp3Z09OMkU3dzhwQmF3SXpEbG9ENEhvQjVIQ0xVREo0OVFiV0N4VGlBb24reUFEczVlMndpL0tDbkVRWGpIYjM1eDR2Q3h6QlVvSUlXOHJXb1VXZ3IwUWIvSE9OcEJXai8xaXhUdUJoWSsrcHo1NTBHeXNFUnR4dzVwNGpJVGRPSWhpVUFFSjhBL0lRclNlVmhZWUpRanM3N0gyK2NDUXVHWDhrSEJDOE96aUZIRzBoSmNJc1lWTWdMdGd2VXFVU1A5VU1GMFFwanU4dUh4NnNXZ256WXpIblU4SGtyK2NLeHpkU0FUeVREWUlrVHJidWdUQUNQQldUZnJHcmhHOWVMOUhLUDZKTStSTkdVSlArNnk5MWJpWEJzN2lxZ0o0QzFBSExoUVJDVmdTa1RKUTlZa2U0TE5RUHZJa2RKb0NPaWxJNUNkR0FrOVVYaEk0RUtaeDgrOEdHT3Q4WHFwYkN5OW9EVTVDS3lwSzFXY2VGZlV3WXdyY0NvaFg5M1JNc0VIN29Uc0FFMGJtOEFRZ3dDTVBwVWJSQjBJM0ZMNlFFbklhMHNNdDN2ZEFrMzBOY2hLR3lwSERhSmpYZXQxSWJVK3FUaTlrOVpKZ2Y5UGcxakhrRkV6S0dHNktGNzdJaDF3bmhSNmoxcGlEampTVU9vTklORkJwckJ5R08vK0JaZXN6NzVjNTFGUlRsQm9sYklPSmwvQnBKeDFaZUVjditqSTEzbDQrQ3dvRVk5TEsyUkVWZXlKMHZUTjBQWVZNSkZ4MlRhd2d4Z2pPWWl4SHRQSUNrQzdjWUgrOFA0bjFMVGY2OU4wNnZqZ1RtVW1oZ0M0dUh3NEVvMkNUT0FnRUQ2aUJWbnd1R1JZLzh0Z3MwakhzaEJGQUZEZmNObUVyMmN4QzRpK0J1S3F5ejZnTW43cUFRd1pOb2puYzExU3ZtR0hDOHVIRVJYZ2tNYnN4RzVNaUdZUUpRZmt0NkFOZTM0VkhObldjTkRpRDFrMVpFNDM1dk96RnA0akFENGNmSHNoTUp3aEpnNVRBRkZ1ZjgxZ0E4TUNlRFVkc0dJbHk1SnhPYUl4THAyRHN3Q3NrTW5zQjhMdmdBZkp4OU53b013UHJlSU4zTnZSQzdNZU1YTzRiRVRwWWZQdjZDZzF3Rmk4VjExd1RyZWdzYjJVYTRaSE1nQmFvZWlXc3VGYU5KWExNOHBCTnA5dEVvbU1lSUNlRDd5ckd6bDZWbEtURS9TRFpMUDVFUWdBdmsrTlhqbDJaRzRBZGxvQk80U0NWU3dmaUlJWlYvdi81RU16UklpVWVYSm1wT0JkNElZOHpyVFJnOGtRVyt6VzlYV0dFMFJUSkN4NGVKRWdBZ2R3SHlmRk41WHpFUzFQNDlzRnpvMzNvRVFaWWxYeTBaN0RHTDczTzdJakljVGNsNnZRQ0l2MDRVYmtab2ZpV1BEMUkrRXlTQmVBUEhiZnpwWFFpSkhTNTBZTTY5dzJ2TC9neTZCUFBLVnZ4YURoY2pFWWhRaWIyYmdJQUNzemhQVFRkUnFiRzF5QVFXdEpsaGYvZzczeFhIUzVBQmJLUXMxbzZqQ095QVVpb3plYkF3RVRWZlJnMzZTWWczS0czSk4rdk5HN1h3Qk5qZDRIS0krTUFQY2FraTVIQnRERGVqKzlnempHS1lNTVRKaUFBZzI1MzRYRmtOL0NHR2hjVmRFMHZlQ2s2azViY2lLLzF6UWR5RWx5VHFIYTcyNVVHWVFESHp1Wkcvb25wQjVZclNmUkNUZlVOR1lkWTNuSFBJWkFKeUQvNmNYendLQm9uUGNTUEFGWnJQZTRaVndqakdxTVh3U2lSOE5QRE94U0N6cXZENXI1YVZnSWlZUkpNVVJENWU4YjRxUHZpN0Y1TUM3MGNvYnhncGtwQXJZaStoS1lxTHBkOGs0aU4zK21IcGtLcWdac201aEhQa2xYbHYrSXFadEk0NzhUMkUyMjlidi83cFFoQWVLUEJ6SmdGU1lZNnNDT3h0QzNoM0FLSUQyaWplUmxsVys4R0xIaVJSdXZobDZUdWNLK0pWaElZTU9VSU9RRFVLWlA4TExNaG1sWEJzeURBaHlqd21sNy8rdGp2WDkzdHpjTkVjRGp2bURiaWhuUk9Pai9hUmZrYzJDeVoxQ0dEYmtERndGeFNxSzV2VUsxOVpGL3JtSVJ3VDdMeFRqMlpNRldmMkZpYi9uWk01S0J3b1FIamQzQlpzOWc5ei9jZEZzVWJiSzY4WksvbHUxRTh3ek8raDYwSzh3R3o4RFZuUmVLOGxyMFZheE5kTUw2UnU5M0diNlVXV2huakJmRk9ycHNyVVpWa1VoWEdFb2YzOXEwOG1aa2kxVFgraUxZQWErWEo5dUtKOW05dG1IV0NGSGJxeVppRFdvTGlBZkN6SENBZFlZcWNtdkJGUUQzK0R0MmJzR1Y0SHFRYW4wS2tROWc0VE80bW50eUpDUy93M1Y4SUs2TEd4d2poWXJGQU5mOHArSUJVeWVSR3VDdEVUTVlWQThKUjJtME1DODkrQi9YNTF3K2FnS093T2tmZE81dUtXeW1pZ0JBdnFMR2dLNE01MW44djQvdXlvZjc2UWp6MEc5cEN4alNoQzdNWVB3UisyRk9XTnIvRCtjUFRTRzhDR1ZtZ05KWHQvQlZZRyswUEJoeUdoQk53N0lUUEJBR1dxUlAveHFvMGdhWmdZNFA3ZUFEaWtBVFZ5N2VlRnR1NnQ5b0pPUWM0RkZSZzZ2UHJGMU1HZVhUL0UrZ1BxcGc5V2h0U0ZnQU8rQ0llWjNJc0t4RjdRUWVMMWN6d2ptM3NzQ01pQ2VxdlRvNVM0aHprbjJRMXZuRG82SFZva2hxc0x3VFRDMkFNRDJSZWhuc1dBTTNTbzJ3ZnRoeVpBR0Q1MzVYbjVWYVFsd211bXdtMFFOTUNGQ0QzQ05jdnU3RE1lRFV5T1pqNzdoeDdoNU5nSFV0SXMyRHNWaUliS2JDb2FWcDBDTWFoNWpBUDNmVEZMZUJVRWxpZ0hQK1NTTC9VdWxrelEzcmZISEpBT1VDeDZxdHkwY3lrQWVyc1hreVVUR0J6L0dnYXZoR1ErWndQbEhGaW5RLy9RTy9EQlYva0hjR1djQWRuVTRHNGdhekRCNFE3eWxqQmJyamRyLzNnL1AyTDFrVzltc0JBU1k2RllSTTEzNFpLWURmc2lBUUV2Q1NkOENqc1BpM2lmMjBUSVJHczh4T3pyZy8zaWhxQlBXRENMWVdvTUFOdmI3QmJMU3B5RzFTQ1FRRjVBR0NkcEd5Zi96TG1pVEovMkZjK3VJRnEvVHZtRnJNZGZPQm54eVdWTFc3RHZpVkVpa2VEeEExV0ZtMFhzaEhVQjV6QnJOTUdFMW02UE13aFJZRTB6dzVuUUhlemFEVmplSUJOdmpBNzU3cDhVNzRSakxQT2szUGQ0YnUrZlVCUlordlRHY3ZrbHY4bzlJbkJQNkErcEpKdmhrVmhCSXhkVGhCRGVneEJRTnFKa0lBaUdqLy80blR0ajhOKytWTHJmQ2JYdzU0VkJCUk9pR3dHQTViTmx2QzF2VE9BSkNpelRjWVowb2dJQjdtTmxaUTR2dGc4ZWdZVlFRUzQrZUtiTmRpRGNDYXNEQnpSTjVCRjlOK1dKVnVtSFBSVitCTWk4VC9tTWZxbDUxQzBiZWZkRVd3K3dybmt3QXkwRTR3bGhEeHdUaTBEVFdINHczRXZvWXovWkhSVjJCN3d6ZUkyd04rbnJZa1RQcjVROWlwWEYvektNaW5qL0lnTUJYV3hwdGladjczampvL0dDYVd5ZktRSzJjMEVUTDZ3Tklib251eFhEQUptTzNHa1JodEZ1ZHJpYWFrVko4NVkzOFNTWlJNZEF1RnpJVTN4dVhtK2VaMTRtYWowQnd5YUEvY3dPc3NxbUdFQlNMbjFnR2JlSG1oTkdVUU1CQ1ViS3k3aVUwUlZqTmNDU0FuZ0VhcmtzbWRYQUlWajNDblNqREpJL3hjeUJUR1F6TzZJOEI1MlIxZHk0YUdndUszZEFHa0JvL1dMVm9rZXFzczlzRHU0eFZ5QVBVR1crejhSK3NmUjFrc0VwbjNPdUFGQTB6NFYwanFtU2UrS0JFYWkvMG9WMVlGZkxCK2VEUFlNV3c2UUZ3UWQyakl3YmdOczM0RnFMSFlNSVJZVHZzOGRraitIUjE0S05OYzJkVDlDYkg4d285Qzk0Nk5XTS8rSXNzY25ySktCREx3TFhORjVvbm1lQmhJWkJuT3JKek9pUnpnTTZSaERrMzlpSmMwaG9FeDEzckhDOFdhYld2VytjQlRoN01pVFovRHJ4SVJIS3NEZENkb05ZOFJWSEtBRHo5cXpRUThlNUlBTlEvTytjbGo0QkdZQjhSSTQ4QVJUbmdyRW4zQnlGalJEYnJQaUZxK1VZQVdoQ1RabGRvd3d2OGNqTTJGNDNsMkMrK2I2SnQ4MWNYczluZllnb0EwWUlQZ0xzUU5wM2VmenRTVEJHMEhDYjZhSFdMSjV3dWtpN1JzKzhBYlNIVDRXRFpVVHBqU2NYZVlmcFhUNGNXQ3hnTnB1MWM0UVZFc0M1YTZ5ZHBSdjZnam93UG1xOGtuRUpOQURnNG5uQkIxT1FxZDBJbklEWUFzbS9xNThqTU5nMFBnakh3Tzg4cW5qalMrd0pVQjh3Q2c3WElKVlFIVURRT0xsMm5oMEhuYXpmbkh4YTdkWkUrS1hpWk1FY2p3b2MzdjZrS2tYNkNCQUxGaDFNc1dXdUFsVDk5b3ZwNEFiZklwUmcyMWdYNkh2bDBuTkpyWXNCSC94K21VZ3o1bnhvSG9nVkxHc1MzeXN3aGd4aGRTcUxGRTUwY2tzc0JZQkExK2ZpTS9PVFFDVElEUGpKZFhzWWlEMjl0YjFjVW9RYnd1WFBnY09ReTZBRmN5dG1nN2NudVI5V2g2eUx2Qkc4Q1JhYk1wSDlQV3dITzVkUUI1VDlGNUk2S21NZGt4Zy9DWnVZSGF2SkhzTjcwTFlZbzZ4bXNtdmZuYzA4WUtGcEhBVDRJTEVzRlIvVk52RVBzLzlraDZ3S09yT2hQelBXNFdGRGZXRHhlRG5zazhWTzdnWDZFd2FTWVdhK2NVbFI4WHR6U1dBcVhBNFhHY3Jld2QzazduRVE3N21RME85M2t0K3MvY1ZHSnBPa2tmODAxaGFWUWNTSXJpRU96SjVpeEN3OHpHTWNkYzdtQnZWU3ZORUxqOWlOQy9NcDJORURTOWtmWVFMVzBJRW1OSWVxSGw0VWpLVGJzeWJRdE4xNFdJdFlLMzhEcVRJYldHY2tKbVF6T0pjNmVucTRiVjFUelBMaURqUlg3TndFVFVvSk8wTGFjaG1JZkZuRmtxRkdrd090c3h6M1NvVVB2Z2pkY0FzVXlrbER3VEF3Tnk3VkUwK1dNSjZERytKc2d3MXpmNnNRdXNmTjlkK2Ztc0xqekd6S2ZsektRY0IvUXk5Z0o3RDNpZWEya3FZQWN1RlFBaHozeTZZb1AwOWNmMzBsM0RlTFQyN1l5Z3Qzdm9KT25ZMzloSTVVZ3A4Rnl1UVA2czc3d2lMeEI0SCtlVmpvZ28vaWIzdzFpSnVQQkxPSlYxaDI4SXY1V3lJN3NhaXVUckErQlJpeXZtYXhnV3lXV0liUVJnZ2h6bDVwNVZnUW1tWFVBc3NoaVZmUHBwb3RaeWp6M21iNVpHS3lnUVEvQWhNQVgwU2UvczV0VEVJSEVXY3JOV0dQT1cwMEgwSHJDOWZIdldZaURCYnZNWEQ3elZsdVM0OStjUllzOEpBV3YvNm1MWWg1L0l6bC8zNFkwT1Y1RUpkcmpVekdWcTJBeUlxUUxuRnFQNVVSNkJ6ZTMrTnBmQVU0Ky9XRFg5OW1PL2pCWmRWcU9uVUdlRW8za2Zld3ljU2pZS2tTenJKWTBZRGRBT2x3NUtWVCt4UGpuWnc2UVF1UTNPa0NRYUxSazlqbUFjTk0yWElsd2pZVXR2MmNTU1NEQXpIOHNXNGwrZG9Kbm52dUZzdDRUNlZKd3RlZ1RTVnNYcTJjWXk4TlJkd2ZGMi9RUWdkbWVBZ3VtTTM4UmVqSmhLVkhWd2w3KzlRcGlBYnprSXNZSU9oRU0vdGFFdW9HU01FOVZPc2VwN0xOZzQwSXJBWGhYbTRGa3JIcW5xeHREQno5QkI2aDlFSEM0QW5JVWoxOW9TVmpHd29DdkdpZXRkMFZydWpCN0NzMzBFL2VmRnNUZ1Q1Q1Q4WXhQWUx1VUdiYzRnVnlJK292L05iNlppd0paNE1ZV2N3NHhXYVZJandobitOd1pDZmlsMGpiUVhZbzk3cFlmZ2drNUFuVUp1S0JEb1ZZQUhzWWFncmVzSGwrRGl5VzVzY0JlRmh3U2FqVEczT0ZFOHdQMHZhdWE5MWNFaUlkY0s0cHZxYU1NWUxDQnNDWDJQM2pKQURMMTBYbUFNZ1JDRGNSZ3N1SGZTV0oyZ0l1TGd0N0lLZTNDSkNlMTN3anZqYlVDcDRhcWhMWnlqcFpKalllUU5NZXUwa0V6d3E0ZHpaMUxld0k0WlZiZ29SWVZRYlAzZENXNWYyZ1FSY1hrenlJQXdkeFYvUU0xTWxVVEFnblNuYlBrdkJzRER4Y3hJbHVMdWdHL2tDTmVKTGpyeUkvSUJwWnZWY2ptTTNnZ2t5VEk0VnpOdm15YmNDRnJLU3lJTmZSZDZnMUJGRXFUMHFZeDRDZG0zajF2Qnl1WkNHSmxIYXREd0dSY0ZIcmJLWlZYTkdqUWV5SnYxOGVGTTdpZ2ZYTEN5dVlnNTU4MkZ3UUZ2a0x1VFdCZzBJcGFYSi9jSXQ4dng2MGJqMHpHOU83U2RmcnVTWGphRTlNNyszcWNHVDlubnRDTEt6VllnOENieFB1VWFmbFkwMHJHcGlBRlJnRUJUZ2dhaTdBajVUQ1ZpWDI1Mlk5RFNYRTdJWnk1QmZoSjU0eEVtMkkxTkUxaDdFSGF3THdqQUlwK0Y3dkJ2NWFMamFQeFNkQWg2Y3ZyTUxqdVY4NnoyUnBSZXQ4ZWc4TURQYThDSENzQVJqU0lBNHhudFNoWlNQek10ZXdQbFFDV0RndGxVaXNNazZWd1pOUUxDK0J1UlBBOHBzOEl3Q05SM3JpMXVnOW8wSnllMnlkKzJYVm1qVTcwQ1BJUW1GaGtYZ3h3bTFhTE83SVBPVlJyRHU4RkRLNGdyQzA1Yjc4ZzZTMi9xTDE3MUlabm16NnRLcGtla3FIQ3NFaXNQYmFNaUNEN3hLVDhXb1kwSWhHR1NMK1l6VVJUSVJWZzR2dzI5ZkRqNkFzME5FR3UxK285S1A5UHp5WXkzeVFjMzE3d0tXZE5lUVRzb2RJSWlNUjEzRi9sQ29Xdks4eWRydk5hWUVHWFBDRzB6WlBYOTZBcDJZcjFtQm1XQnAweWxNbWdpWnVpc1FHS3daMytwMWpQbXdjcUlXQUZDQm40RFNTSzFIWlBJV25hUStoNFVQeVdVN1NNUC9rMFdnbGRPSHVPeGRVQjN0L2QwakF2RTQyQi9mUzRNRFpMeEQ0SmxweWU3S044V1lnazRpQW12M3dLSWdyOGR3Q0NmWWlXNTExRXpvZU5OcEY4SjRQU0pIUTBGNWt4S1BqQjg1akRBblJBdU41OWNKRFkxNVBnWEI5aE1zODVZSEVHZUJDMkxocWhmbUQrT3o3U3F3dmhKVDFqRStjMzcwOFd1ZTlFYWRWczRKaEdkQytVMWgxa3R5OUtPeDE5Q3RDTVZYRXBadGl5ZFkyQTRnbTF2c0E3Vm9hdC9rMjRlelR4aHZHM2l4WHdpOEpaTU55TzI0blhFUWYxTDVITCtZZmVWdDhJbkROQ09mUUJ1dVpWU2pkMCtpWndrOGQyd3hBeU1PMno0Z2ZIWkhiTUVoQ0N0ekhZZ0ZZVEZ2TjBtTkMxU0wyVmlVT3VMSUhqTnJpa3cxZlN3WmlZdDBIMENvd3VZSEFyUkd3WUJFQnNudnlsZWFNdVp6SGNsOVdlbHFJU3h5dHcwekhucm4vOEpaa2FZRkhJT003b3NqRFRIRDVaRVJZMGZNVkR2Mk5NSElBMllpTWgyMThZRDVzNjJSbldNbnp0Y0ozNEsyUTVHRFJIZXJvNXcyYXF2cHdFV0lGSENUOC9PRFAzNFpYRXd3ZVpEaTBMQ05GRTJ3N0FlZzNXRWFBQlBJSSsraVhCOUNLeVlOS1hOeVRTY2lKdVJURVp4andOWXZaaVpaRWJpQlpvMGsvbkNtejM1OTVTRlBYVnVBVFlxRURFTWdXOFE4enc1RC91QWlZNFpYNVZpZ1RkbW9SVDhBaXBiMmdLeTQ0WnVhS0NITUE2aXVmSDBiN1l2RU9ZZTlGejJHY2dNSE9saW53VGxDQTVkNFFjOU5YM2wwOStRVkRDUUR4YXJDb2hrNUE3dktHajNtS2x3L0hlT0Rsbms5K2ZncHk1ejBWM0hDOVlnVU11QldoTFZrakJCZ0dlSVFOVjlBRFVXUEppUTVIK014UTBVV2MvenduaFBkZ0hjWGNSUkVDaVRGcllYZ0VxUnVIUnZQaXhsY05uaktoQklnenNtSVFHSnd3YzVnc3ZIemhpTVAxZ0x2NFpaMzhCVGMzOS9aSTV5UkhhbHdXNkdaTUhPV3dNbmFER09KdGxmeVlKaDZJNTRscm5tOWtzMWMxSGNrN1gxNWlFYUhKM0w0VEYzNnhteXhreTNCN0FKV3dWNENRRE0rekJvOFFvRktLQ0NJUDhyOWR6Mms2b2loWk1vdFZnRkd2UlJuelFwNjQ3NW13bGphTW9pZ25QZHY0dXZLZExRSEtTdWNqVXJmMjB2cVNHeTNBbFFIakE1cGt6dVpOT0czMEhWK1BlamV1VDNUeXlKN3cwME1GbzJBY2pVMW0vL2tLQXB2M0JkUzlLU3RWTEpmMGlDQmYrU2xXVnVMVlpoQ3g1M21EcUFVL2dZZGJRVzdlZnB0T1dOWGFNNnYyVGY0cytTclVDbXFRaUlEemdwV1diWEVac1N5S0RwMlZHM3dHWVQ2WmpLOWY1ZFZkaFdOdHdjWk0wU0tvYm5odkRCNEF3cEZEdk41SC80R2VJK3pGU1U5MFhXZ2dUU3BIZUFraDVCdDA1aDFkb21xbEZ0d1VpRVAzWWFIcWpWUXYweUxGbnBVdmVvWnJ3aGh2KzFEQjhPd01zQzU3aXhEcTMydWxkaXQ0YkpGb0tURm15OFNJT1UyeWVPcGNMUnhKMW95cVdaRFZxa1pXNjMzTW9pcmRjT0JzMGNCandrT3JUNS90RG55RzlTb1FqWGhKYVYrMldlOENtRnMzdFhCYlYyZHhocFdQZUxGNVNuTVkxVkRIZHFOTXNhRjlKNlFKRWhlWGJOalJTYmhtT050VTdySjVzRHJpNC9Ra1pYbFloZmhBNVFIOXczd1ZvdlN6RlNGOEN2bHFRb2RYak1zNmxUWk9xNDh4MUNvL1VNNktHcVR3dWIvTmxYT0R5MmFnUkJodjVpM1IvamFOUUZiT3I1ZDJIVWpyMXNUMDkvRU0veFJYbmFRak1SRCsxUWpnWEhBTG51L0JzT1J0dUJEclY2eW16eWNmY3BkTC95REc0WlZKYmMvVkVDcDlPMjQyWlFGZzVJZGRzUjZNT0llRVlZa3c2Qml5cm9RdmhKTXJ1anl3eGdDMng2WkZhWlVzOWtWK2N1R2JXQkhiOXliUHVvcThXOGU3N1pSQkVjSkVWT29DQUpkMDNkOUo5QUtFSGx3UFAxVkZDS1MrWmdKaGFVSEx0M2o0c1cxdjJ3QlJvSkhZUDR1QnVYbSsvcXpMRTFsM2lrMEJ2RHBvMTB6TlFEUnY2eWNhUE5hVHdHTGhIZ1NZU01hL0NETm8yWHJWY1lYM2duZGREWjVQSU1TSVh1dmhlejVIMHVobnFIQ3N5end2SnZ3TjNyUGV3U0tmMjFSRVZrZmVrSDZDLzNvQXV3c3oyZ1ZDWVM4RWl3cnFZQUxaSlBPNHQxazJjQk0xaUh3SFlTMVg5elQxMjFCWTFtWS9Ia1N0RnllK2Jtemh0bHAydmVWV2I0YjJlVUx3SlF0UTlvc1VqQjllQ0dVS2NBQ2JIOWdRYzRhbklNbmNhSlNsWEF0MitMelFHbUV5V3ZFSGtQWU9WeUVTWTQ5Sk5meHBCekFXNVRCNmhMdkNVVjhFbkdrc3BHU0RSSnk0RDc5RkJKVTVVZUlzdHZtYkV1QWVqYjJ2cHVwTk1scVRYQzEzeHpxZ1U0UUZsdlFKMWRPU3VTL0xKSW5GbUVVbERJQVVjSHZUVzNWd3o3bjNXbGdza05naUQ2SWZFZXk5VHhVenFxdFkzeVl2aEFaY2lOK2Zia3dyZVRFbjhRRXdlSHN3bzNNYmdMY0ZtaG1pVGdSQXNZQm5BMTVrOUFGZlhHbndaVmxXYlVrWjhmdFU4eUs0Q1drS3FTZXRVM2VBSUlIUXNqQVQxUTJKOEtnakRmUk1oNTI3NTJ3eUNBalBQdFgwbGlUZU54b2RhZFYzdHRpaERvM05JdW0wakRLNVNuZUZKVnU4MnQ4eVRkZC9ubXI2dDVrbUlES25DK1BJcDRwKzNoN1lXYzVhMm8wL1AyaHV2L0hhai94Ly8zcjlKeS9FUUwrbXRBNjdib3MzUWR4NDloZXNjdU5tZXkvdUQ2V1BDbEQwZ1JJNXFxNEpaY0dNd2VrSEdxdlVvMVpQcVJwRVEraDNqMUh2dHFmczUwTkN3Snl6WjkrUXpXbDUvcFEwMitGUW9Sa1YvUE13YnMzWHVrRUxPT3A5aWh5TjE3Q1E1Rm51YThmV1pTbWVhRnR0QVNsVGtZWXJSUTgxS3NJaHZ4V3FBU0VBZzFCZEhnaWlrcERXdUdERFh3bGhmcnVuaS9oYjl5bFF0R1RXZzdueVUxYVIwS3daTmcwclRzMDJtdnNoVUJERlRPNWE4RSs0R3FqNXRPMjdhVmZmMmdvc3Q3SHBTNEsxUVo2QTV4eGJoOHBDUHN4L1ZHTFBUMFo1ZWtoeWpyYjVVSlFtU2ljL1Z3YWxyTHQ2ckZJREFQNWhQTmpVTC9PQm1tbEFmdFdBTkovOFZ3SHhwT3ZmQ0FoOGIySGY0QXVJWkdGRUJsRHVjenh1a3lBK3JFSjhna1NtVFVqUnhZNWk1eDU5MjdrUVpDV3RleWpYSUVVR3ptcllHelovZWZCK0UycUl3LzNlN0d1MEgrV3p5YUxlMTRaenhlR2gycHVoNXpnczRkM0RENXM3b2gxZ0ZqYTFJaUdDMHNMNHRnYklVc0lVSVZpSnV3ZHc3Y3kwemhEbW1LeGxKd3hvUmVqVkl4SU1UeS9raUlWOHZtTDhBazZnVndhRmRIK0laaERyNS9TWFhjdmFEc0RMaW9JNzlvRkhHWnRaSHl0eE5od0VqSUpDOHRiYlZ1TzFMSDM4aW9NS0NPTHBOYVYrM2VkMCtnNzRRclRPOUFVb3VXVVRHUGFDVEl0Tmk4ZUdxNEdIMktiY0ZQSG9ZZWhMa0xESkcxVmFMOHU4eHZzaG5UejVObWNhMzNkYVM1VE5pc3JncDgxTHJNT3cyQzE2VjRRTG5EZDUvdGVuRFJscFhqOFY1NmxteTdyWTdoMWdDY05PRUg0WC80UVVQZk93SmE4TTl2amFIT1JaU05WTzdaUE8vSGhkL0lkdHZLc25udUZXQVZiN3Y0TG50REpjWEJtdzl1aFZDUmM4cmJmWGdNQXk4ZVVNc0Z1cWtQTUZ0Vlh6QXJDc2Q3RTBJd1I3MUJJWHhNb2pRU2UveHR2aTR6REw1NjBRaUk1ck51MGh4Zzk5d0VhTnEyY0N1Y0s1bjQ2Qi9tcEFvMldQS203ZEtVNTc1bEZCSDRUL0ZWYzJGdTBwZWJ3Sm9xZVdGWnBEN0VldFFCclNZNDN4NmYrSW1DQ0tGcDV2VFkwbzVYa1h2TG9wcWdEenoycEtZak1xUzFVSDJNdVBoTHB2blB3b3Q5SHdvcG93RHVMYU9aMTRCU0MyRktLQmF5eGdEUzRNSDhNK0pXRlFvS2RCNXVCSFpaNXlTbUo4Wm1NOFhtTEZZTHhzT3BvanRQSGVmTWNRRGtMY0xnOUFjWHVtSW1TbzJjNVhTejJuYVlGbFVTTUJCYU9UUVdlcjBFR0swV1hucVgrYis5NW93enNFOWJrbEpETWFoOHhjNHliWFNnUmw3ZzNlYkRrYVpsVGE1dzVQdTA3Wk9LVDZkNXZ3WGFhTk1EM0NPWXJmUGpVK1BkU2Z2Rkh4WE1RU0dzbnB0bExIWE0yclhuNHRuRVI2b0dtZTZuRXhHdE9hWURTTnhWYnZ1b25YWU53Z1NBSXkxMk41VkxSYVB4TjFZR3hRTFN3cnZLYjRQUWMxdEkxNFRxZms3MkFHTG05REgyNkNxVmlZNXBuQ2xjL0Z3c3B2MDBlQk5VZmNOL2p6WStEeFhKTGJRbVRZOXhUUGVkZmNrR25yVHRHWllEeDB6MmtDbDZtZG5RNlBNTnRkVDRLbm1PRjVmNTFNL1NYRDg1M1dRZkg1QjUwUE5qc0w1UHBUZnVjSHRYL3lPei9ablpQYnNUVG5qK3pPN3h3T1FlZVAxSTdpRDZlVmV1SVVpeFY1YlpuL1VMakk3WjBscUY4TGxtRVppZE50WitZdHN3a1NTTVc3WndMRVBKSGhRdWg3QklBMnR3U0FuUXNtdzNNRnltMGtpV3pUR3NCR1BOM0ZNbDM3a2lyeExSTUk4YlRhUFcwY0Y1UUxYcVhZUnpCK3RwL2NNdEQ1M3RZNnZUYXZJcEpaUHhRb1FvWXJnQ2w3T3BXRzRpS0FyYTBDOGRkMFpVOTlpRjA0dDVvVXJ3aFdMdGhzQURZUUVvcWRMUTJaYzAvelJWdFRXcXphOE9BcFlMb1FkaFF1Sk5hZ2dneUdvNFNJaUo2akhXbUJVUFBVc3lUQlJDUWhaRUcxVjhSRDhmcmNUOCsvZlRMMWdzbWlZdkMzaytNaWltV1BkajBJRlZDdDlhMGIzMzhMZ3NQdXJXSFJIQ3JWRSsvYk9IQVRpcjhYY2R4TlRyS2lxSWFBWnhlNDlsZHFCcEc1ZUpqMU1uOUlyR3V2OVNQZGNvQTJyZkN5UldVb1hiNlJHNkxHUGxMUDgwYUI2VnREbGl3ditPYnRNUnErdk9SQ2FPRlRJem05Wlg2S3JNZGFvS0UyMUJHaFFyN1FyVVJpT0RoTEVrOXVHQ1FZZDdZUkZDVEJZZmtRQy9ROXM3TVNpQVY5OFZhNEdMYUVVV3picUV1OTJHSG9VN2NZSENIK0pxakVBcXFFWnB5WXo1QXMrMm53ZWpQYWIzREtRaUpZUnoweFB1VlVickZyWDdhZERTbldMVWZGTllqMnBkc2xBSnN3aHJNUkhtczBlY3lLL0xENVNTMzkycERubFhSRnQzOWhrOG1TSG1TTUtRTTdaSzFvYlRicDNnZEo4LzNIVjZ6NkJwMGhML2plSFo1b0RjRzhMM1ljaTl6Mzk0eTFJVDVyUTdGd3RpT0NXVXlUSkpXTCtDeU5lSDRUNG1DYlNEdDBlS2F2OFdhb0kvajNwMERLSnNqTVpTUTRoYjIrbUNwQXNDd3o2bTlWWjI1RFZKdldYWnNWcmVFemJNVVBMbkRaMTczNkdDWUlocXpOWG1ZWUwzelp5dExrb1lLdEZYcVNMYzNFQ0FESG1seHJrakMzdUxsSkZydXNaVTlMTEJrVnVvc0ZCN2pTeVc2Q2pmWnpkb2hWd2UvdEJPcjdIdGF3b3hJZUs3WkNMbVlQaU80WHEyTXUxS1JLOWppR1RjUENoMG1mYW9iWlRuWEwxNkVOeGZROS9Bb0RZWGZoTlhnMEcvVlk4ZGl1MC9xUzJUdjdwOUVxV0JDM1pYZFZ1QWZFeFdLdEdON3ErWkx1YTllYmRTK0liTWlrV2Nxa3BvV043T1VwYURTaFM0ejdxZmdiME5PRDJLUEdPM1FwNDJOM3BvWTkyZEZwQ2pRQ3NNbVpTOEQrd1B0L3VpVFp1MDYwWUM5WWVWdUg0UE8rMnRCRGxBUFdRN2Vub0VPM2hpWDdHNTVyZEZIMUUxYjdaUVVjM2dXdTRvZ2Y4Tlh0dFFuMkNPR25ZSWNqYTlnUlpQdXc5UlY3d0ZBa2xpZUt6OWNHZVJpaDNhdklhSFMwNGFoQ01oYmFOMzBlUzhjQlZUcDVMSHZPaUJnSUxXTEd3QnBxcS9DY2lZOXdrWjhXZjltWGg3TURiOHFMaEJvSFpqeFZ0RDBaQW5qYkJvMENaeHNBeG1FNUNsU0hCYnVmKy9Ub1JHTTRscDFodUJxTjgwRkt0dUVBRGRSKzhvK0xxSXFvUUZuY2xreDN4VjUyUnNyQ1B0aWpVNlpzVWU1VDltVWhaVFJ4aXluWEUreTM4cnoyMCtLRVcwTmoyVmpDWXZZOHN2MzVMOE5oV1orQ2E2WExHa2tMRGdQQjFKemViU1YwaFJ0dkR6R3NFYlR2UGllUEZrL040dW5SdCszSlVzc3h3eTQyKzBCR29jb3ZzWThvQkxDZHMvSWJ6bUVueU5MMnVFZVcwOGtoaFZVM0VmdHVBQVQvdGtldnl1RVF3ZDB5eHVIQkl2WVI3dHdxQk1DVCtmZ2tHM3JzNWcvOFB4RllIUDB3alZlWVN6THA5VVhBQXVqajkzRHlDNXJPajl3QVNGUDd3QzlpUk1JNHQrVlhIWE8zOE9KOTdqUVZpdkt3YytDRExUbE9BV00weTlIV2hTTEhKZ25wbnB0OU50MjJFdTdYSTJnLzJLSnAyeFVnSlhhcUNxU1BSN3AyT0Nkb0tWS2pnYVhodWV5R3g1a3hudWVyZzdqM3ZkK3BvdzBUVWJCNGp5U0JKT1NqWlorYkFMdk1QVUhvZ0tKNWl2UHg3NGJ3ZS9OeUhsaDdmaVo1Z0tyQTZZQXduVGFkYXBVMnY0VmZQeGp1UkpUQTMrMHBPdDIzN054cDRCcmo4aUlkSldFZFFuNklZZzRtd1I3NXRJRFdBNjdpK296Y0lOeEk3Q0pYSUFtMHN2QlVvVG04QUtPNlRsVVFIL0M2U3QzMHBiTmlHaXlEaFpYL2VsWmhKVEdMeDRJRTV4NndVNTVXNVJ2NVorbWFKeUtYZlRBQkxPdFdjTUdTMFozb1BrU2d4Uml3VGxRM0RERTYxYU1OOTZoNmhBUGdqMmRwUURZMVFkakNGWnVOWThsNDVrZ25HYUNESnJUY1J3VmFUNjRSNDhja3JTejc4MS9rM0dBenB2TFdDd0k5WlJ0UVpEemdCa0FncjdZWFk2Tld3VXZtTXpwRzFwK1QxUS9OQTdISFJvRGFSSkxHbmdXSDMvRkRhM3VKSHNSS0xUQkNuNU5kc3M4UDNxemJuZ3lMNElJVkFZWHdMc094cHdtZU9nMGMvYnYrakk1UVNHVEp6YkpNQTJxeU5BRHU5SjBnbDg1UWc1dXR1Z1cyZldhQUNGV3ZSd0g5VWhSOEFXRnpHci82R2dSZEM5bWlaMzJZZFNLOFlVRElVM1BGSnBXd1FidUJUbkV4ZnRRMlRtQmY5c09xT0Jya0NNTS9yYU9KUnJQR09KcEYxZyswM2VKZUdGU3h6aEl6OEt3ZXY2eEhrVGxLSlVsa1VmVm5KNGQ1M2drenQxN0hBenhFc0gyUXhWNWNhd3EzS05JZVI4bDRvQUpGQStnZk1MdStaNG9JNEdMSGJMUnAxcmlZUFZHNms0NXNpZitmY2JIeDQyWHpyNEhOUW1Uczhic2lVSm1zbCtINm9ZamRkUFNSY3BZZDN3TG5Qb1RjWmxKTG05My9aWVZycW56T3kxWGFZYmJqaGJERytzWW5nT3BKbm4rcml0ZjNUQk1yc0kzSERubUVZQnFuWlVpQ041RWhqN0tud0tCN2htcGVyS0F6Wmo3TFd1QWN4NUJlbTBtc2owQVdsUXBXMjJHVG1rSXlUWnRsVHBFMEROdUtYbXRQVTNOa0lXeWd5Vk4xbzNxYTA3SUNnS3RzWjU0T1FJRWtLRmJybUt0MGxrMHdqSjRwUWhGb3RUMitYaXpHK094YnJRdFVZRFhzclZtd2htRGJPOXUxZ2FWcWpTbmZYQkdHVXgzWTByRlI4Rzg1RU1WVlRSQ3RhU3J5ak9xeGhPTk1BYnFqZmNvZjlMM1pSYk9reVkxTGcvVEJxVzdMZng5bDF5bll1NjBPT3J0bTlTcWFuSHUxZHJWVm0yS1JYb252SVR0bWI2Y2ZGSmJTTnJHSXEzalhUNjZ3bnVFaHBwRHVkWUh3ZDdZQjlrVzl0cG9KTzl1NVFzUFhlTDZ1QklJOUlJb2VqTnloQU1zVUVPd2JGc0hXM3ZkSlplRWlQNk1WdUd0VWlBWE1kekluQW1kcDQ0ZGF4Ny9YUC95cjhvZnJmMXovQUg1YU9HUVpPM2JOeFJJZEg1dVhuUkFUUFVpOVpUWGJpbXJ6RGNzVGQvVGRBaEpxc2xFWE0vRmtEbmNoZGp2S3hzazVZWjVFMC8xYzUvVGFPc3p1U0pMUUdzUTdHeS81M0czbGFuRHdUYldIQWxjZml1OVJGcGJaaTUwdDNTaUJXQTVYc0VsYWlaUS9ITHlhRWljUUkvQk9TTWJWYjQ5Umt0VlFOc2VjbVQ1SVpNK0phbStZSnlMV1pOaUZnV0JpdTM0ZDQ3SmNuVEFTVGQzT0JWWERWenhDaHBKVmh3MHNQcU5uQzhuUElGRDkrSDVzbnJON0ZTVDJZb1pWT3RnenIzSll4eTBsZEJwQjk4RFpRVGhIdllQMUVWM0xkUk1aK0trZHlkbUVTTG1Lc3pYZ251Z3hqRG9IbEYrSGVFR1F1aE11Y0xzVnovVEQxMFdxVDdKUE1IdUF3R3VzNWp3ZGlTK1dqVXFyNHlIYUZQU0QxUkIyNFh5MUlna3NjSnEyWHp1OElKeVkrazAvMWNsLzBwNlJjZVE2MkFWTHp3Rit5N3lKY253aVc5QnRXUHlRRE9xK0FDRXl0VzM5MWpRTGpabUF2aXhpa2w5Tlc3WnNIMEN1VjhkL25lRlVMMWorVFJ1OTJOd1A3bzA5bVIwN2RiYjNaNHQyUkJTak00dlZaYytaUlFEbFJmek5jZG1SQmJXeGxmTzBRcldmd1hOSVdkNGd2dXhjRWpHKzNFVTlKSjFDMnV6cHRISktRaFNWQ00zaGQ2RE51S1hYWnVmQUFWc3VBQlRlM3g1T0lnbnNkbHF4bHh6Z1lGMUIxYldKeE9hVkliVTJBRjFsOE9sY20yVWFKWEo5ZGJQLzdIN0MwTHVwQzlNTlQ3Y3NoTldwOXM4OUZnNG9Lci9LZmdDb2hQaXJFWG1iTGQ0bXVyVmlHeWVkYVRvOVJiSlBmZndhN21IN0RQQU1TN0ZFWHJFMHpzZ1IxTk00TTFsZ3lyZWpSQ3A0UjZnd0dXSFZ4dlQ4dWhMV3FpMkg2QnRIM2ppSllscm5pWnNjb3BneXdZS1lNNi8zN3J6YWdRaE9hdUd1c1BlcThzOW13KzYxU2lVbzFRUWR0M3ZlbkdNaHlHS1U0WkVtaEFmayszSzRia3ZkTElqWjBhYks5NXlMejI3d05Zc0wrL1BZRGtGRE9QTzA4bFNnY2tmVlJZZDVSdXZkVUtTWGM0bFFsSXVBZzNpQU41eENjU3MrWCtnQVNoakw2bDRKS0FwZmY1VFh3WUtqS20zeTNGOWhOZVBGTzhPNzdHeDB5b1ZETk12SGhVQUE4UFhGeDhFbnAyT0F5bnRTOEN3aWEyZEZyeVB2SE5YRzMxQVQ0TkZXNGtEemw3eU9FRFhVaytha0F1NXo2aEU5TU5zcXlZMjZzeWkxdjkwalYvemI3aGRFMmszc1ArMnVOZG16MjI0ejVPS01LUUdQNmkwUUtrUTRPMEtTczhLU1V5ekRaK0hFTXpkRTFhcFMvZVZhZXptdkFDT0h3cnlaQzI0UUVIQUExMTJXNmVKZGtIQTdXZVA0R1hsa1NYeXc2cmJhQUV1WVF6c0wvazRKR1N0c3h6UWd2bXhQc0Z0NjJXQnUzUzUwVmNpcUd5cndnV2JOMlg2d2dkNHRjV0JYNEJiN0ptUURzRGR4OFN4c3MxNGRVL0N1TUZ1WW5LM2VqdmNzelpZdlFMTnpnNDdVTzNVaCtod3FFN2VEWjc5bmRxbWQvYkF2cStteEhKUVgvby9Mb3BvN24yRm5mSmxJczFqT1hMUElXdzUyTm0raDBwbGVsMVBnTEloK29ZSndBeFR4K0lnY0x3cDFPYXZGZ0dGeXhoUG1ZcFI0aTNYSmFhTmx4NWswWjRGWHlwYyttZXhhYVNkWHgzNVVzM1phcDZNeVc5V2hsbW5LZFVZSVd0RDdoTStJWVNQNDh0QWM1UUhQdG44bUJpZURmQjY2bm82TVd3NkpxRjNPbkgzc3hjMjREQjVwM1F5TVp6WUhYa0E5VXdJUjdaL3RGOXEybTU0bWFuK0NsbnEyT212bWxNNTBCd1FrU3dOTlJXNUhYam9FeGdoSlJMSlJIUm8vbGFRNExTUXhlcnBSN0pERWUrNkdmSHFKSzhFYVdPazNOM1I3S1o5OVJxZmt2cGpmeERiUTVOeThReit1RnUvdGRKZEtHRnpPN0pDa1RZZnVlWVJwMjhjMExYeWZZdHlLMk9HTnEvT01uSzRRUFQ2NHR6SGdzZ0VTSVpzd1l0VGdhNi81czdtWnluSTBTL1VkSFFzWXNCSFR1VFNkS0JSTXZ6d3FEWENVaU9JMHBHdEd1MFl0T0IyM2c4TEVIWWRSc01VT1FhbTh1L2xLTE96R2daRktFS0JvQ2drS21LRWhlcUhvY0ZrOGJMK1VmZ05MbTl0R01rZEx3UjZ4azk2emhjTmVSN2Z1MHg0NVp4amxKRHNCdTBSK3MyalgvMU5Mem9aaXoxZnpjaEp6OUFEanpPT0RIU0VEMGlNdnpXTTVHY0IyUVBndTI0Y202aGtiQ2VkSWVkbGxrMDgrdFNja3JYTzBWaE5CYlg5NzBVN0padjl6V284YXZKWE5CYUFDWDk3WFlpU3JkbzFWdHNWQWRYck5aK29BTGtKSWNtN0hlckl0N2NYWlFleE5pK3V6d1JBUEZtV3lsQTVjbDllWnNMQVNld0RmZ0prN2JUZkV0Vm4xT3Q1bytsSXl0dmRqVWYzS1lJQjE1UkNGYm5jTGhLZnAyVW9FaTVuU2l6Vmx0Nkp4L3dGZ0s5Qm5pOWo0TzdIS28rL0hVdlY2Y3EzQm9jcjJjeFMwUElqaTRCYXU2Sndxb0FHaXVkTzdtOHF6aHAwZGR3NGVETXhCWTNnOGtZK1kxcTNPTWp0bi9xZkhjMkZlUkROOTcvRElNVE1oMFBsNHRmYnJjZklJOHF6ZVZnRGNRUEhKODVnNUtJNERhZjloTWN2MSt3OThORzcyUmFVT1hCRFQ3eTlhaDh2YnJQZVlhSFBIQjVVelZUT1kzM1FqVUMvd3hNOUJBYWRlL3U0T2hTVnNPaEhyNlU2N08rZFcyQW9CMVNQSEl5U3l3d0N5cmpmL2lpMEo1bS9iQ1FSaW52R29lNnhwZXRLcWVaVFdaOHV2OUFYRkRsTkFISFkxaUQzczlwdUFDZmxNNVFYeDZ1WHM4ZWRNTVlDUERZSlJzZSsxbmxFM2RzMXVhRjZBa2lUbk5jQmliaWR4dmE3L0diTmlsc2Z4MSsxQ040VFRBV0RuVWJROWMvdkJYZ3hibzcwTkoxK3pTTzh3N1dMeGJIZXdYaWV1bnVvYVhCZi8xZnUzdllnT29iMm5rNHNjNmZYWnhJdzlnT2RGZUVNeERLQ3NPUmpxTTFMYi9QMFI5d2g2anI3emVMV2o4c3FwS3Q3Mm9pQ1duTGxjRllOZ1ZtZ2VURmhhdE02QXJoYndwK2JzUTJ1S0FJRFBDdnorMU12bzhqcUhwWG9WMXFJVUQvMXdOY2NkalhiS3kyRU9DWVd4UGZNbUppQXJwc1dObnZUZlo3ejNHeTZvMkQraFVScEswTDlxeWhjelE3NkowS3poR1c3V1hZb0pPMzN4NXN1RmN3VFY0L2dqTzJtS1F5VDNHVm50L0RuSXZQVXpVdVpodmFQZE9aSy9nYmRPcS84UVJRNXlRV1VUbDkya1plOEVhMm5DRFM5OEFYTEgyRVhWcFMxMDRUUXZUUk9iTUNNSCtVNUZwM2w0cTJhdXR3SEpBV3RJRHJSR0ZoYWJSQWg2emxvdEhsdHVod0U0d29hVmN6ajI3enFWdzhYQkRsUHJCV0JEZEExRmFQU1F5ZnFRR1J5TUxRNVh1TjFZRGpFdWpvU2RpZGR0MXBQZFc2WnhQNURXNTNhWTVyNmNFMXljaCtjMFJNelowNXB3TDJBU29zL2xwRE12ZFlHZjZSeVI4Z2M0K1RJTnptZG1TN2tKN2M5anliQ2VhSGNySzJxZ3Nya1BpY2oyZU52OEJKb0JCd25tOWp3dWNKWm82ZEdSSGl3Z2xNVXN1SThGV1phbmVJNTYwcnVaYnpnMUJEcTBDclJ0V3Bqd09wak4vQzRYSGR3U0lPV3hOR1E2NDhHcFYrdUtFRElmcllHMlFwQk9PeDJtSlR2TlVZTFd1Nk8zeStlUGNNQ2l1TDJkK0NBa0wraUNyVU1FREpoLytkZ2tEeENjelNCYjNQbFJ2RnNEQVgwTzlaU2lPc242N2JjbnF0bnhWQjJ1UFpKam0wR2JaWTN4aGRzL3MyUWtxN01XSWNUM0dlTmJZY2g1Yi9tUE8yVzFsbWVQVmc3ZERoTUowMkViYzhwNklSYmx1VHcyaTA3QTR6NHJmTlJCamtHVkg1MHpiOVlnclE3dk1WVU10MEpFSjhoRjZpQ2I5U0tJVFdoYlNlbWFMcDFIZHBBS3p6aXFoK2pCSTh4enlieE5VZzQ3VE0yVGRXeEVQaHlNdmc3WmNkWm5YSkM5aXdYTUdYNzBkc2Z0b1Q2Uk11aGFoN281RStBSTR0Y3lXQmFEbjVtSlBLVjFEbnE1WHlzRWlyMEZuU3VLWjc0SFJMUFlyVTBnOXNoWGQrTzMrNHlDdzdJa0p3Y2Y0MkVxMHRMMFBURS9iT0hCMmVaK3kzVnNidU8waHpIeDRhM1pydXhnT0V6YlRtM3I1bStWZGJLczMrSWw1elRDVkk3c2FNN05ubm5ad2ZKNUVqUk85aUtBUXdUWkRXS3hXbDkzd3VGZy80YWQ1Y0ZheERPNDdNT09paFZ3enNnOFIrL3pxaTNyanpiTmdkWFJtbVJFYVkybjZQdUZTamduU2ZZUXpvbU9mZVFZQktMTXJ2a3p3YzdPOFp3dngrNmY0ZllQQkVuY2VDVkt6NmxXVGFZcm0yMnBjVFJMRWRBOTJxdjFNYzVVdUNIYTIvNzJCUnNCTEIxMkFLNklIcFBMeHJQZjVCeGNCMGJaZUJmdEZMR1V6RWNCNUZkZXRVMzJFQmZMM1J4ZmlicTZBUElVcmI2MDJUNmZLZEtRdkFBdlk0M3Q1cTAyeWNWNVlPcWdYUHVzRERXcjlWcU44Slg5Ni9raTJJVFZVRDdVWVZvWG9QVG5zajMvYnR5Q2pjWWorUnFjeXpxTnh5NGJlZVhqbU1uYlUyV2c0eHFLci9zZFVYMktRSzAycnNleXA3eDNFSitSQ0M5ZlFLdmw1QitSZkczSG5kc1JsQWEzUXdBSW1WMUxKdmVlNHVobFFrUkc3N3dKS1pmc0NLM3pPUWZVWnlxbXd6QnRWMHFFTkxZV3VGeW1kcXFqVnNEc3dqM3NFdXd0Tmxub3RDS3ovVTZmSFVzbURPZGVHb2Z6czNlZDVzNm5kYXI3REdRTVcwbGVpTFErZ2NOUjJGeG9IUjBBZStDSVFMNkhTY1Y0RHgrWUUyWmVrYWtZRnJJS3NpY0xiQVpnRzdUdFJMN09JNEdzQkhwUTBRNmk5akVSblVoNFNtbE45Y1ZmcWZ4N1F1ZVFEaTk0VlFuRURvb01UdFhhbFNEREd0blBDb0lRMFZsc0E3V0gvMjg5WTV3czRmbHI2SFlpYzJ0U0FLRHdUSHpHQTlBczF5bnV0Q29wK2N3SVQvQlJiYXVlMlJaT0luSjhxVnhQbW50T1dKeEpqaUpiQlZWeGp1Q1FacWlDeTdaclowK1lQWWxPUkF5RVlQU2lGTHQxL2dWY3h6bDNzVFhrT1pPNG5NMW9sL1FaTHNSclBNKy93blF1SElEQ0lqcHVibHVKdno1QnpKNzZoQjYzTk5LWlhPOHI2eHZkWTRKa2Q1QkpxK0swYnJ0OHRtTS9Tbldvc01PRE1ERTA0SEppM0YyRHg0WFA4ckV2NXU4ZHd1TlFMdE1QM1Q2K25LeGJDY04raGl2RGIvT1ppZXVBR1FkT1pQMklHOTVvMWZjOHBNcVNwdFBicmZKVGdBWWZLR052a3ZPUnQwOGJtUmYyMFcxdHNMVHlTK0VwNDNhYzRuTzYvWjFJdnUwd1I3WEU2dXhpL05tU2FmNis3UUo4N0dpUzVUaXVHSmJrZFVySGlwTzJUanNoUHR1enRVMVdQRVZreG1zamtHY3NIdGE0eks5anBHQXhYRGtoWlY5V2hMUFFZMGhDUWZaWW5DOXZuc2xHRDBlblRvOE5MU3MyZUxDZ3RpRUxGa1FQTUJxL1FrM0VkS0VTQjl4M09HRy9PcXpiYytVN08vUU1FbXA5b3pNNVlYVk83UWtlM1Rrc0lVNGZJd005WklOWm16SHFaUmRldDM0WldVVTBIUVNheDBJQUVCMU9qSGtSOGZGQzNPWG4rVlV6TmJPd1RuTTJnZVRJN0dYZG5OUFBWdFdqOSsxSjhubUVUc3NlMVRUc09ZbWlxWnpKenQxQ1VqYkVrbGxJZ2hKcm5tZGJGUWRMWGVNOG1DRytDQ3M3M1ZzOFBVNTludEgwSGl3RmorM251VDByTjYyRWhxY2lxT2Vwc2JGWFFXUkNpd3l1M2NkVkNJUGd6SFNLbDlVVmhBLzdqWHlhRlZ4M255Rnh6dWNiRXVGRGFnZUNFZlJweHJLTEdNY0cxZWM4eG9WRkM1Wk1ycy8yVWdMSFo4TmRQc09hc3NZL0hPQVNwSnk5clFjZGhjL3NjeGg1V1JUOUFsa2VqQklDMkZySHJmTFNSY0NQOHVVV3dta25URTZPVjJEWTRGT3JKZzZkcmFkSDhDdlhxeGMvbmd3QXpNMm5YWlNOcEd2eWhHYUNncUJLV0o0d2xCTVVYck1hUGxmRE05MDVMYm5rWFV1NUhCeTFidDRob0ltY1EvUVltanhySDVBZGJzV1p5Q1U1QnM0SGpIbVVPOC9NaG16cnVNaGt3K0FMaHdUbXBKcnJnMVRwSDE4MVRMTnlNU0FmSVlUck5uK0VKWVIwQ29vOXdmS3dhNXhuUnRnd05DcVJGbnJpMEhtSFBVcmhjdjJpVTFvY2cyL2VIdk5uKzNCY1p6S2tkVW94WGdMa1poY01sT3E0TTB6NzRrMVpNMGNxUDdhR212WlhnSG00cEVOeDAzMDVUZUZrK2U0enN2UjliU2diVS9WT2pFZHNGd3d5M3phMm4yZVpmT1laNEp1dzVtQnZHMDd4Uk1mN1EyeFlSQ2RlV3B3Umc4Zmp6dUQwRVNMVG04TWpyd290ZEVobFErWkRmMTVQVTZFaHpZbmgzMm1FZGNLTUZkM2JpZ1VucDhYNzFORi90amxMTTFnT3BDalVhSnVIUkhSL1owNDNHR0MzeUxmOW44blFuUkVNSGk2Zkt2Nzl5VUJBdE1VRjMxYTRxYnFMYklTMVU3dHZITVhpVitkT090TEQ2aE5ZS2lFL3p1REpPRCtOTWpaN1BzOVAxOC9JSDJ3RXNMK2NZZ1NYeHRpakU4RXNOVHd0enE4QS9kMjJ4ei8yQ0hUMnhPWVdKQ09PQzJFR1grNC9xc2FKL1E3YlFRQlpvWWNHdWxXdTFlb3ZyTkU1cnRzcFI1OFliTVVMN0tBNm8vaDk2NWxydVRCTTFOWUdOODhBbkR0Z0E4RmhtUWpONlNEb0JlWkRCTE9QQmJEakhFTHdWZDVjZlltT3RwVUNUUUkzMm1kSTBoZlNaVzF2UDQvVklhcER4bDZrOW52TEFCT29LZkt1TTdOQ1BMQ2p2eUsxUk9xZWJjOTQ3QWhTdDkvWHVPMlVLSStqTW53Q0RqUXUyKzRFUEtsV05OdG4ydkl5dkVrdmRxVEVwUTROanQwN3ovMGc0TmpDTUIyK0RuVERtQkQwVHNmM0lWQnpnTnZRNi9ZemhsTmFycnBTbFVHZnUrZkZ6UUhGODhVZzQ4ZXRvV0E4Z0Ivd016dk1hem5WL0E3d3RxcnE3czZVZW4xMmhGMVF2TmR0SVZwWUJNa0owNnNGVE1SUkw3TzRsaFUyczhDQjJIWUdhRXF3VC9YZmFZSHljTWl4K1gzNGtNSk1KQjBPbkxjNDByWnJLZmdIclhGV2c2ak4rL3U0SE1UNjRjL2JLR2VXRFFKamdZeGo3NTA2aGlna0RGbkZBNEttZVZ0NURGZThRQllZOUxkNklNNWo4SGJUelBFTjA2MGQ4d1VvUFhFa2ZpMFBQUWlrUVA3eTJRanMybXpCL0ZWS2xudllIeDU4T0E5czNQeVNUVWZ1UjhGMUxBODNDVmk0TXdkTDMyOXdZcFd4M2o2K24vS29hdU1wck5idXNuNmU4VE1PaFhYV1BRcjljUWQ5TEJEczBVa25acG50MDRBOXFLelk0b25hOGF6VHFkZDVYczR3N2FhelFJd2tGQ0RwQUJBZ3dybWNyK2Mwc3BYWnpJdG11QnNSb0RvVUdnMmY1RGFuWWRFNUVkRklMbXFkZ3ZCbWR0RHhkTU5YMVdvTnZROXVFUWliZGFESlBEWHJMVUxiL0RESGVTYmFldzFqd3VOa2Z2aml5YXRidEdkQnVQWER5Tkg3VjVuYzU4RCs0UFMxQndMNUZvamg2WkU1VTdReHlONWZINVBuVThoWVRaOFFVY3lyQnlLb1RkWUJIKzRQd1luSTVxTWVzek95YlNhMU5zcHNNU0NUbk1kK2ZVS3lVMzU4SXBVUEV3aU9rcldiL05UaFkxQ0ZOVmJrMkZQc09CM0VySlZxYi9JNUtwYVB5S3pMTloxQWMwb2RvNDl1eUVGUXhxOFFDZmVaeER6RVRaOVQxcVd6RG5UY0hxQzlmRnIwak0wbjZPd0ZyUWxPRFN2MmZTVnJWc3JwaE1WSlVOZG55Q0NZMElGTUk5NlEySnc4M2o3UGw0eU9XSzhSZWZMQklaL3d0WHhTSGphVW0rb1o3N1FySldQeFhFNXhVQ3dLMUFlc2JLT1NUZkdPZlBtNlJQbk1nY1Y2ek5VU3d5MnNIaVhhTzB2NFNJTVhPZVFTTkR4SjB0UDRmYWJhcWZGaC9zdGFKQUlDdi9ZNGJ6dDlWeFlwSkZVTzBYWXVUenE1L25rb3UvSEExT3hKTEh2MnZKMjBCN05wNXJQR012QnhYeXhGZ3ZvdER3NlhCK2pGYnMrNStsaU8zTGZRR2VkSXArcmVzckc1N3VqYzNZM2RPc1lmWSsvZXZvTzE3OHZCRW5leUJBTWk1RUFSOWJRZEx1TzBjeW05enpSVnJNc0RUc05nUm01NkcvYlFtQ1k3UVlQRnZzRVczcHdMSkZaOVRrYVdJamh6eEVmdlFXS2NBdS80Y1hqVk5nZnBXU0ZyWFdkQnF2dUFoNG9kWHdnNmZvWFA1UHF3Ryt4b0JuejZ0SVJidE04aU9hU3BPZmZVc2JtT2tuak91SXpwdWZBY3lyZnc1c3NScnl5SkZQUFhzOU13eUdrVHVNODZlVEUrWU5iNXo0NHI4ZnpFZG9UUHlBdjRQVTVYbVYxMjRPZ0NxM2R1TUxuSWJDdG8rOGdGQUZtazFEcXpvM3pvbk95TEJlUm1wYU1lUmNGSnpUNlpQdnVlaTQxblM1N1hHdTNndVkvVFdRQlRLSGVGVjY5dFRaa0greW9taTJ6T2M5dWVIY2JuUXgvMEZ4K08xYS8zVENpMTFNaE9ZR0lIckxIN2JDZXJzdGxESjhkVkoraDZ6T2ZEUFJ3bGtwMDVXbndLVFBJdVRkMWNJN3BYenpQeVQ1bGVObHc2M2dKRzlxQUNsSENQTGZ0UWlzOENoalBQenc0NTYxRWNWcGxmUi9aZTJJbFBuWU9heEF3bjgzZ1pjSWdvQy9UNnlWcURiUFk4bktkZHpXb3Yrc05LQjRQUjgvajRGeTVzK3JBN2EzRjhvcFoxbXltY1pGeDAzTnVwdC9ZeGRQMHRVSDY4OVIxbldwV0hOdXdLTXVXUjBRTUhNNjdydTAvNUtmdnpoVlZPVnQvU041RFVKOFE1VU1hSFBWaHFOTXlVbU9xTHhCK1dtWS8zc1ljSWU3YTJYWTZYZGlpaWJXNDQ2ODlNWkd3YXh2dTVKeU9jeHpqc2JmL1RZMTdmTWp1YkN5Q2J6bW00bXdlYjR6cVJPL2xZWWVodzhyR1B5OVF3Nkg2eXNkc0gxK0syNTdBMjJoWmpoMlV4a3hOOWhBOE1FWmVFK0RwcmJOa3NrYU1QOCswK29jN1JURWZ3TGl2R2lJUmVDbmJoOFlIc3Zwc3ljSnc2RUlzZjVWUFNjNWxXVUxmNllMdm5IR0RZZUswY1JKN0FUeDdpQmN5TDNmUkpJdzQveFBNOUtYMGo3bHJzdXpsbmxsZER5dmlJaGVjMkxZMjVmUEZNQncvTFRyNWdmWVJUaHdnMnhBZTIydGtFNk96aFUrSFdjdjY0bytTMG8yMWZvTW1qZTV4SGU1YndGSityTVFGbHgxaDlCSE1mK3VSakhHQlIrZGVvcWZ2MHo1aVlQWDRNSGprU3gvTnFXR1VqMkcySEREcmdLeE5wWVhIZFpwWGlRNWtMdU9DY3NtYndSUUlhWHl5ejhEUGZlb204NlZjL0k0cnF0YXdmTmVxMFVqMkEzYkk0eDBjMzJibnNRMTdzUUQxUHViS3BHTnN3N3p6MlJiU1lSaFdIbnBxdDRyY3RteVo4RW9BbXhCYjVacnFia0Izbk14NWJhWHdpeE9jakhoM0RpVHBzRnVnQ2xzMnVNcXR3eTdiU0JEbjNzRGg4RWdCUHdQaFRUeVBCNVBuZG5WN0ZFdnYvZVo4eGg3Tjk3Q0tNU0NHZkFGc0pSaDZiblRHcll6cTVQWHVzV1oyQ0dJZlBkNElGL3IzaGtkVzR0a2Q0UG43cmtZR2JxSExlRU84QzZ6QllFMm5FVFpPZ1RqcVJRVHNJQ1hlSzJlZWNkc2M2eExhdVUxV3JCWml0T2dQYmEyMU9GL1NRenZHM1ZreGd1WHRHQjVXZHB5Q2RWdjd1V0NZVFV5THNlQzRIV0ZydFlNdEtkQW9RaXNRSjYrTnpOQ3ZZOFp5Ukt3NDh4UUNoYThnY09LTlpWQ3VLZ2s4cGZYekNRRlhLcnZBNUU5OE8yZXpqQjZyOXZpamY1VE4vRytLMU9QeTZPOG9TVW5JN0dyOURlN0Y4SStEc25tV2o5VDJmeHlpTEhJb0ZnSSs2OEo1NzRTeE8zYTdMNThQNGJKMEEvcjNxcFNSQi9FenhlUnFSZlFJVHhoaUFWcGpGbUQ3Y2JKdTI5Umpma3Ywelh1MDdCeCtPNXhDK2ZXNVdQdW1vZWNvWUVWOEFjcnYyUExOTWtHZndSVlpLVU1TSnN5VWlIakhHMTltSHFUdSszeDZUSHM2elNhQmV3SWZEK29vUGRBNzJISCtWdXh6V0o5bXBCdXQzakh5MnJRekYzQ3JvYW1JZm1MdWRNTUNOUWRSc3IvQTVqNXMzdzJCWnZldk1BU2svbGNTT0xEelBKNFdPTCtOR3NSbHlxRHpmWGoyMUR6NDJPUHRvaWNma2NiU21mSjJ6MjR1bEhvN0U1aXFRaWhha1R4K1RHcERlTXoxQzJVZjR6QjMxNWZOVUxQVzUyK05qcVo5NysxeW5ZQkhVNHlOVG5UUnpwamVpYzMwR2VmbDV4dGdwSC9MSkFzUVk0N3dkYVdDVkE0SldjVFRwTU4zdHdUVC9zbXU3VjgrKytDN3JBRGtFOXg3SENWaHc4bnBnN0lPcEhYWG84eHA5cU9PcC92Rmh5TDRZazM3VTA5RkJremJIM2FnREJ4dXdXdDI0T2thMU5XQWxqMElSRkQ2emFaWUdlWHJpT2NDM1dKL2xyY3VXdSs4ODdheWZydjdoZ2FYajhweStWeUptZDVxSEljMldyampNd0dNZ0tCZlUyTm84eStVcjB2aStjVnVqOCtWNGcyMEJrMCtzdzRZOWh1WENpVUdPVFhmcUdwVFpKeUY1K2o1Zm43c21mOXYyNHpxeC93VDR1dXBWUEhJZ05IZ1c1SUZ1UDdNOXZvUkxmZFZIRDhHSUFmZnNBY1I5R3ZlVEQwQWJCZG1IQTN5UGVlRVhMZEtHbTRyN29aN1BYRWY4QkNKdm5ScXY5eG1OVnQxR0h3NTlocDFqSDhSdEsxVXNpMkZsZllidERENnB3bno3emhIRWM1enpycWRRREJhbWhTenA1NW56WmFzWnZvRTVMZ25rNFpUSnMxdmxmRW5UY1h6ejFKZEVINXhta2lEeUJxOUQ4ckZqYkljRmwvTE94ZldiZzdRbXloSFdEd1NCejc0L2JxZjduR09zNnZVMHdRZk5BUm5Pckx0dDVhaHE2L2M4eFdQZU9UbmNzMFdUZkZZcjNSNHBwek9nVHp6QlJ5NnJuQUNFODh5MEp3MldNcW1uaStOOWJhYXhlOENHZm9tQ3d3THMvZmc4ZXpZVlBCeGtyaXRhZ1dDVGdnY3pQVHZFMzRkdUpwK2ltQjJ3ZFNyMVgydlpBRUZqNkRlQXpXS2F4SWR3UHpBM3Uza2lvdU02RDFKS1g1cWVmTXRLdWRKbGhwdG8ySDFNd1p1ZHR3WEVxdWVjOHd1YXNXT0FyR08rNjdRamkrVytQaDkvKzRxVEZpVzBEaUI2U05LRzAvaHR6MFc0d3BpMlJsODN1NUVTOGdQZHlmWjRQb2lSR2J2aVpibWxOWWFXZkZvbGlMQllwalNmZDNZRjRPdUVGTHVYMXZESnUydlk4dTJENnQvMlpXUUlkdTVVbTN3VkM5VzZjK1J0OGJQWkdtZGp5WjNZeEJyYk1YdGI3dm42Q0hFY3cvUDU2cEFWYktsWk9rQzQ1SXJTOVZrTWRkdVVaOE5Fc04za3RrTjN3YmJsN0dCcFF3QzJuZzArbm9vNDhqaWFyOGRqN0xVQVp2OFBQUGZ2RWE2TzBVNEFBQUdEYVVORFVFbERReUJ3Y205bWFXeGxBQUI0bkgyUlBVakRRQnpGWDFPbG9oVUZPNGc0WktoT0ZrUkZITFVLUmFnUWFvVldIVXd1L1lJbURVbUtpNlBnV25Ed1k3SHE0T0tzcTRPcklBaCtnRGc1T2ltNlNJbi9Td290WWp3NDdzZTdlNCs3ZDRCUUx6UE42aGdITk4wMlU0bTRtTW11aXFGWGhDQ2dIejBJeU13eTVpUXBDZC94ZFk4QVgrOWlQTXYvM0oralY4MVpEQWlJeExQTU1HM2lEZUxwVGR2Z3ZFOGNZVVZaSlQ0bkhqUHBnc1NQWEZjOGZ1TmNjRm5nbVJFem5ab25qaENMaFRaVzJwZ1ZUWTE0aWppcWFqcmxDeG1QVmM1Ym5MVnlsVFh2eVY4WXp1a3J5MXluT1l3RUZyRUVDU0lVVkZGQ0dUWml0T3FrV0VqUmZ0ekhQK1Q2SlhJcDVDcUJrV01CRldpUVhULzRIL3p1MXNwUFRuaEo0VGpRK2VJNEh5TkFhQmRvMUJ6bis5aHhHaWRBOEJtNDBsditTaDJZK1NTOTF0S2lSMERmTm5CeDNkS1VQZUJ5QnhoOE1tUlRkcVVnVFNHZkI5N1A2SnV5d01BdDBMM205ZGJjeCtrRGtLYXVramZBd1NFd1dxRHNkWjkzZDdYMzl1K1pabjgveHJ0eVl2RFJmRzhBQUFBR1lrdEhSQUQvQVA4QS82QzlwNU1BQUFBSmNFaFpjd0FBQ3hNQUFBc1RBUUNhbkJnQUFBQUhkRWxOUlFma0J3SVJFZytzaDBPcUFBQWdBRWxFUVZSNDJ1eGRkM2dVMWQ1K3oyekxwdmVFa0lSaUNDMFFhZ2hkT3FHSU5CRkVVY0VHSW9JRnBQaGh1VjdBY20zWDNwQXJLZ29pSUNBaXZZbDBFa3BDU085bGU1dlptZlA5c1R2RDdHWkRVVVRVL1QzUFBKdmR6Y3llT1hQbW5mZlhDYVVVZnZudFlyUFpVRjVlanVycWF0VFcxa0tuMDBHdjE4TmtNc0ZzTnNOaXNjQm1zOEZtczhIaGNNRGhjSUJsV2JBc0M0N2p3SEVjbkU2bnRQRThMNzN5UEE5QkVPUi9FMEVRSU44b3BlSXJvWlJDM0FBUTcxY0FvSlFTOTlDbFY2L1BTRjVlWGx4VVZGUVRqVVlUcDFBbzRoaUdpV0VZSm9vUUVna2dBa0FvSVNRVVFCQ0FRQUJhQUdyM3BnREF1SThuQU9BQnNPN05Cc0FLd0VJcE5RSXdVa3IxbE5KNlNta2R6L08xSE1kVjJlMzI2b3FLaW9yMDlQUnE5M0dvYkd2d25oRGkvWjM0R1FCUVFraURWOWxHR1lZQklRUU13MEFRQktqVmFqQU1BNFpocUVLaGdFS2hBTU13RVA5V0twWFNxN2lwVkNxb1ZDcW8xV3FvMVdwb05CcG9OQnBvdFZwb3RWb0VCUVVoT0RnWUlTRWhDQThQUjBSRUJLS2pveEViRzR1RWhBUm90VnIvelhRZGhmaUI3YmNKeTdJb0x5OUhaV1VsYW10clVWOWZENzFlRDZQUktBR2ExV3FGM1c2SDNXNi9JcURKd1V5K0NZSkFSSUR6QWpNUElCUEJTUTVTM29BbGYxOWRYWjBhSEJ5Y29sUXFiMkVZcGlVaHBEa2hwQm1BWmdBQ2JwSnB0Z01vcHBRV0NZSlF5UE44QWN1eUYzVTZYWDZ6WnMwdWVBRWN2UXpnTlFCQUVmZ0lJUjVBUnltbFNxVlNCRFlKME9RZ0o5L2s0TllZd0FVRUJDQWdJQUNCZ1lFU3dJV0doaUk4UEJ5UmtaR0lqbzVHZkh3OEVoSVNvRmFyL1RlWEg5aitIQ2twS1VGbFpTVnFhbXBRVjFjSG5VNEhvOUVJazhra0Fack5acnNzb0hFY0o3RXpiMUR6QldZaUt4T0JUYngyUG9ETTQzMWVYbDVzUWtKQ0I1VksxVUdoVUxRbmhMUUgwQmFBNXE5OERYaWVkNVNXbHA1TlNrbzY0M1E2ejloc3RwemMzTnljSGoxNjFMcVpvaHpVQkRkVDgyQjIza0FuQXBzSWFDS2J1eExJaWFDbVVDaWdVcWt1QzNCYXJWWUN1SkNRRUlTR2hpSWlJZ0pSVVZHSWlZbEJmSHc4a3BLUy9EZVpIOWh1bkZSVlZUVlFPdzBHZzZSMnlnSE5icmMzQUxRcnNEUWlxcDFlZ0VZYVlXVU5HTm5FaVJNVkgzMzBVZmVBZ0lCdUNvV2lLeUdrQzREVXYrTzE0SGtlcGFXbGFOYXNtZmRYZVlJZ0hPTTQ3cmpSYUR4Mnh4MTNITnU5ZTdjZ0F6c0o5QWdoZ2plamN3TmJBemJITUF6MUFYQlFLQlQwU3V4TkRuQWlleE1CVGxSUHc4TENHcWluY1hGeC9wdk9EMngvbkJnTUJwU1ZsVWtzelpmYTZjdU94bkVjV0phVkdKb1BPeHFSMjlGOE1EUGl3MTRtc2pMeXhCTlBLSll1WGRwSG85SDBaQmltRnlHa0o0RGdmOEkxdVF5d2VZdVpVbnJJNlhRZU1wbE1oMmZPbkhsb3pabzFUaDlBSjRqQTVnWTA2c011UjcyWm5KZjlqWHJiMzBRR3AxYXJKWUJyelA0bVYwOUY5dGEwYVZPRWhZWDViMEkvc0YwLzRUZ09KU1VsSGl4TnI5ZExMTzFxN0dpK25BTWlvSG14TTBuTmxERXl5SUdNVXNyVTE5ZTNDdzRPdmxXaFVQUWpoUFFIOEk5YzlkY0FiQTJlVTRJZzdPVTRibDlWVmRXKzVzMmJuM09EV3dOV0oyZDBJbnVUL3kwNkdPUWdKd0pjWTg2Rks5bmZSUFlXSGg3dXdkNlNrcEtnVXFuOE42VWYySDZmVkZaV29yUzB0SUZ6UUs1MmlxQW1zalNSb1YwdG9QRThMNm1aZ2lBMENtWldxM1dBV3EwZXpERE1ZQUFkL0ZmbmR3R2J0MlE3bmM0ZFJxTnhWM1IwOUQ2NHZMaUNOOWcxQm5JTXcwanFxa0tob0ZjTGNDS0RFOW1iQ0c1eTlkVGJ1WkNZbUlqNCtIai94ZmNEMjdXTHhXSkJjWEV4eXN2TFVWVlY1ZE01Y0tYd0RTKzFrM2c1QnVUc2pIZ3hOQW5NYkRaYmxscXR6aUtFWkFGbzZyOHlOMFRLZUo3LzBXUXliWStNak55T1MrRXFQa0ZPcHE1NnFLb2lpL1B5b05JcnNUZHY5ZFRidVJBWEY0ZUVoQVFrSnljaktDaklmN1g4d0haMVVsSlNJckUwdVMzTmwzUEEyNWJtZzZWZENkQ0l0ODNNWXJFTTFHZzB0eEZDUnZuQjdLWUF1UzE2dlg1TFRFeU15T1E4UU02YnhjbEFybEdBVXlxVmpRS2NuTDE1T3hlOGJXK0ppWWwrNzZrZjJDNHZKcE1KUlVWRktDc3I4MkJwQm9QQkl5YnRLb05zaWFoNml1cm1aZGdabzlQcDBvS0RnOGN5REhNN2dIYitKWGxUeWxtV1pUZVdsNWR2YnRteTVSa1p3UEV5a0tPeTF3WXNUcTZtdW9HTlhrMXdyenoyVGZTY2l1eXRhZE9tYU5hc0dVSkNRdnhYeUE5c0RWbWE2Q0R3NWZGc0xJUkRCRFZmZ0NiUEVwQURtZ2htbXpadENoZzhlUEJFcFZJNWdSQXl6TDhNL3pvaUNNSTJxOVc2NGEyMzN0cTRhTkVpR3dDbkhPUmtMRTRRMlp1M211b1ZIdUlCY0NLNE5SWWE0dTA1RlIwTGZ2Ym1CellBZ05WcVJVRkJRUU1IZ2NqU3pHYXpaRXU3UXViQTVRQ055TlZPdlY3ZklTZ29hQkxETUpNQStGZmlYL3laeUhIYzJwS1NrdlVwS1Nsblphb3E3NjJxeWdDT1hnbmdMaGZZcTlWcUVSd2NMTEUzYjhkQ2l4WXRFQmdZNkw4eS8xUmdxNmlva0ZUUDZ1cHFEd2ZCbGVMU1pLRG1FOURjQWJVZTZxYlZhczFTcTlXVENTRVQvVXZ1YjhuaTF1bjErclhSMGRFNzNBeE9EbkM4THpWVkZpYlNBT0FhczczNWluc1RWZFBZMkZoSk5XM1NwTWsvL3Bvby8wa255L004OHZQelVWeGNqSXFLQ2lrbHltQXd3R2cwd21LeFNLRG1jRGg4WmcrSWdDYXpvL2tFdEx2dnZsdngwVWNmM2ExVUt1OEcwTWQvKy85OWhXR1ljWkdSa2VONG50OXZzVmkrSGp4NDhOckRodzg3UlpDamxEYndyUEk4VHdWQm9HTGlQYy96VkI0UzVIUTZxVHhjU05RUTVLWVE4YUVyUG9TdFZpdk1aak5NSmhOdXVlVVdLQlNLZnk1akt5d3MvRWVjcU5GbzlBbG9vc2RUcm5aZXpvN21TK1dVc1RPeWFkT21rTmF0VzkrclVDaW13Ujl6OW84VVNtbTJ3K0g0Y3YzNjlXc1dMRmhnSklUd01pYlhRRTJWc1RodkJuZForNXRjUFJVRGU4V2MweVpObWlBNU9SbWhvYUgvVEdEak9PNXZmNUpsWldVb0xDeVV2SjVpQm9HMzZ0bFlHSWVYMmtsa2FVOFNxR1ZuWjBlMGJObnlmb1ZDY1QrQUZQL3Q3UmNBK1hhN2ZkV21UWnUrbmpKbGlzNUxUZVhkNENhcHFPNWdYeXJQUWZWV1QzMkZoWGluWkVWSFIwdGUwK2JObTZOcDAzOWU1TkRmMnNaR0tVVnViaTZLaW9xa2dOdkxlVDI5TXdnYVVUdEZMeWRES1NVblQ1NE1iZHUyN1F5RlFqRUR3QzMrZTlrdlB1U2l6V2I3L0t1dnZ2cHkrdlRwaHNzQkhDRkVrQ1hkZTJjdVVGOFpDNDE1VGNXQTNtYk5taUUxTlJYdWJBay9zUDJWeFdReTRjS0ZDNUw2V1YxZExYazk1UUczamVSNUV1OVVLQzlQSjdOa3lSTEZraVZMSGxRb0ZBL0NIMy9tbDZ0NzBKNjFXcTByNzdqamp0VmJ0bXhoM1FBbnFhZ3lnQlBrSGxUdjFDeVZTa1VieXplVnE2V1JrWkdJalkyVjFOS1VsSlIvVE16YjN4TFlxcXFxa0orZmo1S1NFbFJVVkRRSTVmQk9YcGZiMUx4WW1vZGpRUFJ5MnUzMk8xVXExU01BZXZodlY3LzhCb0E3YkRRYVB3c1BEOTlJQ09HOEFNNmJ3VkZaQmdQMVptL2VNVy9lQWIxaVNFaVRKazJRbEpTRVcyNjU1UjlSRHVsdjV4VXRMQ3pFeFlzWFBlTFQ1TG1lM3NucmNwWW1PZ3JrYXFmTWpzWllyZGFCYXJWNnBqdmx5UzkrK1cxc2dwQ01zTEN3REo3blIxVlhWMy9XcEVtVEEzS0E4L2FpOGp4UDNRSkJFS2hYL1Q3eFBYeDVVVVd6aXVoRnRkdnRzTmxzYU42OHVSL1kvaXIydFBQbnorUGl4WXVOT2drdVU5bTJBVXVUcTUzMTlmV3BvYUdoc3dnaEQvdHZTNzljTDJFWVprUjhmUHdJbG1VL3lzbkorYnh6NTg3NU1vQVR3MFI0QUlJZ0NJTFkzOEs5VVRGbFR3NXUzaUFuT3NDOHdjMXV0Nk4xNjlaL1c3dmIzd0xZYkRZYnpwOC83K0g1bE1lbk5XWlA4MlpwYmxDVDFNNTc3NzFYOGNFSEg4eFdLQlNQQVVqMDM0cCsrU05FcFZMTjZOU3BVNWJGWW5tL2I5KytueDgvZnB3RndMblpHeU9xcUpSU3FSaW0yNEZGNWNVVnZBSE91MXF6SE9CWWxwWEE3ZS9ZU09ZdkQydzZuUTY1dWJrb0xDeVVDa0xLcTNMNEtnYnBmb3JKUVUzTzBoaEtLYkZhclVNMUdzM2pBQWI1YnoyLzNBQnBHaGdZK1B5dnYvNDZvTHE2K3FNbVRacnNKWVN3TXZXVTRGSk9LdlZpY0hLQW83NmFBdmxTVDhVb2dOVFVWRVJFUlBpQjdXYVJxcW9xajNBT01ZbmRWNFZiV1NnSEVlbTVENWJHbEphV3hzZkZ4VDNPTU14Yy83M21sejlCUFIwUUh4OC93T0Z3L0hmSGpoMmZabVZsVmJyVlUwWU9jSzRLNWtSb2pMM0pWRlZjalpxYW1wcjZ0M0lxL0dXQnJhU2tCSGw1ZVNncUtwTENPZVROVlh3NUNieFpHcy96Y3BiRzJPMzJDU3FWYW03cHVlTmR5eDNCeUVodmRWT2RjMzE5UFdwcmE1R2FtdXBIZ0wrQTZQVjZiTnEwQ1E2SEE0TUdEYm9tZzcxYXJaNDFiTml3WG5WMWRlOUhSVVZ0SVlRbzNPb3BKN085RWJuOVRRNXdMTXNTbG1VYnRiMTVNemlPNDFCVFV3T3oyUXdBaUlpSVFPdldyWDgzOFNnb0tBQUF4TWZIWDlYNVYxUlV3T0Z3L0c3bkJ0UG9ONndlbnl4N0VvUDdaeUlqc3o4ZVdmZ3F5a3pPbTJMQjVPZm40OHlaTXg1eGFwZlltZzdGRjg3ZzJKRmZrWjJkZzhMaU1saHNkamdjRGlJQ25EczFpZ2lDd0FpQ29LaXNyRXgyT3AydnFWU3Evd0hvdXZvLzgzRFB3bmR1aW5NOWZQZ3czbnp6VFFEQWtTTkg4TnByci8ycFkvZzl3bkVjQmcwYUJJUEI4S2VONFhyTDJiTm5ZYmZiRzN6dWREb3hZY0lFRkJVVklUQXdFRmFyOVpxUFRRanBIQmtaK1I3THNvdDM3TmpSakZJYVFDblZ3TldZV2tVcFZWQktGWUlnS0FSQllIaWVKMDZuazdBc0M1UEpCS1BSU0VRdnFEeVAxR0F3U0ZXaUt5b3FVRnhjakFzWEx1RFFvVVA0K09PUDhmYmJiLy9tZGZiU1N5L2h6Smt6QUlDQ2dnS3NXN2NPSzFhc3dLcFZxNjVxUFd6WnNzWG4vMTdyZW1nVTJMWjk4Q3hlL0hRM1JrNS9CdiszNEQ3ay9mZ2VIbm4yNHo5OUlaMDdkdzVuejU1RmZuNitSN1Zia2ExVkZlY2h2NlFheXNCUWhBUUhnSE5ZU0gyOW5vaU16YzNVaUNBSUlrc2JGeDBkL1JVaFpPYk4rTlQvOHNzdmtaR1I4YmNZZzBxbHd2dnZ2LytidWk3ZERQUGdTK2JNbVlPU2twSUduK2ZsNVlFUWdrV0xGbUh5NU1sbzE2N2Q3NW0zQi9yMzcvL2ZFeWRPWkFIUXd0VVRWZ1EzcFJ2Z0dCSGMzTDAwQ00vemNEZ2N4RzYzRXhIY0xCWUxUQ1lUVHA0OGlZS0NBdFRVMUVqOVBWaVd4Wmd4WXpCdzRNRGZORTZUeVlUZHUzZWpUWnMyQUlETXpFeXNXTEVDdDkxMjJ3MWZENDBDVzFGUkVVaEVjMHlaTkFZamI3OFhMeTkvRWNPNkpNRUpRRjk0RkhQdm40Q01qRXpjTnZraDdENVhCUUE0dXY1TkRNKzZGM2syQUhEaXhZZEc0dUZsWDdwNStVbE15aHFPZDcvWWlEbFRiMGRtUmlZKzIxM29ZbUNIdnNjOTQ0WWlJNk1YcGo3NkhQSnJIU0p0eE5aUGxtUDBnTDdJN0RzWUR5NTRCYWZQblVOQlFZSFVEcys3SjBGRmVUWEFxQkFhRkFDVldrdlVTZ1dvNEhTQm10TkpPSTVsbkU0bjAyUEFpUEJ2OXAxNVFhVlNmUW1nMjRGdjM4VHcvcjB3OExaN2NMalFKS2V1SG1OWTh1WWFPRzdRVFdNMEduSDI3Rm4wNkhFcER0aHF0V0xldkhubzM3OC9IbnZzTVRnY3J0R1l6V1k4OWRSVEdEcDBLQ1pObW9SVHAwNEJBTDc0NGdzOCt1aWpHREJnQUJZdlhveXNyQ3pNbVROSGJMcU10V3ZYWXVUSWtjakt5dkw1cFBRMWhsOSsrUVhqeDQvSDRNR0RzV1RKRXRoc05nQkFiVzB0WnMrZWpheXNMSXdmUHg2Ly9QS0x0TTlkZDkyRmtTTkhZczZjT1pLNkk4cW5uMzZLNGNPSFk4aVFJWGp0dGRmZ0hUVHVQWWJ2di84ZTc3MzNudlQ5NmRPbnNXREJBb2twTFZ1MkRFT0hEc1hZc1dPbE1aak5aa3lmUGgydnYvNDZoZ3daZ29rVEo2S29xQWdBOE1JTEwyRC8vdjNTOFZhdlhvM1ZxMWRmOXRyczJiTUhFeWRPUkdscEtlYk9uWXVKRXlkaTU4NmRBSUNubjM0YVR6enhCQ29xS2pCeDRrUk1uRGdSTE10ZTluanIxNi9INjYrL2poa3pacUJmdjM1WXVuU3BOQS9MbHkvSHFGR2p1aXhjdVBDRFhidDJ6ZjN3d3crakthVUJBRFNVVWhXbFZDa0lncExuZVViYzNNQkdEQVlEYW10clVWdGJTMncyRzNRNkhVNmZQZzJqMFlqczdHeHMyN1lOUjQ4ZVJXVmxKY3JLeWxCUVVJRGk0bUxVMWRWSnY1K1hsNGQ3N3JrSGdpQkk0NTA5ZXphT0hqM3FjUTRiTjI3RXFGR2p3RERNRmRmMjVkYkR1WFBuTUdIQ0JBd1lNQUNmZnZycEZkZmtoUXNYTUhQbVREend3QVBvMzc4L0ZpNWNDTWgwYzQrdDhzUUc5R2pmRXAxNmpjRFNWOTdCNlJMWGlWTGVnRmtqT3FIN3NHbjRidE42ekpwd0sxcjNtSUFTTzhXdWorZWpSWXMrT0dtbW9KVERJNE5TTUd6Mlc2NzlxdmVoUzRzV2FObTZFMmJNbTQ5Rjg1L0Uzbnd6K0xvVEdOQytKVVkvK0N3MnJGK04wVDNiWXRUanJuMU9yRnVHbGkzYVl2N3JLL0hLMGpsSWlvbEMxclFuTUgvK2ZFeWZQaDNqeG8zRDRNR0RrWm1aaVk0ZE95STFOUlVhQlFGUmFoQVpHVWxDUWtLSVZxc2xhcldhVVNxVkN1S3lLYXBYcmZsMjhPSUhSLy9Zc20wZmVxeWFvNDdTUGJSclNnczY5cUdsZFAzYWxYUll0MVRhZXNUamxGSktUNnhiUmx1MmFFdWZlZXQvZE8ybksyaW5sSlowMmJvVDlFYklxbFdyNk50dnZ5MjkvL0hISDJuLy92MXBXVmtaZFRnYzlNNDc3NlJyMTY2bGxGSzZZTUVDK3E5Ly9Zc0tna0FQSHo1TWUvVG9RYTFXSzMzOTlkZnBmLzd6SDNya3lCRTZkT2hReW5FYzdkV3JGNjJ0cmFVSER4NmtJMGVPcEhxOW51cjFlanBreUJCNjh1VEp5NDVCcDlQUjd0MjcwN05uejFLZTUrbkNoUXZwRzIrOFFTbWw5UDMzMzZlZmYvNDVwWlRTUTRjTzBYNzkra243bVV3bWFqUWFhWHA2T2pVWUROTG41OCtmcC8zNjlhTVdpNFZhTEJZNlpjb1Urc3N2djF4MkREVTFOYlIzNzk2VTR6aEtLYVZMbGl5aGE5YXNvWlJTK3ZycnI5T25uMzZhT3AxT2V2YnNXWnFabVVudGRqczFHQXcwSlNXRkhqaHdnRkpLNllvVksrajgrZk9sZVowNWM2WjAvR0hEaHRIQ3dzS3J1a1pEaGd5aHVibTVEVDQvY2VJRUhUTm16RlZmNjQ4Ly9wamVkdHR0VktmVFViUFpUQWNPSEVoLy9mVlhTaW1sTnB1TkdvMUdPbVBHRFByamp6OVNudWQvS2l3c25BQ2dHWUFtQUtJSUlXRUFnZ0FFTUF5akpvUW9DU0VLdFZyTkJBUUVFQUFrTEN5TXhNZkhJems1R1FFQkFXamV2RGt5TXpNeGVQQmdqQnMzRHRPblQ4ZjgrZlB4MEVNUFllREFnVGgrL0RoWWxnV2xGR1BHak1IT25UdEJLY1c1YytmUXQyOWZPSjFPRDh3WU4yNGN5c3JLR21ESnA1OStpdWVmZjk3ak03ZXFqUFQwZEJnTUJ1bnpqei8rR0dQSGpvWFpiRVpWVlJVeU16T1JuWjN0c2UrcVZhdnc5dHR2Uys5UG56Nk5ybDI3b3F5c0RGYXJGUk1uVG15Y3NjV2xqOGJXcmQvanZxd08yUC9OZXhnemVBZysrZmtjaE9JRDJISFdnSWtQUG8zYlI0N0Jvc2Z1Qmx0OUZMdFAxbDhWQ3huMTZISjgrT295dkxqc1pmUnBHWVNDZzd0UmFHVXdmZDRpakI0ekdXKzgrd0ZtanV2dGVnSjh2d0UwTEFGOHhSbmtGQmtRb0hEaTlQR2pVcHlhZDBpSHpXWURUeWtnOEI2cXA4dnJLVEFVVU14K1k5UERVeWVPWDdsay9zeWhHbnNadHUzT1JmNnZoMURQQitEQnA1L0JtSEgzWUdDWGhFdFBvZTgzQUJGSlNGQVlVV1VMUkdJRWcxMjc5dDBReHJaMjdWcU1HemZPNDdNMmJkb2dJU0VCYXJVYTNicDFRMFZGQlFEZ3A1OSt3b3daTTBBSVFmZnUzWkdjbkl3VEowNEFnRlIxTlNRa0JFcWxFa0ZCUVdCWkZwczNiMGFUSmsyd2R1MWFyRjI3RmpFeE1UaDA2TkJseDNENDhHRjA2TkFCYmRxMEFjTXdXTEJnQWNhUEh3OEFtREZqQmhJU0V2RDIyMjlqNTg2ZHFLbXBrZllUZjk4N0lEUXVMZzRxbFFydnZQTU9UcDgralpVclZ6WlFNYnpIRUIwZGpTNWR1bUQzN3QxZ1dSYTdkKy9HcUZHdVpKQWZmdmdCSVNFaFdMbHlKUTRjT0FDR1lYRCsvSGxwREQxNzlnUUFaR1Jrb0tyS3BXa01IRGdRT1RrNTBPbDBPSG55Sk9MaTRxNUhXNzlybHU3ZHV5TThQQnhCUVVGbzM3NDlLaXNyQVFBQkFRRUlDUW1SNnFzeERETzRXYk5tYjN6enpUZFQzS3BwZ0tpYUFoQlZVd1VBUnN5ZUlZUVF0eU9OMk8xMjhEd1B1OTB1cWFaNnZSNTFkWFZTWUx2UmFFUnViaTVPblRvRnU5Mk9HVE5tNFBQUFB3Y0FmUFhWVjdqbm5uczg2cjNsNXVZaUpDUUVDUWtKVjNXdWphMEhBT2pjdVRPQ2dvSVFHeHVMWWNPR2VURC94dTZMaElRRUpDUWtRS3ZWNHE2Nzdtb00yRmhzVy9NWjloY3llR3p4TW16YnN4ZTNkMURobGRmZWQzbFFBR2cwcnVhdEt2Y3J4L0x1ZlFYSUdHc0RDZmVLbDJFNUJ3QUZOQnFYZzdaRmVoOWs5ZTNzb3B3bUN6aWJIaGZPbjBkaFlSSENrMUlSRzZLOFhQY29Ra0VJcFlKVU84M3A1QmllNTVuaXZPMEp2VnEyZUMxQXEzMERRSUpTbzRZQ0FNZXo0Snc4QUFXVW1vWk9ZcnZORGlYRG82YXlFcFdWMWVpU05RVlp2ZHJlRUZ0aWVIajRaYXVoTWd3anFRc2N4MEdqMFVqZmFiWGFLNm8vTnBzTm9hR2gwaloyN0ZqMDZkUG5zbVBnT0E1cXRWcDZIeElTSXBYRmVlMjExN0IrL1hyMDZORURJMGFNdUtyekRBc0x3OGFORzVHYW1vcHZ2dmtHdzRZTlExbFoyUlhuWWVyVXFmajIyMit4ZmZ0MkRCbzBTQW95dGRsc2lJeU1sTTVwN3R5NVB1ZFFQbmRLcFJMang0L0g5OTkvajNYcjF1R3V1Kzc2MDIxM2hCQmNJWTg3UWExV3Z6Uno1c3huTm0zYWxDaXFwaktBRTRHTmNkdVRJUWdDY1FmbkVrRVFpTVBoOEhBcTZQVjY2ZDZ5V0N3b0xDeVV3SzF2Mzc3SXo4L0h1WFBuc0czYk5reWFOTWxqTUd2V3JNR0VDUk91K3p5bzFXcklTNnRkelgyaDBXZ2FBellsanYrNEVrOHRlQlo3VCthanRMUVFlclByeGxFMDY0Wk8wU3I4c081L0tDd3R4YW92TndDQkxkR3RZd3ppWStJQTFPR1hnOW5JUDdrTEY2cjVLdzY4WlpjTVJDaFliUHBtSGNwSzgvRFl1RXowdnVkRm1Fd21ORW0rQlpiYUtnaWg4YmlsWlRNb0JSWUJha1dET0RWM3hWdkNzaXdVaEFCVUlDekxFWjduR1VHZ3pOQ0hYKzNYcEhubWg1bnR3MmJ1MnJnRzU0cEw4ZTJxTmJDUUVHUjBhWTFiT25SRUlDeFl2Mm9kQ3M4ZnhjbThPbWw4ZlhyM0JLZlhJU0VqQ3c4L09BMXQ0c09Ra2RIbEQxL1lhOWFzd1IxMzNIRk5UL3N0VzdaSWJ2YnM3R3gwN05qeGl2dFVWVlZoekpneG1EQmhBbHEzYnUyeFlIeU5vWFBuempoNjlDajBlcjMwUHg5ODhJSGt0UjAzYmh5NmQrOHVxUWxYa2wyN2R1SGxsMS9HYmJmZGhsZGVlUVZ0MjdiRndZTUhyemdQM2J0M1IybHBLVmF1WElrcFU2WkluMmRrWklCbFdVeVlNQUVUSmt4QVFrTENWUVdmVHBvMENldlhyOGZodzRldnlYaXUxV3BSVjFmM3A0QmZlbm82amg0OU9xTlhyMTR2RlJRVTlQRGxXQUNnRUFTQkVkbWI2RFdsbE1LWFUwSE0xckhaYkZJSi9ieThQSnc5ZXhhVEprM0NvNDgraXFGRGgzcFVDZUU0RHJ0MjdjTFFvVU92eTNrVkZoYUNVZ3FIdzRIZHUzZWpRNGNPVjF3UE9wMU9zamYvOU5OUGpjV3hNWGpzcGYraWV2NUN6QmczQkJ3Rm9sdDJ3Y3N2ejRGUzNRVExYdjhYWnM1N0hnUDdyWUk2ckNtZWVlVnRwSVVDR0h3blJxVjlnK1VQMzRaUFcvZERpNlpoMEYzaEpEVEovZkhLMGdmeDFMOFhvZSs3SEtLYWQ4VnpDNmZnOU9uVGlPNDRCSm10TCtEbmJ6NEQ2K1NoMElhZ1pZb0dBWEI2eDZoSjhXbFFLQWdSQkNJSVBBSEFESjc0eU5UWC8rL2had2pScGl4NCtYVVVQVElQSTI3dEIwVkFCTzViK2hxR3R0SUNHSW9sRHc3QnN4OCtqUjlYeDZKOXdxV3FvOE1mZmg2UGx6NkJOeDZmZ3VVOEVOMnFLMTdxUHhsQStCKzJZRm1XeFo0OWV5U0QrTlhJMHFWTE1YUG1UR3phdEFrVkZSVll1blRwRlcvbzhlUEg0L1RwMDhqS3lrSk1UQXdVQ29YazVtOXNEQWtKQ1pnN2R5NG1USmlBbUpnWUFKRGM3ak5tek1EQ2hRc1JHeHVMMk5oWUNJSUFnOEdBc0xBd2pCczNEdlgxOVRDWlRCZzFhaFNDZ29Ld1pjc1daR1ptWXZYcTFSZ3pab3pyd2FsUVNEZkk1ZWFCRUlLSkV5ZGl5NVl0U0VtNVZOZHo0Y0tGZVBUUlJ6RjI3RmhRU3RHdVhidXI4cWFLUFFOYXRXb0ZwZkxxd3p1blRwMktPWFBtb0huejVoZzllalNtVHAxNjNkZkQ4ODgvangwN2RxQzJ0aGJIamgzRFN5KzloUGZmZngrdFc3ZkcxS2xUTVdyVXFJRnhjWEhOQmcwYTlOYlBQLys4MFoyR0phL3N6QU1BcFZSd3gyNUNvVkJRa1JDbzFXb2FIeDhQczltTVU2ZE9TV3p4czg4K1EvdjI3VEZ5NUVnSWdvQTJiZHFndUxnWTk5NTdyOGY0ZnY3NVovVHQyOWVEeVFQQWhnMGI4TnBycjhGa01zSHBkT0xubjMvR0k0ODhna21USmpXNkhrU1FHanQyTFBSNlBYcjA2Q0daRHk2M0hod09CKzY5OTE0cDlPYUtaWXRZaHdsV0I0UHdVSy9PMDRJVDlYbzlna09qb2ZaWUJ3TDA5WG9FUjBaZVUvU3Z3RHFnTjlzQUJqaWJrK01SemxGZFhZWGFlaDBjTmx1RGJBSTVxTW15Q0pocGQwOVZMUC9QZnhkRWh3Y3Rna2Nnc210ODJ1QndhTlNlaE5WbTBRUEtZR2g5cUtTc3d3S2pqVWQwK0I5ZmF2bnMyYk00Y3VRSTdyNzc3bXZldDY2dURxR2hvVkNwVkZlOWo4MW1BOGR4SG1Xa3J6UUdsbVZoTnBzUkdSblpZSUhaYkRhRWgxOGI4SnRNSmhCQ0VCd2NmRjNtd1dBd1FLMVcvKzQ4eUNsVHBqU0l1OXU0Y2FPSDUwL3NrWEdsY3k0dUxzWWpqenppOFZuNzl1MnhZc1dLM3p5K21wb2FhTFZhTUF5RGYvM3JYODdFeE1UWDNudnZ2WTlPblRwbGQ2ZGtjZTdONmE3ekpoQkNCSGtoUzQxR0E3VmFUY1hhYm1McEk3Rm9aVlJVRk9MajQyRTBHcEdUazROVnExWjVuT3VubjM2S1BuMzZvRldyNnhmUUxpYnJ5ME5CR2xzUDJkblpXTGh3SWI3Nzdqdm85WHBFUmtiZVhQWFlkRG9kY3J4QVRYUVNpTTFXNU4yalpLQW1yNXZHVkZaV0prVkZSVDFEQ0prQnYvamxieXFDSU9EdXUrOUcwNlpOd2ZNOFRwMDZoYSsvL2hvaElTRXJkK3pZOGVIdzRjTkxDU0VPTDNEanZjQk5LajB1Z3B1OEc1WUlicVdscFNnb0tNQ3NXYlBRcDA4ZnRHL2YvcWJKTHhXQmJjT0dEWmNZL2MwQ2JISlFLeWtwOFFBMWVjTVZIMHhOVEkxaUJFRWdKcE9wbTFhclhlaXZtZWFYZndxNFpXZG53MjYzSXowOVhYSWc4VHkvSlRjMzk3MTI3ZHFkQnVDUXNUZW51N2tNNys2eElJaU5ZK1RnSnBZY0Y3MlhZZzIzbEpRVXFXRGx6UUp1VnFzVmhZV0ZIa0hRTndXdzZmVjZaR2RuK3dRMWthbjVVajlsV1FTRVVzclliTFpoYXJWNkVmeVZiZjNpRjFCS0Q1ZVhsNytUbUppNDF3dmNPRGU0U2N6TlhYNjhBYmcxcHBhSzRKYVdsbmJOWm9jYklYOTZFcnpCWVBESjFIUTZuYzhLSFY3cXB3UnFEb2Rqc2xLcFhBU2dsWDlKKzhVdnJrcTlDUWtKa2JXMXRXOUZSMGR2cHBReXhCVTRSaWlsSE54T0JjR2RVdUFtT1JRdXh3UDFBWlMrZmdOcGFXbS9LUzNxYnd0c0pwUEpwMDFOQkxYTHFaOXlVR05aOW1HRlFyRVlRSXgvT2Z2Rkx4N0FreElWRmJWWXI5Y0hoNGVIZitNdWQwUzhOVFlSM0p4T3AwOXdhd3pVeEsxRGh3NDNWYU1ZNXMvNllZdkYwcWlqd0VjVFk5SVlxSEVjOTVSQ29WanVCN1hHN1EvMzNYZmZUVFdtd3NKQy9OVWFkYi84OHN2bzNiczNoZzRkS3FVYVRaNDhHWk1uVDhiMDZkT3YrKy90Mzc4ZjE3SG5iMHhZV05nU3M5bDhMd0N0TEpoWG5xa2daU2s0blU3aXJscEpSN1FBQUNBQVNVUkJWTk1tSmREYmJEYVBRTjY2dWpvcGVUNC9QeDg1T1Rtd1dDdzRlL2FzbE5IaExmUG16Wk15WlJxVHpaczNTeGtPZnpsZ3M5dnQxK0w5SlBJT1VxSk43WjEzM2xGeEhQY3N3ekF2d3BWUzRoY2Z3dk04amh3NWNsT042Y1VYWDRURllwSGVHNDFHeko0OSs2YWR3NU1uVDJMTGxpMzQ2YWVmc0czYk5uVHExQWtxbFFxdnZQSUtubnZ1dWVzK3Z6VTFOVmkrZlBrMWhlejRrb3NYTCtLNTU1NFQzd1lFQlFVdHJLeXNmRWlqMFFRMUFtNEtRUkNJdlB5UnU5S3VCRzRXaXdWR283RlJjSHZpaVNjOFVxM2tjdXJVS2FsZ1FtTlNXVmtwRlNmNFM2bWlITWRkMXZ2cFpWTVRjejRoTDhmeTY2Ky9CcWVucHk5aUdPYkp2eU1ZSFRod0FNMmJOOGYrL2ZzUkZ4ZUh2bjM3U2psMVpyTVoyN2R2QndEMDZkTUgwZEhSMG43bDVlWFl0MjhmSWlNak1YRGdRSjlWRms2ZE9nV05SaU1WRWF5dHJjWE9uVHNSR0JpSWZ2MzZlYWdUUjQ4ZVJWNWVIdnIxNjRmYzNGemNldXV0a2xxeWI5OCtsSmVYbzNmdjNraE12TlFPb3F5c0RQdjI3VU5vYUNnR0Roem9rZVlGdUxJaWFtcHEwTDU5ZXdCQVRrNE96cDQ5aTkyN2QyUGJ0bTBBZ0w1OSswcnhaOFhGeFRodzRBQ1NrNVBScTFjdkNRZ3ZYTGlBbUpnWTdOKy9INm1wcWVqU3Bjc1Z4MEFweGQ2OWUxRlJVWUdlUFhzaU9UbFoyaWNuSndkUlVWRW9MUzFGYm00dSt2WHJoOFRFUk96Y3VST0hEaDFDUkVRRTl1M2JCN1ZhTGMxRDA2Wk5ZVEtaR21XbGh3NGRRbEpTRW5yMTZnVkNDSTRkTzRiVTFGUm90VnFjUG4wYW5UcDF3b1VMRnhBWUdPaVJZN2x1M1RxTUhUdjJpdXZoK1BIamlJNk9SbEpTRWdCSWViT0RCZzNDc1dQSGNQVG9VZXphdFVzS2NCMDZkQ2kwV3UzYzFxMWJxNGNORy9iUnl5Ky9ySGVybEtMZHplbFdTM2wzcVh4UkxZWEQ0U0NDSUZDajBRaTFXbzNFeEVRUFZaUVFncEtTRWdRRUJIalkyOFRyNTZ0czA5R2pSNUdibTR0dTNicDV4TUFKZ29BZE8zYWd2cjRlUTRZTWtZNzN5eSsvb0UyYk5nZ0xDd1BMc2podzRJQjBMZXgyTzdadDJ3YWxVb2wyN2RyZFdNWkdLZlVBTlhreXUzZlRGVmx2QWc5UU8zLytmRVI2ZXZyU3Z5dW9BYTR5T2s4KytTVDBlajJXTFZzbVpRUG9kRHJjZHR0dEtDMHRSV0ZoSVVhUEhvM2EybG9Bd0xGanh6QnAwaVRvOVhwczNyd1pEenp3UUlQamJ0bXlCZlBuejVmQThPTEZpNWc0Y2FLVS9EMW16QmdwTFdYMTZ0VjQrdW1uWVRRYXNXalJJano5OU5NZUtzWFhYMzhObzlHSUtWT21JRHM3R3dCdy9QaHgzSDMzM1RBYWpkaTVjeWNtVDU3Y3dEYXpidDA2andUbXVybzZsSmFXUWhBRUZCVVZvYWlvU0xUellPZk9uWGpnZ1FkZ3NWanc3cnZ2U29Hc3BhV2xtRFZyRnQ1NDR3M29kRHJNbWpVTHUzYnR1dUlZNXMyYmh5KysrQUlta3dsVHAwNzFLRlcwYXRVcVRKOCtIZSsrK3k1eWNuSlFYKzhxNmxCU1VvS2FtaHJZYkRZVUZSV2h0TFQwaXRkdjU4NmR1TysrKzJDeFdQRFJSeDlKa2ZJYk4yN0VrU05IY1Bic1dUenh4Qk1BZ1BmZmY5OURQYU9VNHZ2dnY4ZnR0OTkreGZWdy92eDVQUC84ODlML2JkMjZGWjkvL2prWWhrRjFkVFVxS3l2QnNxdzByNkt3TER2TDRYQThQSEhpeEdnQVl2RktGUUNsSUFnS0FBcEtLV0ZaVmxKTFRTWVRxcXFxWUxGWVVGMWRqWnljSEEvbVZsVlZoYTFidDZKZHUzYkl5Y2tCcFJSbnpwekIrUEhqVVYxZGpjOC8vOXhqN2w1OTlWVzgvdnJyc0ZxdGVPU1JSN0JqeHc3cHV3MGJOdURvMGFNNGZmbzB4b3daSTdINzVjdVhTeVlNbzlHSUo1OThVZ0xDcVZPbll2djI3Y2pQejNkbGZ6Uld0dWlQMkU2ZlBvMXZ2LzBXcjd6eUN1Yk5tNGVwVTZkaTVNaVI2Tk9uRHpwMTZvVFUxRlFrSlNVaE5qWVc0ZUhoSkNnb2lHZzBHa2FwVkNvVUNvV3lzTEF3VGhDRU4rbmZYSVlQSDA2enM3TXBwWlNXbHBiU0RoMDZVS2ZUU1d0cmErbXhZOGNvcFpTeUxFdG56SmhCdDJ6WlFpbWw5UDc3NzZlYk5tMmk3dExRZE1HQ0JWU24wMUdqMFVqVDB0TG8xcTFiNlpBaFEyaFZWWlgwTzZXbHBmVE1tVFBTOGJLeXN1anAwNmNwcFpUMjc5OWZHa041ZVRudDNyMDdwWlRTNDhlUDB4RWpSbEJYTldwS3Yvbm1HL3JVVTA5UlNpbjk5Tk5QNmV6WnM2blQ2WlMrczlsczB1OEpna0N6c3JLb1RxZnpPTithbWhyYXRXdlhCdk13ZVBCZ2FRd1dpNFYyN3R5Wk9od09tcE9UUXdjTkdpU040WU1QUHFEUFBmZmNaY2R3NXN3WmV1dXR0MUt4UitldVhidm8rUEhqcGQrYVAzOCtmZjc1NTMxZWowMmJOdEZaczJiNS9NNW9OTktPSFR0NmZEWnExQ2g2K1BCaFNpbWxITWZSbmoxNzB2ejhmUHJkZDkvUmQ5NTVoMzc0NFlkMDRNQ0J0TEt5a280ZE85WmpqbzRjT2RMZ3R4cGJEM2E3bldaa1pORGk0bUpLS2FWMzNua24zYkZqeDJWTEp4a01CcHFXbGtZNWpxTjJ1LzJEMmJOblp3Qm9BU0FCUUJTQVVFSklJTU13R2dCS2htRVVHbzJHSVlTUXdNQkFFaHNiaTRTRUJEQU1nMDZkT3FGUG56NFlPWElrSmsrZWpDWk5tbURGaWhYNDl0dHZwUnA1SDMvOHNYVC85K3ZYRC9uNSthaXNyRVJHUmdic2Rqc29wVGg0OENDbVRKa2lsUzFhdEdpUnRNLzA2ZE94ZnYxNlVFb3hkdXhZbkRoeEFwUlMxTlRVb0d2WHJxQ1U0cGRmZnNHSUVTTWdzc3kzM25ycnhxbWk1ODZkdzRVTEZ5VDFVOTd6VTdTcE5SSjhLekcxNU9Ua1JZU1EyZmdIaUppdjJMUnBVekFNQTZQUmlKQ1FFS3hldlJvclZxeEFhR2dvY25KeXBDZDdZV0docEY0U1F2RHZmLzhiZ012emJMZmJNWC8rZlBUczJWUEs3d1JjcFdPZWYvNTVXQ3dXQkFjSG82S2lBanpQUzZ4SVBKN2MxcE9ibTR2eThuS01IRGxTc3VHMWJldXFkako1OG1RVUZSVmgyTEJoU0UxTnhiUnAweEFRY01uOGVlVElFYVNrcEZ4VjNCUFA4OGpQejhkVFR6M2xNVjR4K1Y2cjFVcnFlWEJ3c0ZUSnBMRXhGQlFVb0czYnRwSjZucGFXSnRYakYrVjZwUVJkdkhoUlVyMlVTaVhhdEdtRHdzSkNwS2VuWStmT25YQTRISmc2ZFNvT0hqd0lwVkxwTVVlTkpYbjdXZzhSRVJHWU9uVXFWcTFhaGNtVEo2T21wZ2I5Ky9lL3FyWGwzaDRZTjI0Yzl1N2QrOEdKRXlmcXZiVXJkODRvTCthWDhqeFBXWllWKy8vQlpyTkphbWg1ZVRsaVkyTlJYVjBObFVvRmhVS0IwNmRQUytXazVPc29QejhmRm90RlVyY0ZRZkJZRTNMelJXcHFxa2UxRjE5U1ZsYm0wU05WcFZMZEdHREx6OC8zQ1dvK0tuUTBDT2tRYldvdFdyVDR4NENhWEl4R0kxaVdSWEJ3TUxaczJRS2owWWd2djNSVkpYNzAwVWVsLzR1T2prWkZSWVdVRUw1bnp4NTA3OTdkNVNGaUdHemV2Qm56NXMzRGUrKzlKK1Vycmw2OUdvbUppVml5WkFrQWVLZy9VVkZScUt5czlMQ2ZpWiszYmR2V1o0WFp2THc4UFB6d3czajIyV2R4N05neFBQamdnOWkyYlJ1aW9xSXVlOU1TUWp5cXN3S0FRcUZBZUhnNFB2endRNmtza2lpaSt1MUxHaHREVEV5TXh3MVNWbGJtQWZMWFU4VGZFcHZ1aUwvVnZIbHpWRlpXSWpBd0VJTUdEY0xpeFlzOUdxWllMQlljUDM1Y2VpaGRhVDBBcmlUOEVTTkdnR1ZaVEpzMnpjT3U2bXRldlVXdFZqL1FwazBiWWRTb1VlKy8rT0tMYUF6Y1JBRGlPRTRLQlJFZEFZUVFYTHg0RWQyNmRVTnRiUzBVQ29Ya1FEaCsvRGg2OSs0dEhVOWNROUhSMGRpMGFaTlBPN0I4ek9YbDVjak16QlRIS2ozQTVDYU9xS2lvQnVyOEh3NXNKU1VsVXRNVmI2Ym1iVlB6RmRMeHpqdnZxTnlPZ2puL0pFQjc3NzMzTUdYS0ZLeGF0UW9qUm95QVNxVkNiR3lzVkErcnVMZ1l1M2J0a2tyc1RKczJUZktrNWVibTRxdXZ2c0tHRFJ2Z2REcWhWcXVSa0pDQXQ5NTZDN2ZmZmp2YXRXdUgvdjM3SXlZbUJsdTNic1dPSFR0dzRzUUpuRGx6UnJLeFRabzBDUXNYTHNTRER6N29rWVBYdDI5ZnZQTEtLM2oxMVZmUnYzOS83Tml4QTBsSlNaZzhlVEtPSERtQ2JkdTJZYzZjT2FpcHFZRmFyWmFldm1MbGlPWExsemM0MS9Ed2NDZ1VDbnoxMVZkbzBxUUoyclZyaDVpWUdEend3QU9ZTTJjTzVzMmJoN3E2T216WnNnWC8vZTkvTHp0dmpZMmhhOWV1SUlUZzdiZmZSa1pHQnBZdFc5YWdTc1cxZXBzM2JOZ0F1OTBPanVQdzNYZmZJVFEwRklNR0RjTDk5OStQSlV1VzRNa25uOFRldlhzUkZoYUd0TFEwRUVJUUdCaUl0bTNiSWprNUdVVkZSUjc5QURadjNvemh3NGY3dk5sOXJRZkExVTFxOE9EQjJMQmhBL2J0OHl5QW1wU1VoT0xpWXZ6d3d3OElDQWlRQU1KYkZBckZRd3NYTG5UdTNMbnovZjM3OXpld2k3cmY4NElnU0hGdWxGTGljRGdvSVFUeXB1TjZ2VjRDdHRUVVZMejc3cnVJakl5RXpXWkRjWEV4QUtCMTY5Wm8zcnc1RmkxYWhQSGp4K1BZc1dPd1dDeVlPM2V1TkE5ZHUzYUZ5V1RDL3YzN3NYanhZZ0JBMTY1ZDhmbm5uOFBoY09DSEgzNlF4cGVabVluLys3Ly93M3Z2dllkV3JWcGh6Wm8xVUN4ZHV2UVB1em1ycXFwd3p0MmpRTjdNMkdBd2VCU0k5RTZUa3NlcHJWKy9mZ25ETUF2K1NhRDJ4UmRmWU5Tb1VUaDQ4Q0JhdEdpQnVYUG5RcVZTSVRFeEVZbUppZGkzYngvaTQrTXhZY0lFUkVWRklURXhFYTFhdFVKU1VwS3JGcFZTaVJkZWVFSHlMQ29VQ25UdjNoMUJRVUhvMGFNSHpwdzVnL1QwZExScjF3NHFsUXFIRGgxQ1dsb2FoZzRkaW9TRUJNVEV4Q0FqSXdOV3F4VkhqaHhCdDI3ZGNPalFJVXlmUGgwS2hRSzMzWFliY25OemNmVG9VYlJwMHdZVEprd0F3ekJJVDA5SFVGQVFkdTdjQ1l2RmdzV0xGMHU5S3RldFc0Y21UWnBJSGpxNU1BeURYcjE2WWQrK2ZhaW9xRUJhV2hwQ1EwT2xpcktpK2pacjFpeUpxUVFHQm5yVTZZcUxpME9MRmkwYUhRTWhCQ05IamtSMmRqYU9IeitPaVJNbk5tZ3kwckpsUzhUR3h2cThKbEZSVVEwOGQ5dTNiNGZGWWtHM2J0MWdNQmpnZERxUm5wNk85UFIwaElXRllmdjI3WWlLaXNLenp6NHJsZlNKaUloQXQyN2RFQjBkamVqb2FHUm1aa3FlNk9lZWV3NlBQLzU0Z3lqK3h0YURuRHcwYjk0Y0F3WU04TmhQcTlXaVk4ZU8yTE5uRDNRNkhUcDE2b1NBZ0FBb0ZBcDA2OVpOK3Ird3NEQjA3Tmd4NDg0Nzc3Uy85TkpMcDJXTVQwUTRLcXFjY2lhblZDcUo2TlFLQ1FueHFLUkNLVVZrWkNTYU5XdUdFeWRPSUNrcENWbFpXVWhMUzROV3EwVldWaGFxcTZ0eDhPQkJ4TWJHNHQ1Nzc1WFU3ZDY5ZXlNdkx3OWxaV1Y0OXRsbkplOTF0MjdkVUZwYWlweWNIRXlhTkFteHNiSG8ycldyVk9ycThPSERxS3FxUW54OC9CK1hLNnJUNlpDZG5lM0Ixcnl6Q3J6RE91UnhhbUx3clR0T3pTOSs4Y3NORUxQWi9PK1FrSkQvQWJDNUs0TTRBTENRVlFZUmMwdVZTaVYxTTJJcTVwV0tTZk1SRVJGU1htbHljakpTVWxLUWxwWjJ3NUxtL3hCVjFHYXpTUjNhS3lvcVVGdGJLN1hIdTV6NnlmTTg1R2xTRE1NczlpODF2L2pseGtsd2NQQmNuVTVuallpSVdPZG1aaFR1V0RhdjlDdnFJblhFbGFORkNHVVlCZ3pEZ0JBQzhXK2xVZ21WU2dWM2NqMDZkdXo0dTJ2ay9TbkFSaW5GK2ZQblVWaFk2S0YreXF0MGlCNVFlWkZJdDZ1V0VSUGEzYm1mL293Q3Yvamx4a3BBZUhqNFkxVlZWWmE0dUxpdDFKVmM2bTF2Zzd1SGd1QjBPa1hQcUFoeUlJUklkalp4RXdGT285RWdQVDNkWnhPWG14clk1S0FtTmpJV0hRVVdpK1d5bFc4RlFTQTJtMjJZdTBxSFAvZlRMMzc1Y3lRbUppWm1aa0ZCZ2JGRml4WUh2SmdiQlVBRlFSQzlvNUFCR2hHTFY0cWJITlJFWUFzSUNKQ2FLdjhsZ0syd3NCQVhMMTVFV1ZtWlQwZUIzVzV2a0ZVZ0MrdGdUQ1pUTjNjOU5YL3BJYi80NVU4VVFraEtjbkx5UThlUEg5ZDM3dHc1eDgzY1JKV1VpbjBSUk5ZR21ZTkJWRVc5R1p0U3FZUmFyWVphclpiNm12NVJjdDI4b2xWVlZaSmRyYnk4M0tkZHJURVBxRmpPT3pRMDlDVkN5RUQvc3ZLTFgyNEtjR3NhRXhNVDJxbFRwOU5mZi8yMXpRMWVrcWNVUG1xMnVWVlM4Vy81NTVCL0xvYSt5SHRjWEZmR2RqMWFoNW5OWnB3NWMwWmlhMklPcUhlYlBJZkQ0ZUVCRmRYUHUrNjZTd0hnbWZyNmVuODViNy80NWVhUzRabVptVFVwS1NtdlhiaHdRWkF4TjFmNmdmc1A5eXZjV1FuRW5VSUgrZVowT3FYTlhUVUU3ZHExKzBQQVRmbDdhejVSU3BHWGw0Zmk0bUpVVkZRMHNLczFWdExiN1N3Z0FKaGx5NVl0Y0RxZE42VHhpdGhUMGJ2cXhKWEVZckVnTUZBTFFoai9VdmZMUDQyNTNiMTE2OWJxbEpTVXo5MDRKc2pCalJBUnh3VEs4enpoT0k2NmFSc1Z2YVJ5RmRYYlk5cStmZnZyN2t4UUJnVUYvcTRENU9YbG9iYTJCbnE5RG1hekNWYXJCWGE3cEhMS0tuUTRpUmlkTFBlQTF0YldUSFU3QzI2SThMd1RUaWVQYXoxdm5VNkh5TWlJYStvNWFUQVlFUklTN0RPUzNDOSsrU3RKVUZEZ25QejhDNVczM0pLeUZZQTNjNVArVHhBRWdlZDVPSjFPS0JRTTRUaU9LcFZLaWFIWjdUWllyUmFZelNibzlUclUxdGFnb3FMOHVyYnVBd0RsdGR5bzNsSldWb2F5c25KVVY5ZWd2bDRIZzhFSXM3bEJqd0kzdUVtZ1J0eFVsZFRXMXZRTkNBaDRCamV3THB6cmFTSGd0NXkzYUFDOVdqR1pUQWdMQzhYdm1XTy8rT1VtRVdWOGZQekR4NDhmcSt6Y3Vjc3hYOHpOL1VvRVFRRFA4NVRqbkdBWXppdmtRd21WU2cyMVdnT05KZ0JhYlNDQ2dvSVJHaHJhSUNmNGR3MjJzV3FYVjVMUzhqSWNQM3NCT25kR2djRndLYW5kYkxiQWJMV0J2UVJzSWxzanZDQVFLbENtcUtnd0lTZ29hRDZBbEJ0THF4a3B6dVphVlc1NWN1OGZ0YzhmSWZwamU2Qm9sb0dRcUJzVEZrZzVPNncxOVZCR1JFT2pWUU53b21Mckp0aHNnS3BwR3lSbHRQbGIzT20vWlY1dGhUbXdPS01SblJMWHlIL1lVYlhqTUNKdjdRZVZtK2c3aWs2ajdGZytBSUxZUWFNUkhNcGN4N0ZFSURvbDRXcDN1YVYxNjliM3IxeTVzbnphdEdubEFNUkFYZkdWaXA1U251ZmhEdHFWUWtBdWVVY3Q3dEFQdGJzVGxoYkJ3VUVJQ3d1N3BxWXdqdEpjR0l4YXhMWkxhbkJPeW10V2s2Z1ZpejdZZ1AxRjVTQjFaU2l2cVVmWHVGQW9MU1pZTEdhVWxKV2hzTjRNd3RrZ0NFQ0lFc1RwZE1MSmNjVEJPUW5nc3F1OWsydCsrcm40K0NIa1QxaVFsT0thMVVNeFArNWE5dnN0Ky93UlV2TFpjZ1JOL2d4aHZRUC84TitxMi9ZWkRyL3lKYlROV3NCUlZvQm04OTlGbS81SlVBVUV3bkp1Tjg0ZHFFS3p6SFovQzJEN0xmTnFPTEFHaGZwTXhLYU9iSXpuSS8rOXp4RFk5MVpvM0VTZlVXcWcxZ2JnNHRzdlFKMStHMExERzY2bnl1OC9Sc0R0YVFpTDhSeEx3ZnRMb2V6MUdKSTZSRGJZeDN6aVI1UVlPaU0yTmZGYU5KNEI0OGFOSzV3MmJkcGJNdFlteUZnYjRJcHpnMXNscFF6REVJV0NvUTZIQWtxbGF4TXpFZFRxUzIzK2dvT0QwYkZqeDZzbUFwYmptM0gyVkJMaTA1bzFPS2RyQnphbzBUK3REWG8yRFVGaG9ScTc5cFppN3prZHVrY29ZTmJYNFdLZEZZbmhnZUR0UUVWMUhURXJsVkFJVG5DdUNHVkNBTVpTbS8vUXlEZjJ6TXpKVEVYSEc1eGJJRGRpL2pZMWx2bkQ5d0VFVURCdzZxdkEwU0FFUm5oNmpTZ0VFREN3VjVWRDBJUWpNUHpTWXJaWGxZSlhoaUlvS3ZUU0Rxd2RvQVRPdW1vSW1qQUVoSHFtdERpTmRiQVpIUWlNaTRkQzlkdEJtQy9kai8yTFY2TEgybzFvMGl3VUVHeXcxbk5nR0EzaUI0OUFNRk9PL0FLTGova1E0S2lwQnNjcEVKUVFBOCtISFE5YmVRVUVWVEFDWThJOXZxTU9LOHhWdGRERXhFR3QxZHhrOCtyN25BalBnVG9GVUtzQk5nc1FIQmZoT1Q1bkRQcCsreG1JYkk2MHpkcWhlYk4ycVB4b0NZQ0dhNWM2bldqLzNDb1FaY1BQemFjT1FObHFPb2dRRGlpVjBqaW80RVQ4N2ZNUUwvdnMwakE0V01zcndFVEdJU0JRMDJDdDhFYkhmVlVWVllWeFRlTFdBK0I5cWFTQ0lBaUVFT3AwT3NFd0JBNGJKWVF3MUtYQktLRlV1dE9zVkdvRWFOUlFPT3pRS0xVSURRMTEyOXNFMkNyTFFRTWlQYTREQUhDNktuQWtCRVRnUUoyOE5CL3ljMUplcXplaW9xSWVhazZQa3FwSzFOWFZnemhaMk13bVdOUXExT29NSUFvQ2NDNjdtb0pRY0N3TEVFcW9xNlk2c1ZoTS9aVE91dmtjbzBTd2tvQ1FHdzFzbHdEdXR6QzJhOW52dCt3REFPZWZtWWlMdVNvd1NpV0V5b3NJdm4waCtzNGQ3ZnJTZUFycit6K0RwR0V4cUR5bEE4dzZkUGprSnpSTE11TFFmVk5SWjQyRXlsSUdrallSdDc0Nkd5b0dvRTRPaFcvTlI3RktBWHZCR2NUUFhvSHVkN2tLRWhiKzUxR2MzRlNDaU9ZUk1GNm9ROFozR3hFclBkd2RPUG5rVEtnR3pVSzdyQzVYWGhzL3JJZXErd1FrTkhlckU0cEFCTW55UndnVlFIbkJhejZxc1hQd2VMQXhMYUdDQVNaZEtQcXUraENSTVJwUVV6SDJUTGtIOXRDV1VBczYyQk1HSXV0VlYwaysvZTdQc1dmUkp3aHRtd0o3MlVVa1Ava0oyZzFzZnBQTWErUG5CSUdIOGVlVjJIN2dLekNXTXFEMW5SajR4aXdvQVZTdSt5OU9mYmtEK21OMUdIeG1MeUs5c1pyakFIaXVKL2JzejlqOS9FZXduUDRWcmQvZWk3YTNObkdwWk1jMllkL0xYOENTVXdKUzhEaktQOUVpK3JaSDBHVnlQd0JsT0hEM2s5QVZua2ZJN1l2Ui8rbExwZHJ0dVh1d2U5WWlNRTFhZ1MzTVE5eERMNkhiWFgxOXJaV0g5eHpJTHV6WEsrMllTeFdsQWtBRVVTMTF1MGtKejdKdzJ1MVVTUWpzT2gzNDZIZzNhMU9DNk10UTlRdUxXcFVkUWVwZ1hGVCtpSUIzWGtDZ3ZReDV6endITnJRWlVIOFJRVVBub3ZjVDQwQWc0T0pyczNGeVl5SENZalhnV0FkSW0yVDNmSGllMHpVQm05VnFsY0k2YW12cm9LK3Z4dkhDU3NRRmg3cmFjOW5zSUx3QW85RUdvOE5KRkZRQUZTaWhEQWhEd0l4YnNpTDhrVFU3bjZxdjB5ZE1HejhZS2VvL1F4SDliY0QyZS9hN1poRGxuWEJHOXNLb2o1NENNZVhoaDh6eHFKZ3lBZ254U2hldnFEa0ZSZVptakY3ZUVRQUxKNnRFMWVvM1VhWHFoOUhmTDRiQ2FjQ3VJWm5JMnpNTzdRY2tBcndUeXJRc0RINXVDcHpsZTdGK3dCSzBHcmNMRVlIVk9QZmhYbVRzT29XRU9BQk9GandqZjlnSU1KdzZBazE3M1ZXZGcrWENCUVFuOTJ6OGY2a0F3ZWtOYkJIb3MzNDcxQ0V1NnA3M3doU2MrV29YK2o0MkhPWURQNkErYkRER2ZlRXFoTW16ckxSdjRlY2ZvTm5UbjZIVEdOZlRuV2VGSzQ3eHhzMXI0K2NFZ1ljVnlSajc3WnRRQ3dic0hOUUQrWWZ1UUp1ZXNXZ3lmZzZhakIrTEg5cE1kQU9ZMS9pZEhFQTlnVTNUYmpDR2ZqVVlSKzdxQnRCTGF5Mnc2MmdNL1dvMGp0L2ZHNm83MzBMYTBHVFprUkxSNTh1dlVQTCtZN2hRVDJYSHMrTElZM09Rc09CcmRCemNHb0xwUERiM200SDZNWHNSRmRKZ3JUUmhxV0xhc21YL0xsaXc0Qm1CVWdpRVFJRE1ZMG9wQlFVRXlpaWcwQVpRRlp6RVhGdER0YUdCVUNqc0lDd0xjMTAxNG9lUFJHeUxKb2lMamtadFJRVjIvdWRWSkkxOEdjTm5EUUdjT3V3WU9BQ2w0MGFpcWZvUWpuNXlBVU1QYjBWNGtJRGo5dzlHbGZTZzlEeW5hM0xYRlJRVW9Lek1uUU5hWDR1REo4N0FvUXBDc3NJSnM5a09qbVVoY0FLYzFFbkFTNG50RUFRUVFhREVrZHpweWJuOTJ3MnRMem1QVjdjZndhalVFWWhUd1M4K0pMWlBMMWVublpCV2lHa0QxSjhxUjBLOGUzRnFVbkhMNkk2U2FVQ3BCblFuVHlLdTc1TlFBSUF5REUxNnQwZjE2ZFBBQUpmOUpLNm5xNHFwTXFFN29xSXVvajdmam9nT2tZanZHWWtqRDB4RDhwQitpQjg0RFBIdDVmYVdRUFQvNmRRZmZLWU1xamUrZzl6dmRzTm10b090TGtLSXU1eTBOcTBybUZNUFlOY2NCK0o2ZEVYeXlKRUlVcnZucDJjdkhQalhMRGpQamtCVWozNUlIdERsSnBwWFphUG5CQUJSbVpsUU13Q1lNTVIzYjRYNjdHeWc1MDJRY0dQS1JYVzJEWXE5MytEWVFaZHFUcDJsMEJXWUVkWFI1MW9aT0h2MjdMTUxGanp6c1ZzbDViM3NiZFNOMEpUbmVUQXFCZ0xsaWMzT1VxVkNBY0p5Y0FaR1FDQXNqRVlqTkJvTkFtc0tVSCtzQ0h6MGVoeXIvd1VVQU90MG9ENm5CQkdxTTJEU01oQWV4QUJnRU4rM0o2ck9OTGFxcnRaUVdsS0MwdEpTVkZkWG9hNnVGa2RPbkVLSlE0SFdvVXJZN2E1cUhWUVFJSEFjR01KQXpRQzhRQWxBQ2FXVW1mYjhmOFpOSGRybjZaN040ekd5YngrMDV3cXhyZERpUjdCRzZjVmx2dE1HNGZkRmtCRDNsVmVpODBmYjBIdnhkS2k1TXV3ZlB4UjV4MnArODFHRFdqYUhzYUQ0bXZheDdGK0pneCtmUkpkMy9vZVJXN2FnNi8xRDNkb01vRXpzZ2RIN2ZrTEtrRTR3N1ZxRkgyNS9ES3g3djZZUHZJd1JYNjVBZUh3QXppKzVCNGZlMzNIVHpPdmx6c25uWG96aUpsbDBBcUNLUlB6SUxDUm1aU0VwYXlSNmZMb1dUVzhKYkhTdEJBWUd6aW9wS2U0TFZ5VWVEYVZVRFZmNGxvSlNxcUFBUXlsMTl5cmx3UVBnT0JZczY0Q0Q0OEJCZ05WcWhjbGtoc0ZnUUYyZERqcU9BZHVxTFVpWExrakt5a0tYTi8rSGxGN1hGZ3B5VmNCbU1wazhlb0FlUDNVS1o0d1VIYUkwWU8wMjJPME9zS3dEQ2dDVXRST0hLMmFOVUVFZ0JHQ3Fxa3FUUWdQVlR4VFZHbHpUWnplZ3hFSVFIT0NQNzJwTXF2Y2VjQmtyVEhtb09RZEVkcnk4U3o0aXZRT3E5dTRGRHdCT0F5cjI1eUJTVm1HMjZ1QmVsL0czL0ZmVTZWb2hxa1VBQUJhc1JVQlVSaiswbS9jc1V2ckZ3cGd2NytMTkl1Zi81dUQ4OXF0amJRbWp4NEhkdHhwbEJRYjNmV0tGcGRwd3llMFVHUW0yckFST3VYbWpyQXdCcmRJUkhoTUVDQmFVL2JUM2txSGFaQUxDNHBBNGFnSzZ2N1lVeXBKenNMcDNaazBtQk4zU0NTbjNQb3hPRDk0Ry9ibThtMlplTDNkT0FGQzNieDlZd1hXOHlsL3pFTmtoN2VyY2RwSGhzRnloc1ltM0tEVWFzSFgxVi9mUElXMFEyOW9HcXlrY3NkMjZJclpiVjRTM2FBWlZFSFBadGRLMGFkTjd2L2xtVFJNUjNBQkk0QWFBb1FMUHVPeHRUc0lUUUhCeWhHVTVPRGduV040Sm04MFZ0T3NDTnc2MGFTREtDcXRnaXdpSHRuVXFvbHEzaERva0VFR2RPb0JtSDRiZUlnQndvbkx2d2NiUCsyck8xNVhZN2k0WVdWT0tBM21Wc0xGMjdDbTNRV0R0Z0FBa0JDbmhwQ0FxeHRXOUJ0UlZoNDRCbUtpb3VIbVBqdXpkN1lGdk4rTG9rUmpvYTJ1UjBMRW5SaVJwL0FqV2lDaHFEK0xIY1hlQXI3NkkwQWRlY051QkdwZjRPeDlIM0E5MzRvY1JKNkN5bFlHa1BZUlcvUytwbGR6SkxkZzZjU3ZzQldmUWZNbGJjRG1hcXJGcjJGandDYWxRb3g1Rzh5MFlPRlFlaXNHaGN0TTNVTWNPUit2QkhhOThFeVgzUjc5L1Q4SCsyL3Nqb0VVTE9FcUxrZkxTYW5RWTZuSW1hTHFNUkt1V1gyRjl0OTdRZEJtQjBSOHNRdFNnU1ZDL2RSZTJURHdLeGxhUGdPaExEZ0R6d2YvaDU4VmZJcUpOQzlnS3ppQjY1Z0tFdWFmaDdJSTdVSFJSaTVBWU5YUzUxZWo2d2VNM3pid0tsemtuQU5BcXl2SFQ3ZVBBV01yQWRIb010MlJFQWREaDREMzNRRmZ2Z05GUWdRUGpSa09wYllFK2E5K0UyTUs2OWR6NTJQbllPT1F2RFViN2w3OUVxNTRKeUZ2eEtQTDJGTUdhV3cxU2NpOEtYOU1pYmZuL2tOemV0VmZ5UFE5ajF4T1BvT3lURU1UZCtUUXlwZzlHN2RaM2NQanRMV0FyTDhMQi9Zck4rMWVpeVgwTDBYbDhUM1I3ODNYc2ZuQXFTdDVMZ1pLcmhkbVNnQ0UvZll6Z3k2d1ZRa2puVWFORzNRSGd2ektWbEhmVFZJRlNTZ1dua3dvQVZTclZjRHFkNERpT0VKNm5uRUJodDl2ZHdidXV5aDlSUFFlZ2F2dEtiRHorRTNJaUF4QmxEVVBmRGQ4akpyNHZ1ajdRRWo4UEc0N1FXQzE0cW5FMURBUWFuQk9oR21uUWdRQUFJQUJKUkVGVVZMaWlDaW9tdUplV2l1V0k2cURYRzN4MW1YSW51SE9FNXdWQ0tWWFk3YmFKS3BYcWZ5N3JMNGR5Z3dVYWJSQ2l0SCtPY2EyNnVob3N5eUV4OGRxb2JYWjJEbEpUVzBtMTYvK29mUURnN0ZPalllbTZGQjJISllJVGdoRVVGWFRWKzdyQ0VrSVFGTlV3ME5GUlV3a2hJQlRha0VBUDljTldXUWtuVkFpT2o4SDFjT2RRMWdwemVUVlVNZkVJQ0xxS2VCNkJoYW00RXVyWUJHZ0NsVjVmV1dHcHJJVXFJaFlCSVo3SFlnMDFjQmdjQ0V4SWhFSjVrODNyWmM0SkFIaExIV3hteGl2YzQyWVJBZGJ5VWxCTkJJS2lRcTU2clpTVmxjMU5URXphQmNBQ1YybHhPNldVSllSdzdyTGl2SGRKY2ExV2k4REFRQVFGQlNFa0pBVGg0V0dJakl4Q2JHd3M0a0lEMGF4WkszVHVuWW5rcEV0QnVHeGRGWnhNTUFJamduNGJZN05ZTENndExVVlZsYnkybWdrV2k5V2REM29wYmNycGxISkJpU0M0Z25CTFMwdmlWU3JWM0V1UFN4VVNJc1BobDZzVGRVUWMxTmU0VDBCYzQ4R1dtcGg0bjlZSWJYekNkUjAzVVFjaTVGcHFiVEZxaERSUGJ1U3JRSVFrKy81T0hSWURkZGhOT3ErWE9TY0FVQVJGSVRqb1psMTVEQUlUa3E5NXJTUWtKRXo3OU5OUGN1Njc3MzRlQUE5UWliWGhVb0ZLTVplVUtoUUt3cklzZFdVa0tLQlNLV0d4cUtUT1lvR0JXaGhZTzhwS1N4RVZHWW1nSU5lRXFhT3VmUDB1YTJPNzFJVEYxVEpQQkRWWGFXOEhIQTRXSE9lUk1pVjZRZ21sbE1URnhUME9vS3Nmb3E1TkVtZjhIMUp1VGZGUGhIOWUvMUpDQ09sMHh4MTNUSERiMlRTVVF1NUlZRVJja0dVbGdPTTR3bkVzSEE0V2Ryc0ROcHNORm92Vm5TU3ZSMTFkTFNvcks2WFdmVmR0VzJ6c2k4cktTcS95M2lhWXpSYlliRllQcHNheW5GUmpTUkI0S2NIZGFyVU1aUmhtcnY5eVg3dUV0TzdtbndUL3ZQNGxKVEF3OE1IYzNQTkhVMU5iSHdiZ2RERzNTN1kyU0lueVVyb1ZXSmFEUXNGS1NmSTJtd3BtczlxZEpLOURVRkFRUWtOREVSRVJnZmo0K0t2a25ENkU0emd2RmRSVlc4MW1zOEptczd1OW9LeFUybHV1Z2xKS3liMzNUbE5vTkpySC9aZlpMMzc1NTBuTGxpMm5wS1NreUQya0tqZUpZdUFPL3hBRU1RVEVDYWZUU1RpT0E4dUtyTTBPbTgwS3M5a01nOEdJK3ZwNlZGVlZvN1MwRkZkYlA5SW5zTGxDTzZyY0txaEJxck5tczhtWkd1dlJBZHBkSlpOUVNwa1BQdmhnTm9CQi9rdDg3VkpkWFkzUzBqTC9SUGpsTHlzS2hhTC80Y08vakJhQmpWS3FFc0dOVXFxZ2xETHU2dGx5bFZUQ0ZZZkRCVzZYNnJZWjNDcHBGVXBLU240YnNCa01CbmZQZ2hyb2RIcVlUSzYyZVdMTFBIbU5OYWVUSS9JdVV3QklmWDFkcWtLaGVNeC9lZjNpbDMrdVJFUkVUTnV5WlhPU0Y3aEpzVzBBaUNBSU10YkdTYXpOVlpEUzdyYTNXV0F5R2FIVDZWRmJXNFB5OG5JWURJWnJCelo1aHlsWGVXOExyRlpQVURPYXpLZzFtS0EzV1dGak9ibkRnQkU0NjZ4WE51eE1YTEJ1TC9hV21TNGQyR25ITjdzUDRjbXZ0dUhmMjArZ3lrSDlWLzk2aTlPQzJ0UG5YY0drdjFNcVZyK0FnKzl2dSs1RDVDdC94WTdaeXozR2FEaTJIY2VXek1lKzJYTng1cnU5RUg3WEx3alFuOWlQOHgrK2d4TnZyb1RENjd1cXJTdHhjUFpqT1BMS2g3QmFaYi9rck1PKysyZkM1RStHdVY3UzlOWmJiNzNkRFd3ZVFic2lhL04wSkhneU54SGNyRlliekdZTGpFYVhTbHBkWFkyeXF3aFM5Z0MycXFvcVZGWld1aExjM1hGcUxoWFVKck9yMldHdzJNRVFWeUVQd2NrUnB5dG1qVmdORlFObmY3VDVZUzRxRVNOYi9qOTc1eDBmUlozLy8rZk1sdXhtMDNzMmdTUWtoQllnR0NEU0lRS0NvS0FDSXZZR25PVzhzNWV2RFU4NXozTHF6M1lxbGtOUkViRmdwQmNGUktRSENNMlFoUFJlTjl0bmZuL3NKdGtVVWhDVTAzazl6QU96bTVuNXpPZnptZmU4Nit0dDRLSDN2dUZBdldzTGY1VCtIVXR6Yk13ZE1Zamcyanh1WHZIenI5ekFDdHJBZEpRdDF6N2FWSGIwcTJSa1hSbVd5dHF6UHNUakx6MUw4TVV6OFN3aXl2bGlKWDdESnhFM1l4VFpqOTlNNW9iY1gzR0ZLakpmZUlYcXpEMWt2dnB4aTdtbzN2dzJQL3pqYTZMblhvZTJhQ09iN251MXVjSktIVXpNRUMwSDN0K2c3S096QkoxT2QwTm01dUhCSGxyYjZhS2tMYlMybHY2Mnhxb0VsMGxhWGw1QmNYRXhKU1VsWFJkc2hZV3VaaXpWMVZVdFRGQ3IxWUxOMWlqWUpQeTl0WUpXRkJBRkJORlZ4aThBWXVISjdOdVArTVZ5LzZqZWpFbStnTGtKQWl2MkZ3QldOaHd1NGRaSkl4a2FFOEg4UzBkZ1AzYVVnMlpsOGM4V2lyNWV3djZYbHVLb084bmh4WXZadi9oNXFpcWtSaWxGMXB2UHMvMk9POW43OGhJYVRGMTdwY2gxaFJ4YS9BamI3MzJFZ294OFQ2bEg5anN2c2YyT085bjkwcEtXbWsrSGd2Y0l4OWFhaUp2Y3A4WEhnNTk1ZzRSTEp4STFjUmFSS1NHWUNvdC94VXdFTS9LajVhVGVmdzJ0S3pDelAxeEs3TUtINlRGcUdJTVdQWUw5dS85UzVtSFZSTTIrbk9ML3ZvZEZlZU9lTmZUdTNmdEtXZ1lSTkI3bWFLUFcxbFJMNmhsSXNObXNXSzB0VGRMcTZpckt5c29vTEN6cW1tREx5M01WdUxlT2dycE1VRmRhaDBlVDQrYUFnU3VDSzFvczVybkh5NnVuSjBTRTRHeW81MVNkbGNTSUVJNlhWZ0ZPSEpLTVN1VytuS2hDSmRkenN0S3VyUHhaZ2svL1lZU05HWUtvQ1NJNExZMnd0TEhvOWE3NVB2SDBBbzd1cVNIK3RsdlI1RzlrdzkwdmRrbGJMbHJ4R2VvaDA0aWRFTWRQMTh5anZNSUJPTWk0ZXc2L1pEcEpXREFmSC9NZU52NzEzMTA2WDkzUFAyQlBISTdmYWJJcmk1Y3RJanUzRi8wdUgzWU9ac2hDOWRFOC9Qc25Vbi95R0RhdlJBSWl5cW5KYW5hWGlCRXBCSWw3S2M2eUtSdnFMRUd0VmwrY241ODNtcWJjdG1aZlcyTkRKemVkZUl0QWdrdTQyZDM1YlcyanBLV2xKZVRsNVhjczJHdzJHOFhGcmxyUTZ1cHF0d25hNEJFRlBVMTZoOU1weUxJczN2SFFZeXFOUnZNWHM4Mkd0MWJGcDJ2V2NzMktuOUZyMU5UYUhZQTNJK0tEV1BGakJtWDFEYXpkdW85Y1djQnNkU2dyZjViZzIzc1F4bUZKaUxvQUlsSlRNYWFtb3ZNR0tDTjc1UzZTSG4yY2lPUmtCaTU2Rk9lNjVWVFVkMzVPLzZsWDAzZktLS0ttMzBiOE1DYzVHektRUzNkeWJLT1RvWXZ1SWlneGtmaTc3MFhjc1lLcWhzN1BWM3Z5Sklib21IYS9hOWkvZ20ydjdTTnQrUkw4Zk04Rmxib0pteGxVbW1LMlRCeExabm91YWowNDZqek5CaDk4WW5UVVpSVXJHK29zSWpJeWNuWktTb3JPcmJXMUNTUTBtcVh0cFgrNHRMYkdLR21EMnlTdHByeThuT0xpSW15MjlsOUNhcGNKV3RpaUg2aXIvck94WktwWlcydE14SFU2bmE0MmRwSWtDSUlndlBMMFkvT0JWTDFXUzRQSnlkWFRMK0VTcDVxOU96ZmpwM0hWaE40Mll3cld0VHU1ZldrV0EvdjBaWHpRQ2J3VmRvOXpEMGMxRGRYK2VJZTUxU1R2VVBTKzFWZ3FnVTc2MUJvOGtpSDF4a2pLSzh0eGxOWml0UlN5NjlZYm05UjlyNlFrc0FLZFVQL0xPT0EwTk9rVk83WVJjUEZzQWtQUEZWZThBYTBlblBZSUp2NjBEMDFJRUQ4c0JyV3Z2dTJmU2s1bDM1eEZpS0k0Yk0yYTFaTkRROE8rQmV6dUh3ZHVXbkZjeWJ1Q3V5OXBrNXp4MU5xMFdsY2dRYWR6QlJLcXFocE4wa0ppMnluZlU1dk41aVk2SWxjdHFHZVQ0NWI1YWc2SFEzQUxOY0h1Y0FtMWpBUDcvVlFxMVh5QVBxR0IvSEswSE5Gck1LSEE4ZUp5RW51NE9oSnB2UU80NS9LTDNTNmFRaVpzOCtYK1VJVmw4dXp1SUFGQmNyYWtIRk1INEIxUVEwT3BEZUswWUNyRFhCZUFMcWdMT282SHI4dGNXSVIrc0JGMW1BRXZRenlqUHY0VVF6ZmZTMzZSY1pnM3RKK0hGRFR4V3BKc29lMGJrU1g1NEIySXp2ZlhGRmZxQ09qZmc1ck00K2d1R0FhbURLcEx3eGdRNzl2Q1hHMG9NQkVTRjludUdKeGFmd3lCdnNvK094UFBaM0R3N0VjZWVmajdaNTlkYkFQc3NpdzczQXdnVHJmVzFxSjFuOXN5bEp1anBEWjNsTFRSSksyaG9zSVZTQWdQRDBldmIvbUNFcHZvaUtvYTIrYzFlRFE4dGpiV2d1SndOUHJXSE5oc0RnQUJXUmIyMURodVhiYi9WSCtBMkw1OTZWZWJ3L1BiVDdCbC8xNCt6WktabGV3cUhpNDZsY3RIZTA2dzZlQXgvcjUwRTRNdUhFcWNJdGZPc2xJU2c2LzZCSm52ZlVIZXVnMDBtQUJDaWIxaUdJZWUrUWZGR2ZzNStNUmlWSlBuRU96VCtlbHExbjdNMFRYYktmajJIYkwyYU9nNXNUOUNXQ3A5eHRyNDhmN25LZDZmUWRIbU5leCs0WjB1cFpqNGpSaUprTGtIVXpzZWlNcE5Lem0rZW5lN3grMjVkZ3piWDE3VjVXa28rdllqam55K0FhZTluS3dQUGlSNyt5RUFlbDEzUFRsdlBFUHU5enM1OFBpemFLWmNTNmhIRWIxY2NZQnkweUFpK3JUVkdnL2NNWVh2bjEydTdMRXpoQ0FJZmUrNzc3NUp0SzFHOEV6OWFKRzA2M0EwK3ZXYlRWS0x4VlZMV2xkWDU4NXRLMjgza0tDYU8vY3FqOXkxS21wcmE5cHBlbXpGWm5PRllwME9SeE43eHlQdmZSYWs5dlo1M1NwcWc0WkhCNEhLaTdSK1VSdzRsa1ZHcFpNN0x4M0hNSGVmUTZmTndwYk1iUGFYMURJd2FUQVBqSW5uOStBTk5abE1PSjBTZm41KzNUcXV0TFNNNE9EZ2J2VUlQWk5qem5SOHJ0M2pqWEhTaFppT0hxUWh2d2pEd0F2UmV3c0VqNW1NcXV3d2VhdTNJTWFPWlBpamYwSGJoWDRUd2VNbVl6dXdscExNV2dZKy9VL0NZL3dBa2ZBcE0xQ1ZIaVF2ZlFPMWhiVUVqeHhMVUZ4azU1Ukgra2pzR1V1cDhSNURXSytXTEMrU3RRRjFXQ3hCY2ExcUFhVmlEdi96Yll4M1BFWlliTmVZWWFwKzJrUkRyWmF3NFFNUkdreUlmajBKN20xRUYzY0JJVkYyVHFXdlJZZ2V6ZkJIRnFEVk5JKzY2SlBYYU9nMW5jUXg3ZmM5OVJzd2pPRDRTRVZLbmFuT3JOTVpOUnJOK2syYk5sdHgxNDgyVW9rTGd0RFlXZDZ6azV3Z2lnS2lxSEwvaU80T1Z5cDNseXMxV3EwV25jNkxvS0NnRnZSZ3dqZmZmTzNSeTZCUnVOVzZtVHdhazNQTldDeU5YR3NPd2VsMGlySXNpemFiOVY2VlN2WHMvOUxrbnU5OGJHYzZ2djhWMkxJMnNQSHBINW44d2VOZGVySFpNcjVnMVNNL00rUGI1emluSGxsSEJWdXUrQXVEUHZ5VW9FQlJrVUxuQ05YVjFmOEtEQXhhaVl1enpTUUlRZ011RDYxTkVBU0hJQWlTU3FXU0dqbmJkRG92V2FmVDQrMnR4MkF3NE9Qamk1K2ZIMEZCZ1lTR2hoRVZaU1F1TG83Ky9mc1RIeC9mYklwNkJnemNaSkdOR2hwMnU4T3RFam9GZDNwSFUrblVuajI3ZlZVcTFjM0tVaW5vRHJUeEU1bmFSYUVHb0UyYXdlVmZMZWFjaDVuVXdZei9acmtpMU00eC9QMzlyN3ovL3Z0OEc4MVJkNFJVUmF0U0szZHVHdzZISzFKcXR6dXcyZXdlVVZKWGJsdGpJS0cwdEpTR2h1YlF2T2dxY3E5dlpYcTJ6RmxyajJ0dDRNQ0JOd0lLdVpXQ2N3dFJqYWhXaE0wZnlOY1cvK0NERDA1d0M3WjJmVzJ0T2R2YTVyWlpXd1FTWEVYeXJrQkMwN1pwV2VUZW1LL1dOaExxWnU0UUFPRzY2NjVWcVZTcUc1UmxVcUJBUVhjUkZCUTBvMWV2WHRwMnREYXhVV3Z6cUVob3lwMXREaVI0a2xJMkZzbTcwajhzRm90THNMbTBOVmVSZXp0Q3paT1NxRWxiZS9mZGQ2OERCaXBMZFBiaEl0VlRVZ29VL0tHMXRnSGJ0bTBkMHhXdHJYM05yVkc0TlJiSnQwei9BQkJicG5mWVd2alduRTZuTzIrdG1Sa1hFTlZxOVhYSzhweEx3ZWFuVElTQ1B6VEN3OE9udVFWYW85YW1waFVaWldNMVFxTU1hdWxyczUwMi9jUGhjS0J1ckFkdDFOWWE4OVdhS3d5YWZHdTRLYituQXFPcmEydXBzWXRFQmZyUXJndkVLWU9xZFFLQWs2S3FPZ3pldnZoNXFaVFZQUTJLMTN4S1ZiRVZNYVFYZmFhUDZkSXh0dndqbEJTSzlCamVwOHZYc1JjZklXdk56OGhBK01RckNJbytWNXFpaE9Sb1cwMHFxTlZucFN0V2l5dFY1Wkt6dDR4ZUYzV0RCcnd1bjJOZmJFUUNBbE12SnFKZjEraW5LN2F2UnRWN0hBRmgzbDIrVk1YV2RFcXp5aEYwNGNUUG5jTFpTdVdVR2lvbzNMSU5xMG5FZU9tbDZIVy8zWDQxbmRoTnJUV1V5S1NZTGg4aml1S0k0OGVQSmJzcHhCdUw0KzF1cmMzcE5rZWJORGFuMDRuRFpzRlVYNDlUcTRYUVNMeTh2RnJWa1RacWJTV0lybnJRNWdvREQyMnRUY0FBRUxScTI5VjMvZnNEcHIzMUxYLy82RXRHdjdTQ0hhV045WFpXbnZ2b0MwWSs5UjhTRmkzSHMwVFZZYXBnL2lzZnNlQ3p6Vno2NGxJK1BGS21TTERUUU9WbFFGTnpoRDJ2Zk43bFl4cjJmY3UrRDlaMnp5UVF0V2dNQm9vL2VaSEN6S3B6ZGorbjNubVlsU2xEV1ptU3pDZkdhRDRmTXBTVktVUForTVJIditxOCtSOHQ1c2lHSXkxZm5RVzcrUG1GLzNidlJLSWFqY0ZBNWRvUHlmN3hlSmNQeTM3ak1Zb09WWGZ2VWw1NnRHSTUrNTk2bmJOWGF1OWc5MDJYOE11bVE1aEx5NUhPSVR2SndZZHVvcml3NVFVcU55MGo4OHRkM1Q1WGJHenNSRTl6dEZXRVZHZ2RTSEE2blRobEdXdDFPZldWZFUwVkNXYXpwVWxyYzlXUmxpRTJVaEo1Q2pWM2hZRm4wQUJabG9YcTZxcUJna283ZThHc21XeC9ZQjRyNzc2T0IvcDdzV2pEd2NaSGtza2pMMlRWZ290by9lNWY5ZjJQMVBVY3pEY0xMMmZsTlVONSthdnRWQ2owTU8waWRNS2w5SnFjZW5ydHJLS0UybE9GT051WlAyZERIWFg1cGJTaDhaUnNtRTdsWURGWm1qNVNoOFVUUDNzV2dWRytwMzFnR3ZKUFVWOVN4YStoQmUxNTIzUE1PckNmV1FkVzRlY2R5S2kxKzVsMVlEOFRuN3EyZVhpU1M3TXo1ZWRncWJOMHJxRTRISmlPSGFEbVZEbVN3MEdiOXJpU2picWNmT3kyTG13eVF3UzlaczhpTlBFMHJlVWNOa3o1cHpCVnRNL2NhaTB0eEZ6VDBNNWExRkNiazk5aW5RS0hweEUvNHlKT0YraVZMQ1pxYzNLd05saTZPTHNTa2lPZnNuMGlTWXNlcFA5ZmJzRGdvVUE2VFJYVW5jcHZkNi9JQUE0TGRUazVYWm9ueWVHZ2V1Y1dURFUyMTV5M3UvZUsyeks5dUs5aGJXaFpjcUxSYUM3YnVIRkREdytOcmNrY2JmSzF1VnNPdUlRYWd1anREUm9WRG1kakxha0h0VkZkRGFVNTJSUms1NkgyVE85b0xwdHk0blJLU0ZLenhnYUlCb1BoS2hCSjh1amczalBJSDB0SkkvMlFtaUc5b3FBbXA4MFU3c2dxWk1KRll3RUlqdWxGUDhkV2RwWTV1U1JjTVVtN1k5THR2R29NWmVaSXZIMGxxck1iU0gzL0U2TDZ1SnJ1Mmc2dlpzMnN6V2lvd3F3Znh1UlBua2V2QmZPeExXeWUveUFxWXlMVzdPTkUzUDR2aGw4L3JzTXJ5WFc1YkprOUQ0dHZMN1J5Slphb1NVeDdwYmsvaiszWUpyWXVXazd5RzI4UjdQOHI3K3JJbDN5eTRITVNldFZSVmlSaHIzSXdldjFhTEovZXcvSFNrVnowMkN6QXdwYVIvWWo5T0pzWXpRN1cvZTFGTENjT1lqYzhSZlYzQVJoR3ptSE1QWFBjNW1nV1c2NmJpNjJ1bnVwU1B5YXZYMEhBR1ZyWjloUHJXSFhOMC9qMjdvVlVmaElwYmpvWHZmRWdXcmRneW43MVhuTFZLaXpabVVUZS9SS3AxNDhISkU2OTh3aTdsL3lFZjN3UXRmbDJSbjY0alBEWWpnZFJ2Zmw5TmovNEx2NzlFN0FVWkJIejRGSUdUSXpyOEppODkvN0I0VzkyVWx0VHhFL3o1cUpXQnpEcy9YY0o5b1dDOXg3aHB6ZTJFUkFYU0hXdWpaR2ZmVXBrbkd1eENwZmN6NEdkRW1MMkxwd2FiNnoreWN6ODVKK25kUTJVci9zUHU5OWVRMTIybVlwN3J1YUVRVVhQK1UvUmYvSUFBTXo3dm1iOXRjdVJLbjVCNm5NTlU5KytGeFZRdldNNVA5ejlQUG8rZlRFZCs0WEVmN3piZEF6QThPR3BZNEZUYnEzTkJySU5CQld5N0pSbFdaUkFscHhPV1JCRTFHcVg1aVpMTW9Ma2JKSCswVkJ5Z3IwcnZpUXkya2lKMUlDNnRXK3QwVkhuMHRhYVRkQnZ2LzFXSjRyaVZTMVgzY1I3TzdPWU0rbXlUcmFIbGJJNkJ5UDhSRjc0YkEzSm8wY1I3Z05sdFdZSTkxSGtWZGNOR1lhOHV3YXRyK3NCS2ZyZ0VmYS9zNUtvRjI1eHpYSzFscWxydjhTZ3M3SDdxbEZrZnIyZmxObUo3UDdyMzRoKzdETUdUZXlEVkhlTTc4YmVTc1hsV3dudTREbXIzNTVPVmZBVXJ2ajRNZGZidUJVOWpMT3VsSXI5aDdDZEpYdEtQckdId0JjMmt6cmNDQTRMVHFEd2RDWjA5QWltckZqQjhTZm1VaFgzZDFKdmJLbmRTcVVtQnE3OW1tQi9rZDFYRFNmMyt5d0Nwc2VmbVZzZ2FnU1gvcmdWalJyQXdyWXBROG5kUFovZXcxMHZFKzNnUzVuNDFEd2NoVnY1YXNKakpNN2FnaUY3TlR2L2M0eUxOMi9DejFlay9JdG4rT241OTVuK2VzZXRRTEtYdmt2Y294K1FQS00zSU9Ic2doYlY0K2JINlhIektWWWxYTTNJRlNzSWFzeGtyc3ZnNTMrdVovUzJyWVNINmNoLy9XNTJQZmMrbDczVi9IS3Eybm1VU3phdEl5QlloOU5pNmREZkdUSjVBVk1tTDJEcmhEaWlYdjJjWHIxYnBreWJIVVl1LytZNTFKWWMwZ2ZOcEt6aVhpSjhDOWw1K3o5SVdycVJYa21oMlBPMzhQWE1wNGlidUJ3M1ZTQStQb1pwOCtiTlc3RnMyVEtyeXh4Rkl5RGJaUkFGd2ZXZjRDS3p4ZWwweWs2blU1QWxXUmFjVG5jdHFic0JqQ0dBNk5temlJd01wMmZQQ05TTlVWQ1hHZXIwU1BGbzZWK2JPSEhpYktDNXo3eGs1L1V2VnVOSVNHVkIvK0N1ZW5VdzZEUm9SRUdSVVdlSW11MHJ5Znc0SFZORkhZN3FFcVMremU4YVE4cG9ERG9BTFNHamgzSDh3Q0dZQXFXSHpLaTJmczdlSFNBaklUdnlxY3F1SjNqUTZWOHErcVFVeEl6YjJISzNsZkRVRkhwT200YkJvekpNUDNRdWN3N1BQWHMzRm5NaHZZYTdUVUcxN2xmVkVhdmlrd2oyZHoxNGh1aEk2cXFyei9oY2dtamh4UE9MeWQ5NUFMdFZ3cHhUUzBCbERlQVNiT0VqUnJtR2JCeEdjUEJKS3JNc21IZHZBMi9JZXZsWlZ3djB5aFBVSFBUQzZYWWVuUTVoSTBieTR6TjM0RGh5Q2NHcFkrazU0WUl6SHJmbFdBYm1xR0dFaGJtaUNCRmp4MUM3TkwzRkdBSW16aVRBWGN1dDB2MjZhRU5neWhCWGRZZ3VBa05JRFpaYWNKYnZvcnpHaTZBdi8wUFZsNEJrUnF6TXBLWUs5TTBpSS9yNTUvK1Z1bXpac3MyTjVxanNNa2NkSUR0bEdjbmxiNU5rU1hLMjB0ZzhvcVJhTThVL2JhR2lwcDRDalJmcVJoUFU2V3lkNHRHY2tBdUlhclZxbHNmN21rOVhyV2FyR01mN1UvdlRlVjY0RjZHK2FzcHFuZnhseGtWQUEvK3BoMUEvdlNLcE9yWThXN29xVHE1ank2UExHZmZGZndtTERhYnE2eGZaOHJXdEl3WFBkUkpORUJIVHB1TGpYcWdlVTZmakcrL2Q0YlhVMGFsY3VtMDlSVnUzVXZqTlV0TGZXY3ZNelcraFBVZTNLdW9OcDlsSFV0Ty9jaGQ1U1FWUEIxWTNpaGJhZTkxbXYvb1ErYVVwakYyMkNKMjNtdDNYRFVPVzVOT2Z3WDA5cjVqQlJFMmQ2djU4S2oxdkRtZ3hsUGF1RlhYYjgxeVN0cCtpclQ5eDdMSHJLYnp1VlVZdFNEdG4yMHZyYy9hZVAwRThUZEdiZnpSUlU2YzJsY1QxbURhN2pWc2dMQ3dzRGRqV3l0Zm1tYkFydTFJL1hKUkdzb3dnT0oyeVMyYTUzR2hWbVlkQk5qSmdTaHJSUFl5SXpjbTR6dmJTTzVCbFdhaXFxa3dTQk9IaVJuOVordnIxZkZZWHdqdFhwalNwbEoxdG1aR0pSallmeXdhZ0xQY2t4OVNScElZcS9yWFR6bGh3Q09yeVhFd2Vjc3RlVklRYzJaZmcyR0RBUWQ2NmxvMUhUSHUyVVc4QnNGRytiUmVoQXdlQmIxL0MrcGhwcUFzZ2JHZ0tZVU5UQ0lpTFFXTm9Yamh0U0FoMUJTMGJxRGpxNnNBL25PanBzeGoyMHBPbzg0N2k2ZnUxWlcxbCsxMFBVMWwzN3ViQUt5Q0FCamY5czdQNEFKVkZMY21SMUhvRGxzcnlzL2VnaHdSaE90V1NicnFob0lDQUljUFFlYXR4Vmh5aWFHZExQcm1TSFZ0ZDgxVzRpNHFxM2dUSDZRZ1pQaHByMWlIMC9ZWTB6Ym1mTWFoWm1CbUMwRHFLTVZXMWxOUzJ1am9NOGNrazNMaVE1UG1YVVgzMHhCbmZpNjdQSUhRRnV5Z3RkUVVoaW4vWWlsL3k0Ri9OcUtQMjFXTXI3MW9FWFJVM2pCQnlzUnBpbStjaExncE5xN2VqV3ExTzI3QmhmWTkyQkp1cTBXSnNsRWVTSkNFTDRMRFpXblMyc3BnYUVQejljVGl0MUpkbm8yNFVhbTJyREpxQ0JvS1BqOC9semNaMENZczNaVkdyOHlMdFdWZW9YUnZhaSswTEp3RHc1TnNma0Y1c284N21ZTWFpSlNRTkhzYUhNd1l4ZmN3b3ZudG5GWmU5ZVpLYXFscitldmswZ3BVU3dOTUx0ckFSREo0Wnd1b0xSNkEycG5EeHQ2K2hIellWSTIremV1WmN0R0lkdXFDUWxvSWdTT0tIV1planBncUw3MFFtenhnRXdOQlhYK2I3K2RlUzkxWUNhbnM1OVNZams5WXZhU0xRN1hYTFBXeTYrVDYrZkY5SDNOOWZKUG5Lb2RUditJaU4vL2NKZ1gzak1HZG5Fbkw3US9oN3ZKU2Q1U2ZKL3V3clloNWJUTkE1U244TG1YZ0Zxbi9PSVgzbVQ2ajlJdEdGdE5SempKZGZ6OUZiSCtLYjFhL2dOLzU2eGo5NjdhKzZYdlRjQlp5WU41K1ZJOThrNHBxSEdIbkhOR0t1dVpYMUN4WlF0M0VnbGhyUUo3UmtYYkVmV00yYTJXdXdaR2NTKzlqL0k4QWJHRENWMUp1MnMzN0NPUHo3eFdJK2xZM2ZwUTh5OXA1TDNVOXlUd2JmZHhGYjAwYWc4b3RoVFBvS2duM2d5RU56eUQycHh6ZFVTOVh4VWxMZS90dVozNHp2SUZJZnVwanQweWZqSHg5TWRiYU5rWjhzK3RWcmtuRFRRcmJmUFpOZi9BM0UzUDBTQTZjbmRmQ21NSkw2MmtOc3ZXa0tKK0w3SWxlVllnbEtaZnBIaTlvSTJHSERocVVDdVo3Q1RaWmx1K0NLa0VxeUlMak5VUW1WbHc3SlZFOVZ0Z2xiWURqYVdDOTA0VVpxTTM4aXEvd2tKWUlPWWZEZ3dlNytCbVlzRm90Z3RWcXgyKzJDdytFUTNDRlhsZFBwMkFQMFB4dTJWVWxWUFhxREFUL3Q3Nk90bmUrMFJaM0RnU2svSDFWZ0JEcERXNytJczZHT2hsb0xQaEdocmN3ZGlZYkNmR1N2UUF6QlhaTkVrcTBCVTNFNW1zQXdkTDY2MzJXOVpKdUordEk2dktNaitMMzBlMmRESFEybE5YajNqRWJWenN2WVdsYU1wUE5ENzl2U3ZKY3NKa3lsRlhpRlJhRFZkVzBQMkdyS3NOWlk4VFpHb3pvTGxDWk9VdzBORlNhOG80M3RqdjIzY2FuWU1PVVhJL3FIb1BkdlA1bFpsdVdqb3FpNkE2Z0g2bkJSR3BrQmk0QmdGMFRCS1FpQ3BGYXJaWTFHSTN0NWVhSFQ2V1M5WG8rM3Q3ZUwwc2hiajQ5V1QxalBIaTZOcmRrRWJkYlljQ2ZJbVV6MWFXZEhxTGtjSHVHQlNyblFyelFHTUVUSG5sNzk5L2JGMTl1MzNibjNOdmJzM21wcHZmSHQyZk4zdlZ0QmE4QTMydkM3amtIbDdZdHZCNmthWHFIdFZ5cUlPZ08rUGJzM2RxMS9LRnIvc3poMmd6KytCdi9mZDh1S1dneWQ3Q05CRVBvZVBKalJkK0RBUWZ2Ym1LUElUbVFrUVJBRVNYSnBiWTJCQk04NlVvY2tJMm5WMkd3V3hNYkdMTTI1YTgzK05VRHc4dks2VEJFbUNoUW9PTmVJajQ4ZjBjb1ViYzM0UVhPWmxZU243UElza0xkYWJZZ2V2alhCN1ZzVFBCeDJvaUFJMDVVcFY2QkF3Ym1HWHE5UG83bjZvTjBXZmE0ZnFaSDVRMmloc1RWMXRySTFhbXlTUitEQXBha0JndG5jTUJXSVVxWmNnUUlGdndHTVI0OGVHVWpMOHFwR3hvL0cxRE5Ca2p5TDQ1czF0MmIyanliQjFvWnp6ZVhlMEdxbktuUDkyNkswdEpUOC9BSmxJaFQ4S1JFVEV6UE1VMk56bTZPcVZ1Wm9DNjQyTjRWNEM2MU5kQWNNbWxTN3hnUGRacWdpMkJRb1VQQ2JRYWZUalcrbHJiVm5qcmFRV2EwRENYYTdIZEhUREczVTFBQ2hvY0Uwb1gwejFNbk9qTU1zV3JtQmU1ZHY0djE5dVI3MEt6SlplWGw4dW0wdnIyNDhTSzNIVVE1ckE5c1BIZWV0alR0Wm5sbWlyT0J2aUVQM1hjR0pIY1hud1Vna2ZyNTZQQVduL2poemF5dk5wYnF3NGd5UHJtUGJaWmRTMnFYRGJWUmxITUorRmhoeGFqY3RZY01UUzgvcVBNZ05GWlFleVczeitjL1hqQ1V2cDN2bWFFYkdnVDRlV2xzTGphM3hweVZYbTlRbVFpcTJNa1B4TUVNbnRyODM2L2hxYnlGOVltUEV6UktVQUFBZ0FFbEVRVlM0dEg4VW03ZHM0UEVmR2tkdTVyMzFlemhTWE1KYlAyUzJFR3lsZVRtOHN6ZWIvYitjNUl0amltRDdMV0V0SzhCdXRwMEhJeEdKbnJjUXY4QS9rT3RnMVN2c1diTCtqQVc5cFNBUFIxZTZUVlBPanF0dnBOcDhGbDR2cGtvYXlzNHUvNTZVK3dNYi92cGltODh0ZVRuWTdkMDdWNjlldlpJOU5iYlRtS040bXFQTldwdExzS21ibzZHTlRCNHVNMVFVeGZZRm14akE0aHNuTmYwYTJGREdYL2Jud3RoWXdKdG5icDRKTlRsOGMzQm5TekdjMEo4UEV2cXplc05hUHFoVGhNMjVRUFhPZEk0dlg0OGREUUVqcDlIL3l2Rk5TYnEyNHFQc2UreDF6RlpmRXY5Mk55RkdYOEJDM3JJUEtkcDdGTHRkVGZDa1dmU1pub29BVlArY1RtV2xub1k5RzZpcEZJbTc2WGFNU2U0aWRVY2QyZSsvUStIK2szakZENkgvd3B2dzl1NDQrOU4wNkFkT3JOb09vaGJ2MGEwRWI4NStNcGQ4Z3FuYWlpRitDSDBYM3RBNUEreHB4bEN6ZHcxRkJmNzB2WFFFQUpXYlYxSWxKUkovVVJKbDZ6NmlRVzJrY25NNkZtY3dDZlB2SURUVzMvMndsM0w4blhlb3lDckJrRFNPL3JkY2lWYmRxSTJVY2VLOTl5ZzdVb0JYejBRU2JyNlZBUDlxTWw5K240bzlHZFRWbGJGL2NUWkNaREtEYjNSNWJ4d1ZXUng5OTBPcVQ5VVNNUFl5K2wyVjVrNHd0cEgzMFZ1YzJubVNnTFRKZEVVQnEveCtCYWQrM0kvWlZNT0pGeFpUb0JXSm5MT1E4SGgvMS9tV3ZVdmVqcU9valFra3pwL2ZWTmplc1FKWXpiR1huNlU4dTRySVdUZlRhMHkvSnMwdy8vUDN5UHZoRUtxSVJCSVhkbjYrM0E5ZW92TGdBZVRpWFBZdFhveWdDcVQzM3hZMmtTYVlUK3hrOTVKUHNYdEZNK0NldS9Gemw3Qlk4ak00OXM3SDFGVTdDSjE2TllsVGhpSUEzdDdlSTREUFdwdWlqZVlvc2lRNUpVbkE2VVFscW1WSkl3bE91MDAyMWRSZ2t5UXNYdDZJalZMUG5aU0xMQ05VVmxiMHA0dk5XbzZVbHBOb0RGR2t5dThNdVdRbkcrWS9UK2pNYStsejNSVUk1cG9XUklBbmwzOUY2Q1d6Q2RCbHMvWEIxNXBNb1pwQ08xR3pyNlAzdkdrVXZYSTdCOWNjQTZCbVZ6bzcvdlk0bXBScHhFN293WTZycjZXaVJnSWNaTnc5aDE4eW5TUXNtSStQZVE4Yi8vcnZUaDlRVFhnc1lXbWpLZm44VlZxU2JUU3c4NmJyY2ZhNW1IN3piOFEvUU1MYTZSdis5R1B3Nnp1SXdsZnY0OFR1UW14Wlcvbmg0ZjhRTUNqUnBmT3MvNHdkRDd4STRPUzVHQk1kYkxuMlRzd09seFd5ODVvWmxKbU1KTjUySXh6OWpCK2VXOTVrb2Z3MDd6SUtDbjFKdUcwKzRiMjhxTTJ0QkxVdndlUFM4RThNUXh2ZGw3QzBOTUtISnJwdktaOHRNK2ZRRUpCQ245dXVvdjdiWjluOXdYWUFTajU5bGwyZkhpTHVwaHNSOXEya3JMRHp5bjVkM0VEQzBsSlJhNzBJSEpOR1dOcDRmSUpjbklpRlN4NWoxNmNaeE41ME13R2FrNnlmZDErWG1IbnIxbjFLUStTRnhNOGN5YUU3cnlMM21JdEVNK3U1djdCL1ZUYXhOODBuTkt5VXpkYzkxT241L0llT0lXUllFdmhHRUo2V1J0aTRDOTAwVHk2dE5HZEZPc1paMTZBdDNjSlB6eTl6T2JSSzk3TnU1aTJJZ3liUlo5NWxGTDU4QjRjM1pRR3VaaStyVjM4WDJaNmZEVmtXWkFSQkVBUVFhSEtqT2UxV25LalJCSWVpRGRDaGJsM3dqcXMyZEh4WEhxWlQyWWQ1ODdDVGQrN3NwMGlXMzl0NzFWQ0p3NkZIYjR3bUpENkNrT1NXMzhkZGR5ZlJJL29qUjExTnh1VWZZQU8waERMZ3J6ZFJzWDgvNW1vYi9vUGlLTjkxRUthNCtpWUVYSHdOZmFhTUFrWVJ0K0k5Y2pjZEkyaFVKY2MyT3BtNDZ5NThOQkIwOTcxa3BWNUxWY085QkhkQS9hOE43WWt4MU1ndmJUUTdLNVpxSzRGaFlRUU1TQ0o0WUhMblFyeDBad2RqTURMeXRhZFpjOHR0NUJocTZmdmlSd1NITnBjelJjNWJTT3lZWVRCbU1Ma2ZEaUIvYnhVeDZ2WGtsdmRuNXIxWG93TDg3NzJEcjJlOGp1WFJPWWdacThrcFR1REtyMjUzTVpza045ZEdocWVtWWo4VVFaazJIbU5xTXlkYzFmcmwxQmluTWY2R2k1R0JRWGZkeUtwRlh6SDh4bEhrcmxoSjc3OStqZkdDT0l6OTcrZkVoMWQyZXIvZVBmdmczZE1YalVaSFNHb3FvWVptb1pHOTRpdjZQdlE5eGdzaUlQa0pjcFplUU1HSmw0anIzWEVKbCthQ1MwbStLZzBCNkRmek0zTFRmeUFtZmpCSGx1d2llZE9QaElhb2tmdmZUKzdTRVJSbE9ZaUpQMzE5VjBEU01IeFYrUWlHdkJiejBJamVDLytPY1dnZ2dmWlpySHJPVlY5ZThQbjdhTWJmU3Y5cG81R0FnUXV1WU1meWRKTFNYSngxS1NrcC9ZRThUM05VRUlTbVpGMEVRVUFVWlVIRXBaaHB2TkQ1YW5BNnJOZ0ZMNWRnYSt6dTN2aWpVcW5HZGpiWkZVVTVMUGo4QUl0dW1FbWlRYWxtLzcyaGlwdkV5SHN5T0hEbkhING90R0s4NXUrTWVHQnVVMzJsVjZDcjVGM1FhUkVjRGlUQVdaSEoraGszNFQxeUtnRVIvalFVMXlQNU5GTlNlMGVFTnYyL1BqU002c29TSEtYbFdDMkY3THIxeGlZYUhxK2tKTEFDM21jeThrQ0d2Zm9NKzE5OW1DLytua2ZBaU1zWThjcVQrSGF3cHh5bFJSMk9RZGRuUERHSml6aGVNSmp4bzFvMkdOR0hOZEovYS9FMit0TlFYazJEc3hpcE1vTnROOXpZUEtvQjhVaUF0YkFZVFV4OHQraWE2b3Z6Y1J6ZHc1WWJtdnNuQlBjZTdqcGZhUjFCWVdGdVZTd0NROEN2S1FnMVl5azFvMnUwbU1SQURHRmdxNndET3VaSTFJVkZOYmtwZE1Zd0dySXFvYVlJczluTW9YdHY1V2pUbStBQ1ZOamM4dVhNL0tycVFKZFRWYVZSSVZ1dHJwRVhGV0Q2OFFpYmI5amNyUGtOYVM1eUNnZ0lTQVkyZUdocnJoOEJBVmtXSktkVGtKMlNJSW9xSkVtU0hlWmFvYWJVS2h0OGZCRjB0cllhMjczMzNxc1NCS0ZEM3VpNmlnSnUrV2diZDg2ZHdiZ0liMFdxbkJkUTAvT1dCK2w1eTRQWVNqTllOMjQyUmRmT0pkcllnZTltNHdvY1EyNWc3TDl1QitENEU3dndERmcyRkRjMzNER1hsZUoxWVRqcU1BMWVobmhHZmZ3cEJ2WFpHWG5nbUZsTUdETUwyVkxGam5tVE9mN2RIRkptbjU0MVFoMFcyZUVZeXI5NWtkenFJY1QzK29XZlg5L0FxRHVhM2NYbTRrSWdCYkRSVUZoRFpFZ0EzdW9JVkpHcFRQanN0VGFGOWpaakJQYmNuZGdrbXVqQVBTRUlBbktyN2lrK0VkRjRwWVF5OGIySDJ3cVVjSC9NcGFWQUhGaUtNVlU3dWl3Z0JGRnExZHRCank1TWo2V3dISHBIZ0ZTRnFSU01YYUJic1pRV0lMczFHVXRoS2Q0UlFlQWZqdDdnejVDM2xoRWVlQWJLU2plNnlPZ2pqZmhmTkpPSlQ3ZlB5S0xSYUVZTUhqeEljK0JBUnF0RVhVRjA2V3VDZ0N6aHROdVJOR3JzWmdzYW4yQjBZZjdvdkhXb1c1bWhQUG5rRTZPQjAxZk4ydXU0YzBrNnV1ZytWQlprczdRQVZQb0E1aVc3aWx5M0h6akV5WXB5ckU0elgyN1BJQ0U4a3FrSm9VZ04xU3c3Y0lyRHA2b3B0VWtzM1FHcEEvcVI2S2RSWk5KWmdDMXJPMGMyRlJDWk9nQkgvazZzMmhoOEFqb3hjYUo2MExBbm5ZS2ZSMFB4TG81OXV3Lzk5RXVhZ3hGclArYm9ta0g0T2c2UnZjL0ErRmY2SVBoTDlCbHI0OGY3bjJmZ0RSY2pWeFZTc0NlUElmZmQxaUg3UnRYKzdaaHFySmhOVGlwM2JrRjl5b3VRMUJIb2RLVWMvTmNLZ3NhTlJFc2w5YVYyZ21QQ094eTNFSlo2MmpFNHM3YXo3UjlyR2ZYTk40VDRsckYreWh4T3BQYW45MUNYaEMvNjVDMXlVaU1Rc2xkVFlyK1FZUmNFb2hXbjB0UDNSYlkvczRRK2w2YmlLRHhHU2JiRUJYK1pqWGJRVkdJai9zMzIvM3VEL25QSFlzdmRneHc1aVo3dTgvbkg5NlhxZzY4NE9UUUliV2dNMGNQN0VUaHBEajR2WE03UGIvWW1ia3dpNXF4RFZKdkNHRFJ2SWpGenJtVGJxNHNKQ2JtZHFxL2VvTDZyY28wUUFtSWNuSGh6S2Ria1NBSlNSdU1ickNOdTFreCtldkZKQW53WFVyL3BBMm9pcGhIVnUzUDkwcjQzblgyZlhZd3hvb1lqM3h4bHlLZmpRZTFMdjVzR3N2dXVoMG4rNnpXbzdlVVViZHBQd21QMzBCbUJ2eW82SG4zQk14ejZmQlgrZ1VHRWp4L1ZGSHhwRDFHemIrVEFKWDhobzM4SXhnRkc2bzd1eE9xVFROOUxoalVwY08rOTkzNnZsSlNVUXpRM1UxWUpJQ0lJSXJMc1JFWkFGR1JabHBGRkFidTVGbHVEQnJtNkZKVmFyUmJjaWJrQ0lENzExSk5YaTZKNGVoK2JaS2ZLcGlMY29NRmlkMkN4TzdDS1dvWkhCd0Z3TFBjVWVWWTFRMk5Ed2VGQXJmY2xLY3dYMlZyUEQ5bGwrUGdIMGkvSUc0dmRRVlI0QkJINjM1YU14bVF5NFhSSzNXNUtYRnBhUm5Cd01DcVY2cHdlYzZialEzQlN0V3M3UlpzMlUxc3FNSERSMDRRYW03ZWpiNzhVRElIdTZKWW1nTEJoL2RIMUhFeGdVQTA1WDY3QmpKR2syMlpqNkpGQVlGdzROYnZTY2NSY2hMNXNENlhIVFF4OCtwK0U5L0FGUk1LbnpFQlZlcEM4OUEzVUZ0WVNQSElzUVhHUkhYTG1sNjFiU2RYeGZIeVRVaEZyQ3pFWGxPQnpRU282THpCbkhhQm8weWJLRHVjUWZjdWpKSTVONkZSN09kMFl5cmR2Sm5UMlh6RDJqVURRQmhBNW9pOFZod3NKR1JoUHhmcFAwSTJkaStQZ0pxcktmRWg1N2duOEEzUWdlQkYxMlV4c1I3ZVR2KzRIVEZWMndzYU93ejhxQkFRdm9pK2JnVDE3Si9scmY4RHFDTUE0WVFRNmI5ZFRxNDBkVEVpVVFQWGg0MWpNV3NJSDl3YU5IejFuVEtMdTU4MFViTnlLMWFvbFl1eDRmTU44TVF3WWdhK1lUKzQzbTlHTm1VMU1TaStDaGc3RnExTlpKQkkrTVExYjFpSHE4L0xSeFNWakNOTGhlOEU0Zk9RQ1RxMWFqODBRei9Cbkg4YmczYmtxYlJpZWhsZkJ6K1QvbkVYQy9jOFNrK3dTMUVHakw4RkhLQ0l2L1R1cXNvcnh1MkEwWWYxaU9pY2k5Z29uYW13L2FqSU9ZUzZzeG45NENvM01aQUhKSTlDN0RUdkJONXl3UVFtSWhraGlMeGxCeFpZMUZHNzdDWWNZVE9UWTBYZ0hORnVBZXIwKzY3bm5uanVCcTkrb0hYQUk0QUNjZ0NRSW9peXFSRmtRQk5SZU9sU1NFNm5CZ3RvUWlLRFQ2VVJQN2pXSHcvNk5JQWlUL3FpYXpmbk94M2FtNHp2YnlIMzlkckpOa3hqL3dPVi9tTFUvY3YrbG1GS2VaT2pjRkVYRi94K0F3K0hZb3RGb242V1pvNjFlRUFRVFlCVUV3U1lJelJ4dFdxMkxvODNMeThYUkpyb1RjcEZsV1pnOWU1WktFSVFSeXBRcThBcUx3eWNpNkE5MVQ3cVlSTHhERkovdy80elhXSzBlR2hNVDB4dzRhTmxNV1d4MG43bVNkUnQvWEtscmFzODBqM2ZmZlhjWW9QVERVMERFN1B1SitJUGRVOXlkTHlvTCs3OEZuMlhMUHU0NWF0VG9ZelQzUUJEZGFSK05wVldDTE11eUxEZm40MHFTMUt5eEFlaDB1cUhLWENwUW9PQjhRZS9ldlh1NWhacG4ya2VqWUtPbHh1YnExU0pKVXN2Q1VwVktwVGdmemlMQ3drSzdGVGdBTUJnTStQbjVLcE9uUUFIZzcrL2ZwNVVaS25yOENLMDBOeVRKUldtazlxQXBFZ1JCdUVDWnlyTXAyTUs2Zll6QllGQW1Ub0VDTnpRYVRSSnRmV3lOeGZCTlRCK2VSZkdlR2hzblRod1BBeEs3ZXNIcTJscHlLK3B4bkM0bno5bTJxYXpWYkNhM3JCcXpRMVpXVElFQ0JaMUNFSVNFRjE1NDNxZWxZSk5ibTZOQ2N6NnVSL0FBRUl4R1k1ZUszcEhxdWV1VkZleTFhd24zY2xKbzEvUHY2NmN4SWt3UFdIbnVvMi81T3F1Y1VpbUFMVTlkUmJUN3NQZFhydVNOekRwNkJIaVJWMlZod1JXWGNPdUFNR1hsRkNoUTBDRW1UWnBrQkNwb0lweEVGQVFFRDgwTmFQYTF5YktFdXRGRzFXaTBYUk5zb29ZRnMyYVMxTU9WMXI3eXUxVXMybkNRMWZPR0F5b21qN3lRV3llYW1mam1uaGFIalVnZHhUVXp3OUdLa0g5MEQ1TlhiT1B5QVZkMFV0R21RSUdDUHp1aW9xSjZBcGx1UWRhaWN4VnRvcU11NFNhNkpaMmdVb2tEdW5ZWnJ5YWhCdEF6eUI5TEU4K01taUc5b2dqV3Q4MTg3aHNWM2xSckZ4YmtoK2l3WTVXVVJWT2dRRUhIOFBIeGlmTVFhcTFiOGpYbHNyazdXQ0ZKa3RDVTVDWUl3b0J1WDlGdTRyMmRXY3hKN2R1TmcyUSsyWHFRWWNPVE1DcWtJQW9VS09nRUdvMG1vWlZRYStGamE1Mm9LOHR5VXdtWUFIU1BWRTJ5OC9vWHEzRWtwTEtnZjljTnloMC9iK1hqY2o5ZW1EUkFXVEVGQ2hSMENsRVUrM2hvYVc2aEpudWFvOUFpZ09BU2JFSnBhVWtpNE5YMVN6bjVkTlZxdG9weHZESzFQMTFWdkE1bTdPS3huMnA1NTdvMGdoVlNEd1VLRkhRTlhpdFhmaEhpSWR4RVdhWUZoNlJuQUVHV1hla2UrUGo0SkhUOUdqTHA2OWZ6V1YwSTcxeVpncjZMVXUzRThRUDhmVk1CYjl3MGhSaHZ4UVpWb0VCQjE5RzNiOTlRVHArazZ5SFVYT2FvR2hEVWFuVjhsNjlnTG1IeHBpeHFkVjZrUGV1aStkV0c5bUw3d2drQVBQbjJCNlFYMjZpek9aaXhhQWxKZzRmeDRZeEIvR2YxRGdvclJhNTUrVVAzaWZTOGQ5ODhCdXFWUlZPZ1FFSEhDQWtKRFc5cmpyYlUyanpNVVZrUUJFSHZjTmhmRmtWeC9wOWhnbjVMMmlJRkNoU2NIWmpONW1YZTNvYWx1T2lMNm9BNk40V1JCYkFMZ3VBUVJWRlNxOVd5UnFPUlJRQkJFR0tWcVZPZ1FNSDVDbzFHRStuV3lzVFRtS0tlYVIrdUx3UkJpRkdtVG9FQ0JlY3JWQ3BWOUdtRW11QWgzQUFaa0p1K1ZBU2JBZ1VLemxzSWd0Q2psY1lteUhLTGxBOTM5UUhJTW9nblRod1BCM1RLMUNsUW9PQThodTdmLzM3SnAzT056V1dPaXNIQndaSEtuQ2xRb09COHg4Q0JBLzA4QkZtYmRJOUdvU2JMTXFLWGwxZjRtVnprVEdpTHpPWUdjc3VxTWRuL1BMUkZzdVJBa3BTaVdBVUtmaTBpSWlMOFRxT3R0ZjVCclZLcHVpZll6cEMyNktPdlZ2TG1VUlBodmxvS0swM2NPR01xQ3dmOXdaWEZ3azBzVDc0ZVZZOElaSnNGcjdnVWhyLzRFaEc5T3k5Qk0rMyttZ1BiSFl5OCswcGxSeXRRQVBqNys3ZlcyRTVuaWdxaUtJcWgzVHE3bTdabyt3UHpXSG4zZFR6UTM0dEZHdzY2djNUUkZxMWFjQkd0eWEydm5EcWQ3UTlkeDhvN3JpTDkycUc4K3MxUFZQd1pWc01ya1VsN2RqUDc0SDc2RG5Hdy9mLytYNHV2SFRWbDFPWVhJN1hROGlUc3hkbVVIdndGeWRFOWpVOEdjRmlveThuQmJwUGM1M045WjZzcW83NjBwczB4OXBveWFrL2w0N0FwbXFXQzh4ZmUzdDUrcHhGcVRkVGdqYVZWYWxFVXUwbUo1a1ZTaitheTBwNUIvbGhLV3RJV1VaUFQ1aWk5UjBkWUNWQ3J4QTRiN1A3eG9DWnNlQXFXelVkeEFpb3NISHY2TGc1dnlNTS9WRU50YlJBVFBsdENRR0FkTytmZlJzV0pIQnJLSk5iTjNRVUJTVXg0OTBtOEtDUzk3K1VNMzdPVFVBTlVmcm1ZYmVzTlhQYkdYMTBLNHBMN09iQlRRc3plaFZQampkVS9tWm1mL0pPOU42VlNJUXhCTmxYVGNEU0RpTCsveFlpYnh3S1EvY0pDOW4yVFMyQnNFTFcvbEhQaHFyV0VOKzBJQy92L3ZnRDFSWGVSTkYzcDg2UGc5NFZXcSszVXgrYlcyRkFMZ25EbXpTTWJhWXNtWGRhbFAvOXB6eTVlM1pYTnlRb3IvNWgzS1VGL2h0V1E2aWpldElscVN3MG5YL3VDdUd1ZVFnVlViM2lQakIwYUx0dTRCaTgxNUx3OG4zMXZyV0xDdzVkejRic3JxUG51VlRaL1pXWEsyL2QzNjNKVk80OXl5YVoxQkFUcmNGb3NUYXV1NlRlVkNRL093TEo3R1YvZXU0emhONDlGUlNsSGwvekloVnN5TUlZRERodk9GbVc4RWpXSDl1RTFzRnA1cWhUOC9xcUJXdTFIeDc0MW9WbU5nTUF6ZTJDN1QxczBzRzgvbmpMR3NHM3ZIbDdkdUorTGJoM1BINzUxaVZSTDhhcHZFWXFQVWFNZnl1UWJKZ0pRdG4wN0drUXlGLzhEQ2JEblZsQmxQUVQ4dXM3ckFSTm5FaERzeXQ1UjZacXplTUtHREFaQUZ4Mk5XRjJOSFZBUlJNU0lJSGJmZGdNOUo0MGxJdTFpSWdaRWV5ci9qRnVmb1R4UkNzNExxRlNxZGt4UkdSQ0UxZzRaRWZEci9pWE9qTGJJWVBDaGQyUVlOMDBkalYvK01YNnMrQk5FUjlWUkpQLzdKY1orc29wZWtjZlk5VnA2MCtRYmtsS0ptanFWSGxPbjBtdmhJNHg5L0phdVNNcm01V3NuSkszMWFaOVZRRkM3VjBsc2FSNFBlWGNkby83dkZyVDJBclpmT1prVGU4dVVKMGpCZVFsUkZIMW80MXRyV1ZMbC9neFJFSVJ1Q3JZem9TMlNLS294TmYxV1dWcE1ua05Mb083UDVHVVQ2WGYvQTVRc2VaN0tHb25RVVNPcHpUeUJmM0lLWVVOVENCczZHRU5Rcy82cTlqVmdMNitrcGVqeXhjdW5sb2JDQnBmV3QyL1ByeHlURFp0SkluajRXUHJmOHpnSlk4T296U3BwOGYzaEorN20yQVpGYTFQdyswTVFCSjlPVE5BbVhqWTFkTk1hUENQYW9yNjhzdlF6dHB0MWhPcEZjaXRNekpsK0VVUC9aQzAwTmJGcDlCMy9MQWYvazg2NEIyNGxhY2ZkcEkrYlRFQ3ZjT3B6ZnlIcWpwZEl1V3FFUzd0Tm1Vb2tOL0xOdUlsb0lsSzQ2TFBuME9GTDcrc25zWFBXeFJ4TENFZHJFTUhuMTR5b2xDMFhYNDdUbUlpV1NtcnI0MG1iM04vamV6dkYzMzZPTm13S2ZTWU9VcDRzQmIrM1lEUFFzdWk5VGFvSHpSSk9LZ0NNdjhYQVRBMG1LaXdPZ24xOU1XaCtIN0xKODQyMnlHbXFvYUdxRG4yWUViVzJhM05pTFN0RTBnV2c5L1UrQ3lPUU1CY1g0MENEVDBUb255eFNyZUIvREVXQ0lDNEVUTGlvaTJxQmVrRVF6SUJWRUFTN0lBaE9sVW9scVlIZmpPclI0RzNBNEsyc2ppZFVCbjk4RGY3ZE9zWXI5R3kraDBUMEVVWmxJUlQ4TDBEWGdSbnFBVmZ3UUdGT1ZLQkF3ZjhDV3N1cWRnME1XVVlSYkFvVUtQaWZFbXh0QWdidENiaEcvbkFGQ2hRb09OK2g2a0JqYXlIZ0dzc1NGSndESERwMEdKdk5wa3lFQWdWbkIySkhXbHA3ZjZoQWdRSUYvd3NRT3ZrZFFCQ0JibEk2T05tWmNaaEZLemR3Ny9KTnZMOHZsMmFkUkNZckw0OVB0KzNsMVkwSHFXM3ZjSWVKOXpmK3hKYjhHbVdKT29LdG1NeC9QVWZlL3R6ZjVmSy92SFF2NlpkTVl2bm9HMmc0aDljeFo2U1RQdjFTVmc0Znd0SHY4My9YS2EvUE9vU3BSdEd3ejJOMFdWYUpnTE43cDY3anE3MkY5SW1ONGRMK1VXemVzb0hIZjhocDNLYTh0MzRQUjRwTGVPdUh6SFlGMitvdDIzamp4d3kyRk5RcXk5VFJRN2JqYXc1OXNKVDkvL255ZDdsK3dqMHZNdTJUNXhHcktqbVhoVy82UWRPWTl1MHFlaVY1NDdEK3ZyUkpKNTVaUVBiT1ltWHpuYjl3bmtaYmE2TzFxUUVib09tNmxSdkE0aHNuTmYwYTJGREdYL2Jud3RoWXdKdG5icDRKTlRsOGMzQm5tME5yaTdOWld1akQ3RGp2YzZvRi9CR1F0M29OdmU1OWlQeVhQNmJXOWpmOHVoQzdydDZaenZIbDY3R2pJV0RrTlBwZk9iNXB4VTFIdG5OczJUZVlheVg4TDd5WWZsZFBSSVdGdkdVZlVyVDNLSGE3bXVCSnMrZ3pQYlhUSk4ySzdhdklYZjBqRFZVbWZBZU5vZTlOczJsa3BhcmJ1NDdTbWlDOFNuNGlkK3RSZk1aY3dlQzVhV2Y4Z2k3NWJpblphM2VCWHhUeHR5d2tOTmJGMlNBM2xITHM3WGNvUDFHRWx6R0dYamNzSkRqYXhRSm9PcnlWSXgrdXhHb1Y4UmswbHY2M3pPaHdnMXV6ZG5GaytRWktqcFlqcm5nVHh4NC8vRVplU3E5eFNVM25PN2IwSzh4V0xWRnpieVEydFE4QWhWKzhnMndjUk9sM0t6RmJmVW44MjkyRUdGMWpzT2JzSjNQSko1aXFyUmppaDlCMzRRM29kUjNmRTVnNDhmcFNncWRjU002U3BWZ2N2dlQ1Mi8wRUd3M0tBK0cyWTdxanNmMHEzZnRJYVRtSnhwQXU3RkViejMzN013dW5Ec05MU1cvdlpLNnF5RitYVGVUVU9VUW1scERmQlMxQ0x0bkpodm5QRXpyeld2cGNkd1dDdWFaSjA3SWNXY09hZVErZ0czb3hmVzZhZzFEVzZENm9vNmJRVHRUczYrZzlieHBGcjl6T3dUWEhPcjFXWFZZdWdXblQ2YmZnZXFUTXovamhtWSthdjl1M25yMzMvWTFUMlY3RXpKcUoybEYzeGhwZjlZYlgrT0haZEtMbTNreGtuSk10Vjk1RXJmdU5lUHpaMjhrdkRLVHY3UXVKSE5JRFM2VzdGdG1Xei9mejdzSTdiUTU5YjVtTEhoT09UcTZqRG9vaUxDME43eEFEUG9NdUpDd3REZis0OE9hNXUvNVJmTkpta25ERk9JN2VlejNaQjZzQUtQcm1YWFkrOXlHaGw4d21RSmZOMWdkZmM1K3hnWjAzWFkreno4WDBtMzhqL2dFU1Zudm45d1Ftc2w1N2tSLy83elg4UjE1TTlLZ0VMT1YxeXZOd2VzRW10L3EzaGNabTVneXBpMDVsSCtiTncwN2V1Yk5mcDMvNzg4NGRWUGRJWm15b2xuM0tBblVJYThaR0tueFNDVGRxa2RMR2NHVHRPdnFQdWI1aldkaFFpY09oUjIrTUppUStncERrNXU5eWxyNU42SFdQMG4rR1MzTUtTUjdtL2lhVUFYKzlpWXI5K3pGWDIvQWZGRWY1cm9Nd3BVK0gxNHE5L25acWoreW5wcUFjLzZUK0hGdXhHN2kyK1cyWmtNYUloMjlEQUtKL3hUemtMbDlCM08wdjBXUEVCVEJpRUlVckI1SDNVejREMHFLeFZsYWlpUXJCTDc0dklRT1NQTForTlZhVENsMVlCSUdENGdnZU5LelQ2NmdDalJoVGpaU0U2TkVrRHNHWTJyTjU3dDcvRDJFM1BFU3ZzY09RZ2I2emg1R2R2b200Z1M3SzlyanI3aVI2Ukgva3FLdkp1UHdEYklBV0s1WnFLNEZoWVFRTVNDSjRZSEtYN3NuMWlKcnBjKzl6eEE4TlZoNkV0ckIwUjJNN0k2dXdvaWlIQlo4ZllORU5VMGswZEJKY3RWWHdqNDNaREEzWHNQN3dTVTdXMk1rckxPWlFoVWxacW5aUXVHNHRHcjJGbzYrL1FVVmVQV1ZyMTJMdDdPR01tOFRJZThaejRNNDVMQitjeXJaL2ZkcmtrREFYRk9BYkY5ZldZVkdSeWRxME5ESlhyS2ZxMEdFYWl1dVJISjN0SFJPN3I3K1lINS85TDVYN0QxT1hYWVJrczdWNFpmb21KcDZWbWxOTFpTWGVJV0ZONzJCOVdDQ1cwbklBK2p6d0FsNTVYL1B0aUtGOGZjbTFGSjV3RTgzN0pESHlwZHM0K2VRQ3ZoaVF6S1lIWHNicU9QTXhtRW9LS2Z2eVRiYmNjQ1BmMzNBanYveFlqazl3czJub0ZlaGlJUkIwV2dTSHcrM2REbVRZcTg5US9zN0RmREV3bVhXM1BrNmRTZXIwbmx3TEdZSnZ2Q0xVMnJWS1pObmNqbmJXbmtFZ3EzRVZsSFlMZFJVRjNQTFJOdTZjTzROeEVWMG8vcFJWakIwWVMyN3VLWEtCN0hvNzl0SlNUbFRFa2hTcytBOWF2NVR5MTI4bGZNSzlxQXhhVkgxSEVwRCtUd29PbXVnMXNLTzVVdFB6bGdmcGVjdUQyRW96V0RkdU5rWFh6aVhhQ1BvZVVaUmtad010TmV2S2pTdHdETG1Cc2YrNjNXWGVQYkdMVXkya3BSclI0V2l4YytUOEhadzRITUdWZTE1R0M5UnVlSTNET3pKZGRIK05iOHN6U0NJUzFDcWtSbnZORFYxUUVBM2xwVUJQd0lHNXRBcS9NSmZid3l2MkFpNTg2MlBBUWRiaUJleC9hd1hHRnhjQUVIN1pRc0l2VzRpekpwOHQweWFRcy9jRytnenZvbEhTcXIrRUlkeEk1T2g3R0hIYm1HN2RUK0NZV1V3WU13dlpVc1dPZVpNNS90MGNVbVluZFhoUGRESi90b3BpYkE0dmZNSUQvNnlDemVRaHpEcjBjS2hsV2E0VmhHNjhYKzExM0xra0hWMTBIeW9Mc2xsYUFDcDlBUE9TWGVyNzlnT0hPRmxSanRWcDVzdnRHU1NFUnpJMUlaVDdab3h2T3NVckgrZFRsVENJeXhOREZUbldXb3ZLLzVIQzNKNU12ZSsycG9DQmZQQXI4amQrVDYrQmw1eGVLYzdhenBGTkJVU21Ec0NSdnhPck5nYWZBTGZwZU0xOERzOTdpc3g0SFdGeHZwUituMEhjWGJmZ0hkV0RoajNwRlB3OEdvcDNjZXpiZmVpbmUxekRweGVoc1VWa3ZQQWhFWDBpTVU2ZGpDNHdDbS96UWJMVzdTRFlZT0x3cXg4RFEzNzFmWWVtam1EWGYxL0JJRTNDZjlDRmhNU0YwblBPTERZOCtTL0M0eDVDeWxwTmZsRWlGMS9vTXRteVAzZ1ZvZWN3ZkVNMVZKekl3eWY1S3JjcGNZZ0R5L1lRUGlZRm9TYUxCcE12dmwxMHZ2djFUdURZOG5meEZjZmlIVGVJME40UnhONndnTU0zUE1iUnlDY0o2ZWxIOWQ0ZkVIdlBvTmVvdUE3T1ZNckJmNjBnYU54SXRGUlNYMm9uT01ibHMrdm9uanJETDA5ZVQyYnBTR1o5OXVTZlZiRFZkNkN0dFJCMnFpZWVlT0pLUVJBU3UrN1l0bE5sVXhGdTBHQ3hPN0RZSFZoRkxjT2pYUjBNanVXZUlzK3FabWhzS0RnY3FQVytKSVg1dGpsTmRIZzRzWDYvZmJjT3Npd0FBQ0FBU1VSQlZBTjZrOG1FMHluaDU5YzlmczNTMGpLQ2c0TlJxVlRuOUJoclFTSHF2c1Bva1J6ZjlKbDNsQkdIWFVOby85Z09WQjRuVmJ1MlU3UnBNN1dsQWdNWFBVMm8wV1VtcVVNVGlCazNnSksxNlJUL2ZBaDk3MVRDQjhiaTFYTXdnVUUxNUh5NUJqTkdrbTZiamFGSEFvRnhqUjBaTlJndnZnanpzUXdzSlNZQ2hxYWc5UTdGbUJwTHdjb3ZxY3F0cDk5ZHQrTWRIa1Y0Y3JQNTZSVVo3M0dPcnNFM2VRdytZaVcxV2Jtb0l4UHhqd3hBMzJzWW9VWWJwNzVLeDFRZnhKQi9MaUlvMUVWRzQ2ak1wV2pUWmtwKzNJY2hkUzdKdDE2Q1NnUkVnZHFNSFJSdDJVVGxMMVVrUHZnMDBmM0N1cVpsRFJ1UDJseE0zUzg1NEJkRllHd1k2ckFFWXNiMHBuaE5Pc1UvSFVEd2pjVTRiamc2Z3l2TzZ0c3ZCVU9nZXg5ckFnZ2I1bUtVTm1jZG9HalRKc29PNXhCOXk2TWtqazBBNlBDZVhOQVNOR3dvV25YN1l6VDBIa3pvZ05nLzUwdmY2VHo2OU5QLytCbFhFTUhhK0s4Z0NIYkFLUWlDSkFpQ0xBaUNMRGlkam85RVViem16ekk1dnlVZjI3bmljRk9nNEUvcHBMRllWdXIxM3YrbExSOWJBeTM0MkVSSmxHVzVVcGt5QlFvVW5POXdPQnkxSGlhbmZIcGZtNEFveTNLRk1tVUtGQ2c0MzJHMVdodkxsVm9MdERZQ1RuUTZuZVhLbENsUW9PQjhSME5EUXgwdGszSlBHeDBWN1haN2lUSmw1d1poWWFIZENod29VS0RnOUtpdXJqNmRLZG9rN0JvelBFU0x4VktxVE5tNUVteGhpbUJUb09Bc29haW9xSzYxUUJPRU5tVlZzaUNBV0ZSVVhIUkcwck8ybHR5S2VoeW5JMlJ3dHRJUUpSbUhVMnI2a2FRL3o0TEk3bngwdVIzV2xkTVZ1elY5TGlrYldvRUNnSXlNZy9YdVIwTnFGbTVDTzQrUGdIcnc0TUdsa3VTMDRPb0Ewem1rZXU1NlpRVjc3VnJDdlp3VTJ2WDgrL3BwakFqVEExYWUrK2hidnM0cXAxUUtZTXRUVnpYVkNuNjFialdQN0NqQXo1MmdNL3JDVWJ4d1VlSWZmelZxOXZERnBIOHo0K2NuU0I5d0Q1TU9yMnBxNUpxLzVCNU8xa3lnbi9FQUI0NGtNUEdwdVUySGJadVFST3lIaHlpOEo1blFwM2ZUcTU5YTJka0svc3l3M0gvLy9RMGRtS0l0L0cyTlQ4c3BvR3RTUnRTd1lOWk1rbnE0MHRwWGZyZUtSUnNPc25yZWNFREY1SkVYY3V0RU14UGZiTnVsZk9xRUNidzRQa0ZaSWdVS0ZIVFA2cEhsdkZZQ1RQTFEzRnJxYTRLQTZEcEc3Z1pOcTFlVFVBUG9HZVNQcGFuR1Q4MlFYbEVFNjl2WExxcXJxOWh5Sklmc0dzdWZhRWtFVkY1ZWdJaEtyMjlSSEM2cXZCQzFJb0pLaGRncTFWelU2MEVFMFV2djRqbFdvT0JQREtmVFdkQktxTFh5dFFteUlBZzBCZy9VZ0N4SlVzNFpPYm50SnQ3Ym1jV2NTWmQxK3FjYUx4MzJrbkpXN1M5aDYvSjFUSjh5aGNjOTZHSCtzUEMvZ011M0xnSGcwdDNMVzN4bHZIRXhybGJGMDJoTnhUanF1MTBBOVBoNGg3S3JGZnpwWWJQWml0clIyTnBOK1JBRVFWWURzdFBwek82MllKUHN2UDdGYWh3SnFTem8zem5OeXJRSmFVeHovMzlaN21FbXZMZWQ2eS9vU2F4R1dUUUZDaFIwalByNitxSjJUTkRUK3RsRXR6UTgyVTNGa0U5WHJXYXJHTWNyVS90M3U5VlZhSFFrVVk1NlRpbjg0QW9VS09nQ1NrdEx5K2lDajYzUkhCVUJ1YXFxS3F2cmw1QkpYNytleitwQ2VPZktGUFJpMTQ2cHJEYzMvWloxN0NRRittRDYrQ2dMcGtDQmdzNlJtWmxaNFNITXBFNU1VUVJCRUx3QnJTUTVpd0d2VHE5Z0xtYjBvaStvMVhuaEpib2NkZHJRWG14Zk9BR0FKOS8rZ1BSaUcxVm1CLzU2TDVJR0QrUERHUU80NzVYMzJPUHd3Vjhqa1ZjcmNlL3NxY3pyRS9LYlQ5QnZ5ZTZoUUlHQ3N3S3JJSWpYNG1walVJK0wyYU5PRUlSNjkyYzJRUkFjb2lnNlZTcFIxbWcwc2lBSWd0NHQyTFlBeWVkdWJCSmwxZldZblFMaEFiNTQvVTRKK1lwZ1U2RGdmd3VTSkdXb1ZPcEZ1Tm9ZZUFvMms0ZGdjN29FbTByV2FEUnlZNDZCTEVsU3BpaUs1MUN3aVlRRytDbXJwRUNCZ203QlpyTmwwZGEzMXRySEpudVlvWWlDSU1pQTdIQTRNcFVwVktCQXdmbUd1cnE2M0hZRVdwT1ByWFVPVzFQd0FKRE5adk5oWlFvVktGQnd2dUhVcVZNRnJRU2FrOU9rZkRRS3VjYVlwbno4K0FsRnNDbFFvT0M4dzlxMTYwcmNnc3ZwSWRUYXBIczBtYUdpNEtvOEFPVFUxTlJ5U1hLZUFIci9wcU4rNTlLMm4xMXdOYVRNVTFaVWdZSS9PV1JaL3VYUlJ4ODF0elpEM1hSRm5wcWFoM0FUbTRyZ1pVQ1NKR212S0lxOS84Z1Q1VldUaTZvd0U2cTcxNVRXNzlRcFJNY0pVQ3NzR3dvVS9GYXcyZXlIMnpWRFpTUUVXUUpCUnBaQmxtUkJsaEdjSURqa3B1QUJnR3kzMi9kMWZpa25Pek1PczJqbEJ1NWR2b24zOStWaWE1YXZaT1hsOGVtMnZieTY4U0MxclczbC9CeWUrWElqOTYzWXpFZVpoWCs2UlNyZnQ1bXhUMzdSNHJPVDI3NWwrcjlXdC92M1A2NVp3ZWpaZDVFODYxSDIxbmg4NGFobDBaUC9ZTkFWZDNQSjRxOS8yNXR3RkhQdFRROHk5SXFGWFB2R0QxMCs3SVVuSCtHL2U2dTZkYWxsLzNtTjBkZituZWdaejNBMjJWQy9XN242LzdOMzduRlIxZm4vZjU0ekY0WmhHRVlZWUVSRVJGSkRSRU15SkRVemM4M016Rnh6eTh5MXNqSXoxM1ZiYTExei9mVTF0MjI3bUd0bWRqTXoxOHpNVE0xWU5EUFh5c3pJQzVrUklSSWlJZ3pETU16bGZINS96SVVad0d2cVZzNzc4VGdQWmM3bDh6bm44em12ODc2K1BwelI3SE0zc0t1b2xCTXRLTC9talpmSkdUV1pubVAvU2NWNWUvQXU5dTByeHRhTW4yLzVpMDh6NS8xdnoraEtCYXRmcCsrNDZhUmQrd2QyMjg1aEZ4VWJVNmJQNDREOTNKRUlIcmZhRHJaaWhnYjcyUENUVFVwSXlGSlQ4QUIvWk5ScXRlNDZkZWZyV0xPcm5DNnBIYmdob3gyYnQrUXphMnVKYjJjREwzLzRCZnNyanJCbzY3NFFZRHRXZG9EZnZicU51TGJKREwwMEdkbmx2dWlBemUyb3AvUm9iY2h2c1IweXVPdnFMcTBjWGNmc2Y3N0h6UGxQc252Vi81RWQwN1NuL0xPUGVMazhnWjJybjJYOXd6ZGUySnRRVzFqMnl0K1pOeXFMR3J2cjlFSDlhQ1ZXdStlTW1ycjFuc2xzV3pnSmRhMlZjL0dxNUc5NGo0SUR4eml3NXh1cTdjZVovL0phcWs1bkd0cExHWDcvaTdTNk9JaTltQmt2RnJKczZiUHNYdlpITE9mdHdkY3ljZEpjaXBvUjQxaXJxNm11ZDUzUmxRYU92SjF0Uy85Q2txdnV4RVN4WnlHRm05YXlyMDBXbmZYbmpvNm1xUGpRRDgyMHRXQWZtNUQ4NE9ZRE9GK3FoMUFIMjZtalI5K3lhL1BtQWh0dzRtSW4yY1RqNDY4Ti9ObkdmcFQ3ZHY4QS9WTUJQZjgzWVFUVWxyRDI2MDlEVGx1eGJSZlhEUnJJdmJsSkZ4V1lPWTRmNXNtWDExSmNyMlZvdWk3a0M3enN0YmNvc2lwWUxzME9PV2ZudHYrdzVzdHZLYXgyczNybFcyeFRSVEx4enB0SmliU3orTVYzMkxYM2F4eFZHdVk4dDR6WWpwbE1HOWJ6WjNHdmJsc1ZpMWZtcy92N0NoU2RrZEUzM2NEZ2pQZ21jQ3Y5aG9mbXZJbE5uOENVMzQrZ2E1eTMwTVYrL0RBTDN0aklubklibWJsOW1UcThGNmRLZzFZYWpyTm8yWHZzK1A0WXNZbUpqQnM5Z3V5MitwTy8wQU91WXRuS3RiejhTU0ZibERVOE5QNG16S2Z3TEd6NVlCMzVYeGRqclQvTUU4OHRRNC9NcldQSGtORkdKdi85dFd6Wjh5MWxqZ2FXdlBRbWVsMGMwKzYrRHRNSnI5YkkwdGMzVWVPcTVxQTlnYUdkbkt6OC9CalQ3NytkakRnTnV6Ly9oQlVGZXlpdmJTRHQwaDVNSFhNMUpnM3MvdTltVnUwOFNJbTlua1dMbG1IUlNBeTk0VWJ5VWcwK0JiNktKeGNzWnM5UkdELzJ0d3k0cE0xUEdFUTd5OTlZdzZadmptRHBlQWxUYnh1S3hRZFVaVVc3ZVdMRlJ5aHRraG1lRlk4anRoUERlN1FMV0hLTC9sM0FyVk9mRHJIdVZpeC9CMk5xZTlaLzhDbTZ4STVNLy8zMVdIeDFtRFVsKzFtMjMwbU85a2VXRkJTUjBPa3laazY0Q2owdTFxOWV4Nm92ZnJDOXNXSHJrV1phbWdkUWhOY2M5Vk9EQzBsQ0tJcUNyY0dEcmRHRjdITzZDVUQ1NktPUEZDSEVqak41RHZzcnEraWNkS3JTS0JkN1MydUpFY2U1Yy9GYjNQcnlCajc0b2VaaThCQXdmZHBzRHVxN01HbFlOc3ZleVEvYXB5STdweWRkdFVkWmxCK2FRcGpjSVowaHVkMHdTUkhrNVdZekpLODdSZzJBaHQ2OUx5T3ZjeUlHY3lKRHJzeW0vNlZ0VDlvRDY2RUR6Rm40SnJPYmJadUt6djNpWk03cUNxcTFDWXkvWlRoais3Vm42b04vWVh0Vms1YTI1SjB0REJvMmhOeW9IeG55aHhleEF6UWNaZFNFUjZtTTZjeVVXNitoWk5QclRQLzMxNmRzYThuOHAxaC9KSnBwZDl6STBPNEpWQjF2T09VNXhRZjJzK09IT3BMajQwblFPZGoweWQ0V3BsMXpTZXQ4S1VONlg0Sk9ZNlQvbGRrTXViSW5DVHJ2aTVuZTlWS0c1S1NqMHhrWWVHVTJneS92Y2dvYTZrYVd2dkltY3FmZWxIKzhuTVY3dGVSR1ZmREV1MThCY0xDa2dwd3I4NWcyZGdnY0tHRE1zNXNBU0VycHhKQXJNNGpWYU9qZE81c2hWMTVHU3BzbTZGKzk3aitrOWVyTHNJNkMwWDk1aVovQ0xmSHFNLzlnZm1FOUUyOGRSdXlQWHpENHJ5dTg2bEZ0TVVNbnpTY2w5eXBHOXpJeWJmWjhWbjhaWk5EYmZtRFRnU2o2ZG9zT0FiWlZiNzdCak5jL1ovU282NGl0M01uSXVVMnVrNW9maXBqOTVIUE0vMjhOSTYrL2lsU2RDd2RRc0h3SlU5NzlqdHQrZTkwWFRwZGJhY1VFOVp1aGlpS0VrUERxYlkxdUJZMUdUWXhlRzRpS0JzRE43WGJ2MEdnMGcwN25JWlIrdjVmbjkzcDRjZktscC9vTVlITzVXYi92Q00rUEdZYXQvQnNtdkxhUmpnK040ZGRNRHE1VTdHWEY5M0hzZVdrZ0ZobG0zdDZmVVIvNEg3ZE1ScmNNNU1PNzRmdlE4eXp0TzJCcHI4T2dpU0NuVndhWkFhMUNRODhlR2FqTGQyTW9qNlJ2ZHNhcExVZU5sZ1J6U3gzQ29EbjNOVzM2bEV5bUQ2L2hzMisrd3laTVpDUTQrR3hmTlhuOXZWcmJtTnQreStEc1M2RG5IYno4MW4xc09UeUoxRDBGN0V2c3c2clJWeUFEYys0Y1NzYlRXNWwvUy9lVHRsVjkzSXErYlF4cHFSM28yU1h0dFBvbkd5ek1lK1ErWHA3N0RFTm0zQWRGM3lPZndtcEs2ZGlKbERnM1dtMDB1ZGtaSWFabWFxZExTSTJwUnhjUlRWNTJ4a2swdGVEdldSeUQrbDJLODBNelNxL0xHT0NwWjlVWDNvL01xTi9lUlBHM0J5bjZzWmJNcnFuTVgxY0VEQ2FoWFFvSjdmUVlOVnF5c3pQSWFhYVlEaHgySFNQN1pNRGwwY3hlT0k4U0oyU2NWZVZmRFV2WDcyZm1xNCtRbDZJaHI5TTRsdlNmeTI3N3JjZ2ZmNEl6YXhEVGgzaXRnd2xYZjBoaDhFZnR4ekxLWXhKSWFVVUR2dmZPMituZlBZYitLV05ZK0p0RkZEOTZFMm0rNCt5R05CYlBIT00xRWZNQUZKYS8vekZUSmovSFpSMjFlMW94UXoyQVI1Szg0Q1lFSUNIOGE3cW8xU29pSXlKUSszSS9oUGNnSWVycTZqNkxqWTA5NVNNNDltTUo5N3oxRlhQdUdFSG5xRlBaMUdyMGFoalcrekpTalpGZ3pLSlAxSFkrSzdmL3FvSE5XVk9MclUwY1p0L2pzY1RHQXhkMlVUQTVRb2ZGM05JME1lcFBIZDFkdHVCSlpxN2REOGc4OGR4OFJuZUpQUG1IYmxjK2cyYSt5NUJCdVNSRXFhbXllM0M0bS93L3lXYmZ2SktOV0dKY1ZOWTBJbGRXWWozNERTTWZQQlE0cm5mSFMxSGdwSFJZOTk1L1A0OHNXRUgyc05mUkpYWmsvditieXNDT0p5L1pTK3ZVQVlBaE4xOVBFbURzMnZIQ1R3cFpqVm9HV2FWQzFraG9aUlgyUmdFME1IUEtJMndScVF6cVpvSGpWVGhjcHhlQk54dDk5NjFXb1ZhNVVjUloreEtvckRWZ01mdElFaU5OSkVUWktEOE82dG9hTE9ZbVd2K0UySmpRanppZ3lGSXJGOVdRbE9BN05pYVdCTWxLcFIzU2ZGMU83cGpjek8vVlNFVlZJME1zSmc2VWZGdmNHcWdGKzllRWQwT1NaYlFvMURjNHNOa2RoUGpZQUdYU3BQdDNyRmp4WmkwUWM2TDdyenQybUR1WGJXUHltQnU1eXFJL2pTZW1vV09pQVpmYkhYZ01MbytFUnY1MUwwMm5qVFZoUEg2TUtnVXNNbFJVSGIzd1ByN3FvNnovNlBNV3p2Y2hwbFF5MjBhZjlOeXhrNmN6ZHZJSjdrMmp4dUVLRFFhc2VtY0RJeWRPWmQ2SVRvQ0w0aTN2aE93dnE2b0N6S0JZcWFqVmtSUWJRWEpDQWdsWmJkajQxTmdUYURncVpMZW5SVVRTMUw0ekMvOCtDL0N3YlA0L21QbmFGcmJQSG41YXo2UnJ0elBNYUpJbFpNVnp4Z0VNbTdXV0tyc2cxWElhdXR5UGUxbjRUUnlsSHp5SUFTaloralpQZkZFU2RJQUUwcG12N3VhMDJ5Zy8za2h5dXppYWtjK2pWU2s0Z29kUWJTQWh4a1pGbFF0U05HQ3ZvYkxlUUZJYjBKbmpLZDNXRlBNdHF6Z0tRZDhSWFdJOENjY3JLVmNnVFE1MVE1VWZxWUVVRTlSV1V5bU1tSU1nUTI0QmhoRll6QkdVVjlUVVB2cjRNMlVuQUxXUWtpclpWM0VRcWRQU1Jxc1JHaFZlalMxSXhNcVZLOTNMbDcveHNTekx3MXAzbDlVeCthWDMwU1Yzb2Zydzk3eCtHRlNSSm03dDZhWDUvdVNyUFJRZnE2TFIwOEE3bnhTU250aVc2OUxqdWJIWHBVd28rQzg5alRuVUh6N0k1NHFGdjdhTCtGVURtNXlRd2EzcHg1anh3bVltWDJIaXNUYytob1MrWHNDcFBjcTJmWWNwUGZBajlxTnE4dis3RzFOQ01qbWR6aTJWazZsVGR4Yi9yZnM1djdlczd0MG9ldWtkRm1mcFNVMXV6K0FlSFVocGw4Q0tyVnZZMlZWaTM4Y2ZzUDRISlVRalgvbkcyd3hPR1UzbHArOVQycUVmZmR2SzZFMERTVnYwQ05OZWE4ZXRWNlJRV1ZMTUhuc2JIaHFaNHowcHFoMEQyaDlqenZNYkdOekp6TUNCbHhPcmhsWC9YZ1h0dXRMWnJHYm45NVdrWjE1ei9nWlNuMGhYZFJrTFZueEVYdHNvY2k3UDRYUys1eHZmWE15WWRSNXM3ODA0OVJKd01mRWtPYjVqMlVkN3lORTdlT0tsRHduTmxUZVIwZDdEb3FVYnFleG1KaU1yaTdRMnA3WTNDemU5emVWemQvSHRaODhTdW94U0RQMTdSUEhVb3JjcDcyVWhMNjhQeVFZVDQ0WmV5bVBQTGlYMnp2NXNXL1VtdXY1WDAxTVBjcjkrSkQ4OWsrbXZwWkFUV2NXcm54NGhOM2h3amVrTTdsakw5cUlHMGpKQ05mdEZMeThqTS9JM2JGKzFrdVJyQjVCK1VrVlU1dGJyKzNIUDh5OTlldkQ3OG1BejFCMENic0svTXFXdlJsUW8xRHNFa2lTanVEMm8xR3ExSklSQUNDSDV0SC81NFljZlRsQ3IxYTM3MlJRWHg1MHFFcU0wT0Z4dUhDNDNqYktXM3NsZU0rT2JIMG81MUtnbUp6VWUzRzdVa2RGa0prUmpUa3lpbTc2UkRWLy93STlLSkErUDZFY25neHAydmRteWpiYmRJYW43ZVptampkWGxLSFZIMGV2MVozUmViVzB0MGRIUnlQS1poTEpWRE9pWHc0R2RPL2pQL3FQY2Njc3dPcVVra2R1NUxiYUtVbFordklkYUtab2VTVkdVVmxSaDE1ckk3aGdNYkZwNlpYY21xaFVOUHlvdWdaeU84Zjh6ME5hWlV4amMxY2dYUlQ5UXI0bWhkM29pR2QyekVPVUhlUHVqUXFJdTdjdTkxM1NrVTNwblV0cDRQMkRYWDNVNS84bmZ6QTlTSWd2K2ZDdUprU3JRUkhIemIzTDQ5c3N2V2ZmSlYxUTZ0UXpzY3hrZDR2UUJOOFkxQTNMNDhidGlTcW9hNk5HakM5RnFzTmRVc09tVFhlUi9mb0NVN0VITXZqV1hpUE8xNkkyazR6Zjl1MUY4c0pqaThtT2tYWnBCZkdUUW9HZ005T21SU212dmEzeFNDbGQxVHdreXExWDA2SkZPSkpEY3NSUEpNVnAwSmpPWFhaTEc0T3kyckZ1L2xjL0xHbmhnd2syMGl6ZlRyMXY3d0F0L1ZiOWVWSlY4ejdlSGo1S1lrazU3azlZWFhPaElla0pVWU03a1pIY2gyRHNVYmJZd29OY2xOSGNrOUwzeUN1b3JTdmp1eCtPa2RlMUdnbDZpWisvZTZLdS9aK1htTDlFa1o3TGd3WnVJMWtpZ01YTFRvQ3dPZkYxRWpiNDkvUklhT0dycXlnM2RMWUg3U2hCVkxOaFZ6MjE5T2dhQ0J5dmZmSThieG81aWUvNFdHaTBaTEhqZ0JxSTBUYzlPWnpMVE96MDBTYVpqOTU3RVdnKzk4ODcydlljQUo5QUlPSHovT2dHWEgrQlVzcXlvSkFtMVNrWlJCRTYzQjZjaUllbDBPdG50ZGt0Q0NGa0lvUkpDYUV0S3Z1K2VrcEt5N1lLOElSZTRwS3IyMjg5eGwrOGpMdTdNS2c5S1MwdEpTa3BDSGE0OENNdEZLa1hmZkVkcXAwNm9uY2U1OWZkL1pPak1weG5mUGNoajVhcGgxTDFQTWVmWjJXUVlaTURKcUJ2R01YYlJDa2FjR2YwaDcrUnZ2Mi9rSCtiOVNDZ0htMDJDZWlRYUpTU25KT0dSSkVsUnk3TFFxbVVSb2RVUUVhRVIvdUNCa0NRSjRZMHZDRUJKVGUxWXBDaWVQVUJtZURqREVwYXdBR3o5Y0EzalpwZWhTSkVNSFRXSmNkMmJ1ZUUxSmxhOU5DZkVMNWpldFJPeFo3aGdreUxFdnBGL21IZXNtUm5xcG1XNmg1QjhPV3orSUtoS2tsSEpFbXBabGdueXN3WEF6ZTEyRjZqVjZsOGRzTGtqWW5ESHBrRkM0cG1ac0xVU0lqNFZOT0ZsdGNKeWNjckVPUzh3OFF6UG1mZmFXMmZjVHIydC90TVQrTlk4U0pJWDFDUUVrb1FreTk0SXMxcUxTcU5GMWtZZ1IrZ0M2UjVJa3VSVDJyeUlhTFZhdDhUR3hrNzV0UTJPUjJmQ0pVZEJ3cG5weG8yVkxrVDhKUkNtQmc5TFdNNnJmRk82Y3graGFSNXV3Q05KVXBER0ppRkpzcEJrRlpKS2c2elJJbXQxeUZvZHFnaDlrOGJXTEo5Tk1admp0eW1LNXpEUTdyemVSZmJ2V3Y3V3RudDRkTU1TbG90UWhCRGxsMS9ldTdTWkNlcmZmSlJGVWdocnJpekxnVTJsVXFGU3lWNWdrMlZaZUR5ZVlGTlVBQjZQeC9PQlNxV2FjRjd2Sk15N0ZwYXdoTVVuRFEwTlcxdlQxb0syRUI0MldaYUZIOE84d09ZRk43azFqYzJQakhWMXR2d1RkYURHYXVXSFk3WVRzd040UXRPZkZVWEI3UW5kZnZXaVZMTmk4U0lXTFZyRSt1MUZ2N3JicXlrdll2V0s1U3hmZHlFQzZFNEtWcSttMG5FUnZOMk9LdGJuZjNiQzNmdTJiNlN3TkxUV2V2ZVdOUlJWdEY0bFdsbThrNVhMbDdObXkrNW04OVBKWndWcldiNXNHWHRLbTdoNFBpdFlUNVh6ZjNQckJ3OSs5MVV6VUhNRDdsQXpsQllhV3hPZ3FWQ3AxRjVnODI4UTREWVNnQkliRzVzUEhBNTlHRFllZVBwVnJsKzBqajhzZTRlK1Q2M2l2NVgrQXVSRy9yN3NiZkwrOWdMcGMxWlNGampKeFVQL2VvMis4M3piNHk5ejZjd2xmRlFqZnVVelZNWmdNRkM2NHkwV3J0N3hpK3U5dTJRTG82YzgxZnBPNng0RzVWM1A5cUpTS2lwck9QK2ZLVHRQVEh1UXdvdUFPMkhkTTM5aS9iNFRFNld0WC93d3E3ZVhoZnkyOGRXL3MrMkF0U1ZHbG13aWQrQ2Q3Q2t0bzdJNjlPR3RuZmQ3N24zaWJjcktLN0RhbTJvN2JIdldNSDMreHYrSkdkcWpSNC92ZmVEVjNBeHRLcVh5RllZR1k1Y1gwSm8ydFUrRms1clNQaVFoU1NoQ0NBVlFQQjdQQnBWS2RWZlR1NnJobmxFanlHenZMUk5admY0OTV1Ui96WVpiZXdNcUJ1ZmxjdGVnQmdZOS8wVlFselU4K2NEdkEzK1ZGMzNKeU0zSDZXT1NmdVc0Wm1MWXJXUFJWWDlDWWNrSnRKN0tNbXJjT2xLYk02UW9Uc3BLeTVBTlpwTE1vVFdRRGxzMTVaVld6RW5KR0hYbkthOU9VWERVbExGcCsxZTQzVzZRWmRUKzVHUkZ3VnEwazFMTFFPYk5uTzZkV0tkMVRVQUdlMDBWbFRaSVRXNjZaNmU5aHJJS0swbXBLZWlDTCtaMlVGSldpU1hsREpkdVZKeVVsWmFqajdVUWE5U0ZkS0t5ckJTMzNreFNyT0gwQU41aHBjb0dsbGd0WmVVMUpDVmJtdTdYTjA0NmN4Sm1RMmc3MVJYbFdKMXFVbElzSWM5SEFSUzdsYklxRzhrcFNhR0p2YzVTNWkzWnljTGRyN1I0ZUJXbHBlak1MV20vRkxlYjZVcytRYTJXVzFoSnhUdDJZT2g3QzdPbVQwT1cxU0huYk4rK2czRlROak41Y0doKzVzRHhrNWlhL1FDbFU0YVFjZ0ZqWlhhN2Zjc0pmR3VlSVArYUFnRWZXOEFNOVd0c2FyVUt0VnFOMm1lUEVteVMrc0tqQ3VDcHFhblpFQmNYMXdSc1JKRFp2cWtVS2lVMkJzY1JmNkd6bXN2UzJrRnR5VWx2NEsyZGV4bVdmVFVYZFh4UnNURjMvQTI4V3VnbVJWOURsYkV2RzljOGowVUg5cklkREI1MEc3cjBuc2pXTW1MNzM4K0t4OFlCc09YVnYzRFgzUFZrWmFaUWV1QUFNNVovenFnc3d6bnYzaE9UaDdOKzV3L1lEbFF4YU1oMXFPVkVGcTVkUm1jZFBEWnhDSnQySDZibVlBMURobHlIbkhvVkc1Zk1QQ1c0amUvZEJuMy9DV3pOMzRKZWRqQmd5Z3M4TVNHUHRmTWZaT3FDcldSME5sTlUyc2lyYTliVE44MklyWFE3Z3diOURsMTZGZzZIaTVvZ2pxRXhtWkdNV3RYQXFLNVFzMk1KWGFkK1NzV09Gd0U0c0cwcG84Yy9TbXpuTEp4VkpReWE5aUt6eC9UR1hyNkwwU051bzhxWUJsVUhTQjN4S010bmp6MXB2OGZudHFYRW5FdnBycy9vbXRzSGEvRlg5Sno0QWdzbURhUnkzeVpHanJrZmJYSUdOUWYzTVhENjh6dzVjUkJRd2Npc2ZsUW1kQ2FXR2c1VW0xaTUvbTJ5TERvMlBuTTNqNnc5UWl5TjJLdUtjR2JjeWZZVnN3THZRa25CS2lvNi80YVFJWFZXTVduRU5XeXJTY0NFQTdldG1zRkRmSXB6NFRwR1RudVdvbDNibUw3OFc2WU9TZmFkVk1XVWtiOWo1OEVERkZmS0RCbXlHVXZ1TFN4NzdDNUt0eTVqd3B6WEtOcFZqcUg4TnRZOXBXUGNySmNZMTk5YkZvbXhKNE03bDdPcW9JUnBRMUl2MkN1eGI5LytMMDlpaGdacGJLRkJneVlUMUd1R3F0VnFTRTV1aDlsc2xxS2pvNldJaUFoWnJWYXJaRm5XU0pJVUtVbVNVWktrQkNHVWZVSW9vc1htckJQM1BmT1NXTGozYU9qdk5jV2k1NnczeGFGV3puSFZIUko1czVlSy9RMnRYTzhDYkVlT1ZJaERodzZkOFhsZmYvMjFhR3gwbkZXYkh6NTNqN2orankrSC9QYkRCMCtLeEY2M2lGcVBJb1J3aUQ5ZmY2bDQ4SVd0UWdoRi9PZTVlOFhWOXkwTUhCdmM3dTJYeFloWFByZjYvbmFLeGtiM1Nkdis4YVBGb20xaW9raHN0ajM2eG1lbjdIZkQxOHRGVEs4N1d0MTMvUE9YUmVLVjk1elJjN2lqVjVTNDVyNW5oTXQvL1FhN3FQMXFsVWpzZUpYNHZ0WjdIMSs4TVVQMHVuMnVFRUlSejk3ZFIvenU4VFhlOXI1YUlXS2tSUEhoajk1emIra1dJZDdhNyt2TGZ4ZUx4Q3Z1OUxiaktoTlh0NDhYcjN4UzVtdlhMWTRkcnhGQ0tPTFJtN3VMKzU3Tjl4MVhKVzdzMWs2OCs2Mzk1SDIrSWxHOHRkOHBYdnZ6OWVMMmY2d1J4ejVaSXJyOWRvNFF3aVorZjNrNzhmZjM5d2doRk9HcDNTTjZ0YjlVZkZIckhjL2EycWJydnZibjY4VHR2dnZZOFBTZG9sMi9lMFc5VUlSb09DaDZ0V2tuUGo3YTFONWJmN3RGM1BqdzBwQStmUEhHSTZManRkTkVvMUNFYUNnVlY3WFRpRWZmTEF3NTVzL1hkeEJQYnlodE9XL2ZuQ1Y2M1BGRXEvZjJ4K3M3aU9jK0xHOTEzK3NQM3lodStkdktDL1plS29xbkNCZ05EQWNHQWJsQU55QlZrcVFFSHhaRnlyS3NVYXZWcW9pSUNEazZPbG95bTgxU2NuSTcwdFBUeWNyS29rK2ZQbHg3N2JXb1pWbmxqeWhJc2l3TFJWRWtYeERCYjQ1Nm5FN25lMXF0TnBSMFRYSHhyN2MzNEU2L2duc3lUcjg4YWR2Ty9jUmYycFd1T2k1cTJiWHJTM3IydlFhakRLQmx3T0E4SHR1NUd5YjJKYk4zZnc3TS9UUGo1Ukw2NXZWbDVNaWgrSW1rQmd6c3k1eTdidVRBeU92b08yZ29RL05PenNsbTZYOFg1UlYzL1d4OGptUEdqZzJZWGpxZGpoM2JDbEQwc0dqdVg3elRxcXFJUGJ0MEtNQ3VuWHNZT01GTEdtREtHa0JQODZrTlh2ZUJiWHdtOTJadFhsS2d6VmlURWFoa3k5WUR4Sm8vWU1hTUQ3MDZqZHRCNGU0U2hxZDNQY2tWOVJnTWFqQWFNQmxpTVJqdE9PdzJzTzVqeTI0N2NzSHJ6TmpxTlJXZDdsTDJITFNSbmExang2b25XYmppUXlxdERtb3Fpa2tkZFhQZ2lqMXplNk1IMENXUm1sQkRWUTNnczhxcnE2c3dKWWV5Z1JUdS9wSzhBWGQ2dFRwZE1nUHowcys3VDlNWWE2S3E3TUk1Tkd0cWFyYlFzdElneEJTVkpFa0pyQnNhRWcwTjhxMnAxV2cwR3E4cDJzd2NGVkpUdHE0Q2VNckx5OWVucHFZK0ZCVHlaTVY3Ry9oWTdzZ3IxMlZ3MnJYSFNpTXJzU09ncEFBQUlBQkpSRUZVZHhZemNzUkZsdUp4aHNYWkNiM0hzRzkzTGdYNUJheGUramVlWExHZGZXdm5JZ01Ubm55WC9ydTJVYkJsQ3pORzlXUDN3bzk0Wk1TSkMwUXFkNnhnOEwxL2IvSDd1Tm12TVcxRTFvVVBwaGhia2c5WTBub3hZb1IvN1lZYkdUVTU5cFNQek92Vjh6cnRGRVZwZXRGUGVxS2VBVU52b25lQzk2OFJJMjRrSlQzbDlBWlA5akZFZU9FVFVGQzBaZ2FQdkpFVTJYKzltMG5ycktkOHkwSW1MUGlDL0kzdjBUWEJ3UG9uNzJSK1JSTVVxZVVUKzBXTkpoTldxN1dWUHNnWGRLUnNWaXNtaytHQ3RiZDE2OGRmTlFNMTEwbk1VQkdhdHhia1cvTUJtK3hQYUdzQ3R3QlZlQ0E2bXBiV2FaK2lLSnQ4c1F2ZS8vQkQvbDFuNXNXYmV4RjVCcy83NkEvZjhJbW5MY1BUREJjVnJsbGkyMUpjWEJMeWxjM092b3pkMi82RFZRRndzbVhqZG5KeWVnWW1sU0VobFJHM1RtRHhNdzlUc1c4L0RwOEQyV3ExazU3ZG40blRadkhRK0w3czJYZmdwRzJiczRlemZ0MTdyR3UyM1RXNDZ5bjdyZFhwVUtxcmZIMDhmVm4yeEJUbUxzMC9yV096K3c2azZzQlhKR1gySmpjM2w5emNYTko4UVlYczNKNFViUEdta3RRVWJtRlhWVk5IWXMxR1NrdThrY0VkMjNZRW5xMDZ2Uys5bGM5WUdZZ2FLdFRVV0lFRUJ2UlA1bUNGTTlCT2RrYm5Wb0gyOUZTYVRBWm0yQ20xeGdhdWw1bWVodEVnVTFGYVNrTFhYblJOTUlCaVkrMjZndE8rYkU1MkwvYnRDYVdLejg2K2pPMWJ0bmxYZzNPVWtiLzk0UG4zZCszWlEwNTJ6Z1Y1UDl4dTkrWVJJMFljQ3dJMkZ5MFRjNE55MTZTUVpOeGczNXBHbzBhcjFhSldxOVYrVVBORlIyVWhTUXJOelZHN3ZXR3R3UkExbUlZalBGN3dIVlpkQkFQbjd2ZStBUEZwZkhMdjFRRE1YdndxNzFjNHFYTzZ1WEhPUzJUMnVKelhidlJxQm05L3ZwOSt2WHBoa2k4cVhDTnorQVR5WHI2SnRLNXZrVFgwUHRZK05abVVRUk9ac3Z4OWNuS3VJa1ZucGNyWW40M2p2R2JYWnl0bU0vR1pqOG5zbWtKeDRXNG1QZktTMTNUQnpVUERlN0JMU1NmSjZLU3d4TTN5OVlOUHJtOW85U1FsbjkzTEs2Y1BaR3J2WjhuSnVneWpJWlZsQmUvUTlUUXV0V1BUVyt4Tzc4d2o0MDdOTUcvTUdzSGlTUjh4c0dkM3VtYW1VMVZ5a0s2ai9zYXJNMGR4MXlOL1orWGczekZnNjRzNDNZTGtJRk4wM01TN0dUcStINXV5T21NeFJ5RGpXL3RCbmNTaTVmOWd6TGlyV05ZMUU2V3FqRUZUbjJmbW1ONDhOUDhWeG82OG5aemx5VmkwRGc2V0NaWnQzVXJPV1ZIZzZabjM2a3VNSG5NRGE1L3FpczVaU2FtdEhmazdWNUUxZER6bUo2NG5iL0NuNk94VldCTFNUdnVxNllOR1lwaDJHd2NkaitGZit5ZHIxQlNHTGIyR25MeHJpWlZkS09ZbW1wK1haOS9CeS9uRkZPK3JRRmR5RTZzZTB6Tmo0WHNNeXpLZS9ZUzFIMkRqTGlQTGw2VmZrUGZqMEtHeVQxb3hRVjBuTUVPRkpNbEIwZEFtVGMydnJXbTFXcVJ1M2JyUjBOQkFRME1EalkwT3FiSFJpY3Zsa2hSRmtSVkZrWVVRYWtEN2YvLzNtUEhoaHgvZUJyVC9KWU5NWldVbFRxZUw1T1F6cXhUYnMyY3ZuVHRmZ3ZZYzE0cldWSlZqZFd0SnNZUytYVTY3bGZMS2Frd0pTWmowMmhiblZOdGxVcEl0cUg4bEh3bTN3MFo1UlJXeGxpUU1PbTN3RHNyS3FraElTVWJiN0Y1dFZlWFlNR0l4dDJJQktFN0tTOHZSbVMzRUdrSWR1dFVWcFRqUVk3R1l6NEdCcDFCUlZncTZXQ3pCYVRtS2s5S1Njb3lXWkV6Nk0wdkpXVDdySm5hblBjd1Q0M3VIdEZOWlhvYk9sSFJhdE80L1JiWXZtY2FUcFRtc25uUCtYVVpDaUxLYmJocjU1M2ZmZmRkT0UwV1JEYkJKa21USHk4UG1sQ1RKTGN1eUlzdXlvdEZvUkVTRWxvZ0luWWlNakNReU1wS29xQ2dNQmdOR281SFkyRFpJUFhyMHdHNjMwOURRZ01QaGtCb2JHM0c1WEZJempqWU5vR3RzZER5aTBXaW1ob0V0TEdFNWY2SllpMW02cVlUeG93YitUOW92V1BVcTZVUEdrV0k0LzE5TnE5WDZVa3lNNlFPZ2dWRHV0WHBKa2hvQWh5UkpMa21Tdk54cmFyWHdBbHNFT3AwWDJQUjZQVkZSVVVSSFJ4TVRFME5jWEp6WEZQV2JveXFWU3FoVUtzbmo4UWhabHZCNFJIQ0psZnZRb1VOcjB0TFNwb2FuWGxoK1BWTEQ4b1hMcUc3Rmoyako3TXVvQVJkK3pWYlptTWI0VVduL3N5Y3ljTlQ0QzliVzVzMWJkalh6clozUXZ5YkxrdkNibno2c0NqSkIxV2kxR2lJaUlvaU0xUG1CVFVXUXI4MFhIWlh4eGtZRDBWRWxQZjJTL1c2M2E3VXN5eVBETDBSWWZoMWk0dFpKazhPUDRYOGdqWTJONjBhTUdGRkZxRi9OQmJna1NRcXdlUkNvRFExbDhRakdMcjl2VGFlTElESlNqNnpSYUFJSEJLZCtCQmZHK3dJSkhyeVZDRytIaHlRc1lRbkxUNVdpb3FKUFd0SFdnb01HbnRZb2lwcW5lR2cwR2pRYUxWcHRCRHFkRHIwK0FHeWFRTGpVcitLcFZMSm96dllCZU16bStBSWh4Q2ZoWVFsTFdNSnl0dUx4ZUhiMDdIblo5eWZSMWxxd2VhaFVUV2FvRjZ2VXFOV2FGdHFhd1JDRldxdlZvTkY0YlZTWHk0dUFicmNiYjBXQ2dxSW9BWEFUUW5nQWQzMTkvYi9kaW5KbHJVdW1YUnRENjVFNWp3QlZzeUozajR2eTR6WWlvZ3pFUllZcHRuL09zcnRnTlRzT1ZJSXVpWEhqaDZNUFA1S3duRU01ZEtqc1B5ZlIxdnlNdVVwb3Nic3F4QVQxNDViZnQ2YlRlUU1KMGRIUnFMVmFMUnFORnJYYTJVb1F3ZDFpb1JmQWs5SWw4KzFMSDV3N01USENrMW51aXVUcGNkZlRKeUVTTDIzUk90Nzlyb3BLeGNTV3Y5MkN2eVQzeUtGdkdiOXNHM0dXZUk1WEhxVnpyenorT2FnTGNuaU1XNVh5SFRCbkN5eWE4YjlwWDZ2VFk1QXJtZnJRRzR3SUExdFl6cUVvaXJLdlg3KytlMXJYMXBxVzFzTy9ZSXNrQ1ZtV1dna2ErRTFRdjdZV2ljRVFoZEVZZ3h3UkVZRlhhL09hcEUzZ0p2dTBOam1Rck9zSHR1UGxoOXo1RDl6MDV1b0hiK2VoakFqbTVIL3Q2N0tYdHVpOWU2NmgrUnJqYjJ6OWxPNTVWN1BzOThONGQ5SzFmTHA1TzE4MVhDUUQ2ZnZYV2dWbEZhSDc3RFZRWEVySVN1ZUtBclp5MkxvTDNHN09hUFZ2QmU5VUtTa0d1ek8wQTdicWx1MmZTREx5aGpCMjlGQk9GUEYzTzZ3VUY1ZGdkN2JzWEUxbEdTV2w1YlRZcFRncEt5bW12TW9hZnJzdllxbXNyTnhZVm5ZNEdOU2NCTllMRFNtaFVrSzF0ZUNnZ2Q4RWJkTFdvcUs4MmxxYk5pYmtpQWdkV20yRXp3SFhsTUdyVXFtRnZ5SWhLSWpnYXd6Mzh1WExWd0xmcGNURzRHZ01wUzJLaTJ5WlFHalFhbEg1bDdPWEFMVVdnK3JpR01qK0ZwajJFT1FOZ3VHRFlJR3ZPRzN4RE9qWkg2Wk1nS3plVUZUdC9mMmhNVEJ1TnBSc2dTRkRZUEFZOE8waTF3eTdmUnlFZTFaQXo3Rk43ZVF2Z0FGallIQXVqQmtMMlNPOHY4OFlDVU5Hd3NneE1DZ2JKaS84aVdicTJtZm8zTGtYVTZiY1E5Zk9QVmk1bzlTM3g4bVRFNitoNzlBN21EcjU5L1RNSG81L2o3MXNCMzB6TG1YODVEOHhmdVMxakptNU5QeUdYNFFpaENpZU5ldlJMMDloaHJZb2VQZVZUWW5nOUE0dnNFVVFFYUh6SmVrYWlJbUpJVFkyRm5Wa3BJNkdCcTg2NTNScWZMNDJkZk1JYWJCSjZnRThkOTg5MFhyYjZCR3Z2L3pwZDdOSFh6djhsRGQweDNYWDhNRHJteGhmdkpmcVl6WGNPZnBhTHJsWWNsM2RFdFd4Z2owK1ptYUhBNHJYdzJOYm9YQVhtTlN3ZGk0ODlCU3NmUXllWEFrSDE4Q0lGWkMvNHN5YTJya05kdTZHRExPM25jQ0hKUk5XellHYUhaQTZFWjZaQkdlVnY2NVVNbTNTLytPeHRkOXdhN2FaZmF0bU0yRGFZNHpZdmhodHpXNFdyTEt5cGVwelVtVlFuTTZBdHJwanpWSzBBLzlFL3NKN3ZSRG9kSWJmOG90UWpoNDkrdDZMTDc3WTJKcTJKa21TM3d6MTBFVC9MVUlqb2NHZ3BpVWlRa3RrcEM2Z3JabE1Kc3ptZU9USVNEMDZuWTRtWDV1R1prbTd3ZWtmSWFrZmsyYiszNy9kNlZjVW53NXQwWmJQdnFCU1orR2VxN0s1NS9KMnZKRy9rd0EvNWE5ZFpNR3RRWnFWVGdmYnRvQWVtRGNUWnN5QWpidGhUK0ZQYjZyblVDK28rZHZ4UzU2dk9zZVVBcnBxYjNyMzJUbi9DaW0wWnpBZzI5dEl4c0JCcUFzL3AxUUJqT24wVDY5a3pMRGJtZnZNSW5hWDFRVEFNN04zZnc2c2VaenhrMmV3WlBrNmJJbzYvSlpmZk5yYTkwODg4Y1FYelVBdFdHTnJrZUxSSE5SYSt0WjB2a2lvSVZCMVlMRWtJa2RGNmRIcEl2SDYyclQ0bzZTaHFSOHFFUVJxQ3Q0SXFmdVYrYzhjLy91QWprdFBIUUJvWk9XbjMzTGJ0VmZTSjlYQzlmMzYwczFWd3FhUytvc0UyTUJvYU9rTFMra0pJMFo0dDNIVFlOVVRaK2F6VTl3dDl4bFBVUHNjWU1vNW45RWFPWmFsMi9jeWYvb3R5Qlc3R056N2NyYVdlVFV6THhYVFI0ekk2OHpXcFg4amIvUk1sUEM3ZnJGcGEydi8rYytuSE0xTVVMKzIxdW9TZThFWUZGeGg0TlhXV3ZyV3pHWXphclVhMldBd29OZEhobWh0VFVtNzZ0YTQybnpnSm5ra1NYS3ZXYm5pVFNIRS9wUGZrZ3BEaElvZnFtcTlMNlNqbGtQMUVnYmR4ZnZWN2o4QURoUkMxeHpJemZWdUtVRjE4SG9qV0N0RGd3b0FDVVlvOVRIeWJQdnNQSGZTWU1ic0xxZWtPcWdYU1psazZmZXhaVmNWQVBzSzhuRm5YZTdsSkhQYXNMcjE5QjQ0akJuekZqSWkzVUZSaVZjM1BERVZVMWd1RW0zdG05bXpaKzlzQmRTY1FmNjFWbEk4WkVKTHAwSzFOYjArc3BtMjVtVStVVWRIRzZtcnE2TyszbzdEMFVCall5Tk9weGFOeG9YTDVVS3RWZ3UzMnkxNVBCNmhlTU56UWdnVUVJb1FlQ1pNdUxQMmhUckxhenVtWERjUFRreGJOUG42SzdsNzFYdDhzVE9lbXFvcWtyTDZNRFJvN1lTTFRkS0d3c3l0a0pNRm1lbmVLT2JRaDJEdU9COSs1SHI1a2JPeXdKQUVHemRDTERCaEl0dzFDQloyQmJNQk9KL1VkdXBVWnM4YXlxMDl1NkEzcGJGaSs0ZGtHaXc4dGVDdmpCclpoK1daYWV6WlY4NkM1ZTk3MlYxckN1bWZlenZtakN6a21oSnFFc1l3TDlmTC9YdGlLcWF3WEF6eTQ0OC9ybjMrK1VXbjhxMkZKT1FHMFJLSmxxQVdFV0QxaUk0MjBxWk5HK0xqNDlINS9DL1NhNis5U21scEtSVVZSemgycklxYW1scnE2cXpZYlBXbnkvcWh2ZTY2SWZwMTY5YXRraVNwOTBudnp1T2l2TGFlaU1pby8xbUM3cytOM2NOaGc0cHFzRmhBZDVxWHJxNEVSUWRtNC85dW9yb2ROc29xcWtoSVRrRWZuS0d0T0ttb0tNZXROcEdjRUVweGZUSXFwckQ4ZWtWUmxKMlptZDJmMnI5L3Z3TXZpMGU5YjdNQmRoK0xoL04wV0R3TUJpK1FtVXd4eE1XWnNWZ1NTVWxKNFpKTExxRkhqeDdvOWQ3UHBicE5temJVMU5SUVYyZkRicStub2NGQlkyTUVXcTBUbDhzYklWV3JWY0x0OXJOK3lIZzhua0N5THVEWnNHR2owMnExdmhvVEUzTnlZRk5wU0lvMWhVYzZTSFFHU0QxRHJTczI0WC9mYjdYT1FHcHJIWmUxV0pKU1d6MUhxemVTbW1vTUQvcEZKc1hGeGUvdjM3L2Z6YWtqb1FwTnE3djd0TFhtdnJVSUg0T0hWMXN6R3IzYVdrSkNRZ0RVQUdTejJZekpaQ0k2Mm9CZUgwVmtwSTZJaUFpZnI2MTFmMXRRMUNLdytJTEoxT1k5UlZIV2g0Y3hMR0VKaTE5Y0x0ZUhsMXpTZVg4elFEdWxiNjAxdjVwR293M1FFdW4xVVVSSEczenBIZWFBYnkwQWJBa0ppY1RHeG1JMHhtQXdST0ZOLzRpZ3FTSkI3VXNCVVlrZ0N2R1FFaXU4aXk2NEtpc3JYdzBQWlZqQ0VoYS9mUG5sbDVzSVRjWU5BSnRQVzNPZlhGdlROS3NIYlNwME54cTl5YmdKQ1lsRVJVV0ZBbHRTVWx2TVpqTnQycGlJam80bU5QMGpJa2hyMHpTUGtyYlEydHEyVGRydWNybVdoSWN6TEdFSlMzMTkvZklycnNnOTFBelVHaytrcmZtWDFHdGVOdVduSkRwUmVrZFNVdHVXSHBISXlFZ3NGZ3R4Y1hIRXhNVGdUZi93SnUxR1JHaDlLU0FCY3pTNHpFbzBxeUYxUzVMazJydDM3MUxnOEs5dGtESXp1NFZwd2NNU2x0TVVJY1RoTld2V2JHMU5VMnVtcllYa3JiVVdDZlZYR1BpNTFwcW5kMFJHUnJZRU5vQ2twQ1RpNCtOcDA2WU5ScU9ScUtnbzlQcElJaUw4NEtZNWJWL2JaWmRsZjJlMzIxOElEMjFZd25MeFNtVmw1Y3F4WTI4LzNreFRPNkcyZGlMZm10Y0UxUklSNGMxWkN3NFl4TWZIazVTVTFHcjczblhJdFZvc0ZxOUo2ZzBrUktQWDZ3T0JCSzAySWxoekU0b1FPTjBlNGZZb1FoRk5yQjkrZE83YUkzdnBzL21GbTBNNEhOd08zdnBvQjlOWGJPTHgvTjBjYVJUaDBROUxXSDZGNG5hN1A4N0p5Zm44TkxTMWtLWDEvTlVGdmxRUFh5VlVSRkRBSUxnZTFJekYwdmFFVmxRZ0FhbDkrMlQ4Z1lTWUdDTUdnd0YvSFdtdzFxYlJ5RGpkb05ab1VLbFVJQVRDMXprL3VCMDZlTUM1WU1OL2x3UUQyN0wzMS9ONmlaTXhmYktJc3g1aXdxclB3aVUxWVFuTHIxQUtDd3ZmTHlzNzNMeTZvQkZvREFZMUg2QXB3VFdoVFZIUUptMHR0QjdVR0FnWXRHK2ZmTUkraEZRT0ppVzFKVDQrSHBPcERkSFJYcE0wTXRKcmtqWnBiVHJNYmFLRklUS0NDSzFHcUZTeThHSmJ3RmIyU0JLdWcwL2Q5N0hMNmZ5WDk4cU41Tzg5d2wzWDVwSFR3Y0xFRy9yZytxYUlyeHZDa3lBc1lmazFpZFZxZmJWWHI1d1NIM2dGZzFwd3dYdHp2aldmdHFacVJWdlRoVlFZbUV4K0U3VHRTZnNSQW15SmlZbFlMQmJNNWpoTXBoaWZTZW9GTjUydXlSejFSVW1GV3ExR0JOR0xOR2x0a2h0d2Jpc29lRVVJOFNWNGNDc0NsY3JYbkt4Q0pXd1VWN3ZDTXlFc1lmbVZpS0lvWHozLy9LTG1BWU9BYjAyU0pDZXQrOVo4SnFoR05HbHJUV1ZUM3B5MWFFeW1HTXhtYjhBZ01USHg5SUVOb0YyN2RpUWtKUGh5MjR3WURGR0JJbmsvQTRnL2tBQUtpcEJRYTlRQklrcEpDakJndXNkZE43VGkrUEhqTDRDZVBwMWlXYlc5a0tNMk94OTgvQ1UvQ0ltR1JuZDROb1FsTEw4UytmYmJiMWZQbURIRDFncW8rVFUyUDZnRnAzaTBXSEdxaWJuRFgrUWU1VnZoUFphRWhBVGF0VHQxT1dRTFlJdUppU0VwS1Ftek9kNlgyOVpra2dhRG15eEJuY01qZEhvOUdwV3ExYVJkSk1rVkYyZmU0SEs1WHJ6N3hpRjA1d2lUWHQvQXAwb2lBMkpWNkhWaFRxNndoT1hYSURhYjdZMnVYUy85SnNnRWJXeW1yYldhak5zVU1OQ0k1cUFXV3VUdUpaQk1Ta29pSmlibWxQMXBGVm5hdDI5UGRYVTFWcXVWK3ZwNlh5RjhJMDZuRTZmVGlhT2huaU8yUm93bUUycVBrOFpHQlVWUkVFSUlSVkVVRUI0aGtDU1FrU1RWSjU5ODh2SlZWMTNWYTlwTnY4a0djTmVWYy9XMmFQNFVIMTZwS2l4aCtSV1lvTHRmZmZXMXphMzQxWUpCellVMzE5VWpTWkxTUEJtM3lhOFdXalpsTUVTSEZMeTNiOS8rdFByVUtyQnBOQnFTazVPcHJhM0ZacXZEYnJmamNEaThsRWFPQnI0K1ZvY3FNZ3BKdUdod0s4SXRKRW10VWdraEZEd2U4TklhU1lvQU53TFgxVmNQTE52ejVhNUZYM3FpRmlkcEZkNzUrSE95Y252VE1ZeHJZUW5MTDE2KytlYWIxUTg4OElEMUpDWm9pMlJjMzZwVExkSTd2SDYxbGxIUXhNUUVrcE9UMFdoT0R6Uk95S2Rxc1ZpYUplNUcrMnBKSTRtUGk4T2tqd0NWQ2ttbFFwSzlxQ3ZMS2lGSkNDUkpTSkt2WWwvQ0pVbVNNL095N0UybEpTWFByaTg2VE0vZWZYbDZjT2Z3akFoTFdIN2hVbHRidXlRam85dUJrMmhyZm1Eeis5WjhBWU1BcUlVdzRucWpvUDVhME9pUVJOem1oZTVuckxINUpTVWxKWWpTeU82ak5Hb2tQVm54Y2JiWnFLKzMwOURRSUJvYkd5V1B4NE5hcmNiajhRaWZCQlpabGlUSm1WaFQrdEtNMy8rK215ekxnOEpUSWl4aCtXV0wyKzNlOHVpanN6OXVCbW9PbW5MV1RoUUZEVFpCaFplMUk1ZzhVdTh6UVUwK0U5UkNTa3JLR2ZYdHBBejRVVkZSSkNjbms1aVk0RXZjamNGZ0NDNlVid29tK0d1N1ZMNUFnbitwUG9JcUV1NjY2KzdqaHc0ZGVnRW9EMCtMc0lUbEZ5MC9mdnJwcCs4OSsreXpEYTJZb0k1bUptaWd3aUEwWUtBV3dacWF2OERkWUlnT0xLUG5OMEdiczNmOEpJME52SUdFMnRyYWdOWVc4TFU1dmRUaGJyY2J0OXVOeCtOQlVacUNDRUlJZk9BbUNTSGNnQ1JKa3B5YTJ2RnpxN1YyUVhSMDlOenczQWhMV0g2WmN2anc0V1Y5Ky9Zcjg0RlhNS0ExTjBIZFFSVUdvbWxSbHRCZ2diL0FQU3JLNEV2dGFFTjh2RGUxNDNRREJtY0ViQUFkT25Ud1JVaHRORFEwME5qb3dPbDA0bkk1ZzRETmpjZmpFUjZQUndvR09KL1dKdmxNVXBja1NTcWpNZWJmalkyT05LMVdlMWQ0aW9RbExMOHNzZGxzYnlRbnQ5OUZhR3BIY3hQVVJXalpWQXNUdElsakxiakFQWlNPcUVPSERtZlZ4OU5hakMwNk9wcjI3ZHNIMFJzRk0rNzZxeEw4eEpTYVU1bWtUcUR4d3cvemx5aUtVaENlSm1FSnl5OUgzRzczUjRzV0xTcWc5UWhvUUdNN21RbnFCeld0TnFKWmRZR0JtQmhUZ0k2b2ZmdjJSRWRIbjFVL1R6dER0bjM3OWxpdDNrVmVRclUydjBucXdlUHg0UEVvSnpKSkVVSklQdFhVT1d6WXNQTHZ2eTkrdmtPSDFBNlNSS2Z3bEFsTFdIN2VJb1FvM3JGang5by8vZW1odWxaTVVBY3RBd2FlRTV1Z1hrMU5wNHYwc1hiNE9kYThCZTdKeWNsblpZS2VrY2JtbDQ0ZE85S3VuVGNGSkZLdkIwMGsrcWlvSUdMS0NMUWFEWklzQzFubFgwaytoRzAzRUVpUUpNblpzV1BhenBxYTQ4L1Jjdm5NaTBhc3BYdFl2MjNQdWJuTzluMFhwTS9iMXErZ3pQcHpmNjZ3ZnR1RmFzMU93Zm90T0g4aGM2VzVmTFpwTlFlclQva0t1b3UvL3UveWZ2MzZselhUMWxvelFmMkp1TDdxQXE4SnF0SDR0YlZRdjVxL1pLcE5tMWppNCtOcDF5NkpqaDA3L3FSN09pTmcwK3YxZEdodjVxMVBDbm45NnpJK0tTbG4wM2VWTktpOU5ySWtQSlJVMTNITTdzUnFkd2k3UzBGV3FZVXNTMEtTVUJUaFhZdFVDT0VXQXBja1NZMnhzWEh2TlRRMFBQVkxBYUluSm85a1c5bTVJMXlxTE16bm1aVmJmdkoxeWo5YnhTTUwxMTZRZTFydzBPL1o4VE9QYTFjV3dqTXJXM2xPTytEZWVlZTJyZDByNS9Ga3dVRzB2NUM1MGx4ZW5uTS8yNHB0SnozbTJMSHFGOU43OU4wVHBLazVnamRKa2hxRFFhM0pCSldFU3FVV1hsRFRpaFBWZ1hyejFjeTBiWnRFaHc0ZFFsYWNPdS9BQnRDMlhYc20vbTRNODM4L2dnZHVHRVMvOWtiMjF6aUppb3JDRUIzRHBSM2FrWjZVUUx1RU5raEN3WVdNTEt1RUlvUUFTY2l5djFCZStCa0FHbk56YzVlNFhLN1hmZ0grQlFxM2ZVaFpqVGRvRWlyZUNhdzRiQlFYbCtJTW1zLzJtaXFLaTB1d3UwTW51YUlvcEE2WnpNYjVrMXU5bHNOV1JVbFoxWm4xMFc2bHBMU2lCZGVkdzFaRFNYRXhOb2Y3RE83SnUzNW9jVWtwZG1mTEY3U21zb3lLNnBZdmhLMnF2TlYrSzA0N0pjWEZWRm50NTNXY0ZBVlNoOERHK1MxL3Q1WEQxbDNnZG52L0R0bnZnSklTc0xlaWVpbDQ3WXFTNHViNzdUejV4QnRNbWpUMmx6VlhGQ2RsSlNYWVdoblg1dU5rdDl2LzNhTkhqK0I4dFJZbUtDMVRPM3hyR0toRU1NZGE4MkNCbnppeUtWK3RQVzNidHYzSmMrQXNxdEFqdUs1dlQ3NzZTc1p1YnlERmtzQ250ZFVZREJHNFhHNGtXY2FHZ3NmalFhMVJDNkZTUzJvWkhJMU9aRmtTRWlLUUFpSzhLU0JTWWVIWGNrRkJ3WXVEQmcxS1VLbFUxLzBjUWExdzNUTk1lK1pkQ2cvYTJYM1hkU3d4cUJrMjlaOU1IWllGd0t2VGIyUjFUVWNxUDlzTWVoM3F6SnZadG1RR1Q5dzdpR1c3UGFRbDZOaXpyNXpacjc3TjJMN3BnSU5aNDRhVFgvZ050cXo3MkxOc1JxQ3RSVk4vdzRvRGNhamR4Nms2V0VqSzZNZFpPMi84S2Z0WVhiaUdBWU0rUUVjMUZmbzhDdFkvVDRJV1ZzNFp5NnpWMzlNNTFjekJ3aUxHUC9FR0Q0M0tPZVU5clZ2d0lGT2Uya1JHVm1mS0R4UXpkKzBYREVuMzZpWExabzluc2ZVSSszYnVZdXJMLzJINnNFeHdWek5yL00yc0xGSkkwZHVwTnZSbTNlcC9ZZEZCeGU0MURCNzFKMUl5czdCVkhpUjcvTk04TlhIZ2VSbXJXZU1ndnhCc1diQm5XZFB2RDQyQmJVVlFVZ0ZEaGdDeHNISWx4QUk3VnNMNEdaQ2VDUWVLWU81eUdKWGpQUzkvQWN6WkJycURZTlZDalFtS2ZBdE5Pb3JXVTJEUFlVbWE3aGN6VjVTYWc0d2MvQnNxREYyUjdRMDRLcDNrK3ZZMUg2ZWV0LzhqUDgzMXpZZUhEeDl1TFZldE5STlVDYTRGOWE4SnF0Rm9SZE1xVTVHQk90Q1lHQk94c1hFa0ppYVNuTnllVHAzT2tidGRDT1dzdHVQSHEvbDQ4d2YwdjJVODE5My9aKzY3N3o1R2ovNHQxMTU3TFZkY2NRV2RMMGxETnNRUmIybExiR3diU1ZLcEpKVldLMHV5ckpKa1dRTlNCSklVSlVtU1NaS2tSS0REdm4xN2h5dUs1MU52d2NMNTJZNGNxUkNIRGgwNjYvTnY2eEVsM3RydmJQSDdLMys4WHNUM0dpVitySGNMSVJUUjBHZ1hRaWlpdHJZbWNNejNHNTRRSGE2ZEduTGUvcmRtaVc2M3pRMzU3ZmtIcnhHWDN6WlhlSVFpWEljTFJMdTRLOFFQbnBQM2EvOWJzNFNtWFQ5eHFFRVJRampFSDMvVFVmenA5YzlhOUtGdS95b1IzK1ZtVVgrS2U2cjlhcFdJYTNlRjJIL000ZjJ0c1VZY3IvUGUyeTNkVk9LUEwyNFhRaWhpNzc5bmlrNDN6QkJDS0dMemM1TkVqNXNmRVkxQ0VVSzR4ZE4zWHluKzhPSTIzL081VHR6eGo3V0I2emMyT2s3K3JCdjNpVDV0RTBWaVl1aDI5ZjN6VDJ1YzlyK2xpRzYzdGZ6OTIzY1UwZTJXME44OFJ4WFJLVkVSbnh6Mi92M2p4NHBvMzA4Ukx0LytENTlUUkdRN1Jldzk2djI3b2FIcDNDOWVteUc2Lys2eFg5UmNlZmZ4c2FMZmZkN24ySGhraCtnVXFSS3ZmRjdkWXB6Y2J0Zk85OTViK3dEd1cyQTRNQmpvQzJRRFhZRU9raVFsK3Q3aEtGbVdJMVFxbFVhdFZxc2lJaUprZzhFZ3hjYkdTbTNidGlVdHJTT1ptZDI0NG9vcnVQYmFheGs5K3JmY2Q5OTkvTzF2ZitPVlYxN200NCszY3Z4NDlWbmpVZlB0ckhtRFRNWW90dXd0SnJKYkg0YkZleWd2Sy9ORlNOMDBOdFJ6eU9yQ2toaUh4dDJJUTNpRUpNbVNKS3VFMS95V0ZDRjVrTHhxcXdUSWtpUkpHUm5kdmk0ck83UXdLU2twVnBLazlGOWFJR0R3eUZ1eDZMM1d2VTdyL1lKWEZHNWk4ak92Y0tDc0dzVlJSYVdjZDFyWDZwMlhpd3pJU2NtWW5kVlluWUR1NU9lazVWNU5zZzVBUy8rQmVTemN1UnZHNW1BcjNjbU1lZjlpOThFS0ZMZU5tbW9qVnVCa1hveGRPd3BJSFhRelhXTjluaU90RVpPMlNkSHZuZWRWWjVKU1VyQlZmUTdBMXEyYjBkcHptRFhqWVFCS1MreFU2QXFCUExMNzltUEc1RDl4YjhWbjVQWHR6NmhoZ3pqcG1sL2FybXd2Ly9HQ2pGdkpkaWhYdzVyNXNOWnJwV0hkNHkyUDhSZnk5QndLR1didi8zVkI0MUJaZlJTak1ma1hOVmQyN2Z5Yy9pT25leDl6UWc1OU00eUJmVTNqOU9sM1NXMlQzbnAwK3YxSG1nVUtnaU9nSi9DcnlhSnBCWGQvc0tBcEFtb3dHSHhyZ3JZaEljRmJCNXFhbW9ySlpEcG5ZM3FXd09aaHhYc2IyQk9md3hQWEdQaitteUtjUGxvamg3Mk9UNDdXMFM0NW1XakZRWDI5MXo4Z3ExUklzcG9JTGNMamNlTlVFRWlTZ2k5eDF3OXd5Y250UDY2cU92cGNYRnpjVENEK2x3UnNPcU9obWJPcGtGR2ovc3BqNno5Z1dIWUs5bDFMc1V6NDhQUUdSZzRhR3ZuTUhkQ0szNE9xVkRGaCtHME1XL1FoOHdkbm9xN2NnaVh6cno4NURDMEg5OC9uckZLQXJOeHJHVEhZOTAwYWNTUEdoRlFBc2tiTVlGL09jUEkzRmJCMDNuMHMzZkpIOHArNTk4UU5PQTh5SXUrM2xEVHJhTmRoRDdEaXNRbm5mT3lNeVRCeVJOUGZJOGRBUXZCK1krdm5tWTNSMk96V1g5WmNrZVhXM0hUQjQxUzE3UFYvdi9IZzlQdS9KN1N3M2RHS1h5MUE5UjIwMkxId3J3bmFNZ0pxOEFVTHZQeHFiZHQ2azNDVGs1UFA2WGllQmJBSjN2L3dRLzVkWjJicDczcGhrQVdlaGdZY0RnY09XdzNyZGh3ak9TMmRSQnhZcmJWNHpGTmlBQUFnQUVsRVFWU0JVcXVveUFoUjV4U1NUcTFHOGJnQlNaRWxDUUY0Q3hTOC9qWWhoR1EyeDYrdnFUbHVpSW1KK2V1cDlaUUxLd2FqbnFyS2F1aWFjT3FEcThzb1ZhZlF0MmNLTXJCK3pidTQwWiszdmhYdjJFeVpZemJKT2lmYkNyYVRNL1lQNEs2a3ROcEkvN3hNMU1DTzlldXBWRTU5VDltNUF5bVo4dytLcXFkNHRUYTNsUnFIQVpQaHhQR21BZjJ2NXFGdHhXVFBHdXZWeGhRN1ZUWGV4cXhXSzdISkdZeWVrRUZ1a3B1OEo0dE9malBhVkJhdmZZL212bTJ0NGFkOTFmVkdzRlo2dmR6K3laK2FCNFpTa0ZPaHQ0OUFvcXJxOUNaZTE1NDVsRCt6QVNlMDBFQi9ybk9sZDA0djVtM2JDcmRtNGF6Y3liWWlLd044KzZ4V3E2TkJpbm5sd1VmKzN6NmEwam9jUUVNSXFMVk03ZkJyYThIOGFxSzF5Z0wvS2xOdDIxcElTZWxBNTg3bm51bm56SUd0NFFpUEYzeUhWUmZCd0xuN0FWQkZXM2lxZHdxRmhWOXlTTkdpUG5LTWIreDF1QnZzdE5GSFl0YnBpRFhGVUgva21LaHY5RWpDSTRSS3JaWmsvTVNVSWZXa2toQkNOcG5hdkdXejFVVkZSVVU5OG5NQ3RnbVQvc0Q0Q1ZleDJHUmd6Q012OHRESW5pYytPR1VBVS9JZXBXL3VOYVFaRk13cDhZRUhYckZqQmFPbS93dDdWUWtsVlRKOSs3NVA1ckFIV1RSajFGbjN6V0wyTUhiUTFhaXBwdEk0bElMUjJhQlZtRDZoTThOeis5QXpXWStjMUI2TGZPcDdNbWFONE5VWkh6RTBwd2NaV1oycExDM2xzWldmTWpqOXhBYmtnSWx6R1ByWmI4bnNlU1VaS1NZT0hpaG04b0wzdVhlUWdiVlBqT2V4OVVmSlNJMWxYMkVSanl4OCs1UlRNeUhwekwvaUZUdGcxSFN3VjBGSkZmVHRDNW5EWUpIUDM1NlVDNE9BckN3d0pNSEdqUkJyaHVYellWeWVOM2hnTFFkdER1UXZPbzBQWGMraDVMa2ZaV3VaazBISjJsL0VYQmx5N3l4ZUhuUTl1UU0vUU8xMFliUTBxYVBMSHYzZGkvYy9zMkZYTTFCekJJR2J0eGEwbFdDQmY2RmpYd1JVdEJZQmpZa3hCZFl0YU44K2hmVDBUa2lTZE03ZlUwbUljNU5uYytUSUVmYnUzY3QzMzMzSG9VTmxIRGxTd2JGanh6aCt2SWE2dWpycTY3MUY5UFgxRFRoZFRzbnRMYUNYUEI2UEpJU1FmWnNhMEFCYUlZUU9pTFRiNisrSmpJejh3N202NGNyS1NweE9GOG5KN1M0WUdGYVZsZURXbTdIRUdzNTdXMjY3bGZJYUI4bEpDU0c1UERXVlpkZ3drSnh3WmhxUDIyR2p2TElhc3lVWnZmYjBzb1BzTlpWVVdkMVlrcExRQm4wNkhiWXF5cXRzV0pKU1R2dGFGMUlVTjVTVmdkRU1wak1ZcW0xTHBqSy9OSStWYzBiL2d1YUttL0xTY2t4QjQzcjgrUEVYWW1QanRqUXpQUnNBdSs5ZnI5WW1TVTdKbTJRZkFEWmZaWUUvVDAwMEFacUI2R2h2L1dkY1hCeUppUmJhdDArbVU2ZE9kT3ZXN1pTTHNweXRxR2JQZnZUY21HZ0dBNUlrMGRqb0xZNTN1ZnlGOFFxSzR2R1hXUGxEc1Q1UUZVMi9CZHU2WHMwTmdLKysrbXJQeUpFalVhdlZ2YzlGUCt2cjYvRjRGSXduY3BxY0I5RWJUUmdpdFJla0xWa1RRVXgwRk0yL2dib29JOGFvTTdmcVpiV1dtSmdZTktyVC82cHFkRkhFeEVTamFvWmRhcTJlTmliVEdWM3JRb29rUTR3SmRHYzRWQ2xadldrOFhFYlhIbDFSL1dMbWlreDAwTGpXMXRhK1BHalF0WnQvL1BGSFZ5dkE1azNDOWZuVkpFbHlOVE0vQTZEbU56LzlDeHo3QXdWdDJyVHhyVm5RTm1CK25tdS8yamtJSHJRdXFhbXBPQndPbkU0dnJaSGI3UXBRR25rOGlnL2t2R0RXQkdwQ2VKTWxGY1ZYVjRvUXd1VjN1cTFiOTc3MCtPUHpsanp5eU1QcWlJaUllN2hvcFlibEM1ZFIzWXFDYmNuc3k2Z0JQUW5MLzBqVXNZd2ROK0lYTzFmcTZ1cGVlK0NCQnpaLzhjVVh6ZlBVbWtETkd3SDFhMm9lZk13ZC9naG84d1JjYndUVW42c1d1c0pVV2xwSFVsTlR6KytRbk9zTGR1blN4Y2ZaNWd5a2YvZ0w1UDJhbTI4VFFnaWYxa1pBbFZNVTRXY0NrZncrdHpsejV0VEV4NXVYM0gzMzNYSkVSTVRkRitmYlkrTFdTWlBESUJLV2N6cFg2dXJxWHYvclgyY1Z2UDc2c29ZZ1RhMGhlUE9ER2tHVkJiSXN0UllCRGZqVnZJU1JocUFhMElSQVdrZVhMbDNPLzdmbW5Ldnpra1NYTGwxb2JHejA4Ylc1L0Z4dEFjMnRLWkZPQklHYlFBaWgrSWhBUWt4VVNaSjQ0SUVweDdSYTdaSTc3cmlEaXhmY3doS1djeWQxZFhXdlAvYllZL25QUHZ0c1BhR0Jnb0EvelFkcUlmbHFYaE5VYmhFQjlTL0UwcHd3MHB1cjFwYlUxQTUwNmRMbHZBUUx6anV3QVVSR1J0SzVjK2NnV2lPdjF0YmthL09hcEQ2ejFBOXV3cWVsK1NPbHdlQW1TUkxTUGZmY2U3U3hzWEh4M1hmZnJlaDB1bnZDVXpNc1lUbHJVSHZ0cjMrZFZYQVNVR3VRcE5CVnBvS1h6Z3VPZ0RacGFrMEp1REV4eG9CZnpaK3Ixcmx6WnlJakl5L0kvWjJ6NEVGcjRLYlQ2UUxnNXZINHdTM0ExZWJYMnZ5YkQ4YkZpWFJCQWJCaHcwYVhKRWw3K3ZUSmRXczBtak1PS1B3dmdnZGhDY3ZQU1dwcmExK2VQSGx5d2VMRkw5cFBwS25SU21WQkU2akp3ci9BY1dnRU5LckZlZ1YrbjlxbGwxNksyV3krWVBkNEZqRjNENThXN21YTzZueit1TEtBVjc3OEljQkQxVmhmdy9LUFBtWEd2emZ4bDNlM1U2eEVjY2tsbDlDaFF3b0o1amdhRkluRDlZM1VDSzF2ZFhsOThPcnlRcVBSb0ZLcGhUK0QyUjkxb1luRHJSRndQUGJZWTdVMzN6enFCYnZkL3ZTRm5oUUg5K3lrMm5HdXJ1WmszNjdkMkU0NzQ2YWNrVG0vNGNCWkVIOVpLNG9wT2dQMmgyMnZQc0s5VDY3NTJiK2tJM09ncUpYbnNXOFhaL0JjVDBmY3pMdHJORnRLN0QvcHVaNUtLa3VMS0trOFM3STc5d0dHWk45TTJVa09PWDc4K0F2WFhETW9QOGluMWtKVG95VU5VWEJodTQrR0tOU25GaG1wOXlYZ2Vxc0s0dVBOV0N4dDZkQWhoVXN1dWVTOHBYV2NPMkJUNmxpenE1d3VxUjI0SWFNZG03ZmtNMnRyQ1FBL0ZKZndkYjNNMWQwN2t4MHJlT0NGVlJ3MnRDVTlQWjFvblliOURSTDFIc0VSUllQUmFNUmdhRVpTNlFNM3Rkb1BibDV5eW1ZRWxZMkFZOE9HRGZWUlVZYVhiRGJiNDc2QnVTQXllK3pWRkpTY0sxN01TaVlPdllraSsra0RZV2xKTWM2emVHRS9XL1U0MHhlc08rM2piVFZIcWFpeS9leUJiZnhVU0dobEZrOGN5aGs4MTlNWXFSMUxXVkdSUnY5VS9VOTZycWVTdGZQL3dMelZoV2Y5b1N3cExqMVJ1WnpqNk5Hano4WEd4bTBKaW42ZURxaDVKRW55K0lNRkxjM1BVTEpJZjFXQm40SW9QVDM5SnpIaFhqZ2ZtMnppOGZIWEJ2NXNZei9LZmJ0L2dQNnBkTzdlazhlNysvZWtzbXZ2ZnJaK1g4MUQyWjF3dVFZU2s5Q085emV1cDZEY2dja2srY3pTUU5vSFByOWF3TmZtZHVNckpjVVQ3SFB6cFlRQUVCMXRYSGI4ZUxYZFpESk40VHpXbHBidVhNZmlOWjlTV09IRS9zeWo3RGJMNUk2NG0yRTUzakxwZlZ0WHMyVDUrMWpsTm95NWR5cURzcnc1T29xOWdrWFB6R2RIMFdGaWt6c3k3dDVwWktjWTJaMi9qRlZidnFERVZzT2lPWC9Gb3BVWk91NFA1SFUrZFFMdDd2eWx6RisxbVlTTXE1ZytiVHdtTmJpdFpTeGU5REs3aTc1SDBjY3hlc0lVQm1lbmdMT2NwK1krejg0ZHV6aGdyV1Rtek8vUUpmZGk1cjBqQWk5RC9zckZyTnI0QlJqYU1tckNKQWIxOVBYZFdjMlN1WSt3N2VBeGhrMzRJNlA2K2twZjNGWldMSnpQcHAzZmt0RDVjcVpPbXhRbzZONjNiVFdMbHI2UERTMFpBMjVpMnEyRE9SK3B1UHUyd3ZKTjNobmNPK1Rad0tvdFVHS0RSWFBBb29XaDR5RFAxL1h0NjJEWkduQWJZT0kweVBGWHVUdmdtUVV3WkRBc1hnQjJBMHlmQmVtKzRYaDE4UXNNSC90QzA3MmM0cm5hcXc2d1lQNGk5cFRVa2pub3Qwd2ROeVJRY3JWajNXSmVYZjFmbkZvamVjTnY0NjZodlZHcTlqSG4vN2QzN3VGUmxIZjcvOHpzSVp2TlpyTXNJUWtoaVRGZ2lDSEVpQmdSSXlJaUlsSkVSS1NJaUpRaVdxcldvclZLS1M4dlB6elVJcVVVclZJOElaNFFFUkVwSXFVVUVSQVJNVWFNTWNRUVlnZ2hoR1d6MmV6T3p2UDdZL1l3dXptQWVLSytQdGMxMTU1blptZWV1ZWYrbnU3dndoZll0YldDdXJLL002dm1uNlFWWHNhTWNZTlB3TkpjTEYvNENCdEx2MkxJMkl1amtheWhnb1VMRjFOV2Zhd2hQam45cVNjZWZXQTMwYldmTFRIbVo3dWdwbXR3SEFWcWtVQkJBb21KMGFDbVZSWDArdlpraUw1ellJc1puOVkza0p0K1Z0c1AvTWVwT0tJeUtUVUpnTHk4UEJSRm9WdEtOK0piV2toT1J1ZHJDeTFoOEFxREcwQWcwQ200aVM1ZG5Lc09IYXByN3RhdDIyM2ZsU3FJUFNPUDRjTnRiSC94RVlwS0xtTkl0cG0wRE0xUFY3NWhFU1B1ZkkwRmkvNlhaRjhsTThaY3hkSnQ3MU9jWW1icGZUZXl6bmNGODJhT283NXlEdzBOYnNpeWs5NnJIOE10RnRZc2VaSGlJVmVRYjRPczVKTklvRldxV1BaeU9RL2Uva3RXekwrRHlYTXNySjQzSGw5OUpZMldiQ2JmTmdwZi9XNXVHMzBaUzNkK3lzQVVPNE9HWG9IczJrMWxiUitHRDc4QzJSYXBYWHh4OWczTTIyWm53Wnhic1hwcUtOMVhIZ2EyTFM4L3g4Z2xEekVoZXhzVHh0NU1jZlc3WkprVkhweHlCWnZOVnpEN3pqc29YZmtvSXlZM3N1dmwyVkMzbFJIai80Y0Z6LzZkYkx1UGJYczB3Y3ZPZ0czYnFzZlpzUGRRek0yeks3ZmRONE9VVG1ablNqWU1Id3BUUjhQWWV5RXQrTjMwWGpEY0FtdVdRUEVRZ3NjMWFGNHZnNmxQd01KSGdGb1lQd3cyN1lFc1N4RFk1c0c2N1RCMU10QUlqUzdBQWREQSt2V1YzRGV2VUhmbGRISmNQZFdNSFh3RitWTWY0dlpSYVN5Yit4dG1laXdzbWo2WXh0MHJHRDN6RlpZdmV3aUgyc0R1YXMyTWxhMHBEQjErQmQ3eURjaFpGekI4ZUJIVzVCTTNDVjQ1N3hjczNKdkJvdnQreWJwRjkxS2hvMnR6cHY2TStuTm5mWEg5OWJiblI0NjhKbFQ3R1p1bkZscGFPd0sxVUZWQlorYW5CbXBkU1V0TEpUTXprMTY5ZXBLWGwvZURNZmx2Qkd6Vit6L2hzVThDUERuajdGaDdsV2ZXYkNUdTdBRmMyU011L0c2ZlBuMUlUMDhub2JtWjFGUTZDaUlFdnkwRWhLT2xIWUliYUlDWW1wcTJmdi8rL2E2c3JNeGJaRmsrLzlzK1VJNjBYcFNrOVNMTlppUy8veUJLOGlLSGJ1bkN2ekJ4MXF1TUtNa0Qrak4xNkZPc1dMdUw0aWtEYVd4b3dKcVZRazV1QVVXRlJib0xNNStVYkR0MnM0VitKU1gwUDlrS0d0bkt6TGx6S000MlVqajN0NlNNZWc3WHZQSFlldzFpNXFROGR1N1pqVnROSVQvZHpjN2R0UXdja1VYL2toS2E5cVNUYk02bHBLUkVCNUxWTEZ5OGxRVjd2bVJZbGhrb1J2Y3BCU052Wk5xb0lVQXhBMmY5bWIyMWtHWFp5c0oxQ3Bzcjd5WGJEUDN1K3dOUDlQb1pwWjdaNUxzYmFGS3NwR1JrMFM4M25YNzlUL3gzTEE0bmFXbHRiaU1ZVDBEemtyT2dKQXRzeHJhQWw1SU5kalAwS3lIcXVDNTZCTzU2QWdZSDkydjAwN0I2Szl3K05QZ0ZEOXk3Q0lha3gyeXNxWkpLVndiWitpSmIyZGJoY1MxYit5eGxHZGV3Y3Zvb1pHRHV2YmVTZjgrTExKbytHRzlESTZyRlJscEdOZ1ZaL1FnZkltc3lKU1VsN0Z2dHBLbFhVZlI1NnRoaHdQSVZHNW01NmlBREM2d1V6NzJISmF2L0VQR25IV3I4b0xYVi9jcklrVGZ1cDIzdHA2NUVpbGFKamtITllEQUlrOG1JMld6U2dWcHNVWHVvWENvelhDNzFRNDVUQnJZalgxVnh5eXNmTWZlbTBlUW02R2VoWU1PbWpieDZQSm5sTnhaRzNhMGxTU0k3TzV2RTR5NHlNOUNab21xVU9ScGFqOGJnb0RQbUJoSWFlUlBpekRQUDNQYmhoN3ViK3ZidE85VmdNQXovdmc1aWRYVXRaWXQveDY1blEvL1d3dENoMnZQcGMvL09mYlArbDM2NTkyUEpLR0xSc3FjWWt2Y05va055Q3VsQmVtSkp5OERhVkU4ajBMVDFhWVpPZnBUaFk2NG14VzZtd2EzZzlaMGd5dUN1cFVaTkl5ZXIvUktlWkljelBFM01aZ1ZGQVc5ZERZM2VHdTRjZDAza2UwWG5vSHJCMkdza3o4N2F6YXhKVjFCZTQyWDQxUHQ1Zk03a1RuWFhiSTRVMHRKaXZpSGJ2NU04cE9wYVdEb0xWdW1JY1QvOWhoeVFtOTZ1WXhsRi9qcmIrUkpYNlhiR2pQNDAvRjV4M2tXb1FQclF5VHc0cG9LcEl5K2syaVV6K2Q1SG1ULzlWS2RxRTNYMUZqS1NOYitmTVMwTlozQS8vWDcveG9zbjNyN214aG0zSHRLWm4zcFFDeGUxUzdSUjZvZ0JOUk1tVTNzTldFS3kzbTFCN2Z2SVZmdldnZTM0a1lQOFl2bFdab3kvbWt2U29wMnA3NzczSC83eXVjelROMStNdlozQ09ZUFJnQ09ySnozUEZLaHFJSWF0aFlBczVHOExtNlFkZ1ZzSURVWElORDMzM0g2ZnJGcjE2cCt1dXVxcXcyYXorY1p2UGRvaXk2Z3hZdmxaV1JrVVRmOGI5NDVxYXdVN2NvcFpzdUlOUUdINXJKOHphOEZ5dGoxeFp5UjJJNnR0dFBjN0Q5N1VVMU9yVUpSanhGdFhnOGVaUVRMd3hMTEhHRFByS1I2YzNBL3dVYm5tejdFNzNtYS9zYVdUSWRkUldlMmpWOWJKMVNlYTB6Sncybko1ZXUxYllmTlBQNTFHelpqTHFCbHpjZFh0Wm5EaDVXeWVPcGxoblpRRVZ1N1p3dHB0QjJKV2swcnhpQ0hZdjRselRtN2IweUFySGNZc2h2RUZYek9VNXNnbXgxSkhUUVAwU3VHRXh6VXIvUXhTQnFTeWZ1VzhkclpoWThyc2hVeVp2WkQ2MGxVVURmdzlVNllPcDVkUlA3OU9OampsSUQzRlMwMkRCOUtzS0hWMU5LclE0dkc4OU5qU2Y3eDl4eDEvY0hVQ2FsNmRXYXFQZnJZQnRVaGhlN3hPcWNPdTYxV1FHaXhzejZGUG56NllUS1lmUEtqMDlZSE5mNXdaLzNnVFMwWnZHZy91NTdtRFlJaDNNS0VvaS8zbGU3ajFyYys1NGRMK3JQOUFpK3ljZGNhWkRFaFBSUFUwc2VLamFqNnBidUtJVDJWdk55ZjJ0RFBJVUtOOWJEcFFDejBYSWF2VDc5ZHkyYlJFWHdJUmJBc3pRaUdFRUdQR1hIc3dMeTl2d2Z2djc2eTMyV3gzOEMwbUl1Zm45Mkw1b2dWWVJoYlFxM0FnK1ZsT3B0NzVLNGJmOVV0eXpQOURybE5tNTZiMTVJeTZoNkg1ZGxZKy9pQmtEeVEzemN5dWZWWDA2bitUM25BaVAwZmg4UVZQVU44L2cvd0JROGc1a1o5TjliSmd6aXhTYmgvRml2bC9adGpFMzJFRHNyS3plWEh0OCt3cWtpbGI5d1RyeWhYMEtsZTV1WDNZdmVRbFhoeVFqQ010aCtFREM4Q1l4WjB6U3JocnlxMHNtUE1yck40YTlqWGFtRHF1NDE0RWNsb0pkdzcxTVhuNkhHWk5Id1dOTmF6ZFhzWGMyYmZqSzkvTW92WFZEQ2twd2xPOWxRWnpEdG5PenYvTzhDbXpHWDRLdXBHN3QwS2pGMXcrMkw0Skdxd3djSEJFRlRnL0J4NWZBUFg5SVg4QTVDVEQ3VE5oNmpTd3pkZUNDbHZXdytEYm9kOEpDWFFhdzRhbXNHMTdPWU5IUld1SHRYZGM4MGRPSW1mdXBkeTFJSThKUS9LcEw5OURxVHVOZTZhTW9HcnJhbGFWK3hqY0w1ZmEzYnVRczdKSjFzM092RjVuOCtDS2Y3QXF3MDF5Umg2RCtuWG1Ncll4Y2VKdzVzKytuNno3ZnM2YVJZOG94eFhseVV0emUvL25VTnNlQlhwQTgwcVMxQ3FFYUNmNVZoOG9NSWFZbW9pUEQ1bWZOaDFUMDBBdDFLdWdUNTgrV0N5bmgzemkxMC9RVmYwYzlSbElUVERoOVN0NC9RcXRzcG5pRENmSG0xdXcybXlZUkNEOFdWSVhKemxKRmtTcm15MzdEMk5MNnNMWlRpdCtJWkdYbTR2VEtGQVVCVldObEZ1cHFnaWJvanF5Um9pOUNkSGgzZ2xKa2dRZ0dob2ExQWNlZUtEc3R0dHVyYkphclQwbFNYTENOMC9RTFI1eUZVcmRQajZ0cUNLK1J4OXkwNVBvMm5NQVZ4WTVXZlBxcTJ4K3Z3eHJabCtHWG53ZWlYRXlub1pLTnF6L0p4czM3eVNyWkRKemZqMmFPRGxDRVM0WmNTVU41WHY0Zkg4MXFiMzZrOW4xQkJORFRtWFVzRE40L3BtVk9NLzlPUS9kTTU0NEdmSXZ1QlJSdFlOWDMvZ1hDZjNHTVgxMEVUMzdGSk9WckdWNkorV2N4NEFzaWQwZmZVcWR4OHpGNTJtTzNZSkxSNU5ycWVPMVYxL240Mm9YRncrOWd1eFU3ZGc0TTNwVGtKTWEzdGMreFJlVEhDOVRNbW9jbHJvUFdiVnFIWjhlT0VhL1M0WnlUcThlR0NTRkQ3ZjlpdzNyLzBuWlZ4Si9XUEFvNS9WSS9FNG03dHN2dzBjVjBQZENjQitFNmhvNGQxQUUyQzRaQVEzbDhQbCtTTzBGbVYwaDYxd1kwQjFXdlFvN1BvSzBQakQ0ZkxBWUlyZjVBUU1ocnAzdFpYZnhNK2ZwWFV3YmUwblUrKzBlVjFNUzE0Njdpcy9mWGMvYXR6WlIzeHJIa0tIRE9DUFZqb3lYN1p2ZjVxMzE3L0JsU3pjZS9zc0RuSmtVT2VlWjU1WndWdHd4UGl3cngyMTBjbjUrZHFmSDRleUxobUUvOUFFdnJYdTNNbWZ3MVkrdFgvblkrODNIajNlazBLRlA1L0FGQVMwcStUWTIraGxxdmhJZnI1bWZpWW4yb0FTUkpoU3BCUXA2VVZCUWdNMW00M1FaMzVvZTI2bU9ZOGVPVVZwYVNrWEZGeHc0Y0lDNnVqcU9IR21JMFhGckNSYld0K0x6K1NSL1VNdE5WVlZKVmRXUW5wc0JNS0RwdVptRUVIRm9jOVJTVnZaSlVXNXU3aFNEd1hEcEQ2SEg5dFA0TVF3UGQ0NitrbEVMMzJKSXR2VzAyak5GVWY2OWZmdjJOUjAwTSs2Z1Q0SHdDMEZBbHVXQVB2bTIvVHkxV0YyMVVFcUhGdjBzS0NnZ0tTbnB0RG9teGg5NkI1S1NrdWpUcDQvTzlOU2JsbEZFVFUvZkpOQjZKMmltYWRqSklVSit0NkJacWdKcWZuNmYzYzgvLzN6dG1ESFhWQUUzbjg2WFQvbXVUZXl0YW16bkV6dkR4ZzdqcDBLd0gycFlXYmo2MzkvN1ZuME5GYXpadktmZHozS0xoNUxqTkQ3LytPT1BiN3I3N251T0U1M09FV3QrNnR2aytTVkpEa2dTcXI1TXFyMktnbENlV3F6NXFSZUxQTjFBN2JRQU5nQ0h3MEdmUHZrNlVKTjBqMUlZNENSSkNpMUNraVJKODdrcFFVQlRVVlVoOVBsdElaOGJJRzY0NFlaYTRLK2ZmYmF2eW1wTm1BNTBQeDB2bjR5OEl1d1o3VVF6WlNPMm45RGwvOXd3MmpNWVZHS2pIYnZxSzdmSHRUd3hNVHNrNDYxUDU5Q2JvTzMxL2d3QUFhMnlSMWJiTDJqWGZHb2g4ek1VL2RTWVdnalU4ci9WemxJL09tQUQ2TktsU3pEM0pRSm1Hb2lGbUpzVWZoM0wzQUJKVlNVVlZDa0VhbnJtQnFoQjlpWjY5ODVidlduVHBxcnUzZE51TWhnTVEwNjNFMksxT2JIK2hHQS9qZEQ5ekd3aEpTYlJUMUdVelR0MjdIaWpwT1RpR2pydnpxNnZKR2l2OFVxb3FYR2Jpb0pJOG0xSGdZSjh1blRwY3RvZXQrOU0zZU5VUm54OFBIYTdQYXpmRmdva2hMSTZPZ2dhZEpZd0U3WnRRd0FIaUdlZWVlYXcxV3JkMGE5ZlA4K3BLSVQ4Tkg0YVA5UTRkdXpZMHZ2dXUvLzFXMjY1NVlqTzlEeFJ6V2RVTWJ0T2VpZ21uY09pNjlJZUt6Mms5Nm4xT2ExQkRVNkQ0RUVISjQ5UFBpbmppeSsrb0tibUFIVjFoemh5NUFoTlRVMjRYQzZhbTV2eGVEenRCQlQ4S0VvZ0ZGQ0lEU29ZMFlJS1pvSkJCU0R1d0lIcWkzdjA2REZaa3FSemY3cHNmaHFuNjFCVmRjOW5uMzIyS2orL1QzbVFwY1g2MC9RbWFKVHBpU2JqSFdKcUl0TFEyRVRIUGpXOStSbk4xRTVIbjlxM3h0aWFYQzRPdWYzWUxHWmtQV2NLS05RMkhzTWpETmpNMFJtNnJTMHRIR3hxSmk0dURwUGNNZEd5V0N3NEhJNXdUOUxvNmdUQ3ZyaVk1R2FwSS9JV1NnSFJtNmFoMTQ4Kyt1akJnb0tDblRrNU9YNmowZmk5ZzV1cnVwUjNQcTduckt5VWsvK1J0NTVWYTNiUTgrd3p2M0h6a05OcFZPM2R5dnAzdGxEWFlpR25SOWZ2ZndkTzhiaHVYZnNpY2xvQjlyanZacmZjYnZmelR6NjU5T1dSSTBjZXBQMTZUMzBxaDFmcXVPZW5ydTdUSEdacVF2Rmh0am13MnhKSVRJdzBYd2xKRDRWVU9nb0tDazZZSnJWM3l6b0NYWHVTYUpaQWJlVEZKNTloNi91N3FQZlpPQ3Z6KzlOaisvbytOdFhOci8reWt0MStNNmx4QVdyOThUdzY2U291VEltbjV2T1B1ZTdGSFRnZGRqeXU0M1R2MVplL1gxZE1vZ3hQclZyRmtyTGpaRHJpT0hEVXl5MWpSakMxVDhjWGMySmlJbjM3OWtXV1pXVFpFSHlNTEpLa2Y0d0VGQ1JKd3UvM2kyQ0ZnaEJDb0twcVZDQWhxUEdtQ2swNkpIRGRkZU5xZ0wvVjFCelltNTZlZnBNa1NkOXFaNVQxUzJkUmtUNmVHU1BhcHJ6WDc5M0l3ZzFHUnBRVW5Qd0tQVlhNZjNBcGc4Y013ZmxmQkZ4NzFpeGtWV01CY3ljUGJmTlozYlluR0RUbE9hWlAvaGx5aXVjNzI0ZmE3Uzh6ZDdQQzQvZE8rSmFPcThxS0JYOWtWTUY0TXI3bGtMV3FxaDk5L3ZubnEvTHl6djVNeDlKaU83TjN4TklVU1pJQ1FxaXFFQWpaYUZJTkJnT1JFcWxJbmxyZG9hOHdkYzBpTVRFeHFxQTlVaWFsVlJRa0pDUjBmbCtvM3N6a1dTK3daY3VJa0ljUW04M0czZzFQc2JiQ3dvaUJlYWN4c01rbWJoazdtb0pNTFJxeWF0MGJ6TjM0TVc5TktNYnFUT2ZWMzk1RXV0V0U2bk16YWNGenZGU2V4OVE4T3hkZWNCRTNqRTdGTEVQTnZnOFl0bklyMS9RWlEyZjM1WVNFQkFvTEM5Rk9pSXpCMEI3SVNVRmdrd21LVTZKRlRQM0JvRUs0SVROaHBOTVlteXBKVWlpb29BS0JqSXpNelU4OXRleVRjZVBHamJWYXJkUGF2WHMyMVZQdlVzbktTb3M2ZUNyZ2RUWFE0SmJKU285Y0ZxcWlVRjMyQWFXK0lTaUtnaXdia2VYd3hDVjcrQXpXanpTMnVWamNqZlg0ekU3c3NvYzZ0MHhHaWozOG1XTHZ4ODd0eTl0VUFDbEtkQ21PYkRSR3ZxUDZxS211d1pLY1RyTE5FcnM1a0ZYcXFxc3dPdEpKdG4vNzJlT3FxbEJYOVFtN2ErenRIQWVGbmR2ZW85L1lXN2huNW5oazQ4bE5TOFhyb3JxMmtiU01tRDZsS3FpS20rcmFKdEt6TThLMXFxcXE0cTZ0WU10dWIzQWZ0RGwwd3VQcWRkSGdoalNubVpyYUp0SXowc0xmVVJTVlJScy9iVk8wcnlwS1ZDUlQvMzhCbXVxcWNjdjJObjFlUTJvb0IvZVhQLzIzZjZ6WThzRC9tK3NtRWlEUWwwZnB6ZEQyVEU5VmtpUlZWVFhyUktnaXVwbXgyWXdzeThSWnJKaGtpRSt3NFhBNHRNVnV3MktPSXkwOWc5emNzNElWQldadER0VTJrcDZSUmtOTk5iYTBMS3k2VS9Yc3dnY1lNdmwvSXRGNzJjSElDUk94Tkw3TDNxb083dEZOOWRTNUZMS3kwcU91SjhYcnBxYTJIa2RLT283WStSbzhTbzIxMWZnc3pxZ2VyS3JQUTNWdHc2bEVSZU1veUl4dzdpeG5FdDVEZmdDY1hTTXdKWnNUeUxBYmFmRnBGMXRlajRpQ1pvclRqcXo0YVQyUnBrM1FMSTJBbXlFRzVDS3NMY0xncEJEQVNaSWtpZERGSGdRNGdTNWkyZzU3VTI2K2VVcmc1cHVuUEZsZS90a0hPVGs1RXd3R3d5V2hnL24wZlQ5bnp1cEs4dE5rS3R6cHJGNzNFdm5KWmxZL2NpT3pWaDdBYmpRZ2U2b3hGOTNDdW1Vek1WZHZZZmlVLzZWbTMyNmFiSGRUc2NwSjl1QWJXVHByRXVCbDlxUlJiTno3R2U3Q1d5bGRIbXhWN3Q1RGJ0YlBLQ2pKWS92ZVJnYjBTMlBmN3IzTVcvMHhZNG9jckh4NEJvK3YyY0cyS2lmVk5XOFRKdmMxV3hnKy92Nmc0cWFQMHAyN1diVDlLSlA2MmFndjI4Q1k4Yi9DbkpGUFUwVVpRMlkreGlQVE5OYWtsTDZJWS94elRNazl4dFlhZ2FkUlljV3VIZlQ3TnFQNDNuSW1qZm9WWmRXbFZMbTNNWHozQzFoeUwyZnRrbnZBVmNyNHNiK2h2THlVR25VWHc3Yy9ROUhvTzNoa3hzZ1Rzcjh4TS81R2ZtRU9lMHRyZWVURk54azNJSXVtN1V2Sm1mQVlSU2xXTEZhRmZlNTBObXg4aFY3Mkp1NFpmejFiOTFWUVZhY3lmUGg3NER5SGwxOStCQ2QwZUZ3bkQraE9WZklBcW5mdkpHL0FoYmdxUDZKbzJ0OVpmTnNReWpjczViYUhuMmZ2OXUwczJkUEMySEQxazR1N3h2Mk1YZlVhdEZYdjI4M1FXYSt3N000UnFLNUtwbzI5anQwZUp3NWZQUlQ4bkxYTDdnMVdUTlJ4Y1dyLy81d3hyT2pORjVhdnErcUFwZW5OVUY4UTBIeDZsaGE2YVV0YXVFM0VtUXlpVlZFSjlmMDBHK0dyMm9Pb0JoUHlWNGVRVkxBbUp0RzFxNU5Ebi95SDF5czlaR2VrOFB3enk3bmwwWmM1N3p3THkrKzlodm1ibXJHN1A4V1ljUjQyNVN2cWs2OWs5OHR6Z3BkSFBTKytYTWJzZTA4MkZ1ZmxpYWN4dkRnQUFDQUFTVVJCVkh0djRwRjFWZVNtbUtsMEpiTnEvU3ZrT1kxc2ZmbytKai84TmdXNTZWU1hsVEx3dHIrdytNN2dmR2phUlhiZXJZd2RuY3FHWFVkUVhJM01XL01SK2FXUE1QemhMUlE1QkUxTnRlZzZScDNDNGp2T3JRdi93WkpQRHJmNXJIWi9LUmZPZjRVRDN0amZCWGg2NVVvbXYvbngxOXFXcWdiNCtPTzl2UGJhYXl4YTlCZnV1Ky8zL1BLWHYrUzY2OFl5Yk5nd0xycG9JRVZGUmVUbDlTWTdPNXZ1M2J1VG5Kd3NKU1VsU1FrSlZpa3VMazQybVV3R2c4RmdsR1haSk10eW5DUkpWa21TRWlWSjZpSkpVZ3FRQWVRQVp3TkZ2WHIxR3REWWVPVC9DYUhXTkgrNlNuVHRmcUhZMzZ3SUlWVHh0MTlkS241Mi83TkNDRlc4OXFjYlJMY0xKb3ZqQVZVSWY0TzQrdXl1NHFrZERVSUlWUWloaWlkL2U0VzQ1YkV0NGRmNjVkTlhab3MrTjh5UHZIZDh0emlyeDZYaXNGREV6ZWNsaVgrODN5aGVlK0FHOGF2SE5rVytjM2lMNk5Iak1uRzRuZlVKb1lwM0h2dTFPUGZxZTdUOUVXNXg4L2s5eEVOdmxnb2hWQkU0VmlyT3l6eGJmSEJNKzY3LzR4WENZT2dpbm5xM1d2dTkzeU5hL08ydlZ3aFZ2UC84YkpHYW1ocXpkQmRQL3J1Mnc5K0VscmYvK2d0eDFlK1d0ZnZaRzMrNlNWejd4eFVuWEljUXFoQ0JPbkZwank3aStRL3FoUkNxK09TVjJhTGJoVk5GcTFERjBmZWVFSWI0czhTT3cxNGhoQ3IrL011THhFMFByUTMvOXZQWDVvcysxODl1ZjczdEhOZWJMa2dWcjN6cUU4Lzg3aXB4NDU5V2l5UHZMaFY5cnB1cis1MVBYTjhuUWJ6eWVmdjcrdFdISzBYdjNpWGk0K0QrUEhYM1ZlTEszeTRUQWFFS0lUemlqc3ZPRW45NXAxcW9hcUNtcnU2akJUTDhIQmdMakFhdUFpNEhCZ0VYQUVYQnVaa0RaRWlTbEJLY3U0bVNKRmxsV1k2VFpkbGtNQmlNSnBQSllKUWxHY2tnSmRrVEpBa2taMnAzc3JPelNYUEVZYktuY3RGRkE3bDg4UG1ZSkNpNWVoTDMzZmQ3SG5yb0lWNTc3VFUrL25ndnJyS1ZkT3Q5TGMxQzVibmZYYzJ2SDl2TWwyODhUT1pWZHlJQzVaeDc1aVVjQ2w2ZmdmM3I2Tkw5TWc2M2MrMisvZGRidU9xM3k2TGUrK0xOaDhtODhBYU8rclhYci8rLzYvblovU3NRUXVYNHNTWUNvZlVlM1U3UHJ1ZnlSZkI3NHVoT3pqQ1orTU1MdTRMcjh0TFNxdkRwSzNPSlAvTUtEcldxQ09INkJubHNxcCsvdmZvV1NxOEx1Q1UvMnFCc2J2eUtXMS8rZ1B0dnVJYU1HSWZxZXp2L3cvTU5kbDZZOHZYMG1pUkpvcUNnQUtQUmlORm93R0F3aGhtY0xPc2ZvM3h4WWIrYkpDa2g5aVpVVlEwcmh1allXNmkvUWlERTNpb3FLaFNucyt1cXQ5NWE5MzdYUTl0SE93ZGNlbE4yVUNsMjZKRExtUC9FYm1BaUFNV0RCbUdUQWRuSjRJRTU3TnBkeXVUaVFhZDBhR1diSFJzeWRvY2R1ODJPeldiRDdUazVtZTdxcmM4eWZVazU2N2E4b2UyUHE0ek5lenpJbTU3ajNpMGE4L1FwMVpSV3VPblhUNlB3NXB4QmpCOFlsT0F3V3VqTUVPMC9ZUTUxRStiOHNNNjYycjNzOWVRek9GaTluajlrS01iSnY2WmFoV1RBbmorUS9zbWFBVHBrME1Vc1c3c0xHSEdLRzdOaXN4bkJic05oYzJLemUvQ2U1TG53TlpReWJ2ejl6SC94WHhRRTkyZlR4aTM0Y3JPNTc5N1BBQ2gzcXh4NWYvdUtGVisxYnBrNDhjYWpKMkJwb1JwUG55UkpvVFNPZ0M3cUtmVDVhVDdGTDR4eDhaamo0akViUEtMVkQ5YXU4YmdQK2VuYW96dDJleEoyZXlLWjl0MGtkVTJoUjQ4TUVrUWpMeTVkVEhXREIxVngwOVJvSjlTQndXNnpZM1hZY2RvOElOdXc0aWJrRGZVMk5lQ3hPemhab3I5MTg3K3hJdlBnck45ckhMZXlubEx2SG1BOGFsTUY5OTcxSjNhV1ZlRlZmZFM3RzJod1EwNW81Wlo4Sm8zdEYzeGh4aEwwTldUM3Y0QVVNNER0VklFdHdJdHZ2TVYvNURONTZzcjhLR3V5MWQzQXJjOXU1TnFycitLcXJPaE0wNC8zdnM4ZnRydjR4OVFSZEQxRlpaTzh2RHhDemsrajBZakJFQUs2aUptcStlSEN2amdSZkpTQ0VWR2RiellLNEZRZHdJWEFMUUFvVjE0NVlqK3dKUE95WDc2cktNcTFScVB4aXBOeEtuL3pJVWRzOVpOWW5hZDJOK09uL0puRnEvOUZMNGN4dkIrcU9abGhZNjRtSzdpcTBhT3ZKU2MzVXU4b1cyMmNyRmR0NytvRlRKcnpYSnYzNzMzOG40d2ZrTUtQYjhqaGg4alpPQWxaSWFXSjI4ZmZRTW5zcHhoVGxCYTF2Z0ZEcjJaa2dRMUZVZDQrNjZ4ZUc2Wk9IWGRnZVFUUU9nSTF2WTlOMFptZVlYOXhxRStJTEJ1RTBTRHdla0gxdWtWRGF6TUlnYi9GUzBLQ2pUaXpqTWxxbzB1WExqaWREcXhHaWE2cFBlaDVabGZtL2ZJUFhMOXNNOU9IRldDczMweGF3UjlpL20zN2M5Sml0MlAydUhCQjI4Q0wzTjdWb1pKVmRER2pSNGR1L2xjejFaRUJLTnczNldvc2s1NW53eE9ETUZOTmNmSkYwZFBmYXNQU0RuTEpzdkViQkE4UXZQbjIyN3gwUEpsbmYzNGU4YnFkVmp4TjNQSFVlZ1lPR2NhTnZhUC8zdWZsSC9HYlRRZFo4b3VSbkdIOVppcjRQWHYyeEd3MkJ3SE9pTWtVRFhEdE1MY2d3RWxTUkhvOFVxRVFZbTI2d0VKQXg5N0NrK2pBTzA5K1lESTlXVnBUYytDZHQ5L1plRjIvL2xQQ1NyMDd0MnpCclU3R3BqYXllVnNsbzZaR1pLUnRWaHVORGZYZjdmWG5xMmY2dUJzWStlQUxETXZYSFh0N0FVUHlQVlM3bkl3YnJrbnV1QnNhTU5wTzdSemtEWnZLMnY3ajJzeGNaOHFKUS9sV2F5SU5EViszbzVPUGhUT25ZeDB5ZzJramduZnA5QUlLcldWczN0M0FoSDdKbEczYWlGSjRQbGt5ZUFCWDJWWjJOZmdvVGphemFjdC82Ti92OTVGOXNOdHcxZGVnOEYyVzNhZ3N2ZWRHYWdwL3paSUpBNkkrR1RKMElLOStYck5yMHVDU04zdWZsZnRwNk9ZWkEyanRnSnJrbHlRTitJUVFBUUVCT1p4d2l4b0lxQUxKZ05sb0VrYWpFZUZyQnRra3pzaE0xd1FpWlM4ZmYvWVZSbHNpNmFsZCtkenRvVnUzYmppdFhnNDJCUmllY1NiNXVRa2NjWGRsME1BQ2pNRDJkZXVvUDhuN3M1emRqMExmUHNvYW9TUUcyZEtjM2FuY1dCVWxFejlvOENYTW1mOFplZjN2UWJzSEs1cHNQaDZxcXoxTUxTbkdMRVBWcGpYc1BZV21YVi8vM0xZYzRvRk5YK0N5eERGa3ZxWVFhdTZXdzd2VEwyWEhoeCt5c2U0NEg3eStsbis4SG1RSGx3L2ovZ0daL1AydDk2aHRsTGxoNFRQQkZjV3piT1lFK3A1aS85VE16RXdkdUpuUWtnMk5ZVk0xbXNXRmdVNElJYVJnUGFtUXBFQW9WeTRjV05DeHR4REFSYkUzd0orUmtma3YyUmovM3I4L2VYNllFT0k2SUMrRlNvWU51Z3lqcHdaenllK1pNQ0J5ZG9lTnY0VkY0MzVGMGVvSHlCdDJDeS9PbjByZDloY1pPL052ZUJxcXFHcVFLU2w1azRLUmQvRDRqRTcwdDd6N0dEZnNsOVI2WGRUWFZ6T3k1R0xNR1JlejhjWDUxRzk2a2VXNzZpaWNlek12ejlWTzdid1YvMlprdnBVSG4vNEg0OGIvakRVTDhyRDQ2cWwyOTJEanJwVmtuTUp4TjF2dFpGaFBMYStoLzhoSk9CNi9nWUtpRjNBV1hjT1dwMmVkRkxCdFhQa2NqclJSRVdDVDAxaXcrQStNSFhNaEt3cHlLQzJyWmZHS056R2pBWnM5emM2OUl5L0ZhbFVwZDJldzdwR0lRbTM2Z05FTTVSb0tDOC9EbG40QjY5Y3Z3ZG5KY2Uxc3pKOTJCZXZLM095cjlMQjMzRVVzdERwWXNPcE5pdTE3ZVhEUmVzaXJvVi9SMzdUcllPWmYrZU1ORjMwMjlCZXoxdnlxNzZBUGV6OGNVSFJSVEwwaWh5K1dvVW5nRjVvYWh4S2NoMm9FMUNRaHl3aEZFVUpJTW1hemRqMGNiM1lKYzBKeXVBdWMxZXJFWVR5QXF6V080dUtMYUZqM1QxNSt6VVc4MFlTemF6d1pQZlBJN05tTG1WTnlHVFhnUW9veXJNanBtYVNkN1AxUHptRGM2Q3pXYjloRHlmam9iS21DVVZNWXVPd2Fjdkplb1hERXJheFpNSU9jRWJjemE4dk45Qzg4bjRKZTZWUlY3bVBFUFU4eWY5SWdicnR6QWxPSFg4Q3lnalM4MXU3ME9vV2NwdE95OHVEcmpLTkhqMUplWGs1VjFaZlUxdFpTWDE5UFkrTVJtcHFPQldXUFFsVUtMWGk5clhnOEhudytIMEtva3RhaFhpRVFDRWpCL2d1aGFnVXBXTEVnQjhIZkNCaURWUXNtdE1vRk14QjMzMzIvVHp6YlVuSDU2c0ExMXkyL2EyaE9nMWNtSStWMHpDNVRxYXVwQm91VHRPUWZoMGFJNG5WVFU5ZEFTa1lXMW1DK1JkUDJwZVROL0lEYVRYK2lwczVGZWt3YXdROHhoQkQ3RHg4K3ZHYk9uRG03SG52czhWYWRLZWxyeC9RTVBmcURFVTlGdDZoNlgxcXdpb0JnMG0zUWVqR0hHaGxqc1VTNnMydXF0NGs0SEVrNG5WMUpTZWxLdk5uQzJlZWNSMkdmM2xFbFVrMzFOYml4dFVsRk9kRndsYTJoWk1ZR2RtNWFmTkt1RGErN2licEdGMmxwR1ZoMEtUdnV4bm9hUERKWkdjbW4xT1hNK044K3VidDA2VUpoWVNGeGNYSEV4Wm5EZHl3OWc5TXpOeUhVVUljckljdCtTWlpsRkVVUmdVQVVld3NWMThzeDVta0FVSUxtcVIvd3o1Ly9nQTk0cmZjZzhZNzN6dUZEZTNSTHVoYm9lZm9kS1ptMGpPd2ZsZmZMYUxHUm5kMitZb0JzdHBHVlpmdWhBYTN5OE9IRGJ6ejg4TU1mL1BuUEM3dzZnUEozQUdpeGdRRkZIeHdJQXBzSWxVVUY1YnZSUUUzTFR3dFdFMFNCbXMybXFkNG1KWVg2RTJnZDJyT3pzK25kdXpmeDhkRm1reU1sZzFQSjlySG5qMkxoakVacVhTbzVKNm5yYnJFNXlMYTEzWnJObVlMdEcvQ0QvM3JHcHB0RWZQYlpaMVJXN3VmZ3dSb09IVHBFUTBPa3Z0VHRkdVB4ZUhDNWp0SFM0a1VJZ2MvbncrZno0ZmY3SlVWcGw3MUpRZ2c1Q0hDaG1sTkRrTDJaZ3V6TnJGL3V2bnRtNHU5Kzk3dExuVTduMVpJazllR244ZjJ5dUtZYXR1eHpNV1JBL2cvSGpWVzFyTDYrZnYzczJYLzg4TWtubjJ6dEJOQmlGMzhRMU5vRE5EMm9oVmxhRU5SRU1FY052ZVJRQk5UMDFRU3A5T2lSUVU3T21mVHUzZnNIYjdyeVhZMGZEYkNGUmxWVkZaV1ZsZFRVMUZCWFYwZERnNmJHNjNJZDQvaHhOMGVQSHNYajhTQ0VDQmJRdCtMeitmSDcvU0ZsM2lCekMwaXFLcVJnNURSa29vWkNRZ2FkZWRvdXdPWGs1SmkzYnYzUHhhbXBxVmZKc256aFQ1RHo0eCtCUUdEN2dRTTE3MXg4Y1VscFRjMUJKU1l3MEJtbzZRRXQ3RWNMVlE4QVFoL3hiTXZTVEpqTmNlZ1ZiNjFXZmQxbnBKRnhSa1lHT1RrNVpHZG4vNmpQaGZISDlvZXlzN09KajQvSFlva25MaTRPc3prdUhHUXdHazBFQWdGa1dVWUlvVE5UV3pFWURLRTdZWWk5aVVBZ2dDUkpvYnkza0VrcXh3WVhZc3hUSDJDdXJLdzBwNmYzZUFmWVVsNytXVkYyZHZaUWs4azA2cWZMLzhjM1dsdGIxKzdidCsvZG9xSno5K3ZBVE0vU2ZPMkFtcjhEUUF2b1VqakNabWNzU3pNYWpVR1dwb0dheFdMUnlYZ25ZTE1sa3BTVWhOT3BseDNLb21mUEhGSlRVMy8wNThUNFkveFRxYW1wV0szV0lNQlpzRmdpQUJjSUtCZ01CbFJWRFVkUXZWNWpDTnp3K1h4Q2x1WDJmRzhpYUpyR1JrOERCSnRpb0lYaVRYcUFBOHk1dWIxM0FudmVlV2ZqUzhYRkZ3eXkyUkt1Z2xNS1N2NDBUaC9YUjgzeDQ4Zi8rYTkvYmQ0OWV2VG9oZzRBclQxUTgzZkcwRG95TzBNc3JYM1RVKzlQMDRJRVNVa09uRTRuS1NuZDZONjlPMWxaWjlDclYwOFNFeFAvVDV5ZlV6WkZtMXd1anZsbGVuU3hSUmNBQnhScWp4N0hFSjlBYWtKMHI4cVdGZy8xYmgvSmppUVNUTkwzTWZrb0x5L255eSsxaU9taFEvVWNPRkROMGFOTnFHb0F0MXVMbUxhMFJKckZ0TGEyNHZmNzhQbTBoakU2M3h1aDVqRnFRS0FLSVFmYm1ZWk0xSTU4Y0hwVDFRU1lKMHlZWVBuVG54NitJQ1VsWllqUmFPeFF4WGZQNXRWWThvYVJsM2J5elVOcXk2QkNnVUdGUDY2SldyRnJNMnBHTWJuaFk2R2lLRkZsNWhpREUvRkVKY2lxcXVxSzM2TStvYjZtR3AvWjBTWWkyTlJRUTZNYjB0TFQvblhvWU0yN3Yvbk5iejU5L2ZYWC9TY0phUDUyQUMzUUFVTlRRL1hPd1FBQjBTd3Qwcnk0clQ4dG9xUG1kR3BCZ3ZUMGRNNDQ0d3h5YzNPL1UzOWE5ZDZ0dUoyRjVHZWNIaEgzNzAyMmFQbnFWVHkycjVuVVJETzFqYzFNdnZwS3BoZCt0MjBISkVtaWQrL2VKQ1FrQlBONTR2SDcvUmdNUmxRMUVKWGtHNWs4QmxwYmpSZ01QdngrdjlDK0wwdUtFa0JSRktINEF2aFZGVWtTS3RwTk5hd1dFc3gzTXdRbmE0akJHWU9BNWdzQjI0b1ZLMXBYckZqeEwyRHJ4bzF2UDNYKytlZGZrSmlZT0ZTU3BDaGRsL1ZQUDBUeWxBRmZDOWoyYllNVmpUOHVZRk5kNVV5Wit2OVlzZjN0OEhzcjU5M0F4QWZYayt5d2hhZnlJMnMrWW55L1JvcHQ1ekp2MzFHR3Q4ZUpQV1VVcEJWZ0gvY3cyNWZPakFCWHhWYkdqYnVKV21NR2RxVWV1ZkJtdGo1OUQzanJ1V1BDMVordC9zUzNPY25RL05ISG41WWYwWUZTZTREbTd3RFFsQk1BbW1nL09HREFhRFRwcFlhSWl6TVRGMmRweDUrbUtkNTI3WnBNYW1vcUdSazkyUDM2WXR6WExhTDNkeHdrc0NrMWpKbStsbTFySDhSOEdzeVpVMkJzclpRZWFJbVNMWHF5S1pXM0poVFRlT1FJM25oN2xHelI0TkUzTURYUFRrdXJqL2c0N1M4ZjJiK1hpNS8vZ3YvTXVvYnZTMDZ3cWFtSnlzcjlsSmFXVWx0YlN5QVE0T2pSUm80ZDA0SUtzZmx1UVdYZVVOUVVSVkh3Ky8xUzgvRUFmalZBbkRrU1BkVUZHQ1Foa0tGTmtNRVFaSERHR0JZWHRYejg4ZDY4bmoxN1hoZ2ZIejlFVlpSMFZjZENUZ29BVkcyUmpUR01KVWhoM0kzUTVJT010SzhKTEY2b3FvV01iQWlsR25tYW9LNFIwcktJa3E0SjFiNVVWMEZ5QmxoMXMxenhRblVkWkdXM3ZhT3F3YzlTMHFOL0E3QngwVFNXTkE1aDFaenhPbUQ3T1F0ckxtSHI0OU5qMWxSRi8wNkFyWEx0ZzR4ZHNndDMyV0UyVi95YmRDT0FtMG45ZTJLZjloS0xwdzBHb0xTMHJQYk1NOC9ZL05KRDB6Nzh4ZisrVUIzeXFaNEVvT2tYSmNqUUF1MlpuQVNGVDRNMXpURm1wd0dEd1JSc1dteWlJOU16SVNHQlJKc1ZDWWt1S2VuMHpNNElCZ2t5eWM3SzRwRnBBM0ZNZnBPN1JtUkh5MWdCN29aYUdyeG1zak9TMjh5VnhycHFGR3N5S2Zib202cW5xWjY2Smk5cDZSblJVbEg0bUQ2b0Q0TVh2cy80Zmo5OGc1ZnZUYllvQkdxaFkyYzB5SHlmZ1dhSHc4RTU1eFRTMnVyRlpES2hLSDdpNHkzRXhWbUNRUWJORWR2Y2JNSm9iTUZrTXVMMWFpek81L1BoYi9WenBNRWdWRldSQkFxdHJZcVE1QUJtazRxRUpIeCtEZHhDUVFaWkRnY1pBa0pnQUNsWXhTTkN6SzBOeVBYdFc3Z0grQVI0K29JTEx1aDc0TE1QejcvN2hZckJkdzdQU0QrWi96aHRPT3lxZ093SnNIcGU1UDE3eDhBZUdWUTNWSmZDMEZtdytMWVRyKy9wbWJDcUNlcDNBbFl3RnNEV3BmRHdkRmkrQjNKU29MUU01andORTB2QXZRY3l4c0hJWEdod3daNDYyTElMY3UxUXR4c0dqNGFNUXUyZjc5c01XNXNnRzlqK01reStGM29WUVBrK21MOEN4dllQd3lFclZyek82RVVQZnl2ellNM3FOeGc2NFZHOFM2OWw3ZllHcHBVazQ5MjNudFVWV2V5WmZFbXR4K1BaVWxIeHhVZm5uSFBPZmoyNzZnRFEyZ08yMEh1aG9GSWdER2l5ckVwQ3FHcW9JemdJSkVrWVRTWU1zaVM4TFMzSTVnUzZXT1BBM3l3YWpyckl6TTdHYXRGQXpXS0pJeTR1MUpIZFNrS0NqWGpKemVzdnY0RTE3UXppMUdaU2lzZng1SnpCMkJwMk0yNzhQWlR2cWNGWWVSTWJGbGtaTVA1dTVrMGRCa29qc3lkZnk4djdWTEtzSGhwdHhheGQ5VGZTTERCelJDYmJQSDB4bWczVVYrNWw5T3puZUhDeVZzLzU0dHdibVBWeUpZVzlrcW5ZVjg4VFczY3dJSXlKWmthTnVvZ2xMNjlsZkwrSlVjZmNWYmFlQ2ZjOHk3emxLeWh5bkxiQXBoditacGJ0K0lKeGw3Y045bjFWOVNsYmpqbDVXVmN6dXYyRDkxbjAvbjRxajdReWI4TFB2bmYxVjRQQlFNK2VQWW1McytEenRXSzFKZ1M3WE1jQ25KbVdGaTJLMnRyYXFvR2IwY2NaMlVhTzF2bUZLK0NuUzZJV1BRMEVBcUxGRndCSnhXeFNoYXFxa3FJZ0NSQ1NGSTZpQmdDREpLR0FaQWhPZkdQUVREVzJBM1RHSFR0MjdBTDIvT2JLcktjdTIvdFI3NXljbkNLcjFYcGhaN2x4U3pmQTJvV3d0SjF5VEZzQnJKd0xUZHNoZXhvc3ZPM2tUdjcyUGJCM082Ulp3UnZzQ2pqOVliZ242RXFwV2crRDU4TEVEY0U3ZWgzY3N4TUtIWERQY0ZpNUVlNGJBdy9mQzJNZmhIa1RvR29EOU5vWXZNazF3TVRiNGRuZE1EQWQ2clpDOFYwd2VrdHcvM3dWN0N5MWMzdEIyeXVpZE0xZkdGcnhxamFSMHk1ZzlmSjVuV2U4cTNXc1hsZkY3SG45OGRSZXl1TnIxekYxNE1TeThnLzM3ZkIwY1pUMWpEUG9tWm1xWTFtZEFacWlZMmVLSHN3a0NUWFlsRmhvaWd1U2tHUkpHTU9SVG9sV2I2dFFoWUY0czRuNE9CT05UY2RGZ0hpT0hXc2hMYXNuU2JiNHNEOHQwajNLaXMybXFkMGUrYlNVaEw0amVmaXVjZlRva1U1NmVqcFpXVm1RbTh2R2plT1pOZlpzSEpPZlorYkk3UEJoMlB6NGJOWjRMMkx2cm5tWVVWazQ3UkllWHI2TkJWTUhhaVJnd0RqV1BUd1pUL1ZHZXZXL20ybmpkNUJqcVdQSjRzMHMyM3VRUVdtQTRzTVhZMHdVRmhheDY4R2RoQlJ2d3JjbVZ4MjdkbjJFMi9mZkVCVTlCZG1pdm5sbjh6L3BaN0IxOXdjc2VtY1BsMDBkVE1JUFFGTlRVbEp3T3J1UW1KaUl6WllRRlVIVkp0RngzRzR6WnJPSGxoYU40WVZNMDJhekQ4bHZ4R0x4aTJCZ1FmSzRGUXltZ0RBYXRSNE5BVVVWSUNSWkRrZFJKUTNraEJ5OFVPVGdoV0FJbXFuaHNxMTJnTTVZV0hqT1IwRW05OUpiYjYzcmZ0NTU1K1U3SEk0aWs4bDBJWEJTblRVR0J2WC9IRmxnYVFRM25GUjIrYkF4R3FnQllYbVl1cjB3WXlHVTEyZ21aTDF1Z3R0eU5WQUR5TXFDVU8vblhidGg5dFBhOCt5QmtCR2NlVlhib05ZSXF4ZkJHa0QxZ2FzVWFvRXNBRmNEalVZSGpuYmNqRG1Ecm1QeG5LREV0OUYyUXQ5TzQvYTFsS1pkZHV6OHJvRWQ5VVhGZTkrWjlOY3ZEQTlOUGhMeWtYYkN6dG9ETmIzQ1JyVHZERlNCcEdxUFFvUjdic2l5TU1nSTdZYW9DSkMwM3BFR0l4YUxSUmlOUnRLTmNQQndBL2JVYkxwM3Rlc0NCQnFvMld6UnFSelpDZWZ6K3FLVlBMc3lnV0hEUnBCYmRHS2h4eTFiL29YWjA1L1o5LzQrNkRid1VHZlpDMmpBTm1TUVpvNWJzd1pTYkM5bGQ1VkNUbDR5UXdZbGM5dTRheGczOGpJR0R4L0ZvTUtzcVBYYW5RNWM5VWZhYk04NVlESjFkWk5QZDFNVVRsVzJLQ0hCeGxrSk5zNjZzb1EzNXE1ZzI1Rkx1THpyRDVQNWJMVmE2ZE9uRDNhN25jVEVSQklTYkZpdFZxeldlSnFhTkFibmRzZGhOamRqTnB2d2VrMTR2YTBjTnhzeDRDYytQdXg3RTdMa0IyTkFNcHMxQnVkcjFSaWNMR3NwSW9HQVFKS0ZoQWdIN0tUZ1hWM1dtSnprMS9uaURERWdwd2M2WTFCQzZRQ3c4Wnh6Q2szTGxqMlZrNU56Wm0rYnpWWm9OQnI3US90OWxjT0tMbCt6OE00U0crUnl3OWl4TUc4ZGpPd0hudDJRTnFXZDdjUnNTemFDVDRuNEl2U2VYWHNHakJrZGVUMW1QSVFGa093TzdJb0xseGRpNlpqVmtVNWUzZ2wxOU4yS29uemdjcmxLRno3K1ZPV1JEN2ZYMk0zTDFSaG1Gb2p4ZzNVRWFIb3cwLzlHMWZ2UGdvMGlWVWxDSUJDeUxLTUdBa0tXRGFoS3F4RElKTm9UTVp1TUhHdHNFQWFUQmw0bWt3bVA1d2l5TE9Ieks5Z1NiY1RIdE1RTDlmbDBPcDEwNjVaQ2V2cUZiTHZtSmo3NzlGTldQZnNnZjMzdEE4cld6Tzg4S2d3VURyaWMwY09DZ2d1anI4YWVrbjFDcUpqejh2dU0zcjZGTFpzMk1ISEkrVHk0N21NbUZFZWtxdHhOTG16TzA2T0QxZmNrVzZUeTFiRVd1aWRwL0t5eHZvNERpcGt1bGgrK25DTXpNeE9Id3hFRU9Gc1k0T0xqajJLeGFPQ21CUlphTUpsYU9CWm53b0NQaEFSanFHS0JoRGdqTHNVdkxIWURpaThndVlXQ3lSd1FKbGtsRUFqZzk2dElraURZVHliVTZGbHZwc3JCQzhRZ1NWSTQ2S0FEdWZiQXp2alJSM3VONTUxM1hpbXdEMWg3eGhsbkdHNGI5WHhXcStHc0hKOHZxYmZKWkNxUUpLblh0M3JBR3FIYUNDVkYyazZ2VzMxUzZtUU1HZ2pyMThDSUdiQjNQZFFvRWZabXF3WTVHNHFEUVkyR0JoMkdtWE1wem0ya3ROeERZZUdKbzhOQ2lBcFZpRStPSHE2cjJGeXg3OHNiYjV4MHFLYW1SbzFoWmUyeHM0NVlXdml6b05LTEVyTU9WUWloVDlVUVdndGNTY2d5QkZTRXdXQkE4ZnVGd1dSQ1ZWb3htT0t4eHNjSmd4UkFVU0UrVG10N0o3eE5mSFZNMEsrNG1PcTlIMURqeXViOE5JY3U0VllmOWRUcVBidDI2VUpxang2Y2ZlNkZETy9uSUcza2MzZzFsNmpHb0MwVzZoc2EwTHlaMmhnODZGTHUyVnBKdjlrVE5aYXJlbWhvaXR4cU5tM1p4TXlSVS9CVWIyT25xNEFGMlViQWg4dXRValJ3S0VVRGg5SlUray9LeW10QkIyeGxaYVVVOVcvTEdOM2xtNWd4ZnhYM0xGcE12djEwQmJaVGtpMUs1Uy9QdmNTN0xSYTZ4Y3Q4ZWFTWmNTTXZvMy9DYVFIdUpDWW1VbEJRUUZKU2tnN2dFckJhRzJscWlzZGljUkVYMTB4Y25KbkdPRE1tNGNWbU05SGFxa1ZOMHpKOXVDdE0xQi8ySTFSRnlHWUZlNElpQlpON2hkY2JRRGFxUWhhcUZFcjAxUVVhUWlBWFpuSEJ2RGcvMGJseGhoaUFhL1A4eXkrL05QenVyeVdmQVJWeEMza0hNRHp5eUo5c2g1b3VUMDkwOWNocWJiV2RhUkttWGlEM1JsTW8rZm9qQzI0ZkNDVURJTWNHeVZrbk40bnVlaGhHajRIOHBaRGJIN0tDZHFPY0RDc1d3YVNCV3ZEQVZRdm0vckR4OFloVGV1eTRLMWk1ZmlNVENrZEZoK2VGK016cjlYNXgvUGp4TDZ1cnF3Lys4NThiRHQxLy8vMHRnRHFoWDdvNEFaaDFCR3F4ejhOTDhQeEVKZElHMndNSmlLUnJJRWxDUXNKb2tJUmYwZEtLZksxZVRPWTRMQ1pWSEdseWM3akJDMExDYUpBd3g4VmpOY1BlZlhYazlSdElhbGM3R1lNdjR1Mk5PL0hrOXlhN1czSlFsY05KdDI3ZHdxVlJtWm1aYkhyaUxpNWUrQjhLOHJLbzNMdUgyKzc3QjNyNEh6dnRONHlkZGdNYkY5c1pQUGwvV0RCakJJT256V1hFenVzb0tMcUkvQ3dIRmVXVnpGajhKdE9IYW1TL2FmdkxEQnI2R2syVnBVeDYrQmx5TEFCMWpDKytGSGRHUG5ZYXFIVG5zbVprWVJSNVdidm0zNHlkTzYvTnVmZldsL1BNTXk4eDhjSHZEOWkrMTFyUlprOHpSN3dLWFJNVFNUREpQd2lJMWRmWDQvUDV5Y2pvMGY0K05qZFRYVjBkVHVnOWNpUlVhK29LeXlDMXRHaSt0OVpXYnhEY3RIcFRqOXVISWhTRXFxV0hoSXJxUTlVTHdScFVnaldvb1VKN1FrQ25lNVNEZ0NmcmxwQ01raUdtQ2ZTSm5odGlmdy9JcTFhOW1weVhsOWN0T2JsYnFzMldrRzR5bWJvYkRJWU1TWkl5MnhwOWJVZEREU2hXU1B1YUVTQkZBV29oYXlpVWwwZnNabFdCbWhxd0o0TWpZa3g3aFJBSFdnL3ZPamh3K0IrL1dySDI2YStVeHZyRFpXVmxSNjYvZnZ4UklocDY0ZlNKRHNDc0k0Ylc0Zk5ROGJudTkvb1VqWENxUnVneDJCMHRxTllzaVpCY3ZXNkpsRU1aWkFRUzFnUWJscmhRbmFjNUdQRU1CUWdTd3Uzd3VuUnhoRmxhS0RpZ2I0WG44N2lvclcvVU9qcFpUejZMek5OVVQ0TkxJUzA5SFhQdzdqUnplQ2JaTTk5bllxR0NZbkdTSEpYdW9kSlFXNHNiTTFucEtkR3BJL3ZXTW5ENk9yWnZYb0wxTkNBclA3b2krRzhLYktGUlYxY1hMS1EvUkVQRFlSb2JHNE1hYnhHbEVJK24vWW9Gdjk4ZnpuM1RWeTRFQW9vVUNLaGhnQXNFMUNDd3FhaHFHTlRRTWJxT1FDNE1VREdxSTUwdGNzeHpPZVo1YUJ2U280OHVzUFh0MjllZWxwWm1UMHBLc2x1dFZydlpiTFlialVhN3dXQ3d5N0pza3lUSkprbFNnaVJKOFVFZ0RBa0FHSFRldFJBdytHcTM0cHY1TE41emU0dVdiYStKNXZRSndyM3dsNm83RUFnY1Z4VEYxZHJhNnZKNFBNZWJtcHBjWDMzMTFmRzllejkyMzMzMzNSNGRlSWtZSUJPZGIrLzA0Z0FBQzh4SlJFRlVnSmtleURwaWFsRkxKMEFXQldaNklBT0VMRXRDNjVJbVlURElPa0NUTVJpTXNaVURSQkp0MjFZUWFNbTJtaUpIWXFJOXpOS1NrN3NGdTdGck9XcmY1UWdCMjR5aFgyODcrN2F0cGNGUlRFbis2U0VQL3hPd2RaYk40dmR6NE1DQnNJQ2xKb04wbEdQSFhPMktXRWFyaGZpQ0FLZTBBM0FSRnFkMXVsZEQ1VnJFTUxqT1FLNWRzTk9WZDhtZGdKcWhIV0NMWGZUYjZXeWhuY2ZZNTlGTzJyYlA5WStkTGJGQUZydDB4TkxhUEE5SnY3Y0hZaWNDczlEem1KNGFVZXlzTGFDRlFDMVN1TjZSR0dSU2toMkhvd3ZKeVYxeHlHNys4MkVsRG1jWERJYm8vdlQ5aDQxblFPNjMyMTE5Mzg3TldIc05KTXRwL3ErK3puOEN0cE1ZeDQ0ZDQrREJnOVRWMVhINGNJaTlSWFRlbXBzOU92TTBVclVRcVRtTkJyaEFJQkJscHFxcUdnVnlRcWlTcW9xd3FVcTQ0Yk9RaEVBUGRGSTdJQlFEVU1LZ1ZVTzB5OUk2QXplcEE0Q1Qyd0cxemdDdU0zQ0xCVFRhQWJIT0dKcmFBVnVMZXEybDJraWRnbGpRWjZick54djJtNFhBTEdocVNraFNOSmpwUUUyRUZHUDBnR1kwUmhoYXFIcWdiVjZhVFZmbkdmR2w5ZWpSZzZTa0pINGEzM2xVOVAvZVNFcEtJaWtwaWE1ZHUxSmIreFgxOVllQ09tOUhneVZaeDRNRjljM2hnbnF2VjErU3BXZHZJUk0xRUtVZW9nbGNCZ2dFVkZSVkZVR1FFNnFxU3FGK00xcS9CcUpZWFBBQ2ptVjBPZ0NTWkVtS0JUd2hCd0d5TTBEckROeStEblA3T3NEMmRjek9kZ0V1Q0VpZEFoalJ6YkxEb0tyM21ZVmVCd0V0aXBscFFDYUgyajZLRUZPTDFIWWF3d3JPRVpZV3FSNndSS1Z3aEZoYUVsMjZkQ0U1T1ptVWxGVFMwN3YvbjVBWCtnbllmdUJSV3ZvSnVibG5rWnFheW9FRE5kVFZmY1hodzRjNWN1UklsSkJseUR6Vks0Ym9hMDQxMzVzR2NvRkFHT0FJQkFKNmlTUkp4K0JFaE1tSjBLT0lNVlhSUjFjamJGeEk3WU5TRk5oRmZhY2RjMWM2QWJCMXhOcGlUVkxSQ2JoMUJuQnFlNjkxb05RWnM0djlUZFMyOUs5alRFMWtXZFlGQS9TQVppQ2t1aEVMYUFaRGhLSHBpOWJiVTdiVnpNNklFR1RYcmwyRExLMDdtWmsvS1ZyOUJHdy93TWpNekNBMU5ZWGEydHF3U205Yjg3UTVHRndJQVp3dnh2L1docjJGQWd4QmtGTTdCRGtkd0JITjVxUllvSXQ2M3M1bmJaWmdIbDBuekV4TDB2b3VmV3hCMW5XeVRLNmpCYjFwR2ZPYTlsaFppSm5wL0dmdGdGbkk3RFIyd3RMMGZqUnpVQk13WGljQ0dXMTJodFJ0MDlQVE1adk5QMTFnUHd5d0JkaXhkeC8vclBpS1k0cE13Vms5dWVIY016QURyYzFOdkxyck0vYldIY05nc1RHeXVKQUx1OGNrd2l2TlBQWHZqem16OTlrTXp2anY5UjJZeldheXM3TkpUVTF0WTU3cW82ZlIvamM5ZytzNGVxb29Db3EvbFpaV0NZdFppZ0k1WGJDaFBaQWowaVlWS2ZaUlZWVWtXUTRKMk1ReU96cGhZcnJYVWtqVzYyVEJyQ1BHRnZXZUNOblpKMlp5ZEFKZ2tkOExJVlJWWURESVVVeE01eTlEbjZJUkMyYWh3SUMrQ2JlZW9YVVc3WXo0MFN4dC9HaWhhR2VzMlJuYlVLVzlVYllic29xZzNaYXc3aW9tVEhtWXhTdVc0TlJkMWJYbGU1QlQ4a2x6ZkR1QTZTbGR4ZUM1dTlqNTh2eHZ2SjRoYzNleC9SVFdjekwvNlJUMDJJNnplbmN0UllYWnBKcFZscjI5a2MrT1g4YURnN0w1c3JLS2o1dGxMdTJiaS92SVFYNzk5NVVzdm1NaUE3cEVOdlBXNXEwc2VlOUxyckwxK0s4R3R0Q0lqNCtuWjg4YzB0SlNxYXVybzc2K1BtaWU2djF2SVlCcmFTT0wxRkgwdExuaENJY2JBK1JrcGVqVFE0VE9ENmNIT1lSUWhSWndVQWtHSHNKQUY3ek9KU0VFa2l3alJjQ09rMkZkTWNCM0lqQTcyWEtTTnFhcGlQdzRDcVJDN0tvanRxY0h4UER6NFA4ekdBemg5Mk1DQUVRZVk4Rk0xalhkMWdPYUlkaVl1Nk5vWjdTc1VFaUZRd08waUIrdGE5ZXVwS1Nra0phV0ZwV1BkcUl4YlFRc3JJRCs3UlROclZzeUI4dUE4VkdnQnJEa3ZwL2ptUHhXVkJIOE43cWhweFZ3KzZSdm50S2hlbDFVVlI4K3BkK2V6SC82K3NBbU8zaGc4dVhobDEwOGg3bDF6NWN3S0p2Y3ZrVTgwRGYwU1RhN1AvbVVMZnNiR2RCRk94Q3V1djA4VjJ2anVqT3RlSDVrMURjaElZR2VQWHZTdlh2M2NQVDBTTzFuUFAvQ2UvUXRLY0hlY2h6WG9VbzJmVkpMbjc2NUpMUzJCQU1Nc1F6T3k0RXZ2cURwV0ROQ0VSdzVjZ1JWTXBHUzRvUkFnSURpNWZEaFkxaXRSbkhNNVVKRnhwN2tRQloreWVWeW93UzBXSUlwemlKTVJna2hCQUcvRDE4Z0lBQkpsZzFJaE1CT1JWRlVMU0NocXFDeGxwTUZyVFlBcGtYWXBUQ2xDNmJrSTdjdmNpakMzd21CclBiOVlGNFlZWUFLN20yUTFXbUFKSVFxaE5CK0wwa3lScU1oQkhBRUZEOENDVW5Xb3BRaFVBdjRXMUV4b3JTMkVoQmd0ZG14eHBuQ1FOWk8yZ1p0ZldudE16U3Q3MEFRMEl6eDdQbkVTdTRaTm5ac1M2UmJUaEkzVDNTUTNrM3pveDJ0U09OdnoxaHh5VEIrT2d3dEJEeXdjQkdNdnhQU0xPQ3JoMGVlaFJsM1FlVW1XTGtacXR6dytGeElNOE9JU1RBd040UVNqU3grNGwvY3RXVnArT0EybFc5andiTnZzYm0wSHN2eVA5TzAzVUhlNEd1Wk9GUnJabHk1Y3kxYm01SkpxZDNDaTVzK0lYZkl6N2x2OG5BcWQyM2c2WmZmb3JxdWtmVGM4NWx4KzNUUzdScE1ySHY2WWJaVkhNZWFkWDdVaWF6WXZvYnRqWGE4ZXphd3RlSUlJNmY4bHJFbHVTZHgxZmhZdldRZWEzWitTYitSTjNIYjJCSmtvTDU4TzB1ZlhVVjU5U0djR2IyWmR2dWQ1S1ZaVC9pZlZFODl5eFl2Wm12cEFiNXgrdituOVEza3ByZVRTK00vVHNVUmxUNnBRVmFtK25obzdVNm1YM2srY1QvT2psK0FWbHlmazVQRE9lZWNRLzY1Z3pqSDBjQ0xHOHZJeWtwangvbzFtRFB5eVV4THBWdTNGSktUdStKME9uRTR1b1RMdWV4Mk82azlNa2gxSmlLWkUwaExTeU0xcFNzSlZvMEJ4TWNaY0x1UGMrUm9NM2FIRTd2Tmd0RWNSNXhSRnJJcFR0aVRrb1F0d1N4OExjMWdER2EwV3pRNUpzMDJNd21UeVNTTVJxTXdHaVFSQkFoaE1CcUUxc1JCVWcwR2d5ckxjbnRMSUxpRUd2ZEdMNXIybkNKSmtxWjRvZFZWaGwvSExBRkprZ0t5SkFWa1dRNG15V3JybG1VcHZCMkJVSVdHdW1wd3U2ckJZRkFsdEk1TkpwTlJTS2hDQ2FqQ2FEUUtrOGtrVENhek1FaUlnQ3AwaXJOeGlJQkNhMnVyc0NRa0NwdFpGbTdYY1JFWHIvbS9Jbzc5NEhHT2o4ZHF0WEM4c1o1RGh3NVJWMWRIYlcwdEJ3OGU1S3NqYnV4Mk8wbEpTVGdjWFlKK3NxNTA2NVpDYW1vcTZjbmRlVzlMQm1VTlozRDk5VGswN3N4bFcxMCs1NXh6RGtwRkR0ZmVhYVZrTEV3YUNYZU5nWjMxZ0JXeWZERHBIazBzZE5ZVWNLV0JYWWIwWGpCOE9Eak5VRHhFZTU2bHUrUjg1WnZZS2ZkblFIcUVwMWlTc3hnMi9BcXlVMnowNm5jeHc0ZGZRYjllRVZtL3lwMXZjdCswWDdDcXdzTDRpZGRqVlZ3QVZGV1UwMnZBbGR4KzF4MWt1ZDlqMkpSNVljR0N2SDZES2NrSzhNaXlOMktBN1ExbVRMc2J0V0FvRTRabU1uM3N6VlNmaEVSUjArNVZiSEQxWXZxVWExazkrem9XYjZnRW9LYXlBbWQrQ1hmZWRRY2xLWWNZTnVJVzNDZjZUNnFMR1NNdVpsMk5uV20zMy9ITmdnZlYrei9oc1U4Q1BEbmo3RmlpeVROck5oSjM5Z0N1N0tHVkpPN2M4UjVObVVVTTZtYm13LzhEemt1THhVSjJkalozTFg2QlR5Ky9tTWNmLzRER3pKSE12dTRTM0M1OWlvaW5UWW1XMVpxSVRiaW85UGpKeU1pSTlzRVp0Um1UY1ZadkVnMUNaNlphTU1mN2FQWTBvMGp4eUhLTFVERVFGMmRHbU0zRVdWUWFXcjJTMFJ4SG5DRm9zaXFDRnE5ZnhOc1NrSVdndGFVWlJZRFJhQ1Jpd1lxUU9Sb21Xa0VpRmtXK2hORGlwcW8vQUxLTWpDb0ZBbUF3R0pHbGprMVFqV1JKK0gwK0pJTVJveHg1RDBBRUFnUWtDWXNsTHNxa05KdE5CQlNGZ0Nvd0dtUjhBVUZjbkJsSmtwRXNGcFFXRjY1V1NWZ3NjV0Z6cy9XNGhDa3VpV1NuQTFsSzRIaGxMWEpjUFBGR2ZiV0FQakFnMDJwTEpJNW9jOVNjMkFXbnMwdVVEMDNmU01WT0VpYWpnOS8rMFVtLzFHNTBQNTdLcXpWR0xCWll1aEFtem9JUkpkci9uem9VVnF5RjRpa3daaFpzSGdGanhrQlRDbXdNeXBxbFpHdUwzUXo5U3RxYW9yWGxWVmh5TXFOa1hTek9ERXBLTWxpZllzV1JYMHhKU1Z1enpaaDNCWS9QdXgwWkdCNThiOGo0R2RSVzdHVnZlUTBaaGVkUzkreGJOQUxKUUU1aE1TbStNdVJsYlUzSWdwRTNNbTNVRUtDWWdiUCt6TjVhVFNtNTA1RStpUG4zanNjQnpKcHhEZmU4dUlyYmg4MmszL0NKWkZmdlkwOVpKZVplNTJDcGZJQUtOeFIxOHA5Y3UxZXp2RGFQbXMwenNRUC9IM2l4Z0ptUU81d3VBQUFBQUVsRlRrU3VRbUNDIl0sIFsxLCAiZGV0YWlscy1jb250YWluZXIiXSwgWzEsICJkZXRhaWxzIl0sIFsiaHJlZiIsICJodHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy9hcGlfZG9jcy9weXRob24vdGYvZGVidWdnaW5nL2V4cGVyaW1lbnRhbC9lbmFibGVfZHVtcF9kZWJ1Z19pbmZvIiwgInRhcmdldCIsICJibGFuayIsICJyZWwiLCAibm9yZWZlcnJlciBub29wZW5lciJdLCBbImhyZWYiLCAiaHR0cHM6Ly93d3cudGVuc29yZmxvdy5vcmcvYXBpX2RvY3MvcHl0aG9uL3RmL2RlYnVnZ2luZyIsICJ0YXJnZXQiLCAiYmxhbmsiLCAicmVsIiwgIm5vcmVmZXJyZXIgbm9vcGVuZXIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBJbmFjdGl2ZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1dGV4dCgyLCAiRGVidWdnZXIgVjIgaXMgaW5hY3RpdmUgYmVjYXVzZSBubyBkYXRhIGlzIGF2YWlsYWJsZS4iKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2Iik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDQsICJUbyB1c2UgdGhlIGRlYnVnZ2VyLCIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAib2wiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAibGkiKTsKICAgICAgICAgICAgybXJtXRleHQoOCwgIiBBZGQgdGhlIGZvbGxvd2luZyBsaW5lIHRvIHRoZSBiZWdpbm5pbmcgb2YgeW91ciBwcm9ncmFtOiAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg5LCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJzcGFuIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDExLCAidGYuZGVidWdnaW5nLmV4cGVyaW1lbnRhbC5lbmFibGVfZHVtcF9kZWJ1Z19pbmZvKCIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAic3BhbiIsIDMpOwogICAgICAgICAgICDJtcm1dGV4dCgxMywgImxvZ2RpciIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGV4dCgxNCwgIiwgIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTUsICJzcGFuIiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDE2LCAidGVuc29yX2RlYnVnX21vZGU9XCJGVUxMX0hFQUxUSFwiIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDE3LCAiLCAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxOCwgInNwYW4iLCAzKTsKICAgICAgICAgICAgybXJtXRleHQoMTksICJjaXJjdWxhcl9idWZmZXJfc2l6ZT0tMSIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIwLCAic3BhbiIpOwogICAgICAgICAgICDJtcm1dGV4dCgyMSwgIikiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyMiwgImxpIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDIzLCAiUmUtcnVuIHRoZSBwcm9ncmFtLiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI0LCAiZGl2IiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjUsICJkaXYiLCA1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyNiwgImRpdiIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgyNywgImltZyIsIDcpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI4LCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDI5LCAiQXV0by1hbGVydHMgZm9yIHByb2JsZW1zIGZvdW5kIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMzAsICJkaXYiLCA1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzMSwgImRpdiIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgzMiwgImltZyIsIDkpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMzLCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDM0LCAiIEludGVncmF0ZWQgZGVidWdnaW5nIHRvIHRyYWNlIHByb2JsZW1zIHRvIHRoZWlyIGNhdXNlcyAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzNSwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDM2LCAiZGl2IiwgNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDM3LCAiaW1nIiwgMTApOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDM4LCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDM5LCAiTGluayBsb2cgdG8gY29kZSIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQwLCAiZGl2IiwgMTEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQxLCAiZGl2IiwgMTIpOwogICAgICAgICAgICDJtcm1dGV4dCg0MiwgIiBUaGUgbG9nIGRpcmVjdG9yeSBtdXN0IGNvbnRhaW4gVGVuc29yRmxvdyBEZWJ1Z2dlciAoVjIpIGRhdGEuIHRmLmRlYnVnZ2luZy5leHBlcmltZW50YWwuZW5hYmxlX2R1bXBfZGVidWdfaW5mbygpIHdpbGwgY29sbGVjdCB0ZW5zb3IgZGF0YSwgZ3JhcGggc3RydWN0dXJlcywgdGhlIGFzc29jaWF0ZWQgc3RhY2sgdHJhY2VzLCBhbmQgc291cmNlIGNvZGUgdG8gdGhlIHNwZWNpZmljZWQgZGlyZWN0b3J5IGxvZ2RpciBhcyB0aGUgaW5zdHJ1bWVudGVkIFRlbnNvckZsb3cgcHJvZ3JhbSBleGVjdXRlcy4gIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNDMsICJkaXYiLCAxMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNDQsICJkaXYiKTsKICAgICAgICAgICAgybXJtXRleHQoNDUsICIgU2VlICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQ2LCAiYSIsIDEzKTsKICAgICAgICAgICAgybXJtXRleHQoNDcsICIgZG9jdW1lbnRhdGlvbiAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRleHQoNDgsICIgb2YgdGhlIFB5dGhvbiBBUEkgb2YgRGVidWdnZXIgVjIuICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQ5LCAiZGl2Iik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDUwLCAiIFNlZSAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1MSwgImEiLCAxNCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDUyLCAiIGhlcmUgIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDUzLCAiIGZvciBvdGhlciBUZW5zb3JGbG93IGRlYnVnZ2luZyBBUElzLiAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IH0sIHN0eWxlczogWyIuYXJnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGNvbG9yOiBsaWdodGJsdWU7XG4gIGZvbnQtc3R5bGU6IGl0YWxpYztcbiAgbWFyZ2luOiAycHg7XG59XG5cbi5jb2RlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIG1hcmdpbjogMTBweDtcbn1cblxuLmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBoZWlnaHQ6IDEwMCU7XG4gIGZvbnQtZmFtaWx5OiBSb2JvdG87XG4gIGZvbnQtc2l6ZTogMTVweDtcbiAgb3ZlcmZsb3cteTogYXV0bztcbiAgcGFkZGluZzogNTBweDtcbn1cblxuLmRldGFpbHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xuICB3aWR0aDogMTAwJTtcbn1cblxuLmRldGFpbHNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW46IDEwcHggNjBweDtcbiAgd2lkdGg6IDUwJTtcbn1cblxuLmV4aGliaXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uZXhoaWJpdFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBhbGlnbi1jb250ZW50OiBjZW50ZXI7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAxMHB4IDYwcHg7XG4gIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gIHdpZHRoOiAzMTBweDtcbn1cblxuLmV4aGliaXRbX25nY29udGVudC0lQ09NUCVdICAgLmRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHdpZHRoOiAzMTBweDtcbn1cblxuLmV4aGliaXRbX25nY29udGVudC0lQ09NUCVdICAgLnNjcmVlbnNob3RbX25nY29udGVudC0lQ09NUCVdICAgY2FudmFzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGhlaWdodDogMjAwcHg7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4udGl0bGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZm9udC1zaXplOiAxMzUlO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgbWFyZ2luLWJvdHRvbTogMjVweDtcbn0iXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2luYWN0aXZlL2luYWN0aXZlX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBJbmFjdGl2ZUNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB9CiAgICB9CiAgICBJbmFjdGl2ZUNvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGYtZGVidWdnZXItdjItaW5hY3RpdmUnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgIDxpbmFjdGl2ZS1jb21wb25lbnQ+PC9pbmFjdGl2ZS1jb21wb25lbnQ+IGAsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEluYWN0aXZlQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZUNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEluYWN0aXZlQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW5hY3RpdmVDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSW5hY3RpdmVDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjItaW5hY3RpdmUiXV0sIGRlY2xzOiAxLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gSW5hY3RpdmVDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJpbmFjdGl2ZS1jb21wb25lbnQiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtJbmFjdGl2ZUNvbXBvbmVudF0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEFjdGlvbnMgZm9yIERlYnVnZ2VyIFYyLgogICAgICovCiAgICAvKioKICAgICAqIEFjdGlvbnMgZm9yIHRoZSBEZWJ1Z2dlciBDb21wb25lbnQuCiAgICAgKi8KICAgIGNvbnN0IGRlYnVnZ2VyTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIERlYnVnZ2VyIExvYWRlZCcpOwogICAgY29uc3QgZGVidWdnZXJVbmxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBEZWJ1Z2dlciBVbmxvYWRlZCcpOwogICAgY29uc3QgZGVidWdnZXJEYXRhUG9sbE9uc2V0ID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEEgTmV3IERlYnVnZ2VyIERhdGEgUG9sbGluZyBFdmVudCBCZWdpbnMnKTsKICAgIGNvbnN0IGRlYnVnZ2VyUnVuc1JlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBEZWJ1Z2dlciBSdW5zIFJlcXVlc3RlZCcpOwogICAgY29uc3QgZGVidWdnZXJSdW5zTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIERlYnVnZ2VyIFJ1bnMgTG9hZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBkZWJ1Z2dlclJ1bnNSZXF1ZXN0RmFpbGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIERlYnVnZ2VyIFJ1bnMgUmVxdWVzdCBGYWlsZWQnKTsKICAgIC8qKgogICAgICogTnVtYmVyIG9mIGFsZXJ0cyBhbmQgdGhlaXIgdHlwZSBicmVha2Rvd24gb3IgZGV0YWlsZWQgYWxlcnRzIGFyZSByZXF1ZXN0ZWQuCiAgICAgKi8KICAgIGNvbnN0IG51bUFsZXJ0c0FuZEJyZWFrZG93blJlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBOdW1iZXIgYW5kIEJyZWFrZG93biBvZiBBbGVydHMgUmVxdWVzdGVkJyk7CiAgICAvKioKICAgICAqIE51bWJlciBvZiBhbGVydHMgYW5kIHRoZWlyIHR5cGUgYnJlYWtkb3duIGFyZSBsb2FkZWQuCiAgICAgKi8KICAgIGNvbnN0IG51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBOdW1iZXIgYW5kIEJyZWFrZG93biBvZiBBbGVydHMgTG9hZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBhbGVydHNPZlR5cGVMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gQWxlcnRzIERhdGEgb2YgYW4gQWxlcnRUeXBlIElzIExvYWRlZCcsIHByb3BzKCkpOwogICAgY29uc3QgYWxlcnRUeXBlRm9jdXNUb2dnbGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEFsZXJ0IFR5cGUgRm9jdXMgVG9nZ2xlZCcsIHByb3BzKCkpOwogICAgLyoqCiAgICAgKiBBY3Rpb25zIHJlbGF0ZWQgdG8gdG9wLWxldmVsIChlYWdlcikgZXhlY3V0aW9uCiAgICAgKi8KICAgIGNvbnN0IG51bUV4ZWN1dGlvbnNSZXF1ZXN0ZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gTnVtYmVyIG9mIFRvcC1MZXZlbCBFeGVjdXRpb25zIFJlcXVlc3RlZCcpOwogICAgY29uc3QgbnVtRXhlY3V0aW9uc0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBOdW1iZXIgb2YgVG9wLUxldmVsIEV4ZWN1dGlvbnMgTG9hZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBleGVjdXRpb25EaWdlc3RzUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEV4ZWN1dGlvbkRpZ2VzdHMgUmVxdWVzdGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBleGVjdXRpb25EaWdlc3RzTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEV4ZWN1dGlvbkRpZ2VzdHMgTG9hZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBleGVjdXRpb25TY3JvbGxMZWZ0ID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNjcm9sbCBMZWZ0d2FyZCBvbiB0aGUgRXhlY3V0aW9uIFRpbWVsaW5lJyk7CiAgICBjb25zdCBleGVjdXRpb25TY3JvbGxSaWdodCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBTY3JvbGwgUmlnaHR3YXJkIG9uIHRoZSBFeGVjdXRpb24gVGltZWxpbmUnKTsKICAgIGNvbnN0IGV4ZWN1dGlvblNjcm9sbFRvSW5kZXggPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gU2Nyb2xsIHRoZSBFeGVjdXRpb24gVGltZWxpbmUgdG8gR2l2ZW4gSW5kZXgnLCBwcm9wcygpKTsKICAgIGNvbnN0IGV4ZWN1dGlvbkRpZ2VzdEZvY3VzZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gRXhlY3V0aW9uIERhdGEgT2JqZWN0cyBCZWluZyBGb2N1c2VkIE9uJywgcHJvcHMoKSk7CiAgICBjb25zdCBleGVjdXRpb25EYXRhTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEV4ZWN1dGlvbiBEYXRhIE9iamVjdHMgTG9hZGVkJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIEFjdGlvbnMgcmVsYXRlZCB0byBpbnRyYS1ncmFwaCBleGVjdXRpb24KICAgICAqLwogICAgY29uc3QgbnVtR3JhcGhFeGVjdXRpb25zUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIE51bWJlciBvZiBJbnRyYS1HcmFwaCBFeGVjdXRpb25zIFJlcXVlc3RlZCcpOwogICAgY29uc3QgbnVtR3JhcGhFeGVjdXRpb25zTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIE51bWJlciBvZiBJbnRyYS1HcmFwaCBFeGVjdXRpb25zIExvYWRlZCcsIHByb3BzKCkpOwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25EYXRhUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEludHJhLUdyYXBoIEV4ZWN1dGlvbiBEYXRhIFJlcXVlc3RlZCcsIHByb3BzKCkpOwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEludHJhLUdyYXBoIEV4ZWN1dGlvbiBEYXRhIExvYWRlZCcsIHByb3BzKCkpOwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25TY3JvbGxUb0luZGV4ID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNjcm9sbCBJbnRyYS1HcmFwaCBFeGVjdXRpb24gTGlzdCB0byBHaXZlbiBJbmRleCcsIHByb3BzKCkpOwogICAgY29uc3QgZ3JhcGhFeGVjdXRpb25Gb2N1c2VkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEdyYXBoIEV4ZWN1dGlvbiBpcyBGb2N1c2VkIE9uJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIEFjdGlvbnMgcmVsYXRlZCB0byBncmFwaCBvcHMuCiAgICAgKi8KICAgIGNvbnN0IGdyYXBoT3BGb2N1c2VkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEdyYXBoIE9wIElzIEZvY3VzZWQgT24nLCBwcm9wcygpKTsKICAgIGNvbnN0IGdyYXBoT3BJbmZvUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIEdyYXBoIE9wIEluZm8gUmVxdWVzdGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBncmFwaE9wSW5mb0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBHcmFwaCBPcCBJbmZvIExvYWRlZCcsIHByb3BzKCkpOwogICAgLyoqCiAgICAgKiBBY3Rpb25zIHJlbGF0ZWQgdG8gc291cmNlIGZpbGVzIGFuZCBzdGFjayB0cmFjZXMuCiAgICAgKi8KICAgIGNvbnN0IHNvdXJjZUZpbGVMaXN0UmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNvdXJjZSBGaWxlIExpc3QgUmVxdWVzdGVkLicpOwogICAgY29uc3Qgc291cmNlRmlsZUxpc3RMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTGlzdCBMb2FkZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IHNvdXJjZUxpbmVGb2N1c2VkID0gY3JlYXRlQWN0aW9uKCdbRGVidWdnZXJdIFNvdXJjZSBGaWxlIExpbmUgSXMgRm9jdXNlZCBvbicsIHByb3BzKCkpOwogICAgY29uc3Qgc291cmNlRmlsZVJlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBTb3VyY2UgRmlsZSBSZXF1ZXN0ZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IHNvdXJjZUZpbGVMb2FkZWQgPSBjcmVhdGVBY3Rpb24oJ1tEZWJ1Z2dlcl0gU291cmNlIEZpbGUgTG9hZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBzdGFja0ZyYW1lc0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW0RlYnVnZ2VyXSBBIFNldCBvZiBTdGFjayBGcmFtZXMgSGF2ZSBCZWVuIExvYWRlZCcsIHByb3BzKCkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdnZXJfdHlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREVCVUdHRVJfRkVBVFVSRV9LRVkgPSAnZGVidWdnZXInOwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBUZW5zb3JEZWJ1Z01vZGUgPSB7CiAgICAgICAgLy8gTk9URShjYWlzKTogVGhlIHN0cmluZyBuYW1lIGFuZCBudW1iZXIgdmFsdWVzIG9mIHRoZXNlIGVudW1zCiAgICAgICAgLy8gbmVlZCB0byBtYXRjaCBUZW5zb3JEZWJ1Z01vZGUgaW4gdGVuc29yZmxvdy4gU2VlCiAgICAgICAgLy8gaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yZmxvdy9ibG9iL21hc3Rlci90ZW5zb3JmbG93L2NvcmUvcHJvdG9idWYvZGVidWdfZXZlbnQucHJvdG8KICAgICAgICBVTlNQRUNJRklFRDogMCwKICAgICAgICBOT19URU5TT1I6IDEsCiAgICAgICAgQ1VSVF9IRUFMVEg6IDIsCiAgICAgICAgQ09OQ0lTRV9IRUFMVEg6IDMsCiAgICAgICAgRlVMTF9IRUFMVEg6IDQsCiAgICAgICAgU0hBUEU6IDUsCiAgICAgICAgRlVMTF9OVU1FUklDUzogNiwKICAgICAgICBGVUxMX1RFTlNPUjogNywKICAgICAgICBSRURVQ0VfSU5GX05BTl9USFJFRV9TTE9UUzogOCwKICAgIH07CiAgICBUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLlVOU1BFQ0lGSUVEXSA9ICdVTlNQRUNJRklFRCc7CiAgICBUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLk5PX1RFTlNPUl0gPSAnTk9fVEVOU09SJzsKICAgIFRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuQ1VSVF9IRUFMVEhdID0gJ0NVUlRfSEVBTFRIJzsKICAgIFRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuQ09OQ0lTRV9IRUFMVEhdID0gJ0NPTkNJU0VfSEVBTFRIJzsKICAgIFRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEhdID0gJ0ZVTExfSEVBTFRIJzsKICAgIFRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuU0hBUEVdID0gJ1NIQVBFJzsKICAgIFRlbnNvckRlYnVnTW9kZVtUZW5zb3JEZWJ1Z01vZGUuRlVMTF9OVU1FUklDU10gPSAnRlVMTF9OVU1FUklDUyc7CiAgICBUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLkZVTExfVEVOU09SXSA9ICdGVUxMX1RFTlNPUic7CiAgICBUZW5zb3JEZWJ1Z01vZGVbVGVuc29yRGVidWdNb2RlLlJFRFVDRV9JTkZfTkFOX1RIUkVFX1NMT1RTXSA9ICdSRURVQ0VfSU5GX05BTl9USFJFRV9TTE9UUyc7CiAgICAvKiogQGVudW0ge3N0cmluZ30gKi8KICAgIGNvbnN0IEFsZXJ0VHlwZSA9IHsKICAgICAgICBGVU5DVElPTl9SRUNPTVBJTEVfQUxFUlQ6ICJGdW5jdGlvblJlY29tcGlsZXNBbGVydCIsCiAgICAgICAgSU5GX05BTl9BTEVSVDogIkluZk5hbkFsZXJ0IiwKICAgICAgICBURU5TT1JfU0hBUEVfQUxFUlQ6ICJUZW5zb3JTaGFwZUFsZXJ0IiwKICAgIH07CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IENvZGVMb2NhdGlvblR5cGUgPSB7CiAgICAgICAgLy8gVGhlIGNvZGUgbG9jYXRpb24gZm9yIGFuIGVhZ2VyICh0b3AtbGV2ZWwpIGV4ZWN1dGlvbi4KICAgICAgICBFWEVDVVRJT046IDAsCiAgICAgICAgLy8gVGhlIGNvZGUgbG9jYXRpb24gZm9yIHRoZSBjcmVhdGlvbiBvZiBvZiBhbiBvcCAobm9kZSkgaW4gYSBncmFwaC4KICAgICAgICBHUkFQSF9PUF9DUkVBVElPTjogMSwKICAgIH07CiAgICBDb2RlTG9jYXRpb25UeXBlW0NvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OXSA9ICdFWEVDVVRJT04nOwogICAgQ29kZUxvY2F0aW9uVHlwZVtDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OXSA9ICdHUkFQSF9PUF9DUkVBVElPTic7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9zdG9yZS9kZWJ1Z2dlcl9zdG9yZV9oZWxwZXJzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSGVscGVyIGZ1bmN0aW9uIHRoYXQgZXh0cmFjdHMgdGhlIHN0YWNrIHRyYWNlIGJlaW5nIGZvY3VzZWQgb24uCiAgICAgKgogICAgICogVGhpcyBleGFtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IGZvY3VzZWQgY29kZSBsb2NhdGlvbiBpcyBmb3IgYW4KICAgICAqIGVhZ2VyICh0b3AtbGV2ZWwpIGV4ZWN1dGlvbiBvciBhIGdyYXBoLW9wIGNyZWF0aW9uLCBhbmQgdGhlbiBxdWVyaWVzCiAgICAgKiB0aGUgY29ycmVzcG9uZGluZyBzdWJzdGF0ZXMgYWNjb3JkaW5nbHkuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Rm9jdXNlZFN0YWNrRnJhbWVzSGVscGVyKHN0YXRlKSB7CiAgICAgICAgaWYgKHN0YXRlLmNvZGVMb2NhdGlvbkZvY3VzVHlwZSA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzdGFja0ZyYW1lSWRzID0gW107CiAgICAgICAgaWYgKHN0YXRlLmNvZGVMb2NhdGlvbkZvY3VzVHlwZSA9PT0gQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04pIHsKICAgICAgICAgICAgY29uc3QgeyBmb2N1c0luZGV4LCBleGVjdXRpb25EYXRhIH0gPSBzdGF0ZS5leGVjdXRpb25zOwogICAgICAgICAgICBpZiAoZm9jdXNJbmRleCA9PT0gbnVsbCB8fCBleGVjdXRpb25EYXRhW2ZvY3VzSW5kZXhdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0YWNrRnJhbWVJZHMgPSBleGVjdXRpb25EYXRhW2ZvY3VzSW5kZXhdLnN0YWNrX2ZyYW1lX2lkczsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgQ29kZUxvY2F0aW9uVHlwZS5HUkFQSF9PUF9DUkVBVElPTi4KICAgICAgICAgICAgaWYgKHN0YXRlLmdyYXBocy5mb2N1c2VkT3AgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHsgZ3JhcGhJZCwgb3BOYW1lIH0gPSBzdGF0ZS5ncmFwaHMuZm9jdXNlZE9wOwogICAgICAgICAgICBpZiAoc3RhdGUuZ3JhcGhzLm9wc1tncmFwaElkXSA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgICAhc3RhdGUuZ3JhcGhzLm9wc1tncmFwaElkXS5oYXMob3BOYW1lKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RhY2tGcmFtZUlkcyA9ICgvKiogQHR5cGUgez99ICovIChzdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdLmdldChvcE5hbWUpKSkuc3RhY2tfZnJhbWVfaWRzOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RhY2tGcmFtZXMgPSBbXTsKICAgICAgICBmb3IgKGNvbnN0IHN0YWNrRnJhbWVJZCBvZiBzdGFja0ZyYW1lSWRzKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5zdGFja0ZyYW1lc1tzdGFja0ZyYW1lSWRdICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIHN0YWNrRnJhbWVzLnB1c2goc3RhdGUuc3RhY2tGcmFtZXNbc3RhY2tGcmFtZUlkXSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gc3RhY2tGcmFtZXM7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9zdG9yZS9kZWJ1Z2dlcl9zdG9yZV91dGlscy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEZpbmQgdGhlIGluZGV4IG9mIGEgZmlsZSBzcGVjIGFtb25nIGFuIGFycmF5IG9mIGZpbGUgc3BlY3MuCiAgICAgKiBAcGFyYW0gez99IGZpbGVMaXN0CiAgICAgKiBAcGFyYW0gez99IGZpbGVTcGVjCiAgICAgKiBAcmV0dXJuIHs/fSBUaGUgaW5kZXggb2YgYGZpbGVTcGVjYCBpbiBgZmlsZUxpc3RgLiBJZiBub3QgZm91bmQsIGAtMWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRGaWxlSW5kZXgoZmlsZUxpc3QsIGZpbGVTcGVjKSB7CiAgICAgICAgcmV0dXJuIGZpbGVMaXN0LmZpbmRJbmRleCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoaXRlbSkgPT4gaXRlbS5ob3N0X25hbWUgPT09IGZpbGVTcGVjLmhvc3RfbmFtZSAmJgogICAgICAgICAgICBpdGVtLmZpbGVfcGF0aCA9PT0gZmlsZVNwZWMuZmlsZV9wYXRoKSk7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgaWYgYSBzb3VyY2UtbGluZSBzcGVjIHBvaW50cyBhdCB0aGUgYm90dG9tbW9zdCBpbiBpdHMgZmlsZQogICAgICogaW4gYSBnaXZlbiBzdGFjayB0cmFjZS4KICAgICAqCiAgICAgKiBAdGhyb3dzIEVycm9yIGlmIGBzdGFja0ZyYW1lYCBpcyBub3QgYSBmcmFtZSBpbiBgc3RhY2tGcmFtZXNgLgogICAgICogQHBhcmFtIHs/fSBzdGFja0ZyYW1lcyBUaGUgc3RhY2sgdHJhY2UgdG8gZXhhbWluZS4KICAgICAqIEBwYXJhbSB7P30gc3RhY2tGcmFtZSBBIHNwZWMgdGhhdCBkZXNjcmliZXMgYSBmcmFtZSBpbiB0aGUgc3RhY2sgdHJhY2UuCiAgICAgKiBAcmV0dXJuIHs/fSBXaGV0aGVyIGBzdGFja0ZyYW1lYCBwb2ludHMgdG8gdGhlIGJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUKICAgICAqICAgKGluIHRoZSBQeXRob24gc2Vuc2UpIG9mIHRoZSBmaWxlIGl0IGJlbG9uZ3MgdG8gYW1vbmcgdGhlIGZyYW1lcyBpbgogICAgICogICBgc3RhY2tGcmFtZXNgLgogICAgICovCiAgICBmdW5jdGlvbiBpc0ZyYW1lQm90dG9tbW9zdEluU3RhY2tUcmFjZShzdGFja0ZyYW1lcywgc3RhY2tGcmFtZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgbWF0Y2hpbmdJbmRleCA9IC0xOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgYm90dG9tbW9zdEluZGV4ID0gLTE7CiAgICAgICAgc3RhY2tGcmFtZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcGFyYW0gez99IGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICh7IGZpbGVfcGF0aCwgbGluZW5vIH0sIGkpID0+IHsKICAgICAgICAgICAgaWYgKGZpbGVfcGF0aCA9PT0gc3RhY2tGcmFtZS5maWxlX3BhdGgpIHsKICAgICAgICAgICAgICAgIGJvdHRvbW1vc3RJbmRleCA9IGk7CiAgICAgICAgICAgICAgICBpZiAobGluZW5vID09PSBzdGFja0ZyYW1lLmxpbmVubykgewogICAgICAgICAgICAgICAgICAgIG1hdGNoaW5nSW5kZXggPSBpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIGlmIChtYXRjaGluZ0luZGV4ID09PSAtMSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFN0YWNrIGZyYW1lICR7SlNPTi5zdHJpbmdpZnkoc3RhY2tGcmFtZSl9IGlzIG5vdCBmb3VuZC5gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG1hdGNoaW5nSW5kZXggPT09IGJvdHRvbW1vc3RJbmRleDsKICAgIH0KICAgIC8qKgogICAgICogRmluZHMgdGhlIGJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUgaW4gYSBzdGFjayB0cmFjZS4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVzIFN0YWNrIGZyYW1lcyBvZiB0aGUgc3RhY2sgdHJhY2UgdG8gbG9vayBpbi4KICAgICAqIEBwYXJhbSB7P30gZm9jdXNlZFNvdXJjZUxpbmVTcGVjIFRoZSBjdXJyZW50bHkgZm9jdXNlZCBzdGFjayBmcmFtZS4KICAgICAqIEByZXR1cm4gez99IFRoZSBzdGFjayBmcmFtZSB0aGF0IGlzIGluIHRoZSBzYW1lIGZpbGUgYXMgYGZvY3VzZWRTb3VyY2VMaW5lU3BlY2AsCiAgICAgKiAgIGJ1dCBhdCB0aGUgYm90dG9tbW9zdCBsb2NhdGlvbi4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Qm90dG9tbW9zdFN0YWNrRnJhbWVJbkZvY3VzZWRGaWxlKHN0YWNrRnJhbWVzLCBmb2N1c2VkU291cmNlTGluZVNwZWMpIHsKICAgICAgICBpZiAoZm9jdXNlZFNvdXJjZUxpbmVTcGVjID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBmb3IgKGxldCBpID0gc3RhY2tGcmFtZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFja0ZyYW1lID0gc3RhY2tGcmFtZXNbaV07CiAgICAgICAgICAgIGNvbnN0IHsgaG9zdF9uYW1lLCBmaWxlX3BhdGggfSA9IHN0YWNrRnJhbWU7CiAgICAgICAgICAgIGlmIChob3N0X25hbWUgPT09IGZvY3VzZWRTb3VyY2VMaW5lU3BlYy5ob3N0X25hbWUgJiYKICAgICAgICAgICAgICAgIGZpbGVfcGF0aCA9PT0gZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmZpbGVfcGF0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHN0YWNrRnJhbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIEZpbmQgdGhlIGZpcnN0IHJhbmdlICh3aXRoIGJlZ2luIGFuZCBlbmQgcHJvcGVydGllcykgaW4gYW4gYXJyYXkgb2YgcmFuZ2VzCiAgICAgKiB0aGF0IGVxdWFscyBgW2JlZ2luLCBlbmQpYC4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IHJhbmdlcyBUaGUgcmFuZ2VzIHRvIHNlYXJjaCBpbi4KICAgICAqIEBwYXJhbSB7P30gYmVnaW4gVGhlIGJlZ2luIG9mIHRoZSByYW5nZSB0byBzZWFyY2ggZm9yIChpbmNsdXNpdmUpLgogICAgICogQHBhcmFtIHs/fSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gc2VhcmNoIGZvciAoZXhjbHVzaXZlKS4KICAgICAqIEByZXR1cm4gez99IEluZGV4ICg+PTApIGlmIGZvdW5kLiAtMSBpZiBub3QgZm91bmQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZpbmRCZWdpbkVuZFJhbmdlSW5kZXgocmFuZ2VzLCBiZWdpbiwgZW5kKSB7CiAgICAgICAgaWYgKGJlZ2luID49IGVuZCkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGJlZ2luIHRvIGJlIGxlc3MgdGhhbiBlbmQsIGAgKwogICAgICAgICAgICAgICAgYGJ1dCBnb3QgYmVnaW49JHtiZWdpbn0sIGVuZD0ke2VuZH1gKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJhbmdlcy5maW5kSW5kZXgoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmFuZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyYW5nZSkgPT4gcmFuZ2UuYmVnaW4gPT09IGJlZ2luICYmIHJhbmdlLmVuZCA9PT0gZW5kKSk7CiAgICB9CiAgICAvKioKICAgICAqIERldGVybWluZXMgaWYgYW4gYXJyYXkgb2YgcmFuZ2VzIGNvbnRhaW5zIGEgcmFuZ2UgdGhhdCBzdHJpY3RseSBpbmNsdWRlcwogICAgICogYFtiZWdpbiwgZW5kKWAuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSByYW5nZXMgVGhlIHJhbmdlcyB0byBzZWFyY2ggaW4uCiAgICAgKiBAcGFyYW0gez99IGJlZ2luIFRoZSBiZWdpbiBvZiB0aGUgcmFuZ2UgdG8gc2VhcmNoIGZvciAoaW5jbHVzaXZlKS4KICAgICAqIEBwYXJhbSB7P30gZW5kIFRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIHNlYXJjaCBmb3IgKGV4Y2x1c2l2ZSkuCiAgICAgKiBAcmV0dXJuIHs/fSBgVHJ1ZWAgaWYgYW5kIG9ubHkgaWYgb25lIG9mIHRoZSByYW5nZXMgb2YgYHJhbmdlc2Agc3RyaWN0bHkKICAgICAqICAgaW5jbHVkZXMgYFtiZWdpbiwgZW5kKWAuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJlZ2luRW5kUmFuZ2VzSW5jbHVkZShyYW5nZXMsIGJlZ2luLCBlbmQpIHsKICAgICAgICBpZiAoYmVnaW4gPj0gZW5kKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgYmVnaW4gdG8gYmUgbGVzcyB0aGFuIGVuZCwgYCArCiAgICAgICAgICAgICAgICBgYnV0IGdvdCBiZWdpbj0ke2JlZ2lufSwgZW5kPSR7ZW5kfWApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gKHJhbmdlcy5maW5kSW5kZXgoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmFuZ2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChyYW5nZSkgPT4gcmFuZ2UuYmVnaW4gPj0gYmVnaW4gJiYgcmFuZ2UuZW5kIDw9IGVuZCkpICE9PSAtMSk7CiAgICB9CiAgICAvKioKICAgICAqIENvbXB1dGVzIGJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUgaW4gdGhlIGN1cnJlbnRseS1mb2N1c2VkIHN0YWNrIHRyYWNlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gc3RhdGUgSW5wdXQgRGVidWdnZXJTdGF0ZSAod2lsbCBub3QgYmUgbXV0YXRlZCkuCiAgICAgKiBAcmV0dXJuIHs/fSBJZiBgc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGVgIGFuZCB0aGVyZSBpcyBhIHN0YWNrIHRyYWNlCiAgICAgKiAgIGluIGZvY3VzIGFuZCBpZiBhIGJvdHRvbW1vc3QgZnJhbWUgY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlIGN1cnJlbnRseSBpbgogICAgICogICBmb2N1cywgcmV0dXJuIHRoZSBib3R0b21tb3N0IGZyYW1lLiBFbHNlLCByZXR1cm4gdGhlIGN1cnJlbnQgdmFsdWUgb2YKICAgICAqICAgYGZvY3VzTGluZVNwZWNgIGluIGBzdGF0ZS5zb3VyY2VDb2RlYC4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcHV0ZUJvdHRvbW1vc3RMaW5lU3BlYyhzdGF0ZSkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBjdXJyZW50Rm9jdXNMaW5lU3BlYyA9IHN0YXRlLnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYzsKICAgICAgICBpZiAoIXN0YXRlLnN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlKSB7CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50Rm9jdXNMaW5lU3BlYzsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZvY3VzZWRTdGFja0ZyYW1lID0gZ2V0Rm9jdXNlZFN0YWNrRnJhbWVzSGVscGVyKHN0YXRlKTsKICAgICAgICBpZiAoZm9jdXNlZFN0YWNrRnJhbWUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGN1cnJlbnRGb2N1c0xpbmVTcGVjOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYm90dG9tbW9zdCA9IGdldEJvdHRvbW1vc3RTdGFja0ZyYW1lSW5Gb2N1c2VkRmlsZShmb2N1c2VkU3RhY2tGcmFtZSwgY3VycmVudEZvY3VzTGluZVNwZWMpOwogICAgICAgIGlmIChib3R0b21tb3N0ID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBjdXJyZW50Rm9jdXNMaW5lU3BlYzsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBib3R0b21tb3N0OwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3N0b3JlL2RlYnVnZ2VyX3JlZHVjZXJzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERFRkFVTFRfRVhFQ1VUSU9OX1BBR0VfU0laRSA9IDEwMDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERFRkFVTFRfR1JBUEhfRVhFQ1VUSU9OX1BBR0VfU0laRSA9IDIwMDsKICAgIC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gY3JlYXRlSW5pdGlhbEV4ZWN1dGlvbnNTdGF0ZSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBudW1FeGVjdXRpb25zTG9hZGVkOiB7CiAgICAgICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBudWxsLAogICAgICAgICAgICB9LAogICAgICAgICAgICBleGVjdXRpb25EaWdlc3RzTG9hZGVkOiB7CiAgICAgICAgICAgICAgICBsb2FkaW5nUmFuZ2VzOiBbXSwKICAgICAgICAgICAgICAgIG51bUV4ZWN1dGlvbnM6IDAsCiAgICAgICAgICAgICAgICBwYWdlTG9hZGVkU2l6ZXM6IHt9LAogICAgICAgICAgICB9LAogICAgICAgICAgICAvLyBUT0RPKGNhaXMpIFJlbW92ZSB0aGUgaGFyZGNvZGluZyBvZiB0aGlzLCB3aGljaCBpcyBjb3VwbGVkIHdpdGggY3NzIHdpZHRoCiAgICAgICAgICAgIC8vIHByb3BlcnRpZXMuCiAgICAgICAgICAgIGRpc3BsYXlDb3VudDogNTAsCiAgICAgICAgICAgIHBhZ2VTaXplOiBERUZBVUxUX0VYRUNVVElPTl9QQUdFX1NJWkUsCiAgICAgICAgICAgIHNjcm9sbEJlZ2luSW5kZXg6IDAsCiAgICAgICAgICAgIGZvY3VzSW5kZXg6IG51bGwsCiAgICAgICAgICAgIGV4ZWN1dGlvbkRpZ2VzdHM6IHt9LAogICAgICAgICAgICBleGVjdXRpb25EYXRhOiB7fSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsR3JhcGhFeGVjdXRpb25zU3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgbnVtRXhlY3V0aW9uc0xvYWRlZDogewogICAgICAgICAgICAgICAgc3RhdGU6IERhdGFMb2FkU3RhdGUuTk9UX0xPQURFRCwKICAgICAgICAgICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogbnVsbCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDogewogICAgICAgICAgICAgICAgbG9hZGluZ1JhbmdlczogW10sCiAgICAgICAgICAgICAgICBudW1FeGVjdXRpb25zOiAwLAogICAgICAgICAgICAgICAgcGFnZUxvYWRlZFNpemVzOiB7fSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgLy8gVE9ETyhjYWlzKSBSZW1vdmUgdGhlIGhhcmRjb2Rpbmcgb2YgdGhpcywgd2hpY2ggaXMgY291cGxlZCB3aXRoIGNzcyB3aWR0aAogICAgICAgICAgICAvLyBwcm9wZXJ0aWVzLgogICAgICAgICAgICBkaXNwbGF5Q291bnQ6IDEwMCwKICAgICAgICAgICAgcGFnZVNpemU6IERFRkFVTFRfR1JBUEhfRVhFQ1VUSU9OX1BBR0VfU0laRSwKICAgICAgICAgICAgc2Nyb2xsQmVnaW5JbmRleDogMCwKICAgICAgICAgICAgZm9jdXNJbmRleDogbnVsbCwKICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EaWdlc3RzOiB7fSwKICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzOiBbXSwKICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzOiB7fSwKICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhOiB7fSwKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjcmVhdGVJbml0aWFsR3JhcGhzU3RhdGUoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb3BzOiB7fSwKICAgICAgICAgICAgbG9hZGluZ09wczoge30sCiAgICAgICAgICAgIGZvY3VzZWRPcDogbnVsbCwKICAgICAgICB9OwogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdGlhbFN0YXRlJDQgPSB7CiAgICAgICAgcnVuczoge30sCiAgICAgICAgcnVuc0xvYWRlZDogewogICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgICAgICBsYXN0TG9hZGVkVGltZUluTXM6IG51bGwsCiAgICAgICAgfSwKICAgICAgICBhY3RpdmVSdW5JZDogbnVsbCwKICAgICAgICAvLyBUaGUgaW5pdGlhbCB2YWx1ZXMgb2YgbGFzdERhdGFQb2xsT25zZXRUaW1lTXMgYW5kCiAgICAgICAgLy8gbGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXMgZW5zdXJlcyB0aGF0IGluaXRpYWxseSwgYmVmb3JlCiAgICAgICAgLy8gdGhlIG9uc2V0IG9mIGFueSBkYXRhIHBvbGxpbmcsIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28KICAgICAgICAvLyBpcyAwLCB3aGljaCBjYXVzZXMgYSBiYWNraW5nLW9mZiBwb2xsaW5nIGFsZ29yaXRobSB0byB1c2UKICAgICAgICAvLyB0aGUgbG93ZXItYm91bmQgcG9sbGluZyBpbnRlcnZhbC4KICAgICAgICBsYXN0RGF0YVBvbGxPbnNldFRpbWVNczogLTEsCiAgICAgICAgbGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6IDEsCiAgICAgICAgYWxlcnRzOiB7CiAgICAgICAgICAgIGFsZXJ0c0xvYWRlZDogewogICAgICAgICAgICAgICAgc3RhdGU6IERhdGFMb2FkU3RhdGUuTk9UX0xPQURFRCwKICAgICAgICAgICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogbnVsbCwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgbnVtQWxlcnRzOiAwLAogICAgICAgICAgICBhbGVydHNCcmVha2Rvd246IHt9LAogICAgICAgICAgICBhbGVydHM6IHt9LAogICAgICAgICAgICBleGVjdXRpb25JbmRpY2VzOiB7fSwKICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25JbmRpY2VzOiB7fSwKICAgICAgICAgICAgZm9jdXNUeXBlOiBudWxsLAogICAgICAgIH0sCiAgICAgICAgZXhlY3V0aW9uczogY3JlYXRlSW5pdGlhbEV4ZWN1dGlvbnNTdGF0ZSgpLAogICAgICAgIGdyYXBoRXhlY3V0aW9uczogY3JlYXRlSW5pdGlhbEdyYXBoRXhlY3V0aW9uc1N0YXRlKCksCiAgICAgICAgZ3JhcGhzOiBjcmVhdGVJbml0aWFsR3JhcGhzU3RhdGUoKSwKICAgICAgICBzdGFja0ZyYW1lczoge30sCiAgICAgICAgY29kZUxvY2F0aW9uRm9jdXNUeXBlOiBudWxsLAogICAgICAgIHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOiBmYWxzZSwKICAgICAgICBzb3VyY2VDb2RlOiB7CiAgICAgICAgICAgIHNvdXJjZUZpbGVMaXN0TG9hZGVkOiB7CiAgICAgICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBudWxsLAogICAgICAgICAgICB9LAogICAgICAgICAgICBzb3VyY2VGaWxlTGlzdDogW10sCiAgICAgICAgICAgIGZpbGVDb250ZW50czogW10sCiAgICAgICAgICAgIGZvY3VzTGluZVNwZWM6IG51bGwsCiAgICAgICAgfSwKICAgIH07CiAgICAvLyBUT0RPKGNhaXMpOiBBcyBgZXhlY3V0aW9uc2AgaXMgZ2V0dGluZyBsYXJnZSwgY3JlYXRlIGEgc3VicmVkdWNlciBmb3IgaXQuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWR1Y2VyJDQgPSBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSQ0LCBvbihkZWJ1Z2dlclJ1bnNSZXF1ZXN0ZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBydW5zTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJ1bnNMb2FkZWQpLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURJTkcgfSkgfSk7CiAgICB9KSksIG9uKGRlYnVnZ2VyUnVuc1JlcXVlc3RGYWlsZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBydW5zTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnJ1bnNMb2FkZWQpLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkZBSUxFRCB9KSB9KTsKICAgIH0pKSwgb24oZGVidWdnZXJSdW5zTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IHJ1bnMgfSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBydW5JZHMgPSBPYmplY3Qua2V5cyhydW5zKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWN0aXZlUnVuQ2hhbmdlZCA9IHJ1bklkcy5sZW5ndGggPiAwICYmIHN0YXRlLmFjdGl2ZVJ1bklkID09PSBudWxsOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBsYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNczogYWN0aXZlUnVuQ2hhbmdlZAogICAgICAgICAgICAgICAgPyBEYXRlLm5vdygpCiAgICAgICAgICAgICAgICA6IHN0YXRlLmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zLCBydW5zLCBydW5zTG9hZGVkOiB7CiAgICAgICAgICAgICAgICBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FERUQsCiAgICAgICAgICAgICAgICBsYXN0TG9hZGVkVGltZUluTXM6IERhdGUubm93KCksCiAgICAgICAgICAgIH0sIGFjdGl2ZVJ1bklkOiBydW5JZHMubGVuZ3RoID4gMCA/IHJ1bklkc1swXSA6IG51bGwgfSk7CiAgICB9KSksIG9uKGRlYnVnZ2VyRGF0YVBvbGxPbnNldCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGxhc3REYXRhUG9sbE9uc2V0VGltZU1zOiBEYXRlLm5vdygpIH0pOwogICAgfSkpLCBvbihudW1BbGVydHNBbmRCcmVha2Rvd25SZXF1ZXN0ZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBhbGVydHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzKSwgeyBhbGVydHNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmFsZXJ0c0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KSB9KTsKICAgIH0pKSwgb24obnVtQWxlcnRzQW5kQnJlYWtkb3duTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IG51bUFsZXJ0cywgYWxlcnRzQnJlYWtkb3duIH0pID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgICAgICBpZiAocnVuSWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbnVtQWxlcnRzSW5jcmVhc2VkID0gbnVtQWxlcnRzID4gc3RhdGUuYWxlcnRzLm51bUFsZXJ0czsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6IG51bUFsZXJ0c0luY3JlYXNlZAogICAgICAgICAgICAgICAgPyBEYXRlLm5vdygpCiAgICAgICAgICAgICAgICA6IHN0YXRlLmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zLCBhbGVydHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzKSwgeyBhbGVydHNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmFsZXJ0c0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BREVELCBsYXN0TG9hZGVkVGltZUluTXM6IERhdGUubm93KCkgfSksIG51bUFsZXJ0cywKICAgICAgICAgICAgICAgIGFsZXJ0c0JyZWFrZG93biB9KSB9KTsKICAgIH0pKSwgb24oYWxlcnRzT2ZUeXBlTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IG51bUFsZXJ0cywgYWxlcnRzQnJlYWtkb3duLCBhbGVydFR5cGUsIGJlZ2luLCBhbGVydHMgfSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCB1cGRhdGVkQWxlcnRzID0ge307CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4ZWN1dGlvbkluZGljZXMgPSBzdGF0ZS5hbGVydHMuZXhlY3V0aW9uSW5kaWNlc1thbGVydFR5cGVdCiAgICAgICAgICAgID8gc3RhdGUuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbYWxlcnRUeXBlXS5zbGljZSgpCiAgICAgICAgICAgIDogW107CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGdyYXBoRXhlY3V0aW9uSW5kaWNlcyA9IHN0YXRlLmFsZXJ0cwogICAgICAgICAgICAuZ3JhcGhFeGVjdXRpb25JbmRpY2VzW2FsZXJ0VHlwZV0KICAgICAgICAgICAgPyBzdGF0ZS5hbGVydHMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzW2FsZXJ0VHlwZV0uc2xpY2UoKQogICAgICAgICAgICA6IFtdOwogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYWxlcnRzLmxlbmd0aDsgKytpKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWxlcnRJbmRleCA9IGJlZ2luICsgaTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhbGVydCA9IGFsZXJ0c1tpXTsKICAgICAgICAgICAgdXBkYXRlZEFsZXJ0c1thbGVydEluZGV4XSA9IGFsZXJ0OwogICAgICAgICAgICBpZiAoYWxlcnQuYWxlcnRfdHlwZSA9PT0gQWxlcnRUeXBlLklORl9OQU5fQUxFUlQpIHsKICAgICAgICAgICAgICAgIC8vIFRPT0QoY2Fpcyk6IERlYWwgd2l0aCBvdGhlciBhbGVydCB0eXBlcyB3aXRoIGV4ZWN1dGlvbiBpbmRleC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGluZk5hbkFsZXJ0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0KSk7CiAgICAgICAgICAgICAgICBleGVjdXRpb25JbmRpY2VzW2FsZXJ0SW5kZXhdID0gaW5mTmFuQWxlcnQuZXhlY3V0aW9uX2luZGV4OwogICAgICAgICAgICAgICAgaWYgKGluZk5hbkFsZXJ0LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleCAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGdyYXBoRXhlY3V0aW9uSW5kaWNlc1thbGVydEluZGV4XSA9CiAgICAgICAgICAgICAgICAgICAgICAgIGluZk5hbkFsZXJ0LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBpZiAoc3RhdGUuYWxlcnRzLmFsZXJ0c1thbGVydFR5cGVdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgT2JqZWN0LmFzc2lnbih1cGRhdGVkQWxlcnRzLCBzdGF0ZS5hbGVydHMuYWxlcnRzW2FsZXJ0VHlwZV0pOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNjcm9sbEJlZ2luSW5kZXggPSBzdGF0ZS5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBncmFwaEV4ZWN1dGlvbkZvY3VzSW5kZXggPSBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZm9jdXNJbmRleDsKICAgICAgICBpZiAoYWxlcnRUeXBlID09PSBBbGVydFR5cGUuSU5GX05BTl9BTEVSVCAmJiBiZWdpbiA9PT0gMCkgewogICAgICAgICAgICAvLyBUT09EKGNhaXMpOiBEZWFsIHdpdGggb3RoZXIgYWxlcnQgdHlwZXMgd2l0aCBleGVjdXRpb24gaW5kZXguCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYWxlcnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoYWxlcnRzWzBdKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uSW5kZXggPSBhbGVydC5leGVjdXRpb25faW5kZXg7CiAgICAgICAgICAgIC8vIFRyeSB0byBzY3JvbGwgdGhlIGZpcnN0IGFsZXJ0IHRvIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXcuCiAgICAgICAgICAgIHNjcm9sbEJlZ2luSW5kZXggPSBNYXRoLm1heCgwLCBleGVjdXRpb25JbmRleCAtIE1hdGguZmxvb3Ioc3RhdGUuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQgLyAyKSk7CiAgICAgICAgICAgIGlmIChhbGVydC5ncmFwaF9leGVjdXRpb25fdHJhY2VfaW5kZXggIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGdyYXBoRXhlY3V0aW9uRm9jdXNJbmRleCA9IGFsZXJ0LmdyYXBoX2V4ZWN1dGlvbl90cmFjZV9pbmRleDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBzY3JvbGxCZWdpbkluZGV4IH0pLCBncmFwaEV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhFeGVjdXRpb25zKSwgeyBmb2N1c0luZGV4OiBncmFwaEV4ZWN1dGlvbkZvY3VzSW5kZXggfSksIGFsZXJ0czogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hbGVydHMpLCB7IGFsZXJ0c0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5hbGVydHMuYWxlcnRzTG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FERUQsIGxhc3RMb2FkZWRUaW1lSW5NczogRGF0ZS5ub3coKSB9KSwgbnVtQWxlcnRzLAogICAgICAgICAgICAgICAgYWxlcnRzQnJlYWtkb3duLCBhbGVydHM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmFsZXJ0cyksIHsgW2FsZXJ0VHlwZV06IHVwZGF0ZWRBbGVydHMgfSksIGV4ZWN1dGlvbkluZGljZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXMpLCB7IFthbGVydFR5cGVdOiBleGVjdXRpb25JbmRpY2VzIH0pLCBncmFwaEV4ZWN1dGlvbkluZGljZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuYWxlcnRzLmdyYXBoRXhlY3V0aW9uSW5kaWNlcyksIHsgW2FsZXJ0VHlwZV06IGdyYXBoRXhlY3V0aW9uSW5kaWNlcyB9KSB9KSB9KTsKICAgIH0pKSwgb24oYWxlcnRUeXBlRm9jdXNUb2dnbGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IGFsZXJ0VHlwZSB9KSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgYWxlcnRzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmFsZXJ0cyksIHsgZm9jdXNUeXBlOiBzdGF0ZS5hbGVydHMuZm9jdXNUeXBlID09PSBhbGVydFR5cGUgPyBudWxsIDogYWxlcnRUeXBlIH0pIH0pOwogICAgICAgIC8vIElmIGFsZXJ0IGRhdGEgaXMgYXZhaWxhYmxlLCBmb2N1cyBvbnRvIHRoZSBleGVjdXRpb24gZGlnZXN0IHRoYXQKICAgICAgICAvLyBjb3JyZXNwb25kcyB0byB0aGUgZmlyc3QgYWxlcnQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGN1cnJlbnRGb2N1c1R5cGUgPSBuZXdTdGF0ZS5hbGVydHMuZm9jdXNUeXBlOwogICAgICAgIGlmIChjdXJyZW50Rm9jdXNUeXBlICE9PSBudWxsKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uSW5kaWNlcyA9IG5ld1N0YXRlLmFsZXJ0cy5leGVjdXRpb25JbmRpY2VzW2N1cnJlbnRGb2N1c1R5cGVdIHx8IFtdOwogICAgICAgICAgICAvLyBUcnkgdG8gcHV0IHRoZSBleGVjdXRpb24gZGlnZXN0IHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIGZpcnN0CiAgICAgICAgICAgIC8vIGFsZXJ0IGF0IHRoZSBjZW50ZXIgb2YgdGhlIHZpZXcuCiAgICAgICAgICAgIGlmIChleGVjdXRpb25JbmRpY2VzWzBdICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIG5ld1N0YXRlLmV4ZWN1dGlvbnMuc2Nyb2xsQmVnaW5JbmRleCA9IE1hdGgubWF4KDAsIE51bWJlcihleGVjdXRpb25JbmRpY2VzWzBdKSAtCiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihuZXdTdGF0ZS5leGVjdXRpb25zLmRpc3BsYXlDb3VudCAvIDIpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9KSksIAogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8gUmVkdWNlcnMgcmVsYXRlZCB0byB0b3AtbGV2ZWwgZXhlY3V0aW9uLiAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgb24obnVtRXhlY3V0aW9uc1JlcXVlc3RlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUuYWN0aXZlUnVuSWQ7CiAgICAgICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucyksIHsgbnVtRXhlY3V0aW9uc0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zLm51bUV4ZWN1dGlvbnNMb2FkZWQpLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURJTkcgfSkgfSkgfSk7CiAgICB9KSksIG9uKG51bUV4ZWN1dGlvbnNMb2FkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgbnVtRXhlY3V0aW9ucyB9KSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUuYWN0aXZlUnVuSWQ7CiAgICAgICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG51bUV4ZWN1dGlvbnNJbmNyZWFzZWQgPSBudW1FeGVjdXRpb25zID4gc3RhdGUuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6IG51bUV4ZWN1dGlvbnNJbmNyZWFzZWQKICAgICAgICAgICAgICAgID8gRGF0ZS5ub3coKQogICAgICAgICAgICAgICAgOiBzdGF0ZS5sYXN0Tm9uRW1wdHlQb2xsRGF0YVRpbWVNcywgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBudW1FeGVjdXRpb25zTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMubnVtRXhlY3V0aW9uc0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BREVELCBsYXN0TG9hZGVkVGltZUluTXM6IERhdGUubm93KCkgfSksIGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkKSwgeyBudW1FeGVjdXRpb25zIH0pIH0pIH0pOwogICAgICAgIGlmIChudW1FeGVjdXRpb25zID4gMCAmJiBzdGF0ZS5leGVjdXRpb25zLmZvY3VzSW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgbmV3U3RhdGUuZXhlY3V0aW9ucy5mb2N1c0luZGV4ID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld1N0YXRlOwogICAgfSkpLCBvbihleGVjdXRpb25EaWdlc3RzUmVxdWVzdGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IHJhbmdlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHJhbmdlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUuYWN0aXZlUnVuSWQ7CiAgICAgICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGxvYWRpbmdSYW5nZXMgPSBbCiAgICAgICAgICAgIC4uLnN0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5sb2FkaW5nUmFuZ2VzLAogICAgICAgIF07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG1hdGNoID0gZmluZEJlZ2luRW5kUmFuZ2VJbmRleChsb2FkaW5nUmFuZ2VzLCByYW5nZS5iZWdpbiwgcmFuZ2UuZW5kKTsKICAgICAgICBpZiAobWF0Y2ggPT09IC0xKSB7CiAgICAgICAgICAgIGxvYWRpbmdSYW5nZXMucHVzaCh7IGJlZ2luOiByYW5nZS5iZWdpbiwgZW5kOiByYW5nZS5lbmQgfSk7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucyksIHsgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQpLCB7IGxvYWRpbmdSYW5nZXMgfSkgfSkgfSk7CiAgICAgICAgcmV0dXJuIG5ld1N0YXRlOwogICAgfSkpLCBvbihleGVjdXRpb25EaWdlc3RzTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGRpZ2VzdHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgZGlnZXN0cykgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBydW5JZCA9IHN0YXRlLmFjdGl2ZVJ1bklkOwogICAgICAgIGlmIChydW5JZCA9PT0gbnVsbCkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsb2FkaW5nUmFuZ2VzID0gWwogICAgICAgICAgICAuLi5zdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubG9hZGluZ1JhbmdlcywKICAgICAgICBdOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBtYXRjaEluZGV4ID0gZmluZEJlZ2luRW5kUmFuZ2VJbmRleChsb2FkaW5nUmFuZ2VzLCBkaWdlc3RzLmJlZ2luLCBkaWdlc3RzLmVuZCk7CiAgICAgICAgaWYgKG1hdGNoSW5kZXggIT09IC0xKSB7CiAgICAgICAgICAgIGxvYWRpbmdSYW5nZXMuc3BsaWNlKG1hdGNoSW5kZXgsIDEpOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkKSwgeyBudW1FeGVjdXRpb25zOiBkaWdlc3RzLm51bV9kaWdlc3RzLCBsb2FkaW5nUmFuZ2VzIH0pLCBleGVjdXRpb25EaWdlc3RzOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHMpIH0pIH0pOwogICAgICAgIGZvciAobGV0IGkgPSBkaWdlc3RzLmJlZ2luOyBpIDwgZGlnZXN0cy5lbmQ7ICsraSkgewogICAgICAgICAgICBuZXdTdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNbaV0gPQogICAgICAgICAgICAgICAgZGlnZXN0cy5leGVjdXRpb25fZGlnZXN0c1tpIC0gZGlnZXN0cy5iZWdpbl07CiAgICAgICAgfQogICAgICAgIC8vIFVwZGF0ZSBwYWdlc0xvYWRlZEluRnVsbC4KICAgICAgICBpZiAoZGlnZXN0cy5lbmQgPiBkaWdlc3RzLmJlZ2luKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGFnZUluZGV4ID0gZGlnZXN0cy5iZWdpbiAvIHN0YXRlLmV4ZWN1dGlvbnMucGFnZVNpemU7CiAgICAgICAgICAgIG5ld1N0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5wYWdlTG9hZGVkU2l6ZXMgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG5ld1N0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5wYWdlTG9hZGVkU2l6ZXMpLCB7IFtwYWdlSW5kZXhdOiBkaWdlc3RzLmVuZCAtIGRpZ2VzdHMuYmVnaW4gfSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgIH0pKSwgb24oZXhlY3V0aW9uU2Nyb2xsTGVmdCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgLy8gVE9ETyhjYWlzKTogTGVmdC1yaWdodCBuYXZpZ2F0aW9uIHNob3VsZCBoYXZlIG1vcmUgY29udGV4dC1kZXBlZGVudAogICAgICAgIC8vIGJlaGF2aW9yLCBlLmcuLCB3aGVuIGFsZXJ0cyBhcmUgcHJlc2VudC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcnVuSWQgPSBzdGF0ZS5hY3RpdmVSdW5JZDsKICAgICAgICBpZiAocnVuSWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNjcm9sbEJlZ2luSW5kZXggPSBzdGF0ZS5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7CiAgICAgICAgaWYgKHNjcm9sbEJlZ2luSW5kZXggPiAwKSB7CiAgICAgICAgICAgIHNjcm9sbEJlZ2luSW5kZXgtLTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucyksIHsgc2Nyb2xsQmVnaW5JbmRleCB9KSB9KTsKICAgIH0pKSwgb24oZXhlY3V0aW9uU2Nyb2xsUmlnaHQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIC8vIFRPRE8oY2Fpcyk6IExlZnQtcmlnaHQgbmF2aWdhdGlvbiBzaG91bGQgaGF2ZSBtb3JlIGNvbnRleHQtZGVwZWRlbnQKICAgICAgICAvLyBiZWhhdmlvciwgZS5nLiwgd2hlbiBhbGVydHMgYXJlIHByZXNlbnQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUuYWN0aXZlUnVuSWQ7CiAgICAgICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBzY3JvbGxCZWdpbkluZGV4ID0gc3RhdGUuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4OwogICAgICAgIGlmIChzY3JvbGxCZWdpbkluZGV4ICsgc3RhdGUuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQgKyAxIDw9CiAgICAgICAgICAgIHN0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5udW1FeGVjdXRpb25zKSB7CiAgICAgICAgICAgIHNjcm9sbEJlZ2luSW5kZXgrKzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZXhlY3V0aW9ucyksIHsgc2Nyb2xsQmVnaW5JbmRleCB9KSB9KTsKICAgIH0pKSwgb24oZXhlY3V0aW9uU2Nyb2xsVG9JbmRleCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgaWYgKGFjdGlvbi5pbmRleCA8IDAgfHwgIU51bWJlci5pc0ludGVnZXIoYWN0aW9uLmluZGV4KSkgewogICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEF0dGVtcHQgdG8gc2Nyb2xsIHRvIG5lZ2F0aXZlIG9yIG5vbi1pbnRlZ2VyIGV4ZWN1dGlvbiBpbmRleCBgICsKICAgICAgICAgICAgICAgIGAoJHthY3Rpb24uaW5kZXh9KWApOwogICAgICAgIH0KICAgICAgICBjb25zdCB7IGRpc3BsYXlDb3VudCB9ID0gc3RhdGUuZXhlY3V0aW9uczsKICAgICAgICBjb25zdCB7IG51bUV4ZWN1dGlvbnMgfSA9IHN0YXRlLmV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDsKICAgICAgICBpZiAoYWN0aW9uLmluZGV4ID4gTWF0aC5tYXgoMCwgbnVtRXhlY3V0aW9ucyAtIGRpc3BsYXlDb3VudCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0IHRvIHNjcm9sbCB0byBleGVjdXRpb24gaW5kZXggKCR7YWN0aW9uLmluZGV4fSksIGAgKwogICAgICAgICAgICAgICAgYHdoaWNoIGV4Y2VlZHMgbWF4aW11bSBhbGxvd2VkIGluZGV4IGAgKwogICAgICAgICAgICAgICAgYChudW1FeGVjdXRpb25zPSR7bnVtRXhlY3V0aW9uc307IGRpc3BsYXlDb3VudD0ke2Rpc3BsYXlDb3VudH0pYCk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBleGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmV4ZWN1dGlvbnMpLCB7IHNjcm9sbEJlZ2luSW5kZXg6IGFjdGlvbi5pbmRleCB9KSB9KTsKICAgIH0pKSwgb24oZXhlY3V0aW9uRGlnZXN0Rm9jdXNlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBmb2N1c0luZGV4OiBzdGF0ZS5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXggKyBhY3Rpb24uZGlzcGxheUluZGV4IH0pLCBjb2RlTG9jYXRpb25Gb2N1c1R5cGU6IENvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OLCBzb3VyY2VDb2RlOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zb3VyY2VDb2RlKSB9KTsKICAgICAgICBuZXdTdGF0ZS5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWMgPSBjb21wdXRlQm90dG9tbW9zdExpbmVTcGVjKG5ld1N0YXRlKTsKICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9KSksIG9uKGV4ZWN1dGlvbkRhdGFMb2FkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUuYWN0aXZlUnVuSWQ7CiAgICAgICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zKSwgeyBleGVjdXRpb25EYXRhOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRhdGEpIH0pIH0pOwogICAgICAgIGZvciAobGV0IGkgPSBkYXRhLmJlZ2luOyBpIDwgZGF0YS5lbmQ7ICsraSkgewogICAgICAgICAgICBuZXdTdGF0ZS5leGVjdXRpb25zLmV4ZWN1dGlvbkRhdGFbaV0gPSBkYXRhLmV4ZWN1dGlvbnNbaSAtIGRhdGEuYmVnaW5dOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9KSksIAogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAvLyBSZWR1Y2VycyByZWxhdGVkIHRvIGludHJhLWdyYXBoIGV4ZWN1dGlvbi4gLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgb24obnVtR3JhcGhFeGVjdXRpb25zUmVxdWVzdGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICBpZiAoc3RhdGUuYWN0aXZlUnVuSWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgbnVtRXhlY3V0aW9uc0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMubnVtRXhlY3V0aW9uc0xvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KSB9KTsKICAgIH0pKSwgb24obnVtR3JhcGhFeGVjdXRpb25zTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IG51bUdyYXBoRXhlY3V0aW9ucyB9KSA9PiB7CiAgICAgICAgaWYgKHN0YXRlLmFjdGl2ZVJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG51bUdyYXBoRXhlY3V0aW9uc0luY3JlYXNlZCA9IG51bUdyYXBoRXhlY3V0aW9ucyA+CiAgICAgICAgICAgIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnM7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM6IG51bUdyYXBoRXhlY3V0aW9uc0luY3JlYXNlZAogICAgICAgICAgICAgICAgPyBEYXRlLm5vdygpCiAgICAgICAgICAgICAgICA6IHN0YXRlLmxhc3ROb25FbXB0eVBvbGxEYXRhVGltZU1zLCBncmFwaEV4ZWN1dGlvbnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhFeGVjdXRpb25zKSwgeyBudW1FeGVjdXRpb25zTG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5MT0FERUQsIGxhc3RMb2FkZWRUaW1lSW5NczogRGF0ZS5ub3coKSB9KSwgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZXhlY3V0aW9uRGlnZXN0c0xvYWRlZCksIHsgbnVtRXhlY3V0aW9uczogbnVtR3JhcGhFeGVjdXRpb25zIH0pIH0pIH0pOwogICAgICAgIGlmIChudW1HcmFwaEV4ZWN1dGlvbnMgPiAwICYmIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5mb2N1c0luZGV4ID09PSBudWxsKSB7CiAgICAgICAgICAgIG5ld1N0YXRlLmdyYXBoRXhlY3V0aW9ucy5mb2N1c0luZGV4ID0gMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG5ld1N0YXRlOwogICAgfSkpLCBvbihncmFwaEV4ZWN1dGlvbkRhdGFSZXF1ZXN0ZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgcGFnZUluZGV4IH0pID0+IHsKICAgICAgICBpZiAoc3RhdGUuYWN0aXZlUnVuSWQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzID0gc3RhdGUuZ3JhcGhFeGVjdXRpb25zLmdyYXBoRXhlY3V0aW9uRGF0YUxvYWRpbmdQYWdlcy5zbGljZSgpOwogICAgICAgIGlmIChncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMuaW5kZXhPZihwYWdlSW5kZXgpID09PSAtMSkgewogICAgICAgICAgICBncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMucHVzaChwYWdlSW5kZXgpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzIH0pIH0pOwogICAgfSkpLCBvbihncmFwaEV4ZWN1dGlvbkRhdGFMb2FkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCBkYXRhKSA9PiB7CiAgICAgICAgaWYgKHN0YXRlLmFjdGl2ZVJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgY29uc3QgeyBwYWdlU2l6ZSB9ID0gc3RhdGUuZ3JhcGhFeGVjdXRpb25zOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMgPSBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLnNsaWNlKCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGdyYXBoRXhlY3V0aW9uRGF0YVBhZ2VMb2FkZWRTaXplcyA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5ncmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBncmFwaEV4ZWN1dGlvbkRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMuZ3JhcGhFeGVjdXRpb25EYXRhKTsKICAgICAgICBmb3IgKGxldCBpID0gZGF0YS5iZWdpbjsgaSA8IGRhdGEuZW5kOyArK2kpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYWdlSW5kZXggPSBNYXRoLmZsb29yKGkgLyBwYWdlU2l6ZSk7CiAgICAgICAgICAgIGlmIChncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMuaW5kZXhPZihwYWdlSW5kZXgpICE9PSAtMSkgewogICAgICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLnNwbGljZShncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMuaW5kZXhPZihwYWdlSW5kZXgpLCAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzW3BhZ2VJbmRleF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzW3BhZ2VJbmRleF0gPSAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChncmFwaEV4ZWN1dGlvbkRhdGFbaV0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzW3BhZ2VJbmRleF0rKzsKICAgICAgICAgICAgfQogICAgICAgICAgICBncmFwaEV4ZWN1dGlvbkRhdGFbaV0gPSBkYXRhLmdyYXBoX2V4ZWN1dGlvbnNbaSAtIGRhdGEuYmVnaW5dOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhFeGVjdXRpb25zOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBoRXhlY3V0aW9ucyksIHsgZ3JhcGhFeGVjdXRpb25EYXRhTG9hZGluZ1BhZ2VzLAogICAgICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhUGFnZUxvYWRlZFNpemVzLAogICAgICAgICAgICAgICAgZ3JhcGhFeGVjdXRpb25EYXRhIH0pIH0pOwogICAgfSkpLCBvbihncmFwaEV4ZWN1dGlvblNjcm9sbFRvSW5kZXgsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIGFjdGlvbikgPT4gewogICAgICAgIGlmIChhY3Rpb24uaW5kZXggPCAwIHx8ICFOdW1iZXIuaXNJbnRlZ2VyKGFjdGlvbi5pbmRleCkpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBBdHRlbXB0IHRvIHNjcm9sbCB0byBuZWdhdGl2ZSBvciBub24taW50ZWdlciBncmFwaC1leGVjdXRpb24gYCArCiAgICAgICAgICAgICAgICBgaW5kZXggKCR7YWN0aW9uLmluZGV4fSlgKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGdyYXBoRXhlY3V0aW9uczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaEV4ZWN1dGlvbnMpLCB7IHNjcm9sbEJlZ2luSW5kZXg6IGFjdGlvbi5pbmRleCB9KSB9KTsKICAgIH0pKSwgb24oZ3JhcGhFeGVjdXRpb25Gb2N1c2VkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGFjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCBhY3Rpb24pID0+IHsKICAgICAgICByZXR1cm4gZ3JhcGhPcEZvY3VzUmVkdWNlckhlbHBlcihzdGF0ZSwgYWN0aW9uLmdyYXBoX2lkLCBhY3Rpb24ub3BfbmFtZSwgYWN0aW9uLmluZGV4KTsKICAgIH0pKSwgCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KICAgIC8vIFJlZHVjZXJzIHJlbGF0ZWQgdG8gZ3JhcGggc3RydWN0dXJlcy4gICAgICAvLwogICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICBvbihncmFwaE9wRm9jdXNlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgYWN0aW9uKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoT3BGb2N1c1JlZHVjZXJIZWxwZXIoc3RhdGUsIGFjdGlvbi5ncmFwaF9pZCwgYWN0aW9uLm9wX25hbWUpOwogICAgfSkpLCBvbihncmFwaE9wSW5mb1JlcXVlc3RlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIGRhdGEpID0+IHsKICAgICAgICBjb25zdCB7IGdyYXBoX2lkLCBvcF9uYW1lIH0gPSBkYXRhOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGdyYXBoczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaHMpLCB7IGxvYWRpbmdPcHM6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBocy5sb2FkaW5nT3BzKSB9KSB9KTsKICAgICAgICBpZiAobmV3U3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHNbZ3JhcGhfaWRdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgbmV3U3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHNbZ3JhcGhfaWRdID0gbmV3IE1hcCgpOwogICAgICAgIH0KICAgICAgICBpZiAoIW5ld1N0YXRlLmdyYXBocy5sb2FkaW5nT3BzW2dyYXBoX2lkXS5oYXMob3BfbmFtZSkpIHsKICAgICAgICAgICAgbmV3U3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHNbZ3JhcGhfaWRdLnNldChvcF9uYW1lLCBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9KSksIG9uKGdyYXBoT3BJbmZvTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgZGF0YSkgPT4gewogICAgICAgIGNvbnN0IHsgZ3JhcGhPcEluZm9SZXNwb25zZSB9ID0gZGF0YTsKICAgICAgICBjb25zdCB7IGdyYXBoX2lkcyB9ID0gZ3JhcGhPcEluZm9SZXNwb25zZTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZ3JhcGhJZCA9IGdyYXBoX2lkc1tncmFwaF9pZHMubGVuZ3RoIC0gMV07CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgZ3JhcGhzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBocyksIHsgb3BzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmdyYXBocy5vcHMpLCB7IFtncmFwaElkXTogbmV3IE1hcChzdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdKSB9KSwgbG9hZGluZ09wczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaHMubG9hZGluZ09wcyksIHsgW2dyYXBoSWRdOiBuZXcgTWFwKHN0YXRlLmdyYXBocy5sb2FkaW5nT3BzW2dyYXBoSWRdKSB9KSB9KSB9KTsKICAgICAgICBmb3IgKGNvbnN0IGlucHV0IG9mIGdyYXBoT3BJbmZvUmVzcG9uc2UuaW5wdXRzKSB7CiAgICAgICAgICAgIGlmICghaW5wdXQuZGF0YSkgewogICAgICAgICAgICAgICAgLy8gYGlucHV0LmRhdGFgIGNhbiBiZSB1bmRlZmluZWQgd2hlbiB0aGUgYmFja2VuZCBmYWlscyB0byBsb29rIHVwCiAgICAgICAgICAgICAgICAvLyBkZXRhaWxlZCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIGlucHV0IG9wIChlLmcuLCBmb3IgY2VydGFpbgogICAgICAgICAgICAgICAgLy8gVEYtaW50ZXJuYWwgb3BzIHN1Y2ggYXMgU3RhdGVmdWxQYXJ0aXRpb25lZENhbGwpLgogICAgICAgICAgICAgICAgLy8gU2FtZSBmb3IgYGNvbnN1bWVyLmRhdGFgIGJlbG93LgogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgbmV3U3RhdGUuZ3JhcGhzLm9wc1tncmFwaElkXS5zZXQoaW5wdXQub3BfbmFtZSwgaW5wdXQuZGF0YSk7CiAgICAgICAgfQogICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZ3JhcGhPcEluZm9SZXNwb25zZS5jb25zdW1lcnMubGVuZ3RoOyArK2kpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBjb25zdW1lciBvZiBncmFwaE9wSW5mb1Jlc3BvbnNlLmNvbnN1bWVyc1tpXSkgewogICAgICAgICAgICAgICAgaWYgKCFjb25zdW1lci5kYXRhKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBuZXdTdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdLnNldChjb25zdW1lci5vcF9uYW1lLCBjb25zdW1lci5kYXRhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBuZXdTdGF0ZS5ncmFwaHMub3BzW2dyYXBoSWRdLnNldChncmFwaE9wSW5mb1Jlc3BvbnNlLm9wX25hbWUsIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZ3JhcGhPcEluZm9SZXNwb25zZSksIHsgaW5wdXRzOiBncmFwaE9wSW5mb1Jlc3BvbnNlLmlucHV0cy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGlucHV0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaW5wdXQpID0+ICh7CiAgICAgICAgICAgICAgICBvcF9uYW1lOiBpbnB1dC5vcF9uYW1lLAogICAgICAgICAgICAgICAgb3V0cHV0X3Nsb3Q6IGlucHV0Lm91dHB1dF9zbG90LAogICAgICAgICAgICB9KSkpLCBjb25zdW1lcnM6IGdyYXBoT3BJbmZvUmVzcG9uc2UuY29uc3VtZXJzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2xvdENvbnN1bWVycwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHNsb3RDb25zdW1lcnMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBzbG90Q29uc3VtZXJzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnN1bWVyCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY29uc3VtZXIpID0+ICh7CiAgICAgICAgICAgICAgICAgICAgb3BfbmFtZTogY29uc3VtZXIub3BfbmFtZSwKICAgICAgICAgICAgICAgICAgICBpbnB1dF9zbG90OiBjb25zdW1lci5pbnB1dF9zbG90LAogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSkpIH0pKTsKICAgICAgICAvLyBSZW1vdmUgdGhlIGxvYWRpbmcgbWFya2VyIGZvciB0aGUgb3AuCiAgICAgICAgbmV3U3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHNbZ3JhcGhJZF0uc2V0KGdyYXBoT3BJbmZvUmVzcG9uc2Uub3BfbmFtZSwgRGF0YUxvYWRTdGF0ZS5MT0FERUQpOwogICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgIH0pKSwgCiAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogICAgLy8gUmVkdWNlcnMgcmVsYXRlZCB0byBzb3VyY2UgZmlsZXMgYW5kIHN0YWNrIHRyYWNlcy4gLy8KICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICBvbihzb3VyY2VGaWxlTGlzdFJlcXVlc3RlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZSksIHsgc291cmNlRmlsZUxpc3RMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZS5zb3VyY2VGaWxlTGlzdExvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KSB9KTsKICAgIH0pKSwgb24oc291cmNlRmlsZUxpc3RMb2FkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gc291cmNlRmlsZUxpc3QKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgc291cmNlRmlsZUxpc3QpID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzb3VyY2VDb2RlOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNvdXJjZUNvZGUpLCB7IHNvdXJjZUZpbGVMaXN0TG9hZGVkOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3RMb2FkZWQpLCB7IHN0YXRlOiBEYXRhTG9hZFN0YXRlLkxPQURFRCwgbGFzdExvYWRlZFRpbWVJbk1zOiBEYXRlLm5vdygpIH0pLCBzb3VyY2VGaWxlTGlzdDogc291cmNlRmlsZUxpc3Quc291cmNlRmlsZXMsIGZpbGVDb250ZW50czogc3RhdGUuc291cmNlQ29kZS5maWxlQ29udGVudHMuc2xpY2UoKSB9KSB9KTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3TnVtRmlsZXMgPSBzb3VyY2VGaWxlTGlzdC5zb3VyY2VGaWxlcy5sZW5ndGg7CiAgICAgICAgY29uc3QgeyBmaWxlQ29udGVudHMgfSA9IG5ld1N0YXRlLnNvdXJjZUNvZGU7CiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuZXdOdW1GaWxlczsgKytpKSB7CiAgICAgICAgICAgIGZpbGVDb250ZW50c1tpXSA9IHN0YXRlLnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzW2ldIHx8IHsKICAgICAgICAgICAgICAgIGxvYWRTdGF0ZTogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgICAgICAgICAgbGluZXM6IG51bGwsCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgIH0pKSwgb24oc291cmNlTGluZUZvY3VzZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gZm9jdXMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgZm9jdXMpID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZm9jdXNlZFN0YWNrVHJhY2UgPSBnZXRGb2N1c2VkU3RhY2tGcmFtZXNIZWxwZXIoc3RhdGUpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZSksIHsgZm9jdXNMaW5lU3BlYzogZm9jdXMuc3RhY2tGcmFtZSB9KSB9KTsKICAgICAgICBpZiAoZm9jdXNlZFN0YWNrVHJhY2UgIT09IG51bGwpIHsKICAgICAgICAgICAgbmV3U3RhdGUuc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUgPSBpc0ZyYW1lQm90dG9tbW9zdEluU3RhY2tUcmFjZShmb2N1c2VkU3RhY2tUcmFjZSwgZm9jdXMuc3RhY2tGcmFtZSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgIH0pKSwgb24oc291cmNlRmlsZVJlcXVlc3RlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBzb3VyY2VGaWxlU3BlYwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCBzb3VyY2VGaWxlU3BlYykgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZSksIHsgZmlsZUNvbnRlbnRzOiBzdGF0ZS5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zbGljZSgpIH0pIH0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaWxlSW5kZXggPSBmaW5kRmlsZUluZGV4KG5ld1N0YXRlLnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3QsIHNvdXJjZUZpbGVTcGVjKTsKICAgICAgICBpZiAoZmlsZUluZGV4ID49IDApIHsKICAgICAgICAgICAgbmV3U3RhdGUuc291cmNlQ29kZS5maWxlQ29udGVudHNbZmlsZUluZGV4XS5sb2FkU3RhdGUgPQogICAgICAgICAgICAgICAgRGF0YUxvYWRTdGF0ZS5MT0FESU5HOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCB0aGUgZm9sbG93aW5nIGZpbGUgaW4gZmlsZSBsaXN0OiBgICsKICAgICAgICAgICAgICAgIGBob3N0X25hbWU9IiR7c291cmNlRmlsZVNwZWMuaG9zdF9uYW1lfSIsIGAgKwogICAgICAgICAgICAgICAgYGZpbGVfcGF0aD0iJHtzb3VyY2VGaWxlU3BlYy5maWxlX3BhdGh9ImApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9KSksIG9uKHNvdXJjZUZpbGVMb2FkZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gc291cmNlRmlsZVJlc3BvbnNlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHNvdXJjZUZpbGVSZXNwb25zZSkgPT4gewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc291cmNlQ29kZSksIHsgZmlsZUNvbnRlbnRzOiBzdGF0ZS5zb3VyY2VDb2RlLmZpbGVDb250ZW50cy5zbGljZSgpIH0pIH0pOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmaWxlSW5kZXggPSBmaW5kRmlsZUluZGV4KG5ld1N0YXRlLnNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3QsIHNvdXJjZUZpbGVSZXNwb25zZSk7CiAgICAgICAgaWYgKGZpbGVJbmRleCA+PSAwKSB7CiAgICAgICAgICAgIG5ld1N0YXRlLnNvdXJjZUNvZGUuZmlsZUNvbnRlbnRzW2ZpbGVJbmRleF0gPSB7CiAgICAgICAgICAgICAgICBsb2FkU3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BREVELAogICAgICAgICAgICAgICAgbGluZXM6IHNvdXJjZUZpbGVSZXNwb25zZS5saW5lcywKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGZpbmQgdGhlIGZvbGxvd2luZyBmaWxlIGluIGZpbGUgbGlzdDogYCArCiAgICAgICAgICAgICAgICBgaG9zdF9uYW1lPSIke3NvdXJjZUZpbGVSZXNwb25zZS5ob3N0X25hbWV9IiwgYCArCiAgICAgICAgICAgICAgICBgZmlsZV9wYXRoPSIke3NvdXJjZUZpbGVSZXNwb25zZS5maWxlX3BhdGh9ImApOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9KSksIG9uKHN0YWNrRnJhbWVzTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHN0YWNrRnJhbWVzKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJ1bklkID0gc3RhdGUuYWN0aXZlUnVuSWQ7CiAgICAgICAgaWYgKHJ1bklkID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IG5ld1N0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc3RhY2tGcmFtZXM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc3RhY2tGcmFtZXMpLCBzdGFja0ZyYW1lcy5zdGFja0ZyYW1lcyksIHNvdXJjZUNvZGU6IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNvdXJjZUNvZGUpIH0pOwogICAgICAgIG5ld1N0YXRlLnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYyA9IGNvbXB1dGVCb3R0b21tb3N0TGluZVNwZWMobmV3U3RhdGUpOwogICAgICAgIHJldHVybiBuZXdTdGF0ZTsKICAgIH0pKSk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhJZAogICAgICogQHBhcmFtIHs/fSBvcE5hbWUKICAgICAqIEBwYXJhbSB7Pz19IGdyYXBoRXhlY3V0aW9uSW5kZXgKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdyYXBoT3BGb2N1c1JlZHVjZXJIZWxwZXIoc3RhdGUsIGdyYXBoSWQsIG9wTmFtZSwgZ3JhcGhFeGVjdXRpb25JbmRleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdTdGF0ZSA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGdyYXBoczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5ncmFwaHMpLCB7IGZvY3VzZWRPcDogewogICAgICAgICAgICAgICAgICAgIGdyYXBoSWQsCiAgICAgICAgICAgICAgICAgICAgb3BOYW1lLAogICAgICAgICAgICAgICAgfSB9KSwgY29kZUxvY2F0aW9uRm9jdXNUeXBlOiBDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OLCBzb3VyY2VDb2RlOiBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zb3VyY2VDb2RlKSB9KTsKICAgICAgICBuZXdTdGF0ZS5zb3VyY2VDb2RlLmZvY3VzTGluZVNwZWMgPSBjb21wdXRlQm90dG9tbW9zdExpbmVTcGVjKG5ld1N0YXRlKTsKICAgICAgICBpZiAoZ3JhcGhFeGVjdXRpb25JbmRleCAhPT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIG5ld1N0YXRlLmdyYXBoRXhlY3V0aW9ucyA9IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuZ3JhcGhFeGVjdXRpb25zKSwgeyBmb2N1c0luZGV4OiBncmFwaEV4ZWN1dGlvbkluZGV4IH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbmV3U3RhdGU7CiAgICB9CiAgICAvLyBUT0RPKGNhaXMpOiBSZWZhY3RvciB0aGUgcmVkdWNlcnMgaW50byBzZXBhcmF0ZSBjaGlsZCByZWR1Y2VycyBhbmQKICAgIC8vIG1vdmUgdGhlbSB0byBzZXBhcmF0ZSBmaWxlcy4gQ29tYmluZSB0aGVtIHdpdGggYGNvbWJpbmVSZWR1Y2VycygpYAogICAgLy8gZm9yIGJldHRlciBtYWludGFpbmFiaWxpdHkuCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZWR1Y2VycyQ2KHN0YXRlLCBhY3Rpb24pIHsKICAgICAgICByZXR1cm4gcmVkdWNlciQ0KHN0YXRlLCBhY3Rpb24pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdnZXJfc2VsZWN0b3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IHNlbGVjdERlYnVnZ2VyU3RhdGUgPSBjcmVhdGVGZWF0dXJlU2VsZWN0b3IoREVCVUdHRVJfRkVBVFVSRV9LRVkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0RGVidWdnZXJSdW5MaXN0aW5nID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnJ1bnM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXREZWJ1Z2dlclJ1bnNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHN0YXRlLnJ1bnNMb2FkZWQpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEFjdGl2ZVJ1bklkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiBzdGF0ZS5hY3RpdmVSdW5JZCkpOwogICAgLyoqCiAgICAgKiBHZXQgdGhlIHRpbWUgZWxhcHNlZCBmcm9tIHRoZSBsYXN0IHRpbWUgYXQgd2hpY2ggYSBkYXRhIHBvbGxpbmcKICAgICAqIHlpZWxkZWQgbmV3IGRhdGEgYW5kIHRoZSBsYXN0IHBvbGxpbmcgdGltZSwgaW4gbWlsbGlzZWNvbmRzLgogICAgICogVGhhdCBpczogdGhpcyBpcyBob3cgbG9uZyBwb2xsaW5nIGhhcyB5aWVsZGVkIG5vIG5ldyBkYXRhLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGdldFBvbGxTaWxlbmNlVGltZU1zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmxhc3REYXRhUG9sbE9uc2V0VGltZU1zIC0gc3RhdGUubGFzdE5vbkVtcHR5UG9sbERhdGFUaW1lTXM7CiAgICB9KSk7CiAgICAvKioKICAgICAqIEludGVybWVkaWF0ZSBzZWxlY3RvciBmb3IgYWxlcnRzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHNlbGVjdEFsZXJ0cyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gc3RhdGUuYWxlcnRzKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRBbGVydHNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gYWxlcnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoYWxlcnRzKSA9PiB7CiAgICAgICAgcmV0dXJuIGFsZXJ0cy5hbGVydHNMb2FkZWQ7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXROdW1BbGVydHMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gYWxlcnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoYWxlcnRzKSA9PiB7CiAgICAgICAgcmV0dXJuIGFsZXJ0cy5udW1BbGVydHM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRBbGVydHNGb2N1c1R5cGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gYWxlcnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoYWxlcnRzKSA9PiB7CiAgICAgICAgcmV0dXJuIGFsZXJ0cy5mb2N1c1R5cGU7CiAgICB9KSk7CiAgICAvKioKICAgICAqIEdldCBudW1iZXIgb2YgYWxlcnRzIG9mIHRoZSBhbGVydCB0eXBlIGJlaW5nIGZvY3VzZWQgb24uCiAgICAgKgogICAgICogSWYgbm8gYWxlcnQgdHlwZSBmb2N1cyBleGlzdHMsIHJldHVybnMgMC4KICAgICAqIFRoZSByZXR1cm5lZCBudW1iZXIgaXMgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkZXRhaWxlZCBBbGVydHMKICAgICAqIGRhdGEgaGF2ZSBiZWVuIGxvYWRlZCBieSB0aGUgZnJvbnQgZW5kLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGdldE51bUFsZXJ0c09mRm9jdXNlZFR5cGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gYWxlcnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoYWxlcnRzKSA9PiB7CiAgICAgICAgaWYgKGFsZXJ0cy5mb2N1c1R5cGUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGVydHMuYWxlcnRzQnJlYWtkb3duW2FsZXJ0cy5mb2N1c1R5cGVdIHx8IDA7CiAgICB9KSk7CiAgICAvKioKICAgICAqIEdldCB0aGUgQWxlcnRzIHRoYXQgYXJlIDEpIG9mIHRoZSB0eXBlIGJlaW5nIGZvY3VzZWQgb24sIGFuZAogICAgICogMikgYWxyZWFkeSBsb2FkZWQgYnkgdGhlIGZyb250IGVuZC4KICAgICAqCiAgICAgKiBJZiBubyBhbGVydCB0eXBlIGZvY3VzIGV4aXN0cywgcmV0dXJucyBudWxsLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGdldExvYWRlZEFsZXJ0c09mRm9jdXNlZFR5cGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RBbGVydHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gYWxlcnRzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoYWxlcnRzKSA9PiB7CiAgICAgICAgaWYgKGFsZXJ0cy5mb2N1c1R5cGUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChhbGVydHMuYWxlcnRzW2FsZXJ0cy5mb2N1c1R5cGVdID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGVydHMuYWxlcnRzW2FsZXJ0cy5mb2N1c1R5cGVdOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0QWxlcnRzQnJlYWtkb3duID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0QWxlcnRzLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGFsZXJ0cwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGFsZXJ0cykgPT4gewogICAgICAgIHJldHVybiBhbGVydHMuYWxlcnRzQnJlYWtkb3duOwogICAgfSkpOwogICAgLyoqCiAgICAgKiBJbnRlcm1laWRhdGUgc2VsZWN0b3IgZm9yIGV4ZWN1dGlvbnMuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3Qgc2VsZWN0RXhlY3V0aW9uc1N0YXRlID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiBzdGF0ZS5leGVjdXRpb25zKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXROdW1FeGVjdXRpb25zTG9hZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RXhlY3V0aW9uc1N0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChleGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbnMubnVtRXhlY3V0aW9uc0xvYWRlZDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV4ZWN1dGlvbnMpID0+IHsKICAgICAgICByZXR1cm4gZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0TnVtRXhlY3V0aW9ucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEV4ZWN1dGlvbnNTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXhlY3V0aW9ucykgPT4gewogICAgICAgIHJldHVybiBleGVjdXRpb25zLmV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQubnVtRXhlY3V0aW9uczsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEV4ZWN1dGlvblNjcm9sbEJlZ2luSW5kZXggPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV4ZWN1dGlvbnMpID0+IHsKICAgICAgICByZXR1cm4gZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4OwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0RXhlY3V0aW9uUGFnZVNpemUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV4ZWN1dGlvbnMpID0+IHsKICAgICAgICByZXR1cm4gZXhlY3V0aW9ucy5wYWdlU2l6ZTsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldERpc3BsYXlDb3VudCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEV4ZWN1dGlvbnNTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXhlY3V0aW9ucykgPT4gewogICAgICAgIHJldHVybiBleGVjdXRpb25zLmRpc3BsYXlDb3VudDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldFZpc2libGVFeGVjdXRpb25EaWdlc3RzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RXhlY3V0aW9uc1N0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChleGVjdXRpb25zKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRpZ2VzdHMgPSBbXTsKICAgICAgICBmb3IgKGxldCBleGVjdXRpb25JbmRleCA9IGV4ZWN1dGlvbnMuc2Nyb2xsQmVnaW5JbmRleDsgZXhlY3V0aW9uSW5kZXggPCBleGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXggKyBleGVjdXRpb25zLmRpc3BsYXlDb3VudDsgKytleGVjdXRpb25JbmRleCkgewogICAgICAgICAgICBpZiAoZXhlY3V0aW9uSW5kZXggaW4gZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzKSB7CiAgICAgICAgICAgICAgICBkaWdlc3RzLnB1c2goZXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzW2V4ZWN1dGlvbkluZGV4XSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBkaWdlc3RzLnB1c2gobnVsbCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGRpZ2VzdHM7CiAgICB9KSk7CiAgICAvKioKICAgICAqIEludGVybWVkaWF0ZSBzZWxlY3RvciBmb3IgYWxlcnRzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHNlbGVjdEdyYXBoRXhlY3V0aW9ucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gc3RhdGUuZ3JhcGhFeGVjdXRpb25zKSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXROdW1HcmFwaEV4ZWN1dGlvbnNMb2FkZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5udW1FeGVjdXRpb25zTG9hZGVkOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0TnVtR3JhcGhFeGVjdXRpb25zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmdyYXBoRXhlY3V0aW9ucy5leGVjdXRpb25EaWdlc3RzTG9hZGVkLm51bUV4ZWN1dGlvbnM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRHcmFwaEV4ZWN1dGlvblNjcm9sbEJlZ2luSW5kZXggPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4OwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0R3JhcGhFeGVjdXRpb25EaXNwbGF5Q291bnQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5kaXNwbGF5Q291bnQ7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRHcmFwaEV4ZWN1dGlvblBhZ2VTaXplID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0R3JhcGhFeGVjdXRpb25zLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGdyYXBoRXhlY3V0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGdyYXBoRXhlY3V0aW9ucykgPT4gewogICAgICAgIHJldHVybiBncmFwaEV4ZWN1dGlvbnMucGFnZVNpemU7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRHcmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5ncmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRHcmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5ncmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRHcmFwaEV4ZWN1dGlvbkRhdGEgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5ncmFwaEV4ZWN1dGlvbkRhdGE7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRHcmFwaEV4ZWN1dGlvbkZvY3VzSW5kZXggPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RHcmFwaEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhFeGVjdXRpb25zKSA9PiB7CiAgICAgICAgcmV0dXJuIGdyYXBoRXhlY3V0aW9ucy5mb2N1c0luZGV4OwogICAgfSkpOwogICAgLyoqCiAgICAgKiBJbnRlcm1lZGlhdGUgc2VsZWN0b3IgZm9yIHRoZSBncmFwaHMgc3RhdGUgb2YgZGVidWdnZXIuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3Qgc2VsZWN0RGVidWdnZXJHcmFwaHMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHN0YXRlLmdyYXBocykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0Rm9jdXNlZEdyYXBoT3BJbmZvID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJHcmFwaHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhzKSA9PiB7CiAgICAgICAgY29uc3QgeyBmb2N1c2VkT3AsIG9wcyB9ID0gZ3JhcGhzOwogICAgICAgIGlmIChmb2N1c2VkT3AgPT09IG51bGwgfHwgb3BzW2ZvY3VzZWRPcC5ncmFwaElkXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIG9wc1tmb2N1c2VkT3AuZ3JhcGhJZF0uZ2V0KGZvY3VzZWRPcC5vcE5hbWUpIHx8IG51bGw7CiAgICAgICAgfQogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0Rm9jdXNlZEdyYXBoT3BJbnB1dHMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlckdyYXBocywgKC8qKgogICAgICogQHBhcmFtIHs/fSBncmFwaHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChncmFwaHMpID0+IHsKICAgICAgICBjb25zdCB7IGZvY3VzZWRPcCwgb3BzIH0gPSBncmFwaHM7CiAgICAgICAgaWYgKGZvY3VzZWRPcCA9PT0gbnVsbCB8fAogICAgICAgICAgICBvcHNbZm9jdXNlZE9wLmdyYXBoSWRdID09PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgIW9wc1tmb2N1c2VkT3AuZ3JhcGhJZF0uaGFzKGZvY3VzZWRPcC5vcE5hbWUpKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBncmFwaCA9IG9wc1tmb2N1c2VkT3AuZ3JhcGhJZF07CiAgICAgICAgICAgIGNvbnN0IHsgaW5wdXRzIH0gPSAoLyoqIEB0eXBlIHs/fSAqLyAoZ3JhcGguZ2V0KGZvY3VzZWRPcC5vcE5hbWUpKSk7CiAgICAgICAgICAgIHJldHVybiBpbnB1dHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbnB1dFNwZWMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpbnB1dFNwZWMpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNwZWMgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dFNwZWMpOwogICAgICAgICAgICAgICAgaWYgKGdyYXBoLmhhcyhpbnB1dFNwZWMub3BfbmFtZSkpIHsKICAgICAgICAgICAgICAgICAgICBzcGVjLmRhdGEgPSBncmFwaC5nZXQoaW5wdXRTcGVjLm9wX25hbWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHNwZWM7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9KSk7CiAgICAvLyBIb3cgbWFueSBncmFwaC1leGVjdXRpb24gaW5kaWNlcyBhdCBtb3N0IHRvIGxvb2sgYmFjayBpbiBvcmRlciB0byBmaW5kIHRoZQogICAgLy8gaW5kaWNlcyBvZiB0aGUgZ3JhcGgtZXhlY3V0aW9uIGV2ZW50cyB0aGF0IGNvbnNpc3R1dGUgdGhlIGltbWVkaWF0ZSBpbnB1dCB0bwogICAgLy8gdGhlIGN1cnJlbnRseSBmb2N1c2VkIGdyYXBoLWV4ZWN1dGlvbiBldmVudC4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE1BWF9MT09LX0JBQ0sgPSAyMDA7CiAgICAvKioKICAgICAqIE1ha2VzIGJlc3QtZWZmb3J0IGF0dGVtcHQgdG8gZmluZCB0aGUgZ3JhcGgtZXhlY3V0aW9uIGluZGljZXMgdGhhdAogICAgICogY29uc3RpdHV0ZXMgdGhlIGltbWVkaWF0ZSBpbnB1dHMgdG8gdGhlIGN1cnJlbnRseS1mb2N1c2VkIGdyYXBoLWV4ZWN1dGlvbgogICAgICogZXZlbnQuCiAgICAgKgogICAgICogSWYgbm8gZ3JhcGgtZXhlY3V0aW9uIGV2ZW50IGlzIGN1cnJlbnRseSBmb2N1c2VkIG9uLCByZXR1cm5zIGBudWxsYC4KICAgICAqIEl0IG1heSBza2lwIGluZGljZXMgaWYgc29tZSBvZiB0aGUgZGF0YSBmb3IgdGhlIGdyYXBoLWV4ZWN1dGlvbiBldmVudHMgdGhhdAogICAgICogYXJlIGltbWVkaWF0ZSBpbnB1dHMgaGFzIG5vdCBiZWVuIGxvYWRlZCB5ZXQuCiAgICAgKiBJZiB0aGUgY3VycmVudGx5LWZvY3VzZWQgZ3JhcGgtZXhlY3V0aW9uIGV2ZW50cyBpcyBhIG5vLWlucHV0IG9wLCByZXR1cm5zCiAgICAgKiBhbiBlbXB0eSBhcnJheS4KICAgICAqIElmIHRoZSBpbW1lZGlhdGUgaW5wdXQgZXZlbnRzIGFyZSBtb3JlIHRoYW4gYE1BWF9MT09LX0JBQ0tgIGJlZm9yZSB0aGUKICAgICAqIGN1cnJlbnRseSBmb2N1c2VkIGluZGV4IChyYXJlKSwgdGhlIHJldHVybmVkIGFycmF5IG1heSBiZSBpbmNvbXBsZXRlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGdldEZvY3VzZWRHcmFwaEV4ZWN1dGlvbklucHV0SW5kaWNlcyA9IGNyZWF0ZVNlbGVjdG9yKGdldEdyYXBoRXhlY3V0aW9uRm9jdXNJbmRleCwgZ2V0R3JhcGhFeGVjdXRpb25EYXRhLCBnZXRGb2N1c2VkR3JhcGhPcElucHV0cywgKC8qKgogICAgICogQHBhcmFtIHs/fSBmb2N1c0luZGV4CiAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAqIEBwYXJhbSB7P30gb3BJbnB1dHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChmb2N1c0luZGV4LCBkYXRhLCBvcElucHV0cykgPT4gewogICAgICAgIGlmIChmb2N1c0luZGV4ID09PSBudWxsIHx8IG9wSW5wdXRzID09PSBudWxsKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5wdXRGb3VuZCA9IG9wSW5wdXRzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoXykgPT4gZmFsc2UpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaW5wdXRJbmRpY2VzID0gW107CiAgICAgICAgaWYgKG9wSW5wdXRzLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gaW5wdXRJbmRpY2VzOwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZ3JhcGhfaWQgPSBkYXRhW2ZvY3VzSW5kZXhdLmdyYXBoX2lkOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBsaW1pdCA9IE1hdGgubWF4KDAsIGZvY3VzSW5kZXggLSBNQVhfTE9PS19CQUNLKTsKICAgICAgICBmb3IgKGxldCBpID0gZm9jdXNJbmRleCAtIDE7IGkgPj0gbGltaXQ7IC0taSkgewogICAgICAgICAgICBpZiAoZGF0YVtpXSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG9wSW5wdXRzLmxlbmd0aDsgKytqKSB7CiAgICAgICAgICAgICAgICBpZiAoIWlucHV0Rm91bmRbal0gJiYKICAgICAgICAgICAgICAgICAgICBkYXRhW2ldLmdyYXBoX2lkID09PSBncmFwaF9pZCAmJgogICAgICAgICAgICAgICAgICAgIGRhdGFbaV0ub3BfbmFtZSA9PT0gb3BJbnB1dHNbal0ub3BfbmFtZSAmJgogICAgICAgICAgICAgICAgICAgIGRhdGFbaV0ub3V0cHV0X3Nsb3QgPT09IG9wSW5wdXRzW2pdLm91dHB1dF9zbG90KSB7CiAgICAgICAgICAgICAgICAgICAgaW5wdXRJbmRpY2VzLnB1c2goaSk7CiAgICAgICAgICAgICAgICAgICAgaW5wdXRGb3VuZFtqXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0SW5kaWNlcy5sZW5ndGggPT09IG9wSW5wdXRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIGlucHV0SW5kaWNlczsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEZvY3VzZWRHcmFwaE9wQ29uc3VtZXJzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJHcmFwaHMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZ3JhcGhzKSA9PiB7CiAgICAgICAgY29uc3QgeyBmb2N1c2VkT3AsIG9wcyB9ID0gZ3JhcGhzOwogICAgICAgIGlmIChmb2N1c2VkT3AgPT09IG51bGwgfHwKICAgICAgICAgICAgb3BzW2ZvY3VzZWRPcC5ncmFwaElkXSA9PT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICFvcHNbZm9jdXNlZE9wLmdyYXBoSWRdLmhhcyhmb2N1c2VkT3Aub3BOYW1lKSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZ3JhcGggPSBvcHNbZm9jdXNlZE9wLmdyYXBoSWRdOwogICAgICAgICAgICBjb25zdCB7IGNvbnN1bWVycyB9ID0gKC8qKiBAdHlwZSB7P30gKi8gKGdyYXBoLmdldChmb2N1c2VkT3Aub3BOYW1lKSkpOwogICAgICAgICAgICByZXR1cm4gY29uc3VtZXJzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2xvdENvbnN1bWVycwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHNsb3RDb25zdW1lcnMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBzbG90Q29uc3VtZXJzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbnN1bWVyU3BlYwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGNvbnN1bWVyU3BlYykgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzcGVjID0gT2JqZWN0LmFzc2lnbih7fSwgY29uc3VtZXJTcGVjKTsKICAgICAgICAgICAgICAgICAgICBpZiAoZ3JhcGguaGFzKGNvbnN1bWVyU3BlYy5vcF9uYW1lKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzcGVjLmRhdGEgPSBncmFwaC5nZXQoY29uc3VtZXJTcGVjLm9wX25hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3BlYzsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0pKTsKICAgIC8qKgogICAgICogR2V0IHRoZSBmb2N1c2VkIGFsZXJ0IHR5cGVzIChpZiBhbnkpIG9mIHRoZSBleGVjdXRpb24gZGlnZXN0cyBjdXJyZW50IGJlaW5nCiAgICAgKiBkaXNwbGF5ZWQuIEZvciBlYWNoIGRpc3BsYXllZCBleGVjdXRpb24gZGlnZXN0LCB0aGVyZSBhcmUgdHdvIHBvc3NpYmlsaXRpZXM6CiAgICAgKiAtIGBudWxsYCByZXByZXNlbnRzIG5vIGFsZXJ0LgogICAgICogLSBBbiBpbnN0YW5jZSBvZiB0aGUgYEFsZXJ0VHlwZWAKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBnZXRGb2N1c0FsZXJ0VHlwZXNPZlZpc2libGVFeGVjdXRpb25EaWdlc3RzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGJlZ2luRXhlY3V0aW9uSW5kZXggPSBzdGF0ZS5leGVjdXRpb25zLnNjcm9sbEJlZ2luSW5kZXg7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGVuZEV4ZWN1dGlvbkluZGV4ID0gc3RhdGUuZXhlY3V0aW9ucy5zY3JvbGxCZWdpbkluZGV4ICsgc3RhdGUuZXhlY3V0aW9ucy5kaXNwbGF5Q291bnQ7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsZXJ0VHlwZXMgPSBuZXcgQXJyYXkoZW5kRXhlY3V0aW9uSW5kZXggLSBiZWdpbkV4ZWN1dGlvbkluZGV4KS5maWxsKG51bGwpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBmb2N1c1R5cGUgPSBzdGF0ZS5hbGVydHMuZm9jdXNUeXBlOwogICAgICAgIGlmIChmb2N1c1R5cGUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIGFsZXJ0VHlwZXM7CiAgICAgICAgfQogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBleGVjdXRpb25JbmRpY2VzID0gc3RhdGUuYWxlcnRzLmV4ZWN1dGlvbkluZGljZXNbZm9jdXNUeXBlXTsKICAgICAgICBpZiAoZXhlY3V0aW9uSW5kaWNlcyA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgIHJldHVybiBhbGVydFR5cGVzOwogICAgICAgIH0KICAgICAgICAvLyBUT0RPKGNhaXMpOiBFeHBsb3JlIHVzaW5nIGEgU2V0IGZvciBleGVjdXRpb24gaW5kaWNlcyBpZiB0aGlzCiAgICAgICAgLy8gcGFydCBiZWNvbWVzIGEgcGVyZm9ybWFuY2UgYm90dGxlbmVjayBpbiB0aGUgZnV0dXJlLgogICAgICAgIGZvciAobGV0IGkgPSBiZWdpbkV4ZWN1dGlvbkluZGV4OyBpIDwgZW5kRXhlY3V0aW9uSW5kZXg7ICsraSkgewogICAgICAgICAgICBpZiAoZXhlY3V0aW9uSW5kaWNlcy5pbmNsdWRlcyhpKSkgewogICAgICAgICAgICAgICAgYWxlcnRUeXBlc1tpIC0gYmVnaW5FeGVjdXRpb25JbmRleF0gPSBzdGF0ZS5hbGVydHMuZm9jdXNUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBhbGVydFR5cGVzOwogICAgfSkpOwogICAgLyoqCiAgICAgKiBJbnRlcm1lZGlhdGUgc2VsZWN0b3IgZm9yIHRvcC1sZXZlbCBleGVjdXRpb25zLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHNlbGVjdEV4ZWN1dGlvbnMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHN0YXRlLmV4ZWN1dGlvbnMpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEZvY3VzZWRFeGVjdXRpb25JbmRleCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdEV4ZWN1dGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9ucwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGV4ZWN1dGlvbnMpID0+IHsKICAgICAgICByZXR1cm4gZXhlY3V0aW9ucy5mb2N1c0luZGV4OwogICAgfSkpOwogICAgLyoqCiAgICAgKiBHZXQgdGhlIGRpc3BsYXkgaW5kZXggb2YgdGhlIGV4ZWN1dGlvbiBkaWdlc3QgYmVpbmcgZm9jdXNlZCBvbiAoaWYgYW55KS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBnZXRGb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RXhlY3V0aW9ucywgKC8qKgogICAgICogQHBhcmFtIHs/fSBleGVjdXRpb25zCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoZXhlY3V0aW9ucykgPT4gewogICAgICAgIGlmIChleGVjdXRpb25zLmZvY3VzSW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHsgZm9jdXNJbmRleCwgc2Nyb2xsQmVnaW5JbmRleCwgZGlzcGxheUNvdW50IH0gPSBleGVjdXRpb25zOwogICAgICAgIGlmIChmb2N1c0luZGV4IDwgc2Nyb2xsQmVnaW5JbmRleCB8fAogICAgICAgICAgICBmb2N1c0luZGV4ID49IHNjcm9sbEJlZ2luSW5kZXggKyBkaXNwbGF5Q291bnQpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmb2N1c0luZGV4IC0gc2Nyb2xsQmVnaW5JbmRleDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldExvYWRlZEV4ZWN1dGlvbkRhdGEgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChleGVjdXRpb25zKSA9PiBleGVjdXRpb25zLmV4ZWN1dGlvbkRhdGEpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldExvYWRpbmdHcmFwaE9wcyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdERlYnVnZ2VyU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gc3RhdGUuZ3JhcGhzLmxvYWRpbmdPcHMpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldExvYWRlZFN0YWNrRnJhbWVzID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiBzdGF0ZS5zdGFja0ZyYW1lcykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0Rm9jdXNlZEV4ZWN1dGlvbkRhdGEgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RFeGVjdXRpb25zLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbnMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChleGVjdXRpb25zKSA9PiB7CiAgICAgICAgY29uc3QgeyBmb2N1c0luZGV4LCBleGVjdXRpb25EYXRhIH0gPSBleGVjdXRpb25zOwogICAgICAgIGlmIChmb2N1c0luZGV4ID09PSBudWxsIHx8IGV4ZWN1dGlvbkRhdGFbZm9jdXNJbmRleF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGV4ZWN1dGlvbkRhdGFbZm9jdXNJbmRleF07CiAgICB9KSk7CiAgICAvKioKICAgICAqIEdldCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgdGhlIG9wIHRoYXQncyB0aGUgb3JpZ2luIG9mIHRoZSBmb2N1c2VkCiAgICAgKiBjb2RlIGxvY2F0aW9uIChzdGFjayB0cmFjZSkuCiAgICAgKiBUaGlzIHNlbGVjdG9yIGNvdmVycyBib3RoIGVhZ2VyIGV4ZWN1dGlvbiBhbmQgZ3JhcGgtb3AgY3JlYXRpb24uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgZ2V0Q29kZUxvY2F0aW9uT3JpZ2luID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0RGVidWdnZXJTdGF0ZSwgZ2V0Rm9jdXNlZEV4ZWN1dGlvbkluZGV4LCBnZXRGb2N1c2VkRXhlY3V0aW9uRGF0YSwgZ2V0Rm9jdXNlZEdyYXBoT3BJbmZvLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbkluZGV4CiAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbkRhdGEKICAgICAqIEBwYXJhbSB7P30gZ3JhcGhPcEluZm8KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgZXhlY3V0aW9uSW5kZXgsIGV4ZWN1dGlvbkRhdGEsIGdyYXBoT3BJbmZvKSA9PiB7CiAgICAgICAgY29uc3QgeyBjb2RlTG9jYXRpb25Gb2N1c1R5cGUgfSA9IHN0YXRlOwogICAgICAgIGlmIChjb2RlTG9jYXRpb25Gb2N1c1R5cGUgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIGlmIChjb2RlTG9jYXRpb25Gb2N1c1R5cGUgPT09IENvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OKSB7CiAgICAgICAgICAgIGlmIChleGVjdXRpb25JbmRleCA9PT0gbnVsbCB8fCBleGVjdXRpb25EYXRhID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgY29kZUxvY2F0aW9uVHlwZTogQ29kZUxvY2F0aW9uVHlwZS5FWEVDVVRJT04sCiAgICAgICAgICAgICAgICBvcFR5cGU6IGV4ZWN1dGlvbkRhdGEub3BfdHlwZSwKICAgICAgICAgICAgICAgIGV4ZWN1dGlvbkluZGV4LAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgLy8gVGhpcyBpcyBDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OLgogICAgICAgICAgICBpZiAoZ3JhcGhPcEluZm8gPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBjb2RlTG9jYXRpb25UeXBlOiBDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OLAogICAgICAgICAgICAgICAgb3BUeXBlOiBncmFwaE9wSW5mby5vcF90eXBlLAogICAgICAgICAgICAgICAgb3BOYW1lOiBncmFwaE9wSW5mby5vcF9uYW1lLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgIH0pKTsKICAgIC8qKgogICAgICogR2V0IHRoZSBzdGFjayB0cmFjZSAoZnJhbWVzKSBvZiB0aGUgZXhlY3V0aW9uIGV2ZW50IGN1cnJlbnRseSBmb2N1c2VkIG9uCiAgICAgKiAoaWYgYW55KS4KICAgICAqCiAgICAgKiBJZiBubyBleGVjdXRpb24gaXMgZm9jdXNlZCBvbiwgcmV0dXJucyBudWxsLgogICAgICogSWYgYW55IG9mIHRoZSBzdGFjayBmcmFtZXMgaXMgbWlzc2luZyAoaS5lLiwgaGFzbid0IGJlZW4gbG9hZGVkIGZyb20KICAgICAqIHRoZSBkYXRhIHNvdXJjZSB5ZXQpLCByZXR1cm5zIG51bGwuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgZ2V0Rm9jdXNlZFN0YWNrRnJhbWVzID0gY3JlYXRlU2VsZWN0b3IoCiAgICAvLyBUT0RPKGNhaXMpOiBSZW5hbWUgdGhpcyBmdW5jdGlvbiBhcyBgZ2V0Rm9jdXNlZFN0YWNrVHJhY2UoKWAgdG8KICAgIC8vIG1pbmltaXplIGNvbmZ1c2lvbiB3aXRoIGBnZXRGb2N1c2VkU291cmNlTGluZVNwZWMoKWAuCiAgICBzZWxlY3REZWJ1Z2dlclN0YXRlLCBnZXRGb2N1c2VkU3RhY2tGcmFtZXNIZWxwZXIpOwogICAgLyoqCiAgICAgKiBJbnRlcm1lZGlhdGUgc2VsZWN0b3IgZm9yIHNvdXJjZSBjb2RlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHNlbGVjdFNvdXJjZUNvZGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHN0YXRlLnNvdXJjZUNvZGUpKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldFNvdXJjZUZpbGVMaXN0TG9hZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0U291cmNlQ29kZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2VDb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc291cmNlQ29kZSkgPT4gewogICAgICAgIHJldHVybiBzb3VyY2VDb2RlLnNvdXJjZUZpbGVMaXN0TG9hZGVkOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0U291cmNlRmlsZUxpc3QgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RTb3VyY2VDb2RlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZUNvZGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzb3VyY2VDb2RlKSA9PiB7CiAgICAgICAgcmV0dXJuIHNvdXJjZUNvZGUuc291cmNlRmlsZUxpc3Q7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRGb2N1c2VkU291cmNlRmlsZUluZGV4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0U291cmNlQ29kZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzb3VyY2VDb2RlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc291cmNlQ29kZSkgPT4gewogICAgICAgIGNvbnN0IHsgc291cmNlRmlsZUxpc3QsIGZvY3VzTGluZVNwZWMgfSA9IHNvdXJjZUNvZGU7CiAgICAgICAgaWYgKGZvY3VzTGluZVNwZWMgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmluZEZpbGVJbmRleChzb3VyY2VGaWxlTGlzdCwgZm9jdXNMaW5lU3BlYyk7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRGb2N1c2VkU291cmNlRmlsZUNvbnRlbnQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3RTb3VyY2VDb2RlLCBnZXRGb2N1c2VkU291cmNlRmlsZUluZGV4LCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHNvdXJjZUNvZGUKICAgICAqIEBwYXJhbSB7P30gZmlsZUluZGV4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc291cmNlQ29kZSwgZmlsZUluZGV4KSA9PiB7CiAgICAgICAgaWYgKGZpbGVJbmRleCA9PT0gLTEpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzb3VyY2VDb2RlLmZpbGVDb250ZW50c1tmaWxlSW5kZXhdIHx8IG51bGw7CiAgICB9KSk7CiAgICAvKioKICAgICAqIEdldCB0aGUgc291cmNlLWNvZGUgbGluZSBiZWluZyBmb2N1c2VkIG9uLgogICAgICoKICAgICAqIElmIHRoZSBgc3RpY2tpbmdUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGVgIHN0YXRlIGlzIGB0cnVlYCBhbmQKICAgICAqIGBmb2N1c2VkTEluZVNwZWNgIGlzIG5vdCBudWxsLCB0aGlzIHNlbGVjdG9yIHdpbGwgcmV0dXJuIHRoZSBib3R0b21tb3N0CiAgICAgKiBzdGFjayBmcmFtZSBpbiB0aGUgZmlsZSBpbiBgZm9jdXNlZExJbmVTcGVjYC4KICAgICAqIEVsc2UsIGl0J2xsIGRpcmVjdGx5IHJldHVybiB0aGUgdmFsdWUgb2YgYGZvY3VzZWRMSW5lU3BlY2AuCiAgICAgKgogICAgICogVGhpcyBzZWxlY3RvciBhbGxvd3MgdGhlIFVJIHRvICJ0cmFjayIgbGluZXMgaW4gYSBzb3VyY2UgZmlsZSBvZiBpbnRlcmVzdAogICAgICogYXMgYSB1c2VyIG5hdmlnYXRlcyBleGVjdXRpb25zIG9yIGdyYXBoIG9wcy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBnZXRGb2N1c2VkU291cmNlTGluZVNwZWMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHN0YXRlLnNvdXJjZUNvZGUuZm9jdXNMaW5lU3BlYykpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0U3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3REZWJ1Z2dlclN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGRlYnVnZ2VyU3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChkZWJ1Z2dlclN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIGRlYnVnZ2VyU3RhdGUuc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGU7CiAgICB9KSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9hbGVydHMvYWxlcnRzX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkYiA9IGZ1bmN0aW9uIChhMCkgeyByZXR1cm4gW2EwXTsgfTsKICAgIGZ1bmN0aW9uIEFsZXJ0c0NvbXBvbmVudF9kaXZfOV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjMgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQWxlcnRzQ29tcG9uZW50X2Rpdl85X1RlbXBsYXRlX2Rpdl9jbGlja18wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IzKTsgY29uc3QgYnJlYWtkb3duX3IxID0gY3R4LiRpbXBsaWNpdDsgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjIub25Ub2dnbGVGb2N1c1R5cGUuZW1pdChicmVha2Rvd25fcjEudHlwZSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDgpOwogICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgOSk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudCg1LCAiZGl2Iik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGJyZWFrZG93bl9yMSA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjEoNCwgX2MwJGIsIGJyZWFrZG93bl9yMS50eXBlID09PSBjdHhfcjAuZm9jdXNUeXBlID8gImZvY3VzIiA6ICIiKSk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShicmVha2Rvd25fcjEuZGlzcGxheU5hbWUpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUyKCIgIiwgYnJlYWtkb3duX3IxLmRpc3BsYXlTeW1ib2wsICI6ICIsIGJyZWFrZG93bl9yMS5jb3VudCwgIiAiKTsKICAgIH0gfQogICAgY2xhc3MgQWxlcnRzQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIGFsZXJ0cy4KICAgICAgICAgICAgdGhpcy5udW1BbGVydHMgPSAwOwogICAgICAgICAgICB0aGlzLmFsZXJ0c0JyZWFrZG93biA9IFtdOwogICAgICAgICAgICB0aGlzLmZvY3VzVHlwZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMub25Ub2dnbGVGb2N1c1R5cGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgfQogICAgQWxlcnRzQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdhbGVydHMtY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vYWxlcnRzX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9hbGVydHNfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgQWxlcnRzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG51bUFsZXJ0czogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYWxlcnRzQnJlYWtkb3duOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb2N1c1R5cGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uVG9nZ2xlRm9jdXNUeXBlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRzQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gQWxlcnRzQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFsZXJ0c0NvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbGVydHNDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQWxlcnRzQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImFsZXJ0cy1jb21wb25lbnQiXV0sIGlucHV0czogeyBudW1BbGVydHM6ICJudW1BbGVydHMiLCBhbGVydHNCcmVha2Rvd246ICJhbGVydHNCcmVha2Rvd24iLCBmb2N1c1R5cGU6ICJmb2N1c1R5cGUiIH0sIG91dHB1dHM6IHsgb25Ub2dnbGVGb2N1c1R5cGU6ICJvblRvZ2dsZUZvY3VzVHlwZSIgfSwgZGVjbHM6IDEwLCB2YXJzOiA1LCBjb25zdHM6IFtbMSwgImFsZXJ0cy1jb250YWluZXIiXSwgWzEsICJkZWJ1Z2dpbmctdGl0bGUiXSwgWzEsICJudW0tYWxlcnRzLWNvbnRhaW5lciJdLCBbMSwgIm51bS1hbGVydHMtbGFiZWwiXSwgWzEsICJudW0tYWxlcnRzLXZhbHVlIiwgMywgIm5nQ2xhc3MiXSwgWzEsICJhbGVydHMtYnJlYWtkb3duLWNvbnRhaW5lciJdLCBbImNsYXNzIiwgImFsZXJ0cy1icmVha2Rvd24tdHlwZSIsIDMsICJuZ0NsYXNzIiwgImNsaWNrIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJhbGVydHMtYnJlYWtkb3duLXR5cGUiLCAzLCAibmdDbGFzcyIsICJjbGljayJdLCBbMSwgImFsZXJ0LXR5cGUtbmFtZSJdLCBbMSwgImFsZXJ0LXR5cGUtY291bnQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBBbGVydHNDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMiwgIkRlYnVnZ2luZyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDUsICJBbGVydHMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAiZGl2IiwgNCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDcpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDgsICJkaXYiLCA1KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDksIEFsZXJ0c0NvbXBvbmVudF9kaXZfOV9UZW1wbGF0ZSwgNiwgNiwgImRpdiIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSg2KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjEoMywgX2MwJGIsIGN0eC5udW1BbGVydHMgPiAwID8gIm5vbi16ZXJvIiA6ICIiKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eC5udW1BbGVydHMsICIgIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguYWxlcnRzQnJlYWtkb3duKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0NsYXNzLCBOZ0Zvck9mXSwgc3R5bGVzOiBbIi5hbGVydHMtYnJlYWtkb3duLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEzcHg7XG4gIHBhZGRpbmc6IDEwcHggMTBweCAxMHB4O1xuICBwb3NpdGlvbjogcmVsYXRpdmU7XG59XG5cbi5hbGVydHMtYnJlYWtkb3duLXR5cGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJhZGl1czogMCAxMHB4IDEwcHggMDtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBkaXNwbGF5OiBmbGV4O1xuICBwYWRkaW5nOiA2cHggMCA2cHggNTBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmFsZXJ0cy1icmVha2Rvd24tdHlwZS5mb2N1c1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZlZWUwO1xufVxuXG4uYWxlcnRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LWZhbWlseTogJ1JvYm90bycsIEFyaWFsLCBIZWx2ZXRpY2EsIHNhbnMtc2VyaWY7XG59XG5cbi5hbGVydC10eXBlLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTUyNTkyO1xuICBib3JkZXItcmFkaXVzOiAzcHg7XG4gIGNvbG9yOiAjZmZmO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDNweDtcbiAgcG9zaXRpb246IGFic29sdXRlO1xuICByaWdodDogMjBweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmFsZXJ0LXR5cGUtbmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmc6IDNweDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbn1cblxuLmRlYnVnZ2luZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDE4cHg7XG59XG5cbi5udW0tYWxlcnRzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgcGFkZGluZzogMTBweCAxMHB4IDEwcHggMzBweDtcbiAgcG9zaXRpb246IHJlbGF0aXZlO1xufVxuXG4ubnVtLWFsZXJ0cy1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtc2l6ZTogMTNweDtcbn1cblxuLm51bS1hbGVydHMtdmFsdWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJhZGl1czogMTJweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDEzcHg7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIGxpbmUtaGVpZ2h0OiAyNHB4O1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHJpZ2h0OiAyMHB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAyNHB4O1xufVxuXG4ubnVtLWFsZXJ0cy12YWx1ZS5ub24temVyb1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZiNzgwO1xuICBmb250LXdlaWdodDogYm9sZDtcbn0iXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2FsZXJ0cy9hbGVydHNfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IEFMRVJUX1RZUEVfVE9fRElTUExBWV9OQU1FX0FORF9TWU1CT0wgPSB7CiAgICAgICAgW0FsZXJ0VHlwZS5GVU5DVElPTl9SRUNPTVBJTEVfQUxFUlRdOiB7CiAgICAgICAgICAgIGRpc3BsYXlOYW1lOiAnRnVuY3Rpb24gcmVjb21waWxlcycsCiAgICAgICAgICAgIGRpc3BsYXlTeW1ib2w6ICdDJywKICAgICAgICB9LAogICAgICAgIFtBbGVydFR5cGUuSU5GX05BTl9BTEVSVF06IHsKICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdOYU4v4oieJywKICAgICAgICAgICAgZGlzcGxheVN5bWJvbDogJ+KInicsCiAgICAgICAgfSwKICAgICAgICBbQWxlcnRUeXBlLlRFTlNPUl9TSEFQRV9BTEVSVF06IHsKICAgICAgICAgICAgZGlzcGxheU5hbWU6ICdUZW5zb3Igc2hhcGUnLAogICAgICAgICAgICBkaXNwbGF5U3ltYm9sOiAn4pagJywKICAgICAgICB9LAogICAgfTsKICAgIGNsYXNzIEFsZXJ0c0NvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5udW1BbGVydHMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXROdW1BbGVydHMpKTsKICAgICAgICAgICAgdGhpcy5hbGVydHNCcmVha2Rvd24kID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXRBbGVydHNCcmVha2Rvd24sICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbGVydHNCcmVha2Rvd24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhbGVydHNCcmVha2Rvd24pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGFsZXJ0VHlwZXMgPSBPYmplY3Qua2V5cyhhbGVydHNCcmVha2Rvd24pOwogICAgICAgICAgICAgICAgYWxlcnRUeXBlcy5zb3J0KCk7CiAgICAgICAgICAgICAgICByZXR1cm4gYWxlcnRUeXBlcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbGVydFR5cGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChhbGVydFR5cGUpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHsgdHlwZTogKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0VHlwZSkpIH0sIEFMRVJUX1RZUEVfVE9fRElTUExBWV9OQU1FX0FORF9TWU1CT0xbYWxlcnRUeXBlXSksIHsgY291bnQ6IGFsZXJ0c0JyZWFrZG93blthbGVydFR5cGVdIH0pOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSkpKTsKICAgICAgICAgICAgdGhpcy5mb2N1c1R5cGUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRBbGVydHNGb2N1c1R5cGUpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhbGVydFR5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVG9nZ2xlRm9jdXNUeXBlKGFsZXJ0VHlwZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGFsZXJ0VHlwZUZvY3VzVG9nZ2xlZCh7IGFsZXJ0VHlwZSB9KSk7CiAgICAgICAgfQogICAgfQogICAgQWxlcnRzQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1hbGVydHMnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8YWxlcnRzLWNvbXBvbmVudAogICAgICBbbnVtQWxlcnRzXT0ibnVtQWxlcnRzJCB8IGFzeW5jIgogICAgICBbYWxlcnRzQnJlYWtkb3duXT0iYWxlcnRzQnJlYWtkb3duJCB8IGFzeW5jIgogICAgICBbZm9jdXNUeXBlXT0iZm9jdXNUeXBlJCB8IGFzeW5jIgogICAgICAob25Ub2dnbGVGb2N1c1R5cGUpPSJvblRvZ2dsZUZvY3VzVHlwZSgkZXZlbnQpIgogICAgPgogICAgPC9hbGVydHMtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEFsZXJ0c0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRzQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gQWxlcnRzQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFsZXJ0c0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0c0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBBbGVydHNDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjItYWxlcnRzIl1dLCBkZWNsczogNCwgdmFyczogOSwgY29uc3RzOiBbWzMsICJudW1BbGVydHMiLCAiYWxlcnRzQnJlYWtkb3duIiwgImZvY3VzVHlwZSIsICJvblRvZ2dsZUZvY3VzVHlwZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEFsZXJ0c0NvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYWxlcnRzLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uVG9nZ2xlRm9jdXNUeXBlIiwgZnVuY3Rpb24gQWxlcnRzQ29udGFpbmVyX1RlbXBsYXRlX2FsZXJ0c19jb21wb25lbnRfb25Ub2dnbGVGb2N1c1R5cGVfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblRvZ2dsZUZvY3VzVHlwZSgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJudW1BbGVydHMiLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC5udW1BbGVydHMkKSkoImFsZXJ0c0JyZWFrZG93biIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4LmFsZXJ0c0JyZWFrZG93biQpKSgiZm9jdXNUeXBlIiwgybXJtXBpcGVCaW5kMSgzLCA3LCBjdHguZm9jdXNUeXBlJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0FsZXJ0c0NvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIGNvbnN0IF9jMCRjID0gWyJzbGlkZXJXcmFwcGVyIl07CiAgICBjb25zdCBhY3RpdmVFdmVudE9wdGlvbnMgPSBub3JtYWxpemVQYXNzaXZlTGlzdGVuZXJPcHRpb25zKHsgcGFzc2l2ZTogZmFsc2UgfSk7CiAgICAvKioKICAgICAqIFZpc3VhbGx5LCBhIDMwcHggc2VwYXJhdGlvbiBiZXR3ZWVuIHRpY2sgbWFya3MgbG9va3MgYmVzdC4gVGhpcyBpcyB2ZXJ5IHN1YmplY3RpdmUgYnV0IGl0IGlzCiAgICAgKiB0aGUgZGVmYXVsdCBzZXBhcmF0aW9uIHdlIGNob3NlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1JTl9BVVRPX1RJQ0tfU0VQQVJBVElPTiA9IDMwOwogICAgLyoqCiAgICAgKiBUaGUgdGh1bWIgZ2FwIHNpemUgZm9yIGEgZGlzYWJsZWQgc2xpZGVyLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IERJU0FCTEVEX1RIVU1CX0dBUCA9IDc7CiAgICAvKioKICAgICAqIFRoZSB0aHVtYiBnYXAgc2l6ZSBmb3IgYSBub24tYWN0aXZlIHNsaWRlciBhdCBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNSU5fVkFMVUVfTk9OQUNUSVZFX1RIVU1CX0dBUCA9IDc7CiAgICAvKioKICAgICAqIFRoZSB0aHVtYiBnYXAgc2l6ZSBmb3IgYW4gYWN0aXZlIHNsaWRlciBhdCBpdHMgbWluaW11bSB2YWx1ZS4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNSU5fVkFMVUVfQUNUSVZFX1RIVU1CX0dBUCA9IDEwOwogICAgLyoqCiAgICAgKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIG1hdC1zbGlkZXIgdG8gcmVnaXN0ZXIgYXMgYSBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAqIFRoaXMgYWxsb3dzIGl0IHRvIHN1cHBvcnQgWyhuZ01vZGVsKV0gYW5kIFtmb3JtQ29udHJvbF0uCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9TTElERVJfVkFMVUVfQUNDRVNTT1IgPSB7CiAgICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsCiAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gTWF0U2xpZGVyKSksCiAgICAgICAgbXVsdGk6IHRydWUKICAgIH07CiAgICAvKioKICAgICAqIEEgc2ltcGxlIGNoYW5nZSBldmVudCBlbWl0dGVkIGJ5IHRoZSBNYXRTbGlkZXIgY29tcG9uZW50LgogICAgICovCiAgICBjbGFzcyBNYXRTbGlkZXJDaGFuZ2UgewogICAgfQogICAgLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRTbGlkZXIuCiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdFNsaWRlckJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdFNsaWRlck1peGluQmFzZSA9IG1peGluVGFiSW5kZXgobWl4aW5Db2xvcihtaXhpbkRpc2FibGVkKE1hdFNsaWRlckJhc2UpLCAnYWNjZW50JykpOwogICAgLyoqCiAgICAgKiBBbGxvd3MgdXNlcnMgdG8gc2VsZWN0IGZyb20gYSByYW5nZSBvZiB2YWx1ZXMgYnkgbW92aW5nIHRoZSBzbGlkZXIgdGh1bWIuIEl0IGlzIHNpbWlsYXIgaW4KICAgICAqIGJlaGF2aW9yIHRvIHRoZSBuYXRpdmUgYDxpbnB1dCB0eXBlPSJyYW5nZSI+YCBlbGVtZW50LgogICAgICovCiAgICBjbGFzcyBNYXRTbGlkZXIgZXh0ZW5kcyBfTWF0U2xpZGVyTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9mb2N1c01vbml0b3IKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICAgICAqIEBwYXJhbSB7P30gdGFiSW5kZXgKICAgICAgICAgKiBAcGFyYW0gez89fSBfYW5pbWF0aW9uTW9kZQogICAgICAgICAqIEBwYXJhbSB7Pz19IF9uZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez89fSBkb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9mb2N1c01vbml0b3IsIF9jaGFuZ2VEZXRlY3RvclJlZiwgX2RpciwgdGFiSW5kZXgsIF9hbmltYXRpb25Nb2RlLCBfbmdab25lLCAKICAgICAgICAvKiogQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgbWFrZSBkb2N1bWVudCByZXF1aXJlZCAqLwogICAgICAgIGRvY3VtZW50KSB7CiAgICAgICAgICAgIHN1cGVyKGVsZW1lbnRSZWYpOwogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IgPSBfZm9jdXNNb25pdG9yOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uTW9kZSA9IF9hbmltYXRpb25Nb2RlOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9pbnZlcnQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fbWF4ID0gMTAwOwogICAgICAgICAgICB0aGlzLl9taW4gPSAwOwogICAgICAgICAgICB0aGlzLl9zdGVwID0gMTsKICAgICAgICAgICAgdGhpcy5fdGh1bWJMYWJlbCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl90aWNrSW50ZXJ2YWwgPSAwOwogICAgICAgICAgICB0aGlzLl92YWx1ZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX3ZlcnRpY2FsID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHNsaWRlciB2YWx1ZSBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzbGlkZXIgdGh1bWIgbW92ZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlucHV0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgcmF3IHZhbHVlIG9mIHRoZSBzbGlkZXIgY2hhbmdlcy4gVGhpcyBpcyBoZXJlIHByaW1hcmlseQogICAgICAgICAgICAgKiB0byBmYWNpbGl0YXRlIHRoZSB0d28td2F5IGJpbmRpbmcgZm9yIHRoZSBgdmFsdWVgIGlucHV0LgogICAgICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIG9uVG91Y2ggZnVuY3Rpb24gcmVnaXN0ZXJlZCB2aWEgcmVnaXN0ZXJPblRvdWNoIChDb250cm9sVmFsdWVBY2Nlc3NvcikuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9uVG91Y2hlZCA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgICAgIHRoaXMuX3BlcmNlbnQgPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIHRodW1iIGlzIHNsaWRpbmcuCiAgICAgICAgICAgICAqIFVzZWQgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIHNob3VsZCBiZSBhIHRyYW5zaXRpb24gZm9yIHRoZSB0aHVtYiBhbmQgZmlsbCB0cmFjay4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2lzU2xpZGluZyA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIHNsaWRlciBpcyBhY3RpdmUgKGNsaWNrZWQgb3Igc2xpZGluZykuCiAgICAgICAgICAgICAqIFVzZWQgdG8gc2hyaW5rIGFuZCBncm93IHRoZSB0aHVtYiBhcyBhY2NvcmRpbmcgdG8gdGhlIE1hdGVyaWFsIERlc2lnbiBzcGVjLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faXNBY3RpdmUgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBzaXplIG9mIGEgdGljayBpbnRlcnZhbCBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHNpemUgb2YgdGhlIHRyYWNrLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdGlja0ludGVydmFsUGVyY2VudCA9IDA7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgZGltZW5zaW9ucyBvZiB0aGUgc2xpZGVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fc2xpZGVyRGltZW5zaW9ucyA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIHRoZSBEaXJlY3Rpb25hbGl0eSBjaGFuZ2UgRXZlbnRFbWl0dGVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIHB1dCB0aGVpciBwb2ludGVyIGRvd24gb24gdGhlIHNsaWRlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3BvaW50ZXJEb3duID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXZlbnQpID0+IHsKICAgICAgICAgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIHRoZSBzbGlkZXIgaXMgZGlzYWJsZWQgb3IgdGhlCiAgICAgICAgICAgICAgICAvLyB1c2VyIGlzIHVzaW5nIGFueXRoaW5nIG90aGVyIHRoYW4gdGhlIG1haW4gbW91c2UgYnV0dG9uLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQgfHwgdGhpcy5faXNTbGlkaW5nIHx8ICghaXNUb3VjaEV2ZW50KGV2ZW50KSAmJiBldmVudC5idXR0b24gIT09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fcnVuSW5zaWRlWm9uZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9pbnRlclBvc2l0aW9uID0gZ2V0UG9pbnRlclBvc2l0aW9uT25QYWdlKGV2ZW50KTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2xhc3RQb2ludGVyRXZlbnQgPSBldmVudDsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbk1vdXNlZW50ZXIoKTsgLy8gU2ltdWxhdGUgbW91c2VlbnRlciBpbiBjYXNlIHRoaXMgaXMgYSBtb2JpbGUgZGV2aWNlLgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2JpbmRHbG9iYWxFdmVudHMoZXZlbnQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVWYWx1ZUZyb21Qb3NpdGlvbihwb2ludGVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlT25TbGlkZVN0YXJ0ID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb2ludGVyUG9zaXRpb25PblN0YXJ0ID0gcG9pbnRlclBvc2l0aW9uOwogICAgICAgICAgICAgICAgICAgIC8vIEVtaXQgYSBjaGFuZ2UgYW5kIGlucHV0IGV2ZW50IGlmIHRoZSB2YWx1ZSBjaGFuZ2VkLgogICAgICAgICAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSB0aGlzLnZhbHVlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRJbnB1dEV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdXNlciBoYXMgbW92ZWQgdGhlaXIgcG9pbnRlciBhZnRlcgogICAgICAgICAgICAgKiBzdGFydGluZyB0byBkcmFnLiBCb3VuZCBvbiB0aGUgZG9jdW1lbnQgbGV2ZWwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wb2ludGVyTW92ZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNTbGlkaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgc2xpZGUgZnJvbSBzZWxlY3RpbmcgYW55dGhpbmcgZWxzZS4KICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdFBvaW50ZXJFdmVudCA9IGV2ZW50OwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVZhbHVlRnJvbVBvc2l0aW9uKGdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShldmVudCkpOwogICAgICAgICAgICAgICAgICAgIC8vIE5hdGl2ZSByYW5nZSBlbGVtZW50cyBhbHdheXMgZW1pdCBgaW5wdXRgIGV2ZW50cyB3aGVuIHRoZSB2YWx1ZSBjaGFuZ2VkIHdoaWxlIHNsaWRpbmcuCiAgICAgICAgICAgICAgICAgICAgaWYgKG9sZFZhbHVlICE9IHRoaXMudmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdElucHV0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHVzZXIgaGFzIGxpZnRlZCB0aGVpciBwb2ludGVyLiBCb3VuZCBvbiB0aGUgZG9jdW1lbnQgbGV2ZWwuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9wb2ludGVyVXAgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzU2xpZGluZykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBwb2ludGVyUG9zaXRpb25PblN0YXJ0ID0gdGhpcy5fcG9pbnRlclBvc2l0aW9uT25TdGFydDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY3VycmVudFBvaW50ZXJQb3NpdGlvbiA9IGdldFBvaW50ZXJQb3NpdGlvbk9uUGFnZShldmVudCk7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9yZW1vdmVHbG9iYWxFdmVudHMoKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl92YWx1ZU9uU2xpZGVTdGFydCA9IHRoaXMuX3BvaW50ZXJQb3NpdGlvbk9uU3RhcnQgPSB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gbnVsbDsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pc1NsaWRpbmcgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmFsdWVPblNsaWRlU3RhcnQgIT0gdGhpcy52YWx1ZSAmJiAhdGhpcy5kaXNhYmxlZCAmJgogICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyUG9zaXRpb25PblN0YXJ0ICYmIChwb2ludGVyUG9zaXRpb25PblN0YXJ0LnggIT09IGN1cnJlbnRQb2ludGVyUG9zaXRpb24ueCB8fAogICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyUG9zaXRpb25PblN0YXJ0LnkgIT09IGN1cnJlbnRQb2ludGVyUG9zaXRpb24ueSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aW5kb3cgaGFzIGxvc3QgZm9jdXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl93aW5kb3dCbHVyID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHdpbmRvdyBpcyBibHVycmVkIHdoaWxlIGRyYWdnaW5nIHdlIG5lZWQgdG8gc3RvcCBkcmFnZ2luZyBiZWNhdXNlIHRoZQogICAgICAgICAgICAgICAgLy8gYnJvd3NlciB3b24ndCBkaXNwYXRjaCB0aGUgYG1vdXNldXBgIGFuZCBgdG91Y2hlbmRgIGV2ZW50cyBhbnltb3JlLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2xhc3RQb2ludGVyRXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wb2ludGVyVXAodGhpcy5fbGFzdFBvaW50ZXJFdmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgICAgICB0aGlzLnRhYkluZGV4ID0gcGFyc2VJbnQodGFiSW5kZXgpIHx8IDA7CiAgICAgICAgICAgIHRoaXMuX3J1bk91dHNpemVab25lKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSBlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgICAgICBlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMuX3BvaW50ZXJEb3duLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICAgICAgZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaHN0YXJ0JywgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgc2xpZGVyIGlzIGludmVydGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGludmVydCgpIHsgcmV0dXJuIHRoaXMuX2ludmVydDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBpbnZlcnQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5faW52ZXJ0ID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1heGltdW0gdmFsdWUgdGhhdCB0aGUgc2xpZGVyIGNhbiBoYXZlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG1heCgpIHsgcmV0dXJuIHRoaXMuX21heDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1heCh2KSB7CiAgICAgICAgICAgIHRoaXMuX21heCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHRoaXMuX21heCk7CiAgICAgICAgICAgIHRoaXMuX3BlcmNlbnQgPSB0aGlzLl9jYWxjdWxhdGVQZXJjZW50YWdlKHRoaXMuX3ZhbHVlKTsKICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBhbHNvIG1vZGlmaWVzIHRoZSBwZXJjZW50YWdlLCB3ZSBuZWVkIHRvIGxldCB0aGUgY2hhbmdlIGRldGVjdGlvbiBrbm93LgogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1pbmltdW0gdmFsdWUgdGhhdCB0aGUgc2xpZGVyIGNhbiBoYXZlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG1pbigpIHsgcmV0dXJuIHRoaXMuX21pbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1pbih2KSB7CiAgICAgICAgICAgIHRoaXMuX21pbiA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHRoaXMuX21pbik7CiAgICAgICAgICAgIC8vIElmIHRoZSB2YWx1ZSB3YXNuJ3QgZXhwbGljaXRseSBzZXQgYnkgdGhlIHVzZXIsIHNldCBpdCB0byB0aGUgbWluLgogICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9taW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcGVyY2VudCA9IHRoaXMuX2NhbGN1bGF0ZVBlcmNlbnRhZ2UodGhpcy5fdmFsdWUpOwogICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGFsc28gbW9kaWZpZXMgdGhlIHBlcmNlbnRhZ2UsIHdlIG5lZWQgdG8gbGV0IHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGtub3cuCiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdmFsdWVzIGF0IHdoaWNoIHRoZSB0aHVtYiB3aWxsIHNuYXAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc3RlcCgpIHsgcmV0dXJuIHRoaXMuX3N0ZXA7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBzdGVwKHYpIHsKICAgICAgICAgICAgdGhpcy5fc3RlcCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHYsIHRoaXMuX3N0ZXApOwogICAgICAgICAgICBpZiAodGhpcy5fc3RlcCAlIDEgIT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JvdW5kVG9EZWNpbWFsID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3N0ZXAudG9TdHJpbmcoKS5zcGxpdCgnLicpLnBvcCgpKSkubGVuZ3RoOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNpbmNlIHRoaXMgY291bGQgbW9kaWZ5IHRoZSBsYWJlbCwgd2UgbmVlZCB0byBub3RpZnkgdGhlIGNoYW5nZSBkZXRlY3Rpb24uCiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0byBzaG93IHRoZSB0aHVtYiBsYWJlbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB0aHVtYkxhYmVsKCkgeyByZXR1cm4gdGhpcy5fdGh1bWJMYWJlbDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0aHVtYkxhYmVsKHZhbHVlKSB7IHRoaXMuX3RodW1iTGFiZWwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogSG93IG9mdGVuIHRvIHNob3cgdGlja3MuIFJlbGF0aXZlIHRvIHRoZSBzdGVwIHNvIHRoYXQgYSB0aWNrIGFsd2F5cyBhcHBlYXJzIG9uIGEgc3RlcC4KICAgICAgICAgKiBFeDogVGljayBpbnRlcnZhbCBvZiA0IHdpdGggYSBzdGVwIG9mIDMgd2lsbCBkcmF3IGEgdGljayBldmVyeSA0IHN0ZXBzIChldmVyeSAxMiB2YWx1ZXMpLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHRpY2tJbnRlcnZhbCgpIHsgcmV0dXJuIHRoaXMuX3RpY2tJbnRlcnZhbDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0aWNrSW50ZXJ2YWwodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSAnYXV0bycpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tJbnRlcnZhbCA9ICdhdXRvJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tJbnRlcnZhbCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlLCAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdGlja0ludGVydmFsKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdGlja0ludGVydmFsID0gMDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBWYWx1ZSBvZiB0aGUgc2xpZGVyLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgICAgICAvLyBJZiB0aGUgdmFsdWUgbmVlZHMgdG8gYmUgcmVhZCBhbmQgaXQgaXMgc3RpbGwgdW5pbml0aWFsaXplZCwgaW5pdGlhbGl6ZSBpdCB0byB0aGUgbWluLgogICAgICAgICAgICBpZiAodGhpcy5fdmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9taW47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3ZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB2YWx1ZSh2KSB7CiAgICAgICAgICAgIGlmICh2ICE9PSB0aGlzLl92YWx1ZSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gY29lcmNlTnVtYmVyUHJvcGVydHkodik7CiAgICAgICAgICAgICAgICAvLyBXaGlsZSBpbmNyZW1lbnRpbmcgYnkgYSBkZWNpbWFsIHdlIGNhbiBlbmQgdXAgd2l0aCB2YWx1ZXMgbGlrZSAzMy4zMDAwMDAwMDAwMDAwMDQuCiAgICAgICAgICAgICAgICAvLyBUcnVuY2F0ZSBpdCB0byBlbnN1cmUgdGhhdCBpdCBtYXRjaGVzIHRoZSBsYWJlbCBhbmQgdG8gbWFrZSBpdCBlYXNpZXIgdG8gd29yayB3aXRoLgogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3JvdW5kVG9EZWNpbWFsKSB7CiAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBwYXJzZUZsb2F0KHZhbHVlLnRvRml4ZWQodGhpcy5fcm91bmRUb0RlY2ltYWwpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9wZXJjZW50ID0gdGhpcy5fY2FsY3VsYXRlUGVyY2VudGFnZSh0aGlzLl92YWx1ZSk7CiAgICAgICAgICAgICAgICAvLyBTaW5jZSB0aGlzIGFsc28gbW9kaWZpZXMgdGhlIHBlcmNlbnRhZ2UsIHdlIG5lZWQgdG8gbGV0IHRoZSBjaGFuZ2UgZGV0ZWN0aW9uIGtub3cuCiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBzbGlkZXIgaXMgdmVydGljYWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdmVydGljYWwoKSB7IHJldHVybiB0aGlzLl92ZXJ0aWNhbDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB2ZXJ0aWNhbCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl92ZXJ0aWNhbCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB2YWx1ZSB0byBiZSB1c2VkIGZvciBkaXNwbGF5IHB1cnBvc2VzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpc3BsYXlWYWx1ZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlzcGxheVdpdGgpIHsKICAgICAgICAgICAgICAgIC8vIFZhbHVlIGlzIG5ldmVyIG51bGwgYnV0IHNpbmNlIHNldHRlcnMgYW5kIGdldHRlcnMgY2Fubm90IGhhdmUKICAgICAgICAgICAgICAgIC8vIGRpZmZlcmVudCB0eXBlcywgdGhlIHZhbHVlIGdldHRlciBpcyBhbHNvIHR5cGVkIHRvIHJldHVybiBudWxsLgogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzcGxheVdpdGgoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMudmFsdWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgY291bGQgYmUgaW1wcm92ZWQgZnVydGhlciBieSByb3VuZGluZyBzb21ldGhpbmcgbGlrZSAwLjk5OSB0byAxIG9yCiAgICAgICAgICAgIC8vIDAuODk5IHRvIDAuOSwgaG93ZXZlciBpdCBpcyB2ZXJ5IHBlcmZvcm1hbmNlIHNlbnNpdGl2ZSwgYmVjYXVzZSBpdCBnZXRzIGNhbGxlZCBvbgogICAgICAgICAgICAvLyBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLgogICAgICAgICAgICBpZiAodGhpcy5fcm91bmRUb0RlY2ltYWwgJiYgdGhpcy52YWx1ZSAmJiB0aGlzLnZhbHVlICUgMSAhPT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUudG9GaXhlZCh0aGlzLl9yb3VuZFRvRGVjaW1hbCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMudmFsdWUgfHwgMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogc2V0IGZvY3VzIHRvIHRoZSBob3N0IGVsZW1lbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb2N1cyhvcHRpb25zKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzSG9zdEVsZW1lbnQob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIGJsdXIgdGhlIGhvc3QgZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYmx1cigpIHsKICAgICAgICAgICAgdGhpcy5fYmx1ckhvc3RFbGVtZW50KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBwZXJjZW50YWdlIG9mIHRoZSBzbGlkZXIgdGhhdCBjb2luY2lkZXMgd2l0aCB0aGUgdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGVyY2VudCgpIHsgcmV0dXJuIHRoaXMuX2NsYW1wKHRoaXMuX3BlcmNlbnQpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgYXhpcyBvZiB0aGUgc2xpZGVyIGlzIGludmVydGVkLgogICAgICAgICAqIChpLmUuIHdoZXRoZXIgbW92aW5nIHRoZSB0aHVtYiBpbiB0aGUgcG9zaXRpdmUgeCBvciB5IGRpcmVjdGlvbiBkZWNyZWFzZXMgdGhlIHNsaWRlcidzIHZhbHVlKS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfaW52ZXJ0QXhpcygpIHsKICAgICAgICAgICAgLy8gU3RhbmRhcmQgbm9uLWludmVydGVkIG1vZGUgZm9yIGEgdmVydGljYWwgc2xpZGVyIHNob3VsZCBiZSBkcmFnZ2luZyB0aGUgdGh1bWIgZnJvbSBib3R0b20gdG8KICAgICAgICAgICAgLy8gdG9wLiBIb3dldmVyIGZyb20gYSB5LWF4aXMgc3RhbmRwb2ludCB0aGlzIGlzIGludmVydGVkLgogICAgICAgICAgICByZXR1cm4gdGhpcy52ZXJ0aWNhbCA/ICF0aGlzLmludmVydCA6IHRoaXMuaW52ZXJ0OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBzbGlkZXIgaXMgYXQgaXRzIG1pbmltdW0gdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgX2lzTWluVmFsdWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBlcmNlbnQgPT09IDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBhbW91bnQgb2Ygc3BhY2UgdG8gbGVhdmUgYmV0d2VlbiB0aGUgc2xpZGVyIHRodW1iIGFuZCB0aGUgdHJhY2sgZmlsbCAmIHRyYWNrIGJhY2tncm91bmQKICAgICAgICAgKiBlbGVtZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfdGh1bWJHYXAoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gRElTQUJMRURfVEhVTUJfR0FQOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9pc01pblZhbHVlICYmICF0aGlzLnRodW1iTGFiZWwpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZSA/IE1JTl9WQUxVRV9BQ1RJVkVfVEhVTUJfR0FQIDogTUlOX1ZBTFVFX05PTkFDVElWRV9USFVNQl9HQVA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENTUyBzdHlsZXMgZm9yIHRoZSB0cmFjayBiYWNrZ3JvdW5kIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgX3RyYWNrQmFja2dyb3VuZFN0eWxlcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBheGlzID0gdGhpcy52ZXJ0aWNhbCA/ICdZJyA6ICdYJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzY2FsZSA9IHRoaXMudmVydGljYWwgPyBgMSwgJHsxIC0gdGhpcy5wZXJjZW50fSwgMWAgOiBgJHsxIC0gdGhpcy5wZXJjZW50fSwgMSwgMWA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2lnbiA9IHRoaXMuX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCkgPyAnLScgOiAnJzsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIC8vIHNjYWxlM2QgYXZvaWRzIHNvbWUgcmVuZGVyaW5nIGlzc3VlcyBpbiBDaHJvbWUuIFNlZSAjMTIwNzEuCiAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IGB0cmFuc2xhdGUke2F4aXN9KCR7c2lnbn0ke3RoaXMuX3RodW1iR2FwfXB4KSBzY2FsZTNkKCR7c2NhbGV9KWAKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ1NTIHN0eWxlcyBmb3IgdGhlIHRyYWNrIGZpbGwgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfdHJhY2tGaWxsU3R5bGVzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBlcmNlbnQgPSB0aGlzLnBlcmNlbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXhpcyA9IHRoaXMudmVydGljYWwgPyAnWScgOiAnWCc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2NhbGUgPSB0aGlzLnZlcnRpY2FsID8gYDEsICR7cGVyY2VudH0sIDFgIDogYCR7cGVyY2VudH0sIDEsIDFgOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNpZ24gPSB0aGlzLl9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpID8gJycgOiAnLSc7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAvLyBzY2FsZTNkIGF2b2lkcyBzb21lIHJlbmRlcmluZyBpc3N1ZXMgaW4gQ2hyb21lLiBTZWUgIzEyMDcxLgogICAgICAgICAgICAgICAgdHJhbnNmb3JtOiBgdHJhbnNsYXRlJHtheGlzfSgke3NpZ259JHt0aGlzLl90aHVtYkdhcH1weCkgc2NhbGUzZCgke3NjYWxlfSlgLAogICAgICAgICAgICAgICAgLy8gaU9TIFNhZmFyaSBoYXMgYSBidWcgd2hlcmUgaXQgd29uJ3QgcmUtcmVuZGVyIGVsZW1lbnRzIHdoaWNoIHN0YXJ0IG9mIGFzIGBzY2FsZSgwKWAgdW50aWwKICAgICAgICAgICAgICAgIC8vIHNvbWV0aGluZyBmb3JjZXMgYSBzdHlsZSByZWNhbGN1bGF0aW9uIG9uIGl0LiBTaW5jZSB3ZSdsbCBlbmQgdXAgd2l0aCBgc2NhbGUoMClgIHdoZW4KICAgICAgICAgICAgICAgIC8vIHRoZSB2YWx1ZSBvZiB0aGUgc2xpZGVyIGlzIDAsIHdlIGNhbiBlYXNpbHkgZ2V0IGludG8gdGhpcyBzaXR1YXRpb24uIFdlIGZvcmNlIGEKICAgICAgICAgICAgICAgIC8vIHJlY2FsY3VsYXRpb24gYnkgY2hhbmdpbmcgdGhlIGVsZW1lbnQncyBgZGlzcGxheWAgd2hlbiBpdCBnb2VzIGZyb20gMCB0byBhbnkgb3RoZXIgdmFsdWUuCiAgICAgICAgICAgICAgICBkaXNwbGF5OiBwZXJjZW50ID09PSAwID8gJ25vbmUnIDogJycKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ1NTIHN0eWxlcyBmb3IgdGhlIHRpY2tzIGNvbnRhaW5lciBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF90aWNrc0NvbnRhaW5lclN0eWxlcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYXhpcyA9IHRoaXMudmVydGljYWwgPyAnWScgOiAnWCc7CiAgICAgICAgICAgIC8vIEZvciBhIGhvcml6b250YWwgc2xpZGVyIGluIFJUTCBsYW5ndWFnZXMgd2UgcHVzaCB0aGUgdGlja3MgY29udGFpbmVyIG9mZiB0aGUgbGVmdCBlZGdlCiAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgdGhlIHJpZ2h0IGVkZ2UgdG8gYXZvaWQgY2F1c2luZyBhIGhvcml6b250YWwgc2Nyb2xsYmFyIHRvIGFwcGVhci4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgc2lnbiA9ICF0aGlzLnZlcnRpY2FsICYmIHRoaXMuX2dldERpcmVjdGlvbigpID09ICdydGwnID8gJycgOiAnLSc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG9mZnNldCA9IHRoaXMuX3RpY2tJbnRlcnZhbFBlcmNlbnQgLyAyICogMTAwOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgJ3RyYW5zZm9ybSc6IGB0cmFuc2xhdGUke2F4aXN9KCR7c2lnbn0ke29mZnNldH0lKWAKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ1NTIHN0eWxlcyBmb3IgdGhlIHRpY2tzIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgX3RpY2tzU3R5bGVzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0aWNrU2l6ZSA9IHRoaXMuX3RpY2tJbnRlcnZhbFBlcmNlbnQgKiAxMDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGJhY2tncm91bmRTaXplID0gdGhpcy52ZXJ0aWNhbCA/IGAycHggJHt0aWNrU2l6ZX0lYCA6IGAke3RpY2tTaXplfSUgMnB4YDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgYXhpcyA9IHRoaXMudmVydGljYWwgPyAnWScgOiAnWCc7CiAgICAgICAgICAgIC8vIERlcGVuZGluZyBvbiB0aGUgZGlyZWN0aW9uIHdlIHB1c2hlZCB0aGUgdGlja3MgY29udGFpbmVyLCBwdXNoIHRoZSB0aWNrcyB0aGUgb3Bwb3NpdGUKICAgICAgICAgICAgLy8gZGlyZWN0aW9uIHRvIHJlLWNlbnRlciB0aGVtIGJ1dCBjbGlwIG9mZiB0aGUgZW5kIGVkZ2UuIEluIFJUTCBsYW5ndWFnZXMgd2UgbmVlZCB0byBmbGlwIHRoZQogICAgICAgICAgICAvLyB0aWNrcyAxODAgZGVncmVlcyBzbyB3ZSdyZSByZWFsbHkgY3V0dGluZyBvZmYgdGhlIGVuZCBlZGdlIGFiZCBub3QgdGhlIHN0YXJ0LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzaWduID0gIXRoaXMudmVydGljYWwgJiYgdGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgPyAnLScgOiAnJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcm90YXRlID0gIXRoaXMudmVydGljYWwgJiYgdGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgPyAnIHJvdGF0ZSgxODBkZWcpJyA6ICcnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdHlsZXMgPSB7CiAgICAgICAgICAgICAgICAnYmFja2dyb3VuZFNpemUnOiBiYWNrZ3JvdW5kU2l6ZSwKICAgICAgICAgICAgICAgIC8vIFdpdGhvdXQgdHJhbnNsYXRlWiB0aWNrcyBzb21ldGltZXMgaml0dGVyIGFzIHRoZSBzbGlkZXIgbW92ZXMgb24gQ2hyb21lICYgRmlyZWZveC4KICAgICAgICAgICAgICAgICd0cmFuc2Zvcm0nOiBgdHJhbnNsYXRlWigwKSB0cmFuc2xhdGUke2F4aXN9KCR7c2lnbn0ke3RpY2tTaXplIC8gMn0lKSR7cm90YXRlfWAKICAgICAgICAgICAgfTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzTWluVmFsdWUgJiYgdGhpcy5fdGh1bWJHYXApIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBzaWRlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMudmVydGljYWwpIHsKICAgICAgICAgICAgICAgICAgICBzaWRlID0gdGhpcy5faW52ZXJ0QXhpcyA/ICdCb3R0b20nIDogJ1RvcCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBzaWRlID0gdGhpcy5faW52ZXJ0QXhpcyA/ICdSaWdodCcgOiAnTGVmdCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHlsZXNbYHBhZGRpbmcke3NpZGV9YF0gPSBgJHt0aGlzLl90aHVtYkdhcH1weGA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHN0eWxlczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgX3RodW1iQ29udGFpbmVyU3R5bGVzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBheGlzID0gdGhpcy52ZXJ0aWNhbCA/ICdZJyA6ICdYJzsKICAgICAgICAgICAgLy8gRm9yIGEgaG9yaXpvbnRhbCBzbGlkZXIgaW4gUlRMIGxhbmd1YWdlcyB3ZSBwdXNoIHRoZSB0aHVtYiBjb250YWluZXIgb2ZmIHRoZSBsZWZ0IGVkZ2UKICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiB0aGUgcmlnaHQgZWRnZSB0byBhdm9pZCBjYXVzaW5nIGEgaG9yaXpvbnRhbCBzY3JvbGxiYXIgdG8gYXBwZWFyLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBpbnZlcnRPZmZzZXQgPSAodGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgJiYgIXRoaXMudmVydGljYWwpID8gIXRoaXMuX2ludmVydEF4aXMgOiB0aGlzLl9pbnZlcnRBeGlzOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvZmZzZXQgPSAoaW52ZXJ0T2Zmc2V0ID8gdGhpcy5wZXJjZW50IDogMSAtIHRoaXMucGVyY2VudCkgKiAxMDA7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAndHJhbnNmb3JtJzogYHRyYW5zbGF0ZSR7YXhpc30oLSR7b2Zmc2V0fSUpYAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG1vdXNlIGV2ZW50cyBzaG91bGQgYmUgY29udmVydGVkIHRvIGEgc2xpZGVyIHBvc2l0aW9uIGJ5IGNhbGN1bGF0aW5nIHRoZWlyIGRpc3RhbmNlCiAgICAgICAgICogZnJvbSB0aGUgcmlnaHQgb3IgYm90dG9tIGVkZ2Ugb2YgdGhlIHNsaWRlciBhcyBvcHBvc2VkIHRvIHRoZSB0b3Agb3IgbGVmdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zaG91bGRJbnZlcnRNb3VzZUNvb3JkcygpIHsKICAgICAgICAgICAgcmV0dXJuICh0aGlzLl9nZXREaXJlY3Rpb24oKSA9PSAncnRsJyAmJiAhdGhpcy52ZXJ0aWNhbCkgPyAhdGhpcy5faW52ZXJ0QXhpcyA6IHRoaXMuX2ludmVydEF4aXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBsYW5ndWFnZSBkaXJlY3Rpb24gZm9yIHRoaXMgc2xpZGVyIGVsZW1lbnQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXREaXJlY3Rpb24oKSB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5fZGlyICYmIHRoaXMuX2Rpci52YWx1ZSA9PSAncnRsJykgPyAncnRsJyA6ICdsdHInOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IKICAgICAgICAgICAgICAgIC5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRydWUpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvcmlnaW4pID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2lzQWN0aXZlID0gISFvcmlnaW4gJiYgb3JpZ2luICE9PSAna2V5Ym9hcmQnOwogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmICh0aGlzLl9kaXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2RpckNoYW5nZVN1YnNjcmlwdGlvbiA9IHRoaXMuX2Rpci5jaGFuZ2Uuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5fcG9pbnRlckRvd24sIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgIGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX3BvaW50ZXJEb3duLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICB0aGlzLl9sYXN0UG9pbnRlckV2ZW50ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fcmVtb3ZlR2xvYmFsRXZlbnRzKCk7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5fZGlyQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uTW91c2VlbnRlcigpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBzYXZlIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBzbGlkZXIgaGVyZSBzbyB3ZSBjYW4gdXNlIHRoZW0gdG8gdXBkYXRlIHRoZSBzcGFjaW5nIG9mIHRoZQogICAgICAgICAgICAvLyB0aWNrcyBhbmQgZGV0ZXJtaW5lIHdoZXJlIG9uIHRoZSBzbGlkZXIgY2xpY2sgYW5kIHNsaWRlIGV2ZW50cyBoYXBwZW4uCiAgICAgICAgICAgIHRoaXMuX3NsaWRlckRpbWVuc2lvbnMgPSB0aGlzLl9nZXRTbGlkZXJEaW1lbnNpb25zKCk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRpY2tJbnRlcnZhbFBlcmNlbnQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25Gb2N1cygpIHsKICAgICAgICAgICAgLy8gV2Ugc2F2ZSB0aGUgZGltZW5zaW9ucyBvZiB0aGUgc2xpZGVyIGhlcmUgc28gd2UgY2FuIHVzZSB0aGVtIHRvIHVwZGF0ZSB0aGUgc3BhY2luZyBvZiB0aGUKICAgICAgICAgICAgLy8gdGlja3MgYW5kIGRldGVybWluZSB3aGVyZSBvbiB0aGUgc2xpZGVyIGNsaWNrIGFuZCBzbGlkZSBldmVudHMgaGFwcGVuLgogICAgICAgICAgICB0aGlzLl9zbGlkZXJEaW1lbnNpb25zID0gdGhpcy5fZ2V0U2xpZGVyRGltZW5zaW9ucygpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVUaWNrSW50ZXJ2YWxQZXJjZW50KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uQmx1cigpIHsKICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uS2V5ZG93bihldmVudCkgewogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCBoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKICAgICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFBBR0VfVVA6CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5jcmVtZW50KDEwKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgUEFHRV9ET1dOOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudCgtMTApOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBFTkQ6CiAgICAgICAgICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMubWF4OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBIT01FOgogICAgICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1pbjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9BUlJPVzoKICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBGb3IgYSBzaWdodGVkIHVzZXIgaXQgd291bGQgbWFrZSBtb3JlIHNlbnNlIHRoYXQgd2hlbiB0aGV5IHByZXNzIGFuIGFycm93IGtleSBvbiBhbgogICAgICAgICAgICAgICAgICAgIC8vIGludmVydGVkIHNsaWRlciB0aGUgdGh1bWIgbW92ZXMgaW4gdGhhdCBkaXJlY3Rpb24uIEhvd2V2ZXIgZm9yIGEgYmxpbmQgdXNlciwgbm90aGluZwogICAgICAgICAgICAgICAgICAgIC8vIGFib3V0IHRoZSBzbGlkZXIgaW5kaWNhdGVzIHRoYXQgaXQgaXMgaW52ZXJ0ZWQuIFRoZXkgd2lsbCBleHBlY3QgbGVmdCB0byBiZSBkZWNyZW1lbnQsCiAgICAgICAgICAgICAgICAgICAgLy8gcmVnYXJkbGVzcyBvZiBob3cgaXQgYXBwZWFycyBvbiB0aGUgc2NyZWVuLiBGb3Igc3BlYWtlcnMgb2ZSVEwgbGFuZ3VhZ2VzLCB0aGV5IHByb2JhYmx5CiAgICAgICAgICAgICAgICAgICAgLy8gZXhwZWN0IGxlZnQgdG8gbWVhbiBpbmNyZW1lbnQuIFRoZXJlZm9yZSB3ZSBmbGlwIHRoZSBtZWFuaW5nIG9mIHRoZSBzaWRlIGFycm93IGtleXMgZm9yCiAgICAgICAgICAgICAgICAgICAgLy8gUlRMLiBGb3IgaW52ZXJ0ZWQgc2xpZGVycyB3ZSBwcmVmZXIgYSBnb29kIGExMXkgZXhwZXJpZW5jZSB0byBoYXZpbmcgaXQgImxvb2sgcmlnaHQiIGZvcgogICAgICAgICAgICAgICAgICAgIC8vIHNpZ2h0ZWQgdXNlcnMsIHRoZXJlZm9yZSB3ZSBkbyBub3Qgc3dhcCB0aGUgbWVhbmluZy4KICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnQodGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgPyAxIDogLTEpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBVUF9BUlJPVzoKICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnQoMSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFJJR0hUX0FSUk9XOgogICAgICAgICAgICAgICAgICAgIC8vIFNlZSBjb21tZW50IG9uIExFRlRfQVJST1cgYWJvdXQgdGhlIGNvbmRpdGlvbnMgdW5kZXIgd2hpY2ggd2UgZmxpcCB0aGUgbWVhbmluZy4KICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbmNyZW1lbnQodGhpcy5fZ2V0RGlyZWN0aW9uKCkgPT0gJ3J0bCcgPyAtMSA6IDEpOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBET1dOX0FSUk9XOgogICAgICAgICAgICAgICAgICAgIHRoaXMuX2luY3JlbWVudCgtMSk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIC8vIFJldHVybiBpZiB0aGUga2V5IGlzIG5vdCBvbmUgdGhhdCB3ZSBleHBsaWNpdGx5IGhhbmRsZSB0byBhdm9pZCBjYWxsaW5nIHByZXZlbnREZWZhdWx0IG9uCiAgICAgICAgICAgICAgICAgICAgLy8gaXQuCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvbGRWYWx1ZSAhPSB0aGlzLnZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0SW5wdXRFdmVudCgpOwogICAgICAgICAgICAgICAgdGhpcy5fZW1pdENoYW5nZUV2ZW50KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gdHJ1ZTsKICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25LZXl1cCgpIHsKICAgICAgICAgICAgdGhpcy5faXNTbGlkaW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVzZSBkZWZhdWx0VmlldyBvZiBpbmplY3RlZCBkb2N1bWVudCBpZiBhdmFpbGFibGUgb3IgZmFsbGJhY2sgdG8gZ2xvYmFsIHdpbmRvdyByZWZlcmVuY2UKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFdpbmRvdygpIHsKICAgICAgICAgICAgdmFyIF9hOwogICAgICAgICAgICByZXR1cm4gKChfYSA9IHRoaXMuX2RvY3VtZW50KSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuZGVmYXVsdFZpZXcpIHx8IHdpbmRvdzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQmluZHMgb3VyIGdsb2JhbCBtb3ZlIGFuZCBlbmQgZXZlbnRzLiBUaGV5J3JlIGJvdW5kIGF0IHRoZSBkb2N1bWVudCBsZXZlbCBhbmQgb25seSB3aGlsZQogICAgICAgICAqIGRyYWdnaW5nIHNvIHRoYXQgdGhlIHVzZXIgZG9lc24ndCBoYXZlIHRvIGtlZXAgdGhlaXIgcG9pbnRlciBleGFjdGx5IG92ZXIgdGhlIHNsaWRlcgogICAgICAgICAqIGFzIHRoZXkncmUgc3dpcGluZyBhY3Jvc3MgdGhlIHNjcmVlbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdHJpZ2dlckV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYmluZEdsb2JhbEV2ZW50cyh0cmlnZ2VyRXZlbnQpIHsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGJpbmQgdGhlIGV2ZW50cyB0byB0aGUgYGRvY3VtZW50YCwgYmVjYXVzZSBpdCBhbGxvd3MgdXMgdG8gY2FwdHVyZQogICAgICAgICAgICAvLyBkcmFnIGNhbmNlbCBldmVudHMgd2hlcmUgdGhlIHVzZXIncyBwb2ludGVyIGlzIG91dHNpZGUgdGhlIGJyb3dzZXIgd2luZG93LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50ID0gdGhpcy5fZG9jdW1lbnQ7CiAgICAgICAgICAgIGlmICh0eXBlb2YgZG9jdW1lbnQgIT09ICd1bmRlZmluZWQnICYmIGRvY3VtZW50KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc1RvdWNoID0gaXNUb3VjaEV2ZW50KHRyaWdnZXJFdmVudCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtb3ZlRXZlbnROYW1lID0gaXNUb3VjaCA/ICd0b3VjaG1vdmUnIDogJ21vdXNlbW92ZSc7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmRFdmVudE5hbWUgPSBpc1RvdWNoID8gJ3RvdWNoZW5kJyA6ICdtb3VzZXVwJzsKICAgICAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIobW92ZUV2ZW50TmFtZSwgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKGVuZEV2ZW50TmFtZSwgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICAgICAgaWYgKGlzVG91Y2gpIHsKICAgICAgICAgICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCd0b3VjaGNhbmNlbCcsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcgJiYgd2luZG93KSB7CiAgICAgICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX3dpbmRvd0JsdXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbW92ZXMgYW55IGdsb2JhbCBldmVudCBsaXN0ZW5lcnMgdGhhdCB3ZSBtYXkgaGF2ZSBhZGRlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3JlbW92ZUdsb2JhbEV2ZW50cygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkb2N1bWVudCA9IHRoaXMuX2RvY3VtZW50OwogICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ICE9PSAndW5kZWZpbmVkJyAmJiBkb2N1bWVudCkgewogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2htb3ZlJywgdGhpcy5fcG9pbnRlck1vdmUsIGFjdGl2ZUV2ZW50T3B0aW9ucyk7CiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMuX3BvaW50ZXJVcCwgYWN0aXZlRXZlbnRPcHRpb25zKTsKICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoY2FuY2VsJywgdGhpcy5fcG9pbnRlclVwLCBhY3RpdmVFdmVudE9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdGhpcy5fZ2V0V2luZG93KCk7CiAgICAgICAgICAgIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyAmJiB3aW5kb3cpIHsKICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdibHVyJywgdGhpcy5fd2luZG93Qmx1cik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW5jcmVtZW50cyB0aGUgc2xpZGVyIGJ5IHRoZSBnaXZlbiBudW1iZXIgb2Ygc3RlcHMgKG5lZ2F0aXZlIG51bWJlciBkZWNyZW1lbnRzKS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gbnVtU3RlcHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pbmNyZW1lbnQobnVtU3RlcHMpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHRoaXMuX2NsYW1wKCh0aGlzLnZhbHVlIHx8IDApICsgdGhpcy5zdGVwICogbnVtU3RlcHMsIHRoaXMubWluLCB0aGlzLm1heCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGN1bGF0ZSB0aGUgbmV3IHZhbHVlIGZyb20gdGhlIG5ldyBwaHlzaWNhbCBsb2NhdGlvbi4gVGhlIHZhbHVlIHdpbGwgYWx3YXlzIGJlIHNuYXBwZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBvcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVZhbHVlRnJvbVBvc2l0aW9uKHBvcykgewogICAgICAgICAgICBpZiAoIXRoaXMuX3NsaWRlckRpbWVuc2lvbnMpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBvZmZzZXQgPSB0aGlzLnZlcnRpY2FsID8gdGhpcy5fc2xpZGVyRGltZW5zaW9ucy50b3AgOiB0aGlzLl9zbGlkZXJEaW1lbnNpb25zLmxlZnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNpemUgPSB0aGlzLnZlcnRpY2FsID8gdGhpcy5fc2xpZGVyRGltZW5zaW9ucy5oZWlnaHQgOiB0aGlzLl9zbGlkZXJEaW1lbnNpb25zLndpZHRoOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBwb3NDb21wb25lbnQgPSB0aGlzLnZlcnRpY2FsID8gcG9zLnkgOiBwb3MueDsKICAgICAgICAgICAgLy8gVGhlIGV4YWN0IHZhbHVlIGlzIGNhbGN1bGF0ZWQgZnJvbSB0aGUgZXZlbnQgYW5kIHVzZWQgdG8gZmluZCB0aGUgY2xvc2VzdCBzbmFwIHZhbHVlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBwZXJjZW50ID0gdGhpcy5fY2xhbXAoKHBvc0NvbXBvbmVudCAtIG9mZnNldCkgLyBzaXplKTsKICAgICAgICAgICAgaWYgKHRoaXMuX3Nob3VsZEludmVydE1vdXNlQ29vcmRzKCkpIHsKICAgICAgICAgICAgICAgIHBlcmNlbnQgPSAxIC0gcGVyY2VudDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTaW5jZSB0aGUgc3RlcHMgbWF5IG5vdCBkaXZpZGUgY2xlYW5seSBpbnRvIHRoZSBtYXggdmFsdWUsIGlmIHRoZSB1c2VyCiAgICAgICAgICAgIC8vIHNsaWQgdG8gMCBvciAxMDAgcGVyY2VudCwgd2UganVtcCB0byB0aGUgbWluL21heCB2YWx1ZS4gVGhpcyBhcHByb2FjaAogICAgICAgICAgICAvLyBpcyBzbGlnaHRseSBtb3JlIGludHVpdGl2ZSB0aGFuIHVzaW5nIGBNYXRoLmNlaWxgIGJlbG93LCBiZWNhdXNlIGl0CiAgICAgICAgICAgIC8vIGZvbGxvd3MgdGhlIHVzZXIncyBwb2ludGVyIGNsb3Nlci4KICAgICAgICAgICAgaWYgKHBlcmNlbnQgPT09IDApIHsKICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLm1pbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwZXJjZW50ID09PSAxKSB7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlID0gdGhpcy5tYXg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBleGFjdFZhbHVlID0gdGhpcy5fY2FsY3VsYXRlVmFsdWUocGVyY2VudCk7CiAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbGN1bGF0aW9uIGZpbmRzIHRoZSBjbG9zZXN0IHN0ZXAgYnkgZmluZGluZyB0aGUgY2xvc2VzdAogICAgICAgICAgICAgICAgLy8gd2hvbGUgbnVtYmVyIGRpdmlzaWJsZSBieSB0aGUgc3RlcCByZWxhdGl2ZSB0byB0aGUgbWluLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2xvc2VzdFZhbHVlID0gTWF0aC5yb3VuZCgoZXhhY3RWYWx1ZSAtIHRoaXMubWluKSAvIHRoaXMuc3RlcCkgKiB0aGlzLnN0ZXAgKyB0aGlzLm1pbjsKICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBuZWVkcyB0byBzbmFwIHRvIHRoZSBtaW4gYW5kIG1heC4KICAgICAgICAgICAgICAgIHRoaXMudmFsdWUgPSB0aGlzLl9jbGFtcChjbG9zZXN0VmFsdWUsIHRoaXMubWluLCB0aGlzLm1heCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgYSBjaGFuZ2UgZXZlbnQgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgZGlmZmVyZW50IGZyb20gdGhlIGxhc3QgZW1pdHRlZCB2YWx1ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2VtaXRDaGFuZ2VFdmVudCgpIHsKICAgICAgICAgICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbih0aGlzLnZhbHVlKTsKICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZS5lbWl0KHRoaXMudmFsdWUpOwogICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyBhbiBpbnB1dCBldmVudCB3aGVuIHRoZSBjdXJyZW50IHZhbHVlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBsYXN0IGVtaXR0ZWQgdmFsdWUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9lbWl0SW5wdXRFdmVudCgpIHsKICAgICAgICAgICAgdGhpcy5pbnB1dC5lbWl0KHRoaXMuX2NyZWF0ZUNoYW5nZUV2ZW50KCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBhbW91bnQgb2Ygc3BhY2UgYmV0d2VlbiB0aWNrcyBhcyBhIHBlcmNlbnRhZ2Ugb2YgdGhlIHdpZHRoIG9mIHRoZSBzbGlkZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVUaWNrSW50ZXJ2YWxQZXJjZW50KCkgewogICAgICAgICAgICBpZiAoIXRoaXMudGlja0ludGVydmFsIHx8ICF0aGlzLl9zbGlkZXJEaW1lbnNpb25zKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMudGlja0ludGVydmFsID09ICdhdXRvJykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHRyYWNrU2l6ZSA9IHRoaXMudmVydGljYWwgPyB0aGlzLl9zbGlkZXJEaW1lbnNpb25zLmhlaWdodCA6IHRoaXMuX3NsaWRlckRpbWVuc2lvbnMud2lkdGg7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzUGVyU3RlcCA9IHRyYWNrU2l6ZSAqIHRoaXMuc3RlcCAvICh0aGlzLm1heCAtIHRoaXMubWluKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBzdGVwc1BlclRpY2sgPSBNYXRoLmNlaWwoTUlOX0FVVE9fVElDS19TRVBBUkFUSU9OIC8gcGl4ZWxzUGVyU3RlcCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcGl4ZWxzUGVyVGljayA9IHN0ZXBzUGVyVGljayAqIHRoaXMuc3RlcDsKICAgICAgICAgICAgICAgIHRoaXMuX3RpY2tJbnRlcnZhbFBlcmNlbnQgPSBwaXhlbHNQZXJUaWNrIC8gdHJhY2tTaXplOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdGlja0ludGVydmFsUGVyY2VudCA9IHRoaXMudGlja0ludGVydmFsICogdGhpcy5zdGVwIC8gKHRoaXMubWF4IC0gdGhpcy5taW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBzbGlkZXIgY2hhbmdlIG9iamVjdCBmcm9tIHRoZSBzcGVjaWZpZWQgdmFsdWUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez89fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZUNoYW5nZUV2ZW50KHZhbHVlID0gdGhpcy52YWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBldmVudCA9IG5ldyBNYXRTbGlkZXJDaGFuZ2UoKTsKICAgICAgICAgICAgZXZlbnQuc291cmNlID0gdGhpczsKICAgICAgICAgICAgZXZlbnQudmFsdWUgPSB2YWx1ZTsKICAgICAgICAgICAgcmV0dXJuIGV2ZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxjdWxhdGVzIHRoZSBwZXJjZW50YWdlIG9mIHRoZSBzbGlkZXIgdGhhdCBhIHZhbHVlIGlzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NhbGN1bGF0ZVBlcmNlbnRhZ2UodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuICgodmFsdWUgfHwgMCkgLSB0aGlzLm1pbikgLyAodGhpcy5tYXggLSB0aGlzLm1pbik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENhbGN1bGF0ZXMgdGhlIHZhbHVlIGEgcGVyY2VudGFnZSBvZiB0aGUgc2xpZGVyIGNvcnJlc3BvbmRzIHRvLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwZXJjZW50YWdlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2FsY3VsYXRlVmFsdWUocGVyY2VudGFnZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5taW4gKyBwZXJjZW50YWdlICogKHRoaXMubWF4IC0gdGhpcy5taW4pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm4gYSBudW1iZXIgYmV0d2VlbiB0d28gbnVtYmVycy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez89fSBtaW4KICAgICAgICAgKiBAcGFyYW0gez89fSBtYXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jbGFtcCh2YWx1ZSwgbWluID0gMCwgbWF4ID0gMSkgewogICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgobWluLCBNYXRoLm1pbih2YWx1ZSwgbWF4KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCB0aGUgYm91bmRpbmcgY2xpZW50IHJlY3Qgb2YgdGhlIHNsaWRlciB0cmFjayBlbGVtZW50LgogICAgICAgICAqIFRoZSB0cmFjayBpcyB1c2VkIHJhdGhlciB0aGFuIHRoZSBuYXRpdmUgZWxlbWVudCB0byBpZ25vcmUgdGhlIGV4dHJhIHNwYWNlIHRoYXQgdGhlIHRodW1iIGNhbgogICAgICAgICAqIHRha2UgdXAuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRTbGlkZXJEaW1lbnNpb25zKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fc2xpZGVyV3JhcHBlciA/IHRoaXMuX3NsaWRlcldyYXBwZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSA6IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgdGhlIG5hdGl2ZSBlbGVtZW50LgogICAgICAgICAqIEN1cnJlbnRseSBvbmx5IHVzZWQgdG8gYWxsb3cgYSBibHVyIGV2ZW50IHRvIGZpcmUgYnV0IHdpbGwgYmUgdXNlZCB3aXRoIGtleWJvYXJkIGlucHV0IGxhdGVyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2ZvY3VzSG9zdEVsZW1lbnQob3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEJsdXJzIHRoZSBuYXRpdmUgZWxlbWVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2JsdXJIb3N0RWxlbWVudCgpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmJsdXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUnVucyBhIGNhbGxiYWNrIGluc2lkZSBvZiB0aGUgTmdab25lLCBpZiBwb3NzaWJsZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ydW5JbnNpZGVab25lKGZuKSB7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgUmVtb3ZlIHRoaXMgZnVuY3Rpb24gb25jZSBgX25nWm9uZWAgaXMgYSByZXF1aXJlZCBwYXJhbWV0ZXIuCiAgICAgICAgICAgIHRoaXMuX25nWm9uZSA/IHRoaXMuX25nWm9uZS5ydW4oZm4pIDogZm4oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUnVucyBhIGNhbGxiYWNrIG91dHNpZGUgb2YgdGhlIE5nWm9uZSwgaWYgcG9zc2libGUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcnVuT3V0c2l6ZVpvbmUoZm4pIHsKICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA5LjAuMCBSZW1vdmUgdGhpcyBmdW5jdGlvbiBvbmNlIGBfbmdab25lYCBpcyBhIHJlcXVpcmVkIHBhcmFtZXRlci4KICAgICAgICAgICAgdGhpcy5fbmdab25lID8gdGhpcy5fbmdab25lLnJ1bk91dHNpZGVBbmd1bGFyKGZuKSA6IGZuKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIG1vZGVsIHZhbHVlLiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHdyaXRlVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlcnMgYSBjYWxsYmFjayB0byBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgdmFsdWUgaGFzIGNoYW5nZWQuCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAgKiBAcGFyYW0gez99IGZuIENhbGxiYWNrIHRvIGJlIHJlZ2lzdGVyZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gYmUgdHJpZ2dlcmVkIHdoZW4gdGhlIGNvbXBvbmVudCBpcyB0b3VjaGVkLgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSBmbiBDYWxsYmFjayB0byBiZSByZWdpc3RlcmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICAgICAgdGhpcy5vblRvdWNoZWQgPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBjb21wb25lbnQgc2hvdWxkIGJlIGRpc2FibGVkLgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CiAgICAgICAgfQogICAgfQogICAgTWF0U2xpZGVyLsm1ZmFjID0gZnVuY3Rpb24gTWF0U2xpZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNsaWRlcikoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVpbmplY3RBdHRyaWJ1dGUoJ3RhYmluZGV4JyksIMm1ybVkaXJlY3RpdmVJbmplY3QoQU5JTUFUSU9OX01PRFVMRV9UWVBFLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEsIDgpKTsgfTsKICAgIE1hdFNsaWRlci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRTbGlkZXIsIHNlbGVjdG9yczogW1sibWF0LXNsaWRlciJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRTbGlkZXJfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2MwJGMsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3NsaWRlcldyYXBwZXIgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsicm9sZSIsICJzbGlkZXIiLCAxLCAibWF0LXNsaWRlciIsICJtYXQtZm9jdXMtaW5kaWNhdG9yIl0sIGhvc3RWYXJzOiAyOCwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRTbGlkZXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImZvY3VzIiwgZnVuY3Rpb24gTWF0U2xpZGVyX2ZvY3VzX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25Gb2N1cygpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIE1hdFNsaWRlcl9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25CbHVyKCk7IH0pKCJrZXlkb3duIiwgZnVuY3Rpb24gTWF0U2xpZGVyX2tleWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbktleWRvd24oJGV2ZW50KTsgfSkoImtleXVwIiwgZnVuY3Rpb24gTWF0U2xpZGVyX2tleXVwX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25LZXl1cCgpOyB9KSgibW91c2VlbnRlciIsIGZ1bmN0aW9uIE1hdFNsaWRlcl9tb3VzZWVudGVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fb25Nb3VzZWVudGVyKCk7IH0pKCJzZWxlY3RzdGFydCIsIGZ1bmN0aW9uIE1hdFNsaWRlcl9zZWxlY3RzdGFydF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiAkZXZlbnQucHJldmVudERlZmF1bHQoKTsgfSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVob3N0UHJvcGVydHkoInRhYkluZGV4IiwgY3R4LnRhYkluZGV4KTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCkoImFyaWEtdmFsdWVtYXgiLCBjdHgubWF4KSgiYXJpYS12YWx1ZW1pbiIsIGN0eC5taW4pKCJhcmlhLXZhbHVlbm93IiwgY3R4LnZhbHVlKSgiYXJpYS1vcmllbnRhdGlvbiIsIGN0eC52ZXJ0aWNhbCA/ICJ2ZXJ0aWNhbCIgOiAiaG9yaXpvbnRhbCIpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtc2xpZGVyLWRpc2FibGVkIiwgY3R4LmRpc2FibGVkKSgibWF0LXNsaWRlci1oYXMtdGlja3MiLCBjdHgudGlja0ludGVydmFsKSgibWF0LXNsaWRlci1ob3Jpem9udGFsIiwgIWN0eC52ZXJ0aWNhbCkoIm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCIsIGN0eC5faW52ZXJ0QXhpcykoIm1hdC1zbGlkZXItaW52ZXJ0LW1vdXNlLWNvb3JkcyIsIGN0eC5fc2hvdWxkSW52ZXJ0TW91c2VDb29yZHMoKSkoIm1hdC1zbGlkZXItc2xpZGluZyIsIGN0eC5faXNTbGlkaW5nKSgibWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIiwgY3R4LnRodW1iTGFiZWwpKCJtYXQtc2xpZGVyLXZlcnRpY2FsIiwgY3R4LnZlcnRpY2FsKSgibWF0LXNsaWRlci1taW4tdmFsdWUiLCBjdHguX2lzTWluVmFsdWUpKCJtYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrIiwgY3R4LmRpc2FibGVkIHx8IGN0eC5faXNNaW5WYWx1ZSAmJiBjdHguX3RodW1iR2FwICYmIGN0eC5faW52ZXJ0QXhpcykoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9hbmltYXRpb25Nb2RlID09PSAiTm9vcEFuaW1hdGlvbnMiKTsKICAgICAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgY29sb3I6ICJjb2xvciIsIHRhYkluZGV4OiAidGFiSW5kZXgiLCBpbnZlcnQ6ICJpbnZlcnQiLCBtYXg6ICJtYXgiLCBtaW46ICJtaW4iLCB2YWx1ZTogInZhbHVlIiwgc3RlcDogInN0ZXAiLCB0aHVtYkxhYmVsOiAidGh1bWJMYWJlbCIsIHRpY2tJbnRlcnZhbDogInRpY2tJbnRlcnZhbCIsIHZlcnRpY2FsOiAidmVydGljYWwiLCBkaXNwbGF5V2l0aDogImRpc3BsYXlXaXRoIiB9LCBvdXRwdXRzOiB7IGNoYW5nZTogImNoYW5nZSIsIGlucHV0OiAiaW5wdXQiLCB2YWx1ZUNoYW5nZTogInZhbHVlQ2hhbmdlIiB9LCBleHBvcnRBczogWyJtYXRTbGlkZXIiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbTUFUX1NMSURFUl9WQUxVRV9BQ0NFU1NPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgZGVjbHM6IDEzLCB2YXJzOiA2LCBjb25zdHM6IFtbMSwgIm1hdC1zbGlkZXItd3JhcHBlciJdLCBbInNsaWRlcldyYXBwZXIiLCAiIl0sIFsxLCAibWF0LXNsaWRlci10cmFjay13cmFwcGVyIl0sIFsxLCAibWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kIiwgMywgIm5nU3R5bGUiXSwgWzEsICJtYXQtc2xpZGVyLXRyYWNrLWZpbGwiLCAzLCAibmdTdHlsZSJdLCBbMSwgIm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVyIiwgMywgIm5nU3R5bGUiXSwgWzEsICJtYXQtc2xpZGVyLXRpY2tzIiwgMywgIm5nU3R5bGUiXSwgWzEsICJtYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciIsIDMsICJuZ1N0eWxlIl0sIFsxLCAibWF0LXNsaWRlci1mb2N1cy1yaW5nIl0sIFsxLCAibWF0LXNsaWRlci10aHVtYiJdLCBbMSwgIm1hdC1zbGlkZXItdGh1bWItbGFiZWwiXSwgWzEsICJtYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRTbGlkZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMywgImRpdiIsIDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg0LCAiZGl2IiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg2LCAiZGl2IiwgNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIsIDcpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg4LCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDksICJkaXYiLCA5KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMCwgImRpdiIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMSwgInNwYW4iLCAxMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDEyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIGN0eC5fdHJhY2tCYWNrZ3JvdW5kU3R5bGVzKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIGN0eC5fdHJhY2tGaWxsU3R5bGVzKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIGN0eC5fdGlja3NDb250YWluZXJTdHlsZXMpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N0eWxlIiwgY3R4Ll90aWNrc1N0eWxlcyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3R5bGUiLCBjdHguX3RodW1iQ29udGFpbmVyU3R5bGVzKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4LmRpc3BsYXlWYWx1ZSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdTdHlsZV0sIHN0eWxlczogWyIubWF0LXNsaWRlcntkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjpyZWxhdGl2ZTtib3gtc2l6aW5nOmJvcmRlci1ib3g7cGFkZGluZzo4cHg7b3V0bGluZTpub25lO3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpOmFjdGl2ZSwubWF0LXNsaWRlci5tYXQtc2xpZGVyLXNsaWRpbmc6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKXtjdXJzb3I6LXdlYmtpdC1ncmFiYmluZztjdXJzb3I6Z3JhYmJpbmd9Lm1hdC1zbGlkZXItd3JhcHBlcntwb3NpdGlvbjphYnNvbHV0ZX0ubWF0LXNsaWRlci10cmFjay13cmFwcGVye3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2xlZnQ6MDtvdmVyZmxvdzpoaWRkZW59Lm1hdC1zbGlkZXItdHJhY2stZmlsbHtwb3NpdGlvbjphYnNvbHV0ZTt0cmFuc2Zvcm0tb3JpZ2luOjAgMDt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7cG9zaXRpb246YWJzb2x1dGU7bGVmdDowO3RvcDowO292ZXJmbG93OmhpZGRlbn0ubWF0LXNsaWRlci10aWNrc3tiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQ7YmFja2dyb3VuZC1jbGlwOmNvbnRlbnQtYm94O2JveC1zaXppbmc6Ym9yZGVyLWJveDtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ3twb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDozMHB4O2hlaWdodDozMHB4O2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zZm9ybTpzY2FsZSgwKTtvcGFjaXR5OjA7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSksYmFja2dyb3VuZC1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmcsLm1hdC1zbGlkZXIuY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne3RyYW5zZm9ybTpzY2FsZSgxKTtvcGFjaXR5OjF9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTpub3QoLm1hdC1zbGlkZXItc2xpZGluZykgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKTpub3QoLm1hdC1zbGlkZXItc2xpZGluZykgLm1hdC1zbGlkZXItdGh1bWJ7Y3Vyc29yOi13ZWJraXQtZ3JhYjtjdXJzb3I6Z3JhYn0ubWF0LXNsaWRlci10aHVtYntwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDotMTBweDtib3R0b206LTEwcHg7Ym94LXNpemluZzpib3JkZXItYm94O3dpZHRoOjIwcHg7aGVpZ2h0OjIwcHg7Ym9yZGVyOjNweCBzb2xpZCB0cmFuc3BhcmVudDtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2Zvcm06c2NhbGUoMC43KTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxiYWNrZ3JvdW5kLWNvbG9yIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJvcmRlci1jb2xvciA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5Om5vbmU7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpjZW50ZXI7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKSxib3JkZXItcmFkaXVzIDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpLGJhY2tncm91bmQtY29sb3IgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtvdXRsaW5lOnNvbGlkIDFweH0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3otaW5kZXg6MTtvcGFjaXR5OjA7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpfS5tYXQtc2xpZGVyLXNsaWRpbmcgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci1zbGlkaW5nIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmQsLm1hdC1zbGlkZXItc2xpZGluZyAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbi1kdXJhdGlvbjowbXN9Lm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2NvbnRlbnQ6XCJcIjtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItd2lkdGg6MDtib3JkZXItc3R5bGU6c29saWQ7b3BhY2l0eTowO3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKX0ubWF0LXNsaWRlci1oYXMtdGlja3MuY2RrLWZvY3VzZWQ6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlciwubWF0LXNsaWRlci1oYXMtdGlja3M6aG92ZXI6bm90KC5tYXQtc2xpZGVyLWhpZGUtbGFzdC10aWNrKSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntvcGFjaXR5OjF9Lm1hdC1zbGlkZXItaGFzLXRpY2tzLmNkay1mb2N1c2VkOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3MsLm1hdC1zbGlkZXItaGFzLXRpY2tzOmhvdmVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkgLm1hdC1zbGlkZXItdGlja3N7b3BhY2l0eToxfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tkaXNwbGF5Om5vbmV9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtkaXNwbGF5OmZsZXh9Lm1hdC1zbGlkZXItYXhpcy1pbnZlcnRlZCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfS5tYXQtc2xpZGVyLWF4aXMtaW52ZXJ0ZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHt0cmFuc2Zvcm0tb3JpZ2luOjAgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyAubWF0LXNsaWRlci10aHVtYnt0cmFuc2Zvcm06c2NhbGUoMCl9Lm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtib3JkZXItcmFkaXVzOjUwJSA1MCUgMH0ubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7b3BhY2l0eToxfS5tYXQtc2xpZGVyOm5vdCgubWF0LXNsaWRlci1kaXNhYmxlZCkuY2RrLW1vdXNlLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXI6bm90KC5tYXQtc2xpZGVyLWRpc2FibGVkKS5jZGstdG91Y2gtZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlcjpub3QoLm1hdC1zbGlkZXItZGlzYWJsZWQpLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLXdpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGUoMSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0cmFuc2Zvcm06c2NhbGUoMCk7b3BhY2l0eTowfS5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRodW1ie2JvcmRlci13aWR0aDo0cHg7dHJhbnNmb3JtOnNjYWxlKDAuNSl9Lm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7ZGlzcGxheTpub25lfS5tYXQtc2xpZGVyLWhvcml6b250YWx7aGVpZ2h0OjQ4cHg7bWluLXdpZHRoOjEyOHB4fS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItd3JhcHBlcntoZWlnaHQ6MnB4O3RvcDoyM3B4O2xlZnQ6OHB4O3JpZ2h0OjhweH0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye2hlaWdodDoycHg7Ym9yZGVyLWxlZnQtd2lkdGg6MnB4O3JpZ2h0OjA7dG9wOjB9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay13cmFwcGVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7aGVpZ2h0OjJweDt3aWR0aDoxMDAlO3RyYW5zZm9ybTpzY2FsZVgoMCl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoycHg7d2lkdGg6MTAwJTt0cmFuc2Zvcm06c2NhbGVYKDEpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDoycHg7d2lkdGg6MTAwJX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3MtY29udGFpbmVye2hlaWdodDowO291dGxpbmU6c29saWQgMnB4O3RvcDoxcHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aWNrc3toZWlnaHQ6MnB4O3dpZHRoOjEwMCV9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7d2lkdGg6MTAwJTtoZWlnaHQ6MDt0b3A6NTAlfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3t0b3A6LTE1cHg7cmlnaHQ6LTE1cHh9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10aHVtYi1sYWJlbHtyaWdodDotMTRweDt0b3A6LTQwcHg7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoMjZweCkgc2NhbGUoMC4wMSkgcm90YXRlKDQ1ZGVnKX0ubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci1ob3Jpem9udGFsLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZXItaG9yaXpvbnRhbC5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e3RyYW5zZm9ybTpub25lfS5tYXQtc2xpZGVyLXZlcnRpY2Fse3dpZHRoOjQ4cHg7bWluLWhlaWdodDoxMjhweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci13cmFwcGVye3dpZHRoOjJweDt0b3A6OHB4O2JvdHRvbTo4cHg7bGVmdDoyM3B4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3dpZHRoOjJweDtib3JkZXItdG9wLXdpZHRoOjJweDtib3R0b206MDtsZWZ0OjB9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2std3JhcHBlcntoZWlnaHQ6MTAwJTt3aWR0aDoycHh9Lm1hdC1zbGlkZXItdmVydGljYWwgLm1hdC1zbGlkZXItdHJhY2stZmlsbHtoZWlnaHQ6MTAwJTt3aWR0aDoycHg7dHJhbnNmb3JtOnNjYWxlWSgwKX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5ke2hlaWdodDoxMDAlO3dpZHRoOjJweDt0cmFuc2Zvcm06c2NhbGVZKDEpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tzLWNvbnRhaW5lcnt3aWR0aDoycHg7aGVpZ2h0OjEwMCV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aWNrcy1jb250YWluZXJ7d2lkdGg6MDtvdXRsaW5lOnNvbGlkIDJweDtsZWZ0OjFweH0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci1mb2N1cy1yaW5ne2JvdHRvbTotMTVweDtsZWZ0Oi0xNXB4fS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze3dpZHRoOjJweDtoZWlnaHQ6MTAwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYi1jb250YWluZXJ7aGVpZ2h0OjEwMCU7d2lkdGg6MDtsZWZ0OjUwJX0ubWF0LXNsaWRlci12ZXJ0aWNhbCAubWF0LXNsaWRlci10aHVtYnstd2Via2l0LWJhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVuO2JhY2tmYWNlLXZpc2liaWxpdHk6aGlkZGVufS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JvdHRvbTotMTRweDtsZWZ0Oi00MHB4O3RyYW5zZm9ybTp0cmFuc2xhdGVYKDI2cHgpIHNjYWxlKDAuMDEpIHJvdGF0ZSgtNDVkZWcpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9Lm1hdC1zbGlkZXItdmVydGljYWwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7dHJhbnNmb3JtOnJvdGF0ZSgtNDVkZWcpfVtkaXI9cnRsXSAubWF0LXNsaWRlci13cmFwcGVyOjphZnRlcntsZWZ0OjA7cmlnaHQ6YXV0b31bZGlyPXJ0bF0gLm1hdC1zbGlkZXItaG9yaXpvbnRhbCAubWF0LXNsaWRlci10cmFjay1maWxse3RyYW5zZm9ybS1vcmlnaW46MTAwJSAxMDAlfVtkaXI9cnRsXSAubWF0LXNsaWRlci1ob3Jpem9udGFsIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGx7dHJhbnNmb3JtLW9yaWdpbjowIDB9W2Rpcj1ydGxdIC5tYXQtc2xpZGVyLWhvcml6b250YWwubWF0LXNsaWRlci1heGlzLWludmVydGVkIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmR7dHJhbnNmb3JtLW9yaWdpbjoxMDAlIDEwMCV9Lm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRpY2tzLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWNvbnRhaW5lciwubWF0LXNsaWRlci5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlci1mb2N1cy1yaW5nLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLC5tYXQtc2xpZGVyLl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHQsLm1hdC1zbGlkZXIuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZXItaGFzLXRpY2tzIC5tYXQtc2xpZGVyLXdyYXBwZXI6OmFmdGVye3RyYW5zaXRpb246bm9uZX1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFNsaWRlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IEZvY3VzTW9uaXRvciB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBBdHRyaWJ1dGUsIGFyZ3M6IFsndGFiaW5kZXgnLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KICAgIF07CiAgICBNYXRTbGlkZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgaW52ZXJ0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBtYXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1pbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc3RlcDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdGh1bWJMYWJlbDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdGlja0ludGVydmFsOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzcGxheVdpdGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHZlcnRpY2FsOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBpbnB1dDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIHZhbHVlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgX3NsaWRlcldyYXBwZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydzbGlkZXJXcmFwcGVyJyxdIH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYW4gZXZlbnQgaXMgYSB0b3VjaCBldmVudC4KICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGlzVG91Y2hFdmVudChldmVudCkgewogICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBldmVyeSBwaXhlbCB0aGF0IHRoZSB1c2VyIGhhcyBkcmFnZ2VkIHNvIHdlIG5lZWQgaXQgdG8gYmUKICAgICAgICAvLyBhcyBmYXN0IGFzIHBvc3NpYmxlLiBTaW5jZSB3ZSBvbmx5IGJpbmQgbW91c2UgZXZlbnRzIGFuZCB0b3VjaCBldmVudHMsIHdlIGNhbiBhc3N1bWUKICAgICAgICAvLyB0aGF0IGlmIHRoZSBldmVudCdzIG5hbWUgc3RhcnRzIHdpdGggYHRgLCBpdCdzIGEgdG91Y2ggZXZlbnQuCiAgICAgICAgcmV0dXJuIGV2ZW50LnR5cGVbMF0gPT09ICd0JzsKICAgIH0KICAgIC8qKgogICAgICogR2V0cyB0aGUgY29vcmRpbmF0ZXMgb2YgYSB0b3VjaCBvciBtb3VzZSBldmVudCByZWxhdGl2ZSB0byB0aGUgdmlld3BvcnQuCiAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRQb2ludGVyUG9zaXRpb25PblBhZ2UoZXZlbnQpIHsKICAgICAgICAvLyBgdG91Y2hlc2Agd2lsbCBiZSBlbXB0eSBmb3Igc3RhcnQvZW5kIGV2ZW50cyBzbyB3ZSBoYXZlIHRvIGZhbGwgYmFjayB0byBgY2hhbmdlZFRvdWNoZXNgLgogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBwb2ludCA9IGlzVG91Y2hFdmVudChldmVudCkgPyAoZXZlbnQudG91Y2hlc1swXSB8fCBldmVudC5jaGFuZ2VkVG91Y2hlc1swXSkgOiBldmVudDsKICAgICAgICByZXR1cm4geyB4OiBwb2ludC5jbGllbnRYLCB5OiBwb2ludC5jbGllbnRZIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvc2xpZGVyL3NsaWRlci1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0U2xpZGVyTW9kdWxlIHsKICAgIH0KICAgIE1hdFNsaWRlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFNsaWRlck1vZHVsZSB9KTsKICAgIE1hdFNsaWRlck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFNsaWRlck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTbGlkZXJNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBNYXRDb21tb25Nb2R1bGVdLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0U2xpZGVyTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFNsaWRlcl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsIE1hdENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRTbGlkZXIsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV07IH0gfSk7IH0pKCk7CgogICAgY29uc3QgRFRZUEVfRU5VTV9UT19OQU1FID0geyAiMTkiOiAiZmxvYXQxNiIsICIxIjogImZsb2F0MzIiLCAiMiI6ICJmbG9hdDY0IiwgIjMiOiAiaW50MzIiLCAiNCI6ICJ1aW50OCIsICIxNyI6ICJ1aW50MTYiLCAiMjIiOiAidWludDMyIiwgIjIzIjogInVpbnQ2NCIsICI1IjogImludDE2IiwgIjYiOiAiaW50OCIsICI3IjogInN0cmluZyIsICI4IjogImNvbXBsZXg2NCIsICIxOCI6ICJjb21wbGV4MTI4IiwgIjkiOiAiaW50NjQiLCAiMTAiOiAiYm9vbCIsICIxMSI6ICJxaW50OCIsICIxMiI6ICJxdWludDgiLCAiMTUiOiAicWludDE2IiwgIjE2IjogInF1aW50MTYiLCAiMTMiOiAicWludDMyIiwgIjE0IjogImJmbG9hdDE2IiwgIjIwIjogInJlc291cmNlIiwgIjIxIjogInZhcmlhbnQiLCAiMTE5IjogImZsb2F0MTZfcmVmIiwgIjEwMSI6ICJmbG9hdDMyX3JlZiIsICIxMDIiOiAiZmxvYXQ2NF9yZWYiLCAiMTAzIjogImludDMyX3JlZiIsICIxMjIiOiAidWludDMyX3JlZiIsICIxMDQiOiAidWludDhfcmVmIiwgIjExNyI6ICJ1aW50MTZfcmVmIiwgIjEwNSI6ICJpbnQxNl9yZWYiLCAiMTA2IjogImludDhfcmVmIiwgIjEwNyI6ICJzdHJpbmdfcmVmIiwgIjEwOCI6ICJjb21wbGV4NjRfcmVmIiwgIjExOCI6ICJjb21wbGV4MTI4X3JlZiIsICIxMDkiOiAiaW50NjRfcmVmIiwgIjEyMyI6ICJ1aW50NjRfcmVmIiwgIjExMCI6ICJib29sX3JlZiIsICIxMTEiOiAicWludDhfcmVmIiwgIjExMiI6ICJxdWludDhfcmVmIiwgIjExNSI6ICJxaW50MTZfcmVmIiwgIjExNiI6ICJxdWludDE2X3JlZiIsICIxMTMiOiAicWludDMyX3JlZiIsICIxMTQiOiAiYmZsb2F0MTZfcmVmIiwgIjEyMCI6ICJyZXNvdXJjZV9yZWYiLCAiMTIxIjogInZhcmlhbnRfcmVmIiB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vc3RvcmUvZGVidWdfdGVuc29yX3ZhbHVlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUGFyc2UgYSBudW1iZXIgYXJyYXkgdGhhdCByZXByZXNlbnRzIGRlYnVnZ2luZyBzdW1tYXJ5IG9mIGFuIGluc3RydW1lbnRlZAogICAgICogdGVuc29yIHZhbHVlLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gcmF3CiAgICAgKiBAcmV0dXJuIHs/fSBBIERlYnVnVGVuc29yVmFsdWUgb2JqZWN0IHdpdGggdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMKICAgICAqICAgY2FycmllZCBieSBgYXJyYXlgLCBidXQgcmVwcmVzZW50ZWQgaW4gYSBtb3JlIGV4cGxpY2l0IGZhc2hpb24uCiAgICAgKiAgIEZvciBudW1iZXJzIHRoYXQgcmVwcmVzZW50IGJyZWFrZG93biBvZiBudW1lcmljIHZhbHVlcyBieSB0eXBlCiAgICAgKiAgIChlLmcuLCBjb3VudHMgb2YgLWluZiwgK2luZiBhbmQgbmFuKSwgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzCiAgICAgKiAgIGluIHRoZSByZXR1cm5lZCBvYmplY3Qgd2lsbCBiZSBkZWZpbmVkIG9ubHkgaWYgdGhlIGNvdW50IGlzIG5vbi16ZXJvLgogICAgICovCiAgICBmdW5jdGlvbiBwYXJzZURlYnVnVGVuc29yVmFsdWUocmF3KSB7CiAgICAgICAgY29uc3QgeyB0ZW5zb3JEZWJ1Z01vZGUsIGFycmF5IH0gPSByYXc7CiAgICAgICAgc3dpdGNoICh0ZW5zb3JEZWJ1Z01vZGUpIHsKICAgICAgICAgICAgY2FzZSBUZW5zb3JEZWJ1Z01vZGUuTk9fVEVOU09SOiB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWRseSByZWNlaXZlZCBub24tbnVsbCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlciBOT19URU5TT1IgbW9kZScpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHt9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgVGVuc29yRGVidWdNb2RlLkNVUlRfSEVBTFRIOiB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXkgPT09IG51bGwgfHwgYXJyYXkubGVuZ3RoICE9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlciBDVVJUX0hFQUxUSCBtb2RlLCBleHBlY3RlZCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGB0byBoYXZlIGxlbmd0aCAyLCBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkoYXJyYXkpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBoYXNJbmZPck5hTjogQm9vbGVhbihhcnJheVsxXSksCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgVGVuc29yRGVidWdNb2RlLkNPTkNJU0VfSEVBTFRIOiB7CiAgICAgICAgICAgICAgICBpZiAoYXJyYXkgPT09IG51bGwgfHwgYXJyYXkubGVuZ3RoICE9PSA1KSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlciBDT05DSVNFX0hFQUxUSCBtb2RlLCBleHBlY3RlZCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGB0byBoYXZlIGxlbmd0aCA1LCBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkoYXJyYXkpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSB7CiAgICAgICAgICAgICAgICAgICAgc2l6ZTogYXJyYXlbMV0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKGFycmF5WzJdID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlLm51bU5lZ2F0aXZlSW5mcyA9IGFycmF5WzJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFycmF5WzNdID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlLm51bVBvc2l0aXZlSW5mcyA9IGFycmF5WzNdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFycmF5WzRdID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlLm51bU5hTnMgPSBhcnJheVs0XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIFRlbnNvckRlYnVnTW9kZS5TSEFQRTogewogICAgICAgICAgICAgICAgaWYgKGFycmF5ID09PSBudWxsIHx8IGFycmF5Lmxlbmd0aCAhPT0gMTApIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVuZGVyIFNIQVBFIG1vZGUsIGV4cGVjdGVkIGRlYnVnLXRlbnNvci12YWx1ZSBhcnJheSBgICsKICAgICAgICAgICAgICAgICAgICAgICAgYHRvIGhhdmUgbGVuZ3RoIDEwLCBidXQgZ290ICR7SlNPTi5zdHJpbmdpZnkoYXJyYXkpfWApOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmFuayA9IGFycmF5WzJdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHNoYXBlID0gYXJyYXkuc2xpY2UoNCwgTWF0aC5taW4oNCArIHJhbmssIGFycmF5Lmxlbmd0aCkpOwogICAgICAgICAgICAgICAgaWYgKHNoYXBlLmxlbmd0aCA8IHJhbmspIHsKICAgICAgICAgICAgICAgICAgICAvLyBUaGUgU0hBUEUgbW9kZSB0cnVuY2F0ZXMgdGhlIHNoYXBlIGF0IGhlYWQuCiAgICAgICAgICAgICAgICAgICAgc2hhcGUgPSBuZXcgQXJyYXkocmFuayAtIHNoYXBlLmxlbmd0aCkuY29uY2F0KHNoYXBlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgZHR5cGU6IERUWVBFX0VOVU1fVE9fTkFNRVthcnJheVsxXV0sCiAgICAgICAgICAgICAgICAgICAgcmFuaywKICAgICAgICAgICAgICAgICAgICBzaXplOiBhcnJheVszXSwKICAgICAgICAgICAgICAgICAgICBzaGFwZSwKICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEg6IHsKICAgICAgICAgICAgICAgIGlmIChhcnJheSA9PT0gbnVsbCB8fCBhcnJheS5sZW5ndGggIT09IDExKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbmRlciBGVUxMX0hFQUxUSCBtb2RlLCBleHBlY3RlZCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGB0byBoYXZlIGxlbmd0aCAxMSwgYnV0IGdvdCAke0pTT04uc3RyaW5naWZ5KGFycmF5KX1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJhbmsgPSBhcnJheVszXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gewogICAgICAgICAgICAgICAgICAgIGR0eXBlOiBEVFlQRV9FTlVNX1RPX05BTUVbYXJyYXlbMl1dLAogICAgICAgICAgICAgICAgICAgIHJhbmssCiAgICAgICAgICAgICAgICAgICAgc2l6ZTogYXJyYXlbNF0sCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICAgICAgaWYgKGFycmF5WzVdID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlLm51bU5lZ2F0aXZlSW5mcyA9IGFycmF5WzVdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFycmF5WzZdID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlLm51bVBvc2l0aXZlSW5mcyA9IGFycmF5WzZdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFycmF5WzddID4gMCkgewogICAgICAgICAgICAgICAgICAgIHZhbHVlLm51bU5hTnMgPSBhcnJheVs3XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhcnJheVs4XSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZS5udW1OZWdhdGl2ZUZpbml0ZXMgPSBhcnJheVs4XTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChhcnJheVs5XSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZS5udW1aZXJvcyA9IGFycmF5WzldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFycmF5WzEwXSA+IDApIHsKICAgICAgICAgICAgICAgICAgICB2YWx1ZS5udW1Qb3NpdGl2ZUZpbml0ZXMgPSBhcnJheVsxMF07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY2FzZSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9URU5TT1I6IHsKICAgICAgICAgICAgICAgIC8vIFVuZGVyIEZVTExfVEVOU09SIG1vZGUsIHRoZSBmdWxsIHRlbnNvciB2YWx1ZSBpcyBzdXBwbGllZCB2aWEKICAgICAgICAgICAgICAgIC8vIHNlcGFyYXRlIG1lYW5zLiBObyBzdW1tYXJ5IHZhbHVlcyBhcmUgcHJvdmlkZWQgZm9yIHRoZSB0ZW5zb3IgdmFsdWUuCiAgICAgICAgICAgICAgICBpZiAoYXJyYXkgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VuZXhwZWN0ZWRseSByZWNlaXZlZCBub24tbnVsbCBkZWJ1Zy10ZW5zb3ItdmFsdWUgYXJyYXkgJyArCiAgICAgICAgICAgICAgICAgICAgICAgICd1bmRlciBGVUxMX1RFTlNPUiBtb2RlJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4ge307CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBVbnJlY29nbml6ZWQgdGVuc29yRGVidWdNb2RlOiAke3RlbnNvckRlYnVnTW9kZX1gKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2RlYnVnX3RlbnNvcl92YWx1ZS9kZWJ1Z190ZW5zb3JfdmFsdWVfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiZGl2IiwgNCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgOCk7CiAgICAgICAgybXJtXRleHQoMiwgIk5hTiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIsIDkpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMiA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiXHUwMEQ3IiwgY3R4X3IyLm51bU5hTnMsICIiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDcpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCA4KTsKICAgICAgICDJtcm1dGV4dCgyLCAiLVx1MjIxRSIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAic3BhbiIsIDkpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiXHUwMEQ3IiwgY3R4X3IzLm51bU5lZ2F0aXZlSW5mcywgIiIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIsIDgpOwogICAgICAgIMm1ybV0ZXh0KDIsICIrXHUyMjFFIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgOSk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJcdTAwRDciLCBjdHhfcjQubnVtUG9zaXRpdmVJbmZzLCAiIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgMTApOwogICAgICAgIMm1ybV0ZXh0KDIsICItIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgOSk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I1ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJcdTAwRDciLCBjdHhfcjUubnVtTmVnYXRpdmVGaW5pdGVzLCAiIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgMTApOwogICAgICAgIMm1ybV0ZXh0KDIsICIwIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgOSk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I2ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCJcdTAwRDciLCBjdHhfcjYubnVtWmVyb3MsICIiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDcpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAxMCk7CiAgICAgICAgybXJtXRleHQoMiwgIisiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgInNwYW4iLCA5KTsKICAgICAgICDJtcm1dGV4dCg0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjcgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIlx1MDBENyIsIGN0eF9yNy5udW1Qb3NpdGl2ZUZpbml0ZXMsICIiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDUpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzFfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl8yX1RlbXBsYXRlLCA1LCAxLCAiZGl2IiwgNik7CiAgICAgICAgybXJtXRlbXBsYXRlKDMsIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfM19UZW1wbGF0ZSwgNSwgMSwgImRpdiIsIDYpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzZfZGl2XzRfVGVtcGxhdGUsIDUsIDEsICJkaXYiLCA2KTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50X2Rpdl82X2Rpdl81X1RlbXBsYXRlLCA1LCAxLCAiZGl2IiwgNik7CiAgICAgICAgybXJtXRlbXBsYXRlKDYsIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9kaXZfNl9UZW1wbGF0ZSwgNSwgMSwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjEubnVtTmFOcyAhPT0gdW5kZWZpbmVkICYmIGN0eF9yMS5udW1OYU5zID4gMCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bU5lZ2F0aXZlSW5mcyAhPT0gdW5kZWZpbmVkICYmIGN0eF9yMS5udW1OZWdhdGl2ZUluZnMgPiAwKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjEubnVtUG9zaXRpdmVJbmZzICE9PSB1bmRlZmluZWQgJiYgY3R4X3IxLm51bVBvc2l0aXZlSW5mcyA+IDApOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMS5udW1OZWdhdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCAmJiBjdHhfcjEubnVtTmVnYXRpdmVGaW5pdGVzID4gMCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bVplcm9zICE9PSB1bmRlZmluZWQgJiYgY3R4X3IxLm51bVplcm9zID4gMCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLm51bVBvc2l0aXZlRmluaXRlcyAhPT0gdW5kZWZpbmVkICYmIGN0eF9yMS5udW1Qb3NpdGl2ZUZpbml0ZXMgPiAwKTsKICAgIH0gfQogICAgY29uc3QgX2MwJGQgPSBmdW5jdGlvbiAoYTEpIHsgcmV0dXJuIFsiY29udGFpbmVyIiwgYTFdOyB9OwogICAgZnVuY3Rpb24gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9kZWJ1Z190ZW5zb3JfZHR5cGVfMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiZGVidWctdGVuc29yLWR0eXBlIiwgNSk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoImR0eXBlIiwgY3R4X3IwLmRlYnVnVGVuc29yVmFsdWUuZHR5cGUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9yYW5rXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgImRlYnVnLXRlbnNvci1yYW5rIiwgNik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJhbmsiLCBjdHhfcjEuZGVidWdUZW5zb3JWYWx1ZS5yYW5rKTsKICAgIH0gfQogICAgZnVuY3Rpb24gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9kZWJ1Z190ZW5zb3Jfc2hhcGVfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiZGVidWctdGVuc29yLXNoYXBlIiwgNyk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjIgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoInNoYXBlIiwgY3R4X3IyLmRlYnVnVGVuc29yVmFsdWUuc2hhcGUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9oYXNfaW5mX29yX25hbl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJkZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4iLCA4KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiaGFzSW5mT3JOYU4iLCBjdHhfcjMuZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfZGVidWdfdGVuc29yX251bWVyaWNfYnJlYWtkb3duXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgImRlYnVnLXRlbnNvci1udW1lcmljLWJyZWFrZG93biIsIDkpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoInNpemUiLCBjdHhfcjQuZGVidWdUZW5zb3JWYWx1ZS5zaXplKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm51bU5lZ2F0aXZlSW5mcyIsIGN0eF9yNC5kZWJ1Z1RlbnNvclZhbHVlLm51bU5lZ2F0aXZlSW5mcykoIm51bVBvc2l0aXZlSW5mcyIsIGN0eF9yNC5kZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlSW5mcykoIm51bU5hTnMiLCBjdHhfcjQuZGVidWdUZW5zb3JWYWx1ZS5udW1OYU5zKSgibnVtTmVnYXRpdmVGaW5pdGVzIiwgY3R4X3I0LmRlYnVnVGVuc29yVmFsdWUubnVtTmVnYXRpdmVGaW5pdGVzKSgibnVtWmVyb3MiLCBjdHhfcjQuZGVidWdUZW5zb3JWYWx1ZS5udW1aZXJvcykoIm51bVBvc2l0aXZlRmluaXRlcyIsIGN0eF9yNC5kZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlRmluaXRlcyk7CiAgICB9IH0KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGJhc2ljRGVidWdJbmZvU3R5bGUgPSBgCiAgOmhvc3QgewogICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CiAgICBib3JkZXItcmFkaXVzOiA0cHg7CiAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlOwogICAgaGVpZ2h0OiAxNHB4OwogICAgbGluZS1oZWlnaHQ6IDE0cHg7CiAgICBtYXJnaW46IDAgMnB4OwogICAgcGFkZGluZzogMXB4IDNweDsKICAgIHdpZHRoOiBtYXgtY29udGVudDsKICB9CmA7CiAgICBjbGFzcyBEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50IHsKICAgIH0KICAgIERlYnVnVGVuc29yRFR5cGVDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnLXRlbnNvci1kdHlwZScsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAge3sgZHR5cGUgfX0gYCwKICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IFtiYXNpY0RlYnVnSW5mb1N0eWxlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIERlYnVnVGVuc29yRFR5cGVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZHR5cGU6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yRFR5cGVDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnVGVuc29yRFR5cGVDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBEZWJ1Z1RlbnNvckRUeXBlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnLXRlbnNvci1kdHlwZSJdXSwgaW5wdXRzOiB7IGR0eXBlOiAiZHR5cGUiIH0sIGRlY2xzOiAxLCB2YXJzOiAxLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JEVHlwZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXRleHQoMCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4LmR0eXBlLCAiICIpOwogICAgICAgIH0gfSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICBib3JkZXItcmFkaXVzOiA0cHg7XG4gICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICBoZWlnaHQ6IDE0cHg7XG4gICAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gICAgbWFyZ2luOiAwIDJweDtcbiAgICBwYWRkaW5nOiAxcHggM3B4O1xuICAgIHdpZHRoOiBtYXgtY29udGVudDtcbiAgfSJdIH0pOwogICAgY2xhc3MgRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50IHsKICAgIH0KICAgIERlYnVnVGVuc29yUmFua0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZGVidWctdGVuc29yLXJhbmsnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgIHt7IHJhbmsgfX1EIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbYmFzaWNEZWJ1Z0luZm9TdHlsZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBEZWJ1Z1RlbnNvclJhbmtDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgcmFuazogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnVGVuc29yUmFua0NvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvclJhbmtDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnLXRlbnNvci1yYW5rIl1dLCBpbnB1dHM6IHsgcmFuazogInJhbmsiIH0sIGRlY2xzOiAxLCB2YXJzOiAxLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dGV4dCgwKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHgucmFuaywgIkQgIik7CiAgICAgICAgfSB9LCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICAgIGhlaWdodDogMTRweDtcbiAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICBtYXJnaW46IDAgMnB4O1xuICAgIHBhZGRpbmc6IDFweCAzcHg7XG4gICAgd2lkdGg6IG1heC1jb250ZW50O1xuICB9Il0gfSk7CiAgICBjbGFzcyBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzaGFwZVN0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuICgnWycgKwogICAgICAgICAgICAgICAgdGhpcy5zaGFwZQogICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaW0KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChkaW0pID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGltID09PSB1bmRlZmluZWQgPyAnPycgOiBTdHJpbmcoZGltKTsKICAgICAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAgICAgIC5qb2luKCcsJykgKwogICAgICAgICAgICAgICAgJ10nKTsKICAgICAgICB9CiAgICB9CiAgICBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdkZWJ1Zy10ZW5zb3Itc2hhcGUnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgIHNoYXBlOnt7IHNoYXBlU3RyaW5nIH19IGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbYmFzaWNEZWJ1Z0luZm9TdHlsZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHNoYXBlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yU2hhcGVDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJkZWJ1Zy10ZW5zb3Itc2hhcGUiXV0sIGlucHV0czogeyBzaGFwZTogInNoYXBlIiB9LCBkZWNsczogMSwgdmFyczogMSwgdGVtcGxhdGU6IGZ1bmN0aW9uIERlYnVnVGVuc29yU2hhcGVDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV0ZXh0KDApOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIHNoYXBlOiIsIGN0eC5zaGFwZVN0cmluZywgIiAiKTsKICAgICAgICB9IH0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4O1xuICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gICAgaGVpZ2h0OiAxNHB4O1xuICAgIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICAgIG1hcmdpbjogMCAycHg7XG4gICAgcGFkZGluZzogMXB4IDNweDtcbiAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gIH0iXSB9KTsKICAgIGNsYXNzIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYnJlYWtkb3duRXhpc3RzKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMubnVtTmFOcyAhPT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgICB0aGlzLm51bU5lZ2F0aXZlSW5mcyAhPT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgICB0aGlzLm51bVBvc2l0aXZlSW5mcyAhPT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgICB0aGlzLm51bU5lZ2F0aXZlRmluaXRlcyAhPT0gdW5kZWZpbmVkIHx8CiAgICAgICAgICAgICAgICB0aGlzLm51bVplcm9zICE9PSB1bmRlZmluZWQgfHwKICAgICAgICAgICAgICAgIHRoaXMubnVtUG9zaXRpdmVGaW5pdGVzICE9PSB1bmRlZmluZWQpOwogICAgICAgIH0KICAgIH0KICAgIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGRpdiBjbGFzcz0ic2l6ZSI+CiAgICAgIDxzcGFuPnNpemU6PC9zcGFuPgogICAgICA8c3BhbiBjbGFzcz0ic2l6ZS12YWx1ZSI+e3sgc2l6ZSB9fTwvc3Bhbj4KICAgIDwvZGl2PgogICAgPGRpdiAqbmdJZj0iYnJlYWtkb3duRXhpc3RzIiBjbGFzcz0iYnJlYWsiPjwvZGl2PgogICAgPGRpdiAqbmdJZj0iYnJlYWtkb3duRXhpc3RzIiBjbGFzcz0iYnJlYWtkb3duIj4KICAgICAgPGRpdiAqbmdJZj0ibnVtTmFOcyAhPT0gdW5kZWZpbmVkICYmIG51bU5hTnMgPiAwIiBjbGFzcz0iY2F0ZWdvcnkiPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgaW5maW5pdGUiPk5hTjwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtTmFOcyB9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxkaXYKICAgICAgICAqbmdJZj0ibnVtTmVnYXRpdmVJbmZzICE9PSB1bmRlZmluZWQgJiYgbnVtTmVnYXRpdmVJbmZzID4gMCIKICAgICAgICBjbGFzcz0iY2F0ZWdvcnkiCiAgICAgID4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGluZmluaXRlIj4t4oiePC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1OZWdhdGl2ZUluZnMgfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2CiAgICAgICAgKm5nSWY9Im51bVBvc2l0aXZlSW5mcyAhPT0gdW5kZWZpbmVkICYmIG51bVBvc2l0aXZlSW5mcyA+IDAiCiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IgogICAgICA+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBpbmZpbml0ZSI+K+KInjwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtUG9zaXRpdmVJbmZzIH19PC9zcGFuPgogICAgICA8L2Rpdj4KICAgICAgPGRpdgogICAgICAgICpuZ0lmPSJudW1OZWdhdGl2ZUZpbml0ZXMgIT09IHVuZGVmaW5lZCAmJiBudW1OZWdhdGl2ZUZpbml0ZXMgPiAwIgogICAgICAgIGNsYXNzPSJjYXRlZ29yeSIKICAgICAgPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS10YWcgZmluaXRlIj4tPC9zcGFuPgogICAgICAgIDxzcGFuIGNsYXNzPSJjYXRlZ29yeS1jb3VudCI+w5d7eyBudW1OZWdhdGl2ZUZpbml0ZXMgfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2ICpuZ0lmPSJudW1aZXJvcyAhPT0gdW5kZWZpbmVkICYmIG51bVplcm9zID4gMCIgY2xhc3M9ImNhdGVnb3J5Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktdGFnIGZpbml0ZSI+MDwvc3Bhbj4KICAgICAgICA8c3BhbiBjbGFzcz0iY2F0ZWdvcnktY291bnQiPsOXe3sgbnVtWmVyb3MgfX08L3NwYW4+CiAgICAgIDwvZGl2PgogICAgICA8ZGl2CiAgICAgICAgKm5nSWY9Im51bVBvc2l0aXZlRmluaXRlcyAhPT0gdW5kZWZpbmVkICYmIG51bVBvc2l0aXZlRmluaXRlcyA+IDAiCiAgICAgICAgY2xhc3M9ImNhdGVnb3J5IgogICAgICA+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LXRhZyBmaW5pdGUiPis8L3NwYW4+CiAgICAgICAgPHNwYW4gY2xhc3M9ImNhdGVnb3J5LWNvdW50Ij7Dl3t7IG51bVBvc2l0aXZlRmluaXRlcyB9fTwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICA8L2Rpdj4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlczogWwogICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4OwogICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4OwogICAgICAgIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7CiAgICAgICAgZm9udC1zaXplOiAxMHB4OwogICAgICAgIG1hcmdpbjogMCAycHg7CiAgICAgICAgcGFkZGluZzogMXB4OwogICAgICB9CiAgICAgIC5icmVhayB7CiAgICAgICAgZmxleC1iYXNpczogMTAwJTsKICAgICAgICB3aWR0aDogMDsKICAgICAgfQogICAgICAuc2l6ZSB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMXB4OwogICAgICAgIGxpbmUtaGVpZ2h0OiAxMXB4OwogICAgICAgIG1hcmdpbjogMCAzcHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAuYnJlYWtkb3duIHsKICAgICAgICBib3JkZXItdG9wOiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKTsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICAgIGhlaWdodDogMTFweDsKICAgICAgICBsaW5lLWhlaWdodDogMTFweDsKICAgICAgICBwYWRkaW5nOiAycHg7CiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTsKICAgICAgfQogICAgICAuY2F0ZWdvcnkgewogICAgICAgIG1hcmdpbi1ib3R0b206IDJweDsKICAgICAgICBtYXJnaW4tbGVmdDogNHB4OwogICAgICAgIG1hcmdpbi10b3A6IDJweDsKICAgICAgICBoZWlndGg6IDEwMCU7CiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgICB9CiAgICAgIC5jYXRlZ29yeS10YWcgewogICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDsKICAgICAgICBwYWRkaW5nOiAwIDJweDsKICAgICAgfQogICAgICAuZmluaXRlIHsKICAgICAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjYWFhOwogICAgICAgIGNvbG9yOiAjZmVmZWZlOwogICAgICB9CiAgICAgIC5pbmZpbml0ZSB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1MjU5MjsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHNpemU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bU5hTnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bU5lZ2F0aXZlSW5mczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbnVtUG9zaXRpdmVJbmZzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBudW1OZWdhdGl2ZUZpbml0ZXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bVplcm9zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBudW1Qb3NpdGl2ZUZpbml0ZXM6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24iXV0sIGlucHV0czogeyBzaXplOiAic2l6ZSIsIG51bU5hTnM6ICJudW1OYU5zIiwgbnVtTmVnYXRpdmVJbmZzOiAibnVtTmVnYXRpdmVJbmZzIiwgbnVtUG9zaXRpdmVJbmZzOiAibnVtUG9zaXRpdmVJbmZzIiwgbnVtTmVnYXRpdmVGaW5pdGVzOiAibnVtTmVnYXRpdmVGaW5pdGVzIiwgbnVtWmVyb3M6ICJudW1aZXJvcyIsIG51bVBvc2l0aXZlRmluaXRlczogIm51bVBvc2l0aXZlRmluaXRlcyIgfSwgZGVjbHM6IDcsIHZhcnM6IDMsIGNvbnN0czogW1sxLCAic2l6ZSJdLCBbMSwgInNpemUtdmFsdWUiXSwgWyJjbGFzcyIsICJicmVhayIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAiYnJlYWtkb3duIiwgNCwgIm5nSWYiXSwgWzEsICJicmVhayJdLCBbMSwgImJyZWFrZG93biJdLCBbImNsYXNzIiwgImNhdGVnb3J5IiwgNCwgIm5nSWYiXSwgWzEsICJjYXRlZ29yeSJdLCBbMSwgImNhdGVnb3J5LXRhZyIsICJpbmZpbml0ZSJdLCBbMSwgImNhdGVnb3J5LWNvdW50Il0sIFsxLCAiY2F0ZWdvcnktdGFnIiwgImZpbml0ZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iKTsKICAgICAgICAgICAgybXJtXRleHQoMiwgInNpemU6Iik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgInNwYW4iLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBEZWJ1Z1RlbnNvck51bWVyaWNCcmVha2Rvd25Db21wb25lbnRfZGl2XzVfVGVtcGxhdGUsIDEsIDAsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDYsIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudF9kaXZfNl9UZW1wbGF0ZSwgNywgNiwgImRpdiIsIDMpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHguc2l6ZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguYnJlYWtkb3duRXhpc3RzKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5icmVha2Rvd25FeGlzdHMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWZdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gICAgICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgZm9udC1zaXplOiAxMHB4O1xuICAgICAgICBtYXJnaW46IDAgMnB4O1xuICAgICAgICBwYWRkaW5nOiAxcHg7XG4gICAgICB9XG4gICAgICAuYnJlYWtbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZmxleC1iYXNpczogMTAwJTtcbiAgICAgICAgd2lkdGg6IDA7XG4gICAgICB9XG4gICAgICAuc2l6ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMXB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTFweDtcbiAgICAgICAgbWFyZ2luOiAwIDNweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIC5icmVha2Rvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICAgIGhlaWdodDogMTFweDtcbiAgICAgICAgbGluZS1oZWlnaHQ6IDExcHg7XG4gICAgICAgIHBhZGRpbmc6IDJweDtcbiAgICAgICAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgICAgIH1cbiAgICAgIC5jYXRlZ29yeVtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICBtYXJnaW4tYm90dG9tOiAycHg7XG4gICAgICAgIG1hcmdpbi1sZWZ0OiA0cHg7XG4gICAgICAgIG1hcmdpbi10b3A6IDJweDtcbiAgICAgICAgaGVpZ3RoOiAxMDAlO1xuICAgICAgICB3aWR0aDogbWF4LWNvbnRlbnQ7XG4gICAgICB9XG4gICAgICAuY2F0ZWdvcnktdGFnW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJvcmRlci1yYWRpdXM6IDJweDtcbiAgICAgICAgcGFkZGluZzogMCAycHg7XG4gICAgICB9XG4gICAgICAuZmluaXRlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNhYWE7XG4gICAgICAgIGNvbG9yOiAjZmVmZWZlO1xuICAgICAgfVxuICAgICAgLmluZmluaXRlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfSJdIH0pOwogICAgY2xhc3MgRGVidWdUZW5zb3JIYXNJbmZPck5hTkNvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaW5mb1N0cmluZygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaGFzSW5mT3JOYU4gPyAnSGFzIOKIni9OYU4nIDogJ05vIOKIni9OYU4nOwogICAgICAgIH0KICAgIH0KICAgIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hbicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxkaXYgW25nQ2xhc3NdPSJbJ2NvbnRhaW5lcicsIGhhc0luZk9yTmFOID8gJ2hhcy1pbmYtb3ItbmFuJyA6ICcnXSI+CiAgICAgIHt7IGluZm9TdHJpbmcgfX0KICAgIDwvZGl2PgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgLmNvbnRhaW5lciB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODsKICAgICAgICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwOwogICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsKICAgICAgICBjb2xvcjogIzY2NjY2NjsKICAgICAgICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlOwogICAgICAgIGhlaWdodDogMTRweDsKICAgICAgICBsaW5lLWhlaWdodDogMTRweDsKICAgICAgICBtYXJnaW46IDAgMnB4OwogICAgICAgIHBhZGRpbmc6IDFweCAzcHg7CiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50OwogICAgICB9CiAgICAgIC5oYXMtaW5mLW9yLW5hbiB7CiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2U1MjU5MjsKICAgICAgICBjb2xvcjogI2ZmZjsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgRGVidWdUZW5zb3JIYXNJbmZPck5hTkNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBoYXNJbmZPck5hTjogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JIYXNJbmZPck5hTkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVidWdUZW5zb3JIYXNJbmZPck5hTkNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvckhhc0luZk9yTmFOQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQsIHNlbGVjdG9yczogW1siZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuIl1dLCBpbnB1dHM6IHsgaGFzSW5mT3JOYU46ICJoYXNJbmZPck5hTiIgfSwgZGVjbHM6IDIsIHZhcnM6IDQsIGNvbnN0czogW1szLCAibmdDbGFzcyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjEoMiwgX2MwJGQsIGN0eC5oYXNJbmZPck5hTiA/ICJoYXMtaW5mLW9yLW5hbiIgOiAiIikpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHguaW5mb1N0cmluZywgIiAiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0NsYXNzXSwgc3R5bGVzOiBbIi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgICAgICAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgICAgICAgYm9yZGVyLXJhZGl1czogNHB4O1xuICAgICAgICBjb2xvcjogIzY2NjY2NjtcbiAgICAgICAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgICAgICAgaGVpZ2h0OiAxNHB4O1xuICAgICAgICBsaW5lLWhlaWdodDogMTRweDtcbiAgICAgICAgbWFyZ2luOiAwIDJweDtcbiAgICAgICAgcGFkZGluZzogMXB4IDNweDtcbiAgICAgICAgd2lkdGg6IG1heC1jb250ZW50O1xuICAgICAgfVxuICAgICAgLmhhcy1pbmYtb3ItbmFuW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gICAgICAgIGNvbG9yOiAjZmZmO1xuICAgICAgfSJdIH0pOwogICAgY2xhc3MgRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudCB7CiAgICB9CiAgICBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdkZWJ1Zy10ZW5zb3ItdmFsdWUnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8ZGVidWctdGVuc29yLWR0eXBlCiAgICAgICpuZ0lmPSJkZWJ1Z1RlbnNvclZhbHVlLmR0eXBlICE9PSB1bmRlZmluZWQiCiAgICAgIFtkdHlwZV09ImRlYnVnVGVuc29yVmFsdWUuZHR5cGUiCiAgICA+CiAgICA8L2RlYnVnLXRlbnNvci1kdHlwZT4KICAgIDxkZWJ1Zy10ZW5zb3ItcmFuawogICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5yYW5rICE9PSB1bmRlZmluZWQiCiAgICAgIFtyYW5rXT0iZGVidWdUZW5zb3JWYWx1ZS5yYW5rIgogICAgPgogICAgPC9kZWJ1Zy10ZW5zb3ItcmFuaz4KICAgIDxkZWJ1Zy10ZW5zb3Itc2hhcGUKICAgICAgKm5nSWY9ImRlYnVnVGVuc29yVmFsdWUuc2hhcGUgIT09IHVuZGVmaW5lZCIKICAgICAgW3NoYXBlXT0iZGVidWdUZW5zb3JWYWx1ZS5zaGFwZSIKICAgID4KICAgIDwvZGVidWctdGVuc29yLXNoYXBlPgogICAgPGRlYnVnLXRlbnNvci1oYXMtaW5mLW9yLW5hbgogICAgICAqbmdJZj0iZGVidWdUZW5zb3JWYWx1ZS5oYXNJbmZPck5hTiAhPT0gdW5kZWZpbmVkIgogICAgICBbaGFzSW5mT3JOYU5dPSJkZWJ1Z1RlbnNvclZhbHVlLmhhc0luZk9yTmFOIgogICAgPgogICAgPC9kZWJ1Zy10ZW5zb3ItaGFzLWluZi1vci1uYW4+CiAgICA8ZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duCiAgICAgICpuZ0lmPSJkZWJ1Z1RlbnNvclZhbHVlLnNpemUgIT09IHVuZGVmaW5lZCIKICAgICAgc2l6ZT0ie3sgZGVidWdUZW5zb3JWYWx1ZS5zaXplIH19IgogICAgICBbbnVtTmVnYXRpdmVJbmZzXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1OZWdhdGl2ZUluZnMiCiAgICAgIFtudW1Qb3NpdGl2ZUluZnNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bVBvc2l0aXZlSW5mcyIKICAgICAgW251bU5hTnNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bU5hTnMiCiAgICAgIFtudW1OZWdhdGl2ZUZpbml0ZXNdPSJkZWJ1Z1RlbnNvclZhbHVlLm51bU5lZ2F0aXZlRmluaXRlcyIKICAgICAgW251bVplcm9zXT0iZGVidWdUZW5zb3JWYWx1ZS5udW1aZXJvcyIKICAgICAgW251bVBvc2l0aXZlRmluaXRlc109ImRlYnVnVGVuc29yVmFsdWUubnVtUG9zaXRpdmVGaW5pdGVzIgogICAgPgogICAgPC9kZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd24+CiAgYCwKICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgYAogICAgICA6aG9zdCB7CiAgICAgICAgYWxpZ24taXRlbXM6IGZsZXgtc3RhcnQ7CiAgICAgICAgZGlzcGxheTogZmxleDsKICAgICAgICBmbGV4LXdyYXA6IG5vd3JhcDsKICAgICAgICBvdmVyZmxvdzogaGlkZGVuOwogICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7CiAgICAgIH0KICAgICAgZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIHsKICAgICAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZGVidWdUZW5zb3JWYWx1ZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnVGVuc29yVmFsdWVDb21wb25lbnQsIHNlbGVjdG9yczogW1siZGVidWctdGVuc29yLXZhbHVlIl1dLCBpbnB1dHM6IHsgZGVidWdUZW5zb3JWYWx1ZTogImRlYnVnVGVuc29yVmFsdWUiIH0sIGRlY2xzOiA1LCB2YXJzOiA1LCBjb25zdHM6IFtbMywgImR0eXBlIiwgNCwgIm5nSWYiXSwgWzMsICJyYW5rIiwgNCwgIm5nSWYiXSwgWzMsICJzaGFwZSIsIDQsICJuZ0lmIl0sIFszLCAiaGFzSW5mT3JOYU4iLCA0LCAibmdJZiJdLCBbMywgInNpemUiLCAibnVtTmVnYXRpdmVJbmZzIiwgIm51bVBvc2l0aXZlSW5mcyIsICJudW1OYU5zIiwgIm51bU5lZ2F0aXZlRmluaXRlcyIsICJudW1aZXJvcyIsICJudW1Qb3NpdGl2ZUZpbml0ZXMiLCA0LCAibmdJZiJdLCBbMywgImR0eXBlIl0sIFszLCAicmFuayJdLCBbMywgInNoYXBlIl0sIFszLCAiaGFzSW5mT3JOYU4iXSwgWzMsICJzaXplIiwgIm51bU5lZ2F0aXZlSW5mcyIsICJudW1Qb3NpdGl2ZUluZnMiLCAibnVtTmFOcyIsICJudW1OZWdhdGl2ZUZpbml0ZXMiLCAibnVtWmVyb3MiLCAibnVtUG9zaXRpdmVGaW5pdGVzIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGVidWdUZW5zb3JWYWx1ZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDAsIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfZGVidWdfdGVuc29yX2R0eXBlXzBfVGVtcGxhdGUsIDEsIDEsICJkZWJ1Zy10ZW5zb3ItZHR5cGUiLCAwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEsIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRfZGVidWdfdGVuc29yX3JhbmtfMV9UZW1wbGF0ZSwgMSwgMSwgImRlYnVnLXRlbnNvci1yYW5rIiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9zaGFwZV8yX1RlbXBsYXRlLCAxLCAxLCAiZGVidWctdGVuc29yLXNoYXBlIiwgMik7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9oYXNfaW5mX29yX25hbl8zX1RlbXBsYXRlLCAxLCAxLCAiZGVidWctdGVuc29yLWhhcy1pbmYtb3ItbmFuIiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50X2RlYnVnX3RlbnNvcl9udW1lcmljX2JyZWFrZG93bl80X1RlbXBsYXRlLCAxLCA3LCAiZGVidWctdGVuc29yLW51bWVyaWMtYnJlYWtkb3duIiwgNCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5kZWJ1Z1RlbnNvclZhbHVlLmR0eXBlICE9PSB1bmRlZmluZWQpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmRlYnVnVGVuc29yVmFsdWUucmFuayAhPT0gdW5kZWZpbmVkKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5kZWJ1Z1RlbnNvclZhbHVlLnNoYXBlICE9PSB1bmRlZmluZWQpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmRlYnVnVGVuc29yVmFsdWUuaGFzSW5mT3JOYU4gIT09IHVuZGVmaW5lZCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZGVidWdUZW5zb3JWYWx1ZS5zaXplICE9PSB1bmRlZmluZWQpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIERlYnVnVGVuc29yRFR5cGVDb21wb25lbnQsCiAgICAgICAgICAgIERlYnVnVGVuc29yUmFua0NvbXBvbmVudCwKICAgICAgICAgICAgRGVidWdUZW5zb3JTaGFwZUNvbXBvbmVudCwKICAgICAgICAgICAgRGVidWdUZW5zb3JIYXNJbmZPck5hTkNvbXBvbmVudCwKICAgICAgICAgICAgRGVidWdUZW5zb3JOdW1lcmljQnJlYWtkb3duQ29tcG9uZW50XSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBhbGlnbi1pdGVtczogZmxleC1zdGFydDtcbiAgICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgICAgZmxleC13cmFwOiBub3dyYXA7XG4gICAgICAgIG92ZXJmbG93OiBoaWRkZW47XG4gICAgICAgIHZlcnRpY2FsLWFsaWduOiB0b3A7XG4gICAgICB9XG4gICAgICBkZWJ1Zy10ZW5zb3ItbnVtZXJpYy1icmVha2Rvd25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICAgICAgfSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZXhlY3V0aW9uX2RhdGEvZXhlY3V0aW9uX2RhdGFfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IF9jMCRlID0gZnVuY3Rpb24gKGEwLCBhMSkgeyByZXR1cm4geyB0ZW5zb3JEZWJ1Z01vZGU6IGEwLCBhcnJheTogYTEgfTsgfTsKICAgIGZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb21wb25lbnRfZGl2XzRfZGl2XzE5X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDEyKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxMyk7CiAgICAgICAgybXJtXRleHQoMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJkaXYiLCAxNCk7CiAgICAgICAgybXJtWVsZW1lbnQoNCwgImRlYnVnLXRlbnNvci12YWx1ZSIsIDE1KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBzaW5nbGVEZWJ1Z1RlbnNvclZhbHVlc19yNSA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgaV9yNiA9IGN0eC5pbmRleDsKICAgICAgICBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoMyk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIk91dHB1dCBzbG90ICIsIGlfcjYsICI6Iik7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJkZWJ1Z1RlbnNvclZhbHVlIiwgY3R4X3I0LnBhcnNlRGVidWdUZW5zb3JWYWx1ZSjJtcm1cHVyZUZ1bmN0aW9uMigyLCBfYzAkZSwgY3R4X3I0LnRlbnNvckRlYnVnTW9kZSwgc2luZ2xlRGVidWdUZW5zb3JWYWx1ZXNfcjUpKSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb21wb25lbnRfZGl2XzRfZGl2XzE5X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDEwKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMSwgRXhlY3V0aW9uRGF0YUNvbXBvbmVudF9kaXZfNF9kaXZfMTlfZGl2XzFfVGVtcGxhdGUsIDUsIDUsICJkaXYiLCAxMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHhfcjMuZGVidWdUZW5zb3JWYWx1ZXMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBFeGVjdXRpb25EYXRhQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDMpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgInNwYW4iLCA0KTsKICAgICAgICDJtcm1dGV4dCg0LCAiIE9wOiAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgInNwYW4iLCA1KTsKICAgICAgICDJtcm1dGV4dCg2KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiZGl2IiwgMyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAic3BhbiIsIDQpOwogICAgICAgIMm1ybV0ZXh0KDksICIgIyBvZiBpbnB1dCB0ZW5zb3JzOiAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJzcGFuIiwgNik7CiAgICAgICAgybXJtXRleHQoMTEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAiZGl2IiwgMyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMywgInNwYW4iLCA0KTsKICAgICAgICDJtcm1dGV4dCgxNCwgIiAjIG9mIG91dHB1dCB0ZW5zb3JzOiAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTUsICJzcGFuIiwgNyk7CiAgICAgICAgybXJtXRleHQoMTYpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNywgInNwYW4iLCA4KTsKICAgICAgICDJtcm1dGV4dCgxOCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxOSwgRXhlY3V0aW9uRGF0YUNvbXBvbmVudF9kaXZfNF9kaXZfMTlfVGVtcGxhdGUsIDIsIDEsICJkaXYiLCA5KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSg2KTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yMC5mb2N1c2VkRXhlY3V0aW9uRGF0YS5vcF90eXBlLCAiICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLmZvY3VzZWRFeGVjdXRpb25EYXRhLmlucHV0X3RlbnNvcl9pZHMgPT0gbnVsbCA/IDAgOiBjdHhfcjAuZm9jdXNlZEV4ZWN1dGlvbkRhdGEuaW5wdXRfdGVuc29yX2lkcy5sZW5ndGgsICIgIik7CiAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHhfcjAuZm9jdXNlZEV4ZWN1dGlvbkRhdGEub3V0cHV0X3RlbnNvcl9pZHMgPT0gbnVsbCA/IDAgOiBjdHhfcjAuZm9jdXNlZEV4ZWN1dGlvbkRhdGEub3V0cHV0X3RlbnNvcl9pZHMubGVuZ3RoLCAiICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgKGRlYnVnIG1vZGU6ICIsIGN0eF9yMC5UZW5zb3JEZWJ1Z01vZGVbY3R4X3IwLnRlbnNvckRlYnVnTW9kZV0sICIpICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMC5oYXNEZWJ1Z1RlbnNvclZhbHVlcyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IH0KICAgIGNsYXNzIEV4ZWN1dGlvbkRhdGFDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLnRlbnNvckRlYnVnTW9kZSA9IFRlbnNvckRlYnVnTW9kZS5VTlNQRUNJRklFRDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgYW55IGRlYnVnIHRlbnNvciB2YWx1ZXMgZXhpc3QsIHVuZGVyIG5vbi1GVUxMX1RFTlNPUiBkZWJ1ZwogICAgICAgICAgICAgKiBtb2Rlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaGFzRGVidWdUZW5zb3JWYWx1ZXMgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIERlYnVnIHRlbnNvciB2YWx1ZXMgdW5kZXIgbm9uLUZVTExfVEVOU09SIGRlYnVnIG1vZGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5kZWJ1Z1RlbnNvclZhbHVlcyA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBEdHlwZXMgb2YgdGhlIHRlbnNvcnMuCiAgICAgICAgICAgICAqIER0eXBlcyBhcmUgYXZhaWxhYmxlIHVuZGVyIHRlbnNvciBkZWJ1ZyBtb2RlcyBzdWNoIGFzIEZVTExfSEVBTFRILgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5kZWJ1Z1RlbnNvckR0eXBlcyA9IG51bGw7CiAgICAgICAgICAgIC8vIFNvIHRoYXQgdGhlIGVudW0gY2FuIGJlIHVzZWQgaW4gdGhlIHRlbXBsYXRlIGh0bWwuCiAgICAgICAgICAgIHRoaXMuVGVuc29yRGVidWdNb2RlID0gVGVuc29yRGVidWdNb2RlOwogICAgICAgICAgICB0aGlzLnBhcnNlRGVidWdUZW5zb3JWYWx1ZSA9IHBhcnNlRGVidWdUZW5zb3JWYWx1ZTsKICAgICAgICB9CiAgICB9CiAgICBFeGVjdXRpb25EYXRhQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdleGVjdXRpb24tZGF0YS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9leGVjdXRpb25fZGF0YV9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vZXhlY3V0aW9uX2RhdGFfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgRXhlY3V0aW9uRGF0YUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZvY3VzZWRFeGVjdXRpb25EYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0ZW5zb3JEZWJ1Z01vZGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGhhc0RlYnVnVGVuc29yVmFsdWVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkZWJ1Z1RlbnNvclZhbHVlczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGVidWdUZW5zb3JEdHlwZXM6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEV4ZWN1dGlvbkRhdGFDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBFeGVjdXRpb25EYXRhQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEV4ZWN1dGlvbkRhdGFDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRXhlY3V0aW9uRGF0YUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBFeGVjdXRpb25EYXRhQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IGZvY3VzZWRFeGVjdXRpb25JbmRleDogImZvY3VzZWRFeGVjdXRpb25JbmRleCIsIGZvY3VzZWRFeGVjdXRpb25EYXRhOiAiZm9jdXNlZEV4ZWN1dGlvbkRhdGEiLCB0ZW5zb3JEZWJ1Z01vZGU6ICJ0ZW5zb3JEZWJ1Z01vZGUiLCBoYXNEZWJ1Z1RlbnNvclZhbHVlczogImhhc0RlYnVnVGVuc29yVmFsdWVzIiwgZGVidWdUZW5zb3JWYWx1ZXM6ICJkZWJ1Z1RlbnNvclZhbHVlcyIsIGRlYnVnVGVuc29yRHR5cGVzOiAiZGVidWdUZW5zb3JEdHlwZXMiIH0sIGRlY2xzOiA3LCB2YXJzOiAzLCBjb25zdHM6IFtbMSwgImZvY3VzLWV4ZWN1dGlvbi1jb250YWluZXIiXSwgWzQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibG9hZGluZ19zZWN0aW9uIiwgIiJdLCBbMSwgImV4ZWN1dGlvbi1kYXRhLWZpZWxkIl0sIFsxLCAiZXhlY3V0aW9uLWRhdGEta2V5Il0sIFsxLCAiZXhlY3V0aW9uLWRhdGEtdmFsdWUiLCAib3AtdHlwZSJdLCBbMSwgImV4ZWN1dGlvbi1kYXRhLXZhbHVlIiwgImlucHV0LXRlbnNvcnMiXSwgWzEsICJleGVjdXRpb24tZGF0YS12YWx1ZSIsICJvdXRwdXQtdGVuc29ycyJdLCBbMSwgImV4ZWN1dGlvbi1kYXRhLXZhbHVlIl0sIFsiY2xhc3MiLCAib3V0cHV0LXNsb3RzIiwgNCwgIm5nSWYiXSwgWzEsICJvdXRwdXQtc2xvdHMiXSwgWyJjbGFzcyIsICJvdXRwdXQtc2xvdC1jb250YWluZXIiLCA0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMSwgIm91dHB1dC1zbG90LWNvbnRhaW5lciJdLCBbMSwgIm91dHB1dC1zbG90LW51bWJlciJdLCBbMSwgIm91dHB1dC1zbG90LWRlYnVnLXRlbnNvci12YWx1ZSJdLCBbMywgImRlYnVnVGVuc29yVmFsdWUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBFeGVjdXRpb25EYXRhQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2Iik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iKTsKICAgICAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBFeGVjdXRpb25EYXRhQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCAyMCwgNSwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNSwgRXhlY3V0aW9uRGF0YUNvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlLCAwLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCAyLCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICBjb25zdCBfcjEgPSDJtcm1cmVmZXJlbmNlKDYpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiBQeXRob24gRXhlY3V0aW9uICMiLCBjdHguZm9jdXNlZEV4ZWN1dGlvbkluZGV4LCAiICIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmZvY3VzZWRFeGVjdXRpb25EYXRhICE9PSBudWxsKSgibmdJZkVsc2UiLCBfcjEpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIE5nRm9yT2YsIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdLCBzdHlsZXM6IFsiLmRlYnVnLXRlbnNvci12YWx1ZXMtdGFibGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5kZWJ1Zy10ZW5zb3ItdmFsdWVzLXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCAjMDAwO1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uZGVidWctdGVuc29yLXZhbHVlcy10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV0ge1xuICB0ZXh0LWFsaWduOiBsZWZ0O1xufVxuXG4uZXhlY3V0aW9uLWRhdGEtZmllbGRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLmV4ZWN1dGlvbi1kYXRhLWtleVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMTIwcHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB3aWR0aDogMTIwcHg7XG59XG5cbi5leGVjdXRpb24tZGF0YS12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1sZWZ0OiAxMHB4O1xufVxuXG4uZm9jdXMtZXhlY3V0aW9uLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZkNGIzO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgaGVpZ2h0OiAxMjBweDtcbiAgcGFkZGluZzogNXB4O1xuICB3aWR0aDogMzYwcHg7XG59XG5cbi5vdXRwdXQtc2xvdHNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiA2MHB4O1xuICBvdmVyZmxvdy14OiBhdXRvO1xuICBvdmVyZmxvdy15OiBhdXRvO1xufVxuXG4ub3V0cHV0LXNsb3QtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBtYXJnaW4tdG9wOiA1cHg7XG4gIHBhZGRpbmc6IDJweCAwO1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuXG4ub3V0cHV0LXNsb3QtbnVtYmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xufVxuXG4ub3V0cHV0LXNsb3QtZGVidWctdGVuc29yLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDNweCAwIDNweCAzMHB4O1xufVxuXG4ub3V0cHV0LXRlbnNvcnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgbWFyZ2luLXRvcDogNXB4O1xufSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZXhlY3V0aW9uX2RhdGEvZXhlY3V0aW9uX2RhdGFfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFVOS05PV05fRFRZUEVfTkFNRSA9ICdVbmtub3duIGR0eXBlJzsKICAgIGNsYXNzIEV4ZWN1dGlvbkRhdGFDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEV4ZWN1dGlvbkRhdGEkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkRXhlY3V0aW9uRGF0YSkpOwogICAgICAgICAgICB0aGlzLnRlbnNvckRlYnVnTW9kZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldEZvY3VzZWRFeGVjdXRpb25EYXRhLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXhlY3V0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRlbnNvckRlYnVnTW9kZS5VTlNQRUNJRklFRDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBleGVjdXRpb24udGVuc29yX2RlYnVnX21vZGU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICB0aGlzLmhhc0RlYnVnVGVuc29yVmFsdWVzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Rm9jdXNlZEV4ZWN1dGlvbkRhdGEsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleGVjdXRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChleGVjdXRpb24pID0+IHsKICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb24gPT09IG51bGwgfHwgZXhlY3V0aW9uLmRlYnVnX3RlbnNvcl92YWx1ZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNpbmdsZURlYnVnVGVuc29yVmFsdWVzIG9mIGV4ZWN1dGlvbi5kZWJ1Z190ZW5zb3JfdmFsdWVzKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzaW5nbGVEZWJ1Z1RlbnNvclZhbHVlcyAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2luZ2xlRGVidWdUZW5zb3JWYWx1ZXMubGVuZ3RoID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkpKTsKICAgICAgICAgICAgdGhpcy5kZWJ1Z1RlbnNvclZhbHVlcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldEZvY3VzZWRFeGVjdXRpb25EYXRhLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhlY3V0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZXhlY3V0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZXhlY3V0aW9uID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uLmRlYnVnX3RlbnNvcl92YWx1ZXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICB0aGlzLmRlYnVnVGVuc29yRHR5cGVzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Rm9jdXNlZEV4ZWN1dGlvbkRhdGEsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleGVjdXRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChleGVjdXRpb24pID0+IHsKICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb24gPT09IG51bGwgfHwgZXhlY3V0aW9uLmRlYnVnX3RlbnNvcl92YWx1ZXMgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmIChleGVjdXRpb24udGVuc29yX2RlYnVnX21vZGUgIT09IFRlbnNvckRlYnVnTW9kZS5GVUxMX0hFQUxUSCAmJgogICAgICAgICAgICAgICAgICAgIGV4ZWN1dGlvbi50ZW5zb3JfZGVidWdfbW9kZSAhPT0gVGVuc29yRGVidWdNb2RlLlNIQVBFKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGxvZ2ljIGZvciBvdGhlciBUZW5zb3JEZWJ1Z01vZGVzIHdpdGggZHR5cGUgaW5mby4KICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGR0eXBlcyA9IFtdOwogICAgICAgICAgICAgICAgZm9yIChjb25zdCB0ZW5zb3JWYWx1ZSBvZiBleGVjdXRpb24uZGVidWdfdGVuc29yX3ZhbHVlcykgewogICAgICAgICAgICAgICAgICAgIGlmICh0ZW5zb3JWYWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBkdHlwZXMucHVzaChVTktOT1dOX0RUWVBFX05BTUUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBkdHlwZUVudW0gPSBTdHJpbmcoZXhlY3V0aW9uLnRlbnNvcl9kZWJ1Z19tb2RlID09PSBUZW5zb3JEZWJ1Z01vZGUuRlVMTF9IRUFMVEgKICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGVuc29yVmFsdWVbMl0gLy8gdGVuc29yX2RlYnVnX21vZGU6IEZVTExfSEVBTFRICiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRlbnNvclZhbHVlWzFdIC8vIHRlbnNvcl9kZWJ1Z19tb2RlOiBTSEFQRQogICAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICAgICBkdHlwZXMucHVzaChEVFlQRV9FTlVNX1RPX05BTUVbZHR5cGVFbnVtXSB8fCBVTktOT1dOX0RUWVBFX05BTUUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBkdHlwZXM7CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgIH0KICAgIH0KICAgIEV4ZWN1dGlvbkRhdGFDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RmLWRlYnVnZ2VyLXYyLWV4ZWN1dGlvbi1kYXRhJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGV4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudAogICAgICBbZm9jdXNlZEV4ZWN1dGlvbkluZGV4XT0iZm9jdXNlZEV4ZWN1dGlvbkluZGV4IgogICAgICBbZm9jdXNlZEV4ZWN1dGlvbkRhdGFdPSJmb2N1c2VkRXhlY3V0aW9uRGF0YSQgfCBhc3luYyIKICAgICAgW3RlbnNvckRlYnVnTW9kZV09InRlbnNvckRlYnVnTW9kZSQgfCBhc3luYyIKICAgICAgW2hhc0RlYnVnVGVuc29yVmFsdWVzXT0iaGFzRGVidWdUZW5zb3JWYWx1ZXMkIHwgYXN5bmMiCiAgICAgIFtkZWJ1Z1RlbnNvclZhbHVlc109ImRlYnVnVGVuc29yVmFsdWVzJCB8IGFzeW5jIgogICAgICBbZGVidWdUZW5zb3JEdHlwZXNdPSJkZWJ1Z1RlbnNvckR0eXBlcyQgfCBhc3luYyIKICAgID48L2V4ZWN1dGlvbi1kYXRhLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBFeGVjdXRpb25EYXRhQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIEV4ZWN1dGlvbkRhdGFDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZm9jdXNlZEV4ZWN1dGlvbkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBFeGVjdXRpb25EYXRhQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBFeGVjdXRpb25EYXRhQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRXhlY3V0aW9uRGF0YUNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBFeGVjdXRpb25EYXRhQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRmLWRlYnVnZ2VyLXYyLWV4ZWN1dGlvbi1kYXRhIl1dLCBpbnB1dHM6IHsgZm9jdXNlZEV4ZWN1dGlvbkluZGV4OiAiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IiB9LCBkZWNsczogNiwgdmFyczogMTYsIGNvbnN0czogW1szLCAiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IiwgImZvY3VzZWRFeGVjdXRpb25EYXRhIiwgInRlbnNvckRlYnVnTW9kZSIsICJoYXNEZWJ1Z1RlbnNvclZhbHVlcyIsICJkZWJ1Z1RlbnNvclZhbHVlcyIsICJkZWJ1Z1RlbnNvckR0eXBlcyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEV4ZWN1dGlvbkRhdGFDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJleGVjdXRpb24tZGF0YS1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDUsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImZvY3VzZWRFeGVjdXRpb25JbmRleCIsIGN0eC5mb2N1c2VkRXhlY3V0aW9uSW5kZXgpKCJmb2N1c2VkRXhlY3V0aW9uRGF0YSIsIMm1ybVwaXBlQmluZDEoMSwgNiwgY3R4LmZvY3VzZWRFeGVjdXRpb25EYXRhJCkpKCJ0ZW5zb3JEZWJ1Z01vZGUiLCDJtcm1cGlwZUJpbmQxKDIsIDgsIGN0eC50ZW5zb3JEZWJ1Z01vZGUkKSkoImhhc0RlYnVnVGVuc29yVmFsdWVzIiwgybXJtXBpcGVCaW5kMSgzLCAxMCwgY3R4Lmhhc0RlYnVnVGVuc29yVmFsdWVzJCkpKCJkZWJ1Z1RlbnNvclZhbHVlcyIsIMm1ybVwaXBlQmluZDEoNCwgMTIsIGN0eC5kZWJ1Z1RlbnNvclZhbHVlcyQpKSgiZGVidWdUZW5zb3JEdHlwZXMiLCDJtcm1cGlwZUJpbmQxKDUsIDE0LCBjdHguZGVidWdUZW5zb3JEdHlwZXMkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbRXhlY3V0aW9uRGF0YUNvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL3RpbWVsaW5lL3RpbWVsaW5lX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBUaW1lbGluZUNvbXBvbmVudF9kaXZfNl9tYXRfc2xpZGVyXzdfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I1ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXNsaWRlciIsIDExKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzZfbWF0X3NsaWRlcl83X1RlbXBsYXRlX21hdF9zbGlkZXJfaW5wdXRfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNSk7IGNvbnN0IGN0eF9yNCA9IMm1ybVuZXh0Q29udGV4dCgyKTsgcmV0dXJuIGN0eF9yNC5vblNsaWRlckNoYW5nZS5lbWl0KCRldmVudC52YWx1ZSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJtaW4iLCAwKSgibWF4IiwgY3R4X3IzLnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0KSgidmFsdWUiLCBjdHhfcjMuc2Nyb2xsQmVnaW5JbmRleCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNyA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImJ1dHRvbiIsIDcpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBUaW1lbGluZUNvbXBvbmVudF9kaXZfNl9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMV9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yNyk7IGNvbnN0IGN0eF9yNiA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I2Lm9uTmF2aWdhdGVMZWZ0LmVtaXQoKTsgfSk7CiAgICAgICAgybXJtXRleHQoMiwgIiA8ICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgOCk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJidXR0b24iLCA5KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfZGl2XzZfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzVfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjcpOyBjb25zdCBjdHhfcjggPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yOC5vbk5hdmlnYXRlUmlnaHQuZW1pdCgpOyB9KTsKICAgICAgICDJtcm1dGV4dCg2LCAiID4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNywgVGltZWxpbmVDb21wb25lbnRfZGl2XzZfbWF0X3NsaWRlcl83X1RlbXBsYXRlLCAxLCAzLCAibWF0LXNsaWRlciIsIDEwKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTMoIiAiLCBjdHhfcjAuc2Nyb2xsQmVnaW5JbmRleCwgIiB+ICIsIGN0eF9yMC5zY3JvbGxCZWdpbkluZGV4ICsgY3R4X3IwLmRpc3BsYXlDb3VudCAtIDEsICIgb2YgIiwgY3R4X3IwLm51bUV4ZWN1dGlvbnMsICIgIik7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IwLnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0ID4gMCk7CiAgICB9IH0KICAgIGNvbnN0IF9jMCRmID0gZnVuY3Rpb24gKGEwLCBhMSwgYTIpIHsgcmV0dXJuIFthMCwgYTEsIGEyXTsgfTsKICAgIGZ1bmN0aW9uIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl83X2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTMgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxNCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl83X2Rpdl8xX1RlbXBsYXRlX2Rpdl9jbGlja18wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxMyk7IGNvbnN0IGlfcjExID0gY3R4LmluZGV4OyBjb25zdCBjdHhfcjEyID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3IxMi5vbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQuZW1pdChpX3IxMSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDE1KTsKICAgICAgICDJtcm1dGV4dCgyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBkaXNwbGF5RGlnZXN0X3IxMCA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgaV9yMTEgPSBjdHguaW5kZXg7CiAgICAgICAgY29uc3QgY3R4X3I5ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJ0aXRsZSIsIGRpc3BsYXlEaWdlc3RfcjEwLm9wX3R5cGUpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24zKDMsIF9jMCRmLCBkaXNwbGF5RGlnZXN0X3IxMC5pc19ncmFwaCA/ICJmdW5jLWdyYXBoLWV4ZWN1dGlvbiIgOiAiIiwgaV9yMTEgPT09IGN0eF9yOS5mb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4ID8gImZvY3VzZWQiIDogIiIsIGN0eF9yOS5kaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXNbaV9yMTFdIHx8ICIiKSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBkaXNwbGF5RGlnZXN0X3IxMC5zaG9ydF9vcF90eXBlLCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBUaW1lbGluZUNvbXBvbmVudF9kaXZfN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMik7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl83X2Rpdl8xX1RlbXBsYXRlLCAzLCA3LCAiZGl2IiwgMTMpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHhfcjEuZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBUaW1lbGluZUNvbXBvbmVudF9uZ19jb250YWluZXJfOF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDApOwogICAgICAgIMm1ybVlbGVtZW50KDEsICJ0Zi1kZWJ1Z2dlci12Mi1leGVjdXRpb24tZGF0YSIsIDE2KTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCBjdHhfcjIuZm9jdXNlZEV4ZWN1dGlvbkluZGV4KTsKICAgIH0gfQogICAgY2xhc3MgVGltZWxpbmVDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLmFjdGl2ZVJ1bklkID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5sb2FkaW5nTnVtRXhlY3V0aW9ucyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLm51bUV4ZWN1dGlvbnMgPSAwOwogICAgICAgICAgICB0aGlzLnNjcm9sbEJlZ2luSW5kZXggPSAwOwogICAgICAgICAgICB0aGlzLnNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0ID0gMDsKICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUNvdW50ID0gMDsKICAgICAgICAgICAgdGhpcy5kaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyA9IFtdOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyA9IFtdOwogICAgICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25JbmRleCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZEV4ZWN1dGlvbkRhdGEgPSBudWxsOwogICAgICAgICAgICB0aGlzLm9uTmF2aWdhdGVMZWZ0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uTmF2aWdhdGVSaWdodCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25TbGlkZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgfQogICAgVGltZWxpbmVDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RpbWVsaW5lLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3RpbWVsaW5lX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi90aW1lbGluZV9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBUaW1lbGluZUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBhY3RpdmVSdW5JZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbG9hZGluZ051bUV4ZWN1dGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bUV4ZWN1dGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNjcm9sbEJlZ2luSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBwYWdlU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzcGxheUNvdW50OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkaXNwbGF5RXhlY3V0aW9uRGlnZXN0czogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZvY3VzZWRFeGVjdXRpb25EYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvbk5hdmlnYXRlTGVmdDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uTmF2aWdhdGVSaWdodDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uU2xpZGVyQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGltZWxpbmVDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBUaW1lbGluZUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUaW1lbGluZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUaW1lbGluZUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBUaW1lbGluZUNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0aW1lbGluZS1jb21wb25lbnQiXV0sIGlucHV0czogeyBhY3RpdmVSdW5JZDogImFjdGl2ZVJ1bklkIiwgbG9hZGluZ051bUV4ZWN1dGlvbnM6ICJsb2FkaW5nTnVtRXhlY3V0aW9ucyIsIG51bUV4ZWN1dGlvbnM6ICJudW1FeGVjdXRpb25zIiwgc2Nyb2xsQmVnaW5JbmRleDogInNjcm9sbEJlZ2luSW5kZXgiLCBzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdDogInNjcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0IiwgcGFnZVNpemU6ICJwYWdlU2l6ZSIsIGRpc3BsYXlDb3VudDogImRpc3BsYXlDb3VudCIsIGRpc3BsYXlFeGVjdXRpb25EaWdlc3RzOiAiZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMiLCBkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXM6ICJkaXNwbGF5Rm9jdXNlZEFsZXJ0VHlwZXMiLCBmb2N1c2VkRXhlY3V0aW9uSW5kZXg6ICJmb2N1c2VkRXhlY3V0aW9uSW5kZXgiLCBmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4OiAiZm9jdXNlZEV4ZWN1dGlvbkRpc3BsYXlJbmRleCIsIGZvY3VzZWRFeGVjdXRpb25EYXRhOiAiZm9jdXNlZEV4ZWN1dGlvbkRhdGEiIH0sIG91dHB1dHM6IHsgb25OYXZpZ2F0ZUxlZnQ6ICJvbk5hdmlnYXRlTGVmdCIsIG9uTmF2aWdhdGVSaWdodDogIm9uTmF2aWdhdGVSaWdodCIsIG9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZDogIm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCIsIG9uU2xpZGVyQ2hhbmdlOiAib25TbGlkZXJDaGFuZ2UiIH0sIGRlY2xzOiA5LCB2YXJzOiA0LCBjb25zdHM6IFtbMSwgInRpbWVsaW5lLXRpdGxlIl0sIFsxLCAiZXhlY3V0aW9uLWNvdW50Il0sIFsxLCAidG9wLWxldmVsLWV4ZWN1dGlvbnMiXSwgWyJjbGFzcyIsICJuYXZpZ2F0aW9uLXNlY3Rpb24iLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImV4ZWN1dGlvbi10aW1lbGluZSIsIDQsICJuZ0lmIl0sIFs0LCAibmdJZiJdLCBbMSwgIm5hdmlnYXRpb24tc2VjdGlvbiJdLCBbIm1hdC1idXR0b24iLCAiIiwgMSwgIm5hdmlnYXRpb24tYnV0dG9uLWxlZnQiLCAzLCAiY2xpY2siXSwgWzEsICJuYXZpZ2F0aW9uLXBvc2l0aW9uLWluZm8iXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDEsICJuYXZpZ2F0aW9uLWJ1dHRvbi1yaWdodCIsIDMsICJjbGljayJdLCBbImNsYXNzIiwgInRpbWVsaW5lLXNsaWRlciIsICJzdGVwIiwgIjEiLCAzLCAibWluIiwgIm1heCIsICJ2YWx1ZSIsICJpbnB1dCIsIDQsICJuZ0lmIl0sIFsic3RlcCIsICIxIiwgMSwgInRpbWVsaW5lLXNsaWRlciIsIDMsICJtaW4iLCAibWF4IiwgInZhbHVlIiwgImlucHV0Il0sIFsxLCAiZXhlY3V0aW9uLXRpbWVsaW5lIl0sIFszLCAiY2xpY2siLCA0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMywgImNsaWNrIl0sIFsxLCAiZXhlY3V0aW9uLWRpZ2VzdCIsIDMsICJuZ0NsYXNzIiwgInRpdGxlIl0sIFszLCAiZm9jdXNlZEV4ZWN1dGlvbkluZGV4Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gVGltZWxpbmVDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtXRleHQoMiwgIiBQeXRob24gRXhlY3V0aW9uIFRpbWVsaW5lICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDYsIFRpbWVsaW5lQ29tcG9uZW50X2Rpdl82X1RlbXBsYXRlLCA4LCA0LCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg3LCBUaW1lbGluZUNvbXBvbmVudF9kaXZfN19UZW1wbGF0ZSwgMiwgMSwgImRpdiIsIDQpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoOCwgVGltZWxpbmVDb21wb25lbnRfbmdfY29udGFpbmVyXzhfVGVtcGxhdGUsIDIsIDEsICJuZy1jb250YWluZXIiLCA1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgKCIsIGN0eC5udW1FeGVjdXRpb25zLCAiKSAiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5udW1FeGVjdXRpb25zKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5udW1FeGVjdXRpb25zKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5hY3RpdmVSdW5JZCAhPT0gbnVsbCAmJiBjdHguZm9jdXNlZEV4ZWN1dGlvbkluZGV4ICE9PSBudWxsKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0lmLCBNYXRCdXR0b24sIE1hdFNsaWRlciwgTmdGb3JPZiwgTmdDbGFzcywgRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl0sIHN0eWxlczogWyIuZXhlY3V0aW9uLWRpZ2VzdFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZTNlNWU4O1xuICBib3JkZXI6IDFweCBzb2xpZCAjYzBjMGMwO1xuICBjb2xvcjogIzQyNTA2NjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGhlaWdodDogMTVweDtcbiAgcGFkZGluZzogMXB4O1xuICB0ZXh0LWFsaWduOiBjZW50ZXI7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdpZHRoOiAxMnB4O1xufVxuXG4uZXhlY3V0aW9uLWRpZ2VzdC5mdW5jLWdyYXBoLWV4ZWN1dGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjYzdkYmY1O1xuICBjb2xvcjogIzRlNTY2NDtcbiAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7XG59XG5cbi5leGVjdXRpb24tZGlnZXN0LmZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZDRiMztcbiAgYm9yZGVyOiAxcHggc29saWQgIzAwMDtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG59XG5cbi5leGVjdXRpb24tZGlnZXN0LkluZk5hbkFsZXJ0W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlNTI1OTI7XG4gIGNvbG9yOiAjZmZmO1xufVxuXG5cbi5leGVjdXRpb24tZGlnZXN0W19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciB7XG4gIGJvcmRlcjogMXB4IHNvbGlkICMwMDA7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZXhlY3V0aW9uLXRpbWVsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgd2lkdGg6IDEwMCU7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgbWFyZ2luLWJvdHRvbTogNXB4O1xufVxuXG4udGltZWxpbmUtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiA0OHB4O1xuICBsZWZ0OiAzNDBweDsgXG4gIHBhZGRpbmc6IDA7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgcmlnaHQ6IDQwcHg7XG59XG5cbiAgLnRpbWVsaW5lLXNsaWRlciAubWF0LXNsaWRlci10aHVtYiB7XG4gIGJvcmRlci1yYWRpdXM6IDVweDtcbiAgcmlnaHQ6IC00MHB4O1xuICB3aWR0aDogODBweDtcbn1cblxuXG4ubmF2aWdhdGlvbi1wb3NpdGlvbi1pbmZvW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1mbGV4O1xuICBmb250LXNpemU6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiBub3JtYWw7XG4gIG1heC13aWR0aDogMjAwcHg7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbiAgcGFkZGluZy1yaWdodDogMTBweDtcbiAgdGV4dC1hbGlnbjogY2VudGVyO1xuICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlO1xufVxuXG4ubmF2aWdhdGlvbi1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGhlaWdodDogNDhweDtcbiAgbGluZS1oZWlnaHQ6IDQ4cHg7XG4gIHBvc2l0aW9uOiByZWxhdGl2ZTtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2lkdGg6IDEwMCU7XG59Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL3RpbWVsaW5lL3RpbWVsaW5lX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBGVU5DVElPTl9PUF9UWVBFX1BSRUZJWEVTID0gWwogICAgICAgICdfX2ZvcndhcmRfJywKICAgICAgICAnX19iYWNrd2FyZF8nLAogICAgICAgICdfX2luZmVyZW5jZV8nLAogICAgXTsKICAgIC8qKgogICAgICogR2V0IGEgZGlzcGxheSB2ZXJzaW9uIG9mIHRoZSBleGVjdXRpb24gZGlnZXN0LgogICAgICogQHBhcmFtIHs/fSBleGVjdXRpb25EaWdlc3QKICAgICAqIEBwYXJhbSB7Pz19IHN0ckxlbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0RXhlY3V0aW9uRGlnZXN0Rm9yRGlzcGxheShleGVjdXRpb25EaWdlc3QsIHN0ckxlbiA9IDEpIHsKICAgICAgICBpZiAoIWV4ZWN1dGlvbkRpZ2VzdCkgewogICAgICAgICAgICAvLyBUaGUgZXhlY3V0aW9uIGRpZ2VzdCBhdCB0aGlzIGluZGV4IGhhc24ndCBiZWVuIGxvYWRlZCBmcm9tIHRoZSBkYXRhIHNvdXJjZS4KICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9wX3R5cGU6ICcoTi9BKScsCiAgICAgICAgICAgICAgICBzaG9ydF9vcF90eXBlOiAnLi4nLAogICAgICAgICAgICAgICAgaXNfZ3JhcGg6IGZhbHNlLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZnVuY3Rpb25QcmVmaXhlcyA9IEZVTkNUSU9OX09QX1RZUEVfUFJFRklYRVMuZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IHByZWZpeAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKHByZWZpeCkgPT4gZXhlY3V0aW9uRGlnZXN0Lm9wX3R5cGUuc3RhcnRzV2l0aChwcmVmaXgpKSk7CiAgICAgICAgaWYgKGZ1bmN0aW9uUHJlZml4ZXMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIFRoaXMgaXMgdGhlIGV4ZWN1dGlvbiBvZiBhIHRmLmZ1bmN0aW9uIChGdW5jR3JhcGgpLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZ1bmN0aW9uTmFtZVdpdGhTdWZmaXggPSBleGVjdXRpb25EaWdlc3Qub3BfdHlwZS5zbGljZShmdW5jdGlvblByZWZpeGVzWzBdLmxlbmd0aCk7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBvcF90eXBlOiBleGVjdXRpb25EaWdlc3Qub3BfdHlwZSwKICAgICAgICAgICAgICAgIHNob3J0X29wX3R5cGU6IGZ1bmN0aW9uTmFtZVdpdGhTdWZmaXguc2xpY2UoMCwgc3RyTGVuKSwKICAgICAgICAgICAgICAgIGlzX2dyYXBoOiB0cnVlLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICBlbHNlIHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG9wX3R5cGU6IGV4ZWN1dGlvbkRpZ2VzdC5vcF90eXBlLAogICAgICAgICAgICAgICAgc2hvcnRfb3BfdHlwZTogZXhlY3V0aW9uRGlnZXN0Lm9wX3R5cGUuc2xpY2UoMCwgc3RyTGVuKSwKICAgICAgICAgICAgICAgIGlzX2dyYXBoOiBmYWxzZSwKICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBUaW1lbGluZUNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5hY3RpdmVSdW5JZCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSk7CiAgICAgICAgICAgIHRoaXMubG9hZGluZ051bUV4ZWN1dGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXROdW1FeGVjdXRpb25zTG9hZGVkLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbG9hZGVkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobG9hZGVkKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gbG9hZGVkLnN0YXRlID09IERhdGFMb2FkU3RhdGUuTE9BRElORzsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgICAgIHRoaXMuc2Nyb2xsQmVnaW5JbmRleCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEV4ZWN1dGlvblNjcm9sbEJlZ2luSW5kZXgpKTsKICAgICAgICAgICAgdGhpcy5zY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldE51bUV4ZWN1dGlvbnMsIGdldERpc3BsYXlDb3VudCwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG51bUV4ZWN1dGlvbnMKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaXNwbGF5Q291bnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChudW1FeGVjdXRpb25zLCBkaXNwbGF5Q291bnQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCgwLCBudW1FeGVjdXRpb25zIC0gZGlzcGxheUNvdW50KTsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgICAgIHRoaXMucGFnZVNpemUkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRFeGVjdXRpb25QYWdlU2l6ZSkpOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlDb3VudCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldERpc3BsYXlDb3VudCkpOwogICAgICAgICAgICB0aGlzLmRpc3BsYXlFeGVjdXRpb25EaWdlc3RzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0VmlzaWJsZUV4ZWN1dGlvbkRpZ2VzdHMsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2aXNpYmxlRGlnZXN0cwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZpc2libGVEaWdlc3RzKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdmlzaWJsZURpZ2VzdHMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlnZXN0CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZGlnZXN0KSA9PiBnZXRFeGVjdXRpb25EaWdlc3RGb3JEaXNwbGF5KGRpZ2VzdCkpKTsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgICAgIHRoaXMuZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0Rm9jdXNBbGVydFR5cGVzT2ZWaXNpYmxlRXhlY3V0aW9uRGlnZXN0cykpOwogICAgICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25JbmRleCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRFeGVjdXRpb25JbmRleCkpOwogICAgICAgICAgICB0aGlzLmZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4KSk7CiAgICAgICAgICAgIHRoaXMubnVtRXhlY3V0aW9ucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldE51bUV4ZWN1dGlvbnMpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbk5hdmlnYXRlTGVmdCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChleGVjdXRpb25TY3JvbGxMZWZ0KCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uTmF2aWdhdGVSaWdodCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChleGVjdXRpb25TY3JvbGxSaWdodCgpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25FeGVjdXRpb25EaWdlc3RDbGlja2VkKGluZGV4KSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZXhlY3V0aW9uRGlnZXN0Rm9jdXNlZCh7IGRpc3BsYXlJbmRleDogaW5kZXggfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblNsaWRlckNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGV4ZWN1dGlvblNjcm9sbFRvSW5kZXgoeyBpbmRleDogdmFsdWUgfSkpOwogICAgICAgIH0KICAgIH0KICAgIFRpbWVsaW5lQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi10aW1lbGluZScsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDx0aW1lbGluZS1jb21wb25lbnQKICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiCiAgICAgIFtsb2FkaW5nTnVtRXhlY3V0aW9uc109ImxvYWRpbmdOdW1FeGVjdXRpb25zJCB8IGFzeW5jIgogICAgICBbbnVtRXhlY3V0aW9uc109Im51bUV4ZWN1dGlvbnMkIHwgYXN5bmMiCiAgICAgIFtzY3JvbGxCZWdpbkluZGV4XT0ic2Nyb2xsQmVnaW5JbmRleCQgfCBhc3luYyIKICAgICAgW3Njcm9sbEJlZ2luSW5kZXhVcHBlckxpbWl0XT0ic2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQkIHwgYXN5bmMiCiAgICAgIFtwYWdlU2l6ZV09InBhZ2VTaXplJCB8IGFzeW5jIgogICAgICBbZGlzcGxheUNvdW50XT0iZGlzcGxheUNvdW50JCB8IGFzeW5jIgogICAgICBbZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHNdPSJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyQgfCBhc3luYyIKICAgICAgW2Rpc3BsYXlGb2N1c2VkQWxlcnRUeXBlc109ImRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyQgfCBhc3luYyIKICAgICAgW2ZvY3VzZWRFeGVjdXRpb25JbmRleF09ImZvY3VzZWRFeGVjdXRpb25JbmRleCQgfCBhc3luYyIKICAgICAgW2ZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXhdPSJmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4JCB8IGFzeW5jIgogICAgICAob25OYXZpZ2F0ZUxlZnQpPSJvbk5hdmlnYXRlTGVmdCgpIgogICAgICAob25OYXZpZ2F0ZVJpZ2h0KT0ib25OYXZpZ2F0ZVJpZ2h0KCkiCiAgICAgIChvbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQpPSJvbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQoJGV2ZW50KSIKICAgICAgKG9uU2xpZGVyQ2hhbmdlKT0ib25TbGlkZXJDaGFuZ2UoJGV2ZW50KSIKICAgID48L3RpbWVsaW5lLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUaW1lbGluZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGltZWxpbmVDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUaW1lbGluZUNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRpbWVsaW5lQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFRpbWVsaW5lQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRmLWRlYnVnZ2VyLXYyLXRpbWVsaW5lIl1dLCBkZWNsczogMTIsIHZhcnM6IDMzLCBjb25zdHM6IFtbMywgImFjdGl2ZVJ1bklkIiwgImxvYWRpbmdOdW1FeGVjdXRpb25zIiwgIm51bUV4ZWN1dGlvbnMiLCAic2Nyb2xsQmVnaW5JbmRleCIsICJzY3JvbGxCZWdpbkluZGV4VXBwZXJMaW1pdCIsICJwYWdlU2l6ZSIsICJkaXNwbGF5Q291bnQiLCAiZGlzcGxheUV4ZWN1dGlvbkRpZ2VzdHMiLCAiZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzIiwgImZvY3VzZWRFeGVjdXRpb25JbmRleCIsICJmb2N1c2VkRXhlY3V0aW9uRGlzcGxheUluZGV4IiwgIm9uTmF2aWdhdGVMZWZ0IiwgIm9uTmF2aWdhdGVSaWdodCIsICJvbkV4ZWN1dGlvbkRpZ2VzdENsaWNrZWQiLCAib25TbGlkZXJDaGFuZ2UiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAidGltZWxpbmUtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigib25OYXZpZ2F0ZUxlZnQiLCBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9UZW1wbGF0ZV90aW1lbGluZV9jb21wb25lbnRfb25OYXZpZ2F0ZUxlZnRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbk5hdmlnYXRlTGVmdCgpOyB9KSgib25OYXZpZ2F0ZVJpZ2h0IiwgZnVuY3Rpb24gVGltZWxpbmVDb250YWluZXJfVGVtcGxhdGVfdGltZWxpbmVfY29tcG9uZW50X29uTmF2aWdhdGVSaWdodF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uTmF2aWdhdGVSaWdodCgpOyB9KSgib25FeGVjdXRpb25EaWdlc3RDbGlja2VkIiwgZnVuY3Rpb24gVGltZWxpbmVDb250YWluZXJfVGVtcGxhdGVfdGltZWxpbmVfY29tcG9uZW50X29uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uRXhlY3V0aW9uRGlnZXN0Q2xpY2tlZCgkZXZlbnQpOyB9KSgib25TbGlkZXJDaGFuZ2UiLCBmdW5jdGlvbiBUaW1lbGluZUNvbnRhaW5lcl9UZW1wbGF0ZV90aW1lbGluZV9jb21wb25lbnRfb25TbGlkZXJDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblNsaWRlckNoYW5nZSgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDUsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg2LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDgsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg5LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMTAsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgxMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiYWN0aXZlUnVuSWQiLCDJtcm1cGlwZUJpbmQxKDEsIDExLCBjdHguYWN0aXZlUnVuSWQkKSkoImxvYWRpbmdOdW1FeGVjdXRpb25zIiwgybXJtXBpcGVCaW5kMSgyLCAxMywgY3R4LmxvYWRpbmdOdW1FeGVjdXRpb25zJCkpKCJudW1FeGVjdXRpb25zIiwgybXJtXBpcGVCaW5kMSgzLCAxNSwgY3R4Lm51bUV4ZWN1dGlvbnMkKSkoInNjcm9sbEJlZ2luSW5kZXgiLCDJtcm1cGlwZUJpbmQxKDQsIDE3LCBjdHguc2Nyb2xsQmVnaW5JbmRleCQpKSgic2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQiLCDJtcm1cGlwZUJpbmQxKDUsIDE5LCBjdHguc2Nyb2xsQmVnaW5JbmRleFVwcGVyTGltaXQkKSkoInBhZ2VTaXplIiwgybXJtXBpcGVCaW5kMSg2LCAyMSwgY3R4LnBhZ2VTaXplJCkpKCJkaXNwbGF5Q291bnQiLCDJtcm1cGlwZUJpbmQxKDcsIDIzLCBjdHguZGlzcGxheUNvdW50JCkpKCJkaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyIsIMm1ybVwaXBlQmluZDEoOCwgMjUsIGN0eC5kaXNwbGF5RXhlY3V0aW9uRGlnZXN0cyQpKSgiZGlzcGxheUZvY3VzZWRBbGVydFR5cGVzIiwgybXJtXBpcGVCaW5kMSg5LCAyNywgY3R4LmRpc3BsYXlGb2N1c2VkQWxlcnRUeXBlcyQpKSgiZm9jdXNlZEV4ZWN1dGlvbkluZGV4IiwgybXJtXBpcGVCaW5kMSgxMCwgMjksIGN0eC5mb2N1c2VkRXhlY3V0aW9uSW5kZXgkKSkoImZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgiLCDJtcm1cGlwZUJpbmQxKDExLCAzMSwgY3R4LmZvY3VzZWRFeGVjdXRpb25EaXNwbGF5SW5kZXgkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbVGltZWxpbmVDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2dyYXBoL2dyYXBoX29wX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBHcmFwaE9wQ29tcG9uZW50X2Rpdl81X3NwYW5fMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoMSwgIiBPdXRwdXQgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhPcENvbXBvbmVudF9kaXZfNV9zcGFuXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIpOwogICAgICAgIMm1ybV0ZXh0KDEsICIgSW5wdXQgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhPcENvbXBvbmVudF9kaXZfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA2KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgNyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIEdyYXBoT3BDb21wb25lbnRfZGl2XzVfc3Bhbl8yX1RlbXBsYXRlLCAyLCAwLCAic3BhbiIsIDgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBHcmFwaE9wQ29tcG9uZW50X2Rpdl81X3NwYW5fM19UZW1wbGF0ZSwgMiwgMCwgInNwYW4iLCA4KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoIiwgY3R4X3IwLmtpbmQpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgImlucHV0Iik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCAiY29uc3VtZXIiKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIHNsb3Q6ICIsIGN0eF9yMC5zbG90LCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBHcmFwaE9wQ29tcG9uZW50X2Rpdl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDkpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yMS5vcERhdGEub3BfdHlwZSwgIiAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhPcENvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxMCk7CiAgICAgICAgybXJtXRleHQoMSwgIiAoT3AgaW5mbyB1bmF2YWlsYWJsZS4pICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGNvbnN0IF9jMCRnID0gZnVuY3Rpb24gKGEwKSB7IHJldHVybiBbYTBdOyB9OwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBHcmFwaE9wQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5vbk9wTmFtZUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgIH0KICAgIEdyYXBoT3BDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2dyYXBoLW9wJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2dyYXBoX29wX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9ncmFwaF9vcF9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBHcmFwaE9wQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGtpbmQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9wTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2xvdDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb3BEYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvbk9wTmFtZUNsaWNrOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gR3JhcGhPcENvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEdyYXBoT3BDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR3JhcGhPcENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaE9wQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEdyYXBoT3BDb21wb25lbnQsIHNlbGVjdG9yczogW1siZ3JhcGgtb3AiXV0sIGlucHV0czogeyBraW5kOiAia2luZCIsIG9wTmFtZTogIm9wTmFtZSIsIHNsb3Q6ICJzbG90Iiwgb3BEYXRhOiAib3BEYXRhIiB9LCBvdXRwdXRzOiB7IG9uT3BOYW1lQ2xpY2s6ICJvbk9wTmFtZUNsaWNrIiB9LCBkZWNsczogOSwgdmFyczogNywgY29uc3RzOiBbWzEsICJvcC1jb250YWluZXIiXSwgWzEsICJpbnB1dC10ZW5zb3ItbmFtZSJdLCBbMSwgIm9wLW5hbWUiLCAzLCAibmdDbGFzcyIsICJjbGljayJdLCBbImNsYXNzIiwgInNsb3QiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgIm9wLXR5cGUiLCA0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbIm9wSW5mb01pc3NpbmciLCAiIl0sIFsxLCAic2xvdCJdLCBbMywgIm5nU3dpdGNoIl0sIFs0LCAibmdTd2l0Y2hDYXNlIl0sIFsxLCAib3AtdHlwZSJdLCBbMSwgIm9wLWluZm8tbWlzc2luZyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEdyYXBoT3BDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImJ1dHRvbiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiYnV0dG9uIiwgMik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBHcmFwaE9wQ29tcG9uZW50X1RlbXBsYXRlX2J1dHRvbl9jbGlja18yX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uT3BOYW1lQ2xpY2suZW1pdCh7IG9wX25hbWU6IGN0eC5vcE5hbWUgfSk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNSwgR3JhcGhPcENvbXBvbmVudF9kaXZfNV9UZW1wbGF0ZSwgNSwgNCwgImRpdiIsIDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNiwgR3JhcGhPcENvbXBvbmVudF9kaXZfNl9UZW1wbGF0ZSwgMiwgMSwgImRpdiIsIDQpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNywgR3JhcGhPcENvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCA1LCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICBjb25zdCBfcjIgPSDJtcm1cmVmZXJlbmNlKDgpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjEoNSwgX2MwJGcsIGN0eC5raW5kID09PSAic2VsZiIgPyAic2VsZi1vcC1uYW1lIiA6ICIiKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eC5vcE5hbWUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmtpbmQgIT09ICJzZWxmIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgub3BEYXRhICE9PSB1bmRlZmluZWQpKCJuZ0lmRWxzZSIsIF9yMik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdDbGFzcywgTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZV0sIHN0eWxlczogWyIub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IDJweCBzb2xpZCAjYzZjYWQxO1xuICBib3JkZXItcmFkaXVzOiA0cHg7XG4gIGJveC1zaGFkb3c6IDFweCAzcHggI2VlZTtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBtYXJnaW46IDAgNXB4IDAgMDtcbiAgcGFkZGluZzogMnB4IDZweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHdpZHRoOiAyMDBweDtcbn1cblxuLm9wLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMge1xuICBvdXRsaW5lOiAwO1xufVxuXG4ub3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciB7XG4gIGJvcmRlcjogMnB4IHNvbGlkICNmZmQzYjI7XG59XG5cbi5vcC1pbmZvLW1pc3NpbmdbX25nY29udGVudC0lQ09NUCVdIHtcbiAgY29sb3I6ICM4MDgwODA7XG59XG5cbi5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBib3JkZXI6IG5vbmU7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBvdmVyZmxvdy13cmFwOiBhbnl3aGVyZTtcbiAgcGFkZGluZzogMDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB3aGl0ZS1zcGFjZTogcHJlLXdyYXA7XG59XG5cbi5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyB7XG4gIG91dGxpbmU6IDA7XG59XG5cbi5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LWZhbWlseTogJ1JvYm90byBNb25vJywgbW9ub3NwYWNlO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGhlaWdodDogMTRweDtcbiAgbGluZS1oZWlnaHQ6IDE0cHg7XG4gIG1hcmdpbi10b3A6IDNweDtcbiAgcGFkZGluZzogMXB4IDNweDtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xufVxuXG4uc2VsZi1vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICB0ZXh0LWRlY29yYXRpb246IG5vbmU7XG59XG5cbi5zbG90W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGNvbG9yOiAjNzA3MDcwO1xufSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGgvZ3JhcGhfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGZ1bmN0aW9uIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl8xX2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTUgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTQpOwogICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZ3JhcGgtb3AiLCAxNSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJvbk9wTmFtZUNsaWNrIiwgZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzFfZGl2XzJfVGVtcGxhdGVfZ3JhcGhfb3Bfb25PcE5hbWVDbGlja18zX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxNSk7IGNvbnN0IGN0eF9yMTQgPSDJtcm1bmV4dENvbnRleHQoMyk7IHJldHVybiBjdHhfcjE0Lm9uR3JhcGhPcE5hdmlnYXRlLmVtaXQoeyBvcF9uYW1lOiAkZXZlbnQub3BfbmFtZSwgZ3JhcGhfaWQ6IGN0eF9yMTQuZ3JhcGhJZCB9KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgaW5wdXRPcEluZm9fcjEyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBzbG90X3IxMyA9IGN0eC5pbmRleDsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiSW5wdXQgc2xvdCAiLCBzbG90X3IxMywgIjoiKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoImtpbmQiLCAiaW5wdXQiKSgib3BOYW1lIiwgaW5wdXRPcEluZm9fcjEyLm9wX25hbWUpKCJzbG90IiwgaW5wdXRPcEluZm9fcjEyLm91dHB1dF9zbG90KSgib3BEYXRhIiwgaW5wdXRPcEluZm9fcjEyLmRhdGEpOwogICAgfSB9CiAgICBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9kaXZfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2Iik7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl8xX2Rpdl8yX1RlbXBsYXRlLCA0LCA1LCAiZGl2IiwgMTIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNSA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHhfcjUuaW5wdXRPcHMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE2KTsKICAgICAgICDJtcm1dGV4dCgxLCAiIChUaGlzIG9wIGhhcyBubyBpbnB1dCB0ZW5zb3IuKSAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICB2YXIgSTE4Tl8xOwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfNDk1NTEzMzc0MDg0MTI5OTg1MSQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fXzIgPSBnb29nLmdldE1zZygie1ZBUl9QTFVSQUwsIHBsdXJhbCwgPTAge2NvbnN1bWVyfSA9MSB7Y29uc3VtZXJ9IG90aGVyIHtjb25zdW1lcnN9fSIpOwogICAgICAgIEkxOE5fMSA9IE1TR19FWFRFUk5BTF80OTU1MTMzNzQwODQxMjk5ODUxJCRURU5TT1JCT0FSRF9QTFVHSU5TX0RFQlVHR0VSX1YyX1RGX0RFQlVHR0VSX1YyX1BMVUdJTl9WSUVXU19HUkFQSF9HUkFQSF9DT01QT05FTlRfVFNfX19fMjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMSA9ICRsb2NhbGl6ZSBgOuKQn2ZlNTVmOWIxOTNlYTIwYWFlNWI1NjM1ZTY4ZDkzODY1MDM4NDc3NDbikJ80OTU1MTMzNzQwODQxMjk5ODUxOntWQVJfUExVUkFMLCBwbHVyYWwsID0wIHtjb25zdW1lcn0gPTEge2NvbnN1bWVyfSBvdGhlciB7Y29uc3VtZXJzfX1gOwogICAgfQogICAgSTE4Tl8xID0gybXJtWkxOG5Qb3N0cHJvY2VzcyhJMThOXzEsIHsgIlZBUl9QTFVSQUwiOiAiXHVGRkZEMFx1RkZGRCIgfSk7CiAgICB2YXIgSTE4Tl8wJDE7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF81NTU2MzQwMzQzODUwMTY1NTE2JCRURU5TT1JCT0FSRF9QTFVHSU5TX0RFQlVHR0VSX1YyX1RGX0RFQlVHR0VSX1YyX1BMVUdJTl9WSUVXU19HUkFQSF9HUkFQSF9DT01QT05FTlRfVFNfX19fMyA9IGdvb2cuZ2V0TXNnKCIgeyRpY3V9IiwgeyAiaWN1IjogSTE4Tl8xIH0pOwogICAgICAgIEkxOE5fMCQxID0gTVNHX0VYVEVSTkFMXzU1NTYzNDAzNDM4NTAxNjU1MTYkJFRFTlNPUkJPQVJEX1BMVUdJTlNfREVCVUdHRVJfVjJfVEZfREVCVUdHRVJfVjJfUExVR0lOX1ZJRVdTX0dSQVBIX0dSQVBIX0NPTVBPTkVOVF9UU19fX18zOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgSTE4Tl8wJDEgPSAkbG9jYWxpemUgYDrikJ9iYWE0NjBlMmYyYjg1N2UyNjI5MmIyNDZmYzE4YWUwZWE5YjVlNTM34pCfNTU1NjM0MDM0Mzg1MDE2NTUxNjogJHtJMThOXzF9OklDVTpgOwogICAgfQogICAgZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfZGl2XzJfZGl2XzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IyMiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDIyKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJncmFwaC1vcCIsIDE1KTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uT3BOYW1lQ2xpY2siLCBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9kaXZfOF9kaXZfMl9kaXZfNl9UZW1wbGF0ZV9ncmFwaF9vcF9vbk9wTmFtZUNsaWNrXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjIyKTsgY29uc3QgY3R4X3IyMSA9IMm1ybVuZXh0Q29udGV4dCg0KTsgcmV0dXJuIGN0eF9yMjEub25HcmFwaE9wTmF2aWdhdGUuZW1pdCh7IG9wX25hbWU6ICRldmVudC5vcF9uYW1lLCBncmFwaF9pZDogY3R4X3IyMS5ncmFwaElkIH0pOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjb25zdW1lck9wSW5mb19yMjAgPSBjdHguJGltcGxpY2l0OwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgia2luZCIsICJjb25zdW1lciIpKCJvcE5hbWUiLCBjb25zdW1lck9wSW5mb19yMjAub3BfbmFtZSkoInNsb3QiLCBjb25zdW1lck9wSW5mb19yMjAuaW5wdXRfc2xvdCkoIm9wRGF0YSIsIGNvbnN1bWVyT3BJbmZvX3IyMC5kYXRhKTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfZGl2XzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTkpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDIwKTsKICAgICAgICDJtcm1dGV4dCgyKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIik7CiAgICAgICAgybXJtWkxOG4oNCwgSTE4Tl8wJDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoNSwgIikgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNiwgR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfZGl2XzJfZGl2XzZfVGVtcGxhdGUsIDIsIDQsICJkaXYiLCAyMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IHNsb3RDb25zdW1lcnNfcjE3ID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBzbG90X3IxOCA9IGN0eC5pbmRleDsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMigiIE91dHB1dCBzbG90ICIsIHNsb3RfcjE4LCAiOiAoIiwgc2xvdENvbnN1bWVyc19yMTcubGVuZ3RoLCAiICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVpMThuRXhwKHNsb3RDb25zdW1lcnNfcjE3Lmxlbmd0aCk7CiAgICAgICAgybXJtWkxOG5BcHBseSg0KTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBzbG90Q29uc3VtZXJzX3IxNyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl84X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE3KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfZGl2XzJfVGVtcGxhdGUsIDcsIDQsICJkaXYiLCAxOCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I4ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eF9yOC5jb25zdW1lck9wcyk7CiAgICB9IH0KICAgIHZhciBJMThOXzU7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF81MTU2NzEyOTM1MTUwNTg2ODc4JCRURU5TT1JCT0FSRF9QTFVHSU5TX0RFQlVHR0VSX1YyX1RGX0RFQlVHR0VSX1YyX1BMVUdJTl9WSUVXU19HUkFQSF9HUkFQSF9DT01QT05FTlRfVFNfX182ID0gZ29vZy5nZXRNc2coIntWQVJfUExVUkFMLCBwbHVyYWwsID0wIHt0ZW5zb3J9ID0xIHt0ZW5zb3J9IG90aGVyIHt0ZW5zb3JzfX0iKTsKICAgICAgICBJMThOXzUgPSBNU0dfRVhURVJOQUxfNTE1NjcxMjkzNTE1MDU4Njg3OCQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fNjsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fNSA9ICRsb2NhbGl6ZSBgOuKQnzZhYTc1ZjYyN2UwZGMxNjE1MGVmNDQ4NDY0ZTBjODU3YWFhMGRjMTjikJ81MTU2NzEyOTM1MTUwNTg2ODc4OntWQVJfUExVUkFMLCBwbHVyYWwsID0wIHt0ZW5zb3J9ID0xIHt0ZW5zb3J9IG90aGVyIHt0ZW5zb3JzfX1gOwogICAgfQogICAgSTE4Tl81ID0gybXJtWkxOG5Qb3N0cHJvY2VzcyhJMThOXzUsIHsgIlZBUl9QTFVSQUwiOiAiXHVGRkZEMFx1RkZGRCIgfSk7CiAgICB2YXIgSTE4Tl80OwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfMjQ2MDY3MDUzNzM1MTYyNjM0JCRURU5TT1JCT0FSRF9QTFVHSU5TX0RFQlVHR0VSX1YyX1RGX0RFQlVHR0VSX1YyX1BMVUdJTl9WSUVXU19HUkFQSF9HUkFQSF9DT01QT05FTlRfVFNfX183ID0gZ29vZy5nZXRNc2coIiB7JGljdX0iLCB7ICJpY3UiOiBJMThOXzUgfSk7CiAgICAgICAgSTE4Tl80ID0gTVNHX0VYVEVSTkFMXzI0NjA2NzA1MzczNTE2MjYzNCQkVEVOU09SQk9BUkRfUExVR0lOU19ERUJVR0dFUl9WMl9URl9ERUJVR0dFUl9WMl9QTFVHSU5fVklFV1NfR1JBUEhfR1JBUEhfQ09NUE9ORU5UX1RTX19fNzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fNCA9ICRsb2NhbGl6ZSBgOuKQnzg5MzQ3NmMyYzQyMWNlZTQ3NjYzYzk3MzJmYTQxYTc1MGQzYTczZGbikJ8yNDYwNjcwNTM3MzUxNjI2MzQ6ICR7STE4Tl81fTpJQ1U6YDsKICAgIH0KICAgIGZ1bmN0aW9uIEdyYXBoQ29tcG9uZW50X2Rpdl80X25nX3RlbXBsYXRlXzlfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjMpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iKTsKICAgICAgICDJtcm1aTE4bigzLCBJMThOXzQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoNCwgIiBhbmQgbm8gY29uc3VtZXIuKSAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIChUaGlzIG9wIGhhcyAiLCBjdHhfcjEwLm9wSW5mby5jb25zdW1lcnMubGVuZ3RoLCAiIG91dHB1dCAiKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1aTE4bkV4cChjdHhfcjEwLm9wSW5mby5jb25zdW1lcnMubGVuZ3RoKTsKICAgICAgICDJtcm1aTE4bkFwcGx5KDMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjI0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIEdyYXBoQ29tcG9uZW50X2Rpdl80X2Rpdl8xX1RlbXBsYXRlLCAzLCAxLCAiZGl2IiwgNCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIEdyYXBoQ29tcG9uZW50X2Rpdl80X25nX3RlbXBsYXRlXzJfVGVtcGxhdGUsIDIsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDUsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiZGl2IiwgNik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2IiwgNyk7CiAgICAgICAgybXJtXRleHQoNiwgIk9wOiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiZ3JhcGgtb3AiLCA4KTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm9uT3BOYW1lQ2xpY2siLCBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9kaXZfNF9UZW1wbGF0ZV9ncmFwaF9vcF9vbk9wTmFtZUNsaWNrXzdfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjI0KTsgY29uc3QgY3R4X3IyMyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IyMy5vbkdyYXBoT3BOYXZpZ2F0ZS5lbWl0KHsgb3BfbmFtZTogJGV2ZW50Lm9wX25hbWUsIGdyYXBoX2lkOiBjdHhfcjIzLmdyYXBoSWQgfSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoOCwgR3JhcGhDb21wb25lbnRfZGl2XzRfZGl2XzhfVGVtcGxhdGUsIDMsIDEsICJkaXYiLCA5KTsKICAgICAgICDJtcm1dGVtcGxhdGUoOSwgR3JhcGhDb21wb25lbnRfZGl2XzRfbmdfdGVtcGxhdGVfOV9UZW1wbGF0ZSwgNSwgMiwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgMTAsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IF9yNiA9IMm1ybVyZWZlcmVuY2UoMyk7CiAgICAgICAgY29uc3QgX3I5ID0gybXJtXJlZmVyZW5jZSgxMCk7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IwLmlucHV0T3BzLmxlbmd0aCA+IDApKCJuZ0lmRWxzZSIsIF9yNik7CiAgICAgICAgybXJtWFkdmFuY2UoNik7CiAgICAgICAgybXJtXByb3BlcnR5KCJraW5kIiwgInNlbGYiKSgib3BOYW1lIiwgY3R4X3IwLm9wSW5mby5vcF9uYW1lKSgib3BEYXRhIiwgY3R4X3IwLm9wSW5mbyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IwLnRvdGFsTnVtQ29uc3VtZXJzID4gMCkoIm5nSWZFbHNlIiwgX3I5KTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIiwgMjQpOwogICAgICAgIMm1ybV0ZXh0KDEsICIgKE9wIGluZm8gdW5hdmFpbGFibGUuKSAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9uZ190ZW1wbGF0ZV83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDI1KTsKICAgICAgICDJtcm1dGV4dCgxLCAiIE5vIGdyYXBoIG9wIHNlbGVjdGVkLiBDbGljayBhIHRlbnNvciBuYW1lIGluIHRoZSBHcmFwaCBFeGVjdXRpb25zIHRhYmxlIHRvIHZpZXcgdGhlIG5laWdoYm9yaG9vZCBvZiB0aGUgdGVuc29yJ3Mgb3AgaW4gaXRzIGdyYXBoLiAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIEdyYXBoQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5vbkdyYXBoT3BOYXZpZ2F0ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBJRCBvZiB0aGUgaW1tZWRpYXRlbHktZW5jbG9zaW5nIGdyYXBoIG9mIHRoZSBvcC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBncmFwaElkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5vcEluZm8uZ3JhcGhfaWRzW3RoaXMub3BJbmZvLmdyYXBoX2lkcy5sZW5ndGggLSAxXTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVG90YWwgbnVtYmVyIG9mIGNvbnN1bWVycyBvZiBhbGwgb3V0cHV0IHRlbnNvcnMgb2YgdGhlIG9wLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHRvdGFsTnVtQ29uc3VtZXJzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jb25zdW1lck9wcy5yZWR1Y2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvdW50CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2xvdENvbnN1bWVycwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNvdW50LCBzbG90Q29uc3VtZXJzKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY291bnQgKyBzbG90Q29uc3VtZXJzLmxlbmd0aDsKICAgICAgICAgICAgfSksIDApOwogICAgICAgIH0KICAgIH0KICAgIEdyYXBoQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdncmFwaC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9ncmFwaF9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vZ3JhcGhfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgR3JhcGhDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgb3BJbmZvOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpbnB1dE9wczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY29uc3VtZXJPcHM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uR3JhcGhPcE5hdmlnYXRlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gR3JhcGhDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBHcmFwaENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBHcmFwaENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJncmFwaC1jb21wb25lbnQiXV0sIGlucHV0czogeyBvcEluZm86ICJvcEluZm8iLCBpbnB1dE9wczogImlucHV0T3BzIiwgY29uc3VtZXJPcHM6ICJjb25zdW1lck9wcyIgfSwgb3V0cHV0czogeyBvbkdyYXBoT3BOYXZpZ2F0ZTogIm9uR3JhcGhPcE5hdmlnYXRlIiB9LCBkZWNsczogOSwgdmFyczogMiwgY29uc3RzOiBbWzEsICJncmFwaC1zdHJ1Y3R1cmUtY29udGFpbmVyIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbIm9wSW5mb01pc3NpbmciLCAiIl0sIFsibm9PcEZvY3VzZWQiLCAiIl0sIFsiY2xhc3MiLCAiaW5wdXRzLWNvbnRhaW5lciIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibm9JbnB1dHMiLCAiIl0sIFsxLCAic2VsZi1vcC1jb250YWluZXIiXSwgWzEsICJzZWxmLW9wLWhlYWRlciJdLCBbMywgImtpbmQiLCAib3BOYW1lIiwgIm9wRGF0YSIsICJvbk9wTmFtZUNsaWNrIl0sIFsiY2xhc3MiLCAiY29uc3VtZXJzLWNvbnRhaW5lciIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibm9Db25zdW1lcnMiLCAiIl0sIFsxLCAiaW5wdXRzLWNvbnRhaW5lciJdLCBbImNsYXNzIiwgImlucHV0LW9wLXNlY3Rpb24iLCA0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMSwgImlucHV0LW9wLXNlY3Rpb24iXSwgWzEsICJpbnB1dC1zbG90LWhlYWRlciJdLCBbMywgImtpbmQiLCAib3BOYW1lIiwgInNsb3QiLCAib3BEYXRhIiwgIm9uT3BOYW1lQ2xpY2siXSwgWzEsICJpbnB1dHMtY29udGFpbmVyIiwgIm5vLWlucHV0cy1pbmRpY2F0b3IiXSwgWzEsICJjb25zdW1lcnMtY29udGFpbmVyIl0sIFsiY2xhc3MiLCAic2xvdC1jb25zdW1lcnMtY29udGFpbmVyIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJzbG90LWNvbnN1bWVycy1jb250YWluZXIiXSwgWzEsICJzbG90LWNvbnN1bWVycy1oZWFkZXIiXSwgWyJjbGFzcyIsICJjb25zdW1lci1zZWN0aW9uIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJjb25zdW1lci1zZWN0aW9uIl0sIFsxLCAib3AtY29uc3VtZXJzLWNvbnRhaW5lciJdLCBbMSwgIm9wLWluZm8tbWlzc2luZyJdLCBbMSwgIm5vLW9wLWZvY3VzZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBHcmFwaENvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIpOwogICAgICAgICAgICDJtcm1dGV4dCgyLCAiR3JhcGggU3RydWN0dXJlIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNCwgR3JhcGhDb21wb25lbnRfZGl2XzRfVGVtcGxhdGUsIDExLCA3LCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBHcmFwaENvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCAyLCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNywgR3JhcGhDb21wb25lbnRfbmdfdGVtcGxhdGVfN19UZW1wbGF0ZSwgMiwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgMywgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgY29uc3QgX3IzID0gybXJtXJlZmVyZW5jZSg4KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5vcEluZm8gIT09IHVuZGVmaW5lZCAmJiBjdHgub3BJbmZvICE9PSBudWxsKSgibmdJZkVsc2UiLCBfcjMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIEdyYXBoT3BDb21wb25lbnQsIE5nRm9yT2ZdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXSB7XG4gIG92ZXJmbG93LXk6IGF1dG87XG59XG5cbi5jb25zdW1lcnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIHBhZGRpbmctYm90dG9tOiA1cHg7XG4gIG92ZXJmbG93LXg6IGF1dG87XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5jb25zdW1lci1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICBtYXJnaW46IDVweCAwO1xufVxuXG4uZ3JhcGgtc3RydWN0dXJlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEycHg7XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5pbnB1dHMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMCwgMCwgMCwgMC4xMik7XG4gIG1hcmdpbi10b3A6IDVweDtcbiAgb3ZlcmZsb3cteDogYXV0bztcbiAgcGFkZGluZy1ib3R0b206IDA7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5pbnB1dC1vcC1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1yaWdodDogMXB4IHNvbGlkIHJnYigwLCAwLCAwLCAwLjEyKTtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXJnaW4tcmlnaHQ6IDVweDtcbiAgcGFkZGluZy1ib3R0b206IDVweDtcbn1cblxuLmlucHV0LXNsb3QtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMDk5O1xuICBtYXJnaW4tYm90dG9tOiA1cHg7XG59XG5cbi5pbnB1dC10ZW5zb3ItbmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBibG9jaztcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbn1cblxuLm5vLW9wLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdIHtcbiAgY29sb3I6ICM4MDgwODA7XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvJywgQXJpYWwsIEhlbHZldGljYSwgc2Fucy1zZXJpZjtcbiAgZm9udC1zaXplOiAxM3B4O1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4uc2VsZi1vcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIG1hcmdpbi1ib3R0b206IDVweDtcbn1cblxuLnNlbGYtb3AtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2IoMCwgMCwgMCwgMC4xMik7XG4gIHBhZGRpbmctYm90dG9tOiA1cHg7XG59XG5cbi5zbG90LWNvbnN1bWVycy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm9yZGVyLXJpZ2h0OiAxcHggc29saWQgcmdiKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogNXB4O1xuICBwYWRkaW5nLXRvcDogNXB4O1xuICB2ZXJ0aWNhbC1hbGlnbjogdG9wO1xufVxuXG4uc2xvdC1jb25zdW1lcnMtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2dyYXBoL2dyYXBoX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBHcmFwaENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5vcEluZm8kID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkR3JhcGhPcEluZm8pKTsKICAgICAgICAgICAgdGhpcy5pbnB1dE9wcyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRHcmFwaE9wSW5wdXRzKSk7CiAgICAgICAgICAgIHRoaXMuY29uc3VtZXJPcHMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRGb2N1c2VkR3JhcGhPcENvbnN1bWVycykpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkdyYXBoT3BOYXZpZ2F0ZShldmVudCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoT3BGb2N1c2VkKGV2ZW50KSk7CiAgICAgICAgfQogICAgfQogICAgR3JhcGhDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RmLWRlYnVnZ2VyLXYyLWdyYXBoJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGdyYXBoLWNvbXBvbmVudAogICAgICBbb3BJbmZvXT0ib3BJbmZvJCB8IGFzeW5jIgogICAgICBbaW5wdXRPcHNdPSJpbnB1dE9wcyQgfCBhc3luYyIKICAgICAgW2NvbnN1bWVyT3BzXT0iY29uc3VtZXJPcHMkIHwgYXN5bmMiCiAgICAgIChvbkdyYXBoT3BOYXZpZ2F0ZSk9Im9uR3JhcGhPcE5hdmlnYXRlKCRldmVudCkiCiAgICA+PC9ncmFwaC1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgR3JhcGhDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEdyYXBoQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gR3JhcGhDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgR3JhcGhDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBHcmFwaENvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1ncmFwaCJdXSwgZGVjbHM6IDQsIHZhcnM6IDksIGNvbnN0czogW1szLCAib3BJbmZvIiwgImlucHV0T3BzIiwgImNvbnN1bWVyT3BzIiwgIm9uR3JhcGhPcE5hdmlnYXRlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gR3JhcGhDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImdyYXBoLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uR3JhcGhPcE5hdmlnYXRlIiwgZnVuY3Rpb24gR3JhcGhDb250YWluZXJfVGVtcGxhdGVfZ3JhcGhfY29tcG9uZW50X29uR3JhcGhPcE5hdmlnYXRlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25HcmFwaE9wTmF2aWdhdGUoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgib3BJbmZvIiwgybXJtXBpcGVCaW5kMSgxLCAzLCBjdHgub3BJbmZvJCkpKCJpbnB1dE9wcyIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4LmlucHV0T3BzJCkpKCJjb25zdW1lck9wcyIsIMm1ybVwaXBlQmluZDEoMywgNywgY3R4LmNvbnN1bWVyT3BzJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0dyYXBoQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGhfZXhlY3V0aW9ucy9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfZGl2XzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTIpOwogICAgICAgIMm1ybV0ZXh0KDEsICJcdTI1QjYiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICBjb25zdCBfYzAkaCA9IGZ1bmN0aW9uIChhMCwgYTEpIHsgcmV0dXJuIHsgdGVuc29yRGVidWdNb2RlOiBhMCwgYXJyYXk6IGExIH07IH07CiAgICBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfZGl2XzVfZGVidWdfdGVuc29yX3ZhbHVlXzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgImRlYnVnLXRlbnNvci12YWx1ZSIsIDE3KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGlfcjIgPSDJtcm1bmV4dENvbnRleHQoMikuJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yNyA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoImRlYnVnVGVuc29yVmFsdWUiLCBjdHhfcjcucGFyc2VEZWJ1Z1RlbnNvclZhbHVlKMm1ybVwdXJlRnVuY3Rpb24yKDEsIF9jMCRoLCBjdHhfcjcuZ3JhcGhFeGVjdXRpb25EYXRhW2lfcjJdLnRlbnNvcl9kZWJ1Z19tb2RlLCBjdHhfcjcuZ3JhcGhFeGVjdXRpb25EYXRhW2lfcjJdLmRlYnVnX3RlbnNvcl92YWx1ZSkpKTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX2Rpdl81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTEgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxMyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiYnV0dG9uIiwgMTQpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfZGl2XzVfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzJfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjExKTsgY29uc3QgaV9yMiA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsgY29uc3QgY3R4X3I5ID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3I5Lm9uVGVuc29yTmFtZUNsaWNrLmVtaXQoeyBpbmRleDogaV9yMiwgZ3JhcGhfaWQ6IGN0eF9yOS5ncmFwaEV4ZWN1dGlvbkRhdGFbaV9yMl0uZ3JhcGhfaWQsIG9wX25hbWU6IGN0eF9yOS5ncmFwaEV4ZWN1dGlvbkRhdGFbaV9yMl0ub3BfbmFtZSB9KTsgfSk7CiAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJkaXYiLCAxNSk7CiAgICAgICAgybXJtXRleHQoNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg2LCBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfZGl2XzVfZGVidWdfdGVuc29yX3ZhbHVlXzZfVGVtcGxhdGUsIDEsIDQsICJkZWJ1Zy10ZW5zb3ItdmFsdWUiLCAxNik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGlfcjIgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJ0aXRsZSIsIGN0eF9yNC5nZXRUZW5zb3JOYW1lKGlfcjIpKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yNC5nZXRUZW5zb3JOYW1lKGlfcjIpLCAiICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4X3I0LmdyYXBoRXhlY3V0aW9uRGF0YVtpX3IyXS5vcF90eXBlKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjQuZ3JhcGhFeGVjdXRpb25EYXRhW2lfcjJdLmRlYnVnX3RlbnNvcl92YWx1ZSAhPT0gbnVsbCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19kaXZfMV9uZ190ZW1wbGF0ZV82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE4KTsKICAgICAgICDJtcm1dGV4dCgxLCAiIExvYWRpbmcuLi4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgY29uc3QgX2MxJDkgPSBmdW5jdGlvbiAoYTApIHsgcmV0dXJuIHsgImlucHV0LW9mLWZvY3VzIjogYTAgfTsgfTsKICAgIGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19kaXZfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA1KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCA2KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCA3KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMywgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX2Rpdl8zX1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgOCk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX2Rpdl8xX2Rpdl81X1RlbXBsYXRlLCA3LCA0LCAiZGl2IiwgOSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDYsIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9jZGtfdmlydHVhbF9zY3JvbGxfdmlld3BvcnRfM19kaXZfMV9uZ190ZW1wbGF0ZV82X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCAxMCwgMTEsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgaV9yMiA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgX3I1ID0gybXJtXJlZmVyZW5jZSg3KTsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjEoNSwgX2MxJDksIGN0eF9yMS5pc0lucHV0T2ZGb2N1cyhpX3IyKSkpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGlfcjIgPT09IGN0eF9yMS5mb2N1c0luZGV4KTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGlfcjIsICIgIik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxLmdyYXBoRXhlY3V0aW9uRGF0YVtpX3IyXSkoIm5nSWZFbHNlIiwgX3I1KTsKICAgIH0gfQogICAgZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTQgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJjZGstdmlydHVhbC1zY3JvbGwtdmlld3BvcnQiLCAzKTsKICAgICAgICDJtcm1bGlzdGVuZXIoInNjcm9sbGVkSW5kZXhDaGFuZ2UiLCBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfVGVtcGxhdGVfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0X3Njcm9sbGVkSW5kZXhDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTQpOyBjb25zdCBjdHhfcjEzID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEzLm9uU2Nyb2xsZWRJbmRleENoYW5nZS5lbWl0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfY2RrX3ZpcnR1YWxfc2Nyb2xsX3ZpZXdwb3J0XzNfZGl2XzFfVGVtcGxhdGUsIDgsIDcsICJkaXYiLCA0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJjZGtWaXJ0dWFsRm9yT2YiLCBjdHhfcjAuZ3JhcGhFeGVjdXRpb25JbmRpY2VzKTsKICAgIH0gfQogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm9uU2Nyb2xsZWRJbmRleENoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vblRlbnNvck5hbWVDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5wYXJzZURlYnVnVGVuc29yVmFsdWUgPSBwYXJzZURlYnVnVGVuc29yVmFsdWU7CiAgICAgICAgICAgIHRoaXMuVEVTVF9PTkxZID0gewogICAgICAgICAgICAgICAgZ2V0Vmlld1BvcnQ6ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMudmlld1BvcnQpLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgaWYgKHRoaXMudmlld1BvcnQgJiYKICAgICAgICAgICAgICAgIGNoYW5nZXNbJ2ZvY3VzSW5kZXgnXSAmJgogICAgICAgICAgICAgICAgY2hhbmdlc1snZm9jdXNJbmRleCddLmN1cnJlbnRWYWx1ZSAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSB0aGlzLnZpZXdQb3J0LmdldFJlbmRlcmVkUmFuZ2UoKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNjcm9sbEluZGV4ID0gY2hhbmdlc1snZm9jdXNJbmRleCddLmN1cnJlbnRWYWx1ZTsKICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBpbmRleCBpcyBzY3JvbGxlZCB0byBvbmUgdGhpcmQgdGhlIHZpZXcgcG9ydC4KICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgbmljZXIgdGhhbiBzY3JvbGxpbmcgaXQgbWVyZWx5IHRvIHRoZSB0b3AuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0aGlyZFJhbmdlID0gTWF0aC5yb3VuZCgocmFuZ2UuZW5kIC0gcmFuZ2Uuc3RhcnQpIC8gMyk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXRJbmRleCA9IE1hdGgubWF4KHNjcm9sbEluZGV4IC0gdGhpcmRSYW5nZSwgMCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB1c2VTbW9vdGhTY3JvbGxpbmcgPSBzY3JvbGxJbmRleCA+PSByYW5nZS5zdGFydCAmJiBzY3JvbGxJbmRleCA8IHJhbmdlLmVuZDsKICAgICAgICAgICAgICAgIHRoaXMudmlld1BvcnQuc2Nyb2xsVG9JbmRleCh0YXJnZXRJbmRleCwgdXNlU21vb3RoU2Nyb2xsaW5nID8gJ3Ntb290aCcgOiB1bmRlZmluZWQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZ3JhcGhFeGVjdXRpb25JbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0VGVuc29yTmFtZShncmFwaEV4ZWN1dGlvbkluZGV4KSB7CiAgICAgICAgICAgIHJldHVybiAoYCR7dGhpcy5ncmFwaEV4ZWN1dGlvbkRhdGFbZ3JhcGhFeGVjdXRpb25JbmRleF0ub3BfbmFtZX06YCArCiAgICAgICAgICAgICAgICBgJHt0aGlzLmdyYXBoRXhlY3V0aW9uRGF0YVtncmFwaEV4ZWN1dGlvbkluZGV4XS5vdXRwdXRfc2xvdH1gKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tcHV0ZXMgaWYgZ2l2ZW4gZ3JhcGgtZXhlY3V0aW9uIGluZGV4IGlzIGFuIGltbWVkaWF0ZSBpbnB1dCB0ZW5zb3IgdG8KICAgICAgICAgKiB0aGUgZ3JhcGggZXhlY3V0aW9uIGN1cnJlbnRseSBmb2N1c2VkIG9uLgogICAgICAgICAqCiAgICAgICAgICogQHBhcmFtIHs/fSBncmFwaEV4ZWN1dGlvbkluZGV4CiAgICAgICAgICogQHJldHVybiB7P30gSWYgbm8gZ3JhcGggZXhlY3V0aW9uIGlzIGZvY3VzZWQgb24sIGBmYWxzZWAuIElmIGEgZ3JhcGggZXhlY3V0aW9uCiAgICAgICAgICogICBpcyBiZWluZyBmb2N1c2VkIG9uLCBgdHJ1ZWAgaWYgYGdyYXBoRXhlY3V0aW9uSW5kZXhgIHBvaW50cyB0byBhIGdyYXBoLQogICAgICAgICAqICAgZXhlY3V0aW9uIGV2ZW50IHRoYXQgZm9ybXMgdGhlIGltbWVkaWF0ZSBpbnB1dCB0byB0aGUgZm9jdXNlZCBvbmUuCiAgICAgICAgICovCiAgICAgICAgaXNJbnB1dE9mRm9jdXMoZ3JhcGhFeGVjdXRpb25JbmRleCkgewogICAgICAgICAgICBpZiAodGhpcy5mb2N1c0lucHV0SW5kaWNlcyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB0aGlzLmZvY3VzSW5wdXRJbmRpY2VzLmluY2x1ZGVzKGdyYXBoRXhlY3V0aW9uSW5kZXgpOwogICAgICAgIH0KICAgIH0KICAgIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnZ3JhcGgtZXhlY3V0aW9ucy1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBudW1HcmFwaEV4ZWN1dGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGdyYXBoRXhlY3V0aW9uRGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZ3JhcGhFeGVjdXRpb25JbmRpY2VzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb2N1c0luZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb2N1c0lucHV0SW5kaWNlczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25TY3JvbGxlZEluZGV4Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25UZW5zb3JOYW1lQ2xpY2s6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICB2aWV3UG9ydDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB7IHN0YXRpYzogZmFsc2UgfSxdIH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEdyYXBoRXhlY3V0aW9uc0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnZpZXdQb3J0ID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IG51bUdyYXBoRXhlY3V0aW9uczogIm51bUdyYXBoRXhlY3V0aW9ucyIsIGdyYXBoRXhlY3V0aW9uRGF0YTogImdyYXBoRXhlY3V0aW9uRGF0YSIsIGdyYXBoRXhlY3V0aW9uSW5kaWNlczogImdyYXBoRXhlY3V0aW9uSW5kaWNlcyIsIGZvY3VzSW5kZXg6ICJmb2N1c0luZGV4IiwgZm9jdXNJbnB1dEluZGljZXM6ICJmb2N1c0lucHV0SW5kaWNlcyIgfSwgb3V0cHV0czogeyBvblNjcm9sbGVkSW5kZXhDaGFuZ2U6ICJvblNjcm9sbGVkSW5kZXhDaGFuZ2UiLCBvblRlbnNvck5hbWVDbGljazogIm9uVGVuc29yTmFtZUNsaWNrIiB9LCBmZWF0dXJlczogW8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdLCBkZWNsczogNCwgdmFyczogMiwgY29uc3RzOiBbWzEsICJncmFwaC1leGVjdXRpb25zLWNvbnRhaW5lciJdLCBbMSwgImdyYXBoLWV4ZWN1dGlvbnMtdGl0bGUiXSwgWyJpdGVtU2l6ZSIsICIzOCIsICJjbGFzcyIsICJncmFwaC1leGVjdXRpb25zLXZpZXdwb3J0IiwgMywgInNjcm9sbGVkSW5kZXhDaGFuZ2UiLCA0LCAibmdJZiJdLCBbIml0ZW1TaXplIiwgIjM4IiwgMSwgImdyYXBoLWV4ZWN1dGlvbnMtdmlld3BvcnQiLCAzLCAic2Nyb2xsZWRJbmRleENoYW5nZSJdLCBbImNsYXNzIiwgInRlbnNvci1jb250YWluZXIiLCA0LCAiY2RrVmlydHVhbEZvciIsICJjZGtWaXJ0dWFsRm9yT2YiXSwgWzEsICJ0ZW5zb3ItY29udGFpbmVyIl0sIFsxLCAidGVuc29yLWl0ZW0iLCAzLCAibmdDbGFzcyJdLCBbMSwgImdyYXBoLWV4ZWN1dGlvbi1pbmRleCJdLCBbImNsYXNzIiwgImdyYXBoLWV4ZWN1dGlvbi1mb2N1cyIsIDQsICJuZ0lmIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImNsYXNzIiwgInRlbnNvci1pdGVtIl0sIFsiZGF0YUxvYWRpbmciLCAiIl0sIFsxLCAiZ3JhcGgtZXhlY3V0aW9uLWZvY3VzIl0sIFsxLCAidGVuc29yLW5hbWUtYW5kLW9wLXR5cGUiXSwgWzEsICJ0ZW5zb3ItbmFtZSIsIDMsICJ0aXRsZSIsICJjbGljayJdLCBbMSwgIm9wLXR5cGUiXSwgWzMsICJkZWJ1Z1RlbnNvclZhbHVlIiwgNCwgIm5nSWYiXSwgWzMsICJkZWJ1Z1RlbnNvclZhbHVlIl0sIFsxLCAibG9hZGluZy1zcGlubmVyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMywgR3JhcGhFeGVjdXRpb25zQ29tcG9uZW50X2Nka192aXJ0dWFsX3Njcm9sbF92aWV3cG9ydF8zX1RlbXBsYXRlLCAyLCAxLCAiY2RrLXZpcnR1YWwtc2Nyb2xsLXZpZXdwb3J0IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIEdyYXBoIEV4ZWN1dGlvbnMgKCIsIGN0eC5udW1HcmFwaEV4ZWN1dGlvbnMsICIpICIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4Lm51bUdyYXBoRXhlY3V0aW9ucyAhPT0gbnVsbCAmJiBjdHgubnVtR3JhcGhFeGVjdXRpb25zID4gMCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgQ2RrVmlydHVhbFNjcm9sbFZpZXdwb3J0LCBDZGtGaXhlZFNpemVWaXJ0dWFsU2Nyb2xsLCBDZGtWaXJ0dWFsRm9yT2YsIE5nQ2xhc3MsIERlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdLCBzdHlsZXM6IFsiLmdyYXBoLWV4ZWN1dGlvbnMtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1sZWZ0OiAxcHggc29saWQgcmdiYSgwLCAwLCAwLCAwLjEyKTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtYXJnaW4tbGVmdDogOHB4O1xuICBwYWRkaW5nLWxlZnQ6IDEwcHg7XG59XG5cbi5ncmFwaC1leGVjdXRpb24tZm9jdXNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xufVxuXG4uZ3JhcGgtZXhlY3V0aW9uLWluZGV4W19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGNvbG9yOiAjNzU3NTc1O1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIHBhZGRpbmctcmlnaHQ6IDRweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHdpZHRoOiA0MHB4O1xufVxuXG4uZ3JhcGgtZXhlY3V0aW9ucy10aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3gtc2hhZG93OiAwIDVweCAzcHggLTNweCAjY2NjO1xuICBwYWRkaW5nLWJvdHRvbTogNXB4O1xufVxuXG4uZ3JhcGgtZXhlY3V0aW9ucy12aWV3cG9ydFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmbGV4LWdyb3c6IDE7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgd2lkdGg6IDEwMCU7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbn1cblxuLmlucHV0LW9mLWZvY3VzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIFxuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZmZmMDk5O1xufVxuXG4ubG9hZGluZy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbn1cblxuLm9wLXR5cGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2UzZTVlODtcbiAgYm9yZGVyOiAxcHggc29saWQgI2MwYzBjMDtcbiAgYm9yZGVyLXJhZGl1czogNHB4O1xuICBkaXJlY3Rpb246IHJ0bDtcbiAgZGlzcGxheTogYmxvY2s7XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIGZvbnQtc2l6ZTogMTBweDtcbiAgaGVpZ2h0OiAxNHB4O1xuICBsaW5lLWhlaWdodDogMTRweDtcbiAgcGFkZGluZzogMXB4IDNweDtcbiAgd2lkdGg6IG1heC1jb250ZW50O1xufVxuXG4udGVuc29yLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICB3aWR0aDogMTAwJTtcbn1cblxuLnRlbnNvci1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LXdyYXA6IG5vd3JhcDtcbiAgaGVpZ2h0OiAzOHB4O1xuICBsaW5lLWhlaWdodDogMzhweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgdmVydGljYWwtYWxpZ246IG1pZGRsZTtcbiAgd2hpdGUtc3BhY2U6IG5vd3JhcDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi50ZW5zb3ItbmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgYm9yZGVyOiBub25lO1xuICBib3gtc2l6aW5nOiBib3JkZXItYm94O1xuICBjdXJzb3I6IHBvaW50ZXI7XG4gIGRpcmVjdGlvbjogcnRsO1xuICBkaXNwbGF5OiBibG9jaztcbiAgaGVpZ2h0OiAxNnB4O1xuICBsaW5lLWhlaWdodDogMTZweDtcbiAgbWFyZ2luOiAycHggMCAxcHg7XG4gIG1heC13aWR0aDogY2FsYygxMDAlIC0gMnB4KTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgcGFkZGluZzogMCAycHg7XG4gIHRleHQtYWxpZ246IHJpZ2h0O1xuICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTtcbiAgdGV4dC1vdmVyZmxvdzogZWxsaXBzaXM7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi50ZW5zb3ItbmFtZVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMge1xuICBvdXRsaW5lOiAxcHggc29saWQgI2M2Y2FkMTtcbn1cblxuLnRlbnNvci1uYW1lLWFuZC1vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpcmVjdGlvbjogcnRsO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIHBhZGRpbmctcmlnaHQ6IDhweDtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHdpZHRoOiAyNDBweDtcbn1cblxuZGVidWctdGVuc29yLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgbWFyZ2luOiAycHggMDtcbn0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvZ3JhcGhfZXhlY3V0aW9ucy9ncmFwaF9leGVjdXRpb25zX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBHcmFwaEV4ZWN1dGlvbnNDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMubnVtR3JhcGhFeGVjdXRpb25zJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0TnVtR3JhcGhFeGVjdXRpb25zKSk7CiAgICAgICAgICAgIHRoaXMuZ3JhcGhFeGVjdXRpb25EYXRhJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0R3JhcGhFeGVjdXRpb25EYXRhKSk7CiAgICAgICAgICAgIHRoaXMuZ3JhcGhFeGVjdXRpb25JbmRpY2VzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0TnVtR3JhcGhFeGVjdXRpb25zLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbnVtR3JhcGhFeGVjdXRpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChudW1HcmFwaEV4ZWN1dGlvbikgPT4gewogICAgICAgICAgICAgICAgaWYgKG51bUdyYXBoRXhlY3V0aW9uID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbSh7IGxlbmd0aDogbnVtR3JhcGhFeGVjdXRpb24gfSkubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gXwogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoXywgaSkgPT4gaSkpOwogICAgICAgICAgICB9KSkpKTsKICAgICAgICAgICAgdGhpcy5mb2N1c0luZGV4JCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0R3JhcGhFeGVjdXRpb25Gb2N1c0luZGV4KSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbmZlcnJlZCBncmFwaC1leGVjdXRpb24gaW5kaWNlcyB0aGF0IGJlbG9uZyB0byB0aGUgaW1tZWRpYXRlIGlucHV0cwogICAgICAgICAgICAgKiB0byB0aGUgY3VycmVudGx5LWZvY3VzZWQgZ3JhcGggb3AuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmZvY3VzSW5wdXRJbmRpY2VzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0Rm9jdXNlZEdyYXBoRXhlY3V0aW9uSW5wdXRJbmRpY2VzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsZWRJbmRleAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25TY3JvbGxlZEluZGV4Q2hhbmdlKHNjcm9sbGVkSW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChncmFwaEV4ZWN1dGlvblNjcm9sbFRvSW5kZXgoeyBpbmRleDogc2Nyb2xsZWRJbmRleCB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVGVuc29yTmFtZUNsaWNrKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZ3JhcGhFeGVjdXRpb25Gb2N1c2VkKGV2ZW50KSk7CiAgICAgICAgfQogICAgfQogICAgR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1ncmFwaC1leGVjdXRpb25zJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGdyYXBoLWV4ZWN1dGlvbnMtY29tcG9uZW50CiAgICAgIFtudW1HcmFwaEV4ZWN1dGlvbnNdPSJudW1HcmFwaEV4ZWN1dGlvbnMkIHwgYXN5bmMiCiAgICAgIFtncmFwaEV4ZWN1dGlvbkRhdGFdPSJncmFwaEV4ZWN1dGlvbkRhdGEkIHwgYXN5bmMiCiAgICAgIFtncmFwaEV4ZWN1dGlvbkluZGljZXNdPSJncmFwaEV4ZWN1dGlvbkluZGljZXMkIHwgYXN5bmMiCiAgICAgIFtmb2N1c0luZGV4XT0iZm9jdXNJbmRleCQgfCBhc3luYyIKICAgICAgW2ZvY3VzSW5wdXRJbmRpY2VzXT0iZm9jdXNJbnB1dEluZGljZXMkIHwgYXN5bmMiCiAgICAgIChvblNjcm9sbGVkSW5kZXhDaGFuZ2UpPSJvblNjcm9sbGVkSW5kZXhDaGFuZ2UoJGV2ZW50KSIKICAgICAgKG9uVGVuc29yTmFtZUNsaWNrKT0ib25UZW5zb3JOYW1lQ2xpY2soJGV2ZW50KSIKICAgID48L2dyYXBoLWV4ZWN1dGlvbnMtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBHcmFwaEV4ZWN1dGlvbnNDb250YWluZXIsIHNlbGVjdG9yczogW1sidGYtZGVidWdnZXItdjItZ3JhcGgtZXhlY3V0aW9ucyJdXSwgZGVjbHM6IDYsIHZhcnM6IDE1LCBjb25zdHM6IFtbMywgIm51bUdyYXBoRXhlY3V0aW9ucyIsICJncmFwaEV4ZWN1dGlvbkRhdGEiLCAiZ3JhcGhFeGVjdXRpb25JbmRpY2VzIiwgImZvY3VzSW5kZXgiLCAiZm9jdXNJbnB1dEluZGljZXMiLCAib25TY3JvbGxlZEluZGV4Q2hhbmdlIiwgIm9uVGVuc29yTmFtZUNsaWNrIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJncmFwaC1leGVjdXRpb25zLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uU2Nyb2xsZWRJbmRleENoYW5nZSIsIGZ1bmN0aW9uIEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcl9UZW1wbGF0ZV9ncmFwaF9leGVjdXRpb25zX2NvbXBvbmVudF9vblNjcm9sbGVkSW5kZXhDaGFuZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblNjcm9sbGVkSW5kZXhDaGFuZ2UoJGV2ZW50KTsgfSkoIm9uVGVuc29yTmFtZUNsaWNrIiwgZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyX1RlbXBsYXRlX2dyYXBoX2V4ZWN1dGlvbnNfY29tcG9uZW50X29uVGVuc29yTmFtZUNsaWNrXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25UZW5zb3JOYW1lQ2xpY2soJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDQsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJudW1HcmFwaEV4ZWN1dGlvbnMiLCDJtcm1cGlwZUJpbmQxKDEsIDUsIGN0eC5udW1HcmFwaEV4ZWN1dGlvbnMkKSkoImdyYXBoRXhlY3V0aW9uRGF0YSIsIMm1ybVwaXBlQmluZDEoMiwgNywgY3R4LmdyYXBoRXhlY3V0aW9uRGF0YSQpKSgiZ3JhcGhFeGVjdXRpb25JbmRpY2VzIiwgybXJtXBpcGVCaW5kMSgzLCA5LCBjdHguZ3JhcGhFeGVjdXRpb25JbmRpY2VzJCkpKCJmb2N1c0luZGV4IiwgybXJtXBpcGVCaW5kMSg0LCAxMSwgY3R4LmZvY3VzSW5kZXgkKSkoImZvY3VzSW5wdXRJbmRpY2VzIiwgybXJtXBpcGVCaW5kMSg1LCAxMywgY3R4LmZvY3VzSW5wdXRJbmRpY2VzJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0dyYXBoRXhlY3V0aW9uc0NvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGZ1bmN0aW9uIGdldFdpbmRvdyQxKCkgewogICAgICAgIHJldHVybiB3aW5kb3c7CiAgICB9CiAgICBjb25zdCB1dGlscyQxID0gewogICAgICAgIGdldFdpbmRvdzogZ2V0V2luZG93JDEsCiAgICB9OwogICAgY29uc3QgTU9OQUNPX1BBVEhfUFJFRklYID0gJ3ZzJzsKICAgIGNvbnN0IE1PTkFDT19JTVBPUlRfUEFUSCA9ICcvdGYtaW1wb3J0cy92cyc7CiAgICAvKioKICAgICAqIHJlcXVpcmUuanMncyByZXF1aXJlKCkgd3JhcHBlZCBhcyBhbiBhc3luYyBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBQcm9taXNlLgogICAgICoKICAgICAqIFRoaXMgd3JhcHBlZCB2ZXJzaW9uIGRvZXMgbm90IHN1cHBvcnQgY2FsbGJhY2stZnVuY3Rpb24gYXJndW1lbnRzLgogICAgICoKICAgICAqIEBwYXJhbSBwYXRocwogICAgICovCiAgICBmdW5jdGlvbiByZXF1aXJlQXNQcm9taXNlKHBhdGhzKSB7CiAgICAgICAgY29uc3QgcmVxdWlyZSA9IHV0aWxzJDEuZ2V0V2luZG93KCkucmVxdWlyZTsKICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUpID0+IHsKICAgICAgICAgICAgcmVxdWlyZShwYXRocywgcmVzb2x2ZSk7CiAgICAgICAgfSk7CiAgICB9CiAgICAvKioKICAgICAqIElmIGB3aW5kb3cubW9uYWNvYCBpcyB1bmRlZmluZWQsIGxvYWQgdGhlIG1vbmFjby1lZGl0b3IgQVBJIG9iamVjdCBvbnRvIHRoYXQKICAgICAqIGdsb2JhbCBwYXRoIGR5bmFtaWNhbGx5IHVzaW5nIHJlcXVpcmUuanMuIElmIGB3aW5kb3cubW9uYWNvYCBpcyBhbHJlYWR5CiAgICAgKiBkZWZpbmVkLCB0aGlzIGZ1bmN0aW9uIGlzIGEgbm8tb3AuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGxvYWRNb25hY28oKSB7CiAgICAgICAgcmV0dXJuIF9fYXdhaXRlcih0aGlzLCB2b2lkIDAsIHZvaWQgMCwgZnVuY3Rpb24qICgpIHsKICAgICAgICAgICAgY29uc3Qgd2luZG93ID0gdXRpbHMkMS5nZXRXaW5kb3coKTsKICAgICAgICAgICAgaWYgKHdpbmRvdy5tb25hY28gIT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh3aW5kb3cucmVxdWlyZSkgewogICAgICAgICAgICAgICAgY29uc3QgcmVxdWlyZSA9IHdpbmRvdy5yZXF1aXJlOwogICAgICAgICAgICAgICAgcmVxdWlyZS5jb25maWcoewogICAgICAgICAgICAgICAgICAgIHBhdGhzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIFtNT05BQ09fUEFUSF9QUkVGSVhdOiBNT05BQ09fSU1QT1JUX1BBVEgsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgeWllbGQgcmVxdWlyZUFzUHJvbWlzZShbYCR7TU9OQUNPX1BBVEhfUFJFRklYfS9lZGl0b3IvZWRpdG9yLm1haW5gXSk7CiAgICAgICAgICAgICAgICB5aWVsZCByZXF1aXJlQXNQcm9taXNlKFsKICAgICAgICAgICAgICAgICAgICBgJHtNT05BQ09fUEFUSF9QUkVGSVh9L3B5dGhvbi9weXRob24uY29udHJpYnV0aW9uYCwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdsb2FkTW9uYWNvKCkgZmFpbGVkIGJlY2F1c2UgZnVuY3Rpb24gcmVxdWlyZSgpIGlzIHVuYXZhaWxhYmxlJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9KTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL3NvdXJjZV9jb2RlL3NvdXJjZV9jb2RlX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkaSA9IFsiY29kZVZpZXdlckNvbnRhaW5lciJdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREVGQVVMVF9DT0RFX0xBTkdVQUdFID0gJ3B5dGhvbic7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBERUZBVUxUX0NPREVfRk9OVF9TSVpFID0gMTA7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSRVNJWkVfREVCT1VOQ0VfSU5URVJBVkxfTVMgPSA1MDsKICAgIGNsYXNzIFNvdXJjZUNvZGVDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLmxpbmVzID0gbnVsbDsgLy8gVE9ETyhjYWlzKTogQWRkIHNwaW5uZXIgZm9yIGBudWxsYC4KICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIHNwaW5uZXIgZm9yIGBudWxsYC4KICAgICAgICAgICAgdGhpcy5mb2N1c2VkTGluZW5vID0gbnVsbDsKICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogRXhwbG9yZSBiZXR0ZXIgdHlwaW5nIGJ5IGRlcGVuZGluZyBvbiBleHRlcm5hbCBsaWJyYXJpZXMuCiAgICAgICAgICAgIHRoaXMubW9uYWNvID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5lZGl0b3IgPSBudWxsOwogICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gW107CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIC8vIExpc3RlbiB0byB3aW5kb3cgcmVzaXplIGV2ZW50LiBXaGVuIHJlc2l6ZSBoYXBwZW5zLCByZS1sYXlvdXQKICAgICAgICAgICAgLy8gbW9uYWNvIGVkaXRvciwgc28gaXRzIHdpZHRoIGlzIGFsd2F5cyB1cC10by1kYXRlIHdpdGggcmVzcGVjdCB0bwogICAgICAgICAgICAvLyB0aGUgd2luZG93IHNpemUuIERvIHRoaXMgd2l0aCBgZGVib3VuY2UoKWAgdG8gcHJldmVudCByZS1sYXlvdXRpbmcKICAgICAgICAgICAgLy8gYXQgdG9vIGhpZ2ggYSByYXRlLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlc2l6ZVBpcGUgPSBmcm9tRXZlbnQod2luZG93LCAncmVzaXplJykKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpLCBkZWJvdW5jZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiBpbnRlcnZhbChSRVNJWkVfREVCT1VOQ0VfSU5URVJBVkxfTVMpKSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5lZGl0b3IgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmVkaXRvci5sYXlvdXQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUubmV4dCgpOwogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm1vbmFjbyA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudExpbmVzID0gY2hhbmdlc1snbW9uYWNvJ10KICAgICAgICAgICAgICAgID8gdGhpcy5saW5lcwogICAgICAgICAgICAgICAgOiBjaGFuZ2VzWydsaW5lcyddCiAgICAgICAgICAgICAgICAgICAgPyBjaGFuZ2VzWydsaW5lcyddLmN1cnJlbnRWYWx1ZQogICAgICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW5lcykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjdXJyZW50TGluZXMuam9pbignXG4nKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmVkaXRvciA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZWRpdG9yID0gdGhpcy5tb25hY28uZWRpdG9yLmNyZWF0ZSh0aGlzLmNvZGVWaWV3ZXJDb250YWluZXIubmF0aXZlRWxlbWVudCwgewogICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2U6IERFRkFVTFRfQ09ERV9MQU5HVUFHRSwKICAgICAgICAgICAgICAgICAgICAgICAgcmVhZE9ubHk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRTaXplOiBERUZBVUxUX0NPREVfRk9OVF9TSVpFLAogICAgICAgICAgICAgICAgICAgICAgICBtaW5pbWFwOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5lZGl0b3Iuc2V0VmFsdWUodmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudEZvY3VzZWRMaW5lbm8gPSBjaGFuZ2VzWydtb25hY28nXQogICAgICAgICAgICAgICAgPyB0aGlzLmZvY3VzZWRMaW5lbm8KICAgICAgICAgICAgICAgIDogY2hhbmdlc1snZm9jdXNlZExpbmVubyddCiAgICAgICAgICAgICAgICAgICAgPyBjaGFuZ2VzWydmb2N1c2VkTGluZW5vJ10uY3VycmVudFZhbHVlCiAgICAgICAgICAgICAgICAgICAgOiBudWxsOwogICAgICAgICAgICBpZiAoY3VycmVudEZvY3VzZWRMaW5lbm8gJiYgdGhpcy5saW5lcyAmJiB0aGlzLm1vbmFjbyAhPT0gbnVsbCkgewogICAgICAgICAgICAgICAgdGhpcy5lZGl0b3IucmV2ZWFsTGluZUluQ2VudGVyKGN1cnJlbnRGb2N1c2VkTGluZW5vLCB0aGlzLm1vbmFjby5lZGl0b3IuU2Nyb2xsVHlwZS5TbW9vdGgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbGluZUxlbmd0aCA9IHRoaXMubGluZXNbY3VycmVudEZvY3VzZWRMaW5lbm8gLSAxXS5sZW5ndGg7CiAgICAgICAgICAgICAgICB0aGlzLmRlY29yYXRpb25zID0gdGhpcy5lZGl0b3IuZGVsdGFEZWNvcmF0aW9ucyh0aGlzLmRlY29yYXRpb25zLCBbCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogbmV3IHRoaXMubW9uYWNvLlJhbmdlKGN1cnJlbnRGb2N1c2VkTGluZW5vLCAxLCBjdXJyZW50Rm9jdXNlZExpbmVubywgMSksCiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnM6IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzV2hvbGVMaW5lOiB0cnVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZXNEZWNvcmF0aW9uc0NsYXNzTmFtZTogJ2hpZ2hsaWdodC1ndXR0ZXInLAogICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICByYW5nZTogbmV3IHRoaXMubW9uYWNvLlJhbmdlKGN1cnJlbnRGb2N1c2VkTGluZW5vLCAxLCBjdXJyZW50Rm9jdXNlZExpbmVubywgbGluZUxlbmd0aCArIDEpLAogICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmxpbmVDbGFzc05hbWU6ICdoaWdobGlnaHQtbGluZScsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgU291cmNlQ29kZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnc291cmNlLWNvZGUtY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vc291cmNlX2NvZGVfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3NvdXJjZV9jb2RlX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFNvdXJjZUNvZGVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbGluZXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZvY3VzZWRMaW5lbm86IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1vbmFjbzogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY29kZVZpZXdlckNvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2NvZGVWaWV3ZXJDb250YWluZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU291cmNlQ29kZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFNvdXJjZUNvZGVDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU291cmNlQ29kZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VDb2RlQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNvdXJjZUNvZGVDb21wb25lbnQsIHNlbGVjdG9yczogW1sic291cmNlLWNvZGUtY29tcG9uZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIFNvdXJjZUNvZGVDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJGksIHRydWUsIEVsZW1lbnRSZWYpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguY29kZVZpZXdlckNvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGlucHV0czogeyBsaW5lczogImxpbmVzIiwgZm9jdXNlZExpbmVubzogImZvY3VzZWRMaW5lbm8iLCBtb25hY286ICJtb25hY28iIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0sIGRlY2xzOiAyLCB2YXJzOiAwLCBjb25zdHM6IFtbMSwgImNvZGUtdmlld2VyLWNvbnRhaW5lciJdLCBbImNvZGVWaWV3ZXJDb250YWluZXIiLCAiIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU291cmNlQ29kZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgImRpdiIsIDAsIDEpOwogICAgICAgIH0gfSwgc3R5bGVzOiBbIi5jb2RlLXZpZXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG5bX25naG9zdC0lQ09NUCVdICAgICAuaGlnaGxpZ2h0LWd1dHRlciB7XG4gIGJhY2tncm91bmQ6IHJnYmEoMjU1LCAxMTEsIDAsIDAuNyk7XG4gIHdpZHRoOiA1cHggIWltcG9ydGFudDtcbn1cblxuW19uZ2hvc3QtJUNPTVAlXSAgICAgLmhpZ2hsaWdodC1saW5lIHtcbiAgYmFja2dyb3VuZDogcmdiYSgyNTUsIDExMSwgMCwgMC4zKTtcbn0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc291cmNlX2NvZGUvc291cmNlX2NvZGVfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIFRPRE8oY2Fpcyk6IEV4cGxvcmUgYmV0dGVyIHR5cGluZyBieSBkZXBlbmRpbmcgb24gZXh0ZXJuYWwgbGlicmFyaWVzLgogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgd2luZG93V2l0aFJlcXVpcmVBbmRNb25hY28gPSB3aW5kb3c7CiAgICAvKioKICAgICAqIFNvdXJjZUNvZGVDb250YWluZXIgZGlzcGxheXMgdGhlIGNvbnRlbnQgb2YgYSBzb3VyY2UtY29kZSBmaWxlLgogICAgICoKICAgICAqIEl0IGRpc3BsYXlzIHRoZSBjb2RlIHdpdGggdmlzdWFsIGZlYXR1cmVzIGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nLgogICAgICogSXQgYWRkaXRpb25hbGx5IHByb3ZpZGVzIGZ1bmN0aW9uYWxpdGllcyB0bzoKICAgICAqIC0gU2Nyb2xsIHRvIGFuZCBoaWdobGlnaHQgYSBnaXZlbiBsaW5lIGJ5IGl0cyBsaW5lIG51bWJlci4KICAgICAqCiAgICAgKiBUT0RPKGNhaXMpOiBBZGQgc3VwcG9ydCBmb3IgbGluZSBkZWNvcmF0aW9uIGFuZCBzeW1ib2wgZGVjb3JhdGlvbi4KICAgICAqCiAgICAgKiBVbmxpa2UgU291cmNlRmlsZXNDb21wb25lbnQsIFNvdXJjZUNvZGVDb250YWluZXIgaGFuZGxlcyBvbmx5IG9uZSBmaWxlIGF0IGEKICAgICAqIHRpbWUuCiAgICAgKi8KICAgIGNsYXNzIFNvdXJjZUNvZGVDb250YWluZXIgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvLyBMaW5lcyBvZiB0aGUgc291cmNlLWNvZGUgZmlsZSwgc3BsaXQgYXQgbGluZSBicmVha3MuCiAgICAgICAgICAgIHRoaXMubGluZXMgPSBudWxsOyAvLyBUT0RPKGNhaXMpOiBBZGQgc3Bpbm5lciBmb3IgYG51bGxgLgogICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgc3Bpbm5lciBmb3IgYG51bGxgLgogICAgICAgICAgICAvLyBMaW5lIG51bWJlciB0byBzY3JvbGwgdG8gYW5kIGhpZ2hsaWdodCwgMS1iYXNlZC4KICAgICAgICAgICAgdGhpcy5mb2N1c2VkTGluZW5vID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5tb25hY28kID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5tb25hY28kID0gZnJvbShsb2FkTW9uYWNvKCkpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHdpbmRvd1dpdGhSZXF1aXJlQW5kTW9uYWNvLm1vbmFjbykpKTsKICAgICAgICB9CiAgICB9CiAgICBTb3VyY2VDb2RlQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtY29kZScsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxzb3VyY2UtY29kZS1jb21wb25lbnQKICAgICAgW2xpbmVzXT0ibGluZXMiCiAgICAgIFtmb2N1c2VkTGluZW5vXT0iZm9jdXNlZExpbmVubyIKICAgICAgW21vbmFjb109Im1vbmFjbyQgfCBhc3luYyIKICAgID48L3NvdXJjZS1jb2RlLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTb3VyY2VDb2RlQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gW107CiAgICBTb3VyY2VDb2RlQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGxpbmVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmb2N1c2VkTGluZW5vOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VDb2RlQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gU291cmNlQ29kZUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTb3VyY2VDb2RlQ29udGFpbmVyKSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUNvZGVDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU291cmNlQ29kZUNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtY29kZSJdXSwgaW5wdXRzOiB7IGxpbmVzOiAibGluZXMiLCBmb2N1c2VkTGluZW5vOiAiZm9jdXNlZExpbmVubyIgfSwgZGVjbHM6IDIsIHZhcnM6IDUsIGNvbnN0czogW1szLCAibGluZXMiLCAiZm9jdXNlZExpbmVubyIsICJtb25hY28iXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTb3VyY2VDb2RlQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAic291cmNlLWNvZGUtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImxpbmVzIiwgY3R4LmxpbmVzKSgiZm9jdXNlZExpbmVubyIsIGN0eC5mb2N1c2VkTGluZW5vKSgibW9uYWNvIiwgybXJtXBpcGVCaW5kMSgxLCAzLCBjdHgubW9uYWNvJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1NvdXJjZUNvZGVDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zb3VyY2VfZmlsZXMvc291cmNlX2ZpbGVzX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBTb3VyY2VGaWxlc0NvbXBvbmVudF9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA2KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHhfcjAuZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmZpbGVfcGF0aCwgIiAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gU291cmNlRmlsZXNDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgICAgICDJtcm1dGV4dCgxLCAiIE5vIGZpbGUgc2VsZWN0ZWQuIENsaWNrIGEgbGluZSBudW1iZXIgaW4gdGhlIFN0YWNrIFRyYWNlIHNlY3Rpb24gdG8gc2hvdyB0aGUgc291cmNlIGNvZGUuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29tcG9uZW50X3RmX2RlYnVnZ2VyX3YyX3NvdXJjZV9jb2RlXzdfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgInRmLWRlYnVnZ2VyLXYyLXNvdXJjZS1jb2RlIiwgOCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoImxpbmVzIiwgY3R4X3IzLmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudC5saW5lcykoImZvY3VzZWRMaW5lbm8iLCBjdHhfcjMuZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmxpbmVubyk7CiAgICB9IH0KICAgIC8qKgogICAgICogUmVuZGVycyB0aGUgY29udGVudCBvZiBzb3VyY2UgZmlsZShzKS4KICAgICAqCiAgICAgKiBVbmxpa2UgYFNvdXJjZUNvZGVDb21wb25lbnRgLCB3aGljaCBkaXNwbGF5cyBvbmx5IHRoZSBjb250ZW50IG9mIGEgc2luZ2xlCiAgICAgKiBzb3VyY2UtY29kZSBmaWxlLCBgU291cmNlRmlsZXNDb21wb25lbnRgaXMgYXdhcmUgb2YgdGhlIG1ldGEtaW5mb3JtYXRvbiBhYm91dAogICAgICogdGhlIGZpbGVzIGJlaW5nIGRpc3BsYXllZCwgc3VjaCB0aGVpciBmaWxlIHBhdGhzLiBTdWNoIG1ldGEtaW5mb3JtYXRpb24gaXMKICAgICAqIGRpc3BsYXllZCBieSB0aGlzIGNvbXBvbmVudC4KICAgICAqLwogICAgY2xhc3MgU291cmNlRmlsZXNDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZFNvdXJjZUxpbmVTcGVjID0gbnVsbDsKICAgICAgICB9CiAgICB9CiAgICBTb3VyY2VGaWxlc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnc291cmNlLWZpbGVzLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3NvdXJjZV9maWxlc19jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vc291cmNlX2ZpbGVzX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFNvdXJjZUZpbGVzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGZvY3VzZWRTb3VyY2VGaWxlQ29udGVudDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZm9jdXNlZFNvdXJjZUxpbmVTcGVjOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VGaWxlc0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNvdXJjZUZpbGVzQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUZpbGVzQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNvdXJjZUZpbGVzQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInNvdXJjZS1maWxlcy1jb21wb25lbnQiXV0sIGlucHV0czogeyBmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQ6ICJmb2N1c2VkU291cmNlRmlsZUNvbnRlbnQiLCBmb2N1c2VkU291cmNlTGluZVNwZWM6ICJmb2N1c2VkU291cmNlTGluZVNwZWMiIH0sIGRlY2xzOiA4LCB2YXJzOiAzLCBjb25zdHM6IFtbMSwgInNvdXJjZS1maWxlcy1jb250YWluZXIiXSwgWzEsICJoZWFkZXItc2VjdGlvbiJdLCBbMSwgInRpdGxlLXRhZyJdLCBbImNsYXNzIiwgImZpbGUtbGFiZWwiLCA0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbIm5vRmlsZVNlbGVjdGVkIiwgIiJdLCBbMywgImxpbmVzIiwgImZvY3VzZWRMaW5lbm8iLCA0LCAibmdJZiJdLCBbMSwgImZpbGUtbGFiZWwiXSwgWzEsICJuby1maWxlLXNlbGVjdGVkIl0sIFszLCAibGluZXMiLCAiZm9jdXNlZExpbmVubyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1dGV4dCgzLCAiU291cmNlIENvZGUiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIFNvdXJjZUZpbGVzQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCAyLCAxLCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBTb3VyY2VGaWxlc0NvbXBvbmVudF9uZ190ZW1wbGF0ZV81X1RlbXBsYXRlLCAyLCAwLCAibmctdGVtcGxhdGUiLCBudWxsLCA0LCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNywgU291cmNlRmlsZXNDb21wb25lbnRfdGZfZGVidWdnZXJfdjJfc291cmNlX2NvZGVfN19UZW1wbGF0ZSwgMSwgMiwgInRmLWRlYnVnZ2VyLXYyLXNvdXJjZS1jb2RlIiwgNSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMSA9IMm1ybVyZWZlcmVuY2UoNik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZm9jdXNlZFNvdXJjZUxpbmVTcGVjICE9PSBudWxsKSgibmdJZkVsc2UiLCBfcjEpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCAhPT0gbnVsbCAmJiBjdHguZm9jdXNlZFNvdXJjZUxpbmVTcGVjICE9PSBudWxsICYmIGN0eC5mb2N1c2VkU291cmNlRmlsZUNvbnRlbnQubGluZXMgIT09IG51bGwpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIFNvdXJjZUNvZGVDb250YWluZXJdLCBzdHlsZXM6IFsiLmhlYWRlci1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci1ib3R0b206IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBmbGV4O1xuICBoZWlnaHQ6IDI0cHg7XG4gIHBhZGRpbmctYm90dG9tOiA2cHg7XG4gIHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIHdpZHRoOiAxMDAlO1xufVxuXG4uZmlsZS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZvbnQtd2VpZ2h0OiBub3JtYWw7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG4gIG92ZXJmbG93LXdyYXA6IGFueXdoZXJlO1xuICBvdmVyZmxvdy15OiBhdXRvO1xuICBwYWRkaW5nOiAwIDIwcHg7XG59XG5cbi5uby1maWxlLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgY29sb3I6ICM2NjY7XG4gIHBhZGRpbmc6IDAgMjBweDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbn1cblxuLnNvdXJjZS1maWxlcy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBoZWlnaHQ6IDEwMCU7XG59XG5cbi50aXRsZS10YWdbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgaGVpZ2h0OiAxMDAlO1xuICBwYWRkaW5nLWxlZnQ6IDZweDtcbiAgdmVydGljYWwtYWxpZ246IHRvcDtcbn1cblxudGYtZGVidWdnZXItdjItc291cmNlLWNvZGVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZmxleC1ncm93OiAxO1xuICB3aWR0aDogMTAwJTtcbn0iXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL3NvdXJjZV9maWxlcy9zb3VyY2VfZmlsZXNfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFNvdXJjZUZpbGVzQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRTb3VyY2VGaWxlQ29udGVudCkpOwogICAgICAgICAgICB0aGlzLmZvY3VzZWRTb3VyY2VMaW5lU3BlYyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldEZvY3VzZWRTb3VyY2VMaW5lU3BlYykpOwogICAgICAgIH0KICAgIH0KICAgIFNvdXJjZUZpbGVzQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12Mi1zb3VyY2UtZmlsZXMnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8c291cmNlLWZpbGVzLWNvbXBvbmVudAogICAgICBbZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50XT0iZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50JCB8IGFzeW5jIgogICAgICBbZm9jdXNlZFNvdXJjZUxpbmVTcGVjXT0iZm9jdXNlZFNvdXJjZUxpbmVTcGVjJCB8IGFzeW5jIgogICAgPjwvc291cmNlLWZpbGVzLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTb3VyY2VGaWxlc0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU291cmNlRmlsZXNDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBTb3VyY2VGaWxlc0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTb3VyY2VGaWxlc0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFNvdXJjZUZpbGVzQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNvdXJjZUZpbGVzQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRmLWRlYnVnZ2VyLXYyLXNvdXJjZS1maWxlcyJdXSwgZGVjbHM6IDMsIHZhcnM6IDYsIGNvbnN0czogW1szLCAiZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50IiwgImZvY3VzZWRTb3VyY2VMaW5lU3BlYyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFNvdXJjZUZpbGVzQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAic291cmNlLWZpbGVzLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50IiwgybXJtXBpcGVCaW5kMSgxLCAyLCBjdHguZm9jdXNlZFNvdXJjZUZpbGVDb250ZW50JCkpKCJmb2N1c2VkU291cmNlTGluZVNwZWMiLCDJtcm1cGlwZUJpbmQxKDIsIDQsIGN0eC5mb2N1c2VkU291cmNlTGluZVNwZWMkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbU291cmNlRmlsZXNDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zdGFja190cmFjZS9zdGFja190cmFjZV9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY29uc3QgX2MwJGogPSBbInN0YWNrRnJhbWVBcnJheSJdOwogICAgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfM19zcGFuXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDEzKTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I5ID0gybXJtW5leHRDb250ZXh0KDMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIyIsIGN0eF9yOS5leGVjdXRpb25JbmRleCwgIjogIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzNfc3Bhbl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxNCk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMTAgPSDJtcm1bmV4dENvbnRleHQoMyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHhfcjEwLm9wVHlwZSwgIiAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCgxLCAiIEVhZ2VyIGV4ZWN1dGlvbiAiKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfM19zcGFuXzJfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgMTEpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X2Rpdl8zX3NwYW5fM19UZW1wbGF0ZSwgMiwgMSwgInNwYW4iLCAxMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yNiA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjYub3BUeXBlICE9PSBudWxsKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjYub3BUeXBlICE9PSBudWxsKTsKICAgIH0gfQogICAgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfNF9zcGFuXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDE2KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMSA9IMm1ybVuZXh0Q29udGV4dCgzKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIFwiIiwgY3R4X3IxMS5vcE5hbWUsICJcIiAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfNF9zcGFuXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDE0KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMiA9IMm1ybVuZXh0Q29udGV4dCgzKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIGN0eF9yMTIub3BUeXBlLCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X2Rpdl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDEsICIgQ3JlYXRpb24gb2YgZ3JhcGggb3AgIik7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzRfc3Bhbl8yX1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDE1KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMywgU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9kaXZfNF9zcGFuXzNfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgMTIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjcgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I3Lm9wTmFtZSAhPT0gbnVsbCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I3Lm9wVHlwZSAhPT0gbnVsbCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfc3Bhbl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAxNyk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yOCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIChIb3N0IG5hbWU6ICIsIGN0eF9yOC5zdGFja0ZyYW1lc0ZvckRpc3BsYXlbMF0uaG9zdF9uYW1lLCAiKSAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA3KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAic3BhbiIsIDgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X2Rpdl8zX1RlbXBsYXRlLCA0LCAyLCAiZGl2IiwgOSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDQsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfZGl2XzRfVGVtcGxhdGUsIDQsIDIsICJkaXYiLCA5KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2Iik7CiAgICAgICAgybXJtXRlbXBsYXRlKDYsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzRfc3Bhbl82X1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDEwKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoIiwgY3R4X3IwLmNvZGVMb2NhdGlvblR5cGUpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgY3R4X3IwLkNvZGVMb2NhdGlvblR5cGUuRVhFQ1VUSU9OKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGN0eF9yMC5Db2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjAuc3RhY2tGcmFtZXNGb3JEaXNwbGF5ICE9PSBudWxsICYmIGN0eF9yMC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkubGVuZ3RoID4gMCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxOCk7CiAgICAgICAgybXJtXRleHQoMSwgIiBDbGljayBhbiBlYWdlciBleGVjdXRpb24gb3IgZ3JhcGggb3AgdG8gc2hvdyBpdHMgb3JpZ2luYWwgc3RhY2sgdHJhY2UuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzdfZGl2XzJfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjgpOwogICAgICAgIMm1ybV0ZXh0KDEsICIgXHUyOTEzICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGNvbnN0IF9jMSRhID0gZnVuY3Rpb24gKGEwLCBhMSkgeyByZXR1cm4gW2EwLCBhMV07IH07CiAgICBmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl83X2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTkgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAyMik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMjMpOwogICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMjQpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl83X2Rpdl8yX2Rpdl80X1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgMjUpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDI2KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9kaXZfN19kaXZfMl9UZW1wbGF0ZV9kaXZfY2xpY2tfNV9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTkpOyBjb25zdCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUgPSBjdHguJGltcGxpY2l0OyBjb25zdCBjdHhfcjE4ID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3IxOC5vblNvdXJjZUxpbmVDbGlja2VkLmVtaXQoc3RhY2tGcmFtZUZvckRpc3BsYXlfcjE1KTsgfSk7CiAgICAgICAgybXJtXRleHQoNik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiLCAyNyk7CiAgICAgICAgybXJtXRleHQoOCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yMTQgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0NsYXNzIiwgybXJtXB1cmVGdW5jdGlvbjIoNiwgX2MxJGEsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5iZWxvbmdzVG9Gb2N1c2VkRmlsZSA/ICJmb2N1c2VkLWZpbGUiIDogIiIsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5mb2N1c2VkID8gImZvY3VzZWQtc3RhY2stZnJhbWUiIDogIiIpKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZSgidGl0bGUiLCBzdGFja0ZyYW1lRm9yRGlzcGxheV9yMTUuZmlsZV9wYXRoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5jb25jaXNlX2ZpbGVfcGF0aCwgIiAiKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjE0LnN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlICYmIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5mb2N1c2VkKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiIExpbmUgIiwgc3RhY2tGcmFtZUZvckRpc3BsYXlfcjE1LmxpbmVubywgIiAiKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIHN0YWNrRnJhbWVGb3JEaXNwbGF5X3IxNS5mdW5jdGlvbl9uYW1lLCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE5LCAyMCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIFN0YWNrVHJhY2VDb21wb25lbnRfZGl2XzdfZGl2XzJfVGVtcGxhdGUsIDksIDksICJkaXYiLCAyMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eF9yMy5zdGFja0ZyYW1lc0ZvckRpc3BsYXkpOwogICAgfSB9CiAgICBmdW5jdGlvbiBTdGFja1RyYWNlQ29tcG9uZW50X25nX3RlbXBsYXRlXzhfVGVtcGxhdGUocmYsIGN0eCkgeyB9CiAgICBjbGFzcyBTdGFja1RyYWNlQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5zdGFja0ZyYW1lc0ZvckRpc3BsYXkgPSBudWxsOwogICAgICAgICAgICB0aGlzLm9uU291cmNlTGluZUNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuQ29kZUxvY2F0aW9uVHlwZSA9IENvZGVMb2NhdGlvblR5cGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlclZpZXdDaGVja2VkKCkgewogICAgICAgICAgICBpZiAodGhpcy5zdGFja0ZyYW1lQXJyYXkgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhY2tFbGVtZW50ID0gdGhpcy5zdGFja0ZyYW1lQXJyYXkubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmb2N1c2VkRnJhbWVFbGVtZW50ID0gc3RhY2tFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoYC5mb2N1c2VkLXN0YWNrLWZyYW1lYCk7CiAgICAgICAgICAgIGlmIChmb2N1c2VkRnJhbWVFbGVtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAvLyBTY3JvbGwgdGhlIGZvY3VzZWQgZnJhbWUgaW50byB2aWV3IHdoZW4gdGhlcmUgaXMgYSBmb2N1c2VkIGZyYW1lLgogICAgICAgICAgICAgICAgdGhpcy5zY3JvbGxUb0VsZW1lbnQoc3RhY2tFbGVtZW50LCBmb2N1c2VkRnJhbWVFbGVtZW50KTsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxhc3RGcmFtZUVsZW1lbnQgPSBzdGFja0VsZW1lbnQucXVlcnlTZWxlY3RvcignLnN0YWNrLWZyYW1lLWNvbnRhaW5lcjpsYXN0LWNoaWxkJyk7CiAgICAgICAgICAgIGlmIChsYXN0RnJhbWVFbGVtZW50ICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFRvRWxlbWVudChzdGFja0VsZW1lbnQsIGxhc3RGcmFtZUVsZW1lbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFyZW50RWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2Nyb2xsVG9FbGVtZW50KHBhcmVudEVsZW1lbnQsIGVsZW1lbnQpIHsKICAgICAgICAgICAgcGFyZW50RWxlbWVudC5zY3JvbGxUb3AgPSBlbGVtZW50Lm9mZnNldFRvcDsKICAgICAgICB9CiAgICB9CiAgICBTdGFja1RyYWNlQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzdGFjay10cmFjZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9zdGFja190cmFjZV9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vc3RhY2tfdHJhY2VfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgU3RhY2tUcmFjZUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjb2RlTG9jYXRpb25UeXBlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvcFR5cGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9wTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZXhlY3V0aW9uSW5kZXg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzdGFja0ZyYW1lc0ZvckRpc3BsYXk6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uU291cmNlTGluZUNsaWNrZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBzdGFja0ZyYW1lQXJyYXk6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydzdGFja0ZyYW1lQXJyYXknLF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU3RhY2tUcmFjZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RhY2tUcmFjZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTdGFja1RyYWNlQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFN0YWNrVHJhY2VDb21wb25lbnQsIHNlbGVjdG9yczogW1sic3RhY2stdHJhY2UtY29tcG9uZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIFN0YWNrVHJhY2VDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2MwJGosIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguc3RhY2tGcmFtZUFycmF5ID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGNvZGVMb2NhdGlvblR5cGU6ICJjb2RlTG9jYXRpb25UeXBlIiwgb3BUeXBlOiAib3BUeXBlIiwgb3BOYW1lOiAib3BOYW1lIiwgZXhlY3V0aW9uSW5kZXg6ICJleGVjdXRpb25JbmRleCIsIHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlOiAic3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUiLCBzdGFja0ZyYW1lc0ZvckRpc3BsYXk6ICJzdGFja0ZyYW1lc0ZvckRpc3BsYXkiIH0sIG91dHB1dHM6IHsgb25Tb3VyY2VMaW5lQ2xpY2tlZDogIm9uU291cmNlTGluZUNsaWNrZWQiIH0sIGRlY2xzOiAxMCwgdmFyczogNCwgY29uc3RzOiBbWzEsICJzdGFjay10cmFjZS1jb250YWluZXIiXSwgWzEsICJzdGFjay10cmFjZS1oZWFkZXIiXSwgWzEsICJzdGFjay10cmFjZS10aXRsZSJdLCBbImNsYXNzIiwgInN0YWNrLXRyYWNlLWF1eC1pbmZvIiwgNCwgIm5nSWYiLCAibmdJZkVsc2UiXSwgWyJub1N0YWNrVHJhY2UiLCAiIl0sIFsiY2xhc3MiLCAic3RhY2stZnJhbWUtYXJyYXkiLCA0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImxvYWRpbmdTZWN0aW9uIiwgIiJdLCBbMSwgInN0YWNrLXRyYWNlLWF1eC1pbmZvIl0sIFsxLCAiY29kZS1sb2NhdGlvbi1vcmlnaW4iLCAzLCAibmdTd2l0Y2giXSwgWzQsICJuZ1N3aXRjaENhc2UiXSwgWyJjbGFzcyIsICJzdGFjay10cmFjZS1ob3N0LW5hbWUiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImVhZ2VyLWV4ZWN1dGlvbi1pbmRleCIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAib3AtdHlwZSIsIDQsICJuZ0lmIl0sIFsxLCAiZWFnZXItZXhlY3V0aW9uLWluZGV4Il0sIFsxLCAib3AtdHlwZSJdLCBbImNsYXNzIiwgIm9wLW5hbWUiLCA0LCAibmdJZiJdLCBbMSwgIm9wLW5hbWUiXSwgWzEsICJzdGFjay10cmFjZS1ob3N0LW5hbWUiXSwgWzEsICJzdGFjay10cmFjZS1hdXgtaW5mbyIsICJuby1zdGFjay10cmFjZSJdLCBbMSwgInN0YWNrLWZyYW1lLWFycmF5Il0sIFsic3RhY2tGcmFtZUFycmF5IiwgIiJdLCBbImNsYXNzIiwgInN0YWNrLWZyYW1lLWNvbnRhaW5lciIsIDMsICJuZ0NsYXNzIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWzEsICJzdGFjay1mcmFtZS1jb250YWluZXIiLCAzLCAibmdDbGFzcyJdLCBbMSwgInN0YWNrLWZyYW1lLWZpbGUtcGF0aCIsIDMsICJ0aXRsZSJdLCBbMSwgInN0YWNrLWZyYW1lLWxpbmVuby1mdW5jdGlvbiJdLCBbImNsYXNzIiwgInN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yIiwgInRpdGxlIiwgIlN0aWNraW5nIHRvIHRoZSBib3R0b21tb3N0IGZyYW1lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdoZW4gbmF2aWdhdGluZyBleGVjdXRpb25zIGFuZCBncmFwaCBvcHMuIFRvIHJlbW92ZSB0aGlzIHN0aWNraW5nLCBjbGljayBhbnkgbm9uLWJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUuIiwgNCwgIm5nSWYiXSwgWzEsICJzdGFjay1mcmFtZS1saW5lbm8iLCAzLCAiY2xpY2siXSwgWzEsICJzdGFjay1mcmFtZS1mdW5jdGlvbiJdLCBbInRpdGxlIiwgIlN0aWNraW5nIHRvIHRoZSBib3R0b21tb3N0IGZyYW1lIGluIHRoZSBjdXJyZW50IHNvdXJjZSBmaWxlIHdoZW4gbmF2aWdhdGluZyBleGVjdXRpb25zIGFuZCBncmFwaCBvcHMuIFRvIHJlbW92ZSB0aGlzIHN0aWNraW5nLCBjbGljayBhbnkgbm9uLWJvdHRvbW1vc3Qgc3RhY2sgZnJhbWUuIiwgMSwgInN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU3RhY2tUcmFjZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJzcGFuIiwgMik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDMsICIgU3RhY2sgVHJhY2UgIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCA3LCA0LCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBTdGFja1RyYWNlQ29tcG9uZW50X25nX3RlbXBsYXRlXzVfVGVtcGxhdGUsIDIsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDQsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg3LCBTdGFja1RyYWNlQ29tcG9uZW50X2Rpdl83X1RlbXBsYXRlLCAzLCAxLCAiZGl2IiwgNSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg4LCBTdGFja1RyYWNlQ29tcG9uZW50X25nX3RlbXBsYXRlXzhfVGVtcGxhdGUsIDAsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDYsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMSA9IMm1ybVyZWZlcmVuY2UoNik7CiAgICAgICAgICAgIGNvbnN0IF9yNCA9IMm1ybVyZWZlcmVuY2UoOSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguY29kZUxvY2F0aW9uVHlwZSAhPT0gbnVsbCkoIm5nSWZFbHNlIiwgX3IxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkgIT09IG51bGwpKCJuZ0lmRWxzZSIsIF9yNCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZSwgTmdGb3JPZiwgTmdDbGFzc10sIHN0eWxlczogWyIuZm9jdXNlZC1maWxlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xufVxuXG4uZm9jdXNlZC1zdGFjay1mcmFtZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDI1NSwgMTExLCAwLCAwLjMpO1xufVxuXG4ubm8tc3RhY2stdHJhY2VbX25nY29udGVudC0lQ09NUCVdIHtcbiAgY29sb3I6ICM4MDgwODA7XG59XG5cbi5vcC1uYW1lW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIHdvcmQtd3JhcDogYW55d2hlcmU7XG59XG5cbi5vcC10eXBlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJhY2tncm91bmQtY29sb3I6ICNlM2U1ZTg7XG4gIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7XG4gIGJvcmRlci1yYWRpdXM6IDRweDtcbiAgZm9udC1mYW1pbHk6ICdSb2JvdG8gTW9ubycsIG1vbm9zcGFjZTtcbiAgZm9udC1zaXplOiAxMHB4O1xuICBoZWlnaHQ6IDE0cHg7XG4gIGxpbmUtaGVpZ2h0OiAxNHB4O1xuICBwYWRkaW5nOiAxcHggM3B4O1xuICB3aWR0aDogbWF4LWNvbnRlbnQ7XG59XG5cbi5zdGFjay1mcmFtZS1hcnJheVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBvdmVyZmxvdy14OiBoaWRkZW47XG4gIG92ZXJmbG93LXk6IGF1dG87XG4gIFxuICB3aWR0aDogY2FsYygxMDAlIC0gOHB4KTtcbn1cblxuLnN0YWNrLWZyYW1lLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItYm90dG9tOiAxcHggc29saWQgI2EwYTBhMDtcbn1cblxuLnN0YWNrLWZyYW1lLWZpbGUtcGF0aFtfbmdjb250ZW50LSVDT01QJV0ge1xuICBtYXgtd2lkdGg6IDE4MHB4O1xuICB3aWR0aDogMTgwcHg7XG59XG5cbi5zdGFjay1mcmFtZS1saW5lbm8tZnVuY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgdGV4dC1hbGlnbjogcmlnaHQ7XG4gIHdoaXRlLXNwYWNlOiBub3dyYXA7XG59XG5cbi5zdGFjay1mcmFtZS1mdW5jdGlvbltfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1heC13aWR0aDogMjAwcHg7XG4gIHBhZGRpbmctbGVmdDogMTBweDtcbiAgdGV4dC1hbGlnbjogbGVmdDtcbiAgd2hpdGUtc3BhY2U6IG5vcm1hbDtcbiAgd2lkdGg6IDIwMHB4O1xuICB3b3JkLXdyYXA6IGFueXdoZXJlO1xufVxuXG4uc3RhY2stZnJhbWUtbGluZW5vW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBtYXgtd2lkdGg6IDgwcHg7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lO1xuICB3aWR0aDogODBweDtcbn1cblxuLnN0YWNrLXRyYWNlLWF1eC1pbmZvW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIG1hcmdpbi10b3A6IDE1cHg7XG4gIHBhZGRpbmctbGVmdDogMjRweDtcbn1cblxuLnN0YWNrLXRyYWNlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItbGVmdDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGJveC1zaXppbmc6IGJvcmRlci1ib3g7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZmxvdzogY29sdW1uO1xuICBmb250LXNpemU6IDEwcHg7XG4gIGZvbnQtZmFtaWx5OiAnUm9ib3RvIE1vbm8nLCBtb25vc3BhY2U7XG4gIGhlaWdodDogMTAwJTtcbiAgbWFyZ2luLWxlZnQ6IDhweDtcbiAgbWF4LWhlaWdodDogMzYwcHg7XG4gIG92ZXJmbG93LXg6IGhpZGRlbjtcbiAgb3ZlcmZsb3cteTogaGlkZGVuO1xuICBwYWRkaW5nLWxlZnQ6IDhweDtcbiAgd2lkdGg6IDEwMCU7XG59XG5cbi5zdGFjay10cmFjZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNoYWRvdzogMCA1cHggM3B4IC0zcHggI2NjYztcbiAgcGFkZGluZy1ib3R0b206IDNweDtcbn1cbi5zdGFjay10cmFjZS1ob3N0LW5hbWVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgY29sb3I6ICM4MDgwODA7XG59XG5cbi5zdGFjay10cmFjZS10aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXdlaWdodDogYm9sZDtcbn1cblxuLnN0aWNrLXRvLWJvdHRvbW1vc3QtaW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGZvbnQtc2l6ZTogMTJweDtcbiAgcGFkZGluZy1yaWdodDogM3B4O1xufSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc3RhY2tfdHJhY2Uvc3RhY2tfdHJhY2VfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFN0YWNrVHJhY2VDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuY29kZUxvY2F0aW9uVHlwZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldENvZGVMb2NhdGlvbk9yaWdpbiwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbkluZm8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvcmlnaW5JbmZvKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luSW5mbyA9PT0gbnVsbCA/IG51bGwgOiBvcmlnaW5JbmZvLmNvZGVMb2NhdGlvblR5cGU7CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICB0aGlzLm9wVHlwZSQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGNyZWF0ZVNlbGVjdG9yKGdldENvZGVMb2NhdGlvbk9yaWdpbiwgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbkluZm8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvcmlnaW5JbmZvKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luSW5mbyA9PT0gbnVsbCA/IG51bGwgOiBvcmlnaW5JbmZvLm9wVHlwZTsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgICAgIHRoaXMub3BOYW1lJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Q29kZUxvY2F0aW9uT3JpZ2luLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luSW5mbwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG9yaWdpbkluZm8pID0+IHsKICAgICAgICAgICAgICAgIGlmIChvcmlnaW5JbmZvID09PSBudWxsIHx8CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luSW5mby5jb2RlTG9jYXRpb25UeXBlICE9PSBDb2RlTG9jYXRpb25UeXBlLkdSQVBIX09QX0NSRUFUSU9OKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luSW5mby5vcE5hbWU7CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICB0aGlzLmV4ZWN1dGlvbkluZGV4JCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoY3JlYXRlU2VsZWN0b3IoZ2V0Q29kZUxvY2F0aW9uT3JpZ2luLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luSW5mbwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKG9yaWdpbkluZm8pID0+IHsKICAgICAgICAgICAgICAgIGlmIChvcmlnaW5JbmZvID09PSBudWxsIHx8CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luSW5mby5jb2RlTG9jYXRpb25UeXBlICE9PSBDb2RlTG9jYXRpb25UeXBlLkVYRUNVVElPTikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbkluZm8uZXhlY3V0aW9uSW5kZXg7CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgICAgICB0aGlzLnN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0U3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUpKTsKICAgICAgICAgICAgdGhpcy5zdGFja0ZyYW1lc0ZvckRpc3BsYXkkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXRGb2N1c2VkU3RhY2tGcmFtZXMsIGdldEZvY3VzZWRTb3VyY2VMaW5lU3BlYywgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVzCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm9jdXNlZFNvdXJjZUxpbmVTcGVjCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc3RhY2tGcmFtZXMsIGZvY3VzZWRTb3VyY2VMaW5lU3BlYykgPT4gewogICAgICAgICAgICAgICAgaWYgKHN0YWNrRnJhbWVzID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvdXRwdXQgPSBbXTsKICAgICAgICAgICAgICAgIC8vIENvcnJlY3RseSBsYWJlbCBhbGwgdGhlIHN0YWNrIGZyYW1lcyBmb3IgZGlzcGxheS4KICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RhY2tGcmFtZSBvZiBzdGFja0ZyYW1lcykgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgaG9zdF9uYW1lLCBmaWxlX3BhdGgsIGxpbmVubywgZnVuY3Rpb25fbmFtZSB9ID0gc3RhY2tGcmFtZTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcGF0aEl0ZW1zID0gZmlsZV9wYXRoLnNwbGl0KCcvJyk7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbmNpc2VfZmlsZV9wYXRoID0gcGF0aEl0ZW1zW3BhdGhJdGVtcy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVsb25nc1RvRm9jdXNlZEZpbGUgPSBmb2N1c2VkU291cmNlTGluZVNwZWMgIT09IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICAgICAgaG9zdF9uYW1lID09PSBmb2N1c2VkU291cmNlTGluZVNwZWMuaG9zdF9uYW1lICYmCiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfcGF0aCA9PT0gZm9jdXNlZFNvdXJjZUxpbmVTcGVjLmZpbGVfcGF0aDsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZm9jdXNlZCA9IGJlbG9uZ3NUb0ZvY3VzZWRGaWxlICYmIGxpbmVubyA9PT0gKC8qKiBAdHlwZSB7P30gKi8gKGZvY3VzZWRTb3VyY2VMaW5lU3BlYykpLmxpbmVubzsKICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCh7CiAgICAgICAgICAgICAgICAgICAgICAgIGhvc3RfbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9wYXRoLAogICAgICAgICAgICAgICAgICAgICAgICBjb25jaXNlX2ZpbGVfcGF0aCwKICAgICAgICAgICAgICAgICAgICAgICAgbGluZW5vLAogICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBiZWxvbmdzVG9Gb2N1c2VkRmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgZm9jdXNlZCwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgICAgICAgIH0pKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFyZ3MKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU291cmNlTGluZUNsaWNrZWQoYXJncykgewogICAgICAgICAgICBjb25zdCB7IGhvc3RfbmFtZSwgZmlsZV9wYXRoLCBsaW5lbm8sIGZ1bmN0aW9uX25hbWUgfSA9IGFyZ3M7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RhY2tGcmFtZSA9IHsgaG9zdF9uYW1lLCBmaWxlX3BhdGgsIGxpbmVubywgZnVuY3Rpb25fbmFtZSB9OwogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNvdXJjZUxpbmVGb2N1c2VkKHsgc3RhY2tGcmFtZSB9KSk7CiAgICAgICAgfQogICAgfQogICAgU3RhY2tUcmFjZUNvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGYtZGVidWdnZXItdjItc3RhY2stdHJhY2UnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8c3RhY2stdHJhY2UtY29tcG9uZW50CiAgICAgIFtjb2RlTG9jYXRpb25UeXBlXT0iY29kZUxvY2F0aW9uVHlwZSQgfCBhc3luYyIKICAgICAgW29wVHlwZV09Im9wVHlwZSQgfCBhc3luYyIKICAgICAgW29wTmFtZV09Im9wTmFtZSQgfCBhc3luYyIKICAgICAgW2V4ZWN1dGlvbkluZGV4XT0iZXhlY3V0aW9uSW5kZXgkIHwgYXN5bmMiCiAgICAgIFtzdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZV09IgogICAgICAgIHN0aWNrVG9Cb3R0b21tb3N0RnJhbWVJbkZvY3VzZWRGaWxlJCB8IGFzeW5jCiAgICAgICIKICAgICAgW3N0YWNrRnJhbWVzRm9yRGlzcGxheV09InN0YWNrRnJhbWVzRm9yRGlzcGxheSQgfCBhc3luYyIKICAgICAgKG9uU291cmNlTGluZUNsaWNrZWQpPSJvblNvdXJjZUxpbmVDbGlja2VkKCRldmVudCkiCiAgICA+PC9zdGFjay10cmFjZS1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU3RhY2tUcmFjZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU3RhY2tUcmFjZUNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFN0YWNrVHJhY2VDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU3RhY2tUcmFjZUNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFN0YWNrVHJhY2VDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU3RhY2tUcmFjZUNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZSJdXSwgZGVjbHM6IDcsIHZhcnM6IDE4LCBjb25zdHM6IFtbMywgImNvZGVMb2NhdGlvblR5cGUiLCAib3BUeXBlIiwgIm9wTmFtZSIsICJleGVjdXRpb25JbmRleCIsICJzdGlja1RvQm90dG9tbW9zdEZyYW1lSW5Gb2N1c2VkRmlsZSIsICJzdGFja0ZyYW1lc0ZvckRpc3BsYXkiLCAib25Tb3VyY2VMaW5lQ2xpY2tlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFN0YWNrVHJhY2VDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInN0YWNrLXRyYWNlLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uU291cmNlTGluZUNsaWNrZWQiLCBmdW5jdGlvbiBTdGFja1RyYWNlQ29udGFpbmVyX1RlbXBsYXRlX3N0YWNrX3RyYWNlX2NvbXBvbmVudF9vblNvdXJjZUxpbmVDbGlja2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25Tb3VyY2VMaW5lQ2xpY2tlZCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDUsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg2LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJjb2RlTG9jYXRpb25UeXBlIiwgybXJtXBpcGVCaW5kMSgxLCA2LCBjdHguY29kZUxvY2F0aW9uVHlwZSQpKSgib3BUeXBlIiwgybXJtXBpcGVCaW5kMSgyLCA4LCBjdHgub3BUeXBlJCkpKCJvcE5hbWUiLCDJtcm1cGlwZUJpbmQxKDMsIDEwLCBjdHgub3BOYW1lJCkpKCJleGVjdXRpb25JbmRleCIsIMm1ybVwaXBlQmluZDEoNCwgMTIsIGN0eC5leGVjdXRpb25JbmRleCQpKSgic3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUiLCDJtcm1cGlwZUJpbmQxKDUsIDE0LCBjdHguc3RpY2tUb0JvdHRvbW1vc3RGcmFtZUluRm9jdXNlZEZpbGUkKSkoInN0YWNrRnJhbWVzRm9yRGlzcGxheSIsIMm1ybVwaXBlQmluZDEoNiwgMTYsIGN0eC5zdGFja0ZyYW1lc0ZvckRpc3BsYXkkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbU3RhY2tUcmFjZUNvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL2RlYnVnZ2VyX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBEZWJ1Z2dlckNvbXBvbmVudF90Zl9kZWJ1Z2dlcl92Ml9pbmFjdGl2ZV8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBEZWJ1Z2dlckNvbXBvbmVudF9uZ190ZW1wbGF0ZV8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDMpOwogICAgICAgIMm1ybVlbGVtZW50KDEsICJ0Zi1kZWJ1Z2dlci12Mi1hbGVydHMiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCA0KTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAidGYtZGVidWdnZXItdjItdGltZWxpbmUiKTsKICAgICAgICDJtcm1ZWxlbWVudCg0LCAidGYtZGVidWdnZXItdjItZ3JhcGgiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50KDUsICJ0Zi1kZWJ1Z2dlci12Mi1ncmFwaC1leGVjdXRpb25zIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJkaXYiLCA1KTsKICAgICAgICDJtcm1ZWxlbWVudCg3LCAidGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzIik7CiAgICAgICAgybXJtWVsZW1lbnQoOCwgInRmLWRlYnVnZ2VyLXYyLXN0YWNrLXRyYWNlIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgY2xhc3MgRGVidWdnZXJDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLnJ1bnMgPSB7fTsKICAgICAgICAgICAgdGhpcy5ydW5JZHMgPSBbXTsKICAgICAgICAgICAgdGhpcy5hY3RpdmVSdW5JZCA9IG51bGw7CiAgICAgICAgfQogICAgfQogICAgRGVidWdnZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2RlYnVnZ2VyLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2RlYnVnZ2VyX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9kZWJ1Z2dlcl9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBEZWJ1Z2dlckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBydW5zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBydW5JZHM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFjdGl2ZVJ1bklkOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z2dlckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIERlYnVnZ2VyQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnZ2VyQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERlYnVnZ2VyQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImRlYnVnZ2VyLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IHJ1bnM6ICJydW5zIiwgcnVuSWRzOiAicnVuSWRzIiwgYWN0aXZlUnVuSWQ6ICJhY3RpdmVSdW5JZCIgfSwgZGVjbHM6IDQsIHZhcnM6IDIsIGNvbnN0czogW1sxLCAiZGVidWdnZXItY29udGFpbmVyIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImRhdGFBdmFpbGFibGUiLCAiIl0sIFsxLCAidG9wLXNlY3Rpb24iXSwgWzEsICJ0b3AtY2VudGVyLXNlY3Rpb24iXSwgWzEsICJib3R0b20tc2VjdGlvbiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIERlYnVnZ2VyQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEsIERlYnVnZ2VyQ29tcG9uZW50X3RmX2RlYnVnZ2VyX3YyX2luYWN0aXZlXzFfVGVtcGxhdGUsIDEsIDAsICJ0Zi1kZWJ1Z2dlci12Mi1pbmFjdGl2ZSIsIDEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMiwgRGVidWdnZXJDb21wb25lbnRfbmdfdGVtcGxhdGVfMl9UZW1wbGF0ZSwgOSwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgMiwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgY29uc3QgX3IxID0gybXJtXJlZmVyZW5jZSgzKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5ydW5JZHMubGVuZ3RoID09PSAwKSgibmdJZkVsc2UiLCBfcjEpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIEluYWN0aXZlQ29udGFpbmVyLCBBbGVydHNDb250YWluZXIsIFRpbWVsaW5lQ29udGFpbmVyLCBHcmFwaENvbnRhaW5lciwgR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyLCBTb3VyY2VGaWxlc0NvbnRhaW5lciwgU3RhY2tUcmFjZUNvbnRhaW5lcl0sIHN0eWxlczogWyIuYm90dG9tLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYm9yZGVyLXRvcDogMXB4IHNvbGlkIHJnYmEoMCwgMCwgMCwgMC4xMik7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZ3JvdzogMTtcbiAgaGVpZ2h0OiAzNCU7XG4gIHBhZGRpbmctdG9wOiA2cHg7XG59XG5cbi5kZWJ1Z2dlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjtcbiAgaGVpZ2h0OiAxMDAlO1xuICBvdmVyZmxvdzogaGlkZGVuO1xufVxuXG4udG9wLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1ncm93OiAxO1xuICBoZWlnaHQ6IDY2JTtcbiAgcGFkZGluZzogNnB4IDA7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLWFsZXJ0c1tfbmdjb250ZW50LSVDT01QJV0ge1xuICBib3JkZXItcmlnaHQ6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIG1hcmdpbi1yaWdodDogMTBweDtcbiAgbWluLXdpZHRoOiAxNjBweDtcbiAgd2lkdGg6IGNhbGMoMTUlIC0gMTFweCk7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLWdyYXBoLWV4ZWN1dGlvbnNbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBmbGV4LWdyb3c6IDE7XG4gIG1pbi13aWR0aDogNTQwcHg7XG4gIHdpZHRoOiA1NDBweDtcbn1cblxudGYtZGVidWdnZXItdjItc291cmNlLWZpbGVzW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGRpc3BsYXk6IGlubGluZS1ibG9jaztcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogNzAlO1xufVxuXG50Zi1kZWJ1Z2dlci12Mi1zdGFjay10cmFjZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7XG4gIGZsZXgtZ3JvdzogMTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBtaW4td2lkdGg6IDU0MHB4O1xuICB3aWR0aDogNTQwcHg7XG59XG5cbi50b3AtY2VudGVyLXNlY3Rpb25bX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogaW5saW5lLWJsb2NrO1xuICBvdmVyZmxvdzogYXV0bztcbiAgd2lkdGg6IDU1JTtcbn1cblxudGYtZGVidWdnZXItdjItdGltZWxpbmVbX25nY29udGVudC0lQ09NUCVdIHtcbiAgZGlzcGxheTogYmxvY2s7XG59XG5cbnRmLWRlYnVnZ2VyLXYyLWdyYXBoW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gIGJvcmRlci10b3A6IDFweCBzb2xpZCByZ2JhKDAsIDAsIDAsIDAuMTIpO1xuICBkaXNwbGF5OiBibG9jaztcbiAgbWFyZ2luLXRvcDogNXB4O1xufSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi9kZWJ1Z2dlcl9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgRGVidWdnZXJDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMucnVucyQgPSB0aGlzLnN0b3JlLnBpcGUoc2VsZWN0KGdldERlYnVnZ2VyUnVuTGlzdGluZykpOwogICAgICAgICAgICB0aGlzLnJ1bnNJZHMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChjcmVhdGVTZWxlY3RvcihnZXREZWJ1Z2dlclJ1bkxpc3RpbmcsICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW5zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocnVucykgPT4gT2JqZWN0LmtleXMocnVucykpKSkpOwogICAgICAgICAgICB0aGlzLmFjdGl2ZVJ1bklkJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0QWN0aXZlUnVuSWQpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChkZWJ1Z2dlckxvYWRlZCgpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChkZWJ1Z2dlclVubG9hZGVkKCkpOwogICAgICAgIH0KICAgIH0KICAgIERlYnVnZ2VyQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Zi1kZWJ1Z2dlci12MicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxkZWJ1Z2dlci1jb21wb25lbnQKICAgICAgW3J1bnNdPSJydW5zJCB8IGFzeW5jIgogICAgICBbcnVuSWRzXT0icnVuc0lkcyQgfCBhc3luYyIKICAgICAgW2FjdGl2ZVJ1bklkXT0iYWN0aXZlUnVuSWQkIHwgYXN5bmMiCiAgICA+PC9kZWJ1Z2dlci1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRGVidWdnZXJDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gRGVidWdnZXJDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVidWdnZXJDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z2dlckNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBEZWJ1Z2dlckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJ0Zi1kZWJ1Z2dlci12MiJdXSwgZGVjbHM6IDQsIHZhcnM6IDksIGNvbnN0czogW1szLCAicnVucyIsICJydW5JZHMiLCAiYWN0aXZlUnVuSWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBEZWJ1Z2dlckNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgImRlYnVnZ2VyLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInJ1bnMiLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC5ydW5zJCkpKCJydW5JZHMiLCDJtcm1cGlwZUJpbmQxKDIsIDUsIGN0eC5ydW5zSWRzJCkpKCJhY3RpdmVSdW5JZCIsIMm1ybVwaXBlQmluZDEoMywgNywgY3R4LmFjdGl2ZVJ1bklkJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0RlYnVnZ2VyQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vZWZmZWN0cy9kZWJ1Z2dlcl9lZmZlY3RzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIE1pbmltdW0gcG9sbGluZyBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBNSU5fUE9MTElOR19JTlRFUlZBTF9NUyA9IDJlMzsKICAgIC8vIE1heGltdW0gcG9sbGluZyBpbnRlcnZhbCBpbiBtaWxpc2Vjb25kcy4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE1BWF9QT0xMSU5HX0lOVEVSVkFMX01TID0gNjBlMzsKICAgIC8vIEJhY2tvZmYgYmVoYXZpb3IgdGFrZXMgZWZmZWN0IHdoZW4gdGltZSBzaW5jZSB0aGUgZWxhcHNlZCB0aW1lIGJldHdlZW4gdGhlCiAgICAvLyBtb3N0IHJlY2VudCBhcnJpdmFsIG9mIG5ldyBwb2xsaW5nIHJlc3VsdCBhbmQgdGhlIG1vc3QgcmVjZW50IHBvbGxpbmcgZXZlbnQKICAgIC8vIGV4Y2VlZHMgYHBvbGxpbmdCYWNrb2ZmRmFjdG9yICogbWluaW11bVBvbGxpbmdJbnRlcnZhbGAuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBQT0xMSU5HX0JBQ0tPRkZfRkFDVE9SID0gMjsKICAgIC8qKgogICAgICogQ29tcHV0ZXMgdGhlIGN1cnJlbnQgcG9sbGluZyBpbnRlcnZhbCBiYXNlZCBvbiB0aGUgdGltZSBsYXBzZWQgc2luY2UKICAgICAqIGxhc3QgbmV3IHBvbGxpbmcgZGF0YSBhbmQgdGhlIGxhc3QgcG9sbGluZyBldmVudC4KICAgICAqCiAgICAgKiBUaGlzIHNwZWNpZmllcyBhIGJhY2tvZmYgYmVoYXZpb3Igd2hlcmUgYSBsb25nZXIgcGVyaW9kIG9mIG5vIG5ldyBkYXRhCiAgICAgKiBsZWFkcyB0byBhIGxvbmdlciBwb2xsaW5nIGludGVydmFsLCB3aXRoIGEgY2VpbGluZyBhcyB0aGUgbGltaXQuCiAgICAgKgogICAgICogQHBhcmFtIHs/fSBwb2xsU2lsZW5jZVRpbWUgVGhlIGFtb3VudCBvZiB0aW1lIGJldHdlZW4gdGhlIG1vc3QKICAgICAqICAgcmVjZW50IGFycml2YWwgb2YgbmV3IHBvbGxpbmcgcmVzdWx0IGFuZCB0aGUgbGFzdCBwb2xsaW5nIGV2ZW50LgogICAgICogQHJldHVybiB7P30gVGhlIGN1cnJlbnQgcG9sbGluZyBpbnRlcnZhbCwgaS5lLiwgbG93IGJvdW5kIGZvciB0aGUgdGltZSBiZXR3ZWVuCiAgICAgKiAgIHRoZSBsYXN0IHBvbGxpbmcgZXZlbnQgYW5kIHRoZSBuZXh0IG9uZS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0Q3VycmVudFBvbGxpbmdJbnRlcnZhbChwb2xsU2lsZW5jZVRpbWUpIHsKICAgICAgICBpZiAocG9sbFNpbGVuY2VUaW1lID4gTUFYX1BPTExJTkdfSU5URVJWQUxfTVMpIHsKICAgICAgICAgICAgcmV0dXJuIE1BWF9QT0xMSU5HX0lOVEVSVkFMX01TOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChwb2xsU2lsZW5jZVRpbWUgPgogICAgICAgICAgICBNSU5fUE9MTElOR19JTlRFUlZBTF9NUyAqIFBPTExJTkdfQkFDS09GRl9GQUNUT1IpIHsKICAgICAgICAgICAgcmV0dXJuIHBvbGxTaWxlbmNlVGltZTsKICAgICAgICB9CiAgICAgICAgZWxzZSB7CiAgICAgICAgICAgIHJldHVybiBNSU5fUE9MTElOR19JTlRFUlZBTF9NUzsKICAgICAgICB9CiAgICB9CiAgICAvKioKICAgICAqIEdldHRpbmcgcGFnZSBpbmRpY2VzIHRoYXQgYXJlIG1pc3NpbmcgZnJvbSB0aGUgZGF0YSBhbmQgaGVuY2UgbmVlZCB0byBiZQogICAgICogcmVxdWVzdGVkLgogICAgICoKICAgICAqIEBwYXJhbSB7P30gYmVnaW4gQmVnaW5uaW5nIGl0ZW0gaW5kZXggKGluY2x1c2l2ZSkuCiAgICAgKiBAcGFyYW0gez99IGVuZCBFbmRpbmcgaXRlbSBpbmRleCAoZXhjbHVzaXZlKS4KICAgICAqIEBwYXJhbSB7P30gcGFnZVNpemUgU2l6ZSBvZiBlYWNoIHBhZ2UsIGkuZS4sIGhvdyBtYW55IGl0ZW1zIHRoZXJlIGFyZSBpbiBlYWNoCiAgICAgKiAgIGNvbXBsZXRlIHBhZ2UuIFRoaXMgbXVzdCBiZSBgPj0gZW5kIC0gYmVnaW5gLCBvciBhbiBFcnJvciB3aWxsIGJlCiAgICAgKiAgIHRocm93bi4KICAgICAqIEBwYXJhbSB7P30gbnVtSXRlbXMKICAgICAqIEBwYXJhbSB7P30gcGFnZUxvYWRlZFNpemVzIEEgbWFwIGZyb20gcGFnZSBpbmRleCB0byBob3cgbWFueSBpdGVtcyBoYXZlIGJlZW4KICAgICAqICAgbG9hZGVkIGZvciB0aGF0IHBhZ2Ugc28gZmFyLgogICAgICogQHJldHVybiB7P30gQW4gYXJyYXkgb2YgdGhlIHBhZ2UgaW5kaWNlcyB0aGF0IGFyZSBjdXJyZW50bHkgbWlzc2luZyBhbmQgaGVuY2UKICAgICAqICAgc2hvdWxkIGJlIHJlcXVlc3RlZCBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkYXRhIHNvdXJjZS4KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWlzc2luZ1BhZ2VzKGJlZ2luLCBlbmQsIHBhZ2VTaXplLCBudW1JdGVtcywgcGFnZUxvYWRlZFNpemVzKSB7CiAgICAgICAgaWYgKHBhZ2VTaXplIDw9IDAgfHwgIU51bWJlci5pc0ludGVnZXIocGFnZVNpemUpKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSW52YWxpZCBwYWdlU2l6ZTogJHtwYWdlU2l6ZX1gKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVuZCA+IG51bUl0ZW1zKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgZW5kIGluZGV4ICgke2VuZH0pIGV4Y2VlZHMgdG90YWwgbnVtYmVyIG9mIGl0ZW1zICgke251bUl0ZW1zfSlgKTsKICAgICAgICB9CiAgICAgICAgaWYgKGVuZCAtIGJlZ2luID4gcGFnZVNpemUpIHsKICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdiZWdpbi1lbmQgc3BhbiBleGNlZWRzIHBhZ2Ugc2l6ZSwgd2hpY2ggaXMgbm90IGFsbG93ZWQnKTsKICAgICAgICB9CiAgICAgICAgLy8gVGhlIGNvbnN0cmFpbnQgdGhhdCBgZW5kIC0gYmVnaW4gPD0gcGFnZWAgZ3VhcmFudGVlcyB0aGF0IGF0IG1vc3Qgb25seSB0d28KICAgICAgICAvLyBwYWdlcyBuZWVkIHRvIGJlIHJlcXVlc3RlZC4KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbWlzc2luZ1BhZ2VzID0gW107CiAgICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgZmlyc3Qgb2YgdGhlIHR3byBwb3NzaWJsZSBwYWdlcyBuZWVkcyB0byBiZSByZXF1ZXN0ZWQuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpcnN0UGFnZUluZGV4ID0gTWF0aC5mbG9vcihiZWdpbiAvIHBhZ2VTaXplKTsKICAgICAgICBpZiAoIShmaXJzdFBhZ2VJbmRleCBpbiBwYWdlTG9hZGVkU2l6ZXMpIHx8CiAgICAgICAgICAgIChwYWdlTG9hZGVkU2l6ZXNbZmlyc3RQYWdlSW5kZXhdIDwgcGFnZVNpemUgJiYKICAgICAgICAgICAgICAgIGZpcnN0UGFnZUluZGV4ICogcGFnZVNpemUgKyBwYWdlTG9hZGVkU2l6ZXNbZmlyc3RQYWdlSW5kZXhdIDwgbnVtSXRlbXMpKSB7CiAgICAgICAgICAgIG1pc3NpbmdQYWdlcy5wdXNoKGZpcnN0UGFnZUluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNlY29uZFBhZ2VJbmRleCA9IE1hdGguZmxvb3IoKGVuZCAtIDEpIC8gcGFnZVNpemUpOwogICAgICAgIGlmIChzZWNvbmRQYWdlSW5kZXggIT09IGZpcnN0UGFnZUluZGV4KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYW55RGlnZXN0TWlzc2luZzEgPSAhKHNlY29uZFBhZ2VJbmRleCBpbiBwYWdlTG9hZGVkU2l6ZXMpIHx8CiAgICAgICAgICAgICAgICAoc2Vjb25kUGFnZUluZGV4ICogcGFnZVNpemUgKyBwYWdlTG9hZGVkU2l6ZXNbc2Vjb25kUGFnZUluZGV4XSA8IGVuZCAmJgogICAgICAgICAgICAgICAgICAgIGVuZCA8IG51bUl0ZW1zKTsKICAgICAgICAgICAgaWYgKGFueURpZ2VzdE1pc3NpbmcxKSB7CiAgICAgICAgICAgICAgICBtaXNzaW5nUGFnZXMucHVzaChzZWNvbmRQYWdlSW5kZXgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBtaXNzaW5nUGFnZXM7CiAgICB9CiAgICAvKioKICAgICAqIFJlcGVhdCBhbiBpbnB1dCBzdHJlYW0gYXQgZ2l2ZW4gaW50ZXJ2YWxzLgogICAgICogQHBhcmFtIHs/fSBzdHJlYW0kIFRoZSBzdHJlYW0gdG8gcmVwZWF0LgogICAgICogQHBhcmFtIHs/fSBwb2xsaW5nSW50ZXJ2YWxTdHJlYW0kIFRoZSBzdHJlYW0gb2YgcG9sbGluZyBpbnRlcnZhbHMuCiAgICAgKiAgIFRoZSBsYXRlc3QgdmFsdWUgb2YgdGhpcyBzdHJlYW0gd2lsbCBiZSB1c2VkIGFzIHRoZSBpbnRlcnZhbCBiZXR3ZWVuCiAgICAgKiAgIHRoZSBwcmV2aW91cyByZXBlYXQgYW5kIHRoZSBuZXh0IG9uZS4KICAgICAqIEBwYXJhbSB7P30gdGVybWluYXRpb25TdHJlYW0kIFRlcm1pbmF0ZSB0aGUgcmVwZWF0IG9uIHZhbHVlcyBmcm9tIHRoaXMgc3RyZWFtLgogICAgICogQHJldHVybiB7P30gU3RyZWFtIHdpdGggdGhlIHRpbWVkIHJlcGVhdHMuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGNyZWF0ZVRpbWVkUmVwZWF0ZXIoc3RyZWFtJCwgcG9sbGluZ0ludGVydmFsU3RyZWFtJCwgdGVybWluYXRpb25TdHJlYW0kKSB7CiAgICAgICAgcmV0dXJuIHN0cmVhbSQucGlwZShyZXBlYXRXaGVuKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBsZXRlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGNvbXBsZXRlZCkgPT4gY29tcGxldGVkLnBpcGUod2l0aExhdGVzdEZyb20ocG9sbGluZ0ludGVydmFsU3RyZWFtJCksIGRlbGF5V2hlbigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChbLCBwb2xsaW5nSW50ZXJ2YWxdKSA9PiB7CiAgICAgICAgICAgIHJldHVybiB0aW1lcihwb2xsaW5nSW50ZXJ2YWwpOwogICAgICAgIH0pKSkpKSwgdGFrZVVudGlsKHRlcm1pbmF0aW9uU3RyZWFtJCksIG1hcCgoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICB9CiAgICBjbGFzcyBEZWJ1Z2dlckVmZmVjdHMgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9ucyQKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhU291cmNlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYWN0aW9ucyQsIHN0b3JlLCBkYXRhU291cmNlKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyQgPSBhY3Rpb25zJDsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogdmlldyBsb2FkIGFuZCBzdWJzZXF1ZW50CiAgICAgICAgICAgICAqIGJhY2tvZmYgcG9sbHMsIGF1dG8gYW5kCiAgICAgICAgICAgICAqIG1hbnVhbCByZWxvYWQgZXZlbnRzCiAgICAgICAgICAgICAqICB8CiAgICAgICAgICAgICAqICArPiBmZXRjaCBydW4tKz4gZmV0Y2ggc291cmNlLWZpbGUgbGlzdAogICAgICAgICAgICAgKiAgfCAgICAgICAgICAgICs+IGZldGNoIG51bSBvZiB0b3AtbGV2ZWwgKGVhZ2VyKSBleGVjdXRpb25zCiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgKz4gZmV0Y2ggbnVtIG9mIGludHJhLWdyYXBoIGV4ZWN1dGlvbnMKICAgICAgICAgICAgICogIHwgICAgICAgICAgICArPiBmZXRjaCBudW0gYWxlcnRzCiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICsKICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgKz4gaWYgaW5pdCBsb2FkIGFuZCBub24temVybyBudW1iZXIgb2YgZXhlY3MKICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICsKICAgICAgICAgICAgICogIHwgICAgICAgICAgICAgICAgICAgICs+Ky0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwogICAgICAgICAgICAgKiAgfCAgb24gdG9wLWxldmVsICAgICAgfCB8IGZldGNoIHRvcC1sZXZlbCBleGVjIGRpZ2VzdCB8CiAgICAgICAgICAgICAqICB8ICBzY3JvbGwgLS0tLS0tLS0tLS0rPistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSs8LS0tLS0tLS0rCiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICArPistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICB8CiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgIHwgZmV0Y2ggZXhlYyBkYXRhIGFuZCBzdGFjayBmcmFtZXMgfCAgICB8CiAgICAgICAgICAgICAqICB8ICBvbiBmb2N1cyAgKy0tLS0tLS0tPistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKyAgICB8CiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAqICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAqICArLS0tLS0tPisgZmV0Y2ggYWxlcnQgbnVtYmVyIGFuZCBicmVha2Rvd24gICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CiAgICAgICAgICAgICAqIG9uIGFsZXJ0IHR5cGUgZm9jdXMgLS0tLS0tLS0+IGZldGNoIGFsZXJ0cyBvZiBhIHR5cGUgLS0tLS0tLS0tLS0rCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIG9uIHNvdXJjZSBmaWxlIHJlcXVlc3RlZCAtLS0+IGZldGNoIHNvdXJjZSBmaWxlCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIG9uIGdyYXBoLWV4ZWN1dGlvbiBzY3JvbGwgLS0+IGZldGNoIGdyYXBoLWV4ZWN1dGlvbiBkYXRhCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIG9uIGdyYXBoLW9wIGZvY3VzICYgZ3JhcGgtZXhlY3V0aW9uIGZvY3VzIC0tPiBmZXRjaCBncmFwaC1vcCBpbmZvIC0tLSsKICAgICAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAogICAgICAgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2ggc3RhY2sgZnJhbWVzIDwtLS0tLS0rCiAgICAgICAgICAgICAqKi8KICAgICAgICAgICAgdGhpcy5sb2FkRGF0YSQgPSBjcmVhdGVFZmZlY3QoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBjYW4gdHJpZ2dlciB0aGUgbG9hZGluZyBvZgogICAgICAgICAgICAgICAgLy8gICAtIGxpc3Qgb2Ygc291cmNlIGZpbGVzLgogICAgICAgICAgICAgICAgLy8gICAtIG51bWJlciBvZiBleGVjdXRpb25zCiAgICAgICAgICAgICAgICAvLyAgIC0gbnVtYmVyIGFuZCBicmVha2Rvd24gb2YgYWxlcnRzLgogICAgICAgICAgICAgICAgLy8gVGhlcmVmb3JlIGl0IG5lZWRzIHRvIGJlIGEgc2hhcmVkIG9ic2VydmFibGUuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsb2FkUnVuRGF0YSQgPSB0aGlzLmxvYWREZWJ1Z2dlclJ1bnMobWVyZ2UodGhpcy5vbkRlYnVnZ2VyRGF0YVBvbGwoKSwgdGhpcy5vbkNvcmVSZWxvYWQoKSkpLnBpcGUoc2hhcmUoKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsb2FkU291cmNlRmlsZUxpc3QkID0gdGhpcy5sb2FkU291cmNlRmlsZUxpc3QobG9hZFJ1bkRhdGEkKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9uTnVtRXhlY3V0aW9uTG9hZGVkJCA9IHRoaXMuY3JlYXRlTnVtRXhlY3V0aW9uTG9hZGVyKGxvYWRSdW5EYXRhJCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbk51bUFsZXJ0c0xvYWRlZCQgPSB0aGlzLmNyZWF0ZU51bUFsZXJ0c0FuZEJyZWFrZG93bkxvYWRlcihsb2FkUnVuRGF0YSQpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb25BbGVydFR5cGVGb2N1c2VkJCA9IHRoaXMub25BbGVydFR5cGVGb2N1c2VkKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHNGb3JBbGVydFR5cGVGb2N1cyQgPSB0aGlzLmZldGNoRXhlY3V0aW9uRGlnZXN0c0ZvckFsZXJ0VHlwZUZvY3VzKG9uQWxlcnRUeXBlRm9jdXNlZCQpOwogICAgICAgICAgICAgICAgLy8gVGhpcyBldmVudCBjYW4gdHJpZ2dlciB0aGUgbG9hZGluZyBvZgogICAgICAgICAgICAgICAgLy8gICAtIGV4ZWN1dGlvbi1kaWdlc3QKICAgICAgICAgICAgICAgIC8vICAgLSBmaXJzdCBleGVjdXRpb24gZGF0YS4KICAgICAgICAgICAgICAgIC8vIFRoZXJlZm9yZSBpdCBuZWVkcyB0byBiZSBhIHNoYXJlZCBvYnNlcnZhYmxlLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb25Jbml0aWFsRXhlY3V0aW9uJCA9IHRoaXMuY3JlYXRlSW5pdGlhbEV4ZWN1dGlvbkRldGVjdG9yKG9uTnVtRXhlY3V0aW9uTG9hZGVkJCkucGlwZShzaGFyZSgpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9uRXhjdXRpb25EaWdlc3RMb2FkZWQkID0gdGhpcy5jcmVhdGVFeGVjdXRpb25EaWdlc3RMb2FkZXIobWVyZ2UodGhpcy5vbkV4ZWN1dGlvblNjcm9sbCgpLCB0aGlzLmNyZWF0ZUluaXRpYWxFeGVjdXRpb25EaWdlc3Qob25Jbml0aWFsRXhlY3V0aW9uJCksIGZldGNoRXhlY3V0aW9uRGlnZXN0c0ZvckFsZXJ0VHlwZUZvY3VzJCkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgb25FeGVjdXRpb25EYXRhTG9hZGVkJCA9IHRoaXMuY3JlYXRlRXhlY3V0aW9uRGF0YUFuZFN0YWNrRnJhbWVzTG9hZGVyKG1lcmdlKHRoaXMub25FeGVjdXRpb25EaWdlc3RGb2N1c2VkKCksIG9uSW5pdGlhbEV4ZWN1dGlvbiQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldExvYWRlZEV4ZWN1dGlvbkRhdGEpKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoWywgYWN0aXZlUnVuSWQsIGxvYWRlZEV4ZWN1dGlvbkRhdGFdKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlUnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChhY3RpdmVSdW5JZCkpLAogICAgICAgICAgICAgICAgICAgICAgICBsb2FkZWRFeGVjdXRpb25EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICBmb2N1c0luZGV4OiAwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSkpKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbk51bUdyYXBoRXhlY3V0aW9uTG9hZGVkJCA9IHRoaXMuY3JlYXRlTnVtR3JhcGhFeGVjdXRpb25Mb2FkZXIobG9hZFJ1bkRhdGEkKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9uU291cmNlRmlsZUZvY3VzZWQkID0gdGhpcy5vblNvdXJjZUZpbGVGb2N1c2VkKCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvbkdyYXBoRXhlY3V0aW9uU2Nyb2xsJCA9IHRoaXMubG9hZEdyYXBoRXhlY3V0aW9uUGFnZXModGhpcy5vbkdyYXBoRXhlY3V0aW9uU2Nyb2xsKCkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbG9hZEdyYXBoT3BJbmZvQW5kU3RhY2tUcmFjZSQgPSB0aGlzLmxvYWRHcmFwaE9wU3RhY2tGcmFtZXModGhpcy5sb2FkR3JhcGhPcEluZm8oKSk7CiAgICAgICAgICAgICAgICAvLyBFeGVjdXRpb25EaWdlc3QgYW5kIEV4ZWN1dGlvbkRhdGEgY2FuIGJlIGxvYWRlZCBpbiBwYXJhbGxlbC4KICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZShvbk51bUFsZXJ0c0xvYWRlZCQsIG9uRXhjdXRpb25EaWdlc3RMb2FkZWQkLCBvbkV4ZWN1dGlvbkRhdGFMb2FkZWQkLCBvbk51bUdyYXBoRXhlY3V0aW9uTG9hZGVkJCwgbG9hZFNvdXJjZUZpbGVMaXN0JCwgb25Tb3VyY2VGaWxlRm9jdXNlZCQsIG9uR3JhcGhFeGVjdXRpb25TY3JvbGwkLCBsb2FkR3JhcGhPcEluZm9BbmRTdGFja1RyYWNlJCkucGlwZSgKICAgICAgICAgICAgICAgIC8vIGNyZWF0ZUVmZmVjdCBleHBlY3RzIGFuIE9ic2VydmFibGUgdGhhdCBlbWl0cyB7fS4KICAgICAgICAgICAgICAgIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiAoe30pKSkpOwogICAgICAgICAgICB9KSwgeyBkaXNwYXRjaDogZmFsc2UgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkRlYnVnZ2VyRGF0YVBvbGwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGRlYnVnZ2VyTG9hZGVkKSwgc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhY3Rpb24pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjcmVhdGVUaW1lZFJlcGVhdGVyKG9mKGFjdGlvbiksIHRoaXMuc3RvcmUuc2VsZWN0KGdldFBvbGxTaWxlbmNlVGltZU1zKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBvbGxTaWxlbmNlVGltZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHBvbGxTaWxlbmNlVGltZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRDdXJyZW50UG9sbGluZ0ludGVydmFsKHBvbGxTaWxlbmNlVGltZSk7CiAgICAgICAgICAgICAgICB9KSkpLCB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGRlYnVnZ2VyVW5sb2FkZWQpKSk7CiAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goZGVidWdnZXJEYXRhUG9sbE9uc2V0KCkpKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkNvcmVSZWxvYWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKG1hbnVhbFJlbG9hZCwgcmVsb2FkKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goZGVidWdnZXJEYXRhUG9sbE9uc2V0KCkpKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlcXVlc3QgbGlzdCBvZiBkZWJ1Z2dlciBydW5zLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2U3RyZWFtJAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbG9hZERlYnVnZ2VyUnVucyhwcmV2U3RyZWFtJCkgewogICAgICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXREZWJ1Z2dlclJ1bnNMb2FkZWQpKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCB7IHN0YXRlIH1dKSA9PiBzdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKGRlYnVnZ2VyUnVuc1JlcXVlc3RlZCgpKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoUnVucygpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVucwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHJ1bnMpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGRlYnVnZ2VyUnVuc0xvYWRlZCh7IHJ1bnM6ICgvKiogQHR5cGUgez99ICovIChydW5zKSkgfSkpOwogICAgICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkKICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZW4gYSBkZWJ1Z2dlciBydW4gZXhpc3RzLCBsb2FkIG51bWJlciBvZiB0b3AtbGV2ZWwgZXhlY3V0aW9ucy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNyZWF0ZU51bUV4ZWN1dGlvbkxvYWRlcihwcmV2U3RyZWFtJCkgewogICAgICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXREZWJ1Z2dlclJ1bkxpc3RpbmcpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXROdW1FeGVjdXRpb25zTG9hZGVkKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgcnVucywgbG9hZGVkXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIChPYmplY3Qua2V5cyhydW5zKS5sZW5ndGggPiAwICYmIGxvYWRlZC5zdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HKTsKICAgICAgICAgICAgfSkpLCB0YXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChudW1FeGVjdXRpb25zUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBydW5zXSkgPT4gewogICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogSGFuZGxlIG11bHRpcGxlIHJ1bnMuIEN1cnJlbnRseSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlcmUKICAgICAgICAgICAgICAgIC8vIGlzIGF0IG1vc3Qgb25seSBvbmUgZGVidWdnZXIgcnVuIGF2YWlsYWJsZS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJ1bklkID0gT2JqZWN0LmtleXMocnVucylbMF07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBiZWdpbiA9IDA7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEV4ZWN1dGlvbkRpZ2VzdHMocnVuSWQsIGJlZ2luLCBlbmQpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlnZXN0cwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGRpZ2VzdHMpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG51bUV4ZWN1dGlvbnNMb2FkZWQoeyBudW1FeGVjdXRpb25zOiBkaWdlc3RzLm51bV9kaWdlc3RzIH0pKTsKICAgICAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHZvaWQgbnVsbCkpKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBhIGRlYnVnZ2VyIHJ1biBleGlzdHMsIGxvYWQgbnVtYmVyIG9mIGludHJhLWdyYXBoIGV4ZWN1dGlvbnMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVOdW1HcmFwaEV4ZWN1dGlvbkxvYWRlcihwcmV2U3RyZWFtJCkgewogICAgICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXREZWJ1Z2dlclJ1bkxpc3RpbmcpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXROdW1HcmFwaEV4ZWN1dGlvbnNMb2FkZWQpKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBydW5zLCBsb2FkZWRdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gKE9iamVjdC5rZXlzKHJ1bnMpLmxlbmd0aCA+IDAgJiYgbG9hZGVkLnN0YXRlICE9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgICAgICB9KSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKG51bUdyYXBoRXhlY3V0aW9uc1JlcXVlc3RlZCgpKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgcnVuc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJ1bklkID0gT2JqZWN0LmtleXMocnVucylbMF07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBiZWdpbiA9IDA7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSAwOwogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZQogICAgICAgICAgICAgICAgICAgIC5mZXRjaEdyYXBoRXhlY3V0aW9uRGlnZXN0cyhydW5JZCwgYmVnaW4sIGVuZCkKICAgICAgICAgICAgICAgICAgICAucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaWdlc3RzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZGlnZXN0cykgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtR3JhcGhFeGVjdXRpb25zTG9hZGVkKHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVtR3JhcGhFeGVjdXRpb25zOiBkaWdlc3RzLm51bV9kaWdlc3RzLAogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHZvaWQgbnVsbCkpKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiBhIGRlYnVnZ2VyIHJ1biBleGlzdHMsIGxvYWQgbnVtYmVyIG9mIGFsZXJ0cyBhbmQgdGhlaXIgYnJlYWtkb3duLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2U3RyZWFtJAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlTnVtQWxlcnRzQW5kQnJlYWtkb3duTG9hZGVyKHByZXZTdHJlYW0kKSB7CiAgICAgICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldERlYnVnZ2VyUnVuTGlzdGluZyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFsZXJ0c0xvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIHJ1bnMsIGxvYWRlZF0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoT2JqZWN0LmtleXMocnVucykubGVuZ3RoID4gMCAmJiBsb2FkZWQuc3RhdGUgIT09IERhdGFMb2FkU3RhdGUuTE9BRElORyk7CiAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtQWxlcnRzQW5kQnJlYWtkb3duUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBydW5zXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcnVuSWQgPSBPYmplY3Qua2V5cyhydW5zKVswXTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJlZ2luID0gMDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoQWxlcnRzKHJ1bklkLCBiZWdpbiwgZW5kKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGFsZXJ0cwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGFsZXJ0cykgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtQWxlcnRzQW5kQnJlYWtkb3duTG9hZGVkKHsKICAgICAgICAgICAgICAgICAgICAgICAgbnVtQWxlcnRzOiBhbGVydHMubnVtX2FsZXJ0cywKICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnRzQnJlYWtkb3duOiBhbGVydHMuYWxlcnRzX2JyZWFrZG93biwKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gaW5pdGlhbCBleGVjdXRpb24gZGlnZXN0cyBhbmQgZGF0YSBhcmUgcmVxdWlyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBUaGVzZSBpbml0aWFsIGRhdGEgbG9hZGluZyBhY3Rpb25zIGFyZSByZXF1aXJlZCB3aGVuIHRoZSBudW1iZXIgb2YKICAgICAgICAgKiBleGVjdXRpb25zIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2U3RyZWFtJAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY3JlYXRlSW5pdGlhbEV4ZWN1dGlvbkRldGVjdG9yKHByZXZTdHJlYW0kKSB7CiAgICAgICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUV4ZWN1dGlvbnMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25EaWdlc3RzTG9hZGVkKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgbnVtRXhlY3V0aW9ucywgZXhlY3V0aW9uRGlnZXN0c0xvYWRlZF0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAobnVtRXhlY3V0aW9ucyA+IDAgJiYKICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhleGVjdXRpb25EaWdlc3RzTG9hZGVkLnBhZ2VMb2FkZWRTaXplcykubGVuZ3RoID09PSAwKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB3aGVuIHRoZSBmaXJzdCBwYWdlIGlmIGV4ZWN1dGlvbiBkaWdlc3RzIGFyZSByZXF1aXJlZCB0byBiZSBsb2FkZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVJbml0aWFsRXhlY3V0aW9uRGlnZXN0KHByZXZTdHJlYW0kKSB7CiAgICAgICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUV4ZWN1dGlvbnMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4ZWN1dGlvblBhZ2VTaXplKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgLCBydW5JZF0pID0+IHJ1bklkICE9PSBudWxsKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgbnVtRXhlY3V0aW9ucywgcnVuSWQsIHBhZ2VTaXplXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVnaW4gPSAwOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4obnVtRXhlY3V0aW9ucywgcGFnZVNpemUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsgYmVnaW4sIGVuZCwgcnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChydW5JZCkpIH07CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gc2Nyb2xsaW5nIGV2ZW50IGxlYWRzIHRvIG5lZWQgdG8gbG9hZCBuZXcgZXhlY3V0aW9uIGRpZ2VzdHMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRXhlY3V0aW9uU2Nyb2xsKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShleGVjdXRpb25TY3JvbGxMZWZ0LCBleGVjdXRpb25TY3JvbGxSaWdodCwgZXhlY3V0aW9uU2Nyb2xsVG9JbmRleCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RXhlY3V0aW9uU2Nyb2xsQmVnaW5JbmRleCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUV4ZWN1dGlvbnMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXREaXNwbGF5Q291bnQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25QYWdlU2l6ZSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtydW5JZF0pID0+IHJ1bklkICE9PSBudWxsKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgcnVuSWQsIHNjcm9sbEJlZ2luSW5kZXgsIG51bUV4ZWN1dGlvbnMsIGRpc3BsYXlDb3VudCwgcGFnZVNpemUsXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVnaW4gPSBzY3JvbGxCZWdpbkluZGV4OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4obnVtRXhlY3V0aW9ucywgYmVnaW4gKyBkaXNwbGF5Q291bnQpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgICAgICBydW5JZDogKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksCiAgICAgICAgICAgICAgICAgICAgYmVnaW4sCiAgICAgICAgICAgICAgICAgICAgZW5kLAogICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25EaWdlc3RzTG9hZGVkKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3Byb3BzLCBsb2FkZWRdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIHByb3BzLAogICAgICAgICAgICAgICAgICAgIGxvYWRlZCwKICAgICAgICAgICAgICAgICAgICBtaXNzaW5nUGFnZXM6IGdldE1pc3NpbmdQYWdlcyhwcm9wcy5iZWdpbiwgcHJvcHMuZW5kLCBwcm9wcy5wYWdlU2l6ZSwgbG9hZGVkLm51bUV4ZWN1dGlvbnMsIGxvYWRlZC5wYWdlTG9hZGVkU2l6ZXMpLAogICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgfSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHsgbWlzc2luZ1BhZ2VzIH0pID0+IG1pc3NpbmdQYWdlcy5sZW5ndGggPiAwKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBwcm9wcywgbG9hZGVkLCBtaXNzaW5nUGFnZXMgfSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgeyBydW5JZCwgcGFnZVNpemUgfSA9IHByb3BzOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVnaW4gPSBtaXNzaW5nUGFnZXNbMF0gKiBwYWdlU2l6ZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVuZCA9IE1hdGgubWluKGxvYWRlZC5udW1FeGVjdXRpb25zLCAobWlzc2luZ1BhZ2VzW21pc3NpbmdQYWdlcy5sZW5ndGggLSAxXSArIDEpICogcGFnZVNpemUpOwogICAgICAgICAgICAgICAgcmV0dXJuIHsgYmVnaW4sIGVuZCwgcnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChydW5JZCkpIH07CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIExvYWQgZXhlY3V0aW9uIGRpZ2VzdHMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVFeGVjdXRpb25EaWdlc3RMb2FkZXIocHJldlN0cmVhbSQpIHsKICAgICAgICAgICAgcmV0dXJuIHByZXZTdHJlYW0kLnBpcGUod2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0RXhlY3V0aW9uRGlnZXN0c0xvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFt7IGJlZ2luLCBlbmQgfSwgbG9hZGVkXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIChlbmQgPiBiZWdpbiAmJgogICAgICAgICAgICAgICAgICAgICFiZWdpbkVuZFJhbmdlc0luY2x1ZGUobG9hZGVkLmxvYWRpbmdSYW5nZXMsIGJlZ2luLCBlbmQpKTsKICAgICAgICAgICAgfSkpLCB0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFt7IGJlZ2luLCBlbmQgfV0pID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZXhlY3V0aW9uRGlnZXN0c1JlcXVlc3RlZCh7IGJlZ2luLCBlbmQgfSkpOwogICAgICAgICAgICB9KSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbeyBydW5JZCwgYmVnaW4sIGVuZCB9XSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaEV4ZWN1dGlvbkRpZ2VzdHMocnVuSWQsIGJlZ2luLCBlbmQpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGlnZXN0cwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGRpZ2VzdHMpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQoZGlnZXN0cykpOwogICAgICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGNhdGNoRXJyb3IoKSB0byBwaXBlLgogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB3aGVuIHVzZXIgZm9jc2VzIG9uIGFuIGV4ZWN1dGlvbiBkaWdlc3QuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRXhlY3V0aW9uRGlnZXN0Rm9jdXNlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoZXhlY3V0aW9uRGlnZXN0Rm9jdXNlZCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TG9hZGVkRXhlY3V0aW9uRGF0YSksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4ZWN1dGlvblNjcm9sbEJlZ2luSW5kZXgpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbcHJvcHMsIGFjdGl2ZVJ1bklkLCBsb2FkZWRFeGVjdXRpb25EYXRhLCBzY3JvbGxCZWdpbkluZGV4XSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZm9jdXNJbmRleCA9IHNjcm9sbEJlZ2luSW5kZXggKyBwcm9wcy5kaXNwbGF5SW5kZXg7CiAgICAgICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgICAgIGFjdGl2ZVJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAoYWN0aXZlUnVuSWQpKSwKICAgICAgICAgICAgICAgICAgICBsb2FkZWRFeGVjdXRpb25EYXRhLAogICAgICAgICAgICAgICAgICAgIGZvY3VzSW5kZXgsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMb2FkIGRldGFpbGVkIGRhdGEgYWJvdXQgZXhlY3V0aW9uIGFuZCB0aGUgYXNzb2NpYXRlZCBzdGFjayBmcmFtZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjcmVhdGVFeGVjdXRpb25EYXRhQW5kU3RhY2tGcmFtZXNMb2FkZXIocHJldlN0cmVhbSQpIHsKICAgICAgICAgICAgcmV0dXJuIHByZXZTdHJlYW0kLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IGFjdGl2ZVJ1bklkLCBsb2FkZWRFeGVjdXRpb25EYXRhLCBmb2N1c0luZGV4IH0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoYWN0aXZlUnVuSWQgIT09IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICBmb2N1c0luZGV4ICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgbG9hZGVkRXhlY3V0aW9uRGF0YVsoLyoqIEB0eXBlIHs/fSAqLyAoZm9jdXNJbmRleCkpXSA9PT0gdW5kZWZpbmVkKTsKICAgICAgICAgICAgfSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBhY3RpdmVSdW5JZCwgZm9jdXNJbmRleCB9KSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBiZWdpbiA9ICgvKiogQHR5cGUgez99ICovIChmb2N1c0luZGV4KSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBiZWdpbiArIDE7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlCiAgICAgICAgICAgICAgICAgICAgLmZldGNoRXhlY3V0aW9uRGF0YSgoLyoqIEB0eXBlIHs/fSAqLyAoYWN0aXZlUnVuSWQpKSwgYmVnaW4sIGVuZCkKICAgICAgICAgICAgICAgICAgICAucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBleGVjdXRpb25EYXRhUmVzcG9uc2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChleGVjdXRpb25EYXRhUmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGV4ZWN1dGlvbkRhdGFMb2FkZWQoZXhlY3V0aW9uRGF0YVJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV4ZWN1dGlvbkRhdGFSZXNwb25zZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGV4ZWN1dGlvbkRhdGFSZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGV4ZWN1dGlvbkRhdGE6IGV4ZWN1dGlvbkRhdGFSZXNwb25zZSwgYmVnaW4sIGVuZCB9OwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHsgZXhlY3V0aW9uRGF0YSB9KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZXhlY3V0aW9uRGF0YS5leGVjdXRpb25zWzBdOwogICAgICAgICAgICB9KSksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TG9hZGVkU3RhY2tGcmFtZXMpKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbZXhlY3V0aW9uLCBydW5JZCwgbG9hZGVkU3RhY2tGcmFtZXNdKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAocnVuSWQgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0YWNrRnJhbWVJZCBvZiBleGVjdXRpb24uc3RhY2tfZnJhbWVfaWRzKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGxvYWRlZFN0YWNrRnJhbWVzW3N0YWNrRnJhbWVJZF0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0pKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtleGVjdXRpb24sIHJ1bklkXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3RhY2tGcmFtZUlkcyA9IGV4ZWN1dGlvbi5zdGFja19mcmFtZV9pZHM7CiAgICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBNYXliZSBvbWl0IGFscmVhZHktbG9hZGVkIHN0YWNrIGZyYW1lcyBmcm9tIHJlcXVlc3QsCiAgICAgICAgICAgICAgICAvLyBpbnN0ZWFkIG9mIGxvYWRpbmcgYWxsIGZyYW1lcyBpZiBhbnkgb2YgdGhlbSBpcyBtaXNzaW5nLgogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaFN0YWNrRnJhbWVzKCgvKiogQHR5cGUgez99ICovIChydW5JZCkpLCBzdGFja0ZyYW1lSWRzKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVzUmVzcG9uc2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzdGFja0ZyYW1lc1Jlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrRnJhbWVzQnlJZCA9IHt9OwogICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc3RhY2tGcmFtZUlkcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lc0J5SWRbc3RhY2tGcmFtZUlkc1tpXV0gPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZXNSZXNwb25zZS5zdGFja19mcmFtZXNbaV07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goc3RhY2tGcmFtZXNMb2FkZWQoeyBzdGFja0ZyYW1lczogc3RhY2tGcmFtZXNCeUlkIH0pKTsKICAgICAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHZvaWQgbnVsbCkpKTsKICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IEFkZCBjYXRjaEVycm9yKCkgdG8gcGlwZS4KICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRW1pdHMgd2hlbiBzY3JvbGxpbmcgZXZlbnQgbGVhZHMgdG8gbmVlZCB0byBsb2FkIG5ldyBpbnRyYS1ncmFwaCBleGVjdXRpb24KICAgICAgICAgKiBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogVGhlIHJldHVybmVkIG9ic2VydmFibGUgY29udGFpbnMgdGhlCiAgICAgICAgICogICAtIHJ1bklkOiBhY3RpdmUgcnVuSWQsCiAgICAgICAgICogICAtIG1pc3NpbmdQYWdlOiBpbmRpY2VzIG9mIG1pc3NpbmcgYEdyYXBoRXhlY3V0aW9uYCBwYWdlcyB0aGF0IG5lZWQgdG8gYmUKICAgICAgICAgKiAgICAgbG9hZGVkIGJ5IGEgZG93bnN0cmVhbSBwaXBlLgogICAgICAgICAqICAgLSBwYWdlU2l6ZTogR3JhcGhFeGVjdXRpb24gZGF0YSBwYWdlIHNpemUuCiAgICAgICAgICogICAtIG51bUdyYXBoRXhlY3V0aW9uczogQ3VycmVudCB0b3RhbCBudW1iZXIgb2YgYEdyYXBoRXhlY3V0aW9uYHMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uR3JhcGhFeGVjdXRpb25TY3JvbGwoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGdyYXBoRXhlY3V0aW9uU2Nyb2xsVG9JbmRleCksIGRlYm91bmNlVGltZSgxMDApLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUdyYXBoRXhlY3V0aW9ucyksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEdyYXBoRXhlY3V0aW9uU2Nyb2xsQmVnaW5JbmRleCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIHJ1bklkLCBudW1HcmFwaEV4ZWN1dGlvbnNdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gcnVuSWQgIT09IG51bGwgJiYgbnVtR3JhcGhFeGVjdXRpb25zID4gMDsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIHJ1bklkLCBudW1HcmFwaEV4ZWN1dGlvbnMsIHNjcm9sbEJlZ2luSW5kZXhdKSA9PiAoewogICAgICAgICAgICAgICAgcnVuSWQsCiAgICAgICAgICAgICAgICBudW1HcmFwaEV4ZWN1dGlvbnMsCiAgICAgICAgICAgICAgICBzY3JvbGxCZWdpbkluZGV4LAogICAgICAgICAgICB9KSkpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvblBhZ2VTaXplKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0R3JhcGhFeGVjdXRpb25EaXNwbGF5Q291bnQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvbkRhdGFMb2FkaW5nUGFnZXMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRHcmFwaEV4ZWN1dGlvbkRhdGFQYWdlTG9hZGVkU2l6ZXMpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbeyBydW5JZCwgbnVtR3JhcGhFeGVjdXRpb25zLCBzY3JvbGxCZWdpbkluZGV4IH0sIHBhZ2VTaXplLCBkaXNwbGF5Q291bnQsIGxvYWRpbmdQYWdlcywgcGFnZUxvYWRlZFNpemVzLF0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBtaXNzaW5nUGFnZXMgPSBnZXRNaXNzaW5nUGFnZXMoc2Nyb2xsQmVnaW5JbmRleCwgTWF0aC5taW4oc2Nyb2xsQmVnaW5JbmRleCArIGRpc3BsYXlDb3VudCwgbnVtR3JhcGhFeGVjdXRpb25zKSwgcGFnZVNpemUsIG51bUdyYXBoRXhlY3V0aW9ucywgcGFnZUxvYWRlZFNpemVzKTsKICAgICAgICAgICAgICAgIC8vIE9taXQgcGFnZXMgdGhhdCBhcmUgYWxyZWFkeSBsb2FkaW5nLgogICAgICAgICAgICAgICAgbWlzc2luZ1BhZ2VzID0gbWlzc2luZ1BhZ2VzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhZ2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChwYWdlKSA9PiBsb2FkaW5nUGFnZXMuaW5kZXhPZihwYWdlKSA9PT0gLTEpKTsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChydW5JZCkpLAogICAgICAgICAgICAgICAgICAgIG1pc3NpbmdQYWdlcywKICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZSwKICAgICAgICAgICAgICAgICAgICBudW1HcmFwaEV4ZWN1dGlvbnMsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxvYWRHcmFwaEV4ZWN1dGlvblBhZ2VzKHByZXZTdHJlYW0kKSB7CiAgICAgICAgICAgIHJldHVybiBwcmV2U3RyZWFtJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBtaXNzaW5nUGFnZXMgfSkgPT4gbWlzc2luZ1BhZ2VzLmxlbmd0aCA+IDApKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IG1pc3NpbmdQYWdlcyB9KSA9PiB7CiAgICAgICAgICAgICAgICBtaXNzaW5nUGFnZXMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHBhZ2VJbmRleAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHBhZ2VJbmRleCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZ3JhcGhFeGVjdXRpb25EYXRhUmVxdWVzdGVkKHsgcGFnZUluZGV4IH0pKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBydW5JZCwgbWlzc2luZ1BhZ2VzLCBwYWdlU2l6ZSwgbnVtR3JhcGhFeGVjdXRpb25zIH0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJlZ2luID0gbWlzc2luZ1BhZ2VzWzBdICogcGFnZVNpemU7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmQgPSBNYXRoLm1pbigobWlzc2luZ1BhZ2VzW21pc3NpbmdQYWdlcy5sZW5ndGggLSAxXSArIDEpICogcGFnZVNpemUsIG51bUdyYXBoRXhlY3V0aW9ucyk7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoR3JhcGhFeGVjdXRpb25EYXRhKCgvKiogQHR5cGUgez99ICovIChydW5JZCkpLCBiZWdpbiwgZW5kKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGdyYXBoRXhlY3V0aW9uRGF0YVJlc3BvbnNlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZ3JhcGhFeGVjdXRpb25EYXRhUmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGdyYXBoRXhlY3V0aW9uRGF0YUxvYWRlZChncmFwaEV4ZWN1dGlvbkRhdGFSZXNwb25zZSkpOwogICAgICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGNhdGNoRXJyb3IoKSB0byBwaXBlLgogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMaXN0ZW5zIHRvIGdyYXBoLW9wIGZvY3VzIGV2ZW50cy4KICAgICAgICAgKgogICAgICAgICAqIExvYWQgZ3JhcGggb3AgaW5mbyBmcm9tIHRoZSAvZ3JhcGhzL29wX2luZm8gcm91dGUgd2hlbiBuZWNlc3NhcnkuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99IEFuIG9iamVjdCB3aXRoIHR3byBrZXlzIGZvciBkb3duc3RyZWFtIGNvbnN1bXB0aW9uOgogICAgICAgICAqICAgLSBydW5JZDogdGhlIGN1cnJlbnQgYWN0aXZlIHJ1biBJRC4KICAgICAgICAgKiAgIC0gc3RhY2tGcmFtZUlkczogdGhlIElEcyBvZiB0aGUgc3RhY2sgZnJhbWVzIG9mIHRoZSBvcCdzIGNyZWF0aW9uLgogICAgICAgICAqLwogICAgICAgIGxvYWRHcmFwaE9wSW5mbygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoZ3JhcGhPcEZvY3VzZWQsIGdyYXBoRXhlY3V0aW9uRm9jdXNlZCksIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUuc2VsZWN0KGdldEFjdGl2ZVJ1bklkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TG9hZGluZ0dyYXBoT3BzKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2FjdGlvbkRhdGEsIHJ1bklkLCBsb2FkaW5nT3BzXSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgeyBncmFwaF9pZCwgb3BfbmFtZSB9ID0gYWN0aW9uRGF0YTsKICAgICAgICAgICAgICAgIHJldHVybiAocnVuSWQgIT09IG51bGwgJiYKICAgICAgICAgICAgICAgICAgICAobG9hZGluZ09wc1tncmFwaF9pZF0gPT09IHVuZGVmaW5lZCB8fAogICAgICAgICAgICAgICAgICAgICAgICAhbG9hZGluZ09wc1tncmFwaF9pZF0uaGFzKG9wX25hbWUpIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICEobG9hZGluZ09wc1tncmFwaF9pZF0uZ2V0KG9wX25hbWUpID09PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRpbmdPcHNbZ3JhcGhfaWRdLmdldChvcF9uYW1lKSA9PT0gRGF0YUxvYWRTdGF0ZS5MT0FERUQpKSk7CiAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbeyBncmFwaF9pZCwgb3BfbmFtZSB9XSkgPT4gdGhpcy5zdG9yZS5kaXNwYXRjaChncmFwaE9wSW5mb1JlcXVlc3RlZCh7CiAgICAgICAgICAgICAgICBncmFwaF9pZCwKICAgICAgICAgICAgICAgIG9wX25hbWUsCiAgICAgICAgICAgIH0pKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2FjdGlvbkRhdGEsIHJ1bklkXSkgPT4gewogICAgICAgICAgICAgICAgY29uc3QgeyBncmFwaF9pZCwgb3BfbmFtZSB9ID0gYWN0aW9uRGF0YTsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hHcmFwaE9wSW5mbygoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwgZ3JhcGhfaWQsIG9wX25hbWUpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZ3JhcGhPcEluZm9SZXNwb25zZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGdyYXBoT3BJbmZvUmVzcG9uc2UpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goZ3JhcGhPcEluZm9Mb2FkZWQoeyBncmFwaE9wSW5mb1Jlc3BvbnNlIH0pKSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBncmFwaE9wSW5mb1Jlc3BvbnNlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZ3JhcGhPcEluZm9SZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZUlkczogZ3JhcGhPcEluZm9SZXNwb25zZS5zdGFja19mcmFtZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwcmV2U3RyZWFtJAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbG9hZEdyYXBoT3BTdGFja0ZyYW1lcyhwcmV2U3RyZWFtJCkgewogICAgICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRMb2FkZWRTdGFja0ZyYW1lcykpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFt7IHJ1bklkLCBzdGFja0ZyYW1lSWRzIH0sIGxvYWRlZFN0YWNrRnJhbWVzXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWlzc2luZ1N0YWNrRnJhbWVJZHMgPSBzdGFja0ZyYW1lSWRzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVJZAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHN0YWNrRnJhbWVJZCkgPT4gbG9hZGVkU3RhY2tGcmFtZXNbc3RhY2tGcmFtZUlkXSA9PT0gdW5kZWZpbmVkKSk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBydW5JZCwgbWlzc2luZ1N0YWNrRnJhbWVJZHMgfTsKICAgICAgICAgICAgfSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHsgcnVuSWQsIG1pc3NpbmdTdGFja0ZyYW1lSWRzIH0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBydW5JZCAhPT0gbnVsbCAmJiBtaXNzaW5nU3RhY2tGcmFtZUlkcy5sZW5ndGggPiAwOwogICAgICAgICAgICB9KSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IHJ1bklkLCBtaXNzaW5nU3RhY2tGcmFtZUlkcyB9KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlCiAgICAgICAgICAgICAgICAgICAgLmZldGNoU3RhY2tGcmFtZXMoKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIG1pc3NpbmdTdGFja0ZyYW1lSWRzKQogICAgICAgICAgICAgICAgICAgIC5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YWNrRnJhbWVzUmVzcG9uc2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzdGFja0ZyYW1lc1Jlc3BvbnNlKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0YWNrRnJhbWVzQnlJZCA9IHt9OwogICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oY2Fpcyk6IERvIHRoaXMgcmVzaGFwaW5nIGluIHRoZSBiYWNrZW5kIGFuZCBzaW1wbGlmeQogICAgICAgICAgICAgICAgICAgIC8vIHRoZSBmcm9udGVuZCBjb2RlIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBtaXNzaW5nU3RhY2tGcmFtZUlkcy5sZW5ndGg7ICsraSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGFja0ZyYW1lc0J5SWRbbWlzc2luZ1N0YWNrRnJhbWVJZHNbaV1dID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrRnJhbWVzUmVzcG9uc2Uuc3RhY2tfZnJhbWVzW2ldOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHN0YWNrRnJhbWVzTG9hZGVkKHsgc3RhY2tGcmFtZXM6IHN0YWNrRnJhbWVzQnlJZCB9KSk7CiAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIHdoZW4gdXNlciBmb2N1c2VzIG9uIGFuIGFsZXJ0IHR5cGUuCiAgICAgICAgICoKICAgICAgICAgKiBSZXR1cm5zIGFuIE9ic2VydmFibGUgZm9yIHdoYXQgYWRkaXRpb25hbCBleGVjdXRpb24gZGlnZXN0cyBuZWVkIHRvIGJlIGZldGNoZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQWxlcnRUeXBlRm9jdXNlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUoYWxlcnRUeXBlRm9jdXNUb2dnbGVkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0QWN0aXZlUnVuSWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRBbGVydHNGb2N1c1R5cGUpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXROdW1BbGVydHNPZkZvY3VzZWRUeXBlKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TG9hZGVkQWxlcnRzT2ZGb2N1c2VkVHlwZSksIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFsZXJ0c0xvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIHJ1bklkLCBmb2N1c1R5cGUsIG51bUFsZXJ0c09mRm9jdXNlZFR5cGUsIGxvYWRlZEFsZXJ0c09mRm9jdXNlZFR5cGUsIGFsZXJ0c0xvYWRlZCxdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gKHJ1bklkICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgZm9jdXNUeXBlICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgbnVtQWxlcnRzT2ZGb2N1c2VkVHlwZSA+IDAgJiYKICAgICAgICAgICAgICAgICAgICAobG9hZGVkQWxlcnRzT2ZGb2N1c2VkVHlwZSA9PT0gbnVsbCB8fAogICAgICAgICAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyhsb2FkZWRBbGVydHNPZkZvY3VzZWRUeXBlKS5sZW5ndGggPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtQWxlcnRzT2ZGb2N1c2VkVHlwZSkgJiYKICAgICAgICAgICAgICAgICAgICBhbGVydHNMb2FkZWQuc3RhdGUgIT09IERhdGFMb2FkU3RhdGUuTE9BRElORyk7CiAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobnVtQWxlcnRzQW5kQnJlYWtkb3duUmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBydW5JZCwgZm9jdXNUeXBlXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYmVnaW4gPSAwOwogICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogVXNlIHNtYXJ0ZXIgYGVuZGAgdmFsdWUgdG8gcmVkdWNlIHRoZSBhbW91bnQgb2YgZGF0YQogICAgICAgICAgICAgICAgLy8gZmV0Y2ggZWFjaCB0aW1lLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZW5kID0gLTE7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoQWxlcnRzKCgvKiogQHR5cGUgez99ICovIChydW5JZCkpLCBiZWdpbiwgZW5kLCAoLyoqIEB0eXBlIHs/fSAqLyAoZm9jdXNUeXBlKSkpOwogICAgICAgICAgICB9KSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBudW1fYWxlcnRzLCBhbGVydHNfYnJlYWtkb3duLCBhbGVydF90eXBlLCBiZWdpbiwgZW5kLCBhbGVydHMgfSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChhbGVydHNPZlR5cGVMb2FkZWQoewogICAgICAgICAgICAgICAgICAgIG51bUFsZXJ0czogbnVtX2FsZXJ0cywKICAgICAgICAgICAgICAgICAgICBhbGVydHNCcmVha2Rvd246IGFsZXJ0c19icmVha2Rvd24sCiAgICAgICAgICAgICAgICAgICAgYWxlcnRUeXBlOiAoLyoqIEB0eXBlIHs/fSAqLyAoYWxlcnRfdHlwZSkpLAogICAgICAgICAgICAgICAgICAgIGJlZ2luLAogICAgICAgICAgICAgICAgICAgIGVuZCwKICAgICAgICAgICAgICAgICAgICBhbGVydHMsCiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbXB1dGUgdGhlIGV4ZWN1dGlvbiBkaWdlc3RzIHRvIGZldGNoIG9uIGZvY3VzaW5nIG9mIGFuIGFsZXJ0IHR5cGUuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByZXZTdHJlYW0kCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaEV4ZWN1dGlvbkRpZ2VzdHNGb3JBbGVydFR5cGVGb2N1cyhwcmV2U3RyZWFtJCkgewogICAgICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25QYWdlU2l6ZSksIHRoaXMuc3RvcmUuc2VsZWN0KGdldERpc3BsYXlDb3VudCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldE51bUV4ZWN1dGlvbnMpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeGVjdXRpb25EaWdlc3RzTG9hZGVkKSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0QWN0aXZlUnVuSWQpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbYWxlcnRzUmVzcG9uc2UsIHBhZ2VTaXplLCBkaXNwbGF5Q291bnQsIG51bUV4ZWN1dGlvbnMsIGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQsIHJ1bklkLF0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGFsZXJ0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGFsZXJ0c1Jlc3BvbnNlLmFsZXJ0c1swXSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZXhlY3V0aW9uSW5kZXggPSBhbGVydC5leGVjdXRpb25faW5kZXg7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBtaXNzaW5nUGFnZXMgPSBnZXRNaXNzaW5nUGFnZXMoTWF0aC5tYXgoMCwgZXhlY3V0aW9uSW5kZXggLSBNYXRoLmZsb29yKGRpc3BsYXlDb3VudCAvIDIpKSwgTWF0aC5taW4oZXhlY3V0aW9uSW5kZXggKyBNYXRoLmZsb29yKGRpc3BsYXlDb3VudCAvIDIpLCBudW1FeGVjdXRpb25zKSwgcGFnZVNpemUsIG51bUV4ZWN1dGlvbnMsIGV4ZWN1dGlvbkRpZ2VzdHNMb2FkZWQucGFnZUxvYWRlZFNpemVzKTsKICAgICAgICAgICAgICAgIGlmIChtaXNzaW5nUGFnZXMubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgcnVuSWQ6ICgvKiogQHR5cGUgez99ICovIChydW5JZCkpLCBiZWdpbjogMCwgZW5kOiAwIH07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmVnaW4gPSBtaXNzaW5nUGFnZXNbMF0gKiBwYWdlU2l6ZTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5kID0gTWF0aC5taW4oZXhlY3V0aW9uRGlnZXN0c0xvYWRlZC5udW1FeGVjdXRpb25zLCAobWlzc2luZ1BhZ2VzW21pc3NpbmdQYWdlcy5sZW5ndGggLSAxXSArIDEpICogcGFnZVNpemUpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSwgYmVnaW4sIGVuZCB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBMb2FkIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdoZW4gZGVidWdnZXIgcGx1Z2luIGlzIGxvYWRlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcHJldlN0cmVhbSQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxvYWRTb3VyY2VGaWxlTGlzdChwcmV2U3RyZWFtJCkgewogICAgICAgICAgICByZXR1cm4gcHJldlN0cmVhbSQucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVSdW5JZCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldFNvdXJjZUZpbGVMaXN0TG9hZGVkKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgcnVuSWQsIHNvdXJjZUZpbGVMaXN0TG9hZFN0YXRlXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIChydW5JZCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVMaXN0TG9hZFN0YXRlLnN0YXRlICE9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgICAgICB9KSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLnN0b3JlLmRpc3BhdGNoKHNvdXJjZUZpbGVMaXN0UmVxdWVzdGVkKCkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBydW5JZF0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmRhdGFTb3VyY2UuZmV0Y2hTb3VyY2VGaWxlTGlzdCgoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VGaWxlTGlzdFJlc3BvbnNlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoc291cmNlRmlsZUxpc3RSZXNwb25zZSkgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBzb3VyY2VGaWxlcyA9IFtdOwogICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVMaXN0UmVzcG9uc2UuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChbaG9zdF9uYW1lLCBmaWxlX3BhdGhdKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZUZpbGVzLnB1c2goeyBob3N0X25hbWUsIGZpbGVfcGF0aCB9KTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChzb3VyY2VGaWxlTGlzdExvYWRlZCh7IHNvdXJjZUZpbGVzIH0pKTsKICAgICAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHZvaWQgbnVsbCkpCiAgICAgICAgICAgICAgICAvLyBUT0RPKGNhaXMpOiBBZGQgY2F0Y2hFcnJvcigpIHRvIHBpcGUuCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIHRoZSBhIHNvdXJjZSBmaWxlIGlzIGZvY3VzZWQgb24sIGxvYWQgaXRzIGNvbnRlbnQgZnJvbSB0aGUgZGF0YSBzb3VyY2UuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU291cmNlRmlsZUZvY3VzZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKHNvdXJjZUxpbmVGb2N1c2VkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0QWN0aXZlUnVuSWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRGb2N1c2VkU291cmNlRmlsZUluZGV4KSwgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0Rm9jdXNlZFNvdXJjZUZpbGVDb250ZW50KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2ZvY3VzLCBydW5JZCwgZmlsZUluZGV4LCBmaWxlQ29udGVudF0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgcnVuSWQsCiAgICAgICAgICAgICAgICAgICAgc3RhY2tGcmFtZTogZm9jdXMuc3RhY2tGcmFtZSwKICAgICAgICAgICAgICAgICAgICBmaWxlSW5kZXgsCiAgICAgICAgICAgICAgICAgICAgZmlsZUNvbnRlbnQsCiAgICAgICAgICAgICAgICB9OwogICAgICAgICAgICB9KSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBydW5JZCwgZmlsZUNvbnRlbnQgfSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIChydW5JZCAhPT0gbnVsbCAmJgogICAgICAgICAgICAgICAgICAgIGZpbGVDb250ZW50ICE9PSBudWxsICYmCiAgICAgICAgICAgICAgICAgICAgZmlsZUNvbnRlbnQubG9hZFN0YXRlID09PSBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQpOwogICAgICAgICAgICB9KSksIHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBzdGFja0ZyYW1lIH0pID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2goc291cmNlRmlsZVJlcXVlc3RlZCh7CiAgICAgICAgICAgICAgICBob3N0X25hbWU6IHN0YWNrRnJhbWUuaG9zdF9uYW1lLAogICAgICAgICAgICAgICAgZmlsZV9wYXRoOiBzdGFja0ZyYW1lLmZpbGVfcGF0aCwKICAgICAgICAgICAgfSkpKSksIG1lcmdlTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IGZpbGVJbmRleCwgcnVuSWQgfSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaFNvdXJjZUZpbGUoKC8qKiBAdHlwZSB7P30gKi8gKHJ1bklkKSksIGZpbGVJbmRleCkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2VGaWxlUmVzcG9uc2UKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChzb3VyY2VGaWxlUmVzcG9uc2UpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHNvdXJjZUZpbGVMb2FkZWQoc291cmNlRmlsZVJlc3BvbnNlKSk7CiAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKQogICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogQWRkIGNhdGNoRXJyb3IoKSB0byBwaXBlLgogICAgICAgICAgICAgICAgKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICB9CiAgICBEZWJ1Z2dlckVmZmVjdHMuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIERlYnVnZ2VyRWZmZWN0cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEFjdGlvbnMgfSwKICAgICAgICB7IHR5cGU6IFN0b3JlIH0sCiAgICAgICAgeyB0eXBlOiBUZmRiZzJIdHRwU2VydmVyRGF0YVNvdXJjZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyRWZmZWN0cy7JtWZhYyA9IGZ1bmN0aW9uIERlYnVnZ2VyRWZmZWN0c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEZWJ1Z2dlckVmZmVjdHMpKMm1ybVpbmplY3QoQWN0aW9ucyksIMm1ybVpbmplY3QoU3RvcmUpLCDJtcm1aW5qZWN0KFRmZGJnMkh0dHBTZXJ2ZXJEYXRhU291cmNlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVidWdnZXJFZmZlY3RzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IERlYnVnZ2VyRWZmZWN0cywgZmFjdG9yeTogRGVidWdnZXJFZmZlY3RzLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvYWxlcnRzL2FsZXJ0c19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMTkgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBBbGVydHNNb2R1bGUgewogICAgfQogICAgQWxlcnRzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtBbGVydHNDb21wb25lbnQsIEFsZXJ0c0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0FsZXJ0c0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQWxlcnRzTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQWxlcnRzTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFsZXJ0c01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFsZXJ0c01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbGVydHNNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShBbGVydHNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbQWxlcnRzQ29tcG9uZW50LCBBbGVydHNDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZXhwb3J0czogW0FsZXJ0c0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9kZWJ1Z190ZW5zb3JfdmFsdWUvZGVidWdfdGVuc29yX3ZhbHVlX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIERlYnVnVGVuc29yVmFsdWVNb2R1bGUgewogICAgfQogICAgRGVidWdUZW5zb3JWYWx1ZU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnVGVuc29yRFR5cGVDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0RlYnVnVGVuc29yVmFsdWVDb21wb25lbnRdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yVmFsdWVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnVGVuc29yVmFsdWVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlYnVnVGVuc29yVmFsdWVNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0RlYnVnVGVuc29yRFR5cGVDb21wb25lbnQsCiAgICAgICAgICAgIERlYnVnVGVuc29ySGFzSW5mT3JOYU5Db21wb25lbnQsCiAgICAgICAgICAgIERlYnVnVGVuc29yTnVtZXJpY0JyZWFrZG93bkNvbXBvbmVudCwKICAgICAgICAgICAgRGVidWdUZW5zb3JSYW5rQ29tcG9uZW50LAogICAgICAgICAgICBEZWJ1Z1RlbnNvclNoYXBlQ29tcG9uZW50LAogICAgICAgICAgICBEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50XSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGV4cG9ydHM6IFtEZWJ1Z1RlbnNvclZhbHVlQ29tcG9uZW50XSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2dyYXBoX2V4ZWN1dGlvbnMvZ3JhcGhfZXhlY3V0aW9uc19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUgewogICAgfQogICAgR3JhcGhFeGVjdXRpb25zTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtHcmFwaEV4ZWN1dGlvbnNDb21wb25lbnQsIEdyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGVidWdUZW5zb3JWYWx1ZU1vZHVsZSwgU2Nyb2xsaW5nTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gR3JhcGhFeGVjdXRpb25zTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gR3JhcGhFeGVjdXRpb25zTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEdyYXBoRXhlY3V0aW9uc01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIERlYnVnVGVuc29yVmFsdWVNb2R1bGUsIFNjcm9sbGluZ01vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoR3JhcGhFeGVjdXRpb25zTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0dyYXBoRXhlY3V0aW9uc0NvbXBvbmVudCwgR3JhcGhFeGVjdXRpb25zQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGVidWdUZW5zb3JWYWx1ZU1vZHVsZSwgU2Nyb2xsaW5nTW9kdWxlXSwgZXhwb3J0czogW0dyYXBoRXhlY3V0aW9uc0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9ncmFwaC9ncmFwaF9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBHcmFwaE1vZHVsZSB7CiAgICB9CiAgICBHcmFwaE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbR3JhcGhDb21wb25lbnQsIEdyYXBoT3BDb21wb25lbnQsIEdyYXBoQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbR3JhcGhDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEdyYXBoTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogR3JhcGhNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gR3JhcGhNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBHcmFwaE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBHcmFwaE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEdyYXBoTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0dyYXBoQ29tcG9uZW50LCBHcmFwaE9wQ29tcG9uZW50LCBHcmFwaENvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLCBleHBvcnRzOiBbR3JhcGhDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvaW5hY3RpdmUvaW5hY3RpdmVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgSW5hY3RpdmVNb2R1bGUgewogICAgfQogICAgSW5hY3RpdmVNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0luYWN0aXZlQ29tcG9uZW50LCBJbmFjdGl2ZUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0luYWN0aXZlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBJbmFjdGl2ZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEluYWN0aXZlTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEluYWN0aXZlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gSW5hY3RpdmVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSW5hY3RpdmVNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShJbmFjdGl2ZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtJbmFjdGl2ZUNvbXBvbmVudCwgSW5hY3RpdmVDb250YWluZXJdLCBleHBvcnRzOiBbSW5hY3RpdmVDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3Mvc291cmNlX2NvZGUvc291cmNlX2NvZGVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgU291cmNlQ29kZU1vZHVsZSB7CiAgICB9CiAgICBTb3VyY2VDb2RlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtTb3VyY2VDb2RlQ29tcG9uZW50LCBTb3VyY2VDb2RlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbU291cmNlQ29kZUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU291cmNlQ29kZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFNvdXJjZUNvZGVNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU291cmNlQ29kZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNvdXJjZUNvZGVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU291cmNlQ29kZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFNvdXJjZUNvZGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbU291cmNlQ29kZUNvbXBvbmVudCwgU291cmNlQ29kZUNvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLCBleHBvcnRzOiBbU291cmNlQ29kZUNvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zb3VyY2VfZmlsZXMvc291cmNlX2ZpbGVzX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIFNvdXJjZUZpbGVzTW9kdWxlIHsKICAgIH0KICAgIFNvdXJjZUZpbGVzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtTb3VyY2VGaWxlc0NvbXBvbmVudCwgU291cmNlRmlsZXNDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNvdXJjZUNvZGVNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtTb3VyY2VGaWxlc0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU291cmNlRmlsZXNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBTb3VyY2VGaWxlc01vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTb3VyY2VGaWxlc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNvdXJjZUZpbGVzTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNvdXJjZUZpbGVzTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgU291cmNlQ29kZU1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU291cmNlRmlsZXNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbU291cmNlRmlsZXNDb21wb25lbnQsIFNvdXJjZUZpbGVzQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgU291cmNlQ29kZU1vZHVsZV0sIGV4cG9ydHM6IFtTb3VyY2VGaWxlc0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC9wbHVnaW5zL2RlYnVnZ2VyX3YyL3RmX2RlYnVnZ2VyX3YyX3BsdWdpbi92aWV3cy9zdGFja190cmFjZS9zdGFja190cmFjZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjbGFzcyBTdGFja1RyYWNlTW9kdWxlIHsKICAgIH0KICAgIFN0YWNrVHJhY2VNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1N0YWNrVHJhY2VDb21wb25lbnQsIFN0YWNrVHJhY2VDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIFNvdXJjZUNvZGVNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtTdGFja1RyYWNlQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTdGFja1RyYWNlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogU3RhY2tUcmFjZU1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTdGFja1RyYWNlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gU3RhY2tUcmFjZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTdGFja1RyYWNlTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgU291cmNlQ29kZU1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU3RhY2tUcmFjZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtTdGFja1RyYWNlQ29tcG9uZW50LCBTdGFja1RyYWNlQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgU291cmNlQ29kZU1vZHVsZV0sIGV4cG9ydHM6IFtTdGFja1RyYWNlQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3BsdWdpbnMvZGVidWdnZXJfdjIvdGZfZGVidWdnZXJfdjJfcGx1Z2luL3ZpZXdzL2V4ZWN1dGlvbl9kYXRhL2V4ZWN1dGlvbl9kYXRhX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIEV4ZWN1dGlvbkRhdGFNb2R1bGUgewogICAgfQogICAgRXhlY3V0aW9uRGF0YU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbRXhlY3V0aW9uRGF0YUNvbXBvbmVudCwgRXhlY3V0aW9uRGF0YUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRGVidWdUZW5zb3JWYWx1ZU1vZHVsZV0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0V4ZWN1dGlvbkRhdGFDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEV4ZWN1dGlvbkRhdGFNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBFeGVjdXRpb25EYXRhTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEV4ZWN1dGlvbkRhdGFNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBFeGVjdXRpb25EYXRhTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEV4ZWN1dGlvbkRhdGFNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShFeGVjdXRpb25EYXRhTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW0V4ZWN1dGlvbkRhdGFDb21wb25lbnQsIEV4ZWN1dGlvbkRhdGFDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBEZWJ1Z1RlbnNvclZhbHVlTW9kdWxlXSwgZXhwb3J0czogW0V4ZWN1dGlvbkRhdGFDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vdmlld3MvdGltZWxpbmUvdGltZWxpbmVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgVGltZWxpbmVNb2R1bGUgewogICAgfQogICAgVGltZWxpbmVNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1RpbWVsaW5lQ29tcG9uZW50LCBUaW1lbGluZUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkRhdGFNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0U2xpZGVyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhjYWlzKTogVGhlIGZvbGxvd2luZyB0d28gcHJvdmlkZXJzIGFyZSBtZWFudCB0byBtYWtlIHRoZSBtYXQtc2xpZGVyCiAgICAgICAgICAgICAgICAgICAgLy8gZHJhZ2dpbmcgdG8gd29yay4gQnV0IHRoZSBkcmFnZ2luZyBpcyBzdGlsbCBub3Qgd29ya2luZywgbmVlZHMgbW9yZQogICAgICAgICAgICAgICAgICAgIC8vIGludmVzdGlnYXRpb24uIE1heSBiZSByZWxhdGVkIHRvOgogICAgICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzc5MDUKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbVGltZWxpbmVDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRpbWVsaW5lTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGltZWxpbmVNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGltZWxpbmVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBUaW1lbGluZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUaW1lbGluZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIEV4ZWN1dGlvbkRhdGFNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRTbGlkZXJNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVGltZWxpbmVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbVGltZWxpbmVDb21wb25lbnQsIFRpbWVsaW5lQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgRXhlY3V0aW9uRGF0YU1vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRTbGlkZXJNb2R1bGVdLCBleHBvcnRzOiBbVGltZWxpbmVDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvcGx1Z2lucy9kZWJ1Z2dlcl92Mi90Zl9kZWJ1Z2dlcl92Ml9wbHVnaW4vZGVidWdnZXJfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qIENvcHlyaWdodCAyMDE5IFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY2xhc3MgRGVidWdnZXJNb2R1bGUgewogICAgfQogICAgRGVidWdnZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0RlYnVnZ2VyQ29tcG9uZW50LCBEZWJ1Z2dlckNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBBbGVydHNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhFeGVjdXRpb25zTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBHcmFwaE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5hY3RpdmVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUZpbGVzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBTdGFja1RyYWNlTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBUZmRiZzJTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBUaW1lbGluZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShERUJVR0dFUl9GRUFUVVJFX0tFWSwgcmVkdWNlcnMkNiksCiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbRGVidWdnZXJFZmZlY3RzXSksCiAgICAgICAgICAgICAgICAgICAgICAgIFBsdWdpblJlZ2lzdHJ5TW9kdWxlLmZvclBsdWdpbignZGVidWdnZXItdjInLCBEZWJ1Z2dlckNvbnRhaW5lciksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbRGVidWdnZXJDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGVudHJ5Q29tcG9uZW50czogW0RlYnVnZ2VyQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEZWJ1Z2dlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IERlYnVnZ2VyTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlYnVnZ2VyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gRGVidWdnZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGVidWdnZXJNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBBbGVydHNNb2R1bGUsCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBHcmFwaEV4ZWN1dGlvbnNNb2R1bGUsCiAgICAgICAgICAgICAgICBHcmFwaE1vZHVsZSwKICAgICAgICAgICAgICAgIEluYWN0aXZlTW9kdWxlLAogICAgICAgICAgICAgICAgU291cmNlRmlsZXNNb2R1bGUsCiAgICAgICAgICAgICAgICBTdGFja1RyYWNlTW9kdWxlLAogICAgICAgICAgICAgICAgVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICAgICAgICAgIFRpbWVsaW5lTW9kdWxlLAogICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShERUJVR0dFUl9GRUFUVVJFX0tFWSwgcmVkdWNlcnMkNiksCiAgICAgICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW0RlYnVnZ2VyRWZmZWN0c10pLAogICAgICAgICAgICAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKCdkZWJ1Z2dlci12MicsIERlYnVnZ2VyQ29udGFpbmVyKSwKICAgICAgICAgICAgXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShEZWJ1Z2dlck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtEZWJ1Z2dlckNvbXBvbmVudCwgRGVidWdnZXJDb250YWluZXJdLCBpbXBvcnRzOiBbQWxlcnRzTW9kdWxlLAogICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIEdyYXBoRXhlY3V0aW9uc01vZHVsZSwKICAgICAgICAgICAgR3JhcGhNb2R1bGUsCiAgICAgICAgICAgIEluYWN0aXZlTW9kdWxlLAogICAgICAgICAgICBTb3VyY2VGaWxlc01vZHVsZSwKICAgICAgICAgICAgU3RhY2tUcmFjZU1vZHVsZSwKICAgICAgICAgICAgVGZkYmcyU2VydmVyRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICAgICAgVGltZWxpbmVNb2R1bGUsIFN0b3JlRmVhdHVyZU1vZHVsZSwgRWZmZWN0c0ZlYXR1cmVNb2R1bGUsIFBsdWdpblJlZ2lzdHJ5TW9kdWxlXSwgZXhwb3J0czogW0RlYnVnZ2VyQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICBjb25zdCBfYzAkayA9IFsibWF0LW1lbnUtaXRlbSIsICIiXTsKICAgIGNvbnN0IF9jMSRiID0gWyIqIl07CiAgICBmdW5jdGlvbiBfTWF0TWVudV9uZ190ZW1wbGF0ZV8wX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5ZG93biIsIGZ1bmN0aW9uIF9NYXRNZW51X25nX3RlbXBsYXRlXzBfVGVtcGxhdGVfZGl2X2tleWRvd25fMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMik7IGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IxLl9oYW5kbGVLZXlkb3duKCRldmVudCk7IH0pKCJjbGljayIsIGZ1bmN0aW9uIF9NYXRNZW51X25nX3RlbXBsYXRlXzBfVGVtcGxhdGVfZGl2X2NsaWNrXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjIpOyBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMy5jbG9zZWQuZW1pdCgiY2xpY2siKTsgfSkoIkB0cmFuc2Zvcm1NZW51LnN0YXJ0IiwgZnVuY3Rpb24gX01hdE1lbnVfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZV9kaXZfYW5pbWF0aW9uX3RyYW5zZm9ybU1lbnVfc3RhcnRfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMik7IGNvbnN0IGN0eF9yNCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I0Ll9vbkFuaW1hdGlvblN0YXJ0KCRldmVudCk7IH0pKCJAdHJhbnNmb3JtTWVudS5kb25lIiwgZnVuY3Rpb24gX01hdE1lbnVfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZV9kaXZfYW5pbWF0aW9uX3RyYW5zZm9ybU1lbnVfZG9uZV8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyKTsgY29uc3QgY3R4X3I1ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjUuX29uQW5pbWF0aW9uRG9uZSgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJkaXYiLCAxKTsKICAgICAgICDJtcm1cHJvamVjdGlvbigyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoImlkIiwgY3R4X3IwLnBhbmVsSWQpKCJuZ0NsYXNzIiwgY3R4X3IwLl9jbGFzc0xpc3QpKCJAdHJhbnNmb3JtTWVudSIsIGN0eF9yMC5fcGFuZWxBbmltYXRpb25TdGF0ZSk7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIGN0eF9yMC5hcmlhTGFiZWwgfHwgbnVsbCkoImFyaWEtbGFiZWxsZWRieSIsIGN0eF9yMC5hcmlhTGFiZWxsZWRieSB8fCBudWxsKSgiYXJpYS1kZXNjcmliZWRieSIsIGN0eF9yMC5hcmlhRGVzY3JpYmVkYnkgfHwgbnVsbCk7CiAgICB9IH0KICAgIGNvbnN0IG1hdE1lbnVBbmltYXRpb25zID0gewogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgYW5pbWF0aW9uIGNvbnRyb2xzIHRoZSBtZW51IHBhbmVsJ3MgZW50cnkgYW5kIGV4aXQgZnJvbSB0aGUgcGFnZS4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4gdGhlIG1lbnUgcGFuZWwgaXMgYWRkZWQgdG8gdGhlIERPTSwgaXQgc2NhbGVzIGluIGFuZCBmYWRlcyBpbiBpdHMgYm9yZGVyLgogICAgICAgICAqCiAgICAgICAgICogV2hlbiB0aGUgbWVudSBwYW5lbCBpcyByZW1vdmVkIGZyb20gdGhlIERPTSwgaXQgc2ltcGx5IGZhZGVzIG91dCBhZnRlciBhIGJyaWVmCiAgICAgICAgICogZGVsYXkgdG8gZGlzcGxheSB0aGUgcmlwcGxlLgogICAgICAgICAqLwogICAgICAgIHRyYW5zZm9ybU1lbnU6IHRyaWdnZXIoJ3RyYW5zZm9ybU1lbnUnLCBbCiAgICAgICAgICAgIHN0YXRlKCd2b2lkJywgc3R5bGUoewogICAgICAgICAgICAgICAgb3BhY2l0eTogMCwKICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3NjYWxlKDAuOCknCiAgICAgICAgICAgIH0pKSwKICAgICAgICAgICAgdHJhbnNpdGlvbigndm9pZCA9PiBlbnRlcicsIGdyb3VwKFsKICAgICAgICAgICAgICAgIHF1ZXJ5KCcubWF0LW1lbnUtY29udGVudCwgLm1hdC1tZGMtbWVudS1jb250ZW50JywgYW5pbWF0ZSgnMTAwbXMgbGluZWFyJywgc3R5bGUoewogICAgICAgICAgICAgICAgICAgIG9wYWNpdHk6IDEKICAgICAgICAgICAgICAgIH0pKSksCiAgICAgICAgICAgICAgICBhbmltYXRlKCcxMjBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgdHJhbnNmb3JtOiAnc2NhbGUoMSknIH0pKSwKICAgICAgICAgICAgXSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCcqID0+IHZvaWQnLCBhbmltYXRlKCcxMDBtcyAyNW1zIGxpbmVhcicsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSkpCiAgICAgICAgXSksCiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBhbmltYXRpb24gZmFkZXMgaW4gdGhlIGJhY2tncm91bmQgY29sb3IgYW5kIGNvbnRlbnQgb2YgdGhlIG1lbnUgcGFuZWwKICAgICAgICAgKiBhZnRlciBpdHMgY29udGFpbmluZyBlbGVtZW50IGlzIHNjYWxlZCBpbi4KICAgICAgICAgKi8KICAgICAgICBmYWRlSW5JdGVtczogdHJpZ2dlcignZmFkZUluSXRlbXMnLCBbCiAgICAgICAgICAgIC8vIFRPRE8oY3Jpc2JldG8pOiB0aGlzIGlzIGluc2lkZSB0aGUgYHRyYW5zZm9ybU1lbnVgCiAgICAgICAgICAgIC8vIG5vdy4gUmVtb3ZlIG5leHQgdGltZSB3ZSBkbyBicmVha2luZyBjaGFuZ2VzLgogICAgICAgICAgICBzdGF0ZSgnc2hvd2luZycsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSksCiAgICAgICAgICAgIHRyYW5zaXRpb24oJ3ZvaWQgPT4gKicsIFsKICAgICAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCB9KSwKICAgICAgICAgICAgICAgIGFuaW1hdGUoJzQwMG1zIDEwMG1zIGN1YmljLWJlemllcigwLjU1LCAwLCAwLjU1LCAwLjIpJykKICAgICAgICAgICAgXSkKICAgICAgICBdKQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9tZW51L21lbnUtY29udGVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIE1lbnUgY29udGVudCB0aGF0IHdpbGwgYmUgcmVuZGVyZWQgbGF6aWx5IG9uY2UgdGhlIG1lbnUgaXMgb3BlbmVkLgogICAgICovCiAgICBjbGFzcyBNYXRNZW51Q29udGVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdGVtcGxhdGUKICAgICAgICAgKiBAcGFyYW0gez99IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9hcHBSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9pbmplY3RvcgogICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7Pz19IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF90ZW1wbGF0ZSwgX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgX2FwcFJlZiwgX2luamVjdG9yLCBfdmlld0NvbnRhaW5lclJlZiwgX2RvY3VtZW50LCBfY2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAgICAgICAgdGhpcy5fdGVtcGxhdGUgPSBfdGVtcGxhdGU7CiAgICAgICAgICAgIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciA9IF9jb21wb25lbnRGYWN0b3J5UmVzb2x2ZXI7CiAgICAgICAgICAgIHRoaXMuX2FwcFJlZiA9IF9hcHBSZWY7CiAgICAgICAgICAgIHRoaXMuX2luamVjdG9yID0gX2luamVjdG9yOwogICAgICAgICAgICB0aGlzLl92aWV3Q29udGFpbmVyUmVmID0gX3ZpZXdDb250YWluZXJSZWY7CiAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50ID0gX2RvY3VtZW50OwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXRzIHdoZW4gdGhlIG1lbnUgY29udGVudCBoYXMgYmVlbiBhdHRhY2hlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2F0dGFjaGVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQXR0YWNoZXMgdGhlIGNvbnRlbnQgd2l0aCBhIHBhcnRpY3VsYXIgY29udGV4dC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGNvbnRleHQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGF0dGFjaChjb250ZXh0ID0ge30pIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9wb3J0YWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BvcnRhbCA9IG5ldyBUZW1wbGF0ZVBvcnRhbCh0aGlzLl90ZW1wbGF0ZSwgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kZXRhY2goKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9vdXRsZXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX291dGxldCA9IG5ldyBEb21Qb3J0YWxPdXRsZXQodGhpcy5fZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JyksIHRoaXMuX2NvbXBvbmVudEZhY3RvcnlSZXNvbHZlciwgdGhpcy5fYXBwUmVmLCB0aGlzLl9pbmplY3Rvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fdGVtcGxhdGUuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAvLyBCZWNhdXNlIHdlIHN1cHBvcnQgb3BlbmluZyB0aGUgc2FtZSBtZW51IGZyb20gZGlmZmVyZW50IHRyaWdnZXJzICh3aGljaCBpbiB0dXJuIGhhdmUgdGhlaXIKICAgICAgICAgICAgLy8gb3duIGBPdmVybGF5UmVmYCBwYW5lbCksIHdlIGhhdmUgdG8gcmUtaW5zZXJ0IHRoZSBob3N0IGVsZW1lbnQgZXZlcnkgdGltZSwgb3RoZXJ3aXNlIHdlCiAgICAgICAgICAgIC8vIHJpc2sgaXQgc3RheWluZyBhdHRhY2hlZCB0byBhIHBhbmUgdGhhdCdzIG5vIGxvbmdlciBpbiB0aGUgRE9NLgogICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAoZWxlbWVudC5wYXJlbnROb2RlKSkuaW5zZXJ0QmVmb3JlKHRoaXMuX291dGxldC5vdXRsZXRFbGVtZW50LCBlbGVtZW50KTsKICAgICAgICAgICAgLy8gV2hlbiBgTWF0TWVudUNvbnRlbnRgIGlzIHVzZWQgaW4gYW4gYE9uUHVzaGAgY29tcG9uZW50LCB0aGUgaW5zZXJ0aW9uIG9mIHRoZSBtZW51CiAgICAgICAgICAgIC8vIGNvbnRlbnQgdmlhIGBjcmVhdGVFbWJlZGRlZFZpZXdgIGRvZXMgbm90IGNhdXNlIHRoZSBjb250ZW50IHRvIGJlIHNlZW4gYXMgImRpcnR5IgogICAgICAgICAgICAvLyBieSBBbmd1bGFyLiBUaGlzIGNhdXNlcyB0aGUgYEBDb250ZW50Q2hpbGRyZW5gIGZvciBtZW51IGl0ZW1zIHdpdGhpbiB0aGUgbWVudSB0bwogICAgICAgICAgICAvLyBub3QgYmUgdXBkYXRlZCBieSBBbmd1bGFyLiBCeSBleHBsaWNpdGx5IG1hcmtpbmcgZm9yIGNoZWNrIGhlcmUsIHdlIHRlbGwgQW5ndWxhciB0aGF0CiAgICAgICAgICAgIC8vIGl0IG5lZWRzIHRvIGNoZWNrIGZvciBuZXcgbWVudSBpdGVtcyBhbmQgdXBkYXRlIHRoZSBgQENvbnRlbnRDaGlsZGAgaW4gYE1hdE1lbnVgLgogICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDkuMC4wIE1ha2UgY2hhbmdlIGRldGVjdG9yIHJlZiByZXF1aXJlZAogICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3BvcnRhbC5hdHRhY2godGhpcy5fb3V0bGV0LCBjb250ZXh0KTsKICAgICAgICAgICAgdGhpcy5fYXR0YWNoZWQubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRhY2hlcyB0aGUgY29udGVudC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGV0YWNoKCkgewogICAgICAgICAgICBpZiAodGhpcy5fcG9ydGFsLmlzQXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BvcnRhbC5kZXRhY2goKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3V0bGV0KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdXRsZXQuZGlzcG9zZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0TWVudUNvbnRlbnQuybVmYWMgPSBmdW5jdGlvbiBNYXRNZW51Q29udGVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRNZW51Q29udGVudCkoybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ29tcG9uZW50RmFjdG9yeVJlc29sdmVyKSwgybXJtWRpcmVjdGl2ZUluamVjdChBcHBsaWNhdGlvblJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoSW5qZWN0b3IpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSk7IH07CiAgICBNYXRNZW51Q29udGVudC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRNZW51Q29udGVudCwgc2VsZWN0b3JzOiBbWyJuZy10ZW1wbGF0ZSIsICJtYXRNZW51Q29udGVudCIsICIiXV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdE1lbnVDb250ZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSwKICAgICAgICB7IHR5cGU6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9LAogICAgICAgIHsgdHlwZTogQXBwbGljYXRpb25SZWYgfSwKICAgICAgICB7IHR5cGU6IEluamVjdG9yIH0sCiAgICAgICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0RPQ1VNRU5UJDEsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9tZW51L21lbnUtZXJyb3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGZvciB0aGUgY2FzZSB3aGVuIG1lbnUgdHJpZ2dlciBkb2Vzbid0IGhhdmUgYSB2YWxpZCBtYXQtbWVudSBpbnN0YW5jZQogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93TWF0TWVudU1pc3NpbmdFcnJvcigpIHsKICAgICAgICB0aHJvdyBFcnJvcihgbWF0TWVudVRyaWdnZXJGb3I6IG11c3QgcGFzcyBpbiBhbiBtYXQtbWVudSBpbnN0YW5jZS4KCiAgICBFeGFtcGxlOgogICAgICA8bWF0LW1lbnUgI21lbnU9Im1hdE1lbnUiPjwvbWF0LW1lbnU+CiAgICAgIDxidXR0b24gW21hdE1lbnVUcmlnZ2VyRm9yXT0ibWVudSI+PC9idXR0b24+YCk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gZm9yIHRoZSBjYXNlIHdoZW4gbWVudSdzIHgtcG9zaXRpb24gdmFsdWUgaXNuJ3QgdmFsaWQuCiAgICAgKiBJbiBvdGhlciB3b3JkcywgaXQgZG9lc24ndCBtYXRjaCAnYmVmb3JlJyBvciAnYWZ0ZXInLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHRocm93TWF0TWVudUludmFsaWRQb3NpdGlvblgoKSB7CiAgICAgICAgdGhyb3cgRXJyb3IoYHhQb3NpdGlvbiB2YWx1ZSBtdXN0IGJlIGVpdGhlciAnYmVmb3JlJyBvciBhZnRlcicuCiAgICAgIEV4YW1wbGU6IDxtYXQtbWVudSB4UG9zaXRpb249ImJlZm9yZSIgI21lbnU9Im1hdE1lbnUiPjwvbWF0LW1lbnU+YCk7CiAgICB9CiAgICAvKioKICAgICAqIFRocm93cyBhbiBleGNlcHRpb24gZm9yIHRoZSBjYXNlIHdoZW4gbWVudSdzIHktcG9zaXRpb24gdmFsdWUgaXNuJ3QgdmFsaWQuCiAgICAgKiBJbiBvdGhlciB3b3JkcywgaXQgZG9lc24ndCBtYXRjaCAnYWJvdmUnIG9yICdiZWxvdycuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gdGhyb3dNYXRNZW51SW52YWxpZFBvc2l0aW9uWSgpIHsKICAgICAgICB0aHJvdyBFcnJvcihgeVBvc2l0aW9uIHZhbHVlIG11c3QgYmUgZWl0aGVyICdhYm92ZScgb3IgYmVsb3cnLgogICAgICBFeGFtcGxlOiA8bWF0LW1lbnUgeVBvc2l0aW9uPSJhYm92ZSIgI21lbnU9Im1hdE1lbnUiPjwvbWF0LW1lbnU+YCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvbWVudS9tZW51LXBhbmVsLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHVzZWQgdG8gcHJvdmlkZSB0aGUgcGFyZW50IG1lbnUgdG8gbWVudS1zcGVjaWZpYyBjb21wb25lbnRzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfTUVOVV9QQU5FTCA9IG5ldyBJbmplY3Rpb25Ub2tlbignTUFUX01FTlVfUEFORUwnKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9tZW51L21lbnUtaXRlbS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdE1lbnVJdGVtLgogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRNZW51SXRlbUJhc2UgewogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdE1lbnVJdGVtTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlUmlwcGxlKG1peGluRGlzYWJsZWQoTWF0TWVudUl0ZW1CYXNlKSk7CiAgICAvKioKICAgICAqIFNpbmdsZSBpdGVtIGluc2lkZSBvZiBhIGBtYXQtbWVudWAuIFByb3ZpZGVzIHRoZSBtZW51IGl0ZW0gc3R5bGluZyBhbmQgYWNjZXNzaWJpbGl0eSB0cmVhdG1lbnQuCiAgICAgKi8KICAgIGNsYXNzIE1hdE1lbnVJdGVtIGV4dGVuZHMgX01hdE1lbnVJdGVtTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/PX0gZG9jdW1lbnQKICAgICAgICAgKiBAcGFyYW0gez89fSBfZm9jdXNNb25pdG9yCiAgICAgICAgICogQHBhcmFtIHs/PX0gX3BhcmVudE1lbnUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudFJlZiwgZG9jdW1lbnQsIF9mb2N1c01vbml0b3IsIF9wYXJlbnRNZW51KSB7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOC4wLjAgbWFrZSBgX2ZvY3VzTW9uaXRvcmAgYW5kIGBkb2N1bWVudGAgcmVxdWlyZWQgcGFyYW1zLgogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvciA9IF9mb2N1c01vbml0b3I7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudE1lbnUgPSBfcGFyZW50TWVudTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFSSUEgcm9sZSBmb3IgdGhlIG1lbnUgaXRlbS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucm9sZSA9ICdtZW51aXRlbSc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIHRoZSBtZW51IGl0ZW0gaXMgaG92ZXJlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2hvdmVyZWQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyZWFtIHRoYXQgZW1pdHMgd2hlbiB0aGUgbWVudSBpdGVtIGlzIGZvY3VzZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9mb2N1c2VkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIG1lbnUgaXRlbSBpcyBoaWdobGlnaHRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2hpZ2hsaWdodGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBtZW51IGl0ZW0gYWN0cyBhcyBhIHRyaWdnZXIgZm9yIGEgc3ViLW1lbnUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl90cmlnZ2Vyc1N1Ym1lbnUgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKF9mb2N1c01vbml0b3IpIHsKICAgICAgICAgICAgICAgIC8vIFN0YXJ0IG1vbml0b3JpbmcgdGhlIGVsZW1lbnQgc28gaXQgZ2V0cyB0aGUgYXBwcm9wcmlhdGUgZm9jdXNlZCBjbGFzc2VzLiBXZSB3YW50CiAgICAgICAgICAgICAgICAvLyB0byBzaG93IHRoZSBmb2N1cyBzdHlsZSBmb3IgbWVudSBpdGVtcyBvbmx5IHdoZW4gdGhlIGZvY3VzIHdhcyBub3QgY2F1c2VkIGJ5IGEKICAgICAgICAgICAgICAgIC8vIG1vdXNlIG9yIHRvdWNoIGludGVyYWN0aW9uLgogICAgICAgICAgICAgICAgX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoX3BhcmVudE1lbnUgJiYgX3BhcmVudE1lbnUuYWRkSXRlbSkgewogICAgICAgICAgICAgICAgX3BhcmVudE1lbnUuYWRkSXRlbSh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IGRvY3VtZW50OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIHRoZSBtZW51IGl0ZW0uCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3JpZ2luCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMob3JpZ2luID0gJ3Byb2dyYW0nLCBvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c01vbml0b3IpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9nZXRIb3N0RWxlbWVudCgpLCBvcmlnaW4sIG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZ2V0SG9zdEVsZW1lbnQoKS5mb2N1cyhvcHRpb25zKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9mb2N1c2VkLm5leHQodGhpcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c01vbml0b3IpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyh0aGlzLl9lbGVtZW50UmVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fcGFyZW50TWVudSAmJiB0aGlzLl9wYXJlbnRNZW51LnJlbW92ZUl0ZW0pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudE1lbnUucmVtb3ZlSXRlbSh0aGlzKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9ob3ZlcmVkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzZWQuY29tcGxldGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCB0byBzZXQgdGhlIGB0YWJpbmRleGAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0VGFiSW5kZXgoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkID8gJy0xJyA6ICcwJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgaG9zdCBET00gZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRIb3N0RWxlbWVudCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUHJldmVudHMgdGhlIGRlZmF1bHQgZWxlbWVudCBhY3Rpb25zIGlmIGl0IGlzIGRpc2FibGVkLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIC8vIFdlIGhhdmUgdG8gdXNlIGEgYEhvc3RMaXN0ZW5lcmAgaGVyZSBpbiBvcmRlciB0byBzdXBwb3J0IGJvdGggSXZ5IGFuZCBWaWV3RW5naW5lLgogICAgICAgIC8vIEluIEl2eSB0aGUgYGhvc3RgIGJpbmRpbmdzIHdpbGwgYmUgbWVyZ2VkIHdoZW4gdGhpcyBjbGFzcyBpcyBleHRlbmRlZCwgd2hlcmVhcyBpbgogICAgICAgIC8vIFZpZXdFbmdpbmUgdGhleSdyZSBvdmVyd3JpdHRlbi4KICAgICAgICAvLyBUT0RPKGNyaXNiZXRvKTogd2UgbW92ZSB0aGlzIGJhY2sgaW50byBgaG9zdGAgb25jZSBJdnkgaXMgdHVybmVkIG9uIGJ5IGRlZmF1bHQuCiAgICAgICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLWhvc3QtZGVjb3JhdG9yLWluLWNvbmNyZXRlCiAgICAgICAgX2NoZWNrRGlzYWJsZWQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB0byB0aGUgaG92ZXIgc3RyZWFtLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgLy8gV2UgaGF2ZSB0byB1c2UgYSBgSG9zdExpc3RlbmVyYCBoZXJlIGluIG9yZGVyIHRvIHN1cHBvcnQgYm90aCBJdnkgYW5kIFZpZXdFbmdpbmUuCiAgICAgICAgLy8gSW4gSXZ5IHRoZSBgaG9zdGAgYmluZGluZ3Mgd2lsbCBiZSBtZXJnZWQgd2hlbiB0aGlzIGNsYXNzIGlzIGV4dGVuZGVkLCB3aGVyZWFzIGluCiAgICAgICAgLy8gVmlld0VuZ2luZSB0aGV5J3JlIG92ZXJ3cml0dGVuLgogICAgICAgIC8vIFRPRE8oY3Jpc2JldG8pOiB3ZSBtb3ZlIHRoaXMgYmFjayBpbnRvIGBob3N0YCBvbmNlIEl2eSBpcyB0dXJuZWQgb24gYnkgZGVmYXVsdC4KICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8taG9zdC1kZWNvcmF0b3ItaW4tY29uY3JldGUKICAgICAgICBfaGFuZGxlTW91c2VFbnRlcigpIHsKICAgICAgICAgICAgdGhpcy5faG92ZXJlZC5uZXh0KHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSBsYWJlbCB0byBiZSB1c2VkIHdoZW4gZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUgb3B0aW9uIHNob3VsZCBiZSBmb2N1c2VkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TGFiZWwoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0Tm9kZVR5cGUgPSB0aGlzLl9kb2N1bWVudCA/IHRoaXMuX2RvY3VtZW50LlRFWFRfTk9ERSA6IDM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG91dHB1dCA9ICcnOwogICAgICAgICAgICBpZiAoZWxlbWVudC5jaGlsZE5vZGVzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBlbGVtZW50LmNoaWxkTm9kZXMubGVuZ3RoOwogICAgICAgICAgICAgICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIHRvcC1sZXZlbCB0ZXh0IG5vZGVzIGFuZCBleHRyYWN0IHRoZWlyIHRleHQuCiAgICAgICAgICAgICAgICAvLyBXZSBza2lwIGFueXRoaW5nIHRoYXQncyBub3QgYSB0ZXh0IG5vZGUgdG8gcHJldmVudCB0aGUgdGV4dCBmcm9tCiAgICAgICAgICAgICAgICAvLyBiZWluZyB0aHJvd24gb2ZmIGJ5IHNvbWV0aGluZyBsaWtlIGFuIGljb24uCiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuY2hpbGROb2Rlc1tpXS5ub2RlVHlwZSA9PT0gdGV4dE5vZGVUeXBlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCArPSBlbGVtZW50LmNoaWxkTm9kZXNbaV0udGV4dENvbnRlbnQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBvdXRwdXQudHJpbSgpOwogICAgICAgIH0KICAgIH0KICAgIE1hdE1lbnVJdGVtLsm1ZmFjID0gZnVuY3Rpb24gTWF0TWVudUl0ZW1fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0TWVudUl0ZW0pKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRE9DVU1FTlQkMSksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfTUVOVV9QQU5FTCwgOCkpOyB9OwogICAgTWF0TWVudUl0ZW0uybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0TWVudUl0ZW0sIHNlbGVjdG9yczogW1siIiwgIm1hdC1tZW51LWl0ZW0iLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogMTAsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0TWVudUl0ZW1fSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0TWVudUl0ZW1fY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9jaGVja0Rpc2FibGVkKCRldmVudCk7IH0pKCJtb3VzZWVudGVyIiwgZnVuY3Rpb24gTWF0TWVudUl0ZW1fbW91c2VlbnRlcl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX2hhbmRsZU1vdXNlRW50ZXIoKTsgfSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoInJvbGUiLCBjdHgucm9sZSkoInRhYmluZGV4IiwgY3R4Ll9nZXRUYWJJbmRleCgpKSgiYXJpYS1kaXNhYmxlZCIsIGN0eC5kaXNhYmxlZC50b1N0cmluZygpKSgiZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQgfHwgbnVsbCk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1tZW51LWl0ZW0iLCB0cnVlKSgibWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZCIsIGN0eC5faGlnaGxpZ2h0ZWQpKCJtYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlciIsIGN0eC5fdHJpZ2dlcnNTdWJtZW51KTsKICAgICAgICB9IH0sIGlucHV0czogeyBkaXNhYmxlZDogImRpc2FibGVkIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCByb2xlOiAicm9sZSIgfSwgZXhwb3J0QXM6IFsibWF0TWVudUl0ZW0iXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgYXR0cnM6IF9jMCRrLCBuZ0NvbnRlbnRTZWxlY3RvcnM6IF9jMSRiLCBkZWNsczogMiwgdmFyczogMiwgY29uc3RzOiBbWyJtYXRSaXBwbGUiLCAiIiwgMSwgIm1hdC1tZW51LXJpcHBsZSIsIDMsICJtYXRSaXBwbGVEaXNhYmxlZCIsICJtYXRSaXBwbGVUcmlnZ2VyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0TWVudUl0ZW1fVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxLCAiZGl2IiwgMCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4LmRpc2FibGVSaXBwbGUgfHwgY3R4LmRpc2FibGVkKSgibWF0UmlwcGxlVHJpZ2dlciIsIGN0eC5fZ2V0SG9zdEVsZW1lbnQoKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0UmlwcGxlXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRNZW51SXRlbS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX01FTlVfUEFORUwsXSB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CiAgICBNYXRNZW51SXRlbS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICByb2xlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBfY2hlY2tEaXNhYmxlZDogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ2NsaWNrJywgWyckZXZlbnQnXSxdIH1dLAogICAgICAgIF9oYW5kbGVNb3VzZUVudGVyOiBbeyB0eXBlOiBIb3N0TGlzdGVuZXIsIGFyZ3M6IFsnbW91c2VlbnRlcicsXSB9XQogICAgfTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRvIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgYG1hdC1tZW51YC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfTUVOVV9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1tZW51LWRlZmF1bHQtb3B0aW9ucycsIHsKICAgICAgICBwcm92aWRlZEluOiAncm9vdCcsCiAgICAgICAgZmFjdG9yeTogTUFUX01FTlVfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlkKICAgIH0pOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFUX01FTlVfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlkoKSB7CiAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgb3ZlcmxhcFRyaWdnZXI6IGZhbHNlLAogICAgICAgICAgICB4UG9zaXRpb246ICdhZnRlcicsCiAgICAgICAgICAgIHlQb3NpdGlvbjogJ2JlbG93JywKICAgICAgICAgICAgYmFja2Ryb3BDbGFzczogJ2Nkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wJywKICAgICAgICB9OwogICAgfQogICAgLyoqCiAgICAgKiBTdGFydCBlbGV2YXRpb24gZm9yIHRoZSBtZW51IHBhbmVsLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfTUVOVV9CQVNFX0VMRVZBVElPTiA9IDQ7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbWVudVBhbmVsVWlkID0gMDsKICAgIC8qKgogICAgICogQmFzZSBjbGFzcyB3aXRoIGFsbCBvZiB0aGUgYE1hdE1lbnVgIGZ1bmN0aW9uYWxpdHkuCiAgICAgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lCiAgICBjbGFzcyBfTWF0TWVudUJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9uZ1pvbmUKICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0T3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfbmdab25lLCBfZGVmYXVsdE9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucyA9IF9kZWZhdWx0T3B0aW9uczsKICAgICAgICAgICAgdGhpcy5feFBvc2l0aW9uID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMueFBvc2l0aW9uOwogICAgICAgICAgICB0aGlzLl95UG9zaXRpb24gPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy55UG9zaXRpb247CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBPbmx5IHRoZSBkaXJlY3QgZGVzY2VuZGFudCBtZW51IGl0ZW1zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zID0gbmV3IFF1ZXJ5TGlzdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3Vic2NyaXB0aW9uIHRvIHRhYiBldmVudHMgb24gdGhlIG1lbnUgcGFuZWwKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3RhYlN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIENvbmZpZyBvYmplY3QgdG8gYmUgcGFzc2VkIGludG8gdGhlIG1lbnUncyBuZ0NsYXNzCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jbGFzc0xpc3QgPSB7fTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEN1cnJlbnQgc3RhdGUgb2YgdGhlIHBhbmVsIGFuaW1hdGlvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3BhbmVsQW5pbWF0aW9uU3RhdGUgPSAndm9pZCc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuZXZlciBhbiBhbmltYXRpb24gb24gdGhlIG1lbnUgY29tcGxldGVzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uRG9uZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDbGFzcyB0byBiZSBhZGRlZCB0byB0aGUgYmFja2Ryb3AgZWxlbWVudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuYmFja2Ryb3BDbGFzcyA9IHRoaXMuX2RlZmF1bHRPcHRpb25zLmJhY2tkcm9wQ2xhc3M7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXBUcmlnZ2VyID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMub3ZlcmxhcFRyaWdnZXI7CiAgICAgICAgICAgIHRoaXMuX2hhc0JhY2tkcm9wID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuaGFzQmFja2Ryb3A7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIG1lbnUgaXMgY2xvc2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jbG9zZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIG1lbnUgaXMgY2xvc2VkLgogICAgICAgICAgICAgKiBAZGVwcmVjYXRlZCBTd2l0Y2ggdG8gYGNsb3NlZGAgaW5zdGVhZAogICAgICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jbG9zZSA9IHRoaXMuY2xvc2VkOwogICAgICAgICAgICB0aGlzLnBhbmVsSWQgPSBgbWF0LW1lbnUtcGFuZWwtJHttZW51UGFuZWxVaWQrK31gOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQb3NpdGlvbiBvZiB0aGUgbWVudSBpbiB0aGUgWCBheGlzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHhQb3NpdGlvbigpIHsgcmV0dXJuIHRoaXMuX3hQb3NpdGlvbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB4UG9zaXRpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSAnYmVmb3JlJyAmJiB2YWx1ZSAhPT0gJ2FmdGVyJykgewogICAgICAgICAgICAgICAgdGhyb3dNYXRNZW51SW52YWxpZFBvc2l0aW9uWCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3hQb3NpdGlvbiA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLnNldFBvc2l0aW9uQ2xhc3NlcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQb3NpdGlvbiBvZiB0aGUgbWVudSBpbiB0aGUgWSBheGlzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHlQb3NpdGlvbigpIHsgcmV0dXJuIHRoaXMuX3lQb3NpdGlvbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB5UG9zaXRpb24odmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlICE9PSAnYWJvdmUnICYmIHZhbHVlICE9PSAnYmVsb3cnKSB7CiAgICAgICAgICAgICAgICB0aHJvd01hdE1lbnVJbnZhbGlkUG9zaXRpb25ZKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5feVBvc2l0aW9uID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb25DbGFzc2VzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG1lbnUgc2hvdWxkIG92ZXJsYXAgaXRzIHRyaWdnZXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgb3ZlcmxhcFRyaWdnZXIoKSB7IHJldHVybiB0aGlzLl9vdmVybGFwVHJpZ2dlcjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBvdmVybGFwVHJpZ2dlcih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9vdmVybGFwVHJpZ2dlciA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG1lbnUgaGFzIGEgYmFja2Ryb3AuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaGFzQmFja2Ryb3AoKSB7IHJldHVybiB0aGlzLl9oYXNCYWNrZHJvcDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBoYXNCYWNrZHJvcCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9oYXNCYWNrZHJvcCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGNsYXNzZXMgc2V0IG9uIHRoZSBob3N0IG1hdC1tZW51IGVsZW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBvbiB0aGUKICAgICAgICAgKiBtZW51IHRlbXBsYXRlIHRoYXQgZGlzcGxheXMgaW4gdGhlIG92ZXJsYXkgY29udGFpbmVyLiAgT3RoZXJ3aXNlLCBpdCdzIGRpZmZpY3VsdAogICAgICAgICAqIHRvIHN0eWxlIHRoZSBjb250YWluaW5nIG1lbnUgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzIGxpc3Qgb2YgY2xhc3MgbmFtZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBwYW5lbENsYXNzKGNsYXNzZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhbmVsQ2xhc3MgPSB0aGlzLl9wcmV2aW91c1BhbmVsQ2xhc3M7CiAgICAgICAgICAgIGlmIChwcmV2aW91c1BhbmVsQ2xhc3MgJiYgcHJldmlvdXNQYW5lbENsYXNzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcHJldmlvdXNQYW5lbENsYXNzLnNwbGl0KCcgJykuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNsYXNzTmFtZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGNsYXNzTmFtZSkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NsYXNzTGlzdFtjbGFzc05hbWVdID0gZmFsc2U7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNQYW5lbENsYXNzID0gY2xhc3NlczsKICAgICAgICAgICAgaWYgKGNsYXNzZXMgJiYgY2xhc3Nlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIGNsYXNzZXMuc3BsaXQoJyAnKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2xhc3NOYW1lCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY2xhc3NOYW1lKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xhc3NMaXN0W2NsYXNzTmFtZV0gPSB0cnVlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTmFtZSA9ICcnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHRha2VzIGNsYXNzZXMgc2V0IG9uIHRoZSBob3N0IG1hdC1tZW51IGVsZW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBvbiB0aGUKICAgICAgICAgKiBtZW51IHRlbXBsYXRlIHRoYXQgZGlzcGxheXMgaW4gdGhlIG92ZXJsYXkgY29udGFpbmVyLiAgT3RoZXJ3aXNlLCBpdCdzIGRpZmZpY3VsdAogICAgICAgICAqIHRvIHN0eWxlIHRoZSBjb250YWluaW5nIG1lbnUgZnJvbSBvdXRzaWRlIHRoZSBjb21wb25lbnQuCiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBwYW5lbENsYXNzYCBpbnN0ZWFkLgogICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2xhc3NMaXN0KCkgeyByZXR1cm4gdGhpcy5wYW5lbENsYXNzOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgY2xhc3NMaXN0KGNsYXNzZXMpIHsgdGhpcy5wYW5lbENsYXNzID0gY2xhc3NlczsgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuc2V0UG9zaXRpb25DbGFzc2VzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlckNvbnRlbnRJbml0KCkgewogICAgICAgICAgICB0aGlzLl91cGRhdGVEaXJlY3REZXNjZW5kYW50cygpOwogICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEZvY3VzS2V5TWFuYWdlcih0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMpLndpdGhXcmFwKCkud2l0aFR5cGVBaGVhZCgpOwogICAgICAgICAgICB0aGlzLl90YWJTdWJzY3JpcHRpb24gPSB0aGlzLl9rZXlNYW5hZ2VyLnRhYk91dC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5jbG9zZWQuZW1pdCgndGFiJykpKTsKICAgICAgICAgICAgLy8gSWYgYSB1c2VyIG1hbnVhbGx5IChwcm9ncmFtYXRpY2FsbHkpIGZvY3VzZXMgYSBtZW51IGl0ZW0sIHdlIG5lZWQgdG8gcmVmbGVjdCB0aGF0IGZvY3VzCiAgICAgICAgICAgIC8vIGNoYW5nZSBiYWNrIHRvIHRoZSBrZXkgbWFuYWdlci4gTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdW5zdWJzY3JpYmUgaGVyZSBiZWNhdXNlIF9mb2N1c2VkCiAgICAgICAgICAgIC8vIGlzIGludGVybmFsIGFuZCB3ZSBrbm93IHRoYXQgaXQgZ2V0cyBjb21wbGV0ZWQgb24gZGVzdHJveS4KICAgICAgICAgICAgdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmNoYW5nZXMucGlwZShzdGFydFdpdGgodGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zKSwgc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaXRlbXMgPT4gbWVyZ2UoLi4uaXRlbXMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaXRlbSkgPT4gaXRlbS5fZm9jdXNlZCkpKSkpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZvY3VzZWRJdGVtCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb2N1c2VkSXRlbSA9PiB0aGlzLl9rZXlNYW5hZ2VyLnVwZGF0ZUFjdGl2ZUl0ZW0oZm9jdXNlZEl0ZW0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5kZXN0cm95KCk7CiAgICAgICAgICAgIHRoaXMuX3RhYlN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLmNsb3NlZC5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgaG92ZXJlZCBtZW51IGl0ZW0gY2hhbmdlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ob3ZlcmVkKCkgewogICAgICAgICAgICAvLyBDb2VyY2UgdGhlIGBjaGFuZ2VzYCBwcm9wZXJ0eSBiZWNhdXNlIEFuZ3VsYXIgdHlwZXMgaXQgYXMgYE9ic2VydmFibGU8YW55PmAKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpdGVtQ2hhbmdlcyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuY2hhbmdlcykpOwogICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGl0ZW1DaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcyksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbXMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGl0ZW1zID0+IG1lcmdlKC4uLml0ZW1zLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uX2hvdmVyZWQpKSkpKSkpKTsKICAgICAgICB9CiAgICAgICAgLyoKICAgICAgICAgICAqIFJlZ2lzdGVycyBhIG1lbnUgaXRlbSB3aXRoIHRoZSBtZW51LgogICAgICAgICAgICogQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICogQGRlcHJlY2F0ZWQgTm8gbG9uZ2VyIGJlaW5nIHVzZWQuIFRvIGJlIHJlbW92ZWQuCiAgICAgICAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDkuMC4wCiAgICAgICAgICAgKi8KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9pdGVtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhZGRJdGVtKF9pdGVtKSB7IH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgbWVudS4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBiZWluZyB1c2VkLiBUbyBiZSByZW1vdmVkLgogICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDkuMC4wCiAgICAgICAgICogQHBhcmFtIHs/fSBfaXRlbQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSXRlbShfaXRlbSkgeyB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlIGEga2V5Ym9hcmQgZXZlbnQgZnJvbSB0aGUgbWVudSwgZGVsZWdhdGluZyB0byB0aGUgYXBwcm9wcmlhdGUgYWN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVLZXlkb3duKGV2ZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qga2V5Q29kZSA9IGV2ZW50LmtleUNvZGU7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IHRoaXMuX2tleU1hbmFnZXI7CiAgICAgICAgICAgIHN3aXRjaCAoa2V5Q29kZSkgewogICAgICAgICAgICAgICAgY2FzZSBFU0NBUEU6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5jbG9zZWQuZW1pdCgna2V5ZG93bicpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgTEVGVF9BUlJPVzoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRNZW51ICYmIHRoaXMuZGlyZWN0aW9uID09PSAnbHRyJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCdrZXlkb3duJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBSSUdIVF9BUlJPVzoKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYXJlbnRNZW51ICYmIHRoaXMuZGlyZWN0aW9uID09PSAncnRsJykgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlZC5lbWl0KCdrZXlkb3duJyk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSBIT01FOgogICAgICAgICAgICAgICAgY2FzZSBFTkQ6CiAgICAgICAgICAgICAgICAgICAgaWYgKCFoYXNNb2RpZmllcktleShldmVudCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAga2V5Q29kZSA9PT0gSE9NRSA/IG1hbmFnZXIuc2V0Rmlyc3RJdGVtQWN0aXZlKCkgOiBtYW5hZ2VyLnNldExhc3RJdGVtQWN0aXZlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBpZiAoa2V5Q29kZSA9PT0gVVBfQVJST1cgfHwga2V5Q29kZSA9PT0gRE9XTl9BUlJPVykgewogICAgICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLnNldEZvY3VzT3JpZ2luKCdrZXlib2FyZCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBtYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXMgdGhlIGZpcnN0IGl0ZW0gaW4gdGhlIG1lbnUuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3JpZ2luIEFjdGlvbiBmcm9tIHdoaWNoIHRoZSBmb2N1cyBvcmlnaW5hdGVkLiBVc2VkIHRvIHNldCB0aGUgY29ycmVjdCBzdHlsaW5nLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXNGaXJzdEl0ZW0ob3JpZ2luID0gJ3Byb2dyYW0nKSB7CiAgICAgICAgICAgIC8vIFdoZW4gdGhlIGNvbnRlbnQgaXMgcmVuZGVyZWQgbGF6aWx5LCBpdCB0YWtlcyBhIGJpdCBiZWZvcmUgdGhlIGl0ZW1zIGFyZSBpbnNpZGUgdGhlIERPTS4KICAgICAgICAgICAgaWYgKHRoaXMubGF6eUNvbnRlbnQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX25nWm9uZS5vblN0YWJsZS5hc09ic2VydmFibGUoKQogICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2UoMSkpCiAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl9mb2N1c0ZpcnN0SXRlbShvcmlnaW4pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb2N1c0ZpcnN0SXRlbShvcmlnaW4pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFjdHVhbCBpbXBsZW1lbnRhdGlvbiB0aGF0IGZvY3VzZXMgdGhlIGZpcnN0IGl0ZW0uIE5lZWRzIHRvIGJlIHNlcGFyYXRlZAogICAgICAgICAqIG91dCBzbyB3ZSBkb24ndCByZXBlYXQgdGhlIHNhbWUgbG9naWMgaW4gdGhlIHB1YmxpYyBgZm9jdXNGaXJzdEl0ZW1gIG1ldGhvZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gb3JpZ2luCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZm9jdXNGaXJzdEl0ZW0ob3JpZ2luKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWFuYWdlciA9IHRoaXMuX2tleU1hbmFnZXI7CiAgICAgICAgICAgIG1hbmFnZXIuc2V0Rm9jdXNPcmlnaW4ob3JpZ2luKS5zZXRGaXJzdEl0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBhY3RpdmUgaXRlbSBhdCB0aGlzIHBvaW50LCBpdCBtZWFucyB0aGF0IGFsbCB0aGUgaXRlbXMgYXJlIGRpc2FibGVkLgogICAgICAgICAgICAvLyBNb3ZlIGZvY3VzIHRvIHRoZSBtZW51IHBhbmVsIHNvIGtleWJvYXJkIGV2ZW50cyBsaWtlIEVzY2FwZSBzdGlsbCB3b3JrLiBBbHNvIHRoaXMgd2lsbAogICAgICAgICAgICAvLyBnaXZlIF9zb21lXyBmZWVkYmFjayB0byBzY3JlZW4gcmVhZGVycy4KICAgICAgICAgICAgaWYgKCFtYW5hZ2VyLmFjdGl2ZUl0ZW0gJiYgdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGVsZW1lbnQgPSB0aGlzLl9kaXJlY3REZXNjZW5kYW50SXRlbXMuZmlyc3QuX2dldEhvc3RFbGVtZW50KCkucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgIC8vIEJlY2F1c2UgdGhlIGBtYXQtbWVudWAgaXMgYXQgdGhlIERPTSBpbnNlcnRpb24gcG9pbnQsIG5vdCBpbnNpZGUgdGhlIG92ZXJsYXksIHdlIGRvbid0CiAgICAgICAgICAgICAgICAvLyBoYXZlIGEgbmljZSB3YXkgb2YgZ2V0dGluZyBhIGhvbGQgb2YgdGhlIG1lbnUgcGFuZWwuIFdlIGNhbid0IHVzZSBhIGBWaWV3Q2hpbGRgIGVpdGhlcgogICAgICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGUgcGFuZWwgaXMgaW5zaWRlIGFuIGBuZy10ZW1wbGF0ZWAuIFdlIHdvcmsgYXJvdW5kIGl0IGJ5IHN0YXJ0aW5nIGZyb20gb25lIG9mCiAgICAgICAgICAgICAgICAvLyB0aGUgaXRlbXMgYW5kIHdhbGtpbmcgdXAgdGhlIERPTS4KICAgICAgICAgICAgICAgIHdoaWxlIChlbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuZ2V0QXR0cmlidXRlKCdyb2xlJykgPT09ICdtZW51JykgewogICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmZvY3VzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9IGVsZW1lbnQucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVzZXRzIHRoZSBhY3RpdmUgaXRlbSBpbiB0aGUgbWVudS4gVGhpcyBpcyB1c2VkIHdoZW4gdGhlIG1lbnUgaXMgb3BlbmVkLCBhbGxvd2luZwogICAgICAgICAqIHRoZSB1c2VyIHRvIHN0YXJ0IGZyb20gdGhlIGZpcnN0IG9wdGlvbiB3aGVuIHByZXNzaW5nIHRoZSBkb3duIGFycm93LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzZXRBY3RpdmVJdGVtKCkgewogICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oLTEpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBtZW51IHBhbmVsIGVsZXZhdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IGRlcHRoIE51bWJlciBvZiBwYXJlbnQgbWVudXMgdGhhdCBjb21lIGJlZm9yZSB0aGUgbWVudS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldEVsZXZhdGlvbihkZXB0aCkgewogICAgICAgICAgICAvLyBUaGUgZWxldmF0aW9uIHN0YXJ0cyBhdCB0aGUgYmFzZSBhbmQgaW5jcmVhc2VzIGJ5IG9uZSBmb3IgZWFjaCBsZXZlbC4KICAgICAgICAgICAgLy8gQ2FwcGVkIGF0IDI0IGJlY2F1c2UgdGhhdCdzIHRoZSBtYXhpbXVtIGVsZXZhdGlvbiBkZWZpbmVkIGluIHRoZSBNYXRlcmlhbCBkZXNpZ24gc3BlYy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGV2YXRpb24gPSBNYXRoLm1pbihNQVRfTUVOVV9CQVNFX0VMRVZBVElPTiArIGRlcHRoLCAyNCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3RWxldmF0aW9uID0gYG1hdC1lbGV2YXRpb24teiR7ZWxldmF0aW9ufWA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VzdG9tRWxldmF0aW9uID0gT2JqZWN0LmtleXModGhpcy5fY2xhc3NMaXN0KS5maW5kKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjID0+IGMuc3RhcnRzV2l0aCgnbWF0LWVsZXZhdGlvbi16JykpKTsKICAgICAgICAgICAgaWYgKCFjdXN0b21FbGV2YXRpb24gfHwgY3VzdG9tRWxldmF0aW9uID09PSB0aGlzLl9wcmV2aW91c0VsZXZhdGlvbikgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzRWxldmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2xhc3NMaXN0W3RoaXMuX3ByZXZpb3VzRWxldmF0aW9uXSA9IGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5fY2xhc3NMaXN0W25ld0VsZXZhdGlvbl0gPSB0cnVlOwogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNFbGV2YXRpb24gPSBuZXdFbGV2YXRpb247CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBjbGFzc2VzIHRvIHRoZSBtZW51IHBhbmVsIGJhc2VkIG9uIGl0cyBwb3NpdGlvbi4gQ2FuIGJlIHVzZWQgYnkKICAgICAgICAgKiBjb25zdW1lcnMgdG8gYWRkIHNwZWNpZmljIHN0eWxpbmcgYmFzZWQgb24gdGhlIHBvc2l0aW9uLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gcG9zWCBQb3NpdGlvbiBvZiB0aGUgbWVudSBhbG9uZyB0aGUgeCBheGlzLgogICAgICAgICAqIEBwYXJhbSB7Pz19IHBvc1kgUG9zaXRpb24gb2YgdGhlIG1lbnUgYWxvbmcgdGhlIHkgYXhpcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldFBvc2l0aW9uQ2xhc3Nlcyhwb3NYID0gdGhpcy54UG9zaXRpb24sIHBvc1kgPSB0aGlzLnlQb3NpdGlvbikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNsYXNzZXMgPSB0aGlzLl9jbGFzc0xpc3Q7CiAgICAgICAgICAgIGNsYXNzZXNbJ21hdC1tZW51LWJlZm9yZSddID0gcG9zWCA9PT0gJ2JlZm9yZSc7CiAgICAgICAgICAgIGNsYXNzZXNbJ21hdC1tZW51LWFmdGVyJ10gPSBwb3NYID09PSAnYWZ0ZXInOwogICAgICAgICAgICBjbGFzc2VzWydtYXQtbWVudS1hYm92ZSddID0gcG9zWSA9PT0gJ2Fib3ZlJzsKICAgICAgICAgICAgY2xhc3Nlc1snbWF0LW1lbnUtYmVsb3cnXSA9IHBvc1kgPT09ICdiZWxvdyc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN0YXJ0cyB0aGUgZW50ZXIgYW5pbWF0aW9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N0YXJ0QW5pbWF0aW9uKCkgewogICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDguMC4wIENvbWJpbmUgd2l0aCBfcmVzZXRBbmltYXRpb24uCiAgICAgICAgICAgIHRoaXMuX3BhbmVsQW5pbWF0aW9uU3RhdGUgPSAnZW50ZXInOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXNldHMgdGhlIHBhbmVsIGFuaW1hdGlvbiB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZXNldEFuaW1hdGlvbigpIHsKICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCBDb21iaW5lIHdpdGggX3N0YXJ0QW5pbWF0aW9uLgogICAgICAgICAgICB0aGlzLl9wYW5lbEFuaW1hdGlvblN0YXRlID0gJ3ZvaWQnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxsYmFjayB0aGF0IGlzIGludm9rZWQgd2hlbiB0aGUgcGFuZWwgYW5pbWF0aW9uIGNvbXBsZXRlcy4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb25BbmltYXRpb25Eb25lKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbkRvbmUubmV4dChldmVudCk7CiAgICAgICAgICAgIHRoaXMuX2lzQW5pbWF0aW5nID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbkFuaW1hdGlvblN0YXJ0KGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2lzQW5pbWF0aW5nID0gdHJ1ZTsKICAgICAgICAgICAgLy8gU2Nyb2xsIHRoZSBjb250ZW50IGVsZW1lbnQgdG8gdGhlIHRvcCBhcyBzb29uIGFzIHRoZSBhbmltYXRpb24gc3RhcnRzLiBUaGlzIGlzIG5lY2Vzc2FyeSwKICAgICAgICAgICAgLy8gYmVjYXVzZSB3ZSBtb3ZlIGZvY3VzIHRvIHRoZSBmaXJzdCBpdGVtIHdoaWxlIGl0J3Mgc3RpbGwgYmVpbmcgYW5pbWF0ZWQsIHdoaWNoIGNhbiB0aHJvdwogICAgICAgICAgICAvLyB0aGUgYnJvd3NlciBvZmYgd2hlbiBpdCBkZXRlcm1pbmVzIHRoZSBzY3JvbGwgcG9zaXRpb24uIEFsdGVybmF0aXZlbHkgd2UgY2FuIG1vdmUgZm9jdXMKICAgICAgICAgICAgLy8gd2hlbiB0aGUgYW5pbWF0aW9uIGlzIGRvbmUsIGhvd2V2ZXIgbW92aW5nIGZvY3VzIGFzeW5jaHJvbm91c2x5IHdpbGwgaW50ZXJydXB0IHNjcmVlbgogICAgICAgICAgICAvLyByZWFkZXJzIHdoaWNoIGFyZSBpbiB0aGUgcHJvY2VzcyBvZiByZWFkaW5nIG91dCB0aGUgbWVudSBhbHJlYWR5LiBXZSB0YWtlIHRoZSBgZWxlbWVudGAKICAgICAgICAgICAgLy8gZnJvbSB0aGUgYGV2ZW50YCBzaW5jZSB3ZSBjYW4ndCB1c2UgYSBgVmlld0NoaWxkYCB0byBhY2Nlc3MgdGhlIHBhbmUuCiAgICAgICAgICAgIGlmIChldmVudC50b1N0YXRlID09PSAnZW50ZXInICYmIHRoaXMuX2tleU1hbmFnZXIuYWN0aXZlSXRlbUluZGV4ID09PSAwKSB7CiAgICAgICAgICAgICAgICBldmVudC5lbGVtZW50LnNjcm9sbFRvcCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB1cCBhIHN0cmVhbSB0aGF0IHdpbGwga2VlcCB0cmFjayBvZiBhbnkgbmV3bHktYWRkZWQgbWVudSBpdGVtcyBhbmQgd2lsbCB1cGRhdGUgdGhlIGxpc3QKICAgICAgICAgKiBvZiBkaXJlY3QgZGVzY2VuZGFudHMuIFdlIGNvbGxlY3QgdGhlIGRlc2NlbmRhbnRzIHRoaXMgd2F5LCBiZWNhdXNlIGBfYWxsSXRlbXNgIGNhbiBpbmNsdWRlCiAgICAgICAgICogaXRlbXMgdGhhdCBhcmUgcGFydCBvZiBjaGlsZCBtZW51cywgYW5kIHVzaW5nIGEgY3VzdG9tIHdheSBvZiByZWdpc3RlcmluZyBpdGVtcyBpcyB1bnJlbGlhYmxlCiAgICAgICAgICogd2hlbiBpdCBjb21lcyB0byBtYWludGFpbmluZyB0aGUgaXRlbSBvcmRlci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZURpcmVjdERlc2NlbmRhbnRzKCkgewogICAgICAgICAgICB0aGlzLl9hbGxJdGVtcy5jaGFuZ2VzCiAgICAgICAgICAgICAgICAucGlwZShzdGFydFdpdGgodGhpcy5fYWxsSXRlbXMpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbXMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpdGVtcykgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fZGlyZWN0RGVzY2VuZGFudEl0ZW1zLnJlc2V0KGl0ZW1zLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGl0ZW0gPT4gaXRlbS5fcGFyZW50TWVudSA9PT0gdGhpcykpKTsKICAgICAgICAgICAgICAgIHRoaXMuX2RpcmVjdERlc2NlbmRhbnRJdGVtcy5ub3RpZnlPbkNoYW5nZXMoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIF9NYXRNZW51QmFzZS7JtWZhYyA9IGZ1bmN0aW9uIF9NYXRNZW51QmFzZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0TWVudUJhc2UpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfTUVOVV9ERUZBVUxUX09QVElPTlMpKTsgfTsKICAgIF9NYXRNZW51QmFzZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBfTWF0TWVudUJhc2UsIGNvbnRlbnRRdWVyaWVzOiBmdW5jdGlvbiBfTWF0TWVudUJhc2VfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRNZW51Q29udGVudCwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdE1lbnVJdGVtLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0TWVudUl0ZW0sIGZhbHNlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmxhenlDb250ZW50ID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9hbGxJdGVtcyA9IF90KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5pdGVtcyA9IF90KTsKICAgICAgICB9IH0sIHZpZXdRdWVyeTogZnVuY3Rpb24gX01hdE1lbnVCYXNlX1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KFRlbXBsYXRlUmVmLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnRlbXBsYXRlUmVmID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGJhY2tkcm9wQ2xhc3M6ICJiYWNrZHJvcENsYXNzIiwgeFBvc2l0aW9uOiAieFBvc2l0aW9uIiwgeVBvc2l0aW9uOiAieVBvc2l0aW9uIiwgb3ZlcmxhcFRyaWdnZXI6ICJvdmVybGFwVHJpZ2dlciIsIGhhc0JhY2tkcm9wOiAiaGFzQmFja2Ryb3AiLCBwYW5lbENsYXNzOiBbImNsYXNzIiwgInBhbmVsQ2xhc3MiXSwgY2xhc3NMaXN0OiAiY2xhc3NMaXN0IiwgYXJpYUxhYmVsOiBbImFyaWEtbGFiZWwiLCAiYXJpYUxhYmVsIl0sIGFyaWFMYWJlbGxlZGJ5OiBbImFyaWEtbGFiZWxsZWRieSIsICJhcmlhTGFiZWxsZWRieSJdLCBhcmlhRGVzY3JpYmVkYnk6IFsiYXJpYS1kZXNjcmliZWRieSIsICJhcmlhRGVzY3JpYmVkYnkiXSB9LCBvdXRwdXRzOiB7IGNsb3NlZDogImNsb3NlZCIsIGNsb3NlOiAiY2xvc2UiIH0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIF9NYXRNZW51QmFzZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfTUVOVV9ERUZBVUxUX09QVElPTlMsXSB9XSB9CiAgICBdOwogICAgX01hdE1lbnVCYXNlLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIF9hbGxJdGVtczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0TWVudUl0ZW0sIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dLAogICAgICAgIGJhY2tkcm9wQ2xhc3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFyaWFMYWJlbDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnYXJpYS1sYWJlbCcsXSB9XSwKICAgICAgICBhcmlhTGFiZWxsZWRieTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnYXJpYS1sYWJlbGxlZGJ5JyxdIH1dLAogICAgICAgIGFyaWFEZXNjcmliZWRieTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnYXJpYS1kZXNjcmliZWRieScsXSB9XSwKICAgICAgICB4UG9zaXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHlQb3NpdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdGVtcGxhdGVSZWY6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1RlbXBsYXRlUmVmLF0gfV0sCiAgICAgICAgaXRlbXM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW01hdE1lbnVJdGVtLCB7IGRlc2NlbmRhbnRzOiBmYWxzZSB9LF0gfV0sCiAgICAgICAgbGF6eUNvbnRlbnQ6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW01hdE1lbnVDb250ZW50LF0gfV0sCiAgICAgICAgb3ZlcmxhcFRyaWdnZXI6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGhhc0JhY2tkcm9wOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBwYW5lbENsYXNzOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjbGFzcycsXSB9XSwKICAgICAgICBjbGFzc0xpc3Q6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNsb3NlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGNsb3NlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlIFdlIHNob3cgdGhlICJfTWF0TWVudSIgY2xhc3MgYXMgIk1hdE1lbnUiIGluIHRoZSBkb2NzLgogICAgICovCiAgICBjbGFzcyBNYXRNZW51IGV4dGVuZHMgX01hdE1lbnVCYXNlIHsKICAgIH0KICAgIE1hdE1lbnUuybVmYWMgPSBmdW5jdGlvbiBNYXRNZW51X0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRNZW51X0Jhc2VGYWN0b3J5KHQgfHwgTWF0TWVudSk7IH07CiAgICBNYXRNZW51Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdE1lbnUsIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICBjb25zdCDJtU1hdE1lbnVfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRNZW51KTsKICAgIC8vIE5vdGUgb24gdGhlIHdlaXJkIGluaGVyaXRhbmNlIHNldHVwOiB3ZSBuZWVkIHRocmVlIGNsYXNzZXMsIGJlY2F1c2UgdGhlIE1EQy1iYXNlZCBtZW51IGhhcyB0bwogICAgLy8gZXh0ZW5kIGBNYXRNZW51YCwgaG93ZXZlciBrZWVwaW5nIGEgcmVmZXJlbmNlIHRvIGl0IHdpbGwgY2F1c2UgdGhlIGlubGluZWQgdGVtcGxhdGUgYW5kIHN0eWxlcwogICAgLy8gdG8gYmUgcmV0YWluZWQgYXMgd2VsbC4gVGhlIE1EQyBtZW51IGFsc28gaGFzIHRvIHByb3ZpZGUgaXRzZWxmIGFzIGEgYE1hdE1lbnVgIGluIG9yZGVyIGZvcgogICAgLy8gcXVlcmllcyBhbmQgREkgdG8gd29yayBjb3JyZWN0bHksIHdoaWxlIHN0aWxsIG5vdCByZWZlcmVuY2luZyB0aGUgYWN0dWFsIG1lbnUgY2xhc3MuCiAgICAvLyBDbGFzcyByZXNwb25zaWJpbGl0eSBpcyBzcGxpdCB1cCBhcyBmb2xsb3dzOgogICAgLy8gKiBfTWF0TWVudUJhc2UgLSBwcm92aWRlcyBhbGwgdGhlIGZ1bmN0aW9uYWxpdHkgd2l0aG91dCBhbnkgb2YgdGhlIEFuZ3VsYXIgbWV0YWRhdGEuCiAgICAvLyAqIE1hdE1lbnUgLSBrZWVwcyB0aGUgc2FtZSBuYW1lIHN5bWJvbCBuYW1lIGFzIHRoZSBjdXJyZW50IG1lbnUgYW5kCiAgICAvLyBpcyB1c2VkIGFzIGEgcHJvdmlkZXIgZm9yIERJIGFuZCBxdWVyeSBwdXJwb3Nlcy4KICAgIC8vICogX01hdE1lbnUgLSB0aGUgYWN0dWFsIG1lbnUgY29tcG9uZW50IGltcGxlbWVudGF0aW9uIHdpdGggdGhlIEFuZ3VsYXIgbWV0YWRhdGEgdGhhdCBzaG91bGQKICAgIC8vIGJlIHRyZWUgc2hha2VuIGF3YXkgZm9yIE1EQy4KICAgIC8qKgogICAgICogXEBkb2NzLXB1YmxpYyBNYXRNZW51CiAgICAgKi8KICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpjbGFzcy1uYW1lCiAgICBjbGFzcyBfTWF0TWVudSBleHRlbmRzIE1hdE1lbnUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWZhdWx0T3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIG5nWm9uZSwgZGVmYXVsdE9wdGlvbnMpIHsKICAgICAgICAgICAgc3VwZXIoZWxlbWVudFJlZiwgbmdab25lLCBkZWZhdWx0T3B0aW9ucyk7CiAgICAgICAgfQogICAgfQogICAgX01hdE1lbnUuybVmYWMgPSBmdW5jdGlvbiBfTWF0TWVudV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0TWVudSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9NRU5VX0RFRkFVTFRfT1BUSU9OUykpOyB9OwogICAgX01hdE1lbnUuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogX01hdE1lbnUsIHNlbGVjdG9yczogW1sibWF0LW1lbnUiXV0sIGV4cG9ydEFzOiBbIm1hdE1lbnUiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IE1BVF9NRU5VX1BBTkVMLCB1c2VFeGlzdGluZzogTWF0TWVudSB9LAogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNYXRNZW51LCB1c2VFeGlzdGluZzogX01hdE1lbnUgfQogICAgICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJGIsIGRlY2xzOiAxLCB2YXJzOiAwLCBjb25zdHM6IFtbInRhYmluZGV4IiwgIi0xIiwgInJvbGUiLCAibWVudSIsIDEsICJtYXQtbWVudS1wYW5lbCIsIDMsICJpZCIsICJuZ0NsYXNzIiwgImtleWRvd24iLCAiY2xpY2siXSwgWzEsICJtYXQtbWVudS1jb250ZW50Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gX01hdE1lbnVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgwLCBfTWF0TWVudV9uZ190ZW1wbGF0ZV8wX1RlbXBsYXRlLCAzLCA2LCAibmctdGVtcGxhdGUiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0NsYXNzXSwgc3R5bGVzOiBbIi5tYXQtbWVudS1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7bWF4LWhlaWdodDpjYWxjKDEwMHZoIC0gNDhweCk7Ym9yZGVyLXJhZGl1czo0cHg7b3V0bGluZTowO21pbi1oZWlnaHQ6NjRweH0ubWF0LW1lbnUtcGFuZWwubmctYW5pbWF0aW5ne3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9Lm1hdC1tZW51LWNvbnRlbnQ6bm90KDplbXB0eSl7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LW1lbnUtaXRlbXstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7Y3Vyc29yOnBvaW50ZXI7b3V0bGluZTpub25lO2JvcmRlcjpub25lOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztsaW5lLWhlaWdodDo0OHB4O2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O3RleHQtYWxpZ246bGVmdDt0ZXh0LWRlY29yYXRpb246bm9uZTttYXgtd2lkdGg6MTAwJTtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LW1lbnUtaXRlbTo6LW1vei1mb2N1cy1pbm5lcntib3JkZXI6MH0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF17Y3Vyc29yOmRlZmF1bHR9W2Rpcj1ydGxdIC5tYXQtbWVudS1pdGVte3RleHQtYWxpZ246cmlnaHR9Lm1hdC1tZW51LWl0ZW0gLm1hdC1pY29ue21hcmdpbi1yaWdodDoxNnB4O3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24gc3Zne3ZlcnRpY2FsLWFsaWduOnRvcH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0gLm1hdC1pY29ue21hcmdpbi1sZWZ0OjE2cHg7bWFyZ2luLXJpZ2h0OjB9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRde3BvaW50ZXItZXZlbnRzOm5vbmV9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWQsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZHtvdXRsaW5lOmRvdHRlZCAxcHh9Lm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MzJweH0ubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXI6OmFmdGVye3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkO2JvcmRlci13aWR0aDo1cHggMCA1cHggNXB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCB0cmFuc3BhcmVudCB0cmFuc3BhcmVudCBjdXJyZW50Q29sb3I7Y29udGVudDpcIlwiO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3Bvc2l0aW9uOmFic29sdXRlO3RvcDo1MCU7cmlnaHQ6MTZweDt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtNTAlKX1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2Vye3BhZGRpbmctcmlnaHQ6MTZweDtwYWRkaW5nLWxlZnQ6MzJweH1bZGlyPXJ0bF0gLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntyaWdodDphdXRvO2xlZnQ6MTZweDt0cmFuc2Zvcm06cm90YXRlWSgxODBkZWcpIHRyYW5zbGF0ZVkoLTUwJSl9YnV0dG9uLm1hdC1tZW51LWl0ZW17d2lkdGg6MTAwJX0ubWF0LW1lbnUtaXRlbSAubWF0LW1lbnUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgZGF0YTogeyBhbmltYXRpb246IFsKICAgICAgICAgICAgICAgIG1hdE1lbnVBbmltYXRpb25zLnRyYW5zZm9ybU1lbnUsCiAgICAgICAgICAgICAgICBtYXRNZW51QW5pbWF0aW9ucy5mYWRlSW5JdGVtcwogICAgICAgICAgICBdIH0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgX01hdE1lbnUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBOZ1pvbmUgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX01FTlVfREVGQVVMVF9PUFRJT05TLF0gfV0gfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9tZW51L21lbnUtdHJpZ2dlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSB0aGUgbWVudSBpcyBvcGVuLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9NRU5VX1NDUk9MTF9TVFJBVEVHWSA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LW1lbnUtc2Nyb2xsLXN0cmF0ZWd5Jyk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIE1BVF9NRU5VX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZKG92ZXJsYXkpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oKSk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX01FTlVfU0NST0xMX1NUUkFURUdZX0ZBQ1RPUllfUFJPVklERVIgPSB7CiAgICAgICAgcHJvdmlkZTogTUFUX01FTlVfU0NST0xMX1NUUkFURUdZLAogICAgICAgIGRlcHM6IFtPdmVybGF5XSwKICAgICAgICB1c2VGYWN0b3J5OiBNQVRfTUVOVV9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWSwKICAgIH07CiAgICAvKioKICAgICAqIERlZmF1bHQgdG9wIHBhZGRpbmcgb2YgdGhlIG1lbnUgcGFuZWwuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUVOVV9QQU5FTF9UT1BfUEFERElORyA9IDg7CiAgICAvKioKICAgICAqIE9wdGlvbnMgZm9yIGJpbmRpbmcgYSBwYXNzaXZlIGV2ZW50IGxpc3RlbmVyLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucyQxID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSk7CiAgICAvLyBUT0RPKGFuZHJld3NlZ3Vpbik6IFJlbW92ZSB0aGUga2ViYWIgdmVyc2lvbnMgaW4gZmF2b3Igb2YgY2FtZWxDYXNlZCBhdHRyaWJ1dGUgc2VsZWN0b3JzCiAgICAvKioKICAgICAqIERpcmVjdGl2ZSBhcHBsaWVkIHRvIGFuIGVsZW1lbnQgdGhhdCBzaG91bGQgdHJpZ2dlciBhIGBtYXQtbWVudWAuCiAgICAgKi8KICAgIGNsYXNzIE1hdE1lbnVUcmlnZ2VyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9vdmVybGF5CiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gX3ZpZXdDb250YWluZXJSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbFN0cmF0ZWd5CiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50TWVudQogICAgICAgICAqIEBwYXJhbSB7P30gX21lbnVJdGVtSW5zdGFuY2UKICAgICAgICAgKiBAcGFyYW0gez99IF9kaXIKICAgICAgICAgKiBAcGFyYW0gez89fSBfZm9jdXNNb25pdG9yCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX292ZXJsYXksIF9lbGVtZW50LCBfdmlld0NvbnRhaW5lclJlZiwgc2Nyb2xsU3RyYXRlZ3ksIF9wYXJlbnRNZW51LCBfbWVudUl0ZW1JbnN0YW5jZSwgX2RpciwgX2ZvY3VzTW9uaXRvcikgewogICAgICAgICAgICB0aGlzLl9vdmVybGF5ID0gX292ZXJsYXk7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQgPSBfZWxlbWVudDsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICB0aGlzLl9wYXJlbnRNZW51ID0gX3BhcmVudE1lbnU7CiAgICAgICAgICAgIHRoaXMuX21lbnVJdGVtSW5zdGFuY2UgPSBfbWVudUl0ZW1JbnN0YW5jZTsKICAgICAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuX21lbnVPcGVuID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICB0aGlzLl9ob3ZlclN1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGFuZGxlcyB0b3VjaCBzdGFydCBldmVudHMgb24gdGhlIHRyaWdnZXIuCiAgICAgICAgICAgICAqIE5lZWRzIHRvIGJlIGFuIGFycm93IGZ1bmN0aW9uIHNvIHdlIGNhbiBlYXNpbHkgdXNlIGFkZEV2ZW50TGlzdGVuZXIgYW5kIHJlbW92ZUV2ZW50TGlzdGVuZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0ID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fb3BlbmVkQnkgPSAndG91Y2gnKTsKICAgICAgICAgICAgLy8gVHJhY2tpbmcgaW5wdXQgdHlwZSBpcyBuZWNlc3Nhcnkgc28gaXQncyBwb3NzaWJsZSB0byBvbmx5IGF1dG8tZm9jdXMKICAgICAgICAgICAgLy8gdGhlIGZpcnN0IGl0ZW0gb2YgdGhlIGxpc3Qgd2hlbiB0aGUgbWVudSBpcyBvcGVuZWQgdmlhIHRoZSBrZXlib2FyZAogICAgICAgICAgICB0aGlzLl9vcGVuZWRCeSA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIGZvY3VzIHNob3VsZCBiZSByZXN0b3JlZCB3aGVuIHRoZSBtZW51IGlzIGNsb3NlZC4KICAgICAgICAgICAgICogTm90ZSB0aGF0IGRpc2FibGluZyB0aGlzIG9wdGlvbiBjYW4gaGF2ZSBhY2Nlc3NpYmlsaXR5IGltcGxpY2F0aW9ucwogICAgICAgICAgICAgKiBhbmQgaXQncyB1cCB0byB5b3UgdG8gbWFuYWdlIGZvY3VzLCBpZiB5b3UgZGVjaWRlIHRvIHR1cm4gaXQgb2ZmLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5yZXN0b3JlRm9jdXMgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIG1lbnUgaXMgb3BlbmVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5tZW51T3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBhc3NvY2lhdGVkIG1lbnUgaXMgb3BlbmVkLgogICAgICAgICAgICAgKiBAZGVwcmVjYXRlZCBTd2l0Y2ggdG8gYG1lbnVPcGVuZWRgIGluc3RlYWQKICAgICAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtb24tcHJlZml4CiAgICAgICAgICAgIHRoaXMub25NZW51T3BlbiA9IHRoaXMubWVudU9wZW5lZDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBtZW51IGlzIGNsb3NlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubWVudUNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgYXNzb2NpYXRlZCBtZW51IGlzIGNsb3NlZC4KICAgICAgICAgICAgICogQGRlcHJlY2F0ZWQgU3dpdGNoIHRvIGBtZW51Q2xvc2VkYCBpbnN0ZWFkCiAgICAgICAgICAgICAqIFxAYnJlYWtpbmctY2hhbmdlIDguMC4wCiAgICAgICAgICAgICAqLwogICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tb3V0cHV0LW9uLXByZWZpeAogICAgICAgICAgICB0aGlzLm9uTWVudUNsb3NlID0gdGhpcy5tZW51Q2xvc2VkOwogICAgICAgICAgICBfZWxlbWVudC5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLl9oYW5kbGVUb3VjaFN0YXJ0LCBwYXNzaXZlRXZlbnRMaXN0ZW5lck9wdGlvbnMkMSk7CiAgICAgICAgICAgIGlmIChfbWVudUl0ZW1JbnN0YW5jZSkgewogICAgICAgICAgICAgICAgX21lbnVJdGVtSW5zdGFuY2UuX3RyaWdnZXJzU3VibWVudSA9IHRoaXMudHJpZ2dlcnNTdWJtZW51KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kgPSBzY3JvbGxTdHJhdGVneTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQKICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF9kZXByZWNhdGVkTWF0TWVudVRyaWdnZXJGb3IoKSB7IHJldHVybiB0aGlzLm1lbnU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yKHYpIHsKICAgICAgICAgICAgdGhpcy5tZW51ID0gdjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVmZXJlbmNlcyB0aGUgbWVudSBpbnN0YW5jZSB0aGF0IHRoZSB0cmlnZ2VyIGlzIGFzc29jaWF0ZWQgd2l0aC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtZW51KCkgeyByZXR1cm4gdGhpcy5fbWVudTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWVudQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG1lbnUobWVudSkgewogICAgICAgICAgICBpZiAobWVudSA9PT0gdGhpcy5fbWVudSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX21lbnUgPSBtZW51OwogICAgICAgICAgICB0aGlzLl9tZW51Q2xvc2VTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgaWYgKG1lbnUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX21lbnVDbG9zZVN1YnNjcmlwdGlvbiA9IG1lbnUuY2xvc2UuYXNPYnNlcnZhYmxlKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVhc29uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICByZWFzb24gPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3lNZW51KCk7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYSBjbGljayBjbG9zZWQgdGhlIG1lbnUsIHdlIHNob3VsZCBjbG9zZSB0aGUgZW50aXJlIGNoYWluIG9mIG5lc3RlZCBtZW51cy4KICAgICAgICAgICAgICAgICAgICBpZiAoKHJlYXNvbiA9PT0gJ2NsaWNrJyB8fCByZWFzb24gPT09ICd0YWInKSAmJiB0aGlzLl9wYXJlbnRNZW51KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3BhcmVudE1lbnUuY2xvc2VkLmVtaXQocmVhc29uKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrTWVudSgpOwogICAgICAgICAgICB0aGlzLl9oYW5kbGVIb3ZlcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMuX2hhbmRsZVRvdWNoU3RhcnQsIHBhc3NpdmVFdmVudExpc3RlbmVyT3B0aW9ucyQxKTsKICAgICAgICAgICAgdGhpcy5fbWVudUNsb3NlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIG1lbnUgaXMgb3Blbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtZW51T3BlbigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21lbnVPcGVuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgdGV4dCBkaXJlY3Rpb24gb2YgdGhlIGNvbnRhaW5pbmcgYXBwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpcigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RpciAmJiB0aGlzLl9kaXIudmFsdWUgPT09ICdydGwnID8gJ3J0bCcgOiAnbHRyJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgbWVudSB0cmlnZ2VycyBhIHN1Yi1tZW51IG9yIGEgdG9wLWxldmVsIG9uZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyaWdnZXJzU3VibWVudSgpIHsKICAgICAgICAgICAgcmV0dXJuICEhKHRoaXMuX21lbnVJdGVtSW5zdGFuY2UgJiYgdGhpcy5fcGFyZW50TWVudSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRvZ2dsZXMgdGhlIG1lbnUgYmV0d2VlbiB0aGUgb3BlbiBhbmQgY2xvc2VkIHN0YXRlcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvZ2dsZU1lbnUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tZW51T3BlbiA/IHRoaXMuY2xvc2VNZW51KCkgOiB0aGlzLm9wZW5NZW51KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE9wZW5zIHRoZSBtZW51LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3Blbk1lbnUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9tZW51T3BlbikgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2NoZWNrTWVudSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3ZlcmxheUNvbmZpZyA9IG92ZXJsYXlSZWYuZ2V0Q29uZmlnKCk7CiAgICAgICAgICAgIHRoaXMuX3NldFBvc2l0aW9uKCgvKiogQHR5cGUgez99ICovIChvdmVybGF5Q29uZmlnLnBvc2l0aW9uU3RyYXRlZ3kpKSk7CiAgICAgICAgICAgIG92ZXJsYXlDb25maWcuaGFzQmFja2Ryb3AgPSB0aGlzLm1lbnUuaGFzQmFja2Ryb3AgPT0gbnVsbCA/ICF0aGlzLnRyaWdnZXJzU3VibWVudSgpIDoKICAgICAgICAgICAgICAgIHRoaXMubWVudS5oYXNCYWNrZHJvcDsKICAgICAgICAgICAgb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fZ2V0UG9ydGFsKCkpOwogICAgICAgICAgICBpZiAodGhpcy5tZW51LmxhenlDb250ZW50KSB7CiAgICAgICAgICAgICAgICB0aGlzLm1lbnUubGF6eUNvbnRlbnQuYXR0YWNoKHRoaXMubWVudURhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uID0gdGhpcy5fbWVudUNsb3NpbmdBY3Rpb25zKCkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuY2xvc2VNZW51KCkpKTsKICAgICAgICAgICAgdGhpcy5faW5pdE1lbnUoKTsKICAgICAgICAgICAgaWYgKHRoaXMubWVudSBpbnN0YW5jZW9mIE1hdE1lbnUpIHsKICAgICAgICAgICAgICAgIHRoaXMubWVudS5fc3RhcnRBbmltYXRpb24oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbG9zZXMgdGhlIG1lbnUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbG9zZU1lbnUoKSB7CiAgICAgICAgICAgIHRoaXMubWVudS5jbG9zZS5lbWl0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZvY3VzZXMgdGhlIG1lbnUgdHJpZ2dlci4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcmlnaW4gU291cmNlIG9mIHRoZSBtZW51IHRyaWdnZXIncyBmb2N1cy4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb2N1cyhvcmlnaW4gPSAncHJvZ3JhbScsIG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2ZvY3VzTW9uaXRvcikgewogICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLmZvY3VzVmlhKHRoaXMuX2VsZW1lbnQsIG9yaWdpbiwgb3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMob3B0aW9ucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xvc2VzIHRoZSBtZW51IGFuZCBkb2VzIHRoZSBuZWNlc3NhcnkgY2xlYW51cC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Rlc3Ryb3lNZW51KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYgfHwgIXRoaXMubWVudU9wZW4pIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1lbnUgPSB0aGlzLm1lbnU7CiAgICAgICAgICAgIHRoaXMuX2Nsb3NpbmdBY3Rpb25zU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGV0YWNoKCk7CiAgICAgICAgICAgIHRoaXMuX3Jlc3RvcmVGb2N1cygpOwogICAgICAgICAgICBpZiAobWVudSBpbnN0YW5jZW9mIE1hdE1lbnUpIHsKICAgICAgICAgICAgICAgIG1lbnUuX3Jlc2V0QW5pbWF0aW9uKCk7CiAgICAgICAgICAgICAgICBpZiAobWVudS5sYXp5Q29udGVudCkgewogICAgICAgICAgICAgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBleGl0IGFuaW1hdGlvbiB0byBmaW5pc2ggYmVmb3JlIGRldGFjaGluZyB0aGUgY29udGVudC4KICAgICAgICAgICAgICAgICAgICBtZW51Ll9hbmltYXRpb25Eb25lCiAgICAgICAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgZXZlbnQgPT4gZXZlbnQudG9TdGF0ZSA9PT0gJ3ZvaWQnKSksIHRha2UoMSksIAogICAgICAgICAgICAgICAgICAgIC8vIEludGVycnVwdCBpZiB0aGUgY29udGVudCBnb3QgcmUtYXR0YWNoZWQuCiAgICAgICAgICAgICAgICAgICAgdGFrZVVudGlsKG1lbnUubGF6eUNvbnRlbnQuX2F0dGFjaGVkKSkKICAgICAgICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSh7CiAgICAgICAgICAgICAgICAgICAgICAgIG5leHQ6ICgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+ICgvKiogQHR5cGUgez99ICovIChtZW51LmxhenlDb250ZW50KSkuZGV0YWNoKCkpLAogICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBtYXR0ZXIgd2hldGhlciB0aGUgY29udGVudCBnb3QgcmUtYXR0YWNoZWQsIHJlc2V0IHRoZSBtZW51LgogICAgICAgICAgICAgICAgICAgICAgICBjb21wbGV0ZTogKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fc2V0SXNNZW51T3BlbihmYWxzZSkpCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRJc01lbnVPcGVuKGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NldElzTWVudU9wZW4oZmFsc2UpOwogICAgICAgICAgICAgICAgaWYgKG1lbnUubGF6eUNvbnRlbnQpIHsKICAgICAgICAgICAgICAgICAgICBtZW51LmxhenlDb250ZW50LmRldGFjaCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIHNldHMgdGhlIG1lbnUgc3RhdGUgdG8gb3BlbiBhbmQgZm9jdXNlcyB0aGUgZmlyc3QgaXRlbSBpZgogICAgICAgICAqIHRoZSBtZW51IHdhcyBvcGVuZWQgdmlhIHRoZSBrZXlib2FyZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2luaXRNZW51KCkgewogICAgICAgICAgICB0aGlzLm1lbnUucGFyZW50TWVudSA9IHRoaXMudHJpZ2dlcnNTdWJtZW51KCkgPyB0aGlzLl9wYXJlbnRNZW51IDogdW5kZWZpbmVkOwogICAgICAgICAgICB0aGlzLm1lbnUuZGlyZWN0aW9uID0gdGhpcy5kaXI7CiAgICAgICAgICAgIHRoaXMuX3NldE1lbnVFbGV2YXRpb24oKTsKICAgICAgICAgICAgdGhpcy5fc2V0SXNNZW51T3Blbih0cnVlKTsKICAgICAgICAgICAgdGhpcy5tZW51LmZvY3VzRmlyc3RJdGVtKHRoaXMuX29wZW5lZEJ5IHx8ICdwcm9ncmFtJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIG1lbnUgZWxldmF0aW9uIGJhc2VkIG9uIHRoZSBhbW91bnQgb2YgcGFyZW50IG1lbnVzIHRoYXQgaXQgaGFzLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0TWVudUVsZXZhdGlvbigpIHsKICAgICAgICAgICAgaWYgKHRoaXMubWVudS5zZXRFbGV2YXRpb24pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IDA7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgcGFyZW50TWVudSA9IHRoaXMubWVudS5wYXJlbnRNZW51OwogICAgICAgICAgICAgICAgd2hpbGUgKHBhcmVudE1lbnUpIHsKICAgICAgICAgICAgICAgICAgICBkZXB0aCsrOwogICAgICAgICAgICAgICAgICAgIHBhcmVudE1lbnUgPSBwYXJlbnRNZW51LnBhcmVudE1lbnU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLm1lbnUuc2V0RWxldmF0aW9uKGRlcHRoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXN0b3JlcyBmb2N1cyB0byB0aGUgZWxlbWVudCB0aGF0IHdhcyBmb2N1c2VkIGJlZm9yZSB0aGUgbWVudSB3YXMgb3Blbi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Jlc3RvcmVGb2N1cygpIHsKICAgICAgICAgICAgLy8gV2Ugc2hvdWxkIHJlc2V0IGZvY3VzIGlmIHRoZSB1c2VyIGlzIG5hdmlnYXRpbmcgdXNpbmcgYSBrZXlib2FyZCBvcgogICAgICAgICAgICAvLyBpZiB3ZSBoYXZlIGEgdG9wLWxldmVsIHRyaWdnZXIgd2hpY2ggbWlnaHQgY2F1c2UgZm9jdXMgdG8gYmUgbG9zdAogICAgICAgICAgICAvLyB3aGVuIGNsaWNraW5nIG9uIHRoZSBiYWNrZHJvcC4KICAgICAgICAgICAgaWYgKHRoaXMucmVzdG9yZUZvY3VzKSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX29wZW5lZEJ5KSB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBmb2N1cyBzdHlsZSB3aWxsIHNob3cgdXAgYm90aCBmb3IgYHByb2dyYW1gIGFuZAogICAgICAgICAgICAgICAgICAgIC8vIGBrZXlib2FyZGAgc28gd2UgZG9uJ3QgaGF2ZSB0byBzcGVjaWZ5IHdoaWNoIG9uZSBpdCBpcy4KICAgICAgICAgICAgICAgICAgICB0aGlzLmZvY3VzKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICghdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZm9jdXModGhpcy5fb3BlbmVkQnkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX29wZW5lZEJ5ID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgLy8gc2V0IHN0YXRlIHJhdGhlciB0aGFuIHRvZ2dsZSB0byBzdXBwb3J0IHRyaWdnZXJzIHNoYXJpbmcgYSBtZW51CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGlzT3BlbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldElzTWVudU9wZW4oaXNPcGVuKSB7CiAgICAgICAgICAgIHRoaXMuX21lbnVPcGVuID0gaXNPcGVuOwogICAgICAgICAgICB0aGlzLl9tZW51T3BlbiA/IHRoaXMubWVudU9wZW5lZC5lbWl0KCkgOiB0aGlzLm1lbnVDbG9zZWQuZW1pdCgpOwogICAgICAgICAgICBpZiAodGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSkgewogICAgICAgICAgICAgICAgdGhpcy5fbWVudUl0ZW1JbnN0YW5jZS5faGlnaGxpZ2h0ZWQgPSBpc09wZW47CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgY2hlY2tzIHRoYXQgYSB2YWxpZCBpbnN0YW5jZSBvZiBNYXRNZW51IGhhcyBiZWVuIHBhc3NlZCBpbnRvCiAgICAgICAgICogbWF0TWVudVRyaWdnZXJGb3IuIElmIG5vdCwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrTWVudSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm1lbnUpIHsKICAgICAgICAgICAgICAgIHRocm93TWF0TWVudU1pc3NpbmdFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNyZWF0ZXMgdGhlIG92ZXJsYXkgZnJvbSB0aGUgcHJvdmlkZWQgbWVudSdzIHRlbXBsYXRlIGFuZCBzYXZlcyBpdHMKICAgICAgICAgKiBPdmVybGF5UmVmIHNvIHRoYXQgaXQgY2FuIGJlIGF0dGFjaGVkIHRvIHRoZSBET00gd2hlbiBvcGVuTWVudSBpcyBjYWxsZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jcmVhdGVPdmVybGF5KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbmZpZyA9IHRoaXMuX2dldE92ZXJsYXlDb25maWcoKTsKICAgICAgICAgICAgICAgIHRoaXMuX3N1YnNjcmliZVRvUG9zaXRpb25zKCgvKiogQHR5cGUgez99ICovIChjb25maWcucG9zaXRpb25TdHJhdGVneSkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZShjb25maWcpOwogICAgICAgICAgICAgICAgLy8gQ29uc3VtZSB0aGUgYGtleWRvd25FdmVudHNgIGluIG9yZGVyIHRvIHByZXZlbnQgdGhlbSBmcm9tIGdvaW5nIHRvIGFub3RoZXIgb3ZlcmxheS4KICAgICAgICAgICAgICAgIC8vIElkZWFsbHkgd2UnZCBhbHNvIGhhdmUgb3VyIGtleWJvYXJkIGV2ZW50IGxvZ2ljIGluIGhlcmUsIGhvd2V2ZXIgZG9pbmcgc28gd2lsbAogICAgICAgICAgICAgICAgLy8gYnJlYWsgYW55Ym9keSB0aGF0IG1heSBoYXZlIGltcGxlbWVudGVkIHRoZSBgTWF0TWVudVBhbmVsYCB0aGVtc2VsdmVzLgogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5rZXlkb3duRXZlbnRzKCkuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGJ1aWxkcyB0aGUgY29uZmlndXJhdGlvbiBvYmplY3QgbmVlZGVkIHRvIGNyZWF0ZSB0aGUgb3ZlcmxheSwgdGhlIE92ZXJsYXlTdGF0ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99IE92ZXJsYXlDb25maWcKICAgICAgICAgKi8KICAgICAgICBfZ2V0T3ZlcmxheUNvbmZpZygpIHsKICAgICAgICAgICAgcmV0dXJuIG5ldyBPdmVybGF5Q29uZmlnKHsKICAgICAgICAgICAgICAgIHBvc2l0aW9uU3RyYXRlZ3k6IHRoaXMuX292ZXJsYXkucG9zaXRpb24oKQogICAgICAgICAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2VsZW1lbnQpCiAgICAgICAgICAgICAgICAgICAgLndpdGhMb2NrZWRQb3NpdGlvbigpCiAgICAgICAgICAgICAgICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLm1hdC1tZW51LXBhbmVsLCAubWF0LW1kYy1tZW51LXBhbmVsJyksCiAgICAgICAgICAgICAgICBiYWNrZHJvcENsYXNzOiB0aGlzLm1lbnUuYmFja2Ryb3BDbGFzcyB8fCAnY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AnLAogICAgICAgICAgICAgICAgc2Nyb2xsU3RyYXRlZ3k6IHRoaXMuX3Njcm9sbFN0cmF0ZWd5KCksCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuX2RpcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTGlzdGVucyB0byBjaGFuZ2VzIGluIHRoZSBwb3NpdGlvbiBvZiB0aGUgb3ZlcmxheSBhbmQgc2V0cyB0aGUgY29ycmVjdCBjbGFzc2VzCiAgICAgICAgICogb24gdGhlIG1lbnUgYmFzZWQgb24gdGhlIG5ldyBwb3NpdGlvbi4gVGhpcyBlbnN1cmVzIHRoZSBhbmltYXRpb24gb3JpZ2luIGlzIGFsd2F5cwogICAgICAgICAqIGNvcnJlY3QsIGV2ZW4gaWYgYSBmYWxsYmFjayBwb3NpdGlvbiBpcyB1c2VkIGZvciB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zdWJzY3JpYmVUb1Bvc2l0aW9ucyhwb3NpdGlvbikgewogICAgICAgICAgICBpZiAodGhpcy5tZW51LnNldFBvc2l0aW9uQ2xhc3NlcykgewogICAgICAgICAgICAgICAgcG9zaXRpb24ucG9zaXRpb25DaGFuZ2VzLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2hhbmdlID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zWCA9IGNoYW5nZS5jb25uZWN0aW9uUGFpci5vdmVybGF5WCA9PT0gJ3N0YXJ0JyA/ICdhZnRlcicgOiAnYmVmb3JlJzsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgcG9zWSA9IGNoYW5nZS5jb25uZWN0aW9uUGFpci5vdmVybGF5WSA9PT0gJ3RvcCcgPyAnYmVsb3cnIDogJ2Fib3ZlJzsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5tZW51LnNldFBvc2l0aW9uQ2xhc3NlcykpKHBvc1gsIHBvc1kpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGFwcHJvcHJpYXRlIHBvc2l0aW9ucyBvbiBhIHBvc2l0aW9uIHN0cmF0ZWd5CiAgICAgICAgICogc28gdGhlIG92ZXJsYXkgY29ubmVjdHMgd2l0aCB0aGUgdHJpZ2dlciBjb3JyZWN0bHkuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uU3RyYXRlZ3kgU3RyYXRlZ3kgd2hvc2UgcG9zaXRpb24gdG8gdXBkYXRlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFBvc2l0aW9uKHBvc2l0aW9uU3RyYXRlZ3kpIHsKICAgICAgICAgICAgbGV0IFtvcmlnaW5YLCBvcmlnaW5GYWxsYmFja1hdID0gdGhpcy5tZW51LnhQb3NpdGlvbiA9PT0gJ2JlZm9yZScgPyBbJ2VuZCcsICdzdGFydCddIDogWydzdGFydCcsICdlbmQnXTsKICAgICAgICAgICAgbGV0IFtvdmVybGF5WSwgb3ZlcmxheUZhbGxiYWNrWV0gPSB0aGlzLm1lbnUueVBvc2l0aW9uID09PSAnYWJvdmUnID8gWydib3R0b20nLCAndG9wJ10gOiBbJ3RvcCcsICdib3R0b20nXTsKICAgICAgICAgICAgbGV0IFtvcmlnaW5ZLCBvcmlnaW5GYWxsYmFja1ldID0gW292ZXJsYXlZLCBvdmVybGF5RmFsbGJhY2tZXTsKICAgICAgICAgICAgbGV0IFtvdmVybGF5WCwgb3ZlcmxheUZhbGxiYWNrWF0gPSBbb3JpZ2luWCwgb3JpZ2luRmFsbGJhY2tYXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb2Zmc2V0WSA9IDA7CiAgICAgICAgICAgIGlmICh0aGlzLnRyaWdnZXJzU3VibWVudSgpKSB7CiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBtZW51IGlzIGEgc3ViLW1lbnUsIGl0IHNob3VsZCBhbHdheXMgYWxpZ24gaXRzZWxmCiAgICAgICAgICAgICAgICAvLyB0byB0aGUgZWRnZXMgb2YgdGhlIHRyaWdnZXIsIGluc3RlYWQgb2Ygb3ZlcmxhcHBpbmcgaXQuCiAgICAgICAgICAgICAgICBvdmVybGF5RmFsbGJhY2tYID0gb3JpZ2luWCA9IHRoaXMubWVudS54UG9zaXRpb24gPT09ICdiZWZvcmUnID8gJ3N0YXJ0JyA6ICdlbmQnOwogICAgICAgICAgICAgICAgb3JpZ2luRmFsbGJhY2tYID0gb3ZlcmxheVggPSBvcmlnaW5YID09PSAnZW5kJyA/ICdzdGFydCcgOiAnZW5kJzsKICAgICAgICAgICAgICAgIG9mZnNldFkgPSBvdmVybGF5WSA9PT0gJ2JvdHRvbScgPyBNRU5VX1BBTkVMX1RPUF9QQURESU5HIDogLU1FTlVfUEFORUxfVE9QX1BBRERJTkc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMubWVudS5vdmVybGFwVHJpZ2dlcikgewogICAgICAgICAgICAgICAgb3JpZ2luWSA9IG92ZXJsYXlZID09PSAndG9wJyA/ICdib3R0b20nIDogJ3RvcCc7CiAgICAgICAgICAgICAgICBvcmlnaW5GYWxsYmFja1kgPSBvdmVybGF5RmFsbGJhY2tZID09PSAndG9wJyA/ICdib3R0b20nIDogJ3RvcCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneS53aXRoUG9zaXRpb25zKFsKICAgICAgICAgICAgICAgIHsgb3JpZ2luWCwgb3JpZ2luWSwgb3ZlcmxheVgsIG92ZXJsYXlZLCBvZmZzZXRZIH0sCiAgICAgICAgICAgICAgICB7IG9yaWdpblg6IG9yaWdpbkZhbGxiYWNrWCwgb3JpZ2luWSwgb3ZlcmxheVg6IG92ZXJsYXlGYWxsYmFja1gsIG92ZXJsYXlZLCBvZmZzZXRZIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWCwKICAgICAgICAgICAgICAgICAgICBvcmlnaW5ZOiBvcmlnaW5GYWxsYmFja1ksCiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVgsCiAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVk6IG92ZXJsYXlGYWxsYmFja1ksCiAgICAgICAgICAgICAgICAgICAgb2Zmc2V0WTogLW9mZnNldFkKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgb3JpZ2luWDogb3JpZ2luRmFsbGJhY2tYLAogICAgICAgICAgICAgICAgICAgIG9yaWdpblk6IG9yaWdpbkZhbGxiYWNrWSwKICAgICAgICAgICAgICAgICAgICBvdmVybGF5WDogb3ZlcmxheUZhbGxiYWNrWCwKICAgICAgICAgICAgICAgICAgICBvdmVybGF5WTogb3ZlcmxheUZhbGxiYWNrWSwKICAgICAgICAgICAgICAgICAgICBvZmZzZXRZOiAtb2Zmc2V0WQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyBhIHN0cmVhbSB0aGF0IGVtaXRzIHdoZW5ldmVyIGFuIGFjdGlvbiB0aGF0IHNob3VsZCBjbG9zZSB0aGUgbWVudSBvY2N1cnMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9tZW51Q2xvc2luZ0FjdGlvbnMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmFja2Ryb3AgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb3ZlcmxheVJlZikpLmJhY2tkcm9wQ2xpY2soKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkZXRhY2htZW50cyA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9vdmVybGF5UmVmKSkuZGV0YWNobWVudHMoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnRDbG9zZSA9IHRoaXMuX3BhcmVudE1lbnUgPyB0aGlzLl9wYXJlbnRNZW51LmNsb3NlZCA6IG9mKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaG92ZXIgPSB0aGlzLl9wYXJlbnRNZW51ID8gdGhpcy5fcGFyZW50TWVudS5faG92ZXJlZCgpLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3RpdmUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFjdGl2ZSA9PiBhY3RpdmUgIT09IHRoaXMuX21lbnVJdGVtSW5zdGFuY2UpKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX21lbnVPcGVuKSkpIDogb2YoKTsKICAgICAgICAgICAgcmV0dXJuIG1lcmdlKGJhY2tkcm9wLCBwYXJlbnRDbG9zZSwgaG92ZXIsIGRldGFjaG1lbnRzKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlcyBtb3VzZSBwcmVzc2VzIG9uIHRoZSB0cmlnZ2VyLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVNb3VzZWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKCFpc0Zha2VNb3VzZWRvd25Gcm9tU2NyZWVuUmVhZGVyKGV2ZW50KSkgewogICAgICAgICAgICAgICAgLy8gU2luY2UgcmlnaHQgb3IgbWlkZGxlIGJ1dHRvbiBjbGlja3Mgd29uJ3QgdHJpZ2dlciB0aGUgYGNsaWNrYCBldmVudCwKICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZG4ndCBjb25zaWRlciB0aGUgbWVudSBhcyBvcGVuZWQgYnkgbW91c2UgaW4gdGhvc2UgY2FzZXMuCiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuZWRCeSA9IGV2ZW50LmJ1dHRvbiA9PT0gMCA/ICdtb3VzZScgOiBudWxsOwogICAgICAgICAgICAgICAgLy8gU2luY2UgY2xpY2tpbmcgb24gdGhlIHRyaWdnZXIgd29uJ3QgY2xvc2UgdGhlIG1lbnUgaWYgaXQgb3BlbnMgYSBzdWItbWVudSwKICAgICAgICAgICAgICAgIC8vIHdlIHNob3VsZCBwcmV2ZW50IGZvY3VzIGZyb20gbW92aW5nIG9udG8gaXQgdmlhIGNsaWNrIHRvIGF2b2lkIHRoZQogICAgICAgICAgICAgICAgLy8gaGlnaGxpZ2h0IGZyb20gbGluZ2VyaW5nIG9uIHRoZSBtZW51IGl0ZW0uCiAgICAgICAgICAgICAgICBpZiAodGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSkgewogICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlcyBrZXkgcHJlc3NlcyBvbiB0aGUgdHJpZ2dlci4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFuZGxlS2V5ZG93bihldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGtleUNvZGUgPSBldmVudC5rZXlDb2RlOwogICAgICAgICAgICBpZiAodGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSAmJiAoKGtleUNvZGUgPT09IFJJR0hUX0FSUk9XICYmIHRoaXMuZGlyID09PSAnbHRyJykgfHwKICAgICAgICAgICAgICAgIChrZXlDb2RlID09PSBMRUZUX0FSUk9XICYmIHRoaXMuZGlyID09PSAncnRsJykpKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9wZW5NZW51KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlcyBjbGljayBldmVudHMgb24gdGhlIHRyaWdnZXIuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUNsaWNrKGV2ZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLnRyaWdnZXJzU3VibWVudSgpKSB7CiAgICAgICAgICAgICAgICAvLyBTdG9wIGV2ZW50IHByb3BhZ2F0aW9uIHRvIGF2b2lkIGNsb3NpbmcgdGhlIHBhcmVudCBtZW51LgogICAgICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgICAgICB0aGlzLm9wZW5NZW51KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZU1lbnUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBIYW5kbGVzIHRoZSBjYXNlcyB3aGVyZSB0aGUgdXNlciBob3ZlcnMgb3ZlciB0aGUgdHJpZ2dlci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUhvdmVyKCkgewogICAgICAgICAgICAvLyBTdWJzY3JpYmUgdG8gY2hhbmdlcyBpbiB0aGUgaG92ZXJlZCBpdGVtIGluIG9yZGVyIHRvIHRvZ2dsZSB0aGUgcGFuZWwuCiAgICAgICAgICAgIGlmICghdGhpcy50cmlnZ2Vyc1N1Ym1lbnUoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hvdmVyU3Vic2NyaXB0aW9uID0gdGhpcy5fcGFyZW50TWVudS5faG92ZXJlZCgpCiAgICAgICAgICAgICAgICAvLyBTaW5jZSB3ZSBtaWdodCBoYXZlIG11bHRpcGxlIGNvbXBldGluZyB0cmlnZ2VycyBmb3IgdGhlIHNhbWUgbWVudSAoZS5nLiBhIHN1Yi1tZW51CiAgICAgICAgICAgICAgICAvLyB3aXRoIGRpZmZlcmVudCBkYXRhIGFuZCB0cmlnZ2VycyksIHdlIGhhdmUgdG8gZGVsYXkgaXQgYnkgYSB0aWNrIHRvIGVuc3VyZSB0aGF0CiAgICAgICAgICAgICAgICAvLyBpdCB3b24ndCBiZSBjbG9zZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaXQgaXMgb3BlbmVkLgogICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3RpdmUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGFjdGl2ZSA9PiBhY3RpdmUgPT09IHRoaXMuX21lbnVJdGVtSW5zdGFuY2UgJiYgIWFjdGl2ZS5kaXNhYmxlZCkpLCBkZWxheSgwLCBhc2FwKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fb3BlbmVkQnkgPSAnbW91c2UnOwogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHNhbWUgbWVudSBpcyB1c2VkIGJldHdlZW4gbXVsdGlwbGUgdHJpZ2dlcnMsIGl0IG1pZ2h0IHN0aWxsIGJlIGFuaW1hdGluZwogICAgICAgICAgICAgICAgLy8gd2hpbGUgdGhlIG5ldyB0cmlnZ2VyIHRyaWVzIHRvIHJlLW9wZW4gaXQuIFdhaXQgZm9yIHRoZSBhbmltYXRpb24gdG8gZmluaXNoCiAgICAgICAgICAgICAgICAvLyBiZWZvcmUgZG9pbmcgc28uIEFsc28gaW50ZXJydXB0IGlmIHRoZSB1c2VyIG1vdmVzIHRvIGFub3RoZXIgaXRlbS4KICAgICAgICAgICAgICAgIGlmICh0aGlzLm1lbnUgaW5zdGFuY2VvZiBNYXRNZW51ICYmIHRoaXMubWVudS5faXNBbmltYXRpbmcpIHsKICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRoZSBgZGVsYXkoMClgIGhlcmUgaW4gb3JkZXIgdG8gYXZvaWQKICAgICAgICAgICAgICAgICAgICAvLyAnY2hhbmdlZCBhZnRlciBjaGVja2VkJyBlcnJvcnMgaW4gc29tZSBjYXNlcy4gU2VlICMxMjE5NC4KICAgICAgICAgICAgICAgICAgICB0aGlzLm1lbnUuX2FuaW1hdGlvbkRvbmUKICAgICAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSwgZGVsYXkoMCwgYXNhcCksIHRha2VVbnRpbCh0aGlzLl9wYXJlbnRNZW51Ll9ob3ZlcmVkKCkpKQogICAgICAgICAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMub3Blbk1lbnUoKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuTWVudSgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIHBvcnRhbCB0aGF0IHNob3VsZCBiZSBhdHRhY2hlZCB0byB0aGUgb3ZlcmxheS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFBvcnRhbCgpIHsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbiBhdm9pZCB0aGlzIGNoZWNrIGJ5IGtlZXBpbmcgdGhlIHBvcnRhbCBvbiB0aGUgbWVudSBwYW5lbC4KICAgICAgICAgICAgLy8gV2hpbGUgaXQgd291bGQgYmUgY2xlYW5lciwgd2UnZCBoYXZlIHRvIGludHJvZHVjZSBhbm90aGVyIHJlcXVpcmVkIG1ldGhvZCBvbgogICAgICAgICAgICAvLyBgTWF0TWVudVBhbmVsYCwgbWFraW5nIGl0IGhhcmRlciB0byBjb25zdW1lLgogICAgICAgICAgICBpZiAoIXRoaXMuX3BvcnRhbCB8fCB0aGlzLl9wb3J0YWwudGVtcGxhdGVSZWYgIT09IHRoaXMubWVudS50ZW1wbGF0ZVJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMubWVudS50ZW1wbGF0ZVJlZiwgdGhpcy5fdmlld0NvbnRhaW5lclJlZik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3BvcnRhbDsKICAgICAgICB9CiAgICB9CiAgICBNYXRNZW51VHJpZ2dlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdE1lbnVUcmlnZ2VyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdE1lbnVUcmlnZ2VyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE92ZXJsYXkpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9NRU5VX1NDUk9MTF9TVFJBVEVHWSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0TWVudSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0TWVudUl0ZW0sIDEwKSwgybXJtWRpcmVjdGl2ZUluamVjdChEaXJlY3Rpb25hbGl0eSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSk7IH07CiAgICBNYXRNZW51VHJpZ2dlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRNZW51VHJpZ2dlciwgc2VsZWN0b3JzOiBbWyIiLCAibWF0LW1lbnUtdHJpZ2dlci1mb3IiLCAiIl0sIFsiIiwgIm1hdE1lbnVUcmlnZ2VyRm9yIiwgIiJdXSwgaG9zdEF0dHJzOiBbImFyaWEtaGFzcG9wdXAiLCAidHJ1ZSIsIDEsICJtYXQtbWVudS10cmlnZ2VyIl0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdE1lbnVUcmlnZ2VyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJtb3VzZWRvd24iLCBmdW5jdGlvbiBNYXRNZW51VHJpZ2dlcl9tb3VzZWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVNb3VzZWRvd24oJGV2ZW50KTsgfSkoImtleWRvd24iLCBmdW5jdGlvbiBNYXRNZW51VHJpZ2dlcl9rZXlkb3duX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlS2V5ZG93bigkZXZlbnQpOyB9KSgiY2xpY2siLCBmdW5jdGlvbiBNYXRNZW51VHJpZ2dlcl9jbGlja19Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHguX2hhbmRsZUNsaWNrKCRldmVudCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWV4cGFuZGVkIiwgY3R4Lm1lbnVPcGVuIHx8IG51bGwpKCJhcmlhLWNvbnRyb2xzIiwgY3R4Lm1lbnVPcGVuID8gY3R4Lm1lbnUucGFuZWxJZCA6IG51bGwpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IHJlc3RvcmVGb2N1czogWyJtYXRNZW51VHJpZ2dlclJlc3RvcmVGb2N1cyIsICJyZXN0b3JlRm9jdXMiXSwgX2RlcHJlY2F0ZWRNYXRNZW51VHJpZ2dlckZvcjogWyJtYXQtbWVudS10cmlnZ2VyLWZvciIsICJfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yIl0sIG1lbnU6IFsibWF0TWVudVRyaWdnZXJGb3IiLCAibWVudSJdLCBtZW51RGF0YTogWyJtYXRNZW51VHJpZ2dlckRhdGEiLCAibWVudURhdGEiXSB9LCBvdXRwdXRzOiB7IG1lbnVPcGVuZWQ6ICJtZW51T3BlbmVkIiwgb25NZW51T3BlbjogIm9uTWVudU9wZW4iLCBtZW51Q2xvc2VkOiAibWVudUNsb3NlZCIsIG9uTWVudUNsb3NlOiAib25NZW51Q2xvc2UiIH0sIGV4cG9ydEFzOiBbIm1hdE1lbnVUcmlnZ2VyIl0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdE1lbnVUcmlnZ2VyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogT3ZlcmxheSB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfTUVOVV9TQ1JPTExfU1RSQVRFR1ksXSB9XSB9LAogICAgICAgIHsgdHlwZTogTWF0TWVudSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IE1hdE1lbnVJdGVtLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IFNlbGYgfV0gfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRm9jdXNNb25pdG9yIH0KICAgIF07CiAgICBNYXRNZW51VHJpZ2dlci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBfZGVwcmVjYXRlZE1hdE1lbnVUcmlnZ2VyRm9yOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXQtbWVudS10cmlnZ2VyLWZvcicsXSB9XSwKICAgICAgICBtZW51OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRNZW51VHJpZ2dlckZvcicsXSB9XSwKICAgICAgICBtZW51RGF0YTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0TWVudVRyaWdnZXJEYXRhJyxdIH1dLAogICAgICAgIHJlc3RvcmVGb2N1czogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0TWVudVRyaWdnZXJSZXN0b3JlRm9jdXMnLF0gfV0sCiAgICAgICAgbWVudU9wZW5lZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uTWVudU9wZW46IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBtZW51Q2xvc2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25NZW51Q2xvc2U6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9tZW51L21lbnUtbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVXNlZCBieSBib3RoIHRoZSBjdXJyZW50IGBNYXRNZW51TW9kdWxlYCBhbmQgdGhlIE1EQyBgTWF0TWVudU1vZHVsZWAKICAgICAqIHRvIGRlY2xhcmUgdGhlIG1lbnUtcmVsYXRlZCBkaXJlY3RpdmVzLgogICAgICovCiAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6Y2xhc3MtbmFtZQogICAgY2xhc3MgX01hdE1lbnVEaXJlY3RpdmVzTW9kdWxlIHsKICAgIH0KICAgIF9NYXRNZW51RGlyZWN0aXZlc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IF9NYXRNZW51RGlyZWN0aXZlc01vZHVsZSB9KTsKICAgIF9NYXRNZW51RGlyZWN0aXZlc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIF9NYXRNZW51RGlyZWN0aXZlc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBfTWF0TWVudURpcmVjdGl2ZXNNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW01BVF9NRU5VX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZX1BST1ZJREVSXSwgaW1wb3J0czogW01hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShfTWF0TWVudURpcmVjdGl2ZXNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0TWVudVRyaWdnZXIsCiAgICAgICAgICAgIE1hdE1lbnVDb250ZW50XTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdE1lbnVUcmlnZ2VyLAogICAgICAgICAgICBNYXRNZW51Q29udGVudCwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSB9KTsgfSkoKTsKICAgIGNsYXNzIE1hdE1lbnVNb2R1bGUgewogICAgfQogICAgTWF0TWVudU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdE1lbnVNb2R1bGUgfSk7CiAgICBNYXRNZW51TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0TWVudU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRNZW51TW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFtNQVRfTUVOVV9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUl0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRSaXBwbGVNb2R1bGUsCiAgICAgICAgICAgICAgICBPdmVybGF5TW9kdWxlLAogICAgICAgICAgICAgICAgX01hdE1lbnVEaXJlY3RpdmVzTW9kdWxlLAogICAgICAgICAgICBdLAogICAgICAgICAgICBDZGtTY3JvbGxhYmxlTW9kdWxlLCBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIF9NYXRNZW51RGlyZWN0aXZlc01vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRNZW51TW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW19NYXRNZW51LAogICAgICAgICAgICBNYXRNZW51SXRlbV07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWF0UmlwcGxlTW9kdWxlLAogICAgICAgICAgICBPdmVybGF5TW9kdWxlLAogICAgICAgICAgICBfTWF0TWVudURpcmVjdGl2ZXNNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ2RrU2Nyb2xsYWJsZU1vZHVsZSwgTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBfTWF0TWVudSwKICAgICAgICAgICAgTWF0TWVudUl0ZW0sCiAgICAgICAgICAgIF9NYXRNZW51RGlyZWN0aXZlc01vZHVsZV07IH0gfSk7IH0pKCk7CgogICAgY29uc3QgbWF0VG9vbHRpcEFuaW1hdGlvbnMgPSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQW5pbWF0aW9uIHRoYXQgdHJhbnNpdGlvbnMgYSB0b29sdGlwIGluIGFuZCBvdXQuCiAgICAgICAgICovCiAgICAgICAgdG9vbHRpcFN0YXRlOiB0cmlnZ2VyKCdzdGF0ZScsIFsKICAgICAgICAgICAgc3RhdGUoJ2luaXRpYWwsIHZvaWQsIGhpZGRlbicsIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMCknIH0pKSwKICAgICAgICAgICAgc3RhdGUoJ3Zpc2libGUnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3NjYWxlKDEpJyB9KSksCiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gdmlzaWJsZScsIGFuaW1hdGUoJzIwMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpJywga2V5ZnJhbWVzKFsKICAgICAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMCwgdHJhbnNmb3JtOiAnc2NhbGUoMCknLCBvZmZzZXQ6IDAgfSksCiAgICAgICAgICAgICAgICBzdHlsZSh7IG9wYWNpdHk6IDAuNSwgdHJhbnNmb3JtOiAnc2NhbGUoMC45OSknLCBvZmZzZXQ6IDAuNSB9KSwKICAgICAgICAgICAgICAgIHN0eWxlKHsgb3BhY2l0eTogMSwgdHJhbnNmb3JtOiAnc2NhbGUoMSknLCBvZmZzZXQ6IDEgfSkKICAgICAgICAgICAgXSkpKSwKICAgICAgICAgICAgdHJhbnNpdGlvbignKiA9PiBoaWRkZW4nLCBhbmltYXRlKCcxMDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKScsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSkpLAogICAgICAgIF0pCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3Rvb2x0aXAvdG9vbHRpcC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFRpbWUgaW4gbXMgdG8gdGhyb3R0bGUgcmVwb3NpdGlvbmluZyBhZnRlciBzY3JvbGwgZXZlbnRzLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFNDUk9MTF9USFJPVFRMRV9NUyA9IDIwOwogICAgLyoqCiAgICAgKiBDU1MgY2xhc3MgdGhhdCB3aWxsIGJlIGF0dGFjaGVkIHRvIHRoZSBvdmVybGF5IHBhbmVsLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IFRPT0xUSVBfUEFORUxfQ0xBU1MgPSAnbWF0LXRvb2x0aXAtcGFuZWwnOwogICAgLyoqCiAgICAgKiBPcHRpb25zIHVzZWQgdG8gYmluZCBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zID0gbm9ybWFsaXplUGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyh7IHBhc3NpdmU6IHRydWUgfSk7CiAgICAvKioKICAgICAqIFRpbWUgYmV0d2VlbiB0aGUgdXNlciBwdXR0aW5nIHRoZSBwb2ludGVyIG9uIGEgdG9vbHRpcAogICAgICogdHJpZ2dlciBhbmQgdGhlIGxvbmcgcHJlc3MgZXZlbnQgYmVpbmcgZmlyZWQuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTE9OR1BSRVNTX0RFTEFZID0gNTAwOwogICAgLyoqCiAgICAgKiBDcmVhdGVzIGFuIGVycm9yIHRvIGJlIHRocm93biBpZiB0aGUgdXNlciBzdXBwbGllZCBhbiBpbnZhbGlkIHRvb2x0aXAgcG9zaXRpb24uCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0VG9vbHRpcEludmFsaWRQb3NpdGlvbkVycm9yKHBvc2l0aW9uKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBUb29sdGlwIHBvc2l0aW9uICIke3Bvc2l0aW9ufSIgaXMgaW52YWxpZC5gKTsKICAgIH0KICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgZGV0ZXJtaW5lcyB0aGUgc2Nyb2xsIGhhbmRsaW5nIHdoaWxlIGEgdG9vbHRpcCBpcyB2aXNpYmxlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9UT09MVElQX1NDUk9MTF9TVFJBVEVHWSA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LXRvb2x0aXAtc2Nyb2xsLXN0cmF0ZWd5Jyk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIE1BVF9UT09MVElQX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZKG92ZXJsYXkpIHsKICAgICAgICByZXR1cm4gKC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKCkgPT4gb3ZlcmxheS5zY3JvbGxTdHJhdGVnaWVzLnJlcG9zaXRpb24oeyBzY3JvbGxUaHJvdHRsZTogU0NST0xMX1RIUk9UVExFX01TIH0pKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfVE9PTFRJUF9TQ1JPTExfU1RSQVRFR1lfRkFDVE9SWV9QUk9WSURFUiA9IHsKICAgICAgICBwcm92aWRlOiBNQVRfVE9PTFRJUF9TQ1JPTExfU1RSQVRFR1ksCiAgICAgICAgZGVwczogW092ZXJsYXldLAogICAgICAgIHVzZUZhY3Rvcnk6IE1BVF9UT09MVElQX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZLAogICAgfTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRvIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgYG1hdFRvb2x0aXBgLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9UT09MVElQX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LXRvb2x0aXAtZGVmYXVsdC1vcHRpb25zJywgewogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiBNQVRfVE9PTFRJUF9ERUZBVUxUX09QVElPTlNfRkFDVE9SWQogICAgfSk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBNQVRfVE9PTFRJUF9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSgpIHsKICAgICAgICByZXR1cm4gewogICAgICAgICAgICBzaG93RGVsYXk6IDAsCiAgICAgICAgICAgIGhpZGVEZWxheTogMCwKICAgICAgICAgICAgdG91Y2hlbmRIaWRlRGVsYXk6IDE1MDAsCiAgICAgICAgfTsKICAgIH0KICAgIC8qKgogICAgICogRGlyZWN0aXZlIHRoYXQgYXR0YWNoZXMgYSBtYXRlcmlhbCBkZXNpZ24gdG9vbHRpcCB0byB0aGUgaG9zdCBlbGVtZW50LiBBbmltYXRlcyB0aGUgc2hvd2luZyBhbmQKICAgICAqIGhpZGluZyBvZiBhIHRvb2x0aXAgcHJvdmlkZWQgcG9zaXRpb24gKGRlZmF1bHRzIHRvIGJlbG93IHRoZSBlbGVtZW50KS4KICAgICAqCiAgICAgKiBodHRwczovL21hdGVyaWFsLmlvL2Rlc2lnbi9jb21wb25lbnRzL3Rvb2x0aXBzLmh0bWwKICAgICAqLwogICAgY2xhc3MgTWF0VG9vbHRpcCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfb3ZlcmxheQogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9zY3JvbGxEaXNwYXRjaGVyCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX25nWm9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgICAgICogQHBhcmFtIHs/fSBfYXJpYURlc2NyaWJlcgogICAgICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzTW9uaXRvcgogICAgICAgICAqIEBwYXJhbSB7P30gc2Nyb2xsU3RyYXRlZ3kKICAgICAgICAgKiBAcGFyYW0gez99IF9kaXIKICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0T3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Pz19IF9oYW1tZXJMb2FkZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihfb3ZlcmxheSwgX2VsZW1lbnRSZWYsIF9zY3JvbGxEaXNwYXRjaGVyLCBfdmlld0NvbnRhaW5lclJlZiwgX25nWm9uZSwgX3BsYXRmb3JtLCBfYXJpYURlc2NyaWJlciwgX2ZvY3VzTW9uaXRvciwgc2Nyb2xsU3RyYXRlZ3ksIF9kaXIsIF9kZWZhdWx0T3B0aW9ucywgCiAgICAgICAgLyoqCiAgICAgICAgICogQGRlcHJlY2F0ZWQgX2hhbW1lckxvYWRlciBwYXJhbWV0ZXIgdG8gYmUgcmVtb3ZlZC4KICAgICAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDkuMC4wCiAgICAgICAgICovCiAgICAgICAgLy8gTm90ZSB0aGF0IHdlIG5lZWQgdG8gZ2l2ZSBBbmd1bGFyIHNvbWV0aGluZyB0byBpbmplY3QgaGVyZSBzbyBpdCBkb2Vzbid0IHRocm93LgogICAgICAgIF9oYW1tZXJMb2FkZXIpIHsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheSA9IF9vdmVybGF5OwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmID0gX2VsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbERpc3BhdGNoZXIgPSBfc2Nyb2xsRGlzcGF0Y2hlcjsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICB0aGlzLl9uZ1pvbmUgPSBfbmdab25lOwogICAgICAgICAgICB0aGlzLl9wbGF0Zm9ybSA9IF9wbGF0Zm9ybTsKICAgICAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlciA9IF9hcmlhRGVzY3JpYmVyOwogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IgPSBfZm9jdXNNb25pdG9yOwogICAgICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucyA9IF9kZWZhdWx0T3B0aW9uczsKICAgICAgICAgICAgdGhpcy5fcG9zaXRpb24gPSAnYmVsb3cnOwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgaW4gbXMgYmVmb3JlIHNob3dpbmcgdGhlIHRvb2x0aXAgYWZ0ZXIgc2hvdyBpcyBjYWxsZWQKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2hvd0RlbGF5ID0gdGhpcy5fZGVmYXVsdE9wdGlvbnMuc2hvd0RlbGF5OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgaW4gbXMgYmVmb3JlIGhpZGluZyB0aGUgdG9vbHRpcCBhZnRlciBoaWRlIGlzIGNhbGxlZAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5oaWRlRGVsYXkgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5oaWRlRGVsYXk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBIb3cgdG91Y2ggZ2VzdHVyZXMgc2hvdWxkIGJlIGhhbmRsZWQgYnkgdGhlIHRvb2x0aXAuIE9uIHRvdWNoIGRldmljZXMgdGhlIHRvb2x0aXAgZGlyZWN0aXZlCiAgICAgICAgICAgICAqIHVzZXMgYSBsb25nIHByZXNzIGdlc3R1cmUgdG8gc2hvdyBhbmQgaGlkZSwgaG93ZXZlciBpdCBjYW4gY29uZmxpY3Qgd2l0aCB0aGUgbmF0aXZlIGJyb3dzZXIKICAgICAgICAgICAgICogZ2VzdHVyZXMuIFRvIHdvcmsgYXJvdW5kIHRoZSBjb25mbGljdCwgQW5ndWxhciBNYXRlcmlhbCBkaXNhYmxlcyBuYXRpdmUgZ2VzdHVyZXMgb24gdGhlCiAgICAgICAgICAgICAqIHRyaWdnZXIsIGJ1dCB0aGF0IG1pZ2h0IG5vdCBiZSBkZXNpcmFibGUgb24gcGFydGljdWxhciBlbGVtZW50cyAoZS5nLiBpbnB1dHMgYW5kIGRyYWdnYWJsZQogICAgICAgICAgICAgKiBlbGVtZW50cykuIFRoZSBkaWZmZXJlbnQgdmFsdWVzIGZvciB0aGlzIG9wdGlvbiBjb25maWd1cmUgdGhlIHRvdWNoIGV2ZW50IGhhbmRsaW5nIGFzIGZvbGxvd3M6CiAgICAgICAgICAgICAqIC0gYGF1dG9gIC0gRW5hYmxlcyB0b3VjaCBnZXN0dXJlcyBmb3IgYWxsIGVsZW1lbnRzLCBidXQgdHJpZXMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbmF0aXZlCiAgICAgICAgICAgICAqICAgYnJvd3NlciBnZXN0dXJlcyBvbiBwYXJ0aWN1bGFyIGVsZW1lbnRzLiBJbiBwYXJ0aWN1bGFyLCBpdCBhbGxvd3MgdGV4dCBzZWxlY3Rpb24gb24gaW5wdXRzCiAgICAgICAgICAgICAqICAgYW5kIHRleHRhcmVhcywgYW5kIHByZXNlcnZlcyB0aGUgbmF0aXZlIGJyb3dzZXIgZHJhZ2dpbmcgb24gZWxlbWVudHMgbWFya2VkIGFzIGBkcmFnZ2FibGVgLgogICAgICAgICAgICAgKiAtIGBvbmAgLSBFbmFibGVzIHRvdWNoIGdlc3R1cmVzIGZvciBhbGwgZWxlbWVudHMgYW5kIGRpc2FibGVzIG5hdGl2ZQogICAgICAgICAgICAgKiAgIGJyb3dzZXIgZ2VzdHVyZXMgd2l0aCBubyBleGNlcHRpb25zLgogICAgICAgICAgICAgKiAtIGBvZmZgIC0gRGlzYWJsZXMgdG91Y2ggZ2VzdHVyZXMuIE5vdGUgdGhhdCB0aGlzIHdpbGwgcHJldmVudCB0aGUgdG9vbHRpcCBmcm9tCiAgICAgICAgICAgICAqICAgc2hvd2luZyBvbiB0b3VjaCBkZXZpY2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy50b3VjaEdlc3R1cmVzID0gJ2F1dG8nOwogICAgICAgICAgICB0aGlzLl9tZXNzYWdlID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYW51YWxseS1ib3VuZCBwYXNzaXZlIGV2ZW50IGxpc3RlbmVycy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEhhbmRsZXMgdGhlIGtleWRvd24gZXZlbnRzIG9uIHRoZSBob3N0IGVsZW1lbnQuCiAgICAgICAgICAgICAqIE5lZWRzIHRvIGJlIGFuIGFycm93IGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIHVzZSBpdCBpbiBhZGRFdmVudExpc3RlbmVyLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faGFuZGxlS2V5ZG93biA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNUb29sdGlwVmlzaWJsZSgpICYmIGV2ZW50LmtleUNvZGUgPT09IEVTQ0FQRSAmJiAhaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuaGlkZSgwKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fc2Nyb2xsU3RyYXRlZ3kgPSBzY3JvbGxTdHJhdGVneTsKICAgICAgICAgICAgaWYgKF9kZWZhdWx0T3B0aW9ucykgewogICAgICAgICAgICAgICAgaWYgKF9kZWZhdWx0T3B0aW9ucy5wb3NpdGlvbikgewogICAgICAgICAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSBfZGVmYXVsdE9wdGlvbnMucG9zaXRpb247CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoX2RlZmF1bHRPcHRpb25zLnRvdWNoR2VzdHVyZXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdWNoR2VzdHVyZXMgPSBfZGVmYXVsdE9wdGlvbnMudG91Y2hHZXN0dXJlczsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBfZm9jdXNNb25pdG9yLm1vbml0b3IoX2VsZW1lbnRSZWYpCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9yaWdpbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3JpZ2luID0+IHsKICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZm9jdXMgbW9uaXRvciBydW5zIG91dHNpZGUgdGhlIEFuZ3VsYXIgem9uZS4KICAgICAgICAgICAgICAgIGlmICghb3JpZ2luKSB7CiAgICAgICAgICAgICAgICAgICAgX25nWm9uZS5ydW4oKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5oaWRlKDApKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChvcmlnaW4gPT09ICdrZXlib2FyZCcpIHsKICAgICAgICAgICAgICAgICAgICBfbmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLnNob3coKSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIF9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdrZXlkb3duJywgdGhpcy5faGFuZGxlS2V5ZG93bik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWxsb3dzIHRoZSB1c2VyIHRvIGRlZmluZSB0aGUgcG9zaXRpb24gb2YgdGhlIHRvb2x0aXAgcmVsYXRpdmUgdG8gdGhlIHBhcmVudCBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcG9zaXRpb24oKSB7IHJldHVybiB0aGlzLl9wb3NpdGlvbjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBwb3NpdGlvbih2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWUgIT09IHRoaXMuX3Bvc2l0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wb3NpdGlvbiA9IHZhbHVlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkpLnNob3coMCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYudXBkYXRlUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNhYmxlcyB0aGUgZGlzcGxheSBvZiB0aGUgdG9vbHRpcC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2Rpc2FibGVkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGRpc2FibGVkKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgLy8gSWYgdG9vbHRpcCBpcyBkaXNhYmxlZCwgaGlkZSBpbW1lZGlhdGVseS4KICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIG1lc3NhZ2UgdG8gYmUgZGlzcGxheWVkIGluIHRoZSB0b29sdGlwCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbWVzc2FnZSgpIHsgcmV0dXJuIHRoaXMuX21lc3NhZ2U7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbWVzc2FnZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9hcmlhRGVzY3JpYmVyLnJlbW92ZURlc2NyaXB0aW9uKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fbWVzc2FnZSk7CiAgICAgICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIG5vdCBhIHN0cmluZyAoZS5nLiBudW1iZXIpLCBjb252ZXJ0IGl0IHRvIGEgc3RyaW5nIGFuZCB0cmltIGl0LgogICAgICAgICAgICB0aGlzLl9tZXNzYWdlID0gdmFsdWUgIT0gbnVsbCA/IGAke3ZhbHVlfWAudHJpbSgpIDogJyc7CiAgICAgICAgICAgIGlmICghdGhpcy5fbWVzc2FnZSAmJiB0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuaGlkZSgwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8vIFRoZSBgQXJpYURlc2NyaWJlcmAgaGFzIHNvbWUgZnVuY3Rpb25hbGl0eSB0aGF0IGF2b2lkcyBhZGRpbmcgYSBkZXNjcmlwdGlvbiBpZiBpdCdzIHRoZQogICAgICAgICAgICAgICAgICAgIC8vIHNhbWUgYXMgdGhlIGBhcmlhLWxhYmVsYCBvZiBhbiBlbGVtZW50LCBob3dldmVyIHdlIGNhbid0IGtub3cgd2hldGhlciB0aGUgdG9vbHRpcCB0cmlnZ2VyCiAgICAgICAgICAgICAgICAgICAgLy8gaGFzIGEgZGF0YS1ib3VuZCBgYXJpYS1sYWJlbGAgb3Igd2hlbiBpdCdsbCBiZSBzZXQgZm9yIHRoZSBmaXJzdCB0aW1lLiBXZSBjYW4gYXZvaWQgdGhlCiAgICAgICAgICAgICAgICAgICAgLy8gaXNzdWUgYnkgZGVmZXJyaW5nIHRoZSBkZXNjcmlwdGlvbiBieSBhIHRpY2sgc28gQW5ndWxhciBoYXMgdGltZSB0byBzZXQgdGhlIGBhcmlhLWxhYmVsYC4KICAgICAgICAgICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYXJpYURlc2NyaWJlci5kZXNjcmliZSh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHRoaXMubWVzc2FnZSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENsYXNzZXMgdG8gYmUgcGFzc2VkIHRvIHRoZSB0b29sdGlwLiBTdXBwb3J0cyB0aGUgc2FtZSBzeW50YXggYXMgYG5nQ2xhc3NgLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHRvb2x0aXBDbGFzcygpIHsgcmV0dXJuIHRoaXMuX3Rvb2x0aXBDbGFzczsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB0b29sdGlwQ2xhc3ModmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fdG9vbHRpcENsYXNzID0gdmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NldFRvb2x0aXBDbGFzcyh0aGlzLl90b29sdGlwQ2xhc3MpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHVwIHN0eWxpbmctc3BlY2lmaWMgdGhpbmdzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgLy8gVGhpcyBuZWVkcyB0byBoYXBwZW4gaW4gYG5nT25Jbml0YCBzbyB0aGUgaW5pdGlhbCB2YWx1ZXMgZm9yIGFsbCBpbnB1dHMgaGF2ZSBiZWVuIHNldC4KICAgICAgICAgICAgdGhpcy5fc2V0dXBQb2ludGVyRXZlbnRzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERpc3Bvc2UgdGhlIHRvb2x0aXAgd2hlbiBkZXN0cm95ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuYXRpdmVFbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hzdGFydFRpbWVvdXQpOwogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kaXNwb3NlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIENsZWFuIHVwIHRoZSBldmVudCBsaXN0ZW5lcnMgc2V0IGluIHRoZSBjb25zdHJ1Y3RvcgogICAgICAgICAgICBuYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2tleWRvd24nLCB0aGlzLl9oYW5kbGVLZXlkb3duKTsKICAgICAgICAgICAgdGhpcy5fcGFzc2l2ZUxpc3RlbmVycy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsaXN0ZW5lcgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobGlzdGVuZXIsIGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICBuYXRpdmVFbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBwYXNzaXZlTGlzdGVuZXJPcHRpb25zKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX2Rlc3Ryb3llZC5jb21wbGV0ZSgpOwogICAgICAgICAgICB0aGlzLl9hcmlhRGVzY3JpYmVyLnJlbW92ZURlc2NyaXB0aW9uKG5hdGl2ZUVsZW1lbnQsIHRoaXMubWVzc2FnZSk7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5zdG9wTW9uaXRvcmluZyhuYXRpdmVFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2hvd3MgdGhlIHRvb2x0aXAgYWZ0ZXIgdGhlIGRlbGF5IGluIG1zLCBkZWZhdWx0cyB0byB0b29sdGlwLWRlbGF5LXNob3cgb3IgMG1zIGlmIG5vIGlucHV0CiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVsYXkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNob3coZGVsYXkgPSB0aGlzLnNob3dEZWxheSkgewogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCB8fCAhdGhpcy5tZXNzYWdlIHx8ICh0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkgJiYKICAgICAgICAgICAgICAgICEoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSkuX3Nob3dUaW1lb3V0SWQgJiYgISgvKiogQHR5cGUgez99ICovICh0aGlzLl90b29sdGlwSW5zdGFuY2UpKS5faGlkZVRpbWVvdXRJZCkpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG92ZXJsYXlSZWYgPSB0aGlzLl9jcmVhdGVPdmVybGF5KCk7CiAgICAgICAgICAgIHRoaXMuX2RldGFjaCgpOwogICAgICAgICAgICB0aGlzLl9wb3J0YWwgPSB0aGlzLl9wb3J0YWwgfHwgbmV3IENvbXBvbmVudFBvcnRhbChUb29sdGlwQ29tcG9uZW50LCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTsKICAgICAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlID0gb3ZlcmxheVJlZi5hdHRhY2godGhpcy5fcG9ydGFsKS5pbnN0YW5jZTsKICAgICAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmFmdGVySGlkZGVuKCkKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9kZXRhY2goKSkpOwogICAgICAgICAgICB0aGlzLl9zZXRUb29sdGlwQ2xhc3ModGhpcy5fdG9vbHRpcENsYXNzKTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlVG9vbHRpcE1lc3NhZ2UoKTsKICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkpLnNob3coZGVsYXkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBIaWRlcyB0aGUgdG9vbHRpcCBhZnRlciB0aGUgZGVsYXkgaW4gbXMsIGRlZmF1bHRzIHRvIHRvb2x0aXAtZGVsYXktaGlkZSBvciAwbXMgaWYgbm8gaW5wdXQKICAgICAgICAgKiBAcGFyYW0gez89fSBkZWxheQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGlkZShkZWxheSA9IHRoaXMuaGlkZURlbGF5KSB7CiAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5oaWRlKGRlbGF5KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTaG93cy9oaWRlcyB0aGUgdG9vbHRpcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9nZ2xlKCkgewogICAgICAgICAgICB0aGlzLl9pc1Rvb2x0aXBWaXNpYmxlKCkgPyB0aGlzLmhpZGUoKSA6IHRoaXMuc2hvdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHRvb2x0aXAgaXMgY3VycmVudGx5IHZpc2libGUgdG8gdGhlIHVzZXIKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1Rvb2x0aXBWaXNpYmxlKCkgewogICAgICAgICAgICByZXR1cm4gISF0aGlzLl90b29sdGlwSW5zdGFuY2UgJiYgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgdGhlIG92ZXJsYXkgY29uZmlnIGFuZCBwb3NpdGlvbiBzdHJhdGVneQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY3JlYXRlT3ZlcmxheSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5UmVmOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2Nyb2xsYWJsZUFuY2VzdG9ycyA9IHRoaXMuX3Njcm9sbERpc3BhdGNoZXIuZ2V0QW5jZXN0b3JTY3JvbGxDb250YWluZXJzKHRoaXMuX2VsZW1lbnRSZWYpOwogICAgICAgICAgICAvLyBDcmVhdGUgY29ubmVjdGVkIHBvc2l0aW9uIHN0cmF0ZWd5IHRoYXQgbGlzdGVucyBmb3Igc2Nyb2xsIGV2ZW50cyB0byByZXBvc2l0aW9uLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0cmF0ZWd5ID0gdGhpcy5fb3ZlcmxheS5wb3NpdGlvbigpCiAgICAgICAgICAgICAgICAuZmxleGlibGVDb25uZWN0ZWRUbyh0aGlzLl9lbGVtZW50UmVmKQogICAgICAgICAgICAgICAgLndpdGhUcmFuc2Zvcm1PcmlnaW5PbignLm1hdC10b29sdGlwJykKICAgICAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKQogICAgICAgICAgICAgICAgLndpdGhWaWV3cG9ydE1hcmdpbig4KQogICAgICAgICAgICAgICAgLndpdGhTY3JvbGxhYmxlQ29udGFpbmVycyhzY3JvbGxhYmxlQW5jZXN0b3JzKTsKICAgICAgICAgICAgc3RyYXRlZ3kucG9zaXRpb25DaGFuZ2VzLnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjaGFuZ2UgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgICAgIGlmIChjaGFuZ2Uuc2Nyb2xsYWJsZVZpZXdQcm9wZXJ0aWVzLmlzT3ZlcmxheUNsaXBwZWQgJiYgdGhpcy5fdG9vbHRpcEluc3RhbmNlLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFmdGVyIHBvc2l0aW9uIGNoYW5nZXMgb2NjdXIgYW5kIHRoZSBvdmVybGF5IGlzIGNsaXBwZWQgYnkKICAgICAgICAgICAgICAgICAgICAgICAgLy8gYSBwYXJlbnQgc2Nyb2xsYWJsZSB0aGVuIGNsb3NlIHRoZSB0b29sdGlwLgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuaGlkZSgwKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmID0gdGhpcy5fb3ZlcmxheS5jcmVhdGUoewogICAgICAgICAgICAgICAgZGlyZWN0aW9uOiB0aGlzLl9kaXIsCiAgICAgICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5OiBzdHJhdGVneSwKICAgICAgICAgICAgICAgIHBhbmVsQ2xhc3M6IFRPT0xUSVBfUEFORUxfQ0xBU1MsCiAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fc2Nyb2xsU3RyYXRlZ3koKQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlUG9zaXRpb24oKTsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fZGV0YWNoKCkpKTsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX292ZXJsYXlSZWY7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGFjaGVzIHRoZSBjdXJyZW50bHktYXR0YWNoZWQgdG9vbHRpcC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2RldGFjaCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSA9IG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IHRvb2x0aXAuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVQb3NpdGlvbigpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9ICgvKiogQHR5cGUgez99ICovICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb3ZlcmxheVJlZikpLmdldENvbmZpZygpLnBvc2l0aW9uU3RyYXRlZ3kpKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvcmlnaW4gPSB0aGlzLl9nZXRPcmlnaW4oKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvdmVybGF5ID0gdGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCk7CiAgICAgICAgICAgIHBvc2l0aW9uLndpdGhQb3NpdGlvbnMoWwogICAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBvcmlnaW4ubWFpbiksIG92ZXJsYXkubWFpbiksCiAgICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIG9yaWdpbi5mYWxsYmFjayksIG92ZXJsYXkuZmFsbGJhY2spCiAgICAgICAgICAgIF0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIHRoZSBvcmlnaW4gcG9zaXRpb24gYW5kIGEgZmFsbGJhY2sgcG9zaXRpb24gYmFzZWQgb24gdGhlIHVzZXIncyBwb3NpdGlvbiBwcmVmZXJlbmNlLgogICAgICAgICAqIFRoZSBmYWxsYmFjayBwb3NpdGlvbiBpcyB0aGUgaW52ZXJzZSBvZiB0aGUgb3JpZ2luIChlLmcuIGAnYmVsb3cnIC0+ICdhYm92ZSdgKS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPcmlnaW4oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNMdHIgPSAhdGhpcy5fZGlyIHx8IHRoaXMuX2Rpci52YWx1ZSA9PSAnbHRyJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG9yaWdpblBvc2l0aW9uOwogICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gJ2Fib3ZlJyB8fCBwb3NpdGlvbiA9PSAnYmVsb3cnKSB7CiAgICAgICAgICAgICAgICBvcmlnaW5Qb3NpdGlvbiA9IHsgb3JpZ2luWDogJ2NlbnRlcicsIG9yaWdpblk6IHBvc2l0aW9uID09ICdhYm92ZScgPyAndG9wJyA6ICdib3R0b20nIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPT0gJ2JlZm9yZScgfHwKICAgICAgICAgICAgICAgIChwb3NpdGlvbiA9PSAnbGVmdCcgJiYgaXNMdHIpIHx8CiAgICAgICAgICAgICAgICAocG9zaXRpb24gPT0gJ3JpZ2h0JyAmJiAhaXNMdHIpKSB7CiAgICAgICAgICAgICAgICBvcmlnaW5Qb3NpdGlvbiA9IHsgb3JpZ2luWDogJ3N0YXJ0Jywgb3JpZ2luWTogJ2NlbnRlcicgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwb3NpdGlvbiA9PSAnYWZ0ZXInIHx8CiAgICAgICAgICAgICAgICAocG9zaXRpb24gPT0gJ3JpZ2h0JyAmJiBpc0x0cikgfHwKICAgICAgICAgICAgICAgIChwb3NpdGlvbiA9PSAnbGVmdCcgJiYgIWlzTHRyKSkgewogICAgICAgICAgICAgICAgb3JpZ2luUG9zaXRpb24gPSB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAnY2VudGVyJyB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0VG9vbHRpcEludmFsaWRQb3NpdGlvbkVycm9yKHBvc2l0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG9yaWdpblBvc2l0aW9uLm9yaWdpblgsIG9yaWdpblBvc2l0aW9uLm9yaWdpblkpOwogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWFpbjogb3JpZ2luUG9zaXRpb24sCiAgICAgICAgICAgICAgICBmYWxsYmFjazogeyBvcmlnaW5YOiB4LCBvcmlnaW5ZOiB5IH0KICAgICAgICAgICAgfTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgb3ZlcmxheSBwb3NpdGlvbiBhbmQgYSBmYWxsYmFjayBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgdXNlcidzIHByZWZlcmVuY2UKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPdmVybGF5UG9zaXRpb24oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNMdHIgPSAhdGhpcy5fZGlyIHx8IHRoaXMuX2Rpci52YWx1ZSA9PSAnbHRyJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbiA9IHRoaXMucG9zaXRpb247CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG92ZXJsYXlQb3NpdGlvbjsKICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09ICdhYm92ZScpIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdjZW50ZXInLCBvdmVybGF5WTogJ2JvdHRvbScgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwb3NpdGlvbiA9PSAnYmVsb3cnKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5UG9zaXRpb24gPSB7IG92ZXJsYXlYOiAnY2VudGVyJywgb3ZlcmxheVk6ICd0b3AnIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPT0gJ2JlZm9yZScgfHwKICAgICAgICAgICAgICAgIChwb3NpdGlvbiA9PSAnbGVmdCcgJiYgaXNMdHIpIHx8CiAgICAgICAgICAgICAgICAocG9zaXRpb24gPT0gJ3JpZ2h0JyAmJiAhaXNMdHIpKSB7CiAgICAgICAgICAgICAgICBvdmVybGF5UG9zaXRpb24gPSB7IG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdjZW50ZXInIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAocG9zaXRpb24gPT0gJ2FmdGVyJyB8fAogICAgICAgICAgICAgICAgKHBvc2l0aW9uID09ICdyaWdodCcgJiYgaXNMdHIpIHx8CiAgICAgICAgICAgICAgICAocG9zaXRpb24gPT0gJ2xlZnQnICYmICFpc0x0cikpIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlQb3NpdGlvbiA9IHsgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnY2VudGVyJyB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0TWF0VG9vbHRpcEludmFsaWRQb3NpdGlvbkVycm9yKHBvc2l0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMuX2ludmVydFBvc2l0aW9uKG92ZXJsYXlQb3NpdGlvbi5vdmVybGF5WCwgb3ZlcmxheVBvc2l0aW9uLm92ZXJsYXlZKTsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIG1haW46IG92ZXJsYXlQb3NpdGlvbiwKICAgICAgICAgICAgICAgIGZhbGxiYWNrOiB7IG92ZXJsYXlYOiB4LCBvdmVybGF5WTogeSB9CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHRvb2x0aXAgbWVzc2FnZSBhbmQgcmVwb3NpdGlvbnMgdGhlIG92ZXJsYXkgYWNjb3JkaW5nIHRvIHRoZSBuZXcgbWVzc2FnZSBsZW5ndGgKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVRvb2x0aXBNZXNzYWdlKCkgewogICAgICAgICAgICAvLyBNdXN0IHdhaXQgZm9yIHRoZSBtZXNzYWdlIHRvIGJlIHBhaW50ZWQgdG8gdGhlIHRvb2x0aXAgc28gdGhhdCB0aGUgb3ZlcmxheSBjYW4gcHJvcGVybHkKICAgICAgICAgICAgLy8gY2FsY3VsYXRlIHRoZSBjb3JyZWN0IHBvc2l0aW9uaW5nIGJhc2VkIG9uIHRoZSBzaXplIG9mIHRoZSB0ZXh0LgogICAgICAgICAgICBpZiAodGhpcy5fdG9vbHRpcEluc3RhbmNlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90b29sdGlwSW5zdGFuY2UubWVzc2FnZSA9IHRoaXMubWVzc2FnZTsKICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25NaWNyb3Rhc2tFbXB0eS5hc09ic2VydmFibGUoKS5waXBlKHRha2UoMSksIHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl90b29sdGlwSW5zdGFuY2UpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX292ZXJsYXlSZWYpKS51cGRhdGVQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSB0b29sdGlwIGNsYXNzCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHRvb2x0aXBDbGFzcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFRvb2x0aXBDbGFzcyh0b29sdGlwQ2xhc3MpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3Rvb2x0aXBJbnN0YW5jZSkgewogICAgICAgICAgICAgICAgdGhpcy5fdG9vbHRpcEluc3RhbmNlLnRvb2x0aXBDbGFzcyA9IHRvb2x0aXBDbGFzczsKICAgICAgICAgICAgICAgIHRoaXMuX3Rvb2x0aXBJbnN0YW5jZS5fbWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW52ZXJ0cyBhbiBvdmVybGF5IHBvc2l0aW9uLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSB4CiAgICAgICAgICogQHBhcmFtIHs/fSB5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW52ZXJ0UG9zaXRpb24oeCwgeSkgewogICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ2Fib3ZlJyB8fCB0aGlzLnBvc2l0aW9uID09PSAnYmVsb3cnKSB7CiAgICAgICAgICAgICAgICBpZiAoeSA9PT0gJ3RvcCcpIHsKICAgICAgICAgICAgICAgICAgICB5ID0gJ2JvdHRvbSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh5ID09PSAnYm90dG9tJykgewogICAgICAgICAgICAgICAgICAgIHkgPSAndG9wJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmICh4ID09PSAnZW5kJykgewogICAgICAgICAgICAgICAgICAgIHggPSAnc3RhcnQnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoeCA9PT0gJ3N0YXJ0JykgewogICAgICAgICAgICAgICAgICAgIHggPSAnZW5kJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4geyB4LCB5IH07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEJpbmRzIHRoZSBwb2ludGVyIGV2ZW50cyB0byB0aGUgdG9vbHRpcCB0cmlnZ2VyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0dXBQb2ludGVyRXZlbnRzKCkgewogICAgICAgICAgICAvLyBUaGUgbW91c2UgZXZlbnRzIHNob3VsZG4ndCBiZSBib3VuZCBvbiBtb2JpbGUgZGV2aWNlcywgYmVjYXVzZSB0aGV5IGNhbiBwcmV2ZW50IHRoZQogICAgICAgICAgICAvLyBmaXJzdCB0YXAgZnJvbSBmaXJpbmcgaXRzIGNsaWNrIGV2ZW50IG9yIGNhbiBjYXVzZSB0aGUgdG9vbHRpcCB0byBvcGVuIGZvciBjbGlja3MuCiAgICAgICAgICAgIGlmICghdGhpcy5fcGxhdGZvcm0uSU9TICYmICF0aGlzLl9wbGF0Zm9ybS5BTkRST0lEKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wYXNzaXZlTGlzdGVuZXJzCiAgICAgICAgICAgICAgICAgICAgLnNldCgnbW91c2VlbnRlcicsICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuc2hvdygpKSkKICAgICAgICAgICAgICAgICAgICAuc2V0KCdtb3VzZWxlYXZlJywgKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5oaWRlKCkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnRvdWNoR2VzdHVyZXMgIT09ICdvZmYnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlTmF0aXZlR2VzdHVyZXNJZk5lY2Vzc2FyeSgpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdG91Y2hlbmRMaXN0ZW5lciA9ICgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5fdG91Y2hzdGFydFRpbWVvdXQpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuaGlkZSh0aGlzLl9kZWZhdWx0T3B0aW9ucy50b3VjaGVuZEhpZGVEZWxheSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIHRoaXMuX3Bhc3NpdmVMaXN0ZW5lcnMKICAgICAgICAgICAgICAgICAgICAuc2V0KCd0b3VjaGVuZCcsIHRvdWNoZW5kTGlzdGVuZXIpCiAgICAgICAgICAgICAgICAgICAgLnNldCgndG91Y2hjYW5jZWwnLCB0b3VjaGVuZExpc3RlbmVyKQogICAgICAgICAgICAgICAgICAgIC5zZXQoJ3RvdWNoc3RhcnQnLCAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IGl0J3MgaW1wb3J0YW50IHRoYXQgd2UgZG9uJ3QgYHByZXZlbnREZWZhdWx0YCBoZXJlLAogICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgaXQgY2FuIHByZXZlbnQgY2xpY2sgZXZlbnRzIGZyb20gZmlyaW5nIG9uIHRoZSBlbGVtZW50LgogICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl90b3VjaHN0YXJ0VGltZW91dCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdG91Y2hzdGFydFRpbWVvdXQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICgpID0+IHRoaXMuc2hvdygpKSwgTE9OR1BSRVNTX0RFTEFZKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9wYXNzaXZlTGlzdGVuZXJzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RlbmVyCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChsaXN0ZW5lciwgZXZlbnQpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKGV2ZW50LCBsaXN0ZW5lciwgcGFzc2l2ZUxpc3RlbmVyT3B0aW9ucyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGlzYWJsZXMgdGhlIG5hdGl2ZSBicm93c2VyIGdlc3R1cmVzLCBiYXNlZCBvbiBob3cgdGhlIHRvb2x0aXAgaGFzIGJlZW4gY29uZmlndXJlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Rpc2FibGVOYXRpdmVHZXN0dXJlc0lmTmVjZXNzYXJ5KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3R5bGUgPSBlbGVtZW50LnN0eWxlOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGdlc3R1cmVzID0gdGhpcy50b3VjaEdlc3R1cmVzOwogICAgICAgICAgICBpZiAoZ2VzdHVyZXMgIT09ICdvZmYnKSB7CiAgICAgICAgICAgICAgICAvLyBJZiBnZXN0dXJlcyBhcmUgc2V0IHRvIGBhdXRvYCwgd2UgZG9uJ3QgZGlzYWJsZSB0ZXh0IHNlbGVjdGlvbiBvbiBpbnB1dHMgYW5kCiAgICAgICAgICAgICAgICAvLyB0ZXh0YXJlYXMsIGJlY2F1c2UgaXQgcHJldmVudHMgdGhlIHVzZXIgZnJvbSB0eXBpbmcgaW50byB0aGVtIG9uIGlPUyBTYWZhcmkuCiAgICAgICAgICAgICAgICBpZiAoZ2VzdHVyZXMgPT09ICdvbicgfHwgKGVsZW1lbnQubm9kZU5hbWUgIT09ICdJTlBVVCcgJiYgZWxlbWVudC5ub2RlTmFtZSAhPT0gJ1RFWFRBUkVBJykpIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZS51c2VyU2VsZWN0ID0gc3R5bGUubXNVc2VyU2VsZWN0ID0gc3R5bGUud2Via2l0VXNlclNlbGVjdCA9CiAgICAgICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoc3R5bGUpKSkuTW96VXNlclNlbGVjdCA9ICdub25lJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYGF1dG9gIGdlc3R1cmVzIGFuZCB0aGUgZWxlbWVudCB1c2VzIG5hdGl2ZSBIVE1MIGRyYWdnaW5nLAogICAgICAgICAgICAgICAgLy8gd2UgZG9uJ3Qgc2V0IGAtd2Via2l0LXVzZXItZHJhZ2AgYmVjYXVzZSBpdCBwcmV2ZW50cyB0aGUgbmF0aXZlIGJlaGF2aW9yLgogICAgICAgICAgICAgICAgaWYgKGdlc3R1cmVzID09PSAnb24nIHx8ICFlbGVtZW50LmRyYWdnYWJsZSkgewogICAgICAgICAgICAgICAgICAgICgoLyoqIEB0eXBlIHs/fSAqLyAoc3R5bGUpKSkud2Via2l0VXNlckRyYWcgPSAnbm9uZSc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBzdHlsZS50b3VjaEFjdGlvbiA9ICdub25lJzsKICAgICAgICAgICAgICAgIHN0eWxlLndlYmtpdFRhcEhpZ2hsaWdodENvbG9yID0gJ3RyYW5zcGFyZW50JzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIE1hdFRvb2x0aXAuybVmYWMgPSBmdW5jdGlvbiBNYXRUb29sdGlwX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRvb2x0aXApKMm1ybVkaXJlY3RpdmVJbmplY3QoT3ZlcmxheSksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoU2Nyb2xsRGlzcGF0Y2hlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSksIMm1ybVkaXJlY3RpdmVJbmplY3QoQXJpYURlc2NyaWJlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9jdXNNb25pdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfVE9PTFRJUF9TQ1JPTExfU1RSQVRFR1kpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfVE9PTFRJUF9ERUZBVUxUX09QVElPTlMsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIE1hdFRvb2x0aXAuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0VG9vbHRpcCwgc2VsZWN0b3JzOiBbWyIiLCAibWF0VG9vbHRpcCIsICIiXV0sIGlucHV0czogeyBzaG93RGVsYXk6IFsibWF0VG9vbHRpcFNob3dEZWxheSIsICJzaG93RGVsYXkiXSwgaGlkZURlbGF5OiBbIm1hdFRvb2x0aXBIaWRlRGVsYXkiLCAiaGlkZURlbGF5Il0sIHRvdWNoR2VzdHVyZXM6IFsibWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMiLCAidG91Y2hHZXN0dXJlcyJdLCBwb3NpdGlvbjogWyJtYXRUb29sdGlwUG9zaXRpb24iLCAicG9zaXRpb24iXSwgZGlzYWJsZWQ6IFsibWF0VG9vbHRpcERpc2FibGVkIiwgImRpc2FibGVkIl0sIG1lc3NhZ2U6IFsibWF0VG9vbHRpcCIsICJtZXNzYWdlIl0sIHRvb2x0aXBDbGFzczogWyJtYXRUb29sdGlwQ2xhc3MiLCAidG9vbHRpcENsYXNzIl0gfSwgZXhwb3J0QXM6IFsibWF0VG9vbHRpcCJdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRUb29sdGlwLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogT3ZlcmxheSB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogU2Nyb2xsRGlzcGF0Y2hlciB9LAogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9LAogICAgICAgIHsgdHlwZTogQXJpYURlc2NyaWJlciB9LAogICAgICAgIHsgdHlwZTogRm9jdXNNb25pdG9yIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9UT09MVElQX1NDUk9MTF9TVFJBVEVHWSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfVE9PTFRJUF9ERUZBVUxUX09QVElPTlMsXSB9XSB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtFbGVtZW50UmVmLF0gfV0gfQogICAgXTsKICAgIE1hdFRvb2x0aXAucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgcG9zaXRpb246IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFRvb2x0aXBQb3NpdGlvbicsXSB9XSwKICAgICAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0VG9vbHRpcERpc2FibGVkJyxdIH1dLAogICAgICAgIHNob3dEZWxheTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0VG9vbHRpcFNob3dEZWxheScsXSB9XSwKICAgICAgICBoaWRlRGVsYXk6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFRvb2x0aXBIaWRlRGVsYXknLF0gfV0sCiAgICAgICAgdG91Y2hHZXN0dXJlczogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0VG9vbHRpcFRvdWNoR2VzdHVyZXMnLF0gfV0sCiAgICAgICAgbWVzc2FnZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0VG9vbHRpcCcsXSB9XSwKICAgICAgICB0b29sdGlwQ2xhc3M6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFRvb2x0aXBDbGFzcycsXSB9XQogICAgfTsKICAgIC8qKgogICAgICogSW50ZXJuYWwgY29tcG9uZW50IHRoYXQgd3JhcHMgdGhlIHRvb2x0aXAncyBjb250ZW50LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgVG9vbHRpcENvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9icmVha3BvaW50T2JzZXJ2ZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfY2hhbmdlRGV0ZWN0b3JSZWYsIF9icmVha3BvaW50T2JzZXJ2ZXIpIHsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuX2JyZWFrcG9pbnRPYnNlcnZlciA9IF9icmVha3BvaW50T2JzZXJ2ZXI7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBQcm9wZXJ0eSB3YXRjaGVkIGJ5IHRoZSBhbmltYXRpb24gZnJhbWV3b3JrIHRvIHNob3cgb3IgaGlkZSB0aGUgdG9vbHRpcAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdmlzaWJpbGl0eSA9ICdpbml0aWFsJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgaW50ZXJhY3Rpb25zIG9uIHRoZSBwYWdlIHNob3VsZCBjbG9zZSB0aGUgdG9vbHRpcAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY2xvc2VPbkludGVyYWN0aW9uID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJqZWN0IGZvciBub3RpZnlpbmcgdGhhdCB0aGUgdG9vbHRpcCBoYXMgYmVlbiBoaWRkZW4gZnJvbSB0aGUgdmlldwogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25IaWRlID0gbmV3IFN1YmplY3QoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN0cmVhbSB0aGF0IGVtaXRzIHdoZXRoZXIgdGhlIHVzZXIgaGFzIGEgaGFuZHNldC1zaXplZCBkaXNwbGF5LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faXNIYW5kc2V0ID0gdGhpcy5fYnJlYWtwb2ludE9ic2VydmVyLm9ic2VydmUoQnJlYWtwb2ludHMuSGFuZHNldCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNob3dzIHRoZSB0b29sdGlwIHdpdGggYW4gYW5pbWF0aW9uIG9yaWdpbmF0aW5nIGZyb20gdGhlIHByb3ZpZGVkIG9yaWdpbgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsYXkgQW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byB0aGUgZGVsYXkgc2hvd2luZyB0aGUgdG9vbHRpcC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNob3coZGVsYXkpIHsKICAgICAgICAgICAgLy8gQ2FuY2VsIHRoZSBkZWxheWVkIGhpZGUgaWYgaXQgaXMgc2NoZWR1bGVkCiAgICAgICAgICAgIGlmICh0aGlzLl9oaWRlVGltZW91dElkKSB7CiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5faGlkZVRpbWVvdXRJZCk7CiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlVGltZW91dElkID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBCb2R5IGludGVyYWN0aW9ucyBzaG91bGQgY2FuY2VsIHRoZSB0b29sdGlwIGlmIHRoZXJlIGlzIGEgZGVsYXkgaW4gc2hvd2luZy4KICAgICAgICAgICAgdGhpcy5fY2xvc2VPbkludGVyYWN0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5fc2hvd1RpbWVvdXRJZCA9IHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fdmlzaWJpbGl0eSA9ICd2aXNpYmxlJzsKICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dUaW1lb3V0SWQgPSBudWxsOwogICAgICAgICAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgc28gaWYgYW55IHBhcmVudCBjb21wb25lbnQgaGFzIHNldCB0aGUKICAgICAgICAgICAgICAgIC8vIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHRvIE9uUHVzaCBpdCB3aWxsIGJlIGNoZWNrZWQgYW55d2F5cwogICAgICAgICAgICAgICAgdGhpcy5fbWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0pLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEJlZ2lucyB0aGUgYW5pbWF0aW9uIHRvIGhpZGUgdGhlIHRvb2x0aXAgYWZ0ZXIgdGhlIHByb3ZpZGVkIGRlbGF5IGluIG1zLgogICAgICAgICAqIEBwYXJhbSB7P30gZGVsYXkgQW1vdW50IG9mIG1pbGxpc2Vjb25kcyB0byBkZWxheSBzaG93aW5nIHRoZSB0b29sdGlwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGlkZShkZWxheSkgewogICAgICAgICAgICAvLyBDYW5jZWwgdGhlIGRlbGF5ZWQgc2hvdyBpZiBpdCBpcyBzY2hlZHVsZWQKICAgICAgICAgICAgaWYgKHRoaXMuX3Nob3dUaW1lb3V0SWQpIHsKICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLl9zaG93VGltZW91dElkKTsKICAgICAgICAgICAgICAgIHRoaXMuX3Nob3dUaW1lb3V0SWQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hpZGVUaW1lb3V0SWQgPSBzZXRUaW1lb3V0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3Zpc2liaWxpdHkgPSAnaGlkZGVuJzsKICAgICAgICAgICAgICAgIHRoaXMuX2hpZGVUaW1lb3V0SWQgPSBudWxsOwogICAgICAgICAgICAgICAgLy8gTWFyayBmb3IgY2hlY2sgc28gaWYgYW55IHBhcmVudCBjb21wb25lbnQgaGFzIHNldCB0aGUKICAgICAgICAgICAgICAgIC8vIENoYW5nZURldGVjdGlvblN0cmF0ZWd5IHRvIE9uUHVzaCBpdCB3aWxsIGJlIGNoZWNrZWQgYW55d2F5cwogICAgICAgICAgICAgICAgdGhpcy5fbWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIH0pLCBkZWxheSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYW4gb2JzZXJ2YWJsZSB0aGF0IG5vdGlmaWVzIHdoZW4gdGhlIHRvb2x0aXAgaGFzIGJlZW4gaGlkZGVuIGZyb20gdmlldy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFmdGVySGlkZGVuKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb25IaWRlLmFzT2JzZXJ2YWJsZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSB0b29sdGlwIGlzIGJlaW5nIGRpc3BsYXllZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzVmlzaWJsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3Zpc2liaWxpdHkgPT09ICd2aXNpYmxlJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fb25IaWRlLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FuaW1hdGlvblN0YXJ0KCkgewogICAgICAgICAgICB0aGlzLl9jbG9zZU9uSW50ZXJhY3Rpb24gPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FuaW1hdGlvbkRvbmUoZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0b1N0YXRlID0gKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50LnRvU3RhdGUpKTsKICAgICAgICAgICAgaWYgKHRvU3RhdGUgPT09ICdoaWRkZW4nICYmICF0aGlzLmlzVmlzaWJsZSgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkhpZGUubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0b1N0YXRlID09PSAndmlzaWJsZScgfHwgdG9TdGF0ZSA9PT0gJ2hpZGRlbicpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlT25JbnRlcmFjdGlvbiA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW50ZXJhY3Rpb25zIG9uIHRoZSBIVE1MIGJvZHkgc2hvdWxkIGNsb3NlIHRoZSB0b29sdGlwIGltbWVkaWF0ZWx5IGFzIGRlZmluZWQgaW4gdGhlCiAgICAgICAgICogbWF0ZXJpYWwgZGVzaWduIHNwZWMuCiAgICAgICAgICogaHR0cHM6Ly9tYXRlcmlhbC5pby9kZXNpZ24vY29tcG9uZW50cy90b29sdGlwcy5odG1sI2JlaGF2aW9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFuZGxlQm9keUludGVyYWN0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5fY2xvc2VPbkludGVyYWN0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhpZGUoMCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWFya3MgdGhhdCB0aGUgdG9vbHRpcCBuZWVkcyB0byBiZSBjaGVja2VkIGluIHRoZSBuZXh0IGNoYW5nZSBkZXRlY3Rpb24gcnVuLgogICAgICAgICAqIE1haW5seSB1c2VkIGZvciByZW5kZXJpbmcgdGhlIGluaXRpYWwgdGV4dCBiZWZvcmUgcG9zaXRpb25pbmcgYSB0b29sdGlwLCB3aGljaAogICAgICAgICAqIGNhbiBiZSBwcm9ibGVtYXRpYyBpbiBjb21wb25lbnRzIHdpdGggT25QdXNoIGNoYW5nZSBkZXRlY3Rpb24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbWFya0ZvckNoZWNrKCkgewogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICB9CiAgICBUb29sdGlwQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gVG9vbHRpcENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUb29sdGlwQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChCcmVha3BvaW50T2JzZXJ2ZXIpKTsgfTsKICAgIFRvb2x0aXBDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogVG9vbHRpcENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJtYXQtdG9vbHRpcC1jb21wb25lbnQiXV0sIGhvc3RBdHRyczogWyJhcmlhLWhpZGRlbiIsICJ0cnVlIl0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFRvb2x0aXBDb21wb25lbnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gVG9vbHRpcENvbXBvbmVudF9jbGlja19Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX2hhbmRsZUJvZHlJbnRlcmFjdGlvbigpOyB9LCBmYWxzZSwgybXJtXJlc29sdmVCb2R5KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXN0eWxlUHJvcCgiem9vbSIsIGN0eC5fdmlzaWJpbGl0eSA9PT0gInZpc2libGUiID8gMSA6IG51bGwpOwogICAgICAgIH0gfSwgZGVjbHM6IDMsIHZhcnM6IDcsIGNvbnN0czogW1sxLCAibWF0LXRvb2x0aXAiLCAzLCAibmdDbGFzcyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFRvb2x0aXBDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIkBzdGF0ZS5zdGFydCIsIGZ1bmN0aW9uIFRvb2x0aXBDb21wb25lbnRfVGVtcGxhdGVfZGl2X2FuaW1hdGlvbl9zdGF0ZV9zdGFydF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Ll9hbmltYXRpb25TdGFydCgpOyB9KSgiQHN0YXRlLmRvbmUiLCBmdW5jdGlvbiBUb29sdGlwQ29tcG9uZW50X1RlbXBsYXRlX2Rpdl9hbmltYXRpb25fc3RhdGVfZG9uZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9hbmltYXRpb25Eb25lKCRldmVudCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXRleHQoMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciB0bXBfMF8wID0gbnVsbDsKICAgICAgICAgICAgY29uc3QgY3VyclZhbF8wID0gKHRtcF8wXzAgPSDJtcm1cGlwZUJpbmQxKDEsIDUsIGN0eC5faXNIYW5kc2V0KSkgPT0gbnVsbCA/IG51bGwgOiB0bXBfMF8wLm1hdGNoZXM7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC10b29sdGlwLWhhbmRzZXQiLCBjdXJyVmFsXzApOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nQ2xhc3MiLCBjdHgudG9vbHRpcENsYXNzKSgiQHN0YXRlIiwgY3R4Ll92aXNpYmlsaXR5KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4Lm1lc3NhZ2UpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nQ2xhc3NdLCBwaXBlczogW0FzeW5jUGlwZV0sIHN0eWxlczogWyIubWF0LXRvb2x0aXAtcGFuZWx7cG9pbnRlci1ldmVudHM6bm9uZSAhaW1wb3J0YW50fS5tYXQtdG9vbHRpcHtjb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6NHB4O21hcmdpbjoxNHB4O21heC13aWR0aDoyNTBweDtwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6OHB4O292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC10b29sdGlwe291dGxpbmU6c29saWQgMXB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0e21hcmdpbjoyNHB4O3BhZGRpbmctbGVmdDoxNnB4O3BhZGRpbmctcmlnaHQ6MTZweH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBkYXRhOiB7IGFuaW1hdGlvbjogW21hdFRvb2x0aXBBbmltYXRpb25zLnRvb2x0aXBTdGF0ZV0gfSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUb29sdGlwQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IEJyZWFrcG9pbnRPYnNlcnZlciB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3Rvb2x0aXAvdG9vbHRpcC1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0VG9vbHRpcE1vZHVsZSB7CiAgICB9CiAgICBNYXRUb29sdGlwTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0VG9vbHRpcE1vZHVsZSB9KTsKICAgIE1hdFRvb2x0aXBNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRUb29sdGlwTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFRvb2x0aXBNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW01BVF9UT09MVElQX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZX1BST1ZJREVSXSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIEExMXlNb2R1bGUsCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBPdmVybGF5TW9kdWxlLAogICAgICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBdLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsIENka1Njcm9sbGFibGVNb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0VG9vbHRpcE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRUb29sdGlwLAogICAgICAgICAgICBUb29sdGlwQ29tcG9uZW50XTsgfSwgaW1wb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0ExMXlNb2R1bGUsCiAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgT3ZlcmxheU1vZHVsZSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFRvb2x0aXAsCiAgICAgICAgICAgIFRvb2x0aXBDb21wb25lbnQsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZSwgQ2RrU2Nyb2xsYWJsZU1vZHVsZV07IH0gfSk7IH0pKCk7CgogICAgZnVuY3Rpb24gTWF0UGFnaW5hdG9yX2Rpdl8yX21hdF9mb3JtX2ZpZWxkXzNfbWF0X29wdGlvbl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1vcHRpb24iLCAxOSk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IHBhZ2VTaXplT3B0aW9uX3I2ID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgcGFnZVNpemVPcHRpb25fcjYpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgcGFnZVNpemVPcHRpb25fcjYsICIgIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdFBhZ2luYXRvcl9kaXZfMl9tYXRfZm9ybV9maWVsZF8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yOCA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1mb3JtLWZpZWxkIiwgMTYpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgIm1hdC1zZWxlY3QiLCAxNyk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJzZWxlY3Rpb25DaGFuZ2UiLCBmdW5jdGlvbiBNYXRQYWdpbmF0b3JfZGl2XzJfbWF0X2Zvcm1fZmllbGRfM19UZW1wbGF0ZV9tYXRfc2VsZWN0X3NlbGVjdGlvbkNoYW5nZV8xX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I4KTsgY29uc3QgY3R4X3I3ID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3I3Ll9jaGFuZ2VQYWdlU2l6ZSgkZXZlbnQudmFsdWUpOyB9KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgTWF0UGFnaW5hdG9yX2Rpdl8yX21hdF9mb3JtX2ZpZWxkXzNfbWF0X29wdGlvbl8yX1RlbXBsYXRlLCAyLCAyLCAibWF0LW9wdGlvbiIsIDE4KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJjb2xvciIsIGN0eF9yMy5jb2xvcik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eF9yMy5wYWdlU2l6ZSkoImRpc2FibGVkIiwgY3R4X3IzLmRpc2FibGVkKSgiYXJpYS1sYWJlbCIsIGN0eF9yMy5faW50bC5pdGVtc1BlclBhZ2VMYWJlbCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4X3IzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRQYWdpbmF0b3JfZGl2XzJfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMjApOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHhfcjQucGFnZVNpemUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRQYWdpbmF0b3JfZGl2XzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDEzKTsKICAgICAgICDJtcm1dGV4dCgyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBNYXRQYWdpbmF0b3JfZGl2XzJfbWF0X2Zvcm1fZmllbGRfM19UZW1wbGF0ZSwgMywgNSwgIm1hdC1mb3JtLWZpZWxkIiwgMTQpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBNYXRQYWdpbmF0b3JfZGl2XzJfZGl2XzRfVGVtcGxhdGUsIDIsIDEsICJkaXYiLCAxNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLl9pbnRsLml0ZW1zUGVyUGFnZUxhYmVsLCAiICIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMC5fZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aCA+IDEpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMC5fZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLmxlbmd0aCA8PSAxKTsKICAgIH0gfQogICAgZnVuY3Rpb24gTWF0UGFnaW5hdG9yX2J1dHRvbl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTAgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCAyMSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFBhZ2luYXRvcl9idXR0b25fNl9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTApOyBjb25zdCBjdHhfcjkgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yOS5maXJzdFBhZ2UoKTsgfSk7CiAgICAgICAgybXJtW5hbWVzcGFjZVNWRygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInN2ZyIsIDcpOwogICAgICAgIMm1ybVlbGVtZW50KDIsICJwYXRoIiwgMjIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0VG9vbHRpcCIsIGN0eF9yMS5faW50bC5maXJzdFBhZ2VMYWJlbCkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsIGN0eF9yMS5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSkoIm1hdFRvb2x0aXBQb3NpdGlvbiIsICJhYm92ZSIpKCJkaXNhYmxlZCIsIGN0eF9yMS5fcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSk7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1sYWJlbCIsIGN0eF9yMS5faW50bC5maXJzdFBhZ2VMYWJlbCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdFBhZ2luYXRvcl9idXR0b25fMTNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IxMiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICDJtcm1bmFtZXNwYWNlSFRNTCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImJ1dHRvbiIsIDIzKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0UGFnaW5hdG9yX2J1dHRvbl8xM19UZW1wbGF0ZV9idXR0b25fY2xpY2tfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTIpOyBjb25zdCBjdHhfcjExID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjExLmxhc3RQYWdlKCk7IH0pOwogICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzdmciLCA3KTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAicGF0aCIsIDI0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjIgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFRvb2x0aXAiLCBjdHhfcjIuX2ludGwubGFzdFBhZ2VMYWJlbCkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsIGN0eF9yMi5fbmV4dEJ1dHRvbnNEaXNhYmxlZCgpKSgibWF0VG9vbHRpcFBvc2l0aW9uIiwgImFib3ZlIikoImRpc2FibGVkIiwgY3R4X3IyLl9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCBjdHhfcjIuX2ludGwubGFzdFBhZ2VMYWJlbCk7CiAgICB9IH0KICAgIGNsYXNzIE1hdFBhZ2luYXRvckludGwgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyZWFtIHRvIGVtaXQgZnJvbSB3aGVuIGxhYmVscyBhcmUgY2hhbmdlZC4gVXNlIHRoaXMgdG8gbm90aWZ5IGNvbXBvbmVudHMgd2hlbiB0aGUgbGFiZWxzIGhhdmUKICAgICAgICAgICAgICogY2hhbmdlZCBhZnRlciBpbml0aWFsaXphdGlvbi4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIGxhYmVsIGZvciB0aGUgcGFnZSBzaXplIHNlbGVjdG9yLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5pdGVtc1BlclBhZ2VMYWJlbCA9ICdJdGVtcyBwZXIgcGFnZTonOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBsYWJlbCBmb3IgdGhlIGJ1dHRvbiB0aGF0IGluY3JlbWVudHMgdGhlIGN1cnJlbnQgcGFnZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubmV4dFBhZ2VMYWJlbCA9ICdOZXh0IHBhZ2UnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBsYWJlbCBmb3IgdGhlIGJ1dHRvbiB0aGF0IGRlY3JlbWVudHMgdGhlIGN1cnJlbnQgcGFnZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucHJldmlvdXNQYWdlTGFiZWwgPSAnUHJldmlvdXMgcGFnZSc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIGxhYmVsIGZvciB0aGUgYnV0dG9uIHRoYXQgbW92ZXMgdG8gdGhlIGZpcnN0IHBhZ2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmZpcnN0UGFnZUxhYmVsID0gJ0ZpcnN0IHBhZ2UnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQSBsYWJlbCBmb3IgdGhlIGJ1dHRvbiB0aGF0IG1vdmVzIHRvIHRoZSBsYXN0IHBhZ2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmxhc3RQYWdlTGFiZWwgPSAnTGFzdCBwYWdlJzsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEEgbGFiZWwgZm9yIHRoZSByYW5nZSBvZiBpdGVtcyB3aXRoaW4gdGhlIGN1cnJlbnQgcGFnZSBhbmQgdGhlIGxlbmd0aCBvZiB0aGUgd2hvbGUgbGlzdC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZ2V0UmFuZ2VMYWJlbCA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBwYWdlCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcGFnZVNpemUKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBsZW5ndGgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChwYWdlLCBwYWdlU2l6ZSwgbGVuZ3RoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IDAgfHwgcGFnZVNpemUgPT0gMCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBgMCBvZiAke2xlbmd0aH1gOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbGVuZ3RoID0gTWF0aC5tYXgobGVuZ3RoLCAwKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYWdlICogcGFnZVNpemU7CiAgICAgICAgICAgICAgICAvLyBJZiB0aGUgc3RhcnQgaW5kZXggZXhjZWVkcyB0aGUgbGlzdCBsZW5ndGgsIGRvIG5vdCB0cnkgYW5kIGZpeCB0aGUgZW5kIGluZGV4IHRvIHRoZSBlbmQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHN0YXJ0SW5kZXggPCBsZW5ndGggPwogICAgICAgICAgICAgICAgICAgIE1hdGgubWluKHN0YXJ0SW5kZXggKyBwYWdlU2l6ZSwgbGVuZ3RoKSA6CiAgICAgICAgICAgICAgICAgICAgc3RhcnRJbmRleCArIHBhZ2VTaXplOwogICAgICAgICAgICAgICAgcmV0dXJuIGAke3N0YXJ0SW5kZXggKyAxfSDigJMgJHtlbmRJbmRleH0gb2YgJHtsZW5ndGh9YDsKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgfQogICAgTWF0UGFnaW5hdG9ySW50bC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFBhZ2luYXRvckludGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UGFnaW5hdG9ySW50bCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYXRQYWdpbmF0b3JJbnRsLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0UGFnaW5hdG9ySW50bF9GYWN0b3J5KCkgeyByZXR1cm4gbmV3IE1hdFBhZ2luYXRvckludGwoKTsgfSwgdG9rZW46IE1hdFBhZ2luYXRvckludGwsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcGFyZW50SW50bAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFUX1BBR0lOQVRPUl9JTlRMX1BST1ZJREVSX0ZBQ1RPUlkocGFyZW50SW50bCkgewogICAgICAgIHJldHVybiBwYXJlbnRJbnRsIHx8IG5ldyBNYXRQYWdpbmF0b3JJbnRsKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX1BBR0lOQVRPUl9JTlRMX1BST1ZJREVSID0gewogICAgICAgIC8vIElmIHRoZXJlIGlzIGFscmVhZHkgYW4gTWF0UGFnaW5hdG9ySW50bCBhdmFpbGFibGUsIHVzZSB0aGF0LiBPdGhlcndpc2UsIHByb3ZpZGUgYSBuZXcgb25lLgogICAgICAgIHByb3ZpZGU6IE1hdFBhZ2luYXRvckludGwsCiAgICAgICAgZGVwczogW1tuZXcgT3B0aW9uYWwoKSwgbmV3IFNraXBTZWxmKCksIE1hdFBhZ2luYXRvckludGxdXSwKICAgICAgICB1c2VGYWN0b3J5OiBNQVRfUEFHSU5BVE9SX0lOVExfUFJPVklERVJfRkFDVE9SWQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9wYWdpbmF0b3IvcGFnaW5hdG9yLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhlIGRlZmF1bHQgcGFnZSBzaXplIGlmIHRoZXJlIGlzIG5vIHBhZ2Ugc2l6ZSBhbmQgdGhlcmUgYXJlIG5vIHByb3ZpZGVkIHBhZ2Ugc2l6ZSBvcHRpb25zLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IERFRkFVTFRfUEFHRV9TSVpFID0gNTA7CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb3ZpZGUgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIHBhZ2luYXRvciBtb2R1bGUuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX1BBR0lOQVRPUl9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01BVF9QQUdJTkFUT1JfREVGQVVMVF9PUFRJT05TJyk7CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdFBhZ2luYXRvci4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0UGFnaW5hdG9yQmFzZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0UGFnaW5hdG9yQmFzZSA9IG1peGluRGlzYWJsZWQobWl4aW5Jbml0aWFsaXplZChNYXRQYWdpbmF0b3JCYXNlKSk7CiAgICAvKioKICAgICAqIENvbXBvbmVudCB0byBwcm92aWRlIG5hdmlnYXRpb24gYmV0d2VlbiBwYWdlZCBpbmZvcm1hdGlvbi4gRGlzcGxheXMgdGhlIHNpemUgb2YgdGhlIGN1cnJlbnQKICAgICAqIHBhZ2UsIHVzZXItc2VsZWN0YWJsZSBvcHRpb25zIHRvIGNoYW5nZSB0aGF0IHNpemUsIHdoYXQgaXRlbXMgYXJlIGJlaW5nIHNob3duLCBhbmQKICAgICAqIG5hdmlnYXRpb25hbCBidXR0b24gdG8gZ28gdG8gdGhlIHByZXZpb3VzIG9yIG5leHQgcGFnZS4KICAgICAqLwogICAgY2xhc3MgTWF0UGFnaW5hdG9yIGV4dGVuZHMgX01hdFBhZ2luYXRvckJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2ludGwKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2ludGwsIF9jaGFuZ2VEZXRlY3RvclJlZiwgZGVmYXVsdHMpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5faW50bCA9IF9pbnRsOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgdGhpcy5fcGFnZUluZGV4ID0gMDsKICAgICAgICAgICAgdGhpcy5fbGVuZ3RoID0gMDsKICAgICAgICAgICAgdGhpcy5fcGFnZVNpemVPcHRpb25zID0gW107CiAgICAgICAgICAgIHRoaXMuX2hpZGVQYWdlU2l6ZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9zaG93Rmlyc3RMYXN0QnV0dG9ucyA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBwYWdpbmF0b3IgY2hhbmdlcyB0aGUgcGFnZSBzaXplIG9yIHBhZ2UgaW5kZXguCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnBhZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuX2ludGxDaGFuZ2VzID0gX2ludGwuY2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCkpKTsKICAgICAgICAgICAgaWYgKGRlZmF1bHRzKSB7CiAgICAgICAgICAgICAgICBjb25zdCB7IHBhZ2VTaXplLCBwYWdlU2l6ZU9wdGlvbnMsIGhpZGVQYWdlU2l6ZSwgc2hvd0ZpcnN0TGFzdEJ1dHRvbnMgfSA9IGRlZmF1bHRzOwogICAgICAgICAgICAgICAgaWYgKHBhZ2VTaXplICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9wYWdlU2l6ZSA9IHBhZ2VTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBhZ2VTaXplT3B0aW9ucyAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGFnZVNpemVPcHRpb25zID0gcGFnZVNpemVPcHRpb25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGhpZGVQYWdlU2l6ZSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGlkZVBhZ2VTaXplID0gaGlkZVBhZ2VTaXplOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHNob3dGaXJzdExhc3RCdXR0b25zICE9IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zaG93Rmlyc3RMYXN0QnV0dG9ucyA9IHNob3dGaXJzdExhc3RCdXR0b25zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB6ZXJvLWJhc2VkIHBhZ2UgaW5kZXggb2YgdGhlIGRpc3BsYXllZCBsaXN0IG9mIGl0ZW1zLiBEZWZhdWx0ZWQgdG8gMC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBwYWdlSW5kZXgoKSB7IHJldHVybiB0aGlzLl9wYWdlSW5kZXg7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcGFnZUluZGV4KHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3BhZ2VJbmRleCA9IE1hdGgubWF4KGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSwgMCk7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgbGVuZ3RoIG9mIHRoZSB0b3RhbCBudW1iZXIgb2YgaXRlbXMgdGhhdCBhcmUgYmVpbmcgcGFnaW5hdGVkLiBEZWZhdWx0ZWQgdG8gMC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBsZW5ndGgoKSB7IHJldHVybiB0aGlzLl9sZW5ndGg7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbGVuZ3RoKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2xlbmd0aCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE51bWJlciBvZiBpdGVtcyB0byBkaXNwbGF5IG9uIGEgcGFnZS4gQnkgZGVmYXVsdCBzZXQgdG8gNTAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGFnZVNpemUoKSB7IHJldHVybiB0aGlzLl9wYWdlU2l6ZTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBwYWdlU2l6ZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9wYWdlU2l6ZSA9IE1hdGgubWF4KGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKSwgMCk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZURpc3BsYXllZFBhZ2VTaXplT3B0aW9ucygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc2V0IG9mIHByb3ZpZGVkIHBhZ2Ugc2l6ZSBvcHRpb25zIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGFnZVNpemVPcHRpb25zKCkgeyByZXR1cm4gdGhpcy5fcGFnZVNpemVPcHRpb25zOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHBhZ2VTaXplT3B0aW9ucyh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9wYWdlU2l6ZU9wdGlvbnMgPSAodmFsdWUgfHwgW10pLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcCA9PiBjb2VyY2VOdW1iZXJQcm9wZXJ0eShwKSkpOwogICAgICAgICAgICB0aGlzLl91cGRhdGVEaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byBoaWRlIHRoZSBwYWdlIHNpemUgc2VsZWN0aW9uIFVJIGZyb20gdGhlIHVzZXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaGlkZVBhZ2VTaXplKCkgeyByZXR1cm4gdGhpcy5faGlkZVBhZ2VTaXplOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGhpZGVQYWdlU2l6ZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9oaWRlUGFnZVNpemUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRvIHNob3cgdGhlIGZpcnN0L2xhc3QgYnV0dG9ucyBVSSB0byB0aGUgdXNlci4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzaG93Rmlyc3RMYXN0QnV0dG9ucygpIHsgcmV0dXJuIHRoaXMuX3Nob3dGaXJzdExhc3RCdXR0b25zOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHNob3dGaXJzdExhc3RCdXR0b25zKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3Nob3dGaXJzdExhc3RCdXR0b25zID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl91cGRhdGVEaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMoKTsKICAgICAgICAgICAgdGhpcy5fbWFya0luaXRpYWxpemVkKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuX2ludGxDaGFuZ2VzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFkdmFuY2VzIHRvIHRoZSBuZXh0IHBhZ2UgaWYgaXQgZXhpc3RzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmV4dFBhZ2UoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5oYXNOZXh0UGFnZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4OwogICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCsrOwogICAgICAgICAgICB0aGlzLl9lbWl0UGFnZUV2ZW50KHByZXZpb3VzUGFnZUluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBwYWdlIGlmIGl0IGV4aXN0cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHByZXZpb3VzUGFnZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmhhc1ByZXZpb3VzUGFnZSgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2aW91c1BhZ2VJbmRleCA9IHRoaXMucGFnZUluZGV4OwogICAgICAgICAgICB0aGlzLnBhZ2VJbmRleC0tOwogICAgICAgICAgICB0aGlzLl9lbWl0UGFnZUV2ZW50KHByZXZpb3VzUGFnZUluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZSB0byB0aGUgZmlyc3QgcGFnZSBpZiBub3QgYWxyZWFkeSB0aGVyZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpcnN0UGFnZSgpIHsKICAgICAgICAgICAgLy8gaGFzUHJldmlvdXNQYWdlIGJlaW5nIGZhbHNlIGltcGxpZXMgYXQgdGhlIHN0YXJ0CiAgICAgICAgICAgIGlmICghdGhpcy5oYXNQcmV2aW91c1BhZ2UoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSB0aGlzLnBhZ2VJbmRleDsKICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSAwOwogICAgICAgICAgICB0aGlzLl9lbWl0UGFnZUV2ZW50KHByZXZpb3VzUGFnZUluZGV4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTW92ZSB0byB0aGUgbGFzdCBwYWdlIGlmIG5vdCBhbHJlYWR5IHRoZXJlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbGFzdFBhZ2UoKSB7CiAgICAgICAgICAgIC8vIGhhc05leHRQYWdlIGJlaW5nIGZhbHNlIGltcGxpZXMgYXQgdGhlIGVuZAogICAgICAgICAgICBpZiAoIXRoaXMuaGFzTmV4dFBhZ2UoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldmlvdXNQYWdlSW5kZXggPSB0aGlzLnBhZ2VJbmRleDsKICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXggPSB0aGlzLmdldE51bWJlck9mUGFnZXMoKSAtIDE7CiAgICAgICAgICAgIHRoaXMuX2VtaXRQYWdlRXZlbnQocHJldmlvdXNQYWdlSW5kZXgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZXJlIGlzIGEgcHJldmlvdXMgcGFnZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhc1ByZXZpb3VzUGFnZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFnZUluZGV4ID49IDEgJiYgdGhpcy5wYWdlU2l6ZSAhPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZXJlIGlzIGEgbmV4dCBwYWdlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFzTmV4dFBhZ2UoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWF4UGFnZUluZGV4ID0gdGhpcy5nZXROdW1iZXJPZlBhZ2VzKCkgLSAxOwogICAgICAgICAgICByZXR1cm4gdGhpcy5wYWdlSW5kZXggPCBtYXhQYWdlSW5kZXggJiYgdGhpcy5wYWdlU2l6ZSAhPSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBwYWdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0TnVtYmVyT2ZQYWdlcygpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VTaXplKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKHRoaXMubGVuZ3RoIC8gdGhpcy5wYWdlU2l6ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoYW5nZXMgdGhlIHBhZ2Ugc2l6ZSBzbyB0aGF0IHRoZSBmaXJzdCBpdGVtIGRpc3BsYXllZCBvbiB0aGUgcGFnZSB3aWxsIHN0aWxsIGJlCiAgICAgICAgICogZGlzcGxheWVkIHVzaW5nIHRoZSBuZXcgcGFnZSBzaXplLgogICAgICAgICAqCiAgICAgICAgICogRm9yIGV4YW1wbGUsIGlmIHRoZSBwYWdlIHNpemUgaXMgMTAgYW5kIG9uIHRoZSBzZWNvbmQgcGFnZSAoaXRlbXMgaW5kZXhlZCAxMC0xOSkgdGhlbgogICAgICAgICAqIHN3aXRjaGluZyBzbyB0aGF0IHRoZSBwYWdlIHNpemUgaXMgNSB3aWxsIHNldCB0aGUgdGhpcmQgcGFnZSBhcyB0aGUgY3VycmVudCBwYWdlIHNvCiAgICAgICAgICogdGhhdCB0aGUgMTB0aCBpdGVtIHdpbGwgc3RpbGwgYmUgZGlzcGxheWVkLgogICAgICAgICAqIEBwYXJhbSB7P30gcGFnZVNpemUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jaGFuZ2VQYWdlU2l6ZShwYWdlU2l6ZSkgewogICAgICAgICAgICAvLyBDdXJyZW50IHBhZ2UgbmVlZHMgdG8gYmUgdXBkYXRlZCB0byByZWZsZWN0IHRoZSBuZXcgcGFnZSBzaXplLiBOYXZpZ2F0ZSB0byB0aGUgcGFnZQogICAgICAgICAgICAvLyBjb250YWluaW5nIHRoZSBwcmV2aW91cyBwYWdlJ3MgZmlyc3QgaXRlbS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5wYWdlSW5kZXggKiB0aGlzLnBhZ2VTaXplOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHByZXZpb3VzUGFnZUluZGV4ID0gdGhpcy5wYWdlSW5kZXg7CiAgICAgICAgICAgIHRoaXMucGFnZUluZGV4ID0gTWF0aC5mbG9vcihzdGFydEluZGV4IC8gcGFnZVNpemUpIHx8IDA7CiAgICAgICAgICAgIHRoaXMucGFnZVNpemUgPSBwYWdlU2l6ZTsKICAgICAgICAgICAgdGhpcy5fZW1pdFBhZ2VFdmVudChwcmV2aW91c1BhZ2VJbmRleCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBidXR0b25zIGZvciBnb2luZyBmb3J3YXJkcyBzaG91bGQgYmUgZGlzYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbmV4dEJ1dHRvbnNEaXNhYmxlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGlzYWJsZWQgfHwgIXRoaXMuaGFzTmV4dFBhZ2UoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGJ1dHRvbnMgZm9yIGdvaW5nIGJhY2t3YXJkcyBzaG91bGQgYmUgZGlzYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcHJldmlvdXNCdXR0b25zRGlzYWJsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8ICF0aGlzLmhhc1ByZXZpb3VzUGFnZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBsaXN0IG9mIHBhZ2Ugc2l6ZSBvcHRpb25zIHRvIGRpc3BsYXkgdG8gdGhlIHVzZXIuIEluY2x1ZGVzIG1ha2luZyBzdXJlIHRoYXQKICAgICAgICAgKiB0aGUgcGFnZSBzaXplIGlzIGFuIG9wdGlvbiBhbmQgdGhhdCB0aGUgbGlzdCBpcyBzb3J0ZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVEaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5faW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiBubyBwYWdlIHNpemUgaXMgcHJvdmlkZWQsIHVzZSB0aGUgZmlyc3QgcGFnZSBzaXplIG9wdGlvbiBvciB0aGUgZGVmYXVsdCBwYWdlIHNpemUuCiAgICAgICAgICAgIGlmICghdGhpcy5wYWdlU2l6ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fcGFnZVNpemUgPSB0aGlzLnBhZ2VTaXplT3B0aW9ucy5sZW5ndGggIT0gMCA/CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlU2l6ZU9wdGlvbnNbMF0gOgogICAgICAgICAgICAgICAgICAgIERFRkFVTFRfUEFHRV9TSVpFOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucyA9IHRoaXMucGFnZVNpemVPcHRpb25zLnNsaWNlKCk7CiAgICAgICAgICAgIGlmICh0aGlzLl9kaXNwbGF5ZWRQYWdlU2l6ZU9wdGlvbnMuaW5kZXhPZih0aGlzLnBhZ2VTaXplKSA9PT0gLTEpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BsYXllZFBhZ2VTaXplT3B0aW9ucy5wdXNoKHRoaXMucGFnZVNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFNvcnQgdGhlIG51bWJlcnMgdXNpbmcgYSBudW1iZXItc3BlY2lmaWMgc29ydCBmdW5jdGlvbi4KICAgICAgICAgICAgdGhpcy5fZGlzcGxheWVkUGFnZVNpemVPcHRpb25zLnNvcnQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGEKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYSwgYikgPT4gYSAtIGIpKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIGFuIGV2ZW50IG5vdGlmeWluZyB0aGF0IGEgY2hhbmdlIG9mIHRoZSBwYWdpbmF0b3IncyBwcm9wZXJ0aWVzIGhhcyBiZWVuIHRyaWdnZXJlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcHJldmlvdXNQYWdlSW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9lbWl0UGFnZUV2ZW50KHByZXZpb3VzUGFnZUluZGV4KSB7CiAgICAgICAgICAgIHRoaXMucGFnZS5lbWl0KHsKICAgICAgICAgICAgICAgIHByZXZpb3VzUGFnZUluZGV4LAogICAgICAgICAgICAgICAgcGFnZUluZGV4OiB0aGlzLnBhZ2VJbmRleCwKICAgICAgICAgICAgICAgIHBhZ2VTaXplOiB0aGlzLnBhZ2VTaXplLAogICAgICAgICAgICAgICAgbGVuZ3RoOiB0aGlzLmxlbmd0aAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBNYXRQYWdpbmF0b3IuybVmYWMgPSBmdW5jdGlvbiBNYXRQYWdpbmF0b3JfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UGFnaW5hdG9yKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdFBhZ2luYXRvckludGwpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfUEFHSU5BVE9SX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9OwogICAgTWF0UGFnaW5hdG9yLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFBhZ2luYXRvciwgc2VsZWN0b3JzOiBbWyJtYXQtcGFnaW5hdG9yIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXBhZ2luYXRvciJdLCBpbnB1dHM6IHsgZGlzYWJsZWQ6ICJkaXNhYmxlZCIsIHBhZ2VJbmRleDogInBhZ2VJbmRleCIsIGxlbmd0aDogImxlbmd0aCIsIHBhZ2VTaXplOiAicGFnZVNpemUiLCBwYWdlU2l6ZU9wdGlvbnM6ICJwYWdlU2l6ZU9wdGlvbnMiLCBoaWRlUGFnZVNpemU6ICJoaWRlUGFnZVNpemUiLCBzaG93Rmlyc3RMYXN0QnV0dG9uczogInNob3dGaXJzdExhc3RCdXR0b25zIiwgY29sb3I6ICJjb2xvciIgfSwgb3V0cHV0czogeyBwYWdlOiAicGFnZSIgfSwgZXhwb3J0QXM6IFsibWF0UGFnaW5hdG9yIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGRlY2xzOiAxNCwgdmFyczogMTQsIGNvbnN0czogW1sxLCAibWF0LXBhZ2luYXRvci1vdXRlci1jb250YWluZXIiXSwgWzEsICJtYXQtcGFnaW5hdG9yLWNvbnRhaW5lciJdLCBbImNsYXNzIiwgIm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplIiwgNCwgIm5nSWYiXSwgWzEsICJtYXQtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnMiXSwgWzEsICJtYXQtcGFnaW5hdG9yLXJhbmdlLWxhYmVsIl0sIFsibWF0LWljb24tYnV0dG9uIiwgIiIsICJ0eXBlIiwgImJ1dHRvbiIsICJjbGFzcyIsICJtYXQtcGFnaW5hdG9yLW5hdmlnYXRpb24tZmlyc3QiLCAzLCAibWF0VG9vbHRpcCIsICJtYXRUb29sdGlwRGlzYWJsZWQiLCAibWF0VG9vbHRpcFBvc2l0aW9uIiwgImRpc2FibGVkIiwgImNsaWNrIiwgNCwgIm5nSWYiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgInR5cGUiLCAiYnV0dG9uIiwgMSwgIm1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1wcmV2aW91cyIsIDMsICJtYXRUb29sdGlwIiwgIm1hdFRvb2x0aXBEaXNhYmxlZCIsICJtYXRUb29sdGlwUG9zaXRpb24iLCAiZGlzYWJsZWQiLCAiY2xpY2siXSwgWyJ2aWV3Qm94IiwgIjAgMCAyNCAyNCIsICJmb2N1c2FibGUiLCAiZmFsc2UiLCAxLCAibWF0LXBhZ2luYXRvci1pY29uIl0sIFsiZCIsICJNMTUuNDEgNy40MUwxNCA2bC02IDYgNiA2IDEuNDEtMS40MUwxMC44MyAxMnoiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgInR5cGUiLCAiYnV0dG9uIiwgMSwgIm1hdC1wYWdpbmF0b3ItbmF2aWdhdGlvbi1uZXh0IiwgMywgIm1hdFRvb2x0aXAiLCAibWF0VG9vbHRpcERpc2FibGVkIiwgIm1hdFRvb2x0aXBQb3NpdGlvbiIsICJkaXNhYmxlZCIsICJjbGljayJdLCBbImQiLCAiTTEwIDZMOC41OSA3LjQxIDEzLjE3IDEybC00LjU4IDQuNTlMMTAgMThsNi02eiJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidHlwZSIsICJidXR0b24iLCAiY2xhc3MiLCAibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWxhc3QiLCAzLCAibWF0VG9vbHRpcCIsICJtYXRUb29sdGlwRGlzYWJsZWQiLCAibWF0VG9vbHRpcFBvc2l0aW9uIiwgImRpc2FibGVkIiwgImNsaWNrIiwgNCwgIm5nSWYiXSwgWzEsICJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSJdLCBbMSwgIm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVsIl0sIFsiY2xhc3MiLCAibWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0IiwgMywgImNvbG9yIiwgNCwgIm5nSWYiXSwgWyJjbGFzcyIsICJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS12YWx1ZSIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0IiwgMywgImNvbG9yIl0sIFszLCAidmFsdWUiLCAiZGlzYWJsZWQiLCAiYXJpYS1sYWJlbCIsICJzZWxlY3Rpb25DaGFuZ2UiXSwgWzMsICJ2YWx1ZSIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFszLCAidmFsdWUiXSwgWzEsICJtYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZS12YWx1ZSJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidHlwZSIsICJidXR0b24iLCAxLCAibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWZpcnN0IiwgMywgIm1hdFRvb2x0aXAiLCAibWF0VG9vbHRpcERpc2FibGVkIiwgIm1hdFRvb2x0aXBQb3NpdGlvbiIsICJkaXNhYmxlZCIsICJjbGljayJdLCBbImQiLCAiTTE4LjQxIDE2LjU5TDEzLjgyIDEybDQuNTktNC41OUwxNyA2bC02IDYgNiA2ek02IDZoMnYxMkg2eiJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidHlwZSIsICJidXR0b24iLCAxLCAibWF0LXBhZ2luYXRvci1uYXZpZ2F0aW9uLWxhc3QiLCAzLCAibWF0VG9vbHRpcCIsICJtYXRUb29sdGlwRGlzYWJsZWQiLCAibWF0VG9vbHRpcFBvc2l0aW9uIiwgImRpc2FibGVkIiwgImNsaWNrIl0sIFsiZCIsICJNNS41OSA3LjQxTDEwLjE4IDEybC00LjU5IDQuNTlMNyAxOGw2LTYtNi02ek0xNiA2aDJ2MTJoLTJ6Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0UGFnaW5hdG9yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBNYXRQYWdpbmF0b3JfZGl2XzJfVGVtcGxhdGUsIDUsIDMsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImRpdiIsIDQpOwogICAgICAgICAgICDJtcm1dGV4dCg1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDYsIE1hdFBhZ2luYXRvcl9idXR0b25fNl9UZW1wbGF0ZSwgMywgNSwgImJ1dHRvbiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJidXR0b24iLCA2KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFBhZ2luYXRvcl9UZW1wbGF0ZV9idXR0b25fY2xpY2tfN19saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5wcmV2aW91c1BhZ2UoKTsgfSk7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg4LCAic3ZnIiwgNyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDksICJwYXRoIiwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VIVE1MKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJidXR0b24iLCA5KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1hdFBhZ2luYXRvcl9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMTBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgubmV4dFBhZ2UoKTsgfSk7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMSwgInN2ZyIsIDcpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxMiwgInBhdGgiLCAxMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxMywgTWF0UGFnaW5hdG9yX2J1dHRvbl8xM19UZW1wbGF0ZSwgMywgNSwgImJ1dHRvbiIsIDExKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFjdHguaGlkZVBhZ2VTaXplKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4Ll9pbnRsLmdldFJhbmdlTGFiZWwoY3R4LnBhZ2VJbmRleCwgY3R4LnBhZ2VTaXplLCBjdHgubGVuZ3RoKSwgIiAiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zaG93Rmlyc3RMYXN0QnV0dG9ucyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFRvb2x0aXAiLCBjdHguX2ludGwucHJldmlvdXNQYWdlTGFiZWwpKCJtYXRUb29sdGlwRGlzYWJsZWQiLCBjdHguX3ByZXZpb3VzQnV0dG9uc0Rpc2FibGVkKCkpKCJtYXRUb29sdGlwUG9zaXRpb24iLCAiYWJvdmUiKSgiZGlzYWJsZWQiLCBjdHguX3ByZXZpb3VzQnV0dG9uc0Rpc2FibGVkKCkpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgY3R4Ll9pbnRsLnByZXZpb3VzUGFnZUxhYmVsKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0VG9vbHRpcCIsIGN0eC5faW50bC5uZXh0UGFnZUxhYmVsKSgibWF0VG9vbHRpcERpc2FibGVkIiwgY3R4Ll9uZXh0QnV0dG9uc0Rpc2FibGVkKCkpKCJtYXRUb29sdGlwUG9zaXRpb24iLCAiYWJvdmUiKSgiZGlzYWJsZWQiLCBjdHguX25leHRCdXR0b25zRGlzYWJsZWQoKSk7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoImFyaWEtbGFiZWwiLCBjdHguX2ludGwubmV4dFBhZ2VMYWJlbCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguc2hvd0ZpcnN0TGFzdEJ1dHRvbnMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIE1hdEJ1dHRvbiwgTWF0VG9vbHRpcCwgTWF0Rm9ybUZpZWxkLCBNYXRTZWxlY3QsIE5nRm9yT2YsIE1hdE9wdGlvbl0sIHN0eWxlczogWyIubWF0LXBhZ2luYXRvcntkaXNwbGF5OmJsb2NrfS5tYXQtcGFnaW5hdG9yLW91dGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXh9Lm1hdC1wYWdpbmF0b3ItY29udGFpbmVye2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmZsZXgtZW5kO21pbi1oZWlnaHQ6NTZweDtwYWRkaW5nOjAgOHB4O2ZsZXgtd3JhcDp3cmFwLXJldmVyc2U7d2lkdGg6MTAwJX0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemV7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmJhc2VsaW5lO21hcmdpbi1yaWdodDo4cHh9W2Rpcj1ydGxdIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZXttYXJnaW4tcmlnaHQ6MDttYXJnaW4tbGVmdDo4cHh9Lm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLWxhYmVse21hcmdpbjowIDRweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0e21hcmdpbjo2cHggNHB4IDAgNHB4O3dpZHRoOjU2cHh9Lm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmV7d2lkdGg6NjRweH0ubWF0LXBhZ2luYXRvci1wYWdlLXNpemUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbHt3aWR0aDo2NHB4fS5tYXQtcGFnaW5hdG9yLXJhbmdlLWxhYmVse21hcmdpbjowIDMycHggMCAyNHB4fS5tYXQtcGFnaW5hdG9yLXJhbmdlLWFjdGlvbnN7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcn0ubWF0LXBhZ2luYXRvci1pY29ue3dpZHRoOjI4cHg7ZmlsbDpjdXJyZW50Q29sb3J9W2Rpcj1ydGxdIC5tYXQtcGFnaW5hdG9yLWljb257dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0UGFnaW5hdG9yLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogTWF0UGFnaW5hdG9ySW50bCB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfUEFHSU5BVE9SX0RFRkFVTFRfT1BUSU9OUyxdIH1dIH0KICAgIF07CiAgICBNYXRQYWdpbmF0b3IucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY29sb3I6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBhZ2VJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbGVuZ3RoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBwYWdlU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcGFnZVNpemVPcHRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBoaWRlUGFnZVNpemU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNob3dGaXJzdExhc3RCdXR0b25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBwYWdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvcGFnaW5hdG9yL3BhZ2luYXRvci1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0UGFnaW5hdG9yTW9kdWxlIHsKICAgIH0KICAgIE1hdFBhZ2luYXRvck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFBhZ2luYXRvck1vZHVsZSB9KTsKICAgIE1hdFBhZ2luYXRvck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFBhZ2luYXRvck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRQYWdpbmF0b3JNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW01BVF9QQUdJTkFUT1JfSU5UTF9QUk9WSURFUl0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRTZWxlY3RNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRUb29sdGlwTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdFBhZ2luYXRvck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRQYWdpbmF0b3JdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgIE1hdFNlbGVjdE1vZHVsZSwKICAgICAgICAgICAgTWF0VG9vbHRpcE1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRQYWdpbmF0b3JdOyB9IH0pOyB9KSgpOwoKICAgIGZ1bmN0aW9uIE1hdFByb2dyZXNzU3Bpbm5lcl9fc3ZnX2NpcmNsZV8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiY2lyY2xlIiwgMyk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJhbmltYXRpb24tbmFtZSIsICJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLSIgKyBjdHhfcjAuZGlhbWV0ZXIpKCJzdHJva2UtZGFzaG9mZnNldCIsIGN0eF9yMC5fc3Ryb2tlRGFzaE9mZnNldCwgInB4IikoInN0cm9rZS1kYXNoYXJyYXkiLCBjdHhfcjAuX3N0cm9rZUNpcmN1bWZlcmVuY2UsICJweCIpKCJzdHJva2Utd2lkdGgiLCBjdHhfcjAuX2NpcmNsZVN0cm9rZVdpZHRoLCAiJSIpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoInIiLCBjdHhfcjAuX2NpcmNsZVJhZGl1cyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdFByb2dyZXNzU3Bpbm5lcl9fc3ZnX2NpcmNsZV8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiY2lyY2xlIiwgMyk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJzdHJva2UtZGFzaG9mZnNldCIsIGN0eF9yMS5fc3Ryb2tlRGFzaE9mZnNldCwgInB4IikoInN0cm9rZS1kYXNoYXJyYXkiLCBjdHhfcjEuX3N0cm9rZUNpcmN1bWZlcmVuY2UsICJweCIpKCJzdHJva2Utd2lkdGgiLCBjdHhfcjEuX2NpcmNsZVN0cm9rZVdpZHRoLCAiJSIpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoInIiLCBjdHhfcjEuX2NpcmNsZVJhZGl1cyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1hdFNwaW5uZXJfX3N2Z19jaXJjbGVfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1bmFtZXNwYWNlU1ZHKCk7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgImNpcmNsZSIsIDMpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXN0eWxlUHJvcCgiYW5pbWF0aW9uLW5hbWUiLCAibWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS0iICsgY3R4X3IwLmRpYW1ldGVyKSgic3Ryb2tlLWRhc2hvZmZzZXQiLCBjdHhfcjAuX3N0cm9rZURhc2hPZmZzZXQsICJweCIpKCJzdHJva2UtZGFzaGFycmF5IiwgY3R4X3IwLl9zdHJva2VDaXJjdW1mZXJlbmNlLCAicHgiKSgic3Ryb2tlLXdpZHRoIiwgY3R4X3IwLl9jaXJjbGVTdHJva2VXaWR0aCwgIiUiKTsKICAgICAgICDJtcm1YXR0cmlidXRlKCJyIiwgY3R4X3IwLl9jaXJjbGVSYWRpdXMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYXRTcGlubmVyX19zdmdfY2lyY2xlXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtW5hbWVzcGFjZVNWRygpOwogICAgICAgIMm1ybVlbGVtZW50KDAsICJjaXJjbGUiLCAzKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVzdHlsZVByb3AoInN0cm9rZS1kYXNob2Zmc2V0IiwgY3R4X3IxLl9zdHJva2VEYXNoT2Zmc2V0LCAicHgiKSgic3Ryb2tlLWRhc2hhcnJheSIsIGN0eF9yMS5fc3Ryb2tlQ2lyY3VtZmVyZW5jZSwgInB4IikoInN0cm9rZS13aWR0aCIsIGN0eF9yMS5fY2lyY2xlU3Ryb2tlV2lkdGgsICIlIik7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiciIsIGN0eF9yMS5fY2lyY2xlUmFkaXVzKTsKICAgIH0gfQogICAgY29uc3QgQkFTRV9TSVpFID0gMTAwOwogICAgLyoqCiAgICAgKiBCYXNlIHJlZmVyZW5jZSBzdHJva2Ugd2lkdGggb2YgdGhlIHNwaW5uZXIuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEJBU0VfU1RST0tFX1dJRFRIID0gMTA7CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdFByb2dyZXNzU3Bpbm5lci4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0UHJvZ3Jlc3NTcGlubmVyQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0UHJvZ3Jlc3NTcGlubmVyTWl4aW5CYXNlID0gbWl4aW5Db2xvcihNYXRQcm9ncmVzc1NwaW5uZXJCYXNlLCAncHJpbWFyeScpOwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdG8gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciBgbWF0LXByb2dyZXNzLXNwaW5uZXJgLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9QUk9HUkVTU19TUElOTkVSX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LXByb2dyZXNzLXNwaW5uZXItZGVmYXVsdC1vcHRpb25zJywgewogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiBNQVRfUFJPR1JFU1NfU1BJTk5FUl9ERUZBVUxUX09QVElPTlNfRkFDVE9SWSwKICAgIH0pOwogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFUX1BST0dSRVNTX1NQSU5ORVJfREVGQVVMVF9PUFRJT05TX0ZBQ1RPUlkoKSB7CiAgICAgICAgcmV0dXJuIHsgZGlhbWV0ZXI6IEJBU0VfU0laRSB9OwogICAgfQogICAgLy8gLjAwMDEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGlzIG5lY2Vzc2FyeSBpbiBvcmRlciB0byBhdm9pZCB1bndhbnRlZCBhbmltYXRpb24gZnJhbWVzCiAgICAvLyBmb3IgZXhhbXBsZSBiZWNhdXNlIHRoZSBhbmltYXRpb24gZHVyYXRpb24gaXMgNCBzZWNvbmRzLCAuMSUgYWNjb3VudHMgdG8gNG1zCiAgICAvLyB3aGljaCBhcmUgZW5vdWdoIHRvIHNlZSB0aGUgZmxpY2tlciBkZXNjcmliZWQgaW4KICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvaXNzdWVzLzg5ODQKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IElOREVURVJNSU5BVEVfQU5JTUFUSU9OX1RFTVBMQVRFID0gYAogQGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLURJQU1FVEVSIHsKICAgIDAlICAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZSgwKTsgfQogICAgMTIuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDApOyB9CiAgICAxMi41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH0KICAgIDI1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyk7IH0KCiAgICAyNS4wMDAxJSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMjcwZGVnKTsgfQogICAgMzcuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDI3MGRlZyk7IH0KICAgIDM3LjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgxNjEuNWRlZyk7IH0KICAgIDUwJSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpOyB9CgogICAgNTAuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoMTgwZGVnKTsgfQogICAgNjIuNSUgICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlKDE4MGRlZyk7IH0KICAgIDYyLjUwMDElICB7IHN0cm9rZS1kYXNob2Zmc2V0OiBFTkRfVkFMVUU7ICAgIHRyYW5zZm9ybTogcm90YXRlWCgxODBkZWcpIHJvdGF0ZSgyNTEuNWRlZyk7IH0KICAgIDc1JSAgICAgeyBzdHJva2UtZGFzaG9mZnNldDogU1RBUlRfVkFMVUU7ICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpOyB9CgogICAgNzUuMDAwMSUgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyB9CiAgICA4Ny41JSAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IEVORF9WQUxVRTsgICAgdHJhbnNmb3JtOiByb3RhdGUoOTBkZWcpOyB9CiAgICA4Ny41MDAxJSAgeyBzdHJva2UtZGFzaG9mZnNldDogRU5EX1ZBTFVFOyAgICB0cmFuc2Zvcm06IHJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpOyB9CiAgICAxMDAlICAgIHsgc3Ryb2tlLWRhc2hvZmZzZXQ6IFNUQVJUX1ZBTFVFOyAgdHJhbnNmb3JtOiByb3RhdGVYKDE4MGRlZykgcm90YXRlKDM0MS41ZGVnKTsgfQogIH0KYDsKICAgIC8qKgogICAgICogYDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5gIGNvbXBvbmVudC4KICAgICAqLwogICAgY2xhc3MgTWF0UHJvZ3Jlc3NTcGlubmVyIGV4dGVuZHMgX01hdFByb2dyZXNzU3Bpbm5lck1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gcGxhdGZvcm0KICAgICAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTW9kZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIHBsYXRmb3JtLCBfZG9jdW1lbnQsIGFuaW1hdGlvbk1vZGUsIGRlZmF1bHRzKSB7CiAgICAgICAgICAgIHN1cGVyKF9lbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgICAgICAgICAgdGhpcy5fZGlhbWV0ZXIgPSBCQVNFX1NJWkU7CiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gMDsKICAgICAgICAgICAgdGhpcy5fZmFsbGJhY2tBbmltYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE1vZGUgb2YgdGhlIHByb2dyZXNzIGNpcmNsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5tb2RlID0gJ2RldGVybWluYXRlJzsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0cmFja2VkRGlhbWV0ZXJzID0gTWF0UHJvZ3Jlc3NTcGlubmVyLl9kaWFtZXRlcnM7CiAgICAgICAgICAgIC8vIFRoZSBiYXNlIHNpemUgaXMgYWxyZWFkeSBpbnNlcnRlZCB2aWEgdGhlIGNvbXBvbmVudCdzIHN0cnVjdHVyYWwgc3R5bGVzLiBXZSBzdGlsbAogICAgICAgICAgICAvLyBuZWVkIHRvIHRyYWNrIGl0IHNvIHdlIGRvbid0IGVuZCB1cCBhZGRpbmcgdGhlIHNhbWUgc3R5bGVzIGFnYWluLgogICAgICAgICAgICBpZiAoIXRyYWNrZWREaWFtZXRlcnMuaGFzKF9kb2N1bWVudC5oZWFkKSkgewogICAgICAgICAgICAgICAgdHJhY2tlZERpYW1ldGVycy5zZXQoX2RvY3VtZW50LmhlYWQsIG5ldyBTZXQoW0JBU0VfU0laRV0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9mYWxsYmFja0FuaW1hdGlvbiA9IHBsYXRmb3JtLkVER0UgfHwgcGxhdGZvcm0uVFJJREVOVDsKICAgICAgICAgICAgdGhpcy5fbm9vcEFuaW1hdGlvbnMgPSBhbmltYXRpb25Nb2RlID09PSAnTm9vcEFuaW1hdGlvbnMnICYmCiAgICAgICAgICAgICAgICAoISFkZWZhdWx0cyAmJiAhZGVmYXVsdHMuX2ZvcmNlQW5pbWF0aW9ucyk7CiAgICAgICAgICAgIGlmIChkZWZhdWx0cykgewogICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzLmRpYW1ldGVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaWFtZXRlciA9IGRlZmF1bHRzLmRpYW1ldGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRzLnN0cm9rZVdpZHRoKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdHJva2VXaWR0aCA9IGRlZmF1bHRzLnN0cm9rZVdpZHRoOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkaWFtZXRlciBvZiB0aGUgcHJvZ3Jlc3Mgc3Bpbm5lciAod2lsbCBzZXQgd2lkdGggYW5kIGhlaWdodCBvZiBzdmcpLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpYW1ldGVyKCkgeyByZXR1cm4gdGhpcy5fZGlhbWV0ZXI7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNpemUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaWFtZXRlcihzaXplKSB7CiAgICAgICAgICAgIHRoaXMuX2RpYW1ldGVyID0gY29lcmNlTnVtYmVyUHJvcGVydHkoc2l6ZSk7CiAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgc2V0IGJlZm9yZSBgbmdPbkluaXRgLCB0aGUgc3R5bGUgcm9vdCBtYXkgbm90IGhhdmUgYmVlbiByZXNvbHZlZCB5ZXQuCiAgICAgICAgICAgIGlmICghdGhpcy5fZmFsbGJhY2tBbmltYXRpb24gJiYgdGhpcy5fc3R5bGVSb290KSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hdHRhY2hTdHlsZU5vZGUoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdHJva2Ugd2lkdGggb2YgdGhlIHByb2dyZXNzIHNwaW5uZXIuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc3Ryb2tlV2lkdGgoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9zdHJva2VXaWR0aCB8fCB0aGlzLmRpYW1ldGVyIC8gMTA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBzdHJva2VXaWR0aCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9zdHJva2VXaWR0aCA9IGNvZXJjZU51bWJlclByb3BlcnR5KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVmFsdWUgb2YgdGhlIHByb2dyZXNzIGNpcmNsZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCB2YWx1ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kZSA9PT0gJ2RldGVybWluYXRlJyA/IHRoaXMuX3ZhbHVlIDogMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHZhbHVlKG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3ZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMTAwLCBjb2VyY2VOdW1iZXJQcm9wZXJ0eShuZXdWYWx1ZSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50OwogICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgbmVlZCB0byBsb29rIHVwIHRoZSByb290IG5vZGUgaW4gbmdPbkluaXQsIHJhdGhlciB0aGFuIHRoZSBjb25zdHJ1Y3RvciwgYmVjYXVzZQogICAgICAgICAgICAvLyBBbmd1bGFyIHNlZW1zIHRvIGNyZWF0ZSB0aGUgZWxlbWVudCBvdXRzaWRlIHRoZSBzaGFkb3cgcm9vdCBhbmQgdGhlbiBtb3ZlcyBpdCBpbnNpZGUsIGlmIHRoZQogICAgICAgICAgICAvLyBub2RlIGlzIGluc2lkZSBhbiBgbmdJZmAgYW5kIGEgU2hhZG93RG9tLWVuY2Fwc3VsYXRlZCBjb21wb25lbnQuCiAgICAgICAgICAgIHRoaXMuX3N0eWxlUm9vdCA9IF9nZXRTaGFkb3dSb290KGVsZW1lbnQpIHx8IHRoaXMuX2RvY3VtZW50LmhlYWQ7CiAgICAgICAgICAgIHRoaXMuX2F0dGFjaFN0eWxlTm9kZSgpOwogICAgICAgICAgICAvLyBPbiBJRSBhbmQgRWRnZSwgd2UgY2FuJ3QgYW5pbWF0ZSB0aGUgYHN0cm9rZS1kYXNob2Zmc2V0YAogICAgICAgICAgICAvLyByZWxpYWJseSBzbyB3ZSBmYWxsIGJhY2sgdG8gYSBub24tc3BlYyBhbmltYXRpb24uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYW5pbWF0aW9uQ2xhc3MgPSBgbWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZSR7dGhpcy5fZmFsbGJhY2tBbmltYXRpb24gPyAnLWZhbGxiYWNrJyA6ICcnfS1hbmltYXRpb25gOwogICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYW5pbWF0aW9uQ2xhc3MpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgcmFkaXVzIG9mIHRoZSBzcGlubmVyLCBhZGp1c3RlZCBmb3Igc3Ryb2tlIHdpZHRoLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF9jaXJjbGVSYWRpdXMoKSB7CiAgICAgICAgICAgIHJldHVybiAodGhpcy5kaWFtZXRlciAtIEJBU0VfU1RST0tFX1dJRFRIKSAvIDI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB2aWV3IGJveCBvZiB0aGUgc3Bpbm5lcidzIHN2ZyBlbGVtZW50LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF92aWV3Qm94KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdCb3ggPSB0aGlzLl9jaXJjbGVSYWRpdXMgKiAyICsgdGhpcy5zdHJva2VXaWR0aDsKICAgICAgICAgICAgcmV0dXJuIGAwIDAgJHt2aWV3Qm94fSAke3ZpZXdCb3h9YDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHN0cm9rZSBjaXJjdW1mZXJlbmNlIG9mIHRoZSBzdmcgY2lyY2xlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IF9zdHJva2VDaXJjdW1mZXJlbmNlKCkgewogICAgICAgICAgICByZXR1cm4gMiAqIE1hdGguUEkgKiB0aGlzLl9jaXJjbGVSYWRpdXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBkYXNoIG9mZnNldCBvZiB0aGUgc3ZnIGNpcmNsZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBfc3Ryb2tlRGFzaE9mZnNldCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMubW9kZSA9PT0gJ2RldGVybWluYXRlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNpcmN1bWZlcmVuY2UgKiAoMTAwIC0gdGhpcy5fdmFsdWUpIC8gMTAwOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEluIGZhbGxiYWNrIG1vZGUgc2V0IHRoZSBjaXJjbGUgdG8gODAlIGFuZCByb3RhdGUgaXQgd2l0aCBDU1MuCiAgICAgICAgICAgIGlmICh0aGlzLl9mYWxsYmFja0FuaW1hdGlvbiAmJiB0aGlzLm1vZGUgPT09ICdpbmRldGVybWluYXRlJykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0cm9rZUNpcmN1bWZlcmVuY2UgKiAwLjI7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN0cm9rZSB3aWR0aCBvZiB0aGUgY2lyY2xlIGluIHBlcmNlbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgX2NpcmNsZVN0cm9rZVdpZHRoKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5zdHJva2VXaWR0aCAvIHRoaXMuZGlhbWV0ZXIgKiAxMDA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIER5bmFtaWNhbGx5IGdlbmVyYXRlcyBhIHN0eWxlIHRhZyBjb250YWluaW5nIHRoZSBjb3JyZWN0IGFuaW1hdGlvbiBmb3IgdGhpcyBkaWFtZXRlci4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2F0dGFjaFN0eWxlTm9kZSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdHlsZVJvb3QgPSB0aGlzLl9zdHlsZVJvb3Q7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY3VycmVudERpYW1ldGVyID0gdGhpcy5fZGlhbWV0ZXI7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGlhbWV0ZXJzID0gTWF0UHJvZ3Jlc3NTcGlubmVyLl9kaWFtZXRlcnM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGRpYW1ldGVyc0ZvckVsZW1lbnQgPSBkaWFtZXRlcnMuZ2V0KHN0eWxlUm9vdCk7CiAgICAgICAgICAgIGlmICghZGlhbWV0ZXJzRm9yRWxlbWVudCB8fCAhZGlhbWV0ZXJzRm9yRWxlbWVudC5oYXMoY3VycmVudERpYW1ldGVyKSkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc3R5bGVUYWcgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpOwogICAgICAgICAgICAgICAgc3R5bGVUYWcuc2V0QXR0cmlidXRlKCdtYXQtc3Bpbm5lci1hbmltYXRpb24nLCBjdXJyZW50RGlhbWV0ZXIgKyAnJyk7CiAgICAgICAgICAgICAgICBzdHlsZVRhZy50ZXh0Q29udGVudCA9IHRoaXMuX2dldEFuaW1hdGlvblRleHQoKTsKICAgICAgICAgICAgICAgIHN0eWxlUm9vdC5hcHBlbmRDaGlsZChzdHlsZVRhZyk7CiAgICAgICAgICAgICAgICBpZiAoIWRpYW1ldGVyc0ZvckVsZW1lbnQpIHsKICAgICAgICAgICAgICAgICAgICBkaWFtZXRlcnNGb3JFbGVtZW50ID0gbmV3IFNldCgpOwogICAgICAgICAgICAgICAgICAgIGRpYW1ldGVycy5zZXQoc3R5bGVSb290LCBkaWFtZXRlcnNGb3JFbGVtZW50KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGRpYW1ldGVyc0ZvckVsZW1lbnQuYWRkKGN1cnJlbnREaWFtZXRlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2VuZXJhdGVzIGFuaW1hdGlvbiBzdHlsZXMgYWRqdXN0ZWQgZm9yIHRoZSBzcGlubmVyJ3MgZGlhbWV0ZXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBbmltYXRpb25UZXh0KCkgewogICAgICAgICAgICByZXR1cm4gSU5ERVRFUk1JTkFURV9BTklNQVRJT05fVEVNUExBVEUKICAgICAgICAgICAgICAgIC8vIEFuaW1hdGlvbiBzaG91bGQgYmVnaW4gYXQgNSUgYW5kIGVuZCBhdCA4MCUKICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9TVEFSVF9WQUxVRS9nLCBgJHswLjk1ICogdGhpcy5fc3Ryb2tlQ2lyY3VtZmVyZW5jZX1gKQogICAgICAgICAgICAgICAgLnJlcGxhY2UoL0VORF9WQUxVRS9nLCBgJHswLjIgKiB0aGlzLl9zdHJva2VDaXJjdW1mZXJlbmNlfWApCiAgICAgICAgICAgICAgICAucmVwbGFjZSgvRElBTUVURVIvZywgYCR7dGhpcy5kaWFtZXRlcn1gKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRQcm9ncmVzc1NwaW5uZXIuybVmYWMgPSBmdW5jdGlvbiBNYXRQcm9ncmVzc1NwaW5uZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UHJvZ3Jlc3NTcGlubmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9QUk9HUkVTU19TUElOTkVSX0RFRkFVTFRfT1BUSU9OUykpOyB9OwogICAgTWF0UHJvZ3Jlc3NTcGlubmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFByb2dyZXNzU3Bpbm5lciwgc2VsZWN0b3JzOiBbWyJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAicHJvZ3Jlc3NiYXIiLCAxLCAibWF0LXByb2dyZXNzLXNwaW5uZXIiXSwgaG9zdFZhcnM6IDEwLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFByb2dyZXNzU3Bpbm5lcl9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoImFyaWEtdmFsdWVtaW4iLCBjdHgubW9kZSA9PT0gImRldGVybWluYXRlIiA/IDAgOiBudWxsKSgiYXJpYS12YWx1ZW1heCIsIGN0eC5tb2RlID09PSAiZGV0ZXJtaW5hdGUiID8gMTAwIDogbnVsbCkoImFyaWEtdmFsdWVub3ciLCBjdHgubW9kZSA9PT0gImRldGVybWluYXRlIiA/IGN0eC52YWx1ZSA6IG51bGwpKCJtb2RlIiwgY3R4Lm1vZGUpOwogICAgICAgICAgICDJtcm1c3R5bGVQcm9wKCJ3aWR0aCIsIGN0eC5kaWFtZXRlciwgInB4IikoImhlaWdodCIsIGN0eC5kaWFtZXRlciwgInB4Iik7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIl9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIiwgY3R4Ll9ub29wQW5pbWF0aW9ucyk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgY29sb3I6ICJjb2xvciIsIG1vZGU6ICJtb2RlIiwgZGlhbWV0ZXI6ICJkaWFtZXRlciIsIHN0cm9rZVdpZHRoOiAic3Ryb2tlV2lkdGgiLCB2YWx1ZTogInZhbHVlIiB9LCBleHBvcnRBczogWyJtYXRQcm9ncmVzc1NwaW5uZXIiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgZGVjbHM6IDMsIHZhcnM6IDgsIGNvbnN0czogW1sicHJlc2VydmVBc3BlY3RSYXRpbyIsICJ4TWlkWU1pZCBtZWV0IiwgImZvY3VzYWJsZSIsICJmYWxzZSIsIDMsICJuZ1N3aXRjaCJdLCBbImN4IiwgIjUwJSIsICJjeSIsICI1MCUiLCAzLCAiYW5pbWF0aW9uLW5hbWUiLCAic3Ryb2tlLWRhc2hvZmZzZXQiLCAic3Ryb2tlLWRhc2hhcnJheSIsICJzdHJva2Utd2lkdGgiLCA0LCAibmdTd2l0Y2hDYXNlIl0sIFsiY3giLCAiNTAlIiwgImN5IiwgIjUwJSIsIDMsICJzdHJva2UtZGFzaG9mZnNldCIsICJzdHJva2UtZGFzaGFycmF5IiwgInN0cm9rZS13aWR0aCIsIDQsICJuZ1N3aXRjaENhc2UiXSwgWyJjeCIsICI1MCUiLCAiY3kiLCAiNTAlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0UHJvZ3Jlc3NTcGlubmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bmFtZXNwYWNlU1ZHKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInN2ZyIsIDApOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMSwgTWF0UHJvZ3Jlc3NTcGlubmVyX19zdmdfY2lyY2xlXzFfVGVtcGxhdGUsIDEsIDksICJjaXJjbGUiLCAxKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIsIE1hdFByb2dyZXNzU3Bpbm5lcl9fc3ZnX2NpcmNsZV8yX1RlbXBsYXRlLCAxLCA3LCAiY2lyY2xlIiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVzdHlsZVByb3AoIndpZHRoIiwgY3R4LmRpYW1ldGVyLCAicHgiKSgiaGVpZ2h0IiwgY3R4LmRpYW1ldGVyLCAicHgiKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaCIsIGN0eC5tb2RlID09PSAiaW5kZXRlcm1pbmF0ZSIpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ2aWV3Qm94IiwgY3R4Ll92aWV3Qm94KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2hDYXNlIiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGZhbHNlKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlXSwgc3R5bGVzOiBbIi5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcntkaXNwbGF5OmJsb2NrO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBzdmd7cG9zaXRpb246YWJzb2x1dGU7dHJhbnNmb3JtOnJvdGF0ZSgtOTBkZWcpO3RvcDowO2xlZnQ6MDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lciBjaXJjbGV7ZmlsbDp0cmFuc3BhcmVudDt0cmFuc2Zvcm0tb3JpZ2luOmNlbnRlcjt0cmFuc2l0aW9uOnN0cm9rZS1kYXNob2Zmc2V0IDIyNW1zIGxpbmVhcn0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXXthbmltYXRpb246bWF0LXByb2dyZXNzLXNwaW5uZXItbGluZWFyLXJvdGF0ZSAyMDAwbXMgbGluZWFyIGluZmluaXRlfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVde3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2U7YW5pbWF0aW9uLWR1cmF0aW9uOjQwMDBtczthbmltYXRpb24tdGltaW5nLWZ1bmN0aW9uOmN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKTthbmltYXRpb24taXRlcmF0aW9uLWNvdW50OmluZmluaXRlfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV17YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2sgMTAwMDBtcyBjdWJpYy1iZXppZXIoMC44NywgMC4wMywgMC4zMywgMSkgaW5maW5pdGV9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV17dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWZhbGxiYWNrLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVdIGNpcmNsZXt0cmFuc2l0aW9uLXByb3BlcnR5OnN0cm9rZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfUBrZXlmcmFtZXMgbWF0LXByb2dyZXNzLXNwaW5uZXItbGluZWFyLXJvdGF0ZXswJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSgzNjBkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtMTAwezAle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlKDApfTEyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDApfTEyLjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDcyLjVkZWcpfTI1LjAwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoMjcwZGVnKX0zNy41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpfTUwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMTYxLjVkZWcpfTUwLjAwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoMTgwZGVnKX02Mi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpfTc1JXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMjUxLjVkZWcpfTc1LjAwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlKDkwZGVnKX04Ny41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDM0MS41ZGVnKX0xMDAle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9fUBrZXlmcmFtZXMgbWF0LXByb2dyZXNzLXNwaW5uZXItc3Ryb2tlLXJvdGF0ZS1mYWxsYmFja3swJXt0cmFuc2Zvcm06cm90YXRlKDBkZWcpfTI1JXt0cmFuc2Zvcm06cm90YXRlKDExNzBkZWcpfTUwJXt0cmFuc2Zvcm06cm90YXRlKDIzNDBkZWcpfTc1JXt0cmFuc2Zvcm06cm90YXRlKDM1MTBkZWcpfTEwMCV7dHJhbnNmb3JtOnJvdGF0ZSg0NjgwZGVnKX19XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqCiAgICAgKiBUcmFja3MgZGlhbWV0ZXJzIG9mIGV4aXN0aW5nIGluc3RhbmNlcyB0byBkZS1kdXBlIGdlbmVyYXRlZCBzdHlsZXMgKGRlZmF1bHQgZCA9IDEwMCkuCiAgICAgKiBXZSBuZWVkIHRvIGtlZXAgdHJhY2sgb2Ygd2hpY2ggZWxlbWVudHMgdGhlIGRpYW1ldGVycyB3ZXJlIGF0dGFjaGVkIHRvLCBiZWNhdXNlIGZvcgogICAgICogZWxlbWVudHMgaW4gdGhlIFNoYWRvdyBET00gdGhlIHN0eWxlIHRhZ3MgYXJlIGF0dGFjaGVkIHRvIHRoZSBzaGFkb3cgcm9vdCwgcmF0aGVyCiAgICAgKiB0aGFuIHRoZSBkb2N1bWVudCBoZWFkLgogICAgICovCiAgICBNYXRQcm9ncmVzc1NwaW5uZXIuX2RpYW1ldGVycyA9IG5ldyBXZWFrTWFwKCk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFByb2dyZXNzU3Bpbm5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1BST0dSRVNTX1NQSU5ORVJfREVGQVVMVF9PUFRJT05TLF0gfV0gfQogICAgXTsKICAgIE1hdFByb2dyZXNzU3Bpbm5lci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBkaWFtZXRlcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc3Ryb2tlV2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1vZGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKgogICAgICogYDxtYXQtc3Bpbm5lcj5gIGNvbXBvbmVudC4KICAgICAqCiAgICAgKiBUaGlzIGlzIGEgY29tcG9uZW50IGRlZmluaXRpb24gdG8gYmUgdXNlZCBhcyBhIGNvbnZlbmllbmNlIHJlZmVyZW5jZSB0byBjcmVhdGUgYW4KICAgICAqIGluZGV0ZXJtaW5hdGUgYDxtYXQtcHJvZ3Jlc3Mtc3Bpbm5lcj5gIGluc3RhbmNlLgogICAgICovCiAgICBjbGFzcyBNYXRTcGlubmVyIGV4dGVuZHMgTWF0UHJvZ3Jlc3NTcGlubmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHBsYXRmb3JtCiAgICAgICAgICogQHBhcmFtIHs/fSBkb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7P30gYW5pbWF0aW9uTW9kZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRzCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoZWxlbWVudFJlZiwgcGxhdGZvcm0sIGRvY3VtZW50LCBhbmltYXRpb25Nb2RlLCBkZWZhdWx0cykgewogICAgICAgICAgICBzdXBlcihlbGVtZW50UmVmLCBwbGF0Zm9ybSwgZG9jdW1lbnQsIGFuaW1hdGlvbk1vZGUsIGRlZmF1bHRzKTsKICAgICAgICAgICAgdGhpcy5tb2RlID0gJ2luZGV0ZXJtaW5hdGUnOwogICAgICAgIH0KICAgIH0KICAgIE1hdFNwaW5uZXIuybVmYWMgPSBmdW5jdGlvbiBNYXRTcGlubmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNwaW5uZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoUGxhdGZvcm0pLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERPQ1VNRU5UJDEsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1BST0dSRVNTX1NQSU5ORVJfREVGQVVMVF9PUFRJT05TKSk7IH07CiAgICBNYXRTcGlubmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFNwaW5uZXIsIHNlbGVjdG9yczogW1sibWF0LXNwaW5uZXIiXV0sIGhvc3RBdHRyczogWyJyb2xlIiwgInByb2dyZXNzYmFyIiwgIm1vZGUiLCAiaW5kZXRlcm1pbmF0ZSIsIDEsICJtYXQtc3Bpbm5lciIsICJtYXQtcHJvZ3Jlc3Mtc3Bpbm5lciJdLCBob3N0VmFyczogNiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRTcGlubmVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXN0eWxlUHJvcCgid2lkdGgiLCBjdHguZGlhbWV0ZXIsICJweCIpKCJoZWlnaHQiLCBjdHguZGlhbWV0ZXIsICJweCIpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fbm9vcEFuaW1hdGlvbnMpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGNvbG9yOiAiY29sb3IiIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGRlY2xzOiAzLCB2YXJzOiA4LCBjb25zdHM6IFtbInByZXNlcnZlQXNwZWN0UmF0aW8iLCAieE1pZFlNaWQgbWVldCIsICJmb2N1c2FibGUiLCAiZmFsc2UiLCAzLCAibmdTd2l0Y2giXSwgWyJjeCIsICI1MCUiLCAiY3kiLCAiNTAlIiwgMywgImFuaW1hdGlvbi1uYW1lIiwgInN0cm9rZS1kYXNob2Zmc2V0IiwgInN0cm9rZS1kYXNoYXJyYXkiLCAic3Ryb2tlLXdpZHRoIiwgNCwgIm5nU3dpdGNoQ2FzZSJdLCBbImN4IiwgIjUwJSIsICJjeSIsICI1MCUiLCAzLCAic3Ryb2tlLWRhc2hvZmZzZXQiLCAic3Ryb2tlLWRhc2hhcnJheSIsICJzdHJva2Utd2lkdGgiLCA0LCAibmdTd2l0Y2hDYXNlIl0sIFsiY3giLCAiNTAlIiwgImN5IiwgIjUwJSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFNwaW5uZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3ZnIiwgMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBNYXRTcGlubmVyX19zdmdfY2lyY2xlXzFfVGVtcGxhdGUsIDEsIDksICJjaXJjbGUiLCAxKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIsIE1hdFNwaW5uZXJfX3N2Z19jaXJjbGVfMl9UZW1wbGF0ZSwgMSwgNywgImNpcmNsZSIsIDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1c3R5bGVQcm9wKCJ3aWR0aCIsIGN0eC5kaWFtZXRlciwgInB4IikoImhlaWdodCIsIGN0eC5kaWFtZXRlciwgInB4Iik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCBjdHgubW9kZSA9PT0gImluZGV0ZXJtaW5hdGUiKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidmlld0JveCIsIGN0eC5fdmlld0JveCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIHRydWUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCBmYWxzZSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdTd2l0Y2gsIE5nU3dpdGNoQ2FzZV0sIHN0eWxlczogWyIubWF0LXByb2dyZXNzLXNwaW5uZXJ7ZGlzcGxheTpibG9jaztwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIgc3Zne3Bvc2l0aW9uOmFic29sdXRlO3RyYW5zZm9ybTpyb3RhdGUoLTkwZGVnKTt0b3A6MDtsZWZ0OjA7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIgY2lyY2xle2ZpbGw6dHJhbnNwYXJlbnQ7dHJhbnNmb3JtLW9yaWdpbjpjZW50ZXI7dHJhbnNpdGlvbjpzdHJva2UtZGFzaG9mZnNldCAyMjVtcyBsaW5lYXJ9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZXt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV17YW5pbWF0aW9uOm1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGUgMjAwMG1zIGxpbmVhciBpbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXXt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb24tcHJvcGVydHk6c3Ryb2tlO2FuaW1hdGlvbi1kdXJhdGlvbjo0MDAwbXM7YW5pbWF0aW9uLXRpbWluZy1mdW5jdGlvbjpjdWJpYy1iZXppZXIoMC4zNSwgMCwgMC4yNSwgMSk7YW5pbWF0aW9uLWl0ZXJhdGlvbi1jb3VudDppbmZpbml0ZX0uX21hdC1hbmltYXRpb24tbm9vcGFibGUubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbjpub25lO2FuaW1hdGlvbjpub25lfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWZhbGxiYWNrLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVde2FuaW1hdGlvbjptYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLWZhbGxiYWNrIDEwMDAwbXMgY3ViaWMtYmV6aWVyKDAuODcsIDAuMDMsIDAuMzMsIDEpIGluZmluaXRlfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1pbmRldGVybWluYXRlLWZhbGxiYWNrLWFuaW1hdGlvblttb2RlPWluZGV0ZXJtaW5hdGVde3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXByb2dyZXNzLXNwaW5uZXItaW5kZXRlcm1pbmF0ZS1mYWxsYmFjay1hbmltYXRpb25bbW9kZT1pbmRldGVybWluYXRlXSBjaXJjbGV7dHJhbnNpdGlvbi1wcm9wZXJ0eTpzdHJva2V9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlLm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1wcm9ncmVzcy1zcGlubmVyLWluZGV0ZXJtaW5hdGUtZmFsbGJhY2stYW5pbWF0aW9uW21vZGU9aW5kZXRlcm1pbmF0ZV0gY2lyY2xle3RyYW5zaXRpb246bm9uZTthbmltYXRpb246bm9uZX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLWxpbmVhci1yb3RhdGV7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoMzYwZGVnKX19QGtleWZyYW1lcyBtYXQtcHJvZ3Jlc3Mtc3Bpbm5lci1zdHJva2Utcm90YXRlLTEwMHswJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41JXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZSgwKX0xMi41MDAxJXtzdHJva2UtZGFzaG9mZnNldDo1Ni41NDg2Njc3cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoNzIuNWRlZyl9MjUle3N0cm9rZS1kYXNob2Zmc2V0OjI2OC42MDYxNzE1NzVweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSg3Mi41ZGVnKX0yNS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgyNzBkZWcpfTM3LjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDI3MGRlZyl9MzcuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MCV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDE2MS41ZGVnKX01MC4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSgxODBkZWcpfTYyLjUle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlKDE4MGRlZyl9NjIuNTAwMSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NSV7c3Ryb2tlLWRhc2hvZmZzZXQ6MjY4LjYwNjE3MTU3NXB4O3RyYW5zZm9ybTpyb3RhdGVYKDE4MGRlZykgcm90YXRlKDI1MS41ZGVnKX03NS4wMDAxJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZSg5MGRlZyl9ODcuNSV7c3Ryb2tlLWRhc2hvZmZzZXQ6NTYuNTQ4NjY3N3B4O3RyYW5zZm9ybTpyb3RhdGUoOTBkZWcpfTg3LjUwMDEle3N0cm9rZS1kYXNob2Zmc2V0OjU2LjU0ODY2NzdweDt0cmFuc2Zvcm06cm90YXRlWCgxODBkZWcpIHJvdGF0ZSgzNDEuNWRlZyl9MTAwJXtzdHJva2UtZGFzaG9mZnNldDoyNjguNjA2MTcxNTc1cHg7dHJhbnNmb3JtOnJvdGF0ZVgoMTgwZGVnKSByb3RhdGUoMzQxLjVkZWcpfX1Aa2V5ZnJhbWVzIG1hdC1wcm9ncmVzcy1zcGlubmVyLXN0cm9rZS1yb3RhdGUtZmFsbGJhY2t7MCV7dHJhbnNmb3JtOnJvdGF0ZSgwZGVnKX0yNSV7dHJhbnNmb3JtOnJvdGF0ZSgxMTcwZGVnKX01MCV7dHJhbnNmb3JtOnJvdGF0ZSgyMzQwZGVnKX03NSV7dHJhbnNmb3JtOnJvdGF0ZSgzNTEwZGVnKX0xMDAle3RyYW5zZm9ybTpyb3RhdGUoNDY4MGRlZyl9fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0U3Bpbm5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IFBsYXRmb3JtIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbQU5JTUFUSU9OX01PRFVMRV9UWVBFLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX1BST0dSRVNTX1NQSU5ORVJfREVGQVVMVF9PUFRJT05TLF0gfV0gfQogICAgXTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9wcm9ncmVzcy1zcGlubmVyL3Byb2dyZXNzLXNwaW5uZXItbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSB7CiAgICB9CiAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUgfSk7CiAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW01hdENvbW1vbk1vZHVsZSwgQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRQcm9ncmVzc1NwaW5uZXIsCiAgICAgICAgICAgIE1hdFNwaW5uZXJdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0Q29tbW9uTW9kdWxlLCBDb21tb25Nb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0UHJvZ3Jlc3NTcGlubmVyLAogICAgICAgICAgICBNYXRTcGlubmVyLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIGNvbnN0IF9jMCRsID0gWyJtYXQtc29ydC1oZWFkZXIiLCAiIl07CiAgICBmdW5jdGlvbiBNYXRTb3J0SGVhZGVyX2Rpdl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDMpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiQGFycm93UG9zaXRpb24uc3RhcnQiLCBmdW5jdGlvbiBNYXRTb3J0SGVhZGVyX2Rpdl8zX1RlbXBsYXRlX2Rpdl9hbmltYXRpb25fYXJyb3dQb3NpdGlvbl9zdGFydF8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyKTsgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEuX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSB0cnVlOyB9KSgiQGFycm93UG9zaXRpb24uZG9uZSIsIGZ1bmN0aW9uIE1hdFNvcnRIZWFkZXJfZGl2XzNfVGVtcGxhdGVfZGl2X2FuaW1hdGlvbl9hcnJvd1Bvc2l0aW9uX2RvbmVfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMik7IGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IzLl9kaXNhYmxlVmlld1N0YXRlQW5pbWF0aW9uID0gZmFsc2U7IH0pOwogICAgICAgIMm1ybVlbGVtZW50KDEsICJkaXYiLCA0KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCA1KTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAiZGl2IiwgNik7CiAgICAgICAgybXJtWVsZW1lbnQoNCwgImRpdiIsIDcpOwogICAgICAgIMm1ybVlbGVtZW50KDUsICJkaXYiLCA4KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoIkBhcnJvd09wYWNpdHkiLCBjdHhfcjAuX2dldEFycm93Vmlld1N0YXRlKCkpKCJAYXJyb3dQb3NpdGlvbiIsIGN0eF9yMC5fZ2V0QXJyb3dWaWV3U3RhdGUoKSkoIkBhbGxvd0NoaWxkcmVuIiwgY3R4X3IwLl9nZXRBcnJvd0RpcmVjdGlvblN0YXRlKCkpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiQGluZGljYXRvciIsIGN0eF9yMC5fZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIkBsZWZ0UG9pbnRlciIsIGN0eF9yMC5fZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIkByaWdodFBvaW50ZXIiLCBjdHhfcjAuX2dldEFycm93RGlyZWN0aW9uU3RhdGUoKSk7CiAgICB9IH0KICAgIGNvbnN0IF9jMSRjID0gWyIqIl07CiAgICBmdW5jdGlvbiBnZXRTb3J0RHVwbGljYXRlU29ydGFibGVJZEVycm9yKGlkKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBDYW5ub3QgaGF2ZSB0d28gTWF0U29ydGFibGVzIHdpdGggdGhlIHNhbWUgaWQgKCR7aWR9KS5gKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFNvcnRIZWFkZXJOb3RDb250YWluZWRXaXRoaW5Tb3J0RXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBNYXRTb3J0SGVhZGVyIG11c3QgYmUgcGxhY2VkIHdpdGhpbiBhIHBhcmVudCBlbGVtZW50IHdpdGggdGhlIE1hdFNvcnQgZGlyZWN0aXZlLmApOwogICAgfQogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U29ydEhlYWRlck1pc3NpbmdJZEVycm9yKCkgewogICAgICAgIHJldHVybiBFcnJvcihgTWF0U29ydEhlYWRlciBtdXN0IGJlIHByb3ZpZGVkIHdpdGggYSB1bmlxdWUgaWQuYCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGRpcmVjdGlvbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U29ydEludmFsaWREaXJlY3Rpb25FcnJvcihkaXJlY3Rpb24pIHsKICAgICAgICByZXR1cm4gRXJyb3IoYCR7ZGlyZWN0aW9ufSBpcyBub3QgYSB2YWxpZCBzb3J0IGRpcmVjdGlvbiAoJ2FzYycgb3IgJ2Rlc2MnKS5gKTsKICAgIH0KICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0U29ydC4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0U29ydEJhc2UgewogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdFNvcnRNaXhpbkJhc2UgPSBtaXhpbkluaXRpYWxpemVkKG1peGluRGlzYWJsZWQoTWF0U29ydEJhc2UpKTsKICAgIC8qKgogICAgICogQ29udGFpbmVyIGZvciBNYXRTb3J0YWJsZXMgdG8gbWFuYWdlIHRoZSBzb3J0IHN0YXRlIGFuZCBwcm92aWRlIGRlZmF1bHQgc29ydCBwYXJhbWV0ZXJzLgogICAgICovCiAgICBjbGFzcyBNYXRTb3J0IGV4dGVuZHMgX01hdFNvcnRNaXhpbkJhc2UgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ29sbGVjdGlvbiBvZiBhbGwgcmVnaXN0ZXJlZCBzb3J0YWJsZXMgdGhhdCB0aGlzIGRpcmVjdGl2ZSBtYW5hZ2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5zb3J0YWJsZXMgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBVc2VkIHRvIG5vdGlmeSBhbnkgY2hpbGQgY29tcG9uZW50cyBsaXN0ZW5pbmcgdG8gc3RhdGUgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgZGlyZWN0aW9uIHRvIHNldCB3aGVuIGFuIE1hdFNvcnRhYmxlIGlzIGluaXRpYWxseSBzb3J0ZWQuCiAgICAgICAgICAgICAqIE1heSBiZSBvdmVycmlkZW4gYnkgdGhlIE1hdFNvcnRhYmxlJ3Mgc29ydCBzdGFydC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc3RhcnQgPSAnYXNjJzsKICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gJyc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgY2hhbmdlcyBlaXRoZXIgdGhlIGFjdGl2ZSBzb3J0IG9yIHNvcnQgZGlyZWN0aW9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5zb3J0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgc29ydCBkaXJlY3Rpb24gb2YgdGhlIGN1cnJlbnRseSBhY3RpdmUgTWF0U29ydGFibGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlyZWN0aW9uKCkgeyByZXR1cm4gdGhpcy5fZGlyZWN0aW9uOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3Rpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXJlY3Rpb24oZGlyZWN0aW9uKSB7CiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiBkaXJlY3Rpb24gJiYgZGlyZWN0aW9uICE9PSAnYXNjJyAmJiBkaXJlY3Rpb24gIT09ICdkZXNjJykgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0U29ydEludmFsaWREaXJlY3Rpb25FcnJvcihkaXJlY3Rpb24pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2RpcmVjdGlvbiA9IGRpcmVjdGlvbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0byBkaXNhYmxlIHRoZSB1c2VyIGZyb20gY2xlYXJpbmcgdGhlIHNvcnQgYnkgZmluaXNoaW5nIHRoZSBzb3J0IGRpcmVjdGlvbiBjeWNsZS4KICAgICAgICAgKiBNYXkgYmUgb3ZlcnJpZGVuIGJ5IHRoZSBNYXRTb3J0YWJsZSdzIGRpc2FibGUgY2xlYXIgaW5wdXQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZUNsZWFyKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZUNsZWFyOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZUNsZWFyKHYpIHsgdGhpcy5fZGlzYWJsZUNsZWFyID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHYpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVnaXN0ZXIgZnVuY3Rpb24gdG8gYmUgdXNlZCBieSB0aGUgY29udGFpbmVkIE1hdFNvcnRhYmxlcy4gQWRkcyB0aGUgTWF0U29ydGFibGUgdG8gdGhlCiAgICAgICAgICogY29sbGVjdGlvbiBvZiBNYXRTb3J0YWJsZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSBzb3J0YWJsZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXIoc29ydGFibGUpIHsKICAgICAgICAgICAgaWYgKCFzb3J0YWJsZS5pZCkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0U29ydEhlYWRlck1pc3NpbmdJZEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuc29ydGFibGVzLmhhcyhzb3J0YWJsZS5pZCkpIHsKICAgICAgICAgICAgICAgIHRocm93IGdldFNvcnREdXBsaWNhdGVTb3J0YWJsZUlkRXJyb3Ioc29ydGFibGUuaWQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc29ydGFibGVzLnNldChzb3J0YWJsZS5pZCwgc29ydGFibGUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVbnJlZ2lzdGVyIGZ1bmN0aW9uIHRvIGJlIHVzZWQgYnkgdGhlIGNvbnRhaW5lZCBNYXRTb3J0YWJsZXMuIFJlbW92ZXMgdGhlIE1hdFNvcnRhYmxlIGZyb20gdGhlCiAgICAgICAgICogY29sbGVjdGlvbiBvZiBjb250YWluZWQgTWF0U29ydGFibGVzLgogICAgICAgICAqIEBwYXJhbSB7P30gc29ydGFibGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRlcmVnaXN0ZXIoc29ydGFibGUpIHsKICAgICAgICAgICAgdGhpcy5zb3J0YWJsZXMuZGVsZXRlKHNvcnRhYmxlLmlkKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgYWN0aXZlIHNvcnQgaWQgYW5kIGRldGVybWluZXMgdGhlIG5ldyBzb3J0IGRpcmVjdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IHNvcnRhYmxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzb3J0KHNvcnRhYmxlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmFjdGl2ZSAhPSBzb3J0YWJsZS5pZCkgewogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBzb3J0YWJsZS5pZDsKICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gc29ydGFibGUuc3RhcnQgPyBzb3J0YWJsZS5zdGFydCA6IHRoaXMuc3RhcnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGlvbiA9IHRoaXMuZ2V0TmV4dFNvcnREaXJlY3Rpb24oc29ydGFibGUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc29ydENoYW5nZS5lbWl0KHsgYWN0aXZlOiB0aGlzLmFjdGl2ZSwgZGlyZWN0aW9uOiB0aGlzLmRpcmVjdGlvbiB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgbmV4dCBzb3J0IGRpcmVjdGlvbiBvZiB0aGUgYWN0aXZlIHNvcnRhYmxlLCBjaGVja2luZyBmb3IgcG90ZW50aWFsIG92ZXJyaWRlcy4KICAgICAgICAgKiBAcGFyYW0gez99IHNvcnRhYmxlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXROZXh0U29ydERpcmVjdGlvbihzb3J0YWJsZSkgewogICAgICAgICAgICBpZiAoIXNvcnRhYmxlKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gR2V0IHRoZSBzb3J0IGRpcmVjdGlvbiBjeWNsZSB3aXRoIHRoZSBwb3RlbnRpYWwgc29ydGFibGUgb3ZlcnJpZGVzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpc2FibGVDbGVhciA9IHNvcnRhYmxlLmRpc2FibGVDbGVhciAhPSBudWxsID8gc29ydGFibGUuZGlzYWJsZUNsZWFyIDogdGhpcy5kaXNhYmxlQ2xlYXI7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHNvcnREaXJlY3Rpb25DeWNsZSA9IGdldFNvcnREaXJlY3Rpb25DeWNsZShzb3J0YWJsZS5zdGFydCB8fCB0aGlzLnN0YXJ0LCBkaXNhYmxlQ2xlYXIpOwogICAgICAgICAgICAvLyBHZXQgYW5kIHJldHVybiB0aGUgbmV4dCBkaXJlY3Rpb24gaW4gdGhlIGN5Y2xlCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG5leHREaXJlY3Rpb25JbmRleCA9IHNvcnREaXJlY3Rpb25DeWNsZS5pbmRleE9mKHRoaXMuZGlyZWN0aW9uKSArIDE7CiAgICAgICAgICAgIGlmIChuZXh0RGlyZWN0aW9uSW5kZXggPj0gc29ydERpcmVjdGlvbkN5Y2xlLmxlbmd0aCkgewogICAgICAgICAgICAgICAgbmV4dERpcmVjdGlvbkluZGV4ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gc29ydERpcmVjdGlvbkN5Y2xlW25leHREaXJlY3Rpb25JbmRleF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX21hcmtJbml0aWFsaXplZCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKCkgewogICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9zdGF0ZUNoYW5nZXMuY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRTb3J0Lsm1ZmFjID0gZnVuY3Rpb24gTWF0U29ydF9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0U29ydF9CYXNlRmFjdG9yeSh0IHx8IE1hdFNvcnQpOyB9OwogICAgTWF0U29ydC7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRTb3J0LCBzZWxlY3RvcnM6IFtbIiIsICJtYXRTb3J0IiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1zb3J0Il0sIGlucHV0czogeyBkaXNhYmxlZDogWyJtYXRTb3J0RGlzYWJsZWQiLCAiZGlzYWJsZWQiXSwgc3RhcnQ6IFsibWF0U29ydFN0YXJ0IiwgInN0YXJ0Il0sIGRpcmVjdGlvbjogWyJtYXRTb3J0RGlyZWN0aW9uIiwgImRpcmVjdGlvbiJdLCBkaXNhYmxlQ2xlYXI6IFsibWF0U29ydERpc2FibGVDbGVhciIsICJkaXNhYmxlQ2xlYXIiXSwgYWN0aXZlOiBbIm1hdFNvcnRBY3RpdmUiLCAiYWN0aXZlIl0gfSwgb3V0cHV0czogeyBzb3J0Q2hhbmdlOiAibWF0U29ydENoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0U29ydCJdLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgTWF0U29ydC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBhY3RpdmU6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFNvcnRBY3RpdmUnLF0gfV0sCiAgICAgICAgc3RhcnQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFNvcnRTdGFydCcsXSB9XSwKICAgICAgICBkaXJlY3Rpb246IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdFNvcnREaXJlY3Rpb24nLF0gfV0sCiAgICAgICAgZGlzYWJsZUNsZWFyOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRTb3J0RGlzYWJsZUNsZWFyJyxdIH1dLAogICAgICAgIHNvcnRDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCwgYXJnczogWydtYXRTb3J0Q2hhbmdlJyxdIH1dCiAgICB9OwogICAgY29uc3QgybVNYXRTb3J0X0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0U29ydCk7CiAgICAvKioKICAgICAqIFJldHVybnMgdGhlIHNvcnQgZGlyZWN0aW9uIGN5Y2xlIHRvIHVzZSBnaXZlbiB0aGUgcHJvdmlkZWQgcGFyYW1ldGVycyBvZiBvcmRlciBhbmQgY2xlYXIuCiAgICAgKiBAcGFyYW0gez99IHN0YXJ0CiAgICAgKiBAcGFyYW0gez99IGRpc2FibGVDbGVhcgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0U29ydERpcmVjdGlvbkN5Y2xlKHN0YXJ0LCBkaXNhYmxlQ2xlYXIpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHNvcnRPcmRlciA9IFsnYXNjJywgJ2Rlc2MnXTsKICAgICAgICBpZiAoc3RhcnQgPT0gJ2Rlc2MnKSB7CiAgICAgICAgICAgIHNvcnRPcmRlci5yZXZlcnNlKCk7CiAgICAgICAgfQogICAgICAgIGlmICghZGlzYWJsZUNsZWFyKSB7CiAgICAgICAgICAgIHNvcnRPcmRlci5wdXNoKCcnKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHNvcnRPcmRlcjsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zb3J0L3NvcnQtYW5pbWF0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTT1JUX0FOSU1BVElPTl9UUkFOU0lUSU9OID0gQW5pbWF0aW9uRHVyYXRpb25zLkVOVEVSSU5HICsgJyAnICsKICAgICAgICBBbmltYXRpb25DdXJ2ZXMuU1RBTkRBUkRfQ1VSVkU7CiAgICAvKioKICAgICAqIEFuaW1hdGlvbnMgdXNlZCBieSBNYXRTb3J0LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBtYXRTb3J0QW5pbWF0aW9ucyA9IHsKICAgICAgICAvKioKICAgICAgICAgKiBBbmltYXRpb24gdGhhdCBtb3ZlcyB0aGUgc29ydCBpbmRpY2F0b3IuCiAgICAgICAgICovCiAgICAgICAgaW5kaWNhdG9yOiB0cmlnZ2VyKCdpbmRpY2F0b3InLCBbCiAgICAgICAgICAgIHN0YXRlKCdhY3RpdmUtYXNjLCBhc2MnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMHB4KScgfSkpLAogICAgICAgICAgICAvLyAxMHB4IGlzIHRoZSBoZWlnaHQgb2YgdGhlIHNvcnQgaW5kaWNhdG9yLCBtaW51cyB0aGUgd2lkdGggb2YgdGhlIHBvaW50ZXJzCiAgICAgICAgICAgIHN0YXRlKCdhY3RpdmUtZGVzYywgZGVzYycsIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgxMHB4KScgfSkpLAogICAgICAgICAgICB0cmFuc2l0aW9uKCdhY3RpdmUtYXNjIDw9PiBhY3RpdmUtZGVzYycsIGFuaW1hdGUoU09SVF9BTklNQVRJT05fVFJBTlNJVElPTikpCiAgICAgICAgXSksCiAgICAgICAgLyoqCiAgICAgICAgICogQW5pbWF0aW9uIHRoYXQgcm90YXRlcyB0aGUgbGVmdCBwb2ludGVyIG9mIHRoZSBpbmRpY2F0b3IgYmFzZWQgb24gdGhlIHNvcnRpbmcgZGlyZWN0aW9uLgogICAgICAgICAqLwogICAgICAgIGxlZnRQb2ludGVyOiB0cmlnZ2VyKCdsZWZ0UG9pbnRlcicsIFsKICAgICAgICAgICAgc3RhdGUoJ2FjdGl2ZS1hc2MsIGFzYycsIHN0eWxlKHsgdHJhbnNmb3JtOiAncm90YXRlKC00NWRlZyknIH0pKSwKICAgICAgICAgICAgc3RhdGUoJ2FjdGl2ZS1kZXNjLCBkZXNjJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdyb3RhdGUoNDVkZWcpJyB9KSksCiAgICAgICAgICAgIHRyYW5zaXRpb24oJ2FjdGl2ZS1hc2MgPD0+IGFjdGl2ZS1kZXNjJywgYW5pbWF0ZShTT1JUX0FOSU1BVElPTl9UUkFOU0lUSU9OKSkKICAgICAgICBdKSwKICAgICAgICAvKioKICAgICAgICAgKiBBbmltYXRpb24gdGhhdCByb3RhdGVzIHRoZSByaWdodCBwb2ludGVyIG9mIHRoZSBpbmRpY2F0b3IgYmFzZWQgb24gdGhlIHNvcnRpbmcgZGlyZWN0aW9uLgogICAgICAgICAqLwogICAgICAgIHJpZ2h0UG9pbnRlcjogdHJpZ2dlcigncmlnaHRQb2ludGVyJywgWwogICAgICAgICAgICBzdGF0ZSgnYWN0aXZlLWFzYywgYXNjJywgc3R5bGUoeyB0cmFuc2Zvcm06ICdyb3RhdGUoNDVkZWcpJyB9KSksCiAgICAgICAgICAgIHN0YXRlKCdhY3RpdmUtZGVzYywgZGVzYycsIHN0eWxlKHsgdHJhbnNmb3JtOiAncm90YXRlKC00NWRlZyknIH0pKSwKICAgICAgICAgICAgdHJhbnNpdGlvbignYWN0aXZlLWFzYyA8PT4gYWN0aXZlLWRlc2MnLCBhbmltYXRlKFNPUlRfQU5JTUFUSU9OX1RSQU5TSVRJT04pKQogICAgICAgIF0pLAogICAgICAgIC8qKgogICAgICAgICAqIEFuaW1hdGlvbiB0aGF0IGNvbnRyb2xzIHRoZSBhcnJvdyBvcGFjaXR5LgogICAgICAgICAqLwogICAgICAgIGFycm93T3BhY2l0eTogdHJpZ2dlcignYXJyb3dPcGFjaXR5JywgWwogICAgICAgICAgICBzdGF0ZSgnZGVzYy10by1hY3RpdmUsIGFzYy10by1hY3RpdmUsIGFjdGl2ZScsIHN0eWxlKHsgb3BhY2l0eTogMSB9KSksCiAgICAgICAgICAgIHN0YXRlKCdkZXNjLXRvLWhpbnQsIGFzYy10by1oaW50LCBoaW50Jywgc3R5bGUoeyBvcGFjaXR5OiAuNTQgfSkpLAogICAgICAgICAgICBzdGF0ZSgnaGludC10by1kZXNjLCBhY3RpdmUtdG8tZGVzYywgZGVzYywgaGludC10by1hc2MsIGFjdGl2ZS10by1hc2MsIGFzYywgdm9pZCcsIHN0eWxlKHsgb3BhY2l0eTogMCB9KSksCiAgICAgICAgICAgIC8vIFRyYW5zaXRpb24gYmV0d2VlbiBhbGwgc3RhdGVzIGV4Y2VwdCBmb3IgaW1tZWRpYXRlIHRyYW5zaXRpb25zCiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gYXNjLCAqID0+IGRlc2MsICogPT4gYWN0aXZlLCAqID0+IGhpbnQsICogPT4gdm9pZCcsIGFuaW1hdGUoJzBtcycpKSwKICAgICAgICAgICAgdHJhbnNpdGlvbignKiA8PT4gKicsIGFuaW1hdGUoU09SVF9BTklNQVRJT05fVFJBTlNJVElPTikpLAogICAgICAgIF0pLAogICAgICAgIC8qKgogICAgICAgICAqIEFuaW1hdGlvbiBmb3IgdGhlIHRyYW5zbGF0aW9uIG9mIHRoZSBhcnJvdyBhcyBhIHdob2xlLiBTdGF0ZXMgYXJlIHNlcGFyYXRlZCBpbnRvIHR3bwogICAgICAgICAqIGdyb3Vwczogb25lcyB3aXRoIGFuaW1hdGlvbnMgYW5kIG90aGVycyB0aGF0IGFyZSBpbW1lZGlhdGUuIEltbWVkaWF0ZSBzdGF0ZXMgYXJlIGFzYywgZGVzYywKICAgICAgICAgKiBwZWVrLCBhbmQgYWN0aXZlLiBUaGUgb3RoZXIgc3RhdGVzIGRlZmluZSBhIHNwZWNpZmljIGFuaW1hdGlvbiAoc291cmNlLXRvLWRlc3RpbmF0aW9uKQogICAgICAgICAqIGFuZCBhcmUgZGV0ZXJtaW5lZCBhcyBhIGZ1bmN0aW9uIG9mIHRoZWlyIHByZXYgdXNlci1wZXJjZWl2ZWQgc3RhdGUgYW5kIHdoYXQgdGhlIG5leHQgc3RhdGUKICAgICAgICAgKiBzaG91bGQgYmUuCiAgICAgICAgICovCiAgICAgICAgYXJyb3dQb3NpdGlvbjogdHJpZ2dlcignYXJyb3dQb3NpdGlvbicsIFsKICAgICAgICAgICAgLy8gSGlkZGVuIEFib3ZlID0+IEhpbnQgQ2VudGVyCiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gZGVzYy10by1oaW50LCAqID0+IGRlc2MtdG8tYWN0aXZlJywgYW5pbWF0ZShTT1JUX0FOSU1BVElPTl9UUkFOU0lUSU9OLCBrZXlmcmFtZXMoWwogICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKC0yNSUpJyB9KSwKICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgwKScgfSkKICAgICAgICAgICAgXSkpKSwKICAgICAgICAgICAgLy8gSGludCBDZW50ZXIgPT4gSGlkZGVuIEJlbG93CiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPT4gaGludC10by1kZXNjLCAqID0+IGFjdGl2ZS10by1kZXNjJywgYW5pbWF0ZShTT1JUX0FOSU1BVElPTl9UUkFOU0lUSU9OLCBrZXlmcmFtZXMoWwogICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJyB9KSwKICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgyNSUpJyB9KQogICAgICAgICAgICBdKSkpLAogICAgICAgICAgICAvLyBIaWRkZW4gQmVsb3cgPT4gSGludCBDZW50ZXIKICAgICAgICAgICAgdHJhbnNpdGlvbignKiA9PiBhc2MtdG8taGludCwgKiA9PiBhc2MtdG8tYWN0aXZlJywgYW5pbWF0ZShTT1JUX0FOSU1BVElPTl9UUkFOU0lUSU9OLCBrZXlmcmFtZXMoWwogICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDI1JSknIH0pLAogICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJyB9KQogICAgICAgICAgICBdKSkpLAogICAgICAgICAgICAvLyBIaW50IENlbnRlciA9PiBIaWRkZW4gQWJvdmUKICAgICAgICAgICAgdHJhbnNpdGlvbignKiA9PiBoaW50LXRvLWFzYywgKiA9PiBhY3RpdmUtdG8tYXNjJywgYW5pbWF0ZShTT1JUX0FOSU1BVElPTl9UUkFOU0lUSU9OLCBrZXlmcmFtZXMoWwogICAgICAgICAgICAgICAgc3R5bGUoeyB0cmFuc2Zvcm06ICd0cmFuc2xhdGVZKDApJyB9KSwKICAgICAgICAgICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiAndHJhbnNsYXRlWSgtMjUlKScgfSkKICAgICAgICAgICAgXSkpKSwKICAgICAgICAgICAgc3RhdGUoJ2Rlc2MtdG8taGludCwgYXNjLXRvLWhpbnQsIGhpbnQsIGRlc2MtdG8tYWN0aXZlLCBhc2MtdG8tYWN0aXZlLCBhY3RpdmUnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMCknIH0pKSwKICAgICAgICAgICAgc3RhdGUoJ2hpbnQtdG8tZGVzYywgYWN0aXZlLXRvLWRlc2MsIGRlc2MnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoLTI1JSknIH0pKSwKICAgICAgICAgICAgc3RhdGUoJ2hpbnQtdG8tYXNjLCBhY3RpdmUtdG8tYXNjLCBhc2MnLCBzdHlsZSh7IHRyYW5zZm9ybTogJ3RyYW5zbGF0ZVkoMjUlKScgfSkpLAogICAgICAgIF0pLAogICAgICAgIC8qKgogICAgICAgICAqIE5lY2Vzc2FyeSB0cmlnZ2VyIHRoYXQgY2FsbHMgYW5pbWF0ZSBvbiBjaGlsZHJlbiBhbmltYXRpb25zLgogICAgICAgICAqLwogICAgICAgIGFsbG93Q2hpbGRyZW46IHRyaWdnZXIoJ2FsbG93Q2hpbGRyZW4nLCBbCiAgICAgICAgICAgIHRyYW5zaXRpb24oJyogPD0+IConLCBbCiAgICAgICAgICAgICAgICBxdWVyeSgnQConLCBhbmltYXRlQ2hpbGQoKSwgeyBvcHRpb25hbDogdHJ1ZSB9KQogICAgICAgICAgICBdKQogICAgICAgIF0pLAogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zb3J0L3NvcnQtaGVhZGVyLWludGwudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBUbyBtb2RpZnkgdGhlIGxhYmVscyBhbmQgdGV4dCBkaXNwbGF5ZWQsIGNyZWF0ZSBhIG5ldyBpbnN0YW5jZSBvZiBNYXRTb3J0SGVhZGVySW50bCBhbmQKICAgICAqIGluY2x1ZGUgaXQgaW4gYSBjdXN0b20gcHJvdmlkZXIuCiAgICAgKi8KICAgIGNsYXNzIE1hdFNvcnRIZWFkZXJJbnRsIHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN0cmVhbSB0aGF0IGVtaXRzIHdoZW5ldmVyIHRoZSBsYWJlbHMgaGVyZSBhcmUgY2hhbmdlZC4gVXNlIHRoaXMgdG8gbm90aWZ5CiAgICAgICAgICAgICAqIGNvbXBvbmVudHMgaWYgdGhlIGxhYmVscyBoYXZlIGNoYW5nZWQgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNoYW5nZXMgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQVJJQSBsYWJlbCBmb3IgdGhlIHNvcnRpbmcgYnV0dG9uLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5zb3J0QnV0dG9uTGFiZWwgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaWQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpZCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGBDaGFuZ2Ugc29ydGluZyBmb3IgJHtpZH1gOwogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICB9CiAgICBNYXRTb3J0SGVhZGVySW50bC7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNvcnRIZWFkZXJJbnRsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNvcnRIZWFkZXJJbnRsKSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE1hdFNvcnRIZWFkZXJJbnRsLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0U29ydEhlYWRlckludGxfRmFjdG9yeSgpIHsgcmV0dXJuIG5ldyBNYXRTb3J0SGVhZGVySW50bCgpOyB9LCB0b2tlbjogTWF0U29ydEhlYWRlckludGwsIHByb3ZpZGVkSW46ICJyb290IiB9KTsKICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gcGFyZW50SW50bAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gTUFUX1NPUlRfSEVBREVSX0lOVExfUFJPVklERVJfRkFDVE9SWShwYXJlbnRJbnRsKSB7CiAgICAgICAgcmV0dXJuIHBhcmVudEludGwgfHwgbmV3IE1hdFNvcnRIZWFkZXJJbnRsKCk7CiAgICB9CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX1NPUlRfSEVBREVSX0lOVExfUFJPVklERVIgPSB7CiAgICAgICAgLy8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhbiBNYXRTb3J0SGVhZGVySW50bCBhdmFpbGFibGUsIHVzZSB0aGF0LiBPdGhlcndpc2UsIHByb3ZpZGUgYSBuZXcgb25lLgogICAgICAgIHByb3ZpZGU6IE1hdFNvcnRIZWFkZXJJbnRsLAogICAgICAgIGRlcHM6IFtbbmV3IE9wdGlvbmFsKCksIG5ldyBTa2lwU2VsZigpLCBNYXRTb3J0SGVhZGVySW50bF1dLAogICAgICAgIHVzZUZhY3Rvcnk6IE1BVF9TT1JUX0hFQURFUl9JTlRMX1BST1ZJREVSX0ZBQ1RPUlkKICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvc29ydC9zb3J0LWhlYWRlci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIHRoZSBzb3J0IGhlYWRlci4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0U29ydEhlYWRlckJhc2UgewogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdFNvcnRIZWFkZXJNaXhpbkJhc2UgPSBtaXhpbkRpc2FibGVkKE1hdFNvcnRIZWFkZXJCYXNlKTsKICAgIC8qKgogICAgICogQXBwbGllcyBzb3J0aW5nIGJlaGF2aW9yIChjbGljayB0byBjaGFuZ2Ugc29ydCkgYW5kIHN0eWxlcyB0byBhbiBlbGVtZW50LCBpbmNsdWRpbmcgYW4KICAgICAqIGFycm93IHRvIGRpc3BsYXkgdGhlIGN1cnJlbnQgc29ydCBkaXJlY3Rpb24uCiAgICAgKgogICAgICogTXVzdCBiZSBwcm92aWRlZCB3aXRoIGFuIGlkIGFuZCBjb250YWluZWQgd2l0aGluIGEgcGFyZW50IE1hdFNvcnQgZGlyZWN0aXZlLgogICAgICoKICAgICAqIElmIHVzZWQgb24gaGVhZGVyIGNlbGxzIGluIGEgQ2RrVGFibGUsIGl0IHdpbGwgYXV0b21hdGljYWxseSBkZWZhdWx0IGl0cyBpZCBmcm9tIGl0cyBjb250YWluaW5nCiAgICAgKiBjb2x1bW4gZGVmaW5pdGlvbi4KICAgICAqLwogICAgY2xhc3MgTWF0U29ydEhlYWRlciBleHRlbmRzIF9NYXRTb3J0SGVhZGVyTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9pbnRsCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX3NvcnQKICAgICAgICAgKiBAcGFyYW0gez99IF9jb2x1bW5EZWYKICAgICAgICAgKiBAcGFyYW0gez89fSBfZm9jdXNNb25pdG9yCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2VsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfaW50bCwgY2hhbmdlRGV0ZWN0b3JSZWYsIF9zb3J0LCBfY29sdW1uRGVmLCBfZm9jdXNNb25pdG9yLCBfZWxlbWVudFJlZikgewogICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgdXNlIGEgc3RyaW5nIHRva2VuIGZvciB0aGUgYF9jb2x1bW5EZWZgLCBiZWNhdXNlIHRoZSB2YWx1ZSBpcyBwcm92aWRlZCBib3RoIGJ5CiAgICAgICAgICAgIC8vIGBtYXRlcmlhbC90YWJsZWAgYW5kIGBjZGsvdGFibGVgIGFuZCB3ZSBjYW4ndCBoYXZlIHRoZSBDREsgZGVwZW5kaW5nIG9uIE1hdGVyaWFsLAogICAgICAgICAgICAvLyBhbmQgd2Ugd2FudCB0byBhdm9pZCBoYXZpbmcgdGhlIHNvcnQgaGVhZGVyIGRlcGVuZGluZyBvbiB0aGUgQ0RLIHRhYmxlIGJlY2F1c2UKICAgICAgICAgICAgLy8gb2YgdGhpcyBzaW5nbGUgcmVmZXJlbmNlLgogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9pbnRsID0gX2ludGw7CiAgICAgICAgICAgIHRoaXMuX3NvcnQgPSBfc29ydDsKICAgICAgICAgICAgdGhpcy5fY29sdW1uRGVmID0gX2NvbHVtbkRlZjsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRmxhZyBzZXQgdG8gdHJ1ZSB3aGVuIHRoZSBpbmRpY2F0b3Igc2hvdWxkIGJlIGRpc3BsYXllZCB3aGlsZSB0aGUgc29ydCBpcyBub3QgYWN0aXZlLiBVc2VkIHRvCiAgICAgICAgICAgICAqIHByb3ZpZGUgYW4gYWZmb3JkYW5jZSB0aGF0IHRoZSBoZWFkZXIgaXMgc29ydGFibGUgYnkgc2hvd2luZyBvbiBmb2N1cyBhbmQgaG92ZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9zaG93SW5kaWNhdG9ySGludCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGhlIGRpcmVjdGlvbiB0aGUgYXJyb3cgc2hvdWxkIGJlIGZhY2luZyBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgc3RhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9hcnJvd0RpcmVjdGlvbiA9ICcnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgdmlldyBzdGF0ZSBhbmltYXRpb24gc2hvdWxkIHNob3cgdGhlIHRyYW5zaXRpb24gYmV0d2VlbiB0aGUgYGZyb21gIGFuZCBgdG9gIHN0YXRlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFNldHMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhcnJvdyB0aGF0IGRpc3BsYXlzIHdoZW4gc29ydGVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hcnJvd1Bvc2l0aW9uID0gJ2FmdGVyJzsKICAgICAgICAgICAgaWYgKCFfc29ydCkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0U29ydEhlYWRlck5vdENvbnRhaW5lZFdpdGhpblNvcnRFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3JlcmVuZGVyU3Vic2NyaXB0aW9uID0gbWVyZ2UoX3NvcnQuc29ydENoYW5nZSwgX3NvcnQuX3N0YXRlQ2hhbmdlcywgX2ludGwuY2hhbmdlcykKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2lzU29ydGVkKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcnJvd0RpcmVjdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBoZWFkZXIgd2FzIHJlY2VudGx5IGFjdGl2ZSBhbmQgbm93IG5vIGxvbmdlciBzb3J0ZWQsIGFuaW1hdGUgYXdheSB0aGUgYXJyb3cuCiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2lzU29ydGVkKCkgJiYgdGhpcy5fdmlld1N0YXRlICYmIHRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlID09PSAnYWN0aXZlJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUoeyBmcm9tU3RhdGU6ICdhY3RpdmUnLCB0b1N0YXRlOiB0aGlzLl9hcnJvd0RpcmVjdGlvbiB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIGlmIChfZm9jdXNNb25pdG9yICYmIF9lbGVtZW50UmVmKSB7CiAgICAgICAgICAgICAgICAvLyBXZSB1c2UgdGhlIGZvY3VzIG1vbml0b3IgYmVjYXVzZSB3ZSBhbHNvIHdhbnQgdG8gc3R5bGUKICAgICAgICAgICAgICAgIC8vIHRoaW5ncyBkaWZmZXJlbnRseSBiYXNlZCBvbiB0aGUgZm9jdXMgb3JpZ2luLgogICAgICAgICAgICAgICAgX2ZvY3VzTW9uaXRvci5tb25pdG9yKF9lbGVtZW50UmVmLCB0cnVlKQogICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBvcmlnaW4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIG9yaWdpbiA9PiB0aGlzLl9zZXRJbmRpY2F0b3JIaW50VmlzaWJsZSghIW9yaWdpbikpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBPdmVycmlkZXMgdGhlIGRpc2FibGUgY2xlYXIgdmFsdWUgb2YgdGhlIGNvbnRhaW5pbmcgTWF0U29ydCBmb3IgdGhpcyBNYXRTb3J0YWJsZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlQ2xlYXIoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlQ2xlYXI7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXNhYmxlQ2xlYXIodikgeyB0aGlzLl9kaXNhYmxlQ2xlYXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodik7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICBpZiAoIXRoaXMuaWQgJiYgdGhpcy5fY29sdW1uRGVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5fY29sdW1uRGVmLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSW5pdGlhbGl6ZSB0aGUgZGlyZWN0aW9uIG9mIHRoZSBhcnJvdyBhbmQgc2V0IHRoZSB2aWV3IHN0YXRlIHRvIGJlIGltbWVkaWF0ZWx5IHRoYXQgc3RhdGUuCiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUFycm93RGlyZWN0aW9uKCk7CiAgICAgICAgICAgIHRoaXMuX3NldEFuaW1hdGlvblRyYW5zaXRpb25TdGF0ZSh7IHRvU3RhdGU6IHRoaXMuX2lzU29ydGVkKCkgPyAnYWN0aXZlJyA6IHRoaXMuX2Fycm93RGlyZWN0aW9uIH0pOwogICAgICAgICAgICB0aGlzLl9zb3J0LnJlZ2lzdGVyKHRoaXMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMCBSZW1vdmUgbnVsbCBjaGVjayBmb3IgX2ZvY3VzTW9uaXRvciBhbmQgX2VsZW1lbnRSZWYuCiAgICAgICAgICAgIGlmICh0aGlzLl9mb2N1c01vbml0b3IgJiYgdGhpcy5fZWxlbWVudFJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NvcnQuZGVyZWdpc3Rlcih0aGlzKTsKICAgICAgICAgICAgdGhpcy5fcmVyZW5kZXJTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgImhpbnQiIHN0YXRlIHN1Y2ggdGhhdCB0aGUgYXJyb3cgd2lsbCBiZSBzZW1pLXRyYW5zcGFyZW50bHkgZGlzcGxheWVkIGFzIGEgaGludCB0byB0aGUKICAgICAgICAgKiB1c2VyIHNob3dpbmcgd2hhdCB0aGUgYWN0aXZlIHNvcnQgd2lsbCBiZWNvbWUuIElmIHNldCB0byBmYWxzZSwgdGhlIGFycm93IHdpbGwgZmFkZSBhd2F5LgogICAgICAgICAqIEBwYXJhbSB7P30gdmlzaWJsZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldEluZGljYXRvckhpbnRWaXNpYmxlKHZpc2libGUpIHsKICAgICAgICAgICAgLy8gTm8tb3AgaWYgdGhlIHNvcnQgaGVhZGVyIGlzIGRpc2FibGVkIC0gc2hvdWxkIG5vdCBtYWtlIHRoZSBoaW50IHZpc2libGUuCiAgICAgICAgICAgIGlmICh0aGlzLl9pc0Rpc2FibGVkKCkgJiYgdmlzaWJsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3Nob3dJbmRpY2F0b3JIaW50ID0gdmlzaWJsZTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1NvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVBcnJvd0RpcmVjdGlvbigpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuX3Nob3dJbmRpY2F0b3JIaW50KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHsgZnJvbVN0YXRlOiB0aGlzLl9hcnJvd0RpcmVjdGlvbiwgdG9TdGF0ZTogJ2hpbnQnIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2V0QW5pbWF0aW9uVHJhbnNpdGlvblN0YXRlKHsgZnJvbVN0YXRlOiAnaGludCcsIHRvU3RhdGU6IHRoaXMuX2Fycm93RGlyZWN0aW9uIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGFuaW1hdGlvbiB0cmFuc2l0aW9uIHZpZXcgc3RhdGUgZm9yIHRoZSBhcnJvdydzIHBvc2l0aW9uIGFuZCBvcGFjaXR5LiBJZiB0aGUKICAgICAgICAgKiBgZGlzYWJsZVZpZXdTdGF0ZUFuaW1hdGlvbmAgZmxhZyBpcyBzZXQgdG8gdHJ1ZSwgdGhlIGBmcm9tU3RhdGVgIHdpbGwgYmUgaWdub3JlZCBzbyB0aGF0CiAgICAgICAgICogbm8gYW5pbWF0aW9uIGFwcGVhcnMuCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3U3RhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRBbmltYXRpb25UcmFuc2l0aW9uU3RhdGUodmlld1N0YXRlKSB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdTdGF0ZSA9IHZpZXdTdGF0ZTsKICAgICAgICAgICAgLy8gSWYgdGhlIGFuaW1hdGlvbiBmb3IgYXJyb3cgcG9zaXRpb24gc3RhdGUgKG9wYWNpdHkvdHJhbnNsYXRpb24pIHNob3VsZCBiZSBkaXNhYmxlZCwKICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBmcm9tU3RhdGUgc28gdGhhdCBpdCBqdW1wcyByaWdodCB0byB0aGUgdG9TdGF0ZS4KICAgICAgICAgICAgaWYgKHRoaXMuX2Rpc2FibGVWaWV3U3RhdGVBbmltYXRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdTdGF0ZSA9IHsgdG9TdGF0ZTogdmlld1N0YXRlLnRvU3RhdGUgfTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmlnZ2VycyB0aGUgc29ydCBvbiB0aGlzIHNvcnQgaGVhZGVyIGFuZCByZW1vdmVzIHRoZSBpbmRpY2F0b3IgaGludC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVDbGljaygpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzRGlzYWJsZWQoKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX3NvcnQuc29ydCh0aGlzKTsKICAgICAgICAgICAgLy8gRG8gbm90IHNob3cgdGhlIGFuaW1hdGlvbiBpZiB0aGUgaGVhZGVyIHdhcyBhbHJlYWR5IHNob3duIGluIHRoZSByaWdodCBwb3NpdGlvbi4KICAgICAgICAgICAgaWYgKHRoaXMuX3ZpZXdTdGF0ZS50b1N0YXRlID09PSAnaGludCcgfHwgdGhpcy5fdmlld1N0YXRlLnRvU3RhdGUgPT09ICdhY3RpdmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNhYmxlVmlld1N0YXRlQW5pbWF0aW9uID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiB0aGUgYXJyb3cgaXMgbm93IHNvcnRlZCwgYW5pbWF0ZSB0aGUgYXJyb3cgaW50byBwbGFjZS4gT3RoZXJ3aXNlLCBhbmltYXRlIGl0IGF3YXkgaW50bwogICAgICAgICAgICAvLyB0aGUgZGlyZWN0aW9uIGl0IGlzIGZhY2luZy4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aWV3U3RhdGUgPSB0aGlzLl9pc1NvcnRlZCgpID8KICAgICAgICAgICAgICAgIHsgZnJvbVN0YXRlOiB0aGlzLl9hcnJvd0RpcmVjdGlvbiwgdG9TdGF0ZTogJ2FjdGl2ZScgfSA6CiAgICAgICAgICAgICAgICB7IGZyb21TdGF0ZTogJ2FjdGl2ZScsIHRvU3RhdGU6IHRoaXMuX2Fycm93RGlyZWN0aW9uIH07CiAgICAgICAgICAgIHRoaXMuX3NldEFuaW1hdGlvblRyYW5zaXRpb25TdGF0ZSh2aWV3U3RhdGUpOwogICAgICAgICAgICB0aGlzLl9zaG93SW5kaWNhdG9ySGludCA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoaXMgTWF0U29ydEhlYWRlciBpcyBjdXJyZW50bHkgc29ydGVkIGluIGVpdGhlciBhc2NlbmRpbmcgb3IgZGVzY2VuZGluZyBvcmRlci4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1NvcnRlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnQuYWN0aXZlID09IHRoaXMuaWQgJiYKICAgICAgICAgICAgICAgICh0aGlzLl9zb3J0LmRpcmVjdGlvbiA9PT0gJ2FzYycgfHwgdGhpcy5fc29ydC5kaXJlY3Rpb24gPT09ICdkZXNjJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGFuaW1hdGlvbiBzdGF0ZSBmb3IgdGhlIGFycm93IGRpcmVjdGlvbiAoaW5kaWNhdG9yIGFuZCBwb2ludGVycykuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0QXJyb3dEaXJlY3Rpb25TdGF0ZSgpIHsKICAgICAgICAgICAgcmV0dXJuIGAke3RoaXMuX2lzU29ydGVkKCkgPyAnYWN0aXZlLScgOiAnJ30ke3RoaXMuX2Fycm93RGlyZWN0aW9ufWA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIGFycm93IHBvc2l0aW9uIHN0YXRlIChvcGFjaXR5LCB0cmFuc2xhdGlvbikuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0QXJyb3dWaWV3U3RhdGUoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZnJvbVN0YXRlID0gdGhpcy5fdmlld1N0YXRlLmZyb21TdGF0ZTsKICAgICAgICAgICAgcmV0dXJuIChmcm9tU3RhdGUgPyBgJHtmcm9tU3RhdGV9LXRvLWAgOiAnJykgKyB0aGlzLl92aWV3U3RhdGUudG9TdGF0ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgZGlyZWN0aW9uIHRoZSBhcnJvdyBzaG91bGQgYmUgcG9pbnRpbmcuIElmIGl0IGlzIG5vdCBzb3J0ZWQsIHRoZSBhcnJvdyBzaG91bGQgYmUKICAgICAgICAgKiBmYWNpbmcgdGhlIHN0YXJ0IGRpcmVjdGlvbi4gT3RoZXJ3aXNlIGlmIGl0IGlzIHNvcnRlZCwgdGhlIGFycm93IHNob3VsZCBwb2ludCBpbiB0aGUgY3VycmVudGx5CiAgICAgICAgICogYWN0aXZlIHNvcnRlZCBkaXJlY3Rpb24uIFRoZSByZWFzb24gdGhpcyBpcyB1cGRhdGVkIHRocm91Z2ggYSBmdW5jdGlvbiBpcyBiZWNhdXNlIHRoZSBkaXJlY3Rpb24KICAgICAgICAgKiBzaG91bGQgb25seSBiZSBjaGFuZ2VkIGF0IHNwZWNpZmljIHRpbWVzIC0gd2hlbiBkZWFjdGl2YXRlZCBidXQgdGhlIGhpbnQgaXMgZGlzcGxheWVkIGFuZCB3aGVuCiAgICAgICAgICogdGhlIHNvcnQgaXMgYWN0aXZlIGFuZCB0aGUgZGlyZWN0aW9uIGNoYW5nZXMuIE90aGVyd2lzZSB0aGUgYXJyb3cncyBkaXJlY3Rpb24gc2hvdWxkIGxpbmdlcgogICAgICAgICAqIGluIGNhc2VzIHN1Y2ggYXMgdGhlIHNvcnQgYmVjb21pbmcgZGVhY3RpdmF0ZWQgYnV0IHdlIHdhbnQgdG8gYW5pbWF0ZSB0aGUgYXJyb3cgYXdheSB3aGlsZQogICAgICAgICAqIHByZXNlcnZpbmcgaXRzIGRpcmVjdGlvbiwgZXZlbiB0aG91Z2ggdGhlIG5leHQgc29ydCBkaXJlY3Rpb24gaXMgYWN0dWFsbHkgZGlmZmVyZW50IGFuZCBzaG91bGQKICAgICAgICAgKiBvbmx5IGJlIGNoYW5nZWQgb25jZSB0aGUgYXJyb3cgZGlzcGxheXMgYWdhaW4gKGhpbnQgb3IgYWN0aXZhdGlvbikuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlQXJyb3dEaXJlY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2Fycm93RGlyZWN0aW9uID0gdGhpcy5faXNTb3J0ZWQoKSA/CiAgICAgICAgICAgICAgICB0aGlzLl9zb3J0LmRpcmVjdGlvbiA6CiAgICAgICAgICAgICAgICAodGhpcy5zdGFydCB8fCB0aGlzLl9zb3J0LnN0YXJ0KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNEaXNhYmxlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NvcnQuZGlzYWJsZWQgfHwgdGhpcy5kaXNhYmxlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0cyB0aGUgYXJpYS1zb3J0IGF0dHJpYnV0ZSB0aGF0IHNob3VsZCBiZSBhcHBsaWVkIHRvIHRoaXMgc29ydCBoZWFkZXIuIElmIHRoaXMgaGVhZGVyCiAgICAgICAgICogaXMgbm90IHNvcnRlZCwgcmV0dXJucyBudWxsIHNvIHRoYXQgdGhlIGF0dHJpYnV0ZSBpcyByZW1vdmVkIGZyb20gdGhlIGhvc3QgZWxlbWVudC4gQXJpYSBzcGVjCiAgICAgICAgICogc2F5cyB0aGF0IHRoZSBhcmlhLXNvcnQgcHJvcGVydHkgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBvbiBvbmUgaGVhZGVyIGF0IGEgdGltZSwgc28gcmVtb3ZpbmcKICAgICAgICAgKiBlbnN1cmVzIHRoaXMgaXMgdHJ1ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBcmlhU29ydEF0dHJpYnV0ZSgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pc1NvcnRlZCgpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fc29ydC5kaXJlY3Rpb24gPT0gJ2FzYycgPyAnYXNjZW5kaW5nJyA6ICdkZXNjZW5kaW5nJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgYXJyb3cgaW5zaWRlIHRoZSBzb3J0IGhlYWRlciBzaG91bGQgYmUgcmVuZGVyZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVuZGVyQXJyb3coKSB7CiAgICAgICAgICAgIHJldHVybiAhdGhpcy5faXNEaXNhYmxlZCgpIHx8IHRoaXMuX2lzU29ydGVkKCk7CiAgICAgICAgfQogICAgfQogICAgTWF0U29ydEhlYWRlci7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNvcnRIZWFkZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0U29ydEhlYWRlcikoybXJtWRpcmVjdGl2ZUluamVjdChNYXRTb3J0SGVhZGVySW50bCksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1hdFNvcnQsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KCdNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRicsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvY3VzTW9uaXRvciksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwogICAgTWF0U29ydEhlYWRlci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRTb3J0SGVhZGVyLCBzZWxlY3RvcnM6IFtbIiIsICJtYXQtc29ydC1oZWFkZXIiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LXNvcnQtaGVhZGVyIl0sIGhvc3RWYXJzOiAzLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFNvcnRIZWFkZXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWF0U29ydEhlYWRlcl9jbGlja19Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX2hhbmRsZUNsaWNrKCk7IH0pKCJtb3VzZWVudGVyIiwgZnVuY3Rpb24gTWF0U29ydEhlYWRlcl9tb3VzZWVudGVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fc2V0SW5kaWNhdG9ySGludFZpc2libGUodHJ1ZSk7IH0pKCJtb3VzZWxlYXZlIiwgZnVuY3Rpb24gTWF0U29ydEhlYWRlcl9tb3VzZWxlYXZlX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fc2V0SW5kaWNhdG9ySGludFZpc2libGUoZmFsc2UpOyB9KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1zb3J0IiwgY3R4Ll9nZXRBcmlhU29ydEF0dHJpYnV0ZSgpKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXNvcnQtaGVhZGVyLWRpc2FibGVkIiwgY3R4Ll9pc0Rpc2FibGVkKCkpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBhcnJvd1Bvc2l0aW9uOiAiYXJyb3dQb3NpdGlvbiIsIGRpc2FibGVDbGVhcjogImRpc2FibGVDbGVhciIsIGlkOiBbIm1hdC1zb3J0LWhlYWRlciIsICJpZCJdLCBzdGFydDogInN0YXJ0IiB9LCBleHBvcnRBczogWyJtYXRTb3J0SGVhZGVyIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGF0dHJzOiBfYzAkbCwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzEkYywgZGVjbHM6IDQsIHZhcnM6IDcsIGNvbnN0czogW1sxLCAibWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lciJdLCBbInR5cGUiLCAiYnV0dG9uIiwgMSwgIm1hdC1zb3J0LWhlYWRlci1idXR0b24iLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBbImNsYXNzIiwgIm1hdC1zb3J0LWhlYWRlci1hcnJvdyIsIDQsICJuZ0lmIl0sIFsxLCAibWF0LXNvcnQtaGVhZGVyLWFycm93Il0sIFsxLCAibWF0LXNvcnQtaGVhZGVyLXN0ZW0iXSwgWzEsICJtYXQtc29ydC1oZWFkZXItaW5kaWNhdG9yIl0sIFsxLCAibWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItbGVmdCJdLCBbMSwgIm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0Il0sIFsxLCAibWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItbWlkZGxlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0U29ydEhlYWRlcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImJ1dHRvbiIsIDEpOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbigyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDMsIE1hdFNvcnRIZWFkZXJfZGl2XzNfVGVtcGxhdGUsIDYsIDYsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LXNvcnQtaGVhZGVyLXNvcnRlZCIsIGN0eC5faXNTb3J0ZWQoKSkoIm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmUiLCBjdHguYXJyb3dQb3NpdGlvbiA9PSAiYmVmb3JlIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJkaXNhYmxlZCIsIGN0eC5faXNEaXNhYmxlZCgpIHx8IG51bGwpKCJhcmlhLWxhYmVsIiwgY3R4Ll9pbnRsLnNvcnRCdXR0b25MYWJlbChjdHguaWQpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5fcmVuZGVyQXJyb3coKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZl0sIHN0eWxlczogWyIubWF0LXNvcnQtaGVhZGVyLWNvbnRhaW5lcntkaXNwbGF5OmZsZXg7Y3Vyc29yOnBvaW50ZXI7YWxpZ24taXRlbXM6Y2VudGVyfS5tYXQtc29ydC1oZWFkZXItZGlzYWJsZWQgLm1hdC1zb3J0LWhlYWRlci1jb250YWluZXJ7Y3Vyc29yOmRlZmF1bHR9Lm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmV7ZmxleC1kaXJlY3Rpb246cm93LXJldmVyc2V9Lm1hdC1zb3J0LWhlYWRlci1idXR0b257Ym9yZGVyOm5vbmU7YmFja2dyb3VuZDowIDA7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtwYWRkaW5nOjA7Y3Vyc29yOmluaGVyaXQ7b3V0bGluZTowO2ZvbnQ6aW5oZXJpdDtjb2xvcjpjdXJyZW50Q29sb3I7cG9zaXRpb246cmVsYXRpdmV9W21hdC1zb3J0LWhlYWRlcl0uY2RrLWtleWJvYXJkLWZvY3VzZWQgLm1hdC1zb3J0LWhlYWRlci1idXR0b24sW21hdC1zb3J0LWhlYWRlcl0uY2RrLXByb2dyYW0tZm9jdXNlZCAubWF0LXNvcnQtaGVhZGVyLWJ1dHRvbntib3JkZXItYm90dG9tOnNvbGlkIDFweCBjdXJyZW50Q29sb3J9Lm1hdC1zb3J0LWhlYWRlci1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd3toZWlnaHQ6MTJweDt3aWR0aDoxMnB4O21pbi13aWR0aDoxMnB4O3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6ZmxleDtvcGFjaXR5OjB9Lm1hdC1zb3J0LWhlYWRlci1hcnJvdyxbZGlyPXJ0bF0gLm1hdC1zb3J0LWhlYWRlci1wb3NpdGlvbi1iZWZvcmUgLm1hdC1zb3J0LWhlYWRlci1hcnJvd3ttYXJnaW46MCAwIDAgNnB4fS5tYXQtc29ydC1oZWFkZXItcG9zaXRpb24tYmVmb3JlIC5tYXQtc29ydC1oZWFkZXItYXJyb3csW2Rpcj1ydGxdIC5tYXQtc29ydC1oZWFkZXItYXJyb3d7bWFyZ2luOjAgNnB4IDAgMH0ubWF0LXNvcnQtaGVhZGVyLXN0ZW17YmFja2dyb3VuZDpjdXJyZW50Q29sb3I7aGVpZ2h0OjEwcHg7d2lkdGg6MnB4O21hcmdpbjphdXRvO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXJ9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNvcnQtaGVhZGVyLXN0ZW17d2lkdGg6MDtib3JkZXItbGVmdDpzb2xpZCAycHh9Lm1hdC1zb3J0LWhlYWRlci1pbmRpY2F0b3J7d2lkdGg6MTAwJTtoZWlnaHQ6MnB4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7bGVmdDowfS5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1taWRkbGV7bWFyZ2luOmF1dG87aGVpZ2h0OjJweDt3aWR0aDoycHg7YmFja2dyb3VuZDpjdXJyZW50Q29sb3I7dHJhbnNmb3JtOnJvdGF0ZSg0NWRlZyl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNvcnQtaGVhZGVyLXBvaW50ZXItbWlkZGxle3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXRvcDpzb2xpZCAycHg7Ym9yZGVyLWxlZnQ6c29saWQgMnB4fS5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1sZWZ0LC5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1yaWdodHtiYWNrZ3JvdW5kOmN1cnJlbnRDb2xvcjt3aWR0aDo2cHg7aGVpZ2h0OjJweDtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1sZWZ0LC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zb3J0LWhlYWRlci1wb2ludGVyLXJpZ2h0e3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLWxlZnQ6c29saWQgNnB4O2JvcmRlci10b3A6c29saWQgMnB4fS5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1sZWZ0e3RyYW5zZm9ybS1vcmlnaW46cmlnaHQ7bGVmdDowfS5tYXQtc29ydC1oZWFkZXItcG9pbnRlci1yaWdodHt0cmFuc2Zvcm0tb3JpZ2luOmxlZnQ7cmlnaHQ6MH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBkYXRhOiB7IGFuaW1hdGlvbjogWwogICAgICAgICAgICAgICAgbWF0U29ydEFuaW1hdGlvbnMuaW5kaWNhdG9yLAogICAgICAgICAgICAgICAgbWF0U29ydEFuaW1hdGlvbnMubGVmdFBvaW50ZXIsCiAgICAgICAgICAgICAgICBtYXRTb3J0QW5pbWF0aW9ucy5yaWdodFBvaW50ZXIsCiAgICAgICAgICAgICAgICBtYXRTb3J0QW5pbWF0aW9ucy5hcnJvd09wYWNpdHksCiAgICAgICAgICAgICAgICBtYXRTb3J0QW5pbWF0aW9ucy5hcnJvd1Bvc2l0aW9uLAogICAgICAgICAgICAgICAgbWF0U29ydEFuaW1hdGlvbnMuYWxsb3dDaGlsZHJlbiwKICAgICAgICAgICAgXSB9LCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdFNvcnRIZWFkZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBNYXRTb3J0SGVhZGVySW50bCB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IE1hdFNvcnQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogWydNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRicsXSB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIE1hdFNvcnRIZWFkZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgaWQ6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdC1zb3J0LWhlYWRlcicsXSB9XSwKICAgICAgICBhcnJvd1Bvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzdGFydDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzYWJsZUNsZWFyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zb3J0L3NvcnQtbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1hdFNvcnRNb2R1bGUgewogICAgfQogICAgTWF0U29ydE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFNvcnRNb2R1bGUgfSk7CiAgICBNYXRTb3J0TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0U29ydE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRTb3J0TW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFtNQVRfU09SVF9IRUFERVJfSU5UTF9QUk9WSURFUl0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRTb3J0TW9kdWxlLCB7IGRlY2xhcmF0aW9uczogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFNvcnQsCiAgICAgICAgICAgIE1hdFNvcnRIZWFkZXJdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdFNvcnQsCiAgICAgICAgICAgIE1hdFNvcnRIZWFkZXJdOyB9IH0pOyB9KSgpOwoKICAgIGNvbnN0IF9jMCRtID0gW1tbImNhcHRpb24iXV1dOwogICAgY29uc3QgX2MxJGQgPSBbImNhcHRpb24iXTsKICAgIGZ1bmN0aW9uIENka1RleHRDb2x1bW5fdGhfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ0aCIsIDMpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJ0ZXh0LWFsaWduIiwgY3R4X3IwLmp1c3RpZnkpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLmhlYWRlclRleHQsICIgIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENka1RleHRDb2x1bW5fdGRfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ0ZCIsIDQpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBkYXRhX3IyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJ0ZXh0LWFsaWduIiwgY3R4X3IxLmp1c3RpZnkpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IxLmRhdGFBY2Nlc3NvcihkYXRhX3IyLCBjdHhfcjEubmFtZSksICIgIik7CiAgICB9IH0KICAgIC8qKgogICAgICogTWl4aW4gdG8gcHJvdmlkZSBhIGRpcmVjdGl2ZSB3aXRoIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgaWYgdGhlIHN0aWNreSBpbnB1dCBoYXMgYmVlbgogICAgICogY2hhbmdlZCBzaW5jZSB0aGUgbGFzdCB0aW1lIHRoZSBmdW5jdGlvbiB3YXMgY2FsbGVkLiBFc3NlbnRpYWxseSBhZGRzIGEgZGlydHktY2hlY2sgdG8gdGhlCiAgICAgKiBzdGlja3kgdmFsdWUuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gYmFzZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gbWl4aW5IYXNTdGlja3lJbnB1dChiYXNlKSB7CiAgICAgICAgcmV0dXJuIGNsYXNzIGV4dGVuZHMgYmFzZSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gey4uLj99IGFyZ3MKICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbnN0cnVjdG9yKC4uLmFyZ3MpIHsKICAgICAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3MpOwogICAgICAgICAgICAgICAgdGhpcy5fc3RpY2t5ID0gZmFsc2U7CiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIHN0aWNreSBpbnB1dCBoYXMgY2hhbmdlZCBzaW5jZSBpdCB3YXMgbGFzdCBjaGVja2VkLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0aGlzLl9oYXNTdGlja3lDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgc3RpY2t5IHBvc2l0aW9uaW5nIHNob3VsZCBiZSBhcHBsaWVkLgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZ2V0IHN0aWNreSgpIHsgcmV0dXJuIHRoaXMuX3N0aWNreTsgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzZXQgc3RpY2t5KHYpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHByZXZWYWx1ZSA9IHRoaXMuX3N0aWNreTsKICAgICAgICAgICAgICAgIHRoaXMuX3N0aWNreSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTsKICAgICAgICAgICAgICAgIHRoaXMuX2hhc1N0aWNreUNoYW5nZWQgPSBwcmV2VmFsdWUgIT09IHRoaXMuX3N0aWNreTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgc3RpY2t5IHZhbHVlIGhhcyBjaGFuZ2VkIHNpbmNlIHRoaXMgd2FzIGxhc3QgY2FsbGVkLgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgaGFzU3RpY2t5Q2hhbmdlZCgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGhhc1N0aWNreUNoYW5nZWQgPSB0aGlzLl9oYXNTdGlja3lDaGFuZ2VkOwogICAgICAgICAgICAgICAgdGhpcy5faGFzU3RpY2t5Q2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgcmV0dXJuIGhhc1N0aWNreUNoYW5nZWQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFJlc2V0cyB0aGUgZGlydHkgY2hlY2sgZm9yIGNhc2VzIHdoZXJlIHRoZSBzdGlja3kgc3RhdGUgaGFzIGJlZW4gdXNlZCB3aXRob3V0IGNoZWNraW5nLgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcmVzZXRTdGlja3lDaGFuZ2VkKCkgewogICAgICAgICAgICAgICAgdGhpcy5faGFzU3RpY2t5Q2hhbmdlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvdGFibGUvdG9rZW5zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVXNlZCB0byBwcm92aWRlIGEgdGFibGUgdG8gc29tZSBvZiB0aGUgc3ViLWNvbXBvbmVudHMgd2l0aG91dCBjYXVzaW5nIGEgY2lyY3VsYXIgZGVwZW5kZW5jeS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQ0RLX1RBQkxFID0gbmV3IEluamVjdGlvblRva2VuKCdDREtfVEFCTEUnKTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgdGV4dCBjb2x1bW4gb3B0aW9ucy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBURVhUX0NPTFVNTl9PUFRJT05TID0gbmV3IEluamVjdGlvblRva2VuKCd0ZXh0LWNvbHVtbi1vcHRpb25zJyk7CiAgICAvKioKICAgICAqIENlbGwgZGVmaW5pdGlvbiBmb3IgYSBDREsgdGFibGUuCiAgICAgKiBDYXB0dXJlcyB0aGUgdGVtcGxhdGUgb2YgYSBjb2x1bW4ncyBkYXRhIHJvdyBjZWxsIGFzIHdlbGwgYXMgY2VsbC1zcGVjaWZpYyBwcm9wZXJ0aWVzLgogICAgICovCiAgICBjbGFzcyBDZGtDZWxsRGVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoLyoqIEBkb2NzLXByaXZhdGUgKi8gdGVtcGxhdGUpIHsKICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IHRlbXBsYXRlOwogICAgICAgIH0KICAgIH0KICAgIENka0NlbGxEZWYuybVmYWMgPSBmdW5jdGlvbiBDZGtDZWxsRGVmX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka0NlbGxEZWYpKMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpKTsgfTsKICAgIENka0NlbGxEZWYuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQ2VsbERlZiwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrQ2VsbERlZiIsICIiXV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka0NlbGxEZWYuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9CiAgICBdOwogICAgLyoqCiAgICAgKiBIZWFkZXIgY2VsbCBkZWZpbml0aW9uIGZvciBhIENESyB0YWJsZS4KICAgICAqIENhcHR1cmVzIHRoZSB0ZW1wbGF0ZSBvZiBhIGNvbHVtbidzIGhlYWRlciBjZWxsIGFuZCBhcyB3ZWxsIGFzIGNlbGwtc3BlY2lmaWMgcHJvcGVydGllcy4KICAgICAqLwogICAgY2xhc3MgQ2RrSGVhZGVyQ2VsbERlZiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKC8qKiBAZG9jcy1wcml2YXRlICovIHRlbXBsYXRlKSB7CiAgICAgICAgICAgIHRoaXMudGVtcGxhdGUgPSB0ZW1wbGF0ZTsKICAgICAgICB9CiAgICB9CiAgICBDZGtIZWFkZXJDZWxsRGVmLsm1ZmFjID0gZnVuY3Rpb24gQ2RrSGVhZGVyQ2VsbERlZl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtIZWFkZXJDZWxsRGVmKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSk7IH07CiAgICBDZGtIZWFkZXJDZWxsRGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0hlYWRlckNlbGxEZWYsIHNlbGVjdG9yczogW1siIiwgImNka0hlYWRlckNlbGxEZWYiLCAiIl1dIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtIZWFkZXJDZWxsRGVmLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogRm9vdGVyIGNlbGwgZGVmaW5pdGlvbiBmb3IgYSBDREsgdGFibGUuCiAgICAgKiBDYXB0dXJlcyB0aGUgdGVtcGxhdGUgb2YgYSBjb2x1bW4ncyBmb290ZXIgY2VsbCBhbmQgYXMgd2VsbCBhcyBjZWxsLXNwZWNpZmljIHByb3BlcnRpZXMuCiAgICAgKi8KICAgIGNsYXNzIENka0Zvb3RlckNlbGxEZWYgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcigvKiogQGRvY3MtcHJpdmF0ZSAqLyB0ZW1wbGF0ZSkgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgfQogICAgfQogICAgQ2RrRm9vdGVyQ2VsbERlZi7JtWZhYyA9IGZ1bmN0aW9uIENka0Zvb3RlckNlbGxEZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrRm9vdGVyQ2VsbERlZikoybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZikpOyB9OwogICAgQ2RrRm9vdGVyQ2VsbERlZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBDZGtGb290ZXJDZWxsRGVmLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtGb290ZXJDZWxsRGVmIiwgIiJdXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrRm9vdGVyQ2VsbERlZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0KICAgIF07CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIENka0NvbHVtbkRlZi4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgQ2RrQ29sdW1uRGVmQmFzZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfQ2RrQ29sdW1uRGVmQmFzZSA9IG1peGluSGFzU3RpY2t5SW5wdXQoQ2RrQ29sdW1uRGVmQmFzZSk7CiAgICAvKioKICAgICAqIENvbHVtbiBkZWZpbml0aW9uIGZvciB0aGUgQ0RLIHRhYmxlLgogICAgICogRGVmaW5lcyBhIHNldCBvZiBjZWxscyBhdmFpbGFibGUgZm9yIGEgdGFibGUgY29sdW1uLgogICAgICovCiAgICBjbGFzcyBDZGtDb2x1bW5EZWYgZXh0ZW5kcyBfQ2RrQ29sdW1uRGVmQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/PX0gX3RhYmxlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3RhYmxlKSB7CiAgICAgICAgICAgIHN1cGVyKCk7CiAgICAgICAgICAgIHRoaXMuX3RhYmxlID0gX3RhYmxlOwogICAgICAgICAgICB0aGlzLl9zdGlja3lFbmQgPSBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVW5pcXVlIG5hbWUgZm9yIHRoaXMgY29sdW1uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IG5hbWUoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9uYW1lOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBuYW1lKG5hbWUpIHsKICAgICAgICAgICAgLy8gSWYgdGhlIGRpcmVjdGl2ZSBpcyBzZXQgd2l0aG91dCBhIG5hbWUgKHVwZGF0ZWQgcHJvZ3JhbWF0aWNhbGx5KSwgdGhlbiB0aGlzIHNldHRlciB3aWxsCiAgICAgICAgICAgIC8vIHRyaWdnZXIgd2l0aCBhbiBlbXB0eSBzdHJpbmcgYW5kIHNob3VsZCBub3Qgb3ZlcndyaXRlIHRoZSBwcm9ncmFtYXRpY2FsbHkgc2V0IHZhbHVlLgogICAgICAgICAgICBpZiAobmFtZSkgewogICAgICAgICAgICAgICAgdGhpcy5fbmFtZSA9IG5hbWU7CiAgICAgICAgICAgICAgICB0aGlzLmNzc0NsYXNzRnJpZW5kbHlOYW1lID0gbmFtZS5yZXBsYWNlKC9bXmEtejAtOV8tXS9pZywgJy0nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoaXMgY29sdW1uIHNob3VsZCBiZSBzdGlja3kgcG9zaXRpb25lZCBvbiB0aGUgZW5kIG9mIHRoZSByb3cuIFNob3VsZCBtYWtlIHN1cmUKICAgICAgICAgKiB0aGF0IGl0IG1pbWljcyB0aGUgYENhblN0aWNrYCBtaXhpbiBzdWNoIHRoYXQgYF9oYXNTdGlja3lDaGFuZ2VkYCBpcyBzZXQgdG8gdHJ1ZSBpZiB0aGUgdmFsdWUKICAgICAgICAgKiBoYXMgYmVlbiBjaGFuZ2VkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHN0aWNreUVuZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3N0aWNreUVuZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgc3RpY2t5RW5kKHYpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2VmFsdWUgPSB0aGlzLl9zdGlja3lFbmQ7CiAgICAgICAgICAgIHRoaXMuX3N0aWNreUVuZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTsKICAgICAgICAgICAgdGhpcy5faGFzU3RpY2t5Q2hhbmdlZCA9IHByZXZWYWx1ZSAhPT0gdGhpcy5fc3RpY2t5RW5kOwogICAgICAgIH0KICAgIH0KICAgIENka0NvbHVtbkRlZi7JtWZhYyA9IGZ1bmN0aW9uIENka0NvbHVtbkRlZl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtDb2x1bW5EZWYpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ0RLX1RBQkxFLCA4KSk7IH07CiAgICBDZGtDb2x1bW5EZWYuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQ29sdW1uRGVmLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtDb2x1bW5EZWYiLCAiIl1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gQ2RrQ29sdW1uRGVmX0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgQ2RrQ2VsbERlZiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIENka0hlYWRlckNlbGxEZWYsIHRydWUpOwogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBDZGtGb290ZXJDZWxsRGVmLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmNlbGwgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguaGVhZGVyQ2VsbCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5mb290ZXJDZWxsID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IHN0aWNreTogInN0aWNreSIsIG5hbWU6IFsiY2RrQ29sdW1uRGVmIiwgIm5hbWUiXSwgc3RpY2t5RW5kOiAic3RpY2t5RW5kIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6ICdNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRicsIHVzZUV4aXN0aW5nOiBDZGtDb2x1bW5EZWYgfV0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrQ29sdW1uRGVmLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtDREtfVEFCTEUsXSB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CiAgICBDZGtDb2x1bW5EZWYucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmFtZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2RrQ29sdW1uRGVmJyxdIH1dLAogICAgICAgIHN0aWNreUVuZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnc3RpY2t5RW5kJyxdIH1dLAogICAgICAgIGNlbGw6IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW0Nka0NlbGxEZWYsXSB9XSwKICAgICAgICBoZWFkZXJDZWxsOiBbeyB0eXBlOiBDb250ZW50Q2hpbGQsIGFyZ3M6IFtDZGtIZWFkZXJDZWxsRGVmLF0gfV0sCiAgICAgICAgZm9vdGVyQ2VsbDogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbQ2RrRm9vdGVyQ2VsbERlZixdIH1dCiAgICB9OwogICAgLyoqCiAgICAgKiBCYXNlIGNsYXNzIGZvciB0aGUgY2VsbHMuIEFkZHMgYSBDU1MgY2xhc3NuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGUgY29sdW1uIGl0IHJlbmRlcnMgaW4uCiAgICAgKi8KICAgIGNsYXNzIEJhc2VDZGtDZWxsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbHVtbkRlZgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbHVtbkRlZiwgZWxlbWVudFJlZikgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbHVtbkNsYXNzTmFtZSA9IGBjZGstY29sdW1uLSR7Y29sdW1uRGVmLmNzc0NsYXNzRnJpZW5kbHlOYW1lfWA7CiAgICAgICAgICAgIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGNvbHVtbkNsYXNzTmFtZSk7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBIZWFkZXIgY2VsbCB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBhZGRzIHRoZSByaWdodCBjbGFzc2VzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBDZGtIZWFkZXJDZWxsIGV4dGVuZHMgQmFzZUNka0NlbGwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29sdW1uRGVmCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29sdW1uRGVmLCBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHN1cGVyKGNvbHVtbkRlZiwgZWxlbWVudFJlZik7CiAgICAgICAgfQogICAgfQogICAgQ2RrSGVhZGVyQ2VsbC7JtWZhYyA9IGZ1bmN0aW9uIENka0hlYWRlckNlbGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrSGVhZGVyQ2VsbCkoybXJtWRpcmVjdGl2ZUluamVjdChDZGtDb2x1bW5EZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIENka0hlYWRlckNlbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrSGVhZGVyQ2VsbCwgc2VsZWN0b3JzOiBbWyJjZGstaGVhZGVyLWNlbGwiXSwgWyJ0aCIsICJjZGstaGVhZGVyLWNlbGwiLCAiIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJjb2x1bW5oZWFkZXIiLCAxLCAiY2RrLWhlYWRlci1jZWxsIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka0hlYWRlckNlbGwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDZGtDb2x1bW5EZWYgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogRm9vdGVyIGNlbGwgdGVtcGxhdGUgY29udGFpbmVyIHRoYXQgYWRkcyB0aGUgcmlnaHQgY2xhc3NlcyBhbmQgcm9sZS4KICAgICAqLwogICAgY2xhc3MgQ2RrRm9vdGVyQ2VsbCBleHRlbmRzIEJhc2VDZGtDZWxsIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbHVtbkRlZgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNvbHVtbkRlZiwgZWxlbWVudFJlZikgewogICAgICAgICAgICBzdXBlcihjb2x1bW5EZWYsIGVsZW1lbnRSZWYpOwogICAgICAgIH0KICAgIH0KICAgIENka0Zvb3RlckNlbGwuybVmYWMgPSBmdW5jdGlvbiBDZGtGb290ZXJDZWxsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka0Zvb3RlckNlbGwpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ2RrQ29sdW1uRGVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICBDZGtGb290ZXJDZWxsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0Zvb3RlckNlbGwsIHNlbGVjdG9yczogW1siY2RrLWZvb3Rlci1jZWxsIl0sIFsidGQiLCAiY2RrLWZvb3Rlci1jZWxsIiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAiZ3JpZGNlbGwiLCAxLCAiY2RrLWZvb3Rlci1jZWxsIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka0Zvb3RlckNlbGwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDZGtDb2x1bW5EZWYgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogQ2VsbCB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBhZGRzIHRoZSByaWdodCBjbGFzc2VzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBDZGtDZWxsIGV4dGVuZHMgQmFzZUNka0NlbGwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29sdW1uRGVmCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29sdW1uRGVmLCBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHN1cGVyKGNvbHVtbkRlZiwgZWxlbWVudFJlZik7CiAgICAgICAgfQogICAgfQogICAgQ2RrQ2VsbC7JtWZhYyA9IGZ1bmN0aW9uIENka0NlbGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrQ2VsbCkoybXJtWRpcmVjdGl2ZUluamVjdChDZGtDb2x1bW5EZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIENka0NlbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrQ2VsbCwgc2VsZWN0b3JzOiBbWyJjZGstY2VsbCJdLCBbInRkIiwgImNkay1jZWxsIiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAiZ3JpZGNlbGwiLCAxLCAiY2RrLWNlbGwiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrQ2VsbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IENka0NvbHVtbkRlZiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgLyoqCiAgICAgKiBCYXNlIGNsYXNzIGZvciB0aGUgQ2RrSGVhZGVyUm93RGVmIGFuZCBDZGtSb3dEZWYgdGhhdCBoYW5kbGVzIGNoZWNraW5nIHRoZWlyIGNvbHVtbnMgaW5wdXRzCiAgICAgKiBmb3IgY2hhbmdlcyBhbmQgbm90aWZ5aW5nIHRoZSB0YWJsZS4KICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBCYXNlUm93RGVmIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlmZmVycwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBfZGlmZmVycykgewogICAgICAgICAgICB0aGlzLnRlbXBsYXRlID0gdGVtcGxhdGU7CiAgICAgICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVyczsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBjb2x1bW5zIGRpZmZlciBpZiBvbmUgZG9lcyBub3QgeWV0IGV4aXN0LiBJbml0aWFsaXplIGl0IGJhc2VkIG9uIGluaXRpYWwgdmFsdWUKICAgICAgICAgICAgLy8gb2YgdGhlIGNvbHVtbnMgcHJvcGVydHkgb3IgYW4gZW1wdHkgYXJyYXkgaWYgbm9uZSBpcyBwcm92aWRlZC4KICAgICAgICAgICAgaWYgKCF0aGlzLl9jb2x1bW5zRGlmZmVyKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gKGNoYW5nZXNbJ2NvbHVtbnMnXSAmJiBjaGFuZ2VzWydjb2x1bW5zJ10uY3VycmVudFZhbHVlKSB8fCBbXTsKICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbnNEaWZmZXIgPSB0aGlzLl9kaWZmZXJzLmZpbmQoY29sdW1ucykuY3JlYXRlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jb2x1bW5zRGlmZmVyLmRpZmYoY29sdW1ucyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSBjdXJyZW50IGNvbHVtbnMgYW5kIHRoZSBjb2x1bW5zIGZyb20gdGhlIGxhc3QgZGlmZiwgb3IgbnVsbAogICAgICAgICAqIGlmIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRDb2x1bW5zRGlmZigpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbHVtbnNEaWZmZXIuZGlmZih0aGlzLmNvbHVtbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoaXMgcm93IGRlZidzIHJlbGV2YW50IGNlbGwgdGVtcGxhdGUgZnJvbSB0aGUgcHJvdmlkZWQgY29sdW1uIGRlZi4KICAgICAgICAgKiBAcGFyYW0gez99IGNvbHVtbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZXh0cmFjdENlbGxUZW1wbGF0ZShjb2x1bW4pIHsKICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBDZGtIZWFkZXJSb3dEZWYpIHsKICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4uaGVhZGVyQ2VsbC50ZW1wbGF0ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIENka0Zvb3RlclJvd0RlZikgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5mb290ZXJDZWxsLnRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5jZWxsLnRlbXBsYXRlOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgQmFzZVJvd0RlZi7JtWZhYyA9IGZ1bmN0aW9uIEJhc2VSb3dEZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQmFzZVJvd0RlZikoybXJtWRpcmVjdGl2ZUluamVjdChUZW1wbGF0ZVJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoSXRlcmFibGVEaWZmZXJzKSk7IH07CiAgICBCYXNlUm93RGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEJhc2VSb3dEZWYsIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEJhc2VSb3dEZWYuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9LAogICAgICAgIHsgdHlwZTogSXRlcmFibGVEaWZmZXJzIH0KICAgIF07CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIENka0hlYWRlclJvd0RlZi4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgQ2RrSGVhZGVyUm93RGVmQmFzZSBleHRlbmRzIEJhc2VSb3dEZWYgewogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX0Nka0hlYWRlclJvd0RlZkJhc2UgPSBtaXhpbkhhc1N0aWNreUlucHV0KENka0hlYWRlclJvd0RlZkJhc2UpOwogICAgLyoqCiAgICAgKiBIZWFkZXIgcm93IGRlZmluaXRpb24gZm9yIHRoZSBDREsgdGFibGUuCiAgICAgKiBDYXB0dXJlcyB0aGUgaGVhZGVyIHJvdydzIHRlbXBsYXRlIGFuZCBvdGhlciBoZWFkZXIgcHJvcGVydGllcyBzdWNoIGFzIHRoZSBjb2x1bW5zIHRvIGRpc3BsYXkuCiAgICAgKi8KICAgIGNsYXNzIENka0hlYWRlclJvd0RlZiBleHRlbmRzIF9DZGtIZWFkZXJSb3dEZWZCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRlbXBsYXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlmZmVycwogICAgICAgICAqIEBwYXJhbSB7Pz19IF90YWJsZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHRlbXBsYXRlLCBfZGlmZmVycywgX3RhYmxlKSB7CiAgICAgICAgICAgIHN1cGVyKHRlbXBsYXRlLCBfZGlmZmVycyk7CiAgICAgICAgICAgIHRoaXMuX3RhYmxlID0gX3RhYmxlOwogICAgICAgIH0KICAgICAgICAvLyBQcmVyZW5kZXIgZmFpbHMgdG8gcmVjb2duaXplIHRoYXQgbmdPbkNoYW5nZXMgaW4gYSBwYXJ0IG9mIHRoaXMgY2xhc3MgdGhyb3VnaCBpbmhlcml0YW5jZS4KICAgICAgICAvLyBFeHBsaWNpdGx5IGRlZmluZSBpdCBzbyB0aGF0IHRoZSBtZXRob2QgaXMgY2FsbGVkIGFzIHBhcnQgb2YgdGhlIEFuZ3VsYXIgbGlmZWN5Y2xlLgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTsKICAgICAgICB9CiAgICB9CiAgICBDZGtIZWFkZXJSb3dEZWYuybVmYWMgPSBmdW5jdGlvbiBDZGtIZWFkZXJSb3dEZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrSGVhZGVyUm93RGVmKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChJdGVyYWJsZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENES19UQUJMRSwgOCkpOyB9OwogICAgQ2RrSGVhZGVyUm93RGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0hlYWRlclJvd0RlZiwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrSGVhZGVyUm93RGVmIiwgIiJdXSwgaW5wdXRzOiB7IGNvbHVtbnM6IFsiY2RrSGVhZGVyUm93RGVmIiwgImNvbHVtbnMiXSwgc3RpY2t5OiBbImNka0hlYWRlclJvd0RlZlN0aWNreSIsICJzdGlja3kiXSB9LCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmUsIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtIZWFkZXJSb3dEZWYuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBUZW1wbGF0ZVJlZiB9LAogICAgICAgIHsgdHlwZTogSXRlcmFibGVEaWZmZXJzIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW0NES19UQUJMRSxdIH0sIHsgdHlwZTogT3B0aW9uYWwgfV0gfQogICAgXTsKICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gQ2RrRm9vdGVyUm93RGVmLgogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBDZGtGb290ZXJSb3dEZWZCYXNlIGV4dGVuZHMgQmFzZVJvd0RlZiB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfQ2RrRm9vdGVyUm93RGVmQmFzZSA9IG1peGluSGFzU3RpY2t5SW5wdXQoQ2RrRm9vdGVyUm93RGVmQmFzZSk7CiAgICAvKioKICAgICAqIEZvb3RlciByb3cgZGVmaW5pdGlvbiBmb3IgdGhlIENESyB0YWJsZS4KICAgICAqIENhcHR1cmVzIHRoZSBmb290ZXIgcm93J3MgdGVtcGxhdGUgYW5kIG90aGVyIGZvb3RlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgdGhlIGNvbHVtbnMgdG8gZGlzcGxheS4KICAgICAqLwogICAgY2xhc3MgQ2RrRm9vdGVyUm93RGVmIGV4dGVuZHMgX0Nka0Zvb3RlclJvd0RlZkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdGVtcGxhdGUKICAgICAgICAgKiBAcGFyYW0gez99IF9kaWZmZXJzCiAgICAgICAgICogQHBhcmFtIHs/PX0gX3RhYmxlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IodGVtcGxhdGUsIF9kaWZmZXJzLCBfdGFibGUpIHsKICAgICAgICAgICAgc3VwZXIodGVtcGxhdGUsIF9kaWZmZXJzKTsKICAgICAgICAgICAgdGhpcy5fdGFibGUgPSBfdGFibGU7CiAgICAgICAgfQogICAgICAgIC8vIFByZXJlbmRlciBmYWlscyB0byByZWNvZ25pemUgdGhhdCBuZ09uQ2hhbmdlcyBpbiBhIHBhcnQgb2YgdGhpcyBjbGFzcyB0aHJvdWdoIGluaGVyaXRhbmNlLgogICAgICAgIC8vIEV4cGxpY2l0bHkgZGVmaW5lIGl0IHNvIHRoYXQgdGhlIG1ldGhvZCBpcyBjYWxsZWQgYXMgcGFydCBvZiB0aGUgQW5ndWxhciBsaWZlY3ljbGUuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpOwogICAgICAgIH0KICAgIH0KICAgIENka0Zvb3RlclJvd0RlZi7JtWZhYyA9IGZ1bmN0aW9uIENka0Zvb3RlclJvd0RlZl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtGb290ZXJSb3dEZWYpKMm1ybVkaXJlY3RpdmVJbmplY3QoVGVtcGxhdGVSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEl0ZXJhYmxlRGlmZmVycyksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ0RLX1RBQkxFLCA4KSk7IH07CiAgICBDZGtGb290ZXJSb3dEZWYuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2RrRm9vdGVyUm93RGVmLCBzZWxlY3RvcnM6IFtbIiIsICJjZGtGb290ZXJSb3dEZWYiLCAiIl1dLCBpbnB1dHM6IHsgY29sdW1uczogWyJjZGtGb290ZXJSb3dEZWYiLCAiY29sdW1ucyJdLCBzdGlja3k6IFsiY2RrRm9vdGVyUm93RGVmU3RpY2t5IiwgInN0aWNreSJdIH0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZSwgybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENka0Zvb3RlclJvd0RlZi5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFRlbXBsYXRlUmVmIH0sCiAgICAgICAgeyB0eXBlOiBJdGVyYWJsZURpZmZlcnMgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbQ0RLX1RBQkxFLF0gfSwgeyB0eXBlOiBPcHRpb25hbCB9XSB9CiAgICBdOwogICAgLyoqCiAgICAgKiBEYXRhIHJvdyBkZWZpbml0aW9uIGZvciB0aGUgQ0RLIHRhYmxlLgogICAgICogQ2FwdHVyZXMgdGhlIGhlYWRlciByb3cncyB0ZW1wbGF0ZSBhbmQgb3RoZXIgcm93IHByb3BlcnRpZXMgc3VjaCBhcyB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGFuZAogICAgICogYSB3aGVuIHByZWRpY2F0ZSB0aGF0IGRlc2NyaWJlcyB3aGVuIHRoaXMgcm93IHNob3VsZCBiZSB1c2VkLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgQ2RrUm93RGVmIGV4dGVuZHMgQmFzZVJvd0RlZiB7CiAgICAgICAgLy8gVE9ETyhhbmRyZXdzZWd1aW4pOiBBZGQgYW4gaW5wdXQgZm9yIHByb3ZpZGluZyBhIHN3aXRjaCBmdW5jdGlvbiB0byBkZXRlcm1pbmUKICAgICAgICAvLyAgIGlmIHRoaXMgdGVtcGxhdGUgc2hvdWxkIGJlIHVzZWQuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0ZW1wbGF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gX2RpZmZlcnMKICAgICAgICAgKiBAcGFyYW0gez89fSBfdGFibGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0ZW1wbGF0ZSwgX2RpZmZlcnMsIF90YWJsZSkgewogICAgICAgICAgICBzdXBlcih0ZW1wbGF0ZSwgX2RpZmZlcnMpOwogICAgICAgICAgICB0aGlzLl90YWJsZSA9IF90YWJsZTsKICAgICAgICB9CiAgICB9CiAgICBDZGtSb3dEZWYuybVmYWMgPSBmdW5jdGlvbiBDZGtSb3dEZWZfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrUm93RGVmKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFRlbXBsYXRlUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChJdGVyYWJsZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENES19UQUJMRSwgOCkpOyB9OwogICAgQ2RrUm93RGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka1Jvd0RlZiwgc2VsZWN0b3JzOiBbWyIiLCAiY2RrUm93RGVmIiwgIiJdXSwgaW5wdXRzOiB7IGNvbHVtbnM6IFsiY2RrUm93RGVmQ29sdW1ucyIsICJjb2x1bW5zIl0sIHdoZW46IFsiY2RrUm93RGVmV2hlbiIsICJ3aGVuIl0gfSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrUm93RGVmLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVGVtcGxhdGVSZWYgfSwKICAgICAgICB7IHR5cGU6IEl0ZXJhYmxlRGlmZmVycyB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtDREtfVEFCTEUsXSB9LCB7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CiAgICAvKioKICAgICAqIE91dGxldCBmb3IgcmVuZGVyaW5nIGNlbGxzIGluc2lkZSBvZiBhIHJvdyBvciBoZWFkZXIgcm93LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgQ2RrQ2VsbE91dGxldCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdmlld0NvbnRhaW5lcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF92aWV3Q29udGFpbmVyKSB7CiAgICAgICAgICAgIHRoaXMuX3ZpZXdDb250YWluZXIgPSBfdmlld0NvbnRhaW5lcjsKICAgICAgICAgICAgQ2RrQ2VsbE91dGxldC5tb3N0UmVjZW50Q2VsbE91dGxldCA9IHRoaXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIC8vIElmIHRoaXMgd2FzIHRoZSBsYXN0IG91dGxldCBiZWluZyByZW5kZXJlZCBpbiB0aGUgdmlldywgcmVtb3ZlIHRoZSByZWZlcmVuY2UKICAgICAgICAgICAgLy8gZnJvbSB0aGUgc3RhdGljIHByb3BlcnR5IGFmdGVyIGl0IGhhcyBiZWVuIGRlc3Ryb3llZCB0byBhdm9pZCBsZWFraW5nIG1lbW9yeS4KICAgICAgICAgICAgaWYgKENka0NlbGxPdXRsZXQubW9zdFJlY2VudENlbGxPdXRsZXQgPT09IHRoaXMpIHsKICAgICAgICAgICAgICAgIENka0NlbGxPdXRsZXQubW9zdFJlY2VudENlbGxPdXRsZXQgPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgQ2RrQ2VsbE91dGxldC7JtWZhYyA9IGZ1bmN0aW9uIENka0NlbGxPdXRsZXRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrQ2VsbE91dGxldCkoybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSk7IH07CiAgICBDZGtDZWxsT3V0bGV0Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENka0NlbGxPdXRsZXQsIHNlbGVjdG9yczogW1siIiwgImNka0NlbGxPdXRsZXQiLCAiIl1dIH0pOwogICAgLyoqCiAgICAgKiBTdGF0aWMgcHJvcGVydHkgY29udGFpbmluZyB0aGUgbGF0ZXN0IGNvbnN0cnVjdGVkIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuCiAgICAgKiBVc2VkIGJ5IHRoZSBDREsgdGFibGUgd2hlbiBlYWNoIENka0hlYWRlclJvdyBhbmQgQ2RrUm93IGNvbXBvbmVudCBpcyBjcmVhdGVkIHVzaW5nCiAgICAgKiBjcmVhdGVFbWJlZGRlZFZpZXcuIEFmdGVyIG9uZSBvZiB0aGVzZSBjb21wb25lbnRzIGFyZSBjcmVhdGVkLCB0aGlzIHByb3BlcnR5IHdpbGwgcHJvdmlkZQogICAgICogYSBoYW5kbGUgdG8gcHJvdmlkZSB0aGF0IGNvbXBvbmVudCdzIGNlbGxzIGFuZCBjb250ZXh0LiBBZnRlciBpbml0LCB0aGUgQ2RrQ2VsbE91dGxldCB3aWxsCiAgICAgKiBjb25zdHJ1Y3QgdGhlIGNlbGxzIHdpdGggdGhlIHByb3ZpZGVkIGNvbnRleHQuCiAgICAgKi8KICAgIENka0NlbGxPdXRsZXQubW9zdFJlY2VudENlbGxPdXRsZXQgPSBudWxsOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtDZWxsT3V0bGV0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9CiAgICBdOwogICAgLyoqCiAgICAgKiBIZWFkZXIgdGVtcGxhdGUgY29udGFpbmVyIHRoYXQgY29udGFpbnMgdGhlIGNlbGwgb3V0bGV0LiBBZGRzIHRoZSByaWdodCBjbGFzcyBhbmQgcm9sZS4KICAgICAqLwogICAgY2xhc3MgQ2RrSGVhZGVyUm93IHsKICAgIH0KICAgIENka0hlYWRlclJvdy7JtWZhYyA9IGZ1bmN0aW9uIENka0hlYWRlclJvd19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtIZWFkZXJSb3cpKCk7IH07CiAgICBDZGtIZWFkZXJSb3cuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2RrSGVhZGVyUm93LCBzZWxlY3RvcnM6IFtbImNkay1oZWFkZXItcm93Il0sIFsidHIiLCAiY2RrLWhlYWRlci1yb3ciLCAiIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJyb3ciLCAxLCAiY2RrLWhlYWRlci1yb3ciXSwgZGVjbHM6IDEsIHZhcnM6IDAsIGNvbnN0czogW1siY2RrQ2VsbE91dGxldCIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBDZGtIZWFkZXJSb3dfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDAsIDApOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0Nka0NlbGxPdXRsZXRdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwogICAgLyoqCiAgICAgKiBGb290ZXIgdGVtcGxhdGUgY29udGFpbmVyIHRoYXQgY29udGFpbnMgdGhlIGNlbGwgb3V0bGV0LiBBZGRzIHRoZSByaWdodCBjbGFzcyBhbmQgcm9sZS4KICAgICAqLwogICAgY2xhc3MgQ2RrRm9vdGVyUm93IHsKICAgIH0KICAgIENka0Zvb3RlclJvdy7JtWZhYyA9IGZ1bmN0aW9uIENka0Zvb3RlclJvd19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtGb290ZXJSb3cpKCk7IH07CiAgICBDZGtGb290ZXJSb3cuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2RrRm9vdGVyUm93LCBzZWxlY3RvcnM6IFtbImNkay1mb290ZXItcm93Il0sIFsidHIiLCAiY2RrLWZvb3Rlci1yb3ciLCAiIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJyb3ciLCAxLCAiY2RrLWZvb3Rlci1yb3ciXSwgZGVjbHM6IDEsIHZhcnM6IDAsIGNvbnN0czogW1siY2RrQ2VsbE91dGxldCIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBDZGtGb290ZXJSb3dfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDAsIDApOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0Nka0NlbGxPdXRsZXRdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwogICAgLyoqCiAgICAgKiBEYXRhIHJvdyB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBjb250YWlucyB0aGUgY2VsbCBvdXRsZXQuIEFkZHMgdGhlIHJpZ2h0IGNsYXNzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBDZGtSb3cgewogICAgfQogICAgQ2RrUm93Lsm1ZmFjID0gZnVuY3Rpb24gQ2RrUm93X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENka1JvdykoKTsgfTsKICAgIENka1Jvdy7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBDZGtSb3csIHNlbGVjdG9yczogW1siY2RrLXJvdyJdLCBbInRyIiwgImNkay1yb3ciLCAiIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJyb3ciLCAxLCAiY2RrLXJvdyJdLCBkZWNsczogMSwgdmFyczogMCwgY29uc3RzOiBbWyJjZGtDZWxsT3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIENka1Jvd19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMCwgMCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbQ2RrQ2VsbE91dGxldF0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3RhYmxlL3N0aWNreS1zdHlsZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAbGljZW5zZQogICAgICogQ29weXJpZ2h0IEdvb2dsZSBMTEMgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KICAgICAqCiAgICAgKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogICAgICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2FuZ3VsYXIuaW8vbGljZW5zZQogICAgICovCiAgICAvKioKICAgICAqIExpc3Qgb2YgYWxsIHBvc3NpYmxlIGRpcmVjdGlvbnMgdGhhdCBjYW4gYmUgdXNlZCBmb3Igc3RpY2t5IHBvc2l0aW9uaW5nLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBTVElDS1lfRElSRUNUSU9OUyA9IFsndG9wJywgJ2JvdHRvbScsICdsZWZ0JywgJ3JpZ2h0J107CiAgICAvKioKICAgICAqIEFwcGxpZXMgYW5kIHJlbW92ZXMgc3RpY2t5IHBvc2l0aW9uaW5nIHN0eWxlcyB0byB0aGUgYENka1RhYmxlYCByb3dzIGFuZCBjb2x1bW5zIGNlbGxzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgU3RpY2t5U3R5bGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9pc05hdGl2ZUh0bWxUYWJsZSBXaGV0aGVyIHRoZSBzdGlja3kgbG9naWMgc2hvdWxkIGJlIGJhc2VkIG9uIGEgdGFibGUKICAgICAgICAgKiAgICAgdGhhdCB1c2VzIHRoZSBuYXRpdmUgYDx0YWJsZT5gIGVsZW1lbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBfc3RpY2tDZWxsQ3NzIFRoZSBDU1MgY2xhc3MgdGhhdCB3aWxsIGJlIGFwcGxpZWQgdG8gZXZlcnkgcm93L2NlbGwgdGhhdCBoYXMKICAgICAgICAgKiAgICAgc3RpY2t5IHBvc2l0aW9uaW5nIGFwcGxpZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBkaXJlY3Rpb24gVGhlIGRpcmVjdGlvbmFsaXR5IGNvbnRleHQgb2YgdGhlIHRhYmxlIChsdHIvcnRsKTsgYWZmZWN0cyBjb2x1bW4gcG9zaXRpb25pbmcKICAgICAgICAgKiAgICAgYnkgcmV2ZXJzaW5nIGxlZnQvcmlnaHQgcG9zaXRpb25zLgogICAgICAgICAqIEBwYXJhbSB7Pz19IF9pc0Jyb3dzZXIgV2hldGhlciB0aGUgdGFibGUgaXMgY3VycmVudGx5IGJlaW5nIHJlbmRlcmVkIG9uIHRoZSBzZXJ2ZXIgb3IgdGhlIGNsaWVudC4KICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfaXNOYXRpdmVIdG1sVGFibGUsIF9zdGlja0NlbGxDc3MsIGRpcmVjdGlvbiwgX2lzQnJvd3NlciA9IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5faXNOYXRpdmVIdG1sVGFibGUgPSBfaXNOYXRpdmVIdG1sVGFibGU7CiAgICAgICAgICAgIHRoaXMuX3N0aWNrQ2VsbENzcyA9IF9zdGlja0NlbGxDc3M7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aW9uID0gZGlyZWN0aW9uOwogICAgICAgICAgICB0aGlzLl9pc0Jyb3dzZXIgPSBfaXNCcm93c2VyOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIHN0aWNreSBwb3NpdGlvbmluZyBzdHlsZXMgZnJvbSB0aGUgcm93IGFuZCBpdHMgY2VsbHMgYnkgcmVzZXR0aW5nIHRoZSBgcG9zaXRpb25gCiAgICAgICAgICogc3R5bGUsIHNldHRpbmcgdGhlIHpJbmRleCB0byAwLCBhbmQgdW5zZXR0aW5nIGVhY2ggcHJvdmlkZWQgc3RpY2t5IGRpcmVjdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IHJvd3MgVGhlIGxpc3Qgb2Ygcm93cyB0aGF0IHNob3VsZCBiZSBjbGVhcmVkIGZyb20gc3RpY2tpbmcgaW4gdGhlIHByb3ZpZGVkIGRpcmVjdGlvbnMKICAgICAgICAgKiBAcGFyYW0gez99IHN0aWNreURpcmVjdGlvbnMgVGhlIGRpcmVjdGlvbnMgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIHNldCBhcyBzdGlja3kgb24gdGhlIHJvd3MuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbGVhclN0aWNreVBvc2l0aW9uaW5nKHJvd3MsIHN0aWNreURpcmVjdGlvbnMpIHsKICAgICAgICAgICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykgewogICAgICAgICAgICAgICAgLy8gSWYgdGhlIHJvdyBpc24ndCBhbiBlbGVtZW50IChlLmcuIGlmIGl0J3MgYW4gYG5nLWNvbnRhaW5lcmApLAogICAgICAgICAgICAgICAgLy8gaXQgd29uJ3QgaGF2ZSBpbmxpbmUgc3R5bGVzIG9yIGBjaGlsZHJlbmAgc28gd2Ugc2tpcCBpdC4KICAgICAgICAgICAgICAgIGlmIChyb3cubm9kZVR5cGUgIT09IHJvdy5FTEVNRU5UX05PREUpIHsKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVN0aWNreVN0eWxlKHJvdywgc3RpY2t5RGlyZWN0aW9ucyk7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHJvdy5jaGlsZHJlbi5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBjZWxsID0gKC8qKiBAdHlwZSB7P30gKi8gKHJvdy5jaGlsZHJlbltpXSkpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX3JlbW92ZVN0aWNreVN0eWxlKGNlbGwsIHN0aWNreURpcmVjdGlvbnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFwcGxpZXMgc3RpY2t5IGxlZnQgYW5kIHJpZ2h0IHBvc2l0aW9ucyB0byB0aGUgY2VsbHMgb2YgZWFjaCByb3cgYWNjb3JkaW5nIHRvIHRoZSBzdGlja3kKICAgICAgICAgKiBzdGF0ZXMgb2YgdGhlIHJlbmRlcmVkIGNvbHVtbiBkZWZpbml0aW9ucy4KICAgICAgICAgKiBAcGFyYW0gez99IHJvd3MgVGhlIHJvd3MgdGhhdCBzaG91bGQgaGF2ZSBpdHMgc2V0IG9mIGNlbGxzIHN0dWNrIGFjY29yZGluZyB0byB0aGUgc3RpY2t5IHN0YXRlcy4KICAgICAgICAgKiBAcGFyYW0gez99IHN0aWNreVN0YXJ0U3RhdGVzIEEgbGlzdCBvZiBib29sZWFuIHN0YXRlcyB3aGVyZSBlYWNoIHN0YXRlIHJlcHJlc2VudHMgd2hldGhlciB0aGUgY2VsbAogICAgICAgICAqICAgICBpbiB0aGlzIGluZGV4IHBvc2l0aW9uIHNob3VsZCBiZSBzdHVjayB0byB0aGUgc3RhcnQgb2YgdGhlIHJvdy4KICAgICAgICAgKiBAcGFyYW0gez99IHN0aWNreUVuZFN0YXRlcyBBIGxpc3Qgb2YgYm9vbGVhbiBzdGF0ZXMgd2hlcmUgZWFjaCBzdGF0ZSByZXByZXNlbnRzIHdoZXRoZXIgdGhlIGNlbGwKICAgICAgICAgKiAgICAgaW4gdGhpcyBpbmRleCBwb3NpdGlvbiBzaG91bGQgYmUgc3R1Y2sgdG8gdGhlIGVuZCBvZiB0aGUgcm93LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU3RpY2t5Q29sdW1ucyhyb3dzLCBzdGlja3lTdGFydFN0YXRlcywgc3RpY2t5RW5kU3RhdGVzKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGFzU3RpY2t5Q29sdW1ucyA9IHN0aWNreVN0YXJ0U3RhdGVzLnNvbWUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGF0ZSA9PiBzdGF0ZSkpIHx8IHN0aWNreUVuZFN0YXRlcy5zb21lKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgc3RhdGUgPT4gc3RhdGUpKTsKICAgICAgICAgICAgaWYgKCFyb3dzLmxlbmd0aCB8fCAhaGFzU3RpY2t5Q29sdW1ucyB8fCAhdGhpcy5faXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaXJzdFJvdyA9IHJvd3NbMF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnVtQ2VsbHMgPSBmaXJzdFJvdy5jaGlsZHJlbi5sZW5ndGg7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY2VsbFdpZHRocyA9IHRoaXMuX2dldENlbGxXaWR0aHMoZmlyc3RSb3cpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0YXJ0UG9zaXRpb25zID0gdGhpcy5fZ2V0U3RpY2t5U3RhcnRDb2x1bW5Qb3NpdGlvbnMoY2VsbFdpZHRocywgc3RpY2t5U3RhcnRTdGF0ZXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVuZFBvc2l0aW9ucyA9IHRoaXMuX2dldFN0aWNreUVuZENvbHVtblBvc2l0aW9ucyhjZWxsV2lkdGhzLCBzdGlja3lFbmRTdGF0ZXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlzUnRsID0gdGhpcy5kaXJlY3Rpb24gPT09ICdydGwnOwogICAgICAgICAgICBmb3IgKGNvbnN0IHJvdyBvZiByb3dzKSB7CiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bUNlbGxzOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2VsbCA9ICgvKiogQHR5cGUgez99ICovIChyb3cuY2hpbGRyZW5baV0pKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RpY2t5U3RhcnRTdGF0ZXNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkU3RpY2t5U3R5bGUoY2VsbCwgaXNSdGwgPyAncmlnaHQnIDogJ2xlZnQnLCBzdGFydFBvc2l0aW9uc1tpXSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChzdGlja3lFbmRTdGF0ZXNbaV0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fYWRkU3RpY2t5U3R5bGUoY2VsbCwgaXNSdGwgPyAnbGVmdCcgOiAncmlnaHQnLCBlbmRQb3NpdGlvbnNbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcHBsaWVzIHN0aWNreSBwb3NpdGlvbmluZyB0byB0aGUgcm93J3MgY2VsbHMgaWYgdXNpbmcgdGhlIG5hdGl2ZSB0YWJsZSBsYXlvdXQsIGFuZCB0byB0aGUKICAgICAgICAgKiByb3cgaXRzZWxmIG90aGVyd2lzZS4KICAgICAgICAgKiBAcGFyYW0gez99IHJvd3NUb1N0aWNrIFRoZSBsaXN0IG9mIHJvd3MgdGhhdCBzaG91bGQgYmUgc3R1Y2sgYWNjb3JkaW5nIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKICAgICAgICAgKiAgICAgc3RpY2t5IHN0YXRlIGFuZCB0byB0aGUgcHJvdmlkZWQgdG9wIG9yIGJvdHRvbSBwb3NpdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IHN0aWNreVN0YXRlcyBBIGxpc3Qgb2YgYm9vbGVhbiBzdGF0ZXMgd2hlcmUgZWFjaCBzdGF0ZSByZXByZXNlbnRzIHdoZXRoZXIgdGhlIHJvdwogICAgICAgICAqICAgICBzaG91bGQgYmUgc3R1Y2sgaW4gdGhlIHBhcnRpY3VsYXIgdG9wIG9yIGJvdHRvbSBwb3NpdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IHBvc2l0aW9uIFRoZSBwb3NpdGlvbiBkaXJlY3Rpb24gaW4gd2hpY2ggdGhlIHJvdyBzaG91bGQgYmUgc3R1Y2sgaWYgdGhhdCByb3cgc2hvdWxkIGJlCiAgICAgICAgICogICAgIHN0aWNreS4KICAgICAgICAgKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc3RpY2tSb3dzKHJvd3NUb1N0aWNrLCBzdGlja3lTdGF0ZXMsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIC8vIFNpbmNlIHdlIGNhbid0IG1lYXN1cmUgdGhlIHJvd3Mgb24gdGhlIHNlcnZlciwgd2UgY2FuJ3Qgc3RpY2sgdGhlIHJvd3MgcHJvcGVybHkuCiAgICAgICAgICAgIGlmICghdGhpcy5faXNCcm93c2VyKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgcG9zaXRpb25pbmcgdGhlIHJvd3MgdG8gdGhlIGJvdHRvbSwgcmV2ZXJzZSB0aGVpciBvcmRlciB3aGVuIGV2YWx1YXRpbmcgdGhlIHN0aWNreQogICAgICAgICAgICAvLyBwb3NpdGlvbiBzdWNoIHRoYXQgdGhlIGxhc3Qgcm93IHN0dWNrIHdpbGwgYmUgImJvdHRvbTogMHB4IiBhbmQgc28gb24uCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgcm93cyA9IHBvc2l0aW9uID09PSAnYm90dG9tJyA/IHJvd3NUb1N0aWNrLnJldmVyc2UoKSA6IHJvd3NUb1N0aWNrOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBzdGlja3lIZWlnaHQgPSAwOwogICAgICAgICAgICBmb3IgKGxldCByb3dJbmRleCA9IDA7IHJvd0luZGV4IDwgcm93cy5sZW5ndGg7IHJvd0luZGV4KyspIHsKICAgICAgICAgICAgICAgIGlmICghc3RpY2t5U3RhdGVzW3Jvd0luZGV4XSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgcm93ID0gcm93c1tyb3dJbmRleF07CiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNOYXRpdmVIdG1sVGFibGUpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHJvdy5jaGlsZHJlbi5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNlbGwgPSAoLyoqIEB0eXBlIHs/fSAqLyAocm93LmNoaWxkcmVuW2pdKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2FkZFN0aWNreVN0eWxlKGNlbGwsIHBvc2l0aW9uLCBzdGlja3lIZWlnaHQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIEZsZXggZG9lcyBub3QgcmVzcGVjdCB0aGUgc3RpY2sgcG9zaXRpb25pbmcgb24gdGhlIGNlbGxzLCBuZWVkcyB0byBiZSBhcHBsaWVkIHRvIHRoZSByb3cuCiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBhcHBsaWVkIG9uIGEgbmF0aXZlIHRhYmxlLCBTYWZhcmkgY2F1c2VzIHRoZSBoZWFkZXIgdG8gZmx5IGluIHdyb25nIGRpcmVjdGlvbi4KICAgICAgICAgICAgICAgICAgICB0aGlzLl9hZGRTdGlja3lTdHlsZShyb3csIHBvc2l0aW9uLCBzdGlja3lIZWlnaHQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJvd0luZGV4ID09PSByb3dzLmxlbmd0aCAtIDEpIHsKICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHVubmVjZXNzYXJ5IHJlZmxvdyBmcm9tIGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc3RpY2t5SGVpZ2h0ICs9IHJvdy5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5oZWlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hlbiB1c2luZyB0aGUgbmF0aXZlIHRhYmxlIGluIFNhZmFyaSwgc3RpY2t5IGZvb3RlciBjZWxscyBkbyBub3Qgc3RpY2suIFRoZSBvbmx5IHdheSB0byBzdGljawogICAgICAgICAqIGZvb3RlciByb3dzIGlzIHRvIGFwcGx5IHN0aWNreSBzdHlsaW5nIHRvIHRoZSB0Zm9vdCBjb250YWluZXIuIFRoaXMgc2hvdWxkIG9ubHkgYmUgZG9uZSBpZgogICAgICAgICAqIGFsbCBmb290ZXIgcm93cyBhcmUgc3RpY2t5LiBJZiBub3QgYWxsIGZvb3RlciByb3dzIGFyZSBzdGlja3ksIHJlbW92ZSBzdGlja3kgcG9zaXRpb25pbmcgZnJvbQogICAgICAgICAqIHRoZSB0Zm9vdCBlbGVtZW50LgogICAgICAgICAqIEBwYXJhbSB7P30gdGFibGVFbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzdGlja3lTdGF0ZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVN0aWNreUZvb3RlckNvbnRhaW5lcih0YWJsZUVsZW1lbnQsIHN0aWNreVN0YXRlcykgewogICAgICAgICAgICBpZiAoIXRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0Zm9vdCA9ICgvKiogQHR5cGUgez99ICovICh0YWJsZUVsZW1lbnQucXVlcnlTZWxlY3RvcigndGZvb3QnKSkpOwogICAgICAgICAgICBpZiAoc3RpY2t5U3RhdGVzLnNvbWUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBzdGF0ZSA9PiAhc3RhdGUpKSkgewogICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU3RpY2t5U3R5bGUodGZvb3QsIFsnYm90dG9tJ10pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fYWRkU3RpY2t5U3R5bGUodGZvb3QsICdib3R0b20nLCAwKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIHRoZSBzdGlja3kgc3R5bGUgb24gdGhlIGVsZW1lbnQgYnkgcmVtb3ZpbmcgdGhlIHN0aWNreSBjZWxsIENTUyBjbGFzcywgcmUtZXZhbHVhdGluZwogICAgICAgICAqIHRoZSB6SW5kZXgsIHJlbW92aW5nIGVhY2ggb2YgdGhlIHByb3ZpZGVkIHN0aWNreSBkaXJlY3Rpb25zLCBhbmQgcmVtb3ZpbmcgdGhlCiAgICAgICAgICogc3RpY2t5IHBvc2l0aW9uIGlmIHRoZXJlIGFyZSBubyBtb3JlIGRpcmVjdGlvbnMuCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBzdGlja3lEaXJlY3Rpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVtb3ZlU3RpY2t5U3R5bGUoZWxlbWVudCwgc3RpY2t5RGlyZWN0aW9ucykgewogICAgICAgICAgICBmb3IgKGNvbnN0IGRpciBvZiBzdGlja3lEaXJlY3Rpb25zKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlW2Rpcl0gPSAnJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbGVtZW50LnN0eWxlLnpJbmRleCA9IHRoaXMuX2dldENhbGN1bGF0ZWRaSW5kZXgoZWxlbWVudCk7CiAgICAgICAgICAgIC8vIElmIHRoZSBlbGVtZW50IG5vIGxvbmdlciBoYXMgYW55IG1vcmUgc3RpY2t5IGRpcmVjdGlvbnMsIHJlbW92ZSBzdGlja3kgcG9zaXRpb25pbmcgYW5kCiAgICAgICAgICAgIC8vIHRoZSBzdGlja3kgQ1NTIGNsYXNzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhhc0RpcmVjdGlvbiA9IFNUSUNLWV9ESVJFQ1RJT05TLnNvbWUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRpcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGlyID0+ICEhZWxlbWVudC5zdHlsZVtkaXJdKSk7CiAgICAgICAgICAgIGlmICghaGFzRGlyZWN0aW9uKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LnN0eWxlLnBvc2l0aW9uID0gJyc7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5fc3RpY2tDZWxsQ3NzKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBzdGlja3kgc3R5bGluZyB0byB0aGUgZWxlbWVudCBieSBhZGRpbmcgdGhlIHN0aWNreSBzdHlsZSBjbGFzcywgY2hhbmdpbmcgcG9zaXRpb24KICAgICAgICAgKiB0byBiZSBzdGlja3kgKGFuZCAtd2Via2l0LXN0aWNreSksIHNldHRpbmcgdGhlIGFwcHJvcHJpYXRlIHpJbmRleCwgYW5kIGFkZGluZyBhIHN0aWNreQogICAgICAgICAqIGRpcmVjdGlvbiBhbmQgdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgKiBAcGFyYW0gez99IGRpclZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkU3RpY2t5U3R5bGUoZWxlbWVudCwgZGlyLCBkaXJWYWx1ZSkgewogICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQodGhpcy5fc3RpY2tDZWxsQ3NzKTsKICAgICAgICAgICAgZWxlbWVudC5zdHlsZVtkaXJdID0gYCR7ZGlyVmFsdWV9cHhgOwogICAgICAgICAgICBlbGVtZW50LnN0eWxlLmNzc1RleHQgKz0gJ3Bvc2l0aW9uOiAtd2Via2l0LXN0aWNreTsgcG9zaXRpb246IHN0aWNreTsgJzsKICAgICAgICAgICAgZWxlbWVudC5zdHlsZS56SW5kZXggPSB0aGlzLl9nZXRDYWxjdWxhdGVkWkluZGV4KGVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxjdWxhdGUgd2hhdCB0aGUgei1pbmRleCBzaG91bGQgYmUgZm9yIHRoZSBlbGVtZW50LCBkZXBlbmRpbmcgb24gd2hhdCBkaXJlY3Rpb25zICh0b3AsCiAgICAgICAgICogYm90dG9tLCBsZWZ0LCByaWdodCkgaGF2ZSBiZWVuIHNldC4gSXQgc2hvdWxkIGJlIHRydWUgdGhhdCBlbGVtZW50cyB3aXRoIGEgdG9wIGRpcmVjdGlvbgogICAgICAgICAqIHNob3VsZCBoYXZlIHRoZSBoaWdoZXN0IGluZGV4IHNpbmNlIHRoZXNlIGFyZSBlbGVtZW50cyBsaWtlIGEgdGFibGUgaGVhZGVyLiBJZiBhbnkgb2YgdGhvc2UKICAgICAgICAgKiBlbGVtZW50cyBhcmUgYWxzbyBzdGlja3kgaW4gYW5vdGhlciBkaXJlY3Rpb24sIHRoZW4gdGhleSBzaG91bGQgYXBwZWFyIGFib3ZlIG90aGVyIGVsZW1lbnRzCiAgICAgICAgICogdGhhdCBhcmUgb25seSBzdGlja3kgdG9wIChlLmcuIGEgc3RpY2t5IGNvbHVtbiBvbiBhIHN0aWNreSBoZWFkZXIpLiBCb3R0b20tc3RpY2t5IGVsZW1lbnRzCiAgICAgICAgICogKGUuZy4gZm9vdGVyIHJvd3MpIHNob3VsZCB0aGVuIGJlIG5leHQgaW4gdGhlIG9yZGVyaW5nIHN1Y2ggdGhhdCB0aGV5IGFyZSBiZWxvdyB0aGUgaGVhZGVyCiAgICAgICAgICogYnV0IGFib3ZlIGFueSBub24tc3RpY2t5IGVsZW1lbnRzLiBGaW5hbGx5LCBsZWZ0L3JpZ2h0IHN0aWNreSBlbGVtZW50cyAoZS5nLiBzdGlja3kgY29sdW1ucykKICAgICAgICAgKiBzaG91bGQgbWluaW1hbGx5IGluY3JlbWVudCBzbyB0aGF0IHRoZXkgYXJlIGFib3ZlIG5vbi1zdGlja3kgZWxlbWVudHMgYnV0IGJlbG93IHRvcCBhbmQgYm90dG9tCiAgICAgICAgICogZWxlbWVudHMuCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0Q2FsY3VsYXRlZFpJbmRleChlbGVtZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgekluZGV4SW5jcmVtZW50cyA9IHsKICAgICAgICAgICAgICAgIHRvcDogMTAwLAogICAgICAgICAgICAgICAgYm90dG9tOiAxMCwKICAgICAgICAgICAgICAgIGxlZnQ6IDEsCiAgICAgICAgICAgICAgICByaWdodDogMSwKICAgICAgICAgICAgfTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgekluZGV4ID0gMDsKICAgICAgICAgICAgLy8gVXNlIGBJdGVyYWJsZWAgaW5zdGVhZCBvZiBgQXJyYXlgIGJlY2F1c2UgVHlwZVNjcmlwdCwgYXMgb2YgMy42LjMsCiAgICAgICAgICAgIC8vIGxvc2VzIHRoZSBhcnJheSBnZW5lcmljIHR5cGUgaW4gdGhlIGBmb3Igb2ZgLiBCdXQgd2UgKmFsc28qIGhhdmUgdG8gdXNlIGBBcnJheWAgYmVjYXVzZQogICAgICAgICAgICAvLyB0eXBlc2NyaXB0IHdvbid0IGl0ZXJhdGUgb3ZlciBhbiBgSXRlcmFibGVgIHVubGVzcyB5b3UgY29tcGlsZSB3aXRoIGAtLWRvd25sZXZlbEl0ZXJhdGlvbmAKICAgICAgICAgICAgZm9yIChjb25zdCBkaXIgb2YgKC8qKiBAdHlwZSB7P30gKi8gKFNUSUNLWV9ESVJFQ1RJT05TKSkpIHsKICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LnN0eWxlW2Rpcl0pIHsKICAgICAgICAgICAgICAgICAgICB6SW5kZXggKz0gekluZGV4SW5jcmVtZW50c1tkaXJdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB6SW5kZXggPyBgJHt6SW5kZXh9YCA6ICcnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIHRoZSB3aWR0aHMgZm9yIGVhY2ggY2VsbCBpbiB0aGUgcHJvdmlkZWQgcm93LgogICAgICAgICAqIEBwYXJhbSB7P30gcm93CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0Q2VsbFdpZHRocyhyb3cpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjZWxsV2lkdGhzID0gW107CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3RSb3dDZWxscyA9IHJvdy5jaGlsZHJlbjsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBmaXJzdFJvd0NlbGxzLmxlbmd0aDsgaSsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgY2VsbCA9ICgvKiogQHR5cGUgez99ICovIChmaXJzdFJvd0NlbGxzW2ldKSk7CiAgICAgICAgICAgICAgICBjZWxsV2lkdGhzLnB1c2goY2VsbC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGNlbGxXaWR0aHM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIGxlZnQgYW5kIHJpZ2h0IHBvc2l0aW9ucyBvZiBlYWNoIHN0aWNreSBjb2x1bW4gY2VsbCwgd2hpY2ggd2lsbCBiZSB0aGUKICAgICAgICAgKiBhY2N1bXVsYXRpb24gb2YgYWxsIHN0aWNreSBjb2x1bW4gY2VsbCB3aWR0aHMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LCByZXNwZWN0aXZlbHkuCiAgICAgICAgICogTm9uLXN0aWNreSBjZWxscyBkbyBub3QgbmVlZCB0byBoYXZlIGEgdmFsdWUgc2V0IHNpbmNlIHRoZWlyIHBvc2l0aW9ucyB3aWxsIG5vdCBiZSBhcHBsaWVkLgogICAgICAgICAqIEBwYXJhbSB7P30gd2lkdGhzCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGlja3lTdGF0ZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRTdGlja3lTdGFydENvbHVtblBvc2l0aW9ucyh3aWR0aHMsIHN0aWNreVN0YXRlcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9ucyA9IFtdOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBuZXh0UG9zaXRpb24gPSAwOwogICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdpZHRocy5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgaWYgKHN0aWNreVN0YXRlc1tpXSkgewogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uc1tpXSA9IG5leHRQb3NpdGlvbjsKICAgICAgICAgICAgICAgICAgICBuZXh0UG9zaXRpb24gKz0gd2lkdGhzW2ldOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbnM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgdGhlIGxlZnQgYW5kIHJpZ2h0IHBvc2l0aW9ucyBvZiBlYWNoIHN0aWNreSBjb2x1bW4gY2VsbCwgd2hpY2ggd2lsbCBiZSB0aGUKICAgICAgICAgKiBhY2N1bXVsYXRpb24gb2YgYWxsIHN0aWNreSBjb2x1bW4gY2VsbCB3aWR0aHMgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LCByZXNwZWN0aXZlbHkuCiAgICAgICAgICogTm9uLXN0aWNreSBjZWxscyBkbyBub3QgbmVlZCB0byBoYXZlIGEgdmFsdWUgc2V0IHNpbmNlIHRoZWlyIHBvc2l0aW9ucyB3aWxsIG5vdCBiZSBhcHBsaWVkLgogICAgICAgICAqIEBwYXJhbSB7P30gd2lkdGhzCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGlja3lTdGF0ZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRTdGlja3lFbmRDb2x1bW5Qb3NpdGlvbnMod2lkdGhzLCBzdGlja3lTdGF0ZXMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwb3NpdGlvbnMgPSBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgbmV4dFBvc2l0aW9uID0gMDsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IHdpZHRocy5sZW5ndGg7IGkgPiAwOyBpLS0pIHsKICAgICAgICAgICAgICAgIGlmIChzdGlja3lTdGF0ZXNbaV0pIHsKICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbnNbaV0gPSBuZXh0UG9zaXRpb247CiAgICAgICAgICAgICAgICAgICAgbmV4dFBvc2l0aW9uICs9IHdpZHRoc1tpXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gcG9zaXRpb25zOwogICAgICAgIH0KICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9jZGsvdGFibGUvdGFibGUtZXJyb3JzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQGxpY2Vuc2UKICAgICAqIENvcHlyaWdodCBHb29nbGUgTExDIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCiAgICAgKgogICAgICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICAgICAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9hbmd1bGFyLmlvL2xpY2Vuc2UKICAgICAqLwogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIHRvIGJlIHRocm93biB3aGVuIGF0dGVtcHRpbmcgdG8gZmluZCBhbiB1bmV4aXN0aW5nIGNvbHVtbi4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IGlkIElkIHdob3NlIGxvb2t1cCBmYWlsZWQuCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBnZXRUYWJsZVVua25vd25Db2x1bW5FcnJvcihpZCkgewogICAgICAgIHJldHVybiBFcnJvcihgQ291bGQgbm90IGZpbmQgY29sdW1uIHdpdGggaWQgIiR7aWR9Ii5gKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiB0d28gY29sdW1uIGRlZmluaXRpb25zIGhhdmUgdGhlIHNhbWUgbmFtZS4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG5hbWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRhYmxlRHVwbGljYXRlQ29sdW1uTmFtZUVycm9yKG5hbWUpIHsKICAgICAgICByZXR1cm4gRXJyb3IoYER1cGxpY2F0ZSBjb2x1bW4gZGVmaW5pdGlvbiBuYW1lIHByb3ZpZGVkOiAiJHtuYW1lfSIuYCk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gZXJyb3IgdG8gYmUgdGhyb3duIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIHJvd3MgdGhhdCBhcmUgbWlzc2luZyBhIHdoZW4gZnVuY3Rpb24uCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VGFibGVNdWx0aXBsZURlZmF1bHRSb3dEZWZzRXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBUaGVyZSBjYW4gb25seSBiZSBvbmUgZGVmYXVsdCByb3cgd2l0aG91dCBhIHdoZW4gcHJlZGljYXRlIGZ1bmN0aW9uLmApOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIHRvIGJlIHRocm93biB3aGVuIHRoZXJlIGFyZSBubyBtYXRjaGluZyByb3cgZGVmcyBmb3IgYSBwYXJ0aWN1bGFyIHNldCBvZiBkYXRhLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VGFibGVNaXNzaW5nTWF0Y2hpbmdSb3dEZWZFcnJvcihkYXRhKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKGBDb3VsZCBub3QgZmluZCBhIG1hdGNoaW5nIHJvdyBkZWZpbml0aW9uIGZvciB0aGVgICsKICAgICAgICAgICAgYHByb3ZpZGVkIHJvdyBkYXRhOiAke0pTT04uc3RyaW5naWZ5KGRhdGEpfWApOwogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGFuIGVycm9yIHRvIGJlIHRocm93biB3aGVuIHRoZXJlIGlzIG5vIHJvdyBkZWZpbml0aW9ucyBwcmVzZW50IGluIHRoZSBjb250ZW50LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRhYmxlTWlzc2luZ1Jvd0RlZnNFcnJvcigpIHsKICAgICAgICByZXR1cm4gRXJyb3IoJ01pc3NpbmcgZGVmaW5pdGlvbnMgZm9yIGhlYWRlciwgZm9vdGVyLCBhbmQgcm93OyAnICsKICAgICAgICAgICAgJ2Nhbm5vdCBkZXRlcm1pbmUgd2hpY2ggY29sdW1ucyBzaG91bGQgYmUgcmVuZGVyZWQuJyk7CiAgICB9CiAgICAvKioKICAgICAqIFJldHVybnMgYW4gZXJyb3IgdG8gYmUgdGhyb3duIHdoZW4gdGhlIGRhdGEgc291cmNlIGRvZXMgbm90IG1hdGNoIHRoZSBjb21wYXRpYmxlIHR5cGVzLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRhYmxlVW5rbm93bkRhdGFTb3VyY2VFcnJvcigpIHsKICAgICAgICByZXR1cm4gRXJyb3IoYFByb3ZpZGVkIGRhdGEgc291cmNlIGRpZCBub3QgbWF0Y2ggYW4gYXJyYXksIE9ic2VydmFibGUsIG9yIERhdGFTb3VyY2VgKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiB0aGUgdGV4dCBjb2x1bW4gY2Fubm90IGZpbmQgYSBwYXJlbnQgdGFibGUgdG8gaW5qZWN0LgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldFRhYmxlVGV4dENvbHVtbk1pc3NpbmdQYXJlbnRUYWJsZUVycm9yKCkgewogICAgICAgIHJldHVybiBFcnJvcihgVGV4dCBjb2x1bW4gY291bGQgbm90IGZpbmQgYSBwYXJlbnQgdGFibGUgZm9yIHJlZ2lzdHJhdGlvbi5gKTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiBhIHRhYmxlIHRleHQgY29sdW1uIGRvZXNuJ3QgaGF2ZSBhIG5hbWUuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0VGFibGVUZXh0Q29sdW1uTWlzc2luZ05hbWVFcnJvcigpIHsKICAgICAgICByZXR1cm4gRXJyb3IoYFRhYmxlIHRleHQgY29sdW1uIG11c3QgaGF2ZSBhIG5hbWUuYCk7CiAgICB9CiAgICAvKioKICAgICAqIFByb3ZpZGVzIGEgaGFuZGxlIGZvciB0aGUgdGFibGUgdG8gZ3JhYiB0aGUgdmlldyBjb250YWluZXIncyBuZy1jb250YWluZXIgdG8gaW5zZXJ0IGRhdGEgcm93cy4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIERhdGFSb3dPdXRsZXQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmlld0NvbnRhaW5lcgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHZpZXdDb250YWluZXIsIGVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgdGhpcy52aWV3Q29udGFpbmVyID0gdmlld0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICB9CiAgICB9CiAgICBEYXRhUm93T3V0bGV0Lsm1ZmFjID0gZnVuY3Rpb24gRGF0YVJvd091dGxldF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEYXRhUm93T3V0bGV0KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFZpZXdDb250YWluZXJSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIERhdGFSb3dPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRGF0YVJvd091dGxldCwgc2VsZWN0b3JzOiBbWyIiLCAicm93T3V0bGV0IiwgIiJdXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgRGF0YVJvd091dGxldC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogUHJvdmlkZXMgYSBoYW5kbGUgZm9yIHRoZSB0YWJsZSB0byBncmFiIHRoZSB2aWV3IGNvbnRhaW5lcidzIG5nLWNvbnRhaW5lciB0byBpbnNlcnQgdGhlIGhlYWRlci4KICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIEhlYWRlclJvd091dGxldCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2aWV3Q29udGFpbmVyCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Iodmlld0NvbnRhaW5lciwgZWxlbWVudFJlZikgewogICAgICAgICAgICB0aGlzLnZpZXdDb250YWluZXIgPSB2aWV3Q29udGFpbmVyOwogICAgICAgICAgICB0aGlzLmVsZW1lbnRSZWYgPSBlbGVtZW50UmVmOwogICAgICAgIH0KICAgIH0KICAgIEhlYWRlclJvd091dGxldC7JtWZhYyA9IGZ1bmN0aW9uIEhlYWRlclJvd091dGxldF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIZWFkZXJSb3dPdXRsZXQpKMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwogICAgSGVhZGVyUm93T3V0bGV0Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IEhlYWRlclJvd091dGxldCwgc2VsZWN0b3JzOiBbWyIiLCAiaGVhZGVyUm93T3V0bGV0IiwgIiJdXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgSGVhZGVyUm93T3V0bGV0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVmlld0NvbnRhaW5lclJlZiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgLyoqCiAgICAgKiBQcm92aWRlcyBhIGhhbmRsZSBmb3IgdGhlIHRhYmxlIHRvIGdyYWIgdGhlIHZpZXcgY29udGFpbmVyJ3MgbmctY29udGFpbmVyIHRvIGluc2VydCB0aGUgZm9vdGVyLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgRm9vdGVyUm93T3V0bGV0IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZpZXdDb250YWluZXIKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih2aWV3Q29udGFpbmVyLCBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMudmlld0NvbnRhaW5lciA9IHZpZXdDb250YWluZXI7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7CiAgICAgICAgfQogICAgfQogICAgRm9vdGVyUm93T3V0bGV0Lsm1ZmFjID0gZnVuY3Rpb24gRm9vdGVyUm93T3V0bGV0X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEZvb3RlclJvd091dGxldCkoybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICBGb290ZXJSb3dPdXRsZXQuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogRm9vdGVyUm93T3V0bGV0LCBzZWxlY3RvcnM6IFtbIiIsICJmb290ZXJSb3dPdXRsZXQiLCAiIl1dIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBGb290ZXJSb3dPdXRsZXQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBWaWV3Q29udGFpbmVyUmVmIH0sCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0KICAgIF07CiAgICAvKioKICAgICAqIEEgZGF0YSB0YWJsZSB0aGF0IGNhbiByZW5kZXIgYSBoZWFkZXIgcm93LCBkYXRhIHJvd3MsIGFuZCBhIGZvb3RlciByb3cuCiAgICAgKiBVc2VzIHRoZSBkYXRhU291cmNlIGlucHV0IHRvIGRldGVybWluZSB0aGUgZGF0YSB0byBiZSByZW5kZXJlZC4gVGhlIGRhdGEgY2FuIGJlIHByb3ZpZGVkIGVpdGhlcgogICAgICogYXMgYSBkYXRhIGFycmF5LCBhbiBPYnNlcnZhYmxlIHN0cmVhbSB0aGF0IGVtaXRzIHRoZSBkYXRhIGFycmF5IHRvIHJlbmRlciwgb3IgYSBEYXRhU291cmNlIHdpdGggYQogICAgICogY29ubmVjdCBmdW5jdGlvbiB0aGF0IHdpbGwgcmV0dXJuIGFuIE9ic2VydmFibGUgc3RyZWFtIHRoYXQgZW1pdHMgdGhlIGRhdGEgYXJyYXkgdG8gcmVuZGVyLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgQ2RrVGFibGUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2RpZmZlcnMKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvclJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHJvbGUKICAgICAgICAgKiBAcGFyYW0gez99IF9kaXIKICAgICAgICAgKiBAcGFyYW0gez99IF9kb2N1bWVudAogICAgICAgICAqIEBwYXJhbSB7P30gX3BsYXRmb3JtCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2RpZmZlcnMsIF9jaGFuZ2VEZXRlY3RvclJlZiwgX2VsZW1lbnRSZWYsIHJvbGUsIF9kaXIsIF9kb2N1bWVudCwgX3BsYXRmb3JtKSB7CiAgICAgICAgICAgIHRoaXMuX2RpZmZlcnMgPSBfZGlmZmVyczsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAgICAgdGhpcy5fcGxhdGZvcm0gPSBfcGxhdGZvcm07CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJqZWN0IHRoYXQgZW1pdHMgd2hlbiB0aGUgY29tcG9uZW50IGhhcyBiZWVuIGRlc3Ryb3llZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBNYXAgb2YgYWxsIHRoZSB1c2VyJ3MgZGVmaW5lZCBjb2x1bW5zIChoZWFkZXIsIGRhdGEsIGFuZCBmb290ZXIgY2VsbCB0ZW1wbGF0ZSkgaWRlbnRpZmllZCBieQogICAgICAgICAgICAgKiBuYW1lLiBDb2xsZWN0aW9uIHBvcHVsYXRlZCBieSB0aGUgY29sdW1uIGRlZmluaXRpb25zIGdhdGhlcmVkIGJ5IGBDb250ZW50Q2hpbGRyZW5gIGFzIHdlbGwgYXMKICAgICAgICAgICAgICogYW55IGN1c3RvbSBjb2x1bW4gZGVmaW5pdGlvbnMgYWRkZWQgdG8gYF9jdXN0b21Db2x1bW5EZWZzYC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDb2x1bW4gZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgZGlyZWN0IGNvbnRlbnQgY2hpbGRyZW4gb2YgdGhlIHRhYmxlLgogICAgICAgICAgICAgKiBUaGVzZSB3aWxsIGJlIGRlZmluZWQgd2hlbiwgZS5nLiwgY3JlYXRpbmcgYSB3cmFwcGVyIGFyb3VuZCB0aGUgY2RrVGFibGUgdGhhdCBoYXMKICAgICAgICAgICAgICogY29sdW1uIGRlZmluaXRpb25zIGFzICppdHMqIGNvbnRlbnQgY2hpbGQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jdXN0b21Db2x1bW5EZWZzID0gbmV3IFNldCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRGF0YSByb3cgZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgZGlyZWN0IGNvbnRlbnQgY2hpbGRyZW4gb2YgdGhlIHRhYmxlLgogICAgICAgICAgICAgKiBUaGVzZSB3aWxsIGJlIGRlZmluZWQgd2hlbiwgZS5nLiwgY3JlYXRpbmcgYSB3cmFwcGVyIGFyb3VuZCB0aGUgY2RrVGFibGUgdGhhdCBoYXMKICAgICAgICAgICAgICogYnVpbHQtaW4gZGF0YSByb3dzIGFzICppdHMqIGNvbnRlbnQgY2hpbGQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3dEZWZzID0gbmV3IFNldCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSGVhZGVyIHJvdyBkZWZpbml0aW9ucyB0aGF0IHdlcmUgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBkaXJlY3QgY29udGVudCBjaGlsZHJlbiBvZiB0aGUgdGFibGUuCiAgICAgICAgICAgICAqIFRoZXNlIHdpbGwgYmUgZGVmaW5lZCB3aGVuLCBlLmcuLCBjcmVhdGluZyBhIHdyYXBwZXIgYXJvdW5kIHRoZSBjZGtUYWJsZSB0aGF0IGhhcwogICAgICAgICAgICAgKiBidWlsdC1pbiBoZWFkZXIgcm93cyBhcyAqaXRzKiBjb250ZW50IGNoaWxkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY3VzdG9tSGVhZGVyUm93RGVmcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEZvb3RlciByb3cgZGVmaW5pdGlvbnMgdGhhdCB3ZXJlIGRlZmluZWQgb3V0c2lkZSBvZiB0aGUgZGlyZWN0IGNvbnRlbnQgY2hpbGRyZW4gb2YgdGhlIHRhYmxlLgogICAgICAgICAgICAgKiBUaGVzZSB3aWxsIGJlIGRlZmluZWQgd2hlbiwgZS5nLiwgY3JlYXRpbmcgYSB3cmFwcGVyIGFyb3VuZCB0aGUgY2RrVGFibGUgdGhhdCBoYXMgYQogICAgICAgICAgICAgKiBidWlsdC1pbiBmb290ZXIgcm93IGFzICppdHMqIGNvbnRlbnQgY2hpbGQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzID0gbmV3IFNldCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgaGVhZGVyIHJvdyBkZWZpbml0aW9uIGhhcyBiZWVuIGNoYW5nZWQuIFRyaWdnZXJzIGFuIHVwZGF0ZSB0byB0aGUgaGVhZGVyIHJvdyBhZnRlcgogICAgICAgICAgICAgKiBjb250ZW50IGlzIGNoZWNrZWQuIEluaXRpYWxpemVkIGFzIHRydWUgc28gdGhhdCB0aGUgdGFibGUgcmVuZGVycyB0aGUgaW5pdGlhbCBzZXQgb2Ygcm93cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2hlYWRlclJvd0RlZkNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgZm9vdGVyIHJvdyBkZWZpbml0aW9uIGhhcyBiZWVuIGNoYW5nZWQuIFRyaWdnZXJzIGFuIHVwZGF0ZSB0byB0aGUgZm9vdGVyIHJvdyBhZnRlcgogICAgICAgICAgICAgKiBjb250ZW50IGlzIGNoZWNrZWQuIEluaXRpYWxpemVkIGFzIHRydWUgc28gdGhhdCB0aGUgdGFibGUgcmVuZGVycyB0aGUgaW5pdGlhbCBzZXQgb2Ygcm93cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2FjaGUgb2YgdGhlIGxhdGVzdCByZW5kZXJlZCBgUmVuZGVyUm93YCBvYmplY3RzIGFzIGEgbWFwIGZvciBlYXN5IHJldHJpZXZhbCB3aGVuIGNvbnN0cnVjdGluZwogICAgICAgICAgICAgKiBhIG5ldyBsaXN0IG9mIGBSZW5kZXJSb3dgIG9iamVjdHMgZm9yIHJlbmRlcmluZyByb3dzLiBTaW5jZSB0aGUgbmV3IGxpc3QgaXMgY29uc3RydWN0ZWQgd2l0aAogICAgICAgICAgICAgKiB0aGUgY2FjaGVkIGBSZW5kZXJSb3dgIG9iamVjdHMgd2hlbiBwb3NzaWJsZSwgdGhlIHJvdyBpZGVudGl0eSBpcyBwcmVzZXJ2ZWQgd2hlbiB0aGUgZGF0YQogICAgICAgICAgICAgKiBhbmQgcm93IHRlbXBsYXRlIG1hdGNoZXMsIHdoaWNoIGFsbG93cyB0aGUgYEl0ZXJhYmxlRGlmZmVyYCB0byBjaGVjayByb3dzIGJ5IHJlZmVyZW5jZQogICAgICAgICAgICAgKiBhbmQgdW5kZXJzdGFuZCB3aGljaCByb3dzIGFyZSBhZGRlZC9tb3ZlZC9yZW1vdmVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBhIG1hcCBvZiBtYXBzIHdoZXJlIHRoZSBmaXJzdCBrZXkgaXMgdGhlIGBkYXRhOiBUYCBvYmplY3QgYW5kIHRoZSBzZWNvbmQgaXMgdGhlCiAgICAgICAgICAgICAqIGBDZGtSb3dEZWY8VD5gIG9iamVjdC4gV2l0aCB0aGUgdHdvIGtleXMsIHRoZSBjYWNoZSBwb2ludHMgdG8gYSBgUmVuZGVyUm93PFQ+YCBvYmplY3QgdGhhdAogICAgICAgICAgICAgKiBjb250YWlucyBhbiBhcnJheSBvZiBjcmVhdGVkIHBhaXJzLiBUaGUgYXJyYXkgaXMgbmVjZXNzYXJ5IHRvIGhhbmRsZSBjYXNlcyB3aGVyZSB0aGUgZGF0YQogICAgICAgICAgICAgKiBhcnJheSBjb250YWlucyBtdWx0aXBsZSBkdXBsaWNhdGUgZGF0YSBvYmplY3RzIGFuZCBlYWNoIGluc3RhbnRpYXRlZCBgUmVuZGVyUm93YCBtdXN0IGJlCiAgICAgICAgICAgICAqIHN0b3JlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBDU1MgY2xhc3MgYWRkZWQgdG8gYW55IHJvdyBvciBjZWxsIHRoYXQgaGFzIHN0aWNreSBwb3NpdGlvbmluZyBhcHBsaWVkLiBNYXkgYmUgb3ZlcnJpZGVuIGJ5CiAgICAgICAgICAgICAqIHRhYmxlIHN1YmNsYXNzZXMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnN0aWNreUNzc0NsYXNzID0gJ2Nkay10YWJsZS1zdGlja3knOwogICAgICAgICAgICB0aGlzLl9tdWx0aVRlbXBsYXRlRGF0YVJvd3MgPSBmYWxzZTsKICAgICAgICAgICAgLy8gVE9ETyhhbmRyZXdzZWd1aW4pOiBSZW1vdmUgbWF4IHZhbHVlIGFzIHRoZSBlbmQgaW5kZXgKICAgICAgICAgICAgLy8gICBhbmQgaW5zdGVhZCBjYWxjdWxhdGUgdGhlIHZpZXcgb24gaW5pdCBhbmQgc2Nyb2xsLgogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyZWFtIGNvbnRhaW5pbmcgdGhlIGxhdGVzdCBpbmZvcm1hdGlvbiBvbiB3aGF0IHJvd3MgYXJlIGJlaW5nIGRpc3BsYXllZCBvbiBzY3JlZW4uCiAgICAgICAgICAgICAqIENhbiBiZSB1c2VkIGJ5IHRoZSBkYXRhIHNvdXJjZSB0byBhcyBhIGhldXJpc3RpYyBvZiB3aGF0IGRhdGEgc2hvdWxkIGJlIHByb3ZpZGVkLgogICAgICAgICAgICAgKgogICAgICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy52aWV3Q2hhbmdlID0gbmV3IEJlaGF2aW9yU3ViamVjdCh7IHN0YXJ0OiAwLCBlbmQ6IE51bWJlci5NQVhfVkFMVUUgfSk7CiAgICAgICAgICAgIGlmICghcm9sZSkgewogICAgICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgncm9sZScsICdncmlkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZG9jdW1lbnQgPSBfZG9jdW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlID0gdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm5vZGVOYW1lID09PSAnVEFCTEUnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUcmFja2luZyBmdW5jdGlvbiB0aGF0IHdpbGwgYmUgdXNlZCB0byBjaGVjayB0aGUgZGlmZmVyZW5jZXMgaW4gZGF0YSBjaGFuZ2VzLiBVc2VkIHNpbWlsYXJseQogICAgICAgICAqIHRvIGBuZ0ZvcmAgYHRyYWNrQnlgIGZ1bmN0aW9uLiBPcHRpbWl6ZSByb3cgb3BlcmF0aW9ucyBieSBpZGVudGlmeWluZyBhIHJvdyBiYXNlZCBvbiBpdHMgZGF0YQogICAgICAgICAqIHJlbGF0aXZlIHRvIHRoZSBmdW5jdGlvbiB0byBrbm93IGlmIGEgcm93IHNob3VsZCBiZSBhZGRlZC9yZW1vdmVkL21vdmVkLgogICAgICAgICAqIEFjY2VwdHMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIHR3byBwYXJhbWV0ZXJzLCBgaW5kZXhgIGFuZCBgaXRlbWAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgdHJhY2tCeSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3RyYWNrQnlGbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHRyYWNrQnkoZm4pIHsKICAgICAgICAgICAgaWYgKGlzRGV2TW9kZSgpICYmIGZuICE9IG51bGwgJiYgdHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nICYmICgvKiogQHR5cGUgez99ICovIChjb25zb2xlKSkgJiYKICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChjb25zb2xlLndhcm4pKSkgewogICAgICAgICAgICAgICAgY29uc29sZS53YXJuKGB0cmFja0J5IG11c3QgYmUgYSBmdW5jdGlvbiwgYnV0IHJlY2VpdmVkICR7SlNPTi5zdHJpbmdpZnkoZm4pfS5gKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl90cmFja0J5Rm4gPSBmbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhlIHRhYmxlJ3Mgc291cmNlIG9mIGRhdGEsIHdoaWNoIGNhbiBiZSBwcm92aWRlZCBpbiB0aHJlZSB3YXlzIChpbiBvcmRlciBvZiBjb21wbGV4aXR5KToKICAgICAgICAgKiAgIC0gU2ltcGxlIGRhdGEgYXJyYXkgKGVhY2ggb2JqZWN0IHJlcHJlc2VudHMgb25lIHRhYmxlIHJvdykKICAgICAgICAgKiAgIC0gU3RyZWFtIHRoYXQgZW1pdHMgYSBkYXRhIGFycmF5IGVhY2ggdGltZSB0aGUgYXJyYXkgY2hhbmdlcwogICAgICAgICAqICAgLSBgRGF0YVNvdXJjZWAgb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgY29ubmVjdC9kaXNjb25uZWN0IGludGVyZmFjZS4KICAgICAgICAgKgogICAgICAgICAqIElmIGEgZGF0YSBhcnJheSBpcyBwcm92aWRlZCwgdGhlIHRhYmxlIG11c3QgYmUgbm90aWZpZWQgd2hlbiB0aGUgYXJyYXkncyBvYmplY3RzIGFyZQogICAgICAgICAqIGFkZGVkLCByZW1vdmVkLCBvciBtb3ZlZC4gVGhpcyBjYW4gYmUgZG9uZSBieSBjYWxsaW5nIHRoZSBgcmVuZGVyUm93cygpYCBmdW5jdGlvbiB3aGljaCB3aWxsCiAgICAgICAgICogcmVuZGVyIHRoZSBkaWZmIHNpbmNlIHRoZSBsYXN0IHRhYmxlIHJlbmRlci4gSWYgdGhlIGRhdGEgYXJyYXkgcmVmZXJlbmNlIGlzIGNoYW5nZWQsIHRoZSB0YWJsZQogICAgICAgICAqIHdpbGwgYXV0b21hdGljYWxseSB0cmlnZ2VyIGFuIHVwZGF0ZSB0byB0aGUgcm93cy4KICAgICAgICAgKgogICAgICAgICAqIFdoZW4gcHJvdmlkaW5nIGFuIE9ic2VydmFibGUgc3RyZWFtLCB0aGUgdGFibGUgd2lsbCB0cmlnZ2VyIGFuIHVwZGF0ZSBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlCiAgICAgICAgICogc3RyZWFtIGVtaXRzIGEgbmV3IGFycmF5IG9mIGRhdGEuCiAgICAgICAgICoKICAgICAgICAgKiBGaW5hbGx5LCB3aGVuIHByb3ZpZGluZyBhIGBEYXRhU291cmNlYCBvYmplY3QsIHRoZSB0YWJsZSB3aWxsIHVzZSB0aGUgT2JzZXJ2YWJsZSBzdHJlYW0KICAgICAgICAgKiBwcm92aWRlZCBieSB0aGUgY29ubmVjdCBmdW5jdGlvbiBhbmQgdHJpZ2dlciB1cGRhdGVzIHdoZW4gdGhhdCBzdHJlYW0gZW1pdHMgbmV3IGRhdGEgYXJyYXkKICAgICAgICAgKiB2YWx1ZXMuIER1cmluZyB0aGUgdGFibGUncyBuZ09uRGVzdHJveSBvciB3aGVuIHRoZSBkYXRhIHNvdXJjZSBpcyByZW1vdmVkIGZyb20gdGhlIHRhYmxlLCB0aGUKICAgICAgICAgKiB0YWJsZSB3aWxsIGNhbGwgdGhlIERhdGFTb3VyY2UncyBgZGlzY29ubmVjdGAgZnVuY3Rpb24gKG1heSBiZSB1c2VmdWwgZm9yIGNsZWFuaW5nIHVwIGFueQogICAgICAgICAqIHN1YnNjcmlwdGlvbnMgcmVnaXN0ZXJlZCBkdXJpbmcgdGhlIGNvbm5lY3QgcHJvY2VzcykuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGF0YVNvdXJjZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGFTb3VyY2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YVNvdXJjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGRhdGFTb3VyY2UoZGF0YVNvdXJjZSkgewogICAgICAgICAgICBpZiAodGhpcy5fZGF0YVNvdXJjZSAhPT0gZGF0YVNvdXJjZSkgewogICAgICAgICAgICAgICAgdGhpcy5fc3dpdGNoRGF0YVNvdXJjZShkYXRhU291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRvIGFsbG93IG11bHRpcGxlIHJvd3MgcGVyIGRhdGEgb2JqZWN0IGJ5IGV2YWx1YXRpbmcgd2hpY2ggcm93cyBldmFsdWF0ZSB0aGVpciAnd2hlbicKICAgICAgICAgKiBwcmVkaWNhdGUgdG8gdHJ1ZS4gSWYgYG11bHRpVGVtcGxhdGVEYXRhUm93c2AgaXMgZmFsc2UsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IHZhbHVlLCB0aGVuIGVhY2gKICAgICAgICAgKiBkYXRhb2JqZWN0IHdpbGwgcmVuZGVyIHRoZSBmaXJzdCByb3cgdGhhdCBldmFsdWF0ZXMgaXRzIHdoZW4gcHJlZGljYXRlIHRvIHRydWUsIGluIHRoZSBvcmRlcgogICAgICAgICAqIGRlZmluZWQgaW4gdGhlIHRhYmxlLCBvciBvdGhlcndpc2UgdGhlIGRlZmF1bHQgcm93IHdoaWNoIGRvZXMgbm90IGhhdmUgYSB3aGVuIHByZWRpY2F0ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtdWx0aVRlbXBsYXRlRGF0YVJvd3MoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9tdWx0aVRlbXBsYXRlRGF0YVJvd3M7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG11bHRpVGVtcGxhdGVEYXRhUm93cyh2KSB7CiAgICAgICAgICAgIHRoaXMuX211bHRpVGVtcGxhdGVEYXRhUm93cyA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2KTsKICAgICAgICAgICAgLy8gSW4gSXZ5IGlmIHRoaXMgdmFsdWUgaXMgc2V0IHZpYSBhIHN0YXRpYyBhdHRyaWJ1dGUgKGUuZy4gPHRhYmxlIG11bHRpVGVtcGxhdGVEYXRhUm93cz4pLAogICAgICAgICAgICAvLyB0aGlzIHNldHRlciB3aWxsIGJlIGludm9rZWQgYmVmb3JlIHRoZSByb3cgb3V0bGV0IGhhcyBiZWVuIGRlZmluZWQgaGVuY2UgdGhlIG51bGwgY2hlY2suCiAgICAgICAgICAgIGlmICh0aGlzLl9yb3dPdXRsZXQgJiYgdGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXIubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb3JjZVJlbmRlckRhdGFSb3dzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5fc2V0dXBTdGlja3lTdHlsZXIoKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9hcHBseU5hdGl2ZVRhYmxlU2VjdGlvbnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBTZXQgdXAgdGhlIHRyYWNrQnkgZnVuY3Rpb24gc28gdGhhdCBpdCB1c2VzIHRoZSBgUmVuZGVyUm93YCBhcyBpdHMgaWRlbnRpdHkgYnkgZGVmYXVsdC4gSWYKICAgICAgICAgICAgLy8gdGhlIHVzZXIgaGFzIHByb3ZpZGVkIGEgY3VzdG9tIHRyYWNrQnksIHJldHVybiB0aGUgcmVzdWx0IG9mIHRoYXQgZnVuY3Rpb24gYXMgZXZhbHVhdGVkCiAgICAgICAgICAgIC8vIHdpdGggdGhlIHZhbHVlcyBvZiB0aGUgYFJlbmRlclJvd2AncyBkYXRhIGFuZCBpbmRleC4KICAgICAgICAgICAgdGhpcy5fZGF0YURpZmZlciA9IHRoaXMuX2RpZmZlcnMuZmluZChbXSkuY3JlYXRlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfaQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGFSb3cKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChfaSwgZGF0YVJvdykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMudHJhY2tCeSA/IHRoaXMudHJhY2tCeShkYXRhUm93LmRhdGFJbmRleCwgZGF0YVJvdy5kYXRhKSA6IGRhdGFSb3c7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudENoZWNrZWQoKSB7CiAgICAgICAgICAgIC8vIENhY2hlIHRoZSByb3cgYW5kIGNvbHVtbiBkZWZpbml0aW9ucyBnYXRoZXJlZCBieSBDb250ZW50Q2hpbGRyZW4gYW5kIHByb2dyYW1tYXRpYyBpbmplY3Rpb24uCiAgICAgICAgICAgIHRoaXMuX2NhY2hlUm93RGVmcygpOwogICAgICAgICAgICB0aGlzLl9jYWNoZUNvbHVtbkRlZnMoKTsKICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHRoYXQgdGhlIHVzZXIgaGFzIGF0IGxlYXN0IGFkZGVkIGhlYWRlciwgZm9vdGVyLCBvciBkYXRhIHJvdyBkZWYuCiAgICAgICAgICAgIGlmICghdGhpcy5faGVhZGVyUm93RGVmcy5sZW5ndGggJiYgIXRoaXMuX2Zvb3RlclJvd0RlZnMubGVuZ3RoICYmICF0aGlzLl9yb3dEZWZzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0VGFibGVNaXNzaW5nUm93RGVmc0Vycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gUmVuZGVyIHVwZGF0ZXMgaWYgdGhlIGxpc3Qgb2YgY29sdW1ucyBoYXZlIGJlZW4gY2hhbmdlZCBmb3IgdGhlIGhlYWRlciwgcm93LCBvciBmb290ZXIgZGVmcy4KICAgICAgICAgICAgdGhpcy5fcmVuZGVyVXBkYXRlZENvbHVtbnMoKTsKICAgICAgICAgICAgLy8gSWYgdGhlIGhlYWRlciByb3cgZGVmaW5pdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLCB0cmlnZ2VyIGEgcmVuZGVyIHRvIHRoZSBoZWFkZXIgcm93LgogICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyUm93RGVmQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZm9yY2VSZW5kZXJIZWFkZXJSb3dzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlIGZvb3RlciByb3cgZGVmaW5pdGlvbiBoYXMgYmVlbiBjaGFuZ2VkLCB0cmlnZ2VyIGEgcmVuZGVyIHRvIHRoZSBmb290ZXIgcm93LgogICAgICAgICAgICBpZiAodGhpcy5fZm9vdGVyUm93RGVmQ2hhbmdlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZm9yY2VSZW5kZXJGb290ZXJSb3dzKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgYSBkYXRhIHNvdXJjZSBhbmQgcm93IGRlZmluaXRpb25zLCBjb25uZWN0IHRvIHRoZSBkYXRhIHNvdXJjZSB1bmxlc3MgYQogICAgICAgICAgICAvLyBjb25uZWN0aW9uIGhhcyBhbHJlYWR5IGJlZW4gbWFkZS4KICAgICAgICAgICAgaWYgKHRoaXMuZGF0YVNvdXJjZSAmJiB0aGlzLl9yb3dEZWZzLmxlbmd0aCA+IDAgJiYgIXRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9jaGVja1N0aWNreVN0YXRlcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICB0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICB0aGlzLl9jYWNoZWRSZW5kZXJSb3dzTWFwLmNsZWFyKCk7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveS5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMuX29uRGVzdHJveS5jb21wbGV0ZSgpOwogICAgICAgICAgICBpZiAoaXNEYXRhU291cmNlKHRoaXMuZGF0YVNvdXJjZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kaXNjb25uZWN0KHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlbmRlcnMgcm93cyBiYXNlZCBvbiB0aGUgdGFibGUncyBsYXRlc3Qgc2V0IG9mIGRhdGEsIHdoaWNoIHdhcyBlaXRoZXIgcHJvdmlkZWQgZGlyZWN0bHkgYXMgYW4KICAgICAgICAgKiBpbnB1dCBvciByZXRyaWV2ZWQgdGhyb3VnaCBhbiBPYnNlcnZhYmxlIHN0cmVhbSAoZGlyZWN0bHkgb3IgZnJvbSBhIERhdGFTb3VyY2UpLgogICAgICAgICAqIENoZWNrcyBmb3IgZGlmZmVyZW5jZXMgaW4gdGhlIGRhdGEgc2luY2UgdGhlIGxhc3QgZGlmZiB0byBwZXJmb3JtIG9ubHkgdGhlIG5lY2Vzc2FyeQogICAgICAgICAqIGNoYW5nZXMgKGFkZC9yZW1vdmUvbW92ZSByb3dzKS4KICAgICAgICAgKgogICAgICAgICAqIElmIHRoZSB0YWJsZSdzIGRhdGEgc291cmNlIGlzIGEgRGF0YVNvdXJjZSBvciBPYnNlcnZhYmxlLCB0aGlzIHdpbGwgYmUgaW52b2tlZCBhdXRvbWF0aWNhbGx5CiAgICAgICAgICogZWFjaCB0aW1lIHRoZSBwcm92aWRlZCBPYnNlcnZhYmxlIHN0cmVhbSBlbWl0cyBhIG5ldyBkYXRhIGFycmF5LiBPdGhlcndpc2UgaWYgeW91ciBkYXRhIGlzCiAgICAgICAgICogYW4gYXJyYXksIHRoaXMgZnVuY3Rpb24gd2lsbCBuZWVkIHRvIGJlIGNhbGxlZCB0byByZW5kZXIgYW55IGNoYW5nZXMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW5kZXJSb3dzKCkgewogICAgICAgICAgICB0aGlzLl9yZW5kZXJSb3dzID0gdGhpcy5fZ2V0QWxsUmVuZGVyUm93cygpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kYXRhRGlmZmVyLmRpZmYodGhpcy5fcmVuZGVyUm93cyk7CiAgICAgICAgICAgIGlmICghY2hhbmdlcykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgdmlld0NvbnRhaW5lciA9IHRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyOwogICAgICAgICAgICBjaGFuZ2VzLmZvckVhY2hPcGVyYXRpb24oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByZXZJbmRleAogICAgICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRJbmRleAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlY29yZCwgcHJldkluZGV4LCBjdXJyZW50SW5kZXgpID0+IHsKICAgICAgICAgICAgICAgIGlmIChyZWNvcmQucHJldmlvdXNJbmRleCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5zZXJ0Um93KHJlY29yZC5pdGVtLCAoLyoqIEB0eXBlIHs/fSAqLyAoY3VycmVudEluZGV4KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VycmVudEluZGV4ID09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICB2aWV3Q29udGFpbmVyLnJlbW92ZSgoLyoqIEB0eXBlIHs/fSAqLyAocHJldkluZGV4KSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHZpZXcgPSAoLyoqIEB0eXBlIHs/fSAqLyAodmlld0NvbnRhaW5lci5nZXQoKC8qKiBAdHlwZSB7P30gKi8gKHByZXZJbmRleCkpKSkpOwogICAgICAgICAgICAgICAgICAgIHZpZXdDb250YWluZXIubW92ZSgoLyoqIEB0eXBlIHs/fSAqLyAodmlldykpLCBjdXJyZW50SW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbWV0YSBjb250ZXh0IG9mIGEgcm93J3MgY29udGV4dCBkYXRhIChpbmRleCwgY291bnQsIGZpcnN0LCBsYXN0LCAuLi4pCiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVJvd0luZGV4Q29udGV4dCgpOwogICAgICAgICAgICAvLyBVcGRhdGUgcm93cyB0aGF0IGRpZCBub3QgZ2V0IGFkZGVkL3JlbW92ZWQvbW92ZWQgYnV0IG1heSBoYXZlIGhhZCB0aGVpciBpZGVudGl0eSBjaGFuZ2VkLAogICAgICAgICAgICAvLyBlLmcuIGlmIHRyYWNrQnkgbWF0Y2hlZCBkYXRhIG9uIHNvbWUgcHJvcGVydHkgYnV0IHRoZSBhY3R1YWwgZGF0YSByZWZlcmVuY2UgY2hhbmdlZC4KICAgICAgICAgICAgY2hhbmdlcy5mb3JFYWNoSWRlbnRpdHlDaGFuZ2UoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlY29yZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJlY29yZCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgcm93VmlldyA9ICgvKiogQHR5cGUgez99ICovICh2aWV3Q29udGFpbmVyLmdldCgoLyoqIEB0eXBlIHs/fSAqLyAocmVjb3JkLmN1cnJlbnRJbmRleCkpKSkpOwogICAgICAgICAgICAgICAgcm93Vmlldy5jb250ZXh0LiRpbXBsaWNpdCA9IHJlY29yZC5pdGVtLmRhdGE7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgaGVhZGVyIHJvdyBkZWZpbml0aW9uIHRvIGJlIHVzZWQuIE92ZXJyaWRlcyB0aGUgaGVhZGVyIHJvdyBkZWZpbml0aW9uIGdhdGhlcmVkIGJ5CiAgICAgICAgICogdXNpbmcgYENvbnRlbnRDaGlsZGAsIGlmIG9uZSBleGlzdHMuIFNldHMgYSBmbGFnIHRoYXQgd2lsbCByZS1yZW5kZXIgdGhlIGhlYWRlciByb3cgYWZ0ZXIgdGhlCiAgICAgICAgICogdGFibGUncyBjb250ZW50IGlzIGNoZWNrZWQuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYGFkZEhlYWRlclJvd0RlZmAgYW5kIGByZW1vdmVIZWFkZXJSb3dEZWZgIGluc3RlYWQKICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSA4LjAuMAogICAgICAgICAqIEBwYXJhbSB7P30gaGVhZGVyUm93RGVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRIZWFkZXJSb3dEZWYoaGVhZGVyUm93RGVmKSB7CiAgICAgICAgICAgIHRoaXMuX2N1c3RvbUhlYWRlclJvd0RlZnMgPSBuZXcgU2V0KFtoZWFkZXJSb3dEZWZdKTsKICAgICAgICAgICAgdGhpcy5faGVhZGVyUm93RGVmQ2hhbmdlZCA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIGZvb3RlciByb3cgZGVmaW5pdGlvbiB0byBiZSB1c2VkLiBPdmVycmlkZXMgdGhlIGZvb3RlciByb3cgZGVmaW5pdGlvbiBnYXRoZXJlZCBieQogICAgICAgICAqIHVzaW5nIGBDb250ZW50Q2hpbGRgLCBpZiBvbmUgZXhpc3RzLiBTZXRzIGEgZmxhZyB0aGF0IHdpbGwgcmUtcmVuZGVyIHRoZSBmb290ZXIgcm93IGFmdGVyIHRoZQogICAgICAgICAqIHRhYmxlJ3MgY29udGVudCBpcyBjaGVja2VkLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQGRlcHJlY2F0ZWQgVXNlIGBhZGRGb290ZXJSb3dEZWZgIGFuZCBgcmVtb3ZlRm9vdGVyUm93RGVmYCBpbnN0ZWFkCiAgICAgICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAgICAgKiBAcGFyYW0gez99IGZvb3RlclJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0Rm9vdGVyUm93RGVmKGZvb3RlclJvd0RlZikgewogICAgICAgICAgICB0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzID0gbmV3IFNldChbZm9vdGVyUm93RGVmXSk7CiAgICAgICAgICAgIHRoaXMuX2Zvb3RlclJvd0RlZkNoYW5nZWQgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgY29sdW1uIGRlZmluaXRpb24gdGhhdCB3YXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGNvbnRlbnQgY2hpbGRyZW4uCiAgICAgICAgICogQHBhcmFtIHs/fSBjb2x1bW5EZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGFkZENvbHVtbkRlZihjb2x1bW5EZWYpIHsKICAgICAgICAgICAgdGhpcy5fY3VzdG9tQ29sdW1uRGVmcy5hZGQoY29sdW1uRGVmKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGNvbHVtbiBkZWZpbml0aW9uIHRoYXQgd2FzIG5vdCBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBjb250ZW50IGNoaWxkcmVuLgogICAgICAgICAqIEBwYXJhbSB7P30gY29sdW1uRGVmCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmVDb2x1bW5EZWYoY29sdW1uRGVmKSB7CiAgICAgICAgICAgIHRoaXMuX2N1c3RvbUNvbHVtbkRlZnMuZGVsZXRlKGNvbHVtbkRlZik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFkZHMgYSByb3cgZGVmaW5pdGlvbiB0aGF0IHdhcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgY29udGVudCBjaGlsZHJlbi4KICAgICAgICAgKiBAcGFyYW0gez99IHJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkUm93RGVmKHJvd0RlZikgewogICAgICAgICAgICB0aGlzLl9jdXN0b21Sb3dEZWZzLmFkZChyb3dEZWYpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZW1vdmVzIGEgcm93IGRlZmluaXRpb24gdGhhdCB3YXMgbm90IGluY2x1ZGVkIGFzIHBhcnQgb2YgdGhlIGNvbnRlbnQgY2hpbGRyZW4uCiAgICAgICAgICogQHBhcmFtIHs/fSByb3dEZWYKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZVJvd0RlZihyb3dEZWYpIHsKICAgICAgICAgICAgdGhpcy5fY3VzdG9tUm93RGVmcy5kZWxldGUocm93RGVmKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIGhlYWRlciByb3cgZGVmaW5pdGlvbiB0aGF0IHdhcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgY29udGVudCBjaGlsZHJlbi4KICAgICAgICAgKiBAcGFyYW0gez99IGhlYWRlclJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkSGVhZGVyUm93RGVmKGhlYWRlclJvd0RlZikgewogICAgICAgICAgICB0aGlzLl9jdXN0b21IZWFkZXJSb3dEZWZzLmFkZChoZWFkZXJSb3dEZWYpOwogICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGhlYWRlciByb3cgZGVmaW5pdGlvbiB0aGF0IHdhcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgY29udGVudCBjaGlsZHJlbi4KICAgICAgICAgKiBAcGFyYW0gez99IGhlYWRlclJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlSGVhZGVyUm93RGVmKGhlYWRlclJvd0RlZikgewogICAgICAgICAgICB0aGlzLl9jdXN0b21IZWFkZXJSb3dEZWZzLmRlbGV0ZShoZWFkZXJSb3dEZWYpOwogICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dEZWZDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBhIGZvb3RlciByb3cgZGVmaW5pdGlvbiB0aGF0IHdhcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgY29udGVudCBjaGlsZHJlbi4KICAgICAgICAgKiBAcGFyYW0gez99IGZvb3RlclJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkRm9vdGVyUm93RGVmKGZvb3RlclJvd0RlZikgewogICAgICAgICAgICB0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzLmFkZChmb290ZXJSb3dEZWYpOwogICAgICAgICAgICB0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyBhIGZvb3RlciByb3cgZGVmaW5pdGlvbiB0aGF0IHdhcyBub3QgaW5jbHVkZWQgYXMgcGFydCBvZiB0aGUgY29udGVudCBjaGlsZHJlbi4KICAgICAgICAgKiBAcGFyYW0gez99IGZvb3RlclJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVtb3ZlRm9vdGVyUm93RGVmKGZvb3RlclJvd0RlZikgewogICAgICAgICAgICB0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzLmRlbGV0ZShmb290ZXJSb3dEZWYpOwogICAgICAgICAgICB0aGlzLl9mb290ZXJSb3dEZWZDaGFuZ2VkID0gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXBkYXRlcyB0aGUgaGVhZGVyIHN0aWNreSBzdHlsZXMuIEZpcnN0IHJlc2V0cyBhbGwgYXBwbGllZCBzdHlsZXMgd2l0aCByZXNwZWN0IHRvIHRoZSBjZWxscwogICAgICAgICAqIHN0aWNraW5nIHRvIHRoZSB0b3AuIFRoZW4sIGV2YWx1YXRpbmcgd2hpY2ggY2VsbHMgbmVlZCB0byBiZSBzdHVjayB0byB0aGUgdG9wLiBUaGlzIGlzCiAgICAgICAgICogYXV0b21hdGljYWxseSBjYWxsZWQgd2hlbiB0aGUgaGVhZGVyIHJvdyBjaGFuZ2VzIGl0cyBkaXNwbGF5ZWQgc2V0IG9mIGNvbHVtbnMsIG9yIGlmIGl0cwogICAgICAgICAqIHN0aWNreSBpbnB1dCBjaGFuZ2VzLiBNYXkgYmUgY2FsbGVkIG1hbnVhbGx5IGZvciBjYXNlcyB3aGVyZSB0aGUgY2VsbCBjb250ZW50IGNoYW5nZXMgb3V0c2lkZQogICAgICAgICAqIG9mIHRoZXNlIGV2ZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVN0aWNreUhlYWRlclJvd1N0eWxlcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBoZWFkZXJSb3dzID0gdGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX2hlYWRlclJvd091dGxldCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpOwogICAgICAgICAgICAvLyBIaWRlIHRoZSB0aGVhZCBlbGVtZW50IGlmIHRoZXJlIGFyZSBubyBoZWFkZXIgcm93cy4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gc2F0aXNmeQogICAgICAgICAgICAvLyBvdmVyemVhbG91cyBhMTF5IGNoZWNrZXJzIHRoYXQgZmFpbCBiZWNhdXNlIHRoZSBgcm93Z3JvdXBgIGVsZW1lbnQgZG9lcyBub3QgY29udGFpbgogICAgICAgICAgICAvLyByZXF1aXJlZCBjaGlsZCBgcm93YC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0aGVhZCA9IHRhYmxlRWxlbWVudC5xdWVyeVNlbGVjdG9yKCd0aGVhZCcpOwogICAgICAgICAgICBpZiAodGhlYWQpIHsKICAgICAgICAgICAgICAgIHRoZWFkLnN0eWxlLmRpc3BsYXkgPSBoZWFkZXJSb3dzLmxlbmd0aCA/ICcnIDogJ25vbmUnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RpY2t5U3RhdGVzID0gdGhpcy5faGVhZGVyUm93RGVmcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGVmID0+IGRlZi5zdGlja3kpKTsKICAgICAgICAgICAgdGhpcy5fc3RpY2t5U3R5bGVyLmNsZWFyU3RpY2t5UG9zaXRpb25pbmcoaGVhZGVyUm93cywgWyd0b3AnXSk7CiAgICAgICAgICAgIHRoaXMuX3N0aWNreVN0eWxlci5zdGlja1Jvd3MoaGVhZGVyUm93cywgc3RpY2t5U3RhdGVzLCAndG9wJyk7CiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgc3RpY2t5IGlucHV0IGNoYW5nZSBzaW5jZSBpdCBoYXMgYmVlbiB1c2VkLgogICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dEZWZzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGVmID0+IGRlZi5yZXNldFN0aWNreUNoYW5nZWQoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBmb290ZXIgc3RpY2t5IHN0eWxlcy4gRmlyc3QgcmVzZXRzIGFsbCBhcHBsaWVkIHN0eWxlcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNlbGxzCiAgICAgICAgICogc3RpY2tpbmcgdG8gdGhlIGJvdHRvbS4gVGhlbiwgZXZhbHVhdGluZyB3aGljaCBjZWxscyBuZWVkIHRvIGJlIHN0dWNrIHRvIHRoZSBib3R0b20uIFRoaXMgaXMKICAgICAgICAgKiBhdXRvbWF0aWNhbGx5IGNhbGxlZCB3aGVuIHRoZSBmb290ZXIgcm93IGNoYW5nZXMgaXRzIGRpc3BsYXllZCBzZXQgb2YgY29sdW1ucywgb3IgaWYgaXRzCiAgICAgICAgICogc3RpY2t5IGlucHV0IGNoYW5nZXMuIE1heSBiZSBjYWxsZWQgbWFudWFsbHkgZm9yIGNhc2VzIHdoZXJlIHRoZSBjZWxsIGNvbnRlbnQgY2hhbmdlcyBvdXRzaWRlCiAgICAgICAgICogb2YgdGhlc2UgZXZlbnRzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU3RpY2t5Rm9vdGVyUm93U3R5bGVzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGZvb3RlclJvd3MgPSB0aGlzLl9nZXRSZW5kZXJlZFJvd3ModGhpcy5fZm9vdGVyUm93T3V0bGV0KTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0YWJsZUVsZW1lbnQgPSAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KSk7CiAgICAgICAgICAgIC8vIEhpZGUgdGhlIHRmb290IGVsZW1lbnQgaWYgdGhlcmUgYXJlIG5vIGZvb3RlciByb3dzLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBzYXRpc2Z5CiAgICAgICAgICAgIC8vIG92ZXJ6ZWFsb3VzIGExMXkgY2hlY2tlcnMgdGhhdCBmYWlsIGJlY2F1c2UgdGhlIGByb3dncm91cGAgZWxlbWVudCBkb2VzIG5vdCBjb250YWluCiAgICAgICAgICAgIC8vIHJlcXVpcmVkIGNoaWxkIGByb3dgLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRmb290ID0gdGFibGVFbGVtZW50LnF1ZXJ5U2VsZWN0b3IoJ3Rmb290Jyk7CiAgICAgICAgICAgIGlmICh0Zm9vdCkgewogICAgICAgICAgICAgICAgdGZvb3Quc3R5bGUuZGlzcGxheSA9IGZvb3RlclJvd3MubGVuZ3RoID8gJycgOiAnbm9uZSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGlja3lTdGF0ZXMgPSB0aGlzLl9mb290ZXJSb3dEZWZzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZWYgPT4gZGVmLnN0aWNreSkpOwogICAgICAgICAgICB0aGlzLl9zdGlja3lTdHlsZXIuY2xlYXJTdGlja3lQb3NpdGlvbmluZyhmb290ZXJSb3dzLCBbJ2JvdHRvbSddKTsKICAgICAgICAgICAgdGhpcy5fc3RpY2t5U3R5bGVyLnN0aWNrUm93cyhmb290ZXJSb3dzLCBzdGlja3lTdGF0ZXMsICdib3R0b20nKTsKICAgICAgICAgICAgdGhpcy5fc3RpY2t5U3R5bGVyLnVwZGF0ZVN0aWNreUZvb3RlckNvbnRhaW5lcih0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsIHN0aWNreVN0YXRlcyk7CiAgICAgICAgICAgIC8vIFJlc2V0IHRoZSBkaXJ0eSBzdGF0ZSBvZiB0aGUgc3RpY2t5IGlucHV0IGNoYW5nZSBzaW5jZSBpdCBoYXMgYmVlbiB1c2VkLgogICAgICAgICAgICB0aGlzLl9mb290ZXJSb3dEZWZzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZGVmID0+IGRlZi5yZXNldFN0aWNreUNoYW5nZWQoKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVcGRhdGVzIHRoZSBjb2x1bW4gc3RpY2t5IHN0eWxlcy4gRmlyc3QgcmVzZXRzIGFsbCBhcHBsaWVkIHN0eWxlcyB3aXRoIHJlc3BlY3QgdG8gdGhlIGNlbGxzCiAgICAgICAgICogc3RpY2tpbmcgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0LiBUaGVuIHN0aWNreSBzdHlsZXMgYXJlIGFkZGVkIGZvciB0aGUgbGVmdCBhbmQgcmlnaHQgYWNjb3JkaW5nCiAgICAgICAgICogdG8gdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBmb3IgZWFjaCBjZWxsIGluIGVhY2ggcm93LiBUaGlzIGlzIGF1dG9tYXRpY2FsbHkgY2FsbGVkIHdoZW4KICAgICAgICAgKiB0aGUgZGF0YSBzb3VyY2UgcHJvdmlkZXMgYSBuZXcgc2V0IG9mIGRhdGEgb3Igd2hlbiBhIGNvbHVtbiBkZWZpbml0aW9uIGNoYW5nZXMgaXRzIHN0aWNreQogICAgICAgICAqIGlucHV0LiBNYXkgYmUgY2FsbGVkIG1hbnVhbGx5IGZvciBjYXNlcyB3aGVyZSB0aGUgY2VsbCBjb250ZW50IGNoYW5nZXMgb3V0c2lkZSBvZiB0aGVzZSBldmVudHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVTdGlja3lDb2x1bW5TdHlsZXMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGVhZGVyUm93cyA9IHRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9oZWFkZXJSb3dPdXRsZXQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRhdGFSb3dzID0gdGhpcy5fZ2V0UmVuZGVyZWRSb3dzKHRoaXMuX3Jvd091dGxldCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZm9vdGVyUm93cyA9IHRoaXMuX2dldFJlbmRlcmVkUm93cyh0aGlzLl9mb290ZXJSb3dPdXRsZXQpOwogICAgICAgICAgICAvLyBDbGVhciB0aGUgbGVmdCBhbmQgcmlnaHQgcG9zaXRpb25pbmcgZnJvbSBhbGwgY29sdW1ucyBpbiB0aGUgdGFibGUgYWNyb3NzIGFsbCByb3dzIHNpbmNlCiAgICAgICAgICAgIC8vIHN0aWNreSBjb2x1bW5zIHNwYW4gYWNyb3NzIGFsbCB0YWJsZSBzZWN0aW9ucyAoaGVhZGVyLCBkYXRhLCBmb290ZXIpCiAgICAgICAgICAgIHRoaXMuX3N0aWNreVN0eWxlci5jbGVhclN0aWNreVBvc2l0aW9uaW5nKFsuLi5oZWFkZXJSb3dzLCAuLi5kYXRhUm93cywgLi4uZm9vdGVyUm93c10sIFsnbGVmdCcsICdyaWdodCddKTsKICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBzdGlja3kgc3R5bGVzIGZvciBlYWNoIGhlYWRlciByb3cgZGVwZW5kaW5nIG9uIHRoZSBkZWYncyBzdGlja3kgc3RhdGUKICAgICAgICAgICAgaGVhZGVyUm93cy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBoZWFkZXJSb3cKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaGVhZGVyUm93LCBpKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9hZGRTdGlja3lDb2x1bW5TdHlsZXMoW2hlYWRlclJvd10sIHRoaXMuX2hlYWRlclJvd0RlZnNbaV0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RpY2t5IHN0eWxlcyBmb3IgZWFjaCBkYXRhIHJvdyBkZXBlbmRpbmcgb24gaXRzIGRlZidzIHN0aWNreSBzdGF0ZQogICAgICAgICAgICB0aGlzLl9yb3dEZWZzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJvd0RlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgcm93RGVmID0+IHsKICAgICAgICAgICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSByb3dzIHJlbmRlcmVkIHdpdGggdGhpcyByb3cgZGVmaW5pdGlvbi4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJvd3MgPSBbXTsKICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZGF0YVJvd3MubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5fcmVuZGVyUm93c1tpXS5yb3dEZWYgPT09IHJvd0RlZikgewogICAgICAgICAgICAgICAgICAgICAgICByb3dzLnB1c2goZGF0YVJvd3NbaV0pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2FkZFN0aWNreUNvbHVtblN0eWxlcyhyb3dzLCByb3dEZWYpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgc3RpY2t5IHN0eWxlcyBmb3IgZWFjaCBmb290ZXIgcm93IGRlcGVuZGluZyBvbiB0aGUgZGVmJ3Mgc3RpY2t5IHN0YXRlCiAgICAgICAgICAgIGZvb3RlclJvd3MuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZm9vdGVyUm93CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGZvb3RlclJvdywgaSkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fYWRkU3RpY2t5Q29sdW1uU3R5bGVzKFtmb290ZXJSb3ddLCB0aGlzLl9mb290ZXJSb3dEZWZzW2ldKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBSZXNldCB0aGUgZGlydHkgc3RhdGUgb2YgdGhlIHN0aWNreSBpbnB1dCBjaGFuZ2Ugc2luY2UgaXQgaGFzIGJlZW4gdXNlZC4KICAgICAgICAgICAgQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLnZhbHVlcygpKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRlZiA9PiBkZWYucmVzZXRTdGlja3lDaGFuZ2VkKCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2V0IHRoZSBsaXN0IG9mIFJlbmRlclJvdyBvYmplY3RzIHRvIHJlbmRlciBhY2NvcmRpbmcgdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBkYXRhIGFuZCBkZWZpbmVkCiAgICAgICAgICogcm93IGRlZmluaXRpb25zLiBJZiB0aGUgcHJldmlvdXMgbGlzdCBhbHJlYWR5IGNvbnRhaW5lZCBhIHBhcnRpY3VsYXIgcGFpciwgaXQgc2hvdWxkIGJlIHJldXNlZAogICAgICAgICAqIHNvIHRoYXQgdGhlIGRpZmZlciBlcXVhdGVzIHRoZWlyIHJlZmVyZW5jZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRBbGxSZW5kZXJSb3dzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlbmRlclJvd3MgPSBbXTsKICAgICAgICAgICAgLy8gU3RvcmUgdGhlIGNhY2hlIGFuZCBjcmVhdGUgYSBuZXcgb25lLiBBbnkgcmUtdXNlZCBSZW5kZXJSb3cgb2JqZWN0cyB3aWxsIGJlIG1vdmVkIGludG8gdGhlCiAgICAgICAgICAgIC8vIG5ldyBjYWNoZSB3aGlsZSB1bnVzZWQgb25lcyBjYW4gYmUgcGlja2VkIHVwIGJ5IGdhcmJhZ2UgY29sbGVjdGlvbi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwcmV2Q2FjaGVkUmVuZGVyUm93cyA9IHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXA7CiAgICAgICAgICAgIHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgIC8vIEZvciBlYWNoIGRhdGEgb2JqZWN0LCBnZXQgdGhlIGxpc3Qgb2Ygcm93cyB0aGF0IHNob3VsZCBiZSByZW5kZXJlZCwgcmVwcmVzZW50ZWQgYnkgdGhlCiAgICAgICAgICAgIC8vIHJlc3BlY3RpdmUgYFJlbmRlclJvd2Agb2JqZWN0IHdoaWNoIGlzIHRoZSBwYWlyIG9mIGBkYXRhYCBhbmQgYENka1Jvd0RlZmAuCiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5fZGF0YS5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGRhdGEgPSB0aGlzLl9kYXRhW2ldOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVuZGVyUm93c0ZvckRhdGEgPSB0aGlzLl9nZXRSZW5kZXJSb3dzRm9yRGF0YShkYXRhLCBpLCBwcmV2Q2FjaGVkUmVuZGVyUm93cy5nZXQoZGF0YSkpOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLl9jYWNoZWRSZW5kZXJSb3dzTWFwLmhhcyhkYXRhKSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuc2V0KGRhdGEsIG5ldyBXZWFrTWFwKCkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCByZW5kZXJSb3dzRm9yRGF0YS5sZW5ndGg7IGorKykgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgcmVuZGVyUm93ID0gcmVuZGVyUm93c0ZvckRhdGFbal07CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhY2hlID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2NhY2hlZFJlbmRlclJvd3NNYXAuZ2V0KHJlbmRlclJvdy5kYXRhKSkpOwogICAgICAgICAgICAgICAgICAgIGlmIChjYWNoZS5oYXMocmVuZGVyUm93LnJvd0RlZikpIHsKICAgICAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKGNhY2hlLmdldChyZW5kZXJSb3cucm93RGVmKSkpLnB1c2gocmVuZGVyUm93KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlLnNldChyZW5kZXJSb3cucm93RGVmLCBbcmVuZGVyUm93XSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJlbmRlclJvd3MucHVzaChyZW5kZXJSb3cpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZW5kZXJSb3dzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBHZXRzIGEgbGlzdCBvZiBgUmVuZGVyUm93PFQ+YCBmb3IgdGhlIHByb3ZpZGVkIGRhdGEgb2JqZWN0IGFuZCBhbnkgYENka1Jvd0RlZmAgb2JqZWN0cyB0aGF0CiAgICAgICAgICogc2hvdWxkIGJlIHJlbmRlcmVkIGZvciB0aGlzIGRhdGEuIFJldXNlcyB0aGUgY2FjaGVkIFJlbmRlclJvdyBvYmplY3RzIGlmIHRoZXkgbWF0Y2ggdGhlIHNhbWUKICAgICAgICAgKiBgKFQsIENka1Jvd0RlZilgIHBhaXIuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGFJbmRleAogICAgICAgICAqIEBwYXJhbSB7Pz19IGNhY2hlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0UmVuZGVyUm93c0ZvckRhdGEoZGF0YSwgZGF0YUluZGV4LCBjYWNoZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJvd0RlZnMgPSB0aGlzLl9nZXRSb3dEZWZzKGRhdGEsIGRhdGFJbmRleCk7CiAgICAgICAgICAgIHJldHVybiByb3dEZWZzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcm93RGVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICByb3dEZWYgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY2FjaGVkUmVuZGVyUm93cyA9IChjYWNoZSAmJiBjYWNoZS5oYXMocm93RGVmKSkgPyAoLyoqIEB0eXBlIHs/fSAqLyAoY2FjaGUuZ2V0KHJvd0RlZikpKSA6IFtdOwogICAgICAgICAgICAgICAgaWYgKGNhY2hlZFJlbmRlclJvd3MubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFSb3cgPSAoLyoqIEB0eXBlIHs/fSAqLyAoY2FjaGVkUmVuZGVyUm93cy5zaGlmdCgpKSk7CiAgICAgICAgICAgICAgICAgICAgZGF0YVJvdy5kYXRhSW5kZXggPSBkYXRhSW5kZXg7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFSb3c7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkYXRhLCByb3dEZWYsIGRhdGFJbmRleCB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgbWFwIGNvbnRhaW5pbmcgdGhlIGNvbnRlbnQncyBjb2x1bW4gZGVmaW5pdGlvbnMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jYWNoZUNvbHVtbkRlZnMoKSB7CiAgICAgICAgICAgIHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuY2xlYXIoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb2x1bW5EZWZzID0gbWVyZ2VBcnJheUFuZFNldCh0aGlzLl9nZXRPd25EZWZzKHRoaXMuX2NvbnRlbnRDb2x1bW5EZWZzKSwgdGhpcy5fY3VzdG9tQ29sdW1uRGVmcyk7CiAgICAgICAgICAgIGNvbHVtbkRlZnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29sdW1uRGVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb2x1bW5EZWYgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuaGFzKGNvbHVtbkRlZi5uYW1lKSkgewogICAgICAgICAgICAgICAgICAgIHRocm93IGdldFRhYmxlRHVwbGljYXRlQ29sdW1uTmFtZUVycm9yKGNvbHVtbkRlZi5uYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuc2V0KGNvbHVtbkRlZi5uYW1lLCBjb2x1bW5EZWYpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZSB0aGUgbGlzdCBvZiBhbGwgYXZhaWxhYmxlIHJvdyBkZWZpbml0aW9ucyB0aGF0IGNhbiBiZSB1c2VkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfY2FjaGVSb3dEZWZzKCkgewogICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dEZWZzID0gbWVyZ2VBcnJheUFuZFNldCh0aGlzLl9nZXRPd25EZWZzKHRoaXMuX2NvbnRlbnRIZWFkZXJSb3dEZWZzKSwgdGhpcy5fY3VzdG9tSGVhZGVyUm93RGVmcyk7CiAgICAgICAgICAgIHRoaXMuX2Zvb3RlclJvd0RlZnMgPSBtZXJnZUFycmF5QW5kU2V0KHRoaXMuX2dldE93bkRlZnModGhpcy5fY29udGVudEZvb3RlclJvd0RlZnMpLCB0aGlzLl9jdXN0b21Gb290ZXJSb3dEZWZzKTsKICAgICAgICAgICAgdGhpcy5fcm93RGVmcyA9IG1lcmdlQXJyYXlBbmRTZXQodGhpcy5fZ2V0T3duRGVmcyh0aGlzLl9jb250ZW50Um93RGVmcyksIHRoaXMuX2N1c3RvbVJvd0RlZnMpOwogICAgICAgICAgICAvLyBBZnRlciBhbGwgcm93IGRlZmluaXRpb25zIGFyZSBkZXRlcm1pbmVkLCBmaW5kIHRoZSByb3cgZGVmaW5pdGlvbiB0byBiZSBjb25zaWRlcmVkIGRlZmF1bHQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGVmYXVsdFJvd0RlZnMgPSB0aGlzLl9yb3dEZWZzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkZWYgPT4gIWRlZi53aGVuKSk7CiAgICAgICAgICAgIGlmICghdGhpcy5tdWx0aVRlbXBsYXRlRGF0YVJvd3MgJiYgZGVmYXVsdFJvd0RlZnMubGVuZ3RoID4gMSkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0VGFibGVNdWx0aXBsZURlZmF1bHRSb3dEZWZzRXJyb3IoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9kZWZhdWx0Um93RGVmID0gZGVmYXVsdFJvd0RlZnNbMF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrIGlmIHRoZSBoZWFkZXIsIGRhdGEsIG9yIGZvb3RlciByb3dzIGhhdmUgY2hhbmdlZCB3aGF0IGNvbHVtbnMgdGhleSB3YW50IHRvIGRpc3BsYXkgb3IKICAgICAgICAgKiB3aGV0aGVyIHRoZSBzdGlja3kgc3RhdGVzIGhhdmUgY2hhbmdlZCBmb3IgdGhlIGhlYWRlciBvciBmb290ZXIuIElmIHRoZXJlIGlzIGEgZGlmZiwgdGhlbgogICAgICAgICAqIHJlLXJlbmRlciB0aGF0IHNlY3Rpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZW5kZXJVcGRhdGVkQ29sdW1ucygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb2x1bW5zRGlmZlJlZHVjZXIgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYWNjCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYWNjLCBkZWYpID0+IGFjYyB8fCAhIWRlZi5nZXRDb2x1bW5zRGlmZigpKTsKICAgICAgICAgICAgLy8gRm9yY2UgcmUtcmVuZGVyIGRhdGEgcm93cyBpZiB0aGUgbGlzdCBvZiBjb2x1bW4gZGVmaW5pdGlvbnMgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBpZiAodGhpcy5fcm93RGVmcy5yZWR1Y2UoY29sdW1uc0RpZmZSZWR1Y2VyLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmNlUmVuZGVyRGF0YVJvd3MoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBGb3JjZSByZS1yZW5kZXIgaGVhZGVyL2Zvb3RlciByb3dzIGlmIHRoZSBsaXN0IG9mIGNvbHVtbiBkZWZpbml0aW9ucyBoYXZlIGNoYW5nZWQuLgogICAgICAgICAgICBpZiAodGhpcy5faGVhZGVyUm93RGVmcy5yZWR1Y2UoY29sdW1uc0RpZmZSZWR1Y2VyLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2ZvcmNlUmVuZGVySGVhZGVyUm93cygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9mb290ZXJSb3dEZWZzLnJlZHVjZShjb2x1bW5zRGlmZlJlZHVjZXIsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgdGhpcy5fZm9yY2VSZW5kZXJGb290ZXJSb3dzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3dpdGNoIHRvIHRoZSBwcm92aWRlZCBkYXRhIHNvdXJjZSBieSByZXNldHRpbmcgdGhlIGRhdGEgYW5kIHVuc3Vic2NyaWJpbmcgZnJvbSB0aGUgY3VycmVudAogICAgICAgICAqIHJlbmRlciBjaGFuZ2Ugc3Vic2NyaXB0aW9uIGlmIG9uZSBleGlzdHMuIElmIHRoZSBkYXRhIHNvdXJjZSBpcyBudWxsLCBpbnRlcnByZXQgdGhpcyBieQogICAgICAgICAqIGNsZWFyaW5nIHRoZSByb3cgb3V0bGV0LiBPdGhlcndpc2Ugc3RhcnQgbGlzdGVuaW5nIGZvciBuZXcgZGF0YS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YVNvdXJjZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N3aXRjaERhdGFTb3VyY2UoZGF0YVNvdXJjZSkgewogICAgICAgICAgICB0aGlzLl9kYXRhID0gW107CiAgICAgICAgICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlLmRpc2Nvbm5lY3QodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3RvcCBsaXN0ZW5pbmcgZm9yIGRhdGEgZnJvbSB0aGUgcHJldmlvdXMgZGF0YSBzb3VyY2UuCiAgICAgICAgICAgIGlmICh0aGlzLl9yZW5kZXJDaGFuZ2VTdWJzY3JpcHRpb24pIHsKICAgICAgICAgICAgICAgIHRoaXMuX3JlbmRlckNoYW5nZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIWRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9kYXRhRGlmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZGF0YURpZmZlci5kaWZmKFtdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3Jvd091dGxldC52aWV3Q29udGFpbmVyLmNsZWFyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldCB1cCBhIHN1YnNjcmlwdGlvbiBmb3IgdGhlIGRhdGEgcHJvdmlkZWQgYnkgdGhlIGRhdGEgc291cmNlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfb2JzZXJ2ZVJlbmRlckNoYW5nZXMoKSB7CiAgICAgICAgICAgIC8vIElmIG5vIGRhdGEgc291cmNlIGhhcyBiZWVuIHNldCwgdGhlcmUgaXMgbm90aGluZyB0byBvYnNlcnZlIGZvciBjaGFuZ2VzLgogICAgICAgICAgICBpZiAoIXRoaXMuZGF0YVNvdXJjZSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IGRhdGFTdHJlYW07CiAgICAgICAgICAgIGlmIChpc0RhdGFTb3VyY2UodGhpcy5kYXRhU291cmNlKSkgewogICAgICAgICAgICAgICAgZGF0YVN0cmVhbSA9IHRoaXMuZGF0YVNvdXJjZS5jb25uZWN0KHRoaXMpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzT2JzZXJ2YWJsZSh0aGlzLmRhdGFTb3VyY2UpKSB7CiAgICAgICAgICAgICAgICBkYXRhU3RyZWFtID0gdGhpcy5kYXRhU291cmNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5kYXRhU291cmNlKSkgewogICAgICAgICAgICAgICAgZGF0YVN0cmVhbSA9IG9mKHRoaXMuZGF0YVNvdXJjZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGRhdGFTdHJlYW0gPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0VGFibGVVbmtub3duRGF0YVNvdXJjZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlU3Vic2NyaXB0aW9uID0gZGF0YVN0cmVhbS5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGRhdGEgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fZGF0YSA9IGRhdGEgfHwgW107CiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclJvd3MoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGNvbnRlbnQgaW4gdGhlIGhlYWRlciByb3cgb3V0bGV0IGFuZCBjcmVhdGVzIGEgbmV3IGVtYmVkZGVkIHZpZXcKICAgICAgICAgKiBpbiB0aGUgb3V0bGV0IHVzaW5nIHRoZSBoZWFkZXIgcm93IGRlZmluaXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb3JjZVJlbmRlckhlYWRlclJvd3MoKSB7CiAgICAgICAgICAgIC8vIENsZWFyIHRoZSBoZWFkZXIgcm93IG91dGxldCBpZiBhbnkgY29udGVudCBleGlzdHMuCiAgICAgICAgICAgIGlmICh0aGlzLl9oZWFkZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9oZWFkZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2hlYWRlclJvd0RlZnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRlZiwgaSkgPT4gdGhpcy5fcmVuZGVyUm93KHRoaXMuX2hlYWRlclJvd091dGxldCwgZGVmLCBpKSkpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreUhlYWRlclJvd1N0eWxlcygpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgYW55IGV4aXN0aW5nIGNvbnRlbnQgaW4gdGhlIGZvb3RlciByb3cgb3V0bGV0IGFuZCBjcmVhdGVzIGEgbmV3IGVtYmVkZGVkIHZpZXcKICAgICAgICAgKiBpbiB0aGUgb3V0bGV0IHVzaW5nIHRoZSBmb290ZXIgcm93IGRlZmluaXRpb24uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb3JjZVJlbmRlckZvb3RlclJvd3MoKSB7CiAgICAgICAgICAgIC8vIENsZWFyIHRoZSBmb290ZXIgcm93IG91dGxldCBpZiBhbnkgY29udGVudCBleGlzdHMuCiAgICAgICAgICAgIGlmICh0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9mb290ZXJSb3dPdXRsZXQudmlld0NvbnRhaW5lci5jbGVhcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2Zvb3RlclJvd0RlZnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRlZiwgaSkgPT4gdGhpcy5fcmVuZGVyUm93KHRoaXMuX2Zvb3RlclJvd091dGxldCwgZGVmLCBpKSkpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreUZvb3RlclJvd1N0eWxlcygpOwogICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreUNvbHVtblN0eWxlcygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIHRoZSBzdGlja3kgY29sdW1uIHN0eWxlcyBmb3IgdGhlIHJvd3MgYWNjb3JkaW5nIHRvIHRoZSBjb2x1bW5zJyBzdGljayBzdGF0ZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHJvd3MKICAgICAgICAgKiBAcGFyYW0gez99IHJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2FkZFN0aWNreUNvbHVtblN0eWxlcyhyb3dzLCByb3dEZWYpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb2x1bW5EZWZzID0gQXJyYXkuZnJvbShyb3dEZWYuY29sdW1ucyB8fCBbXSkubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb2x1bW5OYW1lCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb2x1bW5OYW1lID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbkRlZiA9IHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KGNvbHVtbk5hbWUpOwogICAgICAgICAgICAgICAgaWYgKCFjb2x1bW5EZWYpIHsKICAgICAgICAgICAgICAgICAgICB0aHJvdyBnZXRUYWJsZVVua25vd25Db2x1bW5FcnJvcihjb2x1bW5OYW1lKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoY29sdW1uRGVmKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGlja3lTdGFydFN0YXRlcyA9IGNvbHVtbkRlZnMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb2x1bW5EZWYKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbHVtbkRlZiA9PiBjb2x1bW5EZWYuc3RpY2t5KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RpY2t5RW5kU3RhdGVzID0gY29sdW1uRGVmcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbHVtbkRlZgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY29sdW1uRGVmID0+IGNvbHVtbkRlZi5zdGlja3lFbmQpKTsKICAgICAgICAgICAgdGhpcy5fc3RpY2t5U3R5bGVyLnVwZGF0ZVN0aWNreUNvbHVtbnMocm93cywgc3RpY2t5U3RhcnRTdGF0ZXMsIHN0aWNreUVuZFN0YXRlcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGxpc3Qgb2Ygcm93cyB0aGF0IGhhdmUgYmVlbiByZW5kZXJlZCBpbiB0aGUgcm93IG91dGxldC4KICAgICAgICAgKiBAcGFyYW0gez99IHJvd091dGxldAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldFJlbmRlcmVkUm93cyhyb3dPdXRsZXQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByZW5kZXJlZFJvd3MgPSBbXTsKICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dPdXRsZXQudmlld0NvbnRhaW5lci5sZW5ndGg7IGkrKykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgdmlld1JlZiA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKHJvd091dGxldC52aWV3Q29udGFpbmVyLmdldChpKSkpKSkpOwogICAgICAgICAgICAgICAgcmVuZGVyZWRSb3dzLnB1c2godmlld1JlZi5yb290Tm9kZXNbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByZW5kZXJlZFJvd3M7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldCB0aGUgbWF0Y2hpbmcgcm93IGRlZmluaXRpb25zIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoaXMgcm93IGRhdGEuIElmIHRoZXJlIGlzIG9ubHkKICAgICAgICAgKiBvbmUgcm93IGRlZmluaXRpb24sIGl0IGlzIHJldHVybmVkLiBPdGhlcndpc2UsIGZpbmQgdGhlIHJvdyBkZWZpbml0aW9ucyB0aGF0IGhhcyBhIHdoZW4KICAgICAgICAgKiBwcmVkaWNhdGUgdGhhdCByZXR1cm5zIHRydWUgd2l0aCB0aGUgZGF0YS4gSWYgbm9uZSByZXR1cm4gdHJ1ZSwgcmV0dXJuIHRoZSBkZWZhdWx0IHJvdwogICAgICAgICAqIGRlZmluaXRpb24uCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhSW5kZXgKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRSb3dEZWZzKGRhdGEsIGRhdGFJbmRleCkgewogICAgICAgICAgICBpZiAodGhpcy5fcm93RGVmcy5sZW5ndGggPT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIFt0aGlzLl9yb3dEZWZzWzBdXTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCByb3dEZWZzID0gW107CiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpVGVtcGxhdGVEYXRhUm93cykgewogICAgICAgICAgICAgICAgcm93RGVmcyA9IHRoaXMuX3Jvd0RlZnMuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGVmCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBkZWYgPT4gIWRlZi53aGVuIHx8IGRlZi53aGVuKGRhdGFJbmRleCwgZGF0YSkpKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCByb3dEZWYgPSB0aGlzLl9yb3dEZWZzLmZpbmQoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkZWYKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRlZiA9PiBkZWYud2hlbiAmJiBkZWYud2hlbihkYXRhSW5kZXgsIGRhdGEpKSkgfHwgdGhpcy5fZGVmYXVsdFJvd0RlZjsKICAgICAgICAgICAgICAgIGlmIChyb3dEZWYpIHsKICAgICAgICAgICAgICAgICAgICByb3dEZWZzLnB1c2gocm93RGVmKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXJvd0RlZnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBnZXRUYWJsZU1pc3NpbmdNYXRjaGluZ1Jvd0RlZkVycm9yKGRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiByb3dEZWZzOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDcmVhdGUgdGhlIGVtYmVkZGVkIHZpZXcgZm9yIHRoZSBkYXRhIHJvdyB0ZW1wbGF0ZSBhbmQgcGxhY2UgaXQgaW4gdGhlIGNvcnJlY3QgaW5kZXggbG9jYXRpb24KICAgICAgICAgKiB3aXRoaW4gdGhlIGRhdGEgcm93IHZpZXcgY29udGFpbmVyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSByZW5kZXJSb3cKICAgICAgICAgKiBAcGFyYW0gez99IHJlbmRlckluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW5zZXJ0Um93KHJlbmRlclJvdywgcmVuZGVySW5kZXgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCByb3dEZWYgPSByZW5kZXJSb3cucm93RGVmOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvbnRleHQgPSB7ICRpbXBsaWNpdDogcmVuZGVyUm93LmRhdGEgfTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyUm93KHRoaXMuX3Jvd091dGxldCwgcm93RGVmLCByZW5kZXJJbmRleCwgY29udGV4dCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBuZXcgcm93IHRlbXBsYXRlIGluIHRoZSBvdXRsZXQgYW5kIGZpbGxzIGl0IHdpdGggdGhlIHNldCBvZiBjZWxsIHRlbXBsYXRlcy4KICAgICAgICAgKiBPcHRpb25hbGx5IHRha2VzIGEgY29udGV4dCB0byBwcm92aWRlIHRvIHRoZSByb3cgYW5kIGNlbGxzLCBhcyB3ZWxsIGFzIGFuIG9wdGlvbmFsIGluZGV4CiAgICAgICAgICogb2Ygd2hlcmUgdG8gcGxhY2UgdGhlIG5ldyByb3cgdGVtcGxhdGUgaW4gdGhlIG91dGxldC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gb3V0bGV0CiAgICAgICAgICogQHBhcmFtIHs/fSByb3dEZWYKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHBhcmFtIHs/PX0gY29udGV4dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3JlbmRlclJvdyhvdXRsZXQsIHJvd0RlZiwgaW5kZXgsIGNvbnRleHQgPSB7fSkgewogICAgICAgICAgICAvLyBUT0RPKGFuZHJld3NlZ3Vpbik6IGVuZm9yY2UgdGhhdCBvbmUgb3V0bGV0IHdhcyBpbnN0YW50aWF0ZWQgZnJvbSBjcmVhdGVFbWJlZGRlZFZpZXcKICAgICAgICAgICAgb3V0bGV0LnZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KHJvd0RlZi50ZW1wbGF0ZSwgY29udGV4dCwgaW5kZXgpOwogICAgICAgICAgICBmb3IgKGxldCBjZWxsVGVtcGxhdGUgb2YgdGhpcy5fZ2V0Q2VsbFRlbXBsYXRlcyhyb3dEZWYpKSB7CiAgICAgICAgICAgICAgICBpZiAoQ2RrQ2VsbE91dGxldC5tb3N0UmVjZW50Q2VsbE91dGxldCkgewogICAgICAgICAgICAgICAgICAgIENka0NlbGxPdXRsZXQubW9zdFJlY2VudENlbGxPdXRsZXQuX3ZpZXdDb250YWluZXIuY3JlYXRlRW1iZWRkZWRWaWV3KGNlbGxUZW1wbGF0ZSwgY29udGV4dCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIGluZGV4LXJlbGF0ZWQgY29udGV4dCBmb3IgZWFjaCByb3cgdG8gcmVmbGVjdCBhbnkgY2hhbmdlcyBpbiB0aGUgaW5kZXggb2YgdGhlIHJvd3MsCiAgICAgICAgICogZS5nLiBmaXJzdC9sYXN0L2V2ZW4vb2RkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlUm93SW5kZXhDb250ZXh0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZpZXdDb250YWluZXIgPSB0aGlzLl9yb3dPdXRsZXQudmlld0NvbnRhaW5lcjsKICAgICAgICAgICAgZm9yIChsZXQgcmVuZGVySW5kZXggPSAwLCBjb3VudCA9IHZpZXdDb250YWluZXIubGVuZ3RoOyByZW5kZXJJbmRleCA8IGNvdW50OyByZW5kZXJJbmRleCsrKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB2aWV3UmVmID0gKC8qKiBAdHlwZSB7P30gKi8gKHZpZXdDb250YWluZXIuZ2V0KHJlbmRlckluZGV4KSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgY29udGV4dCA9ICgvKiogQHR5cGUgez99ICovICh2aWV3UmVmLmNvbnRleHQpKTsKICAgICAgICAgICAgICAgIGNvbnRleHQuY291bnQgPSBjb3VudDsKICAgICAgICAgICAgICAgIGNvbnRleHQuZmlyc3QgPSByZW5kZXJJbmRleCA9PT0gMDsKICAgICAgICAgICAgICAgIGNvbnRleHQubGFzdCA9IHJlbmRlckluZGV4ID09PSBjb3VudCAtIDE7CiAgICAgICAgICAgICAgICBjb250ZXh0LmV2ZW4gPSByZW5kZXJJbmRleCAlIDIgPT09IDA7CiAgICAgICAgICAgICAgICBjb250ZXh0Lm9kZCA9ICFjb250ZXh0LmV2ZW47CiAgICAgICAgICAgICAgICBpZiAodGhpcy5tdWx0aVRlbXBsYXRlRGF0YVJvd3MpIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmRhdGFJbmRleCA9IHRoaXMuX3JlbmRlclJvd3NbcmVuZGVySW5kZXhdLmRhdGFJbmRleDsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJlbmRlckluZGV4ID0gcmVuZGVySW5kZXg7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmluZGV4ID0gdGhpcy5fcmVuZGVyUm93c1tyZW5kZXJJbmRleF0uZGF0YUluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEdldHMgdGhlIGNvbHVtbiBkZWZpbml0aW9ucyBmb3IgdGhlIHByb3ZpZGVkIHJvdyBkZWYuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHJvd0RlZgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldENlbGxUZW1wbGF0ZXMocm93RGVmKSB7CiAgICAgICAgICAgIGlmICghcm93RGVmIHx8ICFyb3dEZWYuY29sdW1ucykgewogICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBBcnJheS5mcm9tKHJvd0RlZi5jb2x1bW5zLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29sdW1uSWQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNvbHVtbklkID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuX2NvbHVtbkRlZnNCeU5hbWUuZ2V0KGNvbHVtbklkKTsKICAgICAgICAgICAgICAgIGlmICghY29sdW1uKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZ2V0VGFibGVVbmtub3duQ29sdW1uRXJyb3IoY29sdW1uSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHJvd0RlZi5leHRyYWN0Q2VsbFRlbXBsYXRlKGNvbHVtbik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQWRkcyBuYXRpdmUgdGFibGUgc2VjdGlvbnMgKGUuZy4gdGJvZHkpIGFuZCBtb3ZlcyB0aGUgcm93IG91dGxldHMgaW50byB0aGVtLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYXBwbHlOYXRpdmVUYWJsZVNlY3Rpb25zKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRvY3VtZW50RnJhZ21lbnQgPSB0aGlzLl9kb2N1bWVudC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VjdGlvbnMgPSBbCiAgICAgICAgICAgICAgICB7IHRhZzogJ3RoZWFkJywgb3V0bGV0OiB0aGlzLl9oZWFkZXJSb3dPdXRsZXQgfSwKICAgICAgICAgICAgICAgIHsgdGFnOiAndGJvZHknLCBvdXRsZXQ6IHRoaXMuX3Jvd091dGxldCB9LAogICAgICAgICAgICAgICAgeyB0YWc6ICd0Zm9vdCcsIG91dGxldDogdGhpcy5fZm9vdGVyUm93T3V0bGV0IH0sCiAgICAgICAgICAgIF07CiAgICAgICAgICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBzZWN0aW9ucykgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2RvY3VtZW50LmNyZWF0ZUVsZW1lbnQoc2VjdGlvbi50YWcpOwogICAgICAgICAgICAgICAgZWxlbWVudC5zZXRBdHRyaWJ1dGUoJ3JvbGUnLCAncm93Z3JvdXAnKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuYXBwZW5kQ2hpbGQoc2VjdGlvbi5vdXRsZXQuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50KTsKICAgICAgICAgICAgICAgIGRvY3VtZW50RnJhZ21lbnQuYXBwZW5kQ2hpbGQoZWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVXNlIGEgRG9jdW1lbnRGcmFnbWVudCBzbyB3ZSBkb24ndCBoaXQgdGhlIERPTSBvbiBlYWNoIGl0ZXJhdGlvbi4KICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKGRvY3VtZW50RnJhZ21lbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGb3JjZXMgYSByZS1yZW5kZXIgb2YgdGhlIGRhdGEgcm93cy4gU2hvdWxkIGJlIGNhbGxlZCBpbiBjYXNlcyB3aGVyZSB0aGVyZSBoYXMgYmVlbiBhbiBpbnB1dAogICAgICAgICAqIGNoYW5nZSB0aGF0IGFmZmVjdHMgdGhlIGV2YWx1YXRpb24gb2Ygd2hpY2ggcm93cyBzaG91bGQgYmUgcmVuZGVyZWQsIGUuZy4gdG9nZ2xpbmcKICAgICAgICAgKiBgbXVsdGlUZW1wbGF0ZURhdGFSb3dzYCBvciBhZGRpbmcvcmVtb3Zpbmcgcm93IGRlZmluaXRpb25zLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZm9yY2VSZW5kZXJEYXRhUm93cygpIHsKICAgICAgICAgICAgdGhpcy5fZGF0YURpZmZlci5kaWZmKFtdKTsKICAgICAgICAgICAgdGhpcy5fcm93T3V0bGV0LnZpZXdDb250YWluZXIuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5yZW5kZXJSb3dzKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyBpZiB0aGVyZSBoYXMgYmVlbiBhIGNoYW5nZSBpbiBzdGlja3kgc3RhdGVzIHNpbmNlIGxhc3QgY2hlY2sgYW5kIGFwcGxpZXMgdGhlIGNvcnJlY3QKICAgICAgICAgKiBzdGlja3kgc3R5bGVzLiBTaW5jZSBjaGVja2luZyByZXNldHMgdGhlICJkaXJ0eSIgc3RhdGUsIHRoaXMgc2hvdWxkIG9ubHkgYmUgcGVyZm9ybWVkIG9uY2UKICAgICAgICAgKiBkdXJpbmcgYSBjaGFuZ2UgZGV0ZWN0aW9uIGFuZCBhZnRlciB0aGUgaW5wdXRzIGFyZSBzZXR0bGVkIChhZnRlciBjb250ZW50IGNoZWNrKS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NoZWNrU3RpY2t5U3RhdGVzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHN0aWNreUNoZWNrUmVkdWNlciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY2MKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYWNjLCBkKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gYWNjIHx8IGQuaGFzU3RpY2t5Q2hhbmdlZCgpOwogICAgICAgICAgICB9KTsKICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBjaGVjayBuZWVkcyB0byBvY2N1ciBmb3IgZXZlcnkgZGVmaW5pdGlvbiBzaW5jZSBpdCBub3RpZmllcyB0aGUgZGVmaW5pdGlvbgogICAgICAgICAgICAvLyB0aGF0IGl0IGNhbiByZXNldCBpdHMgZGlydHkgc3RhdGUuIFVzaW5nIGFub3RoZXIgb3BlcmF0b3IgbGlrZSBgc29tZWAgbWF5IHNob3J0LWNpcmN1aXQKICAgICAgICAgICAgLy8gcmVtYWluaW5nIGRlZmluaXRpb25zIGFuZCBsZWF2ZSB0aGVtIGluIGFuIHVuY2hlY2tlZCBzdGF0ZS4KICAgICAgICAgICAgaWYgKHRoaXMuX2hlYWRlclJvd0RlZnMucmVkdWNlKHN0aWNreUNoZWNrUmVkdWNlciwgZmFsc2UpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVN0aWNreUhlYWRlclJvd1N0eWxlcygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9mb290ZXJSb3dEZWZzLnJlZHVjZShzdGlja3lDaGVja1JlZHVjZXIsIGZhbHNlKSkgewogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTdGlja3lGb290ZXJSb3dTdHlsZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoQXJyYXkuZnJvbSh0aGlzLl9jb2x1bW5EZWZzQnlOYW1lLnZhbHVlcygpKS5yZWR1Y2Uoc3RpY2t5Q2hlY2tSZWR1Y2VyLCBmYWxzZSkpIHsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ3JlYXRlcyB0aGUgc3RpY2t5IHN0eWxlciB0aGF0IHdpbGwgYmUgdXNlZCBmb3Igc3RpY2t5IHJvd3MgYW5kIGNvbHVtbnMuIExpc3RlbnMKICAgICAgICAgKiBmb3IgZGlyZWN0aW9uYWxpdHkgY2hhbmdlcyBhbmQgcHJvdmlkZXMgdGhlIGxhdGVzdCBkaXJlY3Rpb24gdG8gdGhlIHN0eWxlci4gUmUtYXBwbGllcyBjb2x1bW4KICAgICAgICAgKiBzdGlja2luZXNzIHdoZW4gZGlyZWN0aW9uYWxpdHkgY2hhbmdlcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldHVwU3RpY2t5U3R5bGVyKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRpcmVjdGlvbiA9IHRoaXMuX2RpciA/IHRoaXMuX2Rpci52YWx1ZSA6ICdsdHInOwogICAgICAgICAgICB0aGlzLl9zdGlja3lTdHlsZXIgPSBuZXcgU3RpY2t5U3R5bGVyKHRoaXMuX2lzTmF0aXZlSHRtbFRhYmxlLCB0aGlzLnN0aWNreUNzc0NsYXNzLCBkaXJlY3Rpb24sIHRoaXMuX3BsYXRmb3JtLmlzQnJvd3Nlcik7CiAgICAgICAgICAgICh0aGlzLl9kaXIgPyB0aGlzLl9kaXIuY2hhbmdlIDogb2YoKSkKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHZhbHVlID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX3N0aWNreVN0eWxlci5kaXJlY3Rpb24gPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU3RpY2t5Q29sdW1uU3R5bGVzKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRmlsdGVycyBkZWZpbml0aW9ucyB0aGF0IGJlbG9uZyB0byB0aGlzIHRhYmxlIGZyb20gYSBRdWVyeUxpc3QuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAdGVtcGxhdGUgSQogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPd25EZWZzKGl0ZW1zKSB7CiAgICAgICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGl0ZW0gPT4gIWl0ZW0uX3RhYmxlIHx8IGl0ZW0uX3RhYmxlID09PSB0aGlzKSk7CiAgICAgICAgfQogICAgfQogICAgQ2RrVGFibGUuybVmYWMgPSBmdW5jdGlvbiBDZGtUYWJsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtUYWJsZSkoybXJtWRpcmVjdGl2ZUluamVjdChJdGVyYWJsZURpZmZlcnMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWluamVjdEF0dHJpYnV0ZSgncm9sZScpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxKSwgybXJtWRpcmVjdGl2ZUluamVjdChQbGF0Zm9ybSkpOyB9OwogICAgQ2RrVGFibGUuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2RrVGFibGUsIHNlbGVjdG9yczogW1siY2RrLXRhYmxlIl0sIFsidGFibGUiLCAiY2RrLXRhYmxlIiwgIiJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIENka1RhYmxlX0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgQ2RrQ29sdW1uRGVmLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgQ2RrUm93RGVmLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgQ2RrSGVhZGVyUm93RGVmLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgQ2RrRm9vdGVyUm93RGVmLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9jb250ZW50Q29sdW1uRGVmcyA9IF90KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fY29udGVudFJvd0RlZnMgPSBfdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2NvbnRlbnRIZWFkZXJSb3dEZWZzID0gX3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9jb250ZW50Rm9vdGVyUm93RGVmcyA9IF90KTsKICAgICAgICB9IH0sIHZpZXdRdWVyeTogZnVuY3Rpb24gQ2RrVGFibGVfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoRGF0YVJvd091dGxldCwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoSGVhZGVyUm93T3V0bGV0LCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShGb290ZXJSb3dPdXRsZXQsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX3Jvd091dGxldCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faGVhZGVyUm93T3V0bGV0ID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Ll9mb290ZXJSb3dPdXRsZXQgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsxLCAiY2RrLXRhYmxlIl0sIGlucHV0czogeyB0cmFja0J5OiAidHJhY2tCeSIsIGRhdGFTb3VyY2U6ICJkYXRhU291cmNlIiwgbXVsdGlUZW1wbGF0ZURhdGFSb3dzOiAibXVsdGlUZW1wbGF0ZURhdGFSb3dzIiB9LCBleHBvcnRBczogWyJjZGtUYWJsZSJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IENES19UQUJMRSwgdXNlRXhpc3Rpbmc6IENka1RhYmxlIH1dKV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJGQsIGRlY2xzOiA0LCB2YXJzOiAwLCBjb25zdHM6IFtbImhlYWRlclJvd091dGxldCIsICIiXSwgWyJyb3dPdXRsZXQiLCAiIl0sIFsiZm9vdGVyUm93T3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIENka1RhYmxlX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZihfYzAkbSk7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigxLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDMsIDIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0hlYWRlclJvd091dGxldCwKICAgICAgICAgICAgRGF0YVJvd091dGxldCwKICAgICAgICAgICAgRm9vdGVyUm93T3V0bGV0XSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQ2RrVGFibGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBJdGVyYWJsZURpZmZlcnMgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEF0dHJpYnV0ZSwgYXJnczogWydyb2xlJyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBEaXJlY3Rpb25hbGl0eSwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiBQbGF0Zm9ybSB9CiAgICBdOwogICAgQ2RrVGFibGUucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdHJhY2tCeTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGF0YVNvdXJjZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbXVsdGlUZW1wbGF0ZURhdGFSb3dzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBfcm93T3V0bGV0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtEYXRhUm93T3V0bGV0LCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgX2hlYWRlclJvd091dGxldDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbSGVhZGVyUm93T3V0bGV0LCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgX2Zvb3RlclJvd091dGxldDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbRm9vdGVyUm93T3V0bGV0LCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgX2NvbnRlbnRDb2x1bW5EZWZzOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtDZGtDb2x1bW5EZWYsIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dLAogICAgICAgIF9jb250ZW50Um93RGVmczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbQ2RrUm93RGVmLCB7IGRlc2NlbmRhbnRzOiB0cnVlIH0sXSB9XSwKICAgICAgICBfY29udGVudEhlYWRlclJvd0RlZnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0Nka0hlYWRlclJvd0RlZiwgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50czogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sXSB9XSwKICAgICAgICBfY29udGVudEZvb3RlclJvd0RlZnM6IFt7IHR5cGU6IENvbnRlbnRDaGlsZHJlbiwgYXJnczogW0Nka0Zvb3RlclJvd0RlZiwgewogICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50czogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sXSB9XQogICAgfTsKICAgIC8qKgogICAgICogVXRpbGl0eSBmdW5jdGlvbiB0aGF0IGdldHMgYSBtZXJnZWQgbGlzdCBvZiB0aGUgZW50cmllcyBpbiBhbiBhcnJheSBhbmQgdmFsdWVzIG9mIGEgU2V0LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqIEBwYXJhbSB7P30gYXJyYXkKICAgICAqIEBwYXJhbSB7P30gc2V0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtZXJnZUFycmF5QW5kU2V0KGFycmF5LCBzZXQpIHsKICAgICAgICByZXR1cm4gYXJyYXkuY29uY2F0KEFycmF5LmZyb20oc2V0KSk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvY2RrL3RhYmxlL3RleHQtY29sdW1uLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQ29sdW1uIHRoYXQgc2ltcGx5IHNob3dzIHRleHQgY29udGVudCBmb3IgdGhlIGhlYWRlciBhbmQgcm93IGNlbGxzLiBBc3N1bWVzIHRoYXQgdGhlIHRhYmxlCiAgICAgKiBpcyB1c2luZyB0aGUgbmF0aXZlIHRhYmxlIGltcGxlbWVudGF0aW9uIChgPHRhYmxlPmApLgogICAgICoKICAgICAqIEJ5IGRlZmF1bHQsIHRoZSBuYW1lIG9mIHRoaXMgY29sdW1uIHdpbGwgYmUgdGhlIGhlYWRlciB0ZXh0IGFuZCBkYXRhIHByb3BlcnR5IGFjY2Vzc29yLgogICAgICogVGhlIGhlYWRlciB0ZXh0IGNhbiBiZSBvdmVycmlkZGVuIHdpdGggdGhlIGBoZWFkZXJUZXh0YCBpbnB1dC4gQ2VsbCB2YWx1ZXMgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aAogICAgICogdGhlIGBkYXRhQWNjZXNzb3JgIGlucHV0LiBDaGFuZ2UgdGhlIHRleHQganVzdGlmaWNhdGlvbiB0byB0aGUgc3RhcnQgb3IgZW5kIHVzaW5nIHRoZSBganVzdGlmeWAKICAgICAqIGlucHV0LgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgQ2RrVGV4dENvbHVtbiB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfdGFibGUKICAgICAgICAgKiBAcGFyYW0gez99IF9vcHRpb25zCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3RhYmxlLCBfb3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl90YWJsZSA9IF90YWJsZTsKICAgICAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQWxpZ25tZW50IG9mIHRoZSBjZWxsIHZhbHVlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuanVzdGlmeSA9ICdzdGFydCc7CiAgICAgICAgICAgIHRoaXMuX29wdGlvbnMgPSBfb3B0aW9ucyB8fCB7fTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29sdW1uIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byByZWZlcmVuY2UgdGhpcyBjb2x1bW4uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmFtZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX25hbWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG5hbWUobmFtZSkgewogICAgICAgICAgICB0aGlzLl9uYW1lID0gbmFtZTsKICAgICAgICAgICAgLy8gV2l0aCBJdnksIGlucHV0cyBjYW4gYmUgaW5pdGlhbGl6ZWQgYmVmb3JlIHN0YXRpYyBxdWVyeSByZXN1bHRzIGFyZQogICAgICAgICAgICAvLyBhdmFpbGFibGUuIEluIHRoYXQgY2FzZSwgd2UgZGVmZXIgdGhlIHN5bmNocm9uaXphdGlvbiB1bnRpbCAibmdPbkluaXQiIGZpcmVzLgogICAgICAgICAgICB0aGlzLl9zeW5jQ29sdW1uRGVmTmFtZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLl9zeW5jQ29sdW1uRGVmTmFtZSgpOwogICAgICAgICAgICBpZiAodGhpcy5oZWFkZXJUZXh0ID09PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuaGVhZGVyVGV4dCA9IHRoaXMuX2NyZWF0ZURlZmF1bHRIZWFkZXJUZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKCF0aGlzLmRhdGFBY2Nlc3NvcikgewogICAgICAgICAgICAgICAgdGhpcy5kYXRhQWNjZXNzb3IgPQogICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMuZGVmYXVsdERhdGFBY2Nlc3NvciB8fCAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbmFtZQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKGRhdGEsIG5hbWUpID0+ICgoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YSkpKVtuYW1lXSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl90YWJsZSkgewogICAgICAgICAgICAgICAgLy8gUHJvdmlkZSB0aGUgY2VsbCBhbmQgaGVhZGVyQ2VsbCBkaXJlY3RseSB0byB0aGUgdGFibGUgd2l0aCB0aGUgc3RhdGljIGBWaWV3Q2hpbGRgIHF1ZXJ5LAogICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGNvbHVtbkRlZiB3aWxsIG5vdCBwaWNrIHVwIGl0cyBjb250ZW50IGJ5IHRoZSB0aW1lIHRoZSB0YWJsZSBmaW5pc2hlcyBjaGVja2luZwogICAgICAgICAgICAgICAgLy8gaXRzIGNvbnRlbnQgYW5kIGluaXRpYWxpemluZyB0aGUgcm93cy4KICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmLmNlbGwgPSB0aGlzLmNlbGw7CiAgICAgICAgICAgICAgICB0aGlzLmNvbHVtbkRlZi5oZWFkZXJDZWxsID0gdGhpcy5oZWFkZXJDZWxsOwogICAgICAgICAgICAgICAgdGhpcy5fdGFibGUuYWRkQ29sdW1uRGVmKHRoaXMuY29sdW1uRGVmKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRocm93IGdldFRhYmxlVGV4dENvbHVtbk1pc3NpbmdQYXJlbnRUYWJsZUVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3RhYmxlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl90YWJsZS5yZW1vdmVDb2x1bW5EZWYodGhpcy5jb2x1bW5EZWYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENyZWF0ZXMgYSBkZWZhdWx0IGhlYWRlciB0ZXh0LiBVc2UgdGhlIG9wdGlvbnMnIGhlYWRlciB0ZXh0IHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9uIGlmIG9uZQogICAgICAgICAqIGhhcyBiZWVuIHByb3ZpZGVkLiBPdGhlcndpc2Ugc2ltcGx5IGNhcGl0YWxpemUgdGhlIGNvbHVtbiBuYW1lLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NyZWF0ZURlZmF1bHRIZWFkZXJUZXh0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5hbWUgPSB0aGlzLm5hbWU7CiAgICAgICAgICAgIGlmIChpc0Rldk1vZGUoKSAmJiAhbmFtZSkgewogICAgICAgICAgICAgICAgdGhyb3cgZ2V0VGFibGVUZXh0Q29sdW1uTWlzc2luZ05hbWVFcnJvcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMuZGVmYXVsdEhlYWRlclRleHRUcmFuc2Zvcm0pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vcHRpb25zLmRlZmF1bHRIZWFkZXJUZXh0VHJhbnNmb3JtKG5hbWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBuYW1lWzBdLnRvVXBwZXJDYXNlKCkgKyBuYW1lLnNsaWNlKDEpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTeW5jaHJvbml6ZXMgdGhlIGNvbHVtbiBkZWZpbml0aW9uIG5hbWUgd2l0aCB0aGUgdGV4dCBjb2x1bW4gbmFtZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N5bmNDb2x1bW5EZWZOYW1lKCkgewogICAgICAgICAgICBpZiAodGhpcy5jb2x1bW5EZWYpIHsKICAgICAgICAgICAgICAgIHRoaXMuY29sdW1uRGVmLm5hbWUgPSB0aGlzLm5hbWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBDZGtUZXh0Q29sdW1uLsm1ZmFjID0gZnVuY3Rpb24gQ2RrVGV4dENvbHVtbl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDZGtUZXh0Q29sdW1uKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENka1RhYmxlLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChURVhUX0NPTFVNTl9PUFRJT05TLCA4KSk7IH07CiAgICBDZGtUZXh0Q29sdW1uLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IENka1RleHRDb2x1bW4sIHNlbGVjdG9yczogW1siY2RrLXRleHQtY29sdW1uIl1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIENka1RleHRDb2x1bW5fUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoQ2RrQ29sdW1uRGVmLCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShDZGtDZWxsRGVmLCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShDZGtIZWFkZXJDZWxsRGVmLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmNvbHVtbkRlZiA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5jZWxsID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmhlYWRlckNlbGwgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsganVzdGlmeTogImp1c3RpZnkiLCBuYW1lOiAibmFtZSIsIGhlYWRlclRleHQ6ICJoZWFkZXJUZXh0IiwgZGF0YUFjY2Vzc29yOiAiZGF0YUFjY2Vzc29yIiB9LCBkZWNsczogMywgdmFyczogMCwgY29uc3RzOiBbWyJjZGtDb2x1bW5EZWYiLCAiIl0sIFsiY2RrLWhlYWRlci1jZWxsIiwgIiIsIDMsICJ0ZXh0LWFsaWduIiwgNCwgImNka0hlYWRlckNlbGxEZWYiXSwgWyJjZGstY2VsbCIsICIiLCAzLCAidGV4dC1hbGlnbiIsIDQsICJjZGtDZWxsRGVmIl0sIFsiY2RrLWhlYWRlci1jZWxsIiwgIiJdLCBbImNkay1jZWxsIiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIENka1RleHRDb2x1bW5fVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCwgMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBDZGtUZXh0Q29sdW1uX3RoXzFfVGVtcGxhdGUsIDIsIDMsICJ0aCIsIDEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMiwgQ2RrVGV4dENvbHVtbl90ZF8yX1RlbXBsYXRlLCAyLCAzLCAidGQiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtDZGtDb2x1bW5EZWYsCiAgICAgICAgICAgIENka0hlYWRlckNlbGxEZWYsCiAgICAgICAgICAgIENka0NlbGxEZWYsCiAgICAgICAgICAgIENka0hlYWRlckNlbGwsCiAgICAgICAgICAgIENka0NlbGxdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDZGtUZXh0Q29sdW1uLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogQ2RrVGFibGUsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbVEVYVF9DT0xVTU5fT1BUSU9OUyxdIH1dIH0KICAgIF07CiAgICBDZGtUZXh0Q29sdW1uLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGhlYWRlclRleHQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRhdGFBY2Nlc3NvcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAganVzdGlmeTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY29sdW1uRGVmOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtDZGtDb2x1bW5EZWYsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgICAgICBjZWxsOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtDZGtDZWxsRGVmLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgaGVhZGVyQ2VsbDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbQ2RrSGVhZGVyQ2VsbERlZiwgeyBzdGF0aWM6IHRydWUgfSxdIH1dCiAgICB9OwogICAgY2xhc3MgQ2RrVGFibGVNb2R1bGUgewogICAgfQogICAgQ2RrVGFibGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBDZGtUYWJsZU1vZHVsZSB9KTsKICAgIENka1RhYmxlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQ2RrVGFibGVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2RrVGFibGVNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShDZGtUYWJsZU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtDZGtUYWJsZSwKICAgICAgICAgICAgQ2RrUm93RGVmLAogICAgICAgICAgICBDZGtDZWxsRGVmLAogICAgICAgICAgICBDZGtDZWxsT3V0bGV0LAogICAgICAgICAgICBDZGtIZWFkZXJDZWxsRGVmLAogICAgICAgICAgICBDZGtGb290ZXJDZWxsRGVmLAogICAgICAgICAgICBDZGtDb2x1bW5EZWYsCiAgICAgICAgICAgIENka0NlbGwsCiAgICAgICAgICAgIENka1JvdywKICAgICAgICAgICAgQ2RrSGVhZGVyQ2VsbCwKICAgICAgICAgICAgQ2RrRm9vdGVyQ2VsbCwKICAgICAgICAgICAgQ2RrSGVhZGVyUm93LAogICAgICAgICAgICBDZGtIZWFkZXJSb3dEZWYsCiAgICAgICAgICAgIENka0Zvb3RlclJvdywKICAgICAgICAgICAgQ2RrRm9vdGVyUm93RGVmLAogICAgICAgICAgICBEYXRhUm93T3V0bGV0LAogICAgICAgICAgICBIZWFkZXJSb3dPdXRsZXQsCiAgICAgICAgICAgIEZvb3RlclJvd091dGxldCwKICAgICAgICAgICAgQ2RrVGV4dENvbHVtbl0sIGV4cG9ydHM6IFtDZGtUYWJsZSwKICAgICAgICAgICAgQ2RrUm93RGVmLAogICAgICAgICAgICBDZGtDZWxsRGVmLAogICAgICAgICAgICBDZGtDZWxsT3V0bGV0LAogICAgICAgICAgICBDZGtIZWFkZXJDZWxsRGVmLAogICAgICAgICAgICBDZGtGb290ZXJDZWxsRGVmLAogICAgICAgICAgICBDZGtDb2x1bW5EZWYsCiAgICAgICAgICAgIENka0NlbGwsCiAgICAgICAgICAgIENka1JvdywKICAgICAgICAgICAgQ2RrSGVhZGVyQ2VsbCwKICAgICAgICAgICAgQ2RrRm9vdGVyQ2VsbCwKICAgICAgICAgICAgQ2RrSGVhZGVyUm93LAogICAgICAgICAgICBDZGtIZWFkZXJSb3dEZWYsCiAgICAgICAgICAgIENka0Zvb3RlclJvdywKICAgICAgICAgICAgQ2RrRm9vdGVyUm93RGVmLAogICAgICAgICAgICBEYXRhUm93T3V0bGV0LAogICAgICAgICAgICBIZWFkZXJSb3dPdXRsZXQsCiAgICAgICAgICAgIEZvb3RlclJvd091dGxldCwKICAgICAgICAgICAgQ2RrVGV4dENvbHVtbl0gfSk7IH0pKCk7CgogICAgY29uc3QgX2MwJG4gPSBbW1siY2FwdGlvbiJdXV07CiAgICBjb25zdCBfYzEkZSA9IFsiY2FwdGlvbiJdOwogICAgZnVuY3Rpb24gTWF0VGV4dENvbHVtbl90aF8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRoIiwgMyk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVzdHlsZVByb3AoInRleHQtYWxpZ24iLCBjdHhfcjAuanVzdGlmeSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHhfcjAuaGVhZGVyVGV4dCwgIiAiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gTWF0VGV4dENvbHVtbl90ZF8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRkIiwgNCk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGRhdGFfcjIgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVzdHlsZVByb3AoInRleHQtYWxpZ24iLCBjdHhfcjEuanVzdGlmeSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHhfcjEuZGF0YUFjY2Vzc29yKGRhdGFfcjIsIGN0eF9yMS5uYW1lKSwgIiAiKTsKICAgIH0gfQogICAgY2xhc3MgTWF0VGFibGUgZXh0ZW5kcyBDZGtUYWJsZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBPdmVycmlkZXMgdGhlIHN0aWNreSBDU1MgY2xhc3Mgc2V0IGJ5IHRoZSBgQ2RrVGFibGVgLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5zdGlja3lDc3NDbGFzcyA9ICdtYXQtdGFibGUtc3RpY2t5JzsKICAgICAgICB9CiAgICB9CiAgICBNYXRUYWJsZS7JtWZhYyA9IGZ1bmN0aW9uIE1hdFRhYmxlX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRUYWJsZV9CYXNlRmFjdG9yeSh0IHx8IE1hdFRhYmxlKTsgfTsKICAgIE1hdFRhYmxlLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFRhYmxlLCBzZWxlY3RvcnM6IFtbIm1hdC10YWJsZSJdLCBbInRhYmxlIiwgIm1hdC10YWJsZSIsICIiXV0sIGhvc3RBdHRyczogWzEsICJtYXQtdGFibGUiXSwgZXhwb3J0QXM6IFsibWF0VGFibGUiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IENka1RhYmxlLCB1c2VFeGlzdGluZzogTWF0VGFibGUgfSwKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogQ0RLX1RBQkxFLCB1c2VFeGlzdGluZzogTWF0VGFibGUgfQogICAgICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJGUsIGRlY2xzOiA0LCB2YXJzOiAwLCBjb25zdHM6IFtbImhlYWRlclJvd091dGxldCIsICIiXSwgWyJyb3dPdXRsZXQiLCAiIl0sIFsiZm9vdGVyUm93T3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRhYmxlX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZihfYzAkbik7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uKDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigxLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyKDMsIDIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0hlYWRlclJvd091dGxldCwgRGF0YVJvd091dGxldCwgRm9vdGVyUm93T3V0bGV0XSwgc3R5bGVzOiBbIm1hdC10YWJsZXtkaXNwbGF5OmJsb2NrfW1hdC1oZWFkZXItcm93e21pbi1oZWlnaHQ6NTZweH1tYXQtcm93LG1hdC1mb290ZXItcm93e21pbi1oZWlnaHQ6NDhweH1tYXQtcm93LG1hdC1oZWFkZXItcm93LG1hdC1mb290ZXItcm93e2Rpc3BsYXk6ZmxleDtib3JkZXItd2lkdGg6MDtib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItc3R5bGU6c29saWQ7YWxpZ24taXRlbXM6Y2VudGVyO2JveC1zaXppbmc6Ym9yZGVyLWJveH1tYXQtcm93OjphZnRlcixtYXQtaGVhZGVyLXJvdzo6YWZ0ZXIsbWF0LWZvb3Rlci1yb3c6OmFmdGVye2Rpc3BsYXk6aW5saW5lLWJsb2NrO21pbi1oZWlnaHQ6aW5oZXJpdDtjb250ZW50OlwiXCJ9bWF0LWNlbGw6Zmlyc3Qtb2YtdHlwZSxtYXQtaGVhZGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZSxtYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MjRweH1bZGlyPXJ0bF0gbWF0LWNlbGw6Zmlyc3Qtb2YtdHlwZSxbZGlyPXJ0bF0gbWF0LWhlYWRlci1jZWxsOmZpcnN0LW9mLXR5cGUsW2Rpcj1ydGxdIG1hdC1mb290ZXItY2VsbDpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDowO3BhZGRpbmctcmlnaHQ6MjRweH1tYXQtY2VsbDpsYXN0LW9mLXR5cGUsbWF0LWhlYWRlci1jZWxsOmxhc3Qtb2YtdHlwZSxtYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MjRweH1bZGlyPXJ0bF0gbWF0LWNlbGw6bGFzdC1vZi10eXBlLFtkaXI9cnRsXSBtYXQtaGVhZGVyLWNlbGw6bGFzdC1vZi10eXBlLFtkaXI9cnRsXSBtYXQtZm9vdGVyLWNlbGw6bGFzdC1vZi10eXBle3BhZGRpbmctcmlnaHQ6MDtwYWRkaW5nLWxlZnQ6MjRweH1tYXQtY2VsbCxtYXQtaGVhZGVyLWNlbGwsbWF0LWZvb3Rlci1jZWxse2ZsZXg6MTtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO292ZXJmbG93OmhpZGRlbjt3b3JkLXdyYXA6YnJlYWstd29yZDttaW4taGVpZ2h0OmluaGVyaXR9dGFibGUubWF0LXRhYmxle2JvcmRlci1zcGFjaW5nOjB9dHIubWF0LWhlYWRlci1yb3d7aGVpZ2h0OjU2cHh9dHIubWF0LXJvdyx0ci5tYXQtZm9vdGVyLXJvd3toZWlnaHQ6NDhweH10aC5tYXQtaGVhZGVyLWNlbGx7dGV4dC1hbGlnbjpsZWZ0fVtkaXI9cnRsXSB0aC5tYXQtaGVhZGVyLWNlbGx7dGV4dC1hbGlnbjpyaWdodH10aC5tYXQtaGVhZGVyLWNlbGwsdGQubWF0LWNlbGwsdGQubWF0LWZvb3Rlci1jZWxse3BhZGRpbmc6MDtib3JkZXItYm90dG9tLXdpZHRoOjFweDtib3JkZXItYm90dG9tLXN0eWxlOnNvbGlkfXRoLm1hdC1oZWFkZXItY2VsbDpmaXJzdC1vZi10eXBlLHRkLm1hdC1jZWxsOmZpcnN0LW9mLXR5cGUsdGQubWF0LWZvb3Rlci1jZWxsOmZpcnN0LW9mLXR5cGV7cGFkZGluZy1sZWZ0OjI0cHh9W2Rpcj1ydGxdIHRoLm1hdC1oZWFkZXItY2VsbDpmaXJzdC1vZi10eXBlLFtkaXI9cnRsXSB0ZC5tYXQtY2VsbDpmaXJzdC1vZi10eXBlLFtkaXI9cnRsXSB0ZC5tYXQtZm9vdGVyLWNlbGw6Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLWxlZnQ6MDtwYWRkaW5nLXJpZ2h0OjI0cHh9dGgubWF0LWhlYWRlci1jZWxsOmxhc3Qtb2YtdHlwZSx0ZC5tYXQtY2VsbDpsYXN0LW9mLXR5cGUsdGQubWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjI0cHh9W2Rpcj1ydGxdIHRoLm1hdC1oZWFkZXItY2VsbDpsYXN0LW9mLXR5cGUsW2Rpcj1ydGxdIHRkLm1hdC1jZWxsOmxhc3Qtb2YtdHlwZSxbZGlyPXJ0bF0gdGQubWF0LWZvb3Rlci1jZWxsOmxhc3Qtb2YtdHlwZXtwYWRkaW5nLXJpZ2h0OjA7cGFkZGluZy1sZWZ0OjI0cHh9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKICAgIGNvbnN0IMm1TWF0VGFibGVfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRUYWJsZSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFibGUvY2VsbC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIENlbGwgZGVmaW5pdGlvbiBmb3IgdGhlIG1hdC10YWJsZS4KICAgICAqIENhcHR1cmVzIHRoZSB0ZW1wbGF0ZSBvZiBhIGNvbHVtbidzIGRhdGEgcm93IGNlbGwgYXMgd2VsbCBhcyBjZWxsLXNwZWNpZmljIHByb3BlcnRpZXMuCiAgICAgKi8KICAgIGNsYXNzIE1hdENlbGxEZWYgZXh0ZW5kcyBDZGtDZWxsRGVmIHsKICAgIH0KICAgIE1hdENlbGxEZWYuybVmYWMgPSBmdW5jdGlvbiBNYXRDZWxsRGVmX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRDZWxsRGVmX0Jhc2VGYWN0b3J5KHQgfHwgTWF0Q2VsbERlZik7IH07CiAgICBNYXRDZWxsRGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdENlbGxEZWYsIHNlbGVjdG9yczogW1siIiwgIm1hdENlbGxEZWYiLCAiIl1dLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IENka0NlbGxEZWYsIHVzZUV4aXN0aW5nOiBNYXRDZWxsRGVmIH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICBjb25zdCDJtU1hdENlbGxEZWZfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRDZWxsRGVmKTsKICAgIC8qKgogICAgICogSGVhZGVyIGNlbGwgZGVmaW5pdGlvbiBmb3IgdGhlIG1hdC10YWJsZS4KICAgICAqIENhcHR1cmVzIHRoZSB0ZW1wbGF0ZSBvZiBhIGNvbHVtbidzIGhlYWRlciBjZWxsIGFuZCBhcyB3ZWxsIGFzIGNlbGwtc3BlY2lmaWMgcHJvcGVydGllcy4KICAgICAqLwogICAgY2xhc3MgTWF0SGVhZGVyQ2VsbERlZiBleHRlbmRzIENka0hlYWRlckNlbGxEZWYgewogICAgfQogICAgTWF0SGVhZGVyQ2VsbERlZi7JtWZhYyA9IGZ1bmN0aW9uIE1hdEhlYWRlckNlbGxEZWZfRmFjdG9yeSh0KSB7IHJldHVybiDJtU1hdEhlYWRlckNlbGxEZWZfQmFzZUZhY3RvcnkodCB8fCBNYXRIZWFkZXJDZWxsRGVmKTsgfTsKICAgIE1hdEhlYWRlckNlbGxEZWYuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0SGVhZGVyQ2VsbERlZiwgc2VsZWN0b3JzOiBbWyIiLCAibWF0SGVhZGVyQ2VsbERlZiIsICIiXV0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sgcHJvdmlkZTogQ2RrSGVhZGVyQ2VsbERlZiwgdXNlRXhpc3Rpbmc6IE1hdEhlYWRlckNlbGxEZWYgfV0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIGNvbnN0IMm1TWF0SGVhZGVyQ2VsbERlZl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdEhlYWRlckNlbGxEZWYpOwogICAgLyoqCiAgICAgKiBGb290ZXIgY2VsbCBkZWZpbml0aW9uIGZvciB0aGUgbWF0LXRhYmxlLgogICAgICogQ2FwdHVyZXMgdGhlIHRlbXBsYXRlIG9mIGEgY29sdW1uJ3MgZm9vdGVyIGNlbGwgYW5kIGFzIHdlbGwgYXMgY2VsbC1zcGVjaWZpYyBwcm9wZXJ0aWVzLgogICAgICovCiAgICBjbGFzcyBNYXRGb290ZXJDZWxsRGVmIGV4dGVuZHMgQ2RrRm9vdGVyQ2VsbERlZiB7CiAgICB9CiAgICBNYXRGb290ZXJDZWxsRGVmLsm1ZmFjID0gZnVuY3Rpb24gTWF0Rm9vdGVyQ2VsbERlZl9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0Rm9vdGVyQ2VsbERlZl9CYXNlRmFjdG9yeSh0IHx8IE1hdEZvb3RlckNlbGxEZWYpOyB9OwogICAgTWF0Rm9vdGVyQ2VsbERlZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRGb290ZXJDZWxsRGVmLCBzZWxlY3RvcnM6IFtbIiIsICJtYXRGb290ZXJDZWxsRGVmIiwgIiJdXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbeyBwcm92aWRlOiBDZGtGb290ZXJDZWxsRGVmLCB1c2VFeGlzdGluZzogTWF0Rm9vdGVyQ2VsbERlZiB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgY29uc3QgybVNYXRGb290ZXJDZWxsRGVmX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0Rm9vdGVyQ2VsbERlZik7CiAgICAvKioKICAgICAqIENvbHVtbiBkZWZpbml0aW9uIGZvciB0aGUgbWF0LXRhYmxlLgogICAgICogRGVmaW5lcyBhIHNldCBvZiBjZWxscyBhdmFpbGFibGUgZm9yIGEgdGFibGUgY29sdW1uLgogICAgICovCiAgICBjbGFzcyBNYXRDb2x1bW5EZWYgZXh0ZW5kcyBDZGtDb2x1bW5EZWYgewogICAgfQogICAgTWF0Q29sdW1uRGVmLsm1ZmFjID0gZnVuY3Rpb24gTWF0Q29sdW1uRGVmX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRDb2x1bW5EZWZfQmFzZUZhY3RvcnkodCB8fCBNYXRDb2x1bW5EZWYpOyB9OwogICAgTWF0Q29sdW1uRGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdENvbHVtbkRlZiwgc2VsZWN0b3JzOiBbWyIiLCAibWF0Q29sdW1uRGVmIiwgIiJdXSwgaW5wdXRzOiB7IHN0aWNreTogInN0aWNreSIsIG5hbWU6IFsibWF0Q29sdW1uRGVmIiwgIm5hbWUiXSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFsKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogQ2RrQ29sdW1uRGVmLCB1c2VFeGlzdGluZzogTWF0Q29sdW1uRGVmIH0sCiAgICAgICAgICAgICAgICB7IHByb3ZpZGU6ICdNQVRfU09SVF9IRUFERVJfQ09MVU1OX0RFRicsIHVzZUV4aXN0aW5nOiBNYXRDb2x1bW5EZWYgfQogICAgICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICBNYXRDb2x1bW5EZWYucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmFtZTogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0Q29sdW1uRGVmJyxdIH1dCiAgICB9OwogICAgY29uc3QgybVNYXRDb2x1bW5EZWZfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRDb2x1bW5EZWYpOwogICAgLyoqCiAgICAgKiBIZWFkZXIgY2VsbCB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBhZGRzIHRoZSByaWdodCBjbGFzc2VzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBNYXRIZWFkZXJDZWxsIGV4dGVuZHMgQ2RrSGVhZGVyQ2VsbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb2x1bW5EZWYKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb2x1bW5EZWYsIGVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgc3VwZXIoY29sdW1uRGVmLCBlbGVtZW50UmVmKTsKICAgICAgICAgICAgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYG1hdC1jb2x1bW4tJHtjb2x1bW5EZWYuY3NzQ2xhc3NGcmllbmRseU5hbWV9YCk7CiAgICAgICAgfQogICAgfQogICAgTWF0SGVhZGVyQ2VsbC7JtWZhYyA9IGZ1bmN0aW9uIE1hdEhlYWRlckNlbGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0SGVhZGVyQ2VsbCkoybXJtWRpcmVjdGl2ZUluamVjdChDZGtDb2x1bW5EZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIE1hdEhlYWRlckNlbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0SGVhZGVyQ2VsbCwgc2VsZWN0b3JzOiBbWyJtYXQtaGVhZGVyLWNlbGwiXSwgWyJ0aCIsICJtYXQtaGVhZGVyLWNlbGwiLCAiIl1dLCBob3N0QXR0cnM6IFsicm9sZSIsICJjb2x1bW5oZWFkZXIiLCAxLCAibWF0LWhlYWRlci1jZWxsIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdEhlYWRlckNlbGwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDZGtDb2x1bW5EZWYgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogRm9vdGVyIGNlbGwgdGVtcGxhdGUgY29udGFpbmVyIHRoYXQgYWRkcyB0aGUgcmlnaHQgY2xhc3NlcyBhbmQgcm9sZS4KICAgICAqLwogICAgY2xhc3MgTWF0Rm9vdGVyQ2VsbCBleHRlbmRzIENka0Zvb3RlckNlbGwgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY29sdW1uRGVmCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoY29sdW1uRGVmLCBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHN1cGVyKGNvbHVtbkRlZiwgZWxlbWVudFJlZik7CiAgICAgICAgICAgIGVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5jbGFzc0xpc3QuYWRkKGBtYXQtY29sdW1uLSR7Y29sdW1uRGVmLmNzc0NsYXNzRnJpZW5kbHlOYW1lfWApOwogICAgICAgIH0KICAgIH0KICAgIE1hdEZvb3RlckNlbGwuybVmYWMgPSBmdW5jdGlvbiBNYXRGb290ZXJDZWxsX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEZvb3RlckNlbGwpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ2RrQ29sdW1uRGVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICBNYXRGb290ZXJDZWxsLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdEZvb3RlckNlbGwsIHNlbGVjdG9yczogW1sibWF0LWZvb3Rlci1jZWxsIl0sIFsidGQiLCAibWF0LWZvb3Rlci1jZWxsIiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAiZ3JpZGNlbGwiLCAxLCAibWF0LWZvb3Rlci1jZWxsIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdEZvb3RlckNlbGwuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDZGtDb2x1bW5EZWYgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIC8qKgogICAgICogQ2VsbCB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBhZGRzIHRoZSByaWdodCBjbGFzc2VzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBNYXRDZWxsIGV4dGVuZHMgQ2RrQ2VsbCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb2x1bW5EZWYKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnRSZWYKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihjb2x1bW5EZWYsIGVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgc3VwZXIoY29sdW1uRGVmLCBlbGVtZW50UmVmKTsKICAgICAgICAgICAgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmNsYXNzTGlzdC5hZGQoYG1hdC1jb2x1bW4tJHtjb2x1bW5EZWYuY3NzQ2xhc3NGcmllbmRseU5hbWV9YCk7CiAgICAgICAgfQogICAgfQogICAgTWF0Q2VsbC7JtWZhYyA9IGZ1bmN0aW9uIE1hdENlbGxfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0Q2VsbCkoybXJtWRpcmVjdGl2ZUluamVjdChDZGtDb2x1bW5EZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIE1hdENlbGwuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogTWF0Q2VsbCwgc2VsZWN0b3JzOiBbWyJtYXQtY2VsbCJdLCBbInRkIiwgIm1hdC1jZWxsIiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAiZ3JpZGNlbGwiLCAxLCAibWF0LWNlbGwiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0Q2VsbC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IENka0NvbHVtbkRlZiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3RhYmxlL3Jvdy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEhlYWRlciByb3cgZGVmaW5pdGlvbiBmb3IgdGhlIG1hdC10YWJsZS4KICAgICAqIENhcHR1cmVzIHRoZSBoZWFkZXIgcm93J3MgdGVtcGxhdGUgYW5kIG90aGVyIGhlYWRlciBwcm9wZXJ0aWVzIHN1Y2ggYXMgdGhlIGNvbHVtbnMgdG8gZGlzcGxheS4KICAgICAqLwogICAgY2xhc3MgTWF0SGVhZGVyUm93RGVmIGV4dGVuZHMgQ2RrSGVhZGVyUm93RGVmIHsKICAgIH0KICAgIE1hdEhlYWRlclJvd0RlZi7JtWZhYyA9IGZ1bmN0aW9uIE1hdEhlYWRlclJvd0RlZl9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0SGVhZGVyUm93RGVmX0Jhc2VGYWN0b3J5KHQgfHwgTWF0SGVhZGVyUm93RGVmKTsgfTsKICAgIE1hdEhlYWRlclJvd0RlZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRIZWFkZXJSb3dEZWYsIHNlbGVjdG9yczogW1siIiwgIm1hdEhlYWRlclJvd0RlZiIsICIiXV0sIGlucHV0czogeyBjb2x1bW5zOiBbIm1hdEhlYWRlclJvd0RlZiIsICJjb2x1bW5zIl0sIHN0aWNreTogWyJtYXRIZWFkZXJSb3dEZWZTdGlja3kiLCAic3RpY2t5Il0gfSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbeyBwcm92aWRlOiBDZGtIZWFkZXJSb3dEZWYsIHVzZUV4aXN0aW5nOiBNYXRIZWFkZXJSb3dEZWYgfV0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIGNvbnN0IMm1TWF0SGVhZGVyUm93RGVmX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0SGVhZGVyUm93RGVmKTsKICAgIC8qKgogICAgICogRm9vdGVyIHJvdyBkZWZpbml0aW9uIGZvciB0aGUgbWF0LXRhYmxlLgogICAgICogQ2FwdHVyZXMgdGhlIGZvb3RlciByb3cncyB0ZW1wbGF0ZSBhbmQgb3RoZXIgZm9vdGVyIHByb3BlcnRpZXMgc3VjaCBhcyB0aGUgY29sdW1ucyB0byBkaXNwbGF5LgogICAgICovCiAgICBjbGFzcyBNYXRGb290ZXJSb3dEZWYgZXh0ZW5kcyBDZGtGb290ZXJSb3dEZWYgewogICAgfQogICAgTWF0Rm9vdGVyUm93RGVmLsm1ZmFjID0gZnVuY3Rpb24gTWF0Rm9vdGVyUm93RGVmX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRGb290ZXJSb3dEZWZfQmFzZUZhY3RvcnkodCB8fCBNYXRGb290ZXJSb3dEZWYpOyB9OwogICAgTWF0Rm9vdGVyUm93RGVmLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdEZvb3RlclJvd0RlZiwgc2VsZWN0b3JzOiBbWyIiLCAibWF0Rm9vdGVyUm93RGVmIiwgIiJdXSwgaW5wdXRzOiB7IGNvbHVtbnM6IFsibWF0Rm9vdGVyUm93RGVmIiwgImNvbHVtbnMiXSwgc3RpY2t5OiBbIm1hdEZvb3RlclJvd0RlZlN0aWNreSIsICJzdGlja3kiXSB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IENka0Zvb3RlclJvd0RlZiwgdXNlRXhpc3Rpbmc6IE1hdEZvb3RlclJvd0RlZiB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdIH0pOwogICAgY29uc3QgybVNYXRGb290ZXJSb3dEZWZfQmFzZUZhY3RvcnkgPSDJtcm1Z2V0SW5oZXJpdGVkRmFjdG9yeShNYXRGb290ZXJSb3dEZWYpOwogICAgLyoqCiAgICAgKiBEYXRhIHJvdyBkZWZpbml0aW9uIGZvciB0aGUgbWF0LXRhYmxlLgogICAgICogQ2FwdHVyZXMgdGhlIGRhdGEgcm93J3MgdGVtcGxhdGUgYW5kIG90aGVyIHByb3BlcnRpZXMgc3VjaCBhcyB0aGUgY29sdW1ucyB0byBkaXNwbGF5IGFuZAogICAgICogYSB3aGVuIHByZWRpY2F0ZSB0aGF0IGRlc2NyaWJlcyB3aGVuIHRoaXMgcm93IHNob3VsZCBiZSB1c2VkLgogICAgICogQHRlbXBsYXRlIFQKICAgICAqLwogICAgY2xhc3MgTWF0Um93RGVmIGV4dGVuZHMgQ2RrUm93RGVmIHsKICAgIH0KICAgIE1hdFJvd0RlZi7JtWZhYyA9IGZ1bmN0aW9uIE1hdFJvd0RlZl9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1TWF0Um93RGVmX0Jhc2VGYWN0b3J5KHQgfHwgTWF0Um93RGVmKTsgfTsKICAgIE1hdFJvd0RlZi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRSb3dEZWYsIHNlbGVjdG9yczogW1siIiwgIm1hdFJvd0RlZiIsICIiXV0sIGlucHV0czogeyBjb2x1bW5zOiBbIm1hdFJvd0RlZkNvbHVtbnMiLCAiY29sdW1ucyJdLCB3aGVuOiBbIm1hdFJvd0RlZldoZW4iLCAid2hlbiJdIH0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sgcHJvdmlkZTogQ2RrUm93RGVmLCB1c2VFeGlzdGluZzogTWF0Um93RGVmIH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0gfSk7CiAgICBjb25zdCDJtU1hdFJvd0RlZl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdFJvd0RlZik7CiAgICAvKioKICAgICAqIEhlYWRlciB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBjb250YWlucyB0aGUgY2VsbCBvdXRsZXQuIEFkZHMgdGhlIHJpZ2h0IGNsYXNzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBNYXRIZWFkZXJSb3cgZXh0ZW5kcyBDZGtIZWFkZXJSb3cgewogICAgfQogICAgTWF0SGVhZGVyUm93Lsm1ZmFjID0gZnVuY3Rpb24gTWF0SGVhZGVyUm93X0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRIZWFkZXJSb3dfQmFzZUZhY3RvcnkodCB8fCBNYXRIZWFkZXJSb3cpOyB9OwogICAgTWF0SGVhZGVyUm93Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEhlYWRlclJvdywgc2VsZWN0b3JzOiBbWyJtYXQtaGVhZGVyLXJvdyJdLCBbInRyIiwgIm1hdC1oZWFkZXItcm93IiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAicm93IiwgMSwgIm1hdC1oZWFkZXItcm93Il0sIGV4cG9ydEFzOiBbIm1hdEhlYWRlclJvdyJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IENka0hlYWRlclJvdywgdXNlRXhpc3Rpbmc6IE1hdEhlYWRlclJvdyB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBkZWNsczogMSwgdmFyczogMCwgY29uc3RzOiBbWyJjZGtDZWxsT3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEhlYWRlclJvd19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMCwgMCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbQ2RrQ2VsbE91dGxldF0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CiAgICBjb25zdCDJtU1hdEhlYWRlclJvd19CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdEhlYWRlclJvdyk7CiAgICAvKioKICAgICAqIEZvb3RlciB0ZW1wbGF0ZSBjb250YWluZXIgdGhhdCBjb250YWlucyB0aGUgY2VsbCBvdXRsZXQuIEFkZHMgdGhlIHJpZ2h0IGNsYXNzIGFuZCByb2xlLgogICAgICovCiAgICBjbGFzcyBNYXRGb290ZXJSb3cgZXh0ZW5kcyBDZGtGb290ZXJSb3cgewogICAgfQogICAgTWF0Rm9vdGVyUm93Lsm1ZmFjID0gZnVuY3Rpb24gTWF0Rm9vdGVyUm93X0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRGb290ZXJSb3dfQmFzZUZhY3RvcnkodCB8fCBNYXRGb290ZXJSb3cpOyB9OwogICAgTWF0Rm9vdGVyUm93Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEZvb3RlclJvdywgc2VsZWN0b3JzOiBbWyJtYXQtZm9vdGVyLXJvdyJdLCBbInRyIiwgIm1hdC1mb290ZXItcm93IiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAicm93IiwgMSwgIm1hdC1mb290ZXItcm93Il0sIGV4cG9ydEFzOiBbIm1hdEZvb3RlclJvdyJdLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IENka0Zvb3RlclJvdywgdXNlRXhpc3Rpbmc6IE1hdEZvb3RlclJvdyB9XSksIMm1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBkZWNsczogMSwgdmFyczogMCwgY29uc3RzOiBbWyJjZGtDZWxsT3V0bGV0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEZvb3RlclJvd19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMCwgMCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbQ2RrQ2VsbE91dGxldF0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CiAgICBjb25zdCDJtU1hdEZvb3RlclJvd19CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdEZvb3RlclJvdyk7CiAgICAvKioKICAgICAqIERhdGEgcm93IHRlbXBsYXRlIGNvbnRhaW5lciB0aGF0IGNvbnRhaW5zIHRoZSBjZWxsIG91dGxldC4gQWRkcyB0aGUgcmlnaHQgY2xhc3MgYW5kIHJvbGUuCiAgICAgKi8KICAgIGNsYXNzIE1hdFJvdyBleHRlbmRzIENka1JvdyB7CiAgICB9CiAgICBNYXRSb3cuybVmYWMgPSBmdW5jdGlvbiBNYXRSb3dfRmFjdG9yeSh0KSB7IHJldHVybiDJtU1hdFJvd19CYXNlRmFjdG9yeSh0IHx8IE1hdFJvdyk7IH07CiAgICBNYXRSb3cuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0Um93LCBzZWxlY3RvcnM6IFtbIm1hdC1yb3ciXSwgWyJ0ciIsICJtYXQtcm93IiwgIiJdXSwgaG9zdEF0dHJzOiBbInJvbGUiLCAicm93IiwgMSwgIm1hdC1yb3ciXSwgZXhwb3J0QXM6IFsibWF0Um93Il0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sgcHJvdmlkZTogQ2RrUm93LCB1c2VFeGlzdGluZzogTWF0Um93IH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIGRlY2xzOiAxLCB2YXJzOiAwLCBjb25zdHM6IFtbImNka0NlbGxPdXRsZXQiLCAiIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWF0Um93X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigwLCAwKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtDZGtDZWxsT3V0bGV0XSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKICAgIGNvbnN0IMm1TWF0Um93X0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0Um93KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC90YWJsZS90ZXh0LWNvbHVtbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIENvbHVtbiB0aGF0IHNpbXBseSBzaG93cyB0ZXh0IGNvbnRlbnQgZm9yIHRoZSBoZWFkZXIgYW5kIHJvdyBjZWxscy4gQXNzdW1lcyB0aGF0IHRoZSB0YWJsZQogICAgICogaXMgdXNpbmcgdGhlIG5hdGl2ZSB0YWJsZSBpbXBsZW1lbnRhdGlvbiAoYDx0YWJsZT5gKS4KICAgICAqCiAgICAgKiBCeSBkZWZhdWx0LCB0aGUgbmFtZSBvZiB0aGlzIGNvbHVtbiB3aWxsIGJlIHRoZSBoZWFkZXIgdGV4dCBhbmQgZGF0YSBwcm9wZXJ0eSBhY2Nlc3Nvci4KICAgICAqIFRoZSBoZWFkZXIgdGV4dCBjYW4gYmUgb3ZlcnJpZGRlbiB3aXRoIHRoZSBgaGVhZGVyVGV4dGAgaW5wdXQuIENlbGwgdmFsdWVzIGNhbiBiZSBvdmVycmlkZGVuIHdpdGgKICAgICAqIHRoZSBgZGF0YUFjY2Vzc29yYCBpbnB1dC4gQ2hhbmdlIHRoZSB0ZXh0IGp1c3RpZmljYXRpb24gdG8gdGhlIHN0YXJ0IG9yIGVuZCB1c2luZyB0aGUgYGp1c3RpZnlgCiAgICAgKiBpbnB1dC4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIE1hdFRleHRDb2x1bW4gZXh0ZW5kcyBDZGtUZXh0Q29sdW1uIHsKICAgIH0KICAgIE1hdFRleHRDb2x1bW4uybVmYWMgPSBmdW5jdGlvbiBNYXRUZXh0Q29sdW1uX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRUZXh0Q29sdW1uX0Jhc2VGYWN0b3J5KHQgfHwgTWF0VGV4dENvbHVtbik7IH07CiAgICBNYXRUZXh0Q29sdW1uLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFRleHRDb2x1bW4sIHNlbGVjdG9yczogW1sibWF0LXRleHQtY29sdW1uIl1dLCBmZWF0dXJlczogW8m1ybVJbmhlcml0RGVmaW5pdGlvbkZlYXR1cmVdLCBkZWNsczogMywgdmFyczogMCwgY29uc3RzOiBbWyJtYXRDb2x1bW5EZWYiLCAiIl0sIFsibWF0LWhlYWRlci1jZWxsIiwgIiIsIDMsICJ0ZXh0LWFsaWduIiwgNCwgIm1hdEhlYWRlckNlbGxEZWYiXSwgWyJtYXQtY2VsbCIsICIiLCAzLCAidGV4dC1hbGlnbiIsIDQsICJtYXRDZWxsRGVmIl0sIFsibWF0LWhlYWRlci1jZWxsIiwgIiJdLCBbIm1hdC1jZWxsIiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFRleHRDb2x1bW5fVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCwgMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBNYXRUZXh0Q29sdW1uX3RoXzFfVGVtcGxhdGUsIDIsIDMsICJ0aCIsIDEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMiwgTWF0VGV4dENvbHVtbl90ZF8yX1RlbXBsYXRlLCAyLCAzLCAidGQiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRDb2x1bW5EZWYsCiAgICAgICAgICAgIE1hdEhlYWRlckNlbGxEZWYsCiAgICAgICAgICAgIE1hdENlbGxEZWYsCiAgICAgICAgICAgIE1hdEhlYWRlckNlbGwsCiAgICAgICAgICAgIE1hdENlbGxdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwogICAgY29uc3QgybVNYXRUZXh0Q29sdW1uX0Jhc2VGYWN0b3J5ID0gybXJtWdldEluaGVyaXRlZEZhY3RvcnkoTWF0VGV4dENvbHVtbik7CiAgICBjbGFzcyBNYXRUYWJsZU1vZHVsZSB7CiAgICB9CiAgICBNYXRUYWJsZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdFRhYmxlTW9kdWxlIH0pOwogICAgTWF0VGFibGVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYXRUYWJsZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRUYWJsZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENka1RhYmxlTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBdLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0VGFibGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0VGFibGUsCiAgICAgICAgICAgIE1hdEhlYWRlckNlbGxEZWYsCiAgICAgICAgICAgIE1hdEhlYWRlclJvd0RlZiwKICAgICAgICAgICAgTWF0Q29sdW1uRGVmLAogICAgICAgICAgICBNYXRDZWxsRGVmLAogICAgICAgICAgICBNYXRSb3dEZWYsCiAgICAgICAgICAgIE1hdEZvb3RlckNlbGxEZWYsCiAgICAgICAgICAgIE1hdEZvb3RlclJvd0RlZiwKICAgICAgICAgICAgTWF0SGVhZGVyQ2VsbCwKICAgICAgICAgICAgTWF0Q2VsbCwKICAgICAgICAgICAgTWF0Rm9vdGVyQ2VsbCwKICAgICAgICAgICAgTWF0SGVhZGVyUm93LAogICAgICAgICAgICBNYXRSb3csCiAgICAgICAgICAgIE1hdEZvb3RlclJvdywKICAgICAgICAgICAgTWF0VGV4dENvbHVtbl07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtUYWJsZU1vZHVsZSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW01hdENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWF0VGFibGUsCiAgICAgICAgICAgIE1hdEhlYWRlckNlbGxEZWYsCiAgICAgICAgICAgIE1hdEhlYWRlclJvd0RlZiwKICAgICAgICAgICAgTWF0Q29sdW1uRGVmLAogICAgICAgICAgICBNYXRDZWxsRGVmLAogICAgICAgICAgICBNYXRSb3dEZWYsCiAgICAgICAgICAgIE1hdEZvb3RlckNlbGxEZWYsCiAgICAgICAgICAgIE1hdEZvb3RlclJvd0RlZiwKICAgICAgICAgICAgTWF0SGVhZGVyQ2VsbCwKICAgICAgICAgICAgTWF0Q2VsbCwKICAgICAgICAgICAgTWF0Rm9vdGVyQ2VsbCwKICAgICAgICAgICAgTWF0SGVhZGVyUm93LAogICAgICAgICAgICBNYXRSb3csCiAgICAgICAgICAgIE1hdEZvb3RlclJvdywKICAgICAgICAgICAgTWF0VGV4dENvbHVtbl07IH0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvdGFibGUvdGFibGUtZGF0YS1zb3VyY2UudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBDb3JyZXNwb25kcyB0byBgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJgLiBNb3ZlZCBvdXQgaW50byBhIHZhcmlhYmxlIGhlcmUgZHVlIHRvCiAgICAgKiBmbGFreSBicm93c2VyIHN1cHBvcnQgYW5kIHRoZSB2YWx1ZSBub3QgYmVpbmcgZGVmaW5lZCBpbiBDbG9zdXJlJ3MgdHlwaW5ncy4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVhfU0FGRV9JTlRFR0VSID0gOTAwNzE5OTI1NDc0MDk5MTsKICAgIC8qKgogICAgICogRGF0YSBzb3VyY2UgdGhhdCBhY2NlcHRzIGEgY2xpZW50LXNpZGUgZGF0YSBhcnJheSBhbmQgaW5jbHVkZXMgbmF0aXZlIHN1cHBvcnQgb2YgZmlsdGVyaW5nLAogICAgICogc29ydGluZyAodXNpbmcgTWF0U29ydCksIGFuZCBwYWdpbmF0aW9uICh1c2luZyBNYXRQYWdpbmF0b3IpLgogICAgICoKICAgICAqIEFsbG93cyBmb3Igc29ydCBjdXN0b21pemF0aW9uIGJ5IG92ZXJyaWRpbmcgc29ydGluZ0RhdGFBY2Nlc3Nvciwgd2hpY2ggZGVmaW5lcyBob3cgZGF0YQogICAgICogcHJvcGVydGllcyBhcmUgYWNjZXNzZWQuIEFsc28gYWxsb3dzIGZvciBmaWx0ZXIgY3VzdG9taXphdGlvbiBieSBvdmVycmlkaW5nIGZpbHRlclRlcm1BY2Nlc3NvciwKICAgICAqIHdoaWNoIGRlZmluZXMgaG93IHJvdyBkYXRhIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBmb3IgZmlsdGVyIG1hdGNoaW5nLgogICAgICoKICAgICAqICoqTm90ZToqKiBUaGlzIGNsYXNzIGlzIG1lYW50IHRvIGJlIGEgc2ltcGxlIGRhdGEgc291cmNlIHRvIGhlbHAgeW91IGdldCBzdGFydGVkLiBBcyBzdWNoCiAgICAgKiBpdCBpc24ndCBlcXVpcHBlZCB0byBoYW5kbGUgc29tZSBtb3JlIGFkdmFuY2VkIGNhc2VzIGxpa2Ugcm9idXN0IGkxOG4gc3VwcG9ydCBvciBzZXJ2ZXItc2lkZQogICAgICogaW50ZXJhY3Rpb25zLiBJZiB5b3VyIGFwcCBuZWVkcyB0byBzdXBwb3J0IG1vcmUgYWR2YW5jZWQgdXNlIGNhc2VzLCBjb25zaWRlciBpbXBsZW1lbnRpbmcgeW91cgogICAgICogb3duIGBEYXRhU291cmNlYC4KICAgICAqIEB0ZW1wbGF0ZSBUCiAgICAgKi8KICAgIGNsYXNzIE1hdFRhYmxlRGF0YVNvdXJjZSBleHRlbmRzIERhdGFTb3VyY2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7Pz19IGluaXRpYWxEYXRhCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaW5pdGlhbERhdGEgPSBbXSkgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3RyZWFtIGVtaXR0aW5nIHJlbmRlciBkYXRhIHRvIHRoZSB0YWJsZSAoZGVwZW5kcyBvbiBvcmRlcmVkIGRhdGEgY2hhbmdlcykuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9yZW5kZXJEYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gdGhhdCBlbWl0cyB3aGVuIGEgbmV3IGZpbHRlciBzdHJpbmcgaXMgc2V0IG9uIHRoZSBkYXRhIHNvdXJjZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2ZpbHRlciA9IG5ldyBCZWhhdmlvclN1YmplY3QoJycpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVXNlZCB0byByZWFjdCB0byBpbnRlcm5hbCBjaGFuZ2VzIG9mIHRoZSBwYWdpbmF0b3IgdGhhdCBhcmUgbWFkZSBieSB0aGUgZGF0YSBzb3VyY2UgaXRzZWxmLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5faW50ZXJuYWxQYWdlQ2hhbmdlcyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJzY3JpcHRpb24gdG8gdGhlIGNoYW5nZXMgdGhhdCBzaG91bGQgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgcm93cywgc3VjaAogICAgICAgICAgICAgKiBhcyBmaWx0ZXJpbmcsIHNvcnRpbmcsIHBhZ2luYXRpb24sIG9yIGJhc2UgZGF0YSBjaGFuZ2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IFN1YnNjcmlwdGlvbi5FTVBUWTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIERhdGEgYWNjZXNzb3IgZnVuY3Rpb24gdGhhdCBpcyB1c2VkIGZvciBhY2Nlc3NpbmcgZGF0YSBwcm9wZXJ0aWVzIGZvciBzb3J0aW5nIHRocm91Z2gKICAgICAgICAgICAgICogdGhlIGRlZmF1bHQgc29ydERhdGEgZnVuY3Rpb24uCiAgICAgICAgICAgICAqIFRoaXMgZGVmYXVsdCBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgdGhlIHNvcnQgaGVhZGVyIElEcyAod2hpY2ggZGVmYXVsdHMgdG8gdGhlIGNvbHVtbiBuYW1lKQogICAgICAgICAgICAgKiBtYXRjaGVzIHRoZSBkYXRhJ3MgcHJvcGVydGllcyAoZS5nLiBjb2x1bW4gWHl6IHJlcHJlc2VudHMgZGF0YVsnWHl6J10pLgogICAgICAgICAgICAgKiBNYXkgYmUgc2V0IHRvIGEgY3VzdG9tIGZ1bmN0aW9uIGZvciBkaWZmZXJlbnQgYmVoYXZpb3IuCiAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhIERhdGEgb2JqZWN0IHRoYXQgaXMgYmVpbmcgYWNjZXNzZWQuCiAgICAgICAgICAgICAqIEBwYXJhbSBzb3J0SGVhZGVySWQgVGhlIG5hbWUgb2YgdGhlIGNvbHVtbiB0aGF0IHJlcHJlc2VudHMgdGhlIGRhdGEuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNvcnRpbmdEYXRhQWNjZXNzb3IgPSAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAgICAgKiBAcGFyYW0gez99IHNvcnRIZWFkZXJJZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRhdGEsIHNvcnRIZWFkZXJJZCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGRhdGEpKSlbc29ydEhlYWRlcklkXTsKICAgICAgICAgICAgICAgIGlmIChfaXNOdW1iZXJWYWx1ZSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbnVtYmVyVmFsdWUgPSBOdW1iZXIodmFsdWUpOwogICAgICAgICAgICAgICAgICAgIC8vIE51bWJlcnMgYmV5b25kIGBNQVhfU0FGRV9JTlRFR0VSYCBjYW4ndCBiZSBjb21wYXJlZCByZWxpYWJseSBzbyB3ZQogICAgICAgICAgICAgICAgICAgIC8vIGxlYXZlIHRoZW0gYXMgc3RyaW5ncy4gRm9yIG1vcmUgaW5mbzogaHR0cHM6Ly9nb28uZ2wveTV2YlNnCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bWJlclZhbHVlIDwgTUFYX1NBRkVfSU5URUdFUiA/IG51bWJlclZhbHVlIDogdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogR2V0cyBhIHNvcnRlZCBjb3B5IG9mIHRoZSBkYXRhIGFycmF5IGJhc2VkIG9uIHRoZSBzdGF0ZSBvZiB0aGUgTWF0U29ydC4gQ2FsbGVkCiAgICAgICAgICAgICAqIGFmdGVyIGNoYW5nZXMgYXJlIG1hZGUgdG8gdGhlIGZpbHRlcmVkIGRhdGEgb3Igd2hlbiBzb3J0IGNoYW5nZXMgYXJlIGVtaXR0ZWQgZnJvbSBNYXRTb3J0LgogICAgICAgICAgICAgKiBCeSBkZWZhdWx0LCB0aGUgZnVuY3Rpb24gcmV0cmlldmVzIHRoZSBhY3RpdmUgc29ydCBhbmQgaXRzIGRpcmVjdGlvbiBhbmQgY29tcGFyZXMgZGF0YQogICAgICAgICAgICAgKiBieSByZXRyaWV2aW5nIGRhdGEgdXNpbmcgdGhlIHNvcnRpbmdEYXRhQWNjZXNzb3IuIE1heSBiZSBvdmVycmlkZGVuIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbgogICAgICAgICAgICAgKiBvZiBkYXRhIG9yZGVyaW5nLgogICAgICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgYXJyYXkgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBzb3J0ZWQuCiAgICAgICAgICAgICAqIEBwYXJhbSBzb3J0IFRoZSBjb25uZWN0ZWQgTWF0U29ydCB0aGF0IGhvbGRzIHRoZSBjdXJyZW50IHNvcnQgc3RhdGUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnNvcnREYXRhID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzb3J0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZGF0YSwgc29ydCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgYWN0aXZlID0gc29ydC5hY3RpdmU7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkaXJlY3Rpb24gPSBzb3J0LmRpcmVjdGlvbjsKICAgICAgICAgICAgICAgIGlmICghYWN0aXZlIHx8IGRpcmVjdGlvbiA9PSAnJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRhOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGEuc29ydCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGEKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGEsIGIpID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgbGV0IHZhbHVlQSA9IHRoaXMuc29ydGluZ0RhdGFBY2Nlc3NvcihhLCBhY3RpdmUpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgdmFsdWVCID0gdGhpcy5zb3J0aW5nRGF0YUFjY2Vzc29yKGIsIGFjdGl2ZSk7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgYm90aCB2YWx1ZUEgYW5kIHZhbHVlQiBleGlzdCAodHJ1dGh5KSwgdGhlbiBjb21wYXJlIHRoZSB0d28uIE90aGVyd2lzZSwgY2hlY2sgaWYKICAgICAgICAgICAgICAgICAgICAvLyBvbmUgdmFsdWUgZXhpc3RzIHdoaWxlIHRoZSBvdGhlciBkb2Vzbid0LiBJbiB0aGlzIGNhc2UsIGV4aXN0aW5nIHZhbHVlIHNob3VsZCBjb21lIGxhc3QuCiAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBhdm9pZHMgaW5jb25zaXN0ZW50IHJlc3VsdHMgd2hlbiBjb21wYXJpbmcgdmFsdWVzIHRvIHVuZGVmaW5lZC9udWxsLgogICAgICAgICAgICAgICAgICAgIC8vIElmIG5laXRoZXIgdmFsdWUgZXhpc3RzLCByZXR1cm4gMCAoZXF1YWwpLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgY29tcGFyYXRvclJlc3VsdCA9IDA7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlQSAhPSBudWxsICYmIHZhbHVlQiAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIENoZWNrIGlmIG9uZSB2YWx1ZSBpcyBncmVhdGVyIHRoYW4gdGhlIG90aGVyOyBpZiBlcXVhbCwgY29tcGFyYXRvclJlc3VsdCBzaG91bGQgcmVtYWluIDAuCiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZUEgPiB2YWx1ZUIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3JSZXN1bHQgPSAxOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlQSA8IHZhbHVlQikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tcGFyYXRvclJlc3VsdCA9IC0xOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlQSAhPSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3JSZXN1bHQgPSAxOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh2YWx1ZUIgIT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yUmVzdWx0ID0gLTE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb21wYXJhdG9yUmVzdWx0ICogKGRpcmVjdGlvbiA9PSAnYXNjJyA/IDEgOiAtMSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQ2hlY2tzIGlmIGEgZGF0YSBvYmplY3QgbWF0Y2hlcyB0aGUgZGF0YSBzb3VyY2UncyBmaWx0ZXIgc3RyaW5nLiBCeSBkZWZhdWx0LCBlYWNoIGRhdGEgb2JqZWN0CiAgICAgICAgICAgICAqIGlzIGNvbnZlcnRlZCB0byBhIHN0cmluZyBvZiBpdHMgcHJvcGVydGllcyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBmaWx0ZXIgaGFzCiAgICAgICAgICAgICAqIGF0IGxlYXN0IG9uZSBvY2N1cnJlbmNlIGluIHRoYXQgc3RyaW5nLiBCeSBkZWZhdWx0LCB0aGUgZmlsdGVyIHN0cmluZyBoYXMgaXRzIHdoaXRlc3BhY2UKICAgICAgICAgICAgICogdHJpbW1lZCBhbmQgdGhlIG1hdGNoIGlzIGNhc2UtaW5zZW5zaXRpdmUuIE1heSBiZSBvdmVycmlkZGVuIGZvciBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZgogICAgICAgICAgICAgKiBmaWx0ZXIgbWF0Y2hpbmcuCiAgICAgICAgICAgICAqIEBwYXJhbSBkYXRhIERhdGEgb2JqZWN0IHVzZWQgdG8gY2hlY2sgYWdhaW5zdCB0aGUgZmlsdGVyLgogICAgICAgICAgICAgKiBAcGFyYW0gZmlsdGVyIEZpbHRlciBzdHJpbmcgdGhhdCBoYXMgYmVlbiBzZXQgb24gdGhlIGRhdGEgc291cmNlLgogICAgICAgICAgICAgKiBAcmV0dXJuIFdoZXRoZXIgdGhlIGZpbHRlciBtYXRjaGVzIGFnYWluc3QgdGhlIGRhdGEKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZmlsdGVyUHJlZGljYXRlID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmaWx0ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkYXRhLCBmaWx0ZXIpID0+IHsKICAgICAgICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgZGF0YSBpbnRvIGEgbG93ZXJjYXNlIHN0cmluZyBvZiBhbGwgcHJvcGVydHkgdmFsdWVzLgogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGF0YVN0ciA9IE9iamVjdC5rZXlzKGRhdGEpLnJlZHVjZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRUZXJtCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGN1cnJlbnRUZXJtLCBrZXkpID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBVc2UgYW4gb2JzY3VyZSBVbmljb2RlIGNoYXJhY3RlciB0byBkZWxpbWl0IHRoZSB3b3JkcyBpbiB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZy4KICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGF2b2lkcyBtYXRjaGVzIHdoZXJlIHRoZSB2YWx1ZXMgb2YgdHdvIGNvbHVtbnMgY29tYmluZWQgd2lsbCBtYXRjaCB0aGUgdXNlcidzIHF1ZXJ5CiAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gYEZsdXRlYCBhbmQgYFN0b3BgIHdpbGwgbWF0Y2ggYFRlc3RgKS4gVGhlIGNoYXJhY3RlciBpcyBpbnRlbmRlZCB0byBiZSBzb21ldGhpbmcKICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGhhcyBhIHZlcnkgbG93IGNoYW5jZSBvZiBiZWluZyB0eXBlZCBpbiBieSBzb21lYm9keSBpbiBhIHRleHQgZmllbGQuIFRoaXMgb25lIGluCiAgICAgICAgICAgICAgICAgICAgLy8gcGFydGljdWxhciBpcyAiV2hpdGUgdXAtcG9pbnRpbmcgdHJpYW5nbGUgd2l0aCBkb3QiIGZyb20KICAgICAgICAgICAgICAgICAgICAvLyBodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9MaXN0X29mX1VuaWNvZGVfY2hhcmFjdGVycwogICAgICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50VGVybSArICgoLyoqIEB0eXBlIHs/fSAqLyAoZGF0YSkpKVtrZXldICsgJ+KXrCc7CiAgICAgICAgICAgICAgICB9KSwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGZpbHRlciBieSBjb252ZXJ0aW5nIGl0IHRvIGxvd2VyY2FzZSBhbmQgcmVtb3Zpbmcgd2hpdGVzcGFjZS4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRyYW5zZm9ybWVkRmlsdGVyID0gZmlsdGVyLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGFTdHIuaW5kZXhPZih0cmFuc2Zvcm1lZEZpbHRlcikgIT0gLTE7CiAgICAgICAgICAgIH0pOwogICAgICAgICAgICB0aGlzLl9kYXRhID0gbmV3IEJlaGF2aW9yU3ViamVjdChpbml0aWFsRGF0YSk7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBcnJheSBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIHJlbmRlcmVkIGJ5IHRoZSB0YWJsZSwgd2hlcmUgZWFjaCBvYmplY3QgcmVwcmVzZW50cyBvbmUgcm93LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRhdGEoKSB7IHJldHVybiB0aGlzLl9kYXRhLnZhbHVlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGF0YShkYXRhKSB7IHRoaXMuX2RhdGEubmV4dChkYXRhKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEZpbHRlciB0ZXJtIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gZmlsdGVyIG91dCBvYmplY3RzIGZyb20gdGhlIGRhdGEgYXJyYXkuIFRvIG92ZXJyaWRlIGhvdwogICAgICAgICAqIGRhdGEgb2JqZWN0cyBtYXRjaCB0byB0aGlzIGZpbHRlciBzdHJpbmcsIHByb3ZpZGUgYSBjdXN0b20gZnVuY3Rpb24gZm9yIGZpbHRlclByZWRpY2F0ZS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmaWx0ZXIoKSB7IHJldHVybiB0aGlzLl9maWx0ZXIudmFsdWU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGZpbHRlcihmaWx0ZXIpIHsgdGhpcy5fZmlsdGVyLm5leHQoZmlsdGVyKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEluc3RhbmNlIG9mIHRoZSBNYXRTb3J0IGRpcmVjdGl2ZSB1c2VkIGJ5IHRoZSB0YWJsZSB0byBjb250cm9sIGl0cyBzb3J0aW5nLiBTb3J0IGNoYW5nZXMKICAgICAgICAgKiBlbWl0dGVkIGJ5IHRoZSBNYXRTb3J0IHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlIHRhYmxlJ3MgcmVuZGVyZWQgZGF0YS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzb3J0KCkgeyByZXR1cm4gdGhpcy5fc29ydDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc29ydAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHNvcnQoc29ydCkgewogICAgICAgICAgICB0aGlzLl9zb3J0ID0gc29ydDsKICAgICAgICAgICAgdGhpcy5fdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEluc3RhbmNlIG9mIHRoZSBNYXRQYWdpbmF0b3IgY29tcG9uZW50IHVzZWQgYnkgdGhlIHRhYmxlIHRvIGNvbnRyb2wgd2hhdCBwYWdlIG9mIHRoZSBkYXRhIGlzCiAgICAgICAgICogZGlzcGxheWVkLiBQYWdlIGNoYW5nZXMgZW1pdHRlZCBieSB0aGUgTWF0UGFnaW5hdG9yIHdpbGwgdHJpZ2dlciBhbiB1cGRhdGUgdG8gdGhlCiAgICAgICAgICogdGFibGUncyByZW5kZXJlZCBkYXRhLgogICAgICAgICAqCiAgICAgICAgICogTm90ZSB0aGF0IHRoZSBkYXRhIHNvdXJjZSB1c2VzIHRoZSBwYWdpbmF0b3IncyBwcm9wZXJ0aWVzIHRvIGNhbGN1bGF0ZSB3aGljaCBwYWdlIG9mIGRhdGEKICAgICAgICAgKiBzaG91bGQgYmUgZGlzcGxheWVkLiBJZiB0aGUgcGFnaW5hdG9yIHJlY2VpdmVzIGl0cyBwcm9wZXJ0aWVzIGFzIHRlbXBsYXRlIGlucHV0cywKICAgICAgICAgKiBlLmcuIGBbcGFnZUxlbmd0aF09MTAwYCBvciBgW3BhZ2VJbmRleF09MWAsIHRoZW4gYmUgc3VyZSB0aGF0IHRoZSBwYWdpbmF0b3IncyB2aWV3IGhhcyBiZWVuCiAgICAgICAgICogaW5pdGlhbGl6ZWQgYmVmb3JlIGFzc2lnbmluZyBpdCB0byB0aGlzIGRhdGEgc291cmNlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBhZ2luYXRvcigpIHsgcmV0dXJuIHRoaXMuX3BhZ2luYXRvcjsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcGFnaW5hdG9yCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcGFnaW5hdG9yKHBhZ2luYXRvcikgewogICAgICAgICAgICB0aGlzLl9wYWdpbmF0b3IgPSBwYWdpbmF0b3I7CiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZUNoYW5nZVN1YnNjcmlwdGlvbigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdWJzY3JpYmUgdG8gY2hhbmdlcyB0aGF0IHNob3VsZCB0cmlnZ2VyIGFuIHVwZGF0ZSB0byB0aGUgdGFibGUncyByZW5kZXJlZCByb3dzLiBXaGVuIHRoZQogICAgICAgICAqIGNoYW5nZXMgb2NjdXIsIHByb2Nlc3MgdGhlIGN1cnJlbnQgc3RhdGUgb2YgdGhlIGZpbHRlciwgc29ydCwgYW5kIHBhZ2luYXRpb24gYWxvbmcgd2l0aAogICAgICAgICAqIHRoZSBwcm92aWRlZCBiYXNlIGRhdGEgYW5kIHNlbmQgaXQgdG8gdGhlIHRhYmxlIGZvciByZW5kZXJpbmcuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfdXBkYXRlQ2hhbmdlU3Vic2NyaXB0aW9uKCkgewogICAgICAgICAgICAvLyBTb3J0aW5nIGFuZC9vciBwYWdpbmF0aW9uIHNob3VsZCBiZSB3YXRjaGVkIGlmIE1hdFNvcnQgYW5kL29yIE1hdFBhZ2luYXRvciBhcmUgcHJvdmlkZWQuCiAgICAgICAgICAgIC8vIFRoZSBldmVudHMgc2hvdWxkIGVtaXQgd2hlbmV2ZXIgdGhlIGNvbXBvbmVudCBlbWl0cyBhIGNoYW5nZSBvciBpbml0aWFsaXplcywgb3IgaWYgbm8KICAgICAgICAgICAgLy8gY29tcG9uZW50IGlzIHByb3ZpZGVkLCBhIHN0cmVhbSB3aXRoIGp1c3QgYSBudWxsIGV2ZW50IHNob3VsZCBiZSBwcm92aWRlZC4KICAgICAgICAgICAgLy8gVGhlIGBzb3J0Q2hhbmdlYCBhbmQgYHBhZ2VDaGFuZ2VgIGFjdHMgYXMgYSBzaWduYWwgdG8gdGhlIGNvbWJpbmVMYXRlc3RzIGJlbG93IHNvIHRoYXQgdGhlCiAgICAgICAgICAgIC8vIHBpcGVsaW5lIGNhbiBwcm9ncmVzcyB0byB0aGUgbmV4dCBzdGVwLiBOb3RlIHRoYXQgdGhlIHZhbHVlIGZyb20gdGhlc2Ugc3RyZWFtcyBhcmUgbm90IHVzZWQsCiAgICAgICAgICAgIC8vIHRoZXkgcHVyZWx5IGFjdCBhcyBhIHNpZ25hbCB0byBwcm9ncmVzcyBpbiB0aGUgcGlwZWxpbmUuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc29ydENoYW5nZSA9IHRoaXMuX3NvcnQgPwogICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKG1lcmdlKHRoaXMuX3NvcnQuc29ydENoYW5nZSwgdGhpcy5fc29ydC5pbml0aWFsaXplZCkpKSA6CiAgICAgICAgICAgICAgICBvZihudWxsKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYWdlQ2hhbmdlID0gdGhpcy5fcGFnaW5hdG9yID8KICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovIChtZXJnZSh0aGlzLl9wYWdpbmF0b3IucGFnZSwgdGhpcy5faW50ZXJuYWxQYWdlQ2hhbmdlcywgdGhpcy5fcGFnaW5hdG9yLmluaXRpYWxpemVkKSkpIDoKICAgICAgICAgICAgICAgIG9mKG51bGwpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGRhdGFTdHJlYW0gPSB0aGlzLl9kYXRhOwogICAgICAgICAgICAvLyBXYXRjaCBmb3IgYmFzZSBkYXRhIG9yIGZpbHRlciBjaGFuZ2VzIHRvIHByb3ZpZGUgYSBmaWx0ZXJlZCBzZXQgb2YgZGF0YS4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBmaWx0ZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtkYXRhU3RyZWFtLCB0aGlzLl9maWx0ZXJdKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbZGF0YV0pID0+IHRoaXMuX2ZpbHRlckRhdGEoZGF0YSkpKSk7CiAgICAgICAgICAgIC8vIFdhdGNoIGZvciBmaWx0ZXJlZCBkYXRhIG9yIHNvcnQgY2hhbmdlcyB0byBwcm92aWRlIGFuIG9yZGVyZWQgc2V0IG9mIGRhdGEuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3JkZXJlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtmaWx0ZXJlZERhdGEsIHNvcnRDaGFuZ2VdKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbZGF0YV0pID0+IHRoaXMuX29yZGVyRGF0YShkYXRhKSkpKTsKICAgICAgICAgICAgLy8gV2F0Y2ggZm9yIG9yZGVyZWQgZGF0YSBvciBwYWdlIGNoYW5nZXMgdG8gcHJvdmlkZSBhIHBhZ2VkIHNldCBvZiBkYXRhLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhZ2luYXRlZERhdGEgPSBjb21iaW5lTGF0ZXN0KFtvcmRlcmVkRGF0YSwgcGFnZUNoYW5nZV0pCiAgICAgICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtkYXRhXSkgPT4gdGhpcy5fcGFnZURhdGEoZGF0YSkpKSk7CiAgICAgICAgICAgIC8vIFdhdGNoZWQgZm9yIHBhZ2VkIGRhdGEgY2hhbmdlcyBhbmQgc2VuZCB0aGUgcmVzdWx0IHRvIHRoZSB0YWJsZSB0byByZW5kZXIuCiAgICAgICAgICAgIHRoaXMuX3JlbmRlckNoYW5nZXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgdGhpcy5fcmVuZGVyQ2hhbmdlc1N1YnNjcmlwdGlvbiA9IHBhZ2luYXRlZERhdGEuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBkYXRhID0+IHRoaXMuX3JlbmRlckRhdGEubmV4dChkYXRhKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGEgZmlsdGVyZWQgZGF0YSBhcnJheSB3aGVyZSBlYWNoIGZpbHRlciBvYmplY3QgY29udGFpbnMgdGhlIGZpbHRlciBzdHJpbmcgd2l0aGluCiAgICAgICAgICogdGhlIHJlc3VsdCBvZiB0aGUgZmlsdGVyVGVybUFjY2Vzc29yIGZ1bmN0aW9uLiBJZiBubyBmaWx0ZXIgaXMgc2V0LCByZXR1cm5zIHRoZSBkYXRhIGFycmF5CiAgICAgICAgICogYXMgcHJvdmlkZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmlsdGVyRGF0YShkYXRhKSB7CiAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIGEgZmlsdGVyIHN0cmluZywgZmlsdGVyIG91dCBkYXRhIHRoYXQgZG9lcyBub3QgY29udGFpbiBpdC4KICAgICAgICAgICAgLy8gRWFjaCBkYXRhIG9iamVjdCBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgdXNpbmcgdGhlIGZ1bmN0aW9uIGRlZmluZWQgYnkgZmlsdGVyVGVybUFjY2Vzc29yLgogICAgICAgICAgICAvLyBNYXkgYmUgb3ZlcnJpZGRlbiBmb3IgY3VzdG9taXphdGlvbi4KICAgICAgICAgICAgdGhpcy5maWx0ZXJlZERhdGEgPQogICAgICAgICAgICAgICAgIXRoaXMuZmlsdGVyID8gZGF0YSA6IGRhdGEuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gb2JqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBvYmogPT4gdGhpcy5maWx0ZXJQcmVkaWNhdGUob2JqLCB0aGlzLmZpbHRlcikpKTsKICAgICAgICAgICAgaWYgKHRoaXMucGFnaW5hdG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGVQYWdpbmF0b3IodGhpcy5maWx0ZXJlZERhdGEubGVuZ3RoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXJlZERhdGE7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgYSBzb3J0ZWQgY29weSBvZiB0aGUgZGF0YSBpZiBNYXRTb3J0IGhhcyBhIHNvcnQgYXBwbGllZCwgb3RoZXJ3aXNlIGp1c3QgcmV0dXJucyB0aGUKICAgICAgICAgKiBkYXRhIGFycmF5IGFzIHByb3ZpZGVkLiBVc2VzIHRoZSBkZWZhdWx0IGRhdGEgYWNjZXNzb3IgZm9yIGRhdGEgbG9va3VwLCB1bmxlc3MgYQogICAgICAgICAqIHNvcnREYXRhQWNjZXNzb3IgZnVuY3Rpb24gaXMgZGVmaW5lZC4KICAgICAgICAgKiBAcGFyYW0gez99IGRhdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vcmRlckRhdGEoZGF0YSkgewogICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBubyBhY3RpdmUgc29ydCBvciBkaXJlY3Rpb24sIHJldHVybiB0aGUgZGF0YSB3aXRob3V0IHRyeWluZyB0byBzb3J0LgogICAgICAgICAgICBpZiAoIXRoaXMuc29ydCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuc29ydERhdGEoZGF0YS5zbGljZSgpLCB0aGlzLnNvcnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZXR1cm5zIGEgcGFnZWQgc2xpY2Ugb2YgdGhlIHByb3ZpZGVkIGRhdGEgYXJyYXkgYWNjb3JkaW5nIHRvIHRoZSBwcm92aWRlZCBNYXRQYWdpbmF0b3IncyBwYWdlCiAgICAgICAgICogaW5kZXggYW5kIGxlbmd0aC4gSWYgdGhlcmUgaXMgbm8gcGFnaW5hdG9yIHByb3ZpZGVkLCByZXR1cm5zIHRoZSBkYXRhIGFycmF5IGFzIHByb3ZpZGVkLgogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3BhZ2VEYXRhKGRhdGEpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2luYXRvcikgewogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGFydEluZGV4ID0gdGhpcy5wYWdpbmF0b3IucGFnZUluZGV4ICogdGhpcy5wYWdpbmF0b3IucGFnZVNpemU7CiAgICAgICAgICAgIHJldHVybiBkYXRhLnNsaWNlKHN0YXJ0SW5kZXgsIHN0YXJ0SW5kZXggKyB0aGlzLnBhZ2luYXRvci5wYWdlU2l6ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHBhZ2luYXRvciB0byByZWZsZWN0IHRoZSBsZW5ndGggb2YgdGhlIGZpbHRlcmVkIGRhdGEsIGFuZCBtYWtlcyBzdXJlIHRoYXQgdGhlIHBhZ2UKICAgICAgICAgKiBpbmRleCBkb2VzIG5vdCBleGNlZWQgdGhlIHBhZ2luYXRvcidzIGxhc3QgcGFnZS4gVmFsdWVzIGFyZSBjaGFuZ2VkIGluIGEgcmVzb2x2ZWQgcHJvbWlzZSB0bwogICAgICAgICAqIGd1YXJkIGFnYWluc3QgbWFraW5nIHByb3BlcnR5IGNoYW5nZXMgd2l0aGluIGEgcm91bmQgb2YgY2hhbmdlIGRldGVjdGlvbi4KICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlcmVkRGF0YUxlbmd0aAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVBhZ2luYXRvcihmaWx0ZXJlZERhdGFMZW5ndGgpIHsKICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwYWdpbmF0b3IgPSB0aGlzLnBhZ2luYXRvcjsKICAgICAgICAgICAgICAgIGlmICghcGFnaW5hdG9yKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcGFnaW5hdG9yLmxlbmd0aCA9IGZpbHRlcmVkRGF0YUxlbmd0aDsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYWdlIGluZGV4IGlzIHNldCBiZXlvbmQgdGhlIHBhZ2UsIHJlZHVjZSBpdCB0byB0aGUgbGFzdCBwYWdlLgogICAgICAgICAgICAgICAgaWYgKHBhZ2luYXRvci5wYWdlSW5kZXggPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGxhc3RQYWdlSW5kZXggPSBNYXRoLmNlaWwocGFnaW5hdG9yLmxlbmd0aCAvIHBhZ2luYXRvci5wYWdlU2l6ZSkgLSAxIHx8IDA7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5ld1BhZ2VJbmRleCA9IE1hdGgubWluKHBhZ2luYXRvci5wYWdlSW5kZXgsIGxhc3RQYWdlSW5kZXgpOwogICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYWdlSW5kZXggIT09IHBhZ2luYXRvci5wYWdlSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFnaW5hdG9yLnBhZ2VJbmRleCA9IG5ld1BhZ2VJbmRleDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhlIHBhZ2luYXRvciBvbmx5IGVtaXRzIGFmdGVyIHVzZXItZ2VuZXJhdGVkIGNoYW5nZXMsCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG5lZWQgb3VyIG93biBzdHJlYW0gc28gd2Uga25vdyB0byBzaG91bGQgcmUtcmVuZGVyIHRoZSBkYXRhLgogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9pbnRlcm5hbFBhZ2VDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlZCBieSB0aGUgTWF0VGFibGUuIENhbGxlZCB3aGVuIGl0IGNvbm5lY3RzIHRvIHRoZSBkYXRhIHNvdXJjZS4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY29ubmVjdCgpIHsgcmV0dXJuIHRoaXMuX3JlbmRlckRhdGE7IH0KICAgICAgICAvKioKICAgICAgICAgKiBVc2VkIGJ5IHRoZSBNYXRUYWJsZS4gQ2FsbGVkIHdoZW4gaXQgaXMgZGVzdHJveWVkLiBOby1vcC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZGlzY29ubmVjdCgpIHsgfQogICAgfQoKICAgIGNvbnN0IF9jMCRvID0gWyJkaWFsb2dQb3B1cCJdOwogICAgY29uc3QgX2MxJGYgPSBbImh1ZVNsaWRlciJdOwogICAgY29uc3QgX2MyJDYgPSBbImFscGhhU2xpZGVyIl07CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAiZGl2Iik7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1Y2xhc3NNYXBJbnRlcnBvbGF0ZTEoImFycm93IGFycm93LSIsIGN0eF9yMS5jcFVzZVBvc2l0aW9uLCAiIik7CiAgICAgICAgybXJtXN0eWxlUHJvcCgidG9wIiwgY3R4X3IxLmFycm93VG9wLCAicHgiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IxNyA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDI2KTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzNfVGVtcGxhdGVfZGl2X25ld1ZhbHVlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjE3KTsgY29uc3QgY3R4X3IxNiA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IxNi5vbkNvbG9yQ2hhbmdlKCRldmVudCk7IH0pKCJkcmFnU3RhcnQiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfM19UZW1wbGF0ZV9kaXZfZHJhZ1N0YXJ0XzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjE3KTsgY29uc3QgY3R4X3IxOCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IxOC5vbkRyYWdTdGFydCgic2F0dXJhdGlvbi1saWdodG5lc3MiKTsgfSkoImRyYWdFbmQiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfM19UZW1wbGF0ZV9kaXZfZHJhZ0VuZF8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxNyk7IGNvbnN0IGN0eF9yMTkgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTkub25EcmFnRW5kKCJzYXR1cmF0aW9uLWxpZ2h0bmVzcyIpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudCgxLCAiZGl2IiwgMTMpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjIgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJiYWNrZ3JvdW5kLWNvbG9yIiwgY3R4X3IyLmh1ZVNsaWRlckNvbG9yKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJnWCIsIDEpKCJyZ1kiLCAxKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJ0b3AiLCBjdHhfcjIuc2xpZGVyID09IG51bGwgPyBudWxsIDogY3R4X3IyLnNsaWRlci52LCAicHgiKSgibGVmdCIsIGN0eF9yMi5zbGlkZXIgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjIuc2xpZGVyLnMsICJweCIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9idXR0b25fOF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjIxID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYnV0dG9uIiwgMjcpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9idXR0b25fOF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjEpOyBjb25zdCBjdHhfcjIwID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjIwLm9uQWRkUHJlc2V0Q29sb3IoJGV2ZW50LCBjdHhfcjIwLnNlbGVjdGVkQ29sb3IpOyB9KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IzID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWNsYXNzTWFwKGN0eF9yMy5jcEFkZENvbG9yQnV0dG9uQ2xhc3MpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiZGlzYWJsZWQiLCBjdHhfcjMuY3BQcmVzZXRDb2xvcnMgJiYgY3R4X3IzLmNwUHJlc2V0Q29sb3JzLmxlbmd0aCA+PSBjdHhfcjMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IzLmNwQWRkQ29sb3JCdXR0b25UZXh0LCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMTBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgImRpdiIsIDI4KTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIwX2lucHV0XzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IyNSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImlucHV0IiwgMzQpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfaW5wdXRfNl9UZW1wbGF0ZV9pbnB1dF9rZXl1cF9lbnRlcl8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyNSk7IGNvbnN0IGN0eF9yMjQgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjI0Lm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIwX2lucHV0XzZfVGVtcGxhdGVfaW5wdXRfbmV3VmFsdWVfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjUpOyBjb25zdCBjdHhfcjI2ID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3IyNi5vbkFscGhhSW5wdXQoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMjIgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJyZyIsIDEpKCJ2YWx1ZSIsIGN0eF9yMjIuY215a1RleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjIyLmNteWtUZXh0LmEpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfZGl2XzE2X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDEsICJBIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMjggPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAyOSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMzApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImlucHV0IiwgMzEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfVGVtcGxhdGVfaW5wdXRfa2V5dXBfZW50ZXJfMl9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjgpOyBjb25zdCBjdHhfcjI3ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjI3Lm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIwX1RlbXBsYXRlX2lucHV0X25ld1ZhbHVlXzJfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjI4KTsgY29uc3QgY3R4X3IyOSA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IyOS5vbkN5YW5JbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImlucHV0IiwgMzEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfVGVtcGxhdGVfaW5wdXRfa2V5dXBfZW50ZXJfM19saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjgpOyBjb25zdCBjdHhfcjMwID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjMwLm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIwX1RlbXBsYXRlX2lucHV0X25ld1ZhbHVlXzNfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjI4KTsgY29uc3QgY3R4X3IzMSA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IzMS5vbk1hZ2VudGFJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImlucHV0IiwgMzEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfVGVtcGxhdGVfaW5wdXRfa2V5dXBfZW50ZXJfNF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjgpOyBjb25zdCBjdHhfcjMyID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjMyLm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIwX1RlbXBsYXRlX2lucHV0X25ld1ZhbHVlXzRfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjI4KTsgY29uc3QgY3R4X3IzMyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IzMy5vblllbGxvd0lucHV0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiaW5wdXQiLCAzMSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cC5lbnRlciIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMF9UZW1wbGF0ZV9pbnB1dF9rZXl1cF9lbnRlcl81X2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyOCk7IGNvbnN0IGN0eF9yMzQgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMzQub25BY2NlcHRDb2xvcigkZXZlbnQpOyB9KSgibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfVGVtcGxhdGVfaW5wdXRfbmV3VmFsdWVfNV9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjgpOyBjb25zdCBjdHhfcjM1ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjM1Lm9uQmxhY2tJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg2LCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfaW5wdXRfNl9UZW1wbGF0ZSwgMSwgMiwgImlucHV0IiwgMzIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiZGl2IiwgMzApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOCwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDksICJDIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEwLCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTEsICJNIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEyLCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTMsICJZIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE0LCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTUsICJLIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTYsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMF9kaXZfMTZfVGVtcGxhdGUsIDIsIDAsICJkaXYiLCAzMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I4ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXN0eWxlUHJvcCgiZGlzcGxheSIsIGN0eF9yOC5mb3JtYXQgIT09IDMgPyAibm9uZSIgOiAiYmxvY2siKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJnIiwgMTAwKSgidmFsdWUiLCBjdHhfcjguY215a1RleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjguY215a1RleHQuYyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJyZyIsIDEwMCkoInZhbHVlIiwgY3R4X3I4LmNteWtUZXh0ID09IG51bGwgPyBudWxsIDogY3R4X3I4LmNteWtUZXh0Lm0pOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgicmciLCAxMDApKCJ2YWx1ZSIsIGN0eF9yOC5jbXlrVGV4dCA9PSBudWxsID8gbnVsbCA6IGN0eF9yOC5jbXlrVGV4dC55KTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJnIiwgMTAwKSgidmFsdWUiLCBjdHhfcjguY215a1RleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjguY215a1RleHQuayk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I4LmNwQWxwaGFDaGFubmVsICE9PSAiZGlzYWJsZWQiKTsKICAgICAgICDJtcm1YWR2YW5jZSgxMCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I4LmNwQWxwaGFDaGFubmVsICE9PSAiZGlzYWJsZWQiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIxX2lucHV0XzVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IzOSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImlucHV0IiwgMzQpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjFfaW5wdXRfNV9UZW1wbGF0ZV9pbnB1dF9rZXl1cF9lbnRlcl8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IzOSk7IGNvbnN0IGN0eF9yMzggPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjM4Lm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIxX2lucHV0XzVfVGVtcGxhdGVfaW5wdXRfbmV3VmFsdWVfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMzkpOyBjb25zdCBjdHhfcjQwID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3I0MC5vbkFscGhhSW5wdXQoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMzYgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJyZyIsIDEpKCJ2YWx1ZSIsIGN0eF9yMzYuaHNsYVRleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjM2LmhzbGFUZXh0LmEpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjFfZGl2XzEzX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDEsICJBIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIxX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNDIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAzNSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMzApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImlucHV0IiwgMzYpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjFfVGVtcGxhdGVfaW5wdXRfa2V5dXBfZW50ZXJfMl9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNDIpOyBjb25zdCBjdHhfcjQxID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjQxLm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIxX1RlbXBsYXRlX2lucHV0X25ld1ZhbHVlXzJfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjQyKTsgY29uc3QgY3R4X3I0MyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I0My5vbkh1ZUlucHV0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiaW5wdXQiLCAzMSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cC5lbnRlciIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMV9UZW1wbGF0ZV9pbnB1dF9rZXl1cF9lbnRlcl8zX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I0Mik7IGNvbnN0IGN0eF9yNDQgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNDQub25BY2NlcHRDb2xvcigkZXZlbnQpOyB9KSgibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjFfVGVtcGxhdGVfaW5wdXRfbmV3VmFsdWVfM19saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNDIpOyBjb25zdCBjdHhfcjQ1ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjQ1Lm9uU2F0dXJhdGlvbklucHV0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiaW5wdXQiLCAzMSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cC5lbnRlciIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMV9UZW1wbGF0ZV9pbnB1dF9rZXl1cF9lbnRlcl80X2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I0Mik7IGNvbnN0IGN0eF9yNDYgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNDYub25BY2NlcHRDb2xvcigkZXZlbnQpOyB9KSgibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjFfVGVtcGxhdGVfaW5wdXRfbmV3VmFsdWVfNF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNDIpOyBjb25zdCBjdHhfcjQ3ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjQ3Lm9uTGlnaHRuZXNzSW5wdXQoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIxX2lucHV0XzVfVGVtcGxhdGUsIDEsIDIsICJpbnB1dCIsIDMyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImRpdiIsIDMwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCg4LCAiSCIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg5LCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTAsICJTIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDExLCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTIsICJMIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTMsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMV9kaXZfMTNfVGVtcGxhdGUsIDIsIDAsICJkaXYiLCAzMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I5ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXN0eWxlUHJvcCgiZGlzcGxheSIsIGN0eF9yOS5mb3JtYXQgIT09IDIgPyAibm9uZSIgOiAiYmxvY2siKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJnIiwgMzYwKSgidmFsdWUiLCBjdHhfcjkuaHNsYVRleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjkuaHNsYVRleHQuaCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJyZyIsIDEwMCkoInZhbHVlIiwgY3R4X3I5LmhzbGFUZXh0ID09IG51bGwgPyBudWxsIDogY3R4X3I5LmhzbGFUZXh0LnMpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgicmciLCAxMDApKCJ2YWx1ZSIsIGN0eF9yOS5oc2xhVGV4dCA9PSBudWxsID8gbnVsbCA6IGN0eF9yOS5oc2xhVGV4dC5sKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjkuY3BBbHBoYUNoYW5uZWwgIT09ICJkaXNhYmxlZCIpOwogICAgICAgIMm1ybVhZHZhbmNlKDgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yOS5jcEFscGhhQ2hhbm5lbCAhPT0gImRpc2FibGVkIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMl9pbnB1dF81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNTEgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJpbnB1dCIsIDM0KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImtleXVwLmVudGVyIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIyX2lucHV0XzVfVGVtcGxhdGVfaW5wdXRfa2V5dXBfZW50ZXJfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNTEpOyBjb25zdCBjdHhfcjUwID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3I1MC5vbkFjY2VwdENvbG9yKCRldmVudCk7IH0pKCJuZXdWYWx1ZSIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMl9pbnB1dF81X1RlbXBsYXRlX2lucHV0X25ld1ZhbHVlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjUxKTsgY29uc3QgY3R4X3I1MiA9IMm1ybVuZXh0Q29udGV4dCgyKTsgcmV0dXJuIGN0eF9yNTIub25BbHBoYUlucHV0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjQ4ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgicmciLCAxKSgidmFsdWUiLCBjdHhfcjQ4LnJnYmFUZXh0ID09IG51bGwgPyBudWxsIDogY3R4X3I0OC5yZ2JhVGV4dC5hKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIyX2Rpdl8xM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCgxLCAiQSIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjU0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMzcpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDMwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJpbnB1dCIsIDM4KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImtleXVwLmVudGVyIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIyX1RlbXBsYXRlX2lucHV0X2tleXVwX2VudGVyXzJfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjU0KTsgY29uc3QgY3R4X3I1MyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I1My5vbkFjY2VwdENvbG9yKCRldmVudCk7IH0pKCJuZXdWYWx1ZSIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMl9UZW1wbGF0ZV9pbnB1dF9uZXdWYWx1ZV8yX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I1NCk7IGNvbnN0IGN0eF9yNTUgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNTUub25SZWRJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImlucHV0IiwgMzgpOwogICAgICAgIMm1ybVsaXN0ZW5lcigia2V5dXAuZW50ZXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjJfVGVtcGxhdGVfaW5wdXRfa2V5dXBfZW50ZXJfM19saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNTQpOyBjb25zdCBjdHhfcjU2ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjU2Lm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSkoIm5ld1ZhbHVlIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIyX1RlbXBsYXRlX2lucHV0X25ld1ZhbHVlXzNfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjU0KTsgY29uc3QgY3R4X3I1NyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I1Ny5vbkdyZWVuSW5wdXQoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJpbnB1dCIsIDM4KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImtleXVwLmVudGVyIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIyX1RlbXBsYXRlX2lucHV0X2tleXVwX2VudGVyXzRfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjU0KTsgY29uc3QgY3R4X3I1OCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I1OC5vbkFjY2VwdENvbG9yKCRldmVudCk7IH0pKCJuZXdWYWx1ZSIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMl9UZW1wbGF0ZV9pbnB1dF9uZXdWYWx1ZV80X2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I1NCk7IGNvbnN0IGN0eF9yNTkgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNTkub25CbHVlSW5wdXQoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIyX2lucHV0XzVfVGVtcGxhdGUsIDEsIDIsICJpbnB1dCIsIDMyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImRpdiIsIDMwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCg4LCAiUiIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg5LCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTAsICJHIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDExLCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMTIsICJCIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTMsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yMl9kaXZfMTNfVGVtcGxhdGUsIDIsIDAsICJkaXYiLCAzMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVzdHlsZVByb3AoImRpc3BsYXkiLCBjdHhfcjEwLmZvcm1hdCAhPT0gMSA/ICJub25lIiA6ICJibG9jayIpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgicmciLCAyNTUpKCJ2YWx1ZSIsIGN0eF9yMTAucmdiYVRleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjEwLnJnYmFUZXh0LnIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgicmciLCAyNTUpKCJ2YWx1ZSIsIGN0eF9yMTAucmdiYVRleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjEwLnJnYmFUZXh0LmcpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgicmciLCAyNTUpKCJ2YWx1ZSIsIGN0eF9yMTAucmdiYVRleHQgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjEwLnJnYmFUZXh0LmIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMTAuY3BBbHBoYUNoYW5uZWwgIT09ICJkaXNhYmxlZCIpOwogICAgICAgIMm1ybVhZHZhbmNlKDgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMTAuY3BBbHBoYUNoYW5uZWwgIT09ICJkaXNhYmxlZCIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjNfaW5wdXRfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjYzID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiaW5wdXQiLCAzNCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cC5lbnRlciIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yM19pbnB1dF8zX1RlbXBsYXRlX2lucHV0X2tleXVwX2VudGVyXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjYzKTsgY29uc3QgY3R4X3I2MiA9IMm1ybVuZXh0Q29udGV4dCgyKTsgcmV0dXJuIGN0eF9yNjIub25BY2NlcHRDb2xvcigkZXZlbnQpOyB9KSgibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjNfaW5wdXRfM19UZW1wbGF0ZV9pbnB1dF9uZXdWYWx1ZV8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2Myk7IGNvbnN0IGN0eF9yNjQgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjY0Lm9uQWxwaGFJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I2MCA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJnIiwgMSkoInZhbHVlIiwgY3R4X3I2MC5oZXhBbHBoYSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yM19kaXZfN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgICAgICDJtcm1dGV4dCgxLCAiQSIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjY2ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMzkpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDMwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJpbnB1dCIsIDQwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImJsdXIiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjNfVGVtcGxhdGVfaW5wdXRfYmx1cl8yX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2Nik7IGNvbnN0IGN0eF9yNjUgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNjUub25IZXhJbnB1dChudWxsKTsgfSkoImtleXVwLmVudGVyIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzIzX1RlbXBsYXRlX2lucHV0X2tleXVwX2VudGVyXzJfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjY2KTsgY29uc3QgY3R4X3I2NyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I2Ny5vbkFjY2VwdENvbG9yKCRldmVudCk7IH0pKCJuZXdWYWx1ZSIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yM19UZW1wbGF0ZV9pbnB1dF9uZXdWYWx1ZV8yX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2Nik7IGNvbnN0IGN0eF9yNjggPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNjgub25IZXhJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjNfaW5wdXRfM19UZW1wbGF0ZSwgMSwgMiwgImlucHV0IiwgMzIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiZGl2IiwgMzApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDYsICJIZXgiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg3LCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjNfZGl2XzdfVGVtcGxhdGUsIDIsIDAsICJkaXYiLCAzMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVzdHlsZVByb3AoImRpc3BsYXkiLCBjdHhfcjExLmZvcm1hdCAhPT0gMCA/ICJub25lIiA6ICJibG9jayIpOwogICAgICAgIMm1ybVjbGFzc1Byb3AoImhleC1hbHBoYSIsIGN0eF9yMTEuY3BBbHBoYUNoYW5uZWwgPT09ICJmb3JjZWQiKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY3R4X3IxMS5oZXhUZXh0KTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjExLmNwQWxwaGFDaGFubmVsID09PSAiZm9yY2VkIik7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxMS5jcEFscGhhQ2hhbm5lbCA9PT0gImZvcmNlZCIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjRfaW5wdXRfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjcxID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiaW5wdXQiLCAzNCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cC5lbnRlciIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNF9pbnB1dF8zX1RlbXBsYXRlX2lucHV0X2tleXVwX2VudGVyXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjcxKTsgY29uc3QgY3R4X3I3MCA9IMm1ybVuZXh0Q29udGV4dCgyKTsgcmV0dXJuIGN0eF9yNzAub25BY2NlcHRDb2xvcigkZXZlbnQpOyB9KSgibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjRfaW5wdXRfM19UZW1wbGF0ZV9pbnB1dF9uZXdWYWx1ZV8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I3MSk7IGNvbnN0IGN0eF9yNzIgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjcyLm9uQWxwaGFJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I2OSA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoInJnIiwgMSkoInZhbHVlIiwgY3R4X3I2OS5oc2xhVGV4dCA9PSBudWxsID8gbnVsbCA6IGN0eF9yNjkuaHNsYVRleHQuYSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjc0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNDEpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDMwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJpbnB1dCIsIDMxKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImtleXVwLmVudGVyIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI0X1RlbXBsYXRlX2lucHV0X2tleXVwX2VudGVyXzJfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjc0KTsgY29uc3QgY3R4X3I3MyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I3My5vbkFjY2VwdENvbG9yKCRldmVudCk7IH0pKCJuZXdWYWx1ZSIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNF9UZW1wbGF0ZV9pbnB1dF9uZXdWYWx1ZV8yX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I3NCk7IGNvbnN0IGN0eF9yNzUgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNzUub25WYWx1ZUlucHV0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDMsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNF9pbnB1dF8zX1RlbXBsYXRlLCAxLCAyLCAiaW5wdXQiLCAzMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJkaXYiLCAzMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoNiwgIlYiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDgsICJBIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJyZyIsIDEwMCkoInZhbHVlIiwgY3R4X3IxMi5oc2xhVGV4dCA9PSBudWxsID8gbnVsbCA6IGN0eF9yMTIuaHNsYVRleHQubCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxMi5jcEFscGhhQ2hhbm5lbCAhPT0gImRpc2FibGVkIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjc3ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNDIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCA0Myk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNV9UZW1wbGF0ZV9zcGFuX2NsaWNrXzFfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjc3KTsgY29uc3QgY3R4X3I3NiA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I3Ni5vbkZvcm1hdFRvZ2dsZSgwIC0gMSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAic3BhbiIsIDQzKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI1X1RlbXBsYXRlX3NwYW5fY2xpY2tfMl9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yNzcpOyBjb25zdCBjdHhfcjc4ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjc4Lm9uRm9ybWF0VG9nZ2xlKDEpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNl9kaXZfNF9kaXZfMV9zcGFuXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I4NSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCA1MCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNl9kaXZfNF9kaXZfMV9zcGFuXzFfVGVtcGxhdGVfc3Bhbl9jbGlja18wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I4NSk7IGNvbnN0IGNvbG9yX3I4MiA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsgY29uc3QgY3R4X3I4NCA9IMm1ybVuZXh0Q29udGV4dCgzKTsgcmV0dXJuIGN0eF9yODQub25SZW1vdmVQcmVzZXRDb2xvcigkZXZlbnQsIGNvbG9yX3I4Mik7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjgzID0gybXJtW5leHRDb250ZXh0KDQpOwogICAgICAgIMm1ybVjbGFzc01hcChjdHhfcjgzLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNl9kaXZfNF9kaXZfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjg4ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNDgpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjZfZGl2XzRfZGl2XzFfVGVtcGxhdGVfZGl2X2NsaWNrXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjg4KTsgY29uc3QgY29sb3JfcjgyID0gY3R4LiRpbXBsaWNpdDsgY29uc3QgY3R4X3I4NyA9IMm1ybVuZXh0Q29udGV4dCgzKTsgcmV0dXJuIGN0eF9yODcuc2V0Q29sb3JGcm9tU3RyaW5nKGNvbG9yX3I4Mik7IH0pOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjZfZGl2XzRfZGl2XzFfc3Bhbl8xX1RlbXBsYXRlLCAxLCAzLCAic3BhbiIsIDQ5KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY29sb3JfcjgyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBjdHhfcjgxID0gybXJtW5leHRDb250ZXh0KDMpOwogICAgICAgIMm1ybVzdHlsZVByb3AoImJhY2tncm91bmQtY29sb3IiLCBjb2xvcl9yODIpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yODEuY3BBZGRDb2xvckJ1dHRvbik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNl9kaXZfNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMSwgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI2X2Rpdl80X2Rpdl8xX1RlbXBsYXRlLCAyLCAzLCAiZGl2IiwgNDcpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjc5ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVjbGFzc01hcChjdHhfcjc5LmNwUHJlc2V0Q29sb3JzQ2xhc3MpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eF9yNzkuY3BQcmVzZXRDb2xvcnMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjZfZGl2XzVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yODAgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWNsYXNzTWFwKGN0eF9yODAuY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHhfcjgwLmNwUHJlc2V0RW1wdHlNZXNzYWdlKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI2X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDQ0KTsKICAgICAgICDJtcm1ZWxlbWVudCgxLCAiaHIiKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCA0NSk7CiAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNCwgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI2X2Rpdl80X1RlbXBsYXRlLCAyLCA0LCAiZGl2IiwgNDYpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjZfZGl2XzVfVGVtcGxhdGUsIDIsIDQsICJkaXYiLCA0Nik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMTQgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yMTQuY3BQcmVzZXRMYWJlbCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxNC5jcFByZXNldENvbG9ycyA9PSBudWxsID8gbnVsbCA6IGN0eF9yMTQuY3BQcmVzZXRDb2xvcnMubGVuZ3RoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhKGN0eF9yMTQuY3BQcmVzZXRDb2xvcnMgPT0gbnVsbCA/IG51bGwgOiBjdHhfcjE0LmNwUHJlc2V0Q29sb3JzLmxlbmd0aCkgJiYgY3R4X3IxNC5jcEFkZENvbG9yQnV0dG9uKTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI3X2J1dHRvbl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yOTIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCA1Myk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yN19idXR0b25fMV9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yOTIpOyBjb25zdCBjdHhfcjkxID0gybXJtW5leHRDb250ZXh0KDIpOyByZXR1cm4gY3R4X3I5MS5vbkNhbmNlbENvbG9yKCRldmVudCk7IH0pOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjg5ID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVjbGFzc01hcChjdHhfcjg5LmNwQ2FuY2VsQnV0dG9uQ2xhc3MpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4X3I4OS5jcENhbmNlbEJ1dHRvblRleHQpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjdfYnV0dG9uXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I5NCA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImJ1dHRvbiIsIDUzKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI3X2J1dHRvbl8yX1RlbXBsYXRlX2J1dHRvbl9jbGlja18wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I5NCk7IGNvbnN0IGN0eF9yOTMgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjkzLm9uQWNjZXB0Q29sb3IoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yOTAgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWNsYXNzTWFwKGN0eF9yOTAuY3BPS0J1dHRvbkNsYXNzKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eF9yOTAuY3BPS0J1dHRvblRleHQpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjdfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNTEpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjdfYnV0dG9uXzFfVGVtcGxhdGUsIDIsIDQsICJidXR0b24iLCA1Mik7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yN19idXR0b25fMl9UZW1wbGF0ZSwgMiwgNCwgImJ1dHRvbiIsIDUyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxNSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMTUuY3BDYW5jZWxCdXR0b24pOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMTUuY3BPS0J1dHRvbik7CiAgICB9IH0KICAgIHZhciBDb2xvckZvcm1hdHM7CiAgICAoZnVuY3Rpb24gKENvbG9yRm9ybWF0cykgewogICAgICAgIENvbG9yRm9ybWF0c1tDb2xvckZvcm1hdHNbIkhFWCJdID0gMF0gPSAiSEVYIjsKICAgICAgICBDb2xvckZvcm1hdHNbQ29sb3JGb3JtYXRzWyJSR0JBIl0gPSAxXSA9ICJSR0JBIjsKICAgICAgICBDb2xvckZvcm1hdHNbQ29sb3JGb3JtYXRzWyJIU0xBIl0gPSAyXSA9ICJIU0xBIjsKICAgICAgICBDb2xvckZvcm1hdHNbQ29sb3JGb3JtYXRzWyJDTVlLIl0gPSAzXSA9ICJDTVlLIjsKICAgIH0pKENvbG9yRm9ybWF0cyB8fCAoQ29sb3JGb3JtYXRzID0ge30pKTsKICAgIGNsYXNzIFJnYmEgewogICAgICAgIGNvbnN0cnVjdG9yKHIsIGcsIGIsIGEpIHsKICAgICAgICAgICAgdGhpcy5yID0gcjsKICAgICAgICAgICAgdGhpcy5nID0gZzsKICAgICAgICAgICAgdGhpcy5iID0gYjsKICAgICAgICAgICAgdGhpcy5hID0gYTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBIc3ZhIHsKICAgICAgICBjb25zdHJ1Y3RvcihoLCBzLCB2LCBhKSB7CiAgICAgICAgICAgIHRoaXMuaCA9IGg7CiAgICAgICAgICAgIHRoaXMucyA9IHM7CiAgICAgICAgICAgIHRoaXMudiA9IHY7CiAgICAgICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgfQogICAgfQogICAgY2xhc3MgSHNsYSB7CiAgICAgICAgY29uc3RydWN0b3IoaCwgcywgbCwgYSkgewogICAgICAgICAgICB0aGlzLmggPSBoOwogICAgICAgICAgICB0aGlzLnMgPSBzOwogICAgICAgICAgICB0aGlzLmwgPSBsOwogICAgICAgICAgICB0aGlzLmEgPSBhOwogICAgICAgIH0KICAgIH0KICAgIGNsYXNzIENteWsgewogICAgICAgIGNvbnN0cnVjdG9yKGMsIG0sIHksIGssIGEgPSAxKSB7CiAgICAgICAgICAgIHRoaXMuYyA9IGM7CiAgICAgICAgICAgIHRoaXMubSA9IG07CiAgICAgICAgICAgIHRoaXMueSA9IHk7CiAgICAgICAgICAgIHRoaXMuayA9IGs7CiAgICAgICAgICAgIHRoaXMuYSA9IGE7CiAgICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRldGVjdElFKCkgewogICAgICAgIGxldCB1YSA9ICcnOwogICAgICAgIGlmICh0eXBlb2YgbmF2aWdhdG9yICE9PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICB1YSA9IG5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgbXNpZSA9IHVhLmluZGV4T2YoJ21zaWUgJyk7CiAgICAgICAgaWYgKG1zaWUgPiAwKSB7CiAgICAgICAgICAgIC8vIElFIDEwIG9yIG9sZGVyID0+IHJldHVybiB2ZXJzaW9uIG51bWJlcgogICAgICAgICAgICByZXR1cm4gcGFyc2VJbnQodWEuc3Vic3RyaW5nKG1zaWUgKyA1LCB1YS5pbmRleE9mKCcuJywgbXNpZSkpLCAxMCk7CiAgICAgICAgfQogICAgICAgIC8vIE90aGVyIGJyb3dzZXIKICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9CiAgICBsZXQgVGV4dERpcmVjdGl2ZSA9IGNsYXNzIFRleHREaXJlY3RpdmUgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm5ld1ZhbHVlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgICAgICBpbnB1dENoYW5nZShldmVudCkgewogICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGV2ZW50LnRhcmdldC52YWx1ZTsKICAgICAgICAgICAgaWYgKHRoaXMucmcgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgdGhpcy5uZXdWYWx1ZS5lbWl0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IG51bWVyaWMgPSBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMubmV3VmFsdWUuZW1pdCh7IHY6IG51bWVyaWMsIHJnOiB0aGlzLnJnIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfTsKICAgIFRleHREaXJlY3RpdmUuybVmYWMgPSBmdW5jdGlvbiBUZXh0RGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRleHREaXJlY3RpdmUpKCk7IH07CiAgICBUZXh0RGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IFRleHREaXJlY3RpdmUsIHNlbGVjdG9yczogW1siIiwgInRleHQiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFRleHREaXJlY3RpdmVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gVGV4dERpcmVjdGl2ZV9pbnB1dF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHguaW5wdXRDaGFuZ2UoJGV2ZW50KTsgfSk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgcmc6ICJyZyIsIHRleHQ6ICJ0ZXh0IiB9LCBvdXRwdXRzOiB7IG5ld1ZhbHVlOiAibmV3VmFsdWUiIH0gfSk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBUZXh0RGlyZWN0aXZlLnByb3RvdHlwZSwgInJnIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIFRleHREaXJlY3RpdmUucHJvdG90eXBlLCAidGV4dCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBPdXRwdXQoKQogICAgXSwgVGV4dERpcmVjdGl2ZS5wcm90b3R5cGUsICJuZXdWYWx1ZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSkKICAgIF0sIFRleHREaXJlY3RpdmUucHJvdG90eXBlLCAiaW5wdXRDaGFuZ2UiLCBudWxsKTsKICAgIGxldCBTbGlkZXJEaXJlY3RpdmUgPSBjbGFzcyBTbGlkZXJEaXJlY3RpdmUgewogICAgICAgIGNvbnN0cnVjdG9yKGVsUmVmKSB7CiAgICAgICAgICAgIHRoaXMuZWxSZWYgPSBlbFJlZjsKICAgICAgICAgICAgdGhpcy5kcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5uZXdWYWx1ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5saXN0ZW5lck1vdmUgPSAoZXZlbnQpID0+IHRoaXMubW92ZShldmVudCk7CiAgICAgICAgICAgIHRoaXMubGlzdGVuZXJTdG9wID0gKCkgPT4gdGhpcy5zdG9wKCk7CiAgICAgICAgfQogICAgICAgIG1vdXNlRG93bihldmVudCkgewogICAgICAgICAgICB0aGlzLnN0YXJ0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgdG91Y2hTdGFydChldmVudCkgewogICAgICAgICAgICB0aGlzLnN0YXJ0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgbW92ZShldmVudCkgewogICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB0aGlzLnNldEN1cnNvcihldmVudCk7CiAgICAgICAgfQogICAgICAgIHN0YXJ0KGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuc2V0Q3Vyc29yKGV2ZW50KTsKICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ21vdXNldXAnLCB0aGlzLmxpc3RlbmVyU3RvcCk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNoZW5kJywgdGhpcy5saXN0ZW5lclN0b3ApOwogICAgICAgICAgICBkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCdtb3VzZW1vdmUnLCB0aGlzLmxpc3RlbmVyTW92ZSk7CiAgICAgICAgICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ3RvdWNobW92ZScsIHRoaXMubGlzdGVuZXJNb3ZlKTsKICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnQuZW1pdCgpOwogICAgICAgIH0KICAgICAgICBzdG9wKCkgewogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdtb3VzZXVwJywgdGhpcy5saXN0ZW5lclN0b3ApOwogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaGVuZCcsIHRoaXMubGlzdGVuZXJTdG9wKTsKICAgICAgICAgICAgZG9jdW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcignbW91c2Vtb3ZlJywgdGhpcy5saXN0ZW5lck1vdmUpOwogICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd0b3VjaG1vdmUnLCB0aGlzLmxpc3RlbmVyTW92ZSk7CiAgICAgICAgICAgIHRoaXMuZHJhZ0VuZC5lbWl0KCk7CiAgICAgICAgfQogICAgICAgIGdldFgoZXZlbnQpIHsKICAgICAgICAgICAgY29uc3QgcG9zaXRpb24gPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7CiAgICAgICAgICAgIGNvbnN0IHBhZ2VYID0gKGV2ZW50LnBhZ2VYICE9PSB1bmRlZmluZWQpID8gZXZlbnQucGFnZVggOiBldmVudC50b3VjaGVzWzBdLnBhZ2VYOwogICAgICAgICAgICByZXR1cm4gcGFnZVggLSBwb3NpdGlvbi5sZWZ0IC0gd2luZG93LnBhZ2VYT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBnZXRZKGV2ZW50KSB7CiAgICAgICAgICAgIGNvbnN0IHBvc2l0aW9uID0gdGhpcy5lbFJlZi5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICAgICAgICBjb25zdCBwYWdlWSA9IChldmVudC5wYWdlWSAhPT0gdW5kZWZpbmVkKSA/IGV2ZW50LnBhZ2VZIDogZXZlbnQudG91Y2hlc1swXS5wYWdlWTsKICAgICAgICAgICAgcmV0dXJuIHBhZ2VZIC0gcG9zaXRpb24udG9wIC0gd2luZG93LnBhZ2VZT2Zmc2V0OwogICAgICAgIH0KICAgICAgICBzZXRDdXJzb3IoZXZlbnQpIHsKICAgICAgICAgICAgY29uc3Qgd2lkdGggPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGg7CiAgICAgICAgICAgIGNvbnN0IGhlaWdodCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRIZWlnaHQ7CiAgICAgICAgICAgIGNvbnN0IHggPSBNYXRoLm1heCgwLCBNYXRoLm1pbih0aGlzLmdldFgoZXZlbnQpLCB3aWR0aCkpOwogICAgICAgICAgICBjb25zdCB5ID0gTWF0aC5tYXgoMCwgTWF0aC5taW4odGhpcy5nZXRZKGV2ZW50KSwgaGVpZ2h0KSk7CiAgICAgICAgICAgIGlmICh0aGlzLnJnWCAhPT0gdW5kZWZpbmVkICYmIHRoaXMucmdZICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMubmV3VmFsdWUuZW1pdCh7IHM6IHggLyB3aWR0aCwgdjogKDEgLSB5IC8gaGVpZ2h0KSwgcmdYOiB0aGlzLnJnWCwgcmdZOiB0aGlzLnJnWSB9KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnJnWCA9PT0gdW5kZWZpbmVkICYmIHRoaXMucmdZICE9PSB1bmRlZmluZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMubmV3VmFsdWUuZW1pdCh7IHY6IHkgLyBoZWlnaHQsIHJnWTogdGhpcy5yZ1kgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5yZ1ggIT09IHVuZGVmaW5lZCAmJiB0aGlzLnJnWSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5ld1ZhbHVlLmVtaXQoeyB2OiB4IC8gd2lkdGgsIHJnWDogdGhpcy5yZ1ggfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9OwogICAgU2xpZGVyRGlyZWN0aXZlLsm1ZmFjID0gZnVuY3Rpb24gU2xpZGVyRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNsaWRlckRpcmVjdGl2ZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICBTbGlkZXJEaXJlY3RpdmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogU2xpZGVyRGlyZWN0aXZlLCBzZWxlY3RvcnM6IFtbIiIsICJzbGlkZXIiLCAiIl1dLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFNsaWRlckRpcmVjdGl2ZV9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigibW91c2Vkb3duIiwgZnVuY3Rpb24gU2xpZGVyRGlyZWN0aXZlX21vdXNlZG93bl9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHgubW91c2VEb3duKCRldmVudCk7IH0pKCJ0b3VjaHN0YXJ0IiwgZnVuY3Rpb24gU2xpZGVyRGlyZWN0aXZlX3RvdWNoc3RhcnRfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4LnRvdWNoU3RhcnQoJGV2ZW50KTsgfSk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgcmdYOiAicmdYIiwgcmdZOiAicmdZIiwgc2xpZGVyOiAic2xpZGVyIiB9LCBvdXRwdXRzOiB7IGRyYWdFbmQ6ICJkcmFnRW5kIiwgZHJhZ1N0YXJ0OiAiZHJhZ1N0YXJ0IiwgbmV3VmFsdWU6ICJuZXdWYWx1ZSIgfSB9KTsKICAgIFNsaWRlckRpcmVjdGl2ZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIFNsaWRlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJyZ1giLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgU2xpZGVyRGlyZWN0aXZlLnByb3RvdHlwZSwgInJnWSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBTbGlkZXJEaXJlY3RpdmUucHJvdG90eXBlLCAic2xpZGVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIE91dHB1dCgpCiAgICBdLCBTbGlkZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiZHJhZ0VuZCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBPdXRwdXQoKQogICAgXSwgU2xpZGVyRGlyZWN0aXZlLnByb3RvdHlwZSwgImRyYWdTdGFydCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBPdXRwdXQoKQogICAgXSwgU2xpZGVyRGlyZWN0aXZlLnByb3RvdHlwZSwgIm5ld1ZhbHVlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIEhvc3RMaXN0ZW5lcignbW91c2Vkb3duJywgWyckZXZlbnQnXSkKICAgIF0sIFNsaWRlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJtb3VzZURvd24iLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIEhvc3RMaXN0ZW5lcigndG91Y2hzdGFydCcsIFsnJGV2ZW50J10pCiAgICBdLCBTbGlkZXJEaXJlY3RpdmUucHJvdG90eXBlLCAidG91Y2hTdGFydCIsIG51bGwpOwogICAgY2xhc3MgU2xpZGVyUG9zaXRpb24gewogICAgICAgIGNvbnN0cnVjdG9yKGgsIHMsIHYsIGEpIHsKICAgICAgICAgICAgdGhpcy5oID0gaDsKICAgICAgICAgICAgdGhpcy5zID0gczsKICAgICAgICAgICAgdGhpcy52ID0gdjsKICAgICAgICAgICAgdGhpcy5hID0gYTsKICAgICAgICB9CiAgICB9CiAgICBjbGFzcyBTbGlkZXJEaW1lbnNpb24gewogICAgICAgIGNvbnN0cnVjdG9yKGgsIHMsIHYsIGEpIHsKICAgICAgICAgICAgdGhpcy5oID0gaDsKICAgICAgICAgICAgdGhpcy5zID0gczsKICAgICAgICAgICAgdGhpcy52ID0gdjsKICAgICAgICAgICAgdGhpcy5hID0gYTsKICAgICAgICB9CiAgICB9CgogICAgbGV0IENvbG9yUGlja2VyU2VydmljZSA9IGNsYXNzIENvbG9yUGlja2VyU2VydmljZSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gbnVsbDsKICAgICAgICB9CiAgICAgICAgc2V0QWN0aXZlKGFjdGl2ZSkgewogICAgICAgICAgICBpZiAodGhpcy5hY3RpdmUgJiYgdGhpcy5hY3RpdmUgIT09IGFjdGl2ZSAmJiB0aGlzLmFjdGl2ZS5jcERpYWxvZ0Rpc3BsYXkgIT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZS5jbG9zZURpYWxvZygpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYWN0aXZlID0gYWN0aXZlOwogICAgICAgIH0KICAgICAgICBoc3ZhMmhzbGEoaHN2YSkgewogICAgICAgICAgICBjb25zdCBoID0gaHN2YS5oLCBzID0gaHN2YS5zLCB2ID0gaHN2YS52LCBhID0gaHN2YS5hOwogICAgICAgICAgICBpZiAodiA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIc2xhKGgsIDAsIDAsIGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHMgPT09IDAgJiYgdiA9PT0gMSkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIc2xhKGgsIDEsIDEsIGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgbCA9IHYgKiAoMiAtIHMpIC8gMjsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgSHNsYShoLCB2ICogcyAvICgxIC0gTWF0aC5hYnMoMiAqIGwgLSAxKSksIGwsIGEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGhzbGEyaHN2YShoc2xhKSB7CiAgICAgICAgICAgIGNvbnN0IGggPSBNYXRoLm1pbihoc2xhLmgsIDEpLCBzID0gTWF0aC5taW4oaHNsYS5zLCAxKTsKICAgICAgICAgICAgY29uc3QgbCA9IE1hdGgubWluKGhzbGEubCwgMSksIGEgPSBNYXRoLm1pbihoc2xhLmEsIDEpOwogICAgICAgICAgICBpZiAobCA9PT0gMCkgewogICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBIc3ZhKGgsIDAsIDAsIGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgdiA9IGwgKyBzICogKDEgLSBNYXRoLmFicygyICogbCAtIDEpKSAvIDI7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhzdmEoaCwgMiAqICh2IC0gbCkgLyB2LCB2LCBhKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBoc3ZhVG9SZ2JhKGhzdmEpIHsKICAgICAgICAgICAgbGV0IHIsIGcsIGI7CiAgICAgICAgICAgIGNvbnN0IGggPSBoc3ZhLmgsIHMgPSBoc3ZhLnMsIHYgPSBoc3ZhLnYsIGEgPSBoc3ZhLmE7CiAgICAgICAgICAgIGNvbnN0IGkgPSBNYXRoLmZsb29yKGggKiA2KTsKICAgICAgICAgICAgY29uc3QgZiA9IGggKiA2IC0gaTsKICAgICAgICAgICAgY29uc3QgcCA9IHYgKiAoMSAtIHMpOwogICAgICAgICAgICBjb25zdCBxID0gdiAqICgxIC0gZiAqIHMpOwogICAgICAgICAgICBjb25zdCB0ID0gdiAqICgxIC0gKDEgLSBmKSAqIHMpOwogICAgICAgICAgICBzd2l0Y2ggKGkgJSA2KSB7CiAgICAgICAgICAgICAgICBjYXNlIDA6CiAgICAgICAgICAgICAgICAgICAgciA9IHYsIGcgPSB0LCBiID0gcDsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICByID0gcSwgZyA9IHYsIGIgPSBwOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAyOgogICAgICAgICAgICAgICAgICAgIHIgPSBwLCBnID0gdiwgYiA9IHQ7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgciA9IHAsIGcgPSBxLCBiID0gdjsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICByID0gdCwgZyA9IHAsIGIgPSB2OwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSA1OgogICAgICAgICAgICAgICAgICAgIHIgPSB2LCBnID0gcCwgYiA9IHE7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHIgPSAwLCBnID0gMCwgYiA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBSZ2JhKHIsIGcsIGIsIGEpOwogICAgICAgIH0KICAgICAgICBjbXlrVG9SZ2IoY215aykgewogICAgICAgICAgICBjb25zdCByID0gKDEgLSBjbXlrLmMpICogKDEgLSBjbXlrLmspOwogICAgICAgICAgICBjb25zdCBnID0gKDEgLSBjbXlrLm0pICogKDEgLSBjbXlrLmspOwogICAgICAgICAgICBjb25zdCBiID0gKDEgLSBjbXlrLnkpICogKDEgLSBjbXlrLmspOwogICAgICAgICAgICByZXR1cm4gbmV3IFJnYmEociwgZywgYiwgY215ay5hKTsKICAgICAgICB9CiAgICAgICAgcmdiYVRvQ215ayhyZ2JhKSB7CiAgICAgICAgICAgIGNvbnN0IGsgPSAxIC0gTWF0aC5tYXgocmdiYS5yLCByZ2JhLmcsIHJnYmEuYik7CiAgICAgICAgICAgIGlmIChrID09PSAxKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENteWsoMCwgMCwgMCwgMSwgcmdiYS5hKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGNvbnN0IGMgPSAoMSAtIHJnYmEuciAtIGspIC8gKDEgLSBrKTsKICAgICAgICAgICAgICAgIGNvbnN0IG0gPSAoMSAtIHJnYmEuZyAtIGspIC8gKDEgLSBrKTsKICAgICAgICAgICAgICAgIGNvbnN0IHkgPSAoMSAtIHJnYmEuYiAtIGspIC8gKDEgLSBrKTsKICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ215ayhjLCBtLCB5LCBrLCByZ2JhLmEpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJnYmFUb0hzdmEocmdiYSkgewogICAgICAgICAgICBsZXQgaCwgczsKICAgICAgICAgICAgY29uc3QgciA9IE1hdGgubWluKHJnYmEuciwgMSksIGcgPSBNYXRoLm1pbihyZ2JhLmcsIDEpOwogICAgICAgICAgICBjb25zdCBiID0gTWF0aC5taW4ocmdiYS5iLCAxKSwgYSA9IE1hdGgubWluKHJnYmEuYSwgMSk7CiAgICAgICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWF4KHIsIGcsIGIpLCBtaW4gPSBNYXRoLm1pbihyLCBnLCBiKTsKICAgICAgICAgICAgY29uc3QgdiA9IG1heCwgZCA9IG1heCAtIG1pbjsKICAgICAgICAgICAgcyA9IChtYXggPT09IDApID8gMCA6IGQgLyBtYXg7CiAgICAgICAgICAgIGlmIChtYXggPT09IG1pbikgewogICAgICAgICAgICAgICAgaCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzd2l0Y2ggKG1heCkgewogICAgICAgICAgICAgICAgICAgIGNhc2UgcjoKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IChnIC0gYikgLyBkICsgKGcgPCBiID8gNiA6IDApOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICBjYXNlIGc6CiAgICAgICAgICAgICAgICAgICAgICAgIGggPSAoYiAtIHIpIC8gZCArIDI7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgYjoKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IChyIC0gZykgLyBkICsgNDsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgaCA9IDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBoIC89IDY7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG5ldyBIc3ZhKGgsIHMsIHYsIGEpOwogICAgICAgIH0KICAgICAgICByZ2JhVG9IZXgocmdiYSwgYWxsb3dIZXg4KSB7CiAgICAgICAgICAgIC8qIHRzbGludDpkaXNhYmxlOm5vLWJpdHdpc2UgKi8KICAgICAgICAgICAgbGV0IGhleCA9ICcjJyArICgoMSA8PCAyNCkgfCAocmdiYS5yIDw8IDE2KSB8IChyZ2JhLmcgPDwgOCkgfCByZ2JhLmIpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7CiAgICAgICAgICAgIGlmIChhbGxvd0hleDgpIHsKICAgICAgICAgICAgICAgIGhleCArPSAoKDEgPDwgOCkgfCBNYXRoLnJvdW5kKHJnYmEuYSAqIDI1NSkpLnRvU3RyaW5nKDE2KS5zdWJzdHIoMSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyogdHNsaW50OmVuYWJsZTpuby1iaXR3aXNlICovCiAgICAgICAgICAgIHJldHVybiBoZXg7CiAgICAgICAgfQogICAgICAgIG5vcm1hbGl6ZUNNWUsoY215aykgewogICAgICAgICAgICByZXR1cm4gbmV3IENteWsoY215ay5jIC8gMTAwLCBjbXlrLm0gLyAxMDAsIGNteWsueSAvIDEwMCwgY215ay5rIC8gMTAwLCBjbXlrLmEpOwogICAgICAgIH0KICAgICAgICBkZW5vcm1hbGl6ZUNNWUsoY215aykgewogICAgICAgICAgICByZXR1cm4gbmV3IENteWsoTWF0aC5mbG9vcihjbXlrLmMgKiAxMDApLCBNYXRoLmZsb29yKGNteWsubSAqIDEwMCksIE1hdGguZmxvb3IoY215ay55ICogMTAwKSwgTWF0aC5mbG9vcihjbXlrLmsgKiAxMDApLCBjbXlrLmEpOwogICAgICAgIH0KICAgICAgICBkZW5vcm1hbGl6ZVJHQkEocmdiYSkgewogICAgICAgICAgICByZXR1cm4gbmV3IFJnYmEoTWF0aC5yb3VuZChyZ2JhLnIgKiAyNTUpLCBNYXRoLnJvdW5kKHJnYmEuZyAqIDI1NSksIE1hdGgucm91bmQocmdiYS5iICogMjU1KSwgcmdiYS5hKTsKICAgICAgICB9CiAgICAgICAgc3RyaW5nVG9Ic3ZhKGNvbG9yU3RyaW5nID0gJycsIGFsbG93SGV4OCA9IGZhbHNlKSB7CiAgICAgICAgICAgIGxldCBoc3ZhID0gbnVsbDsKICAgICAgICAgICAgY29sb3JTdHJpbmcgPSAoY29sb3JTdHJpbmcgfHwgJycpLnRvTG93ZXJDYXNlKCk7CiAgICAgICAgICAgIGNvbnN0IHN0cmluZ1BhcnNlcnMgPSBbCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcmU6IC8ocmdiKWE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pXHMqJT8sXHMqKFxkezEsM30pXHMqJT8oPzosXHMqKFxkKyg/OlwuXGQrKT8pXHMqKT9cKS8sCiAgICAgICAgICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChleGVjUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmdiYShwYXJzZUludChleGVjUmVzdWx0WzJdLCAxMCkgLyAyNTUsIHBhcnNlSW50KGV4ZWNSZXN1bHRbM10sIDEwKSAvIDI1NSwgcGFyc2VJbnQoZXhlY1Jlc3VsdFs0XSwgMTApIC8gMjU1LCBpc05hTihwYXJzZUZsb2F0KGV4ZWNSZXN1bHRbNV0pKSA/IDEgOiBwYXJzZUZsb2F0KGV4ZWNSZXN1bHRbNV0pKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9LCB7CiAgICAgICAgICAgICAgICAgICAgcmU6IC8oaHNsKWE/XChccyooXGR7MSwzfSlccyosXHMqKFxkezEsM30pJVxzKixccyooXGR7MSwzfSklXHMqKD86LFxzKihcZCsoPzpcLlxkKyk/KVxzKik/XCkvLAogICAgICAgICAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoZXhlY1Jlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEhzbGEocGFyc2VJbnQoZXhlY1Jlc3VsdFsyXSwgMTApIC8gMzYwLCBwYXJzZUludChleGVjUmVzdWx0WzNdLCAxMCkgLyAxMDAsIHBhcnNlSW50KGV4ZWNSZXN1bHRbNF0sIDEwKSAvIDEwMCwgaXNOYU4ocGFyc2VGbG9hdChleGVjUmVzdWx0WzVdKSkgPyAxIDogcGFyc2VGbG9hdChleGVjUmVzdWx0WzVdKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICBdOwogICAgICAgICAgICBpZiAoYWxsb3dIZXg4KSB7CiAgICAgICAgICAgICAgICBzdHJpbmdQYXJzZXJzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHJlOiAvIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KShbYS1mQS1GMC05XXsyfSk/JC8sCiAgICAgICAgICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChleGVjUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUmdiYShwYXJzZUludChleGVjUmVzdWx0WzFdLCAxNikgLyAyNTUsIHBhcnNlSW50KGV4ZWNSZXN1bHRbMl0sIDE2KSAvIDI1NSwgcGFyc2VJbnQoZXhlY1Jlc3VsdFszXSwgMTYpIC8gMjU1LCBwYXJzZUludChleGVjUmVzdWx0WzRdIHx8ICdGRicsIDE2KSAvIDI1NSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBzdHJpbmdQYXJzZXJzLnB1c2goewogICAgICAgICAgICAgICAgICAgIHJlOiAvIyhbYS1mQS1GMC05XXsyfSkoW2EtZkEtRjAtOV17Mn0pKFthLWZBLUYwLTldezJ9KSQvLAogICAgICAgICAgICAgICAgICAgIHBhcnNlOiBmdW5jdGlvbiAoZXhlY1Jlc3VsdCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJnYmEocGFyc2VJbnQoZXhlY1Jlc3VsdFsxXSwgMTYpIC8gMjU1LCBwYXJzZUludChleGVjUmVzdWx0WzJdLCAxNikgLyAyNTUsIHBhcnNlSW50KGV4ZWNSZXN1bHRbM10sIDE2KSAvIDI1NSwgMSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3RyaW5nUGFyc2Vycy5wdXNoKHsKICAgICAgICAgICAgICAgIHJlOiAvIyhbYS1mQS1GMC05XSkoW2EtZkEtRjAtOV0pKFthLWZBLUYwLTldKSQvLAogICAgICAgICAgICAgICAgcGFyc2U6IGZ1bmN0aW9uIChleGVjUmVzdWx0KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSZ2JhKHBhcnNlSW50KGV4ZWNSZXN1bHRbMV0gKyBleGVjUmVzdWx0WzFdLCAxNikgLyAyNTUsIHBhcnNlSW50KGV4ZWNSZXN1bHRbMl0gKyBleGVjUmVzdWx0WzJdLCAxNikgLyAyNTUsIHBhcnNlSW50KGV4ZWNSZXN1bHRbM10gKyBleGVjUmVzdWx0WzNdLCAxNikgLyAyNTUsIDEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KTsKICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gc3RyaW5nUGFyc2VycykgewogICAgICAgICAgICAgICAgaWYgKHN0cmluZ1BhcnNlcnMuaGFzT3duUHJvcGVydHkoa2V5KSkgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcnNlciA9IHN0cmluZ1BhcnNlcnNba2V5XTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRjaCA9IHBhcnNlci5yZS5leGVjKGNvbG9yU3RyaW5nKSwgY29sb3IgPSBtYXRjaCAmJiBwYXJzZXIucGFyc2UobWF0Y2gpOwogICAgICAgICAgICAgICAgICAgIGlmIChjb2xvcikgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29sb3IgaW5zdGFuY2VvZiBSZ2JhKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoc3ZhID0gdGhpcy5yZ2JhVG9Ic3ZhKGNvbG9yKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb2xvciBpbnN0YW5jZW9mIEhzbGEpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhzdmEgPSB0aGlzLmhzbGEyaHN2YShjb2xvcik7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhzdmE7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBoc3ZhOwogICAgICAgIH0KICAgICAgICBvdXRwdXRGb3JtYXQoaHN2YSwgb3V0cHV0Rm9ybWF0LCBhbHBoYUNoYW5uZWwpIHsKICAgICAgICAgICAgaWYgKG91dHB1dEZvcm1hdCA9PT0gJ2F1dG8nKSB7CiAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQgPSBoc3ZhLmEgPCAxID8gJ3JnYmEnIDogJ2hleCc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgc3dpdGNoIChvdXRwdXRGb3JtYXQpIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2hzbGEnOgogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhzbGEgPSB0aGlzLmhzdmEyaHNsYShoc3ZhKTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBoc2xhVGV4dCA9IG5ldyBIc2xhKE1hdGgucm91bmQoKGhzbGEuaCkgKiAzNjApLCBNYXRoLnJvdW5kKGhzbGEucyAqIDEwMCksIE1hdGgucm91bmQoaHNsYS5sICogMTAwKSwgTWF0aC5yb3VuZChoc2xhLmEgKiAxMDApIC8gMTAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaHN2YS5hIDwgMSB8fCBhbHBoYUNoYW5uZWwgPT09ICdhbHdheXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaHNsYSgnICsgaHNsYVRleHQuaCArICcsJyArIGhzbGFUZXh0LnMgKyAnJSwnICsgaHNsYVRleHQubCArICclLCcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgaHNsYVRleHQuYSArICcpJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAnaHNsKCcgKyBoc2xhVGV4dC5oICsgJywnICsgaHNsYVRleHQucyArICclLCcgKyBoc2xhVGV4dC5sICsgJyUpJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXNlICdyZ2JhJzoKICAgICAgICAgICAgICAgICAgICBjb25zdCByZ2JhID0gdGhpcy5kZW5vcm1hbGl6ZVJHQkEodGhpcy5oc3ZhVG9SZ2JhKGhzdmEpKTsKICAgICAgICAgICAgICAgICAgICBpZiAoaHN2YS5hIDwgMSB8fCBhbHBoYUNoYW5uZWwgPT09ICdhbHdheXMnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAncmdiYSgnICsgcmdiYS5yICsgJywnICsgcmdiYS5nICsgJywnICsgcmdiYS5iICsgJywnICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGgucm91bmQocmdiYS5hICogMTAwKSAvIDEwMCArICcpJzsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAncmdiKCcgKyByZ2JhLnIgKyAnLCcgKyByZ2JhLmcgKyAnLCcgKyByZ2JhLmIgKyAnKSc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICBjb25zdCBhbGxvd0hleDggPSAoYWxwaGFDaGFubmVsID09PSAnYWx3YXlzJyB8fCBhbHBoYUNoYW5uZWwgPT09ICdmb3JjZWQnKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5yZ2JhVG9IZXgodGhpcy5kZW5vcm1hbGl6ZVJHQkEodGhpcy5oc3ZhVG9SZ2JhKGhzdmEpKSwgYWxsb3dIZXg4KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH07CiAgICBDb2xvclBpY2tlclNlcnZpY2UuybVmYWMgPSBmdW5jdGlvbiBDb2xvclBpY2tlclNlcnZpY2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29sb3JQaWNrZXJTZXJ2aWNlKSgpOyB9OwogICAgQ29sb3JQaWNrZXJTZXJ2aWNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IENvbG9yUGlja2VyU2VydmljZSwgZmFjdG9yeTogQ29sb3JQaWNrZXJTZXJ2aWNlLsm1ZmFjIH0pOwoKICAgIGxldCBDb2xvclBpY2tlckNvbXBvbmVudCA9IGNsYXNzIENvbG9yUGlja2VyQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcihlbFJlZiwgY2RSZWYsIHNlcnZpY2UpIHsKICAgICAgICAgICAgdGhpcy5lbFJlZiA9IGVsUmVmOwogICAgICAgICAgICB0aGlzLmNkUmVmID0gY2RSZWY7CiAgICAgICAgICAgIHRoaXMuc2VydmljZSA9IHNlcnZpY2U7CiAgICAgICAgICAgIHRoaXMuaXNJRTEwID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nQXJyb3dTaXplID0gMTA7CiAgICAgICAgICAgIHRoaXMuZGlhbG9nQXJyb3dPZmZzZXQgPSAxNTsKICAgICAgICAgICAgdGhpcy5kaWFsb2dJbnB1dEZpZWxkcyA9IFsKICAgICAgICAgICAgICAgIENvbG9yRm9ybWF0cy5IRVgsCiAgICAgICAgICAgICAgICBDb2xvckZvcm1hdHMuUkdCQSwKICAgICAgICAgICAgICAgIENvbG9yRm9ybWF0cy5IU0xBLAogICAgICAgICAgICAgICAgQ29sb3JGb3JtYXRzLkNNWUsKICAgICAgICAgICAgXTsKICAgICAgICAgICAgdGhpcy51c2VSb290Vmlld0NvbnRhaW5lciA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICBoYW5kbGVFc2MoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2hvdyAmJiB0aGlzLmNwRGlhbG9nRGlzcGxheSA9PT0gJ3BvcHVwJykgewogICAgICAgICAgICAgICAgdGhpcy5vbkNhbmNlbENvbG9yKGV2ZW50KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBoYW5kbGVFbnRlcihldmVudCkgewogICAgICAgICAgICBpZiAodGhpcy5zaG93ICYmIHRoaXMuY3BEaWFsb2dEaXNwbGF5ID09PSAncG9wdXAnKSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uQWNjZXB0Q29sb3IoZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLnNsaWRlciA9IG5ldyBTbGlkZXJQb3NpdGlvbigwLCAwLCAwLCAwKTsKICAgICAgICAgICAgY29uc3QgaHVlV2lkdGggPSB0aGlzLmh1ZVNsaWRlci5uYXRpdmVFbGVtZW50Lm9mZnNldFdpZHRoIHx8IDE0MDsKICAgICAgICAgICAgY29uc3QgYWxwaGFXaWR0aCA9IHRoaXMuYWxwaGFTbGlkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxNDA7CiAgICAgICAgICAgIHRoaXMuc2xpZGVyRGltTWF4ID0gbmV3IFNsaWRlckRpbWVuc2lvbihodWVXaWR0aCwgdGhpcy5jcFdpZHRoLCAxMzAsIGFscGhhV2lkdGgpOwogICAgICAgICAgICBpZiAodGhpcy5jcENteWtFbmFibGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdCA9IENvbG9yRm9ybWF0cy5DTVlLOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuY3BPdXRwdXRGb3JtYXQgPT09ICdyZ2JhJykgewogICAgICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSBDb2xvckZvcm1hdHMuUkdCQTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNwT3V0cHV0Rm9ybWF0ID09PSAnaHNsYScpIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9ybWF0ID0gQ29sb3JGb3JtYXRzLkhTTEE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmZvcm1hdCA9IENvbG9yRm9ybWF0cy5IRVg7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5saXN0ZW5lck1vdXNlRG93biA9IChldmVudCkgPT4geyB0aGlzLm9uTW91c2VEb3duKGV2ZW50KTsgfTsKICAgICAgICAgICAgdGhpcy5saXN0ZW5lclJlc2l6ZSA9ICgpID0+IHsgdGhpcy5vblJlc2l6ZSgpOyB9OwogICAgICAgICAgICB0aGlzLm9wZW5EaWFsb2codGhpcy5pbml0aWFsQ29sb3IsIGZhbHNlKTsKICAgICAgICB9CiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTsKICAgICAgICB9CiAgICAgICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgICAgICBpZiAodGhpcy5jcFdpZHRoICE9PSAyMzAgfHwgdGhpcy5jcERpYWxvZ0Rpc3BsYXkgPT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICBjb25zdCBodWVXaWR0aCA9IHRoaXMuaHVlU2xpZGVyLm5hdGl2ZUVsZW1lbnQub2Zmc2V0V2lkdGggfHwgMTQwOwogICAgICAgICAgICAgICAgY29uc3QgYWxwaGFXaWR0aCA9IHRoaXMuYWxwaGFTbGlkZXIubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aCB8fCAxNDA7CiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckRpbU1heCA9IG5ldyBTbGlkZXJEaW1lbnNpb24oaHVlV2lkdGgsIHRoaXMuY3BXaWR0aCwgMTMwLCBhbHBoYVdpZHRoKTsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoZmFsc2UpOwogICAgICAgICAgICAgICAgdGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb3BlbkRpYWxvZyhjb2xvciwgZW1pdCA9IHRydWUpIHsKICAgICAgICAgICAgdGhpcy5zZXJ2aWNlLnNldEFjdGl2ZSh0aGlzKTsKICAgICAgICAgICAgaWYgKCF0aGlzLndpZHRoKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNwV2lkdGggPSB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5vZmZzZXRXaWR0aDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoIXRoaXMuaGVpZ2h0KSB7CiAgICAgICAgICAgICAgICB0aGlzLmhlaWdodCA9IDMyMDsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNldEluaXRpYWxDb2xvcihjb2xvcik7CiAgICAgICAgICAgIHRoaXMuc2V0Q29sb3JGcm9tU3RyaW5nKGNvbG9yLCBlbWl0KTsKICAgICAgICAgICAgdGhpcy5vcGVuQ29sb3JQaWNrZXIoKTsKICAgICAgICB9CiAgICAgICAgY2xvc2VEaWFsb2coKSB7CiAgICAgICAgICAgIHRoaXMuY2xvc2VDb2xvclBpY2tlcigpOwogICAgICAgIH0KICAgICAgICBzZXR1cERpYWxvZyhpbnN0YW5jZSwgZWxlbWVudFJlZiwgY29sb3IsIGNwV2lkdGgsIGNwSGVpZ2h0LCBjcERpYWxvZ0Rpc3BsYXksIGNwRmFsbGJhY2tDb2xvciwgY3BDb2xvck1vZGUsIGNwQ215a0VuYWJsZWQsIGNwQWxwaGFDaGFubmVsLCBjcE91dHB1dEZvcm1hdCwgY3BEaXNhYmxlSW5wdXQsIGNwSWdub3JlZEVsZW1lbnRzLCBjcFNhdmVDbGlja091dHNpZGUsIGNwQ2xvc2VDbGlja091dHNpZGUsIGNwVXNlUm9vdFZpZXdDb250YWluZXIsIGNwUG9zaXRpb24sIGNwUG9zaXRpb25PZmZzZXQsIGNwUG9zaXRpb25SZWxhdGl2ZVRvQXJyb3csIGNwUHJlc2V0TGFiZWwsIGNwUHJlc2V0Q29sb3JzLCBjcFByZXNldENvbG9yc0NsYXNzLCBjcE1heFByZXNldENvbG9yc0xlbmd0aCwgY3BQcmVzZXRFbXB0eU1lc3NhZ2UsIGNwUHJlc2V0RW1wdHlNZXNzYWdlQ2xhc3MsIGNwT0tCdXR0b24sIGNwT0tCdXR0b25DbGFzcywgY3BPS0J1dHRvblRleHQsIGNwQ2FuY2VsQnV0dG9uLCBjcENhbmNlbEJ1dHRvbkNsYXNzLCBjcENhbmNlbEJ1dHRvblRleHQsIGNwQWRkQ29sb3JCdXR0b24sIGNwQWRkQ29sb3JCdXR0b25DbGFzcywgY3BBZGRDb2xvckJ1dHRvblRleHQsIGNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcykgewogICAgICAgICAgICB0aGlzLnNldEluaXRpYWxDb2xvcihjb2xvcik7CiAgICAgICAgICAgIHRoaXMuc2V0Q29sb3JNb2RlKGNwQ29sb3JNb2RlKTsKICAgICAgICAgICAgdGhpcy5pc0lFMTAgPSAoZGV0ZWN0SUUoKSA9PT0gMTApOwogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlID0gaW5zdGFuY2U7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZiA9IGVsZW1lbnRSZWY7CiAgICAgICAgICAgIHRoaXMuY3BEaXNhYmxlSW5wdXQgPSBjcERpc2FibGVJbnB1dDsKICAgICAgICAgICAgdGhpcy5jcENteWtFbmFibGVkID0gY3BDbXlrRW5hYmxlZDsKICAgICAgICAgICAgdGhpcy5jcEFscGhhQ2hhbm5lbCA9IGNwQWxwaGFDaGFubmVsOwogICAgICAgICAgICB0aGlzLmNwT3V0cHV0Rm9ybWF0ID0gY3BPdXRwdXRGb3JtYXQ7CiAgICAgICAgICAgIHRoaXMuY3BEaWFsb2dEaXNwbGF5ID0gY3BEaWFsb2dEaXNwbGF5OwogICAgICAgICAgICB0aGlzLmNwSWdub3JlZEVsZW1lbnRzID0gY3BJZ25vcmVkRWxlbWVudHM7CiAgICAgICAgICAgIHRoaXMuY3BTYXZlQ2xpY2tPdXRzaWRlID0gY3BTYXZlQ2xpY2tPdXRzaWRlOwogICAgICAgICAgICB0aGlzLmNwQ2xvc2VDbGlja091dHNpZGUgPSBjcENsb3NlQ2xpY2tPdXRzaWRlOwogICAgICAgICAgICB0aGlzLnVzZVJvb3RWaWV3Q29udGFpbmVyID0gY3BVc2VSb290Vmlld0NvbnRhaW5lcjsKICAgICAgICAgICAgdGhpcy53aWR0aCA9IHRoaXMuY3BXaWR0aCA9IHBhcnNlSW50KGNwV2lkdGgsIDEwKTsKICAgICAgICAgICAgdGhpcy5oZWlnaHQgPSB0aGlzLmNwSGVpZ2h0ID0gcGFyc2VJbnQoY3BIZWlnaHQsIDEwKTsKICAgICAgICAgICAgdGhpcy5jcFBvc2l0aW9uID0gY3BQb3NpdGlvbjsKICAgICAgICAgICAgdGhpcy5jcFBvc2l0aW9uT2Zmc2V0ID0gcGFyc2VJbnQoY3BQb3NpdGlvbk9mZnNldCwgMTApOwogICAgICAgICAgICB0aGlzLmNwT0tCdXR0b24gPSBjcE9LQnV0dG9uOwogICAgICAgICAgICB0aGlzLmNwT0tCdXR0b25UZXh0ID0gY3BPS0J1dHRvblRleHQ7CiAgICAgICAgICAgIHRoaXMuY3BPS0J1dHRvbkNsYXNzID0gY3BPS0J1dHRvbkNsYXNzOwogICAgICAgICAgICB0aGlzLmNwQ2FuY2VsQnV0dG9uID0gY3BDYW5jZWxCdXR0b247CiAgICAgICAgICAgIHRoaXMuY3BDYW5jZWxCdXR0b25UZXh0ID0gY3BDYW5jZWxCdXR0b25UZXh0OwogICAgICAgICAgICB0aGlzLmNwQ2FuY2VsQnV0dG9uQ2xhc3MgPSBjcENhbmNlbEJ1dHRvbkNsYXNzOwogICAgICAgICAgICB0aGlzLmZhbGxiYWNrQ29sb3IgPSBjcEZhbGxiYWNrQ29sb3IgfHwgJyNmZmYnOwogICAgICAgICAgICB0aGlzLnNldFByZXNldENvbmZpZyhjcFByZXNldExhYmVsLCBjcFByZXNldENvbG9ycyk7CiAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRDb2xvcnNDbGFzcyA9IGNwUHJlc2V0Q29sb3JzQ2xhc3M7CiAgICAgICAgICAgIHRoaXMuY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGggPSBjcE1heFByZXNldENvbG9yc0xlbmd0aDsKICAgICAgICAgICAgdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZSA9IGNwUHJlc2V0RW1wdHlNZXNzYWdlOwogICAgICAgICAgICB0aGlzLmNwUHJlc2V0RW1wdHlNZXNzYWdlQ2xhc3MgPSBjcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzOwogICAgICAgICAgICB0aGlzLmNwQWRkQ29sb3JCdXR0b24gPSBjcEFkZENvbG9yQnV0dG9uOwogICAgICAgICAgICB0aGlzLmNwQWRkQ29sb3JCdXR0b25UZXh0ID0gY3BBZGRDb2xvckJ1dHRvblRleHQ7CiAgICAgICAgICAgIHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzID0gY3BBZGRDb2xvckJ1dHRvbkNsYXNzOwogICAgICAgICAgICB0aGlzLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyA9IGNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzczsKICAgICAgICAgICAgaWYgKCFjcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93KSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0ID0gMDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY3BEaWFsb2dEaXNwbGF5ID09PSAnaW5saW5lJykgewogICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dBcnJvd1NpemUgPSAwOwogICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dBcnJvd09mZnNldCA9IDA7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGNwT3V0cHV0Rm9ybWF0ID09PSAnaGV4JyAmJgogICAgICAgICAgICAgICAgY3BBbHBoYUNoYW5uZWwgIT09ICdhbHdheXMnICYmIGNwQWxwaGFDaGFubmVsICE9PSAnZm9yY2VkJykgewogICAgICAgICAgICAgICAgdGhpcy5jcEFscGhhQ2hhbm5lbCA9ICdkaXNhYmxlZCc7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgc2V0Q29sb3JNb2RlKG1vZGUpIHsKICAgICAgICAgICAgc3dpdGNoIChtb2RlLnRvU3RyaW5nKCkudG9VcHBlckNhc2UoKSkgewogICAgICAgICAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgICAgIGNhc2UgJ0NPTE9SJzoKICAgICAgICAgICAgICAgICAgICB0aGlzLmNwQ29sb3JNb2RlID0gMTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIGNhc2UgJzInOgogICAgICAgICAgICAgICAgY2FzZSAnRyc6CiAgICAgICAgICAgICAgICBjYXNlICdHUkFZU0NBTEUnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuY3BDb2xvck1vZGUgPSAyOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgY2FzZSAnMyc6CiAgICAgICAgICAgICAgICBjYXNlICdQJzoKICAgICAgICAgICAgICAgIGNhc2UgJ1BSRVNFVFMnOgogICAgICAgICAgICAgICAgICAgIHRoaXMuY3BDb2xvck1vZGUgPSAzOwogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICB0aGlzLmNwQ29sb3JNb2RlID0gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzZXRJbml0aWFsQ29sb3IoY29sb3IpIHsKICAgICAgICAgICAgdGhpcy5pbml0aWFsQ29sb3IgPSBjb2xvcjsKICAgICAgICB9CiAgICAgICAgc2V0UHJlc2V0Q29uZmlnKGNwUHJlc2V0TGFiZWwsIGNwUHJlc2V0Q29sb3JzKSB7CiAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRMYWJlbCA9IGNwUHJlc2V0TGFiZWw7CiAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRDb2xvcnMgPSBjcFByZXNldENvbG9yczsKICAgICAgICB9CiAgICAgICAgc2V0Q29sb3JGcm9tU3RyaW5nKHZhbHVlLCBlbWl0ID0gdHJ1ZSwgdXBkYXRlID0gdHJ1ZSkgewogICAgICAgICAgICBsZXQgaHN2YTsKICAgICAgICAgICAgaWYgKHRoaXMuY3BBbHBoYUNoYW5uZWwgPT09ICdhbHdheXMnIHx8IHRoaXMuY3BBbHBoYUNoYW5uZWwgPT09ICdmb3JjZWQnKSB7CiAgICAgICAgICAgICAgICBoc3ZhID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh2YWx1ZSwgdHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoIWhzdmEgJiYgIXRoaXMuaHN2YSkgewogICAgICAgICAgICAgICAgICAgIGhzdmEgPSB0aGlzLnNlcnZpY2Uuc3RyaW5nVG9Ic3ZhKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBoc3ZhID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh2YWx1ZSwgZmFsc2UpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaHN2YSAmJiAhdGhpcy5oc3ZhKSB7CiAgICAgICAgICAgICAgICBoc3ZhID0gdGhpcy5zZXJ2aWNlLnN0cmluZ1RvSHN2YSh0aGlzLmZhbGxiYWNrQ29sb3IsIGZhbHNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoaHN2YSkgewogICAgICAgICAgICAgICAgdGhpcy5oc3ZhID0gaHN2YTsKICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVySCA9IHRoaXMuaHN2YS5oOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuY3BPdXRwdXRGb3JtYXQgPT09ICdoZXgnICYmIHRoaXMuY3BBbHBoYUNoYW5uZWwgPT09ICdkaXNhYmxlZCcpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhzdmEuYSA9IDE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKGVtaXQsIHVwZGF0ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb25SZXNpemUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnBvc2l0aW9uID09PSAnZml4ZWQnKSB7CiAgICAgICAgICAgICAgICB0aGlzLnNldERpYWxvZ1Bvc2l0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jcERpYWxvZ0Rpc3BsYXkgIT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvbkRyYWdFbmQoc2xpZGVyKSB7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc2xpZGVyRHJhZ0VuZCh7IHNsaWRlcjogc2xpZGVyLCBjb2xvcjogdGhpcy5vdXRwdXRDb2xvciB9KTsKICAgICAgICB9CiAgICAgICAgb25EcmFnU3RhcnQoc2xpZGVyKSB7CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2Uuc2xpZGVyRHJhZ1N0YXJ0KHsgc2xpZGVyOiBzbGlkZXIsIGNvbG9yOiB0aGlzLm91dHB1dENvbG9yIH0pOwogICAgICAgIH0KICAgICAgICBvbk1vdXNlRG93bihldmVudCkgewogICAgICAgICAgICBpZiAodGhpcy5zaG93ICYmCiAgICAgICAgICAgICAgICAhdGhpcy5pc0lFMTAgJiYgdGhpcy5jcERpYWxvZ0Rpc3BsYXkgPT09ICdwb3B1cCcgJiYKICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldCAhPT0gdGhpcy5kaXJlY3RpdmVFbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgJiYKICAgICAgICAgICAgICAgICF0aGlzLmlzRGVzY2VuZGFudCh0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQsIGV2ZW50LnRhcmdldCkgJiYKICAgICAgICAgICAgICAgICF0aGlzLmlzRGVzY2VuZGFudCh0aGlzLmRpcmVjdGl2ZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgZXZlbnQudGFyZ2V0KSAmJgogICAgICAgICAgICAgICAgdGhpcy5jcElnbm9yZWRFbGVtZW50cy5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0gPT09IGV2ZW50LnRhcmdldCkubGVuZ3RoID09PSAwKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcFNhdmVDbGlja091dHNpZGUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yU2VsZWN0ZWQodGhpcy5vdXRwdXRDb2xvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhzdmEgPSBudWxsOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Q29sb3JGcm9tU3RyaW5nKHRoaXMuaW5pdGlhbENvbG9yLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3BDbXlrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5jb2xvckNoYW5nZWQodGhpcy5pbml0aWFsQ29sb3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY29sb3JDYW5jZWxlZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb2xvclBpY2tlcigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9uQWNjZXB0Q29sb3IoZXZlbnQpIHsKICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIGlmICh0aGlzLm91dHB1dENvbG9yKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yU2VsZWN0ZWQodGhpcy5vdXRwdXRDb2xvcik7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuY3BEaWFsb2dEaXNwbGF5ID09PSAncG9wdXAnKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBvbkNhbmNlbENvbG9yKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuaHN2YSA9IG51bGw7CiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNvbG9yQ2FuY2VsZWQoKTsKICAgICAgICAgICAgdGhpcy5zZXRDb2xvckZyb21TdHJpbmcodGhpcy5pbml0aWFsQ29sb3IsIHRydWUpOwogICAgICAgICAgICBpZiAodGhpcy5jcERpYWxvZ0Rpc3BsYXkgPT09ICdwb3B1cCcpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNwQ215a0VuYWJsZWQpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuY29sb3JDaGFuZ2VkKHRoaXMuaW5pdGlhbENvbG9yLCB0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VDb2xvclBpY2tlcigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9uRm9ybWF0VG9nZ2xlKGNoYW5nZSkgewogICAgICAgICAgICBjb25zdCBhdmFpbGFibGVGb3JtYXRzID0gdGhpcy5kaWFsb2dJbnB1dEZpZWxkcy5sZW5ndGggLQogICAgICAgICAgICAgICAgKHRoaXMuY3BDbXlrRW5hYmxlZCA/IDAgOiAxKTsKICAgICAgICAgICAgY29uc3QgbmV4dEZvcm1hdCA9ICgoKHRoaXMuZGlhbG9nSW5wdXRGaWVsZHMuaW5kZXhPZih0aGlzLmZvcm1hdCkgKyBjaGFuZ2UpICUKICAgICAgICAgICAgICAgIGF2YWlsYWJsZUZvcm1hdHMpICsgYXZhaWxhYmxlRm9ybWF0cykgJSBhdmFpbGFibGVGb3JtYXRzOwogICAgICAgICAgICB0aGlzLmZvcm1hdCA9IHRoaXMuZGlhbG9nSW5wdXRGaWVsZHNbbmV4dEZvcm1hdF07CiAgICAgICAgfQogICAgICAgIG9uQ29sb3JDaGFuZ2UodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5oc3ZhLnMgPSB2YWx1ZS5zIC8gdmFsdWUucmdYOwogICAgICAgICAgICB0aGlzLmhzdmEudiA9IHZhbHVlLnYgLyB2YWx1ZS5yZ1k7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIHNsaWRlcjogJ2xpZ2h0bmVzcycsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5oc3ZhLnYsCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICB9KTsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIHNsaWRlcjogJ3NhdHVyYXRpb24nLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuaHN2YS5zLAogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3V0cHV0Q29sb3IKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uSHVlQ2hhbmdlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuaHN2YS5oID0gdmFsdWUudiAvIHZhbHVlLnJnWDsKICAgICAgICAgICAgdGhpcy5zbGlkZXJIID0gdGhpcy5oc3ZhLmg7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIHNsaWRlcjogJ2h1ZScsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5oc3ZhLmgsCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgb25WYWx1ZUNoYW5nZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmhzdmEudiA9IHZhbHVlLnYgLyB2YWx1ZS5yZ1g7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zbGlkZXJDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIHNsaWRlcjogJ3ZhbHVlJywKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhzdmEudiwKICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLm91dHB1dENvbG9yCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBvbkFscGhhQ2hhbmdlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuaHN2YS5hID0gdmFsdWUudiAvIHZhbHVlLnJnWDsKICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcigpOwogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnNsaWRlckNoYW5nZWQoewogICAgICAgICAgICAgICAgc2xpZGVyOiAnYWxwaGEnLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuaHN2YS5hLAogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3V0cHV0Q29sb3IKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uSGV4SW5wdXQodmFsdWUpIHsKICAgICAgICAgICAgaWYgKHZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWVbMF0gIT09ICcjJykgewogICAgICAgICAgICAgICAgICAgIHZhbHVlID0gJyMnICsgdmFsdWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgdmFsaWRIZXggPSAvXiMoW2EtZjAtOV17M318W2EtZjAtOV17Nn0pJC9naTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNwQWxwaGFDaGFubmVsID09PSAnYWx3YXlzJykgewogICAgICAgICAgICAgICAgICAgIHZhbGlkSGV4ID0gL14jKFthLWYwLTldezN9fFthLWYwLTldezZ9fFthLWYwLTldezh9KSQvZ2k7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB2YWxpZCA9IHZhbGlkSGV4LnRlc3QodmFsdWUpOwogICAgICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmxlbmd0aCA8IDUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSAnIycgKyB2YWx1ZS5zdWJzdHJpbmcoMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zcGxpdCgnJykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoYyA9PiBjICsgYykKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5qb2luKCcnKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3BBbHBoYUNoYW5uZWwgPT09ICdmb3JjZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlICs9IE1hdGgucm91bmQodGhpcy5oc3ZhLmEgKiAyNTUpLnRvU3RyaW5nKDE2KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRDb2xvckZyb21TdHJpbmcodmFsdWUsIHRydWUsIGZhbHNlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgICAgICBpbnB1dDogJ2hleCcsCiAgICAgICAgICAgICAgICAgICAgdmFsaWQ6IHZhbGlkLAogICAgICAgICAgICAgICAgICAgIHZhbHVlOiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb25SZWRJbnB1dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCByZ2JhID0gdGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEodGhpcy5oc3ZhKTsKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSAhaXNOYU4odmFsdWUudikgJiYgdmFsdWUudiA+PSAwICYmIHZhbHVlLnYgPD0gdmFsdWUucmc7CiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgcmdiYS5yID0gdmFsdWUudiAvIHZhbHVlLnJnOwogICAgICAgICAgICAgICAgdGhpcy5oc3ZhID0gdGhpcy5zZXJ2aWNlLnJnYmFUb0hzdmEocmdiYSk7CiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckggPSB0aGlzLmhzdmEuaDsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7CiAgICAgICAgICAgICAgICBpbnB1dDogJ3JlZCcsCiAgICAgICAgICAgICAgICB2YWxpZDogdmFsaWQsCiAgICAgICAgICAgICAgICB2YWx1ZTogcmdiYS5yLAogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3V0cHV0Q29sb3IKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uQmx1ZUlucHV0KHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IHJnYmEgPSB0aGlzLnNlcnZpY2UuaHN2YVRvUmdiYSh0aGlzLmhzdmEpOwogICAgICAgICAgICBjb25zdCB2YWxpZCA9ICFpc05hTih2YWx1ZS52KSAmJiB2YWx1ZS52ID49IDAgJiYgdmFsdWUudiA8PSB2YWx1ZS5yZzsKICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICByZ2JhLmIgPSB2YWx1ZS52IC8gdmFsdWUucmc7CiAgICAgICAgICAgICAgICB0aGlzLmhzdmEgPSB0aGlzLnNlcnZpY2UucmdiYVRvSHN2YShyZ2JhKTsKICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVySCA9IHRoaXMuaHN2YS5oOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIGlucHV0OiAnYmx1ZScsCiAgICAgICAgICAgICAgICB2YWxpZDogdmFsaWQsCiAgICAgICAgICAgICAgICB2YWx1ZTogcmdiYS5iLAogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3V0cHV0Q29sb3IKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uR3JlZW5JbnB1dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCByZ2JhID0gdGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEodGhpcy5oc3ZhKTsKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSAhaXNOYU4odmFsdWUudikgJiYgdmFsdWUudiA+PSAwICYmIHZhbHVlLnYgPD0gdmFsdWUucmc7CiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgcmdiYS5nID0gdmFsdWUudiAvIHZhbHVlLnJnOwogICAgICAgICAgICAgICAgdGhpcy5oc3ZhID0gdGhpcy5zZXJ2aWNlLnJnYmFUb0hzdmEocmdiYSk7CiAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckggPSB0aGlzLmhzdmEuaDsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7CiAgICAgICAgICAgICAgICBpbnB1dDogJ2dyZWVuJywKICAgICAgICAgICAgICAgIHZhbGlkOiB2YWxpZCwKICAgICAgICAgICAgICAgIHZhbHVlOiByZ2JhLmcsCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgb25IdWVJbnB1dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCB2YWxpZCA9ICFpc05hTih2YWx1ZS52KSAmJiB2YWx1ZS52ID49IDAgJiYgdmFsdWUudiA8PSB2YWx1ZS5yZzsKICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmhzdmEuaCA9IHZhbHVlLnYgLyB2YWx1ZS5yZzsKICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVySCA9IHRoaXMuaHN2YS5oOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIGlucHV0OiAnaHVlJywKICAgICAgICAgICAgICAgIHZhbGlkOiB2YWxpZCwKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmhzdmEuaCwKICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLm91dHB1dENvbG9yCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBvblZhbHVlSW5wdXQodmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSAhaXNOYU4odmFsdWUudikgJiYgdmFsdWUudiA+PSAwICYmIHZhbHVlLnYgPD0gdmFsdWUucmc7CiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgdGhpcy5oc3ZhLnYgPSB2YWx1ZS52IC8gdmFsdWUucmc7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoewogICAgICAgICAgICAgICAgaW5wdXQ6ICd2YWx1ZScsCiAgICAgICAgICAgICAgICB2YWxpZDogdmFsaWQsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5oc3ZhLnYsCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgb25BbHBoYUlucHV0KHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gIWlzTmFOKHZhbHVlLnYpICYmIHZhbHVlLnYgPj0gMCAmJiB2YWx1ZS52IDw9IHZhbHVlLnJnOwogICAgICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuaHN2YS5hID0gdmFsdWUudiAvIHZhbHVlLnJnOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIGlucHV0OiAnYWxwaGEnLAogICAgICAgICAgICAgICAgdmFsaWQ6IHZhbGlkLAogICAgICAgICAgICAgICAgdmFsdWU6IHRoaXMuaHN2YS5hLAogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3V0cHV0Q29sb3IKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uTGlnaHRuZXNzSW5wdXQodmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgaHNsYSA9IHRoaXMuc2VydmljZS5oc3ZhMmhzbGEodGhpcy5oc3ZhKTsKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSAhaXNOYU4odmFsdWUudikgJiYgdmFsdWUudiA+PSAwICYmIHZhbHVlLnYgPD0gdmFsdWUucmc7CiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgaHNsYS5sID0gdmFsdWUudiAvIHZhbHVlLnJnOwogICAgICAgICAgICAgICAgdGhpcy5oc3ZhID0gdGhpcy5zZXJ2aWNlLmhzbGEyaHN2YShoc2xhKTsKICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVySCA9IHRoaXMuaHN2YS5oOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIGlucHV0OiAnbGlnaHRuZXNzJywKICAgICAgICAgICAgICAgIHZhbGlkOiB2YWxpZCwKICAgICAgICAgICAgICAgIHZhbHVlOiBoc2xhLmwsCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgb25TYXR1cmF0aW9uSW5wdXQodmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgaHNsYSA9IHRoaXMuc2VydmljZS5oc3ZhMmhzbGEodGhpcy5oc3ZhKTsKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSAhaXNOYU4odmFsdWUudikgJiYgdmFsdWUudiA+PSAwICYmIHZhbHVlLnYgPD0gdmFsdWUucmc7CiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgaHNsYS5zID0gdmFsdWUudiAvIHZhbHVlLnJnOwogICAgICAgICAgICAgICAgdGhpcy5oc3ZhID0gdGhpcy5zZXJ2aWNlLmhzbGEyaHN2YShoc2xhKTsKICAgICAgICAgICAgICAgIHRoaXMuc2xpZGVySCA9IHRoaXMuaHN2YS5oOwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcigpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIGlucHV0OiAnc2F0dXJhdGlvbicsCiAgICAgICAgICAgICAgICB2YWxpZDogdmFsaWQsCiAgICAgICAgICAgICAgICB2YWx1ZTogaHNsYS5zLAogICAgICAgICAgICAgICAgY29sb3I6IHRoaXMub3V0cHV0Q29sb3IKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIG9uQ3lhbklucHV0KHZhbHVlKSB7CiAgICAgICAgICAgIGNvbnN0IHZhbGlkID0gIWlzTmFOKHZhbHVlLnYpICYmIHZhbHVlLnYgPj0gMCAmJiB2YWx1ZS52IDw9IHZhbHVlLnJnOwogICAgICAgICAgICBpZiAodmFsaWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuY215ay5jID0gdmFsdWUudjsKICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlQ29sb3JQaWNrZXIoZmFsc2UsIHRydWUsIHRydWUpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZGlyZWN0aXZlSW5zdGFuY2UuaW5wdXRDaGFuZ2VkKHsKICAgICAgICAgICAgICAgIGlucHV0OiAnY3lhbicsCiAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNteWsuYywKICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLm91dHB1dENvbG9yCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBvbk1hZ2VudGFJbnB1dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCB2YWxpZCA9ICFpc05hTih2YWx1ZS52KSAmJiB2YWx1ZS52ID49IDAgJiYgdmFsdWUudiA8PSB2YWx1ZS5yZzsKICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNteWsubSA9IHZhbHVlLnY7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKGZhbHNlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7CiAgICAgICAgICAgICAgICBpbnB1dDogJ21hZ2VudGEnLAogICAgICAgICAgICAgICAgdmFsaWQ6IHRydWUsCiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5jbXlrLm0sCiAgICAgICAgICAgICAgICBjb2xvcjogdGhpcy5vdXRwdXRDb2xvcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgb25ZZWxsb3dJbnB1dCh2YWx1ZSkgewogICAgICAgICAgICBjb25zdCB2YWxpZCA9ICFpc05hTih2YWx1ZS52KSAmJiB2YWx1ZS52ID49IDAgJiYgdmFsdWUudiA8PSB2YWx1ZS5yZzsKICAgICAgICAgICAgaWYgKHZhbGlkKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNteWsueSA9IHZhbHVlLnY7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZUNvbG9yUGlja2VyKGZhbHNlLCB0cnVlLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmlucHV0Q2hhbmdlZCh7CiAgICAgICAgICAgICAgICBpbnB1dDogJ3llbGxvdycsCiAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNteWsueSwKICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLm91dHB1dENvbG9yCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBvbkJsYWNrSW5wdXQodmFsdWUpIHsKICAgICAgICAgICAgY29uc3QgdmFsaWQgPSAhaXNOYU4odmFsdWUudikgJiYgdmFsdWUudiA+PSAwICYmIHZhbHVlLnYgPD0gdmFsdWUucmc7CiAgICAgICAgICAgIGlmICh2YWxpZCkgewogICAgICAgICAgICAgICAgdGhpcy5jbXlrLmsgPSB2YWx1ZS52OwogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVDb2xvclBpY2tlcihmYWxzZSwgdHJ1ZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5pbnB1dENoYW5nZWQoewogICAgICAgICAgICAgICAgaW5wdXQ6ICdibGFjaycsCiAgICAgICAgICAgICAgICB2YWxpZDogdHJ1ZSwKICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLmNteWsuaywKICAgICAgICAgICAgICAgIGNvbG9yOiB0aGlzLm91dHB1dENvbG9yCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBvbkFkZFByZXNldENvbG9yKGV2ZW50LCB2YWx1ZSkgewogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgaWYgKCF0aGlzLmNwUHJlc2V0Q29sb3JzLmZpbHRlcigoY29sb3IpID0+IChjb2xvciA9PT0gdmFsdWUpKS5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRDb2xvcnMgPSB0aGlzLmNwUHJlc2V0Q29sb3JzLmNvbmNhdCh2YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLnByZXNldENvbG9yc0NoYW5nZWQodGhpcy5jcFByZXNldENvbG9ycyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgb25SZW1vdmVQcmVzZXRDb2xvcihldmVudCwgdmFsdWUpIHsKICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7CiAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRDb2xvcnMgPSB0aGlzLmNwUHJlc2V0Q29sb3JzLmZpbHRlcigoY29sb3IpID0+IChjb2xvciAhPT0gdmFsdWUpKTsKICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5wcmVzZXRDb2xvcnNDaGFuZ2VkKHRoaXMuY3BQcmVzZXRDb2xvcnMpOwogICAgICAgIH0KICAgICAgICAvLyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbnMgZm9yIHRoZSBjb2xvciBwaWNrZXIgZGlhbG9nIHN0YXR1cwogICAgICAgIG9wZW5Db2xvclBpY2tlcigpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnNob3cpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2hvdyA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IHRydWU7CiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmhpZGRlbiA9IGZhbHNlOwogICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0RGlhbG9nUG9zaXRpb24oKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICAgICAgICAgIH0sIDApOwogICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zdGF0ZUNoYW5nZWQodHJ1ZSk7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuaXNJRTEwKSB7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignbW91c2Vkb3duJywgdGhpcy5saXN0ZW5lck1vdXNlRG93bik7CiAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndG91Y2hzdGFydCcsIHRoaXMubGlzdGVuZXJNb3VzZURvd24pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIHRoaXMubGlzdGVuZXJSZXNpemUpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNsb3NlQ29sb3JQaWNrZXIoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNob3cpIHsKICAgICAgICAgICAgICAgIHRoaXMuc2hvdyA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5zdGF0ZUNoYW5nZWQoZmFsc2UpOwogICAgICAgICAgICAgICAgaWYgKCF0aGlzLmlzSUUxMCkgewogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ21vdXNlZG93bicsIHRoaXMubGlzdGVuZXJNb3VzZURvd24pOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ3RvdWNoc3RhcnQnLCB0aGlzLmxpc3RlbmVyTW91c2VEb3duKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdyZXNpemUnLCB0aGlzLmxpc3RlbmVyUmVzaXplKTsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5jZFJlZlsnZGVzdHJveWVkJ10pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNkUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICB1cGRhdGVDb2xvclBpY2tlcihlbWl0ID0gdHJ1ZSwgdXBkYXRlID0gdHJ1ZSwgY215a0lucHV0ID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc2xpZGVyRGltTWF4KSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcENvbG9yTW9kZSA9PT0gMikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaHN2YS5zID0gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGxldCBodWUsIGhzbGEsIHJnYmE7CiAgICAgICAgICAgICAgICBjb25zdCBsYXN0T3V0cHV0ID0gdGhpcy5vdXRwdXRDb2xvcjsKICAgICAgICAgICAgICAgIGhzbGEgPSB0aGlzLnNlcnZpY2UuaHN2YTJoc2xhKHRoaXMuaHN2YSk7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuY3BDbXlrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgIHJnYmEgPSB0aGlzLnNlcnZpY2UuZGVub3JtYWxpemVSR0JBKHRoaXMuc2VydmljZS5oc3ZhVG9SZ2JhKHRoaXMuaHN2YSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbXlrSW5wdXQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSA9IHRoaXMuc2VydmljZS5oc3ZhVG9SZ2JhKHRoaXMuaHN2YSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY215ayA9IHRoaXMuc2VydmljZS5kZW5vcm1hbGl6ZUNNWUsodGhpcy5zZXJ2aWNlLnJnYmFUb0NteWsocmdiYSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgcmdiYSA9IHRoaXMuc2VydmljZS5jbXlrVG9SZ2IodGhpcy5zZXJ2aWNlLm5vcm1hbGl6ZUNNWUsodGhpcy5jbXlrKSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuaHN2YSA9IHRoaXMuc2VydmljZS5yZ2JhVG9Ic3ZhKHJnYmEpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZ2JhID0gdGhpcy5zZXJ2aWNlLmRlbm9ybWFsaXplUkdCQShyZ2JhKTsKICAgICAgICAgICAgICAgICAgICB0aGlzLnNsaWRlckggPSB0aGlzLmhzdmEuaDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGh1ZSA9IHRoaXMuc2VydmljZS5kZW5vcm1hbGl6ZVJHQkEodGhpcy5zZXJ2aWNlLmhzdmFUb1JnYmEobmV3IEhzdmEodGhpcy5zbGlkZXJIIHx8IHRoaXMuaHN2YS5oLCAxLCAxLCAxKSkpOwogICAgICAgICAgICAgICAgaWYgKHVwZGF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuaHNsYVRleHQgPSBuZXcgSHNsYShNYXRoLnJvdW5kKChoc2xhLmgpICogMzYwKSwgTWF0aC5yb3VuZChoc2xhLnMgKiAxMDApLCBNYXRoLnJvdW5kKGhzbGEubCAqIDEwMCksIE1hdGgucm91bmQoaHNsYS5hICogMTAwKSAvIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZ2JhVGV4dCA9IG5ldyBSZ2JhKHJnYmEuciwgcmdiYS5nLCByZ2JhLmIsIE1hdGgucm91bmQocmdiYS5hICogMTAwKSAvIDEwMCk7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3BDbXlrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNteWtUZXh0ID0gbmV3IENteWsodGhpcy5jbXlrLmMsIHRoaXMuY215ay5tLCB0aGlzLmNteWsueSwgdGhpcy5jbXlrLmssIE1hdGgucm91bmQodGhpcy5jbXlrLmEgKiAxMDApIC8gMTAwKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYWxsb3dIZXg4ID0gdGhpcy5jcEFscGhhQ2hhbm5lbCA9PT0gJ2Fsd2F5cyc7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5oZXhUZXh0ID0gdGhpcy5zZXJ2aWNlLnJnYmFUb0hleChyZ2JhLCBhbGxvd0hleDgpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuaGV4QWxwaGEgPSB0aGlzLnJnYmFUZXh0LmE7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcE91dHB1dEZvcm1hdCA9PT0gJ2F1dG8nKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ICE9PSBDb2xvckZvcm1hdHMuUkdCQSAmJiB0aGlzLmZvcm1hdCAhPT0gQ29sb3JGb3JtYXRzLkNNWUspIHsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuaHN2YS5hIDwgMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mb3JtYXQgPSB0aGlzLmhzdmEuYSA8IDEgPyBDb2xvckZvcm1hdHMuUkdCQSA6IENvbG9yRm9ybWF0cy5IRVg7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmh1ZVNsaWRlckNvbG9yID0gJ3JnYignICsgaHVlLnIgKyAnLCcgKyBodWUuZyArICcsJyArIGh1ZS5iICsgJyknOwogICAgICAgICAgICAgICAgdGhpcy5hbHBoYVNsaWRlckNvbG9yID0gJ3JnYignICsgcmdiYS5yICsgJywnICsgcmdiYS5nICsgJywnICsgcmdiYS5iICsgJyknOwogICAgICAgICAgICAgICAgdGhpcy5vdXRwdXRDb2xvciA9IHRoaXMuc2VydmljZS5vdXRwdXRGb3JtYXQodGhpcy5oc3ZhLCB0aGlzLmNwT3V0cHV0Rm9ybWF0LCB0aGlzLmNwQWxwaGFDaGFubmVsKTsKICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRDb2xvciA9IHRoaXMuc2VydmljZS5vdXRwdXRGb3JtYXQodGhpcy5oc3ZhLCAncmdiYScsIG51bGwpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuZm9ybWF0ICE9PSBDb2xvckZvcm1hdHMuQ01ZSykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY215a0NvbG9yID0gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jcEFscGhhQ2hhbm5lbCA9PT0gJ2Fsd2F5cycgfHwgdGhpcy5jcEFscGhhQ2hhbm5lbCA9PT0gJ2VuYWJsZWQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY3BBbHBoYUNoYW5uZWwgPT09ICdmb3JjZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFscGhhID0gTWF0aC5yb3VuZCh0aGlzLmNteWsuYSAqIDEwMCkgLyAxMDA7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY215a0NvbG9yID0gYGNteWthKCR7dGhpcy5jbXlrLmN9LCR7dGhpcy5jbXlrLm19LCR7dGhpcy5jbXlrLnl9LCR7dGhpcy5jbXlrLmt9LCR7YWxwaGF9KWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmNteWtDb2xvciA9IGBjbXlrKCR7dGhpcy5jbXlrLmN9LCR7dGhpcy5jbXlrLm19LCR7dGhpcy5jbXlrLnl9LCR7dGhpcy5jbXlrLmt9KWA7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zbGlkZXIgPSBuZXcgU2xpZGVyUG9zaXRpb24oKHRoaXMuc2xpZGVySCB8fCB0aGlzLmhzdmEuaCkgKiB0aGlzLnNsaWRlckRpbU1heC5oIC0gOCwgdGhpcy5oc3ZhLnMgKiB0aGlzLnNsaWRlckRpbU1heC5zIC0gOCwgKDEgLSB0aGlzLmhzdmEudikgKiB0aGlzLnNsaWRlckRpbU1heC52IC0gOCwgdGhpcy5oc3ZhLmEgKiB0aGlzLnNsaWRlckRpbU1heC5hIC0gOCk7CiAgICAgICAgICAgICAgICBpZiAoZW1pdCAmJiBsYXN0T3V0cHV0ICE9PSB0aGlzLm91dHB1dENvbG9yKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY3BDbXlrRW5hYmxlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZUluc3RhbmNlLmNteWtDaGFuZ2VkKHRoaXMuY215a0NvbG9yKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmVJbnN0YW5jZS5jb2xvckNoYW5nZWQodGhpcy5vdXRwdXRDb2xvcik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgY29sb3IgcGlja2VyIGRpYWxvZyBwb3NpdGlvbmluZwogICAgICAgIHNldERpYWxvZ1Bvc2l0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5jcERpYWxvZ0Rpc3BsYXkgPT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uID0gJ3JlbGF0aXZlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGxldCBwb3NpdGlvbiA9ICdzdGF0aWMnLCB0cmFuc2Zvcm0gPSAnJywgc3R5bGU7CiAgICAgICAgICAgICAgICBsZXQgcGFyZW50Tm9kZSA9IG51bGwsIHRyYW5zZm9ybU5vZGUgPSBudWxsOwogICAgICAgICAgICAgICAgbGV0IG5vZGUgPSB0aGlzLmRpcmVjdGl2ZUVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC5wYXJlbnROb2RlOwogICAgICAgICAgICAgICAgY29uc3QgZGlhbG9nSGVpZ2h0ID0gdGhpcy5kaWFsb2dFbGVtZW50Lm5hdGl2ZUVsZW1lbnQub2Zmc2V0SGVpZ2h0OwogICAgICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT09IG51bGwgJiYgbm9kZS50YWdOYW1lICE9PSAnSFRNTCcpIHsKICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKG5vZGUpOwogICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gc3R5bGUuZ2V0UHJvcGVydHlWYWx1ZSgncG9zaXRpb24nKTsKICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm0gPSBzdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKCd0cmFuc2Zvcm0nKTsKICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT09ICdzdGF0aWMnICYmIHBhcmVudE5vZGUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50Tm9kZSA9IG5vZGU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2Zvcm0gJiYgdHJhbnNmb3JtICE9PSAnbm9uZScgJiYgdHJhbnNmb3JtTm9kZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm1Ob2RlID0gbm9kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnZml4ZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudE5vZGUgPSB0cmFuc2Zvcm1Ob2RlOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgbm9kZSA9IG5vZGUucGFyZW50Tm9kZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IGJveERpcmVjdGl2ZSA9IHRoaXMuY3JlYXRlRGlhbG9nQm94KHRoaXMuZGlyZWN0aXZlRWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCAocG9zaXRpb24gIT09ICdmaXhlZCcpKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnVzZVJvb3RWaWV3Q29udGFpbmVyIHx8IChwb3NpdGlvbiA9PT0gJ2ZpeGVkJyAmJgogICAgICAgICAgICAgICAgICAgICghcGFyZW50Tm9kZSB8fCBwYXJlbnROb2RlIGluc3RhbmNlb2YgSFRNTFVua25vd25FbGVtZW50KSkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcCA9IGJveERpcmVjdGl2ZS50b3A7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0ID0gYm94RGlyZWN0aXZlLmxlZnQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBpZiAocGFyZW50Tm9kZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnROb2RlID0gbm9kZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY29uc3QgYm94UGFyZW50ID0gdGhpcy5jcmVhdGVEaWFsb2dCb3gocGFyZW50Tm9kZSwgKHBvc2l0aW9uICE9PSAnZml4ZWQnKSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3AgPSBib3hEaXJlY3RpdmUudG9wIC0gYm94UGFyZW50LnRvcDsKICAgICAgICAgICAgICAgICAgICB0aGlzLmxlZnQgPSBib3hEaXJlY3RpdmUubGVmdCAtIGJveFBhcmVudC5sZWZ0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09PSAnZml4ZWQnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9ICdmaXhlZCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBsZXQgdXNlUG9zaXRpb24gPSB0aGlzLmNwUG9zaXRpb247CiAgICAgICAgICAgICAgICBpZiAodGhpcy5jcFBvc2l0aW9uID09PSAnYXV0bycpIHsKICAgICAgICAgICAgICAgICAgICBsZXQgdXNlUG9zaXRpb25YID0gJ3JpZ2h0JzsKICAgICAgICAgICAgICAgICAgICBsZXQgdXNlUG9zaXRpb25ZID0gJ2JvdHRvbSc7CiAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2luV2lkdGggPSBNYXRoLm1heChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50V2lkdGgsIHdpbmRvdy5pbm5lcldpZHRoIHx8IDApOwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHdpbkhlaWdodCA9IE1hdGgubWF4KGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRIZWlnaHQsIHdpbmRvdy5pbm5lckhlaWdodCB8fCAwKTsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5sZWZ0ICsgdGhpcy5jcFdpZHRoID4gd2luV2lkdGgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlUG9zaXRpb25YID0gJ2xlZnQnOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy50b3AgKyBkaWFsb2dIZWlnaHQgPiB3aW5IZWlnaHQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdXNlUG9zaXRpb25ZID0gJ3RvcCc7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHVzZVBvc2l0aW9uID0gdXNlUG9zaXRpb25YICsgJy0nICsgdXNlUG9zaXRpb25ZOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5jcFVzZVBvc2l0aW9uID0gdXNlUG9zaXRpb247CiAgICAgICAgICAgICAgICBpZiAodXNlUG9zaXRpb24gPT09ICd0b3AnKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcnJvd1RvcCA9IGRpYWxvZ0hlaWdodCAtIDE7CiAgICAgICAgICAgICAgICAgICAgdGhpcy50b3AgLT0gZGlhbG9nSGVpZ2h0ICsgdGhpcy5kaWFsb2dBcnJvd1NpemU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0ICs9IHRoaXMuY3BQb3NpdGlvbk9mZnNldCAvIDEwMCAqIGJveERpcmVjdGl2ZS53aWR0aCAtIHRoaXMuZGlhbG9nQXJyb3dPZmZzZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1c2VQb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnRvcCArPSBib3hEaXJlY3RpdmUuaGVpZ2h0ICsgdGhpcy5kaWFsb2dBcnJvd1NpemU7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5sZWZ0ICs9IHRoaXMuY3BQb3NpdGlvbk9mZnNldCAvIDEwMCAqIGJveERpcmVjdGl2ZS53aWR0aCAtIHRoaXMuZGlhbG9nQXJyb3dPZmZzZXQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmICh1c2VQb3NpdGlvbiA9PT0gJ3RvcC1sZWZ0JyB8fCB1c2VQb3NpdGlvbiA9PT0gJ2xlZnQtdG9wJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMudG9wIC09IGRpYWxvZ0hlaWdodCAtIGJveERpcmVjdGl2ZS5oZWlnaHQgKyBib3hEaXJlY3RpdmUuaGVpZ2h0ICogdGhpcy5jcFBvc2l0aW9uT2Zmc2V0IC8gMTAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdCAtPSB0aGlzLmNwV2lkdGggKyB0aGlzLmRpYWxvZ0Fycm93U2l6ZSAtIDIgLSB0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodXNlUG9zaXRpb24gPT09ICd0b3AtcmlnaHQnIHx8IHVzZVBvc2l0aW9uID09PSAncmlnaHQtdG9wJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMudG9wIC09IGRpYWxvZ0hlaWdodCAtIGJveERpcmVjdGl2ZS5oZWlnaHQgKyBib3hEaXJlY3RpdmUuaGVpZ2h0ICogdGhpcy5jcFBvc2l0aW9uT2Zmc2V0IC8gMTAwOwogICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdCArPSBib3hEaXJlY3RpdmUud2lkdGggKyB0aGlzLmRpYWxvZ0Fycm93U2l6ZSAtIDIgLSB0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAodXNlUG9zaXRpb24gPT09ICdsZWZ0JyB8fCB1c2VQb3NpdGlvbiA9PT0gJ2JvdHRvbS1sZWZ0JyB8fCB1c2VQb3NpdGlvbiA9PT0gJ2xlZnQtYm90dG9tJykgewogICAgICAgICAgICAgICAgICAgIHRoaXMudG9wICs9IGJveERpcmVjdGl2ZS5oZWlnaHQgKiB0aGlzLmNwUG9zaXRpb25PZmZzZXQgLyAxMDAgLSB0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdCAtPSB0aGlzLmNwV2lkdGggKyB0aGlzLmRpYWxvZ0Fycm93U2l6ZSAtIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsgLy8gdXNlUG9zaXRpb24gPT09ICdyaWdodCcgfHwgdXNlUG9zaXRpb24gPT09ICdib3R0b20tcmlnaHQnIHx8IHVzZVBvc2l0aW9uID09PSAncmlnaHQtYm90dG9tJwogICAgICAgICAgICAgICAgICAgIHRoaXMudG9wICs9IGJveERpcmVjdGl2ZS5oZWlnaHQgKiB0aGlzLmNwUG9zaXRpb25PZmZzZXQgLyAxMDAgLSB0aGlzLmRpYWxvZ0Fycm93T2Zmc2V0OwogICAgICAgICAgICAgICAgICAgIHRoaXMubGVmdCArPSBib3hEaXJlY3RpdmUud2lkdGggKyB0aGlzLmRpYWxvZ0Fycm93U2l6ZSAtIDI7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb25zIGZvciB0aGUgY29sb3IgcGlja2VyIGRpYWxvZyBwb3NpdGlvbmluZyBhbmQgb3BlbmluZwogICAgICAgIGlzRGVzY2VuZGFudChwYXJlbnQsIGNoaWxkKSB7CiAgICAgICAgICAgIGxldCBub2RlID0gY2hpbGQucGFyZW50Tm9kZTsKICAgICAgICAgICAgd2hpbGUgKG5vZGUgIT09IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChub2RlID09PSBwYXJlbnQpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICBjcmVhdGVEaWFsb2dCb3goZWxlbWVudCwgb2Zmc2V0KSB7CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICB0b3A6IGVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wICsgKG9mZnNldCA/IHdpbmRvdy5wYWdlWU9mZnNldCA6IDApLAogICAgICAgICAgICAgICAgbGVmdDogZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0ICsgKG9mZnNldCA/IHdpbmRvdy5wYWdlWE9mZnNldCA6IDApLAogICAgICAgICAgICAgICAgd2lkdGg6IGVsZW1lbnQub2Zmc2V0V2lkdGgsCiAgICAgICAgICAgICAgICBoZWlnaHQ6IGVsZW1lbnQub2Zmc2V0SGVpZ2h0CiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfTsKICAgIENvbG9yUGlja2VyQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ29sb3JQaWNrZXJDb21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENvbG9yUGlja2VyU2VydmljZSkpOyB9OwogICAgQ29sb3JQaWNrZXJDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ29sb3JQaWNrZXJDb21wb25lbnQsIHNlbGVjdG9yczogW1siY29sb3ItcGlja2VyIl1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KF9jMCRvLCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzEkZiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MyJDYsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguZGlhbG9nRWxlbWVudCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5odWVTbGlkZXIgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguYWxwaGFTbGlkZXIgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cC5lc2MiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9rZXl1cF9lc2NfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZUVzYygkZXZlbnQpOyB9LCBmYWxzZSwgybXJtXJlc29sdmVEb2N1bWVudCkoImtleXVwLmVudGVyIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfa2V5dXBfZW50ZXJfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZUVudGVyKCRldmVudCk7IH0sIGZhbHNlLCDJtcm1cmVzb2x2ZURvY3VtZW50KTsKICAgICAgICB9IH0sIGRlY2xzOiAyOCwgdmFyczogNDcsIGNvbnN0czogW1sxLCAiY29sb3ItcGlja2VyIiwgMywgImNsaWNrIl0sIFsiZGlhbG9nUG9wdXAiLCAiIl0sIFszLCAiY2xhc3MiLCAidG9wIiwgNCwgIm5nSWYiXSwgWyJjbGFzcyIsICJzYXR1cmF0aW9uLWxpZ2h0bmVzcyIsIDMsICJzbGlkZXIiLCAicmdYIiwgInJnWSIsICJiYWNrZ3JvdW5kLWNvbG9yIiwgIm5ld1ZhbHVlIiwgImRyYWdTdGFydCIsICJkcmFnRW5kIiwgNCwgIm5nSWYiXSwgWzEsICJodWUtYWxwaGEiLCAiYm94Il0sIFsxLCAibGVmdCJdLCBbMSwgInNlbGVjdGVkLWNvbG9yLWJhY2tncm91bmQiXSwgWzEsICJzZWxlY3RlZC1jb2xvciJdLCBbInR5cGUiLCAiYnV0dG9uIiwgMywgImNsYXNzIiwgImRpc2FibGVkIiwgImNsaWNrIiwgNCwgIm5nSWYiXSwgWzEsICJyaWdodCJdLCBbInN0eWxlIiwgImhlaWdodDogMTZweDsiLCA0LCAibmdJZiJdLCBbMSwgImh1ZSIsIDMsICJzbGlkZXIiLCAicmdYIiwgIm5ld1ZhbHVlIiwgImRyYWdTdGFydCIsICJkcmFnRW5kIl0sIFsiaHVlU2xpZGVyIiwgIiJdLCBbMSwgImN1cnNvciJdLCBbMSwgInZhbHVlIiwgMywgInNsaWRlciIsICJyZ1giLCAibmV3VmFsdWUiLCAiZHJhZ1N0YXJ0IiwgImRyYWdFbmQiXSwgWyJ2YWx1ZVNsaWRlciIsICIiXSwgWzEsICJhbHBoYSIsIDMsICJzbGlkZXIiLCAicmdYIiwgIm5ld1ZhbHVlIiwgImRyYWdTdGFydCIsICJkcmFnRW5kIl0sIFsiYWxwaGFTbGlkZXIiLCAiIl0sIFsiY2xhc3MiLCAiY215ay10ZXh0IiwgMywgImRpc3BsYXkiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImhzbGEtdGV4dCIsIDMsICJkaXNwbGF5IiwgNCwgIm5nSWYiXSwgWyJjbGFzcyIsICJyZ2JhLXRleHQiLCAzLCAiZGlzcGxheSIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAiaGV4LXRleHQiLCAzLCAiaGV4LWFscGhhIiwgImRpc3BsYXkiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgInZhbHVlLXRleHQiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgInR5cGUtcG9saWN5IiwgNCwgIm5nSWYiXSwgWyJjbGFzcyIsICJwcmVzZXQtYXJlYSIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAiYnV0dG9uLWFyZWEiLCA0LCAibmdJZiJdLCBbMSwgInNhdHVyYXRpb24tbGlnaHRuZXNzIiwgMywgInNsaWRlciIsICJyZ1giLCAicmdZIiwgIm5ld1ZhbHVlIiwgImRyYWdTdGFydCIsICJkcmFnRW5kIl0sIFsidHlwZSIsICJidXR0b24iLCAzLCAiZGlzYWJsZWQiLCAiY2xpY2siXSwgWzIsICJoZWlnaHQiLCAiMTZweCJdLCBbMSwgImNteWstdGV4dCJdLCBbMSwgImJveCJdLCBbInR5cGUiLCAibnVtYmVyIiwgInBhdHRlcm4iLCAiWzAtOV0qIiwgIm1pbiIsICIwIiwgIm1heCIsICIxMDAiLCAzLCAidGV4dCIsICJyZyIsICJ2YWx1ZSIsICJrZXl1cC5lbnRlciIsICJuZXdWYWx1ZSJdLCBbInR5cGUiLCAibnVtYmVyIiwgInBhdHRlcm4iLCAiWzAtOV0rKFtcXC4sXVswLTldezEsMn0pPyIsICJtaW4iLCAiMCIsICJtYXgiLCAiMSIsICJzdGVwIiwgIjAuMSIsIDMsICJ0ZXh0IiwgInJnIiwgInZhbHVlIiwgImtleXVwLmVudGVyIiwgIm5ld1ZhbHVlIiwgNCwgIm5nSWYiXSwgWzQsICJuZ0lmIl0sIFsidHlwZSIsICJudW1iZXIiLCAicGF0dGVybiIsICJbMC05XSsoW1xcLixdWzAtOV17MSwyfSk/IiwgIm1pbiIsICIwIiwgIm1heCIsICIxIiwgInN0ZXAiLCAiMC4xIiwgMywgInRleHQiLCAicmciLCAidmFsdWUiLCAia2V5dXAuZW50ZXIiLCAibmV3VmFsdWUiXSwgWzEsICJoc2xhLXRleHQiXSwgWyJ0eXBlIiwgIm51bWJlciIsICJwYXR0ZXJuIiwgIlswLTldKiIsICJtaW4iLCAiMCIsICJtYXgiLCAiMzYwIiwgMywgInRleHQiLCAicmciLCAidmFsdWUiLCAia2V5dXAuZW50ZXIiLCAibmV3VmFsdWUiXSwgWzEsICJyZ2JhLXRleHQiXSwgWyJ0eXBlIiwgIm51bWJlciIsICJwYXR0ZXJuIiwgIlswLTldKiIsICJtaW4iLCAiMCIsICJtYXgiLCAiMjU1IiwgMywgInRleHQiLCAicmciLCAidmFsdWUiLCAia2V5dXAuZW50ZXIiLCAibmV3VmFsdWUiXSwgWzEsICJoZXgtdGV4dCJdLCBbMywgInRleHQiLCAidmFsdWUiLCAiYmx1ciIsICJrZXl1cC5lbnRlciIsICJuZXdWYWx1ZSJdLCBbMSwgInZhbHVlLXRleHQiXSwgWzEsICJ0eXBlLXBvbGljeSJdLCBbMSwgInR5cGUtcG9saWN5LWFycm93IiwgMywgImNsaWNrIl0sIFsxLCAicHJlc2V0LWFyZWEiXSwgWzEsICJwcmVzZXQtbGFiZWwiXSwgWzMsICJjbGFzcyIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAicHJlc2V0LWNvbG9yIiwgMywgImJhY2tncm91bmRDb2xvciIsICJjbGljayIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsxLCAicHJlc2V0LWNvbG9yIiwgMywgImNsaWNrIl0sIFszLCAiY2xhc3MiLCAiY2xpY2siLCA0LCAibmdJZiJdLCBbMywgImNsaWNrIl0sIFsxLCAiYnV0dG9uLWFyZWEiXSwgWyJ0eXBlIiwgImJ1dHRvbiIsIDMsICJjbGFzcyIsICJjbGljayIsIDQsICJuZ0lmIl0sIFsidHlwZSIsICJidXR0b24iLCAzLCAiY2xpY2siXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCwgMSk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZV9kaXZfY2xpY2tfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMl9UZW1wbGF0ZSwgMSwgNSwgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMywgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzNfVGVtcGxhdGUsIDIsIDgsICJkaXYiLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiZGl2IiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg2LCAiZGl2IiwgNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDcsICJkaXYiLCA3KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDgsIENvbG9yUGlja2VyQ29tcG9uZW50X2J1dHRvbl84X1RlbXBsYXRlLCAyLCA1LCAiYnV0dG9uIiwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgImRpdiIsIDkpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMTAsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8xMF9UZW1wbGF0ZSwgMSwgMCwgImRpdiIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMSwgImRpdiIsIDExLCAxMik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZV9kaXZfbmV3VmFsdWVfMTFfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25IdWVDaGFuZ2UoJGV2ZW50KTsgfSkoImRyYWdTdGFydCIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X1RlbXBsYXRlX2Rpdl9kcmFnU3RhcnRfMTFfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25EcmFnU3RhcnQoImh1ZSIpOyB9KSgiZHJhZ0VuZCIsIGZ1bmN0aW9uIENvbG9yUGlja2VyQ29tcG9uZW50X1RlbXBsYXRlX2Rpdl9kcmFnRW5kXzExX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uRHJhZ0VuZCgiaHVlIik7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxMywgImRpdiIsIDEzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNCwgImRpdiIsIDE0LCAxNSk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZV9kaXZfbmV3VmFsdWVfMTRfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25WYWx1ZUNoYW5nZSgkZXZlbnQpOyB9KSgiZHJhZ1N0YXJ0IiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfVGVtcGxhdGVfZGl2X2RyYWdTdGFydF8xNF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkRyYWdTdGFydCgidmFsdWUiKTsgfSkoImRyYWdFbmQiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZV9kaXZfZHJhZ0VuZF8xNF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkRyYWdFbmQoInZhbHVlIik7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxNiwgImRpdiIsIDEzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNywgImRpdiIsIDE2LCAxNyk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigibmV3VmFsdWUiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZV9kaXZfbmV3VmFsdWVfMTdfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25BbHBoYUNoYW5nZSgkZXZlbnQpOyB9KSgiZHJhZ1N0YXJ0IiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJDb21wb25lbnRfVGVtcGxhdGVfZGl2X2RyYWdTdGFydF8xN19saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkRyYWdTdGFydCgiYWxwaGEiKTsgfSkoImRyYWdFbmQiLCBmdW5jdGlvbiBDb2xvclBpY2tlckNvbXBvbmVudF9UZW1wbGF0ZV9kaXZfZHJhZ0VuZF8xN19saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkRyYWdFbmQoImFscGhhIik7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxOSwgImRpdiIsIDEzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIwLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjBfVGVtcGxhdGUsIDE3LCAxMiwgImRpdiIsIDE4KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIxLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjFfVGVtcGxhdGUsIDE0LCAxMCwgImRpdiIsIDE5KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIyLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjJfVGVtcGxhdGUsIDE0LCAxMCwgImRpdiIsIDIwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIzLCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjNfVGVtcGxhdGUsIDgsIDcsICJkaXYiLCAyMSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyNCwgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI0X1RlbXBsYXRlLCA5LCAzLCAiZGl2IiwgMjIpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMjUsIENvbG9yUGlja2VyQ29tcG9uZW50X2Rpdl8yNV9UZW1wbGF0ZSwgMywgMCwgImRpdiIsIDIzKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDI2LCBDb2xvclBpY2tlckNvbXBvbmVudF9kaXZfMjZfVGVtcGxhdGUsIDYsIDMsICJkaXYiLCAyNCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyNywgQ29sb3JQaWNrZXJDb21wb25lbnRfZGl2XzI3X1RlbXBsYXRlLCAzLCAyLCAiZGl2IiwgMjUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1c3R5bGVQcm9wKCJkaXNwbGF5IiwgIWN0eC5zaG93ID8gIm5vbmUiIDogImJsb2NrIikoInZpc2liaWxpdHkiLCBjdHguaGlkZGVuID8gImhpZGRlbiIgOiAidmlzaWJsZSIpKCJ0b3AiLCBjdHgudG9wLCAicHgiKSgibGVmdCIsIGN0eC5sZWZ0LCAicHgiKSgicG9zaXRpb24iLCBjdHgucG9zaXRpb24pKCJoZWlnaHQiLCBjdHguY3BIZWlnaHQsICJweCIpKCJ3aWR0aCIsIGN0eC5jcFdpZHRoLCAicHgiKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgib3BlbiIsIGN0eC5zaG93KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5jcERpYWxvZ0Rpc3BsYXkgPT0gInBvcHVwIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAoY3R4LmNwQ29sb3JNb2RlIHx8IDEpID09PSAxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgICAgIMm1ybVzdHlsZVByb3AoImJhY2tncm91bmQtY29sb3IiLCBjdHguc2VsZWN0ZWRDb2xvcik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguY3BBZGRDb2xvckJ1dHRvbik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguY3BBbHBoYUNoYW5uZWwgPT09ICJkaXNhYmxlZCIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXN0eWxlUHJvcCgiZGlzcGxheSIsIChjdHguY3BDb2xvck1vZGUgfHwgMSkgPT09IDEgPyAiYmxvY2siIDogIm5vbmUiKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJyZ1giLCAxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVzdHlsZVByb3AoImxlZnQiLCBjdHguc2xpZGVyID09IG51bGwgPyBudWxsIDogY3R4LnNsaWRlci5oLCAicHgiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVzdHlsZVByb3AoImRpc3BsYXkiLCAoY3R4LmNwQ29sb3JNb2RlIHx8IDEpID09PSAyID8gImJsb2NrIiA6ICJub25lIik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgicmdYIiwgMSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1c3R5bGVQcm9wKCJyaWdodCIsIGN0eC5zbGlkZXIgPT0gbnVsbCA/IG51bGwgOiBjdHguc2xpZGVyLnYsICJweCIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXN0eWxlUHJvcCgiZGlzcGxheSIsIGN0eC5jcEFscGhhQ2hhbm5lbCA9PT0gImRpc2FibGVkIiA/ICJub25lIiA6ICJibG9jayIpKCJiYWNrZ3JvdW5kLWNvbG9yIiwgY3R4LmFscGhhU2xpZGVyQ29sb3IpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoInJnWCIsIDEpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXN0eWxlUHJvcCgibGVmdCIsIGN0eC5zbGlkZXIgPT0gbnVsbCA/IG51bGwgOiBjdHguc2xpZGVyLmEsICJweCIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgIWN0eC5jcERpc2FibGVJbnB1dCAmJiAoY3R4LmNwQ29sb3JNb2RlIHx8IDEpID09PSAxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFjdHguY3BEaXNhYmxlSW5wdXQgJiYgKGN0eC5jcENvbG9yTW9kZSB8fCAxKSA9PT0gMSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4LmNwRGlzYWJsZUlucHV0ICYmIChjdHguY3BDb2xvck1vZGUgfHwgMSkgPT09IDEpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgIWN0eC5jcERpc2FibGVJbnB1dCAmJiAoY3R4LmNwQ29sb3JNb2RlIHx8IDEpID09PSAxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFjdHguY3BEaXNhYmxlSW5wdXQgJiYgKGN0eC5jcENvbG9yTW9kZSB8fCAxKSA9PT0gMik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4LmNwRGlzYWJsZUlucHV0ICYmIChjdHguY3BDb2xvck1vZGUgfHwgMSkgPT09IDEpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgKGN0eC5jcFByZXNldENvbG9ycyA9PSBudWxsID8gbnVsbCA6IGN0eC5jcFByZXNldENvbG9ycy5sZW5ndGgpIHx8IGN0eC5jcEFkZENvbG9yQnV0dG9uKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5jcE9LQnV0dG9uIHx8IGN0eC5jcENhbmNlbEJ1dHRvbik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgU2xpZGVyRGlyZWN0aXZlLAogICAgICAgICAgICBUZXh0RGlyZWN0aXZlLCBOZ0Zvck9mXSwgc3R5bGVzOiBbIi5jb2xvci1waWNrZXJ7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO3dpZHRoOjIzMHB4O2hlaWdodDphdXRvO2JvcmRlcjoxcHggc29saWQgIzc3NztjdXJzb3I6ZGVmYXVsdDstd2Via2l0LXVzZXItc2VsZWN0Om5vbmU7LW1vei11c2VyLXNlbGVjdDpub25lOy1tcy11c2VyLXNlbGVjdDpub25lO3VzZXItc2VsZWN0Om5vbmU7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5jb2xvci1waWNrZXIgKntib3gtc2l6aW5nOmJvcmRlci1ib3g7bWFyZ2luOjA7Zm9udC1zaXplOjExcHh9LmNvbG9yLXBpY2tlciBpbnB1dHt3aWR0aDowO2hlaWdodDoyNnB4O21pbi13aWR0aDowO2ZvbnQtc2l6ZToxM3B4O3RleHQtYWxpZ246Y2VudGVyO2NvbG9yOiMwMDB9LmNvbG9yLXBpY2tlciBpbnB1dDotbW96LXN1Ym1pdC1pbnZhbGlkLC5jb2xvci1waWNrZXIgaW5wdXQ6LW1vei11aS1pbnZhbGlkLC5jb2xvci1waWNrZXIgaW5wdXQ6aW52YWxpZHtib3gtc2hhZG93Om5vbmV9LmNvbG9yLXBpY2tlciBpbnB1dDo6LXdlYmtpdC1pbm5lci1zcGluLWJ1dHRvbiwuY29sb3ItcGlja2VyIGlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9ue21hcmdpbjowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lfS5jb2xvci1waWNrZXIgLmFycm93e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6OTk5OTk5O3dpZHRoOjA7aGVpZ2h0OjA7Ym9yZGVyLXN0eWxlOnNvbGlkfS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXRvcHtsZWZ0OjhweDtib3JkZXItd2lkdGg6MTBweCA1cHg7Ym9yZGVyLWNvbG9yOiM3NzcgdHJhbnNwYXJlbnQgdHJhbnNwYXJlbnR9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctYm90dG9te3RvcDotMjBweDtsZWZ0OjhweDtib3JkZXItd2lkdGg6MTBweCA1cHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICM3Nzd9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctbGVmdC10b3AsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctdG9wLWxlZnR7cmlnaHQ6LTIxcHg7Ym90dG9tOjhweDtib3JkZXItd2lkdGg6NXB4IDEwcHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICM3Nzd9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctcmlnaHQtdG9wLC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXRvcC1yaWdodHtib3R0b206OHB4O2xlZnQ6LTIwcHg7Ym9yZGVyLXdpZHRoOjVweCAxMHB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWJvdHRvbS1sZWZ0LC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LWxlZnQsLmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctbGVmdC1ib3R0b217dG9wOjhweDtyaWdodDotMjFweDtib3JkZXItd2lkdGg6NXB4IDEwcHg7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50ICM3Nzd9LmNvbG9yLXBpY2tlciAuYXJyb3cuYXJyb3ctYm90dG9tLXJpZ2h0LC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXJpZ2h0LC5jb2xvci1waWNrZXIgLmFycm93LmFycm93LXJpZ2h0LWJvdHRvbXt0b3A6OHB4O2xlZnQ6LTIwcHg7Ym9yZGVyLXdpZHRoOjVweCAxMHB4O2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudCAjNzc3IHRyYW5zcGFyZW50IHRyYW5zcGFyZW50fS5jb2xvci1waWNrZXIgLmN1cnNvcntwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2JvcmRlcjoycHggc29saWQgIzIyMjtib3JkZXItcmFkaXVzOjUwJTtjdXJzb3I6ZGVmYXVsdH0uY29sb3ItcGlja2VyIC5ib3h7ZGlzcGxheTpmbGV4O3BhZGRpbmc6NHB4IDhweH0uY29sb3ItcGlja2VyIC5sZWZ0e3Bvc2l0aW9uOnJlbGF0aXZlO3BhZGRpbmc6MTZweCA4cHh9LmNvbG9yLXBpY2tlciAucmlnaHR7ZmxleDoxIDEgYXV0bztwYWRkaW5nOjEycHggOHB4fS5jb2xvci1waWNrZXIgLmJ1dHRvbi1hcmVhe3BhZGRpbmc6MCAxNnB4IDE2cHg7dGV4dC1hbGlnbjpyaWdodH0uY29sb3ItcGlja2VyIC5idXR0b24tYXJlYSBidXR0b257bWFyZ2luLWxlZnQ6OHB4fS5jb2xvci1waWNrZXIgLnByZXNldC1hcmVhe3BhZGRpbmc6NHB4IDE1cHh9LmNvbG9yLXBpY2tlciAucHJlc2V0LWFyZWEgLnByZXNldC1sYWJlbHtvdmVyZmxvdzpoaWRkZW47d2lkdGg6MTAwJTtwYWRkaW5nOjRweDtmb250LXNpemU6MTFweDt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1hbGlnbjpsZWZ0O3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7Y29sb3I6IzU1NX0uY29sb3ItcGlja2VyIC5wcmVzZXQtYXJlYSAucHJlc2V0LWNvbG9ye3Bvc2l0aW9uOnJlbGF0aXZlO2Rpc3BsYXk6aW5saW5lLWJsb2NrO3dpZHRoOjE4cHg7aGVpZ2h0OjE4cHg7bWFyZ2luOjRweCA2cHggOHB4O2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtib3JkZXItcmFkaXVzOjI1JTtjdXJzb3I6cG9pbnRlcn0uY29sb3ItcGlja2VyIC5wcmVzZXQtYXJlYSAucHJlc2V0LWVtcHR5LW1lc3NhZ2V7bWluLWhlaWdodDoxOHB4O21hcmdpbi10b3A6NHB4O21hcmdpbi1ib3R0b206OHB4O2ZvbnQtc3R5bGU6aXRhbGljO3RleHQtYWxpZ246Y2VudGVyfS5jb2xvci1waWNrZXIgLmhleC10ZXh0e3dpZHRoOjEwMCU7cGFkZGluZzo0cHggOHB4O2ZvbnQtc2l6ZToxMXB4fS5jb2xvci1waWNrZXIgLmhleC10ZXh0IC5ib3h7cGFkZGluZzowIDI0cHggOHB4IDhweH0uY29sb3ItcGlja2VyIC5oZXgtdGV4dCAuYm94IGRpdntmbG9hdDpsZWZ0O2ZsZXg6MSAxIGF1dG87dGV4dC1hbGlnbjpjZW50ZXI7Y29sb3I6IzU1NTtjbGVhcjpsZWZ0fS5jb2xvci1waWNrZXIgLmhleC10ZXh0IC5ib3ggaW5wdXR7ZmxleDoxIDEgYXV0bztwYWRkaW5nOjFweDtib3JkZXI6MXB4IHNvbGlkICNhOWE5YTl9LmNvbG9yLXBpY2tlciAuaGV4LWFscGhhIC5ib3ggZGl2OmZpcnN0LWNoaWxkLC5jb2xvci1waWNrZXIgLmhleC1hbHBoYSAuYm94IGlucHV0OmZpcnN0LWNoaWxke2ZsZXgtZ3JvdzozO21hcmdpbi1yaWdodDo4cHh9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0LC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dHt3aWR0aDoxMDAlO3BhZGRpbmc6NHB4IDhweDtmb250LXNpemU6MTFweH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveHtwYWRkaW5nOjAgMjRweCA4cHggOHB4fS5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveHtwYWRkaW5nOjAgOHB4IDhweH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCBkaXYsLmNvbG9yLXBpY2tlciAuaHNsYS10ZXh0IC5ib3ggZGl2LC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94IGRpdiwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3ggZGl2e2ZsZXg6MSAxIGF1dG87bWFyZ2luLXJpZ2h0OjhweDt0ZXh0LWFsaWduOmNlbnRlcjtjb2xvcjojNTU1fS5jb2xvci1waWNrZXIgLmNteWstdGV4dCAuYm94IGRpdjpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLmhzbGEtdGV4dCAuYm94IGRpdjpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94IGRpdjpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLnZhbHVlLXRleHQgLmJveCBkaXY6bGFzdC1jaGlsZHttYXJnaW4tcmlnaHQ6MH0uY29sb3ItcGlja2VyIC5jbXlrLXRleHQgLmJveCBpbnB1dCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCBpbnB1dCwuY29sb3ItcGlja2VyIC5yZ2JhLXRleHQgLmJveCBpbnB1dCwuY29sb3ItcGlja2VyIC52YWx1ZS10ZXh0IC5ib3ggaW5wdXR7ZmxvYXQ6bGVmdDtmbGV4OjE7cGFkZGluZzoxcHg7bWFyZ2luOjAgOHB4IDAgMDtib3JkZXI6MXB4IHNvbGlkICNhOWE5YTl9LmNvbG9yLXBpY2tlciAuY215ay10ZXh0IC5ib3ggaW5wdXQ6bGFzdC1jaGlsZCwuY29sb3ItcGlja2VyIC5oc2xhLXRleHQgLmJveCBpbnB1dDpsYXN0LWNoaWxkLC5jb2xvci1waWNrZXIgLnJnYmEtdGV4dCAuYm94IGlucHV0Omxhc3QtY2hpbGQsLmNvbG9yLXBpY2tlciAudmFsdWUtdGV4dCAuYm94IGlucHV0Omxhc3QtY2hpbGR7bWFyZ2luLXJpZ2h0OjB9LmNvbG9yLXBpY2tlciAuaHVlLWFscGhhe2FsaWduLWl0ZW1zOmNlbnRlcjttYXJnaW4tYm90dG9tOjNweH0uY29sb3ItcGlja2VyIC5odWV7ZGlyZWN0aW9uOmx0cjt3aWR0aDoxMDAlO2hlaWdodDoxNnB4O21hcmdpbi1ib3R0b206MTZweDtib3JkZXI6bm9uZTtjdXJzb3I6cG9pbnRlcjtiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBSllBQUFBUUNBWUFBQUQwNklZbkFBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg0QUlXRHdrVUZXYkNDQUFBQUZ4SlJFRlVhTjd0MGtFS2cwQVFBTUUyeDgzL24ycXU1cUNnRDFpRGhDb1lkcG5iUUM5YmJZMXFWTy9qdmM2azNhZDkxczcvN0YxL2NzZ1BydWp1UTE3QkRZU0ZzQkFXd2dKaElTeUVCY0pDV0FnTGhJV3dFQllJaTJmN0FyLzFUQ2dGSDJYOUFBQUFBRWxGVGtTdVFtQ0MpfS5jb2xvci1waWNrZXIgLnZhbHVle2RpcmVjdGlvbjpydGw7d2lkdGg6MTAwJTtoZWlnaHQ6MTZweDttYXJnaW4tYm90dG9tOjE2cHg7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJTtiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUpZQUFBQVFDQVlBQUFEMDZJWW5BQUFDVGtsRVFWUjQydTNTWVVjckFCaEE0VTJTa21SSk1tV1NKa2xLSmlXWlpwS1VKSnNrS1VtYVRGSW1LWk9Vek15U3BHUm1saVJOSmlsSlNwS1NKRXRtU3BJcG1XbVNkTzczNi82RCt4N09QM2dVQ29XQ3YxY3FsU1FsSlpHY25FeEtTZ3FwcWFta3BhV1JucDVPUmtZR21abVpxRlFxc3JLeXlNN09KaWNuaDl6Y1hOUnFOWGw1ZWVUbjU2UFJhQ2dvS0tDd3NKQ2lvaUswV2kzRnhjV1VsSlJRV2xwS1dWa1o1ZVhsVkZSVVVGbFppVTZubzZxcWl1cnFhbXBxYXFpdHJhV3VyZzY5WGs5OWZUMEdnd0dqMFVoRFF3T05qWTAwTlRYUjNOeE1TMHNMcmEydHRMVzEwZDdlanNsa3dtdzIwOUhSUVdkbkoxMWRYWFIzZDlQVDAwTnZieTk5ZlgzMDkvY3pNRERBNE9BZ0ZvdUZvYUVockZZcnc4UERqSXlNTURvNnl0allHRGFiamZIeGNTWW1KcGljbkdScWFncTczYzcwOURRek16UE16czR5TnpmSC9QdzhEb2NEcDlPSnkrWEM3WGF6c0xEQTR1SWlTMHRMTEM4dnM3S3l3dXJxS210cmEzZzhIcnhlTHo2ZkQ3L2Z6L3I2T2hzYkcyeHVicksxdGNYMjlqYUJRSUNkblIyQ3dTQzd1N3ZzN2UyeHY3L1B3Y0VCaDRlSEhCMGRjWHg4ek1uSkNhZW5wNXlkblhGK2ZzN0Z4UVdYbDVkY1hWMXhmWDNOemMwTnQ3ZTMzTjNkRVFxRnVMKy81K0hoZ1hBNFRDUVM0Zkh4a2Flbko1NmZuM2w1ZWVIMTlaVm9OTXJiMnh2djcrOThmSHdRaThXSXgrTjhmbjZTU0NUNCt2cmkrL3VibjU4ZmZuOS8rVmNLZ1NXd0JKYkFFbGdDUzJBSkxJRWxzQVNXd0JKWUFrdGdDU3lCSmJBRWxzQVNXQUpMWUFrc2dTV3dCSmJBRWxnQ1MyQUpMSUVsc1A0L1dIOEFtSjVaNmpIUzRoOEFBQUFBU1VWT1JLNUNZSUk9KX0uY29sb3ItcGlja2VyIC5hbHBoYXtkaXJlY3Rpb246bHRyO3dpZHRoOjEwMCU7aGVpZ2h0OjE2cHg7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7YmFja2dyb3VuZC1zaXplOjEwMCUgMTAwJTtiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL3BuZztiYXNlNjQsaVZCT1J3MEtHZ29BQUFBTlNVaEVVZ0FBQUpZQUFBQVFDQVlBQUFEMDZJWW5BQUFBQm1KTFIwUUEvd0QvQVArZ3ZhZVRBQUFBQ1hCSVdYTUFBQXNUQUFBTEV3RUFtcHdZQUFBQUIzUkpUVVVINEFJV0R3WVFsWk1hM2dBQUFXVkpSRUZVYU43dG1FR082akFRUkNzT0FySGdCcHlBSllHamNHb2N4QW00QTJJSHBtb1dFMGVCSCtlem1GbE52VTA2c2hKM1c2VkVlbFdNVVFBSUlGOWY2cVpwaW1zQTFMWXRTMnVGNTEvdTI3WVZBRlpWUlVrRW9HSGRQVi9zSWNiSUVJSWtVZEkvOVhhN25leXY2MStTV0ZVVkFWQ1NjdDAwVFduMmZ2NnUzK0VjZmQzdFh6eS8wK25FVXUrU1Bqby9rcXpybWlRcFNjTjZ2OThYZXdmQTgvbE1raUxKMld4R1NVb3BjVDZmTTZVME5YOS9mcmZiamV2MVd0ZnJsWmZMaFlmRFFRSEcvQUlPbG5Hd2pJTmxIQ3hqSEN6allKbS9USldkQ3dxdUpYc2VGRnpHd0ROTmVpS01PSlRPOHhRZERRYWVCMjkrSzllZmVMYUJvOUo3dmR2dEpqMVJqRkZqZml2N3F2OTV0angvN2xlU1FnaDkzZTFmZk1lSXA2TytZUWpoby9ONzkxdDFYVk9TU0k3Ti8vSys0L0dveFdMQngrUEI1L09wNVhMSisvM09sSkpXcXhVM204M292djVpR2Y4S2pZTmxIQ3hqSEN6allCa0h5NWdmNWd1c3ZRVTdVMzdqVEFBQUFBQkpSVTVFcmtKZ2dnPT0pfS5jb2xvci1waWNrZXIgLnR5cGUtcG9saWN5e3Bvc2l0aW9uOmFic29sdXRlO3RvcDoyMThweDtyaWdodDoxMnB4O3dpZHRoOjE2cHg7aGVpZ2h0OjI0cHg7YmFja2dyb3VuZC1zaXplOjhweCAxNnB4O2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBQklBQUFBZ0NBWUFBQUFmZkNqeEFBQUFCSE5DU1ZRSUNBZ0lmQWhraUFBQUFBbHdTRmx6QUFBQ2V3QUFBbnNCMDFDTzNBQUFBQmwwUlZoMFUyOW1kSGRoY21VQWQzZDNMbWx1YTNOallYQmxMbTl5WjV2dVBCb0FBQUlBU1VSQlZFaUo3Wlk5YXhSUkZJYWZzeE1TdHJMUUpwQWdwQkZoaStDOXcxWVNvMDBJNlJaL2c5dlpwQmYvUU9yNEd5UmdrU0tOU3JBYWRzWnFRR3dDa3VBV3lSWkpzeVN3dmhaN04vdmh6cmdiTEgzTGQ4NTk3amx6ejUwekpva3l4WEg4RHFEVmFyMHFpNnY4QmJJdHFTR3BFY2Z4ZGxtc0ZXWGt2WDhBZkFWV2czVUtQRW5UOUdLdWpNenNBRmdac1ZhQ04xVlRRZDc3WFVucmdFMWt2KzY5MzUyNjhXUnB6cm5IWnZZUldDN1l2QzNwUlpabDN3b3pxdFZxaXlIOUlnakFzcGtkMUdxMXhVSlF0VnJkQjlaS0lBT3RoZGcvUWM2NUxVazd3TklNb0NWSk84NjVyWUZoa3FqWDYvZDd2VjRHUEp3Qk1xb2ZVUlM1SkVrNkZZQmVyL2VlWWIvTW85V3dGblBPdlFiZUF2ZnVBQUs0Qk40c0FKdEFHL2dKSUVsbU51aUp5YmEzRUdObVppUGVadUVWbVZlbGwvWS82TitDekRuM0FYaEVPT283SHYvM0JlQXo4SXpRa01QbkpidVB4MXdDK3lZSjcvMG5ZSVA1Uy8wRkhLZHArcndDRUVYUlMvcmY1SGwxR3RiMk0waVNwQ09wQ1p6UEFUbVgxRXlTcEhNTEFzaXk3TWpNRG9IckdTRFhabmFZWmRuUndCaDdKOTF1dHdtY3pBQTZDYkczR2dQbGVYNGpxVUgvYTFDa3RxUkdudWMzaFNDQU1CMzJnS3Nwa0N0Z2IzS0NRTW1ramVQNFdOSlRock5OWnZhbDFXcHRUSXN2N0p0UTR0bUlkUmE4cVNvRXBXbDZZV1pOb0FOMHpLeFpOUGVocExTQlp2MnQrUTBDSjlsTG5BUlFMQUFBQUFCSlJVNUVya0pnZ2c9PSk7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0O2JhY2tncm91bmQtcG9zaXRpb246Y2VudGVyfS5jb2xvci1waWNrZXIgLnR5cGUtcG9saWN5IC50eXBlLXBvbGljeS1hcnJvd3tkaXNwbGF5OmJsb2NrO3dpZHRoOjEwMCU7aGVpZ2h0OjUwJX0uY29sb3ItcGlja2VyIC5zZWxlY3RlZC1jb2xvcntwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MTZweDtsZWZ0OjhweDt3aWR0aDo0MHB4O2hlaWdodDo0MHB4O2JvcmRlcjoxcHggc29saWQgI2E5YTlhOTtib3JkZXItcmFkaXVzOjUwJX0uY29sb3ItcGlja2VyIC5zZWxlY3RlZC1jb2xvci1iYWNrZ3JvdW5ke3dpZHRoOjQwcHg7aGVpZ2h0OjQwcHg7Ym9yZGVyLXJhZGl1czo1MCU7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9wbmc7YmFzZTY0LGlWQk9SdzBLR2dvQUFBQU5TVWhFVWdBQUFDZ0FBQUFvQ0FZQUFBQ00vcmh0QUFBQWgwbEVRVlJZUisyVzBRbEFNUWdENjB6ZGZ3T2RxYThUbUkvd1FNcjVLMEk1YlpMSXpMT2EybnQzN1ZWVmJkK2REeDVvYmdDQzNLQkx3SjJmZjRQblZpZGtmK3VjSWh3ODBIUWFDTG8zRE1IM0NSSzNpRnNtQVdWbDZoUE5Ed3Q4RXZORTVxK1l1RVhjTWdrb25WTTZTZHlDb0V2QW5aOHYxSGp4ODE3TWlsbXhTVUI1cmRMSkR5Y1pnVUFaVWNoL0FBQUFBRWxGVGtTdVFtQ0MpfS5jb2xvci1waWNrZXIgLnNhdHVyYXRpb24tbGlnaHRuZXNze2RpcmVjdGlvbjpsdHI7d2lkdGg6MTAwJTtoZWlnaHQ6MTMwcHg7Ym9yZGVyOm5vbmU7Y3Vyc29yOnBvaW50ZXI7dG91Y2gtYWN0aW9uOm1hbmlwdWxhdGlvbjtiYWNrZ3JvdW5kLXNpemU6MTAwJSAxMDAlO2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvcG5nO2Jhc2U2NCxpVkJPUncwS0dnb0FBQUFOU1VoRVVnQUFBT1lBQUFDQ0NBWUFBQUJTRDdUM0FBQUFCbUpMUjBRQS93RC9BUCtndmFlVEFBQUFDWEJJV1hNQUFBc1RBQUFMRXdFQW1wd1lBQUFBQjNSSlRVVUg0QUlXRHdrc1BXUjZsZ0FBSUFCSlJFRlVlTnJ0blZ1VDQ3Z1JyQUhOK1AvL09yLzYxWTV3T05aN21aMXUzWEFlTE1qSlpHWlZnZEtzZmM1eFIzUzBSSUlVVytDSHpDcGMyTWNZbzdYR3YzZXg3VWlaZDU3cmp5enp2K3YrMzNYL1IvKzNyL2Y3dlIzODZZK1R2S05jZi93ZGhUTFBjdjlxVTJ3WmQ3NHV0aDB0MTgyMWprSVpMUGNzSS82bldhNFh2dXRxdVUwWjg1bW54ODBTL1p6Z3BuTG5PdEhOdDcvb2Z4MVRLWGNTTnpOLzdxYk1RM2p1N3JOUW1NWVlkLzRzMmo5YWErUCtnR2FNY1pyYjFNL3RkcnZmNy9kMnY5OVA5L3Q5M08vM2NidmR4dTEyRzlmcmRWd3VsM0UrbjhjLy8vblArMisvL1hiNjZhZWZ4bC8vK3RmeDV6Ly8yWUs1QWwycmd2ZjRVc2JwZEdyQjUyYkF2QXJYcHV6am1pcUFWU0d6NWVEbUdZWHpoYkFabUNybm16ZGRwVVUrOFkxZEFPWWVYQ3REVXdWd1Y3WUNHSDZ1QW15TWNaOWw1dmtVYUJQR01VWjcvSjV3Lzc5Mi9mdnY5WHE5MzI2M2RyL2ZUeFBFQ2VNRThuSzVqTS9Qei9IVFR6L2R2MzM3ZHZybGwxL0dQLzd4ai9HM3YvMXQvT1V2ZndrVnN3b25namRPcDlQekgzVTNEM3ptV0duWlZYbjRqQ3FzN3dDMkJLUDQvOHRBemtac29XeDZYcnFlSFp5bXZwNEFCQ0JKaFRRd0tmRFQ4Z3pyWkNJcWk1QWhpQUNqQmZFQjJyUDgvWDYzTU03ZjYvVjZ2OS92N1hhN2JZQzgzVzdqY3Jsc1ZISXE1ZmZ2MzArLy9mYmIrT1dYWDhaUFAvMDAvdjczdjQrZmYvNzVKU3ZiZXUrYkwyV01NYUZiQWxwQk5NODVRWCtjdDZxb1Nxa1BBd3VRbEJWS3FHTkZTVU9BQTNCbXU3Z0M1aE5PZDE1blN3dkFPVVc3QzRnaVVDVjhTZ241TDloTkZJcVRzcDBHeEkweXNpb3lqQWprWS90R0pWRXB6K2Z6K09XWFgrN2Z2MzgvL2Y3NzcrUGJ0Mi9qMTE5L0hULy8vUFA0OWRkZng4ZkhSd3JtVGpWNzc5RVh1MnB4Mnhoand0ZEpaUWNBV1FJUExQSVNzTUphU3dpRDhneklLcndTeUFURTVqNW5BYlI1YzFkQlV3QmxzRVdXMGg2THFpWXNxRlBBUXhDeVJaM3dPU0FSeG1sWE1YNWs2NHBRZnZ2MjdmNzUrZGsrUGo1T0h4OGY0L3YzNytQYnQyL2p0OTkrRzkrK2ZSc2ZIeC9qY3JtVUZMTzMxZ1lEV2JseFJJcy9UcWZUN291c3hKc0F4WEEyR2M3VEE5WGRnZmRvSGJGc2o3NlgyKzFXQXJnSTFhZ2VHd0EzcXVwcW9Ic21jYkk2RnU5M3F1Z2dGYTlkN0xlRHRnS2ZBRkhCSitORUJ5SWtjSjVLZXJ2ZFRtaGhHY2dKSlNaNXZuLy9maitmeisxOFBwOCtQei9INStmbm1HRCsvdnZ2NC92MzcrUGo0Mk44Zm42TzIrMVdzN0pqalA2d3JhTUk1RTRSWjh4MnZWNVRTd2txdW90VjcvZDdUejZIRldzRC9xTmNkdzBDUTNxLzMyMWM2ODZUd0RWSWRidXk3M3pObGRoU0hiOEkya2xaem5tK0luQlM0VTZuMDMwMmFCRnNMaEhEQUtKVkpWZ2xmSTlqaHZ1NTNXNTNzTEFOWU54QWlEQTZNQ2VVSHg4ZjkrdjEyaTZYUzd0Y0xxY1pXNTdQNXllWTgvZno4M09jeitmbnNTbVlVeWtuV0VHODVXQnN0OXN0elNMeU1kZnI5UWkwOGlZMTVVWjBMbERHTGhSM281eksyajdPUFVURDBFK25VM3RrN1hiLzE2TkZiaGxvQU11WTF6akxVT08zQktlSURlK1o4czMvSjRnRm80VE01alBtdVJnMjhmb1VLS1ZTd28xNlRnQTVucHl3Y1dMSGdZbC9QejgvNzMvNjA1L2FiNy85MW02M1c3dGNMaWUwc1pqNG1hbzVnVHlmejg4RTBmMStqOEVjWXp3VFBFRzJjcWp5ZkhORjBNOGZ1cUVpYU9WblJ6WlpRTmg1ZndReUhnL0hER2ZKbzg5UTF6Yi9xdXU1WEM2NzczSTJYS2ZUcWQvdjkrZDN3dXFXdmEvWVRkVWRFVjNmaEl2L1ZpeXBzNllFM3gzcjQzSzViSlFTNjZ6YXhWR0ZzdmQrLy9qNGFGKy9mbTNmdjM5dnQ5dXRmZjM2dGYzKysrL3RkcnVkdm4zN1p1TkxCYWFDTWdVekMrclpSaUZvd3hVdUpJOFlNcWNDcDlPcHE1dmFnYVlVNmxHSkExWFFxZWpjaHc2Q2owR3c1bllCckd3MDFBMk8yMDZuMDRCR291Tk55VGZwL0Z3RWxoVWV5Nm5YcklLdzdRUVdkZHh1TjJsZEw1Zkw4MzlnU1BGOGFodS9KdkJPNDhDUFN1cU1mOFZwOS9QNTNMNTgrZEx1OTNzN244L3RmcjgvMzkvdjkvYjUrVGtoUEozUDU2bVE0MzYvaisvZnYrL2lTZ2J6ZXIwK0FaeC81Kzg4YnY2T01kYTZTNXo2a2QyMWZZQzlkeHY3Y0lKSjJkOUFPUzMwZlBNenlIaVRNOEI0REY2WFVsWUhwNEtRVzNXKzF0NzdNTkIxdkdIeFdxN1hhN3ZmNzgreTUvTjVBK0gxZXQyOXh1UDVkYll0eWFSdTRBa3NiUHE2OTM2ZmpSelhSeEJiUHIvYitiMTgrZktsalRIYUJCQmZuOC9uMC8xK0gxKytmQm5uOHptMHNCOGZINXU0Y3I1R3VCaE1WazBFRW45UnNjdGdWaE0raXhsSnRNQTIzUjhCNnl5c0FzdEJPZ0ZYSUtLQ01JZ1RvTXFORXUyZllNSDd6dGM3MzJkUUtrQ2oxeXRBWnRZMEt4OHBJcjhHR0orQVQzVisySGlyaGwrK2ZCbVh5Mld6NzN3K2IxN1A4cCtmbjgvdFV3R1ZsZVZrVHlVYjY4RGtmYXlXWTR6eE5SaWhVNEVwTEpQWlZySyt1N0o0L21nZktxZUxXOVgyUkVXbEl0TDFkaXluYkREYjMralhnWWpRcW4wcnJ4V2MrTmtJTFA3Rjd4SWJNdng3dlY1M3g0MHhubGJXSkYxMlpTYWcvTjBwVzZ0K1p6bU9NekhqYWpLd0Rmb25kNzh6WVRkZnExOHVwOTd6cjJxOHYzSWlvQnByUnRCbDBFWjlvZzVXQlJHT2RPSGpJalhGN1VvdEZiZ09Xblh6SUp5ell2akc1SVlnc21NT3hIa3o4T3NNU3JWTldlcTVUOERhT2NiRXYxT2Q1cmJzOWFPN1l2TWV0NjNFa0YrK2ZNRXhxK01SbDQvTDViTFpOLytleitmblo2S2F6dU1xWFNRVk81c3BKWGZsSEFJemVzL3hKc2Vja1JKaURNb2c5ZDZWZlJycVhNcjZLcFZWMjdqUndKYWNHb3ZPQU0xek1kUU1ud0sxQXViSzYza2RDQ2h2STFDN2cwejluZi9EK1h6ZTJWajhIN0d4NFA5ZHVRbHNZQ3JxeU44WHFHM0htLzEwT2ozancvbitjcmxzdHVNK2pQbW14VDJkVHVQejgzUHp0MnBuMVhzRUhYL2JuUGFWcVZtaDB4d090MG82WExMQUhlUFVVMjAzd0hmY3JzcEN3bVYzVHJ5QjVzME1zZWVnOTd4L0J3ekNqQmxiQitwUkFQbGEwQlZRdVQ2VjZRSGRCbGozZDBLRzE0N2IrRHF4UWVVeW1ETzQzVzRkUWFyK1RJandtQWQwejgvaDY1dmYwL3lMdjNQYjVYTHBydS95ZERvOXM3RVQwSStQajZkS0s5VlVFSWVLV1FXUEFPcko4TEtkNHZFK3Q5MVkzZTdVRmxXYXRnMlZ3Sm5iK0hQbXR2bS9zZks1OS9PYVdGM3gvZVAxVVBIdkE1RERZRHBZWGZiMGRydjFWMkRrQmt4dHcvdEVXVlZsWFdkQzlwRllzNS9qZmg5ZFMvMTZ2VzdzNmxURytUZnFzeFNKSHhrWFhxL1hkcjFldTRMc2ZENlAzdnNUM043N0RrTCt6UG01alNkS0w0elIzQXhRZDZySGtMa1lsU293c3JxN3puenU2d1N3ZHNNSk9YbUE1ZkJjanh0Z01HQllIbHI1em9raHRzTUNUZ1hMUU9XNFhDNmRFeUVNcHJMOG1BUXpYUmdkdWl4Mnlaem9yeGtZc0RuM2hCMVZlTUxHc1hzVnRnbDJwVzhTM3N2azB2dzdSNGhOYUh2djRjQUNsNUhGendJSDBLYzZ6dTRYakRQUi9qcEFWeFd6TzFYazJERGIzdlRjeGVHVTFpV1pIa21JRFd6aVdLdmlyQ0o0RHJhdnM2SUovR0c2Y1RxV2RYRHkrZkFyUURWVmtMcWtWakFvWklJVGRtbUlxWHdxYTk1TjMrTUdZb1pRZFJWTk81M1kxeFJraE8xNnZZN2V1NTA3Q2E5bEpuYkdweE9lbVFoU3cvQVFzbW1wNXpVOUJpVThHNnd2WDc2TTYvVTZQajQrZG8wQno0Q3BnaWtuVFVlRHF3bEtCbWczdTRPVmpyWjFBK3JBY2dhZWpXcTZlSkN2Q1lGRE9OU3dPZ0hYNEVRUnc4bHhiekRPZEVLNmdaM0hrMWIrOGcybzFKRnRLWHl2L2ZFZFRYdVdqV1hkQVppQnA2QURlRHJDRmlpbTdCNlpGbmVlSTdHdm0vUE1rVURYNjdXN3hJOGIwRDcvdjhkQTlxZk41b2FDZjc0V1pqSDBtZjFjbWZZMVkwSlVGbVZyVFd1OHV6a05jTHRFajd1NUZYQlRrZkM2R09BNXE4WU14TzhLVnZGNnNBVkdkY3JVYnNLT0RjUUtrTE1PTWRtbHh1bTY0MllyUG0yNkFsaFpXMVlCMVIrcnJHc3dFOFRhWUFXZVVNeGRmK1dqd1N2WjJFZjN5dE95Zm41K1BwVlBBYXFPbjQzTXROQnF2bWpqeGJqTTRsWmpaWTRncU5NSTVrdGFXL3NZS053Uys5bEZRekdpaG1NQ0tQYTcrWjBWNkViMEdSbW9idHBYOEpsald1NUZNTE41amE2aEc5a3dRZ1pxZjUrMU5INVV4emtGUmVDZFdoSjhYZGxHVWt4TzdIUmxZUm00bVZPNDNXN3RlcjEyVFBKRXcvcm1FTjNMNVNLSElXWmc5bXorcFVvS09ZcTViSlRKZFgyZ21lMVVjeE1aUUZhRVFJbEhjdDMyTStZMUJ6R2tHdXpmaXlBTjl6K3VncGxaMXN5bUNyRENZWWtHeERUcEk5UnpCeTBySHllRFVDMW5XYWVVYUQ5bjR4a055WU1CRFp0elozQisrZkpsWTIxWEZET2NBUkpsYWJPeWlTM3VDcExJOWpyWmpDRGthVnZjQ0Nqd29nbktTaFdkelhaV2xaTXZWVGdEOExwcWxDTHJxZ2JjQitxWXdyZ0tZcFQwY2NDcWJLeUNWYWxrRWFibi9GeW5vZ0NyUEtmcWY1MXhKN3NHQjJaWGNabXhvU096dGp4MzAwRFppN2EwLzJBSVIwVWxCYWc5U3VEdzZLY0F6bGFCN3ZIWnZXcGpLOTBkeXJxNmJLeURVWlFiUjBCMDViaUxRa0hJY1NVbWdJSytTd3VxZ0hDbm9pbzJSUVUxeWorQm5CeTlwcGhWS0xHeUM3WnpGSzFweFdLK0U4SWhWQ1dMTi91THRuVVU0YXlvWUxvYUFOejhGZHRhU3ZZNHBWMEJFVzJsczYxY3pxbGxCS3BUeUtnTUFocloxY2RjMVJST3RQbXZXTmtkY0taN1pLeGFXamlQTEpNcHA3T1pLeEErcnFHL29KTGp4ZjBwbkpscUxvRFpvM2d5VTBtS0d5czJ0YUtlY2ovZDFDK3JKU3BsQnFsVHlBcWdSK0Q4S2pLbG1STDJndFVjQWRDdHNMK2lqQ05UMW9xcXFrSDJPSEViRzVzREZuVWc1QWEreUxvdTJWVTFwdGoxUzJaUXF2MU9SWk45SVd6UmZnYVJCeEtvQkU4VVd5cWxKRnRySWMwQXhOalNqZWQ5OUNUWS9YRGZTekN6NU0wSVpvVkVzV25QRk5Uc2w4b29WQzFUemJHZ3FGWk5EU2dWd0tLKzFzR0RNS3F4WkNXR1ZNRHlzaUVyMWpWU1FKVVl3ajVpSE9sVGhkSHQ0NFNRZzlDTitubDhEOTBOTUlnQWRncjQ2SnFSaVI5STh2UmRGdmJyMTdtL3l4VU1Lak5MTWlWVUFEd3UyQ1dHaGhpK0Y1NVRXTTlNOWNvZ3ptczFkbk00dU9GL0xBRVlXZGNxbk03eUZteXEzSWZ3bU9ST2Q3WTFpRld0T2pvWThUbzQxbVRWNUl5c2dGRnVSenNiV0ZHYk5JSUpDRHYxZE9vNGxaRzdqV0J3UkZ0VlRLdVd5ZUNCeUpLT2FuOG9aM2VwOVhkZE5sMHREdWF5d0x6OWNYUFllREFBMFNwa0JPOXNiVmNUT1ZXbGRQdjR1eXpFa3p4SHRqdm9uSG9Ta0ZFV05vbzFkOERoY1FwdXRkMnBwTm9uNEJ6b0FpSjFoQkZRZzBkVnRkYkdISERRV3VzaG1ORVF1a0xNMlFPMUcyWThiZ1RYcUZoY0JKajdFalBnY1B0czhVUzhxUHBQQi9kWHpuT2g1WjQzOHR6SDVlYzZRZ3JPS3JSUmZLbXlzQm1VREIrUGhZYWJNbFZQRVIrR0NTSVRUenI3YW0ydEFySDNiZ2NFelBKbStjcjVqSjRObkhORkRWckZYY0k1TGU5azVKbncrYmVkYlYrRmZSelpJSGFPT2FPc0xZMC83VUdzNThEanJHd0tNSU1GSUd6T0VXMS9qR3NkQXRDTjZoRUFJNGhCZTlZWGVSUk9CU1ZQQVZQQXF2SU01Yng1aFZLV0FNUDZ6QlJ5M2llc2NyaWRWZEZCaW5CeFhEbkcyR1JZMlhiQ3ZwMWxodkd0TzlCeHU1aDkwOFhRdTQybG5TQXJNRmRpek1pbTh1d1JDeFBHbm5PUzhsd3BuYk9pRHFUQWpzclJOL1Bjb0FTY0NiYUFDcVZNNDB5bG5qalRCcytid1dsQUcyMy9VS2Jka2l3S1dJUVBHeldhY3pwb1NseFBFajgyMmNOV2twUzdGeXpzRHJxcGZncEczamFodzJ2Z2JhU1FBeHVMV1pZdDdKenlOZThKb1pwTkFjdkRGT2R3MHdxWVQ5QUsxclp6L0RkYlNsTFBwMHJ5SXhnUUpsSzlBWmxFcTdJT1hwb2hnOVBJaHJDbmc4OEpzT3hpVjRaV0FZZmc0c2lreC84a3kyWjlsODYydXF3cmZzY0lIOCt1Z1RtVkd5aWRkZVZZVWdFTW40R1p6ZzE0RXdJc2g5c3gyY0tLaVdYUmV1T0U1Z3pHT1FnZGxSS1ZWZGxldnFiMjc5WHEwUW5zdHMyVkRhQk8wY29lenNydVd0SEFwdTZzS0c0SUJoTjBhR1Uya0xyTUtHUlROM0htYkNEd0tWMTR6dmtNRURHNFFmWlZzcFZsYU5VMm1oYzVURVozTjFoL3pxVGhldUxwVzA1WldUR1ZqYjNkYm5ObXhLWkJuTjhKcWlkYVZMS0FPeUFSTkxTK01CNTRaMitWYXFvTUxLcm9WQmxuZ2VmblRQQWNvSE5XQ1N2bGZBOENJMEhFbUJOQm5CbFh5TXJ6VTdBN1dWbTk0UFBxUTJnbXFLeCtXREdzbnZpbG1jU09CSnFPSzFuWXlBSXp1QXllc3EzVWRTSzNLZldjWUtEOTVIbWZZT1UzcXNlcjJDdFlFVUErRnBmcWROdmdQQlpVQmhEckdPTlJWbFFzaDhyTGNhVUN5a0hHME9PVXdUbExCcnNoNXNvRU1HZXppMUU0SFJWdDFpY3A1d1pFRlhkaWJDa0c4WTh2WDc1c2JPNEUwaW9tOXoraGpTaU9meTNEaHBYSXRwVmhFK1VHUWR2b1dqdENobXJHSGY0WUF6S2dCTm5HdHVKeEZDZUdkaFVBZlFMTEs4a0JZQVA2Z3ZGSlphak1HM1hreWN5OEt1QzBxNEV5eW13dHdkeGR2Mk0wbUlCdEswTEtuZjY0MGowMEF1cTRnVWtkV0dsaHMyMnFKYzZkWkNzTDE5b3hubFRKRzRTWVZSSUdwRDhUUEZCdU02T0VsYlMxcGxkaWQ0bUdBeU42Wkl1cGJDNWJYSk45ZmRwYlRoU3hMVWFJOElHMVhJWUJ4VzNUanM2S1Fvc0tjeGZ4Y1FtZG53UkdNMTBHbkZjQ3kyWFl1bkxNeUFrZGdrNG1lUGljenNMeWd0aGNCdXQ2Z29PcVM3WVZGWEFETGphb3NCNnM2b2ZjWldBWlNJUllxU1VraXpZd3R0WWFiM3ZVT1E5dzJIUnhJSWc4V3dSVmVFNjh4aTRVdEwzelJwaHhwbHp3dVpyY3FZQ3ExSTNqUEk1ZG5KSXlnRW9oTWJQcVZKU3pyd3p4QkpUczV6TitSZVVTZ3hpa1BRVkYzSlZCZU5ReGJIRU5yRU1OdkVkRlpWVjlsSDkrT1JHRXNOWlFweVROYzRDM0FHN1hGNG5nenErRHJPMnpidWFhT1hnZGFGY2RrRW90b1NGQlZYMnFKMEM4T1daZUc0S0dscGdoQTBYZlRPUENxVjJxcXdRMjZRV2ZGMlBNTGhJMncxbFZBYTJhUHNZZDB6YTI1TVFSd2djWk42dVFEQ2krWnhpRDRYRU0ya1p4T1Q0MUZuWm5hUmxjcFpvdXpsUnFxZGJRVldvcFFvU0I1OFJWNTBsQk5ySGkvQXdYUzVMcndEVmxwWTNGYzNCeWlZR2M1MlRyaXN0NmtPWGR3SW5BUXRKcHA1UWNoeWFxdVlPVjdTdStmeFZNYVYzZGMwUkUyUzZtVVkwZ0x0MnBNY1lxcktJUTl3MmwxZ3BRVU10UVljbW1idDVEVE54ZGhuVUNqUXF0Yks5U1VTenZyQzBtbWhoRTFlMkZTMitveHlweS9aQVN1dGttdGp4M3ZjQkMyNFBYNjVuYnFrQkNSaGZqUzlrSVlQbmVlOGNNYWdWT2hJLzNUMWZBbWR0QVdac0Nzd1RKQ2tRVk5hMHFXS1NLUE9wSEFVaEQ5RHJiVmN5b1lrd3FodmgxN3ZZQWF5WExReUtHWWR4bFVERnA0OTRyQlhSallnTzE3RERZZXROSVVqL2V6cDZTMGxubHBFd3NXbUpNa093c0tYZVpLRUFqSUhuMEVRSklTYVJCY082VU1JTno3cC9iRWpqbnc0ZnQreG1EdmtzeFg0RzJySXJpczdxYWVLd0FGTVAyT2k3bjRjcml1Wnd0cFNVd3BmTHhTbk9SU3JJcXVzYzVaRmFYeXNxUldqaVoyRHlBV0VJTDM1dFZTb1FFbEZBQ2pPZUdHU0U3QUhFUWdkby9MU3ZDT2dHQnZreHNtRGJ2bFMzRnA1dmhhQjJUQUdxUktyS0tNcmhMVnBhR3pFVmpaME9ReERoYUNUQStReVJSMWQxNWFRenJKbnRMM1JpYnNpcGpHNmpsZ0w0eXFiUzBzTllnMWU4NHZoYkJWckVsSzY0Q1VjV1lYRGZLeGhwSXV4aVZKWlV4c2JNeS91UkJLVE5SUTRrUTNMZFJZTFMwckpqUlBsVFBxWTZnZEpzRURjK2FRWEFuK0hnc05VQ2JSdUYwT2owenduQTdiV0RrYmhPNUVuczAwcWVRaFMxbGFCTWw1TS9jQWF4c0xGOHJLeXFsK1RmN0VMTEVHdS9peGlpbWRDdm8wVGpmcGpLd2FnZ2VuNGVoNXY3TG9rTEtiTHV5dkhoY1pHOGRoR3JFRHg3SGc5M1pwcEpGN3FCcU8zaVZ2ZVhFRFFOSW56ZW9lOFlxNmVQYVpCWjJKdmlNM1cyVUFHb3Rla1JDQUdxNEVrRjFYM0RPblIxMXlSc0JMMXRSYTBQVmNaaU5GWFoyYzM0RnNrdm9tSW5RUTZsenBKb1piSnhrNDNOd0tKRkJxdUpTc3JCeUh5ZHhLT25UeFFBU0JtUzNqK0pNbnNIU2xhM0VjNks5VldvSlZuOXpmandPTTdocVlBQXFKUXdFMmEzbkE0OEoyUUdlZ1JrcFpOaXZTWSt5czNFa0tkNG9KSXdzdklIbDNjV2dMdDVrNE5INk9tdExXZHB1ck9rd0VNdXBZYzdlTXREUmhPY0kydWk1SmhWSXpYekx5dG8vR0FQdVpveW84d2tvZHVWZ0pnbEN0N09oR2JnSUQ0TXE0c2krNjN6VVMxRnVGRlhGbHF5YWoyZW1IbExNY0JxWXUwRk11UjI4QmJCN2xPeFJNU2lDUVhGaENLdXdraForcFlEaUdTZ2JzS0tWOE1pU1JzdUhTSVdNOXJrbFJpSWxaWnVxWGpzUUs4b29ZSk1ncTNKS1dWa2hIYmhzVnhGVXp0aE9XUGtZaWpjYng1NElLc1NkVCt1THIzY3JHS3lvWWdGaUdSOWlCazRrZmxvVVgrSklsUVJRcWFibXBnbmhxdHBRcGI2UlZRMVdINURuclM0aEVvR1pxYWVyUTJkaEZiejhYZVB4U2htRGJvNzBlSVNqb29yTzJ2SzhTSlhJNFNVbUVVNHpXS0R6VUR0V1RZdzd4WGxiU1RFajRGUmc3ektuS29HUkFMdjBHczlUZ2MxQnBDeXdHWlJRQXRxVnoyeHJCY0FNekVwZlp3RlNhMkc1VzBRQkZqU01hcFdBRUZhM0hjR043Q3hEekVDeUlrSjk3cXdycVdOVFdWbzg3NlBQc2pQa2oyd3Zncm9NNWxMWktNRVRLVnFsL0N2bldWRmlGYS9TekpVUXdrb1pzcjY3WTZ2bFNSVjMvMnRtTlRPWTN2bmF4WXdNdW9QS3FkelIxdzdJcUh5bWxQeGFBVGhmVTdLbzJaWFlqNEFZSkhMK2tOZEt3UlFZRVNUUmE1ZnNVWi9yVkMxVE1UeVdWeVlvcU50dXphSHNNeXYydHZvYXJ4ZGZxd1lnVTFheEZvL2NucWwxRkdzcUsrdUFST1Y4Qlg0R1U4V2NaVEFUaTJxN1FjeWkwTzBWK0doV0JNTlJVa244SDFTc1dWRTVCeTNHaTBFQ3FVZUpvQmZBdERhNGFta2RYRzM3QUdQNUdnZWI4NHA3VWF6cG9LUnpkRnplUThIa29IR3hwckt5L0hwbTV0MTJwNDdKNnhUWURFejd1SU5FWFN1eFlYdkZza1lBYyt5U3hIOXNmNWZ0S3pVNklid1ZCY1VHZzVlNUZNQ0VYU0VyWlIwd0dheVYxOXdvTTlndVBqVHFKZFZUcVI0dUU0bkpuTGxkV1ZrRUNDWkxkMlZMRit4dGFtZXg3SXBpcmlTRFVwdnJwbjlscndHTUNIeXBwTUgrcHM2TElMc3VGR1VqMVhFT1hpcWJxU0hQVUtuQ2xwV1Y2OGtxdFVSVk5EWTRUTmFvY3lrb1llVFU1bmdHRVFhL1MxRG5uRTRBZVhNY0tqSFBBbUZWakNCRU5hZXlMVk5IZnIzcHg4eFVzdEo5NGhJcGZINEhLRS9lRGFBcks2bFN5VlZGYmR0MWd4VElWazNwcHBWbEZYaTRwRWhWQlRPYnF1b2hVODVNTFhuMWlhaHZVa0hKalNDTWMwMXRMRnZlVlZCeDBEb2RNNmpmdEN1N0RPdEl6WXhyYzBxcDFKR1AyYXlZRnoyR2I2SHZNck84Y25HdFY2R2ptM3VJbVNmRDJHcFdLNnVvd2JaR014RktRQ28xcE9NdGNNWEZwUnN0K2hYR29Bb21GM3NTVEJHZ1RnbGJCS1d3c1EzdFpxYVlTcDBaMUNpbVJEV0ZjQ0pVUFlKMDBCSTVGa0tZTm9pZnVReG1OODhTV1ZYV0xNYVVxcXFnQzBCbVFKUjZzazN1OU5DZjZqWUxYeEFmcXNZRWdWTEFoUlkyQXRndGZsWk5GbUZ5aHhkckxrQWRXbGs0RDg4TTJpeEh5ZXBJZGhNSHJHL2lSMVpHdHEwTUdwYkRiUlBZT1hlU1kxTTZOeTRac3R2R1NrdEsrWGJGUEFUajJEMzcxc2FQRXNBTVhoWHJzWjBrbS9YU3RraGhNeUJmc2E2dVhGWmUyVkNlK1lNcjErR0tnd3JReU5ZcTFWUnJCK0VpekFvdzZOc2ROS2N5VkVrWWVNNzN5czZxNGtBSHA2QmlGa2xUa0lyVkM1b1lWN3V6d09HQ3o0VUowU3RxMmxXTUp5NHd0YitSZXRMNnRaRmljbkptQnc1VWpDdlhYTVpWSlgyTVFrYmYrWE41RVdkNzhWejgvSkVzTVpUQmlLTnpzbTFpbkxSVVE3NEg0TmlkYXFJNjhqNXNBRmd4Y1J2ZUM3aWVMSlhmUVl4alpaMkNzaVdGZXdaWEptQklsWjF0ZHRyWDRoU3VhdGVLc28vUlpPdE9LVzJubXExb1R6ZUs2ZFJXQVd1Mk5SVmI0aHEwU1htMUd2dHVnSHJicjVJWHFtU2t0ZzVDdURFMk1TbFB3c1k1a05FMldwM0FxaVpiV1ZMQXhpQkYrMmlCWmJ1Tmo2TUI2cnNNTEM3Rnlhc2FZRHlvN0trb1B5RXR3M3BFTVhmUHZ4QUppMmpBUVFnanJ6MHJMSVpTV1psSW9OaHdkNXhLNEFSOW1ZTmpXQWFMcm51SW1KZUJWTjl6Qk9ST2JWdmJyK21UVGZGU0VKTFNSbkhvN2hFSm9JaThNRnFqeG12Z21GNVVSWno0ekxGZ1paOEN0dTJYN2dnVmNjS205Z1Z4SXNPSHF4WGdOTUtuRldaWW5mMWRCbk9oYXlYcTE3UXdGbFdXMDllTkt5VkpGbVhxYU9OR0E1YUNlZ01iSjNVVWtHWTFpYzNuS1dnanE4cWZWWUdRRzFnUnQ2cnM2MmE2SGlxcVVPcWRlc0s1Tm1YNG5Hb2ZKb2lFMWQwZEY5bFZWa3ZUMS9rRUVhYUNvWU93RnBjVmNvTE0rNzY2OVB4QzlyV3FrdEgwc1dVWWxkMFZDcHVCWi9zdFZSY0dneTlXWDIrVTFRdGhpOVN6QXFTeHpac3krT2lGekJZbnlTR1Y2R2t1NDRyRDhCQ09aQlYzQnZENStBS1JITndNRXNCNkV6SG5KcGtUQWVpVWxFR2tjRUNlQjZHRFpUcDVZRUpUbHZkcmtueFlqVGxsTWtmTnRYd0RqTTd1VmpLNUpYVVVuNDNycnFwSzJqeXRheEhXME01RzhEQzhydEhNWXM3S1NnZHVWUU1HVFlGcUZ2VlM2cmtEM3NESjQ2YWZkWUZ3b3ExMUFPS0NCTGh2d29VZ2M4SUdBTnljUjZrblpyZEpQZHN1eG55amZkM0ZvdlRsUk1kRWR0T2w1Q01WNUVIc1hRQmlzN1RPd3ZJRFphR2oyVm5wYmg3Y3BLNjNWd1lFTUx3cWJqenlsNjk5c2F3RkZrRjF5cWpVVTMxSGZDNnNXMVpGVkZ1WFZYVmd6OWtlRWF3MHlzMWxXZm0rYXpRQVFTV0EraEtZVmZzWmpQbmNBY1VCOW9JYXl5L1VaWFJOY2tER2ppNzdHc1didkJvNnRQcldQcU95VmtCVXErSU5lcXB6TmRZcy91MGlmaDVxbXBxSVcrMzNKVlNVY3dZNzBLTDRVOWxZZFU2bGp0U2xzN2xtZmk5ZzNZemVRZlZrYUdGYVYzT0RDbmFEMk44d3NFREZrbEUzUnpNM1pnaGRZa1dIc3N6cTcwRkllY25La1ZrdDhlek16UnE5YmtHdUtvalJMQlZTb2QzWTF5UHFLZ1lXN0pSUVRQVnl5NXhJWUxqT2d4Z1Q1MlJLSlVZMWRPcklpUmQ0ZnV0UXgvQTVBY1NtRWp6MHZGV3JrTHp2YldBdTlIT1diR2d4RmsxVk5UcG5CS2s2VGd3aXNJL0hjeFlYUDF1QVdPNzJVTEZsQlRxK2FTdTJWVFVzNmhyeE0yQ0YraEVvcjFWSUE5Wm1GVWFhYjFsU1NnWnNWczRzeHpIbFZMb0pIcjlINERoT05Ua0kxWEMwL3dpWTJOb1dBRzVSbG5IRm5xNm9MY2NwUWRkTXVKL08xN0pWQTVPSExpMEJxQ3p0cTdZMSsrdWNDZDk4cUxJOE1JSEJWL2NLanhRVG1lM2hGQlMzTXlDcW5Ec3V5bTJvODBIanZGRlR0clVSbU5hR0pzbVZhaEltalRzVVhLdFFaVEFWczdNdnY4LytmelVyWkFYY0xKNk00a29lNlhQMGI2U21XV05EenlVcFE4YmwrTHRXeDR0dXFaMzZjUllWM3l1VnhQTnd2SWlxaVFDU211N3NyZ1R6UjZua3locENhclh3RnkxdkdkNWlQMmNZMDZsRnI1TmpoaGcxWTYrTkIyOGZ0Yks4M3M4cmY3a0xKYkt3REZQYkxnMjVhMEFkWkpFaXFyNXBoaXhLTURsUlV0Y3NzcTFocmlMcUdvSCt6ZU5nVm05T2VtanNFVFY4SmRGME5IbmtJRnhXWTFPQjRZcnA3cnRXSjdOZ0FBQVBYa2xFUVZRM29OczVucGx5VmY4dTJGb0x1MUpySHZlYVpXUWpxQWtzaHRGYTJnenNTRzNacGtidmczSGFmRjlzbFBQbGxkakZsSzgwR3lzbThNcjRNUGhuZU5XRU5QR2pBSXBtaWxUUEFUZFRSVFhsQ0JZSFlBUXVQd0EzNnhJcFd0R040cTNZMk1oaUdzVXB1U1NubEVKUkQ4UG9yQzdDRllWdytGNTFxVGhnYWJ4c1R4V3pDR1kwWlNzYjNsZnFBeTBPUE5qTnk4eGlRUUtzSFlGUTJIQlpWdlZiQnVxM20xb1dLYWpxYW9uc002dVpVcjZDalhXTlowbDVFM2gzalVSbWE2a1AzTUpJaXkxTG0ra2FoUXE0MU4yaVpqYTVzanRsTFlOWkhackg2cVVHbTR2TWJEcDZSdzJDRm12dXlGa3JCY0N5TXRGcUJhRUNtc0hvSzlCWjJMQS9sSmNScVNhRHFuYVdiclpkR2F6M0RMZ0l2QmxuNHdvR3p0YnlKR3FzbHd4a2hoSHJUalRZRlhDdE9vS1M4dUxkb2ZWZEFiT3lsR1U2bmxZcFhXWnRzNG5YQnE2V3hKaXRNTm9rSFVKbmJuSnBsUW0rYUdwWTJhNUdNVjJRRDFoUnViQlBGS2R1bWY1T0hrTEh6MEY5bHVFNWtqQmpSYTBuRkU1Q1VHcUh3MzJNbWpaNnhrZ0lOVm5TbloxVlpTdEsycUtsUmFMbFFnSzd1VHE3SkZYSndNKzNTT0VLeWhaTkkrdEowSTVxTVl5OWsycUpEN2RWV2RxS1hhMENLTlIwQ2NqZytCMklZdTJmY0JaSlprTUZnTTExcjBYOTJ3aWxnaEZHZ3pWbmV4bHFCN3hMOW1TMjlTaVlVVlkyblhPWmpOQlJzeURzUVBSV1c1aHJaNFhjZEM0SFZXUmJqZ0pyNHNGb2ZLNVN6alE3cmhJMVVlYmRQZEViajZzcUl2VFpRWjV2YTA4ckFCc0FXMFV4ZVd5dEFrN0EyS0o5WnB4ekNpb0IyNFhGdFlBZVhZeHI2YW5TcWhMZ3BwRXFXYkd3THVuVGdyVitJaldsTDI5bGphQWw0RVFNR3NFcnA0YXBlWmlxdXdSWExYQXFPQ2VydTMybW15ZGM2b1dUU1dwRkFHZHplVEI4UlRIVk1FdGxNOTBDYmJRQ1loUGpxM2VnWXIxRkdkWUlRaml1REdaNXpaL0F6b2JLR095THh0aTZjNFJ3dHYyYW55V2xMSUNubExoeEpSWHQ2QTVlYkRCV0ZOT05ieFdaMmQwMm1udTRTOVlFQ3BlcHBWMXpTV1JCV3hIWXpWSXYxQ1hTb3V3cXFYM2pCQkJEWmRZUWJwVFFXNFpRbFM4cjVrSDRzdVNSbWcyKyszSk4xMHgxUGFBbUVrbXRZbEVkZUdwSkVNNmtPdUNxQ1IyMm9TdWpqNUlWMkhkVDB6ajVwckxLVGpYRkFQamRRbHlxN3hJQnhBUVA1eU1jekc0VnhBS3cwbjZpbFoyUUJjZTJwTHVsa3V4eHFub0l6RmZncXlxamlsOVMxVk53QnJGbWV5ZW9wczh5T2paVXliWmRmUzhDdWFUSUp1bXpzNXRPRGFOdExwRkRRL1BjSkd3ZUxobWVMMW5CMEtxaVVEU2NzaVVWRDg5RGkzSHRyS3RTVUx3M1JMaXlnWkQrN3NGOEpUT2JnWXNyR3ZETlVGUkdsMWl5MExsMVlrVWMyYUpZTW9nOTIwSThxVzZZRENnMU1xazBKSEpGS1hrYmdiUnJlSStxcFlOT1pIclZjRFViYTdwanNwaFNKTnRLNnVwZ1JOQVZvT1MwbXVnQmVONGJJWmdIaHVQWi9zMUVOYVg2S3NWcitZTnJoMU5iN2lwUjBQRTV6Yk5SZWdDYnJIUlV3NllmMDdkTEJKbDFmOEtCOWFzMlYxbk5xQXNsNjJMQkJoZWh3YWxlcmtIbUIxSkZJRVpLU0V1c2RsNUpRajFuSmxIWFNDRjM0MmdKOUNZR3JYZWxrbkpJWHFWUDhzRCtxdHBsQ1IzWEgycWZLcTB5Z01wK0tuVmtLeE5sWjhtMllrSWxWTWlDblhVd2w3cXpuQktTdlF6M20zUHQ2b1FiWE81YjVGaXhDaC9mSHhVUVcvQUVjSzZ6Q05xS1FuTDlzeXdxbUt1d3ZxU1l6VC9hUFZOTnBWeWh2UlcyMWFxY2lDc2pkV3ZCd0lMVXZoNVZ5Q3piV29DMXBKako2ODBDV3NsK3VkS0I2VDVSd0cxbWxvaG5scGJnNDdpejVVOWhhMEZHdG1STEZZQnRPOTl5OTdBcDB6K1pEVEFvZzZrU0xac01IZy9JRmtrZ3A2Q3B2VTJVMGNZVlNkbm1randCZE9tWGJ4VFdOV3p1SWJpcE1pb1Z4RWNrWkVvYWhTT2l5Mk0zSzBqY0MxTGhWRHdhcUcwWnZrY1dxQ25yRzRHSXh5a3JxbGJXZHc2TFF5QmFaUjhIbUxSSWhRV3NIc3dENDJaWFZMTmtmOWwrRmxXMEhWUTJsd0ZzQy9aMUZkemxRUjBLYVBmbytGZGZ1Ky9kd1ZSSUN1MUNHUjdBRUlpQWhjK0FaVUYwa09CYVB4bVVxZzRpNjR2UW5VNG5GRFlKOU56KzFmVlh2ZUg5cW1yK2tQSUx4OG9LY1JWL0JGYnhiRTBKTVQwa1NENHc2TC9sTlk4b2NzcWFnVmRVM0EzTWp4aHhjR3VxenNQSDRpcnBhb3cxcTZPeXJWanZwOU5wYzU5RTkxTGxkYm9ZVnpKV2RpbVdmQVcyU05FS2NEYVgyRm1CTExBL3VLeGxtaGg2MTNJczFVUlFBcGJLZnR0d3hMMDJxNk9ueDVwUXhTYlBvakFnK3Y1aEFuTjZMSFZSRFhJc3ZLdFJqaVMwcUpVeVpUQVhWYkFLODJFbEZKV2FRZFZvcVVDMVVudDdCVmFUUXVkTTZTdXFleGpRSk40KzBpY2F4di91dGJLdjgzRVRiVDhIOGdqY09LeE9KbWJVYTZPT1ZYaHQzZEZZNnJIdjlYb056RkxjZUVBMW84K3BLbTBMQUhQSFoycllLakZxMGhmWkZpeHNxSEpnRDNlRDVuK1Uwa2IxbUZqWGtuMmx2TVNTT3NORS9DZElBS0YwU3l0cTZ1ck9IVU41Z3dnNEdab3NnYm1nZ001dWNyYTJxclMySWcxY2JpQkJjeFl6Z3pVRE5MQ3ZMOEdiWlhOcDZPUnkzTG1TK0trODN6UklBSzZBMWlvS2EySTlOYXBJdWlVRmRmQzk3NjZQRlpVdHFVcjZLYldrK3paVTFhL1pySVhFenRyalRPZno3aHdLemlDZVhJYXJhSHRiWklNeisycEdnYXpDbXc0cVdBRnZFZGhvZFlwMFhxMHBWN0cxWVdZV2JPNHFoR3E0MitaOEJZdHJMV3ZsdU5QcFpBZWFGRlMxdnViUGdiZ3hzcWNwbkFhc3pCb3ZLYUZvRFE4Qkd0amZVT2w0TkFHMm5tUVYwNGZlSmd1bXZYMmZzclFFV1pnaEwwSm5WZFlrbjNET1pJZVJOODZScVBXQ21zdkdWcUVNUm53eFFBeHdTOEVNWW8zSXptWTIrQkNjTHA0TUtpdXl1aEltYW1sYlpGY05vTmw3dHArUkhkMThaalFJUkt5WGRGUmhOOTgvaHlLcXdYV05vN08xd2lhWG9ITjEwOFJFWlpXRXE2Z3JuSWZqemVnOGpkUmYxWEVMNGtrWGE1YkJqS3hvS2FsakJqZUhsVnhRNEdheWNwVzRsRE9BS3RuVHhIQXRPZnpPdFp3SEFNN3NxVlhrVjZ5dTZrYXAxbkhrWEtxV0YvNFhIcWplbk5LcUJqcFIzbDFjaDNFamcxK0VzZ2RRaHNkRzBCNEZNOXNXQVZXcHVBeWl3VFBsZVp4dDlWeVpWUzJxWGZSZVdxVEFpbHByOUFwb1dUanh5bWl0N053VjRKVHJpWnlPQTlCMGs3SEZmVUxvdXJtS1lIVm5SUXZxR0w1SE1IZHFGY1IycVdwbWNLNmVUd3gyZGlwV3J2aURpbHIrZktXcTNPV1JXZEhLd0E0ZXU4d2pjaGJlUnpGaWxxampaTjN1ZkNwZmtKMC9zY1ZwbllrNkwwUEk3N2x4ZFdDWjg3V2lXbTdCL0FHcXVRU251akdLc0I4Q0ptaUpxOHExcEtJVld5cU9pVEs2NnIxOEJOOHI3NC9BRTcxZmRDM3lQUzJNeGRPcG5FMXRsVnhEOUptVk9vZ2dOK3I0UGpBWFZGUGEzRWc1alZKR0ZWVUdOb2xIMjBHVnJVQjdCT3lTV3E2V3FZUWRXUjkycGNGTVlNd2NrYlNnQ0tDcUQ2N0RpaVd1MWc4TVFDOUJ5ZmNGcVcxTCtqTDcxNHFOQ3V6bm9TeHQwZGEyZ3RXTjFHOEYwQkswTk4wbnVpbWVsVUY5ZElkQWZqTzQ0VVQzQ2pRTG9VZUxISkZUTzNnbXBSdUlJT3Z3QlFDYnFOZW8zcXRaOWlGNnhWSzEzR1JsbzR6cWltcStDR2RUaVIxdVJZOG9xZ0UwMmhaQmE3OWtaWFBNcXV4UkhLbGEyc2FaV040bVJxWlVqMHZMQ0toa2pLbnFPUUhOdVNaVkpvS3ZBcVMxd3BFcXV2V0RDMUIyeXB3ckNQc1JNRVBWVE9ETUxKTUR2NnFlS1h3aTJKWVY1U3E0cUt5dmdHc0hDTGl1ajJqUjU5VjhnTXFTSjJGSlpSWEVIVlJIajNzRlByY3Q2T3BxbFcxR3BhdFFkdDBHdndmTTZuNjNJbnNHVkZoSkdhQnFncXFJVjZJc1hsbFpneVNQcTRSM2JudDN3aTVjditjTjJ5cVFMVzFUOTVLWVZzV1d0S2s0Y0I5VzUzV1FRZmxRWVI2V2w0SGFKWmp2VkUwRDV5dnErUktnWkNzNXFkQkVQNXNEOTRjQXZRTGxTZ05hU01BdEh4ODhCdU5RNDF6ZEZzWDMwektiY3MwTUxEL2loa3BRemwwd2lUcUtMVGZiS21DbXlZSUNuSzBJYmFpZUM0Q0c5aVN5TFE3Y0lNR1F3YXU2VEtvcTYwQXBsM1dONDBMWnBjYTFDS0tLOVZReXlJRW44dzBGOEY2Q0wyaDhvM2l4R3dDN3M3RVd6Q09xbWNBcFl4WUQ0anNBelZTMHNsMnQ5OHBBN3ZyS29waENWU29uYllwZ0g2bXZTbjI0cFRCVjRzZHRWM0J0TXE1azgyeStJQUR2VUowdUFsa0NWVHhJYVBtK1VOdS9xa1Y0RjFUekhYQ0dyWElBcUl0Qkt5cHFLOTlWdEFPVnM2NE80T2JYN3BITFZDcFlIY1Jtd3ZMUjdUdllBS0JCTjU4TEdWekR1RnoraFFiV2duY1F5Q1pBaytWYnNQU291ZjkzMjYxaVpnbWZDcHdSYkF2cW1TcXJpVTJQd2hqYW9PeVlxdEllZ1ZYVmlUc215dGE2Ykd5U3BZM2d5UnJwSXlBZWFXRER4dHBzWHdLeWFsTURLTlA3WUJYTXFFc2tVc2kydUM4Rk5BUHhBS1RWZlQxbzZWek0wRTBqRisxcldjVXVIdmR5Zzd2Z29GcGxYOEhwdkhwTUNPTVJVUEh6WmtJbnNxbEZLTlgvRUlPNTJFMFN4U3pPd29iMlZtUkxXNUQxWElVMHJiZ00xQXpXZ3lDN2ZlOEc3eFVBSy90YUVCYXQ3bHVxdHlQN0Vtc2FKUU9qNUYrbXJuWmZDdVlDZkJVQVd3U2h5ZDZwTVkvdkFIRzFVcU9ZcGJJL2d5NVQwQ01LbStVTzNnRnVDODVkZ2ZEVmVndVBEZklUcklCTHNMcmNnZGgzQ0ZnRlpqYUtKNEl2M0Y4QU5FcXZ1eFIxdFZLT2dMb0NhMWp4Ym9CQWtqNnY3ai9pY0ZiQTdmNHJmUm5RRExSVmlHMTNpMHZxQlFyWVZxQmJBRFpUMFpwaUhvU3p2UXBvcEtJRlMzc0UxSGZCV2xIWGQwSDdMbkFycXZvdWdNdGxqSEJnWm5oM0Vvei9CS2pMTUw0WjJBcTAraEVKcjlqYVZVQmJ2TnpDSVVpcm9DN0FXbW1GdzRvNUFLM010QjVWeXBaTVNGZ3MwNUp5R1Z3bHdCcXNFR0FBYTJaVTFDalVleFhHc0U0cktyaWlsQnZGek9LS28zQXVBcm9FNlFGUVUzdThZcE5Yd1M1aysxVFp0NVVyd291TjRLaVVFdytrM1pXRHAxUlhITlJxWGIyMVRzMzk5NDV5WlNnM1ZuWkZOUTlDRjNYZVp5cjVEZ0JYS2l3Q01hMk14ZVREWVhnUDFGc2Y5UU5LWmMwazgxUkprM3I2RVEzckNtQlZ5TEw3NUVqWjFwSVZESG9GdGlPQUhvQjBCZFRWeWxxQnNLS0tTK0FlQlhKVkxZK0NYQVN1R3ZPL0F1cTdHdUVqRGZHS2cxb0thMXovZG1taTlJOVNVR05obDBBdGZ1bEhBYXdvWXJuU2ttTlhBVnVHRWhyRVZYdlVGK0E1Q3QyUHFOT2pEZXR5bmE0Q21lVW9sbWVYTE40QXE3QzVTajEwUTd5amdsK3Q2Q054U1JIbUk1WCtDcHdyZVlCM1FmZHFuYTRxMjFLZEJ1YzRHb1pzbjQ5Wk9PaVZpbndIcUs5V3pqdmdld2VFaDJBVTUrdnR4WjlDZDlXcWtoNDlWMThFNW9qNnZWeW4wUlN0QXlHSU81ZWRYUktkNUIwVkdWWHEyeXIzeFlwKzVVdCtDNFFKNFAxTjMzOXBRTWpSZWpqNHZiL0RjcjZyUWMzTy8wcmptdFpwZVlDQmlDSGZDZW1SYk5oYksvcE5VUGMzd2ZLeTVmMkQ3T2xMMy91UGh2ZS9vVTRUMEY4ZitWTk0ydnlvaXYwaksrS0hRZmRIcSswYm5jejRvejczLytZNkxiS3cxby81QjdlT2YxUmwvMGR1OUI5dG4vOWJ2cmYvait2MGg2dHRuMnRwL3IvNDgxOXk0L3p2NTM5MXV2enpmd0RpZno2cGhUMU1QZ0FBQUFCSlJVNUVya0pnZ2c9PSl9LmNvbG9yLXBpY2tlciAuY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzc3twb3NpdGlvbjphYnNvbHV0ZTtkaXNwbGF5OmlubGluZTtwYWRkaW5nOjA7bWFyZ2luOjNweCAtM3B4O2JvcmRlcjowO2N1cnNvcjpwb2ludGVyO2JhY2tncm91bmQ6MCAwfS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0uY29sb3ItcGlja2VyIC5jcC1hZGQtY29sb3ItYnV0dG9uLWNsYXNzOmRpc2FibGVke2N1cnNvcjpub3QtYWxsb3dlZDtjb2xvcjojOTk5fS5jb2xvci1waWNrZXIgLmNwLWFkZC1jb2xvci1idXR0b24tY2xhc3M6ZGlzYWJsZWQ6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOm5vbmV9LmNvbG9yLXBpY2tlciAuY3AtcmVtb3ZlLWNvbG9yLWJ1dHRvbi1jbGFzc3twb3NpdGlvbjphYnNvbHV0ZTt0b3A6LTVweDtyaWdodDotNXB4O2Rpc3BsYXk6YmxvY2s7d2lkdGg6MTBweDtoZWlnaHQ6MTBweDtib3JkZXItcmFkaXVzOjUwJTtjdXJzb3I6cG9pbnRlcjt0ZXh0LWFsaWduOmNlbnRlcjtiYWNrZ3JvdW5kOiNmZmY7Ym94LXNoYWRvdzoxcHggMXB4IDVweCAjMzMzfS5jb2xvci1waWNrZXIgLmNwLXJlbW92ZS1jb2xvci1idXR0b24tY2xhc3M6OmJlZm9yZXtjb250ZW50Oid4Jztwb3NpdGlvbjpyZWxhdGl2ZTtib3R0b206My41cHg7ZGlzcGxheTppbmxpbmUtYmxvY2s7Zm9udC1zaXplOjEwcHh9Il0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CiAgICBDb2xvclBpY2tlckNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiBDb2xvclBpY2tlclNlcnZpY2UgfQogICAgXTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIFZpZXdDaGlsZCgnZGlhbG9nUG9wdXAnLCB7IHN0YXRpYzogdHJ1ZSB9KQogICAgXSwgQ29sb3JQaWNrZXJDb21wb25lbnQucHJvdG90eXBlLCAiZGlhbG9nRWxlbWVudCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBWaWV3Q2hpbGQoJ2h1ZVNsaWRlcicsIHsgc3RhdGljOiB0cnVlIH0pCiAgICBdLCBDb2xvclBpY2tlckNvbXBvbmVudC5wcm90b3R5cGUsICJodWVTbGlkZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgVmlld0NoaWxkKCdhbHBoYVNsaWRlcicsIHsgc3RhdGljOiB0cnVlIH0pCiAgICBdLCBDb2xvclBpY2tlckNvbXBvbmVudC5wcm90b3R5cGUsICJhbHBoYVNsaWRlciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmtleXVwLmVzYycsIFsnJGV2ZW50J10pCiAgICBdLCBDb2xvclBpY2tlckNvbXBvbmVudC5wcm90b3R5cGUsICJoYW5kbGVFc2MiLCBudWxsKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6a2V5dXAuZW50ZXInLCBbJyRldmVudCddKQogICAgXSwgQ29sb3JQaWNrZXJDb21wb25lbnQucHJvdG90eXBlLCAiaGFuZGxlRW50ZXIiLCBudWxsKTsKCiAgICBsZXQgQ29sb3JQaWNrZXJEaXJlY3RpdmUgPSBjbGFzcyBDb2xvclBpY2tlckRpcmVjdGl2ZSB7CiAgICAgICAgY29uc3RydWN0b3IoaW5qZWN0b3IsIGNmciwgYXBwUmVmLCB2Y1JlZiwgZWxSZWYsIF9zZXJ2aWNlKSB7CiAgICAgICAgICAgIHRoaXMuaW5qZWN0b3IgPSBpbmplY3RvcjsKICAgICAgICAgICAgdGhpcy5jZnIgPSBjZnI7CiAgICAgICAgICAgIHRoaXMuYXBwUmVmID0gYXBwUmVmOwogICAgICAgICAgICB0aGlzLnZjUmVmID0gdmNSZWY7CiAgICAgICAgICAgIHRoaXMuZWxSZWYgPSBlbFJlZjsKICAgICAgICAgICAgdGhpcy5fc2VydmljZSA9IF9zZXJ2aWNlOwogICAgICAgICAgICB0aGlzLmRpYWxvZ0NyZWF0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5pZ25vcmVDaGFuZ2VzID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMudmlld0F0dGFjaGVkVG9BcHBSZWYgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jcFdpZHRoID0gJzIzMHB4JzsKICAgICAgICAgICAgdGhpcy5jcEhlaWdodCA9ICdhdXRvJzsKICAgICAgICAgICAgdGhpcy5jcFRvZ2dsZSA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmNwRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jcElnbm9yZWRFbGVtZW50cyA9IFtdOwogICAgICAgICAgICB0aGlzLmNwRmFsbGJhY2tDb2xvciA9ICcnOwogICAgICAgICAgICB0aGlzLmNwQ29sb3JNb2RlID0gJ2NvbG9yJzsKICAgICAgICAgICAgdGhpcy5jcENteWtFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuY3BPdXRwdXRGb3JtYXQgPSAnYXV0byc7CiAgICAgICAgICAgIHRoaXMuY3BBbHBoYUNoYW5uZWwgPSAnZW5hYmxlZCc7CiAgICAgICAgICAgIHRoaXMuY3BEaXNhYmxlSW5wdXQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jcERpYWxvZ0Rpc3BsYXkgPSAncG9wdXAnOwogICAgICAgICAgICB0aGlzLmNwU2F2ZUNsaWNrT3V0c2lkZSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZSA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuY3BVc2VSb290Vmlld0NvbnRhaW5lciA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmNwUG9zaXRpb24gPSAnYXV0byc7CiAgICAgICAgICAgIHRoaXMuY3BQb3NpdGlvbk9mZnNldCA9ICcwJSc7CiAgICAgICAgICAgIHRoaXMuY3BQb3NpdGlvblJlbGF0aXZlVG9BcnJvdyA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLmNwT0tCdXR0b24gPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jcE9LQnV0dG9uVGV4dCA9ICdPSyc7CiAgICAgICAgICAgIHRoaXMuY3BPS0J1dHRvbkNsYXNzID0gJ2NwLW9rLWJ1dHRvbi1jbGFzcyc7CiAgICAgICAgICAgIHRoaXMuY3BDYW5jZWxCdXR0b24gPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5jcENhbmNlbEJ1dHRvblRleHQgPSAnQ2FuY2VsJzsKICAgICAgICAgICAgdGhpcy5jcENhbmNlbEJ1dHRvbkNsYXNzID0gJ2NwLWNhbmNlbC1idXR0b24tY2xhc3MnOwogICAgICAgICAgICB0aGlzLmNwUHJlc2V0TGFiZWwgPSAnUHJlc2V0IGNvbG9ycyc7CiAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRDb2xvcnNDbGFzcyA9ICdjcC1wcmVzZXQtY29sb3JzLWNsYXNzJzsKICAgICAgICAgICAgdGhpcy5jcE1heFByZXNldENvbG9yc0xlbmd0aCA9IDY7CiAgICAgICAgICAgIHRoaXMuY3BQcmVzZXRFbXB0eU1lc3NhZ2UgPSAnTm8gY29sb3JzIGFkZGVkJzsKICAgICAgICAgICAgdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzID0gJ3ByZXNldC1lbXB0eS1tZXNzYWdlJzsKICAgICAgICAgICAgdGhpcy5jcEFkZENvbG9yQnV0dG9uID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuY3BBZGRDb2xvckJ1dHRvblRleHQgPSAnQWRkIGNvbG9yJzsKICAgICAgICAgICAgdGhpcy5jcEFkZENvbG9yQnV0dG9uQ2xhc3MgPSAnY3AtYWRkLWNvbG9yLWJ1dHRvbi1jbGFzcyc7CiAgICAgICAgICAgIHRoaXMuY3BSZW1vdmVDb2xvckJ1dHRvbkNsYXNzID0gJ2NwLXJlbW92ZS1jb2xvci1idXR0b24tY2xhc3MnOwogICAgICAgICAgICB0aGlzLmNwSW5wdXRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpOwogICAgICAgICAgICB0aGlzLmNwVG9nZ2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTsKICAgICAgICAgICAgdGhpcy5jcFNsaWRlckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuY3BTbGlkZXJEcmFnRW5kID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTsKICAgICAgICAgICAgdGhpcy5jcFNsaWRlckRyYWdTdGFydCA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuY29sb3JQaWNrZXJPcGVuID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTsKICAgICAgICAgICAgdGhpcy5jb2xvclBpY2tlckNsb3NlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTsKICAgICAgICAgICAgdGhpcy5jb2xvclBpY2tlckNhbmNlbCA9IG5ldyBFdmVudEVtaXR0ZXIodHJ1ZSk7CiAgICAgICAgICAgIHRoaXMuY29sb3JQaWNrZXJTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpOwogICAgICAgICAgICB0aGlzLmNvbG9yUGlja2VyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcihmYWxzZSk7CiAgICAgICAgICAgIHRoaXMuY3BDbXlrQ29sb3JDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKHRydWUpOwogICAgICAgICAgICB0aGlzLmNwUHJlc2V0Q29sb3JzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcih0cnVlKTsKICAgICAgICB9CiAgICAgICAgaGFuZGxlQ2xpY2soKSB7CiAgICAgICAgICAgIHRoaXMuaW5wdXRGb2N1cygpOwogICAgICAgIH0KICAgICAgICBoYW5kbGVGb2N1cygpIHsKICAgICAgICAgICAgdGhpcy5pbnB1dEZvY3VzKCk7CiAgICAgICAgfQogICAgICAgIGhhbmRsZUlucHV0KGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuaW5wdXRDaGFuZ2UoZXZlbnQpOwogICAgICAgIH0KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY21wUmVmICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnZpZXdBdHRhY2hlZFRvQXBwUmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5hcHBSZWYuZGV0YWNoVmlldyh0aGlzLmNtcFJlZi5ob3N0Vmlldyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmNtcFJlZi5kZXN0cm95KCk7CiAgICAgICAgICAgICAgICB0aGlzLmNtcFJlZiA9IG51bGw7CiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZyA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICBpZiAoY2hhbmdlcy5jcFRvZ2dsZSAmJiAhdGhpcy5jcERpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBpZiAoY2hhbmdlcy5jcFRvZ2dsZS5jdXJyZW50VmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5EaWFsb2coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFjaGFuZ2VzLmNwVG9nZ2xlLmN1cnJlbnRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY2xvc2VEaWFsb2coKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlcy5jb2xvclBpY2tlcikgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuZGlhbG9nICYmICF0aGlzLmlnbm9yZUNoYW5nZXMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5jcERpYWxvZ0Rpc3BsYXkgPT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLnNldEluaXRpYWxDb2xvcihjaGFuZ2VzLmNvbG9yUGlja2VyLmN1cnJlbnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLnNldENvbG9yRnJvbVN0cmluZyhjaGFuZ2VzLmNvbG9yUGlja2VyLmN1cnJlbnRWYWx1ZSwgZmFsc2UpOwogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNwVXNlUm9vdFZpZXdDb250YWluZXIgJiYgdGhpcy5jcERpYWxvZ0Rpc3BsYXkgIT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuY21wUmVmLmNoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLmlnbm9yZUNoYW5nZXMgPSBmYWxzZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlcy5jcFByZXNldExhYmVsIHx8IGNoYW5nZXMuY3BQcmVzZXRDb2xvcnMpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpYWxvZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLnNldFByZXNldENvbmZpZyh0aGlzLmNwUHJlc2V0TGFiZWwsIHRoaXMuY3BQcmVzZXRDb2xvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIG9wZW5EaWFsb2coKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5kaWFsb2dDcmVhdGVkKSB7CiAgICAgICAgICAgICAgICBsZXQgdmNSZWYgPSB0aGlzLnZjUmVmOwogICAgICAgICAgICAgICAgdGhpcy5kaWFsb2dDcmVhdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMudmlld0F0dGFjaGVkVG9BcHBSZWYgPSBmYWxzZTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNwVXNlUm9vdFZpZXdDb250YWluZXIgJiYgdGhpcy5jcERpYWxvZ0Rpc3BsYXkgIT09ICdpbmxpbmUnKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgY2xhc3NPZlJvb3RDb21wb25lbnQgPSB0aGlzLmFwcFJlZi5jb21wb25lbnRUeXBlc1swXTsKICAgICAgICAgICAgICAgICAgICBjb25zdCBhcHBJbnN0YW5jZSA9IHRoaXMuaW5qZWN0b3IuZ2V0KGNsYXNzT2ZSb290Q29tcG9uZW50LCBJbmplY3Rvci5OVUxMKTsKICAgICAgICAgICAgICAgICAgICBpZiAoYXBwSW5zdGFuY2UgIT09IEluamVjdG9yLk5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdmNSZWYgPSBhcHBJbnN0YW5jZS52Y1JlZiB8fCBhcHBJbnN0YW5jZS52aWV3Q29udGFpbmVyUmVmIHx8IHRoaXMudmNSZWY7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2Y1JlZiA9PT0gdGhpcy52Y1JlZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc29sZS53YXJuKCdZb3UgYXJlIHVzaW5nIGNwVXNlUm9vdFZpZXdDb250YWluZXIsICcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdidXQgdGhlIHJvb3QgY29tcG9uZW50IGlzIG5vdCBleHBvc2luZyB2aWV3Q29udGFpbmVyUmVmIScgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQbGVhc2UgZXhwb3NlIGl0IGJ5IGFkZGluZyBcJ3B1YmxpYyB2Y1JlZjogVmlld0NvbnRhaW5lclJlZlwnIHRvIHRoZSBjb25zdHJ1Y3Rvci4nKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy52aWV3QXR0YWNoZWRUb0FwcFJlZiA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY29uc3QgY29tcEZhY3RvcnkgPSB0aGlzLmNmci5yZXNvbHZlQ29tcG9uZW50RmFjdG9yeShDb2xvclBpY2tlckNvbXBvbmVudCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy52aWV3QXR0YWNoZWRUb0FwcFJlZikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuY21wUmVmID0gY29tcEZhY3RvcnkuY3JlYXRlKHRoaXMuaW5qZWN0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuYXBwUmVmLmF0dGFjaFZpZXcodGhpcy5jbXBSZWYuaG9zdFZpZXcpOwogICAgICAgICAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQodGhpcy5jbXBSZWYuaG9zdFZpZXcucm9vdE5vZGVzWzBdKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGluamVjdG9yID0gUmVmbGVjdGl2ZUluamVjdG9yLmZyb21SZXNvbHZlZFByb3ZpZGVycyhbXSwgdmNSZWYucGFyZW50SW5qZWN0b3IpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuY21wUmVmID0gdmNSZWYuY3JlYXRlQ29tcG9uZW50KGNvbXBGYWN0b3J5LCAwLCBpbmplY3RvciwgW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5jbXBSZWYuaW5zdGFuY2Uuc2V0dXBEaWFsb2codGhpcywgdGhpcy5lbFJlZiwgdGhpcy5jb2xvclBpY2tlciwgdGhpcy5jcFdpZHRoLCB0aGlzLmNwSGVpZ2h0LCB0aGlzLmNwRGlhbG9nRGlzcGxheSwgdGhpcy5jcEZhbGxiYWNrQ29sb3IsIHRoaXMuY3BDb2xvck1vZGUsIHRoaXMuY3BDbXlrRW5hYmxlZCwgdGhpcy5jcEFscGhhQ2hhbm5lbCwgdGhpcy5jcE91dHB1dEZvcm1hdCwgdGhpcy5jcERpc2FibGVJbnB1dCwgdGhpcy5jcElnbm9yZWRFbGVtZW50cywgdGhpcy5jcFNhdmVDbGlja091dHNpZGUsIHRoaXMuY3BDbG9zZUNsaWNrT3V0c2lkZSwgdGhpcy5jcFVzZVJvb3RWaWV3Q29udGFpbmVyLCB0aGlzLmNwUG9zaXRpb24sIHRoaXMuY3BQb3NpdGlvbk9mZnNldCwgdGhpcy5jcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93LCB0aGlzLmNwUHJlc2V0TGFiZWwsIHRoaXMuY3BQcmVzZXRDb2xvcnMsIHRoaXMuY3BQcmVzZXRDb2xvcnNDbGFzcywgdGhpcy5jcE1heFByZXNldENvbG9yc0xlbmd0aCwgdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZSwgdGhpcy5jcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzLCB0aGlzLmNwT0tCdXR0b24sIHRoaXMuY3BPS0J1dHRvbkNsYXNzLCB0aGlzLmNwT0tCdXR0b25UZXh0LCB0aGlzLmNwQ2FuY2VsQnV0dG9uLCB0aGlzLmNwQ2FuY2VsQnV0dG9uQ2xhc3MsIHRoaXMuY3BDYW5jZWxCdXR0b25UZXh0LCB0aGlzLmNwQWRkQ29sb3JCdXR0b24sIHRoaXMuY3BBZGRDb2xvckJ1dHRvbkNsYXNzLCB0aGlzLmNwQWRkQ29sb3JCdXR0b25UZXh0LCB0aGlzLmNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyk7CiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZyA9IHRoaXMuY21wUmVmLmluc3RhbmNlOwogICAgICAgICAgICAgICAgaWYgKHRoaXMudmNSZWYgIT09IHZjUmVmKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jbXBSZWYuY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuZGlhbG9nKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5vcGVuRGlhbG9nKHRoaXMuY29sb3JQaWNrZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNsb3NlRGlhbG9nKCkgewogICAgICAgICAgICBpZiAodGhpcy5kaWFsb2cgJiYgdGhpcy5jcERpYWxvZ0Rpc3BsYXkgPT09ICdwb3B1cCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLmNsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY215a0NoYW5nZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5jcENteWtDb2xvckNoYW5nZS5lbWl0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgc3RhdGVDaGFuZ2VkKHN0YXRlKSB7CiAgICAgICAgICAgIHRoaXMuY3BUb2dnbGVDaGFuZ2UuZW1pdChzdGF0ZSk7CiAgICAgICAgICAgIGlmIChzdGF0ZSkgewogICAgICAgICAgICAgICAgdGhpcy5jb2xvclBpY2tlck9wZW4uZW1pdCh0aGlzLmNvbG9yUGlja2VyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuY29sb3JQaWNrZXJDbG9zZS5lbWl0KHRoaXMuY29sb3JQaWNrZXIpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIGNvbG9yQ2hhbmdlZCh2YWx1ZSwgaWdub3JlID0gdHJ1ZSkgewogICAgICAgICAgICB0aGlzLmlnbm9yZUNoYW5nZXMgPSBpZ25vcmU7CiAgICAgICAgICAgIHRoaXMuY29sb3JQaWNrZXJDaGFuZ2UuZW1pdCh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGNvbG9yU2VsZWN0ZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5jb2xvclBpY2tlclNlbGVjdC5lbWl0KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgY29sb3JDYW5jZWxlZCgpIHsKICAgICAgICAgICAgdGhpcy5jb2xvclBpY2tlckNhbmNlbC5lbWl0KCk7CiAgICAgICAgfQogICAgICAgIGlucHV0Rm9jdXMoKSB7CiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsUmVmLm5hdGl2ZUVsZW1lbnQ7CiAgICAgICAgICAgIGNvbnN0IGlnbm9yZWQgPSB0aGlzLmNwSWdub3JlZEVsZW1lbnRzLmZpbHRlcigoaXRlbSkgPT4gaXRlbSA9PT0gZWxlbWVudCk7CiAgICAgICAgICAgIGlmICghdGhpcy5jcERpc2FibGVkICYmICFpZ25vcmVkLmxlbmd0aCkgewogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gJ3VuZGVmaW5lZCcgJiYgZWxlbWVudCA9PT0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3BlbkRpYWxvZygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIXRoaXMuZGlhbG9nIHx8ICF0aGlzLmRpYWxvZy5zaG93KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcGVuRGlhbG9nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNsb3NlRGlhbG9nKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5wdXRDaGFuZ2UoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlhbG9nKSB7CiAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5zZXRDb2xvckZyb21TdHJpbmcoZXZlbnQudGFyZ2V0LnZhbHVlLCB0cnVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuY29sb3JQaWNrZXIgPSBldmVudC50YXJnZXQudmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLmNvbG9yUGlja2VyQ2hhbmdlLmVtaXQodGhpcy5jb2xvclBpY2tlcik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaW5wdXRDaGFuZ2VkKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuY3BJbnB1dENoYW5nZS5lbWl0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgc2xpZGVyQ2hhbmdlZChldmVudCkgewogICAgICAgICAgICB0aGlzLmNwU2xpZGVyQ2hhbmdlLmVtaXQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICBzbGlkZXJEcmFnRW5kKGV2ZW50KSB7CiAgICAgICAgICAgIHRoaXMuY3BTbGlkZXJEcmFnRW5kLmVtaXQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICBzbGlkZXJEcmFnU3RhcnQoZXZlbnQpIHsKICAgICAgICAgICAgdGhpcy5jcFNsaWRlckRyYWdTdGFydC5lbWl0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgcHJlc2V0Q29sb3JzQ2hhbmdlZCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLmNwUHJlc2V0Q29sb3JzQ2hhbmdlLmVtaXQodmFsdWUpOwogICAgICAgIH0KICAgIH07CiAgICBDb2xvclBpY2tlckRpcmVjdGl2ZS7JtWZhYyA9IGZ1bmN0aW9uIENvbG9yUGlja2VyRGlyZWN0aXZlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENvbG9yUGlja2VyRGlyZWN0aXZlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEluamVjdG9yKSwgybXJtWRpcmVjdGl2ZUluamVjdChDb21wb25lbnRGYWN0b3J5UmVzb2x2ZXIpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFwcGxpY2F0aW9uUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChWaWV3Q29udGFpbmVyUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDb2xvclBpY2tlclNlcnZpY2UpKTsgfTsKICAgIENvbG9yUGlja2VyRGlyZWN0aXZlLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IENvbG9yUGlja2VyRGlyZWN0aXZlLCBzZWxlY3RvcnM6IFtbIiIsICJjb2xvclBpY2tlciIsICIiXV0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gQ29sb3JQaWNrZXJEaXJlY3RpdmVfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQ29sb3JQaWNrZXJEaXJlY3RpdmVfY2xpY2tfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4LmhhbmRsZUNsaWNrKCk7IH0pKCJmb2N1cyIsIGZ1bmN0aW9uIENvbG9yUGlja2VyRGlyZWN0aXZlX2ZvY3VzX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5oYW5kbGVGb2N1cygpOyB9KSgiaW5wdXQiLCBmdW5jdGlvbiBDb2xvclBpY2tlckRpcmVjdGl2ZV9pbnB1dF9Ib3N0QmluZGluZ0hhbmRsZXIoJGV2ZW50KSB7IHJldHVybiBjdHguaGFuZGxlSW5wdXQoJGV2ZW50KTsgfSk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgY3BXaWR0aDogImNwV2lkdGgiLCBjcEhlaWdodDogImNwSGVpZ2h0IiwgY3BUb2dnbGU6ICJjcFRvZ2dsZSIsIGNwRGlzYWJsZWQ6ICJjcERpc2FibGVkIiwgY3BJZ25vcmVkRWxlbWVudHM6ICJjcElnbm9yZWRFbGVtZW50cyIsIGNwRmFsbGJhY2tDb2xvcjogImNwRmFsbGJhY2tDb2xvciIsIGNwQ29sb3JNb2RlOiAiY3BDb2xvck1vZGUiLCBjcENteWtFbmFibGVkOiAiY3BDbXlrRW5hYmxlZCIsIGNwT3V0cHV0Rm9ybWF0OiAiY3BPdXRwdXRGb3JtYXQiLCBjcEFscGhhQ2hhbm5lbDogImNwQWxwaGFDaGFubmVsIiwgY3BEaXNhYmxlSW5wdXQ6ICJjcERpc2FibGVJbnB1dCIsIGNwRGlhbG9nRGlzcGxheTogImNwRGlhbG9nRGlzcGxheSIsIGNwU2F2ZUNsaWNrT3V0c2lkZTogImNwU2F2ZUNsaWNrT3V0c2lkZSIsIGNwQ2xvc2VDbGlja091dHNpZGU6ICJjcENsb3NlQ2xpY2tPdXRzaWRlIiwgY3BVc2VSb290Vmlld0NvbnRhaW5lcjogImNwVXNlUm9vdFZpZXdDb250YWluZXIiLCBjcFBvc2l0aW9uOiAiY3BQb3NpdGlvbiIsIGNwUG9zaXRpb25PZmZzZXQ6ICJjcFBvc2l0aW9uT2Zmc2V0IiwgY3BQb3NpdGlvblJlbGF0aXZlVG9BcnJvdzogImNwUG9zaXRpb25SZWxhdGl2ZVRvQXJyb3ciLCBjcE9LQnV0dG9uOiAiY3BPS0J1dHRvbiIsIGNwT0tCdXR0b25UZXh0OiAiY3BPS0J1dHRvblRleHQiLCBjcE9LQnV0dG9uQ2xhc3M6ICJjcE9LQnV0dG9uQ2xhc3MiLCBjcENhbmNlbEJ1dHRvbjogImNwQ2FuY2VsQnV0dG9uIiwgY3BDYW5jZWxCdXR0b25UZXh0OiAiY3BDYW5jZWxCdXR0b25UZXh0IiwgY3BDYW5jZWxCdXR0b25DbGFzczogImNwQ2FuY2VsQnV0dG9uQ2xhc3MiLCBjcFByZXNldExhYmVsOiAiY3BQcmVzZXRMYWJlbCIsIGNwUHJlc2V0Q29sb3JzQ2xhc3M6ICJjcFByZXNldENvbG9yc0NsYXNzIiwgY3BNYXhQcmVzZXRDb2xvcnNMZW5ndGg6ICJjcE1heFByZXNldENvbG9yc0xlbmd0aCIsIGNwUHJlc2V0RW1wdHlNZXNzYWdlOiAiY3BQcmVzZXRFbXB0eU1lc3NhZ2UiLCBjcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzOiAiY3BQcmVzZXRFbXB0eU1lc3NhZ2VDbGFzcyIsIGNwQWRkQ29sb3JCdXR0b246ICJjcEFkZENvbG9yQnV0dG9uIiwgY3BBZGRDb2xvckJ1dHRvblRleHQ6ICJjcEFkZENvbG9yQnV0dG9uVGV4dCIsIGNwQWRkQ29sb3JCdXR0b25DbGFzczogImNwQWRkQ29sb3JCdXR0b25DbGFzcyIsIGNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzczogImNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyIsIGNvbG9yUGlja2VyOiAiY29sb3JQaWNrZXIiLCBjcFByZXNldENvbG9yczogImNwUHJlc2V0Q29sb3JzIiB9LCBvdXRwdXRzOiB7IGNwSW5wdXRDaGFuZ2U6ICJjcElucHV0Q2hhbmdlIiwgY3BUb2dnbGVDaGFuZ2U6ICJjcFRvZ2dsZUNoYW5nZSIsIGNwU2xpZGVyQ2hhbmdlOiAiY3BTbGlkZXJDaGFuZ2UiLCBjcFNsaWRlckRyYWdFbmQ6ICJjcFNsaWRlckRyYWdFbmQiLCBjcFNsaWRlckRyYWdTdGFydDogImNwU2xpZGVyRHJhZ1N0YXJ0IiwgY29sb3JQaWNrZXJPcGVuOiAiY29sb3JQaWNrZXJPcGVuIiwgY29sb3JQaWNrZXJDbG9zZTogImNvbG9yUGlja2VyQ2xvc2UiLCBjb2xvclBpY2tlckNhbmNlbDogImNvbG9yUGlja2VyQ2FuY2VsIiwgY29sb3JQaWNrZXJTZWxlY3Q6ICJjb2xvclBpY2tlclNlbGVjdCIsIGNvbG9yUGlja2VyQ2hhbmdlOiAiY29sb3JQaWNrZXJDaGFuZ2UiLCBjcENteWtDb2xvckNoYW5nZTogImNwQ215a0NvbG9yQ2hhbmdlIiwgY3BQcmVzZXRDb2xvcnNDaGFuZ2U6ICJjcFByZXNldENvbG9yc0NoYW5nZSIgfSwgZXhwb3J0QXM6IFsibmd4Q29sb3JQaWNrZXIiXSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKICAgIENvbG9yUGlja2VyRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogSW5qZWN0b3IgfSwKICAgICAgICB7IHR5cGU6IENvbXBvbmVudEZhY3RvcnlSZXNvbHZlciB9LAogICAgICAgIHsgdHlwZTogQXBwbGljYXRpb25SZWYgfSwKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IENvbG9yUGlja2VyU2VydmljZSB9CiAgICBdOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY29sb3JQaWNrZXIiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BXaWR0aCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcEhlaWdodCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFRvZ2dsZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcERpc2FibGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwSWdub3JlZEVsZW1lbnRzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwRmFsbGJhY2tDb2xvciIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcENvbG9yTW9kZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcENteWtFbmFibGVkIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwT3V0cHV0Rm9ybWF0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwQWxwaGFDaGFubmVsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwRGlzYWJsZUlucHV0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwRGlhbG9nRGlzcGxheSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFNhdmVDbGlja091dHNpZGUiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BDbG9zZUNsaWNrT3V0c2lkZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFVzZVJvb3RWaWV3Q29udGFpbmVyIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwUG9zaXRpb24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BQb3NpdGlvbk9mZnNldCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFBvc2l0aW9uUmVsYXRpdmVUb0Fycm93Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwT0tCdXR0b24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BPS0J1dHRvblRleHQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BPS0J1dHRvbkNsYXNzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwQ2FuY2VsQnV0dG9uIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwQ2FuY2VsQnV0dG9uVGV4dCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcENhbmNlbEJ1dHRvbkNsYXNzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwUHJlc2V0TGFiZWwiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BQcmVzZXRDb2xvcnMiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BQcmVzZXRDb2xvcnNDbGFzcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcE1heFByZXNldENvbG9yc0xlbmd0aCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFByZXNldEVtcHR5TWVzc2FnZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBJbnB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFByZXNldEVtcHR5TWVzc2FnZUNsYXNzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwQWRkQ29sb3JCdXR0b24iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BBZGRDb2xvckJ1dHRvblRleHQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgSW5wdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BBZGRDb2xvckJ1dHRvbkNsYXNzIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIElucHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwUmVtb3ZlQ29sb3JCdXR0b25DbGFzcyIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBPdXRwdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BJbnB1dENoYW5nZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBPdXRwdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY3BUb2dnbGVDaGFuZ2UiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgT3V0cHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwU2xpZGVyQ2hhbmdlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIE91dHB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFNsaWRlckRyYWdFbmQiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgT3V0cHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwU2xpZGVyRHJhZ1N0YXJ0Iiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIE91dHB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjb2xvclBpY2tlck9wZW4iLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgT3V0cHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNvbG9yUGlja2VyQ2xvc2UiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgT3V0cHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNvbG9yUGlja2VyQ2FuY2VsIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIE91dHB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjb2xvclBpY2tlclNlbGVjdCIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBPdXRwdXQoKQogICAgXSwgQ29sb3JQaWNrZXJEaXJlY3RpdmUucHJvdG90eXBlLCAiY29sb3JQaWNrZXJDaGFuZ2UiLCB2b2lkIDApOwogICAgX19kZWNvcmF0ZShbCiAgICAgICAgT3V0cHV0KCkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImNwQ215a0NvbG9yQ2hhbmdlIiwgdm9pZCAwKTsKICAgIF9fZGVjb3JhdGUoWwogICAgICAgIE91dHB1dCgpCiAgICBdLCBDb2xvclBpY2tlckRpcmVjdGl2ZS5wcm90b3R5cGUsICJjcFByZXNldENvbG9yc0NoYW5nZSIsIHZvaWQgMCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBIb3N0TGlzdGVuZXIoJ2NsaWNrJykKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImhhbmRsZUNsaWNrIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBIb3N0TGlzdGVuZXIoJ2ZvY3VzJykKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImhhbmRsZUZvY3VzIiwgbnVsbCk7CiAgICBfX2RlY29yYXRlKFsKICAgICAgICBIb3N0TGlzdGVuZXIoJ2lucHV0JywgWyckZXZlbnQnXSkKICAgIF0sIENvbG9yUGlja2VyRGlyZWN0aXZlLnByb3RvdHlwZSwgImhhbmRsZUlucHV0IiwgbnVsbCk7CgogICAgbGV0IENvbG9yUGlja2VyTW9kdWxlID0gY2xhc3MgQ29sb3JQaWNrZXJNb2R1bGUgewogICAgfTsKICAgIENvbG9yUGlja2VyTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQ29sb3JQaWNrZXJNb2R1bGUgfSk7CiAgICBDb2xvclBpY2tlck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIENvbG9yUGlja2VyTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENvbG9yUGlja2VyTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFtDb2xvclBpY2tlclNlcnZpY2VdLCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQ29sb3JQaWNrZXJNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ29sb3JQaWNrZXJDb21wb25lbnQsCiAgICAgICAgICAgIENvbG9yUGlja2VyRGlyZWN0aXZlLAogICAgICAgICAgICBUZXh0RGlyZWN0aXZlLAogICAgICAgICAgICBTbGlkZXJEaXJlY3RpdmVdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbQ29tbW9uTW9kdWxlXTsgfSwgZXhwb3J0czogZnVuY3Rpb24gKCkgeyByZXR1cm4gW0NvbG9yUGlja2VyRGlyZWN0aXZlXTsgfSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC93aWRnZXRzL3JhbmdlX2lucHV0L3JhbmdlX2lucHV0X2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkcCA9IFsiY29udGFpbmVyIl07CiAgICAvLyBLZWVwIHRoaXMgaW4gc3luYyB3aXRoIHJhbmdlX2lucHV0X2NvbXBvbmVudC5zY3NzJ3MgYCRfdGh1bWItc2l6ZWAuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBUSFVNQl9TSVpFX1BYID0gMTI7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IFBvc2l0aW9uID0gewogICAgICAgIE5PTkU6IDAsCiAgICAgICAgTEVGVDogMSwKICAgICAgICBSSUdIVDogMiwKICAgIH07CiAgICBQb3NpdGlvbltQb3NpdGlvbi5OT05FXSA9ICdOT05FJzsKICAgIFBvc2l0aW9uW1Bvc2l0aW9uLkxFRlRdID0gJ0xFRlQnOwogICAgUG9zaXRpb25bUG9zaXRpb24uUklHSFRdID0gJ1JJR0hUJzsKICAgIC8qKgogICAgICogRG91YmxlIHRodW1iZWQgc2xpZGVyIGNvbXBvbmVudCB1c2VkIGZvciBzZWxlY3RpbmcgYSBudW1lcmljIHJhbmdlLgogICAgICoKICAgICAqIEFuYXRvbXkgb2YgdGhlIGNvbXBvbmVudDoKICAgICAqCiAgICAgKiAgICAgICBsZWZ0IGlucHV0ICAgICAgICAgICAgIHJpZ2h0IGlucHV0CiAgICAgKiAgICstLS0tLS0tLS0tLS0tLS0tLSsgICAgICstLS0tLS0tLS0tLS0tLS0tKwogICAgICogICB8ICAgICAgICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgICAgIHwKICAgICAqICAgKy0tLS0tLS0tLS0tLS0tLS0tKyAgICAgKy0tLS0tLS0tLS0tLS0tLS0rCiAgICAgKiAgICAgICA8bG93ZXJWYWx1ZT4gICAgICAgICAgIDx1cHBlclZhbHVlPgogICAgICoKICAgICAqICAgICAgICAgbGVmdCB0aHVtYiAgICAgICAgIHJpZ2h0IHRodW1iCiAgICAgKiAgICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICArLS0tKwogICAgICogICAgICAgICAgIHwgICArICAgICB0cmFjayAgICAgKyAgIHwKICAgICAqICAgeCstLS0tLS0tLSs9PT09PT09PT09PT09PT09PT09Ky0tLS0tLS0tLSt4CiAgICAgKiA8bWluPiAgICAgfCAgICsgICAgICAgICAgICAgICArICAgfCAgICAgIDxtYXg+CiAgICAgKiAgICAgICAgICAgKy0tLSsgICAgICAgICAgICAgICArLS0tKwogICAgICogICAgICAgIDxsb3dlclZhbHVlPiAgICAgICAgPHVwcGVyVmFsdWU+CiAgICAgKgogICAgICogRmVhdHVyZXM6CiAgICAgKiAtIHlvdSBjYW4gZHJhZyBhIHRodW1iIHRvIGNoYW5nZSBsb3dlclZhbHVlIG9yIHVwcGVyVmFsdWUKICAgICAqIC0geW91IGNhbm5vdCBjbGljayBvbiB0cmFjayB0byBjaGFuZ2UgYW55IHZhbHVlCiAgICAgKiAtIGEgdGh1bWIgaXMgY2VudGVyZWQgKG9yaWdpbiBvZiB0aGUgY2lyY2xlKSB3LnIudCBhIHZhbHVlLgogICAgICogLSB3aGVuIGxvd2VyVmFsdWUgY3Jvc3MgdXBwZXJWYWx1ZSwgbG93ZXJWYWx1ZSA9IHVwcGVyVmFsdWUgYW5kIHVwcGVyVmFsdWUKICAgICAqICAgICBjaGFuZ2VzLiBDb252ZXJzZSBpcyB0cnVlLCB0b28uCiAgICAgKiAtIGRvZXMgbm90IHZhbGlkYXRlIGlucHV0IChlLmcuLCBsb3dlclZhbHVlIGNhbiBiZSBsb3dlciB0aGFuIG1pbikgYnV0IHRodW1icwogICAgICogICBhcmUgY2xpcHBlZCB0byBgbWluYCBhbmQgYG1heGAuIEFsc28sIHdoZW4gZW1pdHRpbmcgY2hhbmdlcywgdGhlIHZhbHVlcyBjYW4KICAgICAqICAgbmV2ZXIgZXhjZWVkIGBtaW5gIGFuZCBgbWF4YC4KICAgICAqLwogICAgY2xhc3MgUmFuZ2VJbnB1dENvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VEZXRlY3RvcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGNoYW5nZURldGVjdG9yKSB7CiAgICAgICAgICAgIHRoaXMuY2hhbmdlRGV0ZWN0b3IgPSBjaGFuZ2VEZXRlY3RvcjsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIGBudWxsYCBkZW5vdGVzIGNvbnRpZ3VvdXMgInRpY2tzIgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy50aWNrQ291bnQgPSAyMDsKICAgICAgICAgICAgdGhpcy52YWx1ZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5Qb3NpdGlvbiA9IFBvc2l0aW9uOwogICAgICAgICAgICB0aGlzLmFjdGl2ZVRodW1iID0gUG9zaXRpb24uTk9ORTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFjY291bnRzIGZvciBwb3NpdGlvbiBvZiBjdXJzb3Igd2hlbiBwcmVzc2luZyBkb3duIG9uIHRoZSB0aHVtYi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogVG8gaWxsdXN0cmF0ZSB0aGUgcG9pbnQsIGltYWdpbmUgdGhlIGNhc2Ugd2hlbiBtaW49MCwgbWF4PTEsIHRodW1iIGhhcwogICAgICAgICAgICAgKiByYWRpdXMgb2YgMTAwcHgsIHRoZSB0aHVtYiBpcyBzZXQgdG8gbWF4LCBhbmQgdGhlIGlucHV0IGlzIHBvc2l0aW9uZWQgZnJvbQogICAgICAgICAgICAgKiAoMCwgMCkgaW4gdGhlIHZpZXdwb3J0LiBVc2VyIGNhbiBjaGFuZ2UgbWF4IGJ5IG1vdXNlIGRvd25pbmcgYXQgKDUxLCAwKSBidXQKICAgICAgICAgICAgICogdGhhdCBzaG91bGQgbm90IGNoYW5nZSB0aGUgdXBwZXJWYWx1ZSB0byAwLjUxLiBJbnN0ZWFkLCBpdCBzaG91bGQgc3RheQogICAgICAgICAgICAgKiBhdCAxLiBJbiB0aGlzIGNhc2UsIHNpbmNlIHlvdSBjYW5ub3QgbW92ZSB0aGUgbW91c2UgcGFzdCAoMCwgMCksIHlvdSBjYW4KICAgICAgICAgICAgICogbmV2ZXIgc2V0IHRoZSB2YWx1ZSB0byA8PSA0OSBidXQsIG5vcm1uYWxseSwgdGhlIGlucHV0IGRvZXMgbm90IGdldAogICAgICAgICAgICAgKiByZW5kZXJlZCBpbiAoMCwgMCksIHRodW1iIHJhZGl1cyBpcyA2cHgsIGFuZCB1c2VyIGNhbiBtb3VzZSBkb3duIGF0IG1pZGRsZQogICAgICAgICAgICAgKiBvZiB0aGUgdGh1bWIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLm9mZnNldFhGcm9tT3JpZ2luT2ZBY3RpdmVUaHVtYiA9IDA7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFRodW1iUG9zaXRpb24odmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjbGlwcGVkVmFsdWUgPSB0aGlzLmdldENsaXBwZWRWYWx1ZSh2YWx1ZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm91bmRTaXplID0gdGhpcy5tYXggLSB0aGlzLm1pbjsKICAgICAgICAgICAgaWYgKGJvdW5kU2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzUwJSc7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwZXJjZW50RGlmZmVyZW5jZSA9ICgoY2xpcHBlZFZhbHVlIC0gdGhpcy5taW4pIC8gYm91bmRTaXplKSAqIDEwMDsKICAgICAgICAgICAgcmV0dXJuIGAke3BlcmNlbnREaWZmZXJlbmNlfSVgOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFRyYWNrV2lkdGgoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYm91bmRTaXplID0gdGhpcy5tYXggLSB0aGlzLm1pbjsKICAgICAgICAgICAgaWYgKGJvdW5kU2l6ZSA8PSAwKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gJzAlJzsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHZhbERpZmYgPSB0aGlzLmdldENsaXBwZWRWYWx1ZSh0aGlzLnVwcGVyVmFsdWUpIC0KICAgICAgICAgICAgICAgIHRoaXMuZ2V0Q2xpcHBlZFZhbHVlKHRoaXMubG93ZXJWYWx1ZSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcGVyY2VudERpZmZlcmVuY2UgPSAodmFsRGlmZiAvIGJvdW5kU2l6ZSkgKiAxMDA7CiAgICAgICAgICAgIHJldHVybiBgJHtwZXJjZW50RGlmZmVyZW5jZX0lYDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRDbGlwcGVkVmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgubWluKE1hdGgubWF4KHZhbHVlLCB0aGlzLm1pbiksIHRoaXMubWF4KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTsKICAgICAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIGZyb21FdmVudChkb2N1bWVudCwgJ21vdXNlbW92ZScsIHsgcGFzc2l2ZTogdHJ1ZSB9KQogICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1vdXNlTW92ZSgoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgZnJvbUV2ZW50KGRvY3VtZW50LCAnbW91c2V1cCcsIHsgcGFzc2l2ZTogdHJ1ZSB9KQogICAgICAgICAgICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMubmdVbnN1YnNjcmliZSkpCiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV2ZW50KSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLmhhbmRsZU1vdXNlT3V0KCgvKiogQHR5cGUgez99ICovIChldmVudCkpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFuZGxlTW91c2VEb3duKGV2ZW50LCBwb3NpdGlvbikgewogICAgICAgICAgICB0aGlzLmFjdGl2ZVRodW1iID0gcG9zaXRpb247CiAgICAgICAgICAgIC8vIE1vdXNlIGV2ZW50IHJlcG9ydHMgY3Vyc29yIHBvc2l0aW9uIHcuci50IHRoZSB0b3AgbGVmdCBlZGdlIG9mIHRoZSB0YXJnZXQKICAgICAgICAgICAgLy8gKGluIHRoaXMgY2FzZSwgYSB0aHVtYikgZWxlbWVudC4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvZmZzZXRYRnJvbUxlZnRPZlRodW1iID0gZXZlbnQub2Zmc2V0WDsKICAgICAgICAgICAgLy8gVGhlIHRodW1iIGlzIHZpc3VhbGx5IGNlbnRlcmVkIHcuci50LiBhIHZhbHVlIHVzaW5nIG5lZ2F0aXZlIG1hcmdpbiBvZgogICAgICAgICAgICAvLyBUSFVNQl9TSVpFX1BYIC8gMi4gQWNjb3VudCBmb3IgY3Vyc29yIG9mZnNldCB3LnIudCB0aGUgb3JpZ2luIG9mIHRoZQogICAgICAgICAgICAvLyBhY3RpdmUgdGh1bWIgc28gdGhlIHZhbHVlIGRvZXMgbm90IGNoYW5nZSBzaW1wbHkgYnkgbW91c2luZyBkb3duIG9uIHRoZQogICAgICAgICAgICAvLyB0aHVtYi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBvZmZzZXRYRnJvbUNlbnRlck9mVGh1bWIgPSBUSFVNQl9TSVpFX1BYIC8gMiAtIG9mZnNldFhGcm9tTGVmdE9mVGh1bWI7CiAgICAgICAgICAgIHRoaXMub2Zmc2V0WEZyb21PcmlnaW5PZkFjdGl2ZVRodW1iID0gb2Zmc2V0WEZyb21DZW50ZXJPZlRodW1iOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNhbGN1bGF0ZVZhbHVlRnJvbU1vdXNlRXZlbnQoZXZlbnQpIHsKICAgICAgICAgICAgY29uc3QgeyBsZWZ0LCByaWdodCB9ID0gdGhpcy5jb250YWluZXIubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKICAgICAgICAgICAgLy8gQ29tcHV0ZSBjdXJzb3IgcG9zaXRpb24gcmVsYXRpdmUgdG8gbGVmdCBlZGdlIG9mIHRoZSByYW5nZS1pbnB1dCBlbGVtZW50LgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHJlbGF0aXZlWFB4ID0gZXZlbnQuY2xpZW50WCAtIGxlZnQ7CiAgICAgICAgICAgIC8vIENvbXBlbnNhdGUgZm9yIGN1cnNvciBvZmZzZXQgZnJvbSBvcmlnaW4gb2YgdGhlIGFjdGl2ZSB0aHVtYi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb21wZW5zYXRlZFJlbGF0aXZlWEluUHggPSByZWxhdGl2ZVhQeCArIHRoaXMub2Zmc2V0WEZyb21PcmlnaW5PZkFjdGl2ZVRodW1iOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB4UG9zaXRpb25JblBlcmNlbnQ7CiAgICAgICAgICAgIGlmICh0aGlzLnRpY2tDb3VudCAhPT0gbnVsbCAmJiB0aGlzLnRpY2tDb3VudCA+IDApIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHRpY2tXaWR0aEluUHggPSAocmlnaHQgLSBsZWZ0KSAvIHRoaXMudGlja0NvdW50OwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdGlja1N0dWNrUmVsYXRpdmVQeCA9IE1hdGgucm91bmQoY29tcGVuc2F0ZWRSZWxhdGl2ZVhJblB4IC8gdGlja1dpZHRoSW5QeCkgKiB0aWNrV2lkdGhJblB4OwogICAgICAgICAgICAgICAgeFBvc2l0aW9uSW5QZXJjZW50ID0gdGlja1N0dWNrUmVsYXRpdmVQeCAvIChyaWdodCAtIGxlZnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgeFBvc2l0aW9uSW5QZXJjZW50ID0gY29tcGVuc2F0ZWRSZWxhdGl2ZVhJblB4IC8gKHJpZ2h0IC0gbGVmdCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q2xpcHBlZFZhbHVlKHRoaXMubWluICsgKHRoaXMubWF4IC0gdGhpcy5taW4pICogeFBvc2l0aW9uSW5QZXJjZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSGFuZGxlcyBgbW91c2Vtb3ZlYCBldmVudCBpbiB0aGUgZG9jdW1lbnQgYW5kLCBpZiBkcmFnZ2luZyAobW91c2Vkb3duIG9uCiAgICAgICAgICogdGh1bWIgaGFwcGVuZWQgYmVmb3JlKSwgY29tcHV0ZSBuZXcgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGFjdGl2ZSB0aHVtYgogICAgICAgICAqIGFuZCwgaWYgY2hhbmdlZCwgZXZlbnQgaXQgdG8gcGFyZW50LiBJZiB0aGUgbGVmdCB0aHVtYiBpcyBkcmFnZ2VkIHBhc3QgdGhlCiAgICAgICAgICogcmlnaHQgdGh1bWIsIHRoZSBlZmZlY3QgKGZyb20gdGhlIHVzZXIgcGVyc3BlY3RpdmUpIGlzIHRoYXQgdGhlIGxlZnQgdGh1bWIKICAgICAgICAgKiBzdGF5cyB3aGVyZSB0aGUgcmlnaHQgdGh1bWIgd2FzLCBhbmQgdGhlIGRyYWcgY29udGludWVzLCBtb3ZpbmcgdGhlIHJpZ2h0CiAgICAgICAgICogdGh1bWIgaW5zdGVhZC4KICAgICAgICAgKgogICAgICAgICAqIEltcGxlbWVudGF0aW9uIG5vdGU6IGVzcGVjaWFsbHkgd2hlbiBgbG93ZXJWYWx1ZWAgYW5kIGB1cHBlclZhbHVlYCBhcmUKICAgICAgICAgKiBuZWFyYnksIHlvdSBuZWVkIHRvIGtub3cgd2hpY2ggdmFsdWUgaXMgY3VycmVudGx5IGJlaW5nIGNoYW5nZWQgKGltYWdpbmUKICAgICAgICAgKiB0aGUgY3Vyc29yIGJlaW5nIHJpZ2h0IGluIGJldHdlZW4pOiB0byBkaXNhbWJpZ3VhdGUsIHdlIGhhdmUKICAgICAgICAgKiBgdGhpcy5hY3RpdmVUaHVtYmAuIEhvd2V2ZXIsIG9mIGNvdXJzZSwgd2hlbiBgbG93ZXJWYWx1ZWAgY3Jvc3NlcwogICAgICAgICAqIGB1cHBlclZhbHVlYCwgb3IgdmljZSBhIHZlcnNhLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUgYHRoaXMuYWN0aXZlVGh1bWJgCiAgICAgICAgICogYWNjb3JkaW5nbHkuIFRoaXMgaXMgZXNwZWNpYWxseSBpbXBvcnRhbnQgYmVjYXVzZSB0aGUgY29tcG9uZW50IGlzIGEKICAgICAgICAgKiAiY29udHJvbGxlZCBjb21wb25lbnQiIFsxXSBhbmQsIHdoZW4gcHJvcHMgdXBkYXRlLCB3ZSBkbyBub3Qga25vdyB3aGV0aGVyCiAgICAgICAgICogYGxvd2VyVmFsdWVgIG9yIGB1cHBlclZhbHVlYCBjb3JyZXNwb25kIHRvIHRoZSBhY3RpdmVUaHVtYiAoaS5lLiwgaWYgdGhpcwogICAgICAgICAqIHdlcmUgY29tcGxldGVseSB1bmNvbnRyb2xsZWQgY29tcG9uZW50LCB3ZSBjYW4gdGFrZSBpbml0aWFsIHBvc2l0aW9uIG9mIHRoZQogICAgICAgICAqIHRodW1iIHZpYSBwcm9wLCB0cmFjayBET00vcG9zaXRpb24gb2YgYWN0aXZlIGFuZCBpbmFjdGl2ZSB0aHVtYnMgdG8KICAgICAgICAgKiB1cGRhdGUvbW92ZSB0aGUgY29ycmVjdCBET00pLgogICAgICAgICAqCiAgICAgICAgICogWzFdOiBodHRwczovL3JlYWN0anMub3JnL2RvY3MvZm9ybXMuaHRtbCNjb250cm9sbGVkLWNvbXBvbmVudHMKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhbmRsZU1vdXNlTW92ZShldmVudCkgewogICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVUaHVtYiA9PT0gUG9zaXRpb24uTk9ORSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbmV3VmFsdWUgPSB0aGlzLmNhbGN1bGF0ZVZhbHVlRnJvbU1vdXNlRXZlbnQoZXZlbnQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBuZXh0VmFsdWVzID0gW3RoaXMubG93ZXJWYWx1ZSwgdGhpcy51cHBlclZhbHVlXTsKICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGh1bWIgPT09IFBvc2l0aW9uLkxFRlQpIHsKICAgICAgICAgICAgICAgIGlmIChuZXdWYWx1ZSA+IHRoaXMudXBwZXJWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGh1bWIgPSBQb3NpdGlvbi5SSUdIVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5leHRWYWx1ZXMgPSBbbmV3VmFsdWUsIHRoaXMudXBwZXJWYWx1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAobmV3VmFsdWUgPCB0aGlzLmxvd2VyVmFsdWUpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVRodW1iID0gUG9zaXRpb24uTEVGVDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG5leHRWYWx1ZXMgPSBbdGhpcy5sb3dlclZhbHVlLCBuZXdWYWx1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5tYXliZU5vdGlmeU5leHRWYWx1ZShuZXh0VmFsdWVzKTsKICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IG1pbkFuZE1heAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWF5YmVOb3RpZnlOZXh0VmFsdWUobWluQW5kTWF4KSB7CiAgICAgICAgICAgIGNvbnN0IFtsb3dlclZhbHVlLCB1cHBlclZhbHVlXSA9IG1pbkFuZE1heC5zb3J0KCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGEsIGIpID0+IGEgLSBiKSk7CiAgICAgICAgICAgIGlmICh0aGlzLmxvd2VyVmFsdWUgIT09IGxvd2VyVmFsdWUgfHwgdGhpcy51cHBlclZhbHVlICE9PSB1cHBlclZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLnZhbHVlLmVtaXQoeyBsb3dlclZhbHVlLCB1cHBlclZhbHVlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFuZGxlTW91c2VPdXQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuYWN0aXZlVGh1bWIgIT09IFBvc2l0aW9uLk5PTkUpIHsKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlVGh1bWIgPSBQb3NpdGlvbi5OT05FOwogICAgICAgICAgICAgICAgdGhpcy5jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFuZGxlSW5wdXRDaGFuZ2UoZXZlbnQsIHBvc2l0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5wdXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50LnRhcmdldCkpKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbnVtVmFsdWUgPSB0aGlzLmdldENsaXBwZWRWYWx1ZShOdW1iZXIoaW5wdXQudmFsdWUpKTsKICAgICAgICAgICAgaWYgKGlzTmFOKG51bVZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IG5leHRWYWx1ZXMgPSBbdGhpcy5sb3dlclZhbHVlLCB0aGlzLnVwcGVyVmFsdWVdOwogICAgICAgICAgICBpZiAocG9zaXRpb24gPT09IFBvc2l0aW9uLkxFRlQpIHsKICAgICAgICAgICAgICAgIG5leHRWYWx1ZXMgPSBbbnVtVmFsdWUsIHRoaXMudXBwZXJWYWx1ZV07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBuZXh0VmFsdWVzID0gW3RoaXMubG93ZXJWYWx1ZSwgbnVtVmFsdWVdOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMubWF5YmVOb3RpZnlOZXh0VmFsdWUobmV4dFZhbHVlcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcG9zaXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzVGh1bWJBY3RpdmUocG9zaXRpb24pIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYWN0aXZlVGh1bWIgPT09IHBvc2l0aW9uOwogICAgICAgIH0KICAgIH0KICAgIFJhbmdlSW5wdXRDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RiLXJhbmdlLWlucHV0JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vcmFuZ2VfaW5wdXRfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3JhbmdlX2lucHV0X2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUmFuZ2VJbnB1dENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0KICAgIF07CiAgICBSYW5nZUlucHV0Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNvbnRhaW5lcjogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2NvbnRhaW5lcicsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0sXSB9XSwKICAgICAgICBtaW46IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1heDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbG93ZXJWYWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdXBwZXJWYWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdGlja0NvdW50OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJhbmdlSW5wdXRDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBSYW5nZUlucHV0Q29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJhbmdlSW5wdXRDb21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSYW5nZUlucHV0Q29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFJhbmdlSW5wdXRDb21wb25lbnQsIHNlbGVjdG9yczogW1sidGItcmFuZ2UtaW5wdXQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gUmFuZ2VJbnB1dENvbXBvbmVudF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzAkcCwgdHJ1ZSwgRWxlbWVudFJlZik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5jb250YWluZXIgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgbWluOiAibWluIiwgbWF4OiAibWF4IiwgbG93ZXJWYWx1ZTogImxvd2VyVmFsdWUiLCB1cHBlclZhbHVlOiAidXBwZXJWYWx1ZSIsIHRpY2tDb3VudDogInRpY2tDb3VudCIgfSwgb3V0cHV0czogeyB2YWx1ZTogInZhbHVlIiB9LCBkZWNsczogOCwgdmFyczogMTQsIGNvbnN0czogW1sidHlwZSIsICJudW1iZXIiLCAxLCAibG93ZXItaW5wdXQiLCAzLCAidmFsdWUiLCAiY2hhbmdlIl0sIFsidHlwZSIsICJudW1iZXIiLCAxLCAidXBwZXItaW5wdXQiLCAzLCAidmFsdWUiLCAiY2hhbmdlIl0sIFsxLCAiY29udGFpbmVyIl0sIFsiY29udGFpbmVyIiwgIiJdLCBbMSwgInNsaWRlci10cmFjayJdLCBbMSwgInNsaWRlci10cmFjay1maWxsIl0sIFsxLCAidGh1bWIiLCAzLCAibW91c2Vkb3duIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUmFuZ2VJbnB1dENvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiaW5wdXQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBSYW5nZUlucHV0Q29tcG9uZW50X1RlbXBsYXRlX2lucHV0X2NoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZUlucHV0Q2hhbmdlKCRldmVudCwgY3R4LlBvc2l0aW9uLkxFRlQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaW5wdXQiLCAxKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBSYW5nZUlucHV0Q29tcG9uZW50X1RlbXBsYXRlX2lucHV0X2NoYW5nZV8xX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZUlucHV0Q2hhbmdlKCRldmVudCwgY3R4LlBvc2l0aW9uLlJJR0hUKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iLCAyLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNCwgInNwYW4iLCA0KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNSwgInNwYW4iLCA1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAic3BhbiIsIDYpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm1vdXNlZG93biIsIGZ1bmN0aW9uIFJhbmdlSW5wdXRDb21wb25lbnRfVGVtcGxhdGVfc3Bhbl9tb3VzZWRvd25fNl9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5oYW5kbGVNb3VzZURvd24oJGV2ZW50LCBjdHguUG9zaXRpb24uTEVGVCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJzcGFuIiwgNik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigibW91c2Vkb3duIiwgZnVuY3Rpb24gUmFuZ2VJbnB1dENvbXBvbmVudF9UZW1wbGF0ZV9zcGFuX21vdXNlZG93bl83X2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZU1vdXNlRG93bigkZXZlbnQsIGN0eC5Qb3NpdGlvbi5SSUdIVCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY3R4Lmxvd2VyVmFsdWUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eC51cHBlclZhbHVlKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgICAgIMm1ybVzdHlsZVByb3AoImxlZnQiLCBjdHguZ2V0VGh1bWJQb3NpdGlvbihjdHgubG93ZXJWYWx1ZSkpKCJ3aWR0aCIsIGN0eC5nZXRUcmFja1dpZHRoKCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXN0eWxlUHJvcCgibGVmdCIsIGN0eC5nZXRUaHVtYlBvc2l0aW9uKGN0eC5sb3dlclZhbHVlKSk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoImFjdGl2ZSIsIGN0eC5pc1RodW1iQWN0aXZlKGN0eC5Qb3NpdGlvbi5MRUZUKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1c3R5bGVQcm9wKCJsZWZ0IiwgY3R4LmdldFRodW1iUG9zaXRpb24oY3R4LnVwcGVyVmFsdWUpKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgiYWN0aXZlIiwgY3R4LmlzVGh1bWJBY3RpdmUoY3R4LlBvc2l0aW9uLlJJR0hUKSk7CiAgICAgICAgfSB9LCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2JveC1zaXppbmc6Ym9yZGVyLWJveDtkaXNwbGF5OmlubGluZS1ncmlkO2dyaWQtZ2FwOjEwcHg7Z3JpZC10ZW1wbGF0ZS1hcmVhczpcImxvd2VyLWlucHV0IHVwcGVyLWlucHV0XCIgXCJzbGlkZXIgc2xpZGVyXCI7Zm9udC1zaXplOjA7bG93ZXItd2lkdGg6MTAwcHg7cGFkZGluZzo2cHh9aW5wdXRbX25nY29udGVudC0lQ09NUCVde2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpoaWRkZW47d2lkdGg6MTAwJX0ubG93ZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTpsb3dlci1pbnB1dH0udXBwZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTp1cHBlci1pbnB1dDtqdXN0aWZ5LXNlbGY6ZmxleC1lbmR9LmNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Z3JpZC1hcmVhOnNsaWRlcjthbGlnbi1pdGVtczpjZW50ZXI7Ym94LXNpemluZzpib3JkZXItYm94O2Rpc3BsYXk6aW5saW5lLWZsZXg7aGVpZ2h0OjEycHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlfS5zbGlkZXItdHJhY2tbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMjYpO2hlaWdodDoycHg7d2lkdGg6MTAwJX0uc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MnB4fS50aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2JvcmRlci1yYWRpdXM6MTAwJTtkaXNwbGF5OmlubGluZS1ibG9jaztoZWlnaHQ6MTJweDttYXJnaW4tbGVmdDotNnB4O3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO3RyYW5zZm9ybS1vcmlnaW46Y2VudGVyO3RyYW5zaXRpb246dHJhbnNmb3JtIC4zcyBlYXNlO2JveC1zaGFkb3c6MCAwIDAgMXB4IHJnYmEoMCwwLDAsLjI2KTt3aWR0aDoxMnB4O3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0udGh1bWIuYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06c2NhbGUoMS4yKX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dpZGdldHMvcmFuZ2VfaW5wdXQvcmFuZ2VfaW5wdXRfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJhbmdlSW5wdXRNb2R1bGUgewogICAgfQogICAgUmFuZ2VJbnB1dE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW1JhbmdlSW5wdXRDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1JhbmdlSW5wdXRDb21wb25lbnRdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJhbmdlSW5wdXRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBSYW5nZUlucHV0TW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJhbmdlSW5wdXRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBSYW5nZUlucHV0TW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJhbmdlSW5wdXRNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShSYW5nZUlucHV0TW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1JhbmdlSW5wdXRDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZXhwb3J0czogW1JhbmdlSW5wdXRDb21wb25lbnRdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvdmlld3MvcnVuc190YWJsZS9ydW5zX3RhYmxlX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkcSA9IFsiZmlsdGVyIl07CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfdGhfOF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjIwID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAidGgiLCAyMyk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAibWF0LWNoZWNrYm94IiwgMjQpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RoXzhfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NoYW5nZV8xX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyMCk7IGNvbnN0IGN0eF9yMTkgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTkuaGFuZGxlUGFnZVRvZ2dsZSgpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCBjdHhfcjEuYWxsUGFnZUl0ZW1zU2VsZWN0ZWQoKSkoImluZGV0ZXJtaW5hdGUiLCAhY3R4X3IxLmFsbFBhZ2VJdGVtc1NlbGVjdGVkKCkgJiYgY3R4X3IxLnNvbWVQYWdlSXRlbXNTZWxlY3RlZCgpKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RkXzlfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IyMyA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRkIiwgMjUpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgIm1hdC1jaGVja2JveCIsIDI2KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF90ZF85X1RlbXBsYXRlX21hdF9jaGVja2JveF9jaGFuZ2VfMV9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMjMpOyBjb25zdCBpdGVtX3IyMSA9IGN0eC4kaW1wbGljaXQ7IGNvbnN0IGN0eF9yMjIgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMjIub25TZWxlY3Rpb25Ub2dnbGUuZW1pdChpdGVtX3IyMSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGl0ZW1fcjIxID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCBpdGVtX3IyMS5zZWxlY3RlZCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF90aF8xMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ0aCIsIDI3KTsKICAgICAgICDJtcm1dGV4dCgxLCAiIEV4cGVyaW1lbnQgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RkXzEyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRkIiwgMjgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iKTsKICAgICAgICDJtcm1dGV4dCgyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBpdGVtX3IyNCA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgidGl0bGUiLCBpdGVtX3IyNC5leHBlcmltZW50TmFtZSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShpdGVtX3IyNC5leHBlcmltZW50QWxpYXMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfdGhfMTRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAidGgiLCAyNyk7CiAgICAgICAgybXJtXRleHQoMSwgIiBSdW4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RkXzE1X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRkIiwgMjgpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBpdGVtX3IyNSA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShpdGVtX3IyNS5ydW4ubmFtZSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF90aF8xN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAidGgiLCAyMyk7CiAgICB9IH0KICAgIGNvbnN0IF9jMSRnID0gZnVuY3Rpb24gKGExKSB7IHJldHVybiB7ICJydW4tY29sb3Itc3dhdGNoIjogdHJ1ZSwgIm5vLWNvbG9yIjogYTEgfTsgfTsKICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF90ZF8xOF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjI4ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAidGQiLCAyNSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiYnV0dG9uIiwgMjkpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY29sb3JQaWNrZXJDaGFuZ2UiLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfdGRfMThfVGVtcGxhdGVfYnV0dG9uX2NvbG9yUGlja2VyQ2hhbmdlXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjI4KTsgY29uc3QgaXRlbV9yMjYgPSBjdHguJGltcGxpY2l0OyBjb25zdCBjdHhfcjI3ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjI3Lm9uUnVuQ29sb3JDaGFuZ2UuZW1pdCh7IHJ1bklkOiBpdGVtX3IyNi5ydW4uaWQsIG5ld0NvbG9yOiAkZXZlbnQgfSk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGl0ZW1fcjI2ID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJiYWNrZ3JvdW5kIiwgaXRlbV9yMjYucnVuQ29sb3IsIMm1ybVkZWZhdWx0U3R5bGVTYW5pdGl6ZXIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24xKDksIF9jMSRnLCAhaXRlbV9yMjYucnVuQ29sb3IpKSgiY29sb3JQaWNrZXIiLCBpdGVtX3IyNi5ydW5Db2xvcikoImNwRGlhbG9nRGlzcGxheSIsICJwb3B1cCIpKCJjcFBvc2l0aW9uIiwgImJvdHRvbS1yaWdodCIpKCJjcFBvc2l0aW9uT2Zmc2V0IiwgMCAtIDIwKSgiY3BVc2VSb290Vmlld0NvbnRhaW5lciIsIHRydWUpKCJjcE91dHB1dEZvcm1hdCIsICJoZXgiKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RoXzIwX2Rpdl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMzEgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAzMSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIpOwogICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiYnV0dG9uIiwgMzIpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfdGhfMjBfZGl2XzFfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzNfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjMxKTsgY29uc3QgY3R4X3IzMCA9IMm1ybVuZXh0Q29udGV4dCgyKTsgcmV0dXJuIGN0eF9yMzAub25TZWxlY3RBbGxQYWdlcy5lbWl0KCk7IH0pOwogICAgICAgIMm1ybV0ZXh0KDQsICIgU2VsZWN0IGFsbCBydW5zICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMjkgPSDJtcm1bmV4dENvbnRleHQoMik7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTIoIkFsbCBydW5zIGluIHRoaXMgcGFnZSBhcmUgc2VsZWN0ZWQgYnV0IG5vdCBhbGwgcnVucyAoIiwgY3R4X3IyOS5udW1TZWxlY3RlZEl0ZW1zLCAiIG9mICIsIGN0eF9yMjkuYWxsSXRlbXNMZW5ndGgsICIpIGFyZSBzZWxlY3RlZC4iKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RoXzIwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRoIiwgMjMpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBSdW5zVGFibGVDb21wb25lbnRfdGhfMjBfZGl2XzFfVGVtcGxhdGUsIDUsIDIsICJkaXYiLCAzMCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yOSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhdHRyaWJ1dGUoImNvbHNwYW4iLCBjdHhfcjkuZ2V0Q29sdW1uSWRzKCkubGVuZ3RoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjkuYWxsUGFnZUl0ZW1zU2VsZWN0ZWQoKSAmJiBjdHhfcjkubnVtU2VsZWN0ZWRJdGVtcyAhPT0gY3R4X3I5LmFsbEl0ZW1zTGVuZ3RoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX25nX2NvbnRhaW5lcl8zX25nX2NvbnRhaW5lcl85X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNDAgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDQwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX25nX2NvbnRhaW5lcl8zX25nX2NvbnRhaW5lcl85X1RlbXBsYXRlX2Rpdl9jbGlja18xX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I0MCk7IHJldHVybiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInRiLXJhbmdlLWlucHV0IiwgNDEpOwogICAgICAgIMm1ybVsaXN0ZW5lcigidmFsdWUiLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIxX3RoXzFfbmdfY29udGFpbmVyXzNfbmdfY29udGFpbmVyXzlfVGVtcGxhdGVfdGJfcmFuZ2VfaW5wdXRfdmFsdWVfMl9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNDApOyBjb25zdCBjb2x1bW5fcjMyID0gybXJtW5leHRDb250ZXh0KDMpLiRpbXBsaWNpdDsgY29uc3QgY3R4X3I0MSA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I0MS5oYW5kbGVIcGFyYW1JbnRlcnZhbENoYW5nZWQoY29sdW1uX3IzMiwgJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjb2x1bW5fcjMyID0gybXJtW5leHRDb250ZXh0KDMpLiRpbXBsaWNpdDsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1pbiIsIGNvbHVtbl9yMzIuZmlsdGVyLm1pblZhbHVlKSgibWF4IiwgY29sdW1uX3IzMi5maWx0ZXIubWF4VmFsdWUpKCJsb3dlclZhbHVlIiwgY29sdW1uX3IzMi5maWx0ZXIuZmlsdGVyTG93ZXJWYWx1ZSkoInVwcGVyVmFsdWUiLCBjb2x1bW5fcjMyLmZpbHRlci5maWx0ZXJVcHBlclZhbHVlKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX25nX2NvbnRhaW5lcl8zX25nX2NvbnRhaW5lcl8xMF9kaXZfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjQ3ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNDMpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIxX3RoXzFfbmdfY29udGFpbmVyXzNfbmdfY29udGFpbmVyXzEwX2Rpdl8xX1RlbXBsYXRlX2Rpdl9jbGlja18wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I0Nyk7IHJldHVybiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgIm1hdC1jaGVja2JveCIsIDI2KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjFfdGhfMV9uZ19jb250YWluZXJfM19uZ19jb250YWluZXJfMTBfZGl2XzFfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NoYW5nZV8xX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I0Nyk7IGNvbnN0IHZhbHVlX3I0NSA9IGN0eC4kaW1wbGljaXQ7IGNvbnN0IGNvbHVtbl9yMzIgPSDJtcm1bmV4dENvbnRleHQoNCkuJGltcGxpY2l0OyBjb25zdCBjdHhfcjQ4ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjQ4LmhhbmRsZUhwYXJhbURpc2NyZXRlQ2hhbmdlZChjb2x1bW5fcjMyLCB2YWx1ZV9yNDUpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCB2YWx1ZV9yNDUgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGNvbHVtbl9yMzIgPSDJtcm1bmV4dENvbnRleHQoNCkuJGltcGxpY2l0OwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2hlY2tlZCIsIGNvbHVtbl9yMzIuZmlsdGVyLmZpbHRlclZhbHVlcy5pbmNsdWRlcyh2YWx1ZV9yNDUpKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKHZhbHVlX3I0NSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjFfdGhfMV9uZ19jb250YWluZXJfM19uZ19jb250YWluZXJfMTBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgwKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMSwgUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX25nX2NvbnRhaW5lcl8zX25nX2NvbnRhaW5lcl8xMF9kaXZfMV9UZW1wbGF0ZSwgNCwgMiwgImRpdiIsIDQyKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY29sdW1uX3IzMiA9IMm1ybVuZXh0Q29udGV4dCgzKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY29sdW1uX3IzMi5maWx0ZXIucG9zc2libGVWYWx1ZXMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIxX3RoXzFfbmdfY29udGFpbmVyXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I1MyA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiYnV0dG9uIiwgMzYpOwogICAgICAgIMm1ybVlbGVtZW50KDIsICJtYXQtaWNvbiIsIDM3KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgIm1hdC1tZW51IiwgbnVsbCwgMzgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDM5KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlX2Rpdl9jbGlja181X2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I1Myk7IHJldHVybiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgIm1hdC1jaGVja2JveCIsIDI2KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNoYW5nZSIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjFfdGhfMV9uZ19jb250YWluZXJfM19UZW1wbGF0ZV9tYXRfY2hlY2tib3hfY2hhbmdlXzZfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjUzKTsgY29uc3QgY29sdW1uX3IzMiA9IMm1ybVuZXh0Q29udGV4dCgyKS4kaW1wbGljaXQ7IGNvbnN0IGN0eF9yNTQgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNTQuaGFuZGxlSHBhcmFtSW5jbHVkZVVuZGVmaW5lZFRvZ2dsZWQoY29sdW1uX3IzMik7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgInNwYW4iKTsKICAgICAgICDJtcm1dGV4dCg4LCAiKHNob3cgZW1wdHkgdmFsdWUpIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDksIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjFfdGhfMV9uZ19jb250YWluZXJfM19uZ19jb250YWluZXJfOV9UZW1wbGF0ZSwgMywgNCwgIm5nLWNvbnRhaW5lciIsIDM1KTsKICAgICAgICDJtcm1dGVtcGxhdGUoMTAsIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjFfdGhfMV9uZ19jb250YWluZXJfM19uZ19jb250YWluZXJfMTBfVGVtcGxhdGUsIDIsIDEsICJuZy1jb250YWluZXIiLCAzNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgX3IzNiA9IMm1ybVyZWZlcmVuY2UoNCk7CiAgICAgICAgY29uc3QgY29sdW1uX3IzMiA9IMm1ybVuZXh0Q29udGV4dCgyKS4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgY3R4X3IzNSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0TWVudVRyaWdnZXJGb3IiLCBfcjM2KTsKICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIkZpbHRlciBocGFyYW0gIiArIChjb2x1bW5fcjMyLmRpc3BsYXlOYW1lIHx8IGNvbHVtbl9yMzIubmFtZSkpOwogICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2hlY2tlZCIsIGNvbHVtbl9yMzIuZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQpOwogICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGNvbHVtbl9yMzIuZmlsdGVyLnR5cGUgPT09IGN0eF9yMzUuRG9tYWluVHlwZS5JTlRFUlZBTCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY29sdW1uX3IzMi5maWx0ZXIudHlwZSA9PT0gY3R4X3IzNS5Eb21haW5UeXBlLkRJU0NSRVRFKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInRoIiwgMjMpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAzNCk7CiAgICAgICAgybXJtXRleHQoMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMywgUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV90aF8xX25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlLCAxMSwgNSwgIm5nLWNvbnRhaW5lciIsIDM1KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY29sdW1uX3IzMiA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGNvbHVtbl9yMzIuZGlzcGxheU5hbWUgfHwgY29sdW1uX3IzMi5uYW1lKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjb2x1bW5fcjMyLmZpbHRlcik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjFfdGRfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ0ZCIsIDI1KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgaXRlbV9yNTggPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGNvbHVtbl9yMzIgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBpdGVtX3I1OC5ocGFyYW1zLmdldChjb2x1bW5fcjMyLm5hbWUpLCAiICIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIxX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCwgMzMpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIxX3RoXzFfVGVtcGxhdGUsIDQsIDIsICJ0aCIsIDgpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIxX3RkXzJfVGVtcGxhdGUsIDIsIDEsICJ0ZCIsIDkpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjb2x1bW5fcjMyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICBjb25zdCBjdHhfcjEwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJtYXRDb2x1bW5EZWYiLCBjdHhfcjEwLmdldEhwYXJhbUNvbHVtbklkKGNvbHVtbl9yMzIpKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMl90aF8xX25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNjYgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImJ1dHRvbiIsIDM2KTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAibWF0LWljb24iLCAzNyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJtYXQtbWVudSIsIG51bGwsIDM4KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJkaXYiLCAzOSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfdGhfMV9uZ19jb250YWluZXJfM19UZW1wbGF0ZV9kaXZfY2xpY2tfNV9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNjYpOyByZXR1cm4gJGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJtYXQtY2hlY2tib3giLCAyNik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIyX3RoXzFfbmdfY29udGFpbmVyXzNfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NoYW5nZV82X2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2Nik7IGNvbnN0IGNvbHVtbl9yNjAgPSDJtcm1bmV4dENvbnRleHQoMikuJGltcGxpY2l0OyBjb25zdCBjdHhfcjY3ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjY3LmhhbmRsZU1ldHJpY0luY2x1ZGVVbmRlZmluZWRDaGFuZ2VkKGNvbHVtbl9yNjApOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJzcGFuIik7CiAgICAgICAgybXJtXRleHQoOCwgIihzaG93IGVtcHR5IHZhbHVlKSIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgImRpdiIsIDQwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMl90aF8xX25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlX2Rpdl9jbGlja185X2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2Nik7IHJldHVybiAkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTAsICJ0Yi1yYW5nZS1pbnB1dCIsIDQxKTsKICAgICAgICDJtcm1bGlzdGVuZXIoInZhbHVlIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMl90aF8xX25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlX3RiX3JhbmdlX2lucHV0X3ZhbHVlXzEwX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2Nik7IGNvbnN0IGNvbHVtbl9yNjAgPSDJtcm1bmV4dENvbnRleHQoMikuJGltcGxpY2l0OyBjb25zdCBjdHhfcjcwID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjcwLmhhbmRsZU1ldHJpY0ZpbHRlckNoYW5nZWQoY29sdW1uX3I2MCwgJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IF9yNjQgPSDJtcm1cmVmZXJlbmNlKDQpOwogICAgICAgIGNvbnN0IGNvbHVtbl9yNjAgPSDJtcm1bmV4dENvbnRleHQoMikuJGltcGxpY2l0OwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0TWVudVRyaWdnZXJGb3IiLCBfcjY0KTsKICAgICAgICDJtcm1YXR0cmlidXRlKCJhcmlhLWxhYmVsIiwgIkZpbHRlciBtZXRyaWMgIiArIChjb2x1bW5fcjYwLmRpc3BsYXlOYW1lIHx8IGNvbHVtbl9yNjAudGFnKSk7CiAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJjaGVja2VkIiwgY29sdW1uX3I2MC5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCk7CiAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJtaW4iLCBjb2x1bW5fcjYwLmZpbHRlci5taW5WYWx1ZSkoIm1heCIsIGNvbHVtbl9yNjAuZmlsdGVyLm1heFZhbHVlKSgibG93ZXJWYWx1ZSIsIGNvbHVtbl9yNjAuZmlsdGVyLmZpbHRlckxvd2VyVmFsdWUpKCJ1cHBlclZhbHVlIiwgY29sdW1uX3I2MC5maWx0ZXIuZmlsdGVyVXBwZXJWYWx1ZSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfdGhfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ0aCIsIDIzKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgMzQpOwogICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDMsIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfdGhfMV9uZ19jb250YWluZXJfM19UZW1wbGF0ZSwgMTEsIDcsICJuZy1jb250YWluZXIiLCAzNSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGNvbHVtbl9yNjAgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjb2x1bW5fcjYwLmRpc3BsYXlOYW1lIHx8IGNvbHVtbl9yNjAudGFnKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjb2x1bW5fcjYwLmZpbHRlcik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfdGRfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ0ZCIsIDI1KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgaXRlbV9yNzQgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGNvbHVtbl9yNjAgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBpdGVtX3I3NC5tZXRyaWNzLmdldChjb2x1bW5fcjYwLnRhZyksICIgIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgwLCAzMyk7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfdGhfMV9UZW1wbGF0ZSwgNCwgMiwgInRoIiwgOCk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIFJ1bnNUYWJsZUNvbXBvbmVudF9uZ19jb250YWluZXJfMjJfdGRfMl9UZW1wbGF0ZSwgMiwgMSwgInRkIiwgOSk7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGNvbHVtbl9yNjAgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yMTEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm1hdENvbHVtbkRlZiIsIGN0eF9yMTEuZ2V0TWV0cmljQ29sdW1uSWQoY29sdW1uX3I2MCkpOwogICAgfSB9CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfdHJfMjNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgInRyIiwgNDQpOwogICAgfSB9CiAgICBjb25zdCBfYzIkNyA9IGZ1bmN0aW9uIChhMSkgeyByZXR1cm4geyAic2VsZWN0LWFsbCI6IHRydWUsICJzaG93LXNlbGVjdC1hbGwiOiBhMSB9OyB9OwogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X3RyXzI0X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJ0ciIsIDQ1KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMTMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nQ2xhc3MiLCDJtcm1cHVyZUZ1bmN0aW9uMSgxLCBfYzIkNywgY3R4X3IxMy5hbGxQYWdlSXRlbXNTZWxlY3RlZCgpICYmIGN0eF9yMTMubnVtU2VsZWN0ZWRJdGVtcyAhPT0gY3R4X3IxMy5hbGxJdGVtc0xlbmd0aCkpOwogICAgfSB9CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfdHJfMjVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgInRyIiwgNDYpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3Qgcm93X3I3NiA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgybXJtWF0dHJpYnV0ZSgiZGF0YS1pZCIsIHJvd19yNzYucnVuLmlkKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X2Rpdl8yN19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA0Nyk7CiAgICAgICAgybXJtWVsZW1lbnQoMSwgIm1hdC1zcGlubmVyIiwgNDgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9kaXZfMjhfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNDkpOwogICAgICAgIMm1ybV0ZXh0KDEsICJObyBSdW5zIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X2Rpdl8yOV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCA0OSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIpOwogICAgICAgIMm1ybV0ZXh0KDIsICJObyBydW5zIG1hdGNoIFwiIik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiY29kZSIpOwogICAgICAgIMm1ybV0ZXh0KDQpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtXRleHQoNSwgIlwiIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxNyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4X3IxNy5yZWdleEZpbHRlcik7CiAgICB9IH0KICAgIGNvbnN0IF9jMyQzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gWzUsIDEwLCAyMF07IH07CiAgICBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbWF0X3BhZ2luYXRvcl8zMF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjc4ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXBhZ2luYXRvciIsIDUwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoInBhZ2UiLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfbWF0X3BhZ2luYXRvcl8zMF9UZW1wbGF0ZV9tYXRfcGFnaW5hdG9yX3BhZ2VfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNzgpOyBjb25zdCBjdHhfcjc3ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjc3Lm9uUGFnaW5hdGlvbkNoYW5nZS5lbWl0KCRldmVudCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjE4ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJwYWdlU2l6ZU9wdGlvbnMiLCDJtcm1cHVyZUZ1bmN0aW9uMCg0LCBfYzMkMykpKCJwYWdlSW5kZXgiLCBjdHhfcjE4LnBhZ2luYXRpb25PcHRpb24ucGFnZUluZGV4KSgicGFnZVNpemUiLCBjdHhfcjE4LnBhZ2luYXRpb25PcHRpb24ucGFnZVNpemUpKCJsZW5ndGgiLCBjdHhfcjE4LmZpbHRlcmVkSXRlbXNMZW5ndGgpOwogICAgfSB9CiAgICBjb25zdCBfYzQkMiA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFsic2VsZWN0X2FsbCJdOyB9OwogICAgLyoqCiAgICAgKiBFeHBvcnRlZCBiZWNhdXNlIEFuZ3VsYXIgY29tcGlsZXIgcmVxdWlyZXMgZGVjb3JhdGVkIGNsYXNzZXMgdG8gYmUgZXhwb3J0ZWQuCiAgICAgKi8KICAgIGNsYXNzIFJ1bnNQYWdpbmF0b3JJbnRsIGV4dGVuZHMgTWF0UGFnaW5hdG9ySW50bCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7CiAgICAgICAgICAgIHRoaXMuaXRlbXNQZXJQYWdlTGFiZWwgPSAnU2hvdyBydW5zOic7CiAgICAgICAgfQogICAgfQogICAgUnVuc1BhZ2luYXRvckludGwuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1BhZ2luYXRvckludGwuybVmYWMgPSBmdW5jdGlvbiBSdW5zUGFnaW5hdG9ySW50bF9GYWN0b3J5KHQpIHsgcmV0dXJuIMm1UnVuc1BhZ2luYXRvckludGxfQmFzZUZhY3RvcnkodCB8fCBSdW5zUGFnaW5hdG9ySW50bCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1BhZ2luYXRvckludGwuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogUnVuc1BhZ2luYXRvckludGwsIGZhY3Rvcnk6IFJ1bnNQYWdpbmF0b3JJbnRsLsm1ZmFjIH0pOwogICAgY29uc3QgybVSdW5zUGFnaW5hdG9ySW50bF9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KFJ1bnNQYWdpbmF0b3JJbnRsKTsKICAgIGNsYXNzIFJ1bnNUYWJsZUNvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IG5ldyBNYXRUYWJsZURhdGFTb3VyY2UoKTsKICAgICAgICAgICAgdGhpcy5Eb21haW5UeXBlID0gRG9tYWluVHlwZTsKICAgICAgICAgICAgdGhpcy5vblJlZ2V4RmlsdGVyQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uVG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uUGFnZVNlbGVjdGlvblRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vblNlbGVjdEFsbFBhZ2VzID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uUGFnaW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vblNvcnRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25SdW5Db2xvckNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vbk1ldHJpY0ZpbHRlckNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoKSB7CiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZS5kYXRhID0gdGhpcy5wYWdlSXRlbXM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3BlYwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0SHBhcmFtQ29sdW1uSWQoc3BlYykgewogICAgICAgICAgICByZXR1cm4gYGg6JHtzcGVjLm5hbWV9YDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzcGVjCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRNZXRyaWNDb2x1bW5JZChzcGVjKSB7CiAgICAgICAgICAgIHJldHVybiBgbToke3NwZWMudGFnfWA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0Q29sdW1uSWRzKCkgewogICAgICAgICAgICByZXR1cm4gWwogICAgICAgICAgICAgICAgLi4udGhpcy5jb2x1bW5zLAogICAgICAgICAgICAgICAgLi4udGhpcy5ocGFyYW1Db2x1bW5zLm1hcCh0aGlzLmdldEhwYXJhbUNvbHVtbklkKSwKICAgICAgICAgICAgICAgIC4uLnRoaXMubWV0cmljQ29sdW1ucy5tYXAodGhpcy5nZXRNZXRyaWNDb2x1bW5JZCksCiAgICAgICAgICAgIF07CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdHJ1ZSB3aGVuIGFsbCBpdGVtcyBpbiB0aGUgcGFnZSBhcmUgc2VsZWN0ZWQuIFJldHVybnMgZmFsc2Ugd2hlbgogICAgICAgICAqIHRoZXJlIGFyZSBubyBpdGVtcyBhdCBhbGwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBhbGxQYWdlSXRlbXNTZWxlY3RlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuKHRoaXMucGFnZUl0ZW1zLmxlbmd0aCkgJiYKICAgICAgICAgICAgICAgIHRoaXMucGFnZUl0ZW1zLmV2ZXJ5KCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uc2VsZWN0ZWQpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc29tZVBhZ2VJdGVtc1NlbGVjdGVkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYWdlSXRlbXMuc29tZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGl0ZW0pID0+IGl0ZW0uc2VsZWN0ZWQpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVQYWdlVG9nZ2xlKCkgewogICAgICAgICAgICB0aGlzLm9uUGFnZVNlbGVjdGlvblRvZ2dsZS5lbWl0KHsgaXRlbXM6IHRoaXMucGFnZUl0ZW1zIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvcnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhbmRsZVNvcnRDaGFuZ2Uoc29ydCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBkaXJlY3Rpb247CiAgICAgICAgICAgIHN3aXRjaCAoc29ydC5kaXJlY3Rpb24pIHsKICAgICAgICAgICAgICAgIGNhc2UgJ2FzYyc6CiAgICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gU29ydERpcmVjdGlvbi5BU0M7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlICdkZXNjJzoKICAgICAgICAgICAgICAgICAgICBkaXJlY3Rpb24gPSBTb3J0RGlyZWN0aW9uLkRFU0M7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IFNvcnREaXJlY3Rpb24uVU5TRVQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5vblNvcnRDaGFuZ2UuZW1pdCh7CiAgICAgICAgICAgICAgICBjb2x1bW46ICgvKiogQHR5cGUgez99ICovIChzb3J0LmFjdGl2ZSkpLAogICAgICAgICAgICAgICAgZGlyZWN0aW9uLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25GaWx0ZXJLZXlVcChldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gKC8qKiBAdHlwZSB7P30gKi8gKCgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKSkpOwogICAgICAgICAgICB0aGlzLm9uUmVnZXhGaWx0ZXJDaGFuZ2UuZW1pdChpbnB1dC52YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRhYmxlVHJhY2tCeShpbmRleCwgaXRlbSkgewogICAgICAgICAgICByZXR1cm4gaXRlbS5ydW4uaWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaHBhcmFtQ29sdW1uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVIcGFyYW1JbmNsdWRlVW5kZWZpbmVkVG9nZ2xlZChocGFyYW1Db2x1bW4pIHsKICAgICAgICAgICAgY29uc3QgeyBuYW1lLCBmaWx0ZXIgfSA9IGhwYXJhbUNvbHVtbjsKICAgICAgICAgICAgaWYgKCFmaWx0ZXIpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhcmlhbnQgZXJyb3I6IHJlcXVpcmUgZmlsdGVyIHRvIGV4aXN0IGZvciBpdCB0byBjaGFuZ2UnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZmlsdGVyLnR5cGUgPT09IERvbWFpblR5cGUuRElTQ1JFVEUpIHsKICAgICAgICAgICAgICAgIHRoaXMub25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQuZW1pdCh7CiAgICAgICAgICAgICAgICAgICAgaHBhcmFtTmFtZTogbmFtZSwKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlVW5kZWZpbmVkOiAhZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQsCiAgICAgICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzOiBmaWx0ZXIuZmlsdGVyVmFsdWVzLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkLmVtaXQoewogICAgICAgICAgICAgICAgICAgIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZVVuZGVmaW5lZDogIWZpbHRlci5pbmNsdWRlVW5kZWZpbmVkLAogICAgICAgICAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWU6IGZpbHRlci5maWx0ZXJMb3dlclZhbHVlLAogICAgICAgICAgICAgICAgICAgIGZpbHRlclVwcGVyVmFsdWU6IGZpbHRlci5maWx0ZXJVcHBlclZhbHVlLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBocGFyYW1Db2x1bW4KICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVIcGFyYW1JbnRlcnZhbENoYW5nZWQoaHBhcmFtQ29sdW1uLCBuZXdWYWx1ZSkgewogICAgICAgICAgICBjb25zdCB7IG5hbWUsIGZpbHRlciB9ID0gaHBhcmFtQ29sdW1uOwogICAgICAgICAgICBpZiAoIWZpbHRlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFyaWFudCBlcnJvcjogcmVxdWlyZSBmaWx0ZXIgdG8gZXhpc3QgZm9yIGl0IHRvIGNoYW5nZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQuZW1pdCh7CiAgICAgICAgICAgICAgICBuYW1lLAogICAgICAgICAgICAgICAgaW5jbHVkZVVuZGVmaW5lZDogZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQsCiAgICAgICAgICAgICAgICBmaWx0ZXJMb3dlclZhbHVlOiBuZXdWYWx1ZS5sb3dlclZhbHVlLAogICAgICAgICAgICAgICAgZmlsdGVyVXBwZXJWYWx1ZTogbmV3VmFsdWUudXBwZXJWYWx1ZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaHBhcmFtQ29sdW1uCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGVkVmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhhbmRsZUhwYXJhbURpc2NyZXRlQ2hhbmdlZChocGFyYW1Db2x1bW4sIHRvZ2dsZWRWYWx1ZSkgewogICAgICAgICAgICBjb25zdCB7IG5hbWUsIGZpbHRlciB9ID0gaHBhcmFtQ29sdW1uOwogICAgICAgICAgICBpZiAoIWZpbHRlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFyaWFudCBlcnJvcjogcmVxdWlyZSBmaWx0ZXIgdG8gZXhpc3QgZm9yIGl0IHRvIGNoYW5nZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChmaWx0ZXIudHlwZSAhPT0gRG9tYWluVHlwZS5ESVNDUkVURSkgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoYEludmFyaWFudCBlcnJvcjogZXhwZWN0ZWQgZGlzY3JldGUgZG9tYWluIGZvciAke25hbWV9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgU2V0KFsuLi5maWx0ZXIuZmlsdGVyVmFsdWVzXSk7CiAgICAgICAgICAgIGlmIChuZXdWYWx1ZXMuaGFzKHRvZ2dsZWRWYWx1ZSkpIHsKICAgICAgICAgICAgICAgIG5ld1ZhbHVlcy5kZWxldGUodG9nZ2xlZFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIG5ld1ZhbHVlcy5hZGQodG9nZ2xlZFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLm9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkLmVtaXQoewogICAgICAgICAgICAgICAgaHBhcmFtTmFtZTogbmFtZSwKICAgICAgICAgICAgICAgIGluY2x1ZGVVbmRlZmluZWQ6IGZpbHRlci5pbmNsdWRlVW5kZWZpbmVkLAogICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzOiAoLyoqIEB0eXBlIHs/fSAqLyAoWy4uLm5ld1ZhbHVlc10pKSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0cmljQ29sdW1uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVNZXRyaWNJbmNsdWRlVW5kZWZpbmVkQ2hhbmdlZChtZXRyaWNDb2x1bW4pIHsKICAgICAgICAgICAgaWYgKCFtZXRyaWNDb2x1bW4uZmlsdGVyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YXJpYW50IGVycm9yOiByZXF1aXJlIGZpbHRlciB0byBleGlzdCBmb3IgaXQgdG8gY2hhbmdlJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5vbk1ldHJpY0ZpbHRlckNoYW5nZWQuZW1pdCh7CiAgICAgICAgICAgICAgICBuYW1lOiBtZXRyaWNDb2x1bW4udGFnLAogICAgICAgICAgICAgICAgaW5jbHVkZVVuZGVmaW5lZDogIW1ldHJpY0NvbHVtbi5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWU6IG1ldHJpY0NvbHVtbi5maWx0ZXIuZmlsdGVyTG93ZXJWYWx1ZSwKICAgICAgICAgICAgICAgIGZpbHRlclVwcGVyVmFsdWU6IG1ldHJpY0NvbHVtbi5maWx0ZXIuZmlsdGVyVXBwZXJWYWx1ZSwKICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0cmljQ29sdW1uCiAgICAgICAgICogQHBhcmFtIHs/fSBuZXdWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaGFuZGxlTWV0cmljRmlsdGVyQ2hhbmdlZChtZXRyaWNDb2x1bW4sIG5ld1ZhbHVlKSB7CiAgICAgICAgICAgIGlmICghbWV0cmljQ29sdW1uLmZpbHRlcikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFyaWFudCBlcnJvcjogcmVxdWlyZSBmaWx0ZXIgdG8gZXhpc3QgZm9yIGl0IHRvIGNoYW5nZScpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMub25NZXRyaWNGaWx0ZXJDaGFuZ2VkLmVtaXQoewogICAgICAgICAgICAgICAgbmFtZTogbWV0cmljQ29sdW1uLnRhZywKICAgICAgICAgICAgICAgIGluY2x1ZGVVbmRlZmluZWQ6IG1ldHJpY0NvbHVtbi5maWx0ZXIuaW5jbHVkZVVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWU6IG5ld1ZhbHVlLmxvd2VyVmFsdWUsCiAgICAgICAgICAgICAgICBmaWx0ZXJVcHBlclZhbHVlOiBuZXdWYWx1ZS51cHBlclZhbHVlLAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBocGFyYW1Db2x1bW4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYWNrQnlIcGFyYW1Db2x1bW4oaHBhcmFtQ29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiBocGFyYW1Db2x1bW4ubmFtZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRyaWNDb2x1bW4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYWNrQnlNZXRyaWNDb2x1bW4obWV0cmljQ29sdW1uKSB7CiAgICAgICAgICAgIHJldHVybiBtZXRyaWNDb2x1bW4udGFnOwogICAgICAgIH0KICAgIH0KICAgIFJ1bnNUYWJsZUNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAncnVucy10YWJsZS1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAncnVuc190YWJsZV9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgaG9zdDogewogICAgICAgICAgICAgICAgICAgICAgICAnW2NsYXNzLmZsZXgtbGF5b3V0XSc6ICd1c2VGbGV4aWJsZUxheW91dCcsCiAgICAgICAgICAgICAgICAgICAgfSwKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsncnVuc190YWJsZV9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICAgICAgLy8gVXNlIEVsZW1lbnQgUHJvdmlkZXIgc2luY2UgdGhpcyB0ZXh0IGlzIHVuaXF1ZSB0byB0aGlzIGVsZW1lbnQgaGllcmFyY2h5LgogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogW3sgcHJvdmlkZTogTWF0UGFnaW5hdG9ySW50bCwgdXNlQ2xhc3M6IFJ1bnNQYWdpbmF0b3JJbnRsIH1dLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgUnVuc1RhYmxlQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHNob3dFeHBlcmltZW50TmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaHBhcmFtQ29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbWV0cmljQ29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYWxsSXRlbXNMZW5ndGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZpbHRlcmVkSXRlbXNMZW5ndGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHVzZUZsZXhpYmxlTGF5b3V0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB1c2VQYWdpbmF0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBwYWdlSXRlbXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGxvYWRpbmc6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bVNlbGVjdGVkSXRlbXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNvcnRPcHRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBhZ2luYXRpb25PcHRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHJlZ2V4RmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvblJlZ2V4RmlsdGVyQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25TZWxlY3Rpb25Ub2dnbGU6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBvblBhZ2VTZWxlY3Rpb25Ub2dnbGU6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBvblNlbGVjdEFsbFBhZ2VzOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25QYWdpbmF0aW9uQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25Tb3J0Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25SdW5Db2xvckNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBvbk1ldHJpY0ZpbHRlckNoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBmaWx0ZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydmaWx0ZXInLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0sCiAgICAgICAgcGFnaW5hdG9yOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRQYWdpbmF0b3IsIHsgc3RhdGljOiB0cnVlIH0sXSB9XSwKICAgICAgICBzb3J0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRTb3J0LCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1RhYmxlQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gUnVuc1RhYmxlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNUYWJsZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zVGFibGVDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUnVuc1RhYmxlQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInJ1bnMtdGFibGUtY29tcG9uZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzAkcSwgdHJ1ZSwgRWxlbWVudFJlZik7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoTWF0UGFnaW5hdG9yLCB0cnVlKTsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShNYXRTb3J0LCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmZpbHRlciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5wYWdpbmF0b3IgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguc29ydCA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoImZsZXgtbGF5b3V0IiwgY3R4LnVzZUZsZXhpYmxlTGF5b3V0KTsKICAgICAgICB9IH0sIGlucHV0czogeyBzaG93RXhwZXJpbWVudE5hbWU6ICJzaG93RXhwZXJpbWVudE5hbWUiLCBjb2x1bW5zOiAiY29sdW1ucyIsIGhwYXJhbUNvbHVtbnM6ICJocGFyYW1Db2x1bW5zIiwgbWV0cmljQ29sdW1uczogIm1ldHJpY0NvbHVtbnMiLCBhbGxJdGVtc0xlbmd0aDogImFsbEl0ZW1zTGVuZ3RoIiwgZmlsdGVyZWRJdGVtc0xlbmd0aDogImZpbHRlcmVkSXRlbXNMZW5ndGgiLCB1c2VGbGV4aWJsZUxheW91dDogInVzZUZsZXhpYmxlTGF5b3V0IiwgdXNlUGFnaW5hdGlvbjogInVzZVBhZ2luYXRpb24iLCBwYWdlSXRlbXM6ICJwYWdlSXRlbXMiLCBsb2FkaW5nOiAibG9hZGluZyIsIG51bVNlbGVjdGVkSXRlbXM6ICJudW1TZWxlY3RlZEl0ZW1zIiwgc29ydE9wdGlvbjogInNvcnRPcHRpb24iLCBwYWdpbmF0aW9uT3B0aW9uOiAicGFnaW5hdGlvbk9wdGlvbiIsIHJlZ2V4RmlsdGVyOiAicmVnZXhGaWx0ZXIiIH0sIG91dHB1dHM6IHsgb25SZWdleEZpbHRlckNoYW5nZTogIm9uUmVnZXhGaWx0ZXJDaGFuZ2UiLCBvblNlbGVjdGlvblRvZ2dsZTogIm9uU2VsZWN0aW9uVG9nZ2xlIiwgb25QYWdlU2VsZWN0aW9uVG9nZ2xlOiAib25QYWdlU2VsZWN0aW9uVG9nZ2xlIiwgb25TZWxlY3RBbGxQYWdlczogIm9uU2VsZWN0QWxsUGFnZXMiLCBvblBhZ2luYXRpb25DaGFuZ2U6ICJvblBhZ2luYXRpb25DaGFuZ2UiLCBvblNvcnRDaGFuZ2U6ICJvblNvcnRDaGFuZ2UiLCBvblJ1bkNvbG9yQ2hhbmdlOiAib25SdW5Db2xvckNoYW5nZSIsIG9uSHBhcmFtRGlzY3JldGVGaWx0ZXJDaGFuZ2VkOiAib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQiLCBvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZDogIm9uSHBhcmFtSW50ZXJ2YWxGaWx0ZXJDaGFuZ2VkIiwgb25NZXRyaWNGaWx0ZXJDaGFuZ2VkOiAib25NZXRyaWNGaWx0ZXJDaGFuZ2VkIiB9LCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFt7IHByb3ZpZGU6IE1hdFBhZ2luYXRvckludGwsIHVzZUNsYXNzOiBSdW5zUGFnaW5hdG9ySW50bCB9XSksIMm1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdLCBkZWNsczogMzEsIHZhcnM6IDE2LCBjb25zdHM6IFtbMSwgImZpbHRlci1yb3ciXSwgWzEsICJydW4tZmlsdGVyIl0sIFsic3ZnSWNvbiIsICJzZWFyY2hfMjRweCJdLCBbIm1hdElucHV0IiwgIiIsICJhdXRvY29tcGxldGUiLCAib2ZmIiwgInBsYWNlaG9sZGVyIiwgIkZpbHRlciBydW5zIChyZWdleCkiLCAzLCAia2V5dXAiXSwgWyJmaWx0ZXIiLCAiIl0sIFsxLCAidGFibGUtY29udGFpbmVyIl0sIFsibWF0LXRhYmxlIiwgIiIsICJtYXRTb3J0IiwgIiIsIDMsICJkYXRhU291cmNlIiwgIm1hdFNvcnRBY3RpdmUiLCAibWF0U29ydERpcmVjdGlvbiIsICJ0cmFja0J5IiwgIm1hdFNvcnRDaGFuZ2UiXSwgWyJtYXRDb2x1bW5EZWYiLCAiY2hlY2tib3giXSwgWyJtYXQtaGVhZGVyLWNlbGwiLCAiIiwgNCwgIm1hdEhlYWRlckNlbGxEZWYiXSwgWyJtYXQtY2VsbCIsICIiLCA0LCAibWF0Q2VsbERlZiJdLCBbIm1hdENvbHVtbkRlZiIsICJleHBlcmltZW50X25hbWUiXSwgWyJtYXQtaGVhZGVyLWNlbGwiLCAiIiwgIm1hdC1zb3J0LWhlYWRlciIsICIiLCAiY2xhc3MiLCAibmFtZSIsIDQsICJtYXRIZWFkZXJDZWxsRGVmIl0sIFsibWF0LWNlbGwiLCAiIiwgImNsYXNzIiwgIm5hbWUiLCA0LCAibWF0Q2VsbERlZiJdLCBbIm1hdENvbHVtbkRlZiIsICJydW5fbmFtZSJdLCBbIm1hdENvbHVtbkRlZiIsICJydW5fY29sb3IiXSwgWyJtYXRDb2x1bW5EZWYiLCAic2VsZWN0X2FsbCJdLCBbMywgIm1hdENvbHVtbkRlZiIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIiwgIm5nRm9yVHJhY2tCeSJdLCBbImNsYXNzIiwgImNvbHVtbnMiLCAibWF0LWhlYWRlci1yb3ciLCAiIiwgNCwgIm1hdEhlYWRlclJvd0RlZiJdLCBbIm1hdC1oZWFkZXItcm93IiwgIiIsIDMsICJuZ0NsYXNzIiwgNCwgIm1hdEhlYWRlclJvd0RlZiJdLCBbIm1hdC1yb3ciLCAiIiwgNCwgIm1hdFJvd0RlZiIsICJtYXRSb3dEZWZDb2x1bW5zIl0sIFsiY2xhc3MiLCAibG9hZGluZyIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAibm8tcnVucyIsIDQsICJuZ0lmIl0sIFsic2hvd0ZpcnN0TGFzdEJ1dHRvbnMiLCAiIiwgMywgInBhZ2VTaXplT3B0aW9ucyIsICJwYWdlSW5kZXgiLCAicGFnZVNpemUiLCAibGVuZ3RoIiwgInBhZ2UiLCA0LCAibmdJZiJdLCBbIm1hdC1oZWFkZXItY2VsbCIsICIiXSwgWzMsICJjaGVja2VkIiwgImluZGV0ZXJtaW5hdGUiLCAiY2hhbmdlIl0sIFsibWF0LWNlbGwiLCAiIl0sIFszLCAiY2hlY2tlZCIsICJjaGFuZ2UiXSwgWyJtYXQtaGVhZGVyLWNlbGwiLCAiIiwgIm1hdC1zb3J0LWhlYWRlciIsICIiLCAxLCAibmFtZSJdLCBbIm1hdC1jZWxsIiwgIiIsIDEsICJuYW1lIl0sIFszLCAibmdDbGFzcyIsICJjb2xvclBpY2tlciIsICJjcERpYWxvZ0Rpc3BsYXkiLCAiY3BQb3NpdGlvbiIsICJjcFBvc2l0aW9uT2Zmc2V0IiwgImNwVXNlUm9vdFZpZXdDb250YWluZXIiLCAiY3BPdXRwdXRGb3JtYXQiLCAiY29sb3JQaWNrZXJDaGFuZ2UiXSwgWyJjbGFzcyIsICJzZWxlY3QtYWxsLWNvbnRlbnQiLCA0LCAibmdJZiJdLCBbMSwgInNlbGVjdC1hbGwtY29udGVudCJdLCBbIm1hdC1idXR0b24iLCAiIiwgMywgImNsaWNrIl0sIFszLCAibWF0Q29sdW1uRGVmIl0sIFsxLCAibmFtZSJdLCBbNCwgIm5nSWYiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMywgIm1hdE1lbnVUcmlnZ2VyRm9yIl0sIFsic3ZnSWNvbiIsICJmaWx0ZXJfYWx0XzI0cHgiXSwgWyJmaWx0ZXJNZW51IiwgIm1hdE1lbnUiXSwgWyJtYXQtbWVudS1pdGVtIiwgIiIsICJyb2xlIiwgIm1lbnVpdGVtY2hlY2tib3giLCAiZGlzYWJsZVJpcHBsZSIsICIiLCAzLCAiY2xpY2siXSwgWyJkaXNhYmxlUmlwcGxlIiwgIiIsICJtYXQtbWVudS1pdGVtIiwgIiIsIDEsICJyYW5nZS1pbnB1dC1jb250YWluZXIiLCAzLCAiY2xpY2siXSwgWzMsICJtaW4iLCAibWF4IiwgImxvd2VyVmFsdWUiLCAidXBwZXJWYWx1ZSIsICJ2YWx1ZSJdLCBbIm1hdC1tZW51LWl0ZW0iLCAiIiwgInJvbGUiLCAibWVudWl0ZW1jaGVja2JveCIsIDMsICJjbGljayIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsibWF0LW1lbnUtaXRlbSIsICIiLCAicm9sZSIsICJtZW51aXRlbWNoZWNrYm94IiwgMywgImNsaWNrIl0sIFsibWF0LWhlYWRlci1yb3ciLCAiIiwgMSwgImNvbHVtbnMiXSwgWyJtYXQtaGVhZGVyLXJvdyIsICIiLCAzLCAibmdDbGFzcyJdLCBbIm1hdC1yb3ciLCAiIl0sIFsxLCAibG9hZGluZyJdLCBbIm1vZGUiLCAiaW5kZXRlcm1pbmF0ZSIsICJkaWFtZXRlciIsICIyOCJdLCBbMSwgIm5vLXJ1bnMiXSwgWyJzaG93Rmlyc3RMYXN0QnV0dG9ucyIsICIiLCAzLCAicGFnZVNpemVPcHRpb25zIiwgInBhZ2VJbmRleCIsICJwYWdlU2l6ZSIsICJsZW5ndGgiLCAicGFnZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgyLCAibWF0LWljb24iLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiaW5wdXQiLCAzLCA0KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJrZXl1cCIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbXBvbmVudF9UZW1wbGF0ZV9pbnB1dF9rZXl1cF8zX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uRmlsdGVyS2V5VXAoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJ0YWJsZSIsIDYpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm1hdFNvcnRDaGFuZ2UiLCBmdW5jdGlvbiBSdW5zVGFibGVDb21wb25lbnRfVGVtcGxhdGVfdGFibGVfbWF0U29ydENoYW5nZV82X2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LmhhbmRsZVNvcnRDaGFuZ2UoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoNywgNyk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg4LCBSdW5zVGFibGVDb21wb25lbnRfdGhfOF9UZW1wbGF0ZSwgMiwgMiwgInRoIiwgOCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg5LCBSdW5zVGFibGVDb21wb25lbnRfdGRfOV9UZW1wbGF0ZSwgMiwgMSwgInRkIiwgOSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMTAsIDEwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDExLCBSdW5zVGFibGVDb21wb25lbnRfdGhfMTFfVGVtcGxhdGUsIDIsIDAsICJ0aCIsIDExKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEyLCBSdW5zVGFibGVDb21wb25lbnRfdGRfMTJfVGVtcGxhdGUsIDMsIDIsICJ0ZCIsIDEyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgxMywgMTMpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMTQsIFJ1bnNUYWJsZUNvbXBvbmVudF90aF8xNF9UZW1wbGF0ZSwgMiwgMCwgInRoIiwgMTEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMTUsIFJ1bnNUYWJsZUNvbXBvbmVudF90ZF8xNV9UZW1wbGF0ZSwgMiwgMSwgInRkIiwgMTIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDE2LCAxNCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxNywgUnVuc1RhYmxlQ29tcG9uZW50X3RoXzE3X1RlbXBsYXRlLCAxLCAwLCAidGgiLCA4KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDE4LCBSdW5zVGFibGVDb21wb25lbnRfdGRfMThfVGVtcGxhdGUsIDIsIDExLCAidGQiLCA5KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgxOSwgMTUpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMjAsIFJ1bnNUYWJsZUNvbXBvbmVudF90aF8yMF9UZW1wbGF0ZSwgMiwgMiwgInRoIiwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyMSwgUnVuc1RhYmxlQ29tcG9uZW50X25nX2NvbnRhaW5lcl8yMV9UZW1wbGF0ZSwgMywgMSwgIm5nLWNvbnRhaW5lciIsIDE2KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIyLCBSdW5zVGFibGVDb21wb25lbnRfbmdfY29udGFpbmVyXzIyX1RlbXBsYXRlLCAzLCAxLCAibmctY29udGFpbmVyIiwgMTYpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMjMsIFJ1bnNUYWJsZUNvbXBvbmVudF90cl8yM19UZW1wbGF0ZSwgMSwgMCwgInRyIiwgMTcpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMjQsIFJ1bnNUYWJsZUNvbXBvbmVudF90cl8yNF9UZW1wbGF0ZSwgMSwgMywgInRyIiwgMTgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMjUsIFJ1bnNUYWJsZUNvbXBvbmVudF90cl8yNV9UZW1wbGF0ZSwgMSwgMSwgInRyIiwgMTkpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgyNiwgInRyIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyNywgUnVuc1RhYmxlQ29tcG9uZW50X2Rpdl8yN19UZW1wbGF0ZSwgMiwgMCwgImRpdiIsIDIwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDI4LCBSdW5zVGFibGVDb21wb25lbnRfZGl2XzI4X1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgMjEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMjksIFJ1bnNUYWJsZUNvbXBvbmVudF9kaXZfMjlfVGVtcGxhdGUsIDYsIDEsICJkaXYiLCAyMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgzMCwgUnVuc1RhYmxlQ29tcG9uZW50X21hdF9wYWdpbmF0b3JfMzBfVGVtcGxhdGUsIDEsIDUsICJtYXQtcGFnaW5hdG9yIiwgMjIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSg2KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJkYXRhU291cmNlIiwgY3R4LmRhdGFTb3VyY2UpKCJtYXRTb3J0QWN0aXZlIiwgY3R4LnNvcnRPcHRpb24uY29sdW1uKSgibWF0U29ydERpcmVjdGlvbiIsIGN0eC5zb3J0T3B0aW9uLmRpcmVjdGlvbikoInRyYWNrQnkiLCBjdHgudGFibGVUcmFja0J5KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMTUpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguaHBhcmFtQ29sdW1ucykoIm5nRm9yVHJhY2tCeSIsIGN0eC50cmFja0J5SHBhcmFtQ29sdW1uKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5tZXRyaWNDb2x1bW5zKSgibmdGb3JUcmFja0J5IiwgY3R4LnRyYWNrQnlNZXRyaWNDb2x1bW4pOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJtYXRIZWFkZXJSb3dEZWYiLCBjdHguZ2V0Q29sdW1uSWRzKCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJtYXRIZWFkZXJSb3dEZWYiLCDJtcm1cHVyZUZ1bmN0aW9uMCgxNSwgX2M0JDIpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0Um93RGVmQ29sdW1ucyIsIGN0eC5nZXRDb2x1bW5JZHMoKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgubG9hZGluZyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4LmxvYWRpbmcgJiYgY3R4LmFsbEl0ZW1zTGVuZ3RoID09PSAwKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFjdHgubG9hZGluZyAmJiBjdHguYWxsSXRlbXNMZW5ndGggPiAwICYmIGN0eC5maWx0ZXJlZEl0ZW1zTGVuZ3RoID09PSAwKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC51c2VQYWdpbmF0aW9uKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRJY29uLCBNYXRJbnB1dCwgTWF0VGFibGUsIE1hdFNvcnQsIE1hdENvbHVtbkRlZiwgTWF0SGVhZGVyQ2VsbERlZiwgTWF0Q2VsbERlZiwgTmdGb3JPZiwgTWF0SGVhZGVyUm93RGVmLCBNYXRSb3dEZWYsIE5nSWYsIE1hdEhlYWRlckNlbGwsIE1hdENoZWNrYm94LCBNYXRDZWxsLCBNYXRTb3J0SGVhZGVyLCBOZ0NsYXNzLCBDb2xvclBpY2tlckRpcmVjdGl2ZSwgTWF0QnV0dG9uLCBNYXRNZW51VHJpZ2dlciwgX01hdE1lbnUsIE1hdE1lbnVJdGVtLCBSYW5nZUlucHV0Q29tcG9uZW50LCBNYXRIZWFkZXJSb3csIE1hdFJvdywgTWF0U3Bpbm5lciwgTWF0UGFnaW5hdG9yXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmJsb2NrO292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9LnRhYmxlLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29udGFpbjpsYXlvdXQgcGFpbnQ7bWF4LXdpZHRoOjEwMCU7b3ZlcmZsb3cteDphdXRvO3dpbGwtY2hhbmdlOnRyYW5zZm9ybX0uZmxleC1sYXlvdXRbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW59LmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSAgIC50YWJsZS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDA7b3ZlcmZsb3cteDpoaWRkZW47b3ZlcmZsb3cteTphdXRvfS5mbGV4LWxheW91dFtfbmdob3N0LSVDT01QJV0gICAudGFibGUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkLm5hbWVbX25nY29udGVudC0lQ09NUCVde3dvcmQtYnJlYWs6YnJlYWstd29yZDtvdmVyZmxvdy13cmFwOmJyZWFrLXdvcmR9LmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSAgIG1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkICNlYmViZWI7cGFkZGluZy1ib3R0b206MTJweH10YWJsZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJX10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV0sIHRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweDtwYWRkaW5nOjVweH10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV06bm90KC5uYW1lKSwgdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubmFtZSl7dGV4dC1hbGlnbjpjZW50ZXJ9dGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LW9mLXR5cGUsIHRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkW19uZ2NvbnRlbnQtJUNPTVAlXTpmaXJzdC1vZi10eXBle3BhZGRpbmctbGVmdDoyNHB4fXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LW9mLXR5cGUsIHRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRkW19uZ2NvbnRlbnQtJUNPTVAlXTpsYXN0LW9mLXR5cGV7cGFkZGluZy1yaWdodDoyNHB4fXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLnNlbGVjdC1hbGwpICAgdGhbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcH10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjQzcHh9LmxvYWRpbmdbX25nY29udGVudC0lQ09NUCVdLCAubm8tcnVuc1tfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlcjowO2JvcmRlci1ib3R0b20td2lkdGg6MXB4O2JvcmRlci1jb2xvcjojMDAwMDAwMWY7Ym9yZGVyLXN0eWxlOnNvbGlkO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6NDhweDtwYWRkaW5nOjAgMjRweH0ubG9hZGluZ1tfbmdjb250ZW50LSVDT01QJV17anVzdGlmeS1jb250ZW50OmNlbnRlcn0uc2VsZWN0LWFsbFtfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MTJweDtwYWRkaW5nLXRvcDoxMnB4fVtfbmdob3N0LSVDT01QJV0gICB0ci5zZWxlY3QtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLnNob3ctc2VsZWN0LWFsbCl7ZGlzcGxheTpub25lfS5zZWxlY3QtYWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAuc2VsZWN0LWFsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHg7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuNjt0ZXh0LWFsaWduOmxlZnR9LnNlbGVjdC1hbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICBidXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjUwMDtwYWRkaW5nOjAgNHB4fS5maWx0ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2hlaWdodDo0OHB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9LnJ1bi1maWx0ZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtjb2xvcjojMjEyMTIxO2ZvbnQtc2l6ZToxM3B4O2ZsZXg6MX0ucnVuLWZpbHRlcltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmbGV4Om5vbmU7bWFyZ2luLWxlZnQ6NXB4O21hcmdpbi1yaWdodDo1cHh9Lm1hdC1jb2x1bW4tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNvbHVtbi1ydW5fY29sb3JbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIwcHh9LnJ1bi1jb2xvci1zd2F0Y2hbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yYWRpdXM6MTAwJTtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtvdXRsaW5lOm5vbmV9LnJ1bi1jb2xvci1zd2F0Y2gubm8tY29sb3JbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYzZjYWQxO2JvcmRlci13aWR0aDoycHh9LnJhbmdlLWlucHV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OmF1dG99W19uZ2hvc3QtJUNPTVAlXSAgICAgbWF0LXBhZ2luYXRvciBtYXQtZm9ybS1maWVsZHttYXJnaW46MH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvdmlld3MvcnVuc190YWJsZS90eXBlcy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQGVudW0ge3N0cmluZ30gKi8KICAgIGNvbnN0IFJ1bnNUYWJsZUNvbHVtbiA9IHsKICAgICAgICBDSEVDS0JPWDogImNoZWNrYm94IiwKICAgICAgICBSVU5fTkFNRTogInJ1bl9uYW1lIiwKICAgICAgICBFWFBFUklNRU5UX05BTUU6ICJleHBlcmltZW50X25hbWUiLAogICAgICAgIFJVTl9DT0xPUjogInJ1bl9jb2xvciIsCiAgICB9OwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvdmlld3MvcnVuc190YWJsZS9ydW5zX3RhYmxlX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRSdW5zTG9hZGluZyA9IGNyZWF0ZVNlbGVjdG9yKGdldFJ1bnNMb2FkU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gbG9hZFN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAobG9hZFN0YXRlKSA9PiBsb2FkU3RhdGUuc3RhdGUgPT09IERhdGFMb2FkU3RhdGUuTE9BRElORykpOwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGl0ZW0KICAgICAqIEBwYXJhbSB7P30gc29ydENvbHVtbgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0UHJvcHNGb3JTb3J0KGl0ZW0sIHNvcnRDb2x1bW4pIHsKICAgICAgICBzd2l0Y2ggKHNvcnRDb2x1bW4pIHsKICAgICAgICAgICAgY2FzZSBSdW5zVGFibGVDb2x1bW4uRVhQRVJJTUVOVF9OQU1FOgogICAgICAgICAgICAgICAgcmV0dXJuIFtpdGVtLmV4cGVyaW1lbnRBbGlhcywgaXRlbS5ydW4ubmFtZSwgaXRlbS5ydW4uaWRdOwogICAgICAgICAgICBjYXNlIFJ1bnNUYWJsZUNvbHVtbi5SVU5fTkFNRToKICAgICAgICAgICAgICAgIHJldHVybiBbaXRlbS5ydW4ubmFtZSwgaXRlbS5leHBlcmltZW50QWxpYXMsIGl0ZW0ucnVuLmlkXTsKICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm90IHlldCBpbXBsZW1lbnRlZDogJHtzb3J0Q29sdW1ufWApOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBpdGVtcwogICAgICogQHBhcmFtIHs/fSBzb3J0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzb3J0UnVuVGFibGVJdGVtcyhpdGVtcywgc29ydCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzb3J0ZWRJdGVtcyA9IFsuLi5pdGVtc107CiAgICAgICAgaWYgKCFzb3J0LmNvbHVtbiB8fCBzb3J0LmRpcmVjdGlvbiA9PT0gU29ydERpcmVjdGlvbi5VTlNFVCkgewogICAgICAgICAgICByZXR1cm4gc29ydGVkSXRlbXM7CiAgICAgICAgfQogICAgICAgIHNvcnRlZEl0ZW1zLnNvcnQoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYQogICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGEsIGIpID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBhUHJvcHMgPSBnZXRQcm9wc0ZvclNvcnQoYSwgKC8qKiBAdHlwZSB7P30gKi8gKHNvcnQuY29sdW1uKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJQcm9wcyA9IGdldFByb3BzRm9yU29ydChiLCAoLyoqIEB0eXBlIHs/fSAqLyAoc29ydC5jb2x1bW4pKSk7CiAgICAgICAgICAgIGlmIChhUHJvcHMubGVuZ3RoICE9PSBiUHJvcHMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFyaWFudCBlcnJvcjogYSBnaXZlbiBzb3J0IHNob3VsZCByZXN1bHQgaW4gc2FtZSBudW1iZXIgb2YgJyArCiAgICAgICAgICAgICAgICAgICAgYGl0ZW1zOiAke3NvcnR9YCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGFQcm9wcy5sZW5ndGg7IGluZGV4KyspIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHZhbEEgPSBhUHJvcHNbaW5kZXhdOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgdmFsQiA9IGJQcm9wc1tpbmRleF07CiAgICAgICAgICAgICAgICBpZiAodmFsQSA9PT0gdmFsQikgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB2YWxBICE9PSB0eXBlb2YgdmFsQikgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2Fubm90IGNvbXBhcmUgdmFsdWVzIG9mIGRpZmZlcmVudCB0eXBlczogYCArCiAgICAgICAgICAgICAgICAgICAgICAgIGAke3R5cGVvZiB2YWxBfSB2cy4gJHt0eXBlb2YgdmFsQn1gKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB2YWxBIDwgdmFsQiA9PT0gKHNvcnQuZGlyZWN0aW9uID09PSBTb3J0RGlyZWN0aW9uLkFTQykgPyAtMSA6IDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBzb3J0ZWRJdGVtczsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBmaWx0ZXIKICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hdGNoRmlsdGVyKGZpbHRlciwgdmFsdWUpIHsKICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICByZXR1cm4gZmlsdGVyLmluY2x1ZGVVbmRlZmluZWQ7CiAgICAgICAgfQogICAgICAgIGlmIChmaWx0ZXIudHlwZSA9PT0gRG9tYWluVHlwZS5ESVNDUkVURSkgewogICAgICAgICAgICAvLyAodXBjYXN0IHRvIHdvcmsgYXJvdW5kIGJhZCBUeXBlU2NyaXB0IGxpYmRlZnMpCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmFsdWVzID0gZmlsdGVyLmZpbHRlclZhbHVlczsKICAgICAgICAgICAgcmV0dXJuIHZhbHVlcy5pbmNsdWRlcyh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKGZpbHRlci50eXBlID09PSBEb21haW5UeXBlLklOVEVSVkFMKSB7CiAgICAgICAgICAgIHJldHVybiBmaWx0ZXIuZmlsdGVyTG93ZXJWYWx1ZSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBmaWx0ZXIuZmlsdGVyVXBwZXJWYWx1ZTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgfQogICAgLyoqCiAgICAgKiBSZW5kZXJzIGxpc3Qgb2YgZXhwZXJpbWVudHMuCiAgICAgKgogICAgICogTm90ZTogYWxsIFxASW5wdXRzIGFyZSByZWFkIG9uY2UgdXBvbiBpbml0aWFsaXphdGlvbi4gVGhpcyBjb21wb25lbnQgZG9lcyBub3QKICAgICAqIHVwZGF0ZSB3aGVuIGlucHV0IGJpbmRpbmdzIGNoYW5nZS4KICAgICAqLwogICAgY2xhc3MgUnVuc1RhYmxlQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmxvYWRpbmckID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5ocGFyYW1Db2x1bW5zJCA9IG9mKFtdKTsKICAgICAgICAgICAgdGhpcy5tZXRyaWNDb2x1bW5zJCA9IG9mKFtdKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVuYWJsZXMgYSBsYXlvdXQgbW9kZSBpbnRlbmRlZCBmb3Igc2NlbmFyaW9zIHdoZW4gY2hhbmdpbmcgdGhlICMgb2YgcnVucwogICAgICAgICAgICAgKiBzaG91bGQgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIHRhYmxlJ3Mgc2l6ZS4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogLSBoZWlnaHQgYW5kIHdpZHRoIHNwYW4gdGhlIGNvbnRhaW5lciBoZWlnaHQgYW5kIHdpZHRoCiAgICAgICAgICAgICAqIC0gcnVuIGxpc3Qgc2Nyb2xscyB2ZXJ0aWNhbGx5LCBub3QgaG9yaXpvbnRhbGx5CiAgICAgICAgICAgICAqIC0gJ25hbWUnIGNlbGxzIHdyYXAgdGV4dAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy51c2VGbGV4aWJsZUxheW91dCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0byB1c2UgcGFnaW5hdGlvbiBvcHRpb25zIGZyb20gdGhlIHN0b3JlLiBJZiBmYWxzZSwgdGhlIHRhYmxlIHdpbGwKICAgICAgICAgICAgICogc2hvdyBhIHNpbmdsZSBwYWdlIHdpdGggYWxsIHJ1bnMuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLnVzZVBhZ2luYXRpb24gPSBmYWxzZTsKICAgICAgICAgICAgLy8gQ29sdW1uIHRvIGRpc2FibGUgaW4gdGhlIHRhYmxlLiBUaGUgY29sdW1ucyBhcmUgcmVuZGVyZWQgaW4gdGhlIG9yZGVyIGFzCiAgICAgICAgICAgIC8vIGRlZmluZWQgYnkgdGhpcyBpbnB1dC4KICAgICAgICAgICAgdGhpcy5jb2x1bW5zID0gW1J1bnNUYWJsZUNvbHVtbi5SVU5fTkFNRV07CiAgICAgICAgICAgIHRoaXMuc2hvd0hwYXJhbXNBbmRNZXRyaWNzID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc29ydE9wdGlvbiQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5TZWxlY3RvclNvcnQpOwogICAgICAgICAgICB0aGlzLnBhZ2luYXRpb25PcHRpb24kID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVuU2VsZWN0b3JQYWdpbmF0aW9uT3B0aW9uKTsKICAgICAgICAgICAgdGhpcy5yZWdleEZpbHRlciQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5TZWxlY3RvclJlZ2V4RmlsdGVyKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpc0V4cGVyaW1lbnROYW1lVmlzaWJsZSgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sdW1ucy5zb21lKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjb2x1bW4KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjb2x1bW4pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4gPT09IFJ1bnNUYWJsZUNvbHVtbi5FWFBFUklNRU5UX05BTUU7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBnZXRSdW5UYWJsZUl0ZW1zUGVyRXhwZXJpbWVudCA9IHRoaXMuZXhwZXJpbWVudElkcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaWQpID0+IHRoaXMuZ2V0UnVuVGFibGVJdGVtc0ZvckV4cGVyaW1lbnQoaWQpKSk7CiAgICAgICAgICAgIHRoaXMuYWxsVW5zb3J0ZWRSdW5UYWJsZUl0ZW1zJCA9IGNvbWJpbmVMYXRlc3QoZ2V0UnVuVGFibGVJdGVtc1BlckV4cGVyaW1lbnQpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtc0ZvckV4cGVyaW1lbnRzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaXRlbXNGb3JFeHBlcmltZW50cykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgaXRlbXMgPSAoLyoqIEB0eXBlIHs/fSAqLyAoW10pKTsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcy5jb25jYXQoLi4uaXRlbXNGb3JFeHBlcmltZW50cyk7CiAgICAgICAgICAgIH0pKSwgc2hhcmVSZXBsYXkoMSkpOwogICAgICAgICAgICB0aGlzLmFsbEl0ZW1zTGVuZ3RoJCA9IHRoaXMuYWxsVW5zb3J0ZWRSdW5UYWJsZUl0ZW1zJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbXMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpdGVtcykgPT4gaXRlbXMubGVuZ3RoKSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGdldEZpbHRlcmVkSXRlbXMkID0gdGhpcy5nZXRGaWx0ZXJlZEl0ZW1zJCh0aGlzLmFsbFVuc29ydGVkUnVuVGFibGVJdGVtcyQpLnBpcGUoc2hhcmVSZXBsYXkoMSkpOwogICAgICAgICAgICB0aGlzLmZpbHRlcmVkSXRlbXNMZW5ndGgkID0gZ2V0RmlsdGVyZWRJdGVtcyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGl0ZW1zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaXRlbXMpID0+IGl0ZW1zLmxlbmd0aCkpKTsKICAgICAgICAgICAgdGhpcy5wYWdlSXRlbXMkID0gdGhpcy5zb3J0ZWRBbmRTbGljZWRJdGVtcyQoZ2V0RmlsdGVyZWRJdGVtcyQpOwogICAgICAgICAgICB0aGlzLm51bVNlbGVjdGVkSXRlbXMkID0gdGhpcy5hbGxVbnNvcnRlZFJ1blRhYmxlSXRlbXMkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGl0ZW1zKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMucmVkdWNlKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY291bnQKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGNvdW50LCBpdGVtKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvdW50ICsgTnVtYmVyKGl0ZW0uc2VsZWN0ZWQpOwogICAgICAgICAgICAgICAgfSksIDApOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGdldFJ1bnNMb2FkaW5nUGVyRXhwZXJpbWVudCA9IHRoaXMuZXhwZXJpbWVudElkcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGlkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoaWQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5zTG9hZGluZywgeyBleHBlcmltZW50SWQ6IGlkIH0pOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMubG9hZGluZyQgPSBjb21iaW5lTGF0ZXN0KGdldFJ1bnNMb2FkaW5nUGVyRXhwZXJpbWVudCkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV4cGVyaW1lbnRzTG9hZGluZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV4cGVyaW1lbnRzTG9hZGluZykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGV4cGVyaW1lbnRzTG9hZGluZy5zb21lKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaXNMb2FkaW5nCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoaXNMb2FkaW5nKSA9PiBpc0xvYWRpbmcpKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0hwYXJhbXNBbmRNZXRyaWNzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBnZXRIcGFyYW1BbmRNZXRyaWNzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4cGVyaW1lbnRzSHBhcmFtc0FuZE1ldHJpY3MsIHsgZXhwZXJpbWVudElkczogdGhpcy5leHBlcmltZW50SWRzIH0pOwogICAgICAgICAgICAgICAgLy8gY29tYmluZUxhdGVzdCwgd2hlbiBpbml0aWFsaXppbmcsIGVtaXRzIHR3aWNlCiAgICAgICAgICAgICAgICB0aGlzLmhwYXJhbUNvbHVtbnMkID0gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVuSHBhcmFtRmlsdGVyTWFwKSwKICAgICAgICAgICAgICAgICAgICBnZXRIcGFyYW1BbmRNZXRyaWNzJCwKICAgICAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoW2ZpbHRlck1hcCwgeyBocGFyYW1zIH1dKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGhwYXJhbXMubWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKHsgbmFtZSwgZGlzcGxheU5hbWUsIGRvbWFpbiB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gZmlsdGVyTWFwLmdldChuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaWx0ZXIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKGBJbnZhcmlhbnQgZXJyb3I6IGEgZmlsdGVyIGZvciAke25hbWV9IG11c3QgZXhpc3RgICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgIHdoZW4gdGhlIGhwYXJhbSBleGlzdHNgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkaXNwbGF5TmFtZSwgbmFtZSwgZmlsdGVyIH07CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIHRoaXMubWV0cmljQ29sdW1ucyQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5NZXRyaWNGaWx0ZXJNYXApLAogICAgICAgICAgICAgICAgICAgIGdldEhwYXJhbUFuZE1ldHJpY3MkLAogICAgICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChbZmlsdGVyTWFwLCB7IG1ldHJpY3MgfV0pID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0cmljcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoeyB0YWcsIGRpc3BsYXlOYW1lIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmaWx0ZXIgPSBmaWx0ZXJNYXAuZ2V0KHRhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmlsdGVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcihgSW52YXJpYW50IGVycm9yOiBhIGZpbHRlciBmb3IgJHt0YWd9IG11c3QgZXhpc3QgYCArCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYHdoZW4gdGhlIG1ldHJpYyBleGlzdHNgKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBkaXNwbGF5TmFtZSwgdGFnLCBmaWx0ZXIgfTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocnVuVGFibGVTaG93bih7IGV4cGVyaW1lbnRJZHM6IHRoaXMuZXhwZXJpbWVudElkcyB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBydW5JdGVtcyQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEZpbHRlcmVkSXRlbXMkKHJ1bkl0ZW1zJCkgewogICAgICAgICAgICByZXR1cm4gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICBydW5JdGVtcyQsCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5TZWxlY3RvclJlZ2V4RmlsdGVyKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtpdGVtcywgcmVnZXhTdHJpbmddKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXJlZ2V4U3RyaW5nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHJlZ2V4ID0gbnVsbDsKICAgICAgICAgICAgICAgIC8vIERvIG5vdCBicmVhayBhbGwgdGhlIGZ1dHVyZSB1cGRhdGVzIGJlY2F1c2Ugb2YgbWFsZm9ybWVkCiAgICAgICAgICAgICAgICAvLyByZWdleFN0cmluZy4gVXNlciBjYW4gYmUgc3RpbGwgbW9kaWZ5aW5nIGl0LgogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZWdleCA9IHJlZ2V4U3RyaW5nID8gbmV3IFJlZ0V4cChyZWdleFN0cmluZykgOiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsgfQogICAgICAgICAgICAgICAgaWYgKCFyZWdleCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHNob3VsZEluY2x1ZGVFeHBlcmltZW50TmFtZSA9IHRoaXMuY29sdW1ucy5pbmNsdWRlcyhSdW5zVGFibGVDb2x1bW4uRVhQRVJJTUVOVF9OQU1FKTsKICAgICAgICAgICAgICAgIHJldHVybiBpdGVtcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpdGVtCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoaXRlbSkgPT4gewogICAgICAgICAgICAgICAgICAgIGlmICghc2hvdWxkSW5jbHVkZUV4cGVyaW1lbnROYW1lKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAocmVnZXgpKS50ZXN0KGl0ZW0ucnVuLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovIChyZWdleCkpLnRlc3QoaXRlbS5ydW4ubmFtZSkgfHwgKC8qKiBAdHlwZSB7P30gKi8gKHJlZ2V4KSkudGVzdChpdGVtLmV4cGVyaW1lbnRBbGlhcykpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSksIGNvbWJpbmVMYXRlc3RXaXRoKHRoaXMuc3RvcmUuc2VsZWN0KGdldFJ1bkhwYXJhbUZpbHRlck1hcCksIHRoaXMuc3RvcmUuc2VsZWN0KGdldFJ1bk1ldHJpY0ZpbHRlck1hcCkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtpdGVtcywgaHBhcmFtRmlsdGVycywgbWV0cmljRmlsdGVyc10pID0+IHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy5zaG93SHBhcmFtc0FuZE1ldHJpY3MpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXM7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoeyBocGFyYW1zLCBtZXRyaWNzIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgaHBhcmFtTWF0Y2hlcyA9IFsuLi5ocGFyYW1GaWx0ZXJzLmVudHJpZXMoKV0uZXZlcnkoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoW2hwYXJhbU5hbWUsIGZpbHRlcl0pID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IGhwYXJhbXMuZ2V0KGhwYXJhbU5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hGaWx0ZXIoZmlsdGVyLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAoaHBhcmFtTWF0Y2hlcyAmJgogICAgICAgICAgICAgICAgICAgICAgICBbLi4ubWV0cmljRmlsdGVycy5lbnRyaWVzKCldLmV2ZXJ5KCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgIChbbWV0cmljVGFnLCBmaWx0ZXJdKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2YWx1ZSA9IG1ldHJpY3MuZ2V0KG1ldHJpY1RhZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWF0Y2hGaWx0ZXIoZmlsdGVyLCB2YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBmaWx0ZXJlZEl0ZW1zJAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc29ydGVkQW5kU2xpY2VkSXRlbXMkKGZpbHRlcmVkSXRlbXMkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc29ydGVkSXRlbXMgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIGZpbHRlcmVkSXRlbXMkLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVuU2VsZWN0b3JTb3J0KSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtpdGVtcywgc29ydF0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9ICgvKiogQHR5cGUgez99ICovIChzb3J0LmNvbHVtbikpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZGlyZWN0aW9uID0gc29ydC5kaXJlY3Rpb247CiAgICAgICAgICAgICAgICByZXR1cm4gc29ydFJ1blRhYmxlSXRlbXMoaXRlbXMsIHsgY29sdW1uLCBkaXJlY3Rpb24gfSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2xpY2VkSXRlbXMgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHNvcnRlZEl0ZW1zLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVuU2VsZWN0b3JQYWdpbmF0aW9uT3B0aW9uKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtpdGVtcywgcGFnaW5hdGlvbk9wdGlvbl0pID0+IHsKICAgICAgICAgICAgICAgIGlmICghdGhpcy51c2VQYWdpbmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjb25zdCB7IHBhZ2VTaXplLCBwYWdlSW5kZXggfSA9IHBhZ2luYXRpb25PcHRpb247CiAgICAgICAgICAgICAgICByZXR1cm4gaXRlbXMuc2xpY2UocGFnZUluZGV4ICogcGFnZVNpemUsIChwYWdlSW5kZXggKyAxKSAqIHBhZ2VTaXplKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgcmV0dXJuIHNsaWNlZEl0ZW1zOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXRSdW5UYWJsZUl0ZW1zRm9yRXhwZXJpbWVudChleHBlcmltZW50SWQpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVucywgeyBleHBlcmltZW50SWQgfSksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50LCB7IGV4cGVyaW1lbnRJZCB9KSwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldEN1cnJlbnRSb3V0ZVJ1blNlbGVjdGlvbiksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5Db2xvck1hcCksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50SWRUb0FsaWFzTWFwKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtydW5zLCBleHBlcmltZW50LCBzZWxlY3Rpb25NYXAsIGNvbG9yTWFwLCBleHBlcmltZW50SWRUb0FsaWFzXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGhwYXJhbU1hcCA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAocnVuLmhwYXJhbXMgfHwgW10pLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaHBhcmFtCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoaHBhcmFtKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhwYXJhbU1hcC5zZXQoaHBhcmFtLm5hbWUsIGhwYXJhbS52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRyaWNNYXAgPSBuZXcgTWFwKCk7CiAgICAgICAgICAgICAgICAgICAgKHJ1bi5tZXRyaWNzIHx8IFtdKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG1ldHJpYwogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKG1ldHJpYykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNNYXAuc2V0KG1ldHJpYy50YWcsIG1ldHJpYy52YWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1biwKICAgICAgICAgICAgICAgICAgICAgICAgZXhwZXJpbWVudE5hbWU6IChleHBlcmltZW50ID09PSBudWxsIHx8IGV4cGVyaW1lbnQgPT09IHZvaWQgMCA/IHZvaWQgMCA6IGV4cGVyaW1lbnQubmFtZSkgfHwgJycsCiAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVyaW1lbnRBbGlhczogZXhwZXJpbWVudElkVG9BbGlhc1tleHBlcmltZW50SWRdLAogICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZDogQm9vbGVhbihzZWxlY3Rpb25NYXAgJiYgc2VsZWN0aW9uTWFwLmdldChydW4uaWQpKSwKICAgICAgICAgICAgICAgICAgICAgICAgcnVuQ29sb3I6IGNvbG9yTWFwW3J1bi5pZF0sCiAgICAgICAgICAgICAgICAgICAgICAgIGhwYXJhbXM6IGhwYXJhbU1hcCwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljczogbWV0cmljTWFwLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXRlbQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25SdW5TZWxlY3Rpb25Ub2dnbGUoaXRlbSkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJ1blNlbGVjdGlvblRvZ2dsZWQoewogICAgICAgICAgICAgICAgZXhwZXJpbWVudElkczogdGhpcy5leHBlcmltZW50SWRzLAogICAgICAgICAgICAgICAgcnVuSWQ6IGl0ZW0ucnVuLmlkLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8vIFdoZW4gYHVzZVBhZ2luYXRpb25gIGlzIGZhbHNlLCBwYWdlIHNlbGVjdGlvbiBhZmZlY3RzIHRoZSBzaW5nbGUgcGFnZSwKICAgICAgICAvLyBjb250YWluaW5nIGFsbCBpdGVtcy4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblBhZ2VTZWxlY3Rpb25Ub2dnbGUoZXZlbnQpIHsKICAgICAgICAgICAgY29uc3QgeyBpdGVtcyB9ID0gZXZlbnQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVuSWRzID0gaXRlbXMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IHJ1biB9KSA9PiBydW4uaWQpKTsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChydW5QYWdlU2VsZWN0aW9uVG9nZ2xlZCh7CiAgICAgICAgICAgICAgICBleHBlcmltZW50SWRzOiB0aGlzLmV4cGVyaW1lbnRJZHMsCiAgICAgICAgICAgICAgICBydW5JZHMsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblNlbGVjdEFsbFBhZ2VzKCkgewogICAgICAgICAgICBpZiAoIXRoaXMudXNlUGFnaW5hdGlvbikgewogICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTZWxlY3QgYWxsIGV2ZW50cyBjYW5ub3QgYmUgZGlzcGF0Y2hlZCB3aGVuIHBhZ2luYXRpb24gaXMgZGlzYWJsZWQnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJ1bnNTZWxlY3RBbGwoeyBleHBlcmltZW50SWRzOiB0aGlzLmV4cGVyaW1lbnRJZHMgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblBhZ2luYXRpb25DaGFuZ2UoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLnVzZVBhZ2luYXRpb24pIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignUGFnaW5hdGlvbiBldmVudHMgY2Fubm90IGJlIGRpc3BhdGNoZWQgd2hlbiBwYWdpbmF0aW9uIGlzIGRpc2FibGVkJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgeyBwYWdlSW5kZXgsIHBhZ2VTaXplIH0gPSBldmVudDsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChydW5TZWxlY3RvclBhZ2luYXRpb25PcHRpb25DaGFuZ2VkKHsgcGFnZUluZGV4LCBwYWdlU2l6ZSB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc29ydAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Tb3J0Q2hhbmdlKHNvcnQpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChydW5TZWxlY3RvclNvcnRDaGFuZ2VkKHNvcnQpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSByZWdleFN0cmluZwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25SZWdleEZpbHRlckNoYW5nZShyZWdleFN0cmluZykgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJ1blNlbGVjdG9yUmVnZXhGaWx0ZXJDaGFuZ2VkKHsgcmVnZXhTdHJpbmcgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25SdW5Db2xvckNoYW5nZSh7IHJ1bklkLCBuZXdDb2xvciB9KSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocnVuQ29sb3JDaGFuZ2VkKHsgcnVuSWQsIG5ld0NvbG9yIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQoZXZlbnQpIHsKICAgICAgICAgICAgY29uc3QgeyBocGFyYW1OYW1lLCBmaWx0ZXJWYWx1ZXMsIGluY2x1ZGVVbmRlZmluZWQgfSA9IGV2ZW50OwogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJ1bkRpc2NyZXRlSHBhcmFtRmlsdGVyQ2hhbmdlZCh7CiAgICAgICAgICAgICAgICBocGFyYW1OYW1lLAogICAgICAgICAgICAgICAgZmlsdGVyVmFsdWVzLAogICAgICAgICAgICAgICAgaW5jbHVkZVVuZGVmaW5lZCwKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZChldmVudCkgewogICAgICAgICAgICBjb25zdCB7IG5hbWUsIGZpbHRlckxvd2VyVmFsdWUsIGZpbHRlclVwcGVyVmFsdWUsIGluY2x1ZGVVbmRlZmluZWQgfSA9IGV2ZW50OwogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJ1bkludGVydmFsSHBhcmFtRmlsdGVyQ2hhbmdlZCh7CiAgICAgICAgICAgICAgICBocGFyYW1OYW1lOiBuYW1lLAogICAgICAgICAgICAgICAgZmlsdGVyTG93ZXJWYWx1ZSwKICAgICAgICAgICAgICAgIGZpbHRlclVwcGVyVmFsdWUsCiAgICAgICAgICAgICAgICBpbmNsdWRlVW5kZWZpbmVkLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uTWV0cmljRmlsdGVyQ2hhbmdlZChldmVudCkgewogICAgICAgICAgICBjb25zdCB7IG5hbWUsIGluY2x1ZGVVbmRlZmluZWQsIGZpbHRlckxvd2VyVmFsdWUsIGZpbHRlclVwcGVyVmFsdWUgfSA9IGV2ZW50OwogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHJ1bk1ldHJpY0ZpbHRlckNoYW5nZWQoewogICAgICAgICAgICAgICAgbWV0cmljVGFnOiBuYW1lLAogICAgICAgICAgICAgICAgaW5jbHVkZVVuZGVmaW5lZCwKICAgICAgICAgICAgICAgIGZpbHRlckxvd2VyVmFsdWUsCiAgICAgICAgICAgICAgICBmaWx0ZXJVcHBlclZhbHVlLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgfQogICAgUnVuc1RhYmxlQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdydW5zLXRhYmxlJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHJ1bnMtdGFibGUtY29tcG9uZW50CiAgICAgIFt1c2VGbGV4aWJsZUxheW91dF09InVzZUZsZXhpYmxlTGF5b3V0IgogICAgICBbbnVtU2VsZWN0ZWRJdGVtc109Im51bVNlbGVjdGVkSXRlbXMkIHwgYXN5bmMiCiAgICAgIFtjb2x1bW5zXT0iY29sdW1ucyIKICAgICAgW2hwYXJhbUNvbHVtbnNdPSJocGFyYW1Db2x1bW5zJCB8IGFzeW5jIgogICAgICBbbWV0cmljQ29sdW1uc109Im1ldHJpY0NvbHVtbnMkIHwgYXN5bmMiCiAgICAgIFtzaG93RXhwZXJpbWVudE5hbWVdPSJpc0V4cGVyaW1lbnROYW1lVmlzaWJsZSgpIgogICAgICBbcGFnZUl0ZW1zXT0icGFnZUl0ZW1zJCB8IGFzeW5jIgogICAgICBbZmlsdGVyZWRJdGVtc0xlbmd0aF09ImZpbHRlcmVkSXRlbXNMZW5ndGgkIHwgYXN5bmMiCiAgICAgIFthbGxJdGVtc0xlbmd0aF09ImFsbEl0ZW1zTGVuZ3RoJCB8IGFzeW5jIgogICAgICBbbG9hZGluZ109ImxvYWRpbmckIHwgYXN5bmMiCiAgICAgIFtwYWdpbmF0aW9uT3B0aW9uXT0icGFnaW5hdGlvbk9wdGlvbiQgfCBhc3luYyIKICAgICAgW3JlZ2V4RmlsdGVyXT0icmVnZXhGaWx0ZXIkIHwgYXN5bmMiCiAgICAgIFtzb3J0T3B0aW9uXT0ic29ydE9wdGlvbiQgfCBhc3luYyIKICAgICAgW3VzZVBhZ2luYXRpb25dPSJ1c2VQYWdpbmF0aW9uIgogICAgICAob25TZWxlY3Rpb25Ub2dnbGUpPSJvblJ1blNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpIgogICAgICAob25QYWdlU2VsZWN0aW9uVG9nZ2xlKT0ib25QYWdlU2VsZWN0aW9uVG9nZ2xlKCRldmVudCkiCiAgICAgIChvblNlbGVjdEFsbFBhZ2VzKT0ib25TZWxlY3RBbGxQYWdlcygpIgogICAgICAob25QYWdpbmF0aW9uQ2hhbmdlKT0ib25QYWdpbmF0aW9uQ2hhbmdlKCRldmVudCkiCiAgICAgIChvblJlZ2V4RmlsdGVyQ2hhbmdlKT0ib25SZWdleEZpbHRlckNoYW5nZSgkZXZlbnQpIgogICAgICAob25Tb3J0Q2hhbmdlKT0ib25Tb3J0Q2hhbmdlKCRldmVudCkiCiAgICAgIChvblJ1bkNvbG9yQ2hhbmdlKT0ib25SdW5Db2xvckNoYW5nZSgkZXZlbnQpIgogICAgICAob25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQpPSJvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCgkZXZlbnQpIgogICAgICAob25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQpPSJvbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCgkZXZlbnQpIgogICAgICAob25NZXRyaWNGaWx0ZXJDaGFuZ2VkKT0ib25NZXRyaWNGaWx0ZXJDaGFuZ2VkKCRldmVudCkiCiAgICA+PC9ydW5zLXRhYmxlLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGhvc3Q6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ1tjbGFzcy5mbGV4LWxheW91dF0nOiAndXNlRmxleGlibGVMYXlvdXQnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgOmhvc3QuZmxleC1sYXlvdXQgewogICAgICAgIGRpc3BsYXk6IGZsZXg7CiAgICAgIH0KCiAgICAgIDpob3N0LmZsZXgtbGF5b3V0ID4gcnVucy10YWJsZS1jb21wb25lbnQgewogICAgICAgIHdpZHRoOiAxMDAlOwogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJ1bnNUYWJsZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBSdW5zVGFibGVDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdXNlRmxleGlibGVMYXlvdXQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHVzZVBhZ2luYXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGV4cGVyaW1lbnRJZHM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNob3dIcGFyYW1zQW5kTWV0cmljczogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1RhYmxlQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gUnVuc1RhYmxlQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNUYWJsZUNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJ1bnNUYWJsZUNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSdW5zVGFibGVDb250YWluZXIsIHNlbGVjdG9yczogW1sicnVucy10YWJsZSJdXSwgaG9zdFZhcnM6IDIsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gUnVuc1RhYmxlQ29udGFpbmVyX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgiZmxleC1sYXlvdXQiLCBjdHgudXNlRmxleGlibGVMYXlvdXQpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IHVzZUZsZXhpYmxlTGF5b3V0OiAidXNlRmxleGlibGVMYXlvdXQiLCB1c2VQYWdpbmF0aW9uOiAidXNlUGFnaW5hdGlvbiIsIGNvbHVtbnM6ICJjb2x1bW5zIiwgZXhwZXJpbWVudElkczogImV4cGVyaW1lbnRJZHMiLCBzaG93SHBhcmFtc0FuZE1ldHJpY3M6ICJzaG93SHBhcmFtc0FuZE1ldHJpY3MiIH0sIGRlY2xzOiAxMSwgdmFyczogMzQsIGNvbnN0czogW1szLCAidXNlRmxleGlibGVMYXlvdXQiLCAibnVtU2VsZWN0ZWRJdGVtcyIsICJjb2x1bW5zIiwgImhwYXJhbUNvbHVtbnMiLCAibWV0cmljQ29sdW1ucyIsICJzaG93RXhwZXJpbWVudE5hbWUiLCAicGFnZUl0ZW1zIiwgImZpbHRlcmVkSXRlbXNMZW5ndGgiLCAiYWxsSXRlbXNMZW5ndGgiLCAibG9hZGluZyIsICJwYWdpbmF0aW9uT3B0aW9uIiwgInJlZ2V4RmlsdGVyIiwgInNvcnRPcHRpb24iLCAidXNlUGFnaW5hdGlvbiIsICJvblNlbGVjdGlvblRvZ2dsZSIsICJvblBhZ2VTZWxlY3Rpb25Ub2dnbGUiLCAib25TZWxlY3RBbGxQYWdlcyIsICJvblBhZ2luYXRpb25DaGFuZ2UiLCAib25SZWdleEZpbHRlckNoYW5nZSIsICJvblNvcnRDaGFuZ2UiLCAib25SdW5Db2xvckNoYW5nZSIsICJvbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCIsICJvbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCIsICJvbk1ldHJpY0ZpbHRlckNoYW5nZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBSdW5zVGFibGVDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInJ1bnMtdGFibGUtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigib25TZWxlY3Rpb25Ub2dnbGUiLCBmdW5jdGlvbiBSdW5zVGFibGVDb250YWluZXJfVGVtcGxhdGVfcnVuc190YWJsZV9jb21wb25lbnRfb25TZWxlY3Rpb25Ub2dnbGVfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblJ1blNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpOyB9KSgib25QYWdlU2VsZWN0aW9uVG9nZ2xlIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29udGFpbmVyX1RlbXBsYXRlX3J1bnNfdGFibGVfY29tcG9uZW50X29uUGFnZVNlbGVjdGlvblRvZ2dsZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uUGFnZVNlbGVjdGlvblRvZ2dsZSgkZXZlbnQpOyB9KSgib25TZWxlY3RBbGxQYWdlcyIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbnRhaW5lcl9UZW1wbGF0ZV9ydW5zX3RhYmxlX2NvbXBvbmVudF9vblNlbGVjdEFsbFBhZ2VzXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25TZWxlY3RBbGxQYWdlcygpOyB9KSgib25QYWdpbmF0aW9uQ2hhbmdlIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29udGFpbmVyX1RlbXBsYXRlX3J1bnNfdGFibGVfY29tcG9uZW50X29uUGFnaW5hdGlvbkNoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uUGFnaW5hdGlvbkNoYW5nZSgkZXZlbnQpOyB9KSgib25SZWdleEZpbHRlckNoYW5nZSIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbnRhaW5lcl9UZW1wbGF0ZV9ydW5zX3RhYmxlX2NvbXBvbmVudF9vblJlZ2V4RmlsdGVyQ2hhbmdlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25SZWdleEZpbHRlckNoYW5nZSgkZXZlbnQpOyB9KSgib25Tb3J0Q2hhbmdlIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29udGFpbmVyX1RlbXBsYXRlX3J1bnNfdGFibGVfY29tcG9uZW50X29uU29ydENoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uU29ydENoYW5nZSgkZXZlbnQpOyB9KSgib25SdW5Db2xvckNoYW5nZSIsIGZ1bmN0aW9uIFJ1bnNUYWJsZUNvbnRhaW5lcl9UZW1wbGF0ZV9ydW5zX3RhYmxlX2NvbXBvbmVudF9vblJ1bkNvbG9yQ2hhbmdlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25SdW5Db2xvckNoYW5nZSgkZXZlbnQpOyB9KSgib25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWQiLCBmdW5jdGlvbiBSdW5zVGFibGVDb250YWluZXJfVGVtcGxhdGVfcnVuc190YWJsZV9jb21wb25lbnRfb25IcGFyYW1JbnRlcnZhbEZpbHRlckNoYW5nZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkhwYXJhbUludGVydmFsRmlsdGVyQ2hhbmdlZCgkZXZlbnQpOyB9KSgib25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWQiLCBmdW5jdGlvbiBSdW5zVGFibGVDb250YWluZXJfVGVtcGxhdGVfcnVuc190YWJsZV9jb21wb25lbnRfb25IcGFyYW1EaXNjcmV0ZUZpbHRlckNoYW5nZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkhwYXJhbURpc2NyZXRlRmlsdGVyQ2hhbmdlZCgkZXZlbnQpOyB9KSgib25NZXRyaWNGaWx0ZXJDaGFuZ2VkIiwgZnVuY3Rpb24gUnVuc1RhYmxlQ29udGFpbmVyX1RlbXBsYXRlX3J1bnNfdGFibGVfY29tcG9uZW50X29uTWV0cmljRmlsdGVyQ2hhbmdlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uTWV0cmljRmlsdGVyQ2hhbmdlZCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDUsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg2LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDgsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg5LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMTAsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInVzZUZsZXhpYmxlTGF5b3V0IiwgY3R4LnVzZUZsZXhpYmxlTGF5b3V0KSgibnVtU2VsZWN0ZWRJdGVtcyIsIMm1ybVwaXBlQmluZDEoMSwgMTQsIGN0eC5udW1TZWxlY3RlZEl0ZW1zJCkpKCJjb2x1bW5zIiwgY3R4LmNvbHVtbnMpKCJocGFyYW1Db2x1bW5zIiwgybXJtXBpcGVCaW5kMSgyLCAxNiwgY3R4LmhwYXJhbUNvbHVtbnMkKSkoIm1ldHJpY0NvbHVtbnMiLCDJtcm1cGlwZUJpbmQxKDMsIDE4LCBjdHgubWV0cmljQ29sdW1ucyQpKSgic2hvd0V4cGVyaW1lbnROYW1lIiwgY3R4LmlzRXhwZXJpbWVudE5hbWVWaXNpYmxlKCkpKCJwYWdlSXRlbXMiLCDJtcm1cGlwZUJpbmQxKDQsIDIwLCBjdHgucGFnZUl0ZW1zJCkpKCJmaWx0ZXJlZEl0ZW1zTGVuZ3RoIiwgybXJtXBpcGVCaW5kMSg1LCAyMiwgY3R4LmZpbHRlcmVkSXRlbXNMZW5ndGgkKSkoImFsbEl0ZW1zTGVuZ3RoIiwgybXJtXBpcGVCaW5kMSg2LCAyNCwgY3R4LmFsbEl0ZW1zTGVuZ3RoJCkpKCJsb2FkaW5nIiwgybXJtXBpcGVCaW5kMSg3LCAyNiwgY3R4LmxvYWRpbmckKSkoInBhZ2luYXRpb25PcHRpb24iLCDJtcm1cGlwZUJpbmQxKDgsIDI4LCBjdHgucGFnaW5hdGlvbk9wdGlvbiQpKSgicmVnZXhGaWx0ZXIiLCDJtcm1cGlwZUJpbmQxKDksIDMwLCBjdHgucmVnZXhGaWx0ZXIkKSkoInNvcnRPcHRpb24iLCDJtcm1cGlwZUJpbmQxKDEwLCAzMiwgY3R4LnNvcnRPcHRpb24kKSkoInVzZVBhZ2luYXRpb24iLCBjdHgudXNlUGFnaW5hdGlvbik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbUnVuc1RhYmxlQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBzdHlsZXM6IFsiLmZsZXgtbGF5b3V0W19uZ2hvc3QtJUNPTVAlXSB7XG4gICAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB9XG5cbiAgICAgIC5mbGV4LWxheW91dFtfbmdob3N0LSVDT01QJV0gICAgPiBydW5zLXRhYmxlLWNvbXBvbmVudFtfbmdjb250ZW50LSVDT01QJV0ge1xuICAgICAgICB3aWR0aDogMTAwJTtcbiAgICAgIH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKgogICAgICogQGZpbGVvdmVydmlldyBNb2R1bGUgZm9yIHJlbmRlcmluZyBsaXN0IG9mIHJ1bnMgZnJvbSBleHBlcmltZW50cyBpbiBhIHRhYmxlLgogICAgICoKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcnVucy92aWV3cy9ydW5zX3RhYmxlL3J1bnNfdGFibGVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJ1bnNUYWJsZU1vZHVsZSB7CiAgICB9CiAgICBSdW5zVGFibGVNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29sb3JQaWNrZXJNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SW5wdXRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdE1lbnVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdFBhZ2luYXRvck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRTb3J0TW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRUYWJsZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgUmFuZ2VJbnB1dE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtSdW5zVGFibGVDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1J1bnNUYWJsZUNvbnRhaW5lciwgUnVuc1RhYmxlQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zVGFibGVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBSdW5zVGFibGVNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1RhYmxlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUnVuc1RhYmxlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNUYWJsZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbG9yUGlja2VyTW9kdWxlLAogICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0SW5wdXRNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRNZW51TW9kdWxlLAogICAgICAgICAgICAgICAgTWF0UGFnaW5hdG9yTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0U29ydE1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdFRhYmxlTW9kdWxlLAogICAgICAgICAgICAgICAgUmFuZ2VJbnB1dE1vZHVsZSwKICAgICAgICAgICAgXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShSdW5zVGFibGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbUnVuc1RhYmxlQ29udGFpbmVyLCBSdW5zVGFibGVDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29sb3JQaWNrZXJNb2R1bGUsCiAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgTWF0SW5wdXRNb2R1bGUsCiAgICAgICAgICAgIE1hdE1lbnVNb2R1bGUsCiAgICAgICAgICAgIE1hdFBhZ2luYXRvck1vZHVsZSwKICAgICAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLAogICAgICAgICAgICBNYXRTb3J0TW9kdWxlLAogICAgICAgICAgICBNYXRUYWJsZU1vZHVsZSwKICAgICAgICAgICAgUmFuZ2VJbnB1dE1vZHVsZV0sIGV4cG9ydHM6IFtSdW5zVGFibGVDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvdmlld3MvcnVuc19zZWxlY3Rvci9ydW5zX3NlbGVjdG9yX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSdW5zU2VsZWN0b3JDb21wb25lbnQgewogICAgfQogICAgUnVuc1NlbGVjdG9yQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdydW5zLXNlbGVjdG9yLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxydW5zLXRhYmxlCiAgICAgIFt1c2VGbGV4aWJsZUxheW91dF09InRydWUiCiAgICAgIFtjb2x1bW5zXT0iY29sdW1ucyIKICAgICAgW2V4cGVyaW1lbnRJZHNdPSJleHBlcmltZW50SWRzIgogICAgICBbc2hvd0hwYXJhbXNBbmRNZXRyaWNzXT0ic2hvd0hwYXJhbXNBbmRNZXRyaWNzIgogICAgPjwvcnVucy10YWJsZT4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlczogWwogICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgIHJ1bnMtdGFibGUgewogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgUnVuc1NlbGVjdG9yQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGV4cGVyaW1lbnRJZHM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNob3dIcGFyYW1zQW5kTWV0cmljczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY29sdW1uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaHBhcmFtQW5kTWV0cmljU3BlY3M6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJ1bnNTZWxlY3RvckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFJ1bnNTZWxlY3RvckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSdW5zU2VsZWN0b3JDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1NlbGVjdG9yQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFJ1bnNTZWxlY3RvckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJydW5zLXNlbGVjdG9yLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IGV4cGVyaW1lbnRJZHM6ICJleHBlcmltZW50SWRzIiwgc2hvd0hwYXJhbXNBbmRNZXRyaWNzOiAic2hvd0hwYXJhbXNBbmRNZXRyaWNzIiwgY29sdW1uczogImNvbHVtbnMiLCBocGFyYW1BbmRNZXRyaWNTcGVjczogImhwYXJhbUFuZE1ldHJpY1NwZWNzIiB9LCBkZWNsczogMSwgdmFyczogNCwgY29uc3RzOiBbWzMsICJ1c2VGbGV4aWJsZUxheW91dCIsICJjb2x1bW5zIiwgImV4cGVyaW1lbnRJZHMiLCAic2hvd0hwYXJhbXNBbmRNZXRyaWNzIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUnVuc1NlbGVjdG9yQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAicnVucy10YWJsZSIsIDApOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInVzZUZsZXhpYmxlTGF5b3V0IiwgdHJ1ZSkoImNvbHVtbnMiLCBjdHguY29sdW1ucykoImV4cGVyaW1lbnRJZHMiLCBjdHguZXhwZXJpbWVudElkcykoInNob3dIcGFyYW1zQW5kTWV0cmljcyIsIGN0eC5zaG93SHBhcmFtc0FuZE1ldHJpY3MpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1J1bnNUYWJsZUNvbnRhaW5lcl0sIHN0eWxlczogWyJydW5zLXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSB7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvdmlld3MvcnVuc19zZWxlY3Rvci9ydW5zX3NlbGVjdG9yX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSdW5zU2VsZWN0b3JDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuZXhwZXJpbWVudElkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50SWRzRnJvbVJvdXRlKTsKICAgICAgICAgICAgdGhpcy5jb2x1bW5zJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4cGVyaW1lbnRJZHNGcm9tUm91dGUpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpZHMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChpZHMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAoWwogICAgICAgICAgICAgICAgICAgIFJ1bnNUYWJsZUNvbHVtbi5DSEVDS0JPWCwKICAgICAgICAgICAgICAgICAgICBSdW5zVGFibGVDb2x1bW4uUlVOX05BTUUsCiAgICAgICAgICAgICAgICAgICAgaWRzICYmIGlkcy5sZW5ndGggPiAxID8gUnVuc1RhYmxlQ29sdW1uLkVYUEVSSU1FTlRfTkFNRSA6IG51bGwsCiAgICAgICAgICAgICAgICAgICAgUnVuc1RhYmxlQ29sdW1uLlJVTl9DT0xPUiwKICAgICAgICAgICAgICAgIF0uZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY29sCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY29sKSA9PiBjb2wgIT09IG51bGwpKSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgIH0KICAgIFJ1bnNTZWxlY3RvckNvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAncnVucy1zZWxlY3RvcicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxydW5zLXNlbGVjdG9yLWNvbXBvbmVudAogICAgICBbZXhwZXJpbWVudElkc109ImV4cGVyaW1lbnRJZHMkIHwgYXN5bmMiCiAgICAgIFtjb2x1bW5zXT0iY29sdW1ucyQgfCBhc3luYyIKICAgICAgW3Nob3dIcGFyYW1zQW5kTWV0cmljc109InNob3dIcGFyYW1zQW5kTWV0cmljcyIKICAgID48L3J1bnMtc2VsZWN0b3ItY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJ1bnNTZWxlY3RvckNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBSdW5zU2VsZWN0b3JDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgc2hvd0hwYXJhbXNBbmRNZXRyaWNzOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zU2VsZWN0b3JDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBSdW5zU2VsZWN0b3JDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUnVuc1NlbGVjdG9yQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1NlbGVjdG9yQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFJ1bnNTZWxlY3RvckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJydW5zLXNlbGVjdG9yIl1dLCBpbnB1dHM6IHsgc2hvd0hwYXJhbXNBbmRNZXRyaWNzOiAic2hvd0hwYXJhbXNBbmRNZXRyaWNzIiB9LCBkZWNsczogMywgdmFyczogNywgY29uc3RzOiBbWzMsICJleHBlcmltZW50SWRzIiwgImNvbHVtbnMiLCAic2hvd0hwYXJhbXNBbmRNZXRyaWNzIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUnVuc1NlbGVjdG9yQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAicnVucy1zZWxlY3Rvci1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImV4cGVyaW1lbnRJZHMiLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC5leHBlcmltZW50SWRzJCkpKCJjb2x1bW5zIiwgybXJtXBpcGVCaW5kMSgyLCA1LCBjdHguY29sdW1ucyQpKSgic2hvd0hwYXJhbXNBbmRNZXRyaWNzIiwgY3R4LnNob3dIcGFyYW1zQW5kTWV0cmljcyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbUnVuc1NlbGVjdG9yQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IE1vZHVsZSBmb3IgcmVuZGVyaW5nIGEgdGFibGUgdGhhdCBsaXN0cyBhbGwgdGhlIHJ1bnMgZnJvbQogICAgICogZGlmZmVyZW50IGV4cGVyaW1lbnRzIHdpdGggY2hlY2tib3ggZm9yIHJ1biBzZWxlY3Rpb24uCiAgICAgKgogICAgICogTm90ZSB0aGF0IHRoaXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHJ1bnMgdGFibGUgd2l0aCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbi4KICAgICAqCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3J1bnMvdmlld3MvcnVuc19zZWxlY3Rvci9ydW5zX3NlbGVjdG9yX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSdW5zU2VsZWN0b3JNb2R1bGUgewogICAgfQogICAgUnVuc1NlbGVjdG9yTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSdW5zVGFibGVNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtSdW5zU2VsZWN0b3JDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1J1bnNTZWxlY3RvckNvbXBvbmVudCwgUnVuc1NlbGVjdG9yQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zU2VsZWN0b3JNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBSdW5zU2VsZWN0b3JNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc1NlbGVjdG9yTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUnVuc1NlbGVjdG9yTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bnNTZWxlY3Rvck1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIFJ1bnNUYWJsZU1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoUnVuc1NlbGVjdG9yTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1J1bnNTZWxlY3RvckNvbXBvbmVudCwgUnVuc1NlbGVjdG9yQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUnVuc1RhYmxlTW9kdWxlXSwgZXhwb3J0czogW1J1bnNTZWxlY3RvckNvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICBjb25zdCBtZXRyaWNzVGFnTWV0YWRhdGFSZXF1ZXN0ZWQgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBNZXRyaWNzIFRhZyBNZXRhZGF0YSBSZXF1ZXN0ZWQnKTsKICAgIGNvbnN0IG1ldHJpY3NUYWdNZXRhZGF0YUxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW01ldHJpY3NdIE1ldHJpY3MgVGFnIE1ldGFkYXRhIExvYWRlZCcsIHByb3BzKCkpOwogICAgY29uc3QgbWV0cmljc1RhZ01ldGFkYXRhRmFpbGVkID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gTWV0cmljcyBUYWcgTWV0YWRhdGEgRmFpbGVkJyk7CiAgICBjb25zdCBtZXRyaWNzQ2hhbmdlVG9vbHRpcFNvcnQgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmdzIENoYW5nZSBUb29sdGlwJywgcHJvcHMoKSk7CiAgICBjb25zdCBtZXRyaWNzVG9nZ2xlU2hvd0RhdGFEb3dubG9hZCA9IGNyZWF0ZUFjdGlvbignW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZ3MgVG9nZ2xlIFNob3cgRGF0YSBEb3dubG9hZCcpOwogICAgY29uc3QgbWV0cmljc1RvZ2dsZUlnbm9yZU91dGxpZXJzID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIFRvZ2dsZSBJZ25vcmUgT3V0bGllcicpOwogICAgY29uc3QgbWV0cmljc0NoYW5nZVhBeGlzVHlwZSA9IGNyZWF0ZUFjdGlvbignW01ldHJpY3NdIE1ldHJpY3MgU2V0dGluZyBDaGFuZ2UgWCBBeGlzIFR5cGUnLCBwcm9wcygpKTsKICAgIGNvbnN0IG1ldHJpY3NDaGFuZ2VTY2FsYXJTbW9vdGhpbmcgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgQ2hhbmdlIFNjYWxhciBTbW9vdGhpbmcnLCBwcm9wcygpKTsKICAgIGNvbnN0IG1ldHJpY3NDaGFuZ2VJbWFnZUJyaWdodG5lc3MgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgQ2hhbmdlIEltYWdlIEJyaWdodG5lc3MnLCBwcm9wcygpKTsKICAgIGNvbnN0IG1ldHJpY3NDaGFuZ2VJbWFnZUNvbnRyYXN0ID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIENoYW5nZSBJbWFnZSBDb250cmFzdCcsIHByb3BzKCkpOwogICAgY29uc3QgbWV0cmljc1Jlc2V0SW1hZ2VCcmlnaHRuZXNzID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gSW1hZ2UgQnJpZ2h0bmVzcyBTZXR0aW5nIFJlc2V0Jyk7CiAgICBjb25zdCBtZXRyaWNzUmVzZXRJbWFnZUNvbnRyYXN0ID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gSW1hZ2UgQ29udHJhc3QgU2V0dGluZyBSZXNldCcpOwogICAgY29uc3QgbWV0cmljc1RvZ2dsZUltYWdlU2hvd0FjdHVhbFNpemUgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBNZXRyaWNzIFNldHRpbmcgVG9nZ2xlIEltYWdlIFNob3cgQWN0dWFsIFNpemUnKTsKICAgIGNvbnN0IG1ldHJpY3NDaGFuZ2VIaXN0b2dyYW1Nb2RlID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gTWV0cmljcyBTZXR0aW5nIENoYW5nZSBIaXN0b2dyYW0gTW9kZScsIHByb3BzKCkpOwogICAgY29uc3QgbXVsdGlwbGVUaW1lU2VyaWVzUmVxdWVzdGVkID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gTXVsdGlwbGUgVGltZSBTZXJpZXMgUmVxdWVzdGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBmZXRjaFRpbWVTZXJpZXNGYWlsZWQgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBGZXRjaCBUaW1lIFNlcmllcyBSZXF1ZXN0IEZhaWxlZCcsIHByb3BzKCkpOwogICAgY29uc3QgZmV0Y2hUaW1lU2VyaWVzTG9hZGVkID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gRmV0Y2ggVGltZSBTZXJpZXMgUmVzcG9uc2UgTG9hZGVkJywgcHJvcHMoKSk7CiAgICAvKioKICAgICAqIEFuIGV2ZW50IHdoZW4gc29tZSBjYXJkcyBlbnRlciBvciBleGl0IHRoZSB2aWV3cG9ydC4gVGhlIGNhcmQgc2V0cyBtdXN0IGJlCiAgICAgKiBtdXR1YWxseSBleGNsdXNpdmUuCiAgICAgKi8KICAgIGNvbnN0IGNhcmRWaXNpYmlsaXR5Q2hhbmdlZCA9IGNyZWF0ZUFjdGlvbignW01ldHJpY3NdIENhcmQgVmlzaWJpbGl0eSBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBjYXJkU3RlcFNsaWRlckNoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBDYXJkIFN0ZXAgU2xpZGVyIENoYW5nZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IG1ldHJpY3NUYWdGaWx0ZXJDaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gVGFnIEZpbHRlciBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBtZXRyaWNzVGFnR3JvdXBFeHBhbnNpb25DaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbTWV0cmljc10gTWV0cmljcyBUYWcgR3JvdXAgRXhwYW5zaW9uIENoYW5nZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IGNhcmRQaW5TdGF0ZVRvZ2dsZWQgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzXSBDYXJkIFBpbiBTdGF0ZSBUb2dnbGVkJywgcHJvcHMoKSk7CgogICAgLyoqCiAgICAgKiBSZXR1cm5zIGEgbmV3IG9iamVjdCB3aGVyZSBhbGwgdmFsdWVzIGhhdmUgYmVlbiB0cmFuc2Zvcm1lZC4KICAgICAqIEZvciBmYW1pbGlhcml0eSwgdGhlIEFQSSBzaWduYXR1cmUgd2FzIG1hZGUgdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlCiAgICAgKiBzaWduYXR1cmVzIG9mIGVxdWl2YWxlbnQgZnVuY3Rpb25zIGluIHBvcHVsYXIgbGlicmFyaWVzOgogICAgICogLSBodHRwczovL2xvZGFzaC5jb20vZG9jcy8jbWFwVmFsdWVzCiAgICAgKiAtIGh0dHBzOi8vdW5kZXJzY29yZWpzLm9yZy8jbWFwT2JqZWN0CiAgICAgKi8KICAgIGZ1bmN0aW9uIG1hcE9iamVjdFZhbHVlcyhvYmplY3QsIHRyYW5zZm9ybSkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgICAgIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKG9iamVjdCkpIHsKICAgICAgICAgICAgY29uc3QgdHlwZWRLZXkgPSBrZXk7CiAgICAgICAgICAgIHJlc3VsdFt0eXBlZEtleV0gPSB0cmFuc2Zvcm0ob2JqZWN0W3R5cGVkS2V5XSwga2V5KTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICB2YXIgVGltZVByb3BlcnR5OwogICAgKGZ1bmN0aW9uIChUaW1lUHJvcGVydHkpIHsKICAgICAgICBUaW1lUHJvcGVydHlbIlNURVAiXSA9ICJzdGVwIjsKICAgICAgICBUaW1lUHJvcGVydHlbIldBTExfVElNRSJdID0gIndhbGxfdGltZSI7CiAgICAgICAgVGltZVByb3BlcnR5WyJSRUxBVElWRSJdID0gInJlbGF0aXZlIjsKICAgIH0pKFRpbWVQcm9wZXJ0eSB8fCAoVGltZVByb3BlcnR5ID0ge30pKTsKICAgIHZhciBIaXN0b2dyYW1Nb2RlOwogICAgKGZ1bmN0aW9uIChIaXN0b2dyYW1Nb2RlKSB7CiAgICAgICAgSGlzdG9ncmFtTW9kZVsiT0ZGU0VUIl0gPSAib2Zmc2V0IjsKICAgICAgICBIaXN0b2dyYW1Nb2RlWyJPVkVSTEFZIl0gPSAib3ZlcmxheSI7CiAgICB9KShIaXN0b2dyYW1Nb2RlIHx8IChIaXN0b2dyYW1Nb2RlID0ge30pKTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIC8qKiBAZW51bSB7c3RyaW5nfSAqLwogICAgY29uc3QgVG9vbHRpcFBvc2l0aW9uID0gewogICAgICAgIEJPVFRPTTogImJvdHRvbSIsCiAgICAgICAgUklHSFQ6ICJyaWdodCIsCiAgICAgICAgQVVUTzogImF1dG8iLAogICAgfTsKICAgIC8qKiBAZW51bSB7c3RyaW5nfSAqLwogICAgY29uc3QgVG9vbHRpcFNvcnRpbmdNZXRob2QgPSB7CiAgICAgICAgREVGQVVMVDogImRlZmF1bHQiLAogICAgICAgIEFTQ0VORElORzogImFzY2VuZGluZyIsCiAgICAgICAgREVTQ0VORElORzogImRlc2NlbmRpbmciLAogICAgICAgIE5FQVJFU1Q6ICJuZWFyZXN0IiwKICAgIH07CiAgICAvKiogQGVudW0ge3N0cmluZ30gKi8KICAgIGNvbnN0IFhBeGlzVHlwZSA9IHsKICAgICAgICAvKiogTGluZWFyIHNjYWxlIHVzaW5nIHRoZSAic3RlcCIgcHJvcGVydHkgb2YgdGhlIGRhdHVtLiAqLwogICAgICAgIFNURVA6ICJzdGVwIiwKICAgICAgICAvKioKICAgICAgICAgKiBUZW1wb3JhbCBzY2FsZSB1c2luZyB0aGUgZWFybGllc3QgZGF0dW0ncyAid2FsbF90aW1lIiBhcyBhIGJhc2VsaW5lLgogICAgICAgICAqLwogICAgICAgIFJFTEFUSVZFOiAicmVsYXRpdmUiLAogICAgICAgIC8qKiBUZW1wb3JhbCBzY2FsZSB1c2luZyB0aGUgIndhbGxfdGltZSIgcHJvcGVydHkgb2YgdGhlIGRhdHVtLiAqLwogICAgICAgIFdBTExfVElNRTogIndhbGxfdGltZSIsCiAgICB9OwogICAgLyoqIEBlbnVtIHtzdHJpbmd9ICovCiAgICBjb25zdCBZQXhpc1R5cGUgPSB7CiAgICAgICAgTElORUFSOiAibGluZWFyIiwKICAgICAgICBMT0c6ICJsb2ciLAogICAgfTsKCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIHZhciBYQXhpc1R5cGUkMTsKICAgIChmdW5jdGlvbiAoWEF4aXNUeXBlKSB7CiAgICAgICAgWEF4aXNUeXBlW1hBeGlzVHlwZVsiU1RFUCJdID0gMF0gPSAiU1RFUCI7CiAgICAgICAgWEF4aXNUeXBlW1hBeGlzVHlwZVsiUkVMQVRJVkUiXSA9IDFdID0gIlJFTEFUSVZFIjsKICAgICAgICBYQXhpc1R5cGVbWEF4aXNUeXBlWyJXQUxMX1RJTUUiXSA9IDJdID0gIldBTExfVElNRSI7CiAgICB9KShYQXhpc1R5cGUkMSB8fCAoWEF4aXNUeXBlJDEgPSB7fSkpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgZnVuY3Rpb24gYnVpbGRDYXJkTWV0YWRhdGFMaXN0KHRhZ01ldGFkYXRhKSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgICAgIGZvciAobGV0IHBsdWdpbktleSBvZiBPYmplY3Qua2V5cyh0YWdNZXRhZGF0YSkpIHsKICAgICAgICAgICAgY29uc3QgcGx1Z2luID0gcGx1Z2luS2V5OwogICAgICAgICAgICBsZXQgdGFnVG9SdW5zOwogICAgICAgICAgICBpZiAoaXNTYW1wbGVkUGx1Z2luKHBsdWdpbikpIHsKICAgICAgICAgICAgICAgIGlmIChpc1NpbmdsZVJ1blBsdWdpbihwbHVnaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLXJ1biwgc2FtcGxlZCBmb3JtYXQgKGUuZy4gSW1hZ2VzKS4KICAgICAgICAgICAgICAgICAgICBjb25zdCB0YWdSdW5TYW1wbGVJbmZvID0gdGFnTWV0YWRhdGFbcGx1Z2luXS50YWdSdW5TYW1wbGVkSW5mbzsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBPYmplY3Qua2V5cyh0YWdSdW5TYW1wbGVJbmZvKSkgewogICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1bklkIG9mIE9iamVjdC5rZXlzKHRhZ1J1blNhbXBsZUluZm9bdGFnXSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgbWF4U2FtcGxlc1BlclN0ZXAgfSA9IHRhZ1J1blNhbXBsZUluZm9bdGFnXVtydW5JZF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG1heFNhbXBsZXNQZXJTdGVwOyBpKyspIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzLnB1c2goeyBwbHVnaW4sIHRhZywgcnVuSWQsIHNhbXBsZTogaSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignTXVsdGktcnVuLCBzYW1wbGVkIHBsdWdpbiBzdXBwb3J0IG5vdCB5ZXQgaW1wbGVtZW50ZWQnKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGlmIChpc1NpbmdsZVJ1blBsdWdpbihwbHVnaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luZ2xlLXJ1biwgdW5zYW1wbGVkIGZvcm1hdCAoZS5nLiBIaXN0b2dyYW1zKS4KICAgICAgICAgICAgICAgICAgICB0YWdUb1J1bnMgPSB0YWdNZXRhZGF0YVtwbHVnaW5dLnRhZ1RvUnVuczsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBPYmplY3Qua2V5cyh0YWdUb1J1bnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcnVuSWQgb2YgdGFnVG9SdW5zW3RhZ10pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IHBsdWdpbiwgdGFnLCBydW5JZCB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8vIE11bHRpLXJ1biwgdW5zYW1wbGVkIGZvcm1hdCAoZS5nLiBTY2FsYXJzKS4KICAgICAgICAgICAgICAgICAgICB0YWdUb1J1bnMgPSB0YWdNZXRhZGF0YVtwbHVnaW5dLnRhZ1RvUnVuczsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHRhZyBvZiBPYmplY3Qua2V5cyh0YWdUb1J1bnMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IHBsdWdpbiwgdGFnLCBydW5JZDogbnVsbCB9KTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdHM7CiAgICB9CiAgICBmdW5jdGlvbiBnZXRNYXhTdGVwSW5kZXgoY2FyZElkLCBjYXJkTWV0YWRhdGFNYXAsIHRpbWVTZXJpZXNEYXRhKSB7CiAgICAgICAgY29uc3QgeyBwbHVnaW4sIHRhZywgcnVuSWQsIHNhbXBsZSB9ID0gY2FyZE1ldGFkYXRhTWFwW2NhcmRJZF07CiAgICAgICAgY29uc3QgbG9hZGFibGUgPSBnZXRUaW1lU2VyaWVzTG9hZGFibGUodGltZVNlcmllc0RhdGEsIHBsdWdpbiwgdGFnLCBzYW1wbGUpOwogICAgICAgIGlmIChsb2FkYWJsZSkgewogICAgICAgICAgICBpZiAocnVuSWQgIT09IG51bGwgJiYgbG9hZGFibGUucnVuVG9TZXJpZXMuaGFzT3duUHJvcGVydHkocnVuSWQpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBzZXJpZXNMZW5ndGggPSBsb2FkYWJsZS5ydW5Ub1Nlcmllc1tydW5JZF0ubGVuZ3RoOwogICAgICAgICAgICAgICAgcmV0dXJuIHNlcmllc0xlbmd0aCA+IDAgPyBzZXJpZXNMZW5ndGggLSAxIDogbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBzZXJpZXNMZW5ndGhzID0gT2JqZWN0LnZhbHVlcyhsb2FkYWJsZS5ydW5Ub1NlcmllcykubWFwKChzZXJpZXMpID0+IHNlcmllcy5sZW5ndGgpOwogICAgICAgICAgICBpZiAoc2VyaWVzTGVuZ3Rocy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1heCguLi5zZXJpZXNMZW5ndGhzKSAtIDE7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIG51bGw7CiAgICB9CiAgICAvKioKICAgICAqIE5vcm1hbGl6ZXMgdGhlIHN0ZXAgZm9yIGNhcmRzIGluIHRoZSBzdGVwIGluZGV4IG1hcC4gVGhpcyBpbmNsdWRlcwogICAgICogLSBhc3NpZ24gYSBkZWZhdWx0IHN0ZXAKICAgICAqIC0gcmVzZWxlY3QgdGhlIG1heCBzdGVwLCBpZiB0aGUgcHJldmlvdXMgc2VyaWVzJyBtYXggd2FzIHNlbGVjdGVkCiAgICAgKiAtIGNsYW1wIHRvIHRoZSBuZXcgc2VyaWVzJyBtYXgKICAgICAqIC0gc2V0IHRvIGBudWxsYCBpZiB0aGUgc2VyaWVzIGNvbnRhaW5zIG5vIHN0ZXAgZGF0YQogICAgICovCiAgICBmdW5jdGlvbiBidWlsZE5vcm1hbGl6ZWRDYXJkU3RlcEluZGV4TWFwKGNhcmRNZXRhZGF0YU1hcCwgY2FyZFN0ZXBJbmRleCwgdGltZVNlcmllc0RhdGEsIHByZXZUaW1lU2VyaWVzRGF0YSkgewogICAgICAgIGNvbnN0IHJlc3VsdCA9IE9iamVjdC5hc3NpZ24oe30sIGNhcmRTdGVwSW5kZXgpOwogICAgICAgIGZvciAoY29uc3QgY2FyZElkIGluIGNhcmRNZXRhZGF0YU1hcCkgewogICAgICAgICAgICBpZiAoIWNhcmRNZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShjYXJkSWQpKSB7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBjb25zdCBtYXhTdGVwSW5kZXggPSBnZXRNYXhTdGVwSW5kZXgoY2FyZElkLCBjYXJkTWV0YWRhdGFNYXAsIHRpbWVTZXJpZXNEYXRhKTsKICAgICAgICAgICAgaWYgKG1heFN0ZXBJbmRleCA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgaWYgKGNhcmRTdGVwSW5kZXguaGFzT3duUHJvcGVydHkoY2FyZElkKSkgewogICAgICAgICAgICAgICAgICAgIHJlc3VsdFtjYXJkSWRdID0gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNvbnN0IHN0ZXBJbmRleCA9IGNhcmRTdGVwSW5kZXguaGFzT3duUHJvcGVydHkoY2FyZElkKQogICAgICAgICAgICAgICAgPyBjYXJkU3RlcEluZGV4W2NhcmRJZF0KICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgY29uc3QgcHJldk1heFN0ZXBJbmRleCA9IGdldE1heFN0ZXBJbmRleChjYXJkSWQsIGNhcmRNZXRhZGF0YU1hcCwgcHJldlRpbWVTZXJpZXNEYXRhKTsKICAgICAgICAgICAgY29uc3QgcHJldldhc01heCA9IHN0ZXBJbmRleCAhPT0gbnVsbCAmJiBzdGVwSW5kZXggPT09IHByZXZNYXhTdGVwSW5kZXg7CiAgICAgICAgICAgIGNvbnN0IHNob3VsZENsYW1wID0gc3RlcEluZGV4ICE9PSBudWxsICYmIHN0ZXBJbmRleCA+IG1heFN0ZXBJbmRleDsKICAgICAgICAgICAgY29uc3Qgc2hvdWxkQXV0b1NlbGVjdE1heCA9IHN0ZXBJbmRleCA9PT0gbnVsbCB8fCBwcmV2V2FzTWF4OwogICAgICAgICAgICBpZiAoc2hvdWxkQ2xhbXAgfHwgc2hvdWxkQXV0b1NlbGVjdE1heCkgewogICAgICAgICAgICAgICAgcmVzdWx0W2NhcmRJZF0gPSBtYXhTdGVwSW5kZXg7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KICAgIC8qKgogICAgICogQnVpbGRzIGEgbmV3IGxvYWRhYmxlIHdob3NlIHJ1blRvTG9hZFN0YXRlIHJlcHJlc2VudHMgYSBzdGF0ZSB3aGVyZSBub3RoaW5nCiAgICAgKiBpcyBsb2FkZWQsIGFuZCBydW5Ub1NlcmllcyBpcyBwcmVzZXJ2ZWQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkUmVzZXRMb2FkYWJsZShsb2FkYWJsZSkgewogICAgICAgIGNvbnN0IHJ1blRvTG9hZFN0YXRlID0gbWFwT2JqZWN0VmFsdWVzKGxvYWRhYmxlLnJ1blRvTG9hZFN0YXRlLCAobG9hZFN0YXRlKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBsb2FkU3RhdGUgPT09IERhdGFMb2FkU3RhdGUuTE9BRElORwogICAgICAgICAgICAgICAgPyBEYXRhTG9hZFN0YXRlLkxPQURJTkcKICAgICAgICAgICAgICAgIDogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVEOwogICAgICAgIH0pOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGxvYWRhYmxlKSwgeyBydW5Ub0xvYWRTdGF0ZSB9KTsKICAgIH0KICAgIC8qKgogICAgICogUmV0dXJucyBhbiBpZGVudGlmaWVyIHVzZWZ1bCBmb3IgY29tcGFyaW5nIGEgY2FyZCBpbiBzdG9yYWdlIHdpdGggYSByZWFsIGNhcmQKICAgICAqIHdpdGggbG9hZGVkIG1ldGFkYXRhLgogICAgICovCiAgICBmdW5jdGlvbiBzZXJpYWxpemVDYXJkVW5pcXVlSW5mbyhwbHVnaW4sIHRhZywgcnVuSWQsIHNhbXBsZSkgewogICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShbcGx1Z2luLCB0YWcsIHJ1bklkIHx8ICcnLCBzYW1wbGVdKTsKICAgIH0KICAgIGNvbnN0IHsgaW5pdGlhbFN0YXRlOiBpbml0aWFsU3RhdGUkNSwgcmVkdWNlcnM6IHJvdXRlQ29udGV4dFJlZHVjZXIgfSA9IGNyZWF0ZVJvdXRlQ29udGV4dGVkU3RhdGUoewogICAgICAgIC8vIEJhY2tlbmQgZGF0YS4KICAgICAgICB0YWdNZXRhZGF0YUxvYWRlZDogRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVELAogICAgICAgIHRhZ01ldGFkYXRhOiB7CiAgICAgICAgICAgIHNjYWxhcnM6IHsKICAgICAgICAgICAgICAgIHRhZ0Rlc2NyaXB0aW9uczoge30sCiAgICAgICAgICAgICAgICB0YWdUb1J1bnM6IHt9LAogICAgICAgICAgICB9LAogICAgICAgICAgICBoaXN0b2dyYW1zOiB7CiAgICAgICAgICAgICAgICB0YWdEZXNjcmlwdGlvbnM6IHt9LAogICAgICAgICAgICAgICAgdGFnVG9SdW5zOiB7fSwKICAgICAgICAgICAgfSwKICAgICAgICAgICAgaW1hZ2VzOiB7CiAgICAgICAgICAgICAgICB0YWdEZXNjcmlwdGlvbnM6IHt9LAogICAgICAgICAgICAgICAgdGFnUnVuU2FtcGxlZEluZm86IHt9LAogICAgICAgICAgICB9LAogICAgICAgIH0sCiAgICAgICAgLy8gQ2FyZHMuCiAgICAgICAgY2FyZExpc3Q6IFtdLAogICAgICAgIGNhcmRUb1Bpbm5lZENvcHk6IG5ldyBNYXAoKSwKICAgICAgICBwaW5uZWRDYXJkVG9PcmlnaW5hbDogbmV3IE1hcCgpLAogICAgICAgIHVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzOiBbXSwKICAgICAgICBjYXJkTWV0YWRhdGFNYXA6IHt9LAogICAgICAgIGNhcmRTdGVwSW5kZXg6IHt9LAogICAgICAgIHRhZ0ZpbHRlcjogJycsCiAgICAgICAgdGFnR3JvdXBFeHBhbmRlZDogbmV3IE1hcCgpLAogICAgfSwgewogICAgICAgIHRpbWVTZXJpZXNEYXRhOiB7CiAgICAgICAgICAgIHNjYWxhcnM6IHt9LAogICAgICAgICAgICBoaXN0b2dyYW1zOiB7fSwKICAgICAgICAgICAgaW1hZ2VzOiB7fSwKICAgICAgICB9LAogICAgICAgIHNldHRpbmdzOiB7CiAgICAgICAgICAgIHRvb2x0aXBTb3J0OiBUb29sdGlwU29ydGluZ01ldGhvZC5ERUZBVUxULAogICAgICAgICAgICBpZ25vcmVPdXRsaWVyczogdHJ1ZSwKICAgICAgICAgICAgeEF4aXNUeXBlOiBYQXhpc1R5cGUkMS5TVEVQLAogICAgICAgICAgICBzY2FsYXJTbW9vdGhpbmc6IDAuNiwKICAgICAgICAgICAgaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaTogMTAwMCwKICAgICAgICAgICAgaW1hZ2VDb250cmFzdEluTWlsbGk6IDEwMDAsCiAgICAgICAgICAgIGltYWdlU2hvd0FjdHVhbFNpemU6IGZhbHNlLAogICAgICAgICAgICBoaXN0b2dyYW1Nb2RlOiBIaXN0b2dyYW1Nb2RlLk9GRlNFVCwKICAgICAgICB9LAogICAgICAgIHZpc2libGVDYXJkczogbmV3IFNldCgpLAogICAgfSwgCiAgICAvKiogb25Sb3V0ZUlkQ2hhbmdlZCAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IAogICAgICAgICAgICAvLyBSZXNldCB2aXNpYmxlIGNhcmRzIGluIGNhc2Ugd2UgcmVzdW1lIGEgcm91dGUgdGhhdCB3YXMgbGVmdCBkaXJ0eS4KICAgICAgICAgICAgLy8gU2luY2UgdmlzaWJpbGl0eSB0cmFja2luZyBpcyBhc3luYywgdGhlIHN0YXRlIG1heSBub3QgaGF2ZSByZWNlaXZlZAogICAgICAgICAgICAvLyAnZXhpdGVkIGNhcmQnIHVwZGF0ZXMgd2hlbiBpdCB3YXMgY2FjaGVkIGJ5IHRoZSByb3V0ZXIuCiAgICAgICAgICAgIHZpc2libGVDYXJkczogbmV3IFNldCgpIH0pOwogICAgfSk7CiAgICBjb25zdCByZWR1Y2VyJDUgPSBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSQ1LCBvbihzdGF0ZVJlaHlkcmF0ZWRGcm9tVXJsLCAoc3RhdGUsIHsgcm91dGVLaW5kLCBwYXJ0aWFsU3RhdGUgfSkgPT4gewogICAgICAgIGlmIChyb3V0ZUtpbmQgIT09IFJvdXRlS2luZC5FWFBFUklNRU5UICYmCiAgICAgICAgICAgIHJvdXRlS2luZCAhPT0gUm91dGVLaW5kLkNPTVBBUkVfRVhQRVJJTUVOVCkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIC8vIFRoZSBVUkwgY29udGFpbnMgcGlubmVkIGNhcmRzICsgdW5yZXNvbHZlZCBpbXBvcnRlZCBwaW5zLiBLZWVwIHRoZXNlIHNldHMKICAgICAgICAvLyBtdXR1YWxseSBleGNsdXNpdmUsIGFuZCBkbyBub3QgYWRkIGR1cGxpY2F0ZSBhbnkgdW5yZXNvbHZlZCBpbXBvcnRlZAogICAgICAgIC8vIGNhcmRzLgogICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRDYXJkVW5pcXVlSW5mb3MgPSBuZXcgU2V0KCk7CiAgICAgICAgLy8gVmlzaXQgZXhpc3RpbmcgcGlucy4KICAgICAgICBmb3IgKGNvbnN0IHBpbm5lZENhcmRJZCBvZiBzdGF0ZS5waW5uZWRDYXJkVG9PcmlnaW5hbC5rZXlzKCkpIHsKICAgICAgICAgICAgY29uc3QgeyBwbHVnaW4sIHRhZywgcnVuSWQsIHNhbXBsZSB9ID0gc3RhdGUuY2FyZE1ldGFkYXRhTWFwW3Bpbm5lZENhcmRJZF07CiAgICAgICAgICAgIHNlcmlhbGl6ZWRDYXJkVW5pcXVlSW5mb3MuYWRkKHNlcmlhbGl6ZUNhcmRVbmlxdWVJbmZvKHBsdWdpbiwgdGFnLCBydW5JZCwgc2FtcGxlKSk7CiAgICAgICAgfQogICAgICAgIC8vIFdlIG5lZWQgdG8gaW5jbHVkZSBwcmV2aW91cyB1bnJlc29sdmVkIGltcG9ydGVkIHBpbnMsIGJlY2F1c2UgdGhlIG5ldwogICAgICAgIC8vIGh5ZHJhdGVkIHN0YXRlIG1pZ2h0IG5vdCBpbmNsdWRlIHRoZW0uIEZvciBleGFtcGxlLCBuYXZpZ2F0aW5nIGZyb20KICAgICAgICAvLyBleHBlcmltZW50IEEgKHdpdGggcGlucykgLS0+IEIgLS0+IEEsIHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgcmVoeWRyYXRpb24KICAgICAgICAvLyBkb2VzIG5vdCBkcm9wIHRoZSBvbGQgdW5yZXNvbHZlZCBwaW5zIG9uIEEuCiAgICAgICAgY29uc3QgaHlkcmF0ZWRTdGF0ZSA9IHBhcnRpYWxTdGF0ZTsKICAgICAgICBjb25zdCB1bnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcyA9IFtdOwogICAgICAgIGZvciAoY29uc3QgY2FyZCBvZiBbCiAgICAgICAgICAgIC4uLnN0YXRlLnVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzLAogICAgICAgICAgICAuLi5oeWRyYXRlZFN0YXRlLm1ldHJpY3MucGlubmVkQ2FyZHMsCiAgICAgICAgXSkgewogICAgICAgICAgICBjb25zdCBjYXJkVW5pcXVlSW5mb1N0cmluZyA9IHNlcmlhbGl6ZUNhcmRVbmlxdWVJbmZvKGNhcmQucGx1Z2luLCBjYXJkLnRhZywgY2FyZC5ydW5JZCwgY2FyZC5zYW1wbGUpOwogICAgICAgICAgICBpZiAoIXNlcmlhbGl6ZWRDYXJkVW5pcXVlSW5mb3MuaGFzKGNhcmRVbmlxdWVJbmZvU3RyaW5nKSkgewogICAgICAgICAgICAgICAgc2VyaWFsaXplZENhcmRVbmlxdWVJbmZvcy5hZGQoY2FyZFVuaXF1ZUluZm9TdHJpbmcpOwogICAgICAgICAgICAgICAgdW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMucHVzaChjYXJkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdCA9IGJ1aWxkT3JSZXR1cm5TdGF0ZVdpdGhVbnJlc29sdmVkSW1wb3J0ZWRQaW5zKHVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzLCBzdGF0ZS5jYXJkTGlzdCwgc3RhdGUuY2FyZE1ldGFkYXRhTWFwLCBzdGF0ZS5jYXJkVG9QaW5uZWRDb3B5LCBzdGF0ZS5waW5uZWRDYXJkVG9PcmlnaW5hbCwgc3RhdGUuY2FyZFN0ZXBJbmRleCk7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCByZXNvbHZlZFJlc3VsdCk7CiAgICB9KSwgb24ocmVsb2FkLCBtYW51YWxSZWxvYWQsIChzdGF0ZSkgPT4gewogICAgICAgIGNvbnN0IG5leHRUYWdNZXRhZGF0YUxvYWRlZCA9IHN0YXRlLnRhZ01ldGFkYXRhTG9hZGVkID09PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcKICAgICAgICAgICAgPyBEYXRhTG9hZFN0YXRlLkxPQURJTkcKICAgICAgICAgICAgOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQ7CiAgICAgICAgY29uc3QgbmV4dFRpbWVTZXJpZXNEYXRhID0gbWFwT2JqZWN0VmFsdWVzKHN0YXRlLnRpbWVTZXJpZXNEYXRhLCAocGx1Z2luRGF0YSwgcGx1Z2luKSA9PiB7CiAgICAgICAgICAgIHJldHVybiBtYXBPYmplY3RWYWx1ZXMocGx1Z2luRGF0YSwgKHRhZ0RhdGEpID0+IHsKICAgICAgICAgICAgICAgIGlmICghaXNTYW1wbGVkUGx1Z2luKHBsdWdpbikpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRSZXNldExvYWRhYmxlKHRhZ0RhdGEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIG1hcE9iamVjdFZhbHVlcyh0YWdEYXRhLCAoc2FtcGxlRGF0YSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBidWlsZFJlc2V0TG9hZGFibGUoc2FtcGxlRGF0YSk7CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSk7CiAgICAgICAgfSk7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHRhZ01ldGFkYXRhTG9hZGVkOiBuZXh0VGFnTWV0YWRhdGFMb2FkZWQsIHRpbWVTZXJpZXNEYXRhOiBuZXh0VGltZVNlcmllc0RhdGEgfSk7CiAgICB9KSwgb24obWV0cmljc1RhZ01ldGFkYXRhUmVxdWVzdGVkLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgdGFnTWV0YWRhdGFMb2FkZWQ6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KTsKICAgIH0pLCBvbihtZXRyaWNzVGFnTWV0YWRhdGFGYWlsZWQsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyB0YWdNZXRhZGF0YUxvYWRlZDogRGF0YUxvYWRTdGF0ZS5GQUlMRUQgfSk7CiAgICB9KSwgb24obWV0cmljc1RhZ01ldGFkYXRhTG9hZGVkLCAoc3RhdGUsIHsgdGFnTWV0YWRhdGEgfSkgPT4gewogICAgICAgIGNvbnN0IG5leHRUYWdNZXRhZGF0YSA9IHsKICAgICAgICAgICAgc2NhbGFyczogYnVpbGRQbHVnaW5UYWdEYXRhKHRhZ01ldGFkYXRhLCBQbHVnaW5UeXBlLlNDQUxBUlMpLAogICAgICAgICAgICBoaXN0b2dyYW1zOiBidWlsZFBsdWdpblRhZ0RhdGEodGFnTWV0YWRhdGEsIFBsdWdpblR5cGUuSElTVE9HUkFNUyksCiAgICAgICAgICAgIGltYWdlczogdGFnTWV0YWRhdGFbUGx1Z2luVHlwZS5JTUFHRVNdLAogICAgICAgIH07CiAgICAgICAgLy8gQ2Fycnkgb3ZlciBwcmUtZXhpc3RpbmcgY2FyZCBtZXRhZGF0YSwgZXZlbiBpZiB0aGUgbmV3IHRhZwogICAgICAgIC8vIG1ldGFkYXRhIGRvZXMgbm90IGluY2x1ZGUgaXQuCiAgICAgICAgY29uc3QgbmV4dENhcmRNZXRhZGF0YU1hcCA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLmNhcmRNZXRhZGF0YU1hcCk7CiAgICAgICAgY29uc3QgbmV4dENhcmRNZXRhZGF0YUxpc3QgPSBidWlsZENhcmRNZXRhZGF0YUxpc3QobmV4dFRhZ01ldGFkYXRhKTsKICAgICAgICBjb25zdCBuZXdDYXJkSWRzID0gW107CiAgICAgICAgLy8gQ3JlYXRlIG5ldyBjYXJkcyBmb3IgdW5zZWVuIG1ldGFkYXRhLgogICAgICAgIGZvciAoY29uc3QgY2FyZE1ldGFkYXRhIG9mIG5leHRDYXJkTWV0YWRhdGFMaXN0KSB7CiAgICAgICAgICAgIGNvbnN0IGNhcmRJZCA9IGdldENhcmRJZChjYXJkTWV0YWRhdGEpOwogICAgICAgICAgICBpZiAoIXN0YXRlLmNhcmRNZXRhZGF0YU1hcC5oYXNPd25Qcm9wZXJ0eShjYXJkSWQpKSB7CiAgICAgICAgICAgICAgICBuZXh0Q2FyZE1ldGFkYXRhTWFwW2NhcmRJZF0gPSBjYXJkTWV0YWRhdGE7CiAgICAgICAgICAgICAgICBuZXdDYXJkSWRzLnB1c2goY2FyZElkKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBjb25zdCBuZXh0Q2FyZExpc3QgPSBbLi4uc3RhdGUuY2FyZExpc3QsIC4uLm5ld0NhcmRJZHNdOwogICAgICAgIGNvbnN0IHJlc29sdmVkUmVzdWx0ID0gYnVpbGRPclJldHVyblN0YXRlV2l0aFVucmVzb2x2ZWRJbXBvcnRlZFBpbnMoc3RhdGUudW5yZXNvbHZlZEltcG9ydGVkUGlubmVkQ2FyZHMsIG5ld0NhcmRJZHMsIG5leHRDYXJkTWV0YWRhdGFNYXAsIHN0YXRlLmNhcmRUb1Bpbm5lZENvcHksIHN0YXRlLnBpbm5lZENhcmRUb09yaWdpbmFsLCBzdGF0ZS5jYXJkU3RlcEluZGV4KTsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgcmVzb2x2ZWRSZXN1bHQpLCB7IHRhZ01ldGFkYXRhTG9hZGVkOiBEYXRhTG9hZFN0YXRlLkxPQURFRCwgdGFnTWV0YWRhdGE6IG5leHRUYWdNZXRhZGF0YSwgY2FyZExpc3Q6IG5leHRDYXJkTGlzdCB9KTsKICAgIH0pLCBvbihtZXRyaWNzVGFnRmlsdGVyQ2hhbmdlZCwgKHN0YXRlLCB7IHRhZ0ZpbHRlciB9KSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHRhZ0ZpbHRlciB9KTsKICAgIH0pLCBvbihtZXRyaWNzQ2hhbmdlVG9vbHRpcFNvcnQsIChzdGF0ZSwgeyBzb3J0IH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2V0dGluZ3M6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc2V0dGluZ3MpLCB7IHRvb2x0aXBTb3J0OiBzb3J0IH0pIH0pOwogICAgfSksIG9uKG1ldHJpY3NUb2dnbGVJZ25vcmVPdXRsaWVycywgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNldHRpbmdzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzKSwgeyBpZ25vcmVPdXRsaWVyczogIXN0YXRlLnNldHRpbmdzLmlnbm9yZU91dGxpZXJzIH0pIH0pOwogICAgfSksIG9uKG1ldHJpY3NDaGFuZ2VYQXhpc1R5cGUsIChzdGF0ZSwgeyB4QXhpc1R5cGUgfSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzZXR0aW5nczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncyksIHsgeEF4aXNUeXBlIH0pIH0pOwogICAgfSksIG9uKG1ldHJpY3NDaGFuZ2VTY2FsYXJTbW9vdGhpbmcsIChzdGF0ZSwgeyBzbW9vdGhpbmcgfSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzZXR0aW5nczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncyksIHsgc2NhbGFyU21vb3RoaW5nOiBzbW9vdGhpbmcgfSkgfSk7CiAgICB9KSwgb24obWV0cmljc0NoYW5nZUltYWdlQnJpZ2h0bmVzcywgKHN0YXRlLCB7IGJyaWdodG5lc3NJbk1pbGxpIH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2V0dGluZ3M6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc2V0dGluZ3MpLCB7IGltYWdlQnJpZ2h0bmVzc0luTWlsbGk6IGJyaWdodG5lc3NJbk1pbGxpIH0pIH0pOwogICAgfSksIG9uKG1ldHJpY3NDaGFuZ2VJbWFnZUNvbnRyYXN0LCAoc3RhdGUsIHsgY29udHJhc3RJbk1pbGxpIH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2V0dGluZ3M6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc2V0dGluZ3MpLCB7IGltYWdlQ29udHJhc3RJbk1pbGxpOiBjb250cmFzdEluTWlsbGkgfSkgfSk7CiAgICB9KSwgb24obWV0cmljc1Jlc2V0SW1hZ2VCcmlnaHRuZXNzLCAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2V0dGluZ3M6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc2V0dGluZ3MpLCB7IGltYWdlQnJpZ2h0bmVzc0luTWlsbGk6IGluaXRpYWxTdGF0ZSQ1LnNldHRpbmdzLmltYWdlQnJpZ2h0bmVzc0luTWlsbGkgfSkgfSk7CiAgICB9KSwgb24obWV0cmljc1Jlc2V0SW1hZ2VDb250cmFzdCwgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHNldHRpbmdzOiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnNldHRpbmdzKSwgeyBpbWFnZUNvbnRyYXN0SW5NaWxsaTogaW5pdGlhbFN0YXRlJDUuc2V0dGluZ3MuaW1hZ2VDb250cmFzdEluTWlsbGkgfSkgfSk7CiAgICB9KSwgb24obWV0cmljc1RvZ2dsZUltYWdlU2hvd0FjdHVhbFNpemUsIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzZXR0aW5nczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5zZXR0aW5ncyksIHsgaW1hZ2VTaG93QWN0dWFsU2l6ZTogIXN0YXRlLnNldHRpbmdzLmltYWdlU2hvd0FjdHVhbFNpemUgfSkgfSk7CiAgICB9KSwgb24obWV0cmljc0NoYW5nZUhpc3RvZ3JhbU1vZGUsIChzdGF0ZSwgeyBoaXN0b2dyYW1Nb2RlIH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2V0dGluZ3M6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuc2V0dGluZ3MpLCB7IGhpc3RvZ3JhbU1vZGUgfSkgfSk7CiAgICB9KSwgb24obXVsdGlwbGVUaW1lU2VyaWVzUmVxdWVzdGVkLCAoc3RhdGUsIHsgcmVxdWVzdHMgfSkgPT4gewogICAgICAgIGlmICghcmVxdWVzdHMubGVuZ3RoKSB7CiAgICAgICAgICAgIHJldHVybiBzdGF0ZTsKICAgICAgICB9CiAgICAgICAgLy8gVE9ETyhwc3lidXp6KTogdGhlIGBleHBlcmltZW50SWRzYCBmaWVsZCBvbiByZXF1ZXN0cyBpcyBjdXJyZW50bHkKICAgICAgICAvLyBpZ25vcmVkLiBJZGVhbGx5IHRoaXMgcmVkdWNlciBzaG91bGQgc3VwcG9ydCByZXF1ZXN0aW5nIGEKICAgICAgICAvLyBzdWJzZXQgb2YgYWxsIGV4cGVyaW1lbnRzLgogICAgICAgIGNvbnN0IG5leHRUaW1lU2VyaWVzRGF0YSA9IE9iamVjdC5hc3NpZ24oe30sIHN0YXRlLnRpbWVTZXJpZXNEYXRhKTsKICAgICAgICBmb3IgKGNvbnN0IHJlcXVlc3Qgb2YgcmVxdWVzdHMpIHsKICAgICAgICAgICAgY29uc3QgeyBwbHVnaW4sIHRhZywgc2FtcGxlIH0gPSByZXF1ZXN0OwogICAgICAgICAgICBuZXh0VGltZVNlcmllc0RhdGFbcGx1Z2luXSA9IGNyZWF0ZVBsdWdpbkRhdGFXaXRoTG9hZGFibGUobmV4dFRpbWVTZXJpZXNEYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKTsKICAgICAgICAgICAgY29uc3QgbG9hZGFibGUgPSBnZXRUaW1lU2VyaWVzTG9hZGFibGUobmV4dFRpbWVTZXJpZXNEYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKTsKICAgICAgICAgICAgY29uc3QgcnVuSWRzID0gaXNTaW5nbGVSdW5UaW1lU2VyaWVzUmVxdWVzdChyZXF1ZXN0KQogICAgICAgICAgICAgICAgPyBbcmVxdWVzdC5ydW5JZF0KICAgICAgICAgICAgICAgIDogZ2V0UnVuSWRzKHN0YXRlLnRhZ01ldGFkYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKTsKICAgICAgICAgICAgbG9hZGFibGUucnVuVG9Mb2FkU3RhdGUgPSBjcmVhdGVSdW5Ub0xvYWRTdGF0ZShEYXRhTG9hZFN0YXRlLkxPQURJTkcsIHJ1bklkcywgbG9hZGFibGUucnVuVG9Mb2FkU3RhdGUpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgdGltZVNlcmllc0RhdGE6IG5leHRUaW1lU2VyaWVzRGF0YSB9KTsKICAgIH0pLCBvbihmZXRjaFRpbWVTZXJpZXNGYWlsZWQsIChzdGF0ZSwgeyByZXF1ZXN0IH0pID0+IHsKICAgICAgICBjb25zdCBuZXh0VGltZVNlcmllc0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS50aW1lU2VyaWVzRGF0YSk7CiAgICAgICAgY29uc3QgeyBwbHVnaW4sIHRhZywgc2FtcGxlIH0gPSByZXF1ZXN0OwogICAgICAgIG5leHRUaW1lU2VyaWVzRGF0YVtwbHVnaW5dID0gY3JlYXRlUGx1Z2luRGF0YVdpdGhMb2FkYWJsZShuZXh0VGltZVNlcmllc0RhdGEsIHBsdWdpbiwgdGFnLCBzYW1wbGUpOwogICAgICAgIGNvbnN0IGxvYWRhYmxlID0gZ2V0VGltZVNlcmllc0xvYWRhYmxlKG5leHRUaW1lU2VyaWVzRGF0YSwgcGx1Z2luLCB0YWcsIHNhbXBsZSk7CiAgICAgICAgY29uc3QgcnVuSWRzID0gaXNTaW5nbGVSdW5UaW1lU2VyaWVzUmVxdWVzdChyZXF1ZXN0KQogICAgICAgICAgICA/IFtyZXF1ZXN0LnJ1bklkXQogICAgICAgICAgICA6IGdldFJ1bklkcyhzdGF0ZS50YWdNZXRhZGF0YSwgcGx1Z2luLCB0YWcsIHNhbXBsZSk7CiAgICAgICAgbG9hZGFibGUucnVuVG9Mb2FkU3RhdGUgPSBjcmVhdGVSdW5Ub0xvYWRTdGF0ZShEYXRhTG9hZFN0YXRlLkZBSUxFRCwgcnVuSWRzLCBsb2FkYWJsZS5ydW5Ub0xvYWRTdGF0ZSk7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHRpbWVTZXJpZXNEYXRhOiBuZXh0VGltZVNlcmllc0RhdGEgfSk7CiAgICB9KSwgb24oZmV0Y2hUaW1lU2VyaWVzTG9hZGVkLCAoc3RhdGUsIHsgcmVzcG9uc2UgfSkgPT4gewogICAgICAgIC8vIFVwZGF0ZSB0aW1lIHNlcmllcy4KICAgICAgICBjb25zdCBuZXh0VGltZVNlcmllc0RhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS50aW1lU2VyaWVzRGF0YSk7CiAgICAgICAgY29uc3QgeyBwbHVnaW4sIHRhZywgcnVuSWQsIHNhbXBsZSB9ID0gcmVzcG9uc2U7CiAgICAgICAgbmV4dFRpbWVTZXJpZXNEYXRhW3BsdWdpbl0gPSBjcmVhdGVQbHVnaW5EYXRhV2l0aExvYWRhYmxlKG5leHRUaW1lU2VyaWVzRGF0YSwgcGx1Z2luLCB0YWcsIHNhbXBsZSk7CiAgICAgICAgY29uc3QgbG9hZGFibGUgPSBnZXRUaW1lU2VyaWVzTG9hZGFibGUobmV4dFRpbWVTZXJpZXNEYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKTsKICAgICAgICBpZiAoaXNGYWlsZWRUaW1lU2VyaWVzUmVzcG9uc2UocmVzcG9uc2UpKSB7CiAgICAgICAgICAgIGNvbnN0IHJ1bklkcyA9IHJ1bklkCiAgICAgICAgICAgICAgICA/IFtydW5JZF0KICAgICAgICAgICAgICAgIDogZ2V0UnVuSWRzKHN0YXRlLnRhZ01ldGFkYXRhLCBwbHVnaW4sIHRhZywgc2FtcGxlKTsKICAgICAgICAgICAgbG9hZGFibGUucnVuVG9Mb2FkU3RhdGUgPSBjcmVhdGVSdW5Ub0xvYWRTdGF0ZShEYXRhTG9hZFN0YXRlLkZBSUxFRCwgcnVuSWRzLCBsb2FkYWJsZS5ydW5Ub0xvYWRTdGF0ZSk7CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBjb25zdCBydW5Ub1NlcmllcyA9IHJlc3BvbnNlLnJ1blRvU2VyaWVzOwogICAgICAgICAgICBsb2FkYWJsZS5ydW5Ub1NlcmllcyA9IE9iamVjdC5hc3NpZ24oe30sIGxvYWRhYmxlLnJ1blRvU2VyaWVzKTsKICAgICAgICAgICAgbG9hZGFibGUucnVuVG9Mb2FkU3RhdGUgPSBPYmplY3QuYXNzaWduKHt9LCBsb2FkYWJsZS5ydW5Ub0xvYWRTdGF0ZSk7CiAgICAgICAgICAgIGZvciAoY29uc3QgcnVuSWQgaW4gcnVuVG9TZXJpZXMpIHsKICAgICAgICAgICAgICAgIGlmIChydW5Ub1Nlcmllcy5oYXNPd25Qcm9wZXJ0eShydW5JZCkpIHsKICAgICAgICAgICAgICAgICAgICBsb2FkYWJsZS5ydW5Ub1Nlcmllc1tydW5JZF0gPSBydW5Ub1Nlcmllc1tydW5JZF07CiAgICAgICAgICAgICAgICAgICAgbG9hZGFibGUucnVuVG9Mb2FkU3RhdGVbcnVuSWRdID0gRGF0YUxvYWRTdGF0ZS5MT0FERUQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgY29uc3QgbmV4dFN0YXRlID0gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgdGltZVNlcmllc0RhdGE6IG5leHRUaW1lU2VyaWVzRGF0YSwgY2FyZFN0ZXBJbmRleDogYnVpbGROb3JtYWxpemVkQ2FyZFN0ZXBJbmRleE1hcChzdGF0ZS5jYXJkTWV0YWRhdGFNYXAsIHN0YXRlLmNhcmRTdGVwSW5kZXgsIG5leHRUaW1lU2VyaWVzRGF0YSwgc3RhdGUudGltZVNlcmllc0RhdGEpIH0pOwogICAgICAgIHJldHVybiBuZXh0U3RhdGU7CiAgICB9KSwgb24oY2FyZFN0ZXBTbGlkZXJDaGFuZ2VkLCAoc3RhdGUsIHsgY2FyZElkLCBzdGVwSW5kZXggfSkgPT4gewogICAgICAgIGNvbnN0IG1heFN0ZXBJbmRleCA9IGdldE1heFN0ZXBJbmRleChjYXJkSWQsIHN0YXRlLmNhcmRNZXRhZGF0YU1hcCwgc3RhdGUudGltZVNlcmllc0RhdGEpOwogICAgICAgIGxldCBuZXh0U3RlcEluZGV4ID0gc3RlcEluZGV4OwogICAgICAgIGlmIChtYXhTdGVwSW5kZXggPT09IG51bGwpIHsKICAgICAgICAgICAgbmV4dFN0ZXBJbmRleCA9IG51bGw7CiAgICAgICAgfQogICAgICAgIGVsc2UgaWYgKHN0ZXBJbmRleCA+IG1heFN0ZXBJbmRleCkgewogICAgICAgICAgICBuZXh0U3RlcEluZGV4ID0gbWF4U3RlcEluZGV4OwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgY2FyZFN0ZXBJbmRleDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5jYXJkU3RlcEluZGV4KSwgeyBbY2FyZElkXTogbmV4dFN0ZXBJbmRleCB9KSB9KTsKICAgIH0pLCBvbihtZXRyaWNzVGFnR3JvdXBFeHBhbnNpb25DaGFuZ2VkLCAoc3RhdGUsIHsgdGFnR3JvdXAgfSkgPT4gewogICAgICAgIGNvbnN0IHRhZ0dyb3VwRXhwYW5kZWQgPSBuZXcgTWFwKHN0YXRlLnRhZ0dyb3VwRXhwYW5kZWQpOwogICAgICAgIHRhZ0dyb3VwRXhwYW5kZWQuc2V0KHRhZ0dyb3VwLCAhdGFnR3JvdXBFeHBhbmRlZC5nZXQodGFnR3JvdXApKTsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgdGFnR3JvdXBFeHBhbmRlZCB9KTsKICAgIH0pLCBvbihjYXJkVmlzaWJpbGl0eUNoYW5nZWQsIChzdGF0ZSwgeyBlbnRlcmVkQ2FyZHMsIGV4aXRlZENhcmRzIH0pID0+IHsKICAgICAgICBpZiAoZW50ZXJlZENhcmRzLnNpemUgPT09IDAgJiYgZXhpdGVkQ2FyZHMuc2l6ZSA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHZpc2libGVDYXJkcyA9IG5ldyBTZXQoc3RhdGUudmlzaWJsZUNhcmRzKTsKICAgICAgICBlbnRlcmVkQ2FyZHMuZm9yRWFjaCgoY2FyZElkKSA9PiB7CiAgICAgICAgICAgIHZpc2libGVDYXJkcy5hZGQoY2FyZElkKTsKICAgICAgICB9KTsKICAgICAgICBleGl0ZWRDYXJkcy5mb3JFYWNoKChjYXJkSWQpID0+IHsKICAgICAgICAgICAgdmlzaWJsZUNhcmRzLmRlbGV0ZShjYXJkSWQpOwogICAgICAgICAgICBpZiAoZW50ZXJlZENhcmRzLmhhcyhjYXJkSWQpKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEEgJ2NhcmRWaXNpYmlsaXR5Q2hhbmdlZCcgd2l0aCBhbiBpbnZhbGlkIGAgKwogICAgICAgICAgICAgICAgICAgIGBwYXlsb2FkIGNvbnRhaW5zIG92ZXJsYXBwaW5nIHNldHNgKTsKICAgICAgICAgICAgfQogICAgICAgIH0pOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyB2aXNpYmxlQ2FyZHMgfSk7CiAgICB9KSwgb24oY2FyZFBpblN0YXRlVG9nZ2xlZCwgKHN0YXRlLCB7IGNhcmRJZCB9KSA9PiB7CiAgICAgICAgY29uc3QgaXNQaW5uZWRDb3B5ID0gc3RhdGUucGlubmVkQ2FyZFRvT3JpZ2luYWwuaGFzKGNhcmRJZCk7CiAgICAgICAgY29uc3Qgc2hvdWxkUGluID0gaXNQaW5uZWRDb3B5CiAgICAgICAgICAgID8gZmFsc2UKICAgICAgICAgICAgOiAhc3RhdGUuY2FyZFRvUGlubmVkQ29weS5oYXMoY2FyZElkKTsKICAgICAgICBpZiAoc2hvdWxkUGluICYmICFjYW5DcmVhdGVOZXdQaW5zKHN0YXRlKSkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIGxldCBuZXh0Q2FyZFRvUGlubmVkQ29weSA9IG5ldyBNYXAoc3RhdGUuY2FyZFRvUGlubmVkQ29weSk7CiAgICAgICAgbGV0IG5leHRQaW5uZWRDYXJkVG9PcmlnaW5hbCA9IG5ldyBNYXAoc3RhdGUucGlubmVkQ2FyZFRvT3JpZ2luYWwpOwogICAgICAgIGxldCBuZXh0Q2FyZE1ldGFkYXRhTWFwID0gT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUuY2FyZE1ldGFkYXRhTWFwKTsKICAgICAgICBsZXQgbmV4dENhcmRTdGVwSW5kZXhNYXAgPSBPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5jYXJkU3RlcEluZGV4KTsKICAgICAgICBpZiAoaXNQaW5uZWRDb3B5KSB7CiAgICAgICAgICAgIGNvbnN0IG9yaWdpbmFsQ2FyZElkID0gc3RhdGUucGlubmVkQ2FyZFRvT3JpZ2luYWwuZ2V0KGNhcmRJZCk7CiAgICAgICAgICAgIG5leHRDYXJkVG9QaW5uZWRDb3B5LmRlbGV0ZShvcmlnaW5hbENhcmRJZCk7CiAgICAgICAgICAgIG5leHRQaW5uZWRDYXJkVG9PcmlnaW5hbC5kZWxldGUoY2FyZElkKTsKICAgICAgICAgICAgZGVsZXRlIG5leHRDYXJkTWV0YWRhdGFNYXBbY2FyZElkXTsKICAgICAgICAgICAgZGVsZXRlIG5leHRDYXJkU3RlcEluZGV4TWFwW2NhcmRJZF07CiAgICAgICAgfQogICAgICAgIGVsc2UgewogICAgICAgICAgICBpZiAoc2hvdWxkUGluKSB7CiAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZFJlc3VsdCA9IGJ1aWxkT3JSZXR1cm5TdGF0ZVdpdGhQaW5uZWRDb3B5KGNhcmRJZCwgbmV4dENhcmRUb1Bpbm5lZENvcHksIG5leHRQaW5uZWRDYXJkVG9PcmlnaW5hbCwgbmV4dENhcmRTdGVwSW5kZXhNYXAsIG5leHRDYXJkTWV0YWRhdGFNYXApOwogICAgICAgICAgICAgICAgbmV4dENhcmRUb1Bpbm5lZENvcHkgPSByZXNvbHZlZFJlc3VsdC5jYXJkVG9QaW5uZWRDb3B5OwogICAgICAgICAgICAgICAgbmV4dFBpbm5lZENhcmRUb09yaWdpbmFsID0gcmVzb2x2ZWRSZXN1bHQucGlubmVkQ2FyZFRvT3JpZ2luYWw7CiAgICAgICAgICAgICAgICBuZXh0Q2FyZE1ldGFkYXRhTWFwID0gcmVzb2x2ZWRSZXN1bHQuY2FyZE1ldGFkYXRhTWFwOwogICAgICAgICAgICAgICAgbmV4dENhcmRTdGVwSW5kZXhNYXAgPSByZXNvbHZlZFJlc3VsdC5jYXJkU3RlcEluZGV4OwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgY29uc3QgcGlubmVkQ2FyZElkID0gc3RhdGUuY2FyZFRvUGlubmVkQ29weS5nZXQoY2FyZElkKTsKICAgICAgICAgICAgICAgIG5leHRDYXJkVG9QaW5uZWRDb3B5LmRlbGV0ZShjYXJkSWQpOwogICAgICAgICAgICAgICAgbmV4dFBpbm5lZENhcmRUb09yaWdpbmFsLmRlbGV0ZShwaW5uZWRDYXJkSWQpOwogICAgICAgICAgICAgICAgZGVsZXRlIG5leHRDYXJkTWV0YWRhdGFNYXBbcGlubmVkQ2FyZElkXTsKICAgICAgICAgICAgICAgIGRlbGV0ZSBuZXh0Q2FyZFN0ZXBJbmRleE1hcFtwaW5uZWRDYXJkSWRdOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBjYXJkTWV0YWRhdGFNYXA6IG5leHRDYXJkTWV0YWRhdGFNYXAsIGNhcmRTdGVwSW5kZXg6IG5leHRDYXJkU3RlcEluZGV4TWFwLCBjYXJkVG9QaW5uZWRDb3B5OiBuZXh0Q2FyZFRvUGlubmVkQ29weSwgcGlubmVkQ2FyZFRvT3JpZ2luYWw6IG5leHRQaW5uZWRDYXJkVG9PcmlnaW5hbCB9KTsKICAgIH0pKTsKICAgIGZ1bmN0aW9uIHJlZHVjZXJzJDcoc3RhdGUsIGFjdGlvbikgewogICAgICAgIHJldHVybiBjb21wb3NlUmVkdWNlcnMocmVkdWNlciQ1LCByb3V0ZUNvbnRleHRSZWR1Y2VyKShzdGF0ZSwgYWN0aW9uKTsKICAgIH0KICAgIGZ1bmN0aW9uIGJ1aWxkUGx1Z2luVGFnRGF0YSh0YWdNZXRhZGF0YSwgcGx1Z2luVHlwZSkgewogICAgICAgIHJldHVybiB7CiAgICAgICAgICAgIHRhZ0Rlc2NyaXB0aW9uczogdGFnTWV0YWRhdGFbcGx1Z2luVHlwZV0udGFnRGVzY3JpcHRpb25zLAogICAgICAgICAgICB0YWdUb1J1bnM6IGJ1aWxkVGFnVG9SdW5zKHRhZ01ldGFkYXRhW3BsdWdpblR5cGVdLnJ1blRhZ0luZm8pLAogICAgICAgIH07CiAgICB9CiAgICAvKioKICAgICAqIFRha2VzIGEgcnVuLXRvLXRhZyBtYXAgYW5kIGludmVydHMgaXQuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGJ1aWxkVGFnVG9SdW5zKHJ1blRhZ0luZm8pIHsKICAgICAgICBjb25zdCB0YWdUb1J1bnMgPSB7fTsKICAgICAgICBmb3IgKGNvbnN0IHJ1biBpbiBydW5UYWdJbmZvKSB7CiAgICAgICAgICAgIGZvciAoY29uc3QgdGFnIG9mIHJ1blRhZ0luZm9bcnVuXSkgewogICAgICAgICAgICAgICAgdGFnVG9SdW5zW3RhZ10gPSBbLi4uKHRhZ1RvUnVuc1t0YWddIHx8IFtdKSwgcnVuXTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gdGFnVG9SdW5zOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3MvZWZmZWN0cy9pbmRleC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRDYXJkRmV0Y2hJbmZvID0gY3JlYXRlU2VsZWN0b3IoZ2V0Q2FyZExvYWRTdGF0ZSwgZ2V0Q2FyZE1ldGFkYXRhLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGxvYWRTdGF0ZQogICAgICogQHBhcmFtIHs/fSBtYXliZU1ldGFkYXRhCiAgICAgKiBAcGFyYW0gez99IGNhcmRJZAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGxvYWRTdGF0ZSwgbWF5YmVNZXRhZGF0YSwgY2FyZElkIC8qIHByb3BzICovKSA9PiB7CiAgICAgICAgaWYgKCFtYXliZU1ldGFkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBtYXliZU1ldGFkYXRhKSwgeyBsb2FkU3RhdGUsIGlkOiBjYXJkSWQgfSk7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbml0QWN0aW9uJDEgPSBjcmVhdGVBY3Rpb24oJ1tNZXRyaWNzIEVmZmVjdHNdIEluaXQnKTsKICAgIGNsYXNzIE1ldHJpY3NFZmZlY3RzIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFjdGlvbnMkCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqIEBwYXJhbSB7P30gZGF0YVNvdXJjZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGFjdGlvbnMkLCBzdG9yZSwgZGF0YVNvdXJjZSkgewogICAgICAgICAgICB0aGlzLmFjdGlvbnMkID0gYWN0aW9ucyQ7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5kYXRhU291cmNlID0gZGF0YVNvdXJjZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIE91ciBlZmZlY3RzIHJlYWN0IHdoZW4gdGhlIHBsdWdpbiBkYXNoYm9hcmQgaXMgZnVsbHkgInNob3duIiBhbmQgZXhwZXJpbWVudAogICAgICAgICAgICAgKiBpZHMgYXJlIGF2YWlsYWJsZS4gVGhlIGBhY3RpdmVQbHVnaW5gIGFjdHMgYXMgb3VyIHByb3h5IHRvIGtub3cgd2hldGhlciBpdAogICAgICAgICAgICAgKiBpcyBzaG93bi4KICAgICAgICAgICAgICoKICAgICAgICAgICAgICogW01ldHJpY3MgRWZmZWN0c10gSW5pdCAgLSB0aGUgaW5pdGlhbCBgYWN0aXZlUGx1Z2luYCBpcyBzZXQuCiAgICAgICAgICAgICAqIFtDb3JlXSBQbHVnaW4gQ2hhbmdlZCAgIC0gc3Vic2VxdWVudCBgYWN0aXZlUGx1Z2luYCB1cGRhdGVzLgogICAgICAgICAgICAgKiBbQXBwIFJvdXRpbmddIE5hdmlnYXRlZCAtIGV4cGVyaW1lbnQgaWQgdXBkYXRlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZGFzaGJvYXJkU2hvd25XaXRob3V0RGF0YSQgPSB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGluaXRBY3Rpb24kMSwgY2hhbmdlUGx1Z2luLCBuYXZpZ2F0ZWQpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVQbHVnaW4pLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzVGFnTWV0YWRhdGFMb2FkZWQpKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBhY3RpdmVQbHVnaW4sIHRhZ0xvYWRTdGF0ZV0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoYWN0aXZlUGx1Z2luID09PSBNRVRSSUNTX1BMVUdJTl9JRCAmJgogICAgICAgICAgICAgICAgICAgIHRhZ0xvYWRTdGF0ZSA9PT0gRGF0YUxvYWRTdGF0ZS5OT1RfTE9BREVEKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5yZWxvYWRSZXF1ZXN0ZWRXaGlsZVNob3duJCA9IHRoaXMuYWN0aW9ucyQucGlwZShvZlR5cGUocmVsb2FkLCBtYW51YWxSZWxvYWQpLCB3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRBY3RpdmVQbHVnaW4pKSwgZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbLCBhY3RpdmVQbHVnaW5dKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gYWN0aXZlUGx1Z2luID09PSBNRVRSSUNTX1BMVUdJTl9JRDsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5sb2FkVGFnTWV0YWRhdGEkID0gbWVyZ2UodGhpcy5kYXNoYm9hcmRTaG93bldpdGhvdXREYXRhJCwgdGhpcy5yZWxvYWRSZXF1ZXN0ZWRXaGlsZVNob3duJCkucGlwZSh3aXRoTGF0ZXN0RnJvbSh0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzVGFnTWV0YWRhdGFMb2FkZWQpLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50SWRzRnJvbVJvdXRlKSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgdGFnTG9hZFN0YXRlLCBleHBlcmltZW50SWRzXSkgPT4gewogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBXaGVuIGBleHBlcmltZW50SWRzYCBpcyBudWxsLCB0aGUgYWN0dWFsIGlkcyBoYXZlIG5vdAogICAgICAgICAgICAgICAgICogYXBwZWFyZWQgaW4gdGhlIHN0b3JlIHlldC4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgcmV0dXJuIHRhZ0xvYWRTdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HICYmIGV4cGVyaW1lbnRJZHMgIT09IG51bGw7CiAgICAgICAgICAgIH0pKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWV0cmljc1RhZ01ldGFkYXRhUmVxdWVzdGVkKCkpOwogICAgICAgICAgICB9KSksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgLCBleHBlcmltZW50SWRzXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaFRhZ01ldGFkYXRhKCgvKiogQHR5cGUgez99ICovIChleHBlcmltZW50SWRzKSkpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGFnTWV0YWRhdGEKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICh0YWdNZXRhZGF0YSkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWV0cmljc1RhZ01ldGFkYXRhTG9hZGVkKHsgdGFnTWV0YWRhdGEgfSkpOwogICAgICAgICAgICAgICAgfSkpLCBjYXRjaEVycm9yKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1ldHJpY3NUYWdNZXRhZGF0YUZhaWxlZCgpKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnZpc2libGVDYXJkc1dpdGhvdXREYXRhQ2hhbmdlZCQgPSB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKGNhcmRWaXNpYmlsaXR5Q2hhbmdlZCksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLmdldFZpc2libGVDYXJkRmV0Y2hJbmZvcygpLnBpcGUodGFrZSgxKSkpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmZXRjaEluZm9zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmV0Y2hJbmZvcykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoSW5mb3MuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZmV0Y2hJbmZvCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZmV0Y2hJbmZvKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZldGNoSW5mby5sb2FkU3RhdGUgPT09IERhdGFMb2FkU3RhdGUuTk9UX0xPQURFRDsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy52aXNpYmxlQ2FyZHNSZWxvYWRlZCQgPSB0aGlzLnJlbG9hZFJlcXVlc3RlZFdoaWxlU2hvd24kLnBpcGUoc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuZ2V0VmlzaWJsZUNhcmRGZXRjaEluZm9zKCkucGlwZSh0YWtlKDEpKSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZldGNoSW5mb3MKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChmZXRjaEluZm9zKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hJbmZvcy5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmZXRjaEluZm8KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChmZXRjaEluZm8pID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmV0Y2hJbmZvLmxvYWRTdGF0ZSAhPT0gRGF0YUxvYWRTdGF0ZS5MT0FESU5HOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmxvYWRUaW1lU2VyaWVzJCA9IG1lcmdlKHRoaXMudmlzaWJsZUNhcmRzV2l0aG91dERhdGFDaGFuZ2VkJCwgdGhpcy52aXNpYmxlQ2FyZHNSZWxvYWRlZCQpLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmZXRjaEluZm9zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmV0Y2hJbmZvcykgPT4gZmV0Y2hJbmZvcy5sZW5ndGggPiAwKSksIAogICAgICAgICAgICAvLyBJZ25vcmUgY2FyZCB2aXNpYmlsaXR5IGV2ZW50cyB1bnRpbCB3ZSBoYXZlIG5vbi1udWxsCiAgICAgICAgICAgIC8vIGV4cGVyaW1lbnRJZHMuCiAgICAgICAgICAgIHdpdGhMYXRlc3RGcm9tKHRoaXMuc3RvcmUKICAgICAgICAgICAgICAgIC5zZWxlY3QoZ2V0RXhwZXJpbWVudElkc0Zyb21Sb3V0ZSkKICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXhwZXJpbWVudElkcwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGV4cGVyaW1lbnRJZHMpID0+IGV4cGVyaW1lbnRJZHMgIT09IG51bGwpKSkpLCBtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2ZldGNoSW5mb3MsIGV4cGVyaW1lbnRJZHNdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRpbWVTZXJpZXNGb3JDYXJkcyhmZXRjaEluZm9zLCAoLyoqIEB0eXBlIHs/fSAqLyAoZXhwZXJpbWVudElkcykpKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICogSW4gZ2VuZXJhbCwgdGhpcyBlZmZlY3QgZGlzcGF0Y2ggdGhlIGZvbGxvd2luZyBhY3Rpb25zOgogICAgICAgICAgICAgICAqCiAgICAgICAgICAgICAgICogT24gZGFzaGJvYXJkIHNob3duIHdpdGggdmlzaWJsZSBjYXJkczoKICAgICAgICAgICAgICAgKiAtIG1ldHJpY3NUYWdNZXRhZGF0YVJlcXVlc3RlZAogICAgICAgICAgICAgICAqIC0gbXVsdGlwbGVUaW1lU2VyaWVzUmVxdWVzdGVkCiAgICAgICAgICAgICAgICoKICAgICAgICAgICAgICAgKiBPbiByZWxvYWRzOgogICAgICAgICAgICAgICAqIC0gbWV0cmljc1RhZ01ldGFkYXRhUmVxdWVzdGVkCiAgICAgICAgICAgICAgICogLSBtdWx0aXBsZVRpbWVTZXJpZXNSZXF1ZXN0ZWQKICAgICAgICAgICAgICAgKgogICAgICAgICAgICAgICAqIE9uIGRhdGEgc291cmNlIHJlc3BvbnNlczoKICAgICAgICAgICAgICAgKiAtIG1ldHJpY3NUYWdNZXRhZGF0YUxvYWRlZAogICAgICAgICAgICAgICAqIC0gbWV0cmljc1RhZ01ldGFkYXRhRmFpbGVkCiAgICAgICAgICAgICAgICogLSBmZXRjaFRpbWVTZXJpZXNMb2FkZWQKICAgICAgICAgICAgICAgKiAtIGZldGNoVGltZVNlcmllc0ZhaWxlZAogICAgICAgICAgICAgICAqLwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQGV4cG9ydAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hbGxFZmZlY3RzJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UoCiAgICAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAgICAqIFN1YnNjcmliZXMgdG86IGRhc2hib2FyZCBzaG93biwgcm91dGUgbmF2aWdhdGlvbiwgcmVsb2Fkcy4KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdGhpcy5sb2FkVGFnTWV0YWRhdGEkLCAKICAgICAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgICAgICogU3Vic2NyaWJlcyB0bzogY2FyZCB2aXNpYmlsaXR5LCByZWxvYWRzLgogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0aGlzLmxvYWRUaW1lU2VyaWVzJCk7CiAgICAgICAgICAgIH0pLCB7IGRpc3BhdGNoOiBmYWxzZSB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQGV4cG9ydAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdyeE9uSW5pdEVmZmVjdHMoKSB7CiAgICAgICAgICAgIHJldHVybiBpbml0QWN0aW9uJDEoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldFZpc2libGVDYXJkRmV0Y2hJbmZvcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB2aXNpYmxlQ2FyZElkcyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRWaXNpYmxlQ2FyZElkcyk7CiAgICAgICAgICAgIHJldHVybiB2aXNpYmxlQ2FyZElkcyQucGlwZShzd2l0Y2hNYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRJZHMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjYXJkSWRzKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBFeHBsaWNpdGx5IG5vdGlmeSBzdWJzY3JpYmVycyB0aGF0IHRoZXJlIGFyZSBubyB2aXNpYmxlIGNhcmRzLAogICAgICAgICAgICAgICAgLy8gc2luY2UgYGZvcmtKb2luYCBkb2VzIG5vdCBlbWl0IHdoZW4gcGFzc2VkIGFuIGVtcHR5IGFycmF5LgogICAgICAgICAgICAgICAgaWYgKCFjYXJkSWRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihbXSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBvYnNlcnZhYmxlcyA9IGNhcmRJZHMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZElkCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY2FyZElkKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmUuc2VsZWN0KGdldENhcmRGZXRjaEluZm8sIGNhcmRJZCkucGlwZSh0YWtlKDEpKTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHJldHVybiBmb3JrSm9pbihvYnNlcnZhYmxlcyk7CiAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmZXRjaEluZm9zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmV0Y2hJbmZvcykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChmZXRjaEluZm9zLmZpbHRlcihCb29sZWFuKSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcmVxdWVzdAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmV0Y2hUaW1lU2VyaWVzKHJlcXVlc3QpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaFRpbWVTZXJpZXMoW3JlcXVlc3RdKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVzcG9uc2VzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVzcG9uc2VzKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcnMgPSByZXNwb25zZXMuZmlsdGVyKGlzRmFpbGVkVGltZVNlcmllc1Jlc3BvbnNlKTsKICAgICAgICAgICAgICAgIGlmIChlcnJvcnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVGltZSBzZXJpZXMgcmVzcG9uc2UgY29udGFpbmVkIGVycm9yczonLCBlcnJvcnMpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChmZXRjaFRpbWVTZXJpZXNMb2FkZWQoeyByZXNwb25zZTogcmVzcG9uc2VzWzBdIH0pKTsKICAgICAgICAgICAgfSkpLCBjYXRjaEVycm9yKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goZmV0Y2hUaW1lU2VyaWVzRmFpbGVkKHsgcmVxdWVzdCB9KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gb2YobnVsbCk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBmZXRjaEluZm9zCiAgICAgICAgICogQHBhcmFtIHs/fSBleHBlcmltZW50SWRzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaFRpbWVTZXJpZXNGb3JDYXJkcyhmZXRjaEluZm9zLCBleHBlcmltZW50SWRzKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUT0RPKHBzeWJ1enopOiBpZiAyIGNhcmRzIHJlcXVpcmUgdGhlIHNhbWUgZGF0YSwgd2Ugc2hvdWxkIGRlZHVwZSBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAqIG1ha2luZyAyIGlkZW50aWNhbCByZXF1ZXN0cy4KICAgICAgICAgICAgICogQHR5cGUgez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjb25zdCByZXF1ZXN0cyA9IGZldGNoSW5mb3MubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmZXRjaEluZm8KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChmZXRjaEluZm8pID0+IHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgcGx1Z2luLCB0YWcsIHJ1bklkLCBzYW1wbGUgfSA9IGZldGNoSW5mbzsKICAgICAgICAgICAgICAgIHJldHVybiBpc1NpbmdsZVJ1blBsdWdpbihwbHVnaW4pCiAgICAgICAgICAgICAgICAgICAgPyB7IHBsdWdpbiwgdGFnLCBzYW1wbGUsIHJ1bklkOiAoLyoqIEB0eXBlIHs/fSAqLyAocnVuSWQpKSB9CiAgICAgICAgICAgICAgICAgICAgOiB7IHBsdWdpbiwgdGFnLCBzYW1wbGUsIGV4cGVyaW1lbnRJZHMgfTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBGZXRjaCBhbmQgaGFuZGxlIHJlc3BvbnNlcy4KICAgICAgICAgICAgcmV0dXJuIG9mKHJlcXVlc3RzKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVxdWVzdHMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChyZXF1ZXN0cykgPT4gewogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtdWx0aXBsZVRpbWVTZXJpZXNSZXF1ZXN0ZWQoeyByZXF1ZXN0cyB9KSk7CiAgICAgICAgICAgIH0pKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlcXVlc3RzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocmVxdWVzdHMpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG9ic2VydmFibGVzID0gcmVxdWVzdHMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcmVxdWVzdAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHJlcXVlc3QpID0+IHRoaXMuZmV0Y2hUaW1lU2VyaWVzKHJlcXVlc3QpKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbWVyZ2UoLi4ub2JzZXJ2YWJsZXMpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY3NFZmZlY3RzLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNZXRyaWNzRWZmZWN0cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEFjdGlvbnMgfSwKICAgICAgICB7IHR5cGU6IFN0b3JlIH0sCiAgICAgICAgeyB0eXBlOiBNZXRyaWNzRGF0YVNvdXJjZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY3NFZmZlY3RzLsm1ZmFjID0gZnVuY3Rpb24gTWV0cmljc0VmZmVjdHNfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWV0cmljc0VmZmVjdHMpKMm1ybVpbmplY3QoQWN0aW9ucyksIMm1ybVpbmplY3QoU3RvcmUpLCDJtcm1aW5qZWN0KE1ldHJpY3NEYXRhU291cmNlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljc0VmZmVjdHMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTWV0cmljc0VmZmVjdHMsIGZhY3Rvcnk6IE1ldHJpY3NFZmZlY3RzLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9jYXJkX2xhenlfbG9hZGVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGVsZW1lbnRUb0NhcmRJZE1hcCA9IG5ldyBXZWFrTWFwKCk7CiAgICBjbGFzcyBDYXJkT2JzZXJ2ZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEJ1ZmZlciBkZXRlcm1pbmVzIGhvdyBmYXIgYSBjYXJkIGNhbiBiZSwgYmV5b25kIHRoZSByb290J3MgYm91bmRpbmcgcmVjdCwKICAgICAgICAgKiBhbmQgc3RpbGwgYmUgbG9hZGVkLiBJdCBjb3JyZXNwb25kcyB0byBhbiBJbnRlcnNlY3Rpb25PYnNlcnZlcidzCiAgICAgICAgICogJ3Jvb3RNYXJnaW4nLiBGb3IgZXhhbXBsZSwgIjUwcHggMCAxMDBweCAwIicgd2lsbCB0cmVhdCBvYnNlcnZlZCBlbGVtZW50cwogICAgICAgICAqIGFzICdpbnRlcnNlY3RpbmcnIHdoZW4gdGhleSBjb21lIHdpdGhpbiA1MHB4IG9mIHRoZSByb290IHRvcCBvciB3aXRoaW4KICAgICAgICAgKiAxMDBweCBvZiB0aGUgcm9vdCdzIGJvdHRvbS4gQWRkaW5nIGJ1ZmZlciBhbGxvd3MgbmVhcmJ5LCBvZmZzY3JlZW4gY2FyZHMKICAgICAgICAgKiB0byBsb2FkLCBwcmV2ZW50aW5nIGJsYW5rIGNhcmRzIGZyb20gYmVpbmcgc2VlbiB0b28gb2Z0ZW4uCiAgICAgICAgICoKICAgICAgICAgKiBJZiBwb3NpdGl2ZSAncm9vdE1hcmdpbicgaXMgcHJvdmlkZWQsIGEgc2Nyb2xsYWJsZSAncm9vdCcgaXMgcmVxdWlyZWQuCiAgICAgICAgICoKICAgICAgICAgKiBodHRwczovL3czYy5naXRodWIuaW8vSW50ZXJzZWN0aW9uT2JzZXJ2ZXIvI2RvbS1pbnRlcnNlY3Rpb25vYnNlcnZlcmluaXQtcm9vdG1hcmdpbgogICAgICAgICAqIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9JbnRlcnNlY3Rpb25fT2JzZXJ2ZXJfQVBJCiAgICAgICAgICogQHBhcmFtIHs/PX0gcm9vdAogICAgICAgICAqIEBwYXJhbSB7Pz19IGJ1ZmZlcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHJvb3QsIGJ1ZmZlcikgewogICAgICAgICAgICB0aGlzLnJvb3QgPSByb290OwogICAgICAgICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKICAgICAgICAgICAgdGhpcy5kZXN0cm95ZWRUYXJnZXRzID0gbmV3IFNldCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGludGVyc2VjdGlvbkNhbGxiYWNrCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsaXplKGludGVyc2VjdGlvbkNhbGxiYWNrKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5pbnRlcnNlY3Rpb25DYWxsYmFjayA9IGludGVyc2VjdGlvbkNhbGxiYWNrOwogICAgICAgICAgICB0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKHRoaXMub25DYXJkSW50ZXJzZWN0aW9uLmJpbmQodGhpcyksIHsgdGhyZXNob2xkOiAwLCByb290OiB0aGlzLnJvb3QsIHJvb3RNYXJnaW46IHRoaXMuYnVmZmVyIH0pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRhcmdldAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWRkKHRhcmdldCkgewogICAgICAgICAgICBpZiAodGhpcy5lbnN1cmVJbml0aWFsaXplZCgpKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikpLm9ic2VydmUodGFyZ2V0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBZGRzIGEgdGFyZ2V0IHRvIGEgbGlzdCBvZiBlbGVtZW50cyB0by1iZS1kZXN0cm95ZWQsIHNvIHRoYXQgd2UgY2FuIG5vdGlmeQogICAgICAgICAqIGxpc3RlbmVycyB0aGF0IHRoZXkgYmVjb21lICdleGl0ZWRDYXJkcycgYmVmb3JlIHVub2JzZXJ2aW5nIGl0LgogICAgICAgICAqIEBwYXJhbSB7P30gdGFyZ2V0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3aWxsRGVzdHJveSh0YXJnZXQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZW5zdXJlSW5pdGlhbGl6ZWQoKSkgewogICAgICAgICAgICAgICAgdGhpcy5kZXN0cm95ZWRUYXJnZXRzLmFkZCh0YXJnZXQpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBlbnN1cmVJbml0aWFsaXplZCgpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLmludGVyc2VjdGlvbk9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0NhcmRPYnNlcnZlciBtdXN0IGJlIGluaXRpYWxpemVkIGJlZm9yZSB1c2UnKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVudHJpZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ2FyZEludGVyc2VjdGlvbihlbnRyaWVzKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaXRoaW4gYSBzaW5nbGUgY2FsbGJhY2sgZmlyaW5nLCBgZW50cmllc2AgbWF5IGluY2x1ZGUgc2VwYXJhdGUgZW50cmllcwogICAgICAgICAgICAgKiByZXByZXNlbnRpbmcgdGhlIHNhbWUgdGFyZ2V0IGVsZW1lbnQgZW50ZXJpbmcgKGlzSW50ZXJzZWN0aW5nKSBhbmQKICAgICAgICAgICAgICogbGVhdmluZyAoIWlzSW50ZXJzZWN0aW5nKS4gVG8gYWNjb3VudCBmb3IgdGhpcywgd2Ugc29ydCBlbnRyaWVzIGJ5CiAgICAgICAgICAgICAqIGluY3JlYXNpbmcgdGltZXN0YW1wIGFuZCByZXNwZWN0IHRoZSBsYXRlc3Qgb25lLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZW50cmllcy5zb3J0KCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGEsIGIpID0+IGEudGltZSAtIGIudGltZSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGVudGVyZWRDYXJkcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBleGl0ZWRDYXJkcyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgZm9yIChjb25zdCBlbnRyeSBvZiBlbnRyaWVzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB0YXJnZXQgPSBlbnRyeS50YXJnZXQ7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjYXJkSWQgPSBlbGVtZW50VG9DYXJkSWRNYXAuZ2V0KHRhcmdldCk7CiAgICAgICAgICAgICAgICBpZiAoIWNhcmRJZCkgewogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQSBDYXJkT2JzZXJ2ZXIgZWxlbWVudCBtdXN0IGJlIGFzc29jaWF0ZWQgd2l0aCBhIENhcmRJZCcpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7CiAgICAgICAgICAgICAgICAgICAgZW50ZXJlZENhcmRzLmFkZChjYXJkSWQpOwogICAgICAgICAgICAgICAgICAgIGV4aXRlZENhcmRzLmRlbGV0ZShjYXJkSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZW50ZXJlZENhcmRzLmRlbGV0ZShjYXJkSWQpOwogICAgICAgICAgICAgICAgICAgIGV4aXRlZENhcmRzLmFkZChjYXJkSWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAgICAgKiBDbGVhbnVwIGRlc3Ryb3llZCB0YXJnZXRzLiBEZWZlbmQgYWdhaW5zdCBzcGVjdWxhdGl2ZSBjYXNlIHdoZW4KICAgICAgICAgICAgICAgICAqIC0gQSBlbnRlcnMgdmlld3BvcnQKICAgICAgICAgICAgICAgICAqIC0gQiBhZGRlZCB0byBkZXN0cm95ZWQgdGFyZ2V0cwogICAgICAgICAgICAgICAgICogLSBDYWxsYmFjayBmaXJlcyBmb3IganVzdCBBLCB1bm9ic2VydmluZyBCCiAgICAgICAgICAgICAgICAgKiAtIEIncyBjYWxsYmFjayBuZXZlciBmaXJlcwogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBpZiAodGhpcy5kZXN0cm95ZWRUYXJnZXRzLmhhcyh0YXJnZXQpICYmICFlbnRyeS5pc0ludGVyc2VjdGluZykgewogICAgICAgICAgICAgICAgICAgIHRoaXMuZGVzdHJveWVkVGFyZ2V0cy5kZWxldGUodGFyZ2V0KTsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5pbnRlcnNlY3Rpb25PYnNlcnZlcikpLnVub2JzZXJ2ZSh0YXJnZXQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh0aGlzLmludGVyc2VjdGlvbkNhbGxiYWNrKSkoZW50ZXJlZENhcmRzLCBleGl0ZWRDYXJkcyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZW50cmllcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25DYXJkSW50ZXJzZWN0aW9uRm9yVGVzdChlbnRyaWVzKSB7CiAgICAgICAgICAgIHRoaXMub25DYXJkSW50ZXJzZWN0aW9uKGVudHJpZXMpOwogICAgICAgIH0KICAgIH0KICAgIC8qKgogICAgICogQSBkaXJlY3RpdmUgYXBwbGllZCB0byBlbGVtZW50cyB0aGF0IHJlcHJlc2VudCBhIGNhcmQgY29udGFpbmVyLiBXaGVuIHRoZQogICAgICogZWxlbWVudCBpcyByZWFkeSB0byBiZSBsb2FkZWQsIHRoaXMgaXMgcmVzcG9uc2libGUgZm9yIG1hcmtpbmcgY2FyZElkIGFzCiAgICAgKiB2aXNpYmxlLgogICAgICoKICAgICAqIENhcmQgY29udGFpbmVyOgogICAgICoKICAgICAqIDxkaXYgW2NhcmRMYXp5TG9hZGVyXT0iY2FyZDEiPjwvZGl2PgogICAgICoKICAgICAqIENhcmQgY29udGFpbmVyIHRoYXQgY2FuIGxvYWQgd2l0aGluIDEwMHB4IG9mIGEgc2Nyb2xsYWJsZSBlbGVtZW50J3MgYm91bmRpbmcKICAgICAqIGJveDoKICAgICAqCiAgICAgKiA8ZGl2CiAgICAgKiAgIFtjYXJkTGF6eUxvYWRlcl09ImNhcmQxIgogICAgICogICBbY2FyZE9ic2VydmVyXT0ibmV3IENhcmRPYnNlcnZlcihzY3JvbGxhYmxlRWxlbWVudCwgJzEwMHB4JykiCiAgICAgKiA+PC9kaXY+CiAgICAgKi8KICAgIGNsYXNzIENhcmRMYXp5TG9hZGVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGhvc3QKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaG9zdCwgc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVudGVyZWRDYXJkcwogICAgICAgICAqIEBwYXJhbSB7P30gZXhpdGVkQ2FyZHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ2FyZEludGVyc2VjdGlvbihlbnRlcmVkQ2FyZHMsIGV4aXRlZENhcmRzKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goY2FyZFZpc2liaWxpdHlDaGFuZ2VkKHsgZW50ZXJlZENhcmRzLCBleGl0ZWRDYXJkcyB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIGVsZW1lbnRUb0NhcmRJZE1hcC5zZXQodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsIHRoaXMuY2FyZElkKTsKICAgICAgICAgICAgaWYgKCF0aGlzLmNhcmRPYnNlcnZlcikgewogICAgICAgICAgICAgICAgdGhpcy5jYXJkT2JzZXJ2ZXIgPSBuZXcgQ2FyZE9ic2VydmVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5jYXJkT2JzZXJ2ZXIuaW5pdGlhbGl6ZSh0aGlzLm9uQ2FyZEludGVyc2VjdGlvbi5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgdGhpcy5jYXJkT2JzZXJ2ZXIuYWRkKHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuY2FyZE9ic2VydmVyKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNhcmRPYnNlcnZlci53aWxsRGVzdHJveSh0aGlzLmhvc3QubmF0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBob3N0Rm9yVGVzdCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaG9zdDsKICAgICAgICB9CiAgICB9CiAgICBDYXJkTGF6eUxvYWRlci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnW2NhcmRMYXp5TG9hZGVyXScsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENhcmRMYXp5TG9hZGVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIENhcmRMYXp5TG9hZGVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNhcmRJZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnY2FyZExhenlMb2FkZXInLF0gfV0sCiAgICAgICAgY2FyZE9ic2VydmVyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDYXJkTGF6eUxvYWRlci7JtWZhYyA9IGZ1bmN0aW9uIENhcmRMYXp5TG9hZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENhcmRMYXp5TG9hZGVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ2FyZExhenlMb2FkZXIuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogQ2FyZExhenlMb2FkZXIsIHNlbGVjdG9yczogW1siIiwgImNhcmRMYXp5TG9hZGVyIiwgIiJdXSwgaW5wdXRzOiB7IGNhcmRJZDogWyJjYXJkTGF6eUxvYWRlciIsICJjYXJkSWQiXSwgY2FyZE9ic2VydmVyOiAiY2FyZE9ic2VydmVyIiB9IH0pOwoKICAgIGZ1bmN0aW9uIGdyb3VwQ2FyZElkV2l0aE1ldGRhdGEoY2FyZHMpIHsKICAgICAgICBjb25zdCB0YWdQcmVmaXggPSBuZXcgTWFwKCk7CiAgICAgICAgY29uc3Qgc29ydGVkQ2FyZHMgPSBjYXJkcy5zbGljZSgpLnNvcnQoKGNhcmRBLCBjYXJkQikgPT4gewogICAgICAgICAgICByZXR1cm4gY29tcGFyZVRhZ05hbWVzKGNhcmRBLnRhZywgY2FyZEIudGFnKTsKICAgICAgICB9KTsKICAgICAgICBmb3IgKGNvbnN0IGNhcmQgb2Ygc29ydGVkQ2FyZHMpIHsKICAgICAgICAgICAgY29uc3QgZ3JvdXBOYW1lID0gZ2V0VGFnR3JvdXBOYW1lKGNhcmQudGFnKTsKICAgICAgICAgICAgaWYgKCF0YWdQcmVmaXguaGFzKGdyb3VwTmFtZSkpIHsKICAgICAgICAgICAgICAgIHRhZ1ByZWZpeC5zZXQoZ3JvdXBOYW1lLCB7IGdyb3VwTmFtZSwgaXRlbXM6IFtdIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRhZ1ByZWZpeC5nZXQoZ3JvdXBOYW1lKS5pdGVtcy5wdXNoKGNhcmQpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gWy4uLnRhZ1ByZWZpeC52YWx1ZXMoKV07CiAgICB9CiAgICBmdW5jdGlvbiBnZXRUYWdHcm91cE5hbWUodGFnKSB7CiAgICAgICAgcmV0dXJuIHRhZy5zcGxpdCgnLycsIDEpWzBdOwogICAgfQogICAgY29uc3QgSUdOT1JFRF9UQUdfU1VGRklYID0gJy9zY2FsYXJfc3VtbWFyeSc7CiAgICBmdW5jdGlvbiBnZXRUYWdEaXNwbGF5TmFtZSh0YWcsIGdyb3VwTmFtZSkgewogICAgICAgIC8vIFJlbW92ZSBncm91cCBuYW1lIHByZWZpeC4KICAgICAgICBsZXQgcmVzdWx0ID0gdGFnOwogICAgICAgIGlmIChncm91cE5hbWUgJiYgdGFnLnN0YXJ0c1dpdGgoZ3JvdXBOYW1lICsgJy8nKSkgewogICAgICAgICAgICByZXN1bHQgPSB0YWcuc2xpY2UoZ3JvdXBOYW1lLmxlbmd0aCArIDEpOwogICAgICAgIH0KICAgICAgICAvLyBSZW1vdmUgdGhlIFYxIHNjYWxhciBzdW1tYXJ5IHN1ZmZpeC4gU2VlIHRyYWRpdGlvbmFsIFRCIGxvZ2ljIGluCiAgICAgICAgLy8gdGVuc29yYm9hcmQvcGx1Z2lucy9zY2FsYXIvdGZfc2NhbGFyX2Rhc2hib2FyZC90Zi1zY2FsYXItZGFzaGJvYXJkLmh0bWwKICAgICAgICBpZiAocmVzdWx0LmVuZHNXaXRoKElHTk9SRURfVEFHX1NVRkZJWCkpIHsKICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIC1JR05PUkVEX1RBR19TVUZGSVgubGVuZ3RoKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdCB8fCB0YWc7CiAgICB9CiAgICAvLyBUT0RPKGIvMTU0MDU1MzI4KTogY29tYmluZSB0aGlzIHdpdGggdGhlIE9TUyB0c19saWJyYXJ5IGNvbXBhdCB2ZXJzaW9uLgogICAgLy8gQWRvcHRlZCBmcm9tIHRlbnNvcmJvYXJkL2NvbXBvbmVudHMvdnpfc29ydGluZy9zb3J0aW5nLmpzCiAgICAvLyBEZWx0YToKICAgIC8vIC0gYmV0dGVyIHR5cGluZwogICAgLy8gLSBodW1hbiByZWFkYWJsZSB2YXJpYWJsZSBuYW1lcwogICAgLy8gLSByZW1vdmVkIGNvbXBvbmVudGl6YXRpb24gYnkgIl8iLgogICAgLyoqCiAgICAgKiBDb21wYXJlcyB0YWcgbmFtZXMgYXNjaWludW1lcmljYWxseSBicm9rZW4gaW50byBjb21wb25lbnRzLgogICAgICoKICAgICAqIFVubGlrZSB0aGUgc3RhbmRhcmQgYXNjaWliZXRpY2FsIGNvbXBhcmF0b3IsIHRoaXMgZnVuY3Rpb24ga25vd3MgdGhhdCAnYTEwYicKICAgICAqID4gJ2EyYicuIEZpeGVkIHBvaW50IGFuZCBlbmdpbmVlcmluZyBub3RhdGlvbiBhcmUgc3VwcG9ydGVkLiBUaGlzIGZ1bmN0aW9uCiAgICAgKiBhbHNvIHNwbGl0cyB0aGUgaW5wdXQgYnkgc2xhc2ggdG8gcGVyZm9ybSBhcnJheSBjb21wYXJpc29uLiBUaGVyZWZvcmUgaXQKICAgICAqIGtub3dzIHRoYXQgJ2EvYScgPCAnYSsvYScgZXZlbiB0aG91Z2ggJysnIDwgJy8nIGluIHRoZSBBU0NJSSB0YWJsZS4KICAgICAqLwogICAgZnVuY3Rpb24gY29tcGFyZVRhZ05hbWVzKHRhZ0EsIHRhZ0IpIHsKICAgICAgICBsZXQgYUluZGV4ID0gMDsKICAgICAgICBsZXQgYkluZGV4ID0gMDsKICAgICAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgICAgICBpZiAoYUluZGV4ID09PSB0YWdBLmxlbmd0aCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGJJbmRleCA9PT0gdGFnQi5sZW5ndGggPyAwIDogLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGJJbmRleCA9PT0gdGFnQi5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0RpZ2l0KHRhZ0FbYUluZGV4XSkgJiYgaXNEaWdpdCh0YWdCW2JJbmRleF0pKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhTnVtYmVyU3RhcnQgPSBhSW5kZXg7CiAgICAgICAgICAgICAgICBjb25zdCBiTnVtYmVyU3RhcnQgPSBiSW5kZXg7CiAgICAgICAgICAgICAgICBhSW5kZXggPSBjb25zdW1lTnVtYmVyKHRhZ0EsIGFJbmRleCArIDEpOwogICAgICAgICAgICAgICAgYkluZGV4ID0gY29uc3VtZU51bWJlcih0YWdCLCBiSW5kZXggKyAxKTsKICAgICAgICAgICAgICAgIGNvbnN0IGFuID0gTnVtYmVyKHRhZ0Euc2xpY2UoYU51bWJlclN0YXJ0LCBhSW5kZXgpKTsKICAgICAgICAgICAgICAgIGNvbnN0IGJuID0gTnVtYmVyKHRhZ0Iuc2xpY2UoYk51bWJlclN0YXJ0LCBiSW5kZXgpKTsKICAgICAgICAgICAgICAgIGlmIChhbiA8IGJuKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGFuID4gYm4pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc0JyZWFrKHRhZ0FbYUluZGV4XSkpIHsKICAgICAgICAgICAgICAgIGlmICghaXNCcmVhayh0YWdCW2JJbmRleF0pKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKGlzQnJlYWsodGFnQltiSW5kZXhdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIDE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGFnQVthSW5kZXhdIDwgdGFnQltiSW5kZXhdKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gLTE7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGFnQVthSW5kZXhdID4gdGFnQltiSW5kZXhdKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhSW5kZXgrKzsKICAgICAgICAgICAgYkluZGV4Kys7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBSZXR1cm5zIGVuZEluZGV4IG9mIGEgbnVtYmVyIHNlcXVlbmNlIGluIHN0cmluZyBzdGFydGluZyBmcm9tIHN0YXJ0SW5kZXguCiAgICAgKgogICAgICogVGhlIG1ldGhvZCBjYW4gaGFuZGxlIHNjaWVudGlmaWMgbm90YXRpb24sIHJlYWwgYW5kIG5hdHVyYWwgbnVtYmVycywgYW5kCiAgICAgKiBudW1iZXJzIHdpdGggZXhwb25lbnRzLiBEbyBub3RlIHRoYXQgaXQgZG9lcyBub3QgdHJlYXQgZGVjaW1hbHMgdGhhdCBzdGFydAogICAgICogd2l0aCAiLiIgYXMgYSByZWFsIG51bWJlci4KICAgICAqLwogICAgZnVuY3Rpb24gY29uc3VtZU51bWJlcihzLCBzdGFydEluZGV4KSB7CiAgICAgICAgbGV0IFN0YXRlOwogICAgICAgIChmdW5jdGlvbiAoU3RhdGUpIHsKICAgICAgICAgICAgU3RhdGVbU3RhdGVbIk5BVFVSQUwiXSA9IDBdID0gIk5BVFVSQUwiOwogICAgICAgICAgICBTdGF0ZVtTdGF0ZVsiUkVBTCJdID0gMV0gPSAiUkVBTCI7CiAgICAgICAgICAgIFN0YXRlW1N0YXRlWyJFWFBPTkVOVF9TSUdOIl0gPSAyXSA9ICJFWFBPTkVOVF9TSUdOIjsKICAgICAgICAgICAgU3RhdGVbU3RhdGVbIkVYUE9ORU5UIl0gPSAzXSA9ICJFWFBPTkVOVCI7CiAgICAgICAgfSkoU3RhdGUgfHwgKFN0YXRlID0ge30pKTsKICAgICAgICBsZXQgc3RhdGUgPSBTdGF0ZS5OQVRVUkFMOwogICAgICAgIGxldCBpID0gc3RhcnRJbmRleDsKICAgICAgICBmb3IgKDsgaSA8IHMubGVuZ3RoOyBpKyspIHsKICAgICAgICAgICAgaWYgKHN0YXRlID09PSBTdGF0ZS5OQVRVUkFMKSB7CiAgICAgICAgICAgICAgICBpZiAoc1tpXSA9PT0gJy4nKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5SRUFMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoc1tpXSA9PT0gJ2UnIHx8IHNbaV0gPT09ICdFJykgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuRVhQT05FTlRfU0lHTjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFpc0RpZ2l0KHNbaV0pKSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoc3RhdGUgPT09IFN0YXRlLlJFQUwpIHsKICAgICAgICAgICAgICAgIGlmIChzW2ldID09PSAnZScgfHwgc1tpXSA9PT0gJ0UnKSB7CiAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5FWFBPTkVOVF9TSUdOOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoIWlzRGlnaXQoc1tpXSkpIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gU3RhdGUuRVhQT05FTlRfU0lHTikgewogICAgICAgICAgICAgICAgaWYgKGlzRGlnaXQoc1tpXSkgfHwgc1tpXSA9PT0gJysnIHx8IHNbaV0gPT09ICctJykgewogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuRVhQT05FTlQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChzdGF0ZSA9PT0gU3RhdGUuRVhQT05FTlQpIHsKICAgICAgICAgICAgICAgIGlmICghaXNEaWdpdChzW2ldKSkgewogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBpOwogICAgfQogICAgZnVuY3Rpb24gaXNEaWdpdChjaGFyYWN0ZXIpIHsKICAgICAgICByZXR1cm4gJzAnIDw9IGNoYXJhY3RlciAmJiBjaGFyYWN0ZXIgPD0gJzknOwogICAgfQogICAgZnVuY3Rpb24gaXNCcmVhayhjaGFyYWN0ZXIpIHsKICAgICAgICByZXR1cm4gY2hhcmFjdGVyID09PSAnLycgfHwgaXNEaWdpdChjaGFyYWN0ZXIpOwogICAgfQoKICAgIGNvbnN0IF9jMCRyID0gWyJwYW5lbCJdOwogICAgZnVuY3Rpb24gTWF0QXV0b2NvbXBsZXRlX25nX3RlbXBsYXRlXzBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCwgMSk7CiAgICAgICAgybXJtXByb2plY3Rpb24oMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiaWQiLCBjdHhfcjAuaWQpKCJuZ0NsYXNzIiwgY3R4X3IwLl9jbGFzc0xpc3QpOwogICAgfSB9CiAgICBjb25zdCBfYzEkaCA9IFsiKiJdOwogICAgbGV0IF91bmlxdWVBdXRvY29tcGxldGVJZENvdW50ZXIgPSAwOwogICAgLyoqCiAgICAgKiBFdmVudCBvYmplY3QgdGhhdCBpcyBlbWl0dGVkIHdoZW4gYW4gYXV0b2NvbXBsZXRlIG9wdGlvbiBpcyBzZWxlY3RlZC4KICAgICAqLwogICAgY2xhc3MgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzb3VyY2UKICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgb3B0aW9uKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICB0aGlzLm9wdGlvbiA9IG9wdGlvbjsKICAgICAgICB9CiAgICB9CiAgICAvLyBCb2lsZXJwbGF0ZSBmb3IgYXBwbHlpbmcgbWl4aW5zIHRvIE1hdEF1dG9jb21wbGV0ZS4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0QXV0b2NvbXBsZXRlQmFzZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0QXV0b2NvbXBsZXRlTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlUmlwcGxlKE1hdEF1dG9jb21wbGV0ZUJhc2UpOwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdG8gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciBgbWF0LWF1dG9jb21wbGV0ZWAuCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1hdXRvY29tcGxldGUtZGVmYXVsdC1vcHRpb25zJywgewogICAgICAgIHByb3ZpZGVkSW46ICdyb290JywKICAgICAgICBmYWN0b3J5OiBNQVRfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OU19GQUNUT1JZLAogICAgfSk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBNQVRfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OU19GQUNUT1JZKCkgewogICAgICAgIHJldHVybiB7IGF1dG9BY3RpdmVGaXJzdE9wdGlvbjogZmFsc2UgfTsKICAgIH0KICAgIGNsYXNzIE1hdEF1dG9jb21wbGV0ZSBleHRlbmRzIF9NYXRBdXRvY29tcGxldGVNaXhpbkJhc2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdHMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfY2hhbmdlRGV0ZWN0b3JSZWYsIF9lbGVtZW50UmVmLCBkZWZhdWx0cykgewogICAgICAgICAgICBzdXBlcigpOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9hY3RpdmVPcHRpb25DaGFuZ2VzID0gU3Vic2NyaXB0aW9uLkVNUFRZOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsIHNob3VsZCBiZSB2aXNpYmxlLCBkZXBlbmRpbmcgb24gb3B0aW9uIGxlbmd0aC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2hvd1BhbmVsID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2lzT3BlbiA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRnVuY3Rpb24gdGhhdCBtYXBzIGFuIG9wdGlvbidzIGNvbnRyb2wgdmFsdWUgdG8gaXRzIGRpc3BsYXkgdmFsdWUgaW4gdGhlIHRyaWdnZXIuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmRpc3BsYXlXaXRoID0gbnVsbDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IHRoYXQgaXMgZW1pdHRlZCB3aGVuZXZlciBhbiBvcHRpb24gZnJvbSB0aGUgbGlzdCBpcyBzZWxlY3RlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub3B0aW9uU2VsZWN0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsIGlzIG9wZW5lZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMub3BlbmVkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIGF1dG9jb21wbGV0ZSBwYW5lbCBpcyBjbG9zZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNsb3NlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXRzIHdoZW5ldmVyIGFuIG9wdGlvbiBpcyBhY3RpdmF0ZWQgdXNpbmcgdGhlIGtleWJvYXJkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vcHRpb25BY3RpdmF0ZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuX2NsYXNzTGlzdCA9IHt9OwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVW5pcXVlIElEIHRvIGJlIHVzZWQgYnkgYXV0b2NvbXBsZXRlIHRyaWdnZXIncyAiYXJpYS1vd25zIiBwcm9wZXJ0eS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaWQgPSBgbWF0LWF1dG9jb21wbGV0ZS0ke191bmlxdWVBdXRvY29tcGxldGVJZENvdW50ZXIrK31gOwogICAgICAgICAgICB0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb24gPSAhIWRlZmF1bHRzLmF1dG9BY3RpdmVGaXJzdE9wdGlvbjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsIGlzIG9wZW4uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaXNPcGVuKCkgeyByZXR1cm4gdGhpcy5faXNPcGVuICYmIHRoaXMuc2hvd1BhbmVsOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgZmlyc3Qgb3B0aW9uIHNob3VsZCBiZSBoaWdobGlnaHRlZCB3aGVuIHRoZSBhdXRvY29tcGxldGUgcGFuZWwgaXMgb3BlbmVkLgogICAgICAgICAqIENhbiBiZSBjb25maWd1cmVkIGdsb2JhbGx5IHRocm91Z2ggdGhlIGBNQVRfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OU2AgdG9rZW4uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXV0b0FjdGl2ZUZpcnN0T3B0aW9uKCkgeyByZXR1cm4gdGhpcy5fYXV0b0FjdGl2ZUZpcnN0T3B0aW9uOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGF1dG9BY3RpdmVGaXJzdE9wdGlvbih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9hdXRvQWN0aXZlRmlyc3RPcHRpb24gPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUYWtlcyBjbGFzc2VzIHNldCBvbiB0aGUgaG9zdCBtYXQtYXV0b2NvbXBsZXRlIGVsZW1lbnQgYW5kIGFwcGxpZXMgdGhlbSB0byB0aGUgcGFuZWwKICAgICAgICAgKiBpbnNpZGUgdGhlIG92ZXJsYXkgY29udGFpbmVyIHRvIGFsbG93IGZvciBlYXN5IHN0eWxpbmcuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGNsYXNzTGlzdCh2YWx1ZSkgewogICAgICAgICAgICBpZiAodmFsdWUgJiYgdmFsdWUubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jbGFzc0xpc3QgPSB2YWx1ZS5zcGxpdCgnICcpLnJlZHVjZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNsYXNzTGlzdAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc05hbWUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChjbGFzc0xpc3QsIGNsYXNzTmFtZSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNsYXNzTGlzdFtjbGFzc05hbWUudHJpbSgpXSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzTGlzdDsKICAgICAgICAgICAgICAgIH0pLCAoLyoqIEB0eXBlIHs/fSAqLyAoe30pKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jbGFzc0xpc3QgPSB7fTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9zZXRWaXNpYmlsaXR5Q2xhc3Nlcyh0aGlzLl9jbGFzc0xpc3QpOwogICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuY2xhc3NOYW1lID0gJyc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlckNvbnRlbnRJbml0KCkgewogICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyID0gbmV3IEFjdGl2ZURlc2NlbmRhbnRLZXlNYW5hZ2VyKHRoaXMub3B0aW9ucykud2l0aFdyYXAoKTsKICAgICAgICAgICAgdGhpcy5fYWN0aXZlT3B0aW9uQ2hhbmdlcyA9IHRoaXMuX2tleU1hbmFnZXIuY2hhbmdlLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGluZGV4ID0+IHsKICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uQWN0aXZhdGVkLmVtaXQoeyBzb3VyY2U6IHRoaXMsIG9wdGlvbjogdGhpcy5vcHRpb25zLnRvQXJyYXkoKVtpbmRleF0gfHwgbnVsbCB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAvLyBTZXQgdGhlIGluaXRpYWwgdmlzaWJpbGl0eSBzdGF0ZS4KICAgICAgICAgICAgdGhpcy5fc2V0VmlzaWJpbGl0eSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9hY3RpdmVPcHRpb25DaGFuZ2VzLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNldHMgdGhlIHBhbmVsIHNjcm9sbFRvcC4gVGhpcyBhbGxvd3MgdXMgdG8gbWFudWFsbHkgc2Nyb2xsIHRvIGRpc3BsYXkgb3B0aW9ucwogICAgICAgICAqIGFib3ZlIG9yIGJlbG93IHRoZSBmb2xkLCBhcyB0aGV5IGFyZSBub3QgYWN0dWFsbHkgYmVpbmcgZm9jdXNlZCB3aGVuIGFjdGl2ZS4KICAgICAgICAgKiBAcGFyYW0gez99IHNjcm9sbFRvcAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFNjcm9sbFRvcChzY3JvbGxUb3ApIHsKICAgICAgICAgICAgaWYgKHRoaXMucGFuZWwpIHsKICAgICAgICAgICAgICAgIHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgPSBzY3JvbGxUb3A7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgcGFuZWwncyBzY3JvbGxUb3AuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0U2Nyb2xsVG9wKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5wYW5lbCA/IHRoaXMucGFuZWwubmF0aXZlRWxlbWVudC5zY3JvbGxUb3AgOiAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBQYW5lbCBzaG91bGQgaGlkZSBpdHNlbGYgd2hlbiB0aGUgb3B0aW9uIGxpc3QgaXMgZW1wdHkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VmlzaWJpbGl0eSgpIHsKICAgICAgICAgICAgdGhpcy5zaG93UGFuZWwgPSAhIXRoaXMub3B0aW9ucy5sZW5ndGg7CiAgICAgICAgICAgIHRoaXMuX3NldFZpc2liaWxpdHlDbGFzc2VzKHRoaXMuX2NsYXNzTGlzdCk7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyB0aGUgYHNlbGVjdGAgZXZlbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBvcHRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9lbWl0U2VsZWN0RXZlbnQob3B0aW9uKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWF0QXV0b2NvbXBsZXRlU2VsZWN0ZWRFdmVudCh0aGlzLCBvcHRpb24pOwogICAgICAgICAgICB0aGlzLm9wdGlvblNlbGVjdGVkLmVtaXQoZXZlbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTZXRzIHRoZSBhdXRvY29tcGxldGUgdmlzaWJpbGl0eSBjbGFzc2VzIG9uIGEgY2xhc3NsaXN0IGJhc2VkIG9uIHRoZSBwYW5lbCBpcyB2aXNpYmxlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjbGFzc0xpc3QKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRWaXNpYmlsaXR5Q2xhc3NlcyhjbGFzc0xpc3QpIHsKICAgICAgICAgICAgY2xhc3NMaXN0WydtYXQtYXV0b2NvbXBsZXRlLXZpc2libGUnXSA9IHRoaXMuc2hvd1BhbmVsOwogICAgICAgICAgICBjbGFzc0xpc3RbJ21hdC1hdXRvY29tcGxldGUtaGlkZGVuJ10gPSAhdGhpcy5zaG93UGFuZWw7CiAgICAgICAgfQogICAgfQogICAgTWF0QXV0b2NvbXBsZXRlLsm1ZmFjID0gZnVuY3Rpb24gTWF0QXV0b2NvbXBsZXRlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEF1dG9jb21wbGV0ZSkoybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0FVVE9DT01QTEVURV9ERUZBVUxUX09QVElPTlMpKTsgfTsKICAgIE1hdEF1dG9jb21wbGV0ZS7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYXRBdXRvY29tcGxldGUsIHNlbGVjdG9yczogW1sibWF0LWF1dG9jb21wbGV0ZSJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdEF1dG9jb21wbGV0ZV9Db250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJJbmRleCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdE9wdGlvbiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdE9wdGdyb3VwLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4Lm9wdGlvbnMgPSBfdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgub3B0aW9uR3JvdXBzID0gX3QpOwogICAgICAgIH0gfSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoVGVtcGxhdGVSZWYsIHRydWUpOwogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMCRyLCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnRlbXBsYXRlID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnBhbmVsID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1hdXRvY29tcGxldGUiXSwgaW5wdXRzOiB7IGRpc2FibGVSaXBwbGU6ICJkaXNhYmxlUmlwcGxlIiwgZGlzcGxheVdpdGg6ICJkaXNwbGF5V2l0aCIsIGF1dG9BY3RpdmVGaXJzdE9wdGlvbjogImF1dG9BY3RpdmVGaXJzdE9wdGlvbiIsIGNsYXNzTGlzdDogWyJjbGFzcyIsICJjbGFzc0xpc3QiXSwgcGFuZWxXaWR0aDogInBhbmVsV2lkdGgiIH0sIG91dHB1dHM6IHsgb3B0aW9uU2VsZWN0ZWQ6ICJvcHRpb25TZWxlY3RlZCIsIG9wZW5lZDogIm9wZW5lZCIsIGNsb3NlZDogImNsb3NlZCIsIG9wdGlvbkFjdGl2YXRlZDogIm9wdGlvbkFjdGl2YXRlZCIgfSwgZXhwb3J0QXM6IFsibWF0QXV0b2NvbXBsZXRlIl0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoWwogICAgICAgICAgICAgICAgeyBwcm92aWRlOiBNQVRfT1BUSU9OX1BBUkVOVF9DT01QT05FTlQsIHVzZUV4aXN0aW5nOiBNYXRBdXRvY29tcGxldGUgfQogICAgICAgICAgICBdKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJGgsIGRlY2xzOiAxLCB2YXJzOiAwLCBjb25zdHM6IFtbInJvbGUiLCAibGlzdGJveCIsIDEsICJtYXQtYXV0b2NvbXBsZXRlLXBhbmVsIiwgMywgImlkIiwgIm5nQ2xhc3MiXSwgWyJwYW5lbCIsICIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVwcm9qZWN0aW9uRGVmKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgwLCBNYXRBdXRvY29tcGxldGVfbmdfdGVtcGxhdGVfMF9UZW1wbGF0ZSwgMywgMiwgIm5nLXRlbXBsYXRlIik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdDbGFzc10sIHN0eWxlczogWyIubWF0LWF1dG9jb21wbGV0ZS1wYW5lbHttaW4td2lkdGg6MTEycHg7bWF4LXdpZHRoOjI4MHB4O292ZXJmbG93OmF1dG87LXdlYmtpdC1vdmVyZmxvdy1zY3JvbGxpbmc6dG91Y2g7dmlzaWJpbGl0eTpoaWRkZW47bWF4LXdpZHRoOm5vbmU7bWF4LWhlaWdodDoyNTZweDtwb3NpdGlvbjpyZWxhdGl2ZTt3aWR0aDoxMDAlO2JvcmRlci1ib3R0b20tbGVmdC1yYWRpdXM6NHB4O2JvcmRlci1ib3R0b20tcmlnaHQtcmFkaXVzOjRweH0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbC5tYXQtYXV0b2NvbXBsZXRlLXZpc2libGV7dmlzaWJpbGl0eTp2aXNpYmxlfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsLm1hdC1hdXRvY29tcGxldGUtaGlkZGVue3Zpc2liaWxpdHk6aGlkZGVufS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsLWFib3ZlIC5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JvcmRlci1yYWRpdXM6MDtib3JkZXItdG9wLWxlZnQtcmFkaXVzOjRweDtib3JkZXItdG9wLXJpZ2h0LXJhZGl1czo0cHh9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWwgLm1hdC1kaXZpZGVyLWhvcml6b250YWx7bWFyZ2luLXRvcDotMXB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1hdXRvY29tcGxldGUtcGFuZWx7b3V0bGluZTpzb2xpZCAxcHh9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRBdXRvY29tcGxldGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfQVVUT0NPTVBMRVRFX0RFRkFVTFRfT1BUSU9OUyxdIH1dIH0KICAgIF07CiAgICBNYXRBdXRvY29tcGxldGUucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdGVtcGxhdGU6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogW1RlbXBsYXRlUmVmLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0sCiAgICAgICAgcGFuZWw6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydwYW5lbCcsXSB9XSwKICAgICAgICBvcHRpb25zOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRPcHRpb24sIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dLAogICAgICAgIG9wdGlvbkdyb3VwczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbTWF0T3B0Z3JvdXAsIHsgZGVzY2VuZGFudHM6IHRydWUgfSxdIH1dLAogICAgICAgIGRpc3BsYXlXaXRoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhdXRvQWN0aXZlRmlyc3RPcHRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBhbmVsV2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9wdGlvblNlbGVjdGVkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb3BlbmVkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgY2xvc2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb3B0aW9uQWN0aXZhdGVkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgY2xhc3NMaXN0OiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydjbGFzcycsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9hdXRvY29tcGxldGUvYXV0b2NvbXBsZXRlLW9yaWdpbi50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIERpcmVjdGl2ZSBhcHBsaWVkIHRvIGFuIGVsZW1lbnQgdG8gbWFrZSBpdCB1c2FibGUKICAgICAqIGFzIGEgY29ubmVjdGlvbiBwb2ludCBmb3IgYW4gYXV0b2NvbXBsZXRlIHBhbmVsLgogICAgICovCiAgICBjbGFzcyBNYXRBdXRvY29tcGxldGVPcmlnaW4gewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYpIHsKICAgICAgICAgICAgdGhpcy5lbGVtZW50UmVmID0gZWxlbWVudFJlZjsKICAgICAgICB9CiAgICB9CiAgICBNYXRBdXRvY29tcGxldGVPcmlnaW4uybVmYWMgPSBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVPcmlnaW5fRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0QXV0b2NvbXBsZXRlT3JpZ2luKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIE1hdEF1dG9jb21wbGV0ZU9yaWdpbi7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRBdXRvY29tcGxldGVPcmlnaW4sIHNlbGVjdG9yczogW1siIiwgIm1hdEF1dG9jb21wbGV0ZU9yaWdpbiIsICIiXV0sIGV4cG9ydEFzOiBbIm1hdEF1dG9jb21wbGV0ZU9yaWdpbiJdIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRBdXRvY29tcGxldGVPcmlnaW4uY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0KICAgIF07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS10cmlnZ2VyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhlIGhlaWdodCBvZiBlYWNoIGF1dG9jb21wbGV0ZSBvcHRpb24uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgQVVUT0NPTVBMRVRFX09QVElPTl9IRUlHSFQgPSA0ODsKICAgIC8qKgogICAgICogVGhlIHRvdGFsIGhlaWdodCBvZiB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IEFVVE9DT01QTEVURV9QQU5FTF9IRUlHSFQgPSAyNTY7CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0aGF0IGRldGVybWluZXMgdGhlIHNjcm9sbCBoYW5kbGluZyB3aGlsZSB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsIGlzIG9wZW4uCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX0FVVE9DT01QTEVURV9TQ1JPTExfU1RSQVRFR1kgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1hdXRvY29tcGxldGUtc2Nyb2xsLXN0cmF0ZWd5Jyk7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAcGFyYW0gez99IG92ZXJsYXkKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIE1BVF9BVVRPQ09NUExFVEVfU0NST0xMX1NUUkFURUdZX0ZBQ1RPUlkob3ZlcmxheSkgewogICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBvdmVybGF5LnNjcm9sbFN0cmF0ZWdpZXMucmVwb3NpdGlvbigpKTsKICAgIH0KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfQVVUT0NPTVBMRVRFX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZX1BST1ZJREVSID0gewogICAgICAgIHByb3ZpZGU6IE1BVF9BVVRPQ09NUExFVEVfU0NST0xMX1NUUkFURUdZLAogICAgICAgIGRlcHM6IFtPdmVybGF5XSwKICAgICAgICB1c2VGYWN0b3J5OiBNQVRfQVVUT0NPTVBMRVRFX1NDUk9MTF9TVFJBVEVHWV9GQUNUT1JZLAogICAgfTsKICAgIC8qKgogICAgICogUHJvdmlkZXIgdGhhdCBhbGxvd3MgdGhlIGF1dG9jb21wbGV0ZSB0byByZWdpc3RlciBhcyBhIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfQVVUT0NPTVBMRVRFX1ZBTFVFX0FDQ0VTU09SID0gewogICAgICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpKSwKICAgICAgICBtdWx0aTogdHJ1ZQogICAgfTsKICAgIC8qKgogICAgICogQ3JlYXRlcyBhbiBlcnJvciB0byBiZSB0aHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIHVzZSBhbiBhdXRvY29tcGxldGUgdHJpZ2dlciB3aXRob3V0IGEgcGFuZWwuCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gZ2V0TWF0QXV0b2NvbXBsZXRlTWlzc2luZ1BhbmVsRXJyb3IoKSB7CiAgICAgICAgcmV0dXJuIEVycm9yKCdBdHRlbXB0aW5nIHRvIG9wZW4gYW4gdW5kZWZpbmVkIGluc3RhbmNlIG9mIGBtYXQtYXV0b2NvbXBsZXRlYC4gJyArCiAgICAgICAgICAgICdNYWtlIHN1cmUgdGhhdCB0aGUgaWQgcGFzc2VkIHRvIHRoZSBgbWF0QXV0b2NvbXBsZXRlYCBpcyBjb3JyZWN0IGFuZCB0aGF0ICcgKwogICAgICAgICAgICAneW91XCdyZSBhdHRlbXB0aW5nIHRvIG9wZW4gaXQgYWZ0ZXIgdGhlIG5nQWZ0ZXJDb250ZW50SW5pdCBob29rLicpOwogICAgfQogICAgY2xhc3MgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudAogICAgICAgICAqIEBwYXJhbSB7P30gX292ZXJsYXkKICAgICAgICAgKiBAcGFyYW0gez99IF92aWV3Q29udGFpbmVyUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfem9uZQogICAgICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBzY3JvbGxTdHJhdGVneQogICAgICAgICAqIEBwYXJhbSB7P30gX2RpcgogICAgICAgICAqIEBwYXJhbSB7P30gX2Zvcm1GaWVsZAogICAgICAgICAqIEBwYXJhbSB7P30gX2RvY3VtZW50CiAgICAgICAgICogQHBhcmFtIHs/PX0gX3ZpZXdwb3J0UnVsZXIKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZWxlbWVudCwgX292ZXJsYXksIF92aWV3Q29udGFpbmVyUmVmLCBfem9uZSwgX2NoYW5nZURldGVjdG9yUmVmLCBzY3JvbGxTdHJhdGVneSwgX2RpciwgX2Zvcm1GaWVsZCwgX2RvY3VtZW50LCBfdmlld3BvcnRSdWxlcikgewogICAgICAgICAgICB0aGlzLl9lbGVtZW50ID0gX2VsZW1lbnQ7CiAgICAgICAgICAgIHRoaXMuX292ZXJsYXkgPSBfb3ZlcmxheTsKICAgICAgICAgICAgdGhpcy5fdmlld0NvbnRhaW5lclJlZiA9IF92aWV3Q29udGFpbmVyUmVmOwogICAgICAgICAgICB0aGlzLl96b25lID0gX3pvbmU7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmID0gX2NoYW5nZURldGVjdG9yUmVmOwogICAgICAgICAgICB0aGlzLl9kaXIgPSBfZGlyOwogICAgICAgICAgICB0aGlzLl9mb3JtRmllbGQgPSBfZm9ybUZpZWxkOwogICAgICAgICAgICB0aGlzLl9kb2N1bWVudCA9IF9kb2N1bWVudDsKICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRSdWxlciA9IF92aWV3cG9ydFJ1bGVyOwogICAgICAgICAgICB0aGlzLl9jb21wb25lbnREZXN0cm95ZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fYXV0b2NvbXBsZXRlRGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoZSBsYWJlbCBzdGF0ZSBpcyBiZWluZyBvdmVycmlkZGVuLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fbWFudWFsbHlGbG9hdGluZ0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdWJzY3JpcHRpb24gdG8gdmlld3BvcnQgc2l6ZSBjaGFuZ2VzLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdmlld3BvcnRTdWJzY3JpcHRpb24gPSBTdWJzY3JpcHRpb24uRU1QVFk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBhdXRvY29tcGxldGUgY2FuIG9wZW4gdGhlIG5leHQgdGltZSBpdCBpcyBmb2N1c2VkLiBVc2VkIHRvIHByZXZlbnQgYSBmb2N1c2VkLAogICAgICAgICAgICAgKiBjbG9zZWQgYXV0b2NvbXBsZXRlIGZyb20gYmVpbmcgcmVvcGVuZWQgaWYgdGhlIHVzZXIgc3dpdGNoZXMgdG8gYW5vdGhlciBicm93c2VyIHRhYiBhbmQgdGhlbgogICAgICAgICAgICAgKiBjb21lcyBiYWNrLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY2FuT3Blbk9uTmV4dEZvY3VzID0gdHJ1ZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFN0cmVhbSBvZiBrZXlib2FyZCBldmVudHMgdGhhdCBjYW4gY2xvc2UgdGhlIHBhbmVsLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY2xvc2VLZXlFdmVudFN0cmVhbSA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBoYW5kbGVyIGZvciB3aGVuIHRoZSB3aW5kb3cgaXMgYmx1cnJlZC4gTmVlZHMgdG8gYmUgYW4KICAgICAgICAgICAgICogYXJyb3cgZnVuY3Rpb24gaW4gb3JkZXIgdG8gcHJlc2VydmUgdGhlIGNvbnRleHQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl93aW5kb3dCbHVySGFuZGxlciA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8vIElmIHRoZSB1c2VyIGJsdXJyZWQgdGhlIHdpbmRvdyB3aGlsZSB0aGUgYXV0b2NvbXBsZXRlIGlzIGZvY3VzZWQsIGl0IG1lYW5zIHRoYXQgaXQnbGwgYmUKICAgICAgICAgICAgICAgIC8vIHJlZm9jdXNlZCB3aGVuIHRoZXkgY29tZSBiYWNrLiBJbiB0aGlzIGNhc2Ugd2Ugd2FudCB0byBza2lwIHRoZSBmaXJzdCBmb2N1cyBldmVudCwgaWYgdGhlCiAgICAgICAgICAgICAgICAvLyBwYW5lIHdhcyBjbG9zZWQsIGluIG9yZGVyIHRvIGF2b2lkIHJlb3BlbmluZyBpdCB1bmludGVudGlvbmFsbHkuCiAgICAgICAgICAgICAgICB0aGlzLl9jYW5PcGVuT25OZXh0Rm9jdXMgPQogICAgICAgICAgICAgICAgICAgIHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgIT09IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCB8fCB0aGlzLnBhbmVsT3BlbjsKICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBgVmlldyAtPiBtb2RlbCBjYWxsYmFjayBjYWxsZWQgd2hlbiB2YWx1ZSBjaGFuZ2VzYAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25DaGFuZ2UgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogYFZpZXcgLT4gbW9kZWwgY2FsbGJhY2sgY2FsbGVkIHdoZW4gYXV0b2NvbXBsZXRlIGhhcyBiZWVuIHRvdWNoZWRgCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogUG9zaXRpb24gb2YgdGhlIGF1dG9jb21wbGV0ZSBwYW5lbCByZWxhdGl2ZSB0byB0aGUgdHJpZ2dlciBlbGVtZW50LiBBIHBvc2l0aW9uIG9mIGBhdXRvYAogICAgICAgICAgICAgKiB3aWxsIHJlbmRlciB0aGUgcGFuZWwgdW5kZXJuZWF0aCB0aGUgdHJpZ2dlciBpZiB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgZm9yIGl0IHRvIGZpdCBpbgogICAgICAgICAgICAgKiB0aGUgdmlld3BvcnQsIG90aGVyd2lzZSB0aGUgcGFuZWwgd2lsbCBiZSBzaG93biBhYm92ZSBpdC4gSWYgdGhlIHBvc2l0aW9uIGlzIHNldCB0bwogICAgICAgICAgICAgKiBgYWJvdmVgIG9yIGBiZWxvd2AsIHRoZSBwYW5lbCB3aWxsIGFsd2F5cyBiZSBzaG93biBhYm92ZSBvciBiZWxvdyB0aGUgdHJpZ2dlci4gbm8gbWF0dGVyCiAgICAgICAgICAgICAqIHdoZXRoZXIgaXQgZml0cyBjb21wbGV0ZWx5IGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMucG9zaXRpb24gPSAnYXV0byc7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBgYXV0b2NvbXBsZXRlYCBhdHRyaWJ1dGUgdG8gYmUgc2V0IG9uIHRoZSBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVBdHRyaWJ1dGUgPSAnb2ZmJzsKICAgICAgICAgICAgdGhpcy5fb3ZlcmxheUF0dGFjaGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBTdHJlYW0gb2YgYXV0b2NvbXBsZXRlIG9wdGlvbiBzZWxlY3Rpb25zLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5vcHRpb25TZWxlY3Rpb25zID0gKC8qKiBAdHlwZSB7P30gKi8gKGRlZmVyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmF1dG9jb21wbGV0ZSAmJiB0aGlzLmF1dG9jb21wbGV0ZS5vcHRpb25zKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKC4uLnRoaXMuYXV0b2NvbXBsZXRlLm9wdGlvbnMubWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgb3B0aW9uID0+IG9wdGlvbi5vblNlbGVjdGlvbkNoYW5nZSkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBhbnkgc3Vic2NyaWJlcnMgYmVmb3JlIGBuZ0FmdGVyVmlld0luaXRgLCB0aGUgYGF1dG9jb21wbGV0ZWAgd2lsbCBiZSB1bmRlZmluZWQuCiAgICAgICAgICAgICAgICAvLyBSZXR1cm4gYSBzdHJlYW0gdGhhdCB3ZSdsbCByZXBsYWNlIHdpdGggdGhlIHJlYWwgb25lIG9uY2UgZXZlcnl0aGluZyBpcyBpbiBwbGFjZS4KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl96b25lLm9uU3RhYmxlCiAgICAgICAgICAgICAgICAgICAgLmFzT2JzZXJ2YWJsZSgpCiAgICAgICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSwgc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMub3B0aW9uU2VsZWN0aW9ucykpKTsKICAgICAgICAgICAgfSkpKSk7CiAgICAgICAgICAgIHRoaXMuX3Njcm9sbFN0cmF0ZWd5ID0gc2Nyb2xsU3RyYXRlZ3k7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGF1dG9jb21wbGV0ZSBpcyBkaXNhYmxlZC4gV2hlbiBkaXNhYmxlZCwgdGhlIGVsZW1lbnQgd2lsbAogICAgICAgICAqIGFjdCBhcyBhIHJlZ3VsYXIgaW5wdXQgYW5kIHRoZSB1c2VyIHdvbid0IGJlIGFibGUgdG8gb3BlbiB0aGUgcGFuZWwuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXV0b2NvbXBsZXRlRGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9hdXRvY29tcGxldGVEaXNhYmxlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBhdXRvY29tcGxldGVEaXNhYmxlZCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9hdXRvY29tcGxldGVEaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdpbmRvdyA9IHRoaXMuX2dldFdpbmRvdygpOwogICAgICAgICAgICBpZiAodHlwZW9mIHdpbmRvdyAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2JsdXInLCB0aGlzLl93aW5kb3dCbHVySGFuZGxlcikpKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ3Bvc2l0aW9uJ10gJiYgdGhpcy5fcG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICAgICAgdGhpcy5fc2V0U3RyYXRlZ3lQb3NpdGlvbnModGhpcy5fcG9zaXRpb25TdHJhdGVneSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb3ZlcmxheVJlZikpLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB3aW5kb3cgPSB0aGlzLl9nZXRXaW5kb3coKTsKICAgICAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgIT09ICd1bmRlZmluZWQnKSB7CiAgICAgICAgICAgICAgICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lcignYmx1cicsIHRoaXMuX3dpbmRvd0JsdXJIYW5kbGVyKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92aWV3cG9ydFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICB0aGlzLl9jb21wb25lbnREZXN0cm95ZWQgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kZXN0cm95UGFuZWwoKTsKICAgICAgICAgICAgdGhpcy5fY2xvc2VLZXlFdmVudFN0cmVhbS5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG9yIG5vdCB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsIGlzIG9wZW4uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGFuZWxPcGVuKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fb3ZlcmxheUF0dGFjaGVkICYmIHRoaXMuYXV0b2NvbXBsZXRlLnNob3dQYW5lbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogT3BlbnMgdGhlIGF1dG9jb21wbGV0ZSBzdWdnZXN0aW9uIHBhbmVsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb3BlblBhbmVsKCkgewogICAgICAgICAgICB0aGlzLl9hdHRhY2hPdmVybGF5KCk7CiAgICAgICAgICAgIHRoaXMuX2Zsb2F0TGFiZWwoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xvc2VzIHRoZSBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbiBwYW5lbC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNsb3NlUGFuZWwoKSB7CiAgICAgICAgICAgIHRoaXMuX3Jlc2V0TGFiZWwoKTsKICAgICAgICAgICAgaWYgKCF0aGlzLl9vdmVybGF5QXR0YWNoZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgIC8vIE9ubHkgZW1pdCBpZiB0aGUgcGFuZWwgd2FzIHZpc2libGUuCiAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5jbG9zZWQuZW1pdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLl9pc09wZW4gPSB0aGlzLl9vdmVybGF5QXR0YWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgaWYgKHRoaXMuX292ZXJsYXlSZWYgJiYgdGhpcy5fb3ZlcmxheVJlZi5oYXNBdHRhY2hlZCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9vdmVybGF5UmVmLmRldGFjaCgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2xvc2luZ0FjdGlvbnNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBOb3RlIHRoYXQgaW4gc29tZSBjYXNlcyB0aGlzIGNhbiBlbmQgdXAgYmVpbmcgY2FsbGVkIGFmdGVyIHRoZSBjb21wb25lbnQgaXMgZGVzdHJveWVkLgogICAgICAgICAgICAvLyBBZGQgYSBjaGVjayB0byBlbnN1cmUgdGhhdCB3ZSBkb24ndCB0cnkgdG8gcnVuIGNoYW5nZSBkZXRlY3Rpb24gb24gYSBkZXN0cm95ZWQgdmlldy4KICAgICAgICAgICAgaWYgKCF0aGlzLl9jb21wb25lbnREZXN0cm95ZWQpIHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdHJpZ2dlciBjaGFuZ2UgZGV0ZWN0aW9uIG1hbnVhbGx5LCBiZWNhdXNlCiAgICAgICAgICAgICAgICAvLyBgZnJvbUV2ZW50YCBkb2Vzbid0IHNlZW0gdG8gZG8gaXQgYXQgdGhlIHByb3BlciB0aW1lLgogICAgICAgICAgICAgICAgLy8gVGhpcyBlbnN1cmVzIHRoYXQgdGhlIGxhYmVsIGlzIHJlc2V0IHdoZW4gdGhlCiAgICAgICAgICAgICAgICAvLyB1c2VyIGNsaWNrcyBvdXRzaWRlLgogICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYuZGV0ZWN0Q2hhbmdlcygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHBvc2l0aW9uIG9mIHRoZSBhdXRvY29tcGxldGUgc3VnZ2VzdGlvbiBwYW5lbCB0byBlbnN1cmUgdGhhdCBpdCBmaXRzIGFsbCBvcHRpb25zCiAgICAgICAgICogd2l0aGluIHRoZSB2aWV3cG9ydC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZVBvc2l0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5fb3ZlcmxheUF0dGFjaGVkKSB7CiAgICAgICAgICAgICAgICAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy5fb3ZlcmxheVJlZikpLnVwZGF0ZVBvc2l0aW9uKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBzdHJlYW0gb2YgYWN0aW9ucyB0aGF0IHNob3VsZCBjbG9zZSB0aGUgYXV0b2NvbXBsZXRlIHBhbmVsLCBpbmNsdWRpbmcKICAgICAgICAgKiB3aGVuIGFuIG9wdGlvbiBpcyBzZWxlY3RlZCwgb24gYmx1ciwgYW5kIHdoZW4gVEFCIGlzIHByZXNzZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcGFuZWxDbG9zaW5nQWN0aW9ucygpIHsKICAgICAgICAgICAgcmV0dXJuIG1lcmdlKHRoaXMub3B0aW9uU2VsZWN0aW9ucywgdGhpcy5hdXRvY29tcGxldGUuX2tleU1hbmFnZXIudGFiT3V0LnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX292ZXJsYXlBdHRhY2hlZCkpKSwgdGhpcy5fY2xvc2VLZXlFdmVudFN0cmVhbSwgdGhpcy5fZ2V0T3V0c2lkZUNsaWNrU3RyZWFtKCksIHRoaXMuX292ZXJsYXlSZWYgPwogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZi5kZXRhY2htZW50cygpLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHRoaXMuX292ZXJsYXlBdHRhY2hlZCkpKSA6CiAgICAgICAgICAgICAgICBvZigpKS5waXBlKAogICAgICAgICAgICAvLyBOb3JtYWxpemUgdGhlIG91dHB1dCBzbyB3ZSByZXR1cm4gYSBjb25zaXN0ZW50IHR5cGUuCiAgICAgICAgICAgIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTWF0T3B0aW9uU2VsZWN0aW9uQ2hhbmdlID8gZXZlbnQgOiBudWxsKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgY3VycmVudGx5IGFjdGl2ZSBvcHRpb24sIGNvZXJjZWQgdG8gTWF0T3B0aW9uIHR5cGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYWN0aXZlT3B0aW9uKCkgewogICAgICAgICAgICBpZiAodGhpcy5hdXRvY29tcGxldGUgJiYgdGhpcy5hdXRvY29tcGxldGUuX2tleU1hbmFnZXIpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTdHJlYW0gb2YgY2xpY2tzIG91dHNpZGUgb2YgdGhlIGF1dG9jb21wbGV0ZSBwYW5lbC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2dldE91dHNpZGVDbGlja1N0cmVhbSgpIHsKICAgICAgICAgICAgcmV0dXJuIG1lcmdlKCgvKiogQHR5cGUgez99ICovIChmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICdjbGljaycpKSksICgvKiogQHR5cGUgez99ICovIChmcm9tRXZlbnQodGhpcy5fZG9jdW1lbnQsICd0b3VjaGVuZCcpKSkpCiAgICAgICAgICAgICAgICAucGlwZShmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBpbiB0aGUgU2hhZG93IERPTSwgdGhlIGV2ZW50IHRhcmdldCB3aWxsIGJlIHRoZSBzaGFkb3cgcm9vdCwgc28gd2UgaGF2ZSB0bwogICAgICAgICAgICAgICAgLy8gZmFsbCBiYWNrIHRvIGNoZWNrIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBwYXRoIG9mIHRoZSBjbGljayBldmVudC4KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNsaWNrVGFyZ2V0ID0gKC8qKiBAdHlwZSB7P30gKi8gKCh0aGlzLl9pc0luc2lkZVNoYWRvd1Jvb3QgJiYgZXZlbnQuY29tcG9zZWRQYXRoID8gZXZlbnQuY29tcG9zZWRQYXRoKClbMF0gOgogICAgICAgICAgICAgICAgICAgIGV2ZW50LnRhcmdldCkpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1GaWVsZCA9IHRoaXMuX2Zvcm1GaWVsZCA/IHRoaXMuX2Zvcm1GaWVsZC5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50IDogbnVsbDsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9vdmVybGF5QXR0YWNoZWQgJiYgY2xpY2tUYXJnZXQgIT09IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCAmJgogICAgICAgICAgICAgICAgICAgICghZm9ybUZpZWxkIHx8ICFmb3JtRmllbGQuY29udGFpbnMoY2xpY2tUYXJnZXQpKSAmJgogICAgICAgICAgICAgICAgICAgICghIXRoaXMuX292ZXJsYXlSZWYgJiYgIXRoaXMuX292ZXJsYXlSZWYub3ZlcmxheUVsZW1lbnQuY29udGFpbnMoY2xpY2tUYXJnZXQpKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZShudWxsKS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuX3NldFRyaWdnZXJWYWx1ZSh2YWx1ZSkpKTsKICAgICAgICB9CiAgICAgICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50LmRpc2FibGVkID0gaXNEaXNhYmxlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgICAgICAgLy8gUHJldmVudCB0aGUgZGVmYXVsdCBhY3Rpb24gb24gYWxsIGVzY2FwZSBrZXkgcHJlc3Nlcy4gVGhpcyBpcyBoZXJlIHByaW1hcmlseSB0byBicmluZyBJRQogICAgICAgICAgICAvLyBpbiBsaW5lIHdpdGggb3RoZXIgYnJvd3NlcnMuIEJ5IGRlZmF1bHQsIHByZXNzaW5nIGVzY2FwZSBvbiBJRSB3aWxsIGNhdXNlIGl0IHRvIHJldmVydAogICAgICAgICAgICAvLyB0aGUgaW5wdXQgdmFsdWUgdG8gdGhlIG9uZSB0aGF0IGl0IGhhZCBvbiBmb2N1cywgaG93ZXZlciBpdCB3b24ndCBkaXNwYXRjaCBhbnkgZXZlbnRzCiAgICAgICAgICAgIC8vIHdoaWNoIG1lYW5zIHRoYXQgdGhlIG1vZGVsIHZhbHVlIHdpbGwgYmUgb3V0IG9mIHN5bmMgd2l0aCB0aGUgdmlldy4KICAgICAgICAgICAgaWYgKGtleUNvZGUgPT09IEVTQ0FQRSkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5hY3RpdmVPcHRpb24gJiYga2V5Q29kZSA9PT0gRU5URVIgJiYgdGhpcy5wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlT3B0aW9uLl9zZWxlY3RWaWFJbnRlcmFjdGlvbigpOwogICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRBY3RpdmVJdGVtKCk7CiAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuYXV0b2NvbXBsZXRlKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBwcmV2QWN0aXZlSXRlbSA9IHRoaXMuYXV0b2NvbXBsZXRlLl9rZXlNYW5hZ2VyLmFjdGl2ZUl0ZW07CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBpc0Fycm93S2V5ID0ga2V5Q29kZSA9PT0gVVBfQVJST1cgfHwga2V5Q29kZSA9PT0gRE9XTl9BUlJPVzsKICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhbmVsT3BlbiB8fCBrZXlDb2RlID09PSBUQUIpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5vbktleWRvd24oZXZlbnQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoaXNBcnJvd0tleSAmJiB0aGlzLl9jYW5PcGVuKCkpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9wZW5QYW5lbCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGlzQXJyb3dLZXkgfHwgdGhpcy5hdXRvY29tcGxldGUuX2tleU1hbmFnZXIuYWN0aXZlSXRlbSAhPT0gcHJldkFjdGl2ZUl0ZW0pIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9zY3JvbGxUb09wdGlvbigpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVJbnB1dChldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB0YXJnZXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlID0gdGFyZ2V0LnZhbHVlOwogICAgICAgICAgICAvLyBCYXNlZCBvbiBgTnVtYmVyVmFsdWVBY2Nlc3NvcmAgZnJvbSBmb3Jtcy4KICAgICAgICAgICAgaWYgKHRhcmdldC50eXBlID09PSAnbnVtYmVyJykgewogICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSA9PSAnJyA/IG51bGwgOiBwYXJzZUZsb2F0KHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBJZiB0aGUgaW5wdXQgaGFzIGEgcGxhY2Vob2xkZXIsIElFIHdpbGwgZmlyZSB0aGUgYGlucHV0YCBldmVudCBvbiBwYWdlIGxvYWQsCiAgICAgICAgICAgIC8vIGZvY3VzIGFuZCBibHVyLCBpbiBhZGRpdGlvbiB0byB3aGVuIHRoZSB1c2VyIGFjdHVhbGx5IGNoYW5nZWQgdGhlIHZhbHVlLiBUbwogICAgICAgICAgICAvLyBmaWx0ZXIgb3V0IGFsbCBvZiB0aGUgZXh0cmEgZXZlbnRzLCB3ZSBzYXZlIHRoZSB2YWx1ZSBvbiBmb2N1cyBhbmQgYmV0d2VlbgogICAgICAgICAgICAvLyBgaW5wdXRgIGV2ZW50cywgYW5kIHdlIGNoZWNrIHdoZXRoZXIgaXQgY2hhbmdlZC4KICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL2Nvbm5lY3QubWljcm9zb2Z0LmNvbS9JRS9mZWVkYmFjay9kZXRhaWxzLzg4NTc0Ny8KICAgICAgICAgICAgaWYgKHRoaXMuX3ByZXZpb3VzVmFsdWUgIT09IHZhbHVlKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9wcmV2aW91c1ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fY2FuT3BlbigpICYmIHRoaXMuX2RvY3VtZW50LmFjdGl2ZUVsZW1lbnQgPT09IGV2ZW50LnRhcmdldCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMub3BlblBhbmVsKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFuZGxlRm9jdXMoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fY2FuT3Blbk9uTmV4dEZvY3VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jYW5PcGVuT25OZXh0Rm9jdXMgPSB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuX2Nhbk9wZW4oKSkgewogICAgICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNWYWx1ZSA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2F0dGFjaE92ZXJsYXkoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2Zsb2F0TGFiZWwodHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW4gImF1dG8iIG1vZGUsIHRoZSBsYWJlbCB3aWxsIGFuaW1hdGUgZG93biBhcyBzb29uIGFzIGZvY3VzIGlzIGxvc3QuCiAgICAgICAgICogVGhpcyBjYXVzZXMgdGhlIHZhbHVlIHRvIGp1bXAgd2hlbiBzZWxlY3RpbmcgYW4gb3B0aW9uIHdpdGggdGhlIG1vdXNlLgogICAgICAgICAqIFRoaXMgbWV0aG9kIG1hbnVhbGx5IGZsb2F0cyB0aGUgbGFiZWwgdW50aWwgdGhlIHBhbmVsIGNhbiBiZSBjbG9zZWQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez89fSBzaG91bGRBbmltYXRlIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBiZSBhbmltYXRlZCB3aGVuIGl0IGlzIGZsb2F0ZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZmxvYXRMYWJlbChzaG91bGRBbmltYXRlID0gZmFsc2UpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2Zvcm1GaWVsZCAmJiB0aGlzLl9mb3JtRmllbGQuZmxvYXRMYWJlbCA9PT0gJ2F1dG8nKSB7CiAgICAgICAgICAgICAgICBpZiAoc2hvdWxkQW5pbWF0ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1GaWVsZC5fYW5pbWF0ZUFuZExvY2tMYWJlbCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZm9ybUZpZWxkLmZsb2F0TGFiZWwgPSAnYWx3YXlzJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX21hbnVhbGx5RmxvYXRpbmdMYWJlbCA9IHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdGhlIGxhYmVsIGhhcyBiZWVuIG1hbnVhbGx5IGVsZXZhdGVkLCByZXR1cm4gaXQgdG8gaXRzIG5vcm1hbCBzdGF0ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Jlc2V0TGFiZWwoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9tYW51YWxseUZsb2F0aW5nTGFiZWwpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2Zvcm1GaWVsZC5mbG9hdExhYmVsID0gJ2F1dG8nOwogICAgICAgICAgICAgICAgdGhpcy5fbWFudWFsbHlGbG9hdGluZ0xhYmVsID0gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogR2l2ZW4gdGhhdCB3ZSBhcmUgbm90IGFjdHVhbGx5IGZvY3VzaW5nIGFjdGl2ZSBvcHRpb25zLCB3ZSBtdXN0IG1hbnVhbGx5IGFkanVzdCBzY3JvbGwKICAgICAgICAgKiB0byByZXZlYWwgb3B0aW9ucyBiZWxvdyB0aGUgZm9sZC4gRmlyc3QsIHdlIGZpbmQgdGhlIG9mZnNldCBvZiB0aGUgb3B0aW9uIGZyb20gdGhlIHRvcAogICAgICAgICAqIG9mIHRoZSBwYW5lbC4gSWYgdGhhdCBvZmZzZXQgaXMgYmVsb3cgdGhlIGZvbGQsIHRoZSBuZXcgc2Nyb2xsVG9wIHdpbGwgYmUgdGhlIG9mZnNldCAtCiAgICAgICAgICogdGhlIHBhbmVsIGhlaWdodCArIHRoZSBvcHRpb24gaGVpZ2h0LCBzbyB0aGUgYWN0aXZlIG9wdGlvbiB3aWxsIGJlIGp1c3QgdmlzaWJsZSBhdCB0aGUKICAgICAgICAgKiBib3R0b20gb2YgdGhlIHBhbmVsLiBJZiB0aGF0IG9mZnNldCBpcyBhYm92ZSB0aGUgdG9wIG9mIHRoZSB2aXNpYmxlIHBhbmVsLCB0aGUgbmV3IHNjcm9sbFRvcAogICAgICAgICAqIHdpbGwgYmVjb21lIHRoZSBvZmZzZXQuIElmIHRoYXQgb2Zmc2V0IGlzIHZpc2libGUgd2l0aGluIHRoZSBwYW5lbCBhbHJlYWR5LCB0aGUgc2Nyb2xsVG9wIGlzCiAgICAgICAgICogbm90IGFkanVzdGVkLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2Nyb2xsVG9PcHRpb24oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kZXggPSB0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5hY3RpdmVJdGVtSW5kZXggfHwgMDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBsYWJlbENvdW50ID0gX2NvdW50R3JvdXBMYWJlbHNCZWZvcmVPcHRpb24oaW5kZXgsIHRoaXMuYXV0b2NvbXBsZXRlLm9wdGlvbnMsIHRoaXMuYXV0b2NvbXBsZXRlLm9wdGlvbkdyb3Vwcyk7CiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gMCAmJiBsYWJlbENvdW50ID09PSAxKSB7CiAgICAgICAgICAgICAgICAvLyBJZiB3ZSd2ZSBnb3Qgb25lIGdyb3VwIGxhYmVsIGJlZm9yZSB0aGUgb3B0aW9uIGFuZCB3ZSdyZSBhdCB0aGUgdG9wIG9wdGlvbiwKICAgICAgICAgICAgICAgIC8vIHNjcm9sbCB0aGUgbGlzdCB0byB0aGUgdG9wLiBUaGlzIGlzIGJldHRlciBVWCB0aGFuIHNjcm9sbGluZyB0aGUgbGlzdCB0byB0aGUKICAgICAgICAgICAgICAgIC8vIHRvcCBvZiB0aGUgb3B0aW9uLCBiZWNhdXNlIGl0IGFsbG93cyB0aGUgdXNlciB0byByZWFkIHRoZSB0b3AgZ3JvdXAncyBsYWJlbC4KICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLl9zZXRTY3JvbGxUb3AoMCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBuZXdTY3JvbGxQb3NpdGlvbiA9IF9nZXRPcHRpb25TY3JvbGxQb3NpdGlvbihpbmRleCArIGxhYmVsQ291bnQsIEFVVE9DT01QTEVURV9PUFRJT05fSEVJR0hULCB0aGlzLmF1dG9jb21wbGV0ZS5fZ2V0U2Nyb2xsVG9wKCksIEFVVE9DT01QTEVURV9QQU5FTF9IRUlHSFQpOwogICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGUuX3NldFNjcm9sbFRvcChuZXdTY3JvbGxQb3NpdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVGhpcyBtZXRob2QgbGlzdGVucyB0byBhIHN0cmVhbSBvZiBwYW5lbCBjbG9zaW5nIGFjdGlvbnMgYW5kIHJlc2V0cyB0aGUKICAgICAgICAgKiBzdHJlYW0gZXZlcnkgdGltZSB0aGUgb3B0aW9uIGxpc3QgY2hhbmdlcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N1YnNjcmliZVRvQ2xvc2luZ0FjdGlvbnMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZmlyc3RTdGFibGUgPSB0aGlzLl96b25lLm9uU3RhYmxlLmFzT2JzZXJ2YWJsZSgpLnBpcGUodGFrZSgxKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgb3B0aW9uQ2hhbmdlcyA9IHRoaXMuYXV0b2NvbXBsZXRlLm9wdGlvbnMuY2hhbmdlcy5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5LnJlYXBwbHlMYXN0UG9zaXRpb24oKSkpLCAKICAgICAgICAgICAgLy8gRGVmZXIgZW1pdHRpbmcgdG8gdGhlIHN0cmVhbSB1bnRpbCB0aGUgbmV4dCB0aWNrLCBiZWNhdXNlIGNoYW5naW5nCiAgICAgICAgICAgIC8vIGJpbmRpbmdzIGluIGhlcmUgd2lsbCBjYXVzZSAiY2hhbmdlZCBhZnRlciBjaGVja2VkIiBlcnJvcnMuCiAgICAgICAgICAgIGRlbGF5KDApKTsKICAgICAgICAgICAgLy8gV2hlbiB0aGUgem9uZSBpcyBzdGFibGUgaW5pdGlhbGx5LCBhbmQgd2hlbiB0aGUgb3B0aW9uIGxpc3QgY2hhbmdlcy4uLgogICAgICAgICAgICByZXR1cm4gbWVyZ2UoZmlyc3RTdGFibGUsIG9wdGlvbkNoYW5nZXMpCiAgICAgICAgICAgICAgICAucGlwZSgKICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IHN0cmVhbSBvZiBwYW5lbENsb3NpbmdBY3Rpb25zLCByZXBsYWNpbmcgYW55IHByZXZpb3VzIHN0cmVhbXMKICAgICAgICAgICAgLy8gdGhhdCB3ZXJlIGNyZWF0ZWQsIGFuZCBmbGF0dGVuIGl0IHNvIG91ciBzdHJlYW0gb25seSBlbWl0cyBjbG9zaW5nIGV2ZW50cy4uLgogICAgICAgICAgICBzd2l0Y2hNYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgd2FzT3BlbiA9IHRoaXMucGFuZWxPcGVuOwogICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRBY3RpdmVJdGVtKCk7CiAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5fc2V0VmlzaWJpbGl0eSgpOwogICAgICAgICAgICAgICAgaWYgKHRoaXMucGFuZWxPcGVuKSB7CiAgICAgICAgICAgICAgICAgICAgKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX292ZXJsYXlSZWYpKS51cGRhdGVQb3NpdGlvbigpOwogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBgcGFuZWxPcGVuYCBzdGF0ZSBjaGFuZ2VkLCB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0byBlbWl0IHRoZSBgb3BlbmVkYAogICAgICAgICAgICAgICAgICAgIC8vIGV2ZW50LCBiZWNhdXNlIHdlIG1heSBub3QgaGF2ZSBlbWl0dGVkIGl0IHdoZW4gdGhlIHBhbmVsIHdhcyBhdHRhY2hlZC4gVGhpcwogICAgICAgICAgICAgICAgICAgIC8vIGNhbiBoYXBwZW4gaWYgdGhlIHVzZXJzIG9wZW5zIHRoZSBwYW5lbCBhbmQgdGhlcmUgYXJlIG5vIG9wdGlvbnMsIGJ1dCB0aGUKICAgICAgICAgICAgICAgICAgICAvLyBvcHRpb25zIGNvbWUgaW4gc2xpZ2h0bHkgbGF0ZXIgb3IgYXMgYSByZXN1bHQgb2YgdGhlIHZhbHVlIGNoYW5naW5nLgogICAgICAgICAgICAgICAgICAgIGlmICh3YXNPcGVuICE9PSB0aGlzLnBhbmVsT3BlbikgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5vcGVuZWQuZW1pdCgpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnBhbmVsQ2xvc2luZ0FjdGlvbnM7CiAgICAgICAgICAgIH0pKSwgCiAgICAgICAgICAgIC8vIHdoZW4gdGhlIGZpcnN0IGNsb3NpbmcgZXZlbnQgb2NjdXJzLi4uCiAgICAgICAgICAgIHRha2UoMSkpCiAgICAgICAgICAgICAgICAvLyBzZXQgdGhlIHZhbHVlLCBjbG9zZSB0aGUgcGFuZWwsIGFuZCBjb21wbGV0ZS4KICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB0aGlzLl9zZXRWYWx1ZUFuZENsb3NlKGV2ZW50KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXN0cm95cyB0aGUgYXV0b2NvbXBsZXRlIHN1Z2dlc3Rpb24gcGFuZWwuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9kZXN0cm95UGFuZWwoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLl9vdmVybGF5UmVmKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTsKICAgICAgICAgICAgICAgIHRoaXMuX292ZXJsYXlSZWYuZGlzcG9zZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0VHJpZ2dlclZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdG9EaXNwbGF5ID0gdGhpcy5hdXRvY29tcGxldGUgJiYgdGhpcy5hdXRvY29tcGxldGUuZGlzcGxheVdpdGggPwogICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGUuZGlzcGxheVdpdGgodmFsdWUpIDoKICAgICAgICAgICAgICAgIHZhbHVlOwogICAgICAgICAgICAvLyBTaW1wbHkgZmFsbGluZyBiYWNrIHRvIGFuIGVtcHR5IHN0cmluZyBpZiB0aGUgZGlzcGxheSB2YWx1ZSBpcyBmYWxzeSBkb2VzIG5vdCB3b3JrIHByb3Blcmx5LgogICAgICAgICAgICAvLyBUaGUgZGlzcGxheSB2YWx1ZSBjYW4gYWxzbyBiZSB0aGUgbnVtYmVyIHplcm8gYW5kIHNob3VsZG4ndCBmYWxsIGJhY2sgdG8gYW4gZW1wdHkgc3RyaW5nLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlucHV0VmFsdWUgPSB0b0Rpc3BsYXkgIT0gbnVsbCA/IHRvRGlzcGxheSA6ICcnOwogICAgICAgICAgICAvLyBJZiBpdCdzIHVzZWQgd2l0aGluIGEgYE1hdEZvcm1GaWVsZGAsIHdlIHNob3VsZCBzZXQgaXQgdGhyb3VnaCB0aGUgcHJvcGVydHkgc28gaXQgY2FuIGdvCiAgICAgICAgICAgIC8vIHRocm91Z2ggY2hhbmdlIGRldGVjdGlvbi4KICAgICAgICAgICAgaWYgKHRoaXMuX2Zvcm1GaWVsZCkgewogICAgICAgICAgICAgICAgdGhpcy5fZm9ybUZpZWxkLl9jb250cm9sLnZhbHVlID0gaW5wdXRWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudC52YWx1ZSA9IGlucHV0VmFsdWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fcHJldmlvdXNWYWx1ZSA9IGlucHV0VmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoaXMgbWV0aG9kIGNsb3NlcyB0aGUgcGFuZWwsIGFuZCBpZiBhIHZhbHVlIGlzIHNwZWNpZmllZCwgYWxzbyBzZXRzIHRoZSBhc3NvY2lhdGVkCiAgICAgICAgICogY29udHJvbCB0byB0aGF0IHZhbHVlLiBJdCB3aWxsIGFsc28gbWFyayB0aGUgY29udHJvbCBhcyBkaXJ0eSBpZiB0aGlzIGludGVyYWN0aW9uCiAgICAgICAgICogc3RlbW1lZCBmcm9tIHRoZSB1c2VyLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3NldFZhbHVlQW5kQ2xvc2UoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50ICYmIGV2ZW50LnNvdXJjZSkgewogICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJQcmV2aW91c1NlbGVjdGVkT3B0aW9uKGV2ZW50LnNvdXJjZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRUcmlnZ2VyVmFsdWUoZXZlbnQuc291cmNlLnZhbHVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlKGV2ZW50LnNvdXJjZS52YWx1ZSk7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLl9lbWl0U2VsZWN0RXZlbnQoZXZlbnQuc291cmNlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLmNsb3NlUGFuZWwoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2xlYXIgYW55IHByZXZpb3VzIHNlbGVjdGVkIG9wdGlvbiBhbmQgZW1pdCBhIHNlbGVjdGlvbiBjaGFuZ2UgZXZlbnQgZm9yIHRoaXMgb3B0aW9uCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHNraXAKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jbGVhclByZXZpb3VzU2VsZWN0ZWRPcHRpb24oc2tpcCkgewogICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5vcHRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG9wdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgb3B0aW9uID0+IHsKICAgICAgICAgICAgICAgIGlmIChvcHRpb24gIT0gc2tpcCAmJiBvcHRpb24uc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgICAgICBvcHRpb24uZGVzZWxlY3QoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2F0dGFjaE92ZXJsYXkoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5hdXRvY29tcGxldGUpIHsKICAgICAgICAgICAgICAgIHRocm93IGdldE1hdEF1dG9jb21wbGV0ZU1pc3NpbmdQYW5lbEVycm9yKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gV2Ugd2FudCB0byByZXNvbHZlIHRoaXMgb25jZSwgYXMgbGF0ZSBhcyBwb3NzaWJsZSBzbyB0aGF0IHdlIGNhbiBiZQogICAgICAgICAgICAvLyBzdXJlIHRoYXQgdGhlIGVsZW1lbnQgaGFzIGJlZW4gbW92ZWQgaW50byBpdHMgZmluYWwgcGxhY2UgaW4gdGhlIERPTS4KICAgICAgICAgICAgaWYgKHRoaXMuX2lzSW5zaWRlU2hhZG93Um9vdCA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9pc0luc2lkZVNoYWRvd1Jvb3QgPSAhIV9nZXRTaGFkb3dSb290KHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgb3ZlcmxheVJlZiA9IHRoaXMuX292ZXJsYXlSZWY7CiAgICAgICAgICAgIGlmICghb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgdGhpcy5fcG9ydGFsID0gbmV3IFRlbXBsYXRlUG9ydGFsKHRoaXMuYXV0b2NvbXBsZXRlLnRlbXBsYXRlLCB0aGlzLl92aWV3Q29udGFpbmVyUmVmKTsKICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYgPSB0aGlzLl9vdmVybGF5LmNyZWF0ZSh0aGlzLl9nZXRPdmVybGF5Q29uZmlnKCkpOwogICAgICAgICAgICAgICAgdGhpcy5fb3ZlcmxheVJlZiA9IG92ZXJsYXlSZWY7CiAgICAgICAgICAgICAgICAvLyBVc2UgdGhlIGBrZXlkb3duRXZlbnRzYCBpbiBvcmRlciB0byB0YWtlIGFkdmFudGFnZSBvZgogICAgICAgICAgICAgICAgLy8gdGhlIG92ZXJsYXkgZXZlbnQgdGFyZ2V0aW5nIHByb3ZpZGVkIGJ5IHRoZSBDREsgb3ZlcmxheS4KICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYua2V5ZG93bkV2ZW50cygpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAgICAgLy8gQ2xvc2Ugd2hlbiBwcmVzc2luZyBFU0NBUEUgb3IgQUxUICsgVVBfQVJST1csIGJhc2VkIG9uIHRoZSBhMTF5IGd1aWRlbGluZXMuCiAgICAgICAgICAgICAgICAgICAgLy8gU2VlOiBodHRwczovL3d3dy53My5vcmcvVFIvd2FpLWFyaWEtcHJhY3RpY2VzLTEuMS8jdGV4dGJveC1rZXlib2FyZC1pbnRlcmFjdGlvbgogICAgICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBFU0NBUEUgfHwgKGV2ZW50LmtleUNvZGUgPT09IFVQX0FSUk9XICYmIGV2ZW50LmFsdEtleSkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcmVzZXRBY3RpdmVJdGVtKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2Nsb3NlS2V5RXZlbnRTdHJlYW0ubmV4dCgpOwogICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHN0b3AgcHJvcGFnYXRpb24sIG90aGVyd2lzZSB0aGUgZXZlbnQgd2lsbCBldmVudHVhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWNoIHRoZSBpbnB1dCBpdHNlbGYgYW5kIGNhdXNlIHRoZSBvdmVybGF5IHRvIGJlIHJlb3BlbmVkLgogICAgICAgICAgICAgICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5fdmlld3BvcnRSdWxlcikgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3ZpZXdwb3J0U3Vic2NyaXB0aW9uID0gdGhpcy5fdmlld3BvcnRSdWxlci5jaGFuZ2UoKS5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgb3ZlcmxheVJlZikgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgb3ZlcmxheVJlZi51cGRhdGVTaXplKHsgd2lkdGg6IHRoaXMuX2dldFBhbmVsV2lkdGgoKSB9KTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgdHJpZ2dlciwgcGFuZWwgd2lkdGggYW5kIGRpcmVjdGlvbiwgaW4gY2FzZSBhbnl0aGluZyBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICAgIHRoaXMuX3Bvc2l0aW9uU3RyYXRlZ3kuc2V0T3JpZ2luKHRoaXMuX2dldENvbm5lY3RlZEVsZW1lbnQoKSk7CiAgICAgICAgICAgICAgICBvdmVybGF5UmVmLnVwZGF0ZVNpemUoeyB3aWR0aDogdGhpcy5fZ2V0UGFuZWxXaWR0aCgpIH0pOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChvdmVybGF5UmVmICYmICFvdmVybGF5UmVmLmhhc0F0dGFjaGVkKCkpIHsKICAgICAgICAgICAgICAgIG92ZXJsYXlSZWYuYXR0YWNoKHRoaXMuX3BvcnRhbCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jbG9zaW5nQWN0aW9uc1N1YnNjcmlwdGlvbiA9IHRoaXMuX3N1YnNjcmliZVRvQ2xvc2luZ0FjdGlvbnMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdhc09wZW4gPSB0aGlzLnBhbmVsT3BlbjsKICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGUuX3NldFZpc2liaWxpdHkoKTsKICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGUuX2lzT3BlbiA9IHRoaXMuX292ZXJsYXlBdHRhY2hlZCA9IHRydWU7CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gZG8gYW4gZXh0cmEgYHBhbmVsT3BlbmAgY2hlY2sgaW4gaGVyZSwgYmVjYXVzZSB0aGUKICAgICAgICAgICAgLy8gYXV0b2NvbXBsZXRlIHdvbid0IGJlIHNob3duIGlmIHRoZXJlIGFyZSBubyBvcHRpb25zLgogICAgICAgICAgICBpZiAodGhpcy5wYW5lbE9wZW4gJiYgd2FzT3BlbiAhPT0gdGhpcy5wYW5lbE9wZW4pIHsKICAgICAgICAgICAgICAgIHRoaXMuYXV0b2NvbXBsZXRlLm9wZW5lZC5lbWl0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPdmVybGF5Q29uZmlnKCkgewogICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlDb25maWcoewogICAgICAgICAgICAgICAgcG9zaXRpb25TdHJhdGVneTogdGhpcy5fZ2V0T3ZlcmxheVBvc2l0aW9uKCksCiAgICAgICAgICAgICAgICBzY3JvbGxTdHJhdGVneTogdGhpcy5fc2Nyb2xsU3RyYXRlZ3koKSwKICAgICAgICAgICAgICAgIHdpZHRoOiB0aGlzLl9nZXRQYW5lbFdpZHRoKCksCiAgICAgICAgICAgICAgICBkaXJlY3Rpb246IHRoaXMuX2RpcgogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRPdmVybGF5UG9zaXRpb24oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSB0aGlzLl9vdmVybGF5LnBvc2l0aW9uKCkKICAgICAgICAgICAgICAgIC5mbGV4aWJsZUNvbm5lY3RlZFRvKHRoaXMuX2dldENvbm5lY3RlZEVsZW1lbnQoKSkKICAgICAgICAgICAgICAgIC53aXRoRmxleGlibGVEaW1lbnNpb25zKGZhbHNlKQogICAgICAgICAgICAgICAgLndpdGhQdXNoKGZhbHNlKTsKICAgICAgICAgICAgdGhpcy5fc2V0U3RyYXRlZ3lQb3NpdGlvbnMoc3RyYXRlZ3kpOwogICAgICAgICAgICB0aGlzLl9wb3NpdGlvblN0cmF0ZWd5ID0gc3RyYXRlZ3k7CiAgICAgICAgICAgIHJldHVybiBzdHJhdGVneTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgcG9zaXRpb25zIG9uIGEgcG9zaXRpb24gc3RyYXRlZ3kgYmFzZWQgb24gdGhlIGRpcmVjdGl2ZSdzIGlucHV0IHN0YXRlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBwb3NpdGlvblN0cmF0ZWd5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0U3RyYXRlZ3lQb3NpdGlvbnMocG9zaXRpb25TdHJhdGVneSkgewogICAgICAgICAgICAvLyBOb3RlIHRoYXQgd2UgcHJvdmlkZSBob3Jpem9udGFsIGZhbGxiYWNrIHBvc2l0aW9ucywgZXZlbiB0aG91Z2ggYnkgZGVmYXVsdCB0aGUgZHJvcGRvd24KICAgICAgICAgICAgLy8gd2lkdGggbWF0Y2hlcyB0aGUgaW5wdXQsIGJlY2F1c2UgY29uc3VtZXJzIGNhbiBvdmVycmlkZSB0aGUgd2lkdGguIFNlZSAjMTg4NTQuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmVsb3dQb3NpdGlvbnMgPSBbCiAgICAgICAgICAgICAgICB7IG9yaWdpblg6ICdzdGFydCcsIG9yaWdpblk6ICdib3R0b20nLCBvdmVybGF5WDogJ3N0YXJ0Jywgb3ZlcmxheVk6ICd0b3AnIH0sCiAgICAgICAgICAgICAgICB7IG9yaWdpblg6ICdlbmQnLCBvcmlnaW5ZOiAnYm90dG9tJywgb3ZlcmxheVg6ICdlbmQnLCBvdmVybGF5WTogJ3RvcCcgfQogICAgICAgICAgICBdOwogICAgICAgICAgICAvLyBUaGUgb3ZlcmxheSBlZGdlIGNvbm5lY3RlZCB0byB0aGUgdHJpZ2dlciBzaG91bGQgaGF2ZSBzcXVhcmVkIGNvcm5lcnMsIHdoaWxlCiAgICAgICAgICAgIC8vIHRoZSBvcHBvc2l0ZSBlbmQgaGFzIHJvdW5kZWQgY29ybmVycy4gV2UgYXBwbHkgYSBDU1MgY2xhc3MgdG8gc3dhcCB0aGUKICAgICAgICAgICAgLy8gYm9yZGVyLXJhZGl1cyBiYXNlZCBvbiB0aGUgb3ZlcmxheSBwb3NpdGlvbi4KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYW5lbENsYXNzID0gJ21hdC1hdXRvY29tcGxldGUtcGFuZWwtYWJvdmUnOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGFib3ZlUG9zaXRpb25zID0gWwogICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnc3RhcnQnLCBvcmlnaW5ZOiAndG9wJywgb3ZlcmxheVg6ICdzdGFydCcsIG92ZXJsYXlZOiAnYm90dG9tJywgcGFuZWxDbGFzcyB9LAogICAgICAgICAgICAgICAgeyBvcmlnaW5YOiAnZW5kJywgb3JpZ2luWTogJ3RvcCcsIG92ZXJsYXlYOiAnZW5kJywgb3ZlcmxheVk6ICdib3R0b20nLCBwYW5lbENsYXNzIH0KICAgICAgICAgICAgXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBsZXQgcG9zaXRpb25zOwogICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ2Fib3ZlJykgewogICAgICAgICAgICAgICAgcG9zaXRpb25zID0gYWJvdmVQb3NpdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wb3NpdGlvbiA9PT0gJ2JlbG93JykgewogICAgICAgICAgICAgICAgcG9zaXRpb25zID0gYmVsb3dQb3NpdGlvbnM7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBwb3NpdGlvbnMgPSBbLi4uYmVsb3dQb3NpdGlvbnMsIC4uLmFib3ZlUG9zaXRpb25zXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBwb3NpdGlvblN0cmF0ZWd5LndpdGhQb3NpdGlvbnMocG9zaXRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9nZXRDb25uZWN0ZWRFbGVtZW50KCkgewogICAgICAgICAgICBpZiAodGhpcy5jb25uZWN0ZWRUbykgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29ubmVjdGVkVG8uZWxlbWVudFJlZjsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gdGhpcy5fZm9ybUZpZWxkID8gdGhpcy5fZm9ybUZpZWxkLmdldENvbm5lY3RlZE92ZXJsYXlPcmlnaW4oKSA6IHRoaXMuX2VsZW1lbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0UGFuZWxXaWR0aCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXV0b2NvbXBsZXRlLnBhbmVsV2lkdGggfHwgdGhpcy5fZ2V0SG9zdFdpZHRoKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJldHVybnMgdGhlIHdpZHRoIG9mIHRoZSBpbnB1dCBlbGVtZW50LCBzbyB0aGUgcGFuZWwgd2lkdGggY2FuIG1hdGNoIGl0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0SG9zdFdpZHRoKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fZ2V0Q29ubmVjdGVkRWxlbWVudCgpLm5hdGl2ZUVsZW1lbnQuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFJlc2V0cyB0aGUgYWN0aXZlIGl0ZW0gdG8gLTEgc28gYXJyb3cgZXZlbnRzIHdpbGwgYWN0aXZhdGUgdGhlCiAgICAgICAgICogY29ycmVjdCBvcHRpb25zLCBvciB0byAwIGlmIHRoZSBjb25zdW1lciBvcHRlZCBpbnRvIGl0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfcmVzZXRBY3RpdmVJdGVtKCkgewogICAgICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZS5fa2V5TWFuYWdlci5zZXRBY3RpdmVJdGVtKHRoaXMuYXV0b2NvbXBsZXRlLmF1dG9BY3RpdmVGaXJzdE9wdGlvbiA/IDAgOiAtMSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERldGVybWluZXMgd2hldGhlciB0aGUgcGFuZWwgY2FuIGJlIG9wZW5lZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Nhbk9wZW4oKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudDsKICAgICAgICAgICAgcmV0dXJuICFlbGVtZW50LnJlYWRPbmx5ICYmICFlbGVtZW50LmRpc2FibGVkICYmICF0aGlzLl9hdXRvY29tcGxldGVEaXNhYmxlZDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVXNlIGRlZmF1bHRWaWV3IG9mIGluamVjdGVkIGRvY3VtZW50IGlmIGF2YWlsYWJsZSBvciBmYWxsYmFjayB0byBnbG9iYWwgd2luZG93IHJlZmVyZW5jZQogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZ2V0V2luZG93KCkgewogICAgICAgICAgICB2YXIgX2E7CiAgICAgICAgICAgIHJldHVybiAoKF9hID0gdGhpcy5fZG9jdW1lbnQpID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5kZWZhdWx0VmlldykgfHwgd2luZG93OwogICAgICAgIH0KICAgIH0KICAgIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIuybVmYWMgPSBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoT3ZlcmxheSksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld0NvbnRhaW5lclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdab25lKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0FVVE9DT01QTEVURV9TQ1JPTExfU1RSQVRFR1kpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KERpcmVjdGlvbmFsaXR5LCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfRk9STV9GSUVMRCwgOSksIMm1ybVkaXJlY3RpdmVJbmplY3QoRE9DVU1FTlQkMSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoVmlld3BvcnRSdWxlcikpOyB9OwogICAgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBzZWxlY3RvcnM6IFtbImlucHV0IiwgIm1hdEF1dG9jb21wbGV0ZSIsICIiXSwgWyJ0ZXh0YXJlYSIsICJtYXRBdXRvY29tcGxldGUiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWF1dG9jb21wbGV0ZS10cmlnZ2VyIl0sIGhvc3RWYXJzOiA3LCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImZvY3VzaW4iLCBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyX2ZvY3VzaW5fSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVGb2N1cygpOyB9KSgiYmx1ciIsIGZ1bmN0aW9uIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXJfYmx1cl9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX29uVG91Y2hlZCgpOyB9KSgiaW5wdXQiLCBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyX2lucHV0X0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlSW5wdXQoJGV2ZW50KTsgfSkoImtleWRvd24iLCBmdW5jdGlvbiBNYXRBdXRvY29tcGxldGVUcmlnZ2VyX2tleWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVLZXlkb3duKCRldmVudCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJhdXRvY29tcGxldGUiLCBjdHguYXV0b2NvbXBsZXRlQXR0cmlidXRlKSgicm9sZSIsIGN0eC5hdXRvY29tcGxldGVEaXNhYmxlZCA/IG51bGwgOiAiY29tYm9ib3giKSgiYXJpYS1hdXRvY29tcGxldGUiLCBjdHguYXV0b2NvbXBsZXRlRGlzYWJsZWQgPyBudWxsIDogImxpc3QiKSgiYXJpYS1hY3RpdmVkZXNjZW5kYW50IiwgY3R4LnBhbmVsT3BlbiAmJiBjdHguYWN0aXZlT3B0aW9uID8gY3R4LmFjdGl2ZU9wdGlvbi5pZCA6IG51bGwpKCJhcmlhLWV4cGFuZGVkIiwgY3R4LmF1dG9jb21wbGV0ZURpc2FibGVkID8gbnVsbCA6IGN0eC5wYW5lbE9wZW4udG9TdHJpbmcoKSkoImFyaWEtb3ducyIsIGN0eC5hdXRvY29tcGxldGVEaXNhYmxlZCB8fCAhY3R4LnBhbmVsT3BlbiA/IG51bGwgOiBjdHguYXV0b2NvbXBsZXRlID09IG51bGwgPyBudWxsIDogY3R4LmF1dG9jb21wbGV0ZS5pZCkoImFyaWEtaGFzcG9wdXAiLCAhY3R4LmF1dG9jb21wbGV0ZURpc2FibGVkKTsKICAgICAgICB9IH0sIGlucHV0czogeyBwb3NpdGlvbjogWyJtYXRBdXRvY29tcGxldGVQb3NpdGlvbiIsICJwb3NpdGlvbiJdLCBhdXRvY29tcGxldGVBdHRyaWJ1dGU6IFsiYXV0b2NvbXBsZXRlIiwgImF1dG9jb21wbGV0ZUF0dHJpYnV0ZSJdLCBhdXRvY29tcGxldGVEaXNhYmxlZDogWyJtYXRBdXRvY29tcGxldGVEaXNhYmxlZCIsICJhdXRvY29tcGxldGVEaXNhYmxlZCJdLCBhdXRvY29tcGxldGU6IFsibWF0QXV0b2NvbXBsZXRlIiwgImF1dG9jb21wbGV0ZSJdLCBjb25uZWN0ZWRUbzogWyJtYXRBdXRvY29tcGxldGVDb25uZWN0ZWRUbyIsICJjb25uZWN0ZWRUbyJdIH0sIGV4cG9ydEFzOiBbIm1hdEF1dG9jb21wbGV0ZVRyaWdnZXIiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbTUFUX0FVVE9DT01QTEVURV9WQUxVRV9BQ0NFU1NPUl0pLCDJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IE92ZXJsYXkgfSwKICAgICAgICB7IHR5cGU6IFZpZXdDb250YWluZXJSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0FVVE9DT01QTEVURV9TQ1JPTExfU1RSQVRFR1ksXSB9XSB9LAogICAgICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0sCiAgICAgICAgeyB0eXBlOiBNYXRGb3JtRmllbGQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0ZPUk1fRklFTEQsXSB9LCB7IHR5cGU6IEhvc3QgfV0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtET0NVTUVOVCQxLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFZpZXdwb3J0UnVsZXIgfQogICAgXTsKICAgIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgYXV0b2NvbXBsZXRlOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRBdXRvY29tcGxldGUnLF0gfV0sCiAgICAgICAgcG9zaXRpb246IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdEF1dG9jb21wbGV0ZVBvc2l0aW9uJyxdIH1dLAogICAgICAgIGNvbm5lY3RlZFRvOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydtYXRBdXRvY29tcGxldGVDb25uZWN0ZWRUbycsXSB9XSwKICAgICAgICBhdXRvY29tcGxldGVBdHRyaWJ1dGU6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2F1dG9jb21wbGV0ZScsXSB9XSwKICAgICAgICBhdXRvY29tcGxldGVEaXNhYmxlZDogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0QXV0b2NvbXBsZXRlRGlzYWJsZWQnLF0gfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvYXV0b2NvbXBsZXRlL2F1dG9jb21wbGV0ZS1tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWF0QXV0b2NvbXBsZXRlTW9kdWxlIHsKICAgIH0KICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1hdEF1dG9jb21wbGV0ZU1vZHVsZSB9KTsKICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdEF1dG9jb21wbGV0ZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRBdXRvY29tcGxldGVNb2R1bGUpKCk7IH0sIHByb3ZpZGVyczogW01BVF9BVVRPQ09NUExFVEVfU0NST0xMX1NUUkFURUdZX0ZBQ1RPUllfUFJPVklERVJdLCBpbXBvcnRzOiBbW01hdE9wdGlvbk1vZHVsZSwgT3ZlcmxheU1vZHVsZSwgTWF0Q29tbW9uTW9kdWxlLCBDb21tb25Nb2R1bGVdLAogICAgICAgICAgICBDZGtTY3JvbGxhYmxlTW9kdWxlLAogICAgICAgICAgICBNYXRPcHRpb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRBdXRvY29tcGxldGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0QXV0b2NvbXBsZXRlLAogICAgICAgICAgICBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLAogICAgICAgICAgICBNYXRBdXRvY29tcGxldGVPcmlnaW5dOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0T3B0aW9uTW9kdWxlLCBPdmVybGF5TW9kdWxlLCBNYXRDb21tb25Nb2R1bGUsIENvbW1vbk1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtDZGtTY3JvbGxhYmxlTW9kdWxlLAogICAgICAgICAgICBNYXRBdXRvY29tcGxldGUsCiAgICAgICAgICAgIE1hdE9wdGlvbk1vZHVsZSwKICAgICAgICAgICAgTWF0QXV0b2NvbXBsZXRlVHJpZ2dlciwKICAgICAgICAgICAgTWF0QXV0b2NvbXBsZXRlT3JpZ2luLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvbWFpbl92aWV3L2ZpbHRlcl9pbnB1dF9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50X21hdF9pY29uXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1pY29uIiwgNyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1ldHJpY3NGaWx0ZXJJbnB1dENvbXBvbmVudF9tYXRfb3B0aW9uXzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LW9wdGlvbiIsIDgpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjb21wbGV0aW9uX3IzID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY29tcGxldGlvbl9yMyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjb21wbGV0aW9uX3IzKTsKICAgIH0gfQogICAgY2xhc3MgTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uRmlsdGVyS2V5VXAoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LmtleSA9PT0gJ0VudGVyJykgewogICAgICAgICAgICAgICAgdGhpcy5hdXRvY29tcGxldGVUcmlnZ2VyLmNsb3NlUGFuZWwoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNvbXBsZXRpb24KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ29tcGxldGlvbkFjY2VwdGVkKGNvbXBsZXRpb24pIHsKICAgICAgICAgICAgdGhpcy5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdChlc2NhcGVGb3JSZWdleChjb21wbGV0aW9uKSk7CiAgICAgICAgfQogICAgfQogICAgTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLXRhZy1maWx0ZXItY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ2ZpbHRlcl9pbnB1dF9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbYGZpbHRlcl9pbnB1dF9jb21wb25lbnQuY3NzYF0sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBNZXRyaWNzRmlsdGVySW5wdXRDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgcmVnZXhGaWx0ZXJWYWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaXNSZWdleEZpbHRlclZhbGlkOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy52YWxpZCcsXSB9LCB7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbXBsZXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBhdXRvY29tcGxldGVUcmlnZ2VyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY3NGaWx0ZXJJbnB1dENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzRmlsdGVySW5wdXRDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50LCBzZWxlY3RvcnM6IFtbIm1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguYXV0b2NvbXBsZXRlVHJpZ2dlciA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1ldHJpY3NGaWx0ZXJJbnB1dENvbXBvbmVudF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoInZhbGlkIiwgY3R4LmlzUmVnZXhGaWx0ZXJWYWxpZCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgcmVnZXhGaWx0ZXJWYWx1ZTogInJlZ2V4RmlsdGVyVmFsdWUiLCBpc1JlZ2V4RmlsdGVyVmFsaWQ6ICJpc1JlZ2V4RmlsdGVyVmFsaWQiLCBjb21wbGV0aW9uczogImNvbXBsZXRpb25zIiB9LCBvdXRwdXRzOiB7IG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZTogIm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZSIgfSwgZGVjbHM6IDcsIHZhcnM6IDQsIGNvbnN0czogW1sxLCAidGFnLWZpbHRlciJdLCBbInN2Z0ljb24iLCAic2VhcmNoXzI0cHgiXSwgWyJtYXRJbnB1dCIsICIiLCAiYXV0b2NvbXBsZXRlIiwgIm9mZiIsICJwbGFjZWhvbGRlciIsICJGaWx0ZXIgdGFncyAocmVnZXgpIiwgMywgInZhbHVlIiwgIm1hdEF1dG9jb21wbGV0ZSIsICJpbnB1dCIsICJrZXl1cCJdLCBbInN2Z0ljb24iLCAiZXJyb3JfMjRweCIsICJjbGFzcyIsICJlcnJvci1pY29uIiwgInRpdGxlIiwgIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLCA0LCAibmdJZiJdLCBbMywgIm9wdGlvblNlbGVjdGVkIl0sIFsiZmlsdGVyTWF0Y2hlcyIsICJtYXRBdXRvY29tcGxldGUiXSwgWzMsICJ2YWx1ZSIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsic3ZnSWNvbiIsICJlcnJvcl8yNHB4IiwgInRpdGxlIiwgIkludmFsaWQgcmVnZXggZmlsdGVyLiBUaGUgcmVzdWx0IG1heSBiZSBzdGFsZS4iLCAxLCAiZXJyb3ItaWNvbiJdLCBbMywgInZhbHVlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMSwgIm1hdC1pY29uIiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImlucHV0IiwgMik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiBNZXRyaWNzRmlsdGVySW5wdXRDb21wb25lbnRfVGVtcGxhdGVfaW5wdXRfaW5wdXRfMl9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdCgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSkoImtleXVwIiwgZnVuY3Rpb24gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50X1RlbXBsYXRlX2lucHV0X2tleXVwXzJfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25GaWx0ZXJLZXlVcCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDMsIE1ldHJpY3NGaWx0ZXJJbnB1dENvbXBvbmVudF9tYXRfaWNvbl8zX1RlbXBsYXRlLCAxLCAwLCAibWF0LWljb24iLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAibWF0LWF1dG9jb21wbGV0ZSIsIDQsIDUpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9wdGlvblNlbGVjdGVkIiwgZnVuY3Rpb24gTWV0cmljc0ZpbHRlcklucHV0Q29tcG9uZW50X1RlbXBsYXRlX21hdF9hdXRvY29tcGxldGVfb3B0aW9uU2VsZWN0ZWRfNF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkNvbXBsZXRpb25BY2NlcHRlZCgkZXZlbnQub3B0aW9uLnZhbHVlKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg2LCBNZXRyaWNzRmlsdGVySW5wdXRDb21wb25lbnRfbWF0X29wdGlvbl82X1RlbXBsYXRlLCAyLCAyLCAibWF0LW9wdGlvbiIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICBjb25zdCBfcjEgPSDJtcm1cmVmZXJlbmNlKDUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eC5yZWdleEZpbHRlclZhbHVlKSgibWF0QXV0b2NvbXBsZXRlIiwgX3IxKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFjdHguaXNSZWdleEZpbHRlclZhbGlkKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5jb21wbGV0aW9ucyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0SWNvbiwgTWF0SW5wdXQsIE1hdEF1dG9jb21wbGV0ZVRyaWdnZXIsIE5nSWYsIE1hdEF1dG9jb21wbGV0ZSwgTmdGb3JPZiwgTWF0T3B0aW9uXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9LnRhZy1maWx0ZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjpyZWxhdGl2ZX1tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmbGV4Om5vbmU7bWFyZ2luLXJpZ2h0OjVweH1bX25naG9zdC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Zm9udC1zaXplOjEzcHh9W19uZ2hvc3QtJUNPTVAlXTpub3QoLnZhbGlkKXtjb2xvcjojYzYyODI4fVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCkgICBpbnB1dFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCkgICAuZXJyb3ItaWNvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2M2MjgyODtwb3NpdGlvbjphYnNvbHV0ZTtyaWdodDowfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tYWluX3ZpZXcvZmlsdGVyX2lucHV0X2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNZXRyaWNzRmlsdGVySW5wdXRDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMudGFnRmlsdGVyJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NUYWdGaWx0ZXIpOwogICAgICAgICAgICB0aGlzLmlzVGFnRmlsdGVyUmVnZXhWYWxpZCQgPSB0aGlzLnRhZ0ZpbHRlciQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhZ0ZpbHRlclN0cmluZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHRhZ0ZpbHRlclN0cmluZykgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb24gQ2hlY2sgZm9yIHZhbGlkaXR5IG9mIGZpbHRlci4KICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKHRhZ0ZpbHRlclN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmNvbXBsZXRpb25zJCA9IHRoaXMuc3RvcmUKICAgICAgICAgICAgICAgIC5zZWxlY3QoZ2V0Tm9uRW1wdHlDYXJkSWRzV2l0aE1ldGFkYXRhKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTGlzdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNhcmRMaXN0KSA9PiBjYXJkTGlzdC5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHsgdGFnIH0pID0+IHRhZykpKSksIHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZExpc3QKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjYXJkTGlzdCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgICAgIG9mKGNhcmRMaXN0KSwKICAgICAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzVGFnRmlsdGVyKSwKICAgICAgICAgICAgICAgIF0pOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3RhZ3MsIHRhZ0ZpbHRlcl0pID0+IHsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cCh0YWdGaWx0ZXIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBbdGFncywgcmVnZXhdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3RhZ3MsIG51bGxdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSksIGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoWywgdGFnRmlsdGVyUmVnZXhdKSA9PiB0YWdGaWx0ZXJSZWdleCAhPT0gbnVsbCkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFt0YWdzLCB0YWdGaWx0ZXJSZWdleF0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiB0YWdzCiAgICAgICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHRhZykgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHRhZ0ZpbHRlclJlZ2V4KSkudGVzdCh0YWcpKSkKICAgICAgICAgICAgICAgICAgICAuc29ydChjb21wYXJlVGFnTmFtZXMpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHRhZ0ZpbHRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25UYWdGaWx0ZXJDaGFuZ2UodGFnRmlsdGVyKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWV0cmljc1RhZ0ZpbHRlckNoYW5nZWQoeyB0YWdGaWx0ZXIgfSkpOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY3NGaWx0ZXJJbnB1dENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy10YWctZmlsdGVyJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPG1ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQKICAgICAgW3JlZ2V4RmlsdGVyVmFsdWVdPSJ0YWdGaWx0ZXIkIHwgYXN5bmMiCiAgICAgIFtpc1JlZ2V4RmlsdGVyVmFsaWRdPSJpc1RhZ0ZpbHRlclJlZ2V4VmFsaWQkIHwgYXN5bmMiCiAgICAgIFtjb21wbGV0aW9uc109ImNvbXBsZXRpb25zJCB8IGFzeW5jIgogICAgICAob25SZWdleEZpbHRlclZhbHVlQ2hhbmdlKT0ib25UYWdGaWx0ZXJDaGFuZ2UoJGV2ZW50KSIKICAgID48L21ldHJpY3MtdGFnLWZpbHRlci1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWV0cmljc0ZpbHRlcklucHV0Q29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzRmlsdGVySW5wdXRDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBNZXRyaWNzRmlsdGVySW5wdXRDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWV0cmljc0ZpbHRlcklucHV0Q29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljc0ZpbHRlcklucHV0Q29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1ldHJpY3NGaWx0ZXJJbnB1dENvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJtZXRyaWNzLXRhZy1maWx0ZXIiXV0sIGRlY2xzOiA0LCB2YXJzOiA5LCBjb25zdHM6IFtbMywgInJlZ2V4RmlsdGVyVmFsdWUiLCAiaXNSZWdleEZpbHRlclZhbGlkIiwgImNvbXBsZXRpb25zIiwgIm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1ldHJpY3NGaWx0ZXJJbnB1dENvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWV0cmljcy10YWctZmlsdGVyLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZSIsIGZ1bmN0aW9uIE1ldHJpY3NGaWx0ZXJJbnB1dENvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNzX3RhZ19maWx0ZXJfY29tcG9uZW50X29uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uVGFnRmlsdGVyQ2hhbmdlKCRldmVudCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInJlZ2V4RmlsdGVyVmFsdWUiLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC50YWdGaWx0ZXIkKSkoImlzUmVnZXhGaWx0ZXJWYWxpZCIsIMm1ybVwaXBlQmluZDEoMiwgNSwgY3R4LmlzVGFnRmlsdGVyUmVnZXhWYWxpZCQpKSgiY29tcGxldGlvbnMiLCDJtcm1cGlwZUJpbmQxKDMsIDcsIGN0eC5jb21wbGV0aW9ucyQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNZXRyaWNzRmlsdGVySW5wdXRDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC93aWRnZXRzL3RleHQvdHJ1bmNhdGVkX3BhdGhfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGZ1bmN0aW9uIFRydW5jYXRlZFBhdGhDb21wb25lbnRfc3Bhbl8wX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAyKTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHhfcjAuZmlyc3RUZXh0UGFydCgpKTsKICAgIH0gfQogICAgLyoqCiAgICAgKiBBIGNvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGEgJy8nIGRlbGltaXRlZCBwYXRoLiBXaGVuIHRleHQgZXhjZWVkcyBpdHMKICAgICAqIGNvbnRhaW5lcidzIHdpZHRoLCBpdCB3aWxsIHRyeSB0byBzaG93IGFzIG11Y2ggb2YgdGhlIGxhc3QgJy8nIHNsYXNoIHBpZWNlIGFzCiAgICAgKiBwb3NzaWJsZS4gSWYgdGhlcmUgaXMgbm8gc2xhc2ggcGllY2UsIGl0IHNpbXBseSB0cnVuY2F0ZXMgZnJvbSB0aGUgcmlnaHQgd2l0aAogICAgICogZWxsaXBzaXMuCiAgICAgKi8KICAgIGNsYXNzIFRydW5jYXRlZFBhdGhDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBwYXJzZVZhbHVlKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGxhc3RQaWVjZUluZGV4ID0gdGhpcy52YWx1ZS5sYXN0SW5kZXhPZignLycpOwogICAgICAgICAgICBpZiAobGFzdFBpZWNlSW5kZXggPT09IC0xKSB7CiAgICAgICAgICAgICAgICByZXR1cm4geyBmaXJzdDogJycsIHNlY29uZDogdGhpcy52YWx1ZSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICBmaXJzdDogdGhpcy52YWx1ZS5zbGljZSgwLCBsYXN0UGllY2VJbmRleCksCiAgICAgICAgICAgICAgICBzZWNvbmQ6IHRoaXMudmFsdWUuc2xpY2UobGFzdFBpZWNlSW5kZXgpLAogICAgICAgICAgICB9OwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZpcnN0VGV4dFBhcnQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcnNlVmFsdWUoKS5maXJzdDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZWNvbmRUZXh0UGFydCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMucGFyc2VWYWx1ZSgpLnNlY29uZDsKICAgICAgICB9CiAgICB9CiAgICBUcnVuY2F0ZWRQYXRoQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Yi10cnVuY2F0ZWQtcGF0aCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxzcGFuICpuZ0lmPSJmaXJzdFRleHRQYXJ0KCkubGVuZ3RoID4gMCIgY2xhc3M9ImZpcnN0LXRleHQtcGFydCI+e3sKICAgICAgZmlyc3RUZXh0UGFydCgpCiAgICB9fTwvc3Bhbj4KICAgIDxzcGFuIGNsYXNzPSJzZWNvbmQtdGV4dC1wYXJ0Ij57eyBzZWNvbmRUZXh0UGFydCgpIH19PC9zcGFuPgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbYHRydW5jYXRlZF9wYXRoX2NvbXBvbmVudC5jc3NgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFRydW5jYXRlZFBhdGhDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRydW5jYXRlZFBhdGhDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBUcnVuY2F0ZWRQYXRoQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRydW5jYXRlZFBhdGhDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVHJ1bmNhdGVkUGF0aENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBUcnVuY2F0ZWRQYXRoQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInRiLXRydW5jYXRlZC1wYXRoIl1dLCBpbnB1dHM6IHsgdmFsdWU6ICJ2YWx1ZSIgfSwgZGVjbHM6IDMsIHZhcnM6IDIsIGNvbnN0czogW1siY2xhc3MiLCAiZmlyc3QtdGV4dC1wYXJ0IiwgNCwgIm5nSWYiXSwgWzEsICJzZWNvbmQtdGV4dC1wYXJ0Il0sIFsxLCAiZmlyc3QtdGV4dC1wYXJ0Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gVHJ1bmNhdGVkUGF0aENvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDAsIFRydW5jYXRlZFBhdGhDb21wb25lbnRfc3Bhbl8wX1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJzcGFuIiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZmlyc3RUZXh0UGFydCgpLmxlbmd0aCA+IDApOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHguc2Vjb25kVGV4dFBhcnQoKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZl0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWZsZXg7d2hpdGUtc3BhY2U6bm93cmFwfS5maXJzdC10ZXh0LXBhcnRbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDRjaDttYXgtd2lkdGg6bWF4LWNvbnRlbnR9LmZpcnN0LXRleHQtcGFydFtfbmdjb250ZW50LSVDT01QJV0sIC5zZWNvbmQtdGV4dC1wYXJ0W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30iXSB9KTsKCiAgICBmdW5jdGlvbiBnZXREaXNwbGF5TmFtZUZvclJ1bihydW5JZCwgcnVuLCBleHBlcmltZW50TmFtZSkgewogICAgICAgIGlmICghcnVuICYmICFleHBlcmltZW50TmFtZSkgewogICAgICAgICAgICByZXR1cm4gcnVuSWQ7CiAgICAgICAgfQogICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gW2V4cGVyaW1lbnROYW1lLCBydW4gPyBydW4ubmFtZSA6ICcuLi4nXQogICAgICAgICAgICAuZmlsdGVyKEJvb2xlYW4pCiAgICAgICAgICAgIC5qb2luKCcvJyk7CiAgICAgICAgcmV0dXJuIGRpc3BsYXlOYW1lOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9ydW5fbmFtZV9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUnVuTmFtZUNvbXBvbmVudCB7CiAgICB9CiAgICBSdW5OYW1lQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdjYXJkLXJ1bi1uYW1lLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICd7eyBuYW1lIH19JywKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFJ1bk5hbWVDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbmFtZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuTmFtZUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFJ1bk5hbWVDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUnVuTmFtZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5OYW1lQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFJ1bk5hbWVDb21wb25lbnQsIHNlbGVjdG9yczogW1siY2FyZC1ydW4tbmFtZS1jb21wb25lbnQiXV0sIGlucHV0czogeyBuYW1lOiAibmFtZSIgfSwgZGVjbHM6IDEsIHZhcnM6IDEsIHRlbXBsYXRlOiBmdW5jdGlvbiBSdW5OYW1lQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dGV4dCgwKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjdHgubmFtZSk7CiAgICAgICAgfSB9LCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9jYXJkX3JlbmRlcmVyL3J1bl9uYW1lX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSdW5OYW1lQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBCdWlsZCBvYnNlcnZhYmxlcyBvbmNlIHJ1bklkIGlzIGRlZmluZWQgKGFmdGVyIG9uSW5pdCkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5uYW1lJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UnVuLCB7IHJ1bklkOiB0aGlzLnJ1bklkIH0pLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RXhwZXJpbWVudElkRm9yUnVuSWQsIHsgcnVuSWQ6IHRoaXMucnVuSWQgfSksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRFeHBlcmltZW50SWRUb0FsaWFzTWFwKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtydW4sIGV4cGVyaW1lbnRJZCwgaWRUb0FsaWFzXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGdldERpc3BsYXlOYW1lRm9yUnVuKHRoaXMucnVuSWQsIHJ1biwgZXhwZXJpbWVudElkID8gaWRUb0FsaWFzW2V4cGVyaW1lbnRJZF0gOiBudWxsKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICB9CiAgICBSdW5OYW1lQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdjYXJkLXJ1bi1uYW1lJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGNhcmQtcnVuLW5hbWUtY29tcG9uZW50CiAgICAgIFtuYW1lXT0ibmFtZSQgfCBhc3luYyIKICAgICAgW2F0dHIudGl0bGVdPSJuYW1lJCB8IGFzeW5jIgogICAgPjwvY2FyZC1ydW4tbmFtZS1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUnVuTmFtZUNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBSdW5OYW1lQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHJ1bklkOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5OYW1lQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gUnVuTmFtZUNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSdW5OYW1lQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuTmFtZUNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSdW5OYW1lQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbImNhcmQtcnVuLW5hbWUiXV0sIGlucHV0czogeyBydW5JZDogInJ1bklkIiB9LCBkZWNsczogMywgdmFyczogNiwgY29uc3RzOiBbWzMsICJuYW1lIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUnVuTmFtZUNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgImNhcmQtcnVuLW5hbWUtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuYW1lIiwgybXJtXBpcGVCaW5kMSgxLCAyLCBjdHgubmFtZSQpKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidGl0bGUiLCDJtcm1cGlwZUJpbmQxKDIsIDQsIGN0eC5uYW1lJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1J1bk5hbWVDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL2NhcmRfcmVuZGVyZXIvaW1hZ2VfY2FyZF9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgdmFyIEkxOE5fMCQyOwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfNzI4NDYwNjQyNjIzNDM3NTM0NCQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9JTUFHRV9DQVJEX0NPTVBPTkVOVF9UU18xID0gZ29vZy5nZXRNc2coIlBpbiBjYXJkIik7CiAgICAgICAgSTE4Tl8wJDIgPSBNU0dfRVhURVJOQUxfNzI4NDYwNjQyNjIzNDM3NTM0NCQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9JTUFHRV9DQVJEX0NPTVBPTkVOVF9UU18xOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgSTE4Tl8wJDIgPSAkbG9jYWxpemUgYDpBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLuKQn2U2NjVkYzcxMmJkNWYxOGQ0ZGZhM2EyOWUxMjVkNTY1Y2M1MWUyZjbikJ83Mjg0NjA2NDI2MjM0Mzc1MzQ0OlBpbiBjYXJkYDsKICAgIH0KICAgIGNvbnN0IF9jMiQ4ID0gWyJhcmlhLWxhYmVsIiwgSTE4Tl8wJDJdOwogICAgdmFyIEkxOE5fMzsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgQSBidXR0b24gb24gYW4gaW1hZ2UgY2FyZCB0aGF0IHRvZ2dsZXMgYWN0dWFsIGltYWdlIHNpemUuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF83NjM1MTAxOTM2NjY0Nzg5MTQwJCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19DQVJEX1JFTkRFUkVSX0lNQUdFX0NBUkRfQ09NUE9ORU5UX1RTXzQgPSBnb29nLmdldE1zZygiVG9nZ2xlIGFjdHVhbCBpbWFnZSBzaXplIik7CiAgICAgICAgSTE4Tl8zID0gTVNHX0VYVEVSTkFMXzc2MzUxMDE5MzY2NjQ3ODkxNDAkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX0NBUkRfUkVOREVSRVJfSU1BR0VfQ0FSRF9DT01QT05FTlRfVFNfNDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMyA9ICRsb2NhbGl6ZSBgOkEgYnV0dG9uIG9uIGFuIGltYWdlIGNhcmQgdGhhdCB0b2dnbGVzIGFjdHVhbCBpbWFnZSBzaXplLuKQnzNjYTA1ZWYzYTZlM2EzNzA2NWY1ZTBmNjljNWQ1YTIxNzhkOTA3OTHikJ83NjM1MTAxOTM2NjY0Nzg5MTQwOlRvZ2dsZSBhY3R1YWwgaW1hZ2Ugc2l6ZWA7CiAgICB9CiAgICBjb25zdCBfYzUkMiA9IFsiYXJpYS1sYWJlbCIsIEkxOE5fM107CiAgICBmdW5jdGlvbiBJbWFnZUNhcmRDb21wb25lbnRfZGl2XzVfbWF0X3NwaW5uZXJfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWF0LXNwaW5uZXIiLCAxNSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEltYWdlQ2FyZENvbXBvbmVudF9kaXZfNV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAxMyk7CiAgICAgICAgybXJtXRleHQoMSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIEltYWdlQ2FyZENvbXBvbmVudF9kaXZfNV9tYXRfc3Bpbm5lcl8yX1RlbXBsYXRlLCAxLCAwLCAibWF0LXNwaW5uZXIiLCAxNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgU3RlcCAiLCBjdHhfcjAuc3RlcFZhbHVlc1tjdHhfcjAuc3RlcEluZGV4XSwgIiAiKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjAubG9hZFN0YXRlID09PSBjdHhfcjAuRGF0YUxvYWRTdGF0ZS5MT0FESU5HKTsKICAgIH0gfQogICAgY29uc3QgX2M2JDEgPSBmdW5jdGlvbiAoYTApIHsgcmV0dXJuIHsgImZpbHRlciI6IGEwIH07IH07CiAgICBmdW5jdGlvbiBJbWFnZUNhcmRDb21wb25lbnRfbmdfY29udGFpbmVyXzEzX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNiA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTYpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgIm1hdC1zbGlkZXIiLCAxNyk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIEltYWdlQ2FyZENvbXBvbmVudF9uZ19jb250YWluZXJfMTNfVGVtcGxhdGVfbWF0X3NsaWRlcl9pbnB1dF8yX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I2KTsgY29uc3QgY3R4X3I1ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjUub25TbGlkZXJJbnB1dCgkZXZlbnQpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMTgpOwogICAgICAgIMm1ybVlbGVtZW50KDQsICJpbWciLCAxOSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJkaXNhYmxlZCIsIGN0eF9yMS5zdGVwVmFsdWVzLmxlbmd0aCA8PSAxKSgibWluIiwgMCkoIm1heCIsIGN0eF9yMS5zdGVwVmFsdWVzLmxlbmd0aCAtIDEpKCJzdGVwIiwgMSkoInRpY2tJbnRlcnZhbCIsIDEpKCJ2YWx1ZSIsIGN0eF9yMS5zdGVwSW5kZXgpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlMSgiYWx0IiwgIkltYWdlIGF0IHN0ZXAgIiwgY3R4X3IxLnN0ZXBWYWx1ZXNbY3R4X3IxLnN0ZXBJbmRleF0sICIiKTsKICAgICAgICDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZSgic3JjIiwgY3R4X3IxLmltYWdlVXJsLCDJtcm1c2FuaXRpemVVcmwpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTdHlsZSIsIMm1ybVwdXJlRnVuY3Rpb24xKDksIF9jNiQxLCBjdHhfcjEuY3NzRmlsdGVyKCkpKTsKICAgIH0gfQogICAgZnVuY3Rpb24gSW1hZ2VDYXJkQ29tcG9uZW50X25nX3RlbXBsYXRlXzE0X2Rpdl8wX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDIxKTsKICAgICAgICDJtcm1dGV4dCgxLCAiIERhdGEgZmFpbGVkIHRvIGxvYWQuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEltYWdlQ2FyZENvbXBvbmVudF9uZ190ZW1wbGF0ZV8xNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dGVtcGxhdGUoMCwgSW1hZ2VDYXJkQ29tcG9uZW50X25nX3RlbXBsYXRlXzE0X2Rpdl8wX1RlbXBsYXRlLCAyLCAwLCAiZGl2IiwgMjApOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IzID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IzLmxvYWRTdGF0ZSA9PT0gY3R4X3IzLkRhdGFMb2FkU3RhdGUuRkFJTEVEKTsKICAgIH0gfQogICAgY29uc3QgX2M3JDEgPSBmdW5jdGlvbiAoYTApIHsgcmV0dXJuIHsgYmFja2dyb3VuZENvbG9yOiBhMCB9OyB9OwogICAgY2xhc3MgSW1hZ2VDYXJkQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5EYXRhTG9hZFN0YXRlID0gRGF0YUxvYWRTdGF0ZTsKICAgICAgICAgICAgdGhpcy5vbkFjdHVhbFNpemVUb2dnbGUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuc3RlcEluZGV4Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uUGluQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjc3NGaWx0ZXIoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYnJpZ2h0bmVzc1NjYWxlID0gdGhpcy5icmlnaHRuZXNzSW5NaWxsaSAvIDEwMDA7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29udHJhc3RQZXJjZW50ID0gdGhpcy5jb250cmFzdEluTWlsbGkgLyAxMDsKICAgICAgICAgICAgcmV0dXJuIGBjb250cmFzdCgke2NvbnRyYXN0UGVyY2VudH0lKSBicmlnaHRuZXNzKCR7YnJpZ2h0bmVzc1NjYWxlfSlgOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99ICRldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25TbGlkZXJJbnB1dCgkZXZlbnQpIHsKICAgICAgICAgICAgLy8gQW5ndWxhciBNYXRlcmlhbCBTbGlkZXIncyBNYXRTbGlkZXJDaGFuZ2UgaGFzIGEgbG9vc2UgYG51bWJlciB8IG51bGxgCiAgICAgICAgICAgIC8vIHR5cGUgZm9yICd2YWx1ZScuIEhvd2V2ZXIsIGl0J3MgYWN0dWFsIGltcGxlbWVudGF0aW9uIGNhbiBvbmx5IGVtaXQgYQogICAgICAgICAgICAvLyBgbnVtYmVyYCBvbiBpbnB1dCBldmVudHMuCiAgICAgICAgICAgIC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9hbmd1bGFyL2NvbXBvbmVudHMvYmxvYi9tYXN0ZXIvc3JjL21hdGVyaWFsL3NsaWRlci9zbGlkZXIudHMKICAgICAgICAgICAgdGhpcy5zdGVwSW5kZXhDaGFuZ2UuZW1pdCgoLyoqIEB0eXBlIHs/fSAqLyAoJGV2ZW50LnZhbHVlKSkpOwogICAgICAgIH0KICAgIH0KICAgIEltYWdlQ2FyZENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnaW1hZ2UtY2FyZC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnaW1hZ2VfY2FyZF9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJ2ltYWdlX2NhcmRfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGhvc3Q6IHsKICAgICAgICAgICAgICAgICAgICAgICAgJ1tjbGFzcy5hY3R1YWwtc2l6ZV0nOiAnc2hvd0FjdHVhbFNpemUnLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBJbWFnZUNhcmRDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbG9hZFN0YXRlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0aXRsZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdGFnOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBydW5JZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2FtcGxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpbWFnZVVybDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc3RlcEluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzdGVwVmFsdWVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBicmlnaHRuZXNzSW5NaWxsaTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY29udHJhc3RJbk1pbGxpOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzaG93QWN0dWFsU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcnVuQ29sb3JTY2FsZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYWxsb3dUb2dnbGVBY3R1YWxTaXplOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpc1Bpbm5lZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25BY3R1YWxTaXplVG9nZ2xlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgc3RlcEluZGV4Q2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25QaW5DbGlja2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW1hZ2VDYXJkQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gSW1hZ2VDYXJkQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEltYWdlQ2FyZENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBJbWFnZUNhcmRDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSW1hZ2VDYXJkQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImltYWdlLWNhcmQtY29tcG9uZW50Il1dLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBJbWFnZUNhcmRDb21wb25lbnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJhY3R1YWwtc2l6ZSIsIGN0eC5zaG93QWN0dWFsU2l6ZSk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgbG9hZFN0YXRlOiAibG9hZFN0YXRlIiwgdGl0bGU6ICJ0aXRsZSIsIHRhZzogInRhZyIsIHJ1bklkOiAicnVuSWQiLCBzYW1wbGU6ICJzYW1wbGUiLCBpbWFnZVVybDogImltYWdlVXJsIiwgc3RlcEluZGV4OiAic3RlcEluZGV4Iiwgc3RlcFZhbHVlczogInN0ZXBWYWx1ZXMiLCBicmlnaHRuZXNzSW5NaWxsaTogImJyaWdodG5lc3NJbk1pbGxpIiwgY29udHJhc3RJbk1pbGxpOiAiY29udHJhc3RJbk1pbGxpIiwgc2hvd0FjdHVhbFNpemU6ICJzaG93QWN0dWFsU2l6ZSIsIHJ1bkNvbG9yU2NhbGU6ICJydW5Db2xvclNjYWxlIiwgYWxsb3dUb2dnbGVBY3R1YWxTaXplOiAiYWxsb3dUb2dnbGVBY3R1YWxTaXplIiwgaXNQaW5uZWQ6ICJpc1Bpbm5lZCIgfSwgb3V0cHV0czogeyBvbkFjdHVhbFNpemVUb2dnbGU6ICJvbkFjdHVhbFNpemVUb2dnbGUiLCBzdGVwSW5kZXhDaGFuZ2U6ICJzdGVwSW5kZXhDaGFuZ2UiLCBvblBpbkNsaWNrZWQ6ICJvblBpbkNsaWNrZWQiIH0sIGRlY2xzOiAxNiwgdmFyczogMTIsIGNvbnN0czogW1sxLCAiaGVhZGluZyJdLCBbMSwgInRhZyIsIDMsICJ0aXRsZSIsICJ2YWx1ZSJdLCBbMSwgInJ1biJdLCBbMSwgImRvdCIsIDMsICJuZ1N0eWxlIl0sIFsxLCAicnVuLXRleHQiLCAzLCAicnVuSWQiXSwgWyJjbGFzcyIsICJzdGVwIiwgNCwgIm5nSWYiXSwgWzEsICJjb250cm9scyJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAxLCAicGluLWJ1dHRvbiIsIDMsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFszLCAic3ZnSWNvbiJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidGl0bGUiLCAiVG9nZ2xlIGFjdHVhbCBpbWFnZSBzaXplIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgImltYWdlX3NlYXJjaF8yNHB4Il0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbIm5vSW1hZ2VEYXRhIiwgIiJdLCBbMSwgInN0ZXAiXSwgWyJkaWFtZXRlciIsICIxOCIsIDQsICJuZ0lmIl0sIFsiZGlhbWV0ZXIiLCAiMTgiXSwgWzEsICJzbGlkZXItcm93Il0sIFsiY29sb3IiLCAicHJpbWFyeSIsIDEsICJzdGVwLXNsaWRlciIsIDMsICJkaXNhYmxlZCIsICJtaW4iLCAibWF4IiwgInN0ZXAiLCAidGlja0ludGVydmFsIiwgInZhbHVlIiwgImlucHV0Il0sIFsxLCAiaW1nLWNvbnRhaW5lciJdLCBbMywgImFsdCIsICJzcmMiLCAibmdTdHlsZSJdLCBbImNsYXNzIiwgImVtcHR5LW1lc3NhZ2UiLCA0LCAibmdJZiJdLCBbMSwgImVtcHR5LW1lc3NhZ2UiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBJbWFnZUNhcmRDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxLCAidGItdHJ1bmNhdGVkLXBhdGgiLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDMsICJzcGFuIiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDQsICJjYXJkLXJ1bi1uYW1lIiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg1LCBJbWFnZUNhcmRDb21wb25lbnRfZGl2XzVfVGVtcGxhdGUsIDMsIDIsICJkaXYiLCA1KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg2LCAic3BhbiIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJidXR0b24iLCA3KTsKICAgICAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDgsIF9jMiQ4KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEltYWdlQ2FyZENvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfN19saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vblBpbkNsaWNrZWQuZW1pdCghY3R4LmlzUGlubmVkKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDksICJtYXQtaWNvbiIsIDgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEwLCAiYnV0dG9uIiwgOSk7CiAgICAgICAgICAgIMm1ybVpMThuQXR0cmlidXRlcygxMSwgX2M1JDIpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gSW1hZ2VDYXJkQ29tcG9uZW50X1RlbXBsYXRlX2J1dHRvbl9jbGlja18xMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkFjdHVhbFNpemVUb2dnbGUuZW1pdCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMTIsICJtYXQtaWNvbiIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEzLCBJbWFnZUNhcmRDb21wb25lbnRfbmdfY29udGFpbmVyXzEzX1RlbXBsYXRlLCA1LCAxMSwgIm5nLWNvbnRhaW5lciIsIDExKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDE0LCBJbWFnZUNhcmRDb21wb25lbnRfbmdfdGVtcGxhdGVfMTRfVGVtcGxhdGUsIDEsIDEsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDEyLCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICBjb25zdCBfcjIgPSDJtcm1cmVmZXJlbmNlKDE1KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJ0aXRsZSIsIGN0eC50YWcpOwogICAgICAgICAgICDJtcm1cHJvcGVydHlJbnRlcnBvbGF0ZSgidmFsdWUiLCBjdHgudGl0bGUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N0eWxlIiwgybXJtXB1cmVGdW5jdGlvbjEoMTAsIF9jNyQxLCBjdHgucnVuQ29sb3JTY2FsZShjdHgucnVuSWQpKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoInJ1bklkIiwgY3R4LnJ1bklkKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zdGVwSW5kZXggIT09IG51bGwgJiYgY3R4LnN0ZXBJbmRleCA8IGN0eC5zdGVwVmFsdWVzLmxlbmd0aCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ0aXRsZSIsIGN0eC5pc1Bpbm5lZCA/ICJVbnBpbiBjYXJkIiA6ICJQaW4gY2FyZCIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJzdmdJY29uIiwgY3R4LmlzUGlubmVkID8gImtlZXBfMjRweCIgOiAia2VlcF9vdXRsaW5lXzI0cHgiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiZGlzYWJsZWQiLCAhY3R4LmFsbG93VG9nZ2xlQWN0dWFsU2l6ZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguc3RlcEluZGV4ICE9PSBudWxsICYmIGN0eC5zdGVwSW5kZXggPCBjdHguc3RlcFZhbHVlcy5sZW5ndGgpKCJuZ0lmRWxzZSIsIF9yMik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbVHJ1bmNhdGVkUGF0aENvbXBvbmVudCwgTmdTdHlsZSwgUnVuTmFtZUNvbnRhaW5lciwgTmdJZiwgTWF0QnV0dG9uLCBNYXRJY29uLCBNYXRTcGlubmVyLCBNYXRTbGlkZXJdLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47Ym94LXNpemluZzpib3JkZXItYm94O2hlaWdodDoxMDAlO292ZXJmbG93OmF1dG87cGFkZGluZzoxNnB4O3BhZGRpbmctdG9wOjRweH0uYWN0dWFsLXNpemVbX25naG9zdC0lQ09NUCVde2hlaWdodDphdXRvfS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtYXJlYXM6XCJ0YWcgY29udHJvbHNcIiBcInJ1biBzdGVwXCI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciBhdXRvO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1ib3R0b206NHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS50YWdbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTp0YWc7b3ZlcmZsb3c6aGlkZGVufS5waW4tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MThweH0ucnVuW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWFyZWE6cnVuO2Rpc3BsYXk6ZmxleDt3aGl0ZS1zcGFjZTpub3dyYXB9LnJ1bltfbmdjb250ZW50LSVDT01QJV0gICAuZG90W19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7d2lkdGg6MTNweDtoZWlnaHQ6MTNweDtib3JkZXItcmFkaXVzOjUwJTttYXJnaW4tcmlnaHQ6NHB4fS5ydW5bX25nY29udGVudC0lQ09NUCVdICAgLnJ1bi10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpczttYXgtd2lkdGg6MTIwcHh9LnN0ZXBbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTpzdGVwO2Rpc3BsYXk6ZmxleH0uc3RlcFtfbmdjb250ZW50LSVDT01QJV0gICBtYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6NHB4O21hcmdpbi1yaWdodDowfS5ydW5bX25nY29udGVudC0lQ09NUCVdLCAuc3RlcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHg7Y29sb3I6IzYxNjE2MTtoZWlnaHQ6MTVweH0uY29udHJvbHNbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7Z3JpZC1hcmVhOmNvbnRyb2xzO2p1c3RpZnktc2VsZjpmbGV4LWVuZDtmbGV4LXNocmluazowO21hcmdpbi1yaWdodDotMTJweDt3aGl0ZS1zcGFjZTpub3dyYXB9LmltZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MSAxIDA7b3ZlcmZsb3cteTphdXRvO3Bvc2l0aW9uOnJlbGF0aXZlfS5pbWctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGltZ1tfbmdjb250ZW50LSVDT01QJV17aW1hZ2UtcmVuZGVyaW5nOi1tb3otY3Jpc3AtZWRnZXM7aW1hZ2UtcmVuZGVyaW5nOnBpeGVsYXRlZH0uYWN0dWFsLXNpemVbX25naG9zdC0lQ09NUCVdICAgLmltZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmF1dG87ZmxleDpub25lfVtfbmdob3N0LSVDT01QJV06bm90KC5hY3R1YWwtc2l6ZSkgICBpbWdbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO21heC1oZWlnaHQ6MTAwJTttYXgtd2lkdGg6MTAwJTt3aWR0aDphdXRvO2hlaWdodDoxMDAlO29iamVjdC1maXQ6Y29udGFpbn0uc2xpZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6MjRweH0uc3RlcC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MX1bX25naG9zdC0lQ09NUCVdICAgICAubWF0LXNsaWRlci1taW4tdmFsdWUgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOjFlbTtmb250LXNpemU6MTNweH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9pbWFnZV9jYXJkX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBJbWFnZUNhcmRDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGFTb3VyY2UKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSwgZGF0YVNvdXJjZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgICAgICAgIHRoaXMuZnVsbFdpZHRoQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5waW5TdGF0ZUNoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuYnJpZ2h0bmVzc0luTWlsbGkkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc0ltYWdlQnJpZ2h0bmVzc0luTWlsbGkpOwogICAgICAgICAgICB0aGlzLmNvbnRyYXN0SW5NaWxsaSQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzSW1hZ2VDb250cmFzdEluTWlsbGkpOwogICAgICAgICAgICB0aGlzLmFjdHVhbFNpemVHbG9iYWxTZXR0aW5nJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NJbWFnZVNob3dBY3R1YWxTaXplKTsKICAgICAgICAgICAgdGhpcy5zaG93QWN0dWFsU2l6ZSA9IGZhbHNlOwogICAgICAgICAgICAvLyBUaGUgVUkgdG9nZ2xlIGlzIG92ZXJyaWRkZW4gYnkgdGhlIGdsb2JhbCBzZXR0aW5nLgogICAgICAgICAgICB0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5hY3R1YWxTaXplVWlUb2dnbGVTdWJqZWN0ID0gbmV3IEJlaGF2aW9yU3ViamVjdCh0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZWQpOwogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99ICRldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25TdGVwSW5kZXhDaGFuZ2VkKCRldmVudCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKGNhcmRTdGVwU2xpZGVyQ2hhbmdlZCh7CiAgICAgICAgICAgICAgICBjYXJkSWQ6IHRoaXMuY2FyZElkLAogICAgICAgICAgICAgICAgc3RlcEluZGV4OiAkZXZlbnQsCiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRNZXRhZGF0YQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaXNJbWFnZUNhcmRNZXRhZGF0YShjYXJkTWV0YWRhdGEpIHsKICAgICAgICAgICAgY29uc3QgeyBwbHVnaW4gfSA9IGNhcmRNZXRhZGF0YTsKICAgICAgICAgICAgcmV0dXJuIHBsdWdpbiA9PT0gUGx1Z2luVHlwZS5JTUFHRVM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25BY3R1YWxTaXplVG9nZ2xlKCkgewogICAgICAgICAgICB0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZWQgPSAhdGhpcy5hY3R1YWxTaXplVWlUb2dnbGVkOwogICAgICAgICAgICB0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZVN1YmplY3QubmV4dCh0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBCdWlsZCBvYnNlcnZhYmxlcyBvbmNlIGNhcmRJZCBpcyBkZWZpbmVkIChhZnRlciBvbkluaXQpLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5hY3R1YWxTaXplR2xvYmFsU2V0dGluZyQsCiAgICAgICAgICAgICAgICB0aGlzLmFjdHVhbFNpemVVaVRvZ2dsZVN1YmplY3QsCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5uZ1Vuc3Vic2NyaWJlKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbc2V0dGluZ0VuYWJsZWQsIHVpVG9nZ2xlRW5hYmxlZF0pID0+IHsKICAgICAgICAgICAgICAgIC8vIEFjdHVhbCBzaXplIG1vZGUgcmVxdWlyZXMgYSBmdWxsIHdpZHRoIGNhcmQuCiAgICAgICAgICAgICAgICB0aGlzLnNob3dBY3R1YWxTaXplID0gc2V0dGluZ0VuYWJsZWQgfHwgdWlUb2dnbGVFbmFibGVkOwogICAgICAgICAgICAgICAgdGhpcy5mdWxsV2lkdGhDaGFuZ2VkLmVtaXQodGhpcy5zaG93QWN0dWFsU2l6ZSk7CiAgICAgICAgICAgIH0pKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VsZWN0Q2FyZE1ldGFkYXRhJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldENhcmRNZXRhZGF0YSwgdGhpcy5jYXJkSWQpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNhcmRNZXRhZGF0YSQgPSBzZWxlY3RDYXJkTWV0YWRhdGEkLnBpcGUoZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTWV0YWRhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjYXJkTWV0YWRhdGEpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAhIWNhcmRNZXRhZGF0YSAmJiB0aGlzLmlzSW1hZ2VDYXJkTWV0YWRhdGEoY2FyZE1ldGFkYXRhKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRNZXRhZGF0YQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNhcmRNZXRhZGF0YSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChjYXJkTWV0YWRhdGEpKTsKICAgICAgICAgICAgfSkpLCBzaGFyZVJlcGxheSgxKSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFBbmRTZXJpZXMkID0gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICBjYXJkTWV0YWRhdGEkLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0Q2FyZFRpbWVTZXJpZXMsIHRoaXMuY2FyZElkKSwKICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltZVNlcmllcyQgPSBtZXRhZGF0YUFuZFNlcmllcyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtjYXJkTWV0YWRhdGEsIHJ1blRvU2VyaWVzXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcnVuSWQgPSBjYXJkTWV0YWRhdGEucnVuSWQ7CiAgICAgICAgICAgICAgICBpZiAoIXJ1blRvU2VyaWVzIHx8ICFydW5Ub1Nlcmllcy5oYXNPd25Qcm9wZXJ0eShydW5JZCkpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHJ1blRvU2VyaWVzW3J1bklkXSkpOwogICAgICAgICAgICB9KSksIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzZXJpZXMxCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2VyaWVzMgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHNlcmllczEsIHNlcmllczIpID0+IHsKICAgICAgICAgICAgICAgIGlmIChzZXJpZXMxLmxlbmd0aCA9PT0gc2VyaWVzMi5sZW5ndGggJiYgc2VyaWVzMS5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBzZXJpZXMxID09PSBzZXJpZXMyOwogICAgICAgICAgICB9KSksIHNoYXJlUmVwbGF5KDEpKTsKICAgICAgICAgICAgdGhpcy5zdGVwSW5kZXgkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0Q2FyZFN0ZXBJbmRleCwgdGhpcy5jYXJkSWQpOwogICAgICAgICAgICB0aGlzLmxvYWRTdGF0ZSQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRDYXJkTG9hZFN0YXRlLCB0aGlzLmNhcmRJZCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdGltZVNlcmllc0FuZFN0ZXBJbmRleCQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRpbWVTZXJpZXMkLAogICAgICAgICAgICAgICAgdGhpcy5zdGVwSW5kZXgkLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzdGVwRGF0dW0kID0gdGltZVNlcmllc0FuZFN0ZXBJbmRleCQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFt0aW1lU2VyaWVzLCBzdGVwSW5kZXhdKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoc3RlcEluZGV4ID09PSBudWxsIHx8ICF0aW1lU2VyaWVzW3N0ZXBJbmRleF0pIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aW1lU2VyaWVzW3N0ZXBJbmRleF07CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMudGFnJCA9IGNhcmRNZXRhZGF0YSQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRNZXRhZGF0YQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNhcmRNZXRhZGF0YSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGNhcmRNZXRhZGF0YS50YWc7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMudGl0bGUkID0gdGhpcy50YWckLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0YWcKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh0YWcpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBnZXRUYWdEaXNwbGF5TmFtZSh0YWcsIHRoaXMuZ3JvdXBOYW1lKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5ydW5JZCQgPSBjYXJkTWV0YWRhdGEkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTWV0YWRhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjYXJkTWV0YWRhdGEpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjYXJkTWV0YWRhdGEucnVuSWQ7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMuc2FtcGxlJCA9IGNhcmRNZXRhZGF0YSQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRNZXRhZGF0YQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNhcmRNZXRhZGF0YSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGNhcmRNZXRhZGF0YS5zYW1wbGU7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMuaW1hZ2VVcmwkID0gc3RlcERhdHVtJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RlcERhdHVtCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc3RlcERhdHVtKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXN0ZXBEYXR1bSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5pbWFnZVVybChzdGVwRGF0dW0uaW1hZ2VJZCk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMuc3RlcFZhbHVlcyQgPSB0aW1lU2VyaWVzJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc2VyaWVzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc2VyaWVzKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gc2VyaWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHN0ZXBEYXR1bQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHN0ZXBEYXR1bSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGVwRGF0dW0uc3RlcDsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5pc1Bpbm5lZCQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRDYXJkUGlubmVkU3RhdGUsIHRoaXMuY2FyZElkKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLm5leHQoKTsKICAgICAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlLmNvbXBsZXRlKCk7CiAgICAgICAgfQogICAgfQogICAgSW1hZ2VDYXJkQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdpbWFnZS1jYXJkJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGltYWdlLWNhcmQtY29tcG9uZW50CiAgICAgIFtsb2FkU3RhdGVdPSJsb2FkU3RhdGUkIHwgYXN5bmMiCiAgICAgIFt0aXRsZV09InRpdGxlJCB8IGFzeW5jIgogICAgICBbdGFnXT0idGFnJCB8IGFzeW5jIgogICAgICBbcnVuSWRdPSJydW5JZCQgfCBhc3luYyIKICAgICAgW3NhbXBsZV09InNhbXBsZSQgfCBhc3luYyIKICAgICAgW2ltYWdlVXJsXT0iaW1hZ2VVcmwkIHwgYXN5bmMiCiAgICAgIFtzdGVwSW5kZXhdPSJzdGVwSW5kZXgkIHwgYXN5bmMiCiAgICAgIFtzdGVwVmFsdWVzXT0ic3RlcFZhbHVlcyQgfCBhc3luYyIKICAgICAgKHN0ZXBJbmRleENoYW5nZSk9Im9uU3RlcEluZGV4Q2hhbmdlZCgkZXZlbnQpIgogICAgICBbYnJpZ2h0bmVzc0luTWlsbGldPSJicmlnaHRuZXNzSW5NaWxsaSQgfCBhc3luYyIKICAgICAgW2NvbnRyYXN0SW5NaWxsaV09ImNvbnRyYXN0SW5NaWxsaSQgfCBhc3luYyIKICAgICAgW3J1bkNvbG9yU2NhbGVdPSJydW5Db2xvclNjYWxlIgogICAgICBbc2hvd0FjdHVhbFNpemVdPSJzaG93QWN0dWFsU2l6ZSIKICAgICAgW2FsbG93VG9nZ2xlQWN0dWFsU2l6ZV09IihhY3R1YWxTaXplR2xvYmFsU2V0dGluZyQgfCBhc3luYykgPT09IGZhbHNlIgogICAgICBbaXNQaW5uZWRdPSJpc1Bpbm5lZCQgfCBhc3luYyIKICAgICAgKG9uQWN0dWFsU2l6ZVRvZ2dsZSk9Im9uQWN0dWFsU2l6ZVRvZ2dsZSgpIgogICAgICAob25QaW5DbGlja2VkKT0icGluU3RhdGVDaGFuZ2VkLmVtaXQoJGV2ZW50KSIKICAgID48L2ltYWdlLWNhcmQtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEltYWdlQ2FyZENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0sCiAgICAgICAgeyB0eXBlOiBNZXRyaWNzRGF0YVNvdXJjZSB9CiAgICBdOwogICAgSW1hZ2VDYXJkQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNhcmRJZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZ3JvdXBOYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBydW5Db2xvclNjYWxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmdWxsV2lkdGhDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgcGluU3RhdGVDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW1hZ2VDYXJkQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gSW1hZ2VDYXJkQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEltYWdlQ2FyZENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTWV0cmljc0RhdGFTb3VyY2UpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBJbWFnZUNhcmRDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSW1hZ2VDYXJkQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbImltYWdlLWNhcmQiXV0sIGlucHV0czogeyBjYXJkSWQ6ICJjYXJkSWQiLCBncm91cE5hbWU6ICJncm91cE5hbWUiLCBydW5Db2xvclNjYWxlOiAicnVuQ29sb3JTY2FsZSIgfSwgb3V0cHV0czogeyBmdWxsV2lkdGhDaGFuZ2VkOiAiZnVsbFdpZHRoQ2hhbmdlZCIsIHBpblN0YXRlQ2hhbmdlZDogInBpblN0YXRlQ2hhbmdlZCIgfSwgZGVjbHM6IDEzLCB2YXJzOiAzOCwgY29uc3RzOiBbWzMsICJsb2FkU3RhdGUiLCAidGl0bGUiLCAidGFnIiwgInJ1bklkIiwgInNhbXBsZSIsICJpbWFnZVVybCIsICJzdGVwSW5kZXgiLCAic3RlcFZhbHVlcyIsICJicmlnaHRuZXNzSW5NaWxsaSIsICJjb250cmFzdEluTWlsbGkiLCAicnVuQ29sb3JTY2FsZSIsICJzaG93QWN0dWFsU2l6ZSIsICJhbGxvd1RvZ2dsZUFjdHVhbFNpemUiLCAiaXNQaW5uZWQiLCAic3RlcEluZGV4Q2hhbmdlIiwgIm9uQWN0dWFsU2l6ZVRvZ2dsZSIsICJvblBpbkNsaWNrZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBJbWFnZUNhcmRDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImltYWdlLWNhcmQtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigic3RlcEluZGV4Q2hhbmdlIiwgZnVuY3Rpb24gSW1hZ2VDYXJkQ29udGFpbmVyX1RlbXBsYXRlX2ltYWdlX2NhcmRfY29tcG9uZW50X3N0ZXBJbmRleENoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uU3RlcEluZGV4Q2hhbmdlZCgkZXZlbnQpOyB9KSgib25BY3R1YWxTaXplVG9nZ2xlIiwgZnVuY3Rpb24gSW1hZ2VDYXJkQ29udGFpbmVyX1RlbXBsYXRlX2ltYWdlX2NhcmRfY29tcG9uZW50X29uQWN0dWFsU2l6ZVRvZ2dsZV8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uQWN0dWFsU2l6ZVRvZ2dsZSgpOyB9KSgib25QaW5DbGlja2VkIiwgZnVuY3Rpb24gSW1hZ2VDYXJkQ29udGFpbmVyX1RlbXBsYXRlX2ltYWdlX2NhcmRfY29tcG9uZW50X29uUGluQ2xpY2tlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LnBpblN0YXRlQ2hhbmdlZC5lbWl0KCRldmVudCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDYsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg3LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoOCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDksICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgxMCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDExLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMTIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImxvYWRTdGF0ZSIsIMm1ybVwaXBlQmluZDEoMSwgMTQsIGN0eC5sb2FkU3RhdGUkKSkoInRpdGxlIiwgybXJtXBpcGVCaW5kMSgyLCAxNiwgY3R4LnRpdGxlJCkpKCJ0YWciLCDJtcm1cGlwZUJpbmQxKDMsIDE4LCBjdHgudGFnJCkpKCJydW5JZCIsIMm1ybVwaXBlQmluZDEoNCwgMjAsIGN0eC5ydW5JZCQpKSgic2FtcGxlIiwgybXJtXBpcGVCaW5kMSg1LCAyMiwgY3R4LnNhbXBsZSQpKSgiaW1hZ2VVcmwiLCDJtcm1cGlwZUJpbmQxKDYsIDI0LCBjdHguaW1hZ2VVcmwkKSkoInN0ZXBJbmRleCIsIMm1ybVwaXBlQmluZDEoNywgMjYsIGN0eC5zdGVwSW5kZXgkKSkoInN0ZXBWYWx1ZXMiLCDJtcm1cGlwZUJpbmQxKDgsIDI4LCBjdHguc3RlcFZhbHVlcyQpKSgiYnJpZ2h0bmVzc0luTWlsbGkiLCDJtcm1cGlwZUJpbmQxKDksIDMwLCBjdHguYnJpZ2h0bmVzc0luTWlsbGkkKSkoImNvbnRyYXN0SW5NaWxsaSIsIMm1ybVwaXBlQmluZDEoMTAsIDMyLCBjdHguY29udHJhc3RJbk1pbGxpJCkpKCJydW5Db2xvclNjYWxlIiwgY3R4LnJ1bkNvbG9yU2NhbGUpKCJzaG93QWN0dWFsU2l6ZSIsIGN0eC5zaG93QWN0dWFsU2l6ZSkoImFsbG93VG9nZ2xlQWN0dWFsU2l6ZSIsIMm1ybVwaXBlQmluZDEoMTEsIDM0LCBjdHguYWN0dWFsU2l6ZUdsb2JhbFNldHRpbmckKSA9PT0gZmFsc2UpKCJpc1Bpbm5lZCIsIMm1ybVwaXBlQmluZDEoMTIsIDM2LCBjdHguaXNQaW5uZWQkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbSW1hZ2VDYXJkQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgVXRpbGl0aWVzIHJlbGF0ZWQgdG8gZm9ybWF0dGluZyB2YWx1ZXMuCiAgICAgKi8KICAgIC8qKgogICAgICogRm9ybWF0cyBhIHRpbWUsIGdpdmVuIGFzIG51bWJlciBvZiBob3Vycy4gZS5nLgogICAgICogPiBmb3JtYXRSZWxhdGl2ZVRpbWVJbk1zKDEwNTU1ICogNjAgKiA2MCkKICAgICAqICIxMGggMzNtIDE3cyIKICAgICAqLwogICAgZnVuY3Rpb24gZm9ybWF0UmVsYXRpdmVUaW1lSW5Ncyh0aW1lSW5NcykgewogICAgICAgIC8vIFdlIHdpbGwgYWx3YXlzIHNob3cgMiB1bml0cyBvZiBwcmVjaXNpb24sIGUuZyBkYXlzIGFuZCBob3Vycywgb3IKICAgICAgICAvLyBtaW51dGVzIGFuZCBzZWNvbmRzLCBidXQgbm90IGhvdXJzIGFuZCBtaW51dGVzIGFuZCBzZWNvbmRzLgogICAgICAgIGNvbnN0IHJlc3VsdCA9IFtdOwogICAgICAgIGNvbnN0IHRpbWVJbkhvdXJzID0gdGltZUluTXMgLyAoMTAwMCAqIDYwICogNjApOwogICAgICAgIGNvbnN0IGRheXMgPSBNYXRoLmZsb29yKHRpbWVJbkhvdXJzIC8gMjQpOwogICAgICAgIGlmIChkYXlzKSB7CiAgICAgICAgICAgIHJlc3VsdC5wdXNoKGRheXMudG9TdHJpbmcoKSArICdkJyk7CiAgICAgICAgfQogICAgICAgIGNvbnN0IHJlbWFpbmluZ0hvdXJzID0gdGltZUluSG91cnMgLSBkYXlzICogMjQ7CiAgICAgICAgY29uc3QgaG91cnMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ0hvdXJzKTsKICAgICAgICBpZiAoaG91cnMgfHwgZGF5cykgewogICAgICAgICAgICByZXN1bHQucHVzaChob3Vycy50b1N0cmluZygpICsgJ2gnKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVtYWluaW5nTWludXRlcyA9IChyZW1haW5pbmdIb3VycyAtIGhvdXJzKSAqIDYwOwogICAgICAgIGNvbnN0IG1pbnV0ZXMgPSBNYXRoLmZsb29yKHJlbWFpbmluZ01pbnV0ZXMpOwogICAgICAgIGlmIChtaW51dGVzIHx8IGhvdXJzIHx8IGRheXMpIHsKICAgICAgICAgICAgcmVzdWx0LnB1c2gobWludXRlcy50b1N0cmluZygpICsgJ20nKTsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVtYWluaW5nU2Vjb25kcyA9IChyZW1haW5pbmdNaW51dGVzIC0gbWludXRlcykgKiA2MDsKICAgICAgICBjb25zdCBzZWNvbmRzID0gTWF0aC5mbG9vcihyZW1haW5pbmdTZWNvbmRzKTsKICAgICAgICByZXN1bHQucHVzaChzZWNvbmRzLnRvU3RyaW5nKCkgKyAncycpOwogICAgICAgIHJldHVybiByZXN1bHQuam9pbignICcpOwogICAgfQogICAgLyoqCiAgICAgKiBJbnRlZ2VycyBsZXNzIHRoYW4gdGhpcyBudW1iZXIgY2FuIGJlIHNhZmVseSBmb3JtYXR0ZWQgYXMtaXMuCiAgICAgKi8KICAgIGNvbnN0IE1BWF9TTUFMTF9JTlRFR0VSID0gTWF0aC5wb3coMTAsIDQpOwogICAgLyoqCiAgICAgKiBUaGlzIG51bWVyaWMgZm9ybWF0dGVyIGN1cnJlbnRseSBjb3ZlcnMgY29tbW9uIGNhc2VzIG9ubHkuCiAgICAgKgogICAgICogVGhlIFBvbHltZXIgdmVyc2lvbiByZWxpZXMgb24gRDMsIHdoaWNoIGdpdmVzIG1vcmUgZmVhdHVyZXMgZm9yIGZyZWU6CiAgICAgKiBzZWxlY3RpbmcgZGVjaW1hbCB2cyBleHBvbmVudCBub3RhdGlvbiwgcm91bmRpbmcgdG8gc2lnbmlmaWNhbnQgZGlnaXRzLCBhbmQKICAgICAqIHJlbW92aW5nIGluc2lnbmlmaWNhbnQgdHJhaWxpbmcgemVyb3MuCiAgICAgKi8KICAgIGZ1bmN0aW9uIGZvcm1hdE51bWJlciQxKHZhbHVlKSB7CiAgICAgICAgaWYgKGlzTmFOKHZhbHVlKSB8fCAhTnVtYmVyLmlzRmluaXRlKHZhbHVlKSkgewogICAgICAgICAgICByZXR1cm4gdmFsdWUudG9TdHJpbmcoKTsKICAgICAgICB9CiAgICAgICAgaWYgKE51bWJlci5pc0ludGVnZXIodmFsdWUpICYmIE1hdGguYWJzKHZhbHVlKSA8IE1BWF9TTUFMTF9JTlRFR0VSKSB7CiAgICAgICAgICAgIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwogICAgICAgIH0KICAgICAgICByZXR1cm4gdmFsdWUudG9QcmVjaXNpb24oNCk7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2lkZ2V0cy9saW5lX2NoYXJ0L2xpbmVfY2hhcnRfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHRlbXBsYXRlIFNlcmllc01ldGFkYXRhLCBFeHRyYVBvaW50RGF0YQogICAgICovCiAgICBjbGFzcyBMaW5lQ2hhcnRDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGhvc3QpIHsKICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKICAgICAgICAgICAgdGhpcy5pZ25vcmVZT3V0bGllcnMgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5zbW9vdGhpbmdFbmFibGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuc21vb3RoaW5nV2VpZ2h0ID0gMC42OwogICAgICAgICAgICB0aGlzLnRvb2x0aXBDb2x1bW5zID0gW107CiAgICAgICAgICAgIHRoaXMudG9vbHRpcFBvc2l0aW9uID0gVG9vbHRpcFBvc2l0aW9uLkFVVE87CiAgICAgICAgICAgIHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2QgPSBUb29sdGlwU29ydGluZ01ldGhvZC5ERUZBVUxUOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogSW5kaXJlY3RseSBhcHBsaWVkIHByb3BlcnRpZXMsIHdpdGhvdXQgYSAxOjEgUG9seW1lciBtYXBwaW5nLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5zZXJpZXNEYXRhTGlzdCA9IFtdOwogICAgICAgICAgICB0aGlzLnhBeGlzVHlwZSA9IFhBeGlzVHlwZS5TVEVQOwogICAgICAgICAgICB0aGlzLnlBeGlzVHlwZSA9IFlBeGlzVHlwZS5MSU5FQVI7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2ei1saW5lLWNoYXJ0MicpKSk7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC55VmFsdWVBY2Nlc3NvciA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZCkgPT4gZC55KTsKICAgICAgICAgICAgLy8gTXVzdCBzZXQgb3B0aW9uYWwgaW5wdXQgdmFsdWVzIGhlcmUgc2luY2UgdGhleSB3b24ndCBiZSBwYXJ0IG9mIHRoZQogICAgICAgICAgICAvLyBuZ09uQ2hhbmdlcyBpZiB0aGUgcGFyZW50IGRvZXMgbm90IG92ZXJyaWRlIHRoZSB2YWx1ZS4KICAgICAgICAgICAgdGhpcy5lbGVtZW50Lmlnbm9yZVlPdXRsaWVycyA9IHRoaXMuaWdub3JlWU91dGxpZXJzOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc21vb3RoaW5nRW5hYmxlZCA9IHRoaXMuc21vb3RoaW5nRW5hYmxlZDsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNtb290aGluZ1dlaWdodCA9IHRoaXMuc21vb3RoaW5nV2VpZ2h0OwogICAgICAgICAgICB0aGlzLmVsZW1lbnQudG9vbHRpcENvbHVtbnMgPSB0aGlzLnRvb2x0aXBDb2x1bW5zOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQudG9vbHRpcFBvc2l0aW9uID0gdGhpcy50b29sdGlwUG9zaXRpb247CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC50b29sdGlwU29ydGluZ01ldGhvZCA9IHRoaXMudG9vbHRpcFNvcnRpbmdNZXRob2Q7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC54VHlwZSA9IHRoaXMueEF4aXNUeXBlOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQueVNjYWxlVHlwZSA9IHRoaXMueUF4aXNUeXBlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLmhvc3QubmF0aXZlRWxlbWVudC5hcHBlbmRDaGlsZCh0aGlzLmVsZW1lbnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgLy8gUmVjb3JkIHN0YXRlIGJlZm9yZSBjaGFuZ2luZyBhbnkgdmFsdWVzLgogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHdhc0RvbWFpbkZpdFRvRGF0YSA9IHRoaXMuZWxlbWVudC5pc0RhdGFGaXRUb0RvbWFpbigpOwogICAgICAgICAgICBpZiAoY2hhbmdlc1snY29sb3JTY2FsZSddICYmIHRoaXMuY29sb3JTY2FsZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNvbG9yU2NhbGUgPSB7IHNjYWxlOiB0aGlzLmNvbG9yU2NhbGUgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snZGVmYXVsdFhSYW5nZSddKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGVmYXVsdFhSYW5nZSA9IHRoaXMuZGVmYXVsdFhSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snZGVmYXVsdFlSYW5nZSddKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGVmYXVsdFlSYW5nZSA9IHRoaXMuZGVmYXVsdFlSYW5nZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snaWdub3JlWU91dGxpZXJzJ10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5pZ25vcmVZT3V0bGllcnMgPSB0aGlzLmlnbm9yZVlPdXRsaWVyczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snc21vb3RoaW5nRW5hYmxlZCddKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc21vb3RoaW5nRW5hYmxlZCA9IHRoaXMuc21vb3RoaW5nRW5hYmxlZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snc21vb3RoaW5nV2VpZ2h0J10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zbW9vdGhpbmdXZWlnaHQgPSB0aGlzLnNtb290aGluZ1dlaWdodDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1sndG9vbHRpcENvbHVtbnMnXSkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRvb2x0aXBDb2x1bW5zID0gdGhpcy50b29sdGlwQ29sdW1uczsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1sndG9vbHRpcFBvc2l0aW9uJ10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC50b29sdGlwUG9zaXRpb24gPSB0aGlzLnRvb2x0aXBQb3NpdGlvbjsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1sndG9vbHRpcFNvcnRpbmdNZXRob2QnXSkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRvb2x0aXBTb3J0aW5nTWV0aG9kID0gdGhpcy50b29sdGlwU29ydGluZ01ldGhvZDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1sneEF4aXNUeXBlJ10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC54VHlwZSA9IHRoaXMueEF4aXNUeXBlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChjaGFuZ2VzWyd5QXhpc1R5cGUnXSkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnlTY2FsZVR5cGUgPSB0aGlzLnlBeGlzVHlwZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5zaG91bGRVcGRhdGVTZXJpZXNEYXRhKGNoYW5nZXMpKSB7CiAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZVNlcmllc0RhdGEoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBQcmVzZXJ2ZSBmaXQtdG8tZG9tYWluIGlmIHRoZSBkYXRhIHBvaW50cyBtYXkgaGF2ZSBjaGFuZ2VkLgogICAgICAgICAgICBpZiAod2FzRG9tYWluRml0VG9EYXRhICYmCiAgICAgICAgICAgICAgICAoY2hhbmdlc1snc2VyaWVzRGF0YUxpc3QnXSB8fAogICAgICAgICAgICAgICAgICAgIGNoYW5nZXNbJ3Ntb290aGluZ0VuYWJsZWQnXSB8fAogICAgICAgICAgICAgICAgICAgIChjaGFuZ2VzWydzbW9vdGhpbmdXZWlnaHQnXSAmJiB0aGlzLnNtb290aGluZ0VuYWJsZWQpKSkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlc2V0RG9tYWluKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2hvdWxkVXBkYXRlU2VyaWVzRGF0YShjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICghIWNoYW5nZXNbJ3Nlcmllc0RhdGFMaXN0J10pIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFRoZSBzZXJpZXMgZGF0YSBmb3JtYXQgZXhwZWN0ZWQgYnkgVnpMaW5lQ2hhcnQyIGRlcGVuZHMgb24gdGhlIGB4VHlwZWAuCiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcHJldlhBeGlzVHlwZSA9IGNoYW5nZXNbJ3hBeGlzVHlwZSddCiAgICAgICAgICAgICAgICA/IGNoYW5nZXNbJ3hBeGlzVHlwZSddLnByZXZpb3VzVmFsdWUKICAgICAgICAgICAgICAgIDogbnVsbDsKICAgICAgICAgICAgaWYgKHByZXZYQXhpc1R5cGUgJiYKICAgICAgICAgICAgICAgIHRoaXMuaXNXYWxsVGltZUJhc2VkKHByZXZYQXhpc1R5cGUpICE9PQogICAgICAgICAgICAgICAgICAgIHRoaXMuaXNXYWxsVGltZUJhc2VkKHRoaXMueEF4aXNUeXBlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlU2VyaWVzRGF0YSgpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBzZXJpZXNEYXRhIG9mIHRoaXMuc2VyaWVzRGF0YUxpc3QpIHsKICAgICAgICAgICAgICAgIGNvbnN0IHsgc2VyaWVzSWQsIG1ldGFkYXRhLCBwb2ludHMgfSA9IHNlcmllc0RhdGE7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmb3JtYXR0ZWRQb2ludHMgPSB0aGlzLmZvcm1hdEJ5WEF4aXNUeXBlKHBvaW50cyk7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0U2VyaWVzRGF0YShzZXJpZXNJZCwgZm9ybWF0dGVkUG9pbnRzKTsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC5zZXRTZXJpZXNNZXRhZGF0YShzZXJpZXNJZCwgbWV0YWRhdGEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgdmlzaWJsZVNlcmllcyA9IHRoaXMuc2VyaWVzRGF0YUxpc3QKICAgICAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHNlcmllc0RhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChzZXJpZXNEYXRhKSA9PiBzZXJpZXNEYXRhLnZpc2libGUpKQogICAgICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyBzZXJpZXNJZCB9KSA9PiBzZXJpZXNJZCkpOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQuc2V0VmlzaWJsZVNlcmllcyh2aXNpYmxlU2VyaWVzKTsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNvbW1pdENoYW5nZXMoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHhBeGlzVHlwZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgaXNXYWxsVGltZUJhc2VkKHhBeGlzVHlwZSkgewogICAgICAgICAgICByZXR1cm4gKHhBeGlzVHlwZSA9PT0gWEF4aXNUeXBlLldBTExfVElNRSB8fCB4QXhpc1R5cGUgPT09IFhBeGlzVHlwZS5SRUxBVElWRSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBzZXJpZXNEYXRhCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JtYXRCeVhBeGlzVHlwZShzZXJpZXNEYXRhKSB7CiAgICAgICAgICAgIHJldHVybiBzZXJpZXNEYXRhLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0dW0KICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkYXR1bSkgPT4gewogICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNXYWxsVGltZUJhc2VkKHRoaXMueEF4aXNUeXBlKSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIGRhdHVtKSwgeyB3YWxsX3RpbWU6IG5ldyBEYXRlKGRhdHVtLngpIH0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgZGF0dW0pLCB7IHN0ZXA6IGRhdHVtLnggfSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZXNldERvbWFpbigpIHsKICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlc2V0RG9tYWluKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLmVsZW1lbnQucmVkcmF3KCk7CiAgICAgICAgfQogICAgfQogICAgTGluZUNoYXJ0Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Yi1saW5lLWNoYXJ0JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgdGItbGluZS1jaGFydCA+IHZ6LWxpbmUtY2hhcnQyIHsKICAgICAgICBoZWlnaHQ6IDEwMCU7CiAgICAgIH0KICAgIGAsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICAvLyBBbmd1bGFyJ3MgZW11bGF0ZWQgdmlldyBlbmNhcHN1bGF0aW9uIHByZXZlbnRzIGNvbXBvbmVudCBzdHlsZXMgZnJvbQogICAgICAgICAgICAgICAgICAgIC8vIGFwcGx5aW5nIHRvIERPTSBjcmVhdGVkIG91dHNpZGUgb2YgaXRzIHRlbXBsYXRlICgndnotbGluZS1jaGFydDInKS4KICAgICAgICAgICAgICAgICAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbiQxLk5vbmUsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIExpbmVDaGFydENvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIExpbmVDaGFydENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjb2xvclNjYWxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkZWZhdWx0WFJhbmdlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkZWZhdWx0WVJhbmdlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpZ25vcmVZT3V0bGllcnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNtb290aGluZ0VuYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNtb290aGluZ1dlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdG9vbHRpcENvbHVtbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHRvb2x0aXBQb3NpdGlvbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdG9vbHRpcFNvcnRpbmdNZXRob2Q6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNlcmllc0RhdGFMaXN0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB4QXhpc1R5cGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHlBeGlzVHlwZTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGluZUNoYXJ0Q29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gTGluZUNoYXJ0Q29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExpbmVDaGFydENvbXBvbmVudCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGluZUNoYXJ0Q29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IExpbmVDaGFydENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0Yi1saW5lLWNoYXJ0Il1dLCBpbnB1dHM6IHsgY29sb3JTY2FsZTogImNvbG9yU2NhbGUiLCBkZWZhdWx0WFJhbmdlOiAiZGVmYXVsdFhSYW5nZSIsIGRlZmF1bHRZUmFuZ2U6ICJkZWZhdWx0WVJhbmdlIiwgaWdub3JlWU91dGxpZXJzOiAiaWdub3JlWU91dGxpZXJzIiwgc21vb3RoaW5nRW5hYmxlZDogInNtb290aGluZ0VuYWJsZWQiLCBzbW9vdGhpbmdXZWlnaHQ6ICJzbW9vdGhpbmdXZWlnaHQiLCB0b29sdGlwQ29sdW1uczogInRvb2x0aXBDb2x1bW5zIiwgdG9vbHRpcFBvc2l0aW9uOiAidG9vbHRpcFBvc2l0aW9uIiwgdG9vbHRpcFNvcnRpbmdNZXRob2Q6ICJ0b29sdGlwU29ydGluZ01ldGhvZCIsIHNlcmllc0RhdGFMaXN0OiAic2VyaWVzRGF0YUxpc3QiLCB4QXhpc1R5cGU6ICJ4QXhpc1R5cGUiLCB5QXhpc1R5cGU6ICJ5QXhpc1R5cGUiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0sIGRlY2xzOiAwLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTGluZUNoYXJ0Q29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgfSwgc3R5bGVzOiBbIlxuICAgICAgdGItbGluZS1jaGFydCA+IHZ6LWxpbmUtY2hhcnQyIHtcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfVxuICAgICJdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dpZGdldHMvcmVzaXplX2RldGVjdG9yX2RpcmVjdGl2ZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEEgZGlyZWN0aXZlIHRoYXQgY2FsbHMgYG9uUmVzaXplYCB3aGVuIGEgaG9zdCBlbGVtZW50IGlzIHJlc2l6ZWQuCiAgICAgKgogICAgICogSXQgZG9lcyBub3QgZW1pdCBgb25SZXNpemVgIG9uIHRoZSBpbml0aWFsIHJlbmRlci4KICAgICAqLwogICAgY2xhc3MgUmVzaXplRGV0ZWN0b3JEaXJlY3RpdmUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gcmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IocmVmKSB7CiAgICAgICAgICAgIHRoaXMucmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMgPSAxMDA7CiAgICAgICAgICAgIHRoaXMub25SZXNpemUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICB0aGlzLm9uUmVzaXplJCA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcmVzaXplT2JzZXJ2ZXIgPSBuZXcgUmVzaXplT2JzZXJ2ZXIoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZSQubmV4dCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHJlc2l6ZU9ic2VydmVyLm9ic2VydmUocmVmLm5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUkLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXNpemVPYnNlcnZlci51bm9ic2VydmUocmVmLm5hdGl2ZUVsZW1lbnQpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMub25SZXNpemUkCiAgICAgICAgICAgICAgICAucGlwZSgKICAgICAgICAgICAgLy8gV2hlbiBSZXNpemVPYnNlcnZlciBpcyBpbml0aWFsbHkgY3JlYXRlZCwgaXQgY2FsbHMgdGhlIGNhbGxiYWNrLgogICAgICAgICAgICAvLyBJZ25vcmUgdGhhdCBzaW5jZSBpdCBpcyBub3QgcmVhbGx5IGEgcmVzaXplLgogICAgICAgICAgICBza2lwKDEpLCBkZWJvdW5jZVRpbWUodGhpcy5yZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyksIHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUkKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5vblJlc2l6ZS5lbWl0KCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5uZ1Vuc3Vic2NyaWJlJC5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZSQuY29tcGxldGUoKTsKICAgICAgICB9CiAgICB9CiAgICBSZXNpemVEZXRlY3RvckRpcmVjdGl2ZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogRGlyZWN0aXZlLCBhcmdzOiBbeyBzZWxlY3RvcjogJ1tkZXRlY3RSZXNpemVdJyB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJlc2l6ZURldGVjdG9yRGlyZWN0aXZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgUmVzaXplRGV0ZWN0b3JEaXJlY3RpdmUucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgcmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uUmVzaXplOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmVzaXplRGV0ZWN0b3JEaXJlY3RpdmUuybVmYWMgPSBmdW5jdGlvbiBSZXNpemVEZXRlY3RvckRpcmVjdGl2ZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSZXNpemVEZXRlY3RvckRpcmVjdGl2ZSkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmVzaXplRGV0ZWN0b3JEaXJlY3RpdmUuybVkaXIgPSDJtcm1ZGVmaW5lRGlyZWN0aXZlKHsgdHlwZTogUmVzaXplRGV0ZWN0b3JEaXJlY3RpdmUsIHNlbGVjdG9yczogW1siIiwgImRldGVjdFJlc2l6ZSIsICIiXV0sIGlucHV0czogeyByZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NczogInJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zIiB9LCBvdXRwdXRzOiB7IG9uUmVzaXplOiAib25SZXNpemUiIH0gfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9jYXJkX3JlbmRlcmVyL3NjYWxhcl9jYXJkX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICB2YXIgSTE4Tl8wJDM7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIEEgYnV0dG9uIHRvIHBpbiBhIGNhcmQuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF83Mjg0NjA2NDI2MjM0Mzc1MzQ0JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19DQVJEX1JFTkRFUkVSX1NDQUxBUl9DQVJEX0NPTVBPTkVOVF9UU18xID0gZ29vZy5nZXRNc2coIlBpbiBjYXJkIik7CiAgICAgICAgSTE4Tl8wJDMgPSBNU0dfRVhURVJOQUxfNzI4NDYwNjQyNjIzNDM3NTM0NCQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9TQ0FMQVJfQ0FSRF9DT01QT05FTlRfVFNfMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMCQzID0gJGxvY2FsaXplIGA6QSBidXR0b24gdG8gcGluIGEgY2FyZC7ikJ9lNjY1ZGM3MTJiZDVmMThkNGRmYTNhMjllMTI1ZDU2NWNjNTFlMmY24pCfNzI4NDYwNjQyNjIzNDM3NTM0NDpQaW4gY2FyZGA7CiAgICB9CiAgICBjb25zdCBfYzIkOSA9IFsiYXJpYS1sYWJlbCIsIEkxOE5fMCQzXTsKICAgIHZhciBJMThOXzMkMTsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgQSBidXR0b24gb24gbGluZSBjaGFydCB0aGF0IHRvZ2dsZXMgZnVsbCBzaXplIG1vZGUuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF85MTU3MjE1NjM2Mzg5MjY1OTckJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX0NBUkRfUkVOREVSRVJfU0NBTEFSX0NBUkRfQ09NUE9ORU5UX1RTXzQgPSBnb29nLmdldE1zZygiVG9nZ2xlIGZ1bGwgc2l6ZSBtb2RlIik7CiAgICAgICAgSTE4Tl8zJDEgPSBNU0dfRVhURVJOQUxfOTE1NzIxNTYzNjM4OTI2NTk3JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19DQVJEX1JFTkRFUkVSX1NDQUxBUl9DQVJEX0NPTVBPTkVOVF9UU180OwogICAgfQogICAgZWxzZSB7CiAgICAgICAgSTE4Tl8zJDEgPSAkbG9jYWxpemUgYDpBIGJ1dHRvbiBvbiBsaW5lIGNoYXJ0IHRoYXQgdG9nZ2xlcyBmdWxsIHNpemUgbW9kZS7ikJ9mYzhmNzY3ZDBiOWY5MzAxODdhMWJhZTM0NDc3YWQyODczNmVjZTMz4pCfOTE1NzIxNTYzNjM4OTI2NTk3OlRvZ2dsZSBmdWxsIHNpemUgbW9kZWA7CiAgICB9CiAgICBjb25zdCBfYzUkMyA9IFsiYXJpYS1sYWJlbCIsIEkxOE5fMyQxXTsKICAgIHZhciBJMThOXzY7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIEFuIG92ZXJmbG93IG1lbnUgYnV0dG9uIHRoYXQgb3BlbnMgbW9yZSBsaW5lIGNoYXJ0IG9wdGlvbnMKICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzg3ODA1Mzc0MDIxMDMzNjQzNSQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9TQ0FMQVJfQ0FSRF9DT01QT05FTlRfVFNfNyA9IGdvb2cuZ2V0TXNnKCJNb3JlIGxpbmUgY2hhcnQgb3B0aW9ucyIpOwogICAgICAgIEkxOE5fNiA9IE1TR19FWFRFUk5BTF84NzgwNTM3NDAyMTAzMzY0MzUkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX0NBUkRfUkVOREVSRVJfU0NBTEFSX0NBUkRfQ09NUE9ORU5UX1RTXzc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzYgPSAkbG9jYWxpemUgYDpBbiBvdmVyZmxvdyBtZW51IGJ1dHRvbiB0aGF0IG9wZW5zIG1vcmUgbGluZSBjaGFydCBvcHRpb25z4pCfYjI2MGZhYjk0NmEzMDc3Y2UyMGZkMjhlMzM2OTc5ZjU4NjcyMGU4ZOKQnzg3ODA1Mzc0MDIxMDMzNjQzNTpNb3JlIGxpbmUgY2hhcnQgb3B0aW9uc2A7CiAgICB9CiAgICBjb25zdCBfYzgkMSA9IFsiYXJpYS1sYWJlbCIsIEkxOE5fNl07CiAgICB2YXIgSTE4Tl85OwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBBIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgbG9nIHNjYWxlIG9uIHktYXhpcyBvbiBhIGxpbmUgY2hhcnQKICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzMzNzQ2NDU2MjA2Mzg4ODM5MjYkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX0NBUkRfUkVOREVSRVJfU0NBTEFSX0NBUkRfQ09NUE9ORU5UX1RTXzEwID0gZ29vZy5nZXRNc2coIlRvZ2dsZSBZLWF4aXMgbG9nIHNjYWxlIG9uIGxpbmUgY2hhcnQiKTsKICAgICAgICBJMThOXzkgPSBNU0dfRVhURVJOQUxfMzM3NDY0NTYyMDYzODg4MzkyNiQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9TQ0FMQVJfQ0FSRF9DT01QT05FTlRfVFNfMTA7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzkgPSAkbG9jYWxpemUgYDpBIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgbG9nIHNjYWxlIG9uIHktYXhpcyBvbiBhIGxpbmUgY2hhcnTikJ9mZTkxZjk2YWI5YjNiYWNhNWE0ODkxM2YyYjBmYWU4NDQ4M2Q5M2Uz4pCfMzM3NDY0NTYyMDYzODg4MzkyNjpUb2dnbGUgWS1heGlzIGxvZyBzY2FsZSBvbiBsaW5lIGNoYXJ0YDsKICAgIH0KICAgIGNvbnN0IF9jMTEgPSBbImFyaWEtbGFiZWwiLCBJMThOXzldOwogICAgdmFyIEkxOE5fMTI7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIEEgYnV0dG9uIHRoYXQgcmVzZXRzIGxpbmUgY2hhcnQgZG9tYWluIHRvIHRoZSBkYXRhCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF8zODMwNjQ2NTIxMDU4MjY4NTU4JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19DQVJEX1JFTkRFUkVSX1NDQUxBUl9DQVJEX0NPTVBPTkVOVF9UU18xMyA9IGdvb2cuZ2V0TXNnKCJGaXQgbGluZSBjaGFydCBkb21haW5zIHRvIGRhdGEiKTsKICAgICAgICBJMThOXzEyID0gTVNHX0VYVEVSTkFMXzM4MzA2NDY1MjEwNTgyNjg1NTgkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX0NBUkRfUkVOREVSRVJfU0NBTEFSX0NBUkRfQ09NUE9ORU5UX1RTXzEzOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgSTE4Tl8xMiA9ICRsb2NhbGl6ZSBgOkEgYnV0dG9uIHRoYXQgcmVzZXRzIGxpbmUgY2hhcnQgZG9tYWluIHRvIHRoZSBkYXRh4pCfZTY4YTU1Mjk0MWFiNDI3YTk5ZTc0MzdlMDg0NDNmMzBhYzcxY2NkNuKQnzM4MzA2NDY1MjEwNTgyNjg1NTg6Rml0IGxpbmUgY2hhcnQgZG9tYWlucyB0byBkYXRhYDsKICAgIH0KICAgIGNvbnN0IF9jMTQgPSBbImFyaWEtbGFiZWwiLCBJMThOXzEyXTsKICAgIGZ1bmN0aW9uIFNjYWxhckNhcmRDb21wb25lbnRfbWF0X3NwaW5uZXJfMjVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1zcGlubmVyIiwgMTYpOwogICAgfSB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBSRVNJWkVfUkVEUkFXX0RFQk9VTkNFX1RJTUVfSU5fTVMgPSA1MDsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IERFRkFVTFRfVE9PTFRJUF9DT0xVTU5TID0gWwogICAgICAgIHsKICAgICAgICAgICAgdGl0bGU6ICdOYW1lJywKICAgICAgICAgICAgZXZhbHVhdGU6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGQuZGF0YXNldC5tZXRhZGF0YSgpLm1ldGEuZGlzcGxheU5hbWU7CiAgICAgICAgICAgIH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICB0aXRsZTogJ1ZhbHVlJywKICAgICAgICAgICAgZXZhbHVhdGU6ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGZvcm1hdE51bWJlciQxKGQuZGF0dW0ueSk7CiAgICAgICAgICAgIH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICB0aXRsZTogJ1N0ZXAnLAogICAgICAgICAgICBldmFsdWF0ZTogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZC5kYXR1bS5zdGVwLnRvU3RyaW5nKCk7CiAgICAgICAgICAgIH0pLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICB0aXRsZTogJ1RpbWUnLAogICAgICAgICAgICBldmFsdWF0ZTogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBzZWMgdG8gbXMuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkYXRlID0gbmV3IERhdGUoZC5kYXR1bS53YWxsVGltZSAqIDEwMDApOwogICAgICAgICAgICAgICAgcmV0dXJuIGRhdGUudG9Mb2NhbGVTdHJpbmcoKTsKICAgICAgICAgICAgfSksCiAgICAgICAgfSwKICAgICAgICB7CiAgICAgICAgICAgIHRpdGxlOiAnUmVsYXRpdmUnLAogICAgICAgICAgICBldmFsdWF0ZTogKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gZC5kYXRhc2V0LmRhdGEoKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0VGltZSA9IGRhdGEubGVuZ3RoID4gMCA/IGRhdGFbMF0ud2FsbFRpbWUgOiAwOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVsYXRpdmVUaW1lSW5NcyA9IChkLmRhdHVtLndhbGxUaW1lIC0gZmlyc3RUaW1lKSAqIDEwMDA7CiAgICAgICAgICAgICAgICByZXR1cm4gZm9ybWF0UmVsYXRpdmVUaW1lSW5NcyhyZWxhdGl2ZVRpbWVJbk1zKTsKICAgICAgICAgICAgfSksCiAgICAgICAgfSwKICAgIF07CiAgICBjbGFzcyBTY2FsYXJDYXJkQ29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHJlZikgewogICAgICAgICAgICB0aGlzLnJlZiA9IHJlZjsKICAgICAgICAgICAgdGhpcy5SRVNJWkVfUkVEUkFXX0RFQk9VTkNFX1RJTUVfSU5fTVMgPSBSRVNJWkVfUkVEUkFXX0RFQk9VTkNFX1RJTUVfSU5fTVM7CiAgICAgICAgICAgIHRoaXMuRGF0YUxvYWRTdGF0ZSA9IERhdGFMb2FkU3RhdGU7CiAgICAgICAgICAgIHRoaXMub25GdWxsU2l6ZVRvZ2dsZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5vblBpbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMueUF4aXNUeXBlID0gWUF4aXNUeXBlLkxJTkVBUjsKICAgICAgICAgICAgdGhpcy50b29sdGlwQ29sdW1ucyA9IERFRkFVTFRfVE9PTFRJUF9DT0xVTU5TOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGNoYXJ0WEF4aXNUeXBlKCkgewogICAgICAgICAgICBzd2l0Y2ggKHRoaXMueEF4aXNUeXBlKSB7CiAgICAgICAgICAgICAgICBjYXNlIFhBeGlzVHlwZSQxLlNURVA6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhBeGlzVHlwZS5TVEVQOwogICAgICAgICAgICAgICAgY2FzZSBYQXhpc1R5cGUkMS5XQUxMX1RJTUU6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFhBeGlzVHlwZS5XQUxMX1RJTUU7CiAgICAgICAgICAgICAgICBjYXNlIFhBeGlzVHlwZSQxLlJFTEFUSVZFOgogICAgICAgICAgICAgICAgICAgIHJldHVybiBYQXhpc1R5cGUuUkVMQVRJVkU7CiAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB4QXhpc1R5cGUgZm9yIGxpbmUgY2hhcnQuJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b2dnbGVZQXhpc1R5cGUoKSB7CiAgICAgICAgICAgIHRoaXMueUF4aXNUeXBlID0KICAgICAgICAgICAgICAgIHRoaXMueUF4aXNUeXBlID09PSBZQXhpc1R5cGUuTElORUFSID8gWUF4aXNUeXBlLkxPRyA6IFlBeGlzVHlwZS5MSU5FQVI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVzZXREb21haW4oKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmxpbmVDaGFydCkgewogICAgICAgICAgICAgICAgdGhpcy5saW5lQ2hhcnQucmVzZXREb21haW4oKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZHJhdygpIHsKICAgICAgICAgICAgaWYgKHRoaXMubGluZUNoYXJ0KSB7CiAgICAgICAgICAgICAgICAvLyBPbmx5IHJlZHJhdyB3aGVuIGl0IGlzIHZpc2libGUgKGFuZCB0aHVzIGhhdmUgd2lkdGggYW5kIGhlaWdodCkuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5yZWYubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMubGluZUNoYXJ0LnJlZHJhdygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgU2NhbGFyQ2FyZENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnc2NhbGFyLWNhcmQtY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3NjYWxhcl9jYXJkX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnc2NhbGFyX2NhcmRfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTY2FsYXJDYXJkQ29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgU2NhbGFyQ2FyZENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBsb2FkU3RhdGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHRpdGxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0YWc6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNlcmllc0RhdGFMaXN0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0b29sdGlwU29ydDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaWdub3JlT3V0bGllcnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHhBeGlzVHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2NhbGFyU21vb3RoaW5nOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBydW5Db2xvclNjYWxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzaG93RnVsbFNpemU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGlzUGlubmVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvbkZ1bGxTaXplVG9nZ2xlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25QaW5DbGlja2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgbGluZUNoYXJ0OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFtMaW5lQ2hhcnRDb21wb25lbnQsXSB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTY2FsYXJDYXJkQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gU2NhbGFyQ2FyZENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTY2FsYXJDYXJkQ29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTY2FsYXJDYXJkQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNjYWxhckNhcmRDb21wb25lbnQsIHNlbGVjdG9yczogW1sic2NhbGFyLWNhcmQtY29tcG9uZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIFNjYWxhckNhcmRDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoTGluZUNoYXJ0Q29tcG9uZW50LCB0cnVlKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmxpbmVDaGFydCA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGlucHV0czogeyBsb2FkU3RhdGU6ICJsb2FkU3RhdGUiLCB0aXRsZTogInRpdGxlIiwgdGFnOiAidGFnIiwgc2VyaWVzRGF0YUxpc3Q6ICJzZXJpZXNEYXRhTGlzdCIsIHRvb2x0aXBTb3J0OiAidG9vbHRpcFNvcnQiLCBpZ25vcmVPdXRsaWVyczogImlnbm9yZU91dGxpZXJzIiwgeEF4aXNUeXBlOiAieEF4aXNUeXBlIiwgc2NhbGFyU21vb3RoaW5nOiAic2NhbGFyU21vb3RoaW5nIiwgcnVuQ29sb3JTY2FsZTogInJ1bkNvbG9yU2NhbGUiLCBzaG93RnVsbFNpemU6ICJzaG93RnVsbFNpemUiLCBpc1Bpbm5lZDogImlzUGlubmVkIiB9LCBvdXRwdXRzOiB7IG9uRnVsbFNpemVUb2dnbGU6ICJvbkZ1bGxTaXplVG9nZ2xlIiwgb25QaW5DbGlja2VkOiAib25QaW5DbGlja2VkIiB9LCBkZWNsczogMjcsIHZhcnM6IDE4LCBjb25zdHM6IFtbMSwgImhlYWRpbmciXSwgWzEsICJ0YWciLCAzLCAidGl0bGUiLCAidmFsdWUiXSwgWzEsICJjb250cm9scyJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAxLCAicGluLWJ1dHRvbiIsIDMsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFszLCAic3ZnSWNvbiJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidGl0bGUiLCAiVG9nZ2xlIGZ1bGwgc2l6ZSBtb2RlIiwgMywgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgInRpdGxlIiwgIk1vcmUgbGluZSBjaGFydCBvcHRpb25zIiwgMywgIm1hdE1lbnVUcmlnZ2VyRm9yIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgIm1vcmVfdmVydF8yNHB4Il0sIFsibWVudSIsICJtYXRNZW51Il0sIFsibWF0LW1lbnUtaXRlbSIsICIiLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbInN2Z0ljb24iLCAibGluZV93ZWlnaHRfMjRweCJdLCBbIm1hdC1tZW51LWl0ZW0iLCAiIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgInNldHRpbmdzX292ZXJzY2FuXzI0cHgiXSwgWzEsICJjaGFydC1jb250YWluZXIiXSwgWyJkaWFtZXRlciIsICIxOCIsIDQsICJuZ0lmIl0sIFsiZGV0ZWN0UmVzaXplIiwgIiIsIDMsICJjb2xvclNjYWxlIiwgInNlcmllc0RhdGFMaXN0IiwgInRvb2x0aXBDb2x1bW5zIiwgInRvb2x0aXBTb3J0aW5nTWV0aG9kIiwgImlnbm9yZVlPdXRsaWVycyIsICJ4QXhpc1R5cGUiLCAic21vb3RoaW5nRW5hYmxlZCIsICJzbW9vdGhpbmdXZWlnaHQiLCAieUF4aXNUeXBlIiwgInJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zIiwgIm9uUmVzaXplIl0sIFsiZGlhbWV0ZXIiLCAiMTgiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTY2FsYXJDYXJkQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMSwgInRiLXRydW5jYXRlZC1wYXRoIiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiYnV0dG9uIiwgMyk7CiAgICAgICAgICAgIMm1ybVpMThuQXR0cmlidXRlcyg0LCBfYzIkOSk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBTY2FsYXJDYXJkQ29tcG9uZW50X1RlbXBsYXRlX2J1dHRvbl9jbGlja18zX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uUGluQ2xpY2tlZC5lbWl0KCFjdHguaXNQaW5uZWQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNSwgIm1hdC1pY29uIiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImJ1dHRvbiIsIDUpOwogICAgICAgICAgICDJtcm1aTE4bkF0dHJpYnV0ZXMoNywgX2M1JDMpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gU2NhbGFyQ2FyZENvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfNl9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkZ1bGxTaXplVG9nZ2xlLmVtaXQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDgsICJtYXQtaWNvbiIsIDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDksICJidXR0b24iLCA2KTsKICAgICAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDEwLCBfYzgkMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDExLCAibWF0LWljb24iLCA3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMiwgIm1hdC1tZW51IiwgbnVsbCwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTQsICJidXR0b24iLCA5KTsKICAgICAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDE1LCBfYzExKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFNjYWxhckNhcmRDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzE0X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LnRvZ2dsZVlBeGlzVHlwZSgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMTYsICJtYXQtaWNvbiIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxNywgInNwYW4iKTsKICAgICAgICAgICAgybXJtXRleHQoMTgsICJUb2dnbGUgWS1heGlzIGxvZyBzY2FsZSIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE5LCAiYnV0dG9uIiwgMTEpOwogICAgICAgICAgICDJtcm1aTE4bkF0dHJpYnV0ZXMoMjAsIF9jMTQpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gU2NhbGFyQ2FyZENvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMTlfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgucmVzZXREb21haW4oKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDIxLCAibWF0LWljb24iLCAxMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjIsICJzcGFuIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDIzLCAiRml0IGRvbWFpbiB0byBkYXRhIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjQsICJkaXYiLCAxMyk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyNSwgU2NhbGFyQ2FyZENvbXBvbmVudF9tYXRfc3Bpbm5lcl8yNV9UZW1wbGF0ZSwgMSwgMCwgIm1hdC1zcGlubmVyIiwgMTQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI2LCAidGItbGluZS1jaGFydCIsIDE1KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJvblJlc2l6ZSIsIGZ1bmN0aW9uIFNjYWxhckNhcmRDb21wb25lbnRfVGVtcGxhdGVfdGJfbGluZV9jaGFydF9vblJlc2l6ZV8yNl9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5yZWRyYXcoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMCA9IMm1ybVyZWZlcmVuY2UoMTMpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoInRpdGxlIiwgY3R4LnRhZyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJ2YWx1ZSIsIGN0eC50aXRsZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ0aXRsZSIsIGN0eC5pc1Bpbm5lZCA/ICJVbnBpbiBjYXJkIiA6ICJQaW4gY2FyZCIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJzdmdJY29uIiwgY3R4LmlzUGlubmVkID8gImtlZXBfMjRweCIgOiAia2VlcF9vdXRsaW5lXzI0cHgiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgic3ZnSWNvbiIsIGN0eC5zaG93RnVsbFNpemUgPyAiZnVsbHNjcmVlbl9leGl0XzI0cHgiIDogImZ1bGxzY3JlZW5fMjRweCIpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJtYXRNZW51VHJpZ2dlckZvciIsIF9yMCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEwKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJkaXNhYmxlZCIsICFjdHguc2VyaWVzRGF0YUxpc3QgfHwgIWN0eC5zZXJpZXNEYXRhTGlzdC5sZW5ndGgpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg2KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmxvYWRTdGF0ZSA9PT0gY3R4LkRhdGFMb2FkU3RhdGUuTE9BRElORyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoImNvbG9yU2NhbGUiLCBjdHgucnVuQ29sb3JTY2FsZSkoInNlcmllc0RhdGFMaXN0IiwgY3R4LnNlcmllc0RhdGFMaXN0KSgidG9vbHRpcENvbHVtbnMiLCBjdHgudG9vbHRpcENvbHVtbnMpKCJ0b29sdGlwU29ydGluZ01ldGhvZCIsIGN0eC50b29sdGlwU29ydCkoImlnbm9yZVlPdXRsaWVycyIsIGN0eC5pZ25vcmVPdXRsaWVycykoInhBeGlzVHlwZSIsIGN0eC5jaGFydFhBeGlzVHlwZSgpKSgic21vb3RoaW5nRW5hYmxlZCIsIGN0eC5zY2FsYXJTbW9vdGhpbmcgPiAwKSgic21vb3RoaW5nV2VpZ2h0IiwgY3R4LnNjYWxhclNtb290aGluZykoInlBeGlzVHlwZSIsIGN0eC55QXhpc1R5cGUpKCJyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyIsIGN0eC5SRVNJWkVfUkVEUkFXX0RFQk9VTkNFX1RJTUVfSU5fTVMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1RydW5jYXRlZFBhdGhDb21wb25lbnQsIE1hdEJ1dHRvbiwgTWF0SWNvbiwgTWF0TWVudVRyaWdnZXIsIF9NYXRNZW51LCBNYXRNZW51SXRlbSwgTmdJZiwgTGluZUNoYXJ0Q29tcG9uZW50LCBSZXNpemVEZXRlY3RvckRpcmVjdGl2ZSwgTWF0U3Bpbm5lcl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjE2cHg7cGFkZGluZy10b3A6NHB4fS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1ib3R0b206NHB4O3Bvc2l0aW9uOnJlbGF0aXZlfS50YWdbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbn0ucGluLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjE4cHh9LmNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2ZsZXgtc2hyaW5rOjA7bWFyZ2luLXJpZ2h0Oi0xMnB4O3doaXRlLXNwYWNlOm5vd3JhcH0uY2hhcnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZTtmbGV4OjF9LmNoYXJ0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0gICBtYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MTFweDt0b3A6MTFweH0uY2hhcnQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRiLWxpbmUtY2hhcnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6YmxvY2s7aGVpZ2h0OjEwMCV9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL2NhcmRfcmVuZGVyZXIvc2NhbGFyX2NhcmRfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBsaXN0QQogICAgICogQHBhcmFtIHs/fSBsaXN0QgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgZnVuY3Rpb24gYXJlU2VyaWVzRGF0YUxpc3RFcXVhbChsaXN0QSwgbGlzdEIpIHsKICAgICAgICBpZiAobGlzdEEubGVuZ3RoICE9PSBsaXN0Qi5sZW5ndGgpIHsKICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gbGlzdEEuZXZlcnkoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbGlzdEFWYWwKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobGlzdEFWYWwsIGluZGV4KSA9PiB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGlzdEJWYWwgPSBsaXN0QltpbmRleF07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGlzdEFQb2ludHMgPSBsaXN0QVZhbC5wb2ludHM7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbGlzdEJQb2ludHMgPSBsaXN0QlZhbC5wb2ludHM7CiAgICAgICAgICAgIHJldHVybiAobGlzdEFWYWwuc2VyaWVzSWQgPT09IGxpc3RCVmFsLnNlcmllc0lkICYmCiAgICAgICAgICAgICAgICBsaXN0QVZhbC5tZXRhZGF0YS5kaXNwbGF5TmFtZSA9PT0gbGlzdEJWYWwubWV0YWRhdGEuZGlzcGxheU5hbWUgJiYKICAgICAgICAgICAgICAgIGxpc3RBVmFsLnZpc2libGUgPT09IGxpc3RCVmFsLnZpc2libGUgJiYKICAgICAgICAgICAgICAgIGxpc3RBUG9pbnRzLmxlbmd0aCA9PT0gbGlzdEJQb2ludHMubGVuZ3RoICYmCiAgICAgICAgICAgICAgICBsaXN0QVBvaW50cy5ldmVyeSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGxpc3RBUG9pbnQKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChsaXN0QVBvaW50LCBpbmRleCkgPT4gewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBsaXN0QlBvaW50ID0gbGlzdEJQb2ludHNbaW5kZXhdOwogICAgICAgICAgICAgICAgICAgIHJldHVybiBsaXN0QVBvaW50LnggPT09IGxpc3RCUG9pbnQueCAmJiBsaXN0QVBvaW50LnkgPT09IGxpc3RCUG9pbnQueTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfSkpOwogICAgfQogICAgY2xhc3MgU2NhbGFyQ2FyZENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5mdWxsV2lkdGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmZ1bGxIZWlnaHRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLnBpblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5zZXJpZXNEYXRhTGlzdCQgPSBvZihbXSk7CiAgICAgICAgICAgIHRoaXMudG9vbHRpcFNvcnQkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc1Rvb2x0aXBTb3J0KTsKICAgICAgICAgICAgdGhpcy5pZ25vcmVPdXRsaWVycyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzSWdub3JlT3V0bGllcnMpOwogICAgICAgICAgICB0aGlzLnhBeGlzVHlwZSQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzWEF4aXNUeXBlKTsKICAgICAgICAgICAgdGhpcy5zY2FsYXJTbW9vdGhpbmckID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc1NjYWxhclNtb290aGluZyk7CiAgICAgICAgICAgIHRoaXMuc2hvd0Z1bGxTaXplID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTWV0YWRhdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzU2NhbGFyQ2FyZE1ldGFkYXRhKGNhcmRNZXRhZGF0YSkgewogICAgICAgICAgICBjb25zdCB7IHBsdWdpbiB9ID0gY2FyZE1ldGFkYXRhOwogICAgICAgICAgICByZXR1cm4gcGx1Z2luID09PSBQbHVnaW5UeXBlLlNDQUxBUlM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25GdWxsU2l6ZVRvZ2dsZSgpIHsKICAgICAgICAgICAgdGhpcy5zaG93RnVsbFNpemUgPSAhdGhpcy5zaG93RnVsbFNpemU7CiAgICAgICAgICAgIHRoaXMuZnVsbFdpZHRoQ2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKTsKICAgICAgICAgICAgdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQnVpbGQgb2JzZXJ2YWJsZXMgb25jZSBjYXJkSWQgaXMgZGVmaW5lZCAoYWZ0ZXIgb25Jbml0KS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdENhcmRNZXRhZGF0YSQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRDYXJkTWV0YWRhdGEsIHRoaXMuY2FyZElkKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYXJkTWV0YWRhdGEkID0gc2VsZWN0Q2FyZE1ldGFkYXRhJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZE1ldGFkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZE1ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gISFjYXJkTWV0YWRhdGEgJiYgdGhpcy5pc1NjYWxhckNhcmRNZXRhZGF0YShjYXJkTWV0YWRhdGEpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZE1ldGFkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZE1ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNhcmRNZXRhZGF0YSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNldHRpbmdzQW5kVGltZVNlcmllcyQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NYQXhpc1R5cGUpLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0Q2FyZFRpbWVTZXJpZXMsIHRoaXMuY2FyZElkKSwKICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVuSWRBbmRQb2ludHMkID0gc2V0dGluZ3NBbmRUaW1lU2VyaWVzJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3hBeGlzVHlwZSwgcnVuVG9TZXJpZXNdKSA9PiAhIXJ1blRvU2VyaWVzKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3hBeGlzVHlwZSwgcnVuVG9TZXJpZXNdKSA9PiAoKC8qKiBAdHlwZSB7P30gKi8gKHsgeEF4aXNUeXBlLCBydW5Ub1NlcmllcyB9KSkpKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoeyB4QXhpc1R5cGUsIHJ1blRvU2VyaWVzIH0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJ1bklkcyA9IE9iamVjdC5rZXlzKHJ1blRvU2VyaWVzKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdHMgPSBydW5JZHMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuSWQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChydW5JZCkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJ1bklkLAogICAgICAgICAgICAgICAgICAgICAgICBwb2ludHM6IHRoaXMuc3RlcFNlcmllc1RvTGluZVNlcmllcyhydW5Ub1Nlcmllc1tydW5JZF0sIHhBeGlzVHlwZSksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnNlcmllc0RhdGFMaXN0JCA9IHJ1bklkQW5kUG9pbnRzJC5waXBlKHN3aXRjaE1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuSWRBbmRQb2ludHMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChydW5JZEFuZFBvaW50cykgPT4gewogICAgICAgICAgICAgICAgaWYgKCFydW5JZEFuZFBvaW50cy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoW10pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QocnVuSWRBbmRQb2ludHMubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuSWRBbmRQb2ludAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHJ1bklkQW5kUG9pbnQpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRSdW5EaXNwbGF5TmFtZUFuZFBvaW50cyhydW5JZEFuZFBvaW50KTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pKSwgY29tYmluZUxhdGVzdFdpdGgodGhpcy5zdG9yZS5zZWxlY3QoZ2V0Q3VycmVudFJvdXRlUnVuU2VsZWN0aW9uKSksIAogICAgICAgICAgICAvLyBXaGVuIHRoZSBgZmV0Y2hSdW5zU3VjY2VlZGVkYCBhY3Rpb24gZmlyZXMsIHRoZSBydW4gc2VsZWN0aW9uCiAgICAgICAgICAgIC8vIG1hcCBhbmQgdGhlIG1ldGFkYXRhIGNoYW5nZS4gVG8gcHJldmVudCBxdWljayBmaXJlIG9mIGNoYW5nZXMsCiAgICAgICAgICAgIC8vIGRlYm91bmNlIGJ5IGEgbWljcm90YXNrIHRvIGVtaXQgb25seSBzaW5nbGUgY2hhbmdlIGZvciB0aGUgcnVucwogICAgICAgICAgICAvLyBzdG9yZSBjaGFuZ2UuCiAgICAgICAgICAgIGRlYm91bmNlVGltZSgwKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbcmVzdWx0LCBydW5TZWxlY3Rpb25NYXBdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHsgcnVuSWQsIGRpc3BsYXlOYW1lLCBwb2ludHMgfSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHNlcmllc0lkOiBydW5JZCwKICAgICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGE6IHsgZGlzcGxheU5hbWUgfSwKICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRzLAogICAgICAgICAgICAgICAgICAgICAgICB2aXNpYmxlOiBCb29sZWFuKHJ1blNlbGVjdGlvbk1hcCAmJiBydW5TZWxlY3Rpb25NYXAuZ2V0KHJ1bklkKSksCiAgICAgICAgICAgICAgICAgICAgfTsKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpLCBzdGFydFdpdGgoW10pLCBkaXN0aW5jdFVudGlsQ2hhbmdlZChhcmVTZXJpZXNEYXRhTGlzdEVxdWFsKSk7CiAgICAgICAgICAgIHRoaXMubG9hZFN0YXRlJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldENhcmRMb2FkU3RhdGUsIHRoaXMuY2FyZElkKTsKICAgICAgICAgICAgdGhpcy50YWckID0gY2FyZE1ldGFkYXRhJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZE1ldGFkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZE1ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZE1ldGFkYXRhLnRhZzsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy50aXRsZSQgPSB0aGlzLnRhZyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHRhZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHRhZykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGdldFRhZ0Rpc3BsYXlOYW1lKHRhZywgdGhpcy5ncm91cE5hbWUpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmlzUGlubmVkJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldENhcmRQaW5uZWRTdGF0ZSwgdGhpcy5jYXJkSWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gcnVuSWRBbmRQb2ludAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0UnVuRGlzcGxheU5hbWVBbmRQb2ludHMocnVuSWRBbmRQb2ludCkgewogICAgICAgICAgICBjb25zdCB7IHJ1bklkLCBwb2ludHMgfSA9IHJ1bklkQW5kUG9pbnQ7CiAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldEV4cGVyaW1lbnRJZEZvclJ1bklkLCB7IHJ1bklkIH0pLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RXhwZXJpbWVudElkVG9BbGlhc01hcCksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW4sIHsgcnVuSWQgfSksCiAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbZXhwZXJpbWVudElkLCBpZFRvQWxpYXMsIHJ1bl0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGRpc3BsYXlOYW1lID0gZ2V0RGlzcGxheU5hbWVGb3JSdW4ocnVuSWQsIHJ1biwgZXhwZXJpbWVudElkID8gaWRUb0FsaWFzW2V4cGVyaW1lbnRJZF0gOiBudWxsKTsKICAgICAgICAgICAgICAgIHJldHVybiB7IHJ1bklkLCBkaXNwbGF5TmFtZSwgcG9pbnRzIH07CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBzdGVwU2VyaWVzCiAgICAgICAgICogQHBhcmFtIHs/fSB4QXhpc1R5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0ZXBTZXJpZXNUb0xpbmVTZXJpZXMoc3RlcFNlcmllcywgeEF4aXNUeXBlKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaXNTdGVwQmFzZWQgPSB4QXhpc1R5cGUgPT09IFhBeGlzVHlwZSQxLlNURVA7CiAgICAgICAgICAgIHJldHVybiBzdGVwU2VyaWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gc3RlcERhdHVtCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoc3RlcERhdHVtKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGVwRGF0dW0pLCB7IHg6IGlzU3RlcEJhc2VkID8gc3RlcERhdHVtLnN0ZXAgOiBzdGVwRGF0dW0ud2FsbFRpbWUsIHk6IHN0ZXBEYXR1bS52YWx1ZSB9KTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIFNjYWxhckNhcmRDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3NjYWxhci1jYXJkJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHNjYWxhci1jYXJkLWNvbXBvbmVudAogICAgICBbbG9hZFN0YXRlXT0ibG9hZFN0YXRlJCB8IGFzeW5jIgogICAgICBbcnVuQ29sb3JTY2FsZV09InJ1bkNvbG9yU2NhbGUiCiAgICAgIFt0aXRsZV09InRpdGxlJCB8IGFzeW5jIgogICAgICBbdGFnXT0idGFnJCB8IGFzeW5jIgogICAgICBbc2VyaWVzRGF0YUxpc3RdPSJzZXJpZXNEYXRhTGlzdCQgfCBhc3luYyIKICAgICAgW3Rvb2x0aXBTb3J0XT0idG9vbHRpcFNvcnQkIHwgYXN5bmMiCiAgICAgIFtpZ25vcmVPdXRsaWVyc109Imlnbm9yZU91dGxpZXJzJCB8IGFzeW5jIgogICAgICBbeEF4aXNUeXBlXT0ieEF4aXNUeXBlJCB8IGFzeW5jIgogICAgICBbc2NhbGFyU21vb3RoaW5nXT0ic2NhbGFyU21vb3RoaW5nJCB8IGFzeW5jIgogICAgICBbc2hvd0Z1bGxTaXplXT0ic2hvd0Z1bGxTaXplIgogICAgICBbaXNQaW5uZWRdPSJpc1Bpbm5lZCQgfCBhc3luYyIKICAgICAgKG9uRnVsbFNpemVUb2dnbGUpPSJvbkZ1bGxTaXplVG9nZ2xlKCkiCiAgICAgIChvblBpbkNsaWNrZWQpPSJwaW5TdGF0ZUNoYW5nZWQuZW1pdCgkZXZlbnQpIgogICAgPjwvc2NhbGFyLWNhcmQtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIGAKICAgICAgOmhvc3QgewogICAgICAgIGRpc3BsYXk6IGJsb2NrOwogICAgICAgIGhlaWdodDogMTAwJTsKICAgICAgfQogICAgYCwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTY2FsYXJDYXJkQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIFNjYWxhckNhcmRDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2FyZElkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBncm91cE5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHJ1bkNvbG9yU2NhbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZ1bGxXaWR0aENoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBmdWxsSGVpZ2h0Q2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIHBpblN0YXRlQ2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFNjYWxhckNhcmRDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBTY2FsYXJDYXJkQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNjYWxhckNhcmRDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTY2FsYXJDYXJkQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNjYWxhckNhcmRDb250YWluZXIsIHNlbGVjdG9yczogW1sic2NhbGFyLWNhcmQiXV0sIGlucHV0czogeyBjYXJkSWQ6ICJjYXJkSWQiLCBncm91cE5hbWU6ICJncm91cE5hbWUiLCBydW5Db2xvclNjYWxlOiAicnVuQ29sb3JTY2FsZSIgfSwgb3V0cHV0czogeyBmdWxsV2lkdGhDaGFuZ2VkOiAiZnVsbFdpZHRoQ2hhbmdlZCIsIGZ1bGxIZWlnaHRDaGFuZ2VkOiAiZnVsbEhlaWdodENoYW5nZWQiLCBwaW5TdGF0ZUNoYW5nZWQ6ICJwaW5TdGF0ZUNoYW5nZWQiIH0sIGRlY2xzOiAxMCwgdmFyczogMjksIGNvbnN0czogW1szLCAibG9hZFN0YXRlIiwgInJ1bkNvbG9yU2NhbGUiLCAidGl0bGUiLCAidGFnIiwgInNlcmllc0RhdGFMaXN0IiwgInRvb2x0aXBTb3J0IiwgImlnbm9yZU91dGxpZXJzIiwgInhBeGlzVHlwZSIsICJzY2FsYXJTbW9vdGhpbmciLCAic2hvd0Z1bGxTaXplIiwgImlzUGlubmVkIiwgIm9uRnVsbFNpemVUb2dnbGUiLCAib25QaW5DbGlja2VkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU2NhbGFyQ2FyZENvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic2NhbGFyLWNhcmQtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigib25GdWxsU2l6ZVRvZ2dsZSIsIGZ1bmN0aW9uIFNjYWxhckNhcmRDb250YWluZXJfVGVtcGxhdGVfc2NhbGFyX2NhcmRfY29tcG9uZW50X29uRnVsbFNpemVUb2dnbGVfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkZ1bGxTaXplVG9nZ2xlKCk7IH0pKCJvblBpbkNsaWNrZWQiLCBmdW5jdGlvbiBTY2FsYXJDYXJkQ29udGFpbmVyX1RlbXBsYXRlX3NjYWxhcl9jYXJkX2NvbXBvbmVudF9vblBpbkNsaWNrZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5waW5TdGF0ZUNoYW5nZWQuZW1pdCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDUsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg2LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDgsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg5LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJsb2FkU3RhdGUiLCDJtcm1cGlwZUJpbmQxKDEsIDExLCBjdHgubG9hZFN0YXRlJCkpKCJydW5Db2xvclNjYWxlIiwgY3R4LnJ1bkNvbG9yU2NhbGUpKCJ0aXRsZSIsIMm1ybVwaXBlQmluZDEoMiwgMTMsIGN0eC50aXRsZSQpKSgidGFnIiwgybXJtXBpcGVCaW5kMSgzLCAxNSwgY3R4LnRhZyQpKSgic2VyaWVzRGF0YUxpc3QiLCDJtcm1cGlwZUJpbmQxKDQsIDE3LCBjdHguc2VyaWVzRGF0YUxpc3QkKSkoInRvb2x0aXBTb3J0IiwgybXJtXBpcGVCaW5kMSg1LCAxOSwgY3R4LnRvb2x0aXBTb3J0JCkpKCJpZ25vcmVPdXRsaWVycyIsIMm1ybVwaXBlQmluZDEoNiwgMjEsIGN0eC5pZ25vcmVPdXRsaWVycyQpKSgieEF4aXNUeXBlIiwgybXJtXBpcGVCaW5kMSg3LCAyMywgY3R4LnhBeGlzVHlwZSQpKSgic2NhbGFyU21vb3RoaW5nIiwgybXJtXBpcGVCaW5kMSg4LCAyNSwgY3R4LnNjYWxhclNtb290aGluZyQpKSgic2hvd0Z1bGxTaXplIiwgY3R4LnNob3dGdWxsU2l6ZSkoImlzUGlubmVkIiwgybXJtXBpcGVCaW5kMSg5LCAyNywgY3R4LmlzUGlubmVkJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1NjYWxhckNhcmRDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVdIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIGhlaWdodDogMTAwJTtcbiAgICAgIH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IFV0aWxpdGllcyBmb3IgZm9ybWF0dGluZyBoaXN0b2dyYW0gZGF0YS4KICAgICAqCiAgICAgKiBGb3IgdGhlIHRyYWRpdGlvbmFsIFRlbnNvckJvYXJkIGxvZ2ljLCBzZWUKICAgICAqIHRoaXJkX3BhcnR5L3RlbnNvcmJvYXJkL3BsdWdpbnMvaGlzdG9ncmFtL3RmX2hpc3RvZ3JhbV9kYXNoYm9hcmQvaGlzdG9ncmFtQ29yZS50cwogICAgICovCiAgICBjb25zdCBERUZBVUxUX0JJTl9DT1VOVCA9IDMwOwogICAgLyoqCiAgICAgKiBIaXN0b2dyYW0gbm9ybWFsaXphdGlvbiBsb2dpYy4KICAgICAqCiAgICAgKiAtIENyZWF0ZSBhIG5vcm1hbGl6ZWQgYmluIHRlbXBsYXRlIHdpdGggJ2JpbkNvdW50JyAjIG9mIGJpbnMuIFRoZSByYW5nZSBvZgogICAgICogICBhbGwgaGlzdG9ncmFtcyBzaG91bGQgZml0IGludG8gdGhpcyBuZXcgYmluIGxpc3QuCiAgICAgKiAtIEVhY2ggaGlzdG9ncmFtIGdldHMgaXRzIG93biBjb3B5IG9mIHRoZSBub3JtYWxpemVkIGJpbnMuCiAgICAgKiAtIEVhY2ggaGlzdG9ncmFtJ3Mgb2xkIGNvdW50cyBhcmUgcmVkaXN0cmlidXRlZCBhbW9uZyB0aGVpciBuZXcgYmlucy4KICAgICAqLwogICAgZnVuY3Rpb24gYnVpbGROb3JtYWxpemVkSGlzdG9ncmFtcyhoaXN0b2dyYW1zLCBiaW5Db3VudCA9IERFRkFVTFRfQklOX0NPVU5UKSB7CiAgICAgICAgaWYgKCFoaXN0b2dyYW1zLmxlbmd0aCB8fCBiaW5Db3VudCA8IDEpIHsKICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgIH0KICAgICAgICBjb25zdCByYW5nZSA9IGdldEJpblJhbmdlKGhpc3RvZ3JhbXMpOwogICAgICAgIC8vIElmIHRoZSBvdXRwdXQgcmFuZ2UgaXMgMCB3aWR0aCwgdXNlIGEgZGVmYXVsdCBub24gMCByYW5nZS4KICAgICAgICBpZiAocmFuZ2UgJiYgcmFuZ2UubGVmdCA9PT0gcmFuZ2UucmlnaHQpIHsKICAgICAgICAgICAgcmFuZ2UucmlnaHQgPSByYW5nZS5yaWdodCAqIDEuMSArIDE7CiAgICAgICAgICAgIHJhbmdlLmxlZnQgPSByYW5nZS5sZWZ0IC8gMS4xIC0gMTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIGhpc3RvZ3JhbXMubWFwKChoaXN0b2dyYW0pID0+IHsKICAgICAgICAgICAgcmV0dXJuIHsKICAgICAgICAgICAgICAgIHN0ZXA6IGhpc3RvZ3JhbS5zdGVwLAogICAgICAgICAgICAgICAgd2FsbFRpbWU6IGhpc3RvZ3JhbS53YWxsVGltZSwKICAgICAgICAgICAgICAgIGJpbnM6IHJhbmdlID8gcmVidWlsZEJpbnMoaGlzdG9ncmFtLmJpbnMsIHJhbmdlLCBiaW5Db3VudCkgOiBbXSwKICAgICAgICAgICAgfTsKICAgICAgICB9KTsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgYSByYW5nZSB0aGF0IGNvdmVycyB0aGUgYmlucyBvZiBhbGwgaW5wdXQgaGlzdG9ncmFtcy4gRmllbGRzIG1heQogICAgICogYmUgbnVsbCBpZiB0aGUgaGlzdG9ncmFtIGJpbnMgd2VyZSBlbXB0eS4KICAgICAqCiAgICAgKiBGb3IgZXhhbXBsZSwKICAgICAqIGhpc3RvZ3JhbVswXTogWyAgICAgICAgICBdWyAgXQogICAgICogaGlzdG9ncmFtWzFdOiAgICAgICAgWyAgICAgICAgICAgICAgIF0KICAgICAqIHJlc3VsdDogICAgICAgWyAgICAgICAgICAgICAgICAgICAgICBdCiAgICAgKi8KICAgIGZ1bmN0aW9uIGdldEJpblJhbmdlKGhpc3RvZ3JhbXMpIHsKICAgICAgICBsZXQgbGVmdCA9IG51bGw7CiAgICAgICAgbGV0IHJpZ2h0ID0gbnVsbDsKICAgICAgICBmb3IgKGNvbnN0IHsgYmlucyB9IG9mIGhpc3RvZ3JhbXMpIHsKICAgICAgICAgICAgaWYgKCFiaW5zLmxlbmd0aCkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29uc3QgbGFzdEJpbiA9IGJpbnNbYmlucy5sZW5ndGggLSAxXTsKICAgICAgICAgICAgY29uc3QgaGlzdG9ncmFtTGVmdCA9IGJpbnNbMF0ueDsKICAgICAgICAgICAgY29uc3QgaGlzdG9ncmFtUmlnaHQgPSBsYXN0QmluLnggKyBsYXN0QmluLmR4OwogICAgICAgICAgICBpZiAobGVmdCA9PT0gbnVsbCB8fCBoaXN0b2dyYW1MZWZ0IDwgbGVmdCkgewogICAgICAgICAgICAgICAgbGVmdCA9IGhpc3RvZ3JhbUxlZnQ7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHJpZ2h0ID09PSBudWxsIHx8IGhpc3RvZ3JhbVJpZ2h0ID4gcmlnaHQpIHsKICAgICAgICAgICAgICAgIHJpZ2h0ID0gaGlzdG9ncmFtUmlnaHQ7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGxlZnQgPT09IG51bGwgfHwgcmlnaHQgPT09IG51bGwpIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IGxlZnQsIHJpZ2h0IH07CiAgICB9CiAgICAvKioKICAgICAqIEJ1aWxkcyBhIG5ldyBsaXN0IG9mICdiaW5Db3VudCcgYmlucy5UaGUgJ3knIGNvdW50cyBmcm9tIGlucHV0IGJpbnMgYXJlCiAgICAgKiBkaXN0cmlidXRlZCBhbW9uZyB0aGUgbmV3IGJpbnMgYmFzZWQgb24gYW1vdW50IG9mIG92ZXJsYXAuCiAgICAgKiBJbnB1dCBiaW5zIG11c3QgYmUgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIgYW5kIG5vbi1vdmVybGFwcGluZy4KICAgICAqCiAgICAgKiBDaGFyYWN0ZXJpc3RpY3M6CiAgICAgKiAtIFRoZSBvdXRwdXQgYmlucyBhcmUgZ3VhcmFudGVlZCBjb250aWd1b3VzLCBub24tb3ZlcmxhcHBpbmcsIGVxdWFsIHdpZHRoLAogICAgICogICBhbmQgbm9uemVybyB3aWR0aC4KICAgICAqIC0gSGFuZGxlcyAwIHdpZHRoIGlucHV0IGJpbnMuIFdoZW4gYSAwIHdpZHRoIGJpbiBpcyBiZXR3ZWVuIDIgb3V0cHV0IGJpbnMsCiAgICAgKiAgIGl0cyBjb3VudHMgYXJlIGRpc3RyaWJ1dGVkIGV2ZW5seSBiZXR3ZWVuIHRoZSBuZWlnaGJvcmluZyBiaW5zLgogICAgICoKICAgICAqIEZvciBleGFtcGxlLAogICAgICogYmluczogICAgICAgWyA1IF1bICAgMTAgICBdCiAgICAgKiByYW5nZTogICAgICBbICAgICAgICAgICAgICAgICAgXQogICAgICogYmluc0NvdW50OiAgMgogICAgICogcmVzdWx0czogICAgWyAgIDEwICAgXVsgICAgNSAgIF0KICAgICAqLwogICAgZnVuY3Rpb24gcmVidWlsZEJpbnMoYmlucywgcmFuZ2UsIGJpbkNvdW50KSB7CiAgICAgICAgY29uc3QgcmVzdWx0cyA9IFtdOwogICAgICAgIGNvbnN0IHsgbGVmdCwgcmlnaHQgfSA9IHJhbmdlOwogICAgICAgIGNvbnN0IGR4ID0gKHJpZ2h0IC0gbGVmdCkgLyBiaW5Db3VudDsKICAgICAgICBsZXQgYmluSW5kZXggPSAwOwogICAgICAgIGxldCBuZXh0QmluQ29udHJpYnV0aW9uID0gMDsKICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGJpbkNvdW50OyBpKyspIHsKICAgICAgICAgICAgY29uc3QgcmVzdWx0TGVmdCA9IGxlZnQgKyBpICogZHg7CiAgICAgICAgICAgIGNvbnN0IHJlc3VsdFJpZ2h0ID0gcmVzdWx0TGVmdCArIGR4OwogICAgICAgICAgICBjb25zdCBpc0xhc3RSZXN1bHRCaW4gPSBpID09PSBiaW5Db3VudCAtIDE7CiAgICAgICAgICAgIGxldCByZXN1bHRZID0gbmV4dEJpbkNvbnRyaWJ1dGlvbjsKICAgICAgICAgICAgbmV4dEJpbkNvbnRyaWJ1dGlvbiA9IDA7CiAgICAgICAgICAgIHdoaWxlIChiaW5JbmRleCA8IGJpbnMubGVuZ3RoKSB7CiAgICAgICAgICAgICAgICBjb25zdCBiaW4gPSBiaW5zW2JpbkluZGV4XTsKICAgICAgICAgICAgICAgIGNvbnN0IGNvbnRyaWJ1dGlvbiA9IGdldEJpbkNvbnRyaWJ1dGlvbihiaW4sIHJlc3VsdExlZnQsIHJlc3VsdFJpZ2h0LCAhaXNMYXN0UmVzdWx0QmluKTsKICAgICAgICAgICAgICAgIHJlc3VsdFkgKz0gY29udHJpYnV0aW9uLmN1cnI7CiAgICAgICAgICAgICAgICBuZXh0QmluQ29udHJpYnV0aW9uICs9IGNvbnRyaWJ1dGlvbi5uZXh0OwogICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcmVzdWx0IGJpbiBjb21wbGV0ZXMsIGJyZWFrIHdpdGhvdXQgaW5jcmVtZW50aW5nIGJpbkluZGV4LCBpbgogICAgICAgICAgICAgICAgLy8gY2FzZSBpdCBjb250cmlidXRlcyB0byB0aGUgdGhlIG5leHQgcmVzdWx0IGJpbi4KICAgICAgICAgICAgICAgIGlmIChiaW4ueCArIGJpbi5keCA+IHJlc3VsdFJpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBiaW5JbmRleCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdHMucHVzaCh7IHg6IHJlc3VsdExlZnQsIGR4LCB5OiByZXN1bHRZIH0pOwogICAgICAgIH0KICAgICAgICByZXR1cm4gcmVzdWx0czsKICAgIH0KICAgIC8qKgogICAgICogQ29tcHV0ZXMgaG93IG11Y2ggb2YgdGhlIGlucHV0IGJpbidzICd5JyBjb3VudHMgc2hvdWxkIGJlIGFsbG9jYXRlZCB0byBhIG5ldwogICAgICogcmFuZ2UuIEZvciAwIHdpZHRoIGlucHV0IGJpbnMsIHRoZSBhbGxvY2F0aW9uIG1heSBiZSBzcGxpdCBpbiBoYWxmIGFjcm9zcyAyCiAgICAgKiBiaW5zLgogICAgICovCiAgICBmdW5jdGlvbiBnZXRCaW5Db250cmlidXRpb24oYmluLCByZXN1bHRMZWZ0LCByZXN1bHRSaWdodCwgcmVzdWx0SGFzUmlnaHROZWlnaGJvcikgewogICAgICAgIGNvbnN0IGJpbkxlZnQgPSBiaW4ueDsKICAgICAgICBjb25zdCBiaW5SaWdodCA9IGJpbi54ICsgYmluLmR4OwogICAgICAgIGlmIChiaW5MZWZ0ID4gcmVzdWx0UmlnaHQgfHwgYmluUmlnaHQgPCByZXN1bHRMZWZ0KSB7CiAgICAgICAgICAgIHJldHVybiB7IGN1cnI6IDAsIG5leHQ6IDAgfTsKICAgICAgICB9CiAgICAgICAgaWYgKGJpbi5keCA9PT0gMCkgewogICAgICAgICAgICBpZiAocmVzdWx0SGFzUmlnaHROZWlnaGJvciAmJiBiaW5SaWdodCA9PT0gcmVzdWx0UmlnaHQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IGN1cnI6IDAuNSAqIGJpbi55LCBuZXh0OiAwLjUgKiBiaW4ueSB9OwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiB7IGN1cnI6IGJpbi55LCBuZXh0OiAwIH07CiAgICAgICAgfQogICAgICAgIGNvbnN0IGludGVyc2VjdGlvbiA9IE1hdGgubWluKGJpblJpZ2h0LCByZXN1bHRSaWdodCkgLSBNYXRoLm1heChiaW5MZWZ0LCByZXN1bHRMZWZ0KTsKICAgICAgICByZXR1cm4geyBjdXJyOiAoYmluLnkgKiBpbnRlcnNlY3Rpb24pIC8gYmluLmR4LCBuZXh0OiAwIH07CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2lkZ2V0cy9oaXN0b2dyYW0vaGlzdG9ncmFtX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBIaXN0b2dyYW1Db21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaG9zdAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGhvc3QpIHsKICAgICAgICAgICAgdGhpcy5ob3N0ID0gaG9zdDsKICAgICAgICAgICAgdGhpcy5tb2RlID0gSGlzdG9ncmFtTW9kZS5PRkZTRVQ7CiAgICAgICAgICAgIHRoaXMudGltZVByb3BlcnR5ID0gVGltZVByb3BlcnR5LlNURVA7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCd2ei1oaXN0b2dyYW0tdGltZXNlcmllcycpKSk7CiAgICAgICAgICAgIC8vIE11c3Qgc2V0IG9wdGlvbmFsIGlucHV0IHZhbHVlcyBoZXJlIHNpbmNlIHRoZXkgd29uJ3QgYmUgcGFydCBvZiB0aGUKICAgICAgICAgICAgLy8gbmdPbkNoYW5nZXMgaWYgdGhlIHBhcmVudCBkb2VzIG5vdCBvdmVycmlkZSB0aGUgdmFsdWUuCiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5tb2RlID0gdGhpcy5tb2RlOwogICAgICAgICAgICB0aGlzLmVsZW1lbnQudGltZVByb3BlcnR5ID0gdGhpcy50aW1lUHJvcGVydHk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuaG9zdC5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuZWxlbWVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRPRE8ocHN5YnV6eik6IHBlcmZvcm0gdGhlIHNhbWUgcmUtYnVja2V0aW5nIGxvZ2ljIGFzIHRoZSBQb2x5bWVyIHNpZGUsCiAgICAgICAgICogaW5zdGVhZCBvZiBhY2NlcHRpbmcgdGhlIGRhdGEgYXMtaXMuCiAgICAgICAgICoKICAgICAgICAgKiBUaGUgUG9seW1lciBzaWRlIGZvcmNlcyB0aGUgaGlzdG9ncmFtIGF0IGVhY2ggc3RlcCBpbnRvIGEgY29tcHJlc3NlZAogICAgICAgICAqIGhpc3RvZ3JhbSB3aXRoIGV4YWN0bHkgMzAgYmlucyBmb3IgYSBjb3VwbGUgcmVhc29uczoKICAgICAgICAgKiAtIEhpZ2ggbnVtYmVyIG9mIGJpbnMgd2lsbCByZW5kZXIgdmlzdWFsIGFydGlmYWN0cy4KICAgICAgICAgKiAtIFZ6SGlzdG9ncmFtVGltZXNlcmllcyBleHBlY3RzIGFsbCBoaXN0b2dyYW1zIGF0IGVhY2ggc3RlcCB0byBoYXZlIHRoZQogICAgICAgICAqICAgc2FtZSBudW1iZXIgb2YgYmlucy4gSG92ZXJpbmcgb3ZlciBhIEhpc3RvZ3JhbUNvbXBvbmVudCB3aXRoIGJpbiBjb3VudAogICAgICAgICAqICAgaW5lcXVhbGl0eSB0aHJvd3MgZXJyb3JzLgogICAgICAgICAqIFNlZSB0ZW5zb3Jib2FyZC9wbHVnaW5zL2hpc3RvZ3JhbS90Zl9oaXN0b2dyYW1fZGFzaGJvYXJkL2hpc3RvZ3JhbUNvcmUudHMKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgaWYgKGNoYW5nZXNbJ25hbWUnXSB8fCBjaGFuZ2VzWydkYXRhJ10pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlZERhdGEgPSB0aGlzLmRhdGEubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0dW0KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChkYXR1bSkgPT4gewogICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgc3RlcCwgYmlucyB9ID0gZGF0dW07CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgc3RlcCwgYmlucywgd2FsbF90aW1lOiBkYXR1bS53YWxsVGltZSB9OwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LnNldFNlcmllc0RhdGEodGhpcy5uYW1lLCBmb3JtYXR0ZWREYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snbW9kZSddKSB7CiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQubW9kZSA9IHRoaXMubW9kZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1sndGltZVByb3BlcnR5J10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZWxlbWVudC50aW1lUHJvcGVydHkgPSB0aGlzLnRpbWVQcm9wZXJ0eTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snY29sb3JTY2FsZSddICYmIHRoaXMuY29sb3JTY2FsZSkgewogICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNvbG9yU2NhbGUgPSB0aGlzLmNvbG9yU2NhbGU7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWRyYXcoKSB7CiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZWRyYXcoKTsKICAgICAgICB9CiAgICB9CiAgICBIaXN0b2dyYW1Db21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RiLWhpc3RvZ3JhbScsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6ICcnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlczogWwogICAgICAgICAgICAgICAgICAgICAgICBgCiAgICAgIDpob3N0IHsKICAgICAgICBkaXNwbGF5OiBmbGV4OwogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEhpc3RvZ3JhbUNvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIEhpc3RvZ3JhbUNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBtb2RlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0aW1lUHJvcGVydHk6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbG9yU2NhbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRhdGE6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEhpc3RvZ3JhbUNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEhpc3RvZ3JhbUNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIaXN0b2dyYW1Db21wb25lbnQpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEhpc3RvZ3JhbUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBIaXN0b2dyYW1Db21wb25lbnQsIHNlbGVjdG9yczogW1sidGItaGlzdG9ncmFtIl1dLCBpbnB1dHM6IHsgbW9kZTogIm1vZGUiLCB0aW1lUHJvcGVydHk6ICJ0aW1lUHJvcGVydHkiLCBjb2xvclNjYWxlOiAiY29sb3JTY2FsZSIsIG5hbWU6ICJuYW1lIiwgZGF0YTogImRhdGEiIH0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0sIGRlY2xzOiAwLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gSGlzdG9ncmFtQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgfSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBmbGV4O1xuICAgICAgfSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9oaXN0b2dyYW1fY2FyZF9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgdmFyIEkxOE5fMCQ0OwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBBIGJ1dHRvbiB0byBwaW4gYSBjYXJkLgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfNzI4NDYwNjQyNjIzNDM3NTM0NCQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9ISVNUT0dSQU1fQ0FSRF9DT01QT05FTlRfVFNfMSA9IGdvb2cuZ2V0TXNnKCJQaW4gY2FyZCIpOwogICAgICAgIEkxOE5fMCQ0ID0gTVNHX0VYVEVSTkFMXzcyODQ2MDY0MjYyMzQzNzUzNDQkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX0NBUkRfUkVOREVSRVJfSElTVE9HUkFNX0NBUkRfQ09NUE9ORU5UX1RTXzE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzAkNCA9ICRsb2NhbGl6ZSBgOkEgYnV0dG9uIHRvIHBpbiBhIGNhcmQu4pCfZTY2NWRjNzEyYmQ1ZjE4ZDRkZmEzYTI5ZTEyNWQ1NjVjYzUxZTJmNuKQnzcyODQ2MDY0MjYyMzQzNzUzNDQ6UGluIGNhcmRgOwogICAgfQogICAgY29uc3QgX2MyJGEgPSBbImFyaWEtbGFiZWwiLCBJMThOXzAkNF07CiAgICB2YXIgSTE4Tl8zJDI7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIEEgYnV0dG9uIG9uIGEgaGlzdG9ncmFtIGNhcmQgdGhhdCB0b2dnbGVzIGZ1bGwgc2l6ZSBtb2RlLgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfOTE1NzIxNTYzNjM4OTI2NTk3JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19DQVJEX1JFTkRFUkVSX0hJU1RPR1JBTV9DQVJEX0NPTVBPTkVOVF9UU180ID0gZ29vZy5nZXRNc2coIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIpOwogICAgICAgIEkxOE5fMyQyID0gTVNHX0VYVEVSTkFMXzkxNTcyMTU2MzYzODkyNjU5NyQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfQ0FSRF9SRU5ERVJFUl9ISVNUT0dSQU1fQ0FSRF9DT01QT05FTlRfVFNfNDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMyQyID0gJGxvY2FsaXplIGA6QSBidXR0b24gb24gYSBoaXN0b2dyYW0gY2FyZCB0aGF0IHRvZ2dsZXMgZnVsbCBzaXplIG1vZGUu4pCfZmM4Zjc2N2QwYjlmOTMwMTg3YTFiYWUzNDQ3N2FkMjg3MzZlY2UzM+KQnzkxNTcyMTU2MzYzODkyNjU5NzpUb2dnbGUgZnVsbCBzaXplIG1vZGVgOwogICAgfQogICAgY29uc3QgX2M1JDQgPSBbImFyaWEtbGFiZWwiLCBJMThOXzMkMl07CiAgICBmdW5jdGlvbiBIaXN0b2dyYW1DYXJkQ29tcG9uZW50X3NwYW5fMTJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAic3BhbiIsIDEyKTsKICAgICAgICDJtcm1ZWxlbWVudCgxLCAibWF0LXNwaW5uZXIiLCAxMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gSGlzdG9ncmFtQ2FyZENvbXBvbmVudF90Yl9oaXN0b2dyYW1fMTNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I1ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAidGItaGlzdG9ncmFtIiwgMTQpOwogICAgICAgIMm1ybVsaXN0ZW5lcigib25SZXNpemUiLCBmdW5jdGlvbiBIaXN0b2dyYW1DYXJkQ29tcG9uZW50X3RiX2hpc3RvZ3JhbV8xM19UZW1wbGF0ZV90Yl9oaXN0b2dyYW1fb25SZXNpemVfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yNSk7IGNvbnN0IGN0eF9yNCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I0LnJlZHJhdygpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuYW1lIiwgY3R4X3IxLnJ1bklkKSgiZGF0YSIsIGN0eF9yMS5kYXRhKSgibW9kZSIsIGN0eF9yMS5tb2RlKSgidGltZVByb3BlcnR5IiwgY3R4X3IxLnRpbWVQcm9wZXJ0eShjdHhfcjEueEF4aXNUeXBlKSkoImNvbG9yU2NhbGUiLCBjdHhfcjEucnVuQ29sb3JTY2FsZSkoInJlc2l6ZUV2ZW50RGVib3VuY2VQZXJpb2RJbk1zIiwgY3R4X3IxLlJFU0laRV9SRURSQVdfREVCT1VOQ0VfVElNRV9JTl9NUyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEhpc3RvZ3JhbUNhcmRDb21wb25lbnRfbmdfdGVtcGxhdGVfMTRfZGl2XzBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTYpOwogICAgICAgIMm1ybV0ZXh0KDEsICIgRGF0YSBmYWlsZWQgdG8gbG9hZC4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgZnVuY3Rpb24gSGlzdG9ncmFtQ2FyZENvbXBvbmVudF9uZ190ZW1wbGF0ZV8xNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1dGVtcGxhdGUoMCwgSGlzdG9ncmFtQ2FyZENvbXBvbmVudF9uZ190ZW1wbGF0ZV8xNF9kaXZfMF9UZW1wbGF0ZSwgMiwgMCwgImRpdiIsIDE1KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yMy5sb2FkU3RhdGUgPT09IGN0eF9yMy5EYXRhTG9hZFN0YXRlLkZBSUxFRCk7CiAgICB9IH0KICAgIGNvbnN0IF9jNiQyID0gZnVuY3Rpb24gKGEwKSB7IHJldHVybiB7IGJhY2tncm91bmRDb2xvcjogYTAgfTsgfTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IFJFU0laRV9SRURSQVdfREVCT1VOQ0VfVElNRV9JTl9NUyQxID0gNTA7CiAgICBjbGFzcyBIaXN0b2dyYW1DYXJkQ29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHJlZikgewogICAgICAgICAgICB0aGlzLnJlZiA9IHJlZjsKICAgICAgICAgICAgdGhpcy5SRVNJWkVfUkVEUkFXX0RFQk9VTkNFX1RJTUVfSU5fTVMgPSBSRVNJWkVfUkVEUkFXX0RFQk9VTkNFX1RJTUVfSU5fTVMkMTsKICAgICAgICAgICAgdGhpcy5EYXRhTG9hZFN0YXRlID0gRGF0YUxvYWRTdGF0ZTsKICAgICAgICAgICAgdGhpcy5vbkZ1bGxTaXplVG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uUGluQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB4QXhpc1R5cGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRpbWVQcm9wZXJ0eSh4QXhpc1R5cGUpIHsKICAgICAgICAgICAgc3dpdGNoICh4QXhpc1R5cGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgWEF4aXNUeXBlJDEuU1RFUDoKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGltZVByb3BlcnR5LlNURVA7CiAgICAgICAgICAgICAgICBjYXNlIFhBeGlzVHlwZSQxLldBTExfVElNRToKICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGltZVByb3BlcnR5LldBTExfVElNRTsKICAgICAgICAgICAgICAgIGNhc2UgWEF4aXNUeXBlJDEuUkVMQVRJVkU6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRpbWVQcm9wZXJ0eS5SRUxBVElWRTsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHhBeGlzVHlwZSBmb3IgaGlzdG9ncmFtIHRpbWUgcHJvcGVydHkuJyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWRyYXcoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmhpc3RvZ3JhbUNvbXBvbmVudCkgewogICAgICAgICAgICAgICAgLy8gT25seSByZWRyYXcgd2hlbiBpdCBpcyB2aXNpYmxlIChhbmQgdGh1cyBoYXZlIHdpZHRoIGFuZCBoZWlnaHQpLgogICAgICAgICAgICAgICAgaWYgKHRoaXMucmVmLm5hdGl2ZUVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5oaXN0b2dyYW1Db21wb25lbnQucmVkcmF3KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBIaXN0b2dyYW1DYXJkQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdoaXN0b2dyYW0tY2FyZC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnaGlzdG9ncmFtX2NhcmRfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWydoaXN0b2dyYW1fY2FyZF9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEhpc3RvZ3JhbUNhcmRDb21wb25lbnQuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0KICAgIF07CiAgICBIaXN0b2dyYW1DYXJkQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGxvYWRTdGF0ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdGl0bGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHRhZzogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcnVuSWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRhdGE6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG1vZGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHhBeGlzVHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcnVuQ29sb3JTY2FsZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2hvd0Z1bGxTaXplOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpc1Bpbm5lZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25GdWxsU2l6ZVRvZ2dsZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uUGluQ2xpY2tlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGhpc3RvZ3JhbUNvbXBvbmVudDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbSGlzdG9ncmFtQ29tcG9uZW50LF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGlzdG9ncmFtQ2FyZENvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEhpc3RvZ3JhbUNhcmRDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGlzdG9ncmFtQ2FyZENvbXBvbmVudCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGlzdG9ncmFtQ2FyZENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBIaXN0b2dyYW1DYXJkQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImhpc3RvZ3JhbS1jYXJkLWNvbXBvbmVudCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBIaXN0b2dyYW1DYXJkQ29tcG9uZW50X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KEhpc3RvZ3JhbUNvbXBvbmVudCwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5oaXN0b2dyYW1Db21wb25lbnQgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgbG9hZFN0YXRlOiAibG9hZFN0YXRlIiwgdGl0bGU6ICJ0aXRsZSIsIHRhZzogInRhZyIsIHJ1bklkOiAicnVuSWQiLCBkYXRhOiAiZGF0YSIsIG1vZGU6ICJtb2RlIiwgeEF4aXNUeXBlOiAieEF4aXNUeXBlIiwgcnVuQ29sb3JTY2FsZTogInJ1bkNvbG9yU2NhbGUiLCBzaG93RnVsbFNpemU6ICJzaG93RnVsbFNpemUiLCBpc1Bpbm5lZDogImlzUGlubmVkIiB9LCBvdXRwdXRzOiB7IG9uRnVsbFNpemVUb2dnbGU6ICJvbkZ1bGxTaXplVG9nZ2xlIiwgb25QaW5DbGlja2VkOiAib25QaW5DbGlja2VkIiB9LCBkZWNsczogMTYsIHZhcnM6IDEyLCBjb25zdHM6IFtbMSwgImhlYWRpbmciXSwgWzEsICJ0YWciLCAzLCAidGl0bGUiLCAidmFsdWUiXSwgWzEsICJydW4iXSwgWzEsICJkb3QiLCAzLCAibmdTdHlsZSJdLCBbMSwgInJ1bi10ZXh0IiwgMywgInJ1bklkIl0sIFsxLCAiY29udHJvbHMiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMSwgInBpbi1idXR0b24iLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbMywgInN2Z0ljb24iXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgInRpdGxlIiwgIlRvZ2dsZSBmdWxsIHNpemUgbW9kZSIsIDMsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFsiY2xhc3MiLCAic3Bpbm5lciIsIDQsICJuZ0lmIl0sIFsiZGV0ZWN0UmVzaXplIiwgIiIsIDMsICJuYW1lIiwgImRhdGEiLCAibW9kZSIsICJ0aW1lUHJvcGVydHkiLCAiY29sb3JTY2FsZSIsICJyZXNpemVFdmVudERlYm91bmNlUGVyaW9kSW5NcyIsICJvblJlc2l6ZSIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibm9EYXRhIiwgIiJdLCBbMSwgInNwaW5uZXIiXSwgWyJkaWFtZXRlciIsICIxOCJdLCBbImRldGVjdFJlc2l6ZSIsICIiLCAzLCAibmFtZSIsICJkYXRhIiwgIm1vZGUiLCAidGltZVByb3BlcnR5IiwgImNvbG9yU2NhbGUiLCAicmVzaXplRXZlbnREZWJvdW5jZVBlcmlvZEluTXMiLCAib25SZXNpemUiXSwgWyJjbGFzcyIsICJlbXB0eS1tZXNzYWdlIiwgNCwgIm5nSWYiXSwgWzEsICJlbXB0eS1tZXNzYWdlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gSGlzdG9ncmFtQ2FyZENvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDEsICJ0Yi10cnVuY2F0ZWQtcGF0aCIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMywgInNwYW4iLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNCwgImNhcmQtcnVuLW5hbWUiLCA0KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1LCAic3BhbiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDYsICJidXR0b24iLCA2KTsKICAgICAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDcsIF9jMiRhKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEhpc3RvZ3JhbUNhcmRDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzZfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25QaW5DbGlja2VkLmVtaXQoIWN0eC5pc1Bpbm5lZCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg4LCAibWF0LWljb24iLCA3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg5LCAiYnV0dG9uIiwgOCk7CiAgICAgICAgICAgIMm1ybVpMThuQXR0cmlidXRlcygxMCwgX2M1JDQpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gSGlzdG9ncmFtQ2FyZENvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfOV9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkZ1bGxTaXplVG9nZ2xlLmVtaXQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDExLCAibWF0LWljb24iLCA3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEyLCBIaXN0b2dyYW1DYXJkQ29tcG9uZW50X3NwYW5fMTJfVGVtcGxhdGUsIDIsIDAsICJzcGFuIiwgOSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxMywgSGlzdG9ncmFtQ2FyZENvbXBvbmVudF90Yl9oaXN0b2dyYW1fMTNfVGVtcGxhdGUsIDEsIDYsICJ0Yi1oaXN0b2dyYW0iLCAxMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxNCwgSGlzdG9ncmFtQ2FyZENvbXBvbmVudF9uZ190ZW1wbGF0ZV8xNF9UZW1wbGF0ZSwgMSwgMSwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgMTEsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMiA9IMm1ybVyZWZlcmVuY2UoMTUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoInRpdGxlIiwgY3R4LnRhZyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJ2YWx1ZSIsIGN0eC50aXRsZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3R5bGUiLCDJtcm1cHVyZUZ1bmN0aW9uMSgxMCwgX2M2JDIsIGN0eC5ydW5Db2xvclNjYWxlKGN0eC5ydW5JZCkpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgicnVuSWQiLCBjdHgucnVuSWQpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidGl0bGUiLCBjdHguaXNQaW5uZWQgPyAiVW5waW4gY2FyZCIgOiAiUGluIGNhcmQiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgic3ZnSWNvbiIsIGN0eC5pc1Bpbm5lZCA/ICJrZWVwXzI0cHgiIDogImtlZXBfb3V0bGluZV8yNHB4Iik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoInN2Z0ljb24iLCBjdHguc2hvd0Z1bGxTaXplID8gImZ1bGxzY3JlZW5fZXhpdF8yNHB4IiA6ICJmdWxsc2NyZWVuXzI0cHgiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5sb2FkU3RhdGUgPT09IGN0eC5EYXRhTG9hZFN0YXRlLkxPQURJTkcpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmRhdGEgJiYgY3R4LmRhdGEubGVuZ3RoKSgibmdJZkVsc2UiLCBfcjIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1RydW5jYXRlZFBhdGhDb21wb25lbnQsIE5nU3R5bGUsIFJ1bk5hbWVDb250YWluZXIsIE1hdEJ1dHRvbiwgTWF0SWNvbiwgTmdJZiwgTWF0U3Bpbm5lciwgSGlzdG9ncmFtQ29tcG9uZW50LCBSZXNpemVEZXRlY3RvckRpcmVjdGl2ZV0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7b3ZlcmZsb3c6YXV0bztwYWRkaW5nOjE2cHg7cGFkZGluZy10b3A6NHB4fS5oZWFkaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpncmlkO2dyaWQtdGVtcGxhdGUtYXJlYXM6XCJ0YWcgY29udHJvbHNcIiBcInJ1biBzcGlubmVyXCI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciBhdXRvO2ZvbnQtc2l6ZToxNHB4O21hcmdpbi1ib3R0b206NHB4fS50YWdbX25nY29udGVudC0lQ09NUCVde2dyaWQtYXJlYTp0YWc7b3ZlcmZsb3c6aGlkZGVufS5waW4tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MThweH0ucnVuW19uZ2NvbnRlbnQtJUNPTVAlXXtncmlkLWFyZWE6cnVuO2Rpc3BsYXk6ZmxleDt3aGl0ZS1zcGFjZTpub3dyYXA7Zm9udC1zaXplOjEzcHg7Y29sb3I6IzYxNjE2MX0ucnVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5kb3RbX25nY29udGVudC0lQ09NUCVde2ZsZXg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoxM3B4O2hlaWdodDoxM3B4O2JvcmRlci1yYWRpdXM6NTAlO21hcmdpbi1yaWdodDo0cHh9LnJ1bltfbmdjb250ZW50LSVDT01QJV0gICAucnVuLXRleHRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO21heC13aWR0aDoxMjBweH0uY29udHJvbHNbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7Z3JpZC1hcmVhOmNvbnRyb2xzO2p1c3RpZnktc2VsZjpmbGV4LWVuZDtmbGV4LXNocmluazowO21hcmdpbi1yaWdodDotMTJweDt3aGl0ZS1zcGFjZTpub3dyYXB9LnNwaW5uZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtncmlkLWFyZWE6c3Bpbm5lcjtoZWlnaHQ6MTAwJTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO3Bvc2l0aW9uOnJlbGF0aXZlfW1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MDtyaWdodDowO3Bvc2l0aW9uOmFic29sdXRlfXRiLWhpc3RvZ3JhbVtfbmdjb250ZW50LSVDT01QJV17ZmxleC1ncm93OjE7b3ZlcmZsb3c6aGlkZGVufS5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOjFlbTtmb250LXNpemU6MTNweH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9oaXN0b2dyYW1fY2FyZF9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSGlzdG9ncmFtQ2FyZENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5mdWxsV2lkdGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmZ1bGxIZWlnaHRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLnBpblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5tb2RlJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NIaXN0b2dyYW1Nb2RlKTsKICAgICAgICAgICAgdGhpcy54QXhpc1R5cGUkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc1hBeGlzVHlwZSk7CiAgICAgICAgICAgIHRoaXMuc2hvd0Z1bGxTaXplID0gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTWV0YWRhdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGlzSGlzdG9ncmFtQ2FyZE1ldGFkYXRhKGNhcmRNZXRhZGF0YSkgewogICAgICAgICAgICBjb25zdCB7IHBsdWdpbiB9ID0gY2FyZE1ldGFkYXRhOwogICAgICAgICAgICByZXR1cm4gcGx1Z2luID09PSBQbHVnaW5UeXBlLkhJU1RPR1JBTVM7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25GdWxsU2l6ZVRvZ2dsZSgpIHsKICAgICAgICAgICAgdGhpcy5zaG93RnVsbFNpemUgPSAhdGhpcy5zaG93RnVsbFNpemU7CiAgICAgICAgICAgIHRoaXMuZnVsbFdpZHRoQ2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKTsKICAgICAgICAgICAgdGhpcy5mdWxsSGVpZ2h0Q2hhbmdlZC5lbWl0KHRoaXMuc2hvd0Z1bGxTaXplKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQnVpbGQgb2JzZXJ2YWJsZXMgb25jZSBjYXJkSWQgaXMgZGVmaW5lZCAoYWZ0ZXIgb25Jbml0KS4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdENhcmRNZXRhZGF0YSQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRDYXJkTWV0YWRhdGEsIHRoaXMuY2FyZElkKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjYXJkTWV0YWRhdGEkID0gc2VsZWN0Q2FyZE1ldGFkYXRhJC5waXBlKGZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZE1ldGFkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZE1ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gISFjYXJkTWV0YWRhdGEgJiYgdGhpcy5pc0hpc3RvZ3JhbUNhcmRNZXRhZGF0YShjYXJkTWV0YWRhdGEpOwogICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZE1ldGFkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZE1ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKGNhcmRNZXRhZGF0YSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1ldGFkYXRhQW5kU2VyaWVzJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgY2FyZE1ldGFkYXRhJCwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldENhcmRUaW1lU2VyaWVzLCB0aGlzLmNhcmRJZCksCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aGlzLmRhdGEkID0gbWV0YWRhdGFBbmRTZXJpZXMkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbY2FyZE1ldGFkYXRhLCBydW5Ub1Nlcmllc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJ1bklkID0gY2FyZE1ldGFkYXRhLnJ1bklkOwogICAgICAgICAgICAgICAgaWYgKCFydW5Ub1NlcmllcyB8fCAhcnVuVG9TZXJpZXMuaGFzT3duUHJvcGVydHkocnVuSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3Qgc2VyaWVzID0gKC8qKiBAdHlwZSB7P30gKi8gKHJ1blRvU2VyaWVzW3J1bklkXSkpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gc2VyaWVzLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGRhdHVtCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoZGF0dW0pID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdhbGxUaW1lLCBzdGVwIH0gPSBkYXR1bTsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgYmlucyA9IGRhdHVtLmJpbnMubWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGJpbgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKGJpbikgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB4OiBiaW4ubWluLCBkeDogYmluLm1heCAtIGJpbi5taW4sIHk6IGJpbi5jb3VudCB9OwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB3YWxsVGltZSwgc3RlcCwgYmlucyB9OwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIGJ1aWxkTm9ybWFsaXplZEhpc3RvZ3JhbXMocmVzdWx0KTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5sb2FkU3RhdGUkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0Q2FyZExvYWRTdGF0ZSwgdGhpcy5jYXJkSWQpOwogICAgICAgICAgICB0aGlzLnRhZyQgPSBjYXJkTWV0YWRhdGEkLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTWV0YWRhdGEKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChjYXJkTWV0YWRhdGEpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjYXJkTWV0YWRhdGEudGFnOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnRpdGxlJCA9IHRoaXMudGFnJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdGFnCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodGFnKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VGFnRGlzcGxheU5hbWUodGFnLCB0aGlzLmdyb3VwTmFtZSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMucnVuSWQkID0gY2FyZE1ldGFkYXRhJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2FyZE1ldGFkYXRhCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZE1ldGFkYXRhKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZE1ldGFkYXRhLnJ1bklkOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmlzUGlubmVkJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldENhcmRQaW5uZWRTdGF0ZSwgdGhpcy5jYXJkSWQpOwogICAgICAgIH0KICAgIH0KICAgIEhpc3RvZ3JhbUNhcmRDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2hpc3RvZ3JhbS1jYXJkJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGhpc3RvZ3JhbS1jYXJkLWNvbXBvbmVudAogICAgICBbbG9hZFN0YXRlXT0ibG9hZFN0YXRlJCB8IGFzeW5jIgogICAgICBbdGl0bGVdPSJ0aXRsZSQgfCBhc3luYyIKICAgICAgW3RhZ109InRhZyQgfCBhc3luYyIKICAgICAgW3J1bklkXT0icnVuSWQkIHwgYXN5bmMiCiAgICAgIFtkYXRhXT0iZGF0YSQgfCBhc3luYyIKICAgICAgW21vZGVdPSJtb2RlJCB8IGFzeW5jIgogICAgICBbeEF4aXNUeXBlXT0ieEF4aXNUeXBlJCB8IGFzeW5jIgogICAgICBbcnVuQ29sb3JTY2FsZV09InJ1bkNvbG9yU2NhbGUiCiAgICAgIFtzaG93RnVsbFNpemVdPSJzaG93RnVsbFNpemUiCiAgICAgIFtpc1Bpbm5lZF09ImlzUGlubmVkJCB8IGFzeW5jIgogICAgICAob25GdWxsU2l6ZVRvZ2dsZSk9Im9uRnVsbFNpemVUb2dnbGUoKSIKICAgICAgKG9uUGluQ2xpY2tlZCk9InBpblN0YXRlQ2hhbmdlZC5lbWl0KCRldmVudCkiCiAgICA+PC9oaXN0b2dyYW0tY2FyZC1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBzdHlsZXM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgYAogICAgICA6aG9zdCB7CiAgICAgICAgZGlzcGxheTogYmxvY2s7CiAgICAgICAgaGVpZ2h0OiAxMDAlOwogICAgICB9CiAgICBgLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEhpc3RvZ3JhbUNhcmRDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgSGlzdG9ncmFtQ2FyZENvbnRhaW5lci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjYXJkSWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGdyb3VwTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcnVuQ29sb3JTY2FsZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZnVsbFdpZHRoQ2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGZ1bGxIZWlnaHRDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgcGluU3RhdGVDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGlzdG9ncmFtQ2FyZENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEhpc3RvZ3JhbUNhcmRDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGlzdG9ncmFtQ2FyZENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEhpc3RvZ3JhbUNhcmRDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogSGlzdG9ncmFtQ2FyZENvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJoaXN0b2dyYW0tY2FyZCJdXSwgaW5wdXRzOiB7IGNhcmRJZDogImNhcmRJZCIsIGdyb3VwTmFtZTogImdyb3VwTmFtZSIsIHJ1bkNvbG9yU2NhbGU6ICJydW5Db2xvclNjYWxlIiB9LCBvdXRwdXRzOiB7IGZ1bGxXaWR0aENoYW5nZWQ6ICJmdWxsV2lkdGhDaGFuZ2VkIiwgZnVsbEhlaWdodENoYW5nZWQ6ICJmdWxsSGVpZ2h0Q2hhbmdlZCIsIHBpblN0YXRlQ2hhbmdlZDogInBpblN0YXRlQ2hhbmdlZCIgfSwgZGVjbHM6IDksIHZhcnM6IDI2LCBjb25zdHM6IFtbMywgImxvYWRTdGF0ZSIsICJ0aXRsZSIsICJ0YWciLCAicnVuSWQiLCAiZGF0YSIsICJtb2RlIiwgInhBeGlzVHlwZSIsICJydW5Db2xvclNjYWxlIiwgInNob3dGdWxsU2l6ZSIsICJpc1Bpbm5lZCIsICJvbkZ1bGxTaXplVG9nZ2xlIiwgIm9uUGluQ2xpY2tlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEhpc3RvZ3JhbUNhcmRDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImhpc3RvZ3JhbS1jYXJkLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uRnVsbFNpemVUb2dnbGUiLCBmdW5jdGlvbiBIaXN0b2dyYW1DYXJkQ29udGFpbmVyX1RlbXBsYXRlX2hpc3RvZ3JhbV9jYXJkX2NvbXBvbmVudF9vbkZ1bGxTaXplVG9nZ2xlXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25GdWxsU2l6ZVRvZ2dsZSgpOyB9KSgib25QaW5DbGlja2VkIiwgZnVuY3Rpb24gSGlzdG9ncmFtQ2FyZENvbnRhaW5lcl9UZW1wbGF0ZV9oaXN0b2dyYW1fY2FyZF9jb21wb25lbnRfb25QaW5DbGlja2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgucGluU3RhdGVDaGFuZ2VkLmVtaXQoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDQsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDcsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg4LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJsb2FkU3RhdGUiLCDJtcm1cGlwZUJpbmQxKDEsIDEwLCBjdHgubG9hZFN0YXRlJCkpKCJ0aXRsZSIsIMm1ybVwaXBlQmluZDEoMiwgMTIsIGN0eC50aXRsZSQpKSgidGFnIiwgybXJtXBpcGVCaW5kMSgzLCAxNCwgY3R4LnRhZyQpKSgicnVuSWQiLCDJtcm1cGlwZUJpbmQxKDQsIDE2LCBjdHgucnVuSWQkKSkoImRhdGEiLCDJtcm1cGlwZUJpbmQxKDUsIDE4LCBjdHguZGF0YSQpKSgibW9kZSIsIMm1ybVwaXBlQmluZDEoNiwgMjAsIGN0eC5tb2RlJCkpKCJ4QXhpc1R5cGUiLCDJtcm1cGlwZUJpbmQxKDcsIDIyLCBjdHgueEF4aXNUeXBlJCkpKCJydW5Db2xvclNjYWxlIiwgY3R4LnJ1bkNvbG9yU2NhbGUpKCJzaG93RnVsbFNpemUiLCBjdHguc2hvd0Z1bGxTaXplKSgiaXNQaW5uZWQiLCDJtcm1cGlwZUJpbmQxKDgsIDI0LCBjdHguaXNQaW5uZWQkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbSGlzdG9ncmFtQ2FyZENvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgc3R5bGVzOiBbIltfbmdob3N0LSVDT01QJV0ge1xuICAgICAgICBkaXNwbGF5OiBibG9jaztcbiAgICAgICAgaGVpZ2h0OiAxMDAlO1xuICAgICAgfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9jYXJkX3JlbmRlcmVyL2NhcmRfdmlld19jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gQ2FyZFZpZXdDb21wb25lbnRfaW1hZ2VfY2FyZF8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImltYWdlLWNhcmQiLCA0KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImZ1bGxXaWR0aENoYW5nZWQiLCBmdW5jdGlvbiBDYXJkVmlld0NvbXBvbmVudF9pbWFnZV9jYXJkXzFfVGVtcGxhdGVfaW1hZ2VfY2FyZF9mdWxsV2lkdGhDaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjUpOyBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNC5vbkZ1bGxXaWR0aENoYW5nZWQoJGV2ZW50KTsgfSkoInBpblN0YXRlQ2hhbmdlZCIsIGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X2ltYWdlX2NhcmRfMV9UZW1wbGF0ZV9pbWFnZV9jYXJkX3BpblN0YXRlQ2hhbmdlZF8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I1KTsgY29uc3QgY3R4X3I2ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjYub25QaW5TdGF0ZUNoYW5nZWQoKTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2FyZElkIiwgY3R4X3IwLmNhcmRJZCkoImdyb3VwTmFtZSIsIGN0eF9yMC5ncm91cE5hbWUpKCJydW5Db2xvclNjYWxlIiwgY3R4X3IwLnJ1bkNvbG9yU2NhbGUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDYXJkVmlld0NvbXBvbmVudF9zY2FsYXJfY2FyZF8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yOCA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNjYWxhci1jYXJkIiwgNSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJmdWxsV2lkdGhDaGFuZ2VkIiwgZnVuY3Rpb24gQ2FyZFZpZXdDb21wb25lbnRfc2NhbGFyX2NhcmRfMl9UZW1wbGF0ZV9zY2FsYXJfY2FyZF9mdWxsV2lkdGhDaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjgpOyBjb25zdCBjdHhfcjcgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNy5vbkZ1bGxXaWR0aENoYW5nZWQoJGV2ZW50KTsgfSkoImZ1bGxIZWlnaHRDaGFuZ2VkIiwgZnVuY3Rpb24gQ2FyZFZpZXdDb21wb25lbnRfc2NhbGFyX2NhcmRfMl9UZW1wbGF0ZV9zY2FsYXJfY2FyZF9mdWxsSGVpZ2h0Q2hhbmdlZF8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I4KTsgY29uc3QgY3R4X3I5ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjkub25GdWxsSGVpZ2h0Q2hhbmdlZCgkZXZlbnQpOyB9KSgicGluU3RhdGVDaGFuZ2VkIiwgZnVuY3Rpb24gQ2FyZFZpZXdDb21wb25lbnRfc2NhbGFyX2NhcmRfMl9UZW1wbGF0ZV9zY2FsYXJfY2FyZF9waW5TdGF0ZUNoYW5nZWRfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yOCk7IGNvbnN0IGN0eF9yMTAgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTAub25QaW5TdGF0ZUNoYW5nZWQoKTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2FyZElkIiwgY3R4X3IxLmNhcmRJZCkoImdyb3VwTmFtZSIsIGN0eF9yMS5ncm91cE5hbWUpKCJydW5Db2xvclNjYWxlIiwgY3R4X3IxLnJ1bkNvbG9yU2NhbGUpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDYXJkVmlld0NvbXBvbmVudF9oaXN0b2dyYW1fY2FyZF8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJoaXN0b2dyYW0tY2FyZCIsIDUpOwogICAgICAgIMm1ybVsaXN0ZW5lcigiZnVsbFdpZHRoQ2hhbmdlZCIsIGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X2hpc3RvZ3JhbV9jYXJkXzNfVGVtcGxhdGVfaGlzdG9ncmFtX2NhcmRfZnVsbFdpZHRoQ2hhbmdlZF8wX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IxMik7IGNvbnN0IGN0eF9yMTEgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yMTEub25GdWxsV2lkdGhDaGFuZ2VkKCRldmVudCk7IH0pKCJmdWxsSGVpZ2h0Q2hhbmdlZCIsIGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X2hpc3RvZ3JhbV9jYXJkXzNfVGVtcGxhdGVfaGlzdG9ncmFtX2NhcmRfZnVsbEhlaWdodENoYW5nZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTIpOyBjb25zdCBjdHhfcjEzID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjEzLm9uRnVsbEhlaWdodENoYW5nZWQoJGV2ZW50KTsgfSkoInBpblN0YXRlQ2hhbmdlZCIsIGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X2hpc3RvZ3JhbV9jYXJkXzNfVGVtcGxhdGVfaGlzdG9ncmFtX2NhcmRfcGluU3RhdGVDaGFuZ2VkXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjEyKTsgY29uc3QgY3R4X3IxNCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IxNC5vblBpblN0YXRlQ2hhbmdlZCgpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IyID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJjYXJkSWQiLCBjdHhfcjIuY2FyZElkKSgiZ3JvdXBOYW1lIiwgY3R4X3IyLmdyb3VwTmFtZSkoInJ1bkNvbG9yU2NhbGUiLCBjdHhfcjIucnVuQ29sb3JTY2FsZSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X2Rpdl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiUGxhY2Vob2xkZXIgZXJyb3IgZm9yOiAiLCBjdHhfcjMuY2FyZElkLCAiIik7CiAgICB9IH0KICAgIGNsYXNzIENhcmRWaWV3Q29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5QbHVnaW5UeXBlID0gUGx1Z2luVHlwZTsKICAgICAgICAgICAgdGhpcy5mdWxsV2lkdGhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmZ1bGxIZWlnaHRDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLnBpblN0YXRlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzaG93RnVsbFdpZHRoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkZ1bGxXaWR0aENoYW5nZWQoc2hvd0Z1bGxXaWR0aCkgewogICAgICAgICAgICB0aGlzLmZ1bGxXaWR0aENoYW5nZWQuZW1pdChzaG93RnVsbFdpZHRoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzaG93RnVsbEhlaWdodAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25GdWxsSGVpZ2h0Q2hhbmdlZChzaG93RnVsbEhlaWdodCkgewogICAgICAgICAgICB0aGlzLmZ1bGxIZWlnaHRDaGFuZ2VkLmVtaXQoc2hvd0Z1bGxIZWlnaHQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uUGluU3RhdGVDaGFuZ2VkKCkgewogICAgICAgICAgICB0aGlzLnBpblN0YXRlQ2hhbmdlZC5lbWl0KCk7CiAgICAgICAgfQogICAgfQogICAgQ2FyZFZpZXdDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ2NhcmQtdmlldy1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnY2FyZF92aWV3X2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIENhcmRWaWV3Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNhcmRJZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZ3JvdXBOYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBwbHVnaW5UeXBlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBydW5Db2xvclNjYWxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBmdWxsV2lkdGhDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgZnVsbEhlaWdodENoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBwaW5TdGF0ZUNoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDYXJkVmlld0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENhcmRWaWV3Q29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIENhcmRWaWV3Q29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IENhcmRWaWV3Q29tcG9uZW50LCBzZWxlY3RvcnM6IFtbImNhcmQtdmlldy1jb21wb25lbnQiXV0sIGlucHV0czogeyBjYXJkSWQ6ICJjYXJkSWQiLCBncm91cE5hbWU6ICJncm91cE5hbWUiLCBwbHVnaW5UeXBlOiAicGx1Z2luVHlwZSIsIHJ1bkNvbG9yU2NhbGU6ICJydW5Db2xvclNjYWxlIiB9LCBvdXRwdXRzOiB7IGZ1bGxXaWR0aENoYW5nZWQ6ICJmdWxsV2lkdGhDaGFuZ2VkIiwgZnVsbEhlaWdodENoYW5nZWQ6ICJmdWxsSGVpZ2h0Q2hhbmdlZCIsIHBpblN0YXRlQ2hhbmdlZDogInBpblN0YXRlQ2hhbmdlZCIgfSwgZGVjbHM6IDUsIHZhcnM6IDQsIGNvbnN0czogW1szLCAibmdTd2l0Y2giXSwgWzMsICJjYXJkSWQiLCAiZ3JvdXBOYW1lIiwgInJ1bkNvbG9yU2NhbGUiLCAiZnVsbFdpZHRoQ2hhbmdlZCIsICJwaW5TdGF0ZUNoYW5nZWQiLCA0LCAibmdTd2l0Y2hDYXNlIl0sIFszLCAiY2FyZElkIiwgImdyb3VwTmFtZSIsICJydW5Db2xvclNjYWxlIiwgImZ1bGxXaWR0aENoYW5nZWQiLCAiZnVsbEhlaWdodENoYW5nZWQiLCAicGluU3RhdGVDaGFuZ2VkIiwgNCwgIm5nU3dpdGNoQ2FzZSJdLCBbNCwgIm5nU3dpdGNoRGVmYXVsdCJdLCBbMywgImNhcmRJZCIsICJncm91cE5hbWUiLCAicnVuQ29sb3JTY2FsZSIsICJmdWxsV2lkdGhDaGFuZ2VkIiwgInBpblN0YXRlQ2hhbmdlZCJdLCBbMywgImNhcmRJZCIsICJncm91cE5hbWUiLCAicnVuQ29sb3JTY2FsZSIsICJmdWxsV2lkdGhDaGFuZ2VkIiwgImZ1bGxIZWlnaHRDaGFuZ2VkIiwgInBpblN0YXRlQ2hhbmdlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIENhcmRWaWV3Q29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lclN0YXJ0KDAsIDApOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMSwgQ2FyZFZpZXdDb21wb25lbnRfaW1hZ2VfY2FyZF8xX1RlbXBsYXRlLCAxLCAzLCAiaW1hZ2UtY2FyZCIsIDEpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMiwgQ2FyZFZpZXdDb21wb25lbnRfc2NhbGFyX2NhcmRfMl9UZW1wbGF0ZSwgMSwgMywgInNjYWxhci1jYXJkIiwgMik7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBDYXJkVmlld0NvbXBvbmVudF9oaXN0b2dyYW1fY2FyZF8zX1RlbXBsYXRlLCAxLCAzLCAiaGlzdG9ncmFtLWNhcmQiLCAyKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIENhcmRWaWV3Q29tcG9uZW50X2Rpdl80X1RlbXBsYXRlLCAyLCAxLCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdTd2l0Y2giLCBjdHgucGx1Z2luVHlwZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGN0eC5QbHVnaW5UeXBlLklNQUdFUyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nU3dpdGNoQ2FzZSIsIGN0eC5QbHVnaW5UeXBlLlNDQUxBUlMpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ1N3aXRjaENhc2UiLCBjdHguUGx1Z2luVHlwZS5ISVNUT0dSQU1TKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ1N3aXRjaCwgTmdTd2l0Y2hDYXNlLCBOZ1N3aXRjaERlZmF1bHQsIEltYWdlQ2FyZENvbnRhaW5lciwgU2NhbGFyQ2FyZENvbnRhaW5lciwgSGlzdG9ncmFtQ2FyZENvbnRhaW5lcl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL2NhcmRfcmVuZGVyZXIvY2FyZF92aWV3X2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvLyBTaW5jZSB2ei1saW5lLWNoYXJ0IG9ubHkgdXBkYXRlcyBldmVyeSAzNTBtcywgaXQgZG9lcyBub3QgbWFrZSBzZW5zZSB0bwogICAgLy8gdXBkYXRlIHRoZSBQb2x5bWVyIGNvbXBvbmVudCBtb3JlIGZyZXF1ZW50bHkuCiAgICAvLyBbMV06CiAgICAvLyB0ZW5zb3Jib2FyZC9jb21wb25lbnRzL3Z6X2xpbmVfY2hhcnQyL3Z6LWxpbmUtY2hhcnQyLmpzP2w9MzQzLTM2MAogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgUlVOX0NPTE9SX1VQREFURV9USFJPVFRMRV9USU1FX0lOX01TID0gMzUwOwogICAgY2xhc3MgQ2FyZFZpZXdDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuc2hvd0Z1bGxXaWR0aCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLnNob3dGdWxsSGVpZ2h0ID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMucnVuQ29sb3JTY2FsZSQgPSB0aGlzLnN0b3JlCiAgICAgICAgICAgICAgICAuc2VsZWN0KGdldFJ1bkNvbG9yTWFwKQogICAgICAgICAgICAgICAgLnBpcGUodGhyb3R0bGVUaW1lKFJVTl9DT0xPUl9VUERBVEVfVEhST1RUTEVfVElNRV9JTl9NUywgdW5kZWZpbmVkLCB7CiAgICAgICAgICAgICAgICBsZWFkaW5nOiB0cnVlLAogICAgICAgICAgICAgICAgdHJhaWxpbmc6IHRydWUsCiAgICAgICAgICAgIH0pLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNvbG9yTWFwCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY29sb3JNYXApID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bklkCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuSWQpID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbG9yTWFwLmhhc093blByb3BlcnR5KHJ1bklkKSkgewogICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFtDb2xvciBzY2FsZV0gdW5rbm93biBydW5JZDogJHtydW5JZH0uYCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIHJldHVybiBjb2xvck1hcFtydW5JZF07CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzaG93RnVsbFdpZHRoCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkZ1bGxXaWR0aENoYW5nZWQoc2hvd0Z1bGxXaWR0aCkgewogICAgICAgICAgICB0aGlzLnNob3dGdWxsV2lkdGggPSBzaG93RnVsbFdpZHRoOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNob3dGdWxsSGVpZ2h0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkZ1bGxIZWlnaHRDaGFuZ2VkKHNob3dGdWxsSGVpZ2h0KSB7CiAgICAgICAgICAgIHRoaXMuc2hvd0Z1bGxIZWlnaHQgPSBzaG93RnVsbEhlaWdodDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblBpblN0YXRlQ2hhbmdlZCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZQogICAgICAgICAgICAgICAgLnNlbGVjdChnZXRDYXJkUGlubmVkU3RhdGUsIHRoaXMuY2FyZElkKQogICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0Q2FuQ3JlYXRlTmV3UGlucykpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3dhc1Bpbm5lZCwgY2FuQ3JlYXRlTmV3UGluc10pID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2goY2FyZFBpblN0YXRlVG9nZ2xlZCh7CiAgICAgICAgICAgICAgICAgICAgY2FyZElkOiB0aGlzLmNhcmRJZCwKICAgICAgICAgICAgICAgICAgICBjYW5DcmVhdGVOZXdQaW5zLAogICAgICAgICAgICAgICAgICAgIHdhc1Bpbm5lZCwKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgIH0KICAgIENhcmRWaWV3Q29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdjYXJkLXZpZXcnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8Y2FyZC12aWV3LWNvbXBvbmVudAogICAgICBbY2FyZElkXT0iY2FyZElkIgogICAgICBbZ3JvdXBOYW1lXT0iZ3JvdXBOYW1lIgogICAgICBbcGx1Z2luVHlwZV09InBsdWdpblR5cGUiCiAgICAgIFtydW5Db2xvclNjYWxlXT0icnVuQ29sb3JTY2FsZSQgfCBhc3luYyIKICAgICAgKGZ1bGxXaWR0aENoYW5nZWQpPSJvbkZ1bGxXaWR0aENoYW5nZWQoJGV2ZW50KSIKICAgICAgKGZ1bGxIZWlnaHRDaGFuZ2VkKT0ib25GdWxsSGVpZ2h0Q2hhbmdlZCgkZXZlbnQpIgogICAgICAocGluU3RhdGVDaGFuZ2VkKT0ib25QaW5TdGF0ZUNoYW5nZWQoKSIKICAgID4KICAgIDwvY2FyZC12aWV3LWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWydjYXJkX3ZpZXdfY29udGFpbmVyLmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBDYXJkVmlld0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBDYXJkVmlld0NvbnRhaW5lci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjYXJkSWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGdyb3VwTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcGx1Z2luVHlwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2hvd0Z1bGxXaWR0aDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3MuZnVsbC13aWR0aCcsXSB9XSwKICAgICAgICBzaG93RnVsbEhlaWdodDogW3sgdHlwZTogSG9zdEJpbmRpbmcsIGFyZ3M6IFsnY2xhc3MuZnVsbC1oZWlnaHQnLF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ2FyZFZpZXdDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBDYXJkVmlld0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDYXJkVmlld0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIENhcmRWaWV3Q29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IENhcmRWaWV3Q29udGFpbmVyLCBzZWxlY3RvcnM6IFtbImNhcmQtdmlldyJdXSwgaG9zdFZhcnM6IDQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gQ2FyZFZpZXdDb250YWluZXJfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJmdWxsLXdpZHRoIiwgY3R4LnNob3dGdWxsV2lkdGgpKCJmdWxsLWhlaWdodCIsIGN0eC5zaG93RnVsbEhlaWdodCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgY2FyZElkOiAiY2FyZElkIiwgZ3JvdXBOYW1lOiAiZ3JvdXBOYW1lIiwgcGx1Z2luVHlwZTogInBsdWdpblR5cGUiIH0sIGRlY2xzOiAyLCB2YXJzOiA2LCBjb25zdHM6IFtbMywgImNhcmRJZCIsICJncm91cE5hbWUiLCAicGx1Z2luVHlwZSIsICJydW5Db2xvclNjYWxlIiwgImZ1bGxXaWR0aENoYW5nZWQiLCAiZnVsbEhlaWdodENoYW5nZWQiLCAicGluU3RhdGVDaGFuZ2VkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQ2FyZFZpZXdDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImNhcmQtdmlldy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJmdWxsV2lkdGhDaGFuZ2VkIiwgZnVuY3Rpb24gQ2FyZFZpZXdDb250YWluZXJfVGVtcGxhdGVfY2FyZF92aWV3X2NvbXBvbmVudF9mdWxsV2lkdGhDaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25GdWxsV2lkdGhDaGFuZ2VkKCRldmVudCk7IH0pKCJmdWxsSGVpZ2h0Q2hhbmdlZCIsIGZ1bmN0aW9uIENhcmRWaWV3Q29udGFpbmVyX1RlbXBsYXRlX2NhcmRfdmlld19jb21wb25lbnRfZnVsbEhlaWdodENoYW5nZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkZ1bGxIZWlnaHRDaGFuZ2VkKCRldmVudCk7IH0pKCJwaW5TdGF0ZUNoYW5nZWQiLCBmdW5jdGlvbiBDYXJkVmlld0NvbnRhaW5lcl9UZW1wbGF0ZV9jYXJkX3ZpZXdfY29tcG9uZW50X3BpblN0YXRlQ2hhbmdlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uUGluU3RhdGVDaGFuZ2VkKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJjYXJkSWQiLCBjdHguY2FyZElkKSgiZ3JvdXBOYW1lIiwgY3R4Lmdyb3VwTmFtZSkoInBsdWdpblR5cGUiLCBjdHgucGx1Z2luVHlwZSkoInJ1bkNvbG9yU2NhbGUiLCDJtcm1cGlwZUJpbmQxKDEsIDQsIGN0eC5ydW5Db2xvclNjYWxlJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0NhcmRWaWV3Q29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvbWFpbl92aWV3L2NhcmRfZ3JpZF9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gQ2FyZEdyaWRDb21wb25lbnRfbmdfY29udGFpbmVyXzBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXIoMCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X2NhcmRfdmlld18yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJjYXJkLXZpZXciLCA0KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGl0ZW1fcjUgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2FyZElkIiwgaXRlbV9yNS5jYXJkSWQpKCJncm91cE5hbWUiLCBjdHhfcjEuZ3JvdXBOYW1lKSgicGx1Z2luVHlwZSIsIGl0ZW1fcjUucGx1Z2luKSgiY2FyZE9ic2VydmVyIiwgY3R4X3IxLmNhcmRPYnNlcnZlcikoImNhcmRMYXp5TG9hZGVyIiwgaXRlbV9yNS5jYXJkSWQpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDYXJkR3JpZENvbXBvbmVudF9uZ19jb250YWluZXJfM19UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lcigwKTsKICAgIH0gfQogICAgdmFyIEkxOE5fMCQ1OwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBBIGJ1dHRvbiB0aGF0IHNldHMgYSBncm91cCB0byB0aGUgcHJldmlvdXMgcGFnZS4KICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzM2Mjk5NjA1NDQ4NzUzNjAwNDYkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX01BSU5fVklFV19DQVJEX0dSSURfQ09NUE9ORU5UX1RTX19fXzEgPSBnb29nLmdldE1zZygiUHJldmlvdXMgcGFnZSIpOwogICAgICAgIEkxOE5fMCQ1ID0gTVNHX0VYVEVSTkFMXzM2Mjk5NjA1NDQ4NzUzNjAwNDYkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX01BSU5fVklFV19DQVJEX0dSSURfQ09NUE9ORU5UX1RTX19fXzE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzAkNSA9ICRsb2NhbGl6ZSBgOkEgYnV0dG9uIHRoYXQgc2V0cyBhIGdyb3VwIHRvIHRoZSBwcmV2aW91cyBwYWdlLuKQnzU3NWU3ODJmZDI3ZjJlZTcwYTAzNGE3NzVlZmU5YWQxNjI0NzIyNTDikJ8zNjI5OTYwNTQ0ODc1MzYwMDQ2OlByZXZpb3VzIHBhZ2VgOwogICAgfQogICAgY29uc3QgX2MyJGIgPSBbImFyaWEtbGFiZWwiLCBJMThOXzAkNV07CiAgICBmdW5jdGlvbiBDYXJkR3JpZENvbXBvbmVudF9uZ190ZW1wbGF0ZV80X2Rpdl8wX2J1dHRvbl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMTIgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCAxMyk7CiAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDEsIF9jMiRiKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQ2FyZEdyaWRDb21wb25lbnRfbmdfdGVtcGxhdGVfNF9kaXZfMF9idXR0b25fMl9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMTIpOyBjb25zdCBjdHhfcjExID0gybXJtW5leHRDb250ZXh0KDMpOyByZXR1cm4gY3R4X3IxMS5wYWdlSW5kZXhDaGFuZ2VkLmVtaXQoY3R4X3IxMS5wYWdlSW5kZXggLSAxKTsgfSk7CiAgICAgICAgybXJtXRleHQoMiwgIiBQcmV2aW91cyAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3I4ID0gybXJtW5leHRDb250ZXh0KDMpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiZGlzYWJsZWQiLCBjdHhfcjgucGFnZUluZGV4ID09PSAwKTsKICAgIH0gfQogICAgdmFyIEkxOE5fMyQzOwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBBIGJ1dHRvbiB0aGF0IGFsbG93cyB1c2VyIHRvIGV4cGFuZCBhIHRhZyBncm91cC4KICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzUzODYwNTQzMjUyNzQ3NzkyNTgkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX01BSU5fVklFV19DQVJEX0dSSURfQ09NUE9ORU5UX1RTX19fXzQgPSBnb29nLmdldE1zZygiRXhwYW5kIGdyb3VwIik7CiAgICAgICAgSTE4Tl8zJDMgPSBNU0dfRVhURVJOQUxfNTM4NjA1NDMyNTI3NDc3OTI1OCQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfTUFJTl9WSUVXX0NBUkRfR1JJRF9DT01QT05FTlRfVFNfX19fNDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMyQzID0gJGxvY2FsaXplIGA6QSBidXR0b24gdGhhdCBhbGxvd3MgdXNlciB0byBleHBhbmQgYSB0YWcgZ3JvdXAu4pCfZmZhYTExNDcxYjg3OGE2ZGZmZTJlNjhjNmYzNzA2NGE5ZTA3NDg1M+KQnzUzODYwNTQzMjUyNzQ3NzkyNTg6RXhwYW5kIGdyb3VwYDsKICAgIH0KICAgIGNvbnN0IF9jNSQ1ID0gWyJhcmlhLWxhYmVsIiwgSTE4Tl8zJDNdOwogICAgZnVuY3Rpb24gQ2FyZEdyaWRDb21wb25lbnRfbmdfdGVtcGxhdGVfNF9kaXZfMF9idXR0b25fNF9tYXRfaWNvbl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJtYXQtaWNvbiIsIDE3KTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ2FyZEdyaWRDb21wb25lbnRfbmdfdGVtcGxhdGVfNF9kaXZfMF9idXR0b25fNF9uZ190ZW1wbGF0ZV8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJtYXQtaWNvbiIsIDE4KTsKICAgIH0gfQogICAgZnVuY3Rpb24gQ2FyZEdyaWRDb21wb25lbnRfbmdfdGVtcGxhdGVfNF9kaXZfMF9idXR0b25fNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICBjb25zdCBfcjE3ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYnV0dG9uIiwgMTQpOwogICAgICAgIMm1ybVpMThuQXR0cmlidXRlcygxLCBfYzUkNSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfYnV0dG9uXzRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzBfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjE3KTsgY29uc3QgY3R4X3IxNiA9IMm1ybVuZXh0Q29udGV4dCgzKTsgcmV0dXJuIGN0eF9yMTYuZ3JvdXBFeHBhbnNpb25Ub2dnbGVkLmVtaXQoKTsgfSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDIsIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfYnV0dG9uXzRfbWF0X2ljb25fMl9UZW1wbGF0ZSwgMSwgMCwgIm1hdC1pY29uIiwgMTUpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBDYXJkR3JpZENvbXBvbmVudF9uZ190ZW1wbGF0ZV80X2Rpdl8wX2J1dHRvbl80X25nX3RlbXBsYXRlXzNfVGVtcGxhdGUsIDEsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDE2LCDJtcm1dGVtcGxhdGVSZWZFeHRyYWN0b3IpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBfcjE0ID0gybXJtXJlZmVyZW5jZSg0KTsKICAgICAgICBjb25zdCBjdHhfcjkgPSDJtcm1bmV4dENvbnRleHQoMyk7CiAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I5LmlzR3JvdXBFeHBhbmRlZCkoIm5nSWZFbHNlIiwgX3IxNCk7CiAgICB9IH0KICAgIHZhciBJMThOXzYkMTsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgQSBidXR0b24gdGhhdCBzZXRzIGEgZ3JvdXAgdG8gdGhlIG5leHQgcGFnZS4KICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzMzMzczMDE2OTQyMTAyODc1OTUkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX01BSU5fVklFV19DQVJEX0dSSURfQ09NUE9ORU5UX1RTX19fXzcgPSBnb29nLmdldE1zZygiTmV4dCBwYWdlIik7CiAgICAgICAgSTE4Tl82JDEgPSBNU0dfRVhURVJOQUxfMzMzNzMwMTY5NDIxMDI4NzU5NSQkVEVOU09SQk9BUkRfV0VCQVBQX01FVFJJQ1NfVklFV1NfTUFJTl9WSUVXX0NBUkRfR1JJRF9DT01QT05FTlRfVFNfX19fNzsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fNiQxID0gJGxvY2FsaXplIGA6QSBidXR0b24gdGhhdCBzZXRzIGEgZ3JvdXAgdG8gdGhlIG5leHQgcGFnZS7ikJ9jZTNjZWZiMWNkMDA5OWFhNTAwM2RkYTE2ZWM5ZWIyMWZkOGJhNzg54pCfMzMzNzMwMTY5NDIxMDI4NzU5NTpOZXh0IHBhZ2VgOwogICAgfQogICAgY29uc3QgX2M4JDIgPSBbImFyaWEtbGFiZWwiLCBJMThOXzYkMV07CiAgICBmdW5jdGlvbiBDYXJkR3JpZENvbXBvbmVudF9uZ190ZW1wbGF0ZV80X2Rpdl8wX3NwYW5fNl9zcGFuXzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3IyMCA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCAyMSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaW5wdXQiLCAyMik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfc3Bhbl82X3NwYW5fMV9UZW1wbGF0ZV9pbnB1dF9pbnB1dF8xX2xpc3RlbmVyKCRldmVudCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyMCk7IGNvbnN0IGN0eF9yMTkgPSDJtcm1bmV4dENvbnRleHQoNCk7IHJldHVybiBjdHhfcjE5Lm9uUGFnaW5hdGlvbklucHV0Q2hhbmdlKCRldmVudCk7IH0pKCJjaGFuZ2UiLCBmdW5jdGlvbiBDYXJkR3JpZENvbXBvbmVudF9uZ190ZW1wbGF0ZV80X2Rpdl8wX3NwYW5fNl9zcGFuXzFfVGVtcGxhdGVfaW5wdXRfY2hhbmdlXzFfbGlzdGVuZXIoJGV2ZW50KSB7IMm1ybVyZXN0b3JlVmlldyhfcjIwKTsgY29uc3QgY3R4X3IyMSA9IMm1ybVuZXh0Q29udGV4dCg0KTsgcmV0dXJuIGN0eF9yMjEub25QYWdpbmF0aW9uSW5wdXRDaGFuZ2UoJGV2ZW50KTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGV4dCgyKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IxOCA9IMm1ybVuZXh0Q29udGV4dCg0KTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY3R4X3IxOC5wYWdlSW5kZXggKyAxKSgibWF4IiwgY3R4X3IxOC5udW1QYWdlcyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiBvZiAiLCBjdHhfcjE4Lm51bVBhZ2VzLCAiIik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfc3Bhbl82X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMjMgPSDJtcm1Z2V0Q3VycmVudFZpZXcoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzcGFuIik7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfc3Bhbl82X3NwYW5fMV9UZW1wbGF0ZSwgMywgMywgInNwYW4iLCAxOSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiYnV0dG9uIiwgMjApOwogICAgICAgIMm1ybVpMThuQXR0cmlidXRlcygzLCBfYzgkMik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfc3Bhbl82X1RlbXBsYXRlX2J1dHRvbl9jbGlja18yX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3IyMyk7IGNvbnN0IGN0eF9yMjIgPSDJtcm1bmV4dENvbnRleHQoMyk7IHJldHVybiBjdHhfcjIyLnBhZ2VJbmRleENoYW5nZWQuZW1pdChjdHhfcjIyLnBhZ2VJbmRleCArIDEpOyB9KTsKICAgICAgICDJtcm1dGV4dCg0LCAiIE5leHQgIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgaXNCb3R0b21Db250cm9sX3I2ID0gybXJtW5leHRDb250ZXh0KDIpLmlzQm90dG9tQ29udHJvbDsKICAgICAgICBjb25zdCBjdHhfcjEwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3IxMC5zaG93UGFnaW5hdGlvbklucHV0KGlzQm90dG9tQ29udHJvbF9yNikpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiZGlzYWJsZWQiLCBjdHhfcjEwLnBhZ2VJbmRleCArIDEgPj0gY3R4X3IxMC5udW1QYWdlcyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNik7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAic3BhbiIsIDcpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBDYXJkR3JpZENvbXBvbmVudF9uZ190ZW1wbGF0ZV80X2Rpdl8wX2J1dHRvbl8yX1RlbXBsYXRlLCAzLCAxLCAiYnV0dG9uIiwgOCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgOSk7CiAgICAgICAgybXJtXRlbXBsYXRlKDQsIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfYnV0dG9uXzRfVGVtcGxhdGUsIDUsIDIsICJidXR0b24iLCAxMCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDUsICJzcGFuIiwgMTEpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg2LCBDYXJkR3JpZENvbXBvbmVudF9uZ190ZW1wbGF0ZV80X2Rpdl8wX3NwYW5fNl9UZW1wbGF0ZSwgNSwgMiwgInNwYW4iLCAxMik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgaXNCb3R0b21Db250cm9sX3I2ID0gybXJtW5leHRDb250ZXh0KCkuaXNCb3R0b21Db250cm9sOwogICAgICAgIGNvbnN0IGN0eF9yNyA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eF9yNy5zaG93UGFnaW5hdGlvbkNvbnRyb2xzKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjcuc2hvd0V4cGFuZChpc0JvdHRvbUNvbnRyb2xfcjYpKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHhfcjcuc2hvd1BhZ2luYXRpb25Db250cm9scyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtXRlbXBsYXRlKDAsIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfZGl2XzBfVGVtcGxhdGUsIDcsIDMsICJkaXYiLCA1KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGlzQm90dG9tQ29udHJvbF9yNiA9IGN0eC5pc0JvdHRvbUNvbnRyb2w7CiAgICAgICAgY29uc3QgY3R4X3I0ID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4X3I0LnNob3dQYWdpbmF0aW9uQ29udHJvbHMgfHwgY3R4X3I0LnNob3dFeHBhbmQoaXNCb3R0b21Db250cm9sX3I2KSk7CiAgICB9IH0KICAgIGNvbnN0IF9jOSQxID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBpc0JvdHRvbUNvbnRyb2w6IGZhbHNlIH07IH07CiAgICBjb25zdCBfYzEwID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBpc0JvdHRvbUNvbnRyb2w6IHRydWUgfTsgfTsKICAgIGNsYXNzIENhcmRHcmlkQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5QbHVnaW5UeXBlID0gUGx1Z2luVHlwZTsKICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXhDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmdyb3VwRXhwYW5zaW9uVG9nZ2xlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0JvdHRvbUNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNob3dFeHBhbmQoaXNCb3R0b21Db250cm9sKSB7CiAgICAgICAgICAgIHJldHVybiBpc0JvdHRvbUNvbnRyb2wgPyB0aGlzLmlzR3JvdXBFeHBhbmRhYmxlIDogZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXNCb3R0b21Db250cm9sCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzaG93UGFnaW5hdGlvbklucHV0KGlzQm90dG9tQ29udHJvbCkgewogICAgICAgICAgICByZXR1cm4gaXNCb3R0b21Db250cm9sOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGluZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkSWRXaXRoTWV0YWRhdGEKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRyYWNrQnlDYXJkcyhpbmRleCwgY2FyZElkV2l0aE1ldGFkYXRhKSB7CiAgICAgICAgICAgIHJldHVybiBjYXJkSWRXaXRoTWV0YWRhdGEuY2FyZElkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblBhZ2luYXRpb25JbnB1dENoYW5nZShldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGlucHV0ID0gKC8qKiBAdHlwZSB7P30gKi8gKGV2ZW50LnRhcmdldCkpOwogICAgICAgICAgICBpZiAoZXZlbnQudHlwZSA9PT0gJ2lucHV0JyAmJiBpbnB1dC52YWx1ZSA9PT0gJycpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRWYWx1ZSA9IE51bWJlcihpbnB1dC52YWx1ZSkgLSAxOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIGN1cnJlbnRWYWx1ZSksIHRoaXMubnVtUGFnZXMgLSAxKTsKICAgICAgICAgICAgLy8gUmVjdGlmeWluZyBsb2dpYyBpcyBhdCB0aGUgY29udGFpbmVyIGJ1dCB0aGUgcmVjdGlmaWVkIHZhbHVlIGRvZXMgbm90CiAgICAgICAgICAgIC8vIGFwcHJvcHJpYXRlbHkgbWFrZSBjaGFuZ2VzIHRvIHRoZSBgPGlucHV0PmAuCiAgICAgICAgICAgIC8vIFNwZWN1bGF0aW9uOiBBbmd1bGFyIHNlZW1zIHRvIGhhdmUgc29tZSBjaGVjayBvbiB0aGUgdGVtcGxhdGUgbGV2ZWwgdGhhdAogICAgICAgICAgICAvLyBkb2VzIHNoYWxsb3cgZXF1YWxzIGFuZCBwcmV2ZW50IGNoYW5naW5nIG9uIHRoZSBzYW1lIHZhbHVlLgogICAgICAgICAgICAvLyBFdmlkZW5jZTogcGFnZUluZGV4IGNoYW5nZSBkb2VzIGZpcmUsIGJ1dCBgbmdPbkNoYW5nZXNgIGRvZXMgbm90IGdldAogICAgICAgICAgICAvLyB0cmlnZ2VyZWQgd2hlbiB0aGUgdmFsdWUgaXMgdGhlIHNhbWUgKHJlY3RpZmllZCB2YWx1ZSkuCiAgICAgICAgICAgIGlmIChpbnB1dC52YWx1ZSAhPT0gU3RyaW5nKG5leHRWYWx1ZSArIDEpKSB7CiAgICAgICAgICAgICAgICBpbnB1dC52YWx1ZSA9IFN0cmluZyhuZXh0VmFsdWUgKyAxKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnBhZ2VJbmRleENoYW5nZWQuZW1pdChuZXh0VmFsdWUpOwogICAgICAgIH0KICAgIH0KICAgIENhcmRHcmlkQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLWNhcmQtZ3JpZC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9jYXJkX2dyaWRfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2NhcmRfZ3JpZF9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBDYXJkR3JpZENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBpc0dyb3VwRXhwYW5kYWJsZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaXNHcm91cEV4cGFuZGVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBncm91cE5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBhZ2VJbmRleDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbnVtUGFnZXM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNhcmRJZHNXaXRoTWV0YWRhdGE6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNhcmRPYnNlcnZlcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2hvd1BhZ2luYXRpb25Db250cm9sczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcGFnZUluZGV4Q2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGdyb3VwRXhwYW5zaW9uVG9nZ2xlZDogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIENhcmRHcmlkQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gQ2FyZEdyaWRDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQ2FyZEdyaWRDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ2FyZEdyaWRDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2FyZEdyaWRDb21wb25lbnQsIHNlbGVjdG9yczogW1sibWV0cmljcy1jYXJkLWdyaWQtY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgaXNHcm91cEV4cGFuZGFibGU6ICJpc0dyb3VwRXhwYW5kYWJsZSIsIGlzR3JvdXBFeHBhbmRlZDogImlzR3JvdXBFeHBhbmRlZCIsIGdyb3VwTmFtZTogImdyb3VwTmFtZSIsIHBhZ2VJbmRleDogInBhZ2VJbmRleCIsIG51bVBhZ2VzOiAibnVtUGFnZXMiLCBjYXJkSWRzV2l0aE1ldGFkYXRhOiAiY2FyZElkc1dpdGhNZXRhZGF0YSIsIGNhcmRPYnNlcnZlcjogImNhcmRPYnNlcnZlciIsIHNob3dQYWdpbmF0aW9uQ29udHJvbHM6ICJzaG93UGFnaW5hdGlvbkNvbnRyb2xzIiB9LCBvdXRwdXRzOiB7IHBhZ2VJbmRleENoYW5nZWQ6ICJwYWdlSW5kZXhDaGFuZ2VkIiwgZ3JvdXBFeHBhbnNpb25Ub2dnbGVkOiAiZ3JvdXBFeHBhbnNpb25Ub2dnbGVkIiB9LCBkZWNsczogNiwgdmFyczogOCwgY29uc3RzOiBbWzQsICJuZ1RlbXBsYXRlT3V0bGV0IiwgIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0Il0sIFsxLCAiY2FyZC1ncmlkIl0sIFszLCAiY2FyZElkIiwgImdyb3VwTmFtZSIsICJwbHVnaW5UeXBlIiwgImNhcmRPYnNlcnZlciIsICJjYXJkTGF6eUxvYWRlciIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIiwgIm5nRm9yVHJhY2tCeSJdLCBbImdyb3VwQ29udHJvbHMiLCAiIl0sIFszLCAiY2FyZElkIiwgImdyb3VwTmFtZSIsICJwbHVnaW5UeXBlIiwgImNhcmRPYnNlcnZlciIsICJjYXJkTGF6eUxvYWRlciJdLCBbImNsYXNzIiwgImdyb3VwLWNvbnRyb2xzIiwgNCwgIm5nSWYiXSwgWzEsICJncm91cC1jb250cm9scyJdLCBbMSwgInByZXYtY29udGFpbmVyIl0sIFsiY2xhc3MiLCAicHJldiBwYWdpbmF0aW9uLWJ1dHRvbiIsICJtYXQtYnV0dG9uIiwgIiIsIDMsICJkaXNhYmxlZCIsICJjbGljayIsIDQsICJuZ0lmIiwgNiwgImFyaWEtbGFiZWwiXSwgWzEsICJleHBhbmQtY29udGFpbmVyIl0sIFsiY2xhc3MiLCAiZXhwYW5kLWdyb3VwLWJ1dHRvbiIsICJtYXQtaWNvbi1idXR0b24iLCAiIiwgMywgImNsaWNrIiwgNCwgIm5nSWYiLCA2LCAiYXJpYS1sYWJlbCJdLCBbMSwgImlucHV0LWFuZC1uZXh0LWNvbnRhaW5lciJdLCBbNCwgIm5nSWYiXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDEsICJwcmV2IiwgInBhZ2luYXRpb24tYnV0dG9uIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMSwgImV4cGFuZC1ncm91cC1idXR0b24iLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbInN2Z0ljb24iLCAiZXhwYW5kX2xlc3NfMjRweCIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsiZXhwYW5kTW9yZSIsICIiXSwgWyJzdmdJY29uIiwgImV4cGFuZF9sZXNzXzI0cHgiXSwgWyJzdmdJY29uIiwgImV4cGFuZF9tb3JlXzI0cHgiXSwgWyJjbGFzcyIsICJwYWdpbmF0aW9uLWlucHV0IiwgNCwgIm5nSWYiXSwgWyJtYXQtYnV0dG9uIiwgIiIsIDEsICJuZXh0IiwgInBhZ2luYXRpb24tYnV0dG9uIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWzEsICJwYWdpbmF0aW9uLWlucHV0Il0sIFsidHlwZSIsICJudW1iZXIiLCAibWluIiwgIjEiLCAzLCAidmFsdWUiLCAibWF4IiwgImlucHV0IiwgImNoYW5nZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIENhcmRHcmlkQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMCwgQ2FyZEdyaWRDb21wb25lbnRfbmdfY29udGFpbmVyXzBfVGVtcGxhdGUsIDEsIDAsICJuZy1jb250YWluZXIiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBDYXJkR3JpZENvbXBvbmVudF9jYXJkX3ZpZXdfMl9UZW1wbGF0ZSwgMSwgNSwgImNhcmQtdmlldyIsIDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMywgQ2FyZEdyaWRDb21wb25lbnRfbmdfY29udGFpbmVyXzNfVGVtcGxhdGUsIDEsIDAsICJuZy1jb250YWluZXIiLCAwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIENhcmRHcmlkQ29tcG9uZW50X25nX3RlbXBsYXRlXzRfVGVtcGxhdGUsIDEsIDEsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDMsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMyA9IMm1ybVyZWZlcmVuY2UoNSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdUZW1wbGF0ZU91dGxldCIsIF9yMykoIm5nVGVtcGxhdGVPdXRsZXRDb250ZXh0IiwgybXJtXB1cmVGdW5jdGlvbjAoNiwgX2M5JDEpKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5jYXJkSWRzV2l0aE1ldGFkYXRhKSgibmdGb3JUcmFja0J5IiwgY3R4LnRyYWNrQnlDYXJkcyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nVGVtcGxhdGVPdXRsZXQiLCBfcjMpKCJuZ1RlbXBsYXRlT3V0bGV0Q29udGV4dCIsIMm1ybVwdXJlRnVuY3Rpb24wKDcsIF9jMTApKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ1RlbXBsYXRlT3V0bGV0LCBOZ0Zvck9mLCBDYXJkVmlld0NvbnRhaW5lciwgQ2FyZExhenlMb2FkZXIsIE5nSWYsIE1hdEJ1dHRvbiwgTWF0SWNvbl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5jYXJkLWdyaWRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6Z3JpZDtncmlkLXRlbXBsYXRlLWNvbHVtbnM6cmVwZWF0KGF1dG8tZmlsbCwgbWlubWF4KDMzNXB4LCBhdXRvKSk7Z2FwOjE2cHg7cGFkZGluZzoxNnB4fWNhcmQtdmlld1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjZGRkO2JvcmRlci1yYWRpdXM6NHB4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtjb250YWluOnN0cmljdDtoZWlnaHQ6MTAwJTttaW4taGVpZ2h0OjMyMHB4fWNhcmQtdmlldy5mdWxsLXdpZHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtjb250YWluOmxheW91dCBwYWludDtncmlkLWNvbHVtbi1zdGFydDoxO2dyaWQtY29sdW1uLWVuZDotMX1jYXJkLXZpZXcuZnVsbC1oZWlnaHRbX25nY29udGVudC0lQ09NUCVde21pbi1oZWlnaHQ6NDgwcHh9Lmdyb3VwLWNvbnRyb2xzW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO2Rpc3BsYXk6Z3JpZDthbGlnbi1pdGVtczpjZW50ZXI7Z3JpZC10ZW1wbGF0ZS1jb2x1bW5zOjFmciAxZnIgMWZyO2dhcDoxNnB4O3BhZGRpbmc6MCAxNnB4fS5ncm91cC1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV06Zmlyc3Qtb2YtdHlwZXtwYWRkaW5nLXRvcDoxNnB4fS5ncm91cC1jb250cm9sc1tfbmdjb250ZW50LSVDT01QJV06bGFzdC1vZi10eXBle3BhZGRpbmctYm90dG9tOjE2cHh9LnByZXYtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LXNlbGY6ZmxleC1zdGFydH0uZXhwYW5kLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17anVzdGlmeS1zZWxmOmNlbnRlcn0uaW5wdXQtYW5kLW5leHQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtqdXN0aWZ5LXNlbGY6ZmxleC1lbmR9LnBhZ2luYXRpb24taW5wdXRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDoxNnB4fS5leHBhbmQtZ3JvdXAtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnBhZ2luYXRpb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzYxNjE2MX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvbWFpbl92aWV3L2NhcmRfZ3JpZF9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gVGFnIGdyb3VwIGNhbiBiZSBjb2xsYXBzZWQuIEV2ZW4gd2hlbiBpdCBpcyBjb2xsYXBzZWQsIHdlIHNob3cgdGhyZWUgY2FyZHMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBJVEVNU19DT0xMQVBTRURfQ0xJUF9TSVpFID0gMzsKICAgIGNsYXNzIENhcmRHcmlkQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICAvLyBncm91cE5hbWUgbXVzdCBiZSBub24tbnVsbCBpZiB0aGUgZ3JvdXAgc2hvdWxkIGJlIGNvbGxhcHNlL2V4cGFuZC1hYmxlLgogICAgICAgICAgICB0aGlzLmdyb3VwTmFtZSA9IG51bGw7CiAgICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lJCA9IG5ldyBCZWhhdmlvclN1YmplY3QobnVsbCk7CiAgICAgICAgICAgIHRoaXMucGFnZUluZGV4JCA9IG5ldyBCZWhhdmlvclN1YmplY3QoMCk7CiAgICAgICAgICAgIHRoaXMuaXRlbXMkID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7CiAgICAgICAgICAgIHRoaXMubnVtUGFnZXMkID0gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICB0aGlzLml0ZW1zJCwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldFBhZ2VTaXplKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtpdGVtcywgcGFnZVNpemVdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gTWF0aC5jZWlsKGl0ZW1zLmxlbmd0aCAvIHBhZ2VTaXplKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5pc0dyb3VwRXhwYW5kZWQkID0gdGhpcy5ncm91cE5hbWUkLnBpcGUoc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBncm91cE5hbWUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChncm91cE5hbWUpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBncm91cE5hbWUgIT09IG51bGwKICAgICAgICAgICAgICAgICAgICA/IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NUYWdHcm91cEV4cGFuc2lvblN0YXRlLCBncm91cE5hbWUpCiAgICAgICAgICAgICAgICAgICAgOiBvZih0cnVlKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5zaG93UGFnaW5hdGlvbkNvbnRyb2xzJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5udW1QYWdlcyQsCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRQYWdlU2l6ZSksCiAgICAgICAgICAgICAgICB0aGlzLmlzR3JvdXBFeHBhbmRlZCQsCiAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbbnVtUGFnZXMsIHBhZ2VTaXplLCBpc0dyb3VwRXhwYW5kZWRdKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAobnVtUGFnZXMgPD0gMSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwYWdlU2l6ZSA8PSBJVEVNU19DT0xMQVBTRURfQ0xJUF9TSVpFIHx8IGlzR3JvdXBFeHBhbmRlZDsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5pc0dyb3VwRXhwYW5kYWJsZSQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMkLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UGFnZVNpemUpLAogICAgICAgICAgICBdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2l0ZW1zLCBwYWdlU2l6ZV0pID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmdyb3VwTmFtZSA9PT0gbnVsbCB8fAogICAgICAgICAgICAgICAgICAgIHBhZ2VTaXplIDw9IElURU1TX0NPTExBUFNFRF9DTElQX1NJWkUgfHwKICAgICAgICAgICAgICAgICAgICBpdGVtcy5sZW5ndGggPD0gSVRFTVNfQ09MTEFQU0VEX0NMSVBfU0laRSkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRQYWdlSW5kZXgkID0gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICB0aGlzLnBhZ2VJbmRleCQsCiAgICAgICAgICAgICAgICB0aGlzLm51bVBhZ2VzJCwKICAgICAgICAgICAgXSkucGlwZSh0YXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtwYWdlSW5kZXgsIG51bVBhZ2VzXSkgPT4gewogICAgICAgICAgICAgICAgLy8gQ3ljbGUgaW4gdGhlIE9ic2VydmFibGUgYnV0IG9ubHkgbG9vcHMgd2hlbiBwYWdlSW5kZXggaXMgbm90CiAgICAgICAgICAgICAgICAvLyB2YWxpZCBhbmQgZG9lcyBub3QgcmVwZWF0IG1vcmUgdGhhbiBvbmNlLgogICAgICAgICAgICAgICAgaWYgKG51bVBhZ2VzID09PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHBhZ2VJbmRleCA+PSBudW1QYWdlcykgewogICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZUluZGV4JC5uZXh0KG51bVBhZ2VzIC0gMSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWdlSW5kZXggPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXgkLm5leHQoMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbcGFnZUluZGV4LCBudW1QYWdlc10pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heChwYWdlSW5kZXgsIDApLCBudW1QYWdlcyAtIDEpOwogICAgICAgICAgICB9KSksIHNoYXJlUmVwbGF5KDEpKTsKICAgICAgICAgICAgdGhpcy5wYWdlZEl0ZW1zJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5pdGVtcyQsCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRQYWdlU2l6ZSksCiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZWRQYWdlSW5kZXgkLAogICAgICAgICAgICAgICAgdGhpcy5pc0dyb3VwRXhwYW5kZWQkLAogICAgICAgICAgICBdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2l0ZW1zLCBwYWdlU2l6ZSwgcGFnZUluZGV4LCBleHBhbmRlZF0pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHN0YXJ0SW5kZXggPSBwYWdlU2l6ZSAqIHBhZ2VJbmRleDsKICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgcmVuZGVyIDMgY2FyZHMgd2hlbiBjb2xsYXBzZWQuCiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbmRJbmRleCA9IHBhZ2VTaXplICogcGFnZUluZGV4ICsKICAgICAgICAgICAgICAgICAgICBNYXRoLm1pbihleHBhbmRlZCA/IHBhZ2VTaXplIDogSVRFTVNfQ09MTEFQU0VEX0NMSVBfU0laRSwgcGFnZVNpemUpOwogICAgICAgICAgICAgICAgcmV0dXJuIGl0ZW1zLnNsaWNlKHN0YXJ0SW5kZXgsIGVuZEluZGV4KTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmIChjaGFuZ2VzWydjYXJkSWRzV2l0aE1ldGFkYXRhJ10pIHsKICAgICAgICAgICAgICAgIHRoaXMuaXRlbXMkLm5leHQodGhpcy5jYXJkSWRzV2l0aE1ldGFkYXRhKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoY2hhbmdlc1snZ3JvdXBOYW1lJ10pIHsKICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBOYW1lJC5uZXh0KHRoaXMuZ3JvdXBOYW1lKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5ld0luZGV4CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblBhZ2VJbmRleENoYW5nZWQobmV3SW5kZXgpIHsKICAgICAgICAgICAgdGhpcy5wYWdlSW5kZXgkLm5leHQobmV3SW5kZXgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uR3JvdXBFeHBhbnNpb25Ub2dnbGVkKCkgewogICAgICAgICAgICBpZiAodGhpcy5ncm91cE5hbWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbnZhcmlhbnQgZXJyb3I6IGV4cGFuc2lvbiBjYW5ub3QgYmUgdG9nZ2xlZCB3aGVuIGdyb3VwTmFtZSBpcyBudWxsJyk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXRyaWNzVGFnR3JvdXBFeHBhbnNpb25DaGFuZ2VkKHsgdGFnR3JvdXA6IHRoaXMuZ3JvdXBOYW1lIH0pKTsKICAgICAgICB9CiAgICB9CiAgICBDYXJkR3JpZENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy1jYXJkLWdyaWQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWV0cmljcy1jYXJkLWdyaWQtY29tcG9uZW50CiAgICAgIFtpc0dyb3VwRXhwYW5kYWJsZV09ImlzR3JvdXBFeHBhbmRhYmxlJCB8IGFzeW5jIgogICAgICBbaXNHcm91cEV4cGFuZGVkXT0iaXNHcm91cEV4cGFuZGVkJCB8IGFzeW5jIgogICAgICBbZ3JvdXBOYW1lXT0iZ3JvdXBOYW1lIgogICAgICBbcGFnZUluZGV4XT0ibm9ybWFsaXplZFBhZ2VJbmRleCQgfCBhc3luYyIKICAgICAgW251bVBhZ2VzXT0ibnVtUGFnZXMkIHwgYXN5bmMiCiAgICAgIFtzaG93UGFnaW5hdGlvbkNvbnRyb2xzXT0ic2hvd1BhZ2luYXRpb25Db250cm9scyQgfCBhc3luYyIKICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJwYWdlZEl0ZW1zJCB8IGFzeW5jIgogICAgICBbY2FyZE9ic2VydmVyXT0iY2FyZE9ic2VydmVyIgogICAgICAocGFnZUluZGV4Q2hhbmdlZCk9Im9uUGFnZUluZGV4Q2hhbmdlZCgkZXZlbnQpIgogICAgICAoZ3JvdXBFeHBhbnNpb25Ub2dnbGVkKT0ib25Hcm91cEV4cGFuc2lvblRvZ2dsZWQoKSIKICAgID4KICAgIDwvbWV0cmljcy1jYXJkLWdyaWQtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENhcmRHcmlkQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIENhcmRHcmlkQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGdyb3VwTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2FyZElkc1dpdGhNZXRhZGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2FyZE9ic2VydmVyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDYXJkR3JpZENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIENhcmRHcmlkQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENhcmRHcmlkQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ2FyZEdyaWRDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2FyZEdyaWRDb250YWluZXIsIHNlbGVjdG9yczogW1sibWV0cmljcy1jYXJkLWdyaWQiXV0sIGlucHV0czogeyBncm91cE5hbWU6ICJncm91cE5hbWUiLCBjYXJkSWRzV2l0aE1ldGFkYXRhOiAiY2FyZElkc1dpdGhNZXRhZGF0YSIsIGNhcmRPYnNlcnZlcjogImNhcmRPYnNlcnZlciIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDcsIHZhcnM6IDIwLCBjb25zdHM6IFtbMywgImlzR3JvdXBFeHBhbmRhYmxlIiwgImlzR3JvdXBFeHBhbmRlZCIsICJncm91cE5hbWUiLCAicGFnZUluZGV4IiwgIm51bVBhZ2VzIiwgInNob3dQYWdpbmF0aW9uQ29udHJvbHMiLCAiY2FyZElkc1dpdGhNZXRhZGF0YSIsICJjYXJkT2JzZXJ2ZXIiLCAicGFnZUluZGV4Q2hhbmdlZCIsICJncm91cEV4cGFuc2lvblRvZ2dsZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBDYXJkR3JpZENvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWV0cmljcy1jYXJkLWdyaWQtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigicGFnZUluZGV4Q2hhbmdlZCIsIGZ1bmN0aW9uIENhcmRHcmlkQ29udGFpbmVyX1RlbXBsYXRlX21ldHJpY3NfY2FyZF9ncmlkX2NvbXBvbmVudF9wYWdlSW5kZXhDaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25QYWdlSW5kZXhDaGFuZ2VkKCRldmVudCk7IH0pKCJncm91cEV4cGFuc2lvblRvZ2dsZWQiLCBmdW5jdGlvbiBDYXJkR3JpZENvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNzX2NhcmRfZ3JpZF9jb21wb25lbnRfZ3JvdXBFeHBhbnNpb25Ub2dnbGVkXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25Hcm91cEV4cGFuc2lvblRvZ2dsZWQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDQsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiaXNHcm91cEV4cGFuZGFibGUiLCDJtcm1cGlwZUJpbmQxKDEsIDgsIGN0eC5pc0dyb3VwRXhwYW5kYWJsZSQpKSgiaXNHcm91cEV4cGFuZGVkIiwgybXJtXBpcGVCaW5kMSgyLCAxMCwgY3R4LmlzR3JvdXBFeHBhbmRlZCQpKSgiZ3JvdXBOYW1lIiwgY3R4Lmdyb3VwTmFtZSkoInBhZ2VJbmRleCIsIMm1ybVwaXBlQmluZDEoMywgMTIsIGN0eC5ub3JtYWxpemVkUGFnZUluZGV4JCkpKCJudW1QYWdlcyIsIMm1ybVwaXBlQmluZDEoNCwgMTQsIGN0eC5udW1QYWdlcyQpKSgic2hvd1BhZ2luYXRpb25Db250cm9scyIsIMm1ybVwaXBlQmluZDEoNSwgMTYsIGN0eC5zaG93UGFnaW5hdGlvbkNvbnRyb2xzJCkpKCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwgybXJtXBpcGVCaW5kMSg2LCAxOCwgY3R4LnBhZ2VkSXRlbXMkKSkoImNhcmRPYnNlcnZlciIsIGN0eC5jYXJkT2JzZXJ2ZXIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0NhcmRHcmlkQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tYWluX3ZpZXcvY2FyZF9ncm91cHNfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGZ1bmN0aW9uIENhcmRHcm91cHNDb21wb25lbnRfZGl2XzBfc3Bhbl81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCA2KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgZ3JvdXBfcjEgPSDJtcm1bmV4dENvbnRleHQoKS4kaW1wbGljaXQ7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiIsIGdyb3VwX3IxLml0ZW1zLmxlbmd0aCwgIiBjYXJkcyIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBDYXJkR3JvdXBzQ29tcG9uZW50X2Rpdl8wX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDEpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgInNwYW4iKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgMyk7CiAgICAgICAgybXJtXRleHQoNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1dGVtcGxhdGUoNSwgQ2FyZEdyb3Vwc0NvbXBvbmVudF9kaXZfMF9zcGFuXzVfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgNCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50KDYsICJtZXRyaWNzLWNhcmQtZ3JpZCIsIDUpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBncm91cF9yMSA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXByb3BlcnR5SW50ZXJwb2xhdGUoInRpdGxlIiwgZ3JvdXBfcjEuZ3JvdXBOYW1lKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGdyb3VwX3IxLmdyb3VwTmFtZSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgZ3JvdXBfcjEuaXRlbXMubGVuZ3RoID4gMSk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwgZ3JvdXBfcjEuaXRlbXMpKCJjYXJkT2JzZXJ2ZXIiLCBjdHhfcjAuY2FyZE9ic2VydmVyKSgiZ3JvdXBOYW1lIiwgZ3JvdXBfcjEuZ3JvdXBOYW1lKTsKICAgIH0gfQogICAgY2xhc3MgQ2FyZEdyb3Vwc0NvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMuUGx1Z2luVHlwZSA9IFBsdWdpblR5cGU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXgKICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRHcm91cAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdHJhY2tCeUdyb3VwKGluZGV4LCBjYXJkR3JvdXApIHsKICAgICAgICAgICAgcmV0dXJuIGNhcmRHcm91cC5ncm91cE5hbWU7CiAgICAgICAgfQogICAgfQogICAgQ2FyZEdyb3Vwc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy1jYXJkLWdyb3Vwcy1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8ZGl2CiAgICAgICpuZ0Zvcj0ibGV0IGdyb3VwIG9mIGNhcmRHcm91cHM7IHRyYWNrQnk6IHRyYWNrQnlHcm91cCIKICAgICAgY2xhc3M9ImNhcmQtZ3JvdXAiCiAgICA+CiAgICAgIDxkaXYgY2xhc3M9Imdyb3VwLXRvb2xiYXIiPgogICAgICAgIDxzcGFuPgogICAgICAgICAgPHNwYW4KICAgICAgICAgICAgY2xhc3M9Imdyb3VwLXRpdGxlIgogICAgICAgICAgICBhcmlhLXJvbGU9ImhlYWRpbmciCiAgICAgICAgICAgIGFyaWEtbGV2ZWw9IjMiCiAgICAgICAgICAgIHRpdGxlPSJ7eyBncm91cC5ncm91cE5hbWUgfX0iCiAgICAgICAgICAgID57eyBncm91cC5ncm91cE5hbWUgfX08L3NwYW4KICAgICAgICAgID4KICAgICAgICAgIDxzcGFuICpuZ0lmPSJncm91cC5pdGVtcy5sZW5ndGggPiAxIiBjbGFzcz0iZ3JvdXAtY2FyZC1jb3VudCIKICAgICAgICAgICAgPnt7IGdyb3VwLml0ZW1zLmxlbmd0aCB9fSBjYXJkczwvc3BhbgogICAgICAgICAgPgogICAgICAgIDwvc3Bhbj4KICAgICAgPC9kaXY+CiAgICAgIDxtZXRyaWNzLWNhcmQtZ3JpZAogICAgICAgIFtjYXJkSWRzV2l0aE1ldGFkYXRhXT0iZ3JvdXAuaXRlbXMiCiAgICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciIKICAgICAgICBbZ3JvdXBOYW1lXT0iZ3JvdXAuZ3JvdXBOYW1lIgogICAgICA+PC9tZXRyaWNzLWNhcmQtZ3JpZD4KICAgIDwvZGl2PgogIGAsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbYGNhcmRfZ3JvdXBzX2NvbXBvbmVudC5jc3NgXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIENhcmRHcm91cHNDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2FyZEdyb3VwczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2FyZE9ic2VydmVyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDYXJkR3JvdXBzQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gQ2FyZEdyb3Vwc0NvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBDYXJkR3JvdXBzQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIENhcmRHcm91cHNDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQ2FyZEdyb3Vwc0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJtZXRyaWNzLWNhcmQtZ3JvdXBzLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IGNhcmRHcm91cHM6ICJjYXJkR3JvdXBzIiwgY2FyZE9ic2VydmVyOiAiY2FyZE9ic2VydmVyIiB9LCBkZWNsczogMSwgdmFyczogMiwgY29uc3RzOiBbWyJjbGFzcyIsICJjYXJkLWdyb3VwIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiLCAibmdGb3JUcmFja0J5Il0sIFsxLCAiY2FyZC1ncm91cCJdLCBbMSwgImdyb3VwLXRvb2xiYXIiXSwgWyJhcmlhLXJvbGUiLCAiaGVhZGluZyIsICJhcmlhLWxldmVsIiwgIjMiLCAxLCAiZ3JvdXAtdGl0bGUiLCAzLCAidGl0bGUiXSwgWyJjbGFzcyIsICJncm91cC1jYXJkLWNvdW50IiwgNCwgIm5nSWYiXSwgWzMsICJjYXJkSWRzV2l0aE1ldGFkYXRhIiwgImNhcmRPYnNlcnZlciIsICJncm91cE5hbWUiXSwgWzEsICJncm91cC1jYXJkLWNvdW50Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQ2FyZEdyb3Vwc0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDAsIENhcmRHcm91cHNDb21wb25lbnRfZGl2XzBfVGVtcGxhdGUsIDcsIDYsICJkaXYiLCAwKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4LmNhcmRHcm91cHMpKCJuZ0ZvclRyYWNrQnkiLCBjdHgudHJhY2tCeUdyb3VwKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOZ0Zvck9mLCBOZ0lmLCBDYXJkR3JpZENvbnRhaW5lcl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5ncm91cC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7aGVpZ2h0OjQycHg7cGFkZGluZzowIDE2cHg7ZGlzcGxheTpmbGV4O2FsaWduLWl0ZW1zOmNlbnRlcjtib3JkZXItdG9wOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9LmNhcmQtZ3JvdXBbX25nY29udGVudC0lQ09NUCVdOmZpcnN0LW9mLXR5cGUgICAuZ3JvdXAtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDpub25lfS5ncm91cC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5ncm91cC1jYXJkLWNvdW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo0MDA7Y29sb3I6IzYxNjE2MTttYXJnaW4tbGVmdDo2cHh9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL21haW5fdmlldy9jYXJkX2dyb3Vwc19jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0UmVuZGVyYWJsZUNhcmRJZHNXaXRoTWV0YWRhdGEgPSBjcmVhdGVTZWxlY3RvcihnZXROb25FbXB0eUNhcmRJZHNXaXRoTWV0YWRhdGEsIGdldEN1cnJlbnRSb3V0ZVJ1blNlbGVjdGlvbiwgKC8qKgogICAgICogQHBhcmFtIHs/fSBjYXJkTGlzdAogICAgICogQHBhcmFtIHs/fSBydW5TZWxlY3Rpb25NYXAKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChjYXJkTGlzdCwgcnVuU2VsZWN0aW9uTWFwKSA9PiB7CiAgICAgICAgcmV0dXJuIGNhcmRMaXN0LmZpbHRlcigoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoY2FyZCkgPT4gewogICAgICAgICAgICBpZiAoIWlzU2luZ2xlUnVuUGx1Z2luKGNhcmQucGx1Z2luKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIEJvb2xlYW4ocnVuU2VsZWN0aW9uTWFwICYmIHJ1blNlbGVjdGlvbk1hcC5nZXQoKC8qKiBAdHlwZSB7P30gKi8gKGNhcmQucnVuSWQpKSkpOwogICAgICAgIH0pKTsKICAgIH0pKTsKICAgIGNsYXNzIENhcmRHcm91cHNDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuY2FyZEdyb3VwcyQgPSB0aGlzLnN0b3JlCiAgICAgICAgICAgICAgICAuc2VsZWN0KGdldFJlbmRlcmFibGVDYXJkSWRzV2l0aE1ldGFkYXRhKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTGlzdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNhcmRMaXN0KSA9PiBncm91cENhcmRJZFdpdGhNZXRkYXRhKGNhcmRMaXN0KSkpKTsKICAgICAgICB9CiAgICB9CiAgICBDYXJkR3JvdXBzQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLWNhcmQtZ3JvdXBzJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPG1ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50CiAgICAgIFtjYXJkR3JvdXBzXT0iY2FyZEdyb3VwcyQgfCBhc3luYyIKICAgICAgW2NhcmRPYnNlcnZlcl09ImNhcmRPYnNlcnZlciIKICAgID48L21ldHJpY3MtY2FyZC1ncm91cHMtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIENhcmRHcm91cHNDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgQ2FyZEdyb3Vwc0NvbnRhaW5lci5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjYXJkT2JzZXJ2ZXI6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIENhcmRHcm91cHNDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBDYXJkR3JvdXBzQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENhcmRHcm91cHNDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDYXJkR3JvdXBzQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IENhcmRHcm91cHNDb250YWluZXIsIHNlbGVjdG9yczogW1sibWV0cmljcy1jYXJkLWdyb3VwcyJdXSwgaW5wdXRzOiB7IGNhcmRPYnNlcnZlcjogImNhcmRPYnNlcnZlciIgfSwgZGVjbHM6IDIsIHZhcnM6IDQsIGNvbnN0czogW1szLCAiY2FyZEdyb3VwcyIsICJjYXJkT2JzZXJ2ZXIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBDYXJkR3JvdXBzQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWV0cmljcy1jYXJkLWdyb3Vwcy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiY2FyZEdyb3VwcyIsIMm1ybVwaXBlQmluZDEoMSwgMiwgY3R4LmNhcmRHcm91cHMkKSkoImNhcmRPYnNlcnZlciIsIGN0eC5jYXJkT2JzZXJ2ZXIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0NhcmRHcm91cHNDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL21haW5fdmlldy9maWx0ZXJlZF92aWV3X2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBGaWx0ZXJlZFZpZXdDb21wb25lbnRfc3Bhbl80X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCA1KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiIsIGN0eF9yMC5jYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCwgIiBjYXJkcyIpOwogICAgfSB9CiAgICBjbGFzcyBGaWx0ZXJlZFZpZXdDb21wb25lbnQgewogICAgfQogICAgRmlsdGVyZWRWaWV3Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPGRpdiBjbGFzcz0iZ3JvdXAtdG9vbGJhciI+CiAgICAgIDxzcGFuIGNsYXNzPSJncm91cC10ZXh0Ij4KICAgICAgICA8c3BhbiBjbGFzcz0iZ3JvdXAtdGl0bGUiIGFyaWEtcm9sZT0iaGVhZGluZyIgYXJpYS1sZXZlbD0iMyIKICAgICAgICAgID5UYWdzIG1hdGNoaW5nIGZpbHRlcjwvc3BhbgogICAgICAgID4KICAgICAgICA8c3BhbiAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGggPiAxIiBjbGFzcz0iZ3JvdXAtY2FyZC1jb3VudCIKICAgICAgICAgID57eyBjYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCB9fSBjYXJkczwvc3BhbgogICAgICAgID4KICAgICAgPC9zcGFuPgogICAgPC9kaXY+CiAgICA8bWV0cmljcy1jYXJkLWdyaWQKICAgICAgW2NhcmRJZHNXaXRoTWV0YWRhdGFdPSJjYXJkSWRzV2l0aE1ldGFkYXRhIgogICAgICBbY2FyZE9ic2VydmVyXT0iY2FyZE9ic2VydmVyIgogICAgPjwvbWV0cmljcy1jYXJkLWdyaWQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnZmlsdGVyZWRfdmlld19jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBGaWx0ZXJlZFZpZXdDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2FyZE9ic2VydmVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjYXJkSWRzV2l0aE1ldGFkYXRhOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBGaWx0ZXJlZFZpZXdDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBGaWx0ZXJlZFZpZXdDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRmlsdGVyZWRWaWV3Q29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEZpbHRlcmVkVmlld0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBGaWx0ZXJlZFZpZXdDb21wb25lbnQsIHNlbGVjdG9yczogW1sibWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IGNhcmRPYnNlcnZlcjogImNhcmRPYnNlcnZlciIsIGNhcmRJZHNXaXRoTWV0YWRhdGE6ICJjYXJkSWRzV2l0aE1ldGFkYXRhIiB9LCBkZWNsczogNiwgdmFyczogMywgY29uc3RzOiBbWzEsICJncm91cC10b29sYmFyIl0sIFsxLCAiZ3JvdXAtdGV4dCJdLCBbImFyaWEtcm9sZSIsICJoZWFkaW5nIiwgImFyaWEtbGV2ZWwiLCAiMyIsIDEsICJncm91cC10aXRsZSJdLCBbImNsYXNzIiwgImdyb3VwLWNhcmQtY291bnQiLCA0LCAibmdJZiJdLCBbMywgImNhcmRJZHNXaXRoTWV0YWRhdGEiLCAiY2FyZE9ic2VydmVyIl0sIFsxLCAiZ3JvdXAtY2FyZC1jb3VudCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEZpbHRlcmVkVmlld0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAic3BhbiIsIDIpOwogICAgICAgICAgICDJtcm1dGV4dCgzLCAiVGFncyBtYXRjaGluZyBmaWx0ZXIiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIEZpbHRlcmVkVmlld0NvbXBvbmVudF9zcGFuXzRfVGVtcGxhdGUsIDIsIDEsICJzcGFuIiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDUsICJtZXRyaWNzLWNhcmQtZ3JpZCIsIDQpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSg0KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoID4gMSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoImNhcmRJZHNXaXRoTWV0YWRhdGEiLCBjdHguY2FyZElkc1dpdGhNZXRhZGF0YSkoImNhcmRPYnNlcnZlciIsIGN0eC5jYXJkT2JzZXJ2ZXIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIENhcmRHcmlkQ29udGFpbmVyXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9Lmdyb3VwLXRleHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpiYXNlbGluZX0uZ3JvdXAtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0uZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2MTYxNjE7bWFyZ2luLWxlZnQ6NnB4fSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tYWluX3ZpZXcvZmlsdGVyZWRfdmlld19jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0UmVuZGVyYWJsZUNhcmRJZHNXaXRoTWV0YWRhdGEkMSA9IGNyZWF0ZVNlbGVjdG9yKGdldE5vbkVtcHR5Q2FyZElkc1dpdGhNZXRhZGF0YSwgZ2V0Q3VycmVudFJvdXRlUnVuU2VsZWN0aW9uLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IGNhcmRMaXN0CiAgICAgKiBAcGFyYW0gez99IHJ1blNlbGVjdGlvbk1hcAogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKGNhcmRMaXN0LCBydW5TZWxlY3Rpb25NYXApID0+IHsKICAgICAgICByZXR1cm4gY2FyZExpc3QuZmlsdGVyKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNhcmQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChjYXJkKSA9PiB7CiAgICAgICAgICAgIGlmICghaXNTaW5nbGVSdW5QbHVnaW4oY2FyZC5wbHVnaW4pKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gQm9vbGVhbihydW5TZWxlY3Rpb25NYXAgJiYgcnVuU2VsZWN0aW9uTWFwLmdldCgoLyoqIEB0eXBlIHs/fSAqLyAoY2FyZC5ydW5JZCkpKSk7CiAgICAgICAgfSkpOwogICAgfSkpOwogICAgLyoqCiAgICAgKiBBbiBhcmVhIHNob3dpbmcgY2FyZHMgdGhhdCBtYXRjaCB0aGUgdGFnIGZpbHRlci4KICAgICAqLwogICAgY2xhc3MgRmlsdGVyZWRWaWV3Q29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmNhcmRJZHNXaXRoTWV0YWRhdGEkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UmVuZGVyYWJsZUNhcmRJZHNXaXRoTWV0YWRhdGEkMSkucGlwZShzd2l0Y2hNYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRMaXN0CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoY2FyZExpc3QpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgICAgICBvZihjYXJkTGlzdCksCiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc1RhZ0ZpbHRlciksCiAgICAgICAgICAgICAgICBdKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFtjYXJkTGlzdCwgdGFnRmlsdGVyXSkgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjYXJkTGlzdCwgcmVnZXg6IG5ldyBSZWdFeHAodGFnRmlsdGVyKSB9OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBjYXJkTGlzdCwgcmVnZXg6IG51bGwgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHsgcmVnZXggfSkgPT4gcmVnZXggIT09IG51bGwpKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh7IGNhcmRMaXN0LCByZWdleCB9KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZExpc3QuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoeyB0YWcgfSkgPT4gKC8qKiBAdHlwZSB7P30gKi8gKHJlZ2V4KSkudGVzdCh0YWcpKSk7CiAgICAgICAgICAgIH0pKSwgbWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjYXJkTGlzdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGNhcmRMaXN0KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2FyZExpc3Quc29ydCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRBCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNhcmRCCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoY2FyZEEsIGNhcmRCKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvbXBhcmVUYWdOYW1lcyhjYXJkQS50YWcsIGNhcmRCLnRhZyk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSwgZGlzdGluY3RVbnRpbENoYW5nZWQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHByZXYKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB1cGRhdGVkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocHJldiwgdXBkYXRlZCkgPT4gewogICAgICAgICAgICAgICAgaWYgKHByZXYubGVuZ3RoICE9PSB1cGRhdGVkLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBwcmV2LmV2ZXJ5KCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcHJldlZhbAogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBpbmRleAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHByZXZWYWwsIGluZGV4KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHByZXZWYWwuY2FyZElkID09PSB1cGRhdGVkW2luZGV4XS5jYXJkSWQ7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSwgc3RhcnRXaXRoKFtdKSk7CiAgICAgICAgfQogICAgfQogICAgRmlsdGVyZWRWaWV3Q29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLWZpbHRlcmVkLXZpZXcnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudAogICAgICBbY2FyZElkc1dpdGhNZXRhZGF0YV09ImNhcmRJZHNXaXRoTWV0YWRhdGEkIHwgYXN5bmMiCiAgICAgIFtjYXJkT2JzZXJ2ZXJdPSJjYXJkT2JzZXJ2ZXIiCiAgICA+PC9tZXRyaWNzLWZpbHRlcmVkLXZpZXctY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEZpbHRlcmVkVmlld0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBGaWx0ZXJlZFZpZXdDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2FyZE9ic2VydmVyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBGaWx0ZXJlZFZpZXdDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBGaWx0ZXJlZFZpZXdDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRmlsdGVyZWRWaWV3Q29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRmlsdGVyZWRWaWV3Q29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEZpbHRlcmVkVmlld0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJtZXRyaWNzLWZpbHRlcmVkLXZpZXciXV0sIGlucHV0czogeyBjYXJkT2JzZXJ2ZXI6ICJjYXJkT2JzZXJ2ZXIiIH0sIGRlY2xzOiAyLCB2YXJzOiA0LCBjb25zdHM6IFtbMywgImNhcmRJZHNXaXRoTWV0YWRhdGEiLCAiY2FyZE9ic2VydmVyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRmlsdGVyZWRWaWV3Q29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWV0cmljcy1maWx0ZXJlZC12aWV3LWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJjYXJkSWRzV2l0aE1ldGFkYXRhIiwgybXJtXBpcGVCaW5kMSgxLCAyLCBjdHguY2FyZElkc1dpdGhNZXRhZGF0YSQpKSgiY2FyZE9ic2VydmVyIiwgY3R4LmNhcmRPYnNlcnZlcik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbRmlsdGVyZWRWaWV3Q29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tYWluX3ZpZXcvcGlubmVkX3ZpZXdfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGZ1bmN0aW9uIFBpbm5lZFZpZXdDb21wb25lbnRfc3Bhbl81X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNwYW4iLCA3KTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiIsIGN0eF9yMC5jYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCwgIiBjYXJkcyIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBQaW5uZWRWaWV3Q29tcG9uZW50X21ldHJpY3NfY2FyZF9ncmlkXzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1ldHJpY3MtY2FyZC1ncmlkIiwgOCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNhcmRJZHNXaXRoTWV0YWRhdGEiLCBjdHhfcjEuY2FyZElkc1dpdGhNZXRhZGF0YSkoImNhcmRPYnNlcnZlciIsIGN0eF9yMS5jYXJkT2JzZXJ2ZXIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBQaW5uZWRWaWV3Q29tcG9uZW50X25nX3RlbXBsYXRlXzdfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgOSk7CiAgICAgICAgybXJtXRleHQoMSwgIlBpbiBjYXJkcyBmb3IgYSBxdWljayB2aWV3IGFuZCBjb21wYXJpc29uIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgY2xhc3MgUGlubmVkVmlld0NvbXBvbmVudCB7CiAgICB9CiAgICBQaW5uZWRWaWV3Q29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLXBpbm5lZC12aWV3LWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxkaXYgY2xhc3M9Imdyb3VwLXRvb2xiYXIiPgogICAgICA8bWF0LWljb24gc3ZnSWNvbj0ia2VlcF8yNHB4Ij48L21hdC1pY29uPgogICAgICA8c3BhbiBjbGFzcz0iZ3JvdXAtdGV4dCI+CiAgICAgICAgPHNwYW4gY2xhc3M9Imdyb3VwLXRpdGxlIiBhcmlhLXJvbGU9ImhlYWRpbmciIGFyaWEtbGV2ZWw9IjMiCiAgICAgICAgICA+UGlubmVkPC9zcGFuCiAgICAgICAgPgogICAgICAgIDxzcGFuICpuZ0lmPSJjYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCA+IDEiIGNsYXNzPSJncm91cC1jYXJkLWNvdW50IgogICAgICAgICAgPnt7IGNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoIH19IGNhcmRzPC9zcGFuCiAgICAgICAgPgogICAgICA8L3NwYW4+CiAgICA8L2Rpdj4KICAgIDxtZXRyaWNzLWNhcmQtZ3JpZAogICAgICAqbmdJZj0iY2FyZElkc1dpdGhNZXRhZGF0YS5sZW5ndGg7IGVsc2UgZW1wdHlQaW5uZWRWaWV3IgogICAgICBbY2FyZElkc1dpdGhNZXRhZGF0YV09ImNhcmRJZHNXaXRoTWV0YWRhdGEiCiAgICAgIFtjYXJkT2JzZXJ2ZXJdPSJjYXJkT2JzZXJ2ZXIiCiAgICA+PC9tZXRyaWNzLWNhcmQtZ3JpZD4KICAgIDxuZy10ZW1wbGF0ZSAjZW1wdHlQaW5uZWRWaWV3PgogICAgICA8ZGl2IGNsYXNzPSJlbXB0eS1tZXNzYWdlIj5QaW4gY2FyZHMgZm9yIGEgcXVpY2sgdmlldyBhbmQgY29tcGFyaXNvbjwvZGl2PgogICAgPC9uZy10ZW1wbGF0ZT4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWydwaW5uZWRfdmlld19jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBQaW5uZWRWaWV3Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGNhcmRPYnNlcnZlcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2FyZElkc1dpdGhNZXRhZGF0YTogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGlubmVkVmlld0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFBpbm5lZFZpZXdDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGlubmVkVmlld0NvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQaW5uZWRWaWV3Q29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFBpbm5lZFZpZXdDb21wb25lbnQsIHNlbGVjdG9yczogW1sibWV0cmljcy1waW5uZWQtdmlldy1jb21wb25lbnQiXV0sIGlucHV0czogeyBjYXJkT2JzZXJ2ZXI6ICJjYXJkT2JzZXJ2ZXIiLCBjYXJkSWRzV2l0aE1ldGFkYXRhOiAiY2FyZElkc1dpdGhNZXRhZGF0YSIgfSwgZGVjbHM6IDksIHZhcnM6IDMsIGNvbnN0czogW1sxLCAiZ3JvdXAtdG9vbGJhciJdLCBbInN2Z0ljb24iLCAia2VlcF8yNHB4Il0sIFsxLCAiZ3JvdXAtdGV4dCJdLCBbImFyaWEtcm9sZSIsICJoZWFkaW5nIiwgImFyaWEtbGV2ZWwiLCAiMyIsIDEsICJncm91cC10aXRsZSJdLCBbImNsYXNzIiwgImdyb3VwLWNhcmQtY291bnQiLCA0LCAibmdJZiJdLCBbMywgImNhcmRJZHNXaXRoTWV0YWRhdGEiLCAiY2FyZE9ic2VydmVyIiwgNCwgIm5nSWYiLCAibmdJZkVsc2UiXSwgWyJlbXB0eVBpbm5lZFZpZXciLCAiIl0sIFsxLCAiZ3JvdXAtY2FyZC1jb3VudCJdLCBbMywgImNhcmRJZHNXaXRoTWV0YWRhdGEiLCAiY2FyZE9ic2VydmVyIl0sIFsxLCAiZW1wdHktbWVzc2FnZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBpbm5lZFZpZXdDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxLCAibWF0LWljb24iLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAic3BhbiIsIDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMsICJzcGFuIiwgMyk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDQsICJQaW5uZWQiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDUsIFBpbm5lZFZpZXdDb21wb25lbnRfc3Bhbl81X1RlbXBsYXRlLCAyLCAxLCAic3BhbiIsIDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNiwgUGlubmVkVmlld0NvbXBvbmVudF9tZXRyaWNzX2NhcmRfZ3JpZF82X1RlbXBsYXRlLCAxLCAyLCAibWV0cmljcy1jYXJkLWdyaWQiLCA1KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDcsIFBpbm5lZFZpZXdDb21wb25lbnRfbmdfdGVtcGxhdGVfN19UZW1wbGF0ZSwgMiwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNiwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgY29uc3QgX3IyID0gybXJtXJlZmVyZW5jZSg4KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5jYXJkSWRzV2l0aE1ldGFkYXRhLmxlbmd0aCA+IDEpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmNhcmRJZHNXaXRoTWV0YWRhdGEubGVuZ3RoKSgibmdJZkVsc2UiLCBfcjIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdEljb24sIE5nSWYsIENhcmRHcmlkQ29udGFpbmVyXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lmdyb3VwLXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweDtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9bWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjE7ZmxleDpub25lO21hcmdpbi1yaWdodDo1cHh9Lmdyb3VwLXRleHRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpiYXNlbGluZX0uZ3JvdXAtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0uZ3JvdXAtY2FyZC1jb3VudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NDAwO2NvbG9yOiM2MTYxNjE7bWFyZ2luLWxlZnQ6NnB4fS5lbXB0eS1tZXNzYWdlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxO3RleHQtYWxpZ246Y2VudGVyO3BhZGRpbmc6MTZweDtmb250LXNpemU6MTNweDtmb250LXN0eWxlOml0YWxpY30iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvbWFpbl92aWV3L3Bpbm5lZF92aWV3X2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBQaW5uZWRWaWV3Q29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmNhcmRJZHNXaXRoTWV0YWRhdGEkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0UGlubmVkQ2FyZHNXaXRoTWV0YWRhdGEpLnBpcGUoc3RhcnRXaXRoKFtdKSk7CiAgICAgICAgfQogICAgfQogICAgUGlubmVkVmlld0NvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy1waW5uZWQtdmlldycsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxtZXRyaWNzLXBpbm5lZC12aWV3LWNvbXBvbmVudAogICAgICBbY2FyZElkc1dpdGhNZXRhZGF0YV09ImNhcmRJZHNXaXRoTWV0YWRhdGEkIHwgYXN5bmMiCiAgICAgIFtjYXJkT2JzZXJ2ZXJdPSJjYXJkT2JzZXJ2ZXIiCiAgICA+PC9tZXRyaWNzLXBpbm5lZC12aWV3LWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBQaW5uZWRWaWV3Q29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIFBpbm5lZFZpZXdDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2FyZE9ic2VydmVyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQaW5uZWRWaWV3Q29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gUGlubmVkVmlld0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBQaW5uZWRWaWV3Q29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGlubmVkVmlld0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBQaW5uZWRWaWV3Q29udGFpbmVyLCBzZWxlY3RvcnM6IFtbIm1ldHJpY3MtcGlubmVkLXZpZXciXV0sIGlucHV0czogeyBjYXJkT2JzZXJ2ZXI6ICJjYXJkT2JzZXJ2ZXIiIH0sIGRlY2xzOiAyLCB2YXJzOiA0LCBjb25zdHM6IFtbMywgImNhcmRJZHNXaXRoTWV0YWRhdGEiLCAiY2FyZE9ic2VydmVyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUGlubmVkVmlld0NvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1ldHJpY3MtcGlubmVkLXZpZXctY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImNhcmRJZHNXaXRoTWV0YWRhdGEiLCDJtcm1cGlwZUJpbmQxKDEsIDIsIGN0eC5jYXJkSWRzV2l0aE1ldGFkYXRhJCkpKCJjYXJkT2JzZXJ2ZXIiLCBjdHguY2FyZE9ic2VydmVyKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtQaW5uZWRWaWV3Q29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2lkZ2V0cy9kcm9wZG93bi9kcm9wZG93bl9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gRHJvcGRvd25Db21wb25lbnRfbWF0X29wdGlvbl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1vcHRpb24iLCAyKTsKICAgICAgICDJtcm1dGV4dCgxKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3Qgb3B0aW9uX3IxID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgb3B0aW9uX3IxLnZhbHVlKTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlMSgiICIsIG9wdGlvbl9yMS5kaXNwbGF5VGV4dCwgIiAiKTsKICAgIH0gfQogICAgY2xhc3MgRHJvcGRvd25Db21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gJyc7CiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IFtdOwogICAgICAgICAgICB0aGlzLnNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICB9CiAgICBEcm9wZG93bkNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndGItZHJvcGRvd24nLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWF0LXNlbGVjdAogICAgICBbdmFsdWVdPSJ2YWx1ZSIKICAgICAgKHNlbGVjdGlvbkNoYW5nZSk9InNlbGVjdGlvbkNoYW5nZS5lbWl0KCRldmVudC52YWx1ZSkiCiAgICA+CiAgICAgIDxtYXQtb3B0aW9uICpuZ0Zvcj0ibGV0IG9wdGlvbiBvZiBvcHRpb25zIiBbdmFsdWVdPSJvcHRpb24udmFsdWUiPgogICAgICAgIHt7IG9wdGlvbi5kaXNwbGF5VGV4dCB9fQogICAgICA8L21hdC1vcHRpb24+CiAgICA8L21hdC1zZWxlY3Q+CiAgYCwKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFtgZHJvcGRvd25fY29tcG9uZW50LmNzc2BdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgRHJvcGRvd25Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9wdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNlbGVjdGlvbkNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIERyb3Bkb3duQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gRHJvcGRvd25Db21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRHJvcGRvd25Db21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRHJvcGRvd25Db21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogRHJvcGRvd25Db21wb25lbnQsIHNlbGVjdG9yczogW1sidGItZHJvcGRvd24iXV0sIGlucHV0czogeyB2YWx1ZTogInZhbHVlIiwgb3B0aW9uczogIm9wdGlvbnMiIH0sIG91dHB1dHM6IHsgc2VsZWN0aW9uQ2hhbmdlOiAic2VsZWN0aW9uQ2hhbmdlIiB9LCBkZWNsczogMiwgdmFyczogMiwgY29uc3RzOiBbWzMsICJ2YWx1ZSIsICJzZWxlY3Rpb25DaGFuZ2UiXSwgWzMsICJ2YWx1ZSIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFszLCAidmFsdWUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBEcm9wZG93bkNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LXNlbGVjdCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoInNlbGVjdGlvbkNoYW5nZSIsIGZ1bmN0aW9uIERyb3Bkb3duQ29tcG9uZW50X1RlbXBsYXRlX21hdF9zZWxlY3Rfc2VsZWN0aW9uQ2hhbmdlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguc2VsZWN0aW9uQ2hhbmdlLmVtaXQoJGV2ZW50LnZhbHVlKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBEcm9wZG93bkNvbXBvbmVudF9tYXRfb3B0aW9uXzFfVGVtcGxhdGUsIDIsIDIsICJtYXQtb3B0aW9uIiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgidmFsdWUiLCBjdHgudmFsdWUpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0Zvck9mIiwgY3R4Lm9wdGlvbnMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdFNlbGVjdCwgTmdGb3JPZiwgTWF0T3B0aW9uXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9bWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjFweCBzb2xpZCAjOGU5OGEzO2JvcmRlci1yYWRpdXM6M3B4O2JveC1zaXppbmc6Ym9yZGVyLWJveDtwYWRkaW5nOjZweH0iXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL3JpZ2h0X3BhbmUvc2V0dGluZ3Nfdmlld19jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgdmFyIEkxOE5fMCQ2OwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBBIGJ1dHRvbiB0byByZXNldCB0aGUgaW1hZ2UgYnJpZ2h0bmVzcyBzZXR0aW5nCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF8xMTg5MTYxODU3MjQwMzc4Mzk1JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19SSUdIVF9QQU5FX1NFVFRJTkdTX1ZJRVdfQ09NUE9ORU5UX1RTXzEgPSBnb29nLmdldE1zZygiUmVzZXQgYnJpZ2h0bmVzcyIpOwogICAgICAgIEkxOE5fMCQ2ID0gTVNHX0VYVEVSTkFMXzExODkxNjE4NTcyNDAzNzgzOTUkJFRFTlNPUkJPQVJEX1dFQkFQUF9NRVRSSUNTX1ZJRVdTX1JJR0hUX1BBTkVfU0VUVElOR1NfVklFV19DT01QT05FTlRfVFNfMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMCQ2ID0gJGxvY2FsaXplIGA6QSBidXR0b24gdG8gcmVzZXQgdGhlIGltYWdlIGJyaWdodG5lc3Mgc2V0dGluZ+KQn2M0ODJiM2E0N2VhMDk3NWZhOGJlMDFhZmIzZmJlYzliNzY2MjhiZDfikJ8xMTg5MTYxODU3MjQwMzc4Mzk1OlJlc2V0IGJyaWdodG5lc3NgOwogICAgfQogICAgY29uc3QgX2MyJGMgPSBbImFyaWEtbGFiZWwiLCBJMThOXzAkNl07CiAgICB2YXIgSTE4Tl8zJDQ7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIEEgYnV0dG9uIHRvIHJlc2V0IHRoZSBpbWFnZSBjb250cmFzdCBzZXR0aW5nCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF81MzcwNzAzMzQyOTIzNjExOTU1JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19SSUdIVF9QQU5FX1NFVFRJTkdTX1ZJRVdfQ09NUE9ORU5UX1RTXzQgPSBnb29nLmdldE1zZygiUmVzZXQgY29udHJhc3QiKTsKICAgICAgICBJMThOXzMkNCA9IE1TR19FWFRFUk5BTF81MzcwNzAzMzQyOTIzNjExOTU1JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19SSUdIVF9QQU5FX1NFVFRJTkdTX1ZJRVdfQ09NUE9ORU5UX1RTXzQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzMkNCA9ICRsb2NhbGl6ZSBgOkEgYnV0dG9uIHRvIHJlc2V0IHRoZSBpbWFnZSBjb250cmFzdCBzZXR0aW5n4pCfZWQ3MTJhOGI5MjcwNDFiZTE1MjUyYjI5ZWI1MjFlYmIxMzc0YmFkOOKQnzUzNzA3MDMzNDI5MjM2MTE5NTU6UmVzZXQgY29udHJhc3RgOwogICAgfQogICAgY29uc3QgX2M1JDYgPSBbImFyaWEtbGFiZWwiLCBJMThOXzMkNF07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBTTElERVJfQVVESVRfVElNRV9NUyA9IDI1MDsKICAgIGNsYXNzIFNldHRpbmdzVmlld0NvbXBvbmVudCB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBsb2NhbGUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihsb2NhbGUpIHsKICAgICAgICAgICAgdGhpcy5sb2NhbGUgPSBsb2NhbGU7CiAgICAgICAgICAgIHRoaXMuVG9vbHRpcFNvcnREcm9wZG93bk9wdGlvbnMgPSBbCiAgICAgICAgICAgICAgICB7IHZhbHVlOiBUb29sdGlwU29ydGluZ01ldGhvZC5ERUZBVUxULCBkaXNwbGF5VGV4dDogJ0RlZmF1bHQnIH0sCiAgICAgICAgICAgICAgICB7IHZhbHVlOiBUb29sdGlwU29ydGluZ01ldGhvZC5BU0NFTkRJTkcsIGRpc3BsYXlUZXh0OiAnQXNjZW5kaW5nJyB9LAogICAgICAgICAgICAgICAgeyB2YWx1ZTogVG9vbHRpcFNvcnRpbmdNZXRob2QuREVTQ0VORElORywgZGlzcGxheVRleHQ6ICdEZXNjZW5kaW5nJyB9LAogICAgICAgICAgICAgICAgeyB2YWx1ZTogVG9vbHRpcFNvcnRpbmdNZXRob2QuTkVBUkVTVCwgZGlzcGxheVRleHQ6ICdOZWFyZXN0JyB9LAogICAgICAgICAgICBdOwogICAgICAgICAgICB0aGlzLnRvb2x0aXBTb3J0Q2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5pZ25vcmVPdXRsaWVyc0NoYW5nZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuWEF4aXNUeXBlRHJvcGRvd25PcHRpb25zID0gWwogICAgICAgICAgICAgICAgeyB2YWx1ZTogWEF4aXNUeXBlJDEuU1RFUCwgZGlzcGxheVRleHQ6ICdTdGVwJyB9LAogICAgICAgICAgICAgICAgeyB2YWx1ZTogWEF4aXNUeXBlJDEuUkVMQVRJVkUsIGRpc3BsYXlUZXh0OiAnUmVsYXRpdmUnIH0sCiAgICAgICAgICAgICAgICB7IHZhbHVlOiBYQXhpc1R5cGUkMS5XQUxMX1RJTUUsIGRpc3BsYXlUZXh0OiAnV2FsbCcgfSwKICAgICAgICAgICAgXTsKICAgICAgICAgICAgdGhpcy54QXhpc1R5cGVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLkhpc3RvZ3JhbU1vZGVEcm9wZG93bk9wdGlvbnMgPSBbCiAgICAgICAgICAgICAgICB7IHZhbHVlOiBIaXN0b2dyYW1Nb2RlLk9GRlNFVCwgZGlzcGxheVRleHQ6ICdPZmZzZXQnIH0sCiAgICAgICAgICAgICAgICB7IHZhbHVlOiBIaXN0b2dyYW1Nb2RlLk9WRVJMQVksIGRpc3BsYXlUZXh0OiAnT3ZlcmxheScgfSwKICAgICAgICAgICAgXTsKICAgICAgICAgICAgdGhpcy5oaXN0b2dyYW1Nb2RlQ2hhbmdlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5zY2FsYXJTbW9vdGhpbmdDb250cm9sQ2hhbmdlZCQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuc2NhbGFyU21vb3RoaW5nQ2hhbmdlZCA9IHRoaXMuc2NhbGFyU21vb3RoaW5nQ29udHJvbENoYW5nZWQkLnBpcGUoYXVkaXRUaW1lKFNMSURFUl9BVURJVF9USU1FX01TKSk7CiAgICAgICAgICAgIHRoaXMuaW1hZ2VCcmlnaHRuZXNzU2xpZGVyQ2hhbmdlZCQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQgPSB0aGlzLmltYWdlQnJpZ2h0bmVzc1NsaWRlckNoYW5nZWQkLnBpcGUoYXVkaXRUaW1lKFNMSURFUl9BVURJVF9USU1FX01TKSk7CiAgICAgICAgICAgIHRoaXMuaW1hZ2VCcmlnaHRuZXNzUmVzZXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuaW1hZ2VDb250cmFzdFNsaWRlckNoYW5nZWQkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCA9IHRoaXMuaW1hZ2VDb250cmFzdFNsaWRlckNoYW5nZWQkLnBpcGUoYXVkaXRUaW1lKFNMSURFUl9BVURJVF9USU1FX01TKSk7CiAgICAgICAgICAgIHRoaXMuaW1hZ2VDb250cmFzdFJlc2V0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblNjYWxhclNtb290aGluZ0lucHV0KGV2ZW50KSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5wdXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSk7CiAgICAgICAgICAgIGlmICghaW5wdXQudmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5leHRWYWx1ZSA9IE1hdGgubWluKE1hdGgubWF4KDAsIHBhcnNlRmxvYXQoaW5wdXQudmFsdWUpKSwgMSk7CiAgICAgICAgICAgIC8vIFJlY3RpZnkgaGVyZSBpbiBjYXNlIEFuZ3VsYXIgZG9lcyBub3QgdHJpZ2dlciBuZ09uQ2hhbmdlcyB3aGVuIGV4cGVjdGVkLgogICAgICAgICAgICBpZiAobmV4dFZhbHVlICE9PSBwYXJzZUZsb2F0KGlucHV0LnZhbHVlKSkgewogICAgICAgICAgICAgICAgaW5wdXQudmFsdWUgPSBTdHJpbmcobmV4dFZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLnNjYWxhclNtb290aGluZ0NvbnRyb2xDaGFuZ2VkJC5lbWl0KG5leHRWYWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbnVtCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb3JtYXRNaWxsaVRvWmVyb3RoKG51bSkgewogICAgICAgICAgICByZXR1cm4gZm9ybWF0TnVtYmVyKG51bSAvIDEwMDAsIAogICAgICAgICAgICAvLyBPdXIgYXBwIGRvZXMgbm90LCB5ZXQsIHNwZWNpZnkgTE9DQUxFX0lELiBEZWZhdWx0IHRvIGVuLVVTLgogICAgICAgICAgICB0aGlzLmxvY2FsZSB8fCAnZW4tVVMnLCAKICAgICAgICAgICAgLy8gVGhlIHNsaWRlciBjYW5ub3QgZml0IDMgZGVjaW1hbHMuCiAgICAgICAgICAgICcxLjAtMicpOwogICAgICAgIH0KICAgIH0KICAgIFNldHRpbmdzVmlld0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MtY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJ3NldHRpbmdzX3ZpZXdfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogW2BzZXR0aW5nc192aWV3X2NvbXBvbmVudC5jc3NgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgU2V0dGluZ3NWaWV3Q29tcG9uZW50LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RyaW5nLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtMT0NBTEVfSUQkMSxdIH1dIH0KICAgIF07CiAgICBTZXR0aW5nc1ZpZXdDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgdG9vbHRpcFNvcnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHRvb2x0aXBTb3J0Q2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGlnbm9yZU91dGxpZXJzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpZ25vcmVPdXRsaWVyc0NoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICB4QXhpc1R5cGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHhBeGlzVHlwZUNoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBoaXN0b2dyYW1Nb2RlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBoaXN0b2dyYW1Nb2RlQ2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIHNjYWxhclNtb290aGluZzogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2NhbGFyU21vb3RoaW5nQ2hhbmdlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGltYWdlQnJpZ2h0bmVzc0luTWlsbGk6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgaW1hZ2VCcmlnaHRuZXNzUmVzZXQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBpbWFnZUNvbnRyYXN0SW5NaWxsaTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgaW1hZ2VDb250cmFzdFJlc2V0OiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgaW1hZ2VTaG93QWN0dWFsU2l6ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc1ZpZXdDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2V0dGluZ3NWaWV3Q29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KExPQ0FMRV9JRCQxKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU2V0dGluZ3NWaWV3Q29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNldHRpbmdzVmlld0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncy1jb21wb25lbnQiXV0sIGlucHV0czogeyB0b29sdGlwU29ydDogInRvb2x0aXBTb3J0IiwgaWdub3JlT3V0bGllcnM6ICJpZ25vcmVPdXRsaWVycyIsIHhBeGlzVHlwZTogInhBeGlzVHlwZSIsIGhpc3RvZ3JhbU1vZGU6ICJoaXN0b2dyYW1Nb2RlIiwgc2NhbGFyU21vb3RoaW5nOiAic2NhbGFyU21vb3RoaW5nIiwgaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaTogImltYWdlQnJpZ2h0bmVzc0luTWlsbGkiLCBpbWFnZUNvbnRyYXN0SW5NaWxsaTogImltYWdlQ29udHJhc3RJbk1pbGxpIiwgaW1hZ2VTaG93QWN0dWFsU2l6ZTogImltYWdlU2hvd0FjdHVhbFNpemUiIH0sIG91dHB1dHM6IHsgdG9vbHRpcFNvcnRDaGFuZ2VkOiAidG9vbHRpcFNvcnRDaGFuZ2VkIiwgaWdub3JlT3V0bGllcnNDaGFuZ2VkOiAiaWdub3JlT3V0bGllcnNDaGFuZ2VkIiwgeEF4aXNUeXBlQ2hhbmdlZDogInhBeGlzVHlwZUNoYW5nZWQiLCBoaXN0b2dyYW1Nb2RlQ2hhbmdlZDogImhpc3RvZ3JhbU1vZGVDaGFuZ2VkIiwgc2NhbGFyU21vb3RoaW5nQ2hhbmdlZDogInNjYWxhclNtb290aGluZ0NoYW5nZWQiLCBpbWFnZUJyaWdodG5lc3NJbk1pbGxpQ2hhbmdlZDogImltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkIiwgaW1hZ2VCcmlnaHRuZXNzUmVzZXQ6ICJpbWFnZUJyaWdodG5lc3NSZXNldCIsIGltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZDogImltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCIsIGltYWdlQ29udHJhc3RSZXNldDogImltYWdlQ29udHJhc3RSZXNldCIsIGltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkOiAiaW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQiIH0sIGRlY2xzOiA1MiwgdmFyczogMjYsIGNvbnN0czogW1sxLCAiZ2VuZXJhbCJdLCBbMSwgInNlY3Rpb24tdGl0bGUiXSwgWzEsICJjb250cm9sLXJvdyIsICJ4LWF4aXMtdHlwZSJdLCBbImlkIiwgIngtYXhpcy10eXBlLWxhYmVsIiwgMSwgImNvbnRyb2wtbmFtZSJdLCBbMywgInZhbHVlIiwgIm9wdGlvbnMiLCAic2VsZWN0aW9uQ2hhbmdlIl0sIFsxLCAic2NhbGFycyJdLCBbMSwgImNvbnRyb2wtcm93IiwgInNjYWxhcnMtc21vb3RoaW5nIl0sIFsiaWQiLCAic2NhbGFycy1zbW9vdGhpbmctbGFiZWwiLCAxLCAiY29udHJvbC1uYW1lIl0sIFsxLCAic2xpZGVyLXJvdyJdLCBbImFyaWEtbGFiZWxsZWRieSIsICJzY2FsYXJzLXNtb290aGluZy1sYWJlbCIsICJjb2xvciIsICJwcmltYXJ5IiwgMywgIm1heCIsICJtaW4iLCAic3RlcCIsICJ2YWx1ZSIsICJ0aHVtYkxhYmVsIiwgImlucHV0Il0sIFsiYXJpYS1sYWJlbGxlZGJ5IiwgInNjYWxhcnMtc21vb3RoaW5nLWxhYmVsIiwgInR5cGUiLCAibnVtYmVyIiwgIm1pbiIsICIwIiwgIm1heCIsICIxIiwgInN0ZXAiLCAiMC4wMSIsIDEsICJzbGlkZXItaW5wdXQiLCAzLCAidmFsdWUiLCAiaW5wdXQiXSwgWzEsICJjb250cm9sLXJvdyIsICJ0b29sdGlwLXNvcnQiXSwgWzEsICJjb250cm9sLW5hbWUiXSwgWzEsICJjb250cm9sLXJvdyIsICJzY2FsYXJzLWlnbm9yZS1vdXRsaWVycyJdLCBbMywgImNoZWNrZWQiLCAiY2hhbmdlIl0sIFsxLCAiSGlzdG9ncmFtcyJdLCBbMSwgImNvbnRyb2wtcm93IiwgImhpc3RvZ3JhbS1tb2RlIl0sIFsxLCAiaW1hZ2UiXSwgWzEsICJjb250cm9sLXJvdyIsICJpbWFnZS1icmlnaHRuZXNzIl0sIFsiaWQiLCAiaW1hZ2UtYnJpZ2h0bmVzcy1sYWJlbCIsIDEsICJjb250cm9sLW5hbWUiXSwgWyJhcmlhLWxhYmVsbGVkYnkiLCAiaW1hZ2UtYnJpZ2h0bmVzcy1sYWJlbCIsICJjb2xvciIsICJwcmltYXJ5IiwgMywgIm1heCIsICJtaW4iLCAic3RlcCIsICJ2YWx1ZSIsICJ0aHVtYkxhYmVsIiwgImRpc3BsYXlXaXRoIiwgImlucHV0Il0sIFsibWF0LWljb24tYnV0dG9uIiwgIiIsICJ0aXRsZSIsICJSZXNldCBicmlnaHRuZXNzIiwgMSwgInJlc2V0LWJ1dHRvbiIsIDMsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFsic3ZnSWNvbiIsICJzZXR0aW5nc19iYWNrdXBfcmVzdG9yZV8yNHB4Il0sIFsxLCAiY29udHJvbC1yb3ciLCAiaW1hZ2UtY29udHJhc3QiXSwgWyJpZCIsICJpbWFnZS1jb25zdHJhc3QtbGFiZWwiLCAxLCAiY29udHJvbC1uYW1lIl0sIFsiYXJpYS1sYWJlbGxlZGJ5IiwgImltYWdlLWNvbnN0cmFzdC1sYWJlbCIsICJjb2xvciIsICJwcmltYXJ5IiwgMywgIm1heCIsICJtaW4iLCAic3RlcCIsICJ2YWx1ZSIsICJ0aHVtYkxhYmVsIiwgImRpc3BsYXlXaXRoIiwgImlucHV0Il0sIFsibWF0LWljb24tYnV0dG9uIiwgIiIsICJ0aXRsZSIsICJSZXNldCBjb250cmFzdCIsIDEsICJyZXNldC1idXR0b24iLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbMSwgImNvbnRyb2wtcm93IiwgImltYWdlLXNob3ctYWN0dWFsLXNpemUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInNlY3Rpb24iLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaDMiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMiwgIkdlbmVyYWwiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImRpdiIsIDMpOwogICAgICAgICAgICDJtcm1dGV4dCg1LCAiSG9yaXpvbnRhbCBBeGlzIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgInRiLWRyb3Bkb3duIiwgNCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigic2VsZWN0aW9uQ2hhbmdlIiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29tcG9uZW50X1RlbXBsYXRlX3RiX2Ryb3Bkb3duX3NlbGVjdGlvbkNoYW5nZV82X2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LnhBeGlzVHlwZUNoYW5nZWQuZW1pdCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAic2VjdGlvbiIsIDUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDgsICJoMyIsIDEpOwogICAgICAgICAgICDJtcm1dGV4dCg5LCAiU2NhbGFycyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEwLCAiZGl2IiwgNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTEsICJkaXYiLCA3KTsKICAgICAgICAgICAgybXJtXRleHQoMTIsICJTbW9vdGhpbmciKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMywgImRpdiIsIDgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE0LCAibWF0LXNsaWRlciIsIDkpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29tcG9uZW50X1RlbXBsYXRlX21hdF9zbGlkZXJfaW5wdXRfMTRfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguc2NhbGFyU21vb3RoaW5nQ29udHJvbENoYW5nZWQkLmVtaXQoJGV2ZW50LnZhbHVlKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTUsICJpbnB1dCIsIDEwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbXBvbmVudF9UZW1wbGF0ZV9pbnB1dF9pbnB1dF8xNV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblNjYWxhclNtb290aGluZ0lucHV0KCRldmVudCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE2LCAiZGl2IiwgMTEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDE3LCAiZGl2IiwgMTIpOwogICAgICAgICAgICDJtcm1dGV4dCgxOCwgIlRvb2x0aXAgc29ydGluZyBtZXRob2QiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxOSwgInRiLWRyb3Bkb3duIiwgNCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigic2VsZWN0aW9uQ2hhbmdlIiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29tcG9uZW50X1RlbXBsYXRlX3RiX2Ryb3Bkb3duX3NlbGVjdGlvbkNoYW5nZV8xOV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC50b29sdGlwU29ydENoYW5nZWQuZW1pdCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyMCwgImRpdiIsIDEzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyMSwgIm1hdC1jaGVja2JveCIsIDE0KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb21wb25lbnRfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NoYW5nZV8yMV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5pZ25vcmVPdXRsaWVyc0NoYW5nZWQuZW1pdCgkZXZlbnQuY2hlY2tlZCk7IH0pOwogICAgICAgICAgICDJtcm1dGV4dCgyMiwgIklnbm9yZSBvdXRsaWVycyBpbiBjaGFydCBzY2FsaW5nIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjMsICJzZWN0aW9uIiwgMTUpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI0LCAiaDMiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMjUsICJIaXN0b2dyYW1zIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjYsICJkaXYiLCAxNik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMjcsICJkaXYiLCAxMik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDI4LCAiTW9kZSIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDI5LCAidGItZHJvcGRvd24iLCA0KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJzZWxlY3Rpb25DaGFuZ2UiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb21wb25lbnRfVGVtcGxhdGVfdGJfZHJvcGRvd25fc2VsZWN0aW9uQ2hhbmdlXzI5X2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lmhpc3RvZ3JhbU1vZGVDaGFuZ2VkLmVtaXQoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMzAsICJzZWN0aW9uIiwgMTcpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDMxLCAiaDMiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMzIsICJJbWFnZXMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzMywgImRpdiIsIDE4KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzNCwgImRpdiIsIDE5KTsKICAgICAgICAgICAgybXJtXRleHQoMzUsICJCcmlnaHRuZXNzIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMzYsICJkaXYiLCA4KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzNywgIm1hdC1zbGlkZXIiLCAyMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiaW5wdXQiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb21wb25lbnRfVGVtcGxhdGVfbWF0X3NsaWRlcl9pbnB1dF8zN19saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5pbWFnZUJyaWdodG5lc3NTbGlkZXJDaGFuZ2VkJC5lbWl0KCRldmVudC52YWx1ZSk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDM4LCAiYnV0dG9uIiwgMjEpOwogICAgICAgICAgICDJtcm1aTE4bkF0dHJpYnV0ZXMoMzksIF9jMiRjKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMzhfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguaW1hZ2VCcmlnaHRuZXNzUmVzZXQuZW1pdCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNDAsICJtYXQtaWNvbiIsIDIyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0MSwgImRpdiIsIDIzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0MiwgImRpdiIsIDI0KTsKICAgICAgICAgICAgybXJtXRleHQoNDMsICJDb250cmFzdCIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQ0LCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNDUsICJtYXQtc2xpZGVyIiwgMjUpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29tcG9uZW50X1RlbXBsYXRlX21hdF9zbGlkZXJfaW5wdXRfNDVfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguaW1hZ2VDb250cmFzdFNsaWRlckNoYW5nZWQkLmVtaXQoJGV2ZW50LnZhbHVlKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNDYsICJidXR0b24iLCAyNik7CiAgICAgICAgICAgIMm1ybVpMThuQXR0cmlidXRlcyg0NywgX2M1JDYpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29tcG9uZW50X1RlbXBsYXRlX2J1dHRvbl9jbGlja180Nl9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5pbWFnZUNvbnRyYXN0UmVzZXQuZW1pdCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNDgsICJtYXQtaWNvbiIsIDIyKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0OSwgImRpdiIsIDI3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg1MCwgIm1hdC1jaGVja2JveCIsIDE0KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb21wb25lbnRfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NoYW5nZV81MF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5pbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZC5lbWl0KCRldmVudC5jaGVja2VkKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDUxLCAiU2hvdyBhY3R1YWwgaW1hZ2Ugc2l6ZSIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSg2KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eC54QXhpc1R5cGUpKCJvcHRpb25zIiwgY3R4LlhBeGlzVHlwZURyb3Bkb3duT3B0aW9ucyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDgpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1heCIsIDEpKCJtaW4iLCAwKSgic3RlcCIsIDAuMDEpKCJ2YWx1ZSIsIGN0eC5zY2FsYXJTbW9vdGhpbmcpKCJ0aHVtYkxhYmVsIiwgdHJ1ZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY3R4LnNjYWxhclNtb290aGluZyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDQpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY3R4LnRvb2x0aXBTb3J0KSgib3B0aW9ucyIsIGN0eC5Ub29sdGlwU29ydERyb3Bkb3duT3B0aW9ucyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCBjdHguaWdub3JlT3V0bGllcnMpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg4KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eC5oaXN0b2dyYW1Nb2RlKSgib3B0aW9ucyIsIGN0eC5IaXN0b2dyYW1Nb2RlRHJvcGRvd25PcHRpb25zKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoOCk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF4IiwgMjAwMCkoIm1pbiIsIDApKCJzdGVwIiwgMTApKCJ2YWx1ZSIsIGN0eC5pbWFnZUJyaWdodG5lc3NJbk1pbGxpKSgidGh1bWJMYWJlbCIsIHRydWUpKCJkaXNwbGF5V2l0aCIsIGN0eC5mb3JtYXRNaWxsaVRvWmVyb3RoKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoOCk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF4IiwgNTAwMCkoIm1pbiIsIDApKCJzdGVwIiwgMTApKCJ2YWx1ZSIsIGN0eC5pbWFnZUNvbnRyYXN0SW5NaWxsaSkoInRodW1iTGFiZWwiLCB0cnVlKSgiZGlzcGxheVdpdGgiLCBjdHguZm9ybWF0TWlsbGlUb1plcm90aCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCBjdHguaW1hZ2VTaG93QWN0dWFsU2l6ZSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbRHJvcGRvd25Db21wb25lbnQsIE1hdFNsaWRlciwgTWF0Q2hlY2tib3gsIE1hdEJ1dHRvbiwgTWF0SWNvbl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV17Y29sb3I6IzYxNjE2MTtmb250LXNpemU6MTJweH1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO3BhZGRpbmc6MTZweH0uc2VjdGlvbi10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTt0ZXh0LXRyYW5zZm9ybTp1cHBlcmNhc2U7Zm9udC13ZWlnaHQ6NTAwO2ZvbnQtc2l6ZToxM3B4O2xpbmUtaGVpZ2h0Om5vcm1hbDttYXJnaW46MCAwIDEycHggMH1zZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5jb250cm9sLXJvd1tfbmdjb250ZW50LSVDT01QJV06bm90KDpsYXN0LWNoaWxkKXttYXJnaW4tYm90dG9tOjEycHh9LmNvbnRyb2wtbmFtZVtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWJvdHRvbTo4cHh9LnNsaWRlci1yb3dbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7aGVpZ2h0OjI4cHh9LnNsaWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdICAgLnJlc2V0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6NnB4fS5zbGlkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5zbGlkZXItaW5wdXRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjoxcHggc29saWQgIzhlOThhMztib3JkZXItcmFkaXVzOjJweDtib3gtc2l6aW5nOmJvcmRlci1ib3g7aGVpZ2h0OjEwMCU7bWFyZ2luLWxlZnQ6MTJweDtwYWRkaW5nOjAgNHB4fW1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MTttYXJnaW4tbGVmdDotOHB4O21hcmdpbi1yaWdodDotOHB4fXRiLWRyb3Bkb3duW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmJsb2NrfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9yaWdodF9wYW5lL3NldHRpbmdzX3ZpZXdfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFNldHRpbmdzVmlld0NvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy50b29sdGlwU29ydCQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzVG9vbHRpcFNvcnQpOwogICAgICAgICAgICB0aGlzLmlnbm9yZU91dGxpZXJzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NJZ25vcmVPdXRsaWVycyk7CiAgICAgICAgICAgIHRoaXMueEF4aXNUeXBlJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NYQXhpc1R5cGUpOwogICAgICAgICAgICB0aGlzLmhpc3RvZ3JhbU1vZGUkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc0hpc3RvZ3JhbU1vZGUpOwogICAgICAgICAgICB0aGlzLnNjYWxhclNtb290aGluZyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzU2NhbGFyU21vb3RoaW5nKTsKICAgICAgICAgICAgdGhpcy5pbWFnZUJyaWdodG5lc3NJbk1pbGxpJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NJbWFnZUJyaWdodG5lc3NJbk1pbGxpKTsKICAgICAgICAgICAgdGhpcy5pbWFnZUNvbnRyYXN0SW5NaWxsaSQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNzSW1hZ2VDb250cmFzdEluTWlsbGkpOwogICAgICAgICAgICB0aGlzLmltYWdlU2hvd0FjdHVhbFNpemUkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljc0ltYWdlU2hvd0FjdHVhbFNpemUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvcnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVG9vbHRpcFNvcnRDaGFuZ2VkKHNvcnQpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXRyaWNzQ2hhbmdlVG9vbHRpcFNvcnQoeyBzb3J0IH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbklnbm9yZU91dGxpZXJzQ2hhbmdlZCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXRyaWNzVG9nZ2xlSWdub3JlT3V0bGllcnMoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30geEF4aXNUeXBlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblhBeGlzVHlwZUNoYW5nZWQoeEF4aXNUeXBlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWV0cmljc0NoYW5nZVhBeGlzVHlwZSh7IHhBeGlzVHlwZSB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaGlzdG9ncmFtTW9kZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25IaXN0b2dyYW1Nb2RlQ2hhbmdlZChoaXN0b2dyYW1Nb2RlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWV0cmljc0NoYW5nZUhpc3RvZ3JhbU1vZGUoeyBoaXN0b2dyYW1Nb2RlIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzbW9vdGhpbmcKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uU2NhbGFyU21vb3RoaW5nQ2hhbmdlZChzbW9vdGhpbmcpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXRyaWNzQ2hhbmdlU2NhbGFyU21vb3RoaW5nKHsgc21vb3RoaW5nIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBicmlnaHRuZXNzSW5NaWxsaQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25JbWFnZUJyaWdodG5lc3NJbk1pbGxpQ2hhbmdlZChicmlnaHRuZXNzSW5NaWxsaSkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1ldHJpY3NDaGFuZ2VJbWFnZUJyaWdodG5lc3MoeyBicmlnaHRuZXNzSW5NaWxsaSB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25JbWFnZUJyaWdodG5lc3NSZXNldCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChtZXRyaWNzUmVzZXRJbWFnZUJyaWdodG5lc3MoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25JbWFnZUNvbnRyYXN0UmVzZXQoKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobWV0cmljc1Jlc2V0SW1hZ2VDb250cmFzdCgpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjb250cmFzdEluTWlsbGkKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uSW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkKGNvbnRyYXN0SW5NaWxsaSkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1ldHJpY3NDaGFuZ2VJbWFnZUNvbnRyYXN0KHsgY29udHJhc3RJbk1pbGxpIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkKCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG1ldHJpY3NUb2dnbGVJbWFnZVNob3dBY3R1YWxTaXplKCkpOwogICAgICAgIH0KICAgIH0KICAgIFNldHRpbmdzVmlld0NvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MtY29tcG9uZW50CiAgICAgIFt0b29sdGlwU29ydF09InRvb2x0aXBTb3J0JCB8IGFzeW5jIgogICAgICAodG9vbHRpcFNvcnRDaGFuZ2VkKT0ib25Ub29sdGlwU29ydENoYW5nZWQoJGV2ZW50KSIKICAgICAgW2lnbm9yZU91dGxpZXJzXT0iaWdub3JlT3V0bGllcnMkIHwgYXN5bmMiCiAgICAgIChpZ25vcmVPdXRsaWVyc0NoYW5nZWQpPSJvbklnbm9yZU91dGxpZXJzQ2hhbmdlZCgpIgogICAgICBbeEF4aXNUeXBlXT0ieEF4aXNUeXBlJCB8IGFzeW5jIgogICAgICAoeEF4aXNUeXBlQ2hhbmdlZCk9Im9uWEF4aXNUeXBlQ2hhbmdlZCgkZXZlbnQpIgogICAgICBbaGlzdG9ncmFtTW9kZV09Imhpc3RvZ3JhbU1vZGUkIHwgYXN5bmMiCiAgICAgIChoaXN0b2dyYW1Nb2RlQ2hhbmdlZCk9Im9uSGlzdG9ncmFtTW9kZUNoYW5nZWQoJGV2ZW50KSIKICAgICAgW3NjYWxhclNtb290aGluZ109InNjYWxhclNtb290aGluZyQgfCBhc3luYyIKICAgICAgKHNjYWxhclNtb290aGluZ0NoYW5nZWQpPSJvblNjYWxhclNtb290aGluZ0NoYW5nZWQoJGV2ZW50KSIKICAgICAgW2ltYWdlQnJpZ2h0bmVzc0luTWlsbGldPSJpbWFnZUJyaWdodG5lc3NJbk1pbGxpJCB8IGFzeW5jIgogICAgICAoaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWQpPSJvbkltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkKCRldmVudCkiCiAgICAgIChpbWFnZUJyaWdodG5lc3NSZXNldCk9Im9uSW1hZ2VCcmlnaHRuZXNzUmVzZXQoKSIKICAgICAgW2ltYWdlQ29udHJhc3RJbk1pbGxpXT0iaW1hZ2VDb250cmFzdEluTWlsbGkkIHwgYXN5bmMiCiAgICAgIChpbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQpPSJvbkltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZCgkZXZlbnQpIgogICAgICAoaW1hZ2VDb250cmFzdFJlc2V0KT0ib25JbWFnZUNvbnRyYXN0UmVzZXQoKSIKICAgICAgW2ltYWdlU2hvd0FjdHVhbFNpemVdPSJpbWFnZVNob3dBY3R1YWxTaXplJCB8IGFzeW5jIgogICAgICAoaW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWQpPSJvbkltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkKCkiCiAgICA+CiAgICA8L21ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBTZXR0aW5nc1ZpZXdDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFNldHRpbmdzVmlld0NvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTZXR0aW5nc1ZpZXdDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZXR0aW5nc1ZpZXdDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU2V0dGluZ3NWaWV3Q29udGFpbmVyLCBzZWxlY3RvcnM6IFtbIm1ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzIl1dLCBkZWNsczogOSwgdmFyczogMjQsIGNvbnN0czogW1szLCAidG9vbHRpcFNvcnQiLCAiaWdub3JlT3V0bGllcnMiLCAieEF4aXNUeXBlIiwgImhpc3RvZ3JhbU1vZGUiLCAic2NhbGFyU21vb3RoaW5nIiwgImltYWdlQnJpZ2h0bmVzc0luTWlsbGkiLCAiaW1hZ2VDb250cmFzdEluTWlsbGkiLCAiaW1hZ2VTaG93QWN0dWFsU2l6ZSIsICJ0b29sdGlwU29ydENoYW5nZWQiLCAiaWdub3JlT3V0bGllcnNDaGFuZ2VkIiwgInhBeGlzVHlwZUNoYW5nZWQiLCAiaGlzdG9ncmFtTW9kZUNoYW5nZWQiLCAic2NhbGFyU21vb3RoaW5nQ2hhbmdlZCIsICJpbWFnZUJyaWdodG5lc3NJbk1pbGxpQ2hhbmdlZCIsICJpbWFnZUJyaWdodG5lc3NSZXNldCIsICJpbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQiLCAiaW1hZ2VDb250cmFzdFJlc2V0IiwgImltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJ0b29sdGlwU29ydENoYW5nZWQiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb250YWluZXJfVGVtcGxhdGVfbWV0cmljc19kYXNoYm9hcmRfc2V0dGluZ3NfY29tcG9uZW50X3Rvb2x0aXBTb3J0Q2hhbmdlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uVG9vbHRpcFNvcnRDaGFuZ2VkKCRldmVudCk7IH0pKCJpZ25vcmVPdXRsaWVyc0NoYW5nZWQiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb250YWluZXJfVGVtcGxhdGVfbWV0cmljc19kYXNoYm9hcmRfc2V0dGluZ3NfY29tcG9uZW50X2lnbm9yZU91dGxpZXJzQ2hhbmdlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uSWdub3JlT3V0bGllcnNDaGFuZ2VkKCk7IH0pKCJ4QXhpc1R5cGVDaGFuZ2VkIiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29udGFpbmVyX1RlbXBsYXRlX21ldHJpY3NfZGFzaGJvYXJkX3NldHRpbmdzX2NvbXBvbmVudF94QXhpc1R5cGVDaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25YQXhpc1R5cGVDaGFuZ2VkKCRldmVudCk7IH0pKCJoaXN0b2dyYW1Nb2RlQ2hhbmdlZCIsIGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNzX2Rhc2hib2FyZF9zZXR0aW5nc19jb21wb25lbnRfaGlzdG9ncmFtTW9kZUNoYW5nZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkhpc3RvZ3JhbU1vZGVDaGFuZ2VkKCRldmVudCk7IH0pKCJzY2FsYXJTbW9vdGhpbmdDaGFuZ2VkIiwgZnVuY3Rpb24gU2V0dGluZ3NWaWV3Q29udGFpbmVyX1RlbXBsYXRlX21ldHJpY3NfZGFzaGJvYXJkX3NldHRpbmdzX2NvbXBvbmVudF9zY2FsYXJTbW9vdGhpbmdDaGFuZ2VkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25TY2FsYXJTbW9vdGhpbmdDaGFuZ2VkKCRldmVudCk7IH0pKCJpbWFnZUJyaWdodG5lc3NJbk1pbGxpQ2hhbmdlZCIsIGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNzX2Rhc2hib2FyZF9zZXR0aW5nc19jb21wb25lbnRfaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaUNoYW5nZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkltYWdlQnJpZ2h0bmVzc0luTWlsbGlDaGFuZ2VkKCRldmVudCk7IH0pKCJpbWFnZUJyaWdodG5lc3NSZXNldCIsIGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNzX2Rhc2hib2FyZF9zZXR0aW5nc19jb21wb25lbnRfaW1hZ2VCcmlnaHRuZXNzUmVzZXRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkltYWdlQnJpZ2h0bmVzc1Jlc2V0KCk7IH0pKCJpbWFnZUNvbnRyYXN0SW5NaWxsaUNoYW5nZWQiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb250YWluZXJfVGVtcGxhdGVfbWV0cmljc19kYXNoYm9hcmRfc2V0dGluZ3NfY29tcG9uZW50X2ltYWdlQ29udHJhc3RJbk1pbGxpQ2hhbmdlZF8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uSW1hZ2VDb250cmFzdEluTWlsbGlDaGFuZ2VkKCRldmVudCk7IH0pKCJpbWFnZUNvbnRyYXN0UmVzZXQiLCBmdW5jdGlvbiBTZXR0aW5nc1ZpZXdDb250YWluZXJfVGVtcGxhdGVfbWV0cmljc19kYXNoYm9hcmRfc2V0dGluZ3NfY29tcG9uZW50X2ltYWdlQ29udHJhc3RSZXNldF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uSW1hZ2VDb250cmFzdFJlc2V0KCk7IH0pKCJpbWFnZVNob3dBY3R1YWxTaXplQ2hhbmdlZCIsIGZ1bmN0aW9uIFNldHRpbmdzVmlld0NvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNzX2Rhc2hib2FyZF9zZXR0aW5nc19jb21wb25lbnRfaW1hZ2VTaG93QWN0dWFsU2l6ZUNoYW5nZWRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkltYWdlU2hvd0FjdHVhbFNpemVDaGFuZ2VkKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDYsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg3LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoOCwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgidG9vbHRpcFNvcnQiLCDJtcm1cGlwZUJpbmQxKDEsIDgsIGN0eC50b29sdGlwU29ydCQpKSgiaWdub3JlT3V0bGllcnMiLCDJtcm1cGlwZUJpbmQxKDIsIDEwLCBjdHguaWdub3JlT3V0bGllcnMkKSkoInhBeGlzVHlwZSIsIMm1ybVwaXBlQmluZDEoMywgMTIsIGN0eC54QXhpc1R5cGUkKSkoImhpc3RvZ3JhbU1vZGUiLCDJtcm1cGlwZUJpbmQxKDQsIDE0LCBjdHguaGlzdG9ncmFtTW9kZSQpKSgic2NhbGFyU21vb3RoaW5nIiwgybXJtXBpcGVCaW5kMSg1LCAxNiwgY3R4LnNjYWxhclNtb290aGluZyQpKSgiaW1hZ2VCcmlnaHRuZXNzSW5NaWxsaSIsIMm1ybVwaXBlQmluZDEoNiwgMTgsIGN0eC5pbWFnZUJyaWdodG5lc3NJbk1pbGxpJCkpKCJpbWFnZUNvbnRyYXN0SW5NaWxsaSIsIMm1ybVwaXBlQmluZDEoNywgMjAsIGN0eC5pbWFnZUNvbnRyYXN0SW5NaWxsaSQpKSgiaW1hZ2VTaG93QWN0dWFsU2l6ZSIsIMm1ybVwaXBlQmluZDEoOCwgMjIsIGN0eC5pbWFnZVNob3dBY3R1YWxTaXplJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1NldHRpbmdzVmlld0NvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvcmlnaHRfcGFuZS9yaWdodF9wYW5lX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSaWdodFBhbmVDb21wb25lbnQgewogICAgfQogICAgUmlnaHRQYW5lQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtZXRyaWNzLWRhc2hib2FyZC1yaWdodC1wYW5lJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYDxtZXRyaWNzLWRhc2hib2FyZC1zZXR0aW5ncz48L21ldHJpY3MtZGFzaGJvYXJkLXNldHRpbmdzPmAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmlnaHRQYW5lQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gUmlnaHRQYW5lQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJpZ2h0UGFuZUNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSaWdodFBhbmVDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUmlnaHRQYW5lQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbIm1ldHJpY3MtZGFzaGJvYXJkLXJpZ2h0LXBhbmUiXV0sIGRlY2xzOiAxLCB2YXJzOiAwLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUmlnaHRQYW5lQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWV0cmljcy1kYXNoYm9hcmQtc2V0dGluZ3MiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtTZXR0aW5nc1ZpZXdDb250YWluZXJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tYWluX3ZpZXcvbWFpbl92aWV3X2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICB2YXIgSTE4Tl8wJDc7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIExhYmVsIG9uIGEgdG9vbGJhciBidXR0b24gdG8gdG9nZ2xlIHRoZSBzZXR0aW5ncyBzaWRlIHBhbmUuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF83NjU5Mjg1NDQ1NTgwODM4OTI1JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19NQUlOX1ZJRVdfTUFJTl9WSUVXX0NPTVBPTkVOVF9UU18xID0gZ29vZy5nZXRNc2coIlRvZ2dsZSBzZXR0aW5ncyBzaWRlIHBhbmUiKTsKICAgICAgICBJMThOXzAkNyA9IE1TR19FWFRFUk5BTF83NjU5Mjg1NDQ1NTgwODM4OTI1JCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19NQUlOX1ZJRVdfTUFJTl9WSUVXX0NPTVBPTkVOVF9UU18xOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgSTE4Tl8wJDcgPSAkbG9jYWxpemUgYDpMYWJlbCBvbiBhIHRvb2xiYXIgYnV0dG9uIHRvIHRvZ2dsZSB0aGUgc2V0dGluZ3Mgc2lkZSBwYW5lLuKQn2QzNTE2ZGI2YmJlNjg2MGE1NWJlYWI2NmU0OTY5ZGFjNjI1YjhkNzLikJ83NjU5Mjg1NDQ1NTgwODM4OTI1OlRvZ2dsZSBzZXR0aW5ncyBzaWRlIHBhbmVgOwogICAgfQogICAgY29uc3QgX2MyJGQgPSBbImFyaWEtbGFiZWwiLCBJMThOXzAkN107CiAgICBmdW5jdGlvbiBNYWluVmlld0NvbXBvbmVudF9tZXRyaWNzX2ZpbHRlcmVkX3ZpZXdfOV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWV0cmljcy1maWx0ZXJlZC12aWV3IiwgNyk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNhcmRPYnNlcnZlciIsIGN0eF9yMC5jYXJkT2JzZXJ2ZXIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYWluVmlld0NvbXBvbmVudF9tZXRyaWNzX3Bpbm5lZF92aWV3XzEwX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJtZXRyaWNzLXBpbm5lZC12aWV3IiwgNyk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjEgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNhcmRPYnNlcnZlciIsIGN0eF9yMS5jYXJkT2JzZXJ2ZXIpOwogICAgfSB9CiAgICB2YXIgSTE4Tl8zJDU7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIExhYmVsIG9uIGEgYnV0dG9uIHRvIGNsb3NlIHRoZSBzZXR0aW5ncyBzaWRlIHBhbmUuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF84MTU2NzY2OTk3NzQ3MTY1ODcxJCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19NQUlOX1ZJRVdfTUFJTl9WSUVXX0NPTVBPTkVOVF9UU19fNCA9IGdvb2cuZ2V0TXNnKCJDbG9zZSBzaWRlIHBhbmUiKTsKICAgICAgICBJMThOXzMkNSA9IE1TR19FWFRFUk5BTF84MTU2NzY2OTk3NzQ3MTY1ODcxJCRURU5TT1JCT0FSRF9XRUJBUFBfTUVUUklDU19WSUVXU19NQUlOX1ZJRVdfTUFJTl9WSUVXX0NPTVBPTkVOVF9UU19fNDsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMyQ1ID0gJGxvY2FsaXplIGA6TGFiZWwgb24gYSBidXR0b24gdG8gY2xvc2UgdGhlIHNldHRpbmdzIHNpZGUgcGFuZS7ikJ8wNDUyMWRjMGI2YTY1Y2Y1YzM4Mjk0NGM5YThiNGI4NDRhM2U5NTk44pCfODE1Njc2Njk5Nzc0NzE2NTg3MTpDbG9zZSBzaWRlIHBhbmVgOwogICAgfQogICAgY29uc3QgX2M1JDcgPSBbImFyaWEtbGFiZWwiLCBJMThOXzMkNV07CiAgICBmdW5jdGlvbiBNYWluVmlld0NvbXBvbmVudF9kaXZfMTJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgOSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMTApOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImgyIiwgMTEpOwogICAgICAgIMm1ybV0ZXh0KDMsICJTZXR0aW5ncyIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiYnV0dG9uIiwgMTIpOwogICAgICAgIMm1ybVpMThuQXR0cmlidXRlcyg1LCBfYzUkNyk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIE1haW5WaWV3Q29tcG9uZW50X2Rpdl8xMl9UZW1wbGF0ZV9idXR0b25fY2xpY2tfNF9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yNCk7IGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IzLm9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQuZW1pdCgpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudCg2LCAibWF0LWljb24iLCAxMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50KDcsICJtZXRyaWNzLWRhc2hib2FyZC1yaWdodC1wYW5lIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gfQogICAgY29uc3QgX2M2JDMgPSBmdW5jdGlvbiAoYTApIHsgcmV0dXJuIHsgImNoZWNrZWQiOiBhMCwgInNldHRpbmdzLWJ1dHRvbiI6IHRydWUgfTsgfTsKICAgIGNsYXNzIE1haW5WaWV3Q29tcG9uZW50IHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGhvc3QKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihob3N0KSB7CiAgICAgICAgICAgIHRoaXMuaG9zdCA9IGhvc3Q7CiAgICAgICAgICAgIHRoaXMub25TZXR0aW5nc0J1dHRvbkNsaWNrZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIExvYWQgY2FyZHMgdGhhdCBhcmUgbm90IHlldCB2aXNpYmxlLCBpZiB0aGV5IGFyZSByb3VnaGx5IDEgY2FyZCByb3cgYXdheSBpbgogICAgICAgICAgICAgKiBzY3JvbGwgZGlzdGFuY2UuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNhcmRPYnNlcnZlciA9IG5ldyBDYXJkT2JzZXJ2ZXIodGhpcy5ob3N0Lm5hdGl2ZUVsZW1lbnQsICc2MDBweCAwcHggNjAwcHggMHB4Jyk7CiAgICAgICAgfQogICAgfQogICAgTWFpblZpZXdDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ21ldHJpY3MtbWFpbi12aWV3LWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICdtYWluX3ZpZXdfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWydtYWluX3ZpZXdfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYWluVmlld0NvbXBvbmVudC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfQogICAgXTsKICAgIE1haW5WaWV3Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHNob3dGaWx0ZXJlZFZpZXc6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGlzU2lkZXBhbmVPcGVuOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvblNldHRpbmdzQnV0dG9uQ2xpY2tlZDogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYWluVmlld0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIE1haW5WaWV3Q29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1haW5WaWV3Q29tcG9uZW50KSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYWluVmlld0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNYWluVmlld0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJtZXRyaWNzLW1haW4tdmlldy1jb21wb25lbnQiXV0sIGlucHV0czogeyBzaG93RmlsdGVyZWRWaWV3OiAic2hvd0ZpbHRlcmVkVmlldyIsIGlzU2lkZXBhbmVPcGVuOiAiaXNTaWRlcGFuZU9wZW4iIH0sIG91dHB1dHM6IHsgb25TZXR0aW5nc0J1dHRvbkNsaWNrZWQ6ICJvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCIsIG9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQ6ICJvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkIiB9LCBkZWNsczogMTMsIHZhcnM6IDEwLCBjb25zdHM6IFtbMSwgInRvb2xiYXIiXSwgWzEsICJyaWdodC1pdGVtcyJdLCBbIm1hdC1zdHJva2VkLWJ1dHRvbiIsICIiLCAzLCAibmdDbGFzcyIsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFsic3ZnSWNvbiIsICJzZXR0aW5nc18yNHB4Il0sIFsxLCAic3BsaXQtY29udGVudCJdLCBbMSwgIm1haW4iXSwgWzMsICJjYXJkT2JzZXJ2ZXIiLCA0LCAibmdJZiJdLCBbMywgImNhcmRPYnNlcnZlciJdLCBbImNsYXNzIiwgInNpZGViYXIiLCA0LCAibmdJZiJdLCBbMSwgInNpZGViYXIiXSwgWzEsICJoZWFkZXIiXSwgWzEsICJ0aXRsZSJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbInN2Z0ljb24iLCAiY2xvc2VfMjRweCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1haW5WaWV3Q29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMSwgIm1ldHJpY3MtdGFnLWZpbHRlciIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiYnV0dG9uIiwgMik7CiAgICAgICAgICAgIMm1ybVpMThuQXR0cmlidXRlcyg0LCBfYzIkZCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYWluVmlld0NvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfM19saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vblNldHRpbmdzQnV0dG9uQ2xpY2tlZC5lbWl0KCk7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg1LCAibWF0LWljb24iLCAzKTsKICAgICAgICAgICAgybXJtXRleHQoNiwgIiBTZXR0aW5ncyAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg3LCAiZGl2IiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOCwgImRpdiIsIDUpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoOSwgTWFpblZpZXdDb21wb25lbnRfbWV0cmljc19maWx0ZXJlZF92aWV3XzlfVGVtcGxhdGUsIDEsIDEsICJtZXRyaWNzLWZpbHRlcmVkLXZpZXciLCA2KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEwLCBNYWluVmlld0NvbXBvbmVudF9tZXRyaWNzX3Bpbm5lZF92aWV3XzEwX1RlbXBsYXRlLCAxLCAxLCAibWV0cmljcy1waW5uZWQtdmlldyIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxMSwgIm1ldHJpY3MtY2FyZC1ncm91cHMiLCA3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEyLCBNYWluVmlld0NvbXBvbmVudF9kaXZfMTJfVGVtcGxhdGUsIDgsIDAsICJkaXYiLCA4KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24xKDgsIF9jNiQzLCBjdHguaXNTaWRlcGFuZU9wZW4pKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgiYXJpYS1wcmVzc2VkIiwgY3R4LmlzU2lkZXBhbmVPcGVuKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zaG93RmlsdGVyZWRWaWV3KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsICFjdHguc2hvd0ZpbHRlcmVkVmlldyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1c3R5bGVQcm9wKCJkaXNwbGF5IiwgY3R4LnNob3dGaWx0ZXJlZFZpZXcgPyAibm9uZSIgOiAiIik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiY2FyZE9ic2VydmVyIiwgY3R4LmNhcmRPYnNlcnZlcik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguaXNTaWRlcGFuZU9wZW4pOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01ldHJpY3NGaWx0ZXJJbnB1dENvbnRhaW5lciwgTWF0QnV0dG9uLCBOZ0NsYXNzLCBNYXRJY29uLCBOZ0lmLCBDYXJkR3JvdXBzQ29udGFpbmVyLCBGaWx0ZXJlZFZpZXdDb250YWluZXIsIFBpbm5lZFZpZXdDb250YWluZXIsIFJpZ2h0UGFuZUNvbXBvbmVudF0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJX0udG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17ZmxleDpub25lO2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW47aGVpZ2h0OjQ4cHg7cGFkZGluZzowIDE2cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9LnRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgbWV0cmljcy10YWctZmlsdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjEgMSAxMDBweH0udG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAucmlnaHQtaXRlbXNbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OjFweCBzb2xpZCAjZWJlYmViO21hcmdpbi1sZWZ0OjE2cHg7cGFkZGluZy1sZWZ0OjE2cHh9LnNwbGl0LWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtvdmVyZmxvdy15OmF1dG87ZmxleDoxfS5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSwgLnNpZGViYXJbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93LXg6aGlkZGVuO292ZXJmbG93LXk6YXV0bzt3aWxsLWNoYW5nZTp0cmFuc2Zvcm07Y29udGFpbjpzdHJpY3R9Lm1haW5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1ZjZmNztmbGV4OjEgMTtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1ufS5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtZmlsdGVyZWQtdmlld1tfbmdjb250ZW50LSVDT01QJV0sIC5tYWluW19uZ2NvbnRlbnQtJUNPTVAlXSAgIG1ldHJpY3MtcGlubmVkLXZpZXdbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9LnNpZGViYXJbX25nY29udGVudC0lQ09NUCVde2ZsZXg6MCAwIDI1MHB4O2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItbGVmdDoxcHggc29saWQgI2ViZWJlYn0uc2lkZWJhcltfbmdjb250ZW50LSVDT01QJV0gICAuaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyO2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO2hlaWdodDo0MnB4O3BhZGRpbmc6MCAxNnB4O2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWJ9LnNpZGViYXJbX25nY29udGVudC0lQ09NUCVdICAgLmhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAudGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDpub3JtYWw7bWFyZ2luOjB9LnNldHRpbmdzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MTtkaXNwbGF5OmlubGluZS1mbGV4fS5zZXR0aW5ncy1idXR0b24uY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2JvcmRlci1jb2xvcjojZTBlMGUwfS5zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgICAubWF0LWJ1dHRvbi13cmFwcGVye2Rpc3BsYXk6aW5saW5lLWZsZXg7YWxpZ24taXRlbXM6Y2VudGVyfS5zZXR0aW5ncy1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgbWF0LWljb25bX25nY29udGVudC0lQ09NUCVde21hcmdpbi1yaWdodDo0cHh9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL21haW5fdmlldy9tYWluX3ZpZXdfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1haW5WaWV3Q29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmlzU2lkZXBhbmVPcGVuID0gdHJ1ZTsKICAgICAgICAgICAgdGhpcy5zaG93RmlsdGVyZWRWaWV3JCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NUYWdGaWx0ZXIpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmaWx0ZXIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChmaWx0ZXIpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBmaWx0ZXIubGVuZ3RoID4gMDsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCgpIHsKICAgICAgICAgICAgdGhpcy5pc1NpZGVwYW5lT3BlbiA9ICF0aGlzLmlzU2lkZXBhbmVPcGVuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWQoKSB7CiAgICAgICAgICAgIHRoaXMuaXNTaWRlcGFuZU9wZW4gPSBmYWxzZTsKICAgICAgICB9CiAgICB9CiAgICBNYWluVmlld0NvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljcy1tYWluLXZpZXcnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWV0cmljcy1tYWluLXZpZXctY29tcG9uZW50CiAgICAgIFtzaG93RmlsdGVyZWRWaWV3XT0ic2hvd0ZpbHRlcmVkVmlldyQgfCBhc3luYyIKICAgICAgW2lzU2lkZXBhbmVPcGVuXT0iaXNTaWRlcGFuZU9wZW4iCiAgICAgIChvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCk9Im9uU2V0dGluZ3NCdXR0b25DbGlja2VkKCkiCiAgICAgIChvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkKT0ib25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCgpIgogICAgPjwvbWV0cmljcy1tYWluLXZpZXctY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1haW5WaWV3Q29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYWluVmlld0NvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIE1haW5WaWV3Q29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1haW5WaWV3Q29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWFpblZpZXdDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWFpblZpZXdDb250YWluZXIsIHNlbGVjdG9yczogW1sibWV0cmljcy1tYWluLXZpZXciXV0sIGRlY2xzOiAyLCB2YXJzOiA0LCBjb25zdHM6IFtbMywgInNob3dGaWx0ZXJlZFZpZXciLCAiaXNTaWRlcGFuZU9wZW4iLCAib25TZXR0aW5nc0J1dHRvbkNsaWNrZWQiLCAib25DbG9zZVNpZGVwYW5lQnV0dG9uQ2xpY2tlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1haW5WaWV3Q29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtZXRyaWNzLW1haW4tdmlldy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJvblNldHRpbmdzQnV0dG9uQ2xpY2tlZCIsIGZ1bmN0aW9uIE1haW5WaWV3Q29udGFpbmVyX1RlbXBsYXRlX21ldHJpY3NfbWFpbl92aWV3X2NvbXBvbmVudF9vblNldHRpbmdzQnV0dG9uQ2xpY2tlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uU2V0dGluZ3NCdXR0b25DbGlja2VkKCk7IH0pKCJvbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkIiwgZnVuY3Rpb24gTWFpblZpZXdDb250YWluZXJfVGVtcGxhdGVfbWV0cmljc19tYWluX3ZpZXdfY29tcG9uZW50X29uQ2xvc2VTaWRlcGFuZUJ1dHRvbkNsaWNrZWRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vbkNsb3NlU2lkZXBhbmVCdXR0b25DbGlja2VkKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJzaG93RmlsdGVyZWRWaWV3IiwgybXJtXBpcGVCaW5kMSgxLCAyLCBjdHguc2hvd0ZpbHRlcmVkVmlldyQpKSgiaXNTaWRlcGFuZU9wZW4iLCBjdHguaXNTaWRlcGFuZU9wZW4pOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01haW5WaWV3Q29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tZXRyaWNzX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyIHsKICAgIH0KICAgIE1ldHJpY3NEYXNoYm9hcmRDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ21ldHJpY3MtZGFzaGJvYXJkJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPG5hdj4KICAgICAgPHJ1bnMtc2VsZWN0b3I+PC9ydW5zLXNlbGVjdG9yPgogICAgPC9uYXY+CiAgICA8bWV0cmljcy1tYWluLXZpZXc+PC9tZXRyaWNzLW1haW4tdmlldz4KICBgLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWydtZXRyaWNzX2NvbnRhaW5lci5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gTWV0cmljc0Rhc2hib2FyZENvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyKSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY3NEYXNoYm9hcmRDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWV0cmljc0Rhc2hib2FyZENvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJtZXRyaWNzLWRhc2hib2FyZCJdXSwgZGVjbHM6IDMsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJuYXYiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMSwgInJ1bnMtc2VsZWN0b3IiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMiwgIm1ldHJpY3MtbWFpbi12aWV3Iik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbUnVuc1NlbGVjdG9yQ29udGFpbmVyLCBNYWluVmlld0NvbnRhaW5lcl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O2hlaWdodDoxMDAlfW5hdltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OjFweCBzb2xpZCAjZWJlYmViO2ZsZXg6bm9uZTt3aWR0aDozNDBweH1tZXRyaWNzLW1haW4tdmlld1tfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDF9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC93aWRnZXRzL2hpc3RvZ3JhbS9oaXN0b2dyYW1fbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEhpc3RvZ3JhbU1vZHVsZSB7CiAgICB9CiAgICBIaXN0b2dyYW1Nb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0hpc3RvZ3JhbUNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0hpc3RvZ3JhbUNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGlzdG9ncmFtTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogSGlzdG9ncmFtTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEhpc3RvZ3JhbU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhpc3RvZ3JhbU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIaXN0b2dyYW1Nb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShIaXN0b2dyYW1Nb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbSGlzdG9ncmFtQ29tcG9uZW50XSwgZXhwb3J0czogW0hpc3RvZ3JhbUNvbXBvbmVudF0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2lkZ2V0cy9yZXNpemVfZGV0ZWN0b3JfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJlc2l6ZURldGVjdG9yTW9kdWxlIHsKICAgIH0KICAgIFJlc2l6ZURldGVjdG9yTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbUmVzaXplRGV0ZWN0b3JEaXJlY3RpdmVdLAogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1Jlc2l6ZURldGVjdG9yRGlyZWN0aXZlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSZXNpemVEZXRlY3Rvck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFJlc2l6ZURldGVjdG9yTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJlc2l6ZURldGVjdG9yTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUmVzaXplRGV0ZWN0b3JNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmVzaXplRGV0ZWN0b3JNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShSZXNpemVEZXRlY3Rvck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtSZXNpemVEZXRlY3RvckRpcmVjdGl2ZV0sIGV4cG9ydHM6IFtSZXNpemVEZXRlY3RvckRpcmVjdGl2ZV0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2lkZ2V0cy90ZXh0L3RydW5jYXRlZF9wYXRoX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIFByb3ZpZGVzIGEgVHJ1bmNhdGVkUGF0aENvbXBvbmVudCBmb3IgcmVuZGVyaW5nIGEgJy8nIGRlbGltaXRlZCBwYXRoLgogICAgICovCiAgICBjbGFzcyBUcnVuY2F0ZWRQYXRoTW9kdWxlIHsKICAgIH0KICAgIFRydW5jYXRlZFBhdGhNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1RydW5jYXRlZFBhdGhDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtUcnVuY2F0ZWRQYXRoQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUcnVuY2F0ZWRQYXRoTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVHJ1bmNhdGVkUGF0aE1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUcnVuY2F0ZWRQYXRoTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gVHJ1bmNhdGVkUGF0aE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUcnVuY2F0ZWRQYXRoTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVHJ1bmNhdGVkUGF0aE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtUcnVuY2F0ZWRQYXRoQ29tcG9uZW50XSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGV4cG9ydHM6IFtUcnVuY2F0ZWRQYXRoQ29tcG9uZW50XSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9tZXRyaWNzL3ZpZXdzL2NhcmRfcmVuZGVyZXIvcnVuX25hbWVfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFJ1bk5hbWVNb2R1bGUgewogICAgfQogICAgUnVuTmFtZU1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbUnVuTmFtZUNvbnRhaW5lciwgUnVuTmFtZUNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW1J1bk5hbWVDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJ1bk5hbWVNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBSdW5OYW1lTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJ1bk5hbWVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBSdW5OYW1lTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJ1bk5hbWVNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShSdW5OYW1lTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1J1bk5hbWVDb250YWluZXIsIFJ1bk5hbWVDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwgZXhwb3J0czogW1J1bk5hbWVDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9oaXN0b2dyYW1fY2FyZF9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSGlzdG9ncmFtQ2FyZE1vZHVsZSB7CiAgICB9CiAgICBIaXN0b2dyYW1DYXJkTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtIaXN0b2dyYW1DYXJkQ29udGFpbmVyLCBIaXN0b2dyYW1DYXJkQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbSGlzdG9ncmFtQ2FyZENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEhpc3RvZ3JhbU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJlc2l6ZURldGVjdG9yTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBSdW5OYW1lTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBUcnVuY2F0ZWRQYXRoTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGlzdG9ncmFtQ2FyZE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEhpc3RvZ3JhbUNhcmRNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGlzdG9ncmFtQ2FyZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEhpc3RvZ3JhbUNhcmRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgSGlzdG9ncmFtQ2FyZE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIEhpc3RvZ3JhbU1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBSZXNpemVEZXRlY3Rvck1vZHVsZSwKICAgICAgICAgICAgICAgIFJ1bk5hbWVNb2R1bGUsCiAgICAgICAgICAgICAgICBUcnVuY2F0ZWRQYXRoTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEhpc3RvZ3JhbUNhcmRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbSGlzdG9ncmFtQ2FyZENvbnRhaW5lciwgSGlzdG9ncmFtQ2FyZENvbXBvbmVudF0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIEhpc3RvZ3JhbU1vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsCiAgICAgICAgICAgIFJlc2l6ZURldGVjdG9yTW9kdWxlLAogICAgICAgICAgICBSdW5OYW1lTW9kdWxlLAogICAgICAgICAgICBUcnVuY2F0ZWRQYXRoTW9kdWxlXSwgZXhwb3J0czogW0hpc3RvZ3JhbUNhcmRDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvY2FyZF9yZW5kZXJlci9pbWFnZV9jYXJkX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBJbWFnZUNhcmRNb2R1bGUgewogICAgfQogICAgSW1hZ2VDYXJkTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtJbWFnZUNhcmRDb250YWluZXIsIEltYWdlQ2FyZENvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0ltYWdlQ2FyZENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0UHJvZ3Jlc3NTcGlubmVyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRTbGlkZXJNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJ1bk5hbWVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFRydW5jYXRlZFBhdGhNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBJbWFnZUNhcmRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBJbWFnZUNhcmRNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW1hZ2VDYXJkTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gSW1hZ2VDYXJkTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEltYWdlQ2FyZE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRTbGlkZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBSdW5OYW1lTW9kdWxlLAogICAgICAgICAgICAgICAgVHJ1bmNhdGVkUGF0aE1vZHVsZSwKICAgICAgICAgICAgXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShJbWFnZUNhcmRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbSW1hZ2VDYXJkQ29udGFpbmVyLCBJbWFnZUNhcmRDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwKICAgICAgICAgICAgTWF0U2xpZGVyTW9kdWxlLAogICAgICAgICAgICBSdW5OYW1lTW9kdWxlLAogICAgICAgICAgICBUcnVuY2F0ZWRQYXRoTW9kdWxlXSwgZXhwb3J0czogW0ltYWdlQ2FyZENvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvd2lkZ2V0cy9saW5lX2NoYXJ0L2xpbmVfY2hhcnRfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIExpbmVDaGFydE1vZHVsZSB7CiAgICB9CiAgICBMaW5lQ2hhcnRNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0xpbmVDaGFydENvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0xpbmVDaGFydENvbXBvbmVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGluZUNoYXJ0TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTGluZUNoYXJ0TW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIExpbmVDaGFydE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIExpbmVDaGFydE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMaW5lQ2hhcnRNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShMaW5lQ2hhcnRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTGluZUNoYXJ0Q29tcG9uZW50XSwgZXhwb3J0czogW0xpbmVDaGFydENvbXBvbmVudF0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9jYXJkX3JlbmRlcmVyL3NjYWxhcl9jYXJkX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBTY2FsYXJDYXJkTW9kdWxlIHsKICAgIH0KICAgIFNjYWxhckNhcmRNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1NjYWxhckNhcmRDb250YWluZXIsIFNjYWxhckNhcmRDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtTY2FsYXJDYXJkQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTGluZUNoYXJ0TW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdE1lbnVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgUmVzaXplRGV0ZWN0b3JNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFRydW5jYXRlZFBhdGhNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTY2FsYXJDYXJkTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogU2NhbGFyQ2FyZE1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTY2FsYXJDYXJkTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gU2NhbGFyQ2FyZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTY2FsYXJDYXJkTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgTGluZUNoYXJ0TW9kdWxlLAogICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdE1lbnVNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRQcm9ncmVzc1NwaW5uZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBSZXNpemVEZXRlY3Rvck1vZHVsZSwKICAgICAgICAgICAgICAgIFRydW5jYXRlZFBhdGhNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoU2NhbGFyQ2FyZE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtTY2FsYXJDYXJkQ29udGFpbmVyLCBTY2FsYXJDYXJkQ29tcG9uZW50XSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTGluZUNoYXJ0TW9kdWxlLAogICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdE1lbnVNb2R1bGUsCiAgICAgICAgICAgIE1hdFByb2dyZXNzU3Bpbm5lck1vZHVsZSwKICAgICAgICAgICAgUmVzaXplRGV0ZWN0b3JNb2R1bGUsCiAgICAgICAgICAgIFRydW5jYXRlZFBhdGhNb2R1bGVdLCBleHBvcnRzOiBbU2NhbGFyQ2FyZENvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9jYXJkX3JlbmRlcmVyL2NhcmRfcmVuZGVyZXJfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIENhcmRSZW5kZXJlck1vZHVsZSB7CiAgICB9CiAgICBDYXJkUmVuZGVyZXJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0NhcmRMYXp5TG9hZGVyLCBDYXJkVmlld0NvbXBvbmVudCwgQ2FyZFZpZXdDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtDYXJkTGF6eUxvYWRlciwgQ2FyZFZpZXdDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBJbWFnZUNhcmRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckNhcmRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEhpc3RvZ3JhbUNhcmRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBDYXJkUmVuZGVyZXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBDYXJkUmVuZGVyZXJNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQ2FyZFJlbmRlcmVyTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gQ2FyZFJlbmRlcmVyTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IENhcmRSZW5kZXJlck1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIEltYWdlQ2FyZE1vZHVsZSwKICAgICAgICAgICAgICAgIFNjYWxhckNhcmRNb2R1bGUsCiAgICAgICAgICAgICAgICBIaXN0b2dyYW1DYXJkTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKENhcmRSZW5kZXJlck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtDYXJkTGF6eUxvYWRlciwgQ2FyZFZpZXdDb21wb25lbnQsIENhcmRWaWV3Q29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgSW1hZ2VDYXJkTW9kdWxlLAogICAgICAgICAgICBTY2FsYXJDYXJkTW9kdWxlLAogICAgICAgICAgICBIaXN0b2dyYW1DYXJkTW9kdWxlXSwgZXhwb3J0czogW0NhcmRMYXp5TG9hZGVyLCBDYXJkVmlld0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgY29uc3QgX2MwJHMgPSBbImJ1dHRvbiJdOwogICAgY29uc3QgX2MxJGkgPSBbIioiXTsKICAgIC8qKgogICAgICogSW5qZWN0aW9uIHRva2VuIHRoYXQgY2FuIGJlIHVzZWQgdG8gY29uZmlndXJlIHRoZQogICAgICogZGVmYXVsdCBvcHRpb25zIGZvciBhbGwgYnV0dG9uIHRvZ2dsZXMgd2l0aGluIGFuIGFwcC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfQlVUVE9OX1RPR0dMRV9ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ01BVF9CVVRUT05fVE9HR0xFX0RFRkFVTFRfT1BUSU9OUycpOwogICAgLyoqCiAgICAgKiBQcm92aWRlciBFeHByZXNzaW9uIHRoYXQgYWxsb3dzIG1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIHRvIHJlZ2lzdGVyIGFzIGEgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgKiBUaGlzIGFsbG93cyBpdCB0byBzdXBwb3J0IFsobmdNb2RlbCldLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfQlVUVE9OX1RPR0dMRV9HUk9VUF9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBNYXRCdXR0b25Ub2dnbGVHcm91cCkpLAogICAgICAgIG11bHRpOiB0cnVlCiAgICB9OwogICAgLyoqCiAgICAgKiBAZGVwcmVjYXRlZCBVc2UgYE1hdEJ1dHRvblRvZ2dsZUdyb3VwYCBpbnN0ZWFkLgogICAgICogXEBicmVha2luZy1jaGFuZ2UgOC4wLjAKICAgICAqLwogICAgY2xhc3MgTWF0QnV0dG9uVG9nZ2xlR3JvdXBNdWx0aXBsZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgX3VuaXF1ZUlkQ291bnRlciQxID0gMDsKICAgIC8qKgogICAgICogQ2hhbmdlIGV2ZW50IG9iamVjdCBlbWl0dGVkIGJ5IE1hdEJ1dHRvblRvZ2dsZS4KICAgICAqLwogICAgY2xhc3MgTWF0QnV0dG9uVG9nZ2xlQ2hhbmdlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBFeGNsdXNpdmUgc2VsZWN0aW9uIGJ1dHRvbiB0b2dnbGUgZ3JvdXAgdGhhdCBiZWhhdmVzIGxpa2UgYSByYWRpby1idXR0b24gZ3JvdXAuCiAgICAgKi8KICAgIGNsYXNzIE1hdEJ1dHRvblRvZ2dsZUdyb3VwIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9jaGFuZ2VEZXRlY3RvcgogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmF1bHRPcHRpb25zCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2NoYW5nZURldGVjdG9yLCBkZWZhdWx0T3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvciA9IF9jaGFuZ2VEZXRlY3RvcjsKICAgICAgICAgICAgdGhpcy5fdmVydGljYWwgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fbXVsdGlwbGUgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBtZXRob2QgdG8gYmUgY2FsbGVkIGluIG9yZGVyIHRvIHVwZGF0ZSBuZ01vZGVsLgogICAgICAgICAgICAgKiBOb3cgYG5nTW9kZWxgIGJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCBpbiBtdWx0aXBsZSBzZWxlY3Rpb24gbW9kZS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4gPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogb25Ub3VjaCBmdW5jdGlvbiByZWdpc3RlcmVkIHZpYSByZWdpc3Rlck9uVG91Y2ggKENvbnRyb2xWYWx1ZUFjY2Vzc29yKS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgICAgIHRoaXMuX25hbWUgPSBgbWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtJHtfdW5pcXVlSWRDb3VudGVyJDErK31gOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgdmFsdWUgb2YgdGhlIGdyb3VwIGNoYW5nZXMuCiAgICAgICAgICAgICAqIFVzZWQgdG8gZmFjaWxpdGF0ZSB0d28td2F5IGRhdGEgYmluZGluZy4KICAgICAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFdmVudCBlbWl0dGVkIHdoZW4gdGhlIGdyb3VwJ3MgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmFwcGVhcmFuY2UgPQogICAgICAgICAgICAgICAgZGVmYXVsdE9wdGlvbnMgJiYgZGVmYXVsdE9wdGlvbnMuYXBwZWFyYW5jZSA/IGRlZmF1bHRPcHRpb25zLmFwcGVhcmFuY2UgOiAnc3RhbmRhcmQnOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBgbmFtZWAgYXR0cmlidXRlIGZvciB0aGUgdW5kZXJseWluZyBgaW5wdXRgIGVsZW1lbnQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgbmFtZSgpIHsgcmV0dXJuIHRoaXMuX25hbWU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgbmFtZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9uYW1lID0gdmFsdWU7CiAgICAgICAgICAgIGlmICh0aGlzLl9idXR0b25Ub2dnbGVzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9idXR0b25Ub2dnbGVzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIHRvZ2dsZSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlLm5hbWUgPSB0aGlzLl9uYW1lOwogICAgICAgICAgICAgICAgICAgIHRvZ2dsZS5fbWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgdG9nZ2xlIGdyb3VwIGlzIHZlcnRpY2FsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZlcnRpY2FsKCkgeyByZXR1cm4gdGhpcy5fdmVydGljYWw7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgdmVydGljYWwodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fdmVydGljYWwgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBWYWx1ZSBvZiB0aGUgdG9nZ2xlIGdyb3VwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwgPyB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCA6IFtdOwogICAgICAgICAgICBpZiAodGhpcy5tdWx0aXBsZSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHNlbGVjdGVkLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHRvZ2dsZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgdG9nZ2xlID0+IHRvZ2dsZS52YWx1ZSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBzZWxlY3RlZFswXSA/IHNlbGVjdGVkWzBdLnZhbHVlIDogdW5kZWZpbmVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgdmFsdWUobmV3VmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fc2V0U2VsZWN0aW9uQnlWYWx1ZShuZXdWYWx1ZSk7CiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2VsZWN0ZWQgYnV0dG9uIHRvZ2dsZXMgaW4gdGhlIGdyb3VwLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5fc2VsZWN0aW9uTW9kZWwgPyB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCA6IFtdOwogICAgICAgICAgICByZXR1cm4gdGhpcy5tdWx0aXBsZSA/IHNlbGVjdGVkIDogKHNlbGVjdGVkWzBdIHx8IG51bGwpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIG11bHRpcGxlIGJ1dHRvbiB0b2dnbGVzIGNhbiBiZSBzZWxlY3RlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtdWx0aXBsZSgpIHsgcmV0dXJuIHRoaXMuX211bHRpcGxlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG11bHRpcGxlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBtdWx0aXBsZSBidXR0b24gdG9nZ2xlIGdyb3VwIGlzIGRpc2FibGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGRpc2FibGVkKCkgeyByZXR1cm4gdGhpcy5fZGlzYWJsZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICBpZiAodGhpcy5fYnV0dG9uVG9nZ2xlcykgewogICAgICAgICAgICAgICAgdGhpcy5fYnV0dG9uVG9nZ2xlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdG9nZ2xlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB0b2dnbGUgPT4gdG9nZ2xlLl9tYXJrRm9yQ2hlY2soKSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsKHRoaXMubXVsdGlwbGUsIHVuZGVmaW5lZCwgZmFsc2UpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KC4uLnRoaXMuX2J1dHRvblRvZ2dsZXMuZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRvZ2dsZSA9PiB0b2dnbGUuY2hlY2tlZCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU2V0cyB0aGUgbW9kZWwgdmFsdWUuIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZSBWYWx1ZSB0byBiZSBzZXQgdG8gdGhlIG1vZGVsLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgd3JpdGVWYWx1ZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25DaGFuZ2UoZm4pIHsKICAgICAgICAgICAgdGhpcy5fY29udHJvbFZhbHVlQWNjZXNzb3JDaGFuZ2VGbiA9IGZuOwogICAgICAgIH0KICAgICAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuOwogICAgICAgIH0KICAgICAgICAvLyBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaXNEaXNhYmxlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0RGlzYWJsZWRTdGF0ZShpc0Rpc2FibGVkKSB7CiAgICAgICAgICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEaXNwYXRjaCBjaGFuZ2UgZXZlbnQgd2l0aCBjdXJyZW50IHNlbGVjdGlvbiBhbmQgZ3JvdXAgdmFsdWUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZW1pdENoYW5nZUV2ZW50KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHNlbGVjdGVkID0gdGhpcy5zZWxlY3RlZDsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBBcnJheS5pc0FycmF5KHNlbGVjdGVkKSA/IHNlbGVjdGVkW3NlbGVjdGVkLmxlbmd0aCAtIDFdIDogc2VsZWN0ZWQ7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZXZlbnQgPSBuZXcgTWF0QnV0dG9uVG9nZ2xlQ2hhbmdlKCgvKiogQHR5cGUgez99ICovIChzb3VyY2UpKSwgdGhpcy52YWx1ZSk7CiAgICAgICAgICAgIHRoaXMuX2NvbnRyb2xWYWx1ZUFjY2Vzc29yQ2hhbmdlRm4oZXZlbnQudmFsdWUpOwogICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KGV2ZW50KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU3luY3MgYSBidXR0b24gdG9nZ2xlJ3Mgc2VsZWN0ZWQgc3RhdGUgd2l0aCB0aGUgbW9kZWwgdmFsdWUuCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGUgVG9nZ2xlIHRvIGJlIHN5bmNlZC4KICAgICAgICAgKiBAcGFyYW0gez99IHNlbGVjdCBXaGV0aGVyIHRoZSB0b2dnbGUgc2hvdWxkIGJlIHNlbGVjdGVkLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzVXNlcklucHV0IFdoZXRoZXIgdGhlIGNoYW5nZSB3YXMgYSByZXN1bHQgb2YgYSB1c2VyIGludGVyYWN0aW9uLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGRlZmVyRXZlbnRzIFdoZXRoZXIgdG8gZGVmZXIgZW1pdHRpbmcgdGhlIGNoYW5nZSBldmVudHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc3luY0J1dHRvblRvZ2dsZSh0b2dnbGUsIHNlbGVjdCwgaXNVc2VySW5wdXQgPSBmYWxzZSwgZGVmZXJFdmVudHMgPSBmYWxzZSkgewogICAgICAgICAgICAvLyBEZXNlbGVjdCB0aGUgY3VycmVudGx5LXNlbGVjdGVkIHRvZ2dsZSwgaWYgd2UncmUgaW4gc2luZ2xlLXNlbGVjdGlvbgogICAgICAgICAgICAvLyBtb2RlIGFuZCB0aGUgYnV0dG9uIGJlaW5nIHRvZ2dsZWQgaXNuJ3Qgc2VsZWN0ZWQgYXQgdGhlIG1vbWVudC4KICAgICAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlICYmIHRoaXMuc2VsZWN0ZWQgJiYgIXRvZ2dsZS5jaGVja2VkKSB7CiAgICAgICAgICAgICAgICAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuc2VsZWN0ZWQpKSkuY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9zZWxlY3Rpb25Nb2RlbCkgewogICAgICAgICAgICAgICAgaWYgKHNlbGVjdCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdCh0b2dnbGUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuZGVzZWxlY3QodG9nZ2xlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGRlZmVyRXZlbnRzID0gdHJ1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIGluIHNvbWUgY2FzZXMgaW4gb3JkZXIgdG8gYXZvaWQgImNoYW5nZWQgYWZ0ZXIgY2hlY2tlZCBlcnJvcnMiLCBob3dldmVyCiAgICAgICAgICAgIC8vIHRoZSBzaWRlLWVmZmVjdCBpcyB0aGF0IHdlIG1heSBlbmQgdXAgdXBkYXRpbmcgdGhlIG1vZGVsIHZhbHVlIG91dCBvZiBzZXF1ZW5jZSBpbiBvdGhlcnMKICAgICAgICAgICAgLy8gVGhlIGBkZWZlckV2ZW50c2AgZmxhZyBhbGxvd3MgdXMgdG8gZGVjaWRlIHdoZXRoZXIgdG8gZG8gaXQgb24gYSBjYXNlLWJ5LWNhc2UgYmFzaXMuCiAgICAgICAgICAgIGlmIChkZWZlckV2ZW50cykgewogICAgICAgICAgICAgICAgUHJvbWlzZS5yZXNvbHZlKCkudGhlbigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB0aGlzLl91cGRhdGVNb2RlbFZhbHVlKGlzVXNlcklucHV0KSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTW9kZWxWYWx1ZShpc1VzZXJJbnB1dCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2tzIHdoZXRoZXIgYSBidXR0b24gdG9nZ2xlIGlzIHNlbGVjdGVkLgogICAgICAgICAqIEBwYXJhbSB7P30gdG9nZ2xlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNTZWxlY3RlZCh0b2dnbGUpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbk1vZGVsICYmIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQodG9nZ2xlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRGV0ZXJtaW5lcyB3aGV0aGVyIGEgYnV0dG9uIHRvZ2dsZSBzaG91bGQgYmUgY2hlY2tlZCBvbiBpbml0LgogICAgICAgICAqIEBwYXJhbSB7P30gdG9nZ2xlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaXNQcmVjaGVja2VkKHRvZ2dsZSkgewogICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMuX3Jhd1ZhbHVlID09PSAndW5kZWZpbmVkJykgewogICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIEFycmF5LmlzQXJyYXkodGhpcy5fcmF3VmFsdWUpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fcmF3VmFsdWUuc29tZSgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICB2YWx1ZSA9PiB0b2dnbGUudmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA9PT0gdG9nZ2xlLnZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHRvZ2dsZS52YWx1ZSA9PT0gdGhpcy5fcmF3VmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVwZGF0ZXMgdGhlIHNlbGVjdGlvbiBzdGF0ZSBvZiB0aGUgdG9nZ2xlcyBpbiB0aGUgZ3JvdXAgYmFzZWQgb24gYSB2YWx1ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3Jhd1ZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIGlmICghdGhpcy5fYnV0dG9uVG9nZ2xlcykgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLm11bHRpcGxlICYmIHZhbHVlKSB7CiAgICAgICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoJ1ZhbHVlIG11c3QgYmUgYW4gYXJyYXkgaW4gbXVsdGlwbGUtc2VsZWN0aW9uIG1vZGUuJyk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jbGVhclNlbGVjdGlvbigpOwogICAgICAgICAgICAgICAgdmFsdWUuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGN1cnJlbnRWYWx1ZQogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGN1cnJlbnRWYWx1ZSkgPT4gdGhpcy5fc2VsZWN0VmFsdWUoY3VycmVudFZhbHVlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fY2xlYXJTZWxlY3Rpb24oKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdFZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDbGVhcnMgdGhlIHNlbGVjdGVkIHRvZ2dsZXMuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9jbGVhclNlbGVjdGlvbigpIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5fYnV0dG9uVG9nZ2xlcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRvZ2dsZSA9PiB0b2dnbGUuY2hlY2tlZCA9IGZhbHNlKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlbGVjdHMgYSB2YWx1ZSBpZiB0aGVyZSdzIGEgdG9nZ2xlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2VsZWN0VmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3JyZXNwb25kaW5nT3B0aW9uID0gdGhpcy5fYnV0dG9uVG9nZ2xlcy5maW5kKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGUKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRvZ2dsZSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdG9nZ2xlLnZhbHVlICE9IG51bGwgJiYgdG9nZ2xlLnZhbHVlID09PSB2YWx1ZTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAoY29ycmVzcG9uZGluZ09wdGlvbikgewogICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZ09wdGlvbi5jaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdChjb3JyZXNwb25kaW5nT3B0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBTeW5jcyB1cCB0aGUgZ3JvdXAncyB2YWx1ZSB3aXRoIHRoZSBtb2RlbCBhbmQgZW1pdHMgdGhlIGNoYW5nZSBldmVudC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaXNVc2VySW5wdXQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVNb2RlbFZhbHVlKGlzVXNlcklucHV0KSB7CiAgICAgICAgICAgIC8vIE9ubHkgZW1pdCB0aGUgY2hhbmdlIGV2ZW50IGZvciB1c2VyIGlucHV0LgogICAgICAgICAgICBpZiAoaXNVc2VySW5wdXQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGFuZ2VFdmVudCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIE5vdGU6IHdlIGVtaXQgdGhpcyBvbmUgbm8gbWF0dGVyIHdoZXRoZXIgaXQgd2FzIGEgdXNlciBpbnRlcmFjdGlvbiwgYmVjYXVzZQogICAgICAgICAgICAvLyBpdCBpcyB1c2VkIGJ5IEFuZ3VsYXIgdG8gc3luYyB1cCB0aGUgdHdvLXdheSBkYXRhIGJpbmRpbmcuCiAgICAgICAgICAgIHRoaXMudmFsdWVDaGFuZ2UuZW1pdCh0aGlzLnZhbHVlKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRCdXR0b25Ub2dnbGVHcm91cC7JtWZhYyA9IGZ1bmN0aW9uIE1hdEJ1dHRvblRvZ2dsZUdyb3VwX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEJ1dHRvblRvZ2dsZUdyb3VwKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfQlVUVE9OX1RPR0dMRV9ERUZBVUxUX09QVElPTlMsIDgpKTsgfTsKICAgIE1hdEJ1dHRvblRvZ2dsZUdyb3VwLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdEJ1dHRvblRvZ2dsZUdyb3VwLCBzZWxlY3RvcnM6IFtbIm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwIl1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0QnV0dG9uVG9nZ2xlR3JvdXBfQ29udGVudFF1ZXJpZXMocmYsIGN0eCwgZGlySW5kZXgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRCdXR0b25Ub2dnbGUsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2J1dHRvblRvZ2dsZXMgPSBfdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsicm9sZSIsICJncm91cCIsIDEsICJtYXQtYnV0dG9uLXRvZ2dsZS1ncm91cCJdLCBob3N0VmFyczogNSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRCdXR0b25Ub2dnbGVHcm91cF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhdHRyaWJ1dGUoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbCIsIGN0eC52ZXJ0aWNhbCkoIm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQiLCBjdHguYXBwZWFyYW5jZSA9PT0gInN0YW5kYXJkIik7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgYXBwZWFyYW5jZTogImFwcGVhcmFuY2UiLCBuYW1lOiAibmFtZSIsIHZlcnRpY2FsOiAidmVydGljYWwiLCB2YWx1ZTogInZhbHVlIiwgbXVsdGlwbGU6ICJtdWx0aXBsZSIsIGRpc2FibGVkOiAiZGlzYWJsZWQiIH0sIG91dHB1dHM6IHsgdmFsdWVDaGFuZ2U6ICJ2YWx1ZUNoYW5nZSIsIGNoYW5nZTogImNoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0QnV0dG9uVG9nZ2xlR3JvdXAiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbCiAgICAgICAgICAgICAgICBNQVRfQlVUVE9OX1RPR0dMRV9HUk9VUF9WQUxVRV9BQ0NFU1NPUiwKICAgICAgICAgICAgICAgIHsgcHJvdmlkZTogTWF0QnV0dG9uVG9nZ2xlR3JvdXBNdWx0aXBsZSwgdXNlRXhpc3Rpbmc6IE1hdEJ1dHRvblRvZ2dsZUdyb3VwIH0sCiAgICAgICAgICAgIF0pXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0QnV0dG9uVG9nZ2xlR3JvdXAuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBDaGFuZ2VEZXRlY3RvclJlZiB9LAogICAgICAgIHsgdHlwZTogdW5kZWZpbmVkLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9LCB7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9CVVRUT05fVE9HR0xFX0RFRkFVTFRfT1BUSU9OUyxdIH1dIH0KICAgIF07CiAgICBNYXRCdXR0b25Ub2dnbGVHcm91cC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBfYnV0dG9uVG9nZ2xlczogW3sgdHlwZTogQ29udGVudENoaWxkcmVuLCBhcmdzOiBbZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiBNYXRCdXR0b25Ub2dnbGUpKSwgewogICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyB3b3VsZCB0ZWNobmljYWxseSBwaWNrIHVwIHRvZ2dsZXMKICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnJvbSBuZXN0ZWQgZ3JvdXBzLCBidXQgdGhhdCdzIG5vdCBhIGNhc2UgdGhhdCB3ZSBzdXBwb3J0LgogICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50czogdHJ1ZQogICAgICAgICAgICAgICAgICAgIH0sXSB9XSwKICAgICAgICBhcHBlYXJhbmNlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBuYW1lOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB2ZXJ0aWNhbDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHZhbHVlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgbXVsdGlwbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGRpc2FibGVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gdGhlIE1hdEJ1dHRvblRvZ2dsZSBjbGFzcy4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0QnV0dG9uVG9nZ2xlQmFzZSB7CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0QnV0dG9uVG9nZ2xlTWl4aW5CYXNlID0gbWl4aW5EaXNhYmxlUmlwcGxlKE1hdEJ1dHRvblRvZ2dsZUJhc2UpOwogICAgLyoqCiAgICAgKiBTaW5nbGUgYnV0dG9uIGluc2lkZSBvZiBhIHRvZ2dsZSBncm91cC4KICAgICAqLwogICAgY2xhc3MgTWF0QnV0dG9uVG9nZ2xlIGV4dGVuZHMgX01hdEJ1dHRvblRvZ2dsZU1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB0b2dnbGVHcm91cAogICAgICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2ZvY3VzTW9uaXRvcgogICAgICAgICAqIEBwYXJhbSB7P30gZGVmYXVsdFRhYkluZGV4CiAgICAgICAgICogQHBhcmFtIHs/PX0gZGVmYXVsdE9wdGlvbnMKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcih0b2dnbGVHcm91cCwgX2NoYW5nZURldGVjdG9yUmVmLCBfZWxlbWVudFJlZiwgX2ZvY3VzTW9uaXRvciwgCiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCBgZGVmYXVsdFRhYkluZGV4YCB0byBiZSBtYWRlIGEgcmVxdWlyZWQgcGFyYW1ldGVyLgogICAgICAgIGRlZmF1bHRUYWJJbmRleCwgZGVmYXVsdE9wdGlvbnMpIHsKICAgICAgICAgICAgc3VwZXIoKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICAgICAgdGhpcy5faXNTaW5nbGVTZWxlY3RvciA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBVc2VycyBjYW4gc3BlY2lmeSB0aGUgYGFyaWEtbGFiZWxsZWRieWAgYXR0cmlidXRlIHdoaWNoIHdpbGwgYmUgZm9yd2FyZGVkIHRvIHRoZSBpbnB1dCBlbGVtZW50CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFyaWFMYWJlbGxlZGJ5ID0gbnVsbDsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEV2ZW50IGVtaXR0ZWQgd2hlbiB0aGUgZ3JvdXAgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHBhcnNlZFRhYkluZGV4ID0gTnVtYmVyKGRlZmF1bHRUYWJJbmRleCk7CiAgICAgICAgICAgIHRoaXMudGFiSW5kZXggPSAocGFyc2VkVGFiSW5kZXggfHwgcGFyc2VkVGFiSW5kZXggPT09IDApID8gcGFyc2VkVGFiSW5kZXggOiBudWxsOwogICAgICAgICAgICB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwID0gdG9nZ2xlR3JvdXA7CiAgICAgICAgICAgIHRoaXMuYXBwZWFyYW5jZSA9CiAgICAgICAgICAgICAgICBkZWZhdWx0T3B0aW9ucyAmJiBkZWZhdWx0T3B0aW9ucy5hcHBlYXJhbmNlID8gZGVmYXVsdE9wdGlvbnMuYXBwZWFyYW5jZSA6ICdzdGFuZGFyZCc7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFVuaXF1ZSBJRCBmb3IgdGhlIHVuZGVybHlpbmcgYGJ1dHRvbmAgZWxlbWVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBidXR0b25JZCgpIHsgcmV0dXJuIGAke3RoaXMuaWR9LWJ1dHRvbmA7IH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXBwZWFyYW5jZSBzdHlsZSBvZiB0aGUgYnV0dG9uLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGFwcGVhcmFuY2UoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwID8gdGhpcy5idXR0b25Ub2dnbGVHcm91cC5hcHBlYXJhbmNlIDogdGhpcy5fYXBwZWFyYW5jZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGFwcGVhcmFuY2UodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fYXBwZWFyYW5jZSA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBidXR0b24gaXMgY2hlY2tlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjaGVja2VkKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5idXR0b25Ub2dnbGVHcm91cCA/IHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX2lzU2VsZWN0ZWQodGhpcykgOiB0aGlzLl9jaGVja2VkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgY2hlY2tlZCh2YWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld1ZhbHVlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgaWYgKG5ld1ZhbHVlICE9PSB0aGlzLl9jaGVja2VkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGVja2VkID0gbmV3VmFsdWU7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5idXR0b25Ub2dnbGVHcm91cCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX3N5bmNCdXR0b25Ub2dnbGUodGhpcywgdGhpcy5fY2hlY2tlZCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBidXR0b24gaXMgZGlzYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAodGhpcy5idXR0b25Ub2dnbGVHcm91cCAmJiB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwLmRpc2FibGVkKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGRpc2FibGVkKHZhbHVlKSB7IHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZ3JvdXAgPSB0aGlzLmJ1dHRvblRvZ2dsZUdyb3VwOwogICAgICAgICAgICB0aGlzLl9pc1NpbmdsZVNlbGVjdG9yID0gZ3JvdXAgJiYgIWdyb3VwLm11bHRpcGxlOwogICAgICAgICAgICB0aGlzLl90eXBlID0gdGhpcy5faXNTaW5nbGVTZWxlY3RvciA/ICdyYWRpbycgOiAnY2hlY2tib3gnOwogICAgICAgICAgICB0aGlzLmlkID0gdGhpcy5pZCB8fCBgbWF0LWJ1dHRvbi10b2dnbGUtJHtfdW5pcXVlSWRDb3VudGVyJDErK31gOwogICAgICAgICAgICBpZiAodGhpcy5faXNTaW5nbGVTZWxlY3RvcikgewogICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gZ3JvdXAubmFtZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAoZ3JvdXApIHsKICAgICAgICAgICAgICAgIGlmIChncm91cC5faXNQcmVjaGVja2VkKHRoaXMpKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKGdyb3VwLl9pc1NlbGVjdGVkKHRoaXMpICE9PSB0aGlzLl9jaGVja2VkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gQXMgYXMgc2lkZSBlZmZlY3Qgb2YgdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kgYmV0d2VlbiB0aGUgdG9nZ2xlIGdyb3VwIGFuZCB0aGUgYnV0dG9uLAogICAgICAgICAgICAgICAgICAgIC8vIHdlIG1heSBlbmQgdXAgaW4gYSBzdGF0ZSB3aGVyZSB0aGUgYnV0dG9uIGlzIHN1cHBvc2VkIHRvIGJlIGNoZWNrZWQgb24gaW5pdCwgYnV0IGl0CiAgICAgICAgICAgICAgICAgICAgLy8gaXNuJ3QsIGJlY2F1c2UgdGhlIGNoZWNrZWQgdmFsdWUgd2FzIGFzc2lnbmVkIHRvbyBlYXJseS4gVGhpcyBjYW4gaGFwcGVuIHdoZW4gSXZ5CiAgICAgICAgICAgICAgICAgICAgLy8gYXNzaWducyB0aGUgc3RhdGljIGlucHV0IHZhbHVlIGJlZm9yZSB0aGUgYG5nT25Jbml0YCBoYXMgcnVuLgogICAgICAgICAgICAgICAgICAgIGdyb3VwLl9zeW5jQnV0dG9uVG9nZ2xlKHRoaXMsIHRoaXMuX2NoZWNrZWQpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRydWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGdyb3VwID0gdGhpcy5idXR0b25Ub2dnbGVHcm91cDsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpOwogICAgICAgICAgICAvLyBSZW1vdmUgdGhlIHRvZ2dsZSBmcm9tIHRoZSBzZWxlY3Rpb24gb25jZSBpdCdzIGRlc3Ryb3llZC4gTmVlZHMgdG8gaGFwcGVuCiAgICAgICAgICAgIC8vIG9uIHRoZSBuZXh0IHRpY2sgaW4gb3JkZXIgdG8gYXZvaWQgImNoYW5nZWQgYWZ0ZXIgY2hlY2tlZCIgZXJyb3JzLgogICAgICAgICAgICBpZiAoZ3JvdXAgJiYgZ3JvdXAuX2lzU2VsZWN0ZWQodGhpcykpIHsKICAgICAgICAgICAgICAgIGdyb3VwLl9zeW5jQnV0dG9uVG9nZ2xlKHRoaXMsIGZhbHNlLCBmYWxzZSwgdHJ1ZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyB0aGUgYnV0dG9uLgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvY3VzKG9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fYnV0dG9uRWxlbWVudC5uYXRpdmVFbGVtZW50LmZvY3VzKG9wdGlvbnMpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDaGVja3MgdGhlIGJ1dHRvbiB0b2dnbGUgZHVlIHRvIGFuIGludGVyYWN0aW9uIHdpdGggdGhlIHVuZGVybHlpbmcgbmF0aXZlIGJ1dHRvbi4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9vbkJ1dHRvbkNsaWNrKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG5ld0NoZWNrZWQgPSB0aGlzLl9pc1NpbmdsZVNlbGVjdG9yID8gdHJ1ZSA6ICF0aGlzLl9jaGVja2VkOwogICAgICAgICAgICBpZiAobmV3Q2hlY2tlZCAhPT0gdGhpcy5fY2hlY2tlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IG5ld0NoZWNrZWQ7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5idXR0b25Ub2dnbGVHcm91cCkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuYnV0dG9uVG9nZ2xlR3JvdXAuX3N5bmNCdXR0b25Ub2dnbGUodGhpcywgdGhpcy5fY2hlY2tlZCwgdHJ1ZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXR0b25Ub2dnbGVHcm91cC5fb25Ub3VjaGVkKCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gRW1pdCBhIGNoYW5nZSBldmVudCB3aGVuIGl0J3MgdGhlIHNpbmdsZSBzZWxlY3RvcgogICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBNYXRCdXR0b25Ub2dnbGVDaGFuZ2UodGhpcywgdGhpcy52YWx1ZSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBNYXJrcyB0aGUgYnV0dG9uIHRvZ2dsZSBhcyBuZWVkaW5nIGNoZWNraW5nIGZvciBjaGFuZ2UgZGV0ZWN0aW9uLgogICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGV4cG9zZWQgYmVjYXVzZSB0aGUgcGFyZW50IGJ1dHRvbiB0b2dnbGUgZ3JvdXAgd2lsbCBkaXJlY3RseQogICAgICAgICAqIHVwZGF0ZSBib3VuZCBwcm9wZXJ0aWVzIG9mIHRoZSByYWRpbyBidXR0b24uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfbWFya0ZvckNoZWNrKCkgewogICAgICAgICAgICAvLyBXaGVuIHRoZSBncm91cCB2YWx1ZSBjaGFuZ2VzLCB0aGUgYnV0dG9uIHdpbGwgbm90IGJlIG5vdGlmaWVkLgogICAgICAgICAgICAvLyBVc2UgYG1hcmtGb3JDaGVja2AgdG8gZXhwbGljaXQgdXBkYXRlIGJ1dHRvbiB0b2dnbGUncyBzdGF0dXMuCiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgIH0KICAgIE1hdEJ1dHRvblRvZ2dsZS7JtWZhYyA9IGZ1bmN0aW9uIE1hdEJ1dHRvblRvZ2dsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRCdXR0b25Ub2dnbGUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0QnV0dG9uVG9nZ2xlR3JvdXAsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChGb2N1c01vbml0b3IpLCDJtcm1aW5qZWN0QXR0cmlidXRlKCd0YWJpbmRleCcpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE1BVF9CVVRUT05fVE9HR0xFX0RFRkFVTFRfT1BUSU9OUywgOCkpOyB9OwogICAgTWF0QnV0dG9uVG9nZ2xlLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdEJ1dHRvblRvZ2dsZSwgc2VsZWN0b3JzOiBbWyJtYXQtYnV0dG9uLXRvZ2dsZSJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBNYXRCdXR0b25Ub2dnbGVfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2MwJHMsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguX2J1dHRvbkVsZW1lbnQgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsxLCAibWF0LWJ1dHRvbi10b2dnbGUiXSwgaG9zdFZhcnM6IDExLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdEJ1dHRvblRvZ2dsZV9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiZm9jdXMiLCBmdW5jdGlvbiBNYXRCdXR0b25Ub2dnbGVfZm9jdXNfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4LmZvY3VzKCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ0YWJpbmRleCIsIDAgLSAxKSgiaWQiLCBjdHguaWQpKCJuYW1lIiwgbnVsbCk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUiLCAhY3R4LmJ1dHRvblRvZ2dsZUdyb3VwKSgibWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZCIsIGN0eC5jaGVja2VkKSgibWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkIiwgY3R4LmFwcGVhcmFuY2UgPT09ICJzdGFuZGFyZCIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVSaXBwbGU6ICJkaXNhYmxlUmlwcGxlIiwgYXJpYUxhYmVsbGVkYnk6IFsiYXJpYS1sYWJlbGxlZGJ5IiwgImFyaWFMYWJlbGxlZGJ5Il0sIHRhYkluZGV4OiAidGFiSW5kZXgiLCBhcHBlYXJhbmNlOiAiYXBwZWFyYW5jZSIsIGNoZWNrZWQ6ICJjaGVja2VkIiwgZGlzYWJsZWQ6ICJkaXNhYmxlZCIsIGlkOiAiaWQiLCBuYW1lOiAibmFtZSIsIGFyaWFMYWJlbDogWyJhcmlhLWxhYmVsIiwgImFyaWFMYWJlbCJdLCB2YWx1ZTogInZhbHVlIiB9LCBvdXRwdXRzOiB7IGNoYW5nZTogImNoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0QnV0dG9uVG9nZ2xlIl0sIGZlYXR1cmVzOiBbybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MxJGksIGRlY2xzOiA2LCB2YXJzOiA5LCBjb25zdHM6IFtbInR5cGUiLCAiYnV0dG9uIiwgMSwgIm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbiIsICJtYXQtZm9jdXMtaW5kaWNhdG9yIiwgMywgImlkIiwgImRpc2FibGVkIiwgImNsaWNrIl0sIFsiYnV0dG9uIiwgIiJdLCBbMSwgIm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnQiXSwgWzEsICJtYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5Il0sIFsibWF0UmlwcGxlIiwgIiIsIDEsICJtYXQtYnV0dG9uLXRvZ2dsZS1yaXBwbGUiLCAzLCAibWF0UmlwcGxlVHJpZ2dlciIsICJtYXRSaXBwbGVEaXNhYmxlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdEJ1dHRvblRvZ2dsZV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXByb2plY3Rpb25EZWYoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiYnV0dG9uIiwgMCwgMSk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRCdXR0b25Ub2dnbGVfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguX29uQnV0dG9uQ2xpY2soKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbigzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNCwgImRpdiIsIDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg1LCAiZGl2IiwgNCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMCA9IMm1ybVyZWZlcmVuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiaWQiLCBjdHguYnV0dG9uSWQpKCJkaXNhYmxlZCIsIGN0eC5kaXNhYmxlZCB8fCBudWxsKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidGFiaW5kZXgiLCBjdHguZGlzYWJsZWQgPyAwIC0gMSA6IGN0eC50YWJJbmRleCkoImFyaWEtcHJlc3NlZCIsIGN0eC5jaGVja2VkKSgibmFtZSIsIGN0eC5uYW1lIHx8IG51bGwpKCJhcmlhLWxhYmVsIiwgY3R4LmFyaWFMYWJlbCkoImFyaWEtbGFiZWxsZWRieSIsIGN0eC5hcmlhTGFiZWxsZWRieSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDUpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1hdFJpcHBsZVRyaWdnZXIiLCBfcjApKCJtYXRSaXBwbGVEaXNhYmxlZCIsIGN0eC5kaXNhYmxlUmlwcGxlIHx8IGN0eC5kaXNhYmxlZCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0UmlwcGxlXSwgc3R5bGVzOiBbIi5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cHtwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmlubGluZS1mbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdzt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO2JvcmRlci1yYWRpdXM6MnB4Oy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3Vwe291dGxpbmU6c29saWQgMXB4fS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQsLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7Ym9yZGVyLXJhZGl1czo0cHh9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmR7b3V0bGluZTowfS5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbHtmbGV4LWRpcmVjdGlvbjpjb2x1bW59Lm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsIC5tYXQtYnV0dG9uLXRvZ2dsZS1sYWJlbC1jb250ZW50e2Rpc3BsYXk6YmxvY2t9Lm1hdC1idXR0b24tdG9nZ2xle3doaXRlLXNwYWNlOm5vd3JhcDtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJ1dHRvbi10b2dnbGUgLm1hdC1pY29uIHN2Z3t2ZXJ0aWNhbC1hbGlnbjp0b3B9Lm1hdC1idXR0b24tdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6MX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtvcGFjaXR5Oi41fS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjA0fS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e29wYWNpdHk6LjEyfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCkgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouNX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkOm5vdCgubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQpOmhvdmVyIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5e2Rpc3BsYXk6bm9uZX19Lm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7LXdlYmtpdC11c2VyLXNlbGVjdDpub25lOy1tb3otdXNlci1zZWxlY3Q6bm9uZTstbXMtdXNlci1zZWxlY3Q6bm9uZTt1c2VyLXNlbGVjdDpub25lO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2xpbmUtaGVpZ2h0OjM2cHg7cGFkZGluZzowIDE2cHg7cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWxhYmVsLWNvbnRlbnR7bGluZS1oZWlnaHQ6NDhweDtwYWRkaW5nOjAgMTJweH0ubWF0LWJ1dHRvbi10b2dnbGUtbGFiZWwtY29udGVudD4qe3ZlcnRpY2FsLWFsaWduOm1pZGRsZX0ubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtib3JkZXItcmFkaXVzOmluaGVyaXQ7cG9pbnRlci1ldmVudHM6bm9uZTtvcGFjaXR5OjA7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGV9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7Ym9yZGVyLWJvdHRvbTpzb2xpZCAzNnB4fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7b3BhY2l0eTouNTtoZWlnaHQ6MH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXl7Ym9yZGVyLWJvdHRvbTpzb2xpZCA0OHB4fS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtcmlwcGxle3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlLWJ1dHRvbntib3JkZXI6MDtiYWNrZ3JvdW5kOm5vbmU7Y29sb3I6aW5oZXJpdDtwYWRkaW5nOjA7bWFyZ2luOjA7Zm9udDppbmhlcml0O291dGxpbmU6bm9uZTt3aWR0aDoxMDAlO2N1cnNvcjpwb2ludGVyfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZCAubWF0LWJ1dHRvbi10b2dnbGUtYnV0dG9ue2N1cnNvcjpkZWZhdWx0fS5tYXQtYnV0dG9uLXRvZ2dsZS1idXR0b246Oi1tb3otZm9jdXMtaW5uZXJ7Ym9yZGVyOjB9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRCdXR0b25Ub2dnbGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBNYXRCdXR0b25Ub2dnbGVHcm91cCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfV0gfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogQXR0cmlidXRlLCBhcmdzOiBbJ3RhYmluZGV4JyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0JVVFRPTl9UT0dHTEVfREVGQVVMVF9PUFRJT05TLF0gfV0gfQogICAgXTsKICAgIE1hdEJ1dHRvblRvZ2dsZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICAgICAgYXJpYUxhYmVsbGVkYnk6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWxsZWRieScsXSB9XSwKICAgICAgICBfYnV0dG9uRWxlbWVudDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ2J1dHRvbicsXSB9XSwKICAgICAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgdmFsdWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhcHBlYXJhbmNlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjaGVja2VkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiBzcmMvbWF0ZXJpYWwvYnV0dG9uLXRvZ2dsZS9idXR0b24tdG9nZ2xlLW1vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYXRCdXR0b25Ub2dnbGVNb2R1bGUgewogICAgfQogICAgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0QnV0dG9uVG9nZ2xlTW9kdWxlIH0pOwogICAgTWF0QnV0dG9uVG9nZ2xlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWF0QnV0dG9uVG9nZ2xlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdEJ1dHRvblRvZ2dsZU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tNYXRDb21tb25Nb2R1bGUsIE1hdFJpcHBsZU1vZHVsZV0sCiAgICAgICAgICAgIE1hdENvbW1vbk1vZHVsZV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRCdXR0b25Ub2dnbGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0QnV0dG9uVG9nZ2xlR3JvdXAsCiAgICAgICAgICAgIE1hdEJ1dHRvblRvZ2dsZV07IH0sIGltcG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRDb21tb25Nb2R1bGUsIE1hdFJpcHBsZU1vZHVsZV07IH0sIGV4cG9ydHM6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIFtNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvblRvZ2dsZUdyb3VwLAogICAgICAgICAgICBNYXRCdXR0b25Ub2dnbGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3dpZGdldHMvZHJvcGRvd24vZHJvcGRvd25fbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIERyb3Bkb3duTW9kdWxlIHsKICAgIH0KICAgIERyb3Bkb3duTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtEcm9wZG93bkNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0Ryb3Bkb3duQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGVdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIERyb3Bkb3duTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogRHJvcGRvd25Nb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRHJvcGRvd25Nb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBEcm9wZG93bk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBEcm9wZG93bk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIE1hdFNlbGVjdE1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoRHJvcGRvd25Nb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbRHJvcGRvd25Db21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRTZWxlY3RNb2R1bGVdLCBleHBvcnRzOiBbRHJvcGRvd25Db21wb25lbnRdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvcmlnaHRfcGFuZS9yaWdodF9wYW5lX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSaWdodFBhbmVNb2R1bGUgewogICAgfQogICAgUmlnaHRQYW5lTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgUmlnaHRQYW5lQ29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5nc1ZpZXdDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNldHRpbmdzVmlld0NvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtSaWdodFBhbmVDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBEcm9wZG93bk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdENoZWNrYm94TW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRTZWxlY3RNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdFNsaWRlck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJpZ2h0UGFuZU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFJpZ2h0UGFuZU1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSaWdodFBhbmVNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBSaWdodFBhbmVNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmlnaHRQYW5lTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgRHJvcGRvd25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRTZWxlY3RNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRTbGlkZXJNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoUmlnaHRQYW5lTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1JpZ2h0UGFuZUNvbXBvbmVudCwKICAgICAgICAgICAgU2V0dGluZ3NWaWV3Q29tcG9uZW50LAogICAgICAgICAgICBTZXR0aW5nc1ZpZXdDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBEcm9wZG93bk1vZHVsZSwKICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICBNYXRCdXR0b25Ub2dnbGVNb2R1bGUsCiAgICAgICAgICAgIE1hdENoZWNrYm94TW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICBNYXRTZWxlY3RNb2R1bGUsCiAgICAgICAgICAgIE1hdFNsaWRlck1vZHVsZV0sIGV4cG9ydHM6IFtSaWdodFBhbmVDb21wb25lbnRdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21ldHJpY3Mvdmlld3MvbWFpbl92aWV3L21haW5fdmlld19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWFpblZpZXdNb2R1bGUgewogICAgfQogICAgTWFpblZpZXdNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogWwogICAgICAgICAgICAgICAgICAgICAgICBDYXJkR3JpZENvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZEdyaWRDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIENhcmRHcm91cHNDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIENhcmRHcm91cHNDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIEZpbHRlcmVkVmlld0NvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsdGVyZWRWaWV3Q29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICBNYWluVmlld0NvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgTWFpblZpZXdDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY3NGaWx0ZXJJbnB1dENvbXBvbmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljc0ZpbHRlcklucHV0Q29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRWaWV3Q29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICBQaW5uZWRWaWV3Q29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW01haW5WaWV3Q29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ2FyZFJlbmRlcmVyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SW5wdXRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJpZ2h0UGFuZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1haW5WaWV3TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWFpblZpZXdNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWFpblZpZXdNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNYWluVmlld01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYWluVmlld01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIENhcmRSZW5kZXJlck1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEF1dG9jb21wbGV0ZU1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRJbnB1dE1vZHVsZSwKICAgICAgICAgICAgICAgIFJpZ2h0UGFuZU1vZHVsZSwKICAgICAgICAgICAgXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYWluVmlld01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtDYXJkR3JpZENvbXBvbmVudCwKICAgICAgICAgICAgQ2FyZEdyaWRDb250YWluZXIsCiAgICAgICAgICAgIENhcmRHcm91cHNDb21wb25lbnQsCiAgICAgICAgICAgIENhcmRHcm91cHNDb250YWluZXIsCiAgICAgICAgICAgIEZpbHRlcmVkVmlld0NvbXBvbmVudCwKICAgICAgICAgICAgRmlsdGVyZWRWaWV3Q29udGFpbmVyLAogICAgICAgICAgICBNYWluVmlld0NvbXBvbmVudCwKICAgICAgICAgICAgTWFpblZpZXdDb250YWluZXIsCiAgICAgICAgICAgIE1ldHJpY3NGaWx0ZXJJbnB1dENvbXBvbmVudCwKICAgICAgICAgICAgTWV0cmljc0ZpbHRlcklucHV0Q29udGFpbmVyLAogICAgICAgICAgICBQaW5uZWRWaWV3Q29tcG9uZW50LAogICAgICAgICAgICBQaW5uZWRWaWV3Q29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgQ2FyZFJlbmRlcmVyTW9kdWxlLAogICAgICAgICAgICBNYXRBdXRvY29tcGxldGVNb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgTWF0SW5wdXRNb2R1bGUsCiAgICAgICAgICAgIFJpZ2h0UGFuZU1vZHVsZV0sIGV4cG9ydHM6IFtNYWluVmlld0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy92aWV3cy9tZXRyaWNzX3ZpZXdzX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNZXRyaWNzVmlld3NNb2R1bGUgewogICAgfQogICAgTWV0cmljc1ZpZXdzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTWV0cmljc0Rhc2hib2FyZENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgUmlnaHRQYW5lTW9kdWxlLCBSdW5zU2VsZWN0b3JNb2R1bGUsIE1haW5WaWV3TW9kdWxlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzVmlld3NNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNZXRyaWNzVmlld3NNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljc1ZpZXdzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWV0cmljc1ZpZXdzTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY3NWaWV3c01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIFJpZ2h0UGFuZU1vZHVsZSwgUnVuc1NlbGVjdG9yTW9kdWxlLCBNYWluVmlld01vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWV0cmljc1ZpZXdzTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW01ldHJpY3NEYXNoYm9hcmRDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBSaWdodFBhbmVNb2R1bGUsIFJ1bnNTZWxlY3Rvck1vZHVsZSwgTWFpblZpZXdNb2R1bGVdLCBleHBvcnRzOiBbTWV0cmljc0Rhc2hib2FyZENvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvbWV0cmljcy9tZXRyaWNzX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBDUkVBVEVfUElOX01BWF9FWENFRURFRF9URVhUID0gYE1heCBwaW4gbGltaXQgZXhjZWVkZWQuIFJlbW92ZSBleGlzdGluZ2AgKwogICAgICAgIGAgcGlucyBiZWZvcmUgYWRkaW5nIG1vcmUuIFNlZSBgICsKICAgICAgICBgaHR0cHM6Ly9naXRodWIuY29tL3RlbnNvcmZsb3cvdGVuc29yYm9hcmQvaXNzdWVzLzQyNDJgOwogICAgLy8gTm90ZTogQW5ndWxhciBjYW4gb25seSByZWZlcmVuY2Ugc3ltYm9scyBmcm9tIHRoZSBATmdNb2R1bGUgaWYgdGhleSBhcmUKICAgIC8vIGV4cG9ydGVkLgogICAgLyoqCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBhbGVydEFjdGlvblByb3ZpZGVyJDEoKSB7CiAgICAgICAgcmV0dXJuIFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWN0aW9uQ3JlYXRvcjogY2FyZFBpblN0YXRlVG9nZ2xlZCwKICAgICAgICAgICAgICAgIGFsZXJ0RnJvbUFjdGlvbjogKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChhY3Rpb24pID0+IHsKICAgICAgICAgICAgICAgICAgICBjb25zdCB7IHdhc1Bpbm5lZCwgY2FuQ3JlYXRlTmV3UGlucyB9ID0gKC8qKiBAdHlwZSB7P30gKi8gKGFjdGlvbikpOwogICAgICAgICAgICAgICAgICAgIGlmICghd2FzUGlubmVkICYmICFjYW5DcmVhdGVOZXdQaW5zKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGxvY2FsaXplZE1lc3NhZ2U6IENSRUFURV9QSU5fTUFYX0VYQ0VFREVEX1RFWFQgfTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgfSwKICAgICAgICBdOwogICAgfQogICAgY2xhc3MgTWV0cmljc01vZHVsZSB7CiAgICB9CiAgICBNZXRyaWNzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgUnVuc1NlbGVjdG9yTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5SZWdpc3RyeU1vZHVsZS5mb3JQbHVnaW4oTUVUUklDU19QTFVHSU5fSUQsIE1ldHJpY3NEYXNoYm9hcmRDb250YWluZXIpLAogICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNzRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljc1ZpZXdzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JGZWF0dXJlKE1FVFJJQ1NfRkVBVFVSRV9LRVksIHJlZHVjZXJzJDcpLAogICAgICAgICAgICAgICAgICAgICAgICBFZmZlY3RzTW9kdWxlLmZvckZlYXR1cmUoW01ldHJpY3NFZmZlY3RzXSksCiAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0QWN0aW9uTW9kdWxlLnJlZ2lzdGVyQWxlcnRBY3Rpb25zKGFsZXJ0QWN0aW9uUHJvdmlkZXIkMSksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBlbnRyeUNvbXBvbmVudHM6IFtNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWV0cmljc01vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNzTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWV0cmljc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNZXRyaWNzTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgUnVuc1NlbGVjdG9yTW9kdWxlLAogICAgICAgICAgICAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKE1FVFJJQ1NfUExVR0lOX0lELCBNZXRyaWNzRGFzaGJvYXJkQ29udGFpbmVyKSwKICAgICAgICAgICAgICAgIE1ldHJpY3NEYXRhU291cmNlTW9kdWxlLAogICAgICAgICAgICAgICAgTWV0cmljc1ZpZXdzTW9kdWxlLAogICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShNRVRSSUNTX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQ3KSwKICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbTWV0cmljc0VmZmVjdHNdKSwKICAgICAgICAgICAgICAgIEFsZXJ0QWN0aW9uTW9kdWxlLnJlZ2lzdGVyQWxlcnRBY3Rpb25zKGFsZXJ0QWN0aW9uUHJvdmlkZXIkMSksCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWV0cmljc01vZHVsZSwgeyBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLAogICAgICAgICAgICBSdW5zU2VsZWN0b3JNb2R1bGUsIFBsdWdpblJlZ2lzdHJ5TW9kdWxlLCBNZXRyaWNzRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICAgICAgTWV0cmljc1ZpZXdzTW9kdWxlLCBTdG9yZUZlYXR1cmVNb2R1bGUsIEVmZmVjdHNGZWF0dXJlTW9kdWxlLCBBbGVydEFjdGlvbk1vZHVsZV0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2luYWN0aXZlL2luYWN0aXZlX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBJbmFjdGl2ZUNvbXBvbmVudCQxIHsKICAgIH0KICAgIEluYWN0aXZlQ29tcG9uZW50JDEuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktaW5hY3RpdmUtdmlldycsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2luYWN0aXZlX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9pbmFjdGl2ZV9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW5hY3RpdmVDb21wb25lbnQkMS7JtWZhYyA9IGZ1bmN0aW9uIEluYWN0aXZlQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlQ29tcG9uZW50JDEpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW5hY3RpdmVDb21wb25lbnQkMS7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBJbmFjdGl2ZUNvbXBvbmVudCQxLCBzZWxlY3RvcnM6IFtbIm5wbWktaW5hY3RpdmUtdmlldyJdXSwgZGVjbHM6IDYsIHZhcnM6IDAsIGNvbnN0czogW1sxLCAiY29udGFpbmVyIl0sIFsxLCAidGl0bGUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBJbmFjdGl2ZUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMywgIm5QTUkgaXMgaW5hY3RpdmUgYmVjYXVzZSBubyBkYXRhIGlzIGF2YWlsYWJsZS4iKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiZGl2Iik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDUsICIgVG8gdXNlIHRoZSBuUE1JLCBjYWxjdWxhdGUgblBNSSB2YWx1ZXMsIGFuZCBsb2cgdGhlbSB1c2luZyB0aGUgc3VtbWFyeSB3cml0ZXIuICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gfSwgc3R5bGVzOiBbIi5jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICBmb250LWZhbWlseTogUm9ib3RvO1xuICBmb250LXNpemU6IDE1cHg7XG4gIHBhZGRpbmc6IDUwcHg7XG59XG5cbi50aXRsZVtfbmdjb250ZW50LSVDT01QJV0ge1xuICBmb250LXNpemU6IDEzNSU7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBtYXJnaW4tYm90dG9tOiAyNXB4O1xufSJdIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS9zdG9yZS9ucG1pX3R5cGVzLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IE5QTUlfRkVBVFVSRV9LRVkgPSAnbnBtaSc7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IE9wZXJhdG9yID0gewogICAgICAgIEFORDogMCwKICAgIH07CiAgICBPcGVyYXRvcltPcGVyYXRvci5BTkRdID0gJ0FORCc7CiAgICAvKiogQGVudW0ge251bWJlcn0gKi8KICAgIGNvbnN0IEFyaXRobWV0aWNLaW5kID0gewogICAgICAgIE1FVFJJQzogMCwKICAgICAgICBPUEVSQVRPUjogMSwKICAgIH07CiAgICBBcml0aG1ldGljS2luZFtBcml0aG1ldGljS2luZC5NRVRSSUNdID0gJ01FVFJJQyc7CiAgICBBcml0aG1ldGljS2luZFtBcml0aG1ldGljS2luZC5PUEVSQVRPUl0gPSAnT1BFUkFUT1InOwogICAgLyoqIEBlbnVtIHtudW1iZXJ9ICovCiAgICBjb25zdCBTb3J0T3JkZXIgPSB7CiAgICAgICAgRE9XTjogMCwKICAgICAgICBVUDogMSwKICAgIH07CiAgICBTb3J0T3JkZXJbU29ydE9yZGVyLkRPV05dID0gJ0RPV04nOwogICAgU29ydE9yZGVyW1NvcnRPcmRlci5VUF0gPSAnVVAnOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS9zdG9yZS9ucG1pX3NlbGVjdG9ycy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBzZWxlY3ROcG1pU3RhdGUgPSBjcmVhdGVGZWF0dXJlU2VsZWN0b3IoTlBNSV9GRUFUVVJFX0tFWSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRQbHVnaW5EYXRhTG9hZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUucGx1Z2luRGF0YUxvYWRlZDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEFubm90YXRpb25EYXRhID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuYW5ub3RhdGlvbkRhdGE7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRSdW5Ub01ldHJpY3MgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3ROcG1pU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5ydW5Ub01ldHJpY3M7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRTZWxlY3RlZEFubm90YXRpb25zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuc2VsZWN0ZWRBbm5vdGF0aW9uczsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEZsYWdnZWRBbm5vdGF0aW9ucyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE5wbWlTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLmZsYWdnZWRBbm5vdGF0aW9uczsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEhpZGRlbkFubm90YXRpb25zID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuaGlkZGVuQW5ub3RhdGlvbnM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRBbm5vdGF0aW9uc1JlZ2V4ID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuYW5ub3RhdGlvbnNSZWdleDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldE1ldHJpY3NSZWdleCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE5wbWlTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLm1ldHJpY3NSZWdleDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldE1ldHJpY0FyaXRobWV0aWMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3ROcG1pU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5tZXRyaWNBcml0aG1ldGljOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0TWV0cmljRmlsdGVycyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE5wbWlTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLm1ldHJpY0ZpbHRlcnM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRBbm5vdGF0aW9uU29ydCA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE5wbWlTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnNvcnQ7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRQQ0V4cGFuZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUucGNFeHBhbmRlZDsKICAgIH0pKTsKICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGNvbnN0IGdldEFubm90YXRpb25zRXhwYW5kZWQgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3ROcG1pU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5hbm5vdGF0aW9uc0V4cGFuZGVkOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0U2lkZWJhckV4cGFuZGVkID0gY3JlYXRlU2VsZWN0b3Ioc2VsZWN0TnBtaVN0YXRlLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gc3RhdGUuc2lkZWJhckV4cGFuZGVkOwogICAgfSkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0U2hvd0NvdW50cyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdE5wbWlTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIHN0YXRlLnNob3dDb3VudHM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRTaG93SGlkZGVuQW5ub3RhdGlvbnMgPSBjcmVhdGVTZWxlY3RvcihzZWxlY3ROcG1pU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5zaG93SGlkZGVuQW5ub3RhdGlvbnM7CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRTaWRlYmFyV2lkdGggPSBjcmVhdGVTZWxlY3RvcihzZWxlY3ROcG1pU3RhdGUsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBzdGF0ZS5zaWRlYmFyV2lkdGg7CiAgICB9KSk7CgogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEFjdGlvbnMgZm9yIHRoZSBOUE1JIENvbXBvbmVudC4KICAgICAqLwogICAgY29uc3QgbnBtaUxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW05QTUldIG5QTUkgTG9hZGVkJyk7CiAgICBjb25zdCBucG1pUGx1Z2luRGF0YVJlcXVlc3RlZCA9IGNyZWF0ZUFjdGlvbignW05QTUldIG5QTUkgUGx1Z2luIERhdGEgUmVxdWVzdGVkJyk7CiAgICBjb25zdCBucG1pUGx1Z2luRGF0YUxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW05QTUldIG5QTUkgUGx1Z2luIERhdGEgTG9hZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBucG1pUGx1Z2luRGF0YVJlcXVlc3RGYWlsZWQgPSBjcmVhdGVBY3Rpb24oJ1tOUE1JXSBuUE1JIFBsdWdpbiBEYXRhIFJlcXVlc3QgRmFpbGVkJyk7CiAgICBjb25zdCBucG1pVG9nZ2xlU2VsZWN0ZWRBbm5vdGF0aW9ucyA9IGNyZWF0ZUFjdGlvbignW05QTUldIEFkZGluZy9SZW1vdmluZyBBbm5vdGF0aW9ucyB0by9mcm9tIFNlbGVjdGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBucG1pU2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyA9IGNyZWF0ZUFjdGlvbignW05QTUldIEFubm90YXRpb25zIFNldCcsIHByb3BzKCkpOwogICAgY29uc3QgbnBtaUNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyA9IGNyZWF0ZUFjdGlvbignW05QTUldIENsZWFyaW5nIHRoZSBBbm5vdGF0aW9uIFNlbGVjdGlvbicpOwogICAgY29uc3QgbnBtaVRvZ2dsZUFubm90YXRpb25GbGFncyA9IGNyZWF0ZUFjdGlvbignW05QTUldIEFkZGluZy9SZW1vdmluZyBBbm5vdGF0aW9ucyB0by9mcm9tIEZsYWdnZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IG5wbWlUb2dnbGVBbm5vdGF0aW9uc0hpZGRlbiA9IGNyZWF0ZUFjdGlvbignW05QTUldIEFkZGluZy9SZW1vdmluZyBBbm5vdGF0aW9ucyB0by9mcm9tIEhpZGRlbicsIHByb3BzKCkpOwogICAgY29uc3QgbnBtaUFubm90YXRpb25zUmVnZXhDaGFuZ2VkID0gY3JlYXRlQWN0aW9uKCdbTlBNSV0gQW5ub3RhdGlvbnMgUmVnZXggQ2hhbmdlZCcsIHByb3BzKCkpOwogICAgY29uc3QgbnBtaU1ldHJpY3NSZWdleENoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tOUE1JXSBNZXRyaWNzIFJlZ2V4IENoYW5nZWQnLCBwcm9wcygpKTsKICAgIGNvbnN0IG5wbWlBZGRNZXRyaWNGaWx0ZXIgPSBjcmVhdGVBY3Rpb24oJ1tOUE1JXSBNZXRyaWMgRmlsdGVyIEFkZGVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBucG1pUmVtb3ZlTWV0cmljRmlsdGVyID0gY3JlYXRlQWN0aW9uKCdbTlBNSV0gTWV0cmljIEZpbHRlciBSZW1vdmVkJywgcHJvcHMoKSk7CiAgICBjb25zdCBucG1pQ2hhbmdlTWV0cmljRmlsdGVyID0gY3JlYXRlQWN0aW9uKCdbTlBNSV0gTWV0cmljIEZpbHRlciBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCBucG1pQ2hhbmdlQW5ub3RhdGlvblNvcnQgPSBjcmVhdGVBY3Rpb24oJ1tOUE1JXSBDaGFuZ2UgQW5ub3RhdGlvbiBTb3J0JywgcHJvcHMoKSk7CiAgICBjb25zdCBucG1pVG9nZ2xlUGFyYWxsZWxDb29yZGluYXRlc0V4cGFuZGVkID0gY3JlYXRlQWN0aW9uKCdbTlBNSV0gVG9nZ2xlIFBDIEV4cGFuZGVkJyk7CiAgICBjb25zdCBucG1pVG9nZ2xlQW5ub3RhdGlvbnNFeHBhbmRlZCA9IGNyZWF0ZUFjdGlvbignW05QTUldIFRvZ2dsZSBBbm5vdGF0aW9ucyBFeHBhbmRlZCcpOwogICAgY29uc3QgbnBtaVRvZ2dsZVNpZGViYXJFeHBhbmRlZCA9IGNyZWF0ZUFjdGlvbignW05QTUldIFRvZ2dsZSBTaWRlYmFyIEV4cGFuZGVkJyk7CiAgICBjb25zdCBucG1pVG9nZ2xlU2hvd0NvdW50cyA9IGNyZWF0ZUFjdGlvbignW05QTUldIFRvZ2dsZSBTaG93IENvdW50cycpOwogICAgY29uc3QgbnBtaVRvZ2dsZVNob3dIaWRkZW5Bbm5vdGF0aW9ucyA9IGNyZWF0ZUFjdGlvbignW05QTUldIFRvZ2dsZSBTaG93IEhpZGRlbiBBbm5vdGF0aW9ucycpOwogICAgY29uc3QgbnBtaUNoYW5nZVNpZGViYXJXaWR0aCA9IGNyZWF0ZUFjdGlvbignW05QTUldIENoYW5nZSBTaWRlYmFyIFdpZHRoJywgcHJvcHMoKSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3V0aWwvbWV0cmljX3R5cGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyogQ29weXJpZ2h0IDIwMjAgVGhlIFRlbnNvckZsb3cgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KCiAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAoKICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKCiAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0cmljCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtZXRyaWNJc01ldHJpY0NvdW50KG1ldHJpYykgewogICAgICAgIHJldHVybiBtZXRyaWMuc3RhcnRzV2l0aCgnY291bnRAJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0cmljCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtZXRyaWNJc05wbWkobWV0cmljKSB7CiAgICAgICAgcmV0dXJuIG1ldHJpYy5zdGFydHNXaXRoKCduUE1JQCcpIHx8IG1ldHJpYy5zdGFydHNXaXRoKCduUE1JX2RpZmZAJyk7CiAgICB9CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gbWV0cmljCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBtZXRyaWNJc05wbWlBbmROb3REaWZmKG1ldHJpYykgewogICAgICAgIHJldHVybiBtZXRyaWMuc3RhcnRzV2l0aCgnblBNSUAnKTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRyaWNTdHJpbmcKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHN0cmlwTWV0cmljU3RyaW5nKG1ldHJpY1N0cmluZykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBzdHJpcHBlZFN0cmluZyA9IG1ldHJpY1N0cmluZy5zcGxpdCgnQCcsIDIpWzFdOwogICAgICAgIHJldHVybiBzdHJpcHBlZFN0cmluZzsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvc3RvcmUvbnBtaV9yZWR1Y2Vycy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBpbml0aWFsU3RhdGUkNiA9IHsKICAgICAgICBwbHVnaW5EYXRhTG9hZGVkOiB7CiAgICAgICAgICAgIHN0YXRlOiBEYXRhTG9hZFN0YXRlLk5PVF9MT0FERUQsCiAgICAgICAgICAgIGxhc3RMb2FkZWRUaW1lSW5NczogbnVsbCwKICAgICAgICB9LAogICAgICAgIGFubm90YXRpb25EYXRhOiB7fSwKICAgICAgICBydW5Ub01ldHJpY3M6IHt9LAogICAgICAgIGVtYmVkZGluZ0RhdGE6IHt9LAogICAgICAgIHNlbGVjdGVkQW5ub3RhdGlvbnM6IFtdLAogICAgICAgIGZsYWdnZWRBbm5vdGF0aW9uczogW10sCiAgICAgICAgaGlkZGVuQW5ub3RhdGlvbnM6IFtdLAogICAgICAgIGFubm90YXRpb25zUmVnZXg6ICcnLAogICAgICAgIG1ldHJpY3NSZWdleDogJycsCiAgICAgICAgbWV0cmljQXJpdGhtZXRpYzogW10sCiAgICAgICAgbWV0cmljRmlsdGVyczoge30sCiAgICAgICAgc29ydDogewogICAgICAgICAgICBtZXRyaWM6ICcnLAogICAgICAgICAgICBvcmRlcjogU29ydE9yZGVyLkRPV04sCiAgICAgICAgfSwKICAgICAgICBwY0V4cGFuZGVkOiB0cnVlLAogICAgICAgIGFubm90YXRpb25zRXhwYW5kZWQ6IHRydWUsCiAgICAgICAgc2lkZWJhckV4cGFuZGVkOiB0cnVlLAogICAgICAgIHNob3dDb3VudHM6IHRydWUsCiAgICAgICAgc2hvd0hpZGRlbkFubm90YXRpb25zOiBmYWxzZSwKICAgICAgICBzaWRlYmFyV2lkdGg6IDMwMCwKICAgIH07CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCByZWR1Y2VyJDYgPSBjcmVhdGVSZWR1Y2VyKGluaXRpYWxTdGF0ZSQ2LCBvbihucG1pUGx1Z2luRGF0YVJlcXVlc3RlZCwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IHBsdWdpbkRhdGFMb2FkZWQ6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUucGx1Z2luRGF0YUxvYWRlZCksIHsgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BRElORyB9KSB9KTsKICAgIH0pKSwgb24obnBtaVBsdWdpbkRhdGFSZXF1ZXN0RmFpbGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcGx1Z2luRGF0YUxvYWRlZDogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5wbHVnaW5EYXRhTG9hZGVkKSwgeyBzdGF0ZTogRGF0YUxvYWRTdGF0ZS5GQUlMRUQgfSkgfSk7CiAgICB9KSksIG9uKG5wbWlQbHVnaW5EYXRhTG9hZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IGFubm90YXRpb25EYXRhLCBtZXRyaWNzLCBlbWJlZGRpbmdEYXRhIH0pID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgcnVuVG9NZXRyaWNzID0ge307CiAgICAgICAgZm9yIChjb25zdCBrZXkgaW4gbWV0cmljcykgewogICAgICAgICAgICAvLyBJbml0IE1ldHJpY3MgRGF0YQogICAgICAgICAgICBydW5Ub01ldHJpY3Nba2V5XSA9IFtdOwogICAgICAgICAgICBmb3IgKGNvbnN0IHZhbHVlIG9mIG1ldHJpY3Nba2V5XSkgewogICAgICAgICAgICAgICAgaWYgKG1ldHJpY0lzTnBtaSh2YWx1ZSkpIHsKICAgICAgICAgICAgICAgICAgICBydW5Ub01ldHJpY3Nba2V5XS5wdXNoKHZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcnVuVG9NZXRyaWNzOiBydW5Ub01ldHJpY3MsIGFubm90YXRpb25EYXRhOiBhbm5vdGF0aW9uRGF0YSwgZW1iZWRkaW5nRGF0YTogZW1iZWRkaW5nRGF0YSwgcGx1Z2luRGF0YUxvYWRlZDogewogICAgICAgICAgICAgICAgc3RhdGU6IERhdGFMb2FkU3RhdGUuTE9BREVELAogICAgICAgICAgICAgICAgbGFzdExvYWRlZFRpbWVJbk1zOiBEYXRlLm5vdygpLAogICAgICAgICAgICB9IH0pOwogICAgfSkpLCBvbihucG1pVG9nZ2xlU2VsZWN0ZWRBbm5vdGF0aW9ucywgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBhbm5vdGF0aW9ucyB9KSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbWJpbmVkU2VsZWN0ZWRBbm5vdGF0aW9ucyA9IG5ldyBTZXQoWwogICAgICAgICAgICAuLi5zdGF0ZS5zZWxlY3RlZEFubm90YXRpb25zLAogICAgICAgICAgICAuLi5hbm5vdGF0aW9ucywKICAgICAgICBdKTsKICAgICAgICBpZiAoY29tYmluZWRTZWxlY3RlZEFubm90YXRpb25zLnNpemUgPT09IHN0YXRlLnNlbGVjdGVkQW5ub3RhdGlvbnMubGVuZ3RoKSB7CiAgICAgICAgICAgIC8vIElmIGFsbCBhbm5vdGF0aW9ucyBhcmUgYWxyZWFkeSBmbGFnZ2VkLCB1c2VyIHdhbnRzIHRvIHJlbW92ZSB0aGVtCiAgICAgICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiBhbm5vdGF0aW9ucykgewogICAgICAgICAgICAgICAgY29tYmluZWRTZWxlY3RlZEFubm90YXRpb25zLmRlbGV0ZShhbm5vdGF0aW9uKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2VsZWN0ZWRBbm5vdGF0aW9uczogWy4uLmNvbWJpbmVkU2VsZWN0ZWRBbm5vdGF0aW9uc10gfSk7CiAgICB9KSksIG9uKG5wbWlTZXRTZWxlY3RlZEFubm90YXRpb25zLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IGFubm90YXRpb25zIH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2VsZWN0ZWRBbm5vdGF0aW9uczogYW5ub3RhdGlvbnMgfSk7CiAgICB9KSksIG9uKG5wbWlDbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzZWxlY3RlZEFubm90YXRpb25zOiBbXSB9KTsKICAgIH0pKSwgb24obnBtaVRvZ2dsZUFubm90YXRpb25GbGFncywgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBhbm5vdGF0aW9ucyB9KSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbWJpbmVkRmxhZ2dlZEFubm90YXRpb25zID0gbmV3IFNldChbCiAgICAgICAgICAgIC4uLnN0YXRlLmZsYWdnZWRBbm5vdGF0aW9ucywKICAgICAgICAgICAgLi4uYW5ub3RhdGlvbnMsCiAgICAgICAgXSk7CiAgICAgICAgaWYgKGNvbWJpbmVkRmxhZ2dlZEFubm90YXRpb25zLnNpemUgPT09IHN0YXRlLmZsYWdnZWRBbm5vdGF0aW9ucy5sZW5ndGgpIHsKICAgICAgICAgICAgLy8gSWYgYWxsIGFubm90YXRpb25zIGFyZSBhbHJlYWR5IGZsYWdnZWQsIHVzZXIgd2FudHMgdG8gcmVtb3ZlIHRoZW0KICAgICAgICAgICAgZm9yIChjb25zdCBhbm5vdGF0aW9uIG9mIGFubm90YXRpb25zKSB7CiAgICAgICAgICAgICAgICBjb21iaW5lZEZsYWdnZWRBbm5vdGF0aW9ucy5kZWxldGUoYW5ub3RhdGlvbik7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcmV0dXJuIE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUpLCB7IGZsYWdnZWRBbm5vdGF0aW9uczogWy4uLmNvbWJpbmVkRmxhZ2dlZEFubm90YXRpb25zXSwgc2VsZWN0ZWRBbm5vdGF0aW9uczogW10gfSk7CiAgICB9KSksIG9uKG5wbWlUb2dnbGVBbm5vdGF0aW9uc0hpZGRlbiwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBhbm5vdGF0aW9ucyB9KSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGNvbWJpbmVkSGlkZGVuQW5ub3RhdGlvbnMgPSBuZXcgU2V0KFsKICAgICAgICAgICAgLi4uc3RhdGUuaGlkZGVuQW5ub3RhdGlvbnMsCiAgICAgICAgICAgIC4uLmFubm90YXRpb25zLAogICAgICAgIF0pOwogICAgICAgIGlmIChjb21iaW5lZEhpZGRlbkFubm90YXRpb25zLnNpemUgPT09IHN0YXRlLmhpZGRlbkFubm90YXRpb25zLmxlbmd0aCkgewogICAgICAgICAgICAvLyBJZiBhbGwgYW5ub3RhdGlvbnMgYXJlIGFscmVhZHkgZmxhZ2dlZCwgdXNlciB3YW50cyB0byByZW1vdmUgdGhlbQogICAgICAgICAgICBmb3IgKGNvbnN0IGFubm90YXRpb24gb2YgYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgICAgIGNvbWJpbmVkSGlkZGVuQW5ub3RhdGlvbnMuZGVsZXRlKGFubm90YXRpb24pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBoaWRkZW5Bbm5vdGF0aW9uczogWy4uLmNvbWJpbmVkSGlkZGVuQW5ub3RhdGlvbnNdLCBzZWxlY3RlZEFubm90YXRpb25zOiBbXSB9KTsKICAgIH0pKSwgb24obnBtaUFubm90YXRpb25zUmVnZXhDaGFuZ2VkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IHJlZ2V4IH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgYW5ub3RhdGlvbnNSZWdleDogcmVnZXggfSk7CiAgICB9KSksIG9uKG5wbWlNZXRyaWNzUmVnZXhDaGFuZ2VkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcGFyYW0gez99IF9fMQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCB7IHJlZ2V4IH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbWV0cmljc1JlZ2V4OiByZWdleCB9KTsKICAgIH0pKSwgb24obnBtaUFkZE1ldHJpY0ZpbHRlciwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBfXzEKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSwgeyBtZXRyaWMgfSkgPT4gewogICAgICAgIC8vIE9ubHkgYWRkIGlmIG5vdCBhbHJlYWR5IGluIGFjdGl2ZSBmaWx0ZXJzCiAgICAgICAgaWYgKHN0YXRlLm1ldHJpY0ZpbHRlcnNbbWV0cmljXSkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIC8vIEFkZCBzbyB0aGF0IGFyaXRobWV0aWMgaXMgc3RpbGwgY29ycmVjdAogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBuZXdDb250ZW50ID0gW107CiAgICAgICAgaWYgKHN0YXRlLm1ldHJpY0FyaXRobWV0aWMubGVuZ3RoICE9PSAwKSB7CiAgICAgICAgICAgIG5ld0NvbnRlbnQucHVzaCh7CiAgICAgICAgICAgICAgICBraW5kOiBBcml0aG1ldGljS2luZC5PUEVSQVRPUiwKICAgICAgICAgICAgICAgIG9wZXJhdG9yOiBPcGVyYXRvci5BTkQsCiAgICAgICAgICAgIH0pOwogICAgICAgIH0KICAgICAgICBuZXdDb250ZW50LnB1c2goeyBraW5kOiBBcml0aG1ldGljS2luZC5NRVRSSUMsIG1ldHJpYzogbWV0cmljIH0pOwogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBtZXRyaWNBcml0aG1ldGljOiBbLi4uc3RhdGUubWV0cmljQXJpdGhtZXRpYywgLi4ubmV3Q29udGVudF0sIG1ldHJpY0ZpbHRlcnM6IE9iamVjdC5hc3NpZ24oT2JqZWN0LmFzc2lnbih7fSwgc3RhdGUubWV0cmljRmlsdGVycyksIHsgW21ldHJpY106IHsKICAgICAgICAgICAgICAgICAgICBtYXg6IDEuMCwKICAgICAgICAgICAgICAgICAgICBtaW46IC0xLjAsCiAgICAgICAgICAgICAgICAgICAgaW5jbHVkZU5hTjogZmFsc2UsCiAgICAgICAgICAgICAgICB9IH0pLCBzb3J0OiB7CiAgICAgICAgICAgICAgICBtZXRyaWMsCiAgICAgICAgICAgICAgICBvcmRlcjogU29ydE9yZGVyLkRPV04sCiAgICAgICAgICAgIH0gfSk7CiAgICB9KSksIG9uKG5wbWlSZW1vdmVNZXRyaWNGaWx0ZXIsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgbWV0cmljIH0pID0+IHsKICAgICAgICBpZiAoIXN0YXRlLm1ldHJpY0ZpbHRlcnNbbWV0cmljXSkgewogICAgICAgICAgICByZXR1cm4gc3RhdGU7CiAgICAgICAgfQogICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycmVjdCBlbGVtZW50cyBvZiB0aGUgYXJpdGhtZXRpYyBhcyB3ZWxsCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBhcml0aG1ldGljSW5kZXggPSAwOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBsZXQgc3RhcnRTbGljZSA9IDA7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGxldCBlbmRTbGljZSA9IDI7CiAgICAgICAgY29uc3QgX2EgPSBzdGF0ZS5tZXRyaWNGaWx0ZXJzLCBfYiA9IG1ldHJpYywgdmFsdWUgPSBfYVtfYl0sIG1hcCA9IF9fcmVzdChfYSwgW3R5cGVvZiBfYiA9PT0gInN5bWJvbCIgPyBfYiA6IF9iICsgIiJdKTsKICAgICAgICBmb3IgKGNvbnN0IGluZGV4IGluIHN0YXRlLm1ldHJpY0FyaXRobWV0aWMpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gc3RhdGUubWV0cmljQXJpdGhtZXRpY1tpbmRleF07CiAgICAgICAgICAgIGlmIChlbGVtZW50LmtpbmQgPT09IEFyaXRobWV0aWNLaW5kLk1FVFJJQykgewogICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQubWV0cmljID09PSBtZXRyaWMpIHsKICAgICAgICAgICAgICAgICAgICBhcml0aG1ldGljSW5kZXggPSBwYXJzZUludChpbmRleCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKGFyaXRobWV0aWNJbmRleCAhPT0gMCkgewogICAgICAgICAgICBzdGFydFNsaWNlID0gYXJpdGhtZXRpY0luZGV4IC0gMTsKICAgICAgICAgICAgZW5kU2xpY2UgPSBhcml0aG1ldGljSW5kZXggKyAxOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbWV0cmljQXJpdGhtZXRpYzogWwogICAgICAgICAgICAgICAgLi4uc3RhdGUubWV0cmljQXJpdGhtZXRpYy5zbGljZSgwLCBzdGFydFNsaWNlKSwKICAgICAgICAgICAgICAgIC4uLnN0YXRlLm1ldHJpY0FyaXRobWV0aWMuc2xpY2UoZW5kU2xpY2UpLAogICAgICAgICAgICBdLCBtZXRyaWNGaWx0ZXJzOiBtYXAgfSk7CiAgICB9KSksIG9uKG5wbWlDaGFuZ2VNZXRyaWNGaWx0ZXIsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgbWV0cmljLCBtYXgsIG1pbiwgaW5jbHVkZU5hTiB9KSA9PiB7CiAgICAgICAgaWYgKCFzdGF0ZS5tZXRyaWNGaWx0ZXJzW21ldHJpY10pIHsKICAgICAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgbWV0cmljRmlsdGVyczogT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZS5tZXRyaWNGaWx0ZXJzKSwgeyBbbWV0cmljXTogewogICAgICAgICAgICAgICAgICAgIG1heDogbWF4LAogICAgICAgICAgICAgICAgICAgIG1pbjogbWluLAogICAgICAgICAgICAgICAgICAgIGluY2x1ZGVOYU46IGluY2x1ZGVOYU4sCiAgICAgICAgICAgICAgICB9IH0pIH0pOwogICAgfSkpLCBvbihucG1pQ2hhbmdlQW5ub3RhdGlvblNvcnQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgbWV0cmljIH0pID0+IHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgbmV3U29ydCA9IHsKICAgICAgICAgICAgbWV0cmljOiBtZXRyaWMsCiAgICAgICAgICAgIG9yZGVyOiBTb3J0T3JkZXIuRE9XTiwKICAgICAgICB9OwogICAgICAgIGlmIChzdGF0ZS5zb3J0Lm1ldHJpYyA9PT0gbWV0cmljICYmIHN0YXRlLnNvcnQub3JkZXIgPT09IFNvcnRPcmRlci5ET1dOKSB7CiAgICAgICAgICAgIG5ld1NvcnQub3JkZXIgPSBTb3J0T3JkZXIuVVA7CiAgICAgICAgfQogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzb3J0OiBuZXdTb3J0IH0pOwogICAgfSkpLCBvbihucG1pVG9nZ2xlUGFyYWxsZWxDb29yZGluYXRlc0V4cGFuZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgcGNFeHBhbmRlZDogIXN0YXRlLnBjRXhwYW5kZWQgfSk7CiAgICB9KSksIG9uKG5wbWlUb2dnbGVBbm5vdGF0aW9uc0V4cGFuZGVkLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgYW5ub3RhdGlvbnNFeHBhbmRlZDogIXN0YXRlLmFubm90YXRpb25zRXhwYW5kZWQgfSk7CiAgICB9KSksIG9uKG5wbWlUb2dnbGVTaWRlYmFyRXhwYW5kZWQsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzaWRlYmFyRXhwYW5kZWQ6ICFzdGF0ZS5zaWRlYmFyRXhwYW5kZWQgfSk7CiAgICB9KSksIG9uKG5wbWlUb2dnbGVTaG93Q291bnRzLCAoLyoqCiAgICAgKiBAcGFyYW0gez99IHN0YXRlCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUpID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2hvd0NvdW50czogIXN0YXRlLnNob3dDb3VudHMgfSk7CiAgICB9KSksIG9uKG5wbWlUb2dnbGVTaG93SGlkZGVuQW5ub3RhdGlvbnMsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIChzdGF0ZSkgPT4gewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKE9iamVjdC5hc3NpZ24oe30sIHN0YXRlKSwgeyBzaG93SGlkZGVuQW5ub3RhdGlvbnM6ICFzdGF0ZS5zaG93SGlkZGVuQW5ub3RhdGlvbnMgfSk7CiAgICB9KSksIG9uKG5wbWlDaGFuZ2VTaWRlYmFyV2lkdGgsICgvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gX18xCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICAoc3RhdGUsIHsgc2lkZWJhcldpZHRoIH0pID0+IHsKICAgICAgICByZXR1cm4gT2JqZWN0LmFzc2lnbihPYmplY3QuYXNzaWduKHt9LCBzdGF0ZSksIHsgc2lkZWJhcldpZHRoIH0pOwogICAgfSkpKTsKICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBhY3Rpb24KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlZHVjZXJzJDgoc3RhdGUsIGFjdGlvbikgewogICAgICAgIHJldHVybiByZWR1Y2VyJDYoc3RhdGUsIGFjdGlvbik7CiAgICB9CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2RhdGFfc2VsZWN0aW9uL21ldHJpY19zZWFyY2gvbWV0cmljX3NlYXJjaF9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gTWV0cmljU2VhcmNoQ29tcG9uZW50X21hdF9pY29uXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1pY29uIiwgNyk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1ldHJpY1NlYXJjaENvbXBvbmVudF9tYXRfb3B0aW9uXzZfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LW9wdGlvbiIsIDgpOwogICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjb21wbGV0aW9uX3I0ID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoInZhbHVlIiwgY29tcGxldGlvbl9yNCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZShjb21wbGV0aW9uX3I0KTsKICAgIH0gfQogICAgY2xhc3MgTWV0cmljU2VhcmNoQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25BZGRGaWx0ZXIgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcGFyYW0gez99IG1hdElucHV0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbk9wdGlvblNlbGVjdGVkKGV2ZW50LCBtYXRJbnB1dCkgewogICAgICAgICAgICB0aGlzLm9uQWRkRmlsdGVyLmVtaXQoZXZlbnQub3B0aW9uLnZhbHVlKTsKICAgICAgICAgICAgLy8gbWF0SW5wdXQudmFsdWUgbmVlZHMgdG8gYmUgY2xlYXJlZCBtYW51YWxseSwgc2luY2UgdGhlIEFuZ3VsYXIgTWF0ZXJpYWwgQ29tcG9uZW50IG1heSBiZSBtb2RpZnlpbmcgdGhlIGlucHV0IHZhbHVlIG91dHNpZGUgb2YgY2hhbmdlIGRldGVjdGlvbgogICAgICAgICAgICBtYXRJbnB1dC52YWx1ZSA9ICcnOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY1NlYXJjaENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljLXNlYXJjaC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9tZXRyaWNfc2VhcmNoX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9tZXRyaWNfc2VhcmNoX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIE1ldHJpY1NlYXJjaENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBjb21wbGV0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcmVnZXhGaWx0ZXJWYWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaXNSZWdleEZpbHRlclZhbGlkOiBbeyB0eXBlOiBIb3N0QmluZGluZywgYXJnczogWydjbGFzcy52YWxpZCcsXSB9LCB7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uQWRkRmlsdGVyOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljU2VhcmNoQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gTWV0cmljU2VhcmNoQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY1NlYXJjaENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNTZWFyY2hDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWV0cmljU2VhcmNoQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbIm1ldHJpYy1zZWFyY2gtY29tcG9uZW50Il1dLCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNZXRyaWNTZWFyY2hDb21wb25lbnRfSG9zdEJpbmRpbmdzKHJmLCBjdHgpIHsgaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJ2YWxpZCIsIGN0eC5pc1JlZ2V4RmlsdGVyVmFsaWQpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGNvbXBsZXRpb25zOiAiY29tcGxldGlvbnMiLCByZWdleEZpbHRlclZhbHVlOiAicmVnZXhGaWx0ZXJWYWx1ZSIsIGlzUmVnZXhGaWx0ZXJWYWxpZDogImlzUmVnZXhGaWx0ZXJWYWxpZCIgfSwgb3V0cHV0czogeyBvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U6ICJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLCBvbkFkZEZpbHRlcjogIm9uQWRkRmlsdGVyIiB9LCBkZWNsczogNywgdmFyczogNCwgY29uc3RzOiBbWyJzdmdJY29uIiwgInNlYXJjaF8yNHB4Il0sIFsibWF0SW5wdXQiLCAiIiwgImF1dG9jb21wbGV0ZSIsICJvZmYiLCAicGxhY2Vob2xkZXIiLCAiQWRkIE1ldHJpYyBGaWx0ZXIiLCAzLCAidmFsdWUiLCAibWF0QXV0b2NvbXBsZXRlIiwgImlucHV0Il0sIFsibWF0SW5wdXQiLCAiIl0sIFsic3ZnSWNvbiIsICJlcnJvcl8yNHB4IiwgImNsYXNzIiwgImVycm9yLWljb24iLCAibWF0VG9vbHRpcCIsICJJbnZhbGlkIHJlZ2V4IGZpbHRlci4gVGhlIHJlc3VsdCBtYXkgYmUgc3RhbGUuIiwgNCwgIm5nSWYiXSwgWyJhdXRvQWN0aXZlRmlyc3RPcHRpb24iLCAiIiwgMywgIm9wdGlvblNlbGVjdGVkIl0sIFsiZmlsdGVyTWF0Y2hlcyIsICJtYXRBdXRvY29tcGxldGUiXSwgWzMsICJ2YWx1ZSIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsic3ZnSWNvbiIsICJlcnJvcl8yNHB4IiwgIm1hdFRvb2x0aXAiLCAiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsIDEsICJlcnJvci1pY29uIl0sIFszLCAidmFsdWUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNZXRyaWNTZWFyY2hDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIGNvbnN0IF9yNSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWF0LWljb24iLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaW5wdXQiLCAxLCAyKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJpbnB1dCIsIGZ1bmN0aW9uIE1ldHJpY1NlYXJjaENvbXBvbmVudF9UZW1wbGF0ZV9pbnB1dF9pbnB1dF8xX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZS5lbWl0KCRldmVudC50YXJnZXQudmFsdWUpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDMsIE1ldHJpY1NlYXJjaENvbXBvbmVudF9tYXRfaWNvbl8zX1RlbXBsYXRlLCAxLCAwLCAibWF0LWljb24iLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAibWF0LWF1dG9jb21wbGV0ZSIsIDQsIDUpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9wdGlvblNlbGVjdGVkIiwgZnVuY3Rpb24gTWV0cmljU2VhcmNoQ29tcG9uZW50X1RlbXBsYXRlX21hdF9hdXRvY29tcGxldGVfb3B0aW9uU2VsZWN0ZWRfNF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNSk7IGNvbnN0IF9yMCA9IMm1ybVyZWZlcmVuY2UoMik7IHJldHVybiBjdHgub25PcHRpb25TZWxlY3RlZCgkZXZlbnQsIF9yMCk7IH0pOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoNiwgTWV0cmljU2VhcmNoQ29tcG9uZW50X21hdF9vcHRpb25fNl9UZW1wbGF0ZSwgMiwgMiwgIm1hdC1vcHRpb24iLCA2KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgY29uc3QgX3IyID0gybXJtXJlZmVyZW5jZSg1KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgidmFsdWUiLCBjdHgucmVnZXhGaWx0ZXJWYWx1ZSkoIm1hdEF1dG9jb21wbGV0ZSIsIF9yMik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4LmlzUmVnZXhGaWx0ZXJWYWxpZCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguY29tcGxldGlvbnMpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdEljb24sIE1hdElucHV0LCBNYXRBdXRvY29tcGxldGVUcmlnZ2VyLCBOZ0lmLCBNYXRBdXRvY29tcGxldGUsIE5nRm9yT2YsIE1hdE9wdGlvbl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4Om5vbmU7bWFyZ2luLXJpZ2h0OjVweH1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjAgMTBweDtwb3NpdGlvbjpyZWxhdGl2ZTtmb250LXNpemU6LjllbX1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpe2NvbG9yOiNjNjI4Mjh9W19uZ2hvc3QtJUNPTVAlXTpub3QoLnZhbGlkKSAgIGlucHV0W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvZGF0YV9zZWxlY3Rpb24vbWV0cmljX3NlYXJjaC9tZXRyaWNfc2VhcmNoX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNZXRyaWNTZWFyY2hDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMubWV0cmljc1JlZ2V4JCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY3NSZWdleCk7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlUnVucyQgPSB0aGlzLnN0b3JlCiAgICAgICAgICAgICAgICAucGlwZShzZWxlY3QoZ2V0Q3VycmVudFJvdXRlUnVuU2VsZWN0aW9uKSkKICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuU2VsZWN0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocnVuU2VsZWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXJ1blNlbGVjdGlvbikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShydW5TZWxlY3Rpb24uZW50cmllcygpKQogICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChydW4pID0+IHJ1blsxXSkpCiAgICAgICAgICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHJ1bikgPT4gcnVuWzBdKSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMubWV0cmljc0ZvckFjdGl2ZVJ1bnMkID0gY29tYmluZUxhdGVzdCh0aGlzLmFjdGl2ZVJ1bnMkLCB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5Ub01ldHJpY3MpKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2FjdGl2ZVJ1bnMsIHJ1blRvTWV0cmljc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1ldHJpY3MgPSBuZXcgU2V0KCk7CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1biBvZiBhY3RpdmVSdW5zKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blRvTWV0cmljc1tydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgbWV0cmljIG9mIHJ1blRvTWV0cmljc1tydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRyaWNzLmFkZChtZXRyaWMpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5tZXRyaWNzXTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5pc01ldHJpY3NGaWx0ZXJWYWxpZCQgPSB0aGlzLm1ldHJpY3NSZWdleCQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlclN0cmluZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGZpbHRlclN0cmluZykgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gQm9vbGVhbihuZXcgUmVnRXhwKGZpbHRlclN0cmluZykpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgY2F0Y2ggKGVycikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5tZXRyaWNGaWx0ZXJLZXlzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0TWV0cmljRmlsdGVycykpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBtZXRyaWNGaWx0ZXJzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAobWV0cmljRmlsdGVycykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKG1ldHJpY0ZpbHRlcnMpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmNvbXBsZXRpb25zJCA9IGNvbWJpbmVMYXRlc3QodGhpcy5tZXRyaWNzRm9yQWN0aXZlUnVucyQsIHRoaXMubWV0cmljc1JlZ2V4JCwgdGhpcy5tZXRyaWNGaWx0ZXJLZXlzJCkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFttZXRyaWNzLCBtZXRyaWNzUmVnZXgsIG1ldHJpY3NXaXRoRmlsdGVyc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlcmVkTWV0cmljcyA9IG1ldHJpY3MuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbWV0cmljCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAobWV0cmljKSA9PiAhbWV0cmljc1dpdGhGaWx0ZXJzLmluY2x1ZGVzKG1ldHJpYykpKTsKICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IGZpbHRlclJlZ2V4ID0gbmV3IFJlZ0V4cChtZXRyaWNzUmVnZXgsICdpJyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlcmVkTWV0cmljcwogICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IG1ldHJpYwogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKG1ldHJpYykgPT4gZmlsdGVyUmVnZXgudGVzdChtZXRyaWMpKSkKICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChlcnIpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZmlsdGVyCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvbkZpbHRlckNoYW5nZShmaWx0ZXIpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pTWV0cmljc1JlZ2V4Q2hhbmdlZCh7IHJlZ2V4OiBmaWx0ZXIgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG1ldHJpYwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25BZGRGaWx0ZXIobWV0cmljKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaUFkZE1ldHJpY0ZpbHRlcih7IG1ldHJpYyB9KSk7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaU1ldHJpY3NSZWdleENoYW5nZWQoeyByZWdleDogJycgfSkpOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY1NlYXJjaENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS1tZXRyaWMtc2VhcmNoJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPG1ldHJpYy1zZWFyY2gtY29tcG9uZW50CiAgICAgIFtyZWdleEZpbHRlclZhbHVlXT0ibWV0cmljc1JlZ2V4JCB8IGFzeW5jIgogICAgICBbY29tcGxldGlvbnNdPSJjb21wbGV0aW9ucyQgfCBhc3luYyIKICAgICAgW2lzUmVnZXhGaWx0ZXJWYWxpZF09ImlzTWV0cmljc0ZpbHRlclZhbGlkJCB8IGFzeW5jIgogICAgICAob25SZWdleEZpbHRlclZhbHVlQ2hhbmdlKT0ib25GaWx0ZXJDaGFuZ2UoJGV2ZW50KSIKICAgICAgKG9uQWRkRmlsdGVyKT0ib25BZGRGaWx0ZXIoJGV2ZW50KSIKICAgID48L21ldHJpYy1zZWFyY2gtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1ldHJpY1NlYXJjaENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljU2VhcmNoQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gTWV0cmljU2VhcmNoQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY1NlYXJjaENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY1NlYXJjaENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNZXRyaWNTZWFyY2hDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1tZXRyaWMtc2VhcmNoIl1dLCBkZWNsczogNCwgdmFyczogOSwgY29uc3RzOiBbWzMsICJyZWdleEZpbHRlclZhbHVlIiwgImNvbXBsZXRpb25zIiwgImlzUmVnZXhGaWx0ZXJWYWxpZCIsICJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLCAib25BZGRGaWx0ZXIiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNZXRyaWNTZWFyY2hDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1ldHJpYy1zZWFyY2gtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigib25SZWdleEZpbHRlclZhbHVlQ2hhbmdlIiwgZnVuY3Rpb24gTWV0cmljU2VhcmNoQ29udGFpbmVyX1RlbXBsYXRlX21ldHJpY19zZWFyY2hfY29tcG9uZW50X29uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uRmlsdGVyQ2hhbmdlKCRldmVudCk7IH0pKCJvbkFkZEZpbHRlciIsIGZ1bmN0aW9uIE1ldHJpY1NlYXJjaENvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNfc2VhcmNoX2NvbXBvbmVudF9vbkFkZEZpbHRlcl8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uQWRkRmlsdGVyKCRldmVudCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInJlZ2V4RmlsdGVyVmFsdWUiLCDJtcm1cGlwZUJpbmQxKDEsIDMsIGN0eC5tZXRyaWNzUmVnZXgkKSkoImNvbXBsZXRpb25zIiwgybXJtXBpcGVCaW5kMSgyLCA1LCBjdHguY29tcGxldGlvbnMkKSkoImlzUmVnZXhGaWx0ZXJWYWxpZCIsIMm1ybVwaXBlQmluZDEoMywgNywgY3R4LmlzTWV0cmljc0ZpbHRlclZhbGlkJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01ldHJpY1NlYXJjaENvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS91dGlsL2Nzdl9yZXN1bHQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGZsYWdnZWREYXRhCiAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICogQHBhcmFtIHs/fSBtZXRyaWNzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb252ZXJ0VG9DU1ZSZXN1bHQoZmxhZ2dlZERhdGEsIHJ1biwgbWV0cmljcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSBbW3J1biwgLi4ubWV0cmljc11dOwogICAgICAgIGlmICghbWV0cmljcy5sZW5ndGggfHwgIWZsYWdnZWREYXRhLmxlbmd0aCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNzdkNvbnRlbnQgPSAnZGF0YTp0ZXh0L2NzdjtjaGFyc2V0PXV0Zi04LCcgKwogICAgICAgICAgICAgICAgcmVzdWx0Lm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGUKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlKSA9PiBlLmpvaW4oJywnKSkpLmpvaW4oJ1xuJyk7CiAgICAgICAgICAgIHJldHVybiBjc3ZDb250ZW50OwogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyaXBwZWRNZXRyaWNzID0gbWV0cmljcy5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gbWV0cmljCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAobWV0cmljKSA9PiBzdHJpcE1ldHJpY1N0cmluZyhtZXRyaWMpKSk7CiAgICAgICAgZm9yIChjb25zdCBbYW5ub3RhdGlvbiwgdmFsdWVEYXRhTGlzdF0gb2YgZmxhZ2dlZERhdGEpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBydW5WYWx1ZXMgPSB2YWx1ZURhdGFMaXN0LmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAodmFsdWVzKSA9PiB2YWx1ZXMucnVuID09PSBydW4pKTsKICAgICAgICAgICAgaWYgKHJ1blZhbHVlcy5sZW5ndGgpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRSZXN1bHQgPSBbYW5ub3RhdGlvbl07CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IG1ldHJpYyBvZiBzdHJpcHBlZE1ldHJpY3MpIHsKICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWV0cmljVmFsdWUgPSBydW5WYWx1ZXMuZmluZCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKHZhbHVlKSA9PiB2YWx1ZS5tZXRyaWMgPT09IG1ldHJpYykpOwogICAgICAgICAgICAgICAgICAgIGlmIChtZXRyaWNWYWx1ZSA9PT0gdW5kZWZpbmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnRSZXN1bHQucHVzaCgnbnVsbCcpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudFJlc3VsdC5wdXNoKGAke21ldHJpY1ZhbHVlLm5QTUlWYWx1ZX1gKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChlbGVtZW50UmVzdWx0KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgY3N2Q29udGVudCA9ICdkYXRhOnRleHQvY3N2O2NoYXJzZXQ9dXRmLTgsJyArIHJlc3VsdC5tYXAoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGUpID0+IGUuam9pbignLCcpKSkuam9pbignXG4nKTsKICAgICAgICByZXR1cm4gY3N2Q29udGVudDsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvZGF0YV9zZWxlY3Rpb24vcmVzdWx0c19kb3dubG9hZC9yZXN1bHRzX2Rvd25sb2FkX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkdCA9IGZ1bmN0aW9uIChhMCkgeyByZXR1cm4geyAiYWN0aXZlLWJ1dHRvbiI6IGEwIH07IH07CiAgICBjbGFzcyBSZXN1bHRzRG93bmxvYWRDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZG93bmxvYWRSZXN1bHRzKCkgewogICAgICAgICAgICBmb3IgKGNvbnN0IHJ1biBvZiB0aGlzLnJ1bnMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNzdkRhdGEgPSBjb252ZXJ0VG9DU1ZSZXN1bHQodGhpcy5mbGFnZ2VkRGF0YSwgcnVuLCB0aGlzLm1ldHJpY3MpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuc2V0QXR0cmlidXRlKCdocmVmJywgY3N2RGF0YSk7CiAgICAgICAgICAgICAgICBlbGVtZW50LnNldEF0dHJpYnV0ZSgnZG93bmxvYWQnLCBgcmVwb3J0XyR7cnVufS5jc3ZgKTsKICAgICAgICAgICAgICAgIGVsZW1lbnQuY2xpY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIFJlc3VsdHNEb3dubG9hZENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAncmVzdWx0cy1kb3dubG9hZC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9yZXN1bHRzX2Rvd25sb2FkX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9yZXN1bHRzX2Rvd25sb2FkX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFJlc3VsdHNEb3dubG9hZENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBudW1GbGFnZ2VkQW5ub3RhdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHJ1bnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZsYWdnZWREYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBtZXRyaWNzOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSZXN1bHRzRG93bmxvYWRDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBSZXN1bHRzRG93bmxvYWRDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUmVzdWx0c0Rvd25sb2FkQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJlc3VsdHNEb3dubG9hZENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSZXN1bHRzRG93bmxvYWRDb21wb25lbnQsIHNlbGVjdG9yczogW1sicmVzdWx0cy1kb3dubG9hZC1jb21wb25lbnQiXV0sIGlucHV0czogeyBudW1GbGFnZ2VkQW5ub3RhdGlvbnM6ICJudW1GbGFnZ2VkQW5ub3RhdGlvbnMiLCBydW5zOiAicnVucyIsIGZsYWdnZWREYXRhOiAiZmxhZ2dlZERhdGEiLCBtZXRyaWNzOiAibWV0cmljcyIgfSwgZGVjbHM6IDQsIHZhcnM6IDUsIGNvbnN0czogW1sibWF0LXN0cm9rZWQtYnV0dG9uIiwgIiIsICJ0aXRsZSIsICJFeHBvcnQgQ1NWIHJlcG9ydHMgb2YgYWxsIGZsYWdnZWQgYW5ub3RhdGlvbnMuIFdpbGwgZ2VuZXJhdGUgb25lIENTViBwZXIgYWN0aXZlIHJ1bi4iLCAzLCAiZGlzYWJsZWQiLCAibmdDbGFzcyIsICJjbGljayJdLCBbMSwgImJ1dHRvbi1jb250ZW50cyJdLCBbInN2Z0ljb24iLCAiZ2V0X2FwcF8yNHB4Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gUmVzdWx0c0Rvd25sb2FkQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJidXR0b24iLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFJlc3VsdHNEb3dubG9hZENvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5kb3dubG9hZFJlc3VsdHMoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMiwgIm1hdC1pY29uIiwgMik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDMpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoImRpc2FibGVkIiwgY3R4Lm51bUZsYWdnZWRBbm5vdGF0aW9ucyA9PT0gMCkoIm5nQ2xhc3MiLCDJtcm1cHVyZUZ1bmN0aW9uMSgzLCBfYzAkdCwgY3R4Lm51bUZsYWdnZWRBbm5vdGF0aW9ucyA+IDApKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgRmxhZ2dlZCBSb3dzICgiLCBjdHgubnVtRmxhZ2dlZEFubm90YXRpb25zLCAiKSAiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRCdXR0b24sIE5nQ2xhc3MsIE1hdEljb25dLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0uYWN0aXZlLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtjb2xvcjojZmZmfS5idXR0b24tY29udGVudHNbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7dGV4dC10cmFuc2Zvcm06dXBwZXJjYXNlfW1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tcmlnaHQ6NnB4fSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2RhdGFfc2VsZWN0aW9uL3Jlc3VsdHNfZG93bmxvYWQvcmVzdWx0c19kb3dubG9hZF9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUmVzdWx0c0Rvd25sb2FkQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRGbGFnZ2VkQW5ub3RhdGlvbnMpOwogICAgICAgICAgICB0aGlzLm51bUZsYWdnZWRBbm5vdGF0aW9ucyQgPSB0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZsYWdnZWRBbm5vdGF0aW9ucwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGZsYWdnZWRBbm5vdGF0aW9ucykgPT4gZmxhZ2dlZEFubm90YXRpb25zLmxlbmd0aCkpKTsKICAgICAgICAgICAgdGhpcy5hY3RpdmVSdW5zJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldEN1cnJlbnRSb3V0ZVJ1blNlbGVjdGlvbikucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1blNlbGVjdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJ1blNlbGVjdGlvbikgPT4gewogICAgICAgICAgICAgICAgaWYgKCFydW5TZWxlY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocnVuU2VsZWN0aW9uLmVudHJpZXMoKSkKICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuKSA9PiBydW5bMV0pKQogICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChydW4pID0+IHJ1blswXSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmZsYWdnZWREYXRhJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0QW5ub3RhdGlvbkRhdGEpLAogICAgICAgICAgICAgICAgdGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkLAogICAgICAgICAgICBdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2Fubm90YXRpb25EYXRhLCBmbGFnZ2VkQW5ub3RhdGlvbnNdKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmbGFnU2V0ID0gbmV3IFNldChmbGFnZ2VkQW5ub3RhdGlvbnMpOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmxhZ2dlZERhdGEgPSBPYmplY3QuZW50cmllcyhhbm5vdGF0aW9uRGF0YSkuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChlbnRyeSkgPT4gZmxhZ1NldC5oYXMoZW50cnlbMF0pKSk7CiAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ2dlZERhdGE7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMubWV0cmljcyQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldFJ1blRvTWV0cmljcyksCiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZVJ1bnMkLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljRmlsdGVycyksCiAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbcnVuVG9NZXRyaWNzLCBhY3RpdmVSdW5zLCBtZXRyaWNGaWx0ZXJzXSkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG1ldHJpY3MgPSBPYmplY3Qua2V5cyhtZXRyaWNGaWx0ZXJzKTsKICAgICAgICAgICAgICAgIGZvciAoY29uc3QgcnVuIG9mIGFjdGl2ZVJ1bnMpIHsKICAgICAgICAgICAgICAgICAgICBpZiAocnVuVG9NZXRyaWNzW3J1bl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljcyA9IG1ldHJpY3MuY29uY2F0KHJ1blRvTWV0cmljc1tydW5dLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30ga2V5CiAgICAgICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgICAgICAoa2V5KSA9PiBtZXRyaWNJc05wbWlBbmROb3REaWZmKGtleSkpKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgbWV0cmljcyA9IFsuLi5uZXcgU2V0KG1ldHJpY3MpXTsKICAgICAgICAgICAgICAgIHJldHVybiBtZXRyaWNzOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgIH0KICAgIFJlc3VsdHNEb3dubG9hZENvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS1yZXN1bHRzLWRvd25sb2FkJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPHJlc3VsdHMtZG93bmxvYWQtY29tcG9uZW50CiAgICAgIFtudW1GbGFnZ2VkQW5ub3RhdGlvbnNdPSJudW1GbGFnZ2VkQW5ub3RhdGlvbnMkIHwgYXN5bmMiCiAgICAgIFtydW5zXT0iYWN0aXZlUnVucyQgfCBhc3luYyIKICAgICAgW2ZsYWdnZWREYXRhXT0iZmxhZ2dlZERhdGEkIHwgYXN5bmMiCiAgICAgIFttZXRyaWNzXT0ibWV0cmljcyQgfCBhc3luYyIKICAgID48L3Jlc3VsdHMtZG93bmxvYWQtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFJlc3VsdHNEb3dubG9hZENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmVzdWx0c0Rvd25sb2FkQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gUmVzdWx0c0Rvd25sb2FkQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFJlc3VsdHNEb3dubG9hZENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFJlc3VsdHNEb3dubG9hZENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBSZXN1bHRzRG93bmxvYWRDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1yZXN1bHRzLWRvd25sb2FkIl1dLCBkZWNsczogNSwgdmFyczogMTIsIGNvbnN0czogW1szLCAibnVtRmxhZ2dlZEFubm90YXRpb25zIiwgInJ1bnMiLCAiZmxhZ2dlZERhdGEiLCAibWV0cmljcyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFJlc3VsdHNEb3dubG9hZENvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInJlc3VsdHMtZG93bmxvYWQtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDQsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm51bUZsYWdnZWRBbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoMSwgNCwgY3R4Lm51bUZsYWdnZWRBbm5vdGF0aW9ucyQpKSgicnVucyIsIMm1ybVwaXBlQmluZDEoMiwgNiwgY3R4LmFjdGl2ZVJ1bnMkKSkoImZsYWdnZWREYXRhIiwgybXJtXBpcGVCaW5kMSgzLCA4LCBjdHguZmxhZ2dlZERhdGEkKSkoIm1ldHJpY3MiLCDJtcm1cGlwZUJpbmQxKDQsIDEwLCBjdHgubWV0cmljcyQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtSZXN1bHRzRG93bmxvYWRDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICBjb25zdCBfYzAkdSA9IFsiKiJdOwogICAgLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRDaGlwLgogICAgLyoqCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRDaGlwQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0Q2hpcE1peGluQmFzZSA9IG1peGluVGFiSW5kZXgobWl4aW5Db2xvcihtaXhpbkRpc2FibGVSaXBwbGUoTWF0Q2hpcEJhc2UpLCAncHJpbWFyeScpLCAtMSk7CiAgICAvKioKICAgICAqIER1bW15IGRpcmVjdGl2ZSB0byBhZGQgQ1NTIGNsYXNzIHRvIGNoaXAgYXZhdGFyLgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0Q2hpcEF2YXRhciB7CiAgICB9CiAgICBNYXRDaGlwQXZhdGFyLsm1ZmFjID0gZnVuY3Rpb24gTWF0Q2hpcEF2YXRhcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRDaGlwQXZhdGFyKSgpOyB9OwogICAgTWF0Q2hpcEF2YXRhci7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRDaGlwQXZhdGFyLCBzZWxlY3RvcnM6IFtbIm1hdC1jaGlwLWF2YXRhciJdLCBbIiIsICJtYXRDaGlwQXZhdGFyIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1jaGlwLWF2YXRhciJdIH0pOwogICAgLyoqCiAgICAgKiBEdW1teSBkaXJlY3RpdmUgdG8gYWRkIENTUyBjbGFzcyB0byBjaGlwIHRyYWlsaW5nIGljb24uCiAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICovCiAgICBjbGFzcyBNYXRDaGlwVHJhaWxpbmdJY29uIHsKICAgIH0KICAgIE1hdENoaXBUcmFpbGluZ0ljb24uybVmYWMgPSBmdW5jdGlvbiBNYXRDaGlwVHJhaWxpbmdJY29uX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdENoaXBUcmFpbGluZ0ljb24pKCk7IH07CiAgICBNYXRDaGlwVHJhaWxpbmdJY29uLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdENoaXBUcmFpbGluZ0ljb24sIHNlbGVjdG9yczogW1sibWF0LWNoaXAtdHJhaWxpbmctaWNvbiJdLCBbIiIsICJtYXRDaGlwVHJhaWxpbmdJY29uIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1jaGlwLXRyYWlsaW5nLWljb24iXSB9KTsKICAgIC8qKgogICAgICogTWF0ZXJpYWwgZGVzaWduIHN0eWxlZCBDaGlwIGNvbXBvbmVudC4gVXNlZCBpbnNpZGUgdGhlIE1hdENoaXBMaXN0IGNvbXBvbmVudC4KICAgICAqLwogICAgY2xhc3MgTWF0Q2hpcCBleHRlbmRzIF9NYXRDaGlwTWl4aW5CYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9lbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBwbGF0Zm9ybQogICAgICAgICAqIEBwYXJhbSB7P30gZ2xvYmFsUmlwcGxlT3B0aW9ucwogICAgICAgICAqIEBwYXJhbSB7Pz19IGFuaW1hdGlvbk1vZGUKICAgICAgICAgKiBAcGFyYW0gez89fSBfY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKiBAcGFyYW0gez89fSB0YWJJbmRleAogICAgICAgICAqIEBwYXJhbSB7Pz19IF9kb2N1bWVudAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfbmdab25lLCBwbGF0Zm9ybSwgZ2xvYmFsUmlwcGxlT3B0aW9ucywgCiAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSA4LjAuMCBgYW5pbWF0aW9uTW9kZWAgcGFyYW1ldGVyIHRvIGJlY29tZSByZXF1aXJlZC4KICAgICAgICBhbmltYXRpb25Nb2RlLCBfY2hhbmdlRGV0ZWN0b3JSZWYsIHRhYkluZGV4LCAKICAgICAgICAvLyBAYnJlYWtpbmctY2hhbmdlIDExLjAuMCBgX2RvY3VtZW50YCBwYXJhbWV0ZXIgdG8gYmVjb21lIHJlcXVpcmVkLgogICAgICAgIF9kb2N1bWVudCkgewogICAgICAgICAgICBzdXBlcihfZWxlbWVudFJlZik7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICAgICAgdGhpcy5fbmdab25lID0gX25nWm9uZTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjaGlwIGhhcyBmb2N1cy4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2hhc0ZvY3VzID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBXaGV0aGVyIHRoZSBjaGlwIGxpc3QgaXMgc2VsZWN0YWJsZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5jaGlwTGlzdFNlbGVjdGFibGUgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgY2hpcCBsaXN0IGlzIGluIG11bHRpLXNlbGVjdGlvbiBtb2RlLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fY2hpcExpc3RNdWx0aXBsZSA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hldGhlciB0aGUgY2hpcCBsaXN0IGFzIGEgd2hvbGUgaXMgZGlzYWJsZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9jaGlwTGlzdERpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGFibGUgPSB0cnVlOwogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9yZW1vdmFibGUgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHMgd2hlbiB0aGUgY2hpcCBpcyBmb2N1c2VkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fb25Gb2N1cyA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0cyB3aGVuIHRoZSBjaGlwIGlzIGJsdXJlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX29uQmx1ciA9IG5ldyBTdWJqZWN0KCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBFbWl0dGVkIHdoZW4gdGhlIGNoaXAgaXMgc2VsZWN0ZWQgb3IgZGVzZWxlY3RlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHRlZCB3aGVuIHRoZSBjaGlwIGlzIGRlc3Ryb3llZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZGVzdHJveWVkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRW1pdHRlZCB3aGVuIGEgY2hpcCBpcyB0byBiZSByZW1vdmVkLgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5yZW1vdmVkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLl9hZGRIb3N0Q2xhc3NOYW1lKCk7CiAgICAgICAgICAgIC8vIER5bmFtaWNhbGx5IGNyZWF0ZSB0aGUgcmlwcGxlIHRhcmdldCwgYXBwZW5kIGl0IHdpdGhpbiB0aGUgY2hpcCwgYW5kIHVzZSBpdCBhcyB0aGUKICAgICAgICAgICAgLy8gY2hpcCdzIHJpcHBsZSB0YXJnZXQuIEFkZGluZyB0aGUgY2xhc3MgJy5tYXQtY2hpcC1yaXBwbGUnIGVuc3VyZXMgdGhhdCBpdCB3aWxsIGhhdmUKICAgICAgICAgICAgLy8gdGhlIHByb3BlciBzdHlsZXMuCiAgICAgICAgICAgIHRoaXMuX2NoaXBSaXBwbGVUYXJnZXQgPSAoX2RvY3VtZW50IHx8IGRvY3VtZW50KS5jcmVhdGVFbGVtZW50KCdkaXYnKTsKICAgICAgICAgICAgdGhpcy5fY2hpcFJpcHBsZVRhcmdldC5jbGFzc0xpc3QuYWRkKCdtYXQtY2hpcC1yaXBwbGUnKTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LmFwcGVuZENoaWxkKHRoaXMuX2NoaXBSaXBwbGVUYXJnZXQpOwogICAgICAgICAgICB0aGlzLl9jaGlwUmlwcGxlID0gbmV3IFJpcHBsZVJlbmRlcmVyKHRoaXMsIF9uZ1pvbmUsIHRoaXMuX2NoaXBSaXBwbGVUYXJnZXQsIHBsYXRmb3JtKTsKICAgICAgICAgICAgdGhpcy5fY2hpcFJpcHBsZS5zZXR1cFRyaWdnZXJFdmVudHMoX2VsZW1lbnRSZWYpOwogICAgICAgICAgICB0aGlzLnJpcHBsZUNvbmZpZyA9IGdsb2JhbFJpcHBsZU9wdGlvbnMgfHwge307CiAgICAgICAgICAgIHRoaXMuX2FuaW1hdGlvbnNEaXNhYmxlZCA9IGFuaW1hdGlvbk1vZGUgPT09ICdOb29wQW5pbWF0aW9ucyc7CiAgICAgICAgICAgIHRoaXMudGFiSW5kZXggPSB0YWJJbmRleCAhPSBudWxsID8gKHBhcnNlSW50KHRhYkluZGV4KSB8fCAtMSkgOiAtMTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciByaXBwbGVzIGFyZSBkaXNhYmxlZCBvbiBpbnRlcmFjdGlvbgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcmlwcGxlRGlzYWJsZWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmRpc2FibGVkIHx8IHRoaXMuZGlzYWJsZVJpcHBsZSB8fCAhIXRoaXMucmlwcGxlQ29uZmlnLmRpc2FibGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBjaGlwIGlzIHNlbGVjdGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHNlbGVjdGVkKCkgeyByZXR1cm4gdGhpcy5fc2VsZWN0ZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgc2VsZWN0ZWQodmFsdWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb2VyY2VkVmFsdWUgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICBpZiAoY29lcmNlZFZhbHVlICE9PSB0aGlzLl9zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0ZWQgPSBjb2VyY2VkVmFsdWU7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaFNlbGVjdGlvbkNoYW5nZSgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSB2YWx1ZSBvZiB0aGUgY2hpcC4gRGVmYXVsdHMgdG8gdGhlIGNvbnRlbnQgaW5zaWRlIGA8bWF0LWNoaXA+YCB0YWdzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZhbHVlKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fdmFsdWUgIT09IHVuZGVmaW5lZAogICAgICAgICAgICAgICAgPyB0aGlzLl92YWx1ZQogICAgICAgICAgICAgICAgOiB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQudGV4dENvbnRlbnQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCB2YWx1ZSh2YWx1ZSkgeyB0aGlzLl92YWx1ZSA9IHZhbHVlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIGNoaXAgaXMgc2VsZWN0YWJsZS4gV2hlbiBhIGNoaXAgaXMgbm90IHNlbGVjdGFibGUsCiAgICAgICAgICogY2hhbmdlcyB0byBpdHMgc2VsZWN0ZWQgc3RhdGUgYXJlIGFsd2F5cyBpZ25vcmVkLiBCeSBkZWZhdWx0IGEgY2hpcCBpcwogICAgICAgICAqIHNlbGVjdGFibGUsIGFuZCBpdCBiZWNvbWVzIG5vbi1zZWxlY3RhYmxlIGlmIGl0cyBwYXJlbnQgY2hpcCBsaXN0IGlzCiAgICAgICAgICogbm90IHNlbGVjdGFibGUuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc2VsZWN0YWJsZSgpIHsgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGUgJiYgdGhpcy5jaGlwTGlzdFNlbGVjdGFibGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgc2VsZWN0YWJsZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3RhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgY2hpcCBpcyBkaXNhYmxlZC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBkaXNhYmxlZCgpIHsgcmV0dXJuIHRoaXMuX2NoaXBMaXN0RGlzYWJsZWQgfHwgdGhpcy5fZGlzYWJsZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgZGlzYWJsZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXRlcm1pbmVzIHdoZXRoZXIgb3Igbm90IHRoZSBjaGlwIGRpc3BsYXlzIHRoZSByZW1vdmUgc3R5bGluZyBhbmQgZW1pdHMgKHJlbW92ZWQpIGV2ZW50cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByZW1vdmFibGUoKSB7IHJldHVybiB0aGlzLl9yZW1vdmFibGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcmVtb3ZhYmxlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3JlbW92YWJsZSA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRoZSBBUklBIHNlbGVjdGVkIGFwcGxpZWQgdG8gdGhlIGNoaXAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYXJpYVNlbGVjdGVkKCkgewogICAgICAgICAgICAvLyBSZW1vdmUgdGhlIGBhcmlhLXNlbGVjdGVkYCB3aGVuIHRoZSBjaGlwIGlzIGRlc2VsZWN0ZWQgaW4gc2luZ2xlLXNlbGVjdGlvbiBtb2RlLCBiZWNhdXNlCiAgICAgICAgICAgIC8vIGl0IGFkZHMgbm9pc2UgdG8gTlZEQSB1c2VycyB3aGVyZSAibm90IHNlbGVjdGVkIiB3aWxsIGJlIHJlYWQgb3V0IGZvciBlYWNoIGNoaXAuCiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGFibGUgJiYgKHRoaXMuX2NoaXBMaXN0TXVsdGlwbGUgfHwgdGhpcy5zZWxlY3RlZCkgPwogICAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZC50b1N0cmluZygpIDogbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWRkSG9zdENsYXNzTmFtZSgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiYXNpY0NoaXBBdHRyTmFtZSA9ICdtYXQtYmFzaWMtY2hpcCc7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovICh0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpKTsKICAgICAgICAgICAgaWYgKGVsZW1lbnQuaGFzQXR0cmlidXRlKGJhc2ljQ2hpcEF0dHJOYW1lKSB8fAogICAgICAgICAgICAgICAgZWxlbWVudC50YWdOYW1lLnRvTG93ZXJDYXNlKCkgPT09IGJhc2ljQ2hpcEF0dHJOYW1lKSB7CiAgICAgICAgICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5hZGQoYmFzaWNDaGlwQXR0ck5hbWUpOwogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCdtYXQtc3RhbmRhcmQtY2hpcCcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMuZGVzdHJveWVkLmVtaXQoeyBjaGlwOiB0aGlzIH0pOwogICAgICAgICAgICB0aGlzLl9jaGlwUmlwcGxlLl9yZW1vdmVUcmlnZ2VyRXZlbnRzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlbGVjdHMgdGhlIGNoaXAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZWxlY3QoKSB7CiAgICAgICAgICAgIGlmICghdGhpcy5fc2VsZWN0ZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gdHJ1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9tYXJrRm9yQ2hlY2soKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBEZXNlbGVjdHMgdGhlIGNoaXAuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkZXNlbGVjdCgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IGZhbHNlOwogICAgICAgICAgICAgICAgdGhpcy5fZGlzcGF0Y2hTZWxlY3Rpb25DaGFuZ2UoKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFNlbGVjdCB0aGlzIGNoaXAgYW5kIGVtaXQgc2VsZWN0ZWQgZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNlbGVjdFZpYUludGVyYWN0aW9uKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGVkKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3RlZCA9IHRydWU7CiAgICAgICAgICAgICAgICB0aGlzLl9kaXNwYXRjaFNlbGVjdGlvbkNoYW5nZSh0cnVlKTsKICAgICAgICAgICAgICAgIHRoaXMuX21hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFRvZ2dsZXMgdGhlIGN1cnJlbnQgc2VsZWN0ZWQgc3RhdGUgb2YgdGhpcyBjaGlwLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzVXNlcklucHV0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b2dnbGVTZWxlY3RlZChpc1VzZXJJbnB1dCA9IGZhbHNlKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGVkID0gIXRoaXMuc2VsZWN0ZWQ7CiAgICAgICAgICAgIHRoaXMuX2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKGlzVXNlcklucHV0KTsKICAgICAgICAgICAgdGhpcy5fbWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIHJldHVybiB0aGlzLnNlbGVjdGVkOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgZm9yIHByb2dyYW1tYXRpYyBmb2N1c2luZyBvZiB0aGUgY2hpcC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZvY3VzKCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX2hhc0ZvY3VzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgICAgIHRoaXMuX29uRm9jdXMubmV4dCh7IGNoaXA6IHRoaXMgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5faGFzRm9jdXMgPSB0cnVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBbGxvd3MgZm9yIHByb2dyYW1tYXRpYyByZW1vdmFsIG9mIHRoZSBjaGlwLiBDYWxsZWQgYnkgdGhlIE1hdENoaXBMaXN0IHdoZW4gdGhlIERFTEVURSBvcgogICAgICAgICAqIEJBQ0tTUEFDRSBrZXlzIGFyZSBwcmVzc2VkLgogICAgICAgICAqCiAgICAgICAgICogSW5mb3JtcyBhbnkgbGlzdGVuZXJzIG9mIHRoZSByZW1vdmFsIHJlcXVlc3QuIERvZXMgbm90IHJlbW92ZSB0aGUgY2hpcCBmcm9tIHRoZSBET00uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZW1vdmUoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlbW92YWJsZSkgewogICAgICAgICAgICAgICAgdGhpcy5yZW1vdmVkLmVtaXQoeyBjaGlwOiB0aGlzIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZXMgY2xpY2sgZXZlbnRzIG9uIHRoZSBjaGlwLgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9oYW5kbGVDbGljayhldmVudCkgewogICAgICAgICAgICBpZiAodGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEhhbmRsZSBjdXN0b20ga2V5IHByZXNzZXMuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhbmRsZUtleWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgaWYgKHRoaXMuZGlzYWJsZWQpIHsKICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgfQogICAgICAgICAgICBzd2l0Y2ggKGV2ZW50LmtleUNvZGUpIHsKICAgICAgICAgICAgICAgIGNhc2UgREVMRVRFOgogICAgICAgICAgICAgICAgY2FzZSBCQUNLU1BBQ0U6CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgYXJlIHJlbW92YWJsZSwgcmVtb3ZlIHRoZSBmb2N1c2VkIGNoaXAKICAgICAgICAgICAgICAgICAgICB0aGlzLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgICAgIC8vIEFsd2F5cyBwcmV2ZW50IHNvIHBhZ2UgbmF2aWdhdGlvbiBkb2VzIG5vdCBvY2N1cgogICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICBjYXNlIFNQQUNFOgogICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGFyZSBzZWxlY3RhYmxlLCB0b2dnbGUgdGhlIGZvY3VzZWQgY2hpcAogICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50b2dnbGVTZWxlY3RlZCh0cnVlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgLy8gQWx3YXlzIHByZXZlbnQgc3BhY2UgZnJvbSBzY3JvbGxpbmcgdGhlIHBhZ2Ugc2luY2UgdGhlIGxpc3QgaGFzIGZvY3VzCiAgICAgICAgICAgICAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ibHVyKCkgewogICAgICAgICAgICAvLyBXaGVuIGFuaW1hdGlvbnMgYXJlIGVuYWJsZWQsIEFuZ3VsYXIgbWF5IGVuZCB1cCByZW1vdmluZyB0aGUgY2hpcCBmcm9tIHRoZSBET00gYSBsaXR0bGUKICAgICAgICAgICAgLy8gZWFybGllciB0aGFuIHVzdWFsLCBjYXVzaW5nIGl0IHRvIGJlIGJsdXJyZWQgYW5kIHRocm93aW5nIG9mZiB0aGUgbG9naWMgaW4gdGhlIGNoaXAgbGlzdAogICAgICAgICAgICAvLyB0aGF0IG1vdmVzIGZvY3VzIG5vdCB0aGUgbmV4dCBpdGVtLiBUbyB3b3JrIGFyb3VuZCB0aGUgaXNzdWUsIHdlIGRlZmVyIG1hcmtpbmcgdGhlIGNoaXAKICAgICAgICAgICAgLy8gYXMgbm90IGZvY3VzZWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgem9uZSBzdGFiaWxpemVzLgogICAgICAgICAgICB0aGlzLl9uZ1pvbmUub25TdGFibGUKICAgICAgICAgICAgICAgIC5hc09ic2VydmFibGUoKQogICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faGFzRm9jdXMgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9vbkJsdXIubmV4dCh7IGNoaXA6IHRoaXMgfSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez89fSBpc1VzZXJJbnB1dAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Rpc3BhdGNoU2VsZWN0aW9uQ2hhbmdlKGlzVXNlcklucHV0ID0gZmFsc2UpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25DaGFuZ2UuZW1pdCh7CiAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMsCiAgICAgICAgICAgICAgICBpc1VzZXJJbnB1dCwKICAgICAgICAgICAgICAgIHNlbGVjdGVkOiB0aGlzLl9zZWxlY3RlZAogICAgICAgICAgICB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9tYXJrRm9yQ2hlY2soKSB7CiAgICAgICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgOS4wLjAgUmVtb3ZlIHRoaXMgbWV0aG9kIG9uY2UgdGhlIF9jaGFuZ2VEZXRlY3RvclJlZiBpcyBhIHJlcXVpcmVkIHBhcmFtLgogICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0Q2hpcC7JtWZhYyA9IGZ1bmN0aW9uIE1hdENoaXBfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWF0Q2hpcCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChOZ1pvbmUpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KFBsYXRmb3JtKSwgybXJtWRpcmVjdGl2ZUluamVjdChNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChBTklNQVRJT05fTU9EVUxFX1RZUEUsIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KENoYW5nZURldGVjdG9yUmVmKSwgybXJtWluamVjdEF0dHJpYnV0ZSgndGFiaW5kZXgnKSwgybXJtWRpcmVjdGl2ZUluamVjdChET0NVTUVOVCQxLCA4KSk7IH07CiAgICBNYXRDaGlwLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdENoaXAsIHNlbGVjdG9yczogW1sibWF0LWJhc2ljLWNoaXAiXSwgWyIiLCAibWF0LWJhc2ljLWNoaXAiLCAiIl0sIFsibWF0LWNoaXAiXSwgWyIiLCAibWF0LWNoaXAiLCAiIl1dLCBjb250ZW50UXVlcmllczogZnVuY3Rpb24gTWF0Q2hpcF9Db250ZW50UXVlcmllcyhyZiwgY3R4LCBkaXJJbmRleCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVjb250ZW50UXVlcnkoZGlySW5kZXgsIE1hdENoaXBBdmF0YXIsIHRydWUpOwogICAgICAgICAgICDJtcm1Y29udGVudFF1ZXJ5KGRpckluZGV4LCBNYXRDaGlwVHJhaWxpbmdJY29uLCB0cnVlKTsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0Q2hpcFJlbW92ZSwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5hdmF0YXIgPSBfdC5maXJzdCk7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHgudHJhaWxpbmdJY29uID0gX3QuZmlyc3QpOwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LnJlbW92ZUljb24gPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0QXR0cnM6IFsicm9sZSIsICJvcHRpb24iLCAxLCAibWF0LWNoaXAiLCAibWF0LWZvY3VzLWluZGljYXRvciJdLCBob3N0VmFyczogMTQsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0Q2hpcF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRDaGlwX2NsaWNrX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlQ2xpY2soJGV2ZW50KTsgfSkoImtleWRvd24iLCBmdW5jdGlvbiBNYXRDaGlwX2tleWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9oYW5kbGVLZXlkb3duKCRldmVudCk7IH0pKCJmb2N1cyIsIGZ1bmN0aW9uIE1hdENoaXBfZm9jdXNfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4LmZvY3VzKCk7IH0pKCJibHVyIiwgZnVuY3Rpb24gTWF0Q2hpcF9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fYmx1cigpOyB9KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidGFiaW5kZXgiLCBjdHguZGlzYWJsZWQgPyBudWxsIDogY3R4LnRhYkluZGV4KSgiZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQgfHwgbnVsbCkoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtc2VsZWN0ZWQiLCBjdHguYXJpYVNlbGVjdGVkKTsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgibWF0LWNoaXAtc2VsZWN0ZWQiLCBjdHguc2VsZWN0ZWQpKCJtYXQtY2hpcC13aXRoLWF2YXRhciIsIGN0eC5hdmF0YXIpKCJtYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb24iLCBjdHgudHJhaWxpbmdJY29uIHx8IGN0eC5yZW1vdmVJY29uKSgibWF0LWNoaXAtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJfbWF0LWFuaW1hdGlvbi1ub29wYWJsZSIsIGN0eC5fYW5pbWF0aW9uc0Rpc2FibGVkKTsKICAgICAgICB9IH0sIGlucHV0czogeyBjb2xvcjogImNvbG9yIiwgZGlzYWJsZVJpcHBsZTogImRpc2FibGVSaXBwbGUiLCB0YWJJbmRleDogInRhYkluZGV4Iiwgc2VsZWN0ZWQ6ICJzZWxlY3RlZCIsIHZhbHVlOiAidmFsdWUiLCBzZWxlY3RhYmxlOiAic2VsZWN0YWJsZSIsIGRpc2FibGVkOiAiZGlzYWJsZWQiLCByZW1vdmFibGU6ICJyZW1vdmFibGUiIH0sIG91dHB1dHM6IHsgc2VsZWN0aW9uQ2hhbmdlOiAic2VsZWN0aW9uQ2hhbmdlIiwgZGVzdHJveWVkOiAiZGVzdHJveWVkIiwgcmVtb3ZlZDogInJlbW92ZWQiIH0sIGV4cG9ydEFzOiBbIm1hdENoaXAiXSwgZmVhdHVyZXM6IFvJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0Q2hpcC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IE5nWm9uZSB9LAogICAgICAgIHsgdHlwZTogUGxhdGZvcm0gfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtNQVRfUklQUExFX0dMT0JBTF9PUFRJT05TLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogQXR0cmlidXRlLCBhcmdzOiBbJ3RhYmluZGV4JyxdIH1dIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH0sIHsgdHlwZTogSW5qZWN0LCBhcmdzOiBbRE9DVU1FTlQkMSxdIH1dIH0KICAgIF07CiAgICBNYXRDaGlwLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGF2YXRhcjogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0Q2hpcEF2YXRhcixdIH1dLAogICAgICAgIHRyYWlsaW5nSWNvbjogW3sgdHlwZTogQ29udGVudENoaWxkLCBhcmdzOiBbTWF0Q2hpcFRyYWlsaW5nSWNvbixdIH1dLAogICAgICAgIHJlbW92ZUljb246IFt7IHR5cGU6IENvbnRlbnRDaGlsZCwgYXJnczogW2ZvcndhcmRSZWYoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gTWF0Q2hpcFJlbW92ZSkpLF0gfV0sCiAgICAgICAgc2VsZWN0ZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzZWxlY3RhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcmVtb3ZhYmxlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzZWxlY3Rpb25DaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBkZXN0cm95ZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICByZW1vdmVkOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKioKICAgICAqIEFwcGxpZXMgcHJvcGVyIChjbGljaykgc3VwcG9ydCBhbmQgYWRkcyBzdHlsaW5nIGZvciB1c2Ugd2l0aCB0aGUgTWF0ZXJpYWwgRGVzaWduICJjYW5jZWwiIGljb24KICAgICAqIGF2YWlsYWJsZSBhdCBodHRwczovL21hdGVyaWFsLmlvL2ljb25zLyNpY19jYW5jZWwuCiAgICAgKgogICAgICogRXhhbXBsZToKICAgICAqCiAgICAgKiAgICAgYDxtYXQtY2hpcD4KICAgICAqICAgICAgIDxtYXQtaWNvbiBtYXRDaGlwUmVtb3ZlPmNhbmNlbDwvbWF0LWljb24+CiAgICAgKiAgICAgPC9tYXQtY2hpcD5gCiAgICAgKgogICAgICogWW91ICptYXkqIHVzZSBhIGN1c3RvbSBpY29uLCBidXQgeW91IG1heSBuZWVkIHRvIG92ZXJyaWRlIHRoZSBgbWF0LWNoaXAtcmVtb3ZlYCBwb3NpdGlvbmluZwogICAgICogc3R5bGVzIHRvIHByb3Blcmx5IGNlbnRlciB0aGUgaWNvbiB3aXRoaW4gdGhlIGNoaXAuCiAgICAgKi8KICAgIGNsYXNzIE1hdENoaXBSZW1vdmUgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudENoaXAKICAgICAgICAgKiBAcGFyYW0gez89fSBlbGVtZW50UmVmCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX3BhcmVudENoaXAsIAogICAgICAgIC8vIEBicmVha2luZy1jaGFuZ2UgMTEuMC4wIGBlbGVtZW50UmVmYCBwYXJhbWV0ZXIgdG8gYmUgbWFkZSByZXF1aXJlZC4KICAgICAgICBlbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudENoaXAgPSBfcGFyZW50Q2hpcDsKICAgICAgICAgICAgLy8gQGJyZWFraW5nLWNoYW5nZSAxMS4wLjAgUmVtb3ZlIG51bGwgY2hlY2sgZm9yIGBlbGVtZW50UmVmYC4KICAgICAgICAgICAgaWYgKGVsZW1lbnRSZWYgJiYgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50Lm5vZGVOYW1lID09PSAnQlVUVE9OJykgewogICAgICAgICAgICAgICAgZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LnNldEF0dHJpYnV0ZSgndHlwZScsICdidXR0b24nKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDYWxscyB0aGUgcGFyZW50IGNoaXAncyBwdWJsaWMgYHJlbW92ZSgpYCBtZXRob2QgaWYgYXBwbGljYWJsZS4KICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaGFuZGxlQ2xpY2soZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwYXJlbnRDaGlwID0gdGhpcy5fcGFyZW50Q2hpcDsKICAgICAgICAgICAgaWYgKHBhcmVudENoaXAucmVtb3ZhYmxlICYmICFwYXJlbnRDaGlwLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICBwYXJlbnRDaGlwLnJlbW92ZSgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gc3RvcCBldmVudCBwcm9wYWdhdGlvbiBiZWNhdXNlIG90aGVyd2lzZSB0aGUgZXZlbnQgd2lsbCBidWJibGUgdXAgdG8gdGhlCiAgICAgICAgICAgIC8vIGZvcm0gZmllbGQgYW5kIGNhdXNlIHRoZSBgb25Db250YWluZXJDbGlja2AgbWV0aG9kIHRvIGJlIGludm9rZWQuIFRoaXMgbWV0aG9kIHdvdWxkIHRoZW4KICAgICAgICAgICAgLy8gcmVzZXQgdGhlIGZvY3VzZWQgY2hpcCB0aGF0IGhhcyBiZWVuIGZvY3VzZWQgYWZ0ZXIgY2hpcCByZW1vdmFsLiBVc3VhbGx5IHRoZSBwYXJlbnQKICAgICAgICAgICAgLy8gdGhlIHBhcmVudCBjbGljayBsaXN0ZW5lciBvZiB0aGUgYE1hdENoaXBgIHdvdWxkIHByZXZlbnQgcHJvcGFnYXRpb24sIGJ1dCBpdCBjYW4gaGFwcGVuCiAgICAgICAgICAgIC8vIHRoYXQgdGhlIGNoaXAgaXMgYmVpbmcgcmVtb3ZlZCBiZWZvcmUgdGhlIGV2ZW50IGJ1YmJsZXMgdXAuCiAgICAgICAgICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpOwogICAgICAgIH0KICAgIH0KICAgIE1hdENoaXBSZW1vdmUuybVmYWMgPSBmdW5jdGlvbiBNYXRDaGlwUmVtb3ZlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdENoaXBSZW1vdmUpKMm1ybVkaXJlY3RpdmVJbmplY3QoTWF0Q2hpcCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZikpOyB9OwogICAgTWF0Q2hpcFJlbW92ZS7JtWRpciA9IMm1ybVkZWZpbmVEaXJlY3RpdmUoeyB0eXBlOiBNYXRDaGlwUmVtb3ZlLCBzZWxlY3RvcnM6IFtbIiIsICJtYXRDaGlwUmVtb3ZlIiwgIiJdXSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1jaGlwLXJlbW92ZSIsICJtYXQtY2hpcC10cmFpbGluZy1pY29uIl0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0Q2hpcFJlbW92ZV9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBNYXRDaGlwUmVtb3ZlX2NsaWNrX0hvc3RCaW5kaW5nSGFuZGxlcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5faGFuZGxlQ2xpY2soJGV2ZW50KTsgfSk7CiAgICAgICAgfSB9IH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNYXRDaGlwUmVtb3ZlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogTWF0Q2hpcCB9LAogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9CiAgICBdOwogICAgLyoqCiAgICAgKiBJbmplY3Rpb24gdG9rZW4gdG8gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBvcHRpb25zIGZvciB0aGUgY2hpcHMgbW9kdWxlLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IE1BVF9DSElQU19ERUZBVUxUX09QVElPTlMgPSBuZXcgSW5qZWN0aW9uVG9rZW4oJ21hdC1jaGlwcy1kZWZhdWx0LW9wdGlvbnMnKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9jaGlwcy9jaGlwLWxpc3QudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLy8gQm9pbGVycGxhdGUgZm9yIGFwcGx5aW5nIG1peGlucyB0byBNYXRDaGlwTGlzdC4KICAgIC8qKgogICAgICogXEBkb2NzLXByaXZhdGUKICAgICAqLwogICAgY2xhc3MgTWF0Q2hpcExpc3RCYXNlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIKICAgICAgICAgKiBAcGFyYW0gez99IF9wYXJlbnRGb3JtCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybUdyb3VwCiAgICAgICAgICogQHBhcmFtIHs/fSBuZ0NvbnRyb2wKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBfcGFyZW50Rm9ybSwgX3BhcmVudEZvcm1Hcm91cCwgbmdDb250cm9sKSB7CiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlciA9IF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXI7CiAgICAgICAgICAgIHRoaXMuX3BhcmVudEZvcm0gPSBfcGFyZW50Rm9ybTsKICAgICAgICAgICAgdGhpcy5fcGFyZW50Rm9ybUdyb3VwID0gX3BhcmVudEZvcm1Hcm91cDsKICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSBuZ0NvbnRyb2w7CiAgICAgICAgfQogICAgfQogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgX01hdENoaXBMaXN0TWl4aW5CYXNlID0gbWl4aW5FcnJvclN0YXRlKE1hdENoaXBMaXN0QmFzZSk7CiAgICAvLyBJbmNyZWFzaW5nIGludGVnZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGlkcyBmb3IgY2hpcC1saXN0IGNvbXBvbmVudHMuCiAgICAvKiogQHR5cGUgez99ICovCiAgICBsZXQgbmV4dFVuaXF1ZUlkJDcgPSAwOwogICAgLyoqCiAgICAgKiBDaGFuZ2UgZXZlbnQgb2JqZWN0IHRoYXQgaXMgZW1pdHRlZCB3aGVuIHRoZSBjaGlwIGxpc3QgdmFsdWUgaGFzIGNoYW5nZWQuCiAgICAgKi8KICAgIGNsYXNzIE1hdENoaXBMaXN0Q2hhbmdlIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHNvdXJjZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICB0aGlzLnZhbHVlID0gdmFsdWU7CiAgICAgICAgfQogICAgfQogICAgLyoqCiAgICAgKiBBIG1hdGVyaWFsIGRlc2lnbiBjaGlwcyBjb21wb25lbnQgKG5hbWVkIENoaXBMaXN0IGZvciBpdHMgc2ltaWxhcml0eSB0byB0aGUgTGlzdCBjb21wb25lbnQpLgogICAgICovCiAgICBjbGFzcyBNYXRDaGlwTGlzdCBleHRlbmRzIF9NYXRDaGlwTGlzdE1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqIEBwYXJhbSB7P30gX2NoYW5nZURldGVjdG9yUmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZGlyCiAgICAgICAgICogQHBhcmFtIHs/fSBfcGFyZW50Rm9ybQogICAgICAgICAqIEBwYXJhbSB7P30gX3BhcmVudEZvcm1Hcm91cAogICAgICAgICAqIEBwYXJhbSB7P30gX2RlZmF1bHRFcnJvclN0YXRlTWF0Y2hlcgogICAgICAgICAqIEBwYXJhbSB7P30gbmdDb250cm9sCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoX2VsZW1lbnRSZWYsIF9jaGFuZ2VEZXRlY3RvclJlZiwgX2RpciwgX3BhcmVudEZvcm0sIF9wYXJlbnRGb3JtR3JvdXAsIF9kZWZhdWx0RXJyb3JTdGF0ZU1hdGNoZXIsIG5nQ29udHJvbCkgewogICAgICAgICAgICBzdXBlcihfZGVmYXVsdEVycm9yU3RhdGVNYXRjaGVyLCBfcGFyZW50Rm9ybSwgX3BhcmVudEZvcm1Hcm91cCwgbmdDb250cm9sKTsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZiA9IF9jaGFuZ2VEZXRlY3RvclJlZjsKICAgICAgICAgICAgdGhpcy5fZGlyID0gX2RpcjsKICAgICAgICAgICAgdGhpcy5uZ0NvbnRyb2wgPSBuZ0NvbnRyb2w7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNvbnRyb2xUeXBlID0gJ21hdC1jaGlwLWxpc3QnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogV2hlbiBhIGNoaXAgaXMgZGVzdHJveWVkLCB3ZSBzdG9yZSB0aGUgaW5kZXggb2YgdGhlIGRlc3Ryb3llZCBjaGlwIHVudGlsIHRoZSBjaGlwcwogICAgICAgICAgICAgKiBxdWVyeSBsaXN0IG5vdGlmaWVzIGFib3V0IHRoZSB1cGRhdGUuIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugd2UgY2Fubm90IGRldGVybWluZSBhbgogICAgICAgICAgICAgKiBhcHByb3ByaWF0ZSBjaGlwIHRoYXQgc2hvdWxkIHJlY2VpdmUgZm9jdXMgdW50aWwgdGhlIGFycmF5IG9mIGNoaXBzIHVwZGF0ZWQgY29tcGxldGVseS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXggPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogU3ViamVjdCB0aGF0IGVtaXRzIHdoZW4gdGhlIGNvbXBvbmVudCBoYXMgYmVlbiBkZXN0cm95ZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9kZXN0cm95ZWQgPSBuZXcgU3ViamVjdCgpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVWlkIG9mIHRoZSBjaGlwIGxpc3QKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuX3VpZCA9IGBtYXQtY2hpcC1saXN0LSR7bmV4dFVuaXF1ZUlkJDcrK31gOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVGFiIGluZGV4IGZvciB0aGUgY2hpcCBsaXN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5fdGFiSW5kZXggPSAwOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVXNlciBkZWZpbmVkIHRhYiBpbmRleC4KICAgICAgICAgICAgICogV2hlbiBpdCBpcyBub3QgbnVsbCwgdXNlIHVzZXIgZGVmaW5lZCB0YWIgaW5kZXguIE90aGVyd2lzZSB1c2UgX3RhYkluZGV4CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl91c2VyVGFiSW5kZXggPSBudWxsOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRnVuY3Rpb24gd2hlbiB0b3VjaGVkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7IH0pOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRnVuY3Rpb24gd2hlbiBjaGFuZ2VkCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsgfSk7CiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2NvbXBhcmVXaXRoID0gKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IG8xCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gbzIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChvMSwgbzIpID0+IG8xID09PSBvMik7CiAgICAgICAgICAgIHRoaXMuX3JlcXVpcmVkID0gZmFsc2U7CiAgICAgICAgICAgIHRoaXMuX2Rpc2FibGVkID0gZmFsc2U7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBPcmllbnRhdGlvbiBvZiB0aGUgY2hpcCBsaXN0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hcmlhT3JpZW50YXRpb24gPSAnaG9yaXpvbnRhbCc7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGFibGUgPSB0cnVlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgZW1pdHRlZCB3aGVuIHRoZSBzZWxlY3RlZCBjaGlwIGxpc3QgdmFsdWUgaGFzIGJlZW4gY2hhbmdlZCBieSB0aGUgdXNlci4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuY2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogRXZlbnQgdGhhdCBlbWl0cyB3aGVuZXZlciB0aGUgcmF3IHZhbHVlIG9mIHRoZSBjaGlwLWxpc3QgY2hhbmdlcy4gVGhpcyBpcyBoZXJlIHByaW1hcmlseQogICAgICAgICAgICAgKiB0byBmYWNpbGl0YXRlIHRoZSB0d28td2F5IGJpbmRpbmcgZm9yIHRoZSBgdmFsdWVgIGlucHV0LgogICAgICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy52YWx1ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgaWYgKHRoaXMubmdDb250cm9sKSB7CiAgICAgICAgICAgICAgICB0aGlzLm5nQ29udHJvbC52YWx1ZUFjY2Vzc29yID0gdGhpczsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgYXJyYXkgb2Ygc2VsZWN0ZWQgY2hpcHMgaW5zaWRlIGNoaXAgbGlzdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzZWxlY3RlZCgpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMubXVsdGlwbGUgPyB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3RlZCA6IHRoaXMuX3NlbGVjdGlvbk1vZGVsLnNlbGVjdGVkWzBdOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBUaGUgQVJJQSByb2xlIGFwcGxpZWQgdG8gdGhlIGNoaXAgbGlzdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCByb2xlKCkgeyByZXR1cm4gdGhpcy5lbXB0eSA/IG51bGwgOiAnbGlzdGJveCc7IH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSB1c2VyIHNob3VsZCBiZSBhbGxvd2VkIHRvIHNlbGVjdCBtdWx0aXBsZSBjaGlwcy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBtdWx0aXBsZSgpIHsgcmV0dXJuIHRoaXMuX211bHRpcGxlOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IG11bHRpcGxlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX211bHRpcGxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fc3luY0NoaXBzU3RhdGUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQSBmdW5jdGlvbiB0byBjb21wYXJlIHRoZSBvcHRpb24gdmFsdWVzIHdpdGggdGhlIHNlbGVjdGVkIHZhbHVlcy4gVGhlIGZpcnN0IGFyZ3VtZW50CiAgICAgICAgICogaXMgYSB2YWx1ZSBmcm9tIGFuIG9wdGlvbi4gVGhlIHNlY29uZCBpcyBhIHZhbHVlIGZyb20gdGhlIHNlbGVjdGlvbi4gQSBib29sZWFuCiAgICAgICAgICogc2hvdWxkIGJlIHJldHVybmVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGNvbXBhcmVXaXRoKCkgeyByZXR1cm4gdGhpcy5fY29tcGFyZVdpdGg7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgY29tcGFyZVdpdGgoZm4pIHsKICAgICAgICAgICAgdGhpcy5fY29tcGFyZVdpdGggPSBmbjsKICAgICAgICAgICAgaWYgKHRoaXMuX3NlbGVjdGlvbk1vZGVsKSB7CiAgICAgICAgICAgICAgICAvLyBBIGRpZmZlcmVudCBjb21wYXJhdG9yIG1lYW5zIHRoZSBzZWxlY3Rpb24gY291bGQgY2hhbmdlLgogICAgICAgICAgICAgICAgdGhpcy5faW5pdGlhbGl6ZVNlbGVjdGlvbigpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHZhbHVlKCkgeyByZXR1cm4gdGhpcy5fdmFsdWU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgdmFsdWUodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHZhbHVlKTsKICAgICAgICAgICAgdGhpcy5fdmFsdWUgPSB2YWx1ZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgaWQoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jaGlwSW5wdXQgPyB0aGlzLl9jaGlwSW5wdXQuaWQgOiB0aGlzLl91aWQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHJlcXVpcmVkKCkgeyByZXR1cm4gdGhpcy5fcmVxdWlyZWQ7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgcmVxdWlyZWQodmFsdWUpIHsKICAgICAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgTWF0Rm9ybUZpZWxkQ29udHJvbC4KICAgICAgICAgKiBcQGRvY3MtcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IHBsYWNlaG9sZGVyKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5fY2hpcElucHV0ID8gdGhpcy5fY2hpcElucHV0LnBsYWNlaG9sZGVyIDogdGhpcy5fcGxhY2Vob2xkZXI7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBwbGFjZWhvbGRlcih2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9wbGFjZWhvbGRlciA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgYW55IGNoaXBzIG9yIHRoZSBtYXRDaGlwSW5wdXQgaW5zaWRlIG9mIHRoaXMgY2hpcC1saXN0IGhhcyBmb2N1cy4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBmb2N1c2VkKCkgewogICAgICAgICAgICByZXR1cm4gKHRoaXMuX2NoaXBJbnB1dCAmJiB0aGlzLl9jaGlwSW5wdXQuZm9jdXNlZCkgfHwgdGhpcy5faGFzRm9jdXNlZENoaXAoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZW1wdHkoKSB7CiAgICAgICAgICAgIHJldHVybiAoIXRoaXMuX2NoaXBJbnB1dCB8fCB0aGlzLl9jaGlwSW5wdXQuZW1wdHkpICYmIHRoaXMuY2hpcHMubGVuZ3RoID09PSAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIE1hdEZvcm1GaWVsZENvbnRyb2wuCiAgICAgICAgICogXEBkb2NzLXByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBzaG91bGRMYWJlbEZsb2F0KCkgeyByZXR1cm4gIXRoaXMuZW1wdHkgfHwgdGhpcy5mb2N1c2VkOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLm5nQ29udHJvbCA/ICEhdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQgOiB0aGlzLl9kaXNhYmxlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBkaXNhYmxlZCh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9kaXNhYmxlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7CiAgICAgICAgICAgIHRoaXMuX3N5bmNDaGlwc1N0YXRlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgb3Igbm90IHRoaXMgY2hpcCBsaXN0IGlzIHNlbGVjdGFibGUuIFdoZW4gYSBjaGlwIGxpc3QgaXMgbm90IHNlbGVjdGFibGUsCiAgICAgICAgICogdGhlIHNlbGVjdGVkIHN0YXRlcyBmb3IgYWxsIHRoZSBjaGlwcyBpbnNpZGUgdGhlIGNoaXAgbGlzdCBhcmUgYWx3YXlzIGlnbm9yZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgc2VsZWN0YWJsZSgpIHsgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7IH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXQgc2VsZWN0YWJsZSh2YWx1ZSkgewogICAgICAgICAgICB0aGlzLl9zZWxlY3RhYmxlID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsKICAgICAgICAgICAgaWYgKHRoaXMuY2hpcHMpIHsKICAgICAgICAgICAgICAgIHRoaXMuY2hpcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNoaXAKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGNoaXAgPT4gY2hpcC5jaGlwTGlzdFNlbGVjdGFibGUgPSB0aGlzLl9zZWxlY3RhYmxlKSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IHRhYkluZGV4KHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX3VzZXJUYWJJbmRleCA9IHZhbHVlOwogICAgICAgICAgICB0aGlzLl90YWJJbmRleCA9IHZhbHVlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21iaW5lZCBzdHJlYW0gb2YgYWxsIG9mIHRoZSBjaGlsZCBjaGlwcycgc2VsZWN0aW9uIGNoYW5nZSBldmVudHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2hpcFNlbGVjdGlvbkNoYW5nZXMoKSB7CiAgICAgICAgICAgIHJldHVybiBtZXJnZSguLi50aGlzLmNoaXBzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2hpcCA9PiBjaGlwLnNlbGVjdGlvbkNoYW5nZSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ29tYmluZWQgc3RyZWFtIG9mIGFsbCBvZiB0aGUgY2hpbGQgY2hpcHMnIGZvY3VzIGNoYW5nZSBldmVudHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2hpcEZvY3VzQ2hhbmdlcygpIHsKICAgICAgICAgICAgcmV0dXJuIG1lcmdlKC4uLnRoaXMuY2hpcHMubWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjaGlwCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjaGlwID0+IGNoaXAuX29uRm9jdXMpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENvbWJpbmVkIHN0cmVhbSBvZiBhbGwgb2YgdGhlIGNoaWxkIGNoaXBzJyBibHVyIGNoYW5nZSBldmVudHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2hpcEJsdXJDaGFuZ2VzKCkgewogICAgICAgICAgICByZXR1cm4gbWVyZ2UoLi4udGhpcy5jaGlwcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGNoaXAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGNoaXAgPT4gY2hpcC5fb25CbHVyKSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBDb21iaW5lZCBzdHJlYW0gb2YgYWxsIG9mIHRoZSBjaGlsZCBjaGlwcycgcmVtb3ZlIGNoYW5nZSBldmVudHMuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgY2hpcFJlbW92ZUNoYW5nZXMoKSB7CiAgICAgICAgICAgIHJldHVybiBtZXJnZSguLi50aGlzLmNoaXBzLm1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2hpcCA9PiBjaGlwLmRlc3Ryb3llZCkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIgPSBuZXcgRm9jdXNLZXlNYW5hZ2VyKHRoaXMuY2hpcHMpCiAgICAgICAgICAgICAgICAud2l0aFdyYXAoKQogICAgICAgICAgICAgICAgLndpdGhWZXJ0aWNhbE9yaWVudGF0aW9uKCkKICAgICAgICAgICAgICAgIC53aXRoSG9yaXpvbnRhbE9yaWVudGF0aW9uKHRoaXMuX2RpciA/IHRoaXMuX2Rpci52YWx1ZSA6ICdsdHInKTsKICAgICAgICAgICAgaWYgKHRoaXMuX2RpcikgewogICAgICAgICAgICAgICAgdGhpcy5fZGlyLmNoYW5nZQogICAgICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLl9kZXN0cm95ZWQpKQogICAgICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkaXIKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIGRpciA9PiB0aGlzLl9rZXlNYW5hZ2VyLndpdGhIb3Jpem9udGFsT3JpZW50YXRpb24oZGlyKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIudGFiT3V0LnBpcGUodGFrZVVudGlsKHRoaXMuX2Rlc3Ryb3llZCkpLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLl9hbGxvd0ZvY3VzRXNjYXBlKCk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgLy8gV2hlbiB0aGUgbGlzdCBjaGFuZ2VzLCByZS1zdWJzY3JpYmUKICAgICAgICAgICAgdGhpcy5jaGlwcy5jaGFuZ2VzLnBpcGUoc3RhcnRXaXRoKG51bGwpLCB0YWtlVW50aWwodGhpcy5fZGVzdHJveWVkKSkuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBoYXBwZW5zIGFmdGVyIHRoZSBjb250ZW50IGhhcyBiZWVuCiAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tlZCwgd2UgbmVlZCB0byBkZWZlciBpdCB0byB0aGUgbmV4dCB0aWNrLgogICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zeW5jQ2hpcHNTdGF0ZSgpOwogICAgICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHRoaXMuX3Jlc2V0Q2hpcHMoKTsKICAgICAgICAgICAgICAgIC8vIFJlc2V0IGNoaXBzIHNlbGVjdGVkL2Rlc2VsZWN0ZWQgc3RhdHVzCiAgICAgICAgICAgICAgICB0aGlzLl9pbml0aWFsaXplU2VsZWN0aW9uKCk7CiAgICAgICAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaWYgd2UgbmVlZCB0byB1cGRhdGUgb3VyIHRhYiBpbmRleAogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlVGFiSW5kZXgoKTsKICAgICAgICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBpZiB3ZSBoYXZlIGEgZGVzdHJveWVkIGNoaXAgYW5kIG5lZWQgdG8gcmVmb2N1cwogICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlRm9jdXNGb3JEZXN0cm95ZWRDaGlwcygpOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsID0gbmV3IFNlbGVjdGlvbk1vZGVsKHRoaXMubXVsdGlwbGUsIHVuZGVmaW5lZCwgZmFsc2UpOwogICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdEb0NoZWNrKCkgewogICAgICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wpIHsKICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gcmUtZXZhbHVhdGUgdGhpcyBvbiBldmVyeSBjaGFuZ2UgZGV0ZWN0aW9uIGN5Y2xlLCBiZWNhdXNlIHRoZXJlIGFyZSBzb21lCiAgICAgICAgICAgICAgICAvLyBlcnJvciB0cmlnZ2VycyB0aGF0IHdlIGNhbid0IHN1YnNjcmliZSB0byAoZS5nLiBwYXJlbnQgZm9ybSBzdWJtaXNzaW9ucykuIFRoaXMgbWVhbnMKICAgICAgICAgICAgICAgIC8vIHRoYXQgd2hhdGV2ZXIgbG9naWMgaXMgaW4gaGVyZSBoYXMgdG8gYmUgc3VwZXIgbGVhbiBvciB3ZSByaXNrIGRlc3Ryb3lpbmcgdGhlIHBlcmZvcm1hbmNlLgogICAgICAgICAgICAgICAgdGhpcy51cGRhdGVFcnJvclN0YXRlKCk7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQgIT09IHRoaXMuX2Rpc2FibGVkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9ICEhdGhpcy5uZ0NvbnRyb2wuZGlzYWJsZWQ7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uRGVzdHJveSgpIHsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkLm5leHQoKTsKICAgICAgICAgICAgdGhpcy5fZGVzdHJveWVkLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLmNvbXBsZXRlKCk7CiAgICAgICAgICAgIHRoaXMuX2Ryb3BTdWJzY3JpcHRpb25zKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEFzc29jaWF0ZXMgYW4gSFRNTCBpbnB1dCBlbGVtZW50IHdpdGggdGhpcyBjaGlwIGxpc3QuCiAgICAgICAgICogQHBhcmFtIHs/fSBpbnB1dEVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVySW5wdXQoaW5wdXRFbGVtZW50KSB7CiAgICAgICAgICAgIHRoaXMuX2NoaXBJbnB1dCA9IGlucHV0RWxlbWVudDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBpZHMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldERlc2NyaWJlZEJ5SWRzKGlkcykgeyB0aGlzLl9hcmlhRGVzY3JpYmVkYnkgPSBpZHMuam9pbignICcpOyB9CiAgICAgICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmNoaXBzKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9zZXRTZWxlY3Rpb25CeVZhbHVlKHZhbHVlLCBmYWxzZSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLy8gSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWdpc3Rlck9uQ2hhbmdlKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uQ2hhbmdlID0gZm47CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPblRvdWNoZWQoZm4pIHsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gZm47CiAgICAgICAgfQogICAgICAgIC8vIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBNYXRGb3JtRmllbGRDb250cm9sLgogICAgICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25Db250YWluZXJDbGljayhldmVudCkgewogICAgICAgICAgICBpZiAoIXRoaXMuX29yaWdpbmF0ZXNGcm9tQ2hpcChldmVudCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuZm9jdXMoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIHRoZSBmaXJzdCBub24tZGlzYWJsZWQgY2hpcCBpbiB0aGlzIGNoaXAgbGlzdCwgb3IgdGhlIGFzc29jaWF0ZWQgaW5wdXQgd2hlbiB0aGVyZQogICAgICAgICAqIGFyZSBubyBlbGlnaWJsZSBjaGlwcy4KICAgICAgICAgKiBAcGFyYW0gez89fSBvcHRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmb2N1cyhvcHRpb25zKSB7CiAgICAgICAgICAgIGlmICh0aGlzLmRpc2FibGVkKSB7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gVE9ETzogQVJJQSBzYXlzIHRoaXMgc2hvdWxkIGZvY3VzIHRoZSBmaXJzdCBgc2VsZWN0ZWRgIGNoaXAgaWYgYW55IGFyZSBzZWxlY3RlZC4KICAgICAgICAgICAgLy8gRm9jdXMgb24gZmlyc3QgZWxlbWVudCBpZiB0aGVyZSdzIG5vIGNoaXBJbnB1dCBpbnNpZGUgY2hpcC1saXN0CiAgICAgICAgICAgIGlmICh0aGlzLl9jaGlwSW5wdXQgJiYgdGhpcy5fY2hpcElucHV0LmZvY3VzZWQpIDsKICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5jaGlwcy5sZW5ndGggPiAwKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEZpcnN0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgdGhpcy5fZm9jdXNJbnB1dChvcHRpb25zKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBBdHRlbXB0IHRvIGZvY3VzIGFuIGlucHV0IGlmIHdlIGhhdmUgb25lLgogICAgICAgICAqIEBwYXJhbSB7Pz19IG9wdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9mb2N1c0lucHV0KG9wdGlvbnMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX2NoaXBJbnB1dCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hpcElucHV0LmZvY3VzKG9wdGlvbnMpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFBhc3MgZXZlbnRzIHRvIHRoZSBrZXlib2FyZCBtYW5hZ2VyLiBBdmFpbGFibGUgaGVyZSBmb3IgdGVzdHMuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2tleWRvd24oZXZlbnQpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0YXJnZXQgPSAoLyoqIEB0eXBlIHs/fSAqLyAoZXZlbnQudGFyZ2V0KSk7CiAgICAgICAgICAgIC8vIElmIHRoZXkgYXJlIG9uIGFuIGVtcHR5IGlucHV0IGFuZCBoaXQgYmFja3NwYWNlLCBmb2N1cyB0aGUgbGFzdCBjaGlwCiAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBCQUNLU1BBQ0UgJiYgdGhpcy5faXNJbnB1dEVtcHR5KHRhcmdldCkpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0TGFzdEl0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAodGFyZ2V0ICYmIHRhcmdldC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1jaGlwJykpIHsKICAgICAgICAgICAgICAgIGlmIChldmVudC5rZXlDb2RlID09PSBIT01FKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRGaXJzdEl0ZW1BY3RpdmUoKTsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZXZlbnQua2V5Q29kZSA9PT0gRU5EKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fa2V5TWFuYWdlci5zZXRMYXN0SXRlbUFjdGl2ZSgpOwogICAgICAgICAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLm9uS2V5ZG93bihldmVudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB0aGlzLnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQ2hlY2sgdGhlIHRhYiBpbmRleCBhcyB5b3Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkIHRvIGZvY3VzIGFuIGVtcHR5IGxpc3QuCiAgICAgICAgICogQHByb3RlY3RlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3VwZGF0ZVRhYkluZGV4KCkgewogICAgICAgICAgICAvLyBJZiB3ZSBoYXZlIDAgY2hpcHMsIHdlIHNob3VsZCBub3QgYWxsb3cga2V5Ym9hcmQgZm9jdXMKICAgICAgICAgICAgdGhpcy5fdGFiSW5kZXggPSB0aGlzLl91c2VyVGFiSW5kZXggfHwgKHRoaXMuY2hpcHMubGVuZ3RoID09PSAwID8gLTEgOiAwKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSWYgdGhlIGFtb3VudCBvZiBjaGlwcyBjaGFuZ2VkLCB3ZSBuZWVkIHRvIHVwZGF0ZSB0aGUKICAgICAgICAgKiBrZXkgbWFuYWdlciBzdGF0ZSBhbmQgZm9jdXMgdGhlIG5leHQgY2xvc2VzdCBjaGlwLgogICAgICAgICAqIEBwcm90ZWN0ZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF91cGRhdGVGb2N1c0ZvckRlc3Ryb3llZENoaXBzKCkgewogICAgICAgICAgICAvLyBNb3ZlIGZvY3VzIHRvIHRoZSBjbG9zZXN0IGNoaXAuIElmIG5vIG90aGVyIGNoaXBzIHJlbWFpbiwgZm9jdXMgdGhlIGNoaXAtbGlzdCBpdHNlbGYuCiAgICAgICAgICAgIGlmICh0aGlzLl9sYXN0RGVzdHJveWVkQ2hpcEluZGV4ICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLmNoaXBzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdDaGlwSW5kZXggPSBNYXRoLm1pbih0aGlzLl9sYXN0RGVzdHJveWVkQ2hpcEluZGV4LCB0aGlzLmNoaXBzLmxlbmd0aCAtIDEpOwogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShuZXdDaGlwSW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5mb2N1cygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuX2xhc3REZXN0cm95ZWRDaGlwSW5kZXggPSBudWxsOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBVdGlsaXR5IHRvIGVuc3VyZSBhbGwgaW5kZXhlcyBhcmUgdmFsaWQuCiAgICAgICAgICoKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gaW5kZXggVGhlIGluZGV4IHRvIGJlIGNoZWNrZWQuCiAgICAgICAgICogQHJldHVybiB7P30gVHJ1ZSBpZiB0aGUgaW5kZXggaXMgdmFsaWQgZm9yIG91ciBsaXN0IG9mIGNoaXBzLgogICAgICAgICAqLwogICAgICAgIF9pc1ZhbGlkSW5kZXgoaW5kZXgpIHsKICAgICAgICAgICAgcmV0dXJuIGluZGV4ID49IDAgJiYgaW5kZXggPCB0aGlzLmNoaXBzLmxlbmd0aDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc0lucHV0RW1wdHkoZWxlbWVudCkgewogICAgICAgICAgICBpZiAoZWxlbWVudCAmJiBlbGVtZW50Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09ICdpbnB1dCcpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBpbnB1dCA9ICgvKiogQHR5cGUgez99ICovIChlbGVtZW50KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gIWlucHV0LnZhbHVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEBwYXJhbSB7Pz19IGlzVXNlcklucHV0CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfc2V0U2VsZWN0aW9uQnlWYWx1ZSh2YWx1ZSwgaXNVc2VySW5wdXQgPSB0cnVlKSB7CiAgICAgICAgICAgIHRoaXMuX2NsZWFyU2VsZWN0aW9uKCk7CiAgICAgICAgICAgIHRoaXMuY2hpcHMuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2hpcCA9PiBjaGlwLmRlc2VsZWN0KCkpKTsKICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7CiAgICAgICAgICAgICAgICB2YWx1ZS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY3VycmVudFZhbHVlCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjdXJyZW50VmFsdWUgPT4gdGhpcy5fc2VsZWN0VmFsdWUoY3VycmVudFZhbHVlLCBpc1VzZXJJbnB1dCkpKTsKICAgICAgICAgICAgICAgIHRoaXMuX3NvcnRWYWx1ZXMoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNvcnJlc3BvbmRpbmdDaGlwID0gdGhpcy5fc2VsZWN0VmFsdWUodmFsdWUsIGlzVXNlcklucHV0KTsKICAgICAgICAgICAgICAgIC8vIFNoaWZ0IGZvY3VzIHRvIHRoZSBhY3RpdmUgaXRlbS4gTm90ZSB0aGF0IHdlIHNob3VsZG4ndCBkbyB0aGlzIGluIG11bHRpcGxlCiAgICAgICAgICAgICAgICAvLyBtb2RlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cgd2hhdCBjaGlwIHRoZSB1c2VyIGludGVyYWN0ZWQgd2l0aCBsYXN0LgogICAgICAgICAgICAgICAgaWYgKGNvcnJlc3BvbmRpbmdDaGlwKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKGlzVXNlcklucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIuc2V0QWN0aXZlSXRlbShjb3JyZXNwb25kaW5nQ2hpcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEZpbmRzIGFuZCBzZWxlY3RzIHRoZSBjaGlwIGJhc2VkIG9uIGl0cyB2YWx1ZS4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcGFyYW0gez89fSBpc1VzZXJJbnB1dAogICAgICAgICAqIEByZXR1cm4gez99IENoaXAgdGhhdCBoYXMgdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUuCiAgICAgICAgICovCiAgICAgICAgX3NlbGVjdFZhbHVlKHZhbHVlLCBpc1VzZXJJbnB1dCA9IHRydWUpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3JyZXNwb25kaW5nQ2hpcCA9IHRoaXMuY2hpcHMuZmluZCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgY2hpcCA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY2hpcC52YWx1ZSAhPSBudWxsICYmIHRoaXMuX2NvbXBhcmVXaXRoKGNoaXAudmFsdWUsIHZhbHVlKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAoY29ycmVzcG9uZGluZ0NoaXApIHsKICAgICAgICAgICAgICAgIGlzVXNlcklucHV0ID8gY29ycmVzcG9uZGluZ0NoaXAuc2VsZWN0VmlhSW50ZXJhY3Rpb24oKSA6IGNvcnJlc3BvbmRpbmdDaGlwLnNlbGVjdCgpOwogICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGNvcnJlc3BvbmRpbmdDaGlwKTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gY29ycmVzcG9uZGluZ0NoaXA7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfaW5pdGlhbGl6ZVNlbGVjdGlvbigpIHsKICAgICAgICAgICAgLy8gRGVmZXIgc2V0dGluZyB0aGUgdmFsdWUgaW4gb3JkZXIgdG8gYXZvaWQgdGhlICJFeHByZXNzaW9uCiAgICAgICAgICAgIC8vIGhhcyBjaGFuZ2VkIGFmdGVyIGl0IHdhcyBjaGVja2VkIiBlcnJvcnMgZnJvbSBBbmd1bGFyLgogICAgICAgICAgICBQcm9taXNlLnJlc29sdmUoKS50aGVuKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIGlmICh0aGlzLm5nQ29udHJvbCB8fCB0aGlzLl92YWx1ZSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3NldFNlbGVjdGlvbkJ5VmFsdWUodGhpcy5uZ0NvbnRyb2wgPyB0aGlzLm5nQ29udHJvbC52YWx1ZSA6IHRoaXMuX3ZhbHVlLCBmYWxzZSk7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIERlc2VsZWN0cyBldmVyeSBjaGlwIGluIHRoZSBsaXN0LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gc2tpcCBDaGlwIHRoYXQgc2hvdWxkIG5vdCBiZSBkZXNlbGVjdGVkLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2NsZWFyU2VsZWN0aW9uKHNraXApIHsKICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uTW9kZWwuY2xlYXIoKTsKICAgICAgICAgICAgdGhpcy5jaGlwcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjaGlwCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjaGlwID0+IHsKICAgICAgICAgICAgICAgIGlmIChjaGlwICE9PSBza2lwKSB7CiAgICAgICAgICAgICAgICAgICAgY2hpcC5kZXNlbGVjdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogU29ydHMgdGhlIG1vZGVsIHZhbHVlcywgZW5zdXJpbmcgdGhhdCB0aGV5IGtlZXAgdGhlIHNhbWUKICAgICAgICAgKiBvcmRlciB0aGF0IHRoZXkgaGF2ZSBpbiB0aGUgcGFuZWwuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9zb3J0VmFsdWVzKCkgewogICAgICAgICAgICBpZiAodGhpcy5fbXVsdGlwbGUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbk1vZGVsLmNsZWFyKCk7CiAgICAgICAgICAgICAgICB0aGlzLmNoaXBzLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjaGlwCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICBjaGlwID0+IHsKICAgICAgICAgICAgICAgICAgICBpZiAoY2hpcC5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9zZWxlY3Rpb25Nb2RlbC5zZWxlY3QoY2hpcCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEVtaXRzIGNoYW5nZSBldmVudCB0byBzZXQgdGhlIG1vZGVsIHZhbHVlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/PX0gZmFsbGJhY2tWYWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3Byb3BhZ2F0ZUNoYW5nZXMoZmFsbGJhY2tWYWx1ZSkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCB2YWx1ZVRvRW1pdCA9IG51bGw7CiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuc2VsZWN0ZWQpKSB7CiAgICAgICAgICAgICAgICB2YWx1ZVRvRW1pdCA9IHRoaXMuc2VsZWN0ZWQubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2hpcCA9PiBjaGlwLnZhbHVlKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB2YWx1ZVRvRW1pdCA9IHRoaXMuc2VsZWN0ZWQgPyB0aGlzLnNlbGVjdGVkLnZhbHVlIDogZmFsbGJhY2tWYWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl92YWx1ZSA9IHZhbHVlVG9FbWl0OwogICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBNYXRDaGlwTGlzdENoYW5nZSh0aGlzLCB2YWx1ZVRvRW1pdCkpOwogICAgICAgICAgICB0aGlzLnZhbHVlQ2hhbmdlLmVtaXQodmFsdWVUb0VtaXQpOwogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh2YWx1ZVRvRW1pdCk7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGVuIGJsdXJyZWQsIG1hcmsgdGhlIGZpZWxkIGFzIHRvdWNoZWQgd2hlbiBmb2N1cyBtb3ZlZCBvdXRzaWRlIHRoZSBjaGlwIGxpc3QuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYmx1cigpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9oYXNGb2N1c2VkQ2hpcCgpKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9rZXlNYW5hZ2VyLnNldEFjdGl2ZUl0ZW0oLTEpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghdGhpcy5kaXNhYmxlZCkgewogICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NoaXBJbnB1dCkgewogICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYSBjaGlwIGlucHV0LCB3ZSBzaG91bGQgY2hlY2sgd2hldGhlciB0aGUgZm9jdXMgbW92ZWQgdG8gY2hpcCBpbnB1dC4KICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgZm9jdXMgaXMgbm90IG1vdmVkIHRvIGNoaXAgaW5wdXQsIG1hcmsgdGhlIGZpZWxkIGFzIHRvdWNoZWQuIElmIHRoZSBmb2N1cyBtb3ZlZAogICAgICAgICAgICAgICAgICAgIC8vIHRvIGNoaXAgaW5wdXQsIGRvIG5vdGhpbmcuCiAgICAgICAgICAgICAgICAgICAgLy8gVGltZW91dCBpcyBuZWVkZWQgdG8gd2FpdCBmb3IgdGhlIGZvY3VzKCkgZXZlbnQgdHJpZ2dlciBvbiBjaGlwIGlucHV0LgogICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZm9jdXNlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFya0FzVG91Y2hlZCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBjaGlwIGlucHV0LCB0aGVuIG1hcmsgdGhlIGZpZWxkIGFzIHRvdWNoZWQuCiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFya0FzVG91Y2hlZCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1hcmsgdGhlIGZpZWxkIGFzIHRvdWNoZWQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9tYXJrQXNUb3VjaGVkKCkgewogICAgICAgICAgICB0aGlzLl9vblRvdWNoZWQoKTsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmVtb3ZlcyB0aGUgYHRhYmluZGV4YCBmcm9tIHRoZSBjaGlwIGxpc3QgYW5kIHJlc2V0cyBpdCBiYWNrIGFmdGVyd2FyZHMsIGFsbG93aW5nIHRoZQogICAgICAgICAqIHVzZXIgdG8gdGFiIG91dCBvZiBpdC4gVGhpcyBwcmV2ZW50cyB0aGUgbGlzdCBmcm9tIGNhcHR1cmluZyBmb2N1cyBhbmQgcmVkaXJlY3RpbmcKICAgICAgICAgKiBpdCBiYWNrIHRvIHRoZSBmaXJzdCBjaGlwLCBjcmVhdGluZyBhIGZvY3VzIHRyYXAsIGlmIGl0IHVzZXIgdHJpZXMgdG8gdGFiIGF3YXkuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfYWxsb3dGb2N1c0VzY2FwZSgpIHsKICAgICAgICAgICAgaWYgKHRoaXMuX3RhYkluZGV4ICE9PSAtMSkgewogICAgICAgICAgICAgICAgdGhpcy5fdGFiSW5kZXggPSAtMTsKICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoKC8qKgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuX3RhYkluZGV4ID0gdGhpcy5fdXNlclRhYkluZGV4IHx8IDA7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYubWFya0ZvckNoZWNrKCk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9yZXNldENoaXBzKCkgewogICAgICAgICAgICB0aGlzLl9kcm9wU3Vic2NyaXB0aW9ucygpOwogICAgICAgICAgICB0aGlzLl9saXN0ZW5Ub0NoaXBzRm9jdXMoKTsKICAgICAgICAgICAgdGhpcy5fbGlzdGVuVG9DaGlwc1NlbGVjdGlvbigpOwogICAgICAgICAgICB0aGlzLl9saXN0ZW5Ub0NoaXBzUmVtb3ZlZCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2Ryb3BTdWJzY3JpcHRpb25zKCkgewogICAgICAgICAgICBpZiAodGhpcy5fY2hpcEZvY3VzU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGlwRm9jdXNTdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoaXBGb2N1c1N1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKHRoaXMuX2NoaXBCbHVyU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGlwQmx1clN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hpcEJsdXJTdWJzY3JpcHRpb24gPSBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICh0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uKSB7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7CiAgICAgICAgICAgICAgICB0aGlzLl9jaGlwU2VsZWN0aW9uU3Vic2NyaXB0aW9uID0gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBpZiAodGhpcy5fY2hpcFJlbW92ZVN1YnNjcmlwdGlvbikgewogICAgICAgICAgICAgICAgdGhpcy5fY2hpcFJlbW92ZVN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpOwogICAgICAgICAgICAgICAgdGhpcy5fY2hpcFJlbW92ZVN1YnNjcmlwdGlvbiA9IG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTGlzdGVucyB0byB1c2VyLWdlbmVyYXRlZCBzZWxlY3Rpb24gZXZlbnRzIG9uIGVhY2ggY2hpcC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2xpc3RlblRvQ2hpcHNTZWxlY3Rpb24oKSB7CiAgICAgICAgICAgIHRoaXMuX2NoaXBTZWxlY3Rpb25TdWJzY3JpcHRpb24gPSB0aGlzLmNoaXBTZWxlY3Rpb25DaGFuZ2VzLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGV2ZW50ID0+IHsKICAgICAgICAgICAgICAgIGV2ZW50LnNvdXJjZS5zZWxlY3RlZAogICAgICAgICAgICAgICAgICAgID8gdGhpcy5fc2VsZWN0aW9uTW9kZWwuc2VsZWN0KGV2ZW50LnNvdXJjZSkKICAgICAgICAgICAgICAgICAgICA6IHRoaXMuX3NlbGVjdGlvbk1vZGVsLmRlc2VsZWN0KGV2ZW50LnNvdXJjZSk7CiAgICAgICAgICAgICAgICAvLyBGb3Igc2luZ2xlIHNlbGVjdGlvbiBjaGlwIGxpc3QsIG1ha2Ugc3VyZSB0aGUgZGVzZWxlY3RlZCB2YWx1ZSBpcyB1bnNlbGVjdGVkLgogICAgICAgICAgICAgICAgaWYgKCF0aGlzLm11bHRpcGxlKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5jaGlwcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGNoaXAKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIGNoaXAgPT4gewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX3NlbGVjdGlvbk1vZGVsLmlzU2VsZWN0ZWQoY2hpcCkgJiYgY2hpcC5zZWxlY3RlZCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpcC5kZXNlbGVjdCgpOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGV2ZW50LmlzVXNlcklucHV0KSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5fcHJvcGFnYXRlQ2hhbmdlcygpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIExpc3RlbnMgdG8gdXNlci1nZW5lcmF0ZWQgc2VsZWN0aW9uIGV2ZW50cyBvbiBlYWNoIGNoaXAuCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9saXN0ZW5Ub0NoaXBzRm9jdXMoKSB7CiAgICAgICAgICAgIHRoaXMuX2NoaXBGb2N1c1N1YnNjcmlwdGlvbiA9IHRoaXMuY2hpcEZvY3VzQ2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgY2hpcEluZGV4ID0gdGhpcy5jaGlwcy50b0FycmF5KCkuaW5kZXhPZihldmVudC5jaGlwKTsKICAgICAgICAgICAgICAgIGlmICh0aGlzLl9pc1ZhbGlkSW5kZXgoY2hpcEluZGV4KSkgewogICAgICAgICAgICAgICAgICAgIHRoaXMuX2tleU1hbmFnZXIudXBkYXRlQWN0aXZlSXRlbShjaGlwSW5kZXgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5zdGF0ZUNoYW5nZXMubmV4dCgpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIHRoaXMuX2NoaXBCbHVyU3Vic2NyaXB0aW9uID0gdGhpcy5jaGlwQmx1ckNoYW5nZXMuc3Vic2NyaWJlKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIHRoaXMuX2JsdXIoKTsKICAgICAgICAgICAgICAgIHRoaXMuc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2xpc3RlblRvQ2hpcHNSZW1vdmVkKCkgewogICAgICAgICAgICB0aGlzLl9jaGlwUmVtb3ZlU3Vic2NyaXB0aW9uID0gdGhpcy5jaGlwUmVtb3ZlQ2hhbmdlcy5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBldmVudCA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBjaGlwID0gZXZlbnQuY2hpcDsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGNoaXBJbmRleCA9IHRoaXMuY2hpcHMudG9BcnJheSgpLmluZGV4T2YoZXZlbnQuY2hpcCk7CiAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBjaGlwIHRoYXQgd2lsbCBiZSByZW1vdmVkIGlzIGN1cnJlbnRseSBmb2N1c2VkLCB3ZSB0ZW1wb3JhcmlseSBzdG9yZQogICAgICAgICAgICAgICAgLy8gdGhlIGluZGV4IGluIG9yZGVyIHRvIGJlIGFibGUgdG8gZGV0ZXJtaW5lIGFuIGFwcHJvcHJpYXRlIHNpYmxpbmcgY2hpcCB0aGF0IHdpbGwKICAgICAgICAgICAgICAgIC8vIHJlY2VpdmUgZm9jdXMuCiAgICAgICAgICAgICAgICBpZiAodGhpcy5faXNWYWxpZEluZGV4KGNoaXBJbmRleCkgJiYgY2hpcC5faGFzRm9jdXMpIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLl9sYXN0RGVzdHJveWVkQ2hpcEluZGV4ID0gY2hpcEluZGV4OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIGFuIGV2ZW50IGNvbWVzIGZyb20gaW5zaWRlIGEgY2hpcCBlbGVtZW50LgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29yaWdpbmF0ZXNGcm9tQ2hpcChldmVudCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGxldCBjdXJyZW50RWxlbWVudCA9ICgvKiogQHR5cGUgez99ICovIChldmVudC50YXJnZXQpKTsKICAgICAgICAgICAgd2hpbGUgKGN1cnJlbnRFbGVtZW50ICYmIGN1cnJlbnRFbGVtZW50ICE9PSB0aGlzLl9lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQpIHsKICAgICAgICAgICAgICAgIGlmIChjdXJyZW50RWxlbWVudC5jbGFzc0xpc3QuY29udGFpbnMoJ21hdC1jaGlwJykpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGN1cnJlbnRFbGVtZW50ID0gY3VycmVudEVsZW1lbnQucGFyZW50RWxlbWVudDsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIGFueSBvZiB0aGUgY2hpcHMgaXMgZm9jdXNlZC4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX2hhc0ZvY3VzZWRDaGlwKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5jaGlwcy5zb21lKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBjaGlwCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBjaGlwID0+IGNoaXAuX2hhc0ZvY3VzKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFN5bmNzIHRoZSBsaXN0J3Mgc3RhdGUgd2l0aCB0aGUgaW5kaXZpZHVhbCBjaGlwcy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX3N5bmNDaGlwc1N0YXRlKCkgewogICAgICAgICAgICBpZiAodGhpcy5jaGlwcykgewogICAgICAgICAgICAgICAgdGhpcy5jaGlwcy5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gY2hpcAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgY2hpcCA9PiB7CiAgICAgICAgICAgICAgICAgICAgY2hpcC5fY2hpcExpc3REaXNhYmxlZCA9IHRoaXMuX2Rpc2FibGVkOwogICAgICAgICAgICAgICAgICAgIGNoaXAuX2NoaXBMaXN0TXVsdGlwbGUgPSB0aGlzLm11bHRpcGxlOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTWF0Q2hpcExpc3QuybVmYWMgPSBmdW5jdGlvbiBNYXRDaGlwTGlzdF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRDaGlwTGlzdCkoybXJtWRpcmVjdGl2ZUluamVjdChFbGVtZW50UmVmKSwgybXJtWRpcmVjdGl2ZUluamVjdChDaGFuZ2VEZXRlY3RvclJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nRm9ybSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRm9ybUdyb3VwRGlyZWN0aXZlLCA4KSwgybXJtWRpcmVjdGl2ZUluamVjdChFcnJvclN0YXRlTWF0Y2hlciksIMm1ybVkaXJlY3RpdmVJbmplY3QoTmdDb250cm9sLCAxMCkpOyB9OwogICAgTWF0Q2hpcExpc3QuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWF0Q2hpcExpc3QsIHNlbGVjdG9yczogW1sibWF0LWNoaXAtbGlzdCJdXSwgY29udGVudFF1ZXJpZXM6IGZ1bmN0aW9uIE1hdENoaXBMaXN0X0NvbnRlbnRRdWVyaWVzKHJmLCBjdHgsIGRpckluZGV4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWNvbnRlbnRRdWVyeShkaXJJbmRleCwgTWF0Q2hpcCwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5jaGlwcyA9IF90KTsKICAgICAgICB9IH0sIGhvc3RBdHRyczogWzEsICJtYXQtY2hpcC1saXN0Il0sIGhvc3RWYXJzOiAxNSwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBNYXRDaGlwTGlzdF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiZm9jdXMiLCBmdW5jdGlvbiBNYXRDaGlwTGlzdF9mb2N1c19Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguZm9jdXMoKTsgfSkoImJsdXIiLCBmdW5jdGlvbiBNYXRDaGlwTGlzdF9ibHVyX0hvc3RCaW5kaW5nSGFuZGxlcigpIHsgcmV0dXJuIGN0eC5fYmx1cigpOyB9KSgia2V5ZG93biIsIGZ1bmN0aW9uIE1hdENoaXBMaXN0X2tleWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9rZXlkb3duKCRldmVudCk7IH0pOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1aG9zdFByb3BlcnR5KCJpZCIsIGN0eC5fdWlkKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgidGFiaW5kZXgiLCBjdHguZGlzYWJsZWQgPyBudWxsIDogY3R4Ll90YWJJbmRleCkoImFyaWEtZGVzY3JpYmVkYnkiLCBjdHguX2FyaWFEZXNjcmliZWRieSB8fCBudWxsKSgiYXJpYS1yZXF1aXJlZCIsIGN0eC5yb2xlID8gY3R4LnJlcXVpcmVkIDogbnVsbCkoImFyaWEtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQudG9TdHJpbmcoKSkoImFyaWEtaW52YWxpZCIsIGN0eC5lcnJvclN0YXRlKSgiYXJpYS1tdWx0aXNlbGVjdGFibGUiLCBjdHgubXVsdGlwbGUpKCJyb2xlIiwgY3R4LnJvbGUpKCJhcmlhLW9yaWVudGF0aW9uIiwgY3R4LmFyaWFPcmllbnRhdGlvbik7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1jaGlwLWxpc3QtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtY2hpcC1saXN0LWludmFsaWQiLCBjdHguZXJyb3JTdGF0ZSkoIm1hdC1jaGlwLWxpc3QtcmVxdWlyZWQiLCBjdHgucmVxdWlyZWQpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGFyaWFPcmllbnRhdGlvbjogWyJhcmlhLW9yaWVudGF0aW9uIiwgImFyaWFPcmllbnRhdGlvbiJdLCBtdWx0aXBsZTogIm11bHRpcGxlIiwgY29tcGFyZVdpdGg6ICJjb21wYXJlV2l0aCIsIHZhbHVlOiAidmFsdWUiLCByZXF1aXJlZDogInJlcXVpcmVkIiwgcGxhY2Vob2xkZXI6ICJwbGFjZWhvbGRlciIsIGRpc2FibGVkOiAiZGlzYWJsZWQiLCBzZWxlY3RhYmxlOiAic2VsZWN0YWJsZSIsIHRhYkluZGV4OiAidGFiSW5kZXgiLCBlcnJvclN0YXRlTWF0Y2hlcjogImVycm9yU3RhdGVNYXRjaGVyIiB9LCBvdXRwdXRzOiB7IGNoYW5nZTogImNoYW5nZSIsIHZhbHVlQ2hhbmdlOiAidmFsdWVDaGFuZ2UiIH0sIGV4cG9ydEFzOiBbIm1hdENoaXBMaXN0Il0sIGZlYXR1cmVzOiBbybXJtVByb3ZpZGVyc0ZlYXR1cmUoW3sgcHJvdmlkZTogTWF0Rm9ybUZpZWxkQ29udHJvbCwgdXNlRXhpc3Rpbmc6IE1hdENoaXBMaXN0IH1dKSwgybXJtUluaGVyaXREZWZpbml0aW9uRmVhdHVyZV0sIG5nQ29udGVudFNlbGVjdG9yczogX2MwJHUsIGRlY2xzOiAyLCB2YXJzOiAwLCBjb25zdHM6IFtbMSwgIm1hdC1jaGlwLWxpc3Qtd3JhcHBlciJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdENoaXBMaXN0X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtXByb2plY3Rpb24oMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSB9LCBzdHlsZXM6IFsiLm1hdC1jaGlwe3Bvc2l0aW9uOnJlbGF0aXZlO2JveC1zaXppbmc6Ym9yZGVyLWJveDstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCk7Ym9yZGVyOm5vbmU7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwe3RyYW5zaXRpb246Ym94LXNoYWRvdyAyODBtcyBjdWJpYy1iZXppZXIoMC40LCAwLCAwLjIsIDEpO2Rpc3BsYXk6aW5saW5lLWZsZXg7cGFkZGluZzo3cHggMTJweDtib3JkZXItcmFkaXVzOjE2cHg7YWxpZ24taXRlbXM6Y2VudGVyO2N1cnNvcjpkZWZhdWx0O21pbi1oZWlnaHQ6MzJweDtoZWlnaHQ6MXB4fS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZS5tYXQtc3RhbmRhcmQtY2hpcHt0cmFuc2l0aW9uOm5vbmU7YW5pbWF0aW9uOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257d2lkdGg6MThweDtoZWlnaHQ6MThweH0ubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye3RvcDowO2xlZnQ6MDtyaWdodDowO2JvdHRvbTowO3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6aW5oZXJpdDtvcGFjaXR5OjA7Y29udGVudDpcIlwiO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5IDIwMG1zIGN1YmljLWJlemllcigwLjM1LCAwLCAwLjI1LCAxKX0ubWF0LXN0YW5kYXJkLWNoaXA6aG92ZXI6OmFmdGVye29wYWNpdHk6LjEyfS5tYXQtc3RhbmRhcmQtY2hpcDpmb2N1c3tvdXRsaW5lOm5vbmV9Lm1hdC1zdGFuZGFyZC1jaGlwOmZvY3VzOjphZnRlcntvcGFjaXR5Oi4xNn0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc3RhbmRhcmQtY2hpcHtvdXRsaW5lOnNvbGlkIDFweH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc3RhbmRhcmQtY2hpcDpmb2N1c3tvdXRsaW5lOmRvdHRlZCAycHh9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkOjphZnRlcntvcGFjaXR5OjB9Lm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkIC5tYXQtY2hpcC1yZW1vdmUsLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkIC5tYXQtY2hpcC10cmFpbGluZy1pY29ue2N1cnNvcjpkZWZhdWx0fS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb24ubWF0LWNoaXAtd2l0aC1hdmF0YXIsLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctdG9wOjA7cGFkZGluZy1ib3R0b206MH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29uLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctcmlnaHQ6OHB4O3BhZGRpbmctbGVmdDowfVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC10cmFpbGluZy1pY29uLm1hdC1jaGlwLXdpdGgtYXZhdGFye3BhZGRpbmctbGVmdDo4cHg7cGFkZGluZy1yaWdodDowfS5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC13aXRoLXRyYWlsaW5nLWljb257cGFkZGluZy10b3A6N3B4O3BhZGRpbmctYm90dG9tOjdweDtwYWRkaW5nLXJpZ2h0OjhweDtwYWRkaW5nLWxlZnQ6MTJweH1bZGlyPXJ0bF0gLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXdpdGgtdHJhaWxpbmctaWNvbntwYWRkaW5nLWxlZnQ6OHB4O3BhZGRpbmctcmlnaHQ6MTJweH0ubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy1sZWZ0OjA7cGFkZGluZy1yaWdodDoxMnB4fVtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtd2l0aC1hdmF0YXJ7cGFkZGluZy1yaWdodDowO3BhZGRpbmctbGVmdDoxMnB4fS5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtYXZhdGFye3dpZHRoOjI0cHg7aGVpZ2h0OjI0cHg7bWFyZ2luLXJpZ2h0OjhweDttYXJnaW4tbGVmdDo0cHh9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtYXZhdGFye21hcmdpbi1sZWZ0OjhweDttYXJnaW4tcmlnaHQ6NHB4fS5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbnt3aWR0aDoxOHB4O2hlaWdodDoxOHB4O2N1cnNvcjpwb2ludGVyfS5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtdHJhaWxpbmctaWNvbnttYXJnaW4tbGVmdDo4cHg7bWFyZ2luLXJpZ2h0OjB9W2Rpcj1ydGxdIC5tYXQtc3RhbmRhcmQtY2hpcCAubWF0LWNoaXAtcmVtb3ZlLFtkaXI9cnRsXSAubWF0LXN0YW5kYXJkLWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb257bWFyZ2luLXJpZ2h0OjhweDttYXJnaW4tbGVmdDowfS5tYXQtY2hpcC1yaXBwbGV7dG9wOjA7bGVmdDowO3JpZ2h0OjA7Ym90dG9tOjA7cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6bm9uZTtib3JkZXItcmFkaXVzOmluaGVyaXQ7b3ZlcmZsb3c6aGlkZGVufS5tYXQtY2hpcC1saXN0LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6d3JhcDthbGlnbi1pdGVtczpjZW50ZXI7bWFyZ2luOi00cHh9Lm1hdC1jaGlwLWxpc3Qtd3JhcHBlciBpbnB1dC5tYXQtaW5wdXQtZWxlbWVudCwubWF0LWNoaXAtbGlzdC13cmFwcGVyIC5tYXQtc3RhbmRhcmQtY2hpcHttYXJnaW46NHB4fS5tYXQtY2hpcC1saXN0LXN0YWNrZWQgLm1hdC1jaGlwLWxpc3Qtd3JhcHBlcntmbGV4LWRpcmVjdGlvbjpjb2x1bW47YWxpZ24taXRlbXM6ZmxleC1zdGFydH0ubWF0LWNoaXAtbGlzdC1zdGFja2VkIC5tYXQtY2hpcC1saXN0LXdyYXBwZXIgLm1hdC1zdGFuZGFyZC1jaGlwe3dpZHRoOjEwMCV9Lm1hdC1jaGlwLWF2YXRhcntib3JkZXItcmFkaXVzOjUwJTtqdXN0aWZ5LWNvbnRlbnQ6Y2VudGVyO2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7b3ZlcmZsb3c6aGlkZGVuO29iamVjdC1maXQ6Y292ZXJ9aW5wdXQubWF0LWNoaXAtaW5wdXR7d2lkdGg6MTUwcHg7bWFyZ2luOjRweDtmbGV4OjEgMCAxNTBweH1cbiJdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdENoaXBMaXN0LmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogRWxlbWVudFJlZiB9LAogICAgICAgIHsgdHlwZTogQ2hhbmdlRGV0ZWN0b3JSZWYgfSwKICAgICAgICB7IHR5cGU6IERpcmVjdGlvbmFsaXR5LCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogTmdGb3JtLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRm9ybUdyb3VwRGlyZWN0aXZlLCBkZWNvcmF0b3JzOiBbeyB0eXBlOiBPcHRpb25hbCB9XSB9LAogICAgICAgIHsgdHlwZTogRXJyb3JTdGF0ZU1hdGNoZXIgfSwKICAgICAgICB7IHR5cGU6IE5nQ29udHJvbCwgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBTZWxmIH1dIH0KICAgIF07CiAgICBNYXRDaGlwTGlzdC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBlcnJvclN0YXRlTWF0Y2hlcjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbXVsdGlwbGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbXBhcmVXaXRoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB2YWx1ZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgcmVxdWlyZWQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBkaXNhYmxlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYXJpYU9yaWVudGF0aW9uOiBbeyB0eXBlOiBJbnB1dCwgYXJnczogWydhcmlhLW9yaWVudGF0aW9uJyxdIH1dLAogICAgICAgIHNlbGVjdGFibGU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHRhYkluZGV4OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICB2YWx1ZUNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIGNoaXBzOiBbeyB0eXBlOiBDb250ZW50Q2hpbGRyZW4sIGFyZ3M6IFtNYXRDaGlwLCB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdXNlIGBkZXNjZW5kYW50czogdHJ1ZWAsIGJlY2F1c2UgSXZ5IHdpbGwgbm8gbG9uZ2VyIG1hdGNoCiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGlyZWN0IGRlc2NlbmRhbnRzIGlmIGl0J3MgbGVmdCBhcyBmYWxzZS4KICAgICAgICAgICAgICAgICAgICAgICAgZGVzY2VuZGFudHM6IHRydWUKICAgICAgICAgICAgICAgICAgICB9LF0gfV0KICAgIH07CiAgICAvLyBJbmNyZWFzaW5nIGludGVnZXIgZm9yIGdlbmVyYXRpbmcgdW5pcXVlIGlkcy4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZXh0VW5pcXVlSWQkMSQxID0gMDsKICAgIC8qKgogICAgICogRGlyZWN0aXZlIHRoYXQgYWRkcyBjaGlwLXNwZWNpZmljIGJlaGF2aW9ycyB0byBhbiBpbnB1dCBlbGVtZW50IGluc2lkZSBgPG1hdC1mb3JtLWZpZWxkPmAuCiAgICAgKiBNYXkgYmUgcGxhY2VkIGluc2lkZSBvciBvdXRzaWRlIG9mIGFuIGA8bWF0LWNoaXAtbGlzdD5gLgogICAgICovCiAgICBjbGFzcyBNYXRDaGlwSW5wdXQgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gX2VsZW1lbnRSZWYKICAgICAgICAgKiBAcGFyYW0gez99IF9kZWZhdWx0T3B0aW9ucwogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmLCBfZGVmYXVsdE9wdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5fZWxlbWVudFJlZiA9IF9lbGVtZW50UmVmOwogICAgICAgICAgICB0aGlzLl9kZWZhdWx0T3B0aW9ucyA9IF9kZWZhdWx0T3B0aW9uczsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGNvbnRyb2wgaXMgZm9jdXNlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLl9hZGRPbkJsdXIgPSBmYWxzZTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFRoZSBsaXN0IG9mIGtleSBjb2RlcyB0aGF0IHdpbGwgdHJpZ2dlciBhIGNoaXBFbmQgZXZlbnQuCiAgICAgICAgICAgICAqCiAgICAgICAgICAgICAqIERlZmF1bHRzIHRvIGBbRU5URVJdYC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2VwYXJhdG9yS2V5Q29kZXMgPSB0aGlzLl9kZWZhdWx0T3B0aW9ucy5zZXBhcmF0b3JLZXlDb2RlczsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEVtaXR0ZWQgd2hlbiBhIGNoaXAgaXMgdG8gYmUgYWRkZWQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNoaXBFbmQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgaW5wdXQncyBwbGFjZWhvbGRlciB0ZXh0LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5wbGFjZWhvbGRlciA9ICcnOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVW5pcXVlIGlkIGZvciB0aGUgaW5wdXQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmlkID0gYG1hdC1jaGlwLWxpc3QtaW5wdXQtJHtuZXh0VW5pcXVlSWQkMSQxKyt9YDsKICAgICAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50ID0gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMuX2VsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBSZWdpc3RlciBpbnB1dCBmb3IgY2hpcCBsaXN0CiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGNoaXBMaXN0KHZhbHVlKSB7CiAgICAgICAgICAgIGlmICh2YWx1ZSkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hpcExpc3QgPSB2YWx1ZTsKICAgICAgICAgICAgICAgIHRoaXMuX2NoaXBMaXN0LnJlZ2lzdGVySW5wdXQodGhpcyk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciBvciBub3QgdGhlIGNoaXBFbmQgZXZlbnQgd2lsbCBiZSBlbWl0dGVkIHdoZW4gdGhlIGlucHV0IGlzIGJsdXJyZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgYWRkT25CbHVyKCkgeyByZXR1cm4gdGhpcy5fYWRkT25CbHVyOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGFkZE9uQmx1cih2YWx1ZSkgeyB0aGlzLl9hZGRPbkJsdXIgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogV2hldGhlciB0aGUgaW5wdXQgaXMgZGlzYWJsZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgZGlzYWJsZWQoKSB7IHJldHVybiB0aGlzLl9kaXNhYmxlZCB8fCAodGhpcy5fY2hpcExpc3QgJiYgdGhpcy5fY2hpcExpc3QuZGlzYWJsZWQpOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSB2YWx1ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0IGRpc2FibGVkKHZhbHVlKSB7IHRoaXMuX2Rpc2FibGVkID0gY29lcmNlQm9vbGVhblByb3BlcnR5KHZhbHVlKTsgfQogICAgICAgIC8qKgogICAgICAgICAqIFdoZXRoZXIgdGhlIGlucHV0IGlzIGVtcHR5LgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZ2V0IGVtcHR5KCkgeyByZXR1cm4gIXRoaXMuX2lucHV0RWxlbWVudC52YWx1ZTsgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoKSB7CiAgICAgICAgICAgIHRoaXMuX2NoaXBMaXN0LnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIFV0aWxpdHkgbWV0aG9kIHRvIG1ha2UgaG9zdCBkZWZpbml0aW9uL3Rlc3RzIG1vcmUgY2xlYXIuCiAgICAgICAgICogQHBhcmFtIHs/PX0gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9rZXlkb3duKGV2ZW50KSB7CiAgICAgICAgICAgIC8vIEFsbG93IHRoZSB1c2VyJ3MgZm9jdXMgdG8gZXNjYXBlIHdoZW4gdGhleSdyZSB0YWJiaW5nIGZvcndhcmQuIE5vdGUgdGhhdCB3ZSBkb24ndAogICAgICAgICAgICAvLyB3YW50IHRvIGRvIHRoaXMgd2hlbiBnb2luZyBiYWNrd2FyZHMsIGJlY2F1c2UgZm9jdXMgc2hvdWxkIGdvIGJhY2sgdG8gdGhlIGZpcnN0IGNoaXAuCiAgICAgICAgICAgIGlmIChldmVudCAmJiBldmVudC5rZXlDb2RlID09PSBUQUIgJiYgIWhhc01vZGlmaWVyS2V5KGV2ZW50LCAnc2hpZnRLZXknKSkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hpcExpc3QuX2FsbG93Rm9jdXNFc2NhcGUoKTsKICAgICAgICAgICAgfQogICAgICAgICAgICB0aGlzLl9lbWl0Q2hpcEVuZChldmVudCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIGJsdXIgc2hvdWxkIGVtaXQgdGhlIChjaGlwRW5kKSBldmVudC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9ibHVyKCkgewogICAgICAgICAgICBpZiAodGhpcy5hZGRPbkJsdXIpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2VtaXRDaGlwRW5kKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5mb2N1c2VkID0gZmFsc2U7CiAgICAgICAgICAgIC8vIEJsdXIgdGhlIGNoaXAgbGlzdCBpZiBpdCBpcyBub3QgZm9jdXNlZAogICAgICAgICAgICBpZiAoIXRoaXMuX2NoaXBMaXN0LmZvY3VzZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2NoaXBMaXN0Ll9ibHVyKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgdGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZm9jdXMoKSB7CiAgICAgICAgICAgIHRoaXMuZm9jdXNlZCA9IHRydWU7CiAgICAgICAgICAgIHRoaXMuX2NoaXBMaXN0LnN0YXRlQ2hhbmdlcy5uZXh0KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB0byBzZWUgaWYgdGhlIChjaGlwRW5kKSBldmVudCBuZWVkcyB0byBiZSBlbWl0dGVkLgogICAgICAgICAqIEBwYXJhbSB7Pz19IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZW1pdENoaXBFbmQoZXZlbnQpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWUgJiYgISFldmVudCkgewogICAgICAgICAgICAgICAgdGhpcy5fY2hpcExpc3QuX2tleWRvd24oZXZlbnQpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZXZlbnQgfHwgdGhpcy5faXNTZXBhcmF0b3JLZXkoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICB0aGlzLmNoaXBFbmQuZW1pdCh7IGlucHV0OiB0aGlzLl9pbnB1dEVsZW1lbnQsIHZhbHVlOiB0aGlzLl9pbnB1dEVsZW1lbnQudmFsdWUgfSk7CiAgICAgICAgICAgICAgICBpZiAoZXZlbnQpIHsKICAgICAgICAgICAgICAgICAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uSW5wdXQoKSB7CiAgICAgICAgICAgIC8vIExldCBjaGlwIGxpc3Qga25vdyB3aGVuZXZlciB0aGUgdmFsdWUgY2hhbmdlcy4KICAgICAgICAgICAgdGhpcy5fY2hpcExpc3Quc3RhdGVDaGFuZ2VzLm5leHQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogRm9jdXNlcyB0aGUgaW5wdXQuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMob3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9pbnB1dEVsZW1lbnQuZm9jdXMob3B0aW9ucyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIENoZWNrcyB3aGV0aGVyIGEga2V5Y29kZSBpcyBvbmUgb2YgdGhlIGNvbmZpZ3VyZWQgc2VwYXJhdG9ycy4KICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIF9pc1NlcGFyYXRvcktleShldmVudCkgewogICAgICAgICAgICBpZiAoaGFzTW9kaWZpZXJLZXkoZXZlbnQpKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBzZXBhcmF0b3JzID0gdGhpcy5zZXBhcmF0b3JLZXlDb2RlczsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBrZXlDb2RlID0gZXZlbnQua2V5Q29kZTsKICAgICAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkoc2VwYXJhdG9ycykgPyBzZXBhcmF0b3JzLmluZGV4T2Yoa2V5Q29kZSkgPiAtMSA6IHNlcGFyYXRvcnMuaGFzKGtleUNvZGUpOwogICAgICAgIH0KICAgIH0KICAgIE1hdENoaXBJbnB1dC7JtWZhYyA9IGZ1bmN0aW9uIE1hdENoaXBJbnB1dF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYXRDaGlwSW5wdXQpKMm1ybVkaXJlY3RpdmVJbmplY3QoRWxlbWVudFJlZiksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX0NISVBTX0RFRkFVTFRfT1BUSU9OUykpOyB9OwogICAgTWF0Q2hpcElucHV0Lsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdENoaXBJbnB1dCwgc2VsZWN0b3JzOiBbWyJpbnB1dCIsICJtYXRDaGlwSW5wdXRGb3IiLCAiIl1dLCBob3N0QXR0cnM6IFsxLCAibWF0LWNoaXAtaW5wdXQiLCAibWF0LWlucHV0LWVsZW1lbnQiXSwgaG9zdFZhcnM6IDUsIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gTWF0Q2hpcElucHV0X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gTWF0Q2hpcElucHV0X2tleWRvd25fSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9rZXlkb3duKCRldmVudCk7IH0pKCJibHVyIiwgZnVuY3Rpb24gTWF0Q2hpcElucHV0X2JsdXJfSG9zdEJpbmRpbmdIYW5kbGVyKCkgeyByZXR1cm4gY3R4Ll9ibHVyKCk7IH0pKCJmb2N1cyIsIGZ1bmN0aW9uIE1hdENoaXBJbnB1dF9mb2N1c19Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX2ZvY3VzKCk7IH0pKCJpbnB1dCIsIGZ1bmN0aW9uIE1hdENoaXBJbnB1dF9pbnB1dF9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHguX29uSW5wdXQoKTsgfSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVob3N0UHJvcGVydHkoImlkIiwgY3R4LmlkKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgiZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQgfHwgbnVsbCkoInBsYWNlaG9sZGVyIiwgY3R4LnBsYWNlaG9sZGVyIHx8IG51bGwpKCJhcmlhLWludmFsaWQiLCBjdHguX2NoaXBMaXN0ICYmIGN0eC5fY2hpcExpc3QubmdDb250cm9sID8gY3R4Ll9jaGlwTGlzdC5uZ0NvbnRyb2wuaW52YWxpZCA6IG51bGwpKCJhcmlhLXJlcXVpcmVkIiwgY3R4Ll9jaGlwTGlzdCAmJiBjdHguX2NoaXBMaXN0LnJlcXVpcmVkIHx8IG51bGwpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IHNlcGFyYXRvcktleUNvZGVzOiBbIm1hdENoaXBJbnB1dFNlcGFyYXRvcktleUNvZGVzIiwgInNlcGFyYXRvcktleUNvZGVzIl0sIHBsYWNlaG9sZGVyOiAicGxhY2Vob2xkZXIiLCBpZDogImlkIiwgY2hpcExpc3Q6IFsibWF0Q2hpcElucHV0Rm9yIiwgImNoaXBMaXN0Il0sIGFkZE9uQmx1cjogWyJtYXRDaGlwSW5wdXRBZGRPbkJsdXIiLCAiYWRkT25CbHVyIl0sIGRpc2FibGVkOiAiZGlzYWJsZWQiIH0sIG91dHB1dHM6IHsgY2hpcEVuZDogIm1hdENoaXBJbnB1dFRva2VuRW5kIiB9LCBleHBvcnRBczogWyJtYXRDaGlwSW5wdXQiLCAibWF0Q2hpcElucHV0Rm9yIl0sIGZlYXR1cmVzOiBbybXJtU5nT25DaGFuZ2VzRmVhdHVyZV0gfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1hdENoaXBJbnB1dC5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEVsZW1lbnRSZWYgfSwKICAgICAgICB7IHR5cGU6IHVuZGVmaW5lZCwgZGVjb3JhdG9yczogW3sgdHlwZTogSW5qZWN0LCBhcmdzOiBbTUFUX0NISVBTX0RFRkFVTFRfT1BUSU9OUyxdIH1dIH0KICAgIF07CiAgICBNYXRDaGlwSW5wdXQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgY2hpcExpc3Q6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdENoaXBJbnB1dEZvcicsXSB9XSwKICAgICAgICBhZGRPbkJsdXI6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ21hdENoaXBJbnB1dEFkZE9uQmx1cicsXSB9XSwKICAgICAgICBzZXBhcmF0b3JLZXlDb2RlczogW3sgdHlwZTogSW5wdXQsIGFyZ3M6IFsnbWF0Q2hpcElucHV0U2VwYXJhdG9yS2V5Q29kZXMnLF0gfV0sCiAgICAgICAgY2hpcEVuZDogW3sgdHlwZTogT3V0cHV0LCBhcmdzOiBbJ21hdENoaXBJbnB1dFRva2VuRW5kJyxdIH1dLAogICAgICAgIHBsYWNlaG9sZGVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBpZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZGlzYWJsZWQ6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgY29uc3QgybUwJGggPSAoewogICAgICAgIHNlcGFyYXRvcktleUNvZGVzOiBbRU5URVJdCiAgICB9KTsKICAgIGNsYXNzIE1hdENoaXBzTW9kdWxlIHsKICAgIH0KICAgIE1hdENoaXBzTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0Q2hpcHNNb2R1bGUgfSk7CiAgICBNYXRDaGlwc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdENoaXBzTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdENoaXBzTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgRXJyb3JTdGF0ZU1hdGNoZXIsCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHByb3ZpZGU6IE1BVF9DSElQU19ERUZBVUxUX09QVElPTlMsCiAgICAgICAgICAgICAgICB1c2VWYWx1ZTogKCAvKiogQHR5cGUgez99ICovKMm1MCRoKSkKICAgICAgICAgICAgfQogICAgICAgIF0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShNYXRDaGlwc01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtNYXRDaGlwTGlzdCwKICAgICAgICAgICAgTWF0Q2hpcCwKICAgICAgICAgICAgTWF0Q2hpcElucHV0LAogICAgICAgICAgICBNYXRDaGlwUmVtb3ZlLAogICAgICAgICAgICBNYXRDaGlwQXZhdGFyLAogICAgICAgICAgICBNYXRDaGlwVHJhaWxpbmdJY29uXSwgZXhwb3J0czogW01hdENoaXBMaXN0LAogICAgICAgICAgICBNYXRDaGlwLAogICAgICAgICAgICBNYXRDaGlwSW5wdXQsCiAgICAgICAgICAgIE1hdENoaXBSZW1vdmUsCiAgICAgICAgICAgIE1hdENoaXBBdmF0YXIsCiAgICAgICAgICAgIE1hdENoaXBUcmFpbGluZ0ljb25dIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9tZXRyaWNfYXJpdGhtZXRpYy9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50L21ldHJpY19hcml0aG1ldGljX2VsZW1lbnRfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IF9jMCR2ID0gZnVuY3Rpb24gKGEwKSB7IHJldHVybiB7ICJ3aWR0aCI6IGEwIH07IH07CiAgICBjb25zdCBfYzEkaiA9IGZ1bmN0aW9uIChhMCkgeyByZXR1cm4geyAidmFsdWUtaW52YWxpZCI6IGEwIH07IH07CiAgICBjbGFzcyBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMub25SZW1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25GaWx0ZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMuZm9jdXNNaW4gPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5mb2N1c01heCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLm5nVW5zdWJzY3JpYmUgPSBuZXcgU3ViamVjdCgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLm1pbkZvcm1Db250cm9sID0gbmV3IEZvcm1Db250cm9sKHRoaXMuZmlsdGVyVmFsdWVzLm1pbiwgWwogICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5yZXF1aXJlZCwKICAgICAgICAgICAgICAgIFZhbGlkYXRvcnMubWluKC0xLjApLAogICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5tYXgoMS4wKSwKICAgICAgICAgICAgICAgIHRoaXMubWluVmFsdWVWYWxpZGF0b3IuYmluZCh0aGlzKSwKICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIHRoaXMubWF4Rm9ybUNvbnRyb2wgPSBuZXcgRm9ybUNvbnRyb2wodGhpcy5maWx0ZXJWYWx1ZXMubWF4LCBbCiAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLnJlcXVpcmVkLAogICAgICAgICAgICAgICAgVmFsaWRhdG9ycy5taW4oLTEuMCksCiAgICAgICAgICAgICAgICBWYWxpZGF0b3JzLm1heCgxLjApLAogICAgICAgICAgICAgICAgdGhpcy5tYXhWYWx1ZVZhbGlkYXRvci5iaW5kKHRoaXMpLAogICAgICAgICAgICBdKTsKICAgICAgICAgICAgdGhpcy5taW5Gb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5Gb3JtQ29udHJvbC52YWxpZCAmJiB0aGlzLm1heEZvcm1Db250cm9sLnZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBwYXJzZUZsb2F0KHRoaXMubWluRm9ybUNvbnRyb2wudmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHBhcnNlRmxvYXQodGhpcy5tYXhGb3JtQ29udHJvbC52YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5tYXhGb3JtQ29udHJvbC52YWx1ZUNoYW5nZXMKICAgICAgICAgICAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLm5nVW5zdWJzY3JpYmUpKQogICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5taW5Gb3JtQ29udHJvbC52YWxpZCAmJiB0aGlzLm1heEZvcm1Db250cm9sLnZhbGlkKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkZpbHRlckNoYW5nZS5lbWl0KHsKICAgICAgICAgICAgICAgICAgICAgICAgbWluOiBwYXJzZUZsb2F0KHRoaXMubWluRm9ybUNvbnRyb2wudmFsdWUpLAogICAgICAgICAgICAgICAgICAgICAgICBtYXg6IHBhcnNlRmxvYXQodGhpcy5tYXhGb3JtQ29udHJvbC52YWx1ZSksCiAgICAgICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGFuZ2VzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzKSB7CiAgICAgICAgICAgIGlmICh0aGlzLm1pbkZvcm1Db250cm9sICYmIHRoaXMubWF4Rm9ybUNvbnRyb2wpIHsKICAgICAgICAgICAgICAgIHRoaXMubWluRm9ybUNvbnRyb2wuc2V0VmFsdWUodGhpcy5maWx0ZXJWYWx1ZXMubWluLCB7IGVtaXRFdmVudDogZmFsc2UgfSk7CiAgICAgICAgICAgICAgICB0aGlzLm1heEZvcm1Db250cm9sLnNldFZhbHVlKHRoaXMuZmlsdGVyVmFsdWVzLm1heCwgeyBlbWl0RXZlbnQ6IGZhbHNlIH0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkRlc3Ryb3koKSB7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5uZXh0KCk7CiAgICAgICAgICAgIHRoaXMubmdVbnN1YnNjcmliZS5jb21wbGV0ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgKiBAcGFyYW0gez99IGNvbnRyb2wKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG1pblZhbHVlVmFsaWRhdG9yKGNvbnRyb2wpIHsKICAgICAgICAgICAgaWYgKCF0aGlzLm1heEZvcm1Db250cm9sIHx8IGNvbnRyb2wudmFsdWUgPT09ICdOYU4nKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChpc05hTihwYXJzZUZsb2F0KGNvbnRyb2wudmFsdWUpKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6ICd0aGUgc3RyaW5nIHlvdSBlbnRlcmVkIGlzIG5laXRoZXIgTmFOIG5vciBhIG51bWJlcicgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmIChwYXJzZUZsb2F0KGNvbnRyb2wudmFsdWUpID4gcGFyc2VGbG9hdCh0aGlzLm1heEZvcm1Db250cm9sLnZhbHVlKSkgewogICAgICAgICAgICAgICAgcmV0dXJuIHsgdmFsdWU6ICd0aGUgbnVtYmVyIHlvdSBlbnRlcmVkIGlzIGxhcmdlciB0aGFuIHRoZSBtYXggdmFsdWUnIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAqIEBwYXJhbSB7P30gY29udHJvbAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbWF4VmFsdWVWYWxpZGF0b3IoY29udHJvbCkgewogICAgICAgICAgICBpZiAoIXRoaXMubWluRm9ybUNvbnRyb2wpIHsKICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKAogICAgICAgICAgICAvLyBNYXggTmFOIG9ubHkgaWYgbWluIGFsc28gTmFOCiAgICAgICAgICAgIHRoaXMubWluRm9ybUNvbnRyb2wudmFsdWUgPT09ICdOYU4nICYmCiAgICAgICAgICAgICAgICBjb250cm9sLnZhbHVlID09PSAnTmFOJykgewogICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoaXNOYU4ocGFyc2VGbG9hdChjb250cm9sLnZhbHVlKSkpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiAndGhlIHN0cmluZyB5b3UgZW50ZXJlZCBpcyBuZWl0aGVyIE5hTiBub3IgYSBudW1iZXInIH07CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSBpZiAoY29udHJvbC52YWx1ZSA8IHRoaXMubWluRm9ybUNvbnRyb2wudmFsdWUpIHsKICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiAndGhlIG51bWJlciB5b3UgZW50ZXJlZCBpcyBzbWFsbGVyIHRoYW4gdGhlIG1pbiB2YWx1ZScgfTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldEVycm9yRGVzY3JpcHRpb24oZXJyb3JzKSB7CiAgICAgICAgICAgIGlmIChlcnJvcnMpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZpcnN0S2V5ID0gT2JqZWN0LmtleXMoZXJyb3JzKVswXTsKICAgICAgICAgICAgICAgIGlmIChmaXJzdEtleSA9PT0gJ3JlcXVpcmVkJykgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAneW91IGRpZCBub3QgZW50ZXIgYW55dGhpbmcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSBpZiAoZmlyc3RLZXkgPT09ICdtaW4nKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICd0aGUgbnVtYmVyIG11c3QgYmUgYXQgbGVhc3QgLTEuMCc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChmaXJzdEtleSA9PT0gJ21heCcpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ3RoZSBudW1iZXIgaXMgYmlnZ2VyIHRoYW4gMS4wJzsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBlcnJvcnNbZmlyc3RLZXldOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiAnJzsKICAgICAgICB9CiAgICB9CiAgICBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG1ldHJpYzogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZmlsdGVyVmFsdWVzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvblJlbW92ZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uRmlsdGVyQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJtZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IG1ldHJpYzogIm1ldHJpYyIsIGZpbHRlclZhbHVlczogImZpbHRlclZhbHVlcyIgfSwgb3V0cHV0czogeyBvblJlbW92ZTogIm9uUmVtb3ZlIiwgb25GaWx0ZXJDaGFuZ2U6ICJvbkZpbHRlckNoYW5nZSIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDksIHZhcnM6IDIxLCBjb25zdHM6IFtbMSwgImZpbHRlci1jaGlwIiwgMywgInJlbW92ZWQiXSwgWzEsICJtZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LXJhbmdlIiwgMywgImtleWRvd24iXSwgWyJtYXRJbnB1dCIsICIiLCAxLCAiaW5wdXQtZmllbGQiLCAzLCAidmFsdWUiLCAibWF0VG9vbHRpcCIsICJtYXRUb29sdGlwRGlzYWJsZWQiLCAibmdTdHlsZSIsICJuZ0NsYXNzIiwgImZvcm1Db250cm9sIiwgImZvY3VzIiwgImZvY3Vzb3V0Il0sIFsibWF0Q2hpcFJlbW92ZSIsICIiLCAic3ZnSWNvbiIsICJjYW5jZWxfMjRweCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtYXQtY2hpcCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoInJlbW92ZWQiLCBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudF9UZW1wbGF0ZV9tYXRfY2hpcF9yZW1vdmVkXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25SZW1vdmUuZW1pdChjdHgubWV0cmljKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAxKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJrZXlkb3duIiwgZnVuY3Rpb24gTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb21wb25lbnRfVGVtcGxhdGVfZGl2X2tleWRvd25fMl9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuICRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDMsICIgWyAiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiaW5wdXQiLCAyKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJmb2N1cyIsIGZ1bmN0aW9uIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29tcG9uZW50X1RlbXBsYXRlX2lucHV0X2ZvY3VzXzRfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguZm9jdXNNaW4gPSB0cnVlOyB9KSgiZm9jdXNvdXQiLCBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudF9UZW1wbGF0ZV9pbnB1dF9mb2N1c291dF80X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LmZvY3VzTWluID0gZmFsc2U7IH0pOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1dGV4dCg1LCAiIDsgIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImlucHV0IiwgMik7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiZm9jdXMiLCBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudF9UZW1wbGF0ZV9pbnB1dF9mb2N1c182X2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LmZvY3VzTWF4ID0gdHJ1ZTsgfSkoImZvY3Vzb3V0IiwgZnVuY3Rpb24gTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb21wb25lbnRfVGVtcGxhdGVfaW5wdXRfZm9jdXNvdXRfNl9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5mb2N1c01heCA9IGZhbHNlOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRleHQoNywgIiBdICIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg4LCAibWF0LWljb24iLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4Lm1ldHJpYywgIiAiKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgidmFsdWUiLCBjdHguZmlsdGVyVmFsdWVzLm1pbikoIm1hdFRvb2x0aXAiLCBjdHguZ2V0RXJyb3JEZXNjcmlwdGlvbihjdHgubWluRm9ybUNvbnRyb2wuZXJyb3JzKSkoIm1hdFRvb2x0aXBEaXNhYmxlZCIsICFjdHgubWluRm9ybUNvbnRyb2wuaW52YWxpZCkoIm5nU3R5bGUiLCDJtcm1cHVyZUZ1bmN0aW9uMSgxMywgX2MwJHYsIGN0eC5mb2N1c01pbiA/ICIxMDBweCIgOiBjdHgubWluRm9ybUNvbnRyb2wudmFsdWUudG9TdHJpbmcoKS5sZW5ndGggKyAiY2giKSkoIm5nQ2xhc3MiLCDJtcm1cHVyZUZ1bmN0aW9uMSgxNSwgX2MxJGosICFjdHgubWluRm9ybUNvbnRyb2wudmFsaWQpKSgiZm9ybUNvbnRyb2wiLCBjdHgubWluRm9ybUNvbnRyb2wpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJ2YWx1ZSIsIGN0eC5maWx0ZXJWYWx1ZXMubWF4KSgibWF0VG9vbHRpcCIsIGN0eC5nZXRFcnJvckRlc2NyaXB0aW9uKGN0eC5tYXhGb3JtQ29udHJvbC5lcnJvcnMpKSgibWF0VG9vbHRpcERpc2FibGVkIiwgIWN0eC5tYXhGb3JtQ29udHJvbC5pbnZhbGlkKSgibmdTdHlsZSIsIMm1ybVwdXJlRnVuY3Rpb24xKDE3LCBfYzAkdiwgY3R4LmZvY3VzTWF4ID8gIjEwMHB4IiA6IGN0eC5tYXhGb3JtQ29udHJvbC52YWx1ZS50b1N0cmluZygpLmxlbmd0aCArICJjaCIpKSgibmdDbGFzcyIsIMm1ybVwdXJlRnVuY3Rpb24xKDE5LCBfYzEkaiwgIWN0eC5tYXhGb3JtQ29udHJvbC52YWxpZCkpKCJmb3JtQ29udHJvbCIsIGN0eC5tYXhGb3JtQ29udHJvbCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0Q2hpcCwgRGVmYXVsdFZhbHVlQWNjZXNzb3IsIE1hdFRvb2x0aXAsIE5nU3R5bGUsIE5nQ2xhc3MsIE5nQ29udHJvbFN0YXR1cywgRm9ybUNvbnRyb2xEaXJlY3RpdmUsIE1hdEljb24sIE1hdENoaXBSZW1vdmVdLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0uZmlsdGVyLWNoaXBbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7bWFyZ2luLWxlZnQ6NXB4fS5tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50LXJhbmdlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2ZvbnQtc2l6ZTouOGVtO2hlaWdodDozMHB4O2p1c3RpZnktY29udGVudDpjZW50ZXI7bGluZS1oZWlnaHQ6MzBweDtwYWRkaW5nOjAgNXB4O21hcmdpbi1sZWZ0OjVweH0uaW5wdXQtZmllbGRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Ym9yZGVyOm5vbmU7Zm9udC1mYW1pbHk6bW9ub3NwYWNlO2ZvbnQtc2l6ZToxLjFlbTt0cmFuc2l0aW9uOndpZHRoIDFzfS5pbnB1dC1maWVsZFtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMik7Ym9yZGVyOm5vbmU7b3V0bGluZTpub25lfS52YWx1ZS1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2RhdGFfc2VsZWN0aW9uL21ldHJpY19hcml0aG1ldGljL21ldHJpY19hcml0aG1ldGljX2VsZW1lbnQvbWV0cmljX2FyaXRobWV0aWNfZWxlbWVudF9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuZmlsdGVyVmFsdWVzJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0TWV0cmljRmlsdGVycykpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmaWx0ZXJzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmlsdGVycykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgZmlsdGVyID0gZmlsdGVyc1t0aGlzLm1ldHJpY107CiAgICAgICAgICAgICAgICBpZiAoIWZpbHRlcikgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG1pbjogLTEuMCwgbWF4OiAxLjAgfTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IGZpbHRlci5pbmNsdWRlTmFOCiAgICAgICAgICAgICAgICAgICAgPyAnTmFOJwogICAgICAgICAgICAgICAgICAgIDogdGhpcy5yb3VuZFRvVGhyZWVEZWNpbWFsUG9pbnRzKGZpbHRlci5taW4pOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgY29uc3QgbWF4ID0gZmlsdGVyLm1heCA8IGZpbHRlci5taW4KICAgICAgICAgICAgICAgICAgICA/ICdOYU4nCiAgICAgICAgICAgICAgICAgICAgOiB0aGlzLnJvdW5kVG9UaHJlZURlY2ltYWxQb2ludHMoZmlsdGVyLm1heCk7CiAgICAgICAgICAgICAgICByZXR1cm4geyBtaW46IG1pbiwgbWF4OiBtYXggfTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRyaWMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZShtZXRyaWMpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pUmVtb3ZlTWV0cmljRmlsdGVyKHsgbWV0cmljOiBtZXRyaWMgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5ld1ZhbHVlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmlsdGVyQ2hhbmdlKG5ld1ZhbHVlcykgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1pbiA9IGlzTmFOKG5ld1ZhbHVlcy5taW4pID8gLTEgOiBuZXdWYWx1ZXMubWluOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IG1heCA9IGlzTmFOKG5ld1ZhbHVlcy5tYXgpID8gLTIgOiBuZXdWYWx1ZXMubWF4OwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluY2x1ZGVOYU4gPSBpc05hTihuZXdWYWx1ZXMubWluKTsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pQ2hhbmdlTWV0cmljRmlsdGVyKHsKICAgICAgICAgICAgICAgIG1ldHJpYzogdGhpcy5tZXRyaWMsCiAgICAgICAgICAgICAgICBtYXg6IG1heCwKICAgICAgICAgICAgICAgIG1pbjogbWluLAogICAgICAgICAgICAgICAgaW5jbHVkZU5hTjogaW5jbHVkZU5hTiwKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJvdW5kVG9UaHJlZURlY2ltYWxQb2ludHModmFsdWUpIHsKICAgICAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoKHZhbHVlICsgTnVtYmVyLkVQU0lMT04pICogMTAwMCkgLyAxMDAwOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLW1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWV0cmljLWFyaXRobWV0aWMtZWxlbWVudC1jb21wb25lbnQKICAgICAgW21ldHJpY109Im1ldHJpYyIKICAgICAgW2ZpbHRlclZhbHVlc109ImZpbHRlclZhbHVlcyQgfCBhc3luYyIKICAgICAgKG9uUmVtb3ZlKT0icmVtb3ZlKCRldmVudCkiCiAgICAgIChvbkZpbHRlckNoYW5nZSk9ImZpbHRlckNoYW5nZSgkZXZlbnQpIgogICAgPjwvbWV0cmljLWFyaXRobWV0aWMtZWxlbWVudC1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbWV0cmljOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50Il1dLCBpbnB1dHM6IHsgbWV0cmljOiAibWV0cmljIiB9LCBkZWNsczogMiwgdmFyczogNCwgY29uc3RzOiBbWzMsICJtZXRyaWMiLCAiZmlsdGVyVmFsdWVzIiwgIm9uUmVtb3ZlIiwgIm9uRmlsdGVyQ2hhbmdlIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigib25SZW1vdmUiLCBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X2NvbXBvbmVudF9vblJlbW92ZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LnJlbW92ZSgkZXZlbnQpOyB9KSgib25GaWx0ZXJDaGFuZ2UiLCBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbnRhaW5lcl9UZW1wbGF0ZV9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X2NvbXBvbmVudF9vbkZpbHRlckNoYW5nZV8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LmZpbHRlckNoYW5nZSgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWV0cmljIiwgY3R4Lm1ldHJpYykoImZpbHRlclZhbHVlcyIsIMm1ybVwaXBlQmluZDEoMSwgMiwgY3R4LmZpbHRlclZhbHVlcyQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbXBvbmVudF0sIHBpcGVzOiBbQXN5bmNQaXBlXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9tZXRyaWNfYXJpdGhtZXRpYy9tZXRyaWNfYXJpdGhtZXRpY19vcGVyYXRvci9tZXRyaWNfYXJpdGhtZXRpY19vcGVyYXRvcl9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWV0cmljQXJpdGhtZXRpY09wZXJhdG9yQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5PcGVyYXRvciA9IE9wZXJhdG9yOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvckNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1vcGVyYXRvcicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxtYXQtY2hpcD4KICAgICAge3sgb3BlcmF0b3IgPT09IE9wZXJhdG9yLkFORCA/ICcmJyA6ICcnIH19CiAgICA8L21hdC1jaGlwPgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgb3BlcmF0b3I6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvckNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY09wZXJhdG9yQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJucG1pLW1ldHJpYy1hcml0aG1ldGljLW9wZXJhdG9yIl1dLCBpbnB1dHM6IHsgb3BlcmF0b3I6ICJvcGVyYXRvciIgfSwgZGVjbHM6IDIsIHZhcnM6IDEsIHRlbXBsYXRlOiBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgIm1hdC1jaGlwIik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIiAiLCBjdHgub3BlcmF0b3IgPT09IGN0eC5PcGVyYXRvci5BTkQgPyAiJiIgOiAiIiwgIiAiKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRDaGlwXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9tZXRyaWNfYXJpdGhtZXRpYy9tZXRyaWNfYXJpdGhtZXRpY19jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgZnVuY3Rpb24gTWV0cmljQXJpdGhtZXRpY0NvbXBvbmVudF9kaXZfMV9ucG1pX21ldHJpY19hcml0aG1ldGljX2VsZW1lbnRfMV9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1lbGVtZW50IiwgNCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBlbGVtZW50X3IxID0gybXJtW5leHRDb250ZXh0KCkuJGltcGxpY2l0OwogICAgICAgIMm1ybVwcm9wZXJ0eSgibWV0cmljIiwgZWxlbWVudF9yMS5tZXRyaWMpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50X2Rpdl8xX25wbWlfbWV0cmljX2FyaXRobWV0aWNfb3BlcmF0b3JfMl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAibnBtaS1tZXRyaWMtYXJpdGhtZXRpYy1vcGVyYXRvciIsIDUpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgZWxlbWVudF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpLiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoIm9wZXJhdG9yIiwgZWxlbWVudF9yMS5vcGVyYXRvcik7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1ldHJpY0FyaXRobWV0aWNDb21wb25lbnRfZGl2XzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2Iik7CiAgICAgICAgybXJtXRlbXBsYXRlKDEsIE1ldHJpY0FyaXRobWV0aWNDb21wb25lbnRfZGl2XzFfbnBtaV9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50XzFfVGVtcGxhdGUsIDEsIDEsICJucG1pLW1ldHJpYy1hcml0aG1ldGljLWVsZW1lbnQiLCAyKTsKICAgICAgICDJtcm1dGVtcGxhdGUoMiwgTWV0cmljQXJpdGhtZXRpY0NvbXBvbmVudF9kaXZfMV9ucG1pX21ldHJpY19hcml0aG1ldGljX29wZXJhdG9yXzJfVGVtcGxhdGUsIDEsIDEsICJucG1pLW1ldHJpYy1hcml0aG1ldGljLW9wZXJhdG9yIiwgMyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGVsZW1lbnRfcjEgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGVsZW1lbnRfcjEua2luZCA9PT0gY3R4X3IwLkFyaXRobWV0aWNLaW5kLk1FVFJJQyk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgZWxlbWVudF9yMS5raW5kID09PSBjdHhfcjAuQXJpdGhtZXRpY0tpbmQuT1BFUkFUT1IpOwogICAgfSB9CiAgICBjbGFzcyBNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5Bcml0aG1ldGljS2luZCA9IEFyaXRobWV0aWNLaW5kOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY0FyaXRobWV0aWNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ21ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL21ldHJpY19hcml0aG1ldGljX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9tZXRyaWNfYXJpdGhtZXRpY19jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG1ldHJpY0FyaXRobWV0aWM6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY0FyaXRobWV0aWNDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY0FyaXRobWV0aWNDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY0NvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbIm1ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IG1ldHJpY0FyaXRobWV0aWM6ICJtZXRyaWNBcml0aG1ldGljIiB9LCBkZWNsczogMiwgdmFyczogMiwgY29uc3RzOiBbWzMsICJzZWxlY3RhYmxlIl0sIFs0LCAibmdGb3IiLCAibmdGb3JPZiJdLCBbMywgIm1ldHJpYyIsIDQsICJuZ0lmIl0sIFszLCAib3BlcmF0b3IiLCA0LCAibmdJZiJdLCBbMywgIm1ldHJpYyJdLCBbMywgIm9wZXJhdG9yIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWV0cmljQXJpdGhtZXRpY0NvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibWF0LWNoaXAtbGlzdCIsIDApOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMSwgTWV0cmljQXJpdGhtZXRpY0NvbXBvbmVudF9kaXZfMV9UZW1wbGF0ZSwgMywgMiwgImRpdiIsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoInNlbGVjdGFibGUiLCBmYWxzZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHgubWV0cmljQXJpdGhtZXRpYyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0Q2hpcExpc3QsIE5nRm9yT2YsIE5nSWYsIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29udGFpbmVyLCBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnRdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztmbGV4LXdyYXA6d3JhcH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9tZXRyaWNfYXJpdGhtZXRpYy9tZXRyaWNfYXJpdGhtZXRpY19jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWV0cmljQXJpdGhtZXRpY0NvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5tZXRyaWNBcml0aG1ldGljJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0TWV0cmljQXJpdGhtZXRpYykpOwogICAgICAgIH0KICAgIH0KICAgIE1ldHJpY0FyaXRobWV0aWNDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktbWV0cmljLWFyaXRobWV0aWMnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8bWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50CiAgICAgIFttZXRyaWNBcml0aG1ldGljXT0ibWV0cmljQXJpdGhtZXRpYyQgfCBhc3luYyIKICAgID48L21ldHJpYy1hcml0aG1ldGljLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gTWV0cmljQXJpdGhtZXRpY0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbIm5wbWktbWV0cmljLWFyaXRobWV0aWMiXV0sIGRlY2xzOiAyLCB2YXJzOiAzLCBjb25zdHM6IFtbMywgIm1ldHJpY0FyaXRobWV0aWMiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWV0cmljLWFyaXRobWV0aWMtY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1ldHJpY0FyaXRobWV0aWMiLCDJtcm1cGlwZUJpbmQxKDEsIDEsIGN0eC5tZXRyaWNBcml0aG1ldGljJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01ldHJpY0FyaXRobWV0aWNDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvZGF0YV9zZWxlY3Rpb24vZGF0YV9zZWxlY3Rpb25fY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIERhdGFTZWxlY3Rpb25Db21wb25lbnQgewogICAgfQogICAgRGF0YVNlbGVjdGlvbkNvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS1kYXRhLXNlbGVjdGlvbicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2RhdGFfc2VsZWN0aW9uX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9kYXRhX3NlbGVjdGlvbl9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGF0YVNlbGVjdGlvbkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIERhdGFTZWxlY3Rpb25Db21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGF0YVNlbGVjdGlvbkNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBEYXRhU2VsZWN0aW9uQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IERhdGFTZWxlY3Rpb25Db21wb25lbnQsIHNlbGVjdG9yczogW1sibnBtaS1kYXRhLXNlbGVjdGlvbiJdXSwgZGVjbHM6IDQsIHZhcnM6IDAsIGNvbnN0czogW1sxLCAiZGF0YS1zZWxlY3Rpb24iXSwgWzEsICJtZXRyaWNzLXNlbGVjdG9yIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gRGF0YVNlbGVjdGlvbkNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDEsICJucG1pLW1ldHJpYy1zZWFyY2giLCAxKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMiwgIm5wbWktcmVzdWx0cy1kb3dubG9hZCIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgzLCAibnBtaS1tZXRyaWMtYXJpdGhtZXRpYyIpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01ldHJpY1NlYXJjaENvbnRhaW5lciwgUmVzdWx0c0Rvd25sb2FkQ29udGFpbmVyLCBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9W19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXI6MXB4IHNvbGlkICNlYmViZWI7cGFkZGluZzoxMHB4IDIwcHh9LmRhdGEtc2VsZWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7YWxpZ24taXRlbXM6Y2VudGVyfS5tZXRyaWNzLXNlbGVjdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjEgMX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS91dGlsL2ZpbHRlcl9hbm5vdGF0aW9ucy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbkRhdGEKICAgICAqIEBwYXJhbSB7P30gYWN0aXZlUnVucwogICAgICogQHBhcmFtIHs/fSBtZXRyaWNBcml0aG1ldGljCiAgICAgKiBAcGFyYW0gez99IG1ldHJpY0ZpbHRlcnMKICAgICAqIEBwYXJhbSB7P30gbWV0cmljcwogICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9uc1JlZ2V4CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBmaWx0ZXJBbm5vdGF0aW9ucyhhbm5vdGF0aW9uRGF0YSwgYWN0aXZlUnVucywgbWV0cmljQXJpdGhtZXRpYywgbWV0cmljRmlsdGVycywgbWV0cmljcywgYW5ub3RhdGlvbnNSZWdleCkgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBkYXRhID0ge307CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsbFJ1bnMgPSBuZXcgU2V0KGFjdGl2ZVJ1bnMpOwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbGxNZXRyaWNzID0gbmV3IFNldChtZXRyaWNzLm1hcCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRyaWMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIChtZXRyaWMpID0+IHN0cmlwTWV0cmljU3RyaW5nKG1ldHJpYykpKSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGZpbHRlclJlZ2V4ID0gbmV3IFJlZ0V4cChhbm5vdGF0aW9uc1JlZ2V4LCAnaScpOwogICAgICAgIE9iamVjdC5lbnRyaWVzKGFubm90YXRpb25EYXRhKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGVudHJ5CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZW50cnkpID0+IHsKICAgICAgICAgICAgaWYgKCFmaWx0ZXJSZWdleC50ZXN0KGVudHJ5WzBdKSkgewogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgbGV0IHZhbHVlRGF0YUVsZW1lbnRzID0gZW50cnlbMV07CiAgICAgICAgICAgIC8vIFJlbW92ZSBhbGwgaW5hY3RpdmUgcnVucyBhbmQga2VlcCBvbmx5IG1ldHJpY3MgY3VycmVudGx5IGRpc3BsYXllZAogICAgICAgICAgICB2YWx1ZURhdGFFbGVtZW50cyA9IHZhbHVlRGF0YUVsZW1lbnRzLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVEYXRhRWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZhbHVlRGF0YUVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiAoYWxsUnVucy5oYXModmFsdWVEYXRhRWxlbWVudC5ydW4pICYmCiAgICAgICAgICAgICAgICAgICAgYWxsTWV0cmljcy5oYXModmFsdWVEYXRhRWxlbWVudC5tZXRyaWMpKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBpZiAoY2hlY2tWYWx1ZXNQYXNzTWV0cmljQXJpdGhtZXRpYyhtZXRyaWNBcml0aG1ldGljLCBtZXRyaWNGaWx0ZXJzLCB2YWx1ZURhdGFFbGVtZW50cykpIHsKICAgICAgICAgICAgICAgIGlmICh2YWx1ZURhdGFFbGVtZW50cy5sZW5ndGggIT09IDApIHsKICAgICAgICAgICAgICAgICAgICBkYXRhW2VudHJ5WzBdXSA9IHZhbHVlRGF0YUVsZW1lbnRzOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSkpOwogICAgICAgIHJldHVybiBkYXRhOwogICAgfQogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25EYXRhCiAgICAgKiBAcGFyYW0gez99IGhpZGRlbkFubm90YXRpb25zCiAgICAgKiBAcGFyYW0gez99IHNob3dIaWRkZW4KICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIHJlbW92ZUhpZGRlbkFubm90YXRpb25zKGFubm90YXRpb25EYXRhLCBoaWRkZW5Bbm5vdGF0aW9ucywgc2hvd0hpZGRlbikgewogICAgICAgIGlmIChzaG93SGlkZGVuKSB7CiAgICAgICAgICAgIHJldHVybiBhbm5vdGF0aW9uRGF0YTsKICAgICAgICB9CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGRhdGEgPSBPYmplY3QuYXNzaWduKHt9LCBhbm5vdGF0aW9uRGF0YSk7CiAgICAgICAgaGlkZGVuQW5ub3RhdGlvbnMuZm9yRWFjaCgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9uCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoYW5ub3RhdGlvbikgPT4gZGVsZXRlIGRhdGFbYW5ub3RhdGlvbl0pKTsKICAgICAgICByZXR1cm4gZGF0YTsKICAgIH0KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBtZXRyaWNBcml0aG1ldGljCiAgICAgKiBAcGFyYW0gez99IG1ldHJpY0ZpbHRlcnMKICAgICAqIEBwYXJhbSB7P30gdmFsdWVEYXRhRWxlbWVudHMKICAgICAqIEByZXR1cm4gez99CiAgICAgKi8KICAgIGZ1bmN0aW9uIGNoZWNrVmFsdWVzUGFzc01ldHJpY0FyaXRobWV0aWMobWV0cmljQXJpdGhtZXRpYywgbWV0cmljRmlsdGVycywgdmFsdWVEYXRhRWxlbWVudHMpIHsKICAgICAgICAvLyBDaGVjayBhbGwgcGFydHMgb2YgdGhlIGFyaXRoZW1ldGljCiAgICAgICAgcmV0dXJuIG1ldHJpY0FyaXRobWV0aWMuZXZlcnkoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZWxlbWVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGVsZW1lbnQpID0+IHsKICAgICAgICAgICAgaWYgKGVsZW1lbnQua2luZCA9PT0gQXJpdGhtZXRpY0tpbmQuT1BFUkFUT1IpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgbWV0cmljRmlsdGVyID0gbWV0cmljRmlsdGVyc1tlbGVtZW50Lm1ldHJpY107CiAgICAgICAgICAgIGlmIChtZXRyaWNGaWx0ZXIgPT09IHVuZGVmaW5lZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmV0dXJuIHZhbHVlRGF0YUVsZW1lbnRzLnNvbWUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlRGF0YUVsZW1lbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh2YWx1ZURhdGFFbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICBpZiAodmFsdWVEYXRhRWxlbWVudC5tZXRyaWMgPT09IHN0cmlwTWV0cmljU3RyaW5nKGVsZW1lbnQubWV0cmljKSkgewogICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZURhdGFFbGVtZW50Lm5QTUlWYWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbWV0cmljRmlsdGVyLmluY2x1ZGVOYU47CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKCgvKiogQHR5cGUgez99ICovICh2YWx1ZURhdGFFbGVtZW50Lm5QTUlWYWx1ZSkpIDw9IG1ldHJpY0ZpbHRlci5tYXggJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICgvKiogQHR5cGUgez99ICovICh2YWx1ZURhdGFFbGVtZW50Lm5QTUlWYWx1ZSkpID49IG1ldHJpY0ZpbHRlci5taW4pOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0pKTsKICAgIH0KCiAgICBmdW5jdGlvbiBhc2NlbmRpbmcoYSwgYikgewogICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgICB9CgogICAgZnVuY3Rpb24gYmlzZWN0b3IoY29tcGFyZSkgewogICAgICBpZiAoY29tcGFyZS5sZW5ndGggPT09IDEpIGNvbXBhcmUgPSBhc2NlbmRpbmdDb21wYXJhdG9yKGNvbXBhcmUpOwogICAgICByZXR1cm4gewogICAgICAgIGxlZnQ6IGZ1bmN0aW9uKGEsIHgsIGxvLCBoaSkgewogICAgICAgICAgaWYgKGxvID09IG51bGwpIGxvID0gMDsKICAgICAgICAgIGlmIChoaSA9PSBudWxsKSBoaSA9IGEubGVuZ3RoOwogICAgICAgICAgd2hpbGUgKGxvIDwgaGkpIHsKICAgICAgICAgICAgdmFyIG1pZCA9IGxvICsgaGkgPj4+IDE7CiAgICAgICAgICAgIGlmIChjb21wYXJlKGFbbWlkXSwgeCkgPCAwKSBsbyA9IG1pZCArIDE7CiAgICAgICAgICAgIGVsc2UgaGkgPSBtaWQ7CiAgICAgICAgICB9CiAgICAgICAgICByZXR1cm4gbG87CiAgICAgICAgfSwKICAgICAgICByaWdodDogZnVuY3Rpb24oYSwgeCwgbG8sIGhpKSB7CiAgICAgICAgICBpZiAobG8gPT0gbnVsbCkgbG8gPSAwOwogICAgICAgICAgaWYgKGhpID09IG51bGwpIGhpID0gYS5sZW5ndGg7CiAgICAgICAgICB3aGlsZSAobG8gPCBoaSkgewogICAgICAgICAgICB2YXIgbWlkID0gbG8gKyBoaSA+Pj4gMTsKICAgICAgICAgICAgaWYgKGNvbXBhcmUoYVttaWRdLCB4KSA+IDApIGhpID0gbWlkOwogICAgICAgICAgICBlbHNlIGxvID0gbWlkICsgMTsKICAgICAgICAgIH0KICAgICAgICAgIHJldHVybiBsbzsKICAgICAgICB9CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nQ29tcGFyYXRvcihmKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihkLCB4KSB7CiAgICAgICAgcmV0dXJuIGFzY2VuZGluZyhmKGQpLCB4KTsKICAgICAgfTsKICAgIH0KCiAgICB2YXIgYXNjZW5kaW5nQmlzZWN0ID0gYmlzZWN0b3IoYXNjZW5kaW5nKTsKICAgIHZhciBiaXNlY3RSaWdodCA9IGFzY2VuZGluZ0Jpc2VjdC5yaWdodDsKCiAgICBmdW5jdGlvbiBleHRlbnQodmFsdWVzLCB2YWx1ZW9mKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aCwKICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgIHZhbHVlLAogICAgICAgICAgbWluLAogICAgICAgICAgbWF4OwoKICAgICAgaWYgKHZhbHVlb2YgPT0gbnVsbCkgewogICAgICAgIHdoaWxlICgrK2kgPCBuKSB7IC8vIEZpbmQgdGhlIGZpcnN0IGNvbXBhcmFibGUgdmFsdWUuCiAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVzW2ldKSAhPSBudWxsICYmIHZhbHVlID49IHZhbHVlKSB7CiAgICAgICAgICAgIG1pbiA9IG1heCA9IHZhbHVlOwogICAgICAgICAgICB3aGlsZSAoKytpIDwgbikgeyAvLyBDb21wYXJlIHRoZSByZW1haW5pbmcgdmFsdWVzLgogICAgICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZXNbaV0pICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgZWxzZSB7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gRmluZCB0aGUgZmlyc3QgY29tcGFyYWJsZSB2YWx1ZS4KICAgICAgICAgIGlmICgodmFsdWUgPSB2YWx1ZW9mKHZhbHVlc1tpXSwgaSwgdmFsdWVzKSkgIT0gbnVsbCAmJiB2YWx1ZSA+PSB2YWx1ZSkgewogICAgICAgICAgICBtaW4gPSBtYXggPSB2YWx1ZTsKICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsgLy8gQ29tcGFyZSB0aGUgcmVtYWluaW5nIHZhbHVlcy4KICAgICAgICAgICAgICBpZiAoKHZhbHVlID0gdmFsdWVvZih2YWx1ZXNbaV0sIGksIHZhbHVlcykpICE9IG51bGwpIHsKICAgICAgICAgICAgICAgIGlmIChtaW4gPiB2YWx1ZSkgbWluID0gdmFsdWU7CiAgICAgICAgICAgICAgICBpZiAobWF4IDwgdmFsdWUpIG1heCA9IHZhbHVlOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIFttaW4sIG1heF07CiAgICB9CgogICAgdmFyIGFycmF5ID0gQXJyYXkucHJvdG90eXBlOwoKICAgIHZhciBzbGljZSA9IGFycmF5LnNsaWNlOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50KHgpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB4OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JDEoeCkgewogICAgICByZXR1cm4geDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZXF1ZW5jZSQxKHN0YXJ0LCBzdG9wLCBzdGVwKSB7CiAgICAgIHN0YXJ0ID0gK3N0YXJ0LCBzdG9wID0gK3N0b3AsIHN0ZXAgPSAobiA9IGFyZ3VtZW50cy5sZW5ndGgpIDwgMiA/IChzdG9wID0gc3RhcnQsIHN0YXJ0ID0gMCwgMSkgOiBuIDwgMyA/IDEgOiArc3RlcDsKCiAgICAgIHZhciBpID0gLTEsCiAgICAgICAgICBuID0gTWF0aC5tYXgoMCwgTWF0aC5jZWlsKChzdG9wIC0gc3RhcnQpIC8gc3RlcCkpIHwgMCwKICAgICAgICAgIHJhbmdlID0gbmV3IEFycmF5KG4pOwoKICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICByYW5nZVtpXSA9IHN0YXJ0ICsgaSAqIHN0ZXA7CiAgICAgIH0KCiAgICAgIHJldHVybiByYW5nZTsKICAgIH0KCiAgICB2YXIgZTEwID0gTWF0aC5zcXJ0KDUwKSwKICAgICAgICBlNSA9IE1hdGguc3FydCgxMCksCiAgICAgICAgZTIgPSBNYXRoLnNxcnQoMik7CgogICAgZnVuY3Rpb24gdGlja3Moc3RhcnQsIHN0b3AsIGNvdW50KSB7CiAgICAgIHZhciByZXZlcnNlLAogICAgICAgICAgaSA9IC0xLAogICAgICAgICAgbiwKICAgICAgICAgIHRpY2tzLAogICAgICAgICAgc3RlcDsKCiAgICAgIHN0b3AgPSArc3RvcCwgc3RhcnQgPSArc3RhcnQsIGNvdW50ID0gK2NvdW50OwogICAgICBpZiAoc3RhcnQgPT09IHN0b3AgJiYgY291bnQgPiAwKSByZXR1cm4gW3N0YXJ0XTsKICAgICAgaWYgKHJldmVyc2UgPSBzdG9wIDwgc3RhcnQpIG4gPSBzdGFydCwgc3RhcnQgPSBzdG9wLCBzdG9wID0gbjsKICAgICAgaWYgKChzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpKSA9PT0gMCB8fCAhaXNGaW5pdGUoc3RlcCkpIHJldHVybiBbXTsKCiAgICAgIGlmIChzdGVwID4gMCkgewogICAgICAgIHN0YXJ0ID0gTWF0aC5jZWlsKHN0YXJ0IC8gc3RlcCk7CiAgICAgICAgc3RvcCA9IE1hdGguZmxvb3Ioc3RvcCAvIHN0ZXApOwogICAgICAgIHRpY2tzID0gbmV3IEFycmF5KG4gPSBNYXRoLmNlaWwoc3RvcCAtIHN0YXJ0ICsgMSkpOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSB0aWNrc1tpXSA9IChzdGFydCArIGkpICogc3RlcDsKICAgICAgfSBlbHNlIHsKICAgICAgICBzdGFydCA9IE1hdGguZmxvb3Ioc3RhcnQgKiBzdGVwKTsKICAgICAgICBzdG9wID0gTWF0aC5jZWlsKHN0b3AgKiBzdGVwKTsKICAgICAgICB0aWNrcyA9IG5ldyBBcnJheShuID0gTWF0aC5jZWlsKHN0YXJ0IC0gc3RvcCArIDEpKTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgdGlja3NbaV0gPSAoc3RhcnQgLSBpKSAvIHN0ZXA7CiAgICAgIH0KCiAgICAgIGlmIChyZXZlcnNlKSB0aWNrcy5yZXZlcnNlKCk7CgogICAgICByZXR1cm4gdGlja3M7CiAgICB9CgogICAgZnVuY3Rpb24gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpIHsKICAgICAgdmFyIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDAsIGNvdW50KSwKICAgICAgICAgIHBvd2VyID0gTWF0aC5mbG9vcihNYXRoLmxvZyhzdGVwKSAvIE1hdGguTE4xMCksCiAgICAgICAgICBlcnJvciA9IHN0ZXAgLyBNYXRoLnBvdygxMCwgcG93ZXIpOwogICAgICByZXR1cm4gcG93ZXIgPj0gMAogICAgICAgICAgPyAoZXJyb3IgPj0gZTEwID8gMTAgOiBlcnJvciA+PSBlNSA/IDUgOiBlcnJvciA+PSBlMiA/IDIgOiAxKSAqIE1hdGgucG93KDEwLCBwb3dlcikKICAgICAgICAgIDogLU1hdGgucG93KDEwLCAtcG93ZXIpIC8gKGVycm9yID49IGUxMCA/IDEwIDogZXJyb3IgPj0gZTUgPyA1IDogZXJyb3IgPj0gZTIgPyAyIDogMSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGlja1N0ZXAoc3RhcnQsIHN0b3AsIGNvdW50KSB7CiAgICAgIHZhciBzdGVwMCA9IE1hdGguYWJzKHN0b3AgLSBzdGFydCkgLyBNYXRoLm1heCgwLCBjb3VudCksCiAgICAgICAgICBzdGVwMSA9IE1hdGgucG93KDEwLCBNYXRoLmZsb29yKE1hdGgubG9nKHN0ZXAwKSAvIE1hdGguTE4xMCkpLAogICAgICAgICAgZXJyb3IgPSBzdGVwMCAvIHN0ZXAxOwogICAgICBpZiAoZXJyb3IgPj0gZTEwKSBzdGVwMSAqPSAxMDsKICAgICAgZWxzZSBpZiAoZXJyb3IgPj0gZTUpIHN0ZXAxICo9IDU7CiAgICAgIGVsc2UgaWYgKGVycm9yID49IGUyKSBzdGVwMSAqPSAyOwogICAgICByZXR1cm4gc3RvcCA8IHN0YXJ0ID8gLXN0ZXAxIDogc3RlcDE7CiAgICB9CgogICAgZnVuY3Rpb24gdGhyZXNob2xkU3R1cmdlcyh2YWx1ZXMpIHsKICAgICAgcmV0dXJuIE1hdGguY2VpbChNYXRoLmxvZyh2YWx1ZXMubGVuZ3RoKSAvIE1hdGguTE4yKSArIDE7CiAgICB9CgogICAgZnVuY3Rpb24gaGlzdG9ncmFtKCkgewogICAgICB2YXIgdmFsdWUgPSBpZGVudGl0eSQxLAogICAgICAgICAgZG9tYWluID0gZXh0ZW50LAogICAgICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkU3R1cmdlczsKCiAgICAgIGZ1bmN0aW9uIGhpc3RvZ3JhbShkYXRhKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgeCwKICAgICAgICAgICAgdmFsdWVzID0gbmV3IEFycmF5KG4pOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICB2YWx1ZXNbaV0gPSB2YWx1ZShkYXRhW2ldLCBpLCBkYXRhKTsKICAgICAgICB9CgogICAgICAgIHZhciB4eiA9IGRvbWFpbih2YWx1ZXMpLAogICAgICAgICAgICB4MCA9IHh6WzBdLAogICAgICAgICAgICB4MSA9IHh6WzFdLAogICAgICAgICAgICB0eiA9IHRocmVzaG9sZCh2YWx1ZXMsIHgwLCB4MSk7CgogICAgICAgIC8vIENvbnZlcnQgbnVtYmVyIG9mIHRocmVzaG9sZHMgaW50byB1bmlmb3JtIHRocmVzaG9sZHMuCiAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KHR6KSkgewogICAgICAgICAgdHogPSB0aWNrU3RlcCh4MCwgeDEsIHR6KTsKICAgICAgICAgIHR6ID0gc2VxdWVuY2UkMShNYXRoLmNlaWwoeDAgLyB0eikgKiB0eiwgeDEsIHR6KTsgLy8gZXhjbHVzaXZlCiAgICAgICAgfQoKICAgICAgICAvLyBSZW1vdmUgYW55IHRocmVzaG9sZHMgb3V0c2lkZSB0aGUgZG9tYWluLgogICAgICAgIHZhciBtID0gdHoubGVuZ3RoOwogICAgICAgIHdoaWxlICh0elswXSA8PSB4MCkgdHouc2hpZnQoKSwgLS1tOwogICAgICAgIHdoaWxlICh0elttIC0gMV0gPiB4MSkgdHoucG9wKCksIC0tbTsKCiAgICAgICAgdmFyIGJpbnMgPSBuZXcgQXJyYXkobSArIDEpLAogICAgICAgICAgICBiaW47CgogICAgICAgIC8vIEluaXRpYWxpemUgYmlucy4KICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG07ICsraSkgewogICAgICAgICAgYmluID0gYmluc1tpXSA9IFtdOwogICAgICAgICAgYmluLngwID0gaSA+IDAgPyB0eltpIC0gMV0gOiB4MDsKICAgICAgICAgIGJpbi54MSA9IGkgPCBtID8gdHpbaV0gOiB4MTsKICAgICAgICB9CgogICAgICAgIC8vIEFzc2lnbiBkYXRhIHRvIGJpbnMgYnkgdmFsdWUsIGlnbm9yaW5nIGFueSBvdXRzaWRlIHRoZSBkb21haW4uCiAgICAgICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgeCA9IHZhbHVlc1tpXTsKICAgICAgICAgIGlmICh4MCA8PSB4ICYmIHggPD0geDEpIHsKICAgICAgICAgICAgYmluc1tiaXNlY3RSaWdodCh0eiwgeCwgMCwgbSldLnB1c2goZGF0YVtpXSk7CiAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYmluczsKICAgICAgfQoKICAgICAgaGlzdG9ncmFtLnZhbHVlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHZhbHVlID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoXyksIGhpc3RvZ3JhbSkgOiB2YWx1ZTsKICAgICAgfTsKCiAgICAgIGhpc3RvZ3JhbS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQoW19bMF0sIF9bMV1dKSwgaGlzdG9ncmFtKSA6IGRvbWFpbjsKICAgICAgfTsKCiAgICAgIGhpc3RvZ3JhbS50aHJlc2hvbGRzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRocmVzaG9sZCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IEFycmF5LmlzQXJyYXkoXykgPyBjb25zdGFudChzbGljZS5jYWxsKF8pKSA6IGNvbnN0YW50KF8pLCBoaXN0b2dyYW0pIDogdGhyZXNob2xkOwogICAgICB9OwoKICAgICAgcmV0dXJuIGhpc3RvZ3JhbTsKICAgIH0KCiAgICB2YXIgc2xpY2UkMSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTsKCiAgICBmdW5jdGlvbiBpZGVudGl0eSQyKHgpIHsKICAgICAgcmV0dXJuIHg7CiAgICB9CgogICAgdmFyIHRvcCA9IDEsCiAgICAgICAgcmlnaHQgPSAyLAogICAgICAgIGJvdHRvbSA9IDMsCiAgICAgICAgbGVmdCA9IDQsCiAgICAgICAgZXBzaWxvbiA9IDFlLTY7CgogICAgZnVuY3Rpb24gdHJhbnNsYXRlWCh4KSB7CiAgICAgIHJldHVybiAidHJhbnNsYXRlKCIgKyAoeCArIDAuNSkgKyAiLDApIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2xhdGVZKHkpIHsKICAgICAgcmV0dXJuICJ0cmFuc2xhdGUoMCwiICsgKHkgKyAwLjUpICsgIikiOwogICAgfQoKICAgIGZ1bmN0aW9uIG51bWJlcihzY2FsZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oZCkgewogICAgICAgIHJldHVybiArc2NhbGUoZCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2VudGVyKHNjYWxlKSB7CiAgICAgIHZhciBvZmZzZXQgPSBNYXRoLm1heCgwLCBzY2FsZS5iYW5kd2lkdGgoKSAtIDEpIC8gMjsgLy8gQWRqdXN0IGZvciAwLjVweCBvZmZzZXQuCiAgICAgIGlmIChzY2FsZS5yb3VuZCgpKSBvZmZzZXQgPSBNYXRoLnJvdW5kKG9mZnNldCk7CiAgICAgIHJldHVybiBmdW5jdGlvbihkKSB7CiAgICAgICAgcmV0dXJuICtzY2FsZShkKSArIG9mZnNldDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBlbnRlcmluZygpIHsKICAgICAgcmV0dXJuICF0aGlzLl9fYXhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBheGlzKG9yaWVudCwgc2NhbGUpIHsKICAgICAgdmFyIHRpY2tBcmd1bWVudHMgPSBbXSwKICAgICAgICAgIHRpY2tWYWx1ZXMgPSBudWxsLAogICAgICAgICAgdGlja0Zvcm1hdCA9IG51bGwsCiAgICAgICAgICB0aWNrU2l6ZUlubmVyID0gNiwKICAgICAgICAgIHRpY2tTaXplT3V0ZXIgPSA2LAogICAgICAgICAgdGlja1BhZGRpbmcgPSAzLAogICAgICAgICAgayA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gbGVmdCA/IC0xIDogMSwKICAgICAgICAgIHggPSBvcmllbnQgPT09IGxlZnQgfHwgb3JpZW50ID09PSByaWdodCA/ICJ4IiA6ICJ5IiwKICAgICAgICAgIHRyYW5zZm9ybSA9IG9yaWVudCA9PT0gdG9wIHx8IG9yaWVudCA9PT0gYm90dG9tID8gdHJhbnNsYXRlWCA6IHRyYW5zbGF0ZVk7CgogICAgICBmdW5jdGlvbiBheGlzKGNvbnRleHQpIHsKICAgICAgICB2YXIgdmFsdWVzID0gdGlja1ZhbHVlcyA9PSBudWxsID8gKHNjYWxlLnRpY2tzID8gc2NhbGUudGlja3MuYXBwbHkoc2NhbGUsIHRpY2tBcmd1bWVudHMpIDogc2NhbGUuZG9tYWluKCkpIDogdGlja1ZhbHVlcywKICAgICAgICAgICAgZm9ybWF0ID0gdGlja0Zvcm1hdCA9PSBudWxsID8gKHNjYWxlLnRpY2tGb3JtYXQgPyBzY2FsZS50aWNrRm9ybWF0LmFwcGx5KHNjYWxlLCB0aWNrQXJndW1lbnRzKSA6IGlkZW50aXR5JDIpIDogdGlja0Zvcm1hdCwKICAgICAgICAgICAgc3BhY2luZyA9IE1hdGgubWF4KHRpY2tTaXplSW5uZXIsIDApICsgdGlja1BhZGRpbmcsCiAgICAgICAgICAgIHJhbmdlID0gc2NhbGUucmFuZ2UoKSwKICAgICAgICAgICAgcmFuZ2UwID0gK3JhbmdlWzBdICsgMC41LAogICAgICAgICAgICByYW5nZTEgPSArcmFuZ2VbcmFuZ2UubGVuZ3RoIC0gMV0gKyAwLjUsCiAgICAgICAgICAgIHBvc2l0aW9uID0gKHNjYWxlLmJhbmR3aWR0aCA/IGNlbnRlciA6IG51bWJlcikoc2NhbGUuY29weSgpKSwKICAgICAgICAgICAgc2VsZWN0aW9uID0gY29udGV4dC5zZWxlY3Rpb24gPyBjb250ZXh0LnNlbGVjdGlvbigpIDogY29udGV4dCwKICAgICAgICAgICAgcGF0aCA9IHNlbGVjdGlvbi5zZWxlY3RBbGwoIi5kb21haW4iKS5kYXRhKFtudWxsXSksCiAgICAgICAgICAgIHRpY2sgPSBzZWxlY3Rpb24uc2VsZWN0QWxsKCIudGljayIpLmRhdGEodmFsdWVzLCBzY2FsZSkub3JkZXIoKSwKICAgICAgICAgICAgdGlja0V4aXQgPSB0aWNrLmV4aXQoKSwKICAgICAgICAgICAgdGlja0VudGVyID0gdGljay5lbnRlcigpLmFwcGVuZCgiZyIpLmF0dHIoImNsYXNzIiwgInRpY2siKSwKICAgICAgICAgICAgbGluZSA9IHRpY2suc2VsZWN0KCJsaW5lIiksCiAgICAgICAgICAgIHRleHQgPSB0aWNrLnNlbGVjdCgidGV4dCIpOwoKICAgICAgICBwYXRoID0gcGF0aC5tZXJnZShwYXRoLmVudGVyKCkuaW5zZXJ0KCJwYXRoIiwgIi50aWNrIikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgImRvbWFpbiIpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiY3VycmVudENvbG9yIikpOwoKICAgICAgICB0aWNrID0gdGljay5tZXJnZSh0aWNrRW50ZXIpOwoKICAgICAgICBsaW5lID0gbGluZS5tZXJnZSh0aWNrRW50ZXIuYXBwZW5kKCJsaW5lIikKICAgICAgICAgICAgLmF0dHIoInN0cm9rZSIsICJjdXJyZW50Q29sb3IiKQogICAgICAgICAgICAuYXR0cih4ICsgIjIiLCBrICogdGlja1NpemVJbm5lcikpOwoKICAgICAgICB0ZXh0ID0gdGV4dC5tZXJnZSh0aWNrRW50ZXIuYXBwZW5kKCJ0ZXh0IikKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAiY3VycmVudENvbG9yIikKICAgICAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpCiAgICAgICAgICAgIC5hdHRyKCJkeSIsIG9yaWVudCA9PT0gdG9wID8gIjBlbSIgOiBvcmllbnQgPT09IGJvdHRvbSA/ICIwLjcxZW0iIDogIjAuMzJlbSIpKTsKCiAgICAgICAgaWYgKGNvbnRleHQgIT09IHNlbGVjdGlvbikgewogICAgICAgICAgcGF0aCA9IHBhdGgudHJhbnNpdGlvbihjb250ZXh0KTsKICAgICAgICAgIHRpY2sgPSB0aWNrLnRyYW5zaXRpb24oY29udGV4dCk7CiAgICAgICAgICBsaW5lID0gbGluZS50cmFuc2l0aW9uKGNvbnRleHQpOwogICAgICAgICAgdGV4dCA9IHRleHQudHJhbnNpdGlvbihjb250ZXh0KTsKCiAgICAgICAgICB0aWNrRXhpdCA9IHRpY2tFeGl0LnRyYW5zaXRpb24oY29udGV4dCkKICAgICAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIGVwc2lsb24pCiAgICAgICAgICAgICAgLmF0dHIoInRyYW5zZm9ybSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGlzRmluaXRlKGQgPSBwb3NpdGlvbihkKSkgPyB0cmFuc2Zvcm0oZCkgOiB0aGlzLmdldEF0dHJpYnV0ZSgidHJhbnNmb3JtIik7IH0pOwoKICAgICAgICAgIHRpY2tFbnRlcgogICAgICAgICAgICAgIC5hdHRyKCJvcGFjaXR5IiwgZXBzaWxvbikKICAgICAgICAgICAgICAuYXR0cigidHJhbnNmb3JtIiwgZnVuY3Rpb24oZCkgeyB2YXIgcCA9IHRoaXMucGFyZW50Tm9kZS5fX2F4aXM7IHJldHVybiB0cmFuc2Zvcm0ocCAmJiBpc0Zpbml0ZShwID0gcChkKSkgPyBwIDogcG9zaXRpb24oZCkpOyB9KTsKICAgICAgICB9CgogICAgICAgIHRpY2tFeGl0LnJlbW92ZSgpOwoKICAgICAgICBwYXRoCiAgICAgICAgICAgIC5hdHRyKCJkIiwgb3JpZW50ID09PSBsZWZ0IHx8IG9yaWVudCA9PSByaWdodAogICAgICAgICAgICAgICAgPyAodGlja1NpemVPdXRlciA/ICJNIiArIGsgKiB0aWNrU2l6ZU91dGVyICsgIiwiICsgcmFuZ2UwICsgIkgwLjVWIiArIHJhbmdlMSArICJIIiArIGsgKiB0aWNrU2l6ZU91dGVyIDogIk0wLjUsIiArIHJhbmdlMCArICJWIiArIHJhbmdlMSkKICAgICAgICAgICAgICAgIDogKHRpY2tTaXplT3V0ZXIgPyAiTSIgKyByYW5nZTAgKyAiLCIgKyBrICogdGlja1NpemVPdXRlciArICJWMC41SCIgKyByYW5nZTEgKyAiViIgKyBrICogdGlja1NpemVPdXRlciA6ICJNIiArIHJhbmdlMCArICIsMC41SCIgKyByYW5nZTEpKTsKCiAgICAgICAgdGljawogICAgICAgICAgICAuYXR0cigib3BhY2l0eSIsIDEpCiAgICAgICAgICAgIC5hdHRyKCJ0cmFuc2Zvcm0iLCBmdW5jdGlvbihkKSB7IHJldHVybiB0cmFuc2Zvcm0ocG9zaXRpb24oZCkpOyB9KTsKCiAgICAgICAgbGluZQogICAgICAgICAgICAuYXR0cih4ICsgIjIiLCBrICogdGlja1NpemVJbm5lcik7CgogICAgICAgIHRleHQKICAgICAgICAgICAgLmF0dHIoeCwgayAqIHNwYWNpbmcpCiAgICAgICAgICAgIC50ZXh0KGZvcm1hdCk7CgogICAgICAgIHNlbGVjdGlvbi5maWx0ZXIoZW50ZXJpbmcpCiAgICAgICAgICAgIC5hdHRyKCJmaWxsIiwgIm5vbmUiKQogICAgICAgICAgICAuYXR0cigiZm9udC1zaXplIiwgMTApCiAgICAgICAgICAgIC5hdHRyKCJmb250LWZhbWlseSIsICJzYW5zLXNlcmlmIikKICAgICAgICAgICAgLmF0dHIoInRleHQtYW5jaG9yIiwgb3JpZW50ID09PSByaWdodCA/ICJzdGFydCIgOiBvcmllbnQgPT09IGxlZnQgPyAiZW5kIiA6ICJtaWRkbGUiKTsKCiAgICAgICAgc2VsZWN0aW9uCiAgICAgICAgICAgIC5lYWNoKGZ1bmN0aW9uKCkgeyB0aGlzLl9fYXhpcyA9IHBvc2l0aW9uOyB9KTsKICAgICAgfQoKICAgICAgYXhpcy5zY2FsZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChzY2FsZSA9IF8sIGF4aXMpIDogc2NhbGU7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tzID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRpY2tBcmd1bWVudHMgPSBzbGljZSQxLmNhbGwoYXJndW1lbnRzKSwgYXhpczsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja0FyZ3VtZW50cyA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrQXJndW1lbnRzID0gXyA9PSBudWxsID8gW10gOiBzbGljZSQxLmNhbGwoXyksIGF4aXMpIDogdGlja0FyZ3VtZW50cy5zbGljZSgpOwogICAgICB9OwoKICAgICAgYXhpcy50aWNrVmFsdWVzID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tWYWx1ZXMgPSBfID09IG51bGwgPyBudWxsIDogc2xpY2UkMS5jYWxsKF8pLCBheGlzKSA6IHRpY2tWYWx1ZXMgJiYgdGlja1ZhbHVlcy5zbGljZSgpOwogICAgICB9OwoKICAgICAgYXhpcy50aWNrRm9ybWF0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tGb3JtYXQgPSBfLCBheGlzKSA6IHRpY2tGb3JtYXQ7CiAgICAgIH07CgogICAgICBheGlzLnRpY2tTaXplID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRpY2tTaXplSW5uZXIgPSB0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1NpemVJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZUlubmVyID0gK18sIGF4aXMpIDogdGlja1NpemVJbm5lcjsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1NpemVPdXRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh0aWNrU2l6ZU91dGVyID0gK18sIGF4aXMpIDogdGlja1NpemVPdXRlcjsKICAgICAgfTsKCiAgICAgIGF4aXMudGlja1BhZGRpbmcgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodGlja1BhZGRpbmcgPSArXywgYXhpcykgOiB0aWNrUGFkZGluZzsKICAgICAgfTsKCiAgICAgIHJldHVybiBheGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGF4aXNSaWdodChzY2FsZSkgewogICAgICByZXR1cm4gYXhpcyhyaWdodCwgc2NhbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGF4aXNCb3R0b20oc2NhbGUpIHsKICAgICAgcmV0dXJuIGF4aXMoYm90dG9tLCBzY2FsZSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXhpc0xlZnQoc2NhbGUpIHsKICAgICAgcmV0dXJuIGF4aXMobGVmdCwgc2NhbGUpOwogICAgfQoKICAgIHZhciBub29wJDIgPSB7dmFsdWU6IGZ1bmN0aW9uKCkge319OwoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoJDMoKSB7CiAgICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJndW1lbnRzLmxlbmd0aCwgXyA9IHt9LCB0OyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKCEodCA9IGFyZ3VtZW50c1tpXSArICIiKSB8fCAodCBpbiBfKSB8fCAvW1xzLl0vLnRlc3QodCkpIHRocm93IG5ldyBFcnJvcigiaWxsZWdhbCB0eXBlOiAiICsgdCk7CiAgICAgICAgX1t0XSA9IFtdOwogICAgICB9CiAgICAgIHJldHVybiBuZXcgRGlzcGF0Y2goXyk7CiAgICB9CgogICAgZnVuY3Rpb24gRGlzcGF0Y2goXykgewogICAgICB0aGlzLl8gPSBfOwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzKHR5cGVuYW1lcywgdHlwZXMpIHsKICAgICAgcmV0dXJuIHR5cGVuYW1lcy50cmltKCkuc3BsaXQoL158XHMrLykubWFwKGZ1bmN0aW9uKHQpIHsKICAgICAgICB2YXIgbmFtZSA9ICIiLCBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgbmFtZSA9IHQuc2xpY2UoaSArIDEpLCB0ID0gdC5zbGljZSgwLCBpKTsKICAgICAgICBpZiAodCAmJiAhdHlwZXMuaGFzT3duUHJvcGVydHkodCkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdCk7CiAgICAgICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTsKICAgICAgfSk7CiAgICB9CgogICAgRGlzcGF0Y2gucHJvdG90eXBlID0gZGlzcGF0Y2gkMy5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBEaXNwYXRjaCwKICAgICAgb246IGZ1bmN0aW9uKHR5cGVuYW1lLCBjYWxsYmFjaykgewogICAgICAgIHZhciBfID0gdGhpcy5fLAogICAgICAgICAgICBUID0gcGFyc2VUeXBlbmFtZXModHlwZW5hbWUgKyAiIiwgXyksCiAgICAgICAgICAgIHQsCiAgICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgICAgbiA9IFQubGVuZ3RoOwoKICAgICAgICAvLyBJZiBubyBjYWxsYmFjayB3YXMgc3BlY2lmaWVkLCByZXR1cm4gdGhlIGNhbGxiYWNrIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCBuYW1lLgogICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICgodCA9ICh0eXBlbmFtZSA9IFRbaV0pLnR5cGUpICYmICh0ID0gZ2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUpKSkgcmV0dXJuIHQ7CiAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICAvLyBJZiBhIHR5cGUgd2FzIHNwZWNpZmllZCwgc2V0IHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHR5cGUgYW5kIG5hbWUuCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBpZiBhIG51bGwgY2FsbGJhY2sgd2FzIHNwZWNpZmllZCwgcmVtb3ZlIGNhbGxiYWNrcyBvZiB0aGUgZ2l2ZW4gbmFtZS4KICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCAmJiB0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBFcnJvcigiaW52YWxpZCBjYWxsYmFjazogIiArIGNhbGxiYWNrKTsKICAgICAgICB3aGlsZSAoKytpIDwgbikgewogICAgICAgICAgaWYgKHQgPSAodHlwZW5hbWUgPSBUW2ldKS50eXBlKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIGNhbGxiYWNrKTsKICAgICAgICAgIGVsc2UgaWYgKGNhbGxiYWNrID09IG51bGwpIGZvciAodCBpbiBfKSBfW3RdID0gc2V0KF9bdF0sIHR5cGVuYW1lLm5hbWUsIG51bGwpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIGNvcHk6IGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBjb3B5ID0ge30sIF8gPSB0aGlzLl87CiAgICAgICAgZm9yICh2YXIgdCBpbiBfKSBjb3B5W3RdID0gX1t0XS5zbGljZSgpOwogICAgICAgIHJldHVybiBuZXcgRGlzcGF0Y2goY29weSk7CiAgICAgIH0sCiAgICAgIGNhbGw6IGZ1bmN0aW9uKHR5cGUsIHRoYXQpIHsKICAgICAgICBpZiAoKG4gPSBhcmd1bWVudHMubGVuZ3RoIC0gMikgPiAwKSBmb3IgKHZhciBhcmdzID0gbmV3IEFycmF5KG4pLCBpID0gMCwgbiwgdDsgaSA8IG47ICsraSkgYXJnc1tpXSA9IGFyZ3VtZW50c1tpICsgMl07CiAgICAgICAgaWYgKCF0aGlzLl8uaGFzT3duUHJvcGVydHkodHlwZSkpIHRocm93IG5ldyBFcnJvcigidW5rbm93biB0eXBlOiAiICsgdHlwZSk7CiAgICAgICAgZm9yICh0ID0gdGhpcy5fW3R5cGVdLCBpID0gMCwgbiA9IHQubGVuZ3RoOyBpIDwgbjsgKytpKSB0W2ldLnZhbHVlLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9LAogICAgICBhcHBseTogZnVuY3Rpb24odHlwZSwgdGhhdCwgYXJncykgewogICAgICAgIGlmICghdGhpcy5fLmhhc093blByb3BlcnR5KHR5cGUpKSB0aHJvdyBuZXcgRXJyb3IoInVua25vd24gdHlwZTogIiArIHR5cGUpOwogICAgICAgIGZvciAodmFyIHQgPSB0aGlzLl9bdHlwZV0sIGkgPSAwLCBuID0gdC5sZW5ndGg7IGkgPCBuOyArK2kpIHRbaV0udmFsdWUuYXBwbHkodGhhdCwgYXJncyk7CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gZ2V0KHR5cGUsIG5hbWUpIHsKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0eXBlLmxlbmd0aCwgYzsgaSA8IG47ICsraSkgewogICAgICAgIGlmICgoYyA9IHR5cGVbaV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgIHJldHVybiBjLnZhbHVlOwogICAgICAgIH0KICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHNldCh0eXBlLCBuYW1lLCBjYWxsYmFjaykgewogICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR5cGUubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgaWYgKHR5cGVbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgdHlwZVtpXSA9IG5vb3AkMiwgdHlwZSA9IHR5cGUuc2xpY2UoMCwgaSkuY29uY2F0KHR5cGUuc2xpY2UoaSArIDEpKTsKICAgICAgICAgIGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgdHlwZS5wdXNoKHtuYW1lOiBuYW1lLCB2YWx1ZTogY2FsbGJhY2t9KTsKICAgICAgcmV0dXJuIHR5cGU7CiAgICB9CgogICAgdmFyIHhodG1sID0gImh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiOwoKICAgIHZhciBuYW1lc3BhY2VzID0gewogICAgICBzdmc6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsCiAgICAgIHhodG1sOiB4aHRtbCwKICAgICAgeGxpbms6ICJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIiwKICAgICAgeG1sOiAiaHR0cDovL3d3dy53My5vcmcvWE1MLzE5OTgvbmFtZXNwYWNlIiwKICAgICAgeG1sbnM6ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIKICAgIH07CgogICAgZnVuY3Rpb24gbmFtZXNwYWNlKG5hbWUpIHsKICAgICAgdmFyIHByZWZpeCA9IG5hbWUgKz0gIiIsIGkgPSBwcmVmaXguaW5kZXhPZigiOiIpOwogICAgICBpZiAoaSA+PSAwICYmIChwcmVmaXggPSBuYW1lLnNsaWNlKDAsIGkpKSAhPT0gInhtbG5zIikgbmFtZSA9IG5hbWUuc2xpY2UoaSArIDEpOwogICAgICByZXR1cm4gbmFtZXNwYWNlcy5oYXNPd25Qcm9wZXJ0eShwcmVmaXgpID8ge3NwYWNlOiBuYW1lc3BhY2VzW3ByZWZpeF0sIGxvY2FsOiBuYW1lfSA6IG5hbWU7CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvckluaGVyaXQobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGRvY3VtZW50ID0gdGhpcy5vd25lckRvY3VtZW50LAogICAgICAgICAgICB1cmkgPSB0aGlzLm5hbWVzcGFjZVVSSTsKICAgICAgICByZXR1cm4gdXJpID09PSB4aHRtbCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQubmFtZXNwYWNlVVJJID09PSB4aHRtbAogICAgICAgICAgICA/IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQobmFtZSkKICAgICAgICAgICAgOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlModXJpLCBuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdG9yRml4ZWQoZnVsbG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLm93bmVyRG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY3JlYXRvcihuYW1lKSB7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgICAgcmV0dXJuIChmdWxsbmFtZS5sb2NhbAogICAgICAgICAgPyBjcmVhdG9yRml4ZWQKICAgICAgICAgIDogY3JlYXRvckluaGVyaXQpKGZ1bGxuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub25lKCkge30KCiAgICBmdW5jdGlvbiBzZWxlY3RvcihzZWxlY3RvcikgewogICAgICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IG5vbmUgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0KHNlbGVjdCkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3Ioc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgc3ViZ3JvdXAgPSBzdWJncm91cHNbal0gPSBuZXcgQXJyYXkobiksIG5vZGUsIHN1Ym5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKHN1Ym5vZGUgPSBzZWxlY3QuY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpKSB7CiAgICAgICAgICAgIGlmICgiX19kYXRhX18iIGluIG5vZGUpIHN1Ym5vZGUuX19kYXRhX18gPSBub2RlLl9fZGF0YV9fOwogICAgICAgICAgICBzdWJncm91cFtpXSA9IHN1Ym5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIGVtcHR5JDEoKSB7CiAgICAgIHJldHVybiBbXTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3RvckFsbChzZWxlY3RvcikgewogICAgICByZXR1cm4gc2VsZWN0b3IgPT0gbnVsbCA/IGVtcHR5JDEgOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fc2VsZWN0QWxsKHNlbGVjdCkgewogICAgICBpZiAodHlwZW9mIHNlbGVjdCAhPT0gImZ1bmN0aW9uIikgc2VsZWN0ID0gc2VsZWN0b3JBbGwoc2VsZWN0KTsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgbSA9IGdyb3Vwcy5sZW5ndGgsIHN1Ymdyb3VwcyA9IFtdLCBwYXJlbnRzID0gW10sIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIHN1Ymdyb3Vwcy5wdXNoKHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSk7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHN1Ymdyb3VwcywgcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gbWF0Y2hlcihzZWxlY3RvcikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMubWF0Y2hlcyhzZWxlY3Rvcik7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2ZpbHRlcihtYXRjaCkgewogICAgICBpZiAodHlwZW9mIG1hdGNoICE9PSAiZnVuY3Rpb24iKSBtYXRjaCA9IG1hdGNoZXIobWF0Y2gpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgc3ViZ3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzdWJncm91cCA9IHN1Ymdyb3Vwc1tqXSA9IFtdLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIG1hdGNoLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSB7CiAgICAgICAgICAgIHN1Ymdyb3VwLnB1c2gobm9kZSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNwYXJzZSh1cGRhdGUpIHsKICAgICAgcmV0dXJuIG5ldyBBcnJheSh1cGRhdGUubGVuZ3RoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZW50ZXIoKSB7CiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHRoaXMuX2VudGVyIHx8IHRoaXMuX2dyb3Vwcy5tYXAoc3BhcnNlKSwgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gRW50ZXJOb2RlKHBhcmVudCwgZGF0dW0pIHsKICAgICAgdGhpcy5vd25lckRvY3VtZW50ID0gcGFyZW50Lm93bmVyRG9jdW1lbnQ7CiAgICAgIHRoaXMubmFtZXNwYWNlVVJJID0gcGFyZW50Lm5hbWVzcGFjZVVSSTsKICAgICAgdGhpcy5fbmV4dCA9IG51bGw7CiAgICAgIHRoaXMuX3BhcmVudCA9IHBhcmVudDsKICAgICAgdGhpcy5fX2RhdGFfXyA9IGRhdHVtOwogICAgfQoKICAgIEVudGVyTm9kZS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBFbnRlck5vZGUsCiAgICAgIGFwcGVuZENoaWxkOiBmdW5jdGlvbihjaGlsZCkgeyByZXR1cm4gdGhpcy5fcGFyZW50Lmluc2VydEJlZm9yZShjaGlsZCwgdGhpcy5fbmV4dCk7IH0sCiAgICAgIGluc2VydEJlZm9yZTogZnVuY3Rpb24oY2hpbGQsIG5leHQpIHsgcmV0dXJuIHRoaXMuX3BhcmVudC5pbnNlcnRCZWZvcmUoY2hpbGQsIG5leHQpOyB9LAogICAgICBxdWVyeVNlbGVjdG9yOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpOyB9LAogICAgICBxdWVyeVNlbGVjdG9yQWxsOiBmdW5jdGlvbihzZWxlY3RvcikgeyByZXR1cm4gdGhpcy5fcGFyZW50LnF1ZXJ5U2VsZWN0b3JBbGwoc2VsZWN0b3IpOyB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDEoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGtleVByZWZpeCA9ICIkIjsgLy8gUHJvdGVjdCBhZ2FpbnN0IGtleXMgbGlrZSDigJxfX3Byb3RvX1/igJ0uCgogICAgZnVuY3Rpb24gYmluZEluZGV4KHBhcmVudCwgZ3JvdXAsIGVudGVyLCB1cGRhdGUsIGV4aXQsIGRhdGEpIHsKICAgICAgdmFyIGkgPSAwLAogICAgICAgICAgbm9kZSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoOwoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGZpdCBpbnRvIHVwZGF0ZS4KICAgICAgLy8gUHV0IGFueSBudWxsIG5vZGVzIGludG8gZW50ZXIuCiAgICAgIC8vIFB1dCBhbnkgcmVtYWluaW5nIGRhdGEgaW50byBlbnRlci4KICAgICAgZm9yICg7IGkgPCBkYXRhTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBub2RlLl9fZGF0YV9fID0gZGF0YVtpXTsKICAgICAgICAgIHVwZGF0ZVtpXSA9IG5vZGU7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIGVudGVyW2ldID0gbmV3IEVudGVyTm9kZShwYXJlbnQsIGRhdGFbaV0pOwogICAgICAgIH0KICAgICAgfQoKICAgICAgLy8gUHV0IGFueSBub24tbnVsbCBub2RlcyB0aGF0IGRvbuKAmXQgZml0IGludG8gZXhpdC4KICAgICAgZm9yICg7IGkgPCBncm91cExlbmd0aDsgKytpKSB7CiAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgZXhpdFtpXSA9IG5vZGU7CiAgICAgICAgfQogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gYmluZEtleShwYXJlbnQsIGdyb3VwLCBlbnRlciwgdXBkYXRlLCBleGl0LCBkYXRhLCBrZXkpIHsKICAgICAgdmFyIGksCiAgICAgICAgICBub2RlLAogICAgICAgICAgbm9kZUJ5S2V5VmFsdWUgPSB7fSwKICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgZGF0YUxlbmd0aCA9IGRhdGEubGVuZ3RoLAogICAgICAgICAga2V5VmFsdWVzID0gbmV3IEFycmF5KGdyb3VwTGVuZ3RoKSwKICAgICAgICAgIGtleVZhbHVlOwoKICAgICAgLy8gQ29tcHV0ZSB0aGUga2V5IGZvciBlYWNoIG5vZGUuCiAgICAgIC8vIElmIG11bHRpcGxlIG5vZGVzIGhhdmUgdGhlIHNhbWUga2V5LCB0aGUgZHVwbGljYXRlcyBhcmUgYWRkZWQgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICBrZXlWYWx1ZXNbaV0gPSBrZXlWYWx1ZSA9IGtleVByZWZpeCArIGtleS5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKTsKICAgICAgICAgIGlmIChrZXlWYWx1ZSBpbiBub2RlQnlLZXlWYWx1ZSkgewogICAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBDb21wdXRlIHRoZSBrZXkgZm9yIGVhY2ggZGF0dW0uCiAgICAgIC8vIElmIHRoZXJlIGEgbm9kZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBrZXksIGpvaW4gYW5kIGFkZCBpdCB0byB1cGRhdGUuCiAgICAgIC8vIElmIHRoZXJlIGlzIG5vdCAob3IgdGhlIGtleSBpcyBhIGR1cGxpY2F0ZSksIGFkZCBpdCB0byBlbnRlci4KICAgICAgZm9yIChpID0gMDsgaSA8IGRhdGFMZW5ndGg7ICsraSkgewogICAgICAgIGtleVZhbHVlID0ga2V5UHJlZml4ICsga2V5LmNhbGwocGFyZW50LCBkYXRhW2ldLCBpLCBkYXRhKTsKICAgICAgICBpZiAobm9kZSA9IG5vZGVCeUtleVZhbHVlW2tleVZhbHVlXSkgewogICAgICAgICAgdXBkYXRlW2ldID0gbm9kZTsKICAgICAgICAgIG5vZGUuX19kYXRhX18gPSBkYXRhW2ldOwogICAgICAgICAgbm9kZUJ5S2V5VmFsdWVba2V5VmFsdWVdID0gbnVsbDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZW50ZXJbaV0gPSBuZXcgRW50ZXJOb2RlKHBhcmVudCwgZGF0YVtpXSk7CiAgICAgICAgfQogICAgICB9CgogICAgICAvLyBBZGQgYW55IHJlbWFpbmluZyBub2RlcyB0aGF0IHdlcmUgbm90IGJvdW5kIHRvIGRhdGEgdG8gZXhpdC4KICAgICAgZm9yIChpID0gMDsgaSA8IGdyb3VwTGVuZ3RoOyArK2kpIHsKICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgKG5vZGVCeUtleVZhbHVlW2tleVZhbHVlc1tpXV0gPT09IG5vZGUpKSB7CiAgICAgICAgICBleGl0W2ldID0gbm9kZTsKICAgICAgICB9CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0YSh2YWx1ZSwga2V5KSB7CiAgICAgIGlmICghdmFsdWUpIHsKICAgICAgICBkYXRhID0gbmV3IEFycmF5KHRoaXMuc2l6ZSgpKSwgaiA9IC0xOwogICAgICAgIHRoaXMuZWFjaChmdW5jdGlvbihkKSB7IGRhdGFbKytqXSA9IGQ7IH0pOwogICAgICAgIHJldHVybiBkYXRhOwogICAgICB9CgogICAgICB2YXIgYmluZCA9IGtleSA/IGJpbmRLZXkgOiBiaW5kSW5kZXgsCiAgICAgICAgICBwYXJlbnRzID0gdGhpcy5fcGFyZW50cywKICAgICAgICAgIGdyb3VwcyA9IHRoaXMuX2dyb3VwczsKCiAgICAgIGlmICh0eXBlb2YgdmFsdWUgIT09ICJmdW5jdGlvbiIpIHZhbHVlID0gY29uc3RhbnQkMSh2YWx1ZSk7CgogICAgICBmb3IgKHZhciBtID0gZ3JvdXBzLmxlbmd0aCwgdXBkYXRlID0gbmV3IEFycmF5KG0pLCBlbnRlciA9IG5ldyBBcnJheShtKSwgZXhpdCA9IG5ldyBBcnJheShtKSwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICB2YXIgcGFyZW50ID0gcGFyZW50c1tqXSwKICAgICAgICAgICAgZ3JvdXAgPSBncm91cHNbal0sCiAgICAgICAgICAgIGdyb3VwTGVuZ3RoID0gZ3JvdXAubGVuZ3RoLAogICAgICAgICAgICBkYXRhID0gdmFsdWUuY2FsbChwYXJlbnQsIHBhcmVudCAmJiBwYXJlbnQuX19kYXRhX18sIGosIHBhcmVudHMpLAogICAgICAgICAgICBkYXRhTGVuZ3RoID0gZGF0YS5sZW5ndGgsCiAgICAgICAgICAgIGVudGVyR3JvdXAgPSBlbnRlcltqXSA9IG5ldyBBcnJheShkYXRhTGVuZ3RoKSwKICAgICAgICAgICAgdXBkYXRlR3JvdXAgPSB1cGRhdGVbal0gPSBuZXcgQXJyYXkoZGF0YUxlbmd0aCksCiAgICAgICAgICAgIGV4aXRHcm91cCA9IGV4aXRbal0gPSBuZXcgQXJyYXkoZ3JvdXBMZW5ndGgpOwoKICAgICAgICBiaW5kKHBhcmVudCwgZ3JvdXAsIGVudGVyR3JvdXAsIHVwZGF0ZUdyb3VwLCBleGl0R3JvdXAsIGRhdGEsIGtleSk7CgogICAgICAgIC8vIE5vdyBjb25uZWN0IHRoZSBlbnRlciBub2RlcyB0byB0aGVpciBmb2xsb3dpbmcgdXBkYXRlIG5vZGUsIHN1Y2ggdGhhdAogICAgICAgIC8vIGFwcGVuZENoaWxkIGNhbiBpbnNlcnQgdGhlIG1hdGVyaWFsaXplZCBlbnRlciBub2RlIGJlZm9yZSB0aGlzIG5vZGUsCiAgICAgICAgLy8gcmF0aGVyIHRoYW4gYXQgdGhlIGVuZCBvZiB0aGUgcGFyZW50IG5vZGUuCiAgICAgICAgZm9yICh2YXIgaTAgPSAwLCBpMSA9IDAsIHByZXZpb3VzLCBuZXh0OyBpMCA8IGRhdGFMZW5ndGg7ICsraTApIHsKICAgICAgICAgIGlmIChwcmV2aW91cyA9IGVudGVyR3JvdXBbaTBdKSB7CiAgICAgICAgICAgIGlmIChpMCA+PSBpMSkgaTEgPSBpMCArIDE7CiAgICAgICAgICAgIHdoaWxlICghKG5leHQgPSB1cGRhdGVHcm91cFtpMV0pICYmICsraTEgPCBkYXRhTGVuZ3RoKTsKICAgICAgICAgICAgcHJldmlvdXMuX25leHQgPSBuZXh0IHx8IG51bGw7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICB1cGRhdGUgPSBuZXcgU2VsZWN0aW9uKHVwZGF0ZSwgcGFyZW50cyk7CiAgICAgIHVwZGF0ZS5fZW50ZXIgPSBlbnRlcjsKICAgICAgdXBkYXRlLl9leGl0ID0gZXhpdDsKICAgICAgcmV0dXJuIHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZXhpdCgpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24odGhpcy5fZXhpdCB8fCB0aGlzLl9ncm91cHMubWFwKHNwYXJzZSksIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9qb2luKG9uZW50ZXIsIG9udXBkYXRlLCBvbmV4aXQpIHsKICAgICAgdmFyIGVudGVyID0gdGhpcy5lbnRlcigpLCB1cGRhdGUgPSB0aGlzLCBleGl0ID0gdGhpcy5leGl0KCk7CiAgICAgIGVudGVyID0gdHlwZW9mIG9uZW50ZXIgPT09ICJmdW5jdGlvbiIgPyBvbmVudGVyKGVudGVyKSA6IGVudGVyLmFwcGVuZChvbmVudGVyICsgIiIpOwogICAgICBpZiAob251cGRhdGUgIT0gbnVsbCkgdXBkYXRlID0gb251cGRhdGUodXBkYXRlKTsKICAgICAgaWYgKG9uZXhpdCA9PSBudWxsKSBleGl0LnJlbW92ZSgpOyBlbHNlIG9uZXhpdChleGl0KTsKICAgICAgcmV0dXJuIGVudGVyICYmIHVwZGF0ZSA/IGVudGVyLm1lcmdlKHVwZGF0ZSkub3JkZXIoKSA6IHVwZGF0ZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbWVyZ2Uoc2VsZWN0aW9uKSB7CgogICAgICBmb3IgKHZhciBncm91cHMwID0gdGhpcy5fZ3JvdXBzLCBncm91cHMxID0gc2VsZWN0aW9uLl9ncm91cHMsIG0wID0gZ3JvdXBzMC5sZW5ndGgsIG0xID0gZ3JvdXBzMS5sZW5ndGgsIG0gPSBNYXRoLm1pbihtMCwgbTEpLCBtZXJnZXMgPSBuZXcgQXJyYXkobTApLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwMCA9IGdyb3VwczBbal0sIGdyb3VwMSA9IGdyb3VwczFbal0sIG4gPSBncm91cDAubGVuZ3RoLCBtZXJnZSA9IG1lcmdlc1tqXSA9IG5ldyBBcnJheShuKSwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXAwW2ldIHx8IGdyb3VwMVtpXSkgewogICAgICAgICAgICBtZXJnZVtpXSA9IG5vZGU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICBmb3IgKDsgaiA8IG0wOyArK2opIHsKICAgICAgICBtZXJnZXNbal0gPSBncm91cHMwW2pdOwogICAgICB9CgogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vcmRlcigpIHsKCiAgICAgIGZvciAodmFyIGdyb3VwcyA9IHRoaXMuX2dyb3VwcywgaiA9IC0xLCBtID0gZ3JvdXBzLmxlbmd0aDsgKytqIDwgbTspIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgaSA9IGdyb3VwLmxlbmd0aCAtIDEsIG5leHQgPSBncm91cFtpXSwgbm9kZTsgLS1pID49IDA7KSB7CiAgICAgICAgICBpZiAobm9kZSA9IGdyb3VwW2ldKSB7CiAgICAgICAgICAgIGlmIChuZXh0ICYmIG5vZGUuY29tcGFyZURvY3VtZW50UG9zaXRpb24obmV4dCkgXiA0KSBuZXh0LnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5vZGUsIG5leHQpOwogICAgICAgICAgICBuZXh0ID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zb3J0KGNvbXBhcmUpIHsKICAgICAgaWYgKCFjb21wYXJlKSBjb21wYXJlID0gYXNjZW5kaW5nJDE7CgogICAgICBmdW5jdGlvbiBjb21wYXJlTm9kZShhLCBiKSB7CiAgICAgICAgcmV0dXJuIGEgJiYgYiA/IGNvbXBhcmUoYS5fX2RhdGFfXywgYi5fX2RhdGFfXykgOiAhYSAtICFiOwogICAgICB9CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzb3J0Z3JvdXBzID0gbmV3IEFycmF5KG0pLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBzb3J0Z3JvdXAgPSBzb3J0Z3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBzb3J0Z3JvdXBbaV0gPSBub2RlOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBzb3J0Z3JvdXAuc29ydChjb21wYXJlTm9kZSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgU2VsZWN0aW9uKHNvcnRncm91cHMsIHRoaXMuX3BhcmVudHMpLm9yZGVyKCk7CiAgICB9CgogICAgZnVuY3Rpb24gYXNjZW5kaW5nJDEoYSwgYikgewogICAgICByZXR1cm4gYSA8IGIgPyAtMSA6IGEgPiBiID8gMSA6IGEgPj0gYiA/IDAgOiBOYU47CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2NhbGwoKSB7CiAgICAgIHZhciBjYWxsYmFjayA9IGFyZ3VtZW50c1swXTsKICAgICAgYXJndW1lbnRzWzBdID0gdGhpczsKICAgICAgY2FsbGJhY2suYXBwbHkobnVsbCwgYXJndW1lbnRzKTsKICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGVzKCkgewogICAgICB2YXIgbm9kZXMgPSBuZXcgQXJyYXkodGhpcy5zaXplKCkpLCBpID0gLTE7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgbm9kZXNbKytpXSA9IHRoaXM7IH0pOwogICAgICByZXR1cm4gbm9kZXM7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX25vZGUoKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aDsgaSA8IG47ICsraSkgewogICAgICAgICAgdmFyIG5vZGUgPSBncm91cFtpXTsKICAgICAgICAgIGlmIChub2RlKSByZXR1cm4gbm9kZTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBudWxsOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zaXplKCkgewogICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgIHRoaXMuZWFjaChmdW5jdGlvbigpIHsgKytzaXplOyB9KTsKICAgICAgcmV0dXJuIHNpemU7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2VtcHR5KCkgewogICAgICByZXR1cm4gIXRoaXMubm9kZSgpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9lYWNoKGNhbGxiYWNrKSB7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIGogPSAwLCBtID0gZ3JvdXBzLmxlbmd0aDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBpID0gMCwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZTsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgY2FsbGJhY2suY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCk7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gdGhpczsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyUmVtb3ZlKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmVOUyhmdWxsbmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGUobmFtZSwgdmFsdWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIHZhbHVlKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBhdHRyRnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSB0aGlzLnJlbW92ZUF0dHJpYnV0ZShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlKG5hbWUsIHYpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJGdW5jdGlvbk5TKGZ1bGxuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHYgPSB2YWx1ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpOwogICAgICAgIGlmICh2ID09IG51bGwpIHRoaXMucmVtb3ZlQXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKTsKICAgICAgICBlbHNlIHRoaXMuc2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsLCB2KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fYXR0cihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgZnVsbG5hbWUgPSBuYW1lc3BhY2UobmFtZSk7CgogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHsKICAgICAgICB2YXIgbm9kZSA9IHRoaXMubm9kZSgpOwogICAgICAgIHJldHVybiBmdWxsbmFtZS5sb2NhbAogICAgICAgICAgICA/IG5vZGUuZ2V0QXR0cmlidXRlTlMoZnVsbG5hbWUuc3BhY2UsIGZ1bGxuYW1lLmxvY2FsKQogICAgICAgICAgICA6IG5vZGUuZ2V0QXR0cmlidXRlKGZ1bGxuYW1lKTsKICAgICAgfQoKICAgICAgcmV0dXJuIHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMgOiBhdHRyUmVtb3ZlKSA6ICh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgID8gKGZ1bGxuYW1lLmxvY2FsID8gYXR0ckZ1bmN0aW9uTlMgOiBhdHRyRnVuY3Rpb24pCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TIDogYXR0ckNvbnN0YW50KSkpKGZ1bGxuYW1lLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRWaWV3KG5vZGUpIHsKICAgICAgcmV0dXJuIChub2RlLm93bmVyRG9jdW1lbnQgJiYgbm9kZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3KSAvLyBub2RlIGlzIGEgTm9kZQogICAgICAgICAgfHwgKG5vZGUuZG9jdW1lbnQgJiYgbm9kZSkgLy8gbm9kZSBpcyBhIFdpbmRvdwogICAgICAgICAgfHwgbm9kZS5kZWZhdWx0VmlldzsgLy8gbm9kZSBpcyBhIERvY3VtZW50CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVSZW1vdmUobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50KG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlRnVuY3Rpb24obmFtZSwgdmFsdWUsIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKHYgPT0gbnVsbCkgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgICBlbHNlIHRoaXMuc3R5bGUuc2V0UHJvcGVydHkobmFtZSwgdiwgcHJpb3JpdHkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9zdHlsZShuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPiAxCiAgICAgICAgICA/IHRoaXMuZWFjaCgodmFsdWUgPT0gbnVsbAogICAgICAgICAgICAgICAgPyBzdHlsZVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgICAgPyBzdHlsZUZ1bmN0aW9uCiAgICAgICAgICAgICAgICA6IHN0eWxlQ29uc3RhbnQpKG5hbWUsIHZhbHVlLCBwcmlvcml0eSA9PSBudWxsID8gIiIgOiBwcmlvcml0eSkpCiAgICAgICAgICA6IHN0eWxlVmFsdWUodGhpcy5ub2RlKCksIG5hbWUpOwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlVmFsdWUobm9kZSwgbmFtZSkgewogICAgICByZXR1cm4gbm9kZS5zdHlsZS5nZXRQcm9wZXJ0eVZhbHVlKG5hbWUpCiAgICAgICAgICB8fCBkZWZhdWx0Vmlldyhub2RlKS5nZXRDb21wdXRlZFN0eWxlKG5vZGUsIG51bGwpLmdldFByb3BlcnR5VmFsdWUobmFtZSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlSZW1vdmUobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgZGVsZXRlIHRoaXNbbmFtZV07CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gcHJvcGVydHlDb25zdGFudChuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpc1tuYW1lXSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHByb3BlcnR5RnVuY3Rpb24obmFtZSwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAodiA9PSBudWxsKSBkZWxldGUgdGhpc1tuYW1lXTsKICAgICAgICBlbHNlIHRoaXNbbmFtZV0gPSB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9wcm9wZXJ0eShuYW1lLCB2YWx1ZSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA+IDEKICAgICAgICAgID8gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyBwcm9wZXJ0eVJlbW92ZSA6IHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gcHJvcGVydHlGdW5jdGlvbgogICAgICAgICAgICAgIDogcHJvcGVydHlDb25zdGFudCkobmFtZSwgdmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKVtuYW1lXTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0FycmF5KHN0cmluZykgewogICAgICByZXR1cm4gc3RyaW5nLnRyaW0oKS5zcGxpdCgvXnxccysvKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc0xpc3Qobm9kZSkgewogICAgICByZXR1cm4gbm9kZS5jbGFzc0xpc3QgfHwgbmV3IENsYXNzTGlzdChub2RlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBDbGFzc0xpc3Qobm9kZSkgewogICAgICB0aGlzLl9ub2RlID0gbm9kZTsKICAgICAgdGhpcy5fbmFtZXMgPSBjbGFzc0FycmF5KG5vZGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpIHx8ICIiKTsKICAgIH0KCiAgICBDbGFzc0xpc3QucHJvdG90eXBlID0gewogICAgICBhZGQ6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICB2YXIgaSA9IHRoaXMuX25hbWVzLmluZGV4T2YobmFtZSk7CiAgICAgICAgaWYgKGkgPCAwKSB7CiAgICAgICAgICB0aGlzLl9uYW1lcy5wdXNoKG5hbWUpOwogICAgICAgICAgdGhpcy5fbm9kZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgdGhpcy5fbmFtZXMuam9pbigiICIpKTsKICAgICAgICB9CiAgICAgIH0sCiAgICAgIHJlbW92ZTogZnVuY3Rpb24obmFtZSkgewogICAgICAgIHZhciBpID0gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKTsKICAgICAgICBpZiAoaSA+PSAwKSB7CiAgICAgICAgICB0aGlzLl9uYW1lcy5zcGxpY2UoaSwgMSk7CiAgICAgICAgICB0aGlzLl9ub2RlLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCB0aGlzLl9uYW1lcy5qb2luKCIgIikpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgY29udGFpbnM6IGZ1bmN0aW9uKG5hbWUpIHsKICAgICAgICByZXR1cm4gdGhpcy5fbmFtZXMuaW5kZXhPZihuYW1lKSA+PSAwOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGNsYXNzZWRBZGQobm9kZSwgbmFtZXMpIHsKICAgICAgdmFyIGxpc3QgPSBjbGFzc0xpc3Qobm9kZSksIGkgPSAtMSwgbiA9IG5hbWVzLmxlbmd0aDsKICAgICAgd2hpbGUgKCsraSA8IG4pIGxpc3QuYWRkKG5hbWVzW2ldKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGFzc2VkUmVtb3ZlKG5vZGUsIG5hbWVzKSB7CiAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KG5vZGUpLCBpID0gLTEsIG4gPSBuYW1lcy5sZW5ndGg7CiAgICAgIHdoaWxlICgrK2kgPCBuKSBsaXN0LnJlbW92ZShuYW1lc1tpXSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZFRydWUobmFtZXMpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGNsYXNzZWRBZGQodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNsYXNzZWRGYWxzZShuYW1lcykgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgY2xhc3NlZFJlbW92ZSh0aGlzLCBuYW1lcyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gY2xhc3NlZEZ1bmN0aW9uKG5hbWVzLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgKHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgPyBjbGFzc2VkQWRkIDogY2xhc3NlZFJlbW92ZSkodGhpcywgbmFtZXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbGFzc2VkKG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBuYW1lcyA9IGNsYXNzQXJyYXkobmFtZSArICIiKTsKCiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgewogICAgICAgIHZhciBsaXN0ID0gY2xhc3NMaXN0KHRoaXMubm9kZSgpKSwgaSA9IC0xLCBuID0gbmFtZXMubGVuZ3RoOwogICAgICAgIHdoaWxlICgrK2kgPCBuKSBpZiAoIWxpc3QuY29udGFpbnMobmFtZXNbaV0pKSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0KCiAgICAgIHJldHVybiB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyBjbGFzc2VkRnVuY3Rpb24gOiB2YWx1ZQogICAgICAgICAgPyBjbGFzc2VkVHJ1ZQogICAgICAgICAgOiBjbGFzc2VkRmFsc2UpKG5hbWVzLCB2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRSZW1vdmUoKSB7CiAgICAgIHRoaXMudGV4dENvbnRlbnQgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0Q29uc3RhbnQodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24odmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciB2ID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gdiA9PSBudWxsID8gIiIgOiB2OwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl90ZXh0KHZhbHVlKSB7CiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaCh2YWx1ZSA9PSBudWxsCiAgICAgICAgICAgICAgPyB0ZXh0UmVtb3ZlIDogKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gdGV4dEZ1bmN0aW9uCiAgICAgICAgICAgICAgOiB0ZXh0Q29uc3RhbnQpKHZhbHVlKSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkudGV4dENvbnRlbnQ7CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbFJlbW92ZSgpIHsKICAgICAgdGhpcy5pbm5lckhUTUwgPSAiIjsKICAgIH0KCiAgICBmdW5jdGlvbiBodG1sQ29uc3RhbnQodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuaW5uZXJIVE1MID0gdmFsdWU7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gaHRtbEZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdiA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgdGhpcy5pbm5lckhUTUwgPSB2ID09IG51bGwgPyAiIiA6IHY7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2h0bWwodmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKHZhbHVlID09IG51bGwKICAgICAgICAgICAgICA/IGh0bWxSZW1vdmUgOiAodHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iCiAgICAgICAgICAgICAgPyBodG1sRnVuY3Rpb24KICAgICAgICAgICAgICA6IGh0bWxDb25zdGFudCkodmFsdWUpKQogICAgICAgICAgOiB0aGlzLm5vZGUoKS5pbm5lckhUTUw7CiAgICB9CgogICAgZnVuY3Rpb24gcmFpc2UoKSB7CiAgICAgIGlmICh0aGlzLm5leHRTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuYXBwZW5kQ2hpbGQodGhpcyk7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3JhaXNlKCkgewogICAgICByZXR1cm4gdGhpcy5lYWNoKHJhaXNlKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsb3dlcigpIHsKICAgICAgaWYgKHRoaXMucHJldmlvdXNTaWJsaW5nKSB0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKHRoaXMsIHRoaXMucGFyZW50Tm9kZS5maXJzdENoaWxkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fbG93ZXIoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gobG93ZXIpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9hcHBlbmQobmFtZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKTsKICAgICAgcmV0dXJuIHRoaXMuc2VsZWN0KGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiB0aGlzLmFwcGVuZENoaWxkKGNyZWF0ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gY29uc3RhbnROdWxsKCkgewogICAgICByZXR1cm4gbnVsbDsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faW5zZXJ0KG5hbWUsIGJlZm9yZSkgewogICAgICB2YXIgY3JlYXRlID0gdHlwZW9mIG5hbWUgPT09ICJmdW5jdGlvbiIgPyBuYW1lIDogY3JlYXRvcihuYW1lKSwKICAgICAgICAgIHNlbGVjdCA9IGJlZm9yZSA9PSBudWxsID8gY29uc3RhbnROdWxsIDogdHlwZW9mIGJlZm9yZSA9PT0gImZ1bmN0aW9uIiA/IGJlZm9yZSA6IHNlbGVjdG9yKGJlZm9yZSk7CiAgICAgIHJldHVybiB0aGlzLnNlbGVjdChmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5pbnNlcnRCZWZvcmUoY3JlYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyksIHNlbGVjdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpIHx8IG51bGwpOwogICAgICB9KTsKICAgIH0KCiAgICBmdW5jdGlvbiByZW1vdmUkMSgpIHsKICAgICAgdmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTsKICAgICAgaWYgKHBhcmVudCkgcGFyZW50LnJlbW92ZUNoaWxkKHRoaXMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9yZW1vdmUoKSB7CiAgICAgIHJldHVybiB0aGlzLmVhY2gocmVtb3ZlJDEpOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9jbG9uZVNoYWxsb3coKSB7CiAgICAgIHZhciBjbG9uZSA9IHRoaXMuY2xvbmVOb2RlKGZhbHNlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmVEZWVwKCkgewogICAgICB2YXIgY2xvbmUgPSB0aGlzLmNsb25lTm9kZSh0cnVlKSwgcGFyZW50ID0gdGhpcy5wYXJlbnROb2RlOwogICAgICByZXR1cm4gcGFyZW50ID8gcGFyZW50Lmluc2VydEJlZm9yZShjbG9uZSwgdGhpcy5uZXh0U2libGluZykgOiBjbG9uZTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fY2xvbmUoZGVlcCkgewogICAgICByZXR1cm4gdGhpcy5zZWxlY3QoZGVlcCA/IHNlbGVjdGlvbl9jbG9uZURlZXAgOiBzZWxlY3Rpb25fY2xvbmVTaGFsbG93KTsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25fZGF0dW0odmFsdWUpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5wcm9wZXJ0eSgiX19kYXRhX18iLCB2YWx1ZSkKICAgICAgICAgIDogdGhpcy5ub2RlKCkuX19kYXRhX187CiAgICB9CgogICAgdmFyIGZpbHRlckV2ZW50cyA9IHt9OwoKICAgIHZhciBldmVudCA9IG51bGw7CgogICAgaWYgKHR5cGVvZiBkb2N1bWVudCAhPT0gInVuZGVmaW5lZCIpIHsKICAgICAgdmFyIGVsZW1lbnQgPSBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7CiAgICAgIGlmICghKCJvbm1vdXNlZW50ZXIiIGluIGVsZW1lbnQpKSB7CiAgICAgICAgZmlsdGVyRXZlbnRzID0ge21vdXNlZW50ZXI6ICJtb3VzZW92ZXIiLCBtb3VzZWxlYXZlOiAibW91c2VvdXQifTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGZpbHRlckNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgICAgIGxpc3RlbmVyID0gY29udGV4dExpc3RlbmVyKGxpc3RlbmVyLCBpbmRleCwgZ3JvdXApOwogICAgICByZXR1cm4gZnVuY3Rpb24oZXZlbnQpIHsKICAgICAgICB2YXIgcmVsYXRlZCA9IGV2ZW50LnJlbGF0ZWRUYXJnZXQ7CiAgICAgICAgaWYgKCFyZWxhdGVkIHx8IChyZWxhdGVkICE9PSB0aGlzICYmICEocmVsYXRlZC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbih0aGlzKSAmIDgpKSkgewogICAgICAgICAgbGlzdGVuZXIuY2FsbCh0aGlzLCBldmVudCk7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnRleHRMaXN0ZW5lcihsaXN0ZW5lciwgaW5kZXgsIGdyb3VwKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihldmVudDEpIHsKICAgICAgICB2YXIgZXZlbnQwID0gZXZlbnQ7IC8vIEV2ZW50cyBjYW4gYmUgcmVlbnRyYW50IChlLmcuLCBmb2N1cykuCiAgICAgICAgZXZlbnQgPSBldmVudDE7CiAgICAgICAgdHJ5IHsKICAgICAgICAgIGxpc3RlbmVyLmNhbGwodGhpcywgdGhpcy5fX2RhdGFfXywgaW5kZXgsIGdyb3VwKTsKICAgICAgICB9IGZpbmFsbHkgewogICAgICAgICAgZXZlbnQgPSBldmVudDA7CiAgICAgICAgfQogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWVzKSB7CiAgICAgIHJldHVybiB0eXBlbmFtZXMudHJpbSgpLnNwbGl0KC9efFxzKy8pLm1hcChmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIG5hbWUgPSAiIiwgaSA9IHQuaW5kZXhPZigiLiIpOwogICAgICAgIGlmIChpID49IDApIG5hbWUgPSB0LnNsaWNlKGkgKyAxKSwgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgcmV0dXJuIHt0eXBlOiB0LCBuYW1lOiBuYW1lfTsKICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gb25SZW1vdmUodHlwZW5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBvbiA9IHRoaXMuX19vbjsKICAgICAgICBpZiAoIW9uKSByZXR1cm47CiAgICAgICAgZm9yICh2YXIgaiA9IDAsIGkgPSAtMSwgbSA9IG9uLmxlbmd0aCwgbzsgaiA8IG07ICsraikgewogICAgICAgICAgaWYgKG8gPSBvbltqXSwgKCF0eXBlbmFtZS50eXBlIHx8IG8udHlwZSA9PT0gdHlwZW5hbWUudHlwZSkgJiYgby5uYW1lID09PSB0eXBlbmFtZS5uYW1lKSB7CiAgICAgICAgICAgIHRoaXMucmVtb3ZlRXZlbnRMaXN0ZW5lcihvLnR5cGUsIG8ubGlzdGVuZXIsIG8uY2FwdHVyZSk7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBvblsrK2ldID0gbzsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgaWYgKCsraSkgb24ubGVuZ3RoID0gaTsKICAgICAgICBlbHNlIGRlbGV0ZSB0aGlzLl9fb247CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb25BZGQodHlwZW5hbWUsIHZhbHVlLCBjYXB0dXJlKSB7CiAgICAgIHZhciB3cmFwID0gZmlsdGVyRXZlbnRzLmhhc093blByb3BlcnR5KHR5cGVuYW1lLnR5cGUpID8gZmlsdGVyQ29udGV4dExpc3RlbmVyIDogY29udGV4dExpc3RlbmVyOwogICAgICByZXR1cm4gZnVuY3Rpb24oZCwgaSwgZ3JvdXApIHsKICAgICAgICB2YXIgb24gPSB0aGlzLl9fb24sIG8sIGxpc3RlbmVyID0gd3JhcCh2YWx1ZSwgaSwgZ3JvdXApOwogICAgICAgIGlmIChvbikgZm9yICh2YXIgaiA9IDAsIG0gPSBvbi5sZW5ndGg7IGogPCBtOyArK2opIHsKICAgICAgICAgIGlmICgobyA9IG9uW2pdKS50eXBlID09PSB0eXBlbmFtZS50eXBlICYmIG8ubmFtZSA9PT0gdHlwZW5hbWUubmFtZSkgewogICAgICAgICAgICB0aGlzLnJlbW92ZUV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyLCBvLmNhcHR1cmUpOwogICAgICAgICAgICB0aGlzLmFkZEV2ZW50TGlzdGVuZXIoby50eXBlLCBvLmxpc3RlbmVyID0gbGlzdGVuZXIsIG8uY2FwdHVyZSA9IGNhcHR1cmUpOwogICAgICAgICAgICBvLnZhbHVlID0gdmFsdWU7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgdGhpcy5hZGRFdmVudExpc3RlbmVyKHR5cGVuYW1lLnR5cGUsIGxpc3RlbmVyLCBjYXB0dXJlKTsKICAgICAgICBvID0ge3R5cGU6IHR5cGVuYW1lLnR5cGUsIG5hbWU6IHR5cGVuYW1lLm5hbWUsIHZhbHVlOiB2YWx1ZSwgbGlzdGVuZXI6IGxpc3RlbmVyLCBjYXB0dXJlOiBjYXB0dXJlfTsKICAgICAgICBpZiAoIW9uKSB0aGlzLl9fb24gPSBbb107CiAgICAgICAgZWxzZSBvbi5wdXNoKG8pOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbl9vbih0eXBlbmFtZSwgdmFsdWUsIGNhcHR1cmUpIHsKICAgICAgdmFyIHR5cGVuYW1lcyA9IHBhcnNlVHlwZW5hbWVzJDEodHlwZW5hbWUgKyAiIiksIGksIG4gPSB0eXBlbmFtZXMubGVuZ3RoLCB0OwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIG9uID0gdGhpcy5ub2RlKCkuX19vbjsKICAgICAgICBpZiAob24pIGZvciAodmFyIGogPSAwLCBtID0gb24ubGVuZ3RoLCBvOyBqIDwgbTsgKytqKSB7CiAgICAgICAgICBmb3IgKGkgPSAwLCBvID0gb25bal07IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgaWYgKCh0ID0gdHlwZW5hbWVzW2ldKS50eXBlID09PSBvLnR5cGUgJiYgdC5uYW1lID09PSBvLm5hbWUpIHsKICAgICAgICAgICAgICByZXR1cm4gby52YWx1ZTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KICAgICAgICByZXR1cm47CiAgICAgIH0KCiAgICAgIG9uID0gdmFsdWUgPyBvbkFkZCA6IG9uUmVtb3ZlOwogICAgICBpZiAoY2FwdHVyZSA9PSBudWxsKSBjYXB0dXJlID0gZmFsc2U7CiAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHRoaXMuZWFjaChvbih0eXBlbmFtZXNbaV0sIHZhbHVlLCBjYXB0dXJlKSk7CiAgICAgIHJldHVybiB0aGlzOwogICAgfQoKICAgIGZ1bmN0aW9uIGN1c3RvbUV2ZW50KGV2ZW50MSwgbGlzdGVuZXIsIHRoYXQsIGFyZ3MpIHsKICAgICAgdmFyIGV2ZW50MCA9IGV2ZW50OwogICAgICBldmVudDEuc291cmNlRXZlbnQgPSBldmVudDsKICAgICAgZXZlbnQgPSBldmVudDE7CiAgICAgIHRyeSB7CiAgICAgICAgcmV0dXJuIGxpc3RlbmVyLmFwcGx5KHRoYXQsIGFyZ3MpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGV2ZW50ID0gZXZlbnQwOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gZGlzcGF0Y2hFdmVudChub2RlLCB0eXBlLCBwYXJhbXMpIHsKICAgICAgdmFyIHdpbmRvdyA9IGRlZmF1bHRWaWV3KG5vZGUpLAogICAgICAgICAgZXZlbnQgPSB3aW5kb3cuQ3VzdG9tRXZlbnQ7CgogICAgICBpZiAodHlwZW9mIGV2ZW50ID09PSAiZnVuY3Rpb24iKSB7CiAgICAgICAgZXZlbnQgPSBuZXcgZXZlbnQodHlwZSwgcGFyYW1zKTsKICAgICAgfSBlbHNlIHsKICAgICAgICBldmVudCA9IHdpbmRvdy5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKTsKICAgICAgICBpZiAocGFyYW1zKSBldmVudC5pbml0RXZlbnQodHlwZSwgcGFyYW1zLmJ1YmJsZXMsIHBhcmFtcy5jYW5jZWxhYmxlKSwgZXZlbnQuZGV0YWlsID0gcGFyYW1zLmRldGFpbDsKICAgICAgICBlbHNlIGV2ZW50LmluaXRFdmVudCh0eXBlLCBmYWxzZSwgZmFsc2UpOwogICAgICB9CgogICAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZlbnQpOwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoQ29uc3RhbnQodHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRpc3BhdGNoRnVuY3Rpb24odHlwZSwgcGFyYW1zKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gZGlzcGF0Y2hFdmVudCh0aGlzLCB0eXBlLCBwYXJhbXMuYXBwbHkodGhpcywgYXJndW1lbnRzKSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX2Rpc3BhdGNoKHR5cGUsIHBhcmFtcykgewogICAgICByZXR1cm4gdGhpcy5lYWNoKCh0eXBlb2YgcGFyYW1zID09PSAiZnVuY3Rpb24iCiAgICAgICAgICA/IGRpc3BhdGNoRnVuY3Rpb24KICAgICAgICAgIDogZGlzcGF0Y2hDb25zdGFudCkodHlwZSwgcGFyYW1zKSk7CiAgICB9CgogICAgdmFyIHJvb3QgPSBbbnVsbF07CgogICAgZnVuY3Rpb24gU2VsZWN0aW9uKGdyb3VwcywgcGFyZW50cykgewogICAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICAgIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOwogICAgfQoKICAgIGZ1bmN0aW9uIHNlbGVjdGlvbigpIHsKICAgICAgcmV0dXJuIG5ldyBTZWxlY3Rpb24oW1tkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdXSwgcm9vdCk7CiAgICB9CgogICAgU2VsZWN0aW9uLnByb3RvdHlwZSA9IHNlbGVjdGlvbi5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBTZWxlY3Rpb24sCiAgICAgIHNlbGVjdDogc2VsZWN0aW9uX3NlbGVjdCwKICAgICAgc2VsZWN0QWxsOiBzZWxlY3Rpb25fc2VsZWN0QWxsLAogICAgICBmaWx0ZXI6IHNlbGVjdGlvbl9maWx0ZXIsCiAgICAgIGRhdGE6IHNlbGVjdGlvbl9kYXRhLAogICAgICBlbnRlcjogc2VsZWN0aW9uX2VudGVyLAogICAgICBleGl0OiBzZWxlY3Rpb25fZXhpdCwKICAgICAgam9pbjogc2VsZWN0aW9uX2pvaW4sCiAgICAgIG1lcmdlOiBzZWxlY3Rpb25fbWVyZ2UsCiAgICAgIG9yZGVyOiBzZWxlY3Rpb25fb3JkZXIsCiAgICAgIHNvcnQ6IHNlbGVjdGlvbl9zb3J0LAogICAgICBjYWxsOiBzZWxlY3Rpb25fY2FsbCwKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9ub2RlcywKICAgICAgbm9kZTogc2VsZWN0aW9uX25vZGUsCiAgICAgIHNpemU6IHNlbGVjdGlvbl9zaXplLAogICAgICBlbXB0eTogc2VsZWN0aW9uX2VtcHR5LAogICAgICBlYWNoOiBzZWxlY3Rpb25fZWFjaCwKICAgICAgYXR0cjogc2VsZWN0aW9uX2F0dHIsCiAgICAgIHN0eWxlOiBzZWxlY3Rpb25fc3R5bGUsCiAgICAgIHByb3BlcnR5OiBzZWxlY3Rpb25fcHJvcGVydHksCiAgICAgIGNsYXNzZWQ6IHNlbGVjdGlvbl9jbGFzc2VkLAogICAgICB0ZXh0OiBzZWxlY3Rpb25fdGV4dCwKICAgICAgaHRtbDogc2VsZWN0aW9uX2h0bWwsCiAgICAgIHJhaXNlOiBzZWxlY3Rpb25fcmFpc2UsCiAgICAgIGxvd2VyOiBzZWxlY3Rpb25fbG93ZXIsCiAgICAgIGFwcGVuZDogc2VsZWN0aW9uX2FwcGVuZCwKICAgICAgaW5zZXJ0OiBzZWxlY3Rpb25faW5zZXJ0LAogICAgICByZW1vdmU6IHNlbGVjdGlvbl9yZW1vdmUsCiAgICAgIGNsb25lOiBzZWxlY3Rpb25fY2xvbmUsCiAgICAgIGRhdHVtOiBzZWxlY3Rpb25fZGF0dW0sCiAgICAgIG9uOiBzZWxlY3Rpb25fb24sCiAgICAgIGRpc3BhdGNoOiBzZWxlY3Rpb25fZGlzcGF0Y2gKICAgIH07CgogICAgZnVuY3Rpb24gc2VsZWN0JDEoc2VsZWN0b3IpIHsKICAgICAgcmV0dXJuIHR5cGVvZiBzZWxlY3RvciA9PT0gInN0cmluZyIKICAgICAgICAgID8gbmV3IFNlbGVjdGlvbihbW2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpXV0sIFtkb2N1bWVudC5kb2N1bWVudEVsZW1lbnRdKQogICAgICAgICAgOiBuZXcgU2VsZWN0aW9uKFtbc2VsZWN0b3JdXSwgcm9vdCk7CiAgICB9CgogICAgZnVuY3Rpb24gc291cmNlRXZlbnQoKSB7CiAgICAgIHZhciBjdXJyZW50ID0gZXZlbnQsIHNvdXJjZTsKICAgICAgd2hpbGUgKHNvdXJjZSA9IGN1cnJlbnQuc291cmNlRXZlbnQpIGN1cnJlbnQgPSBzb3VyY2U7CiAgICAgIHJldHVybiBjdXJyZW50OwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50KG5vZGUsIGV2ZW50KSB7CiAgICAgIHZhciBzdmcgPSBub2RlLm93bmVyU1ZHRWxlbWVudCB8fCBub2RlOwoKICAgICAgaWYgKHN2Zy5jcmVhdGVTVkdQb2ludCkgewogICAgICAgIHZhciBwb2ludCA9IHN2Zy5jcmVhdGVTVkdQb2ludCgpOwogICAgICAgIHBvaW50LnggPSBldmVudC5jbGllbnRYLCBwb2ludC55ID0gZXZlbnQuY2xpZW50WTsKICAgICAgICBwb2ludCA9IHBvaW50Lm1hdHJpeFRyYW5zZm9ybShub2RlLmdldFNjcmVlbkNUTSgpLmludmVyc2UoKSk7CiAgICAgICAgcmV0dXJuIFtwb2ludC54LCBwb2ludC55XTsKICAgICAgfQoKICAgICAgdmFyIHJlY3QgPSBub2RlLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOwogICAgICByZXR1cm4gW2V2ZW50LmNsaWVudFggLSByZWN0LmxlZnQgLSBub2RlLmNsaWVudExlZnQsIGV2ZW50LmNsaWVudFkgLSByZWN0LnRvcCAtIG5vZGUuY2xpZW50VG9wXTsKICAgIH0KCiAgICBmdW5jdGlvbiBtb3VzZShub2RlKSB7CiAgICAgIHZhciBldmVudCA9IHNvdXJjZUV2ZW50KCk7CiAgICAgIGlmIChldmVudC5jaGFuZ2VkVG91Y2hlcykgZXZlbnQgPSBldmVudC5jaGFuZ2VkVG91Y2hlc1swXTsKICAgICAgcmV0dXJuIHBvaW50KG5vZGUsIGV2ZW50KTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b3VjaChub2RlLCB0b3VjaGVzLCBpZGVudGlmaWVyKSB7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMykgaWRlbnRpZmllciA9IHRvdWNoZXMsIHRvdWNoZXMgPSBzb3VyY2VFdmVudCgpLmNoYW5nZWRUb3VjaGVzOwoKICAgICAgZm9yICh2YXIgaSA9IDAsIG4gPSB0b3VjaGVzID8gdG91Y2hlcy5sZW5ndGggOiAwLCB0b3VjaDsgaSA8IG47ICsraSkgewogICAgICAgIGlmICgodG91Y2ggPSB0b3VjaGVzW2ldKS5pZGVudGlmaWVyID09PSBpZGVudGlmaWVyKSB7CiAgICAgICAgICByZXR1cm4gcG9pbnQobm9kZSwgdG91Y2gpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gbm9ldmVudCgpIHsKICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTsKICAgICAgZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7CiAgICB9CgogICAgZnVuY3Rpb24gZHJhZ0Rpc2FibGUodmlldykgewogICAgICB2YXIgcm9vdCA9IHZpZXcuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LAogICAgICAgICAgc2VsZWN0aW9uID0gc2VsZWN0JDEodmlldykub24oImRyYWdzdGFydC5kcmFnIiwgbm9ldmVudCwgdHJ1ZSk7CiAgICAgIGlmICgib25zZWxlY3RzdGFydCIgaW4gcm9vdCkgewogICAgICAgIHNlbGVjdGlvbi5vbigic2VsZWN0c3RhcnQuZHJhZyIsIG5vZXZlbnQsIHRydWUpOwogICAgICB9IGVsc2UgewogICAgICAgIHJvb3QuX19ub3NlbGVjdCA9IHJvb3Quc3R5bGUuTW96VXNlclNlbGVjdDsKICAgICAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSAibm9uZSI7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiB5ZXNkcmFnKHZpZXcsIG5vY2xpY2spIHsKICAgICAgdmFyIHJvb3QgPSB2aWV3LmRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwKICAgICAgICAgIHNlbGVjdGlvbiA9IHNlbGVjdCQxKHZpZXcpLm9uKCJkcmFnc3RhcnQuZHJhZyIsIG51bGwpOwogICAgICBpZiAobm9jbGljaykgewogICAgICAgIHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG5vZXZlbnQsIHRydWUpOwogICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHNlbGVjdGlvbi5vbigiY2xpY2suZHJhZyIsIG51bGwpOyB9LCAwKTsKICAgICAgfQogICAgICBpZiAoIm9uc2VsZWN0c3RhcnQiIGluIHJvb3QpIHsKICAgICAgICBzZWxlY3Rpb24ub24oInNlbGVjdHN0YXJ0LmRyYWciLCBudWxsKTsKICAgICAgfSBlbHNlIHsKICAgICAgICByb290LnN0eWxlLk1velVzZXJTZWxlY3QgPSByb290Ll9fbm9zZWxlY3Q7CiAgICAgICAgZGVsZXRlIHJvb3QuX19ub3NlbGVjdDsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmluZShjb25zdHJ1Y3RvciwgZmFjdG9yeSwgcHJvdG90eXBlKSB7CiAgICAgIGNvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGZhY3RvcnkucHJvdG90eXBlID0gcHJvdG90eXBlOwogICAgICBwcm90b3R5cGUuY29uc3RydWN0b3IgPSBjb25zdHJ1Y3RvcjsKICAgIH0KCiAgICBmdW5jdGlvbiBleHRlbmQocGFyZW50LCBkZWZpbml0aW9uKSB7CiAgICAgIHZhciBwcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHBhcmVudC5wcm90b3R5cGUpOwogICAgICBmb3IgKHZhciBrZXkgaW4gZGVmaW5pdGlvbikgcHJvdG90eXBlW2tleV0gPSBkZWZpbml0aW9uW2tleV07CiAgICAgIHJldHVybiBwcm90b3R5cGU7CiAgICB9CgogICAgZnVuY3Rpb24gQ29sb3IoKSB7fQoKICAgIHZhciBkYXJrZXIgPSAwLjc7CiAgICB2YXIgYnJpZ2h0ZXIgPSAxIC8gZGFya2VyOwoKICAgIHZhciByZUkgPSAiXFxzKihbKy1dP1xcZCspXFxzKiIsCiAgICAgICAgcmVOID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pXFxzKiIsCiAgICAgICAgcmVQID0gIlxccyooWystXT9cXGQqXFwuP1xcZCsoPzpbZUVdWystXT9cXGQrKT8pJVxccyoiLAogICAgICAgIHJlSGV4ID0gL14jKFswLTlhLWZdezMsOH0pJC8sCiAgICAgICAgcmVSZ2JJbnRlZ2VyID0gbmV3IFJlZ0V4cCgiXnJnYlxcKCIgKyBbcmVJLCByZUksIHJlSV0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiUGVyY2VudCA9IG5ldyBSZWdFeHAoIl5yZ2JcXCgiICsgW3JlUCwgcmVQLCByZVBdICsgIlxcKSQiKSwKICAgICAgICByZVJnYmFJbnRlZ2VyID0gbmV3IFJlZ0V4cCgiXnJnYmFcXCgiICsgW3JlSSwgcmVJLCByZUksIHJlTl0gKyAiXFwpJCIpLAogICAgICAgIHJlUmdiYVBlcmNlbnQgPSBuZXcgUmVnRXhwKCJecmdiYVxcKCIgKyBbcmVQLCByZVAsIHJlUCwgcmVOXSArICJcXCkkIiksCiAgICAgICAgcmVIc2xQZXJjZW50ID0gbmV3IFJlZ0V4cCgiXmhzbFxcKCIgKyBbcmVOLCByZVAsIHJlUF0gKyAiXFwpJCIpLAogICAgICAgIHJlSHNsYVBlcmNlbnQgPSBuZXcgUmVnRXhwKCJeaHNsYVxcKCIgKyBbcmVOLCByZVAsIHJlUCwgcmVOXSArICJcXCkkIik7CgogICAgdmFyIG5hbWVkID0gewogICAgICBhbGljZWJsdWU6IDB4ZjBmOGZmLAogICAgICBhbnRpcXVld2hpdGU6IDB4ZmFlYmQ3LAogICAgICBhcXVhOiAweDAwZmZmZiwKICAgICAgYXF1YW1hcmluZTogMHg3ZmZmZDQsCiAgICAgIGF6dXJlOiAweGYwZmZmZiwKICAgICAgYmVpZ2U6IDB4ZjVmNWRjLAogICAgICBiaXNxdWU6IDB4ZmZlNGM0LAogICAgICBibGFjazogMHgwMDAwMDAsCiAgICAgIGJsYW5jaGVkYWxtb25kOiAweGZmZWJjZCwKICAgICAgYmx1ZTogMHgwMDAwZmYsCiAgICAgIGJsdWV2aW9sZXQ6IDB4OGEyYmUyLAogICAgICBicm93bjogMHhhNTJhMmEsCiAgICAgIGJ1cmx5d29vZDogMHhkZWI4ODcsCiAgICAgIGNhZGV0Ymx1ZTogMHg1ZjllYTAsCiAgICAgIGNoYXJ0cmV1c2U6IDB4N2ZmZjAwLAogICAgICBjaG9jb2xhdGU6IDB4ZDI2OTFlLAogICAgICBjb3JhbDogMHhmZjdmNTAsCiAgICAgIGNvcm5mbG93ZXJibHVlOiAweDY0OTVlZCwKICAgICAgY29ybnNpbGs6IDB4ZmZmOGRjLAogICAgICBjcmltc29uOiAweGRjMTQzYywKICAgICAgY3lhbjogMHgwMGZmZmYsCiAgICAgIGRhcmtibHVlOiAweDAwMDA4YiwKICAgICAgZGFya2N5YW46IDB4MDA4YjhiLAogICAgICBkYXJrZ29sZGVucm9kOiAweGI4ODYwYiwKICAgICAgZGFya2dyYXk6IDB4YTlhOWE5LAogICAgICBkYXJrZ3JlZW46IDB4MDA2NDAwLAogICAgICBkYXJrZ3JleTogMHhhOWE5YTksCiAgICAgIGRhcmtraGFraTogMHhiZGI3NmIsCiAgICAgIGRhcmttYWdlbnRhOiAweDhiMDA4YiwKICAgICAgZGFya29saXZlZ3JlZW46IDB4NTU2YjJmLAogICAgICBkYXJrb3JhbmdlOiAweGZmOGMwMCwKICAgICAgZGFya29yY2hpZDogMHg5OTMyY2MsCiAgICAgIGRhcmtyZWQ6IDB4OGIwMDAwLAogICAgICBkYXJrc2FsbW9uOiAweGU5OTY3YSwKICAgICAgZGFya3NlYWdyZWVuOiAweDhmYmM4ZiwKICAgICAgZGFya3NsYXRlYmx1ZTogMHg0ODNkOGIsCiAgICAgIGRhcmtzbGF0ZWdyYXk6IDB4MmY0ZjRmLAogICAgICBkYXJrc2xhdGVncmV5OiAweDJmNGY0ZiwKICAgICAgZGFya3R1cnF1b2lzZTogMHgwMGNlZDEsCiAgICAgIGRhcmt2aW9sZXQ6IDB4OTQwMGQzLAogICAgICBkZWVwcGluazogMHhmZjE0OTMsCiAgICAgIGRlZXBza3libHVlOiAweDAwYmZmZiwKICAgICAgZGltZ3JheTogMHg2OTY5NjksCiAgICAgIGRpbWdyZXk6IDB4Njk2OTY5LAogICAgICBkb2RnZXJibHVlOiAweDFlOTBmZiwKICAgICAgZmlyZWJyaWNrOiAweGIyMjIyMiwKICAgICAgZmxvcmFsd2hpdGU6IDB4ZmZmYWYwLAogICAgICBmb3Jlc3RncmVlbjogMHgyMjhiMjIsCiAgICAgIGZ1Y2hzaWE6IDB4ZmYwMGZmLAogICAgICBnYWluc2Jvcm86IDB4ZGNkY2RjLAogICAgICBnaG9zdHdoaXRlOiAweGY4ZjhmZiwKICAgICAgZ29sZDogMHhmZmQ3MDAsCiAgICAgIGdvbGRlbnJvZDogMHhkYWE1MjAsCiAgICAgIGdyYXk6IDB4ODA4MDgwLAogICAgICBncmVlbjogMHgwMDgwMDAsCiAgICAgIGdyZWVueWVsbG93OiAweGFkZmYyZiwKICAgICAgZ3JleTogMHg4MDgwODAsCiAgICAgIGhvbmV5ZGV3OiAweGYwZmZmMCwKICAgICAgaG90cGluazogMHhmZjY5YjQsCiAgICAgIGluZGlhbnJlZDogMHhjZDVjNWMsCiAgICAgIGluZGlnbzogMHg0YjAwODIsCiAgICAgIGl2b3J5OiAweGZmZmZmMCwKICAgICAga2hha2k6IDB4ZjBlNjhjLAogICAgICBsYXZlbmRlcjogMHhlNmU2ZmEsCiAgICAgIGxhdmVuZGVyYmx1c2g6IDB4ZmZmMGY1LAogICAgICBsYXduZ3JlZW46IDB4N2NmYzAwLAogICAgICBsZW1vbmNoaWZmb246IDB4ZmZmYWNkLAogICAgICBsaWdodGJsdWU6IDB4YWRkOGU2LAogICAgICBsaWdodGNvcmFsOiAweGYwODA4MCwKICAgICAgbGlnaHRjeWFuOiAweGUwZmZmZiwKICAgICAgbGlnaHRnb2xkZW5yb2R5ZWxsb3c6IDB4ZmFmYWQyLAogICAgICBsaWdodGdyYXk6IDB4ZDNkM2QzLAogICAgICBsaWdodGdyZWVuOiAweDkwZWU5MCwKICAgICAgbGlnaHRncmV5OiAweGQzZDNkMywKICAgICAgbGlnaHRwaW5rOiAweGZmYjZjMSwKICAgICAgbGlnaHRzYWxtb246IDB4ZmZhMDdhLAogICAgICBsaWdodHNlYWdyZWVuOiAweDIwYjJhYSwKICAgICAgbGlnaHRza3libHVlOiAweDg3Y2VmYSwKICAgICAgbGlnaHRzbGF0ZWdyYXk6IDB4Nzc4ODk5LAogICAgICBsaWdodHNsYXRlZ3JleTogMHg3Nzg4OTksCiAgICAgIGxpZ2h0c3RlZWxibHVlOiAweGIwYzRkZSwKICAgICAgbGlnaHR5ZWxsb3c6IDB4ZmZmZmUwLAogICAgICBsaW1lOiAweDAwZmYwMCwKICAgICAgbGltZWdyZWVuOiAweDMyY2QzMiwKICAgICAgbGluZW46IDB4ZmFmMGU2LAogICAgICBtYWdlbnRhOiAweGZmMDBmZiwKICAgICAgbWFyb29uOiAweDgwMDAwMCwKICAgICAgbWVkaXVtYXF1YW1hcmluZTogMHg2NmNkYWEsCiAgICAgIG1lZGl1bWJsdWU6IDB4MDAwMGNkLAogICAgICBtZWRpdW1vcmNoaWQ6IDB4YmE1NWQzLAogICAgICBtZWRpdW1wdXJwbGU6IDB4OTM3MGRiLAogICAgICBtZWRpdW1zZWFncmVlbjogMHgzY2IzNzEsCiAgICAgIG1lZGl1bXNsYXRlYmx1ZTogMHg3YjY4ZWUsCiAgICAgIG1lZGl1bXNwcmluZ2dyZWVuOiAweDAwZmE5YSwKICAgICAgbWVkaXVtdHVycXVvaXNlOiAweDQ4ZDFjYywKICAgICAgbWVkaXVtdmlvbGV0cmVkOiAweGM3MTU4NSwKICAgICAgbWlkbmlnaHRibHVlOiAweDE5MTk3MCwKICAgICAgbWludGNyZWFtOiAweGY1ZmZmYSwKICAgICAgbWlzdHlyb3NlOiAweGZmZTRlMSwKICAgICAgbW9jY2FzaW46IDB4ZmZlNGI1LAogICAgICBuYXZham93aGl0ZTogMHhmZmRlYWQsCiAgICAgIG5hdnk6IDB4MDAwMDgwLAogICAgICBvbGRsYWNlOiAweGZkZjVlNiwKICAgICAgb2xpdmU6IDB4ODA4MDAwLAogICAgICBvbGl2ZWRyYWI6IDB4NmI4ZTIzLAogICAgICBvcmFuZ2U6IDB4ZmZhNTAwLAogICAgICBvcmFuZ2VyZWQ6IDB4ZmY0NTAwLAogICAgICBvcmNoaWQ6IDB4ZGE3MGQ2LAogICAgICBwYWxlZ29sZGVucm9kOiAweGVlZThhYSwKICAgICAgcGFsZWdyZWVuOiAweDk4ZmI5OCwKICAgICAgcGFsZXR1cnF1b2lzZTogMHhhZmVlZWUsCiAgICAgIHBhbGV2aW9sZXRyZWQ6IDB4ZGI3MDkzLAogICAgICBwYXBheWF3aGlwOiAweGZmZWZkNSwKICAgICAgcGVhY2hwdWZmOiAweGZmZGFiOSwKICAgICAgcGVydTogMHhjZDg1M2YsCiAgICAgIHBpbms6IDB4ZmZjMGNiLAogICAgICBwbHVtOiAweGRkYTBkZCwKICAgICAgcG93ZGVyYmx1ZTogMHhiMGUwZTYsCiAgICAgIHB1cnBsZTogMHg4MDAwODAsCiAgICAgIHJlYmVjY2FwdXJwbGU6IDB4NjYzMzk5LAogICAgICByZWQ6IDB4ZmYwMDAwLAogICAgICByb3N5YnJvd246IDB4YmM4ZjhmLAogICAgICByb3lhbGJsdWU6IDB4NDE2OWUxLAogICAgICBzYWRkbGVicm93bjogMHg4YjQ1MTMsCiAgICAgIHNhbG1vbjogMHhmYTgwNzIsCiAgICAgIHNhbmR5YnJvd246IDB4ZjRhNDYwLAogICAgICBzZWFncmVlbjogMHgyZThiNTcsCiAgICAgIHNlYXNoZWxsOiAweGZmZjVlZSwKICAgICAgc2llbm5hOiAweGEwNTIyZCwKICAgICAgc2lsdmVyOiAweGMwYzBjMCwKICAgICAgc2t5Ymx1ZTogMHg4N2NlZWIsCiAgICAgIHNsYXRlYmx1ZTogMHg2YTVhY2QsCiAgICAgIHNsYXRlZ3JheTogMHg3MDgwOTAsCiAgICAgIHNsYXRlZ3JleTogMHg3MDgwOTAsCiAgICAgIHNub3c6IDB4ZmZmYWZhLAogICAgICBzcHJpbmdncmVlbjogMHgwMGZmN2YsCiAgICAgIHN0ZWVsYmx1ZTogMHg0NjgyYjQsCiAgICAgIHRhbjogMHhkMmI0OGMsCiAgICAgIHRlYWw6IDB4MDA4MDgwLAogICAgICB0aGlzdGxlOiAweGQ4YmZkOCwKICAgICAgdG9tYXRvOiAweGZmNjM0NywKICAgICAgdHVycXVvaXNlOiAweDQwZTBkMCwKICAgICAgdmlvbGV0OiAweGVlODJlZSwKICAgICAgd2hlYXQ6IDB4ZjVkZWIzLAogICAgICB3aGl0ZTogMHhmZmZmZmYsCiAgICAgIHdoaXRlc21va2U6IDB4ZjVmNWY1LAogICAgICB5ZWxsb3c6IDB4ZmZmZjAwLAogICAgICB5ZWxsb3dncmVlbjogMHg5YWNkMzIKICAgIH07CgogICAgZGVmaW5lKENvbG9yLCBjb2xvciwgewogICAgICBjb3B5OiBmdW5jdGlvbihjaGFubmVscykgewogICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyB0aGlzLmNvbnN0cnVjdG9yLCB0aGlzLCBjaGFubmVscyk7CiAgICAgIH0sCiAgICAgIGRpc3BsYXlhYmxlOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpcy5yZ2IoKS5kaXNwbGF5YWJsZSgpOwogICAgICB9LAogICAgICBoZXg6IGNvbG9yX2Zvcm1hdEhleCwgLy8gRGVwcmVjYXRlZCEgVXNlIGNvbG9yLmZvcm1hdEhleC4KICAgICAgZm9ybWF0SGV4OiBjb2xvcl9mb3JtYXRIZXgsCiAgICAgIGZvcm1hdEhzbDogY29sb3JfZm9ybWF0SHNsLAogICAgICBmb3JtYXRSZ2I6IGNvbG9yX2Zvcm1hdFJnYiwKICAgICAgdG9TdHJpbmc6IGNvbG9yX2Zvcm1hdFJnYgogICAgfSk7CgogICAgZnVuY3Rpb24gY29sb3JfZm9ybWF0SGV4KCkgewogICAgICByZXR1cm4gdGhpcy5yZ2IoKS5mb3JtYXRIZXgoKTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb2xvcl9mb3JtYXRIc2woKSB7CiAgICAgIHJldHVybiBoc2xDb252ZXJ0KHRoaXMpLmZvcm1hdEhzbCgpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9yX2Zvcm1hdFJnYigpIHsKICAgICAgcmV0dXJuIHRoaXMucmdiKCkuZm9ybWF0UmdiKCk7CiAgICB9CgogICAgZnVuY3Rpb24gY29sb3IoZm9ybWF0KSB7CiAgICAgIHZhciBtLCBsOwogICAgICBmb3JtYXQgPSAoZm9ybWF0ICsgIiIpLnRyaW0oKS50b0xvd2VyQ2FzZSgpOwogICAgICByZXR1cm4gKG0gPSByZUhleC5leGVjKGZvcm1hdCkpID8gKGwgPSBtWzFdLmxlbmd0aCwgbSA9IHBhcnNlSW50KG1bMV0sIDE2KSwgbCA9PT0gNiA/IHJnYm4obSkgLy8gI2ZmMDAwMAogICAgICAgICAgOiBsID09PSAzID8gbmV3IFJnYigobSA+PiA4ICYgMHhmKSB8IChtID4+IDQgJiAweGYwKSwgKG0gPj4gNCAmIDB4ZikgfCAobSAmIDB4ZjApLCAoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpLCAxKSAvLyAjZjAwCiAgICAgICAgICA6IGwgPT09IDggPyByZ2JhKG0gPj4gMjQgJiAweGZmLCBtID4+IDE2ICYgMHhmZiwgbSA+PiA4ICYgMHhmZiwgKG0gJiAweGZmKSAvIDB4ZmYpIC8vICNmZjAwMDAwMAogICAgICAgICAgOiBsID09PSA0ID8gcmdiYSgobSA+PiAxMiAmIDB4ZikgfCAobSA+PiA4ICYgMHhmMCksIChtID4+IDggJiAweGYpIHwgKG0gPj4gNCAmIDB4ZjApLCAobSA+PiA0ICYgMHhmKSB8IChtICYgMHhmMCksICgoKG0gJiAweGYpIDw8IDQpIHwgKG0gJiAweGYpKSAvIDB4ZmYpIC8vICNmMDAwCiAgICAgICAgICA6IG51bGwpIC8vIGludmFsaWQgaGV4CiAgICAgICAgICA6IChtID0gcmVSZ2JJbnRlZ2VyLmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0sIG1bMl0sIG1bM10sIDEpIC8vIHJnYigyNTUsIDAsIDApCiAgICAgICAgICA6IChtID0gcmVSZ2JQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBuZXcgUmdiKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIDEpIC8vIHJnYigxMDAlLCAwJSwgMCUpCiAgICAgICAgICA6IChtID0gcmVSZ2JhSW50ZWdlci5leGVjKGZvcm1hdCkpID8gcmdiYShtWzFdLCBtWzJdLCBtWzNdLCBtWzRdKSAvLyByZ2JhKDI1NSwgMCwgMCwgMSkKICAgICAgICAgIDogKG0gPSByZVJnYmFQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyByZ2JhKG1bMV0gKiAyNTUgLyAxMDAsIG1bMl0gKiAyNTUgLyAxMDAsIG1bM10gKiAyNTUgLyAxMDAsIG1bNF0pIC8vIHJnYigxMDAlLCAwJSwgMCUsIDEpCiAgICAgICAgICA6IChtID0gcmVIc2xQZXJjZW50LmV4ZWMoZm9ybWF0KSkgPyBoc2xhKG1bMV0sIG1bMl0gLyAxMDAsIG1bM10gLyAxMDAsIDEpIC8vIGhzbCgxMjAsIDUwJSwgNTAlKQogICAgICAgICAgOiAobSA9IHJlSHNsYVBlcmNlbnQuZXhlYyhmb3JtYXQpKSA/IGhzbGEobVsxXSwgbVsyXSAvIDEwMCwgbVszXSAvIDEwMCwgbVs0XSkgLy8gaHNsYSgxMjAsIDUwJSwgNTAlLCAxKQogICAgICAgICAgOiBuYW1lZC5oYXNPd25Qcm9wZXJ0eShmb3JtYXQpID8gcmdibihuYW1lZFtmb3JtYXRdKSAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXByb3RvdHlwZS1idWlsdGlucwogICAgICAgICAgOiBmb3JtYXQgPT09ICJ0cmFuc3BhcmVudCIgPyBuZXcgUmdiKE5hTiwgTmFOLCBOYU4sIDApCiAgICAgICAgICA6IG51bGw7CiAgICB9CgogICAgZnVuY3Rpb24gcmdibihuKSB7CiAgICAgIHJldHVybiBuZXcgUmdiKG4gPj4gMTYgJiAweGZmLCBuID4+IDggJiAweGZmLCBuICYgMHhmZiwgMSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiYShyLCBnLCBiLCBhKSB7CiAgICAgIGlmIChhIDw9IDApIHIgPSBnID0gYiA9IE5hTjsKICAgICAgcmV0dXJuIG5ldyBSZ2IociwgZywgYiwgYSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiQ29udmVydChvKSB7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IFJnYjsKICAgICAgbyA9IG8ucmdiKCk7CiAgICAgIHJldHVybiBuZXcgUmdiKG8uciwgby5nLCBvLmIsIG8ub3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPT09IDEgPyByZ2JDb252ZXJ0KHIpIDogbmV3IFJnYihyLCBnLCBiLCBvcGFjaXR5ID09IG51bGwgPyAxIDogb3BhY2l0eSk7CiAgICB9CgogICAgZnVuY3Rpb24gUmdiKHIsIGcsIGIsIG9wYWNpdHkpIHsKICAgICAgdGhpcy5yID0gK3I7CiAgICAgIHRoaXMuZyA9ICtnOwogICAgICB0aGlzLmIgPSArYjsKICAgICAgdGhpcy5vcGFjaXR5ID0gK29wYWNpdHk7CiAgICB9CgogICAgZGVmaW5lKFJnYiwgcmdiLCBleHRlbmQoQ29sb3IsIHsKICAgICAgYnJpZ2h0ZXI6IGZ1bmN0aW9uKGspIHsKICAgICAgICBrID0gayA9PSBudWxsID8gYnJpZ2h0ZXIgOiBNYXRoLnBvdyhicmlnaHRlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBSZ2IodGhpcy5yICogaywgdGhpcy5nICogaywgdGhpcy5iICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgcmdiOiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgZGlzcGxheWFibGU6IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiAoLTAuNSA8PSB0aGlzLnIgJiYgdGhpcy5yIDwgMjU1LjUpCiAgICAgICAgICAgICYmICgtMC41IDw9IHRoaXMuZyAmJiB0aGlzLmcgPCAyNTUuNSkKICAgICAgICAgICAgJiYgKC0wLjUgPD0gdGhpcy5iICYmIHRoaXMuYiA8IDI1NS41KQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLm9wYWNpdHkgJiYgdGhpcy5vcGFjaXR5IDw9IDEpOwogICAgICB9LAogICAgICBoZXg6IHJnYl9mb3JtYXRIZXgsIC8vIERlcHJlY2F0ZWQhIFVzZSBjb2xvci5mb3JtYXRIZXguCiAgICAgIGZvcm1hdEhleDogcmdiX2Zvcm1hdEhleCwKICAgICAgZm9ybWF0UmdiOiByZ2JfZm9ybWF0UmdiLAogICAgICB0b1N0cmluZzogcmdiX2Zvcm1hdFJnYgogICAgfSkpOwoKICAgIGZ1bmN0aW9uIHJnYl9mb3JtYXRIZXgoKSB7CiAgICAgIHJldHVybiAiIyIgKyBoZXgodGhpcy5yKSArIGhleCh0aGlzLmcpICsgaGV4KHRoaXMuYik7CiAgICB9CgogICAgZnVuY3Rpb24gcmdiX2Zvcm1hdFJnYigpIHsKICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgIHJldHVybiAoYSA9PT0gMSA/ICJyZ2IoIiA6ICJyZ2JhKCIpCiAgICAgICAgICArIE1hdGgubWF4KDAsIE1hdGgubWluKDI1NSwgTWF0aC5yb3VuZCh0aGlzLnIpIHx8IDApKSArICIsICIKICAgICAgICAgICsgTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHRoaXMuZykgfHwgMCkpICsgIiwgIgogICAgICAgICAgKyBNYXRoLm1heCgwLCBNYXRoLm1pbigyNTUsIE1hdGgucm91bmQodGhpcy5iKSB8fCAwKSkKICAgICAgICAgICsgKGEgPT09IDEgPyAiKSIgOiAiLCAiICsgYSArICIpIik7CiAgICB9CgogICAgZnVuY3Rpb24gaGV4KHZhbHVlKSB7CiAgICAgIHZhbHVlID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMjU1LCBNYXRoLnJvdW5kKHZhbHVlKSB8fCAwKSk7CiAgICAgIHJldHVybiAodmFsdWUgPCAxNiA/ICIwIiA6ICIiKSArIHZhbHVlLnRvU3RyaW5nKDE2KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xhKGgsIHMsIGwsIGEpIHsKICAgICAgaWYgKGEgPD0gMCkgaCA9IHMgPSBsID0gTmFOOwogICAgICBlbHNlIGlmIChsIDw9IDAgfHwgbCA+PSAxKSBoID0gcyA9IE5hTjsKICAgICAgZWxzZSBpZiAocyA8PSAwKSBoID0gTmFOOwogICAgICByZXR1cm4gbmV3IEhzbChoLCBzLCBsLCBhKTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2xDb252ZXJ0KG8pIHsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBuZXcgSHNsKG8uaCwgby5zLCBvLmwsIG8ub3BhY2l0eSk7CiAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBDb2xvcikpIG8gPSBjb2xvcihvKTsKICAgICAgaWYgKCFvKSByZXR1cm4gbmV3IEhzbDsKICAgICAgaWYgKG8gaW5zdGFuY2VvZiBIc2wpIHJldHVybiBvOwogICAgICBvID0gby5yZ2IoKTsKICAgICAgdmFyIHIgPSBvLnIgLyAyNTUsCiAgICAgICAgICBnID0gby5nIC8gMjU1LAogICAgICAgICAgYiA9IG8uYiAvIDI1NSwKICAgICAgICAgIG1pbiA9IE1hdGgubWluKHIsIGcsIGIpLAogICAgICAgICAgbWF4ID0gTWF0aC5tYXgociwgZywgYiksCiAgICAgICAgICBoID0gTmFOLAogICAgICAgICAgcyA9IG1heCAtIG1pbiwKICAgICAgICAgIGwgPSAobWF4ICsgbWluKSAvIDI7CiAgICAgIGlmIChzKSB7CiAgICAgICAgaWYgKHIgPT09IG1heCkgaCA9IChnIC0gYikgLyBzICsgKGcgPCBiKSAqIDY7CiAgICAgICAgZWxzZSBpZiAoZyA9PT0gbWF4KSBoID0gKGIgLSByKSAvIHMgKyAyOwogICAgICAgIGVsc2UgaCA9IChyIC0gZykgLyBzICsgNDsKICAgICAgICBzIC89IGwgPCAwLjUgPyBtYXggKyBtaW4gOiAyIC0gbWF4IC0gbWluOwogICAgICAgIGggKj0gNjA7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgcyA9IGwgPiAwICYmIGwgPCAxID8gMCA6IGg7CiAgICAgIH0KICAgICAgcmV0dXJuIG5ldyBIc2woaCwgcywgbCwgby5vcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBoc2woaCwgcywgbCwgb3BhY2l0eSkgewogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/IGhzbENvbnZlcnQoaCkgOiBuZXcgSHNsKGgsIHMsIGwsIG9wYWNpdHkgPT0gbnVsbCA/IDEgOiBvcGFjaXR5KTsKICAgIH0KCiAgICBmdW5jdGlvbiBIc2woaCwgcywgbCwgb3BhY2l0eSkgewogICAgICB0aGlzLmggPSAraDsKICAgICAgdGhpcy5zID0gK3M7CiAgICAgIHRoaXMubCA9ICtsOwogICAgICB0aGlzLm9wYWNpdHkgPSArb3BhY2l0eTsKICAgIH0KCiAgICBkZWZpbmUoSHNsLCBoc2wsIGV4dGVuZChDb2xvciwgewogICAgICBicmlnaHRlcjogZnVuY3Rpb24oaykgewogICAgICAgIGsgPSBrID09IG51bGwgPyBicmlnaHRlciA6IE1hdGgucG93KGJyaWdodGVyLCBrKTsKICAgICAgICByZXR1cm4gbmV3IEhzbCh0aGlzLmgsIHRoaXMucywgdGhpcy5sICogaywgdGhpcy5vcGFjaXR5KTsKICAgICAgfSwKICAgICAgZGFya2VyOiBmdW5jdGlvbihrKSB7CiAgICAgICAgayA9IGsgPT0gbnVsbCA/IGRhcmtlciA6IE1hdGgucG93KGRhcmtlciwgayk7CiAgICAgICAgcmV0dXJuIG5ldyBIc2wodGhpcy5oLCB0aGlzLnMsIHRoaXMubCAqIGssIHRoaXMub3BhY2l0eSk7CiAgICAgIH0sCiAgICAgIHJnYjogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGggPSB0aGlzLmggJSAzNjAgKyAodGhpcy5oIDwgMCkgKiAzNjAsCiAgICAgICAgICAgIHMgPSBpc05hTihoKSB8fCBpc05hTih0aGlzLnMpID8gMCA6IHRoaXMucywKICAgICAgICAgICAgbCA9IHRoaXMubCwKICAgICAgICAgICAgbTIgPSBsICsgKGwgPCAwLjUgPyBsIDogMSAtIGwpICogcywKICAgICAgICAgICAgbTEgPSAyICogbCAtIG0yOwogICAgICAgIHJldHVybiBuZXcgUmdiKAogICAgICAgICAgaHNsMnJnYihoID49IDI0MCA/IGggLSAyNDAgOiBoICsgMTIwLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYihoLCBtMSwgbTIpLAogICAgICAgICAgaHNsMnJnYihoIDwgMTIwID8gaCArIDI0MCA6IGggLSAxMjAsIG0xLCBtMiksCiAgICAgICAgICB0aGlzLm9wYWNpdHkKICAgICAgICApOwogICAgICB9LAogICAgICBkaXNwbGF5YWJsZTogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuICgwIDw9IHRoaXMucyAmJiB0aGlzLnMgPD0gMSB8fCBpc05hTih0aGlzLnMpKQogICAgICAgICAgICAmJiAoMCA8PSB0aGlzLmwgJiYgdGhpcy5sIDw9IDEpCiAgICAgICAgICAgICYmICgwIDw9IHRoaXMub3BhY2l0eSAmJiB0aGlzLm9wYWNpdHkgPD0gMSk7CiAgICAgIH0sCiAgICAgIGZvcm1hdEhzbDogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGEgPSB0aGlzLm9wYWNpdHk7IGEgPSBpc05hTihhKSA/IDEgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigxLCBhKSk7CiAgICAgICAgcmV0dXJuIChhID09PSAxID8gImhzbCgiIDogImhzbGEoIikKICAgICAgICAgICAgKyAodGhpcy5oIHx8IDApICsgIiwgIgogICAgICAgICAgICArICh0aGlzLnMgfHwgMCkgKiAxMDAgKyAiJSwgIgogICAgICAgICAgICArICh0aGlzLmwgfHwgMCkgKiAxMDAgKyAiJSIKICAgICAgICAgICAgKyAoYSA9PT0gMSA/ICIpIiA6ICIsICIgKyBhICsgIikiKTsKICAgICAgfQogICAgfSkpOwoKICAgIC8qIEZyb20gRnZEIDEzLjM3LCBDU1MgQ29sb3IgTW9kdWxlIExldmVsIDMgKi8KICAgIGZ1bmN0aW9uIGhzbDJyZ2IoaCwgbTEsIG0yKSB7CiAgICAgIHJldHVybiAoaCA8IDYwID8gbTEgKyAobTIgLSBtMSkgKiBoIC8gNjAKICAgICAgICAgIDogaCA8IDE4MCA/IG0yCiAgICAgICAgICA6IGggPCAyNDAgPyBtMSArIChtMiAtIG0xKSAqICgyNDAgLSBoKSAvIDYwCiAgICAgICAgICA6IG0xKSAqIDI1NTsKICAgIH0KCiAgICBmdW5jdGlvbiBiYXNpcyh0MSwgdjAsIHYxLCB2MiwgdjMpIHsKICAgICAgdmFyIHQyID0gdDEgKiB0MSwgdDMgPSB0MiAqIHQxOwogICAgICByZXR1cm4gKCgxIC0gMyAqIHQxICsgMyAqIHQyIC0gdDMpICogdjAKICAgICAgICAgICsgKDQgLSA2ICogdDIgKyAzICogdDMpICogdjEKICAgICAgICAgICsgKDEgKyAzICogdDEgKyAzICogdDIgLSAzICogdDMpICogdjIKICAgICAgICAgICsgdDMgKiB2MykgLyA2OwogICAgfQoKICAgIGZ1bmN0aW9uIGJhc2lzJDEodmFsdWVzKSB7CiAgICAgIHZhciBuID0gdmFsdWVzLmxlbmd0aCAtIDE7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdmFyIGkgPSB0IDw9IDAgPyAodCA9IDApIDogdCA+PSAxID8gKHQgPSAxLCBuIC0gMSkgOiBNYXRoLmZsb29yKHQgKiBuKSwKICAgICAgICAgICAgdjEgPSB2YWx1ZXNbaV0sCiAgICAgICAgICAgIHYyID0gdmFsdWVzW2kgKyAxXSwKICAgICAgICAgICAgdjAgPSBpID4gMCA/IHZhbHVlc1tpIC0gMV0gOiAyICogdjEgLSB2MiwKICAgICAgICAgICAgdjMgPSBpIDwgbiAtIDEgPyB2YWx1ZXNbaSArIDJdIDogMiAqIHYyIC0gdjE7CiAgICAgICAgcmV0dXJuIGJhc2lzKCh0IC0gaSAvIG4pICogbiwgdjAsIHYxLCB2MiwgdjMpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDIoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZWFyKGEsIGQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gYSArIHQgKiBkOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGV4cG9uZW50aWFsKGEsIGIsIHkpIHsKICAgICAgcmV0dXJuIGEgPSBNYXRoLnBvdyhhLCB5KSwgYiA9IE1hdGgucG93KGIsIHkpIC0gYSwgeSA9IDEgLyB5LCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucG93KGEgKyB0ICogYiwgeSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZ2FtbWEoeSkgewogICAgICByZXR1cm4gKHkgPSAreSkgPT09IDEgPyBub2dhbW1hIDogZnVuY3Rpb24oYSwgYikgewogICAgICAgIHJldHVybiBiIC0gYSA/IGV4cG9uZW50aWFsKGEsIGIsIHkpIDogY29uc3RhbnQkMihpc05hTihhKSA/IGIgOiBhKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2dhbW1hKGEsIGIpIHsKICAgICAgdmFyIGQgPSBiIC0gYTsKICAgICAgcmV0dXJuIGQgPyBsaW5lYXIoYSwgZCkgOiBjb25zdGFudCQyKGlzTmFOKGEpID8gYiA6IGEpOwogICAgfQoKICAgIHZhciBpbnRlcnBvbGF0ZVJnYiA9IChmdW5jdGlvbiByZ2JHYW1tYSh5KSB7CiAgICAgIHZhciBjb2xvciA9IGdhbW1hKHkpOwoKICAgICAgZnVuY3Rpb24gcmdiJDEoc3RhcnQsIGVuZCkgewogICAgICAgIHZhciByID0gY29sb3IoKHN0YXJ0ID0gcmdiKHN0YXJ0KSkuciwgKGVuZCA9IHJnYihlbmQpKS5yKSwKICAgICAgICAgICAgZyA9IGNvbG9yKHN0YXJ0LmcsIGVuZC5nKSwKICAgICAgICAgICAgYiA9IGNvbG9yKHN0YXJ0LmIsIGVuZC5iKSwKICAgICAgICAgICAgb3BhY2l0eSA9IG5vZ2FtbWEoc3RhcnQub3BhY2l0eSwgZW5kLm9wYWNpdHkpOwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICBzdGFydC5yID0gcih0KTsKICAgICAgICAgIHN0YXJ0LmcgPSBnKHQpOwogICAgICAgICAgc3RhcnQuYiA9IGIodCk7CiAgICAgICAgICBzdGFydC5vcGFjaXR5ID0gb3BhY2l0eSh0KTsKICAgICAgICAgIHJldHVybiBzdGFydCArICIiOwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJnYiQxLmdhbW1hID0gcmdiR2FtbWE7CgogICAgICByZXR1cm4gcmdiJDE7CiAgICB9KSgxKTsKCiAgICBmdW5jdGlvbiByZ2JTcGxpbmUoc3BsaW5lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbihjb2xvcnMpIHsKICAgICAgICB2YXIgbiA9IGNvbG9ycy5sZW5ndGgsCiAgICAgICAgICAgIHIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGcgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGIgPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIGksIGNvbG9yOwogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGNvbG9yID0gcmdiKGNvbG9yc1tpXSk7CiAgICAgICAgICByW2ldID0gY29sb3IuciB8fCAwOwogICAgICAgICAgZ1tpXSA9IGNvbG9yLmcgfHwgMDsKICAgICAgICAgIGJbaV0gPSBjb2xvci5iIHx8IDA7CiAgICAgICAgfQogICAgICAgIHIgPSBzcGxpbmUocik7CiAgICAgICAgZyA9IHNwbGluZShnKTsKICAgICAgICBiID0gc3BsaW5lKGIpOwogICAgICAgIGNvbG9yLm9wYWNpdHkgPSAxOwogICAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgICBjb2xvci5yID0gcih0KTsKICAgICAgICAgIGNvbG9yLmcgPSBnKHQpOwogICAgICAgICAgY29sb3IuYiA9IGIodCk7CiAgICAgICAgICByZXR1cm4gY29sb3IgKyAiIjsKICAgICAgICB9OwogICAgICB9OwogICAgfQoKICAgIHZhciByZ2JCYXNpcyA9IHJnYlNwbGluZShiYXNpcyQxKTsKCiAgICBmdW5jdGlvbiBudW1iZXJBcnJheShhLCBiKSB7CiAgICAgIGlmICghYikgYiA9IFtdOwogICAgICB2YXIgbiA9IGEgPyBNYXRoLm1pbihiLmxlbmd0aCwgYS5sZW5ndGgpIDogMCwKICAgICAgICAgIGMgPSBiLnNsaWNlKCksCiAgICAgICAgICBpOwogICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIGNbaV0gPSBhW2ldICogKDEgLSB0KSArIGJbaV0gKiB0OwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGlzTnVtYmVyQXJyYXkoeCkgewogICAgICByZXR1cm4gQXJyYXlCdWZmZXIuaXNWaWV3KHgpICYmICEoeCBpbnN0YW5jZW9mIERhdGFWaWV3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBnZW5lcmljQXJyYXkoYSwgYikgewogICAgICB2YXIgbmIgPSBiID8gYi5sZW5ndGggOiAwLAogICAgICAgICAgbmEgPSBhID8gTWF0aC5taW4obmIsIGEubGVuZ3RoKSA6IDAsCiAgICAgICAgICB4ID0gbmV3IEFycmF5KG5hKSwKICAgICAgICAgIGMgPSBuZXcgQXJyYXkobmIpLAogICAgICAgICAgaTsKCiAgICAgIGZvciAoaSA9IDA7IGkgPCBuYTsgKytpKSB4W2ldID0gaW50ZXJwb2xhdGVWYWx1ZShhW2ldLCBiW2ldKTsKICAgICAgZm9yICg7IGkgPCBuYjsgKytpKSBjW2ldID0gYltpXTsKCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChpID0gMDsgaSA8IG5hOyArK2kpIGNbaV0gPSB4W2ldKHQpOwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGRhdGUoYSwgYikgewogICAgICB2YXIgZCA9IG5ldyBEYXRlOwogICAgICByZXR1cm4gYSA9ICthLCBiID0gK2IsIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gZC5zZXRUaW1lKGEgKiAoMSAtIHQpICsgYiAqIHQpLCBkOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlTnVtYmVyKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIGEgKiAoMSAtIHQpICsgYiAqIHQ7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb2JqZWN0KGEsIGIpIHsKICAgICAgdmFyIGkgPSB7fSwKICAgICAgICAgIGMgPSB7fSwKICAgICAgICAgIGs7CgogICAgICBpZiAoYSA9PT0gbnVsbCB8fCB0eXBlb2YgYSAhPT0gIm9iamVjdCIpIGEgPSB7fTsKICAgICAgaWYgKGIgPT09IG51bGwgfHwgdHlwZW9mIGIgIT09ICJvYmplY3QiKSBiID0ge307CgogICAgICBmb3IgKGsgaW4gYikgewogICAgICAgIGlmIChrIGluIGEpIHsKICAgICAgICAgIGlba10gPSBpbnRlcnBvbGF0ZVZhbHVlKGFba10sIGJba10pOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjW2tdID0gYltrXTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgZm9yIChrIGluIGkpIGNba10gPSBpW2tdKHQpOwogICAgICAgIHJldHVybiBjOwogICAgICB9OwogICAgfQoKICAgIHZhciByZUEgPSAvWy0rXT8oPzpcZCtcLj9cZCp8XC4/XGQrKSg/OltlRV1bLStdP1xkKyk/L2csCiAgICAgICAgcmVCID0gbmV3IFJlZ0V4cChyZUEuc291cmNlLCAiZyIpOwoKICAgIGZ1bmN0aW9uIHplcm8oYikgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGI7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gb25lKGIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICByZXR1cm4gYih0KSArICIiOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlU3RyaW5nKGEsIGIpIHsKICAgICAgdmFyIGJpID0gcmVBLmxhc3RJbmRleCA9IHJlQi5sYXN0SW5kZXggPSAwLCAvLyBzY2FuIGluZGV4IGZvciBuZXh0IG51bWJlciBpbiBiCiAgICAgICAgICBhbSwgLy8gY3VycmVudCBtYXRjaCBpbiBhCiAgICAgICAgICBibSwgLy8gY3VycmVudCBtYXRjaCBpbiBiCiAgICAgICAgICBicywgLy8gc3RyaW5nIHByZWNlZGluZyBjdXJyZW50IG51bWJlciBpbiBiLCBpZiBhbnkKICAgICAgICAgIGkgPSAtMSwgLy8gaW5kZXggaW4gcwogICAgICAgICAgcyA9IFtdLCAvLyBzdHJpbmcgY29uc3RhbnRzIGFuZCBwbGFjZWhvbGRlcnMKICAgICAgICAgIHEgPSBbXTsgLy8gbnVtYmVyIGludGVycG9sYXRvcnMKCiAgICAgIC8vIENvZXJjZSBpbnB1dHMgdG8gc3RyaW5ncy4KICAgICAgYSA9IGEgKyAiIiwgYiA9IGIgKyAiIjsKCiAgICAgIC8vIEludGVycG9sYXRlIHBhaXJzIG9mIG51bWJlcnMgaW4gYSAmIGIuCiAgICAgIHdoaWxlICgoYW0gPSByZUEuZXhlYyhhKSkKICAgICAgICAgICYmIChibSA9IHJlQi5leGVjKGIpKSkgewogICAgICAgIGlmICgoYnMgPSBibS5pbmRleCkgPiBiaSkgeyAvLyBhIHN0cmluZyBwcmVjZWRlcyB0aGUgbmV4dCBudW1iZXIgaW4gYgogICAgICAgICAgYnMgPSBiLnNsaWNlKGJpLCBicyk7CiAgICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBiczsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgICAgIGVsc2Ugc1srK2ldID0gYnM7CiAgICAgICAgfQogICAgICAgIGlmICgoYW0gPSBhbVswXSkgPT09IChibSA9IGJtWzBdKSkgeyAvLyBudW1iZXJzIGluIGEgJiBiIG1hdGNoCiAgICAgICAgICBpZiAoc1tpXSkgc1tpXSArPSBibTsgLy8gY29hbGVzY2Ugd2l0aCBwcmV2aW91cyBzdHJpbmcKICAgICAgICAgIGVsc2Ugc1srK2ldID0gYm07CiAgICAgICAgfSBlbHNlIHsgLy8gaW50ZXJwb2xhdGUgbm9uLW1hdGNoaW5nIG51bWJlcnMKICAgICAgICAgIHNbKytpXSA9IG51bGw7CiAgICAgICAgICBxLnB1c2goe2k6IGksIHg6IGludGVycG9sYXRlTnVtYmVyKGFtLCBibSl9KTsKICAgICAgICB9CiAgICAgICAgYmkgPSByZUIubGFzdEluZGV4OwogICAgICB9CgogICAgICAvLyBBZGQgcmVtYWlucyBvZiBiLgogICAgICBpZiAoYmkgPCBiLmxlbmd0aCkgewogICAgICAgIGJzID0gYi5zbGljZShiaSk7CiAgICAgICAgaWYgKHNbaV0pIHNbaV0gKz0gYnM7IC8vIGNvYWxlc2NlIHdpdGggcHJldmlvdXMgc3RyaW5nCiAgICAgICAgZWxzZSBzWysraV0gPSBiczsKICAgICAgfQoKICAgICAgLy8gU3BlY2lhbCBvcHRpbWl6YXRpb24gZm9yIG9ubHkgYSBzaW5nbGUgbWF0Y2guCiAgICAgIC8vIE90aGVyd2lzZSwgaW50ZXJwb2xhdGUgZWFjaCBvZiB0aGUgbnVtYmVycyBhbmQgcmVqb2luIHRoZSBzdHJpbmcuCiAgICAgIHJldHVybiBzLmxlbmd0aCA8IDIgPyAocVswXQogICAgICAgICAgPyBvbmUocVswXS54KQogICAgICAgICAgOiB6ZXJvKGIpKQogICAgICAgICAgOiAoYiA9IHEubGVuZ3RoLCBmdW5jdGlvbih0KSB7CiAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG87IGkgPCBiOyArK2kpIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgICAgICByZXR1cm4gcy5qb2luKCIiKTsKICAgICAgICAgICAgfSk7CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJwb2xhdGVWYWx1ZShhLCBiKSB7CiAgICAgIHZhciB0ID0gdHlwZW9mIGIsIGM7CiAgICAgIHJldHVybiBiID09IG51bGwgfHwgdCA9PT0gImJvb2xlYW4iID8gY29uc3RhbnQkMihiKQogICAgICAgICAgOiAodCA9PT0gIm51bWJlciIgPyBpbnRlcnBvbGF0ZU51bWJlcgogICAgICAgICAgOiB0ID09PSAic3RyaW5nIiA/ICgoYyA9IGNvbG9yKGIpKSA/IChiID0gYywgaW50ZXJwb2xhdGVSZ2IpIDogaW50ZXJwb2xhdGVTdHJpbmcpCiAgICAgICAgICA6IGIgaW5zdGFuY2VvZiBjb2xvciA/IGludGVycG9sYXRlUmdiCiAgICAgICAgICA6IGIgaW5zdGFuY2VvZiBEYXRlID8gZGF0ZQogICAgICAgICAgOiBpc051bWJlckFycmF5KGIpID8gbnVtYmVyQXJyYXkKICAgICAgICAgIDogQXJyYXkuaXNBcnJheShiKSA/IGdlbmVyaWNBcnJheQogICAgICAgICAgOiB0eXBlb2YgYi52YWx1ZU9mICE9PSAiZnVuY3Rpb24iICYmIHR5cGVvZiBiLnRvU3RyaW5nICE9PSAiZnVuY3Rpb24iIHx8IGlzTmFOKGIpID8gb2JqZWN0CiAgICAgICAgICA6IGludGVycG9sYXRlTnVtYmVyKShhLCBiKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVJvdW5kKGEsIGIpIHsKICAgICAgcmV0dXJuIGEgPSArYSwgYiA9ICtiLCBmdW5jdGlvbih0KSB7CiAgICAgICAgcmV0dXJuIE1hdGgucm91bmQoYSAqICgxIC0gdCkgKyBiICogdCk7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGRlZ3JlZXMgPSAxODAgLyBNYXRoLlBJOwoKICAgIHZhciBpZGVudGl0eSQzID0gewogICAgICB0cmFuc2xhdGVYOiAwLAogICAgICB0cmFuc2xhdGVZOiAwLAogICAgICByb3RhdGU6IDAsCiAgICAgIHNrZXdYOiAwLAogICAgICBzY2FsZVg6IDEsCiAgICAgIHNjYWxlWTogMQogICAgfTsKCiAgICBmdW5jdGlvbiBkZWNvbXBvc2UoYSwgYiwgYywgZCwgZSwgZikgewogICAgICB2YXIgc2NhbGVYLCBzY2FsZVksIHNrZXdYOwogICAgICBpZiAoc2NhbGVYID0gTWF0aC5zcXJ0KGEgKiBhICsgYiAqIGIpKSBhIC89IHNjYWxlWCwgYiAvPSBzY2FsZVg7CiAgICAgIGlmIChza2V3WCA9IGEgKiBjICsgYiAqIGQpIGMgLT0gYSAqIHNrZXdYLCBkIC09IGIgKiBza2V3WDsKICAgICAgaWYgKHNjYWxlWSA9IE1hdGguc3FydChjICogYyArIGQgKiBkKSkgYyAvPSBzY2FsZVksIGQgLz0gc2NhbGVZLCBza2V3WCAvPSBzY2FsZVk7CiAgICAgIGlmIChhICogZCA8IGIgKiBjKSBhID0gLWEsIGIgPSAtYiwgc2tld1ggPSAtc2tld1gsIHNjYWxlWCA9IC1zY2FsZVg7CiAgICAgIHJldHVybiB7CiAgICAgICAgdHJhbnNsYXRlWDogZSwKICAgICAgICB0cmFuc2xhdGVZOiBmLAogICAgICAgIHJvdGF0ZTogTWF0aC5hdGFuMihiLCBhKSAqIGRlZ3JlZXMsCiAgICAgICAgc2tld1g6IE1hdGguYXRhbihza2V3WCkgKiBkZWdyZWVzLAogICAgICAgIHNjYWxlWDogc2NhbGVYLAogICAgICAgIHNjYWxlWTogc2NhbGVZCiAgICAgIH07CiAgICB9CgogICAgdmFyIGNzc05vZGUsCiAgICAgICAgY3NzUm9vdCwKICAgICAgICBjc3NWaWV3LAogICAgICAgIHN2Z05vZGU7CgogICAgZnVuY3Rpb24gcGFyc2VDc3ModmFsdWUpIHsKICAgICAgaWYgKHZhbHVlID09PSAibm9uZSIpIHJldHVybiBpZGVudGl0eSQzOwogICAgICBpZiAoIWNzc05vZGUpIGNzc05vZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJESVYiKSwgY3NzUm9vdCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgY3NzVmlldyA9IGRvY3VtZW50LmRlZmF1bHRWaWV3OwogICAgICBjc3NOb2RlLnN0eWxlLnRyYW5zZm9ybSA9IHZhbHVlOwogICAgICB2YWx1ZSA9IGNzc1ZpZXcuZ2V0Q29tcHV0ZWRTdHlsZShjc3NSb290LmFwcGVuZENoaWxkKGNzc05vZGUpLCBudWxsKS5nZXRQcm9wZXJ0eVZhbHVlKCJ0cmFuc2Zvcm0iKTsKICAgICAgY3NzUm9vdC5yZW1vdmVDaGlsZChjc3NOb2RlKTsKICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSg3LCAtMSkuc3BsaXQoIiwiKTsKICAgICAgcmV0dXJuIGRlY29tcG9zZSgrdmFsdWVbMF0sICt2YWx1ZVsxXSwgK3ZhbHVlWzJdLCArdmFsdWVbM10sICt2YWx1ZVs0XSwgK3ZhbHVlWzVdKTsKICAgIH0KCiAgICBmdW5jdGlvbiBwYXJzZVN2Zyh2YWx1ZSkgewogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGlkZW50aXR5JDM7CiAgICAgIGlmICghc3ZnTm9kZSkgc3ZnTm9kZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUygiaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciLCAiZyIpOwogICAgICBzdmdOb2RlLnNldEF0dHJpYnV0ZSgidHJhbnNmb3JtIiwgdmFsdWUpOwogICAgICBpZiAoISh2YWx1ZSA9IHN2Z05vZGUudHJhbnNmb3JtLmJhc2VWYWwuY29uc29saWRhdGUoKSkpIHJldHVybiBpZGVudGl0eSQzOwogICAgICB2YWx1ZSA9IHZhbHVlLm1hdHJpeDsKICAgICAgcmV0dXJuIGRlY29tcG9zZSh2YWx1ZS5hLCB2YWx1ZS5iLCB2YWx1ZS5jLCB2YWx1ZS5kLCB2YWx1ZS5lLCB2YWx1ZS5mKTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZSwgcHhDb21tYSwgcHhQYXJlbiwgZGVnUGFyZW4pIHsKCiAgICAgIGZ1bmN0aW9uIHBvcChzKSB7CiAgICAgICAgcmV0dXJuIHMubGVuZ3RoID8gcy5wb3AoKSArICIgIiA6ICIiOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0cmFuc2xhdGUoeGEsIHlhLCB4YiwgeWIsIHMsIHEpIHsKICAgICAgICBpZiAoeGEgIT09IHhiIHx8IHlhICE9PSB5YikgewogICAgICAgICAgdmFyIGkgPSBzLnB1c2goInRyYW5zbGF0ZSgiLCBudWxsLCBweENvbW1hLCBudWxsLCBweFBhcmVuKTsKICAgICAgICAgIHEucHVzaCh7aTogaSAtIDQsIHg6IGludGVycG9sYXRlTnVtYmVyKHhhLCB4Yil9LCB7aTogaSAtIDIsIHg6IGludGVycG9sYXRlTnVtYmVyKHlhLCB5Yil9KTsKICAgICAgICB9IGVsc2UgaWYgKHhiIHx8IHliKSB7CiAgICAgICAgICBzLnB1c2goInRyYW5zbGF0ZSgiICsgeGIgKyBweENvbW1hICsgeWIgKyBweFBhcmVuKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHJvdGF0ZShhLCBiLCBzLCBxKSB7CiAgICAgICAgaWYgKGEgIT09IGIpIHsKICAgICAgICAgIGlmIChhIC0gYiA+IDE4MCkgYiArPSAzNjA7IGVsc2UgaWYgKGIgLSBhID4gMTgwKSBhICs9IDM2MDsgLy8gc2hvcnRlc3QgcGF0aAogICAgICAgICAgcS5wdXNoKHtpOiBzLnB1c2gocG9wKHMpICsgInJvdGF0ZSgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKX0pOwogICAgICAgIH0gZWxzZSBpZiAoYikgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJyb3RhdGUoIiArIGIgKyBkZWdQYXJlbik7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBza2V3WChhLCBiLCBzLCBxKSB7CiAgICAgICAgaWYgKGEgIT09IGIpIHsKICAgICAgICAgIHEucHVzaCh7aTogcy5wdXNoKHBvcChzKSArICJza2V3WCgiLCBudWxsLCBkZWdQYXJlbikgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlcihhLCBiKX0pOwogICAgICAgIH0gZWxzZSBpZiAoYikgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJza2V3WCgiICsgYiArIGRlZ1BhcmVuKTsKICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIHNjYWxlKHhhLCB5YSwgeGIsIHliLCBzLCBxKSB7CiAgICAgICAgaWYgKHhhICE9PSB4YiB8fCB5YSAhPT0geWIpIHsKICAgICAgICAgIHZhciBpID0gcy5wdXNoKHBvcChzKSArICJzY2FsZSgiLCBudWxsLCAiLCIsIG51bGwsICIpIik7CiAgICAgICAgICBxLnB1c2goe2k6IGkgLSA0LCB4OiBpbnRlcnBvbGF0ZU51bWJlcih4YSwgeGIpfSwge2k6IGkgLSAyLCB4OiBpbnRlcnBvbGF0ZU51bWJlcih5YSwgeWIpfSk7CiAgICAgICAgfSBlbHNlIGlmICh4YiAhPT0gMSB8fCB5YiAhPT0gMSkgewogICAgICAgICAgcy5wdXNoKHBvcChzKSArICJzY2FsZSgiICsgeGIgKyAiLCIgKyB5YiArICIpIik7CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gZnVuY3Rpb24oYSwgYikgewogICAgICAgIHZhciBzID0gW10sIC8vIHN0cmluZyBjb25zdGFudHMgYW5kIHBsYWNlaG9sZGVycwogICAgICAgICAgICBxID0gW107IC8vIG51bWJlciBpbnRlcnBvbGF0b3JzCiAgICAgICAgYSA9IHBhcnNlKGEpLCBiID0gcGFyc2UoYik7CiAgICAgICAgdHJhbnNsYXRlKGEudHJhbnNsYXRlWCwgYS50cmFuc2xhdGVZLCBiLnRyYW5zbGF0ZVgsIGIudHJhbnNsYXRlWSwgcywgcSk7CiAgICAgICAgcm90YXRlKGEucm90YXRlLCBiLnJvdGF0ZSwgcywgcSk7CiAgICAgICAgc2tld1goYS5za2V3WCwgYi5za2V3WCwgcywgcSk7CiAgICAgICAgc2NhbGUoYS5zY2FsZVgsIGEuc2NhbGVZLCBiLnNjYWxlWCwgYi5zY2FsZVksIHMsIHEpOwogICAgICAgIGEgPSBiID0gbnVsbDsgLy8gZ2MKICAgICAgICByZXR1cm4gZnVuY3Rpb24odCkgewogICAgICAgICAgdmFyIGkgPSAtMSwgbiA9IHEubGVuZ3RoLCBvOwogICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHNbKG8gPSBxW2ldKS5pXSA9IG8ueCh0KTsKICAgICAgICAgIHJldHVybiBzLmpvaW4oIiIpOwogICAgICAgIH07CiAgICAgIH07CiAgICB9CgogICAgdmFyIGludGVycG9sYXRlVHJhbnNmb3JtQ3NzID0gaW50ZXJwb2xhdGVUcmFuc2Zvcm0ocGFyc2VDc3MsICJweCwgIiwgInB4KSIsICJkZWcpIik7CiAgICB2YXIgaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgPSBpbnRlcnBvbGF0ZVRyYW5zZm9ybShwYXJzZVN2ZywgIiwgIiwgIikiLCAiKSIpOwoKICAgIHZhciBmcmFtZSA9IDAsIC8vIGlzIGFuIGFuaW1hdGlvbiBmcmFtZSBwZW5kaW5nPwogICAgICAgIHRpbWVvdXQgPSAwLCAvLyBpcyBhIHRpbWVvdXQgcGVuZGluZz8KICAgICAgICBpbnRlcnZhbCQxID0gMCwgLy8gYXJlIGFueSB0aW1lcnMgYWN0aXZlPwogICAgICAgIHBva2VEZWxheSA9IDEwMDAsIC8vIGhvdyBmcmVxdWVudGx5IHdlIGNoZWNrIGZvciBjbG9jayBza2V3CiAgICAgICAgdGFza0hlYWQsCiAgICAgICAgdGFza1RhaWwsCiAgICAgICAgY2xvY2tMYXN0ID0gMCwKICAgICAgICBjbG9ja05vdyA9IDAsCiAgICAgICAgY2xvY2tTa2V3ID0gMCwKICAgICAgICBjbG9jayA9IHR5cGVvZiBwZXJmb3JtYW5jZSA9PT0gIm9iamVjdCIgJiYgcGVyZm9ybWFuY2Uubm93ID8gcGVyZm9ybWFuY2UgOiBEYXRlLAogICAgICAgIHNldEZyYW1lID0gdHlwZW9mIHdpbmRvdyA9PT0gIm9iamVjdCIgJiYgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA/IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpIDogZnVuY3Rpb24oZikgeyBzZXRUaW1lb3V0KGYsIDE3KTsgfTsKCiAgICBmdW5jdGlvbiBub3coKSB7CiAgICAgIHJldHVybiBjbG9ja05vdyB8fCAoc2V0RnJhbWUoY2xlYXJOb3cpLCBjbG9ja05vdyA9IGNsb2NrLm5vdygpICsgY2xvY2tTa2V3KTsKICAgIH0KCiAgICBmdW5jdGlvbiBjbGVhck5vdygpIHsKICAgICAgY2xvY2tOb3cgPSAwOwogICAgfQoKICAgIGZ1bmN0aW9uIFRpbWVyKCkgewogICAgICB0aGlzLl9jYWxsID0KICAgICAgdGhpcy5fdGltZSA9CiAgICAgIHRoaXMuX25leHQgPSBudWxsOwogICAgfQoKICAgIFRpbWVyLnByb3RvdHlwZSA9IHRpbWVyJDEucHJvdG90eXBlID0gewogICAgICBjb25zdHJ1Y3RvcjogVGltZXIsCiAgICAgIHJlc3RhcnQ6IGZ1bmN0aW9uKGNhbGxiYWNrLCBkZWxheSwgdGltZSkgewogICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2sgIT09ICJmdW5jdGlvbiIpIHRocm93IG5ldyBUeXBlRXJyb3IoImNhbGxiYWNrIGlzIG5vdCBhIGZ1bmN0aW9uIik7CiAgICAgICAgdGltZSA9ICh0aW1lID09IG51bGwgPyBub3coKSA6ICt0aW1lKSArIChkZWxheSA9PSBudWxsID8gMCA6ICtkZWxheSk7CiAgICAgICAgaWYgKCF0aGlzLl9uZXh0ICYmIHRhc2tUYWlsICE9PSB0aGlzKSB7CiAgICAgICAgICBpZiAodGFza1RhaWwpIHRhc2tUYWlsLl9uZXh0ID0gdGhpczsKICAgICAgICAgIGVsc2UgdGFza0hlYWQgPSB0aGlzOwogICAgICAgICAgdGFza1RhaWwgPSB0aGlzOwogICAgICAgIH0KICAgICAgICB0aGlzLl9jYWxsID0gY2FsbGJhY2s7CiAgICAgICAgdGhpcy5fdGltZSA9IHRpbWU7CiAgICAgICAgc2xlZXAoKTsKICAgICAgfSwKICAgICAgc3RvcDogZnVuY3Rpb24oKSB7CiAgICAgICAgaWYgKHRoaXMuX2NhbGwpIHsKICAgICAgICAgIHRoaXMuX2NhbGwgPSBudWxsOwogICAgICAgICAgdGhpcy5fdGltZSA9IEluZmluaXR5OwogICAgICAgICAgc2xlZXAoKTsKICAgICAgICB9CiAgICAgIH0KICAgIH07CgogICAgZnVuY3Rpb24gdGltZXIkMShjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXI7CiAgICAgIHQucmVzdGFydChjYWxsYmFjaywgZGVsYXksIHRpbWUpOwogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICBmdW5jdGlvbiB0aW1lckZsdXNoKCkgewogICAgICBub3coKTsgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUsIGlmIG5vdCBhbHJlYWR5IHNldC4KICAgICAgKytmcmFtZTsgLy8gUHJldGVuZCB3ZeKAmXZlIHNldCBhbiBhbGFybSwgaWYgd2UgaGF2ZW7igJl0IGFscmVhZHkuCiAgICAgIHZhciB0ID0gdGFza0hlYWQsIGU7CiAgICAgIHdoaWxlICh0KSB7CiAgICAgICAgaWYgKChlID0gY2xvY2tOb3cgLSB0Ll90aW1lKSA+PSAwKSB0Ll9jYWxsLmNhbGwobnVsbCwgZSk7CiAgICAgICAgdCA9IHQuX25leHQ7CiAgICAgIH0KICAgICAgLS1mcmFtZTsKICAgIH0KCiAgICBmdW5jdGlvbiB3YWtlKCkgewogICAgICBjbG9ja05vdyA9IChjbG9ja0xhc3QgPSBjbG9jay5ub3coKSkgKyBjbG9ja1NrZXc7CiAgICAgIGZyYW1lID0gdGltZW91dCA9IDA7CiAgICAgIHRyeSB7CiAgICAgICAgdGltZXJGbHVzaCgpOwogICAgICB9IGZpbmFsbHkgewogICAgICAgIGZyYW1lID0gMDsKICAgICAgICBuYXAoKTsKICAgICAgICBjbG9ja05vdyA9IDA7CiAgICAgIH0KICAgIH0KCiAgICBmdW5jdGlvbiBwb2tlKCkgewogICAgICB2YXIgbm93ID0gY2xvY2subm93KCksIGRlbGF5ID0gbm93IC0gY2xvY2tMYXN0OwogICAgICBpZiAoZGVsYXkgPiBwb2tlRGVsYXkpIGNsb2NrU2tldyAtPSBkZWxheSwgY2xvY2tMYXN0ID0gbm93OwogICAgfQoKICAgIGZ1bmN0aW9uIG5hcCgpIHsKICAgICAgdmFyIHQwLCB0MSA9IHRhc2tIZWFkLCB0MiwgdGltZSA9IEluZmluaXR5OwogICAgICB3aGlsZSAodDEpIHsKICAgICAgICBpZiAodDEuX2NhbGwpIHsKICAgICAgICAgIGlmICh0aW1lID4gdDEuX3RpbWUpIHRpbWUgPSB0MS5fdGltZTsKICAgICAgICAgIHQwID0gdDEsIHQxID0gdDEuX25leHQ7CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgIHQyID0gdDEuX25leHQsIHQxLl9uZXh0ID0gbnVsbDsKICAgICAgICAgIHQxID0gdDAgPyB0MC5fbmV4dCA9IHQyIDogdGFza0hlYWQgPSB0MjsKICAgICAgICB9CiAgICAgIH0KICAgICAgdGFza1RhaWwgPSB0MDsKICAgICAgc2xlZXAodGltZSk7CiAgICB9CgogICAgZnVuY3Rpb24gc2xlZXAodGltZSkgewogICAgICBpZiAoZnJhbWUpIHJldHVybjsgLy8gU29vbmVzdCBhbGFybSBhbHJlYWR5IHNldCwgb3Igd2lsbCBiZS4KICAgICAgaWYgKHRpbWVvdXQpIHRpbWVvdXQgPSBjbGVhclRpbWVvdXQodGltZW91dCk7CiAgICAgIHZhciBkZWxheSA9IHRpbWUgLSBjbG9ja05vdzsgLy8gU3RyaWN0bHkgbGVzcyB0aGFuIGlmIHdlIHJlY29tcHV0ZWQgY2xvY2tOb3cuCiAgICAgIGlmIChkZWxheSA+IDI0KSB7CiAgICAgICAgaWYgKHRpbWUgPCBJbmZpbml0eSkgdGltZW91dCA9IHNldFRpbWVvdXQod2FrZSwgdGltZSAtIGNsb2NrLm5vdygpIC0gY2xvY2tTa2V3KTsKICAgICAgICBpZiAoaW50ZXJ2YWwkMSkgaW50ZXJ2YWwkMSA9IGNsZWFySW50ZXJ2YWwoaW50ZXJ2YWwkMSk7CiAgICAgIH0gZWxzZSB7CiAgICAgICAgaWYgKCFpbnRlcnZhbCQxKSBjbG9ja0xhc3QgPSBjbG9jay5ub3coKSwgaW50ZXJ2YWwkMSA9IHNldEludGVydmFsKHBva2UsIHBva2VEZWxheSk7CiAgICAgICAgZnJhbWUgPSAxLCBzZXRGcmFtZSh3YWtlKTsKICAgICAgfQogICAgfQoKICAgIGZ1bmN0aW9uIHRpbWVvdXQkMShjYWxsYmFjaywgZGVsYXksIHRpbWUpIHsKICAgICAgdmFyIHQgPSBuZXcgVGltZXI7CiAgICAgIGRlbGF5ID0gZGVsYXkgPT0gbnVsbCA/IDAgOiArZGVsYXk7CiAgICAgIHQucmVzdGFydChmdW5jdGlvbihlbGFwc2VkKSB7CiAgICAgICAgdC5zdG9wKCk7CiAgICAgICAgY2FsbGJhY2soZWxhcHNlZCArIGRlbGF5KTsKICAgICAgfSwgZGVsYXksIHRpbWUpOwogICAgICByZXR1cm4gdDsKICAgIH0KCiAgICB2YXIgZW1wdHlPbiA9IGRpc3BhdGNoJDMoInN0YXJ0IiwgImVuZCIsICJjYW5jZWwiLCAiaW50ZXJydXB0Iik7CiAgICB2YXIgZW1wdHlUd2VlbiA9IFtdOwoKICAgIHZhciBDUkVBVEVEID0gMDsKICAgIHZhciBTQ0hFRFVMRUQgPSAxOwogICAgdmFyIFNUQVJUSU5HID0gMjsKICAgIHZhciBTVEFSVEVEID0gMzsKICAgIHZhciBSVU5OSU5HID0gNDsKICAgIHZhciBFTkRJTkcgPSA1OwogICAgdmFyIEVOREVEID0gNjsKCiAgICBmdW5jdGlvbiBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaW5kZXgsIGdyb3VwLCB0aW1pbmcpIHsKICAgICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlcykgbm9kZS5fX3RyYW5zaXRpb24gPSB7fTsKICAgICAgZWxzZSBpZiAoaWQgaW4gc2NoZWR1bGVzKSByZXR1cm47CiAgICAgIGNyZWF0ZShub2RlLCBpZCwgewogICAgICAgIG5hbWU6IG5hbWUsCiAgICAgICAgaW5kZXg6IGluZGV4LCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suCiAgICAgICAgZ3JvdXA6IGdyb3VwLCAvLyBGb3IgY29udGV4dCBkdXJpbmcgY2FsbGJhY2suCiAgICAgICAgb246IGVtcHR5T24sCiAgICAgICAgdHdlZW46IGVtcHR5VHdlZW4sCiAgICAgICAgdGltZTogdGltaW5nLnRpbWUsCiAgICAgICAgZGVsYXk6IHRpbWluZy5kZWxheSwKICAgICAgICBkdXJhdGlvbjogdGltaW5nLmR1cmF0aW9uLAogICAgICAgIGVhc2U6IHRpbWluZy5lYXNlLAogICAgICAgIHRpbWVyOiBudWxsLAogICAgICAgIHN0YXRlOiBDUkVBVEVECiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIGluaXQobm9kZSwgaWQpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gZ2V0JDEobm9kZSwgaWQpOwogICAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBDUkVBVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHNjaGVkdWxlZCIpOwogICAgICByZXR1cm4gc2NoZWR1bGU7CiAgICB9CgogICAgZnVuY3Rpb24gc2V0JDEobm9kZSwgaWQpIHsKICAgICAgdmFyIHNjaGVkdWxlID0gZ2V0JDEobm9kZSwgaWQpOwogICAgICBpZiAoc2NoZWR1bGUuc3RhdGUgPiBTVEFSVEVEKSB0aHJvdyBuZXcgRXJyb3IoInRvbyBsYXRlOyBhbHJlYWR5IHJ1bm5pbmciKTsKICAgICAgcmV0dXJuIHNjaGVkdWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGdldCQxKG5vZGUsIGlkKSB7CiAgICAgIHZhciBzY2hlZHVsZSA9IG5vZGUuX190cmFuc2l0aW9uOwogICAgICBpZiAoIXNjaGVkdWxlIHx8ICEoc2NoZWR1bGUgPSBzY2hlZHVsZVtpZF0pKSB0aHJvdyBuZXcgRXJyb3IoInRyYW5zaXRpb24gbm90IGZvdW5kIik7CiAgICAgIHJldHVybiBzY2hlZHVsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBjcmVhdGUobm9kZSwgaWQsIHNlbGYpIHsKICAgICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICAgICAgdHdlZW47CgogICAgICAvLyBJbml0aWFsaXplIHRoZSBzZWxmIHRpbWVyIHdoZW4gdGhlIHRyYW5zaXRpb24gaXMgY3JlYXRlZC4KICAgICAgLy8gTm90ZSB0aGUgYWN0dWFsIGRlbGF5IGlzIG5vdCBrbm93biB1bnRpbCB0aGUgZmlyc3QgY2FsbGJhY2shCiAgICAgIHNjaGVkdWxlc1tpZF0gPSBzZWxmOwogICAgICBzZWxmLnRpbWVyID0gdGltZXIkMShzY2hlZHVsZSwgMCwgc2VsZi50aW1lKTsKCiAgICAgIGZ1bmN0aW9uIHNjaGVkdWxlKGVsYXBzZWQpIHsKICAgICAgICBzZWxmLnN0YXRlID0gU0NIRURVTEVEOwogICAgICAgIHNlbGYudGltZXIucmVzdGFydChzdGFydCwgc2VsZi5kZWxheSwgc2VsZi50aW1lKTsKCiAgICAgICAgLy8gSWYgdGhlIGVsYXBzZWQgZGVsYXkgaXMgbGVzcyB0aGFuIG91ciBmaXJzdCBzbGVlcCwgc3RhcnQgaW1tZWRpYXRlbHkuCiAgICAgICAgaWYgKHNlbGYuZGVsYXkgPD0gZWxhcHNlZCkgc3RhcnQoZWxhcHNlZCAtIHNlbGYuZGVsYXkpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBzdGFydChlbGFwc2VkKSB7CiAgICAgICAgdmFyIGksIGosIG4sIG87CgogICAgICAgIC8vIElmIHRoZSBzdGF0ZSBpcyBub3QgU0NIRURVTEVELCB0aGVuIHdlIHByZXZpb3VzbHkgZXJyb3JlZCBvbiBzdGFydC4KICAgICAgICBpZiAoc2VsZi5zdGF0ZSAhPT0gU0NIRURVTEVEKSByZXR1cm4gc3RvcCgpOwoKICAgICAgICBmb3IgKGkgaW4gc2NoZWR1bGVzKSB7CiAgICAgICAgICBvID0gc2NoZWR1bGVzW2ldOwogICAgICAgICAgaWYgKG8ubmFtZSAhPT0gc2VsZi5uYW1lKSBjb250aW51ZTsKCiAgICAgICAgICAvLyBXaGlsZSB0aGlzIGVsZW1lbnQgYWxyZWFkeSBoYXMgYSBzdGFydGluZyB0cmFuc2l0aW9uIGR1cmluZyB0aGlzIGZyYW1lLAogICAgICAgICAgLy8gZGVmZXIgc3RhcnRpbmcgYW4gaW50ZXJydXB0aW5nIHRyYW5zaXRpb24gdW50aWwgdGhhdCB0cmFuc2l0aW9uIGhhcyBhCiAgICAgICAgICAvLyBjaGFuY2UgdG8gdGljayAoYW5kIHBvc3NpYmx5IGVuZCk7IHNlZSBkMy9kMy10cmFuc2l0aW9uIzU0IQogICAgICAgICAgaWYgKG8uc3RhdGUgPT09IFNUQVJURUQpIHJldHVybiB0aW1lb3V0JDEoc3RhcnQpOwoKICAgICAgICAgIC8vIEludGVycnVwdCB0aGUgYWN0aXZlIHRyYW5zaXRpb24sIGlmIGFueS4KICAgICAgICAgIGlmIChvLnN0YXRlID09PSBSVU5OSU5HKSB7CiAgICAgICAgICAgIG8uc3RhdGUgPSBFTkRFRDsKICAgICAgICAgICAgby50aW1lci5zdG9wKCk7CiAgICAgICAgICAgIG8ub24uY2FsbCgiaW50ZXJydXB0Iiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgby5pbmRleCwgby5ncm91cCk7CiAgICAgICAgICAgIGRlbGV0ZSBzY2hlZHVsZXNbaV07CiAgICAgICAgICB9CgogICAgICAgICAgLy8gQ2FuY2VsIGFueSBwcmUtZW1wdGVkIHRyYW5zaXRpb25zLgogICAgICAgICAgZWxzZSBpZiAoK2kgPCBpZCkgewogICAgICAgICAgICBvLnN0YXRlID0gRU5ERUQ7CiAgICAgICAgICAgIG8udGltZXIuc3RvcCgpOwogICAgICAgICAgICBvLm9uLmNhbGwoImNhbmNlbCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIG8uaW5kZXgsIG8uZ3JvdXApOwogICAgICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgLy8gRGVmZXIgdGhlIGZpcnN0IHRpY2sgdG8gZW5kIG9mIHRoZSBjdXJyZW50IGZyYW1lOyBzZWUgZDMvZDMjMTU3Ni4KICAgICAgICAvLyBOb3RlIHRoZSB0cmFuc2l0aW9uIG1heSBiZSBjYW5jZWxlZCBhZnRlciBzdGFydCBhbmQgYmVmb3JlIHRoZSBmaXJzdCB0aWNrIQogICAgICAgIC8vIE5vdGUgdGhpcyBtdXN0IGJlIHNjaGVkdWxlZCBiZWZvcmUgdGhlIHN0YXJ0IGV2ZW50OyBzZWUgZDMvZDMtdHJhbnNpdGlvbiMxNiEKICAgICAgICAvLyBBc3N1bWluZyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHN1YnNlcXVlbnQgY2FsbGJhY2tzIGdvIHN0cmFpZ2h0IHRvIHRpY2suCiAgICAgICAgdGltZW91dCQxKGZ1bmN0aW9uKCkgewogICAgICAgICAgaWYgKHNlbGYuc3RhdGUgPT09IFNUQVJURUQpIHsKICAgICAgICAgICAgc2VsZi5zdGF0ZSA9IFJVTk5JTkc7CiAgICAgICAgICAgIHNlbGYudGltZXIucmVzdGFydCh0aWNrLCBzZWxmLmRlbGF5LCBzZWxmLnRpbWUpOwogICAgICAgICAgICB0aWNrKGVsYXBzZWQpOwogICAgICAgICAgfQogICAgICAgIH0pOwoKICAgICAgICAvLyBEaXNwYXRjaCB0aGUgc3RhcnQgZXZlbnQuCiAgICAgICAgLy8gTm90ZSB0aGlzIG11c3QgYmUgZG9uZSBiZWZvcmUgdGhlIHR3ZWVuIGFyZSBpbml0aWFsaXplZC4KICAgICAgICBzZWxmLnN0YXRlID0gU1RBUlRJTkc7CiAgICAgICAgc2VsZi5vbi5jYWxsKCJzdGFydCIsIG5vZGUsIG5vZGUuX19kYXRhX18sIHNlbGYuaW5kZXgsIHNlbGYuZ3JvdXApOwogICAgICAgIGlmIChzZWxmLnN0YXRlICE9PSBTVEFSVElORykgcmV0dXJuOyAvLyBpbnRlcnJ1cHRlZAogICAgICAgIHNlbGYuc3RhdGUgPSBTVEFSVEVEOwoKICAgICAgICAvLyBJbml0aWFsaXplIHRoZSB0d2VlbiwgZGVsZXRpbmcgbnVsbCB0d2Vlbi4KICAgICAgICB0d2VlbiA9IG5ldyBBcnJheShuID0gc2VsZi50d2Vlbi5sZW5ndGgpOwogICAgICAgIGZvciAoaSA9IDAsIGogPSAtMTsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG8gPSBzZWxmLnR3ZWVuW2ldLnZhbHVlLmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCkpIHsKICAgICAgICAgICAgdHdlZW5bKytqXSA9IG87CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHR3ZWVuLmxlbmd0aCA9IGogKyAxOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0aWNrKGVsYXBzZWQpIHsKICAgICAgICB2YXIgdCA9IGVsYXBzZWQgPCBzZWxmLmR1cmF0aW9uID8gc2VsZi5lYXNlLmNhbGwobnVsbCwgZWxhcHNlZCAvIHNlbGYuZHVyYXRpb24pIDogKHNlbGYudGltZXIucmVzdGFydChzdG9wKSwgc2VsZi5zdGF0ZSA9IEVORElORywgMSksCiAgICAgICAgICAgIGkgPSAtMSwKICAgICAgICAgICAgbiA9IHR3ZWVuLmxlbmd0aDsKCiAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgIHR3ZWVuW2ldLmNhbGwobm9kZSwgdCk7CiAgICAgICAgfQoKICAgICAgICAvLyBEaXNwYXRjaCB0aGUgZW5kIGV2ZW50LgogICAgICAgIGlmIChzZWxmLnN0YXRlID09PSBFTkRJTkcpIHsKICAgICAgICAgIHNlbGYub24uY2FsbCgiZW5kIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2VsZi5pbmRleCwgc2VsZi5ncm91cCk7CiAgICAgICAgICBzdG9wKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiBzdG9wKCkgewogICAgICAgIHNlbGYuc3RhdGUgPSBFTkRFRDsKICAgICAgICBzZWxmLnRpbWVyLnN0b3AoKTsKICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2lkXTsKICAgICAgICBmb3IgKHZhciBpIGluIHNjaGVkdWxlcykgcmV0dXJuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzCiAgICAgICAgZGVsZXRlIG5vZGUuX190cmFuc2l0aW9uOwogICAgICB9CiAgICB9CgogICAgZnVuY3Rpb24gaW50ZXJydXB0KG5vZGUsIG5hbWUpIHsKICAgICAgdmFyIHNjaGVkdWxlcyA9IG5vZGUuX190cmFuc2l0aW9uLAogICAgICAgICAgc2NoZWR1bGUsCiAgICAgICAgICBhY3RpdmUsCiAgICAgICAgICBlbXB0eSA9IHRydWUsCiAgICAgICAgICBpOwoKICAgICAgaWYgKCFzY2hlZHVsZXMpIHJldHVybjsKCiAgICAgIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArICIiOwoKICAgICAgZm9yIChpIGluIHNjaGVkdWxlcykgewogICAgICAgIGlmICgoc2NoZWR1bGUgPSBzY2hlZHVsZXNbaV0pLm5hbWUgIT09IG5hbWUpIHsgZW1wdHkgPSBmYWxzZTsgY29udGludWU7IH0KICAgICAgICBhY3RpdmUgPSBzY2hlZHVsZS5zdGF0ZSA+IFNUQVJUSU5HICYmIHNjaGVkdWxlLnN0YXRlIDwgRU5ESU5HOwogICAgICAgIHNjaGVkdWxlLnN0YXRlID0gRU5ERUQ7CiAgICAgICAgc2NoZWR1bGUudGltZXIuc3RvcCgpOwogICAgICAgIHNjaGVkdWxlLm9uLmNhbGwoYWN0aXZlID8gImludGVycnVwdCIgOiAiY2FuY2VsIiwgbm9kZSwgbm9kZS5fX2RhdGFfXywgc2NoZWR1bGUuaW5kZXgsIHNjaGVkdWxlLmdyb3VwKTsKICAgICAgICBkZWxldGUgc2NoZWR1bGVzW2ldOwogICAgICB9CgogICAgICBpZiAoZW1wdHkpIGRlbGV0ZSBub2RlLl9fdHJhbnNpdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBzZWxlY3Rpb25faW50ZXJydXB0KG5hbWUpIHsKICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICBpbnRlcnJ1cHQodGhpcywgbmFtZSk7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIHR3ZWVuUmVtb3ZlKGlkLCBuYW1lKSB7CiAgICAgIHZhciB0d2VlbjAsIHR3ZWVuMTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKSwKICAgICAgICAgICAgdHdlZW4gPSBzY2hlZHVsZS50d2VlbjsKCiAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCB0d2VlbiB3aXRoIHRoZSBwcmV2aW91cyBub2RlLAogICAgICAgIC8vIGp1c3QgYXNzaWduIHRoZSB1cGRhdGVkIHNoYXJlZCB0d2VlbiBhbmQgd2XigJlyZSBkb25lIQogICAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgICBpZiAodHdlZW4gIT09IHR3ZWVuMCkgewogICAgICAgICAgdHdlZW4xID0gdHdlZW4wID0gdHdlZW47CiAgICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuMS5sZW5ndGg7IGkgPCBuOyArK2kpIHsKICAgICAgICAgICAgaWYgKHR3ZWVuMVtpXS5uYW1lID09PSBuYW1lKSB7CiAgICAgICAgICAgICAgdHdlZW4xID0gdHdlZW4xLnNsaWNlKCk7CiAgICAgICAgICAgICAgdHdlZW4xLnNwbGljZShpLCAxKTsKICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgc2NoZWR1bGUudHdlZW4gPSB0d2VlbjE7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gdHdlZW5GdW5jdGlvbihpZCwgbmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIHR3ZWVuMCwgdHdlZW4xOwogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzZXQkMSh0aGlzLCBpZCksCiAgICAgICAgICAgIHR3ZWVuID0gc2NoZWR1bGUudHdlZW47CgogICAgICAgIC8vIElmIHRoaXMgbm9kZSBzaGFyZWQgdHdlZW4gd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgdHdlZW4gYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKHR3ZWVuICE9PSB0d2VlbjApIHsKICAgICAgICAgIHR3ZWVuMSA9ICh0d2VlbjAgPSB0d2Vlbikuc2xpY2UoKTsKICAgICAgICAgIGZvciAodmFyIHQgPSB7bmFtZTogbmFtZSwgdmFsdWU6IHZhbHVlfSwgaSA9IDAsIG4gPSB0d2VlbjEubGVuZ3RoOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICAgIGlmICh0d2VlbjFbaV0ubmFtZSA9PT0gbmFtZSkgewogICAgICAgICAgICAgIHR3ZWVuMVtpXSA9IHQ7CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICAgIGlmIChpID09PSBuKSB0d2VlbjEucHVzaCh0KTsKICAgICAgICB9CgogICAgICAgIHNjaGVkdWxlLnR3ZWVuID0gdHdlZW4xOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHdlZW4obmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICBuYW1lICs9ICIiOwoKICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPCAyKSB7CiAgICAgICAgdmFyIHR3ZWVuID0gZ2V0JDEodGhpcy5ub2RlKCksIGlkKS50d2VlbjsKICAgICAgICBmb3IgKHZhciBpID0gMCwgbiA9IHR3ZWVuLmxlbmd0aCwgdDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKCh0ID0gdHdlZW5baV0pLm5hbWUgPT09IG5hbWUpIHsKICAgICAgICAgICAgcmV0dXJuIHQudmFsdWU7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBudWxsOwogICAgICB9CgogICAgICByZXR1cm4gdGhpcy5lYWNoKCh2YWx1ZSA9PSBudWxsID8gdHdlZW5SZW1vdmUgOiB0d2VlbkZ1bmN0aW9uKShpZCwgbmFtZSwgdmFsdWUpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0d2VlblZhbHVlKHRyYW5zaXRpb24sIG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRyYW5zaXRpb24uX2lkOwoKICAgICAgdHJhbnNpdGlvbi5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKTsKICAgICAgICAoc2NoZWR1bGUudmFsdWUgfHwgKHNjaGVkdWxlLnZhbHVlID0ge30pKVtuYW1lXSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH0pOwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKG5vZGUpIHsKICAgICAgICByZXR1cm4gZ2V0JDEobm9kZSwgaWQpLnZhbHVlW25hbWVdOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGludGVycG9sYXRlKGEsIGIpIHsKICAgICAgdmFyIGM7CiAgICAgIHJldHVybiAodHlwZW9mIGIgPT09ICJudW1iZXIiID8gaW50ZXJwb2xhdGVOdW1iZXIKICAgICAgICAgIDogYiBpbnN0YW5jZW9mIGNvbG9yID8gaW50ZXJwb2xhdGVSZ2IKICAgICAgICAgIDogKGMgPSBjb2xvcihiKSkgPyAoYiA9IGMsIGludGVycG9sYXRlUmdiKQogICAgICAgICAgOiBpbnRlcnBvbGF0ZVN0cmluZykoYSwgYik7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clJlbW92ZSQxKG5hbWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMucmVtb3ZlQXR0cmlidXRlKG5hbWUpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJSZW1vdmVOUyQxKGZ1bGxuYW1lKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLnJlbW92ZUF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckNvbnN0YW50JDEobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJDb25zdGFudE5TJDEoZnVsbG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZTEpIHsKICAgICAgdmFyIHN0cmluZzAwLAogICAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uJDEobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxOwogICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGUobmFtZSk7CiAgICAgICAgc3RyaW5nMCA9IHRoaXMuZ2V0QXR0cmlidXRlKG5hbWUpOwogICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgICByZXR1cm4gc3RyaW5nMCA9PT0gc3RyaW5nMSA/IG51bGwKICAgICAgICAgICAgOiBzdHJpbmcwID09PSBzdHJpbmcwMCAmJiBzdHJpbmcxID09PSBzdHJpbmcxMCA/IGludGVycG9sYXRlMAogICAgICAgICAgICA6IChzdHJpbmcxMCA9IHN0cmluZzEsIGludGVycG9sYXRlMCA9IGludGVycG9sYXRlKHN0cmluZzAwID0gc3RyaW5nMCwgdmFsdWUxKSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckZ1bmN0aW9uTlMkMShmdWxsbmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAsIHZhbHVlMSA9IHZhbHVlKHRoaXMpLCBzdHJpbmcxOwogICAgICAgIGlmICh2YWx1ZTEgPT0gbnVsbCkgcmV0dXJuIHZvaWQgdGhpcy5yZW1vdmVBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwpOwogICAgICAgIHN0cmluZzAgPSB0aGlzLmdldEF0dHJpYnV0ZU5TKGZ1bGxuYW1lLnNwYWNlLCBmdWxsbmFtZS5sb2NhbCk7CiAgICAgICAgc3RyaW5nMSA9IHZhbHVlMSArICIiOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogKHN0cmluZzEwID0gc3RyaW5nMSwgaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCB2YWx1ZTEpKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2F0dHIobmFtZSwgdmFsdWUpIHsKICAgICAgdmFyIGZ1bGxuYW1lID0gbmFtZXNwYWNlKG5hbWUpLCBpID0gZnVsbG5hbWUgPT09ICJ0cmFuc2Zvcm0iID8gaW50ZXJwb2xhdGVUcmFuc2Zvcm1TdmcgOiBpbnRlcnBvbGF0ZTsKICAgICAgcmV0dXJuIHRoaXMuYXR0clR3ZWVuKG5hbWUsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyRnVuY3Rpb25OUyQxIDogYXR0ckZ1bmN0aW9uJDEpKGZ1bGxuYW1lLCBpLCB0d2VlblZhbHVlKHRoaXMsICJhdHRyLiIgKyBuYW1lLCB2YWx1ZSkpCiAgICAgICAgICA6IHZhbHVlID09IG51bGwgPyAoZnVsbG5hbWUubG9jYWwgPyBhdHRyUmVtb3ZlTlMkMSA6IGF0dHJSZW1vdmUkMSkoZnVsbG5hbWUpCiAgICAgICAgICA6IChmdWxsbmFtZS5sb2NhbCA/IGF0dHJDb25zdGFudE5TJDEgOiBhdHRyQ29uc3RhbnQkMSkoZnVsbG5hbWUsIGksIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gYXR0ckludGVycG9sYXRlKG5hbWUsIGkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0aGlzLnNldEF0dHJpYnV0ZShuYW1lLCBpLmNhbGwodGhpcywgdCkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJJbnRlcnBvbGF0ZU5TKGZ1bGxuYW1lLCBpKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zZXRBdHRyaWJ1dGVOUyhmdWxsbmFtZS5zcGFjZSwgZnVsbG5hbWUubG9jYWwsIGkuY2FsbCh0aGlzLCB0KSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gYXR0clR3ZWVuTlMoZnVsbG5hbWUsIHZhbHVlKSB7CiAgICAgIHZhciB0MCwgaTA7CiAgICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAoaSAhPT0gaTApIHQwID0gKGkwID0gaSkgJiYgYXR0ckludGVycG9sYXRlTlMoZnVsbG5hbWUsIGkpOwogICAgICAgIHJldHVybiB0MDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIGF0dHJUd2VlbihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIgdDAsIGkwOwogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIGF0dHJJbnRlcnBvbGF0ZShuYW1lLCBpKTsKICAgICAgICByZXR1cm4gdDA7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2F0dHJUd2VlbihuYW1lLCB2YWx1ZSkgewogICAgICB2YXIga2V5ID0gImF0dHIuIiArIG5hbWU7CiAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoIDwgMikgcmV0dXJuIChrZXkgPSB0aGlzLnR3ZWVuKGtleSkpICYmIGtleS5fdmFsdWU7CiAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm4gdGhpcy50d2VlbihrZXksIG51bGwpOwogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHZhciBmdWxsbmFtZSA9IG5hbWVzcGFjZShuYW1lKTsKICAgICAgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCAoZnVsbG5hbWUubG9jYWwgPyBhdHRyVHdlZW5OUyA6IGF0dHJUd2VlbikoZnVsbG5hbWUsIHZhbHVlKSk7CiAgICB9CgogICAgZnVuY3Rpb24gZGVsYXlGdW5jdGlvbihpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIGluaXQodGhpcywgaWQpLmRlbGF5ID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZGVsYXlDb25zdGFudChpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsKICAgICAgICBpbml0KHRoaXMsIGlkKS5kZWxheSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZGVsYXkodmFsdWUpIHsKICAgICAgdmFyIGlkID0gdGhpcy5faWQ7CgogICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aAogICAgICAgICAgPyB0aGlzLmVhY2goKHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgICAgID8gZGVsYXlGdW5jdGlvbgogICAgICAgICAgICAgIDogZGVsYXlDb25zdGFudCkoaWQsIHZhbHVlKSkKICAgICAgICAgIDogZ2V0JDEodGhpcy5ub2RlKCksIGlkKS5kZWxheTsKICAgIH0KCiAgICBmdW5jdGlvbiBkdXJhdGlvbkZ1bmN0aW9uKGlkLCB2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgc2V0JDEodGhpcywgaWQpLmR1cmF0aW9uID0gK3ZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gZHVyYXRpb25Db25zdGFudChpZCwgdmFsdWUpIHsKICAgICAgcmV0dXJuIHZhbHVlID0gK3ZhbHVlLCBmdW5jdGlvbigpIHsKICAgICAgICBzZXQkMSh0aGlzLCBpZCkuZHVyYXRpb24gPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2R1cmF0aW9uKHZhbHVlKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGgKICAgICAgICAgID8gdGhpcy5lYWNoKCh0eXBlb2YgdmFsdWUgPT09ICJmdW5jdGlvbiIKICAgICAgICAgICAgICA/IGR1cmF0aW9uRnVuY3Rpb24KICAgICAgICAgICAgICA6IGR1cmF0aW9uQ29uc3RhbnQpKGlkLCB2YWx1ZSkpCiAgICAgICAgICA6IGdldCQxKHRoaXMubm9kZSgpLCBpZCkuZHVyYXRpb247CiAgICB9CgogICAgZnVuY3Rpb24gZWFzZUNvbnN0YW50KGlkLCB2YWx1ZSkgewogICAgICBpZiAodHlwZW9mIHZhbHVlICE9PSAiZnVuY3Rpb24iKSB0aHJvdyBuZXcgRXJyb3I7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICBzZXQkMSh0aGlzLCBpZCkuZWFzZSA9IHZhbHVlOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZWFzZSh2YWx1ZSkgewogICAgICB2YXIgaWQgPSB0aGlzLl9pZDsKCiAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoCiAgICAgICAgICA/IHRoaXMuZWFjaChlYXNlQ29uc3RhbnQoaWQsIHZhbHVlKSkKICAgICAgICAgIDogZ2V0JDEodGhpcy5ub2RlKCksIGlkKS5lYXNlOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fZmlsdGVyKG1hdGNoKSB7CiAgICAgIGlmICh0eXBlb2YgbWF0Y2ggIT09ICJmdW5jdGlvbiIpIG1hdGNoID0gbWF0Y2hlcihtYXRjaCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gW10sIG5vZGUsIGkgPSAwOyBpIDwgbjsgKytpKSB7CiAgICAgICAgICBpZiAoKG5vZGUgPSBncm91cFtpXSkgJiYgbWF0Y2guY2FsbChub2RlLCBub2RlLl9fZGF0YV9fLCBpLCBncm91cCkpIHsKICAgICAgICAgICAgc3ViZ3JvdXAucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX21lcmdlKHRyYW5zaXRpb24pIHsKICAgICAgaWYgKHRyYW5zaXRpb24uX2lkICE9PSB0aGlzLl9pZCkgdGhyb3cgbmV3IEVycm9yOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzMCA9IHRoaXMuX2dyb3VwcywgZ3JvdXBzMSA9IHRyYW5zaXRpb24uX2dyb3VwcywgbTAgPSBncm91cHMwLmxlbmd0aCwgbTEgPSBncm91cHMxLmxlbmd0aCwgbSA9IE1hdGgubWluKG0wLCBtMSksIG1lcmdlcyA9IG5ldyBBcnJheShtMCksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAwID0gZ3JvdXBzMFtqXSwgZ3JvdXAxID0gZ3JvdXBzMVtqXSwgbiA9IGdyb3VwMC5sZW5ndGgsIG1lcmdlID0gbWVyZ2VzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cDBbaV0gfHwgZ3JvdXAxW2ldKSB7CiAgICAgICAgICAgIG1lcmdlW2ldID0gbm9kZTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIGZvciAoOyBqIDwgbTA7ICsraikgewogICAgICAgIG1lcmdlc1tqXSA9IGdyb3VwczBbal07CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihtZXJnZXMsIHRoaXMuX3BhcmVudHMsIHRoaXMuX25hbWUsIHRoaXMuX2lkKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdGFydChuYW1lKSB7CiAgICAgIHJldHVybiAobmFtZSArICIiKS50cmltKCkuc3BsaXQoL158XHMrLykuZXZlcnkoZnVuY3Rpb24odCkgewogICAgICAgIHZhciBpID0gdC5pbmRleE9mKCIuIik7CiAgICAgICAgaWYgKGkgPj0gMCkgdCA9IHQuc2xpY2UoMCwgaSk7CiAgICAgICAgcmV0dXJuICF0IHx8IHQgPT09ICJzdGFydCI7CiAgICAgIH0pOwogICAgfQoKICAgIGZ1bmN0aW9uIG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBvbjAsIG9uMSwgc2l0ID0gc3RhcnQobmFtZSkgPyBpbml0IDogc2V0JDE7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2NoZWR1bGUgPSBzaXQodGhpcywgaWQpLAogICAgICAgICAgICBvbiA9IHNjaGVkdWxlLm9uOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKG9uICE9PSBvbjApIChvbjEgPSAob24wID0gb24pLmNvcHkoKSkub24obmFtZSwgbGlzdGVuZXIpOwoKICAgICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX29uKG5hbWUsIGxpc3RlbmVyKSB7CiAgICAgIHZhciBpZCA9IHRoaXMuX2lkOwoKICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPCAyCiAgICAgICAgICA/IGdldCQxKHRoaXMubm9kZSgpLCBpZCkub24ub24obmFtZSkKICAgICAgICAgIDogdGhpcy5lYWNoKG9uRnVuY3Rpb24oaWQsIG5hbWUsIGxpc3RlbmVyKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcmVtb3ZlRnVuY3Rpb24oaWQpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBwYXJlbnQgPSB0aGlzLnBhcmVudE5vZGU7CiAgICAgICAgZm9yICh2YXIgaSBpbiB0aGlzLl9fdHJhbnNpdGlvbikgaWYgKCtpICE9PSBpZCkgcmV0dXJuOwogICAgICAgIGlmIChwYXJlbnQpIHBhcmVudC5yZW1vdmVDaGlsZCh0aGlzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3JlbW92ZSgpIHsKICAgICAgcmV0dXJuIHRoaXMub24oImVuZC5yZW1vdmUiLCByZW1vdmVGdW5jdGlvbih0aGlzLl9pZCkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0KHNlbGVjdCkgewogICAgICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsCiAgICAgICAgICBpZCA9IHRoaXMuX2lkOwoKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBuZXcgQXJyYXkobSksIGogPSAwOyBqIDwgbTsgKytqKSB7CiAgICAgICAgZm9yICh2YXIgZ3JvdXAgPSBncm91cHNbal0sIG4gPSBncm91cC5sZW5ndGgsIHN1Ymdyb3VwID0gc3ViZ3JvdXBzW2pdID0gbmV3IEFycmF5KG4pLCBub2RlLCBzdWJub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKChub2RlID0gZ3JvdXBbaV0pICYmIChzdWJub2RlID0gc2VsZWN0LmNhbGwobm9kZSwgbm9kZS5fX2RhdGFfXywgaSwgZ3JvdXApKSkgewogICAgICAgICAgICBpZiAoIl9fZGF0YV9fIiBpbiBub2RlKSBzdWJub2RlLl9fZGF0YV9fID0gbm9kZS5fX2RhdGFfXzsKICAgICAgICAgICAgc3ViZ3JvdXBbaV0gPSBzdWJub2RlOwogICAgICAgICAgICBzY2hlZHVsZShzdWJncm91cFtpXSwgbmFtZSwgaWQsIGksIHN1Ymdyb3VwLCBnZXQkMShub2RlLCBpZCkpOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKHN1Ymdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0QWxsKHNlbGVjdCkgewogICAgICB2YXIgbmFtZSA9IHRoaXMuX25hbWUsCiAgICAgICAgICBpZCA9IHRoaXMuX2lkOwoKICAgICAgaWYgKHR5cGVvZiBzZWxlY3QgIT09ICJmdW5jdGlvbiIpIHNlbGVjdCA9IHNlbGVjdG9yQWxsKHNlbGVjdCk7CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBzdWJncm91cHMgPSBbXSwgcGFyZW50cyA9IFtdLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBmb3IgKHZhciBjaGlsZHJlbiA9IHNlbGVjdC5jYWxsKG5vZGUsIG5vZGUuX19kYXRhX18sIGksIGdyb3VwKSwgY2hpbGQsIGluaGVyaXQgPSBnZXQkMShub2RlLCBpZCksIGsgPSAwLCBsID0gY2hpbGRyZW4ubGVuZ3RoOyBrIDwgbDsgKytrKSB7CiAgICAgICAgICAgICAgaWYgKGNoaWxkID0gY2hpbGRyZW5ba10pIHsKICAgICAgICAgICAgICAgIHNjaGVkdWxlKGNoaWxkLCBuYW1lLCBpZCwgaywgY2hpbGRyZW4sIGluaGVyaXQpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdWJncm91cHMucHVzaChjaGlsZHJlbik7CiAgICAgICAgICAgIHBhcmVudHMucHVzaChub2RlKTsKICAgICAgICAgIH0KICAgICAgICB9CiAgICAgIH0KCiAgICAgIHJldHVybiBuZXcgVHJhbnNpdGlvbihzdWJncm91cHMsIHBhcmVudHMsIG5hbWUsIGlkKTsKICAgIH0KCiAgICB2YXIgU2VsZWN0aW9uJDEgPSBzZWxlY3Rpb24ucHJvdG90eXBlLmNvbnN0cnVjdG9yOwoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc2VsZWN0aW9uKCkgewogICAgICByZXR1cm4gbmV3IFNlbGVjdGlvbiQxKHRoaXMuX2dyb3VwcywgdGhpcy5fcGFyZW50cyk7CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVOdWxsKG5hbWUsIGludGVycG9sYXRlKSB7CiAgICAgIHZhciBzdHJpbmcwMCwKICAgICAgICAgIHN0cmluZzEwLAogICAgICAgICAgaW50ZXJwb2xhdGUwOwogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHN0cmluZzAgPSBzdHlsZVZhbHVlKHRoaXMsIG5hbWUpLAogICAgICAgICAgICBzdHJpbmcxID0gKHRoaXMuc3R5bGUucmVtb3ZlUHJvcGVydHkobmFtZSksIHN0eWxlVmFsdWUodGhpcywgbmFtZSkpOwogICAgICAgIHJldHVybiBzdHJpbmcwID09PSBzdHJpbmcxID8gbnVsbAogICAgICAgICAgICA6IHN0cmluZzAgPT09IHN0cmluZzAwICYmIHN0cmluZzEgPT09IHN0cmluZzEwID8gaW50ZXJwb2xhdGUwCiAgICAgICAgICAgIDogaW50ZXJwb2xhdGUwID0gaW50ZXJwb2xhdGUoc3RyaW5nMDAgPSBzdHJpbmcwLCBzdHJpbmcxMCA9IHN0cmluZzEpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlUmVtb3ZlJDEobmFtZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUNvbnN0YW50JDEobmFtZSwgaW50ZXJwb2xhdGUsIHZhbHVlMSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxID0gdmFsdWUxICsgIiIsCiAgICAgICAgICBpbnRlcnBvbGF0ZTA7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc3RyaW5nMCA9IHN0eWxlVmFsdWUodGhpcywgbmFtZSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSk7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gc3R5bGVGdW5jdGlvbiQxKG5hbWUsIGludGVycG9sYXRlLCB2YWx1ZSkgewogICAgICB2YXIgc3RyaW5nMDAsCiAgICAgICAgICBzdHJpbmcxMCwKICAgICAgICAgIGludGVycG9sYXRlMDsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzdHJpbmcwID0gc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSwKICAgICAgICAgICAgdmFsdWUxID0gdmFsdWUodGhpcyksCiAgICAgICAgICAgIHN0cmluZzEgPSB2YWx1ZTEgKyAiIjsKICAgICAgICBpZiAodmFsdWUxID09IG51bGwpIHN0cmluZzEgPSB2YWx1ZTEgPSAodGhpcy5zdHlsZS5yZW1vdmVQcm9wZXJ0eShuYW1lKSwgc3R5bGVWYWx1ZSh0aGlzLCBuYW1lKSk7CiAgICAgICAgcmV0dXJuIHN0cmluZzAgPT09IHN0cmluZzEgPyBudWxsCiAgICAgICAgICAgIDogc3RyaW5nMCA9PT0gc3RyaW5nMDAgJiYgc3RyaW5nMSA9PT0gc3RyaW5nMTAgPyBpbnRlcnBvbGF0ZTAKICAgICAgICAgICAgOiAoc3RyaW5nMTAgPSBzdHJpbmcxLCBpbnRlcnBvbGF0ZTAgPSBpbnRlcnBvbGF0ZShzdHJpbmcwMCA9IHN0cmluZzAsIHZhbHVlMSkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHN0eWxlTWF5YmVSZW1vdmUoaWQsIG5hbWUpIHsKICAgICAgdmFyIG9uMCwgb24xLCBsaXN0ZW5lcjAsIGtleSA9ICJzdHlsZS4iICsgbmFtZSwgZXZlbnQgPSAiZW5kLiIgKyBrZXksIHJlbW92ZTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHZhciBzY2hlZHVsZSA9IHNldCQxKHRoaXMsIGlkKSwKICAgICAgICAgICAgb24gPSBzY2hlZHVsZS5vbiwKICAgICAgICAgICAgbGlzdGVuZXIgPSBzY2hlZHVsZS52YWx1ZVtrZXldID09IG51bGwgPyByZW1vdmUgfHwgKHJlbW92ZSA9IHN0eWxlUmVtb3ZlJDEobmFtZSkpIDogdW5kZWZpbmVkOwoKICAgICAgICAvLyBJZiB0aGlzIG5vZGUgc2hhcmVkIGEgZGlzcGF0Y2ggd2l0aCB0aGUgcHJldmlvdXMgbm9kZSwKICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAvLyBPdGhlcndpc2UsIGNvcHktb24td3JpdGUuCiAgICAgICAgaWYgKG9uICE9PSBvbjAgfHwgbGlzdGVuZXIwICE9PSBsaXN0ZW5lcikgKG9uMSA9IChvbjAgPSBvbikuY29weSgpKS5vbihldmVudCwgbGlzdGVuZXIwID0gbGlzdGVuZXIpOwoKICAgICAgICBzY2hlZHVsZS5vbiA9IG9uMTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3N0eWxlKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICB2YXIgaSA9IChuYW1lICs9ICIiKSA9PT0gInRyYW5zZm9ybSIgPyBpbnRlcnBvbGF0ZVRyYW5zZm9ybUNzcyA6IGludGVycG9sYXRlOwogICAgICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHRoaXMKICAgICAgICAgIC5zdHlsZVR3ZWVuKG5hbWUsIHN0eWxlTnVsbChuYW1lLCBpKSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBzdHlsZVJlbW92ZSQxKG5hbWUpKQogICAgICAgIDogdHlwZW9mIHZhbHVlID09PSAiZnVuY3Rpb24iID8gdGhpcwogICAgICAgICAgLnN0eWxlVHdlZW4obmFtZSwgc3R5bGVGdW5jdGlvbiQxKG5hbWUsIGksIHR3ZWVuVmFsdWUodGhpcywgInN0eWxlLiIgKyBuYW1lLCB2YWx1ZSkpKQogICAgICAgICAgLmVhY2goc3R5bGVNYXliZVJlbW92ZSh0aGlzLl9pZCwgbmFtZSkpCiAgICAgICAgOiB0aGlzCiAgICAgICAgICAuc3R5bGVUd2VlbihuYW1lLCBzdHlsZUNvbnN0YW50JDEobmFtZSwgaSwgdmFsdWUpLCBwcmlvcml0eSkKICAgICAgICAgIC5vbigiZW5kLnN0eWxlLiIgKyBuYW1lLCBudWxsKTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih0KSB7CiAgICAgICAgdGhpcy5zdHlsZS5zZXRQcm9wZXJ0eShuYW1lLCBpLmNhbGwodGhpcywgdCksIHByaW9yaXR5KTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBzdHlsZVR3ZWVuKG5hbWUsIHZhbHVlLCBwcmlvcml0eSkgewogICAgICB2YXIgdCwgaTA7CiAgICAgIGZ1bmN0aW9uIHR3ZWVuKCkgewogICAgICAgIHZhciBpID0gdmFsdWUuYXBwbHkodGhpcywgYXJndW1lbnRzKTsKICAgICAgICBpZiAoaSAhPT0gaTApIHQgPSAoaTAgPSBpKSAmJiBzdHlsZUludGVycG9sYXRlKG5hbWUsIGksIHByaW9yaXR5KTsKICAgICAgICByZXR1cm4gdDsKICAgICAgfQogICAgICB0d2Vlbi5fdmFsdWUgPSB2YWx1ZTsKICAgICAgcmV0dXJuIHR3ZWVuOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fc3R5bGVUd2VlbihuYW1lLCB2YWx1ZSwgcHJpb3JpdHkpIHsKICAgICAgdmFyIGtleSA9ICJzdHlsZS4iICsgKG5hbWUgKz0gIiIpOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDIpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHN0eWxlVHdlZW4obmFtZSwgdmFsdWUsIHByaW9yaXR5ID09IG51bGwgPyAiIiA6IHByaW9yaXR5KSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dENvbnN0YW50JDEodmFsdWUpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiB0ZXh0RnVuY3Rpb24kMSh2YWx1ZSkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlMSA9IHZhbHVlKHRoaXMpOwogICAgICAgIHRoaXMudGV4dENvbnRlbnQgPSB2YWx1ZTEgPT0gbnVsbCA/ICIiIDogdmFsdWUxOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdGV4dCh2YWx1ZSkgewogICAgICByZXR1cm4gdGhpcy50d2VlbigidGV4dCIsIHR5cGVvZiB2YWx1ZSA9PT0gImZ1bmN0aW9uIgogICAgICAgICAgPyB0ZXh0RnVuY3Rpb24kMSh0d2VlblZhbHVlKHRoaXMsICJ0ZXh0IiwgdmFsdWUpKQogICAgICAgICAgOiB0ZXh0Q29uc3RhbnQkMSh2YWx1ZSA9PSBudWxsID8gIiIgOiB2YWx1ZSArICIiKSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGV4dEludGVycG9sYXRlKGkpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQpIHsKICAgICAgICB0aGlzLnRleHRDb250ZW50ID0gaS5jYWxsKHRoaXMsIHQpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIHRleHRUd2Vlbih2YWx1ZSkgewogICAgICB2YXIgdDAsIGkwOwogICAgICBmdW5jdGlvbiB0d2VlbigpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7CiAgICAgICAgaWYgKGkgIT09IGkwKSB0MCA9IChpMCA9IGkpICYmIHRleHRJbnRlcnBvbGF0ZShpKTsKICAgICAgICByZXR1cm4gdDA7CiAgICAgIH0KICAgICAgdHdlZW4uX3ZhbHVlID0gdmFsdWU7CiAgICAgIHJldHVybiB0d2VlbjsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX3RleHRUd2Vlbih2YWx1ZSkgewogICAgICB2YXIga2V5ID0gInRleHQiOwogICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA8IDEpIHJldHVybiAoa2V5ID0gdGhpcy50d2VlbihrZXkpKSAmJiBrZXkuX3ZhbHVlOwogICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIHRoaXMudHdlZW4oa2V5LCBudWxsKTsKICAgICAgaWYgKHR5cGVvZiB2YWx1ZSAhPT0gImZ1bmN0aW9uIikgdGhyb3cgbmV3IEVycm9yOwogICAgICByZXR1cm4gdGhpcy50d2VlbihrZXksIHRleHRUd2Vlbih2YWx1ZSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIHRyYW5zaXRpb25fdHJhbnNpdGlvbigpIHsKICAgICAgdmFyIG5hbWUgPSB0aGlzLl9uYW1lLAogICAgICAgICAgaWQwID0gdGhpcy5faWQsCiAgICAgICAgICBpZDEgPSBuZXdJZCgpOwoKICAgICAgZm9yICh2YXIgZ3JvdXBzID0gdGhpcy5fZ3JvdXBzLCBtID0gZ3JvdXBzLmxlbmd0aCwgaiA9IDA7IGogPCBtOyArK2opIHsKICAgICAgICBmb3IgKHZhciBncm91cCA9IGdyb3Vwc1tqXSwgbiA9IGdyb3VwLmxlbmd0aCwgbm9kZSwgaSA9IDA7IGkgPCBuOyArK2kpIHsKICAgICAgICAgIGlmIChub2RlID0gZ3JvdXBbaV0pIHsKICAgICAgICAgICAgdmFyIGluaGVyaXQgPSBnZXQkMShub2RlLCBpZDApOwogICAgICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZDEsIGksIGdyb3VwLCB7CiAgICAgICAgICAgICAgdGltZTogaW5oZXJpdC50aW1lICsgaW5oZXJpdC5kZWxheSArIGluaGVyaXQuZHVyYXRpb24sCiAgICAgICAgICAgICAgZGVsYXk6IDAsCiAgICAgICAgICAgICAgZHVyYXRpb246IGluaGVyaXQuZHVyYXRpb24sCiAgICAgICAgICAgICAgZWFzZTogaW5oZXJpdC5lYXNlCiAgICAgICAgICAgIH0pOwogICAgICAgICAgfQogICAgICAgIH0KICAgICAgfQoKICAgICAgcmV0dXJuIG5ldyBUcmFuc2l0aW9uKGdyb3VwcywgdGhpcy5fcGFyZW50cywgbmFtZSwgaWQxKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uX2VuZCgpIHsKICAgICAgdmFyIG9uMCwgb24xLCB0aGF0ID0gdGhpcywgaWQgPSB0aGF0Ll9pZCwgc2l6ZSA9IHRoYXQuc2l6ZSgpOwogICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24ocmVzb2x2ZSwgcmVqZWN0KSB7CiAgICAgICAgdmFyIGNhbmNlbCA9IHt2YWx1ZTogcmVqZWN0fSwKICAgICAgICAgICAgZW5kID0ge3ZhbHVlOiBmdW5jdGlvbigpIHsgaWYgKC0tc2l6ZSA9PT0gMCkgcmVzb2x2ZSgpOyB9fTsKCiAgICAgICAgdGhhdC5lYWNoKGZ1bmN0aW9uKCkgewogICAgICAgICAgdmFyIHNjaGVkdWxlID0gc2V0JDEodGhpcywgaWQpLAogICAgICAgICAgICAgIG9uID0gc2NoZWR1bGUub247CgogICAgICAgICAgLy8gSWYgdGhpcyBub2RlIHNoYXJlZCBhIGRpc3BhdGNoIHdpdGggdGhlIHByZXZpb3VzIG5vZGUsCiAgICAgICAgICAvLyBqdXN0IGFzc2lnbiB0aGUgdXBkYXRlZCBzaGFyZWQgZGlzcGF0Y2ggYW5kIHdl4oCZcmUgZG9uZSEKICAgICAgICAgIC8vIE90aGVyd2lzZSwgY29weS1vbi13cml0ZS4KICAgICAgICAgIGlmIChvbiAhPT0gb24wKSB7CiAgICAgICAgICAgIG9uMSA9IChvbjAgPSBvbikuY29weSgpOwogICAgICAgICAgICBvbjEuXy5jYW5jZWwucHVzaChjYW5jZWwpOwogICAgICAgICAgICBvbjEuXy5pbnRlcnJ1cHQucHVzaChjYW5jZWwpOwogICAgICAgICAgICBvbjEuXy5lbmQucHVzaChlbmQpOwogICAgICAgICAgfQoKICAgICAgICAgIHNjaGVkdWxlLm9uID0gb24xOwogICAgICAgIH0pOwogICAgICB9KTsKICAgIH0KCiAgICB2YXIgaWQgPSAwOwoKICAgIGZ1bmN0aW9uIFRyYW5zaXRpb24oZ3JvdXBzLCBwYXJlbnRzLCBuYW1lLCBpZCkgewogICAgICB0aGlzLl9ncm91cHMgPSBncm91cHM7CiAgICAgIHRoaXMuX3BhcmVudHMgPSBwYXJlbnRzOwogICAgICB0aGlzLl9uYW1lID0gbmFtZTsKICAgICAgdGhpcy5faWQgPSBpZDsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2l0aW9uJDEobmFtZSkgewogICAgICByZXR1cm4gc2VsZWN0aW9uKCkudHJhbnNpdGlvbihuYW1lKTsKICAgIH0KCiAgICBmdW5jdGlvbiBuZXdJZCgpIHsKICAgICAgcmV0dXJuICsraWQ7CiAgICB9CgogICAgdmFyIHNlbGVjdGlvbl9wcm90b3R5cGUgPSBzZWxlY3Rpb24ucHJvdG90eXBlOwoKICAgIFRyYW5zaXRpb24ucHJvdG90eXBlID0gdHJhbnNpdGlvbiQxLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFRyYW5zaXRpb24sCiAgICAgIHNlbGVjdDogdHJhbnNpdGlvbl9zZWxlY3QsCiAgICAgIHNlbGVjdEFsbDogdHJhbnNpdGlvbl9zZWxlY3RBbGwsCiAgICAgIGZpbHRlcjogdHJhbnNpdGlvbl9maWx0ZXIsCiAgICAgIG1lcmdlOiB0cmFuc2l0aW9uX21lcmdlLAogICAgICBzZWxlY3Rpb246IHRyYW5zaXRpb25fc2VsZWN0aW9uLAogICAgICB0cmFuc2l0aW9uOiB0cmFuc2l0aW9uX3RyYW5zaXRpb24sCiAgICAgIGNhbGw6IHNlbGVjdGlvbl9wcm90b3R5cGUuY2FsbCwKICAgICAgbm9kZXM6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZXMsCiAgICAgIG5vZGU6IHNlbGVjdGlvbl9wcm90b3R5cGUubm9kZSwKICAgICAgc2l6ZTogc2VsZWN0aW9uX3Byb3RvdHlwZS5zaXplLAogICAgICBlbXB0eTogc2VsZWN0aW9uX3Byb3RvdHlwZS5lbXB0eSwKICAgICAgZWFjaDogc2VsZWN0aW9uX3Byb3RvdHlwZS5lYWNoLAogICAgICBvbjogdHJhbnNpdGlvbl9vbiwKICAgICAgYXR0cjogdHJhbnNpdGlvbl9hdHRyLAogICAgICBhdHRyVHdlZW46IHRyYW5zaXRpb25fYXR0clR3ZWVuLAogICAgICBzdHlsZTogdHJhbnNpdGlvbl9zdHlsZSwKICAgICAgc3R5bGVUd2VlbjogdHJhbnNpdGlvbl9zdHlsZVR3ZWVuLAogICAgICB0ZXh0OiB0cmFuc2l0aW9uX3RleHQsCiAgICAgIHRleHRUd2VlbjogdHJhbnNpdGlvbl90ZXh0VHdlZW4sCiAgICAgIHJlbW92ZTogdHJhbnNpdGlvbl9yZW1vdmUsCiAgICAgIHR3ZWVuOiB0cmFuc2l0aW9uX3R3ZWVuLAogICAgICBkZWxheTogdHJhbnNpdGlvbl9kZWxheSwKICAgICAgZHVyYXRpb246IHRyYW5zaXRpb25fZHVyYXRpb24sCiAgICAgIGVhc2U6IHRyYW5zaXRpb25fZWFzZSwKICAgICAgZW5kOiB0cmFuc2l0aW9uX2VuZAogICAgfTsKCiAgICBmdW5jdGlvbiBjdWJpY0luT3V0KHQpIHsKICAgICAgcmV0dXJuICgodCAqPSAyKSA8PSAxID8gdCAqIHQgKiB0IDogKHQgLT0gMikgKiB0ICogdCArIDIpIC8gMjsKICAgIH0KCiAgICB2YXIgZGVmYXVsdFRpbWluZyA9IHsKICAgICAgdGltZTogbnVsbCwgLy8gU2V0IG9uIHVzZS4KICAgICAgZGVsYXk6IDAsCiAgICAgIGR1cmF0aW9uOiAyNTAsCiAgICAgIGVhc2U6IGN1YmljSW5PdXQKICAgIH07CgogICAgZnVuY3Rpb24gaW5oZXJpdChub2RlLCBpZCkgewogICAgICB2YXIgdGltaW5nOwogICAgICB3aGlsZSAoISh0aW1pbmcgPSBub2RlLl9fdHJhbnNpdGlvbikgfHwgISh0aW1pbmcgPSB0aW1pbmdbaWRdKSkgewogICAgICAgIGlmICghKG5vZGUgPSBub2RlLnBhcmVudE5vZGUpKSB7CiAgICAgICAgICByZXR1cm4gZGVmYXVsdFRpbWluZy50aW1lID0gbm93KCksIGRlZmF1bHRUaW1pbmc7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiB0aW1pbmc7CiAgICB9CgogICAgZnVuY3Rpb24gc2VsZWN0aW9uX3RyYW5zaXRpb24obmFtZSkgewogICAgICB2YXIgaWQsCiAgICAgICAgICB0aW1pbmc7CgogICAgICBpZiAobmFtZSBpbnN0YW5jZW9mIFRyYW5zaXRpb24pIHsKICAgICAgICBpZCA9IG5hbWUuX2lkLCBuYW1lID0gbmFtZS5fbmFtZTsKICAgICAgfSBlbHNlIHsKICAgICAgICBpZCA9IG5ld0lkKCksICh0aW1pbmcgPSBkZWZhdWx0VGltaW5nKS50aW1lID0gbm93KCksIG5hbWUgPSBuYW1lID09IG51bGwgPyBudWxsIDogbmFtZSArICIiOwogICAgICB9CgogICAgICBmb3IgKHZhciBncm91cHMgPSB0aGlzLl9ncm91cHMsIG0gPSBncm91cHMubGVuZ3RoLCBqID0gMDsgaiA8IG07ICsraikgewogICAgICAgIGZvciAodmFyIGdyb3VwID0gZ3JvdXBzW2pdLCBuID0gZ3JvdXAubGVuZ3RoLCBub2RlLCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICAgaWYgKG5vZGUgPSBncm91cFtpXSkgewogICAgICAgICAgICBzY2hlZHVsZShub2RlLCBuYW1lLCBpZCwgaSwgZ3JvdXAsIHRpbWluZyB8fCBpbmhlcml0KG5vZGUsIGlkKSk7CiAgICAgICAgICB9CiAgICAgICAgfQogICAgICB9CgogICAgICByZXR1cm4gbmV3IFRyYW5zaXRpb24oZ3JvdXBzLCB0aGlzLl9wYXJlbnRzLCBuYW1lLCBpZCk7CiAgICB9CgogICAgc2VsZWN0aW9uLnByb3RvdHlwZS5pbnRlcnJ1cHQgPSBzZWxlY3Rpb25faW50ZXJydXB0OwogICAgc2VsZWN0aW9uLnByb3RvdHlwZS50cmFuc2l0aW9uID0gc2VsZWN0aW9uX3RyYW5zaXRpb247CgogICAgZnVuY3Rpb24gY29uc3RhbnQkMyh4KSB7CiAgICAgIHJldHVybiBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4geDsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBCcnVzaEV2ZW50KHRhcmdldCwgdHlwZSwgc2VsZWN0aW9uKSB7CiAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0OwogICAgICB0aGlzLnR5cGUgPSB0eXBlOwogICAgICB0aGlzLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjsKICAgIH0KCiAgICBmdW5jdGlvbiBub3Byb3BhZ2F0aW9uKCkgewogICAgICBldmVudC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTsKICAgIH0KCiAgICBmdW5jdGlvbiBub2V2ZW50JDEoKSB7CiAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7CiAgICAgIGV2ZW50LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwogICAgfQoKICAgIHZhciBNT0RFX0RSQUcgPSB7bmFtZTogImRyYWcifSwKICAgICAgICBNT0RFX1NQQUNFID0ge25hbWU6ICJzcGFjZSJ9LAogICAgICAgIE1PREVfSEFORExFID0ge25hbWU6ICJoYW5kbGUifSwKICAgICAgICBNT0RFX0NFTlRFUiA9IHtuYW1lOiAiY2VudGVyIn07CgogICAgZnVuY3Rpb24gbnVtYmVyMShlKSB7CiAgICAgIHJldHVybiBbK2VbMF0sICtlWzFdXTsKICAgIH0KCiAgICBmdW5jdGlvbiBudW1iZXIyKGUpIHsKICAgICAgcmV0dXJuIFtudW1iZXIxKGVbMF0pLCBudW1iZXIxKGVbMV0pXTsKICAgIH0KCiAgICBmdW5jdGlvbiB0b3VjaGVyKGlkZW50aWZpZXIpIHsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHRhcmdldCkgewogICAgICAgIHJldHVybiB0b3VjaCh0YXJnZXQsIGV2ZW50LnRvdWNoZXMsIGlkZW50aWZpZXIpOwogICAgICB9OwogICAgfQoKICAgIHZhciBYID0gewogICAgICBuYW1lOiAieCIsCiAgICAgIGhhbmRsZXM6IFsidyIsICJlIl0ubWFwKHR5cGUpLAogICAgICBpbnB1dDogZnVuY3Rpb24oeCwgZSkgeyByZXR1cm4geCA9PSBudWxsID8gbnVsbCA6IFtbK3hbMF0sIGVbMF1bMV1dLCBbK3hbMV0sIGVbMV1bMV1dXTsgfSwKICAgICAgb3V0cHV0OiBmdW5jdGlvbih4eSkgeyByZXR1cm4geHkgJiYgW3h5WzBdWzBdLCB4eVsxXVswXV07IH0KICAgIH07CgogICAgdmFyIFkgPSB7CiAgICAgIG5hbWU6ICJ5IiwKICAgICAgaGFuZGxlczogWyJuIiwgInMiXS5tYXAodHlwZSksCiAgICAgIGlucHV0OiBmdW5jdGlvbih5LCBlKSB7IHJldHVybiB5ID09IG51bGwgPyBudWxsIDogW1tlWzBdWzBdLCAreVswXV0sIFtlWzFdWzBdLCAreVsxXV1dOyB9LAogICAgICBvdXRwdXQ6IGZ1bmN0aW9uKHh5KSB7IHJldHVybiB4eSAmJiBbeHlbMF1bMV0sIHh5WzFdWzFdXTsgfQogICAgfTsKCiAgICB2YXIgY3Vyc29ycyA9IHsKICAgICAgb3ZlcmxheTogImNyb3NzaGFpciIsCiAgICAgIHNlbGVjdGlvbjogIm1vdmUiLAogICAgICBuOiAibnMtcmVzaXplIiwKICAgICAgZTogImV3LXJlc2l6ZSIsCiAgICAgIHM6ICJucy1yZXNpemUiLAogICAgICB3OiAiZXctcmVzaXplIiwKICAgICAgbnc6ICJud3NlLXJlc2l6ZSIsCiAgICAgIG5lOiAibmVzdy1yZXNpemUiLAogICAgICBzZTogIm53c2UtcmVzaXplIiwKICAgICAgc3c6ICJuZXN3LXJlc2l6ZSIKICAgIH07CgogICAgdmFyIGZsaXBYID0gewogICAgICBlOiAidyIsCiAgICAgIHc6ICJlIiwKICAgICAgbnc6ICJuZSIsCiAgICAgIG5lOiAibnciLAogICAgICBzZTogInN3IiwKICAgICAgc3c6ICJzZSIKICAgIH07CgogICAgdmFyIGZsaXBZID0gewogICAgICBuOiAicyIsCiAgICAgIHM6ICJuIiwKICAgICAgbnc6ICJzdyIsCiAgICAgIG5lOiAic2UiLAogICAgICBzZTogIm5lIiwKICAgICAgc3c6ICJudyIKICAgIH07CgogICAgdmFyIHNpZ25zWCA9IHsKICAgICAgb3ZlcmxheTogKzEsCiAgICAgIHNlbGVjdGlvbjogKzEsCiAgICAgIG46IG51bGwsCiAgICAgIGU6ICsxLAogICAgICBzOiBudWxsLAogICAgICB3OiAtMSwKICAgICAgbnc6IC0xLAogICAgICBuZTogKzEsCiAgICAgIHNlOiArMSwKICAgICAgc3c6IC0xCiAgICB9OwoKICAgIHZhciBzaWduc1kgPSB7CiAgICAgIG92ZXJsYXk6ICsxLAogICAgICBzZWxlY3Rpb246ICsxLAogICAgICBuOiAtMSwKICAgICAgZTogbnVsbCwKICAgICAgczogKzEsCiAgICAgIHc6IG51bGwsCiAgICAgIG53OiAtMSwKICAgICAgbmU6IC0xLAogICAgICBzZTogKzEsCiAgICAgIHN3OiArMQogICAgfTsKCiAgICBmdW5jdGlvbiB0eXBlKHQpIHsKICAgICAgcmV0dXJuIHt0eXBlOiB0fTsKICAgIH0KCiAgICAvLyBJZ25vcmUgcmlnaHQtY2xpY2ssIHNpbmNlIHRoYXQgc2hvdWxkIG9wZW4gdGhlIGNvbnRleHQgbWVudS4KICAgIGZ1bmN0aW9uIGRlZmF1bHRGaWx0ZXIoKSB7CiAgICAgIHJldHVybiAhZXZlbnQuY3RybEtleSAmJiAhZXZlbnQuYnV0dG9uOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRFeHRlbnQoKSB7CiAgICAgIHZhciBzdmcgPSB0aGlzLm93bmVyU1ZHRWxlbWVudCB8fCB0aGlzOwogICAgICBpZiAoc3ZnLmhhc0F0dHJpYnV0ZSgidmlld0JveCIpKSB7CiAgICAgICAgc3ZnID0gc3ZnLnZpZXdCb3guYmFzZVZhbDsKICAgICAgICByZXR1cm4gW1tzdmcueCwgc3ZnLnldLCBbc3ZnLnggKyBzdmcud2lkdGgsIHN2Zy55ICsgc3ZnLmhlaWdodF1dOwogICAgICB9CiAgICAgIHJldHVybiBbWzAsIDBdLCBbc3ZnLndpZHRoLmJhc2VWYWwudmFsdWUsIHN2Zy5oZWlnaHQuYmFzZVZhbC52YWx1ZV1dOwogICAgfQoKICAgIGZ1bmN0aW9uIGRlZmF1bHRUb3VjaGFibGUoKSB7CiAgICAgIHJldHVybiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgfHwgKCJvbnRvdWNoc3RhcnQiIGluIHRoaXMpOwogICAgfQoKICAgIC8vIExpa2UgZDMubG9jYWwsIGJ1dCB3aXRoIHRoZSBuYW1lIOKAnF9fYnJ1c2jigJ0gcmF0aGVyIHRoYW4gYXV0by1nZW5lcmF0ZWQuCiAgICBmdW5jdGlvbiBsb2NhbChub2RlKSB7CiAgICAgIHdoaWxlICghbm9kZS5fX2JydXNoKSBpZiAoIShub2RlID0gbm9kZS5wYXJlbnROb2RlKSkgcmV0dXJuOwogICAgICByZXR1cm4gbm9kZS5fX2JydXNoOwogICAgfQoKICAgIGZ1bmN0aW9uIGVtcHR5JDIoZXh0ZW50KSB7CiAgICAgIHJldHVybiBleHRlbnRbMF1bMF0gPT09IGV4dGVudFsxXVswXQogICAgICAgICAgfHwgZXh0ZW50WzBdWzFdID09PSBleHRlbnRbMV1bMV07CiAgICB9CgogICAgZnVuY3Rpb24gYnJ1c2hZKCkgewogICAgICByZXR1cm4gYnJ1c2goWSk7CiAgICB9CgogICAgZnVuY3Rpb24gYnJ1c2goZGltKSB7CiAgICAgIHZhciBleHRlbnQgPSBkZWZhdWx0RXh0ZW50LAogICAgICAgICAgZmlsdGVyID0gZGVmYXVsdEZpbHRlciwKICAgICAgICAgIHRvdWNoYWJsZSA9IGRlZmF1bHRUb3VjaGFibGUsCiAgICAgICAgICBrZXlzID0gdHJ1ZSwKICAgICAgICAgIGxpc3RlbmVycyA9IGRpc3BhdGNoJDMoInN0YXJ0IiwgImJydXNoIiwgImVuZCIpLAogICAgICAgICAgaGFuZGxlU2l6ZSA9IDYsCiAgICAgICAgICB0b3VjaGVuZGluZzsKCiAgICAgIGZ1bmN0aW9uIGJydXNoKGdyb3VwKSB7CiAgICAgICAgdmFyIG92ZXJsYXkgPSBncm91cAogICAgICAgICAgICAucHJvcGVydHkoIl9fYnJ1c2giLCBpbml0aWFsaXplKQogICAgICAgICAgLnNlbGVjdEFsbCgiLm92ZXJsYXkiKQogICAgICAgICAgLmRhdGEoW3R5cGUoIm92ZXJsYXkiKV0pOwoKICAgICAgICBvdmVybGF5LmVudGVyKCkuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgIm92ZXJsYXkiKQogICAgICAgICAgICAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIikKICAgICAgICAgICAgLmF0dHIoImN1cnNvciIsIGN1cnNvcnMub3ZlcmxheSkKICAgICAgICAgIC5tZXJnZShvdmVybGF5KQogICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICB2YXIgZXh0ZW50ID0gbG9jYWwodGhpcykuZXh0ZW50OwogICAgICAgICAgICAgIHNlbGVjdCQxKHRoaXMpCiAgICAgICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgICAgICAuYXR0cigieSIsIGV4dGVudFswXVsxXSkKICAgICAgICAgICAgICAgICAgLmF0dHIoIndpZHRoIiwgZXh0ZW50WzFdWzBdIC0gZXh0ZW50WzBdWzBdKQogICAgICAgICAgICAgICAgICAuYXR0cigiaGVpZ2h0IiwgZXh0ZW50WzFdWzFdIC0gZXh0ZW50WzBdWzFdKTsKICAgICAgICAgICAgfSk7CgogICAgICAgIGdyb3VwLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpCiAgICAgICAgICAuZGF0YShbdHlwZSgic2VsZWN0aW9uIildKQogICAgICAgICAgLmVudGVyKCkuYXBwZW5kKCJyZWN0IikKICAgICAgICAgICAgLmF0dHIoImNsYXNzIiwgInNlbGVjdGlvbiIpCiAgICAgICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzLnNlbGVjdGlvbikKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAiIzc3NyIpCiAgICAgICAgICAgIC5hdHRyKCJmaWxsLW9wYWNpdHkiLCAwLjMpCiAgICAgICAgICAgIC5hdHRyKCJzdHJva2UiLCAiI2ZmZiIpCiAgICAgICAgICAgIC5hdHRyKCJzaGFwZS1yZW5kZXJpbmciLCAiY3Jpc3BFZGdlcyIpOwoKICAgICAgICB2YXIgaGFuZGxlID0gZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgICAgIC5kYXRhKGRpbS5oYW5kbGVzLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGU7IH0pOwoKICAgICAgICBoYW5kbGUuZXhpdCgpLnJlbW92ZSgpOwoKICAgICAgICBoYW5kbGUuZW50ZXIoKS5hcHBlbmQoInJlY3QiKQogICAgICAgICAgICAuYXR0cigiY2xhc3MiLCBmdW5jdGlvbihkKSB7IHJldHVybiAiaGFuZGxlIGhhbmRsZS0tIiArIGQudHlwZTsgfSkKICAgICAgICAgICAgLmF0dHIoImN1cnNvciIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGN1cnNvcnNbZC50eXBlXTsgfSk7CgogICAgICAgIGdyb3VwCiAgICAgICAgICAgIC5lYWNoKHJlZHJhdykKICAgICAgICAgICAgLmF0dHIoImZpbGwiLCAibm9uZSIpCiAgICAgICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJhbGwiKQogICAgICAgICAgICAub24oIm1vdXNlZG93bi5icnVzaCIsIHN0YXJ0ZWQpCiAgICAgICAgICAuZmlsdGVyKHRvdWNoYWJsZSkKICAgICAgICAgICAgLm9uKCJ0b3VjaHN0YXJ0LmJydXNoIiwgc3RhcnRlZCkKICAgICAgICAgICAgLm9uKCJ0b3VjaG1vdmUuYnJ1c2giLCB0b3VjaG1vdmVkKQogICAgICAgICAgICAub24oInRvdWNoZW5kLmJydXNoIHRvdWNoY2FuY2VsLmJydXNoIiwgdG91Y2hlbmRlZCkKICAgICAgICAgICAgLnN0eWxlKCJ0b3VjaC1hY3Rpb24iLCAibm9uZSIpCiAgICAgICAgICAgIC5zdHlsZSgiLXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yIiwgInJnYmEoMCwwLDAsMCkiKTsKICAgICAgfQoKICAgICAgYnJ1c2gubW92ZSA9IGZ1bmN0aW9uKGdyb3VwLCBzZWxlY3Rpb24pIHsKICAgICAgICBpZiAoZ3JvdXAuc2VsZWN0aW9uKSB7CiAgICAgICAgICBncm91cAogICAgICAgICAgICAgIC5vbigic3RhcnQuYnJ1c2giLCBmdW5jdGlvbigpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmJlZm9yZXN0YXJ0KCkuc3RhcnQoKTsgfSkKICAgICAgICAgICAgICAub24oImludGVycnVwdC5icnVzaCBlbmQuYnJ1c2giLCBmdW5jdGlvbigpIHsgZW1pdHRlcih0aGlzLCBhcmd1bWVudHMpLmVuZCgpOyB9KQogICAgICAgICAgICAgIC50d2VlbigiYnJ1c2giLCBmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHRoYXQuX19icnVzaCwKICAgICAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMpLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjAgPSBzdGF0ZS5zZWxlY3Rpb24sCiAgICAgICAgICAgICAgICAgICAgc2VsZWN0aW9uMSA9IGRpbS5pbnB1dCh0eXBlb2Ygc2VsZWN0aW9uID09PSAiZnVuY3Rpb24iID8gc2VsZWN0aW9uLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgOiBzZWxlY3Rpb24sIHN0YXRlLmV4dGVudCksCiAgICAgICAgICAgICAgICAgICAgaSA9IGludGVycG9sYXRlVmFsdWUoc2VsZWN0aW9uMCwgc2VsZWN0aW9uMSk7CgogICAgICAgICAgICAgICAgZnVuY3Rpb24gdHdlZW4odCkgewogICAgICAgICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSB0ID09PSAxICYmIHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogaSh0KTsKICAgICAgICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICAgICAgICAgIGVtaXQuYnJ1c2goKTsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICByZXR1cm4gc2VsZWN0aW9uMCAhPT0gbnVsbCAmJiBzZWxlY3Rpb24xICE9PSBudWxsID8gdHdlZW4gOiB0d2VlbigxKTsKICAgICAgICAgICAgICB9KTsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgZ3JvdXAKICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbigpIHsKICAgICAgICAgICAgICAgIHZhciB0aGF0ID0gdGhpcywKICAgICAgICAgICAgICAgICAgICBhcmdzID0gYXJndW1lbnRzLAogICAgICAgICAgICAgICAgICAgIHN0YXRlID0gdGhhdC5fX2JydXNoLAogICAgICAgICAgICAgICAgICAgIHNlbGVjdGlvbjEgPSBkaW0uaW5wdXQodHlwZW9mIHNlbGVjdGlvbiA9PT0gImZ1bmN0aW9uIiA/IHNlbGVjdGlvbi5hcHBseSh0aGF0LCBhcmdzKSA6IHNlbGVjdGlvbiwgc3RhdGUuZXh0ZW50KSwKICAgICAgICAgICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmdzKS5iZWZvcmVzdGFydCgpOwoKICAgICAgICAgICAgICAgIGludGVycnVwdCh0aGF0KTsKICAgICAgICAgICAgICAgIHN0YXRlLnNlbGVjdGlvbiA9IHNlbGVjdGlvbjEgPT09IG51bGwgPyBudWxsIDogc2VsZWN0aW9uMTsKICAgICAgICAgICAgICAgIHJlZHJhdy5jYWxsKHRoYXQpOwogICAgICAgICAgICAgICAgZW1pdC5zdGFydCgpLmJydXNoKCkuZW5kKCk7CiAgICAgICAgICAgICAgfSk7CiAgICAgICAgfQogICAgICB9OwoKICAgICAgYnJ1c2guY2xlYXIgPSBmdW5jdGlvbihncm91cCkgewogICAgICAgIGJydXNoLm1vdmUoZ3JvdXAsIG51bGwpOwogICAgICB9OwoKICAgICAgZnVuY3Rpb24gcmVkcmF3KCkgewogICAgICAgIHZhciBncm91cCA9IHNlbGVjdCQxKHRoaXMpLAogICAgICAgICAgICBzZWxlY3Rpb24gPSBsb2NhbCh0aGlzKS5zZWxlY3Rpb247CgogICAgICAgIGlmIChzZWxlY3Rpb24pIHsKICAgICAgICAgIGdyb3VwLnNlbGVjdEFsbCgiLnNlbGVjdGlvbiIpCiAgICAgICAgICAgICAgLnN0eWxlKCJkaXNwbGF5IiwgbnVsbCkKICAgICAgICAgICAgICAuYXR0cigieCIsIHNlbGVjdGlvblswXVswXSkKICAgICAgICAgICAgICAuYXR0cigieSIsIHNlbGVjdGlvblswXVsxXSkKICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBzZWxlY3Rpb25bMV1bMF0gLSBzZWxlY3Rpb25bMF1bMF0pCiAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSk7CgogICAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuaGFuZGxlIikKICAgICAgICAgICAgICAuc3R5bGUoImRpc3BsYXkiLCBudWxsKQogICAgICAgICAgICAgIC5hdHRyKCJ4IiwgZnVuY3Rpb24oZCkgeyByZXR1cm4gZC50eXBlW2QudHlwZS5sZW5ndGggLSAxXSA9PT0gImUiID8gc2VsZWN0aW9uWzFdWzBdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMF0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAgICAgICAgICAuYXR0cigieSIsIGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQudHlwZVswXSA9PT0gInMiID8gc2VsZWN0aW9uWzFdWzFdIC0gaGFuZGxlU2l6ZSAvIDIgOiBzZWxlY3Rpb25bMF1bMV0gLSBoYW5kbGVTaXplIC8gMjsgfSkKICAgICAgICAgICAgICAuYXR0cigid2lkdGgiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJuIiB8fCBkLnR5cGUgPT09ICJzIiA/IHNlbGVjdGlvblsxXVswXSAtIHNlbGVjdGlvblswXVswXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KQogICAgICAgICAgICAgIC5hdHRyKCJoZWlnaHQiLCBmdW5jdGlvbihkKSB7IHJldHVybiBkLnR5cGUgPT09ICJlIiB8fCBkLnR5cGUgPT09ICJ3IiA/IHNlbGVjdGlvblsxXVsxXSAtIHNlbGVjdGlvblswXVsxXSArIGhhbmRsZVNpemUgOiBoYW5kbGVTaXplOyB9KTsKICAgICAgICB9CgogICAgICAgIGVsc2UgewogICAgICAgICAgZ3JvdXAuc2VsZWN0QWxsKCIuc2VsZWN0aW9uLC5oYW5kbGUiKQogICAgICAgICAgICAgIC5zdHlsZSgiZGlzcGxheSIsICJub25lIikKICAgICAgICAgICAgICAuYXR0cigieCIsIG51bGwpCiAgICAgICAgICAgICAgLmF0dHIoInkiLCBudWxsKQogICAgICAgICAgICAgIC5hdHRyKCJ3aWR0aCIsIG51bGwpCiAgICAgICAgICAgICAgLmF0dHIoImhlaWdodCIsIG51bGwpOwogICAgICAgIH0KICAgICAgfQoKICAgICAgZnVuY3Rpb24gZW1pdHRlcih0aGF0LCBhcmdzLCBjbGVhbikgewogICAgICAgIHJldHVybiAoIWNsZWFuICYmIHRoYXQuX19icnVzaC5lbWl0dGVyKSB8fCBuZXcgRW1pdHRlcih0aGF0LCBhcmdzKTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gRW1pdHRlcih0aGF0LCBhcmdzKSB7CiAgICAgICAgdGhpcy50aGF0ID0gdGhhdDsKICAgICAgICB0aGlzLmFyZ3MgPSBhcmdzOwogICAgICAgIHRoaXMuc3RhdGUgPSB0aGF0Ll9fYnJ1c2g7CiAgICAgICAgdGhpcy5hY3RpdmUgPSAwOwogICAgICB9CgogICAgICBFbWl0dGVyLnByb3RvdHlwZSA9IHsKICAgICAgICBiZWZvcmVzdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoKyt0aGlzLmFjdGl2ZSA9PT0gMSkgdGhpcy5zdGF0ZS5lbWl0dGVyID0gdGhpcywgdGhpcy5zdGFydGluZyA9IHRydWU7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIHN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICAgIGlmICh0aGlzLnN0YXJ0aW5nKSB0aGlzLnN0YXJ0aW5nID0gZmFsc2UsIHRoaXMuZW1pdCgic3RhcnQiKTsKICAgICAgICAgIGVsc2UgdGhpcy5lbWl0KCJicnVzaCIpOwogICAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgICAgfSwKICAgICAgICBicnVzaDogZnVuY3Rpb24oKSB7CiAgICAgICAgICB0aGlzLmVtaXQoImJydXNoIik7CiAgICAgICAgICByZXR1cm4gdGhpczsKICAgICAgICB9LAogICAgICAgIGVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgICBpZiAoLS10aGlzLmFjdGl2ZSA9PT0gMCkgZGVsZXRlIHRoaXMuc3RhdGUuZW1pdHRlciwgdGhpcy5lbWl0KCJlbmQiKTsKICAgICAgICAgIHJldHVybiB0aGlzOwogICAgICAgIH0sCiAgICAgICAgZW1pdDogZnVuY3Rpb24odHlwZSkgewogICAgICAgICAgY3VzdG9tRXZlbnQobmV3IEJydXNoRXZlbnQoYnJ1c2gsIHR5cGUsIGRpbS5vdXRwdXQodGhpcy5zdGF0ZS5zZWxlY3Rpb24pKSwgbGlzdGVuZXJzLmFwcGx5LCBsaXN0ZW5lcnMsIFt0eXBlLCB0aGlzLnRoYXQsIHRoaXMuYXJnc10pOwogICAgICAgIH0KICAgICAgfTsKCiAgICAgIGZ1bmN0aW9uIHN0YXJ0ZWQoKSB7CiAgICAgICAgaWYgKHRvdWNoZW5kaW5nICYmICFldmVudC50b3VjaGVzKSByZXR1cm47CiAgICAgICAgaWYgKCFmaWx0ZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSkgcmV0dXJuOwoKICAgICAgICB2YXIgdGhhdCA9IHRoaXMsCiAgICAgICAgICAgIHR5cGUgPSBldmVudC50YXJnZXQuX19kYXRhX18udHlwZSwKICAgICAgICAgICAgbW9kZSA9IChrZXlzICYmIGV2ZW50Lm1ldGFLZXkgPyB0eXBlID0gIm92ZXJsYXkiIDogdHlwZSkgPT09ICJzZWxlY3Rpb24iID8gTU9ERV9EUkFHIDogKGtleXMgJiYgZXZlbnQuYWx0S2V5ID8gTU9ERV9DRU5URVIgOiBNT0RFX0hBTkRMRSksCiAgICAgICAgICAgIHNpZ25YID0gZGltID09PSBZID8gbnVsbCA6IHNpZ25zWFt0eXBlXSwKICAgICAgICAgICAgc2lnblkgPSBkaW0gPT09IFggPyBudWxsIDogc2lnbnNZW3R5cGVdLAogICAgICAgICAgICBzdGF0ZSA9IGxvY2FsKHRoYXQpLAogICAgICAgICAgICBleHRlbnQgPSBzdGF0ZS5leHRlbnQsCiAgICAgICAgICAgIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbiwKICAgICAgICAgICAgVyA9IGV4dGVudFswXVswXSwgdzAsIHcxLAogICAgICAgICAgICBOID0gZXh0ZW50WzBdWzFdLCBuMCwgbjEsCiAgICAgICAgICAgIEUgPSBleHRlbnRbMV1bMF0sIGUwLCBlMSwKICAgICAgICAgICAgUyA9IGV4dGVudFsxXVsxXSwgczAsIHMxLAogICAgICAgICAgICBkeCA9IDAsCiAgICAgICAgICAgIGR5ID0gMCwKICAgICAgICAgICAgbW92aW5nLAogICAgICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZICYmIGtleXMgJiYgZXZlbnQuc2hpZnRLZXksCiAgICAgICAgICAgIGxvY2tYLAogICAgICAgICAgICBsb2NrWSwKICAgICAgICAgICAgcG9pbnRlciA9IGV2ZW50LnRvdWNoZXMgPyB0b3VjaGVyKGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdLmlkZW50aWZpZXIpIDogbW91c2UsCiAgICAgICAgICAgIHBvaW50MCA9IHBvaW50ZXIodGhhdCksCiAgICAgICAgICAgIHBvaW50ID0gcG9pbnQwLAogICAgICAgICAgICBlbWl0ID0gZW1pdHRlcih0aGF0LCBhcmd1bWVudHMsIHRydWUpLmJlZm9yZXN0YXJ0KCk7CgogICAgICAgIGlmICh0eXBlID09PSAib3ZlcmxheSIpIHsKICAgICAgICAgIGlmIChzZWxlY3Rpb24pIG1vdmluZyA9IHRydWU7CiAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBzZWxlY3Rpb24gPSBbCiAgICAgICAgICAgIFt3MCA9IGRpbSA9PT0gWSA/IFcgOiBwb2ludDBbMF0sIG4wID0gZGltID09PSBYID8gTiA6IHBvaW50MFsxXV0sCiAgICAgICAgICAgIFtlMCA9IGRpbSA9PT0gWSA/IEUgOiB3MCwgczAgPSBkaW0gPT09IFggPyBTIDogbjBdCiAgICAgICAgICBdOwogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICB3MCA9IHNlbGVjdGlvblswXVswXTsKICAgICAgICAgIG4wID0gc2VsZWN0aW9uWzBdWzFdOwogICAgICAgICAgZTAgPSBzZWxlY3Rpb25bMV1bMF07CiAgICAgICAgICBzMCA9IHNlbGVjdGlvblsxXVsxXTsKICAgICAgICB9CgogICAgICAgIHcxID0gdzA7CiAgICAgICAgbjEgPSBuMDsKICAgICAgICBlMSA9IGUwOwogICAgICAgIHMxID0gczA7CgogICAgICAgIHZhciBncm91cCA9IHNlbGVjdCQxKHRoYXQpCiAgICAgICAgICAgIC5hdHRyKCJwb2ludGVyLWV2ZW50cyIsICJub25lIik7CgogICAgICAgIHZhciBvdmVybGF5ID0gZ3JvdXAuc2VsZWN0QWxsKCIub3ZlcmxheSIpCiAgICAgICAgICAgIC5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGVdKTsKCiAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMpIHsKICAgICAgICAgIGVtaXQubW92ZWQgPSBtb3ZlZDsKICAgICAgICAgIGVtaXQuZW5kZWQgPSBlbmRlZDsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgdmFyIHZpZXcgPSBzZWxlY3QkMShldmVudC52aWV3KQogICAgICAgICAgICAgIC5vbigibW91c2Vtb3ZlLmJydXNoIiwgbW92ZWQsIHRydWUpCiAgICAgICAgICAgICAgLm9uKCJtb3VzZXVwLmJydXNoIiwgZW5kZWQsIHRydWUpOwogICAgICAgICAgaWYgKGtleXMpIHZpZXcKICAgICAgICAgICAgICAub24oImtleWRvd24uYnJ1c2giLCBrZXlkb3duZWQsIHRydWUpCiAgICAgICAgICAgICAgLm9uKCJrZXl1cC5icnVzaCIsIGtleXVwcGVkLCB0cnVlKTsKCiAgICAgICAgICBkcmFnRGlzYWJsZShldmVudC52aWV3KTsKICAgICAgICB9CgogICAgICAgIG5vcHJvcGFnYXRpb24oKTsKICAgICAgICBpbnRlcnJ1cHQodGhhdCk7CiAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgZW1pdC5zdGFydCgpOwoKICAgICAgICBmdW5jdGlvbiBtb3ZlZCgpIHsKICAgICAgICAgIHZhciBwb2ludDEgPSBwb2ludGVyKHRoYXQpOwogICAgICAgICAgaWYgKHNoaWZ0aW5nICYmICFsb2NrWCAmJiAhbG9ja1kpIHsKICAgICAgICAgICAgaWYgKE1hdGguYWJzKHBvaW50MVswXSAtIHBvaW50WzBdKSA+IE1hdGguYWJzKHBvaW50MVsxXSAtIHBvaW50WzFdKSkgbG9ja1kgPSB0cnVlOwogICAgICAgICAgICBlbHNlIGxvY2tYID0gdHJ1ZTsKICAgICAgICAgIH0KICAgICAgICAgIHBvaW50ID0gcG9pbnQxOwogICAgICAgICAgbW92aW5nID0gdHJ1ZTsKICAgICAgICAgIG5vZXZlbnQkMSgpOwogICAgICAgICAgbW92ZSgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24gbW92ZSgpIHsKICAgICAgICAgIHZhciB0OwoKICAgICAgICAgIGR4ID0gcG9pbnRbMF0gLSBwb2ludDBbMF07CiAgICAgICAgICBkeSA9IHBvaW50WzFdIC0gcG9pbnQwWzFdOwoKICAgICAgICAgIHN3aXRjaCAobW9kZSkgewogICAgICAgICAgICBjYXNlIE1PREVfU1BBQ0U6CiAgICAgICAgICAgIGNhc2UgTU9ERV9EUkFHOiB7CiAgICAgICAgICAgICAgaWYgKHNpZ25YKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTAgKyBkeDsKICAgICAgICAgICAgICBpZiAoc2lnblkpIGR5ID0gTWF0aC5tYXgoTiAtIG4wLCBNYXRoLm1pbihTIC0gczAsIGR5KSksIG4xID0gbjAgKyBkeSwgczEgPSBzMCArIGR5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgTU9ERV9IQU5ETEU6IHsKICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBkeCA9IE1hdGgubWF4KFcgLSB3MCwgTWF0aC5taW4oRSAtIHcwLCBkeCkpLCB3MSA9IHcwICsgZHgsIGUxID0gZTA7CiAgICAgICAgICAgICAgZWxzZSBpZiAoc2lnblggPiAwKSBkeCA9IE1hdGgubWF4KFcgLSBlMCwgTWF0aC5taW4oRSAtIGUwLCBkeCkpLCB3MSA9IHcwLCBlMSA9IGUwICsgZHg7CiAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgZHkgPSBNYXRoLm1heChOIC0gbjAsIE1hdGgubWluKFMgLSBuMCwgZHkpKSwgbjEgPSBuMCArIGR5LCBzMSA9IHMwOwogICAgICAgICAgICAgIGVsc2UgaWYgKHNpZ25ZID4gMCkgZHkgPSBNYXRoLm1heChOIC0gczAsIE1hdGgubWluKFMgLSBzMCwgZHkpKSwgbjEgPSBuMCwgczEgPSBzMCArIGR5OwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgTU9ERV9DRU5URVI6IHsKICAgICAgICAgICAgICBpZiAoc2lnblgpIHcxID0gTWF0aC5tYXgoVywgTWF0aC5taW4oRSwgdzAgLSBkeCAqIHNpZ25YKSksIGUxID0gTWF0aC5tYXgoVywgTWF0aC5taW4oRSwgZTAgKyBkeCAqIHNpZ25YKSk7CiAgICAgICAgICAgICAgaWYgKHNpZ25ZKSBuMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIG4wIC0gZHkgKiBzaWduWSkpLCBzMSA9IE1hdGgubWF4KE4sIE1hdGgubWluKFMsIHMwICsgZHkgKiBzaWduWSkpOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgaWYgKGUxIDwgdzEpIHsKICAgICAgICAgICAgc2lnblggKj0gLTE7CiAgICAgICAgICAgIHQgPSB3MCwgdzAgPSBlMCwgZTAgPSB0OwogICAgICAgICAgICB0ID0gdzEsIHcxID0gZTEsIGUxID0gdDsKICAgICAgICAgICAgaWYgKHR5cGUgaW4gZmxpcFgpIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29yc1t0eXBlID0gZmxpcFhbdHlwZV1dKTsKICAgICAgICAgIH0KCiAgICAgICAgICBpZiAoczEgPCBuMSkgewogICAgICAgICAgICBzaWduWSAqPSAtMTsKICAgICAgICAgICAgdCA9IG4wLCBuMCA9IHMwLCBzMCA9IHQ7CiAgICAgICAgICAgIHQgPSBuMSwgbjEgPSBzMSwgczEgPSB0OwogICAgICAgICAgICBpZiAodHlwZSBpbiBmbGlwWSkgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGUgPSBmbGlwWVt0eXBlXV0pOwogICAgICAgICAgfQoKICAgICAgICAgIGlmIChzdGF0ZS5zZWxlY3Rpb24pIHNlbGVjdGlvbiA9IHN0YXRlLnNlbGVjdGlvbjsgLy8gTWF5IGJlIHNldCBieSBicnVzaC5tb3ZlIQogICAgICAgICAgaWYgKGxvY2tYKSB3MSA9IHNlbGVjdGlvblswXVswXSwgZTEgPSBzZWxlY3Rpb25bMV1bMF07CiAgICAgICAgICBpZiAobG9ja1kpIG4xID0gc2VsZWN0aW9uWzBdWzFdLCBzMSA9IHNlbGVjdGlvblsxXVsxXTsKCiAgICAgICAgICBpZiAoc2VsZWN0aW9uWzBdWzBdICE9PSB3MQogICAgICAgICAgICAgIHx8IHNlbGVjdGlvblswXVsxXSAhPT0gbjEKICAgICAgICAgICAgICB8fCBzZWxlY3Rpb25bMV1bMF0gIT09IGUxCiAgICAgICAgICAgICAgfHwgc2VsZWN0aW9uWzFdWzFdICE9PSBzMSkgewogICAgICAgICAgICBzdGF0ZS5zZWxlY3Rpb24gPSBbW3cxLCBuMV0sIFtlMSwgczFdXTsKICAgICAgICAgICAgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICAgIGVtaXQuYnJ1c2goKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGVuZGVkKCkgewogICAgICAgICAgbm9wcm9wYWdhdGlvbigpOwogICAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMpIHsKICAgICAgICAgICAgaWYgKGV2ZW50LnRvdWNoZXMubGVuZ3RoKSByZXR1cm47CiAgICAgICAgICAgIGlmICh0b3VjaGVuZGluZykgY2xlYXJUaW1lb3V0KHRvdWNoZW5kaW5nKTsKICAgICAgICAgICAgdG91Y2hlbmRpbmcgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB0b3VjaGVuZGluZyA9IG51bGw7IH0sIDUwMCk7IC8vIEdob3N0IGNsaWNrcyBhcmUgZGVsYXllZCEKICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIHllc2RyYWcoZXZlbnQudmlldywgbW92aW5nKTsKICAgICAgICAgICAgdmlldy5vbigia2V5ZG93bi5icnVzaCBrZXl1cC5icnVzaCBtb3VzZW1vdmUuYnJ1c2ggbW91c2V1cC5icnVzaCIsIG51bGwpOwogICAgICAgICAgfQogICAgICAgICAgZ3JvdXAuYXR0cigicG9pbnRlci1ldmVudHMiLCAiYWxsIik7CiAgICAgICAgICBvdmVybGF5LmF0dHIoImN1cnNvciIsIGN1cnNvcnMub3ZlcmxheSk7CiAgICAgICAgICBpZiAoc3RhdGUuc2VsZWN0aW9uKSBzZWxlY3Rpb24gPSBzdGF0ZS5zZWxlY3Rpb247IC8vIE1heSBiZSBzZXQgYnkgYnJ1c2gubW92ZSAob24gc3RhcnQpIQogICAgICAgICAgaWYgKGVtcHR5JDIoc2VsZWN0aW9uKSkgc3RhdGUuc2VsZWN0aW9uID0gbnVsbCwgcmVkcmF3LmNhbGwodGhhdCk7CiAgICAgICAgICBlbWl0LmVuZCgpOwogICAgICAgIH0KCiAgICAgICAgZnVuY3Rpb24ga2V5ZG93bmVkKCkgewogICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlQKICAgICAgICAgICAgICBzaGlmdGluZyA9IHNpZ25YICYmIHNpZ25ZOwogICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGNhc2UgMTg6IHsgLy8gQUxUCiAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfSEFORExFKSB7CiAgICAgICAgICAgICAgICBpZiAoc2lnblgpIGUwID0gZTEgLSBkeCAqIHNpZ25YLCB3MCA9IHcxICsgZHggKiBzaWduWDsKICAgICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZOwogICAgICAgICAgICAgICAgbW9kZSA9IE1PREVfQ0VOVEVSOwogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFOyB0YWtlcyBwcmlvcml0eSBvdmVyIEFMVAogICAgICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0hBTkRMRSB8fCBtb2RlID09PSBNT0RFX0NFTlRFUikgewogICAgICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMSAtIGR4OyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzEgLSBkeDsKICAgICAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczEgLSBkeTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xIC0gZHk7CiAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9TUEFDRTsKICAgICAgICAgICAgICAgIG92ZXJsYXkuYXR0cigiY3Vyc29yIiwgY3Vyc29ycy5zZWxlY3Rpb24pOwogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBkZWZhdWx0OiByZXR1cm47CiAgICAgICAgICB9CiAgICAgICAgICBub2V2ZW50JDEoKTsKICAgICAgICB9CgogICAgICAgIGZ1bmN0aW9uIGtleXVwcGVkKCkgewogICAgICAgICAgc3dpdGNoIChldmVudC5rZXlDb2RlKSB7CiAgICAgICAgICAgIGNhc2UgMTY6IHsgLy8gU0hJRlQKICAgICAgICAgICAgICBpZiAoc2hpZnRpbmcpIHsKICAgICAgICAgICAgICAgIGxvY2tYID0gbG9ja1kgPSBzaGlmdGluZyA9IGZhbHNlOwogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDE4OiB7IC8vIEFMVAogICAgICAgICAgICAgIGlmIChtb2RlID09PSBNT0RFX0NFTlRFUikgewogICAgICAgICAgICAgICAgaWYgKHNpZ25YIDwgMCkgZTAgPSBlMTsgZWxzZSBpZiAoc2lnblggPiAwKSB3MCA9IHcxOwogICAgICAgICAgICAgICAgaWYgKHNpZ25ZIDwgMCkgczAgPSBzMTsgZWxzZSBpZiAoc2lnblkgPiAwKSBuMCA9IG4xOwogICAgICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFOwogICAgICAgICAgICAgICAgbW92ZSgpOwogICAgICAgICAgICAgIH0KICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICBjYXNlIDMyOiB7IC8vIFNQQUNFCiAgICAgICAgICAgICAgaWYgKG1vZGUgPT09IE1PREVfU1BBQ0UpIHsKICAgICAgICAgICAgICAgIGlmIChldmVudC5hbHRLZXkpIHsKICAgICAgICAgICAgICAgICAgaWYgKHNpZ25YKSBlMCA9IGUxIC0gZHggKiBzaWduWCwgdzAgPSB3MSArIGR4ICogc2lnblg7CiAgICAgICAgICAgICAgICAgIGlmIChzaWduWSkgczAgPSBzMSAtIGR5ICogc2lnblksIG4wID0gbjEgKyBkeSAqIHNpZ25ZOwogICAgICAgICAgICAgICAgICBtb2RlID0gTU9ERV9DRU5URVI7CiAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICBpZiAoc2lnblggPCAwKSBlMCA9IGUxOyBlbHNlIGlmIChzaWduWCA+IDApIHcwID0gdzE7CiAgICAgICAgICAgICAgICAgIGlmIChzaWduWSA8IDApIHMwID0gczE7IGVsc2UgaWYgKHNpZ25ZID4gMCkgbjAgPSBuMTsKICAgICAgICAgICAgICAgICAgbW9kZSA9IE1PREVfSEFORExFOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgb3ZlcmxheS5hdHRyKCJjdXJzb3IiLCBjdXJzb3JzW3R5cGVdKTsKICAgICAgICAgICAgICAgIG1vdmUoKTsKICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuOwogICAgICAgICAgfQogICAgICAgICAgbm9ldmVudCQxKCk7CiAgICAgICAgfQogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaG1vdmVkKCkgewogICAgICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5tb3ZlZCgpOwogICAgICB9CgogICAgICBmdW5jdGlvbiB0b3VjaGVuZGVkKCkgewogICAgICAgIGVtaXR0ZXIodGhpcywgYXJndW1lbnRzKS5lbmRlZCgpOwogICAgICB9CgogICAgICBmdW5jdGlvbiBpbml0aWFsaXplKCkgewogICAgICAgIHZhciBzdGF0ZSA9IHRoaXMuX19icnVzaCB8fCB7c2VsZWN0aW9uOiBudWxsfTsKICAgICAgICBzdGF0ZS5leHRlbnQgPSBudW1iZXIyKGV4dGVudC5hcHBseSh0aGlzLCBhcmd1bWVudHMpKTsKICAgICAgICBzdGF0ZS5kaW0gPSBkaW07CiAgICAgICAgcmV0dXJuIHN0YXRlOwogICAgICB9CgogICAgICBicnVzaC5leHRlbnQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZXh0ZW50ID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkMyhudW1iZXIyKF8pKSwgYnJ1c2gpIDogZXh0ZW50OwogICAgICB9OwoKICAgICAgYnJ1c2guZmlsdGVyID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGZpbHRlciA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDMoISFfKSwgYnJ1c2gpIDogZmlsdGVyOwogICAgICB9OwoKICAgICAgYnJ1c2gudG91Y2hhYmxlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHRvdWNoYWJsZSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDMoISFfKSwgYnJ1c2gpIDogdG91Y2hhYmxlOwogICAgICB9OwoKICAgICAgYnJ1c2guaGFuZGxlU2l6ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChoYW5kbGVTaXplID0gK18sIGJydXNoKSA6IGhhbmRsZVNpemU7CiAgICAgIH07CgogICAgICBicnVzaC5rZXlNb2RpZmllcnMgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoa2V5cyA9ICEhXywgYnJ1c2gpIDoga2V5czsKICAgICAgfTsKCiAgICAgIGJydXNoLm9uID0gZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIHZhbHVlID0gbGlzdGVuZXJzLm9uLmFwcGx5KGxpc3RlbmVycywgYXJndW1lbnRzKTsKICAgICAgICByZXR1cm4gdmFsdWUgPT09IGxpc3RlbmVycyA/IGJydXNoIDogdmFsdWU7CiAgICAgIH07CgogICAgICByZXR1cm4gYnJ1c2g7CiAgICB9CgogICAgdmFyIHBpID0gTWF0aC5QSSwKICAgICAgICB0YXUgPSAyICogcGksCiAgICAgICAgZXBzaWxvbiQxID0gMWUtNiwKICAgICAgICB0YXVFcHNpbG9uID0gdGF1IC0gZXBzaWxvbiQxOwoKICAgIGZ1bmN0aW9uIFBhdGgoKSB7CiAgICAgIHRoaXMuX3gwID0gdGhpcy5feTAgPSAvLyBzdGFydCBvZiBjdXJyZW50IHN1YnBhdGgKICAgICAgdGhpcy5feDEgPSB0aGlzLl95MSA9IG51bGw7IC8vIGVuZCBvZiBjdXJyZW50IHN1YnBhdGgKICAgICAgdGhpcy5fID0gIiI7CiAgICB9CgogICAgZnVuY3Rpb24gcGF0aCgpIHsKICAgICAgcmV0dXJuIG5ldyBQYXRoOwogICAgfQoKICAgIFBhdGgucHJvdG90eXBlID0gcGF0aC5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBQYXRoLAogICAgICBtb3ZlVG86IGZ1bmN0aW9uKHgsIHkpIHsKICAgICAgICB0aGlzLl8gKz0gIk0iICsgKHRoaXMuX3gwID0gdGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTAgPSB0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgY2xvc2VQYXRoOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5feDEgIT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuX3gxID0gdGhpcy5feDAsIHRoaXMuX3kxID0gdGhpcy5feTA7CiAgICAgICAgICB0aGlzLl8gKz0gIloiOwogICAgICAgIH0KICAgICAgfSwKICAgICAgbGluZVRvOiBmdW5jdGlvbih4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJMIiArICh0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MSA9ICt5KTsKICAgICAgfSwKICAgICAgcXVhZHJhdGljQ3VydmVUbzogZnVuY3Rpb24oeDEsIHkxLCB4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJRIiArICgreDEpICsgIiwiICsgKCt5MSkgKyAiLCIgKyAodGhpcy5feDEgPSAreCkgKyAiLCIgKyAodGhpcy5feTEgPSAreSk7CiAgICAgIH0sCiAgICAgIGJlemllckN1cnZlVG86IGZ1bmN0aW9uKHgxLCB5MSwgeDIsIHkyLCB4LCB5KSB7CiAgICAgICAgdGhpcy5fICs9ICJDIiArICgreDEpICsgIiwiICsgKCt5MSkgKyAiLCIgKyAoK3gyKSArICIsIiArICgreTIpICsgIiwiICsgKHRoaXMuX3gxID0gK3gpICsgIiwiICsgKHRoaXMuX3kxID0gK3kpOwogICAgICB9LAogICAgICBhcmNUbzogZnVuY3Rpb24oeDEsIHkxLCB4MiwgeTIsIHIpIHsKICAgICAgICB4MSA9ICt4MSwgeTEgPSAreTEsIHgyID0gK3gyLCB5MiA9ICt5MiwgciA9ICtyOwogICAgICAgIHZhciB4MCA9IHRoaXMuX3gxLAogICAgICAgICAgICB5MCA9IHRoaXMuX3kxLAogICAgICAgICAgICB4MjEgPSB4MiAtIHgxLAogICAgICAgICAgICB5MjEgPSB5MiAtIHkxLAogICAgICAgICAgICB4MDEgPSB4MCAtIHgxLAogICAgICAgICAgICB5MDEgPSB5MCAtIHkxLAogICAgICAgICAgICBsMDFfMiA9IHgwMSAqIHgwMSArIHkwMSAqIHkwMTsKCiAgICAgICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICAgICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOwoKICAgICAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgxLHkxKS4KICAgICAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDEgPSB4MSkgKyAiLCIgKyAodGhpcy5feTEgPSB5MSk7CiAgICAgICAgfQoKICAgICAgICAvLyBPciwgaXMgKHgxLHkxKSBjb2luY2lkZW50IHdpdGggKHgwLHkwKT8gRG8gbm90aGluZy4KICAgICAgICBlbHNlIGlmICghKGwwMV8yID4gZXBzaWxvbiQxKSk7CgogICAgICAgIC8vIE9yLCBhcmUgKHgwLHkwKSwgKHgxLHkxKSBhbmQgKHgyLHkyKSBjb2xsaW5lYXI/CiAgICAgICAgLy8gRXF1aXZhbGVudGx5LCBpcyAoeDEseTEpIGNvaW5jaWRlbnQgd2l0aCAoeDIseTIpPwogICAgICAgIC8vIE9yLCBpcyB0aGUgcmFkaXVzIHplcm8/IExpbmUgdG8gKHgxLHkxKS4KICAgICAgICBlbHNlIGlmICghKE1hdGguYWJzKHkwMSAqIHgyMSAtIHkyMSAqIHgwMSkgPiBlcHNpbG9uJDEpIHx8ICFyKSB7CiAgICAgICAgICB0aGlzLl8gKz0gIkwiICsgKHRoaXMuX3gxID0geDEpICsgIiwiICsgKHRoaXMuX3kxID0geTEpOwogICAgICAgIH0KCiAgICAgICAgLy8gT3RoZXJ3aXNlLCBkcmF3IGFuIGFyYyEKICAgICAgICBlbHNlIHsKICAgICAgICAgIHZhciB4MjAgPSB4MiAtIHgwLAogICAgICAgICAgICAgIHkyMCA9IHkyIC0geTAsCiAgICAgICAgICAgICAgbDIxXzIgPSB4MjEgKiB4MjEgKyB5MjEgKiB5MjEsCiAgICAgICAgICAgICAgbDIwXzIgPSB4MjAgKiB4MjAgKyB5MjAgKiB5MjAsCiAgICAgICAgICAgICAgbDIxID0gTWF0aC5zcXJ0KGwyMV8yKSwKICAgICAgICAgICAgICBsMDEgPSBNYXRoLnNxcnQobDAxXzIpLAogICAgICAgICAgICAgIGwgPSByICogTWF0aC50YW4oKHBpIC0gTWF0aC5hY29zKChsMjFfMiArIGwwMV8yIC0gbDIwXzIpIC8gKDIgKiBsMjEgKiBsMDEpKSkgLyAyKSwKICAgICAgICAgICAgICB0MDEgPSBsIC8gbDAxLAogICAgICAgICAgICAgIHQyMSA9IGwgLyBsMjE7CgogICAgICAgICAgLy8gSWYgdGhlIHN0YXJ0IHRhbmdlbnQgaXMgbm90IGNvaW5jaWRlbnQgd2l0aCAoeDAseTApLCBsaW5lIHRvLgogICAgICAgICAgaWYgKE1hdGguYWJzKHQwMSAtIDEpID4gZXBzaWxvbiQxKSB7CiAgICAgICAgICAgIHRoaXMuXyArPSAiTCIgKyAoeDEgKyB0MDEgKiB4MDEpICsgIiwiICsgKHkxICsgdDAxICogeTAxKTsKICAgICAgICAgIH0KCiAgICAgICAgICB0aGlzLl8gKz0gIkEiICsgciArICIsIiArIHIgKyAiLDAsMCwiICsgKCsoeTAxICogeDIwID4geDAxICogeTIwKSkgKyAiLCIgKyAodGhpcy5feDEgPSB4MSArIHQyMSAqIHgyMSkgKyAiLCIgKyAodGhpcy5feTEgPSB5MSArIHQyMSAqIHkyMSk7CiAgICAgICAgfQogICAgICB9LAogICAgICBhcmM6IGZ1bmN0aW9uKHgsIHksIHIsIGEwLCBhMSwgY2N3KSB7CiAgICAgICAgeCA9ICt4LCB5ID0gK3ksIHIgPSArciwgY2N3ID0gISFjY3c7CiAgICAgICAgdmFyIGR4ID0gciAqIE1hdGguY29zKGEwKSwKICAgICAgICAgICAgZHkgPSByICogTWF0aC5zaW4oYTApLAogICAgICAgICAgICB4MCA9IHggKyBkeCwKICAgICAgICAgICAgeTAgPSB5ICsgZHksCiAgICAgICAgICAgIGN3ID0gMSBeIGNjdywKICAgICAgICAgICAgZGEgPSBjY3cgPyBhMCAtIGExIDogYTEgLSBhMDsKCiAgICAgICAgLy8gSXMgdGhlIHJhZGl1cyBuZWdhdGl2ZT8gRXJyb3IuCiAgICAgICAgaWYgKHIgPCAwKSB0aHJvdyBuZXcgRXJyb3IoIm5lZ2F0aXZlIHJhZGl1czogIiArIHIpOwoKICAgICAgICAvLyBJcyB0aGlzIHBhdGggZW1wdHk/IE1vdmUgdG8gKHgwLHkwKS4KICAgICAgICBpZiAodGhpcy5feDEgPT09IG51bGwpIHsKICAgICAgICAgIHRoaXMuXyArPSAiTSIgKyB4MCArICIsIiArIHkwOwogICAgICAgIH0KCiAgICAgICAgLy8gT3IsIGlzICh4MCx5MCkgbm90IGNvaW5jaWRlbnQgd2l0aCB0aGUgcHJldmlvdXMgcG9pbnQ/IExpbmUgdG8gKHgwLHkwKS4KICAgICAgICBlbHNlIGlmIChNYXRoLmFicyh0aGlzLl94MSAtIHgwKSA+IGVwc2lsb24kMSB8fCBNYXRoLmFicyh0aGlzLl95MSAtIHkwKSA+IGVwc2lsb24kMSkgewogICAgICAgICAgdGhpcy5fICs9ICJMIiArIHgwICsgIiwiICsgeTA7CiAgICAgICAgfQoKICAgICAgICAvLyBJcyB0aGlzIGFyYyBlbXB0eT8gV2XigJlyZSBkb25lLgogICAgICAgIGlmICghcikgcmV0dXJuOwoKICAgICAgICAvLyBEb2VzIHRoZSBhbmdsZSBnbyB0aGUgd3Jvbmcgd2F5PyBGbGlwIHRoZSBkaXJlY3Rpb24uCiAgICAgICAgaWYgKGRhIDwgMCkgZGEgPSBkYSAlIHRhdSArIHRhdTsKCiAgICAgICAgLy8gSXMgdGhpcyBhIGNvbXBsZXRlIGNpcmNsZT8gRHJhdyB0d28gYXJjcyB0byBjb21wbGV0ZSB0aGUgY2lyY2xlLgogICAgICAgIGlmIChkYSA+IHRhdUVwc2lsb24pIHsKICAgICAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh4IC0gZHgpICsgIiwiICsgKHkgLSBkeSkgKyAiQSIgKyByICsgIiwiICsgciArICIsMCwxLCIgKyBjdyArICIsIiArICh0aGlzLl94MSA9IHgwKSArICIsIiArICh0aGlzLl95MSA9IHkwKTsKICAgICAgICB9CgogICAgICAgIC8vIElzIHRoaXMgYXJjIG5vbi1lbXB0eT8gRHJhdyBhbiBhcmMhCiAgICAgICAgZWxzZSBpZiAoZGEgPiBlcHNpbG9uJDEpIHsKICAgICAgICAgIHRoaXMuXyArPSAiQSIgKyByICsgIiwiICsgciArICIsMCwiICsgKCsoZGEgPj0gcGkpKSArICIsIiArIGN3ICsgIiwiICsgKHRoaXMuX3gxID0geCArIHIgKiBNYXRoLmNvcyhhMSkpICsgIiwiICsgKHRoaXMuX3kxID0geSArIHIgKiBNYXRoLnNpbihhMSkpOwogICAgICAgIH0KICAgICAgfSwKICAgICAgcmVjdDogZnVuY3Rpb24oeCwgeSwgdywgaCkgewogICAgICAgIHRoaXMuXyArPSAiTSIgKyAodGhpcy5feDAgPSB0aGlzLl94MSA9ICt4KSArICIsIiArICh0aGlzLl95MCA9IHRoaXMuX3kxID0gK3kpICsgImgiICsgKCt3KSArICJ2IiArICgraCkgKyAiaCIgKyAoLXcpICsgIloiOwogICAgICB9LAogICAgICB0b1N0cmluZzogZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHRoaXMuXzsKICAgICAgfQogICAgfTsKCiAgICB2YXIgcHJlZml4ID0gIiQiOwoKICAgIGZ1bmN0aW9uIE1hcCQxKCkge30KCiAgICBNYXAkMS5wcm90b3R5cGUgPSBtYXAkMS5wcm90b3R5cGUgPSB7CiAgICAgIGNvbnN0cnVjdG9yOiBNYXAkMSwKICAgICAgaGFzOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICByZXR1cm4gKHByZWZpeCArIGtleSkgaW4gdGhpczsKICAgICAgfSwKICAgICAgZ2V0OiBmdW5jdGlvbihrZXkpIHsKICAgICAgICByZXR1cm4gdGhpc1twcmVmaXggKyBrZXldOwogICAgICB9LAogICAgICBzZXQ6IGZ1bmN0aW9uKGtleSwgdmFsdWUpIHsKICAgICAgICB0aGlzW3ByZWZpeCArIGtleV0gPSB2YWx1ZTsKICAgICAgICByZXR1cm4gdGhpczsKICAgICAgfSwKICAgICAgcmVtb3ZlOiBmdW5jdGlvbihrZXkpIHsKICAgICAgICB2YXIgcHJvcGVydHkgPSBwcmVmaXggKyBrZXk7CiAgICAgICAgcmV0dXJuIHByb3BlcnR5IGluIHRoaXMgJiYgZGVsZXRlIHRoaXNbcHJvcGVydHldOwogICAgICB9LAogICAgICBjbGVhcjogZnVuY3Rpb24oKSB7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIGRlbGV0ZSB0aGlzW3Byb3BlcnR5XTsKICAgICAgfSwKICAgICAga2V5czogZnVuY3Rpb24oKSB7CiAgICAgICAgdmFyIGtleXMgPSBbXTsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkga2V5cy5wdXNoKHByb3BlcnR5LnNsaWNlKDEpKTsKICAgICAgICByZXR1cm4ga2V5czsKICAgICAgfSwKICAgICAgdmFsdWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgdmFsdWVzID0gW107CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpIHZhbHVlcy5wdXNoKHRoaXNbcHJvcGVydHldKTsKICAgICAgICByZXR1cm4gdmFsdWVzOwogICAgICB9LAogICAgICBlbnRyaWVzOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgZW50cmllcyA9IFtdOwogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSBlbnRyaWVzLnB1c2goe2tleTogcHJvcGVydHkuc2xpY2UoMSksIHZhbHVlOiB0aGlzW3Byb3BlcnR5XX0pOwogICAgICAgIHJldHVybiBlbnRyaWVzOwogICAgICB9LAogICAgICBzaXplOiBmdW5jdGlvbigpIHsKICAgICAgICB2YXIgc2l6ZSA9IDA7CiAgICAgICAgZm9yICh2YXIgcHJvcGVydHkgaW4gdGhpcykgaWYgKHByb3BlcnR5WzBdID09PSBwcmVmaXgpICsrc2l6ZTsKICAgICAgICByZXR1cm4gc2l6ZTsKICAgICAgfSwKICAgICAgZW1wdHk6IGZ1bmN0aW9uKCkgewogICAgICAgIGZvciAodmFyIHByb3BlcnR5IGluIHRoaXMpIGlmIChwcm9wZXJ0eVswXSA9PT0gcHJlZml4KSByZXR1cm4gZmFsc2U7CiAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgIH0sCiAgICAgIGVhY2g6IGZ1bmN0aW9uKGYpIHsKICAgICAgICBmb3IgKHZhciBwcm9wZXJ0eSBpbiB0aGlzKSBpZiAocHJvcGVydHlbMF0gPT09IHByZWZpeCkgZih0aGlzW3Byb3BlcnR5XSwgcHJvcGVydHkuc2xpY2UoMSksIHRoaXMpOwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIG1hcCQxKG9iamVjdCwgZikgewogICAgICB2YXIgbWFwID0gbmV3IE1hcCQxOwoKICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIE1hcCQxKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSwga2V5KSB7IG1hcC5zZXQoa2V5LCB2YWx1ZSk7IH0pOwoKICAgICAgLy8gSW5kZXggYXJyYXkgYnkgbnVtZXJpYyBpbmRleCBvciBzcGVjaWZpZWQga2V5IGZ1bmN0aW9uLgogICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KG9iamVjdCkpIHsKICAgICAgICB2YXIgaSA9IC0xLAogICAgICAgICAgICBuID0gb2JqZWN0Lmxlbmd0aCwKICAgICAgICAgICAgbzsKCiAgICAgICAgaWYgKGYgPT0gbnVsbCkgd2hpbGUgKCsraSA8IG4pIG1hcC5zZXQoaSwgb2JqZWN0W2ldKTsKICAgICAgICBlbHNlIHdoaWxlICgrK2kgPCBuKSBtYXAuc2V0KGYobyA9IG9iamVjdFtpXSwgaSwgb2JqZWN0KSwgbyk7CiAgICAgIH0KCiAgICAgIC8vIENvbnZlcnQgb2JqZWN0IHRvIG1hcC4KICAgICAgZWxzZSBpZiAob2JqZWN0KSBmb3IgKHZhciBrZXkgaW4gb2JqZWN0KSBtYXAuc2V0KGtleSwgb2JqZWN0W2tleV0pOwoKICAgICAgcmV0dXJuIG1hcDsKICAgIH0KCiAgICBmdW5jdGlvbiBTZXQkMSgpIHt9CgogICAgdmFyIHByb3RvID0gbWFwJDEucHJvdG90eXBlOwoKICAgIFNldCQxLnByb3RvdHlwZSA9IHNldCQyLnByb3RvdHlwZSA9IHsKICAgICAgY29uc3RydWN0b3I6IFNldCQxLAogICAgICBoYXM6IHByb3RvLmhhcywKICAgICAgYWRkOiBmdW5jdGlvbih2YWx1ZSkgewogICAgICAgIHZhbHVlICs9ICIiOwogICAgICAgIHRoaXNbcHJlZml4ICsgdmFsdWVdID0gdmFsdWU7CiAgICAgICAgcmV0dXJuIHRoaXM7CiAgICAgIH0sCiAgICAgIHJlbW92ZTogcHJvdG8ucmVtb3ZlLAogICAgICBjbGVhcjogcHJvdG8uY2xlYXIsCiAgICAgIHZhbHVlczogcHJvdG8ua2V5cywKICAgICAgc2l6ZTogcHJvdG8uc2l6ZSwKICAgICAgZW1wdHk6IHByb3RvLmVtcHR5LAogICAgICBlYWNoOiBwcm90by5lYWNoCiAgICB9OwoKICAgIGZ1bmN0aW9uIHNldCQyKG9iamVjdCwgZikgewogICAgICB2YXIgc2V0ID0gbmV3IFNldCQxOwoKICAgICAgLy8gQ29weSBjb25zdHJ1Y3Rvci4KICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFNldCQxKSBvYmplY3QuZWFjaChmdW5jdGlvbih2YWx1ZSkgeyBzZXQuYWRkKHZhbHVlKTsgfSk7CgogICAgICAvLyBPdGhlcndpc2UsIGFzc3VtZSBpdOKAmXMgYW4gYXJyYXkuCiAgICAgIGVsc2UgaWYgKG9iamVjdCkgewogICAgICAgIHZhciBpID0gLTEsIG4gPSBvYmplY3QubGVuZ3RoOwogICAgICAgIGlmIChmID09IG51bGwpIHdoaWxlICgrK2kgPCBuKSBzZXQuYWRkKG9iamVjdFtpXSk7CiAgICAgICAgZWxzZSB3aGlsZSAoKytpIDwgbikgc2V0LmFkZChmKG9iamVjdFtpXSwgaSwgb2JqZWN0KSk7CiAgICAgIH0KCiAgICAgIHJldHVybiBzZXQ7CiAgICB9CgogICAgLy8gQ29tcHV0ZXMgdGhlIGRlY2ltYWwgY29lZmZpY2llbnQgYW5kIGV4cG9uZW50IG9mIHRoZSBzcGVjaWZpZWQgbnVtYmVyIHggd2l0aAogICAgLy8gc2lnbmlmaWNhbnQgZGlnaXRzIHAsIHdoZXJlIHggaXMgcG9zaXRpdmUgYW5kIHAgaXMgaW4gWzEsIDIxXSBvciB1bmRlZmluZWQuCiAgICAvLyBGb3IgZXhhbXBsZSwgZm9ybWF0RGVjaW1hbCgxLjIzKSByZXR1cm5zIFsiMTIzIiwgMF0uCiAgICBmdW5jdGlvbiBmb3JtYXREZWNpbWFsKHgsIHApIHsKICAgICAgaWYgKChpID0gKHggPSBwID8geC50b0V4cG9uZW50aWFsKHAgLSAxKSA6IHgudG9FeHBvbmVudGlhbCgpKS5pbmRleE9mKCJlIikpIDwgMCkgcmV0dXJuIG51bGw7IC8vIE5hTiwgwrFJbmZpbml0eQogICAgICB2YXIgaSwgY29lZmZpY2llbnQgPSB4LnNsaWNlKDAsIGkpOwoKICAgICAgLy8gVGhlIHN0cmluZyByZXR1cm5lZCBieSB0b0V4cG9uZW50aWFsIGVpdGhlciBoYXMgdGhlIGZvcm0gXGRcLlxkK2VbLStdXGQrCiAgICAgIC8vIChlLmcuLCAxLjJlKzMpIG9yIHRoZSBmb3JtIFxkZVstK11cZCsgKGUuZy4sIDFlKzMpLgogICAgICByZXR1cm4gWwogICAgICAgIGNvZWZmaWNpZW50Lmxlbmd0aCA+IDEgPyBjb2VmZmljaWVudFswXSArIGNvZWZmaWNpZW50LnNsaWNlKDIpIDogY29lZmZpY2llbnQsCiAgICAgICAgK3guc2xpY2UoaSArIDEpCiAgICAgIF07CiAgICB9CgogICAgZnVuY3Rpb24gZXhwb25lbnQoeCkgewogICAgICByZXR1cm4geCA9IGZvcm1hdERlY2ltYWwoTWF0aC5hYnMoeCkpLCB4ID8geFsxXSA6IE5hTjsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXRHcm91cChncm91cGluZywgdGhvdXNhbmRzKSB7CiAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSwgd2lkdGgpIHsKICAgICAgICB2YXIgaSA9IHZhbHVlLmxlbmd0aCwKICAgICAgICAgICAgdCA9IFtdLAogICAgICAgICAgICBqID0gMCwKICAgICAgICAgICAgZyA9IGdyb3VwaW5nWzBdLAogICAgICAgICAgICBsZW5ndGggPSAwOwoKICAgICAgICB3aGlsZSAoaSA+IDAgJiYgZyA+IDApIHsKICAgICAgICAgIGlmIChsZW5ndGggKyBnICsgMSA+IHdpZHRoKSBnID0gTWF0aC5tYXgoMSwgd2lkdGggLSBsZW5ndGgpOwogICAgICAgICAgdC5wdXNoKHZhbHVlLnN1YnN0cmluZyhpIC09IGcsIGkgKyBnKSk7CiAgICAgICAgICBpZiAoKGxlbmd0aCArPSBnICsgMSkgPiB3aWR0aCkgYnJlYWs7CiAgICAgICAgICBnID0gZ3JvdXBpbmdbaiA9IChqICsgMSkgJSBncm91cGluZy5sZW5ndGhdOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHQucmV2ZXJzZSgpLmpvaW4odGhvdXNhbmRzKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBmb3JtYXROdW1lcmFscyhudW1lcmFscykgewogICAgICByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHsKICAgICAgICByZXR1cm4gdmFsdWUucmVwbGFjZSgvWzAtOV0vZywgZnVuY3Rpb24oaSkgewogICAgICAgICAgcmV0dXJuIG51bWVyYWxzWytpXTsKICAgICAgICB9KTsKICAgICAgfTsKICAgIH0KCiAgICAvLyBbW2ZpbGxdYWxpZ25dW3NpZ25dW3N5bWJvbF1bMF1bd2lkdGhdWyxdWy5wcmVjaXNpb25dW35dW3R5cGVdCiAgICB2YXIgcmUgPSAvXig/OiguKT8oWzw+PV5dKSk/KFsrXC0oIF0pPyhbJCNdKT8oMCk/KFxkKyk/KCwpPyhcLlxkKyk/KH4pPyhbYS16JV0pPyQvaTsKCiAgICBmdW5jdGlvbiBmb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7CiAgICAgIGlmICghKG1hdGNoID0gcmUuZXhlYyhzcGVjaWZpZXIpKSkgdGhyb3cgbmV3IEVycm9yKCJpbnZhbGlkIGZvcm1hdDogIiArIHNwZWNpZmllcik7CiAgICAgIHZhciBtYXRjaDsKICAgICAgcmV0dXJuIG5ldyBGb3JtYXRTcGVjaWZpZXIoewogICAgICAgIGZpbGw6IG1hdGNoWzFdLAogICAgICAgIGFsaWduOiBtYXRjaFsyXSwKICAgICAgICBzaWduOiBtYXRjaFszXSwKICAgICAgICBzeW1ib2w6IG1hdGNoWzRdLAogICAgICAgIHplcm86IG1hdGNoWzVdLAogICAgICAgIHdpZHRoOiBtYXRjaFs2XSwKICAgICAgICBjb21tYTogbWF0Y2hbN10sCiAgICAgICAgcHJlY2lzaW9uOiBtYXRjaFs4XSAmJiBtYXRjaFs4XS5zbGljZSgxKSwKICAgICAgICB0cmltOiBtYXRjaFs5XSwKICAgICAgICB0eXBlOiBtYXRjaFsxMF0KICAgICAgfSk7CiAgICB9CgogICAgZm9ybWF0U3BlY2lmaWVyLnByb3RvdHlwZSA9IEZvcm1hdFNwZWNpZmllci5wcm90b3R5cGU7IC8vIGluc3RhbmNlb2YKCiAgICBmdW5jdGlvbiBGb3JtYXRTcGVjaWZpZXIoc3BlY2lmaWVyKSB7CiAgICAgIHRoaXMuZmlsbCA9IHNwZWNpZmllci5maWxsID09PSB1bmRlZmluZWQgPyAiICIgOiBzcGVjaWZpZXIuZmlsbCArICIiOwogICAgICB0aGlzLmFsaWduID0gc3BlY2lmaWVyLmFsaWduID09PSB1bmRlZmluZWQgPyAiPiIgOiBzcGVjaWZpZXIuYWxpZ24gKyAiIjsKICAgICAgdGhpcy5zaWduID0gc3BlY2lmaWVyLnNpZ24gPT09IHVuZGVmaW5lZCA/ICItIiA6IHNwZWNpZmllci5zaWduICsgIiI7CiAgICAgIHRoaXMuc3ltYm9sID0gc3BlY2lmaWVyLnN5bWJvbCA9PT0gdW5kZWZpbmVkID8gIiIgOiBzcGVjaWZpZXIuc3ltYm9sICsgIiI7CiAgICAgIHRoaXMuemVybyA9ICEhc3BlY2lmaWVyLnplcm87CiAgICAgIHRoaXMud2lkdGggPSBzcGVjaWZpZXIud2lkdGggPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6ICtzcGVjaWZpZXIud2lkdGg7CiAgICAgIHRoaXMuY29tbWEgPSAhIXNwZWNpZmllci5jb21tYTsKICAgICAgdGhpcy5wcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uID09PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiArc3BlY2lmaWVyLnByZWNpc2lvbjsKICAgICAgdGhpcy50cmltID0gISFzcGVjaWZpZXIudHJpbTsKICAgICAgdGhpcy50eXBlID0gc3BlY2lmaWVyLnR5cGUgPT09IHVuZGVmaW5lZCA/ICIiIDogc3BlY2lmaWVyLnR5cGUgKyAiIjsKICAgIH0KCiAgICBGb3JtYXRTcGVjaWZpZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7CiAgICAgIHJldHVybiB0aGlzLmZpbGwKICAgICAgICAgICsgdGhpcy5hbGlnbgogICAgICAgICAgKyB0aGlzLnNpZ24KICAgICAgICAgICsgdGhpcy5zeW1ib2wKICAgICAgICAgICsgKHRoaXMuemVybyA/ICIwIiA6ICIiKQogICAgICAgICAgKyAodGhpcy53aWR0aCA9PT0gdW5kZWZpbmVkID8gIiIgOiBNYXRoLm1heCgxLCB0aGlzLndpZHRoIHwgMCkpCiAgICAgICAgICArICh0aGlzLmNvbW1hID8gIiwiIDogIiIpCiAgICAgICAgICArICh0aGlzLnByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gIiIgOiAiLiIgKyBNYXRoLm1heCgwLCB0aGlzLnByZWNpc2lvbiB8IDApKQogICAgICAgICAgKyAodGhpcy50cmltID8gIn4iIDogIiIpCiAgICAgICAgICArIHRoaXMudHlwZTsKICAgIH07CgogICAgLy8gVHJpbXMgaW5zaWduaWZpY2FudCB6ZXJvcywgZS5nLiwgcmVwbGFjZXMgMS4yMDAwayB3aXRoIDEuMmsuCiAgICBmdW5jdGlvbiBmb3JtYXRUcmltKHMpIHsKICAgICAgb3V0OiBmb3IgKHZhciBuID0gcy5sZW5ndGgsIGkgPSAxLCBpMCA9IC0xLCBpMTsgaSA8IG47ICsraSkgewogICAgICAgIHN3aXRjaCAoc1tpXSkgewogICAgICAgICAgY2FzZSAiLiI6IGkwID0gaTEgPSBpOyBicmVhazsKICAgICAgICAgIGNhc2UgIjAiOiBpZiAoaTAgPT09IDApIGkwID0gaTsgaTEgPSBpOyBicmVhazsKICAgICAgICAgIGRlZmF1bHQ6IGlmICghK3NbaV0pIGJyZWFrIG91dDsgaWYgKGkwID4gMCkgaTAgPSAwOyBicmVhazsKICAgICAgICB9CiAgICAgIH0KICAgICAgcmV0dXJuIGkwID4gMCA/IHMuc2xpY2UoMCwgaTApICsgcy5zbGljZShpMSArIDEpIDogczsKICAgIH0KCiAgICB2YXIgcHJlZml4RXhwb25lbnQ7CgogICAgZnVuY3Rpb24gZm9ybWF0UHJlZml4QXV0byh4LCBwKSB7CiAgICAgIHZhciBkID0gZm9ybWF0RGVjaW1hbCh4LCBwKTsKICAgICAgaWYgKCFkKSByZXR1cm4geCArICIiOwogICAgICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLAogICAgICAgICAgZXhwb25lbnQgPSBkWzFdLAogICAgICAgICAgaSA9IGV4cG9uZW50IC0gKHByZWZpeEV4cG9uZW50ID0gTWF0aC5tYXgoLTgsIE1hdGgubWluKDgsIE1hdGguZmxvb3IoZXhwb25lbnQgLyAzKSkpICogMykgKyAxLAogICAgICAgICAgbiA9IGNvZWZmaWNpZW50Lmxlbmd0aDsKICAgICAgcmV0dXJuIGkgPT09IG4gPyBjb2VmZmljaWVudAogICAgICAgICAgOiBpID4gbiA/IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGkgLSBuICsgMSkuam9pbigiMCIpCiAgICAgICAgICA6IGkgPiAwID8gY29lZmZpY2llbnQuc2xpY2UoMCwgaSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShpKQogICAgICAgICAgOiAiMC4iICsgbmV3IEFycmF5KDEgLSBpKS5qb2luKCIwIikgKyBmb3JtYXREZWNpbWFsKHgsIE1hdGgubWF4KDAsIHAgKyBpIC0gMSkpWzBdOyAvLyBsZXNzIHRoYW4gMXkhCiAgICB9CgogICAgZnVuY3Rpb24gZm9ybWF0Um91bmRlZCh4LCBwKSB7CiAgICAgIHZhciBkID0gZm9ybWF0RGVjaW1hbCh4LCBwKTsKICAgICAgaWYgKCFkKSByZXR1cm4geCArICIiOwogICAgICB2YXIgY29lZmZpY2llbnQgPSBkWzBdLAogICAgICAgICAgZXhwb25lbnQgPSBkWzFdOwogICAgICByZXR1cm4gZXhwb25lbnQgPCAwID8gIjAuIiArIG5ldyBBcnJheSgtZXhwb25lbnQpLmpvaW4oIjAiKSArIGNvZWZmaWNpZW50CiAgICAgICAgICA6IGNvZWZmaWNpZW50Lmxlbmd0aCA+IGV4cG9uZW50ICsgMSA/IGNvZWZmaWNpZW50LnNsaWNlKDAsIGV4cG9uZW50ICsgMSkgKyAiLiIgKyBjb2VmZmljaWVudC5zbGljZShleHBvbmVudCArIDEpCiAgICAgICAgICA6IGNvZWZmaWNpZW50ICsgbmV3IEFycmF5KGV4cG9uZW50IC0gY29lZmZpY2llbnQubGVuZ3RoICsgMikuam9pbigiMCIpOwogICAgfQoKICAgIHZhciBmb3JtYXRUeXBlcyA9IHsKICAgICAgIiUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiAoeCAqIDEwMCkudG9GaXhlZChwKTsgfSwKICAgICAgImIiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDIpOyB9LAogICAgICAiYyI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHggKyAiIjsgfSwKICAgICAgImQiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDEwKTsgfSwKICAgICAgImUiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiB4LnRvRXhwb25lbnRpYWwocCk7IH0sCiAgICAgICJmIjogZnVuY3Rpb24oeCwgcCkgeyByZXR1cm4geC50b0ZpeGVkKHApOyB9LAogICAgICAiZyI6IGZ1bmN0aW9uKHgsIHApIHsgcmV0dXJuIHgudG9QcmVjaXNpb24ocCk7IH0sCiAgICAgICJvIjogZnVuY3Rpb24oeCkgeyByZXR1cm4gTWF0aC5yb3VuZCh4KS50b1N0cmluZyg4KTsgfSwKICAgICAgInAiOiBmdW5jdGlvbih4LCBwKSB7IHJldHVybiBmb3JtYXRSb3VuZGVkKHggKiAxMDAsIHApOyB9LAogICAgICAiciI6IGZvcm1hdFJvdW5kZWQsCiAgICAgICJzIjogZm9ybWF0UHJlZml4QXV0bywKICAgICAgIlgiOiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLnJvdW5kKHgpLnRvU3RyaW5nKDE2KS50b1VwcGVyQ2FzZSgpOyB9LAogICAgICAieCI6IGZ1bmN0aW9uKHgpIHsgcmV0dXJuIE1hdGgucm91bmQoeCkudG9TdHJpbmcoMTYpOyB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIGlkZW50aXR5JDQoeCkgewogICAgICByZXR1cm4geDsKICAgIH0KCiAgICB2YXIgbWFwJDIgPSBBcnJheS5wcm90b3R5cGUubWFwLAogICAgICAgIHByZWZpeGVzID0gWyJ5IiwieiIsImEiLCJmIiwicCIsIm4iLCLCtSIsIm0iLCIiLCJrIiwiTSIsIkciLCJUIiwiUCIsIkUiLCJaIiwiWSJdOwoKICAgIGZ1bmN0aW9uIGZvcm1hdExvY2FsZShsb2NhbGUpIHsKICAgICAgdmFyIGdyb3VwID0gbG9jYWxlLmdyb3VwaW5nID09PSB1bmRlZmluZWQgfHwgbG9jYWxlLnRob3VzYW5kcyA9PT0gdW5kZWZpbmVkID8gaWRlbnRpdHkkNCA6IGZvcm1hdEdyb3VwKG1hcCQyLmNhbGwobG9jYWxlLmdyb3VwaW5nLCBOdW1iZXIpLCBsb2NhbGUudGhvdXNhbmRzICsgIiIpLAogICAgICAgICAgY3VycmVuY3lQcmVmaXggPSBsb2NhbGUuY3VycmVuY3kgPT09IHVuZGVmaW5lZCA/ICIiIDogbG9jYWxlLmN1cnJlbmN5WzBdICsgIiIsCiAgICAgICAgICBjdXJyZW5jeVN1ZmZpeCA9IGxvY2FsZS5jdXJyZW5jeSA9PT0gdW5kZWZpbmVkID8gIiIgOiBsb2NhbGUuY3VycmVuY3lbMV0gKyAiIiwKICAgICAgICAgIGRlY2ltYWwgPSBsb2NhbGUuZGVjaW1hbCA9PT0gdW5kZWZpbmVkID8gIi4iIDogbG9jYWxlLmRlY2ltYWwgKyAiIiwKICAgICAgICAgIG51bWVyYWxzID0gbG9jYWxlLm51bWVyYWxzID09PSB1bmRlZmluZWQgPyBpZGVudGl0eSQ0IDogZm9ybWF0TnVtZXJhbHMobWFwJDIuY2FsbChsb2NhbGUubnVtZXJhbHMsIFN0cmluZykpLAogICAgICAgICAgcGVyY2VudCA9IGxvY2FsZS5wZXJjZW50ID09PSB1bmRlZmluZWQgPyAiJSIgOiBsb2NhbGUucGVyY2VudCArICIiLAogICAgICAgICAgbWludXMgPSBsb2NhbGUubWludXMgPT09IHVuZGVmaW5lZCA/ICItIiA6IGxvY2FsZS5taW51cyArICIiLAogICAgICAgICAgbmFuID0gbG9jYWxlLm5hbiA9PT0gdW5kZWZpbmVkID8gIk5hTiIgOiBsb2NhbGUubmFuICsgIiI7CgogICAgICBmdW5jdGlvbiBuZXdGb3JtYXQoc3BlY2lmaWVyKSB7CiAgICAgICAgc3BlY2lmaWVyID0gZm9ybWF0U3BlY2lmaWVyKHNwZWNpZmllcik7CgogICAgICAgIHZhciBmaWxsID0gc3BlY2lmaWVyLmZpbGwsCiAgICAgICAgICAgIGFsaWduID0gc3BlY2lmaWVyLmFsaWduLAogICAgICAgICAgICBzaWduID0gc3BlY2lmaWVyLnNpZ24sCiAgICAgICAgICAgIHN5bWJvbCA9IHNwZWNpZmllci5zeW1ib2wsCiAgICAgICAgICAgIHplcm8gPSBzcGVjaWZpZXIuemVybywKICAgICAgICAgICAgd2lkdGggPSBzcGVjaWZpZXIud2lkdGgsCiAgICAgICAgICAgIGNvbW1hID0gc3BlY2lmaWVyLmNvbW1hLAogICAgICAgICAgICBwcmVjaXNpb24gPSBzcGVjaWZpZXIucHJlY2lzaW9uLAogICAgICAgICAgICB0cmltID0gc3BlY2lmaWVyLnRyaW0sCiAgICAgICAgICAgIHR5cGUgPSBzcGVjaWZpZXIudHlwZTsKCiAgICAgICAgLy8gVGhlICJuIiB0eXBlIGlzIGFuIGFsaWFzIGZvciAiLGciLgogICAgICAgIGlmICh0eXBlID09PSAibiIpIGNvbW1hID0gdHJ1ZSwgdHlwZSA9ICJnIjsKCiAgICAgICAgLy8gVGhlICIiIHR5cGUsIGFuZCBhbnkgaW52YWxpZCB0eXBlLCBpcyBhbiBhbGlhcyBmb3IgIi4xMn5nIi4KICAgICAgICBlbHNlIGlmICghZm9ybWF0VHlwZXNbdHlwZV0pIHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkICYmIChwcmVjaXNpb24gPSAxMiksIHRyaW0gPSB0cnVlLCB0eXBlID0gImciOwoKICAgICAgICAvLyBJZiB6ZXJvIGZpbGwgaXMgc3BlY2lmaWVkLCBwYWRkaW5nIGdvZXMgYWZ0ZXIgc2lnbiBhbmQgYmVmb3JlIGRpZ2l0cy4KICAgICAgICBpZiAoemVybyB8fCAoZmlsbCA9PT0gIjAiICYmIGFsaWduID09PSAiPSIpKSB6ZXJvID0gdHJ1ZSwgZmlsbCA9ICIwIiwgYWxpZ24gPSAiPSI7CgogICAgICAgIC8vIENvbXB1dGUgdGhlIHByZWZpeCBhbmQgc3VmZml4LgogICAgICAgIC8vIEZvciBTSS1wcmVmaXgsIHRoZSBzdWZmaXggaXMgbGF6aWx5IGNvbXB1dGVkLgogICAgICAgIHZhciBwcmVmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5UHJlZml4IDogc3ltYm9sID09PSAiIyIgJiYgL1tib3hYXS8udGVzdCh0eXBlKSA/ICIwIiArIHR5cGUudG9Mb3dlckNhc2UoKSA6ICIiLAogICAgICAgICAgICBzdWZmaXggPSBzeW1ib2wgPT09ICIkIiA/IGN1cnJlbmN5U3VmZml4IDogL1slcF0vLnRlc3QodHlwZSkgPyBwZXJjZW50IDogIiI7CgogICAgICAgIC8vIFdoYXQgZm9ybWF0IGZ1bmN0aW9uIHNob3VsZCB3ZSB1c2U/CiAgICAgICAgLy8gSXMgdGhpcyBhbiBpbnRlZ2VyIHR5cGU/CiAgICAgICAgLy8gQ2FuIHRoaXMgdHlwZSBnZW5lcmF0ZSBleHBvbmVudGlhbCBub3RhdGlvbj8KICAgICAgICB2YXIgZm9ybWF0VHlwZSA9IGZvcm1hdFR5cGVzW3R5cGVdLAogICAgICAgICAgICBtYXliZVN1ZmZpeCA9IC9bZGVmZ3BycyVdLy50ZXN0KHR5cGUpOwoKICAgICAgICAvLyBTZXQgdGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlmIG5vdCBzcGVjaWZpZWQsCiAgICAgICAgLy8gb3IgY2xhbXAgdGhlIHNwZWNpZmllZCBwcmVjaXNpb24gdG8gdGhlIHN1cHBvcnRlZCByYW5nZS4KICAgICAgICAvLyBGb3Igc2lnbmlmaWNhbnQgcHJlY2lzaW9uLCBpdCBtdXN0IGJlIGluIFsxLCAyMV0uCiAgICAgICAgLy8gRm9yIGZpeGVkIHByZWNpc2lvbiwgaXQgbXVzdCBiZSBpbiBbMCwgMjBdLgogICAgICAgIHByZWNpc2lvbiA9IHByZWNpc2lvbiA9PT0gdW5kZWZpbmVkID8gNgogICAgICAgICAgICA6IC9bZ3Byc10vLnRlc3QodHlwZSkgPyBNYXRoLm1heCgxLCBNYXRoLm1pbigyMSwgcHJlY2lzaW9uKSkKICAgICAgICAgICAgOiBNYXRoLm1heCgwLCBNYXRoLm1pbigyMCwgcHJlY2lzaW9uKSk7CgogICAgICAgIGZ1bmN0aW9uIGZvcm1hdCh2YWx1ZSkgewogICAgICAgICAgdmFyIHZhbHVlUHJlZml4ID0gcHJlZml4LAogICAgICAgICAgICAgIHZhbHVlU3VmZml4ID0gc3VmZml4LAogICAgICAgICAgICAgIGksIG4sIGM7CgogICAgICAgICAgaWYgKHR5cGUgPT09ICJjIikgewogICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IGZvcm1hdFR5cGUodmFsdWUpICsgdmFsdWVTdWZmaXg7CiAgICAgICAgICAgIHZhbHVlID0gIiI7CiAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICB2YWx1ZSA9ICt2YWx1ZTsKCiAgICAgICAgICAgIC8vIERldGVybWluZSB0aGUgc2lnbi4gLTAgaXMgbm90IGxlc3MgdGhhbiAwLCBidXQgMSAvIC0wIGlzIQogICAgICAgICAgICB2YXIgdmFsdWVOZWdhdGl2ZSA9IHZhbHVlIDwgMCB8fCAxIC8gdmFsdWUgPCAwOwoKICAgICAgICAgICAgLy8gUGVyZm9ybSB0aGUgaW5pdGlhbCBmb3JtYXR0aW5nLgogICAgICAgICAgICB2YWx1ZSA9IGlzTmFOKHZhbHVlKSA/IG5hbiA6IGZvcm1hdFR5cGUoTWF0aC5hYnModmFsdWUpLCBwcmVjaXNpb24pOwoKICAgICAgICAgICAgLy8gVHJpbSBpbnNpZ25pZmljYW50IHplcm9zLgogICAgICAgICAgICBpZiAodHJpbSkgdmFsdWUgPSBmb3JtYXRUcmltKHZhbHVlKTsKCiAgICAgICAgICAgIC8vIElmIGEgbmVnYXRpdmUgdmFsdWUgcm91bmRzIHRvIHplcm8gYWZ0ZXIgZm9ybWF0dGluZywgYW5kIG5vIGV4cGxpY2l0IHBvc2l0aXZlIHNpZ24gaXMgcmVxdWVzdGVkLCBoaWRlIHRoZSBzaWduLgogICAgICAgICAgICBpZiAodmFsdWVOZWdhdGl2ZSAmJiArdmFsdWUgPT09IDAgJiYgc2lnbiAhPT0gIisiKSB2YWx1ZU5lZ2F0aXZlID0gZmFsc2U7CgogICAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwcmVmaXggYW5kIHN1ZmZpeC4KICAgICAgICAgICAgdmFsdWVQcmVmaXggPSAodmFsdWVOZWdhdGl2ZSA/IChzaWduID09PSAiKCIgPyBzaWduIDogbWludXMpIDogc2lnbiA9PT0gIi0iIHx8IHNpZ24gPT09ICIoIiA/ICIiIDogc2lnbikgKyB2YWx1ZVByZWZpeDsKICAgICAgICAgICAgdmFsdWVTdWZmaXggPSAodHlwZSA9PT0gInMiID8gcHJlZml4ZXNbOCArIHByZWZpeEV4cG9uZW50IC8gM10gOiAiIikgKyB2YWx1ZVN1ZmZpeCArICh2YWx1ZU5lZ2F0aXZlICYmIHNpZ24gPT09ICIoIiA/ICIpIiA6ICIiKTsKCiAgICAgICAgICAgIC8vIEJyZWFrIHRoZSBmb3JtYXR0ZWQgdmFsdWUgaW50byB0aGUgaW50ZWdlciDigJx2YWx1ZeKAnSBwYXJ0IHRoYXQgY2FuIGJlCiAgICAgICAgICAgIC8vIGdyb3VwZWQsIGFuZCBmcmFjdGlvbmFsIG9yIGV4cG9uZW50aWFsIOKAnHN1ZmZpeOKAnSBwYXJ0IHRoYXQgaXMgbm90LgogICAgICAgICAgICBpZiAobWF5YmVTdWZmaXgpIHsKICAgICAgICAgICAgICBpID0gLTEsIG4gPSB2YWx1ZS5sZW5ndGg7CiAgICAgICAgICAgICAgd2hpbGUgKCsraSA8IG4pIHsKICAgICAgICAgICAgICAgIGlmIChjID0gdmFsdWUuY2hhckNvZGVBdChpKSwgNDggPiBjIHx8IGMgPiA1NykgewogICAgICAgICAgICAgICAgICB2YWx1ZVN1ZmZpeCA9IChjID09PSA0NiA/IGRlY2ltYWwgKyB2YWx1ZS5zbGljZShpICsgMSkgOiB2YWx1ZS5zbGljZShpKSkgKyB2YWx1ZVN1ZmZpeDsKICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS5zbGljZSgwLCBpKTsKICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICB9CgogICAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzIG5vdCAiMCIsIGdyb3VwaW5nIGlzIGFwcGxpZWQgYmVmb3JlIHBhZGRpbmcuCiAgICAgICAgICBpZiAoY29tbWEgJiYgIXplcm8pIHZhbHVlID0gZ3JvdXAodmFsdWUsIEluZmluaXR5KTsKCiAgICAgICAgICAvLyBDb21wdXRlIHRoZSBwYWRkaW5nLgogICAgICAgICAgdmFyIGxlbmd0aCA9IHZhbHVlUHJlZml4Lmxlbmd0aCArIHZhbHVlLmxlbmd0aCArIHZhbHVlU3VmZml4Lmxlbmd0aCwKICAgICAgICAgICAgICBwYWRkaW5nID0gbGVuZ3RoIDwgd2lkdGggPyBuZXcgQXJyYXkod2lkdGggLSBsZW5ndGggKyAxKS5qb2luKGZpbGwpIDogIiI7CgogICAgICAgICAgLy8gSWYgdGhlIGZpbGwgY2hhcmFjdGVyIGlzICIwIiwgZ3JvdXBpbmcgaXMgYXBwbGllZCBhZnRlciBwYWRkaW5nLgogICAgICAgICAgaWYgKGNvbW1hICYmIHplcm8pIHZhbHVlID0gZ3JvdXAocGFkZGluZyArIHZhbHVlLCBwYWRkaW5nLmxlbmd0aCA/IHdpZHRoIC0gdmFsdWVTdWZmaXgubGVuZ3RoIDogSW5maW5pdHkpLCBwYWRkaW5nID0gIiI7CgogICAgICAgICAgLy8gUmVjb25zdHJ1Y3QgdGhlIGZpbmFsIG91dHB1dCBiYXNlZCBvbiB0aGUgZGVzaXJlZCBhbGlnbm1lbnQuCiAgICAgICAgICBzd2l0Y2ggKGFsaWduKSB7CiAgICAgICAgICAgIGNhc2UgIjwiOiB2YWx1ZSA9IHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmc7IGJyZWFrOwogICAgICAgICAgICBjYXNlICI9IjogdmFsdWUgPSB2YWx1ZVByZWZpeCArIHBhZGRpbmcgKyB2YWx1ZSArIHZhbHVlU3VmZml4OyBicmVhazsKICAgICAgICAgICAgY2FzZSAiXiI6IHZhbHVlID0gcGFkZGluZy5zbGljZSgwLCBsZW5ndGggPSBwYWRkaW5nLmxlbmd0aCA+PiAxKSArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeCArIHBhZGRpbmcuc2xpY2UobGVuZ3RoKTsgYnJlYWs7CiAgICAgICAgICAgIGRlZmF1bHQ6IHZhbHVlID0gcGFkZGluZyArIHZhbHVlUHJlZml4ICsgdmFsdWUgKyB2YWx1ZVN1ZmZpeDsgYnJlYWs7CiAgICAgICAgICB9CgogICAgICAgICAgcmV0dXJuIG51bWVyYWxzKHZhbHVlKTsKICAgICAgICB9CgogICAgICAgIGZvcm1hdC50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewogICAgICAgICAgcmV0dXJuIHNwZWNpZmllciArICIiOwogICAgICAgIH07CgogICAgICAgIHJldHVybiBmb3JtYXQ7CiAgICAgIH0KCiAgICAgIGZ1bmN0aW9uIGZvcm1hdFByZWZpeChzcGVjaWZpZXIsIHZhbHVlKSB7CiAgICAgICAgdmFyIGYgPSBuZXdGb3JtYXQoKHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIpLCBzcGVjaWZpZXIudHlwZSA9ICJmIiwgc3BlY2lmaWVyKSksCiAgICAgICAgICAgIGUgPSBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMywKICAgICAgICAgICAgayA9IE1hdGgucG93KDEwLCAtZSksCiAgICAgICAgICAgIHByZWZpeCA9IHByZWZpeGVzWzggKyBlIC8gM107CiAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKHZhbHVlKSB7CiAgICAgICAgICByZXR1cm4gZihrICogdmFsdWUpICsgcHJlZml4OwogICAgICAgIH07CiAgICAgIH0KCiAgICAgIHJldHVybiB7CiAgICAgICAgZm9ybWF0OiBuZXdGb3JtYXQsCiAgICAgICAgZm9ybWF0UHJlZml4OiBmb3JtYXRQcmVmaXgKICAgICAgfTsKICAgIH0KCiAgICB2YXIgbG9jYWxlOwogICAgdmFyIGZvcm1hdDsKICAgIHZhciBmb3JtYXRQcmVmaXg7CgogICAgZGVmYXVsdExvY2FsZSh7CiAgICAgIGRlY2ltYWw6ICIuIiwKICAgICAgdGhvdXNhbmRzOiAiLCIsCiAgICAgIGdyb3VwaW5nOiBbM10sCiAgICAgIGN1cnJlbmN5OiBbIiQiLCAiIl0sCiAgICAgIG1pbnVzOiAiLSIKICAgIH0pOwoKICAgIGZ1bmN0aW9uIGRlZmF1bHRMb2NhbGUoZGVmaW5pdGlvbikgewogICAgICBsb2NhbGUgPSBmb3JtYXRMb2NhbGUoZGVmaW5pdGlvbik7CiAgICAgIGZvcm1hdCA9IGxvY2FsZS5mb3JtYXQ7CiAgICAgIGZvcm1hdFByZWZpeCA9IGxvY2FsZS5mb3JtYXRQcmVmaXg7CiAgICAgIHJldHVybiBsb2NhbGU7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlY2lzaW9uRml4ZWQoc3RlcCkgewogICAgICByZXR1cm4gTWF0aC5tYXgoMCwgLWV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSB7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBNYXRoLm1heCgtOCwgTWF0aC5taW4oOCwgTWF0aC5mbG9vcihleHBvbmVudCh2YWx1ZSkgLyAzKSkpICogMyAtIGV4cG9uZW50KE1hdGguYWJzKHN0ZXApKSk7CiAgICB9CgogICAgZnVuY3Rpb24gcHJlY2lzaW9uUm91bmQoc3RlcCwgbWF4KSB7CiAgICAgIHN0ZXAgPSBNYXRoLmFicyhzdGVwKSwgbWF4ID0gTWF0aC5hYnMobWF4KSAtIHN0ZXA7CiAgICAgIHJldHVybiBNYXRoLm1heCgwLCBleHBvbmVudChtYXgpIC0gZXhwb25lbnQoc3RlcCkpICsgMTsKICAgIH0KCiAgICBmdW5jdGlvbiBpbml0UmFuZ2UoZG9tYWluLCByYW5nZSkgewogICAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHsKICAgICAgICBjYXNlIDA6IGJyZWFrOwogICAgICAgIGNhc2UgMTogdGhpcy5yYW5nZShkb21haW4pOyBicmVhazsKICAgICAgICBkZWZhdWx0OiB0aGlzLnJhbmdlKHJhbmdlKS5kb21haW4oZG9tYWluKTsgYnJlYWs7CiAgICAgIH0KICAgICAgcmV0dXJuIHRoaXM7CiAgICB9CgogICAgdmFyIGFycmF5JDEgPSBBcnJheS5wcm90b3R5cGU7CgogICAgdmFyIG1hcCQzID0gYXJyYXkkMS5tYXA7CiAgICB2YXIgc2xpY2UkMiA9IGFycmF5JDEuc2xpY2U7CgogICAgdmFyIGltcGxpY2l0ID0ge25hbWU6ICJpbXBsaWNpdCJ9OwoKICAgIGZ1bmN0aW9uIG9yZGluYWwoKSB7CiAgICAgIHZhciBpbmRleCA9IG1hcCQxKCksCiAgICAgICAgICBkb21haW4gPSBbXSwKICAgICAgICAgIHJhbmdlID0gW10sCiAgICAgICAgICB1bmtub3duID0gaW1wbGljaXQ7CgogICAgICBmdW5jdGlvbiBzY2FsZShkKSB7CiAgICAgICAgdmFyIGtleSA9IGQgKyAiIiwgaSA9IGluZGV4LmdldChrZXkpOwogICAgICAgIGlmICghaSkgewogICAgICAgICAgaWYgKHVua25vd24gIT09IGltcGxpY2l0KSByZXR1cm4gdW5rbm93bjsKICAgICAgICAgIGluZGV4LnNldChrZXksIGkgPSBkb21haW4ucHVzaChkKSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByYW5nZVsoaSAtIDEpICUgcmFuZ2UubGVuZ3RoXTsKICAgICAgfQoKICAgICAgc2NhbGUuZG9tYWluID0gZnVuY3Rpb24oXykgewogICAgICAgIGlmICghYXJndW1lbnRzLmxlbmd0aCkgcmV0dXJuIGRvbWFpbi5zbGljZSgpOwogICAgICAgIGRvbWFpbiA9IFtdLCBpbmRleCA9IG1hcCQxKCk7CiAgICAgICAgdmFyIGkgPSAtMSwgbiA9IF8ubGVuZ3RoLCBkLCBrZXk7CiAgICAgICAgd2hpbGUgKCsraSA8IG4pIGlmICghaW5kZXguaGFzKGtleSA9IChkID0gX1tpXSkgKyAiIikpIGluZGV4LnNldChrZXksIGRvbWFpbi5wdXNoKGQpKTsKICAgICAgICByZXR1cm4gc2NhbGU7CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IHNsaWNlJDIuY2FsbChfKSwgc2NhbGUpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnVua25vd24gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAodW5rbm93biA9IF8sIHNjYWxlKSA6IHVua25vd247CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIG9yZGluYWwoZG9tYWluLCByYW5nZSkudW5rbm93bih1bmtub3duKTsKICAgICAgfTsKCiAgICAgIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKCiAgICAgIHJldHVybiBzY2FsZTsKICAgIH0KCiAgICBmdW5jdGlvbiBiYW5kKCkgewogICAgICB2YXIgc2NhbGUgPSBvcmRpbmFsKCkudW5rbm93bih1bmRlZmluZWQpLAogICAgICAgICAgZG9tYWluID0gc2NhbGUuZG9tYWluLAogICAgICAgICAgb3JkaW5hbFJhbmdlID0gc2NhbGUucmFuZ2UsCiAgICAgICAgICByYW5nZSA9IFswLCAxXSwKICAgICAgICAgIHN0ZXAsCiAgICAgICAgICBiYW5kd2lkdGgsCiAgICAgICAgICByb3VuZCA9IGZhbHNlLAogICAgICAgICAgcGFkZGluZ0lubmVyID0gMCwKICAgICAgICAgIHBhZGRpbmdPdXRlciA9IDAsCiAgICAgICAgICBhbGlnbiA9IDAuNTsKCiAgICAgIGRlbGV0ZSBzY2FsZS51bmtub3duOwoKICAgICAgZnVuY3Rpb24gcmVzY2FsZSgpIHsKICAgICAgICB2YXIgbiA9IGRvbWFpbigpLmxlbmd0aCwKICAgICAgICAgICAgcmV2ZXJzZSA9IHJhbmdlWzFdIDwgcmFuZ2VbMF0sCiAgICAgICAgICAgIHN0YXJ0ID0gcmFuZ2VbcmV2ZXJzZSAtIDBdLAogICAgICAgICAgICBzdG9wID0gcmFuZ2VbMSAtIHJldmVyc2VdOwogICAgICAgIHN0ZXAgPSAoc3RvcCAtIHN0YXJ0KSAvIE1hdGgubWF4KDEsIG4gLSBwYWRkaW5nSW5uZXIgKyBwYWRkaW5nT3V0ZXIgKiAyKTsKICAgICAgICBpZiAocm91bmQpIHN0ZXAgPSBNYXRoLmZsb29yKHN0ZXApOwogICAgICAgIHN0YXJ0ICs9IChzdG9wIC0gc3RhcnQgLSBzdGVwICogKG4gLSBwYWRkaW5nSW5uZXIpKSAqIGFsaWduOwogICAgICAgIGJhbmR3aWR0aCA9IHN0ZXAgKiAoMSAtIHBhZGRpbmdJbm5lcik7CiAgICAgICAgaWYgKHJvdW5kKSBzdGFydCA9IE1hdGgucm91bmQoc3RhcnQpLCBiYW5kd2lkdGggPSBNYXRoLnJvdW5kKGJhbmR3aWR0aCk7CiAgICAgICAgdmFyIHZhbHVlcyA9IHNlcXVlbmNlJDEobikubWFwKGZ1bmN0aW9uKGkpIHsgcmV0dXJuIHN0YXJ0ICsgc3RlcCAqIGk7IH0pOwogICAgICAgIHJldHVybiBvcmRpbmFsUmFuZ2UocmV2ZXJzZSA/IHZhbHVlcy5yZXZlcnNlKCkgOiB2YWx1ZXMpOwogICAgICB9CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluKF8pLCByZXNjYWxlKCkpIDogZG9tYWluKCk7CiAgICAgIH07CgogICAgICBzY2FsZS5yYW5nZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChyYW5nZSA9IFsrX1swXSwgK19bMV1dLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIHJhbmdlID0gWytfWzBdLCArX1sxXV0sIHJvdW5kID0gdHJ1ZSwgcmVzY2FsZSgpOwogICAgICB9OwoKICAgICAgc2NhbGUuYmFuZHdpZHRoID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGJhbmR3aWR0aDsKICAgICAgfTsKCiAgICAgIHNjYWxlLnN0ZXAgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gc3RlcDsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJvdW5kID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJvdW5kID0gISFfLCByZXNjYWxlKCkpIDogcm91bmQ7CiAgICAgIH07CgogICAgICBzY2FsZS5wYWRkaW5nID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHBhZGRpbmdJbm5lciA9IE1hdGgubWluKDEsIHBhZGRpbmdPdXRlciA9ICtfKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsKICAgICAgfTsKCiAgICAgIHNjYWxlLnBhZGRpbmdJbm5lciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nSW5uZXIgPSBNYXRoLm1pbigxLCBfKSwgcmVzY2FsZSgpKSA6IHBhZGRpbmdJbm5lcjsKICAgICAgfTsKCiAgICAgIHNjYWxlLnBhZGRpbmdPdXRlciA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChwYWRkaW5nT3V0ZXIgPSArXywgcmVzY2FsZSgpKSA6IHBhZGRpbmdPdXRlcjsKICAgICAgfTsKCiAgICAgIHNjYWxlLmFsaWduID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGFsaWduID0gTWF0aC5tYXgoMCwgTWF0aC5taW4oMSwgXykpLCByZXNjYWxlKCkpIDogYWxpZ247CiAgICAgIH07CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGJhbmQoZG9tYWluKCksIHJhbmdlKQogICAgICAgICAgICAucm91bmQocm91bmQpCiAgICAgICAgICAgIC5wYWRkaW5nSW5uZXIocGFkZGluZ0lubmVyKQogICAgICAgICAgICAucGFkZGluZ091dGVyKHBhZGRpbmdPdXRlcikKICAgICAgICAgICAgLmFsaWduKGFsaWduKTsKICAgICAgfTsKCiAgICAgIHJldHVybiBpbml0UmFuZ2UuYXBwbHkocmVzY2FsZSgpLCBhcmd1bWVudHMpOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50aXNoKHNjYWxlKSB7CiAgICAgIHZhciBjb3B5ID0gc2NhbGUuY29weTsKCiAgICAgIHNjYWxlLnBhZGRpbmcgPSBzY2FsZS5wYWRkaW5nT3V0ZXI7CiAgICAgIGRlbGV0ZSBzY2FsZS5wYWRkaW5nSW5uZXI7CiAgICAgIGRlbGV0ZSBzY2FsZS5wYWRkaW5nT3V0ZXI7CgogICAgICBzY2FsZS5jb3B5ID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHBvaW50aXNoKGNvcHkoKSk7CiAgICAgIH07CgogICAgICByZXR1cm4gc2NhbGU7CiAgICB9CgogICAgZnVuY3Rpb24gcG9pbnQkMSgpIHsKICAgICAgcmV0dXJuIHBvaW50aXNoKGJhbmQuYXBwbHkobnVsbCwgYXJndW1lbnRzKS5wYWRkaW5nSW5uZXIoMSkpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDQoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgZnVuY3Rpb24gbnVtYmVyJDEoeCkgewogICAgICByZXR1cm4gK3g7CiAgICB9CgogICAgdmFyIHVuaXQgPSBbMCwgMV07CgogICAgZnVuY3Rpb24gaWRlbnRpdHkkNSh4KSB7CiAgICAgIHJldHVybiB4OwogICAgfQoKICAgIGZ1bmN0aW9uIG5vcm1hbGl6ZShhLCBiKSB7CiAgICAgIHJldHVybiAoYiAtPSAoYSA9ICthKSkKICAgICAgICAgID8gZnVuY3Rpb24oeCkgeyByZXR1cm4gKHggLSBhKSAvIGI7IH0KICAgICAgICAgIDogY29uc3RhbnQkNChpc05hTihiKSA/IE5hTiA6IDAuNSk7CiAgICB9CgogICAgZnVuY3Rpb24gY2xhbXBlcihkb21haW4pIHsKICAgICAgdmFyIGEgPSBkb21haW5bMF0sIGIgPSBkb21haW5bZG9tYWluLmxlbmd0aCAtIDFdLCB0OwogICAgICBpZiAoYSA+IGIpIHQgPSBhLCBhID0gYiwgYiA9IHQ7CiAgICAgIHJldHVybiBmdW5jdGlvbih4KSB7IHJldHVybiBNYXRoLm1heChhLCBNYXRoLm1pbihiLCB4KSk7IH07CiAgICB9CgogICAgLy8gbm9ybWFsaXplKGEsIGIpKHgpIHRha2VzIGEgZG9tYWluIHZhbHVlIHggaW4gW2EsYl0gYW5kIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgcGFyYW1ldGVyIHQgaW4gWzAsMV0uCiAgICAvLyBpbnRlcnBvbGF0ZShhLCBiKSh0KSB0YWtlcyBhIHBhcmFtZXRlciB0IGluIFswLDFdIGFuZCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJhbmdlIHZhbHVlIHggaW4gW2EsYl0uCiAgICBmdW5jdGlvbiBiaW1hcChkb21haW4sIHJhbmdlLCBpbnRlcnBvbGF0ZSkgewogICAgICB2YXIgZDAgPSBkb21haW5bMF0sIGQxID0gZG9tYWluWzFdLCByMCA9IHJhbmdlWzBdLCByMSA9IHJhbmdlWzFdOwogICAgICBpZiAoZDEgPCBkMCkgZDAgPSBub3JtYWxpemUoZDEsIGQwKSwgcjAgPSBpbnRlcnBvbGF0ZShyMSwgcjApOwogICAgICBlbHNlIGQwID0gbm9ybWFsaXplKGQwLCBkMSksIHIwID0gaW50ZXJwb2xhdGUocjAsIHIxKTsKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsgcmV0dXJuIHIwKGQwKHgpKTsgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBwb2x5bWFwKGRvbWFpbiwgcmFuZ2UsIGludGVycG9sYXRlKSB7CiAgICAgIHZhciBqID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSAtIDEsCiAgICAgICAgICBkID0gbmV3IEFycmF5KGopLAogICAgICAgICAgciA9IG5ldyBBcnJheShqKSwKICAgICAgICAgIGkgPSAtMTsKCiAgICAgIC8vIFJldmVyc2UgZGVzY2VuZGluZyBkb21haW5zLgogICAgICBpZiAoZG9tYWluW2pdIDwgZG9tYWluWzBdKSB7CiAgICAgICAgZG9tYWluID0gZG9tYWluLnNsaWNlKCkucmV2ZXJzZSgpOwogICAgICAgIHJhbmdlID0gcmFuZ2Uuc2xpY2UoKS5yZXZlcnNlKCk7CiAgICAgIH0KCiAgICAgIHdoaWxlICgrK2kgPCBqKSB7CiAgICAgICAgZFtpXSA9IG5vcm1hbGl6ZShkb21haW5baV0sIGRvbWFpbltpICsgMV0pOwogICAgICAgIHJbaV0gPSBpbnRlcnBvbGF0ZShyYW5nZVtpXSwgcmFuZ2VbaSArIDFdKTsKICAgICAgfQoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHgpIHsKICAgICAgICB2YXIgaSA9IGJpc2VjdFJpZ2h0KGRvbWFpbiwgeCwgMSwgaikgLSAxOwogICAgICAgIHJldHVybiByW2ldKGRbaV0oeCkpOwogICAgICB9OwogICAgfQoKICAgIGZ1bmN0aW9uIGNvcHkoc291cmNlLCB0YXJnZXQpIHsKICAgICAgcmV0dXJuIHRhcmdldAogICAgICAgICAgLmRvbWFpbihzb3VyY2UuZG9tYWluKCkpCiAgICAgICAgICAucmFuZ2Uoc291cmNlLnJhbmdlKCkpCiAgICAgICAgICAuaW50ZXJwb2xhdGUoc291cmNlLmludGVycG9sYXRlKCkpCiAgICAgICAgICAuY2xhbXAoc291cmNlLmNsYW1wKCkpCiAgICAgICAgICAudW5rbm93bihzb3VyY2UudW5rbm93bigpKTsKICAgIH0KCiAgICBmdW5jdGlvbiB0cmFuc2Zvcm1lcigpIHsKICAgICAgdmFyIGRvbWFpbiA9IHVuaXQsCiAgICAgICAgICByYW5nZSA9IHVuaXQsCiAgICAgICAgICBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlVmFsdWUsCiAgICAgICAgICB0cmFuc2Zvcm0sCiAgICAgICAgICB1bnRyYW5zZm9ybSwKICAgICAgICAgIHVua25vd24sCiAgICAgICAgICBjbGFtcCA9IGlkZW50aXR5JDUsCiAgICAgICAgICBwaWVjZXdpc2UsCiAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICBpbnB1dDsKCiAgICAgIGZ1bmN0aW9uIHJlc2NhbGUoKSB7CiAgICAgICAgcGllY2V3aXNlID0gTWF0aC5taW4oZG9tYWluLmxlbmd0aCwgcmFuZ2UubGVuZ3RoKSA+IDIgPyBwb2x5bWFwIDogYmltYXA7CiAgICAgICAgb3V0cHV0ID0gaW5wdXQgPSBudWxsOwogICAgICAgIHJldHVybiBzY2FsZTsKICAgICAgfQoKICAgICAgZnVuY3Rpb24gc2NhbGUoeCkgewogICAgICAgIHJldHVybiBpc05hTih4ID0gK3gpID8gdW5rbm93biA6IChvdXRwdXQgfHwgKG91dHB1dCA9IHBpZWNld2lzZShkb21haW4ubWFwKHRyYW5zZm9ybSksIHJhbmdlLCBpbnRlcnBvbGF0ZSkpKSh0cmFuc2Zvcm0oY2xhbXAoeCkpKTsKICAgICAgfQoKICAgICAgc2NhbGUuaW52ZXJ0ID0gZnVuY3Rpb24oeSkgewogICAgICAgIHJldHVybiBjbGFtcCh1bnRyYW5zZm9ybSgoaW5wdXQgfHwgKGlucHV0ID0gcGllY2V3aXNlKHJhbmdlLCBkb21haW4ubWFwKHRyYW5zZm9ybSksIGludGVycG9sYXRlTnVtYmVyKSkpKHkpKSk7CiAgICAgIH07CgogICAgICBzY2FsZS5kb21haW4gPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZG9tYWluID0gbWFwJDMuY2FsbChfLCBudW1iZXIkMSksIGNsYW1wID09PSBpZGVudGl0eSQ1IHx8IChjbGFtcCA9IGNsYW1wZXIoZG9tYWluKSksIHJlc2NhbGUoKSkgOiBkb21haW4uc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHJhbmdlID0gc2xpY2UkMi5jYWxsKF8pLCByZXNjYWxlKCkpIDogcmFuZ2Uuc2xpY2UoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnJhbmdlUm91bmQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIHJhbmdlID0gc2xpY2UkMi5jYWxsKF8pLCBpbnRlcnBvbGF0ZSA9IGludGVycG9sYXRlUm91bmQsIHJlc2NhbGUoKTsKICAgICAgfTsKCiAgICAgIHNjYWxlLmNsYW1wID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGNsYW1wID0gXyA/IGNsYW1wZXIoZG9tYWluKSA6IGlkZW50aXR5JDUsIHNjYWxlKSA6IGNsYW1wICE9PSBpZGVudGl0eSQ1OwogICAgICB9OwoKICAgICAgc2NhbGUuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoaW50ZXJwb2xhdGUgPSBfLCByZXNjYWxlKCkpIDogaW50ZXJwb2xhdGU7CiAgICAgIH07CgogICAgICBzY2FsZS51bmtub3duID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHVua25vd24gPSBfLCBzY2FsZSkgOiB1bmtub3duOwogICAgICB9OwoKICAgICAgcmV0dXJuIGZ1bmN0aW9uKHQsIHUpIHsKICAgICAgICB0cmFuc2Zvcm0gPSB0LCB1bnRyYW5zZm9ybSA9IHU7CiAgICAgICAgcmV0dXJuIHJlc2NhbGUoKTsKICAgICAgfTsKICAgIH0KCiAgICBmdW5jdGlvbiBjb250aW51b3VzKHRyYW5zZm9ybSwgdW50cmFuc2Zvcm0pIHsKICAgICAgcmV0dXJuIHRyYW5zZm9ybWVyKCkodHJhbnNmb3JtLCB1bnRyYW5zZm9ybSk7CiAgICB9CgogICAgZnVuY3Rpb24gdGlja0Zvcm1hdChzdGFydCwgc3RvcCwgY291bnQsIHNwZWNpZmllcikgewogICAgICB2YXIgc3RlcCA9IHRpY2tTdGVwKHN0YXJ0LCBzdG9wLCBjb3VudCksCiAgICAgICAgICBwcmVjaXNpb247CiAgICAgIHNwZWNpZmllciA9IGZvcm1hdFNwZWNpZmllcihzcGVjaWZpZXIgPT0gbnVsbCA/ICIsZiIgOiBzcGVjaWZpZXIpOwogICAgICBzd2l0Y2ggKHNwZWNpZmllci50eXBlKSB7CiAgICAgICAgY2FzZSAicyI6IHsKICAgICAgICAgIHZhciB2YWx1ZSA9IE1hdGgubWF4KE1hdGguYWJzKHN0YXJ0KSwgTWF0aC5hYnMoc3RvcCkpOwogICAgICAgICAgaWYgKHNwZWNpZmllci5wcmVjaXNpb24gPT0gbnVsbCAmJiAhaXNOYU4ocHJlY2lzaW9uID0gcHJlY2lzaW9uUHJlZml4KHN0ZXAsIHZhbHVlKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb247CiAgICAgICAgICByZXR1cm4gZm9ybWF0UHJlZml4KHNwZWNpZmllciwgdmFsdWUpOwogICAgICAgIH0KICAgICAgICBjYXNlICIiOgogICAgICAgIGNhc2UgImUiOgogICAgICAgIGNhc2UgImciOgogICAgICAgIGNhc2UgInAiOgogICAgICAgIGNhc2UgInIiOiB7CiAgICAgICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25Sb3VuZChzdGVwLCBNYXRoLm1heChNYXRoLmFicyhzdGFydCksIE1hdGguYWJzKHN0b3ApKSkpKSBzcGVjaWZpZXIucHJlY2lzaW9uID0gcHJlY2lzaW9uIC0gKHNwZWNpZmllci50eXBlID09PSAiZSIpOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGNhc2UgImYiOgogICAgICAgIGNhc2UgIiUiOiB7CiAgICAgICAgICBpZiAoc3BlY2lmaWVyLnByZWNpc2lvbiA9PSBudWxsICYmICFpc05hTihwcmVjaXNpb24gPSBwcmVjaXNpb25GaXhlZChzdGVwKSkpIHNwZWNpZmllci5wcmVjaXNpb24gPSBwcmVjaXNpb24gLSAoc3BlY2lmaWVyLnR5cGUgPT09ICIlIikgKiAyOwogICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICB9CiAgICAgIHJldHVybiBmb3JtYXQoc3BlY2lmaWVyKTsKICAgIH0KCiAgICBmdW5jdGlvbiBsaW5lYXJpc2goc2NhbGUpIHsKICAgICAgdmFyIGRvbWFpbiA9IHNjYWxlLmRvbWFpbjsKCiAgICAgIHNjYWxlLnRpY2tzID0gZnVuY3Rpb24oY291bnQpIHsKICAgICAgICB2YXIgZCA9IGRvbWFpbigpOwogICAgICAgIHJldHVybiB0aWNrcyhkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50KTsKICAgICAgfTsKCiAgICAgIHNjYWxlLnRpY2tGb3JtYXQgPSBmdW5jdGlvbihjb3VudCwgc3BlY2lmaWVyKSB7CiAgICAgICAgdmFyIGQgPSBkb21haW4oKTsKICAgICAgICByZXR1cm4gdGlja0Zvcm1hdChkWzBdLCBkW2QubGVuZ3RoIC0gMV0sIGNvdW50ID09IG51bGwgPyAxMCA6IGNvdW50LCBzcGVjaWZpZXIpOwogICAgICB9OwoKICAgICAgc2NhbGUubmljZSA9IGZ1bmN0aW9uKGNvdW50KSB7CiAgICAgICAgaWYgKGNvdW50ID09IG51bGwpIGNvdW50ID0gMTA7CgogICAgICAgIHZhciBkID0gZG9tYWluKCksCiAgICAgICAgICAgIGkwID0gMCwKICAgICAgICAgICAgaTEgPSBkLmxlbmd0aCAtIDEsCiAgICAgICAgICAgIHN0YXJ0ID0gZFtpMF0sCiAgICAgICAgICAgIHN0b3AgPSBkW2kxXSwKICAgICAgICAgICAgc3RlcDsKCiAgICAgICAgaWYgKHN0b3AgPCBzdGFydCkgewogICAgICAgICAgc3RlcCA9IHN0YXJ0LCBzdGFydCA9IHN0b3AsIHN0b3AgPSBzdGVwOwogICAgICAgICAgc3RlcCA9IGkwLCBpMCA9IGkxLCBpMSA9IHN0ZXA7CiAgICAgICAgfQoKICAgICAgICBzdGVwID0gdGlja0luY3JlbWVudChzdGFydCwgc3RvcCwgY291bnQpOwoKICAgICAgICBpZiAoc3RlcCA+IDApIHsKICAgICAgICAgIHN0YXJ0ID0gTWF0aC5mbG9vcihzdGFydCAvIHN0ZXApICogc3RlcDsKICAgICAgICAgIHN0b3AgPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgICAgIHN0ZXAgPSB0aWNrSW5jcmVtZW50KHN0YXJ0LCBzdG9wLCBjb3VudCk7CiAgICAgICAgfSBlbHNlIGlmIChzdGVwIDwgMCkgewogICAgICAgICAgc3RhcnQgPSBNYXRoLmNlaWwoc3RhcnQgKiBzdGVwKSAvIHN0ZXA7CiAgICAgICAgICBzdG9wID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOwogICAgICAgICAgc3RlcCA9IHRpY2tJbmNyZW1lbnQoc3RhcnQsIHN0b3AsIGNvdW50KTsKICAgICAgICB9CgogICAgICAgIGlmIChzdGVwID4gMCkgewogICAgICAgICAgZFtpMF0gPSBNYXRoLmZsb29yKHN0YXJ0IC8gc3RlcCkgKiBzdGVwOwogICAgICAgICAgZFtpMV0gPSBNYXRoLmNlaWwoc3RvcCAvIHN0ZXApICogc3RlcDsKICAgICAgICAgIGRvbWFpbihkKTsKICAgICAgICB9IGVsc2UgaWYgKHN0ZXAgPCAwKSB7CiAgICAgICAgICBkW2kwXSA9IE1hdGguY2VpbChzdGFydCAqIHN0ZXApIC8gc3RlcDsKICAgICAgICAgIGRbaTFdID0gTWF0aC5mbG9vcihzdG9wICogc3RlcCkgLyBzdGVwOwogICAgICAgICAgZG9tYWluKGQpOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuIHNjYWxlOwogICAgICB9OwoKICAgICAgcmV0dXJuIHNjYWxlOwogICAgfQoKICAgIGZ1bmN0aW9uIGxpbmVhciQxKCkgewogICAgICB2YXIgc2NhbGUgPSBjb250aW51b3VzKGlkZW50aXR5JDUsIGlkZW50aXR5JDUpOwoKICAgICAgc2NhbGUuY29weSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBjb3B5KHNjYWxlLCBsaW5lYXIkMSgpKTsKICAgICAgfTsKCiAgICAgIGluaXRSYW5nZS5hcHBseShzY2FsZSwgYXJndW1lbnRzKTsKCiAgICAgIHJldHVybiBsaW5lYXJpc2goc2NhbGUpOwogICAgfQoKICAgIGZ1bmN0aW9uIGNvbG9ycyhzcGVjaWZpZXIpIHsKICAgICAgdmFyIG4gPSBzcGVjaWZpZXIubGVuZ3RoIC8gNiB8IDAsIGNvbG9ycyA9IG5ldyBBcnJheShuKSwgaSA9IDA7CiAgICAgIHdoaWxlIChpIDwgbikgY29sb3JzW2ldID0gIiMiICsgc3BlY2lmaWVyLnNsaWNlKGkgKiA2LCArK2kgKiA2KTsKICAgICAgcmV0dXJuIGNvbG9yczsKICAgIH0KCiAgICBmdW5jdGlvbiByYW1wKHNjaGVtZSkgewogICAgICByZXR1cm4gcmdiQmFzaXMoc2NoZW1lW3NjaGVtZS5sZW5ndGggLSAxXSk7CiAgICB9CgogICAgdmFyIHNjaGVtZSA9IG5ldyBBcnJheSgzKS5jb25jYXQoCiAgICAgICJkZWViZjc5ZWNhZTEzMTgyYmQiLAogICAgICAiZWZmM2ZmYmRkN2U3NmJhZWQ2MjE3MWI1IiwKICAgICAgImVmZjNmZmJkZDdlNzZiYWVkNjMxODJiZDA4NTE5YyIsCiAgICAgICJlZmYzZmZjNmRiZWY5ZWNhZTE2YmFlZDYzMTgyYmQwODUxOWMiLAogICAgICAiZWZmM2ZmYzZkYmVmOWVjYWUxNmJhZWQ2NDI5MmM2MjE3MWI1MDg0NTk0IiwKICAgICAgImY3ZmJmZmRlZWJmN2M2ZGJlZjllY2FlMTZiYWVkNjQyOTJjNjIxNzFiNTA4NDU5NCIsCiAgICAgICJmN2ZiZmZkZWViZjdjNmRiZWY5ZWNhZTE2YmFlZDY0MjkyYzYyMTcxYjUwODUxOWMwODMwNmIiCiAgICApLm1hcChjb2xvcnMpOwoKICAgIHZhciBCbHVlcyA9IHJhbXAoc2NoZW1lKTsKCiAgICB2YXIgc2NoZW1lJDEgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZjBmMGYwYmRiZGJkNjM2MzYzIiwKICAgICAgImY3ZjdmN2NjY2NjYzk2OTY5NjUyNTI1MiIsCiAgICAgICJmN2Y3ZjdjY2NjY2M5Njk2OTY2MzYzNjMyNTI1MjUiLAogICAgICAiZjdmN2Y3ZDlkOWQ5YmRiZGJkOTY5Njk2NjM2MzYzMjUyNTI1IiwKICAgICAgImY3ZjdmN2Q5ZDlkOWJkYmRiZDk2OTY5NjczNzM3MzUyNTI1MjI1MjUyNSIsCiAgICAgICJmZmZmZmZmMGYwZjBkOWQ5ZDliZGJkYmQ5Njk2OTY3MzczNzM1MjUyNTIyNTI1MjUiLAogICAgICAiZmZmZmZmZjBmMGYwZDlkOWQ5YmRiZGJkOTY5Njk2NzM3MzczNTI1MjUyMjUyNTI1MDAwMDAwIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgR3JleXMgPSByYW1wKHNjaGVtZSQxKTsKCiAgICB2YXIgc2NoZW1lJDIgPSBuZXcgQXJyYXkoMykuY29uY2F0KAogICAgICAiZmVlMGQyZmM5MjcyZGUyZDI2IiwKICAgICAgImZlZTVkOWZjYWU5MWZiNmE0YWNiMTgxZCIsCiAgICAgICJmZWU1ZDlmY2FlOTFmYjZhNGFkZTJkMjZhNTBmMTUiLAogICAgICAiZmVlNWQ5ZmNiYmExZmM5MjcyZmI2YTRhZGUyZDI2YTUwZjE1IiwKICAgICAgImZlZTVkOWZjYmJhMWZjOTI3MmZiNmE0YWVmM2IyY2NiMTgxZDk5MDAwZCIsCiAgICAgICJmZmY1ZjBmZWUwZDJmY2JiYTFmYzkyNzJmYjZhNGFlZjNiMmNjYjE4MWQ5OTAwMGQiLAogICAgICAiZmZmNWYwZmVlMGQyZmNiYmExZmM5MjcyZmI2YTRhZWYzYjJjY2IxODFkYTUwZjE1NjcwMDBkIgogICAgKS5tYXAoY29sb3JzKTsKCiAgICB2YXIgUmVkcyA9IHJhbXAoc2NoZW1lJDIpOwoKICAgIGZ1bmN0aW9uIGNvbnN0YW50JDUoeCkgewogICAgICByZXR1cm4gZnVuY3Rpb24gY29uc3RhbnQoKSB7CiAgICAgICAgcmV0dXJuIHg7CiAgICAgIH07CiAgICB9CgogICAgdmFyIGVwc2lsb24kMiA9IDFlLTEyOwoKICAgIGZ1bmN0aW9uIExpbmVhcihjb250ZXh0KSB7CiAgICAgIHRoaXMuX2NvbnRleHQgPSBjb250ZXh0OwogICAgfQoKICAgIExpbmVhci5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgLy8gcHJvY2VlZAogICAgICAgICAgZGVmYXVsdDogdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgfQogICAgfTsKCiAgICBmdW5jdGlvbiBjdXJ2ZUxpbmVhcihjb250ZXh0KSB7CiAgICAgIHJldHVybiBuZXcgTGluZWFyKGNvbnRleHQpOwogICAgfQoKICAgIGZ1bmN0aW9uIHgocCkgewogICAgICByZXR1cm4gcFswXTsKICAgIH0KCiAgICBmdW5jdGlvbiB5KHApIHsKICAgICAgcmV0dXJuIHBbMV07CiAgICB9CgogICAgZnVuY3Rpb24gbGluZSgpIHsKICAgICAgdmFyIHgkMSA9IHgsCiAgICAgICAgICB5JDEgPSB5LAogICAgICAgICAgZGVmaW5lZCA9IGNvbnN0YW50JDUodHJ1ZSksCiAgICAgICAgICBjb250ZXh0ID0gbnVsbCwKICAgICAgICAgIGN1cnZlID0gY3VydmVMaW5lYXIsCiAgICAgICAgICBvdXRwdXQgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gbGluZShkYXRhKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgZCwKICAgICAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSwKICAgICAgICAgICAgYnVmZmVyOwoKICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSBvdXRwdXQgPSBjdXJ2ZShidWZmZXIgPSBwYXRoKCkpOwoKICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IG47ICsraSkgewogICAgICAgICAgaWYgKCEoaSA8IG4gJiYgZGVmaW5lZChkID0gZGF0YVtpXSwgaSwgZGF0YSkpID09PSBkZWZpbmVkMCkgewogICAgICAgICAgICBpZiAoZGVmaW5lZDAgPSAhZGVmaW5lZDApIG91dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICAgICAgZWxzZSBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmluZWQwKSBvdXRwdXQucG9pbnQoK3gkMShkLCBpLCBkYXRhKSwgK3kkMShkLCBpLCBkYXRhKSk7CiAgICAgICAgfQoKICAgICAgICBpZiAoYnVmZmVyKSByZXR1cm4gb3V0cHV0ID0gbnVsbCwgYnVmZmVyICsgIiIgfHwgbnVsbDsKICAgICAgfQoKICAgICAgbGluZS54ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgkMSA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDUoK18pLCBsaW5lKSA6IHgkMTsKICAgICAgfTsKCiAgICAgIGxpbmUueSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh5JDEgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ1KCtfKSwgbGluZSkgOiB5JDE7CiAgICAgIH07CgogICAgICBsaW5lLmRlZmluZWQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoZGVmaW5lZCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDUoISFfKSwgbGluZSkgOiBkZWZpbmVkOwogICAgICB9OwoKICAgICAgbGluZS5jdXJ2ZSA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChjdXJ2ZSA9IF8sIGNvbnRleHQgIT0gbnVsbCAmJiAob3V0cHV0ID0gY3VydmUoY29udGV4dCkpLCBsaW5lKSA6IGN1cnZlOwogICAgICB9OwoKICAgICAgbGluZS5jb250ZXh0ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKF8gPT0gbnVsbCA/IGNvbnRleHQgPSBvdXRwdXQgPSBudWxsIDogb3V0cHV0ID0gY3VydmUoY29udGV4dCA9IF8pLCBsaW5lKSA6IGNvbnRleHQ7CiAgICAgIH07CgogICAgICByZXR1cm4gbGluZTsKICAgIH0KCiAgICBmdW5jdGlvbiBhcmVhKCkgewogICAgICB2YXIgeDAgPSB4LAogICAgICAgICAgeDEgPSBudWxsLAogICAgICAgICAgeTAgPSBjb25zdGFudCQ1KDApLAogICAgICAgICAgeTEgPSB5LAogICAgICAgICAgZGVmaW5lZCA9IGNvbnN0YW50JDUodHJ1ZSksCiAgICAgICAgICBjb250ZXh0ID0gbnVsbCwKICAgICAgICAgIGN1cnZlID0gY3VydmVMaW5lYXIsCiAgICAgICAgICBvdXRwdXQgPSBudWxsOwoKICAgICAgZnVuY3Rpb24gYXJlYShkYXRhKSB7CiAgICAgICAgdmFyIGksCiAgICAgICAgICAgIGosCiAgICAgICAgICAgIGssCiAgICAgICAgICAgIG4gPSBkYXRhLmxlbmd0aCwKICAgICAgICAgICAgZCwKICAgICAgICAgICAgZGVmaW5lZDAgPSBmYWxzZSwKICAgICAgICAgICAgYnVmZmVyLAogICAgICAgICAgICB4MHogPSBuZXcgQXJyYXkobiksCiAgICAgICAgICAgIHkweiA9IG5ldyBBcnJheShuKTsKCiAgICAgICAgaWYgKGNvbnRleHQgPT0gbnVsbCkgb3V0cHV0ID0gY3VydmUoYnVmZmVyID0gcGF0aCgpKTsKCiAgICAgICAgZm9yIChpID0gMDsgaSA8PSBuOyArK2kpIHsKICAgICAgICAgIGlmICghKGkgPCBuICYmIGRlZmluZWQoZCA9IGRhdGFbaV0sIGksIGRhdGEpKSA9PT0gZGVmaW5lZDApIHsKICAgICAgICAgICAgaWYgKGRlZmluZWQwID0gIWRlZmluZWQwKSB7CiAgICAgICAgICAgICAgaiA9IGk7CiAgICAgICAgICAgICAgb3V0cHV0LmFyZWFTdGFydCgpOwogICAgICAgICAgICAgIG91dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICBvdXRwdXQubGluZUVuZCgpOwogICAgICAgICAgICAgIG91dHB1dC5saW5lU3RhcnQoKTsKICAgICAgICAgICAgICBmb3IgKGsgPSBpIC0gMTsgayA+PSBqOyAtLWspIHsKICAgICAgICAgICAgICAgIG91dHB1dC5wb2ludCh4MHpba10sIHkweltrXSk7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICAgIG91dHB1dC5saW5lRW5kKCk7CiAgICAgICAgICAgICAgb3V0cHV0LmFyZWFFbmQoKTsKICAgICAgICAgICAgfQogICAgICAgICAgfQogICAgICAgICAgaWYgKGRlZmluZWQwKSB7CiAgICAgICAgICAgIHgweltpXSA9ICt4MChkLCBpLCBkYXRhKSwgeTB6W2ldID0gK3kwKGQsIGksIGRhdGEpOwogICAgICAgICAgICBvdXRwdXQucG9pbnQoeDEgPyAreDEoZCwgaSwgZGF0YSkgOiB4MHpbaV0sIHkxID8gK3kxKGQsIGksIGRhdGEpIDogeTB6W2ldKTsKICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGlmIChidWZmZXIpIHJldHVybiBvdXRwdXQgPSBudWxsLCBidWZmZXIgKyAiIiB8fCBudWxsOwogICAgICB9CgogICAgICBmdW5jdGlvbiBhcmVhbGluZSgpIHsKICAgICAgICByZXR1cm4gbGluZSgpLmRlZmluZWQoZGVmaW5lZCkuY3VydmUoY3VydmUpLmNvbnRleHQoY29udGV4dCk7CiAgICAgIH0KCiAgICAgIGFyZWEueCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/ICh4MCA9IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDUoK18pLCB4MSA9IG51bGwsIGFyZWEpIDogeDA7CiAgICAgIH07CgogICAgICBhcmVhLngwID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIGFyZWEpIDogeDA7CiAgICAgIH07CgogICAgICBhcmVhLngxID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHgxID0gXyA9PSBudWxsID8gbnVsbCA6IHR5cGVvZiBfID09PSAiZnVuY3Rpb24iID8gXyA6IGNvbnN0YW50JDUoK18pLCBhcmVhKSA6IHgxOwogICAgICB9OwoKICAgICAgYXJlYS55ID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKHkwID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIHkxID0gbnVsbCwgYXJlYSkgOiB5MDsKICAgICAgfTsKCiAgICAgIGFyZWEueTAgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTAgPSB0eXBlb2YgXyA9PT0gImZ1bmN0aW9uIiA/IF8gOiBjb25zdGFudCQ1KCtfKSwgYXJlYSkgOiB5MDsKICAgICAgfTsKCiAgICAgIGFyZWEueTEgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoeTEgPSBfID09IG51bGwgPyBudWxsIDogdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSgrXyksIGFyZWEpIDogeTE7CiAgICAgIH07CgogICAgICBhcmVhLmxpbmVYMCA9CiAgICAgIGFyZWEubGluZVkwID0gZnVuY3Rpb24oKSB7CiAgICAgICAgcmV0dXJuIGFyZWFsaW5lKCkueCh4MCkueSh5MCk7CiAgICAgIH07CgogICAgICBhcmVhLmxpbmVZMSA9IGZ1bmN0aW9uKCkgewogICAgICAgIHJldHVybiBhcmVhbGluZSgpLngoeDApLnkoeTEpOwogICAgICB9OwoKICAgICAgYXJlYS5saW5lWDEgPSBmdW5jdGlvbigpIHsKICAgICAgICByZXR1cm4gYXJlYWxpbmUoKS54KHgxKS55KHkwKTsKICAgICAgfTsKCiAgICAgIGFyZWEuZGVmaW5lZCA9IGZ1bmN0aW9uKF8pIHsKICAgICAgICByZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA/IChkZWZpbmVkID0gdHlwZW9mIF8gPT09ICJmdW5jdGlvbiIgPyBfIDogY29uc3RhbnQkNSghIV8pLCBhcmVhKSA6IGRlZmluZWQ7CiAgICAgIH07CgogICAgICBhcmVhLmN1cnZlID0gZnVuY3Rpb24oXykgewogICAgICAgIHJldHVybiBhcmd1bWVudHMubGVuZ3RoID8gKGN1cnZlID0gXywgY29udGV4dCAhPSBudWxsICYmIChvdXRwdXQgPSBjdXJ2ZShjb250ZXh0KSksIGFyZWEpIDogY3VydmU7CiAgICAgIH07CgogICAgICBhcmVhLmNvbnRleHQgPSBmdW5jdGlvbihfKSB7CiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggPyAoXyA9PSBudWxsID8gY29udGV4dCA9IG91dHB1dCA9IG51bGwgOiBvdXRwdXQgPSBjdXJ2ZShjb250ZXh0ID0gXyksIGFyZWEpIDogY29udGV4dDsKICAgICAgfTsKCiAgICAgIHJldHVybiBhcmVhOwogICAgfQoKICAgIGZ1bmN0aW9uIHBvaW50JDIodGhhdCwgeCwgeSkgewogICAgICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oCiAgICAgICAgdGhhdC5feDEgKyB0aGF0Ll9rICogKHRoYXQuX3gyIC0gdGhhdC5feDApLAogICAgICAgIHRoYXQuX3kxICsgdGhhdC5fayAqICh0aGF0Ll95MiAtIHRoYXQuX3kwKSwKICAgICAgICB0aGF0Ll94MiArIHRoYXQuX2sgKiAodGhhdC5feDEgLSB4KSwKICAgICAgICB0aGF0Ll95MiArIHRoYXQuX2sgKiAodGhhdC5feTEgLSB5KSwKICAgICAgICB0aGF0Ll94MiwKICAgICAgICB0aGF0Ll95MgogICAgICApOwogICAgfQoKICAgIGZ1bmN0aW9uIENhcmRpbmFsKGNvbnRleHQsIHRlbnNpb24pIHsKICAgICAgdGhpcy5fY29udGV4dCA9IGNvbnRleHQ7CiAgICAgIHRoaXMuX2sgPSAoMSAtIHRlbnNpb24pIC8gNjsKICAgIH0KCiAgICBDYXJkaW5hbC5wcm90b3R5cGUgPSB7CiAgICAgIGFyZWFTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IDA7CiAgICAgIH0sCiAgICAgIGFyZWFFbmQ6IGZ1bmN0aW9uKCkgewogICAgICAgIHRoaXMuX2xpbmUgPSBOYU47CiAgICAgIH0sCiAgICAgIGxpbmVTdGFydDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSA9IHRoaXMuX3gyID0KICAgICAgICB0aGlzLl95MCA9IHRoaXMuX3kxID0gdGhpcy5feTIgPSBOYU47CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgICAgY2FzZSAzOiBwb2ludCQyKHRoaXMsIHRoaXMuX3gxLCB0aGlzLl95MSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwogICAgICAgIHN3aXRjaCAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIGNhc2UgMDogdGhpcy5fcG9pbnQgPSAxOyB0aGlzLl9saW5lID8gdGhpcy5fY29udGV4dC5saW5lVG8oeCwgeSkgOiB0aGlzLl9jb250ZXh0Lm1vdmVUbyh4LCB5KTsgYnJlYWs7CiAgICAgICAgICBjYXNlIDE6IHRoaXMuX3BvaW50ID0gMjsgdGhpcy5feDEgPSB4LCB0aGlzLl95MSA9IHk7IGJyZWFrOwogICAgICAgICAgY2FzZSAyOiB0aGlzLl9wb2ludCA9IDM7IC8vIHByb2NlZWQKICAgICAgICAgIGRlZmF1bHQ6IHBvaW50JDIodGhpcywgeCwgeSk7IGJyZWFrOwogICAgICAgIH0KICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxLCB0aGlzLl94MSA9IHRoaXMuX3gyLCB0aGlzLl94MiA9IHg7CiAgICAgICAgdGhpcy5feTAgPSB0aGlzLl95MSwgdGhpcy5feTEgPSB0aGlzLl95MiwgdGhpcy5feTIgPSB5OwogICAgICB9CiAgICB9OwoKICAgIGZ1bmN0aW9uIHBvaW50JDModGhhdCwgeCwgeSkgewogICAgICB2YXIgeDEgPSB0aGF0Ll94MSwKICAgICAgICAgIHkxID0gdGhhdC5feTEsCiAgICAgICAgICB4MiA9IHRoYXQuX3gyLAogICAgICAgICAgeTIgPSB0aGF0Ll95MjsKCiAgICAgIGlmICh0aGF0Ll9sMDFfYSA+IGVwc2lsb24kMikgewogICAgICAgIHZhciBhID0gMiAqIHRoYXQuX2wwMV8yYSArIDMgKiB0aGF0Ll9sMDFfYSAqIHRoYXQuX2wxMl9hICsgdGhhdC5fbDEyXzJhLAogICAgICAgICAgICBuID0gMyAqIHRoYXQuX2wwMV9hICogKHRoYXQuX2wwMV9hICsgdGhhdC5fbDEyX2EpOwogICAgICAgIHgxID0gKHgxICogYSAtIHRoYXQuX3gwICogdGhhdC5fbDEyXzJhICsgdGhhdC5feDIgKiB0aGF0Ll9sMDFfMmEpIC8gbjsKICAgICAgICB5MSA9ICh5MSAqIGEgLSB0aGF0Ll95MCAqIHRoYXQuX2wxMl8yYSArIHRoYXQuX3kyICogdGhhdC5fbDAxXzJhKSAvIG47CiAgICAgIH0KCiAgICAgIGlmICh0aGF0Ll9sMjNfYSA+IGVwc2lsb24kMikgewogICAgICAgIHZhciBiID0gMiAqIHRoYXQuX2wyM18yYSArIDMgKiB0aGF0Ll9sMjNfYSAqIHRoYXQuX2wxMl9hICsgdGhhdC5fbDEyXzJhLAogICAgICAgICAgICBtID0gMyAqIHRoYXQuX2wyM19hICogKHRoYXQuX2wyM19hICsgdGhhdC5fbDEyX2EpOwogICAgICAgIHgyID0gKHgyICogYiArIHRoYXQuX3gxICogdGhhdC5fbDIzXzJhIC0geCAqIHRoYXQuX2wxMl8yYSkgLyBtOwogICAgICAgIHkyID0gKHkyICogYiArIHRoYXQuX3kxICogdGhhdC5fbDIzXzJhIC0geSAqIHRoYXQuX2wxMl8yYSkgLyBtOwogICAgICB9CgogICAgICB0aGF0Ll9jb250ZXh0LmJlemllckN1cnZlVG8oeDEsIHkxLCB4MiwgeTIsIHRoYXQuX3gyLCB0aGF0Ll95Mik7CiAgICB9CgogICAgZnVuY3Rpb24gQ2F0bXVsbFJvbShjb250ZXh0LCBhbHBoYSkgewogICAgICB0aGlzLl9jb250ZXh0ID0gY29udGV4dDsKICAgICAgdGhpcy5fYWxwaGEgPSBhbHBoYTsKICAgIH0KCiAgICBDYXRtdWxsUm9tLnByb3RvdHlwZSA9IHsKICAgICAgYXJlYVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl9saW5lID0gMDsKICAgICAgfSwKICAgICAgYXJlYUVuZDogZnVuY3Rpb24oKSB7CiAgICAgICAgdGhpcy5fbGluZSA9IE5hTjsKICAgICAgfSwKICAgICAgbGluZVN0YXJ0OiBmdW5jdGlvbigpIHsKICAgICAgICB0aGlzLl94MCA9IHRoaXMuX3gxID0gdGhpcy5feDIgPQogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEgPSB0aGlzLl95MiA9IE5hTjsKICAgICAgICB0aGlzLl9sMDFfYSA9IHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2EgPQogICAgICAgIHRoaXMuX2wwMV8yYSA9IHRoaXMuX2wxMl8yYSA9IHRoaXMuX2wyM18yYSA9CiAgICAgICAgdGhpcy5fcG9pbnQgPSAwOwogICAgICB9LAogICAgICBsaW5lRW5kOiBmdW5jdGlvbigpIHsKICAgICAgICBzd2l0Y2ggKHRoaXMuX3BvaW50KSB7CiAgICAgICAgICBjYXNlIDI6IHRoaXMuX2NvbnRleHQubGluZVRvKHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgICAgY2FzZSAzOiB0aGlzLnBvaW50KHRoaXMuX3gyLCB0aGlzLl95Mik7IGJyZWFrOwogICAgICAgIH0KICAgICAgICBpZiAodGhpcy5fbGluZSB8fCAodGhpcy5fbGluZSAhPT0gMCAmJiB0aGlzLl9wb2ludCA9PT0gMSkpIHRoaXMuX2NvbnRleHQuY2xvc2VQYXRoKCk7CiAgICAgICAgdGhpcy5fbGluZSA9IDEgLSB0aGlzLl9saW5lOwogICAgICB9LAogICAgICBwb2ludDogZnVuY3Rpb24oeCwgeSkgewogICAgICAgIHggPSAreCwgeSA9ICt5OwoKICAgICAgICBpZiAodGhpcy5fcG9pbnQpIHsKICAgICAgICAgIHZhciB4MjMgPSB0aGlzLl94MiAtIHgsCiAgICAgICAgICAgICAgeTIzID0gdGhpcy5feTIgLSB5OwogICAgICAgICAgdGhpcy5fbDIzX2EgPSBNYXRoLnNxcnQodGhpcy5fbDIzXzJhID0gTWF0aC5wb3coeDIzICogeDIzICsgeTIzICogeTIzLCB0aGlzLl9hbHBoYSkpOwogICAgICAgIH0KCiAgICAgICAgc3dpdGNoICh0aGlzLl9wb2ludCkgewogICAgICAgICAgY2FzZSAwOiB0aGlzLl9wb2ludCA9IDE7IHRoaXMuX2xpbmUgPyB0aGlzLl9jb250ZXh0LmxpbmVUbyh4LCB5KSA6IHRoaXMuX2NvbnRleHQubW92ZVRvKHgsIHkpOyBicmVhazsKICAgICAgICAgIGNhc2UgMTogdGhpcy5fcG9pbnQgPSAyOyBicmVhazsKICAgICAgICAgIGNhc2UgMjogdGhpcy5fcG9pbnQgPSAzOyAvLyBwcm9jZWVkCiAgICAgICAgICBkZWZhdWx0OiBwb2ludCQzKHRoaXMsIHgsIHkpOyBicmVhazsKICAgICAgICB9CgogICAgICAgIHRoaXMuX2wwMV9hID0gdGhpcy5fbDEyX2EsIHRoaXMuX2wxMl9hID0gdGhpcy5fbDIzX2E7CiAgICAgICAgdGhpcy5fbDAxXzJhID0gdGhpcy5fbDEyXzJhLCB0aGlzLl9sMTJfMmEgPSB0aGlzLl9sMjNfMmE7CiAgICAgICAgdGhpcy5feDAgPSB0aGlzLl94MSwgdGhpcy5feDEgPSB0aGlzLl94MiwgdGhpcy5feDIgPSB4OwogICAgICAgIHRoaXMuX3kwID0gdGhpcy5feTEsIHRoaXMuX3kxID0gdGhpcy5feTIsIHRoaXMuX3kyID0geTsKICAgICAgfQogICAgfTsKCiAgICB2YXIgY2F0bXVsbFJvbSA9IChmdW5jdGlvbiBjdXN0b20oYWxwaGEpIHsKCiAgICAgIGZ1bmN0aW9uIGNhdG11bGxSb20oY29udGV4dCkgewogICAgICAgIHJldHVybiBhbHBoYSA/IG5ldyBDYXRtdWxsUm9tKGNvbnRleHQsIGFscGhhKSA6IG5ldyBDYXJkaW5hbChjb250ZXh0LCAwKTsKICAgICAgfQoKICAgICAgY2F0bXVsbFJvbS5hbHBoYSA9IGZ1bmN0aW9uKGFscGhhKSB7CiAgICAgICAgcmV0dXJuIGN1c3RvbSgrYWxwaGEpOwogICAgICB9OwoKICAgICAgcmV0dXJuIGNhdG11bGxSb207CiAgICB9KSgwLjUpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS91dGlsL3Zpb2xpbl9kYXRhLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogUmV0dXJucyB0aGUgZGF0YSBuZWVkZWQgZm9yIHRoZSBuUE1JIHZpb2xpbiBwbG90cy4KICAgICAqCiAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25EYXRhIHRoZSBkYXRhIHRoYXQgY29tZXMgZnJvbSB0aGUgYmFja2VuZAogICAgICogQHBhcmFtIHs/fSBhY3RpdmVSdW5zIGN1cnJlbnRseSBhY3RpdmUgcnVucyB0byBmaWx0ZXIgdGhlIGRhdGEgYnkKICAgICAqIEBwYXJhbSB7P30gbWV0cmljTmFtZSBzZWxlY3RlZCBtZXRyaWMgdG8gZmlsdGVyIHRoZSBkYXRhIGJ5CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiB2aW9saW5EYXRhKGFubm90YXRpb25EYXRhLCBhY3RpdmVSdW5zLCBtZXRyaWNOYW1lKSB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGhpc3RvZ3JhbURhdGEgPSB7fTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgaGlzdG9ncmFtRGF0YU51bGwgPSB7fTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsUnVucyA9IG5ldyBTZXQoYWN0aXZlUnVucyk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHN0cmlwcGVkTWV0cmljID0gc3RyaXBNZXRyaWNTdHJpbmcobWV0cmljTmFtZSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGV4dHJlbWVWYWx1ZXMgPSB7IG1heDogLTEuMCwgbWluOiAxLjAgfTsKICAgICAgICBPYmplY3QudmFsdWVzKGFubm90YXRpb25EYXRhKS5mb3JFYWNoKCgvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25FbnRyeQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGFubm90YXRpb25FbnRyeSkgPT4gewogICAgICAgICAgICBhbm5vdGF0aW9uRW50cnkuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVEYXRhRWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHZhbHVlRGF0YUVsZW1lbnQpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHJ1biA9IHZhbHVlRGF0YUVsZW1lbnQucnVuOwogICAgICAgICAgICAgICAgaWYgKCFhbGxSdW5zLmhhcyhydW4pIHx8IHZhbHVlRGF0YUVsZW1lbnQubWV0cmljICE9PSBzdHJpcHBlZE1ldHJpYykgewogICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmICh2YWx1ZURhdGFFbGVtZW50Lm5QTUlWYWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIGlmIChoaXN0b2dyYW1EYXRhTnVsbFtydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbURhdGFOdWxsW3J1bl0ucHVzaChudWxsKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbURhdGFOdWxsW3J1bl0gPSBbbnVsbF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG5QTUlWYWx1ZSA9IHZhbHVlRGF0YUVsZW1lbnQublBNSVZhbHVlOwogICAgICAgICAgICAgICAgICAgIGV4dHJlbWVWYWx1ZXMubWF4ID0KICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmVtZVZhbHVlcy5tYXggPCBuUE1JVmFsdWUgPyBuUE1JVmFsdWUgOiBleHRyZW1lVmFsdWVzLm1heDsKICAgICAgICAgICAgICAgICAgICBleHRyZW1lVmFsdWVzLm1pbiA9CiAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJlbWVWYWx1ZXMubWluID4gblBNSVZhbHVlID8gblBNSVZhbHVlIDogZXh0cmVtZVZhbHVlcy5taW47CiAgICAgICAgICAgICAgICAgICAgaWYgKGhpc3RvZ3JhbURhdGFbdmFsdWVEYXRhRWxlbWVudC5ydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIGhpc3RvZ3JhbURhdGFbcnVuXS5wdXNoKG5QTUlWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICBoaXN0b2dyYW1EYXRhW3J1bl0gPSBbblBNSVZhbHVlXTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9KSk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHJlc3VsdCA9IHt9OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBiaW4gPSBoaXN0b2dyYW0oKQogICAgICAgICAgICAuZG9tYWluKFtleHRyZW1lVmFsdWVzLm1pbiwgZXh0cmVtZVZhbHVlcy5tYXhdKQogICAgICAgICAgICAudmFsdWUoKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGQpID0+IGQpKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYmluTmFOID0gaGlzdG9ncmFtKCkKICAgICAgICAgICAgLmRvbWFpbihbLUluZmluaXR5LCBJbmZpbml0eV0pCiAgICAgICAgICAgIC50aHJlc2hvbGRzKDApCiAgICAgICAgICAgIC52YWx1ZSgoLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoZCkgPT4gZCkpOwogICAgICAgIGZvciAoY29uc3QgcnVuIG9mIGFsbFJ1bnMpIHsKICAgICAgICAgICAgcmVzdWx0W3J1bl0gPSBiaW4oaGlzdG9ncmFtRGF0YVtydW5dKTsKICAgICAgICAgICAgaWYgKGhpc3RvZ3JhbURhdGFOdWxsW3J1bl0pIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGJ1Y2tldHMgPSBiaW5OYU4oaGlzdG9ncmFtRGF0YU51bGxbcnVuXSk7CiAgICAgICAgICAgICAgICByZXN1bHRbcnVuXS51bnNoaWZ0KGJ1Y2tldHNbMF0pOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiB7IHZpb2xpbkRhdGE6IHJlc3VsdCwgZXh0cmVtZXM6IGV4dHJlbWVWYWx1ZXMgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvdmlvbGluX2ZpbHRlcnMvdmlvbGluX2ZpbHRlci92aW9saW5fZmlsdGVyX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkdyA9IFsiY2hhcnQiXTsKICAgIHZhciBJMThOXzEkMTsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgTGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgcmVtb3ZlcyBhIG1ldHJpYyBmaWx0ZXIuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF84NDU0OTYxNzk3NzYyOTA3NjI0JCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX1ZJT0xJTl9GSUxURVJTX1ZJT0xJTl9GSUxURVJfVklPTElOX0ZJTFRFUl9DT01QT05FTlRfVFNfMiA9IGdvb2cuZ2V0TXNnKCJSZW1vdmUgRmlsdGVyIik7CiAgICAgICAgSTE4Tl8xJDEgPSBNU0dfRVhURVJOQUxfODQ1NDk2MTc5Nzc2MjkwNzYyNCQkVEVOU09SQk9BUkRfV0VCQVBQX1BMVUdJTlNfTlBNSV9WSUVXU19WSU9MSU5fRklMVEVSU19WSU9MSU5fRklMVEVSX1ZJT0xJTl9GSUxURVJfQ09NUE9ORU5UX1RTXzI7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzEkMSA9ICRsb2NhbGl6ZSBgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IHJlbW92ZXMgYSBtZXRyaWMgZmlsdGVyLuKQn2E2YmZhZDU4YmIzNjNkNWM4OTFkMGE1NDc0YjFkNzdlZjkwYTM0ZGHikJ84NDU0OTYxNzk3NzYyOTA3NjI0OlJlbW92ZSBGaWx0ZXJgOwogICAgfQogICAgY29uc3QgX2MzJDQgPSBbImFyaWEtbGFiZWwiLCBJMThOXzEkMV07CiAgICBjbGFzcyBWaW9saW5GaWx0ZXJDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm9uUmVtb3ZlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uVXBkYXRlRmlsdGVyID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLmhlaWdodCA9IDMwMDsKICAgICAgICAgICAgdGhpcy5jaGFydFdpZHRoID0gMDsKICAgICAgICAgICAgdGhpcy5jaGFydEhlaWdodCA9IDA7CiAgICAgICAgICAgIHRoaXMuZHJhd0hlaWdodCA9IDA7CiAgICAgICAgICAgIHRoaXMuZHJhd1dpZHRoID0gMDsKICAgICAgICAgICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiAxMCwgYm90dG9tOiAyMCwgbGVmdDogMTAgfTsKICAgICAgICAgICAgdGhpcy5kcmF3TWFyZ2luID0geyB0b3A6IDAsIHJpZ2h0OiAwLCBib3R0b206IDIwLCBsZWZ0OiAyMCB9OwogICAgICAgICAgICB0aGlzLmNvbG9yU2NhbGUgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAnIzMzMzMzMycpOwogICAgICAgICAgICAvLyBCcnVzaAogICAgICAgICAgICB0aGlzLmJydXNoID0gYnJ1c2hZKCk7CiAgICAgICAgICAgIHRoaXMubWF4QmluU2l6ZSA9IDA7CiAgICAgICAgICAgIHRoaXMuYXJlYSA9IGFyZWEoKQogICAgICAgICAgICAgICAgLngwKCgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnhTY2FsZU51bSgtZC5sZW5ndGgpOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLngxKCgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnhTY2FsZU51bShkLmxlbmd0aCk7CiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAueSgoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoKC8qKiBAdHlwZSB7P30gKi8gKGQueDApKSA9PT0gLUluZmluaXR5KSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2hhcnRIZWlnaHQgLSB0aGlzLmRyYXdNYXJnaW4udG9wOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMueVNjYWxlKCgoLyoqIEB0eXBlIHs/fSAqLyAoZC54MSkpICsgKC8qKiBAdHlwZSB7P30gKi8gKGQueDApKSkgLyAyLjApOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLmN1cnZlKGNhdG11bGxSb20pOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVEaW1lbnNpb25zKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVuc0NvbG9yU2NhbGUgPSAoKC8qKiBAdHlwZSB7P30gKi8gKGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RmLWNvbG9yLXNjYWxlJykpKSkucnVuc0NvbG9yU2NhbGU7CiAgICAgICAgICAgIHRoaXMuY29sb3JTY2FsZSA9IHJ1bnNDb2xvclNjYWxlID8gcnVuc0NvbG9yU2NhbGUgOiB0aGlzLmNvbG9yU2NhbGU7CiAgICAgICAgICAgIHRoaXMuc3ZnID0gc2VsZWN0JDEodGhpcy5jaGFydENvbnRhaW5lci5uYXRpdmVFbGVtZW50KS5zZWxlY3QoJ3N2ZycpOwogICAgICAgICAgICB0aGlzLm1haW5Db250YWluZXIgPSB0aGlzLnN2ZwogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMubWFyZ2luLmxlZnR9LCAke3RoaXMubWFyZ2luLnRvcH0pYCk7CiAgICAgICAgICAgIHRoaXMuZHJhd0NvbnRhaW5lciA9IHRoaXMubWFpbkNvbnRhaW5lcgogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMuZHJhd01hcmdpbi5sZWZ0fSwgJHt0aGlzLmRyYXdNYXJnaW4udG9wfSlgKTsKICAgICAgICAgICAgdGhpcy5kb3RzR3JvdXAgPSB0aGlzLmRyYXdDb250YWluZXIuYXBwZW5kKCdnJykuYXR0cignY2xhc3MnLCAnZG90c0dyb3VwJyk7CiAgICAgICAgICAgIHRoaXMueUF4aXNHcm91cCA9IHRoaXMubWFpbkNvbnRhaW5lcgogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXhpcyBheGlzLS15Jyk7CiAgICAgICAgICAgIHRoaXMueEF4aXNHcm91cCA9IHRoaXMubWFpbkNvbnRhaW5lcgogICAgICAgICAgICAgICAgLmFwcGVuZCgnZycpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXhpcyBheGlzLS14Jyk7CiAgICAgICAgICAgIHRoaXMubWlzY0dyb3VwID0gdGhpcy5kcmF3Q29udGFpbmVyLmFwcGVuZCgnZycpOwogICAgICAgICAgICB0aGlzLnhTY2FsZSA9IGJhbmQoKS5wYWRkaW5nKDAuMDUpOwogICAgICAgICAgICB0aGlzLnhBeGlzID0gYXhpc0JvdHRvbSh0aGlzLnhTY2FsZSk7CiAgICAgICAgICAgIHRoaXMueVNjYWxlID0gbGluZWFyJDEoKS5yYW5nZShbdGhpcy5kcmF3SGVpZ2h0LCAwXSk7CiAgICAgICAgICAgIHRoaXMueUF4aXMgPSBheGlzTGVmdCh0aGlzLnlTY2FsZSk7CiAgICAgICAgICAgIHRoaXMueFNjYWxlTnVtID0gbGluZWFyJDEoKTsKICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplQnJ1c2goKTsKICAgICAgICAgICAgdGhpcy5kcmF3TWlzYygpOwogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGNoYW5nZXMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25DaGFuZ2VzKGNoYW5nZXMpIHsKICAgICAgICAgICAgaWYgKHRoaXMuc3ZnKSB7CiAgICAgICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVkcmF3KCkgewogICAgICAgICAgICB0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKTsKICAgICAgICAgICAgdGhpcy5zZXRNYXhCaW5TaXplKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQXhlcygpOwogICAgICAgICAgICB0aGlzLmRyYXcoKTsKICAgICAgICB9CiAgICAgICAgLy8gSW5pdGlhbGl6aW5nL1VwZGF0aW5nIHRoZSB2aXN1YWxpemF0aW9uIHByb3BzCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURpbWVuc2lvbnMoKSB7CiAgICAgICAgICAgIHRoaXMuY2hhcnRXaWR0aCA9IHRoaXMud2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7CiAgICAgICAgICAgIHRoaXMuZHJhd1dpZHRoID0KICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRXaWR0aCAtIHRoaXMuZHJhd01hcmdpbi5sZWZ0IC0gdGhpcy5kcmF3TWFyZ2luLnJpZ2h0OwogICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gdGhpcy5oZWlnaHQgLSB0aGlzLm1hcmdpbi50b3AgLSB0aGlzLm1hcmdpbi5ib3R0b207CiAgICAgICAgICAgIHRoaXMuZHJhd0hlaWdodCA9CiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0IC0gdGhpcy5kcmF3TWFyZ2luLnRvcCAtIHRoaXMuZHJhd01hcmdpbi5ib3R0b207CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgc2V0TWF4QmluU2l6ZSgpIHsKICAgICAgICAgICAgT2JqZWN0LnZhbHVlcyh0aGlzLmNoYXJ0RGF0YS52aW9saW5EYXRhKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhRWxlbWVudAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRhdGFFbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGhzID0gZGF0YUVsZW1lbnQubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYmluCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoYmluKSA9PiBiaW4ubGVuZ3RoKSk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBsb25nZXN0ID0gTWF0aC5tYXgoLi4ubGVuZ3Rocyk7CiAgICAgICAgICAgICAgICB0aGlzLm1heEJpblNpemUgPSBNYXRoLm1heChsb25nZXN0LCB0aGlzLm1heEJpblNpemUpOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlQXhlcygpIHsKICAgICAgICAgICAgdGhpcy54U2NhbGUKICAgICAgICAgICAgICAgIC5yYW5nZShbMCwgdGhpcy5kcmF3V2lkdGhdKQogICAgICAgICAgICAgICAgLmRvbWFpbihPYmplY3Qua2V5cyh0aGlzLmNoYXJ0RGF0YS52aW9saW5EYXRhKSk7CiAgICAgICAgICAgIHRoaXMueVNjYWxlLmRvbWFpbihbCiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5taW4sCiAgICAgICAgICAgICAgICB0aGlzLmNoYXJ0RGF0YS5leHRyZW1lcy5tYXgsCiAgICAgICAgICAgIF0pOwogICAgICAgICAgICB0aGlzLnhTY2FsZU51bQogICAgICAgICAgICAgICAgLnJhbmdlKFswLCB0aGlzLnhTY2FsZS5iYW5kd2lkdGgoKV0pCiAgICAgICAgICAgICAgICAuZG9tYWluKFstdGhpcy5tYXhCaW5TaXplLCB0aGlzLm1heEJpblNpemVdKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBpbml0aWFsaXplQnJ1c2goKSB7CiAgICAgICAgICAgIHRoaXMuYnJ1c2gub24oJ2VuZCcsIHRoaXMuYnJ1c2hNb3ZlZC5iaW5kKHRoaXMpKTsKICAgICAgICB9CiAgICAgICAgLy8gRHJhd2luZyBVSQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZHJhdygpIHsKICAgICAgICAgICAgdGhpcy5kcmF3QXhlcygpOwogICAgICAgICAgICB0aGlzLmRyYXdQbG90KCk7CiAgICAgICAgICAgIHRoaXMucmVmcmVzaE1pc2MoKTsKICAgICAgICAgICAgdGhpcy5yZWZyZXNoQnJ1c2goKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3QXhlcygpIHsKICAgICAgICAgICAgdGhpcy55QXhpc0dyb3VwCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgYHRyYW5zbGF0ZSgke3RoaXMuZHJhd01hcmdpbi5sZWZ0fSwKICAgICAgJHt0aGlzLmRyYXdNYXJnaW4udG9wfSlgKQogICAgICAgICAgICAgICAgLmNhbGwoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueUF4aXMpKSk7CiAgICAgICAgICAgIHRoaXMueEF4aXNHcm91cAogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHt0aGlzLmRyYXdNYXJnaW4ubGVmdH0sCiAgICAgICR7dGhpcy5kcmF3TWFyZ2luLnRvcCArIHRoaXMuY2hhcnRIZWlnaHR9KWApCiAgICAgICAgICAgICAgICAuY2FsbCgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy54QXhpcykpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3UGxvdCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBwbG90cyA9IHRoaXMuZG90c0dyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcudmlvbGluLXBsb3QnKQogICAgICAgICAgICAgICAgLmRhdGEoT2JqZWN0LmVudHJpZXModGhpcy5jaGFydERhdGEudmlvbGluRGF0YSkpOwogICAgICAgICAgICBwbG90cwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ3Zpb2xpbi1wbG90JykKICAgICAgICAgICAgICAgIC5zdHlsZSgnc3Ryb2tlJywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JTY2FsZShkWzBdKTsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBgJHt0aGlzLmNvbG9yU2NhbGUoZFswXSl9MzNgOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3RyYW5zZm9ybScsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBgdHJhbnNsYXRlKCR7dGhpcy54U2NhbGUoZFswXSl9LCAwKWA7CiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAuZGF0dW0oKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gZFsxXTsKICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAuYXR0cignZCcsIHRoaXMuYXJlYSk7CiAgICAgICAgICAgIHBsb3RzCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHt0aGlzLnhTY2FsZShkWzBdKX0sIDApYDsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5kYXR1bSgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkWzFdOwogICAgICAgICAgICB9KSkKICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgdGhpcy5hcmVhKTsKICAgICAgICAgICAgcGxvdHMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYXdNaXNjKCkgewogICAgICAgICAgICB0aGlzLnplcm9MaW5lID0gdGhpcy5taXNjR3JvdXAKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2xpbmUnKQogICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnYmxhY2snKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gxJywgMCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MScsIHRoaXMueVNjYWxlKDApKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gyJywgdGhpcy5kcmF3V2lkdGgpCiAgICAgICAgICAgICAgICAuYXR0cigneTInLCB0aGlzLnlTY2FsZSgwKSk7CiAgICAgICAgICAgIHRoaXMubmFuVGV4dCA9IHRoaXMubWlzY0dyb3VwCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5zdHlsZSgnZmlsbCcsICdibGFjaycpCiAgICAgICAgICAgICAgICAudGV4dCgnTmFOJykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCAnMTBweCcpCiAgICAgICAgICAgICAgICAuYXR0cigndGV4dC1hbmNob3InLCAnZW5kJykKICAgICAgICAgICAgICAgIC5hdHRyKCdhbGlnbm1lbnQtYmFzZWxpbmUnLCAnbWlkZGxlJykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgLTUpCiAgICAgICAgICAgICAgICAuYXR0cigneScsIHRoaXMuY2hhcnRIZWlnaHQgLSB0aGlzLmRyYXdNYXJnaW4udG9wKTsKICAgICAgICAgICAgdGhpcy5uYW5MaW5lID0gdGhpcy5taXNjR3JvdXAKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2xpbmUnKQogICAgICAgICAgICAgICAgLnN0eWxlKCdzdHJva2UnLCAnZ3JleScpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ3N0cm9rZS1kYXNoYXJyYXknLCAnMywgMycpCiAgICAgICAgICAgICAgICAuYXR0cigneDEnLCAwKQogICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgdGhpcy5jaGFydEhlaWdodCAtIHRoaXMuZHJhd01hcmdpbi50b3ApCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB0aGlzLmRyYXdXaWR0aCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMuY2hhcnRIZWlnaHQgLSB0aGlzLmRyYXdNYXJnaW4udG9wKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoTWlzYygpIHsKICAgICAgICAgICAgdGhpcy56ZXJvTGluZQogICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgdGhpcy55U2NhbGUoMCkpCiAgICAgICAgICAgICAgICAuYXR0cigneDInLCB0aGlzLmRyYXdXaWR0aCkKICAgICAgICAgICAgICAgIC5hdHRyKCd5MicsIHRoaXMueVNjYWxlKDApKTsKICAgICAgICAgICAgdGhpcy5uYW5UZXh0LmF0dHIoJ3knLCB0aGlzLmNoYXJ0SGVpZ2h0IC0gdGhpcy5kcmF3TWFyZ2luLnRvcCk7CiAgICAgICAgICAgIHRoaXMubmFuTGluZQogICAgICAgICAgICAgICAgLmF0dHIoJ3kxJywgdGhpcy5kcmF3SGVpZ2h0ICsgdGhpcy5kcmF3TWFyZ2luLnRvcCkKICAgICAgICAgICAgICAgIC5hdHRyKCd4MicsIHRoaXMuZHJhd1dpZHRoKQogICAgICAgICAgICAgICAgLmF0dHIoJ3kyJywgdGhpcy5kcmF3SGVpZ2h0ICsgdGhpcy5kcmF3TWFyZ2luLnRvcCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByZWZyZXNoQnJ1c2goKSB7CiAgICAgICAgICAgIHRoaXMuYnJ1c2guZXh0ZW50KFsKICAgICAgICAgICAgICAgIFswLCAwXSwKICAgICAgICAgICAgICAgIFt0aGlzLmRyYXdXaWR0aCwgdGhpcy5kcmF3SGVpZ2h0ICsgdGhpcy5tYXJnaW4udG9wXSwKICAgICAgICAgICAgXSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYnJ1c2hQb3NpdGlvbiA9IFswLCB0aGlzLmRyYXdIZWlnaHQgKyB0aGlzLm1hcmdpbi50b3BdOwogICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIubWF4IDwgdGhpcy5maWx0ZXIubWluKSB7CiAgICAgICAgICAgICAgICBpZiAodGhpcy5maWx0ZXIuaW5jbHVkZU5hTikgewogICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgTmFOIHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgYnJ1c2hQb3NpdGlvblswXSA9IHRoaXMueVNjYWxlKHRoaXMuY2hhcnREYXRhLmV4dHJlbWVzLm1pbik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHNlbGVjdGVkCiAgICAgICAgICAgICAgICAgICAgYnJ1c2hQb3NpdGlvblswXSA9IGJydXNoUG9zaXRpb25bMV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuZmlsdGVyLmluY2x1ZGVOYU4pIHsKICAgICAgICAgICAgICAgICAgICAvLyBNaW4gZG9lcyBub3QgcmVhY2ggTmFOCiAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbiA9IE1hdGgubWF4KHRoaXMuY2hhcnREYXRhLmV4dHJlbWVzLm1pbiwgdGhpcy5maWx0ZXIubWluKTsKICAgICAgICAgICAgICAgICAgICBicnVzaFBvc2l0aW9uWzFdID0gdGhpcy55U2NhbGUobWluKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IG1heCA9IE1hdGgubWluKHRoaXMuY2hhcnREYXRhLmV4dHJlbWVzLm1heCwgdGhpcy5maWx0ZXIubWF4KTsKICAgICAgICAgICAgICAgIGJydXNoUG9zaXRpb25bMF0gPSB0aGlzLnlTY2FsZShtYXgpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHRoaXMuZHJhd0NvbnRhaW5lci5jYWxsKHRoaXMuYnJ1c2gpLmNhbGwodGhpcy5icnVzaC5tb3ZlLCBicnVzaFBvc2l0aW9uKTsKICAgICAgICB9CiAgICAgICAgLy8gQ2FsbGVkIG9uIEludGVyYWN0aW9uCiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBicnVzaE1vdmVkKCkgewogICAgICAgICAgICBpZiAoIWV2ZW50KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICBpZiAoIWV2ZW50LnNvdXJjZUV2ZW50KQogICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGV4dGVudCA9IGV2ZW50LnNlbGVjdGlvbjsKICAgICAgICAgICAgaWYgKGV4dGVudCkgewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IGluY2x1ZGVOYU4gPSBmYWxzZTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBtYXggPSAtMi4wOwogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG1pbiA9IHRoaXMuY2hhcnREYXRhLmV4dHJlbWVzLm1pbjsKICAgICAgICAgICAgICAgIGlmIChleHRlbnRbMF0gPD0gdGhpcy5kcmF3SGVpZ2h0ICsgdGhpcy5tYXJnaW4udG9wICYmCiAgICAgICAgICAgICAgICAgICAgZXh0ZW50WzFdID49IHRoaXMuZHJhd0hlaWdodCkgewogICAgICAgICAgICAgICAgICAgIGluY2x1ZGVOYU4gPSB0cnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGV4dGVudFswXSA8IHRoaXMuZHJhd0hlaWdodCkgewogICAgICAgICAgICAgICAgICAgIG1heCA9IHRoaXMueVNjYWxlLmludmVydChleHRlbnRbMF0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKGV4dGVudFsxXSA8IHRoaXMuZHJhd0hlaWdodCkgewogICAgICAgICAgICAgICAgICAgIG1pbiA9IHRoaXMueVNjYWxlLmludmVydChleHRlbnRbMV0pOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgdGhpcy5vblVwZGF0ZUZpbHRlci5lbWl0KHsKICAgICAgICAgICAgICAgICAgICBtYXg6IG1heCwKICAgICAgICAgICAgICAgICAgICBtaW46IG1pbiwKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTmFOOiBpbmNsdWRlTmFOLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLm9uVXBkYXRlRmlsdGVyLmVtaXQoewogICAgICAgICAgICAgICAgICAgIG1heDogMS4wLAogICAgICAgICAgICAgICAgICAgIG1pbjogLTEuMCwKICAgICAgICAgICAgICAgICAgICBpbmNsdWRlTmFOOiB0cnVlLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CiAgICBWaW9saW5GaWx0ZXJDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3Zpb2xpbi1maWx0ZXItY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vdmlvbGluX2ZpbHRlcl9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vdmlvbGluX2ZpbHRlcl9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBWaW9saW5GaWx0ZXJDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbWV0cmljTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBjaGFydERhdGE6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHdpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvblJlbW92ZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uVXBkYXRlRmlsdGVyOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgY2hhcnRDb250YWluZXI6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydjaGFydCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0sXSB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBWaW9saW5GaWx0ZXJDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBWaW9saW5GaWx0ZXJDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVmlvbGluRmlsdGVyQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFZpb2xpbkZpbHRlckNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBWaW9saW5GaWx0ZXJDb21wb25lbnQsIHNlbGVjdG9yczogW1sidmlvbGluLWZpbHRlci1jb21wb25lbnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gVmlvbGluRmlsdGVyQ29tcG9uZW50X1F1ZXJ5KHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1c3RhdGljVmlld1F1ZXJ5KF9jMCR3LCB0cnVlLCBFbGVtZW50UmVmKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgdmFyIF90OwogICAgICAgICAgICDJtcm1cXVlcnlSZWZyZXNoKF90ID0gybXJtWxvYWRRdWVyeSgpKSAmJiAoY3R4LmNoYXJ0Q29udGFpbmVyID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IG1ldHJpY05hbWU6ICJtZXRyaWNOYW1lIiwgZmlsdGVyOiAiZmlsdGVyIiwgY2hhcnREYXRhOiAiY2hhcnREYXRhIiwgd2lkdGg6ICJ3aWR0aCIgfSwgb3V0cHV0czogeyBvblJlbW92ZTogIm9uUmVtb3ZlIiwgb25VcGRhdGVGaWx0ZXI6ICJvblVwZGF0ZUZpbHRlciIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDEwLCB2YXJzOiAxLCBjb25zdHM6IFtbMSwgImNoYXJ0LWNvbnRhaW5lciJdLCBbInRpdGxlIiwgIlNob3dzIHRoZSBuUE1JIHZhbHVlIGRpc3RyaWJ1dGlvbiBwZXIgcnVuLiBSYW5nZXMgb2Ygc2VsZWN0ZWQgdmFsdWVzIGNhbiBiZSBtYW5pcHVsYXRlZCBieSBtb2RpZnlpbmcgdGhlIGdyZXkgYm94LiIsIDEsICJjaGFydC1oZWFkIl0sIFsxLCAiY2hhcnQtaGVhZGluZyJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbInN2Z0ljb24iLCAiY2xlYXJfMjRweCJdLCBbMSwgImNoYXJ0Il0sIFsiY2hhcnQiLCAiIl0sIFsxLCAiZHJhdy1hcmVhIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gVmlvbGluRmlsdGVyQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1dGV4dCgzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiYnV0dG9uIiwgMyk7CiAgICAgICAgICAgIMm1ybVpMThuQXR0cmlidXRlcyg1LCBfYzMkNCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2xpY2siLCBmdW5jdGlvbiBWaW9saW5GaWx0ZXJDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzRfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25SZW1vdmUuZW1pdCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNiwgIm1hdC1pY29uIiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImRpdiIsIDUsIDYpOwogICAgICAgICAgICDJtcm1bmFtZXNwYWNlU1ZHKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDksICJzdmciLCA3KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUoY3R4Lm1ldHJpY05hbWUpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW01hdEJ1dHRvbiwgTWF0SWNvbl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5jaGFydC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47b3ZlcmZsb3c6aGlkZGVufS5jaGFydFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjMwMHB4O3dpZHRoOjEwMCV9LmNoYXJ0LWhlYWRbX25nY29udGVudC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OnNwYWNlLWJldHdlZW59LmNoYXJ0LWhlYWRpbmdbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4O3BhZGRpbmctbGVmdDoxMHB4O3BhZGRpbmctdG9wOjEwcHh9LmRyYXctYXJlYVtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uc3Ryb2tlZC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6cmdiYSgwLDAsMCwuMTIpO3N0cm9rZS1kYXNoYXJyYXk6MyAzfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL3Zpb2xpbl9maWx0ZXJzL3Zpb2xpbl9maWx0ZXIvdmlvbGluX2ZpbHRlcl9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVmlvbGluRmlsdGVyQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmFjdGl2ZVJ1bnMkID0gdGhpcy5zdG9yZQogICAgICAgICAgICAgICAgLnBpcGUoc2VsZWN0KGdldEN1cnJlbnRSb3V0ZVJ1blNlbGVjdGlvbikpCiAgICAgICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1blNlbGVjdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJ1blNlbGVjdGlvbikgPT4gewogICAgICAgICAgICAgICAgaWYgKCFydW5TZWxlY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocnVuU2VsZWN0aW9uLmVudHJpZXMoKSkKICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuKSA9PiBydW5bMV0pKQogICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChydW4pID0+IHJ1blswXSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnZpc2libGVBbm5vdGF0aW9ucyQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFubm90YXRpb25EYXRhKSwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldEhpZGRlbkFubm90YXRpb25zKSwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldFNob3dIaWRkZW5Bbm5vdGF0aW9ucyksCiAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbYW5ub3RhdGlvbkRhdGEsIGhpZGRlbkFubm90YXRpb25zLCBzaG93SGlkZGVuQW5ub3RhdGlvbnNdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlSGlkZGVuQW5ub3RhdGlvbnMoYW5ub3RhdGlvbkRhdGEsIGhpZGRlbkFubm90YXRpb25zLCBzaG93SGlkZGVuQW5ub3RhdGlvbnMpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLmNoYXJ0V2lkdGgkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRTaWRlYmFyV2lkdGgpKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gd2lkdGgKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICh3aWR0aCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIE1hdGgubWF4KDE1MCwgd2lkdGgpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25Jbml0KCkgewogICAgICAgICAgICB0aGlzLmNoYXJ0RGF0YSQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMudmlzaWJsZUFubm90YXRpb25zJCwKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUnVucyQsCiAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbdmlzaWJsZUFubm90YXRpb25zLCBhY3RpdmVSdW5zXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHZpb2xpbkRhdGEodmlzaWJsZUFubm90YXRpb25zLCBhY3RpdmVSdW5zLCB0aGlzLm1ldHJpY05hbWUpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlbW92ZU1ldHJpYygpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pUmVtb3ZlTWV0cmljRmlsdGVyKHsgbWV0cmljOiB0aGlzLm1ldHJpY05hbWUgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdXBkYXRlRmlsdGVyKGZpbHRlcikgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlDaGFuZ2VNZXRyaWNGaWx0ZXIoT2JqZWN0LmFzc2lnbih7IG1ldHJpYzogdGhpcy5tZXRyaWNOYW1lIH0sIGZpbHRlcikpKTsKICAgICAgICB9CiAgICB9CiAgICBWaW9saW5GaWx0ZXJDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktdmlvbGluLWZpbHRlcicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDx2aW9saW4tZmlsdGVyLWNvbXBvbmVudAogICAgICBbbWV0cmljTmFtZV09Im1ldHJpY05hbWUiCiAgICAgIFtmaWx0ZXJdPSJmaWx0ZXIiCiAgICAgIFtjaGFydERhdGFdPSJjaGFydERhdGEkIHwgYXN5bmMiCiAgICAgIFt3aWR0aF09ImNoYXJ0V2lkdGgkIHwgYXN5bmMiCiAgICAgIChvblJlbW92ZSk9InJlbW92ZU1ldHJpYygpIgogICAgICAob25VcGRhdGVGaWx0ZXIpPSJ1cGRhdGVGaWx0ZXIoJGV2ZW50KSIKICAgID48L3Zpb2xpbi1maWx0ZXItY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFZpb2xpbkZpbHRlckNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBWaW9saW5GaWx0ZXJDb250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgbWV0cmljTmFtZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZmlsdGVyOiBbeyB0eXBlOiBJbnB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBWaW9saW5GaWx0ZXJDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBWaW9saW5GaWx0ZXJDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVmlvbGluRmlsdGVyQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVmlvbGluRmlsdGVyQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFZpb2xpbkZpbHRlckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJucG1pLXZpb2xpbi1maWx0ZXIiXV0sIGlucHV0czogeyBtZXRyaWNOYW1lOiAibWV0cmljTmFtZSIsIGZpbHRlcjogImZpbHRlciIgfSwgZGVjbHM6IDMsIHZhcnM6IDgsIGNvbnN0czogW1szLCAibWV0cmljTmFtZSIsICJmaWx0ZXIiLCAiY2hhcnREYXRhIiwgIndpZHRoIiwgIm9uUmVtb3ZlIiwgIm9uVXBkYXRlRmlsdGVyIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gVmlvbGluRmlsdGVyQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJ2aW9saW4tZmlsdGVyLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uUmVtb3ZlIiwgZnVuY3Rpb24gVmlvbGluRmlsdGVyQ29udGFpbmVyX1RlbXBsYXRlX3Zpb2xpbl9maWx0ZXJfY29tcG9uZW50X29uUmVtb3ZlXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgucmVtb3ZlTWV0cmljKCk7IH0pKCJvblVwZGF0ZUZpbHRlciIsIGZ1bmN0aW9uIFZpb2xpbkZpbHRlckNvbnRhaW5lcl9UZW1wbGF0ZV92aW9saW5fZmlsdGVyX2NvbXBvbmVudF9vblVwZGF0ZUZpbHRlcl8wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LnVwZGF0ZUZpbHRlcigkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm1ldHJpY05hbWUiLCBjdHgubWV0cmljTmFtZSkoImZpbHRlciIsIGN0eC5maWx0ZXIpKCJjaGFydERhdGEiLCDJtcm1cGlwZUJpbmQxKDEsIDQsIGN0eC5jaGFydERhdGEkKSkoIndpZHRoIiwgybXJtXBpcGVCaW5kMSgyLCA2LCBjdHguY2hhcnRXaWR0aCQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtWaW9saW5GaWx0ZXJDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvdmlvbGluX2ZpbHRlcnMvdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIHZhciBJMThOXzAkODsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgTGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgZXhwYW5kcy9oaWRlcyB0aGUgc2lkZWJhci4KICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzQ2NTg2MDI5OTE5NzAyNjAyMTUkJFRFTlNPUkJPQVJEX1dFQkFQUF9QTFVHSU5TX05QTUlfVklFV1NfVklPTElOX0ZJTFRFUlNfVklPTElOX0ZJTFRFUlNfQ09NUE9ORU5UX1RTXzEgPSBnb29nLmdldE1zZygiRXhwYW5kL0hpZGUgU2lkZWJhciIpOwogICAgICAgIEkxOE5fMCQ4ID0gTVNHX0VYVEVSTkFMXzQ2NTg2MDI5OTE5NzAyNjAyMTUkJFRFTlNPUkJPQVJEX1dFQkFQUF9QTFVHSU5TX05QTUlfVklFV1NfVklPTElOX0ZJTFRFUlNfVklPTElOX0ZJTFRFUlNfQ09NUE9ORU5UX1RTXzE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzAkOCA9ICRsb2NhbGl6ZSBgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGV4cGFuZHMvaGlkZXMgdGhlIHNpZGViYXIu4pCfNDhjMjk5MDNjZTg4MWFiNjEwODhmOGQ0OWQ4MjcyMDM3MTZhYWVkNOKQnzQ2NTg2MDI5OTE5NzAyNjAyMTU6RXhwYW5kL0hpZGUgU2lkZWJhcmA7CiAgICB9CiAgICBjb25zdCBfYzIkZSA9IFsiYXJpYS1sYWJlbCIsIEkxOE5fMCQ4XTsKICAgIGZ1bmN0aW9uIFZpb2xpbkZpbHRlcnNDb21wb25lbnRfbnBtaV92aW9saW5fZmlsdGVyXzhfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm5wbWktdmlvbGluLWZpbHRlciIsIDgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgZmlsdGVyX3IyID0gY3R4LiRpbXBsaWNpdDsKICAgICAgICDJtcm1cHJvcGVydHkoIm1ldHJpY05hbWUiLCBmaWx0ZXJfcjJbMF0pKCJmaWx0ZXIiLCBmaWx0ZXJfcjJbMV0pOwogICAgfSB9CiAgICBmdW5jdGlvbiBWaW9saW5GaWx0ZXJzQ29tcG9uZW50X2Rpdl85X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDkpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgInNwYW4iLCAxMCk7CiAgICAgICAgybXJtXRleHQoMiwgIiBZb3UgY2FuIGFkZCBtb3JlIGZpbHRlcnMgYXQgdGhlIHRvcC4gIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICBjbGFzcyBWaW9saW5GaWx0ZXJzQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy50b2dnbGVTaWRlYmFyRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgfQogICAgfQogICAgVmlvbGluRmlsdGVyc0NvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAndmlvbGluLWZpbHRlcnMtY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL3Zpb2xpbl9maWx0ZXJzX2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIFZpb2xpbkZpbHRlcnNDb21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgc2lkZWJhckV4cGFuZGVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBtZXRyaWNGaWx0ZXJzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0b2dnbGVTaWRlYmFyRXhwYW5kZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBWaW9saW5GaWx0ZXJzQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gVmlvbGluRmlsdGVyc0NvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBWaW9saW5GaWx0ZXJzQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFZpb2xpbkZpbHRlcnNDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogVmlvbGluRmlsdGVyc0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ2aW9saW4tZmlsdGVycy1jb21wb25lbnQiXV0sIGlucHV0czogeyBzaWRlYmFyRXhwYW5kZWQ6ICJzaWRlYmFyRXhwYW5kZWQiLCBtZXRyaWNGaWx0ZXJzOiAibWV0cmljRmlsdGVycyIgfSwgb3V0cHV0czogeyB0b2dnbGVTaWRlYmFyRXhwYW5kZWQ6ICJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiIH0sIGRlY2xzOiAxMCwgdmFyczogMiwgY29uc3RzOiBbWzEsICJmaWx0ZXJzLXRvb2xiYXIiXSwgWzEsICJmaWx0ZXJzLXRpdGxlIl0sIFsxLCAic2lkZS10b2dnbGUiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMywgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgImNoZXZyb25fbGVmdF8yNHB4Il0sIFsxLCAiZmlsdGVycyJdLCBbMywgIm1ldHJpY05hbWUiLCAiZmlsdGVyIiwgNCwgIm5nRm9yIiwgIm5nRm9yT2YiXSwgWyJjbGFzcyIsICJmaWx0ZXJzLWhpbnQiLCA0LCAibmdJZiJdLCBbMywgIm1ldHJpY05hbWUiLCAiZmlsdGVyIl0sIFsxLCAiZmlsdGVycy1oaW50Il0sIFsxLCAiZmlsdGVycy1oaW50LXRleHQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBWaW9saW5GaWx0ZXJzQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaDMiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMiwgIkFjdGl2ZSBGaWx0ZXJzIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJidXR0b24iLCAzKTsKICAgICAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDUsIF9jMiRlKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFZpb2xpbkZpbHRlcnNDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzRfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgudG9nZ2xlU2lkZWJhckV4cGFuZGVkLmVtaXQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDYsICJtYXQtaWNvbiIsIDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDcsICJkaXYiLCA1KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDgsIFZpb2xpbkZpbHRlcnNDb21wb25lbnRfbnBtaV92aW9saW5fZmlsdGVyXzhfVGVtcGxhdGUsIDEsIDIsICJucG1pLXZpb2xpbi1maWx0ZXIiLCA2KTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDksIFZpb2xpbkZpbHRlcnNDb21wb25lbnRfZGl2XzlfVGVtcGxhdGUsIDMsIDAsICJkaXYiLCA3KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoOCk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdGb3JPZiIsIGN0eC5tZXRyaWNGaWx0ZXJzKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5tZXRyaWNGaWx0ZXJzLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0QnV0dG9uLCBNYXRJY29uLCBOZ0Zvck9mLCBOZ0lmLCBWaW9saW5GaWx0ZXJDb250YWluZXJdLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmZpbHRlcnMtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDo0MnB4O2p1c3RpZnktY29udGVudDpzcGFjZS1iZXR3ZWVuO3BhZGRpbmc6MCAxMHB4fS5maWx0ZXJzLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmlubGluZTtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9LnNpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlci1yYWRpdXM6M3B4O2JvcmRlcjoxcHggc29saWQgI2ViZWJlYjtkaXNwbGF5OmZsZXg7aGVpZ2h0OjMwcHg7anVzdGlmeS1jb250ZW50OmNlbnRlcjt3aWR0aDozMHB4fS5maWx0ZXJzW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdy15OmF1dG99LmZpbHRlcnMtaGludFtfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2Rpc3BsYXk6ZmxleDtoZWlnaHQ6NDJweDtwYWRkaW5nOjAgMTZweH0uZmlsdGVycy1oaW50LXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy92aW9saW5fZmlsdGVycy92aW9saW5fZmlsdGVyc19jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVmlvbGluRmlsdGVyc0NvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5zaWRlYmFyRXhwYW5kZWQkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0U2lkZWJhckV4cGFuZGVkKTsKICAgICAgICAgICAgdGhpcy5tZXRyaWNGaWx0ZXJzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY0ZpbHRlcnMpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBmaWx0ZXJzCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmlsdGVycykgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIE9iamVjdC5lbnRyaWVzKGZpbHRlcnMpOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlUb2dnbGVTaWRlYmFyRXhwYW5kZWQoKSk7CiAgICAgICAgfQogICAgfQogICAgVmlvbGluRmlsdGVyc0NvbnRhaW5lci5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS12aW9saW4tZmlsdGVycycsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDx2aW9saW4tZmlsdGVycy1jb21wb25lbnQKICAgICAgW3NpZGViYXJFeHBhbmRlZF09InNpZGViYXJFeHBhbmRlZCQgfCBhc3luYyIKICAgICAgW21ldHJpY0ZpbHRlcnNdPSJtZXRyaWNGaWx0ZXJzJCB8IGFzeW5jIgogICAgICAodG9nZ2xlU2lkZWJhckV4cGFuZGVkKT0ib25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKSIKICAgID48L3Zpb2xpbi1maWx0ZXJzLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBWaW9saW5GaWx0ZXJzQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBWaW9saW5GaWx0ZXJzQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gVmlvbGluRmlsdGVyc0NvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBWaW9saW5GaWx0ZXJzQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVmlvbGluRmlsdGVyc0NvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBWaW9saW5GaWx0ZXJzQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbIm5wbWktdmlvbGluLWZpbHRlcnMiXV0sIGRlY2xzOiAzLCB2YXJzOiA2LCBjb25zdHM6IFtbMywgInNpZGViYXJFeHBhbmRlZCIsICJtZXRyaWNGaWx0ZXJzIiwgInRvZ2dsZVNpZGViYXJFeHBhbmRlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFZpb2xpbkZpbHRlcnNDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgInZpb2xpbi1maWx0ZXJzLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoInRvZ2dsZVNpZGViYXJFeHBhbmRlZCIsIGZ1bmN0aW9uIFZpb2xpbkZpbHRlcnNDb250YWluZXJfVGVtcGxhdGVfdmlvbGluX2ZpbHRlcnNfY29tcG9uZW50X3RvZ2dsZVNpZGViYXJFeHBhbmRlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgic2lkZWJhckV4cGFuZGVkIiwgybXJtXBpcGVCaW5kMSgxLCAyLCBjdHguc2lkZWJhckV4cGFuZGVkJCkpKCJtZXRyaWNGaWx0ZXJzIiwgybXJtXBpcGVCaW5kMSgyLCA0LCBjdHgubWV0cmljRmlsdGVycyQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtWaW9saW5GaWx0ZXJzQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcnVuc19sZWdhY3kvdmlld3MvbGVnYWN5X3J1bnNfc2VsZWN0b3IvbGVnYWN5X3J1bnNfc2VsZWN0b3JfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IF9jMCR4ID0gWyJzZWxlY3RvciJdOwogICAgY2xhc3MgTGVnYWN5UnVuc1NlbGVjdG9yQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyVmlld0luaXQoKSB7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBUaGUgZXZlbnQgaXMgZGlzcGF0Y2hlZCBieSBQb2x5bWVyIHdoZW4gYHNlbGVjdGVkUnVuc2AgcHJvcCBjaGFuZ2VzIGJlY2F1c2UgaXQKICAgICAgICAgICAgICogbm90aWZpZXMgKGl0IGlzIGltcGxpY2l0bHkgZmlyZWQgYnkgUG9seW1lciBsaWJyYXJ5KS4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuc2VsZWN0b3IubmF0aXZlRWxlbWVudC5hZGRFdmVudExpc3RlbmVyKCdzZWxlY3RlZC1ydW5zLWNoYW5nZWQnLCAoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChldmVudCkgPT4gewogICAgICAgICAgICAgICAgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5lbWl0KCgvKiogQHR5cGUgez99ICovIChldmVudC5kZXRhaWwudmFsdWUpKSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgc2V0VGltZW91dCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvLyBEaXNwYXRjaCB0aGUgaW5pdGlhbCB2YWx1ZSBmcm9tIHRoZSBjb21wb25lbnQuCiAgICAgICAgICAgICAgICB0aGlzLm9uU2VsZWN0aW9uQ2hhbmdlLmVtaXQodGhpcy5zZWxlY3Rvci5uYXRpdmVFbGVtZW50LnNlbGVjdGVkUnVucyk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICB9CiAgICB9CiAgICBMZWdhY3lSdW5zU2VsZWN0b3JDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3RiLWxlZ2FjeS1ydW5zLXNlbGVjdG9yLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAgPHRmLXJ1bnMtc2VsZWN0b3IgI3NlbGVjdG9yPjwvdGYtcnVucy1zZWxlY3Rvcj4gYCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIExlZ2FjeVJ1bnNTZWxlY3RvckNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBvblNlbGVjdGlvbkNoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIHNlbGVjdG9yOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnc2VsZWN0b3InLCB7IHN0YXRpYzogdHJ1ZSB9LF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGVnYWN5UnVuc1NlbGVjdG9yQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gTGVnYWN5UnVuc1NlbGVjdG9yQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExlZ2FjeVJ1bnNTZWxlY3RvckNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMZWdhY3lSdW5zU2VsZWN0b3JDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTGVnYWN5UnVuc1NlbGVjdG9yQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbInRiLWxlZ2FjeS1ydW5zLXNlbGVjdG9yLWNvbXBvbmVudCJdXSwgdmlld1F1ZXJ5OiBmdW5jdGlvbiBMZWdhY3lSdW5zU2VsZWN0b3JDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJHgsIHRydWUpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguc2VsZWN0b3IgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBvdXRwdXRzOiB7IG9uU2VsZWN0aW9uQ2hhbmdlOiAib25TZWxlY3Rpb25DaGFuZ2UiIH0sIGRlY2xzOiAyLCB2YXJzOiAwLCBjb25zdHM6IFtbInNlbGVjdG9yIiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIExlZ2FjeVJ1bnNTZWxlY3RvckNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInRmLXJ1bnMtc2VsZWN0b3IiLCBudWxsLCAwKTsKICAgICAgICB9IH0sIGVuY2Fwc3VsYXRpb246IDIgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcnVuc19sZWdhY3kvdmlld3MvbGVnYWN5X3J1bnNfc2VsZWN0b3IvbGVnYWN5X3J1bnNfc2VsZWN0b3JfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeVJ1bnNTZWxlY3RvckNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBydW5zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblNlbGVjdGlvbkNoYW5nZShydW5zKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gocG9seW1lckludGVyb3BSdW5TZWxlY3Rpb25DaGFuZ2VkKHsgbmV4dFNlbGVjdGlvbjogcnVucyB9KSk7CiAgICAgICAgfQogICAgfQogICAgTGVnYWN5UnVuc1NlbGVjdG9yQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0Yi1sZWdhY3ktcnVucy1zZWxlY3RvcicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDx0Yi1sZWdhY3ktcnVucy1zZWxlY3Rvci1jb21wb25lbnQKICAgICAgKG9uU2VsZWN0aW9uQ2hhbmdlKT0ib25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KSIKICAgID48L3RiLWxlZ2FjeS1ydW5zLXNlbGVjdG9yLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBMZWdhY3lSdW5zU2VsZWN0b3JDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIExlZ2FjeVJ1bnNTZWxlY3RvckNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIExlZ2FjeVJ1bnNTZWxlY3RvckNvbnRhaW5lcl9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMZWdhY3lSdW5zU2VsZWN0b3JDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMZWdhY3lSdW5zU2VsZWN0b3JDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTGVnYWN5UnVuc1NlbGVjdG9yQ29udGFpbmVyLCBzZWxlY3RvcnM6IFtbInRiLWxlZ2FjeS1ydW5zLXNlbGVjdG9yIl1dLCBkZWNsczogMSwgdmFyczogMCwgY29uc3RzOiBbWzMsICJvblNlbGVjdGlvbkNoYW5nZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIExlZ2FjeVJ1bnNTZWxlY3RvckNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAidGItbGVnYWN5LXJ1bnMtc2VsZWN0b3ItY29tcG9uZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigib25TZWxlY3Rpb25DaGFuZ2UiLCBmdW5jdGlvbiBMZWdhY3lSdW5zU2VsZWN0b3JDb250YWluZXJfVGVtcGxhdGVfdGJfbGVnYWN5X3J1bnNfc2VsZWN0b3JfY29tcG9uZW50X29uU2VsZWN0aW9uQ2hhbmdlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTGVnYWN5UnVuc1NlbGVjdG9yQ29tcG9uZW50XSwgZW5jYXBzdWxhdGlvbjogMiB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdXRpbC9zb3J0X2Fubm90YXRpb25zLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9uRGF0YQogICAgICogQHBhcmFtIHs/fSBzb3J0CiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBzb3J0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbkRhdGEsIHNvcnQpIHsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgbGV0IHJlc3VsdCA9IE9iamVjdC5rZXlzKGFubm90YXRpb25EYXRhKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3Qgc3RyaXBwZWRNZXRyaWMgPSBzdHJpcE1ldHJpY1N0cmluZyhzb3J0Lm1ldHJpYyk7CiAgICAgICAgaWYgKHNvcnQubWV0cmljID09PSAnJykgewogICAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgIH0KICAgICAgICBpZiAoc29ydC5vcmRlciA9PT0gU29ydE9yZGVyLkRPV04pIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtYXhEYXRhID0ge307CiAgICAgICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiByZXN1bHQpIHsKICAgICAgICAgICAgICAgIG1heERhdGFbYW5ub3RhdGlvbl0gPSBNYXRoLm1heCguLi5hbm5vdGF0aW9uRGF0YVthbm5vdGF0aW9uXQogICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbikgPT4gYW5ub3RhdGlvbi5tZXRyaWMgPT09IHN0cmlwcGVkTWV0cmljKSkKICAgICAgICAgICAgICAgICAgICAubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZmlsdGVyZWQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChmaWx0ZXJlZCkgPT4gZmlsdGVyZWQublBNSVZhbHVlID09PSBudWxsID8gLUluZmluaXR5IDogZmlsdGVyZWQublBNSVZhbHVlKSkpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC5zb3J0KCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGEsIGIpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBtYXhEYXRhW2JdIC0gbWF4RGF0YVthXTsKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmIChzb3J0Lm9yZGVyID09PSBTb3J0T3JkZXIuVVApIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBtaW5EYXRhID0ge307CiAgICAgICAgICAgIGZvciAoY29uc3QgYW5ub3RhdGlvbiBvZiByZXN1bHQpIHsKICAgICAgICAgICAgICAgIG1pbkRhdGFbYW5ub3RhdGlvbl0gPSBNYXRoLm1pbiguLi5hbm5vdGF0aW9uRGF0YVthbm5vdGF0aW9uXQogICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBhbm5vdGF0aW9uCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoYW5ub3RhdGlvbikgPT4gYW5ub3RhdGlvbi5tZXRyaWMgPT09IHN0cmlwcGVkTWV0cmljKSkKICAgICAgICAgICAgICAgICAgICAubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZmlsdGVyZWQKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChmaWx0ZXJlZCkgPT4gZmlsdGVyZWQublBNSVZhbHVlID09PSBudWxsID8gSW5maW5pdHkgOiBmaWx0ZXJlZC5uUE1JVmFsdWUpKSk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNvcnQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGEKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBiCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYSwgYikgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIG1pbkRhdGFbYV0gLSBtaW5EYXRhW2JdOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHJldHVybiByZXN1bHQ7CiAgICB9CgogICAgY29uc3QgX2MwJHkgPSBbInRodW1iQ29udGFpbmVyIl07CiAgICBjb25zdCBfYzEkayA9IFsidG9nZ2xlQmFyIl07CiAgICBjb25zdCBfYzIkZiA9IFsiaW5wdXQiXTsKICAgIGNvbnN0IF9jMyQ1ID0gZnVuY3Rpb24gKCkgeyByZXR1cm4geyBlbnRlckR1cmF0aW9uOiAxNTAgfTsgfTsKICAgIGNvbnN0IF9jNCQzID0gWyIqIl07CiAgICAvKioKICAgICAqIEluamVjdGlvbiB0b2tlbiB0byBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIGBtYXQtc2xpZGUtdG9nZ2xlYC4KICAgICAqIEB0eXBlIHs/fQogICAgICovCiAgICBjb25zdCBNQVRfU0xJREVfVE9HR0xFX0RFRkFVTFRfT1BUSU9OUyA9IG5ldyBJbmplY3Rpb25Ub2tlbignbWF0LXNsaWRlLXRvZ2dsZS1kZWZhdWx0LW9wdGlvbnMnLCB7CiAgICAgICAgcHJvdmlkZWRJbjogJ3Jvb3QnLAogICAgICAgIGZhY3Rvcnk6ICgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+ICh7IGRpc2FibGVUb2dnbGVWYWx1ZTogZmFsc2UgfSkpCiAgICB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zbGlkZS10b2dnbGUvc2xpZGUtdG9nZ2xlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIEluY3JlYXNpbmcgaW50ZWdlciBmb3IgZ2VuZXJhdGluZyB1bmlxdWUgaWRzIGZvciBzbGlkZS10b2dnbGUgY29tcG9uZW50cy4KICAgIC8qKiBAdHlwZSB7P30gKi8KICAgIGxldCBuZXh0VW5pcXVlSWQkOCA9IDA7CiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKiBAdHlwZSB7P30KICAgICAqLwogICAgY29uc3QgTUFUX1NMSURFX1RPR0dMRV9WQUxVRV9BQ0NFU1NPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUiwKICAgICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICAoKSA9PiBNYXRTbGlkZVRvZ2dsZSkpLAogICAgICAgIG11bHRpOiB0cnVlCiAgICB9OwogICAgLyoqCiAgICAgKiBDaGFuZ2UgZXZlbnQgb2JqZWN0IGVtaXR0ZWQgYnkgYSBNYXRTbGlkZVRvZ2dsZS4KICAgICAqLwogICAgY2xhc3MgTWF0U2xpZGVUb2dnbGVDaGFuZ2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc291cmNlCiAgICAgICAgICogQHBhcmFtIHs/fSBjaGVja2VkCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc291cmNlLCBjaGVja2VkKSB7CiAgICAgICAgICAgIHRoaXMuc291cmNlID0gc291cmNlOwogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSBjaGVja2VkOwogICAgICAgIH0KICAgIH0KICAgIC8vIEJvaWxlcnBsYXRlIGZvciBhcHBseWluZyBtaXhpbnMgdG8gTWF0U2xpZGVUb2dnbGUuCiAgICAvKioKICAgICAqIFxAZG9jcy1wcml2YXRlCiAgICAgKi8KICAgIGNsYXNzIE1hdFNsaWRlVG9nZ2xlQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBfZWxlbWVudFJlZgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKF9lbGVtZW50UmVmKSB7CiAgICAgICAgICAgIHRoaXMuX2VsZW1lbnRSZWYgPSBfZWxlbWVudFJlZjsKICAgICAgICB9CiAgICB9CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBfTWF0U2xpZGVUb2dnbGVNaXhpbkJhc2UgPSBtaXhpblRhYkluZGV4KG1peGluQ29sb3IobWl4aW5EaXNhYmxlUmlwcGxlKG1peGluRGlzYWJsZWQoTWF0U2xpZGVUb2dnbGVCYXNlKSksICdhY2NlbnQnKSk7CiAgICAvKioKICAgICAqIFJlcHJlc2VudHMgYSBzbGlkYWJsZSAic3dpdGNoIiB0b2dnbGUgdGhhdCBjYW4gYmUgbW92ZWQgYmV0d2VlbiBvbiBhbmQgb2ZmLgogICAgICovCiAgICBjbGFzcyBNYXRTbGlkZVRvZ2dsZSBleHRlbmRzIF9NYXRTbGlkZVRvZ2dsZU1peGluQmFzZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBlbGVtZW50UmVmCiAgICAgICAgICogQHBhcmFtIHs/fSBfZm9jdXNNb25pdG9yCiAgICAgICAgICogQHBhcmFtIHs/fSBfY2hhbmdlRGV0ZWN0b3JSZWYKICAgICAgICAgKiBAcGFyYW0gez99IHRhYkluZGV4CiAgICAgICAgICogQHBhcmFtIHs/fSBfbmdab25lCiAgICAgICAgICogQHBhcmFtIHs/fSBkZWZhdWx0cwogICAgICAgICAqIEBwYXJhbSB7Pz19IF9hbmltYXRpb25Nb2RlCiAgICAgICAgICogQHBhcmFtIHs/PX0gX2RpcgogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWYsIF9mb2N1c01vbml0b3IsIF9jaGFuZ2VEZXRlY3RvclJlZiwgdGFiSW5kZXgsIAogICAgICAgIC8qKgogICAgICAgICAqIEBkZXByZWNhdGVkIGBfbmdab25lYCBhbmQgYF9kaXJgIHBhcmFtZXRlcnMgdG8gYmUgcmVtb3ZlZC4KICAgICAgICAgKiBAYnJlYWtpbmctY2hhbmdlIDEwLjAuMAogICAgICAgICAqLwogICAgICAgIF9uZ1pvbmUsIGRlZmF1bHRzLCBfYW5pbWF0aW9uTW9kZSwgX2RpcikgewogICAgICAgICAgICBzdXBlcihlbGVtZW50UmVmKTsKICAgICAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yID0gX2ZvY3VzTW9uaXRvcjsKICAgICAgICAgICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3JSZWYgPSBfY2hhbmdlRGV0ZWN0b3JSZWY7CiAgICAgICAgICAgIHRoaXMuZGVmYXVsdHMgPSBkZWZhdWx0czsKICAgICAgICAgICAgdGhpcy5fYW5pbWF0aW9uTW9kZSA9IF9hbmltYXRpb25Nb2RlOwogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSA9ICgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoXykgPT4geyB9KTsKICAgICAgICAgICAgdGhpcy5fb25Ub3VjaGVkID0gKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4geyB9KTsKICAgICAgICAgICAgdGhpcy5fdW5pcXVlSWQgPSBgbWF0LXNsaWRlLXRvZ2dsZS0keysrbmV4dFVuaXF1ZUlkJDh9YDsKICAgICAgICAgICAgdGhpcy5fcmVxdWlyZWQgPSBmYWxzZTsKICAgICAgICAgICAgdGhpcy5fY2hlY2tlZCA9IGZhbHNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogTmFtZSB2YWx1ZSB3aWxsIGJlIGFwcGxpZWQgdG8gdGhlIGlucHV0IGVsZW1lbnQgaWYgcHJlc2VudC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMubmFtZSA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBIHVuaXF1ZSBpZCBmb3IgdGhlIHNsaWRlLXRvZ2dsZSBpbnB1dC4gSWYgbm9uZSBpcyBzdXBwbGllZCwgaXQgd2lsbCBiZSBhdXRvLWdlbmVyYXRlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuaWQgPSB0aGlzLl91bmlxdWVJZDsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIFdoZXRoZXIgdGhlIGxhYmVsIHNob3VsZCBhcHBlYXIgYWZ0ZXIgb3IgYmVmb3JlIHRoZSBzbGlkZS10b2dnbGUuIERlZmF1bHRzIHRvICdhZnRlcicuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmxhYmVsUG9zaXRpb24gPSAnYWZ0ZXInOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogVXNlZCB0byBzZXQgdGhlIGFyaWEtbGFiZWwgYXR0cmlidXRlIG9uIHRoZSB1bmRlcmx5aW5nIGlucHV0IGVsZW1lbnQuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmFyaWFMYWJlbCA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBVc2VkIHRvIHNldCB0aGUgYXJpYS1sYWJlbGxlZGJ5IGF0dHJpYnV0ZSBvbiB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5hcmlhTGFiZWxsZWRieSA9IG51bGw7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBBbiBldmVudCB3aWxsIGJlIGRpc3BhdGNoZWQgZWFjaCB0aW1lIHRoZSBzbGlkZS10b2dnbGUgY2hhbmdlcyBpdHMgdmFsdWUuCiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgLyoqCiAgICAgICAgICAgICAqIEFuIGV2ZW50IHdpbGwgYmUgZGlzcGF0Y2hlZCBlYWNoIHRpbWUgdGhlIHNsaWRlLXRvZ2dsZSBpbnB1dCBpcyB0b2dnbGVkLgogICAgICAgICAgICAgKiBUaGlzIGV2ZW50IGlzIGFsd2F5cyBlbWl0dGVkIHdoZW4gdGhlIHVzZXIgdG9nZ2xlcyB0aGUgc2xpZGUgdG9nZ2xlLCBidXQgdGhpcyBkb2VzIG5vdCBtZWFuCiAgICAgICAgICAgICAqIHRoZSBzbGlkZSB0b2dnbGUncyB2YWx1ZSBoYXMgY2hhbmdlZC4KICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMudG9nZ2xlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQW4gZXZlbnQgd2lsbCBiZSBkaXNwYXRjaGVkIGVhY2ggdGltZSB0aGUgc2xpZGUtdG9nZ2xlIGlzIGRyYWdnZWQuCiAgICAgICAgICAgICAqIFRoaXMgZXZlbnQgaXMgYWx3YXlzIGVtaXR0ZWQgd2hlbiB0aGUgdXNlciBkcmFncyB0aGUgc2xpZGUgdG9nZ2xlIHRvIG1ha2UgYSBjaGFuZ2UgZ3JlYXRlcgogICAgICAgICAgICAgKiB0aGFuIDUwJS4gSXQgZG9lcyBub3QgbWVhbiB0aGUgc2xpZGUgdG9nZ2xlJ3MgdmFsdWUgaXMgY2hhbmdlZC4gVGhlIGV2ZW50IGlzIG5vdCBlbWl0dGVkIHdoZW4KICAgICAgICAgICAgICogdGhlIHVzZXIgdG9nZ2xlcyB0aGUgc2xpZGUgdG9nZ2xlIHRvIGNoYW5nZSBpdHMgdmFsdWUuCiAgICAgICAgICAgICAqIEBkZXByZWNhdGVkIE5vIGxvbmdlciBiZWluZyB1c2VkLiBUbyBiZSByZW1vdmVkLgogICAgICAgICAgICAgKiBcQGJyZWFraW5nLWNoYW5nZSAxMC4wLjAKICAgICAgICAgICAgICovCiAgICAgICAgICAgIHRoaXMuZHJhZ0NoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy50YWJJbmRleCA9IHBhcnNlSW50KHRhYkluZGV4KSB8fCAwOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBzbGlkZS10b2dnbGUgaXMgcmVxdWlyZWQuCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBnZXQgcmVxdWlyZWQoKSB7IHJldHVybiB0aGlzLl9yZXF1aXJlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCByZXF1aXJlZCh2YWx1ZSkgeyB0aGlzLl9yZXF1aXJlZCA9IGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSh2YWx1ZSk7IH0KICAgICAgICAvKioKICAgICAgICAgKiBXaGV0aGVyIHRoZSBzbGlkZS10b2dnbGUgZWxlbWVudCBpcyBjaGVja2VkIG9yIG5vdC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBjaGVja2VkKCkgeyByZXR1cm4gdGhpcy5fY2hlY2tlZDsgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHNldCBjaGVja2VkKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuX2NoZWNrZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpOwogICAgICAgICAgICB0aGlzLl9jaGFuZ2VEZXRlY3RvclJlZi5tYXJrRm9yQ2hlY2soKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIGlkIGZvciB0aGUgdmlzdWFsIGhpZGRlbiBpbnB1dC4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGdldCBpbnB1dElkKCkgeyByZXR1cm4gYCR7dGhpcy5pZCB8fCB0aGlzLl91bmlxdWVJZH0taW5wdXRgOyB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ0FmdGVyQ29udGVudEluaXQoKSB7CiAgICAgICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvcgogICAgICAgICAgICAgICAgLm1vbml0b3IodGhpcy5fZWxlbWVudFJlZiwgdHJ1ZSkKICAgICAgICAgICAgICAgIC5zdWJzY3JpYmUoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZvY3VzT3JpZ2luCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmb2N1c09yaWdpbiA9PiB7CiAgICAgICAgICAgICAgICAvLyBPbmx5IGZvcndhcmQgZm9jdXMgbWFudWFsbHkgd2hlbiBpdCB3YXMgcmVjZWl2ZWQgcHJvZ3JhbW1hdGljYWxseSBvciB0aHJvdWdoIHRoZQogICAgICAgICAgICAgICAgLy8ga2V5Ym9hcmQuIFdlIHNob3VsZCBub3QgZG8gdGhpcyBmb3IgbW91c2UvdG91Y2ggZm9jdXMgZm9yIHR3byByZWFzb25zOgogICAgICAgICAgICAgICAgLy8gMS4gSXQgY2FuIHByZXZlbnQgY2xpY2tzIGZyb20gbGFuZGluZyBpbiBDaHJvbWUgKHNlZSAjMTgyNjkpLgogICAgICAgICAgICAgICAgLy8gMi4gVGhleSdyZSBhbHJlYWR5IGhhbmRsZWQgYnkgdGhlIHdyYXBwaW5nIGBsYWJlbGAgZWxlbWVudC4KICAgICAgICAgICAgICAgIGlmIChmb2N1c09yaWdpbiA9PT0gJ2tleWJvYXJkJyB8fCBmb2N1c09yaWdpbiA9PT0gJ3Byb2dyYW0nKSB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFmb2N1c09yaWdpbikgewogICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYSBmb2N1c2VkIGVsZW1lbnQgYmVjb21lcyBkaXNhYmxlZCwgdGhlIGJyb3dzZXIgKmltbWVkaWF0ZWx5KiBmaXJlcyBhIGJsdXIgZXZlbnQuCiAgICAgICAgICAgICAgICAgICAgLy8gQW5ndWxhciBkb2VzIG5vdCBleHBlY3QgZXZlbnRzIHRvIGJlIHJhaXNlZCBkdXJpbmcgY2hhbmdlIGRldGVjdGlvbiwgc28gYW55IHN0YXRlCiAgICAgICAgICAgICAgICAgICAgLy8gY2hhbmdlIChzdWNoIGFzIGEgZm9ybSBjb250cm9sJ3MgJ25nLXRvdWNoZWQnKSB3aWxsIGNhdXNlIGEgY2hhbmdlZC1hZnRlci1jaGVja2VkCiAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IuIFNlZSBodHRwczovL2dpdGh1Yi5jb20vYW5ndWxhci9hbmd1bGFyL2lzc3Vlcy8xNzc5My4gVG8gd29yayBhcm91bmQgdGhpcywKICAgICAgICAgICAgICAgICAgICAvLyB3ZSBkZWZlciB0ZWxsaW5nIHRoZSBmb3JtIGNvbnRyb2wgaXQgaGFzIGJlZW4gdG91Y2hlZCB1bnRpbCB0aGUgbmV4dCB0aWNrLgogICAgICAgICAgICAgICAgICAgIFByb21pc2UucmVzb2x2ZSgpLnRoZW4oKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKCkgPT4gdGhpcy5fb25Ub3VjaGVkKCkpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nT25EZXN0cm95KCkgewogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3Iuc3RvcE1vbml0b3JpbmcodGhpcy5fZWxlbWVudFJlZik7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIE1ldGhvZCBiZWluZyBjYWxsZWQgd2hlbmV2ZXIgdGhlIHVuZGVybHlpbmcgaW5wdXQgZW1pdHMgYSBjaGFuZ2UgZXZlbnQuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uQ2hhbmdlRXZlbnQoZXZlbnQpIHsKICAgICAgICAgICAgLy8gV2UgYWx3YXlzIGhhdmUgdG8gc3RvcCBwcm9wYWdhdGlvbiBvbiB0aGUgY2hhbmdlIGV2ZW50LgogICAgICAgICAgICAvLyBPdGhlcndpc2UgdGhlIGNoYW5nZSBldmVudCwgZnJvbSB0aGUgaW5wdXQgZWxlbWVudCwgd2lsbCBidWJibGUgdXAgYW5kCiAgICAgICAgICAgIC8vIGVtaXQgaXRzIGV2ZW50IG9iamVjdCB0byB0aGUgY29tcG9uZW50J3MgYGNoYW5nZWAgb3V0cHV0LgogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICAgICAgdGhpcy50b2dnbGVDaGFuZ2UuZW1pdCgpOwogICAgICAgICAgICAvLyBXaGVuIHRoZSBzbGlkZSB0b2dnbGUncyBjb25maWcgZGlzYWJsZXMgdG9nZ2xlIGNoYW5nZSBldmVudCBieSBzZXR0aW5nCiAgICAgICAgICAgIC8vIGBkaXNhYmxlVG9nZ2xlVmFsdWU6IHRydWVgLCB0aGUgc2xpZGUgdG9nZ2xlJ3MgdmFsdWUgZG9lcyBub3QgY2hhbmdlLCBhbmQgdGhlCiAgICAgICAgICAgIC8vIGNoZWNrZWQgc3RhdGUgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgbmVlZHMgdG8gYmUgY2hhbmdlZCBiYWNrLgogICAgICAgICAgICBpZiAodGhpcy5kZWZhdWx0cy5kaXNhYmxlVG9nZ2xlVmFsdWUpIHsKICAgICAgICAgICAgICAgIHRoaXMuX2lucHV0RWxlbWVudC5uYXRpdmVFbGVtZW50LmNoZWNrZWQgPSB0aGlzLmNoZWNrZWQ7CiAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgIH0KICAgICAgICAgICAgLy8gU3luYyB0aGUgdmFsdWUgZnJvbSB0aGUgdW5kZXJseWluZyBpbnB1dCBlbGVtZW50IHdpdGggdGhlIGNvbXBvbmVudCBpbnN0YW5jZS4KICAgICAgICAgICAgdGhpcy5jaGVja2VkID0gdGhpcy5faW5wdXRFbGVtZW50Lm5hdGl2ZUVsZW1lbnQuY2hlY2tlZDsKICAgICAgICAgICAgLy8gRW1pdCBvdXIgY3VzdG9tIGNoYW5nZSBldmVudCBvbmx5IGlmIHRoZSB1bmRlcmx5aW5nIGlucHV0IGVtaXR0ZWQgb25lLiBUaGlzIGVuc3VyZXMgdGhhdAogICAgICAgICAgICAvLyB0aGVyZSBpcyBubyBjaGFuZ2UgZXZlbnQsIHdoZW4gdGhlIGNoZWNrZWQgc3RhdGUgY2hhbmdlcyBwcm9ncmFtbWF0aWNhbGx5LgogICAgICAgICAgICB0aGlzLl9lbWl0Q2hhbmdlRXZlbnQoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGJlaW5nIGNhbGxlZCB3aGVuZXZlciB0aGUgc2xpZGUtdG9nZ2xlIGhhcyBiZWVuIGNsaWNrZWQuCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uSW5wdXRDbGljayhldmVudCkgewogICAgICAgICAgICAvLyBXZSBoYXZlIHRvIHN0b3AgcHJvcGFnYXRpb24gZm9yIGNsaWNrIGV2ZW50cyBvbiB0aGUgdmlzdWFsIGhpZGRlbiBpbnB1dCBlbGVtZW50LgogICAgICAgICAgICAvLyBCeSBkZWZhdWx0LCB3aGVuIGEgdXNlciBjbGlja3Mgb24gYSBsYWJlbCBlbGVtZW50LCBhIGdlbmVyYXRlZCBjbGljayBldmVudCB3aWxsIGJlCiAgICAgICAgICAgIC8vIGRpc3BhdGNoZWQgb24gdGhlIGFzc29jaWF0ZWQgaW5wdXQgZWxlbWVudC4gU2luY2Ugd2UgYXJlIHVzaW5nIGEgbGFiZWwgZWxlbWVudCBhcyBvdXIKICAgICAgICAgICAgLy8gcm9vdCBjb250YWluZXIsIHRoZSBjbGljayBldmVudCBvbiB0aGUgYHNsaWRlLXRvZ2dsZWAgd2lsbCBiZSBleGVjdXRlZCB0d2ljZS4KICAgICAgICAgICAgLy8gVGhlIHJlYWwgY2xpY2sgZXZlbnQgd2lsbCBidWJibGUgdXAsIGFuZCB0aGUgZ2VuZXJhdGVkIGNsaWNrIGV2ZW50IGFsc28gdHJpZXMgdG8gYnViYmxlIHVwLgogICAgICAgICAgICAvLyBUaGlzIHdpbGwgbGVhZCB0byBtdWx0aXBsZSBjbGljayBldmVudHMuCiAgICAgICAgICAgIC8vIFByZXZlbnRpbmcgYnViYmxpbmcgZm9yIHRoZSBzZWNvbmQgZXZlbnQgd2lsbCBzb2x2ZSB0aGF0IGlzc3VlLgogICAgICAgICAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4KICAgICAgICAgKiBAcGFyYW0gez99IHZhbHVlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB3cml0ZVZhbHVlKHZhbHVlKSB7CiAgICAgICAgICAgIHRoaXMuY2hlY2tlZCA9ICEhdmFsdWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSBmbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcmVnaXN0ZXJPbkNoYW5nZShmbikgewogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLgogICAgICAgICAqIEBwYXJhbSB7P30gZm4KICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZ2lzdGVyT25Ub3VjaGVkKGZuKSB7CiAgICAgICAgICAgIHRoaXMuX29uVG91Y2hlZCA9IGZuOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBJbXBsZW1lbnRlZCBhcyBhIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuCiAgICAgICAgICogQHBhcmFtIHs/fSBpc0Rpc2FibGVkCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQpIHsKICAgICAgICAgICAgdGhpcy5kaXNhYmxlZCA9IGlzRGlzYWJsZWQ7CiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBGb2N1c2VzIHRoZSBzbGlkZS10b2dnbGUuCiAgICAgICAgICogQHBhcmFtIHs/PX0gb3B0aW9ucwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZm9jdXMob3B0aW9ucykgewogICAgICAgICAgICB0aGlzLl9mb2N1c01vbml0b3IuZm9jdXNWaWEodGhpcy5faW5wdXRFbGVtZW50LCAna2V5Ym9hcmQnLCBvcHRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogVG9nZ2xlcyB0aGUgY2hlY2tlZCBzdGF0ZSBvZiB0aGUgc2xpZGUtdG9nZ2xlLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9nZ2xlKCkgewogICAgICAgICAgICB0aGlzLmNoZWNrZWQgPSAhdGhpcy5jaGVja2VkOwogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLmNoZWNrZWQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBFbWl0cyBhIGNoYW5nZSBldmVudCBvbiB0aGUgYGNoYW5nZWAgb3V0cHV0LiBBbHNvIG5vdGlmaWVzIHRoZSBGb3JtQ29udHJvbCBhYm91dCB0aGUgY2hhbmdlLgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBfZW1pdENoYW5nZUV2ZW50KCkgewogICAgICAgICAgICB0aGlzLl9vbkNoYW5nZSh0aGlzLmNoZWNrZWQpOwogICAgICAgICAgICB0aGlzLmNoYW5nZS5lbWl0KG5ldyBNYXRTbGlkZVRvZ2dsZUNoYW5nZSh0aGlzLCB0aGlzLmNoZWNrZWQpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogTWV0aG9kIGJlaW5nIGNhbGxlZCB3aGVuZXZlciB0aGUgbGFiZWwgdGV4dCBjaGFuZ2VzLgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgX29uTGFiZWxUZXh0Q2hhbmdlKCkgewogICAgICAgICAgICAvLyBTaW5jZSB0aGUgZXZlbnQgb2YgdGhlIGBjZGtPYnNlcnZlQ29udGVudGAgZGlyZWN0aXZlIHJ1bnMgb3V0c2lkZSBvZiB0aGUgem9uZSwgdGhlCiAgICAgICAgICAgIC8vIHNsaWRlLXRvZ2dsZSBjb21wb25lbnQgd2lsbCBiZSBvbmx5IG1hcmtlZCBmb3IgY2hlY2ssIGJ1dCBubyBhY3R1YWwgY2hhbmdlIGRldGVjdGlvbiBydW5zCiAgICAgICAgICAgIC8vIGF1dG9tYXRpY2FsbHkuIEluc3RlYWQgb2YgZ29pbmcgYmFjayBpbnRvIHRoZSB6b25lIGluIG9yZGVyIHRvIHRyaWdnZXIgYSBjaGFuZ2UgZGV0ZWN0aW9uCiAgICAgICAgICAgIC8vIHdoaWNoIGNhdXNlcyAqYWxsKiBjb21wb25lbnRzIHRvIGJlIGNoZWNrZWQgKGlmIGV4cGxpY2l0bHkgbWFya2VkIG9yIG5vdCB1c2luZyBPblB1c2gpLAogICAgICAgICAgICAvLyB3ZSBvbmx5IHRyaWdnZXIgYW4gZXhwbGljaXQgY2hhbmdlIGRldGVjdGlvbiBmb3IgdGhlIHNsaWRlLXRvZ2dsZSB2aWV3IGFuZCBpdHMgY2hpbGRyZW4uCiAgICAgICAgICAgIHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLmRldGVjdENoYW5nZXMoKTsKICAgICAgICB9CiAgICB9CiAgICBNYXRTbGlkZVRvZ2dsZS7JtWZhYyA9IGZ1bmN0aW9uIE1hdFNsaWRlVG9nZ2xlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNsaWRlVG9nZ2xlKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KEVsZW1lbnRSZWYpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEZvY3VzTW9uaXRvciksIMm1ybVkaXJlY3RpdmVJbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpLCDJtcm1aW5qZWN0QXR0cmlidXRlKCd0YWJpbmRleCcpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KE5nWm9uZSksIMm1ybVkaXJlY3RpdmVJbmplY3QoTUFUX1NMSURFX1RPR0dMRV9ERUZBVUxUX09QVElPTlMpLCDJtcm1ZGlyZWN0aXZlSW5qZWN0KEFOSU1BVElPTl9NT0RVTEVfVFlQRSwgOCksIMm1ybVkaXJlY3RpdmVJbmplY3QoRGlyZWN0aW9uYWxpdHksIDgpKTsgfTsKICAgIE1hdFNsaWRlVG9nZ2xlLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1hdFNsaWRlVG9nZ2xlLCBzZWxlY3RvcnM6IFtbIm1hdC1zbGlkZS10b2dnbGUiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gTWF0U2xpZGVUb2dnbGVfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybV2aWV3UXVlcnkoX2MwJHksIHRydWUpOwogICAgICAgICAgICDJtcm1dmlld1F1ZXJ5KF9jMSRrLCB0cnVlKTsKICAgICAgICAgICAgybXJtXZpZXdRdWVyeShfYzIkZiwgdHJ1ZSk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIHZhciBfdDsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGh1bWJFbCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5fdGh1bWJCYXJFbCA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5faW5wdXRFbGVtZW50ID0gX3QuZmlyc3QpOwogICAgICAgIH0gfSwgaG9zdEF0dHJzOiBbMSwgIm1hdC1zbGlkZS10b2dnbGUiXSwgaG9zdFZhcnM6IDEyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIE1hdFNsaWRlVG9nZ2xlX0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWhvc3RQcm9wZXJ0eSgiaWQiLCBjdHguaWQpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJ0YWJpbmRleCIsIGN0eC5kaXNhYmxlZCA/IG51bGwgOiAwIC0gMSkoImFyaWEtbGFiZWwiLCBudWxsKSgiYXJpYS1sYWJlbGxlZGJ5IiwgbnVsbCk7CiAgICAgICAgICAgIMm1ybVjbGFzc1Byb3AoIm1hdC1jaGVja2VkIiwgY3R4LmNoZWNrZWQpKCJtYXQtZGlzYWJsZWQiLCBjdHguZGlzYWJsZWQpKCJtYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSIsIGN0eC5sYWJlbFBvc2l0aW9uID09ICJiZWZvcmUiKSgiX21hdC1hbmltYXRpb24tbm9vcGFibGUiLCBjdHguX2FuaW1hdGlvbk1vZGUgPT09ICJOb29wQW5pbWF0aW9ucyIpOwogICAgICAgIH0gfSwgaW5wdXRzOiB7IGRpc2FibGVkOiAiZGlzYWJsZWQiLCBkaXNhYmxlUmlwcGxlOiAiZGlzYWJsZVJpcHBsZSIsIGNvbG9yOiAiY29sb3IiLCB0YWJJbmRleDogInRhYkluZGV4IiwgbmFtZTogIm5hbWUiLCBpZDogImlkIiwgbGFiZWxQb3NpdGlvbjogImxhYmVsUG9zaXRpb24iLCBhcmlhTGFiZWw6IFsiYXJpYS1sYWJlbCIsICJhcmlhTGFiZWwiXSwgYXJpYUxhYmVsbGVkYnk6IFsiYXJpYS1sYWJlbGxlZGJ5IiwgImFyaWFMYWJlbGxlZGJ5Il0sIHJlcXVpcmVkOiAicmVxdWlyZWQiLCBjaGVja2VkOiAiY2hlY2tlZCIgfSwgb3V0cHV0czogeyBjaGFuZ2U6ICJjaGFuZ2UiLCB0b2dnbGVDaGFuZ2U6ICJ0b2dnbGVDaGFuZ2UiLCBkcmFnQ2hhbmdlOiAiZHJhZ0NoYW5nZSIgfSwgZXhwb3J0QXM6IFsibWF0U2xpZGVUb2dnbGUiXSwgZmVhdHVyZXM6IFvJtcm1UHJvdmlkZXJzRmVhdHVyZShbTUFUX1NMSURFX1RPR0dMRV9WQUxVRV9BQ0NFU1NPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSwgbmdDb250ZW50U2VsZWN0b3JzOiBfYzQkMywgZGVjbHM6IDE2LCB2YXJzOiAxOCwgY29uc3RzOiBbWzEsICJtYXQtc2xpZGUtdG9nZ2xlLWxhYmVsIl0sIFsibGFiZWwiLCAiIl0sIFsxLCAibWF0LXNsaWRlLXRvZ2dsZS1iYXIiXSwgWyJ0b2dnbGVCYXIiLCAiIl0sIFsidHlwZSIsICJjaGVja2JveCIsICJyb2xlIiwgInN3aXRjaCIsIDEsICJtYXQtc2xpZGUtdG9nZ2xlLWlucHV0IiwgImNkay12aXN1YWxseS1oaWRkZW4iLCAzLCAiaWQiLCAicmVxdWlyZWQiLCAidGFiSW5kZXgiLCAiY2hlY2tlZCIsICJkaXNhYmxlZCIsICJjaGFuZ2UiLCAiY2xpY2siXSwgWyJpbnB1dCIsICIiXSwgWzEsICJtYXQtc2xpZGUtdG9nZ2xlLXRodW1iLWNvbnRhaW5lciJdLCBbInRodW1iQ29udGFpbmVyIiwgIiJdLCBbMSwgIm1hdC1zbGlkZS10b2dnbGUtdGh1bWIiXSwgWyJtYXQtcmlwcGxlIiwgIiIsIDEsICJtYXQtc2xpZGUtdG9nZ2xlLXJpcHBsZSIsICJtYXQtZm9jdXMtaW5kaWNhdG9yIiwgMywgIm1hdFJpcHBsZVRyaWdnZXIiLCAibWF0UmlwcGxlRGlzYWJsZWQiLCAibWF0UmlwcGxlQ2VudGVyZWQiLCAibWF0UmlwcGxlUmFkaXVzIiwgIm1hdFJpcHBsZUFuaW1hdGlvbiJdLCBbMSwgIm1hdC1yaXBwbGUtZWxlbWVudCIsICJtYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxlIl0sIFsxLCAibWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50IiwgMywgImNka09ic2VydmVDb250ZW50Il0sIFsibGFiZWxDb250ZW50IiwgIiJdLCBbMiwgImRpc3BsYXkiLCAibm9uZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE1hdFNsaWRlVG9nZ2xlX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1cHJvamVjdGlvbkRlZigpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJsYWJlbCIsIDAsIDEpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyLCAzKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCg0LCAiaW5wdXQiLCA0LCA1KTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBNYXRTbGlkZVRvZ2dsZV9UZW1wbGF0ZV9pbnB1dF9jaGFuZ2VfNF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5fb25DaGFuZ2VFdmVudCgkZXZlbnQpOyB9KSgiY2xpY2siLCBmdW5jdGlvbiBNYXRTbGlkZVRvZ2dsZV9UZW1wbGF0ZV9pbnB1dF9jbGlja180X2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4Ll9vbklucHV0Q2xpY2soJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNiwgImRpdiIsIDYsIDcpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCg4LCAiZGl2IiwgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgImRpdiIsIDkpOwogICAgICAgICAgICDJtcm1ZWxlbWVudCgxMCwgImRpdiIsIDEwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxMSwgInNwYW4iLCAxMSwgMTIpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNka09ic2VydmVDb250ZW50IiwgZnVuY3Rpb24gTWF0U2xpZGVUb2dnbGVfVGVtcGxhdGVfc3Bhbl9jZGtPYnNlcnZlQ29udGVudF8xMV9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5fb25MYWJlbFRleHRDaGFuZ2UoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMTMsICJzcGFuIiwgMTMpOwogICAgICAgICAgICDJtcm1dGV4dCgxNCwgIlx1MDBBMCIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1cHJvamVjdGlvbigxNSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMCA9IMm1ybVyZWZlcmVuY2UoMSk7CiAgICAgICAgICAgIGNvbnN0IF9yNCA9IMm1ybVyZWZlcmVuY2UoMTIpOwogICAgICAgICAgICDJtcm1YXR0cmlidXRlKCJmb3IiLCBjdHguaW5wdXRJZCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJtYXQtc2xpZGUtdG9nZ2xlLWJhci1uby1zaWRlLW1hcmdpbiIsICFfcjQudGV4dENvbnRlbnQgfHwgIV9yNC50ZXh0Q29udGVudC50cmltKCkpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJpZCIsIGN0eC5pbnB1dElkKSgicmVxdWlyZWQiLCBjdHgucmVxdWlyZWQpKCJ0YWJJbmRleCIsIGN0eC50YWJJbmRleCkoImNoZWNrZWQiLCBjdHguY2hlY2tlZCkoImRpc2FibGVkIiwgY3R4LmRpc2FibGVkKTsKICAgICAgICAgICAgybXJtWF0dHJpYnV0ZSgibmFtZSIsIGN0eC5uYW1lKSgiYXJpYS1jaGVja2VkIiwgY3R4LmNoZWNrZWQudG9TdHJpbmcoKSkoImFyaWEtbGFiZWwiLCBjdHguYXJpYUxhYmVsKSgiYXJpYS1sYWJlbGxlZGJ5IiwgY3R4LmFyaWFMYWJlbGxlZGJ5KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibWF0UmlwcGxlVHJpZ2dlciIsIF9yMCkoIm1hdFJpcHBsZURpc2FibGVkIiwgY3R4LmRpc2FibGVSaXBwbGUgfHwgY3R4LmRpc2FibGVkKSgibWF0UmlwcGxlQ2VudGVyZWQiLCB0cnVlKSgibWF0UmlwcGxlUmFkaXVzIiwgMjApKCJtYXRSaXBwbGVBbmltYXRpb24iLCDJtcm1cHVyZUZ1bmN0aW9uMCgxNywgX2MzJDUpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRSaXBwbGUsIENka09ic2VydmVDb250ZW50XSwgc3R5bGVzOiBbIi5tYXQtc2xpZGUtdG9nZ2xle2Rpc3BsYXk6aW5saW5lLWJsb2NrO2hlaWdodDoyNHB4O21heC13aWR0aDoxMDAlO2xpbmUtaGVpZ2h0OjI0cHg7d2hpdGUtc3BhY2U6bm93cmFwO291dGxpbmU6bm9uZTstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgxNnB4LCAwLCAwKX1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye3RyYW5zZm9ybTp0cmFuc2xhdGUzZCgtMTZweCwgMCwgMCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWRpc2FibGVke29wYWNpdHk6LjM4fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1kaXNhYmxlZCAubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbCwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWItY29udGFpbmVye2N1cnNvcjpkZWZhdWx0fS5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVse2Rpc3BsYXk6ZmxleDtmbGV4OjE7ZmxleC1kaXJlY3Rpb246cm93O2FsaWduLWl0ZW1zOmNlbnRlcjtoZWlnaHQ6aW5oZXJpdDtjdXJzb3I6cG9pbnRlcn0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50e3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpc30ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtbGFiZWx7b3JkZXI6MX0ubWF0LXNsaWRlLXRvZ2dsZS1sYWJlbC1iZWZvcmUgLm1hdC1zbGlkZS10b2dnbGUtYmFye29yZGVyOjJ9W2Rpcj1ydGxdIC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXIsLm1hdC1zbGlkZS10b2dnbGUtYmFye21hcmdpbi1yaWdodDo4cHg7bWFyZ2luLWxlZnQ6MH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLWxhYmVsLWJlZm9yZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7bWFyZ2luLWxlZnQ6OHB4O21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLWJhci1uby1zaWRlLW1hcmdpbnttYXJnaW4tbGVmdDowO21hcmdpbi1yaWdodDowfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iLWNvbnRhaW5lcntwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjE7d2lkdGg6MjBweDtoZWlnaHQ6MjBweDt0b3A6LTNweDtsZWZ0OjA7dHJhbnNmb3JtOnRyYW5zbGF0ZTNkKDAsIDAsIDApO3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6dHJhbnNmb3JtfS5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7dHJhbnNpdGlvbjpub25lfVtkaXI9cnRsXSAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYi1jb250YWluZXJ7bGVmdDphdXRvO3JpZ2h0OjB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7aGVpZ2h0OjIwcHg7d2lkdGg6MjBweDtib3JkZXItcmFkaXVzOjUwJX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7cG9zaXRpb246cmVsYXRpdmU7d2lkdGg6MzZweDtoZWlnaHQ6MTRweDtmbGV4LXNocmluazowO2JvcmRlci1yYWRpdXM6OHB4fS5tYXQtc2xpZGUtdG9nZ2xlLWlucHV0e2JvdHRvbTowO2xlZnQ6MTBweH1bZGlyPXJ0bF0gLm1hdC1zbGlkZS10b2dnbGUtaW5wdXR7bGVmdDphdXRvO3JpZ2h0OjEwcHh9Lm1hdC1zbGlkZS10b2dnbGUtYmFyLC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1ie3RyYW5zaXRpb246YWxsIDgwbXMgbGluZWFyO3RyYW5zaXRpb24tcHJvcGVydHk6YmFja2dyb3VuZC1jb2xvcjt0cmFuc2l0aW9uLWRlbGF5OjUwbXN9Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlIC5tYXQtc2xpZGUtdG9nZ2xlLWJhciwuX21hdC1hbmltYXRpb24tbm9vcGFibGUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJ7dHJhbnNpdGlvbjpub25lfS5tYXQtc2xpZGUtdG9nZ2xlIC5tYXQtc2xpZGUtdG9nZ2xlLXJpcHBsZXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6Y2FsYyg1MCUgLSAyMHB4KTtsZWZ0OmNhbGMoNTAlIC0gMjBweCk7aGVpZ2h0OjQwcHg7d2lkdGg6NDBweDt6LWluZGV4OjE7cG9pbnRlci1ldmVudHM6bm9uZX0ubWF0LXNsaWRlLXRvZ2dsZSAubWF0LXNsaWRlLXRvZ2dsZS1yaXBwbGUgLm1hdC1yaXBwbGUtZWxlbWVudDpub3QoLm1hdC1zbGlkZS10b2dnbGUtcGVyc2lzdGVudC1yaXBwbGUpe29wYWNpdHk6LjEyfS5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle3dpZHRoOjEwMCU7aGVpZ2h0OjEwMCU7dHJhbnNmb3JtOm5vbmV9Lm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6LjA0fS5tYXQtc2xpZGUtdG9nZ2xlOm5vdCgubWF0LWRpc2FibGVkKS5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtvcGFjaXR5Oi4xMn0ubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXNsaWRlLXRvZ2dsZS5tYXQtZGlzYWJsZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFyOmhvdmVyIC5tYXQtc2xpZGUtdG9nZ2xlLXBlcnNpc3RlbnQtcmlwcGxle29wYWNpdHk6MH1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc2xpZGUtdG9nZ2xlLWJhcjpob3ZlciAubWF0LXNsaWRlLXRvZ2dsZS1wZXJzaXN0ZW50LXJpcHBsZXtkaXNwbGF5Om5vbmV9fS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWIsLmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7Ym9yZGVyOjFweCBzb2xpZH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlIC5tYXQtc2xpZGUtdG9nZ2xlLmNkay1rZXlib2FyZC1mb2N1c2VkIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcntvdXRsaW5lOjJweCBkb3R0ZWQ7b3V0bGluZS1vZmZzZXQ6NXB4fVxuIl0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTWF0U2xpZGVUb2dnbGUuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBFbGVtZW50UmVmIH0sCiAgICAgICAgeyB0eXBlOiBGb2N1c01vbml0b3IgfSwKICAgICAgICB7IHR5cGU6IENoYW5nZURldGVjdG9yUmVmIH0sCiAgICAgICAgeyB0eXBlOiBTdHJpbmcsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEF0dHJpYnV0ZSwgYXJnczogWyd0YWJpbmRleCcsXSB9XSB9LAogICAgICAgIHsgdHlwZTogTmdab25lIH0sCiAgICAgICAgeyB0eXBlOiB1bmRlZmluZWQsIGRlY29yYXRvcnM6IFt7IHR5cGU6IEluamVjdCwgYXJnczogW01BVF9TTElERV9UT0dHTEVfREVGQVVMVF9PUFRJT05TLF0gfV0gfSwKICAgICAgICB7IHR5cGU6IFN0cmluZywgZGVjb3JhdG9yczogW3sgdHlwZTogT3B0aW9uYWwgfSwgeyB0eXBlOiBJbmplY3QsIGFyZ3M6IFtBTklNQVRJT05fTU9EVUxFX1RZUEUsXSB9XSB9LAogICAgICAgIHsgdHlwZTogRGlyZWN0aW9uYWxpdHksIGRlY29yYXRvcnM6IFt7IHR5cGU6IE9wdGlvbmFsIH1dIH0KICAgIF07CiAgICBNYXRTbGlkZVRvZ2dsZS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBfdGh1bWJFbDogW3sgdHlwZTogVmlld0NoaWxkLCBhcmdzOiBbJ3RodW1iQ29udGFpbmVyJyxdIH1dLAogICAgICAgIF90aHVtYkJhckVsOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsndG9nZ2xlQmFyJyxdIH1dLAogICAgICAgIG5hbWU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGlkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBsYWJlbFBvc2l0aW9uOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhcmlhTGFiZWw6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWwnLF0gfV0sCiAgICAgICAgYXJpYUxhYmVsbGVkYnk6IFt7IHR5cGU6IElucHV0LCBhcmdzOiBbJ2FyaWEtbGFiZWxsZWRieScsXSB9XSwKICAgICAgICByZXF1aXJlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2hlY2tlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgY2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgdG9nZ2xlQ2hhbmdlOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgZHJhZ0NoYW5nZTogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIF9pbnB1dEVsZW1lbnQ6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydpbnB1dCcsXSB9XQogICAgfTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHNyYy9tYXRlcmlhbC9zbGlkZS10b2dnbGUvc2xpZGUtdG9nZ2xlLXJlcXVpcmVkLXZhbGlkYXRvci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBNQVRfU0xJREVfVE9HR0xFX1JFUVVJUkVEX1ZBTElEQVRPUiA9IHsKICAgICAgICBwcm92aWRlOiBOR19WQUxJREFUT1JTLAogICAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgICgpID0+IE1hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3IpKSwKICAgICAgICBtdWx0aTogdHJ1ZQogICAgfTsKICAgIC8qKgogICAgICogVmFsaWRhdG9yIGZvciBNYXRlcmlhbCBzbGlkZS10b2dnbGUgY29tcG9uZW50cyB3aXRoIHRoZSByZXF1aXJlZCBhdHRyaWJ1dGUgaW4gYQogICAgICogdGVtcGxhdGUtZHJpdmVuIGZvcm0uIFRoZSBkZWZhdWx0IHZhbGlkYXRvciBmb3IgcmVxdWlyZWQgZm9ybSBjb250cm9scyBhc3NlcnRzCiAgICAgKiB0aGF0IHRoZSBjb250cm9sIHZhbHVlIGlzIG5vdCB1bmRlZmluZWQgYnV0IHRoYXQgaXMgbm90IGFwcHJvcHJpYXRlIGZvciBhIHNsaWRlLXRvZ2dsZQogICAgICogd2hlcmUgdGhlIHZhbHVlIGlzIGFsd2F5cyBkZWZpbmVkLgogICAgICoKICAgICAqIFJlcXVpcmVkIHNsaWRlLXRvZ2dsZSBmb3JtIGNvbnRyb2xzIGFyZSB2YWxpZCB3aGVuIGNoZWNrZWQuCiAgICAgKi8KICAgIGNsYXNzIE1hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3IgZXh0ZW5kcyBDaGVja2JveFJlcXVpcmVkVmFsaWRhdG9yIHsKICAgIH0KICAgIE1hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3IuybVmYWMgPSBmdW5jdGlvbiBNYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yX0ZhY3RvcnkodCkgeyByZXR1cm4gybVNYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yX0Jhc2VGYWN0b3J5KHQgfHwgTWF0U2xpZGVUb2dnbGVSZXF1aXJlZFZhbGlkYXRvcik7IH07CiAgICBNYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yLsm1ZGlyID0gybXJtWRlZmluZURpcmVjdGl2ZSh7IHR5cGU6IE1hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3IsIHNlbGVjdG9yczogW1sibWF0LXNsaWRlLXRvZ2dsZSIsICJyZXF1aXJlZCIsICIiLCAiZm9ybUNvbnRyb2xOYW1lIiwgIiJdLCBbIm1hdC1zbGlkZS10b2dnbGUiLCAicmVxdWlyZWQiLCAiIiwgImZvcm1Db250cm9sIiwgIiJdLCBbIm1hdC1zbGlkZS10b2dnbGUiLCAicmVxdWlyZWQiLCAiIiwgIm5nTW9kZWwiLCAiIl1dLCBmZWF0dXJlczogW8m1ybVQcm92aWRlcnNGZWF0dXJlKFtNQVRfU0xJREVfVE9HR0xFX1JFUVVJUkVEX1ZBTElEQVRPUl0pLCDJtcm1SW5oZXJpdERlZmluaXRpb25GZWF0dXJlXSB9KTsKICAgIGNvbnN0IMm1TWF0U2xpZGVUb2dnbGVSZXF1aXJlZFZhbGlkYXRvcl9CYXNlRmFjdG9yeSA9IMm1ybVnZXRJbmhlcml0ZWRGYWN0b3J5KE1hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3IpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogc3JjL21hdGVyaWFsL3NsaWRlLXRvZ2dsZS9zbGlkZS10b2dnbGUtbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8qKgogICAgICogVGhpcyBtb2R1bGUgaXMgdXNlZCBieSBib3RoIG9yaWdpbmFsIGFuZCBNREMtYmFzZWQgc2xpZGUtdG9nZ2xlIGltcGxlbWVudGF0aW9ucy4KICAgICAqLwogICAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNsYXNzLW5hbWUKICAgIGNsYXNzIF9NYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlIHsKICAgIH0KICAgIF9NYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogX01hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUgfSk7CiAgICBfTWF0U2xpZGVUb2dnbGVSZXF1aXJlZFZhbGlkYXRvck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIF9NYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IF9NYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlKSgpOyB9IH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoX01hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTWF0U2xpZGVUb2dnbGVSZXF1aXJlZFZhbGlkYXRvcl0sIGV4cG9ydHM6IFtNYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yXSB9KTsgfSkoKTsKICAgIGNsYXNzIE1hdFNsaWRlVG9nZ2xlTW9kdWxlIHsKICAgIH0KICAgIE1hdFNsaWRlVG9nZ2xlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWF0U2xpZGVUb2dnbGVNb2R1bGUgfSk7CiAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1hdFNsaWRlVG9nZ2xlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1hdFNsaWRlVG9nZ2xlTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbWwogICAgICAgICAgICAgICAgX01hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRSaXBwbGVNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBPYnNlcnZlcnNNb2R1bGUsCiAgICAgICAgICAgIF0sCiAgICAgICAgICAgIF9NYXRTbGlkZVRvZ2dsZVJlcXVpcmVkVmFsaWRhdG9yTW9kdWxlLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWF0U2xpZGVUb2dnbGVNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbTWF0U2xpZGVUb2dnbGVdOyB9LCBpbXBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbX01hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUsCiAgICAgICAgICAgIE1hdFJpcHBsZU1vZHVsZSwKICAgICAgICAgICAgTWF0Q29tbW9uTW9kdWxlLAogICAgICAgICAgICBPYnNlcnZlcnNNb2R1bGVdOyB9LCBleHBvcnRzOiBmdW5jdGlvbiAoKSB7IHJldHVybiBbX01hdFNsaWRlVG9nZ2xlUmVxdWlyZWRWYWxpZGF0b3JNb2R1bGUsCiAgICAgICAgICAgIE1hdFNsaWRlVG9nZ2xlLAogICAgICAgICAgICBNYXRDb21tb25Nb2R1bGVdOyB9IH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfdG9vbGJhci9hbm5vdGF0aW9uc19zZWFyY2gvYW5ub3RhdGlvbnNfc2VhcmNoX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudF9tYXRfaWNvbl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50KDAsICJtYXQtaWNvbiIsIDMpOwogICAgfSB9CiAgICBjbGFzcyBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMub25SZWdleEZpbHRlclZhbHVlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgIH0KICAgIH0KICAgIEFubm90YXRpb25zU2VhcmNoQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9hbm5vdGF0aW9uc19zZWFyY2hfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2Fubm90YXRpb25zX3NlYXJjaF9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICByZWdleEZpbHRlclZhbHVlOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBpc1JlZ2V4RmlsdGVyVmFsaWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLnZhbGlkJyxdIH0sIHsgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbnNTZWFyY2hDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQiXV0sIGhvc3RWYXJzOiAyLCBob3N0QmluZGluZ3M6IGZ1bmN0aW9uIEFubm90YXRpb25zU2VhcmNoQ29tcG9uZW50X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgidmFsaWQiLCBjdHguaXNSZWdleEZpbHRlclZhbGlkKTsKICAgICAgICB9IH0sIGlucHV0czogeyByZWdleEZpbHRlclZhbHVlOiAicmVnZXhGaWx0ZXJWYWx1ZSIsIGlzUmVnZXhGaWx0ZXJWYWxpZDogImlzUmVnZXhGaWx0ZXJWYWxpZCIgfSwgb3V0cHV0czogeyBvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2U6ICJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiIH0sIGRlY2xzOiAzLCB2YXJzOiAyLCBjb25zdHM6IFtbInN2Z0ljb24iLCAic2VhcmNoXzI0cHgiXSwgWyJhdXRvY29tcGxldGUiLCAib2ZmIiwgInBsYWNlaG9sZGVyIiwgIkZpbHRlciBBbm5vdGF0aW9ucyIsIDMsICJ2YWx1ZSIsICJpbnB1dCJdLCBbInN2Z0ljb24iLCAiZXJyb3JfMjRweCIsICJjbGFzcyIsICJlcnJvci1pY29uIiwgIm1hdFRvb2x0aXAiLCAiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsIDQsICJuZ0lmIl0sIFsic3ZnSWNvbiIsICJlcnJvcl8yNHB4IiwgIm1hdFRvb2x0aXAiLCAiSW52YWxpZCByZWdleCBmaWx0ZXIuIFRoZSByZXN1bHQgbWF5IGJlIHN0YWxlLiIsIDEsICJlcnJvci1pY29uIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQW5ub3RhdGlvbnNTZWFyY2hDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJtYXQtaWNvbiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJpbnB1dCIsIDEpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImlucHV0IiwgZnVuY3Rpb24gQW5ub3RhdGlvbnNTZWFyY2hDb21wb25lbnRfVGVtcGxhdGVfaW5wdXRfaW5wdXRfMV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UuZW1pdCgkZXZlbnQudGFyZ2V0LnZhbHVlKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudF9tYXRfaWNvbl8yX1RlbXBsYXRlLCAxLCAwLCAibWF0LWljb24iLCAyKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgidmFsdWUiLCBjdHgucmVnZXhGaWx0ZXJWYWx1ZSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCAhY3R4LmlzUmVnZXhGaWx0ZXJWYWxpZCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0SWNvbiwgTmdJZl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjYwMDtmb250LXNpemU6MTJweDtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjlweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHh9Lm1hdC1oMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaGVhZGxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDI0cHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTVweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC44MykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1oNltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgY2FsYygxNHB4ICogMC42NykvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjttYXJnaW46MCAwIDEycHh9Lm1hdC1ib2R5LXN0cm9uZ1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYm9keVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FwdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktNFtfbmdjb250ZW50LSVDT01QJV17Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTNbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjI0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FyZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcmQtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jaGVja2JveC1sYXlvdXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MjRweH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZS5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2FsZW5kYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEzcHh9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgdGhbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWRpYWxvZy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNXB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNHB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNTAlO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuNWVtO3dpZHRoOjEuNWVtfS5tYXQtZm9ybS1maWVsZC1wcmVmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjVlbSAwO2JvcmRlci10b3A6Ljg0Mzc1ZW0gc29saWQgdHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17dG9wOi0wLjg0Mzc1ZW07cGFkZGluZy10b3A6Ljg0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6NzUlO21hcmdpbi10b3A6LjY2NjY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS43OTE2NjY2NjY3ZW0pfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cGFkZGluZy1ib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxMDJweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIzZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNTMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LjU0MTY2NjY2NjdlbTt0b3A6Y2FsYygxMDAlIC0gMS42NjY2NjY2NjY3ZW0pfUBtZWRpYSBwcmludHsubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjJlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyZW0pIHNjYWxlKDAuNzUpfX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouMjVlbSAwIC43NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoxZW0gMCAxZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMiksIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fWlucHV0Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi0wLjA2MjVlbX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDpub3JtYWx9Lm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LXN0ZXAtbGFiZWwtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7cGFkZGluZy10b3A6OHB4O3BhZGRpbmctYm90dG9tOjhweH0ubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LXNpbXBsZS1zbmFja2Jhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHh9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0OjQwMDtmb250LXNpemU6MTRweH0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6aGlkZGVuO3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZFtfbmdjb250ZW50LSVDT01QJV17b3ZlcmZsb3c6dmlzaWJsZX0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtib3JkZXItcmFkaXVzOjUwJTtwb2ludGVyLWV2ZW50czpub25lO3RyYW5zaXRpb246b3BhY2l0eSx0cmFuc2Zvcm0gMG1zIGN1YmljLWJlemllcigwLCAwLCAwLjIsIDEpO3RyYW5zZm9ybTpzY2FsZSgwKX0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOjA7Y2xpcDpyZWN0KDAgMCAwIDApO2hlaWdodDoxcHg7bWFyZ2luOi0xcHg7b3ZlcmZsb3c6aGlkZGVuO3BhZGRpbmc6MDtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDoxcHg7b3V0bGluZTowOy13ZWJraXQtYXBwZWFyYW5jZTpub25lOy1tb3otYXBwZWFyYW5jZTpub25lfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BvaW50ZXItZXZlbnRzOm5vbmU7dG9wOjA7bGVmdDowO2hlaWdodDoxMDAlO3dpZHRoOjEwMCV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVdOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LXBhbmVbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3BvaW50ZXItZXZlbnRzOmF1dG87Ym94LXNpemluZzpib3JkZXItYm94O3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7bWF4LXdpZHRoOjEwMCU7bWF4LWhlaWdodDoxMDAlfS5jZGstb3ZlcmxheS1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MX1AbWVkaWEgc2NyZWVuIGFuZCAoLW1zLWhpZ2gtY29udHJhc3Q6IGFjdGl2ZSl7LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjZ9fS5jZGstb3ZlcmxheS1kYXJrLWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MXB4O21pbi1oZWlnaHQ6MXB4fS5jZGstZ2xvYmFsLXNjcm9sbGJsb2NrW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt3aWR0aDoxMDAlO292ZXJmbG93LXk6c2Nyb2xsfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnR7fUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5ke30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxse2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydCAwcyAxbXN9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemVbX25nY29udGVudC0lQ09NUCVde3Jlc2l6ZTpub25lfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmdbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OmF1dG8gIWltcG9ydGFudDtvdmVyZmxvdzpoaWRkZW4gIWltcG9ydGFudH10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nLWZpcmVmb3hbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEpfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLCAubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXM6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KTtjb2xvcjojMjEyMTIxfS5tYXQtb3B0aW9uLm1hdC1vcHRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjQ0MzM2fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wc2V1ZG8tY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojYjBiMGIwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjBiMGIwfS5tYXQtZWxldmF0aW9uLXowW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA1cHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Nltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA0cHggNXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA3cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMnB4IDE2cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejhbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTBweCAxNHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMThweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA3cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDExcHggMTVweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDIwcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTNweCAxOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjRweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA5cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE0cHggMjFweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI2cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE1W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE3W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTdweCAyNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzJweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MThbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDEycHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE5cHggMjlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM2cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIwcHggMzFweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDM4cHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMHB4IDE0cHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIycHggMzVweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQycHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE0cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIzcHggMzZweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ0cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejI0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC10aGVtZS1sb2FkZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcil7YmFja2dyb3VuZDojZmZmfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y1N2MwMH0uY2RrLWhpZ2gtY29udHJhc3QtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17b3V0bGluZTpzb2xpZCAxcHg7Ym9yZGVyLXJhZGl1czowfS5tYXQtYmFkZ2UtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1iYWRnZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1iYWRnZS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2I5YjliOTtjb2xvcjojNzU3NTc1fS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7dGV4dC1hbGlnbjpjZW50ZXI7ZGlzcGxheTppbmxpbmUtYmxvY2s7Ym9yZGVyLXJhZGl1czo1MCU7dHJhbnNpdGlvbjp0cmFuc2Zvcm0gMjAwbXMgZWFzZS1pbi1vdXQ7dHJhbnNmb3JtOnNjYWxlKDAuNik7b3ZlcmZsb3c6aGlkZGVuO3doaXRlLXNwYWNlOm5vd3JhcDt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO3BvaW50ZXItZXZlbnRzOm5vbmV9Lm5nLWFuaW1hdGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1iYWRnZS1jb250ZW50Ll9tYXQtYW5pbWF0aW9uLW5vb3BhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2l0aW9uOm5vbmV9Lm1hdC1iYWRnZS1jb250ZW50Lm1hdC1iYWRnZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoxNnB4O2hlaWdodDoxNnB4O2xpbmUtaGVpZ2h0OjE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LThweH0ubWF0LWJhZGdlLW1lZGl1bVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yMnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTExcHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTFweH0ubWF0LWJhZGdlLWxhcmdlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjhweDtoZWlnaHQ6MjhweDtsaW5lLWhlaWdodDoyOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDVweCA1cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDhweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTRweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzpub25lfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtYnV0dG9uLXRvZ2dsZS12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiM2MTYxNjF9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYmRiZGJkfS5tYXQtYnV0dG9uLXRvZ2dsZS1zdGFuZGFsb25lLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLm1hdC1jYXJkLWZsYXRbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQtc3VidGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1jaGVja21hcmtbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWNoZWNrbWFyay1wYXRoW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1jaGVja2VkKSAgIC5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzIxMjEyMX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCk6YWN0aXZle2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVdOmhvdmVye29wYWNpdHk6LjU0fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOiMwMDB9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGhlYWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Zm9vdFtfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1oZWFkZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtcm93XVtfbmdjb250ZW50LSVDT01QJV0sIFttYXQtZm9vdGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlLXN0aWNreVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1mb290ZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgdGgubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b20tY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItcHJldmlvdXMtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlci1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1jYWxlbmRhci1ib2R5LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7Ym9yZGVyLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtjb2xvcjojNzU3NTc1fS5tYXQtY2FsZW5kYXItYm9keS1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3ZlciA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQtdG91Y2hbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZGlhbG9nLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1kaXZpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFjdGlvbi1yb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSkgICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6I2ZmZn19Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLWluZGljYXRvcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LWFjY2VudCAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkubWF0LXdhcm4gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtZmxleFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWludmFsaWQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4wNil9Lm1hdC1pY29uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtaWNvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06ZGlzYWJsZWQsIC5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjU3YzAwfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06OnBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjotd2Via2l0LWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOi1tcy1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjQ0MzM2fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdWJoZWFkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1saXN0LWl0ZW0tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1tZW51LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tbm8tY29sb3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbS1zdWJtZW51LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KTtib3JkZXItcmlnaHQ6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MnB4IHNvbGlkIHJnYmEoMCwwLDAsLjU0KX0ubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1kZWNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1pbmNyZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1maXJzdFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWxhc3RbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZjZGQyfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWZpbGxbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1sYWJlbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc2VsZWN0LXBsYWNlaG9sZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlci5tYXQtZHJhd2VyLXB1c2hbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZHJhd2VyLXNpZGUpe2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZHJhd2VyLXNpZGUubWF0LWRyYXdlci1lbmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItYmFja2Ryb3AubWF0LWRyYXdlci1zaG93bltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNTQpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tlZCkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCAxcHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDFweCAxcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAzcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtc2xpZGUtdG9nZ2xlLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4yKX0ubWF0LXNsaWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci1mb2N1cy1yaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3ZlciAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKTpob3Zlci5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZC5tYXQtc2xpZGVyLWRpc2FibGVkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItaGFzLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuNyl9Lm1hdC1zbGlkZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gYm90dG9tLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXN0ZXAtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOm5vbmV9fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtb3B0aW9uYWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojNjE2MTYxO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lcnJvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudDtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcHBlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtc3RlcHBlci12ZXJ0aWNhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JvcmRlci1sZWZ0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmUsIC5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVyLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNvcnQtaGVhZGVyLWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKX0ubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3A6MXB4IHNvbGlkIHJnYmEoMCwwLDAsLjEyKTtib3JkZXItYm90dG9tOm5vbmV9Lm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM3NTc1NzV9Lm1hdC10YWItZ3JvdXBbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbTpub25lO2JvcmRlci10b3A6bm9uZX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNWY1ZjU7Y29sb3I6IzIxMjEyMX0ubWF0LXRvb2xiYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXR9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtdG9vbHRpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNuYWNrLWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjcpO2JhY2tncm91bmQ6IzMyMzIzMjtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zaW1wbGUtc25hY2tiYXItYWN0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfVtfbmdob3N0LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOnJlbGF0aXZlfVtfbmdob3N0LSVDT01QJV06bm90KC52YWxpZCl7Y29sb3I6I2M2MjgyOH1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgaW5wdXRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn1bX25naG9zdC0lQ09NUCVdOm5vdCgudmFsaWQpICAgLmVycm9yLWljb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNjNjI4Mjg7cG9zaXRpb246YWJzb2x1dGU7cmlnaHQ6MH0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfdG9vbGJhci9hbm5vdGF0aW9uc19zZWFyY2gvYW5ub3RhdGlvbnNfc2VhcmNoX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBBbm5vdGF0aW9uc1NlYXJjaENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRBbm5vdGF0aW9uc1JlZ2V4KTsKICAgICAgICAgICAgdGhpcy5pc0Fubm90YXRpb25zRmlsdGVyVmFsaWQkID0gdGhpcy5hbm5vdGF0aW9uc0ZpbHRlciQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlclN0cmluZwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGZpbHRlclN0cmluZykgPT4gewogICAgICAgICAgICAgICAgdHJ5IHsKICAgICAgICAgICAgICAgICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6bm8tdW51c2VkLWV4cHJlc3Npb24gQ2hlY2sgZm9yIHZhbGlkaXR5IG9mIGZpbHRlci4KICAgICAgICAgICAgICAgICAgICBuZXcgUmVnRXhwKGZpbHRlclN0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmlsdGVyQ2hhbmdlKGZpbHRlcikgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlBbm5vdGF0aW9uc1JlZ2V4Q2hhbmdlZCh7IHJlZ2V4OiBmaWx0ZXIgfSkpOwogICAgICAgIH0KICAgIH0KICAgIEFubm90YXRpb25zU2VhcmNoQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLWFubm90YXRpb25zLXNlYXJjaCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQKICAgICAgW3JlZ2V4RmlsdGVyVmFsdWVdPSJhbm5vdGF0aW9uc0ZpbHRlciQgfCBhc3luYyIKICAgICAgW2lzUmVnZXhGaWx0ZXJWYWxpZF09ImlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQgfCBhc3luYyIKICAgICAgKG9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZSk9ImZpbHRlckNoYW5nZSgkZXZlbnQpIgogICAgPjwvbnBtaS1hbm5vdGF0aW9ucy1zZWFyY2gtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEFubm90YXRpb25zU2VhcmNoQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbm5vdGF0aW9uc1NlYXJjaENvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEFubm90YXRpb25zU2VhcmNoQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFubm90YXRpb25zU2VhcmNoQ29udGFpbmVyKSjJtcm1ZGlyZWN0aXZlSW5qZWN0KFN0b3JlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbnNTZWFyY2hDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQW5ub3RhdGlvbnNTZWFyY2hDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1hbm5vdGF0aW9ucy1zZWFyY2giXV0sIGRlY2xzOiAzLCB2YXJzOiA2LCBjb25zdHM6IFtbMywgInJlZ2V4RmlsdGVyVmFsdWUiLCAiaXNSZWdleEZpbHRlclZhbGlkIiwgIm9uUmVnZXhGaWx0ZXJWYWx1ZUNoYW5nZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEFubm90YXRpb25zU2VhcmNoQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJucG1pLWFubm90YXRpb25zLXNlYXJjaC1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJvblJlZ2V4RmlsdGVyVmFsdWVDaGFuZ2UiLCBmdW5jdGlvbiBBbm5vdGF0aW9uc1NlYXJjaENvbnRhaW5lcl9UZW1wbGF0ZV9ucG1pX2Fubm90YXRpb25zX3NlYXJjaF9jb21wb25lbnRfb25SZWdleEZpbHRlclZhbHVlQ2hhbmdlXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguZmlsdGVyQ2hhbmdlKCRldmVudCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgicmVnZXhGaWx0ZXJWYWx1ZSIsIMm1ybVwaXBlQmluZDEoMSwgMiwgY3R4LmFubm90YXRpb25zRmlsdGVyJCkpKCJpc1JlZ2V4RmlsdGVyVmFsaWQiLCDJtcm1cGlwZUJpbmQxKDIsIDQsIGN0eC5pc0Fubm90YXRpb25zRmlsdGVyVmFsaWQkKSk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbQW5ub3RhdGlvbnNTZWFyY2hDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXIvYW5ub3RhdGlvbnNfbGlzdF90b29sYmFyX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICB2YXIgSTE4Tl8wJDk7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIExhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGhpZGVzL3Nob3dzIHRoZSBhbm5vdGF0aW9ucyBsaXN0LgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfNzMzNjM3NDQxMzA1NjM0MjQ5MiQkVEVOU09SQk9BUkRfV0VCQVBQX1BMVUdJTlNfTlBNSV9WSUVXU19BTk5PVEFUSU9OU19MSVNUX0FOTk9UQVRJT05TX0xJU1RfVE9PTEJBUl9BTk5PVEFUSU9OU19MSVNUX1RPT0xCQVJfQ09NUE9ORU5UX1RTXzEgPSBnb29nLmdldE1zZygiSGlkZXMvU2hvd3MgdGhlIEFubm90YXRpb25zIExpc3QiKTsKICAgICAgICBJMThOXzAkOSA9IE1TR19FWFRFUk5BTF83MzM2Mzc0NDEzMDU2MzQyNDkyJCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX0FOTk9UQVRJT05TX0xJU1RfQU5OT1RBVElPTlNfTElTVF9UT09MQkFSX0FOTk9UQVRJT05TX0xJU1RfVE9PTEJBUl9DT01QT05FTlRfVFNfMTsKICAgIH0KICAgIGVsc2UgewogICAgICAgIEkxOE5fMCQ5ID0gJGxvY2FsaXplIGA6TGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgaGlkZXMvc2hvd3MgdGhlIGFubm90YXRpb25zIGxpc3Qu4pCfYjM2MDNiYTMzZTUzMDhkZDhjNWU4MDVlNTA4YjJmNzIzM2RmODlkNOKQnzczMzYzNzQ0MTMwNTYzNDI0OTI6SGlkZXMvU2hvd3MgdGhlIEFubm90YXRpb25zIExpc3RgOwogICAgfQogICAgY29uc3QgX2MyJGcgPSBbImFyaWEtbGFiZWwiLCBJMThOXzAkOV07CiAgICB2YXIgSTE4Tl8zJDY7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIExhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGZsYWdzIHNlbGVjdGVkIGFubm90YXRpb25zLgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfMjI0NDA5OTg5MTMxMzMzNjU5NSQkVEVOU09SQk9BUkRfV0VCQVBQX1BMVUdJTlNfTlBNSV9WSUVXU19BTk5PVEFUSU9OU19MSVNUX0FOTk9UQVRJT05TX0xJU1RfVE9PTEJBUl9BTk5PVEFUSU9OU19MSVNUX1RPT0xCQVJfQ09NUE9ORU5UX1RTX180ID0gZ29vZy5nZXRNc2coIkZsYWcgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTsKICAgICAgICBJMThOXzMkNiA9IE1TR19FWFRFUk5BTF8yMjQ0MDk5ODkxMzEzMzM2NTk1JCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX0FOTk9UQVRJT05TX0xJU1RfQU5OT1RBVElPTlNfTElTVF9UT09MQkFSX0FOTk9UQVRJT05TX0xJU1RfVE9PTEJBUl9DT01QT05FTlRfVFNfXzQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzMkNiA9ICRsb2NhbGl6ZSBgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGZsYWdzIHNlbGVjdGVkIGFubm90YXRpb25zLuKQnzU2OTJhZDg4MzEwMzhhOTBjNTg2M2ExZTlhZGY5NzQ4Y2FjM2NhZDjikJ8yMjQ0MDk5ODkxMzEzMzM2NTk1OkZsYWcgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgOwogICAgfQogICAgY29uc3QgX2M1JDggPSBbImFyaWEtbGFiZWwiLCBJMThOXzMkNl07CiAgICB2YXIgSTE4Tl82JDI7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIExhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGhpZGVzIHNlbGVjdGVkIGFubm90YXRpb25zLgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfNTQ2MjgzMjM5MTA5MjA4NzQ4NSQkVEVOU09SQk9BUkRfV0VCQVBQX1BMVUdJTlNfTlBNSV9WSUVXU19BTk5PVEFUSU9OU19MSVNUX0FOTk9UQVRJT05TX0xJU1RfVE9PTEJBUl9BTk5PVEFUSU9OU19MSVNUX1RPT0xCQVJfQ09NUE9ORU5UX1RTX183ID0gZ29vZy5nZXRNc2coIkhpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnMiKTsKICAgICAgICBJMThOXzYkMiA9IE1TR19FWFRFUk5BTF81NDYyODMyMzkxMDkyMDg3NDg1JCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX0FOTk9UQVRJT05TX0xJU1RfQU5OT1RBVElPTlNfTElTVF9UT09MQkFSX0FOTk9UQVRJT05TX0xJU1RfVE9PTEJBUl9DT01QT05FTlRfVFNfXzc7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzYkMiA9ICRsb2NhbGl6ZSBgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGhpZGVzIHNlbGVjdGVkIGFubm90YXRpb25zLuKQnzAzNDJjZGIzMzU4ZmE4ZTNmYTI3MjIwYTgyNThhNzI4NzQzMGI3MGbikJ81NDYyODMyMzkxMDkyMDg3NDg1OkhpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgOwogICAgfQogICAgY29uc3QgX2M4JDMgPSBbImFyaWEtbGFiZWwiLCBJMThOXzYkMl07CiAgICBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50X25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yMyA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiYnV0dG9uIiwgNSk7CiAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDIsIF9jNSQ4KTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbXBvbmVudF9uZ19jb250YWluZXJfM19UZW1wbGF0ZV9idXR0b25fY2xpY2tfMV9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yMyk7IGNvbnN0IGN0eF9yMiA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IyLm9uRmxhZ0Fubm90YXRpb25zLmVtaXQoY3R4X3IyLnNlbGVjdGVkQW5ub3RhdGlvbnMpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudCgzLCAibWF0LWljb24iLCA2KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNCwgImJ1dHRvbiIsIDcpOwogICAgICAgIMm1ybVpMThuQXR0cmlidXRlcyg1LCBfYzgkMyk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb21wb25lbnRfbmdfY29udGFpbmVyXzNfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzRfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjMpOyBjb25zdCBjdHhfcjQgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNC5vbkhpZGVBbm5vdGF0aW9ucy5lbWl0KGN0eF9yNC5zZWxlY3RlZEFubm90YXRpb25zKTsgfSk7CiAgICAgICAgybXJtWVsZW1lbnQoNiwgIm1hdC1pY29uIiwgOCk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudENvbnRhaW5lckVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgY3R4X3IwID0gybXJtW5leHRDb250ZXh0KCk7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJkaXNhYmxlZCIsIGN0eF9yMC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCA9PT0gMCk7CiAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgybXJtXByb3BlcnR5KCJkaXNhYmxlZCIsIGN0eF9yMC5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCA9PT0gMCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb21wb25lbnRfbmdfY29udGFpbmVyXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I2ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJTdGFydCgwKTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJtYXQtc2xpZGUtdG9nZ2xlIiwgOSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50X25nX2NvbnRhaW5lcl80X1RlbXBsYXRlX21hdF9zbGlkZV90b2dnbGVfY2hhbmdlXzFfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjYpOyBjb25zdCBjdHhfcjUgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNS5vblRvZ2dsZVNob3dDb3VudHMuZW1pdCgpOyB9KTsKICAgICAgICDJtcm1dGV4dCgyLCAiIFNhbXBsZSBDb3VudCAiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgIm1hdC1zbGlkZS10b2dnbGUiLCAxMCk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjaGFuZ2UiLCBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50X25nX2NvbnRhaW5lcl80X1RlbXBsYXRlX21hdF9zbGlkZV90b2dnbGVfY2hhbmdlXzNfbGlzdGVuZXIoKSB7IMm1ybVyZXN0b3JlVmlldyhfcjYpOyBjb25zdCBjdHhfcjcgPSDJtcm1bmV4dENvbnRleHQoKTsgcmV0dXJuIGN0eF9yNy5vblRvZ2dsZVNob3dIaWRkZW4uZW1pdCgpOyB9KTsKICAgICAgICDJtcm1dGV4dCg0LCAiIFNob3cgSGlkZGVuICIpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgybXJtWVsZW1lbnQoNSwgIm5wbWktYW5ub3RhdGlvbnMtc2VhcmNoIik7CiAgICAgICAgybXJtWVsZW1lbnRDb250YWluZXJFbmQoKTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMSA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiY2hlY2tlZCIsIGN0eF9yMS5zaG93Q291bnRzKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCBjdHhfcjEuc2hvd0hpZGRlbik7CiAgICB9IH0KICAgIGNsYXNzIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLm9uRmxhZ0Fubm90YXRpb25zID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uSGlkZUFubm90YXRpb25zID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uVG9nZ2xlRXhwYW5kZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25Ub2dnbGVTaG93Q291bnRzID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uVG9nZ2xlU2hvd0hpZGRlbiA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICB9CiAgICBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2Fubm90YXRpb25zX2xpc3RfdG9vbGJhcl9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG51bUFubm90YXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBleHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2VsZWN0ZWRBbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYW5ub3RhdGlvbnNFeHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2hvd0NvdW50czogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2hvd0hpZGRlbjogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25GbGFnQW5ub3RhdGlvbnM6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBvbkhpZGVBbm5vdGF0aW9uczogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uVG9nZ2xlRXhwYW5kZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBvblRvZ2dsZVNob3dDb3VudHM6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICBvblRvZ2dsZVNob3dIaWRkZW46IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQiXV0sIGlucHV0czogeyBudW1Bbm5vdGF0aW9uczogIm51bUFubm90YXRpb25zIiwgZXhwYW5kZWQ6ICJleHBhbmRlZCIsIHNlbGVjdGVkQW5ub3RhdGlvbnM6ICJzZWxlY3RlZEFubm90YXRpb25zIiwgYW5ub3RhdGlvbnNFeHBhbmRlZDogImFubm90YXRpb25zRXhwYW5kZWQiLCBzaG93Q291bnRzOiAic2hvd0NvdW50cyIsIHNob3dIaWRkZW46ICJzaG93SGlkZGVuIiB9LCBvdXRwdXRzOiB7IG9uRmxhZ0Fubm90YXRpb25zOiAib25GbGFnQW5ub3RhdGlvbnMiLCBvbkhpZGVBbm5vdGF0aW9uczogIm9uSGlkZUFubm90YXRpb25zIiwgb25Ub2dnbGVFeHBhbmRlZDogIm9uVG9nZ2xlRXhwYW5kZWQiLCBvblRvZ2dsZVNob3dDb3VudHM6ICJvblRvZ2dsZVNob3dDb3VudHMiLCBvblRvZ2dsZVNob3dIaWRkZW46ICJvblRvZ2dsZVNob3dIaWRkZW4iIH0sIGRlY2xzOiA4LCB2YXJzOiA0LCBjb25zdHM6IFtbMSwgImFubm90YXRpb25zLXRpdGxlLWNvbnRhaW5lciJdLCBbMSwgImFubm90YXRpb25zLXRpdGxlIl0sIFs0LCAibmdJZiJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAxLCAiZXhwYW5kLWJ1dHRvbiIsIDMsICJjbGljayIsIDYsICJhcmlhLWxhYmVsIl0sIFszLCAic3ZnSWNvbiJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidGl0bGUiLCAiRmxhZ2dpbmcgYW5ub3RhdGlvbnMgYWRkcyB0aGVtIHRvIHlvdXIgaW52ZXN0aWdhdGlvbiByZXN1bHRzLCB3aGljaCBjYW4gbGF0ZXIgYmUgZXhwb3J0ZWQuIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgImZsYWdfMjRweCJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidGl0bGUiLCAiUmVtb3Zpbmcgbm9uLWNyaXRpY2FsIGFubm90YXRpb25zIHVuY2x1dHRlcnMgdGhlIHZpZXcuIFJlbW92ZWQgYW5ub3RhdGlvbnMgYXJlIHJlbW92ZWQgZnJvbSBhbGwgdmlzdWFsaXphdGlvbnMuIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgInZpc2liaWxpdHlfb2ZmXzI0cHgiXSwgWyJ0aXRsZSIsICJIaWRlcyBhbmQgc2hvd3MgdGhlIHNhbXBsZSBjb3VudCB3aGVyZSBhcHBsaWNhYmxlIChob3cgbWFueSBzYW1wbGVzIGJlbG9uZyB0byBhIGNhdGVnb3J5KS4iLCAxLCAic2hvdy10b2dnbGUiLCAzLCAiY2hlY2tlZCIsICJjaGFuZ2UiXSwgWyJ0aXRsZSIsICJIaWRlcyBhbmQgc2hvd3MgaGlkZGVuIGFubm90YXRpb25zIGluIGFsbCB2aXN1YWxpemF0aW9ucy4iLCAxLCAic2hvdy10b2dnbGUiLCAzLCAiY2hlY2tlZCIsICJjaGFuZ2UiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiaDMiLCAxKTsKICAgICAgICAgICAgybXJtXRleHQoMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgzLCBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50X25nX2NvbnRhaW5lcl8zX1RlbXBsYXRlLCA3LCAyLCAibmctY29udGFpbmVyIiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50X25nX2NvbnRhaW5lcl80X1RlbXBsYXRlLCA2LCAyLCAibmctY29udGFpbmVyIiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImJ1dHRvbiIsIDMpOwogICAgICAgICAgICDJtcm1aTE4bkF0dHJpYnV0ZXMoNiwgX2MyJGcpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfNV9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vblRvZ2dsZUV4cGFuZGVkLmVtaXQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDcsICJtYXQtaWNvbiIsIDQpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICAgICAgybXJtXRleHRJbnRlcnBvbGF0ZTEoIkFubm90YXRpb25zICgiLCBjdHgubnVtQW5ub3RhdGlvbnMsICIpIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZXhwYW5kZWQpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LmV4cGFuZGVkKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMyk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgic3ZnSWNvbiIsIGN0eC5leHBhbmRlZCA/ICJleHBhbmRfbGVzc18yNHB4IiA6ICJleHBhbmRfbW9yZV8yNHB4Iik7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTmdJZiwgTWF0QnV0dG9uLCBNYXRJY29uLCBNYXRTbGlkZVRvZ2dsZSwgQW5ub3RhdGlvbnNTZWFyY2hDb250YWluZXJdLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtib3gtc2l6aW5nOmJvcmRlci1ib3g7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOnJvdztwYWRkaW5nOjAgMTZweDt3aWR0aDoxMDAlfS5hbm5vdGF0aW9ucy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTppbmxpbmU7Zm9udC1zaXplOi45ZW07Zm9udC13ZWlnaHQ6NTAwO3BhZGRpbmctcmlnaHQ6MTBweH0uYW5ub3RhdGlvbnMtdGl0bGUtY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXgtd3JhcDpub3dyYXA7ZmxleDoxIDE7aGVpZ2h0OjQycHh9LnNob3ctdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6LjllbTttYXJnaW4tcmlnaHQ6LjhlbX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfdG9vbGJhci9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRTZWxlY3RlZEFubm90YXRpb25zKTsKICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uc0V4cGFuZGVkJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldEFubm90YXRpb25zRXhwYW5kZWQpOwogICAgICAgICAgICB0aGlzLnNob3dDb3VudHMkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0U2hvd0NvdW50cyk7CiAgICAgICAgICAgIHRoaXMuc2hvd0hpZGRlbiQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRTaG93SGlkZGVuQW5ub3RhdGlvbnMpOwogICAgICAgICAgICB0aGlzLmFubm90YXRpb25zRmlsdGVyJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldEFubm90YXRpb25zUmVnZXgpOwogICAgICAgICAgICB0aGlzLmlzQW5ub3RhdGlvbnNGaWx0ZXJWYWxpZCQgPSB0aGlzLmFubm90YXRpb25zRmlsdGVyJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZmlsdGVyU3RyaW5nCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZmlsdGVyU3RyaW5nKSA9PiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBCb29sZWFuKG5ldyBSZWdFeHAoZmlsdGVyU3RyaW5nKSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBjYXRjaCAoZXJyKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGZpbHRlcgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZmlsdGVyQ2hhbmdlKGZpbHRlcikgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlBbm5vdGF0aW9uc1JlZ2V4Q2hhbmdlZCh7IHJlZ2V4OiBmaWx0ZXIgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmbGFnQW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pVG9nZ2xlQW5ub3RhdGlvbkZsYWdzKHsKICAgICAgICAgICAgICAgIGFubm90YXRpb25zLAogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbnMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGhpZGVBbm5vdGF0aW9ucyhhbm5vdGF0aW9ucykgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlUb2dnbGVBbm5vdGF0aW9uc0hpZGRlbih7CiAgICAgICAgICAgICAgICBhbm5vdGF0aW9ucywKICAgICAgICAgICAgfSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvZ2dsZUV4cGFuZGVkKCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlUb2dnbGVBbm5vdGF0aW9uc0V4cGFuZGVkKCkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHRvZ2dsZVNob3dDb3VudHMoKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaVRvZ2dsZVNob3dDb3VudHMoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgdG9nZ2xlU2hvd0hpZGRlbigpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pVG9nZ2xlU2hvd0hpZGRlbkFubm90YXRpb25zKCkpOwogICAgICAgIH0KICAgIH0KICAgIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPG5wbWktYW5ub3RhdGlvbnMtbGlzdC10b29sYmFyLWNvbXBvbmVudAogICAgICBbbnVtQW5ub3RhdGlvbnNdPSJudW1Bbm5vdGF0aW9ucyIKICAgICAgW2V4cGFuZGVkXT0iZXhwYW5kZWQiCiAgICAgIFtzZWxlY3RlZEFubm90YXRpb25zXT0ic2VsZWN0ZWRBbm5vdGF0aW9ucyQgfCBhc3luYyIKICAgICAgW2Fubm90YXRpb25zRXhwYW5kZWRdPSJhbm5vdGF0aW9uc0V4cGFuZGVkJCB8IGFzeW5jIgogICAgICBbc2hvd0NvdW50c109InNob3dDb3VudHMkIHwgYXN5bmMiCiAgICAgIFtzaG93SGlkZGVuXT0ic2hvd0hpZGRlbiQgfCBhc3luYyIKICAgICAgKG9uRmxhZ0Fubm90YXRpb25zKT0iZmxhZ0Fubm90YXRpb25zKCRldmVudCkiCiAgICAgIChvbkhpZGVBbm5vdGF0aW9ucyk9ImhpZGVBbm5vdGF0aW9ucygkZXZlbnQpIgogICAgICAob25Ub2dnbGVFeHBhbmRlZCk9InRvZ2dsZUV4cGFuZGVkKCkiCiAgICAgIChvblRvZ2dsZVNob3dDb3VudHMpPSJ0b2dnbGVTaG93Q291bnRzKCkiCiAgICAgIChvblRvZ2dsZVNob3dIaWRkZW4pPSJ0b2dnbGVTaG93SGlkZGVuKCkiCiAgICA+PC9ucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG51bUFubm90YXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBleHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhciJdXSwgaW5wdXRzOiB7IG51bUFubm90YXRpb25zOiAibnVtQW5ub3RhdGlvbnMiLCBleHBhbmRlZDogImV4cGFuZGVkIiB9LCBkZWNsczogNSwgdmFyczogMTQsIGNvbnN0czogW1szLCAibnVtQW5ub3RhdGlvbnMiLCAiZXhwYW5kZWQiLCAic2VsZWN0ZWRBbm5vdGF0aW9ucyIsICJhbm5vdGF0aW9uc0V4cGFuZGVkIiwgInNob3dDb3VudHMiLCAic2hvd0hpZGRlbiIsICJvbkZsYWdBbm5vdGF0aW9ucyIsICJvbkhpZGVBbm5vdGF0aW9ucyIsICJvblRvZ2dsZUV4cGFuZGVkIiwgIm9uVG9nZ2xlU2hvd0NvdW50cyIsICJvblRvZ2dsZVNob3dIaWRkZW4iXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJucG1pLWFubm90YXRpb25zLWxpc3QtdG9vbGJhci1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJvbkZsYWdBbm5vdGF0aW9ucyIsIGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXJfVGVtcGxhdGVfbnBtaV9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfY29tcG9uZW50X29uRmxhZ0Fubm90YXRpb25zXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguZmxhZ0Fubm90YXRpb25zKCRldmVudCk7IH0pKCJvbkhpZGVBbm5vdGF0aW9ucyIsIGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXJfVGVtcGxhdGVfbnBtaV9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfY29tcG9uZW50X29uSGlkZUFubm90YXRpb25zXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguaGlkZUFubm90YXRpb25zKCRldmVudCk7IH0pKCJvblRvZ2dsZUV4cGFuZGVkIiwgZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lcl9UZW1wbGF0ZV9ucG1pX2Fubm90YXRpb25zX2xpc3RfdG9vbGJhcl9jb21wb25lbnRfb25Ub2dnbGVFeHBhbmRlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LnRvZ2dsZUV4cGFuZGVkKCk7IH0pKCJvblRvZ2dsZVNob3dDb3VudHMiLCBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29udGFpbmVyX1RlbXBsYXRlX25wbWlfYW5ub3RhdGlvbnNfbGlzdF90b29sYmFyX2NvbXBvbmVudF9vblRvZ2dsZVNob3dDb3VudHNfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC50b2dnbGVTaG93Q291bnRzKCk7IH0pKCJvblRvZ2dsZVNob3dIaWRkZW4iLCBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29udGFpbmVyX1RlbXBsYXRlX25wbWlfYW5ub3RhdGlvbnNfbGlzdF90b29sYmFyX2NvbXBvbmVudF9vblRvZ2dsZVNob3dIaWRkZW5fMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC50b2dnbGVTaG93SGlkZGVuKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJudW1Bbm5vdGF0aW9ucyIsIGN0eC5udW1Bbm5vdGF0aW9ucykoImV4cGFuZGVkIiwgY3R4LmV4cGFuZGVkKSgic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoMSwgNiwgY3R4LnNlbGVjdGVkQW5ub3RhdGlvbnMkKSkoImFubm90YXRpb25zRXhwYW5kZWQiLCDJtcm1cGlwZUJpbmQxKDIsIDgsIGN0eC5hbm5vdGF0aW9uc0V4cGFuZGVkJCkpKCJzaG93Q291bnRzIiwgybXJtXBpcGVCaW5kMSgzLCAxMCwgY3R4LnNob3dDb3VudHMkKSkoInNob3dIaWRkZW4iLCDJtcm1cGlwZUJpbmQxKDQsIDEyLCBjdHguc2hvd0hpZGRlbiQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2Fubm90YXRpb25zX2xpc3QvbGVnZW5kL2xlZ2VuZF9lbGVtZW50L2xlZ2VuZF9lbGVtZW50X2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjb25zdCBfYzAkeiA9IFsiZ2x5cGgiXTsKICAgIGNsYXNzIExlZ2VuZEVsZW1lbnRDb21wb25lbnQgewogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdBZnRlclZpZXdJbml0KCkgewogICAgICAgICAgICB0aGlzLnN2ZyA9IHNlbGVjdCQxKHRoaXMuZ2x5cGhTVkcubmF0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIHRoaXMubWFpbkNvbnRhaW5lciA9IHRoaXMuc3ZnLmFwcGVuZCgnZycpOwogICAgICAgICAgICB0aGlzLmRyYXcoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYXcoKSB7CiAgICAgICAgICAgIGlmICh0aGlzLnNoYXBlID09ICdjaXJjbGUnKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1haW5Db250YWluZXIKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdjaXJjbGUnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5jb2xvcikKICAgICAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignY3gnLCA1KQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsIDUpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3InLCA1KTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNoYXBlID09ICdiYXInKSB7CiAgICAgICAgICAgICAgICB0aGlzLm1haW5Db250YWluZXIKICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsIHRoaXMuY29sb3IpCiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAwKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgMCkKICAgICAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCAxMCkKICAgICAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgMTApOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuc2hhcGUgPT0gJ3J1bkluZGljYXRvcicpIHsKICAgICAgICAgICAgICAgIHRoaXMubWFpbkNvbnRhaW5lcgogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2cnKQogICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3BhdGgnKQogICAgICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgdGhpcy5jb2xvcikKICAgICAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgJ2JsYWNrJykKICAgICAgICAgICAgICAgICAgICAuYXR0cignZCcsICdNIDIgMCBMIDEwIDAgTCA3IDUgTCAxMCAxMCBMIDIgMTAgWicpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgTGVnZW5kRWxlbWVudENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS1sZWdlbmQtZWxlbWVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2xlZ2VuZF9lbGVtZW50X2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9sZWdlbmRfZWxlbWVudF9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBMZWdlbmRFbGVtZW50Q29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHRleHQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvbG9yOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzaGFwZTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgZ2x5cGhTVkc6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydnbHlwaCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0sXSB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMZWdlbmRFbGVtZW50Q29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gTGVnZW5kRWxlbWVudENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMZWdlbmRFbGVtZW50Q29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIExlZ2VuZEVsZW1lbnRDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTGVnZW5kRWxlbWVudENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJucG1pLWxlZ2VuZC1lbGVtZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIExlZ2VuZEVsZW1lbnRDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJHosIHRydWUsIEVsZW1lbnRSZWYpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguZ2x5cGhTVkcgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgdGV4dDogInRleHQiLCBjb2xvcjogImNvbG9yIiwgc2hhcGU6ICJzaGFwZSIgfSwgZGVjbHM6IDQsIHZhcnM6IDEsIGNvbnN0czogW1sxLCAiZ2x5cGgiXSwgWyJnbHlwaCIsICIiXSwgWzEsICJsZWdlbmQtZWxlbWVudC10aXRsZSJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIExlZ2VuZEVsZW1lbnRDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInN2ZyIsIDAsIDEpOwogICAgICAgICAgICDJtcm1bmFtZXNwYWNlSFRNTCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDIsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtXRleHQoMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1dGV4dEludGVycG9sYXRlKGN0eC50ZXh0KTsKICAgICAgICB9IH0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVde2FsaWduLWl0ZW1zOmNlbnRlcjtkaXNwbGF5OmZsZXg7cGFkZGluZy1yaWdodDoxMHB4fS5sZWdlbmQtZWxlbWVudC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOi44ZW07cGFkZGluZy1sZWZ0OjVweH0uZ2x5cGhbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjEwcHg7aGVpZ2h0OjEwcHh9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9sZWdlbmQvbGVnZW5kX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBMZWdlbmRDb21wb25lbnQgewogICAgfQogICAgTGVnZW5kQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLWFubm90YXRpb25zLWxpc3QtbGVnZW5kJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vbGVnZW5kX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9sZWdlbmRfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIExlZ2VuZENvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIExlZ2VuZENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMZWdlbmRDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGVnZW5kQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IExlZ2VuZENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJucG1pLWFubm90YXRpb25zLWxpc3QtbGVnZW5kIl1dLCBkZWNsczogNCwgdmFyczogMCwgY29uc3RzOiBbWyJ0ZXh0IiwgInJ1biBpbmRpY2F0b3IiLCAiY29sb3IiLCAicmdiKDAsMCwwKSIsICJzaGFwZSIsICJydW5JbmRpY2F0b3IiXSwgWyJ0ZXh0IiwgInBvc2l0aXZlIGNvcnJlbGF0aW9uIiwgImNvbG9yIiwgInJnYigxMDksIDE3NCwgMjEzKSIsICJzaGFwZSIsICJiYXIiXSwgWyJ0ZXh0IiwgIm5lZ2F0aXZlIGNvcnJlbGF0aW9uIiwgImNvbG9yIiwgInJnYigyNDksIDEwNSwgNzYpIiwgInNoYXBlIiwgImJhciJdLCBbInRleHQiLCAic2FtcGxlIGNvdW50IiwgImNvbG9yIiwgInJnYigxNTEsIDE1MSwgMTUxKSIsICJzaGFwZSIsICJjaXJjbGUiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBMZWdlbmRDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJucG1pLWxlZ2VuZC1lbGVtZW50IiwgMCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDEsICJucG1pLWxlZ2VuZC1lbGVtZW50IiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDIsICJucG1pLWxlZ2VuZC1lbGVtZW50IiwgMik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDMsICJucG1pLWxlZ2VuZC1lbGVtZW50IiwgMyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTGVnZW5kRWxlbWVudENvbXBvbmVudF0sIHN0eWxlczogWyJbX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtwYWRkaW5nOjAgMTZweH0iXSB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9oZWFkZXIvaGVhZGVyX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBIZWFkZXJDb21wb25lbnRfZGl2XzNfbWF0X2ljb25fNF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICDJtcm1ZWxlbWVudCgwLCAibWF0LWljb24iLCA4KTsKICAgIH0gaWYgKHJmICYgMikgewogICAgICAgIGNvbnN0IGN0eF9yMiA9IMm1ybVuZXh0Q29udGV4dCgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoInN2Z0ljb24iLCBjdHhfcjIuc29ydC5vcmRlciA9PT0gY3R4X3IyLlNvcnRPcmRlci5ET1dOID8gImFycm93X2Rvd253YXJkXzI0cHgiIDogImFycm93X3Vwd2FyZF8yNHB4IikoIm5nQ2xhc3MiLCBjdHhfcjIuc29ydC5vcmRlciA9PT0gY3R4X3IyLlNvcnRPcmRlci5ET1dOID8gImRvd24taWNvbiIgOiAidXAtaWNvbiIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBIZWFkZXJDb21wb25lbnRfZGl2XzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgNCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgNSk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgyLCAiZGl2IiwgNik7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEhlYWRlckNvbXBvbmVudF9kaXZfM19UZW1wbGF0ZV9kaXZfY2xpY2tfMl9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yNCk7IGNvbnN0IG1ldHJpY19yMSA9IGN0eC4kaW1wbGljaXQ7IGNvbnN0IGN0eF9yMyA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3IzLm9uQ2hhbmdlU29ydC5lbWl0KG1ldHJpY19yMSk7IH0pOwogICAgICAgIMm1ybV0ZXh0KDMpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBIZWFkZXJDb21wb25lbnRfZGl2XzNfbWF0X2ljb25fNF9UZW1wbGF0ZSwgMSwgMiwgIm1hdC1pY29uIiwgNyk7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBtZXRyaWNfcjEgPSBjdHguJGltcGxpY2l0OwogICAgICAgIGNvbnN0IGN0eF9yMCA9IMm1ybVuZXh0Q29udGV4dCgpOwogICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4X3IwLnN0cmlwTWV0cmljKG1ldHJpY19yMSksICIgIik7CiAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgbWV0cmljX3IxID09PSBjdHhfcjAuc29ydC5tZXRyaWMpOwogICAgfSB9CiAgICBjbGFzcyBIZWFkZXJDb21wb25lbnQkMSB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMub25DaGFuZ2VTb3J0ID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLm9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkID0gbmV3IEV2ZW50RW1pdHRlcigpOwogICAgICAgICAgICB0aGlzLlNvcnRPcmRlciA9IFNvcnRPcmRlcjsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBtZXRyaWMKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHN0cmlwTWV0cmljKG1ldHJpYykgewogICAgICAgICAgICByZXR1cm4gc3RyaXBNZXRyaWNTdHJpbmcobWV0cmljKTsKICAgICAgICB9CiAgICB9CiAgICBIZWFkZXJDb21wb25lbnQkMS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnbnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlci1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9oZWFkZXJfY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2hlYWRlcl9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBIZWFkZXJDb21wb25lbnQkMS5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBudW1Bbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2VsZWN0ZWRBbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYWN0aXZlTWV0cmljczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc29ydDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgb25DaGFuZ2VTb3J0OiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgb25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJDb21wb25lbnQkMS7JtWZhYyA9IGZ1bmN0aW9uIEhlYWRlckNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBIZWFkZXJDb21wb25lbnQkMSkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJDb21wb25lbnQkMS7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBIZWFkZXJDb21wb25lbnQkMSwgc2VsZWN0b3JzOiBbWyJucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IG51bUFubm90YXRpb25zOiAibnVtQW5ub3RhdGlvbnMiLCBzZWxlY3RlZEFubm90YXRpb25zOiAic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIGFjdGl2ZU1ldHJpY3M6ICJhY3RpdmVNZXRyaWNzIiwgc29ydDogInNvcnQiIH0sIG91dHB1dHM6IHsgb25DaGFuZ2VTb3J0OiAib25DaGFuZ2VTb3J0Iiwgb25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQ6ICJvbkFsbEFubm90YXRpb25zVG9nZ2xlZCIgfSwgZGVjbHM6IDQsIHZhcnM6IDIsIGNvbnN0czogW1sxLCAidG9nZ2xlLWFsbC1jb250YWluZXIiXSwgWzMsICJjaGVja2VkIiwgImNoYW5nZSJdLCBbMSwgImFubm90YXRpb25zLWhlYWRlci1jb250YWluZXJzIl0sIFsiY2xhc3MiLCAiaGVhZGVyLWNvbHVtbiIsIDQsICJuZ0ZvciIsICJuZ0Zvck9mIl0sIFsxLCAiaGVhZGVyLWNvbHVtbiJdLCBbMSwgImhlYWRlci1jb250YWluZXIiXSwgWyJ0YWJpbmRleCIsICIwIiwgInJvbGUiLCAiYnV0dG9uIiwgInRpdGxlIiwgIkNoYW5nZSB0aGUgc29ydCBieSBjbGlja2luZyBhbnkgb2YgdGhlIG1ldHJpY3MuIiwgMSwgImhlYWRlci1jbGlja2FibGUiLCAzLCAiY2xpY2siXSwgWyJjbGFzcyIsICJzb3J0LWljb24iLCAzLCAic3ZnSWNvbiIsICJuZ0NsYXNzIiwgNCwgIm5nSWYiXSwgWzEsICJzb3J0LWljb24iLCAzLCAic3ZnSWNvbiIsICJuZ0NsYXNzIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gSGVhZGVyQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAibWF0LWNoZWNrYm94IiwgMSk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigiY2hhbmdlIiwgZnVuY3Rpb24gSGVhZGVyQ29tcG9uZW50X1RlbXBsYXRlX21hdF9jaGVja2JveF9jaGFuZ2VfMV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5vbkFsbEFubm90YXRpb25zVG9nZ2xlZC5lbWl0KCRldmVudC5jaGVja2VkKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImRpdiIsIDIpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMywgSGVhZGVyQ29tcG9uZW50X2Rpdl8zX1RlbXBsYXRlLCA1LCAyLCAiZGl2IiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoImNoZWNrZWQiLCBjdHguc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGggPT09IGN0eC5udW1Bbm5vdGF0aW9ucyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDIpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nRm9yT2YiLCBjdHguYWN0aXZlTWV0cmljcyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0Q2hlY2tib3gsIE5nRm9yT2YsIE5nSWYsIE1hdEljb24sIE5nQ2xhc3NdLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2JvcmRlci1ib3R0b206MnB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDoyOHB4O2FsaWduLWl0ZW1zOmZsZXgtZW5kO21hcmdpbi10b3A6OHB4fS5hbm5vdGF0aW9ucy1oZWFkZXItY29udGFpbmVyc1tfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZTouOWVtO2ZvbnQtd2VpZ2h0OjUwMDtmbGV4LWdyb3c6MX0uaGVhZGVyLWNvbHVtbltfbmdjb250ZW50LSVDT01QJV17ZmxleDoxIDF9LmhlYWRlci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6aW5saW5lLWJsb2NrfS5oZWFkZXItY2xpY2thYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjdXJzb3I6cG9pbnRlcjtkaXNwbGF5OmZsZXg7b3V0bGluZTpub25lfS50b2dnbGUtYWxsLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLWxlZnQ6MTBweDt3aWR0aDo5MHB4fS5zb3J0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxNnB4fSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2Fubm90YXRpb25zX2xpc3QvaGVhZGVyL2hlYWRlcl9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSGVhZGVyQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0U2VsZWN0ZWRBbm5vdGF0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuYW5ub3RhdGlvblNvcnQkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0QW5ub3RhdGlvblNvcnQpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IG5ld01ldHJpYwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgY2hhbmdlU29ydChuZXdNZXRyaWMpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pQ2hhbmdlQW5ub3RhdGlvblNvcnQoeyBtZXRyaWM6IG5ld01ldHJpYyB9KSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hlY2tlZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgYWxsQW5ub3RhdGlvbnNUb2dnbGVkKGNoZWNrZWQpIHsKICAgICAgICAgICAgaWYgKGNoZWNrZWQpIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaVNldFNlbGVjdGVkQW5ub3RhdGlvbnMoewogICAgICAgICAgICAgICAgICAgIGFubm90YXRpb25zOiBPYmplY3Qua2V5cyh0aGlzLmFubm90YXRpb25zKSwKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaVNldFNlbGVjdGVkQW5ub3RhdGlvbnMoeyBhbm5vdGF0aW9uczogW10gfSkpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQogICAgSGVhZGVyQ29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyJywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZTogYAogICAgPG5wbWktYW5ub3RhdGlvbnMtbGlzdC1oZWFkZXItY29tcG9uZW50CiAgICAgIFtudW1Bbm5vdGF0aW9uc109Im51bUFubm90YXRpb25zIgogICAgICBbc2VsZWN0ZWRBbm5vdGF0aW9uc109InNlbGVjdGVkQW5ub3RhdGlvbnMkIHwgYXN5bmMiCiAgICAgIFtzb3J0XT0iYW5ub3RhdGlvblNvcnQkIHwgYXN5bmMiCiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyIKICAgICAgKG9uQ2hhbmdlU29ydCk9ImNoYW5nZVNvcnQoJGV2ZW50KSIKICAgICAgKG9uQWxsQW5ub3RhdGlvbnNUb2dnbGVkKT0iYWxsQW5ub3RhdGlvbnNUb2dnbGVkKCRldmVudCkiCiAgICA+PC9ucG1pLWFubm90YXRpb25zLWxpc3QtaGVhZGVyLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBIZWFkZXJDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgSGVhZGVyQ29udGFpbmVyLnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIG51bUFubm90YXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYWN0aXZlTWV0cmljczogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSGVhZGVyQ29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gSGVhZGVyQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhlYWRlckNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEhlYWRlckNvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBIZWFkZXJDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlciJdXSwgaW5wdXRzOiB7IG51bUFubm90YXRpb25zOiAibnVtQW5ub3RhdGlvbnMiLCBhbm5vdGF0aW9uczogImFubm90YXRpb25zIiwgYWN0aXZlTWV0cmljczogImFjdGl2ZU1ldHJpY3MiIH0sIGRlY2xzOiAzLCB2YXJzOiA4LCBjb25zdHM6IFtbMywgIm51bUFubm90YXRpb25zIiwgInNlbGVjdGVkQW5ub3RhdGlvbnMiLCAic29ydCIsICJhY3RpdmVNZXRyaWNzIiwgIm9uQ2hhbmdlU29ydCIsICJvbkFsbEFubm90YXRpb25zVG9nZ2xlZCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEhlYWRlckNvbnRhaW5lcl9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlci1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJvbkNoYW5nZVNvcnQiLCBmdW5jdGlvbiBIZWFkZXJDb250YWluZXJfVGVtcGxhdGVfbnBtaV9hbm5vdGF0aW9uc19saXN0X2hlYWRlcl9jb21wb25lbnRfb25DaGFuZ2VTb3J0XzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHguY2hhbmdlU29ydCgkZXZlbnQpOyB9KSgib25BbGxBbm5vdGF0aW9uc1RvZ2dsZWQiLCBmdW5jdGlvbiBIZWFkZXJDb250YWluZXJfVGVtcGxhdGVfbnBtaV9hbm5vdGF0aW9uc19saXN0X2hlYWRlcl9jb21wb25lbnRfb25BbGxBbm5vdGF0aW9uc1RvZ2dsZWRfMF9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5hbGxBbm5vdGF0aW9uc1RvZ2dsZWQoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJudW1Bbm5vdGF0aW9ucyIsIGN0eC5udW1Bbm5vdGF0aW9ucykoInNlbGVjdGVkQW5ub3RhdGlvbnMiLCDJtcm1cGlwZUJpbmQxKDEsIDQsIGN0eC5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJzb3J0IiwgybXJtXBpcGVCaW5kMSgyLCA2LCBjdHguYW5ub3RhdGlvblNvcnQkKSkoImFjdGl2ZU1ldHJpY3MiLCBjdHguYWN0aXZlTWV0cmljcyk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbSGVhZGVyQ29tcG9uZW50JDFdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9hbm5vdGF0aW9uL2Fubm90YXRpb25fY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IF9jMCRBID0gWyJjaGFydCJdOwogICAgY29uc3QgX2MxJGwgPSBbImhpbnRDbGlwIl07CiAgICBmdW5jdGlvbiBBbm5vdGF0aW9uQ29tcG9uZW50X21hdF9pY29uXzNfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1pY29uIiwgMTApOwogICAgfSB9CiAgICBmdW5jdGlvbiBBbm5vdGF0aW9uQ29tcG9uZW50X21hdF9pY29uXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1pY29uIiwgMTEpOwogICAgfSB9CiAgICBjbGFzcyBBbm5vdGF0aW9uQ29tcG9uZW50IHsKICAgICAgICBjb25zdHJ1Y3RvcigpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGZhbHNlOwogICAgICAgICAgICB0aGlzLndpZHRoID0gMTA7CiAgICAgICAgICAgIHRoaXMuY2hhcnRXaWR0aCA9IDEwOwogICAgICAgICAgICB0aGlzLmNoYXJ0SGVpZ2h0ID0gMTA7CiAgICAgICAgICAgIHRoaXMubWF4RG90UmFkaXVzID0gMTA7CiAgICAgICAgICAgIHRoaXMuY291bnREb3RPZmZzZXQgPSA3MDsKICAgICAgICAgICAgdGhpcy5jb3VudFRleHRQYWRkaW5nID0gMjsKICAgICAgICAgICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMCwgcmlnaHQ6IDAsIGJvdHRvbTogMCwgbGVmdDogMTAwIH07CiAgICAgICAgICAgIHRoaXMuc3Ryb2tlQ29sb3IgPSAnI2ZmZic7CiAgICAgICAgICAgIHRoaXMudGV4dENsYXNzID0gJ2RlZmF1bHQtdGV4dCc7CiAgICAgICAgICAgIHRoaXMucnVucyA9IFtdOwogICAgICAgICAgICB0aGlzLmNvbG9yU2NhbGUgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAnIzMzMzMzMycpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblJlc2l6ZShldmVudCkgewogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBydW5zQ29sb3JTY2FsZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtY29sb3Itc2NhbGUnKSkpKS5ydW5zQ29sb3JTY2FsZTsKICAgICAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gcnVuc0NvbG9yU2NhbGUgPyBydW5zQ29sb3JTY2FsZSA6IHRoaXMuY29sb3JTY2FsZTsKICAgICAgICAgICAgdGhpcy5zdmcgPSBzZWxlY3QkMSh0aGlzLmFubm90YXRpb25Db250YWluZXIubmF0aXZlRWxlbWVudCkuc2VsZWN0KCdzdmcnKTsKICAgICAgICAgICAgdGhpcy54U2NhbGUgPSBwb2ludCQxKCkucGFkZGluZygwKTsKICAgICAgICAgICAgdGhpcy55U2NhbGUgPSBwb2ludCQxKCkucGFkZGluZygwKTsKICAgICAgICAgICAgdGhpcy5zaXplU2NhbGUgPSBsaW5lYXIkMSgpLmRvbWFpbihbMC4wLCAxLjBdKTsKICAgICAgICAgICAgdGhpcy5jb3VudFNpemVTY2FsZSA9IGxpbmVhciQxKCkucmFuZ2UoWzIsIHRoaXMubWF4RG90UmFkaXVzXSk7CiAgICAgICAgICAgIHRoaXMubWFpbkNvbnRhaW5lciA9IHRoaXMuc3ZnCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5tYXJnaW4ubGVmdH0sICR7dGhpcy5tYXJnaW4udG9wfSlgKTsKICAgICAgICAgICAgdGhpcy5iYXJzR3JvdXAgPSB0aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCdnJyk7CiAgICAgICAgICAgIHRoaXMuY291bnREb3RzR3JvdXAgPSB0aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCdnJyk7CiAgICAgICAgICAgIHRoaXMudGV4dHNHcm91cCA9IHRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoJ2cnKTsKICAgICAgICAgICAgdGhpcy5jb3VudFRleHRzR3JvdXAgPSB0aGlzLm1haW5Db250YWluZXIuYXBwZW5kKCdnJyk7CiAgICAgICAgICAgIHRoaXMucnVuSGludEdyb3VwID0gdGhpcy5zdmcuYXBwZW5kKCdnJyk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICBpZiAodGhpcy5zdmcpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZHJhdygpIHsKICAgICAgICAgICAgdGhpcy5zZWxlY3RlZCA9IHRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyh0aGlzLmFubm90YXRpb24pOwogICAgICAgICAgICB0aGlzLnVwZGF0ZURpbWVuc2lvbnMoKTsKICAgICAgICAgICAgdGhpcy5zZXRUZXh0Q2xhc3MoKTsKICAgICAgICAgICAgdGhpcy51cGRhdGVBeGVzKCk7CiAgICAgICAgICAgIHRoaXMuZHJhdygpOwogICAgICAgIH0KICAgICAgICAvLyBJbml0aWFsaXppbmcvVXBkYXRpbmcgdGhlIHZpc3VhbGl6YXRpb24gcHJvcHMuCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURpbWVuc2lvbnMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVucyA9IG5ldyBTZXQoKTsKICAgICAgICAgICAgdGhpcy5kYXRhLmZvckVhY2goKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGVsZW1lbnQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChlbGVtZW50KSA9PiB7CiAgICAgICAgICAgICAgICBydW5zLmFkZChlbGVtZW50LnJ1bik7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgdGhpcy5ydW5zID0gWy4uLnJ1bnNdOwogICAgICAgICAgICAvLyBOZWVkcyB0byBiZSBudW1BY3RpdmVSdW5zICogcnVuSGVpZ2h0IGJlY2F1c2Ugb2YgY2RrLXZpcnR1YWwtY3JvbGwKICAgICAgICAgICAgdGhpcy5zdmcuc3R5bGUoJ2hlaWdodCcsIGAke3RoaXMubnVtQWN0aXZlUnVucyAqIHRoaXMucnVuSGVpZ2h0fXB4YCk7CiAgICAgICAgICAgIC8vIE5lZWRzIHRvIGJlIHJ1bnMubGVuZ3RoICogcnVuSGVpZ2h0IGFzIHRoaXMgaXMgdXNlZCBmb3IgeS1wb3Mgc2NhbGVzCiAgICAgICAgICAgIHRoaXMuY2hhcnRIZWlnaHQgPQogICAgICAgICAgICAgICAgdGhpcy5ydW5zLmxlbmd0aCAqIHRoaXMucnVuSGVpZ2h0IC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tOwogICAgICAgICAgICB0aGlzLndpZHRoID0gdGhpcy5hbm5vdGF0aW9uQ29udGFpbmVyLm5hdGl2ZUVsZW1lbnQuY2xpZW50V2lkdGggfHwgMTA7CiAgICAgICAgICAgIHRoaXMuY2hhcnRXaWR0aCA9IHRoaXMud2lkdGggLSB0aGlzLm1hcmdpbi5sZWZ0IC0gdGhpcy5tYXJnaW4ucmlnaHQ7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBzZXRUZXh0Q2xhc3MoKSB7CiAgICAgICAgICAgIHRoaXMudGV4dENsYXNzID0gJ2RlZmF1bHQtdGV4dCc7CiAgICAgICAgICAgIGlmICh0aGlzLmZsYWdnZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyh0aGlzLmFubm90YXRpb24pKSB7CiAgICAgICAgICAgICAgICB0aGlzLnRleHRDbGFzcyA9ICdmbGFnLXRleHQnOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXModGhpcy5hbm5vdGF0aW9uKSkgewogICAgICAgICAgICAgICAgdGhpcy50ZXh0Q2xhc3MgPSAnaGlkZGVuLXRleHQnOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB1cGRhdGVBeGVzKCkgewogICAgICAgICAgICB0aGlzLnhTY2FsZQogICAgICAgICAgICAgICAgLnJhbmdlUm91bmQoWwogICAgICAgICAgICAgICAgMCwKICAgICAgICAgICAgICAgIHRoaXMuY2hhcnRXaWR0aCAtIHRoaXMuY2hhcnRXaWR0aCAvIHRoaXMuYWN0aXZlTWV0cmljcy5sZW5ndGgsCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAuZG9tYWluKHRoaXMuYWN0aXZlTWV0cmljcy5tYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiBzdHJpcE1ldHJpY1N0cmluZyhkKSkpKTsKICAgICAgICAgICAgdGhpcy55U2NhbGUKICAgICAgICAgICAgICAgIC5yYW5nZVJvdW5kKFswLCB0aGlzLmNoYXJ0SGVpZ2h0IC0gdGhpcy5ydW5IZWlnaHRdKQogICAgICAgICAgICAgICAgLmRvbWFpbih0aGlzLnJ1bnMpOwogICAgICAgICAgICB0aGlzLnNpemVTY2FsZS5yYW5nZShbMCwgdGhpcy5jaGFydFdpZHRoIC8gdGhpcy5hY3RpdmVNZXRyaWNzLmxlbmd0aF0pOwogICAgICAgICAgICB0aGlzLmNvdW50U2l6ZVNjYWxlLmRvbWFpbihbMCwgdGhpcy5tYXhDb3VudF0pOwogICAgICAgIH0KICAgICAgICAvLyBEcmF3aW5nIFVJCiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYXcoKSB7CiAgICAgICAgICAgIHRoaXMuZHJhd1J1bkluZGljYXRvcnMoKTsKICAgICAgICAgICAgdGhpcy5kcmF3UnVuSGludFRleHRzKCk7CiAgICAgICAgICAgIHRoaXMuZHJhd0JhcnMoKTsKICAgICAgICAgICAgdGhpcy5kcmF3VGV4dHMoKTsKICAgICAgICAgICAgaWYgKHRoaXMuc2hvd0NvdW50cykgewogICAgICAgICAgICAgICAgdGhpcy5kcmF3Q291bnREb3RzKCk7CiAgICAgICAgICAgICAgICB0aGlzLmRyYXdDb3VudFRleHRzKCk7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICB0aGlzLmNvdW50RG90c0dyb3VwLnNlbGVjdEFsbCgnLmNvdW50LWRvdCcpLnJlbW92ZSgpOwogICAgICAgICAgICAgICAgdGhpcy5jb3VudFRleHRzR3JvdXAuc2VsZWN0QWxsKCcuY291bnQtYmFja2dyb3VuZC10ZXh0JykucmVtb3ZlKCk7CiAgICAgICAgICAgICAgICB0aGlzLmNvdW50VGV4dHNHcm91cC5zZWxlY3RBbGwoJy5jb3VudC10ZXh0JykucmVtb3ZlKCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYXdSdW5JbmRpY2F0b3JzKCkgewogICAgICAgICAgICBzZWxlY3QkMSh0aGlzLmNsaXBQYXRoRWxlbWVudC5uYXRpdmVFbGVtZW50KQogICAgICAgICAgICAgICAgLnNlbGVjdCgncmVjdCcpCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCB0aGlzLm1hcmdpbi5sZWZ0IC0gMzApCiAgICAgICAgICAgICAgICAuYXR0cignaGVpZ2h0JywgdGhpcy5jaGFydEhlaWdodCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaW5kaWNhdG9ycyA9IHRoaXMucnVuSGludEdyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuaGludCcpCiAgICAgICAgICAgICAgICAuZGF0YSh0aGlzLnJ1bnMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGluZGljYXRvckVudGVycyA9IGluZGljYXRvcnMKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdoaW50Jyk7CiAgICAgICAgICAgIGluZGljYXRvckVudGVycwogICAgICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpCiAgICAgICAgICAgICAgICAuYXR0cignZCcsICdNIDAgMCBMIDE1IDAgTCAxMCAxMCBMIDE1IDIwIEwgMCAyMCBaJyk7CiAgICAgICAgICAgIGluZGljYXRvckVudGVycwogICAgICAgICAgICAgICAgLm1lcmdlKGluZGljYXRvcnMpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoMTAsICR7KC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueVNjYWxlKGQpKSkgKyA1fSlgOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5jb2xvclNjYWxlKGQpOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgaW5kaWNhdG9ycy5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3UnVuSGludFRleHRzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhpbnRUZXh0cyA9IHRoaXMucnVuSGludEdyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuaGludC10ZXh0JykKICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMucnVucyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgaGludFRleHRFbnRlcnMgPSBoaW50VGV4dHMKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgMjUpCiAgICAgICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgJzEwcHgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2FsaWdubWVudC1iYXNlbGluZScsICdtaWRkbGUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsaXAtcGF0aCcsICd1cmwoI2hpbnQtY2xpcCknKTsKICAgICAgICAgICAgaGludFRleHRFbnRlcnMKICAgICAgICAgICAgICAgIC5tZXJnZShoaW50VGV4dHMpCiAgICAgICAgICAgICAgICAuYXR0cigneScsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy55U2NhbGUoZCkpKSArIDE1OwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgYGhpbnQtdGV4dCAke3RoaXMudGV4dENsYXNzfWApCiAgICAgICAgICAgICAgICAudGV4dCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGQpID0+IGQpKTsKICAgICAgICAgICAgaGludFRleHRzLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYXdCYXJzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJhcnMgPSB0aGlzLmJhcnNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmJhcicpCiAgICAgICAgICAgICAgICAuZGF0YSh0aGlzLmRhdGEpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGJhckVudGVycyA9IGJhcnMKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdyZWN0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdjbGFzcycsICdiYXInKQogICAgICAgICAgICAgICAgLmF0dHIoJ2hlaWdodCcsIDIwKTsKICAgICAgICAgICAgYmFyRW50ZXJzCiAgICAgICAgICAgICAgICAubWVyZ2UoYmFycykKICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZC5uUE1JVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIGlmIChkLm5QTUlWYWx1ZSA+PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJsdWVzKGQublBNSVZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWRzKGQublBNSVZhbHVlICogLTEpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KSkKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLnhTY2FsZShkLm1ldHJpYykpKTsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLnlTY2FsZShkLnJ1bikpKSArIDU7CiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAuYXR0cignd2lkdGgnLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICBpZiAoZC5uUE1JVmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnNpemVTY2FsZShNYXRoLmFicyhkLm5QTUlWYWx1ZSkpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgYmFycy5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3Q291bnREb3RzKCkgewogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvdW50RG90cyA9IHRoaXMuY291bnREb3RzR3JvdXAKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy5jb3VudC1kb3QnKQogICAgICAgICAgICAgICAgLmRhdGEodGhpcy5kYXRhKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3VudERvdEVudGVycyA9IGNvdW50RG90cwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ2NpcmNsZScpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnY291bnQtZG90JykKICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnYmxhY2snKTsKICAgICAgICAgICAgY291bnREb3RFbnRlcnMKICAgICAgICAgICAgICAgIC5tZXJnZShjb3VudERvdHMpCiAgICAgICAgICAgICAgICAuYXR0cignZmlsbCcsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIGlmIChkLmNvdW50VmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gR3JleXMoZC5jb3VudFZhbHVlIC8gdGhpcy5tYXhDb3VudCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAuYXR0cignY3gnLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueFNjYWxlKGQubWV0cmljKSkpICsgdGhpcy5jb3VudERvdE9mZnNldDsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5hdHRyKCdjeScsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy55U2NhbGUoZC5ydW4pKSkgKyB0aGlzLnJ1bkhlaWdodCAvIDIuMDsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5hdHRyKCdyJywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgaWYgKGQuY291bnRWYWx1ZSA9PT0gbnVsbCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY291bnRTaXplU2NhbGUoZC5jb3VudFZhbHVlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIGNvdW50RG90cy5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3VGV4dHMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYmFja2dyb3VuZFRleHRzID0gdGhpcy50ZXh0c0dyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcubnBtaS1iYWNrZ3JvdW5kLXRleHQnKQogICAgICAgICAgICAgICAgLmRhdGEodGhpcy5kYXRhKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBiYWNrZ3JvdW5kVGV4dEVudGVycyA9IGJhY2tncm91bmRUZXh0cwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ25wbWktYmFja2dyb3VuZC10ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAzKQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcikKICAgICAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCAnMTNweCcpCiAgICAgICAgICAgICAgICAuYXR0cignYWxpZ25tZW50LWJhc2VsaW5lJywgJ21pZGRsZScpOwogICAgICAgICAgICBiYWNrZ3JvdW5kVGV4dEVudGVycwogICAgICAgICAgICAgICAgLm1lcmdlKGJhY2tncm91bmRUZXh0cykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLnhTY2FsZShkLm1ldHJpYykpKSArIDU7CiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAuYXR0cigneScsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy55U2NhbGUoZC5ydW4pKSkgKyB0aGlzLnJ1bkhlaWdodCAvIDIuMDsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC50ZXh0KCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZCkgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IHZhbHVlID0gZC5uUE1JVmFsdWUgPT09IG51bGwKICAgICAgICAgICAgICAgICAgICA/ICdudWxsJwogICAgICAgICAgICAgICAgICAgIDogTWF0aC5yb3VuZCgoZC5uUE1JVmFsdWUgKyBOdW1iZXIuRVBTSUxPTikgKiAxMDAwKSAvIDEwMDA7CiAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgYmFja2dyb3VuZFRleHRzLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCB0ZXh0cyA9IHRoaXMudGV4dHNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLm5wbWktdGV4dCcpCiAgICAgICAgICAgICAgICAuZGF0YSh0aGlzLmRhdGEpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IHRleHRFbnRlcnMgPSB0ZXh0cwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ25wbWktdGV4dCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgJzEzcHgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2FsaWdubWVudC1iYXNlbGluZScsICdtaWRkbGUnKTsKICAgICAgICAgICAgdGV4dEVudGVycwogICAgICAgICAgICAgICAgLm1lcmdlKHRleHRzKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueFNjYWxlKGQubWV0cmljKSkpICsgNTsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLnlTY2FsZShkLnJ1bikpKSArIHRoaXMucnVuSGVpZ2h0IC8gMi4wOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLnRleHQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgdmFsdWUgPSBkLm5QTUlWYWx1ZSA9PT0gbnVsbAogICAgICAgICAgICAgICAgICAgID8gJ251bGwnCiAgICAgICAgICAgICAgICAgICAgOiBNYXRoLnJvdW5kKChkLm5QTUlWYWx1ZSArIE51bWJlci5FUFNJTE9OKSAqIDEwMDApIC8gMTAwMDsKICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICB0ZXh0cy5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3Q291bnRUZXh0cygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3VudEJhY2tncm91bmRUZXh0cyA9IHRoaXMuY291bnRUZXh0c0dyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuY291bnQtYmFja2dyb3VuZC10ZXh0JykKICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuZGF0YSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY291bnRCYWNrZ3JvdW5kVGV4dEVudGVycyA9IGNvdW50QmFja2dyb3VuZFRleHRzCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnY291bnQtYmFja2dyb3VuZC10ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2Utd2lkdGgnLCAzKQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS1saW5lam9pbicsICdyb3VuZCcpCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgdGhpcy5zdHJva2VDb2xvcikKICAgICAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCAnMTBweCcpCiAgICAgICAgICAgICAgICAuYXR0cignYWxpZ25tZW50LWJhc2VsaW5lJywgJ21pZGRsZScpOwogICAgICAgICAgICBjb3VudEJhY2tncm91bmRUZXh0RW50ZXJzCiAgICAgICAgICAgICAgICAubWVyZ2UoY291bnRCYWNrZ3JvdW5kVGV4dHMpCiAgICAgICAgICAgICAgICAuYXR0cigneCcsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiAoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueFNjYWxlKGQubWV0cmljKSkpICsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50RG90T2Zmc2V0ICsKICAgICAgICAgICAgICAgICAgICB0aGlzLmNvdW50VGV4dFBhZGRpbmcgKwogICAgICAgICAgICAgICAgICAgIHRoaXMubWF4RG90UmFkaXVzKTsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5hdHRyKCd5JywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovICh0aGlzLnlTY2FsZShkLnJ1bikpKSArIHRoaXMucnVuSGVpZ2h0IC8gMi4wOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLnRleHQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZC5jb3VudFZhbHVlID09PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICcnOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIEludGwuTnVtYmVyRm9ybWF0KCkuZm9ybWF0KGQuY291bnRWYWx1ZSk7CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgY291bnRCYWNrZ3JvdW5kVGV4dHMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvdW50VGV4dHMgPSB0aGlzLmNvdW50VGV4dHNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmNvdW50LXRleHQnKQogICAgICAgICAgICAgICAgLmRhdGEodGhpcy5kYXRhKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb3VudFRleHRFbnRlcnMgPSBjb3VudFRleHRzCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgndGV4dCcpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnY291bnQtdGV4dCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgJzEwcHgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2FsaWdubWVudC1iYXNlbGluZScsICdtaWRkbGUnKTsKICAgICAgICAgICAgY291bnRUZXh0RW50ZXJzCiAgICAgICAgICAgICAgICAubWVyZ2UoY291bnRUZXh0cykKICAgICAgICAgICAgICAgIC5hdHRyKCd4JywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuICgoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy54U2NhbGUoZC5tZXRyaWMpKSkgKwogICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnREb3RPZmZzZXQgKwogICAgICAgICAgICAgICAgICAgIHRoaXMuY291bnRUZXh0UGFkZGluZyArCiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXhEb3RSYWRpdXMpOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLmF0dHIoJ3knLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueVNjYWxlKGQucnVuKSkpICsgdGhpcy5ydW5IZWlnaHQgLyAyLjA7CiAgICAgICAgICAgIH0pLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAudGV4dCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGQpID0+IHsKICAgICAgICAgICAgICAgIGlmIChkLmNvdW50VmFsdWUgPT09IG51bGwpIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICByZXR1cm4gSW50bC5OdW1iZXJGb3JtYXQoKS5mb3JtYXQoZC5jb3VudFZhbHVlKTsKICAgICAgICAgICAgfSkpOwogICAgICAgICAgICBjb3VudFRleHRzLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICB9CiAgICBBbm5vdGF0aW9uQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdhbm5vdGF0aW9uLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL2Fubm90YXRpb25fY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL2Fubm90YXRpb25fY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgICAgIGVuY2Fwc3VsYXRpb246IFZpZXdFbmNhcHN1bGF0aW9uJDEuTm9uZSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIEFubm90YXRpb25Db21wb25lbnQucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbWF4Q291bnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNlbGVjdGVkQW5ub3RhdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGZsYWdnZWRBbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgaGlkZGVuQW5ub3RhdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFjdGl2ZU1ldHJpY3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bUFjdGl2ZVJ1bnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNob3dDb3VudHM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFubm90YXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHJ1bkhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2lkZWJhcldpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhbm5vdGF0aW9uQ29udGFpbmVyOiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnY2hhcnQnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0sCiAgICAgICAgY2xpcFBhdGhFbGVtZW50OiBbeyB0eXBlOiBWaWV3Q2hpbGQsIGFyZ3M6IFsnaGludENsaXAnLCB7IHN0YXRpYzogdHJ1ZSwgcmVhZDogRWxlbWVudFJlZiB9LF0gfV0sCiAgICAgICAgc2VsZWN0ZWQ6IFt7IHR5cGU6IEhvc3RCaW5kaW5nLCBhcmdzOiBbJ2NsYXNzLnNlbGVjdGVkLXJvdycsXSB9XSwKICAgICAgICBvblJlc2l6ZTogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ3dpbmRvdzpyZXNpemUnLF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbkNvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIEFubm90YXRpb25Db21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQW5ub3RhdGlvbkNvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbm5vdGF0aW9uQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IEFubm90YXRpb25Db21wb25lbnQsIHNlbGVjdG9yczogW1siYW5ub3RhdGlvbi1jb21wb25lbnQiXV0sIHZpZXdRdWVyeTogZnVuY3Rpb24gQW5ub3RhdGlvbkNvbXBvbmVudF9RdWVyeShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtXN0YXRpY1ZpZXdRdWVyeShfYzAkQSwgdHJ1ZSwgRWxlbWVudFJlZik7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MxJGwsIHRydWUsIEVsZW1lbnRSZWYpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguYW5ub3RhdGlvbkNvbnRhaW5lciA9IF90LmZpcnN0KTsKICAgICAgICAgICAgybXJtXF1ZXJ5UmVmcmVzaChfdCA9IMm1ybVsb2FkUXVlcnkoKSkgJiYgKGN0eC5jbGlwUGF0aEVsZW1lbnQgPSBfdC5maXJzdCk7CiAgICAgICAgfSB9LCBob3N0VmFyczogMiwgaG9zdEJpbmRpbmdzOiBmdW5jdGlvbiBBbm5vdGF0aW9uQ29tcG9uZW50X0hvc3RCaW5kaW5ncyhyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJyZXNpemUiLCBmdW5jdGlvbiBBbm5vdGF0aW9uQ29tcG9uZW50X3Jlc2l6ZV9Ib3N0QmluZGluZ0hhbmRsZXIoKSB7IHJldHVybiBjdHgub25SZXNpemUoKTsgfSwgZmFsc2UsIMm1ybVyZXNvbHZlV2luZG93KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtWNsYXNzUHJvcCgic2VsZWN0ZWQtcm93IiwgY3R4LnNlbGVjdGVkKTsKICAgICAgICB9IH0sIGlucHV0czogeyBkYXRhOiAiZGF0YSIsIG1heENvdW50OiAibWF4Q291bnQiLCBzZWxlY3RlZEFubm90YXRpb25zOiAic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIGZsYWdnZWRBbm5vdGF0aW9uczogImZsYWdnZWRBbm5vdGF0aW9ucyIsIGhpZGRlbkFubm90YXRpb25zOiAiaGlkZGVuQW5ub3RhdGlvbnMiLCBhY3RpdmVNZXRyaWNzOiAiYWN0aXZlTWV0cmljcyIsIG51bUFjdGl2ZVJ1bnM6ICJudW1BY3RpdmVSdW5zIiwgc2hvd0NvdW50czogInNob3dDb3VudHMiLCBhbm5vdGF0aW9uOiAiYW5ub3RhdGlvbiIsIHJ1bkhlaWdodDogInJ1bkhlaWdodCIsIHNpZGViYXJXaWR0aDogInNpZGViYXJXaWR0aCIgfSwgZmVhdHVyZXM6IFvJtcm1TmdPbkNoYW5nZXNGZWF0dXJlXSwgZGVjbHM6IDEyLCB2YXJzOiA4LCBjb25zdHM6IFtbMSwgImFubm90YXRpb24tdGl0bGUiXSwgWzEsICJhbm5vdGF0aW9uLWNoZWNrYm94IiwgMywgImNoZWNrZWQiLCAiY2xpY2siXSwgWyJjbGFzcyIsICJmbGFnZ2VkLWljb24iLCAic3ZnSWNvbiIsICJmbGFnXzI0cHgiLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImhpZGRlbi1pY29uIiwgInN2Z0ljb24iLCAidmlzaWJpbGl0eV9vZmZfMjRweCIsIDQsICJuZ0lmIl0sIFsxLCAiY2hhcnQtZGl2Il0sIFsiY2hhcnQiLCAiIl0sIFsxLCAiY2hhcnQtc3ZnIl0sIFsiaWQiLCAiaGludC1jbGlwIl0sIFsiaGludENsaXAiLCAiIl0sIFsieCIsICIwIiwgInkiLCAiMCJdLCBbInN2Z0ljb24iLCAiZmxhZ18yNHB4IiwgMSwgImZsYWdnZWQtaWNvbiJdLCBbInN2Z0ljb24iLCAidmlzaWJpbGl0eV9vZmZfMjRweCIsIDEsICJoaWRkZW4taWNvbiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEFubm90YXRpb25Db21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDApOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJtYXQtY2hlY2tib3giLCAxKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEFubm90YXRpb25Db21wb25lbnRfVGVtcGxhdGVfbWF0X2NoZWNrYm94X2NsaWNrXzFfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiAkZXZlbnQucHJldmVudERlZmF1bHQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZXh0KDIpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMywgQW5ub3RhdGlvbkNvbXBvbmVudF9tYXRfaWNvbl8zX1RlbXBsYXRlLCAxLCAwLCAibWF0LWljb24iLCAyKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIEFubm90YXRpb25Db21wb25lbnRfbWF0X2ljb25fNF9UZW1wbGF0ZSwgMSwgMCwgIm1hdC1pY29uIiwgMyk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNSwgImRpdiIsIDQsIDUpOwogICAgICAgICAgICDJtcm1bmFtZXNwYWNlU1ZHKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgInN2ZyIsIDYpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDgsICJkZWZzIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoOSwgImNsaXBQYXRoIiwgNywgOCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDExLCAicmVjdCIsIDkpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1Y2xhc3NQcm9wKCJmbGFnZ2VkLWFubm90YXRpb24iLCBjdHguZmxhZ2dlZEFubm90YXRpb25zLmluY2x1ZGVzKGN0eC5hbm5vdGF0aW9uKSkoImhpZGRlbi1hbm5vdGF0aW9uIiwgY3R4LmhpZGRlbkFubm90YXRpb25zLmluY2x1ZGVzKGN0eC5hbm5vdGF0aW9uKSAmJiAhY3R4LmZsYWdnZWRBbm5vdGF0aW9ucy5pbmNsdWRlcyhjdHguYW5ub3RhdGlvbikpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJjaGVja2VkIiwgY3R4LnNlbGVjdGVkQW5ub3RhdGlvbnMuaW5jbHVkZXMoY3R4LmFubm90YXRpb24pKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMSk7CiAgICAgICAgICAgIMm1ybV0ZXh0SW50ZXJwb2xhdGUxKCIgIiwgY3R4LmFubm90YXRpb24sICIgIik7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguZmxhZ2dlZEFubm90YXRpb25zLmluY2x1ZGVzKGN0eC5hbm5vdGF0aW9uKSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguaGlkZGVuQW5ub3RhdGlvbnMuaW5jbHVkZXMoY3R4LmFubm90YXRpb24pKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYXRDaGVja2JveCwgTmdJZiwgTWF0SWNvbl0sIHN0eWxlczogWyIubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZSAubWF0LWJhZGdlLWNvbnRlbnR7Zm9udC1zaXplOjI0cHh9Lm1hdC1oMSwubWF0LWhlYWRsaW5lLC5tYXQtdHlwb2dyYXBoeSBoMXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyLC5tYXQtdGl0bGUsLm1hdC10eXBvZ3JhcGh5IGgye2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDMsLm1hdC1zdWJoZWFkaW5nLTIsLm1hdC10eXBvZ3JhcGh5IGgze2ZvbnQ6NDAwIDE2cHgvMjhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDQsLm1hdC1zdWJoZWFkaW5nLTEsLm1hdC10eXBvZ3JhcGh5IGg0e2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDUsLm1hdC10eXBvZ3JhcGh5IGg1e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDYsLm1hdC10eXBvZ3JhcGh5IGg2e2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmcsLm1hdC1ib2R5LTJ7Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHksLm1hdC1ib2R5LTEsLm1hdC10eXBvZ3JhcGh5e2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5IHAsLm1hdC1ib2R5LTEgcCwubWF0LXR5cG9ncmFwaHkgcHttYXJnaW46MCAwIDEycHh9Lm1hdC1zbWFsbCwubWF0LWNhcHRpb257Zm9udDo0MDAgMTJweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWRpc3BsYXktNCwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTR7Zm9udDozMDAgMTEycHgvMTEycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDVlbTttYXJnaW46MCAwIDU2cHh9Lm1hdC1kaXNwbGF5LTMsLm1hdC10eXBvZ3JhcGh5IC5tYXQtZGlzcGxheS0ze2ZvbnQ6NDAwIDU2cHgvNTZweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMmVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMiwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTJ7Zm9udDo0MDAgNDVweC80OHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAwNWVtO21hcmdpbjowIDAgNjRweH0ubWF0LWRpc3BsYXktMSwubWF0LXR5cG9ncmFwaHkgLm1hdC1kaXNwbGF5LTF7Zm9udDo0MDAgMzRweC80MHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDY0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVye2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbiwubWF0LWZsYXQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmR7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxle2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyIC5tYXQtY2FyZC10aXRsZXtmb250LXNpemU6MjBweH0ubWF0LWNhcmQtc3VidGl0bGUsLm1hdC1jYXJkLWNvbnRlbnR7Zm9udC1zaXplOjE0cHh9Lm1hdC1jaGVja2JveHtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dCAubWF0LWNoZWNrYm94LWxhYmVse2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwe2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNoaXAgLm1hdC1jaGlwLXRyYWlsaW5nLWljb24ubWF0LWljb24sLm1hdC1jaGlwIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb257Zm9udC1zaXplOjE4cHh9Lm1hdC10YWJsZXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxse2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGwsLm1hdC1mb290ZXItY2VsbHtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFye2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FsZW5kYXItYm9keXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWwsLm1hdC1jYWxlbmRhci1wZXJpb2QtYnV0dG9ue2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlciB0aHtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGV7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnR7Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGR7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NDAwO2xpbmUtaGVpZ2h0OjEuMTI1O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGQtd3JhcHBlcntwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24sLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeCAubWF0LWljb257Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uLC5tYXQtZm9ybS1maWVsZC1zdWZmaXggLm1hdC1pY29uLWJ1dHRvbntoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeCAubWF0LWljb24tYnV0dG9uIC5tYXQtaWNvbiwubWF0LWZvcm0tZmllbGQtc3VmZml4IC5tYXQtaWNvbi1idXR0b24gLm1hdC1pY29ue2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeHtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjM0Mzc0ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzNDMzMzMzJX0ubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcnt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVye2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC13cmFwcGVye3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjQzNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyOmZvY3VzKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdOm5vdCg6bGFiZWwtc2hvd24pKy5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyIC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHt0b3A6MS4yODEyNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcnttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1pbnB1dC1zZXJ2ZXI6Zm9jdXMrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2w6LXdlYmtpdC1hdXRvZmlsbCsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjFlbSkgc2NhbGUoMC43NSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcltsYWJlbF06bm90KDpsYWJlbC1zaG93bikrLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXIgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwgLm1hdC1mb3JtLWZpZWxkLWxhYmVse3RvcDoxLjA5Mzc1ZW07bWFyZ2luLXRvcDotMC41ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLWluZml4e3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZSAubWF0LWZvcm0tZmllbGQtbGFiZWx7dG9wOjEuODQzNzVlbTttYXJnaW4tdG9wOi0wLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0IC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdCAubWF0LWlucHV0LXNlcnZlcjpmb2N1cysubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0IC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXTpub3QoOmxhYmVsLXNob3duKSsubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlciAubWF0LWZvcm0tZmllbGQtbGFiZWx7dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlciwubWF0LWdyaWQtdGlsZS1mb290ZXJ7Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyIC5tYXQtbGluZSwubWF0LWdyaWQtdGlsZS1mb290ZXIgLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXIgLm1hdC1saW5lOm50aC1jaGlsZChuKzIpLC5tYXQtZ3JpZC10aWxlLWZvb3RlciAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnR7bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtcGFnaW5hdG9yLC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS5tYXQtcmFkaW8tYnV0dG9ue2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0e2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJ7aGVpZ2h0OjEuMTI1ZW19Lm1hdC1zbGlkZS10b2dnbGUtY29udGVudHtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0e2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWwsLm1hdC1zdGVwcGVyLWhvcml6b250YWx7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVse2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXN0ZXAtc3ViLWxhYmVsLWVycm9ye2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3J7Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVke2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRhYi1ncm91cHtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1saW5re2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXIsLm1hdC10b29sYmFyIGgxLC5tYXQtdG9vbGJhciBoMiwubWF0LXRvb2xiYXIgaDMsLm1hdC10b29sYmFyIGg0LC5tYXQtdG9vbGJhciBoNSwubWF0LXRvb2xiYXIgaDZ7Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXB7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEwcHg7cGFkZGluZy10b3A6NnB4O3BhZGRpbmctYm90dG9tOjZweH0ubWF0LXRvb2x0aXAtaGFuZHNldHtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVte2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3QtaXRlbSAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbntmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LW9wdGlvbiAubWF0LWxpbmU6bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjE0cHh9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3QtaXRlbXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5le3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV0gLm1hdC1saXN0LWl0ZW0gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9ue2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LWxpc3Qtb3B0aW9uIC5tYXQtbGluZXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdIC5tYXQtbGlzdC1vcHRpb24gLm1hdC1saW5lOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXSAubWF0LXN1YmhlYWRlcntmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb257Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE2cHh9Lm1hdC1vcHRncm91cC1sYWJlbHtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFye2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntsaW5lLWhlaWdodDoxO2ZvbnQtZmFtaWx5OmluaGVyaXQ7Zm9udC1zaXplOmluaGVyaXQ7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdHJlZXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZSwubWF0LW5lc3RlZC10cmVlLW5vZGV7Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxle292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZTpub3QoOmVtcHR5KXt0cmFuc2Zvcm06dHJhbnNsYXRlWigwKX0ubWF0LXJpcHBsZS5tYXQtcmlwcGxlLXVuYm91bmRlZHtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnR7cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZSAubWF0LXJpcHBsZS1lbGVtZW50e2Rpc3BsYXk6bm9uZX0uY2RrLXZpc3VhbGx5LWhpZGRlbntib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lciwuY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVye3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyOmVtcHR5e2Rpc3BsYXk6bm9uZX0uY2RrLWdsb2JhbC1vdmVybGF5LXdyYXBwZXJ7ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3B7cG9zaXRpb246YWJzb2x1dGU7dG9wOjA7Ym90dG9tOjA7bGVmdDowO3JpZ2h0OjA7ei1pbmRleDoxMDAwO3BvaW50ZXItZXZlbnRzOmF1dG87LXdlYmtpdC10YXAtaGlnaGxpZ2h0LWNvbG9yOnRyYW5zcGFyZW50O3RyYW5zaXRpb246b3BhY2l0eSA0MDBtcyBjdWJpYy1iZXppZXIoMC4yNSwgMC44LCAwLjI1LCAxKTtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ3tvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcHtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjMyKX0uY2RrLW92ZXJsYXktdHJhbnNwYXJlbnQtYmFja2Ryb3AsLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmd7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1jb25uZWN0ZWQtcG9zaXRpb24tYm91bmRpbmctYm94e3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2t7cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0ey8qISovfUBrZXlmcmFtZXMgY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5key8qISovfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWQ6bm90KDotd2Via2l0LWF1dG9maWxsKXthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtZW5kIDBzIDFtc310ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemV7cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ3twYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94e3BhZGRpbmc6MnB4IDAgIWltcG9ydGFudDtib3gtc2l6aW5nOmNvbnRlbnQtYm94ICFpbXBvcnRhbnQ7aGVpZ2h0OjAgIWltcG9ydGFudH0ubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb257Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbjpob3Zlcjpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpLC5tYXQtb3B0aW9uOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSk6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LW9wdGlvbi5tYXQtYWN0aXZle2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5IC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNTdjMDB9Lm1hdC1hY2NlbnQgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm4gLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOiM2MTYxNjF9Lm1hdC1vcHRncm91cC1kaXNhYmxlZCAubWF0LW9wdGdyb3VwLWxhYmVse2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveHtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94OjphZnRlcntjb2xvcjojZmFmYWZhfS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wcmltYXJ5IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSwubWF0LWFjY2VudCAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtYWNjZW50IC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGV7YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLC5tYXQtd2FybiAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRle2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWQsLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVke2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejF7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mntib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoze2JveC1zaGFkb3c6MHB4IDNweCAzcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDNweCA0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejR7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejV7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZ7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo3e2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OHtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejl7Ym94LXNoYWRvdzowcHggNXB4IDZweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOXB4IDEycHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMHtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMntib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxM3tib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNHtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNXtib3gtc2hhZG93OjBweCA4cHggOXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNXB4IDIycHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAyOHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNntib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTd7Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4e2JveC1zaGFkb3c6MHB4IDlweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOHB4IDI4cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNHB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjB7Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMXtib3gtc2hhZG93OjBweCAxMHB4IDEzcHggLTZweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDIxcHggMzNweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOHB4IDQwcHggN3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejIye2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjN7Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNHtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hcHAtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJ7ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVse2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZDpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbCAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWQ6bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiMyMTIxMjF9Lm1hdC1iYWRnZS1jb250ZW50e2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmUgLm1hdC1iYWRnZS1jb250ZW50e291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1iYWRnZS13YXJuIC5tYXQtYmFkZ2UtY29udGVudHtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdle3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuIC5tYXQtYmFkZ2UtY29udGVudHtkaXNwbGF5Om5vbmV9Lm1hdC1iYWRnZS1kaXNhYmxlZCAubWF0LWJhZGdlLWNvbnRlbnR7YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50e3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkIC5tYXQtYmFkZ2UtY29udGVudCwubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGV7dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZle3RyYW5zZm9ybTpub25lfS5tYXQtYmFkZ2Utc21hbGwgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTZweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXIgLm1hdC1iYWRnZS1jb250ZW50e3JpZ2h0Oi0xNnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW0gLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjIycHg7aGVpZ2h0OjIycHg7bGluZS1oZWlnaHQ6MjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWJvdmUgLm1hdC1iYWRnZS1jb250ZW50e3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3cgLm1hdC1iYWRnZS1jb250ZW50e2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yMnB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDotMjJweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDotMTFweH1bZGlyPXJ0bF0gLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZSAubWF0LWJhZGdlLWNvbnRlbnR7bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTExcHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2UgLm1hdC1iYWRnZS1jb250ZW50e3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZSAubWF0LWJhZGdlLWNvbnRlbnR7dG9wOi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWJlbG93IC5tYXQtYmFkZ2UtY29udGVudHtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0yOHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlIC5tYXQtYmFkZ2UtY29udGVudHtsZWZ0Oi0xNHB4fVtkaXI9cnRsXSAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmUgLm1hdC1iYWRnZS1jb250ZW50e2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlciAubWF0LWJhZGdlLWNvbnRlbnR7cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyIC5tYXQtYmFkZ2UtY29udGVudHtyaWdodDphdXRvO2xlZnQ6LTE0cHh9Lm1hdC1ib3R0b20tc2hlZXQtY29udGFpbmVye2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLC5tYXQtaWNvbi1idXR0b24sLm1hdC1zdHJva2VkLWJ1dHRvbntjb2xvcjppbmhlcml0O2JhY2tncm91bmQ6dHJhbnNwYXJlbnR9Lm1hdC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5e2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudCwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQsLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm4sLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybiwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXSwubWF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnkgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm4gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uLm1hdC13YXJuIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXksLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybiAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheSwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5LC5tYXQtc3Ryb2tlZC1idXR0b25bZGlzYWJsZWRdIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXl7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtaWNvbi1idXR0b24gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXN0cm9rZWQtYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7b3BhY2l0eTouMTtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5e2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b24sLm1hdC1yYWlzZWQtYnV0dG9uLC5tYXQtZmFiLC5tYXQtbWluaS1mYWJ7Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1mYWIubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCwubWF0LWZhYi5tYXQtYWNjZW50LC5tYXQtbWluaS1mYWIubWF0LWFjY2VudHtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4sLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuLC5tYXQtZmFiLm1hdC13YXJuLC5tYXQtbWluaS1mYWIubWF0LXdhcm57Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnksLm1hdC1mYWIubWF0LXByaW1hcnksLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQsLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybiwubWF0LWZhYi5tYXQtd2FybiwubWF0LW1pbmktZmFiLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdLC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXSwubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF0sLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXSwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdLC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1mYWIubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LW1pbmktZmFiLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWZhYi5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtbWluaS1mYWIubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b246bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1mbGF0LWJ1dHRvbjpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWI6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksLm1hdC1taW5pLWZhYjpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZSwubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXB7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGV7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtYnV0dG9uLXRvZ2dsZSAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZHtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXSAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZCAubWF0LWJ1dHRvbi10b2dnbGUrLm1hdC1idXR0b24tdG9nZ2xle2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWwgLm1hdC1idXR0b24tdG9nZ2xlKy5tYXQtYnV0dG9uLXRvZ2dsZXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpub25lO2JvcmRlci10b3A6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJke2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVke2NvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmR7YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2Vke2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkLC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJke2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWNhcmQ6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxle2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya3tmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aHtzdHJva2U6I2ZhZmFmYSAhaW1wb3J0YW50fS5tYXQtY2hlY2tib3gtbWl4ZWRtYXJre2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnkgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kLC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtcHJpbWFyeSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50IC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZCwubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LWFjY2VudCAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2FybiAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC13YXJuIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZCAubWF0LWNoZWNrYm94LWJhY2tncm91bmQsLm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZSAubWF0LWNoZWNrYm94LWJhY2tncm91bmR7YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWQ6bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgLm1hdC1jaGVja2JveC1mcmFtZXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkIC5tYXQtY2hlY2tib3gtbGFiZWx7Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZDpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LWNoZWNrYm94OmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1jaGVja2JveDphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtY2hlY2tib3g6YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXB7YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwIC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6IzIxMjEyMTtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcDpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgLm1hdC1jaGlwLXJlbW92ZTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWR7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXA6OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnl7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJue2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2FybiAubWF0LWNoaXAtcmVtb3Zle2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtY2hpcC1yZW1vdmV7Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxle2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlIHRoZWFkLC5tYXQtdGFibGUgdGJvZHksLm1hdC10YWJsZSB0Zm9vdCxtYXQtaGVhZGVyLXJvdyxtYXQtcm93LG1hdC1mb290ZXItcm93LFttYXQtaGVhZGVyLXJvd10sW21hdC1yb3ddLFttYXQtZm9vdGVyLXJvd10sLm1hdC10YWJsZS1zdGlja3l7YmFja2dyb3VuZDppbmhlcml0fW1hdC1yb3csbWF0LWhlYWRlci1yb3csbWF0LWZvb3Rlci1yb3csdGgubWF0LWhlYWRlci1jZWxsLHRkLm1hdC1jZWxsLHRkLm1hdC1mb290ZXItY2VsbHtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxse2NvbG9yOiM2MTYxNjF9Lm1hdC1jZWxsLC5tYXQtZm9vdGVyLWNlbGx7Y29sb3I6IzIxMjEyMX0ubWF0LWNhbGVuZGFyLWFycm93e2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUsLm1hdC1kYXRlcGlja2VyLWNvbnRlbnQgLm1hdC1jYWxlbmRhci1uZXh0LWJ1dHRvbiwubWF0LWRhdGVwaWNrZXItY29udGVudCAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXI6OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnR7Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbDpub3QoLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkKTpob3Zlcj4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLC5jZGsta2V5Ym9hcmQtZm9jdXNlZCAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlPi5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnQ6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksLmNkay1wcm9ncmFtLWZvY3VzZWQgLm1hdC1jYWxlbmRhci1ib2R5LWFjdGl2ZT4ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50Om5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXk6bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjE4KX0ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudHtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50IC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZD4ubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudCAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm4gLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkPi5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2FybiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWR7Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaHtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmV7Y29sb3I6I2Y1N2MwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm57Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJ7Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGl2aWRlcntib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWx7Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbHtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbDpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd3tib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwubWF0LWV4cGFuc2lvbi1wYW5lbCAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLC5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXI6aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcjpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZXtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbiwubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3I6OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZSwubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXSAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb257Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50e2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnR7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZCAubWF0LWZvcm0tZmllbGQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2FybntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKSAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWQ6bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50IC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZDpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1pbmZpeDo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudCwubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtbGFiZWwgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcntjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUsLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWVycm9ye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5IC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeSAubWF0LWhpbnR7Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1zdGFuZGFyZC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5le2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsIC5tYXQtZm9ybS1maWVsZC1mbGV4e2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLWZsZXh7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbCAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtbGFiZWx7Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmU6OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNre2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2t7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkIC5tYXQtZm9ybS1maWVsZC1sYWJlbHtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWQgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmV7Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeXtjb2xvcjojZjU3YzAwfS5tYXQtaWNvbi5tYXQtYWNjZW50e2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJue2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QgLm1hdC1mb3JtLWZpZWxkLWluZml4OjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtaW5wdXQtZWxlbWVudDpkaXNhYmxlZCwubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiM3NTc1NzV9Lm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50OjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50OjotbW96LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWlucHV0LWVsZW1lbnQ6Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudDotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50IC5tYXQtaW5wdXQtZWxlbWVudHtjYXJldC1jb2xvcjojZmY5ODAwfS5tYXQtd2FybiAubWF0LWlucHV0LWVsZW1lbnQsLm1hdC1mb3JtLWZpZWxkLWludmFsaWQgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtaW52YWxpZCAubWF0LWZvcm0tZmllbGQtaW5maXg6OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2UgLm1hdC1saXN0LWl0ZW17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZSAubWF0LWxpc3Qtb3B0aW9ue2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2UgLm1hdC1zdWJoZWFkZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZHtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbjpob3ZlciwubWF0LWxpc3Qtb3B0aW9uOmZvY3VzLC5tYXQtbmF2LWxpc3QgLm1hdC1saXN0LWl0ZW06aG92ZXIsLm1hdC1uYXYtbGlzdCAubWF0LWxpc3QtaXRlbTpmb2N1cywubWF0LWFjdGlvbi1saXN0IC5tYXQtbGlzdC1pdGVtOmhvdmVyLC5tYXQtYWN0aW9uLWxpc3QgLm1hdC1saXN0LWl0ZW06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb24sLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246aG92ZXIsLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb246Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1tZW51LXBhbmVse2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW17YmFja2dyb3VuZDp0cmFuc3BhcmVudDtjb2xvcjojMjEyMTIxfS5tYXQtbWVudS1pdGVtW2Rpc2FibGVkXSwubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LW1lbnUtaXRlbSAubWF0LWljb24tbm8tY29sb3IsLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1tZW51LWl0ZW06aG92ZXI6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KFtkaXNhYmxlZF0pLC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdChbZGlzYWJsZWRdKSwubWF0LW1lbnUtaXRlbS1oaWdobGlnaHRlZDpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3J7YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yLC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZSAubWF0LXNlbGVjdC10cmlnZ2Vye2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3QsLm1hdC1wYWdpbmF0b3ItbGFzdHtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF0gLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50LC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1maXJzdCwubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXSAubWF0LXBhZ2luYXRvci1sYXN0e2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5ke2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50IC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudCAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZHtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm4gLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVye2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2FybiAubWF0LXByb2dyZXNzLWJhci1maWxsOjphZnRlcntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1wcm9ncmVzcy1zcGlubmVyIGNpcmNsZSwubWF0LXNwaW5uZXIgY2lyY2xle3N0cm9rZTojZjU3YzAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtYWNjZW50IGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LWFjY2VudCBjaXJjbGV7c3Ryb2tlOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC13YXJuIGNpcmNsZSwubWF0LXNwaW5uZXIubWF0LXdhcm4gY2lyY2xle3N0cm9rZTojZjQ0MzM2fS5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8taW5uZXItY2lyY2xlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnk6YWN0aXZlIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGV7Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudCAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50IC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQ6bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50OmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLW91dGVyLWNpcmNsZXtib3JkZXItY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLWlubmVyLWNpcmNsZSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2FybiAubWF0LXJhZGlvLXJpcHBsZSAubWF0LXJpcHBsZS1lbGVtZW50Om5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZCAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlLC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuOmFjdGl2ZSAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxle2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWQgLm1hdC1yYWRpby1vdXRlci1jaXJjbGUsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xle2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8tcmlwcGxlIC5tYXQtcmlwcGxlLWVsZW1lbnQsLm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkIC5tYXQtcmFkaW8taW5uZXItY2lyY2xle2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZCAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnR7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uIC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkIC5tYXQtc2VsZWN0LXZhbHVle2NvbG9yOiM3NTc1NzV9Lm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbHtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWw6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1zZWxlY3QtcGFuZWwgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5IC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXdhcm4gLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkIC5tYXQtc2VsZWN0LWFycm93e2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6Izc1NzU3NX0ubWF0LWRyYXdlci1jb250YWluZXJ7YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoe2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWRyYXdlcjpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5ke2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLXJpZ2h0Om5vbmV9W2Rpcj1ydGxdIC5tYXQtZHJhd2VyLXNpZGV7Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF0gLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZHtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd257YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC42KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWQgLm1hdC1zbGlkZS10b2dnbGUtYmFye2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZCAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZTpub3QoLm1hdC1jaGVja2VkKSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYntib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1wcmltYXJ5IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByaW1hcnkgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1hY2NlbnQgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYWNjZW50IC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHR7Y29sb3I6I2ZmZn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdHJhY2stZmlsbCwubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWIsLm1hdC13YXJuIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXdhcm4gLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dHtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmd7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXI6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZCwuY2RrLWZvY3VzZWQgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kLC5tYXQtc2xpZGVyLWRpc2FibGVkIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGwsLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWQ6aG92ZXIgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWUgLm1hdC1zbGlkZXItZm9jdXMtcmluZ3tiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nIC5tYXQtc2xpZGVyLXRodW1iLC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcgLm1hdC1zbGlkZXItdGh1bWItbGFiZWx7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC44Nyl9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVse2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgLm1hdC1zbGlkZXItdGh1bWIsLm1hdC1zbGlkZXItbWluLXZhbHVlOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAubWF0LXNsaWRlci10aHVtYntib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAubWF0LXNsaWRlci10aHVtYiwubWF0LXNsaWRlci1taW4tdmFsdWU6bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgLm1hdC1zbGlkZXItdGh1bWJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3MgLm1hdC1zbGlkZXItd3JhcHBlcjo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWwgLm1hdC1zbGlkZXItdGlja3N7YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KTtiYWNrZ3JvdW5kLWltYWdlOi1tb3otcmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCgwLjAwMDFkZWcsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc2xpZGVyLXZlcnRpY2FsIC5tYXQtc2xpZGVyLXRpY2tze2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWQsLm1hdC1zdGVwLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkLC5tYXQtc3RlcC1oZWFkZXI6aG92ZXJ7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9QG1lZGlhKGhvdmVyOiBub25lKXsubWF0LXN0ZXAtaGVhZGVyOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtbGFiZWwsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtb3B0aW9uYWx7Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29ue2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWQsLm1hdC1zdGVwLWhlYWRlciAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lLC5tYXQtc3RlcC1oZWFkZXIgLm1hdC1zdGVwLWljb24tc3RhdGUtZWRpdHtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9ye2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmV7Y29sb3I6IzIxMjEyMX0ubWF0LXN0ZXAtaGVhZGVyIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1lcnJvcntjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsLC5tYXQtc3RlcHBlci12ZXJ0aWNhbHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmU6OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjpiZWZvcmUsLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyOjphZnRlciwubWF0LXN0ZXBwZXItaG9yaXpvbnRhbC1saW5le2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3d7Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyLC5tYXQtdGFiLWhlYWRlcntib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLW5hdi1iYXIsLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyIC5tYXQtdGFiLWhlYWRlcntib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLWxpbmt7Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOiMyMTIxMjF9Lm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhcltjbGFzcyo9bWF0LWJhY2tncm91bmQtXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeSAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudCAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50IC5tYXQtaW5rLWJhcntiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC1pbmstYmFye2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2FybiAubWF0LWluay1iYXIsLm1hdC10YWItbmF2LWJhci5tYXQtd2FybiAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1pbmstYmFyLC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2FybiAubWF0LWluay1iYXJ7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rcywubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbntiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxpbmssLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5IC5tYXQtdGFiLWxhYmVsLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWR7Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnkgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeSAubWF0LXJpcHBsZS1lbGVtZW50e2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmtzLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXIsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGlua3MsLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItbGluaywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1saW5re2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWQsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZHtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnQgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9ue2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZCAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudCAubWF0LXJpcHBsZS1lbGVtZW50LC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50IC5tYXQtcmlwcGxlLWVsZW1lbnR7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xMil9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKSwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZDpub3QoLm1hdC10YWItZGlzYWJsZWQpLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWQ6bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3MsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rcywubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb257YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwsLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1saW5rLC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2FybiAubWF0LXRhYi1sYWJlbCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGlua3tjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVke2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbiwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbntib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb24sLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb257Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudCwubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm4gLm1hdC1yaXBwbGUtZWxlbWVudHtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJ7YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5e2JhY2tncm91bmQ6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtYWNjZW50e2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2FybntiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZSwubWF0LXRvb2xiYXIgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZSwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1yaXBwbGV7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1mb2N1c2VkIC5tYXQtZm9ybS1maWVsZC1sYWJlbCwubWF0LXRvb2xiYXIgLm1hdC1zZWxlY3QtdmFsdWUsLm1hdC10b29sYmFyIC5tYXQtc2VsZWN0LWFycm93LC5tYXQtdG9vbGJhciAubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQgLm1hdC1zZWxlY3QtYXJyb3d7Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXIgLm1hdC1pbnB1dC1lbGVtZW50e2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXB7YmFja2dyb3VuZDpyZ2JhKDk3LDk3LDk3LC45KX0ubWF0LXRyZWV7YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlLC5tYXQtbmVzdGVkLXRyZWUtbm9kZXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcntjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbntjb2xvcjojZmY5ODAwfTpob3N0e3BhZGRpbmctdG9wOjVweH0uYW5ub3RhdGlvbi10aXRsZXthbGlnbi1pdGVtczpjZW50ZXI7ZGlzcGxheTpmbGV4O2ZvbnQtc2l6ZToxM3B4O2hlaWdodDoyMHB4O3BhZGRpbmc6MCAxMHB4O3VzZXItc2VsZWN0Om5vbmV9LnNlbGVjdGVkLXJvd3tiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7ZGlzcGxheTpibG9ja30uZmxhZ2dlZC1hbm5vdGF0aW9ue2NvbG9yOiNmNTdjMDB9LmhpZGRlbi1hbm5vdGF0aW9ue2NvbG9yOiM3NTc1NzV9LmFubm90YXRpb24tY2hlY2tib3h7cGFkZGluZy1yaWdodDo1cHh9LmZsYWdnZWQtaWNvbnt0cmFuc2Zvcm06c2NhbGUoMC42KX0uaGlkZGVuLWljb257dHJhbnNmb3JtOnNjYWxlKDAuNil9LmNoYXJ0LWRpdntib3JkZXItYm90dG9tOjFweCBzb2xpZCAjZWJlYmVifS5jaGFydC1zdmd7d2lkdGg6MTAwJTt1c2VyLXNlbGVjdDpub25lfS5kZWZhdWx0LXRleHR7ZmlsbDojMDAwfS5mbGFnLXRleHR7ZmlsbDojZjU3YzAwfS5oaWRkZW4tdGV4dHtmaWxsOiM3NTc1NzV9XG4iXSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb24vYW5ub3RhdGlvbl9jb250YWluZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgQW5ub3RhdGlvbkNvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5mbGFnZ2VkQW5ub3RhdGlvbnMkID0gdGhpcy5zdG9yZS5zZWxlY3QoZ2V0RmxhZ2dlZEFubm90YXRpb25zKTsKICAgICAgICAgICAgdGhpcy5oaWRkZW5Bbm5vdGF0aW9ucyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRIaWRkZW5Bbm5vdGF0aW9ucyk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRTZWxlY3RlZEFubm90YXRpb25zKTsKICAgICAgICAgICAgdGhpcy5zaG93Q291bnRzJCA9IHRoaXMuc3RvcmUuc2VsZWN0KGdldFNob3dDb3VudHMpOwogICAgICAgICAgICB0aGlzLnNpZGViYXJXaWR0aCQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRTaWRlYmFyV2lkdGgpOwogICAgICAgIH0KICAgIH0KICAgIEFubm90YXRpb25Db250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktYW5ub3RhdGlvbicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxhbm5vdGF0aW9uLWNvbXBvbmVudAogICAgICBbZGF0YV09ImRhdGEiCiAgICAgIFttYXhDb3VudF09Im1heENvdW50IgogICAgICBbYWN0aXZlTWV0cmljc109ImFjdGl2ZU1ldHJpY3MiCiAgICAgIFtudW1BY3RpdmVSdW5zXT0ibnVtQWN0aXZlUnVucyIKICAgICAgW2Fubm90YXRpb25dPSJhbm5vdGF0aW9uIgogICAgICBbcnVuSGVpZ2h0XT0icnVuSGVpZ2h0IgogICAgICBbc2VsZWN0ZWRBbm5vdGF0aW9uc109InNlbGVjdGVkQW5ub3RhdGlvbnMkIHwgYXN5bmMiCiAgICAgIFtmbGFnZ2VkQW5ub3RhdGlvbnNdPSJmbGFnZ2VkQW5ub3RhdGlvbnMkIHwgYXN5bmMiCiAgICAgIFtoaWRkZW5Bbm5vdGF0aW9uc109ImhpZGRlbkFubm90YXRpb25zJCB8IGFzeW5jIgogICAgICBbc2hvd0NvdW50c109InNob3dDb3VudHMkIHwgYXN5bmMiCiAgICAgIFtzaWRlYmFyV2lkdGhdPSJzaWRlYmFyV2lkdGgkIHwgYXN5bmMiCiAgICA+PC9hbm5vdGF0aW9uLWNvbXBvbmVudD4KICBgLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBBbm5vdGF0aW9uQ29udGFpbmVyLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogU3RvcmUgfQogICAgXTsKICAgIEFubm90YXRpb25Db250YWluZXIucHJvcERlY29yYXRvcnMgPSB7CiAgICAgICAgZGF0YTogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbWF4Q291bnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFjdGl2ZU1ldHJpY3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG51bUFjdGl2ZVJ1bnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFubm90YXRpb246IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHJ1bkhlaWdodDogW3sgdHlwZTogSW5wdXQgfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbkNvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIEFubm90YXRpb25Db250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQW5ub3RhdGlvbkNvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25Db250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogQW5ub3RhdGlvbkNvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJucG1pLWFubm90YXRpb24iXV0sIGlucHV0czogeyBkYXRhOiAiZGF0YSIsIG1heENvdW50OiAibWF4Q291bnQiLCBhY3RpdmVNZXRyaWNzOiAiYWN0aXZlTWV0cmljcyIsIG51bUFjdGl2ZVJ1bnM6ICJudW1BY3RpdmVSdW5zIiwgYW5ub3RhdGlvbjogImFubm90YXRpb24iLCBydW5IZWlnaHQ6ICJydW5IZWlnaHQiIH0sIGRlY2xzOiA2LCB2YXJzOiAyMSwgY29uc3RzOiBbWzMsICJkYXRhIiwgIm1heENvdW50IiwgImFjdGl2ZU1ldHJpY3MiLCAibnVtQWN0aXZlUnVucyIsICJhbm5vdGF0aW9uIiwgInJ1bkhlaWdodCIsICJzZWxlY3RlZEFubm90YXRpb25zIiwgImZsYWdnZWRBbm5vdGF0aW9ucyIsICJoaWRkZW5Bbm5vdGF0aW9ucyIsICJzaG93Q291bnRzIiwgInNpZGViYXJXaWR0aCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIEFubm90YXRpb25Db250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJhbm5vdGF0aW9uLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDMsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg0LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNSwgImFzeW5jIik7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiZGF0YSIsIGN0eC5kYXRhKSgibWF4Q291bnQiLCBjdHgubWF4Q291bnQpKCJhY3RpdmVNZXRyaWNzIiwgY3R4LmFjdGl2ZU1ldHJpY3MpKCJudW1BY3RpdmVSdW5zIiwgY3R4Lm51bUFjdGl2ZVJ1bnMpKCJhbm5vdGF0aW9uIiwgY3R4LmFubm90YXRpb24pKCJydW5IZWlnaHQiLCBjdHgucnVuSGVpZ2h0KSgic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoMSwgMTEsIGN0eC5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJmbGFnZ2VkQW5ub3RhdGlvbnMiLCDJtcm1cGlwZUJpbmQxKDIsIDEzLCBjdHguZmxhZ2dlZEFubm90YXRpb25zJCkpKCJoaWRkZW5Bbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoMywgMTUsIGN0eC5oaWRkZW5Bbm5vdGF0aW9ucyQpKSgic2hvd0NvdW50cyIsIMm1ybVwaXBlQmluZDEoNCwgMTcsIGN0eC5zaG93Q291bnRzJCkpKCJzaWRlYmFyV2lkdGgiLCDJtcm1cGlwZUJpbmQxKDUsIDE5LCBjdHguc2lkZWJhcldpZHRoJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0Fubm90YXRpb25Db21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9hbm5vdGF0aW9uc19saXN0X2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RDb21wb25lbnRfbmdfY29udGFpbmVyXzFfbnBtaV9hbm5vdGF0aW9uXzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgY29uc3QgX3I0ID0gybXJtWdldEN1cnJlbnRWaWV3KCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAibnBtaS1hbm5vdGF0aW9uIiwgNSk7CiAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdENvbXBvbmVudF9uZ19jb250YWluZXJfMV9ucG1pX2Fubm90YXRpb25fNF9UZW1wbGF0ZV9ucG1pX2Fubm90YXRpb25fY2xpY2tfMF9saXN0ZW5lcigkZXZlbnQpIHsgybXJtXJlc3RvcmVWaWV3KF9yNCk7IGNvbnN0IGFubm90YXRpb25fcjIgPSBjdHguJGltcGxpY2l0OyBjb25zdCBjdHhfcjMgPSDJtcm1bmV4dENvbnRleHQoMik7IHJldHVybiBjdHhfcjMucm93Q2xpY2tlZCgkZXZlbnQsIGFubm90YXRpb25fcjIpOyB9KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgY29uc3QgYW5ub3RhdGlvbl9yMiA9IGN0eC4kaW1wbGljaXQ7CiAgICAgICAgY29uc3QgY3R4X3IxID0gybXJtW5leHRDb250ZXh0KDIpOwogICAgICAgIMm1ybVwcm9wZXJ0eSgiZGF0YSIsIGN0eF9yMS5hbm5vdGF0aW9uc1thbm5vdGF0aW9uX3IyXSkoImFjdGl2ZU1ldHJpY3MiLCBjdHhfcjEuYWN0aXZlTWV0cmljcykoIm51bUFjdGl2ZVJ1bnMiLCBjdHhfcjEubnVtQWN0aXZlUnVucykoIm1heENvdW50IiwgY3R4X3IxLm1heENvdW50KSgiYW5ub3RhdGlvbiIsIGFubm90YXRpb25fcjIpKCJydW5IZWlnaHQiLCBjdHhfcjEucnVuSGVpZ2h0KTsKICAgIH0gfQogICAgZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0Q29tcG9uZW50X25nX2NvbnRhaW5lcl8xX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyU3RhcnQoMCk7CiAgICAgICAgybXJtWVsZW1lbnQoMSwgIm5wbWktYW5ub3RhdGlvbnMtbGlzdC1sZWdlbmQiKTsKICAgICAgICDJtcm1ZWxlbWVudCgyLCAibnBtaS1hbm5vdGF0aW9ucy1saXN0LWhlYWRlciIsIDIpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMywgImNkay12aXJ0dWFsLXNjcm9sbC12aWV3cG9ydCIsIDMpOwogICAgICAgIMm1ybV0ZW1wbGF0ZSg0LCBBbm5vdGF0aW9uc0xpc3RDb21wb25lbnRfbmdfY29udGFpbmVyXzFfbnBtaV9hbm5vdGF0aW9uXzRfVGVtcGxhdGUsIDEsIDYsICJucG1pLWFubm90YXRpb24iLCA0KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50Q29udGFpbmVyRW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1YWR2YW5jZSgyKTsKICAgICAgICDJtcm1cHJvcGVydHkoImFubm90YXRpb25zIiwgY3R4X3IwLmFubm90YXRpb25zKSgibnVtQW5ub3RhdGlvbnMiLCBjdHhfcjAubnVtQW5ub3RhdGlvbnMpKCJhY3RpdmVNZXRyaWNzIiwgY3R4X3IwLmFjdGl2ZU1ldHJpY3MpOwogICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgIMm1ybVwcm9wZXJ0eUludGVycG9sYXRlKCJpdGVtU2l6ZSIsIGN0eF9yMC5udW1BY3RpdmVSdW5zICogY3R4X3IwLnJ1bkhlaWdodCArIDI1KTsKICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICDJtcm1cHJvcGVydHkoImNka1ZpcnR1YWxGb3JPZiIsIGN0eF9yMC5zb3J0ZWRBbm5vdGF0aW9ucyk7CiAgICB9IH0KICAgIGNsYXNzIEFubm90YXRpb25zTGlzdENvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMub25Sb3dDbGljayA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5ydW5IZWlnaHQgPSAzMDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBldmVudAogICAgICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcm93Q2xpY2tlZChldmVudCwgYW5ub3RhdGlvbikgewogICAgICAgICAgICAvLyBTaGlmdCBwcmVzc2VkLCBoYW5kbGUgbXVsdGlwbGUgYW5ub3RhdGlvbnMKICAgICAgICAgICAgaWYgKGV2ZW50LnNoaWZ0S2V5KSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBsZXQgYW5ub3RhdGlvbkluZGV4ID0gdGhpcy5zb3J0ZWRBbm5vdGF0aW9ucy5pbmRleE9mKGFubm90YXRpb24pOwogICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGggPT09IDApIHsKICAgICAgICAgICAgICAgICAgICB0aGlzLm9uUm93Q2xpY2suZW1pdCh0aGlzLnNvcnRlZEFubm90YXRpb25zLnNsaWNlKDAsIGFubm90YXRpb25JbmRleCArIDEpKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdEFubm90YXRpb24gPSB0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnNbdGhpcy5zZWxlY3RlZEFubm90YXRpb25zLmxlbmd0aCAtIDFdOwogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBsYXN0SW5kZXggPSB0aGlzLnNvcnRlZEFubm90YXRpb25zLmluZGV4T2YobGFzdEFubm90YXRpb24pOwogICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPCBhbm5vdGF0aW9uSW5kZXgpIHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrLmVtaXQodGhpcy5zb3J0ZWRBbm5vdGF0aW9ucy5zbGljZShsYXN0SW5kZXgsIGFubm90YXRpb25JbmRleCArIDEpKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Sb3dDbGljay5lbWl0KHRoaXMuc29ydGVkQW5ub3RhdGlvbnMuc2xpY2UoYW5ub3RhdGlvbkluZGV4LCBsYXN0SW5kZXggKyAxKSk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gTm8gc2hpZnQsIG9ubHkgb25lIGFubm90YXRpb24gY2xpY2tlZAogICAgICAgICAgICAgICAgdGhpcy5vblJvd0NsaWNrLmVtaXQoW2Fubm90YXRpb25dKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgIEFubm90YXRpb25zTGlzdENvbXBvbmVudC5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogQ29tcG9uZW50LCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yOiAnYW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9hbm5vdGF0aW9uc19saXN0X2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9hbm5vdGF0aW9uc19saXN0X2NvbXBvbmVudC5jc3MnXSwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIEFubm90YXRpb25zTGlzdENvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBhbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgYW5ub3RhdGlvbnNFeHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbnVtQW5ub3RhdGlvbnM6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGFubm90YXRpb25Tb3J0OiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBhY3RpdmVNZXRyaWNzOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBudW1BY3RpdmVSdW5zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzb3J0ZWRBbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2VsZWN0ZWRBbm5vdGF0aW9uczogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgbWF4Q291bnQ6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIG9uUm93Q2xpY2s6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbm5vdGF0aW9uc0xpc3RDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQW5ub3RhdGlvbnNMaXN0Q29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdENvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBBbm5vdGF0aW9uc0xpc3RDb21wb25lbnQsIHNlbGVjdG9yczogW1siYW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnQiXV0sIGlucHV0czogeyBhbm5vdGF0aW9uczogImFubm90YXRpb25zIiwgYW5ub3RhdGlvbnNFeHBhbmRlZDogImFubm90YXRpb25zRXhwYW5kZWQiLCBudW1Bbm5vdGF0aW9uczogIm51bUFubm90YXRpb25zIiwgYW5ub3RhdGlvblNvcnQ6ICJhbm5vdGF0aW9uU29ydCIsIGFjdGl2ZU1ldHJpY3M6ICJhY3RpdmVNZXRyaWNzIiwgbnVtQWN0aXZlUnVuczogIm51bUFjdGl2ZVJ1bnMiLCBzb3J0ZWRBbm5vdGF0aW9uczogInNvcnRlZEFubm90YXRpb25zIiwgc2VsZWN0ZWRBbm5vdGF0aW9uczogInNlbGVjdGVkQW5ub3RhdGlvbnMiLCBtYXhDb3VudDogIm1heENvdW50IiB9LCBvdXRwdXRzOiB7IG9uUm93Q2xpY2s6ICJvblJvd0NsaWNrIiB9LCBkZWNsczogMiwgdmFyczogMywgY29uc3RzOiBbWzMsICJudW1Bbm5vdGF0aW9ucyIsICJleHBhbmRlZCJdLCBbNCwgIm5nSWYiXSwgWzMsICJhbm5vdGF0aW9ucyIsICJudW1Bbm5vdGF0aW9ucyIsICJhY3RpdmVNZXRyaWNzIl0sIFsibWluQnVmZmVyUHgiLCAiMzAwIiwgIm1heEJ1ZmZlclB4IiwgIjYwMCIsIDEsICJhbm5vdGF0aW9uLXJvd3MiLCAzLCAiaXRlbVNpemUiXSwgWzMsICJkYXRhIiwgImFjdGl2ZU1ldHJpY3MiLCAibnVtQWN0aXZlUnVucyIsICJtYXhDb3VudCIsICJhbm5vdGF0aW9uIiwgInJ1bkhlaWdodCIsICJjbGljayIsIDQsICJjZGtWaXJ0dWFsRm9yIiwgImNka1ZpcnR1YWxGb3JPZiJdLCBbMywgImRhdGEiLCAiYWN0aXZlTWV0cmljcyIsICJudW1BY3RpdmVSdW5zIiwgIm1heENvdW50IiwgImFubm90YXRpb24iLCAicnVuSGVpZ2h0IiwgImNsaWNrIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0Q29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudCgwLCAibnBtaS1hbm5vdGF0aW9ucy1saXN0LXRvb2xiYXIiLCAwKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDEsIEFubm90YXRpb25zTGlzdENvbXBvbmVudF9uZ19jb250YWluZXJfMV9UZW1wbGF0ZSwgNSwgNSwgIm5nLWNvbnRhaW5lciIsIDEpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm51bUFubm90YXRpb25zIiwgY3R4Lm51bUFubm90YXRpb25zKSgiZXhwYW5kZWQiLCBjdHguYW5ub3RhdGlvbnNFeHBhbmRlZCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHguYW5ub3RhdGlvbnNFeHBhbmRlZCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lciwgTmdJZiwgTGVnZW5kQ29tcG9uZW50LCBIZWFkZXJDb250YWluZXIsIENka1ZpcnR1YWxTY3JvbGxWaWV3cG9ydCwgQ2RrRml4ZWRTaXplVmlydHVhbFNjcm9sbCwgQ2RrVmlydHVhbEZvck9mLCBBbm5vdGF0aW9uQ29udGFpbmVyXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9W19uZ2hvc3QtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OmNhbGMoMTAwJSAtIDJweCk7d2lkdGg6Y2FsYygxMDAlIC0gMnB4KX0uYW5ub3RhdGlvbi1yb3dzW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2ZsZXg6MSAxO292ZXJmbG93LXk6YXV0b30iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFubm90YXRpb25zTGlzdENvbnRhaW5lciB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBzdG9yZQogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKHN0b3JlKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUgPSBzdG9yZTsKICAgICAgICAgICAgdGhpcy5hbm5vdGF0aW9uc0V4cGFuZGVkJCA9IHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0QW5ub3RhdGlvbnNFeHBhbmRlZCkpOwogICAgICAgICAgICB0aGlzLmFjdGl2ZVJ1bnMkID0gdGhpcy5zdG9yZQogICAgICAgICAgICAgICAgLnBpcGUoc2VsZWN0KGdldEN1cnJlbnRSb3V0ZVJ1blNlbGVjdGlvbikpCiAgICAgICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1blNlbGVjdGlvbgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJ1blNlbGVjdGlvbikgPT4gewogICAgICAgICAgICAgICAgaWYgKCFydW5TZWxlY3Rpb24pCiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdOwogICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5LmZyb20ocnVuU2VsZWN0aW9uLmVudHJpZXMoKSkKICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuKSA9PiBydW5bMV0pKQogICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChydW4pID0+IHJ1blswXSkpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLm51bUFjdGl2ZVJ1bnMkID0gdGhpcy5hY3RpdmVSdW5zJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVucwogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJ1bnMpID0+IHJ1bnMubGVuZ3RoKSkpOwogICAgICAgICAgICB0aGlzLmFjdGl2ZU1ldHJpY3MkID0gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRSdW5Ub01ldHJpY3MpLAogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSdW5zJCwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY0ZpbHRlcnMpLAogICAgICAgICAgICBdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3J1blRvTWV0cmljcywgYWN0aXZlUnVucywgbWV0cmljRmlsdGVyc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBtZXRyaWNzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1biBvZiBhY3RpdmVSdW5zKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blRvTWV0cmljc1tydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MgPSBtZXRyaWNzLmNvbmNhdChydW5Ub01ldHJpY3NbcnVuXS5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4gbWV0cmljSXNOcG1pQW5kTm90RGlmZihrZXkpKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1ldHJpY3MgPSBbLi4ubmV3IFNldChbLi4uT2JqZWN0LmtleXMobWV0cmljRmlsdGVycyksIC4uLm1ldHJpY3NdKV07CiAgICAgICAgICAgICAgICByZXR1cm4gbWV0cmljczsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkID0gY29tYmluZUxhdGVzdChbCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRBbm5vdGF0aW9uRGF0YSksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRIaWRkZW5Bbm5vdGF0aW9ucyksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRTaG93SGlkZGVuQW5ub3RhdGlvbnMpLAogICAgICAgICAgICBdKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW2Fubm90YXRpb25EYXRhLCBoaWRkZW5Bbm5vdGF0aW9ucywgc2hvd0hpZGRlbkFubm90YXRpb25zXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHJlbW92ZUhpZGRlbkFubm90YXRpb25zKGFubm90YXRpb25EYXRhLCBoaWRkZW5Bbm5vdGF0aW9ucywgc2hvd0hpZGRlbkFubm90YXRpb25zKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEFubm90YXRpb25zJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy52aXNpYmxlQW5ub3RhdGlvbnMkLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0TWV0cmljQXJpdGhtZXRpYyksCiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLnNlbGVjdChnZXRNZXRyaWNGaWx0ZXJzKSwKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlUnVucyQsCiAgICAgICAgICAgICAgICB0aGlzLmFjdGl2ZU1ldHJpY3MkLAogICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5zZWxlY3QoZ2V0QW5ub3RhdGlvbnNSZWdleCksCiAgICAgICAgICAgIF0pCiAgICAgICAgICAgICAgICAucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFt2aXNpYmxlQW5ub3RhdGlvbnMsIG1ldHJpY0FyaXRobWV0aWMsIG1ldHJpY0ZpbHRlcnMsIGFjdGl2ZVJ1bnMsIGFjdGl2ZU1ldHJpY3MsIGFubm90YXRpb25zUmVnZXgsXSkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIGZpbHRlckFubm90YXRpb25zKHZpc2libGVBbm5vdGF0aW9ucywgYWN0aXZlUnVucywgbWV0cmljQXJpdGhtZXRpYywgbWV0cmljRmlsdGVycywgYWN0aXZlTWV0cmljcywgYW5ub3RhdGlvbnNSZWdleCk7CiAgICAgICAgICAgIH0pKSkKICAgICAgICAgICAgICAgIC5waXBlKHNoYXJlKCkpOwogICAgICAgICAgICB0aGlzLm51bUFubm90YXRpb25zJCA9IHRoaXMuZmlsdGVyZWRBbm5vdGF0aW9ucyQucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoYW5ub3RhdGlvbnMpID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBPYmplY3Qua2V5cyhhbm5vdGF0aW9ucykubGVuZ3RoOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnNvcnRlZEFubm90YXRpb25zJCA9IGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJlZEFubm90YXRpb25zJCwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUucGlwZShzZWxlY3QoZ2V0QW5ub3RhdGlvblNvcnQpKSwKICAgICAgICAgICAgXSkucGlwZShtYXAoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFthbm5vdGF0aW9ucywgc29ydF0pID0+IHsKICAgICAgICAgICAgICAgIHJldHVybiBzb3J0QW5ub3RhdGlvbnMoYW5ub3RhdGlvbnMsIHNvcnQpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnNlbGVjdGVkQW5ub3RhdGlvbnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRTZWxlY3RlZEFubm90YXRpb25zKSk7CiAgICAgICAgICAgIHRoaXMubWF4Q291bnQkID0gdGhpcy5maWx0ZXJlZEFubm90YXRpb25zJC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbnMKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhbm5vdGF0aW9ucykgPT4gewogICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgbGV0IG1heCA9IDA7CiAgICAgICAgICAgICAgICBPYmplY3QudmFsdWVzKGFubm90YXRpb25zKS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKGFubm90YXRpb24pID0+IHsKICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uLmZvckVhY2goKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gdmFsdWVzCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAodmFsdWVzKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZXMuY291bnRWYWx1ZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4ID0gTWF0aC5tYXgobWF4LCB2YWx1ZXMuY291bnRWYWx1ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICByZXR1cm4gbWF4OwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25zCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICByb3dDbGlja2VkKGFubm90YXRpb25zKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaVRvZ2dsZVNlbGVjdGVkQW5ub3RhdGlvbnMoeyBhbm5vdGF0aW9ucyB9KSk7CiAgICAgICAgfQogICAgfQogICAgQW5ub3RhdGlvbnNMaXN0Q29udGFpbmVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICducG1pLWFubm90YXRpb25zLWxpc3QnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8YW5ub3RhdGlvbnMtbGlzdC1jb21wb25lbnQKICAgICAgW2Fubm90YXRpb25zXT0iZmlsdGVyZWRBbm5vdGF0aW9ucyQgfCBhc3luYyIKICAgICAgW2Fubm90YXRpb25zRXhwYW5kZWRdPSJhbm5vdGF0aW9uc0V4cGFuZGVkJCB8IGFzeW5jIgogICAgICBbbnVtQW5ub3RhdGlvbnNdPSJudW1Bbm5vdGF0aW9ucyQgfCBhc3luYyIKICAgICAgW2FjdGl2ZU1ldHJpY3NdPSJhY3RpdmVNZXRyaWNzJCB8IGFzeW5jIgogICAgICBbbnVtQWN0aXZlUnVuc109Im51bUFjdGl2ZVJ1bnMkIHwgYXN5bmMiCiAgICAgIFtzb3J0ZWRBbm5vdGF0aW9uc109InNvcnRlZEFubm90YXRpb25zJCB8IGFzeW5jIgogICAgICBbc2VsZWN0ZWRBbm5vdGF0aW9uc109InNlbGVjdGVkQW5ub3RhdGlvbnMkIHwgYXN5bmMiCiAgICAgIFttYXhDb3VudF09Im1heENvdW50JCB8IGFzeW5jIgogICAgICAob25Sb3dDbGljayk9InJvd0NsaWNrZWQoJGV2ZW50KSIKICAgID48L2Fubm90YXRpb25zLWxpc3QtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIEFubm90YXRpb25zTGlzdENvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbnNMaXN0Q29udGFpbmVyLsm1ZmFjID0gZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0Q29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFubm90YXRpb25zTGlzdENvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdENvbnRhaW5lci7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBBbm5vdGF0aW9uc0xpc3RDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1hbm5vdGF0aW9ucy1saXN0Il1dLCBkZWNsczogOSwgdmFyczogMjQsIGNvbnN0czogW1szLCAiYW5ub3RhdGlvbnMiLCAiYW5ub3RhdGlvbnNFeHBhbmRlZCIsICJudW1Bbm5vdGF0aW9ucyIsICJhY3RpdmVNZXRyaWNzIiwgIm51bUFjdGl2ZVJ1bnMiLCAic29ydGVkQW5ub3RhdGlvbnMiLCAic2VsZWN0ZWRBbm5vdGF0aW9ucyIsICJtYXhDb3VudCIsICJvblJvd0NsaWNrIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gQW5ub3RhdGlvbnNMaXN0Q29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJhbm5vdGF0aW9ucy1saXN0LWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoIm9uUm93Q2xpY2siLCBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RDb250YWluZXJfVGVtcGxhdGVfYW5ub3RhdGlvbnNfbGlzdF9jb21wb25lbnRfb25Sb3dDbGlja18wX2xpc3RlbmVyKCRldmVudCkgeyByZXR1cm4gY3R4LnJvd0NsaWNrZWQoJGV2ZW50KTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDQsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg1LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoNiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDcsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSg4LCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJhbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoMSwgOCwgY3R4LmZpbHRlcmVkQW5ub3RhdGlvbnMkKSkoImFubm90YXRpb25zRXhwYW5kZWQiLCDJtcm1cGlwZUJpbmQxKDIsIDEwLCBjdHguYW5ub3RhdGlvbnNFeHBhbmRlZCQpKSgibnVtQW5ub3RhdGlvbnMiLCDJtcm1cGlwZUJpbmQxKDMsIDEyLCBjdHgubnVtQW5ub3RhdGlvbnMkKSkoImFjdGl2ZU1ldHJpY3MiLCDJtcm1cGlwZUJpbmQxKDQsIDE0LCBjdHguYWN0aXZlTWV0cmljcyQpKSgibnVtQWN0aXZlUnVucyIsIMm1ybVwaXBlQmluZDEoNSwgMTYsIGN0eC5udW1BY3RpdmVSdW5zJCkpKCJzb3J0ZWRBbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoNiwgMTgsIGN0eC5zb3J0ZWRBbm5vdGF0aW9ucyQpKSgic2VsZWN0ZWRBbm5vdGF0aW9ucyIsIMm1ybVwaXBlQmluZDEoNywgMjAsIGN0eC5zZWxlY3RlZEFubm90YXRpb25zJCkpKCJtYXhDb3VudCIsIMm1ybVwaXBlQmluZDEoOCwgMjIsIGN0eC5tYXhDb3VudCQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtBbm5vdGF0aW9uc0xpc3RDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdXRpbC9jb29yZGluYXRlX2RhdGEudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAcGFyYW0gez99IGFubm90YXRpb25EYXRhCiAgICAgKiBAcGFyYW0gez99IHNlbGVjdGVkQW5ub3RhdGlvbnMKICAgICAqIEBwYXJhbSB7P30gYWN0aXZlUnVucwogICAgICogQHBhcmFtIHs/fSBhY3RpdmVNZXRyaWNzCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiBjb252ZXJ0VG9Db29yZGluYXRlRGF0YShhbm5vdGF0aW9uRGF0YSwgc2VsZWN0ZWRBbm5vdGF0aW9ucywgYWN0aXZlUnVucywgYWN0aXZlTWV0cmljcykgewogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCByZXN1bHQgPSBbXTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgZXh0cmVtZVZhbHVlcyA9IHsgbWF4OiAtMS4wLCBtaW46IDEuMCB9OwogICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICBjb25zdCBhbGxSdW5zID0gbmV3IFNldChhY3RpdmVSdW5zKTsKICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgY29uc3QgYWxsTWV0cmljcyA9IG5ldyBTZXQoYWN0aXZlTWV0cmljcyk7CiAgICAgICAgaWYgKGFsbFJ1bnMuc2l6ZSA9PT0gMCB8fAogICAgICAgICAgICBhbGxNZXRyaWNzLnNpemUgPT09IDAgfHwKICAgICAgICAgICAgT2JqZWN0LmtleXMoYW5ub3RhdGlvbkRhdGEpLmxlbmd0aCA9PT0gMCkgewogICAgICAgICAgICByZXR1cm4geyBjb29yZGluYXRlczogW10sIGV4dHJlbWVzOiB7IG1pbjogLTEuMCwgbWF4OiAxLjAgfSB9OwogICAgICAgIH0KICAgICAgICBzZWxlY3RlZEFubm90YXRpb25zLmZvckVhY2goKC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYW5ub3RhdGlvbgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgKGFubm90YXRpb24pID0+IHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBkYXRhID0gYW5ub3RhdGlvbkRhdGFbYW5ub3RhdGlvbl07CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgcnVuUmVzdWx0ID0ge307CiAgICAgICAgICAgIGRhdGEuZm9yRWFjaCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZW50cnkKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChlbnRyeSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFhbGxSdW5zLmhhcyhlbnRyeS5ydW4pIHx8ICFhbGxNZXRyaWNzLmhhcyhlbnRyeS5tZXRyaWMpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaWYgKHJ1blJlc3VsdFtlbnRyeS5ydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgcnVuUmVzdWx0W2VudHJ5LnJ1bl0ucHVzaChlbnRyeSk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlIHsKICAgICAgICAgICAgICAgICAgICBydW5SZXN1bHRbZW50cnkucnVuXSA9IFtlbnRyeV07CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoZW50cnkublBNSVZhbHVlICE9PSBudWxsKSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmVtZVZhbHVlcy5tYXggPSBNYXRoLm1heChleHRyZW1lVmFsdWVzLm1heCwgZW50cnkublBNSVZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBleHRyZW1lVmFsdWVzLm1pbiA9IE1hdGgubWluKGV4dHJlbWVWYWx1ZXMubWluLCBlbnRyeS5uUE1JVmFsdWUpOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgZXh0cmVtZVZhbHVlcy5tYXggPSBNYXRoLm1heChleHRyZW1lVmFsdWVzLm1heCwgMCk7CiAgICAgICAgICAgICAgICAgICAgZXh0cmVtZVZhbHVlcy5taW4gPSBNYXRoLm1pbihleHRyZW1lVmFsdWVzLm1pbiwgMCk7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocnVuUmVzdWx0KSkgewogICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goewogICAgICAgICAgICAgICAgICAgIGFubm90YXRpb24sCiAgICAgICAgICAgICAgICAgICAgcnVuSWQ6IGtleSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6IHJ1blJlc3VsdFtrZXldLAogICAgICAgICAgICAgICAgfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9KSk7CiAgICAgICAgaWYgKGV4dHJlbWVWYWx1ZXMubWF4IDwgZXh0cmVtZVZhbHVlcy5taW4pIHsKICAgICAgICAgICAgZXh0cmVtZVZhbHVlcy5tYXggPSAxLjA7CiAgICAgICAgICAgIGV4dHJlbWVWYWx1ZXMubWluID0gLTEuMDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHsgY29vcmRpbmF0ZXM6IHJlc3VsdCwgZXh0cmVtZXM6IGV4dHJlbWVWYWx1ZXMgfTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3Mvc2VsZWN0ZWRfYW5ub3RhdGlvbnMvcGFyYWxsZWxfY29vcmRpbmF0ZXMvcGFyYWxsZWxfY29vcmRpbmF0ZXNfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNvbnN0IF9jMCRCID0gWyJjaGFydCJdOwogICAgY2xhc3MgUGFyYWxsZWxDb29yZGluYXRlc0NvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSAwOwogICAgICAgICAgICB0aGlzLmNoYXJ0V2lkdGggPSAwOwogICAgICAgICAgICB0aGlzLmhlaWdodCA9IDMwMDsKICAgICAgICAgICAgdGhpcy5tYXJnaW4gPSB7IHRvcDogMjAsIHJpZ2h0OiA0MCwgYm90dG9tOiAyMCwgbGVmdDogNDAgfTsKICAgICAgICAgICAgdGhpcy5jaGFydEhlaWdodCA9IHRoaXMuaGVpZ2h0IC0gdGhpcy5tYXJnaW4udG9wIC0gdGhpcy5tYXJnaW4uYm90dG9tOwogICAgICAgICAgICB0aGlzLmNvbG9yU2NhbGUgPSAoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiAnIzMzMzMzMycpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IGV2ZW50CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBvblJlc2l6ZShldmVudCkgewogICAgICAgICAgICB0aGlzLnJlZHJhdygpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG5nQWZ0ZXJWaWV3SW5pdCgpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBydW5zQ29sb3JTY2FsZSA9ICgoLyoqIEB0eXBlIHs/fSAqLyAoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgndGYtY29sb3Itc2NhbGUnKSkpKS5ydW5zQ29sb3JTY2FsZTsKICAgICAgICAgICAgdGhpcy5jb2xvclNjYWxlID0gcnVuc0NvbG9yU2NhbGUgPyBydW5zQ29sb3JTY2FsZSA6IHRoaXMuY29sb3JTY2FsZTsKICAgICAgICAgICAgdGhpcy5zdmcgPSBzZWxlY3QkMSh0aGlzLnN2Z0VsZW1lbnQubmF0aXZlRWxlbWVudCk7CiAgICAgICAgICAgIHRoaXMubWFpbkNvbnRhaW5lciA9IHRoaXMuc3ZnCiAgICAgICAgICAgICAgICAuYXBwZW5kKCdnJykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7dGhpcy5tYXJnaW4ubGVmdH0sICR7dGhpcy5tYXJnaW4udG9wfSlgKTsKICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlc0dyb3VwID0gdGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgnZycpOwogICAgICAgICAgICB0aGlzLmxhYmVsc0dyb3VwID0gdGhpcy5tYWluQ29udGFpbmVyLmFwcGVuZCgnZycpOwogICAgICAgICAgICB0aGlzLmF4aXNHcm91cCA9IHRoaXMubWFpbkNvbnRhaW5lci5hcHBlbmQoJ2cnKTsKICAgICAgICAgICAgdGhpcy54U2NhbGUgPSBwb2ludCQxKCkucGFkZGluZygwLjEpOwogICAgICAgICAgICB0aGlzLnlTY2FsZSA9IGxpbmVhciQxKCkucmFuZ2UoW3RoaXMuY2hhcnRIZWlnaHQsIDBdKTsKICAgICAgICAgICAgdGhpcy55QXhpcyA9IGF4aXNSaWdodCh0aGlzLnlTY2FsZSk7CiAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gY2hhbmdlcwogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgbmdPbkNoYW5nZXMoY2hhbmdlcykgewogICAgICAgICAgICBpZiAodGhpcy5zdmcpIHsKICAgICAgICAgICAgICAgIHRoaXMucmVkcmF3KCk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHJlZHJhdygpIHsKICAgICAgICAgICAgdGhpcy51cGRhdGVEaW1lbnNpb25zKCk7CiAgICAgICAgICAgIHRoaXMudXBkYXRlQXhlcygpOwogICAgICAgICAgICB0aGlzLmRyYXcoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZURpbWVuc2lvbnMoKSB7CiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnN2Z0VsZW1lbnQubmF0aXZlRWxlbWVudC5jbGllbnRXaWR0aCB8fCAxMDsKICAgICAgICAgICAgdGhpcy5jaGFydFdpZHRoID0gdGhpcy53aWR0aCAtIHRoaXMubWFyZ2luLmxlZnQgLSB0aGlzLm1hcmdpbi5yaWdodDsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIHVwZGF0ZUF4ZXMoKSB7CiAgICAgICAgICAgIHRoaXMueFNjYWxlLnJhbmdlUm91bmQoWzAsIHRoaXMuY2hhcnRXaWR0aF0pLmRvbWFpbih0aGlzLmFjdGl2ZU1ldHJpY3MpOwogICAgICAgICAgICB0aGlzLnlTY2FsZS5kb21haW4oWwogICAgICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlRGF0YS5leHRyZW1lcy5taW4sCiAgICAgICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGVEYXRhLmV4dHJlbWVzLm1heCwKICAgICAgICAgICAgXSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3KCkgewogICAgICAgICAgICB0aGlzLmRyYXdBeGVzKCk7CiAgICAgICAgICAgIHRoaXMuZHJhd0F4aXNMYWJlbHMoKTsKICAgICAgICAgICAgdGhpcy5kcmF3Q29vcmRpbmF0ZXMoKTsKICAgICAgICAgICAgdGhpcy5kcmF3TGFiZWxzKCk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBkcmF3QXhlcygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBheGVzID0gdGhpcy5heGlzR3JvdXAKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy5heGlzLXknKQogICAgICAgICAgICAgICAgLmRhdGEodGhpcy5hY3RpdmVNZXRyaWNzKTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBheGlzRW50ZXJzID0gYXhlcy5lbnRlcigpLmFwcGVuZCgnZycpLmF0dHIoJ2NsYXNzJywgJ2F4aXMteScpOwogICAgICAgICAgICBheGlzRW50ZXJzCiAgICAgICAgICAgICAgICAubWVyZ2UoYXhlcykKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgke3RoaXMueFNjYWxlKGQpfSwgMClgOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKQogICAgICAgICAgICAgICAgLmNhbGwoKC8qKiBAdHlwZSB7P30gKi8gKHRoaXMueUF4aXMpKSk7CiAgICAgICAgICAgIGF4ZXMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZHJhd0F4aXNMYWJlbHMoKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXhpc0JhY2tncm91bmRUZXh0cyA9IHRoaXMuYXhpc0dyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuYXhpcy1iZy10ZXh0JykKICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuYWN0aXZlTWV0cmljcyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXhpc0JhY2tncm91bmRUZXh0RW50ZXJzID0gYXhpc0JhY2tncm91bmRUZXh0cwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2F4aXMtYmctdGV4dCcpCiAgICAgICAgICAgICAgICAuYXR0cignZm9udC1zaXplJywgJzEzcHgnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsIDIpCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlLWxpbmVqb2luJywgJ3JvdW5kJykKICAgICAgICAgICAgICAgIC5hdHRyKCdzdHJva2UnLCAnd2hpdGUnKTsKICAgICAgICAgICAgYXhpc0JhY2tncm91bmRUZXh0RW50ZXJzCiAgICAgICAgICAgICAgICAubWVyZ2UoYXhpc0JhY2tncm91bmRUZXh0cykKICAgICAgICAgICAgICAgIC50ZXh0KCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoZCkgPT4gZCkpCiAgICAgICAgICAgICAgICAuYXR0cigndHJhbnNmb3JtJywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIGB0cmFuc2xhdGUoJHsoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy54U2NhbGUoZCkpKSAtIDV9LCAke3RoaXMueVNjYWxlKHRoaXMuY29vcmRpbmF0ZURhdGEuZXh0cmVtZXMubWluKX0pIHJvdGF0ZSgtOTApYDsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIGF4aXNCYWNrZ3JvdW5kVGV4dHMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGF4aXNUZXh0cyA9IHRoaXMuYXhpc0dyb3VwCiAgICAgICAgICAgICAgICAuc2VsZWN0QWxsKCcuYXhpcy10ZXh0JykKICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuYWN0aXZlTWV0cmljcyk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgYXhpc1RleHRFbnRlcnMgPSBheGlzVGV4dHMKICAgICAgICAgICAgICAgIC5lbnRlcigpCiAgICAgICAgICAgICAgICAuYXBwZW5kKCd0ZXh0JykKICAgICAgICAgICAgICAgIC5hdHRyKCdmb250LXNpemUnLCAnMTNweCcpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnYXhpcy10ZXh0Jyk7CiAgICAgICAgICAgIGF4aXNUZXh0RW50ZXJzCiAgICAgICAgICAgICAgICAubWVyZ2UoYXhpc1RleHRzKQogICAgICAgICAgICAgICAgLnRleHQoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChkKSA9PiBkKSkKICAgICAgICAgICAgICAgIC5hdHRyKCd0cmFuc2Zvcm0nLCAoLyoqCiAgICAgICAgICAgICAqIEB0aGlzIHs/fQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGQKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIGZ1bmN0aW9uIChkKSB7CiAgICAgICAgICAgICAgICByZXR1cm4gYHRyYW5zbGF0ZSgkeygvKiogQHR5cGUgez99ICovICh0aGlzLnhTY2FsZShkKSkpIC0gNX0sICR7dGhpcy55U2NhbGUodGhpcy5jb29yZGluYXRlRGF0YS5leHRyZW1lcy5taW4pfSkgcm90YXRlKC05MClgOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgYXhpc1RleHRzLmV4aXQoKS5yZW1vdmUoKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGRyYXdDb29yZGluYXRlcygpIHsKICAgICAgICAgICAgLy8gRHJhdyB0aGUgY29vcmRpbmF0ZSBwYXRocwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvb3JkcyA9IHRoaXMuY29vcmRpbmF0ZXNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmNvb3JkJykKICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuY29vcmRpbmF0ZURhdGEuY29vcmRpbmF0ZXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGNvb3JkRW50ZXJzID0gY29vcmRzCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnY29vcmQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2ZpbGwnLCAnbm9uZScpOwogICAgICAgICAgICBjb29yZEVudGVycwogICAgICAgICAgICAgICAgLm1lcmdlKGNvb3JkcykKICAgICAgICAgICAgICAgIC5hdHRyKCdkJywgdGhpcy5wYXRoLmJpbmQodGhpcykpCiAgICAgICAgICAgICAgICAuYXR0cignc3Ryb2tlJywgKC8qKgogICAgICAgICAgICAgKiBAdGhpcyB7P30KICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoZCkgewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29sb3JTY2FsZShkLnJ1bklkKTsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIGNvb3Jkcy5leGl0KCkucmVtb3ZlKCk7CiAgICAgICAgICAgIC8vIERyYXcgaW52aXNpYmxlIHBhdGhzIGZvciBhIGJyb2FkZXIgaG92ZXIgYXJlYQogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhpZGRlbkNvb3JkcyA9IHRoaXMuY29vcmRpbmF0ZXNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmhpZGRlbkNvb3JkJykKICAgICAgICAgICAgICAgIC5kYXRhKHRoaXMuY29vcmRpbmF0ZURhdGEuY29vcmRpbmF0ZXMpOwogICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgIGNvbnN0IGhpZGRlbkNvb3JkRW50ZXJzID0gaGlkZGVuQ29vcmRzCiAgICAgICAgICAgICAgICAuZW50ZXIoKQogICAgICAgICAgICAgICAgLmFwcGVuZCgncGF0aCcpCiAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnLCAnaGlkZGVuQ29vcmQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZS13aWR0aCcsICcxMHB4JykKICAgICAgICAgICAgICAgIC5hdHRyKCdmaWxsJywgJ25vbmUnKQogICAgICAgICAgICAgICAgLmF0dHIoJ3N0cm9rZScsICdyZ2JhKDAsIDAsIDAsIDAuMCknKQogICAgICAgICAgICAgICAgLm9uKCdtb3VzZW92ZXInLCB0aGlzLmhhbmRsZUNvb3JkaW5hdGVNb3VzZU92ZXIuYmluZCh0aGlzKSkKICAgICAgICAgICAgICAgIC5vbignbW91c2VvdXQnLCB0aGlzLmhhbmRsZUNvb3JkaW5hdGVNb3VzZU91dC5iaW5kKHRoaXMpKTsKICAgICAgICAgICAgaGlkZGVuQ29vcmRFbnRlcnMubWVyZ2UoaGlkZGVuQ29vcmRzKS5hdHRyKCdkJywgdGhpcy5wYXRoLmJpbmQodGhpcykpOwogICAgICAgICAgICBoaWRkZW5Db29yZHMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgcGF0aChkKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc29ydGVkID0gZC52YWx1ZXMuc29ydCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gYQogICAgICAgICAgICAgKiBAcGFyYW0gez99IGIKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChhLCBiKSA9PiB0aGlzLmFjdGl2ZU1ldHJpY3MuaW5kZXhPZihhLm1ldHJpYykgLQogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVNZXRyaWNzLmluZGV4T2YoYi5tZXRyaWMpKSk7CiAgICAgICAgICAgIHJldHVybiBsaW5lKCkoZC52YWx1ZXMubWFwKCgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKHApIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCB5UG9zID0gdGhpcy55U2NhbGUocC5uUE1JVmFsdWUpOwogICAgICAgICAgICAgICAgcmV0dXJuICgvKiogQHR5cGUgez99ICovIChbdGhpcy54U2NhbGUocC5tZXRyaWMpLCB5UG9zXSkpOwogICAgICAgICAgICB9KS5iaW5kKHRoaXMpKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICogQHBhcmFtIHs/fSBkCiAgICAgICAgICogQHBhcmFtIHs/fSBpCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVDb29yZGluYXRlTW91c2VPdmVyKGQsIGkpIHsKICAgICAgICAgICAgdGhpcy5sYWJlbHNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmNvb3JkaW5hdGUtbGFiZWwnKQogICAgICAgICAgICAgICAgLmZpbHRlcigoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30geAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKHgpIHsKICAgICAgICAgICAgICAgIHJldHVybiAhKHguYW5ub3RhdGlvbiA9PT0gZC5hbm5vdGF0aW9uKTsKICAgICAgICAgICAgfSkpCiAgICAgICAgICAgICAgICAuc3R5bGUoJ29wYWNpdHknLCAwLjEpOwogICAgICAgICAgICB0aGlzLmNvb3JkaW5hdGVzR3JvdXAKICAgICAgICAgICAgICAgIC5zZWxlY3RBbGwoJy5jb29yZCcpCiAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSB4CiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICBmdW5jdGlvbiAoeCkgewogICAgICAgICAgICAgICAgcmV0dXJuICEoeC5hbm5vdGF0aW9uID09PSBkLmFubm90YXRpb24pOwogICAgICAgICAgICB9KSkKICAgICAgICAgICAgICAgIC5zdHlsZSgnb3BhY2l0eScsIDAuMSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBoYW5kbGVDb29yZGluYXRlTW91c2VPdXQoKSB7CiAgICAgICAgICAgIHRoaXMubGFiZWxzR3JvdXAuc2VsZWN0QWxsKCcuY29vcmRpbmF0ZS1sYWJlbCcpLnN0eWxlKCdvcGFjaXR5JywgMS4wKTsKICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlc0dyb3VwLnNlbGVjdEFsbCgnLmNvb3JkJykuc3R5bGUoJ29wYWNpdHknLCAxLjApOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcHJpdmF0ZQogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgZHJhd0xhYmVscygpIHsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBpbnRlcnBvbGF0aW9uRmFjdG9yID0gMzAgLyB0aGlzLnhTY2FsZS5zdGVwKCk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMuY29vcmRpbmF0ZURhdGEuY29vcmRpbmF0ZXMubGVuZ3RoIDwgMzAKICAgICAgICAgICAgICAgID8gdGhpcy5jb29yZGluYXRlRGF0YS5jb29yZGluYXRlcwogICAgICAgICAgICAgICAgOiBbXTsKICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICBjb25zdCBjb29yZGluYXRlTGFiZWxzID0gdGhpcy5sYWJlbHNHcm91cAogICAgICAgICAgICAgICAgLnNlbGVjdEFsbCgnLmNvb3JkaW5hdGUtbGFiZWwnKQogICAgICAgICAgICAgICAgLmRhdGEoZGF0YSk7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3QgY29vcmRpbmF0ZUxhYmVsRW50ZXJzID0gY29vcmRpbmF0ZUxhYmVscwogICAgICAgICAgICAgICAgLmVudGVyKCkKICAgICAgICAgICAgICAgIC5hcHBlbmQoJ3RleHQnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2NsYXNzJywgJ2Nvb3JkaW5hdGUtbGFiZWwnKQogICAgICAgICAgICAgICAgLmF0dHIoJ2ZvbnQtc2l6ZScsICcxMHB4Jyk7CiAgICAgICAgICAgIGNvb3JkaW5hdGVMYWJlbEVudGVycwogICAgICAgICAgICAgICAgLm1lcmdlKGNvb3JkaW5hdGVMYWJlbHMpCiAgICAgICAgICAgICAgICAudGV4dCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIHJldHVybiBkLmFubm90YXRpb247CiAgICAgICAgICAgIH0pKQogICAgICAgICAgICAgICAgLmF0dHIoJ3gnLCAoLyoqIEB0eXBlIHs/fSAqLyAodGhpcy54U2NhbGUodGhpcy5hY3RpdmVNZXRyaWNzWzBdKSkpICsgMzApCiAgICAgICAgICAgICAgICAuYXR0cigneScsICgvKioKICAgICAgICAgICAgICogQHRoaXMgez99CiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgZnVuY3Rpb24gKGQpIHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IHkwID0gdGhpcy55U2NhbGUoZC52YWx1ZXNbMF0ublBNSVZhbHVlID8gZC52YWx1ZXNbMF0ublBNSVZhbHVlIDogMCk7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCB5MSA9IHRoaXMueVNjYWxlKGQudmFsdWVzWzFdLm5QTUlWYWx1ZSA/IGQudmFsdWVzWzFdLm5QTUlWYWx1ZSA6IDApOwogICAgICAgICAgICAgICAgcmV0dXJuICgxIC0gaW50ZXJwb2xhdGlvbkZhY3RvcikgKiB5MCArIGludGVycG9sYXRpb25GYWN0b3IgKiB5MTsKICAgICAgICAgICAgfSkuYmluZCh0aGlzKSk7CiAgICAgICAgICAgIGNvb3JkaW5hdGVMYWJlbHMuZXhpdCgpLnJlbW92ZSgpOwogICAgICAgIH0KICAgIH0KICAgIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ3BhcmFsbGVsLWNvb3JkaW5hdGVzLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL3BhcmFsbGVsX2Nvb3JkaW5hdGVzX2NvbXBvbmVudC5uZy5odG1sJywKICAgICAgICAgICAgICAgICAgICBzdHlsZVVybHM6IFsnLi9wYXJhbGxlbF9jb29yZGluYXRlc19jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBQYXJhbGxlbENvb3JkaW5hdGVzQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIGFjdGl2ZU1ldHJpY3M6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIGNvb3JkaW5hdGVEYXRhOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzaWRlYmFyV2lkdGg6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHN2Z0VsZW1lbnQ6IFt7IHR5cGU6IFZpZXdDaGlsZCwgYXJnczogWydjaGFydCcsIHsgc3RhdGljOiB0cnVlLCByZWFkOiBFbGVtZW50UmVmIH0sXSB9XSwKICAgICAgICBvblJlc2l6ZTogW3sgdHlwZTogSG9zdExpc3RlbmVyLCBhcmdzOiBbJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddLF0gfV0KICAgIH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFyYWxsZWxDb29yZGluYXRlc0NvbXBvbmVudC7JtWZhYyA9IGZ1bmN0aW9uIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb21wb25lbnRfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGFyYWxsZWxDb29yZGluYXRlc0NvbXBvbmVudCkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBQYXJhbGxlbENvb3JkaW5hdGVzQ29tcG9uZW50Lsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFBhcmFsbGVsQ29vcmRpbmF0ZXNDb21wb25lbnQsIHNlbGVjdG9yczogW1sicGFyYWxsZWwtY29vcmRpbmF0ZXMtY29tcG9uZW50Il1dLCB2aWV3UXVlcnk6IGZ1bmN0aW9uIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb21wb25lbnRfUXVlcnkocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVzdGF0aWNWaWV3UXVlcnkoX2MwJEIsIHRydWUsIEVsZW1lbnRSZWYpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICB2YXIgX3Q7CiAgICAgICAgICAgIMm1ybVxdWVyeVJlZnJlc2goX3QgPSDJtcm1bG9hZFF1ZXJ5KCkpICYmIChjdHguc3ZnRWxlbWVudCA9IF90LmZpcnN0KTsKICAgICAgICB9IH0sIGhvc3RCaW5kaW5nczogZnVuY3Rpb24gUGFyYWxsZWxDb29yZGluYXRlc0NvbXBvbmVudF9Ib3N0QmluZGluZ3MocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigicmVzaXplIiwgZnVuY3Rpb24gUGFyYWxsZWxDb29yZGluYXRlc0NvbXBvbmVudF9yZXNpemVfSG9zdEJpbmRpbmdIYW5kbGVyKCRldmVudCkgeyByZXR1cm4gY3R4Lm9uUmVzaXplKCRldmVudCk7IH0sIGZhbHNlLCDJtcm1cmVzb2x2ZVdpbmRvdyk7CiAgICAgICAgfSB9LCBpbnB1dHM6IHsgYWN0aXZlTWV0cmljczogImFjdGl2ZU1ldHJpY3MiLCBjb29yZGluYXRlRGF0YTogImNvb3JkaW5hdGVEYXRhIiwgc2lkZWJhcldpZHRoOiAic2lkZWJhcldpZHRoIiB9LCBmZWF0dXJlczogW8m1ybVOZ09uQ2hhbmdlc0ZlYXR1cmVdLCBkZWNsczogMiwgdmFyczogMCwgY29uc3RzOiBbWzEsICJwYy1jaGFydCJdLCBbImNoYXJ0IiwgIiJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb21wb25lbnRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVuYW1lc3BhY2VTVkcoKTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgInN2ZyIsIDAsIDEpOwogICAgICAgIH0gfSwgc3R5bGVzOiBbIi5wYy1jaGFydFtfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjMwMHB4O3dpZHRoOjEwMCV9Il0sIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3Mvc2VsZWN0ZWRfYW5ub3RhdGlvbnMvcGFyYWxsZWxfY29vcmRpbmF0ZXMvcGFyYWxsZWxfY29vcmRpbmF0ZXNfY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlUnVucyQgPSB0aGlzLnN0b3JlCiAgICAgICAgICAgICAgICAucGlwZShzZWxlY3QoZ2V0Q3VycmVudFJvdXRlUnVuU2VsZWN0aW9uKSkKICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gcnVuU2VsZWN0aW9uCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocnVuU2VsZWN0aW9uKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoIXJ1blNlbGVjdGlvbikKICAgICAgICAgICAgICAgICAgICByZXR1cm4gW107CiAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShydW5TZWxlY3Rpb24uZW50cmllcygpKQogICAgICAgICAgICAgICAgICAgIC5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW4KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChydW4pID0+IHJ1blsxXSkpCiAgICAgICAgICAgICAgICAgICAgLm1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHJ1bikgPT4gcnVuWzBdKSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIHRoaXMuYWN0aXZlTWV0cmljcyQgPSBjb21iaW5lTGF0ZXN0KHRoaXMuc3RvcmUuc2VsZWN0KGdldFJ1blRvTWV0cmljcyksIHRoaXMuYWN0aXZlUnVucyQsIHRoaXMuc3RvcmUuc2VsZWN0KGdldE1ldHJpY0ZpbHRlcnMpKS5waXBlKG1hcCgoLyoqCiAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoW3J1blRvTWV0cmljcywgYWN0aXZlUnVucywgbWV0cmljRmlsdGVyc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGxldCBtZXRyaWNzID0gW107CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1biBvZiBhY3RpdmVSdW5zKSB7CiAgICAgICAgICAgICAgICAgICAgaWYgKHJ1blRvTWV0cmljc1tydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3MgPSBtZXRyaWNzLmNvbmNhdChydW5Ub01ldHJpY3NbcnVuXS5maWx0ZXIoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IGtleQogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKGtleSkgPT4gbWV0cmljSXNOcG1pQW5kTm90RGlmZihrZXkpKSkpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIG1ldHJpY3MgPSBbLi4ubmV3IFNldChbLi4uT2JqZWN0LmtleXMobWV0cmljRmlsdGVycyksIC4uLm1ldHJpY3NdKV07CiAgICAgICAgICAgICAgICByZXR1cm4gbWV0cmljcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBtZXRyaWMKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChtZXRyaWMpID0+IHN0cmlwTWV0cmljU3RyaW5nKG1ldHJpYykpKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5jb29yZGluYXRlRGF0YSQgPSBjb21iaW5lTGF0ZXN0KFsKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldEFubm90YXRpb25EYXRhKSwKICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuc2VsZWN0KGdldFNlbGVjdGVkQW5ub3RhdGlvbnMpLAogICAgICAgICAgICAgICAgdGhpcy5hY3RpdmVSdW5zJCwKICAgICAgICAgICAgICAgIHRoaXMuYWN0aXZlTWV0cmljcyQsCiAgICAgICAgICAgIF0pLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbYW5ub3RhdGlvbkRhdGEsIHNlbGVjdGVkQW5ub3RhdGlvbnMsIHJ1bnMsIG1ldHJpY3NdKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gY29udmVydFRvQ29vcmRpbmF0ZURhdGEoYW5ub3RhdGlvbkRhdGEsIHNlbGVjdGVkQW5ub3RhdGlvbnMsIHJ1bnMsIG1ldHJpY3MpOwogICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB0aGlzLnNpZGViYXJXaWR0aCQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRTaWRlYmFyV2lkdGgpOwogICAgICAgIH0KICAgIH0KICAgIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktcGFyYWxsZWwtY29vcmRpbmF0ZXMnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8cGFyYWxsZWwtY29vcmRpbmF0ZXMtY29tcG9uZW50CiAgICAgIFthY3RpdmVNZXRyaWNzXT0iYWN0aXZlTWV0cmljcyQgfCBhc3luYyIKICAgICAgW2Nvb3JkaW5hdGVEYXRhXT0iY29vcmRpbmF0ZURhdGEkIHwgYXN5bmMiCiAgICAgIFtzaWRlYmFyV2lkdGhdPSJzaWRlYmFyV2lkdGgkIHwgYXN5bmMiCiAgICA+PC9wYXJhbGxlbC1jb29yZGluYXRlcy1jb21wb25lbnQ+CiAgYCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lci5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFN0b3JlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lci7JtWZhYyA9IGZ1bmN0aW9uIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb250YWluZXJfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lcikoybXJtWRpcmVjdGl2ZUluamVjdChTdG9yZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb250YWluZXIuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lciwgc2VsZWN0b3JzOiBbWyJucG1pLXBhcmFsbGVsLWNvb3JkaW5hdGVzIl1dLCBkZWNsczogNCwgdmFyczogOSwgY29uc3RzOiBbWzMsICJhY3RpdmVNZXRyaWNzIiwgImNvb3JkaW5hdGVEYXRhIiwgInNpZGViYXJXaWR0aCJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIFBhcmFsbGVsQ29vcmRpbmF0ZXNDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJwYXJhbGxlbC1jb29yZGluYXRlcy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtXBpcGUoMSwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVwaXBlKDIsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgzLCAiYXN5bmMiKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJhY3RpdmVNZXRyaWNzIiwgybXJtXBpcGVCaW5kMSgxLCAzLCBjdHguYWN0aXZlTWV0cmljcyQpKSgiY29vcmRpbmF0ZURhdGEiLCDJtcm1cGlwZUJpbmQxKDIsIDUsIGN0eC5jb29yZGluYXRlRGF0YSQpKSgic2lkZWJhcldpZHRoIiwgybXJtXBpcGVCaW5kMSgzLCA3LCBjdHguc2lkZWJhcldpZHRoJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1BhcmFsbGVsQ29vcmRpbmF0ZXNDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3Mvc2VsZWN0ZWRfYW5ub3RhdGlvbnMvc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIHZhciBJMThOXzAkYTsKICAgIGlmICh0eXBlb2YgbmdJMThuQ2xvc3VyZU1vZGUgIT09ICJ1bmRlZmluZWQiICYmIG5nSTE4bkNsb3N1cmVNb2RlKSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQGRlc2MgTGFiZWwgZm9yIGEgYnV0dG9uIHRoYXQgY2xlYXJzIHRoZSBhbm5vdGF0aW9uIHNlbGVjdGlvbi4KICAgICAgICAgKi8gCiAgICAgICAgY29uc3QgTVNHX0VYVEVSTkFMXzI0OTQ2NjA1MjAzNDEzMDg4MzAkJFRFTlNPUkJPQVJEX1dFQkFQUF9QTFVHSU5TX05QTUlfVklFV1NfU0VMRUNURURfQU5OT1RBVElPTlNfU0VMRUNURURfQU5OT1RBVElPTlNfQ09NUE9ORU5UX1RTXzEgPSBnb29nLmdldE1zZygiQ2xlYXIgQW5ub3RhdGlvbiBTZWxlY3Rpb24iKTsKICAgICAgICBJMThOXzAkYSA9IE1TR19FWFRFUk5BTF8yNDk0NjYwNTIwMzQxMzA4ODMwJCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX1NFTEVDVEVEX0FOTk9UQVRJT05TX1NFTEVDVEVEX0FOTk9UQVRJT05TX0NPTVBPTkVOVF9UU18xOwogICAgfQogICAgZWxzZSB7CiAgICAgICAgSTE4Tl8wJGEgPSAkbG9jYWxpemUgYDpMYWJlbCBmb3IgYSBidXR0b24gdGhhdCBjbGVhcnMgdGhlIGFubm90YXRpb24gc2VsZWN0aW9uLuKQnzJiNTIyODlmMmM0YjdmNWIxODJlZDIzYzkxNTQ3MjJlY2Q0NmEyZDTikJ8yNDk0NjYwNTIwMzQxMzA4ODMwOkNsZWFyIEFubm90YXRpb24gU2VsZWN0aW9uYDsKICAgIH0KICAgIGNvbnN0IF9jMiRoID0gWyJhcmlhLWxhYmVsIiwgSTE4Tl8wJGFdOwogICAgdmFyIEkxOE5fMyQ3OwogICAgaWYgKHR5cGVvZiBuZ0kxOG5DbG9zdXJlTW9kZSAhPT0gInVuZGVmaW5lZCIgJiYgbmdJMThuQ2xvc3VyZU1vZGUpIHsKICAgICAgICAvKioKICAgICAgICAgKiBAZGVzYyBMYWJlbCBmb3IgYSBidXR0b24gdGhhdCBleHBhbmRzIG9yIGhpZGVzIHNlbGVjdGVkIGFubm90YXRpb25zLgogICAgICAgICAqLyAKICAgICAgICBjb25zdCBNU0dfRVhURVJOQUxfNTY3MDc5Nzc4NDA3MDk1MjA5NSQkVEVOU09SQk9BUkRfV0VCQVBQX1BMVUdJTlNfTlBNSV9WSUVXU19TRUxFQ1RFRF9BTk5PVEFUSU9OU19TRUxFQ1RFRF9BTk5PVEFUSU9OU19DT01QT05FTlRfVFNfNCA9IGdvb2cuZ2V0TXNnKCJFeHBhbmQvSGlkZSBTZWxlY3RlZCBBbm5vdGF0aW9ucyIpOwogICAgICAgIEkxOE5fMyQ3ID0gTVNHX0VYVEVSTkFMXzU2NzA3OTc3ODQwNzA5NTIwOTUkJFRFTlNPUkJPQVJEX1dFQkFQUF9QTFVHSU5TX05QTUlfVklFV1NfU0VMRUNURURfQU5OT1RBVElPTlNfU0VMRUNURURfQU5OT1RBVElPTlNfQ09NUE9ORU5UX1RTXzQ7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzMkNyA9ICRsb2NhbGl6ZSBgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IGV4cGFuZHMgb3IgaGlkZXMgc2VsZWN0ZWQgYW5ub3RhdGlvbnMu4pCfOGY0YWQzMDVjMTllMzY1NWYzMTg5ZTNlMjY0ZTgzZmI3NmY3YmI5NeKQnzU2NzA3OTc3ODQwNzA5NTIwOTU6RXhwYW5kL0hpZGUgU2VsZWN0ZWQgQW5ub3RhdGlvbnNgOwogICAgfQogICAgY29uc3QgX2M1JDkgPSBbImFyaWEtbGFiZWwiLCBJMThOXzMkN107CiAgICBmdW5jdGlvbiBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50X21hdF9pY29uXzlfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1pY29uIiwgOSk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIFNlbGVjdGVkQW5ub3RhdGlvbnNDb21wb25lbnRfbmdfdGVtcGxhdGVfMTBfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm1hdC1pY29uIiwgMTApOwogICAgfSB9CiAgICBmdW5jdGlvbiBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50X25wbWlfcGFyYWxsZWxfY29vcmRpbmF0ZXNfMTJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm5wbWktcGFyYWxsZWwtY29vcmRpbmF0ZXMiKTsKICAgIH0gfQogICAgY2xhc3MgU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudCB7CiAgICAgICAgY29uc3RydWN0b3IoKSB7CiAgICAgICAgICAgIHRoaXMub25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMub25Ub2dnbGVFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICB9CiAgICBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnQnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlVXJsOiAnLi9zZWxlY3RlZF9hbm5vdGF0aW9uc19jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBwY0V4cGFuZGVkOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBzZWxlY3RlZEFubm90YXRpb25zOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICBvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9uczogW3sgdHlwZTogT3V0cHV0IH1dLAogICAgICAgIG9uVG9nZ2xlRXhwYW5kZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFNlbGVjdGVkQW5ub3RhdGlvbnNDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnQiXV0sIGlucHV0czogeyBwY0V4cGFuZGVkOiAicGNFeHBhbmRlZCIsIHNlbGVjdGVkQW5ub3RhdGlvbnM6ICJzZWxlY3RlZEFubm90YXRpb25zIiB9LCBvdXRwdXRzOiB7IG9uQ2xlYXJTZWxlY3RlZEFubm90YXRpb25zOiAib25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMiLCBvblRvZ2dsZUV4cGFuZGVkOiAib25Ub2dnbGVFeHBhbmRlZCIgfSwgZGVjbHM6IDEzLCB2YXJzOiA0LCBjb25zdHM6IFtbMSwgInBjLWNvbnRhaW5lciJdLCBbMSwgInBjLXRvb2xiYXIiXSwgWzEsICJwYy10aXRsZSJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAidGl0bGUiLCAiRGVzZWxlY3RzIGFsbCBzZWxlY3RlZCBhbm5vdGF0aW9ucy4iLCAxLCAiY2xlYXItYnV0dG9uIiwgMywgImRpc2FibGVkIiwgImNsaWNrIiwgNiwgImFyaWEtbGFiZWwiXSwgWyJzdmdJY29uIiwgImNsZWFyXzI0cHgiXSwgWyJtYXQtaWNvbi1idXR0b24iLCAiIiwgMSwgImV4cGFuZC1idXR0b24iLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbInN2Z0ljb24iLCAiZXhwYW5kX2xlc3NfMjRweCIsICJjbGFzcyIsICJleHBhbmQtbGVzcy1pY29uIiwgNCwgIm5nSWYiLCAibmdJZkVsc2UiXSwgWyJub3RFeHBhbmRlZCIsICIiXSwgWzQsICJuZ0lmIl0sIFsic3ZnSWNvbiIsICJleHBhbmRfbGVzc18yNHB4IiwgMSwgImV4cGFuZC1sZXNzLWljb24iXSwgWyJzdmdJY29uIiwgImV4cGFuZF9tb3JlXzI0cHgiLCAxLCAiZXhwYW5kLWljb24iXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJkaXYiLCAwKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMSk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMiwgImgzIiwgMik7CiAgICAgICAgICAgIMm1ybV0ZXh0KDMsICJTZWxlY3RlZCBBbm5vdGF0aW9ucyIpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDQsICJidXR0b24iLCAzKTsKICAgICAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDUsIF9jMiRoKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJjbGljayIsIGZ1bmN0aW9uIFNlbGVjdGVkQW5ub3RhdGlvbnNDb21wb25lbnRfVGVtcGxhdGVfYnV0dG9uX2NsaWNrXzRfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMuZW1pdCgpOyB9KTsKICAgICAgICAgICAgybXJtWVsZW1lbnQoNiwgIm1hdC1pY29uIiwgNCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50U3RhcnQoNywgImJ1dHRvbiIsIDUpOwogICAgICAgICAgICDJtcm1aTE4bkF0dHJpYnV0ZXMoOCwgX2M1JDkpOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudF9UZW1wbGF0ZV9idXR0b25fY2xpY2tfN19saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vblRvZ2dsZUV4cGFuZGVkLmVtaXQoKTsgfSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSg5LCBTZWxlY3RlZEFubm90YXRpb25zQ29tcG9uZW50X21hdF9pY29uXzlfVGVtcGxhdGUsIDEsIDAsICJtYXQtaWNvbiIsIDYpOwogICAgICAgICAgICDJtcm1dGVtcGxhdGUoMTAsIFNlbGVjdGVkQW5ub3RhdGlvbnNDb21wb25lbnRfbmdfdGVtcGxhdGVfMTBfVGVtcGxhdGUsIDEsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDcsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxMiwgU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudF9ucG1pX3BhcmFsbGVsX2Nvb3JkaW5hdGVzXzEyX1RlbXBsYXRlLCAxLCAwLCAibnBtaS1wYXJhbGxlbC1jb29yZGluYXRlcyIsIDgpOwogICAgICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIH0gaWYgKHJmICYgMikgewogICAgICAgICAgICBjb25zdCBfcjEgPSDJtcm1cmVmZXJlbmNlKDExKTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoNCk7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgiZGlzYWJsZWQiLCBjdHguc2VsZWN0ZWRBbm5vdGF0aW9ucy5sZW5ndGggPT09IDApOwogICAgICAgICAgICDJtcm1YWR2YW5jZSg1KTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LnBjRXhwYW5kZWQpKCJuZ0lmRWxzZSIsIF9yMSk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDMpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucGNFeHBhbmRlZCk7CiAgICAgICAgfSB9LCBkaXJlY3RpdmVzOiBbTWF0QnV0dG9uLCBNYXRJY29uLCBOZ0lmLCBQYXJhbGxlbENvb3JkaW5hdGVzQ29udGFpbmVyXSwgc3R5bGVzOiBbIi5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NjAwO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtYmFkZ2Utc21hbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6OXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweH0ubWF0LWgxW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1oZWFkbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMjRweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGl0bGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN1YmhlYWRpbmctMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTZweC8yOHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNXB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg1W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg1W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjgzKS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWg2W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGg2W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCBjYWxjKDE0cHggKiAwLjY3KS8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO21hcmdpbjowIDAgMTJweH0ubWF0LWJvZHktc3Ryb25nW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ib2R5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0gICBwW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVde21hcmdpbjowIDAgMTJweH0ubWF0LXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxMnB4LzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS00W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjMwMCAxMTJweC8xMTJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wNWVtO21hcmdpbjowIDAgNTZweH0ubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRpc3BsYXktM1tfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgNTZweC81NnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjAyZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0yW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA0NXB4LzQ4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDA1ZW07bWFyZ2luOjAgMCA2NHB4fS5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0xW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAzNHB4LzQwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgNjRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MjRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jYXJkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyMHB4fS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FyZC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNoZWNrYm94LWxheW91dFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtsaW5lLWhlaWdodDoyNHB4fS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtdHJhaWxpbmctaWNvbi5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MThweH0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1jYWxlbmRhcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYWxlbmRhci1ib2R5W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTNweH0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhbGVuZGFyLXBlcmlvZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICB0aFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjExcHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZGlhbG9nLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAyMHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE1cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE0cHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo0MDA7bGluZS1oZWlnaHQ6MS4xMjU7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE1MCU7bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS41ZW07d2lkdGg6MS41ZW19Lm1hdC1mb3JtLWZpZWxkLXByZWZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtO2xpbmUtaGVpZ2h0OjEuMTI1fS5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNWVtIDA7Ym9yZGVyLXRvcDouODQzNzVlbSBzb2xpZCB0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzVlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzMzMzMzMzMlfS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMzQzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTAuODQzNzVlbTtwYWRkaW5nLXRvcDouODQzNzVlbX0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjM0Mzc1ZW19Lm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtc3Vic2NyaXB0LXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo3NSU7bWFyZ2luLXRvcDouNjY2NjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjc5MTY2NjY2NjdlbSl9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nLWJvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzouNDM3NWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpIHBlcnNwZWN0aXZlKDEwMHB4KSB0cmFuc2xhdGVaKDAuMDAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtYXV0b2ZpbGwtY29udHJvbFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbCArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMXB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDEwMnB4KTstbXMtdHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjNlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM1MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjI4MTI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JvdHRvbToxLjI1ZW19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDouNTQxNjY2NjY2N2VtO3RvcDpjYWxjKDEwMCUgLSAxLjY2NjY2NjY2NjdlbSl9QG1lZGlhIHByaW50ey5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMmVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyMWVtKSBzY2FsZSgwLjc1KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW2xhYmVsXVtfbmdjb250ZW50LSVDT01QJV06bm90KDpsYWJlbC1zaG93bikgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTJlbSkgc2NhbGUoMC43NSl9fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi4yNWVtIDAgLjc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMDkzNzVlbTttYXJnaW4tdG9wOi0wLjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTAuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjFlbSAwIDFlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS44NDM3NWVtO21hcmdpbi10b3A6LTAuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuNTkzNzRlbSkgc2NhbGUoMC43NSk7d2lkdGg6MTMzLjMzMzM0MzMzMzMlfS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZ3JpZC10aWxlLWZvb3Rlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9aW5wdXQubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde21hcmdpbi10b3A6LTAuMDYyNWVtfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1wYWdlLXNpemVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHh9Lm1hdC1yYWRpby1idXR0b25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtoZWlnaHQ6MS4xMjVlbX0ubWF0LXNsaWRlLXRvZ2dsZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NDAwfS5tYXQtc3RlcC1zdWItbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtd2VpZ2h0Om5vcm1hbH0ubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtc3RlcC1sYWJlbC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdGFiLWdyb3VwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDNbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjB9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTBweDtwYWRkaW5nLXRvcDo2cHg7cGFkZGluZy1ib3R0b206NnB4fS5tYXQtdG9vbHRpcC1oYW5kc2V0W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtwYWRkaW5nLXRvcDo4cHg7cGFkZGluZy1ib3R0b206OHB4fS5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE2cHh9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTRweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjEycHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTZweH0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjUwMCAxNHB4LzI0cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsfS5tYXQtc2ltcGxlLXNuYWNrYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweH0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjE7Zm9udC1mYW1pbHk6aW5oZXJpdDtmb250LXNpemU6aW5oZXJpdDtmb250LXdlaWdodDo1MDB9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbmVzdGVkLXRyZWUtbm9kZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6NDAwO2ZvbnQtc2l6ZToxNHB4fS5tYXQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzpoaWRkZW47cG9zaXRpb246cmVsYXRpdmV9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCg6ZW1wdHkpe3RyYW5zZm9ybTp0cmFuc2xhdGVaKDApfS5tYXQtcmlwcGxlLm1hdC1yaXBwbGUtdW5ib3VuZGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvdmVyZmxvdzp2aXNpYmxlfS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO2JvcmRlci1yYWRpdXM6NTAlO3BvaW50ZXItZXZlbnRzOm5vbmU7dHJhbnNpdGlvbjpvcGFjaXR5LHRyYW5zZm9ybSAwbXMgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSk7dHJhbnNmb3JtOnNjYWxlKDApfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5jZGstdmlzdWFsbHktaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6MDtjbGlwOnJlY3QoMCAwIDAgMCk7aGVpZ2h0OjFweDttYXJnaW46LTFweDtvdmVyZmxvdzpoaWRkZW47cGFkZGluZzowO3Bvc2l0aW9uOmFic29sdXRlO3dpZHRoOjFweDtvdXRsaW5lOjA7LXdlYmtpdC1hcHBlYXJhbmNlOm5vbmU7LW1vei1hcHBlYXJhbmNlOm5vbmV9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17cG9pbnRlci1ldmVudHM6bm9uZTt0b3A6MDtsZWZ0OjA7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpmaXhlZDt6LWluZGV4OjEwMDB9LmNkay1vdmVybGF5LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV06ZW1wdHl7ZGlzcGxheTpub25lfS5jZGstZ2xvYmFsLW92ZXJsYXktd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktcGFuZVtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7cG9pbnRlci1ldmVudHM6YXV0bztib3gtc2l6aW5nOmJvcmRlci1ib3g7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDttYXgtd2lkdGg6MTAwJTttYXgtaGVpZ2h0OjEwMCV9LmNkay1vdmVybGF5LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0b3A6MDtib3R0b206MDtsZWZ0OjA7cmlnaHQ6MDt6LWluZGV4OjEwMDA7cG9pbnRlci1ldmVudHM6YXV0bzstd2Via2l0LXRhcC1oaWdobGlnaHQtY29sb3I6dHJhbnNwYXJlbnQ7dHJhbnNpdGlvbjpvcGFjaXR5IDQwMG1zIGN1YmljLWJlemllcigwLjI1LCAwLjgsIDAuMjUsIDEpO29wYWNpdHk6MH0uY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eToxfUBtZWRpYSBzY3JlZW4gYW5kICgtbXMtaGlnaC1jb250cmFzdDogYWN0aXZlKXsuY2RrLW92ZXJsYXktYmFja2Ryb3AuY2RrLW92ZXJsYXktYmFja2Ryb3Atc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV17b3BhY2l0eTouNn19LmNkay1vdmVybGF5LWRhcmstYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMzIpfS5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstb3ZlcmxheS10cmFuc3BhcmVudC1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjB9LmNkay1vdmVybGF5LWNvbm5lY3RlZC1wb3NpdGlvbi1ib3VuZGluZy1ib3hbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3otaW5kZXg6MTAwMDtkaXNwbGF5OmZsZXg7ZmxleC1kaXJlY3Rpb246Y29sdW1uO21pbi13aWR0aDoxcHg7bWluLWhlaWdodDoxcHh9LmNkay1nbG9iYWwtc2Nyb2xsYmxvY2tbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3dpZHRoOjEwMCU7b3ZlcmZsb3cteTpzY3JvbGx9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1zdGFydHt9QGtleWZyYW1lcyBjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmR7fS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGx7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0IDBzIDFtc30uY2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtbW9uaXRvcmVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOi13ZWJraXQtYXV0b2ZpbGwpe2FuaW1hdGlvbjpjZGstdGV4dC1maWVsZC1hdXRvZmlsbC1lbmQgMHMgMW1zfXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZVtfbmdjb250ZW50LSVDT01QJV17cmVzaXplOm5vbmV9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZ1tfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6YXV0byAhaW1wb3J0YW50O292ZXJmbG93OmhpZGRlbiAhaW1wb3J0YW50fXRleHRhcmVhLmNkay10ZXh0YXJlYS1hdXRvc2l6ZS1tZWFzdXJpbmctZmlyZWZveFtfbmdjb250ZW50LSVDT01QJV17cGFkZGluZzoycHggMCAhaW1wb3J0YW50O2JveC1zaXppbmc6Y29udGVudC1ib3ggIWltcG9ydGFudDtoZWlnaHQ6MCAhaW1wb3J0YW50fS5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMSl9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCksIC5tYXQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1czpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfS5tYXQtb3B0aW9uLm1hdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpO2NvbG9yOiMyMTIxMjF9Lm1hdC1vcHRpb24ubWF0LW9wdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y1N2MwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tZGlzYWJsZWQpe2NvbG9yOiNmNDQzMzZ9Lm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LW9wdGdyb3VwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXBzZXVkby1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmYWZhZmF9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNiMGIwYjB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwfS5tYXQtcHNldWRvLWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzZ9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZC5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHNldWRvLWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiMGIwYjB9Lm1hdC1lbGV2YXRpb24tejBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16Mltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16M1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDVweCA4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggNXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA2cHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE4cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDRweCA1cHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDdweCAxMHB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAycHggMTZweCAxcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16OFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA5cHggMTJweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEwW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggNnB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMHB4IDE0cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAxOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNnB4IDdweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTFweCAxNXB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA0cHggMjBweCAzcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejEzW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxM3B4IDE5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNHB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDlweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTRweCAyMXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjZweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTVbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCA5cHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE1cHggMjJweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDI4cHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE2W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTdbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMXB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxN3B4IDI2cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMnB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxOFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOXB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE4cHggMjhweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggN3B4IDM0cHggNnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE5W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTJweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTlweCAyOXB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzZweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjBweCAzMXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggMzhweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjFbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTNweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjFweCAzM3B4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDBweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDEwcHggMTRweCAtNnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjJweCAzNXB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA4cHggNDJweCA3cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTRweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjNweCAzNnB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDRweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MjRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWFwcC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LXRoZW1lLWxvYWRlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtYWN0aXZlKTpub3QoOmhvdmVyKXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6IzIxMjEyMX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjU3YzAwfS5jZGstaGlnaC1jb250cmFzdC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvdXRsaW5lOnNvbGlkIDFweDtib3JkZXItcmFkaXVzOjB9Lm1hdC1iYWRnZS1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWJhZGdlLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWJhZGdlW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LWJhZGdlLWhpZGRlbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6bm9uZX0ubWF0LWJhZGdlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojYjliOWI5O2NvbG9yOiM3NTc1NzV9Lm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTt0ZXh0LWFsaWduOmNlbnRlcjtkaXNwbGF5OmlubGluZS1ibG9jaztib3JkZXItcmFkaXVzOjUwJTt0cmFuc2l0aW9uOnRyYW5zZm9ybSAyMDBtcyBlYXNlLWluLW91dDt0cmFuc2Zvcm06c2NhbGUoMC42KTtvdmVyZmxvdzpoaWRkZW47d2hpdGUtc3BhY2U6bm93cmFwO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7cG9pbnRlci1ldmVudHM6bm9uZX0ubmctYW5pbWF0ZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJhZGdlLWNvbnRlbnQuX21hdC1hbmltYXRpb24tbm9vcGFibGVbX25nY29udGVudC0lQ09NUCVde3RyYW5zaXRpb246bm9uZX0ubWF0LWJhZGdlLWNvbnRlbnQubWF0LWJhZGdlLWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOm5vbmV9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjE2cHg7aGVpZ2h0OjE2cHg7bGluZS1oZWlnaHQ6MTZweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotOHB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWJlbG93W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE2cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LThweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotOHB4fS5tYXQtYmFkZ2UtbWVkaXVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MjJweDtoZWlnaHQ6MjJweDtsaW5lLWhlaWdodDoyMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTExcHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTIycHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTFweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xMXB4fS5tYXQtYmFkZ2UtbGFyZ2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyOHB4O2hlaWdodDoyOHB4O2xpbmUtaGVpZ2h0OjI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWJvdmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LTE0cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTI4cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yOHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xNHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0OmF1dG87bGVmdDotMTRweH0ubWF0LWJvdHRvbS1zaGVldC1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOmluaGVyaXQ7YmFja2dyb3VuZDp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi4xO2JhY2tncm91bmQtY29sb3I6Y3VycmVudENvbG9yfS5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6IzAwMH0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKTphY3RpdmU6bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggNXB4IDVweCAtM3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggOHB4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDNweCAxNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA3cHggOHB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMnB4IDE3cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyMnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSksIC5tYXQtbWluaS1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Om5vbmV9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZ3JvdXAtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICsgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1idXR0b24tdG9nZ2xlLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0Om5vbmU7Ym9yZGVyLXRvcDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlMGUwZTA7Y29sb3I6IzYxNjE2MX0ubWF0LWJ1dHRvbi10b2dnbGUtY2hlY2tlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6I2VlZX0ubWF0LWJ1dHRvbi10b2dnbGUtZGlzYWJsZWQubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiZGJkYmR9Lm1hdC1idXR0b24tdG9nZ2xlLXN0YW5kYWxvbmUubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXI6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhcmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNhcmQubWF0LWNhcmQtZmxhdFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC1zdWJ0aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzYxNjE2MX0ubWF0LWNoZWNrYm94LWNoZWNrbWFya1tfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmFmYWZhfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrLXBhdGhbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmFmYWZhICFpbXBvcnRhbnR9Lm1hdC1jaGVja2JveC1taXhlZG1hcmtbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGUubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1jaGVja2JveC1kaXNhYmxlZC5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojYjBiMGIwfS5tYXQtY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWNoZWNrZWQpICAgLm1hdC1jaGVja2JveC1mcmFtZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1wcmltYXJ5ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC1hY2NlbnQgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXdhcm4gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojMjEyMTIxfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGlwLWRpc2FibGVkKTphY3RpdmV7Ym94LXNoYWRvdzowcHggM3B4IDNweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggM3B4IDRweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7b3BhY2l0eTouNTR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6IzAwMH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGlwLXJlbW92ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtvcGFjaXR5Oi40fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0aGVhZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRmb290W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWhlYWRlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgW21hdC1mb290ZXItcm93XVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGUtc3RpY2t5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOmluaGVyaXR9bWF0LXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1oZWFkZXItcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWZvb3Rlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCB0aC5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVdLCB0ZC5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1mb290ZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbS1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtY2FsZW5kYXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLW5leHQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1wcmV2aW91cy1idXR0b25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LWNhbGVuZGFyLXRhYmxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyLWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWNhbGVuZGFyLWJvZHktbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMTtib3JkZXItY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2NvbG9yOiM3NTc1NzV9Lm1hdC1jYWxlbmRhci1ib2R5LWNlbGxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWQpOmhvdmVyID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpLCAuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1jZWxsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtY2FsZW5kYXItYm9keS10b2RheVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTgpfS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NSwxMjQsMCwuNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC40KX0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS10b2RheS5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzppbnNldCAwIDAgMCAxcHggI2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC10b3VjaFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZGF0ZXBpY2tlci10b2dnbGUtYWN0aXZlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1kaWFsb2ctY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAxMXB4IDE1cHggLTdweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDI0cHggMzhweCAzcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggOXB4IDQ2cHggOHB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kaXZpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWRpdmlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1yaWdodC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYWN0aW9uLXJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSwgLm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1leHBhbmRlZCk6bm90KFthcmlhLWRpc2FibGVkPXRydWVdKSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDojZmZmfX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItdGl0bGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24taW5kaWNhdG9yW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXJbYXJpYS1kaXNhYmxlZD10cnVlXVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci1kZXNjcmlwdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjYpfS5tYXQtaGludFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y1N2MwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtYWNjZW50ICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkKS5tYXQtd2FybiAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yZXF1aXJlZC1tYXJrZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLXN0YW5kYXJkLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6bGluZWFyLWdyYWRpZW50KHRvIHJpZ2h0LCByZ2JhKDAsIDAsIDAsIDAuNDIpIDAlLCByZ2JhKDAsIDAsIDAsIDAuNDIpIDMzJSwgdHJhbnNwYXJlbnQgMCUpO2JhY2tncm91bmQtc2l6ZTo0cHggMTAwJTtiYWNrZ3JvdW5kLXJlcGVhdDpyZXBlYXQteH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1mbGV4W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjAyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3Jle2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtaW52YWxpZC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjA2KX0ubWF0LWljb24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1pY29uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1pY29uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiM2MTYxNjF9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpkaXNhYmxlZCwgLm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6Izc1NzU3NX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmNTdjMDB9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6cGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi1tb3otcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06Oi13ZWJraXQtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06LW1zLWlucHV0LXBsYWNlaG9sZGVye2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOiNmZjk4MDB9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1pbmZpeFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOiNmNDQzMzZ9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN1YmhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWxpc3QtaXRlbS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cywgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbmF2LWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1hY3Rpb24tbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXN7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LW1lbnUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50O2NvbG9yOiMyMTIxMjF9Lm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1uby1jb2xvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWVudS1pdGVtLXN1Ym1lbnUtdHJpZ2dlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2NvbG9yOnJnYmEoMCwwLDAsLjU0KX0ubWF0LW1lbnUtaXRlbVtfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KFtkaXNhYmxlZF0pLCAubWF0LW1lbnUtaXRlbS5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLWhpZ2hsaWdodGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1wYWdpbmF0b3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpO2JvcmRlci1yaWdodDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoycHggc29saWQgcmdiYSgwLDAsMCwuNTQpfS5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWRlY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWluY3JlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcGFnaW5hdG9yLWZpcnN0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItbGFzdFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJ1ZmZlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmNkZDJ9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItZmlsbFtfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXByb2dyZXNzLXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNTdjMDB9Lm1hdC1wcm9ncmVzcy1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zcGlubmVyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIGNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmNDQzMzZ9Lm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlKSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmUgICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm4ubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWxhYmVsLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zZWxlY3QtcGxhY2Vob2xkZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoOTcsOTcsOTcsLjQyKX0ubWF0LXNlbGVjdC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNlbGVjdC1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1tdWx0aXBsZSl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QubWF0LXNlbGVjdC1pbnZhbGlkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtZHJhd2VyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZHJhd2VyLm1hdC1kcmF3ZXItcHVzaFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZHJhd2VyW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1kcmF3ZXItc2lkZSl7Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKTtib3JkZXItcmlnaHQ6bm9uZX1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kcmF3ZXItc2lkZS5tYXQtZHJhd2VyLWVuZFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1iYWNrZHJvcC5tYXQtZHJhd2VyLXNob3duW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjYpfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC1wcmltYXJ5Lm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtc2xpZGUtdG9nZ2xlLm1hdC13YXJuLm1hdC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ0LDY3LDU0LC41NCl9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtc2xpZGUtdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2VkKSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNsaWRlLXRvZ2dsZS10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMnB4IDFweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMXB4IDFweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDNweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmF9Lm1hdC1zbGlkZS10b2dnbGUtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtdGV4dFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjIpfS5tYXQtc2xpZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciAgIC5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRyYWNrLWZpbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLWZvY3VzLXJpbmdbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjg3KX0ubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZy5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KTtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKS5jZGstZm9jdXNlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpOmhvdmVyLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkLm1hdC1zbGlkZXItZGlzYWJsZWQgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1oYXMtdGlja3NbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC43KX0ubWF0LXNsaWRlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRpY2tzW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOnJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpO2JhY2tncm91bmQtaW1hZ2U6LW1vei1yZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KDAuMDAwMWRlZywgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zbGlkZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byBib3R0b20sIHJnYmEoMCwgMCwgMCwgMC43KSwgcmdiYSgwLCAwLCAwLCAwLjcpIDJweCwgdHJhbnNwYXJlbnQgMCwgdHJhbnNwYXJlbnQpfS5tYXQtc3RlcC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjA0KX1AbWVkaWEoaG92ZXI6IG5vbmUpey5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQ6bm9uZX19Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1vcHRpb25hbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiM2MTYxNjE7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1kb25lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtaWNvbi1zdGF0ZS1lZGl0W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50O2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWxhYmVsLm1hdC1zdGVwLWxhYmVsLWVycm9yW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtc3RlcHBlci1ob3Jpem9udGFsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdGVwcGVyLXZlcnRpY2FsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1zdGVwcGVyLXZlcnRpY2FsLWxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7Ym9yZGVyLWxlZnQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtaG9yaXpvbnRhbC1zdGVwcGVyLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZSwgLm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXIsIC5tYXQtc3RlcHBlci1ob3Jpem9udGFsLWxpbmVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtc29ydC1oZWFkZXItYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC10YWItbmF2LWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWJvdHRvbToxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpfS5tYXQtdGFiLWdyb3VwLWludmVydGVkLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcDoxcHggc29saWQgcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1ib3R0b206bm9uZX0ubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6IzIxMjEyMX0ubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6Izc1NzU3NX0ubWF0LXRhYi1ncm91cFtjbGFzcyo9bWF0LWJhY2tncm91bmQtXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOm5vbmU7Ym9yZGVyLXRvcDpub25lfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeS5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybi5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjA1LDIxMCwuMyl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtzW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjQpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEyKX0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1ZjVmNTtjb2xvcjojMjEyMTIxfS5tYXQtdG9vbGJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtdG9vbGJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdH0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC10b29sdGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOnJnYmEoOTcsOTcsOTcsLjkpfS5tYXQtdHJlZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtc25hY2stYmFyLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNyk7YmFja2dyb3VuZDojMzIzMjMyO2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LXNpbXBsZS1zbmFja2Jhci1hY3Rpb25bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9LnBjLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2JvcmRlcjoxcHggc29saWQgI2ViZWJlYn0ucGMtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YWxpZ24taXRlbXM6Y2VudGVyO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNlYmViZWI7ZGlzcGxheTpmbGV4O2hlaWdodDo0MnB4O3BhZGRpbmc6MCAxNnB4fS5wYy10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwO2Rpc3BsYXk6aW5saW5lO2ZsZXg6MSAxfSJdLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL3NlbGVjdGVkX2Fubm90YXRpb25zL3NlbGVjdGVkX2Fubm90YXRpb25zX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBTZWxlY3RlZEFubm90YXRpb25zQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLnBjRXhwYW5kZWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRQQ0V4cGFuZGVkKSk7CiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRBbm5vdGF0aW9ucyQgPSB0aGlzLnN0b3JlLnNlbGVjdChnZXRTZWxlY3RlZEFubm90YXRpb25zKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBjbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMoKSB7CiAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaUNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucygpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICB0b2dnbGVFeHBhbmRlZCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pVG9nZ2xlUGFyYWxsZWxDb29yZGluYXRlc0V4cGFuZGVkKCkpOwogICAgICAgIH0KICAgIH0KICAgIFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktc2VsZWN0ZWQtYW5ub3RhdGlvbnMnLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgCiAgICA8c2VsZWN0ZWQtYW5ub3RhdGlvbnMtY29tcG9uZW50CiAgICAgIFtwY0V4cGFuZGVkXT0icGNFeHBhbmRlZCQgfCBhc3luYyIKICAgICAgW3NlbGVjdGVkQW5ub3RhdGlvbnNdPSJzZWxlY3RlZEFubm90YXRpb25zJCB8IGFzeW5jIgogICAgICAob25DbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMpPSJjbGVhclNlbGVjdGVkQW5ub3RhdGlvbnMoKSIKICAgICAgKG9uVG9nZ2xlRXhwYW5kZWQpPSJ0b2dnbGVFeHBhbmRlZCgpIgogICAgPjwvc2VsZWN0ZWQtYW5ub3RhdGlvbnMtY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBTZWxlY3RlZEFubm90YXRpb25zQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBTZWxlY3RlZEFubm90YXRpb25zQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1zZWxlY3RlZC1hbm5vdGF0aW9ucyJdXSwgZGVjbHM6IDMsIHZhcnM6IDYsIGNvbnN0czogW1szLCAicGNFeHBhbmRlZCIsICJzZWxlY3RlZEFubm90YXRpb25zIiwgIm9uQ2xlYXJTZWxlY3RlZEFubm90YXRpb25zIiwgIm9uVG9nZ2xlRXhwYW5kZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBTZWxlY3RlZEFubm90YXRpb25zQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJzZWxlY3RlZC1hbm5vdGF0aW9ucy1jb21wb25lbnQiLCAwKTsKICAgICAgICAgICAgybXJtWxpc3RlbmVyKCJvbkNsZWFyU2VsZWN0ZWRBbm5vdGF0aW9ucyIsIGZ1bmN0aW9uIFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXJfVGVtcGxhdGVfc2VsZWN0ZWRfYW5ub3RhdGlvbnNfY29tcG9uZW50X29uQ2xlYXJTZWxlY3RlZEFubm90YXRpb25zXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHguY2xlYXJTZWxlY3RlZEFubm90YXRpb25zKCk7IH0pKCJvblRvZ2dsZUV4cGFuZGVkIiwgZnVuY3Rpb24gU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbnRhaW5lcl9UZW1wbGF0ZV9zZWxlY3RlZF9hbm5vdGF0aW9uc19jb21wb25lbnRfb25Ub2dnbGVFeHBhbmRlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4LnRvZ2dsZUV4cGFuZGVkKCk7IH0pOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMiwgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgicGNFeHBhbmRlZCIsIMm1ybVwaXBlQmluZDEoMSwgMiwgY3R4LnBjRXhwYW5kZWQkKSkoInNlbGVjdGVkQW5ub3RhdGlvbnMiLCDJtcm1cGlwZUJpbmQxKDIsIDQsIGN0eC5zZWxlY3RlZEFubm90YXRpb25zJCkpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW1NlbGVjdGVkQW5ub3RhdGlvbnNDb21wb25lbnRdLCBwaXBlczogW0FzeW5jUGlwZV0sIGVuY2Fwc3VsYXRpb246IDIsIGNoYW5nZURldGVjdGlvbjogMCB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvbWFpbi9tYWluX2NvbXBvbmVudC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBmdW5jdGlvbiBNYWluQ29tcG9uZW50X2Rpdl8yX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDYpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMSwgImRpdiIsIDcpOwogICAgICAgIMm1ybVlbGVtZW50KDIsICJucG1pLXZpb2xpbi1maWx0ZXJzIiwgOCk7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgzLCAiZGl2IiwgOSk7CiAgICAgICAgybXJtWVsZW1lbnQoNCwgInRiLWxlZ2FjeS1ydW5zLXNlbGVjdG9yIik7CiAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICBjb25zdCBjdHhfcjAgPSDJtcm1bmV4dENvbnRleHQoKTsKICAgICAgICDJtcm1c3R5bGVQcm9wKCJ3aWR0aCIsIGN0eF9yMC5zaWRlYmFyV2lkdGgsICJweCIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYWluQ29tcG9uZW50X2Rpdl8zX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yNyA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDEwKTsKICAgICAgICDJtcm1bGlzdGVuZXIoIm1vdXNlZG93biIsIGZ1bmN0aW9uIE1haW5Db21wb25lbnRfZGl2XzNfVGVtcGxhdGVfZGl2X21vdXNlZG93bl8wX2xpc3RlbmVyKCkgeyDJtcm1cmVzdG9yZVZpZXcoX3I3KTsgY29uc3QgY3R4X3I2ID0gybXJtW5leHRDb250ZXh0KCk7IHJldHVybiBjdHhfcjYucmVzaXplR3JhYmJlZC5lbWl0KCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGZ1bmN0aW9uIE1haW5Db21wb25lbnRfZGl2XzRfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTEpOwogICAgICAgIMm1ybVlbGVtZW50KDEsICJucG1pLWFubm90YXRpb25zLWxpc3QiLCAxMik7CiAgICAgICAgybXJtWVsZW1lbnQoMiwgIm5wbWktc2VsZWN0ZWQtYW5ub3RhdGlvbnMiKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICBmdW5jdGlvbiBNYWluQ29tcG9uZW50X25nX3RlbXBsYXRlXzVfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMTMpOwogICAgICAgIMm1ybV0ZXh0KDEsICJZb3UgbmVlZCB0byBzZWxlY3QgYXQgbGVhc3Qgb25lIHJ1bi4iKTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgfSB9CiAgICB2YXIgSTE4Tl8wJGI7CiAgICBpZiAodHlwZW9mIG5nSTE4bkNsb3N1cmVNb2RlICE9PSAidW5kZWZpbmVkIiAmJiBuZ0kxOG5DbG9zdXJlTW9kZSkgewogICAgICAgIC8qKgogICAgICAgICAqIEBkZXNjIExhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgdGhlIHNpZGViYXIuCiAgICAgICAgICovIAogICAgICAgIGNvbnN0IE1TR19FWFRFUk5BTF80NDg1MDA5MzQ3NDQ0NzA0ODc4JCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX01BSU5fTUFJTl9DT01QT05FTlRfVFNfXzEgPSBnb29nLmdldE1zZygiVG9nZ2xlIFNpZGViYXIiKTsKICAgICAgICBJMThOXzAkYiA9IE1TR19FWFRFUk5BTF80NDg1MDA5MzQ3NDQ0NzA0ODc4JCRURU5TT1JCT0FSRF9XRUJBUFBfUExVR0lOU19OUE1JX1ZJRVdTX01BSU5fTUFJTl9DT01QT05FTlRfVFNfXzE7CiAgICB9CiAgICBlbHNlIHsKICAgICAgICBJMThOXzAkYiA9ICRsb2NhbGl6ZSBgOkxhYmVsIGZvciBhIGJ1dHRvbiB0aGF0IHRvZ2dsZXMgdGhlIHNpZGViYXIu4pCfZjYzYjU3OTMyZDE3OWNjYTYyYWM5ZmNhZTYzZGQ3ZjVlNmZhMzg5ZuKQnzQ0ODUwMDkzNDc0NDQ3MDQ4Nzg6VG9nZ2xlIFNpZGViYXJgOwogICAgfQogICAgY29uc3QgX2MyJGkgPSBbImFyaWEtbGFiZWwiLCBJMThOXzAkYl07CiAgICBmdW5jdGlvbiBNYWluQ29tcG9uZW50X2Rpdl83X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgIGNvbnN0IF9yOSA9IMm1ybVnZXRDdXJyZW50VmlldygpOwogICAgICAgIMm1ybVlbGVtZW50U3RhcnQoMCwgImRpdiIsIDE0KTsKICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDEsICJidXR0b24iLCAxNSk7CiAgICAgICAgybXJtWkxOG5BdHRyaWJ1dGVzKDIsIF9jMiRpKTsKICAgICAgICDJtcm1bGlzdGVuZXIoImNsaWNrIiwgZnVuY3Rpb24gTWFpbkNvbXBvbmVudF9kaXZfN19UZW1wbGF0ZV9idXR0b25fY2xpY2tfMV9saXN0ZW5lcigpIHsgybXJtXJlc3RvcmVWaWV3KF9yOSk7IGNvbnN0IGN0eF9yOCA9IMm1ybVuZXh0Q29udGV4dCgpOyByZXR1cm4gY3R4X3I4LnRvZ2dsZVNpZGViYXJFeHBhbmRlZC5lbWl0KCk7IH0pOwogICAgICAgIMm1ybVlbGVtZW50KDMsICJtYXQtaWNvbiIsIDE2KTsKICAgICAgICDJtcm1ZWxlbWVudEVuZCgpOwogICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICB9IH0KICAgIGNsYXNzIE1haW5Db21wb25lbnQgewogICAgICAgIGNvbnN0cnVjdG9yKCkgewogICAgICAgICAgICB0aGlzLnRvZ2dsZVNpZGViYXJFeHBhbmRlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5yZXNpemVUcmlnZ2VyZWQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7CiAgICAgICAgICAgIHRoaXMucmVzaXplR3JhYmJlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICAgICAgdGhpcy5yZXNpemVSZWxlYXNlZCA9IG5ldyBFdmVudEVtaXR0ZXIoKTsKICAgICAgICB9CiAgICB9CiAgICBNYWluQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICdtYWluLWNvbXBvbmVudCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVVcmw6ICcuL21haW5fY29tcG9uZW50Lm5nLmh0bWwnLAogICAgICAgICAgICAgICAgICAgIHN0eWxlVXJsczogWycuL21haW5fY29tcG9uZW50LmNzcyddLAogICAgICAgICAgICAgICAgICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgTWFpbkNvbXBvbmVudC5wcm9wRGVjb3JhdG9ycyA9IHsKICAgICAgICBydW5BY3RpdmU6IFt7IHR5cGU6IElucHV0IH1dLAogICAgICAgIHNpZGViYXJFeHBhbmRlZDogW3sgdHlwZTogSW5wdXQgfV0sCiAgICAgICAgc2lkZWJhcldpZHRoOiBbeyB0eXBlOiBJbnB1dCB9XSwKICAgICAgICB0b2dnbGVTaWRlYmFyRXhwYW5kZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICByZXNpemVUcmlnZ2VyZWQ6IFt7IHR5cGU6IE91dHB1dCB9XSwKICAgICAgICByZXNpemVHcmFiYmVkOiBbeyB0eXBlOiBPdXRwdXQgfV0sCiAgICAgICAgcmVzaXplUmVsZWFzZWQ6IFt7IHR5cGU6IE91dHB1dCB9XQogICAgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYWluQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gTWFpbkNvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNYWluQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE1haW5Db21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogTWFpbkNvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJtYWluLWNvbXBvbmVudCJdXSwgaW5wdXRzOiB7IHJ1bkFjdGl2ZTogInJ1bkFjdGl2ZSIsIHNpZGViYXJFeHBhbmRlZDogInNpZGViYXJFeHBhbmRlZCIsIHNpZGViYXJXaWR0aDogInNpZGViYXJXaWR0aCIgfSwgb3V0cHV0czogeyB0b2dnbGVTaWRlYmFyRXhwYW5kZWQ6ICJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLCByZXNpemVUcmlnZ2VyZWQ6ICJyZXNpemVUcmlnZ2VyZWQiLCByZXNpemVHcmFiYmVkOiAicmVzaXplR3JhYmJlZCIsIHJlc2l6ZVJlbGVhc2VkOiAicmVzaXplUmVsZWFzZWQiIH0sIGRlY2xzOiA4LCB2YXJzOiA1LCBjb25zdHM6IFtbMSwgImNvbnRlbnQiLCAzLCAibW91c2V1cCIsICJtb3VzZW1vdmUiXSwgWyJjbGFzcyIsICJzaWRlYmFyLWNvbnRhaW5lciIsIDMsICJ3aWR0aCIsIDQsICJuZ0lmIl0sIFsiY2xhc3MiLCAiZ3JhYmJlciIsIDMsICJtb3VzZWRvd24iLCA0LCAibmdJZiJdLCBbImNsYXNzIiwgImFuYWx5c2lzLWNvbnRhaW5lciIsIDQsICJuZ0lmIiwgIm5nSWZFbHNlIl0sIFsibm9SdW4iLCAiIl0sIFsiY2xhc3MiLCAic2lkZS10b2dnbGUiLCA0LCAibmdJZiJdLCBbMSwgInNpZGViYXItY29udGFpbmVyIl0sIFsxLCAic2lkZWJhci1jb250ZW50cyJdLCBbMSwgInZpb2xpbi1maWx0ZXJzIl0sIFsxLCAicnVuLXNlbGVjdG9yIl0sIFsxLCAiZ3JhYmJlciIsIDMsICJtb3VzZWRvd24iXSwgWzEsICJhbmFseXNpcy1jb250YWluZXIiXSwgWzEsICJhbm5vdGF0aW9ucy1saXN0Il0sIFsxLCAibm9SdW4iXSwgWzEsICJzaWRlLXRvZ2dsZSJdLCBbIm1hdC1pY29uLWJ1dHRvbiIsICIiLCAzLCAiY2xpY2siLCA2LCAiYXJpYS1sYWJlbCJdLCBbInN2Z0ljb24iLCAiY2hldnJvbl9yaWdodF8yNHB4Il1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTWFpbkNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnQoMCwgIm5wbWktZGF0YS1zZWxlY3Rpb24iKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgxLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybVsaXN0ZW5lcigibW91c2V1cCIsIGZ1bmN0aW9uIE1haW5Db21wb25lbnRfVGVtcGxhdGVfZGl2X21vdXNldXBfMV9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5yZXNpemVSZWxlYXNlZC5lbWl0KCk7IH0pKCJtb3VzZW1vdmUiLCBmdW5jdGlvbiBNYWluQ29tcG9uZW50X1RlbXBsYXRlX2Rpdl9tb3VzZW1vdmVfMV9saXN0ZW5lcigkZXZlbnQpIHsgcmV0dXJuIGN0eC5yZXNpemVUcmlnZ2VyZWQuZW1pdCgkZXZlbnQpOyB9KTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDIsIE1haW5Db21wb25lbnRfZGl2XzJfVGVtcGxhdGUsIDUsIDIsICJkaXYiLCAxKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDMsIE1haW5Db21wb25lbnRfZGl2XzNfVGVtcGxhdGUsIDEsIDAsICJkaXYiLCAyKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDQsIE1haW5Db21wb25lbnRfZGl2XzRfVGVtcGxhdGUsIDMsIDAsICJkaXYiLCAzKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDUsIE1haW5Db21wb25lbnRfbmdfdGVtcGxhdGVfNV9UZW1wbGF0ZSwgMiwgMCwgIm5nLXRlbXBsYXRlIiwgbnVsbCwgNCwgybXJtXRlbXBsYXRlUmVmRXh0cmFjdG9yKTsKICAgICAgICAgICAgybXJtWVsZW1lbnRFbmQoKTsKICAgICAgICAgICAgybXJtXRlbXBsYXRlKDcsIE1haW5Db21wb25lbnRfZGl2XzdfVGVtcGxhdGUsIDQsIDAsICJkaXYiLCA1KTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgY29uc3QgX3IzID0gybXJtXJlZmVyZW5jZSg2KTsKICAgICAgICAgICAgybXJtWFkdmFuY2UoMik7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgibmdJZiIsIGN0eC5zaWRlYmFyRXhwYW5kZWQpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgxKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgY3R4LnNpZGViYXJFeHBhbmRlZCk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucnVuQWN0aXZlID09PSB0cnVlKSgibmdJZkVsc2UiLCBfcjMpOwogICAgICAgICAgICDJtcm1YWR2YW5jZSgzKTsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJuZ0lmIiwgIWN0eC5zaWRlYmFyRXhwYW5kZWQpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW0RhdGFTZWxlY3Rpb25Db21wb25lbnQsIE5nSWYsIFZpb2xpbkZpbHRlcnNDb250YWluZXIsIExlZ2FjeVJ1bnNTZWxlY3RvckNvbnRhaW5lciwgQW5ub3RhdGlvbnNMaXN0Q29udGFpbmVyLCBTZWxlY3RlZEFubm90YXRpb25zQ29udGFpbmVyLCBNYXRCdXR0b24sIE1hdEljb25dLCBzdHlsZXM6IFsiLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo2MDA7Zm9udC1zaXplOjEycHg7Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1iYWRnZS1zbWFsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTo5cHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4fS5tYXQtaDFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWhlYWRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgxW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAyNHB4LzMycHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWgyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10aXRsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MCAwIDE2cHh9Lm1hdC1oM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3ViaGVhZGluZy0yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIGgzW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCAxNnB4LzI4cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6bm9ybWFsO21hcmdpbjowIDAgMTZweH0ubWF0LWg0W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdWJoZWFkaW5nLTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDE1cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCAxNnB4fS5tYXQtaDVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuODMpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtaDZbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgaDZbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIGNhbGMoMTRweCAqIDAuNjcpLzIwcHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bWFyZ2luOjAgMCAxMnB4fS5tYXQtYm9keS1zdHJvbmdbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMTRweC8yNHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWJvZHktMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdHlwb2dyYXBoeVtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJvZHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYm9keS0xW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHBbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgcFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luOjAgMCAxMnB4fS5tYXQtc21hbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNhcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDEycHgvMjBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTRbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6MzAwIDExMnB4LzExMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOi0wLjA1ZW07bWFyZ2luOjAgMCA1NnB4fS5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10eXBvZ3JhcGh5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZGlzcGxheS0zW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250OjQwMCA1NnB4LzU2cHggUm9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7bGV0dGVyLXNwYWNpbmc6LTAuMDJlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTJbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDQ1cHgvNDhweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzotMC4wMDVlbTttYXJnaW46MCAwIDY0cHh9Lm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXR5cG9ncmFwaHlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1kaXNwbGF5LTFbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NDAwIDM0cHgvNDBweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWw7bWFyZ2luOjAgMCA2NHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhcmQtdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToyNHB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNhcmQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FyZC10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjIwcHh9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jYXJkLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4fS5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtY2hlY2tib3gtbGF5b3V0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2xpbmUtaGVpZ2h0OjI0cHh9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC10cmFpbGluZy1pY29uLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmUubWF0LWljb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxOHB4fS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtaGVhZGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LWNlbGxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWNhbGVuZGFyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZn0ubWF0LWNhbGVuZGFyLWJvZHlbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxM3B4fS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2FsZW5kYXItcGVyaW9kLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTFweDtmb250LXdlaWdodDo0MDB9Lm1hdC1kaWFsb2ctdGl0bGVbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDIwcHgvMzJweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTVweDtmb250LXdlaWdodDo0MDB9Lm1hdC1leHBhbnNpb24tcGFuZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Zm9udDo0MDAgMTRweC8yMHB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbH0ubWF0LWZvcm0tZmllbGRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjQwMDtsaW5lLWhlaWdodDoxLjEyNTtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1zdWZmaXhbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTUwJTtsaW5lLWhlaWdodDoxLjEyNX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtc3VmZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjVlbTt3aWR0aDoxLjVlbX0ubWF0LWZvcm0tZmllbGQtcHJlZml4W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbi1idXR0b25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLXN1ZmZpeFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaWNvbltfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEuMTI1ZW07bGluZS1oZWlnaHQ6MS4xMjV9Lm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi41ZW0gMDtib3JkZXItdG9wOi44NDM3NWVtIHNvbGlkIHRyYW5zcGFyZW50fS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXQubWF0LWZvcm0tZmllbGQtc2hvdWxkLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbX25nY29udGVudC0lQ09NUCVdOmZvY3VzICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NWVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzMzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4zNDM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3RvcDotMC44NDM3NWVtO3BhZGRpbmctdG9wOi44NDM3NWVtfS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMzQzNzVlbX0ubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206MS4zNDM3NWVtfS5tYXQtZm9ybS1maWVsZC1zdWJzY3JpcHQtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjc1JTttYXJnaW4tdG9wOi42NjY2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNzkxNjY2NjY2N2VtKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmctYm90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOi40Mzc1ZW0gMH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtc2VydmVyW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1cyArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMjVlbSkgc2NhbGUoMC43NSkgcGVyc3BlY3RpdmUoMTAwcHgpIHRyYW5zbGF0ZVooMC4wMDFweCk7LW1zLXRyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTI1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3kubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1hdXRvZmlsbC1jb250cm9sW19uZ2NvbnRlbnQtJUNPTVAlXTotd2Via2l0LWF1dG9maWxsICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAxcHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyNWVtKSBzY2FsZSgwLjc1KSBwZXJzcGVjdGl2ZSgxMDBweCkgdHJhbnNsYXRlWigwLjAwMTAycHgpOy1tcy10cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS4yODEyM2VtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzUzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dG9wOjEuMjgxMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17Ym90dG9tOjEuMjVlbX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXN1YnNjcmlwdC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXttYXJnaW4tdG9wOi41NDE2NjY2NjY3ZW07dG9wOmNhbGMoMTAwJSAtIDEuNjY2NjY2NjY2N2VtKX1AbWVkaWEgcHJpbnR7Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdC5tYXQtZm9ybS1maWVsZC1zaG91bGQtZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5Lm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIyZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWF1dG9maWxsLWNvbnRyb2xbX25nY29udGVudC0lQ09NUCVdOi13ZWJraXQtYXV0b2ZpbGwgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjI4MTIxZW0pIHNjYWxlKDAuNzUpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1jYW4tZmxvYXRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1zZXJ2ZXJbbGFiZWxdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoOmxhYmVsLXNob3duKSArIC5tYXQtZm9ybS1maWVsZC1sYWJlbC13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17dHJhbnNmb3JtOnRyYW5zbGF0ZVkoLTEuMjgxMmVtKSBzY2FsZSgwLjc1KX19Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtZmlsbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6LjI1ZW0gMCAuNzVlbSAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0b3A6MS4wOTM3NWVtO21hcmdpbi10b3A6LTAuNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0wLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMC41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVde3BhZGRpbmc6MWVtIDAgMWVtIDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RvcDoxLjg0Mzc1ZW07bWFyZ2luLXRvcDotMC4yNWVtfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvcm0tZmllbGQtY2FuLWZsb2F0Lm1hdC1mb3JtLWZpZWxkLXNob3VsZC1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltfbmdjb250ZW50LSVDT01QJV06Zm9jdXMgKyAubWF0LWZvcm0tZmllbGQtbGFiZWwtd3JhcHBlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde3RyYW5zZm9ybTp0cmFuc2xhdGVZKC0xLjU5Mzc1ZW0pIHNjYWxlKDAuNzUpO3dpZHRoOjEzMy4zMzMzMzMzMzMzJX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lLm1hdC1mb3JtLWZpZWxkLWNhbi1mbG9hdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LXNlcnZlcltsYWJlbF1bX25nY29udGVudC0lQ09NUCVdOm5vdCg6bGFiZWwtc2hvd24pICsgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLXdyYXBwZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06dHJhbnNsYXRlWSgtMS41OTM3NGVtKSBzY2FsZSgwLjc1KTt3aWR0aDoxMzMuMzMzMzQzMzMzMyV9Lm1hdC1ncmlkLXRpbGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweH0ubWF0LWdyaWQtdGlsZS1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1ncmlkLXRpbGUtZm9vdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtZ3JpZC10aWxlLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpLCAubWF0LWdyaWQtdGlsZS1mb290ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXTpudGgtY2hpbGQobisyKXtmb250LXNpemU6MTJweH1pbnB1dC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17bWFyZ2luLXRvcDotMC4wNjI1ZW19Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4O2ZvbnQtd2VpZ2h0OjQwMH0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcGFnaW5hdG9yLXBhZ2Utc2l6ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweH0ubWF0LXJhZGlvLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zZWxlY3RbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxLjEyNWVtfS5tYXQtc2xpZGUtdG9nZ2xlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItaG9yaXpvbnRhbFtfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWZ9Lm1hdC1zdGVwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo0MDB9Lm1hdC1zdGVwLXN1Yi1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC13ZWlnaHQ6bm9ybWFsfS5tYXQtc3RlcC1sYWJlbC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Zm9udC1zaXplOjE0cHh9Lm1hdC1zdGVwLWxhYmVsLXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC10YWItZ3JvdXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Zm9udC1mYW1pbHk6Um9ib3RvLCBcIkhlbHZldGljYSBOZXVlXCIsIHNhbnMtc2VyaWY7Zm9udC1zaXplOjE0cHg7Zm9udC13ZWlnaHQ6NTAwfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoMltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoM1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICBoNltfbmdjb250ZW50LSVDT01QJV17Zm9udDo1MDAgMjBweC8zMnB4IFJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2xldHRlci1zcGFjaW5nOm5vcm1hbDttYXJnaW46MH0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMHB4O3BhZGRpbmctdG9wOjZweDtwYWRkaW5nLWJvdHRvbTo2cHh9Lm1hdC10b29sdGlwLWhhbmRzZXRbX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNHB4O3BhZGRpbmctdG9wOjhweDtwYWRkaW5nLWJvdHRvbTo4cHh9Lm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTZweH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVde3doaXRlLXNwYWNlOm5vd3JhcDtvdmVyZmxvdzpoaWRkZW47dGV4dC1vdmVyZmxvdzplbGxpcHNpcztkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveH0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxNnB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpbmVbX25nY29udGVudC0lQ09NUCVdOm50aC1jaGlsZChuKzIpe2ZvbnQtc2l6ZToxNHB4fS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTRweDtmb250LXdlaWdodDo1MDB9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXNpemU6MTJweH0ubWF0LWxpc3QtYmFzZVtkZW5zZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saW5lW19uZ2NvbnRlbnQtJUNPTVAlXXt3aGl0ZS1zcGFjZTpub3dyYXA7b3ZlcmZsb3c6aGlkZGVuO3RleHQtb3ZlcmZsb3c6ZWxsaXBzaXM7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3h9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtc2l6ZToxMnB4fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV17d2hpdGUtc3BhY2U6bm93cmFwO292ZXJmbG93OmhpZGRlbjt0ZXh0LW92ZXJmbG93OmVsbGlwc2lzO2Rpc3BsYXk6YmxvY2s7Ym94LXNpemluZzpib3JkZXItYm94fS5tYXQtbGlzdC1iYXNlW2RlbnNlXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGluZVtfbmdjb250ZW50LSVDT01QJV06bnRoLWNoaWxkKG4rMil7Zm9udC1zaXplOjEycHh9Lm1hdC1saXN0LWJhc2VbZGVuc2VdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LWZhbWlseTpSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtmb250LXNpemU6MTJweDtmb250LXdlaWdodDo1MDB9Lm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNnB4fS5tYXQtb3B0Z3JvdXAtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2ZvbnQ6NTAwIDE0cHgvMjRweCBSb2JvdG8sIFwiSGVsdmV0aWNhIE5ldWVcIiwgc2Fucy1zZXJpZjtsZXR0ZXItc3BhY2luZzpub3JtYWx9Lm1hdC1zaW1wbGUtc25hY2tiYXJbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxNHB4fS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17bGluZS1oZWlnaHQ6MTtmb250LWZhbWlseTppbmhlcml0O2ZvbnQtc2l6ZTppbmhlcml0O2ZvbnQtd2VpZ2h0OjUwMH0ubWF0LXRyZWVbX25nY29udGVudC0lQ09NUCVde2ZvbnQtZmFtaWx5OlJvYm90bywgXCJIZWx2ZXRpY2EgTmV1ZVwiLCBzYW5zLXNlcmlmfS5tYXQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1uZXN0ZWQtdHJlZS1ub2RlW19uZ2NvbnRlbnQtJUNPTVAlXXtmb250LXdlaWdodDo0MDA7Zm9udC1zaXplOjE0cHh9Lm1hdC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjpyZWxhdGl2ZX0ubWF0LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV06bm90KDplbXB0eSl7dHJhbnNmb3JtOnRyYW5zbGF0ZVooMCl9Lm1hdC1yaXBwbGUubWF0LXJpcHBsZS11bmJvdW5kZWRbX25nY29udGVudC0lQ09NUCVde292ZXJmbG93OnZpc2libGV9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7Ym9yZGVyLXJhZGl1czo1MCU7cG9pbnRlci1ldmVudHM6bm9uZTt0cmFuc2l0aW9uOm9wYWNpdHksdHJhbnNmb3JtIDBtcyBjdWJpYy1iZXppZXIoMCwgMCwgMC4yLCAxKTt0cmFuc2Zvcm06c2NhbGUoMCl9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5Om5vbmV9LmNkay12aXN1YWxseS1oaWRkZW5bX25nY29udGVudC0lQ09NUCVde2JvcmRlcjowO2NsaXA6cmVjdCgwIDAgMCAwKTtoZWlnaHQ6MXB4O21hcmdpbjotMXB4O292ZXJmbG93OmhpZGRlbjtwYWRkaW5nOjA7cG9zaXRpb246YWJzb2x1dGU7d2lkdGg6MXB4O291dGxpbmU6MDstd2Via2l0LWFwcGVhcmFuY2U6bm9uZTstbW96LWFwcGVhcmFuY2U6bm9uZX0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtwb2ludGVyLWV2ZW50czpub25lO3RvcDowO2xlZnQ6MDtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlfS5jZGstb3ZlcmxheS1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmZpeGVkO3otaW5kZXg6MTAwMH0uY2RrLW92ZXJsYXktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXTplbXB0eXtkaXNwbGF5Om5vbmV9LmNkay1nbG9iYWwtb3ZlcmxheS13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtkaXNwbGF5OmZsZXg7cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwfS5jZGstb3ZlcmxheS1wYW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtwb3NpdGlvbjphYnNvbHV0ZTtwb2ludGVyLWV2ZW50czphdXRvO2JveC1zaXppbmc6Ym9yZGVyLWJveDt6LWluZGV4OjEwMDA7ZGlzcGxheTpmbGV4O21heC13aWR0aDoxMDAlO21heC1oZWlnaHQ6MTAwJX0uY2RrLW92ZXJsYXktYmFja2Ryb3BbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RvcDowO2JvdHRvbTowO2xlZnQ6MDtyaWdodDowO3otaW5kZXg6MTAwMDtwb2ludGVyLWV2ZW50czphdXRvOy13ZWJraXQtdGFwLWhpZ2hsaWdodC1jb2xvcjp0cmFuc3BhcmVudDt0cmFuc2l0aW9uOm9wYWNpdHkgNDAwbXMgY3ViaWMtYmV6aWVyKDAuMjUsIDAuOCwgMC4yNSwgMSk7b3BhY2l0eTowfS5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5OjF9QG1lZGlhIHNjcmVlbiBhbmQgKC1tcy1oaWdoLWNvbnRyYXN0OiBhY3RpdmUpey5jZGstb3ZlcmxheS1iYWNrZHJvcC5jZGstb3ZlcmxheS1iYWNrZHJvcC1zaG93aW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtvcGFjaXR5Oi42fX0uY2RrLW92ZXJsYXktZGFyay1iYWNrZHJvcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4zMil9LmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wW19uZ2NvbnRlbnQtJUNPTVAlXSwgLmNkay1vdmVybGF5LXRyYW5zcGFyZW50LWJhY2tkcm9wLmNkay1vdmVybGF5LWJhY2tkcm9wLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6MH0uY2RrLW92ZXJsYXktY29ubmVjdGVkLXBvc2l0aW9uLWJvdW5kaW5nLWJveFtfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246YWJzb2x1dGU7ei1pbmRleDoxMDAwO2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47bWluLXdpZHRoOjFweDttaW4taGVpZ2h0OjFweH0uY2RrLWdsb2JhbC1zY3JvbGxibG9ja1tfbmdjb250ZW50LSVDT01QJV17cG9zaXRpb246Zml4ZWQ7d2lkdGg6MTAwJTtvdmVyZmxvdy15OnNjcm9sbH1Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLXN0YXJ0e31Aa2V5ZnJhbWVzIGNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZHt9LmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLW1vbml0b3JlZFtfbmdjb250ZW50LSVDT01QJV06LXdlYmtpdC1hdXRvZmlsbHthbmltYXRpb246Y2RrLXRleHQtZmllbGQtYXV0b2ZpbGwtc3RhcnQgMHMgMW1zfS5jZGstdGV4dC1maWVsZC1hdXRvZmlsbC1tb25pdG9yZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCg6LXdlYmtpdC1hdXRvZmlsbCl7YW5pbWF0aW9uOmNkay10ZXh0LWZpZWxkLWF1dG9maWxsLWVuZCAwcyAxbXN9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplW19uZ2NvbnRlbnQtJUNPTVAlXXtyZXNpemU6bm9uZX10ZXh0YXJlYS5jZGstdGV4dGFyZWEtYXV0b3NpemUtbWVhc3VyaW5nW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDphdXRvICFpbXBvcnRhbnQ7b3ZlcmZsb3c6aGlkZGVuICFpbXBvcnRhbnR9dGV4dGFyZWEuY2RrLXRleHRhcmVhLWF1dG9zaXplLW1lYXN1cmluZy1maXJlZm94W19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjJweCAwICFpbXBvcnRhbnQ7Ym94LXNpemluZzpjb250ZW50LWJveCAhaW1wb3J0YW50O2hlaWdodDowICFpbXBvcnRhbnR9Lm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xKX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXI6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKSwgLm1hdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1vcHRpb24tbXVsdGlwbGUpOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1vcHRpb24ubWF0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDpyZ2JhKDAsMCwwLC4wNCk7Y29sb3I6IzIxMjEyMX0ubWF0LW9wdGlvbi5tYXQtb3B0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZjU3YzAwfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LW9wdGlvbi1kaXNhYmxlZCl7Y29sb3I6I2Y0NDMzNn0ubWF0LW9wdGdyb3VwLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtb3B0Z3JvdXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRncm91cC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtcHNldWRvLWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2ZhZmFmYX0ubWF0LXBzZXVkby1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2IwYjBiMH0ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDB9Lm1hdC1wc2V1ZG8tY2hlY2tib3gtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wc2V1ZG8tY2hlY2tib3gtaW5kZXRlcm1pbmF0ZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHNldWRvLWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y0NDMzNn0ubWF0LXBzZXVkby1jaGVja2JveC1jaGVja2VkLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBzZXVkby1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1wc2V1ZG8tY2hlY2tib3gtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2IwYjBiMH0ubWF0LWVsZXZhdGlvbi16MFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXozW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggNHB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA0cHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMTBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16NVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNXB4IDhweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDE0cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDNweCA1cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDZweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggMThweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16N1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggNHB4IDVweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggN3B4IDEwcHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDJweCAxNnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXo4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDVweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDlweCAxMnB4IDFweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAzcHggMTZweCAycHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTBbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDZweCA2cHggLTNweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEwcHggMTRweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNHB4IDE4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejExW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA2cHggN3B4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxMXB4IDE1cHggMXB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDRweCAyMHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggN3B4IDhweCAtNHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTJweCAxN3B4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA1cHggMjJweCA0cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTNbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEzcHggMTlweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDI0cHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA3cHggOXB4IC00cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNHB4IDIxcHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDVweCAyNnB4IDRweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxNVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDlweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTVweCAyMnB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMjhweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTZbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDhweCAxMHB4IC01cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxNnB4IDI0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDZweCAzMHB4IDVweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoxN1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDExcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE3cHggMjZweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMycHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1lbGV2YXRpb24tejE4W19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCA5cHggMTFweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMThweCAyOHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA3cHggMzRweCA2cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWVsZXZhdGlvbi16MTlbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDlweCAxMnB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxOXB4IDI5cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDdweCAzNnB4IDZweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMHB4IDMxcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCAzOHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMVtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxM3B4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMXB4IDMzcHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MHB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyMltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTBweCAxNHB4IC02cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyMnB4IDM1cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDhweCA0MnB4IDdweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyM1tfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNHB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyM3B4IDM2cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NHB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZWxldmF0aW9uLXoyNFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggMTFweCAxNXB4IC03cHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAyNHB4IDM4cHggM3B4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDlweCA0NnB4IDhweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtYXBwLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYTtjb2xvcjojMjEyMTIxfS5tYXQtdGhlbWUtbG9hZGVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYXV0b2NvbXBsZXRlLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hdXRvY29tcGxldGUtcGFuZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1vcHRpb24ubWF0LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1hY3RpdmUpOm5vdCg6aG92ZXIpe2JhY2tncm91bmQ6I2ZmZn0ubWF0LWF1dG9jb21wbGV0ZS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LW9wdGlvbi5tYXQtc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWFjdGl2ZSk6bm90KDpob3Zlcik6bm90KC5tYXQtb3B0aW9uLWRpc2FibGVkKXtjb2xvcjojMjEyMTIxfS5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZjtiYWNrZ3JvdW5kOiNmNTdjMDB9LmNkay1oaWdoLWNvbnRyYXN0LWFjdGl2ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde291dGxpbmU6c29saWQgMXB4O2JvcmRlci1yYWRpdXM6MH0ubWF0LWJhZGdlLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtYmFkZ2Utd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtYmFkZ2VbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOnJlbGF0aXZlfS5tYXQtYmFkZ2UtaGlkZGVuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpub25lfS5tYXQtYmFkZ2UtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNiOWI5Yjk7Y29sb3I6Izc1NzU3NX0ubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3Bvc2l0aW9uOmFic29sdXRlO3RleHQtYWxpZ246Y2VudGVyO2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlci1yYWRpdXM6NTAlO3RyYW5zaXRpb246dHJhbnNmb3JtIDIwMG1zIGVhc2UtaW4tb3V0O3RyYW5zZm9ybTpzY2FsZSgwLjYpO292ZXJmbG93OmhpZGRlbjt3aGl0ZS1zcGFjZTpub3dyYXA7dGV4dC1vdmVyZmxvdzplbGxpcHNpcztwb2ludGVyLWV2ZW50czpub25lfS5uZy1hbmltYXRlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYmFkZ2UtY29udGVudC5fbWF0LWFuaW1hdGlvbi1ub29wYWJsZVtfbmdjb250ZW50LSVDT01QJV17dHJhbnNpdGlvbjpub25lfS5tYXQtYmFkZ2UtY29udGVudC5tYXQtYmFkZ2UtYWN0aXZlW19uZ2NvbnRlbnQtJUNPTVAlXXt0cmFuc2Zvcm06bm9uZX0ubWF0LWJhZGdlLXNtYWxsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTZweDtoZWlnaHQ6MTZweDtsaW5lLWhlaWdodDoxNnB4fS5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi04cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYmVsb3dbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3R0b206LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xNnB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMTZweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTE2cHh9Lm1hdC1iYWRnZS1zbWFsbC5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LThweH0ubWF0LWJhZGdlLXNtYWxsLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi04cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2Utc21hbGwubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi04cHh9Lm1hdC1iYWRnZS1tZWRpdW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXt3aWR0aDoyMnB4O2hlaWdodDoyMnB4O2xpbmUtaGVpZ2h0OjIycHh9Lm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFib3ZlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17dG9wOi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTFweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWJlZm9yZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2xlZnQ6YXV0bztyaWdodDotMjJweH0ubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjJweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1tZWRpdW0ubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0yMnB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xMXB4fS5tYXQtYmFkZ2UtbWVkaXVtLm1hdC1iYWRnZS1vdmVybGFwLm1hdC1iYWRnZS1hZnRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3JpZ2h0Oi0xMXB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLW1lZGl1bS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTExcHh9Lm1hdC1iYWRnZS1sYXJnZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3dpZHRoOjI4cHg7aGVpZ2h0OjI4cHg7bGluZS1oZWlnaHQ6MjhweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1hYm92ZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde3RvcDotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWxvd1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JvdHRvbTotMTRweH0ubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0Oi0yOHB4fVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJhZGdlLWxhcmdlLm1hdC1iYWRnZS1iZWZvcmVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtsZWZ0OmF1dG87cmlnaHQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDotMjhweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2UtYWZ0ZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtyaWdodDphdXRvO2xlZnQ6LTI4cHh9Lm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDotMTRweH1bZGlyPXJ0bF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1iYWRnZS1sYXJnZS5tYXQtYmFkZ2Utb3ZlcmxhcC5tYXQtYmFkZ2UtYmVmb3JlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17bGVmdDphdXRvO3JpZ2h0Oi0xNHB4fS5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6LTE0cHh9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtbGFyZ2UubWF0LWJhZGdlLW92ZXJsYXAubWF0LWJhZGdlLWFmdGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYmFkZ2UtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17cmlnaHQ6YXV0bztsZWZ0Oi0xNHB4fS5tYXQtYm90dG9tLXNoZWV0LWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggOHB4IDEwcHggLTVweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDE2cHggMjRweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNnB4IDMwcHggNXB4IHJnYmEoMCwgMCwgMCwgMC4xMik7YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6aW5oZXJpdDtiYWNrZ3JvdW5kOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3Ryb2tlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zdHJva2VkLWJ1dHRvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtaWNvbi1idXR0b25bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi1mb2N1cy1vdmVybGF5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnRyYW5zcGFyZW50fS5tYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0cm9rZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjE7YmFja2dyb3VuZC1jb2xvcjpjdXJyZW50Q29sb3J9Lm1hdC1idXR0b24tZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojMDAwfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZmxhdC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZsYXQtYnV0dG9uW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtcHJpbWFyeVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiW2Rpc2FibGVkXVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtZmxhdC1idXR0b24ubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmxhdC1idXR0b24ubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mbGF0LWJ1dHRvbltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFpc2VkLWJ1dHRvbi5tYXQtd2FybltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b25bZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1hY2NlbnRbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWJbZGlzYWJsZWRdW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXByaW1hcnlbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbWluaS1mYWIubWF0LXdhcm5bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZsYXQtYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1pbmktZmFiLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhaXNlZC1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mYWIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1mbGF0LWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWlzZWQtYnV0dG9uLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1taW5pLWZhYi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtc3Ryb2tlZC1idXR0b25bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LWZsYXQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAzcHggMXB4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAycHggMnB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggNXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtcmFpc2VkLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV06bm90KFtkaXNhYmxlZF0pOmFjdGl2ZTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCA1cHggNXB4IC0zcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCA4cHggMTBweCAxcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggM3B4IDE0cHggMnB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1yYWlzZWQtYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pLCAubWF0LW1pbmktZmFiW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2Rpc2FibGVkXSk6YWN0aXZlOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDdweCA4cHggLTRweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDEycHggMTdweCAycHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggNXB4IDIycHggNHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1mYWJbZGlzYWJsZWRdW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKSwgLm1hdC1taW5pLWZhYltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMHB4IDBweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cFtfbmdjb250ZW50LSVDT01QJV17Ym94LXNoYWRvdzowcHggM3B4IDFweCAtMnB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMnB4IDJweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6bm9uZX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlLWZvY3VzLW92ZXJsYXlbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JhY2tncm91bmQ6I2ZmZn0ubWF0LWJ1dHRvbi10b2dnbGUtYXBwZWFyYW5jZS1zdGFuZGFyZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWJ1dHRvbi10b2dnbGUtZm9jdXMtb3ZlcmxheVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9W2Rpcj1ydGxdW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZS1ncm91cC1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0gKyAubWF0LWJ1dHRvbi10b2dnbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1sZWZ0Om5vbmU7Ym9yZGVyLXJpZ2h0OnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWJ1dHRvbi10b2dnbGUtdmVydGljYWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1idXR0b24tdG9nZ2xlW19uZ2NvbnRlbnQtJUNPTVAlXSArIC5tYXQtYnV0dG9uLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWxlZnQ6bm9uZTtib3JkZXItcmlnaHQ6bm9uZTtib3JkZXItdG9wOnNvbGlkIDFweCByZ2JhKDAsMCwwLC4xMil9Lm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2UwZTBlMDtjb2xvcjojNjE2MTYxfS5tYXQtYnV0dG9uLXRvZ2dsZS1jaGVja2VkLm1hdC1idXR0b24tdG9nZ2xlLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNik7YmFja2dyb3VuZC1jb2xvcjojZWVlfS5tYXQtYnV0dG9uLXRvZ2dsZS1kaXNhYmxlZC5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1idXR0b24tdG9nZ2xlLWRpc2FibGVkLm1hdC1idXR0b24tdG9nZ2xlLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2JkYmRiZH0ubWF0LWJ1dHRvbi10b2dnbGUtc3RhbmRhbG9uZS5tYXQtYnV0dG9uLXRvZ2dsZS1hcHBlYXJhbmNlLXN0YW5kYXJkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1idXR0b24tdG9nZ2xlLWdyb3VwLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVde2JvcmRlcjpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FyZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1jYXJkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2FyZC5tYXQtY2FyZC1mbGF0W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2NsYXNzKj1tYXQtZWxldmF0aW9uLXpdKXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1jYXJkLXN1YnRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtZnJhbWVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNjE2MTYxfS5tYXQtY2hlY2tib3gtY2hlY2ttYXJrW19uZ2NvbnRlbnQtJUNPTVAlXXtmaWxsOiNmYWZhZmF9Lm1hdC1jaGVja2JveC1jaGVja21hcmstcGF0aFtfbmdjb250ZW50LSVDT01QJV17c3Ryb2tlOiNmYWZhZmEgIWltcG9ydGFudH0ubWF0LWNoZWNrYm94LW1peGVkbWFya1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmFmYWZhfS5tYXQtY2hlY2tib3gtaW5kZXRlcm1pbmF0ZS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94LWNoZWNrZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveC1jaGVja2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1jaGVja2JveC1pbmRldGVybWluYXRlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtY2hlY2tlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoZWNrYm94LWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LWNoZWNrYm94LWRpc2FibGVkLm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3gtZGlzYWJsZWQubWF0LWNoZWNrYm94LWluZGV0ZXJtaW5hdGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jaGVja2JveC1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNiMGIwYjB9Lm1hdC1jaGVja2JveC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hlY2tib3gtY2hlY2tlZCkgICAubWF0LWNoZWNrYm94LWZyYW1lW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2IwYjBiMH0ubWF0LWNoZWNrYm94LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hlY2tib3gtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiMwMDB9Lm1hdC1jaGVja2JveC1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LXByaW1hcnkgICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1jaGVja2JveFtfbmdjb250ZW50LSVDT01QJV06YWN0aXZlOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtcHJpbWFyeSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2Y1N2MwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtYWNjZW50ICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtY2hlY2tib3hbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZTpub3QoLm1hdC1jaGVja2JveC1kaXNhYmxlZCkubWF0LWFjY2VudCAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmOTgwMH0ubWF0LWNoZWNrYm94LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrYm94LWRpc2FibGVkKS5tYXQtd2FybiAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWNoZWNrYm94W19uZ2NvbnRlbnQtJUNPTVAlXTphY3RpdmU6bm90KC5tYXQtY2hlY2tib3gtZGlzYWJsZWQpLm1hdC13YXJuICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjQ0MzM2fS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZTBlMGUwO2NvbG9yOiMyMTIxMjF9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjE7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXBbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoaXAtZGlzYWJsZWQpOmFjdGl2ZXtib3gtc2hhZG93OjBweCAzcHggM3B4IC0ycHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAzcHggNHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2hpcC1kaXNhYmxlZCkgICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntvcGFjaXR5Oi41NH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVde29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZDojMDAwfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwO2NvbG9yOiNmZmZ9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC4xKX0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNjtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNoaXAtcmVtb3ZlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmO29wYWNpdHk6LjR9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMSl9Lm1hdC1jaGlwLm1hdC1zdGFuZGFyZC1jaGlwLm1hdC1jaGlwLXNlbGVjdGVkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMDtjb2xvcjojZmZmfS5tYXQtY2hpcC5tYXQtc3RhbmRhcmQtY2hpcC5tYXQtY2hpcC1zZWxlY3RlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2hpcC1yZW1vdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmY7b3BhY2l0eTouNH0ubWF0LWNoaXAubWF0LXN0YW5kYXJkLWNoaXAubWF0LWNoaXAtc2VsZWN0ZWQubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDI1NSwyNTUsLjEpfS5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6I2ZmZn0ubWF0LXRhYmxlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIHRoZWFkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZVtfbmdjb250ZW50LSVDT01QJV0gICB0Ym9keVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFibGVbX25nY29udGVudC0lQ09NUCVdICAgdGZvb3RbX25nY29udGVudC0lQ09NUCVdLCBtYXQtaGVhZGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIG1hdC1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIFttYXQtaGVhZGVyLXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LXJvd11bX25nY29udGVudC0lQ09NUCVdLCBbbWF0LWZvb3Rlci1yb3ddW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWJsZS1zdGlja3lbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6aW5oZXJpdH1tYXQtcm93W19uZ2NvbnRlbnQtJUNPTVAlXSwgbWF0LWhlYWRlci1yb3dbX25nY29udGVudC0lQ09NUCVdLCBtYXQtZm9vdGVyLXJvd1tfbmdjb250ZW50LSVDT01QJV0sIHRoLm1hdC1oZWFkZXItY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIHRkLm1hdC1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgdGQubWF0LWZvb3Rlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWhlYWRlci1jZWxsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtY2VsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZm9vdGVyLWNlbGxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1jYWxlbmRhci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC41NCl9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtZGF0ZXBpY2tlci1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItbmV4dC1idXR0b25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWRhdGVwaWNrZXItY29udGVudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWNhbGVuZGFyLXByZXZpb3VzLWJ1dHRvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtY2FsZW5kYXItdGFibGUtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1jYWxlbmRhci10YWJsZS1oZWFkZXItZGl2aWRlcltfbmdjb250ZW50LSVDT01QJV06OmFmdGVye2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtY2FsZW5kYXItYm9keS1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxO2JvcmRlci1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7Y29sb3I6Izc1NzU3NX0ubWF0LWNhbGVuZGFyLWJvZHktY2VsbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZCk6aG92ZXIgPiAubWF0LWNhbGVuZGFyLWJvZHktY2VsbC1jb250ZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKSwgLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCksIC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LWNlbGwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4wNCl9Lm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkKXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktdG9kYXlbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWQpe2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4xOCl9Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LWNhbGVuZGFyLWJvZHktZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdID4gLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjQ1LDEyNCwwLC40KX0ubWF0LWNhbGVuZGFyLWJvZHktdG9kYXkubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6aW5zZXQgMCAwIDAgMXB4ICNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZmZjtjb2xvcjojMjEyMTIxfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDA7Y29sb3I6I2ZmZn0ubWF0LWRhdGVwaWNrZXItY29udGVudC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gPiAubWF0LWNhbGVuZGFyLWJvZHktc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjQpfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2O2NvbG9yOiNmZmZ9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSA+IC5tYXQtY2FsZW5kYXItYm9keS1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI0NCw2Nyw1NCwuNCl9Lm1hdC1kYXRlcGlja2VyLWNvbnRlbnQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1jYWxlbmRhci1ib2R5LXRvZGF5Lm1hdC1jYWxlbmRhci1ib2R5LXNlbGVjdGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93Omluc2V0IDAgMCAwIDFweCAjZmZmfS5tYXQtZGF0ZXBpY2tlci1jb250ZW50LXRvdWNoW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAwcHggMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDBweCAwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1kYXRlcGlja2VyLXRvZ2dsZS1hY3RpdmUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWRhdGVwaWNrZXItdG9nZ2xlLWFjdGl2ZS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWRpYWxvZy1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2JveC1zaGFkb3c6MHB4IDExcHggMTVweCAtN3B4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMjRweCAzOHB4IDNweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA5cHggNDZweCA4cHggcmdiYSgwLCAwLCAwLCAwLjEyKTtiYWNrZ3JvdW5kOiNmZmY7Y29sb3I6IzIxMjEyMX0ubWF0LWRpdmlkZXJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci10b3AtY29sb3I6cmdiYSgwLDAsMCwuMTIpfS5tYXQtZGl2aWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXJpZ2h0LWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDNweCAxcHggLTJweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDJweCAycHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1hY3Rpb24tcm93W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXIuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbYXJpYS1kaXNhYmxlZD10cnVlXSksIC5tYXQtZXhwYW5zaW9uLXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pLCAubWF0LWV4cGFuc2lvbi1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtZXhwYW5kZWQpICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pe2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1leHBhbnNpb24tcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWV4cGFuZGVkKTpub3QoW2FyaWEtZGlzYWJsZWQ9dHJ1ZV0pICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlcntiYWNrZ3JvdW5kOiNmZmZ9fS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlci10aXRsZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWV4cGFuc2lvbi1wYW5lbC1oZWFkZXItZGVzY3JpcHRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LWV4cGFuc2lvbi1pbmRpY2F0b3JbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNjE2MTYxfS5tYXQtZXhwYW5zaW9uLXBhbmVsLWhlYWRlclthcmlhLWRpc2FibGVkPXRydWVdW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4yNil9Lm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLXRpdGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyW2FyaWEtZGlzYWJsZWQ9dHJ1ZV1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1leHBhbnNpb24tcGFuZWwtaGVhZGVyLWRlc2NyaXB0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNil9Lm1hdC1oaW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDk3LDk3LDk3LC42KX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWwubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmVxdWlyZWQtbWFya2VyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1yaXBwbGUubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3QubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWZvcm0tZmllbGQtaW52YWxpZCkgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZjU3YzAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC1hY2NlbnQgICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1mb3JtLWZpZWxkLWludmFsaWQpLm1hdC13YXJuICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJlcXVpcmVkLW1hcmtlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQubWF0LWZvcm0tZmllbGQtaW52YWxpZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXJpcHBsZS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1lcnJvcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y0NDMzNn0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1sZWdhY3lbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWhpbnRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2UtbGVnYWN5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWxlZ2FjeS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtdW5kZXJsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWltYWdlOmxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjQyKSAwJSwgcmdiYSgwLCAwLCAwLCAwLjQyKSAzMyUsIHRyYW5zcGFyZW50IDAlKTtiYWNrZ3JvdW5kLXNpemU6NHB4IDEwMCU7YmFja2dyb3VuZC1yZXBlYXQ6cmVwZWF0LXh9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC40Mil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utc3RhbmRhcmQubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpsaW5lYXItZ3JhZGllbnQodG8gcmlnaHQsIHJnYmEoMCwgMCwgMCwgMC40MikgMCUsIHJnYmEoMCwgMCwgMCwgMC40MikgMzMlLCB0cmFuc3BhcmVudCAwJSk7YmFja2dyb3VuZC1zaXplOjRweCAxMDAlO2JhY2tncm91bmQtcmVwZWF0OnJlcGVhdC14fS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGwubWF0LWZvcm0tZmllbGQtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWZsZXhbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDIpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLWZpbGxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjQyKX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6Izc1NzU3NX0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1maWxsLm1hdC1mb3JtLWZpZWxkLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC11bmRlcmxpbmVbX25nY29udGVudC0lQ09NUCVdOjpiZWZvcmV7YmFja2dyb3VuZC1jb2xvcjp0cmFuc3BhcmVudH0ubWF0LWZvcm0tZmllbGQtYXBwZWFyYW5jZS1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZS10aGlja1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9jdXNlZC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9ybS1maWVsZC1vdXRsaW5lLXRoaWNrW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmY5ODAwfS5tYXQtZm9ybS1maWVsZC1hcHBlYXJhbmNlLW91dGxpbmUubWF0LWZvY3VzZWQubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1pbnZhbGlkLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLW91dGxpbmUtdGhpY2tbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1mb3JtLWZpZWxkLWFwcGVhcmFuY2Utb3V0bGluZS5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtb3V0bGluZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMDYpfS5tYXQtaWNvbi5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2Y1N2MwMH0ubWF0LWljb24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH0ubWF0LWljb24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkLXR5cGUtbWF0LW5hdGl2ZS1zZWxlY3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6IzYxNjE2MX0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOmRpc2FibGVkLCAubWF0LWZvcm0tZmllbGQtdHlwZS1tYXQtbmF0aXZlLXNlbGVjdC5tYXQtZm9ybS1maWVsZC1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtaW5maXhbX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjojNzU3NTc1fS5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2Y1N2MwMH0ubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVdOjpwbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LW1vei1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTo6LXdlYmtpdC1pbnB1dC1wbGFjZWhvbGRlcntjb2xvcjpyZ2JhKDk3LDk3LDk3LC40Mil9Lm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTotbXMtaW5wdXQtcGxhY2Vob2xkZXJ7Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5wdXQtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17Y2FyZXQtY29sb3I6I2ZmOTgwMH0ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbnB1dC1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtjYXJldC1jb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZC10eXBlLW1hdC1uYXRpdmUtc2VsZWN0Lm1hdC1mb3JtLWZpZWxkLWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWluZml4W19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6I2Y0NDMzNn0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LWxpc3QtYmFzZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3Qtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojMjEyMTIxfS5tYXQtbGlzdC1iYXNlW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3ViaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtbGlzdC1pdGVtLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNlZWV9Lm1hdC1saXN0LW9wdGlvbltfbmdjb250ZW50LSVDT01QJV06aG92ZXIsIC5tYXQtbGlzdC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3VzLCAubWF0LW5hdi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1uYXYtbGlzdFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWxpc3QtaXRlbVtfbmdjb250ZW50LSVDT01QJV06Zm9jdXMsIC5tYXQtYWN0aW9uLWxpc3RbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1saXN0LWl0ZW1bX25nY29udGVudC0lQ09NUCVdOmhvdmVyLCAubWF0LWFjdGlvbi1saXN0W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtbGlzdC1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpmb2N1c3tiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LWxpc3Qtc2luZ2xlLXNlbGVjdGVkLW9wdGlvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtbGlzdC1zaW5nbGUtc2VsZWN0ZWQtb3B0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXTpob3ZlciwgLm1hdC1saXN0LXNpbmdsZS1zZWxlY3RlZC1vcHRpb25bX25nY29udGVudC0lQ09NUCVdOmZvY3Vze2JhY2tncm91bmQ6cmdiYSgwLDAsMCwuMTIpfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtbWVudS1wYW5lbFtfbmdjb250ZW50LSVDT01QJV06bm90KFtjbGFzcyo9bWF0LWVsZXZhdGlvbi16XSl7Ym94LXNoYWRvdzowcHggMnB4IDRweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNHB4IDVweCAwcHggcmdiYSgwLCAwLCAwLCAwLjE0KSwwcHggMXB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xMil9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6dHJhbnNwYXJlbnQ7Y29sb3I6IzIxMjEyMX0ubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdLCAubWF0LW1lbnUtaXRlbVtkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdOjphZnRlcntjb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1tZW51LWl0ZW1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pY29uLW5vLWNvbG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1tZW51LWl0ZW0tc3VibWVudS10cmlnZ2VyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Y29sb3I6cmdiYSgwLDAsMCwuNTQpfS5tYXQtbWVudS1pdGVtW19uZ2NvbnRlbnQtJUNPTVAlXTpob3Zlcjpub3QoW2Rpc2FibGVkXSksIC5tYXQtbWVudS1pdGVtLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0uY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKSwgLm1hdC1tZW51LWl0ZW0taGlnaGxpZ2h0ZWRbX25nY29udGVudC0lQ09NUCVdOm5vdChbZGlzYWJsZWRdKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjA0KX0ubWF0LXBhZ2luYXRvcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmZmfS5tYXQtcGFnaW5hdG9yW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItcGFnZS1zaXplW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXRyaWdnZXJbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM2MTYxNjF9Lm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCk7Ym9yZGVyLXJpZ2h0OjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjJweCBzb2xpZCByZ2JhKDAsMCwwLC41NCl9Lm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZGVjcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItaW5jcmVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1pY29uLWJ1dHRvbltkaXNhYmxlZF1bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wYWdpbmF0b3ItZmlyc3RbX25nY29udGVudC0lQ09NUCVdLCAubWF0LWljb24tYnV0dG9uW2Rpc2FibGVkXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXBhZ2luYXRvci1sYXN0W19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV17ZmlsbDojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1wcm9ncmVzcy1iYXItYnVmZmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1wcm9ncmVzcy1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZmY5ODAwfS5tYXQtcHJvZ3Jlc3MtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcHJvZ3Jlc3MtYmFyLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2ZpbGw6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1idWZmZXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmY2RkMn0ubWF0LXByb2dyZXNzLWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXByb2dyZXNzLWJhci1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lcltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXJbX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y1N2MwMH0ubWF0LXByb2dyZXNzLXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVde3N0cm9rZTojZmY5ODAwfS5tYXQtcHJvZ3Jlc3Mtc3Bpbm5lci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICBjaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNwaW5uZXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtzdHJva2U6I2Y0NDMzNn0ubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiM2MTYxNjF9Lm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnkubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1vdXRlci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZjU3YzAwfS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGUpLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcHJpbWFyeS5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXBlcnNpc3RlbnQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50Lm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tb3V0ZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8taW5uZXItY2lyY2xlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1yYWRpby1idXR0b24ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnQubWF0LXJhZGlvLWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdOmFjdGl2ZSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybi5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOiNmNDQzMzZ9Lm1hdC1yYWRpby1idXR0b24ubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1pbm5lci1jaXJjbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZSksIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC13YXJuLm1hdC1yYWRpby1jaGVja2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tcGVyc2lzdGVudC1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXJhZGlvLWJ1dHRvbi5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV06YWN0aXZlICAgLm1hdC1yYWRpby1wZXJzaXN0ZW50LXJpcHBsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZC5tYXQtcmFkaW8tY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLW91dGVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXJhZGlvLWJ1dHRvbi5tYXQtcmFkaW8tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yYWRpby1yaXBwbGVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtcmFkaW8tYnV0dG9uLm1hdC1yYWRpby1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJhZGlvLWlubmVyLWNpcmNsZVtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1yYWRpby1idXR0b24ubWF0LXJhZGlvLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmFkaW8tbGFiZWwtY29udGVudFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtcmFkaW8tYnV0dG9uW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzAwMH0ubWF0LXNlbGVjdC12YWx1ZVtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXNlbGVjdC1wbGFjZWhvbGRlcltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSg5Nyw5Nyw5NywuNDIpfS5tYXQtc2VsZWN0LWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC1zZWxlY3QtcGFuZWxbX25nY29udGVudC0lQ09NUCVdOm5vdChbY2xhc3MqPW1hdC1lbGV2YXRpb24tel0pe2JveC1zaGFkb3c6MHB4IDJweCA0cHggLTFweCByZ2JhKDAsIDAsIDAsIDAuMiksMHB4IDRweCA1cHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxMHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2VsZWN0LXBhbmVsW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtb3B0aW9uLm1hdC1zZWxlY3RlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtb3B0aW9uLW11bHRpcGxlKXtiYWNrZ3JvdW5kOnJnYmEoMCwwLDAsLjEyKX0ubWF0LWZvcm0tZmllbGQubWF0LWZvY3VzZWQubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNTdjMDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZjk4MDB9Lm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZjQ0MzM2fS5tYXQtZm9ybS1maWVsZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNlbGVjdC5tYXQtc2VsZWN0LWludmFsaWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1mb3JtLWZpZWxkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0Lm1hdC1zZWxlY3QtZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiM3NTc1NzV9Lm1hdC1kcmF3ZXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmYWZhZmE7Y29sb3I6IzIxMjEyMX0ubWF0LWRyYXdlcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmO2NvbG9yOiMyMTIxMjF9Lm1hdC1kcmF3ZXIubWF0LWRyYXdlci1wdXNoW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC1kcmF3ZXJbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWRyYXdlci1zaWRlKXtib3gtc2hhZG93OjBweCA4cHggMTBweCAtNXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggMTZweCAyNHB4IDJweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCA2cHggMzBweCA1cHggcmdiYSgwLCAwLCAwLCAwLjEyKX0ubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItcmlnaHQ6c29saWQgMXB4IHJnYmEoMCwwLDAsLjEyKX0ubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpO2JvcmRlci1yaWdodDpub25lfVtkaXI9cnRsXVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWRyYXdlci1zaWRlLm1hdC1kcmF3ZXItZW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItbGVmdDpub25lO2JvcmRlci1yaWdodDpzb2xpZCAxcHggcmdiYSgwLDAsMCwuMTIpfS5tYXQtZHJhd2VyLWJhY2tkcm9wLm1hdC1kcmF3ZXItc2hvd25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuNil9Lm1hdC1zbGlkZS10b2dnbGUubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXByaW1hcnkubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMH0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDUsMTI0LDAsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtcHJpbWFyeS5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1zbGlkZS10b2dnbGUubWF0LXdhcm4ubWF0LWNoZWNrZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZS10b2dnbGUtdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y0NDMzNn0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDQsNjcsNTQsLjU0KX0ubWF0LXNsaWRlLXRvZ2dsZS5tYXQtd2Fybi5tYXQtY2hlY2tlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC1zbGlkZS10b2dnbGVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LWNoZWNrZWQpICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojMDAwfS5tYXQtc2xpZGUtdG9nZ2xlLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3gtc2hhZG93OjBweCAycHggMXB4IC0xcHggcmdiYSgwLCAwLCAwLCAwLjIpLDBweCAxcHggMXB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTQpLDBweCAxcHggM3B4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpO2JhY2tncm91bmQtY29sb3I6I2ZhZmFmYX0ubWF0LXNsaWRlLXRvZ2dsZS1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMzgpfS5tYXQtc2xpZGVyLXRyYWNrLWJhY2tncm91bmRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYi1sYWJlbC10ZXh0W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojZmZmfS5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1maWxsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXRleHRbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwxNTIsMCwuMil9Lm1hdC1zbGlkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVyICAgLm1hdC1zbGlkZXItdHJhY2stYmFja2dyb3VuZFtfbmdjb250ZW50LSVDT01QJV0sIC5jZGstZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjM4KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdHJhY2stZmlsbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV06aG92ZXIgICAubWF0LXNsaWRlci10cmFjay1iYWNrZ3JvdW5kW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItZm9jdXMtcmluZ1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zbGlkZXItbWluLXZhbHVlLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZ1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmdbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWItbGFiZWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuODcpfS5tYXQtc2xpZGVyLW1pbi12YWx1ZS5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcuY2RrLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXNsaWRlci1taW4tdmFsdWUubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nLmNkay1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjI2KX0ubWF0LXNsaWRlci1taW4tdmFsdWVbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXNsaWRlci10aHVtYi1sYWJlbC1zaG93aW5nKSAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpO2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnR9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIgICAubWF0LXNsaWRlci10aHVtYltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc2xpZGVyLW1pbi12YWx1ZVtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtc2xpZGVyLXRodW1iLWxhYmVsLXNob3dpbmcpLmNkay1mb2N1c2VkICAgLm1hdC1zbGlkZXItdGh1bWJbX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDAsMCwwLC4zOCl9Lm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZyk6aG92ZXIubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC1zbGlkZXItbWluLXZhbHVlW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC1zbGlkZXItdGh1bWItbGFiZWwtc2hvd2luZykuY2RrLWZvY3VzZWQubWF0LXNsaWRlci1kaXNhYmxlZCAgIC5tYXQtc2xpZGVyLXRodW1iW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgwLDAsMCwuMjYpfS5tYXQtc2xpZGVyLWhhcy10aWNrc1tfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci13cmFwcGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YWZ0ZXJ7Ym9yZGVyLWNvbG9yOnJnYmEoMCwwLDAsLjcpfS5tYXQtc2xpZGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zbGlkZXItdGlja3NbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtaW1hZ2U6cmVwZWF0aW5nLWxpbmVhci1ncmFkaWVudCh0byByaWdodCwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCk7YmFja2dyb3VuZC1pbWFnZTotbW96LXJlcGVhdGluZy1saW5lYXItZ3JhZGllbnQoMC4wMDAxZGVnLCByZ2JhKDAsIDAsIDAsIDAuNyksIHJnYmEoMCwgMCwgMCwgMC43KSAycHgsIHRyYW5zcGFyZW50IDAsIHRyYW5zcGFyZW50KX0ubWF0LXNsaWRlci12ZXJ0aWNhbFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXNsaWRlci10aWNrc1tfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1pbWFnZTpyZXBlYXRpbmctbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgcmdiYSgwLCAwLCAwLCAwLjcpLCByZ2JhKDAsIDAsIDAsIDAuNykgMnB4LCB0cmFuc3BhcmVudCAwLCB0cmFuc3BhcmVudCl9Lm1hdC1zdGVwLWhlYWRlci5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXIuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOmhvdmVye2JhY2tncm91bmQtY29sb3I6cmdiYSgwLDAsMCwuMDQpfUBtZWRpYShob3Zlcjogbm9uZSl7Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV06aG92ZXJ7YmFja2dyb3VuZDpub25lfX0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLW9wdGlvbmFsW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNjE2MTYxfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb25bX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6IzYxNjE2MTtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc2VsZWN0ZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWRvbmVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1pY29uLXN0YXRlLWVkaXRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2Y1N2MwMDtjb2xvcjojZmZmfS5tYXQtc3RlcC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zdGVwLWljb24tc3RhdGUtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6dHJhbnNwYXJlbnQ7Y29sb3I6I2Y0NDMzNn0ubWF0LXN0ZXAtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc3RlcC1sYWJlbC5tYXQtc3RlcC1sYWJlbC1hY3RpdmVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zdGVwLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXN0ZXAtbGFiZWwubWF0LXN0ZXAtbGFiZWwtZXJyb3JbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmNDQzMzZ9Lm1hdC1zdGVwcGVyLWhvcml6b250YWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXN0ZXBwZXItdmVydGljYWxbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmZn0ubWF0LXN0ZXBwZXItdmVydGljYWwtbGluZVtfbmdjb250ZW50LSVDT01QJV06OmJlZm9yZXtib3JkZXItbGVmdC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1ob3Jpem9udGFsLXN0ZXBwZXItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXTo6YmVmb3JlLCAubWF0LWhvcml6b250YWwtc3RlcHBlci1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdOjphZnRlciwgLm1hdC1zdGVwcGVyLWhvcml6b250YWwtbGluZVtfbmdjb250ZW50LSVDT01QJV17Ym9yZGVyLXRvcC1jb2xvcjpyZ2JhKDAsMCwwLC4xMil9Lm1hdC1zb3J0LWhlYWRlci1hcnJvd1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzYxNjE2MX0ubWF0LXRhYi1uYXYtYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItYm90dG9tOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMil9Lm1hdC10YWItZ3JvdXAtaW52ZXJ0ZWQtaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLW5hdi1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC1pbnZlcnRlZC1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItdG9wOjFweCBzb2xpZCByZ2JhKDAsMCwwLC4xMik7Ym9yZGVyLWJvdHRvbTpub25lfS5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6IzIxMjEyMX0ubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjojNzU3NTc1fS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojMjEyMTIxfS5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojNzU3NTc1fS5tYXQtdGFiLWdyb3VwW2NsYXNzKj1tYXQtYmFja2dyb3VuZC1dW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXJbY2xhc3MqPW1hdC1iYWNrZ3JvdW5kLV1bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1ib3R0b206bm9uZTtib3JkZXItdG9wOm5vbmV9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNTdjMDB9Lm1hdC10YWItZ3JvdXAubWF0LXByaW1hcnkubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1wcmltYXJ5Lm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6I2ZmOTgwMH0ubWF0LXRhYi1ncm91cC5tYXQtYWNjZW50Lm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1hY2NlbnQubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDIwNSwyMTAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtaW5rLWJhcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmNDQzMzZ9Lm1hdC10YWItZ3JvdXAubWF0LXdhcm4ubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWluay1iYXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC13YXJuLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1pbmstYmFyW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKXtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMjU1LDE1MiwwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjU3YzAwfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXByaW1hcnlbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtcHJpbWFyeVtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGsta2V5Ym9hcmQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5jZGstcHJvZ3JhbS1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpe2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMTUyLDAsLjMpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXJbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOiNmZjk4MDB9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiNmZmZ9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGluay5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLWFjY2VudFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC40KX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC1hY2NlbnRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1yaXBwbGUtZWxlbWVudFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtYWNjZW50W19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLmNkay1rZXlib2FyZC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXTpub3QoLm1hdC10YWItZGlzYWJsZWQpLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWwuY2RrLXByb2dyYW0tZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV06bm90KC5tYXQtdGFiLWRpc2FibGVkKSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsuY2RrLWtleWJvYXJkLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCksIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rLmNkay1wcm9ncmFtLWZvY3VzZWRbX25nY29udGVudC0lQ09NUCVdOm5vdCgubWF0LXRhYi1kaXNhYmxlZCl7YmFja2dyb3VuZC1jb2xvcjpyZ2JhKDI1NSwyMDUsMjEwLC4zKX0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua3NbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlcltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1saW5rc1tfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZC1jb2xvcjojZjQ0MzM2fS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmtbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1uYXYtYmFyLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItbGlua1tfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmZn0ubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxhYmVsLm1hdC10YWItZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRhYi1ncm91cC5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1sYWJlbC5tYXQtdGFiLWRpc2FibGVkW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWxpbmsubWF0LXRhYi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV17Y29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtdGFiLWhlYWRlci1wYWdpbmF0aW9uLWNoZXZyb25bX25nY29udGVudC0lQ09NUCVde2JvcmRlci1jb2xvcjojZmZmfS5tYXQtdGFiLWdyb3VwLm1hdC1iYWNrZ3JvdW5kLXdhcm5bX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tZGlzYWJsZWRbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC10YWItaGVhZGVyLXBhZ2luYXRpb24tY2hldnJvbltfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdGFiLW5hdi1iYXIubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1kaXNhYmxlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXRhYi1oZWFkZXItcGFnaW5hdGlvbi1jaGV2cm9uW19uZ2NvbnRlbnQtJUNPTVAlXXtib3JkZXItY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuNCl9Lm1hdC10YWItZ3JvdXAubWF0LWJhY2tncm91bmQtd2Fybltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LXJpcHBsZS1lbGVtZW50W19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10YWItbmF2LWJhci5tYXQtYmFja2dyb3VuZC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtcmlwcGxlLWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQtY29sb3I6cmdiYSgyNTUsMjU1LDI1NSwuMTIpfS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZjVmNWY1O2NvbG9yOiMyMTIxMjF9Lm1hdC10b29sYmFyLm1hdC1wcmltYXJ5W19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNTdjMDA7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXIubWF0LWFjY2VudFtfbmdjb250ZW50LSVDT01QJV17YmFja2dyb3VuZDojZmY5ODAwO2NvbG9yOiNmZmZ9Lm1hdC10b29sYmFyLm1hdC13YXJuW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmNDQzMzY7Y29sb3I6I2ZmZn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLXVuZGVybGluZVtfbmdjb250ZW50LSVDT01QJV0sIC5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtcmlwcGxlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kLWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLWxhYmVsW19uZ2NvbnRlbnQtJUNPTVAlXSwgLm1hdC10b29sYmFyW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtZm9jdXNlZFtfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWZvcm0tZmllbGQtbGFiZWxbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtdmFsdWVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1zZWxlY3QtYXJyb3dbX25nY29udGVudC0lQ09NUCVdLCAubWF0LXRvb2xiYXJbX25nY29udGVudC0lQ09NUCVdICAgLm1hdC1mb3JtLWZpZWxkLm1hdC1mb2N1c2VkW19uZ2NvbnRlbnQtJUNPTVAlXSAgIC5tYXQtc2VsZWN0LWFycm93W19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjppbmhlcml0fS5tYXQtdG9vbGJhcltfbmdjb250ZW50LSVDT01QJV0gICAubWF0LWlucHV0LWVsZW1lbnRbX25nY29udGVudC0lQ09NUCVde2NhcmV0LWNvbG9yOmN1cnJlbnRDb2xvcn0ubWF0LXRvb2x0aXBbX25nY29udGVudC0lQ09NUCVde2JhY2tncm91bmQ6cmdiYSg5Nyw5Nyw5NywuOSl9Lm1hdC10cmVlW19uZ2NvbnRlbnQtJUNPTVAlXXtiYWNrZ3JvdW5kOiNmZmZ9Lm1hdC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVdLCAubWF0LW5lc3RlZC10cmVlLW5vZGVbX25nY29udGVudC0lQ09NUCVde2NvbG9yOiMyMTIxMjF9Lm1hdC1zbmFjay1iYXItY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtjb2xvcjpyZ2JhKDI1NSwyNTUsMjU1LC43KTtiYWNrZ3JvdW5kOiMzMjMyMzI7Ym94LXNoYWRvdzowcHggM3B4IDVweCAtMXB4IHJnYmEoMCwgMCwgMCwgMC4yKSwwcHggNnB4IDEwcHggMHB4IHJnYmEoMCwgMCwgMCwgMC4xNCksMHB4IDFweCAxOHB4IDBweCByZ2JhKDAsIDAsIDAsIDAuMTIpfS5tYXQtc2ltcGxlLXNuYWNrYmFyLWFjdGlvbltfbmdjb250ZW50LSVDT01QJV17Y29sb3I6I2ZmOTgwMH1bX25naG9zdC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4LWRpcmVjdGlvbjpjb2x1bW47aGVpZ2h0OjEwMCV9LmNvbnRlbnRbX25nY29udGVudC0lQ09NUCVde2Rpc3BsYXk6ZmxleDtmbGV4OjE7bWluLWhlaWdodDowcHg7d2lkdGg6MTAwJX0uc2lkZWJhci1jb250YWluZXJbX25nY29udGVudC0lQ09NUCVde2hlaWdodDoxMDAlO292ZXJmbG93OmhpZGRlbn0uc2lkZWJhci1jb250ZW50c1tfbmdjb250ZW50LSVDT01QJV17aGVpZ2h0OjEwMCU7ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjttaW4td2lkdGg6MTUwcHh9LmFuYWx5c2lzLWNvbnRhaW5lcltfbmdjb250ZW50LSVDT01QJV17ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtoZWlnaHQ6MTAwJTtmbGV4OjEgMX0ucnVuLXNlbGVjdG9yW19uZ2NvbnRlbnQtJUNPTVAlXXtwYWRkaW5nOjEwcHg7d2lkdGg6Y2FsYygxMDAlIC0gMjBweCl9LnZpb2xpbi1maWx0ZXJzW19uZ2NvbnRlbnQtJUNPTVAlXXttaW4taGVpZ2h0OjBweDt3aWR0aDoxMDAlfS5zaWRlLXRvZ2dsZVtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MzBweDtoZWlnaHQ6MzBweDtwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjEwcHg7Ym90dG9tOjEwcHg7Ym9yZGVyOjFweCBzb2xpZCAjZWJlYmViO2JvcmRlci1yYWRpdXM6M3B4O2Rpc3BsYXk6ZmxleDthbGlnbi1pdGVtczpjZW50ZXI7anVzdGlmeS1jb250ZW50OmNlbnRlcn0uZ3JhYmJlcltfbmdjb250ZW50LSVDT01QJV17Y29udGVudDpcIlwiO2N1cnNvcjpldy1yZXNpemU7aGVpZ2h0OjEwMCU7d2lkdGg6M3B4O292ZXJmbG93OmhpZGRlbjtiYWNrZ3JvdW5kLWNvbG9yOnJnYmEoMCwwLDAsLjEyKX0uYW5ub3RhdGlvbnMtbGlzdFtfbmdjb250ZW50LSVDT01QJV17d2lkdGg6MTAwJTttaW4taGVpZ2h0OjBweDtmbGV4OjEgMX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9tYWluL21haW5fY29udGFpbmVyLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1haW5Db250YWluZXIgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihzdG9yZSkgewogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMucnVuQWN0aXZlJCA9IHRoaXMuc3RvcmUKICAgICAgICAgICAgICAgIC5waXBlKHNlbGVjdChnZXRDdXJyZW50Um91dGVSdW5TZWxlY3Rpb24pKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW5zCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAocnVucykgPT4gewogICAgICAgICAgICAgICAgaWYgKCFydW5zKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIFsuLi5ydW5zLnZhbHVlcygpXS5pbmNsdWRlcyh0cnVlKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgdGhpcy5zaWRlYmFyRXhwYW5kZWQkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRTaWRlYmFyRXhwYW5kZWQpKTsKICAgICAgICAgICAgdGhpcy5zaWRlYmFyV2lkdGgkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRTaWRlYmFyV2lkdGgpKTsKICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IGZhbHNlOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uVG9nZ2xlU2lkZWJhckV4cGFuZGVkKCkgewogICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlUb2dnbGVTaWRlYmFyRXhwYW5kZWQoKSk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gZXZlbnQKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uUmVzaXplVHJpZ2dlcmVkKGV2ZW50KSB7CiAgICAgICAgICAgIGlmICh0aGlzLnJlc2l6aW5nKSB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKG5wbWlDaGFuZ2VTaWRlYmFyV2lkdGgoewogICAgICAgICAgICAgICAgICAgIHNpZGViYXJXaWR0aDogZXZlbnQuY2xpZW50WCwKICAgICAgICAgICAgICAgIH0pKTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIG9uUmVzaXplR3JhYmJlZCgpIHsKICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IHRydWU7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICovCiAgICAgICAgb25SZXNpemVSZWxlYXNlZCgpIHsKICAgICAgICAgICAgdGhpcy5yZXNpemluZyA9IGZhbHNlOwogICAgICAgIH0KICAgIH0KICAgIE1haW5Db250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktbWFpbicsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAKICAgIDxtYWluLWNvbXBvbmVudAogICAgICBbcnVuQWN0aXZlXT0icnVuQWN0aXZlJCB8IGFzeW5jIgogICAgICBbc2lkZWJhckV4cGFuZGVkXT0ic2lkZWJhckV4cGFuZGVkJCB8IGFzeW5jIgogICAgICBbc2lkZWJhcldpZHRoXT0ic2lkZWJhcldpZHRoJCB8IGFzeW5jIgogICAgICAodG9nZ2xlU2lkZWJhckV4cGFuZGVkKT0ib25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKSIKICAgICAgKHJlc2l6ZVRyaWdnZXJlZCk9Im9uUmVzaXplVHJpZ2dlcmVkKCRldmVudCkiCiAgICAgIChyZXNpemVHcmFiYmVkKT0ib25SZXNpemVHcmFiYmVkKCkiCiAgICAgIChyZXNpemVSZWxlYXNlZCk9Im9uUmVzaXplUmVsZWFzZWQoKSIKICAgID48L21haW4tY29tcG9uZW50PgogIGAsCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE1haW5Db250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1haW5Db250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBNYWluQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1haW5Db250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNYWluQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE1haW5Db250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaS1tYWluIl1dLCBkZWNsczogNCwgdmFyczogOSwgY29uc3RzOiBbWzMsICJydW5BY3RpdmUiLCAic2lkZWJhckV4cGFuZGVkIiwgInNpZGViYXJXaWR0aCIsICJ0b2dnbGVTaWRlYmFyRXhwYW5kZWQiLCAicmVzaXplVHJpZ2dlcmVkIiwgInJlc2l6ZUdyYWJiZWQiLCAicmVzaXplUmVsZWFzZWQiXV0sIHRlbXBsYXRlOiBmdW5jdGlvbiBNYWluQ29udGFpbmVyX1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1ZWxlbWVudFN0YXJ0KDAsICJtYWluLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1bGlzdGVuZXIoInRvZ2dsZVNpZGViYXJFeHBhbmRlZCIsIGZ1bmN0aW9uIE1haW5Db250YWluZXJfVGVtcGxhdGVfbWFpbl9jb21wb25lbnRfdG9nZ2xlU2lkZWJhckV4cGFuZGVkXzBfbGlzdGVuZXIoKSB7IHJldHVybiBjdHgub25Ub2dnbGVTaWRlYmFyRXhwYW5kZWQoKTsgfSkoInJlc2l6ZVRyaWdnZXJlZCIsIGZ1bmN0aW9uIE1haW5Db250YWluZXJfVGVtcGxhdGVfbWFpbl9jb21wb25lbnRfcmVzaXplVHJpZ2dlcmVkXzBfbGlzdGVuZXIoJGV2ZW50KSB7IHJldHVybiBjdHgub25SZXNpemVUcmlnZ2VyZWQoJGV2ZW50KTsgfSkoInJlc2l6ZUdyYWJiZWQiLCBmdW5jdGlvbiBNYWluQ29udGFpbmVyX1RlbXBsYXRlX21haW5fY29tcG9uZW50X3Jlc2l6ZUdyYWJiZWRfMF9saXN0ZW5lcigpIHsgcmV0dXJuIGN0eC5vblJlc2l6ZUdyYWJiZWQoKTsgfSkoInJlc2l6ZVJlbGVhc2VkIiwgZnVuY3Rpb24gTWFpbkNvbnRhaW5lcl9UZW1wbGF0ZV9tYWluX2NvbXBvbmVudF9yZXNpemVSZWxlYXNlZF8wX2xpc3RlbmVyKCkgeyByZXR1cm4gY3R4Lm9uUmVzaXplUmVsZWFzZWQoKTsgfSk7CiAgICAgICAgICAgIMm1ybVwaXBlKDEsICJhc3luYyIpOwogICAgICAgICAgICDJtcm1cGlwZSgyLCAiYXN5bmMiKTsKICAgICAgICAgICAgybXJtXBpcGUoMywgImFzeW5jIik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIMm1ybVwcm9wZXJ0eSgicnVuQWN0aXZlIiwgybXJtXBpcGVCaW5kMSgxLCAzLCBjdHgucnVuQWN0aXZlJCkpKCJzaWRlYmFyRXhwYW5kZWQiLCDJtcm1cGlwZUJpbmQxKDIsIDUsIGN0eC5zaWRlYmFyRXhwYW5kZWQkKSkoInNpZGViYXJXaWR0aCIsIMm1ybVwaXBlQmluZDEoMywgNywgY3R4LnNpZGViYXJXaWR0aCQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtNYWluQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyLCBjaGFuZ2VEZXRlY3Rpb246IDAgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL25wbWlfY29tcG9uZW50LnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGZ1bmN0aW9uIE5wbWlDb21wb25lbnRfbnBtaV9pbmFjdGl2ZV92aWV3XzFfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm5wbWktaW5hY3RpdmUtdmlldyIpOwogICAgfSB9CiAgICBmdW5jdGlvbiBOcG1pQ29tcG9uZW50X25nX3RlbXBsYXRlXzJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgybXJtWVsZW1lbnQoMCwgIm5wbWktbWFpbiIpOwogICAgfSB9CiAgICBjbGFzcyBOcG1pQ29tcG9uZW50IHsKICAgIH0KICAgIE5wbWlDb21wb25lbnQuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWktY29tcG9uZW50JywKICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZVVybDogJy4vbnBtaV9jb21wb25lbnQubmcuaHRtbCcsCiAgICAgICAgICAgICAgICAgICAgc3R5bGVVcmxzOiBbJy4vbnBtaV9jb21wb25lbnQuY3NzJ10sCiAgICAgICAgICAgICAgICAgICAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICBOcG1pQ29tcG9uZW50LnByb3BEZWNvcmF0b3JzID0gewogICAgICAgIHJ1bnM6IFt7IHR5cGU6IElucHV0IH1dCiAgICB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIE5wbWlDb21wb25lbnQuybVmYWMgPSBmdW5jdGlvbiBOcG1pQ29tcG9uZW50X0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5wbWlDb21wb25lbnQpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaUNvbXBvbmVudC7JtWNtcCA9IMm1ybVkZWZpbmVDb21wb25lbnQoeyB0eXBlOiBOcG1pQ29tcG9uZW50LCBzZWxlY3RvcnM6IFtbIm5wbWktY29tcG9uZW50Il1dLCBpbnB1dHM6IHsgcnVuczogInJ1bnMiIH0sIGRlY2xzOiA0LCB2YXJzOiAyLCBjb25zdHM6IFtbMSwgIm5wbWktY29udGFpbmVyIl0sIFs0LCAibmdJZiIsICJuZ0lmRWxzZSJdLCBbImRhdGFBdmFpbGFibGUiLCAiIl1dLCB0ZW1wbGF0ZTogZnVuY3Rpb24gTnBtaUNvbXBvbmVudF9UZW1wbGF0ZShyZiwgY3R4KSB7IGlmIChyZiAmIDEpIHsKICAgICAgICAgICAgybXJtWVsZW1lbnRTdGFydCgwLCAiZGl2IiwgMCk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgxLCBOcG1pQ29tcG9uZW50X25wbWlfaW5hY3RpdmVfdmlld18xX1RlbXBsYXRlLCAxLCAwLCAibnBtaS1pbmFjdGl2ZS12aWV3IiwgMSk7CiAgICAgICAgICAgIMm1ybV0ZW1wbGF0ZSgyLCBOcG1pQ29tcG9uZW50X25nX3RlbXBsYXRlXzJfVGVtcGxhdGUsIDEsIDAsICJuZy10ZW1wbGF0ZSIsIG51bGwsIDIsIMm1ybV0ZW1wbGF0ZVJlZkV4dHJhY3Rvcik7CiAgICAgICAgICAgIMm1ybVlbGVtZW50RW5kKCk7CiAgICAgICAgfSBpZiAocmYgJiAyKSB7CiAgICAgICAgICAgIGNvbnN0IF9yMSA9IMm1ybVyZWZlcmVuY2UoMyk7CiAgICAgICAgICAgIMm1ybVhZHZhbmNlKDEpOwogICAgICAgICAgICDJtcm1cHJvcGVydHkoIm5nSWYiLCBjdHgucnVucy5zaXplID09PSAwKSgibmdJZkVsc2UiLCBfcjEpOwogICAgICAgIH0gfSwgZGlyZWN0aXZlczogW05nSWYsIEluYWN0aXZlQ29tcG9uZW50JDEsIE1haW5Db250YWluZXJdLCBzdHlsZXM6IFsiW19uZ2hvc3QtJUNPTVAlXXtkaXNwbGF5OmZsZXg7aGVpZ2h0OjEwMCV9Lm5wbWktY29udGFpbmVyW19uZ2NvbnRlbnQtJUNPTVAlXXtmbGV4OjEgMX0iXSwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS9ucG1pX2NvbnRhaW5lci50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBOcG1pQ29udGFpbmVyIHsKICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3Ioc3RvcmUpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLnJ1bnMkID0gdGhpcy5zdG9yZS5waXBlKHNlbGVjdChnZXRDdXJyZW50Um91dGVSdW5TZWxlY3Rpb24pKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBuZ09uSW5pdCgpIHsKICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pTG9hZGVkKCkpOwogICAgICAgIH0KICAgIH0KICAgIE5wbWlDb250YWluZXIuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IENvbXBvbmVudCwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBzZWxlY3RvcjogJ25wbWknLAogICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlOiBgIDxucG1pLWNvbXBvbmVudCBbcnVuc109InJ1bnMkIHwgYXN5bmMiPjwvbnBtaS1jb21wb25lbnQ+IGAsCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8KICAgIE5wbWlDb250YWluZXIuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE5wbWlDb250YWluZXIuybVmYWMgPSBmdW5jdGlvbiBOcG1pQ29udGFpbmVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5wbWlDb250YWluZXIpKMm1ybVkaXJlY3RpdmVJbmplY3QoU3RvcmUpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBOcG1pQ29udGFpbmVyLsm1Y21wID0gybXJtWRlZmluZUNvbXBvbmVudCh7IHR5cGU6IE5wbWlDb250YWluZXIsIHNlbGVjdG9yczogW1sibnBtaSJdXSwgZGVjbHM6IDIsIHZhcnM6IDMsIGNvbnN0czogW1szLCAicnVucyJdXSwgdGVtcGxhdGU6IGZ1bmN0aW9uIE5wbWlDb250YWluZXJfVGVtcGxhdGUocmYsIGN0eCkgeyBpZiAocmYgJiAxKSB7CiAgICAgICAgICAgIMm1ybVlbGVtZW50KDAsICJucG1pLWNvbXBvbmVudCIsIDApOwogICAgICAgICAgICDJtcm1cGlwZSgxLCAiYXN5bmMiKTsKICAgICAgICB9IGlmIChyZiAmIDIpIHsKICAgICAgICAgICAgybXJtXByb3BlcnR5KCJydW5zIiwgybXJtXBpcGVCaW5kMSgxLCAxLCBjdHgucnVucyQpKTsKICAgICAgICB9IH0sIGRpcmVjdGl2ZXM6IFtOcG1pQ29tcG9uZW50XSwgcGlwZXM6IFtBc3luY1BpcGVdLCBlbmNhcHN1bGF0aW9uOiAyIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS9kYXRhX3NvdXJjZS9ucG1pX2RhdGFfc291cmNlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE5wbWlIdHRwU2VydmVyRGF0YVNvdXJjZSB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBodHRwCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoaHR0cCkgewogICAgICAgICAgICB0aGlzLmh0dHAgPSBodHRwOwogICAgICAgICAgICB0aGlzLmh0dHBQYXRoUHJlZml4ID0gJ2RhdGEvcGx1Z2luL25wbWknOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoRGF0YSgpIHsKICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKHRoaXMuZmV0Y2hBbm5vdGF0aW9ucygpLCB0aGlzLmZldGNoTWV0cmljcygpLCB0aGlzLmZldGNoVmFsdWVzKCksIHRoaXMuZmV0Y2hFbWJlZGRpbmdzKCkpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgIChbYW5ub3RhdGlvbnMsIG1ldHJpY3MsIHZhbHVlcywgZW1iZWRkaW5nc10pID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGFubm90YXRpb25EYXRhID0ge307CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBlbWJlZGRpbmdEYXRhID0ge307CiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHJ1biBvZiBPYmplY3Qua2V5cyhhbm5vdGF0aW9ucykpIHsKICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGFubm90YXRpb25JbmRleCBpbiBhbm5vdGF0aW9uc1tydW5dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5ub3RhdGlvbiA9IGFubm90YXRpb25zW3J1bl1bYW5ub3RhdGlvbkluZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVtYmVkZGluZ3NbcnVuXVthbm5vdGF0aW9uSW5kZXhdKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRpbmdEYXRhW2Fubm90YXRpb25dID0gZW1iZWRkaW5nc1tydW5dW2Fubm90YXRpb25JbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRyaWNUb0RhdGFFbGVtZW50cyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChjb25zdCBtZXRyaWNJbmRleCBpbiBtZXRyaWNzW3J1bl0pIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1ldHJpYyA9IG1ldHJpY3NbcnVuXVttZXRyaWNJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtZXRyaWNTdHJpbmcgPSBzdHJpcE1ldHJpY1N0cmluZyhtZXRyaWMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGRhdGFFbGVtZW50ID0gbWV0cmljVG9EYXRhRWxlbWVudHMuZ2V0KG1ldHJpY1N0cmluZyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRhdGFFbGVtZW50KSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUVsZW1lbnQgPSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5QTUlWYWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRWYWx1ZTogbnVsbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ub3RhdGlvbjogYW5ub3RhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljOiBtZXRyaWNTdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bjogcnVuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0cmljVG9EYXRhRWxlbWVudHMuc2V0KG1ldHJpY1N0cmluZywgZGF0YUVsZW1lbnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1ldHJpY0lzTWV0cmljQ291bnQobWV0cmljKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFFbGVtZW50LmNvdW50VmFsdWUgPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbcnVuXVthbm5vdGF0aW9uSW5kZXhdW21ldHJpY0luZGV4XTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1ldHJpY0lzTnBtaShtZXRyaWMpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YUVsZW1lbnQublBNSVZhbHVlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzW3J1bl1bYW5ub3RhdGlvbkluZGV4XVttZXRyaWNJbmRleF07CiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZyA9IGFubm90YXRpb25EYXRhW2Fubm90YXRpb25dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGFubm90YXRpb25EYXRhW2Fubm90YXRpb25dCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFtdOwogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGF0YVthbm5vdGF0aW9uXSA9IFsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV4aXN0aW5nLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgLi4ubWV0cmljVG9EYXRhRWxlbWVudHMudmFsdWVzKCksCiAgICAgICAgICAgICAgICAgICAgICAgIF07CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIHsgYW5ub3RhdGlvbkRhdGEsIG1ldHJpY3MsIGVtYmVkZGluZ0RhdGEgfTsKICAgICAgICAgICAgfSkpLCBjYXRjaEVycm9yKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBlcnJvcgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGVycm9yKSA9PiB7CiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSAmJgogICAgICAgICAgICAgICAgICAgIDQwMCA8PSBlcnJvci5zdGF0dXMgJiYKICAgICAgICAgICAgICAgICAgICBlcnJvci5zdGF0dXMgPCA1MDApIHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gb2YoewogICAgICAgICAgICAgICAgICAgICAgICBhbm5vdGF0aW9uRGF0YToge30sCiAgICAgICAgICAgICAgICAgICAgICAgIG1ldHJpY3M6IHt9LAogICAgICAgICAgICAgICAgICAgICAgICBlbWJlZGRpbmdEYXRhOiB7fSwKICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoQW5ub3RhdGlvbnMoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL2Fubm90YXRpb25zJyk7CiAgICAgICAgfQogICAgICAgIC8qKgogICAgICAgICAqIEBwcml2YXRlCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaE1ldHJpY3MoKSB7CiAgICAgICAgICAgIHJldHVybiB0aGlzLmh0dHAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL21ldHJpY3MnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoVmFsdWVzKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwLmdldCh0aGlzLmh0dHBQYXRoUHJlZml4ICsgJy92YWx1ZXMnKTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGZldGNoRW1iZWRkaW5ncygpIHsKICAgICAgICAgICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodGhpcy5odHRwUGF0aFByZWZpeCArICcvZW1iZWRkaW5ncycpOwogICAgICAgIH0KICAgIH0KICAgIE5wbWlIdHRwU2VydmVyRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlLmN0b3JQYXJhbWV0ZXJzID0gKCkgPT4gWwogICAgICAgIHsgdHlwZTogVEJIdHRwQ2xpZW50IH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlLsm1ZmFjID0gZnVuY3Rpb24gTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE5wbWlIdHRwU2VydmVyRGF0YVNvdXJjZSkoybXJtWluamVjdChUQkh0dHBDbGllbnQpKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBOcG1pSHR0cFNlcnZlckRhdGFTb3VyY2UuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlLCBmYWN0b3J5OiBOcG1pSHR0cFNlcnZlckRhdGFTb3VyY2UuybVmYWMgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL2RhdGFfc291cmNlL25wbWlfZGF0YV9zb3VyY2VfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE5wbWlTZXJ2ZXJEYXRhU291cmNlTW9kdWxlIHsKICAgIH0KICAgIE5wbWlTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbVEJIdHRwQ2xpZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBwcm92aWRlcnM6IFtOcG1pSHR0cFNlcnZlckRhdGFTb3VyY2VdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE5wbWlTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTnBtaVNlcnZlckRhdGFTb3VyY2VNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaVNlcnZlckRhdGFTb3VyY2VNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBOcG1pU2VydmVyRGF0YVNvdXJjZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOcG1pU2VydmVyRGF0YVNvdXJjZU1vZHVsZSkoKTsgfSwgcHJvdmlkZXJzOiBbTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlXSwgaW1wb3J0czogW1tUQkh0dHBDbGllbnRNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE5wbWlTZXJ2ZXJEYXRhU291cmNlTW9kdWxlLCB7IGltcG9ydHM6IFtUQkh0dHBDbGllbnRNb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS9lZmZlY3RzL25wbWlfZWZmZWN0cy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBOcG1pRWZmZWN0cyB7CiAgICAgICAgLyoqCiAgICAgICAgICogQHBhcmFtIHs/fSBhY3Rpb25zJAogICAgICAgICAqIEBwYXJhbSB7P30gc3RvcmUKICAgICAgICAgKiBAcGFyYW0gez99IGRhdGFTb3VyY2UKICAgICAgICAgKi8KICAgICAgICBjb25zdHJ1Y3RvcihhY3Rpb25zJCwgc3RvcmUsIGRhdGFTb3VyY2UpIHsKICAgICAgICAgICAgdGhpcy5hY3Rpb25zJCA9IGFjdGlvbnMkOwogICAgICAgICAgICB0aGlzLnN0b3JlID0gc3RvcmU7CiAgICAgICAgICAgIHRoaXMuZGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgICAgICAgIHRoaXMubG9hZERhdGEkID0gY3JlYXRlRWZmZWN0KCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGxvYWRQbHVnaW5EYXRhJCA9IHRoaXMubG9hZFBsdWdpbkRhdGEoKTsKICAgICAgICAgICAgICAgIHJldHVybiBtZXJnZShsb2FkUGx1Z2luRGF0YSQpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+ICh7fSkpKSk7CiAgICAgICAgICAgIH0pLCB7IGRpc3BhdGNoOiBmYWxzZSB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAqLwogICAgICAgIGxvYWRQbHVnaW5EYXRhKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZShucG1pTG9hZGVkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0UGx1Z2luRGF0YUxvYWRlZCkpLCBmaWx0ZXIoKC8qKgogICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKFssIHsgc3RhdGUgfV0pID0+IHN0YXRlICE9PSBEYXRhTG9hZFN0YXRlLkxPQURJTkcpKSwgdGFwKCgvKioKICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICovCiAgICAgICAgICAgICgpID0+IHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaVBsdWdpbkRhdGFSZXF1ZXN0ZWQoKSkpKSwgbWVyZ2VNYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gewogICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZGF0YVNvdXJjZS5mZXRjaERhdGEoKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJlc3VsdAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKHJlc3VsdCkgPT4gewogICAgICAgICAgICAgICAgICAgIHRoaXMuc3RvcmUuZGlzcGF0Y2gobnBtaVBsdWdpbkRhdGFMb2FkZWQocmVzdWx0KSk7CiAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSwgY2F0Y2hFcnJvcigoLyoqCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaChucG1pUGx1Z2luRGF0YVJlcXVlc3RGYWlsZWQoKSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgfSkpKTsKICAgICAgICB9CiAgICB9CiAgICBOcG1pRWZmZWN0cy5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgTnBtaUVmZmVjdHMuY3RvclBhcmFtZXRlcnMgPSAoKSA9PiBbCiAgICAgICAgeyB0eXBlOiBBY3Rpb25zIH0sCiAgICAgICAgeyB0eXBlOiBTdG9yZSB9LAogICAgICAgIHsgdHlwZTogTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaUVmZmVjdHMuybVmYWMgPSBmdW5jdGlvbiBOcG1pRWZmZWN0c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBOcG1pRWZmZWN0cykoybXJtWluamVjdChBY3Rpb25zKSwgybXJtWluamVjdChTdG9yZSksIMm1ybVpbmplY3QoTnBtaUh0dHBTZXJ2ZXJEYXRhU291cmNlKSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaUVmZmVjdHMuybVwcm92ID0gybXJtWRlZmluZUluamVjdGFibGUoeyB0b2tlbjogTnBtaUVmZmVjdHMsIGZhY3Rvcnk6IE5wbWlFZmZlY3RzLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9pbmFjdGl2ZS9pbmFjdGl2ZV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgSW5hY3RpdmVNb2R1bGUkMSB7CiAgICB9CiAgICBJbmFjdGl2ZU1vZHVsZSQxLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtJbmFjdGl2ZUNvbXBvbmVudCQxXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbSW5hY3RpdmVDb21wb25lbnQkMV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW5hY3RpdmVNb2R1bGUkMS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEluYWN0aXZlTW9kdWxlJDEgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gSW5hY3RpdmVNb2R1bGUkMS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEluYWN0aXZlTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEluYWN0aXZlTW9kdWxlJDEpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShJbmFjdGl2ZU1vZHVsZSQxLCB7IGRlY2xhcmF0aW9uczogW0luYWN0aXZlQ29tcG9uZW50JDFdLCBleHBvcnRzOiBbSW5hY3RpdmVDb21wb25lbnQkMV0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcnVuc19sZWdhY3kvdmlld3MvbGVnYWN5X3J1bnNfc2VsZWN0b3IvbGVnYWN5X3J1bnNfc2VsZWN0b3JfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIExlZ2FjeVJ1bnNTZWxlY3Rvck1vZHVsZSB7CiAgICB9CiAgICBMZWdhY3lSdW5zU2VsZWN0b3JNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0xlZ2FjeVJ1bnNTZWxlY3RvckNvbXBvbmVudCwgTGVnYWN5UnVuc1NlbGVjdG9yQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTGVnYWN5UnVuc1NlbGVjdG9yQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBzY2hlbWFzOiBbQ1VTVE9NX0VMRU1FTlRTX1NDSEVNQV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGVnYWN5UnVuc1NlbGVjdG9yTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTGVnYWN5UnVuc1NlbGVjdG9yTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIExlZ2FjeVJ1bnNTZWxlY3Rvck1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIExlZ2FjeVJ1bnNTZWxlY3Rvck1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMZWdhY3lSdW5zU2VsZWN0b3JNb2R1bGUpKCk7IH0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShMZWdhY3lSdW5zU2VsZWN0b3JNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTGVnYWN5UnVuc1NlbGVjdG9yQ29tcG9uZW50LCBMZWdhY3lSdW5zU2VsZWN0b3JDb250YWluZXJdLCBleHBvcnRzOiBbTGVnYWN5UnVuc1NlbGVjdG9yQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9ydW5zX2xlZ2FjeS9ydW5zX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBSdW5zTW9kdWxlJDEgewogICAgfQogICAgUnVuc01vZHVsZSQxLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTGVnYWN5UnVuc1NlbGVjdG9yTW9kdWxlXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBSdW5zTW9kdWxlJDEuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBSdW5zTW9kdWxlJDEgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUnVuc01vZHVsZSQxLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gUnVuc01vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSdW5zTW9kdWxlJDEpKCk7IH0sIGltcG9ydHM6IFtMZWdhY3lSdW5zU2VsZWN0b3JNb2R1bGVdIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoUnVuc01vZHVsZSQxLCB7IGV4cG9ydHM6IFtMZWdhY3lSdW5zU2VsZWN0b3JNb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9tZXRyaWNfc2VhcmNoL21ldHJpY19zZWFyY2hfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1ldHJpY1NlYXJjaE1vZHVsZSB7CiAgICB9CiAgICBNZXRyaWNTZWFyY2hNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW01ldHJpY1NlYXJjaENvbXBvbmVudCwgTWV0cmljU2VhcmNoQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRJbnB1dE1vZHVsZSwgTWF0QXV0b2NvbXBsZXRlTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTWV0cmljU2VhcmNoQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNTZWFyY2hNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBNZXRyaWNTZWFyY2hNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljU2VhcmNoTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTWV0cmljU2VhcmNoTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IE1ldHJpY1NlYXJjaE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRBdXRvY29tcGxldGVNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1ldHJpY1NlYXJjaE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtNZXRyaWNTZWFyY2hDb21wb25lbnQsIE1ldHJpY1NlYXJjaENvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlLCBNYXRBdXRvY29tcGxldGVNb2R1bGVdLCBleHBvcnRzOiBbTWV0cmljU2VhcmNoQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvZGF0YV9zZWxlY3Rpb24vbWV0cmljX2FyaXRobWV0aWMvbWV0cmljX2FyaXRobWV0aWNfZWxlbWVudC9tZXRyaWNfYXJpdGhtZXRpY19lbGVtZW50X21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNZXRyaWNBcml0aG1ldGljRWxlbWVudE1vZHVsZSB7CiAgICB9CiAgICBNZXRyaWNBcml0aG1ldGljRWxlbWVudE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29tcG9uZW50LAogICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBcml0aG1ldGljRWxlbWVudENvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0Q2hpcHNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljRWxlbWVudE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBNZXRyaWNBcml0aG1ldGljRWxlbWVudE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIEZvcm1zTW9kdWxlLAogICAgICAgICAgICAgICAgUmVhY3RpdmVGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRDaGlwc01vZHVsZSwKICAgICAgICAgICAgICAgIE1hdFRvb2x0aXBNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRDb21wb25lbnQsCiAgICAgICAgICAgIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgRm9ybXNNb2R1bGUsCiAgICAgICAgICAgIFJlYWN0aXZlRm9ybXNNb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdENoaXBzTW9kdWxlLAogICAgICAgICAgICBNYXRUb29sdGlwTW9kdWxlXSwgZXhwb3J0czogW01ldHJpY0FyaXRobWV0aWNFbGVtZW50Q29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvZGF0YV9zZWxlY3Rpb24vbWV0cmljX2FyaXRobWV0aWMvbWV0cmljX2FyaXRobWV0aWNfb3BlcmF0b3IvbWV0cmljX2FyaXRobWV0aWNfb3BlcmF0b3JfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvck1vZHVsZSB7CiAgICB9CiAgICBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW01ldHJpY0FyaXRobWV0aWNPcGVyYXRvckNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgTWF0Q2hpcHNNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnRdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvck1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWV0cmljQXJpdGhtZXRpY09wZXJhdG9yTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgTWF0Q2hpcHNNb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1ldHJpY0FyaXRobWV0aWNPcGVyYXRvck1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnRdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBNYXRDaGlwc01vZHVsZV0sIGV4cG9ydHM6IFtNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JDb21wb25lbnRdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9tZXRyaWNfYXJpdGhtZXRpYy9tZXRyaWNfYXJpdGhtZXRpY19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTWV0cmljQXJpdGhtZXRpY01vZHVsZSB7CiAgICB9CiAgICBNZXRyaWNBcml0aG1ldGljTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50LCBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0Q2hpcHNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50TW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTWV0cmljQXJpdGhtZXRpY0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1ldHJpY0FyaXRobWV0aWNNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWV0cmljQXJpdGhtZXRpY01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1ldHJpY0FyaXRobWV0aWNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWV0cmljQXJpdGhtZXRpY01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdENoaXBzTW9kdWxlLAogICAgICAgICAgICAgICAgTWV0cmljQXJpdGhtZXRpY0VsZW1lbnRNb2R1bGUsCiAgICAgICAgICAgICAgICBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTWV0cmljQXJpdGhtZXRpY01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtNZXRyaWNBcml0aG1ldGljQ29tcG9uZW50LCBNZXRyaWNBcml0aG1ldGljQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWF0Q2hpcHNNb2R1bGUsCiAgICAgICAgICAgIE1ldHJpY0FyaXRobWV0aWNFbGVtZW50TW9kdWxlLAogICAgICAgICAgICBNZXRyaWNBcml0aG1ldGljT3BlcmF0b3JNb2R1bGVdLCBleHBvcnRzOiBbTWV0cmljQXJpdGhtZXRpY0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2RhdGFfc2VsZWN0aW9uL3Jlc3VsdHNfZG93bmxvYWQvcmVzdWx0c19kb3dubG9hZF9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUmVzdWx0c0Rvd25sb2FkTW9kdWxlIHsKICAgIH0KICAgIFJlc3VsdHNEb3dubG9hZE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbUmVzdWx0c0Rvd25sb2FkQ29tcG9uZW50LCBSZXN1bHRzRG93bmxvYWRDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW1Jlc3VsdHNEb3dubG9hZENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUmVzdWx0c0Rvd25sb2FkTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogUmVzdWx0c0Rvd25sb2FkTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFJlc3VsdHNEb3dubG9hZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFJlc3VsdHNEb3dubG9hZE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBSZXN1bHRzRG93bmxvYWRNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbQ29tbW9uTW9kdWxlLCBNYXRJY29uTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFJlc3VsdHNEb3dubG9hZE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtSZXN1bHRzRG93bmxvYWRDb21wb25lbnQsIFJlc3VsdHNEb3dubG9hZENvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZV0sIGV4cG9ydHM6IFtSZXN1bHRzRG93bmxvYWRDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9kYXRhX3NlbGVjdGlvbi9kYXRhX3NlbGVjdGlvbl9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgRGF0YVNlbGVjdGlvbk1vZHVsZSB7CiAgICB9CiAgICBEYXRhU2VsZWN0aW9uTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtEYXRhU2VsZWN0aW9uQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWV0cmljU2VhcmNoTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNZXRyaWNBcml0aG1ldGljTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRzRG93bmxvYWRNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbRGF0YVNlbGVjdGlvbkNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGF0YVNlbGVjdGlvbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IERhdGFTZWxlY3Rpb25Nb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGF0YVNlbGVjdGlvbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIERhdGFTZWxlY3Rpb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgRGF0YVNlbGVjdGlvbk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1ldHJpY1NlYXJjaE1vZHVsZSwKICAgICAgICAgICAgICAgIE1ldHJpY0FyaXRobWV0aWNNb2R1bGUsCiAgICAgICAgICAgICAgICBSZXN1bHRzRG93bmxvYWRNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoRGF0YVNlbGVjdGlvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtEYXRhU2VsZWN0aW9uQ29tcG9uZW50XSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgTWV0cmljU2VhcmNoTW9kdWxlLAogICAgICAgICAgICBNZXRyaWNBcml0aG1ldGljTW9kdWxlLAogICAgICAgICAgICBSZXN1bHRzRG93bmxvYWRNb2R1bGVdLCBleHBvcnRzOiBbRGF0YVNlbGVjdGlvbkNvbXBvbmVudF0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL3Zpb2xpbl9maWx0ZXJzL3Zpb2xpbl9maWx0ZXIvdmlvbGluX2ZpbHRlcl9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVmlvbGluRmlsdGVyTW9kdWxlIHsKICAgIH0KICAgIFZpb2xpbkZpbHRlck1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbVmlvbGluRmlsdGVyQ29tcG9uZW50LCBWaW9saW5GaWx0ZXJDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXRCdXR0b25Nb2R1bGUsIE1hdEljb25Nb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtWaW9saW5GaWx0ZXJDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFZpb2xpbkZpbHRlck1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFZpb2xpbkZpbHRlck1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBWaW9saW5GaWx0ZXJNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBWaW9saW5GaWx0ZXJNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVmlvbGluRmlsdGVyTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVmlvbGluRmlsdGVyTW9kdWxlLCB7IGRlY2xhcmF0aW9uczogW1Zpb2xpbkZpbHRlckNvbXBvbmVudCwgVmlvbGluRmlsdGVyQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdEJ1dHRvbk1vZHVsZSwgTWF0SWNvbk1vZHVsZV0sIGV4cG9ydHM6IFtWaW9saW5GaWx0ZXJDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy92aW9saW5fZmlsdGVycy92aW9saW5fZmlsdGVyc19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVmlvbGluRmlsdGVyc01vZHVsZSB7CiAgICB9CiAgICBWaW9saW5GaWx0ZXJzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtWaW9saW5GaWx0ZXJzQ29tcG9uZW50LCBWaW9saW5GaWx0ZXJzQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgVmlvbGluRmlsdGVyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW1Zpb2xpbkZpbHRlcnNDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFZpb2xpbkZpbHRlcnNNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBWaW9saW5GaWx0ZXJzTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFZpb2xpbkZpbHRlcnNNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBWaW9saW5GaWx0ZXJzTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFZpb2xpbkZpbHRlcnNNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBWaW9saW5GaWx0ZXJNb2R1bGUsCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoVmlvbGluRmlsdGVyc01vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtWaW9saW5GaWx0ZXJzQ29tcG9uZW50LCBWaW9saW5GaWx0ZXJzQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgRm9ybXNNb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgVmlvbGluRmlsdGVyTW9kdWxlXSwgZXhwb3J0czogW1Zpb2xpbkZpbHRlcnNDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfdG9vbGJhci9hbm5vdGF0aW9uc19zZWFyY2gvYW5ub3RhdGlvbnNfc2VhcmNoX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBBbm5vdGF0aW9uc1NlYXJjaE1vZHVsZSB7CiAgICB9CiAgICBBbm5vdGF0aW9uc1NlYXJjaE1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbQW5ub3RhdGlvbnNTZWFyY2hDb21wb25lbnQsIEFubm90YXRpb25zU2VhcmNoQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0SW5wdXRNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtBbm5vdGF0aW9uc1NlYXJjaENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbnNTZWFyY2hNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBBbm5vdGF0aW9uc1NlYXJjaE1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBbm5vdGF0aW9uc1NlYXJjaE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFubm90YXRpb25zU2VhcmNoTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFubm90YXRpb25zU2VhcmNoTW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdEljb25Nb2R1bGUsIE1hdElucHV0TW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShBbm5vdGF0aW9uc1NlYXJjaE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtBbm5vdGF0aW9uc1NlYXJjaENvbXBvbmVudCwgQW5ub3RhdGlvbnNTZWFyY2hDb250YWluZXJdLCBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlLCBGb3Jtc01vZHVsZSwgTWF0SWNvbk1vZHVsZSwgTWF0SW5wdXRNb2R1bGVdLCBleHBvcnRzOiBbQW5ub3RhdGlvbnNTZWFyY2hDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfdG9vbGJhci9hbm5vdGF0aW9uc19saXN0X3Rvb2xiYXJfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFubm90YXRpb25zTGlzdFRvb2xiYXJNb2R1bGUgewogICAgfQogICAgQW5ub3RhdGlvbnNMaXN0VG9vbGJhck1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb21wb25lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXIsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgRm9ybXNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0U2xpZGVUb2dnbGVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25zU2VhcmNoTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0Fubm90YXRpb25zTGlzdFRvb2xiYXJDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdFRvb2xiYXJNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdFRvb2xiYXJNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBbm5vdGF0aW9uc0xpc3RUb29sYmFyTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEFubm90YXRpb25zTGlzdFRvb2xiYXJNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRTbGlkZVRvZ2dsZU1vZHVsZSwKICAgICAgICAgICAgICAgIEFubm90YXRpb25zU2VhcmNoTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEFubm90YXRpb25zTGlzdFRvb2xiYXJNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbXBvbmVudCwKICAgICAgICAgICAgQW5ub3RhdGlvbnNMaXN0VG9vbGJhckNvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIEZvcm1zTW9kdWxlLAogICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgIE1hdFNsaWRlVG9nZ2xlTW9kdWxlLAogICAgICAgICAgICBBbm5vdGF0aW9uc1NlYXJjaE1vZHVsZV0sIGV4cG9ydHM6IFtBbm5vdGF0aW9uc0xpc3RUb29sYmFyQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9oZWFkZXIvaGVhZGVyX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBIZWFkZXJNb2R1bGUkMSB7CiAgICB9CiAgICBIZWFkZXJNb2R1bGUkMS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbSGVhZGVyQ29tcG9uZW50JDEsIEhlYWRlckNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRJY29uTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbSGVhZGVyQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBIZWFkZXJNb2R1bGUkMS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEhlYWRlck1vZHVsZSQxIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEhlYWRlck1vZHVsZSQxLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gSGVhZGVyTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IEhlYWRlck1vZHVsZSQxKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRJY29uTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShIZWFkZXJNb2R1bGUkMSwgeyBkZWNsYXJhdGlvbnM6IFtIZWFkZXJDb21wb25lbnQkMSwgSGVhZGVyQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRJY29uTW9kdWxlXSwgZXhwb3J0czogW0hlYWRlckNvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL2Fubm90YXRpb25zX2xpc3QvbGVnZW5kL2xlZ2VuZF9lbGVtZW50L2xlZ2VuZF9lbGVtZW50X21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBMZWdlbmRFbGVtZW50TW9kdWxlIHsKICAgIH0KICAgIExlZ2VuZEVsZW1lbnRNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0xlZ2VuZEVsZW1lbnRDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIGV4cG9ydHM6IFtMZWdlbmRFbGVtZW50Q29tcG9uZW50XSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMZWdlbmRFbGVtZW50TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogTGVnZW5kRWxlbWVudE1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMZWdlbmRFbGVtZW50TW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTGVnZW5kRWxlbWVudE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBMZWdlbmRFbGVtZW50TW9kdWxlKSgpOyB9LCBpbXBvcnRzOiBbW0NvbW1vbk1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTGVnZW5kRWxlbWVudE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtMZWdlbmRFbGVtZW50Q29tcG9uZW50XSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZV0sIGV4cG9ydHM6IFtMZWdlbmRFbGVtZW50Q29tcG9uZW50XSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9sZWdlbmQvbGVnZW5kX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBMZWdlbmRNb2R1bGUgewogICAgfQogICAgTGVnZW5kTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtMZWdlbmRDb21wb25lbnRdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtMZWdlbmRFbGVtZW50TW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTGVnZW5kQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBMZWdlbmRNb2R1bGUuybVtb2QgPSDJtcm1ZGVmaW5lTmdNb2R1bGUoeyB0eXBlOiBMZWdlbmRNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTGVnZW5kTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gTGVnZW5kTW9kdWxlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IExlZ2VuZE1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tMZWdlbmRFbGVtZW50TW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShMZWdlbmRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTGVnZW5kQ29tcG9uZW50XSwgaW1wb3J0czogW0xlZ2VuZEVsZW1lbnRNb2R1bGVdLCBleHBvcnRzOiBbTGVnZW5kQ29tcG9uZW50XSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvYW5ub3RhdGlvbnNfbGlzdC9hbm5vdGF0aW9uL2Fubm90YXRpb25fbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFubm90YXRpb25Nb2R1bGUgewogICAgfQogICAgQW5ub3RhdGlvbk1vZHVsZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogTmdNb2R1bGUsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgZGVjbGFyYXRpb25zOiBbQW5ub3RhdGlvbkNvbnRhaW5lciwgQW5ub3RhdGlvbkNvbXBvbmVudF0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRJY29uTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbQW5ub3RhdGlvbkNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFubm90YXRpb25Nb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFubm90YXRpb25Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQW5ub3RhdGlvbk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGUsIEZvcm1zTW9kdWxlLCBNYXRDaGVja2JveE1vZHVsZSwgTWF0SWNvbk1vZHVsZV1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoQW5ub3RhdGlvbk1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtBbm5vdGF0aW9uQ29udGFpbmVyLCBBbm5vdGF0aW9uQ29tcG9uZW50XSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwgRm9ybXNNb2R1bGUsIE1hdENoZWNrYm94TW9kdWxlLCBNYXRJY29uTW9kdWxlXSwgZXhwb3J0czogW0Fubm90YXRpb25Db250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9hbm5vdGF0aW9uc19saXN0L2Fubm90YXRpb25zX2xpc3RfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFubm90YXRpb25zTGlzdE1vZHVsZSB7CiAgICB9CiAgICBBbm5vdGF0aW9uc0xpc3RNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0Fubm90YXRpb25zTGlzdENvbXBvbmVudCwgQW5ub3RhdGlvbnNMaXN0Q29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbnNMaXN0VG9vbGJhck1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyTW9kdWxlJDEsCiAgICAgICAgICAgICAgICAgICAgICAgIExlZ2VuZE1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2Nyb2xsaW5nTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZXhwb3J0czogW0Fubm90YXRpb25zTGlzdENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gQW5ub3RhdGlvbnNMaXN0TW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogQW5ub3RhdGlvbnNMaXN0TW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFubm90YXRpb25zTGlzdE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIEFubm90YXRpb25zTGlzdE1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBBbm5vdGF0aW9uc0xpc3RNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0xpc3RUb29sYmFyTW9kdWxlLAogICAgICAgICAgICAgICAgSGVhZGVyTW9kdWxlJDEsCiAgICAgICAgICAgICAgICBMZWdlbmRNb2R1bGUsCiAgICAgICAgICAgICAgICBTY3JvbGxpbmdNb2R1bGUsCiAgICAgICAgICAgICAgICBBbm5vdGF0aW9uTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEFubm90YXRpb25zTGlzdE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtBbm5vdGF0aW9uc0xpc3RDb21wb25lbnQsIEFubm90YXRpb25zTGlzdENvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIEFubm90YXRpb25zTGlzdFRvb2xiYXJNb2R1bGUsCiAgICAgICAgICAgIEhlYWRlck1vZHVsZSQxLAogICAgICAgICAgICBMZWdlbmRNb2R1bGUsCiAgICAgICAgICAgIFNjcm9sbGluZ01vZHVsZSwKICAgICAgICAgICAgQW5ub3RhdGlvbk1vZHVsZV0sIGV4cG9ydHM6IFtBbm5vdGF0aW9uc0xpc3RDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvbnBtaS92aWV3cy9zZWxlY3RlZF9hbm5vdGF0aW9ucy9wYXJhbGxlbF9jb29yZGluYXRlcy9wYXJhbGxlbF9jb29yZGluYXRlc19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgUGFyYWxsZWxDb29yZGluYXRlc01vZHVsZSB7CiAgICB9CiAgICBQYXJhbGxlbENvb3JkaW5hdGVzTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtQYXJhbGxlbENvb3JkaW5hdGVzQ29tcG9uZW50LCBQYXJhbGxlbENvb3JkaW5hdGVzQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbQ29tbW9uTW9kdWxlXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFyYWxsZWxDb29yZGluYXRlc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFBhcmFsbGVsQ29vcmRpbmF0ZXNNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gUGFyYWxsZWxDb29yZGluYXRlc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFBhcmFsbGVsQ29vcmRpbmF0ZXNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgUGFyYWxsZWxDb29yZGluYXRlc01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tDb21tb25Nb2R1bGVdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFBhcmFsbGVsQ29vcmRpbmF0ZXNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbUGFyYWxsZWxDb29yZGluYXRlc0NvbXBvbmVudCwgUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGVdLCBleHBvcnRzOiBbUGFyYWxsZWxDb29yZGluYXRlc0NvbnRhaW5lcl0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy9ucG1pL3ZpZXdzL3NlbGVjdGVkX2Fubm90YXRpb25zL3NlbGVjdGVkX2Fubm90YXRpb25zX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBTZWxlY3RlZEFubm90YXRpb25zTW9kdWxlIHsKICAgIH0KICAgIFNlbGVjdGVkQW5ub3RhdGlvbnNNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW1NlbGVjdGVkQW5ub3RhdGlvbnNDb21wb25lbnQsIFNlbGVjdGVkQW5ub3RhdGlvbnNDb250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFsbGVsQ29vcmRpbmF0ZXNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU2VsZWN0ZWRBbm5vdGF0aW9uc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFNlbGVjdGVkQW5ub3RhdGlvbnNNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gU2VsZWN0ZWRBbm5vdGF0aW9uc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFNlbGVjdGVkQW5ub3RhdGlvbnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgU2VsZWN0ZWRBbm5vdGF0aW9uc01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgICAgICBQYXJhbGxlbENvb3JkaW5hdGVzTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFNlbGVjdGVkQW5ub3RhdGlvbnNNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbXBvbmVudCwgU2VsZWN0ZWRBbm5vdGF0aW9uc0NvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgUGFyYWxsZWxDb29yZGluYXRlc01vZHVsZV0sIGV4cG9ydHM6IFtTZWxlY3RlZEFubm90YXRpb25zQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvdmlld3MvbWFpbi9tYWluX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBNYWluTW9kdWxlIHsKICAgIH0KICAgIE1haW5Nb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW01haW5Db21wb25lbnQsIE1haW5Db250YWluZXJdLAogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBGb3Jtc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJ1bnNNb2R1bGUkMSwKICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNlbGVjdGlvbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTWF0QnV0dG9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBWaW9saW5GaWx0ZXJzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0xpc3RNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGVkQW5ub3RhdGlvbnNNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTWFpbkNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWFpbk1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE1haW5Nb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTWFpbk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE1haW5Nb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTWFpbk1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIEZvcm1zTW9kdWxlLAogICAgICAgICAgICAgICAgTWF0Q2hlY2tib3hNb2R1bGUsCiAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlLAogICAgICAgICAgICAgICAgUnVuc01vZHVsZSQxLAogICAgICAgICAgICAgICAgRGF0YVNlbGVjdGlvbk1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEJ1dHRvbk1vZHVsZSwKICAgICAgICAgICAgICAgIFZpb2xpbkZpbHRlcnNNb2R1bGUsCiAgICAgICAgICAgICAgICBBbm5vdGF0aW9uc0xpc3RNb2R1bGUsCiAgICAgICAgICAgICAgICBTZWxlY3RlZEFubm90YXRpb25zTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKE1haW5Nb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbTWFpbkNvbXBvbmVudCwgTWFpbkNvbnRhaW5lcl0sIGltcG9ydHM6IFtDb21tb25Nb2R1bGUsCiAgICAgICAgICAgIEZvcm1zTW9kdWxlLAogICAgICAgICAgICBNYXRDaGVja2JveE1vZHVsZSwKICAgICAgICAgICAgTWF0SWNvbk1vZHVsZSwKICAgICAgICAgICAgUnVuc01vZHVsZSQxLAogICAgICAgICAgICBEYXRhU2VsZWN0aW9uTW9kdWxlLAogICAgICAgICAgICBNYXRCdXR0b25Nb2R1bGUsCiAgICAgICAgICAgIFZpb2xpbkZpbHRlcnNNb2R1bGUsCiAgICAgICAgICAgIEFubm90YXRpb25zTGlzdE1vZHVsZSwKICAgICAgICAgICAgU2VsZWN0ZWRBbm5vdGF0aW9uc01vZHVsZV0sIGV4cG9ydHM6IFtNYWluQ29udGFpbmVyXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL25wbWkvbnBtaV9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgTnBtaU1vZHVsZSB7CiAgICB9CiAgICBOcG1pTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtOcG1pQ29tcG9uZW50LCBOcG1pQ29udGFpbmVyXSwKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbCiAgICAgICAgICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgSW5hY3RpdmVNb2R1bGUkMSwKICAgICAgICAgICAgICAgICAgICAgICAgTWFpbk1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgTnBtaVNlcnZlckRhdGFTb3VyY2VNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvckZlYXR1cmUoTlBNSV9GRUFUVVJFX0tFWSwgcmVkdWNlcnMkOCksCiAgICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbTnBtaUVmZmVjdHNdKSwKICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKCducG1pJywgTnBtaUNvbnRhaW5lciksCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbTnBtaUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBbTnBtaUNvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaU1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE5wbWlNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gTnBtaU1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE5wbWlNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgTnBtaU1vZHVsZSkoKTsgfSwgaW1wb3J0czogW1sKICAgICAgICAgICAgICAgIENvbW1vbk1vZHVsZSwKICAgICAgICAgICAgICAgIEluYWN0aXZlTW9kdWxlJDEsCiAgICAgICAgICAgICAgICBNYWluTW9kdWxlLAogICAgICAgICAgICAgICAgTnBtaVNlcnZlckRhdGFTb3VyY2VNb2R1bGUsCiAgICAgICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JGZWF0dXJlKE5QTUlfRkVBVFVSRV9LRVksIHJlZHVjZXJzJDgpLAogICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtOcG1pRWZmZWN0c10pLAogICAgICAgICAgICAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKCducG1pJywgTnBtaUNvbnRhaW5lciksCiAgICAgICAgICAgIF1dIH0pOwogICAgKGZ1bmN0aW9uICgpIHsgKHR5cGVvZiBuZ0ppdE1vZGUgPT09ICJ1bmRlZmluZWQiIHx8IG5nSml0TW9kZSkgJiYgybXJtXNldE5nTW9kdWxlU2NvcGUoTnBtaU1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtOcG1pQ29tcG9uZW50LCBOcG1pQ29udGFpbmVyXSwgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgSW5hY3RpdmVNb2R1bGUkMSwKICAgICAgICAgICAgTWFpbk1vZHVsZSwKICAgICAgICAgICAgTnBtaVNlcnZlckRhdGFTb3VyY2VNb2R1bGUsIFN0b3JlRmVhdHVyZU1vZHVsZSwgRWZmZWN0c0ZlYXR1cmVNb2R1bGUsIFBsdWdpblJlZ2lzdHJ5TW9kdWxlXSwgZXhwb3J0czogW05wbWlDb250YWluZXJdIH0pOyB9KSgpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvdGV4dF92Mi92aWV3cy90ZXh0X2Rhc2hib2FyZC90ZXh0X2Rhc2hib2FyZF9jb21wb25lbnQudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGV4dERhc2hib2FyZENvbXBvbmVudCB7CiAgICB9CiAgICBUZXh0RGFzaGJvYXJkQ29tcG9uZW50LmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBDb21wb25lbnQsIGFyZ3M6IFt7CiAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3I6ICd0ZXh0LWRhc2hib2FyZCcsCiAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGU6IGAgVGhpcyBpcyB0aGUgdGV4dCBkYXNoYm9hcmQgYCwKICAgICAgICAgICAgICAgICAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZXh0RGFzaGJvYXJkQ29tcG9uZW50Lsm1ZmFjID0gZnVuY3Rpb24gVGV4dERhc2hib2FyZENvbXBvbmVudF9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXh0RGFzaGJvYXJkQ29tcG9uZW50KSgpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRleHREYXNoYm9hcmRDb21wb25lbnQuybVjbXAgPSDJtcm1ZGVmaW5lQ29tcG9uZW50KHsgdHlwZTogVGV4dERhc2hib2FyZENvbXBvbmVudCwgc2VsZWN0b3JzOiBbWyJ0ZXh0LWRhc2hib2FyZCJdXSwgZGVjbHM6IDEsIHZhcnM6IDAsIHRlbXBsYXRlOiBmdW5jdGlvbiBUZXh0RGFzaGJvYXJkQ29tcG9uZW50X1RlbXBsYXRlKHJmLCBjdHgpIHsgaWYgKHJmICYgMSkgewogICAgICAgICAgICDJtcm1dGV4dCgwLCAiIFRoaXMgaXMgdGhlIHRleHQgZGFzaGJvYXJkICIpOwogICAgICAgIH0gfSwgZW5jYXBzdWxhdGlvbjogMiwgY2hhbmdlRGV0ZWN0aW9uOiAwIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvdGV4dF92Mi92aWV3cy90ZXh0X2Rhc2hib2FyZC90ZXh0X2Rhc2hib2FyZF9tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGV4dERhc2hib2FyZE1vZHVsZSB7CiAgICB9CiAgICBUZXh0RGFzaGJvYXJkTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBkZWNsYXJhdGlvbnM6IFtUZXh0RGFzaGJvYXJkQ29tcG9uZW50XSwKICAgICAgICAgICAgICAgICAgICBleHBvcnRzOiBbVGV4dERhc2hib2FyZENvbXBvbmVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGV4dERhc2hib2FyZE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IFRleHREYXNoYm9hcmRNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGV4dERhc2hib2FyZE1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRleHREYXNoYm9hcmRNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGV4dERhc2hib2FyZE1vZHVsZSkoKTsgfSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKFRleHREYXNoYm9hcmRNb2R1bGUsIHsgZGVjbGFyYXRpb25zOiBbVGV4dERhc2hib2FyZENvbXBvbmVudF0sIGV4cG9ydHM6IFtUZXh0RGFzaGJvYXJkQ29tcG9uZW50XSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3RleHRfdjIvZGF0YV9zb3VyY2UvdGV4dF92Ml9kYXRhX3NvdXJjZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKioKICAgICAqIEBhYnN0cmFjdAogICAgICovCiAgICBjbGFzcyBUZXh0VjJEYXRhU291cmNlIHsKICAgIH0KICAgIFRleHRWMkRhdGFTb3VyY2UuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IEluamVjdGFibGUgfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGV4dFYyRGF0YVNvdXJjZS7JtWZhYyA9IGZ1bmN0aW9uIFRleHRWMkRhdGFTb3VyY2VfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgVGV4dFYyRGF0YVNvdXJjZSkoKTsgfTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZXh0VjJEYXRhU291cmNlLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFRleHRWMkRhdGFTb3VyY2UsIGZhY3Rvcnk6IFRleHRWMkRhdGFTb3VyY2UuybVmYWMgfSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy90ZXh0X3YyL2RhdGFfc291cmNlL3RleHRfdjJfc2VydmVyX2RhdGFfc291cmNlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIFRleHRWMlNlcnZlckRhdGFTb3VyY2UgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gaHR0cAogICAgICAgICAqLwogICAgICAgIGNvbnN0cnVjdG9yKGh0dHApIHsKICAgICAgICAgICAgdGhpcy5odHRwID0gaHR0cDsKICAgICAgICAgICAgdGhpcy5odHRwUGF0aFByZWZpeCA9ICdkYXRhL3BsdWdpbi90ZXh0X3YyJzsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaFJ1blRvVGFnKCkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwCiAgICAgICAgICAgICAgICAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyAnL3RhZ3MnKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW5Ub1RhZ09iamVjdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHJ1blRvVGFnT2JqZWN0KSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBydW5Ub1RhZyA9IG5ldyBNYXAoKTsKICAgICAgICAgICAgICAgIE9iamVjdC5lbnRyaWVzKHJ1blRvVGFnT2JqZWN0KS5mb3JFYWNoKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoW3J1bk5hbWUsIHRhZ3NdKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgcnVuVG9UYWcuc2V0KHJ1bk5hbWUsIHRhZ3MpOwogICAgICAgICAgICAgICAgfSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIHJ1blRvVGFnOwogICAgICAgICAgICB9KSkpOwogICAgICAgIH0KICAgICAgICAvKioKICAgICAgICAgKiBAcGFyYW0gez99IHJ1bgogICAgICAgICAqIEBwYXJhbSB7P30gdGFnCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaFRleHREYXRhKHJ1biwgdGFnKSB7CiAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgY29uc3Qgc2VhcmNoUGFyYW1zID0gbmV3IFVSTFNlYXJjaFBhcmFtcyh7IHJ1biwgdGFnIH0pOwogICAgICAgICAgICByZXR1cm4gdGhpcy5odHRwCiAgICAgICAgICAgICAgICAuZ2V0KHRoaXMuaHR0cFBhdGhQcmVmaXggKyBgL3RleHQ/JHtzZWFyY2hQYXJhbXMudG9TdHJpbmcoKX1gKQogICAgICAgICAgICAgICAgLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhTGlzdAogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKGRhdGFMaXN0KSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gZGF0YUxpc3QubWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gZGF0dW0KICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgIChkYXR1bSkgPT4gewogICAgICAgICAgICAgICAgICAgIHJldHVybiB7CiAgICAgICAgICAgICAgICAgICAgICAgIG9yaWdpbmFsU2hhcGU6IGRhdHVtLm9yaWdpbmFsX3NoYXBlLAogICAgICAgICAgICAgICAgICAgICAgICBzdGVwOiBkYXR1bS5zdGVwLAogICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdBcnJheTogZGF0dW0uc3RyaW5nX2FycmF5LAogICAgICAgICAgICAgICAgICAgICAgICB3YWxsVGltZUluTXM6IGRhdHVtLndhbGxfdGltZSAqIDEwMDAsCiAgICAgICAgICAgICAgICAgICAgICAgIHRydW5jYXRlZDogZGF0dW0udHJ1bmNhdGVkLAogICAgICAgICAgICAgICAgICAgIH07CiAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgIH0pKSk7CiAgICAgICAgfQogICAgfQogICAgVGV4dFYyU2VydmVyRGF0YVNvdXJjZS5kZWNvcmF0b3JzID0gWwogICAgICAgIHsgdHlwZTogSW5qZWN0YWJsZSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLwogICAgVGV4dFYyU2VydmVyRGF0YVNvdXJjZS5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IFRCSHR0cENsaWVudCB9CiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRleHRWMlNlcnZlckRhdGFTb3VyY2UuybVmYWMgPSBmdW5jdGlvbiBUZXh0VjJTZXJ2ZXJEYXRhU291cmNlX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IFRleHRWMlNlcnZlckRhdGFTb3VyY2UpKMm1ybVpbmplY3QoVEJIdHRwQ2xpZW50KSk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGV4dFYyU2VydmVyRGF0YVNvdXJjZS7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBUZXh0VjJTZXJ2ZXJEYXRhU291cmNlLCBmYWN0b3J5OiBUZXh0VjJTZXJ2ZXJEYXRhU291cmNlLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvdGV4dF92Mi9kYXRhX3NvdXJjZS90ZXh0X3YyX2RhdGFfc291cmNlX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBjbGFzcyBUZXh0VjJEYXRhU291cmNlTW9kdWxlIHsKICAgIH0KICAgIFRleHRWMkRhdGFTb3VyY2VNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFtUQkh0dHBDbGllbnRNb2R1bGVdLAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgICAgICBUZXh0VjJTZXJ2ZXJEYXRhU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICB7IHByb3ZpZGU6IFRleHRWMkRhdGFTb3VyY2UsIHVzZUV4aXN0aW5nOiBUZXh0VjJTZXJ2ZXJEYXRhU291cmNlIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgIH0sXSB9LAogICAgXTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZXh0VjJEYXRhU291cmNlTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGV4dFYyRGF0YVNvdXJjZU1vZHVsZSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBUZXh0VjJEYXRhU291cmNlTW9kdWxlLsm1aW5qID0gybXJtWRlZmluZUluamVjdG9yKHsgZmFjdG9yeTogZnVuY3Rpb24gVGV4dFYyRGF0YVNvdXJjZU1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXh0VjJEYXRhU291cmNlTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgVGV4dFYyU2VydmVyRGF0YVNvdXJjZSwKICAgICAgICAgICAgeyBwcm92aWRlOiBUZXh0VjJEYXRhU291cmNlLCB1c2VFeGlzdGluZzogVGV4dFYyU2VydmVyRGF0YVNvdXJjZSB9LAogICAgICAgIF0sIGltcG9ydHM6IFtbVEJIdHRwQ2xpZW50TW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShUZXh0VjJEYXRhU291cmNlTW9kdWxlLCB7IGltcG9ydHM6IFtUQkh0dHBDbGllbnRNb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgY29uc3QgdGV4dFBsdWdpbkxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW1RleHRdIFRleHQgUGx1Z2luIExvYWRlZCcpOwogICAgY29uc3QgdGV4dFJ1blRvVGFnc0xvYWRlZCA9IGNyZWF0ZUFjdGlvbignW1RleHRdIFJ1bnMgVG8gVGFnIExvYWRlZCcsIHByb3BzKCkpOwogICAgY29uc3QgdGV4dFRhZ0dyb3VwVmlzaWJpbGl0eUNoYW5nZWQgPSBjcmVhdGVBY3Rpb24oJ1tUZXh0XSBUYWcgR3JvdXAgVmlzaWJpbGl0eSBDaGFuZ2VkJywgcHJvcHMoKSk7CiAgICBjb25zdCB0ZXh0RGF0YUxvYWRlZCA9IGNyZWF0ZUFjdGlvbignW1RleHRdIFRleHQgRGF0YSBMb2FkZWQgTG9hZGVkJywgcHJvcHMoKSk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvcGx1Z2lucy90ZXh0X3YyL3N0b3JlL3RleHRfdHlwZXMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgVEVYVF9GRUFUVVJFX0tFWSA9ICd0ZXh0JzsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3RleHRfdjIvc3RvcmUvdGV4dF92Ml9zZWxlY3RvcnMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3Qgc2VsZWN0VGV4dFN0YXRlID0gY3JlYXRlRmVhdHVyZVNlbGVjdG9yKFRFWFRfRkVBVFVSRV9LRVkpOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgZ2V0VGV4dFJ1blRvVGFncyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdFRleHRTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiBzdGF0ZS5ydW5Ub1RhZ3MpKTsKICAgIC8qKgogICAgICogUmV0dXJucyBkZS1kdXBsaWNhdGVkIGxpc3Qgb2YgPHJ1biwgdGFnPiB0dXBsZSBmb3IgY2FyZHMgdGhhdCBhcmUgdmlzaWJsZQogICAgICogaW4gdGhlIFVJLgogICAgICogQHR5cGUgez99CiAgICAgKi8KICAgIGNvbnN0IGdldFRleHRBbGxWaXNpYmxlUnVuVGFncyA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdFRleHRTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlKSA9PiB7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHNlcmlhbGl6ZWRSdW5UYWdUdXBsZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IGFsbFZpc2libGVSdW5UYWdUdXBsZXMgPSBuZXcgU2V0KCk7CiAgICAgICAgZm9yIChjb25zdCBydW5UYWdUdXBsZXMgb2Ygc3RhdGUudmlzaWJsZVJ1blRhZ3MudmFsdWVzKCkpIHsKICAgICAgICAgICAgZm9yIChjb25zdCBydW5UYWcgb2YgcnVuVGFnVHVwbGVzKSB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVkUnVuVGFnID0gSlNPTi5zdHJpbmdpZnkocnVuVGFnKTsKICAgICAgICAgICAgICAgIGlmIChzZXJpYWxpemVkUnVuVGFnVHVwbGVzLmhhcyhzZXJpYWxpemVkUnVuVGFnKSkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgc2VyaWFsaXplZFJ1blRhZ1R1cGxlcy5hZGQoc2VyaWFsaXplZFJ1blRhZyk7CiAgICAgICAgICAgICAgICBhbGxWaXNpYmxlUnVuVGFnVHVwbGVzLmFkZChydW5UYWcpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIHJldHVybiBbLi4uYWxsVmlzaWJsZVJ1blRhZ1R1cGxlc107CiAgICB9KSk7CiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBnZXRUZXh0RGF0YSA9IGNyZWF0ZVNlbGVjdG9yKHNlbGVjdFRleHRTdGF0ZSwgKC8qKgogICAgICogQHBhcmFtIHs/fSBzdGF0ZQogICAgICogQHBhcmFtIHs/fSBwcm9wcwogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKHN0YXRlLCBwcm9wcykgPT4gewogICAgICAgIC8vIFJlZmFjdG9yIHRvIGBzdGF0ZS5kYXRhLmdldChwcm9wcy5ydW4pPy5nZXQocHJvcHMudGFnKSB8fCBudWxsYCB3aGVuIHByZXR0aWVyCiAgICAgICAgLy8gc3VwcG9ydHMgVHlwZVNjcmlwdCAzLjggKHByZXR0aWVyIDIueCkuCiAgICAgICAgLyoqIEB0eXBlIHs/fSAqLwogICAgICAgIGNvbnN0IHRhZ1RvU3RlcHMgPSBzdGF0ZS5kYXRhLmdldChwcm9wcy5ydW4pOwogICAgICAgIGlmICghdGFnVG9TdGVwcykgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHRhZ1RvU3RlcHMuZ2V0KHByb3BzLnRhZykgfHwgbnVsbDsKICAgIH0pKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3RleHRfdjIvZWZmZWN0cy90ZXh0X2VmZmVjdHMudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgVGV4dEVmZmVjdHMgewogICAgICAgIC8qKgogICAgICAgICAqIEBwYXJhbSB7P30gYWN0aW9ucyQKICAgICAgICAgKiBAcGFyYW0gez99IHN0b3JlCiAgICAgICAgICogQHBhcmFtIHs/fSBkYXRhU291cmNlCiAgICAgICAgICovCiAgICAgICAgY29uc3RydWN0b3IoYWN0aW9ucyQsIHN0b3JlLCBkYXRhU291cmNlKSB7CiAgICAgICAgICAgIHRoaXMuYWN0aW9ucyQgPSBhY3Rpb25zJDsKICAgICAgICAgICAgdGhpcy5zdG9yZSA9IHN0b3JlOwogICAgICAgICAgICB0aGlzLmRhdGFTb3VyY2UgPSBkYXRhU291cmNlOwogICAgICAgICAgICAvKioKICAgICAgICAgICAgICogQGV4cG9ydAogICAgICAgICAgICAgKi8KICAgICAgICAgICAgdGhpcy5sb2FkUnVuVG9UYWdzJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5hY3Rpb25zJC5waXBlKG9mVHlwZSh0ZXh0UGx1Z2luTG9hZGVkKSwgc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICgpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoUnVuVG9UYWcoKS5waXBlKHRhcCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBydW5Ub1RhZ3MKICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgICAgIChydW5Ub1RhZ3MpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5zdG9yZS5kaXNwYXRjaCh0ZXh0UnVuVG9UYWdzTG9hZGVkKHsgcnVuVG9UYWdzIH0pKTsKICAgICAgICAgICAgICAgICAgICB9KSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoKSA9PiB2b2lkIG51bGwpKSk7CiAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICB9KSwgeyBkaXNwYXRjaDogZmFsc2UgfSk7CiAgICAgICAgICAgIC8qKgogICAgICAgICAgICAgKiBAZXhwb3J0CiAgICAgICAgICAgICAqLwogICAgICAgICAgICB0aGlzLmxvYWREYXRhJCA9IGNyZWF0ZUVmZmVjdCgoLyoqCiAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAqLwogICAgICAgICAgICAoKSA9PiB7CiAgICAgICAgICAgICAgICAvKiogQHR5cGUgez99ICovCiAgICAgICAgICAgICAgICBjb25zdCBmZXRjaE9uTmV3Q2FyZFZpc2libGUgPSB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKHRleHRUYWdHcm91cFZpc2liaWxpdHlDaGFuZ2VkKSwgc3dpdGNoTWFwKCgvKioKICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAoeyB2aXNpYmxlVGV4dENhcmRzIH0pID0+IHsKICAgICAgICAgICAgICAgICAgICAvLyBGZXRjaCBleGlzdGluZyBkYXRhLgogICAgICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgICAgICBjb25zdCBleGlzdGluZ1RleHREYXRhID0gdmlzaWJsZVRleHRDYXJkcy5tYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAqIEBwYXJhbSB7P30gX18wCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAoeyBydW4sIHRhZyB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLnN0b3JlLnNlbGVjdChnZXRUZXh0RGF0YSwgeyBydW4sIHRhZyB9KS5waXBlKGxhc3QoKSwgbWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSB0ZXh0RGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKHRleHREYXRhKSA9PiB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBydW4sIHRhZywgdGV4dERhdGEgfTsKICAgICAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9KSk7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZvcmtKb2luKGV4aXN0aW5nVGV4dERhdGEpLnBpcGUobWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHRleHREYXRhCiAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAodGV4dERhdGEpID0+IHsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlsdGVyIG91dCB0aGUgPHJ1biwgdGFnPiB0dXBsZSBpZiB0aGUgZGF0YSBhbHJlYWR5IGV4aXN0cy4KICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRleHREYXRhCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmlsdGVyKCgvKioKICAgICAgICAgICAgICAgICAgICAgICAgICogQHBhcmFtIHs/fSBfXzAKICAgICAgICAgICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgICAgICh7IHRleHREYXRhIH0pID0+IHRleHREYXRhID09PSBudWxsKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXAoKC8qKgogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICAgICAgICAgICAgICAgICAgICAgKHsgcnVuLCB0YWcgfSkgPT4gKHsgcnVuLCB0YWcgfSkpKTsKICAgICAgICAgICAgICAgICAgICB9KSkpOwogICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIC8qKiBAdHlwZSB7P30gKi8KICAgICAgICAgICAgICAgIGNvbnN0IGZldGNoVmlzaWJsZUNhcmRzT25SZWxvYWQgPSB0aGlzLmFjdGlvbnMkLnBpcGUob2ZUeXBlKG1hbnVhbFJlbG9hZCwgcmVsb2FkKSwgd2l0aExhdGVzdEZyb20odGhpcy5zdG9yZS5zZWxlY3QoZ2V0VGV4dEFsbFZpc2libGVSdW5UYWdzKSksIG1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IF9fMAogICAgICAgICAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgICAgKFssIHJ1blRhZ0xpc3RdKSA9PiBydW5UYWdMaXN0KSkpOwogICAgICAgICAgICAgICAgcmV0dXJuIG1lcmdlKGZldGNoT25OZXdDYXJkVmlzaWJsZSwgZmV0Y2hWaXNpYmxlQ2FyZHNPblJlbG9hZCkucGlwZShtZXJnZU1hcCgoLyoqCiAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1blRhZ1BhaXJzCiAgICAgICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAocnVuVGFnUGFpcnMpID0+IHsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm9ya0pvaW4ocnVuVGFnUGFpcnMubWFwKCgvKioKICAgICAgICAgICAgICAgICAgICAgKiBAcGFyYW0gez99IHJ1bkFuZFRhZwogICAgICAgICAgICAgICAgICAgICAqIEByZXR1cm4gez99CiAgICAgICAgICAgICAgICAgICAgICovCiAgICAgICAgICAgICAgICAgICAgKHJ1bkFuZFRhZykgPT4gewogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5mZXRjaFRleHREYXRhKHJ1bkFuZFRhZyk7CiAgICAgICAgICAgICAgICAgICAgfSkpKTsKICAgICAgICAgICAgICAgIH0pKSk7CiAgICAgICAgICAgIH0pLCB7IGRpc3BhdGNoOiBmYWxzZSB9KTsKICAgICAgICB9CiAgICAgICAgLyoqCiAgICAgICAgICogQHByaXZhdGUKICAgICAgICAgKiBAcGFyYW0gez99IHByb3BzCiAgICAgICAgICogQHJldHVybiB7P30KICAgICAgICAgKi8KICAgICAgICBmZXRjaFRleHREYXRhKHByb3BzKSB7CiAgICAgICAgICAgIGNvbnN0IHsgcnVuLCB0YWcgfSA9IHByb3BzOwogICAgICAgICAgICByZXR1cm4gdGhpcy5kYXRhU291cmNlLmZldGNoVGV4dERhdGEocnVuLCB0YWcpLnBpcGUodGFwKCgvKioKICAgICAgICAgICAgICogQHBhcmFtIHs/fSBzdGVwRGF0YQogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKHN0ZXBEYXRhKSA9PiB7CiAgICAgICAgICAgICAgICB0aGlzLnN0b3JlLmRpc3BhdGNoKHRleHREYXRhTG9hZGVkKHsgcnVuLCB0YWcsIHN0ZXBEYXRhIH0pKTsKICAgICAgICAgICAgfSkpLCBtYXAoKC8qKgogICAgICAgICAgICAgKiBAcmV0dXJuIHs/fQogICAgICAgICAgICAgKi8KICAgICAgICAgICAgKCkgPT4gdm9pZCBudWxsKSkpOwogICAgICAgIH0KICAgIH0KICAgIFRleHRFZmZlY3RzLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovCiAgICBUZXh0RWZmZWN0cy5jdG9yUGFyYW1ldGVycyA9ICgpID0+IFsKICAgICAgICB7IHR5cGU6IEFjdGlvbnMgfSwKICAgICAgICB7IHR5cGU6IFN0b3JlIH0sCiAgICAgICAgeyB0eXBlOiBUZXh0VjJEYXRhU291cmNlIH0KICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGV4dEVmZmVjdHMuybVmYWMgPSBmdW5jdGlvbiBUZXh0RWZmZWN0c19GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXh0RWZmZWN0cykoybXJtWluamVjdChBY3Rpb25zKSwgybXJtWluamVjdChTdG9yZSksIMm1ybVpbmplY3QoVGV4dFYyRGF0YVNvdXJjZSkpOyB9OwogICAgLyoqIEBub2NvbGxhcHNlICovIFRleHRFZmZlY3RzLsm1cHJvdiA9IMm1ybVkZWZpbmVJbmplY3RhYmxlKHsgdG9rZW46IFRleHRFZmZlY3RzLCBmYWN0b3J5OiBUZXh0RWZmZWN0cy7JtWZhYyB9KTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9wbHVnaW5zL3RleHRfdjIvc3RvcmUvdGV4dF92Ml9yZWR1Y2Vycy50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiogQHR5cGUgez99ICovCiAgICBjb25zdCBEQVRBX0FfQl9SVU4xID0gWwogICAgICAgIHsKICAgICAgICAgICAgb3JpZ2luYWxTaGFwZTogWzNdLAogICAgICAgICAgICBzdGVwOiAwLAogICAgICAgICAgICBzdHJpbmdBcnJheTogW1snZm9vJywgJ2JhcicsICdiYXonXV0sCiAgICAgICAgICAgIHdhbGxUaW1lSW5NczogMTU3Nzg2NTYwMDAwMCwKICAgICAgICAgICAgdHJ1bmNhdGVkOiBmYWxzZSwKICAgICAgICB9LAogICAgICAgIHsKICAgICAgICAgICAgb3JpZ2luYWxTaGFwZTogWzNdLAogICAgICAgICAgICBzdGVwOiAxLAogICAgICAgICAgICBzdHJpbmdBcnJheTogW1snZm9vJywgJ2JheiddXSwKICAgICAgICAgICAgd2FsbFRpbWVJbk1zOiAxNTc3ODY1NjAxMDAwLAogICAgICAgICAgICB0cnVuY2F0ZWQ6IGZhbHNlLAogICAgICAgIH0sCiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgREFUQV9BX0NfUlVOMSA9IFsKICAgICAgICB7CiAgICAgICAgICAgIG9yaWdpbmFsU2hhcGU6IFszXSwKICAgICAgICAgICAgc3RlcDogMCwKICAgICAgICAgICAgc3RyaW5nQXJyYXk6IFsKICAgICAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICAgICAnV2UgY29uZHVjdGVkIGFuIGV4cGVyaW1lbnQgYW5kIGZvdW5kIHRoZSBmb2xsb3dpbmcgZGF0YTpcblxuUG91bmRzIG9mIGNob2NvbGF0ZSB8IEhhcHBpbmVzc1xuLS0tfC0tLVxuMCB8IDFcbjEgfCA0XG4yIHwgOVxuMyB8IDE2XG40IHwgMjVcbjUgfCAzNlxuNiB8IDQ5XG43IHwgNjRcbjggfCA4MVxuOSB8IDEwMFxuMTAgfCAxMjEnLAogICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgd2FsbFRpbWVJbk1zOiAxNTc3ODY1NjAwMDAwLAogICAgICAgICAgICB0cnVuY2F0ZWQ6IGZhbHNlLAogICAgICAgIH0sCiAgICAgICAgewogICAgICAgICAgICBvcmlnaW5hbFNoYXBlOiBbM10sCiAgICAgICAgICAgIHN0ZXA6IDEsCiAgICAgICAgICAgIHN0cmluZ0FycmF5OiBbCiAgICAgICAgICAgICAgICBbJ1x1MDBkNycsICcqKjAqKicsICcqKjEqKicsICcqKjIqKicsICcqKjMqKicsICcqKjQqKicsICcqKjUqKiddLAogICAgICAgICAgICAgICAgWycqKjAqKicsICcwJywgJzAnLCAnMCcsICcwJywgJzAnLCAnMCddLAogICAgICAgICAgICAgICAgWycqKjEqKicsICcwJywgJzEnLCAnMicsICczJywgJzQnLCAnNSddLAogICAgICAgICAgICAgICAgWycqKjIqKicsICcwJywgJzInLCAnNCcsICc2JywgJzgnLCAnMTAnXSwKICAgICAgICAgICAgICAgIFsnKiozKionLCAnMCcsICczJywgJzYnLCAnOScsICcxMicsICcxNSddLAogICAgICAgICAgICAgICAgWycqKjQqKicsICcwJywgJzQnLCAnOCcsICcxMicsICcxNicsICcyMCddLAogICAgICAgICAgICAgICAgWycqKjUqKicsICcwJywgJzUnLCAnMTAnLCAnMTUnLCAnMjAnLCAnMjUnXSwKICAgICAgICAgICAgXSwKICAgICAgICAgICAgd2FsbFRpbWVJbk1zOiAxNTc3ODY1NjAxMDAwLAogICAgICAgICAgICB0cnVuY2F0ZWQ6IGZhbHNlLAogICAgICAgIH0sCiAgICBdOwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgaW5pdGlhbFN0YXRlJDcgPSB7CiAgICAgICAgcnVuVG9UYWdzOiBuZXcgTWFwKFsKICAgICAgICAgICAgWydydW4xJywgWydhL2InLCAnYS9jJ11dLAogICAgICAgICAgICBbJ3J1bjInLCBbJ2EvYicsICdhL2QnXV0sCiAgICAgICAgICAgIFsncnVuMycsIFsnYycsICdhL2InXV0sCiAgICAgICAgXSksCiAgICAgICAgZGF0YTogbmV3IE1hcChbCiAgICAgICAgICAgIFsKICAgICAgICAgICAgICAgICdydW4xJywKICAgICAgICAgICAgICAgIG5ldyBNYXAoWwogICAgICAgICAgICAgICAgICAgIFsnYS9iJywgREFUQV9BX0JfUlVOMV0sCiAgICAgICAgICAgICAgICAgICAgWydhL2MnLCBEQVRBX0FfQ19SVU4xXSwKICAgICAgICAgICAgICAgIF0pLAogICAgICAgICAgICBdLAogICAgICAgIF0pLAogICAgICAgIHZpc2libGVSdW5UYWdzOiBuZXcgTWFwKCksCiAgICB9OwogICAgLyoqIEB0eXBlIHs/fSAqLwogICAgY29uc3QgcmVkdWNlciQ3ID0gY3JlYXRlUmVkdWNlcihpbml0aWFsU3RhdGUkNyk7CiAgICAvKioKICAgICAqIEBwYXJhbSB7P30gc3RhdGUKICAgICAqIEBwYXJhbSB7P30gYWN0aW9uCiAgICAgKiBAcmV0dXJuIHs/fQogICAgICovCiAgICBmdW5jdGlvbiByZWR1Y2VycyQ5KHN0YXRlLCBhY3Rpb24pIHsKICAgICAgICByZXR1cm4gcmVkdWNlciQ3KHN0YXRlLCBhY3Rpb24pOwogICAgfQoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL3BsdWdpbnMvdGV4dF92Mi90ZXh0X3YyX21vZHVsZS50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICAvKiBDb3B5cmlnaHQgMjAyMCBUaGUgVGVuc29yRmxvdyBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgoKICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CgogICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAoKICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KICAgIGNsYXNzIFRleHRWMk1vZHVsZSB7CiAgICB9CiAgICBUZXh0VjJNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGltcG9ydHM6IFsKICAgICAgICAgICAgICAgICAgICAgICAgQ29tbW9uTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBUZXh0RGFzaGJvYXJkTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBQbHVnaW5SZWdpc3RyeU1vZHVsZS5mb3JQbHVnaW4oJ3RleHRfdjInLCBUZXh0RGFzaGJvYXJkQ29tcG9uZW50KSwKICAgICAgICAgICAgICAgICAgICAgICAgVGV4dFYyRGF0YVNvdXJjZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShURVhUX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQ5KSwKICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JGZWF0dXJlKFtUZXh0RWZmZWN0c10pLAogICAgICAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAgICAgICAgZW50cnlDb21wb25lbnRzOiBbVGV4dERhc2hib2FyZENvbXBvbmVudF0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gVGV4dFYyTW9kdWxlLsm1bW9kID0gybXJtWRlZmluZU5nTW9kdWxlKHsgdHlwZTogVGV4dFYyTW9kdWxlIH0pOwogICAgLyoqIEBub2NvbGxhcHNlICovIFRleHRWMk1vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIFRleHRWMk1vZHVsZV9GYWN0b3J5KHQpIHsgcmV0dXJuIG5ldyAodCB8fCBUZXh0VjJNb2R1bGUpKCk7IH0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICBDb21tb25Nb2R1bGUsCiAgICAgICAgICAgICAgICBUZXh0RGFzaGJvYXJkTW9kdWxlLAogICAgICAgICAgICAgICAgUGx1Z2luUmVnaXN0cnlNb2R1bGUuZm9yUGx1Z2luKCd0ZXh0X3YyJywgVGV4dERhc2hib2FyZENvbXBvbmVudCksCiAgICAgICAgICAgICAgICBUZXh0VjJEYXRhU291cmNlTW9kdWxlLAogICAgICAgICAgICAgICAgU3RvcmVNb2R1bGUuZm9yRmVhdHVyZShURVhUX0ZFQVRVUkVfS0VZLCByZWR1Y2VycyQ5KSwKICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yRmVhdHVyZShbVGV4dEVmZmVjdHNdKSwKICAgICAgICAgICAgXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShUZXh0VjJNb2R1bGUsIHsgaW1wb3J0czogW0NvbW1vbk1vZHVsZSwKICAgICAgICAgICAgVGV4dERhc2hib2FyZE1vZHVsZSwgUGx1Z2luUmVnaXN0cnlNb2R1bGUsIFRleHRWMkRhdGFTb3VyY2VNb2R1bGUsIFN0b3JlRmVhdHVyZU1vZHVsZSwgRWZmZWN0c0ZlYXR1cmVNb2R1bGVdIH0pOyB9KSgpOwoKICAgIC8qIENvcHlyaWdodCAyMDIwIFRoZSBUZW5zb3JGbG93IEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCgogICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKCiAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCgogICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLwogICAgLyoqCiAgICAgKgogICAgICogQGZpbGVvdmVydmlldyBUaGlzIG1vZHVsZSBlbnVtZXJhdGVzIGFsbCBBbmd1bGFyIGJhc2VkIHBsdWdpbnMgVGVuc29yQm9hcmQgc3VwcG9ydHMuCiAgICAgKgogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9vc3NfcGx1Z2luc19tb2R1bGUudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgY2xhc3MgT3NzUGx1Z2luc01vZHVsZSB7CiAgICB9CiAgICBPc3NQbHVnaW5zTW9kdWxlLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBOZ01vZHVsZSwgYXJnczogW3sKICAgICAgICAgICAgICAgICAgICBpbXBvcnRzOiBbRGVidWdnZXJNb2R1bGUsIE1ldHJpY3NNb2R1bGUsIE5wbWlNb2R1bGUsIFRleHRWMk1vZHVsZV0sCiAgICAgICAgICAgICAgICB9LF0gfSwKICAgIF07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gT3NzUGx1Z2luc01vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IE9zc1BsdWdpbnNNb2R1bGUgfSk7CiAgICAvKiogQG5vY29sbGFwc2UgKi8gT3NzUGx1Z2luc01vZHVsZS7JtWluaiA9IMm1ybVkZWZpbmVJbmplY3Rvcih7IGZhY3Rvcnk6IGZ1bmN0aW9uIE9zc1BsdWdpbnNNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgT3NzUGx1Z2luc01vZHVsZSkoKTsgfSwgaW1wb3J0czogW1tEZWJ1Z2dlck1vZHVsZSwgTWV0cmljc01vZHVsZSwgTnBtaU1vZHVsZSwgVGV4dFYyTW9kdWxlXV0gfSk7CiAgICAoZnVuY3Rpb24gKCkgeyAodHlwZW9mIG5nSml0TW9kZSA9PT0gInVuZGVmaW5lZCIgfHwgbmdKaXRNb2RlKSAmJiDJtcm1c2V0TmdNb2R1bGVTY29wZShPc3NQbHVnaW5zTW9kdWxlLCB7IGltcG9ydHM6IFtEZWJ1Z2dlck1vZHVsZSwgTWV0cmljc01vZHVsZSwgTnBtaU1vZHVsZSwgVGV4dFYyTW9kdWxlXSB9KTsgfSkoKTsKCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hcHBfcm91dGluZy9kZWVwX2xpbmtfcHJvdmlkZXIudHMKICAgICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlcyxjb25zdGFudFByb3BlcnR5LGV4dHJhUmVxdWlyZSxtaXNzaW5nT3ZlcnJpZGUsbWlzc2luZ1JldHVybix1bnVzZWRQcml2YXRlTWVtYmVycyx1c2VsZXNzQ29kZX0gY2hlY2tlZCBieSB0c2MKICAgICAqLwogICAgLyoqCiAgICAgKiBAYWJzdHJhY3QKICAgICAqLwogICAgY2xhc3MgRGVlcExpbmtQcm92aWRlciB7CiAgICB9CiAgICBEZWVwTGlua1Byb3ZpZGVyLmRlY29yYXRvcnMgPSBbCiAgICAgICAgeyB0eXBlOiBJbmplY3RhYmxlIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIERlZXBMaW5rUHJvdmlkZXIuybVmYWMgPSBmdW5jdGlvbiBEZWVwTGlua1Byb3ZpZGVyX0ZhY3RvcnkodCkgeyByZXR1cm4gbmV3ICh0IHx8IERlZXBMaW5rUHJvdmlkZXIpKCk7IH07CiAgICAvKiogQG5vY29sbGFwc2UgKi8gRGVlcExpbmtQcm92aWRlci7JtXByb3YgPSDJtcm1ZGVmaW5lSW5qZWN0YWJsZSh7IHRva2VuOiBEZWVwTGlua1Byb3ZpZGVyLCBmYWN0b3J5OiBEZWVwTGlua1Byb3ZpZGVyLsm1ZmFjIH0pOwoKICAgIC8qKgogICAgICogUHJvdmlkZXMgZGVlcGxpbmtpbmcgZm9yIHRoZSBjb3JlIGRhc2hib2FyZHMgcGFnZS4KICAgICAqLwogICAgbGV0IENvcmVEZWVwTGlua1Byb3ZpZGVyID0gY2xhc3MgQ29yZURlZXBMaW5rUHJvdmlkZXIgZXh0ZW5kcyBEZWVwTGlua1Byb3ZpZGVyIHsKICAgICAgICBnZXRNZXRyaWNzUGlubmVkQ2FyZHMoc3RvcmUpIHsKICAgICAgICAgICAgcmV0dXJuIGNvbWJpbmVMYXRlc3QoWwogICAgICAgICAgICAgICAgc3RvcmUuc2VsZWN0KGdldFBpbm5lZENhcmRzV2l0aE1ldGFkYXRhKSwKICAgICAgICAgICAgICAgIHN0b3JlLnNlbGVjdChnZXRVbnJlc29sdmVkSW1wb3J0ZWRQaW5uZWRDYXJkcyksCiAgICAgICAgICAgIF0pLnBpcGUobWFwKChbcGlubmVkQ2FyZHMsIHVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzXSkgPT4gewogICAgICAgICAgICAgICAgaWYgKCFwaW5uZWRDYXJkcy5sZW5ndGggJiYgIXVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzLmxlbmd0aCkgewogICAgICAgICAgICAgICAgICAgIHJldHVybiBbXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvbnN0IHBpbm5lZENhcmRzVG9TdG9yZSA9IHBpbm5lZENhcmRzLm1hcCgoeyBwbHVnaW4sIHRhZywgc2FtcGxlLCBydW5JZCB9KSA9PiB7CiAgICAgICAgICAgICAgICAgICAgY29uc3QgaW5mbyA9IHsgcGx1Z2luLCB0YWcgfTsKICAgICAgICAgICAgICAgICAgICBpZiAoaXNTaW5nbGVSdW5QbHVnaW4ocGx1Z2luKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnJ1bklkID0gcnVuSWQ7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChpc1NhbXBsZWRQbHVnaW4ocGx1Z2luKSkgewogICAgICAgICAgICAgICAgICAgICAgICBpbmZvLnNhbXBsZSA9IHNhbXBsZTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGluZm87CiAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgICAgICAgIC8vIEludGVudGlvbmFsbHkgb3JkZXIgdW5yZXNvbHZlZCBjYXJkcyBsYXN0LCBzbyB0aGF0IGNhcmRzIHBpbm5lZCBieQogICAgICAgICAgICAgICAgLy8gdGhlIHVzZXIgaW4gdGhpcyBzZXNzaW9uIGhhdmUgcHJpb3JpdHkuCiAgICAgICAgICAgICAgICBjb25zdCBjYXJkc1RvU3RvcmUgPSBbCiAgICAgICAgICAgICAgICAgICAgLi4ucGlubmVkQ2FyZHNUb1N0b3JlLAogICAgICAgICAgICAgICAgICAgIC4uLnVucmVzb2x2ZWRJbXBvcnRlZFBpbm5lZENhcmRzLAogICAgICAgICAgICAgICAgXTsKICAgICAgICAgICAgICAgIHJldHVybiBbeyBrZXk6ICdwaW5uZWRDYXJkcycsIHZhbHVlOiBKU09OLnN0cmluZ2lmeShjYXJkc1RvU3RvcmUpIH1dOwogICAgICAgICAgICB9KSk7CiAgICAgICAgfQogICAgICAgIHNlcmlhbGl6ZVN0YXRlVG9RdWVyeVBhcmFtcyhzdG9yZSkgewogICAgICAgICAgICByZXR1cm4gdGhpcy5nZXRNZXRyaWNzUGlubmVkQ2FyZHMoc3RvcmUpOwogICAgICAgIH0KICAgICAgICBkZXNlcmlhbGl6ZVF1ZXJ5UGFyYW1zKHF1ZXJ5UGFyYW1zKSB7CiAgICAgICAgICAgIGxldCBwaW5uZWRDYXJkcyA9IG51bGw7CiAgICAgICAgICAgIGZvciAoY29uc3QgeyBrZXksIHZhbHVlIH0gb2YgcXVlcnlQYXJhbXMpIHsKICAgICAgICAgICAgICAgIGlmIChrZXkgPT09ICdwaW5uZWRDYXJkcycpIHsKICAgICAgICAgICAgICAgICAgICBwaW5uZWRDYXJkcyA9IGV4dHJhY3RQaW5uZWRDYXJkc0Zyb21VUkxUZXh0KHZhbHVlKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgbWV0cmljczogewogICAgICAgICAgICAgICAgICAgIHBpbm5lZENhcmRzOiBwaW5uZWRDYXJkcyB8fCBbXSwKICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgIH07CiAgICAgICAgfQogICAgfTsKICAgIENvcmVEZWVwTGlua1Byb3ZpZGVyID0gX19kZWNvcmF0ZShbCiAgICAgICAgSW5qZWN0YWJsZSgpCiAgICBdLCBDb3JlRGVlcExpbmtQcm92aWRlcik7CiAgICBmdW5jdGlvbiBleHRyYWN0UGlubmVkQ2FyZHNGcm9tVVJMVGV4dCh1cmxUZXh0KSB7CiAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgVVJMIHRleHQgcGFyc2VzLgogICAgICAgIGxldCBvYmplY3Q7CiAgICAgICAgdHJ5IHsKICAgICAgICAgICAgb2JqZWN0ID0gSlNPTi5wYXJzZSh1cmxUZXh0KTsKICAgICAgICB9CiAgICAgICAgY2F0Y2ggKF9hKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkob2JqZWN0KSkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CiAgICAgICAgY29uc3QgcmVzdWx0ID0gW107CiAgICAgICAgZm9yIChjb25zdCBpdGVtIG9mIG9iamVjdCkgewogICAgICAgICAgICAvLyBWYWxpZGF0ZSB0eXBlcy4KICAgICAgICAgICAgY29uc3QgaXNQbHVnaW5TdHJpbmcgPSB0eXBlb2YgaXRlbS5wbHVnaW4gPT09ICdzdHJpbmcnOwogICAgICAgICAgICBjb25zdCBpc1J1blN0cmluZyA9IHR5cGVvZiBpdGVtLnJ1bklkID09PSAnc3RyaW5nJzsKICAgICAgICAgICAgY29uc3QgaXNTYW1wbGVOdW1iZXIgPSB0eXBlb2YgaXRlbS5zYW1wbGUgPT09ICdudW1iZXInOwogICAgICAgICAgICBjb25zdCBpc1RhZ1N0cmluZyA9IHR5cGVvZiBpdGVtLnRhZyA9PT0gJ3N0cmluZyc7CiAgICAgICAgICAgIGNvbnN0IGlzUnVuVHlwZVZhbGlkID0gaXNSdW5TdHJpbmcgfHwgdHlwZW9mIGl0ZW0ucnVuSWQgPT09ICd1bmRlZmluZWQnOwogICAgICAgICAgICBjb25zdCBpc1NhbXBsZVR5cGVWYWxpZCA9IGlzU2FtcGxlTnVtYmVyIHx8IHR5cGVvZiBpdGVtLnNhbXBsZSA9PT0gJ3VuZGVmaW5lZCc7CiAgICAgICAgICAgIGlmICghaXNQbHVnaW5TdHJpbmcgfHwKICAgICAgICAgICAgICAgICFpc1RhZ1N0cmluZyB8fAogICAgICAgICAgICAgICAgIWlzUnVuVHlwZVZhbGlkIHx8CiAgICAgICAgICAgICAgICAhaXNTYW1wbGVUeXBlVmFsaWQpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIFJlcXVpcmVkIGZpZWxkcyBhbmQgcmFuZ2UgZXJyb3JzLgogICAgICAgICAgICBpZiAoIWlzUGx1Z2luVHlwZShpdGVtLnBsdWdpbikpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghaXRlbS50YWcpIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1NpbmdsZVJ1blBsdWdpbihpdGVtLnBsdWdpbikpIHsKICAgICAgICAgICAgICAgIC8vIEEgc2luZ2xlIHJ1biBwbHVnaW4gbXVzdCBzcGVjaWZ5IGEgbm9uLWVtcHR5IHJ1bi4KICAgICAgICAgICAgICAgIGlmICghaXRlbS5ydW5JZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgLy8gQSBtdWx0aSBydW4gcGx1Z2luIG11c3Qgbm90IHNwZWNpZnkgYSBydW4uCiAgICAgICAgICAgICAgICBpZiAoaXRlbS5ydW5JZCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1NhbXBsZU51bWJlcikgewogICAgICAgICAgICAgICAgaWYgKCFpc1NhbXBsZWRQbHVnaW4oaXRlbS5wbHVnaW4pKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBpZiAoIU51bWJlci5pc0ludGVnZXIoaXRlbS5zYW1wbGUpIHx8IGl0ZW0uc2FtcGxlIDwgMCkgewogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgICAgIC8vIEFzc2VtYmxlIHJlc3VsdC4KICAgICAgICAgICAgY29uc3QgcmVzdWx0SXRlbSA9IHsgcGx1Z2luOiBpdGVtLnBsdWdpbiwgdGFnOiBpdGVtLnRhZyB9OwogICAgICAgICAgICBpZiAoaXNSdW5TdHJpbmcpIHsKICAgICAgICAgICAgICAgIHJlc3VsdEl0ZW0ucnVuSWQgPSBpdGVtLnJ1bklkOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGlmIChpc1NhbXBsZU51bWJlcikgewogICAgICAgICAgICAgICAgcmVzdWx0SXRlbS5zYW1wbGUgPSBpdGVtLnNhbXBsZTsKICAgICAgICAgICAgfQogICAgICAgICAgICByZXN1bHQucHVzaChyZXN1bHRJdGVtKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgIH0KCiAgICBmdW5jdGlvbiByb3V0ZXNGYWN0b3J5KCkgewogICAgICAgIHJldHVybiBbCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIHJvdXRlS2luZDogUm91dGVLaW5kLkVYUEVSSU1FTlQsCiAgICAgICAgICAgICAgICBwYXRoOiAnLycsCiAgICAgICAgICAgICAgICBuZ0NvbXBvbmVudDogVGVuc29yQm9hcmRXcmFwcGVyQ29tcG9uZW50LAogICAgICAgICAgICAgICAgZGVmYXVsdFJvdXRlOiB0cnVlLAogICAgICAgICAgICAgICAgZGVlcExpbmtQcm92aWRlcjogbmV3IENvcmVEZWVwTGlua1Byb3ZpZGVyKCksCiAgICAgICAgICAgIH0sCiAgICAgICAgXTsKICAgIH0KCiAgICAvKioKICAgICAqIEBmaWxlb3ZlcnZpZXcgYWRkZWQgYnkgdHNpY2tsZQogICAgICogR2VuZXJhdGVkIGZyb206IHRlbnNvcmJvYXJkL3dlYmFwcC9hcHBfbW9kdWxlLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIGNsYXNzIEFwcE1vZHVsZSB7CiAgICB9CiAgICBBcHBNb2R1bGUuZGVjb3JhdG9ycyA9IFsKICAgICAgICB7IHR5cGU6IE5nTW9kdWxlLCBhcmdzOiBbewogICAgICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9uczogW0FwcENvbnRhaW5lcl0sCiAgICAgICAgICAgICAgICAgICAgaW1wb3J0czogWwogICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnN1cmUgZmVhdHVyZSBmbGFncyBhcmUgZW5hYmxlZCBiZWZvcmUgdGhleSBhcmUgY29uc3VtZWQuCiAgICAgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgQXBwUm91dGluZ01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgQXBwUm91dGluZ1ZpZXdNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlUmVnaXN0cnlNb2R1bGUucmVnaXN0ZXJSb3V0ZXMocm91dGVzRmFjdG9yeSksCiAgICAgICAgICAgICAgICAgICAgICAgIEFsZXJ0TW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBBbGVydFNuYWNrYmFyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZFdyYXBwZXJNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIENvcmVNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVyaW1lbnRzTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBIYXNoU3RvcmFnZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyTW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICBNYXRJY29uTW9kdWxlJDEsCiAgICAgICAgICAgICAgICAgICAgICAgIFBhZ2VUaXRsZU1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgUGx1Z2luc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgUnVuc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgU2V0dGluZ3NNb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlTW9kdWxlLmZvclJvb3QoUk9PVF9SRURVQ0VSUywgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgcnVudGltZUNoZWNrczogewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpY3RBY3Rpb25TZXJpYWxpemFiaWxpdHk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0c01vZHVsZS5mb3JSb290KFtdKSwKICAgICAgICAgICAgICAgICAgICAgICAgT3NzUGx1Z2luc01vZHVsZSwKICAgICAgICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAgICAgIHByb3ZpZGVyczogWwogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlOiBNRVRBX1JFRFVDRVJTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNlRmFjdG9yeTogbG9nZ2VyTWV0YVJlZHVjZXJGYWN0b3J5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgICAgICAgICBib290c3RyYXA6IFtBcHBDb250YWluZXJdLAogICAgICAgICAgICAgICAgfSxdIH0sCiAgICBdOwogICAgLyoqIEBub2NvbGxhcHNlICovIEFwcE1vZHVsZS7JtW1vZCA9IMm1ybVkZWZpbmVOZ01vZHVsZSh7IHR5cGU6IEFwcE1vZHVsZSwgYm9vdHN0cmFwOiBbQXBwQ29udGFpbmVyXSB9KTsKICAgIC8qKiBAbm9jb2xsYXBzZSAqLyBBcHBNb2R1bGUuybVpbmogPSDJtcm1ZGVmaW5lSW5qZWN0b3IoeyBmYWN0b3J5OiBmdW5jdGlvbiBBcHBNb2R1bGVfRmFjdG9yeSh0KSB7IHJldHVybiBuZXcgKHQgfHwgQXBwTW9kdWxlKSgpOyB9LCBwcm92aWRlcnM6IFsKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgcHJvdmlkZTogTUVUQV9SRURVQ0VSUywKICAgICAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGxvZ2dlck1ldGFSZWR1Y2VyRmFjdG9yeSwKICAgICAgICAgICAgICAgIG11bHRpOiB0cnVlLAogICAgICAgICAgICB9LAogICAgICAgIF0sIGltcG9ydHM6IFtbCiAgICAgICAgICAgICAgICAvLyBFbnN1cmUgZmVhdHVyZSBmbGFncyBhcmUgZW5hYmxlZCBiZWZvcmUgdGhleSBhcmUgY29uc3VtZWQuCiAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ01vZHVsZSwKICAgICAgICAgICAgICAgIEJyb3dzZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBCcm93c2VyQW5pbWF0aW9uc01vZHVsZSwKICAgICAgICAgICAgICAgIEFwcFJvdXRpbmdNb2R1bGUsCiAgICAgICAgICAgICAgICBBcHBSb3V0aW5nVmlld01vZHVsZSwKICAgICAgICAgICAgICAgIFJvdXRlUmVnaXN0cnlNb2R1bGUucmVnaXN0ZXJSb3V0ZXMocm91dGVzRmFjdG9yeSksCiAgICAgICAgICAgICAgICBBbGVydE1vZHVsZSwKICAgICAgICAgICAgICAgIEFsZXJ0U25hY2tiYXJNb2R1bGUsCiAgICAgICAgICAgICAgICBUZW5zb3JCb2FyZFdyYXBwZXJNb2R1bGUsCiAgICAgICAgICAgICAgICBDb3JlTW9kdWxlLAogICAgICAgICAgICAgICAgRXhwZXJpbWVudHNNb2R1bGUsCiAgICAgICAgICAgICAgICBIYXNoU3RvcmFnZU1vZHVsZSwKICAgICAgICAgICAgICAgIEhlYWRlck1vZHVsZSwKICAgICAgICAgICAgICAgIE1hdEljb25Nb2R1bGUkMSwKICAgICAgICAgICAgICAgIFBhZ2VUaXRsZU1vZHVsZSwKICAgICAgICAgICAgICAgIFBsdWdpbnNNb2R1bGUsCiAgICAgICAgICAgICAgICBSdW5zTW9kdWxlLAogICAgICAgICAgICAgICAgU2V0dGluZ3NNb2R1bGUsCiAgICAgICAgICAgICAgICBTdG9yZU1vZHVsZS5mb3JSb290KFJPT1RfUkVEVUNFUlMsIHsKICAgICAgICAgICAgICAgICAgICBydW50aW1lQ2hlY2tzOiB7CiAgICAgICAgICAgICAgICAgICAgICAgIHN0cmljdFN0YXRlU2VyaWFsaXphYmlsaXR5OiBmYWxzZSwKICAgICAgICAgICAgICAgICAgICAgICAgc3RyaWN0QWN0aW9uU2VyaWFsaXphYmlsaXR5OiB0cnVlLAogICAgICAgICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICAgICB9KSwKICAgICAgICAgICAgICAgIEVmZmVjdHNNb2R1bGUuZm9yUm9vdChbXSksCiAgICAgICAgICAgICAgICBPc3NQbHVnaW5zTW9kdWxlLAogICAgICAgICAgICBdXSB9KTsKICAgIChmdW5jdGlvbiAoKSB7ICh0eXBlb2YgbmdKaXRNb2RlID09PSAidW5kZWZpbmVkIiB8fCBuZ0ppdE1vZGUpICYmIMm1ybVzZXROZ01vZHVsZVNjb3BlKEFwcE1vZHVsZSwgeyBkZWNsYXJhdGlvbnM6IFtBcHBDb250YWluZXJdLCBpbXBvcnRzOiBbCiAgICAgICAgICAgIC8vIEVuc3VyZSBmZWF0dXJlIGZsYWdzIGFyZSBlbmFibGVkIGJlZm9yZSB0aGV5IGFyZSBjb25zdW1lZC4KICAgICAgICAgICAgRmVhdHVyZUZsYWdNb2R1bGUsCiAgICAgICAgICAgIEJyb3dzZXJNb2R1bGUsCiAgICAgICAgICAgIEJyb3dzZXJBbmltYXRpb25zTW9kdWxlLAogICAgICAgICAgICBBcHBSb3V0aW5nTW9kdWxlLAogICAgICAgICAgICBBcHBSb3V0aW5nVmlld01vZHVsZSwgUm91dGVSZWdpc3RyeU1vZHVsZSwgQWxlcnRNb2R1bGUsCiAgICAgICAgICAgIEFsZXJ0U25hY2tiYXJNb2R1bGUsCiAgICAgICAgICAgIFRlbnNvckJvYXJkV3JhcHBlck1vZHVsZSwKICAgICAgICAgICAgQ29yZU1vZHVsZSwKICAgICAgICAgICAgRXhwZXJpbWVudHNNb2R1bGUsCiAgICAgICAgICAgIEhhc2hTdG9yYWdlTW9kdWxlLAogICAgICAgICAgICBIZWFkZXJNb2R1bGUsCiAgICAgICAgICAgIE1hdEljb25Nb2R1bGUkMSwKICAgICAgICAgICAgUGFnZVRpdGxlTW9kdWxlLAogICAgICAgICAgICBQbHVnaW5zTW9kdWxlLAogICAgICAgICAgICBSdW5zTW9kdWxlLAogICAgICAgICAgICBTZXR0aW5nc01vZHVsZSwgU3RvcmVSb290TW9kdWxlLCBFZmZlY3RzUm9vdE1vZHVsZSwgT3NzUGx1Z2luc01vZHVsZV0gfSk7IH0pKCk7CgogICAgLyoqCiAgICAgKiBAZmlsZW92ZXJ2aWV3IGFkZGVkIGJ5IHRzaWNrbGUKICAgICAqIEdlbmVyYXRlZCBmcm9tOiB0ZW5zb3Jib2FyZC93ZWJhcHAvYm9vdHN0cmFwLnRzCiAgICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXMsY29uc3RhbnRQcm9wZXJ0eSxleHRyYVJlcXVpcmUsbWlzc2luZ092ZXJyaWRlLG1pc3NpbmdSZXR1cm4sdW51c2VkUHJpdmF0ZU1lbWJlcnMsdXNlbGVzc0NvZGV9IGNoZWNrZWQgYnkgdHNjCiAgICAgKi8KICAgIC8vIEJvb3RzdHJhcCBuZWVkcyB0byBoYXBwZW4gYWZ0ZXIgYm9keSBpcyByZWFkeSBidXQgd2UgY2Fubm90IHJlbGlhYmx5CiAgICAvLyBjb250cm9scyB0aGUgb3JkZXIgaW4gd2hpY2ggc2NyaXB0IGdldHMgbG9hZGVkIChWdWxjYW5pemF0aW9uIGlubGluZXMKICAgIC8vIHRoZSBzY3JpcHQgaW4gPGhlYWQ+KS4KICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgKC8qKgogICAgICogQHJldHVybiB7P30KICAgICAqLwogICAgKCkgPT4gewogICAgICAgIHBsYXRmb3JtQnJvd3NlcigpLmJvb3RzdHJhcE1vZHVsZShBcHBNb2R1bGUpOwogICAgfSkpOwoKICAgIC8qKgogICAgICogQGZpbGVvdmVydmlldyBhZGRlZCBieSB0c2lja2xlCiAgICAgKiBHZW5lcmF0ZWQgZnJvbTogdGVuc29yYm9hcmQvd2ViYXBwL21haW5fcHJvZC50cwogICAgICogQHN1cHByZXNzIHtjaGVja1R5cGVzLGNvbnN0YW50UHJvcGVydHksZXh0cmFSZXF1aXJlLG1pc3NpbmdPdmVycmlkZSxtaXNzaW5nUmV0dXJuLHVudXNlZFByaXZhdGVNZW1iZXJzLHVzZWxlc3NDb2RlfSBjaGVja2VkIGJ5IHRzYwogICAgICovCiAgICBlbmFibGVQcm9kTW9kZSgpOwoKfSgpKTsKCgo=", - "headers": [ - [ - "content-type", - "application/javascript; charset=utf-8" - ] - ], - "ok": true, - "status": 200, - "status_text": "OK" - } - } - }, - "id": "bOy5KI2ncnWd", - "outputId": "1bca9388-6e4c-47c0-9ccb-40ceb9338cc6", - "vscode": { - "languageId": "python" - } - }, - "outputs": [ - { - "data": { - "application/javascript": "\n (async () => {\n const url = new URL(await google.colab.kernel.proxyPort(6006, {'cache': true}));\n url.searchParams.set('tensorboardColab', '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": [] - }, - "output_type": "display_data" - } - ], - "source": [ - "# Start tensorboard\n", - "# Launch after you have started training\n", - "# logs save in the folder \"runs\"\n", - "%load_ext tensorboard\n", - "%tensorboard --logdir runs" - ] - }, - { - "cell_type": "code", - "execution_count": null, + "execution_count": 15, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 517 }, "id": "C60XAsyv6OPe", - "outputId": "d9ca801f-ef76-4b33-bc84-51dcc8d68a85", + "outputId": "6996369c-7f66-48ee-f3ad-a3c4a220cb39", "vscode": { "languageId": "python" } }, "outputs": [ { + "output_type": "execute_result", "data": { - "image/png": "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FxeXXCwlAOCf4sKFC3r55ZeNmTxcXFw0YMAA9e/fX0WLFrVIGxcXpx9//FEzZsxQeHi44uLi9M4772jGjBl6/vnnc63MXbt2VdeuXXPtfACAf7fAwED17NlToaGhku4vEf/ss8/qjTfeULVq1dKkT05O1qlTp/Ttt99q06ZNSkpKUmxsbG4XO19r0qRJmmA2a06fPm1st2nTJt3gq8zm+U/yb7xmAMht6fXV/vLLLxozZozu3r0rSZo8ebJatmypUqVK5WYRc83QoUPT7be2p19//TVXzgMA+PdIr04/evSohg8frhs3bkiSvv76a3Xq1El16tTJzSICyATHvC4AgH+Whg0bav78+cZ+SEhIuusXAwBgy7179/Tuu+8awVcFChTQ0qVL9d5776UJvpIkV1dXdenSRRs2bFClSpUk3Z+l8cMPP9Tly5dzs+gAAOSKuLg4DRs2zAi+cnNzk7+/v2bPnm01+Eq6H6BVt25dzZw5Uxs2bGC53geQsvSgJJUoUSIPSwIAQFrt2rXTrFmzjP24uDh99913eVgiAACQHQ0aNNCnn35qsezg999/n4clAmALAVgA7K5+/foqV66csZ+yLCEAAFmxePFiY3plSZo5c6YaN26c4fseeeQRLV26VAULFpQkmUwmjR8/PsfKCQBAXlmyZIkCAgKM/enTp6tt27aZfn/16tW1evVqPfnkkzlRvH+8hIQEY9vRkS42AED+85///Ec1atQw9vfu3ZuHpQEAANlVs2ZNi77xQ4cO5WFpANjCEoQAckSJEiUUGBgoSYqJickw/a5du/Tjjz/q6NGjCg0NVUJCgooVK6ZatWqpTZs26tSpk81lDF9//XX9/vvvkqQaNWrohx9+kKurq81zHT9+XL169TI6y+fPn6/27dtn8QoBADkpJibGYmRu27Zt9fTTT2f6/WXLltXbb7+tadOmSbrfID158qTq1q2b4XuDg4O1atUq/fbbb7p586bi4uJUqlQptWjRQr169VLFihXTff/atWs1ZswYSdILL7yg6dOnZ3jOixcvasOGDdq7d69u3LihyMhIeXp6qnz58mrevLl69uypkiVLZuLK70tMTNS2bdv0+++/68SJEwoPD5fJZJKnp6cqVKigevXqqU2bNnriiSeMkVMLFiyQv7+/RT4HDx6Ur69vmvzLli1rseSCrWv+5Zdf9L///U9n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+eYbm43TEiVK6NVXX81W2TMSFxenxx9/XIsWLUrzQNjZ2VmjRo3SoUOHdOrUKSUnJ+vHH3+0usyCvT8j80CFqVOn2vweODs7q3HjxmrcuLHVMqXo06ePzc56SSpfvrzefPNNm8cB4EGZ15Wp67vcULZs2QxnFPb09JSfn59MJpNWrVqlK1euaNeuXWnun5cuXTLamQ0aNEh3+Z0iRYroxRdftHrMHvf6vHT58mV9+eWXxv7w4cPT/Szq1q1rs13bunVrtW7dOt3zlS9fXosXL9aLL76os2fPatOmTRo1apTFUlU5LSf6BszFxcXp9ddf13vvvZfmWJEiRTR79my1a9dOJpNJ169f18mTJ20+yACAh9Hvv/+us2fPGvtNmza1mi4hIUHNmzfXvHnz0gRKOzo6Gq999dVXxpKu7dq10yeffGI1CNvT01MTJkxQbGys1q1bp9DQUK1cuTJNvXbnzh2L/uOePXumO0ty9erVs72iQW6255KSkjR79mxjv3379po6dWqaIF9PT0/NnDlT0dHR2rFjhyTp448/Vtu2ba1+rini4uJUqVIlff3112na/Q4ODurbt6+OHDmibdu2Sbo/MJkALAB4uH3++ecKDg429nv06JEmTX7uc3Z1ddW0adPSvUZXV1e99tprRj0aGRmpDRs26OWXX073fUB+YvsXHABYcerUKa1YscLi38qVK7V582Yj+KpEiRJauHCh/P39LUaXmlu9erWx3bp1a6sdrCnKlSun119/3dhftWqVkpOT06RzdXXVnDlzjBFQO3bs0MqVK5WYmKiRI0caSws0atQo3U5sAEDeioqKUkJCgrGf0cwG6Un9ANF86YXUChYsmGZt+tTHR44caez/9NNPRt2SVV999ZWx7efnZ7UhbK5r166qUqWKJGn37t1pgqFPnDhhjGxycHDQjBkz8nRk0NixY63OxiH9/2inFCkzh6Rm788oZUYUSRnmZYv5clXZzQMA7CF1XWltNon8xDxgynzEbgp73V/tca/PS8uWLTNGCtevX18DBw7M8XO6uLioU6dOkmQsF5ybcqJvwJy3t7cGDx5s83jx4sUtHsCfPHkyE6UGgIfD9u3bLdqwrq6u6T7AHDt2bLpBP/Hx8caMTq6urpo4cWK66SXp3XffNYKOUmanNrd69Wqj/i5btqzef//9dPN7ELnZntu9e7cCAwMl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rKwsbdiwQfv371dycrJmzJih1atXq0ePHg4zZmxsrKZPn66ioiJJ0tVXX60//vGPuuKKK3Tp0iXt3LlTGzduVGZmph577DEtXrxYo0aNqjS3WbNm6ZtvvpEkGY1G3XzzzRo4cKD8/PyUmpqq/fv3a+PGjbJYLNq6daseeughrVy5Uk5OTnX6mAAAAAAAAAAAAAAAAAComEMXYK1Zs8ZWCBUUFKTly5eXOapv6tSpmjdvnpYuXaqsrCw9++yzWrVqlUOMWVhYqL/+9a+24qt7771XTz31lAwGgy1m0qRJ+u677/Tggw+qsLBQc+bM0TfffFPh0YaxsbG24it3d3etXLlSISEhZWLuvfdexcXF6Z577lFeXp5iY2MVExOjm266qU4fEwAAAAAAAAAAAAAAAAAVc9itkcxms9566y3b9fz588sUQpWIjIzUVVddJelykdKOHTscYszo6GidP39e0uWdr5588skyxVclrrvuOj300EOSpNTUVC1fvrzC3EqKwiRp8uTJ5YqvSvTt21eTJ0+2XcfGxlYYBwAAAAAAAAAAAAAAAKDuHLYAa+/evUpJSZEkhYaGVlpwZDQaFRERYbuOiopyiDG///57W3v8+PFVHgN4xx132NpffPFFhTHp6em2dteuXSvt69f3c3Nzq4wFAAAAAAAAAAAAAAAAYD+HLcDatm2brT1y5MgqY0vfL/1cU4554cIFW7tbt25V9tWxY0e5urpKkhITE3XmzJlyMb6+vrZ2YmJilf2Vfr5nz55VxgIAAAAAAAAAAAAAAACwn8MWYCUkJNjaffv2rTLW399fAQEBki4f41d6t6imGtNqtdqVgyQdP3683GthYWG29scff6z4+PgKn42Li9NHH30kSfLz89P48ePtzgMAAAAAAAAAAAAAAABA1ZybOoHKlN7lKTAwsNr4wMBAJScnS5JOnz5dZseophjTz8/P1j5z5oxGjRpVaT8///yz8vPzbdenT58uF9O3b1/dd999WrZsmXJzcxUeHq5bbrlFAwcOlJ+fn1JTU7Vv3z5t3LhRFotFnTt31ptvvikvL69q3wcAAAAAAAAAAAAAAAAA+zhsAVZOTo6t7ePjU228t7d3hc821ZiDBw/WunXrJEnr16/XPffcI4PBUGE/JXElsrOzK4x76qmn1LlzZy1evFipqan68ssv9eWXX5aJadeunWbO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PNnuawIAAAAAAABAWzJVVlZWOroIdF55ecUqL7c1Guft7S6z2UU2W4Ws1qJ2qAzOinsBVZp7L1gsZvXo4dYOlQHOh34Le3A/oAo9t30VFRUpOjpau3btqjfG399fb7zxhoYOHepUOZcvX67Nmzc3Kefo0aP1+uuvy9vbu9n1vvfee1q2bFmNrznLABY9F83FvYDq6LlA0zS130p8n8W/cS+gCv0WaDp+xkVzcS+gOnpubU6/AxYAAAAAAJ2BzWbTk08+qaSkJEmSr6+vIiIiFBQUpIKCAm3fvl1Hjx5VVlaW5syZoy1btqh///5OlbNLly664447FBISosDAQHl7e8tischqter48eP69NNPde3aNR08eFBRUVHatm2bbrrppibX++2332rlypWSJDc3NxUXF7fo/QMAAAAAAABAe2AACwAAAACAdrB161ZjECooKEixsbHy9fU1Xp8xY4ZeffVVbdiwQQUFBXrxxRebvONUe+ScNWuWoqOj5eZW92+qTZ8+XY8//rhmzZql8+fP6/Tp09q0aZNmz57d5Hp///vfq6ioSCEhIerfv78++uijZrxbAAAAAAAAAHAMF0cXAAAAAABAZ2ez2bRmzRrjOCYmpsYgVJXo6GgNGjRIkpSamqp9+/Y5Tc7evXvXO3xVJSAgQM8++6xxnJiY2OR6t23bpn379slisejll1+W2Wxu8rkAAAAAAAAA4EgMYAEAAAAA0MYOHz6s7OxsSVJoaKhCQkLqjDObzYqKijKOd+zY0aFyStd32qqSk5PTpHO+//57vfLKK5Ku77RVNRAGAAAAAAAAAB0BA1gAAAAAALSxvXv3Gutx48Y1GFv99erndYScknT+/HljXdeOW3VZunSpLl++rMDAQM2fP79F+QEAAAAAAACgvTGABQAAAABAG8vIyDDWgwcPbjDWz89P/v7+kq7vIGW1WjtMztzcXL322mvG8X333dfoOdu3b9fOnTslScuWLdNNN91kV24AAAAAAAAAcBSLowsAAAAAAKCzO3v2rLEOCAhoND4gIEBZWVmSpDNnzsjb29upcl64cEFffvmlJKmiokIFBQVKS0vTJ598osLCQknXd9WaPn16gzmtVqv+8Ic/SJKmTJmi0aNHN1onAAAAAAAAADgbBrAAAAAAAGhjVUNJktSjR49G47t3717nuc6SMykpSUuXLq3ztV69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u7u70YCVlZVVa1NVdnZ2pXsb02233aZnn31Ws2bNUnFxsVasWKGlS5faPJ+vr6+6dOmic+fOqaioSMnJyQoICLBjxQAAAAAARxAfH6/Zs2cb/94td/HiRV28eFF/+9vfNG7cOL3yyisym80Ok/P111/X6tWrde3atRtey83NVW5urpKSkrRu3TqFh4drwYIFateunV3qBwDAFuy5AIDmjAYsAABgN/7+/kpOTpYkJScny8/Pr8b48lhJ6tq1a6PWJklDhw41xvv372/wfJ6enjp37pwkKScnp8HzAQAAAAAcy969e/XMM8+ouLhYkjR8+HCNGDFCbdu21YkTJ7Rhwwbl5uZq3bp1MplMmjdvnsPk/Pbbb40Pgrt06aKBAweqe/fu8vT01JUrV3TgwAFt2bJFxcXF+te//qXU1FR9+OGHat26dYPfAwAA9cWeCwBo7mjAAgAAdhMUFKRdu3ZJkhITEzVw4MBqY9PT05WamipJ6tChg7y8vBq9PovFYox//BNNtsjKyjLGHh4eDZ4PAAAAAOA4ioqKNHv2bOND2ZdfflmPP/648fpDDz2kcePGKSoqSmlpafroo490//33a9CgQQ6R02w265e//KUmTpyou++++4bXIyIi9Otf/1q//vWvlZGRoWPHjumvf/2rpk2bZnP9AADYgj0XANASODV1AQAAoOUIDQ01xjt37qwxdseOHcZ42LBhjVZTReWnVUlqcMPXpUuXdP78eUmSi4uLbr311gbNBwAAAABwLBs2bFBKSook6d577630oWw5f39/zZ0717h+8803HSbnokWLtGzZsio/CC7XvXt3zZ8/37jetGmTraUDAGAz9lwAQEtAAxYAALCbkJAQ+fj4SLr+iL/jx49XGVdSUqIPPvjAuB45cuRNqe+jjz4yxn379m3QXMuWLVNZWZkkacCAAWrbtm2D5gMAAAAAOJYtW7YY4yeffLLauLCwMOOHco4cOWJ8mNvUOdu3b1+nnPfee69cXV0lSSkpKbpy5Up9SgYAoMHYcwEALQENWAAAwG7MZrOmTp1qXM+aNUsZGRk3xC1evFgnT56UdL0RquLJWRVt2rRJwcHBCg4OVlRUVJUxa9eu1d69e41mqKqUlJRo5cqV+vDDD42vTZgw4Ya48+fP669//WuN//AtLi7WokWLKv2EUsX3DAAAAABo/q5cuaJDhw5J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qadcPu/n5yd/f39Vq1ZNzZo10yOPPKIWLVoU+NhvJ7vdro0bN2rt2rU6fPiwLl26pFKlSqlatWrq3Lmz+vbtq2rVqnm0z9zeV2fatm2rzz//3KPHAQBFFRmWN2SYFBkZqRUrVmjz5s2KjIyUzWZTpUqVFBISop49e6pr167y8vK6JX0nJiZq5cqV2rJli44cOaK4uDiVLFlSlStX1n333adHH31UISEhedrXRx99pLlz5+ar/1GjRmnEiBHuHDr+fxRgATAtu90um80mm81mXByfPXu2Jk+erC5duhT24QEATC42NlZz587VsmXLlJqamu35iIgIRURE6MCBA/r444/1wAMPaMKECWrQoEEhHK35Of6h3bp1ay1atKiQjwgAkJsbN27oiy++0MKFC3XlypVsz6ekpMhmsykqKko7d+7Uv//9b9WuXVsjR47Uww8/fMtOWFqd3W7X+PHjjeKrgIAA3XfffapQoYK8vTMWu8/PRYSijM8HAFC0fPfdd8aFa0lKS0vTmjVrNGTIEI/1kZKSori4OMXFxSk8PFyLFy9W+/btNXXqVAUFBbm1z6tXr2rTpk3atWuXjh07psjISCUkJMjX11cBAQFGsXjHjh31l7/8pUCfUS5evKjx48dr165dWX6elJRkvKYFCxborbfeUt++fd3uBwCQP2RY7sgwafny5Xr//fdls9my/PzcuXM6d+6cfvjhB91///2aPn262/+mruzcuVPjxo1TdHR0lp8nJyfrypUrOn78uBYtWqTBgwdr3LhxKlasmEf7h2dQgAXAFO69995sK4ukp6fr2rVrOnr0qE6cOCFJiomJ0ciRIzVv3jx16tSpMA4VAGABJ06c0AsvvKCoqCjjZ76+vmratKmqVaumYsWK6dKlSzpw4IASEhIkSdu3b9eePXs0Y8YMPfTQQ4V16AAA3BaRkZEaPny4jh07luXn1apVU8OGDVW+fHmlp6crJiZGR48eVUxMjCTpzJkzGjNmjKKiojx6ovtOcvDgQZ05c0aSFBgYqPXr1yswMLBwDwoAcEf49ttvnf6sIJk+cODALNvJycmKjIzUvn37lJiYKEnatm2bnn76aS1dulQBAQF53vfFixc1b948rVq1SsnJydmeT01NVWJioi5duqQ9e/ZowYIFqlmzpp577jk98cQT8vHxyddrSUhI0AsvvKDjx48bP2vSpImCg4OVkJCgXbt26erVq7LZbJo4caK8vb3Vp0+ffPWRF5UqVVK3bt1ybVe3bl2P9w0ARRUZljMyTPrmm2/05ptvGtuZX3by9/fXH3/8obCwMEnSjh079Pzzz2vJkiUqXbq0R/reuHGjXnnlFaWlpUnKWKGtRYsWqlWrlpKTkxUaGqozZ87Ibrfryy+/1OXLl/Xhhx/mueDO2XV2V+1QMBRgATCFDh06aOTIkS6f37dvn1577TVduHBBaWlpeuedd/TAAw/Iz8/vNh4lAMAKTpw4oSeffNJYycPPz0/PPfecnn32WZUvXz5L2+TkZG3YsEHTpk1TbGyskpOT9eqrr2ratGnq1avXbT3uvn37WvabRwCAouX8+fMaMGCA8a1MLy8vPfzwwxo+fLjq16+frb3dbldYWJi++uorrV27Vunp6cbJaPxPmzZtshW0ORMeHm487tKlS47FV3ndp5Xcia8ZAG6Hc+fOad++fZIkb29v+fj4KCUlRSdOnFBYWJjbF+zefvttpz+PjY3VpEmT9MMPP0iSTp48qVmzZumdd97JdZ9paWmaN2+eFixYkOUzh5+fnxo2bKjq1aurbNmySktLU1xcnE6ePKmzZ89Kkv78809NmjRJX3/9tWbMmKGGDRvm+bVMnjzZuHBdrlw5/fOf/1Tbtm2N5202m95++22tXbtWkvTmm2+qefPmqlWrVp77yIvatWu7fF8B4E5EhuXuTs+wU6dOadKkScZ2z549NXnyZJUqVcr42c6dOzVq1ChduXJFx44d03vvvaepU6cWuO/Mlccyi68aNWqkWbNmqU6dOlnabdiwQW+88YZu3Lih9evXq2nTpnr66afz1Edu19nhOd6FfQAA4AktW7bU7Nmzje2LFy9qz549hXhEAAAzSkpK0ujRo43iq5IlS2rhwoV67bXXshVfSVKxYsXUp08frV69WrVr15aUsULjO++8o9OnT9/OQwcA4LZITk7WqFGjjOKr4sWLa+7cufrwww+dFl9JGQVaTZo00fTp07V69Wpu11tAmbcelOTxWx4AAODKt99+K7vdLimj2LVz585ZnvO0wMBAzZw5U82aNTN+tnz5cmMValeuXr2qoUOHat68eUpMTJS3t7ceeughffLJJ9q/f79WrFihOXPmaMqUKXr//fc1f/58/fjjj9qyZYvGjh2r6tWrS5KOHz+ufv366aeffsrT8R4/fty4KC1JM2bMyHLhWpJKlSql6dOnq3nz5pIyblU1Z86cPO0fAOA+MixnZJg0e/ZspaSkSJJatGih6dOnZym+kqS2bdvqH//4h7G9evVqnTx5ssB9//vf/9b169clZfyN/9lnn2UrvpKkHj16ZOn/448/1rVr1wrcPzyLAiwAltGsWTPdddddxnbmbQkBAMirTz75JMsyy9OnT1fr1q1z/b1KlSpp4cKFxpLDNptNb7311i07TgAACsunn36qQ4cOGdsffPCBunbtmuffb9CggZYtW6b777//VhzeHSE1NdV47O3NqT0AwK1nt9uzXKDu3bt3llWf161b5/T2SAXl6+ub5dZQKSkpxgomzsTFxal///7avn27pIwv7a5cuVJz5sxRp06dVKxYMZe/W6VKFQ0ZMkTff/+9XnvtNfn5+SkpKUmjRo3K0wXsJUuWKD09XZLUrl07tW/f3mk7b29vjRs3ztj+7rvvFBsbm+v+AQDuIcPIsNzExMToxx9/NLbHjRvn8m/tDh06GOcz0tLStGTJkgL3n7lSmiS98MILTr8Inqlbt25GYV98fLzWrFlT4P7hWdyCEDCBnj17GheDP/zwQz3yyCN5+r233npL//3vfyVJTz75pNOlLQ8dOqRff/1V+/fv14kTJxQbG6uUlBQFBASoZs2aatOmjfr3769q1ap57gXdQkFBQTp//rwk6caNG3n6nW3btmnDhg3av3+/oqOjlZqaqgoVKigkJERdunRRz549Xd7KcNiwYfrll18kSXfffbeWL1+e44eg33//XQMHDjROmM+ePVt/+9vf8vEKAeD2uBOz58aNG/r666+N7a5du+qvf/1rnn+/evXqeuWVV4xlh3/77TeFhobm6d7qkhQVFaWlS5dq8+bNunDhgpKTk1WlShU9+OCDGjhwYK7LOa9cuVITJ06UJD366KP64IMPcu3z5MmTWr16tXbs2KHIyEhdvXpV/v7+qlGjhh544AENGDBAlStXztPxSxl/dP7www/65ZdfdPDgQcXGxspms8nf3181a9ZU06ZN1aVLF913333G/ek/+ugjzZ07N8t+9uzZ43SJ7OrVq2vTpk25vuaffvpJK1as0NGjRxUTE6MyZcqoUaNGxgmWzL7zwlPv0fXr17VmzRpt3rxZx48fV1xcnFJTU1WiRAkFBQWpdu3aatasmTp37pzjyjA7d+7U2rVrFRYWpqioKNlsNvn5+als2bK666671LhxY91///1q165djp9JABTcnZiViYmJWrRokbH917/+VT169Mj3fkqVKqWWLVu6fRwpKSnatWuXdu7cqbCwMJ0+fVpXrlyRl5eXypUrpwYNGuiBBx5Qv379jOLo3Jw8eVIrVqzQ3r17dfbsWV2/fl1eXl7y9/dX1apV1bBhQ7Vu3VqdO3dW2bJlne6joHP97t279dRTT0mSWrduneW9dsw8R3Pnzs2Woy+//LJxa4Gc9ulKTEyMVq1apR07duj06dPGCfXAwEAFBwerTZs26t69e5YvQDm6du2atmzZoj179ujIkSP6888/df36dRUrVkyBgYFq0qSJunbtqr/97W8uT2oX5POBO6+5IOcFMr3++utatWqVJGnq1Knq27evbty4oZUrV2rdunU6e/asrl69qgoVKqhly5YaOHBggf5/AMDaHOe7zNuqHjlyREuXLtWuXbt06dIlSVJwcLD69Omj/v37y9c36+WesLAwLV68WAcPHlRUVJSKFy+uBg0aqF+/flkuPOfF3r17jXOuJUuW1F//+lcVK1ZM5cqVU3x8vOLj47VlyxZ169atIC/bqcyVNjKdO3fOabvU1FS9+uqrOnXqlCRp+PDhGjVqVL6LlYsVK6Zhw4bpvvvu07BhwxQXF6dx48Zp6dKluvvuu53+jt1uz5JFffv2zbGPli1bqlatWjp79qzS0tK0adMmPf744/k6TgAoqsiw/yHDzGHTpk1GAVrt2rXVokWLHNs/+uij2rFjhyTp559/1ptvvul23xEREcYK45L04IMP5vo7HTp00O+//y5J+vHHHzVw4EC3+4fnUYAFmECvXr00Y8YMSdKaNWvydGI/OTk5S8Wssw8kjz/+uMLCwpz+/uXLl3X58mUdOHBACxYs0KhRo7JUahdVMTExxuOKFSvm2Pby5csaM2aMdu7cme25yMhIRUZGauPGjfrXv/6lGTNmOL0H9NSpU9WrVy9FR0fr6NGjmjlzpl5//XWn/SUkJGjs2LFG8VXfvn0pvgJQZN2J2fP9998rPj7e2H722WfzvY9+/fpp9uzZstlskjK+PZSXAqyff/5ZEyZMyLZk8OnTp3X69GktW7ZMb7zxhvr375/vY3ImOTlZ7733nr755hvj3vKZ4uLiFBcXp9DQUC1c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qlWNx7t379bp06dzXerfGU/M9YXJMc8HDhzosVvhXb16Vb///rtOnDih+Ph42Wy2LLchdrxVxZEjR27r6o236rxApk6dOuV64j4kJMSYO5x9LgGATA899FCOz9+8gvPf/va3HNs7XgjPbcXm1atXG3N3/fr1s/xNlalGjRpq2bKlsSLkqlWrNGHChBz362jy5MlZtlNSUhQZGam9e/dmubBap04dvfrqq9l+P/PieqdOnbKtKm23241VQfz8/PTZZ59lWbG5Vq1aGj16tOrXr68xY8a4PEY/Pz+FhIRo3759OnbsWLbnM1eFzmybFzcfq+M+3HHPPfdoy5Yt2fYrZfwb1ahRQ71799acOXP08ccfS8ooXli4cKFGjBhRoL4BwBUyLAMZlrNblWGLFi3Kte+bj93ZMTjj2K6ghWBDhgzRunXrlJKSogsXLui5557TzJkzVbNmzSztfvjhB6e3qXTV/6BBgzRy5MhsP/fz81ODBg3UoEED9e/fX6NHjzZWiF68eLF69OihVq1aFeg13ckowAJMpFevXsbJubVr1zo9sX/hwgWjgtnPzy9LNbgzq1at0ieffGKcLM5NSkqKrl275rK46VZ5+eWXnYaEzWZTRESEtm7dqk8//VSxsbFas2aNjhw5osWLF2c7zosXL+ry5cvGdosWLXLtOzAwULVr1zZODh8+fNjlidYnn3xSW7du1ebNm5WYmKiVK1caz7377rt5vncwABQVd0r23Lxq040bN9ze183feLn5m003a968ea779PHx0b333mssL3zkyJF8F2AdO3bMODZfX988f5vF8dtkFy5cyPKc47e4nC0lfjvl5baRjss5OyuMuxXvUffu3bVr1y5J0ocffqgdO3aoZ8+eateuXZbCqpx06NBBpUqVks1mU3h4uLp3767HH39cHTp0UEhISJG6jRVwJ7pTs7Ig3/AsqMTERH3yySdaunRptpUHXXHWrmrVqmrWrJl+//13Xbt2TX379lXv3r3VrVs3tWjRIs/Frp6Y6wtLTExMluIfT+T5hQsXNGPGDP3www95vhVFXv8dPeFWnxeQPPO5BAAy5TanOOZ/mTJlXN4KN1N+5p9Vq1YZj3MqIO/du7dx8Xrt2rUaO3Zsnv9OWbx4ca5t2rVrp6lTp2Y59kyHDx+WJKcXCo8dO6azZ89Kyli92PHCtaNHHnlE33zz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87Fs2TLFbwbA//73P6k5U1J6ejpOnTqFU6dOyd2/efPmWLt2LTp06KBUf0RERERERCStzuawLg0iAkqyPbm4uMisJxKJ4OXlJWyfPn26zvSZmpoqlG1tbeX2KxKJYGNjI2yXPnEk6fz588KTzQMHDoSFhYXMtgwMDDBq1CgAQHFxMf744w+5/RIREREREZF8dnZ2Qjk+Pl5hfck69vb29aZPADA0NETnzp0BlGTVunXrlsptVTfJbB5ZWVm1OBIiIlInQ0ND7NixA99//z0++OADWFpaQkdHByYmJmjfvj18fHxw6tQpdOrUqU716erqiiNHjuCrr76Ch4cH7O3tYWBgAJFIBD09Pbz11lvo2rUrpk+fjtOnT2Pjxo0wMTGptvdQkWHDhsHPzw+TJk2Cm5sbmjdvjiZNmkBLSwtGRkZo0aIFhg0bhm3btuHMmTMMviIiIiIiIqqCOpsB69KlS0K5V69eFdaVfF1yv9ru09TUFC9evAAAPH36VO5TUmKxGHFxcQBKnrySvOCuytjee+89fP/998J+M2fOrLA+ERERERERlefk5CRkNr5z5w66du0qt25ycjISExMBAE2bNi23BFBd7rOUZLatzMzMKrVVndLS0oSyqlm+iIio/vDw8ICHh4fK+3/88cf4+OOPa6xPTU1NtG/fHu3bt1dp/7IuXLhQLe0AgImJCT788EN8+OGH1dYmERERERERyVZnM2DFxMQI5bZt21ZY19zcHJaWlgAgLONXF/qUPGlfs2YNcnNzy9UpLi7Gli1bkJKSAgAYMWIEmjRpUqWxtW7dGiKRCAAQGxuL4uLiCusTERERERFReT179hTKih72+fvvv4Xye++9V6/6LPX06VOhXNVgruoUGhoqlGU9sERERERERERERERU2+psANaTJ0+EsrW1tcL6knUeP35cJ/qcOXMmmjdvDgC4fPky+vbtiw0bNsDf3x8BAQH48ccfMWTIEPz0008AgI8++gjffPNNuXaKioqEDFkikUgI/JJHW1tbWKIwJydHyMJFREREREREynNzc4O5uTkAICwsDNHR0TLricVi/Prrr8L2wIED61WfAHD79m3cvXsXQMk5paIHf2pKXl4eduzYIWy///77tTcYIiIiIiIiIiIiIjnqbABWVlaWUDYxMVFY39jYWOa+tdmnqakpjhw5gkGDBkFLSwspKSnY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19dXUt6sq61btzrs27x583Tw4EFJUufOnRUREaEXX3xRffv21dChQ/X1118bM53OnDmjqVOnXvX7AQAAAAAAAADXyo4dO5SQkCAp7zvPNm3a2I0zm80aPHiwcbx27doK0+b3339vlIcMGeKw3eDgYLm7562ysmHDBmVkZBQ4v2/fPiORq1WrVmrdurXDuho1amRsFXjq1Cnt3r27UMzp06eNBTb8/PzUu3dvh/U999xzRnnNmjUO4wAAlU+FTcDq3r27Ud60aVORsRs3bjTKPXv2rBBtenh4GGVnK1ZJMrYLlPKyqYvqW/4P5KXtGwAAtspj5pOUl1zsLEn4scce07333ispb7aSo2fgV199pTNnzkjK24b3mWeeKRTTtGnTAoljH3/8sd26UlJSFB4eLkmqWrWqpk2bVuC5LklVqlTRe++9ZyR0fffdd2W2KhgAAAAAAAAAlDXb3z579OhRZKzteWe/mV6vNo8dO2Z8B+zv769GjRo5rMvT01N33XWXpLyFL7Zv317g/J9//mmUbXdIcsQ2JioqqtB52/527969yO+9O3bsaCSH7dy50+7CHACAyqnCJmB17tzZ+FFz+/bt2r9/v904i8WiRYsWGceO9t293m3arlj1888/G1nUjqxevdoot23bttD5Xr16qWrVqpLysr4drQCSlpamFStWSJJMJpMefvjhItsFAKA8Zj6VRPPmzY2yo63+1q1bZ5SHDh3qsK7AwEA1bNhQkvTrr78aH9htrV+/XpmZmZLynvGOtvL18PDQwIEDJUm5ubkFZl8BAAAAAAAAQEVy5MgRo2zvt0hbvr6+ql+/vqS872STkpLKvc2S1HVljO21Ut73uaV1+PDhQq+VpG+urq7GilsWi0XHjh0rdV8AABVLhU3AMpvNGjlypHE8ceJEnT9/vlDctGnTjC2COnToUGClKFurVq1Sy5Yt1bJlywI/Hl+rNjt06KAGDRpIytuqafz48XYzmHNzczVz5kwj87patWp2k6a8vb2NfmdmZio0NFRpaWkFYnJycvTWW28ZP6L369dP/v7+du8VAIB85THzqSR+//13o2xvZa5Lly5p586dkvKSojp27OiwLhcXF6crXpbk/bBdafJ6vR8AAAAAAAAAUFInTpwwyn5+fk7jbWOOHz9e7m3aHpe0Ltt+SDIW5JCkkydPOq3LNsbee3E193ll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888/S5Jq1qyp3r17F4qx/Q47OjpaubmOVxiPiYlRenq6JKljx44FdngAAFRuJGABAHCTK8nMobKa+VQSnp6eRjl/pS5b/v7+cnHJ+y/NgQMHZLEUvRKUs5lPJXk/bNsLCAiQyWQqMh4AAAAAAAAAykPnzp3l6+srKW+i6/79++3GWSwWLVq0yDju06dPhWnz4YcfNsoLFy502O6KFSuMJKf7779f1atXL2nXDe+//76ysrIkSc8884yqVatWKKZRo0bG1oRxcXH6z3/+47A+23737du31P0CAFQ8JGABAHCTK4+ZTyVx8uRJo2wv4cvT01MdOnSQVHBmkz1Wq1WbN282jm1nJuWzfT/yl8d2pDzeDwAAAAAAAAAoKbPZrJEjRxrHEydO1Pnz5wvFTZs2TQcPHpQkdejQocD3pbZWrVqlli1bqmXLlho8ePB1afP555+Xh4eHJGnJkiVav359oZg9e/bo448/liS5urrq5ZdftluXZH/HhXyXL1/W5MmTtW7dOkl5E3dHjBjhMH706NFGOSwsTL///nuhmMWLFysqKkqS5Ofnp/79+zusDwBQ+biWdwcAAED5yp+FlJCQYMxCatOmTaG4spz5VBLLli0zyvmJVlfq06ePYmJiJEnz5893uKR0ZGSksTR1u3bt5OfnVyimV69eCgsLU2ZmptauXatXXnnF7taCaWlpWrFihSTJZDIVmH0FAAAAAAAAABXNwIEDFRkZqS1btujo0aMKCgpScHCwAgIClJKSorVr1xoTXGvUqKGwsLAK1WatWrX01ltv6fXXX5fVatWoUaPUp08f3XPPPXJxcdGuXbv07bffKjMzU1JeUpS/v7/D+kaMGCFvb2/16NFDrVq1Us2aNXXp0iUdPnxYP/zwg86dOycpL1lq7ty5cnNzc1hXz5491b9/f61atUoJCQl64oknFBwcrNatW+vy5cvasGGDkXxVpUoVvf/++0XWBwCofEjAAgDgJpc/C+mdd96RlDcLKTw8XLVq1SoQV5KZT2+88YakvOQu26StfEuXLlXTpk119913O9y2z2Kx6PPPP9eXX35pvPb000/bjR0wYID+/e9/648//lBUVJSWLFmiQYMGFYg5efJkgQ/vY8eOtVuXt7e3Bg8erH//+9/KzMxUaGio5s2bZ8yskqScnBy99dZbSkhIkCT169evyA/yAAAAAAAA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RoFtCwcOHKj//ve/GjFihLKysvTmm2/qxx9/dLqdore3twIDA0t9nwAAAAAAAAAAAABufC7OQwAAwI3MYrFozpw5xvFHH31UIPkqX2hoqG677TZJeStObd68udRtjhs3Tp9//rnuueeeQslX+Ro2bKhZs2YZx99//70uX75cKC4yMlJnzpyRlLfy1euvv14g+Spft27d9OKLL0qSEhMTFR4eXur+AwAAAAAAAAAAAEA+ErAAALjJ7dixQwkJCZKkzp07q02bNnbjzGazBg8ebByvXbu21G3WrFmzWHGtWrVS06ZNJUmXL1/W77//Xijml19+McpBQUEOE7ok6YknnjDK3333XXG7CwAAAAAAAAAAAAAOkYAFAMBNbtOmTUa5R48eRcbanre97lqy3SYwMzOz0Pk///zTKOcnazlSr149Va9eXZJ04sQJnTx5smw6CQAAAAAAAAAAAOCm5VreHQAAAOXryJEjRrlt27ZFxvr6+qp+/fqKj49XYmKikpKS5OPjc836lpWVVSBJqkGDBoVicnNzS13/4cOHdeuttzo8f+LECT399NP67bfflJaWJi8vL/n5+alTp04KDg52mvAFAAAAAAAAAAAA4MbHClgAANzkTpw4YZT9/PycxtvGHD9+/Jr0Kd+aNWt08eJFSVKbNm3k6+tbKKZ27dpG2dmKVmfPntXly5eNY2f9T0hI0M6dO5WSkqLs7GwlJSVp7969+vzzz9WnTx+99957ysrKKsEdAQAAAAAAAAAAALjRsAIWAAA3ufwEJ0ny9vZ2Gl+zZk2715a1pKQkTZs2zTh+6aWX7MZ17NhRq1atkiRFRETo2WeflclkshubH5fvwoULDttv2LCh7rnnHrVq1Ure3t7Kzs7W6dOntX79eh04cEBWq1WLFi3S6dOnNXfuXJnN5pLeIgAAAAAAAAAAAIAbAAlYAADc5NLT041y1apVncbbxqSlpV2TPmVlZWn06NE6f/68JCkwMFC9e/e2G/vggw/qo48+UkpKivbv36+PPvpIEyZMKJSE9csvv+jTTz8t8Jqj/n/xxRe6++677Z4bNWqUIiIiNGnSJGVlZennn3/W/Pnz9cILL5T0NstMjRrVihXn4mIy/vTx8biWXUIlwHhAPsYCAAAAAAAAAABXhwQsAABQoVitVr355puKiYmRJDVu3FgffPCBw3hPT0/97W9/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/e1vys3N1datW7V169YSMWazWS+99JJeeumlMsdp0qSJVq1apRkzZujo0aPKy8tTaGioQkNDbcYPHDhQCxYsKPN713HjxqmwsFDvv/++cnJydOHCBS1btqzM3O+8844effTRcp8VANCw1NsCrOKWlO+8846kopaUwcHBatasWYm4yrTBnD17tqSiQivrAqqayvlb1tsPVrT7VbHAwEB98sknkoraYPr7+9ss4KpIG0wAAAAAQOXt3r1bmzdvVlRUlJKSkuTu7q62bdsqICBAo0ePLrEVfH3JefnyZUVERCgqKkpRUVFKTExUenq6rl69qsaNG8vX11c9evRQYGCg+vXrV+F5FRQU6Ntvv1VoaKhOnTql1NRUNW3aVO3bt9djjz2mESNG2P1loGXLlmn58uUVzjl//nwNHz68wvEAgIYhOzvbOC6v67+tmKysrAaT02w2q2/fvurVq1etFl89+uijGj9+vM1CszFjxigoKEgzZsxQeHi48vLy9Oqrr2rnzp018ueaijKbK//5mEwmmc2mGpgNGhreBRTjXSibu7u7VqxYoV27dmnz5s2KjIxUSkqK3Nzc1KZNGw0aNEijR49WkyZN6m3OsWPH6v7779eXX36pffv2KSEhQYWFhWrevLn69u2rZ599Vl26dLE7TqtWrfTFF19o37592rZtm44fP67ExERdu3ZNjRs3VsuWLXXXXXfpySefVN++fe2ON378eA0aNEghISE6ePCgzp07pytXrkiSbrvtNnXq1EkPPPCAnn766Sp18QQA1G/1tgBLavhtMK1dvnxZ+/btk1T0G0dDhw6t1Lyqsw0mAAAAAKDisrKyFBQUpD179pT4eWpqqlJTU3X06FGtWbNGH374YbVt21NdOT/55BOtXbvW5rXMzExlZmYqJiZGGzduVL9+/bRkyRK7fwmclJSkadOm6ciRI6V+npSUpPDwcH3xxRdatmyZsdUCAAC3ijFjxmjMmDGSpLy8PCUnJysiIkKrVq1SSEiIQkJCNHHiRM2cOVNms7nG59O5c+dyr3t7e2vFihV65plnFBsbq5SUFH355ZeaNGlSjc+tLBZLQYVjHRxMMplMKiwsVEFBYQ3OCvUd7wKKVeVdqErh580gICBAAQEBVb5/+PDhlf4lmRvNae3222/X66+/rtdff/2GxnFwcNDAgQM1cODAaplXixYt9PLLL+vll1+ulvEAAA1HvS7AuhnaYBb75ptvZLFYJEmDBg0q0ba6Iqq7DSYAAAAAwD6LxaLp06cbv1Dj7e1t/JJORkaGtm7dqiNHjighIUGTJ0/WunXr1KFDh3qV08nJSd26dVPXrl3Vtm1beXl5ydHRUampqcbWQzk5OTp48KAmTJigTZs2qVEj21v/ZGVl6cUXXzS6Qrdu3VojRoxQ69atlZiYqK+//lqnT5/WmTNn9MILL2j9+vXy9va2+8zTp09Xp06dyo2pyG8vAwAaHldXV2VkZEiScnNz5ehY/l9Z5+bmGsdublXbWqq2cjo5OcnX11dDhw7VkCFD9Prrr2vLli367LPP5OzsrBkzZlRp/tXN1dVVL7/8smbOnClJ+v777+u0AOvKlRzl51sqFOvl5Saz2aSCgkKlplatOxluDrwLKFbZd8HR0SxPT9damBkAALjZ1esCLOnmaIMpFW2BWOyZZ56p0ryquw0mAAAAAKB8GzZsMAqh/P39FRwcXKKgaNy4cVqwYIFWrlypjIwMzZ07t8yOU3WRc+LEiQoKCpKrq+0vFMaOHaupU6dq4sSJunjxos6ePas1a9aU+aXrihUrjOKrPn36aMWKFSW+iB4/frxee+01bdu2TfHx8VqwYIHef/99u8/cu3dv3XfffXbjAAA3nyZNmhjFUGlpaXYLnNLT00vc21Byms1mvfXWWwoLC1NmZqZWrVqlSZMmycPDo0rjVTfrdfjcuXN1OBMAAAAAaJjqfQFWsYbeBnPHjh3VMk51t8EEAAAAANhmsVi0fPly43zhwoU2uzkFBQXp4MGDOnnypCIiIrR//37179+/XuRs3bq13Zx+fn6aOXOmpk6dKkkKCwuzWYCVnp6u4OBgSZKLi4sWLVpU6gtrJycn/fWvf9XPP/+spKQkffvtt3rppZduuCsYAODm1a5dO8XFxUmS4uLi5OfnV258cawktW/fvsHklIp+8bd37976/vvvlZubq2PHjunBBx+s8njVyXoL4szMzDqcCQAAAAA0TLfmpsYAAAAAANhRXEQkFXV76tq1q804s9msCRMmGOdlbRVfX3NKRZ22iiUnJ9uM2b17t7EF05AhQ9SiRQubcW5ubho1apQkqbCwUN99990NzQ0AcHOz3oI2MjKy3Njk5GQlJCRIkpo1a1aiaKi+5yxmXbx85cqVGxqrOqWlpRnH1bnbBAAAAADcKijAAgAAAADAhr179xrH9rpTWF+3vq8h5JSkixcvGse2Om5Vdm7WXZtvdG4AgJvbgAEDjGN7a8YPP/xgHN/IDgF1kbPYhQsXjOMbLeaqTuHh4cZxu3bt6nAmAAAAANAwUYAFAAAAAIANMTExxnH37t3LjfXx8ZGvr6+kok4ZqampDSZnSkqKFi9ebJwPHjz4hufWpUsXmc1mSdKZM2dUWFhYbvzSpUs1aNAg9ejRQz179tTDDz+sadOm6ZtvvlFeXl5FHwUA0AD16dNHPj4+kqRDhw4pOjraZpzFYtHq1auN8yFDhjSonJJ0/PhxnThxQlLRtr321tPakpOToxUrVhjnDz30UN1NBgAAAAAaKAqwAAAAAACw4fz588axn5+f3XjrmNjY2HqXMy4uTrt27dKuXbu0c+dObdiwQXPnztXgwYON4qoHH3xQY8eOLXVvQUGB0SXLbDYbhV9lcXJyMrYozM7O1uXLl8uNj4iI0MWLF5Wbm6vs7GzFx8drx44dmjVrlh577DEdO3as3PsBAA2X2WzWlClTjPNZs2YpJSWlVNyiRYt08uRJSVKvXr1KdLGyFhISos6dO6tz584ltuutqZynTp1ScHCwsrKyynnKouKrV155xShKHjp0aI1v9bdnzx5t27ZN+fn5ZcakpqZqypQpOnv2rCTJ09PT5p8FAAAAAADlc6zrCQAAAAAAUB9lZmYax56ennbjmzZtavPe+pJz3759evvtt21ea9WqlcaMGaNJkybJwaH072plZ2cbX942adJEjo72/zqhadOm+te//iVJunLlilq2bFkqxtnZWffee6969uyp1q1bq1GjRkpLS9Mvv/yi7du369q1a4qLi9P48eO1cuVK9enTx25eAEDDM2rUKO3atUsHDhzQmTNnNGzYMI0cOVL+/v5KT09XaGioDh8+LEny8PDQvHnz6k3OjIwMvffee1qyZIn69eunbt26qVWrVnJzc1NOTo7i4+MVHh6u8PBwo/iqY8eOmjVrVplzO3HihHbs2FHiZxEREcbxTz/9VKqoavDgwerSpUuJn128eFHz589X06ZN1b9/f91xxx1q3ry5XFxclJGRoWPHjmn79u3Kzs6WVLQuf/jhh3J3d6/gpwgAAAAAKEYBFgAAAAAANhR/GSlJLi4uduOtY+x1wahPOc1ms/r27atevXrZLL767dgVmVdF5vboo49q/PjxNgvNxowZo6CgIM2YMUPh4eHKy8vTq6++qp07d9bpl8IeHo0qFOfgYDL+6eXlVpNTQj3HuwBrvA9lc3R01NKlSxUUFKSwsDAlJSXp448/LhXXsmVLffDBB+rYsWO9y5mTk6OwsDCFhYWVGxcYGKg5c+aUKKL+rVOnTpXYEvC3IiIiShRkSVLbtm1LFWAVS09P19atW7V169Yyx7z99tu1YMEC3X333eXOHwAAAABgGwVYAAAAAADcAsaMGaMxY8ZIkvLy8pScnKyIiAitWrVKISEhCgkJ0cSJEzVz5kyZzeYan0/nzp3Lve7t7a0VK1bomWeeUWxsrFJSUvTll19q0qRJNT63spjNtgvUymIymWQ2m2poNmhIeBdgjffBNnd3d61YsUK7du3S5s2bFRkZqZSUFLm5ualNmzYaNGiQRo8eXa3b9lVHznvvvVfr16/XwYMHFRkZqdjYWF2+fFk5OTlydnZWkyZN1L59e/Xs2VOBgYHy9/evtvnbM2zYMLVo0ULHjx9XVFSUEhMTlZaWpqysLLm6usrHx0fdunVTQECAHnnkkVpZ/wEAAADgZkUBFgAAAAAANri6uiojI0OSlJuba3fbvdzcXOPYza1qnU1qK6eTk5N8fX01dOhQDRkyRK+//rq2bNmizz77TM7OzpoxY0aJeOuxrXPWxNysubq66uWXX9bMmTMlSd9//32dFmBZLAUVinNwMMlkMqmwsFAFBYU1PCvUZ7wLsFaV96GyhZ83g4CAAAUEBFT5/uHDh2v48OG1ltPBwUF33XWX7rrrrirdb0tVnsEWT09PPf7443r88cerYVYAAAAAgPJQgAUAAAAAgA1NmjQxiqHS0tLsFhGlp6eXuLeh5DSbzXrrrbcUFhamzMxMrVq1SpMmTZKHh4cR4+rqKkdHR+Xn5yszM1P5+fl2i8Os52Y9VmXdd999xvG5c+eqPE51uHIlR/n5FrtxXl5uMptNKigoVGpq1baGxM2BdwHWKvs+ODqa5enpWgszAwAAAAAAN+rW+xUqAAAAAAAqoF27dsZxXFyc3XjrmPbt2zeYnFLRFky9e/eWVNS56tixYyWuOzg4qE2bNpIki8WihISEcsfLy8vT5cuXJRUVb7Vo0aLKc/Py8jKOMzMzqzwOAAAAAAAAANQUCrAAAAAAALChU6dOxnFkZGS5scnJyUZRUrNmzUoUDdX3nMWsu21duXLlhuZ24sQJWSxFnaL8/f1lMpmqPK+0tDTjuKpdvgAAAAAAAACgJlGABQAAAACADQMGDDCO9+7dW27sDz/8YBwPHDiwQeUsduHCBePYVjGX9dz27dtXa3MLDw83jq07hAEAAAAAAABAfUEBFgAAAAAANvTp00c+Pj6SpEOHDik6OtpmnMVi0erVq43zIUOGNKicknT8+HGdOHFCkuTk5KTu3buXinnkkUfk4uIiSQoNDTW2GPytrKwsrV+/XpJkMpn0+OOPV3leOTk5WrFihXH+0EMPVXksAAAAAAAAAKgpFGABAAAAAGCD2WzWlClTjPNZs2YpJSWlVNyiRYt08uRJSVKvXr1KdIqyFhISos6dO6tz586aMGFCjec8deqUgoODlZWVVc5TFhVfvfLKKyosLJQkDR061OZWf56ensa8c3NzFRQUVGrs/Px8vfnmm0pKSpIkBQYGqkOHDqXG2rNnj7Zt26b8/Pwy55WamqopU6bo7NmzRv6xY8eW+ywAAAAAAAAAUBcc63oCAAAAAADUV6NGjdKuXbt04MABnTlzRsOGDdPIkSPl7++v9PR0hYaG6vDhw5IkDw8PzZs3r97kzMjI0HvvvaclS5aoX79+6tatm1q1aiU3Nzfl5OQoPj5e4eHhCg8PN4qvOnbsqFmzZpU5t5dffln79u3T6dOndejQIQ0bNkyjRo2Sn5+fEhMTFRISotOnT0uSWrVqpddee83mOBcvXtT8+fPVtGlT9e/fX3fccYeaN28uFxcXZWRk6NixY9q+fbuys7MlSc7Ozvrwww/l7u5e5c8VAAAAAAAAAGoKBVgAAAAAAJTB0dFRS5cuVVBQkMLCwpSUlKSPP/64VFzLli31wQcfqGPHjvUuZ05OjsLCwhQWFlZuXGBgoObMmaOmTZuWGePu7q5//vOfmjZtmo4dO6ZLly5p8eLFpeL8/f21dOlSNW/evNyc6enp2rp1q7Zu3VpmzO23364FCxbo7rvvLncsAAAAAAAAAKgrFGABAAAAAFAOd3d3rVixQrt27dLmzZsVGRmplJQUubm5qU2bNho0aJBGjx5tc9u+usx57733av369Tp48KAiIyMVGxury5cvKycnR87OzmrSpInat2+vnj17KjAwUP7+/hWaW4sWLbRu3Tpt2bJFW7du1enTp5WWlqbbbrtN7du312OPPaaRI0fK2dm5zDGGDRumFi1a6Pjx44qKilJiYqLS0tKUlZUlV1dX+fj4qFu3bgoICNAjjzwis9lc6c8QAAAAAAAAAGqLqbB4nwGgBqSlZSs/32I3zsvLTWazgyyWAqWmZtXCzFBf8S6gWGXfBUdHszw9XWthZkD9w3qLquB9QDHWXKDiWHNRWbwLsMaaC1RMRddbiX/P4j94F1CM9RaoOP4bF5XFuwBrrLmlOdT1BAAAAAAAAAAAAAAAAACgoaIACwAAAAAAAAAAAAAAAACqiAIsAAAAAAAAAAAAAAAAAKgiCrAAAAAAAAAAAAAAAAAAoIoowAIAAAAAAAAAAAAAAACAKnKs6wkAAID6Zffu3dq8ebOioqKUlJQkd3d3tW3bVgEBARo9erTc3d2rJc/Vq1d14MABhYeH68SJE7pw4YIyMzPl4uKi5s2bq0ePHgoMDNSAAQNkMpkqNGZWVpY2btyo77//XjExMcrIyJC7u7v8/Pz08MMPa9SoUfL29q7wHK9fv66NGzdq+/btio2NVXp6ury8vHTHHXfoiSee0NChQ+XgQD07AAAAAAAAAAAAcCujAAsAAEgqKl4KCgrSnj17Svw8NTVVqampOnr0qNasWaMPP/xQd9999w3l+uyzz/TBBx8oNze31LX8/HydP39e58+f1+bNm3XPPffo/fffV6tWrcod86efftJf/vIXJScnl/h5Wlqa0tLSFBkZqeDgYL377rt69NFH7c7x3LlzmjZtms6ePVvi55cvX9bly5f1ww8/6KuvvtLSpUsrVdQFAAAAAAAAAAAA4OZCARYAAJDFYtH06dO1b98+SZK3t7dGjhwpf39/ZWRkaOvWrTpy5IgSEhI0efJkrVu3Th06dKhyvvPnzxvFVy1atND999+vrl27qlmzZsrNzdWxY8e0ZcsWZWdnKyIiQhMmTND69evVrFkzm+NFRERo0qRJysvLkyR16dJFTzzxhFq1amV02tq5c6fS09P15z//WR9//LEGDhxY5vwSExM1adIk/etf/5Ikde7cWU8//bSaN2+uS5cuaePGjbp06ZIOHz6syZMna82aNXJ1da3y5wEAAAAAAAAAAACg4aIACwAAaMOGDUbxlb+/v4KDg0t0dRo3bpwWLFiglStXKiMjQ3PnztXatWurnM9kMql///764x//qH79+pXaxu/pp5/W5MmT9cILL+j8+fOKi4vTokWLNH/+/FJjXb9+Xa+99ppRfPXcc89p9uzZJbYtHDVqlH788Uf913/9l65fv6433nhDO3bsKHM7xb/97W9G8dUTTzyhhQsXytHxP39smjBhgl566SUdOnRI0dHR+sc//qFXX321yp8HAAAAAAAAAAAAgIbLwX4IAAC4mVksFi1fvtw4X7hwoc0t9YKCgnTnnXdKKuo4tX///irn/POf/6xPP/1UDzzwQKniq2K/+93v9OGHHxrn3333na5du1YqbteuXYqPj5dU1Pnq9ddfL1F8Vez+++/XSy+9JElKTk5WcHCwzbxnz57Vtm3bJEk+Pj569913SxRfSZKbm5sWLVokFxcXSdKqVat05coVe48NAAAAAAAAAAAA4CZEARYAALe4n3/+WUlJSZKkPn36qGvXrjbjzGazJkyYYJyHhoZWOWfTpk0rFHfHHXeoXbt2kqRr167p119/LRXz008/GcfDhg0rs6BLkp555hnj+Ntvv7UZs23bNhUWFkqSnn32Wbm5udmMa9GihR5//HFjbrt377bzNAAAAAAAAAAAAABuRhRgAQBwi9u7d69x/OCDD5Yba33d+r6aZL1NYG5ubqnr//73v43j4mKtsrRs2VKNGzeWJJ0/f14XLlwoFWP9XAMHDix3POvrtfV5AAAAAAAAAAAAAKhfKMACAOAWFxMTYxx379693FgfHx/5+vpKKtrGLzU1tUbndv369RJFUq1atSoVU9ytqipOnz5daqyzZ89KKur4VbzlYlmsPy/rzxEAAAAAAAAAAADArYMCLAAAbnHnz583jv38/OzGW8fExsbWyJyKbd26VZmZmZKkrl27ysfHp1SMt7e3cWyro5W1y5cv69q1a8b5b+efkJBgXG/ZsqWcnJzKHa9ly5Yym82SpF9//fWGisEAAAAAAAAAAAAANEwUYAEAcIsrLnCSJE9PT7vxTZs2tXlvdUtNTdWiRYuM85dfftlm3D333GMcb968udwiqJCQkBLnV65cKfPc+jnL4uTkZGyRmJeXp+yPam9mAAAgAElEQVTsbLv3AAAAAAAAAAAAALi5ONb1BAAAQN2yLhpycXGxG28dk5WVVSNzun79uqZOnaqUlBRJUkBAgAYNGmQzdvDgwVq4cKHS09MVHR2thQsX6rXXXpPJZCoR99NPP+nvf/97iZ/9dv6V/Sx+G5eVlSU3N7cK3VedPDwaVSjOwcFk/NPLq/bnifqF9wHFeBcAAAAAAAAAALgxFGABAIB6paCgQG+88YYiIiIkSW3atNF7771XZry7u7v++7//WzNnzpQkrVy5UuHh4QoMDJSvr6+uXr2qH3/8UTt27JDFYlGbNm108eJFSSpVpNVQmc2Va2pqMplkNt8cz44bx/uAYrwLAAAAAAAAAABUDQVYAADc4lxdXZWRkSFJys3NlaNj+X88yM3NNY6ru9tTYWGh3nrrLX377beSpFatWumzzz7TbbfdVu59Tz75pHJzczVv3jxdv35d0dHRio6OLhHj4OCgqVOn6sqVKwoODpakUuO6uroax9bPWZ6a/DwqymIpqFCcg4NJJpNJhYWFKigoe6tG3Bp4H1CsKu9CZQs/AQAAAAAAAAC4mVGABQDALa5JkyZGAVZaWprdIqL09PQS91aXwsJCvf3221q/fr0kqWXLlgoODpafn1+F7h85cqQGDBigL774Qvv379elS5d07do1eXt765577tGECRN011136bXXXjPu8fb2LjGGh4eHcWz9nGXJz8/X1atXJUlOTk4lCrhq05UrOcrPt9iN8/Jyk9lsUkFBoVJTa2b7SDQcvA8oVtl3wdHRLE/Puvn3HQAAAAAAAAAA9REFWAAA3OLatWunuLg4SVJcXJzdgqfiWElq3759tcyhsLBQ77zzjr788ktJUosWLfT555+rTZs2lRqnZcuWmjFjhmbMmFFmzNmzZ43jHj16lLjm6+urxo0b69q1a/r3v/+tvLw8OTk5lTlWQkKCLJaiwqe2bdveNFsaAgAAAAAAAAAAAKg49o0AAOAW16lTJ+M4MjKy3Njk5GQlJCRIkpo1ayYvL68bzl9cfLVu3TpJUvPmzfX555+rbdu2Nzz2b6WlpSkmJkZS0XaDXbp0KXHdZDLJ399fkmSxWHTy5Mlyx7P+vDp27FjNswUAAAAAAAAAAADQENABC0C9kZx+TUdjU5WTm69GLo5q7dVY3k0b1/W0gJvegAED9Omnn0qS9u7dqxdffLHM2B9++ME4Hjhw4A3n/m3xlY+Pjz7//HPdfvvtNzy2LZs3b1ZeXp4kadiwYXJ2di4VM2DAAKOwau/evaW6ZFmr7s8DqC2suQAA1DzWWwAAagdrLgAANY/1FrCPAiwAde58whVt3n9ekedSVGj1c5Ok7h2aaVj/dmrn61FX0wNuen369JGPj4+SkpJ06NAhRUdHq2vXrqXiLBaLVq9ebZwPGTLkhnPPmzevVPFVu3btbnhcWy5fvqyPP/5YkuTk5KQ//OEPNuOGDBlixH355Zf64x//KFdXV5vjfffdd5KkRo0a6ZFHHqmReQPViTUXAICax3oLAEDtYM0FAKDmsd4CFccWhADq1OHTiZq/5rCO/2bRlqRCScfPpWj+msM6fDqxLqYH3BLMZrOmTJlinM+aNUspKSml4hYtWmRsyderVy8NGDDA5nghISHq3LmzOnfurAkTJpSZ991339UXX3wh6T/FV+3bt6/SM1y6dEnx8fFlXj9z5oyee+45ZWRkSJKmTZtWZq6OHTvq8ccflyQlJSXpzTffVH5+fomYrKwsBQUFKTc3V5L0/PPPy8OD/8BA/caaCwBAzWO9BQCgdrDmAgBQ81hvgcqhAxaAOnM+4Yo+2RKtfMtvl+yS8i2F+mRLtGaPb0QFNVBDRo0apV27dunAgQM6c+aMhg0bppEjR8rf31/p6ekKDQ3V4cOHJUkeHh6aN2/eDeX74IMPtGbNGkmSyWTSH/7wB8XGxio2Nrbc+7p06aJWrVqV+nl0dLT+/Oc/q1evXurTp4/atm0rFxcXJScnKzw8XGFhYUYR1YgRIzRp0qRy88yePVtHjx7Vv//9b23dulVnzpzR8OHD1bx5c126dEkbNmzQpUuXJEl33nmnJk+eXJWPAag1rLkAANQ81lsAAGoHay4AADWP9RaoPAqwANSZzfvP2120i+VbCrVl/3lNH3lXDc8KuDU5Ojpq6dKlCgoKUlhYmJKSkoxt+Ky1bNlSH3zwgTp27HhD+Y4cOWIcFxYWavHixRW6b/78+Ro+fLjNawUFBYqIiFBERITN640bN9aUKVP04osvymQylZunRYsW+vTTTzV16lTFxsbq9OnTmj9/fqm4nj17atmyZXJzc6vQ/IG6wpoLAEDNY70FAKB2sOYCAFDzWG+ByqMAC0CdSE6/pshzpbc4K8/xcylKzrgm79sa19CsgFubu7u7VqxYoV27dmnz5s2KjIxUSkqK3Nzc1KZNGw0aNEijR49WkyZN6nqqpdx3332aN2+ewsPDdfr0aSUnJysrK0tNmzZV69at9dBDD+mpp55SixYtKjymv7+/vvnmG23cuFHbt29XbGysMjIy5Onpqc6dOyswMFBPPvmkHBzY0Rn1G2suAAA1j/UWAIDawZoLAEDNY70FqoYCLAB14tTF9FJ7BdtTKOn0xXR5d2fhBmpSQECAAgICqnz/8OHDy+xSVWz16tVVHt8WT09PPfvss3r22WerdVwXFxeNGzdO48aNq9ZxgdrEmgsAQM1jvQUAoHaw5gIAUPNYb4GqoWUDgDpxLTe/SvdlV/E+AABuVay5AADUPNZbAABqB2suAAA1j/UWqBoKsADUicYuVWvA51rF+wAAuFWx5gIAUPNYbwEAqB2suQAA1DzWW6BqKMACUCfuaNNUpkreY5LUuU3TmpgOAAA3LdZcAABqHustAAC1gzUXAICax3oLVA0FWADqhHfTxureoVml7unRoZm8b2PfYAAAKoM1FwCAmsd6CwBA7WDNBQCg5rHeAlVDDzgAdWZY/3Y6cSFV+ZZCu7GOZpOe7N+uFmYFAMDNhzUXAICax3oLVI/du3dr8+bNioqKUlJSktzd3dW2bVsFBARo9OjRcnd3r3c5L1++rIiICEVFRSkqKkqJiYlKT0/X1atX1bhxY/n6+qpHjx4KDAxUv3797M7n+vXriomJUXR0tKKiohQdHa2YmBjl5eVJkl555RVNnTq10s958uRJffXVVzp48KASExPl4OCgVq1aacCAARo9erTatGlT6TGBusCaCwBAzWO9BSrPVFhYaP//MUAVpaVlKz/fYjfOy8tNZrODLJYCpaZm1cLMUF8cPp2oT7ZEl7t4O5pN+q8nu6p35+a1ODPUtcr+e8HR0SxPT9damBlQ/7DeoiJYc1EW1lyg4lhzYQ/rLcrDmlu+rKwsBQUFac+ePWXG+Pr66sMPP9Tdd99dr3LOmzdPa9eurVDOfv36acmSJfLy8iozZvjw4YqOji7zelUKsJYuXaoVK1bIYrG9jjVq1Ehz5szRyJEjKzVuTajoeiux5t7KWHNRFtZboOL4b1zYw3qL8rDmlkYHLAB1qnfn5po9vpG27D+v4+dSZL18m1TUrvLJ/u3UztejrqYIAMBNgTUXAICax3oLVI3FYtH06dO1b98+SZK3t7dGjhwpf39/ZWRkaOvWrTpy5IgSEhI0efJkrVu3Th06dKhXOZ2cnNStWzd17dpVbdu2lZeXlxwdHZWamqpffvlF27dvV05Ojg4ePKgJEyZo06ZNatSoUZlzs+bj4yNnZ2fFx8dX6Vn//ve/66OPPpIkubi46KmnnlKvXr2Un5+vgwcPatu2bcrJydGbb74pV1dXPfHEE1XKA9Qm1lwAAGoe6y1QOXTAQo2ichqVkZx+TXGp13Tter4aOzvKr1lj9gq+hVE1DVQc6y0qizUX1lhzgYpjzUVlsN7it1hzy/bll1/qrbfekiT5+/srODhY3t7eJWIWLFiglStXSpLuueeeCnecqo2cly5dUrNmzeTqWvb/XnFxcZo4caIuXrwoSZo5c6YmTZpkM3b+/Plyc3NT165d1a1bN7Vo0ULLli3T8uXLJVWuA9bZs2f15JNPymKxyNXVVatWrdJdd91VImbXrl2aOnWqCgoK5OHhoZ07d8rT07NC49cEOmChslhzYY31Fqg4/hsXlcF6i99izS2NDlgA6g3vpo3Vqb03f4gDAKCGseYCAFDzWG+BirFYLEZhkSQtXLiwVCGUJAUFBengwYM6efKkIiIitH//fvXv379e5GzdurXdnH5+fpo5c6ZROBUWFlZmAdbs2bMr+ih2LV++3OioNW3atFLFV5IUEBCgcePGafXq1bpy5Yo+++wzzZgxo9rmANQ01lwAAGoe6y1gn0NdTwAAAAAAAAAAcGv6+eeflZSUJEnq06ePunbtajPObDZrwoQJxnloaGiDyikVddoqlpycfENjVUR2drbCwsIkSa6urho1alSZsc8995xxfKPPCQAAAAC3IgqwAAAAAAAAAAB1Yu/evcbxgw8+WG6s9XXr+xpCTknG9oOSbHbcqm4///yzcnJyJBVtoejm5lZmbOvWrdW+fXtJRdslnjt3rsbnBwAAAAA3EwqwAAAAAAAAAAB1IiYmxjju3r17ubE+Pj7y9fWVVNRBKjU1tcHkTElJ0eLFi43zwYMHV2mcyjh9+rRxbO85fxtj/RkBAAAAAOxzrOsJAAAAAAAAAABuTefPnzeO/fz87Mb7+fkpISFBkhQbGysvL696lTMuLk6nTp2SJBUUFCgjI0ORkZHatm2bMjMzJRV11Ro7dmyl511ZVXlOW/cCAAAAAOyjAAsAAAAAAAAAUCeKi5IkydPT025806ZNbd5bX3Lu27dPb7/9ts1rrVq10pgxYzRp0iQ5ONT85hR18dlWBw+PRhWOdXAwGf/08ip7i0Xc/HgXUIx3AQAA1BUKsAAAAAAAAAAAdSI7O9s4dnFxsRtvHZOVldVgcprNZvXt21e9evWqleIrqfLP2ajRfwqfqvqc1cFsrvznYzKZZDabamA2aGh4F1CMdwEAANQ2CrAAAAAAAAAAAKgGY8aM0ZgxYyRJeXl5Sk5OVkREhFatWqWQkBCFhIRo4sSJmjlzpsxmcx3Ptn6yWAoqHOvgYJLJZFJhYaEKCgprcFao73gXUKwq70JVCj8BAAB+iwIsAAAAAAAqYPfu3dq8ebOioqKUlJQkd3d3tW3bVgEBARo9erTc3d3rXc7Lly8rIiJCUVFRioqKUmJiotLT03X16lU1btxYvr6+6tGjhwIDA9WvX78Kz6ugoEDffvutQkNDderUKaWmpqpp06Zq3769HnvsMY0YMULOzs4VHu/kyZP66quvdPDgQSUmJsrBwUGtWrXSgAEDNHr0aLVp06bCYwEAGhZXV1dlZGRIknJzc+XoWP5fWefm5hrHbm5V21qqtnI6OTnJ19dXQ4cO1ZAhQ/T6669ry5Yt+uyzz+Ts7KwZM2ZUaf4V5erqahxbP0NZcnJyjOOqfrbV4cqVHOXnWyoU6+XlJrPZpIKCQqWm1l3XLtQ93gUUq+y74Oholqenq904AAAAeyjAAgAAAACgHFlZWQoKCtKePXtK/Dw1NVWpqak6evSo1qxZow8//FB33313vcr5ySefaO3atTavZWZmKjMzUzExMdq4caP69eunJUuWyMvLq9y5JSUladq0aTpy5EipnyclJSk8PFxffPGFli1bpnbt2tl91qVLl2rFihWyWEp+0RoTE6OYmBitXbtWc+bM0ciRI+2OBQBoeJo0aWIUQ6Wlpdkt/ElPTy9xb0PJaTab9dZbbyksLEyZmZlatWqVJk2aJA8PjyqNVxHWc01LS7MbXx3PCQAAAAC3KgqwAAAAAAAog8Vi0fTp07Vv3z5Jkre3t0aOHCl/f39lZGRo69atOnLkiBISEjR58mStW7dOHTp0qFc5nZyc1K1bN3Xt2lVt27aVl5eXHB0dlZqaql9++UXbt29XTk6ODh48qAkTJmjTpk1q1KiRzbGysrL04osv6uTJk5Kk1q1ba8SIEWrdurUSExP19ddf6/Tp0zpz5oxeeOEFrV+/Xt7e3mXO7e9//7s++ugjSZKLi4ueeuop9erVS/n5+Tp48KC2bdumnJwcvfnmm3J1ddUTTzxR1Y8VAFBPtWvXTnFxcZKkuLg4+fn5lRtfHCtJ7du3bzA5Jcnd3V29e/fW999/r9zcXB07dkwPPvhglcezx7oQ2voZymIdU5EiagAAAADAf1CABQAAAABAGTZs2GAUQvn7+ys4OLhEQdG4ceO0YMECrVy5UhkZGZo7d26ZHafqIufEiRMVFBRUYgsia2PHjtXUqVM1ceJEXbx4UWfPntWaNWs0adIkm/ErVqwwiq/69OmjFStWlOgaMn78eL322mvatm2b4uPjtWDBAr3//vs2xzp79qyWLVsmqWiLpFWrVumuu+4yro8YMUKPP/64pk6dqoKCAr399tu6//775enpWdZHBwBogDp16mSse5GRkerbt2+ZscnJyUpISJAkNWvWzG7XxvqUs5j1unnlypUbGsuezp07G8eRkZF2461jOnXqVCNzAgAAAICblUNdTwAAAAAAgPrIYrFo+fLlxvnChQttdnMKCgrSnXfeKUmKiIjQ/v37603O1q1bl1l8VczPz08zZ840zsPCwmzGpaenKzg4WFJRt6pFixaV2rLJyclJf/3rX+Xj4yNJ+vbbb3Xu3Dmb4y1fvtzYdnDatGkliq+KBQQEaNy4cZKKvqT+7LPPyn0WAEDDM2DAAON479695cb+8MMPxvHAgQMbVM5iFy5cMI5vtJjLnnvvvdfoahkREaGsrKwyYy9duqTY2FhJ0u9+97sb7ugJAAAAALcaCrAAAAAAALDh559/VlJSkqSibk9du3a1GWc2mzVhwgTjPDQ0tEHllIo6bRVLTk62GbN7927l5uZKkoYMGaIWLVrYjHNzc9OoUaMkSYWFhfruu+9KxWRnZxuFXq6urka8Lc8995xxfKPPCQCof/r06WMU7h46dEjR0dE24ywWi1avXm2cDxkypEHllKTjx4/rxIkTkoqKlrt3735D49nj6uqqhx56SFLR2rt+/foyY4uLrCWx5S8A3CJ2796tadOm6eGHH1b37t3Vr18/jR49Wv/3f/+nq1ev1vucv/76qxYsWKDAwED17t1bPXv21ODBg/XOO+8YnZsr6tixY5o7d66efPJJ3XPPPerSpYt69+6twMBAvfHGGzp48GClxpOky5cv6x//+IfGjRunAQMGqFu3burbt68CAwP1l7/8RRs2bFB6enqlxwUA1F8UYAEAAAAAYIN1R4wHH3yw3Fjr6/Y6adS3nJJ08eJF49hWx63Kzs26Q4ituf3888/KycmRJN1zzz2lOmlZa926tdq3by9JiouLK7OjFgCgYTKbzZoyZYpxPmvWLKWkpJSKW7RokfFlaq9evUp0sbIWEhKizp07q3PnziWKlWsq56lTpxQcHFxudympqPjqlVdeUWFhoSRp6NChatKkSbn3VIc//elPcnAo+hpg6dKlOn78eKmYXbt2GdsZN2nSRBMnTqzxeQEA6k5WVpZefvllTZkyRTt27FB8fLyuX7+u1NRUHT16VO+//74CAwN17Nixepvzq6++0pNPPqmVK1fqzJkzunr1qrKzs3XhwgV98cUXeuaZZ0p0ly5Lbm6uZs6cqWeffVZfffWVTp8+rczMTFksFl29elVnzpzRpk2b9Pzzz2vy5MnKzMy0O2ZhYaH++c9/6rHHHtPixYsVERGhxMRE5eXlKS0tTWfOnNHWrVs1Z84cRUREVOh5AQANg2NdTwAAAAAAgPooJibGOLbXocLHx0e+vr5KSEhQcnKyUlNTq7StUF3kTElJ0eLFi43zwYMH3/DcunTpIrPZLIvFojNnzqiwsFAmk8m4fvr06QqPVRxTvC1STEwM2yIBwE1m1KhR2rVrlw4cOKAzZ85o2LBhGjlypPz9/ZWenq7Q0FAdPnxYkuTh4aF58+bVm5wZGRl67733tGTJEvXr10/dunVTq1at5ObmppycHMXHxys8PFzh4eFG8VXHjh01a9asMud24sQJ7dixo8TPrL+g/emnn5Sfn1/i+uDBg9WlS5dSY3Xq1El/+tOftGzZMmVnZ2v8+PF6+umn1bNnTxUUFOjAgQPatm2bCgoKZDKZ9Oabb9b41ogAgLpjsVg0ffp07du3T1LRL+AUr38ZGRnaunWrjhw5ooSEBE2ePFnr1q274f/+qu6cmzdv1ty5cyVJDg4OGjJkiPr16ydHR0cdOXJEX3/9ta5fv65ly5bJ2dlZkydPLnOsmTNnGmuu2WzWo48+qp49e8rb21vJyck6cuSIdu7cqYKCAv3www966aWXtHr1aqO4+bcKCgo0d+5cbdiwQf+fvTuPqqre/z/+OhxAZVBGFUMUxaEcs5zKoavYYHpNDC9pls03s2ygzAYruw2appnXxc1vpqVX06IcMOtnoiKZSmqiOaMVSgocQARBOPD7g8W+IIdzAAdQn4+1XH42+70/7/dm7eURzvt8PpLUoEEDDRo0SF27dpWPj48KCgp0/Phx/fLLL9q6dWuNvp8AgLqLBiwAAAAAAGw4evSoMQ4MDHQYHxgYqJSUFElSUlJSjd68vJQ5k5OTtX//fkklvxTOyspSYmKi1qxZY3yKt1+/fho1alSFa4uKioxVssxmswICAuzW5eLioiZNmujEiRPKzc3VyZMn1bRp0wu6T1vXAgCuDs7Ozpo9e7YiIyMVGxur1NRUzZ07t0Jc06ZNNXPmTLVp06bO5czLy1NsbKyxxW5lhgwZotdee01eXl6Vxuzfv19RUVGVnk9ISKiwYkaLFi1sNmBJ0vjx41VQUKB58+YpPz9fS5cu1dKlS8vF1K9fX5MmTdKwYcPs1g8AuLItX77caIQKCQnRwoULy62CPHr0aE2dOlXz589XVlaWJk+ebKySWBdyWiwWoynayclJc+bM0cCBA43z99xzj8LCwjR27FidPXtWH330kUJDQ41VlctKSEgwmq/c3d31xRdfqEOHDuViHnzwQSUmJuqBBx5Qbm6uEhISFBsbWy5nWfPmzTOar3r37q0PPvjA2Pb4fDk5ORUaqgEAVzYasAAAAAAAsKHs1gLe3t4O48u+kVqVbQkud864uDi9+eabNs81a9ZM9913nx599FGbn+TNzc01fjHs6ekpZ2fHv07w8vLSiRMnJEmnT58u14BVG99bAEDd5uHhoaioKK1bt04rVqxQYmKi0tPT5e7urqCgIA0aNEgREREXddu+i5Gze/fuWrZsmbZs2aLExEQlJSXp5MmTysvLk6urqzw9PdWqVSvdeOONGjJkiEJCQi5a/dXx3HPP6fbbb9eXX36prVu36tSpUzKZTAoICFC/fv0UERGhFi1a1EptAIDLw2q1ltuWb9q0aTa3oI+MjNSWLVu0b98+JSQkaPPmzerTp0+dyPnpp5/qzJkzkkoat2w1QnXt2lUTJkzQ+++/r8LCQv373/8ut+pzqdKmMEmKiIio0HxVqlOnToqIiND8+fMllTRu2cqblJSkjz/+WJLUvn17ffLJJ3J1dbU5p1TS9AUAuLrQgAUAAAAAgA25ubnGuF69eg7jy8bk5ORcMTnNZrN69eqlbt26VbqNQtm5q1KXo9qqe5/169evdK7LqWHD+o6DJDk5mYy/fXz4pfq1jGcBZfE8VE1oaKhCQ0NrfH1YWJjCwsIuW04nJyd16dJFXbp0qdH1ttTkHqqiQ4cOF2X7RgDAlWn79u1KTU2VJPXo0aPShiOz2awxY8bolVdekSTFxMTUuAHrYuf87rvvjPGDDz5Yad7w8HDNnj1bubm5Wr9+vfLy8sr9XCmVrKZVqmXLlnbvo+z5yn4mXbBggQoKCiRJkyZNstt8BQC4OtGABQAAAADANeC+++7TfffdJ0kqKChQWlqaEhIStGDBAkVHRys6OloPPfSQXnzxRZnN5lqutm4ym203qFXGZDLJbDZdompwJeFZQFk8DwAAoDZs2rTJGPfr189ubNnzZa+rzZyHDx/W8ePHJUmtW7dW8+bNK53Lw8NDN910k+Li4pSbm6tt27ZVyO/j42OMHW11f+zYMWNsa1vic+fOadWqVZJKti/u2bOn3fkAAFcnGrAAAAAAALDBzc1NWVlZkqT8/HyH2+7l5+cb45puJXC5crq4uCggIEBDhw7V4MGD9fLLL2vlypX67LPP5Orqqueff75cfNm5y+asaW1ubm7Vmi8vL6/SuS4nq7WoSnFOTiaZTCYVFxerqKj4EleFuoxnAWXV5HmobuMnAABAZQ4ePGiMO3XqZDfW399fAQEBSklJUVpamiwWS7mGpdrIWZ25SmNKtxk8ePBghQas0NBQRUVFSZK+/PJLDRkyxOYKXYmJiVq6dKkkyc/PT8OGDasQs2fPHmOl586dO8tkMmnPnj1avHixsfWvu7u7goOD1b9/f40aNUqNGjVyeA8AgCsLDVgAAAAAANjg6elpNENlZGQ4bPzJzMwsd+2VktNsNuuNN95QbGyssrOztWDBAj366KNq2LChEePm5iZnZ2cVFhYqOztbhYWFDpvDytZWdq7za83IyHBY48W4z4vh9Ok8FRZaHcb5+LjLbDapqKhYFkvtbZmI2sezgLKq+zw4O5vl7e3mMA4AAKAqyq7yFBgY6DA+MDBQKSkpkqSkpKQaNWBdzJxJSUnVnstWHaU6deqksWPHasGCBcrJyVF4eLjuuOMO3XjjjfLz81NaWpp++eUX/fDDDyoqKlJQUJA+/vjjCj/fSiUNWKUCAgL0ySefaNasWbJa//fzY2Zmpnbu3KmdO3fqs88+08yZM3Xrrbc6vA8AwJWDBiwAAAAAAGwIDg5WcnKyJCk5OdnhL3hLYyWpVatWV0xO6X/bM2zYsEH5+fnatWtXuU8HOzk5KSgoSElJSbJarcHHZTkAACAASURBVEpJSbG73UNBQYFOnjwpqaR5q0mTJuXOBwcH27yHypSNKXstAAAAAKBqsrOzjbG3t7fDeC8vL5vX1lbOS1H/pEmTFBQUpLlz5yotLU1r1qzRmjVrysX4+vpqwoQJGjJkSKUfkkpNTTXGmzZtMhq++vXrpwEDBqhRo0ZKTk7WN998o6SkJGVlZemJJ57QokWL1LVrV4f3AgC4MtCABQAAAACADW3btjW2K0hMTFSvXr0qjU1LSzM+pevr61ujTwbXVs5SZX+RfPr0aZu1lX7iODEx0W4D1m+//WZ80jckJEQmk6nc+Xbt2hnjxMREh7WVjWnbtq3DeAAAAABAeaVb5ElSvXr1HMaXjcnJqdlqrhczZ3Xnql+/fqVzlXXvvffKw8ND77//viwWS4Xz6enpmjdvngoLCzV69Gibc5SuZC39b7Wtd999VyNGjCgX99BDD2nixImKiYlRQUGBXnnlFcXExFT4mflyadiwvuMglWylXfq3j4/9lbpxdeNZQFk8DxXRgAUAAAAAgA19+/bVp59+KqnkE6yPPfZYpbEbN240xv3797+icpY6duyYMbbVzNW3b1+tXbtWkhQXF6fBgwfXuLbu3burfv36ysvLU0JCgnJycir9JPGff/5pNH5dd911at26dZXuBwAAAAAAe3777TeNHz9ex48fV0hIiF577TX17NlTjRo1UlZWlrZu3aq5c+fq8OHDmjJlivbt26e33367QsNUcXFxueNhw4ZVaL6SJBcXF73zzjtKSEjQyZMndeTIEW3evFl9+/a9pPdZGbPZqVrxJpNJZnPtNIuhbuFZQFk8D/9TvX9VAQAAAAC4RvTo0UP+/v6SpG3btmnv3r0246xWq7744gvj2F5jUl3MKUm7d+/Wb7/9JqnkF8KdOnWqEDNw4EDjU8YxMTHGFoPny8nJ0bJlyySV/ALmrrvuqhDj5uam2267TVLJp5hL421ZuHChMb777rurdkMAAAAAgHLc3NyMcX5+vsP4sjGVfWDmcuas7lx5eXmVziVJBw8e1KhRo3T8+HF17txZX331le6++275+fnJxcVFfn5+uvvuu/XVV18ZPyMvX77c5s+v588fERFRaV0NGjTQsGHDjOOff/7Z4b1cKlZrUZX+lDaYFRcXV/ka/lydf3gW+FP2T02eh6sdK2ABAAAAAGCD2WzWuHHj9NZbb0mSJk6cqIULF8rX17dc3PTp07Vv3z5JUrdu3Sr95Gp0dLQmTZokqaTRqmwD1aXIuX//fm3dulX33nuv3V+W7969W+PHjzd+aTJ06FB5enpWiPP29taYMWP0f//3f8rPz1dkZKSioqLKzV1YWKjXX39dqampkqQhQ4ZUumLVU089pR9++EFFRUWaPXu2brrpJnXu3LlczLp167R48WJJkqenpx566KFK7wMAAAAAUDlPT09jq7yMjAyHTVWZmZnlrq3tnGWPMzIyHOZ2VP+MGTN09uxZSdKkSZPUoEEDm/M0aNBAkyZN0qhRoySVfEjoH//4R7mYhg0bljvu2LGj3drKnv/zzz/txl5Kp0/nqbDQ6jDOx8ddZrNJRUXFslhqth0lrg48Cyirus+Ds7NZ3t5uDuOuZDRgAQAAAABQiZEjR2rdunWKj4/XoUOHNGzYMIWHhyskJESZmZmKiYnRL7/8IqnkF65TpkypMzmzsrL07rvv6sMPP1Tv3r3VsWNHNWvWTO7u7srLy9Px48e1detWbd261Wi+atOmjSZOnFhpbU8++aTi4uJ04MABbdu2TcOGDdPIkSMVGBioU6dOKTo6WgcOHJAkNWvWTC+99FKlc7Vt21ZPPfWUPv74Y+Xm5ur+++/X8OHDdeONN6qoqEjx8fFas2aNioqKZDKZ9Prrr9vcGhEAAAAA4FhwcLCSk5MlScnJyQoMDLQbXxorSa1atar1nGWPy8ZVZa7g4OBy586dO6f4+HhJJStr3XjjjXbn6tatm9zc3JSbm6sjR47ozJkz8vDwsFmbq6urXF1d7c5XtiHszJkzDu8FAHBluGIasH788UetWLFCe/bsUWpqqjw8PNSiRQuFhoYqIiKi3ItcXciZnJysgQMH1jivo/+ASNKGDRv0/fffa+fOnUpNTVVhYaF8fX0VEBCgm2++WX379tXNN99coxoAAAAAAJKzs7Nmz56tyMhIxcbGKjU1VXPnzq0Q17RpU82cOVNt2rSpcznz8vIUGxur2NhYu3FDhgzRa6+9Ji8vr0pjPDw8NG/ePD3zzDPatWuX/vzzT82YMaNCXEhIiGbPnq3GjRvbzTl+/HgVFBRo3rx5ys/P19KlS7V06dJyMfXr19ekSZPKbdEAAAAAAKietm3bKi4uTpKUmJioXr16VRqblpamlJQUSZKvr2+NPwxzMXO2bdvWGCcmJjrMXTbm/J+bMzIyVFBQIKnk51yTyWR3LpPJJA8PD+Xm5kqScnNzy71P3L59e2N87tw5nTt3zm4TVnZ2tjG+FO9xAwBqR51vwMrJyVFkZKTWr19f7usWi0UWi0U7d+7UokWLNGvWLHXt2vWKzVnKzc2twtYS5zty5Ihee+017dixo8K548eP6/jx40pISNCGDRu0YsWKi1ofAAAAAFxrPDw8FBUVpXXr1mnFihVKTExUenq63N3dFRQUpEGDBikiIqLGWzJcqpzdu3fXsmXLtGXLFiUmJiopKUknT55UXl6eXF1d5enpqVatWunGG2/UkCFDFBISUqXamjRpoiVLlmjlypVavXq1Dhw4oIyMDDVq1EitWrXSnXfeqfDwcIef+C313HPP6fbbb9eXX36prVu36tSpUzKZTAoICFC/fv0UERGhFi1aVGkuAAAAAIBtffv21aeffipJ2rRpkx577LFKYzdu3GiM+/fvXydyhoSEqFmzZjpx4oSOHDlid0WtnJwcY+XoBg0aqEePHuXOl90KMSMjQ/n5+apXr16lteXl5ZXb9vD8Dy61bNlSLVu21LFjxyRJe/bsUbdu3Sqdb8+ePcb4/NW5AABXrjrdgGW1WjVhwgSjM9rPz8/YdiErK0urV6/Wjh07lJKSoscff1xLlixR69at60ROX19f/fvf/65SzkWLFmnLli2SpMGDB1e6x7Ak7d27Vw8//LCxb/H111+vAQMGKCgoSPXq1VNmZqYOHTqkTZs2VffWAQAAAAB2hIaGKjQ0tMbXh4WFKSws7LLldHJyUpcuXdSlS5caXe9o7nvuuUf33HPPRZmvQ4cOF2X7RgAAAACAbT169JC/v79SU1O1bds27d27Vx06dKgQZ7Va9cUXXxjHgwcPrjM577rrLqOha8GCBXrttddsxi1btsxYrWrAgAEV3nv18PDQddddp+PHj6ugoEDfffed3Z9v16xZY6yY1b59e5sfOBo6dKg+/vhjSdLSpUsrbcA6e/ZsuQU0+vXrV2leAMCVpU43YC1fvtxohAoJCdHChQvl5+dnnB89erSmTp2q+fPnKysrS5MnT9bixYvrRM4GDRpU6ZfkBQUF5f5zcO+991Yam5mZqSeeeEKZmZmqV6+e3n77bbtbMJQu0wkAAAAAAAAAAADg2mU2mzVu3Di99dZbkqSJEydq4cKFFXbmmT59uvbt2ydJ6tatm/r27WtzvujoaE2aNElSSaNV2QaqS5XzkUce0dKlS5WTk6PFixerd+/eGjhwYLmYX3/9VR999JEkydnZWU899ZTNuYYMGaL//Oc/kqT33ntPISEh6tixY4W43bt367333jOOhw8fbnO+sWPHavHixbJYLFqxYoV69epV4UNYhYWFevXVV3Xy5EnjXm+66Sab8wEArjx1tgHLarVqzpw5xvG0adPKNUKVioyM1JYtW7Rv3z4lJCRo8+bN6tOnzxWTc/369caSla1bt9aNN95Yaez777+v1NRUY+yo4zwgIKBGNQEAAAAAAAAAAAC4uowcOVLr1q1TfHy8Dh06pGHDhhk7AWVmZiomJsbYuq9hw4YXZaXii5nT19dXr7/+ul5++WUVFRVp/PjxGjx4sG699VY5OTlpx44d+vbbb5Wfny9JevrppyvdPemxxx7T2rVr9fvvvyszM1MRERG6/fbb1bNnTzVq1EhZWVn6+eef9cMPP6iwsFCS1LlzZ40aNcrmfB4eHnr33Xc1fvx4FRYWatKkSVq7dq0GDBighg0bKjk5Wd98842SkpKMe33//fdr/H0FANQ9dbYBa/v27UazUY8ePWwuRymVdE6PGTNGr7zyiiQpJiamxs1QtZHzq6++Msb2Vr86efKkVq1aJUnq3r37BS33CQAAAAAAAAAAAODa4uzsrNmzZysyMlKxsbFKTU3V3LlzK8Q1bdpUM2fOVJs2bepczuHDh+vs2bN6//33lZ+fr9WrV2v16tXlYsxms/75z3/qn//8Z6XzeHp6asGCBXr++ee1c+dOFRQUKCYmRjExMTbj+/fvr6lTp9rcfrDU3/72N82YMUOTJ09WVlaWNm7cqI0bN1aICwoK0pw5c9SiRQu79woAuLLU2QasTZs2GWNHe9+WPV/2urqe8+TJk4qPj5ckubi42N1OMDo62uiuthcHAAAAAAAAAAAAALZ4eHgoKipK69at04oVK5SYmKj09HS5u7srKChIgwYNUkREhDw9PetszlGjRumWW27R0qVLFRcXp5SUFBUXF6tx48bq1auX/vGPf+iGG25wOE+zZs303//+V3FxcVqzZo12796tU6dO6ezZs2rQoIGaNm2qLl266O9//7t69epVpdruvPNO3Xzzzfryyy+1fv16JScnKycnR40aNVL79u11++23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u/Tnn39qxowZFeJCQkI0e/ZsNW7c2G7OzMxMrV69WqtXr640pmXLlpo6dSqv2QAAAABQQzRgAQAAAABgw8GDB41xp06d7Mb6+/srICBAKSkpSktLk8VikY+PzxWR8/y81113XYXzpSt21IStFbXON3nyZB09elRpaWlydXWVn5+fOnfurDvuuEMDBw6UyWSqcX4AwJXBw8NDUVFRWrdunVasWKHExESlp6fL3d1dQUFBGjRokCIiImxu21ebObt3765ly5Zpy5YtSkxMVFJSkk6ePKm8vDy5urrK09NTrVq10o033qghQ4YoJCSkSrU1adJES5Ys0cqVK7V69WodOHBAGRkZatSokVq1aqU777xT4eHhcnV1rXSOYcOGqUmTJtq9e7f27NmjU6dOKSMjQzk5OXJzc5O/v786duyo0NBQDRw4UGazudrfQwAAAABACRqwAAAAAACw4ejRo8Y4MDDQYXxgYKBSUlIkSUlJSTVqhqqNnFlZWfruu++M4/79+1eI8ff3N8bHjh1zOGfZmKSkJIfx8fHxxvjcuXM6c+aMjh07ppUrV+r666/Xhx9+qFatWjmcBwBw5QsNDVVoaGiNrw8LC1NYWNhly+nk5KQuXbqoS5cuNbre0dz33HOP7rnnnhpd7+3trbvuukt33XXXRa4MAAAAAHA+GrAAAAAAALAhOzvbGHt7ezuML7uVUNlr63rO999/X1lZWZKkAQMGqF27dhViOnXqJFdXV507d0779u3T/v371b59e5vzJScna9u2bcbx6dOnK83t5uamXr16qXPnzrruuuvk4uKi9PR0bd++XT/++KMKCgq0b98+RUREaMmSJWrdunWN7hEAAAAAAAAALiUasAAAAAAAsCE3N9cY16tXz2F82ZicnJwrIueSJUsUHR0tSWrYsKFeffVVm3H169fXsGHDtHz5cklSZGSkPvvss3IrY0klq2m98MILKiwsNL525swZm3OOHj1ar7/+utzd3Sucu//++/X777/r6aef1oEDB5SVlaUJEyZo5cqVcnJyqvZ9XiwNG9avUpyTk8n428en4v3h2sGzgLJ4HgAAAAAAuHrRgAUAAAAAwDVow4YN+te//iWpZIuj9957z+62h88++6zi4uL0119/6dChQ7r77rsVFhamDh06yGQy6eDBg/r666+VlpamoKAg/fHHH8bctnTq1Mlu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InXp0qXUmKeeekqpqal68sknlZeXp927dys5ObnUmiXatm2rX/3qV/rZz35W7iMGx48fr5dffllfffWV8vPz9dvf/lYbNmyQy+Xy9hECAAxx67R0AwAAAAAAAAACjuejfKry6J7s7Oxy3xtoa27fvl3PPfec8vPzFRQUpDfffFMJCQlVem/r1q21evVqvfvuuxo0aJCio6NVq1YtRUZGqnfv3nrrrbe0dOnSUu+5/jGFvurTp491fPz48WrNBQAIPIWFhfr444+t8/fff79UI1SJKVOmqFOnTpKKm5S2bNkSMGt++umnunjxoqTixq3yGqF69OihSZMmSZIKCgr0xz/+sdy5SprCJCkxMbFM81WJrl27KjEx0TrfvXt3mTEDBw7UunXr9PDDD5fbfCVJoaGh+sMf/qDGjRtLkk6ePFnuXAAAc9GABQAAAAAAAACoMa1bt7aOT58+7XW855jy7mgRCGuWNF9duXJFkjRt2rRSP7ytilq1aumRRx7Rf//3f2vLli06cOCAduzYocWLFysxMVEul0vHjh2zxnt7ptKnqQAAIABJREFU1KA3DRs2tI5zc3OrNRcAIPDs2rVL58+flyTFxsZW2HDkcrk0ZswY63z9+vUBs+YXX3xhHT/11FMVrpuQkKCwsOI7m23atMnKY0+ZmZnW8U9+8pOKv4jrXr90qeyd1erWrVvho4A91alTR0OGDLHOf/jhB6/vAQCYgwYsAAAAAAAAAECNad++vXWcmppa6dj09HSlpaVJkho1alSqaShQ1ixpvrp8+bIk6Xe/+51Gjx5t6zq92blzp3V89913V2suzzuB2b2zGAAgcG3evNk6HjhwYKVjPV/3fF9Nrnns2DGdOXNGUvHj/m6//fYK54qIiFCvXr0kSXl5eaXysoRnnv/444+VXtvJkyet43bt2lU61puIiAjruLzGMACAuWjAAgAAAAAAAADUmAEDBljH3n7I+80331jHgwYNCrg1r2+++u1vf6snnnjC9nVWJj09XV9//bUkKTIyUkOHDq3WfDt27LCOPe8QBgBwhiNHjljH3u6aGB0drWbNmkkqzhvPu0XV1Jq+zHX9GM/3loiPj7eOly9froMHD5Y7T2pqqpYtWyZJioqK0ogRI7yuXRnPa2nRokW15gIABBYasAAAAAAAAAAANSY2NlbR0dGSiu/oVNEPQAsLC7Vo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", + "image/png": "iVBORw0KGgoAAAANSUhEUgAACWAAAASwCAYAAAB/pHGBAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/bCgiHAAAACXBIWXMAAB7CAAAewgFu0HU+AAEAAElEQVR4nOzdd3hTZfsH8G+S7kUnUCmjUChYdqWAsscPRQVEiyggS8FXUVSQJaIs2UNFcDBFBGTIdLGhCAXaQge0ZbRAoUBXWrqb8fujb86bkJ2m+/u5Li9PkifneTLonfOc+9yPSKlUKkFERERERERERERERERERERERERmE1f2AIiIiIiIiIiIiIiIiIiIiIiIiKorJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFhERERERERERERERERERERERkYWYgEVERERERERERERERERERERERGQhJmARERERERERERERERERERERERFZiAlYREREREREREREREREREREREREFmICFlEFGjVqFAIDAxEYGIjw8PDKHo5O4eHhwhhHjRpV2cOpNqrDZ0tEVJvV1r/T5fG69+7dK+xzxowZVtmnLvxNQkRU/dW2+FudXi/jLBFR9af6Ox4YGFjZQ6FKMmPGDOE7sHfv3nLti983IqKKxb+7tdu3334rfP7ffvutzjY8rq+amIBFVEvFx8cLf5TnzJlT2cMhIiKqNRiDiYiIKh7jLxERUdU0ZMgQBAYGomPHjiguLq7s4RAREZEVMc5TbcMELKqW+vTpI0ycpqSkVPZwqqXjx48L23369KnEkRARUXXCGFx2jMFERGQuxt+yY/wlIqKKUJ2qIVYFqampuHbtGgCgW7dusLOzq+QRERER6cc4bx7GeaqNmIBFVEupJp8dHR3RtWvXSh4NERFR7cEYTEREVPEYf4mIiKoeJkgTERHVXIzzVBvZVPYAiGqTrVu3VvYQAABpaWmIjY0FADz77LOwt7ev5BERERGVL8Zg6xk6dCiGDh1a2cMgIqJqgPGXiIio/CQkJFT2EMrsxIkTAACJRIKePXtW8miqn8WLF2Px4sUV0ldN+L4REVUnNeHvLuM81UasgEVUC504cQJKpRIAM46JiIgqEmMwERFRxWP8JSIiqnry8vKE5Zs6dOgADw+PSh4RERERWQvjPNVWTMAiqoVUJR/FYjF69epVuYMhIiKqRRiDiYiIKh7jLxERUdVz9uxZFBcXAwB69+5dyaMhIiIia2Kcp9qKSxBStZGSkoK+fftq3a/rPgD4+eef0blzZwBAYGCgcL+qZGN8fDx2796N8+fP49GjR8jOzkbfvn2xdu1ajf3Exsbi7NmziIyMxI0bN5CZmYmSkhK4ubmhUaNG6Ny5M15//XU89dRTRl/DqFGjcOHCBa3xqZsxYwZ+//13AMCiRYswdOhQFBQUYO/evTh06BBu376NnJwceHl5ITg4GCNGjEBwcLDRvlUKCwtx7tw5AEDbtm3h7e1t9DlKpRJHjhzB3r17kZCQgPT0dLi5uSEwMBCDBg3CoEGDIBabns95+fJlHDhw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XKhx36lTp3Dq1Kky9eXu7o4PP/ywTPsgIiKqiRhniYiIiIiIiIiqNiZgEVGttG3btjLvo3Xr1kzAIiKiWsPe3h716tXDs88+i7fffhsNGzbUeDw6OrrM8bVBgwY8MUxERKQD4ywRERERERERUdXGBCwiIiIiItLLz88PCQkJlT0MIiIiIiIiqkWOHz9e2UMgIiIiIjKLSKlUKit7EERERERERERERERERERERERERNWRuLIHQEREREREREREREREREREREREVF0xAYuIiIiIiIiIiIiIiIiIiIiIiMhCTMAiIiIiIiIiIiIiIiIiIiIiIiKyEBOwiIiIiIiIiIiIiIiIiIiIiIiILMQELCIiIiIiIiIiIiIiIiIiIiIiIgvZVPYATHXs2DHs378fsbGxSEtLg4uLCxo3box+/fph+PDhcHFxsUo/crkcN2/eRGxsLOLi4hAbG4v4+HgUFhYCAF555RUsXrzY7P3evn0bO3bswJkzZ5CamgqFQoG6devi2WefxbBhw9CqVSurjJ+IiIiIiIiIiIiIiIiIiIiIiCqOSKlUKit7EIbk5eVh6tSpOH78uN42vr6+WL16Ndq3b1/m/j744AP8888/eh+3JAFr586d+Oqrr4QkridJJBK89957mDRpkln7JSIiIiIiIiIiIiIiIiIiIiKiylWlK2DJ5XJMnjwZZ86cAQB4e3sjNDQUAQEByM7OxqFDhxAZGYnU1FRMmDAB27dvR7Nmzcrcpzp3d3e4u7sjOTnZov3t378fc+bMAQCIxWIMHDgQXbt2hY2NDSIjI/H777+juLgY3377Lezs7DBhwoQyjZ+IiIiIiIiIiIiIiIiIiIiIiCpOla6AtWPHDnzxxRcAgICAAGzZsgXe3t4abZYsWYKNGzcCAJ555hls27atTH1+//33yMvLQ1BQEIKCgtCwYUPs3bsXM2fOBGBeBazMzEz0798fubm5EIvFWLNmDfr27avR5vLlyxgzZgwKCgpgY2ODgwcPomnTpmV6DUREREREREREREREREREREREVDHElT0AfeRyOdasWSPcXrp0qVbyFQBMnToVrVq1AgBcunQJYWFhZer33XffxZQpU/D888+jYcOGZdrXhg0bkJubCwAYMWKEVvIVALRv3x6TJ08GAMhkMnz33Xdl6pOIiIiIiIiIiIiIiIiIiIiIiCpOlV2C8OLF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YJGiYmOE31KhqCImIhrPNm7c6Em0mD59OiorK3HXXXfhqquuwg033IC33noLP/nJTwAAHR0dePjhhyN+zH379mHDhg0AgJUrV0ra97e//S2+/vprAMCVV16JTZs24eabb8aVV16Jn//856isrMSCBQsAAA0NDXj55ZclHT8axMd6f4llC0IiosixYMECZGZmAgB2796NhoYGwe0cDgfefPNNz8+LFy+OqjGdTifWrFnj+fm73/2u7GONNqOpE+uqGuDwc5HX7nBhXVUDjKZOn9sRERGROIdIC0LxBCyZBVhMwCIiIgq7WTl6yMuuDE63VfwG5W7rQEjG7A0i7YuIoh8LsEhRTMAiIgo9h8OBF1980fPzk08+KdhSr6KiArNnzwYA7N27F9XV1RE7ps1mw/333w+n04nLL78cJSUlAc/tiy++wHvvvQcAyMzMxGOPPQatdngxUmJiIp566inExcUBAF5//fVhrZHGgvhYoQQsfv4SEUUKjUaD22+/3fPzqlWr0N7e7rXdU089hYMHDwIA5s+fPyzFaqhNmzYhLy8PeXl5WL58ecjH/Oyzz/CXv/wFNptN9Hfs7e3Fvffei127dgEAYmNjccstt4huH+kqq41e7X3F2B0uVFUbQzwjIiKiscsu0oJQoxFJwBJ53h9/hdVERESkvAx9Agpy08M+bre1X/S1Lh+vBUOnQNoXEUUv/gUgRWk1amjUKq8vsizAIiJSzp49e9Da2gpgMNkiPz9fcDuNRoPly5fj/vvvBwBs2bIFxcXFETnmmjVrYDQakZKSgoceesjn4u5I7733Hlzf3sH6H//xH0hMTBTcbuLEibjiiivw7rvvwmq14sMPP8Q111wT8DiRLo4FWEREEe+6667D1q1bsXPnThw5cgRlZWUoLy/H9OnTYbFYsGXLFtTU1AAAUlJS8Oijj0bMmO3t7Xj44Yfx29/+FhdeeCHy8/ORnZ2NhIQEdHV14cCBA9iyZQssFgsAQKVS4de//jUmT54c9O8wGprNvahr8i5W86W2qR1tHVZkTIjelotERESjRawwSivSgjBGJBnLH7YgJCIiGh1lxQYcOGYO+EYnJfhKuRoIQfcmFYC8HL3ixyWi6MECLFJcbIwaVtvwBd9+FmARESlmx44dnscXX3yxz22Hvj50v0gas66uDn/6058AAPfccw8yMzNx8uRJWXO7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owCAHIjBmbF3+fLlWrt2rQ4dOqTY2Fh5e3srMDBQISEhuv3223XTTTe51Y8TJ05o4cKF2rJliy5cuCBJuu6669S/f389+OCDCgwMzPP1H374oT766CNJ0tNPP11ipiO0Wq367bfftHr1aoWFhRk/+P39/dWhQwfdfPPNGjRokEwmU77bSkpK0vLly7V+/XodPXpUly5dUnp6uipXrqzAwEA1adJEHTt2VP/+/dWyZctct7N161atWLFC4eHhioyMVHJysipUqKAaNWqoQYMGatu2rW688UbddNNNeZ7PAEBRIP5mOnz4sFauXKnt27fr/PnzSkhIUIUKFVS7dm21bt1aN910k2699VZVq1bN7T55Ks4UJeIsgJIoODjYWM6ahujQoUNauHChtm3bpqioKElS8+bNddddd+nee++Vt7f90EZ4eLjmz5+vffv2KTIyUpUqVVLLli01fPhwDRkyxKX+hIWFGTHk4sWLSkxMVI0aNdS0aVP17t1b9957r2rUqJHve8ny0EMPOWw7ffp0DRs2zFjv37+/zp07J0lau3atGjRooNOnT+vHH3/Uhg0bdOHCBcXHxys4OFjLli1zuE9npnFKTU3VihUrtGnTJh04cEBxcXG6du2aqlWrpqZNm6pz5866+eab1aFDB4evt1qtWrt2rX799Vft379f0dHRSklJUaVKlVSrVi01aNBA7dq1U69evdS1a9dcBz2zZE3blPUZZOfoc/n777+1cOFCbdq0SZGRkUpLS1OTJk00ePBgjRo1Ksf0NSdPntR3332nnTt36ty5c/Ly8lKzZs00dOhQjRgxIkdVhrycO3dOO3fuNNaHDBmiRo0aqWXLljp69KjS09O1YsUKPfzww05v01mtWrWSj4+PUbXk7NmzHt/HunXrjMHPJk2aqHPnznm2v/vuu/XXX39Jyvz7TJo0yeN9Ako64lgm4hhxLD/EscJntVrtqofb/h91JCQkRI0bN9bff/8ti8WidevW6Z///Kfb+w8LCzOWe/Toke9v+O7du6tSpUpKTU1VdHS0du/eXepvuCMBC2XekCFDNHPmTEnS8uXLnbr4fO3aNf3+++9228jun//8p8LDwx2+PjY2VrGxsdqzZ4+++OILjRs3To8//rib78Ax2y9PZzKqo6Ki9Mwzz2jPnj12j1+8eFEXL17U2rVr1a9fP82ePTvX5J4ssbGxeuGFFxxmJp8/f17nz5/XmjVr9Nlnn2nmzJlq165djnbTp0/XkCFDFB0drcOHD2v27Nl65ZVXHO4vMTFR48ePN5Kvhg0bViKSrz755BN98sknSk1NtXs86++/b98+/fe//9XTTz+t0aNH57qd9PR0TZ06VYsWLcrxnMViUXR0tKKjo7Vv3z4tXLhQTzzxhJ577rkcbdesWaOJEycqISEhx3NXrlzRlStXdPz4cf3+++/66quvtHHjRjfeNQA4r7zH4H379mn8+PE6ffq03eOpqalKSkrSqVOn9OOPP+qmm27SzJkzVatWLaf7sHjxYr355pvG3SRZjh49qqNHj2rBggWaPn26BgwY4PQ2S4JTp07pueee08GDB3M8l5ycrDNnzmjlypVq27atPvjggzyTiffs2aNx48bp4sWLOZ5LTExUYmKiIiIitH79er3//vs6cOBAjotfycnJeuGFF+z+5lksFouuXr2qixcvKjQ0VN98843eeustDR8+3I13DgCeU97j7+XLl/X666/r119/ldVqtXsuLS1Np06d0qlTp/Trr79qzpw52rJli1v98UScKWrEWQClxeeff673339fFovF7vGwsDCFhYVp3bp1+uSTT1SxYkVZLBa9+eabOSoWpKSkaMeOHdqxY4f+/PNPvffee/kOTiYkJOi1116zi4lZYmJiFBMTo507d+rzzz/Xm2++WejXJxctWqS33347x7XHgvjjjz/01ltvOfz+jouLU1xcnEJDQ/X555/rjTfesJuSSMr8HJ5++ukc15ilzM/83LlzOnfunLZv367//ve/+uqrr4zKEo5kZGQYN+k2adJEzZo1y/c9LFu2TK+//rpSUlLsHj9y5IiOHDmi33//XfPmzTOSCz7++GN9+OGHOSoq7Nu3T/v27dNvv/2m//znPzkGu3Pz888/G+cYnTp1UqNGjSRJQ4cONaYyWrp0aaEMXJtMJvn6+hoD14mJiR7fR9Y0WpLUrVu3fNvbtjl//rz+/vtvNW7c2OP9AkoT4lgm4phjxDHiWGE6deqUcbO2JHXt2jXf13Tr1k1///23JGnbtm0FSsCKiYkxlp25OS/rRrkzZ85IyrxBiwQsoIS78847NXv2bGVkZGjLli1G1ae8bNiwwUhiady4sTH/qa3IyEhJUsWKFdWiRQs1atRI1apVk9VqNZJlLl26pLS0NOPitycvQGdlVHt7e6tPnz55tk1LS9PTTz+tffv2yWw2KyQkRI0aNVJSUpJ27txpfBmuX79eTzzxhL788stcLwzHxMTovvvusxtMbtSokdq3b6+KFSvqxIkT2rdvn6TML/mHHnpI//3vfxUSEmK3nVq1amn69Ol6/PHHZbVaNW/ePPXq1cthFZCpU6caX7yNGzcuEdnHU6dO1fz58411Hx8fdevWTYGBgYqOjtb27duVnJys1NRUzZo1SzExMZo4caLDbc2YMcMu+apOnTpq3769atWqpYyMDMXHx+v48eOKiIjItT/h4eEaN26ckaRWuXJldejQQdddd50qVqyoxMREnTlzRkePHs1xUgcAhaU8x+CdO3fq8ccfN75zTSaT2rdvr6CgIKWlpWnfvn1GLN2yZYvuu+8+LViwwKkkrLVr12ratGmSMmNGSEiIfHx8dOrUKe3evVsZGRlKSEjQuHHj9Mknn+RaYrikOXHihB588EG7MsctW7ZU69atZTKZdPDgQaPyyYEDBzRixAh99913atq0aY5tRUZG6rHHHlNSUpKkzB9y119/vRo3bqzKlSsbF1QOHz6c5w/9F1980W5QuHHjxmrdurVq1Kih9PR0xcXF6ejRo8ZdbABQEpTn+Hvx4kWNGjXK7rdT9erV1blzZwUGBio9PV3nz5/XgQMHlJiY6PZAgKfiTFEizgIoLRYuXGjEkeDgYLVu3VpeXl4KCwvT8ePHJUmbN2/WW2+9palTp2rKlClatGiRvLy81K5dOwUFBSkjI0O7du0yqiqsWrVKrVq1yvMGyejoaI0aNUonTpwwHmvRooWCg4NVtWpVxcbGateuXYqPj9fly5f17LPPasaMGTmSlh944AFJ0urVq42KJwMHDlSdOnVy7DMoKCjX/vz222/GIGjt2rXVuXNnVatWTVFRUQ5vvnTGl19+qRkzZhiDriaTScHBwWrevLmqVq2q+Ph4HT161Iij2eOkxWLR6NGjdeDAAeOxli1bqkWLFqpWrZquXbtm3GwbHR3tVJ/27t1rxCZHVUOy27hxo958801lZGSoSZMmateunSpVqqQjR44YieIHDx7U888/ry+++EKfffaZPvjgA0mZx1OrVq1kNpsVHh6uY8eOSZJ27Nih6dOna+rUqU712bZqy9ChQ43lO++8U7NmzVJGRoYOHz6sw4cPq1WrVk5t01lWq1VXrlwx1n19fT26fUl2/wfatGmTb/s6deooICDAGGM4ceKERweuT548qePHj+vChQtKT09XjRo11KRJE3Xp0kUBAQEe2w/gKcSxTMQxx4hjxDF349j27dvtqtF98803DhPMbN9/YGCgateune+2bT+nkydPOt0nR7LfCOeqrOM6Pzt37lRYWJhiYmJkNptVs2ZNtWrVSp06dcq30ExhIwELZV7dunV1ww03aPv27UpPT9cvv/yiBx98MM/XLF++3Fi+8847Hba5+eab1a9fP3Xr1k2VK1fO8bzFYtGyZcv05ptvKjk52ZgyzxPTviUmJmrHjh2SMksDVq9ePc/2v//+u9LS0tS2bVvNnj1bTZo0seunbQDfvn27vvjiC40ZM8bhtiZMmGAMGPv4+Oitt97S7bffbtcmPDxczz33nM6cOWPc0bp8+fIc/ezVq5ceeughff3117JarXr55Ze1fPlyu8GBlStXGicD3t7emjlzpqpWrerEp1R4fvnlF7vkq2HDhunVV1+1O1FITEzUlClTjGPp66+/VpcuXXTLLbfYbevSpUvGtsxms95++23dddddDqd7iIqK0u+//+7wePv000+N5KtBgwbpzTffdFhCNjU1Vdu2bdPatWvdeOcA4JryGoMTEhL0wgsvGMlXTZo00axZs3T99dfbtVu+fLlee+01Xb16VadOndLEiRP16aef5tuH9957T15eXnrppZc0atQouzLYx48f17PPPqtjx44pLS1NEyZM0KpVq3ItK15SXLt2Tc8//7xxwcLf318zZ87McYfZ5s2bNX78eF26dEkxMTF64YUXtGjRohzTUH311VfGoHCXLl00e/ZshxeK0tPTtXv3bi1evDhH7D18+LDWrFkjKfOcZ86cObkO+GdVDPH393fvAwAADyqv8Tc9PV3PPvuscbG9cuXKeumll3TPPffkiBPXrl3T5s2b9eOPP7rVH0/EmaJEnAVQmrz99tsKDAzUrFmzcgwqffnll3r33XclST/++KOaNWumRYsWKSgoSLNnz7YbJLRYLHr33Xf19ddfS8qsZP/ggw86HJDJyMjQCy+8YAxYtW/fXlOmTMkxaJeamqrPP/9cH330kaxWq15//XV16tTJLtZNnjxZUubgUdbA9UMPPeRUBQZb77//vipUqKDJkydr+PDhdt+j2SshO2PDhg12g9bd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Jk3K8cWfmJioCRMm6I8//jAee/HFF42Al+W7777T0KFD9f333+d6opuUlKT3339f4eHhkjJPAnr27Gk8HxUVpb59++rdd9812jiyZcsWffjhh8a67d8SAIpKeYjBo0aNMqYRjI+P16hRo+xK3mZZtWqVXUzp16+fbrjhhny3X6FCBc2cOVNff/11jtLPJ06c0COPPGJUhwgICNDDDz+c7zaL25133mlMb5SWlqb/+7//c3hX1V9//aXHH3/cuMjStm1bhxcO+vXrp8mTJ2vHjh25lscODw/Xm2++aaxnj4vvvfeeHnjgAf3888/GOU12ly5d0qRJk4wY7uvr67F56gHAk8pD/L377ruN7+CsWDJ//nzjhhhb165d07p16/Svf/3Lrb55Is4UJeIsAORtyJAhRtX6pKQk3X///Vq4cGGuN4ImJiZq+fLlGjlypN13na2WLVsay7///rvHpud1h7e3t1577TUjoXr9+vV67LHHcp1t4OzZs/rggw/spiySpGeffVZjxozRb7/9lmtVzIsXL+qFF14w4m+TJk3UqFEj4/kTJ07o77//liT16dOnxN8sZDvY3L17d5ensLGdCnr16tVKTEz0WN8K07hx44xpp3ft2qWXX345x7Rm27Zts7umMXToUDVv3jzXbX744YcKDg42/uVm7Nixmjhxonbu3JnrecaZM2f0zDPP6NtvvzUeGzx4sN00ZUB5QhyzRxz7H+JY2Ylj27dvt9v/9u3bc20bHBxs97d7/vnnc7RPTk7WK6+8otDQUEmZYw7jxo3LdZtZ2836ZzvenN3hw4c1bdo0HT161OHz0dHRmjBhgj766CNJmWPvU6ZMUY0aNXLdZv/+/fXBBx/kOVtWaGio7r33Xu3bt894bNy4cS7NKuYJ3kW6N6CEuO222zR9+nSlpaXZXXRs06aNXWn73IwbN06PPvqoMjIydAkVroAAAQAASURBVPDgQQ0ZMkSdOnVSw4YNlZycrF27dhkXCJ977jktXrxY586dc7u/aWlpRrWpNm3a2M3d6oxBgwbp9OnTCgsL02233aaQkBA1atRISUlJ2rlzp13izw033GCXLZ/d9OnTdd999+n06dNKTk7Ws88+qzlz5qh9+/aqUKGCTpw4oX379hknYz4+Ppo1a5aqV69ut52rV6/ancTcfvvtuuuuu3Lsr1atWpo2bZpGjx4t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CggI0Ndff62NGzfq119/VWhoqKKjo5Weni5/f3+1bt1aAwcO1JAhQxzeLbtu3TotXLhQUuZF+vfeey/fO49ffPFFbd++XUePHtWFCxf02muvae7cua5/EB701FNPaejQofrhhx+0efNmnT17VleuXFG1atXUsGFD9ezZU8OHD1f9+vVz3cajjz6qW265RX/99Zf27NmjI0eO6Ny5c0pKSpLJZFL16tXVrFkzde/eXXfddZcxz7WtOnXqaPv27dq2bZt27dqlAwcO6PTp04qLi1NaWpqqVq2q+vXrq127dho8eLDdnM0AUBzKSwzu2LGjfvnlFy1fvlxr1qzR4cOHFRsbK29vbwUGBiokJES333673bSyzrrvvvvUpUsXLVy4UH/99ZcuXLggSWrQoIH69eunBx980OWS0iVB06ZN9eOPP+q3337TH3/8obCwMMXFxUnKTB7o0KGDBg0apEGDBuVZ4nv79u3atWuXduzYofDwcP3999+KjY1VamqqKleurLp166pt27YaNGiQ+vfvn2OKYClzauT7779ff/31l/bu3avjx48rMjJSSUlJMpvN8vPzU4sWLXTTTTdp6NCh8vf3L7TPBQA8obzEXz8/P3300UcKCwvTypUrtWPHDl24cEGXL19WpUqVVLduXbVu3Vq9evXK9W7v/HgizhQH4iwA5K1y5cqaMmWKHn/8cS1fvlzbtm3TqVOnFB8fr4yMDOOaX6tWrdS9e3f17t07z8G6559/XiEhIfrxxx914MABxcbG5jrlUVEZPHiw+vbtq59//lkbN27UkSNHFBcXJ4vFoho1aqhp06YKCQnRoEGDcsT1Tz75RAcPHtTWrVsVFhamEydO6MKFC0pJSVHFihVVq1YttWzZUn369NGdd96Z47OJi4szbkrq0aNHia9qaDttU79+/dwemB0yZIgxcL1z506dOXNGDRs29EgfC9vw4cN10003acmSJVq/fr3Onz+v5ORkBQYGqm3bthoyZIgGDhzo0Sm45syZoz179mjPnj0KDw9XdHS04uPjdfnyZVWsWFF+fn5q2bKlQkJCdNddd5XKax9AYSGOEcdsEceIY3Xq1NG8efO0evVqrVixQgcOHFB0dLR8fHxUv3599evXT//85z/zHMd2R5s2bfT5559r69at2rNnj6KiohQbGyuz2azAwEC1atVKgwYN0sCBA1Wx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\n", "text/plain": [ "" ] }, - "execution_count": 11, "metadata": { "image/png": { "width": 1000 - }, - "tags": [] + } }, - "output_type": "execute_result" + "execution_count": 15 } ], "source": [ - "# we can also output some older school graphs if the tensor board isn't working for whatever reason... \n", "from utils.plots import plot_results # plot results.txt as results.png\n", "Image(filename='/content/yolov5/runs/train/yolov5s_results/results.png', width=1000) # view results.png" ] @@ -906,86 +1232,84 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 18, "metadata": { "colab": { "base_uri": "https://localhost:8080/", - "height": 935 + "height": 917 }, "id": "PF9MLHDb7tB6", - "outputId": "be844e31-99a3-4aae-c968-235a52365ac0", + "outputId": "1668d4dc-f62f-4f93-ae68-e92b6dae543a", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", - "output_type": "stream", - "text": [ - "GROUND TRUTH TRAINING DATA:\n" - ] - }, - { + "output_type": "execute_result", "data": { - "image/jpeg": "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", + "image/jpeg": "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\n", "text/plain": [ "" ] }, - "execution_count": 12, "metadata": { "image/jpeg": { "width": 900 - }, - "tags": [] + } }, - "output_type": "execute_result" + "execution_count": 18 } ], "source": [ - "# first, display our ground truth data\n", - "print(\"GROUND TRUTH TRAINING DATA:\")\n", - "Image(filename='/content/yolov5/runs/train/yolov5s_results/test_batch0_labels.jpg', width=900)" + "Image(filename='/content/yolov5/runs/train/yolov5s_results/val_batch0_labels.jpg', width=900)" ] }, { "cell_type": "code", + "source": [], + "metadata": { + "id": "HE2fpqMLZYuq" + }, "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "execution_count": 19, "metadata": { "colab": { "base_uri": "https://localhost:8080/", "height": 935 }, "id": "W40tI99_7BcH", - "outputId": "cccf6f3d-131b-48c9-b535-3dca782b3aaa", + "outputId": "11ce19fd-a649-4456-def6-0d710cc50efd", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "GROUND TRUTH AUGMENTED TRAINING DATA:\n" ] }, { + "output_type": "execute_result", "data": { - "image/jpeg": "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", + "image/jpeg": "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T+Jr2HP+o2Lj/gIP9a1or3iKnwmZpV9LBItpdn2STsfau40BcySt6ACuIliBJVhkHpWzp+o6lY6RObSGOaRT8rOx546YrSpHsKMtDVvPClrcarPqdzPIzE71QYABA4+vSsivP77xdruq3hiubx4xvH7uP5QOelegVrCMorUwk09goooqyQooooAK0NC/5GHTP+vuL/0MVn1oaF/yMOmf9fcX/oYoAx/ib/yULVP+2X/opK5E11vxN/5KFqn/AGy/9FJXJVqthDCT0ppBzSnrSYpjEpppSMGm4oAY3pionGamIqJxSAgccc0W5KuQDSt7UyJtsw96GBfD5HvS7yOKjxzx0oBoEWoptvfpVsShhnNZi8HipUfBosM0FcE9acGGcVUSTJqZH4JqbAWAeaXcc5qvv/OnB+lAyUsfxpC1M3e9Md8d6BDmYjoaidiRTSx9aiZie9UkArcnPpTM0Z9+aOPerEHSgcmjPanDgUAIBR36UvFJ3oATnPpTgaAOaMcmmAuR6Uhx+NGOOtH0pAOHXpTSDml9qQ8UCHAYHWjqKTr1NL34pjEpaTjNL1FABjPejHrQOO1B5oAUjFJniikPNABk5petNwKdnigQgBGaBye1HvRmgBe1JSdc460DOeaQDscdabTu+KaeoNAC9hmtjwsB/wAJfon/AF/wf+jFrH/Wtfwqf+Kv0T/r/g/9GLQxnPfG3/kr2u/9u/8A6Tx15/XoHxt/5K9rv/bv/wCk8def1zjCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAqa0/wCPlPx/lUNTWn/Hyn4/yoA06KSloASloooAKTpS0lABS0UlAC0lLSUALSUZpaAEo4opaACkoooAWiikoAKWkooAWiikoAWijNFABW14Y/5CUn/XE/zWsWtrwx/yEpP+uJ/mKAOsrU8Nf8jVo/8A1+w/+hisutTw1/yNWj/9fsP/AKGKAOM+Nv8AyV7Xf+3f/wBJ468/r0D42/8AJXtd/wC3f/0njrz+gAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAroPAn/ACUPw1/2FbX/ANGrXP10HgT/AJKH4a/7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\n", "text/plain": [ "" ] }, - "execution_count": 13, "metadata": { "image/jpeg": { "width": 900 - }, - "tags": [] + } }, - "output_type": "execute_result" + "execution_count": 19 } ], "source": [ @@ -1000,27 +1324,28 @@ "id": "N3qM6T0W53gh" }, "source": [ - "#Run Inference With Trained Weights\n", - "Run inference with a pretrained checkpoint on contents of `test/images` folder downloaded from Roboflow." + "# Run Inference With Trained Weights\n", + "\n", + "Next, we can run inference with a pretrained checkpoint on all images in the `test/images` folder to understand how our model performs on our test set." ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 20, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "yIEwt5YLeQ7P", - "outputId": "d042529c-2d05-49e1-f53c-a8aac20eaab7", + "outputId": "b76b50ae-73e8-4de8-816b-a58e9cfb2dbf", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "\u001b[0m\u001b[01;34mtrain\u001b[0m/\n" ] @@ -1033,21 +1358,21 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 21, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "4SyOWS80qR32", - "outputId": "53ece1df-82ed-4db9-eb7c-7de938ee493c", + "outputId": "659ec67b-6836-45ae-b90b-db7998117ac3", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "best.pt last.pt\n" ] @@ -1057,110 +1382,319 @@ "%ls runs/train/yolov5s_results/weights" ] }, + { + "cell_type": "markdown", + "source": [ + "In the snippet below, replace `Cash-Counter-10` with the name of the folder in which your dataset is stored." + ], + "metadata": { + "id": "0h3D6Ms2Z_ZU" + } + }, { "cell_type": "code", - "execution_count": null, + "execution_count": 25, "metadata": { "colab": { "base_uri": "https://localhost:8080/" }, "id": "9nmZZnWOgJ2S", - "outputId": "9d56f834-e5f3-43dc-b935-a4c5827e2c36", + "outputId": "6a71b3c3-d26b-4e59-a1b9-5757fd3dc959", "vscode": { "languageId": "python" } }, "outputs": [ { - "name": "stdout", "output_type": "stream", + "name": "stdout", "text": [ "/content/yolov5\n", - "Namespace(agnostic_nms=False, augment=False, classes=None, conf_thres=0.4, device='', exist_ok=False, img_size=416, iou_thres=0.45, name='exp', project='runs/detect', save_conf=False, save_txt=False, source='../test/images', update=False, view_img=False, weights=['runs/train/yolov5s_results/weights/best.pt'])\n", - "Using torch 1.7.1+cu101 CPU\n", + "\u001b[34m\u001b[1mdetect: \u001b[0mweights=['runs/train/yolov5s_results/weights/best.pt'], source=Cash-Counter-10/test/images/, data=data/coco128.yaml, imgsz=[416, 416], conf_thres=0.4, iou_thres=0.45, max_det=1000, device=, view_img=False, save_txt=False, save_conf=False, save_crop=False, nosave=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=runs/detect, name=exp, exist_ok=False, line_thickness=3, hide_labels=False, hide_conf=False, half=False, dnn=False, vid_stride=1\n", + "YOLOv5 🚀 v7.0-72-g064365d Python-3.10.12 torch-2.1.0+cu118 CUDA:0 (Tesla T4, 15102MiB)\n", "\n", "Fusing layers... \n", - "Model Summary: 232 layers, 7251912 parameters, 0 gradients\n", - "image 1/36 /content/test/images/BloodImage_00038_jpg.rf.ffa23e4b5b55b523367f332af726eae8.jpg: 416x416 Done. (0.204s)\n", - "image 2/36 /content/test/images/BloodImage_00044_jpg.rf.e7760375eba4bc20c5746367e2311e18.jpg: 416x416 Done. (0.171s)\n", - "image 3/36 /content/test/images/BloodImage_00062_jpg.rf.1be1ca0ecdf783798fc10346baaa203e.jpg: 416x416 Done. (0.173s)\n", - "image 4/36 /content/test/images/BloodImage_00090_jpg.rf.cdbf8f6ed3b93fa902a0bc991132cb40.jpg: 416x416 Done. (0.163s)\n", - "image 5/36 /content/test/images/BloodImage_00099_jpg.rf.e3c42cd68359527494a53843479dff5c.jpg: 416x416 Done. (0.169s)\n", - "image 6/36 /content/test/images/BloodImage_00112_jpg.rf.978cec39235980055c2ad7ff8b6f1912.jpg: 416x416 Done. (0.172s)\n", - "image 7/36 /content/test/images/BloodImage_00113_jpg.rf.a17463f1ddc2e7729f935f8a74bc86a4.jpg: 416x416 Done. (0.174s)\n", - "image 8/36 /content/test/images/BloodImage_00120_jpg.rf.6725d54bf5615683448eb1de4c7577ee.jpg: 416x416 Done. (0.168s)\n", - "image 9/36 /content/test/images/BloodImage_00133_jpg.rf.39ee4e4a097a7b40defa56aea6533caf.jpg: 416x416 Done. (0.164s)\n", - "image 10/36 /content/test/images/BloodImage_00134_jpg.rf.0d9da503b62e0034a2819a39cce7e7d9.jpg: 416x416 Done. (0.166s)\n", - "image 11/36 /content/test/images/BloodImage_00154_jpg.rf.e5b45569e9cbede1ed36f82f14566c29.jpg: 416x416 Done. (0.163s)\n", - "image 12/36 /content/test/images/BloodImage_00160_jpg.rf.894e8c8c7179ec9958a4d6c7b6b45616.jpg: 416x416 Done. (0.173s)\n", - "image 13/36 /content/test/images/BloodImage_00190_jpg.rf.3e0bf272a5f8ea902775e4cbc56c538c.jpg: 416x416 Done. (0.164s)\n", - "image 14/36 /content/test/images/BloodImage_00191_jpg.rf.313648dd345edbdd005886613a01fe5d.jpg: 416x416 Done. (0.167s)\n", - "image 15/36 /content/test/images/BloodImage_00204_jpg.rf.04ba9998769a12d374e6c4b284e6a4a2.jpg: 416x416 Done. (0.170s)\n", - "image 16/36 /content/test/images/BloodImage_00227_jpg.rf.d1790b0cdc042312d1e0af86a5c13519.jpg: 416x416 Done. (0.167s)\n", - "image 17/36 /content/test/images/BloodImage_00235_jpg.rf.283fff79a1188b82f5a544d381909c2d.jpg: 416x416 Done. (0.165s)\n", - "image 18/36 /content/test/images/BloodImage_00241_jpg.rf.757020b43fe3414a0f66770f54da283f.jpg: 416x416 Done. (0.167s)\n", - "image 19/36 /content/test/images/BloodImage_00254_jpg.rf.e95bc889425924cc7a35a7b0cea4d470.jpg: 416x416 Done. (0.163s)\n", - "image 20/36 /content/test/images/BloodImage_00265_jpg.rf.7d102d5f38caddb90a465912fb7bdc5c.jpg: 416x416 Done. (0.167s)\n", - "image 21/36 /content/test/images/BloodImage_00266_jpg.rf.2521623f1047a9502b2705a626ad6655.jpg: 416x416 Done. (0.165s)\n", - "image 22/36 /content/test/images/BloodImage_00275_jpg.rf.585f5abcf10f926c74ac2e2340bbdf44.jpg: 416x416 Done. (0.164s)\n", - "image 23/36 /content/test/images/BloodImage_00278_jpg.rf.cfe491c301184766df6aa73fa48a7f33.jpg: 416x416 Done. (0.165s)\n", - "image 24/36 /content/test/images/BloodImage_00284_jpg.rf.63402cee4454cb6d7655b83cacc29817.jpg: 416x416 Done. (0.189s)\n", - "image 25/36 /content/test/images/BloodImage_00289_jpg.rf.72f51d668e5ebc31700b1a10e8f7dec8.jpg: 416x416 Done. (0.164s)\n", - "image 26/36 /content/test/images/BloodImage_00301_jpg.rf.885ee9fbea0573ba35b9561a5d1d0437.jpg: 416x416 Done. (0.162s)\n", - "image 27/36 /content/test/images/BloodImage_00302_jpg.rf.911302bb5caaf9467e101afeece651e1.jpg: 416x416 Done. (0.167s)\n", - "image 28/36 /content/test/images/BloodImage_00325_jpg.rf.c8ab9fc71ad718a95901a00cc18c27e6.jpg: 416x416 Done. (0.162s)\n", - "image 29/36 /content/test/images/BloodImage_00334_jpg.rf.8b2c2a9c5a39e78eb74aa26c82967069.jpg: 416x416 Done. (0.164s)\n", - "image 30/36 /content/test/images/BloodImage_00336_jpg.rf.8d3e710e8696c10bcbb101dc8a553ca0.jpg: 416x416 Done. (0.168s)\n", - "image 31/36 /content/test/images/BloodImage_00337_jpg.rf.b6cb228440b9158cafec01a0351e3aad.jpg: 416x416 Done. (0.167s)\n", - "image 32/36 /content/test/images/BloodImage_00350_jpg.rf.e2c472c90de4ce51fe4f21b093db6ece.jpg: 416x416 Done. (0.165s)\n", - "image 33/36 /content/test/images/BloodImage_00359_jpg.rf.03331bc3903822adbe982fe9e7cd061b.jpg: 416x416 Done. (0.166s)\n", - "image 34/36 /content/test/images/BloodImage_00369_jpg.rf.c3818de705d661536ed7e4ce49040020.jpg: 416x416 Done. (0.162s)\n", - "image 35/36 /content/test/images/BloodImage_00385_jpg.rf.865551dd16b189945cbba0fe51baa151.jpg: 416x416 Done. (0.170s)\n", - "image 36/36 /content/test/images/BloodImage_00386_jpg.rf.c708422b2d9c642f200a853e70012850.jpg: 416x416 Done. (0.169s)\n", - "Results saved to runs/detect/exp2\n", - "Done. (6.319s)\n" + "custom_YOLOv5s summary: 182 layers, 7270791 parameters, 0 gradients\n", + "image 1/131 /content/yolov5/Cash-Counter-10/test/images/004__5-Cents_usa_jpg.rf.d130db062bc923876a040ab5fbf5b9aa.jpg: 416x416 1 Penny, 9.2ms\n", + "image 2/131 /content/yolov5/Cash-Counter-10/test/images/005__1-4-Dollar_usa_jpg.rf.b09a6221d5ce4c0458a433992f3394b5.jpg: 416x416 (no detections), 8.1ms\n", + "image 3/131 /content/yolov5/Cash-Counter-10/test/images/008__1-Cent_usa_jpg.rf.9f22b707346ad7d7b6f7b9ddb98c1441.jpg: 416x416 (no detections), 10.0ms\n", + "image 4/131 /content/yolov5/Cash-Counter-10/test/images/009__1-Dime_usa_jpg.rf.82c027c8fd19b5bd2f5760970c212f1a.jpg: 416x416 (no detections), 10.1ms\n", + "image 5/131 /content/yolov5/Cash-Counter-10/test/images/012__1-4-Dollar_usa_jpg.rf.d21f3790043003cb788bc91b7c3f17e4.jpg: 416x416 (no detections), 9.9ms\n", + "image 6/131 /content/yolov5/Cash-Counter-10/test/images/015__1-Dime_usa_jpg.rf.fb21f2b31963eab5f4ca8afe4f839b04.jpg: 416x416 (no detections), 9.8ms\n", + "image 7/131 /content/yolov5/Cash-Counter-10/test/images/016__1-Dime_usa_jpg.rf.761dfa09173af8ea5044826a69c65015.jpg: 416x416 (no detections), 8.0ms\n", + "image 8/131 /content/yolov5/Cash-Counter-10/test/images/017__1-4-Dollar_usa_jpg.rf.3c1c43db480d0e078377fbff829033be.jpg: 416x416 (no detections), 8.0ms\n", + "image 9/131 /content/yolov5/Cash-Counter-10/test/images/029__1-4-Dollar_usa_jpg.rf.465b09946bec5faa5ed70f38dc114db1.jpg: 416x416 1 Quarter, 8.1ms\n", + "image 10/131 /content/yolov5/Cash-Counter-10/test/images/031__1-Cent_usa_jpg.rf.16b1230b3551278669624ab1c44d1e91.jpg: 416x416 (no detections), 9.2ms\n", + "image 11/131 /content/yolov5/Cash-Counter-10/test/images/031__5-Cents_usa_jpg.rf.1cc85b84a772494d24b4cd78629c462c.jpg: 416x416 1 Penny, 8.0ms\n", + "image 12/131 /content/yolov5/Cash-Counter-10/test/images/12E63DB3-5DE6-4359-8813-C771C7EBB630.rf.c79098b2b0d8a09decd09d26bfc0815e.jpg: 416x416 (no detections), 8.0ms\n", + "image 13/131 /content/yolov5/Cash-Counter-10/test/images/14C0C6CA-2E3A-442C-B5B4-ADC1FF8CE149.rf.d4a32c8326f8ebcffe758b26343a8e61.jpg: 416x416 (no detections), 8.0ms\n", + "image 14/131 /content/yolov5/Cash-Counter-10/test/images/190A7B52-9631-4278-B5BC-4609794002F4.rf.4404baa9824674dc2f1d8a1fafee4a06.jpg: 416x416 2 Pennys, 8.2ms\n", + "image 15/131 /content/yolov5/Cash-Counter-10/test/images/1C472421-46BD-49F3-B26B-9EBB38191F4B.rf.1baaa4927bfc6b620fcb5f1a3c6c1202.jpg: 416x416 (no detections), 8.1ms\n", + "image 16/131 /content/yolov5/Cash-Counter-10/test/images/20220515_210913_jpg.rf.a437080a2f19232fee3c078d1f509512.jpg: 416x416 1 Dime, 3 Pennys, 7 Quarters, 8.0ms\n", + "image 17/131 /content/yolov5/Cash-Counter-10/test/images/214D4ED1-D2D5-4107-9731-2DD0587674A3.rf.6fd8984e6c9e139102b0396e12890654.jpg: 416x416 (no detections), 8.0ms\n", + "image 18/131 /content/yolov5/Cash-Counter-10/test/images/2366AA68-DAEB-4C51-9232-7369F923E169.rf.04d2c57ee2dd801bc276785e7b36b72f.jpg: 416x416 (no detections), 8.0ms\n", + "image 19/131 /content/yolov5/Cash-Counter-10/test/images/24AE1633-B0B6-4484-A3D8-BB4ADD9E0929.rf.935c76606a712dfb876ff9138c859a5c.jpg: 416x416 (no detections), 10.2ms\n", + "image 20/131 /content/yolov5/Cash-Counter-10/test/images/25BE9715-7A58-4757-AED2-C8416063A401.rf.ed2be79a1ddd712eb64fc9eb58df909c.jpg: 416x416 (no detections), 8.0ms\n", + "image 21/131 /content/yolov5/Cash-Counter-10/test/images/2_jpg.rf.ff9c1f06d9570d76fcd562fca4e21694.jpg: 416x416 2 Dimes, 1 Penny, 8.0ms\n", + "image 22/131 /content/yolov5/Cash-Counter-10/test/images/337C8716-DB70-4215-A93F-D196E222139C.rf.3d4d8879d61b0c5d3c793465e56393d6.jpg: 416x416 (no detections), 8.0ms\n", + "image 23/131 /content/yolov5/Cash-Counter-10/test/images/37EF6C87-3303-4FE3-91A6-7C564D8CB951.rf.8ea771368284203f50fe715aa7a487e1.jpg: 416x416 (no detections), 8.0ms\n", + "image 24/131 /content/yolov5/Cash-Counter-10/test/images/41E6B615-BDD5-4BEB-B252-D070D67A27EB.rf.01a938df7dad8772cf765929b9ed3911.jpg: 416x416 (no detections), 11.9ms\n", + "image 25/131 /content/yolov5/Cash-Counter-10/test/images/445A03D2-DC26-4529-80C0-CCC4E010C82C.rf.7f75b48d0f32fd5adbe5211905191008.jpg: 416x416 (no detections), 8.0ms\n", + "image 26/131 /content/yolov5/Cash-Counter-10/test/images/454E7171-FCA2-4D69-A0D8-119A6FCE4377.rf.ad557350c156e236ff9ef27ece9f9b1d.jpg: 416x416 (no detections), 8.0ms\n", + "image 27/131 /content/yolov5/Cash-Counter-10/test/images/47355F82-6C9B-43F4-8A9E-2E53BAD4D129.rf.4dbf8766014a670bfccd7d42e02038cd.jpg: 416x416 (no detections), 8.0ms\n", + "image 28/131 /content/yolov5/Cash-Counter-10/test/images/4BEB803A-B59F-484E-BFAF-9B93EE66694B.rf.d97f59aa0fe450e3a72babe49509cdd8.jpg: 416x416 (no detections), 8.0ms\n", + "image 29/131 /content/yolov5/Cash-Counter-10/test/images/4EC69102-2C79-49EB-87B3-40AF49EAEA5A.rf.b5eaf06cc533f821451680bd6cb4a6c2.jpg: 416x416 (no detections), 8.0ms\n", + "image 30/131 /content/yolov5/Cash-Counter-10/test/images/4_jpg.rf.cf6e93e6366872279889de7553cbd87c.jpg: 416x416 1 Dime, 4 Pennys, 5 Quarters, 8.0ms\n", + "image 31/131 /content/yolov5/Cash-Counter-10/test/images/537E232F-58C9-49DA-B831-03BC2A0306B0.rf.22362157c032bbd9dfd667dbb4c1ec01.jpg: 416x416 (no detections), 8.0ms\n", + "image 32/131 /content/yolov5/Cash-Counter-10/test/images/60B4AC07-6C65-4612-B46B-0728D3B923BA.rf.3bdb6731515c33e418883f3ae1c92042.jpg: 416x416 (no detections), 8.0ms\n", + "image 33/131 /content/yolov5/Cash-Counter-10/test/images/6CC2BB66-5417-4B56-BA47-0AE5097B9F85.rf.ec0e073e202b4eed74609d552253c19f.jpg: 416x416 (no detections), 8.0ms\n", + "image 34/131 /content/yolov5/Cash-Counter-10/test/images/6D5D53E4-B683-4996-AE11-8A6A7AB4DF4B.rf.71f06e0755d9543054cb432c3481cedb.jpg: 416x416 (no detections), 8.0ms\n", + "image 35/131 /content/yolov5/Cash-Counter-10/test/images/6EE050FD-6285-45D6-800D-45C483A50957.rf.376f81b14fecedd1e58099d9bc5e315f.jpg: 416x416 (no detections), 8.0ms\n", + "image 36/131 /content/yolov5/Cash-Counter-10/test/images/7AA87EDD-A57C-44B0-A4DD-3B5B331B57FF.rf.5d637849b7e1fd45fbdae70d8f53d1c2.jpg: 416x416 (no detections), 8.0ms\n", + "image 37/131 /content/yolov5/Cash-Counter-10/test/images/7FE0C68B-5DA7-4409-B692-28923D30390F.rf.723dabb31faaf8107bc0a661bb796760.jpg: 416x416 (no detections), 8.7ms\n", + "image 38/131 /content/yolov5/Cash-Counter-10/test/images/8CF84A73-8E43-43D6-B4C1-0CDEC07227C6.rf.d6616089d4fc82a3cdb7afbf0ed1a09b.jpg: 416x416 (no detections), 10.7ms\n", + "image 39/131 /content/yolov5/Cash-Counter-10/test/images/8FBA9D91-2F25-4155-AE79-C14BDE970217.rf.2b8afb3155dd5c89cf06cbf60f1f6a9f.jpg: 416x416 (no detections), 7.8ms\n", + "image 40/131 /content/yolov5/Cash-Counter-10/test/images/92C96025-8394-45FF-8A68-C5EEE6763CEC.rf.f5655f2960d866ad4b2bd06057d27bee.jpg: 416x416 (no detections), 7.8ms\n", + "image 41/131 /content/yolov5/Cash-Counter-10/test/images/9CCD2BC8-C162-49F0-BA99-EE3F62DD2967.rf.4638f26524f1630b987b0682a3e24922.jpg: 416x416 (no detections), 7.8ms\n", + "image 42/131 /content/yolov5/Cash-Counter-10/test/images/9ED27C3F-9403-41FE-B371-B7A510E6DA3E.rf.3148ddfceeaa8d472a99e6e9e9a619cd.jpg: 416x416 (no detections), 7.8ms\n", + "image 43/131 /content/yolov5/Cash-Counter-10/test/images/A28B3C73-CCA2-48D8-8897-195C923C5532.rf.3831ec9d93a8181c905b8bfd1d290036.jpg: 416x416 (no detections), 7.8ms\n", + "image 44/131 /content/yolov5/Cash-Counter-10/test/images/B2368764-D08D-447C-A920-702CC77DCC90.rf.f60478874c6e841a5f2c5d6f0fcf1c53.jpg: 416x416 (no detections), 7.8ms\n", + "image 45/131 /content/yolov5/Cash-Counter-10/test/images/B40CBA52-D4AB-4506-A6D7-E2577758FF95.rf.5b1c451eebb3556bcd8f69b462a54e77.jpg: 416x416 (no detections), 7.8ms\n", + "image 46/131 /content/yolov5/Cash-Counter-10/test/images/BDBF7E12-F2B1-4FCA-88B1-134362F33A35.rf.818298b220622308ec53f20b8f66a482.jpg: 416x416 (no detections), 7.8ms\n", + "image 47/131 /content/yolov5/Cash-Counter-10/test/images/C62860BC-2844-4544-9B6C-12F07098EB41.rf.1e4d76e680abf31538e9a86bb59628c6.jpg: 416x416 (no detections), 7.8ms\n", + "image 48/131 /content/yolov5/Cash-Counter-10/test/images/C6E98944-1DD7-480C-B749-49E389D96646.rf.adcb7b29f84d30e5730aab1472c8720b.jpg: 416x416 (no detections), 7.8ms\n", + "image 49/131 /content/yolov5/Cash-Counter-10/test/images/CAFE98D8-7E49-4958-8EB9-F0A2571B4365.rf.cee9434b6bc8c163126b5a3a2f501bcf.jpg: 416x416 (no detections), 7.8ms\n", + "image 50/131 /content/yolov5/Cash-Counter-10/test/images/CE5FC0CA-E8B4-48D5-811D-1EB47EA026E9.rf.d834318a16bc1cbb456864db9ed2d239.jpg: 416x416 (no detections), 7.8ms\n", + "image 51/131 /content/yolov5/Cash-Counter-10/test/images/D543D353-374F-4903-B27D-BDCB52B7C028.rf.411ada6f3aedfccd8f0f87905224f656.jpg: 416x416 (no detections), 7.8ms\n", + "image 52/131 /content/yolov5/Cash-Counter-10/test/images/D700F7EA-82D4-4C36-81B6-396923AD3470.rf.4697d702f2af55fdd6ff12bd1f51f6f3.jpg: 416x416 (no detections), 10.1ms\n", + "image 53/131 /content/yolov5/Cash-Counter-10/test/images/D70FE378-95B6-4640-8A3E-EB36FE028FCE.rf.45020f364a47362622cf3a20baf088fe.jpg: 416x416 (no detections), 11.0ms\n", + "image 54/131 /content/yolov5/Cash-Counter-10/test/images/D959B8EF-0A47-4F17-B4F3-8E898E3081E4.rf.516fa2c7247ef433ba56377d5179deaa.jpg: 416x416 (no detections), 11.7ms\n", + "image 55/131 /content/yolov5/Cash-Counter-10/test/images/DC3AD232-A32F-4623-A32C-3C345CA78885.rf.47cec34985ddc162fbee00e03c0ab92c.jpg: 416x416 (no detections), 9.8ms\n", + "image 56/131 /content/yolov5/Cash-Counter-10/test/images/EC9A6263-73E1-4D04-A1C0-4D19A1CAAEDC.rf.a63517ff27c10d9442b3dd42b2bf4362.jpg: 416x416 (no detections), 10.0ms\n", + "image 57/131 /content/yolov5/Cash-Counter-10/test/images/F6665D91-A97F-40C7-939E-0724F56CB61D.rf.1190bd1e3cf3dde47f93d340beceb843.jpg: 416x416 (no detections), 9.5ms\n", + "image 58/131 /content/yolov5/Cash-Counter-10/test/images/F82A4609-350B-4E73-B2B1-F3A7897A137D.rf.28123a6f5aedef16ea957a4b365709e5.jpg: 416x416 (no detections), 15.1ms\n", + "image 59/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1901_jpg.rf.ba951e0d0604529329e67a885cbb9fc9.jpg: 416x416 (no detections), 18.3ms\n", + "image 60/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1905_jpg.rf.2be4f1a51018ceff3a15bd075c530671.jpg: 416x416 (no detections), 11.0ms\n", + "image 61/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1908_jpg.rf.203e27d272302fe19931edc5c29b4e77.jpg: 416x416 (no detections), 10.3ms\n", + "image 62/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1920_jpg.rf.3f47c19c7361ffaa4d01a6f365877b89.jpg: 416x416 (no detections), 7.9ms\n", + "image 63/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1931_jpg.rf.6080e808aeec33f6ac7081a766780bf0.jpg: 416x416 (no detections), 7.9ms\n", + "image 64/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1936_jpg.rf.8bb439b5ef4b5304ea14627c65d53c8e.jpg: 416x416 (no detections), 7.9ms\n", + "image 65/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1941_jpg.rf.01d84aafc0209fc035c891a3f35dab20.jpg: 416x416 (no detections), 9.2ms\n", + "image 66/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1951_jpg.rf.226e6ddfd29d9ec236bd723420cf17bb.jpg: 416x416 (no detections), 7.8ms\n", + "image 67/131 /content/yolov5/Cash-Counter-10/test/images/IMG_1964_jpg.rf.9a8b1b4bf231fa881b542fb97cda9177.jpg: 416x416 (no detections), 7.9ms\n", + "image 68/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2009_jpg.rf.b45f163c2bc35bc9f450bf26479d841f.jpg: 416x416 (no detections), 11.2ms\n", + "image 69/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2011_jpg.rf.ab8d29a86bca04f3b7178ae523652575.jpg: 416x416 (no detections), 9.5ms\n", + "image 70/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2019_jpg.rf.63707ea418856af64416dbd05c2e2b2d.jpg: 416x416 (no detections), 7.8ms\n", + "image 71/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2020_jpg.rf.77cea6500bb3b1a92897000fbd241c82.jpg: 416x416 (no detections), 9.8ms\n", + "image 72/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2028_jpg.rf.d2dbd5f3a665d5c1d9559e9a3e204fa0.jpg: 416x416 (no detections), 7.8ms\n", + "image 73/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2029_jpg.rf.28f171d1035d42e14a88b1a1cc7d09f1.jpg: 416x416 (no detections), 7.8ms\n", + "image 74/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2047_jpg.rf.d4c3d25bc00cb3b4f38f24f45e5c2e60.jpg: 416x416 (no detections), 7.8ms\n", + "image 75/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2081_jpg.rf.bf3a82a3f17e2a2955b58f6f26ccce32.jpg: 416x416 (no detections), 7.8ms\n", + "image 76/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2087_jpg.rf.1df0dbc5a8fb3644643725177ea111fb.jpg: 416x416 (no detections), 7.8ms\n", + "image 77/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2094_jpg.rf.3e70f255e403911a57c01204cdce4967.jpg: 416x416 (no detections), 7.8ms\n", + "image 78/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2098_jpg.rf.d22a669811757e71d10c361793f0d97d.jpg: 416x416 (no detections), 7.8ms\n", + "image 79/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2152_mp4-10_jpg.rf.2d34d221c55c8c2a066b3e44e441676d.jpg: 416x416 2 hundreds, 7.8ms\n", + "image 80/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2152_mp4-13_jpg.rf.b16a8be1ad32bad45a87621ce897ed36.jpg: 416x416 3 hundreds, 17.6ms\n", + "image 81/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2152_mp4-14_jpg.rf.f92e890d37aa3cb2a4ff262692149a39.jpg: 416x416 3 hundreds, 7.8ms\n", + "image 82/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2152_mp4-17_jpg.rf.bc51ffd737fa8c48385b8e0e83a0eb51.jpg: 416x416 3 hundreds, 7.8ms\n", + "image 83/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2152_mp4-6_jpg.rf.41b733e7d5e3c3cadb9b1e109c971f25.jpg: 416x416 3 hundreds, 7.8ms\n", + "image 84/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2154_mp4-3_jpg.rf.2c60a73a22a82a5d19f7e2dd022a6e4f.jpg: 416x416 (no detections), 7.9ms\n", + "image 85/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2154_mp4-6_jpg.rf.0de4783483a6c36c5892701bb7b0ca31.jpg: 416x416 1 hundred, 7.8ms\n", + "image 86/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2156_mp4-1_jpg.rf.bb614941b325fdff64a7a8ef2624d26e.jpg: 416x416 (no detections), 7.9ms\n", + "image 87/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2156_mp4-8_jpg.rf.1d7e867267a830632a8644349c094173.jpg: 416x416 (no detections), 7.8ms\n", + "image 88/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2161_jpeg_jpg.rf.ef28cd99b87eabbcbef5451b2dae20b9.jpg: 416x416 (no detections), 7.9ms\n", + "image 89/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2177_jpeg_jpg.rf.fb372ef036dcf5160f66f2a9545693af.jpg: 416x416 (no detections), 7.9ms\n", + "image 90/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2186_jpeg_jpg.rf.129abb76f639fa8c4aa067231649eaff.jpg: 416x416 (no detections), 7.8ms\n", + "image 91/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2191_jpeg_jpg.rf.5e6cfece1e7645bd769c297397eef710.jpg: 416x416 (no detections), 8.4ms\n", + "image 92/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2197_jpeg_jpg.rf.038b34bd4fc20e4e32dd0d6c59d4d856.jpg: 416x416 (no detections), 10.1ms\n", + "image 93/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2204_jpeg_jpg.rf.fe2f4fac6071b68795de01f3a493b403.jpg: 416x416 (no detections), 7.8ms\n", + "image 94/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2228_jpeg_jpg.rf.0285c78d611bbc7ae422454915504469.jpg: 416x416 (no detections), 7.9ms\n", + "image 95/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2234_jpeg_jpg.rf.96715f9aadc0a001ff43f36e0bbd7f4b.jpg: 416x416 (no detections), 7.9ms\n", + "image 96/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2255_jpeg_jpg.rf.5adab7027aa07ae7c344c257269e624b.jpg: 416x416 (no detections), 7.9ms\n", + "image 97/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2266_jpeg_jpg.rf.ab04e53ed55c88b3727d5ef805e194e1.jpg: 416x416 (no detections), 9.7ms\n", + "image 98/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2267_jpeg_jpg.rf.c4fe47363136f619f25cc61df94eebb9.jpg: 416x416 (no detections), 7.8ms\n", + "image 99/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2284_jpeg_jpg.rf.04556136e99ea762fc80709c0eaabaec.jpg: 416x416 (no detections), 7.8ms\n", + "image 100/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2307_jpeg_jpg.rf.d94d73e7e451697254754d5409fceffa.jpg: 416x416 (no detections), 7.9ms\n", + "image 101/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2312_jpeg_jpg.rf.aea7bdda8e324c639bf3e10d022efc09.jpg: 416x416 (no detections), 8.6ms\n", + "image 102/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2321_jpeg_jpg.rf.fad8623e27a470a12e10e704d7aae517.jpg: 416x416 (no detections), 7.8ms\n", + "image 103/131 /content/yolov5/Cash-Counter-10/test/images/IMG_2326_jpeg_jpg.rf.ac738904a1dd703e20ff7a94380e5ebe.jpg: 416x416 (no detections), 7.8ms\n", + "image 104/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8469_jpg.rf.88faf80acb3c3908a5a1de7af5e3f0c1.jpg: 416x416 8 Nickels, 8 Pennys, 8.3ms\n", + "image 105/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8470_jpg.rf.c2359b2eec1b4f2eb860b24e45797cf4.jpg: 416x416 7 Nickels, 8 Pennys, 7.8ms\n", + "image 106/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8472_jpg.rf.64d1b3feadd09df1ffea3c84ed0861fc.jpg: 416x416 7 Nickels, 9 Pennys, 8.1ms\n", + "image 107/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8475_jpg.rf.d722e746c3d24cf2a247ef39d6d0d8c0.jpg: 416x416 8 Nickels, 8 Pennys, 8.0ms\n", + "image 108/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8480_jpg.rf.2e5932e577701b9fc876de30ba7492a9.jpg: 416x416 13 Nickels, 13 Pennys, 8.1ms\n", + "image 109/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8482_jpg.rf.84e5bfd7bd3808f150ce879cda579ee3.jpg: 416x416 13 Nickels, 13 Pennys, 8.0ms\n", + "image 110/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8483_jpg.rf.df5fff47f5ef50456fb21cc09e8abf94.jpg: 416x416 13 Nickels, 13 Pennys, 8.0ms\n", + "image 111/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8485_jpg.rf.f0570e571fa1215577964f8f9024042c.jpg: 416x416 13 Nickels, 13 Pennys, 8.0ms\n", + "image 112/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8495_jpg.rf.3089a212f35f8dab42ac0e6de0ff1d24.jpg: 416x416 8 Pennys, 8 Quarters, 8.0ms\n", + "image 113/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8495_jpg.rf.f453cf3c90b09fcdd3929328b0654b4b.jpg: 416x416 8 Pennys, 8 Quarters, 8.0ms\n", + "image 114/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8497_jpg.rf.2013b05faa98a345f7aea608f2ebd66d.jpg: 416x416 8 Pennys, 8 Quarters, 10.5ms\n", + "image 115/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8499_jpg.rf.f136aac8678b6e934c42cf847f8ca3f4.jpg: 416x416 8 Pennys, 7 Quarters, 25.5ms\n", + "image 116/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8505_jpg.rf.114e12ac2cf9e949399568d2111960a1.jpg: 416x416 8 Pennys, 8 Quarters, 10.4ms\n", + "image 117/131 /content/yolov5/Cash-Counter-10/test/images/IMG_8508_jpg.rf.1f4786e7783ce2d16610bd3eacde5642.jpg: 416x416 8 Pennys, 8 Quarters, 8.1ms\n", + "image 118/131 /content/yolov5/Cash-Counter-10/test/images/Photo-on-10-26-21-at-2-33-PM-3_jpg.rf.18e64e41737c6d5e040246ee3d30c97b.jpg: 416x416 (no detections), 8.1ms\n", + "image 119/131 /content/yolov5/Cash-Counter-10/test/images/Photo-on-10-26-21-at-2-37-PM-2_jpg.rf.29e1155d26d061f904903dc35017a6fc.jpg: 416x416 (no detections), 8.0ms\n", + "image 120/131 /content/yolov5/Cash-Counter-10/test/images/S10_jpg.rf.b038e6bfd2e8bee8bc6a8a460ab209b3.jpg: 416x416 15 Dimes, 5 Nickels, 10.0ms\n", + "image 121/131 /content/yolov5/Cash-Counter-10/test/images/S11_jpg.rf.4ea257a2254eb09dd28464f1161e4603.jpg: 416x416 15 Dimes, 6 Nickels, 8.0ms\n", + "image 122/131 /content/yolov5/Cash-Counter-10/test/images/S13_jpg.rf.10f2cc79057ecc91d470e6936e3ffedf.jpg: 416x416 15 Dimes, 21 Pennys, 8.0ms\n", + "image 123/131 /content/yolov5/Cash-Counter-10/test/images/S15_jpg.rf.e474b32ba63a61e489de8eb256e304ae.jpg: 416x416 21 Pennys, 8.1ms\n", + "image 124/131 /content/yolov5/Cash-Counter-10/test/images/S1_jpg.rf.1a1b2128ae0f19ccfbe5d35649baf7d3.jpg: 416x416 15 Nickels, 8.0ms\n", + "image 125/131 /content/yolov5/Cash-Counter-10/test/images/S21_jpg.rf.adc22c7b16e9945902a4247d7c224d42.jpg: 416x416 19 Dimes, 2 Nickels, 15 Pennys, 8.0ms\n", + "image 126/131 /content/yolov5/Cash-Counter-10/test/images/S23_jpg.rf.199810dc4acf47b8aec37faabaf435c2.jpg: 416x416 18 Dimes, 16 Nickels, 15 Pennys, 8.0ms\n", + "image 127/131 /content/yolov5/Cash-Counter-10/test/images/S23_jpg.rf.fcf4dd0ad67a2d991967bb4660a32ee0.jpg: 416x416 17 Dimes, 16 Nickels, 15 Pennys, 8.0ms\n", + "image 128/131 /content/yolov5/Cash-Counter-10/test/images/S6_jpg.rf.27f7c270e5acfbdf2ea3781fd637ece1.jpg: 416x416 20 Dimes, 8.0ms\n", + "image 129/131 /content/yolov5/Cash-Counter-10/test/images/S7_jpg.rf.d9c51f2dcaa30d794f68354d321b3de0.jpg: 416x416 17 Dimes, 8.0ms\n", + "image 130/131 /content/yolov5/Cash-Counter-10/test/images/S9_jpg.rf.bd96f1160475fd928d87d679c99b9ea9.jpg: 416x416 18 Dimes, 3 Nickels, 8.0ms\n", + "image 131/131 /content/yolov5/Cash-Counter-10/test/images/conveyerBoxes-AdobeStock_193267768_mov-10_jpg.rf.f65b8f806082924cbacd0fa8d78c888c.jpg: 416x416 (no detections), 8.0ms\n", + "Speed: 0.4ms pre-process, 8.7ms inference, 1.2ms NMS per image at shape (1, 3, 416, 416)\n", + "Results saved to \u001b[1mruns/detect/exp3\u001b[0m\n" ] } ], "source": [ - "# when we ran this, we saw .007 second inference time. That is 140 FPS on a TESLA P100!\n", - "# use the best weights!\n", "%cd /content/yolov5/\n", - "!python detect.py --weights runs/train/yolov5s_results/weights/best.pt --img 416 --conf 0.4 --source ../test/images" + "!python detect.py --weights runs/train/yolov5s_results/weights/best.pt --img 416 --conf 0.4 --source Cash-Counter-10/test/images/" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 29, "metadata": { "id": "odKEqYtTgbRc", "vscode": { "languageId": "python" - } + }, + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "41c147c6-53eb-4322-9bdb-d1bb22fe822f" }, - "outputs": [], + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAKAAoADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwDtIdSnm/fz6rfeX/36qxZ6lqtnF5Fj4xkj/wCu3m1jwywf8e/2eWpJof8AlvBPXqHL7I6Sz8V+I5v+Zjtv/RdXP7S8f+VILGe2lj/6beV/8drj5/I8r/SPLohhnh/1E/l/9cpqv2oeyNy8174qfavPsbHTYpPO/wCfOX/Vf9/aP+Ek+I0PmT30Flbf9w2X/wCO1ThvNV6QX0ksn/TapJv7c8rz4PtP/bGasvaB7IuQ+Ntc8r/UabLJ/wBdpYqP+FheKrPy/P8AB0VzH/06ax/8drLN5fnyz/5Bl/5a1HNeGKXyPPiik/540/a1g9kdBZ/FTVobqTz/AAdq0flf8tobyL97/wCRauf8La879/PoetxRy/8ALb91J/7Vrk/Onm6X1tF/11hqSGHzov8AllL/ANcZoq09rWI9nRO8s/iFqs1riD7T+6/1MPkxVqTfEi+mjjg8j9353/PGWvK/O/1f7iX/AL81JZ/2V/r5/wDyD+7q/amX1aiewQ+PL68lj/cRyyRf6nzZpak/4WRrkHmTwQW3/PP9zXjcNpokMv8AoOq6lH/1yvLqOrkOsfYov+P6WKP/AKa6xdU/rIfVj2D/AIW1rn7v7dpVtHJ/06f8tf8AyFVjTfiRceV+/wBK/dy/9Ma8bs7ueGLz4NcuY/8Apt50UlSTalrssUc8Gu30X/bGL/41Wv1oz+rHtkPxInmij/cf6qb/AKaxVoWfxO0q8lknn0OLzPJ/5a3leD/8JV4j0eKPyNVj8v8A55Xdn/rf/ItXP+E21y8/fz/YpJP+2sVafWjL6se8WfjDwr5UcH9leX/0186KWqc3jDwrFfyTwTy+Z/yxhm/dRRf9+pf/AGlXjcPjDxJDFHcGxtv+2OsSy/8AtKrn/Cwp4YpP7V8Kyyf9enlfvf8Av7R9aD6sewWfjyx+3yfYdVubG387y5vN1Lyoq6CbxJ5EVvPP4q+0/wDLOH/TPM/9pV87/wDC1NDmuv8AibaHq8dvF/yxl0eX/wBGxVYvPidYw2vn6VYyy6h/rIbS7026ii8r/pr5UUtHtTP6sfSk3jbXJv8AiVXGuXN95X7yHyZrX/475tV5vFfjHTYo9K+3WUkcv7yG0lh/5a/9dfNlrwfTfHnhXUvLn1WeysbzyfLm/wBb+6/8hRVoTeKtKglkg0rx/wDYf+ePk6l/9trT2gvZ1z2TUtSnvP3+q+FYpbf/AFn7ryoopZf+msUsVZ95D8HdYuo4PH/wr0jVpJYf+XvQYrn/ALa/9Na8303xh4j03S5PsPjiW+/feZ5Wo3nm+VRD8WviNDLH/wATyxuY/J8uG7ihrP2o/Z1zoNS/Zv8A2QvFUtxe/wDCK3ukRxebH9k0+Hyoov8Apr/qv3VY+pfsW/svXml/8SrxVfWUcX7uGX+2PNluv+/taGj/ABauLL/Qf7D83yv+WsM3+tqT/hPLD7BJBb2MsUcv+u/fUeyoi/fHL+Cf2D/A/g/xHp/xA0PxjJqUlrefabPzvsv7ryv+Wsv7qvXPiR4P+I3iqWPSvDf7Rn9ifuYo4YodHik83/v7/qq4e8+JGkzfv/Ilkji/dzedD5tR/wDCbeDpore+g82KSX/XTf2PL+9i/wC2VP2VEFUrnUWfwx/a9s4o7H/hqHTdSt/Ji/13gm1kill83/lr5X/LKuX1nSP+CiNnFJBpXjHwTJHFN5lnNaaPFHLL/wBspYvKrpLPxL4NhiuJtL8R/u/J/wCW0373/tlRo+pT+V5+leOJPM/7CX/kX97R7KiP2jPA5vB/7d2j+I5NV1X4jeJL24lm8z/iXf8AHrF+9/55ReVFXWabr3/BRG8vtPgvtc1aX7V5vkzS/YI4v+/Uv+qr2Ca88cQxRm+1W2vvKm/5bWcVXJvEnjiCKPyNKtvtEU3+hzWln/nzaX1Kj/z8D2jPO/g/N+2XoPii31zxj4/ii0v/AFepadqH+k/uvN/5ZeV+6il/z5VfQHhX4taVNFHB4j1yKWT/AJ7f2b/6Nrh4fHniOC/t7Gfw5ZXNv9j/AH3+mS+bL/01qPUvEv7r+yrHQ5Lb99/rf3X/AD1rWnT9kH8U9QvIINSuref7dZS2/k/8fcP7r/yF5tEP/CHfZfsM0FjexxTfvvNmrzvWNe0Oaw8+Dwr9p/5af8S68qOz/wCEcmsPP/sO5tpP9X++h/1tWZHaal4D+GXiSWSfVfB0f7qb99+5i8qX/nlWPefCX4V6lHHBPpVzYx/8sYYv9G/9q1l2d5Y2cslj/YVz5fk/660/dy+b/wBtZa1LPXtK8qTz59Sto/Oi8n99QBh6l8DfB32rz4NcuYo5f+WMv/7qsvXv2XYJopL6DxjHHb/6yHzrOL/Rf/IX72u4h16eaKP/AIr+58yL/nrD5vm1Jo+sX00sg1XxV5sksPl/6mKSn7KiaKrWPK/+GddcmiuJ4Nc02T/lp/qf3X/kKWsPR/2dfipZ3Xn6HP5X/TK0+1Rf+1a90vNSvtNlkvoL7RP9T5c3+h+XVia8vvssl9Poek3Pm/vYbu0vJYv+2VZ/VqI/rNU8rs9e/bE8Ky29l/wlet/Z4v8AXXc15FLF/wCRYq0Lz9pb9sTw3F/qP7X/AOWnkzabayS/9tf3sVegedfaj5c+q+HNS/df6nytSlkilqS802e8tbeCefUraTzvM8mKbzfKrL6jRNPrNU8z03/goF8RtBl+3eOPhlY21xFN5f8AyDZbGKuk0H/gp94VN1b2Oq+APs1xLD5n/Eu17zf/AGrFXYTaDof2WOG++03Pm/66a7s/3vlVh6l8Jfhzr2q+Rqvhyxubf/WfvbOWs/qJr9ZNiH9vD4c3n+vh1vSf+u3my/8AtWWtTTf2xvgteapJBqvjH/W/67zdNl82L/yFXnepfs0/B29tftEHhyyjk87/AJdP9GlrHs/2afB39s2+lQaTc23lfvP9E1jzf+/v7397WX1KsH1k+iNH/ac+CF5Lbi38caJbR+dL5M015FF/5C82Kuk0f4teDtYl+zweMtNvvNh/1NpqUsv/ALVr5H1j9kuea6kng1XUraOWb/TJZYYpf/IVc/43/ZR8calYRz+G9ctv+Wv7rVof+WtZfUqposTRPviHxhPNa/8AH/H/AN/vK/8AaVEPiqxvP9H+3WUkcv8Az28qX97/AN/a/O/R/gP8d/CsXn/8JHbWVx/06Xktt/21/wBbXQf2l+01oN/9h0rxx4kkj8n9zN/bHmRf9+paz+r1v+fZp7SifeEM04l8/wCxWVzJFL/qv7N/9FeV5tZfiTxVrmm+X9u0P93FN/z2uoq+M7z4zftX6BYf6d44uZZLXyv9Eu9HtZP3v/frzak/4be/aT0GLyL7StEvrfzv9TLo8scsX/fqWo9lXD2qPtvR9e+2xWc0Oq6lHJL/AMsYtStZf/Rv72rMWr5h864n1LzPO8uH/iWxSeV/5Cr5Ds/26viNZ2Edvqvwdtrm386KT91rEsX/AJClrcg/bw0Oe6xrfwr1K2/69JrWX/0bFFS9ka3R9H/2jBMkdlfGPZFN/wAvehS/63/rpVSeaC8uvtEGq21j5X/LpDeSx+bXg/hv9t74EQyyT/2Hq2ifvvMm/wCJP/y1/wC2UtdBpv7cnwP1L/X/ABGuYreWb/W3dndRf+0paxGe8Q6PPeS/bvPtpY5f+eU1SXkM+p/uJ7G5/df8tfOil82vJ4f2lv2etYsJJ7H4jaRFcS/6n7XeReV/5FiqSH45fDmeWOx0nVtNvo5f+W1pqWlxf+jZYpf/ACFQB6h/wjcN7LJBPYyR+b/y1+xxUTWl9BL/AMSOeyijih/fQzTS21Yf9sQalF9usJ4pbz/nt/rfN/79S1oReKfJ0+Xzb64CH/l1I8v/AL9+bFQBcs5vOl/5ay+bD5k3lal5sUVR6lpvkyyCx8OXMccX/PKGKo7PUjLLHYwarHcx/wDTXypf/atRzXlhDdR+f5nmed/qfsf/AMaoAks9NxFHBPPff9vcMsn/ALVqvPp1jDayQ/25bWUfneZN5sMXlf8Aoqs/UofH/wBvtzpU+m23/LWb99LHLL/39qxNrF9NLb2P9q3MUf8Azy/tKKSgCnDnTfM/4mtz5ks3+uhm8qtC70HxFZ2vn6pfSyx+d5n72HzJYv8Apr/raB/ZdkLyCysJJDF/yx/seKX/AL++VVea8t5r/wD4mulW0UcX/LX97FQBYh8KarBNHfefcySf8tpprP8A5ZUXmsarptpJYi+02W3im/1MPm20sX/fquW8eeNr/R7qysfDnhaTUri/121tp/7J1L91axSy/vZZfNrsReTxXLw2/wBpiHk+X+6u7WSOgBIPFOrTabbxQaLbySY/1k2sfvIv+/tXP+EimmmBvtLuZJR/qYRPayf9+/8AlrTPsd99g8iC+k8z/Wed/Zvm1z+vQarCZJ777NFHF/05+V/6KoA6g3llqUkcE9hJGYv+e2my/uv/ACLSReJdKW4jnt5bdPMH7mXyZY4z/wCQqyNCs4JvMvtK1WKWT/lt5OpeX+9/7axUQ6DffZZJ/wC3LmWPzv3P+qk/9q0AbE2sWEOl+Tfa5bXJ/wCeX2yLyqrN4p8LGCSa8uLG4li/dzGKGL/7bXOalpviOGKQT/aZf+u1n+6i/wDIVU7PUrGzik8+xsrmT/WTfuf3VZgXP7Yn8SapcX0E9zFbxTf6H5OpSxRS1X1HUp5rSS4sdVvY5PJ/5ZXkUtYesa9fQWsd9/wgFzJJF5Xk/wBn3kXm/wDkWX91VjTfGFjeRf8AID1uyj/5bQ3f/PX/AK6/6qswPyLh1KCaL9/Yx/8AfmrkOpWPlf8ATSubh8B+OP8Alx1Wyuf+mM37uvSNe/Yt+P3g/RtPvtV1zwl/aF/D5n9iWmsSyXVr/wBdf3Xlf+RaP7So0jt+rVTm/tn/AE3/AO2M01RwzT4/19al5+zH+01ZxYn+H8dzH/0x1i1/+O1jzeCfi3Z6p/Yd98ONXl1D/ljDp0P2mX/yFR9ewlX/AJeGX1asWIJvO/8AttXIZpxLHPBB5Un/AD2i82ub1KbxV4UuvI8VeFdX02T/AJ5ajpsttRZ/ELSv+WF9FJ/0xhmrp9rRM/ZHSQ6x4j839/Pbf67/AJbQ1c/t6+h8v9/H5n/oquf/AOEqsZuPt0nmf9Masf2nBN+/nEdae1QWZuf2xPeRf6d9hl/7c/Lo8n97+4+wx/8AXXzYv/aVY82pQTRf6DB5lB1LyfL/AHFz5f8A0xmp+1MzoIR503/Ll/4GVHeeRNFHix/ef89opqw7PXrGb9/58sUf/Tark15fQn/R54vL/wCmtbAXPOg/1H72KP8A67RUWf7+1k/1kv8Ayz87yZaz/wC0r7/l4gjl/wCuNWLO8/0X/UUASfY/Jl8jz5f9T++86z8uo/O0qHzJ576P/v8AeVRNeT+V5/n/ALuo4byaD/lv+8oAsWesarNFINK1WT/tjN5lEOp315/x/eXL/wBNqpzTed5n27SraT/prLUf2OCb/mFW0cn/AD28mKgDY86eH/UT/u/+u1XIdSvvK8jz/M/661j2dnOZY/38skf/ACx8m8rQs7P3likoA1P7Snhi/wBOsf8AttaTVchvfOtP9B/7/f6ysPOqw3Xnwar5tv8A88ZrOX/0bR9svpYpP39l/wBMYa0Mzch1i+839x5v/XGaGWo5tSnh/wBRBHL5v+uh87/47FWX9s1ya6k8+Cyuf+mMM372rkM0/lfZ57GSKT/nl51AEn9r31nFJ/ZWhyf9cofKrPm8VT+VJB/Yd75cs3m/9cv+/VXJryeGL7EfN/7aw1nwzT2dzyLb/rjNDQAQ/EjSrPVP9BnvbaT/AJbRQ6bLJ+6/66+VVy88eaHr2lyQXGq23ly/8sbuuX8SeG4PElhH5H26x/feZ/xLtSl/exf88q0IbzQ/sEd//ZVzH5X/AD6f/Gqy9rWJ9kdBpvjbSoZI/sOuW0kn+r8mG8rcm/sq88uG+sIpY/8AWeTd2fm1wfkz6x5dv9ulijl/10UtSQ2djDF9hn0PTf8Apj/ocX/o2r9qHsjoNB0Hwd4cluINK0mW2kuppfOltLz7N/6KrUs9Sg8NxefpUGpalJLN5flXd59p8r/v7LXL2UPkxfuLGT/rlFeSxf8AtWi9vL4Rf6DPc23/AG28z/0bT9qHskdx/wAJJYw3UcE8EVt5sP7maGarFn4qvobqOD7dJ9nih/feTeS/uq87vNT1aaWOCfVbm5/57TSwxf8A2qpIdYnEX/Ictv8ArjNpsv8A8do9qHskesWfxC8mW3g/ty9ik87yof31dJZ/ELXfN/0HxVJ/rvLm86GvC7O81yaw8iD7FfR+d/z2liqnrE0/iTS/sXiOx0S9t/8An0u7yX/41Wn1kz+rH0ZZ/ELVYZf+QrbeZ/z2ms6j1j4nT6Da/wBqz65bRR+d++m/1VfM+veG/wC2ItPgg1XxbpEdh+7s4vCevRRRf+RfKrY/tKezsI9D8VQX2v2cX+ph1aztbn/v75Uta/WjP6sfQl58SNVhvvt0Bsb7zYf9b/q/+/tSf8LUvrP7PPcWMnmRf9tK+V/ipD4c8SRR+KYfDfiC91SKaLybTT9ev7Hyv+uX/LKu08H/ABy0q80X7DcX2t21xa/u5odRh8yWL/rr+6op4kPqx75N8ToNStY4LH7N+9m8yb/TPKlrch8eWJsP3H+kyRf67/nrXgcPxO8OeV/p3jG28yKb999rmtf/AI1WP4q+IXwy+J3l6Hofx3j028im/wBd4Y161trr/wC21p9aMvq59Ef8JVpU0UkF9YSeXLN/z5/vf+/tV9T1jQ5vLsdL1WSL/wAhV5n4V1O+0fQbfShqupeJPK/5iEs0Uksv/fr/AONVqf8ACR6V5sc/katYyf6v99DWn1lGfs2dhoOsTw+Xbwa5LFH/AKryvtldR/wmGqw2v7/XJIo/+uPm14Hr3jzx/pt/HY+G/Cum6lZ/6z7X/b3lXP8A36ltf/atdBo/jyDUtGt9VuPKtryKH99afupPKl/7ZU/rKNPZHtFn4k1yaL9/4q/5bf6qrFn4q1U3Uhnvov8Ann++ryP/AITaDMlx/av/ALTrQ03xtOf+Pix/+21p7Uy9mz2SHxj4jhi/1EUlSXniq+u4s33hW2k/7bV5PD4kgvObH91J/wBdqr6x8VND8NX9nBquuX1tcX80UdnD/rf3tHtQ9mz1i88bZl8iDw5HFViDxhBqUUeftP73/XRedXmd54qn823n/tWSOTzv+WsNXIPEniP93PP9mlj/AOmMPm0e1M/ZHYalrGhz6zbwT+Mb62/fS/uZv9VLReeJNDhi+wz6rFJHF/qYfsf/AC1/9q15P4k+LVjpuqahpWq/8S2O1h+03mrXcPlRRf8AXLzar+G/ip4V1K6vJ9K8Yabq15/yx8maKTyv+usUVHtQ9meyTal4cmit57jVba5k8n9zNDDUcM0F5LJffYbH975Uf77/AFsX/bKKvN9H8VYupL7/AJd5f+e03lf9tak03xhpWm/bNV8R3um/Z5f3l5NN/qvN/wCutHtUHs2dpDoPg7+2bixsdKsfM8n/AFXnfvf/AEVRN8LPA+vSyWP9lSxxxf67/Q4q5Pwr8QvB0P8AxNfDkFlc2/8Az92n73/yLVj/AITD7ZLH5EFzLHL/AK60tP3UtY3Q9Snr/wCzH8MvK+3eRLFJFD++i8mX/Vf9sqx9Y/Zj87Srj7D4ql+x+T+5l06by/Kl/wC/VdxZ+JNDhupJ/PvraT/n0/55Vc03xV/bFr5Fx4xvf9T/AKn7Z5f/ALSp+yosv2lc4fR/2dfscUd9Y+OLm+t/Ji8m0lhili82pJv2ddVvIo76x1yLy/O8yaW7s4v3sVdx/bHin/mFeKoo4/8Alt5vlS/+RfKqxpvirVYbr+yr6eLzPsf+tu5opIv+2VH1aiNVK55vefAHxjD5dx4VNtbf89ofJli/79VJZ+Dv2jNB1ST+ytcvbGz/AHX/AB6eJLqOX/0VXpn/AAkmrala/uLe2uZJf+W3ky23lf6qqc3jbVbyX/UfZpIv9dNDNLLFLUfVqJp9ZqnL/wDCwv2r/DV1HB/wlWryx+T/AMtZrW5/9G1JeftFftNabFb/AG397H/z6TeG7WX/ANJK7jR9Y1Waw/4nljfeXF/02ik82gXnhyz/AHEEEtzJL/z1s/8AVUvqNEPrNU5vR/2wPjh9g/07wrZXMf8A2Dbq2/1VWP8Ah4dffb/sPjHwBLH/ANcdYl8qX/v7FXQQ2fhyztY/IuLbzJf9dFdw+XWf/wAU5eSSQX3hyx/e/wDTas/qNEPrrNTR/wBurwBNayaqfAFz+9m/11p9lli/8hV0Gm/tjfB288uefVbm2/c/vvN0eX97L/2ylrl7z4Y+B9eik8/Q7by5f3n+uirn5vgP4HHlz6V4O+zSf9MvK/8AjtZfUjRY09g/4aE+BGsfuNV8Y23mS/8ALaWbyvN/7++bXQWfjzwPqUUf9h+MbH/U/wDLabzf/aVfNev/ALMelf2XJPBrmpWVxL/n/prWH/wzTfWZj8jxx/21u7PzZZay+pVR/WaR9Yal8TvAGg3Wdc8f6JZXkX/LH7ZFF+6/8CqsWfxC8Ha9deR4c+I1jLJdf8sotSikll/9G18V+Nv2XfjHrGlx2P8Abmk6vb+T/qZppY4v+/Xm1nzfsl+ONN/f2/hTzf8Ap7h1iX/0VWf1asae1on3h519DL599Pc/67/ltD+6l/8AIUVF3q9hZX/nT31lLJJ/y1PlR+V/36r5H0Hxh+1R4b/48dKvfLi/5bedF5X/AKNiq5N+118cNBtZIPFfhWOSOL/lldwy/wDx2Wo9kw9qfXH9o62YYxYz/u/3Xk/6Zdf+0qjm1KcXMf8Ap1z5n/Pb+0opP/RtfG8P/BSDw5oN1H/bmlabHJ50v/MSijl/79SxV1Hgn/gpZ8K/FUsmlWOl30Vx/rJprS8ik/8AbqsbM2ufUkP9lQ8/Z45fN/57WdrL/wCiparjR7Gzik8+3j/56fvrOWOKWvH7P9tL4Sal5cF94juYv+eMV3Z//apa6jR/2qPhJ4kljg/4SrRIo/O/5a/u/wDyFLFFR7In2p+ZdnD2gr6A/Z78S6HeeF/I1WDzLyw/d/8AbKvC7OzrqPB326G/kFjqstlcS2cttDdw/wDLLzf+WtfN4nDe1pH0lOr++Ppj/hFTrGjSTz30VtH/AM/c3/LKvP8A4M/Cvx/o/wAQdUvvA/72zuv+Zhu4f3stdx8Dfgz45/4Q2zn+O/jj+1vK/eQxQ/6qvSJvFUFnF/ZXh2CKOOKvN9nRo/Ga89WqHhvwT4V8Bxf2rff6dqkv+uu5v9bWX4q0Hwr42/5DngbSL6P/AKiGmxS/+jar+JNesdBi/tXXL6OKP/ptXnfiT4s6r4k8yx8K/wCjW/8Az2rnqY6tV0OmnhkZ/wATvhv+yT4Vikt9V+Enhu5vJf8AllaaPFF/6KryPWP2b/g7r13JfaV4Hl02OX/oHaldR/8AtWuk17QZ/tUn2795J/rP31dR4Js59Y0b7PD+6kirKpVr0l/ENKVKgeTw/sf+B5po/sPiPxJZf9cbyKX/ANGxVoal+wrrkNr9u8K/Gm9i/c/6rUdHik/9FSxV7hD4b8mL9+fKroPB+paHrEUljY6rFcyWv+u8qjDZli/+fhpUwWF/59nxPr3wN+KnhvzP+Kj0S5ji/wCfvzY//jtV/G3wx+Lfw38ER/EbXPCtte6P5Mv+l6TqXm//AG2vqD4qeA7G8v7ixng/0e6h8vzqsfB//hWWpfDTVPhJPrkl9JYQy3PnS2f7qKvSxudZhhaVOpTOfBZbhMVWqU6h8V6P42/t61/tWx8K639n/wBZ5v8AZsvlUf8AC1PCs3l+RrkUdY/7Y3hv4jabLcarY/E2TVvD9rN5f9n2n7uK1/7ZRV4f4V1m3+1R+T+8/wCWU1etgc2rVjzsTltGifUFn420nUrWMwX32n/ttVz+0oPN/wBRJH/02rxPyYP3dXIft0PMF9JF/wBcpq9f6yjzPqp7JD9hm/199+8oms/P/wBRBF/4GV5XDr3iOH/Ua5c1Yh8YeMYeft0Uv/XaGtPrIfVT1Czmn8r/AE6CX/rjViG8n8vzxPXm+j+NvFV5f+RPY20n/bby63NN8V63qXmf8U5+8i/543laLE0TL2aO4hvJ5ov3/wDrP+u1EN5BD/yw8r/rtXNweKp4Yo4L7wrqUX/bHzakn8eeHIf9fey23/X3DLHT9tRM/ZHSfbPOi/fwfu6P9B/5YW8VY9nr2lalF59jqttJ/wBvlaEM0/lfaLGe5/7ZVrdDsy5N9hml/cXHlyf6v91eVJ9j86L9x/6OrP8Ats8MvkQT/vP+m1R3l75PlwTweVJL/wA8qYEd5o8EN/HB/bksXlf88vKrP8bQ+MYfC9xfeALGxvtUih/cw3cP7qWtSHXr6z/cf2rcyx/88fOqT+2P+W9xB/21imoA5/4b+KviB4k0GO+8VaHFpF5/q5rSauo86f8AeTT2NtLHL/02/e1nzTT3n+oni/641Ys5p4Yv+Wv/AGxoAuXk3/LD+ypf+2Plf/Haji8ib9x5Ev8Azz8mKqc2vT/vIIIJfMqOab/lv5H/AJGoA0JvIhk/f3Ev/bWiGCCa6k/fx/vf+eNZ/nfvf3Gq/wDf797Vj7b+98j90I//AEbQBYmhgs7ryPP8rzasedqvleR59Z8N5B5X+o/d/wDXaKo/tljNNme4l/67UAak15qsN1HPP5dzH/02ovNYghl/07Q4pJP+mNU5tT/5YQX0sv8A12hqP/hJLG8i8+31Wxl8r/XQ+d/qqALlnrGhzS+RPYyx/wDbaXzaBNB+8ME//f6GqcM1jeXXnwT23mf8sZYak1izg1PT/I1WCKWP/nrDN5VAFgzfbJfIg/s2Xyv+WMU0ttUkPkw3X7+C2l/7fKp2cP8AZlpHBY6VF/qfL/4/Kkm/sO8k8+fQ5fM/56/6yWgA/wCEV8KzXX9qz+Fbb7R/yxm8mKWWrHnaVNF58+lS/wDbH91VOGbQ/KkgnsdS8v8A6bTRVzepfD2xmtPI8Dz6tokcv7yaLQ/sEUXm/wDbWKp/eAdpDqWh2f7+3vtWtpIv9d/pl1VyHxJb+VJ/ZWualH/3EvN/9G15n/wrGeG0j+3eP/Fsnlf9RL/41FWpNptjZ/8AMWki8r/ltd+b/wCjZaaq1ifZHeQaxqsNrH/xNbn/ALa+V/5Fi8qtCHx54jh/cYsf9T/z5/vf/Rted/2lP9q/ca5FJH/0ym8qtz+2b6GWPNjcyR/9Mf3tae1M/ZHWf8JJY+b5AgtoriX955vk/wD22tD/AITCD95+4tov+uU0tcH/AGlB5v7if/v9D5dF7ezw8/6qT/ptR7UPZHoH/CSWOpcfaI45P+eMOsS1Xm16eGXz/wC1bmW487y/+Ql/rYq4P+3p4eJ/3f7n/VVH/bEE0UnkT/u5f+eNHtQ9kV/i14w1z4zWsng7VfCury6X/wAtrvULOLyopf8Arl/rf+2tYfwN+LV9oOjah4c8OfA+502Ow/5e7S8il+3yxf8APXyov9b/ANsqsTXl9DfxweRcyW//AFxrQs/PEvnwX0kscUP+pl/5a1l7X98HsjQ0H4qeOPiRLZ+FfEfwk03TdPuppY/O1z/Sf9V/y1+zSxRVy/xC/ZX8OaldWelWM9jpulxTeZNNpOg3X73/AMmpfK/79V2EPiWeGL/TrGSS8i/1M000tR3njYQ2HkX326WT/Web/wA8qd6VX+IHsjyP4h/CX4qfBnRv7D+EkHm291N5k2o6HZy/2na/9MpbmL97XJw/E79r3RpZNK/4SPx19oi/eeTNNfy+VX0x/wALC/s2Lz7fzJZJf3nlTfupZf8AyFWh/wALCsLyKOCCCPy/9XDL53+q/wDRVc3s6XcqyPm/4S/Hj9svXtek0PwP4/vZLz7HL+61zWIpJf8AW/vf3V3X158JfEnxU0HRref4m+IrnW7yWzi87ENrHFFL/wBsv9bXm/jC8vtSsLe+8HX0VleWHmyWcv2OK5lll/6ZebL+6lrH03xV8W7OL7dqviqO9k8n/kH6hpsUcsUv/PXzYpZa6MM/qpjUp+1Poy88dwTS/YTPcxx+T++l+x/6qpNe8VQXlrJY2OqxxR+T5fnXejyy/vf+WtfG954V+KnxC8Rya54x8f6lbRy/6m70nWLq28r/ALZRWtdJ4O+HvxA8HR3GuaX8W9S1K8i/5Btpd+JPtsUvm/8ALX97LFF/39rp+u1TP6sfWEPiTQ4dL/f+XbSed5nkyw+X/n/rlVf/AISrSvtUf9h63Yxxy/vJvJ1L97FL/wDuq8Xh1j4jeMJY/sN9feF47X/j8mtPstzLL/398391/wB+q1Ne8VT3nmeHNDn8vVIofNh87zf9b/yyll8r/llXT9aM/ZHull4w+2XVvBBqtz/0+RedFVi88earFFb2N9fXNzJ5P2n7JFDF5v7r/pl5tfD/AI2+J37TXhuG8nn1b93F+7/tH+x7WOxl/wC/t15v/bX91XaeD/Hnxi1jw5Z6r/wivh++uLqz/wBMu9O8YS232X/tlFFL5X/f2X/VVH14X1Y+rLz4heKvO41WO2jlml8nzrP97/ra0IfFWqwyyefY6bJJL/roprzyoov+mvlV8z6b8WvFV5rMfhyefVopIrP7TN++l8qKX/lr5Xm/6397/wA8q6jTfid4j1K/t559cklt5YfLmtLuz/eyxf8ATWL/AOO1f1oPZHvH/CYaH5Uk99ocskkUPm+TF+88r/yLWWPGEH9qfYZ4P+uPnTeXLF/11/6ZV5PefE6+026tzPYyySed5cM32OWT91/01/55f9taJvi1qs1r599Y/wCj+d9mm8qGX/47R7Uy9mz2zR/id4V+1R6VPf6lbXH+s+yRTSyRf9/a0P8AhNvDnlSTnxjc+X/q/Nm/eV4HZ/E/7ZLb6rfWNtc3EUP/AB96dDL/AM9f+WvlS1Y8YftFaV4btY76eCX/AEryo4fsk0v73/tlFFR7UPZs900H4hfY7/yP+EysZY/+WPmw+bXQQ+MILyXBvtIvpBD5nkww18h6D+2l8JNe8RyeHL6C5ivLrzf9L/s2W2i83/trF/y1r1S88beFdSsP7Un0qW2uP+es3lSf+1aftaI6lI90/ti+HmQQaVbSSRf8sYryo5/sN55nn6Hcx+b+8/c+VLXldn488OQxR2Nv/a0Un/PX7HL/AO0qz4fHngf+3pJ9W8VX0cn+q86azli83/yF/wCjavnMvZnpmseA/B2pRSX3irQ4rm38n/VS6PF5sX/bWuP1P9mn4A+JJvt3iP4c6Rc+b5XkxTabL5taEPir7HFbwaV4/jl+1TRfufO/5ZVY1LxJ4/8A9RpXiOxvY5Zv33/LTyoqWgfvzl9e/ZM+BGvRf8SOylsZP9ZNaaTqX2L/ANFVy837FuhzWElj4O+IHijSP33+tivPtsX/AJF82vSIde8VWcUmh32lW1zefY/M+1+T5lGm+NtU021uIJ/AEtt/12/d/wDtWWp9lRNPaVz5H02H0rqNBs/3Xn5/eVh6bpvky9K7DR7Of/lhXxx9Qe6fCXxTPr3g3+yr6+8v+y//AEVWP4w+PHhzQL+TQvDn+k3n/oqub8H/ALn9xPP5cd1D9mmrh/EnhvVfB+qXEE8HmSWs3/f2vnsbhv3vtD2MFU9qdBqWpeI/G119u1y/kl/6Y10HgPR/Im+wz1H4Jhg1iwjngt/9bXQXl54c8Exf2rrmqxW0cX/PaavEqnrUyn488K+TFHq0EFcnD48sfhvdfbr6wubnzf8AU2lpD5kstesWep6V4w8L/brE+bby/wCpmrg/iFoPjGHwRqkHgC+ksdU8n/Q7u0h/exf9cq7aVP2tE5/4VY8j+M37UXiPwfYf8JV8YtJufD+l+d/xLfD0M0X26/8A/jVd5+yv+054V+OX7/wB4cttIs7WH99af8ta+cY/+CTn7fHxS0S7+JPj/TLaxgji8yW68Wa95cvlf89a4H9i3xJP8K/jdcaVPffu4pv332SbzYpfKl/+2151mn+8PZWHo1qP7uofpJ48037ZYef/AM8q+b/jz4k1X4D3/wDwsbw5NHHHdf8AH553+qr6U8K6lB4k8Oczf6r93NXj/wC078MLH4kfDTVPDk8Hmfuf3Ne/hqdHFYSpTqHg89XC4znpnyl+z7ofxS/a4+J3iHwF4Q0y1vV1MREk/wDLHzf3Wf8A0VXKfFr9gT4xfsseIo/DvxMuLb+0JdH+2/ZLSb/llXD/AAH+KnxN/Zj+OdnqvgfxVc6ReRal9mvPKm8v91/qq6z9tLxt8U9e+Mmn+P8AxT4xvdSvNU02LzpZZvN/1UvlSxf5/wCetc9LEexdqZ2YnBVq1W5H4bMGpaXHP/y0iq5Dpv72s/w3Z6r4P1SPSvEelS232qHzIfN/5axV1E1n+6r7Cl++onydX9zW9mynDZ1J9j9v1qxDZwZqTyPetfZGftGV7OLyZY5812mg2cEP7/8A1vm1y32O49R+Vdj4PvfOtf39HshGpeQcxziD/W1oaPZwfYI/I/dfuasTabBeRRz1cs7PyYs1zezA2Phj4w/4ST4q2/w5+I2labqWn/Y/+JbFd6bFLXpHir4A/B2aLz4PAFjbSf8ATp/o3/oqvN/BPw31zxJ8QdP8R6H/AMfGlw/+1f8AVV7xrH/HhIJv+WVedevSrHpJKrRPn/x58K9C0GX/AIkdxcxf9MotSl/9q+bXgf7QnxI8f/BmW3n0qDzbf/qI/va+lPjbNY2cUd/fa5Lbf9cq+T/2wPGFjeeDY4IL6W58r/lrNXDicTmNHF+z9od1PDYSthPaezJPhL+0J4k+J2vW/hy+0KxtpLqby/tdfSEX7NPxN+wR39jqukSebD5nk+dLF/7Sr4P+Bviq/wBO8W2d9Ywy+ZFNFX6ofDLWJ9S8EafPP/rPJr0qWZYu5xfUqB85+PNN8R/CWwk1zxjodtFbxf667tJvNrz/AE39qL4V6lL5EHji2ik/55Xf7qvoT9q/Tf7S+HOoQeR5n7mvy31j/kaP9R/y+V21MyrUjmp4KlVPvCz8eeFdSEZsb+OWSX/U+TViz8SeHLyL9xfR/wDf7zK+Z4dSnm8OW9jBP5f7n/W+dX1J+wfpuh6z4IuLHxHpVjqUn73/AI+7OKX/AJa0LN6n/PsP7MD9xexd/MqSE+Tz5P8Arf8AptXqnjb4V/Dny/PsfBtlbSf9OkPlf+iq+J/ip8SPH/gn4g3nhzQ9c8qzi/1MU1dqxq9j7Q5fq3772Z9EfY/O/f8Akf8AbGjyZ5vM/wBb/wBMf3NfPej/ALRfxUhi/wBfYy/9sa2NS/aW1zw3pf8Aauq6HbXP/TGL91TWY4Qf1Gse0fY/9X/z0/6ZUfY55pf39ed6x8fv+EbtdLn1XQx/xNIfMh+yTVsWfxa8+1jvv7DufL/67V0LE0Wcvsqp1E2m+dL/AKjzI6j/ALHsTFJ+4i8ysez+LWhzeZ59jcxf9drOrkPxI8HTRf6+KL/rrQqtEPZosfY/9F8jz7n/ALZVHpsN9NL5Bn1Ly4v+Wss0VSQ+JPDl55YgvraX/tt5tXPtmlTS8zxf9sa2uiC5D/a0P/L9JL/0xqnNeTzfv4J4pP8Apl5NH7j/AF8E/m1HPqUEJz+6jpgU7zz/APX+R+7/AOeXk0TTQZ/5axSRVYmmsZoo8+VFVOazuLOXz4NVi8z/AKa/vKADyfOuo/8Aia+ZHF/z2hqSbR/Pij8iGyl/57eTVeGz1WaKOeCDy/8ArjDVj7Z9j8z7RP5n/X3/APaqALEOLO1/0H7Tbf8ATGLUpak+2QeV/pE99L/22/1X/kWqcOpf6LH/AKrzKjmvLHzf3/7qT/tlQBclm+2fuYNcvoo/+eM0MUvlVT1L7cLXz9D8R20v/PaG7s/Niqx+4nij/fyRSf8AXGo+kv7+D/trDDQBn2dn4xmupL6+vtNi/c/ufsk3/wAdrYhg1zyo/wDTraKT/V+TLD5lR/2lBDdeRPP5X/Xb91Vj7ZYzRfv54/LlhqfZgZd5efEa8to4DoekX3lf89dSltvN/wDIUtV59e8Y6b9ogn+DtzfR/wCsh+yalayeb/398qughm/eyef5fl+d/qauQ+RNFHPPBFH5X/Pas/Zgcfe+PL7zY4NV+GXim2/6Yw2cUn/oqWtDTfG1jZxXHn6VrcXlfvf+QPdf/Gq3NThH2rz7H7NJUn2PyZf9RF5f/LHzv+WVHswMfR/G2lalN5H2298z/lj52j3UX/tKrH/CSQWl1GPIjj82b/W+T5Vak1n/AKL+4gil/wDIVV/7H8m1/wCPGLy6kCxNr8+my/v9Vtvs8v8Ay2ivP/ttRzalBN5k9jPbSSRVXOkedLHB5FtLH/zxqxNoNjeeZPfaHbf9dv8AnrXQBc/tKDUo47eCxj8z/njLDUf2yw8rz4IIvM/54/6qs/8A4RXw59lkgn0qOPzZvM/55VT/AOFV+G/Kjgsr7V7Lyv8An01668r/ANG0GZ1lnr3+i+fBPJFJ/wAtvOmllqv/AGlYzxW88GuSxSf88pYYv/jVc3/wr2xs5fPuPFWt/wDXKbUpZP8A2lWpeeFb6HzJ4PGNz/1xl8r97/5Cqf3gvZFibxVY/wDH9P8A6TJ/q4buaz83yv8AplFVPWIbHWIvsM9jpupRyzf6Z/aNnFJ5sX/XKo7yz1WGL/kLeb/z2/6ZVTMP22wj1WCeKWOXzY4Zpof+eUvlVjqa2Ogs9YvofME88Uscs0X7r/llLF/21q5NeTzSyQT2Pm2/k/6rzoq4O8vNKs/38+leZ++/585ZKsTeJNC0yWODVr6S2kl/5Y3f7qWX/v7Ve0MfZHWaDNrlnpcljfT6lcx/vZPtcs1rJ/368r/41Wx/wkmq/Zbef7DJ9o8n/nj5sUsVcfZ6xYWdr9ngvo4v+eP76KiHWIJZfIsdV83yv+W372tPaB7I7CbXvEesWH7jXNSsf33mfufsv/f397FLWX4qh8YwWlvY6V4/1v8A4/IvOu5YbWT7LL/2yii/9G1Tmm1WGKOeyni8uKj+0tcs7+O+vvM+0Sw+XD/qv+/tHtA9kdh/wm19D4St9K8jUopIrP8A4+7Szii82X/nr5X72qfgqGx8LazceJNc0P8AtLxBf/u9S1aXTYopfK/5a/6qKsf/AIS/VYf+XG5jjl/6Y+XRP4qvrOL7dPPc+XL/AM9ofL/7+0fWTP2Z1kOpaVr3ij7fP4jli0+1/wCYTFZ2tt/5Fli83/yLWP488E+I/G0McHwy+NP/AAj9v/y2mtIftst1+9/56+b/APba5eHXoJov+JVYy/vf9daeT5kt1Udn8Tp4fM0PXPA+pReVN+5+1zReV/6N83/yFWvtQ9mbEPwx/ao0e1j0PSv2oZZbfzv+QtN4Vtf9V/39/e/9+v8AtrVjxh4k/bL8B2sY0PVfDfim3tfKjm/4/wCK5v8A/ll5ssXm+VUmm+NtK1m/8/SvM8uKby/K/wBb/wB+q838bfEj406DrNxB4c+GXim+t7qby/O/4TCLyv8A2rR7U09keqaD5Gp+XPBXWadF5MVef/D3WLfy4zXqmgmCaKMwV8/UpnpGho8Nx5X77/WVseNtH/4SrwlHqsEH+kWH7u8/6axVHaWfnSx/v/3kVdRoM39m3Xnz/vbeX/XQ1zVaXtaJrSq+yrHJ/B/w3feb5F9/q6+P/wBvz9pzxx8JfihJ4Vg8HeZ+58yz1DVpvM/79RV9+aDoP/CN6z5EH+rl/eQy/wDTKvmv/grF+zHB8Tvhp/wn+h6V/wATCwh8z9z/AMtf+etfP1cFSPfwuN/emp/wTl+IXjj4hfCWPVfGWqxXPm/8tvOr6Eh87R9UjvoP+WU3mQ1+Zf8AwTN/au8HfBO/vPCvxN8R/YbPzv3Pm/8ATX/7bX6QaP4q0rxr4ct/EehT+bb3UPmQ1x4ao6VWx3ZjTpVaXtKZ8pf8FT/2yv2sxP8A8Kz1T4hi28KapD5U1rp0HlGX/rrLV3/gnBr3wW8E/AfWPib8afg7pttZ2FnL/wAVDqP/AC1rrP8AgoF8B4Pi18G7i+sYP+Jha/vIZa/OP4wfHj4xeJPhVp/wk1XxHJF4fsP+YdDD5fmyxf8APWtMThr1RYXGJYT2Z+nn7JX7UXwr+M11qkHgDSr62j+2SyeTdzV6pr2j/bJZP+ecv+ur8o/+CbPiT4t/D34vxzweDvEEmn3X+uu/7Nl8r/pl+9r9YLy8/tLRo76D/njWmC/2Wqc+N/erQ+J/ip/wS1/aT+MHxV1DxH8KvCtj/Zcv7ya71C88qLza5/8AbY/ZF+MXwl+Delz+P7H7deWs0Uk2o6T5ssUX7rypf/aVfcE/7WnxG+Cmgf8AFK/CvTfFHlTf8emrTS/uq5v9rr/godfeG/hVZ6t4j+DuiXMd1+8vPD3+q+y/89f3tGNpUqVb+IaYbMsVV9nTdM/NfSPHnirxhp+n6r4j1yW9uNL/ANC82b/nl/yyr0zTZvtlrHN/z1r2D9qH9pv9mzWP2c9L8HfBf9m3SdAvPFt5F/aWrHyvNEsUXmxf9tZf9V5teH/De7/tLS5LGH/llX0mU1fa0fZni5sqVXF+0pmpDD+9/wCmdWIbPzqsQ6b+9qxDZ+TXtHkFeGzMv/Letjwf+51TyP8AW1T8j3q5ps3kX8c//LSgDuNH02eaXyDWpoUH/LCc0aPN/q5/+etbmm6ZBNqkdc9SmB1HgObSvDV1/auq+ZFZ/wDLbyq9Am1ix16W8nsf+Pfzpa4/TdH+22FxpVx/y1h8usv4A6lfQ6fqnhzVZ5PtFhqUv+u/6a14mMuqx6+C/gnnf7bE2q6d8NLy+0P/AI+IoZa/PvWfi1rniS18jXLGOWOv04/aQ8N/294I1Sx8j/lj5lfk3qVn/YOs3mhzwSf6LeSx1lmK/h1D1sop+29pTOo8K/EjSvCt19uGh/8Afqv00/ZL8eQfEL4S2+qwV+T/AO6r9DP+CY/iT+0vhVJpXn/6qH/0VXFTqfvjtzHBeyo/uz2D48Qn/hDdQ/641+WfiTR9Dm8b3nn6r5flXksdfqx8WrM3nhfUIP8Apzlr8n/jBpsGm/EvXLHyP+XyvSxNT91TqHk4Gn7WrUpnrHhXUvA40uOxvr+2/wC/1fUH7E15pXlXEGlTxeX53/Pavze8k/8ATWvqn/gmD4kvofG95pU99LJH53/LX/rlXFTqv2x3VMN7KifeHir/AI8P3Ffn/wDtFeD57z4vXE//AD1hr748RzedYV+d/wC3J428VeCfi1H/AGHP+7l82vW/5gDxPZf7WR6b4Jn/AOe9Z/xI0fGgyYni/dV5vD+0V4/H+vgtpKNS+PF9rFr9h1XQov8AtjXD7Q9L2bPcPiCPtnhfwXff9Q3/AONV2mgw/wDEht/+uNcn4kvINY+F/g++gg8qP7HXeeGof+KXt8f88a9fDfwjwKn8Yr+R70eT+9rQ+x/uutRzaZ2zWvszEp/Y4P8Alv5VRiz7Qf8AkGtDUtNg8rz54P3kVRw2f72i7A2PCujwXlh/p09z/wCBktdRpvgPQ/tUf9q65qVtZ/8ALb7JN/8AHaPB+mQfZY/3H+q/eVqeKv3PhLUNV/5Z0qjrBZGH4k8OaHDdf8Ud4q1L7P8A9RaGKX/41Wef+ErJ8iDVbb/tt5sVRw6l51rWfqU32yKSCeeuf61WOlYaiXJpvEejmP8A4lVjc/8ATWG8rn7z48+HNH1X+ytc/tKyk8n/AFX+ti/9G1w/irRp9NuvPsfFVzFH/wBdq8z8Vaxffb5PPvpLn/ptXRhsTWq1fZnNiafsj6Qs/jn8OZvLg/4T+KKT/pt/y1/7+1qab488OTzRwWPiqyljlm/fV8d6lCbz9/XP3gnh/f16X704z74s9ZsJf9ffWMv/AE2rQ86x/dweRbfuv+m3l18B+G9N+Jniq7jsfA8Gt31xL/yx0/zZK+rP2df+Ccv/AAUD+JH2e+1XXLnwtp8v/LbVpvMl/wC/VZ1Kvsi6dL2p6Z5OlTCT/R/3n/Xaq/k2Pm+R5Evl/wDLavpD4Y/8EqBpulxweP8A4xeJNSvP+W13p/lW3/tKWtzWP+CWnhWzi+36V+0Lq1l/2FtNtbn/ANFeVXN/aFI0+rVj5LghsZrr9xPJHH/z18nzKufuPKk8i+/9pV7B4q/YV8R6DL/xTnx+0TUv+vvQbq2/9qy15f4w+GPxU+Ho8i+1zQL3yv8AoHal/wDHYq0+vUSPq1Yz/J/eyT/2rFLJF+7/AOPyrkPn+b+4vo/+2U1cnqXjbxVpt/8Av9Kk8v8A5bfvopP/AGrVjTfiF/aU37+x/wC/ujy1qsTRF7KsdBeQ+KvKyNck8v8A6a1T1LxV450G1jPkebH/AKqbyrPzP/atZf8Awnmh+bJBfT2Mf77/AJbQ+VVj/hJPDl5dfuPsUUf/AGEv3stCqpkWZuaZ4k1aaWSDVYLG95/ffufLrQOsed/qNK8vyv8Alt9s/wBb/wCQqx7PUvDl55fkX0sUn/X55tWPOghl/cX0nmf9dv3VdV0BY/tjXIf+YVHL/wBcrytSaaaaL/jx/wC2P2zypf8A0VWXZ3nnRef9vkk/67Q//aquQ/ufLz/rP9X/AKmKndGZchvP+fi3/wCmn+u82o/tn2sx/wD2qq/nCaX/AI/o4vK/6Y1X/f8A/TKWT/rjQBcm1Oxhl8if/wAjQ1Ths9D0e18ixvoraOL/AFMXk1HNNfQ+ZP8Auv8Av9R5M0P+vgi/ezf89qmoaEnnef8A/HoqsQwwed9unt/Nk8ny4f3FUzZwWf7ix8yL/pl5NWLOb/nvBJ/35/1VYgaEP7mKSHzpP+enkxXnl1Xh/sq8l+zz/aZPN/efvYarw+Rn9xfSx/8ATKKpJvsM0UfkX0sn77/lr/yyoAJtB8Ky2scE9jHJ/wBdtHi/+NUQ+G/DkP7j91bW8X+p8mH7N/6Ko8mCGLyDPH+6m/5bfvKIbyeHnyPL/wCuX7qgCSHQbK8/1/iO5/7Y6lL/APHakm0G+vP3/wDblzbf88ZvO8ypIZ4JvL+3Qeb/ANtqB/ZQi/0iCL/rt5NAGXD4P+x6XJ5+q3skn/Lb9za//ItR/wBj30N/9ug8R3Nzb/8ATWHzZYq0IoYIbWSD+1bny/8Alj++8qo9N0eez+0Twa7c30ks3mfvpopfKoAJofEflfaP+Eqil/6+7P8A+21T+2a5D+41XVdJkt7r/lt9jl/+O1qfY76eWSeC4k8v/ljD5MVV5oL6zh8ibSrKWPzv9dNZy0Ghy/wx16ezuvsM9fQHwx1iC8i+w3FfK9neTwyxz2/+sir2j4Y+KvOit76CesKtI0PoSzs/9XP5FaEP7qsvwrrEGsaZHPWxBjyv3FcwFzQb2+1Kwkt54JPtFh+8h/65VuTabY/ELwleeHNVg/d3UPl1j6bNPZ3XnwVqQ3k+g38fkD93dfvIa8zG4Y7cNVPxX/bw/Z1vvgn8btQ0LyPL0+6m+02f/wAar7g/4JU/tCf8LC+FX/CAarP/AKZYfu66D/gq5+zrB8VfhfJ4/wBDsfM1Cw/0n9zX55/scfHjVfgP8fdPuPP8uzv5vLmryatNL3D3KdQ/ZDWNNg1PS7jQ76D93dQ+XXyfZ/8ABKn40zePNU+NXwy8R+EvMtbz7bpuk65+982WvqjTdYsfFeg2euaVcebHdQ+ZDXh/7XVn8RvAcVv8cPgrrn9m6xpf7yb9z5sV1F/y1ilio/i4Qy/hVv3Zj/B//gqr+0n4b1DUPDvx+8K6BY/2D5tvNpOn+G/K8rypf+mv72vaPhl+0h4O/actbzxj4Og8u3lm/wBVNX5z/taf8FILH4/eCLjwr4q+EllpvjCL93/bmnTfuv8ArrF/y1/7Zfva0P8Agkj8bL7wf4kuPAGq33+j3U3mQ+bXFTp2/eM6alSi/wB2foZr2gjzbj9x5nm1+d/7dXjbx/4q8Zf8Kr8OeB9XuY4pvL820hll83/nlX6WalxF5/kVw/7SH/BQ7wP+xz8L49Ksf2e7bW9QuvKjm1CWGKKKvR9lRxfs6h51Ruj7h+c/7S15B4J+HPg/wP58n9qRTRXs0X/PLyovK/8AjtbHw91+Gzu7fXYP3dnqkPmVJ428bfs5/tga/ceKvFXiP/hDfEl1/wAsbub91/1y83/Vf+iq2NA/Zj8f6F8Pryxgv7bW7Ow/0mzu9O/59f8AP/PLza6ctqfVMX+8FjaXtaPtKZ2EN5BN/qB5tSD+CsPwHeQXmgx/89K3IYZ+tfXKnc8Ak8qb0qM2fk3Xn+fVjyenkVJ9j9v1rT2YHYeD9StxaxwT33mSV6BpsP8ApVv5FeX+CfIhus/u69Y0GGD+y46zqUwOw8NweTfx+fcVhw2f/CK/Hi8gP/HvrNn5v/bWKuw8N2Z8qO+rH+PFl/Zt14b8Ywf6u1vPLml/6ZS15GNpfujtwVT98V/iDpv9pWFxAP8AlrD5VfmX8Zv2e/iNqXxa1j/hFfCstzHLN5lfqBr3761rm/7H8K6Ddf24YLb7RL/z2rzcT/uh62Gq1cLi/wB2fkX4p0fXPBN//ZXiuxktrj/nlNX2B/wSp8ST/arzSv3vl+dLXlf/AAUg02Cb4jR659hiij/6Y16J/wAEzfFXk3X2HyI/+uteZSPTxONrVqXsz7Y8bQ/bLDyM/wDLHy6/Kv8Aau03+x/jTqEHkf63ypK/VjWJv3Vfm3/wUz0H+x/iDb65YweV5tenVp+1wh5mGxP1XFng/wBs9/0r3j/gnjr0Fn8aZLH/AJ6+VXkfwZ8N+HPFUUn/AAkc8n/bKvdP2YvAfhXwr8X7fVdK1WT/AFP+pripU7M9ermNGrR9mffmvf8AHj+Ffnn/AMFH7L7H8QbOfyP+etfoRqV5/oHNfFf/AAUg8B6r4k8R6WdDg82SWb/2lXpK7wlQ+fp1fZYumfGfn+1HnQeVXvnwl/4Js/tQ/GC/jg0PwdLFby/8tpa+3PgD/wAEQvhX8N7W38VftGeKor64/wBZ9krhp4aqenUxtGmfKdn583wH8Jz/APXL/wBFV6h4Oh87wvb/APXGu0/b88H/AAr8E2Gh6F8K9KittPtbyWP91XJ+A/8AkV7f6V9Bgqf7k+fxNX98E0ObWTyKJof3OfI82tCaHMUlH2P911roOYrzWcBtfPqn5Pky1qalMIbCPj/W1XsrP7HLHBR7Ngdh4Js7f/j4/eeZLDVz4qf6H8KpP+vyKpPCum+dD5Hn/wDLGvN/+CkHjbVfh7+zdpc+hT/Zri/1jy/OrmxP8I1p61zl9Y+J3hXwfYefquuW0deT+Nv20vDlpdeRodjJc/8ATWvnOG88Y+PNU+w2EF9qV5L/AMsYYfMr6M/Z7/4JFfts/tCfZ76x+GUuiafL/wAxHW/3deQesqfsvjODm+Nn/CyNZ+wzz3Mf/TGtSz8K+KvFV/HpXg7Q76+uP+eNpD5tfpB+yv8A8G7vgDwHdR+I/jT4/udbvP8Altaad+7ir7g+Ff7KPwI+A9h5Pg7wPpum+V/y28n97XfhsT9VOHEU/bVT8f8A4J/8Er/2tvjB5d9P4O/4R+zl/wCXvVv3f/kKvrj4G/8ABCX4V6BdR6r8W/Edz4guP+W1pF+7tq+5Ne+J3w58K83F9FcyV5/4w/aot4f3Gh2PlUqmJrVTP6tSpGx8N/2XfgR8DbCOx8H+B9J0iOL/AJ5Wf72tjXviR4A8H2v7jy5ZK8D8VfHLXNS8ye+vpK838SfEi+vJf3E8sn/XauG7NaSPbPiF+1pPD5kGh/uv+m1eP69+0hqupX8k/iTXfLji/wCm1eZ69LqusRf6drkscf8A0y/dVy802h+G7r7dBYxyf9NZf3tP2hp7M9E8V/tCedayQaFpV9cyd68T+JGr+KvEl/8Ab9dvrLTY/wDnl/rap+MPj/BZ3Un2GCOvP9Y8SeMfiFqnnwWNz/2yrL2jNfZGxr3jCDR7X/R765uf/IdZ/hXx54x83z4PLit/+ePk1oeGvgn4jvJft3iO+jjjrvPDfgTwro8sk888d9+5/wBTFDQM5v8A4qLWLWSeef8Ad+TUkPhWxh0v+3NVgtvs/k+Z++rrJvBPjHXrr/iVWP2KOub+PHgm++G/w0k1XVdck+0XU3lww1FJu5nZHz/ea94j1LxRJBod9c20cs37nyZq9Y02z1Wz/wBI/tS+/wCu32yWvP8A4QeG/wC2PFEmqz/6u1h8yvXJtNnm8v8AcV7VJux55Xh1LxjZxfuPFV7/ANMfN8qrn/CYeOP+grHL/wBudE0P72o5ofJik88fu62uwJP+E88RzS/YYLC2k8qH/XfvYqsQ/EPxHZ/uJ9K/79XlZ+mw339l+fBBHLJdTebN53/LKrEFnPNFH5/+s/5bVaq1jP2Rch+JE8Mv+naTe/8APSHyYa1NN8YareWHn/2VqUUf/LaWGzlrP03R59Sv44P+es3l19CeA/hjrmm6XHBBqsttHL+8miih/e1lUxNY0pU6J43Z+MPDmZIJ9Vk8yL/ntNWhZ6lBeeXPBqv7v/tlXvln8GfDnm/br7Svttx/z2u/3tWP+FD/AAy1KX/ia/DLRJP+ms2jxU6WJqmdSkeBw6/Y+b+41yx8yX/U+dN/9tqx/rv+faWvdLz9kr4LalLmfw5LbR+T/wAumpXUf/oqWqf/AAxP8JP+XDXPEFt5v/PpqX/x2Kun6yjL2aPD4YbHyv8Alr5n/PWGarFneT2flz+fHFXrGpfsK6VZ/wDID+JurfaP+ojZxXP/AMaqvD+xn45hik/sL4m6bJcRf8srvR5Y/wD2rR7Rj9mjzeG8vpYvP+w2X/f6o5tSghi/f6H/AKr/AJ9Jq6zUv2Pv2k/N8jSvFWgXtv8A88rS8lil/wDIsVZd5+zf+1Fppk8/4ZfbreX/AF0sN5ayy/8Ao2tfagZf9sQzRfuLG5/1NRzTWOfIM8sdx/zymhrUm+GPxU0fT5IL74LeKY/+uWgyyf8AoqsvUv8AiWxRwa5per6b5X/P3pssflf9/aPagWIYfJ/cTz/+QfLqSDyPK8j+1fL/AOmXnVl6PNoXm/8AIVtpI5asTeR5UnkTxy1QHk8P+p/Cuo+Huvf2bf8AkZ/dy1y0P+u/GrMP7mWMV0AfVHwr8VfvY4J/9XLXrFnZ/vfPh/1dfK/wx8YecY4Jp/3kVfSHw38SQalYRwTz1wVKZodZDZ/vcf8ALOtibTZ9Y0aSy/5eLX95Z1X00CeXyKuQzfY5vPrmq0vahSqHL3um2PjDwvceHL7/AJaw+VX43/t4fAG++Bvxk1Cxt4PKs7qb7bps0P8Ayyr9nPGEM+g3X9q6V/q7qvk//gpx+z3/AMLa+Df/AAnGlWP/ABNLCH7T+6h/7+xV4mJpeyZ61Kpcj/4Jj/tFf8La+DcfhXVZ/wDiYaXD/wDva+hPGGgweKvDl5oX/PWH9zX5l/8ABLzWNc8K/GSQ/wBq+Xp//PH/AKa1+nhvIJoo76D/AFctcNKpSpYs7qlOr7I/Ev8Aac+EvjHwT+0tqHgeDSv9Hlm8yz/65V9YfAz4e+FfhX4Ds9cOlf8AE0i/eXk1esftmfA3Q5vHmn/FSex8zyv9dN/0yrwv9or4taV4J8LyeFdKn/0yWubMfa+29hTDDVP3XtKh+gHwl8bQePPh9Z30E/mSeT5c01eX/ts/B+D4qfBvUNK/5eIof3Mv/oqvI/8Agl38cp9Y0a48D6pqvmyRfu/33/kKvrDxJZwala3GlT/6u6h8uu3BXpVfZsyxNq1L2h+Ld5oOuabdSQTzx+ZFN5c1eyfsT/tU6r+zr8QfsN9B9p0fVJoo5oZpv3UUv/PWqf7YHwxn+HvxpvIPI8q3v5vMh/8AateT6lD5PlzwVrjKdmGHqaezPsjR/IsvFuoWMFj9mt5Zpbmzh/55RVuTefXn/gnxV/wmPw98P+P4P+Pi1/0a8r0Szm+22sc5r63LantcIeDiqTo1yTyPepPJ8qo4O9WK7zmLmg3nlX8Z8ivXPh7efbZY/wB/+7lrxv8A1Mvn16R8N9S8mWPyJ/8AltQB7h4bh/0CS3nn/wBVVz4heHP+Eq+F+oaVB+9kih8yGs/wpN5119n+z+b5tdpo9p50VxY5i8uX/ntXl1aWhpSqanj+j6z/AGx4Ss77/nrZxSVw/wATvsP2CPz/ADI/+m0M1dpptn/YN1qnhWf/AJcNSl/79S/vf/atcf8AE6axstG+3arYy3McX/LGGvAp/wAKpTPfn0qHxX+3Vo+h/wBlx31jPJJJ/wBNaj/4Jv3s/wDwl3kfbo4v+mNdZ+2BrHgDxV4Ik/sPQ7m2kihl/wCWNeF/si69PoPxLs/s8/lfvq4qRpPY/VDWLzztPjnr4f8A+CqHhWebRrPXIIP9VNX2Ro+pfbPCVv8Av/Mk8mvH/wBsD9m/4jftFeA7fw58OdK+03HnRV6NL97RqUznq/xqZ8B/s96l5PmQeRX0h8E7PVbzxlZ31j4cl/df66WGGvdP2Pv+CLd98PfL8R/HfxVFF/y0+yV9YTf8MvfAHw5caH4N0O2kuJYf9b5PmVmsP/z8M/rGv7s8bvLyc6Dn/lp5Nbnwlh+AOv8A/FVfFv7NLeWE3+pu65PXteg1i61C+g/1cvmy18f/ABm8e6r/AMLM+wwX/wC786L91Xbh7GOM3P0U8VftyeDtHi/sP4SaHFFbxfu/Nh/dV4/48+Nnj/xt5k+t+I5f+uMVeF/D3WL68ij8/wD1ddxNefuq5sTVNcNTucf8ftYn1Lw5Z2M8H+qvP9bVzwJ/yKNvWP8AFq8gvNMjtxP+8imrY+GMPneF44P+Wdenl38E5cZ/GNSGHzrWSpIYf3VWIbPzrWSCo7Oz8qLyK9L2Zxle+/48DUemwzTRRm4/1lXPsf7qTFWIYfOu4/3FHswOw0ezgs7WT/npLXrHg/8A4J+/DL9uvRrfSvi3fXsel6DefafslpN5Xmy15vo9mftUcFfUn7N/xIn+GPgjVIIIP3l1N+5rzccdOG2PRPgn+wf+yT+zTYRweAPhXoljJF/y9zWfmy13msfEjwP4bi8iCeKTyv8AljXgfir42eI9Ylk+3XtcPqWvX2pHz76+lryzt/enunjH9pyDTf3GleXHXlfjD45eKtf/ANRcf9/q4fU9YsIYv3H+srl/+ElvppfsP7r/AK7VHtQ9mdBr/irzh599fSyyVz+pa7fXkX7i/iijrm9Y1KCGWQarfVj/ANsX8MX7mx/d1l7Sua+yOg1L/W/bvt0v7r/llWXe+KreGKTz/KrLhh879/far/2xhqnNpv73yND0PzZP+es1Z+zNSvr3iq/1KL/iVQS/vf8ApjWH/wAIFP4k8z+3Nc8qP/nlDXeab8PfFWpRZ1Wus8N/B+xs/wDj4/e/9da0MzwM/BPwrZ3Xn2OlSXP/AF1ruPCvw3vofL+w6HFH/wBdoa9kh8H6HDF5EEEXmVchs7HTf3H7qgDzez+D8+pf8hz97W5o/wAPfDmgxfuLGL/vzXYedB/r55/KrPm1iDTbrz/t0UtZgR2em2EP7iCD95Xyn+354q/tLxRZ+DoP9XYQ+ZN/11r6Y8SfE3Q9H8z/AImsUUn/ADxr4r+M15fePPihJB5/mSXV5WuGpP2xjUqfuTU+CfhWfR/Dn26f/WXX7yu4hh/eyfuKsabpsGm6XHbwf8sofLq59j/5d/6V76pHmmP5U3pRqVn50selQQf62tj7F/0xos7OCeSSf/nl+7oApwmDyvI8j/Vf66o4bPzpfPrY+x/uutWLOz86XyPIoA6j4A/Df/hKvFsc/wDyztf3k1fTkOj/AGPjyJP+mNYf7NPwr/sLwT/atxB5dxfzeZ/2yr1Cz8N6rDa+QYI/MrL2aAx7PR5vK/cWMfmVJN4Pvpov389dhpugar5X7/8A1dSf2PBZ3XkefLc+b/yyp+zQHN2em6r53kfYYvL/AOe0taH9kX80Mf8Ax7ReV/y2rU/sfyZf+edvF/02rQs7OD7L+4g8ytAObm0fyIvP8+PzKjs9HH2ri+j8yukvNB87/lh5VFnZWNnHJPPcReXF/rv+WVBmR2Wm2P7v9x+8q5FD+9/1Efl1HDr3hyW1+3edF5f/AD1m/d1lzfEjw5NdSWOleZfXEX/LG0h8ygDYsrP/AJ4T/wDXapDDBDF/r5ZP+21Yc2seP9SuvsOk+DoraP8A57Xd5/8AGq1IbPP7ie+/eRf67yYaAMe80ex1i7k/tzwppv2f/p7s/M82sPWPgD8Ade8yfVfg74b8z/p00eKOX/v7FXcf2RpX7uec+bJ/02qvqU0Gmnz73Vfs0f8A02ouB+Tf/Tv+lSQzVXhzNF/r6khmr1ANjw3r0+j38c/n19CfCXxt5N1bz+fXzWPIh/f4ruPhl4k8mWOx8+OOsalMD7s0G8t9StY76tTyf3nnZryf4G+PLeaOPQ55/wDrjXsFn++/f1ygV9Zs4NS0uTSv+Wn+shrz+8s4PFWjXnhXVf8AlrD5fky16Z9j/e/6+uD+IWmnR9Zj8SWMH7uWb99/0yrmxNK5phqp+Rf7TnhXxV+yL+0PqE/hyCW2s7qb7Tpv/PKvuT9hX9oSD42fCSOe+n/0y1/5ZVzf/BTj4AwfGD4VSeMdDsfN1Cw/eQ+VXzv/AME09Y1z4e69Jcat5n2e6/1MNfOYml7Jnv4ar7VH6CfE74S+KviR4DuILHwdqVz+5/czRWcsvm1+Yfxg/Y5/a9vfG95BP8AfG17HFN5cN3F4VupYpYv+/VfvJ8B9Sgm+Euhzi4/d/Y/9b/21rqPO0qb/AJb+b/0yr6OlltGrRp1D5ermVWjWqUz8E/2V/gb+1v8ABn4qWeqz/s9eO47OX/XTf8Irdf8Axqv00s/Cvj/XtGt76DwBrfmSwxSeV/Zsv7qvrjzoJov39EMPkf8ATOSnUyWjUre0NKef1vY+z9mflP8A8FFP2LfjT8SNBt/FXgf4O+JNS1C1m8zytO0eWSX/AKa18fw/sK/tl3lpJbn9lf4hy/8Acn3X/wAar+hib7R5X+o/d1Xhh8n9/wCf+7/54+TXRUymlVOelnVakz8S/wBlf9lf9q/QLXVPA/jH9mzx3ZWd1+8s5rvwrdRfvf8Av1Xsnhv9l39pOHS/IvvgR4piki/566PLX6qTQ+dL+4gj/wDjVHkzzS104LBfVRYnMauLPy/h/Zd/aMmm/wCSO6//AOC2Wrn/AAy7+0LDD/yR3X//AAW1+lksPk9f9Z/zyomhm/4+IP8A0d/qq6zi+sn5pw/sx/H7H/JJNb/8A66Twf8AAD476b/x/fCvW4v+3Ov0E8n91/0z/wCW1EP7n/prHWgfWT5f8E/D34jRWEc994H1KOT/AKa2ddpZ+FfFVnJ/yLl9/wCAde2Qwz4/1FF5D50vWuX2Zp9dZ8p/FT4S/ECHx7Jquh+B9Wube/s4pPOtNNll/e/5lrj9S+FfxUmsLj/i2XiDy/8AsDy19oTzfvf9I8yiaaeb/UT1xf2bRdX2h1LN6vsvZn5h/Fr4D/Hfxh4NvND/AOGevFslx/yx/wCKbuv/AI1Xi/7KP/BJ39rbUviDb654q+HNzomnxTf8xaHyq/aSezmvP9fPHUf2Ob/nuay/sWidCz6t/wA+z4z1j4A/FTwf5fhyx8DatfRxQ/66002WSKs/wr4w/aF+Cfmf2V8CPFupeb/qfJ8N3Uv/ALSr7c8n915//kGpPJ8mX/Ufu60pZb7I5qmb1qp8L6l4k/a++JF1JPqvwk8ZW0cv/LGHw3df/Gq5PxJ8Mfjv5vPwI8bSSf8APWHw3df/ABqv0cxb/wDHx2/640eVBNF+483/AK5U6uVUqppSzurS/wCXZ+W+p/Cv9q/rpfwB8bf9tvDd1Xmc37B/7TWveMv+Eq1X4H+LfMl/57aPLX7KTQ/uv3FR/Y55TRSymlSHUzerV/5dn5Z6P+yj+0Zo9r+4+B+v/wDgHXD69420LUvDl5BpWqyRXkUP7mGv2A/sfMv7iub+A/8AwTO/Ze+CdrHqv/CNx6neS/vJrvVv3lcONwVKkd2BxvtT8M/h78N/2k7zxRqnxN8Y+Fdb/wCEXi/dw6hd2fl2tfQHw3h/4pKPNfpZ/wAFUP8AhALT9i3XPCuifYo5IprWSGG0h/6a1+a/wr/5FzyK6cu/gmWJNizh/def/q5KsQd6kh/5aUQ/va9g5yv5PnRSfuKsabD+9jqSDvVjR4R/akf/ADzoA7zw3DB/alvj/WV65509no3kQz+VXmfgPTZ7zXrf9/8Au67DxJNNZ69JY3F95scVeDmx2YL+MR6lqf2PzJ555bmT/ptVOa8vpov+utE2pW83mefVOXU59R/cWMEteCewY/jC81WGWODSp/3lWNOs7GH/AF/7yStjTfh7qs0v26e48v0roNN8E2MP7+eD/v7QB5frGj6rqV//AKDB5sdXLP4YarecT/u69U/sHSv+WEH/AH6omh8mXyIIPLj/AOetaGZ5/pvwfsdNl8/yPMrqIfCthZxf6iKtSaaxh/189Y+seNtD0fieeKKT/ptQBJZ2dx5v/Hj/ANtpqkmmsYf+W/7z/plXnfiT45TzapHoeh+HL7UriX/U+VD+6qxZ6D8VPFUUfn+XpMf/ADx/1stbeyZj7Q6zWPG2haZF+/njjrh9Y+M3hz94bHVftMn/ADxtIfNq5/wz3pV5L9u8ceI7m5j/AOnubyq1NNs/hz4Phk0rwB4Vkvbj/njp9nWn1Yz+snH/APCV+Ptel8jSvDkscf8Az1u6uab8JfGPiS68/wASeMZfL/59LSGvSPCvhvxjrEXn63pMem/9MfO82Wu00HwfBCPIgg/ef9Na6KWGMvanz38Wvh74O+GPgSS+sbGL+0Jf+W0372Wvl/4ZaDfeJPHl5rk/+rta+kP2/fG39my/8I3B/wAusPl/9ta8n+Cfhv8As3wb9un/ANZdTeZWuGp/vTOpU/cnSfY/3XWpPI96sWcM80XSrH2PzuK9E5jP/wCWf7/HWrkOmiG1jg/5aUeT5115Hkf6qtDyfKoApww/vf8AUV1Hwl8Hz+I/FFvBBpVzfRxTfvobT/W1hw2Xk/8AXSWvrD9jP4VjQdAuPGM/7u4uv3cNZ1NzQ6iz034q3lhb2PhzwrpugW/+r83UJvNl/wC/Vbng/wCG/irR/wDia+I/HFzqVxL/AMsvJ8qKL/tlXYQwwWcX+nT+bJ/01qvL4q0OH9xPqv8A2xhrnMyPUofJi8iC+oh+w2cUfkf8tf8AnjDR9j1bWP8Ajx0O5/67Xf7qpP8AhD9c8ryJ76KP/plDWgFe8msZuL+Dzaz/AO2bezl8iCfzP+vStgfD3Q/N8++n+0yS/wDPaatCHQdK0228ix8uKOgDDhm1XUv3FjpX/bWWao/+EPvdYtZIJ9Vltv8Arj+6qx4q+Knw58E2v/E88Y2Nj/0x86vJ/FX7bvw502X7D4O0q91a4/6Yw1nz0TT2R6pD8PfCsP8Ax/WEdzJ/09/vKuf8SnTbX/llbR1853vx4/aZ+IUvkeDvA8WiW8v/AC2u6y7z4M/E3xgPt/xN+LdzL5v+utLSaj2iD2Z7Z42+P3wk8BiT+3fGNl9oi/5YwzebLXlesftsX2sXUlj4A+H99e/88ZZoaz9H+DPwd8Hy+fcaV9uk/wCnuatS8+J3hzw1F5GlfZraP/njaQ0XrGi9ic/e+PP2vfG0v+g/8SS3l/6YxRVj6l8B/FXiQ+f8TfjFe3P/AExim8yrmsfHKx/57+b/ANtq5vUvi158UkEF9HWVR0rGlj4b+A/xOn+IXgjT9VvoPs1xLD++hrvP+Wtcmfhv8Mv2ab+40r4jeKbmxkv5v+JP/wA8ov8Av7XQaDrFjrGlx31jcRSx/wDPWKvWw1X2pz1KZqQz/uvIqTTbyfTbqOe3nqnB3qeH/XfjXWc57r8H/iH+9jvoJ/3lfXHwx8VWPiTRo/8AnpX53+CfEn9g6pzP+7lr6g+APxO+x38cE8/+jy1wVKZofSnk+d3/ANV7VT17w3b69oV5pU8H+th/c1Yh1P8AdW8//LOWtOGHzov39ZGZ84alZ/bLXUPA/iSD95/q6+F/ibqVj+zT481CDVYPKjlm+06bF/01/wCWtfpJ+0V4J8mKP4i6VB/qv3d55NfFf7fnwZg+J3w4k8R6VY+bqFr+8h/66152NwX1qlc9HDYn2R98fsBfEiD4qfsjeC/HHkfu7qzl/wDSqWvWNYm/0Xz7Lza+U/8AgiHrE95+wBocE/8Ay4eJNUtv/Ivm/wDtWvqzWDBNaXE/+r/c17eGVqFNHzmJ/jVDm/HnxIg8E6DJ4qv4Lm5t4vKtvKtP9b5sssUUX/o2uX1j9qLSvCstvY+I/DlzbSXU0scPna9pcXm+V/29VqfHjR7H/hQ+uatP/wAutnFc/wDfqWKX/wBpV87+Cf2Yvhz+0t8bvElj8VJ9SubOwm+xabaWmsXVtFFF5t15UX7qWLzf9V/ra7jhPcIf2rrG81STSrHwdqUl5F5X2y0i1K182w83/nrFFL+6qOb9sbwr5Uk/9lR/Z4pvLmu5tYtfKil/7+18p/tXfs0337Af2f47/CPxHc+IPC+jXkUmveA/Fk326xltZbu1il+zeb5ssUvmy23+YvKlj+A/7Ft9+05r1vrnxi8R3Mfh+w02186HTv3UusxfvZbXzZf9b5UUVz5X/bL/AKZReaGPtKx9CeJP+ClnwI8Ky3EHiTxVollJF+7+yTeJLXzf+/Xm0aD/AMFGvgt4qv5LHwd4j0nUpIofM8q08VWvmy/9sq7DwT+zH+wx4J0uPw54d+FXhvy/J8ub7Jpv73/tr5UVeb/H/wD4Jg/safH61uP+EV0Oy8N+IP8AWWd34e/0aX/v1/y1/wC2tZm16x3ln+2Bod5YW99YaVFc291NFFpt3DrFr5V/LLF5vlRS/wDLWWrk37VHkX/9lX3gC9tri6hl+x2kupWsd1deV/rfKil/1tfAf7Lvw9+I2m/Hnxh+zX44+3al4s8Of6TDNaebH9v0u6lsIrqWKX/WxS/ZYvK/56/vf+mVfRnxV/Z1+Kfirxvod94I+El74f8AD9rptr9sitLOX97qkWoRSxS+VFF+9/debF/21rQy9rWPdP8AhqiwvLW4vv8AhDv3drN5d5NF4k0uX7LL/wBNf3tU5v2tPDkMVvPP4clijv8A/kDyzeJNLjiv/wDr2/0r97/2yrxvTfgn4x0fwHrnhWf4O+JLnWP7Hl07w3rnky+Vpf7r91LF/wA8pfN/eyyxf8tax/Af7MfxG0K/s9c8Y+B9blkv5rX/AISTSdJhltopf3X73yvK/wCet15X/bKWWKg1/fH1R8N/ipP48utQgg8K6lYyaXNFHeS3c1rL+9l/e+V+6ll/e/6r/v7Wp488e6V4D8G3njHxjPJY6XpcP2m8lhhll8r/AL9Vz/7NOg2Nn8KrfXLfQ/7Nk1S8ur2a0hh8v/lr+6/8hRRVJ+1RpH9pfs0+NLGfzJf+KbupKukk61joo0vbVv3h5nef8FIP2V4f+aqSf+CG/wD/AI1XWfB/9qj4V/H6/vLH4V+Kv7SvLCGKW8i+xyx+VF/21ir8v4dHsfK8+vpz/glH9nh+OfiTSv3v+leFfN/79XUX/wAdr6DG5LhcNg/aUz6jGZDhMLg6lWmfch1K+m6W/wD0zqx9sns4pJ77/Vxf9Nv9VWpNpsEIwJ6/Pf8A4KHftXa58QvGWofA/wAAa5LbeH9Lm+zaxNaTf8hS6/55f9cq8TA4Kri63szwMFgquYVvZ09j3z4s/wDBSb4A/De7k0rQ7658U6hF/rovD372KL/trL+6ryO8/wCCtGq/b/I0P4EeXH/09+JPK/8AaVfI9npsEPl/6qpIZrHzfI+0fvP+eNfW08ly6ktT62lkGXUdz7I0f/grp+9/4qP4H3Mcf/PW016KWX/yLFXpHw3/AOCkH7Ofjy/+w6trd74bvJf9TD4hh8qL/v7F+6r88/8AU/66xkj/AOusNU9ShgmuvI8j/ljRUyHLq2wVMhy6tsfsJDr0F5FHPYX0ctvLD5kM0P72rFneT3l1b+f/AM9q/L/9mP8Aa08cfs369bwX09zqXhOWby9S0mab/j1/6axf88q/Sjwr4ksNdsNP8R6Hqv2mzuvKks7uH/lrFLXzeOy2tl9U+Sx2W1svrHeCztx+/wA+X/z2rw/4qftIfEbUte1DwrYT+XHYXktt/wB+q9osrzH/AF0/5bV81/E6byfHmuQfuvM/tKX97Xy+bfwTpyr+KeX/ALWmpa5r3wW1T+1dVlk/c/6qvmv4V/vtGr6M+P0wvPg3rkE8/mSfY6+d/hL5P9gyf89POrLKajqnp42mdJ5P7qjyenkVJZf8tKkr2DziOH/XfjUmkfvtajgqSaH/AFdXNHhI1SOgD1j4Ywwf2pHXaa94Dn1LWZL6c/u65v4J6b/xPo/3FegazNrn2+SCCD93/wA9a8HNj0MCYcPgPQ4Yv3/lSUQ6PY6bL/oMFXJobHTYvPnvv3n/AE1qnL4qghl/0HzZP+uMNeCeoWPsc83mQT/u/wDrlVeazsbP/j4n8yP/AKbVHN/wlWpxefBBFbf9dq5u8+Euua9L5/iPxVc3P/TpD+7irRU65j7Q2P8AhJLH7VJ5F9HLHF/zyrPvPEniPWZfI0LQ5P8ArtL+7roPDfw30vw3a+RpWlRReb/rpq3IPDcFnayf63/tjDXTSwxn9ZPN4fh74x17nVvEflR/88bSGtjTvgn4cs/9O+w+bJ/z2u/3tdxDZ6rPa40qx+zf9fdXLPwHPefv9VvpbmT/AJ5f6qKu6nhjKpVOH+x6HpsvkQQeZJ/0xhrQh0fxVqUXkaVYxWUf/PWb/W16Jpvgmxh/cwaVHHWpD4b+x/v4P9XXT7I5vanl8PwZ0q8ljn1yCTUrj/p7/wDjVdRaeD9K039xBBFHH/0xhrtIdGghi88f6z/ntViy02x83z/3UtHsjL2iOb03wr/y38iOtCbR4NH0a41yeeL91D5nm10E0Njef6DPBXn/AO0t4kg8H/DS4gsZ/L82Gip+6ojpH5z/ALTmpX3jz4tf2V5/m/aryu803R4NNsI7GA/6qGuH8B2c/jb4l6h4qnH7u1/1NemeT+9rXDU/3RpiKn70rw2dSeR71Y8j3qSaGeby7GD/AFkv7utzMjs7P9158H/LWrEMJm/cVofY/sdrHBB/yyqOGH/WT4/Sq9mBqfDfwTfeMPFFvpUFv/rZvLr7s8H+FZ/Dfhy30OxHlx2sPl/ua8P/AGM/hvpWm3UnjjxHPHHHa/6nzv8AnrXuHiT42eANBi8iCf7dJ/0yrhq1TT2RcPgP7ZL9uvvNk/67VoWej6Vp0X7ixjtq83vPjZ4/179x4O8KeVH/AM9pqx9S0b4q+JP3/iPxVJbR/wDPGKas/aIPZHpmseNvDnhuKT+1fFVtbf8ATGWauL8SftRfD/R4vI0r7TqVx/0xhrk4fhX4O02Xz9cvvtMn/TWarE0HgfR5f+JVYx/9+aL1jRexKesftCfGLxV+48DeAI7aP/ntd1h3ng/47+PP3/jHx/c20f8Az6Wk1dBrHxUg0yLyIBbR1x+vfGef955+q+X/ANMazAsWfwB+GWm3X27xHPLeyf8ALaa7mq5DrHwd8H/6i4srH/nj+5rx/wAYfHL97JBBP/21rzvxJ8YLCb/X/vJKn2iNVCqfRGvfH7wRD/x4z3Mn/kOuH8SftFWPlSfYbGX/AMDK+f8AV/ibPeS/uP3Udc/eeKtVvKPaj9nSPXNe+PGq3nmQTmKT/ptDNXL6l8VL68/5b15351/N/wAt6khhqSjsJvGF9NNVjTby+vP+W9cvDN5Pl+RXUeCdNvteuv8Ap3i/101Y1CvaGx+0V+z34H+NnhKTQtcsY/tn/LGaavmOz8K337MfjKz+DvirxTFc/b4fM03/AKZV9gXmvWPxC8JWfjHwrffu7qHzP3NfD/8AwUC+DPj/AFPVLP4qQarLJ9g/55VpgcV7V+0DE4b2R6553/Lf9asQzV5v8AfipB488LxwX0//ABMLWHy5q9Ehm8iWvpKVT2vvnmlivRPg/wCNvsd19huJ/wB5FXndWLO9m026jvoJ/wDVU6pmfoR8AfiFB4l0aPS76fzbiKvWYf8AU/hXxF8Afip/Zt1b30E/7v8A5419meD9eg17Rre+g/5a1wAR+JPDdj4k0u40q+/1csNfK/j3wfPpt1qHgfXIP+uNfXk0H73z68j/AGovBP2zS4/H+lQfvLX/AI/P+uVAqdUw/wDglRoH/CB/BvxZ4HP/AC6/EK6uYYv+mUtra/8AtXza+nNY/wCPCTyf+eNeJ/sNxQf2N4knggj8yXUrWT/yF/8Aaq9o1jTfOtf3/meXXVR/hHm4n+Kcf8YLyDUv2bvGEH/Uq3/+p/69Za8n/Zj8S2Wm/FXxB4cvtVittUivJZIf+esVrLFYeVF+9/6axXP/AH9i/wCeteua9ZwXnw51jQ8+Z9v0e6tv+/sVfI8/xU0rwff6Prmu2MsdxdabF5N3FeWvmy+bFa3X/LX/AJ5fuv8AVRS/uv8ArlXUtjiqHpn/AAVQ+EvxH+JP7KHiDQ/B0EupapdQxeTaWkPmSy+VdWt1/wB/f9G8r/rrLFXzX4w/bS/sf9ijxBB8AfEf/FQaNoOl/bNJmh/0rS/3vlXUsttL/rfKlluf/IUte+fBnxVrnxy+L95oeq65qX/CLxQxfY4buG182XzYrqX97+6/6dpa90vP2b/hXeRSWOq/bpLe/h+zXkUX2X/Sov8Anl/qqzF/FPnf4Hfsi/Bb9tHwbofxN+Kljq974bls4v7B0S71KXzf+PWKX7Vc3MUvm3d1L5v+tlll8rzfKiii8rzZeP8A20v2UYP2JtG0/wAf/sM6H8Q4tclvIvJ0Pw9NdalY3X72WWX7TbS+b+68qL/ll/qpZYv+etfYEPwlg8H6p/xaS+sdEt/9X/Yf2P8A0GKX/nlF5X+qqxr3hv4t+KtLk0PxXrmkaRZy/u5v7J825/8ARsUXlf5/dUD9mfK/wZ0fxV8Tv+CmOl/FSDy4pNG+D8X/AAlUtp+8itbq6urryrWX/pr+9ll/7ZebX2xo2par/ankTz/u5Yf9b5Nc38LPhB4V+DOiyaV8ObHy7e6mludSu7v97dX91/z1ll/5a/8APL/yFFW5Nqd9/wAJJb2M9jHFHLD/AMspvKrKpUpUjSnSOg8mDzf9fF5Xk/8ALaq95DPCf+eX/TGsvXrO+vLDyIIJJZIpv9TFN5Valn5//LeD95/y2rJVH7b2ZocP8Jbz7H8OdLsZ/wB39gh+xXn/AF1il8qX/wAixVc+KllBr3ww8SaVcfvPtXhu/j/8hS0eG4f+Eb8b654HnnijjuppdW0f/prFL/x9Rf8AgV+9/wC3qKtTxJoMGpeF7yxP+surOWP/AMhV3Uf45VH4kfjnpvnw2tfRn/BLzUvsf7UElj/z9eFbqP8A8ixS181wzT2cskEE8snlTf6mvTP2V/jNpfwB+Mln8VNc0O5vrOKzuraa0tPK8397X6Fi6XtsHOmfo2MpOtls6dM/VDxVNPDoN5PY/wCs8mXyZa/Gfzp5tZvJ55/9IlvJZJq/QTTf+CqH7Od5F/xNbHxJpsn/AC2+16P5sX/kKWvif45Wnw5/4W1qmq/CTxHFqWh6pN9ps/3Msctr5v8AyylilrxckpVsLWqe0pnicP4atha1SFSmdB+yv8B4P2ivjJb+B9cvrmPS7WzlvdY+yfupZYv3UXlf+RYq/Rz4Y/BP4SfDDS7ex8HfDnTbKP8A57Q2f72X/rrL/wAta/Nf9m/45X37N/xfs/iNBYy31nLDLbalaQ/62W1lr9KPgz8YPA/xs8Gx+OPhzrn9pafLNLbfvYfKlili/wCWX72ubPnjFW/6dnPn7xirafwzY1Kz8OeKr+TStV0O2ubeKH99Fd2fmRV8f/tsfsf/AAy8N+A9U+OHwy0qLRJNLm/4nGn2n/HtLF5vlebF/wA8q+pPFXxZ8AfCW6uNc+I3jGy0nT5ZvLhu7uby/Nl/55V8p/tsftyeAPi14IvPg78JLeXUre/m8vWNcls/Ki8r/nlFXNlLxjq/uzzcop5i8X+72PkeaaC98uCDypPN/d+T/wAta+8P+CZvjyfxJ8B/+EVv/wB7ceF9elsof+uX+ti/9G18J/Y4NNi/55V9uf8ABLXwffaP8EdU8Y30Hl/8JH4klk03/prFF+6/+O19BnX+66nvcSf8i/zPsDH/AEw/Wvmf4zQz/wDC0dYggg8399F/6Kir6YhmgEscEHmf9tq8b+LWmwf8LG1CeCDmWGL/ANFV+XZt/CPAyn+KeF/Gbw3rc/wq1wz/AOris/8AVV8x/B7/AJBdx9K+yPjNoF9qXwv1jz76WL/Q5f3MNfGnwe/49bj60smPSxx18P8ArZKsf8sqr5nm8ypYf9T+Fe4eeP8A9bWhoNn/AMTSOs+HyPOkg/5aVqeFf+QpHPigzPdPgzZzQy/9NKua/pnirUtUkxqv2a387/VVJ8H9N86Lz/8AnrXokPhWCb9/fT14eNpe1OvDVfZHn+m+A/Om/wBOgluf+m0s1bln4P8AJ8sGDy467yz8N+TF58FXIdH8/wDcQVzUsNROr2jOHh8NwQf8sK1IfDcH/LeCKOu0s9C8mX9/BUkOjwQ+Z58Hm10+yMvanJ2eg/uv3Fj5kdXP+Ebv5pf9R5UddRNpv7ryP9VUkNnBDLHB/rKDM5uz0Gx/1GauQ6D/AMsIPNrpIdH5/wCeVWLPTbiaKtAOfs/DfkxVoDTfJi/cQeZVjWNe8K+FYvP1zXLaLyv+WMs1c/D8YP7eupLHwP4O1LUv+nvyfKioA2Do/wDz3/dVJDoMEVWLP+3J7COfVfs1j/z2h/1tWINHsZpfP/eyUGZlw6P/AKV58EFfLf8AwUI8eT6PoN5pQn/ef6uGKKvrzUtY0Tw3YXF9fX0cXlQ+ZX5v/tpeML7x38RrPwrBPJJ5s3mTVnU1fszopHJ/B/w3Bo/g2O+8j95dTeZNXUfY/b9aks9N+x2sdj/yzih8urnk/va9KlS0Ocrww/vak0yz866uNVz+7i/dw1JeeRZ2Ek5/1lWNN03ydLjgP/batgKc0080VbngnQZ9Y1SPSjBWf5P73MFeyfs3+CfO1OPXL6D93F+8mrkq1PZUTSmeueFfgnpWj6Dbwa5rkvmeT5nlVqQ6P4H0CL9xYxyyf89qy/EnjY+bJ+/irh9e+JH2PzJ7ievF9qdvsj0DWPG0EP7iCCKKOuT1/wCIX/TeKvK/Efxh/wCeFcfr3jDVdSi/cT+VHR7Qfsj1TXviRYw8z31cP4k+M1jDF+4nrze9vJ5pfInuJay5rOf/AJ70yToNe+MF9N/qDXD698Qtc1Lkz+XVi98jyv39YepfZ6DQy7vUr7Upf388lU5rOrk32eHzKz5rzzv9RcUAV7z7PCKrzXk9F5qUEMv7+esu9163m/49/wB7VeyMzQ8/2qSG8rLh+3zVsaboME0Xnz1t7NEe0ZqeG9MvvEmqW+h6VB5txLNXsE2gweFvDn/COaH/ANvk3/PWWrHwf8E2Pg/wv/avkR/2hfw/67/nlFR4km/dSeRXkYmr+9O2lTPj/wDYD/auh02//wCFV+Mb793/AMsZZa+lPip4J0rxJo1xpU8Ectvdf6mtb9i//ghR8HJPhtd/Fn47/EttOubu7ll0y7F0bb+y4vK/deWfN8qX/pr5vm/9sq9W+Pv7OvhX4ceErO++GfjCLX9HtYYraa7hm83ypf8Arr5sv7quL67So4v92dvIq1I/JPxVpviP9mP40+f+8/s+Wb9z/wBcq+lPDevWPjDQbfXNKn82OWGrn7UXwfg+JHgm8H9kx/2hFD+5lr5X/ZR+M3iP4e+Mrj4O/EaD7NH53lwyy/8ALKWvrMDV0PFqKzPrCH91UnkzzdKj/wCnj9asQd69Q4jpPhv4k/sHVI7Gc/u5a+zP2afidBN5eh30/wD1xr4P/wBT+/gr2T4G/EieGW3n8/8A0iKsagH6Ced+6qnNZw6xYXGlX372O6rH+GPjCx8YeHI5/P8A3kUP76tz/jzkrEzOP/Zd8K/8IF4y8YeFZzJHb+dayWf/AFy/e17ZNZwfZZOJZK5PwfZwTeKLjVfs/wC8+x+XN/39ruIYP3X7iDzK2pnLiP4pw/8Ar/3EH/LL/ljXxXN/wh3hvwl4b/4T/wAK3stnFpthHqV3aeb5t/8AupYotP8ANtP3v7r7NLL+9/dfvf3tfeHn6V9qkzY/6qb/AF1fG/jDQfhjNFH/AMJ/Y3Mmn6XrF1bXktpN5flWsWoarFF5Uv8Ayyl/5a+b+6/deb+9/wCevdT2PHqmp+zHZ/Dmz+PGn33wk8AXPhvR9ZhtfOtLuH/W3VraarF/yyll/wCfmKvqzWJreGWOC+gj/ezf8tv+WVfK/wAGvDnwk0D9pHw/P8JPEet31v8A2P8A8TKXUNSurm1iuv7VtYv3Xm/9Mpf+WVfYHiTw3feT59jB5n/XauaoddH+CZ//ABTk32eeAeZJFN+5l8mgXkGpapJY/YZIvK/5e/J/dS0Xmpzzf8eNjJbXEU3+pmh/4+oqrzQT6xYXHiKx822uJf3fk2k0Vz5VebjMS6Vb92dFOn7UkvLOez/04f6uKH/U1T03R4NY+z659nk8zzv9dN/ra1LOz87Ro4J/tMUksP76X/lrUmm2cOm2scEGqy3McX/Lbzqt+2q1af8AIIp2epXE2qXGlT/uvK/1M32z97L/ANsqseGten1K/k0rVZ4vLi/1M0NV/En/ABJ9Vs9V0O3k/wCmwihi/wCmVV9T1LN3JBY+Xbeb/rpvJ/e1GH+tVa3/AF7HU9lSpGh8QvB99rBjn0qf7NqlhN9p027hh/1X/XWL/lrFWf4b8Sf29NJpWqwS6bqlr+8vNOl/ef8AbWL/AJ6xf9Nf/RUv7qrB1LxVDYRmfVZPM/5YzVT1mb/hJIo4PEcEUtxa/vLO7i/dy2sv/TKWL/VV66fU507O5+dfir/gm/8AtbWevahfWHw5tr63lvJZIfK1i1/1Xm/9Na5u8/Yt/av0GXM/wI1uT/r08qX/ANFS1+mln428cabdR2N9BF4gj/6ZeVbX3/xqX/yF/wBcqsWfxC8K6ld/2V9vitryX/mHajDLbXP/AGyilr2Vn2LR9FS4jxSR+UfiT4D/ABw0eL/ia/B3xTbf9ddBuv8A41XL6lDfabdSQX+lX1tJF/yyu7Pyq/ZTUvP8rz4Lj/Vf9Maj82eaWP7d5V7by/8ALG7/AHtdS4jq/wDPs6qfE9X/AJ9n4xw6lBNL5Hnx1+hH/BLXQfO/Zfk8i+8q3l8SX/8Aqf8AtlX0ZrPwl+C3imKP+3Phl4fufN/5+9HtZf8A0bFUeg+CfB3w30uTQ/A/g6x0izivPMhtNPhijill/wCuUVc2Ozalj6PJ7M5sxzulj8J7P2Z83/8ABUTwrY6b+zxZ30EEvl/29F50vnf9Mpa/PefUp9Gij8i+82OWv2E+O/wB8D/tFeA/+Fc+P/tttZ/bIrn/AIl155cv/LX/AOO143/wxn+xN+z39j1XxH4c003HnfuZfE2sfaZZf+uUUv8Ara0ynNqOEwns6gZbm1HL8JyHxP8As3/sr/E39pzVLee3gudN8LxTf8TLW5YfLil/6ZRf89Za/Szwf4J0PwH4X0vwd4UsY7az0uzitrOGH/llXl+vftaeB4dLvIPhX4c+3f2XZ+Z/pf8Ao0UXlRSy/uov9b/y7S/8svK/6a17BDDPDN58/wDq64sdmVbHnkZjmVXMKp2FnZ+d+/8AI/eeT/y2rwf9pbxh/wAIr8Rv7Kgsbm5uJdNik/dQ/wDXX/41XvFnN/otvPP/AM8K87+PGgwXvi2zvvI82T+zYo//ACLLXzeOp+1omuW1fY1T5z8bTfE7xJ4S1D/QYrKz+xy+d53+tr5L+Ff7mLUIP+eU1fop4k8K/wDFD6h5/wC6/wBDlr87/hvD5PiPVLLP/LaWOs8tp+yO7E1fanaQ/wCtz/z1hqOG9ghi8j/lpWfr1n4j1Kwt4PDl9FbXHnf66aq9lpviv/hLZJ54LaXT/sf76WH/AFvm17ZxmxqU3k+I7f8Acf62GtzwT9uOs/6dPFL++/c+TXH/APCST69qcdh/ZV7bfYJvLmmmh8rzf+uVV/2XZtJi8W+JNDsL7UrmSLWP30uo1lVND7U+CcME11bwV7ZBoMHlfuIPNrxv9nuzM2vRk/vK+lLPR/3X+o8qvNxP8UqkcnN4bnmijrQstN/5d/IrqIdA7T1YOjwQy1kbHJw6bPUn9gT+bXUQ6bB5vn+RR5PnRUAc/Do/kxf6dBVe8msf+WEHm/8AXGukvIdKhixfCL/trNXJ+JPjB8K/B/8Ax/atbeZ/zytKALE39qzS/uNK8v8A661JP4b1W8i/07XJIo/+eMVeb69+054j16/kg+HPgfzY/wDn7u6w9Sm/aT8bRf6drn9m2/8A0x/d1n7QXs0esTeFfhJ4V/4mt9BZeZ/z2u5vNrn/ABJ+0h8FvDcUkH9uR3P/AEytP3teZw/Bnw5DLJP4x8VSXsn/AE1mq59j+GXhuLyLHQ7aWT/prWgzQvP2r9c14/YfAHw5uZf+eMt3+6ohvPj94w/5Cuq22kRy/wDLKKqc3xUsdNi/0GC2j/65Vh6l8WoLyb/SL6WX/nj5VZmhJ8VNB/4Q/wAOSX2ueKpb68l/6bV8Z6PqX/CefGTVPEc//HvazeXDXvn7TnxO/s3wRcX3n/vPJ8uGvF/hLoP9m+HI76f/AFl1+8mowVP2tYKv8I6iD/W8/wCrqx+6ogh/1cFSTQ+VXuHD7Ur+T9sv44P+WcX7ytCaH91Uej2fnRSX2P8AW1JP++l8msw9qGj6b9suo7GD/lrNXsnhvXp/Cul/YbH/ALbVw/w90HzpZNV8j/Vf6mugvPPFpJ+/8qvMzF/8uzuw3/Pwj1jxhqt5L/0zrl9YmvryXz61JrOCGL/X+ZWPrGpWNmf388Udeb7I6vamHqVl50vnz1XvIe1R698SfDmmxeQb77TJ/wBMq4/WfjBB/wAwvSpf+2taknQTQ+bWPqU1vZn9/PXB6x8TvGN5/o8E8dtH/wBMa5+8/tXUpfPvr2SSgDtNY8YaHZ/8v0VcnqXxC0rOIIJZay5tNgqvNZwZoAj1LxrfXn+osYqy5rzXNS/4+LjyqufY/b9asQ2f73mCtAM+HR/O/wBfWhpug+talnpv/wCutzTdHnEsdaHOZej6DPD/AK+us0fQf30c88H/AFxhqxpum5l8iuk0Gz86/t4f/INZVahrT3PSNN0f+zdBt/8ArjXlfxm8bQaP/wASPSv3l5df+Qq9A+Knjyx8H6DHz/pEsP7mGvO/hL8Pb7xhrMnj/wARwebH537nzq87D4b2rOipV9kc38bbz4t+JPhBefDLwD4qudNkuofL86K8ljr3P9mr4h/spfsc/sVR6V+1D8aYtf8AFd/B5Z0nz/Ml/wBV/qv3VeEfDH4naH8WvBtv4q0qeKWTyf30NfO//BQL4P8AjG80GPxx4Hg/1X7y88muaphqOPpGvtPqtU+mLPxJ4c8eaX/wlXhyf/R5f+WX/PKvmv8Aao/Zv0mbVI/iPocHlSRfvP3VeV/sN/tOX3gnxH/wgHjG+kkt7r/ntX2hrGg6V4w8OSaHcT+Zb3UP7mau3C3o/wCz1Aq/vqXtKZ5H8E/G3/CSeHI7Gef/AEi1/d12kHevL7P4Y6r8GfEfkWPmy28s0vk//Gq9Mh+3QRRi+sZbaTyfM8mWGvpKTPFND/llVzwrrE+g6pHP59ZcM1WPI962A+vP2afi0bO/jg8/93LX1JDN9stfPgnr83/g/wCMP7Nv47Gef/VV9wfAb4hQeKtGjsJ5/wB5FWZmeqeA/Im1mT/np9jlrsJpoLLy8Hy64/wTZzw+I4/P/wBXLDLXaTwwf9NaDkqnL3k0H2/yD/z2r4/+J3/CD2Ws3n/CYiWPyvGGqf8APL7L5X9qy/63zYvKil8qX915v/TWvsi88iHWZOP3fnf6mvkv4/ab4cm+IPiixvp7ay+y+JJf3V3/AMe115sWlS/vf+WUssXm3MsUUv8Ay1/df8ta3pHm1aRT+Hs/wk8N/G7wfffBbXNW1K31mb/iZfa9SlubWLytV0qX91+6ii/1UUv+qr7gvZr7ypPIn/ef6yvz/wBeHgf4A/2H44/4XF9h0OKaWT/irNNtdIiupZYvKi+zRRRfarvyv+mUUtfXnwe8VeMPEd9408N+MfEccmoaX4k+zebFD5cUUXlRfuoov+WVZVbmuGO0vLyDWJbiCDVY/tEUP+qh/wBbUc2pQeG5bOw0rSovLlm/13neV5VU7zw3PDf3GuT31t9nuof3MPkxfuv+2tWLyHSodLjn8RweZHa/6m7rzqqqOl7T4JnbTp/vS5NDBeWskHkR/vf3fk1X03Tb7wr4ck+3WNl9oi/1MMM37qrH9paTeWH2ix/1cv8AqZqr6lefbNLk0rVf3sf/AC24rRU6VVe0EY9needDHfTz20Ul1/zym/dVT0fWJ5rWTP2bzP8AnrFN5tWP7NzqFvPpVjZS/wCt/fS/vf8Alr/+9rPvJtK0fUI7Hz4opLr/AJ4w/wCtl/8AaVZUqlX237z+GRUplzRoZ9N1S48++ki839553nS/va1IYfO8yCfy5I65fXoZ7z/iVAxSeb5X7m7m/wBb+9rY0f7RZ2tvBPB5UkX/ADy83yq6qcPq1bkp/wAMLe1JNS0byZfP+3Syx/8ALGGarkNnY+KtLk0PXLG2vo/+W0N3D5sUsVU9Y/0zwvJ9hnufMlm/c/ZKseD/ACJpY/PMv/Hn++87/W0fWfa1fZmfs2U7z4b+FLO0+0aV9u03/njDpOpS20X/AH6il8r/AMhVj/8ACN6r9qjgn+I2rx/ufL87ybD91/5K13l5D51rJBPP5n/XGufhs/sYt4P+Wn/Xauosr6b4P1zzf3HxU1uL/tjYf/ItSXng/wAR2cUnn/FTxJc+b/yylh0v/wCRa6TTf3N1Ul5D50Uk/wBh/wC2tBmcnefDfSpvDkl//aut3Nx9j/1U2vXXlf8Afr/VS/8Afqvmv9orwH4chv8Aw3rnjH4SW2rR2s1rHqWky6baxSy/8hr97/qov3v7qKWvqTxV4w/4QnwHceI/I8z7LZxfua/Kf9vD4/eMfjZ8adcsfEdje6Tb+EvN0mz0m0h/exRfupfN/wBb/rf9bSpGeJPoDR/Efgf4ha9qGh/DnwrbabbxaPdW0Ok2n7z7BF/Z9/8Avf8Atr+682L/AKZV9iWfkXlhp99B/wAvVnFJ5tfnP+wH8QvEepfEaPwd8Rtc+2x2Fndf2PNqP+ky2ssv+gSxeb/rfKl+0+b/ANdYq/Qj4Vi+1L4VeE9V8+KXzfDdh/rf+vWKukzpncWc3+gR+f8A6zyaw/HujwalqlvcQQf8sfLrpNBs7ibS+sv/ADz/AH1SXmj+dLzXBV/hHo4f+KcHrHg/zvCWoTz/APPnLX5d6PD9j+I2uQf88tYuo/8AyLX7CaloPk+HLyD/AKc5a/IfUrMWfxk8WQf88tYl/wDRtZ4f+Kd0/wCEbH+q/wC2U1aEP/H1cQf9Maz/ACf+Pj/v5WhD/wAfUc//AExr1zgDyfO0bj/llNWp8PdNsYbqSexsYoriWb99NDD/AK2s+H995kFbnw9hBupIP+m1Z1Nho+qP2XbL7Z4st4K+qILOCHpXyf8As36lPpnjK3nggklk8n/UxV9ETax441P/AEexgito/wDptXiYmp++PSpUzqJoYIf9fPHWHrHjzwroMX+narFXP3nhW+vD5/iPxVLL/wBMoqz7yz8HaR/qLHzP+u1cvtEa+yLF58coJpfI8OeHL6+/6a+TWPqXir4t6xF/y7aTb/8ATX/W1HqXxB+x/wDHjBHHH/0yrj/EnxI+2/6+emBX8SQzzSyf2r4q1bV5P+eVp+7iqTTdH8D2ejZ1XwrHHcf88ZZvMrj9Y+J0FnLn7RFHXB+KvjZBiT9/5tAHtk3xU0rw3a+RodjbW0dcX4q+P3+s8+9/8jV87+KvjBfTf6PAJK4/UvG2uTdZ609oHsj3TxV+0JPCcWNcfqXxyvrz/l+ryO81Keb9/PPJVf8Atj970oND1D/hZ19eS/v55K1NN8VX011Hmb/lt615XZ6l/wDqrvPh7ewGWS+nH/HrDWdQDP8A2hNYn8Va9pfgeD/nt5k1bmm6bBBaxwQf8sq4P4e/2r43+JeseKtV8r7PazeXZ16hZwnza9LBU/ZUjixNT96V4Yf3tR6lP+9t7ET/ALy6rUhhrP02z+2a9cXxg/d2v7uGu4g0P+PO18j/AJZ0Wdl9tuo4Ps/+tqxN/wA8MVc0eGDTbW41y+/1cVALcuXnxI8OeCbX+w4PNkuIv9d5NcvqXxm1y8i8iy0qOOub1Pz7y6kvp56p/wCj/wDLDpXh1f3rOxbFzWPG3irUh+/1WWKP/plXL6lNPNLmfzZM1sT9qz7yszQx7yHtWPqUMHWti8rHn7VmaGfNDVeftWhNDVOftQBnz9qr/wCtqxND50uKPsf/ADwNaGZX8j3qxDZ/9MKsQ2dbGm6P3rQCPR9N/wCmFdBZ2Y8qrGm6b5MX+orQ02z866oMw+xwWfl289bmm6lY+FbC48R3x8ryof3NZ8Pkeb+//wBX71h+TqvxI8UW/hXSf+Pfzv31c/s/amv8IueFfDeufGbxR/wkeq+Z9jir2SHR7fR7CPS7G38uOL/njVjw34VsfCujW+h6Vb+VHF/5Fq5N/qn+lerSpexonLVqn53w/A34xfsK/H3UPAGuTy3Phu6vJf7Hu5f9VLF/zyl/6a175Z3mh+MNGksr4+bZ3UP/AH6r7Q/ai/Zd8K/tFeDpPDmq2McWoeT/AKHd183/ABU/Yhvv2Y/hfHqviP4t2V7eS/vIdOhm/exV85jaX9n4v2h6WCqfW6Psz83/AI8fsT/HCz+N1vpXwB+H9zq8l/N5kMVpD/x6y19keD/2b/2mvgx8INPn+P3hyLTbjyf3MPnfva0PAf7Znjf9mO/k8VeFdDsr68i/1M13D/qq5PXv2rfjv+1d4jkvvEc99q15LN/x6WkPmRRVliKtas7nTh6XsdCxpH7Qnhz4Y69/avjHwrHqXlf6nzqp/EP9paD486zb6r/Ydtpsdr+7hiir0TwT/wAEtf2of2hLWOf/AIRX+xLOX/l71Gvpz9nv/ghj8JPhjFHqvxp+I1zq9x/rZrS0/dRV00qtZfvDnq06J8NwzVYs5vP8yCvoT/goF+yXofwH8R2/jH4V28v/AAjd1+7mi/59Za+c/wDlp59fSUqntaXOeaamm3k+m38d9/zyr6Q/Z6+Kn9m39vfQXH/XavmvzseXOP8AV11Hwx8VXGj6r5E8/wC7lrqRmfp54D1+DWLrT76Cf/WmvQJvI837R/yzr5f/AGUfiR9rv7PQ55/+W0Xk19Mf8to4PI/5Y1mcvszL1iGD7f5Hn+VXyf8AtaWelQ3/AMVLi++I1z4S8r+y72z8T6TpvmXNh5sVrF5sXlRSy/8ALtF/yy/1sX7qvqXxH/yFf+2FeBftFQ30Pxa8SarpXjiPRLiL4e2Gow65NZxSxWF1a6hdSxSyxf8ALWKLyoqqkc1SkfLfgT9ib9nrwrpd54/+J2leJPij4w1TR7qT+29cmv5Zbq6l83yv3V3FF9kl/df8vUv/AE1r7s/Z1m1W8v8AxZB4j8VSXMfnWEn2SaHypYpZbXzZZZYvK/6a/wDkKvz7s/j9+0LeeI5NKPj/APY9i8qb9z4hi8eReVFL/wA9Yopb/wD9pV9wfsf6lP515cX2q22tx3/g/Rrmz1y0m/4/7WK18qKX91+6/e/vZfK/6a1Jlhtj1TUteg026t/sPmS/av3f/PL91/7VrY/tLSby1t9Dgnk/0qH9zLF/rf8Av7Ud5pvhXU7W3nuIP9V/qYv9Z5VV/CtmdStft19PcxfYJvLh/c+VXmYn2tKt7P8A5+HpU6ZcmtP7N0aSCf7TL5UPmed/y1qnZ3kGsWEkH2GTy5YZf3U0NXP7YgvIriDz/N/5Z/uZqpwwwaDYf8eNzcx+d/yxh/e1pP8Adaf8uw9kZ+mzXGj6X5F9Y+VJF/qYrT/lrUepTaFqVhb6rfa5c6bJ/rPsnnf62tyaz0rXrD/ToJfLuof30VY+sfDfSrzRvsNjfeV5VFPDv4P+XZnVp2M+zmn8VXVn4q0qx0j/AEWHy/300Xmy/wCfNrQh03VtS0a4g1X7NHJLD/11o0fwrBZ2H9h2M8cX/bbza5/x58ToPCvmaVAba+k/1n7mbza1w+D9lS9nU/5eGVSoalnr2iaZFHY319bf6L+7m8r/AJZfva0NN8baHppk+3eZFJL/AKmvE4fG1jNqkf8AwlVj5sf+r83/AJ5eb/zyq5Z+MdDhljsf7Vli/cxR2c3+q8qumnSVKl7OBn7U6zxJ8ctVs7uT7DY+XZxfuv8AU1Y8E/FSDxhLHbzz/wDf2by683vdHvtYuvIg1X7TH9sljh/c/wCt/wA/+0qw/wCzdc8N3/8Ax43MUkX+u/1tX7I5vaH0heeNoNHupIJoP+PWH99/0yqxrHjyxs7qOCD97H532bzfJ/6ZV4/Z6xfTeF9Qn1y+8zzbOWOaab/P/TWq/jzxhY3ug6f9hgl8yW88y8hm/df6qKn7I09ozsP2ovHmq+Ff2eNQ/wCEc+HN74kkl/11pp83leVF/rfN/wDRX+q/561+RfjzxJffE7xR4g8ceI4JJbzVLz7b5ssP+q83zf8AyF/21/8AtX6gfH7xX8TdM/Z48SQeANDvdS1yKz/4lsNpeWvmxRReV/z9/upYov8AlrX5V3niq+murz+3L65l1z+0vMvIpv3ct1L5X7391F/rZfNuf9bTOfEnuH7BN5/aX7QXhODVft3mXV59m82byvKl/exV+lnwlhg/4VB4PsYPN8y10eK2/wC/UXlf+0q/L/8AY/02/wDDXxa0O+gvov8ARZormGH7ZFJL5UX/AC1ll/5Zf88v+/Vfpp8GZp4fh9HBfebJHFrGqRwzf9ctQuq0Fhtz1jw2f9Aj/f8A6V0EFn2ggi8uuX8KXnnWEdx5/wC7qTxtqXiOz0GP/hHL62trjzvKmlu/9VFFXDUPXpmx4k0Gx1LS5IL7VZbb9z/yxr8d/iR5Gj/tLeMNJ/5Zy6lLX6YaxD9sh/4qT4q3Nz/0ytP3dfmv8QrOx039pbxJY2M/mR/bP+W1ZYf+KdM/4Rof6j/vzViGb/V1Xhh82pIYf3Ve2cBYh/4//IxXUfDeL/iff/Wrl+Ybquw+G8X/ABOazqgfSn7K83k/EGS4/wCWcUNe8a94kgh8z9/Xzf8AA3WP7H1m4vv+mNdh4k8bT3ksn7+vlsbUq+2Pcw38E6jxJ42gh6T1w+vfEiCGLieuf1jXv+m9c3rF56VzeyNCx4j+JE+P3Fef69481W8MmJ/3dSaxNB+8/wCWlcvqV5B5X/PKumnsZlfWNYvp/wB/59c/qV550X7+pNe8SaHpsX+narF/3+rh9Y+J2leb5FhBLLWpmXNTm86seaWeE1h6l4w1W8m/cQRRVnzQ6reD9/fSUGhsXmp2PSe+qvBqVjn/AEG38yqdnoPetzR9H8itPZszLGm3d9N/yw8uu4+2f8Ir8L7iecf6Rf8A+prH0HQoJrqO3o+JHiSx1n4oaP8ACuCeX91D5k1ZqlqB2nwl0GDQfCVvB/y0l/eTV1kMP7qo9Ns/Jijgg/1daEMNe1S2OMz9YvP7Nsef9ZL+7hrUstN/s3S47H/v9WHZ/wDFSeN/+nPS/wD0bXQXk3nDyIKoCvZw+d+/qPx5N9jtbfQ4P+uk1bGjzWMN3if/AJdYfMrj9e1L+0r+S+x/ra5cTUKpGHeWcE0UkE8FV/J8mLyIP9XWhP2qnNNXmnUU7yse8rQvJu9Y+pTetZmhn3k0/Sqfke9aE/ao/I96zNDPmhqnNDWxNDVf+zfO/wCWFAGP9j9v1oh02fzv9RWxDoM/m/6+rEOj/vektXT2MyvZ6b38itzR9HqxpujedL5Agrcms/7HsPPnrUzMu8m+xxeR/wAtKuabZ+TF1qnDDPeTefPWhrOpQaPa/aP+Wn/LGg0MPxJeX15L/YelW/7yX93XsHwr+G8HgnQYzPB5t5df66asf4M/DGf/AJHHXIP3n/LnDNXpnkz+V+4rtw1P2Rz1ahT/ANd+4qP7H53FXJof3tRzTT/8sP8AV1uZn0Z5X2yLyJ/9ZXif7SH7Ip/aEv7P/hG9VjstYim8vzpv9V5Ve0ebP/r4KPOgvJfP/wBVJWOJw1LF0vZ1BU6lWjV9pTPOvhx/wRK+C9nbR3vxv8Xy6v8A8tJrSH91FXuvg/4Pfsk/s66ZHpXw6+HWkW0kX/LXyfMlrj/G/wASfFUOg/YZ9VufLih/c15HZ+L/ABHDayf25qv2nzZvMhr5+rT+qfuz0qVStiv3h9Ma98foPsvkWPlx/wDXKvL/ABh8fr4Syfvq8r8SfEj915Hn1w+seMJ7y6/55f8AXas/aGvszsPi14ksfiR4YvPDniTypbe6h/5bV8L+KvDc/hTxHcaHPP5scX+pl/6ZV9Oalo8+vS4nnuZY/wDnjFXN/GD4A6r4k8JSaromlRxXFr+8/c/8ta7cDifZVjLE0j5/sp/+WFXIZvJl8/8A55Vj/v4ZfIng8qSL/llNWhDef6ucCvpVqjzj6M/ZX+JH2Pxloc/neVJFqVr/AOja/Ryaa4x+/gr8d/h74wn8N+I7PVYP+WU3mV+xkOpQalF5/keXWVUDm9Yhg+3/APLT/U14f+05puhXnxBjg1yCX7HrPwx1mO8itIf3ssVr5Uv/ALc17xrEHk6pGYP+23NeP/tB+RN8UPA8P26T97oOvWX/AH9+wVpSOXEnwfD8B/FOm6DJ/av/AASM0j/hKLWaKTTdJ0nWIvsv2DyvNuvt0v7397F/o3+q8rzfNr7M/Yn16fTZdD8OeI/B8vh/VP8AhW8Uc3h60hlisbX7LdSxeVF5sv73yvN8qL/rlLXxn4J/Zp8D+NtB/wCEj8OfHf8AaMj8qGXydO8Q+JNLsr7VIoovNl/syK7uovNi/wCWvlf88vKr6g/Yh/4RXRtL+GcHg6fxRLZ3XhvXrKCbxvpv2bWIpYtVlll+0xRSy/vaZ5uG/jH1RN42gsorgWOlRRSeT/z2/dVoeFdeuNe0aO+nMUcn72Obyv8AVVlw2dhZ/wCg/YbGPzf+WNaEJ/s3y4ILf/R/+eUNctWletznsFfzp/Dfhy4gt762j/feZD/odWIZrfXtGj+3XHmRyw/vpf8AprVfUdesbP8A4/p/9b/qa4vUvjZpWmX8cE89tFHL/wAsazp4J03/ANOyvao7yeaDTbD7PB+88qH/AFNeT+PPif4x1LVLiDw55sf7n/U/6uo/iR8WrHWNLjsfDniOW2klmiimtPJ/9q1T8H6bpWj2v2Ce+82T/WTfa5v3tdtOmjnqVPanN/8ACzvH9nqnkQfbpJIv9dND/wAsqr3msarrGqXHiPVbeWST/ltN/wCiq2PjD4b8R+A/Btx4/wDCv9mxeVN5mpTXdnLJ+6/56xeVL/nza4vTvjLB42tdY0PVfA1zpF5o00XnTQ+V5V1a/wDLKWWL/Wxfuv8AW+b+6i/560zhNC8mgmuvPsf+e376H/trWXZTT2esxwefJ5dr/wAsZv8AnrXUaPqXhTw38PtL+JvxG0q9ttPv4YvJ1C0hik8rzf8AlrL+9/1X+qrl/iF8TvhleeKJIND1y2k/feXZy6dDLLFL/raAOs0Hx7fQ69/oNj+8i/1P7n91L/mKWu0vPIvIo576xi/0qby5oZYf/IteL2fxO0PQNe+3QQX3ly/vPtcOg3X73/rl+6rcs/jlpVnf2/8AyF5f30Uc0P8Awit/+6/8hUAdZeeFb7TdUuLHz5Ps91DF50MM3m/var+MLPQofDml/wBlfvPNm/fTeT+983/lrUkPx40O8l0s6V4c1uWOKbzJvJ0GWq9n8WtKs9UuLGf4Za35f9pfadNmmhiii/e/89f3v7qgP3Jn+NvipB4P+HXii+n0qS9+webbebDN5v8Ax/SxRRf+Ra+Z/wBpzV/2O/B9rqHhzxV8Frm98cWsMV7Nd6TefYf9baxfvZZf+Wv+qll/exeVX05+0t4b/s39lrxp9hsYpNYls5fOlhs/3sssWoRfvfK/6ZebX5n3dnPqXmQa5PL+6muv7Yu5oYov9K/55S/89ZYvNl/1X/tWg58RUPQPhX8AP2qPhvo15+0L4j+GXiT/AIRvwvDdSal9rh8uW1ilill/1X7rzYoopfN82KKX/W/8sq/Sj9m/4heG/i18Jf8AhI/Cv/Hnda9qkkM03/TW6luvK/8AItYf/CeeP/Af7NWoT/E7wd/aVxqnxI/sH7JqM3+t0bU9f+wWssX/AG63MVef/wDBJGb+0v2KNPgM8UklrrHlTf8AgLay/wDtWtDSlT9kfWngOb7ZoMc/keV/1yrm/wBpDXv+Eb+Gn9uef5X2W8i/8i10Hg+a+hsJPt0H7yKb/VV5/wDt1TT/APDL/iCf/lpazWsv/k1FXNVPWpbHz/rHx/n/AOXe+r5X1LUp9Y+OeoarPP8A62atz/hJPO/5b1x9n/pnxGuJ/P8ALklhrhwX8Y6MT/CPRP3EMMk8/wC6joh1Kxmm+w+f5kktc3Z6bqt5pdx9u1XzY7XzftkM1R+Fdevptes9K0qw82zlh/10P/LKvb9oeadReXnk39vb/wDPWvRPhjps81/5/kV5HD/bmpeI5LG+sZI47Wb9zd/89a9w+Ell/rJ6APRPBN59j+0Ua94ksbTzJ59Vjirx/wCJHjDxHpuqSWOh6rJbR/8ATGuD1KbVdSPn319LL/11mrwMTT/fHp0qn7k9k8VfGXwtZxc6rFLJ/wBMq4PWPjx537ixsZJP+u1cP9j8nij7H7frWXsjUuax8SfFWpH9xPHbf9cq5fUptV1Li+1WWStjyPeq80P7qgDl7zTf/wBdZ/8AZ372ukvIe1U/I96AM+HR+9SQ2daHke9SQ2daAR2dnWxZ2dR6bZ+/1roNN03MtBmWNAhg03/Tp/8AVxQ+ZXD/ALNOj/8ACbfEvxB8W76D959sltrOGb/nlXYeNtS/s3QZLGCf95dfu66z4V+FIPDfha3sbGCKLzf3ldOGp+1q+0MqlQ6Szh7Uazef2bYST/8ALT/ljViz/cy+TUd5Z/2lrNvYwf6uL95NXpmBH4P0f+wdB/0797cS/vJpq0IIv+W+akvIf+WAH0qTTbP7Zfx2Pn/9NJqNg6lPxJN/Y+g+RP8A8fl//rv+uVcfP2rc8VXv9papJP59Yc0P72vDq1Pa1j0KVMrzQ1n3lXLy88msvUte0qGL9/qsUf8A22rmqNHVSouqU5+1Zl5/rR9arax8QvDkP/L95n/XGse8+JFiP+PGxlkrnqVaR20stxdX/l2bnke9R+R71z+g+KvFXivXrfQ9KsYopLqavqTQfhv4V8E+Eo77XLGKS88n99NNXNUxNGmaVMtq0v4h89/2bPNLWpZ+Fb6b/lxlrtJ4f7e1mTVfIijj/wCWPkw1oTWY8qPyK0pVDm9mcfZ+A76aHz5/KrYh8EweVXUQ2fk1JDZ0/a1g9mc2dB0rR4pJ/wDnlXH3mpT69fyc/u4q2PiF4k866/4Ryxn/AOu1Zej2cEPGa6KVzmqmhCILO18+f/llR8N/B8/xO8W/2rfQS/2Xazf9/az5rO+8ba9H4U0P/V/8tpq908KeG7Hwfo0ek2MEcflV6WGpHNUqGhDZwWcX2GD/AFcVSf8AXv8AhUnk/wDLf9ajrvOcj/e1HefuesFWKPsX2z/9VZgdB+zf8fbH4haDHpWq33/Ewih/7+16ZeTTm6j1Wy/7bV+bfwZ+Kmq+Cdatz9u8rypv3MtfenwT+LWlfE7QI54J4vtEUP76GugyqfujuLyGDWLX7d/3+hrx/wAefDfxHZ69JPofmy291/5Cr1z/AEizl8+Ci8+z3dr58H+rrzMdhva0TTDYn2R4n/wqvVZov9OvvK/65VY034S+HLOXE8HmSf8ATatD4kfE2fwrqn9h2Phy9vriX/U+TDXN/wDF8PFUv7jSo9Ijl/5+5v3tfOezrXPaVWidJeWehaba+R+7ijrm9S+Kng7w3a/YYJ/N/wCmVSTfDGx02L7d8RviN/2x87yq5/Uvjj+yv8Pbr7DpV9FqWof88tPh82WuhYYzqVT57/aK8Bzw69J4/wBD8OXNtp91/rvNhrzuGb91X2Zo+seP/wBoS1uPDcHwdjsfD91+7+16t+7lr5b+M/wr8R/BPxvceDtcgkij/wBZZzf89Yq+gwVX917M82psYcM1fsJ8PbyfWPAeh655HlfatBtZPO/66xRV+O8P72v2A+A4/tL9m7wHqgn/AHcvgnS//SWKu4ZY8SnzpY/3/wD12ryv9oSHyde+G+q/YfN83xhLZed/11tZZf8A22r0jxhZ/Yoo4J68j/aQmn03QPB+rTz+VHYeNrWTzZf+WX+i3UX/ALVrSnscuI3PiPxJB4jsvFv26D/grZ9h+y/ao/7J/wCEqtbGXQZfNlil0/8Ae3XmxeV/qv8AtlX0B+yL42n1K68FjVvjF/wsOO18Sa9ZTeMf7S+3S3UstrFL5Uv/AD18r91F/ra+a/i1oM/ir9oLxR4c+C37D3gTTY5fFV1JqXxC+JEP2mwupfN/e+VFL/7S82X/AFtfTn7Oug33wql8P6XB4H8LeG5IvHkVtqVp4N0G/sbGWW/tYv8ASraLUP8All5Vt/rYpfK/8i1meRhv4x9afuJpI/8AQfL8r/U+d+8qx/aUEP8Ar55ZP+21U7yaxs4sfbv9V/y2rz/4kfGDStNsLiDS55ZJIof9bS9ke7c2PiFeTw2El9Bffaf+mP8Azyrzu88K/bNL8j7dJ9olh/fS1w/g/wCOUHiTVPsN9byRebN5f+u/1Vbmv+Nr7ypIP3nl+T++m/1VanN+6qlibw3Y6PpeoTz6rbfaPJilmrH0fXtD1i68jVb6SWz87995M3/LL/llWH8QvGF9oPhyTxHpWlfbriLyo4YfO/56yxRf+1ak8IeFdD1i1jvvEfm21xL+8vIdOm/5a1y1MVRwvxmmGy3GYr+GesfFTXvCs3wWksdc8V3NlbxXkX2PztS/4+rrzfKiili/5e/N/wCeVeb/AAHs7G8+PHiDw5rnlxf2zpulyTf6H5cv72K683/rr+9ii/e13Gm6P4OvLH+yr7+0pLOWHy5ov7Sqv4b/AGb/AIc6bqlx4j8OeKtfsry60eKy+13d59p8ryv9VLF/qvKlri/tLCHbiMgzA5P9oT4nQfDf9ijwv4q8j/Q/+QdeS+T+9i8qX975X/gN5VfPdn/wUU+NWj3VnBP4c0C9j8ny/K1GHzIrr/pr/rf+utfXHjD4Y/Y/2ZNU+Feq2Ft4ps/9Pk82Gz/563X2r/Vf8sv9bXzH4D8Vf8E59Nuo9K8R+B9S0S4tf3d5/wAUrLLFay/9+q1p4qjV/hngY3A4zCfxAs/+Conxbhv5NKsfgt4E8z/plDdeV5v/AIFVcm/4KlfFuby/+LV+DY45ZvMm86G/l/8Ab+uo1L4kf8EvfDd/+/niufK/ezf8UHLL/wC0q1NB+M3/AATLhv45/wDhDZJJJf3n/Ih/vf8AyLFXUcH77/n4ed3n/BVz402f+g/8Ky8CW377y/3um3X/AMlVT/4exfHDxJdW+lar4V8E21vfzRRzfZNNl/1Xm+V/z9f88q98s/jb+wVNLbzweFdXkki/5azeG/8A47WpqXx+/ZK+y3Fl/wAI54k/e2f/ACy02L/47QR+9/5+HoH7VGmwTfs3fECygg/ef8IfrMn7qHzf9VFFLX5z/tRfFnx/efFCTw5/wg/hvRLe1s/ts3/Etiiub+LzZf3sssUX/LWXzf8Av7/11r9OPifNBrHwl8SfYYPMuLrw3fyQ+b/zyl0+vyb8Vaxqv2q8/wCEqnuftF/Z2tz52rQ/8fX2qLzf3Usv/LKKKXyvNi/6ZeV5VXSDEVD74+AM37aXiT4X/Dvwd4q8K/De+8N3Wj2uow6tq011Lc+VayxS2vmxRfuvtX+qlil/6Zf8sqy/+CRdn/wjf7PviTwBfQR/aNG8YS237mH/AFvlRRWvm/8AktWx8AfCv7VOvfBHw3feDfj94b0TR9U8B6NH4btLvwr9putLliitfNlll8397LL5Vz/39i/55Vz/APwSv+3f2p8WPCs+qyXMmg+NpbbzZv8AW/utQv4v/aVanoU/4tM+uNHvP3snkT/6quL/AG2JxN+yX40nnn82O102KT/v1LFLXaWcMEMskE/m+XL+78muf/au0e31L9lX4iWP/LT/AIQ/VJP/ACFLLWVU9ekfkmfiTB53+g6VLJR4bh/4Srxlb30/mxSf9Mpqp2emwda2PBMPk+MreuHDU/3xrif4R6Rpugz2ctx5995sd1Wpo+jWOm/8eMHlVHDN+9qTzv8ASo69s8wuzf6n8K9L+EsPk6NJPXmfnfvPJxXrHw3h8nwvJPRU3M1ueb/EKYTa9JOa5uaGuk8bTGfXpKw68Wr/ABj0qWxn+R70f6qrE/aq8/auU2K8/aqc/atCftVOaGszQx7yq/2P971rUm0397UkOmds0Ghn+R71Yhs60IdN/e/6itCHTO2aDOzM/TdNuPNrrNNs4IIvPqTQdB84R+R+982tTxhZ/wDCN6N++g8qhVQPP7yH/hJPHFvY/wCtjtf3k1euaPDP5Uf7jy64f4M6b9surjxHP/rJZv3NekQw+bXr4an+5OGpU/ekd5N9itZJxVjQbP8As2w+3T/6yX95UcNn/aWseQR+7irQ1L/W/Ya6SSvZnz5ZJ5/+Wtc/8VPip4b+Ffhzz77zPtF//qYof+eVdZDZwTxZnn8qOL95N/1yr5H/AGkPiR/wm3jy4ngn/wBDtZvLhirzMyxPsqR7OUYL6/iv3hofEL9rSfR7Dz9D8OeZJLN/y2mrPh+OXjjXtPjvvtEdt5v/ADxrx/4hTedd6fYwf89q7jR4fK0uP9xXzdTE1j7alluEpf8ALsua9r3iPXpv9P1y5/7YzVXh/wCm/wCNXIZrHyseR+8o/cTRfSua7Oz2KpfwyveeR5XFV/P9qt3n+qH0rpfgb8Mb74n+MrfSvI/0eKbzLytB1H7FHsH7HPwf8m1k8f65B+8l/wCPPza9A+JGsXGsX8eh2Nx+7/5bV0msf2T4D8JR6HYweX+5/c1z+j6D5FrJfX3+slrOnS9rW9ofMY7E+1MeHQYIYvI+0VYh037HViG88mX7PBBVyEz/APPCvQPOI4bODyua5P4keKoPCuleRYz/AOmXX+prpPEmswaDpcmq6r/q4q8L17WJ/FevSarP/wBsaulT9qTUqEem+fPdSTzf6ytC81KeeX+ytKt5fMqnZf62Oxg/e3Ev+phr0z4e/DeDTNU0+C+g8y8l/eXn/TKvRpUvanm1ap1nwr+GMHgjRo55/wB5eXX7yaWuo8nzpasaxN/q7eH/AJZVX/5ZV6i0OcIYZ5ugoqPM+cwT1JDDP/z3oAkg024vLryID+7rQs7PzrryIP8AllVeaaCHy/I//e1uaPZT+V59fPZjifa/u6Z6uGw3sj814Zp4ehr2D4A/HLVfAevW88E//wBtrxuaGfTbqSxvoJI7iL93NDN/yyqSG8+x/v8A/lpX0FI84/UT4e/E7w5480GO+0qf95LD++hrY/tL+zbrP/LOWvhv9m/4/X3g/VI/Pn/d/wDLaKvsjR/FWl+MNGj1Wxn/AHctanDV/dGpr3/Hr59jBFLJ/wAsa4u8+Ffx38b2sk+q+KrbRLP/AJYw2n7yWtz+0hCPsM5/dy10Hw98bQabdf8ACOa7+9t5f9TXBicMa06p5P8A8O7ND+IV1HffEbxxqWpR/wDPH7Z/ra9E0f8AZj+B/wAGNB+w+FfA9l9s8ny4fOhr0Tx5eeKtB0aP/hFfs3mS/wCphrD0fR/GOpTR33j/AFW2iuP+mUNc/sqVI6faIr/Cv4b2+gyyarfeb9sl/wCWPnf6qvP/ANt79l2D45/DiS+gg/4nFh+8s5q9s1nwTpV5FHfT6rcx/wDXKq+mzaVptrJY/aLmWP8A6e6tGZ+QcPn6PfSaVqsHl3FrN5c0X/PKv1w/Yt1KfXv2PPAfkf8ALLQfL/79Syxf+0q+E/8AgoF+zrYeG/Hn/C4vA81t5d/+71i0i/8ARtfYn/BNTWJ9e/Yt8N+Qf3lhNf2373/r6ll/9q13UqntTSnsd548s55tPj/6ZTV4v+1d58PwWkn/AHXmWuvaNJD5v/YVtYv/AEVLXtHjaaf7B/qP+W376GvD/wBpDTb7/hQ/iS+nnl8ywhivf/AWWKX/ANpV3UjlxG583/tIWf7V+pftBahofgf4qeBfhv4fv/KvbPxZ/Y8tzrH73/rrF+6/662v+q/5610n7OvgPSfg/LqHhzwr4/1L4kapda94c8R+JNR8Q6lLLdfb5YpYvN8ryv8AplL/AMtZf9VFXmfx4/ai8OfAf406hf8AiP4jfE258SS6Da3uj+GbSa6l8PRRS2sX+titLqKXzZf3v/kKuo+Ev7VHhX4nReLNJ+BEHi3Tbyw021vfK1bQfs0ssUt1Fa+VF5t1dS/8tf8Apl/yyoqnnU/Y3PtDxh4k8m1k8/8Adf8ALOGGvn/4zaxfQzW+hweZH/12/wBbXtHxIvINN0uO9ng/1X7zzfO8uvA/iFqX9sXX27z7ny4v9T+5rP2iPS9mbHg/R/DlnYR659hjkk/5Y3f/ALSrP1jUr7+1P38EUsnnfufKh/ey15vP8SNVh1m40PwdqsscdreeX+5h/wCmv7397W59s8R2eg3njG38qW8tYf8AQ4pv+evlV5uJxvsj2sty1YrWoanirxhb3mqR6HBPH/ov/H5dxTeb+9/55VoaPrHkiOD7RXjegzX3lRwWMEsv/XL97W5Z6xqumy/6dBJF/wBdoa8n2brfvD7GlSo0V7Ome6aDr0E3/Leuk07xJf8A+vgn/d14no/jaCH/AF9dJpvjDzv9RPV+yR1Uj1jTfGGq2d/9usYJf+m3/TWuL/aQ/Z78D/FrQf8AhOPDkFtpuuSw+XDdw/8AoqX/AJ6xVY0fxtrlnFJcaVqsttHLD++hrDm8bTzX8dj58ssl1+7/ANdXHU/c/vKZlicDRzCj7OoeH2f/AAT9+KnjC6+3T65psXm/9Ocv73/trXUQ/wDBNnxxNo0cH/CYx/6n/WxaP/7V82sP9pb4wfFvwf43t9K8K/FTW9Ns/sfmQw2msSxf9+ovNrzsftaftCi6+w2P7Rnii2uIv3kPk+JLr/47XvYWp7aj7Q/Hcyw1HCYypQPqDTf+CfvjH7L/AGVqvji5uf33mQ3dpoMXmy/+TVXLP9hXzrr/AIRWx8Y3MuqRWf760tIYo/Ki/wCmsXm187w/tRftC3lh9usfjv42lkl8rzv+Kqupf3v/AC1/5a/uq1P+Eq8Y+KrXS/8AhOPh/qXijWLC8lk/tDXNBl1K58r/AEr/AFsvm+bL/rYovK/5Zf8AkKu88j2lFH6EWU32PwvpfhzXL62tvt+gxf6Jd3n+tl+yS+bX5T/Gb4J/EbTvBHge+vrHW/ElxrPhuK5hitNNupbrS/8AVf6LLL5sssUUX7qLyv8Arr5VfaHwT/Z71y7is/H/AIAsb2W817Qf+JlZ2mjy239l/arX/lrLLLLF5sXlf6r/AKa/6qvc/Hes/CTwrpqTeI/jRLF5kPl/2fDefab4/wDXWKKKg0/inyJ+zrZ/t3fGbwb4P8AfCT+2/CWl+HNBtdJvNQ1az+zWNrLF5vm3X/PW7l/5ZeV/0y/5ZebXpn/BNnR59B+Pv7QHhW+1b7beWvjyWSaaWHyvNl/tXVZZZf8AyLXSXn7dXhzQfCP/AAjnhW+i024sNe/0zXPHk3lWv2WWXzZf+PTzf3v73/lr5UX/AE1rzf8A4Jy694x1L9rn4wf8Jjfab/bF/wCVqOpS6JN5tjLdSxWssv2aX/lrF5tzWh3Yb2X7s+2P7SgN/wCRBBF5kX+u/ff62qfxys7fWPgF40sf9V9q8H6pH/5KS1Tm/caz+4vpYv3P/Lb97W5r2g/2l8OdYsIPNl+1aPdR/wDf2Ksqp7VI/GuGH97Vzw358PjK3qOGGfzY/s/+rq5psHk+MrOuLDfxjWp/BPSPJ/e1cs4e1Hk+VVizh86veWx5AQwn7VXsnhXyIfBuP+mNeT+T5Mvn16BNeeToNvBYwSeXLD++m/5ZVnUKpbnB+Kv32qScVjzQ+fFXQXmmz3l//qPNrD+KusQfCXQf7c1yD/W/8sYa+cq1T2qWGrVv4ZX/ALM/2qX7Hb+p/KvItY/aonm/5BWh/wDf2auX1j9oTx/qUvkQX0dtH/0xhrh+u0T1qWS4s98mhgh/1/lRVh694x8HaDayT6rrttFHF/02r57vPG3jHWOb7xHcy/8AbauH+IWpedaxwfaPNklmrOpiTupZJ/z8qH0xN8cvhyf39jqv2n/rlXP6x+0tY2cvkaV4cll/6615H4Vhgs9Bt4KNS/c9a5frFU7qWUYQ7TWP2nPHF4f+JVBbW1c3Z/Fr4m/ELxHb6HB4quf9KvPL8mKub1Gb/RZJ67j9jPwT/wAJV8S/t0/+rsP3lc9SrWOj6tRo/wDLs+5PgP4In+y2/n3EkvlQ/wCurj/j9rw1LX5NKg/57eXXsmgwweA/hxca5P8Au5PJr5/02Gfxh488+f8AeR+d5lelltN3PksyqLod54D0H+x9Bt4K6DzvJ8ye4os7MwxRwVJ5PnXUdjBX1q2Pmixo+IbWS+n/AOWtEMPnSyT1JeQ/vY7f/lnFRDDPrOqR6Vb/ALq3/wBZNN/0yoeiOlK7scf8fvHcHgP4aXFvYz+Xeap+7h/65V8b6lD58vnz/wCsr1z9qf4hf8Jh48k0qyn/ANDsP3cMVeR3n+tH1r5LHYn2tY/RcowX1XBnL6x/xMviDZ2P/PKvVPscH2CMQV5P4Vm/tL4oXE8//LL3r1jzoPKrzKm569Pcr/Y/3vWjyPepJ+1Hke9BYQ2c+pSx2MEHmSS/u4Ya+yP2b/hLY/CrwRHfX0H+mS/vJpq8j/ZF+DP/AAlWvf8ACVarB/o9r/qf+mtfRHjzUreG1j0Ow/7bUHk5liv+XZzepTf8JJ4j8+f/AI94quTT/uvIqvZ2fk1c8j3rupUz5z2ntSnDpsE0tSTQwWcXnzz1chhrzv42fEL+zYv+Eb0qf95L/rqPZe1IOL+MHjb/AISTVf7Ksf8Ajzirk/3Fna+fUnkwf6+etj4b+CZ/HmvefPb/APEvtZv+/telhqX/AC7OCrUOo+Cfw9uP+Rx1yD95L/qfOr1DQbLyb+TVf3n/ADzqSz0391HpUB8uOKtDyfJh8ivW/gnEHE01SeT+6o8n/phUn2Lzv9HgqgK8P76XNSQmx1LzPIvovLi/11c/r2vC81n/AIQ7w5P+8/5fLutDxheaVoNhZ6VYwf6R/wAtjFXh47Hf8u6Z6OGw3/LyodBoMM+o6p/qP3cVdZNF5FrxWH8PYfJ0uOetz995teGemeX/APBQ/wDYCOvRXHxi+EmleXqH+s1LT4f+Xr/7bXwPP58MskE8HlyRf66Gav3I1Oax1j/R/P8AMjl/dzV8F/8ABRT9huDR5bj4xfCqxj/e/vNS0+H/AJa/9Na+pp1T58+M9N1KfTbqOeCvpD9mP9oqfR7qPStVn823l/d18t3kN/8A8uNx/wBsZa0NB1O+0fVPt0F9J/1xrtp1BVadz9NJryx1iwjvrH95HLWP/aU8Mv8Ar68L/Zv/AGhYJrWPw5qt9+7/AOmtewalP53+kQf8ta6tzi/gnpHgn4nQQWv2HxHqssXlf6mtyH4hX15L5/hzwdc3P/TW7/dRV4XDr09ndR+R/rIqseJP2hNc0e1jgn82WuGrTVI6aX749o1LXvH+sS+RfeJLLTbf/nlafvay5rPwdZy+frmuX17J/wBNpv3VeL6b8TvH/jaXyPCvhy+uZP8AnrFD+6/7+10mm/CX4xeKoo/7cvotNjl/13lfvJYq8SpiaNI9LC4GtVOk8eeKvhzqXhy88Kz6HYxW91D5ddB/wTZgh8N/AzWPCtjP5lvYeML+OH/rl5VrL/7Vrj/+GafDlnF5+uX2palJ/wAtvOm8qL/yFXqHwAHhzwroOoeHPCulRW0f9peZNDF/1yrXA5j7Wr7M7cRlNXC0faHUeNpvOsLiCvH/ANoSEXnwC8aWGf3kvg/VP3P/AG6y16hr15B9luK4Px5NPrHhLWND/wCfrTbqP91/01ir6SnseBiD4n/aQ1Lxj4wudL0rw5+1tY/DOSLR7XydPtNYtdNvtUi8r97L9uluov3UXlRReVF/21/5ZVl/B/xV8TdBivPCuuftUW3xE1Cws/7R0fydetdS1Owlili/1tzaSyy+VLL5UXlS/wDLWWLyq2PippvwB+JPgPwP/wAL3gsdSj/4Rv8AtaGLUdHv5YrCw8qXzf8ASbSL/RP3vlS/63975tcf+x/8eP2bNN1nUNV/Zf8AhlHbfZbPzP7D1bQZY/7U8qLzZfs19LLL5svlebL5UvlVoeSqf78+yPiR42n/ALL8/wAVQeX/AKHFH/rv+WteLw+JNKmv7ie+nllj8ny/skU1anxU+OWh6voP9uWM8sv2qGK5s4f+WVc38MPDdvqUsmuXFv5Xm/vIYa8nHYn2J9RgcN9bqmX8MvhLY+FftmqwWMf9qazeS3OpXf7397L5ssv/ALVr1TR9BgmtfIn/ANX5P76H/nrVyz0exhi/f+ZF/wBNa3NA0ef/AJYQfaa+f9r7Y+yw1KjRpezOfs/DfhWGK4/5cdQ/5YzTf6qq/wDwh/iMxSX19Y20tv8A9Nv+WtdZqXhT7ZL5E9jJbSf9caIfCut6ZL59vPcxf9ca6aVWrSNKmHpVTzvWPh74c1L/AI8f9BuP/IVc/Z6bqug6z/ZV9BXtGpaDYTS+ffQRSf8APbyf3ctU9Y8IeHNYijgE8vmRf9cpa7frNKqZ06VakcfqXir+x9B+z30/+qhqn8PbTVZjJ4qvvKj82HzLP/plFXYax4P0PTYo8QR3Mn/TWGKuf8ea9/Y+lSc+XXFiD0cPVtRucP4w+PH7PXgnxbJofxc8Ha/q95FDFJDNpNnayxRRf9dZZYq3If2zP2XtNv8AyND+FfjKWSL93/y6xRf+ja8v179jn4xfFrxbJ4xsdcksrO6/484v7H8z915X/PXza7jwp/wTH+I01hJ9u8fyfvf+WP8AZsXlf+jZa7sF+6pH5DndRVsxqVKZ6hZ/tpfs9f8AH/B8Ftbk/wCWn728ij/7a/62tyz/AGxvg7Nfx6VB8CL7zJZv3MUs0X73/nrLXH+G/wDgmnrkN1GP+ExufLim/cxeT5f/ALSrvNH/AOCbN9Nqn9q/2rq9tJFD5cP+mRf/ABqvX/cnzdSnVPUPh78fvHHiXwZb/wDCHiLSdP8A3vkzeTFLc+V5sv8Ay1/1X/kKvnP4keePiD4gn1Wf7TcRalLLNLLN/ra94+HHg+fwT4Ij8HT/ALz+y7y/sppZv+WvlXUteJ/EjTftvxB1ixvoP3cupS+d++8rzf3X/PXzf3X/AH9pUgqbFf4bfs1ftGTa/of7TP7Nk/h/Vv3N1p2seHvE155cXm/a/N82L/rrF+6/7ZV0n7K327/h538aIPEelRaRqF1oNrcXmk2l55kVrL/Z+geb5Uv/AC1rH8H/ALV3ir4MeMo/gT4H1XQNE0vWde1m9s/E3iGGWW1/dfZYooovKll8qL97/wBNf9bFWp+z1F4ks/8Agqp8QJ/GOqaTe6pf+A7CTUrvRIZfsN15trpX+q83/r2oPSwq0pn2hDoVjd3XnwQebWp/YM+pWsljZTxW0ksMsf72H/VVl6bN5N/58EHlSRf9Nq0NY1i+i0u4ngg/0iKH9z5M1ZVdj26Op+Kf9saHo8Xn6rqttbeV/wBNqj8N+KfDnirxRbz+HNVjufK/13k187+Nry+8qSC9nl+0f8tvNr0D9leH7HLHB/z1mrycFifa4w9/G5d7LB+0PqzyPerGmw+lR+dB5VWLOb91+4r6w+NLB/10dem6l/yINv8ASvNocTXUea9I8SQ+T4Ns4K58T/BNsN/GOf0ez/0+OvF/26tY/wBAs9KFe8aZ5Hmx4r5z/bShn1LxRb2NvXx1Y+wyz+Kj5zmmqPz/AGq5rGmz6ZLzVODvXAfXLYPP9q5PXv8AiZeLbex/55V1E037quT8H+frHjK4vj/q4qzCpudx/qoo4PIrP1L991rQvJj5tZ+pTQeVWZaMfUoPOtZIK+tP+Ce/wxMPhz+3J4P3l/N5lfJ/2OfUr+30qxg/eXU0UcNfpZ+x/wDD3+x/DlnB5HlRxQ1oefmVX2VI0P2ndeg8N+DbPw5B/rJf3k1ed/BPQf8ARZNcn/5a0ftIeJP+Ew+I0mlWP+rim8uuw8K6bBo+jW9j/wBMfWvqMppf8vD4DG1f+XZqDyIf3+Kk02z+xxSX3/PWo5oRN+4q5N/qo4K9w8sIIv8AlvmsP4teMP8AhW/w0vNV8/y7y/8A3cNdBDD53l28H+smr53/AGqPiR/wlXi3/hHLGf8A0Ow/d15uY4n2WEPdyDBfWsZc8X1i8nvLqS+n/wBZL+8rLvJv3UmK6DUof9A88VzfiWaGy0G8uP8AnlDXxy1Z+l1VZHJ/CuEzeI7zVT/z2r1SGavM/gnD/oEl/wD89a9Ih/1P4VpUMMP/AAixD++8zNbnw98H33jzxbZ+HLGD/Wzfvpf+eVYdnX15+xn8Df8AhG9B/wCE48Rwf6RdfvP33/LKshYmr7GiemeD/CulfCvwRb2NjB5ckUNc/DDPeXUmqz/6yWtjxjrH9sap5H/LOKs+tcNTPksTV9rWI/I96PI96k8/2ohh/e11mBj+KtZg8N6Ncat/0x/c1856leT6lfyX88/7yWavXPjZr3naX5EE/wC7rxu8m/1dvB+8kl/5ZVvhldmOIdkSWej3/irVI9D0r/lr/rpq+gPAfhvSvCujW+lWP+srH+D/AMMYPB+g/br7/j8uv3k01dhoFn50v9uzwf8AXGvfpUvZHkVKntSxND9johmnm/18FSf8tP3+elSVQw8/2rH8VeKv7HhksbH/AI+P+W03/PKrmva9BoMP7if/AEiWuHh8/Xr/AOwwf9tpq8fMcd7L93TPRw2G/wCXlQPh7NPBqlxfwQV3mm6P9rl+3Xw8ySq/hvQYLKLyMV0EMME3+g289eGd5c0eGf7VHP5/7uL/AJY1uTYmi/cVX07R4IYvIg/1dXP3EMX1rM0NSbxV8RtRH/E18VWWkx/88rSq80PgebzP+Ej8R3Opeb+7mhlm/dV8p3n7SGq6l/y3qP8A4XPfXnXVa9upVPDpUzl/20vgD4c0HXpPH/wyt/L0+X/j8tIf+WVfO8M1fWBvNW8eSyaHY2FzqUkv/LGKHzar6D/wTN8Y+MPEcd9qviO20Szuv+XSKH7Tdf8AxqtaWOo0v4h3U8trVfgPm/wr4kvtH1COeCvqz4D+PPEfjzS49DsdKub7/ptFD/qq9c+Ff/BNn4EeD/s99quiSa3cf8tptcm8yL/v1F+6r2zw34V8AeFbCPSrGC2sfK/dw2kMPl+VWdXPv+fZ20uG/a/xKh4vpvwB8R69zfT/AGb/AK5fvJa7jw3+zT4O02KM6tof26SL/ltqP72vZNO03SrOGSex1W28uKqeveKvCumReTffvP8AntXmYnHYvFfGelhsDl+E+CmY9n4PsdHtI/8AQYvLi/541l694kgh8yx/e20n/PWuX+JHiqDTZf7V0PVZfs8v+u/ff6qvM/EnxNn/AHljPxJ/z1rnp0j0aSR2HirxVfQwyQX195n/AFyqv+zT8SZ9TuvFGlf6zyprWTzfJ/66/wDxqvC/G3xIvv8AXieT/nnNUn7HPxOsf+E98YWN9PHFJLZ2En73/plLL/8AHa9bA07VjjzGm/qlQ+pNe17EMlvBP+8rj5te/e5nnj8usvWPiFY/8sL6P/tlDXJ3vxIsYf8ASIPLkr6insfEVNj4z+OWseKv+Gb/AAv8MvDnxN0TSLzxRpsui/2Tq3hu6vft/wD17fZLWWWKWLzZf+/tWPhv/bnwN1T4b/sr67qtlbXFhpuqRw/2jpuqRy6zLLFdS/6N5tr9li/eyxf62XzfKi/5Zf6qub+P3xs8ceCfC+jweB/GPhvw3J/wm2vaL/aPiHQft0V1a/a/3UUUUUUsvm/uov8All/yyrD+Bv8Aw1fo/wAQfD/hT/hMfCVzocWsRXs2k6d4J+w/62XzZf3v2XzYpf8Av1/zyrOrV9ijipYarWrHsnwrh1z4n2Oj2IsfK0vS7OLzpfO83/nrX0Jo/hW+021jn0qeSSOL/XRRQ/va4/wfo/hzwd4N/wCEV8OQeVb2v7vzauWnxC1XwrFHPrkEnlxf8tYa+OxuJ+tVj9HyjLvqtE9I8N6xpV5L5E88v2iL/llN+7rtNN02xh/fwaVFFcRV5fo/xC8K+KrXyNcgi/dTeZDN53lSxf8AXKWug8N694x02L+1dJvv7S0/zv3MX/L15X/tWlSO6rTPSNH16C8jk0nVdD/64/vqz9es54brz9Jgl8v/AJ41X0HXvDmsS+f58tlcRf8AkKtTUtYnm8uxvr+PzPJ/0OWH/lrFWtOqZ+yOT1iIal+48jyq4PWNB1z7TJ+/ufLi/wCm1emT6bB9qknn/wBX/wAtqw/En2GGX/X11aHTh8R7I5vUrz7HaxwXFeB/tdfGD/hA/hfqmt/bo4riX/RrP/rrLXrHjDXrGzik8ivkv4tftjfCvwf44uPCviPwrc63cWv7yGaKGKSKKX/lr/y1rKl++rch5mbY36rhKkzx/wAK/Hn4jTf2fpU/xw8SS+VN5cMX/CSXX73/AMi16Z4V8beP7yW3g/4THxlq0csP76GLUrqX/nrXrHgP/god+yvptrH5Hwk8ZRSf8toYfsEcUX/kWu403/gpZ+z1qWjST2P7Pet+XF+7/fXlr+6r3qSsfk9WF3c8Lh03406lf/uPB3ju+82aXyYv7Hv/ACpYq6SH4V/GmaK88/4H+LbmOX/U/a9Hl83/AMi19CfCX/go14H8eeKLfwd4c/ZX1v7Pf+bL/aF3qUUcX7qLzZf+XX97L5UX+q/6axVJ49/4KxaV8H4rex1X9jPUraS6/eWcV34q8v8A9tfK/wBbW5w+zPoD9j/QYLP9lrwfpWq28um3lrDLHNp00PlyxS/2hLXB+NrOxg+LWqT+fFJ5Xmyfuf8AW/8AHpVz9mP9oQfHj4L6f8VLHQ/7Ej168v5P7O+2fafsv/Ewl/5a+V+9/wBVXn/xg8Vf2D8TPEF958n+p8uH/pr5tr/9tq6RB7N4e1L9jCHwp4on/azvfBV15XxS1r7HL4t06GRzN5Vp9p+zR9fK/wBX/wCQ/auR/Z70H4ZQf8FU9YuPgt/ZH/CH3XgOw/sf+xPKjtvK+y/8sqy/gn8cv2XvhX8RvGnjj4065ZabqF/4qltvB8PifTZYr6K18qKW6litpYopYvN8228391F/yyrm/hX42+GWj/8ABTGz1z4H6rZXPhfxb4b/ALR03+yf3VrFL5V/FdRRf9tbbzf+2stZeyPVpf8ALs/SCHQdKF1+/n/5Y/6mpJvCtj/qPs9z5deb2firVZtZj/0795+9rYs5tV1iXyJ76S5t7qGWKa0/6ZUqtOrY9ajufzt/GbMPxV1Tw5BB/qtYuo/K/wC2teifs9+fDrXkY/5bVxfxO8BweD/2h/Gnhux/489B8VX+m2f/AFyiupYv/aVdp8B5v+KoxB/z2r53A/74faZh/wAi2Z9WQ+RPa/v6uad/qvwrPs5v9XVyzm719ytj88NTTT513GK9M8SQ/wDEhs4K830H7P8Ab4v+ennV6Z4k/wCPWzgrjx38E2w38Yz7OHyZetfJf7V3inyfiN5EH73yq+uIf3MMk9fC/wC0XqX9pfEu8n8+vjah9tlNP2tU4vWNen1jj/V1nz9qJpqPI965T6gy/El4bPS7ieq/wws/J0uS+n/1ktV/iFNm0jsf+es1dBoOm/Y9BjgzWZn/AMvi5PF/y3zWfeVc/wCWVU7z9z1rM6DpP2dfB8/jD4q6fB9n/d2v7yv0w0HyPh58JbzVf+mPlw18d/8ABP34e/bNUk8Rzwf62avpz9q7xJB4b8B2fhyxn/eS104Wl7Vny+bVf3x434Ihm8YePLjXZ/8AV+dXrkMP7quL+Eug/wBm6D9u/wCWktdp/wAsq+1w1L2NE+KxL9rWJLOHzrqpJvP+1VJDD9jtfPqOzE80v/TSWuo5Ersz/iF4wg8E+CNQ1ue4/eSw+XZ18h3l5faxfyX1/P8AvJZq9Y/au+IVvqWsx+DtJn/0e1rx+DvXxubYn2tU/U+G8t+qYT2lQi1H/j1/CuI+J159j8JXH/TWu0vJjNd+RXm/x4vPJsLPSoP+Wt5Xm09z2sT/AAjY+Fdn9j8OR12dn/qj9K5jwfZfY9Bt+f8AljXWeFdNv9e1S30Oxg82S6m8uGg5qeh6h+y78H774neN476ew/4l9rN5k1faniS8g8K6DHoVj+6/c1h/AH4Y6V8H/hpH5/8Ax8eTWfrGpT6xqvnT0Uqftax85mWN9rWK8P76XNSf8talh/1P4Un+tr0Dygg71l6xqXnXX9lQT/8AXarmsXv2OKuXvPEljo9hcarfeVFH/wCjaxqasuked/HLXoIb+Oxg/wCWVXPgb8K/tn/FZeI4P+uMU1Z/g/w3ffFTxvJ4jvoP9D879zXsk3/EttY4IP3UcVfR4LDeyonkYmr7WsR6lN9s8vSoD/rf3dahgghi+zwVTs4Z4f38/wDrKsQw/vfPngrvOMk/5Y/6+s/xJr/9g2H/AE8S1Y1jWINBsPP/AOWkv+phrzvUtSn1/Wf9fLL/AM9q8vG472X7umdmGw3tf3lQuWfn69L/AK+X97XWaZ4bg0eL9x/rKr+FNHt4Yvt1bFnNfXkvkTweVXz71PYI9NnuPN/cQfu/+e1dB4b0fzrqPio7Oz8mLNbmgw/8tz/q6ANDyfOl8iD/AFdSXkMA/wBfP+7o/cf6/P7uqepXkHlefOf3dc5oeD/8MB3FnqklxrnxUtraP/ljp+nWf2mX/v7XSaP+yL8K9Hljt54NS1eT/p7vP3X/AJC8qvTLP995f7//AFv/AE2rc8NaDPqXl+f9pkki/wCm1Oria1U96ll2Epf8uzD8H+D7DwrYfYdD8ORWNvF/zyhrtPDY1Wa6jgsb7yv+2NaFnP4O0eWODVYJYv8AptXQabeeAPNkn0PXI7aT/nlNWVM1qVFR2OD8VeMfH/g+KSCexl8v/nr/AMspa4+8+IU+pXXn30/lSV7R4k8eHTbDyJ7G2ubfyf8AljXi/jzQfCupSyX2hz/ZpP8AnjWns2FKoan9vDXtG8ixvvKuP+mVeH/E742eOPhvf/YfFUEn2f8A5Y3f/LKpNe8Ya54bu/IzLHWfr3jaDxtoMmleKoI7mOX/AJZTVr7I6VSRl/8ADSGlalYY+3/62uL8VfE6CYefBP8A+Rq8r+OXwZ8R+D/M8SfCu+kij/1k2kyzfuv+2VeJ/wDDRVx5smh64JLK8i/11pNWtOoa/uf+XZ9GeJPiR9stZK0P2LfFXk/HjXLGf/l68Ny/+QrqL/47XzHefGbzrXieu0/Yt+JEF5+03p8BvvKkv9Nv7b/Xf9MvN/8AaVduF/jnDmNL/ZKh90a9rEH/ADwijrh9S1KA/wDLCtjU7zzvM/cda5PUoftkv+vir6FbHwtTc+R/2ivB/jHx5Ya54V8D/wBpSahoPjyW98nSdY+xS+VdebL+6l8qX/nr/wA8q9k/4J+/s0wfD37R8RtV8R+JL6416GLybTxDr0V99li/6ZSxfuv3tRj4A6F8c/iD44+HPjHSvM0O/wBSsLnUv30sf7qK1tf+eX/XKvqjwr4JsdBij0rSrGK2s7WGKKziih/dRRV4+Y4m/wC7R62U4H979YqHN+NvCmufD3VJPFdhpUtzpd1+8m8n/llXP/8ACSaXqX/HjDbSR3X7uaH/AJZV9AWepT6bYRwX2lRXNvL/AM8v3leZ+Nv2dfB3ja5k1zwBrkukXn/La08n91LL/wBcq82nhj6T2pxc3hvVTa/8SPy5bf8A59PO/wBV/wBcq2NH8SeMbL/jxPlf9Ol3+6qOLwr8YvAdr9h8R+HJZbOL/ltp/wC8iq5pt5Br0sc9jPHJJ/37rT2Qe1NjTfiRpWsXX/E18221CL/Xeb/ra3JvFWqm1jsft3m/Zf3kM1c/N4PgvLXOuQRyf9doajsvB8Gm+XPpWqy/9ek1Z+zD6ydhD4qnvP384x5tcv4w8STw+ZVy81KDTbD9/B5UkVeN/Gz42aJ4P0aS+vp/+/X/AE1p+ybMvrVGivaVCPxhear4q/tDQ/Dl/wCVcRWcsnnf88q+L9N/Yg+O/jbxHcWNiNIlk0vUr+O8mu5rr/lrL5v/ACytf+mtfYnwl0GDUviNp/76WP8A4SPwff8A2zyf3n72K6ii/wDatfIfxI+OXxb0f4g+INVg8f31jcXXiq6trz7J5UX+ti82vVwWG9lufAZ3mX1+tY7jwT/wTl+OGsWEcH27TfL8n99NDDdfuv8AyFFXongn/gnj8YppfIn8VWVt+5/ff8S2WTzf3X/PWWWvG/Cv7XX7ScOl/wBh2Pxw8QW1vawy21n5U0X7qtzQf2rv2qJpfPn/AGmvFPmf6uaKHxJLF5Ven7I+c9oj6g+D/wCxD+0L8N9e0vVtC+LerSWdrefaZtOtNH8yxuvNi8qXzYvtX/PL/lr5Vdh48/4Jm+I/if8A8TzXNV1LzBD/AKnT/Kjli/7+18Zw/tjftQ/vPtH7Sfjr/Rf9d5Piq6/e/wDkWtCH9pb9pq8/1Hx++JFzH/yx/wCKqv5fN/8AItHsg/cn35+zp8DZ/wBnrwHcfCuxnuZbfRtYlkhh1HypLnypYopf/Rssteb/AB50e+1L4meRP5sf2+zi/wDjVan/AATl8VeN/FXgPxR/wnGq6vfXn9sRXPm65NLJL5Xlf9Nf+uVdB+05oM8PjLS76w/d/wCh/vv+/v8A9top1DKpTOX+Ffxh+B+sftBeIPAHxp0PSPEGn+MtN0vUtH/4SHTYr6KK/tYvKuvN/wBb5Usv/tL97+9/dVT174neAPFX/BSLw3B4AgtrbT/Bum2ui/ZIbP7N5Ut19q83yov+eXlXMX/kWuk8B+MND+FfxV/4W34q8HeKNSktfg/a2UP9k6PLfX0ssWqxWsv2aL/nl5vlf9Mv3Vcf+0h8SNK+JH7S/wAB/ipofw58Y+FpP+Ekl07WIvGXhW60mWWL7Vp8sX+t/wBbF/x8/wDXLzf+mtandhf4R9oaZeeRfx/v/K/fV2ng/wASHTdZt76+gk+z/wDLasOHTIIb/wD7bV0nkwf6+D/WVlV2PWon4d/tXfD2++Ff7TfxA8HX08cvleML+SGWL/lrFLL5sUv/AH6lirL+Bs08Pi2M16p/wVKs4NN/bh8aGD/V3X2C5h/8F9rXj/wZvB/wlsdfL0v3WYn3OJ/e5OfXlnMfKj4/5Y1oWc3kxdKy9Nm/0C3/AOuPrWhD++ixX3K2Pzd7nQeFZvO1SMz/APPavVPEkP7q3zXk/gn7P/wkdvj/AJ7V6x4q/cxR/v64sb/BOrDfxjD1K8EOg3k3/TGWvgP4qXn2zxvqE+f+W1fcnxB1L+zfBGoT/wDTGvgfxLefbNevJ/8AptLXyWJPt8lpmf8A8taS8/1Q+lL/AK2q+sTeTFXCfRnH69PPqXjK3sYP+WVd5zDDXD+Cf+Jl4tvNW/55V2k15RU3M6RH5/tUc0M+pSRwQf6yWjzv3tdJ8JdB/wCEk+IOn2HkeZH53mVmaVdD7g/Yz8BweFfCVn58H+qhrD/aE12fxt8S49Jg/exxV6x4Vh/4Q/4c+f5H+qhrxPwrD/wknjy81yf/AJZTV7eW0v3p8LmWI/5eHeaDZ/Y7COCtCGEzfuKj5hhqSz/c/v6+tR8qXPO86XyKz/GHiqDwf4c1DxHPPFF5UPlw/wDXWrH7+aL9x/rP+WNeJ/tgeNoIZbfwBYz+b5X+urhzLE/VaJ7GSYL6/jOQ8f17Xp9e1641Wf8A1ks3mVHDDB1rLhm/e1oQ3n7qvhW7s/XqVKysR+Ti6knryv4tTfbPGWn6V/20r1iaaDyq8r16H+2Pir5//PKtKe5z42n+6O802GeGwjgzX0R+xb8Gp9e16PxjqsH7v/ljXjfww8E33jbxHb6HBB+7/wCW1fcHw902x+HvhfyLCDypPJ8utDw8xxPsqPszrPG2uwTSR6HYj93FXNzTeT/qKz5rzzpfPgNWIpv+e9dVOn7I+XqVC5UnnCG18/NU/OgmlqOabzov+mdFQ1pfvSnqV5+5kv55/wB3XkepzX3xU8Zf2FYj/iXxTfvvKrU+M3jy+vLuPwP4cHm3Es3lzeVXWfDHwTY+DtBj/wCfiX/XS13Zdhv+XjOXG4lfw0bnhvR7Hw3pcdjY29E4+2apbwf8s/8AWTVJNeQZqTTf9V5//PWvoDxi5NN58tR3l5Bo9r599/2xhqO81Kx0a1/tW+/1f/o2uH1LxVqupapJPP8A6z/ljD/zyrgx2J9kjsw2G9qSeJNSvtSupP8AnpLUej6P5H7gT/vKsTTQaDpf26+/eXEv+pqTwfZzw2v26+/1ktfNPVnsJWOo8N2c9nF5E9bmmwfvZPPg8ys/Qft15L9n/wCWdbkMPkxf88o66DMjs5p5h5HkeXHFXSaP/wAevH+rrn+Zz/0zrU+2QWdh59YVTQsalqXk1wfjDxVqviq6/wCEV8K/8fH/AC+Xf/PL/wC21HeeJNW+IV/JofhwSRW//LbUP/jVdR4b8N6V4OsPsNjB/wBta5jQkm1KDzo/3/7v/plXaeA/iRB4VljnnMUkdeV2esQQyx+R5n/bGtyzg0rUj/r/AN5Wv1Y+jqn0BD8QfAPxCsPsPirS7by/+ev/AC1rnfFX7NnhLWI/O8BfFa50247RX8fmxV5bBDfWU37iCX91WxpvjC+02XE88tP2RwwpO/7tmb47+Dv7U3gmOS80vSrLxPaRD/WaVefvf+/UteG+MPjZrnhXWfsHjjw5faTef88dWs5bbza+pNN+LU+m2v2efVfMj/6ZTVY1jxr4U8d6VJofjDQ7HUreWH99Ddw+Z/6NrT2Z20qj6nx3qXxy8OaxYfZ5/Krz/WPiTpX2qTyL6voD42fsQ/BbxUZNV+HM9z4S1D/p0/49pf8AtlXyX8Zvg18VPgzLJP4q0P7bp8X/ADFtOh83/v7F/wAsqPaHVSNTXvidBNa+RPPFXifxs8E+APiFayfbrD/SP+WN3D+6liqS88VaVexefBfVw/jDxVqsP+on61K3NDwv4neG/H/w9kkn8Oar/aVnF/yxu6sfsK/HK/m/bX+H+lX0EttJdax9i8qX/prFLF/7VrU+IXiSe8ik8+vN/gPNBo/7Yfwz1yD/AJZfELRv/ThFXfhf4x52O9r7E/aiayn/AOPfNZ/9gX0115EHm13E2gw2f7+f/lr/AKmKrmj+G/J8yefyvM/9FV24nG+z/hnzeGwTxT1MPwr4Dn0268/SoI45JZv9Ml8n97LXrGg2elf2Xjz5YpIv+eU1cnNN9ji8iD97/wBcYar2fn+bJPBY3skkv/TaL91XnU6Tb9oz6NL2K9mbGvTT/avI0mDzP+msN5/7SrLmvTDL+/ntpZP+msPlVoWc39m2v7jzbaT/AJbTWn72tCHXv7Shjt/9ZH/01s/Lro9mjOpUK+geJb7y/I8iT/ttN5tF5pvhzUrrz9c0O2luP+mP+trYm0Cxm/19j/39s6LyLStNizBY/wDkamcXtGYd5o/hyGL9x9pi/wCus0tY+sa9YweYIPKrU16aeb/X/wCrryf42fFXw58PdAk1zxHP5UfnRW0MMP8Ay1lll8qKL/v7LWe4nUsiv8QvFX72PS4biKKS6m8uGvm/4zabBrF34osdK1WK50uw+y/bLvP2nyrqL/Wxfuv/ACLL/wAsv+eVeqfD2HXfFXxauP7c12Ty4ryKOz+yWcvlSxf88v8A2l/11i/79R/tIeD9KmtfiBBPY/Yv9Dij8q7/AHXm/wCt8qWLyv8AyF/z1rsw1JUj5PMsydV+z/5dnSfs36D4q034yaPY+MtK+zf8U3f/AGO0+x+V/rZYpZfK/wBV+682vL/iF/wxLpvxu8SaT8Rp7L/RZovsf2Sz+0xeb5Xm/vfK/wCutfTnwH03w5efEzwvpWha5FffZdB1TzvKm/1Xmy+bXyH8bP2OPipeftI+JPEcE+mxR3U0X7qa8/1UXlReV/yy/wCmVenSPm6tU9Y8K2f/AATghtbfVZ/HFjZfaof31p/wgd1JL/6QS/8Ao2uw0bxV/wAE59H/AOPLxxH5cX/PH4byxf8Atr+9rxfR/wBlf4jaja/uPDltFJ5P7maaa6/1v/PX91FWxp37HPxN0eX7DfaV5Uf+shl8m/8A3X/kL/PlUzH2p7ppvxg/4J66bFHBB4j8QeZ/0x8Kyxf+0q2NN+P37Af7uCDxV4kk/feX9r/s2/8A3v8A5FirxfQf2IfHH2q3voPtMnm/8srSzuv/AEb/AMta7SH9hvxjeRR/8UPc20cU0Xk+To8v/bX/AJa0D9qe8fBLxv8ABb4heN9Y/wCFVz6lLH/ZsUl5Nq1n5X/LWX/VVH+0h4bgmv8AQ/P8r7PL9q86WX/Vf8sqr/sZ/su+P/Afj3WBpeh2MX2rR/3sN3+6/wCWv/bX/nrWN/wU38V3vw+8LaN4Cmt44tY1/wA2P7JFLFJLFYf8tZf3X/frzaBnzp+yL+0tofwr/aW8efFT7Dc6lo91oN/9jtLSGLzb+X7VYRWv/f3/ANFV6h+3J8Zr748aN8N/EeleFZNN1DQfG0vnRfbIrnyrWXT7qXzfN/df8tbaL/v7FXh/wHg+DkPxV8/4qfuvD9h4b1SSaG0vJbb/AFUUsvlebafvf+WUVdB+0X8N/hn8Mf2ffDdvPN4Wi+J8WvWFzeXfhPxtf6lFf6Df2t15UvlXf7qL97Lbf+Qpf+WtXUOjDVKvsj9MLzQb77fJ/wBMpq2LzQbj/UfYf+uNZ/2w6xYWeqQf6u6h+0w/vv8AnrXQQzT+V/z1t/8ArtSqbHrUT8g/+Cz2g/8ACN/tfef5Hlf2p4VsLn/0bF/7Sr5n+D95/wAVlHX15/wXtsvJ/aW8J6rBB5ccvgOKP/v1qF1/8dr43+Et55Pjy3/rXy8/+Rkj7+n+9yI+0dI/48bf/rjWnB3rH0Gb/iV2/wD1xrYhmr7ZbH5s9zoPh7D/AMVRb5r1TxtNBCI680+HH/I0W/0rv/G3/H1HBXnZj/COrBfxTzv48al9j+HF5XwveHzpZJzX2Z+1RqU9n8OZDXxnP2r5XF7H3+QfwiOaaeGLpWX4k1LybCTz60JpvKrl/Hl5/oscA/5a1xHvmh8N7OCDS5L6f/WS1qXk0HSo/DdmbPRo4KLyHtWY6dP90Rw/vpP9fXun7EPgg694yk1X/nlN5deD+R719ufsN+Cf7H8OR388H7yX95WlKn7WscObVfY4Q9c+Nmvf2D4D/smCf95LDXn/AMMNN+xaX59x/rJaufGzWP7e8UW/hyD/AJ7VsaPZ/Y7SOA19bltLT2h+eY2p/wAuyxNnyvI/561JNNPDFHRDD/pWf+eVEPnzS9K9c8/cjvNeh8N6LeeI76fyo7WH9z/11r478eeKp/FXiO81ye483zZq9s/bM+IVvoOl2/gDSp/3n/L5XznDefuq+SzrE+1q+zP0bhfA/VcJ7Qkhm86XNakP+p/CsezmPm1c+2fveleAfXFyab91Xm/g+GfXvHl5PB/z28uGu81KY2elyT/8s/Jrc/YV+Es/jDWZPFV9B/o/nfua0pHLjqtGlR5z6Q/Zp+FX/CK6NHquqwf6RLXol5ezzS1HqV7Bo9hHpNiKp+bN6161KmfnmNxPtqxc/e1c8/2rL8/2q5ptnPPL59Oqc1LU0IYfJi/1Fcv8TviFB4P0H7DB/wAfkv8AqYa3PFWvWPg/RpNWvp/3n/LGvL/Dej33jzXv+Eq1z/nt+5how2G+tVjTE1PqtE0PhX4D/wBK/wCEq1z95eS16BP2qOHyNNtfI+z0WcxvJuv+qr6ilSVFHi3uEMP2yXr+7iqxqWpWOj2v26+/1f8A6Nomng021kvr791bxVyepalP4qv/AD54P3f/AC5xVw43EqlSOjDYb2pX17Xp9Yl8+f8A7Yw1Y8N6D5Mv9q3/AP35rpNH8HQabYfbr6CKSSqfnf6yfyK8X2rqnsJWI5rODUrqOe+g/wBVUcNnqupapH5EHl28Vamj2c95+/nrU07R/O/1/wC7qDM2NHs4LO1qxNNPPL59U/JnhljxP+7iqnr95febH5E8UdvF/rqANTzv3uJ6z9R1LVfG0v8AZWh/utP/AOW13/z1rD0f+3PGF1JBffurOKb/AL+12lnDBptr5FjB5UdYVTQNN02x0G1+w6VBRealPDFVe8m8mXpWfPP2nrI0LGj6bY3vl+f5tdxoPg+xvP8Al+kik/6bQ1j6NpE83+j+RL/6NrsPDej65Zxef9h8yP8A6Y0/anv1SxB8H9cvP9RfUXnwH8U2dp+4sYrmP/v1XYeFdYn039/PY30cn/XnXWQeKtK/5bwSxSf9NfNo9qctT2x85+JPhvq1nL+/8OXNtJ/0x/e15/4ks/Eeg3X7i+/1X/LKWvszVxYa7F599fR/9Mf3P7quL8YfD3w5rFrJ5E9tJ/22o+smuGqHyvN8Wtc0eXOqwS1Y/wCFkeDvGNrJY30EXmS12njz4P6VD5nn2Pl/9NYa8f8AGHw9sYJZIPPj8z/pt+6lrL2jPXpexqnjf7S37Cvhzxt9o8VfCS+/sTVP9Z5MP/Hrdf8AbKvgv42WfxG+D+qSaF4/8OXNlcf8sZfJ/dS/9cpa/Tg+G/FWm/8AHj44+zf9MbuH/wBq1l6l8FNc+NlhJ4H1X4cxeJLe6/10Xk+bFRTq+yN6mH0Px31j4hQal5hr3T9hX/gnL8Yv2lvG+j/FvVYJPDfhOw1KK9h1aaH97f8AlS+b/o0X/tWvtT4Y/wDBE/8AZl8B/Ev/AIT7xxBc6l/y0h8Jy3nm6Zay/wDTX/lrL/1y/wBVX2Zpug6HoOlxwWNjFFHFD+5iirq+sf8APs8r2f8Az8Of03wfBZ+ZPP5kkn/LaWatC8hgh/cTweXH/wBNa3JvPmtf9RFF/wAtPOlrPvfDd9qUsnkf6yL9551dOGp3I2ObvLOea6/1/wD36h82iDR768/cfvf8/wDXKuwh0eDTYvIng/ef89pofMq5Z2fr/wCjv/jVdpj7Q5fQfBOqwx/6i5/8i10Gm+D55v8AXwS1uQ2cFn/y3l/64/vajvLzyR/oPlUHNVK95DY2kXkeRJ/3+rm9S1L7HL/r60NY8SXE3+g/+ia5O8m/dSTz1zVKhl7Mz/GHiWCyikn8/wD5Y18P/tLeJNc8eeMtc8O67PJHp+l3mjeTF/zy83ULD97/AORa90+MHxCvrzxlH4O8Kz/8es3malLN/qv+uVeF/tFTedrPjSefy/8AmA/6mbyv+Yhp/wDy1ruwVL/l4eJmWK/5d0z3j4b3k83xGj0rStKttSt7W8tbb7X5P73yv+esUX/PWL/Vf6r/AJZS1Y+P3hvVbyX4ka5rnlS3lro/lwzad5UXlWsVr+9/ey/+Rf8AyFUnwZ0f/i4OnweAP7Sl0v8A0WOHyfN/exRf63zf+mX/ANqq5+0VZzzWvxE8OQeVfWf/AAjct7qV3d2ct7LF+6/dReV5X/TX91L/AMsv9bLXbTpnyVWoekfBnwrb6P8AF/wnrnkXNlcapo+qfbIpv+eUXlRRf+iq+R/jl+118afCv7XPjDw54b8ZR6bb2s1rZebpMP8ArYorWKL97/5Fr64/ZvPjGb40+D4Nc0Py7P8As2/+x/ufL/e/upZf/IteR/E+z/Yt039pHWNK+NX9m+Za2dhJZzeTLc+VdSxRSyxf63/nr/5F/wC2tbHFVPP9N/be/aT0eLT9K0r4xebH/wAsZbvR7C9l8r/rrdxVJD/wUI/ahhtbef8A4Wb5Uct55fmxeFdLj/8ARUVeyaDef8Exbywt7jVfFWiWMfnf6nUfB8vm+b/4Cy16f8I/gR+wj8btKvLj4S3mk6jZ2E0Uk11YeCZfLil/7a2EVBBkfsf6x+1t+05/aHiPXPj9q+keG7X/AEaG7/s21jlv5fK/5Zfuv+WVekfGD4e/tGeBNG/4SPQ/2jNS1K3tfK/0T+x/9K/1v/TL/W/+Qq6jQf2V/hXZ/wDEqsYNS+z/AOt8qLTZbaKWtSH9mT4ZQ2vkf2VfXMf/AE1m/wCWX/f397WZoeB/Dcfthz69Z30/xw8dfaPsfmzQ6tZ6XH/ov7rzf3UV/LL+9/dfvf3X/XKug0f9lH4H/EK6ufHHxU8K6lfapLo8Vzeat4h8VX/2ryv3vm+b5t1/qovNi/7+16hD8B/AHgnXvt3hzSvsP/Ehv4/9Lm83/nlL/wA9Zf8AnlXj/wDwUs8YWPgnwlo+heFR9pvL+z1mym06Gby/NtZbq1upf3v+q/5dov3X+t/6Zfva0Ak8H6b/AME/Pht8QdL8Y2I8Ex/2XZ39zqXm6xf30v2D+z7rzf3XmyxS/uoqy/28Pin+yh8bf2VbjXPgfrmiXMlh4q0G5mi0/R/s0sVr9ritYv8All+9i/exV81/sizaro37Tfgex8OarZW2qapr11bWeo3em/aYor+W1l8r7T/qvN8rzf8APm17/wDtOfsB6t8Mv2Q/EHxa8cS+G774hw6xpcsM3gPQZdJsPKl1W182KW2i/dXf/PXzfK83zYqDpwv8E+wfhvNBr3wg8H3sE8X+leFbC587/t1irvLOz8nS45zB+88n/ljXi/wHmvrP9m34d+eZftH/AAh+lxXn7n/VSxWsXm/+iq9k8NiebRo5/P8A+WNXVPVo7H5f/wDBwVpsEPjf4b65B/rJdH1S2/79Sxf/AB2vgP4ZT+T43t6/SD/g4W0LGg/C/wARwQf6q81m2/8ASX/41X5r/D7/AJG63r5fE/8AIxPv8v8A3uRH254Vm87Rretyzm71zfggedoNv/1xrcs/3PSvtFsfnlWnqdh8K4f+Kojr0Tx5N/p8f61538Kv+RkP0ruPEnnzX/SvPzH+EdOCPC/2xtS8nwH5P/PWvkfz/avpj9t7Uv8AiV2+lefXy/L5EI8i3r43Gfxj9EySn/sgTTVyevTf2l4tt9KxXSTTfuq5fwrD9s8ZXF/j93FWVPc9eodxDMLOKOCq95eedLipPO/e1Tmm/e1znQqehueD9H/t7xHZ6X/z1mr9DPhXo8Hg74fR/wDLL9zXxn+yX4P/AOEk8efbp/8AV2tfYnxC1j+wfBv2GD/WS/u69HA6s+Sz+r+99mcXoPn694yvNcn/AO2NdxZ/6o/SuX8E6b9j0uM/8tJa6TzvJir7LDU/ZUfZnwtWp7WsWLP9zFJViHUoNB0u88SXw/d2sPmVX8791HAK8r/a7+IX/CH+DY/B1jP/AKRdfvZqyx2J+q0ec7stwX1vGU6Z4H8WvHk3jzxlea5PP5n779zWH537qsuaapNHvZ7yKvhatW7ufsNKl7Gj7Muef7Vchm/e1nww+bVuH/XfjWZr7NI1dN8K6r8Qr+PwrpP/AC9fu/O/55V9ifB/4b6V8JfAdvpdjB/yxrg/2V/g/Bpth/wlWrQfvJf3lesaxefbLryP+WdduCpHxOf472tX2dMpzTT3l1ViGafpUcP/AEw/CrENnPeS/Z4P9ZLXrnyfUk02zn1i68j/AJZ/8tq3NS+w6DYfbrifyo4oasabo/8AZFhJ/wCjq8r+JHiq+8baz/wh3hyf/R4v9dLXD++xVb2dM7dMLRMfWLzVfi14o/6h9rNXoGj2cGm6X5FiPKkqv4b0Cx0HS47GCCtD9xDX0mFp+xpezPEq1fbEd5NP9gk/56Vc0fyNN0bz76fy44v9dNWXeTf8TSOD/lnWxZ6DfeKtUs55/wB1pcU3+q/560YnE0aSsa4bDe1Kc0N9rEX9q31jL9ji/wCPOGtDwr4VnF1/auqQeV/zxhrvNYs9Km8uCCxijjirPu5v+eBr5yrV9se1SXsTH8SefLFiCuf03TZ7yXyK6iaETRY/5aUaPZQWfemUSTabBZ2HkQf6yqem+fDLxPVy8m/6b1h6l4qsbObyDP8AvP8AnjQZmpqWsWNn/r546w5vt2vXX/PK3/55Vz+j+D9W1LxbJ4q1zVZZY/8Aljaf88q6iWb/AJ4UAbmg/wCh2vkQVYmvP3tZ9nN5Vr5Aohm84fuK5zQLyefzf3E9V5v3H7jNEs3/ADwqvP2rM0Ow0fxtY6b/AKPAa6iz8eX01rH+/rx/TdY/e/v4PKk/6410FnrEEA8iC4rb2Z9IeyaN8TtVh/cQf6yus0Hx5rk0XnzW/wD5BrxfQZvJl8+e+ijrqNH8SYlj8jXP+/MNHszlqHr9p8R5ov8Aj48zy/8ArjSzeO9JvIvP8iKSOL/nrXBw+JPO/wBfrlz5fk/vpfO8vyqkvPEmhwxRz/bpZLP/AJ7Tf8ta5am4UsMdBqXiTQrwSQX3hyS5j/55RVy954P8A+KojcQfBexuf+m2oCLy6rzfEjw5oMUkFjY/6R/q/N/561j698U9c1iWSCD/AFf+rrjOn2fsiTXvgb8FtN/07XPB2m+Z/wA+mn+b5VY+veK9K8NaX/wjngfSrays4v3cMVpD5VU5tT1WaLz76auX1jWP9K8+CeP/AK61pSp6mt2WJseVHBB+9kl/11R/2lPeGPyP9X5Pl/uoax5tYm86T/v3DVf/AITD7HL5E99H5cX/ACx86vWpUjM6SHR57y6kn/e/9tquWeo6V53kef8A9+Zq5/TfEkGp/wCvnkl/6ZRVHeWc8t1XUZnUf2lB+88j/wAi0Q69fTf6/VbaP/pjaQ1jw6b/AKv/AFUnlf8ATatC8/49Y7iARf8AbKtDGoaE15qvldfNqnNeTwy/Z5x9aIby+8qSDyIo6z9Yhn/dz/8ALSsqpn7Mr+TYTeZ+4/7a1w/xU16x8E+HLzVZ5/3cUPmVsakb6zuv389eN/tReNoINGs/Cs/+rv5v31ZUv3tb2Zlif9lo+0PC5rzVZte/tzVb3/SLqbzJruH/AJZebUnjbwfqt54c1jXL797/AGzNo3k/8tf9VrVrF/7Sr0TwT8N9K1j7Pqs99+78799/01rY8V+D9Khu7Oxn0mO5kuofMmhl/wCevm/9+pa+gpaHxOJd2dp8MfCsGpfFXS/7D8KxaRHFeWt79khvIv8AVWssXmy/9Nf/ALbUn7SH/CK2ejfFSfQ4Ioo5dBupJoZpvsPm3XlRRf8AbX/26rc+CdlZWdr5F9odtLJazS/8sfN/1tc3+1FpuqeV8QNVvtDjsbiLwrdR2f8AZ00UnmxeVF/rfNi/1v8A6KrqPEqUv+Xh6p8ANS0rU/Hnw7t7HVbb7Ra/299shivP3sXm/vf3v+f/AEVXyX+1d+yl8W/GP7VXiDxxocFjLHqk0tzNp13eRR/6L/rbWX/trFLX058B9N0rQfGXw38Yj7d9ov8AUr+ymtJZvMii8rT5fK8qvG/2nP2lvip4V/ab1z/hFdc/sn7LZ/2dD5UP+tii/df9/f3Xm/8AbX/rlS9kcNSp7I8r8B/sc/EbWPEdvceMdK+w6PLNFJqU2k+bLLFF/wAtfK83915tffHwx+LXw5+CfhKz8AfDL4A+IItHsIfLmil8rzfN/wCmv/PWvkvw3+29+1R9lt4LH4txSebD5nk6h4PtbmXyv+ustrVfUv8Agod+17pv+g/8Lisbbyv+pJ0vzfN/79RVBn9ZPvCH9qLxHNdfZ7H4H3Mskv7zyf7S/exf9df3VWJ/j98YpZZILH4EXMX7n/Wy3nmRf+ioq+B5v2/P2r9e0vEHxw1KWTyf+XTQdLi8qWpLP9t79q/ypPsPxp8QXP8Azxhls7WP/wBFRUB9ZPuD/hYXxi8SapZ/8JV4HttI0+WG68ma0m82WWX7LLXn/wC35r2laZ4It4PGOlSXNnF/akl5p1peeZLLL5VrLF/y1/6ZV4/+yL8fv2k/iR+0P4b8K/FTxj4pvtH1SG68n+0If3UUv2WX/plXef8ABSbxh4cPgPw34c1XQ/t15ql5Lc+b9s8qL7L5VrFLF/rf+Wsvlf8AfqWg6fafuT5b+AOjT6Z+1L8O/Eek/ZpLf/hPLC5sz5MUfmy3V1F/rfK/1X7ryv8AyLX0h+114J/b18SfAzx544/aF0rw3pOl6DoN1eww+HteupPK8qX915UUX/kWWX/ll/5C+c/Aesa5afFDwf4j/tWSSS18YaXJNND+9+1RRXUX7ryv+Wv/AD1r6k/bR/aE/aT0Hwb48+CHx38D6B/Y/ijwHqltpuueE9H1SW1tbqW1uvKiub6X915v7rzf3VaGmG/hHtH7Jc19r37K3gu4vv3XlabLH/36lli/9pV9AeFYfJ0a3/56RQ/ua+e/2D9SgvP2S/Cc+JZY/Ov/ACZZv+whdV9AeG9S/wCJXbzz2NTVPXwx8H/8HC2g+T8AvA+uQf8ALLxhLbf9/bWX/wCNV+Vfw9h/4qSOev2k/wCCxn7Pfjj9pb9lrS/B3wygtpNQsPGFre+VNN5X7r7LdRf+1a/L+y/Yh/aM+Hv+na58OLny4v8AXS2k3m18xmP++o++ybE0Vlvsz2D4ezf8U5b11EHeuP8Ah7NPDoMcE8H7yKuog719jQ/gI+HrfxzuPhLn+3v3FeiTXluZZPtFeb/B+b/ic1X8efE6DR/FFxpXn15uY1S8CeD/ALbHiX+0vFsdjn/VV4HNNXcftCeJBrHjyScV5/NN+6r47E1P3x+q5bT9lg6ZX1688nS5JhWf4Ch/0WS+/wCetR+NryCbRvIhm/1tamgw/wBm6NHBBWR3f8vDQo/dVX8/2rQ8N2c+s69b6V/z1m8usym7H1x+wr8N/sfhz/hI54P9b+8r0D4qXkGseI7fQ4P9XF/rq6T4P6PY+A/hXH/z08muD0ib+3vEd5rlx/z2r6TLKZ+bZtifa1qlQ6DTYfIij/6ZVoQ/vpc1Tg71Yh/cxZr6RaHzhJDewWcsl9cf8e9rD5k1fH/xy+IU/jzx5eX1xP5scU1fQn7SHjz/AIQ/wH/ZUE/+kX9fH95N+9kuB/y1r5bOsT7Wr7M/QuE8t9nS+sVCPXryeHS5J7G382T/AJ5UeFdSuPssf26Dy5KrzTVXmvP9KrwD7b/l8dh9sg+y+fmuk/Zd8K33xg8b8aVLHZ2E376aX/lrXL+FNNn8SX9vpVjB5txLN5dfcHwC+EulfCvwRH5EH+kS0Yal7U8zO8d9Vo/uzoPskHhvRo9Ksf8AWeTVOz02eY+fPWx9jnvJvPnqxDpnbNe/S/dH5nVqus7mfDDBDFXWeA/DfnS/bpxWfo/hv7ZL58/+rq58QvHkHw30HEA/0yWHy4Yq5sRV9t+7pnThqX/Lyocv8cviF/Ztr/wh3hz95eXX/kKuT8H+G/7BsP348y4l/wBdNVfQNHvru6k8R6qfNuLr95XQQ/8APDFe3gcN9Vonm4nE+2qljzvNoqOjR9N1XxhrP/COaTB/o/8Ay+Xf/tKunE1fZUvaGeFw3ta3IXPB+gz+PPEdvYw/8g+L/XS/89a9o1LwfY6ba2/kf6uKGqfhXwfY+FYreCCD/VVc17UvOPkYr5urU9rV9oe0qXsf3dMw9SPky1jz9q1Lz991rLmm8qimURzTQQ9TTPtlv6H86rXl5WfqWpeTVGZY1jUvJiziuP0zwr52vXHiO+n/AHktan+kTS+fPRNeeTWgFz7Z+66VHDeeddR1TmvPOo03/j6/fUAdB5/tRDNWf50/m/uKsQzVxmhY8/2qvNNUc15B/qKr/wCtrM0MvR9SsZpfIt55a3NNhgs/+WFamj+D9Es/Lnn8rzJa0INBsfNjg8/95XV7Q+kDR7zzq6zR72+mi/8ARNZej6PBD5f7+OP/ALbVsf8ALL/X/wDHrNWVSoBoQ2fk/wCgz1Ths768NvY1oaOf9Kjn8jzI/wDlt51aEMM+my/v/wB15X7v/U1xGhT03wT/AMSuSe+/e/8ALSq+sTWMMUkH7rzP+mNXNY8SQTXXkf6v9z/z2rDn1Kxhtef9ZWfswMPUry+mhk8j/WVzesef+78+fyvNrU1jXoIf+WH7yX/ljXL6lrPk+ZP5Eflxfu/Ommr0cNhjL2pX1j9zL+4vpJP+uMNV7PTfJuvPn8qOT/v7LR53nWvnzz/vP+eNR2epX0Mv/LTzP+/Vd4zchhghljgF9LH/ANtq1JprHyvI8iWT/rrNXP2f7n/lvJ5kv/LLyfKq5Z/YRL5E8EUkn/XbzK0Oc2NNmghuv+Xb/wCNVqHUoJov3+qyeX/0yhrPhvPSDyo/+2VV7zPlfuIJf+201ZgSalr1jpv/AB43FzLWXqXjaea1x/6NrL1iH/Sv9RL/AN/qy9T0y+m/1/m20f8ArP3tctWqbeyI9e8VX2pXXkW8/wC8ry/xv4Dn8eePLfz76OKztbP/ALa+bXaeMNe0PwdoNxff582uL8H+JPOuo577/lrNWmB/je0PJzb+D7MNe8N33wx1S3FjPFLHdf8APWu88H6l4c1iKOf+yv3kX7r/AFP/AC18r/VVh/FTTb7xJoNvquhwRySWv+pqno81/pt1JBB/o0kv7uaH/nl5tfSUj4rE/uj1zwHZwQ+Lc6VqsVtJa/660h/eeb5teb/tUQ6r/bPjjQ57iXV/7U8Hy3P+l/u4rCLzYooov3X/AO9rU8N3n9j3VvqsEHmR/bP33nTV2mp+CfgR4wivNVvrG5vpNU837Z/aOsXUsUv73zYovKll8r/tlXUcNSpoef8A7Pfjbxjpv/Cu9V8VT3P9h2E0V7+9s4vKi/4l/leb5sUVdZrE37Nnjb4v6hfeP7GWWzls/tNnd6dZxfvbqWX97/21/dVX1GynF/cWOqwSRSXVn5VnN/0y/wA+VWHr3giebzILGC28z/lj/wA9Zf3tB5vsj0iz039jv7VJANJvpZP9X/pemxVoabqX7KEEsYsfCtz9n8n9z5Wm/wD22vJ/AfhvXNX1T+w57GS28qaL97ND5v8Ay1q54q8H65o/mar9ui+z/wCrhmhm8ysvZC9kj2z/AIWT8AYZcfYfEn+pi/c2kP8A9trUs/GH7OcEvn2+leIJZJfN879zF5v/AG1/e15H8N/h7qmsWFxrl9PL/qZfJm/e/wCtrQs9N1WG/wD399c2376WOG0/e/vf3VHsjX2aPXNN174LTePNDn8K+FdS+0RfvPOu4Ypf3XlSxf8APWWWvP8A9t74b6V42+F/gvyILH7RdeKrWKzu7uGWXyvN0+68r/yLFFL/ANsq2PCvn/atP1Xz7ny5Yfs3lRTf9NfK/wDatZ/xC8K+I9esJNDsZ5P+JN420bVrP7XNL+6ii/5ZRf8AbKWWoD2aPi/xt8K/2jPgnLZweI/AGpXMeg3lr5PiG0825tpYv9b/AM8vK/1XlV94fFr9j7wND8MPEFlP4p8W63HFDr2rWdrrniSWW2iv7m1/1vlf+iv+eXm18h/t1/tUap8YNQ1j4O+Fb3ytHtbyXybSKz8uWW/8qL/ll/0y/exeVL/z1l/1VeV6R8VPHHxI/aRs/jhP4/uba4l8YeZ9k+2SyyxWt1debFF/yy/0XypfK/65RRfva0HS/dH3Z/wS11i+1j9jzQz58f7q8lj/AH3/AFyil/8AatfVnhuab+xo4P8AWfvq8D/Yn+GPhX4S/CWTwB4O837HYXlh5MU37zzYv7F0/wDe/wDo2veNH1KCCw8j97/rqP8AlyejSOb+P1nPefD79xP5flXkX72vH/Et5BZ+A9QsfIluf9Dr0j9pz4teFfhL8Edc+I3iqCSXT9L+y/bP+2t1FF/7Vr5bh/4KEfsoa9o159h8R/ZriWz/ANTNXh4ylV9t7Q9OlVfsT5v02b/iaahB/wBPktbFneVw9n4w0nUte1C+sb7zLeW8lkhmrYs9eg/5719BS/gHNVPXPg/N/wAT6uk8Yfsf+HPGGqf8JUfEdzFcS/8ALE15/wDB/WPJ1mP9/X1ho9n/AMSaOef91Xm5rsaYb90fHfjz/gmnqviq6k1zSvH8Uf8A19w15X4q/wCCafxwEUkFjfWV7H7TeXX6IXk2lXkX2G4/1f8A0yo/sfSofLsYBL5dfLVKR9JSzvF0aPsz8n/GH/BPz9qHw3LbwQeAJL6zi/5a2l5WfrHwU+LegxeRffDnVovK/wCnOWWv1c1jR54f3EGq3MUf/XatjR7Ox/d2PiOC2k/67Q1n7L2p00+JKtL/AJdn4zzWet6b/wAhyxktpP8AprD5Vegfs36D/b3jyO+n/wCPew/eV+tF58N/hJ4ktZIL7wPptz/11s65/wD4ZL/Z6/0iex8AW1l5v+u+yQ1p9WOmrxHSq0f4Z833nxCnvPC8lvBP+7/1cNHhWHybSOpPjN4b8LeD/Fsfg7wdB/o8X+uqSzmhhir6jLaX7n2h8djqvtman+uuvIFaEPkCX9//AKuL95NWHZ3n2OLz56k8VeG/iLrPw+vJ/A/hyW+klrtxVT2NH2hlhaarVvZnzv8AtFePP+Ew8cXHkT/u7WvJ9T7V2GvfCX406Pfyf254A1bzP+mNn5tcnrFnqtnL5F9pVzbSf9NYfKr85q1K1at7SoftWFhQo4KnTpmX+4musXFU/wDR/t3/AG2qTzv3smBWp8K/CsHjz4q6f4c/5Z/6yatB1aqpUT6c/Yh+Bv2yWPxxrlj/ANcfOr68/wCEb/tKKOCCD93FXF+A7PSvB/hy30qD/llDXUab488iXyIBXo0qfsj4HMsTWxdbnJNT02x0eXyL6fyqNShg0jS/t0/+r/5Y1c+26VqX/E110Ry+VXD+KvGH/CSa9HY2/wC7s7WtzyfZnWQ69B4b8O3HiPVZ4o4/+eNeR6leX3jzxHJ4q1z/AFf/ACxirU168vviFdRwQT+Xp9r/AKmH/nrR/wAI5PZxfuJ69DLcD/y8qHLjcV/y7pkcHepKrzQzw9RXF/Fr42aH8MdBknmnjl1CWH9zDXrVansaPtDmw9Oriqvs4HQXnjbSpvFtv4Asb7zdQl/10UP/ACyir3j4V+GrDR7W3gt6+C/+Ccuva58TviX4s+IHiOGWS4l1Ly4ZZv8AnlX6GeCYZx5eLGT/AL818xjcS8VVPoMNTWFpch0GsQ/va5fWf9b+4rsJtN1W9/5cbn/vzXF69DfWd/JBPYyR/wDXaGsqSIuc/r00/wC7ggrPmvDBFVzUpvWufvJu9bAR6xrE8MX7j/WVn2fH7++/1lWJpqpzXlaGYXl5VOab7Z+/8+o7yYzS+RVfzoP+WFxQBcmm8iKrGmzf8tzWPNN5tamjw+tZmhqWc8//AC3qSG8mml/cf6uq/E01WIZvJ/cVzgSeTBN1qObHleRBVziGLtHWHqWsed5kFjQaGxoOr/Y4v3Hlyf8AXaaukh1j/nhPF5kX/TGuL02z8kSD7DHL5v8Ay2imq5ps32PzPs8Efl/9dqr2Z9PUqHaQax5P+v8AKi/5aVqQ6zBBL9u/5Zy1xfnX3/Lf91HFWppupQQ+XxF5dHszP2p2kGvf8+P+s8ms/XvEk4l/fzeZH/z186pNN8j7LJP58Xmf8sYoqw9ShgmluPI8zzP/ACFFR7MPaheaxfQfv/tH/kasvUtenvPM8iCX97/rpaLyWCaL9/5ktZd5++lk8/y44/8AnrNNXRTpGftSv9sg837PBPbf88/Om/e0Q+RN/px+zSx/89pf+WVR/Y4PK+3eR9pj/wCWMMX7qKtjTf7V8qODz4/+uNpD5tbEFez8N/a/3888vmS/88ofLos9HsYf9C+w+V5X/f2ugh8+aL/TtV8r/rjUnk2P2X/Xy/8AbatDH2hz/wDwjfncZ8qrlno1hD/r/wB7/wBsasTTQQ8QTxRyVTvLwzy+RPPJ5n/XHzaDE0JYYPK/5Z23/fqsvUryxsv9f5VV9Smnhi/0i+lj83/tlXP3mgz6lN+4nuZf+uNctSodVNkmveMNKh8wTj/tlXN6x4qvtSi/4lNjJL/11/1VdRo3wxsYv9O1WxluZJauaxo9jptr9u1XyraOL/llXKa+1PB/ipaX0Nhbwa5/rLqbzP8AtlWH4bmnhuo/IgrU+Kmv33iTx5ceeP3dr5UcMNV9Hs58ef5Fephqf7k8PG1Pa1T0Dw34k8m1jg/6bf6mauovPhjfeNruS+0OC2/56Q+V/ra4PR7Ofyv+uVesfB+8ns7qvSw1Q+bxtNHJy+Fb6H/Tp4Lny4vK8mG7s/K82Wq95o+uWdrH58Fz5fnfvpv3vm/8ta+nLOHStT8u+nsYpf8AnjNLDR4k8B6V4ksJLG4sYv3o8v8AdV6R4ns2fN8Pja/hv476+/e/vopZpf8AprWhZ6x511J5/wDy1h/5Y11Gpfs932j6n+483y/O8yuo8OfDfzpo9K8iPzIof313/wAsvKoOc4/w35EOqSTz+bL5X7v/AKZV0Gj6DfaxLJodxBcxW8v7z/ll/wCjaks/CuuWevfYbG+82SL/AF0Xnf63/P7qrGsXnjmzis59Vsf9bN++83/W1mB1k39leD9Gt9KsR5vmwy20MUP/AC1/6a/9/ax9B8N2N7FpcHkXv7q8/fXf/PWXyq5+zm1W8+zz6rpVzFHL/qZYf3v72vQPB/hWeaLT/t19+887zPK8n91F+6oNDD8K6P8AbIv9BnuYrewm/wBM86GL91L9qilroPG3hueeLWIIIIo5JfDctzN+5/1vlV0HhvwTBZxXhsf3f+mS+d++q5480HzvAeqefP5n/EhuoofO/wCmsVBofmn+1R4D8OfCX4oWeuQaHF9nutNikmil/wCWvmxf8fX2nzZZf+WUteX+AzBpug2cHkR/2hFNFcw+d+6uovKi/wCev/bKKvcP29vDc9n438P/ABGng/4l+s6DFp00s3myyxSxSxeV/wBcov8Alr/qvK82L/prLXz3p2veTa3Hhzw3P5tvdXkX76GH97FL/qv/ACL+6/7+/wDLL/VUHGfrh+z3rA+1apYz/wCrl0HQbn91/wBevlf+21eyeG7yC8sLiC+8r/XV87/s36lfTXWqT/8AUt6XHZzf9crrVYq9o8KzZivPI/57f62g9GlU0PI/+Clmg/bP2HviZYwGOXytB+0f9+pYpf8A2lX4L/8ACSeTLX9CH7b2m/8ACSfsb/FjSvI/ef8ACt9e8n/rr/Z8tfzhzTX3m/6+vMxFT2R7+W4ariqPuH0R8N/id9j0uPSp7HzPN/5a16JpviTt59fPfgnUvsdrb+fXpGm6x+6x59duGxN0c+JpWPfPhv4wNlFcX0E/+q/eVlxf8FMvip4b1m40P/Rrmzim8v8AfVwem+MBpnhLUJx/zxr5XvPG/wDxPryfz/8AWzUYmpRYqVKtVP0Y8N/8FQ/J8v8AtzwdFL/1yr0zw3/wVE+DupeXBrmlXNt/2xr8r9N8edMT1sQ+MB5X+vrm9lgx+yP1w8N/tvfsyeJJf3/jGKL/AK616Z4J+LX7PXiSWOeD4jabL/22r8Q5vGHt+FFn8QtV02Xz7HVbmL/rlNXNUw1E0P300fXvAE3+j6HrljJ/22rL+J2sQeG/C95rgvYvL8mvw/039pz4m+G5f+JV4/1KL/t8r2T4Y/tUfGnxt4IuIPEnjK5ubeX93D51ZrC6ge0XniqfxV4y1DXJ5/M82atSDWBNLHXlfhvxUbOw/wBfXQWfiowxf9NK+kw1L2VE8mrU/fHolneT6lfx2MFfXHwf8B2Oj+F7f7dfSx/uf33k18V/D34keDvCuvW+u+Mb7yreKvozwf8AtsfA+8sPIsfHEcXm/wDLKavNzH2tX92dOH3PYNe8KeFZov8AiRwfabiX/ljLDWPqXwZ8HaxYRwa54AsZI/8Alt+5o8B/tFfCS88s2Piqxkk/67V3Fn8QvDniS6/0HVbaT/ttXgfVmelTxdf/AJds8j8YfsT/ALNniSOPz/hjZRSS/wDLXyYq5fw3/wAE2PgP4P8AGf8AwnHg6CW2vPJ8v/XS+VX0pDo9jrEvn308X/bKrk2j2M0XkQfu6X1Y6f7Rxn/Pw8D1j9m/VZpf+JH4jrh/En7N/wAd4Yv+Kc8SW0kn/XGvqSHR59N8zyK5f4heNv7BtZLGDy/tEtH1dmX1mqfL+j+Gvi34V+0WPjjXPtP/AFxrm9Y1K+1LVZNK0r/V/wDLaWu4+MHj37Ha/wBk2P7y8uv/ACFXB6Z/xLYvPt/9ZXdgsF7UzxGJNzTf9Di8iD91Vz+2J/K/4+Kx4byCaLz/APlpXQfD3wfq3jzWY7Cx/wBX/wAtpf8AnlXtfwUedudR8E/hjqvxg8UR2I/5B8X/AB+S19gWn7OvwP0HRo76+8D6bJJFD/rpYa5/4M+D9C+HvhyOysbHyv8AntXoEPjDQ7y1ksZ7HzI68bE4n2p2Uv3Jh+FfB/wrhP8AxR3g6xi/64w10lnZ6VZddDi/781n6PrHgDR5f9Bn+zSS1sTa9pU3/Lfza5rI1uwvJtK/132GPzP+uNeN/EjWLLWPEdxBPBH5cX7v/U16B4w8eaHo9rJfX3mRxxV81+D/AInXHj3X9U12DzPs8t5L5Pm1NU1pEniTR4PNk8g1xepabPDXaaxqXnS5xXP6jeQf4VJp7Q5O8h7Vn6lP5NrJPVjXvEljZ3X2GuT+JGsQXnhyT7DP+7loNPaHN6l43nm17yIJ66jTfP8AK8+vO/B5t/7ejnvoJa9A1jxJBZxRwWX724l/1MNBiXLy88ny/wDnpWxo8M83+vFcv4V02+mv/t2uX0Usn/PKvQLOHyaxqHQEMP7qrFnCYYvPnNV7y8g02Lz81w+sfELXJvEf9lwaHLc/9Moapammh0njDWJ5v9Bgn8qP/ltUnhvwprmvWvkQf6Nb/wDPWarGg/D37ZLHqviODy/+mNd55P8AZtrHBB5Xl114bBf8/Dkq4n/n2Yem6P50vkTwS+Z/z2iqT+x76zm/fz3MtalneQQ2vkT+VH/1xmqxNeT2cWP3fly/6m7rkPrzLh+xf6iCe58v/ljLNR+/83z4D5v/ACzmovLyf7VJ58//AJBqOHWIBdeQJ/NjoA3LPUp/+PGDzPM/641Xmhg/0j/R/wB3LDUYhn+1R30Gq+V/yzmrcm0Hzv8ATvP8vzf+W1dBmc3Zw/upPIgkijqn/Zv72Sfzo5P+m0MNdRDpsENr5H27zarxeRZxSefPFFQBxd7DPd2sc8/mSSed/wAennfvZa0NN/t0y+RPYxf6n/n8rc/s3Q5rWOx+w3Mv/Pa7lmqnMfDkN1/p1jJH5X+p/fSxVoBJpv8Aas0kdj58UXlf8soq2LOGcD/Tr6X/ALYw1l6bNYzXX2ix0qKL/ptLNXSWdn53+vnk/wCuUNBy1SvmeH/nl5f/AE2qvNDYzf6/zbn/AK41uT6DY/8ALexj/wC2tR3k2lWf7jyI/MrKqYnN2emQ+b589j5VWLwaVZ+XzbRf88ar6x4kg82SxsZ/tMn/ADxtIfMrHvPDfj/xTL5E/lWVv/02/ey1zVDqp0w8SfE7Q9BizBPJcyf88Yv+Wtef69/wlXiSX+1fEcH2a3/1kNpXoEPw38OaDF9u/wCPm4/56y/62uT8YXk80UkHn1itztp06VjwvxJ/pnjLUJ8f8tvLrc0Gz879x5H7z/ltWRoNl/aV/J+4llklm/5Y13/gnwdqt5dRwfZ5Yo/+es1exS2PksTU1Nzw3oP22KOC3/ef9Mq9Q8B+CNVs5Y5/7Kl/780eCfDcGm2scEEH7uvQNH0fNr/r/wDVV00jxMTUK8Oj30Msn+g3P/bGGtjTZv3XkTGTzP8ArjVyz/c/uJ66DTZtKmi/cQV0+0PN9kZdno+q3lp/x4Sf9tqk/s2fTYfs9vpUscf/ADxhh8ytybTYP+P63gjikqxDps/k+f58vmS/9Ma19qZHL3ngr+0pY9V/sr95/wA9przyqk1LwRqupWtvY+RbRR/6v/U+b+6rpLPR/wDj4/f+Z++qxealfQxR58yKTzv+WMPmUe1A5uD4b65DayYsbG5jlm8zyv8AVf8AXKrEOm6VpsvkTaVJbSf88bub/W1qQ6xrnm/v5/3fnf8APGtzUtNg8SWH2eeeKT/prFUAc/8A6mL/AJaf88/3VF7D52l/2VfT/wCth8utCy8H300Xn2OuebJF/wBMar6lZz6bf/Yb7y/9T+5lqfaGh8h/tsfso/FTxt8ObO+8HCKSPQYf+JlNFN/pV/FL/rfKi/z/AKqvh/R/gz8Tbv8A4R/7b4cvdNs/9Xea5rlnFZWtr5Uv+qlll/8ARX+t82v2YvNNsdY0u4sZ7jzJLqGWP/pl/qq+J9e8BWPjb+3PFX/CcWV9rFrNLHZ+GYbP975v/LKKWWKWKWL/AFvm+b/yy82uikceJpntH7PesT3l/p8FjYy/Z7rw3f8AkzTQ+V/x66rLF/qpf3v/AC1r3Twt/rZPr/yxrxP4V2cEPijR4LHXJdSt/wCx/Edt9rmmi/ey/wBoWsvlf9sv9VF/0yiir2DQf311J5/7rzYak0pEfxs00+Jfgt400OD/AJf/AArf23/f21lir+Zu8mPm/wCvr+niaE6lYSWM8H7uWHy6/l31L/Q7qSC4/wBZFXj40+x4b2qGxZ+ML6zlj/f/ALuKu00H42aVDa+RqvmRV5X51v8A89zUc01ctLE1qR7eIwWEqntGvfHLRJ/C9xY6VffvJa8fmm+2f6+qfn+1EM1Opia1U1w2Go4X+GWILPzf+W8lSWem30Mv/IVlqOGbyqsebD61Gpp9VompZzarD/y/ebRLN4jm48iKWqcM0EP/AC3rc03Urfyqx+s1h/2dhKplzQ6r/wAt4PKr3T4b3kGj+F7exM//ACxryea8gMsc89dBpnjzSv3fn33lV24HE+1rfvDyM2wPsqX7o9wh8VQZ8j7RWhZ+Kv3v+vzXjdp4w0qbmDVYqsal48gs9LuL63v/AN55P7n99X0f1qjY+XWFrutsdB8WvjN52qf2VYz/ALuKuPh+IVx/z3rxvXtS1W8v7i+gv5fMrD0Hxt4qh1S4g1W+/dxQ/ua8v+0tT1v7KrUqJ9KWfxU1yz/1Gqyxf9cZq0LP9qj4t6DN/wASPx/qUX/bavmP/hc+q2l15F9BH5dbnhvx5/wmF/8A2VY6VJLJ/wBMoan67ROdYKsfVnhX/gpZ+0n4b/1Hj+WX/rtXqngn/gth8YtC/wCQ5bxXNfnn4k8eeHNBv5NK1y+lsrj/AKbVX/t6xvP3+la7HJ5tP2lGqL2Xsj9kPgD/AMFjJ/i1qknhyfwP/pHk/wCuroPid+0VYwxSa5P/AMfEv+phr4P/AGJ9NsfBPhKTxVqvl+ZL+8rvNe+IU+vap9umn/d/8sYqzpYZ1awe09keqf8ACVX2par/AG5fT/vJa1Idegryez8YedWhN49sdNtZJ57j93FXtJexOM9k8B6bfeNtej0PSvK/e/8ATb/VV9ifB/4e6H8N9BjscRySf8tpq/JfU/2ivEdnrP27w5rktt5X/PKug0f9vb44aD+4g8YySf8AXauLE061UukfsZpupWPleQLio/8Alr+4nr8p9B/4K0fFvw3FH9uFtc13Hhv/AILYCGXyPEfhX/vzNXm+yrHSfcnxI+JHirwTfyeR8ObnUreKHzPOhroPh747/wCEq0aPVZ9KubKT/njNXyH4V/4LGfBbWP8AkKwXNtXqHhX/AIKWfsveJIvIg8Y21tJL/wA9aPZAe8fELXrGHwbqE995cscVnL/rq+f/AAFrMH/COfaIII4qufFT9qL4O6x8KtYvtK8f2VzJLZ+XD++rz/4Y+JLGbw5H5E9ZVNjWnudpqWpZlrn7zWIJpZIPO82SsvxV4qghEljYfvZKy/Demz6bFJPPP+8lrAsx/EkP2zXpJ56w5rO/1i/j0qDzYreL/XVseI9Ygm1T7PVO816Cyi8iD/WVoBqTWdjDF9ngt4/+efm1lz/YdHtZJ7ef/SJf+WtZ8OsX1YepeKp/7Vk/tX/Vxf6mgDsPCupZv476+/1ddhN4wg+y+RYmKvM9Bh1TXpY54P8AVy16p4P+HsEMUc99/wB+qVPDVqpr7RUjD02z8R+JNZ88zyxW9dx4b8N6V4b/AOPKDzbiX/XTVoQ6bBDF9nH7uOrH+g2cX2ivSw2Go0jiqVXVJPtn/PcVHNqUFY95rHky/uKrj99L58E9dYHWXmpWMMsf2e3/AO/tU9e+w+V/0zuv9dD5P+qrD1LUvJuo4L64ll83/llWhptnYa9L5EE9z/qf+WtfM0z7wp6dpv2yWSx8iWKT/lj5U1bGm6PcA+fPB/y2/wCWtR/8IqPsHkTf6NJ/yxm/6a0fbJ4YvsN9BF/zz/11dQGx9inmv44PsMvly/8ATH/VVYvLzzpP7Knn8z/pl5PlVl6bN9sv5IPtEcflf9Ma0LOG4hupJ55/Lk/54+TQZlfUvs80UkHkSf8Aoqs+zhvob/z/ACP3f/LH/W11kNnfTRf6d5X+u/c+VWPr0Pk30ZgMnmVoY+0M+X99d+fPPcy/9tv3VV7zQjN5c8E//bGtDyZ7z/lhLWxo9n5NAe0KehaPffu5/sMn/bWughhn/wCXG+/eVctIZ/K/19tR9i8mX9/PWZze0Yf2DfTRfv8AXPL/AOuUNZ//AAhOh/av+JrPJe/9dpquTTQQ8QQeb/02qnNr37ryJ/Li/wCuVBZYmm0rTovIsbGO2jirn9e8VeT+4gn/AO/VV9Y17/nh5stc3qUM8w/0+fyqyqnVSphrHjC+/eQf89f3dcX4kmns9GuJ55v9IlrYvLyxtJf3B8yuX8SXk95dRwT/APLWauZU/wB8aYqp7Gj7Qp/D3w3Bo8X7jzJfNr0zwfD+9zPXN+G9NghljzXpHhvTYLyKPyPL8yvaWx8LVq6m5oMEEPl4mrqNN/c9K5fRoZ7Py+K6Czmn83/pnWhw1TqLOGeaLpWhZw+R/rzWHoN571uQzVocpctLM+Z/1yhq5Z+fDFJ+4/67VT06b97IPI8z9zVizm/1nkCSKSgzNDTZvJtfIgg/eVc8nzpf9BPlyf8ATaseb/TLXyJ4P3kX/PGapPJg+yyeRfXP2j/ljQBoXlnn/X+XH/22qTR/3PmCCeL97/02qOaaCE/v55ZakhmgvJfP8jy5BXQZmhDDfw6nHP8Abv8AW/8ALGtSGznmikhn8uWsf7ZPD5c/+tkirY8795/r64zQP+EP0Sf9/PpVt5n/AFxr4H8V/Aex8Sf2xPrniPSbbT9LhsI4bS7huvtX2qXT9Pl82KWKX/W+b/0ylr78spoPt/n+fLXxH8Qvhv4q8bfEvxhP/wAJVpHh/R9GvPLvNQu7yW2uZYov3X72Xyv9VFFFXVhjnxRufBPUoPtXhf8AsOfzI/7Yv9O8n/n1i/sqKX7LL/01i8ryv+2Ve+aPNBeah5H+rj8ny/8AprXzf8B/Is7rwfAZ7aX/AIn0UkP+h/ZpYopdAli/exf89f3X/oqvpDR5h9vjgnPmyS10VTOkakPnw3Uf/LWSKv5f/jZpv9g/F/xRof8Az4a9dW3/AH6llr+nz7GM4+zxfZ6/mj/bk03/AIRv9s34saF/yztfiRr0cP8A1y/tCWvJxx9Zw3/FqHmfn+1E0x8n9xPVPz/ao5pq88+sLn2z3/SpPtnv+lZf2z3/AEqSGagDYhvPJq5DeQeVzXPwzVcgvJ4elB0Gx53lVYs7ysP+0/8AZoh1LyZelZmh1Hnfu/8AX1n3l5Uemw6rrEUn2GCWTyv9dWXeXnkyyQf8tKxpGPtEXBeTxf8ALeo5ten/ANRPfS1lzan3xWfeal9jl8//AFtdV2Zc6Ogs9YgmufI/5aVY1j4e6rPFJBY6HLc3kv8Az6fvPKrl7zxVPqUsc/7q28r/AJ412EP7Wnirwf4N/wCEV8OaVYxSf6v7X5P72uGp7a5l7RVTzfxJ4C8Y2cv/ABNbCSxj/wCmv+tr0zwT8eJ/AfhePwd4V8D21teSw/vtQm/1stSfDH+w7yKTxx8YvNvf+WnkzTVl+MPip+z1r2qfbtK8OS21xF/zxmlrJXq/u6h5z/6dnD/FSGDxVdSX3iODzbiWuX8H6bYab4os/wDiayRx+d/z2rqPHnirSde0uS40Oxkijrh9N+26l+4vvKr2qVkjzatKsffHgPxt53hizsbG+j+zxQ/ufKrrItYn8qOeCevz70fxj448N2vkWOuSxx11nhv9pz4jaDF5E+rSyx16VLG0qRxVMNWqn25eeNrDQNLk1XVb6KO3i/101fM/xU/4KHQ/8JHJoWlaVLJZxf8APGvO/iF+0j4q+JGi/wBhz/uo68v/ALHsftXn+R+8oq47+Q0pYb/n4fRGj/tXaVqVr58+lSxR1c/4aQ8HXkWIL7yq+e9Nm1w+ZBY2MstV5tHv7OX9/B5dc/1mqa/VkfRE3xb0q8H7jVI65vxt8VJ9NjjnsZ/Mrxe9vLeH9xBPUf8Aac95/oPnVl9ZNPqx7Jpvxs1yz0v7RPP5lZ95+0h4q83NjXndnNfeVJYzwVJoOg3usapHpUEH/Las/aB7KifTn7Is3jj4zfEGzvtc1W5+x2s3meT537qv008B69Po8UdjBB+7ihr4n/Ys8B/8I5p8c8EHlyV9ceG5v9F/f0qmxkdReeJP+Jp+/n/eVsf8JVPNF5FeZ/2x/wATnM8H/bWrl5r19NL5EH7qP/nrTA2Nf16CG68iCHzZKp2d5PN/pFxWXDD+98+4/wBZWhDZ315FHBY28kv/AFxrO1wLlnN9src0H4Yz6zL9ungrpPBPw9sbOKO+1Wfzf+mVdxZzWMMXkQQfu67aWG/5+GftSv4b8N6Vo9rHB9hjjrYm8iq801U7yaeaPyIK79jMLzWILP8AcTz1Xs9Yvrz/AFH+rqv/AGPbzy/v60IYYLOKg0K80M837+Yfu6PtkEP+ot6Lya4mlqPyZs+fj93WNSoBoQzQTxeRPPF/2xmrU8N2elfZfPnnl8z/AJ7RVxZm8mX9/B5f77/XQ1uWevT+V9gg/dXH/LHyq8j2R9wdBefvovsNxbyy28U3+uqnppsbzULixngl/dTfuZv+etU4de1XTYpIJ/8Alr/yxmo0eeezi/06+i/ezVqBuQ2djqXmTwT/ALuKb/ll/wAsqry/bZr/AMj95/qf9dRDNpf7uCfVfKqxFDBN+4/ey/8AXWgAhvJ/sskH2+TzP+u1WIYb6YR+fPUn2Oxhi8iCDypK0LO8gii8if8AdUGFSoSaPpsH+ZqufY4IYvPgglqvZ3kEP+ogirU86Dyv9R/razOYrwzQedUk0MEMUZ8/y6pzWf73z/8AVUTXkH+ooAJuT+/n/d1TvNS0Ozi5gllqvrF5BDF9ngH51yesalPD/wAt6DRbmhr3jCCGLyIIK4vxJ4knvJeJ6j1jU/N8zz5pZK5+9vPO8zj/AFVZnYtixd3mP3//ADyohs59Smj1WD/tjXJ+KtY1ybQdQsvDnlf2h9jl/s3zv3sXm/8ALKvO/gz+2N438bfCDxBoc/hXTY/ih4c1iLQZtP8AO/0G6upf9Vdf89fsvlRSy/8AbL/prV4ameFm2K/5dn1BpvkQ2vn33lR28UP+ursPAevaHrF/J/YfiOyvZIv9d9kmik8qvlvw3/wT98HfEjS4/Ef7V/xG1vx3qH+svP7R1iW2sbWX/plbRS+VFFWpq/8AwSL/AGQvEg+3fBbVdX8La5F/qdR8PeJJfN/z/wBsq7T5apVPsSzgg/d1oQ2fk18Z/sr/AB9+O/wH/aMj/YY/av1z/hIJL+zlk8B+N5ofLlv/ACv9ba3P/TX/AD+982KvtCz/AH3StDn9oXLPz/N5rYhm/dfv6y7LyPN/4/vKrUhm8mKOD/W0EmhDNB9qjqSa8gs5fPqnZwwfvJ5/9ZVzyYJov38HmR1oBoQXlvj9/BViaGH/AJYD95/0xrLs7zyf3EE//bKatCzmn839xBF/3+oMzg/jl8WvHHw9ls9D+FfwWufGOsXX7ya0/tiLTYrWL/ll5ssv+tl/6ZRRS/6qWvI/GH7e3xi+Cdr/AMJH+0N+xbrekeH7X/j81zwx4ktdW+wRf89ZbbyopYov+mv+qr3DxJN/afxGs4IPKiuLWG1/5bf89brzf/RVjc10njyzsdS0GTz7GO58qaKSH/lp/wAtaDMw5v2hPhXB8Fv+GjYPFX27wn/ZsVzDd6dD5st1/wAsoooov9b5ssvlReV/rfN/dV5PDL+3r+1Fa/2pZeK4/hB4fuv9TpOk6dFqWsSxf9PVzL+6tZf+vWKXyv8AVV4P/wAEwZtV17TPHnw5vp4v+EP0b4tX9z4btP8An1i+1Wtr/wCirnzf+usUUtfV/jb9svwD4b1/V/BHg+5jlk8L6Za3OvD/AJZaXFdf8esUvlf8tbr/AJZWsUUssv7r91FWY/4p5R4p/wCCY/irxJdRzz/tpfGz+1Iv+Xub4qf+0vsH/tWvnP48fs0/tz/sc6NefE2D4jXvxV8JxTS3Osfa/Ni1i1iil82WWKXzZZZYov3v/LX/AKa+V5Xmy19AaP8AtIft3eMI9Q1Xwd+yvLHpct5+5/tbxVYRX0sX/TWKK1l+yf8AXKWtTwH+2l4j8VeLY/2evjv8Mr3wT4o1SzludBtNWmivra/8r/lrbXNp+6u5Yv8AWyxfupf+uv8Aqq1W5zVKdKqcn+x/r3hXxv8ADXR/ip4AnsZLOXWNG/0uH/j5l82W6il+0/8AT1FLLLF/1yiir6o0e8/0+3t//RVfAf7Fug/8Kr+PHxg+FWhwR23huw+IXhfWtHtIf9VaxXV15sUX/gLLFF/2yr7k0e88nVLeDH/LautbCp7Hcf8APOev5s/+CpWm/wBj/wDBQ74uWM/7rzfG1/c/9/ZfN/8Aatf0gTf9d5f9dX85/wDwXImg8K/8FRfipoc9v/y+aXc/9/dKsJf/AGrXmYn96fS5JU9lVPme81iCz48+pIZvO/5b1zc2vaHNL/r6kGveT+4sf3lcPsj6T60dJo9n/bGofYa6CbwSPK/cX1Z/wr8+98y+ngrrNe1iw0G1knvv9XXt4bBUfY/vD5/G5ti1W/dnP/8ACK6tB/qKjm03VYeJ4Kjs/jZ4O87yLi+8utyH4keB7w/uNcirKpl1E0pZ/i1uYfkX/wDz4yf9+KueGtH1XxVfx6VpVj5sn/LaX/nlXsnwH02x8X3XkWP2aW3/AOW00teqalZ/DLQLC48OaHYW32iX/j8mhrwMTanV+r0/4h3f2/7U+a/G2u6V4P0uPwd4cn/ef8vkv/PWvP7y886veNY+APgfWL+SeD7TFJL/AMtvOrm9e/Zdn83/AIlXiP8A7+0U8FWpHTSx2EPI5rzyay9SvD5uK9E1j9m/4m2f/HjBbXMf/TKavP8AxJ4J8VaBdeRquh3Mf/kWtfZHT9aoGXNNVO8m/def/wA8qkm8/wD1E8FRTf8AHpTsxXRU1jxt4q17y9Kn1X/R6jvPCv8AZkUd9BfRS/8Abas/7H7frRN58NaWRgdx4P1LStetf7KGlf6r/ltVib4b/wClSTwWPlx1l/CvXtK0GXz55/KrvPEnxU8HWel+fBP5sn/PGuX2b9sTVOP17R4NH0v9/ffvP+eVcXd6xP8AZfIgq5rHiS+8SXUk89U4bPzosV006fsjP2ftSvpusX0N15H2Hza7TR9e0PTbD/ieaVXH2U39m3fn+RVyzvJ/EniO3gvv+PetalP2pn7M7T7Z50Xn6UfLjrz/AMVeKr6bVZLGef8AdxV3njzUrDw3o3kQTxeZ5NeT3n+mS+fcUU6YUv3pqZ+2WvnwVJoNnqt5fxwQQVn6bDPNdR2EB/1te6aD8Mf+Eb0a3nng/eSw/wCurLE1VSOn2Ryf9gz+V588HlV2nwT8NmbxbbwfZ/MjlrH8bXk/lR2MFewfs0+CZ/7Ut9cn/wCeMVGGqe1onDiP3R9cfA3w3Bo+l28Agr1CbXv7Ni8iCuL+G+mz/YPPnroB/rpK1OYNNvJ9S1Tz77/V1uTTQf8AHxXP6PDcTah+4gklkr0zwT8PfOP27xGf+2NaUqVaqBn+CfB+ueML/wD1Ettb/wDPaWvYPCvhvQ/Ctr5FjB+8x++mlrPs7z7HF5EEHlVYh1LMv7+vSp4b2RmbkMMHWrEHeseHU++Kk87/AKb1sBoTfvalh/1P4VSgvf8AnvViG8rMCxR/18fjVf7Z+9/19Sef7UAWPKh9KrzWdSQ+fNL0qTyYIYq5zQy5v7J1iWP/AE6KOSKH9z/01oE32OKT/QZZZP8AnlWXNps1lqHnwfvf+mNbmmwziL7RfTxSSRf88a88+y9mH9pG8ij+3Qfu4v8AntUh1L+zf3H2HzY5aJobHUov+PH95WPPNrmm3Unn/vLego1LPWPJlkggPmRy1qQ695Mvkef5tcnD9g0z/SIIPKjlmrQhmgml/cTxSSUE1DpJtYE37io4bye7l8jyKx7O8+xy1oWd55P7/wAig5Tc03EP7itSHxJ5P7iuTh1iez/fwWPm1Ym1ieaL9zpUdZmZ0H/CST3k3kQQeVWfNr19Zy/89aw5tYvvK/1EdZ83jC+hl8gmKKOswOgvNYgm8zz65PWNXgmuqy9Y1i+vJfI8/wDd1z+vaxPZ/wCogz/12oNCTWLyGa6k8+f93WHrGsQWcXkQT+b/ANcay9Y1K+vLqODz/wB3XP8AjzUr7TtMjgsbG5k+1TfZryW0s5ZJbWLypf3vlRf5/e0qRnUxPsaJ1HgmGDWP+J5BfRyR/wDTGvlf4QeKtK+Cn7ZvjzSvib5VjqGvaloN7oMOofu4r+KK1li/df8ATXzfKi/7+11nhvQfi34P0a38K/DLxHrdtZxf9SrdebFF/wCAv73/AL+xV0GpeA/ib4w0e3/4TjzfEFxFD/x6aj4PupIpZf8AllL/AMeEvk/9+v8AtrXpUqR8djsRWrVvaEfwZ8bfEb9rr4g+PPhz/wAJjqXhvUNG8bS6T9rtJvLlsNLi83yvK/563V15Vz+9l82KLyv3UX73za9Q+JH7Gd98DvhzcfEbwd+1D8X/AO0NLh8yGGLUv7W83yv3v72xu/3Uv/XL91XF/CX4cfE34e/Eu88f+Rcy6pqn7y81C08H3Vt5svlRReVLF9l/e/8ATKXzf3Xmy/8APWvozTfjN8cJtG+wz/DnTZJJf3d5/oeqfuv/ACQ/e1Z5h8r6x8YfHHx+0v8AZv8Ai38VPDktt44sPidayTQ/2bLHdS2FrLdS38vlf63yvKitv8+VX3Z/w1R8K9G8OXniqex1uLS7Dzftmof2DdeVF5X+t/exRf8ATKWvmfUv2Y/EfjD4jf8ACf8AjGe5vtUlmi877Jo9/bRWEUUsV15VtF9ll/1ssUX+t/5Zf9svK7jR/AfjGHwbqngfVYPEElvqmmy2V5DaabdeVdReV5X73zbX91L5X7rzYv8A0b+9rq9mZnumg/tUeANfls4PDkEmpSX9n9phitIbqX91/wA9f3UX7qrH/DYHgez8W3HgC+sYrbWLXyv9Eu5pYv8AW/6r/W2v/LWvA/B/wf8AGPhvWY/FWlQeJIrjzovtkNppv7r915v+qi/deV/rZf8Anr+6l8qtTxt8HvHPxC8WyeI9V0PX7mSX/SZpbSGwtpZZfsstrFL5vm/8sopZZYovKo9mHtKx7Rr37YFj4V8B2fxN1z4Zat/Y9/NaxWctpN5n/H1/qv3XlebFWp4b/ai/4TDVI9K8KeALm9k8nzP3N5F/0y/56yxf89Yv+/tePw/DH4qXnhePQtW0PVrmP7Z9t8qWHS4rb7VFL5sUsUX2/wD56/vfK83yvN/5ZVH4P+A/jnwRLbz+FfDmt23lWcX/AC+Reb+6iii/1v2r/nlFFFL/ANsv9b5VHszP2tY7j/hvDQ7zWrzw5/wh19Zaha+JJdF8rUdNi/4+ovK83/l6/wBV+983zf8AplLWp8SP2lvEfwq1nR9K8R+HLaOPVPt8nm/Y/NiiitbX7VL5v+lf88q8vm/Zp8VXmq/25PodzFqH2yWSzlu9Yik8rzZfNll/5a+b5v8Ay183zf8Anl/qq3PEn7OvirxhpdnY67Y20n2WHy4YZfFUv+q/55f8esvlRf8AXLyv9VFR7MPaVjtPhj8Z9V+IXi2Pxx/wjltLp8sMUdnDp0P+lSyxWssv+q/1v+quZYv+mUvlV7Rr3jzwPPoNxpWq6rLZebD5fnf2bL+6/wDIVfNdn+zHPNFcWOuaHolzby/8ecU2vf8AHr5v72WKL/QPN8rzZfN8qXzaks/2VrGG/jvoLHSY7iWbzby7hvIvNli8ryvK/wCPD/VeV+68r/plFWdSmaHmem/CX4jfs9/EvxpffB3xH4W1LwX4316XWtS8Pa5qUtldaXLL5vm/ZrnypYpYvKll8r/VeV5UX/PL97T+FfgPVfhj+3N8QPi3feMYtW8F+N5otS/dXn7qLWZZf3UX73/plLfRRf8AX1F/0yr2S9/Zd0O8/cT6V4Wit/3sX2TyZZIv3v7qX915X/PL915tSQ/su+HIdP8A7Kn1XRJfNh8qGaXTbqS68r/Vf637V5tHszP2Z9EeFdSg/svz9Knil/57RRf8sq+Y/wBoT4G/DmD456P+1Drnxb1u51DwvN5ej6HFeeZbfb/N/wBb9m8r97df9Mopf3vlRf6qKu0034J39npf2CDxxFFH5Pl2fnQ38n2X/rl5t/VPxJ+zTY+KvEcmueI/EdteyXWmxWU0N3Z3Un7r/W/uvNuv+mVaezCojyP4J2V9oNh8UPiprkH2HVPGU0Wo3mnwzeZ9g+yyxfYdPl/6a2sX+t8r/W+bX1hD/wAf9vfQf89q4eH4Mz6lo1xpV944uZbe6s/s03k2cXmy/wDbWXzf+mVd5/qJY7j/AJ5TVsZ0jpIbzzukEsflV/Pv/wAHCHg7/jZt4o1W4g/4/wDQdGuf/KfFF/7Sr+giab/lh9nr8P8A/g400A6b+3Npd9BB/wAhT4b2Fz/5NahF/wC0q8ypuezgf4p+bc3g+Dzf3FV5vCs8Mv8Ar66iEed0gqPR7PztUj/5a/vqypHuOn7KiegfD3R/7M0aPNcP+0V4qn0Gwjgg/wBZXpln/oel187/ALRWvf2xqnkef5le/pSoHy+7MvQfjBOP+JVfeHIrn/tj+9rtPDXg/Q9Zuo9V1Wx8uP8A541w/gP+xNH8v7f5X2iX/ltNXeXnw28Y69o39uQa5FHH/wAsa8Wrh3W/hhUpnomseNvHOm6D/Yfwy/0GP/pl/wAta83m+M3xw8Ey/wDE1nvv+u037yse88beP/hLdR2/iOx+02f/ACxmir1D4e/Fr4c/Ei1/srVZ445Jf+WU1eb+9yt3dMz/AH1Ix/Cv7bHjjTZY/t0EdzXcaP8At1aVPL/xNdD8qsvxh+yv4b8SRSX3hX/RpP8ApjXi/jz4J/EbwTLJ5+lS3NvF/wAtYq9HD5lhMVudFPEn1hpv7Wnw51i1/wBH1XypKr6z488LeJLrz4NWtpK+H/7Sngl8j95FViHxJqtn/qL6SP8A7bV6VL2DHUqs+zNS0HwrqUX+kWNtLXP3nwl8D6l/yw8r/rlXzXpnxf8AG+m/8e+uSV0mj/tOeMdN/wCP7y5I609nRNKWKrUj1DUv2e7Gb/kFarL/ANtq5vWP2e/EcP8Ax4zxSVHo/wC1pY+b/wATXS66zR/2lvA+pRfv5/KrD6lROn+0sWebzfCvxxo8v/ID82s+80HxGD+/8OXMX/XKGveLT4qeBtS8vyNUtq7DwrrHhy9l6W0kctY1MEdNPMT5L/s24+y5nq5o/kQxSQT19mXngP4f+JLX7Pf6HbSxy1l6x+xn4H1O18+x0r7NJL+8h8qauKphqx208bSPjuaGDzqjMPky+fB/rK9s8VfsrjTL+Sxsdckj/wCutc3qX7Ovjizl/wBBniuY6Sw1Y6fruDPL7yGfUpf9OnkkqnNZ+TXcal8MfGOm/wCv0OT/ALZVh6x4V1zR5fI1bSrmP/rrDUdbGiqUDD0HUoNH16z1Wcfu4pq+kNe+PHgDWPBtvY6VP5moeT/qa+Z9Ss/f6VufDGH/AE+SsqmGpVTOpV9megWcN9qd1GZ/+WtfXH7Ovhv7HYRzz/pXz/8ADjwr9s1COeevrj4J6DPLaxwaVB5sldNJWPOqbnsHhSaCysa1NN0fVdel/wCJVb/u/wDnqa0PBPwlnhi8/XP+/VdpZ+G/sflwWPlxV00sNb+IL2jI/CvhWx0GLmD95XSWd5P5v7+suHR76GX9/PWhDps/Xz67VURzmpDeVchmg8qsOGG+hlq5Z+fn9/VGhuQzQdKks5u9ZcPn/av+mdaHn+1ZgaFSQd6pwzVYhvKDQuQw1Yg71n/bPf8ASrEM1AFzzp/+WFxUc3n1H9sgiFZGseKrHQbWS+1W+ito4v8AnrU1bAk2X/38Mkc1jY/u/wDltN/y1lqSaGxhm8/z/s0kv/kWpDeH7fJ5995v/TKWo5vIvLXyJ/KlrxT7Qy5tSvbOWSeDy5LOKaifWJ9Zv7caTcebHF/rvJ/1VXJtNsZrX/jx8z/ntDRo9nBD/oUEEUUf/PKg0D7H50v7+CiaHyYv3E/7z/nlVj+0p7OWSx8jzKjnhg8rz/8AlpWhy1SSG8gm/wBd+7kqSHWPscv7iesuaaf/AF/kVTnmsZuJ/NikrMPZnYQ6l50XSqc2peSP39c3Z6lP5v8Ar6sXniTyep/eVmZVTU+2T3n+v/1dZ8t5pVn5nn/vax5tenmi8+eCWSsvUry4mi/55R/9dqDIua94qsrOaTyLf/v7XB674qn1K6/0GDzasaxqVj5X+kTy1wfjz4naV4V0u41We4+zW8X+u/6a1j7Q2pHQQy315f8A2eef95W5pugzzRSf9Na+c/Cv7YHgfTZpP+ExuLnTY/O/13k+b/6Kr0jQf23v2Xpv9f8AGKxj/wCu0MsX/tKunDVDyMyp4v8A59nsmj6PPDdfuK6zTdHnPljz68T0f9vD9kKGXyJ/jvonmf8APH97/wDGq6zTf23/ANkmby4YPjvokskv+p/1v7r/AMhV2+0PD+rVmewado858v8A1tdBpuj3H+o/exV5Xpv7aX7K8P8ApE/xp0T/AMi//Gq1P+G9v2M4YvIn+O+mxf8Abndf/Gq0p1aJz1MDi7/wz1yHQZv9T/3+/fVqQ2c//PevE/8Ah5B+w/psv/Jd7aT/ALgN/wD/ACLVeb/gqJ+wxpv+o+Kkv/bLw3f/APxqtfbUTL6jjP8An2e+f2PP/wA9/wDW/wDPKrEOj+cf3E9fN95/wWA/Ym02X/kcdbuf+uOgy1zepf8ABbz9hfQZZIBB42k8395+50GL/wBq3Va/WaI/7Oxn/Ps+vP7Gg/eZ83zKuQab9j/6518N3n/Bfj9juzi/0HwP8RLn/uG2sf8A7dVh6x/wcLfs52cvn6X8FvGUn/XWa1i/9q0fWaIv7JzH/n2foRDZ/bI4zBP5X/THyasf2OP3cHnx+ZX5tw/8HEXwyvPMn0r9mXW5P+u3iqKP/wBpS1T1L/g4igml8+x/ZQxJ/wBNfG3/ANy1l9aonTTyXMP+fZ+mE2jwf89//INR/wBmwQ1+Xd5/wcUeOOulfs2aR/29+JJZP/aVYepf8HEXx3ml/wBB+APg2P8A66zXUv8A7VrP6yH9k4s/WiHToP3nFRzaPY/avtHkSf8APOvx/vf+Dhz9rb/lx+Ffw7j/AO3O/k/9uqy7z/g4K/bSm/fweDvAFtJ/0y0e6/8Akqj6yaf2Liz9oIYYIYqk8mx/d5r8P7z/AIL2ft6zf6i+8JW3/XHw3/8Abay9S/4Lqf8ABRG8H7j4m6Tbf9cfCth/7VirP6yg/sXFH7wQ+RReQ2N5F5H+s/5aV+Aepf8ABbD/AIKTXn/NfvK/65eFdLj/APbWsfUv+Cxn/BRi8/1/7UOrRR/9MbO1i/8ARUVH1lGv9i1Uf0SWcE/2XyJ/3slfjf8A8HJlnB/w0t8P9c8n/W+A/s3/AH61CX/47Xy3D/wU4/b18SS+fqv7Ynjvy/8Ap016W2/9FV5n8ZvjP8W/jNrNvqvxb+JviDxTcWsPl2c3iHWJb2WKL/pl5tZVKgYbBWre0OLm+z4/c1c8E2Xnap9oEFZ8/au0+G+j/wCiyTz/APLWtMFT/fHTmVT2VEueK9R/s3RpJ/8ApjXyf8QtSn1LxRX0Z8eNY/szQfs/n18vw6kJvFsc8/8Az2r1sTUtRPn6Wp3ngOGxvPL0rVv9ZLN+5lr1jxhD4q8K+HLfQ7GeKWOWGvM5tHuIfs9xB+7/AOm1V7Ob4qeJNZjg8OT3Nzb/APPWX/VV5WHxNqQ/Z/uvaHSaj5HiTwlJod9BH9o/5YzS1l+FfgnY+bZwT65J9sl/5416B4b8H/bIvIvoP9Ii/wBdXL+MPB/iPwrqn9q2Oq+Xb1zPMVW/d1DKnUue+eA/BOq+D7CMf8JVc3Mfk/6marmpePPDl5L/AGVqsEfmV852fxC8R9J/Edz/AN/qsf8ACYeHLz/kO+I/3n/XavNxlLC9KYVKR1Hxm+BvhXxUf7W0qCK2uP8AnrDXz/r1n/wit/8A2Vrelf8AbWvoDR/EmlTWsdjZeMbb/trNXH/Fr4S+I/ElhJfWVvFc/wDXGtctzH6q/Z1DOkv+fh5PDN4VvIv+WsdE2j6VN/x465F/22rpPhL8H7jUvGUdj4x0q5+x/wDLb9zVf4wfDHSvDfiiSx+H/wBpls/+mte99eo+19mduntDm/8AhG9V/wCWHlS/9tqIbPVfN+z/AGGXzKj/ALB8Y2cXn/2Vc1sfD3UtV/4S2zsdV8zy5f8AntR9aoBUKcM19psv7/zYpK3NN8Ya5Z8WOuSxf9tq9g8VfBmDWNGkngsY/M8mvD9Sh0nTb+SxvrHypIqzw+Oo4p/uzOnUOw0f4/fEbQfL8jW5JK9A8N/t7/E3TfL+3iO58r/ltXg//FOTS5+3SR/9dasQ6DBP/wAeOuW0td90ae0PoSH9sDSteuvO12x8uSX/AJbV1ngP4weHPG2qW+h6HBLLeXX7uGKGvm/wH8GfiN8Qtet/Dng7Sft1xLN/yx/5ZV9ufDH4P/Cv9iH4fSeMfGM8V94klh/fTf8APL/rlXhZtnVLA/uqX8QzqHcWXwx8HfDfQY/FXxN1a28yWHzIbTzq8z8YXnhbxtfyX0FjbeX/AMsa8D/aW+Knjj4zX/8AwmPhzxHJe2f/AD6Q/wDLKvH7P4neMdHl/ca5L/3+oyl1f94xH8QKcGfVmvfCb4ZazzfaHF5n/TGsfTf2dfB2m3X27Q5/Lkrw/Tf2kPH9nzPfeb/12rrNB/a61WH/AI/tK82vb/cVTX2tY908H6D/AMIrfx/boPNt/wDpjX1B8Mf2hPgt4V0uOD7Dc2Mn/PWWGvhvQf2tPCt5/wAhWCSKuks/j98OdSi/5Cvlf9dqdOlRL+s1j9GPDX7Qnwy1iLz7Hxxbf9tq7DR/G+h6l/x465bXP/XGavzT0f4heB9SizBqttXUaP4q8mKP+yvFVzF/1yvK09kP6wz9IIdT74qxDqffFfn/AKP8Zvipo/8AyCvHFz/1xrrNB/bG+NOjfuL6e2ufK/561l7KsdCxNI+5IbzzqsQ3lfIeg/t7eI4RHB4j8HRyR/8ATpNXYab+3t8OJvL/ALV0m+tpKj2VY1pVaJ9KQ3gglq5DeQZrzf4b/GbwP8TtL/tXwrrsdzHXSQ69B5v+vrL2ljp9kdhDNB0qT91XNw+JIIYvPx/3+rl/FX7S3gDwf5kFxqv2m4/55RVl9ZojpYatWf7s9Qhh82sPXviF4c8KxSf2rrkX/XKGvnPx5+1d4q8Vf6Dof+hW/wDz2rm/7SvtY/fz38kkkv8Az1mrzcTm3sv4Z9PgeHKtb+Ie4eKv2lv3UkHhWx/ef89Zq8v1/wAVeKvGEsk+q6rLL/0yrH87yf8AlvWhDN50X+o/1VeLUx1ar/EPqMNlGEwvwUz7M/seeaXyPI+02/8Az2rP8mDR7+Sxnglij/5Y10mmzf6BHOf9ZVfWLPzpf3HlSR1654Rj/uP9fB+7qOb99F58E/l3EVWJtH1XTP389j5fm/8ATaqc3nzUGZXN5537i4nqvefboYuv7utCbTYJv9fB+8qveabP5XnwX3/bKgxqVDLm1j9z/r5ay5tZghu/389SalNceb/qPNrPvJvOP7+COgk0Ptlh/wAt76qd54q0qz6+bLVOaGx/5beXFWXeTaVD/wAeMEktZmZoXnja+mh8iC38r/rtXN6lr1weL6eqesa9cQxf6+K2jrn4Zr/xVqn2HSv3n/Pa7m/5ZVhUqjpUiTWNfvryXyLCvmP4neNtV8ba9J9un/0O1ml+xw19OfFqbSvhv8PtQ1WCf/SIof8AWzf8tZa+R+YYa82pifant4LDHD/FqbydLjg8+vL9evPsdhJPXqHxa8j7LHBP+6rx/wAYeReXUelQT/vJf9dXp4X+CcOZVPZFfwrpHnf8TWf/AFldx4Kh87VI/pWPpum+Tax2MFdR4J0a+h1Dz5/3VdFT+CeLhtzqJtSnh/1H+sqOGaCb/XnzaLyH97+4ohh8qvNuz0vaIjnmg/5YVn3vn1oTTQf88Kz7yHz/APUGtLs09oiOeGfyv9fXH+I4fOv67CaHEX7+uT17/j/k8iuqkFSxhz9qz9Ymn8ryIK1Joaw9Shnmv/IgrqOar/COg8NQ+TYfv60J+1Gjw/6BHViaGszT/l0Zc/ao/Jn83/UVoTWf/Pf86j87yq0OYz5rKeYefmq95Zzw/nWxDeeTdR/uK6DXtf8ACt5o3/HjHFJWhn7U87qOftVub/XfjUE/aszQr1n6xN/yxIrQn7Vz+pTXE2qRwQUHPian7k6jR/IhijqTUrz7bLVOz/cxZon7UHLSpknk+ddRwf8APWvUNBs/selx29ef+D7M3msx/wDTKvQNS/0Owkn8+vay2n+69oeJm1S9X2Z4v+0hr3nfuPP/ANVXifhvR77WNZjntz+786u0+NniT7ZfyQVn/D3yLSWOwvoPKkox1Q4aX8E7zUtTg0G1t/PsftMfk/6quk0f4nfY/s9jY6VFZWctZc0Okzf6Rff8sq4fxh4k/t7VPsOlfureKvm6dOtifcOLU9Mh1jXfAfxBjnvv3ul3/wDqZq9Q8SeD9K8VaDJx+7lh/c15/wDD6Gx+IXgP+yr7/j4tf9TXYfDfXfsdh/wjmqz/ALyL/ntXk4321FgeVzfD2DR7+Sxngrzv4heFLHwrrP7j975tfQnxC+wzRST/APLSKvF5/Deq+PJbieCf95FXtYHG+1onpUqntTk/h7oOueNvG9n4c8OQeVcSzf8APavryH9gP476P4X/AOEj0rxV5dxFD5nlV8l/8Ir448BapHrgn+zSRTfubuGvWLP/AIKBfH7QfDn/AAh3/CYy3Mfk+V+9r1qdLB1f4hnVp1f+XZn3nxg8SeG9QuPCvjjSo5JIpvLmmiqOHWPAGpf6dY6rcxSf88pq8/8AEmsQeMPtHiO+n/0z/ltR4P8AB+ualF/asEEv2evJxODo/wDLth9XPVNHm0rUv3FvfRSVqabo+lTXUc/kfvIv+mNc/o/wr1yaKOczxx+bXongPwrpPhWX/iaa59pk/wCeNeDib0jmqXpHUeG5vtkX2HyI5ZK5fxJ+xPY+N7+TVYPNsfN/5bV3H/CbaFo/7+xsa9I/Z1+JFj8Qrq48K65YxW0n/LGvMpVcZS/eUzL2jPO/g1/wTB+Ds3mT+Mddlvf+vuby4q5f9or9gP4VWcUcHwW8Rxf2p53l/ZIppZfNr2z4tfCv406Df+Roc/8AaVndf+Qq1Pgz4b8K/B/S7jxV8R54v7Q/6azf6qinmOZU63Oqg/aMxPgD8H9D/Y/+EEmq+KpopNYlh8y8u5a+Uv2hPjZ4j+MHi2Qf2t5WnxTfuYa+jPjN+0J+zZ8bLW88K+I/iBJbf88ZYpq+a/Enwf8AAFnLJ/wivjiPW7eX/v7XTglWdb6xiP4hrSOf8NzWPhu68+C+tov+e0Xnf62uos/DfwW+IV1H5E9tZahL/rv+eUtc/D8AfDmpRY/eRf8AXGarFn8Av7N/5BV9JXfVqU/4ntCtUegQ/sx6HZxRzz6HHcx/89YasH4J/AjyvsOuQR2Mn/fuj4e+JPip8PIvI+3fbbf/AJ4zV2l58TvBviSLyPFXgf8Aef8APaGGuGnicX7b+IYe0Z5/efsr/B28Pn6V44/78zVnn9j/AEOb/jx8cVyfxa0fVdS16T/hANDvrG3/AOmNed3k3xb0GT/j+1KOvapvF/8ALvEG61PcP+GM/FXm/wDEj8cR0Xn7NP7RnhWLz9K1yO5j/wCmU1c/+xn4k+I3jb402fg7xFrl9Jby2cv7mao/2hfjl8b/AIP/ABV1TwdY+KpY7eKb9zWlLFZq8X7D2hqnVdXkNSbxV+018N7rz9V8K3NzHF/zyh8yo7P9szXLO68jXdD8uT/ltD5Nedw/tjfHfzf+Rx8z/rrDXJ+NviR4q+IV/wDbvEc8Xmf9MYa9zDYjMf8Al4beyPqj4b/tReFfG1/HpU58u4lr1SGaCeLz6+K/2etH+2eLbeevtjR9H8mwjnng/wCWNe1hqvtUc1Sm6R6B+zf8cvhz8K/tmleI/EcdjcSzeZ+9r1C8/bG8HfvP+EVn+3f9NvOr5b/4VvofjC6/07SovMrU0H4J6Ho/7j7fcxf9cq+Xx2JtWPtcty2r7GnUqHsHir48eP8AxsfI/tWS2t/+eUNYej/aJrrz555JJP8AptXJ2fw31WzPn2PiOX/ttVPTfEniqz17+w/t0csled/FPoKXscLW/hnqkP7quo8N3nnxfv68v/t7xxpsXnz6HHc/9ca0NN+ME2m/8hXQ7mKuWrSPfpY2kesXl4JpY/8A2jVjRxbzeZBPXnem/GbwdeS/6/yv+utbGm/ELwpNdfuNVjrl9lWOn61hP+fh+mF7ZwQ/9c/+esVYepQizl/cVsalZ6rpsX7+DzI/+esNYc03nfv/ADpPM/55eTX0R8gA1KfyvInH7ysvUtN0q8i/cfupK0IbPzv9fVyHTTCfIgn/AHdBj7Q4/F9Zy+RPBUc0M83+on8uOu4vLKAWv+nQeZ/1yrHhMEJ+z3H7qP8A6bQ1mYnHzeDr68l8/wC3Vn6l4Pgh/wBffebXYeJNSsbOLMHl+ZXF69r0EMXJ8r/rtWPtDakc/r2mwQy/uJ/3dcvr15PDFJ9u1WKOOjxV48vppfI0qDzJJf3dHhX4bzXl1HqvjGf7Tcf6z7J/yyirl9ozSlSM/R/BNx4q8u+vvMis/wDntN/rZf8ArlXWaDo9jZ+ZcQQeVb2v7uGtTP7r7f8A6qP/AFcNef8Ax4+Klj8N/C/kWM/+mS/u4Yf+mtc9SoelSpKkeR/tZ/Ej+3tej8HaVP5sdrN5l5/7SrxOYedLH5FbF5eeddSX19PLJJLN5k01U5vJh/1H+srnO2keZ/Ga88n9xP8A8sq8j8Nw/wBsazJfT/vK7j4/aj/pXkQT/vJaw/Cujiz0v9/BXtYb+CfL5lU9ri/ZlzzvKrc8B3k81/8A6+sO88jzea6T4bwmaKS4q6v8I5aP8Y6SaaCHqarzTf8AXSrE1nBNL5FRzQiGLyIP3lcR2kcM37qq80PlVYmhnh4/1dE0M/lfv6CFuZ803m/8sK4vWP8Aj+k+tdnd/wCqk+lcZqP/AB/y104fY60Zd5N5MWDWXo8P22WSerHiWbybXyP+etWNHs/JtY8mus4MRUNjToZ/KrQmhqPTYf8ARasUGlJmfe+fWXNNP0rcvP33WsuaH97QZ1NzPmmn6VXq5NDVeftQZFeq8/arFV5ofKrQCvNN5UUgrD03E1/JfVqeJJvJsOBVfQbMw2v+ooObEP8A5dmhDN58VRzTVHZzQdKk/wBdL5FAqWiO0+G+m/6L9uqx8Q9S/szQLietTw3Z/wBmeHI68/8AjZrH+gfYc172G/dUT5PFVPa1jxvXtHg17VI5vP8A+W1dBqWgwWeqWcH/AC0qno8X2zxRb2NdReT6HZ/EHz9VmiijihrxMxq/vjE878eeJNVgv5NKgn8qOqej3n7qvVPC2m/A/wCJ2s3Fj4j8Ryabcf8ALGWtDXv2J/FWm/8AE18Ha7HrdnL/AKnyv3UtdOGq0aVL94dVLDXOb+D/AI8n0HxHH58/+jy19Aal4Dn17Qf+Eq8Of6yL/nlXg+j/ALLvxp166k/srw5LF5X/AD1mir6Y/Zp/4SPwroP9h+P7GW2uIv8AntXznE/8L2+HOerhqtI8j8SQ315a/v8A/Wf8toa4/R/+JDfyQfbvs3m19MeMPCvhXx54j+w+HNK8z/ntNFXN6x+zrPo91HPPB5n/AEymhrw8tzK1azMqVT2R4v4k8HX3jDS/IvtVii/6bQ15H9jPgPxvb30HlX0drNX1h8Tv2e/Dc3g2TXL77TpNx5P7mWKb/W1876b8Jdc17xlZ+FbG++0x3U3+t/5a+VX2tSVGlQuekqtKqj3zR/2e/hX+0JoOn+MfDl9/ZN5L/wAfkMMP+tqn8WrPwP8ACvxHp/gDSoI5Le1/11eieG7PSvgbo1vBBB/o9rVP4n/Dfwr8bPDknjLw55f9oRQ/8sf+WtfIYfHSq4z3/wCGcXtDz/WNe/4STVLf+yoIo/K/5410lnoMGsafHPfeVFeRfu/Kry+zmvvDd/8AYb7/AEaS1/11d5oM095dW99B+8rsxNRUwqVLnSa9ZwQ2tvWHZ+ML7wTdf8JH4cn8q4iq54q1ieGKOCeuTs5vOv5IL7/V/wDLauKlrocp9ufDH4w2XxD8EWeq337q88n99FXh/wC298B/H/xC8JSeP/hzrkskdh/rtP8A+eteV/s9/FrVbz4+/wBlfbpf7Plh/cw19kfCXx74cvZbzwdcQf8ATOaGWvOzFVcmrKpAdKn++Pzj+GP7Md94qh/4SPxxPJY+b/y6V6JN8N9K8K2EeleHLHy469k+OWj2PhXx5eWNj+7jl/eeTXJ/2lY2dpJPfT19fhcSsXQ9ofR0qSseP/FXR9U8N+FvPsb6WOSvN4fi14/0eH/kOSy/9dq9E+P3xU0PUrX/AIRzSj5snnV43qXniLyJ4PKkr18NhaFWj+8OLEWPSPhj8ctVvL+Ox8VX3+tmr3yHw3/aWl/btKn/ANbD+5r4jmE8P+ouP3lfVn7H/wAQtV8SeHP+Ec8VWMsdxF+7hmmh/wBbXzmdZdRo/vKZxYil+69ocH4w+JvxG8E+Mo/Ct9ocfly/6majTfj9fTX8mlar4UtpZIv+e1e4fGz4b2OvaDJfeR/pFr/qZa8v8B+A/CusaXqH9q2P+mRf6mWjLqeFxX/LsMN7KqdJ+y78WtDvPjnp+lT+Dora4l82OGaGo/8Agpb8E59Y+JcfiPQ/9ZLD5n/XWuf/AGdZoB+0PpelX1j/AKRFNL++r0D/AIKWePNV8H+MtHvrH97+5i86GuZ03hc3p+zLq0/ZYv8AdnxHqWg6roN15Gq2MkUlFnD51fQng/xj8JPi/YfYfEcEVtef9Nqx/Hn7K+q6PF/bnge4+22f/PGvpaeY6+zqG1OoR/s06b/xUcc9faGmw/8AEhjI/wCeP+ur5L/Zp02ez17yL+DypIv9dDLX1pDZzw6X+4/5419Fhv4JFT+Og0GHyf31dBDN+98/7PWPoNn/AKL+/rcs7Ovi8V/FP1fC0v3FMj1K8vvK5g/d/wDPauD02GD/AITz9xXompaPff2DcT+RJ/qf3M1eT+A/t03xGuLefzf3VKkYYj/e6Z7JZz3H+vFXLz7FNYfv4Kr2cPnRdasf2aZrWsj0alIrnwHYzWEl95EXmVXs/h7Y6lpck88Hlf8APGus028gh0vyPIq5N597pfkWMFZ+1EsFSP1E87mTzxFJ/wBcqw9YsrGGWS/sa0NY1LPMHm+ZWPealBN/r4PMr2D5j2jMu8mg8rz7eqcxvp4vPgnj8yo9ZvNKH+kWM/l1h3fiSezl/cQSeX/z1rMPaM2P7evbP9/PBWHr3jyxm/1/mRx1j6x4kvpvM/f/AOtrk9e16fyv39xHWNSoa0i5r3jb/nhP+7/57Vw+seJJ9euvsOh+bJJUc2m6r4wlk/5Z28X/AC1rU02bQ/DcX2Gxg82SuU6rFzw34PsfDcX9uarP9pvJf/IVakE0HlSfv/8AW/66ufm1K4ml/fz/AP2qsPx38VNC8H6NcarrmqxW1naw+ZNLNWdTU66f7o2Pif8AFrwr8PfC9x4q8R30Vtb2EP7mvg/4kfHjxH8TfGVx4qvv3cfneXZxed/qoqp/Hj4/a58cvEfn/vLbR7X/AJBunf8AtWX/AKa1xfnf8sP0rpw2G7mdTE+1/hnSTfELVfN+zwfvfNovPiFfQf6PPXNwjyf3/wDy0rL8Val5NhJPPcfvK09lRMvrNWkjl/FWsf8ACSeN/P8AP/dxV1HnW/2D/Uf8sa5/w3oP7r7dPB+8l/eVuf8ALKtaZ5NP97W9pUM+b97XafDGGD+y5IPIrj5YZ/8AX+RXefD2aCHS/wDX+VWeJ/hGlP8Ajmp/ZsEP/TL/AK60fvasTeRN/qJ/MqObIi/cf9+a4ToKc3+t6+ZVeaHzakvMZ8//AFdR+dz/AK+PzK0NqdinqX7mL9wa4fUf+P8AlrsLzU4IfMri9evPJiknrqw+xpV2Obvby3vPEf2Gex82OtyGH91XN+D4J9S1m4vp66yuo8X2ntWX7P8A49T9Ks/8sqLOH/RasVxnRsZc0372s6b/AF341sz9qz7yHtW1MDPmhqvP2q5P2qnP2rYzK9V/+vj8asT9qrzf6n8KAOf8SD7ZdR2ArQs4YIYvIrPs83msyT1qVocP/L32hSs/9dJ9a1fCtn9t1mOCsv8A10sgrtPhLpvnX8l9/wA8q0pfvawVansqJ3GpQ+TYcf8ALKvA/i1qP9pa95Fe6eNtS+x6DJPXzXrF5/aWqXF8K9tfwj5kr/D28hm+IPkZ/wBVVz4qeFb7xJ4yj+w/vJJf+WNc34DvIIfFEl9BP+8r2D4YwaVr3jyOef8AeSRf8sa+fxH/ACMSaX8Yp/D39gjxV4quo9VvtVkto/8AWfua9khh1X9mOwj+3arJe2f+r8mWvoD4e/6HoMf+qjr5v/4KEa9Yw+HPIsL6LzKKn709KnU9kd54P8eT+KvM8R2N9HHHUnkz6xcyT/bvMjlr5D+Fnx+nhsI/Dmq332b/AKbV6Z4J/at8K+D/ABlb6Hrk/wBps7r/AJe68PMsPi7fuxY397R/dntngmz/AOFb6zJPPfSf6VN+5r2jTdHsfiRpccEE/lXHk/8ALWGvJ9f03SfiR4SjnsZ/Mt/9ZDdw1JoPxUn8FeA7ixvp5ftlh/qZf+WtfF4jLq2J/f0/4h4tI6zx5pmlWejXHw5+Klj/AKPL/qdQ/wCeVeD+A/gPqvwr+LVxrk8/9paXL/x53dc38QvjxP48uo4J9Vl8yKpPhj8ZvFU1/wD8IrfCX7PF/wAta9Wm8Z9T9nULPojXtN0OHwbJ4p1WCOSP/nlNXj8PjyD4YePLeCCCL+x9U/54/wDLKvZNes/EfjzwTb+HPA/lfaP+ms3lxV5f8bPDfg7R/CUelfEae2ivLD/lrp01dOS1MJVy+pTqG3/Ls0Pip8DfDnxasP8AhJPDh8q8/wCmP/LWuT8B6DP4V8zw54jg8u4i/wDItXPgz8ftD1L/AIkdj+6ji/dw+dXceKvI8SWHn/YYvM/5YzVnUq1aX7uocPtK38Mw9S8HQa9p/wC//wC2NeN+NrPVfDct5pU/+s/5617h4PvJ4ZfsM9Y/xm+Ho1618+CD95WeFxPsq37wDw/4P3n/AAjfxG0/VZ/+e1fZE00Gj6pb+OLGD/W/vJvJr4j8YRT+A/EdvYmfypPO8yGvsT4S6v8A8JL8PreC+/eyeTXtcRewr0aU6Y57+0PK/id8YNW+IXxus/CsGh+X9vm8uG7r3iz/AOCZviPxXYR6rrnxGtvL8nzf7Pi/5a183/EjwTPeeN477StV8q4tZv3NfUnwH0f9pr4kaXp8+q339kWdr/zFrv8AdebXThczynK8J7Oodv1mtb3Cx4b/AGCfgf4bijn/AOEcll1D/ltNdw+ZXP8AjD9j/wAAfELWbzwrB4btrm3/AOfvya948SfGzw74D0H+w9Kvpdb1SKHy/tc1fPfjbxh441i6kng8SS23m/8ALK0riq8SfWv93pmftfZHzf8AFrwT8Af2XvFsng7SrH+1tYi/5bS/vPKryvw38bfFU/xVt76+vvKt/O/1UP7uvpjxJ8Kx4l8zVb7w5LfSf8/c0NeL+PPgPrhv/P8ADngC5kki/wCeUNdOHrYStR/eBTxNKqvZntE3jXS9Y0aOef8A1csNeZ3l5Y+A9ZuNVn/4960PDfgn4jf8IlHBfeHLmK4rH8VeFfHGpaNJY3/hy58yuLDVfY1jOnpWLH7HOj/8Jt8ebzx/BB5Vva/u4az/APgp9rwvPiDZ6T/zyhi/9FV6x+zH4V/4Vj4WxPY+XcS/66vm/wDbw8VQeJPjJJ5B8zyq0wVT61nftDoVR1cWeP6bD5EuYK9U+Ev7QnirwHdRwX0/2mz/AOeMteV2daln/rT9a+pxGGo1f4h2+zR96fCXw18K/jNYR+KvCojsdQ8n/U12F5o994btZLG+/wBZXzX+zHNquj2v27Q7j/VV9QWfjax8X6NHY+I4PKvP+esNZYf+0cr/AOnlM56NP/bVTDR/9Sa1LPyIYs1Ts4fJq55ME3WvJqu7ufr1FWRsQ6lfTWH2Hz/3deZ6DZwQ/E+8EFekQw+da+RB/wAsq87+HsP/ABXmoX08/wDy2rIyq0/9rpnolnD2qSzmuJpf+edSWfkebH9orQ/cQy/hQtzuqFPUrOe8ijgP7qtiH9zFHbis+bz/ALfbwQVcmvPsd1H+4rSZnTfsj9HNS17yv38H+srm7vUp7yX7RDP+8rUvNNghlz+8rLvLOCH9/P8A+Qq9Q+JMPWPtxik/cfvP+etc3qXiWeH9xP8A6ytzXvEkEMXkQQVx+vTf2l/qJ65faHbSpmfqWvQQ/wCvuP3ktSaF4Vn1j/ia655kdv8A88ajs9N0rw3L9u1WDzJP+e1R69438618iCfy46xNfaEnirU4Jov7K8OQfu4v9dNDXn//AAklj4bupIPP/eVT+Knx58D/AAr0GT+3NVitpJf9TD/y1l/7ZV8j/E79qjxV4q1SSfwrB/Ztv/yxlm/eSy1Hs2afWfZH1B8Qvjx4V8E6XJqut30ccf8Ayxh/5ay/9cq+P/jZ8ePEfxm1n9/P9m0uKb/Q9O/9qy/9Na4/UtY1zXr+TVdd1W5vrj/ntNN5tR+T50tdFOn7IzqYn2pYs6k/cQ/6iiH/AFP4UVr7Q0pUySHz5q5fxVqX2y/j0mGCugvJv7NsJL7z65/w3D9s1STVZ6o5sa/+XZuaPZ+TFHRqXkeb58FSef7VX1L/AJ4fnQcP8Irw+fN+4/1lWPOns5f9fUf7iGLyM1JDZ/uvt3n1oQSTaxqsH/TOj+37/wD57/rVeb97Ufke9ZnRSLE2vX3/AC3nlqOG8uJf+W9V/I96P+WVB1UgmmM37+ub8eXnk6X9hg/1ktdJN/qfwrh/Enn6x4jjsYKDTE1PZUTQ8E6PPZ6X58/+slroIO9FnD5MUcAFSQ+f5taHkUv3RsWcPk2tE00Hl+QYKrw3h8r9/RNeQZrjOn2oTfuYsVn3lXJpv3VU5poOlbUwMuftVeftVyaGqc/atgK83+p/Cs/XpvsdhJPWhP2rD8VTQS+XBQFSp+5I9Bh8m1knq5/yyqSGHybWOA1HQcVIpQ/678a9V+GGm/YtGjnng/1teV6N/pl/5H/PWavdPDeg6rNpVvBpWlSSfua68M0v3jOHMqv7r2Zyfxy8S/2P4Xkgg/5a1856xefY9BuL7/nrX1B8SP2Xfjh8Qoo/7K0qKK3i/wCes1eX+Kv2G/jvqVh9hsbGx8v/AK7U6mb5dfSoeIqh4P8AD288nWfPnruPDfxgg+G/xLt9Vng8y3/541uab+xD8d9HuvP/ALKtv+/1WLz9ib4jalL9u1zVbGy9/OryamY4X637T2hoqlL2p7ZN+3V4As9Lj0rQoLmXUJf3cMVZ/wAK/Ad9+1F8QZLHxxYxSx/6zyq5vwH+x/4V8K3Ueq33iP7dcRV654Js77wHfyar4OvpYrj/AJbSxVzYjOsJ7b92Z1MSU/jB/wAEqbH7L/bngCeO2vP+eVcv4P8A2UdK1LRrzwdrnhyO28QRf9+pa9E1/wCMHxNm/f8A/CY3Mn/bauTs/id44s/FEfiO+vpZfKmrPEZthatEKmJOf+Euva58H9ZuPB2q+Z9nim/1Utd5420ex8bWHn6Fff62rnxm8K6H488OW/xw0KCWTyv+Pz7J/wAsq4/Qby+02Wz1yxn8yz/5bQ189V/dVfb0zlLHwH+G+lTaX4g8DeMdDtvtEvm+TdzQ1zej+D4PAes/8I55/wBpk87/AF1euHUtKmv7fVbH91HL/rqx/jZ4b/seKPxVocH+t/5a1xU8bWxdYCxo9n4j8SXX9l6H4j+zSRQ/6r/nrXh/7RXgP44abdSQeKvCtzLZ/wDLGW0/eVXh+LXiPR9ek+warF/rq9Ms/wBpzVdYsI9K8R3H26OKu3DUquFqgfP/AIJs9d8N+XfQW8vmV7p4P+NnnaX9h1WCSO4/6a1salqXhXXovPn0qK2k8n/ljDXJTQ6VNf8AnzzxR1rVxNyKn70zNA+J2uaP8QbieeCWW3lmr2CbxhpWpaX+/rl9NvPB0NrHBPf2P/f6KpJte0Ozl8iCeKWT/pjXFUvVEc/48+Hv/Cb69Z6rBY/u4v8AntXoHhu88Y6DdRwWMEf2P/ljFWPZ+KoJrryIP9ZVy8+J3hzwrF5+qzyx0r1qoHunwr+FngeGWPx/fWNtc6x/rIYtRm/dRV0Hjv8A4W34q/5Dnj/TbbT/APljaWn+qirxfwVqWq/Eiw+3eHL7y462PB/g/wAR+JL/AMie9k+zxTfvpq56WW18XizX2n/Ls6TxL/Yeg2vkaTodz4gvB/zxm8qsO8+M3xG8H2Hn2PwBi/7/AEXm16hqXwl0PTfBsmq6XPJ9o8mWvg/42fFn4xQ69caHpWq30n77y4fJr2lkGLo/xDtw2G9seifEj/god4jhuo/Dmu/Dm9sbiWby4YZf3VeseG/B/jjxL4Xj8VX8EVlbyw/89q+L9S+Evxw8SX9n4jvtKkl+yzfaZppv9bX2Z8Pf2hPB2vfDS38Oa7qv2G8tYfLmhu/3de5hsuwvsf4Z1VMDRpHj/wAVPid4k8B6pJYwf6yqfwl+JHj/AOIV/J9unjjs4v8ApjXD/tRfFrwPqXiOSx0q++0yRTf8sqk8N/GGx8E+HLPStKgi8yWuHG4KlSq/uzhxFP8A59ntHjDWJ9B8OXmqmf8Ad2sPmV8D+L9fn8VeLbzVZ5/N82avfP2kP2kDN4Dj8D6VP/pF1+8m8mvD/CujwXml3F9PBXrZLgfZUvaGmGp+yM+zhn61saZD5MsdU4Yf9K/cVqaPD51/HBPXr7nUfUn7N+gz2fhfz/3VesaN/wAf8FcX8GdHg0HwbH5/lSSS13Gg+R/akea9bE/usuDLf3uZUzsIO9aFnD50XWs6H/XfjV2GafPkV8Kfr62NDzoPsshrzv4bw/8AFXapP/02rvJoZ4bCSf8A6Y15/wDCv/kKXn2j/WedQZP+NTPSLOtCz/1p+tZ8M1akM0HlUHUE3nzX8YgqxNeQfb4/tFjLJJ/z2qPzhZiSetCzm+2WtaGPsz7s1nxJPD/r7iuT8SeKvOlk/f8Al1j6l4wnvP3EEFYc3nzD9/PWh8d/CLF3qUF5L/p0/lx1Tm1KGzlrP17yNHi+3z33myf88a8f+Nn7SHhX4V2vkarffadQl/ew6TaTfvf+2v8AzyoNPanqHxC+JHhXwroNxrmq30UUdrD5k0sv+qir5T+JH7b19efaLH4c2Hm/9RbUf/aUVeR/FT41+OPjNf8A/FR33l2cU3+h6daf6qL/AOO1yfk+TFW3szi9oixr2sa54qv5Nc1zVZb68l/10ss3m1TqTyPeo/J/6eK09mBJ5Pm0Qw+VUef9K/49+fpVz/VViduGAfwVJemCGWoof9d+NLN/z3zQemYfja8MNrHYwT/vJaueFbP7JpccFZcM1vr2vSef/wAsveugramfP1antawVX86ea6qS8qv/AMtaoCxeQ+d/ywqv5HvUk372o/8AVUAHM0NR/wCqqSaaq03+u/Gg0JaKIf3tFB3UtWU9YvPsdpJOK5fwTZz3msyX05rQ8e6l/ov2GA/vJa0PB+j/ANj6X5E/72SWg5sbUvV9mXKkhh/dVJR5PTyKDmCH7Pj99Uf7nzajm8+GXpUfnebQZheeR/ywqnUk/aq801AB537qq8372pJ+1R/9O/6VoBHN+6rl/JOsa9/1yrpNSn8m1knrH8N2f+suAKBVTQmhqvDDBNc+RPP5f/TarE/aqc372gZ6R4E8K/B3TbqO+Oq3N9cf9ca9Eh+J2h+D4vPsdKlk8qvK/hXoINrJqtaHxI1L+zfC9xOf3VX/AGXRxNH94fN47+MbGsf8FINd02WTw5pXg628uL/lrLXjfir9vb406xrP2HwrY20X/XKvM7y8xLcX3n1J4PmsdNl8+CH95L/y2rhqZXl2Fo+0pwOX2Z3sPxP/AGtPGw/07xwbKP8A6ZVbs/8AhOLyX7D4r8VXNz/z2/fVlw/EL7HF5EH72SuTm8a+N7zxtH9hsZb2P/ltFDDXmunUqip0qv8AEPeNHvPDmm2H7/VfK/7bV0nwZ+M/w/s/HsfhyfXIpftX7v8AfVw+seD/APhPPC/kQaHLbXEsNcfpv7Lut2eqR6rPqsttcRTeZDNDXm01Rq/xKhn+6PqD45fBLVodLuPFXgc/8sfMmtIa+c7P4hf2lDcaHcTy215F/wAspq+nPgx8VJ4NBt/B3jGfzLiKHy4bub/lrXD/ALSH7NOleMZf+E4+H8EVtqH+s/df8tazw9Sgc9P/AKeHL/AH45T/AA917/hFfGMEkml6pN5c0Mv/ACyr0TxX4Dg8H38lvpVv5ul3X+k2c0P/ACyrwez0bxJeWEnhzx/4Vli8r/U6jF/yyrtPAfxP8VaDYf8ACHeKv9Os/J/0PUKyxNP2q/dmlQ6zUtYh0G1jnn/495a6DwT4w0rx5o1x4Vvv3vlVw+vXn9seEpIP+Wded/CXx5feD/Hn2G+n/wBHlrysNhmmaVf4QftFfBnVfDXjj+1dD0qSLT5f+W0NU/Dd5pXhuw+3Tweb5VfWEOg2PxI8EXHn+XJ+5r538E/DGxs/FviDwpP+9t5f9T/0yr0sNiPav2bOb2jOD1j4tareeZ9h/dVy95qV9rEvn32qy/8Af6jxhZwaBf3mhn/nt+5rm9H8K6rNLJfX19LFHXtUsNRNDUvNHvpv9IsdVk8z/rtXUeCfFV9o91Zz33/LKpPgP4J0nx58Ro9Dv55ZbeL95N/01qP45eFf+FV/EK40qCeX7HL/AKmsqiX8MD6I0DyLz7PPZf8ALWrHiv4e2PiTRpJzB+8irh/2dfFUGs6NbwTz+bJFXtk0PkxefB/q68Gr+6rGdTc5/wCDPiTSvBPgO4nnn8uTzvLrtPDfxy1zw1a/uLGK5t5f+W3nfva878Yf2JZ2EdjYz/vJf9dDWPpvkWf/AB/Qf6P/AM9oq9XBY2rhP3kDWnU9ke0eKv2kPHGm+Dbz/hHPhzq+pXF1D+5mtIfMir5D03x5rln48kg8caHc21xdTeZ5N3D5flV9MfDfXr7TLqOfwt4qklj/AOeM1euWfwx+HP7Qlt9h8VeFY5NQ/wCfvyazxHFGLpV/3lP92duGxvsj5fh8VWOj2vnwar5VcP488SeD/FUUkN95Xmf89Ya9s/aE/Yt8cfD26kn0PSrm+0v/AMixV81+KvAcHlXEEM8ttJF/yxr6TC46ji6PtKZ6VOr7U8j8Sabodnr8kGlebJJ/y2lrsLOz/wCPP+3LGX7P/wA9Yv8AllVO88Ef2aJMj95LXoHwxhsde8Of2HfQebJFWWJxHtf4Z5uJqHYax+zF8OfGHwvuNV0nzbm8ih8yGbzq+c4dN/sHS7zSp/8AWRTeXX158B9Y/wCEbuv+Ec1X/j3l/d14X+1n4Kg8E+Mrj+yrf/R7/wDeVrlON/e+zM8PV/5dnkcM372tjQYfO163t6xof9d+NdD4Jh87xHHmvcW53H2B8GYvsfhe38/y5f3Ndxo//H/59c/8N9Bvv+Ecs/IH/LGuos9Hns7+T7RXZmP/ACLzpyCn7XNqZuQzfuqvw/678aoWYnmi8jH7urn+pl/5618Ufq5cm/49ZJ/+mNcP8N4P+JpeT/8ATaus1ib/AIpy8nnn/wCXOub+GOby1kngH+tmrQw/5iztIO9akP76LFU7OH915FXLObyaDrJJofO/cCetSzs/7Ni/19Zd5Ulnezwy1oY/8vD6Ih8YaHDwL+KL/pjWP4k+M2h6PayT+fHFJFD/AK2Wb91FX5l3n7Y3xc0G6t59K8VeXH5377zoYpf3VeX/ALTn7TnxU+M2p/8ACLT+P5f+Ef8AJ8ub7JD5X2r/AO1V6/1Y/N/rp9ifGz/gpx4V1LxbJ8Mvgvqv9pXn/MS8Q/8ALta/9Mov+eteL6xearrN/carqt9Lc3Ev7yaaWbzJZa+e/Cuj6V4bsPt2hweZ/wBPdd5oHxmvofLt/EcEUv8A01hoqYb2RnTxPtT0CDPm/uK0IYax/Aevf8J7o39qwaV9m8qby66SGHyP+mlQdPtSv5P7qqc0MHWtj9xNF+/rL1L/AJ4QQVmdNPYr2cP73z6ued/071H5PkxVHeTTwxfuYPNrnPSw+xYrP8Val9jsPI8irGmzX03mfboPKkrD16aDWNet9KM9AYmr7KiSeG9N8m18/wD561sTXkH/ADwrY1nwrY6Po1vfQX3/ACxrm/tkEoroPIp1SxLNBND0k8yq8HejzvKqTyfO/wCWFBqHnmGXz54KjvJvOlwakn7VHLDB0noAj86Dysf8tPrR/wAtaj8n97UkP72g0LlnCPKqvP2qSGafpVPWJvJtZJ65z0qX7qicveTHUvFMcH2eSu0+xmCKOuf8B6RY3l1Jqs8//kGujm/13410Hm1ahB5HvR53kxVY+x+361Tm/e0GZX87z/8AX1HN/wA8IKk/1P8Ar4KP9bQc5Xmh8qq8/ark/aq9BoU/+WtHke9SVHNDQBj+JJv3XkY/1tSabZ/Y7WPH+rqneQ/2lrPkf88q2If3MWaAM6b/AF340yb99LHBBUk/arnhvTf7S1m3gq6QqtT2SPUPAfkaBo1vBPYxy0fEj4zfA/wraxweKvhJ/aX/AF1mo/cfZf8ArlXz38eNY/tLxR9h/wCeVetiMFSrUT5erqz0zxJ+1F+yhpugSZ/Zlsv3teZ3nx4+Ds0uPCvwWsovN/6bV5f4w1Kxhuo7G+g8yOtCfwr4bh8Ef8Jj4VguftH/AE1mrynlWFp/AWqR6R/wv/SvDcX26x+GOk3Pm/8ATGus8K/tOG8tfPg+HNlbf9cYa8L+GMM/jzWY9D+z9/30tewXmg6J4OtY7GCeL91XkYnDUv4ZGIp0rHeaD8bPFWvX/wC/g0TSbOL/AJbXddQde+22H27Q/Eek6l/0xtJq+d9e+w69F5Bvv3dWPAfhXXNNuv8AiR+Z5cteZVw1Gijm9mekeJPjxB4bl8jXPDl7bSf9NYaueD/2x7Gz1S3sb7zPs8v/AJCrL03/AITHQfMnvtVjubf/AJ9LuHzKpzWfwr8SXWNV8Of2Tef89bT/AFVc1P6oY/uT1T4kXljqWjf8JHoUH2mOX955UNeB6x42ns7qSCxgubb/AKY3cNe2abDrln4c8+D97HF/qZoq8v8Aip4P+2WH/CVT+KraW4/6B/8Ay1ipr2NNjp0yTwT8SPO8L3mlX3+s/wCWNcnDMJtUk1zz/wDj1rj7zUv+Ebv/ALR9urc03UoL3S7iex/exy/66t/qXsv3hZ9QfDHxtrmm+DbfxVpRk+xyw+XNXn83xCsdB+I1xqt9+6jv6z/hv8Tvibo/wvk8KQWP/Er/ANZVzwH4V8G/HiKTwPOI7LWP9ZZ6j/z1rjw9G1bnIqUzg/iFDpWsapJqsHlyV534q1K+hsPsMF9/12hrrPGHhvxj8JfG9x4H8cWMsXlTf9/a9g0D9lf4ZftIeF49c8OeZoGsf8tv+eVevSxFKj/ENKVjzf8AY5vP7H1681yf/rnDXaftCeD5/iRfx+RP5VxFD5ldJo/7HPjj4G2H+nT/AG23l/5e4f8AVVc/4QPxHeap/bkF9F5cUPlwxVy1MTR+t+0Mjxf9nvUp9B8USaHPP+8im/1VfYHhWaDWNG8gf6zya+S7P4Y/E3w38UP7cn8OSy28s3+uir6M+GOvX1n+4voJY/8ArrDXDmVJe19pTIxJyf7RX9q+G4bfVbGxllj/AOW3k1j+CfEl9r1ri+0r7N/02lr3jxh4Pg8YeHJLGCHzfN/1NeB6l8MfFVndSaVfT/u4pv8AVedWeGq+1pezFT3Ow0DWPA3gm/8A7V1aCS9uP+eMP7qKus8Nft4fEbTdZ/sOx8Laboln/wAsbu0h82WvM7z4e33iTS/7Kn8yP/ptFVPw3+y74xN1/wASrx/JLb/88buumr/ZNrVDqp+xPoiD42WPxatbjw5qvjj/AEiWHrNNXzv428B65oPiST7d+9t/+WN3XSaP8B/GOjXUn9k+I7aW8l/59IfNlrYHwT+P01hJpWq+Dr2+t5f+Wvk1zU8ThML/ALvUNL/8+z578YXljD5k/wDyzirh/hX8TrjR/irZwf8ALvdTeXX05N+xDrmvWEkGuX0VjHL/AM9pq5/w3/wTH0PRtet9c1z40xRR2s3mQ2lpZ/va9rDYjCU6Pv1A/dnomm+FvOl/tWCD/W181/tdQ+I9N8Wx6Vrl9LL/AM8fNr7g07TdD0ewjsbG++0+V+7/AH1fOf8AwUC034Y2VrZ6rqulalLrl1/x5+TN+6irnymr7PGGWH/inyfZ/wCtP1rsPhXD9s8XW8B/57Vx9nXoHwNhgvPG9v8AaP8AntX21H+Mj0z7c8B+fDoNvBBB+88mrGjzTzXVx58/7zzqPDc39m6NHBBUmj+RNLJP/wA9Zq6s6/3Q9HhOn7XMTbs/9UfpVmHyPNqvD/qfwqxZmCby/Pr40/TyTXv+QDeQD/nzrj/g9/x7SeR/z2rtPEnkHS7z/SP3fk1yfwrs4P7L/cf89q0OT/mLO0hvIPK5rQs5vO/1FU4YYPKrQ03z4YvI8ig6ySa8/dVJ+4hi8/8A5aVH/wAtPIom/cxYrQx9ofk/9sn1I/v9c8uT/rjVj7FqsNrJBYz20nm/8tZaw6jF5PNdfYbGCW5uP+eVfUH5KaGg6xrngPVI4fPiube6m/fQw16R4D8HX3xO8ef2HodlLFZxTeZeXf8Az6xVX+D/AOz3q3iq6/4SPxVPLbWf/PX/AJ6/9cv/AI7X0ZoOj2PhXQY9D8K2Mdtb/wDTKGueriUduGw1YkvIbHR7WPStJgitreL93DFFVOG8qP8AfzS/Sib/AEOXyJ6832h69KkSTzzzf6gVX/5a+fPVj/ln+4x1qOftWJ00qRHUdWPJ5/6aVH5Pky0HbTI7yb7FayTiuf8ACtnBeapcar/z1rU8STQTeXpM8/lebVjR9Ngs7COCCCg83E1fa1vZkmpTXs1h5Hn/ALuq8NnB5UcHkeXUl5CPN8jz6J+1dBl7NEf2ODzfIo+x/vf9fUcP/PfNFAyS98iGLFV5ofNom/fS4qSWHybWOf7RQBXhh/e0Q+RDLUlU5tBm1K/jn8/93WPtDpp7mp/yyrD8VTfuvsNbn7iGL61y4h/tjxb5H/PKlSNMTU/dG5oNl9j0uMQVcg71HzDDUkM8E0X+vrc8oJZrjyvIrPrQvMeV/r6y/wDlrQBYms5/K8+eo6k86ebrRN/zwxQBTn7VHP2qSbz4arTf678aDQZND+6qnNN5MXnirF5N3rP1ibyYsH/lrQL2pl6DBPeapcXxrUn7UWcNvDFRP2oNPZorz9q6D4bab9supL6ufm/f/wCor0zwHo8Gm6NHP/y0lrrwNP2tY87HVP3Ia9eQaPo0l9j/AFUNfK/jzxVB/wAJHcX19/z2r6M+OWsQ6P4Xk5k8yvkfxtefbLryK9LE1LHkUlcp6xrFjqV/JPP5temfDGbw5q/gO8/tXxVLZSRf6m0is/Mrm/hX4b0r7VHPq0HmyV6x4C+Cf2zxTJrk8/2a3l/5dIf+WteBicyo0TpqfuqJ5n8PfCvir+1Lifw5ZSSxyzfuZYf3VeiS/Afxx4wuo4Nc1ySKP/njFXuGg+FdD8N2vkWMEdU/EniT+zf9RB5VfOVcbWrVv3Z5PtPa1jl9H+DPhXwrFH9un83yv+e1bkOr+HNNi8iCCKuH17xJfax5kEM/l15v4ks/HGmzST/bpbmOtFluLxX8SodH1erVPbNY8SaV/wA9464fXvHnhW0upLG4nj8z/nlXkd54qnmk8iee5luP+eMNF7pt9eSx63quh3skcX/TGuilkgU8MewaP8cvHHhvRpND8OT/AOj/APTaub/4Tb4m6xdSfuPt0cv/AEx8yuT8K+PIIb/7DB4VlvZP+WMU1eiWkPjiaw8/Xb6PSbOs/qVHCmdSl2Mf/hG/EesS/wDE1+GVtL/5DlqObw3pXg8/uIJbbzf+XSabza1IPjj8LPCH+gwX1zqVx/z2hrUh8VeAPGFpHPfaV5f/AF91nUqVqS/eGX745/wfD43h1j+1bGxub7w//wAvlpDN/raj+KmsWGheLdL8R/B3wdq+iRxfvP8AS5vN/e19kfAf4D6rpvwbuPHB8KRxaX5PmedL/wAta8rvNB0P4h69cTzz20UcU37muanjaXtR+0JNB8S6V+1d4Ijg8R6H5fiTS4f3Mvk/62uP+GPjfx/4P8ZefPP5cdrN5c1p51ekQ+JPCvwNtZIPA88dzeXX7ua78muH1LQdK8SXUmq+fF5l1+8rJ1PamJ9YfD34kaV4w0HyL7y5beWHy5ofO/1VeN/H34J/FTRvM1z4LeKvLs/9Z5Mv/LKvP/h74k1z4V6z9u0q+82z/wCW0NfQHhv4qWPiTRo76yuP9b/roa5v31JnP/CPmO08VftQabL5E+q2Vz5X/TnXYfCXXvjTr3jzyPHEEsdn5P8AzxruPiR4Pn8V2sn/AAjl99hvP+e0VfNfxC1740/CW6uNLvvEdzc3F1+7h1CWaumn++NPae1PtT/hYXhXwr5c99PJLHF/zyh82uX/AOFhfA/xh4juNcn/AHcf/PKWvkf4YeMPH9ndR319qtzJ/wBdpq+gPhj8Mf8AheWofYIPCsslx5Pmfa7T93XDicP9V/5eezHTp+yPTP8AhJPgDpv+nQaH5n/baWq83x/+C2gy5g0PTfM/6e5qw/7e+GXwNsJPA3jHStS1L/n8tLuz8vyv+2ted/Gz9kv4c69o0nxi+BHjGTUreWHzJtJmm/exVzUsNRr1f39Q7adNVT1S8/bSsdNi/wCKcg02xj/6dIaueFf2lr7x55kFx8RpLaT/AJ4/89a+I7PXjFayQX0/lyRVThvL6H/ieQarLHJ/yx8qavcw3DdKt/DD2Z9oTa94jvLqT9/5sf8Az1r5z/ah8VftC6DdfbtK1W5ttLl/6B1V/h7+2B4j8Kyf2V4qg+3W/wDz2/5a19CfD34kfCv4z6XJb/u5fN/10MtL6tisrrfvKehl+9pHkf7Mfxm1W80aP+1r6SWTyf33m1Y/bS1j/hK/Adnff8tLWuo8YfsrweCdUk8Y/Dn/AI85f3k1pXn/AMeLSfWPhpcf9OtRhqtL+0faUx0/Ze2PnODvXqn7MkPneLY+f9VXk8M1e0fsrw/8T6S4r73C/wAY9Gp/BPrzTby++y/6d+98qGrnhv8AfWv2isuzvYIbDz5/+eNbHhr/AI8D+Fa59/BPb4Op/wC11DYg71JB3qO0/wCnarEHevkz9GI/FU88Phy8/wCWv7muf+FcPk6N5/8Ay086tjxtL5Phe4nuKj8B2cH9g2/kf88aDk/5izfh/wBd+NaMN5VOH97VyH/VeRPPWh1kc03ny1JeQzwSxwf89aPIsf7xqOaHzr+OCetDgqbn5J6dpuueML+PSvDnmyx+d5fnf89f+uVfQHwl/Zv0rwrFb6r4jg824/1n2T/47XcfDf4V+Ffh7ax/2TB5lx/y2u5f9bXSeT+9r08Tifav92fCYbBey/iFf9xDF9nggqTzp/J+z1JDDUkPkeV/qK5D0qRXhh/e+f59RzQ/vaseT+6o8nz/APX0HbSK/EM1Hk/vakm/1vXzKIYTN/qD+8rM3I/J879zmo/+POXz/wDnlVzyfKrL1KYCXyKDCr+6olPWP+Kkv476+n8ySKtSGHyoozVezs4PN88wVcvIfJrWkedTp/8ALwrzWfnS+fVOtT/llVPV/I/dwQVr7Q6As4vOi/fVH9j/AHv7ij/p3/SpIfPhi/55VQezK81n6z1H5HvVyaGq+Zv+fep9oZ+yK/lQ+lT2f+qP0pfJ82tiz0eCa1/6aVidVLc5/WJvsdpJP59Zfg/TcSyatP8A6yWjxrNP9qj0qD/WVuaZZmzsIyKzMcb/ABSO8h86XrUcMPky4qS8m/e/uKIZv3tdVM4yOabzar/6P/y36Vc8nzajm/dVQFOo6ueT503kUfZLCHzPPn/780AY5mvprr7P5H7upLyHyauUTeRQaezRh3n+tH1rPvP9Mv44IDWpeTeTWfZ/vbqSc0GXsix5P7qqd5Vi8vP+Xes+bUvJi6UHTsaHhvTZ9Y1SOCCxkk/ffvvKr1i0hgs7X7P5HlV538JbzVYdej1XSp/9VXtkPxC8Ha7a/wBleMdDitrj/ntDV0sRVwv7z2Z83mVX98fNf7S3iT/lx8+vn/TdNuNe8RxwQQebX0p+0t8B/EepSya54Hnivrf/AJ4/8ta8b8FaPP4Juv8Aia2Msdx/1xq6uOpYpfuzmp4k9I+Ffw9sdNl+3X0Hm3FekTeKtD8N/uL6fypK8b/4WRqumRefY2Mn/f6uT1LWL795rnnyeZL/AMtZq8Wpl1arrUMvZ1ap7xqfxIvtStZP7E/7+1yem/EKCHXpLHXL7/v9Wx8IIPO8JRz33l1438SNS+2eLbweR5UdebhsN7Wt7Mzw1P2tb2Z7ZeaPY6lF9usfKrPm03yf3F9Y15n8H/jBP4P1n/hHdVn+3Wcv+p/6ZV75DPofjDS/3E9dPta2X1vZ1DT2tajWtUPO9H0fQ/DfjL7dfaHHLbyzfvpq9o1jR/CsOl29x4c0OKT7V/0xry/X9Nn0e6/srVYP3f8AyxmrsPh79h0HRo9Kn1aWSOWb/v1XpVMbfCc9M1qVf3XtC5Z/D3Q4bmS+0rSraO4/5bTV4v8AFrTfEd54ok0rVNVils/+WP2SvpjxJPof9g/8SqCO2s/9ZNNNXz/N4c/4WP8AEGTSvA8Hmx+d/rfJpfV/Y0fa1TPDVHS/eHl/hr4Sz694ojsdJsfN/wCmUNdh480GDwTL/Yd9/wAfH/LavrT4D/s033g7w5qniOCxtoryws/Mmmu/+WVfJfiS8sfGHjLWJ4L77TJFeSx+dXzlPMVmOLqez2phUqe1/eHWeKv26v2jPEnwqs/g7feKootDtYf9TFD5cstcv4V+M2uab/oNvYxxyeT/AK6sfUvDc82qWdjBB+8l/d16xD8B9V03Ro/P0qKKPyfMmmmrpp+x9kctU5fw34qvtfv5P+Eq8qKo9Y+MOh6Pqklj+9/7ZVueJPh75Pg24vv+eUP+trxv4cWU/inxl9hz5skU1a0qVKqrhTp+1PWLP4heHPEkXkWN95klWPDfxP1X4e6p59jP5kcv/LLzq2Lz4AweVH4q8OQfZryKH99D/wA9a87+MHhW+htY/EcHmRyRf67yqyp+x9sZ+z9qe+WfxI1zXrX+1YJ/+/VeZ/GD4heHPEn/ABI/HHmRyRf8tq5f4P8AxOvtH/cTz+Zb/wDPKj4kaPB8QvEdv/ZVvJbXF1N5f76j2XsqxpTpUVVLnhTx54c8NX8cEEH2mz/6bV96fsE/GD4LT2EkE4trbUP+evnV8hzfsH+MdB0G31W+8q5/c+Z/olY/ir4e+I/gzdWeq+HdcuYpP9ZXk5vgqWLo+zI/c/8ALs/TT4/fBP4SfGbS/P1X7NbXkX+pu6+W/Enwx8A/BnVJIYNVvpbz/njaQ+VFLXJ/s6/tvX3hu/j0r4t2MtzH/wBBGb/llX1hNP4A+J1hb+Mf7KttSs/9Z+5r5L/bMrfs5/wzRU/an57/ALQn7NPiPXpZPH/gfSvKjl/eTWn/AD1rwOe8vtBv/wCytdsbm2ki/wCWMtfsRqXwr8K+JLCSfw55ckf/AD6f8tYq8r8efsW/Dn4kaXcWPiPQ4/tH/LG78n97FX0mS8afVP3eIOikfmPeWfnWH9qwH93/AM9ap+A/i14j+GPjKPXNDnk8vzv30P8Az1r2j9pD9kXx/wDBO1uINDsbm+0//ntFXzfNn7V+/wD9ZX6HhsVg82o+0gd3s17I/Qz4P/tCWPjDwxHrdj/pNvLD/plpVf4qeFfDviPw5qGq+FZ4vLls5ZJrSvjf4A/E7Vfh94j8+Cf/AEOX/j8ir6k8H+MNJ1i6j1XQ76KW3uv9dFXzGNwX9n1/anm1MN7I+P8AUrM6bqdxY/8APKby690/ZLs/Ov8AzxXH/tCfCufw34ouPEelfvLOWb995X/LKvRP2S7P91JPX2mUVaWKXtKZ0T/gn0Z5Hk6V+4n/AHlbmgw+Taxmsvyf9A/cz1uaP+5sI81pn3/Ls+q4Op/xGalnN3qSzg83zKjs4fOqxB3r5w+8Mvx5DOPBtxn/AKZVJ4Jh/wCJDZ4/541J421Kxs/CVwL6D/W/6mrHhWHydGt4J/8AWeTWZy0/96NTP/Tf9Ksf8s/3GOtV/I96uQw/uqDqJIfIml/cCo5rOea68/yKj02E/apKk/fwy/6+tDzz5vh/1Xn4qPzvOuqk/cQxfWo4O9dh8mWP+W3+oq5rGm6VZ2tv9h1WO5k/5bReT/qqp/8ATeCo5pv3X/TSszpp7lyHUvJl/wBBgqvN++l/6aURReT/ANdKsUHTSM+az8mj/U/v6uT9qr+R70HUHnTzS/vx+7rH+2QTXcn/AD0rQ128/s2wk5rD0GG4mPn3H+roPMxtT/l2dRoOkQXlrJPPcVTvD5MvkVJDN5P+onpk3/H3WgqRF5Pm1X8n97Vz/lrVfyf3tB00yOaE+b5FHk+VViGznqv5M80v/TSgy/ckc03k/wCoqP8AfzRfv6sUf9e/4UGZH+//ANR+lXPtk1na/uJ6r/8ALT9/npWfr03k2Ennz1mdtPYy/KOpeI/t0/8AyyrpJpqy/Cuj/wCi+fNPWpNDWh5T/espmH97+/8ANo+x/vf39SfvvNon7V0GXsiOqc3+p/CrFV5pqDUjn7UfuJqPNh9ajh/1XTy6BU6hJ/o/lf8ATTNUrz/VD6Vd/wCWVZ95N5P7ig1M/WJvJsJKp2f7qw8+o9emnvPLsIP9ZReTGC1jgnqagUv3tUrzTfvaz5vtF5LJBBBLJXQWeg2NnYSeI/Fd95Vv/wA8v+etc3Z/E6+m8Rx6V4csYvs/neXQlWq/Aae0wlL+PUPTPhVB/Y+jefPB+8lqx8SNYsYdBuL6D93+5rU03Tf+JNH58H7yvO/j9r39j+HPsPn/ALyWvfp/u6Gp8nVqKtWPP/Cn7TniPwffyaTrn+naf53/AH6r0zR/FXgD4qaX58HlSyf+RYq+V7yGfUr+TyJ4q0NGhvtBlj1XSvEf2aT/AKYzV85jcFSq/wAMyqYL/n2e0eKvh7Bpssk+lT/9sa4PxXDfTRf8I3PZS+XLNViz+M19DF5HiO4+2/8ATaGtjw34w0Pxhr1nYaVffvP+eU1ZU6mLwtH94c376ieseFdNt/Dfw5jggH+qs6+d/idqUE2syeQf3nnV9KeJPIs9B+wwV5P/AMKNsdeupJ4L6SKSX/ntXnYKpSpP2kzTDVPZHlfhXQbGa/8A7Vvp5IpK9g0fXtV8N2sd9pU/7v8A55Vl6x8E9cs7XyJ7GK5ji/55VufDH4e6542tbjw5pXlR3FrD/wAvddGJxFHFjxNSlVPQNB8VeHPHmjeRP5Un/tKs/WJrDw3o1xYwT+X/AM8Za4vw34P8Y+CdUksbixliuPO/fRV0GsalBLF9hvf9ZXk0qdqxyr+KcPD4k+I0M0mleKvHHl6PLN/z2r7k/wCCZvwr+HM2jSeMf3VzJ537mb/W18X694b0rUpcef8Au/8Alt+5r68/4Js+PPCuj+CNU0oX3lx6DD5k1HF9SvVyS1M9apS0Ln/BQ74qa58GbXUND8HWUslxr0Pl+VDDXwv8MfB/jG08zVtV8OXNtb3X/LaaGvuDxJ4wsfjx4yvPEc8EX2PzvLs5pa4fx5o8H2C40qDSvK8r/ltFV5RlX1DIrz/iGH/Lk8/+FfwrvvEnjzw/+4/5bV6R+29N/YOqaf8ADnwdrksscvlfbIoqPAfiSx+Hth/wkcHlS3kUP+hw/wDTXyqx/hv4P8R/GbxbceOPFU8vl+d5n76vKp1Kx5Zy/wAbJoPCvwQk8/8AdyeT5dfK/wAJvGE/g/x5Z+Ip4f3fnfvq+iP2/NY8nRo/Dmh/vLeL/XeTXy/o+marrEUcGlWMsslfU5Thva4Q7sHS/cn6UeD7PSvG3g2PXNDn823uoa8T8YeFYJvtmhz/AOrlrg/gP8a/ip8AdMkg8R6Fc32l3UPl+VFN/qq9M0HXrHx5a/2rBPF5kv7yvEzHD1sJWuc7p+yZ84Wnw48YeFfGM9vbzeXaSzfuopa7uaaaztfIn/dXEX+pmr0DxhoPk+Xe/YfNktax9S0fw54w0b7dpUHl3EX+ur0cNV+t0uc6P4tE9U+Ev7Y2lTaNZ+Dtcgl8yKH99LWH8Tdevvipr0f+gxRW8X+p/c/va8Hs4b7R9U8+3P8Aqq9Y+G/xOsTLHY65BF/0xmrzcypVji9l7JnQab+y74y8eaNJfaHof+q/1M01Zfw3+MHxb/Z71m40OC4k+zxTeXeaTLX0p+zT8TrHTdZj8OarP5tndf6n/plVz9q/9mLQ/EkUnjHQ4PK1CKH/AJZf8ta+X/tH/a/q+IOtbGX8K/2nPDfiqWO+0q+/s3UP+W1pLXvmg/Ejw54w0uP7dpUX2yL/AJaxf62vzz0fQZ9B1n7dBB5ckU376KvcPBPiTVbOw/tWDVZf3X7yssblNGr+8RjTxPsj2z4heCYPFVhJBP8A6Tby/wDTH97Xxn8cf2D/AA54q1S8vtD/ANCvP+esVfUHgP4/aH4ki/4/opZIv9d/z1qx/bHhzxhrMk9jfRSSf+RaeWVcbl1bQKmJf8Q/MvxV+z38RvhLfyDxHocslv8A8/cP+qrP+E3xB1Xwf4tt4IJ/9Hlm8vya/UDxJ4D8OeJLCSxvrCKWOX/ljXy38cv+Ce+lXl1J4j+GU/2G487zfsn/ACylr7jDZ9RxdH2eINKWN9r/ABDy/wCKfjCx0Hx59h1X97pesw/vv+mVegfs9+GzoNrJ9h/e2cv/AB5zV5P+0V4D8VeG/wCx4PEelS20kUPlzS17B+yv58XhKOA/6uvocgpr+JTNKn8E9oi/48I/ProNH03yrX/pnXPQ/wCqT6V0tnXTnP8AFPtuDqf7moaGmwweVJViHyPKqQ/6mOiG0/5b14h9ocv8Wv8AkXI4IP8AntW54b/48Lb/AK4isf4tD/QLODyP+W3Wtjw3D/oEf/XHnig5KX8WobH+tqxDDVeDvUgm/cyfuKDSpUDTf33me1Sf8taj02H/AEWrHke9BzHzHR53lVY8j91/qf3n1qOaz86Lz66D5sIf+e+akhh86bn95UfMMNXIfJh8vyYKADyYPNo8j3rU0fw3fax5k9vY/wCq/eVXvIfJl8ig2pGf/wBfH40kP+u/GpZoar3s0FnFJPWZ1GH4km+23/keR5sdXNNs4IbXyIP9XVeH97WpDZzzRefB/q4q0PLdT2tYPI96jhh/eST5qT/XQyefRZzfuvIrQ0I4bPzv+ulR3llf2f8Ar63NHhses9R69qcEwjsYB5sdAe0ZjwzT2c2YJ6j/ANdL55/1lWJpv3VV6AI/+WtR/wCqqx5PTyKPsc80prMdKmRw+fWXr3kXcsdjWpN+5ixWPptnPe6p58/+roNMRU9lRNjTdN8m1qSGGrn2PyeKPOg/d1oc1Ip/uJv35gqvdw/88BWheeRD/qIKy5pv+mFbe0MyPzvJiqvN/qv9fViiGax/efb6zpGVUx/+vf8ACpPOg8r7PVibyJv9R5nl1H5HvWntDOnTKd5eDyqz5rzzqsXf/TtWPrE37qT9x3rP2h0leGb7ZrMg/wCWcVXIv7Ks4pNV1z/Vxf6mL/nrVPQYYPsEl9P+6/57V5/488eT6xf/AGCxn/0eKtKdP2pk8T9VpFzxh4w1XxhdeR/q7eL/AFNXPg/o8F54jj8+D/Vf8ta5+G8+2xRweR+7r0j4Jw/2b5l9n/W/89q9alSR4lWrc9Y/fwxRiC+iij/6a18//tRaxpUXiP7DY6r9pj8n/XeT5de6Xk3+gf6PP5tfP/jz4P8AxU8YeKJP7K+H+r33m/6nybOWSKtMTWoUaWrOakcH4P0HStSiknn/ANZWhqXhuAWv/HjH5ldx4V/Yt/ahMsd9pXwr1K2/67fu66Cb9iH9r3WJfIn8K21t/wBdbyKvAqZll3/Pw7lVpHg8Og65eXXkQfZvL/6bV2nwT+G97pvje31W4nj/AO2VeoaD/wAE6/2hLObz9V1XSYv+3ytzTf2XfG/wx1T7dqviOyl/65VxVc1wlWl7OnUMsTVo+xOX+PFnfaxbR6VY6pLbSf8ATKvL4dN8caDdefB4juZI/wDrtXrHjDwT4j1nVPP+3RxR1z+seA9V02Lz/wC1Y5a0w1SjTonNSq0fZHncPjz4xS6z9h0rxHe/9ca98/Zvs/HFnrX2/wAY6rHc3EteV6PrEGg6p5+q+VHH/wAtppauaj+0hBoOqR/2HB/o8X/LWoq/vV7OmLEJVUe4ftL6xP4J8GyeI9Jgikklr5v0f4hf29/x/T/6RXUS/FSf4kaFJY65qsslvL/yxrn/APhWMF5FJfaVfeVJ/wA8a5adOkqXs6hFKlS9kZeveJNV03VeL6X7PL/02r6t8HaPqvwI/YkuPFWi6XJJ4g8bzeZFF/zyi/5Zf/Ha8e/Zp+G9x488eWfhXXPDkX/H5/pl3NZ/uvKr2z9vD4qQeKtas/hl4AvvL0fRrPy/O07/AJ6152YYpYmtTwh0e0R538Gf2kPDnhu1t/C3jjVY7a8i/wBdXsGpfEj4ZeKtL8/SvEdl9ol/1MMU1fEevfBPxHD5l9pU/wBp/wCuv+tr1z9jPwRPNrNxPfeHfs0dr/rpbuH97LX09TMaNHBWOao6J9Aa98PdV/4Q2z8Y31j5ely/667rl9B/aK8K6lrMngDw7BJbW8X7v7X/AM9a+sPBPhWD4hfsg+KND8j95awy+TX5Z6PeX2m6/ceffeXqFreSxzV8flX+1OrzmdOnRPdPid4V/tKST7R+9jl/5bV4nLDpXwx1mSxvp5fLl/1P7mvdPh74kg8eeHPInn/0iKvP/wBpDwTB9gt764gl8z/ntXv5bifY1fZmmGf732Zj/bIPNt/3EklnL/02roPCs2q+G9Ujn0P/AI95f+WNeX6B4w8Y+G7XyIILa+t/+nutzw38YL+zHn65pUkcf/TH/llXtVfqmLo+zqHTUw1Vn1BpsH9vWHkT2P7yvF/jZpmufDe6k8VeFb6S2t5f9dFXSad+0JoejzaPPNYyx291+782avQPHngmx8beHPt0B823uoa+Pp+1y/F+R538E+V9H+MGufb5NV1WCO5jl/6Y1oeHPF9jqV10kj/6Y1X8YfD2fwfLcWPkfu68/h1KfR9Ujn/1Ufnf66ve/c4uidlOn7VH1h8JfiTPpt1b2Oqz/wCq/wBTLX3x8PPGFj8TvhVb304ikuLWHy5oa/LPTbyf7LHPBPX0x+xP+1RB4b1T/hAPGM/7u6/485a+GzrKfaU/aUyKf7o2Pj94Dv8AQfEcnjHQ7H/R/wDltDDXJ2fjax0fy76xuP8AW/u5oq+rNY8H6V48ikvrH/lrD++ir5T+NnwA1zwH4okvj/x5y/6mpwWI9pR9mzlqnJ+MIb6a/wD7c8K6tLZahF+8hmhmrz/xt+1Prmj3Xka4bnSfElh/qdW0/wD1Uv8A11r1D+zZ/ssc/wBhl8usP4q/AfQ/iFoWfI8q8/5Y3fk17GFqUL/vR0qlJ/xA+DP/AAVEvv3elfFvw55vlf8AMQ06vqj4V/tCfCT4s2sc/hzxHY3Mkv8Ayy8797X5r/Ejw3Y/DjRv+EcNjH9olrj9H1jVdBuvt2lX1zbXEX/LaGavRqZJhMWvaU/3Z0fUqNX+GfsBr3wl8D+PLWSw1zSba5jl/wCe0NeV+Kv2dYPgn/p3hWCX+z5Zv+/VfJ/wT/4KEfHfwTdR6VfarFrdv/zxu6+0Ph7+1p4V+JHheOx8caHLbR3X/bXyqrKcNm2VYv8A5+UzjqYetSObh/cxW/n12FnNBNax/uKx/ElnpUN/HfaFP9ps5f8AU/8ATKtCGH9z/r697MsTTq1fcP0zhOn/AMJxoQ+f5VWIZp/K/cVTs5vJHkT1csseV+4rzT6o5v4qf6HY2c8//Pauk02DybWP/rjXL/ELOpXWn6Uf3sfnV1mm+RNFGIKDkpfxahYim/571Y8791JgVX86eGLyP9bVgfwUGlQJoZv3f7+pIfPhtakvPP8AK5o/f/ZfI8+g4j5rmm/6YUeVN6VJDD/q6Lz9zF/qK6DwKe5Xhh86WSf/AJ5Vch8io7OEQxefUmP+mH61mbkk2pCz8ufSp5Iv+21EF5PN/r5/Mos9NF5+/g/1kX/LKq82P+2VBVP2JYmngm/fVh+Kr2fyo7e3rcm8jyuf9XXP3t7Be3UgzQZYip7KiV7Pz7yL7RPB5dalp5P7v/nnRDZwfZY6LP7PCK6Dhp7BeZ8r/Qakh/1XkZqWaHzpv3FJDBbmWSg1D/llVeaGrn+qom/64VmaGXDDPN0gomighFWJoZ/O/wCedRw2fnf6j/WUARww1JP2q5Dps837g1oWfhCCaLz77VY4v+mPnVmFPE0aRyesTf6L5Hn/AOtrQ8B+G9KN1HPqsEkn/XGtyHwT4Vmi8+/glk/7bVuaDZ6Vo8Xk2P7r/ttRSqnPiavtg8SaPY2cXkWPmR/9dq4/U/3P/LCuk8Ya9Y6Ppcmq30/+q/57V4PrHxg8VHVJJ7KeL7P/AM8fJrupfvTm+s0aP8Q9E/dVHNNB5X7iuDs/jZfQjF9ocUv/AFxrUs/i14cvP+P4y23/AGxo+rVjSliaNY3DBPNL9ngrQm8K/Y7Tz576OWsfTfEuh6lF/oOqxySf9dqsTXk80X+vrE1D9xDF9apzTVJNNWfNNQBTvPs8Irn/ABJeTzfuK6S8hg61y+sTQQ3X7/8A5ZUGXtTD8beJDo+jR6H5/wC8lrg7PR5/Nq5r2pedrMmq33/bGqf9veT/AKivTpUzyatU0D5EMvkYr2j4e2djDoNv5E8VfP8ANeTzS+fitTR/G3iPRz/oOqyxV1U/3RkfYHw3+J1l8PT558AaRqUkv/La7/1tdhN+2l44s4vI0r4c6Tbf9ca+K7L42eMYf3E8/mx10mj/ABy1yaL/AE6x82vOxuVYDFVefEUzL2aPpjWP2xvjTPF/oHhzSP8AyLWHD+1d8d9Sl8ifStIij/64y14vD8cvDnm+Re/6NJXSaD8QvCt5LH9o1WKlS4cyT/n2ZeyPSNS+M3xbvP38F9pH/fmWuD+IXxa+MX2qP7d4V025j/6ZTVqfbLGaX/Qb6OSOpLzTbK8pLIMuvpTHyUjyfWPjL4/xJ5/gexirk/Enxb+I15F5EGlWNt/2xr3ibQYP+eEUtc/rHgPQ7wef/ZVtWv8AZNGl/DM+SifL/iSHxVr115+q33m/9Mqy/wCwb+9uvInnr6U1L4MaVPF/qJYq5fWPgPPDL59hPFXR9V9idHtEeX6PoPiPwrdefYzxSx/88a7zwT4q0PUrqOx1WCS2uP8AV/uYf9bUepfCXxVDFiCxlk/641jzeFfFWg3UdxB9ptpIv9TXnY3LqWLD+KfUmj+JLf4e+ApND8OX0cusX8P76b/lrFFXj83g7VYdZk1Wx1WWKSWbzJv+Wtedw+JPFemzSX195sskv/LX/lrWxp3xm8VabF5E88ckf/TavEeS1qOsDm9keyeFdHgmi/06e2lkr0zwT8JfEepaNceI9Dnjit7X/XfvvLr570f4/WPkx+fY20n/AFyrvNB/bG0rTfC//COQeHJP9K/100N5Xk1cFmNV/uzP2Z9cfsZ+KvEcPg3xh4c1afzY5Zv3P/fqvzz/AGkfhjrnw3+PusX1jB/o8s3mV96fsu/tFfDLx5dR6H4O0qTTZJbPy5obub/W1z/7Y3wf8HaBdWfir4jaVHFb3UP+u8muHA1a2XZhUVSn/ED+EfIfwT8VQaD4yt/P/wBXdf66vbPif4b0PxJ4cksb6CKT/lrXHzfCr9mzWLWPVfC3xbjsZP8AnkbyKugs/Ct9NY+RY/E3TdSji/1P76KvX9pSq1uczqHjd58DbHUov+JVfSRyf+Qqx9H+D+q2eqR6VqsH2n99XQeNvDfx++HviO41XStJlvdPl/55fva9B/Zk1if4nS6hfapokllcWH7vypYa6bVqSudlPE1qVE8u+M+kWOj6NZ2Pkf6qvRP2S/jxY6xYf8K58Rz+bJ/y5zS1J8YPhLpXjaWSxv55Y5Iv+eVeP/8ACpfFXw41mPXNDvvtMcU3medD/raL0cVhOSoR7WjWpch7h+0V4V+xWv8AwkcEH7uL/XV81/E7wrBeWEfiPQ/9X/y2hr648H+JLH42/DmTSr7/AI+PJ8ubzq+Z/F8P/CB3+oaHff6uKb/U1nltT2WhphjD+HvjDzrb7DP/AKyKuk/tj+zb+O+gn/79VycPgOfUrCTxV4An8zyv9daf88qr2fiS+mi+w6rBLHJ/02r0atJVg9kfeH7EP7ZmlWevW/wy+Jt95dvL/wAg3UfOr64+IXwx0P4keF7iDz7a5jlh/czV+Lc2parDFHPYz/6qv0o/4Jv/ABC8Y6x8FtL8R+MdclvrPzvL/ff8sq+SzXKfY/7RTMsTS/c+0Obs/Ad9oOqXnhzVYP8AVTeXUcPg/wDseX7DPB+7r3z42abofhW7k1y+g/4l9/8A8tq83vdNsNYsP9Bn83/njXFhqntTzT5b/a0/Z1n8VaXJ4q0O3/0y1/ef9da+R/Jns5ZIJ/3UkX+ur9SDZ/2layaVqsFfKf7UX7Jc8N1ceMfB0H7z/WTQww/62vrcpzL2X7uoelhsTr7M+f8AwTZ+br1vBj/ltX2R4P0Gf/hHLOCD/njXyn8MtNnh8W29jPB5ckU3+qlr7M8Hf8esdv5H7vya+6y3U1xBseA4b7R7u4sRfSSRy/66Ku8hh/dR+RXJ+G4f+JpJXWQ+fXz+Zf74fpHDdP8A4TixZ+f5vNWIYf3VV4ZvIlqez/1R+lece6ZHjA/8TTT54IP+W376uk02H0rl/FV5bzeLdPsf+WddZZnyYvIrQ5aRc/dUkv8Ax9x/Slh/fR/6ilh/4+6CR8x86aM1JNCRFJ5FE1nP5sdHkz+VJj/WUHOf/9k=\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDAAIBAQEBAQIBAQECAgICAgQDAgICAgUEBAMEBgUGBgYFBgYGBwkIBgcJBwYGCAsICQoKCgoKBggLDAsKDAkKCgr/2wBDAQICAgICAgUDAwUKBwYHCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgoKCgr/wAARCAKAAoADASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9eJvImqP7H5PFV4Zv3tXJrygA87yqrwzCGLzxRxNNVef/AFXkZoA0PO/tLy54P+WVH2yCbzJ/+WdZ/k+TayeRPUn2P93bzwT0AaH2yDy/s/8AzyqObUoKp/6mWQ0fuJov+mlABDeed5lSQ/uZcVHDD5Mvkf8ALSWq9nef6yf/AJ5UAbF5N3qPTbyCG68+cVXAnm8v/prUc0PkyxmegDYm8iGLMFZ/nf6X71JNdmGWPz4P9b/zyqPzv3vn/uvLxQBJD+/l/f8A+r/5bVcms/8ARf8A0TVeHyJv9Iz+7/55VJFN/wA96AK83+h+XUlmP3slxn/W1Hef6Z/2yohm/wBFjoAj/wCPOSpIdS8mXz6Jpv8AT+ajmhP2qgC553nRSZn8vzf+WNR/2kfK8jyPKqv9jg/19x/rIqk86Dzf39AEkOseTLR9sMNr/hUfk+f/AMsPLovIYJrWOCCszQkm/wBd+NH7jzf39Hk+dF59STWdAEflQ+lEOm+TF1qQ2cH7urE377nH7usfamhXmiM1r9no87zu3+q96khh8n9+T+7os7OCzix537uWj2o/ZBZzT3h8ierFR/6P/wAsOlXPJgmi/cUe1EV6J+1HkwTTfuJ6PJns/wDj+/e/9caPagRw/wCu/GrE3/LOo4YRNLJ+48r/AK61XvNS8mX7DPR7Ur2QTf8ALT8Ksf62q955FnFHPPNFR5s/+v8A3UdZ+1FTpFjyf+W/61HNN58tSHUoYYv9fF5cv/PGq/k/6V+4/wBX/wA9Zv8AVUe1NfZljzvOm8+q/wBjn87FSfuLOw/fzxy/9cqsf2lBNa4ggo9qbFepIYfJl8j/AJ61J/23i8yWGo7PU7j/AFE9h/22o9qBXvIZ7SX9xUkMM8NrxVyeaDyo4J/3VSeT/pUn7jyo4qftSahl+TPD1o8j3rQmEE3+ot/+/wBUfke9X7U5/ZFf/VVHNNPN+4qxN/rY8/6upPsX+s+0f9saPah7Ijm/575qP/ll5Hny1J5X+gfZ8VY87/l3+z/6r/nrR7UPZGfN5/7v9xH+6qv508JkH/PWrk0MH7ypIbOxn8vn/VUe1D2RH532OL/Ufaapz/vpfPgxWhDMfK/55x1Xhhghlkng/wCWta09jEp6P5/lfv6sT9qkmh/dUfY8yxwVqBT87yZfI/561Y87zv3H/PKpLzTYIfMzVeb/AJd4KzAkhhN5F+//AOWVR3kI+1Rz0TETXck8H+ro+2edFHB/yzrQAvJv9F8io5v3/l4/5ZUed503n0eT9j8zz/8AlrQAQ/6r/pn/AMudSTwzzf8AXT/ltVfzjnyP+Wn/AKKqxZ3hz5E/+soAj+x+TxR5/tVj+0/OiqPyPegAhmEMXnio4OIpP+ms3mUTQ+dF5AqSzgg8nyP+WcUNAEcMHky+fP8A6uX/AFNR+Tx5E/8ArKual5H2CPyP3sdR/wDLWgzI7OH7HRj/AEX7D/z1qxeGD/Xz/wCr/wCW3lVHD++l+3f9+aAI5rP7F5dcH+0h/wAkg1j/AK72v/o2KvRLy886H/Uf6qvO/wBor/kjesfaP+e1r/6NirSn/HMqmx81/wCqr1z48af4h8b+CvBfiiw0y4uYBoEtnei0i80i6jii/wDjhryOzgnvJZPs8P7v/nr5NekaD+0t8W9B8OWeh6VBF/Z8XlfY5f7Nik/7a/6qvSqnIcGPDXirypLGDwrqUnm+V51pNpsvmy1l3lnPZy+RPYyRyRTS/uZv+WVewQ/tRfHCHzJ76xtv+efnf2PF/wDGq8v1jUp9S1S41XVZ4pby6vJZLyKGHyv+Wta0jnPsC8s/JlzRND+6o87zaks5vOl8j/lnXiHsEfk/8t/1qSaz86L/AFFSQifyvI/781HNOPN8/wD5aUAV4YbjypPI/e1J50EMXkefR+9qObyPtVAB5M/lR5gqT7Jz/wBNKs2f+tP1om/4+6AKU0NxNa+RB/rP+etRw6bP5sf7iTy/+W1WLITzRVJ5M3/Pf9aALEOmziWOo7yHzpZIZ/3sdR/2l/rIP+WkVSC886KgCn53kxSf8so/+WPnVJ9igxnH+kVJ/Zv2z9xUfkz+Vj/lp9KACGafyv39Sw/6n8Kf/qv+2tR/YxD+4nn/AOmlAEn+q8vFE/7mXyIMVJezTzWvkT/u46ki8iEefcUAV7OGeeLz/wDWyVYvIf8ARfPqSHyLOaqfnQeVJBOKDQkP/LP/AJ50QwQXlVx/rZIJ/wDVy0Q+fD+4oMzQ86Dyv9RUZ8iEcQVHUlZe0RrTplyHyIf+udRwzQTdT+7qOaHzov3E/wC7iqnUGvsjQ/cfvP3/AP1xo/6cf1qvD/6KqxeWdlNL5F9P5UlZkkfnGH/rnFUnknyvt3Hl1Y/cQw+R5Hm1n6xr39m/8xX95/yxhihrH2htSLkMPnRef/yzqv5083meR/q4v9dLRo95P4kl+3weHLmWSL/v1Ve8+GHiq8lkvtV8R2Wm28VZVMTRCoixLef8sIPK8z/njWXN4w8K6bLJBfar/pEX/Tb/AFVSXmv/AAX8E6VcWXjH44W0n9lw+ZNnUov3teN+Nv8AgpN+wX8PfMvvt8Wpf8s/+Wv+t/79Vn9ZogqdY9k/4Sr7b/qJpLnyv+eVV5v+E5m/fweFb7y5f9T5X/LWvmPUv+C6nwP0HRv+Kc8ERfaP+W3mzV5H8Tv+DkC+sbr7D4O8O6Kf3PU6bdf/AB2s/rKOj6tWP0MvNH+I0wt/sPhW5j/57fa5pap/8Km+Lc1z9u/ty2l/6dJq/L/Wf+Di740Wl1HB4c0LSP3v+ulm026/+O1y+vf8F7f2jLy6j8/VZbb7VD/xLfJs5fK83/rl/ra5qmNNaeGrH62a98LPi1PYf8Sm/sba4/1c3/XKq/hv4NfGGG7+z674qils7X95DX4v+Kf+C2H7VGmanbz3vxFvbm/l/wBdD50VV7z/AILGftQ6ldeefGMttHL/AMtf+WUX/bL/AFtZ/wBos1+qs/cTUvhB43vR5Nv4xjtvpDWHD8GvjDpt1+48ZRXMf/TWvxX03/gtJ+1fNYSa5P4/vpfKm8vybSHyv/RtdZ4b/wCC2H7TWm+X9u+I19/1xl8qXyqX10Pqp+xg8B/GKL9xNBYy/wDPHzap2fhv40w6h5Gq+HLaWP8A6dK/KfTP+C7X7Qmm+YNb+I3+t/1MstemeA/+DgTx/Dax2Piq+8L3P/Ta7hl/e/8AfqWhZiZfVqx+jE0Xji0tfPg+HMkskX/PX/8AdVHo+r/2xf8A+n6HfW0n/Lbzv9VXxdoP/Bwr4Vm1T+y77RNJuf8AntLaWV1F/wCjZa9t8B/8Fi/2WPG2nx32t67ZWPm/8spf3v8A6Krpp40yqUqx7R/b0FlLJpV9qsUX/PGHzqsQzQTcQX0Ulebj9pD9hL45WP7/AOI9tbXeP9bCJYv/AGlXQeD/AIV/DP8Ad6r8K/i3Fcxy/wDLHUNSil/df9sq1+so5/Z1jrPInhl8+f8A1fk/uakh8+G18/z/ADf/AGlWfrHgP4qWcsn2HVdJubeL/U+VDL/8drDh+JPiPw35n/Cf+Fbmyk/5YzRf6quinVomx2EN5BNdeRBPUf8ArovPnnlljrk7P4heDtYv/sNj4j/0iuohm/tKLyPs/wC7l/5bRVr7Qx9oR3nn+V9nggi8v/yLRDDP1qxeQ31n5dj58UlvVf8A0gj/AK5VsHtCOeb/AEqSf/ln/wA8aLKaCby55/3VSY/6YfrR/wAef+neRWhn7IIc/Zf3/wDrPOovPIhuo54Kj+x+TF/ZX/LT/WedUf8Aqq0D2Rc86Ca1kqveQ+dFH5FLD/qfwp8MPny0GJT/ANdH/wA8qk8mfzf3H+rqxeWdRw2fk/vzPQBXhnns4vs//LOo/wBx5v7j93J/02qxeTfbLWSeCDy6r+T/AKLH/wA9K0Ak8n/v5/z1qPyIPN8j/lp5NWOn/bOjyvtn/wCqgCnDDB5X+vqxUn2ODp/zyqvD/wBN/wAaACftUf8AraseT50VR+T+9oMws/3P7j/lnViY/uvP8/8Ad1X8m4z5+KCRN+4H+roAk5mi8j/nr/rqjhhggl+3T/8ALL/llUn+ul/6Z0fY/b9aACabzoo4IB5n/PauD/aKm/4s3qljPB+7imtZP/IsVd59j8iKSf8A5aVxf7RXkf8ACm9Q9f3X/o2Knhqn74yqbHgfg/4hT+D4ryCx0Oxljv4fLh83/WxV6R8K/jN8XNY0a38HeDvhlpurR6X5Uc0sNn5n7r/v1Xi8M1vZmOfz/wDlj/zx82vdPiR488VfBP4e+D/A/wAMj/Zvm6bayaxq3k+X9q/7+16uIOakXPFXxa+O/gmL+1PEfwI022s/+W0t3oPlxf8Af3yq8H17Xr7xJql5rl9byxSX+pS3PlQzfuov3teqfA34+/FubxlZ+HfEd9LrceqebZfZLuaKX91/z1/dV5/8VPDdj4P+JfiDw5pXl/Z7DWLryf3Mvmy/vazpVDP2Z9WQ2cGakgs4IelU5vPh/wBfViGb91XmnpFz9x9l/wCuVV5pvJix/rI5aj/fzS/9M6khhgxJ5H72gAmmgs7XB/eyVHDp0Ewo8n/V/wDkapIf3MUlv5//AC2oAJsC18+D935X+uqOH99def8A8s6j+xzzXUn/ADzq59j/ANFjg/5aUAR8ww1H9suPQfnRNZz+bxVf9/DQAQwzzeZ5/wDy1rQhs4f3f/TKq80M/WiHz4aALEPn+bRN/rfP8j95UcM0/myVH9s9/wBKALFn5GfIP+s/5Y0TfZ/N/cf8sqrwzf8ALbH/AFxo/wCW3n/9/qAJKkmxefuJ/wDV1HUk0Pk2sc+KADmGLz7j97Uc0PnD9/8A6yWpD/rT5/8Aq6PJn+1f9PFZmgCzgm8v/plVyCGCaLiq8X76XyP3lEP77zP3/wDqvesqoB5P/LeD915VR/8AH5/qK0PJ8618+qc3+heX5H/LWsDakEMM/wDr4B+7iqv5MMMvnz+Z5n+s8r/plVeHXtD1i/8AsP8Arf8AnjL537qWuk/4Q/VdYtI77xFfSabZxf8ATH/llWNSqUtTD/tKx87yIJ/tMkv/ACxqOfR/HGu+ZY+HNLij8mby/wC0Jf8AVVyfxU/bG/ZK+ANrcX194jsb7VLD/ljFeRebXxV+0t/wXH8VeIotQ8N/DLw7LpEfk+XZ3fnSxS/9/a5vrKO+lhrn6KXkXhzwVpf9rfEzxHbW0cUPl+dFN/y1rxj4kf8ABSz9jz4VxXEGlarbXuoWvmxzQ3cNfjX8cv2uvi38SIpPEfjHxjLLJL/z2m82vB7z4kT3kvn32uXtz5v7yaaKbyqy9rWPRWBpH6ufGz/g4E1bTbW4sfhz4HisZIv9TL5MXlS18r/Fr/grR+1D8Vbn9x441Kx/5afZIvKiilr4/m+JH2y6knsoI45LWH/l0h/1v/bWufvPiRBNa+R/q5Jf+W0P/LKsqlMf1ajSPbNS/aK+LfiqWSfVfH+pf9NopbyvP4fidPeXVx/bmqyS2/nfv5v+mtcH/wAJf4jvJbex0rQ7mWSX93NL5NaEPwx8Y6lo1vodxpVz9n87zJpvJ/5a1l7I1p+xNjWPFUE0Xn/2re/uvK/1NU5vFWlQ2Hn2NjLFb+d5fk3c372jTf2evHOmWFxixjto5Zv+Pvyf9bXSaP8AsN/FTxJrP/CRT2Mnly/6nyYaPZoPrJwc/jC+s4pP9b+9/wBTUmj+PNVh8uee+kluLqbzIfO/e/Za9kg/YV8VabayX2q655dx/wAsYYf3tbngn9ifVoftH9qzyR/Zf3cP7n/j6iqv3Ie0PA7y9vrzVJNcngtpY5f+WtZd547sbO6ksbG+ubmT/pl/y1/6ZV9OTfsK+FbOwuL7SvtMflfvJofJ/dVc0f8AYn8K/wDCOW+qX1vZR3F1/wAukPlS1fPQD2h8r6P421y8i/4+PKktf9dDdw/62ugs/G199gkvr6xtoo7r/U+V+8r6Uh/Yn8D69rNxpXkfZriKH/TJbSHyqrw/sT/DkWslj59z+9/5iM373yqz56Ie0Pmu88eaHrEUcE/lyx2sP77zof8AVVh69eG817T7GD93H/rIZYf+WtfUmsfsH/DKCKOC+n/1v/LWH/lrWHN+wHPpssc+h+I/N8393DD/AM8q0p+xD2h5HNrE4tY76eD/AFX/ACyhm8qi88bWN55f/CN65c/9sf8AllXaeJP2LfEem3/kf2rcxf8ATb/nrXJ6l+y78R7OwuL7Q9KuY/K/5YxQ/wCtqP3Ie0R1Gg/FrxHpsVv9h8VX0sn/AF+V658N/wBuv40+CZbf7Drl9bSRQ+XDN9s/1tfK+pfD34xaDp/9q33gDUoo4v8AltNDLHVPWJvEepRWc/72O4i/13nTf6qr9mhfuT9VPgn/AMFkvi3o8sfn/E2W5uPO/fWmowxV9YfCv/gsl8OvHlrHofxU8KRXNx/y2mis4pK/AvTfGxvNZk/tWeX91Z/62GbyvNrY039oTXfBP2f/AIRXxVc20ks376LUJqy/fUjP6lRqn9MHgnxt+yj8WdLj1XQpotNkuv8AllMfKl/9G119n8PtV8NRST+D/FMd7by/6m1m/wBZX85Hw3/ao1XTfEdvfarrltc/9cZv/aVfXHwN/wCCs/xh8K2Eel2Xj65jgim/49Ptnlx/9+q2pYmqZf2d2P1UvPid4j8E6pHY/EbwPfRebN+5u/3VdJoPiTRPEnlz6HfxS+bD++hlr5j/AGdf+CrcHiWSz0r4maXZXFvLD/x92k1fR+mab8EPi1pcd94I8f8A2a4uofL8qHUYvNrppYk82rgvYs3YYYJpfIg/5a/6maWj7H5ssgxXN6l4P+KngmTyJ5v7b0u1/wCPO7rU0bxhYzRRi+vo7G8/59Lv91Xb7S5ympNptx5Pkf8ALSsuazn83yP+WlbEE080vFWNS03/AEqOeD/V/wDLaWtjMx/+WUnkf8sqP7T/ANX5H/barHkwCXME8Uv76o5rOxhlkggoAIZ57w1Hee3/ACyqSH91R5Pnfv8A/lnXQZmf9s87/R8/62iGaf8A5b/6yL/yLWheWcEP+gj/AFcv+uqvNZwebHBB/q4q0Ar/AGyCb/UQSUeTfeV/yz/65VYh8+aLz5/3lSf2bD/x/WNj+8/67UAU5pvO8uCf91JR5Pnd/wDVe1WJv9D8z9/5sn/Lao/J/e/uP9ZLQBJD/wAs/wAaPJ/eyYNR+dBDLHBmpP8AW+ZmgzJP3E1V/J/eyeRRDP8AvfIqOabybryB/rKAJIfIsx/0zo+24ikn/wDINRw+RNF58FSfufO+3f8AkGgA86bzeD/rf9dXn/7SH/JINU8n/Weda/8Ao2KvQD/HXB/tIeR/wpvUPPsfMjlmtf8A0bFWlP8AjmVTY+Z7Oyvry6+w2OlS3NxF+68mH/0bXrnw++OXgi88I2/wy+PvhS41vS9G/dw6hEf3n/o2L/nlVj9l2aDwf8P/ABp8YrH93qFhpH2aG0/6ZebF+9rxPUryeaWS+n82WS1m8z7JLN5vm16X8Wkc1I98s/jZ8EPB9jeX/wCz18HrqTUJf+WurfvZbX/rl+9lrxfX9SvtY164vtcnk+2X80tz+9rs/wBmTxJqvhb4x6Xb+f5tnf8Am2V5pMUPl+b5sUtYHxa8NweD/iXrmh2HlfZ4tYupIYof+WXmy0YamUfUmpef5veo4YPOi/f/AOrqTz/aiDvXknYWLL99ayQD/tjRNN/ywx5X/XGqcM08MskFXIf30vnwUAGO0E9Hke9H+kWf/TTzajvP9Di/ceb+9oAPO8qjzp5v9RUcU08MXn337yOpIbyCH/TvI/d/6ugCSb9zFij7H53FH/Tl/wAtKkmwJY4IKAI6P9V/21oo8j3oAOv7j/lnF/qZqr6l+/8A9RUkx8m1xVf/AJcqAJP+YX55/wCWVWP+WUZ/561T87yf3H/PWrH2z/l3/rQBJUkP7mbz5/8AV1X87/V1YP76Lz5/+/UNZ1NgCaH7Z/qP+2NR+dPDFx/rIqkhhuPNjnP+rqSGHyYvIz+8rH2poRwTTzRfuP3dSTefDF/xKrf/AEiX/XedWXr3irStHsZL4wSxeV/roq1PDdnrnjyw8/8AeWNn/wA9fJ8z91XPVqmtKnVZnza9/p8elfvZLj/nlF/qq6yfwTPrHhzzxqttpFx/rLOW7/5ZRV4V8ff25f2df2abC90Pw9YXuo65axeZNNZ2kUv73/trLX5sftIf8FYvjh8SL+81XSvH+rabb/bPLh0+X91+6/7ZV5tXGnasFVZ+knx9/wCClnwH/Z10aSDw3onm3EX/AC6Tf6r/AOO1+ff7RX/BYb4xfEm71Cx8Oa5bWUd//qbTToZf3UX/AG1r4n8YfGDxH48luPEfirxjfalcWv7z99eSy1xfin4hQWfl65B+6/c+Z/7Srm9p7U9fDYKjSWp6Z48+MHjHxVdf2544n/0iKb/nt/ra878YfFq+026zP/rJf+etcX/wnmuXl1/ZVjBJrckv7yHyf+WVdR4P/Z1+NPxV8vxHqvlS2fneXZ+V/wAta0vSpI6f3NI5fXvidrms+ZYz2MX2fzqr6b4J8f8Aja6+3WNjLbSf6vya+oPBX7Deh/u4Pt1tLcRfvLy0mh82WvTNH+GPg7R7/wAjStKji8r93++hrL2plUxJ8h+D/wBkv4qeKvLsdVn/ALNjim/fTed/ra9I8N/sN+DdBlk/tye5uY5f3lfQg17Q7y6knvrGK2uLX93DDDD+6lqT+2Ljyo/P8qWOn7U4vanBzfA7wBpthbz6HYxfbLr93eRf88q6jwd4J+HPhu/8j/hHZbmSKH995s37rzajvP3N1cX0/wDrP9ZRZzTzf8t5f9K/eVAe1NDWP+Ecmi8jVdLj+xxfu/skP/PWrmj6lPo0v/Idl8uL95/qaw5tNnmlkvvI8r/2rVP+0p4LWSCe+/1v/LGswOkvNe/tKGSx8/8AeS/6nzq1IdY861jsZ77/AI8P+W3/AD1rj4dN/t6/jvoPNljta3IdN8m6txff8vVaAaF5rFj9g8+CeWT995k0VV9N1jSrO1km8jy4/O8yq8MM+m6pcfuP3f8Az2oNnBMY55z9pj/6Y/8ALKg0Kf2zXLPVJP7D/wBZ/wAvnnVsabZfY4ZPPn8ySWs+HTdW021knvp4v3v/AH9rUmm+x2scEB82OX/ljF/yyrMPaMr3n268Mf8Aqv3VWOZpY8/upIv+WsNZ80PnS/Z4J445P+WPnUf6d+8gt/Nkki/11aASQn/iaXF9/rY7qHy4fN/561J/Y9veSx2NxBFL/wA9vO/5ZVHeXn7qOC+g/dxf6n/plRpupeddfbpx/o//ACxqqQBrHwl8D6lYfbreCS+/57Q/va4PXv2Xfgf4qv8A+1p4L6K8i/10MP8Aqq9Q0fxhfWdhJBYwf63/AI/PO/5ZVTmmnh8y+gH7y6/5Y1saHzv4w/YJsdYv457G++zeV+8h8mauH8R/sc65/alx+4jlki/6bV9ueGzBNYeRBY+Z/wA9v+mVZ+peG4PNknsYI/3v/LaWl7REe0Z+d/jHwH4j8B6p9ug0qX7R/q/3MNZ9n4k1zTbq3guJ/Mt/+fv/AJ5V+jH/AArfwdrFrJ/avhyK5uP+uNeR/E79j/w54llkGlaHFbW8v+uhtIaPaI0p4k8L8E/HjXNGi8jw5rkv/TGGWvfPhX+2x8RprryJ/HEumyRQ+XD5P/PWvB/iF+yV8VPh5F/wkdjpV9bafFN5cMt3Z+XXmcNn4x8N3dxfeRc+Za/6TDL53+tpnT7SjVP2k/Y//wCCsfxN8E6zHofxbvo9W0P/AJ6+T/qq+9/AXxm/Z7/aQ0v/AIpzxVbW95dQ+Z50X7r/ANG1/MZ4V+P3iPQf+Q5qtzHHL/x+eTqUsvlV9Efs9/tj63oMun31j4jvbaSKby7P995dHtfZHDicD/z7P6ANH+Dfj7wqn2yx1yy1Kzil83/Sx+8qnN8QtKvLqTQ77zba8i/5Y/8ALKvjr9iH/grONNtrf4d/E7VLnVjjzIdR87za+3PBWvfBf9onwjJ4j8NiLy7r93NNF/rYpa6aeNPJ+rVqIyGGeG18/wDdf89P3NV/J8/9/Vf/AIQ/xx4KupNDgg/tLT5f+POb/lr5UVWPDfirw54w0v7doc8XlxTeXDaf8tYpa9GnUuPQPJnmupPPqSyn/wCWFSTWcEMUd9fzyx+b/rv+mVE0M8P/AB8GLzP+W3k1RgR+b53mHH7z/ljUY/cxefP/AMfFWIfIEsf7ij/XGSet6exhU3KdniGX7cT/ANsasXn761/cUT9qjhm8mKQZpiK95/x99v8AptQYYJrX7RBUl5DAbXrUcMNx9l/f+XHb0AR2c0EMv7+o7Lz4ZZJ/+etSeTBNayVXmP8Aq/3/AOlaASQ/678aseT51159V7PyIZf39STTUGZIIfJ/cGf93RD++l+3QQeVcRf8sf8AnrR+4nMfn/8Af6i988/v5/8AWRf6mgAm/wCWn4Vw/wAfvtE3wW1j/t1/ff8AbWKuw+2e/wClcX+0hN/xZbVPI/5azWv7n/trFRR/jmVTY8z/AGaviR4V8IeI9U8OeP5/+JPr1n9nmm/55f6r/wCNVoa7+xb4/mv477wBrmk63ZxTeZZy/bIo/wB1Xj80P/LhB/yy/eV7R4P8K/DKHw5p899+1De6Jeap5X9pafaf8usv/PL/AFtetU/dHFTOg+HHwZ8O/s3yyfFv4qeIrL+0NLs5f7N0mGbzJfNl/df+1a8H8VeJL7xh4t1DxVP/AMxS8lufKlr2eL4D/B7x5r40m3/aZk1fUDD5kUV3Z/62L/lr/wAtf+ukteMeJNNsdN17UNJ0u++3W9rqUttZzeT+9liil/1tZ4Y0qn17/Z1v6Gkm03yf38H+rqxD+6qS8/fWteadxXhhgF1+/omhngtZPIg/64/9NasWc0EN3588Hm+VVeeb/RfInn/0yKbzKACGc+V5/wDyzog/64fu5ak+2eTFJ5EH7z/nlR9sgmijM/7uT/nlQBX/ALN/fSf8spKJofJtY/P/AO/NXPO/dR+f/rJak/cS/uJ4KzAp+dB5tRwzf6y3/wDI1SQTedL5HkeVVez/AH1rcQf8tIqALHkzf89/1qOGaeaXyKsQwiaLyBUfk+TdVoAeT+9jgqSGz/0XyKjmhPmx1J53ndv9V70GgfY/+W3/ADyquNN+x+ZPP+882rHnT+bj/ln9aPOnm/19HtQD7H+6jzUkM0/l/wCgj/tlRZ3kFR3l5B5vnzz+X/zxrluqpmSalN9jtf3H7yT/AFk0NY9nr39vapHBocH2mOX/AJ4zVHefaPEkXn/6uzi/eXk3+r/df8ta+b/2iv8Ago18K/gboN54O+B+lfabi6/1Msv/ACy/7a/62uOpiaNI6qWGrVj3D4tfFT4SfBnzPEnj/XY/7QsIf3OnedX57/tgf8FOPib8crX/AIRzw5Y/YtL/AHvk/uZa8L+Kn7RXir4hazcf8Jx4j823upvtMM0s0v8Arf8AnlXl/ir4naVZ2lxB/asccl1/qYYv+WVeRiMTVZ7+Gw3sg+JF5PrH7/XL77TcS/8APb/llXm+veJND0G2kg8+2+0RTReTLD/y1rH8efE/xV4klj8K+B7H7TqH+rmmrpPgn+w38TfirdW+q+OL77FHa/6799WVKmdtT90eZ6xeeONeuo4PCvhy5uY7qby5pfJr0j4YfsQ+KrzVLfXPiNBL9ouv+PO0r6w8B/so+CPhXFHPpWlxX155Plw+bNL/AN/a7T+x/tl9/as9vJJ9lh8vyZYYo/KrYyqVTyf4Y/sx+B/h7a3E99Y+XJdf8fnk/wDLWu41L99a25ggjsbe1/484Yf+WVbE3kTGS++3fvJf+e1Yc9nPNF5Hn+Z9lrnOYp2d59j1mSex8v7R/q/NrPms/wDT5P8AW+XLWhpsEE1/JfTweVHLViazxdSf886DM5O8s55pfI/5eP8AljD5NXNHhgEsljPWpN9um8yCCCOW4/57VX0iGCz1SODz/L/57Q1oZ+zQXujQWdr+/wD3sktZd5p039nxwQfuriKaus1ibSoYrj/Qf3n/ACxlqno9n5/mQXH/AB+S0Ghy+sf2rDYefB+8/ff6qiHTZ7yWSeeCL/U11n/CN/Y7/wA+xg83/ntDLWhpvhWCGL9/Y/63/Xfvv9VS9kaezZzeg+FZ57qP9/5VnXWf2bfQ2n+o/dy/6mpLPTYIfM8if7dHF/yxrcm0f7ZYW+qzwfZv+fOGj2QHJw6PBDdf8e8ksn/LaGpP7Hn/AOW/7v8A6Yw11E2mz/u/PEX73/XTVYs9NsR/00rT2QHD6x4bgvLqOe+t5JfKohhg1LRriD97F5X+pmhhrtLPQf8AWTj97HR/wisHnfYdKEX2j/ltDS9kZnB3mjzwxW8EHlyx/wDLaaaarF5Zz3trHYzz/u4v9T5VdpqXgOCaHz5tDkl8r/ll51Saz4V/sewt4P8Anr/yyrWnSD2pxem6B50skFjPF5fk/wDLaq+m+FZ7Ow8j7DL5kX7yGLya9Is/hvPr0UcFjpX/AG286qfiTR59Bv8AyLfxH+8/59PJ/wDtVa+yD2pwepaDfQ2serX3/LU/6ZFDUk2m/wDHvqvnV2mm6bPqWg3GlfYZY7i//wCW01U4PAd9Z+ZPrk/mW8X7uj2Qe1OfhvINH+0QWP8ArLr/AMi1HN5+m2H2G+gli83/AFNdZ/YNjDdWc89j5UdrNWh4k+HtxqX7gweZH/rIZq5vZB7I5fwfeTXn+gzz+VHVy88+CL+yvP8ALt5f3k3nVTGjz2XmXEH/AC1om1Lzpft08FHsjP2aKeseFND8VSxm4sf3cX7vyv8AnrXn/jD9nvwP42sLjSj5kckX/PH/AJZV6hpv76WSfz/3csP+h/8AXWq9nZzw+ZBP+6kl/wBdNWoI+P8A4qfsc6rDayX3hyeS90+X/j8iu4a+f9StPFXwf8Uef/ZUVt9lm/czeT+6lr9VP+Eb0nU7X+ytVg+02/8A0y/dV5/8SP2afA/iq6/caVHFH5P7mLyf+WtHs0ejSqnw/wDDH9oS+spbexsb6OK3tf8All5373za+tP2Yv28PFXwlv8A+1fAHiqSW4l/5Y/8sq+c/jD+yX4j8Hi41yDQ5PL/AOW3k+V/ra8rs9Y8f+CZv+JH/wAef/PKWH/v7WXsjpsqx/Q3+x//AMFbfDfjf7H4c+MN9FFL5EUk2o2s37qKvpzWfhP8OPiOf+Fm/DrVgNQv8eTd2k3mRS+X+9r+aj4P/tFXGm38ekweJP7N83yv9Em/5axV+hH7Fv8AwU48Y/B+WPyNbkvtL8799pMtdNLE1qR4mJwXY/US98ST+CZf7K8cf6yX93Nd+T+6lq5pv+mf8gqf7Tb+T/rq574MftOfAP8AbR8JRwWN95d3LD/x6Tfu5aqaZpHiP4Kaz/wh3jC4/wCKbmm8zR7v/Wfvf+eUv/kKvSpVPanm1KdWkdh5P72PJo87/Wf886km1iDUovt0E8Xl/wDLaq83Hl4/495a6jIkmh86LPn1TvLL/VwefUn7/wD1/wCtV5oZ5pfPoA0PJ/d+dmo4ZrG84ngqudSnhh8jFV7OY+bQZlia8g/efuKBZwTRefUc3kfZajh1LyYv3EFaARzQ/wCr/cVY+xwTeXzR/o8/7+D/AFn/ADxqxpn+t5/1daGZX8mDyv8ApnR/x+f9dIv9TR/6Kos/9b59AEn2P2/WuD/aW/c/CDVIIP8AWf6L/wCjYq9E8/2rz/8Aacm/4tBqh/5Z/uv33/bWKlS/jGVTY+V5v+eHkeVJLXeaP8B/jTr2jf2rofhX7Tb3/lSQ3cP/AC1/6a15+MT/ALixnk/1P+urqIfjB8RtNsLfStK8Y3sdnF5X9mwzeVF+6/7ZV7k/4RyHoHwf/Z1+NPhvx5Z+Kr7Q5NNs7CbzLy7u5v8AllXn/wAWtS0rUvi14kvtDvo5bO61iX7HNFN/rf3tU9Y+KnxG1KKTz/GNzF5v7ubybyX97FWXDDPDaxwZl8uKaXyf3MX/AD1rOkaH2ZD59STXk/lfuKsTfvaz5oZ/N8iAV5B2BD9o/wBeaJvP630H7v8A5YzQ0Xk09paSQeRHLUmmzf6VHB/yzoArwwiH/lvLJViGGeaTz/3XlxfvJqkvP30v7+eXy6jhhgh8z/npQBY/cXkv27P+jy/6mjyPeo5v30sf/TL/AJY0fbJ5TWYBNN+9j/f1JN+5i/1H2apLyzghl/65UTf6ZF/z1oAjhvKkmmPm+fVOzh/ffZ/+WlXDNB5UcH/TagAgm/1cFSeT+78nNV5vP+1SVYhvJ5v39xWPtTQsQzQdKr3k0EPl8y+X53/LGo5oBDFJfef5Uf8A6NrD1/xVcaPpfnwfu5P+mtc9SqdBJ9ssbOKO3nnilklhl+x+dXH+NvGGleBIv+Ej8R6rHFZxf8ecN3eeb/11/wDatcv4q+Knhv4J2H/CcfEYyeX5P7m0mm/e18J/tUftaeKvj94jkvr6+ittLupvL0e0l/55Rf8APX/v1LXk4nEnfhsN/wA/D0z9sf8A4KHeI/GF1efDn4EX0um2f73/AEuH93/11/1VfC/irxVPrF1/aviPVbmKT/lztK6DxhZQaP4cs9c0qCLy5f8Alr/yyrxPxh8VLibxH/YelWMl9Jdf8efk15tS9U9KnT9iaHjD4haH5Unn332aOL/Xf9Na5/4e/CX4xfHjXo4NK8OfYdPim/c6h5P+qir0z4G/sZ+I/iRr1v4x8cWMltb/AOshtK+0PDfw30rwra28GhweXHF/roa6FSCpiTxf4G/sZ/Dn4eyx32q/8TLVJf8Al7mh/wBbXtGg+D7Hw3YeRPP/AKr/AFMUNaGmwQWctxb+R+7l/wBTReQ/Y/8ATr791bxf8fnk/wCtrY4fa1TPhvP+Ekv/AOw/sNz9ouv9TN9j/wDatV/iF8PvFXg/wbeeMf8AhG7mSztf9dN53mV9cfsm/Bn4MfDH4en4qfGfxVbRXvneZL515F/qv+mdef8A7Y3/AAUZ+FnxIik/Zs+BGiR6ncXX7vzZYZfK/wCetA6Z8p2epaVqWl/boIIpLeWz8yzimqvDCYbX7dn95df66rEOjQaDo0djP5f7qby5vO/1sUtH7iaWQf8ALP8A6ZVznQZc1pPeRSWMEEUscX7z97VOzm/0+Pz55IvN/ef9ta1JrOeGLz/Ik8uWapIbPMcljB/1082gzK//AC6yX1vVeHQYPtUfn/8ALWtjTNG/0CSxNamj+G57y6j+w+X+6/57VtSA5/UvCv2z/j+nkiji/wCW0VXLTQRCf7Vnvoraz/5Y3f8Ay1lrrNH8B6rNDcT3195cf/PWtjwr4J0qa6jsbjQ7nUo5f+PPyf8AVRVt7NAcfpug+d5nkX0tzcS/vK6DTfBN9rGjfv4JJbj/AJ5Rab9pr3z4P/so+Mde1n/TtDli8393D5NfX/wa/ZG+DvhrQY5tb8OebeRTfvv7Ql/5a10ezZzPE2Pzo8N/syeP/Emq250PQ7m2jlh/1v2Pyq9Ih/Yh/aF+wW8994PvbaTzvL8mGzlr9HtB0bwH4WtvI0qG2hHcCr0GveFZjH5F/bS/8s/9dWvsjKpij8x9S/Yz+MWm6p9hvfB179nim/1UtnL+9rcm/Yn+Ld4P7V0PwP8AZv3P+p8mv0o+2WNna/vz/wBtakE0BtY54PLk/wCuVa+yM/rtY/Ofw3+wr8TfsHkf2H+88799F5NdZD/wT38R3n/FR2Gh+XeWv7vyvJr630z44+Dx4uuPBGq39tZapa/64Tf8ta7WG8+2COeGf/tlFNV+yomX1isfE95/wTN8ca9pdwL7xXFZfuf3Pkw1seA/+CY4spbc+K9civZIof8AltDX1/DF5MnX/wCOVl+IvGFvoVw8F5ZeZP5X7nHes7UjP2lY8c0j/gn78MrOPz76byrj/p0hroLP9i34Hwx+dfeB7K5uP+e0tnF5lXNY+LWqw3X7j/Rqy4fj99j1TE+uWMnlf8spf9bLR+5H7SsV/En7CHwe1iLzoLCO2k/6ZQ1xc3/BM7wP+9xrn2mO6/56w16po/x9/ti0knEEVtJWxrHxOnh0q31Wwg+0x/8AL5ij9yWvbHxX8Qv+CcvxG0f9/wCHIIrm3tZv9T5NeV+MPhL8afBN1JBqvg65+x+T+5hhhlr9GNN+M0E3/Ic0qW2jlm/czV1EJ8K+NrX9x5Vz/wC0qyNfrNakfjvqWgj93ffvIre/h/0yWX/nrWPrHhuCHVI/t0Eccnk/6qL/AJZRV+mnxm/YD8HfEL7Z/ZN99m+1f8ulfMfxO/4J7/EbwtDcX32GS+/ff62oq0jppYpVT5bvNN0PR4v399c+XL+803yqjmhB8vz7Hy/N/wCW0X+tr1jUvg/rvhWKSG+sbn7RF/yy8n/VVyep6P8A2PL/AKd+9kuv+mMtZeyNfaI5O8zF9n/cRfaP+e0NGsXkE115FjPcx3EVdBeaPYTan/qJYo4v+Pyb/wCNVh+KtMvtB/cTwS/9dqzCmRw6bBqVhJP9hiuY5f3flSw+bXj/AMbP2V/CvirS7iD+yra2kuv3nk/Y/Lr2Czgns9U+w/8AHzHLD++qvqV5Bpl19hMEX73/AFMtB0KpWpH55/GD9lHxH4Pv7e4sbGOK3l/dwzRfvf8AVVzfw3+PHiPwfrP9ia5BLJJ53lzSy/8APKv0Q8YeG4PFWl3ljrlj5v7n9zL/AMtf+2VfK/7RX7KMGpX9vrnhX7T/AKny5oqDpp1bnqn7KP7WniPw34jt/EfgfxHe2OqWH/HndxTf62L/AJ5V+uH7H/8AwUH+GX7Tml3Hgb4mQRfaPIik827m/wBb5v8Ayyr+bP7Z8W/2e/GUkH26WS38n9zaV9Sfs9/tRT2etW8/26OOSw8q5vLSH/W0qdT2RnUpe2P388VfCDxF4Q1S48Y+ANWkl0+WHzP7D/5ZRRf89a2NH1KDXtLj/fy+Z/y2/wCnWvkr/gnl/wAFPYNTjj8AfGm/t4o7r97Z6hLDL+6i/wCeVfaOveCbHxh4SuNc+GV95cl/+8hmh/1UtelSxJ4mJp+yKd5Z+T+4/wCWctU/9TLJBcf8sqx/hj8SJ/Hn2jStc0r7NqGjTeXeWkMPlSy/9cv+mVdReabiWTz/ACpJP+mVdZymfN+9o8nr59WIYfJl/wBRRefvutaEezZTvPXz6jmh/ff6+rEFnBNFUksP/PCtBFf/AKd/0ohhHleRR9jn82SiE+TdYop7AEP+mSyVY87yP3FV4ZvJtZJ6JpuY5zB+7rQzJPNm9a8//acmn/4VVef9dov/AEbFXefbPf8ASuH/AGl/33wh1SfyP9VNa/8Ao2KtKf8AHMqmx8vww/uqkqMQ+T+/8/8Ad/8ALGrE1nPZxeffQyxx/wDXH/W17n/Lk5CnMP8AT458/wCqohH72T/prNUkME95LGLH97JLN/qYYf3tH+kQ3fkTweVJ/wA8f+eX/XWinsaH2R9suPQfnRNeTw/6/wD1dRzQ+TL+/ovPIlij/wCedfPnYSTf6Z/x4wVH/qf39WNN/cyyT/8ALPyak/s3zuKACGY3kWZ/9ZUnnfbBH+4qvNZz+b/zy8qpIZvJl880ASTQwQy+ROaPJgh6f6uX/ltUnt/z1/5a0fY/JtfIE9AEcM08MsdjP/rIv/ItH+pl8/8A5af88qNSm86KTyP9Z/yxo/5a28H/AH+mrOoaEc00A8yGCf8A1X+umosxPN+/o8niTB/1tEM32OLyCKzAuQf8e0dRmH915Fv/AKyizm86WOxrk/GHxI8OaDqkelTz/abiWby4dPh/1tcFSoa06ZT+LXxCvvB/l2GlW/mapL+7hhlrz/4kfHLwr8DfDn/CR/Fu/wD7S1DyfMh0m0/9FUftUTeI/DfhyTxjPYx2OqfY/Ls4vO/1X72vzz+MPxI8VfEjxHcfbvFUstx/y2h/6axV51TE+yPSw2G9qH7RX7QnxN+M2qf8TzxHLJHL+8/6ZRRf88q8D8VeJINI1OOxOuS/67zIftf/ACyi8r/VV0HxC1i+03S7f+1r6LzIv9dF51ePy+G/Efxm+INx4c8OeZJby/6maGGsvZ+1PS9kV9X+JHj/AOMHiP8A4VX8OfN/s+6/d/8AXrX1B+yv+xP4c8N2Fv448YwxS+VN5cM03+f+mtdZ+zH+xz4c+D2jR33iPQ/MuP3Uk03+rr3TUtSg/eT2P+jeVD/odp9speyOapVMfUvCvhvw3F9usZ5PLtf9TFWhpt5/bHEH/LX93NVzwf4O8SeNb+4sYLGS983yvJ/c19kfBn9jnwBD4ck/4TeCKPzYf9V/qv3tUc1SofCepWfk3UkH27yvK/eVcns4JrX7d5HmebD5nk/89a+rPi1/wTg1TTZv7U+Fd/JIkv8Ayx8mvn/42fCvx/8ADfwRefbvDlz9otZvLhm8mgzpHh+seNfGN58Of+Ec1zXLnUri1ml/fed+6li/55Vwf7LvhuDxJ8QdU8Y6VYy239l2csf7397/AKV5v/PX/rlXpnxInsLPwHqEEEH7v+zZZIZf+mtU/wBmnTr/AMH/AAMuL7VYPsMms3ksfnS/9df/ALVWZ2lc+fNLeX08H7yW8/5bf89ap3lnOYri4g8v91/roYq3NS03zpZL6CD7THf3nlf9cv8AprWfe/8AT9/y1/11ZgU/DcIvLXz8+X/01mqSaz8mLyLGD9353+qqSHz/ACvIg/49/wDljWx4b8Nz69LHYmCSWSWby6AK+j6P9s1q3ggPmebXeeG/gb4j1K/j+wwSx+bN++r6A/Zk/Yo8RfEHw5H4j13VbnTY/O8v7JNDX1p8PfgP8JPg/pkfEX2iWHy5buWuulTM6tX2R8d/Df8AYt8Y+KtUjgvp4orOKb99FL/y1ir7A+GP7Jfwr8B6XbwQeG7KT9z/AM8a0PHnxJ0rQfCV5P4c/wBJuLCHzPNtK5PQf2m9I+JHgm8s9CW4k1W1spZJ44Zf9XLWv8I4f31Y9I13QbHw34SvP+EOsIo7zyf3P/XWvj/4e/tf+MfjN43vPA8+uf2bqFhNLbeVN+682WvT/wBnf9sCH4hax/wgHj391cy+Vb+TdzeXLHL/AMta4v8Aao/YAvNY+IMf7RfwPv8A7L4g0uEedpNrD+6uvL/e/wDtStfaM0pQ9k/3hgax8ePEfwr+IP8Awivxwnvo7O6m/wCJbd2n/LWvaNB034ceO/Dkd94V8VXP2zVP3kPlTS/62vnf4hfHL/hNvDn/AAgHx3+El7pEksPl/wBreTL+6li/7ZVX+EvwB+J1nYR678Hfjhc23/PHTprz/wC20vaM6f3NU+q/Cnxa8VaDL/wgPxo0mSKOb93Z6j61s2ninSfAkn23RPFX26Izf8elcH8MdB+P01hJofxNmiuY/J/13neb5tdhoX7Pmkyy/wBuagZJJJRkxeT/AMtaPrKOapSooPGHgn4WfFQx6rPPbf2ha/8AMRtP3UstcnDoPxU8Ky+R4O8R3Nz/ANdpq9jh8F6FpsXkWNlFbW8X+t/0Sl03TdK83z4P+Wv/AExp/WURocf4Vm+OHleRrl9beZ5P+f8AllW5eeD/ABX4ktY/7dn/AHn/AD2hrpPJFnLHAK2BNDiPyf8AV0U6ntTGqeb/APDOulanFm+1W5/7/VhzfsW/Dma6+3T3195n/XaWvZJtSsYf+W9UrzXbeGN5/OHlj/W8VZlqeaaN+yj4c0GXz4NcvpI/+eMs1dhZ/Dex0ew8iCf93/zxqSz8VWGpXQg0qep9Y8S+ItIi+2waV5sdA+Ssc5r3wg1S88ueC+tv3Uv+qmqnpvgnxXpuqST+RLFHL/z6Cu003xV4c16Lz4J/+/1XIvP/AOWE/mx/88q0EU9Nm8R2dhH9ugik/wDRtaAm0rUhJb3EPP8AzylqnN420PTr/wCw30/2aT/prUlnrGh6x+/sb+2l/wCuM1Bmc946+BHw68eL5OreG7f97/y1tf3Z/Svnj4wf8E04NYl/tXwBfW0VxF/qYpryWvqz+zIIf38E8sVH/E1hH7ifzKf7oaqVj81/ip+y78Tfh74c+w+KvCskv2X95Ndxf8ta8T1jRzNdedqsEnmf88Zq/ZCeyg16w+w63YxXsf8Ay2ilFfP/AO0t+wH8Ofi1pcl94csfsN5/rLPyof8AlrRUpHRSxJ+a/k2P+onni8yX/ltFWPqem+d/p0/7ryv9TXUa94V1z4e+MrzwP8RrGSxuIpv33nQ/62Wqd5ZzzeZBB/x71xVKfsj16VT2py82sQaPLJfeR/pEUP7nzf8AVRVlwzDXpft1/Y20kl1/rvKh/dV0GpeA77Uv9OgHlR2v7ybzf+WtcnNDBpt/JfX19/rf9TDWZoeX/tCfs06H8Qpby+0nSv8ASPsf/LGvkfxV4J8V/B/xbJBBPLHcf6y8u/8AplX6ETXl9Nax24/1f/LauT+PHwN8HePPC8d94cg/4nFrD5n+p/1sVZjw1U+e/gd+0VfaD4js9D1XVrny5YfMhi/6ZV+qn/BN/wD4KraV4Vij8D/FTVdSvdD/ANXpt35MX7qvxT+P3gPxV8GdZkvp7G5/s+XypPOih/1X72u8+CXxgF5LHfaVqv2a4is4vOhmm/1tH/L46KtKji0f08ax4V8Oa9/xdT4czW0uoSw/uZrT/lrFXN+CfidofiS6vPDk8H2LUNL/ANdDN/rf+uv/AJFr85v+CfH/AAUZ1v4N3tv4a1bW/t2j3V5FHCJrz/VRV+jHjDwhoXxf0LTvjB8LNVikuI54riX7J/y2i/1XlV6NPE6+zPAxOGdJnQ3n7kR/9Nf3lU5v3/8AqKIdSvoYv7K1y+jjvP8AWQxVJND53+o/eV00qhiU6khE8Mvn1JNpvk/6iDy6Jv8Aph+FdRzkn2z97Jiq/k2M0P8Ar/3lEx48/wD561Tmm+x2vkVdPYC5ew+TcxwQVX/ff89/+2VEP2jzZIJ/+/1RzD/lgf8Av9WoEkP/AC8Y/wC2NcX+0VDB/wAKW1AT+b5fnWsc3k/9dYq7D97XD/tFTT/8Kq1CA33l+bNF/wCjYq1p/wAc5qmx4X8PfhX4q+KmtXnhzwd5X+iw+Z++r2z4qfsx/EbxJ4c8Fz6HBpv2jQdH8vUof+fqX91/8ar5vs7yfR5f+P6S2uP+W00U3l+bFXuHg/4V/Eb4weF9L1Xxz8VI/D8ctn9m0eHyfMll/wCmv+tir0antjmpB8Mf2UfiN4V8Zaf4j8VarpMWn2H+kzXcs37r/rl/qq8v+LWpaHqPxL1zVfDkEUtnf6xdSedD/qv9bXSf8Kr1bWPjJefBb/hOP9V+7/tCbTf9bL5Xm/8APX91Xn/iTR5/CviO80O+8r7Ra6ldW037n/nlL5X+tope29qUfaF5ZQTRVnw2f73yAf3dXLOafvB5tSQ+RD/r68k7A8m3z5GKjhvJ/sEl9/y0im/1NSXn/H1/r/3dAm86Xz/IoALz/VeeLj93/wAtoqj8meaKOf8A56/6mo5vp5kcv+uqSGaeH9x/yz/5Y0GhJDiHzID/AKuo/wBxLF58Hm+ZVjyf+W/60GHybX/X0GftCneQzwy/8svLqP8Af/6/H7utCL/TLryBBUn2Tj/pnQaFOaGfrUc0P+i+fP5X+u/ff9cqsTXn+s/55xf8tv8AnrXP+PPGFh4b8JXniPyPN+yw+Z/01rhq1ADX9eg03/ToPLit4v8AUyzf8ta+e/G3jzSvh5DefGnxjqsn9uS+b9jh/wCfWpPHnxC1W8+HN58TfH99LZaX/wAudpFXyH8fvjZrfxC8uCee5jjuv9daQ/8ALKKvJxNU9PDUiP8AaE/bG+Knxaikgn8yPS4v9G8n/nr/ANNa8L8bfEjSvBNrJ4jvtV8qSKH9zDD/AMta0PiR4qg8N6DJfX88flyw+X/2y/561836Zpvjn9q74l/8IN4H+0xaXFN9mmu/+esVeeelT/cnUQ+CfiN+0h43/wBBn8q386Lzpof+eVfbn7Pf7KOh/B7wvZ+KtVgkuZPsf7mH/trXSfs9/sr+Ffg/pn2AWMUtxa/vIZZv+WtemXmpareRSfYYPLj8ny/K/wC2tb0hVKpl3nnw3UkEEEXlyw/ufKqObTINB8y+1U+bp9rD++ltIa9c+A/7Peq/E+KSf7DFHH5P76X/AOO19ETfsgfCvUvAdz4Asvs0d5dQ/vpfJ/5a1qcVQ+Q7P9vz9lf9mnw5bzz30UmoeT++imhl/dV89/FT/gqVY/GbxH/bnhvxHc6bb+d5kMMXmxebXYftLf8ABP7wB4J+KFxofj+xiube6/5e5q8f8Sf8E8fgfeX9x/YfiO5sY7X/AFM3k/8ALL/v7XOdNJe1PaPg1/wVW+O/w3uY5rLVY9f0uX/l0uzF+6r0f4vf8FYNK+L3wou/DV78Mo7K8vrLzIZjaSyxxS/89f3X/LKvhTxV+wr8W/CtrJqvwr8VRalb/wDT3NLXJ6lr37Qvwfl/4Rz4m6H5Wn/6uzu7T/VRf5/55UGlTDK59cfDf4Sz/GzRo/A8999mvLqbzPO86Kuw+Nnwl8VfDHRrP4c6roccdn5Pl/a/Oi/e/wDLWvN/hj8VINH1DR/FXhyf9350UnkzfvZa/RCfwf4H/bA/Z9jnsYLb7ZFD5c0sMP72Kgz9ofnnDCfsEdjYn/W/u5vtf/LL/prVPUofItfIgrvPi18Pf+Fe+KZPDniP/mF/u/8AplLFXJ6lDBNF+4goMzP0HR57y1kg8iLy/JruNNm8OfD3/io5/wB7b2HlSfvv+etc3oP+qk8g+bJ/y287/nlWX+0tZ6pqXwH1ix0O+lto4v8ASf3P+tqfZB/y+Ppj4D/tpfEX4qaD4k8HfDq9il+yw+Zps3/PX/Vfuq6j9mP9qiDxtFqmh/GLXJLbUNGm8vUtO/z/AM8q/PP9kvx5rn7K/jLQ/iNPPc3uh6pef8TLyZv+PWWvrz4zfs9wfGu/t/2m/wBl7xVbR/aoftOsad50sUUvm/vf+WVa0rnTUpe1pH3p4W+KnwQvIpPCtjqttJH5Plwy/wDPWvn/AOJvwI8ffs6/EeT40fBXzdW8P6xN5msaRFN5kUX+fLr4T0HxJ8cPhvr0n/CYz6lpuoed+5hu5v8AllX0h8Gf+CifxF8B6P8A2H4q0n+1tLi/13Hm+bWpzfVWeyePPgz4A/aEsI/ip8Mdb/4R/wAQWsPm3kX+r/e/9taPhL+1P8VPhLFJ4V+KsFjL9lm/1X/TL/nrXk+sf8FGvhl4jluNK8HeAJLK4v8A/j8+yQxR+VXN+D/BPxN/aE8YyePvEdjc21n/AMe0P77/AFsX+t/9q0GlXDn2ZB+0f8CPiddW8E/h2O+vD/05y12Gj2fg7Tv+Jroehx23m/8ALKvH/gn8JdD8KRef5EUdx/yx8mGvVJvPvIrefz/Nki/11Bzez9kdZ/qYo7j91/0xqT/hI5rOKSDz/Nki/eVzf9sfupIKz/7Svvsv27z/AC5JaBmxqXiofavIgn/d/bP9TLWp4a177ZdXEHnxf9Ma+Z/2kPjDrnwNuo9c1WC5ks7q8/fTf88qPgz+0tofxU0uSfwdrkf9of8ALGLzqKewvZH1BNrE/m+RBcVjQ/F5YpfsM6yRyRw8+bXGaD4k8R6b5dxqsEktx/y+Q/8ATWvO/wBsab4jfD3RrP4t+AJ/t1nFDFHqVp/21/8AttANI94vPGEF5+/gvrbzP+ePky1z+veNp5rX7DYz/vP+uNeD/s6/tL6H8YPtE+q/aYri1h/ffZJq9Y1+aeG1t9csYJZbeX955tAvZIseG/HljDdfv777NcRf8sa6Cz+LV9Zap5EH+k2//Lavnv4wTa5DoNx440Ofyry1/wCWP/PWq/wr+OVj8QvDlvodjffZtYtYf+Jl/wA8vNoH7I+kPElnpWvf8VV4cnkivIv+XT/llLXF6z8d/FXw9uo9K12++zW8X/L3N/y1/wCmVeN/8Lg+Leg/6D9ukj/tT/UzS/8ALKKu8+BvxI+HP7Tmjah8M/ibpUX/AAklh+78m7/9G0e0M/ZHrGj/ABy8AeJf3Hir7NLcRQ/uZof+WtSTfDHStSluNV+Fnj+SK4/1vky/6qvif4+/s9fH79mm6uNV8D+I7nUtLimlks4pZpf9VWH8H/2/PHGj6pZ6V4xvpbG4lm/1Pnf8sq09qL6l7U+7NH+NnjH4e3/9lfFvSpPL/wCWN3DDXqmj+JNJ161jn0rVYpY/9Z5teJeCfjj4A+NfhyPSvEQjlj8n/XeT5lM8RxeOPgR5eraHbyalo/8ArJpYpv8AllXTTqo5qmG9ke8TTW8Mv7/93/z2qv5wz/xKvKlj/wCu1cN8Mf2hPB3xUsf7Kgn8q8x++EtL488K+KtHMmueAL7zJP8AltaTTVr9ZM/ZM83/AGzP2QPDfxgtv+Fi6HB5WqWEHl+bF/y1r4L+IXgO+8E69/wjmraV5UkX/LWv03+HHxq0rxJfnwrrn+g3lqPK/s+6/wCWtcR+1b+yLofxUtJPEfhaxtv7Qih8zysf62lVOmlV9kz84/FXgj7Zo3264vpZP+WdcnrHhuxh0v8Aso/8fFrXpniTwr448B69eeG/HGlfZvKmlihh/wCetcn4k00ebHPP5cUnk+XN/wBcq86pset7T2qPN/7H860+3QT/ALyrFn9h82ODH+trpJ9N+x6XJffYf3fneXWHeaZBZ69H9hnil8r/AJ41mBzfxf8Agn4O+MGlyaTf2Pl3EsP7maGvg/4/fA3xV8H9Zt7jStDktre1vP3Mv/PL/prX6Kf2lfQxSQf6qsvxt8LND+L+g/YdVgiubi6/13nQ1l7Q2pbnxv8AAH42aHeXX/EqvpY9QtZvLmiu/wDlrX6sf8Ezv+CkE/w5ubP4YeP7j7Ro91N/oc3/ADyr8b/id8K/EfwM8UR6rf6V5txpc3lw+T/y9V6B+z38eP7S1mSfQ/Ecst55P760mm/1X/XKtPZ/8vDerSVY/ow+L+g674kGn/GL4L6rHcx+d/pkX/PWL/nrWx8MfG1j488OR67pUH7uWb7N50v+tilr4b/4Jj/8FDv7HsI/hX8W765l0+WGKOzu5v8AWxV9ofFTSNV+D9hcfEbwbZeXZ3XlSXmn2n+qi/6axV24aqeBiaXsap3H+pi8gf6ys+ftVPwR42sfiFoNvqulf8+f76rEMIn8yfz4/wB1/wAsq7qZwkf9mzw/uJ6jm03vPR9tn/5b1JNLBN+4/wCWldxmRzD/AJd/Opk3+p/Coof9VJPRD/qvPxQAedP/AMsIPMjri/2kP33wW1g/8s/9F/e/9tYq7Awz/wDHx5/l/wDTKKuL/aQm8n4Oap/26/uv+2sVaUf45zVNj5j+x/bJfIsfMl/5Z19EaxoOreNpfhX4/wDB0Elzo9rDa280VpN+9sP9V5v+f+mVfOc15+9+0QTy23/XpXpnwN1P9pKyluL74L6HqUlnHNFFL9kh+02tetU2Oakdp/wqbxH4p/al1DxHPpVzpuj2t5Fezatd/uov3UUVeV/GzWLHxJ8Vdc1yxnilt7/WLr/tl5UteoeNtS/bY+IOl3Gha54V1safLZ/vfsln5Usv72vD9S02+0G/k0rVbCS2vIv3d5aTf8spYqzwxJ9ofv4OD+6/6Y1HDNB/x8XEH/TOpP8Ap48/zPNqvrEM58u3gg/dxV5p6BJ+48ryPs/7yL95UmjzfY5pPPn/AO2VU4ZoIbqTzv8AnjUk3/Eym8+CeLy4qDQklm8mXz4IKjvfI/5Yf6umQwnUrWT/AFsUlPgs5xD/ANcqAJLO8/5YX3+s/wCWNSXnnzWtV4f3N1jP7utCGb995Gf3dAEem/ubqrH/AC7SVXm/dS/uP9Z/yxqT7ZBEP9O/eSf9Ma5qoFPUprGz0aP7RP5dvF/5CrxP4kfGbSfEkslj4cgj+x2H/ISu5f8AVS1sftd+PL7R/Btv4c8OT/6Rql5dW0Pk/wDLK1r5j+MHxO8K+A/Bsngfw3P5kcUPm3k3/PWWvExOJ/5dndhsN+9PP/2lvjBqvxO1SOx1z/jztZvLs7SH/VeV/wA9a8D8beL/AA54J0G41W+nl/tS6/4/Jf8AllFWh4w+IX2OKTXNVvv+Pr935Xk181/FTx54q+J3ii48DeHIP3kU0sc0tcVP96etT3JNYh8R/Hj4g2/hbwrYyxWcv7u8u/8All/1yr78/ZR/Z18HfBPwHZ2Oq6HLLceT5f8Aon/LrXH/ALH/AOyLofw98Lx65rk/2mT/AFnlV9KWdmYbWPyLLy/NhrT2RnVqkc2pX00sfn+VJHa/6mKL/W13nwN+Es/jC/8A7c+wy21v/wAtvNo+G/w9g1i/t/Pg+zf9Npa6T4tftFeFfg/o0ngDQ76Kx1Dyf337nzfNrU5NWbnxs/aE8OfCvwbJ4V8OfYZbz/V+V/z1r88/jZ+05qtn4t/4pzxHLHrH+s86GvUPDd54c+M3jeS48R6rcxx3V55UN353+qllr2TxJ/wTC8DfCvw5J8RtKsf+Ek1CGHzJpvO/1tY+1O+lTR4H8MPF/wC018QfBFv4j+NPiOSWT/lztLuH979lrYmmgMUk8E/mxxf89v8AnlWxea9i/jsZ7H7NHaw+XNaY/wBVWHqU0H+osZ/3cs1SFSoU/wC3f9Kj8jzYo5f9T5X+qo8YaD4c+MGg3Hhzxxff6HFD/pk0v/LKWqc0M/2ryIP9XFUf2O+mtfIgnj8vzv31BmvbHzX8K/FXiP4M/Ea4+EfiOx+zXEU3mabd3dfan7L37R998DvFlp4qsv8Aj3uv+Qx53+q82vm/9rT4Y/8ACY+X448Of6FrGlw+ZDdy/wDLWuP+Hvx+sfDfg2SDxVf/AOq/eXk3/TWg09mfrH+1R8PfDv7RXwqt/iN8K/Eclz5X+m/6JqUUf72viDyIJrXyJ/8ARryL/XRV5P4D/an+P2sf8UP8Ftcvo9Huv3mpTTQxfuoq9Q8Lab4jhijvvEc8er3mqf66b/V+VWhz+zRoWdnxcXEEHlySw1l/ELQdc17QbjQtDg8ySX93NXQeTqt55kEFj/o8X/LX/nlXtnwN+Btj4q8zxHqsEsccU3+prQzPkP8AY5+HvxN1jxRJ8OfEfg+SXwfL5v2yGaH/AD/y1r6U8E/sffFv4P38njD4O+MfsMf/AEBIpvL+1Rf8sq+lPB/gnwPoOnyQaH4Wjjk/5+62IdBgmijuPP8ANjioOj6yfLfiT4V/tUfEKWOx8cQabc3kX+uu4ofL/wDatSTfsK/Ea8sIx/blt/02hhr6ks7Pzrrzx+6jrY02z8mWSgPanzf4J/Y5g8Kxef5H+mf89vOir1zTLPVtB8OeRfX0kUdr/wAsfOr0yHTdKmhjnv7fzP3P/LGse80Gxmtbix8jzY/9Z5NAVGV/g/eQaloNxP8Auo9Q/wCXPzqNS8YWOj6zcaHcT+VeRf8ALGuX8K6l/Y+v+fBP9mjl/d/9cqp/tB+GvEfi/S5Pib8P/wDkKaXDdXM0P/PWL/W0HOdhD4k86LrReax/xL/In/1dfN+g/tFX155fir/VW9rN5epQzf8ALKvZPB/jzQ/G2jW99Brkcvmw+Z53/TKsvamns0dp4q+G/hX4/eEtU8HeMR5dvf8A7ubzf+WVflP+0V8Mfip+wr8ZNQnGlS23h/7Z/od3FD5Xmy+V/wCRf3VfqZ4b8UnTZfIvv+Pzzv3Nanxt+AXw5/au+Gl54V8SaJFJeSw+ZDd/88pa1MqdTU+V/wBlf9rTwP488EafY+HNVil1jyYpNSihh8ryrr/Pm19h/Cz4g+G/FWjz+Fr68tY4JYfKEU0v/HzX5AftC/su/tC/sK+N5Ncgvv8AiTyzS3MN3F+9/wBVXrnwM/a01zxJaxzz33l3H+s1KWKbyv8Av1Wh01KdKqj6g/aQ/wCCc082qSfFv9nrVbmx1C1hl+x6dF/rZf8ArlL/AMsq8j+DP7S3xi+A8sngf4jeDr65t5f+PzzoZfN83/lrXsHwl/b7/si6j8N6tffabeL/AKY/va9g1jQfgh+0roo1Wy+zW97F/qYpf+ev/LLzfKrM5v31I8r0H4nfCvx5YR/2HffYbj/l80+7mrw/48/su+I9H1m38f8Awk+0yR/bJbm88r/lrLXcfHH9jT4i+ELr/hI7C/8AsVv/AMtpoZv3X/TL/prXH6D4x/aF+D0sn9qzx+INH/1nk/uvNrL2ppSqHJ6D8Qp/G2l3E+uX0sV5L/5Ky1y/iTxV4j8K/FDT/ipod95moWsPl3nk/wDLWKu48U/8Kr8YfY/HHgi+/s2TzopNS0+b/lrXUal8JdC+J2l/25oehxySf6uGGGbyv3tL2p0n0J+zr+1/4U+MHhePStbvrb7R5MUc0Us1U/jx+xp4A+J2jfbv7Dj/ALQ/dfY5Yf8ArrXwXr3hv4jfA3xv5FjPc2OoXU3mal53+qi/65eVX1Z+yv8A8FCNJ8eaDHofjiCXTdQtf3cN3L/y1p1KgHkfir4Y/Fz9lfxbb+I/B0ElzpcU0sd5DND/AKqvqT9nX9q7XNe0aM33lyyS/vPsl3/rf+/tanjDUvCvja1+w6rYx31vdQ+ZXgevfD3/AIV74ikg0PXPLs7X95D++/1VZ+1M3SufSGseDvAHxg1CS+sZ/wCwNY/5c5oZv9bLVfQfjP8AGH4HXMfhz4w+HJLnS4v3f9rQwy15/wDDj4haH4q0yTStcnktrywm/wBD8r/W+V/6Kr1Dw58ZvDkNhH4O+LdlFfWfneXDdzf88v8All5taYap3OGrTO08SfD34c/H7QbfxHBqlt/aH/LHUdOm/e1X8N6/4x+Et/H4W8b28t9pf+rh1aL/AJZVyd58N9c+G9rJ8Rvgt4qivbe1m8ya087zf3Vdp8N/jl4A+J1r/ZWq2P2bUP8Al8067r0vanKVvj/+zV4H/aE8Lx30P/H5F+8s7uvzo+Nvwk+I3wZ8W3HhzXNK/d3X+p1GWH91L/zyr9PJtA8R+D5ZL3w5ff6PL/qbSsP4zfA34c/HjwnJY6rY/vPJ/c3f/PKWsqlPQ2w2JdJn5PzWc/7v+1YJftkX7uaH/llXP6l4P1WzuvsOq/6z/WWf2SvZP2lfgR4w+AXjKS/1z97pcU3lzTVxeo+fefvz+7krnPVTued+TBeS/v8A/WRf8sa3PDc08P7+D/RpIqk1nQfNv/Png+zW/wDy2u6kh03ybTz/APWRxf6n/prWYzD+PHwH8OfGzwvefYYPL1TS/tX2Ob/nrF5Vfmv8Tvg/qvwB8eSa5Pocsfm/vIZof+WstfqJpviSe8+0QQf8S37L/rvO/e+bXj/7TnwNsfip4Xt77SrL/SJf3f77/llFS9qbKqzwf4G/FTydPjnsZ/MkuofMvIpv9b5v/PKv2o/4JbftmT/E/wCH1v8ADnx/rtteyWs3l2d3LN/x9fuv9VX89c0PjH4D/EG8g1Wxll+y3nl2cP8Az1ir7A/ZL/ab1zwTFH4j8K6r5Uel3kUtnaf9Na0/hF4ml7Wift5eeG9J+DPxf/tW+8y20PWfNkmm/wCWUV1/yyi/9G11kM8HWynjl8qbzJpq8z/Z1+M3g79t74GW+h308ceuRWcUl7FL5vmxS1H8Mbzxj4Jv7j4ZeKrG58ywm8uzu5vK/exV3YaqfOVKZ6RNNBDdST/8s5arzf8APfNaENn51r5E9V5v3/7jNel7U5SvxDNR58Hm+f8A8s6kms/JqvB3rUCT/Uy+eP8AV1w/7SMPm/BvWP8Arta/+jYq7z/0bXB/tITD/hTesf8Abr/6NirSj/HM6lM+X/J8mXz69r+LXxG8X+CPhr4M0z4c+IrjTdEm0aIRTad/y2uv+Wn/ALTrxiaaf955EHmSf9Mq9c0H9pDwdpvgTT/BGq/CuK+0vS/9T/aH+t/8hS/9Mq9apscNI4f/AIX98Yvsvn/8J/qXmSw/9+v3tc3LNPd39xqs/wC8kuppZLyWab97LLXrZ/aP+Flpdfbp/gjovl/6vzoZrr/47XlHiTUoNY1641yCxltre6vJbmGL/llF+9ow25J9mfv/AN5RDN5MX/PWio5pq8k9ALzyJrryD/3+qn/Zs8PMH+sommn83z6khvJ6DQsQ3l95sef+WVWPOh83z4P+WtU/3/8Ar8fu6sQzwf8AbSgA8k+bJ5A8uOrH/HnYef8A8tKj+2f6uiaXzov3H/LKswK/2yf7VHAR+8lrh/2hPi1ofwZ8ESeMb4yxSf8ALGu41Kb7HL9t8iL868H+MGveAPipFcWGrar5ul6NDL53/XWvMxtX2RrhqV6x5Hr/AMSINS8Of8Jx4q1z7TcX8MtzZw+d/wAspa+a/wC2NK8VazJq19PJ9jl82P8Ae/8ATL97Rr83k3+seHLG+lit5Zv3Pm/8srWvM/jl42sfBPhfyNKvo/3Vn/octfOOp7Vn1FOl+5PO/j98VZ9SupNK0r93b/bPLh8r/lrLXrH7B/7K8Gm+X4/8VaV9p1S6m8yb9z5nlV5n+yj8Db74/fEGP4jeKrGX+y4rP9zD5P7r7V5sX/22v0o8H+GvDmg6NHn/AI+JYf3PnfvfK/79V04fc4qpYs4fJit/sMFt5fk/8sYa0PDej2OsazHBqs/lR+d/rppv9VVOzmnvJZJ/3v7qjxho8+veF7jQ4J/3l/D5cM3nf8ta6TkW5qfFr9qLwP4b8Lf2H4OvormS1/10sM3+qr4P/ab/AGor6bxlHf6HpVzq+sXX+pimm/1sVcXpuvfE3wr/AGx8OdVg/wBI/dR+bL/y1r6E/Z7/AGS/7H8OSeMfFXm3uqazD++hm/5dYv8AMVB30jl/2cPj94V+Klh5EHl2WoRfu5tP87/lr/y1r9AP2Ff2tP7Ytrf4PeP5/M/fSxWd3NN/yy8qvzr+P37KOq6Pr0fxG+FcH2LULWbzJoov+WsUVdJ+z38VND+Idp/bmua5JpuoRTS+TFF/rYv3VY+yDEUz7w/bT/ZA+yRSfFv4ZWP/AC28zU7SGH/ll/z1r5bg+w3nmX3/AC7y/wCpl/55V9Ufsc/tjHWIY/hl8U76K5s/J+zWc0v7vza0P2rf2IYbwSfEb4S2PlfZYZZZtPh/5axVJw+1PkOys4LOXP8A0x/13/PWq82mwWcX27yPL82rBh1WHWfPEH7v/Vzf9MpasXemwXn7/PmyRUHVSOf1Kz/tjSpLC+g8y38ny/33/oqvJ7z9hXwr4w17+1fFXiTyrOWbzJtPihr2zR9Sn1Lm+g/dxfvPK/560Wem/wBpanJ9u/deb+8h/fUGftCv4P8Ahv4H+GOj2/hXwPY/9M5rv/n6irU02znm/wCPHzIpIv8AXTf6urH7/wCy+fOP3drXQfCvQYPGGs2899PJ9ji8ryfJ/wCutaBUqHefAH4D2XjbxHJrmuX3+hxQ/ubT/nrX0Z/ZsEMUkFjB+8im/wBbDD5X7qsPwfpsGj2vkQWMUVx5P/Pauk/tOCbzPPn8uSLyv+2tBmZ82gQQ/voJ5YpKuQ3nk2v/ADy4/wBdUc15537iiz6x+R/rKAND9xqUUc/+q/6a1chh8n/Xz+VJWfDN5N1/pw/eRVYOpQTf6/8A1lL2oBNqV9o8X2eCeq95DPey/bvPli/5Z+bVPWNens5ZL6CCPy687h+PHhzWLryINUj/ANd5U3/TKtTQ8f0342eK/BP7UGufB3xwZZbO6/5A8037r/nlXuHgn4nT+G9Yj/5aRxf8fkXnf8esX/PKvnP/AIKHTwQxeG/2jPAF99pvNB1Ly7yGb/nl5UtHgn4keHNe0uz1X+3JPL1mb7RNF/y183/nlWNU09kemftafs36HrGiyfH74Sz+Xp91/wAfmkww/wCti/1VeJ+CfjBY+CfC1npM9x5sfneXZxQzeV5X/TKvpD4b/E6Cz1S40PXP3un6pZ+XND/yyrxv9pb9kufRrWTxj8JNKkvrO6m8ya0/1vlVQHqngP42WN5/p099Lcxxf8ta9w8B/EIWcsd9pU0stn/y2ir8y/hj8Qp7z7PZQa5JYyed5f8AZ/k/62vcPhv+054q8H3XkeI4I4tL87y/tcP72WtAqUj7313TPA/xe0C40Lxvodtc6ff/ALuGG7h6xV8ifGv/AII8/Czxhf3F98OvGMWm3EU3mzWn2P8A+216ZpvxCnmsLfVfDmq/aY7qHzIfN/5ZVy/xC8K6H8crD/QfiNe6Brlh/qfKm/dS/wDkKj2iMzwPxJ/wTZ/ah+G/7/wN4qttX0+X/njDLH/5CrL0HxT8d/2fNQjg8Y+DtXsvKmi/exTS/uv+msVdR4k+JH7aX7N+vfYfEfirVr3Q/wDlzmm8qWL/AMhV6J8N/wBurQ/HlrHpXxb0PSdSt5ZvLvP3Mvmxf+Rax9qdB3nwI/b28N+MLCPwP4/0SW5uJf8AlrdzeZ5tekeJPgz4A+JGlx+KvhzPF/02tIf+WteJ+Nv2Ufg78YIo/iB+z14jjttUsP8Al0ryvw38bPip+zH4ok0Px/byabHa3n76Xyf3VSc9jvPGH7N+h+NrrUNK8OWMWiaxF+8s7SWH/Wy15f537Qv7KOqSa54jsbm+0uWb/j7tLyWKvpi8+JHgD42WkfjjSdV8zVP+XPyf+etRxeNtD+wSeFfH+h217H/y2tJv9VQaUjH8H+PPhJ+0t4Djg+w21teXUP8AxOJfJi82vm/9qj9ifxV8PZY/i38K/NudPsP3s1paQ+VXpnxa/ZF8R6DLcfE39mzxVJYyXX+kzaTaUfs3/tpa5r2s/wDCufjxpUdjqn/T3/y9Rf8APX/0bQaHB/A39oqfUra38/xHLHJaw/6ZFN/yyr0jTbyx+JFhcWNjfRW2oXUPm/vpvN+1RV5/+0h8E/B3g/4l/wDC1PAHmyaXqn7zUoYf/aVU9S+Fc958Jf8AhZvw51y5/tCwhluYf+msXlf6qszQ3Jte8VfA3xH5GuaVLFHLN++ll/1UsX/PKvRPEln5ujWeuaHqst7pd/8A88f+WXm/8svK/wCmVY/w9h0r9qL4S6f4Vn1yO51iKGWO8/661xfw98YeI/2Lfi//AMIP8YtKlufBd1+7+13cP7qKX/tl/wBtaDnq0j3T9mP4g+I/AfjKPw5Bqssuj383l/ZLub/yLXqnjf4M6T8R7qTxV4Bv/wCzfEEX+pu7SH/W14X8fvhLrmj+CNP+JvwP1z+27O1m+0wxf8sq6T9m/wDaWsfHujfbvPk03XIofL/s6KH/AJa/89aunUOX2R7J8B/jvrkPiO4+Ffxbg+za5a/u7OWWb/j6r0DXvP8AAnmatBB5tn/zy/55V4H8TtSsfiRo1vP4j8u28SaX/wAgfULT/lrL/wBNf/IVeqfs9/FSfx54ck0PxVPF/aFh/roq7adU56lIj+NnwN8D/tLeA/sN9Yx3Mfk/aYYpYf8AlrX5x+Nvgn4x8E+KLjw58Rp/LjivPL+1/wCqr9LPseq/D3xJcTz/AL3QNZm8y8m/59Za579pv9nXwt8d/C0k+i6XFLqn+ss5vOrKpsGGq+yPzo1jwr4Uh8OSQWOuSS28sPl+dLDXJ6noP2O1t4L7/V/8sfKrqPFWm6t4D8RyeFvEcEltJFN5c1pLDWXNZnzZM/vJP+XPzawPW9p7U5vzrH95/wASqX91/qZZf3lEOpTzWsdv9nl/0r/ljDDWheakdB0uSxn/AOWv/LWsvTfGuuaD5kFjBFL5v7vzf+eVAHh/7Wn7Lv8AwmGlyX/hyxittU/e+T+5r43+A/xJ1X4V/EG48K+Mf+Qf9s+zQ/8AXX/PlV+oGg6lY6ldSG//ANNt/wDVwzS/u/Klr4D/AOCh37OuueA/GV54j0Oxki0+WaKSHyf+frzf9b/6KrfDfvTpp/vUfbH/AAT8/bA1X4V/Euzgg1W5+zy/u5rT+0vLil/e1+vHjWbQ/Hngiz+KnhUxyRxQ/aftdpD+9lr+Y/8AZM+Nk82sSeANcn/0yKH9zN/y1/6a1+0n/BJj9saA6Xp/wW1zVY5LOWaKPTZpf+Wsv+fKrX+FWObE4Y+vPh748sfGGjf25BPF/wBNovO83yq6Czhgmi8+vF/iFo+lfAH4+2+q6VBJF4b16GL7Z/0yuv8APlV7RDeedF9u8+KWT/lt5VelSqHg1SO8s555fI/55VTvIf8ApvVzUpoJpftHn1Tm8/zfIggrtp7GJX8qfzf9d+8rh/2iof8Aizesf63/AJdf/RsVd5qUP7r7DB/rK8//AGhJfO+DesQef5f/AB6/+jYq1o/xjM+Z4YZ72X7P9n8zzf8AljUnnf6BZ31jB5cfk+Z5s0PlebFVMw+d+4g8rzP+e0teyab8H/gt4J8JW/ir40+MdSsbzXrPzNHtNJh/1Vr/AN+pf+ete3UqfuTzzk/gp4q8AeFdUkvviP4ci1uzl/1MVc34wvNK1Lxbql9pXhyWxs/7SuvscP2Py/Ki83/VV6pLoP7D4l8i++I3i37PLNFJ500P/LX/AMBa8r8SQaH/AG/eDw5P5mlxalLHpt3LD+9li82ilUA+yP3VRzZ/18/+rqvDN5MvkT0fva8Q9AkMPknz/wDW/wDPGq8wg+3xj7R/2xqSH9zL/wA9ajghgmtpIP8AptWZoXIf30P7/wDd1X84Qy/8fFaE0P8Aokf7+q8MPlf6+fzaAJPO861/fweV/wBNajs5oJr/AMgT+VHdTRfvqj87zopPP/7Yw1z+vXn9m2ElxfX0djHdf6mWX/ll5VZVKvsQpU/a1jzf9sb48T/Cvwbp9jpXm/2hr3+hab5P/PL/ADLXyH8TvHeq+G/hfHoUF9JFcWs0sl5L/wA//my//bf/ACFXpnx++OWlfGzx5Z+I7Gx/4k/hz93DN53+tl/z5VfM/jvxhP4w1W4uP3ttbxeb5Pnf9da+bxNX2tY+gw1L2Rw+veJP7Mv/ACL6e5+0SzeX5s1eP6npviP42fG7S/A+hz+bZxTeVeed/qvKrc/aK+KljZyW+lQT+bcfvbb/AK6y19If8E/f2XZ/B3hePxx44sfL1C6825mtJYf9VXNTpnTUqfuT2D4J/A3Svhv4NjsZ4I4o/wDVf6JXoGnQ3x0eTSreCL7P/wA9v+WtSaPZ+cZPsMEsUcv7uuw8H6DY+bHfX8EsVna/8fl3XbT2POqfvQ+Ffwf8R+Kpf7K8OaVLLJLD9pmmmrvJv2RfipeRR+I9K/s2Lyv3sNpN/wDuq3NS/a08A/AHwTHodxDJLql1+8hlh/5axVH8Pf8AgoFY+ML/AM+x+zX3m/8AMPhvP3tMy/fHzn8SP2e/hx4P+KsfiP4qfDmS21CX95Z+bD/y1/65f6qty8+w6lp8d9YwfZv+WUNfVnxsHgf41/C+88ieL7Raw+ZN53/LL/plXzPZ+G57OL7DPB9pji/1Pk0HRSqnJ6lZwQy/8TXQ7GSOX93+9/5ay18t/tFfAHxV8JfFEnxp+EmlSy6fF/yHtOtIf3UUv/bX/tlX2JqU0HnSH7RLJcf8+n/PKuP1Ky+2aDcaVfQS+XL5sc0X/P1Qa+1Pn/4V/Frwr4wijvYJ7n7RLNF53k/8srryq+0P2Xv+Ch1j4bij+HPxpnvv9TFH/a00MXlV8B+PPAWu/s0/FD/hP9DsZbnw3f8A+uhhh8qK1l/6a1z+pfEKf45a9J4c8HaH9u8393N5U3meVXOCp0ap9qftUfE74LeKvHlnqvwPuLGWTVP3d5p8P/LL/pr5X+qrk9Ys55rX+xIDcxSRQ+ZNNDDFXP8Awr+Bvhz4P+DPI1yfzNcuv3k1ak1nPeaX5Fj/AMfH/LagKmhj6DeWN5+4ggl/e/6nzq3LPTp7OXz/AN1LJ/02os9N0qGWT7DWx9j8mL/UeZ5tBmY95DBN5nneb+9/55V6x8H/AArY6PYWcEH/AC1/eXkP/PKuL/s2CGwjvoP9X/y2/wCmVdp8PdSvvKkg/wBbJLN++lhoA9g+2eRFH9h/1f8Aq/NrUhvIJrqTQ4YPMj8n/W1xem6lPNL5FjP/ANsq7CHWINStY4DBFHcRf67yqALnMN1HP/zyqSG9nmi8+f8Adx/89az5tS/0Xz/9ZHVizvJ/svkf8s5aANiG8ghlj8jy5PN/5ay1HqX+tk/9pVy82vWM0v7+fy44qsTeO7Gz8z9/HJQBX1i8n+yyHyP9V/y1rxP4tfDfwr4J1638Y+D7+WWO68rzrSH/AJ6+bXceKviRYzS2+lX3+jRy3kv73zq+a/id8SPGN54o1Dwd4cn8q4/5Y/8ATWszQ9g1/wCBuq+JIbjwrP5WpaXr2jyyQzTf8usvmxV8n+D9B+Knwl+2eDtV8uK40bUvL/0v/lrFX1J+yX+0Vqt54I/4QfxjY/YtQ0HzfO83/lr+9rvPjx8K/Cnxs8L2/j/w5Yxy6xa/6TeQy/vfNrQ0p7njf7Ovjay8eWt5/bl95kkX/HnD/wBNa9s+Evxt/wCEDuv+EO8f+VLHL/y2mr47+JGj33wTv7f4m/Dqf/iXxTf8TjT7u88r7L/yyr2Cz8YeHPjB8OZJ4J/+JhLZxXMN35P7rypYqAOs/au/4J+6V42lk+NP7Mt9bRSRQ+ZDaRTS/wCtr5zm8bQeD4pNK+JvhW9ttYi/d/ZP+WUv/TWvePhx8TvjT8H9Bs/GOh6Vc6lZyzf8g+0hl/dVY8eftRfAj42RyaX4x8K2Nj4g/wCWM0s0UUtaAc/8GfjxY2el28H26KW3i/5bSw16ZoOvfDL4qazqHhz4V3Fz/wAJB5PmWc03+q82vE9S+GMF5F/bnhXSrb7Pa/67/nlXcWepWPhbQdL8Y+ALHyriKb/TPskPmS+bQZkc37V3ir4V6pcfBz9prwBHqVvLN5dn9rhi83/tlXN/Ej4M/Bb42aXceOP2c9cl0DWLCaW5vNJu/wB15vlfvf8AprFXuHxs8FeHP20vgZcaVrkEek+KIrOK503UP+msX7qvjP4b6xfWd/caHqt99h1TRrzy5v8All5vlVmFI6zwf8cvib+zfr1nq089zJ5v7yaGGvqD4Y/FT4Lf8FAvBGoaV4x8K22m6x/q/wDS4f8AlrXz/wCJLPw58TvCVx9u82KSX/U+V/ra8P0fxJ44/Zv+Ivnzzyyafdf8xH/V/uv/AI7WZ0HuHiTwr8cP2LfFH/COeKr62udDlvIo4bu0/wD3VeqaD480P4kaD/av+qvPO/fS/wDPWKsvwf8AtIeAP2kPhfH4O8ZWP+mXVn5tn537yWvE9Y1K++Evi2Sxvp5Ps91N+5tIZv8AVRf9NaDnPqDwr8Qr7w3L9u0q+ll/5ZzQy/6qsf4/fAHQ/jl4bk8ceDtKi0jxRpc0UkN3D+682Lzf9V/6NrzfTfi1YwxR+Rcf8sf9VXUeCf2hNc837DPB/o8UP76GKbyqAOL0HxtY6zN/wg/xNvrm2vIvNjhtIv8AllVj4G/FTXNB8ZXHwr8YwW0Wn3832LTYoYf9V5v7quk+M3gnwP4w0uTxxY/utQ/1k0sX/LL/AK615ve6PcQ+KI/FX7u5uP3XkzQw/wCt/wCuX/TWga3K+g6xe/s0/tD6xocE9zHHLN5ln9k/1VfVniSH4c/tXfC//hFfipYxeZLZ/wCh3cX/ACylr5b/AGirPXLy/wBD8Yz2FzF9lhijvJvsf7qL97/y1l/7a11nwB+M2leA/iNZ6HrmqxSafqn+jw3fnfupZaC5kn7Lv7RXir9m/wCJeqfs8/FS4/tfT4vKj8qX/VeVL+682vSPiR8E/Dmj38f7RnwA8Vf6HdTf6rTppf3v/LKWL97Xn/7SHg//AIQP402/iPVdKjluLr93eeb/AMtak8SfELxH8Jfsd9odjL/wievfu/Ji/wBVay/5irQ5z2TR/G1j4k0az8RzwSf6V/x+WksMX+i1J4V8bX3g/wAW298J/KvIpvMmm/5+oq8r0HxJYxRSWGlf6u6m/wCPuL/Veb/y1rU0fXrHxVo326xvfM8r/wAhUAfcFn4k0Px54Xt9Vn/eR3UP760/55Vh/DcT+Fde/sO+1WS9t7r/AJBss3/LKvG/2e/idPpsOoeB9c837RLD5tnd16Z/aU/2X7dYzx+XVe1OH2Z5P/wUT/Z60Pxr4Xt/iLomlx2+qWv7ubyv+Wv/AE1r4r0GafMeh33lfaIv9d5tfp5rF7pXiTw59n1z91H9j+zedX53/tC/D2f4e/EbUJ4Lf7THLeSy1R00jyfxhNPqV/8Abp/3dnL/AKmGs+aaf7LHYwQeVJF+782ug1j99a/v4Kw/sY839/N/razO6nuFnN5EUkEH/LKGqfxg+G9j8VPh9qHg7XLeO98395DqH/PKtDyZ7OL/AFHm29WLO8vrO1kng/5azf6qhaFn5X/EL4e+KvgB8S5Nd0qDypLW8lj/AO2VfWH7Jf7RVj/amj+MfDmq3NjJFeRSaPDF/wAspf8APlV2H7eHwBsfiH4S/wCEx0OCWS8tf+PyGH/W/wCqr4X/AGb/ABVfeCfGV54O1XVfs0n2z/iT+b/yyl/5ZVv/ABTvp/vaJ/TR8H/iRof7YH7Pv9qCCOTXLCHy5vO/5ZS/89ap/s7fGD+0vFOqfAjx/feVrmjf8vf/AD9RebXxH/wSe/aJv/Des3EF9P8A6P53l6lDLNX05+1F4Jn+Evxz8J/tNaHP/wASu6vP9M/9G1rSqeyPIxOGVI+pJrP7HF5H7rzM+Z501R5g8rz/AN55n/TGpJtSsdS/4msE8Vzb+TLcwyw1Xhhn/ef622/c+ZNXrYaqeJUp+yK95Xn/AO0VD53wg1jyP9Z+6/8ARsVd5Mbj93cXB/d1w/7SE32P4QaoIP8AlrNa/wDo2Ku2l/GOaqfLcMP+r/5Z+V/rq+hPFfwN8cfGz4S+D/GPhy3spdQ/sGK3mtLu8lj/AOWUXlf+1a8n8E/D3/hNrDULj+3La2/suz83ypf+Wtdx4b+Bt9rHhLT/ABHY/HfSbH7fZ2v2PT7vUoopYv8Anr/y1r3Kn8I4yvD+xn8Yv+PeCDTf9T/y2vPMi/1teb69ps+m6peaHqotorywvJbaaK0ml/1sUvlS165D+zrqsv8AyCvjv4fiklh/1MOsRSf+1a8j177dpuvXljPqstz9lvJY5pv+WUv73/W1nh9wPriGHzpfPqwZp/N8if8A1dSTQwQ/8fH+sqPyZ5uleQdgeT50v+g/u6IYZ4YpPPNXPJ8m1qPP2z/QazAP3Hl/aKz7zyP+WH/bGpLyGfzarzTfupP3H7yL/U0AV7yaeaXn93JF/roa8L/b8+J0/gn4QSWOhz+VJfzfvpf+eVewePNSsdB8Lya5ez+VHYQ/aZpv+mv/ADyr4H/aL+P198cte/sqx/dafYXktzN53/LWvIxtQ7cF/GOP8Sf8U34St/Cv27yvNh+03kteT+KvEn2PS/t0/lyxxQyx/wDXX97Vzx7420rUr/8AsO+vpfL/ANZNLXm/xU8YT/u/Dn9k/adQl/d2cNeMtT3yT9nv4V33xy/aR0ue+sfM0fRv3nk/9NfN/wBbX6MeG4bHw3pdv4Vgg8qTzv313/rfNlrxP9j/AOA//Ck/hfZ319/o2oapZxXN5+5/1X7r/Vf+Ra9g/tOebWZNVg0ryo/+W01dapo86pUOs0G0/wBKuJ5zLL/1yrQ8YfFXVYbX7DodjHbWcsP+mWlY+pXmleD/AIcx+I7jVZfs9/N5cMs3+tirg5rPXdY8OXkGhzx3t5L/AKn/AEyXzaZnSPE/2g/2kPHGm+I7j+ytDjvdY87y4f8Apl/2yqv8APjx4j8VeI/+EO8Y6Fc6RrEX/HnLF/z1/wCetdR8N/gb4q8N/FCT4m/FTSpZbjyfK020l/exVuePPhuIPiNofj/w5YxRSWE3+meVD/raXtEdq9ie+fD34qeI9N0b9/cfaY/+W2nw/wCtupa9Ih+FfjjxtYR65ofge9tvN/6bRRV4f8Jfid4V8H3/APbmqweZHYTRXsMUv/LX/pl/5Cr2S8/4KxeHMf2VY/DmWPyv+eV5TOapTq3/AHZ0Fn+yv8TdSl/cWMUcn/Tbyqp6l+w34xs9LuNc1YyXNx/yxhhmrk9e/wCCt09na/uPCvlyf8sf31eT/E3/AIK9fGnUrr/im/K039z/AKmGgz9lWMPxv8Jb7+1NY+FfjjSvsMcs3mf67/Wy1X+Hvwx+GXwf0aSx8K+HJf7Quv8AXXc3/LKtjR/GHj/4taDJ8W/iNY/adY1n93D/ANMov+ev/kKi88i8upPI/wCe376szo9p7JGfNNqupyyfbv8AWf8APWq/+p/fwVsTQ2F5D5FRzWc8NrH5H+rrKqZ0iOzhg+zeR+7rUms4IYv3Hm/aPJ/c0abZweVJ+4/dy1Hr2pT6DF+4n/1UP/f2oNTP17XoIYrfw5BcfvJf+PyGE/62vQPCs32O1t76xuPK+1f8sq+d9B8Vf2l8ULyxsf8ARre1/eQ3f/PWWvcPDevWM2l3EE8Ev2yL/wBFVoaHonhvUv3sn2H/AL/V0Gm+KrED/Xx153pviqDR5Y9V8iSS3l/1NpD/AM8v+WtXLzUvDl5rMmq6Hod7Y6fL/wAsfO/5a0AegQ6lBZ/uIJ/M82q+peMLf7L5H27ypIq871PUtV0228+C/wDKrm/GHiqD+xo4INVlljl/11Y+0A7TU/iRY3l3/oOqxeZF/rq4/wAYfELXJ/3+lTxXPm/6nypq8/mvIJopIIIJI4/9XNNXB+I/FWueG4vP0OCS2uLqby/N87/VRVsBoeNvHnjiHVI54J5Lb+1Jvs373955VemaloPg7/hYPhPVfEl9/rf9Gml8n/W/8ta4fxhZ32vfBa4+KkH+ssP3d5L/AM/UUv8A+6ruP2ovB/8AbH7IPh/4qeB9VkluNGhik+1w/wCtuv3tZgU/jD4bn+D/AMVY/id4c/d6fqn+jTed+983/PlV6B4P+P0HgOX7R/rfN/0n/U/6qKuT+G/xI8OftCfBbQ9D+IFjFFqEX/Hnd1l+JPBw0Gw/sOe+/wBH/wCPmzm/9pVoa+zZ6po2v/s2ftsWGqaT4Vvv+Ef1yWH/AEyL/Vfaov8AtrXhfiT9l34m/AHWrzQ7Gx+26XL5UlnqNpN5nlWv/PKuH+Hvn+JPiXear8K55bHXLWbzJv33lRS/uvK8qvVNS/aW+NHwrijg+I2hyy/b5v8ArrFQWR/DH9oT4qeD9Zt7+fw5L9nupvs00Mtn/qq7DXrz4A/Gf7RY6rPc6Jqn/LGWGHyvKl/79V0HhX45WPxCl+3WPgfTbnVLqb99aeTF+6qOf4zfs5w6p5Hxi+B9zptxFeeX9rtIYv8AW0vanOeP6P8As6/FvTbrUNc8AeMtSjs9L/eTeb5Uv2qq+m+MNVm+0aHqsEvmf8tvOh8vyq+sNf8AFXg688G6X/wpbxHbRxyzf6ZDN/zyryPxVD4O8Ya9caH5Ft/bH2z/AI+4Yf3UsXlVqaf8uTD+FfxOvvDd/wCRDqv7uWHy4fN/5ZV53+0h4Jg0zx5J44t7KXy7+b/j7irpPHnwT8Rw6NJfeDr6XzNL/eQ/ufK82ubm1ix8SWseleIvGMkl55P760mm83ypaDOkV/DfjvXPDes2+q2M9tLb2sP+plrvNYm+EvxU0vz/ABxYxSxy/wCuih/d+V/01rxvxJpt94b1S30PXLHyo5f+W0NH9p6VpsVx9uvpYvKhi/1NZmvtGV9Shn+DP9l6JPffbrO1mi8m7rvPG3irQ/iRa6fP/qpIv3k0s1c3eQ6VrFrcT6rP9pt/J/c1zej3c+jyyfv/AC7egR1k179jMdx9hl/dQ+Z51dBoOsaVrH7+C/jk8qHzP3U3/LX/AJ5Vl+D/ABhocMX27XLH7dHFN5kMP/PWug+MP7N0/hywuPiN8Dr6W50OWz8ybT4of3vm/wCfKrMfs2aHhv4karo/9oaHqvl3Nvf/ALya0/55f9MvNrU8N/2F4w+FUmlWN95eoWupeZDNN/yyrwPR/iRfQX8eh+P/ALTpsn+q/fQ+X5Vdx4P8YeTa6h4jgn82P/Vww0B7Nlz/AIW38W/hv4t/4RXxxoem3un6zZ+X/aE0Mvm/62uks9S+BHiSWO3n8Ky2V5azfuZYfN/1v/PWpIfiR4O8YaDb6V8RtD8z7V/x53cWmxf6LLXHzfubqSe+/d2f+r8nyfL83/nlQHs2esePLzVfFXgizvp76PUrywm8v7X/AMtaNH1I3nw01DwrrlvHHH/yxtLv/nrXD6Def2ZLHPPfS2V55P8Aqv8AllVzR9Y/tLxRcaVqn+k/9PdaGXsjU+D/AMSL7QdG1Dwd4jsYvL/5c5v+uVY/wr8eT+G5bzVtV/d291+7mtPJ/wBVVjUtH8m61CCDyo7iKb9zNWH4q8izuo77z/3fk/8AbKgD3T4e/E7Sry/jgt9Vj+0eT/of/LPza9s03xtYzeHJNK8/y45f3nm18R6bNcaloNnY+fLbR+d9phmh/wBbXskPxC1W7+F9xquuQf6RFDL/AKn/AK5UGZ9Kabr3/CSeCLz7DPFJ+5/c/wDf2vlv48zQfEj9/wDYZI9QsJvLm8mu8/Zp+MFjqVrpdj58scl/DLbQxf8ATX97WHrGgz6b4o8UaXqkEccel3ktz5sX/L1Whj7U+Z7yz+1y3F/b/wCsi/10VZdnaTzX8kH7v/U/6muwm0H+wIo/Jn/dyw/uf+utcnND9iuvPn/4+PO/0yg6qdQr3ln51hH+4/1U1Rw/8S7r/wAta0LzyIbqOc/8e9U5rQ+VJBP/AKyX/U1maElnDpWpWFx5/wD17fvv+Wvm1+Z/7bH7Ot/8B/i1eWNjBL5fneZZ6h/01r9NNNhg02P7dfWP+j2v7uaH/nrXk/7aXwf0P42fCW8n8j/iYaNZyyab+5/eyy+V/wDaqulUOnDVT53/AGM/2hL77Lbz/wBrSfaLWbyrzyv+Wtft5+zr4w8D/tdfsv2/hTVZ4rm8is4o4bT/AJaxeV+6r+bP4M+KtV+GPxGt7H97Hced5WpQ1+uH/BLv9oqfQfiDcf2VfSx2ctnF+586tKlM1xtOlVPrD/gnv8WvGNn481j4A/E2+8y4tZv9D86vqyaa4+33E99/zx8vyq+W/jB4b0P9nv8Aab0/47T/ALvR9Zmi/tLyv+essv7qvqjTptK1jRv+EjguIv8AUxSedF/y1ilruwR4mJpEcPkTeZP/AOQq87/aWs4IfhBrE8H+s/0X/wBKoq9E/wCPSvP/ANpzyJvg3qE+P+W1r/6Nir26P8c8SqfLf+pljg/e/wDTb/prXsHw9+BvgjQfBtn8Rvjh4xk0S3urP/iW6fDN5v8A8drycw+dqklwJ447fyf9dNXtnj34ceKfjv8ADPwf4y8H6XJcW39jxWWpafaxeZLFL+6r2qmxxkf/AAo39nv4keXY/Bz4qX39ufvZIbTUPN8qX/yFXhesaPfeG9ZvPDmuWMUV5YXktteTReb+9lil/e17h8Df2cPi3pviiPxH4w0uTRNL0ub7TeXd3Z+XLL5VeX/GbXtK8VfEvXPFWlWMctvdaxL9ju/tn/LLzf8AnlWdID64s5oPKoh6fuP9ZVOGbyqPOnhi/cCvJOwkmmnml+z/APLP/ltRN/oflz1T+2Tn/wBrVJDN53+vrMCSb/nvmo7ybyZY54P9Z53mQ/8AXWjWJp4Yv+mdYd5e33lST2M/meVD5lAHj/7e3jCx0H9mnXLH7f5VxdeVJ++/56/aoq+F9Bggh8Gxz67/AKN9qh/ffa69E/4KKfHKD4qfF/S/gfoeqy/2XFDFJNDD/rZbqL97/wC0q8v17x5N/Zceif2H9tjlh+zf9cq+fxtQ9vA0zqPG3wf/AGXvhL8NNY8cf8J/baveeT/odp50X+tr57/ZX+G//C7P2gpPFXkSRafo37yaab/VS/8ATL/yLUfxy1ix0HS5ND8Of6TeXU3lwwzTV9Qfsf8Awag+GPwl0u+ngj+0S/6TD53/AC1llrzaVPU7alQ9wu/s9nF/Ydx+983/AF0VSabZQDVPPgnj/wCm1Y/nT3l/cX0/+srQ0e7/ALMl+3QT/vJYf337mvSOM8n/AGiv2hINY+NOn/CvSr7zI9G/02aX/nr+6/8AttXNH+J198N/iDp/xG0OCK9vLCaKT7JN/wAtYq4v9oT9kXxV488byfFT4ZeKvKvJf+WM1eXw+Nvip8N7X7D8VNDk+x2s3l2eoWkP73/trWZpSpH66fCv9q79nr9pDwPnXL6yspIofs15/aE3+qlr5T/a61LQ/BXxQj0P4c31tc2cUPmebafvYpa+d/hv8VPA95a/YfDmqS+X/wAtrT/VSyy16Ro/9lTS289xey+X53mTTTfvKx9kHs/ZHnfxmh8f69rNv4A+HM8tzqFrD9tmhtIf3Xlf5irDh+AP7bN5bf2rbzxW3m/6nyf9b/6Nr9KPhl+wT8JNR8EW+qeAPG8ZvJf9J/tCWbzZfN/55f8AXKuT+JHwB+NPw9v5Nc8mxubf/p0p0gpYk+B/+GIf2vfEkfn+I9cjsvN/ezed/wDva9M+Ff7CvhzwHrMfjHxjrtzq955Pl+VLXtH9va5r37iC+8yS1/10Uv8Ayyo1O8nsrX9xP5X/AExrU09qV9TnsbyL7DYwRRRxQ/Zpv+msVZcMPk+ZP5FXP9H8rMH/AC1/11H7ibyx5H/Lb99WZzVTLmmg03y7jyP9bVyzs/Jm8+CCKW3qnqUM8Os58jzY/wDljVzTbOeH9x59ZhSLkM0Atf3H+rrl/idrEGm+FpNVg/1kX+prrNYhhhsPIgg/eSzf6mvC/wBpDU/+Ek/sfwfpV9LbSS6lF50UP+tli8qszUp/BPwf5UXn+f8A628+2zTS/wDLKveLOaw02w8iefy5LX/U/wDTWsvwr8PdKEun6HYwReXa2cX73/nrXeQ+D9Ks7ryNV0qS58qg0OXm8VeHLy1t/t2q21t9q/5Zf9Na2LLV4If3/wC78yL93D/zyrQ17wf+z1qUvka5P9ik8nzP+Wv+trk9e0zStHv/ANx4ji8v/ltaTTf8sq0Aj1LxVpUN/JPcQSyXH/TH/VVjw2WlaxLcX19fRW0n/PH/AJ61T1iz1W8iknsR5UcX/LGuXm/fS/bvPl/0X/Uw1mBc8Sw/Y5Y/sJ/7Y1y880891efaP+WsPl1uTefefv76f95LXN+JJp9Bikv/APWeV/yxioA9A/Zp17w5488GeIP2a9VnltpLqGX+x/K/5ZS1sfsT/E6x8N2vij9kP4tz21tH50scMV3+6l8ryoq8H1mbxV8MfGWj/GnwPP8A6ZL/AMuldh8frPw542+I2n/Fvwd5kdxfwxSalNFN+9iuv8+VQaHL/GD4e+Mf2Rfi/JY+Dr6T7Hql55mg/a/9VL/y1r3z4S/Ejw58bLW38HeMfLsdU1T93DLXlfxI8bar4w8G2/hz4gfZr64i/wBTN/y1tYq5/wAN2c+mxRixvvLuP+fv/nlV+09kB0Hxa+EvxG/ZX8eXGuT2Ml7p91N+51Hyf3UVe4fAH9sDw3428G2/w5+LelWOpafLZ+X9r/1tanwB+J3hX4zaX/wp34xeVfW8sMsdndzQ/wDLWvmP9uT9j/4t/sZ+Lv8AhP8AwP5svheXzZPKhm8zyv8Alr+9pez9sP2jPYPiR8NrH9mP4q2/xi+Dt9c6l4X1SbzJru0s/Ni83/tlX0Z8N/jx8F/jx4Xj8AfFuexube6/5bf8tYpa+B/2b/2tNV1iwuPA/wDx+6XFD5lnaaj/AKqu80ezghv5P7K/0GS6h+0+VFN/qqfs/ZCqH0B8cv8AgnlP4Dlk8RfCS/vb3w/fQyyTWkP7zzf+mVeP/wBvfCv4M+I9L0rSvEf2mT/WXlp53/HrL/0yr3D9jP8Abk1XQZZPhz8XNVlubeL93ps00P8Ayyrp/wBsT/gm18Ov2i9AuPH/AMEby2sdV8n7TDNDNL/pUtaU/wB6c1OpraoYHwr8SfBzx5a2+rT30Vt5V5+5i1Gaq/xs/Ys/4T3S5J/A+rf6395DND/z1/5ZS18V6ZrHxi/Zj8eXGlfGmxuba30uby4fOh83zf8Av1X2Z+yl/wAFDvhkdPjg8R33+j+TFHDDLD/qqZ01KtE+X/id4V8Y+A7qTQ/jFodzFJYfu/7Rih/1sVcXq/wy8UzWH27w54cudSs7qH7T5tp/pP7r/tlX6yeKvhj8Hv2ivBH23Q7Gy1KO6/eTeb/ra+d/+GY/EfwT128/sOeLUtLlm8yHTvJ/1X/TL/rlWZz+0R8F6D8R/Oij+3aHc20kv/Hn51nLHWxqWpfbLryJ/wB35X7z7X/7Sr7o+JH7Afwy/aW0WTxH4c0r/hG9cih8yG086XyvNr5H+M3/AAT3/a9+Buqf8SrQ7bW9Ll/5bRTf6qg6fa0jj9H1iDTbqOeC3jlktf3kM0X/ACyrY8B/HjXPgz4jt/Efg6eWXzZv+PSuH17wr4/8NyyX2ueDtXtv+mPk/wCtrn7zWILOWSxvoLmOOX95DN5P72gXtGfYHir4hfsTftdWsc/jiD+yPEl1D9m1K7i/56/9+q8P1/8AZ1+Jvwxv/wC1fA+uW2t6f5MscMPneZLFFXl+j+JNE/4/rG+8r/lnNNXqngLx5faba2c9x4j/AHl1/o00Ms3+tioNDl/DfjzXdNiuJ54PKjlm8ubT5q7Tw34kgvIv7Dv5/wB5F+8qP4nfCux17VI/Eehz/Zo/J82aH/nrXF2l4NH8UW9jP5vmS/8ALH/plWYHqGj6zBeeZ+4/eS/vKsQ69bw6pHP/AKryv9dNNWHZzf6N59j+683/AFM3/TKo4LO+m8OXGqz+bL5U376tDOpudp+0JZ33g+/0PxjPfSSaX4j8r/S4v9VF/nza0Ne02fxt8DLzVdKgijksJvM+yf8ALX915UtF5Bb/ABU/Zf1CCefzLjQf9Js7T/tlLVj9nXxJ/bGg3GlarB5cl1Zy/uf+2VBmcP8ACTxVBr/he31Wefzbi6vJY7z/AKdfK82vYNHvJ9S+HOqeffeV5umy/Y5of9b5vlf6qvnf4e/8Ur4o8QeD5x5ckuvS+dL/AMsv+WtfRnwr+ww69Z+fBH9n/wCWMM3/ACy/6a1oZ1Njz/8AZ78VX39s3FhPPcxXFreeX/1yr3y8vLiz+KGl+I76CK2jurPy4f8Arr+6/e1856PpsHw9/a58QeDrieWK31nyr2zh/wCmv+Yq+gPi1oOq6b8PtP8AGFjYy3Nxa6l5dn/0y/660HOeN+NtHnh1S4/tWD/SLX/XRf8APWuL1iGfpOa9w+PGj2E3iP8Atywt/wDWw+ZN/wBNa8z17TYPssn26ClVOg4+GHzv+JVP/wDvaJvt15dR/wCqjuIv9TaVcm0fzoo5/tHlf9casQ/vtej8iCPzIof9bUAY95DPDdRzmDy5KuaDDBqWqfYb2D93dTeXNN/zyiqPUrP/AEvME4l/67VHo4n+1SfuP+u1KkHtEfm3+358H/8AhT/7Rl5PYwSxRy/6TZxf8spa9A/Yh+OU8MUd9feVbapLN9mm87/llFF/y1r3D/go18HoPip8G4/iNBBH/bGjeVHDL/0y83/7bXwf8E/GE/wx+IPn337zzf3X73/llFXbTO2lU9qf0UXmpQftUfsjXkGleVJqEUMscPk/8tf3X72Wrn/BLX4hX03hLXPg7qs0UX/CLzS/Y5pf9b/rf/tteF/8E2fj9pWpS2fhzz/s2l3XlR12Gj+MLH9j/wDbS1jStc/daX4t8r7Z5P8Ayy82KLyv/RVa4b90ziqbH2xqUPnfv/8AlnXnf7SE0/8AwqDVPIgl8uKa1/7a/vYq9Ahu4Ly1/wCetvL/AMef/TWL/nrXB/tLTWMPwg1T/SJfM8618n/nl/x9RV62Fqe1rHz+KPC/g18H4Pi1r2oaVquuf2bpel2f2281D/v1+6/8i1z+m+JPEfgnXZPEfgfXJLa4urz/AI+4Zv3svlV6f+zhBPr3wq8f+FbExf2hdWf7mH/lr/rYv3v/AFyrxwWU/m/uIJY7i1m/1UtfQI4z0zwJqfjH9pDxH/wrrxj8TdSkk+xy3Om/a/3kUsvlf6qvO/Emjz6PrNxpV95sklhN9mm/c/uopa7T9lfQdV174v6X/ZUH/HhNLc3k3nS/6L+6lrH+M15Y6l8VfEE9jBLFH/bF1/y2/dS/vaVID6kqOeX/AJYYo0zvUk3+qf6V4p2Ec0MH/HvUc37qpIf9VJUf/Xf/ALYUAV5v9bH59vJL5v8AyxrD17WIPDel6pfX2uRWP2WGWSHzq6C9/wBT/wCjq+J/+CnHx41zwfqlv8K9DnjivL+zl/tKb/pl/wAsv/atZVHakaU/458n6lZ/298ZNY8f2M/26P7ZL9jm/wDRv/tWrGpi+vLW41XSv3Xm/u6k8Hw2+j6D/wAI5BY+bJL/AKTNqMX/ACyrD+MHxIg8CeA5P3EfmX//AC1m/wCWX/TWvn6v72se5hv3Rw/wZ0D/AIXN+0bZwQQebp9hNF501foR/Y/2PRo9Dsf3sdrD/wASeL/P/bWvlf8A4Js/CWeHwb/wn8+lSR6hf3n7mH/nr5X+tlr64ns/J/f+f9p8r/U/9MqZlUqfvTLsrPyZbO3/AHsX/Pbzq1Psd9DdefBPFJH/AM8a6T4M/D3w54q8Waf/AMJ/ffYdLutSi+x/9NZa90179gnwP9lkn0PXIotQlh/5a/vf3taGftT5js7PF/cXEHmRR/8ATGby6z9e8K+FfFUUn/CR6H5lv/0Dpryuk1L4b+I9B+KsnwxnvZLmSKH99LDeRSf+Qqp6lNPo919h8R2Plfav3fmzVmaU6p89/Fr9g6x1K6k8cfBbXP7Ek8n99N/01ry/R/jX8Rvg/qkng744eHJfLtf9Ghu/+fr/AKa19oeT9s0uTyLiX97+7mrm/Hvw98D+MNBk8D+KtKiudP8A9X51KpsdPtDj/gb+0V8Rvhjpcc3gDxhe/wCu+0+Td3kvlV754b/4Kk+KrOwj0r4m+DotW82Hy5poYfL/AHv/ACyr899M+G/x3+A/xG1Cx8OT+bpcv7ryv9b/AKLXrn7Oug+MfiR4ok/tyCT7Ppc3mal9r/d1z0gqU6J9GaPNY3l1ceI/7Kubb7fNLczRfbPN8rzaj1KGfypJ4J4/L/6bVcm/fapJpUEEX2eL/UzVXNnB9l+3ef8A6qb/AFNamZTnh8nRvPuP3v8A1yqTyf3Vv5FWNS/0PRpPI/d+b/yyrPmm8iKP9/J/qamqZkk1nBPf+fReTeTFHcAUTYvLWPz4KrzWfnWvn31x/pH/ACxu6xAuQ2f9sTfYb/VfLj/5bTf88oqx9S+A8/iTx5b/ABGg0PypNLh/4lvnQ/62Kj+3oIf+JV9u8u8lmijmhm/55V7Bo3xO8KnQY/A+laVbSxxeV513NNQdBh+FdM0rQYvPvtDlkkz5n7n/AJ61c/4Xx8JNN1T7DrkEVtcWEP77zbOKus8H+KvCv2q4sb77NfSWs3+hxV0n9m+FdYl/4nnhWxufKoMzzuH4k/saeMLWSx8R2NjLJL+887+zYq5fx58GfgReapeeI9D1WW5j8n9zL9j/APtteweKv2af2c/iRov+neDv7NvJf+Xu0m/1VeB+Nv2V/GPwr+0eI/h/4judX0eL915U1BocnN9u026kgvr7ypP9X5P/AEyrk9YvPOuo4IIPLjim/wBbVO7+3avqkk8H+jeV+7hhm/561c+xwWcXH7uT/l8m/wCmtAGeJp7yK8H+tj8n9zNWP4wmg0HT/t19/q5YfLrYvLyCzsJPPg82P/ljLXn/AIxm+2+XDPP5tv537mGg0NzzhqWl2/hyefzI4v8AUy/9Nf8AnlXN6lZ6roMUcF9pVzbSS/vLyL/p6/z5VaFnDPpt1b308EXmf8tv+uVV9Y+LXiqz8R/2H4xvopbeWH/Q/O/5ZUGhuTfbvFXhy3M/+jXlh/yEv+uX+fKrn9B1ixmluIIZ5La4i/5YzV0EM19Z6X/bsEEt9/0EorT95+6rL8bWXg7WIrPxH4HvvKkl/wCQlaXf7qWpqGZ6J8K9Yghmjg+3RxRy/wDH5dw/8uv/ADyl/wC/vlV9l/Azx3pHxq+Gn/Cgfj7YRatdy/u7O7uh5n2q1/5ZS/vf+mXl1+dngPxJP9vuLGCfypP+WNekeG/i1rlnYf2Vqoilki/1M0Na0g9mzw/9sD9iH40/sK/Ev/inPMvfDcsP2mbUYYZYvKqv4K+P0+vaLHpP9qyxXHk/89v3vlV96eCf2zdD17Rrj4ZftX6Vba3JFD5V5q0MP7qWKvI/jl/wTH/Z6+LUv/Cxv2bPiNHbXnnf8gn+0ov+WsVafxQp/wDTw830f4hDXoY5/PtpbOKGL+zf+evlf8tf/aVeyfs0/t7fEb4G6pH4O1y+k8QaX53mww+d/wAesVfN/jD9g/8Aah+G/mCDw5c31vazS+TLFNFLVfQfBPxi021jt774c3MdxL/y1lhph7L2p+ml58Wv2Lv2tLCODx/Y6bbahF+8m+1+VXJT/sE/sMXl359v8S47bM3mQxQ6l5lfDmj/AAT/AGjNe1SPQ9D8OfZre6/eQ/8ATrXYad4P+MV5Lb6V4/0qWx+yzfvppv3fm+VQH1VH3p4J+GPwP+EtpGdD+OFzFbxf8sYdS/8AttbmsfELw5eRSWPhXxzbXN5L/qbT/lrXxvoP7XXwy+GNrHB4q8Hfabj/AFflXfm/va6DUv2wP2c/iRYRweHPAF9ba5L/AMecsUMvlVmZ/VT2TUvj7Bpt1/ZUEEmiapFN+5u/O/1stR6l+3f8RfhLNHB8RvAFzq2hy/6nUf8AMVed6PeWPja1j0PxwPK83/XS0Xln4/8AhX/xPJ57HV/C8v7v7J/ZssssUVL2pl7NHtHgn9tL9kL4tWv26fwrpttJF/x5m7s4q19d+G/7A3xOijvm0nwrJcSw/uT9kta+ZIfEn7BXxCuo5/Ffhy50m4lm8ua7h822/e/9tYq9M8N/sr/sFTfZ7ix+O+rRyS/6nydYtf8A41WlOoZ1P3Rb8Y/8EsP2SfiRYXEHgDVdNtri6/1MVpDF/ra+dPjZ/wAEr/H/AMFLr+3fCl/Jq9mf3d5N5X/HrX1Zafso/BbQf9O+HPx+ki8r9552oaxa/wDxqtjR5vjv8K4ryGx8Y6b4t0vyfMhi86L/AOO0wpVK1z847zUvGPw91OODxVB9pt4of31WPiF8MvCvxUsNL8ceDr77NcRfvJpYf/RVfoJrGg/CT45Wsmh+KvCv9m3l1+71KX/n6/65V8v/ABm/ZL8f/sr+OP8AhMfhx5mpeG7+by/J/wBb5VrWZ2+0Z4X4D17/AISqKQmx8qT97/xL/wDn1rc8LTf8fFjP/o0f/PKWrH9g2Pgn4g3lj4cgik0+6/487uKapDo+lRapJfT2/myf89aDM6D4Jm+03XtU8OT/APHvdWctV/hLo99/wmVn4c8/9553medVjwgJ9B8Rx655/wDpH/LGL/nrWh4b1j+zfihpd9YwR/Z7+8/c/wDTKWgzPL/jxDP8MfiXqHn/AL2TVNYi8n/v1Xsng6G+hit55/3f7mKOasP/AIKNfD37Zr3g/wAR2M8smoS69a+d/wA8vK+yy13HiWHSofLsRPHHHFD/AK60/e1oBz/xO8Nza98ZPC/xO8iOK8sPKtv+usVe2fE7xJBr3hy40Oxnljt7ryvO8r/nrXmfg+zg1i6j/tXVfKji/wBT50NWLzWNVg8Zaf4cnntr37fN5cP7mWgyqmh4wmn1jwvZzwQf8eGm+XNXjfioweV++82XypvLr3jX9H/s2wvLGCfzZLD93NXjfiuGxh8yeCD93QFI5e8hvoZfIgnj/ew1XGPtX+g/6z/ltWh5MH+og/5ZfvKPsfk2Hn1mamfqWmzzeX5FZ8MP739/BJJH/q/3NdBDDPN5ljCP3f2PzKzzN9stZL6CD955NAFjXtHsfFXw51Tw5/o0lvLZ+X5VfkP+0V8PZ/hv8VdY8OT+bpv76WOzllr9iPh7pk811+/gktpLqb/W/wDbKvif/gr18E/7Nuo/iN5H+j2H+um/5+q6MNuaUjoP+CaXx4/sHVNPsfEd95lnF5Ufm+d/y1r9GP8Agon4Vg8Yfs++G/jhocP2nUNLmi+2Xf8Az9Rfvf8A7V/36r8W/wBif4kXGj+N9PsZ545ZPOik86b/AJZebX7afs969P8AHL9jLVPB19fR6lHYQyyQxf8AbWug0xH7s94/Y/8AiFffEj9m/wAL+I5/3t5a6bFHD/01i8qKrn7SH+h/BHWLHyPMkl+yxw/9Mv8ASoq+b/8Agmb8eILL7Z+zZ4qn+zaxpc0sejxTf8tbXzfK/wDjVfRH7S0MFn8JdYsYJ/Mj/wBF/wDRsVevlu54mNpHgfgP4j+KfhL4jt/Efg+9/wCJhF+7m87/AJa2v+fKr1O9+Nf7M3jzGufET4PXFrf3XWW1EX73/wAhV4RN580XkQHypIv+WtesaP8AGz4E2ejWdjqv7Pdte6hF5Uc11LNL+9uv+/te9V2PGNjxV+1R4N0Hw5ceFfgf8Of7J82z8u81H/Vy/Zf+/VeJ+cJv3/n/AGmP/WedXvnw9+IX7Nnjbxbp/hb/AIUTZW0cpl/100v7q68qX/8AdV4n8Q9NGm+N9Yg+wx6b5WpXUf8AZ8P/ACyi8391/wB+qjDAfWlnN5NSed+6qOftUc037qvJPQLH+pMkFRkQQy/6d+9j/wCmNV5rwwyyTzweZHR+/hi+wz/8e8v/ADxoALzz/wDUTwf8tv8Av7X5x/8ABTjXvB3jf9pvwXYf2r/pHkyx6xFF/wAtf3sX/wBtr78+JHjWDwr4I1DxHfX0n/Erh8uz/wCevmy1+Qfw9/tz4hfEaTxxqv8AxMrywm8y8u5v+WtebjahrhqZ7R4k1j4c6Bo1v4c+Fehy+Z/y+Xc1fNf7TkP/AAlV1b+DtKHmXGqTRR/vf3Xm17RrF5fWeg+R5/l/vvMmmhrz/wCFfgmD4tftBW/264l8vS5vtMNeSe3/AMuT7Q+BvgmD4Y+DbP7D+6/suz+zedXSWdnP5sggg8qO6m8zyoq6DxVi9/07SrGKKP8A59Jf/RtV/Dc1jZ3Xnzz+Vp/k+ZNWhxnN/G3xhY6Z488F+DrGeSOSwh/tG88r/pl5VYfxm/aQ+OHhqKPVdK+I0nlyzRRww/bJYpZfN/dVx/hvXp/FXinxR8R9Vn+0x/2ldR6D5v8AyytfNl8qL/0VWhoPhWfxt8X9L0OfSpJdP0ab7TqU0U37qWWgmnTPYPgn8VLH4e/GXwXqvxGnjudQ1mz8y8u/J/e19P8AxC+GPwD/AGg/C9xe+HYLaPUJYfMs5ov3VfAnxU8VT698bvsFjfSR/wBjQyyQzRXn+qi/55f+Ra1NY+Knj/4e+EbjXIZ5f9Am8vzZpvMoCnS1PQNY0e+8N6pqnhXVYPKjtZvLmmr2jQf2P/CnxT+EGl654O1zyry6h/13/PWvJ9Nhh0H4QSeP9Vv/ALdcS2f+mQ3cPlf62s/4AftLeMfhX4S0++8+2lt/OlkhtPtn+ti83/llWZrU/wCnZy+seA77wr8QZPCvirw59m1C1s/30s3+qlirQh02x8rNjpUdtJ/y+Sw/u/tVdp8Wv2hPCv7UMWl6VpMH2bWNL/eeb/z1/wCmVcnNz5c99/rP+eMNBqV7P99/oP73zPOlq5ZzTRReRVea8/e/uP8AtjRrN4IZY7Ef6ygzJNTs/J8uf915dZdnrH9pCSef/ll+7/1NSfv7zT5IP3vmRVjw/bvKkuL/AP1lTVA6CbyPssdxB/rKp3n77Rrixggikkih+02cVZc15PDFHBPBLWP8QtS1XRvhp4k8R6VP5clrZ/uZf+eVc9MD53vP2qNK8VfEa48Y2Ouf6PL/AKNpsU3/AC1l/wAy13HgP4keKtS8W/2VBqv2K4uv+WXnebF5v/7qvzT+FfjbxVrPhe81UWPl6fF/pPlQzf8ALX/prXtHwH+P2q+KtGkn8K/u7eL93N/yy8qX/nrWnsjs9n+5P0g+HvxC8fza9qEE8EckdrN++u/Jr2jwH+0V4H8S3cmlQeI4pbyKby/J8mvzj+AP7S3iP/hI9Y0qfXLmX+2YfLs/Om/dWv8A01o+A/xCvv7Z1DSvEd9JJbxXn76Wa88yKX/rlFWf7wz9kfqRrHjXybqSfQ77zI/J8v8A11c/e/EjXLzS7j7D5v2OKHy7y0hhi/1tfL8Gp+ONB0G3g0qe2/se6/5Bv+h/6qug8K+MNc0G/wD3E8UUf+qvLTyf9bLVAWPido/hz/hI/wDhI9Kn8qz/APatYesQz3lhHBYwebH/AKybzqz/ABJB5N1cX89xJLbxTeZ5VRzaxffZbeCC9/4+qAK+pQweV5EE8ccf/PGuL17wfff2XeX1jB9pki/8hV3A+z/6iexi8v8A5YzS/wDLWrFno8/7uex822k/5bf9NaAPE/B/iSeaKOC+uPNuP+Xzzq9A0HwT4A+P1/8A8IPfH+zfEkX7yz83/VS1X+LXhWfWIvPgsZLaOWby/N86vJ/GEN9pviOz8VQTR/aNG/5bfY/3tBrT3PUNN1L4t/sffEa2n8ceAJbnR5f9Gm8795FLX0B4b+A/7Nn7Zmg/258MfEdt4b8QS/660m82KuP/AGdf2/fB3xa0a3+En7UPhW2vre6h8u8u5bP/AFUX/LL/AFtSfGb9lf4c+FbqP4m/s2fFSKOSL955UM0X/wAdoNKpwfxr/YP/AGr/AIA+Zqs/lalpcX+pu7T/APdVwej69fWcsdjrljc2Oof9Nq+mPBP7d/x+8K6D/ZXiOC21uO1h8r99DL5v/f2uD+If7TkHxI8ufxH8OYo7zzv301p+7/7+/uv3taCOT8OTX15YW8F9Y/abeKb/AFPnfvZa9A8E/s92PiSK3vvAHxbvvDeuSzfubSa8l8qvO/DfxH866/5AckV5/wAsbuH/AFXlVsalr1jqWqR31jB5t5537mbzv9V+6oM6m51HjCz/AOChXwlMdjBrcut2fnS/bJoZvN83/v7FXndn+118arPVP+Kx0r95/wAsYprOKKvVPhv4q/bS8Sa1HYeB77/R7Wby5opfN8qvQNYvdc02P7d8cPgRpupR+TLbXmoaf+8/9pUvajpVDx/wr+3tY+G/tGq6r/rPJ8u8hhhq54k/bX8HeNpbefxjqsnmRfvPJ8nyv3X/AGyr0DR9N/YK8Saf9u1zwP8A2bHa/u7yKbyv/jVWNS8E/sFfDe//AH8FteyS/vIZpvK/dRUyzk/Afjz9jv4zWslx8TfNiuIh+5lmh8r/ANFV65oPhX4LeG/7P0rwBodjc/b4fMs7uGH/AFUX/TWs/wAN+MP2LfFUX/COf8Iron/b35Udc348/Zv0OGWS++C3irTYri6/0nybTypfKi/55fupaAPUPEnwH+I01/8A8UfDY3Nv/rP9dWh4Vhm8K+Z/wlWh6vJp9/8A6N++m/dRS/8Af3/plXzfD4w8f+D/ALPY658Rr7SY5ZvLs/K/dVY/4eS+OPhJ4jk8OaVrn9t2fk+XN9rm/wCWv/PWsyKm59STfsu/sk/Ei18iCx+zXkv7z99DL/ra5eH/AIJy/DKE3k+lfGGW2vPO/c+T5v7qvF/BP/BRr40/8JbJrlxpVj9j/wCeX2yvbPDn7dPhXxtdeR4q0P7FJ5PmTTWl5WhzVNiSz/4J1wTXVv5Hx3uf+/0tGo/sH/tN+FrnPgH4/R3EcU3/AB6TTS/vf/IVdZ4P+IXgD4kX/kWPiqP7P/09zeZW54l1HxT4KvoxceIrmPT5v+QbqGkzeX5VL2ofvjwPWPGPx2+AWqSQ/HDw7Jc29hN5cN3pP73yv/RVemeCf2lvB3jDRf7K8VT+Zpd1+78nyfNlroNG+ONvpkVv4H+O1vFqWh383l6Pq3/LKX/tr/38ri5v2e/Cvwx8W3mueB54rnw/qk0sln++/wBVLLL5tQB5P8YP2ddD03xHJB4O122to/O8z7J50ssVeR69o/irQbqTw3fQeZced+58r/nlXtnxC8Yf2PFHfX1jLc2dhN9mvJvtn+tq54w8H/8ACbeCLfxx4Vg8qSX91WgHj8WpC8sLeex/1lh/39iqMQwTXVnqsEEkUnnfuYv+mtaGseFb7w3FJ59v/pEX7v7X/wAtfNrP0eae8lj+wzyyyS/66aWgDuPjBrE/xC0Hw/Prnl3MmjTf6ZFF/rf9VLVOHQYIPDkl94cvvL/ff6mabzJar6zPBBa2/kWPlXEU3+mTQ/8ALWjwHoOuTazb33+s/wCmv/PWtDKqampWc+j+X5/739zF500NV/B+jwax4yuNVg+0+Za/8g2aWatD4qaPBo/+nWM8v2eLypJqk+D+pf29dXH+r+z2s3mQ+V/y1oGdhqVnPZ+XYzzS/bL+GXyZpv8Al6ry/wAeaZbw+ZYzzxeZFXea9rom+IOj/wCkSXMcXmxwy1j/ABU8Hf2xrNx4csYPs15F/pvnf89f3VAHldnDB5X7j/V/8tppqueR5Nr5H+t82rFnZwXv/H9+6j86pJtN8mXyKAKcNmPsEYgn/eS1X1PTbHzbjyIP9H/5Y10Gm2fk2H26CDzZIv3dV5rPyYvsMH7zyq0Aj8H6xfaP5n7iOWP/ANFV5n+3t8N7H4kfAeS+nsftMcU3+h+d/wAsrryv/wB7Xomm2f2PVPI/5aS1c8SQzzf8SOeD7T/yzhiih83yqAR+J/wfmvvB/wAQf7D1yf8AeWupfZpvK/5ZXX/PKv2I/wCCTvxUvtNv7f4c65feb5tnLJNF/wBMvNr8m/2lvhtY/BP9ozVLHSvNlt/tnmf9ta+zP+CbPxan03xRofiO+n/0i1hljml87/prXQejU/e0T6417R/Ffw3/AOCjuh+I9JgtraPWdSlttN8n/lrFLLF/rf8AyFX3B+1F5E3wb1SC3gl/dfZf3s3/AF9RV8h/8FDvFWueG7Xwf8W/CulW3mfbItR+1zf62KL91LX0ZqXxOsfjl+xbH8VNK8yS3v4bX/tl/pUVd2Bqfvjzcb/APD+P9f5H7zP+qr0/Q/gH4I13wtaatrfxf06zuJYYpJobrzP3Uv8A2yiryiH99dSQf+jofMqQQ/uv+WUcl1ZxfvYYfK8qvrd6B8oe4eFfhl8FvhtrUfj7XPjfZXMelzfaYbXToZfNupfK8r97+6ryf4neJP8AhN/GWqeMYLGSOO/vJZIf3NY8xuJv+P6eWSP/AFn/AF1qPv5/2eP97/0x8uWKinTND7Mo/wBbUfnfuqJrwwRV4B6BXn7VX/tP/lhOKkvPb/lrWfqXkfao7j/ln/y2oA8z/a7+IXg7wr8DfEE/jHVfLs/J8qb/AJ6yy/8ALKvzb/ZR02DTfg3rmq6r5suoX83mXk0P/kKveP8AgsZ8Wv8AhG7Wz8H2Nx+8l/eeV/z1rxf9nWznh+CNvYjzf+Jp5UkP/TKvIxtT2p6+GpfuSx481L7H4Xkn/dRW8X73zf8AtlWx/wAEwfB/9sX+seP/AOypLm8uppY4fN/1X+trzP8AaD8Sf8I18Pv3E/2mS/vPs3lf9Na+qP8Agn78Pb74e/CC38OTz+ZqEtn9t82H/P8A01rzjp/5cnsk3nw2v/LWT99/rq5/42eNtK+HvwR1jVb6eKW4l/d2fk/9Na6jXryCeWSCCDyv31fO/wDwUD1jXbz4I28/hyCWWOLUoo7yKGH/AI9f8/8AtWtDnOb+G+vX1n8G7fSvI8qTyZfOmm/5a/8ATWvuz9mn4hfso2fw+/sPVfFVtHrEv/ISu5oZa/MfwH+1F8Mryw0/SvEeqXNlJYf8Sm8imh/1sv8AqvN/8hV6x4b/AOEA1KX/AEHVvNjl/wCfSgVKkd5r154Oh+LXiy+0O+iudP8A7S/0O7mhl/e10ln8DfGPxCv/AAvY+FfDlzqWl2F5/a013aTeXFfxfupfK/e/9cq8/vNN0OztfI8+5jt+/kw/62vcP2Xf20tc+DPhe38K+MPB39rW8X/L3aTf6qKg7fZsj/aW1LVfBPhLT/A+raHc6bJqmpRSQy3f/PL/ADFXmesa9YwyyWOlTxfY/wDVQy/88q9c/bd/ah+Enxs+F+n/AGHS/LvIr2KOGKL/AJZf9Na+V/ipr0+m/D6SD/lnFD/x9xfuvtVZmdL/AKeHpH7Gdn/wmF/4k+Kk9vL9ni/0ezh/6a/5lr0S8nEN1/pFY/wx0fVfhj8HNH8HQWMUcms+be+dF+78qLyqkvLzzpf39BnU2LF3eG7l/cGqepawPK8+x/eSVn/6mWOfz/8AtlUf2yeDVf3/APo1vQZnSWZ/0WPP+slrP168gs4v3H+sqxDqXkwxzwfvaz5oYIftF9P+882lVMzPvL2fTf8ATvP8zzaz9Y8jWPBuqaVPP/x9ab++iqv4k/c+X59xJHHRNqVxDYfYZ7H/AEO6/d+bWVOmKkflH8AtMPhu11Twrq0Pm3HnS215DR8N4f8AhW+oeIIL6wl+xyzS/wCp/wCWVeqXnhXw54P+PviCxvp/3ct59m8ryf8Alr/z1ruNN+FelalLb+fpUflxeb9sm/5611fufYno+0/cnz34P+OWk/D21uJ9VnubmSWH/iW/ua2PhL8eINStbf7drltFcX//AExl/dV6R8ePgbpUPw5k1zSvCtjbf6HL5P7n97LXyv4D17w5Zf6D59jFJazfvporz/W0GtL96fqp+xn+0tBr3wvuPB3iOCyubiw/0aGWaGXzfN/5611lneeTqlvBP9pl/wCWd5NDNF/ra+I/2XvFPiP4b+LbPxV9ukudPv8A93NDL/yyr7Q03WLH+2f3M8csf+s86uaqZVNzrJtHnm0aSCC3/dy/8tpq5vUtNn02KOCx/wBJuK9E8HwQa95kHn+b/wBca6j/AIVjBNFbmxsY/tkv+p/c0zM8f/sYw6p/ZQn/AHn/ACxrqP8AhFoPssehQeZc3kX7zzoa6yH4MwS3UfkQf6RF/wAfnm/8ta7zwr4P0rTYv3Hl+Z/1x/e0AeL6l8PZ5v3E9j5ccsP/AJFrxP4kfDefwTfyWOueXcxy/vfN/wCeVfaHiqzgs7WOf915fnf66X/nrXjfx48KwalFJ58Efmf6z/U1PsgpVD5bh8Ewabqn2Gx/06S6/wBT5P8AyyrQhs/ip8Pbrz5/Dl7fafF/y2hhll82jxtpviOb/kXIJLb995cMsX7uvTPgb+294w+EtrZ+Ffi58Mv7Ss7X93NNNDFL9qo9kdNQ4uy+NmheJJf7Knn+wyRf6T5Pkyxf9sv3tanhvwr4j8beI/8AiR6V9p0+6h8yabzv9VX0BD8Gf2Sf2+4rzVfAAtvC/iiwh8z+z/8AVebL/wBsq+Z7PxV8W/2M/jJqnwk8f6VJL/pnmQ+V+9821/55fvf+utUI7zwHo/2zxRHpXjiD+ydQv5v3MUsP/kWvaPBPwT+HM2qf8VH4j+02fneX/ok0X+trQvPFXwP/AGwPDkcEFjbWPii6h/czWn7rypa8TvIfHHwm8R/8Ir4jnjij/wBZDqMX/LWKgzPpzxX+yjrl54St779mvxxL9stbOL+0rSW8i/e/uq+X/G3xU+I3wr8WyeHPjhb6vpscUPmwyy+VLFLLXQeFf2qPFXgPXrPxj4A8Ry3Plf6nTpZv9b5VfQh/ac/Y1/a58GSaV8fvCtlpGqf8tpZrOKTyqDM+T7z9pD4VzaX59jPbf2hF+8himhl826l/9FVoeCfi18OtN0HyPGPhX+0vtU3mTXf/AC1/65V1Hjz9lD/gnPqQk1XwP8YrGK4lm8uzh+2f6r/tlXjfxI+B3iP4e/6D4O8Yx32h2v8AqZf+mtZnTSqHoFn8Pfgf48i+weFfFUmiapLN+586asfXv2b/ANpP4VS/8JH4HnudWt5f3kPlXkUn7qvnPxJ4wn8Ny/boNVubm8sP3k377y/KruP2df8Agod448E39nB/wn8mpeV/pM1pqN55sXlf88qml+9O32Z2ln+2ZfeD7/yPFXg795LD/qdRs/8AVV6h4D+Nn7AfxrtbfSvip4Hjtrz7H/yFtOhv4v3v/oqu48K+Kv2Hv28LCODx/wCFbLwlrl/D/ofkwxR+b5v/AFyr5T/a0/YP+MP7Jfi241zwNqsur+F7qbzIfJml8qKL/W1scP8Ay+PoTxh+wr8JPHlhHffs5/GmP7R/rJtPu5v/AI7FXj+pWfxb+D/iiPw38TfDkkf2WH7T9rh/5axf88v/ACFXj/w9/aQ1WG1j1Xw59utpLqb/AEO7im/1tfVHwx/aEsf2ivh9/wAId4jsYrm887y4Zrv/AFvm/wDXWszb2Rl+FfGEGsSx+RfXNtJLD5kPk/8APWvTPh7+0t8R/Df2jSvGOqx6l4fv/wDRv+mtr/01r5/u4b74b69eaHrc/wBmk87/AJbf8ta6TwrqU+s6NJquLb91D5l5FDN/rYqDE+lJbODxtpd5ofhyf7boes/vJv8AqFyxf+Rf+WX/AJFryP4V/tCeKvAfje8+EfjHVbmWO11L7NZ+bXL/AAT/AGkP7B1mPXdDnkkt/tnl6xaTf8sv8/uquftdabpV548s/iN4b8ry9Z/eedDD/wAtaDM9k+MHhux+J37MmqeI9DvpYtU0uz/fQwzRfvZasfsr/E6fxt+z7eaVPBHJJ5P2aH/rrFLXnfwZ8ef8I3YXmlz3HmR3+my2376Hzf8AllXN+A/GHir4Y+I7yDwrZf6H50snk/8APXza0M6p6x4qs9Km8B6hpX/L59j8rzZf+ev/AC1rxvwT5+mxWdvfebJcRf66tzWPEmualf8An+f/AKPdfvJv+mVU/Jnhht7+CD93L+6/660GZ1GpTQXl/HpUE/l+VD5nnTVY8B6n/wAVRH5E/wC7/wCW0Vcvps3+n/2TPP5tdBoOmf2P4j/tX/nlWgqlM6D4zeNrHR9L/tW+g/0eKaKPyv8AnrWp4bsxZ/CX/hI4LH7NJqk3mWf/AJFrz/xVNY+NtQj8HT+b5ks3meTXsmpeG59N8OeH/Cs8HlRxWcUlBn7I8v8AiHeX03he31Xz/s15azRV6JrN5/pWj65ff8fF/Z/9/f3Vcf8AGDTdK0HwvcaVfatHFJLZyyQ+V/y1rU8VTarP8OfCeuwQfvPsf/fr/W0DOL17R7/QfFHkX37qOWHzYar6lZT2dh9u+wyy3H/Paty81j+0j58/73yv3cPnQ1YN5BeWEk/n/wCqrQDm9Nmnh+0f8tP+m1SabP51rJB58X72iHyPstx5H7qOWpIdNn03y4III5ZP+e1AFP7GLP8A1/8ArKk0288nWZNcn/5ZQ0Xk08Mvn31Z95NiWPyIPtMnnf6mgD8+/wDgqv8ACuxs/irceI9Kn+xW9/Z+Z53/AE1i82uL/Yh8eQaDrOn+R5nlyzeXN51fWH/BUT4b6Vr3wCuNVnNtLeWv7zzf9XL/ANNa+D/2UdY0qz8eafpX26O5/tnzfsf77/j18r/91XRT3PRpVPa0T9pPjZpsHxy/Y4t/sMHm3FrDFJD53/LKLyv+mVXP2D9YN5/wT21yxF9Fcx2viTy4YYoZY/K/49f+etZf7H/iqx174D6ppQnl/ew+XZxVxf7H/wAYB4Pi8cfAG+/5/IpLOL/llFL+6/8AjVdWB/dVjzcT/CPTPOxLJ9nni/e/8saP3tH2P/T5PI8r/rt/01rY17wrrnhXQdP8R65pXl2eqQxXFn/1ylr7BVdD5gy6jm8/yq0NB0HVfEms2eh6UfMuLr/nrVfxJo+q+FdZk8Oa5B5VxFNL53/TLyqoD68h8iaWq8v7mXz4KJ5oP+WFRzQ18+egV5vPs7rpVPUryx8r7R/y7y/u6sanDBNdfZ/Prn/FWpQQxSX0H/Lr/wAsqxqh/wAvj84/+Cuk2h/EL4teH/A/9qxR3EU3lzXfnf6qj+wIPhv8KtP8GwT+V+58uG7/AOeteB/tRax4j+J37WGqaHP/AMe8WpeZNN/0yr6I8eXg8VaN5/2f95FD5dnD/wA8ooq8XFH0OG/gnz38SLyfXvG+h6VY2Pmx/wBpeXX6IeA9Hn0HwPpelTz/AGaSLR4o/N/7ZV8F+FdHg179pbw/pU/+ri/eTf8AXX97X35DqX+gRwT+ZL5X7usqewqpcmm0PXr+SCefy/33mGbzv+eVF55+pS+RPYxRWd/+71KL/n6/z+6qn4ks59HsJL6xsYpP+WkP/TKug8N+G/GPirRre/Ol/wCkX/8Aroov+WVM5zzfWP2b/hJ8TopND1XwPbWVvFD5c0sX/o2vL9e/4Js+DdSlk/4Q7xVLpPlfvIfOh/1sv/PKvriz+DPxU0f9xrnhyXy/+mNY97o99Z38ljPY3Nt+5/c/89ZZaC6dT2R8P6x8Af2hfhLLJfeRFq+ny/6N9khh83/P+qqnD+0hfaPNb6V8TPA99HJ/y2+1wy/uq/QzwH8Jfi38QpbifQ/DllHb+T5c0v8A+9qv8SP+Ce/jDUhJfa54A0nUo/8Alt5X+toNfrx8R+G/id8OfG1r53hzxVbfbPO/fQzTfvfKo0fwrffEL4jaf4OsIJZbe1m8zzv+eUVan7S37Dfhzw3r0mq+HIL3w3qHk+X/AK791XWfsi/DHXPhLYXHiPxVqtlfXF15Uf2vzpfNrMPa+1PZPGGswalqkmhzz+Zb/vZIZof+WVYc0ME1r+4nqnDN/aX7+AeV5sMv72q8P7keR5/7uL/lrQZ1Ni4fI83/AFH7uWqd5/odri+Hmf8ATGq/9pQTXXnzzyxfvv8AU1oakPOv454IIvs/k0GZH532O1+3ef8AZvN/5ZVTmn86WP8Af1Xm1KDyriCfzZZP+WNSWfn+VHPfQRf6mgzM/WLyeG/8+eD/AK41oeD/AArBr2s28/kSyRxTeZWfeQ2N3L5F9PLXqnwY8K6r9lj8RzwRSW9hNFJpsN3+683/AL9UF0j5P8YfCXSv+Gh9c8VT6VHc28X7uH/nl/y1/e1qeD9H0qby4PsP7v8Ae/uv+2tdh8Wte0Pw3L9h0PzbnVIryKO8il/55ebXP+FoYPtX+v8A9Hl/efuaDUw/iRoPg7TdHk/4TjSvN0+1h/ff9Mq8z039mn/gnd+0hFcaV4O+Lf8AZOoXUP8AqtQ1KKPypf8Av1X1ReeA9D8YeDY7G+0P7Tb/APL5LN/zyr8n/wBt79nDxV8BvjdqHiP4fz3Njby2f2mH/TP3v+tl/wC2VB04bY90+JH7H/xb/ZR8vVdV0O51vw3532aHVtO/eRSxf63zf3VekfDH4qXGm3dvfWM/2aPS/KtofO/1ssVcv+yj+0J8afEvwHt5/ibP/wAJBof2OKyh0/yf9Ki/9pf8sq7jUvhv4H8SWsnir4Ozy215FD5c2nah/wC1fN/9pUGlSme6aP8AELSvGFh/Yd9fS+XLD/rpf+etegfAfxtqum6pZ+FTYxeXL+7hu4f9VXx/8MfEniqzi8/xjY/ZryKby5rS0/e/uv8Anr+9r6Y+D/xy8K6P/oPiOxlkuJfK+x/uf9VF/wBsqyqnNUPqSHTYJvMnH/LL9351Rzab9j8uGxsf+21cn4V+OUGvRSQT+VbWcs3lw12H9sQfZY7GD95bxfvPOopGZX17Qbe8ljgng8yP/njXH698PYPGEsmlT2Pm+b+7hu/+eVekaPq8GpQyT1Ym0exmi4uPKrUzPkf4/wDwwvtN0vyP3stvpc3+h/8ALPza+f8A/hYXxGh+KGl+HNV8OSyaH50X+l+T/qq/Qz4haDY69oMkF9YxyyRf6nzv+WtfJfjDw3Y6br0mq6VB/o91Z/vvN/5ZS0HRSqe1OD+M3gO+8N+No/ib8Mr6WO8tbOKSaG0/5ay1J8QviRpXx4+HMkHxGg/sjxBaw+ZDq13D+6lroNH8ear4D8URzwaVHfSRf66Kb975v/f2tjxh8ePB/jHS/wDhHPFXwX02LypvMhm07/lr/wBdf3tZnQeL6Dea5pssd9rk8nmf8/f+s8r/AK5V1HjD9oTwf430az0rxjrv+kRf8ec1EOgwalF58/7v99/qYv8AnlXpnwx8H/sP+PLD/hBvip4VudN8r95/aMXm/wCt/wC/tZgeD6P8Q/C3myQfbrH97N+5h87/AFVemfBK8/ZJ8bXd5pXxw1WK2k/1f2u0m/1teqeNv+CS/wAD/iR4c/tz9nr4qWUVxfw/6q7vJfNr5H+Of/BOb44fA3XrPSviB4q+zaHL/wAxCH/ll/5CoH7P2p9SeJP2aP8AgnBeWvkWPxpuZJPJ8yzhl1K1/df+Qq8T179mnw54V8z/AIUD8W7nUreWbzPJhmi/1v8Ayyrk9Y/YJ8Y+FfBMnxG8D/E3TfEklhDFcw2lpeS+bdf9Mv3tcH4K/bMsNYkt9Dn8OXOkXF//AMspofK/e/8AbKpqGvsj1yD4tfFv4J3X9ueKtDiuY7X/AI/P31dpZfEL9lf9rrSo7Hxj4OudE1yWbzJtQhm/ey/+Qqx/2b/2P/i5+2xr0mq+f9h0O1/d3n2uaWKWX/prX6L/AAf/AGLf2PP2UvBuljx8ba9uLWzijmu9Wmi83zf+2VdOGpmVXEukflZef8E8f2hvAWvfaPhX4V1LUtL86KSGaGz/ANVX1Z8DfFX7VHgPwj/wrn47/CvV9S0eX93502my+b5VfU/xI/4Kk/sefBLy9JsdFudX/wCwTZ/uov8Av7XKaP8A8Fkv2XvGF/caX/wrrV/s/wDz9zWcX/x2un9ycPtcXe5+ef7YHwBvvhj4kk+MXwr0O+ttL1SaWT+yZbP/AJBdcXpsI8SWtvrljqv2a4l/54/8sq/Z/wAK+Kv2Sf2s/Adxoeh/2bL9vh/fWnk/vf3v/XWvzc/b7/4J/a5+xd4oj+I/gCxlufh/df66zimllliuv+ev73/tnWVTY6aWJq1dKhy//C1J/iFo2n+APHNj5n2D93Ddw/u5f+2tcv8ABP4zQeA/iZcaVrniOS2ji/0aGGWb/W1J4JvND8VaD9ugHl+b+7mm/wCWtcf4k+Fd9D4y/tz93c2//MN/ff8ALWuQ6v4RueMNS0rw38ZLyD7dFc6Xr0P/AB9wzfuq9AgM974Nj0Oef/Q/9XD/ANMq4P4keFbG8+Bn26DSvKvNGvIvsf7797L+9i/+Oy12Gjw/bPA+j/YZ/wDlzik8mX/nr5VBlVOg8N6lfw+ZPP8A6zyaualrEFlfx2/9qeZJdf67/plWHNqU82lx+R5fmUTabBqWq29jPB/x6zeZ5sP/AC1l8qg5joPDegz+JPFFnBBBLFZ2v7z/AK6/9da6zXprGG1/1EkXm/6n/plR4V1jStN8OXmlf6q8uoYpPtf/ADyrPm8jxJa+fDPLc2dr+883/prWgEnhW8nMvkT2P7z/AJ7V1F5qUE1/bwat/pMcUP7muTM0+mWEc8E9aGm6x/z/AEHmx/8AoqgDpPh7Z+d4juPFU8/2aOKH/VVqa9481XUpZPt0/wBp/c+XDXJ/29/Y9rH5F9/o/nf6qoz4kg1KX7dB/wAsv+WVaGZyfxlvL7TfhzrGq/8AHt9qm8yGGb/llXsmo6lPqfwW8J308Hm3H9mxedLXi/7VF553w5t4IIPMuLqb/Q/+mteyabZ32m/DXw/Bqv8ArItNi860oA5eaa+huvIsf+Peqc02qzaNceRWxeQwfb/tFj+782q/kz2cXkQfhWhmR6Dpt9pmjf8APT/plNVj7ZP5Uc88H7v/AJ40Q+feRR5NSXkHnRyfYZ/9VQBXmvD5X7iqc1nPNF58A+zSed/rqsQ+R5Uf7j95/wA9quabDbzX8nnigDz/APaW8HweKvhVqkE/mxeVZyyfuZq/IfwTqV94V/aHt9VsYLmOzivJY7yGKb/VV+2niXR/7Y+HOqaVfwReZdQy+d5v/XKvxn+LXhWfQfjx4g0nSp/sNvf3n76b/nl/qq6Ke52YbY/VD9gnXv8AiQ6pfef5lvqk3+h/9Otcn4V0fXPCn7V9xfeRL5d/D++m8n/W/wCtrP8A+Ccnir/QP7K1yD/j6hitoZYf+eX/AD1rU/aE8bT/AA9+L+h2MF95knnf88f9bFW1L+OcuK/hH1x8N/Dfw68VapJpfxH8Y/2TZxQ/abOaKHzP3te4fFrwF+z1r2jeG/7V+JskUdhpsUem+VD5nmxRV8r6PeT69a6edK/d2/2OK5+1/wDTX/nlX0J4J+Hvwe8N6Z4bg+LlhqWrax43vP8AiQ2kt5LHHYRS+V/zyl/6a/8AkKvp6h8s9w8K6D+y94D1638Yz/FS51a8sJpZLOH7H/y18qvI/iF4p/4TzxvrHjKCCS2/tS8+0zWk1egT+CfhXo/7Tdx8OdW8KyWWh3U32KGKG8ll8qX7L5v/AD1/561w/wATvDcHhXx5qnhzz/NjtbyW2s/+mUUUvlRV00qgj6Qhs/Ol8+iabyZvP/5Z0TXh8ryM1X8791J/0yhrxTsI7yaf7J58A8ySWuL8VaxY2ei3F9fT/wCkXVnL/Zvnf6qKWuo+2QeT5E//AD2rxf8AbM16fQf2d/EF9Y2//LHy7z/nrFWNU1w38Y/NPQYbH4nfth+LPI/1cU0v72L/AJ6xSxRS17xeQz3kNxBBP+7uvNj/AOmsVeD/ALDc3k/FDxBqv2fzZIvN/wBb/wBdf9bXtHiS8g/4SO4voIJYrfzpZIf+2v8Ara8WqfRzOb/Y/wDB8+pftLaxquq2Xm/2XD+5hmh/6Zf62vsT9/NFJPY/vY/O/wCWNeB/8E99Nvte17xh44voP3n2z7NDL/0y8qKvfNeMGpWv2HSjLH5U3+uirM56hYhs9V17/QbHzZJP9ZNFXsn7Ovx48D+A7DVLHVZ7aSOw/wBTd/8ALWWX91+6rwvxJ4qg8E/D7xJ4q+3fZo7XQbrybv8A6a+VLXj/AMJfGGq6P8G7P9x+8lvLq5m+1/8ATXzaBezR+l8H7ZXw4lmj0u9t5JP+Wk0vnf6qtDxh4Q+HPxm0y28faVqltL9hh8yHyYa/HS8/bZvfDevRwarcSx2drN5f2vyZfKi/6ZS19SeFf2kPHGm+FvsNjPH9jv8A95N9k/55f89aA+qn1J4x/bM8HfA2w/snS7C2luP+W0vneXFXn+g/8FMfEVnqn27XPDnm2/neXNDaTeZXxv8AEj4heB/B/meI/FXjHypLq8/c+dVj4beMIPiprNv/AMI5fW17J+6/c+d5fm1mP6sj9AP2ifAXgH9rT4LSeI/Ctj5eqRQ/aIf3P73/AK5V8b6DoM+m2H2K/m8q8/ex3lp/zy8qvTPhX4w8R+FYo/Dl9qvleV+88m0mrL8SQwQ6zcX0H72O6m8yaagDH+xeTYRwH/V1j6jD5MUdjPP/AKqbzP3Nak14Lz7R5H+r/wCWM1Z8MN/N/wAeMEUlKkZVTP1iae8usQQeXHLVizvP3cdlnzf+utGp6b9juvP/AHv/AE286izmsf3n7itTP2ZXvPJ/eQTz/vP+WNE37m1jEHleZFDLJ/11ovOJY4IIP9b/AM9auab4b/t6/t9Dg/1ks3l1mamx8H/Dd9428ZSaH/ZXmyRTfvv3P+q/dV75rEOh/Cvw5JpUA/eaX/5Clqx8K/Cuh/CXwvcQT/8AIQv/AN5NL/z1ryv4teNtVvPMg8jzI5Zv33/TWg0PmvXryDXvG+oa5PPJL++8uaKGz/5Zf89a2PDfhWDTbW4nmgljt/8Alj50Plfuq2IfCvhXQb+4uP7K/eS/u5vO/wCWtWJ9OsfO+3QQfu4v9T++/wBVQB6B8K7KDXvC8nhyfzf9K/1MtfIf/BXT4Mz6b8PtD8ZX09tF9gm+xTRTQ/vZf8+bX1Z8MdevtH8UWdjB5cVvdf8AH5FL/wAsq8P/AOC8EWq/8KD0vxVpVj5v9lzReT/1yll8r97Wh04b+Kcf+w3qX/Ch/gtH/wAWkvvEn9qQ/wCti/5Zeb+9/wCeVekQ/Bm+/aQ0rWJ7HwdJ4b8QWvmxww+T5fmxV8r/ALGfx++OHhDwRZwaVqsVtp/2Py4ftf72vrz4M/FTxV/wlun65rmq+ZeRal+5mi/1UtBpP+KfIfirxv8AFT4b+PJPDnxGsb2O8im8uG7lml/exV6p8K/iRpV5F9ug+w+XYf8APWv0E8efAf4H/tf+DbjSvEelW3+lQ+XDLaTeVLFLXzX4W/Yh/ah/Zd1680rwP8K49b8P3X7uaab95+6/7ZS0CqVEc/o/xIgN1HBYwSyeV/y9+d+6r3T4b+KtV1jRv7K+3XP2eL/UzTTVy+g+Mfjh9gj8OeKvgD9mjim8uGbyf3Xlf9/a2NA8VX3gPVLjz9D8ySX/AFMNctQ5z0TTfEl94b0+M6t/y/8A7uHya2Lz4kWItf3+qxfuv3fkw/8ALWvJ/HnxC8R6bo0njjyIv7Qih/1P+tiqnoPx58Oa9pdvPpWh/wCkSw/66X/nrVGZ6Jr3jD+2fLsf9XJ/yxmmryvxVpthqXmWPn+bJ/zxqxpnjaDwra3n7iSWO/8A9d5tc/qU19Z+ZPoc/wDx9f8ALaag0pHF+MPAcF5FcefP+8lhrz/Xrz+wbW3/AHEX7r/Rv31esalDBNF9nnn/AHn/AD2ri/HngkeJJZL6CD/Q4rP99DQBz+g69bz2H2H975kv+piio/t6DQdUk+HHj+x8u31T95DqMt5/qq5ez03VbPRvt3n/AOqm/c+VW5N8SfA/irwv/wAIr44nvZf+Wc0v/PKszoNDxVNqvwZv7fXPhz8VL77RL+8s5rT/APe16J4a/wCClng74teF7j4c/tQ6VY6jo8sP2b+0dWmi82KX/tr/ANsq+Z9e+DOh6PrMcEEEl74fv/8AU3fnfvYq8r179kT4m3niiSx/tXy9Ll/487uH/nlWNU1pHYfE7XvjF8HvjT5/7PXiqW58D395/qdOvJfs1rXpnwr+GPhzx3f6X8Y/jT4VsbG4+2fabz7JZ/upZf8AW+b5v/LWWWrHwB+AMHw9sJP7cnluZIvK86ab/nl5VY/xs+J0/wAQr/S/A/gDzPsdr+8mu/8AV+b5VKkP2h9CeNv+ChHir4e3Ufw5+BGh/YrO/h/fTed5UsX+fKrwP4/fHn4jeJPMvvGPiOS582b/AI9PO+0y1n3l5fal4jt/HF9P5t5FD9m/0SH/AFVcnrGsf2x4tj/4SrVZJZPO/wBTN/yyrrMTU8E/A39pP4/R3H/CufDepab5sPlzTXdnLFLWP42/Yz/bL+Etpb6r4jgvrmO1m8yH/W+VX0p8K/2qPiNo+jWf/CHX1tbW8v7vzvJ/1tekaP8AE74jfE3/AEHxH4j8yOL/AJY+TQaHyX+zH+0h4j0H4g2fgf7dqWia5/z9w3ksVfpx+y58d7D9sv4S+IPgf8YoJJNUiMttFNND5kUsXleb5v8A6Mr8x/8AgoR8GdV+Euv6H8YvB2lXMUkV5LJqUv8Ayyi/1Ve2fslfFSfTfGWn/GLwcYvtF/D5c0P/AEy/z5tZjqpHF+Nvhv8A8KH+PuueAL6eL7H50v2PyZv+WVENnBDfyQX3+ri/484a9Y/b8+JHhz4neN9H8VaV/wAfFh5Ul5NFD/qv3VeZzQ3H7y+n/wBZdf66gKZoXlnBrHw+vIPIji8qH9z/ANMv3tZenWU8Phazgvp5Iv3MUf2uGus8Nw2OpeHJNKvv9ZL+7qSz+HsHm+RPP/o/k/6qgyMeHR7G8l8/z4pPsv7qbyf/AEbWxDMNNsI55/KiuJZvLhii/wBVF/01rpNN0GxhsPt0Fj+7/exzXcX+qlq5Z/D2x8eapH4VnuPKt7r/AI/Jof8AllWhnU3OH8EzeKvi14ok8K+FdK82Ow/dTXf/AD1/6a16h8Zte8OfA3QbP4H6HYxS6hdQ/aby7i/66/8A2quw8beMPhX+zH4Dj+FfwdsftOoX9n5epXc372Wvl/WNS1zX/FEniPxH5nmRQ+XZ/vv9bQZnUTa9PeWsfkfu/stan9vT2dr9hgvv3n/Laaaub+Ht5Y6nrMl9qv7qzih82aaWq9548+HPjaWT7Dffu/8ApjWZ0Ghe2firxJrVvofhy+/dy/66au41jR4PBOg6Xodj5lzeX/7ua7hrL+Hs3hXwrax308En72H9zWX4q8eT6xYXGuQT/Zrewm/0zzv+XCgDD8Sa9qvjz45+G/g7Yn7TZxalFJDdxf8AXX/7VX054l8izijsZ/3slrD5c1fKf7EPhufx5481T4t65PL5dref8S3yf+WUv/PKvrS8mg1mKT7dBFFJ/wA9a6DjqbHB6l/pcv7j/Wf8sakmHk2mc+ZcVJeWcH7zj/trVOabybDz4K0OcIYZ5pf9d/qv+eVLD/x91PZw4tfPsf8Av1Wf4qvP7N0vz4IP3nk+ZWgGp+41K0kg/wBV5VV7Ofyf3/8Ay0/5Y1H4VhOpaL/o8/8ApEv/AExq5eaP9ji8ief95FNQaFjyYNSPkX0/lSSwy/66vyP/AG8PDc/w9/aH1Tw5cQSeXfzeZ5v/AGyr9cDN/p8c5gr85/8AgrR4Pg1P43Wc89vJF+5i/fRfu/8AllQtzopHpH/BPHxV51h4f/cSx3n7q2hi/wCesVeqft4+D4P+Fi6H44sZ/wDkF/67yq+Z/wBgPxJqng/xH4b8R308X2e1vIrazil/efuq+nP23tH1WbxvHqsMEsWl/Y4rnyv+eX/TWtaP+9GWJ/hHsHgO9g1H4aaXfTz20Xmw/aYYpv8AllX1h4E0ix/aDk8F+JPC2uW9trnhaawj1KK7m82K6iilir47/Z11ifUvhzZ6r+7kuPsf2bzv+mVfRHgP9mLVdY8L2fivxj4/03w3HfzRSWf9rTfvbqKvsKn8FHy9X+KeqeJPgbYfD34tax8d/iL4qsbbT7X/AEmztIZv3ssvleVXzn428bQeNvG2qeKp/wDWazqV1c+T5P8AqovNr1D/AIZX8K3kVwJ/2mvC0vleV5MPnf6r97/11ryfX9N/sfxHqmlQa59pj+2S/vYf9VL5X/LWKnhqZB9QakfJlqOaH/QJM1JeTzw/8sPM/wCmtZ+p3c80XE//AC2ryTsMfXpjZ39xB/yzrx/9sDxVpWg/AvxBP4j/AHlnL/x+f+Qq9M8YTX15dfuP3v7mvlf/AIKZXmqzfs8SfYYP9b/x+eT/ANdayqVDbC/xj43/AGLfPm+KHijXLH/jziml86H/AKZeb+6r3DXov7N0a4vp5/3fkyyQ14/+wT9h8rxB4jsYP3cUP2aH/v7FXtnjaDz9G1SCeC58uLzZIa8Sqe9Uq6HafsKwweG/hB4k8R/YfK+36x/rv+2UVemWd551/wCfPP5Vv5Pl1yf7FtnPo/7LWl65fT/abiWa6/czf9dZa6yH/WyT/wCq/wCmNZmZx/7Wmpf2D+zT4g0n/VW91D/rax/Aeg2+sfAzS7H/AI/ry6s4vO8msf8A4KNeJPJ/ZpjvoP3Uct5/rv8Anl/qq9E/ZXm8OXmjeA4Nc1yO20/VIYvJu9Q/65S0GXtTzP8AaW+D/wAJNN/ZG1wf2HHHeWFn5V5L5P737V5UtH7H+sHxV+z7p+larP5dxazS200s3/LX/VS1+inxx+A/wI+Kvwq1jwrZeItI8y/02XyZYpopf3vlf88q/N/9mn4e/wDCE6peeBoL6SS30vWP300M37qKj2aNfaHYQ/AH4V+MPEd5qvjixkvo/J8uztP+WUUteV/GD4ewfs9/Ebw344+HM9zFp/nRRzQwzf8ATWv1A+G/7K/wk8SfDqzvbDxHbeZdQ+Z9rtPKk/e187/8FAv2J/8AhFfhp/wkfhzxH9pk0a8+0w6T/q/NoMvanmfw31jVftVxY+fLJqkvlXMMMv8Az6/582vRNYhOpXXnwfurf7HF/wDba8T+CesT6xoP9uQQReZFefZrz995vlV65eTQWcskHnyxySw/uYf+ev8A01rM6fZGXNFPZ/8AXvL/AKmo7O8gs7r9/wDu6salNBNp8f8Az0i/4/Kz7w+b5c//AC8UGZqaxNBeWvkeR/ra5uzvILOXyJ62OZj/ANPlU/JgvLXp+787y5qn2oFiz02fXv3H+tkl/wCPOvbPgD8N9D021kvtV0r95/z2/wCmtcv8MfCs95LHfeR/o9r/AK6vYNN8iztcwf6uWqMzH8eaxfw2sdj5/wDqq8z8VaDPrEXnwV6Z4k0Ge8Pnwf6uL/U1n2fhue8iEF9/yype1NDyObwfPqX7+CCOXypvMmhqn4q0eCzi+3DSpY7eX/XQ17hN4bg8qS4/561Y0fwTpWv2HkX0/lR0e1A8T+G/g++166kvvsP+kf8ALb/rlWp+35+zTP8AGz9kbXPA9jBHfXkUMVz++/6ZSxS/+0q9o8K+A9K8K38d9BB5cd1N5c1eyQ+A9D16w/cQeb5v7vzov+WsX+fNrUVOr7I/B/4D6P4Nm8DyeDr7SZbbUNGvPs03/f2vpz4S+D4JvFtv4cnn/d3V55cNfT/xf/4IueB/FfjbUPH/AMO/GVxphv5/MhtP7O83yv8Anr/y1/56VgaZ/wAE5vjv8MtTj1wX0epXGlzfufKm/wBbFQa/WVWOk8YfsjfGnwroNn43/Z68SeZ5sP7nSZZv+Wv/AC1ruPhj+0T8W/CGjR+HfGNj/plrD5epRXf7z97/AMta6TR9f1z+wbPXP7VubG8tYfLvNOmrzv4qeMP7S8yfVYLb97N/qfOrKpVMvZmx8TvjlP4ptZNKvoLayklh8uHyoYq8L+IX76K3nn/eyRfu/NhrD8YfELVdTuox5/2b7V+78muTs9e/tG6uINV1yWT7B/qYqg6aZ0n9pQQy3lj5Etzb+T5c0M1YegwQaZLHYwQRRR1HNNBnyIJ/9b+8rPh1jybrJvvK/wCuVBmdReeR9lk8ifzfWqcP76KSxg/5ZVlz6z51rJPiOL/prLWHealB5N5YwX3myXVn/plAHQfbILyX7DBPH9oi/eeTWPeXljZyyarPBL+9/wBdDXNw6n9juvsEEEfl/wDLGtD+3heXX2Hz5fMioA4fTbP/AJhU8/8Apks37mKsvxJ4P+2S3E+lQReXL/x+RV2n9m+TLJfWP+slrQ0fwTqs0VwP3X/XH/nrWZp7RnD+FdB1WztY576fy7eL/UxS/wDPKuw03wrY+VJqo8yWOX/pt/qquTabY/b7P9/J+6m/1P8AzyrQhi8iWOcfvf3Mv+uqfZj9ozLm17yfMsZ7jy7eL/l7/wCev7qvF5vCv+s8/wDdyed9ph8mvXNe03zrqTyP9ZLDXFzaONMi+w/8vHnUezNfamf504i+wwQRW15df6mL/nrXL/Gz4Y+MbPwlH8RvDnhyL/RfKj1Ku0/s2e81qOef/ll/y2r6E/ZXHgD4nXUnwd8Y30UWoX8P+h+b/wAtYqok/Pv9mn9qL+zfDkfhXxHYy/vf+Wv/ADyr7U/Zv+KmladHpf2795Zyzf8AH3NXzP8At7fsH+JPgxrOoX2h6HJ5kX7zR7uGH97FWX+wf8VL7xtfyfCq+1WWWTS/3k32v/nrWgH6AftgeD/DnxU+H1xrkHl3uj/Y7r7ZD/01r4//AGRNevvCvmeFdVg+zXFreS20P/fqvojwf4k1WHQpPDhnl/s+/m/0OH/llFXgfgOGCH4ya5fX8HlRxTRSWf8A11rMDU03Utd8SePPEnhyfVbb+y7WaKS886tzTdN+2XVx+4l8yKaLyZv+mVcX8JbyeH41eMNcvh5nmwy/2lD/AM9f3sVd5Z3s8MXkf6zzf9d/06y0Abnhuz+xySTwfvY60Ib3ybX7f5/7yWq+gnztGksLGCT+1Iv3ln9ko039nX9oT4qWv/CR6HP/AMI/pcX+uu5v+WsX/LWgDpNA8VQabYR+HIP3tv8AbJZIf+uvlVYs7z+zZZL6GeT7RL/zyrj9B0efwfr3/CHa5PLJef8ALGX/AKZVc+2QXkPkaV/q/wB75Pnf89a0Iqblzw34C8Y/GDxv/wASqx/1X/H5LNeS1oeMPhX4j0fS5J77wdLLb2H/AC18mvVP2dPjx4H+FfhyPSr+xiudQlh/0yL/ANG19AaP8ctD+IVhb6H/AGVZR+b/AKn/AK5f582gyPzb1L4J/Gj4zf8AEq8D/wDEp0f/AFk0s37r/wBFVj2Xw38K+CbCz0PQ77zZLD95eTSw/wCtr9KPjZZ+FfBPw0s/Dnwy0qKLWNUvP30sP/PL97Xw3+0v4P1zQfs/hTwBodzfXF1D/wATKbyfNi+y/wDXX/ll/wAtazNaVT2px8XjyDWLSOxsr3yo/J/13/PKuT+OWvT+D/BsnhXSvNudU8R/8fnlf8tYqk02zg8K3VxBfQ+VqFr/AMef/LTyovK/e/vf+/tH7Ovhu++Nvx9uPHGq+ZLo+g+V9j/660Lc6KlM+jP2YvhLP8Jfgtpehz+V9ouv3l5N/wBPVdxrGv8Ak2v/AKOqx+//AHmBFbf6H/qYapw+RNfyQX08vl11rY86psYc00+PIm/1cv8AqaIYYPK8itS8s/tn7ifyvM/57UQ6b+9/fweZ5X/LWmc4Q6bx+4g8uP8A5bS1T8a+G/8AhK9Gk0qxn/d0Qw/bJZIIJ5a2IYYPsHkeRH5f/LatAK8Nn/ZsUcEHl/Z7Wz8ubyar3ln52ofZ4D+78mtSD+w5rWOCCfzY4v8AllUepQwTXXnwfu7egCno/wC+hjg8/wAqT/Wf9+q+D/8AgsND5Os6P4rvrHy/t/lR+bF/n/plX3R5M/8AakkEHmRR/wCfNr5X/wCCzHhXStS+Evh++sPKtv8AiZRfY5pf+evlS0Lc6Kex8/8A7IusQQxWelT2P+j/ANsRf2bNX2J+3V4wn0eXw/Yzz+ZHf6bFbal/1y82Wvk/9gmY6P8AECPVdc0r7Todh5UmpeV/y9XX+fNr6Y/4KEeNtK8YaX4b8SeFdKkj/c/vof8AnlXTS/jIWJ/hHefslQ/8Wk8ic+bHFefuf33/ACy/e19afFrw543+JHw08F+N9K0S9ubP+zYrK8s7SGL/AEWX91/6N/8AaVfG/wCxzqUGsfCWPQ/I/eWHmyf+Ra+lNB/aV+MWg2EelaV4/ubHT9Lhi+xxRTf8sq+xX8E+Xq/xTPm+EnxNs7r7d/wh2ryeV+7+yfY4o6wwRpvmaVPB5V5a3ksd5FL/AMspfNr0zR/2hP2mvFN19h8K+KtW1K8lh/1Vp5sn/TX/ANFV53r17fXmvXl9rn2mO8lvJZLz7X/rfN/5a0Yfcy9kfVmpzQeV/wA8qw7z7PCK1LyHtWPqX/Tx+teKdxz+vXmYpIIIIq+e/wBvC80rTfgZ4kN9BH9n8ny7OX/prXvmvfuZZIJ5/Lkr5T/4KcfbrP4GRz2Pm/2P53760/56/va5apthv4x8j/sH2c+sS6ppWleX5cvmx+d/21r3z4talqum+Erix0n/AFkUMscP/TWWvB/2FdBvvEkuqeFfDl99mk1SaWSGX/nl+9r6A+Kn7n4fXl8Z4/tktn5dn/11i/5a15NU9mex6Z+xzqUGpfsl2c99BF5dreSxzf8APWKXza1JtYghlj8+f95/q/3P+qri/wBnvR/Ec37N2nz6VP5Ul1eS/bIv+etXLOzvoZZNKvvN8y1m/wBdWZB5/wD8FPoYNN/Zys9Knn8rzdSi87/v7FUfhXxj4c8SfDTw/oc99FJJYWcXkw+d5XlV6J+0t8E5/wBpz4GSeFYL62iuPO/cyzV8z/8ADt79oXTbCOf/AIW3L5n+q8qKaX91FQdFKke6f8LCvrywk0uDxVLHHFN/y6XlV7TUrGa1kgsb62to5ZvMvP3372WvK9B/YD/aF1KK30mf4t/YfK/1376X97R/wwH8d7O6uIPDnxp8399/y2mloOn2R7p4O8ba54P8yx0Pxze22ny/6mKa8/dRVHefH7XJvFtvfeMdcub3T4pvL1iaavF7P9kv9oXR5Y9Kvvib9pki/wBT++l8qqc37NP7V/hXVPtt9rsd9Z/6yaGX/VS0GXsz6E8NeFbHwT8Wo4PDnl/2PrM3/f2Xyq7jx5582syaVcfvJLD9150P/LKvH/gDZ/GK88UW998TYI47Owhl8nyf+etekal/rZL6ee5kkuv3k1ZhUIz5HlSQfbvKk/8ARtSeTP8Au/I/5Zf89qrzWcFnLb/8tPN/5bTVsTeRnyJ/3sn/AEyoOcp2d5/p8k/kf9tquTabBDLHcQfvfN/5ZRVXhhgs4vI8+L7PFNWxZ/YR/wAeM/lyRVmB6x4D1jSopbfSp4Ps3lQ+Z/11ruIbyxmjvLeCDyv/AGlXhcPjbVdHlk+w2X2m3tfKuf33+t82uoHxg0q8ik1WDzftF1/pN5/zy/e0Gh3F5qUEVhH/AMtI/wDltLDR/b1jDFHfz31tFJ/zyrxPxt+05/ZkVxAbGLy7X/XQ2lcXpvxU+I3xIv5NK8D+HLmWSX95DNWNSoB9OTa9pQikgF9F/rq1NB/sqaWOfSp/tP8A22r4713Qf2r/AAro3/CR+I9Kvr63lm8v/RKz/hX+2lpXg/xvb+FfEd9fRSRTfvoZZv8AVS1n7QPZH3xD5E0uZ4P3csP+p/55V0Gm+PJ/CsX2Kx/5Zfu5vJ/1UVeX+Cfi1pfjDSv7V0qfzJIrP/VS14v8eP2ooPDWvXHhyfVZdNjlm8yabzv3Utae0M/qp9gaP8d4IvMnvp477/Wx/ZIf9bVjWPjx4c/seT7Dqkem3ER8ubzv+Wtfnf4b/bHvtNu7i+8OatHJ9qhljm/ff9Nap+MP2ivCviq6k8R6rfav/ov7v+yfO/eyy/8APX/W0e1D6qfXnxO+NulebcfuIpZPJ/fRQ181/Ejx54c17/QbG/8AK82bzJpv+eVeZ2fxU8Y3lrcarY337y1/5+4f+WX/ADyrLgvNcvJZL6+gj+z3/wC9/dQ1n7Q6PZ+yNi816+1LWfPx+7i/dQy1Tmmg/tnz7GDy/wBz/rax5dYsbOwkgsZ5PLiqObXp5rWO+vp/Lj/55VsBuTal9j4vp/3n/LGas+z1L979huPK/wCenm1n6brH9sSyQaTD/wAtv+Xv/llR9j/0+Sxn837RLD/2yrn1MzQ1jUf9A+w/639z5lcnDNP9lkggn/eeT5f7qtS9mnhi+w/9Mf8AXVh+d+9/5Z+Z/wBMa6ANCGb+0vL8+CWKSKrH9vf6f5FjBL9oi/10P/TKs+zhnml/cT/63/XedXWeG9H87/iefu/tH+qoA0LPTPJ/0GD975v7zzauabN5378zyxyf8sak+x+VF+4gk+z/APPH/lrUlnpv+snnn/1X7uGgDPm02e81X7dY/u/K/wBd/wBNakvNH/0X9/W5eaPPpvmQeR5Unnfvv+mVY+vTT2f7if8A1lBoY+pabBDoMkEH7q8ih8z99XHzQz6xDJBBB+8tZv30tdprE1jeaX/ZQ837ZLD/AK6us8E/A2+1jS/7c8+2jt7qby6APL5tGnh0bzp4P3f/ACxm/wCetc3Z6nqvhvxbH4q0O++zaha/8g2b/wBpV7R8Zrzw58N/h9cWM8EclxYfu/N/66//AL2vnvTbyfWLWSe+82Xyv3nnf88qDQ+mPip8bPDn7Qnwzkg1yCOPWLCzl+2eVD/6Kr89/wBmPTdV039ozXPt0Edt9l1LzIfJ/wCWtr/01r6U03XoNNsJNcvoPKjlh8yaKL/Wy1wf7K/w987VPGHxcnsf9D1S88uGa7/5ZRfuovK/8hVoB7h4k1ieGW8n0q/8yz+x/abP/nlFXD+D4YNS1m41yex+zeVDLc/vv9V5UX/tWo/id4qsdH0G88OaH5ssdrD/AKmH/W1z+valqtn8EZNdgnufMih/fVmBY/Z70e48SS+KPHFj5kkes6lLHZ/9cvN/5a/9+q9ENn/Y+lxwTz+ZcRf8fn/TWsf4M6brng/4S6HmCKK3v4Zb2byv9bL+9/8AttdRNpviO7uo59C0v7TJdf8AHn5v/LKgCPw3qXiOzupP7Dn/AHn/AEy/+216R/wtrxV/wi9vpWu33l2//PpFXndn4b8VaPFJfeIoJLKT/njaVXh8/WJZLGCeWXypqANDXtY86/k1We+8q4ih/wAxVh2euzzaz+48ry7X/XQ16B8N/hj/AMLO8SSeHLGCKT7V/rv+mVaHx4+GPgD9mPw5eX08H27WL/yv9E/5axUAcno819psVxPpM8X/AExrvPg/8SNWs4vP10SSSWs3+urxvwf4w8Y+KopL6fwrLY6fL+787/nrFW5Z6xPqWl/8Sq+kj/58/KoI9mz6Eh+Ld94q1STSrH/WWv72Hzv+eVaHwB+J3w58YePNQsfGNjFLHLD5dnLd/wDLL/plXzX/AMLg1zwTLHquq31tHbxeVbTXcP8ArZf3VU9S8bQ+G/CWueKtDnufMl0eX+zf+mUvlVoFP9ycf+1/eeFPHn7UGofDn4HzyXMks32aaaH/AJZfuvNl/wDIVe6fs3/DfQ/AehR6VpX7v/VRzf8APWW6r5//AGCfhvP4w0bXPipfX3/Ewl1jy/tf/LX/AFUVfYmg6PBoMUc9jbxeZL/z1/560BVqkc0M8Jk5jk/c+XUcMM/lSX09xL5fk+XVyabyZZIJ/K/e/wDPGqd5qUEMckH7z91+8mhmroOGqR/8IffXmlx+f/rPO/1tSTQz/wDLA/u4v9dWh4b1if8Asb+3P9bH/wA8qrxTW8MskE/+rl/5bUEHP/bJ4LqP7DBWxBNBeRSceVUmpabZQ6XJP/5Fos7OCzsI4Jp/9bD5nnVoAaPpsE11cfuPK8qs/UpvEcPii38+xi/svyf300X+trQ03z4ZZIIP9ZUepalfWcv26D/v1NQBX1jz/tUf2G48qvmv/gqtoMGvfBHT57/zJY7XUopP33/LL/W19GfuIZYxOf3nnf66vn//AIKb3k//AAoz7Fff8tdSi87/AKZVmty6R8t/s06x/ZumSaTBB5Ud1D5n7n/llLX1p+2NptjoPwR0Oxn8qW8uof8AXV8l/s32c+peLf7Kg/d2csPmTf8ATWvoT9tjUv7Sl0OxgvpLaO102W5h83/trXbS/jI0xP8ACOo/YPmvofC95OZ/Lj8n/ltXvEMEE0sdjBP5UlreRed5v/LWKvD/ANiHUrfWPhzcaVfWMf8Az0hm87yvNr7wn8SfDn9m/wAEeH9K/wCFS6Tr+oa9o8V7eXet/wCk/Zf+/sVfY+0/cHy9X+KeV/CX4weKvhLqlxrmh+X5l1D5c3mw+b/y1rH8SaxfeJNevNd1X95eXV5LJefufK/1steuH9rPQrKW3H/DOfhLzP8AWTf8S21i/wDaVeR6xrEGva9qHiP7DHbSX+pXUnlWl5+6i/e/6ry6KVRkH1ReXlc/qUx+1R1qazeQQxefB/35rm7y8879/XgnoGP4qvIJpfPgn8qT/nrXzn+3tZ+HPGH7N2uX08EvmWEP+hzf8sq988Sf6n7d58cUf/TavnP9ti8ni/Zu1ix8/wDd+d/yx/5Zf6r/AJ61jVNqX8c+M/2Gpp7ywvJ5/MubiXUv3Plf8svKr6U+OVnff8Ibpeh+HP3kmvQ/ZtNtP+eV1/yy/wDRtfM/7AeveTrPiSxvrERx2s3mWfm/63/W/wCtr7U0HQdD8VaLqmuX/m/8SGGWSzm/56/58qvJqnqz2Ok/Zvs/+Eb/AGabOx1X939gvJY9Y/66/wCfKqTXoftljHfQQfvPO/7+1X/Z7vL68+AVxqt9+9j/ALSl/czVcmvP+X6xg8yO1m/fQ1nU2IJJpv7NH2Gx8yXzYf8AU/8APWq802q6PYW88/2nTbiX/XQyw1uab4w+HPw3+Jfhu++KnlRafqmpRR+dL5v+i+bL/wBMq+z/APhSn7PXjA/8JHALK582z/cnzv8AW/8ATWsxe19kfBmsTfY4vI8j7NcXX/Lb/nlUn2PxHqVrHb/2XJfRxfu/9Ehr74/4UF+zZ5Uk8+n6bLHF/wA9bzpRZ+Fv2WNB/fwDTYo4ovM/4/Ja6DP61WPh/R/CvjGG1/4pzQ7m2k/54yw1Ys/hv8Tdel/f/Di9ubj/AJ7eTLX2hd/G39lDwTaeff8AiPTYo/8Arzlk/wDaVc/rH7dPwP0iW4t/Cuhy30dr/rpoYYvKp+ypC9rXPi/4haP8W/hjL5/iPwrc/Y5f9d+5l/dVHZ6l/aWl/uNJ8qOX/lrX2B4j+OXw5/aK8B6xof8AZdtHiHzP9T+9ir4/vP7V0eW50qeCWKOKaWOGb91+9irmNadSsRzfZ7O1jsbj/llVc6lbwy+f5HlSVGIftkUn/LLyv9dFWfP/AMf/AJ8H72P/AJYxUGpsWcP2y/8AIgvovtkv7uHzofM8qvmP9pH9qP7H+0FH4Og/0mz8L/6NeeVDL/rf8yxV9GabeQWd159x+8k8799DXwX+1po994D/AG4ry41W+/eaz/pP2SH/AFX+q/8AtVctQ6Ke59OWfxg1XXtBj1zQ/Nk+yw+ZNL9srY0D4nX+paXb65far5vm/wCkwxTfvfK/6ZV87+D/AIqT+G7X+3LGCKWz8799aS/8taueJP2utD0e1uIJ9Kiikuv3lnp0MNYj9mz9AP2b/iF+z1qVrb65440OT+3Ipv33m/vf3VfUHw++PHwcvf8AR9L+I1jpMd1/qYf7SitvK/7+1+Jfhv8Ab2sfDcUeua55f9jyzeX+5h/e16ZoP7SHgf4qX9vqvgDXLmP7V+8/ezUGXsj9d7z9qDwNo2qR6XqniPTfs90Yo7PzbzzP+WtfEn/Bar4JfDnxJ8B5P2qPhXPHbeINGvIvO+yf8vVcXpvxm+Fd5YST+ONWuZdUi/1OnQ/89aj8YfH7wp8QvhVqnwr8R30kmly2cv2Pzof9VLQaezsed/sN/tUf8LO+F9vY6rqsf2y1hikm8mb/AFstdB+0hZwePPCXkQf6NJYfvLOb/nrX5/8A7KPxC1T4S/H3xB4Asf8Aj3sNS+02f/T1+9lr740eax8baB5/nyW0lh/x+Q/89a6DQ+f/AO3p7OXyNVn/AOJhFNXpGmeJLGGwt559VjiuK5P9oT4e/wBm3X9uaHBJ5cv+plrm9Hhg02WT7d5sf+qj/wCuv/TWuWqB6Zo/iTzr/wD4SPXP+QhFNLHD5X+q8ryqP7SnvZf+Q55sn+sri4Z7e8tZILD/AFkv/LWtTQYfJi8i4nk/dQ/66pA7D7ZOYv3FWNN8j/lvP/pEX/LGsPR7zzv9f+9j/wCe0P8ArauQ6lBNLGYIJYrj/p7/AOWv/fqtqQHWQ+RNYxm+n/eS/wDPKq+pQz6bL9uggqOHz4YvI/1UlU/O1Wa//f8A72P/AJbedWxmSXkM95a9f3ktFno/m/uPI/7bVuabDBNdR8+bVyyhgvPMgsf9XF/rvNoMzLs7OCGX7P5P7utzw3B50v2GjUrPydG+3WMEX/XGrGg/uYo9cng/1v7vyf8AprQBueTPZxVTgu7GaWTStV/d2d1D5c3/AF182tSHUrH7L+/rLm+w6lLJPB5v2j/ljQZm5qWg65ZaNHpV9YSyR2E0scMs3/LWKuTvJoNN8zyJ/wDSJf8AntXWeKvG3irxVo1vYz3EXl2sP779z5Vc/NDb3lrbieCWg0M/TtBnvLX9xB5Vx53+umr2jxV+0h8K/hX8L/8AhDoL62udQ8ny/wDXf6qWvF/FWsT6Do3n+f5Unnfuf+mVWP2df2Lf+GzL+48jxVFZeVD5n+ulq6QHjfxI+J198Ztes/CsE8ksdreeZefZIfN82us0HQtcmurewsYNSiuLX/U2n/PWv0b/AGaf+CZH7M37N8f9t+I7a3vtQlH7k3d5L+6r2ib4e/szeHJf7cuND0C1kk/eed/zzroVOgc/1yiflR42+A/iOHwbearqulSWOoapD5cMMv8Ayyrj5tSuPBPgOPw5fWMUf/LOaH/prX0J+3t+1p8Hte1n/hHPhz+9t7WbzIZrSH91LL/21r5L/t7xF8ePG/8AZWh6Hcy2el/vNSu5poov3Vc1U7aVX2tEw/Emjwalqml/YdV+0yRTeZqUNbmvTQfGz4qaX4O0qx+w6Ppdn5mpWkP/AG1qx8YNS8AeA7D7DpX7u4lh/fXcv/LWWqf7NOj6rpo1DxVfwf8AE01SbzP+uVSaUj0y8m+xxR6VY/8AIP8A9XDD/wA8qp6Pr2q6PNJPY/6DJF/qZpasTQC88zz5/Kk/5beTUdnps8Mv26eDyv8ArtQafuSTXtS8R+MIo77xVqv2799/yyrPmvINBlkvoJ/3nneXDVz99NF5EEEfl/6yo4YdK839/wCZLQc3tGaGg69BDdSaTqs8tzJLD/rYa7z4J+Kvgt8Pb+TxH4x+zX15YfvIYpf3Xm14vNrGqzSyeR/2xqxZ6b/p9vrt9D9pt4v9dQaH0Z4817/hpC6jt7G/stJ0uWaKSGKK883yq8rvPg/4cs9ek8OeDtVluY4of3M0P/PWsfTdZn07Xo57G+l+x/vZJoYq7jwf42sfBM327w5pUUsnk+ZD53/LKtAKej/sx65Df/2r440qWXS5Yf8AVTf89a8f/bGhstH+C1x4V0r/AFd1/oUP/PWKWvqCz+PGufGD/ilb6x+w28sP/IQir5D/AGxtSgvNa8N+Ff8AVXms6x9m/s//AJ5fvYv3v/kWg5z6Q/Zj8B2PgL4BeH/P/dXEsP760/56/vf9bXsENn9ssLe+g/1kX/LKub8B6PPD4S8P6HfQf8etnXUaxZ/Y7X/Qf3Un/PWt6exnU2Me8s4LOWOD/nl/y1rD1LUv+JhJ5E/7v/ltWpqQnhl8i+n8urH9jQfYPP8AsP8A22pmZl6PNPZy+R9h/wBH/wCe1STfvpfInqxDBB9lkt4B+7qvqf766jngn/1VBmRzaP8A6LJPPP8A9sap+d/ZtrHBfT+b9q/8hVJPefbJY6jh0yxvLuSC+/1cvtWgGh4b8+80aSxvpv8Aj1m/cy/89Yqp6x5E11+4/wBXUc0P2O68jSp/K8qGq814J5aANSznn/eQQT/vK+e/+CkHhu+1j4QWc99B5kfnRfbK940y8/0/9x5fmV87/wDBT74hf2b4Ds/Ct9PLbf2pNF++irMvDHz3+z3NfWfjLT/A+lQfu7ryvOu/+eVeyftjalpUPinw34VnP+qs5f3v/f2vO/gPo0F5qlvrmh2HmyS+V501bn7XV5PD8c9PghMVzbxeG/L8r/v7WlH+OaYn+Eeo/sNw30Ol6xfT28nmf9Mf+eVffcN58AfGHwv8J6H8QPjFc22qaNZ+ZeQ/9dfK/df+Qq+P/wDgnvefCuH4S6x/wnHmfaPsf/Etm/e/63zf+mVfSHw98S/sd3nhzT/+Ejsdfl1CWzikvIfJ/wBVL/y1r7Gl/APl6v8AFOk/4VL+yvZ6XJY/8L3ubbzbzzJpv3VeV+JLzSv+Ej1Cx0rVZb3T7DUpY9Nu/wDnrF5temXk37E0N1+/0nxJHH/z1l/56/8Af2vJ9em0O7168Phzyv7P+2S/Y/8AW+b5Xm/8ta7sMQfUF5psJ/fwf6yub16HyYv+utdJNqX7niCuf1i9gvP9fXgHoHF+JIf9EuLGf91bxQ/89vKrx/8AaW8KweKvg/rHhzVf3sd/D5l5/wAvPlRV7Rr15BeReffQfu68f+LU08PgjVL6+n8rzYZf7Shh/wCWUVctU1w38U/OP9lG8n8H/tQa5oYgjlt5YfsUMP8Aqv8Anl/yy/7ZV+hng/TZ/wCwo4IJ/Lt7CbzP+mUsUv8Az1/79V+dfwx1L/hG/wBrT7dpUHmxy3kvkwy/62v0E8B6xBrHheSx0q+8u4+x/wDEyhl/5ZV5tTc9apsan7Ot5BZ/CXxJpU/+k3Fhr37m0/6ZS+V/8dqxN5H2/wAief7Db/8ATWrn7PWg2M3iPxZPcQSfaPJ8uHyv+Wv7qKsO802fR4pIPtH2mPzv+WtcVSpqQef/APBQLUf7S/Zkk8VT6rc20ml3nmf6JN/rYv3VU/Af7SHxG1L4VeF4P7cl8u60fy/tcs3myxRebW5+1d4J1Xxt+y94osdKsfM1D+zZfJtK+H/hX/w01r3he38K+DvAGpeZYQ+X500P/TWtTop06J9qal48+KmpS/6P44ufL/5fIfOrH1jWNcs/3+q+OJNN+y/vPKhm/wBbXi+g/sZ/tX+Nv9O8VeI/7It7qzi+2eTNF+6lrc1j/gmz4qvLu3vvH/xNl+2f8vlp/wAtaKmxr7KiegQ/GDSpvMn1zx/cy28v7v7J/bH7qKpIf2ivgDN9o0qDx/LFeS/66G7vPMirl9B/4Jm/CSGWS+vvH+v+XFD/AKr7ZF5Uv/kKvTPhL/wS1+CvxU8Rx+DtK8z7R50v76ab97WVIX7k1P2df2otK8N/EyPSrHxHHc2csPl/ZPtnlRS/9sq9Y+JE2hza1/asEFtF5v7z/U+V5VJL/wAELfCnhD/ia+DvGOry3lr/AKTZ/wCmReXFL/zy/wBVXMaxpviPw3r2oeDvEdjY22oWsMUd550Mv/LKtTmqVTL1jz5pfPg/1n/LaqcP766knnHlSRf6mGGtD9xZ2scHkSRyf8sZpv8AVS1n/wCkWeqyX8//AC1oII4ZvJ/4nk8HmXEX7qaH/llXi/7UXwB0r4zWuoeI/Cs/l+ILX95Z3cMPmS+V/wA8v/Rte0XsP2O1/cf8fH/PL/plWfqcPk3Uc/8AqpIv3cP2T/lrWPsjo9ofnPpvjDxV4J+0aH4x8KyXNxazf62aq/hv4y/CSHxJJrnj/wAK/bZLr/U+bD/qv+uVfoxZ+G/hl4qtf7K8VeFY7mP97502o/63/wAhV53rH7Df7L3ir9/qvw5sZI/+WM0MMvmxVz+zNfaM+b9Hh/ZC+M0Uml2/hW202SWH9zaeTF+6/wCmvlV4348+Et98DfFGfhl44+06XFN+5tPJ8r/2rXvH7SH/AATl8K+CbW48cfAj7bbXEUPmTedNFXj/AID8Vf8ACbeEpPCvj+xij1Swm8vWJYv9bFR7M09qegaD+0t9j0aS+137NpF5FD+587/W+VXQfB/x54q+M2qefodjJ9jl82OaaX/lr/1yri/h78MfA+pX9vcarYyXN5FN/pn2v/lra/8APL/0bX2R8GfEngfwrYW8Fj4c02K3ih/0P/plFR7MftT82/i1puufA39rST+1b6Xy7qby/O/7a/8ALKvvj9mPx5B4q/4kc9/F9osP9T/09RVh/wDBTn9mnwB8Zvgtp/xU8DaVFc6xo00vkw2kMv72L/MVeF/si/ELVZtUs/Psf9Mih8vUvK/5ZVpU2JPrj4haPf6la3GhQQf6PdTeXDNND+6i/wCWtebzeFZ9Hl+w6pBLLJ53lwwzQ/8ALKu88B/FTw5Z69b+DvGP2mTT7rzf3v8Azylrc1LR/wC0pbe+/dXNx+9jvZv+eVc3s/ageXzeG9KhmjvrGDy/N/5ZRVJ9jns5fI/56/8ALGus177DoN1JPY/vPNh8uGub1KaDUopIIP3ckX/LWn7MDL02GCaW4gngji8r/ljL/qpa2LPxJY2el+Rqvg22sv8AnjNp0P2aKsO8m/exmeDzZK6Dw3psGpfuLifzbiL/AFMU1bAdBo95BPLHOf8AV+T+58qo5ofOtIwf+Ws376pLPR54Yv30HlyS/wDPKtSbTZ9Hi/f+X+6/57UGZoWcP72zsdKn8uOX/nlWp/y6yTz2/wBp82HzJv8AllWf4bh0q80KO+ngktrz7Z+5/wDItXNYs/7NtbifyLmW4i/efuf9VQZho95Dr1r/AMI5YwebcS/6nyv+WVRww/2DFJoc8/mxxTfvvO/561n/AA916+s/Edx4x/0aOS6h+zQ+T/zyroNS02C8ikuP9ZH/AOipaAI7OKCaX9x+7rQ87/RY/wB/+8irn5priG18+x/5ZVqaDeT+VGIPK+0XX/Lab/llQZmhD4V1zxVayT6HpUssf/LaapNB+Hvj+GKSCeeW98r/AJdK9I8E3mk/YI4LLzYpPJ/feT/qpZa7izvIJtLjHkR21xF1mhrQD5f8beA9VvNLvP7cg+zSXX7uaH/nlXF/Djxf8aPgFdf238OvFV7ptxFDL+5tLyWPzfKr6w+Lfhux17wl/asEH2m486vM/hL8QvhX4b8WyWPj/wCzeZa/vIYZaDQ5vWPi1+2l8ZrW41vXPtstvLNF/wAffm/uvKo03WPGOvaD9h1zXLmyuPO8uaL7ZLFXcfHj9pzxH8VNZ/4QfwBpUWk+H5Zv+JldxQ/6r91/+6rk9N0e+htY4Z/Mkj/1dnNd/wDLWgVkeZ6P+yL4j+JGvSTwT/ZtPtZv3P2v97LLXQfFSy8D/s9+DbfwP4b/ALNtpP8AWald/Y4vNuq6zxv8ftD+Hvw0t9Dg1yOO8ih/ff8AXWvleGbx/wDH74g3F9PYyXOn+d/x9/8ALKszpLEPg+++LXiOOeefzNHim8yGK0/dRV7BZaOLP/QbDzYo4of3NXPB/wAMNK8H6X/YelX/AJtvF/yDfJ/5a11kOj2M9rb/AGGD93F+8/7ZUEVNzn9HsoPssfkQf6RL/wAtq0JtB/dSX04+3SRQ+Z5MVWIfPs9U+3QeX5fnf8ta0IZYIdGj8+CWK88mWSgyOHs4YNYkkvrGD7NHL/qfJovNN1X7L9hn/dSRf8tfJ/1tdhpujwQ6X5H7uKP/AFnm1T1nTfttr5FjPLLQBw+m/YfOk8+x/wC/1STaPBD+/gnlkjl/5Y/8sq0NS0eCab9xVcabfXlr+4n8vyv+WUVTTNKe5z+m6xfQ69J5Fj/yx8uaKuks/P1KWPyPNj/c/wDHpVe98NzzaN5+lQSxyRfvZpZq0NBs/J0v7dfTyy+b/wAtoa2AualrH/Cq9G/tyef/AEeWH99FF/yyr530HUtc/av/AGvtH1Wewkit4rzzJpv+eXlS165+0h4kns/gbrHhyAx/Z5fKks7v/lrVf/gmb8MYIdB1D4mz28sUnkyxwzS/9cq39mjnPsDQf+JxLHffuv3X+jTQxf8Ao2tjUoYJovsP+srl/BN5PDrMfn+V5f8Ay2rY1K88m6uPIg8qOX/UzUzL2pT1Kzg/eTzQeZ5VR6ZN50X+v/dyw/6mrF5N58sk/wDyzlrPhhMMvkTj93QQV7yz8mw/cfu/33/LGsuaGCG1zB/rK1Lyb/ReB/qv9TWXNN9j/wCP6D/W0AR+TD9gkn86KL/rrR+/Fr58E3lfuaz/ABJ4V/tjS/Pgn8utyzgsf7Bs7ef/AFnk1oBhww30EUd9qsEknm/8tauTab5PPkfu/wDljNW5Npv9pWsdj5/mRxf8sar6lD5Nr/YZ/wCPf/WebQBj2Zg+3xwT2PmyV8j/APBW6aeb+w4PP8qP919i86vsjwfDfalqkdjPB5nmzf8Afqvjf/gplZz+JPjJ4b0OefzLO1h/+O1mdGGpGf8Asc6PfXmqafffbo/Llhitpov+mVZf7Wn2fTf2lrjRIIJYre1037ND/wBNYv3v/wAdr0T9kXQYNH8USWU8Pm28Vn5c00X/ACylr5z/AGi/GF9r37WkmlTzy/6BeSxwzf8ATLyq0o/xzSrT/cn2B+xbZ/8AFufsN9P5UcU3+hzf6qXza+3NN/4Vl+zr4O0fVfGPw5i8W+JPEcMVzNDq03mxWsX/AG1il/56y18f/AHyP+FaaX5FvFcxxeVHDX15oX/Cpf2j/h9oeieI/HGnaB4k8L2f9nTahd+bFFfxfuv/AI1X2tL+AfJVf4xqeFfjB8K/jnf2/gjXPg7puiXF1NLHZ6tpMMXmxfuv+uUVeN+PNBn8H+LdQ8HTzyf8Su8lj/137r/v1/yyr2Dwr8GfhJ8B7+Pxl43+NOm63JF5smmw6TN5nlS+V+6rxvx54p/4TbxneeI54fLuL+aW5m/7a1rSIPpCaHyYsVzesTeePI8iuk1K986L/UVy+pQz9a8U9A4vxhDPD/1zrzfxtZ/2xo2qQXx/4/7OWOvVPEg861/f1534w+w+VqE88/8ArbPyrOGsaprSqfvj8q/Ek2q+A/2m4/7K/eXkWpS+T/1yr9DPhXBY3nw+/wCEjsf9ZqkMX73/AKa1+d/xs8/w38X7zxjP+7+wa9LHNd/88q+9P2Y/HlveeApLGC3/ANH+xxf6JN/yyryam56//Lk9w/Z702fTfirJpV8JJY5dH82GGL/lrXP+PLyDR/E+oC+g83T/ALZ5cPlV2HwxEE3ijR/H+Ps1xF/xLtNu/wDll5X/AC1/9Gy1h/HPR4NB8eXmhwQeXHLeSyeT/wA8q4qlMzOb0HxV59/JYz2P2mPzv+W3/PKq+mzWNnc3Gq6HYxWX/TKKGiz0HEv2+ef9553+urQhm+2X8dj5Hmx/6utQM/xJqV95v+kTy/6VDFc0Xn27WL+O+vp/9b+882tDWLOeGWPyf9X/AMtv3P8AqqpzQzzarJ9hg/d+d5lBpT2K/k6rNf8AkeTLL5X+phtP9bLXnf7V3jz4m/s0/wBj/GnwB4qubH7Bef8AE+iim/5df3X+t/8AIteuTaP/AGxFJB9njuY/J/1Xnf62ub+PHg//AIWp+zx4k8KzwRyR3VnL9j/c+bLL+6/1X/TKsqhp7M9o/Zd/b2+JvjyLT9c13xHbX1vdQ+ZD9k/1X/oqug/bA0fSvFN/b/FSCx/eX9nFJeQ/9sq/Pv8A4Jv+PJ9S+Et58OfEeuW32zRtYlj8m71L/SpYq/RCfz/G3wc0+xgglk+wWcUfk/8APWLyq0Wxn7NHgcIgvIvInv8A7TbxfvLOKsPUYZ5vEccEH/HndQ/9+quD7DDfx6XYz/u4v3v/AFy/6ZVHqV551p59j+7j/wCm3/LKmZkn2yD/AJ4/6r93Ud5o3nRR31EMME11GIP3sf8Az1rYhhg8r/X/ALuszQ5O8s/7Nure+ng/dy/u6uXnn+b9hgn8uT/V1sXlnBeah+//AOPeL/Uw1X1LTLjHkT1zgc3rFlBeWv2HVdKkufK/d/66vzv+Nvgmf4P/ALS2qH93Hp91NLJqUNfpRrFnBo9hHP58vlxf66avhv8A4KTeG/sfxB0PxHY/6vVJv300v/L1QdNPc5fSJvJtZL6eeSS4lm/c/wDXKvYPAepfbNB+3WM8vlxQ/wCqr5703xJP5Ud9feZHcRf89of9bXtnwl1LyYo55/3UcsP76Gr9kWd58MfjOP7Zk+GPiOf/AEf/AJ415n8SPhXP+zp8W7fxjodj5XhvxHDFJNND/wAusvm//uq4/wDais9V8B6zo/xN8OarFHb3U3+uhmr6A+A/jzQ/jx4D1D4ZeP8A/TpLqH/Q7vzvN/6a0qlMCPQZtD1i1j1XH2m4l/55V6RBqUGm6NHYef5V5L/rq8T+GNnfeCfihqngbXP3n2Cby7OL/nlFXunhX/iZWHn33lyXEv7zzpf+eVZ0zMw/Eln50cd95EUnlVz/APZv72Sxng8qS6/ew16heabBZxefff6v/nlXB6lZ2N5dSTwX/wDqpv3M3/PKqAz9Y8N+dpVvrkHleZ/y2ho8K2c/m2+uf8s5ZpYq0JtH1X955H7qOX/yLXQaPo9vZ6Nbwf62Pzv+WVAEkPkQ2H9q30H/AC2/c1qaxZz3sUd958Uv/THyajhs7Gz/AH88/wC7i/57VHo95PqR/tafzfL879z+5/1tT7QCT/l6t4LH91W5eax5NhcQX37qO/8A3dZ95B50X7+eqZh/0XyD5svm/wDHnDVGZJo1npVna/YoLePy4v3nneTVjyZ8+ffT/u/+mVU4fPhl+w33/PH/AFValnefY7COCeD/AJbUAF5Z2/lef+6jt/8AnjUemw/vY/8AnnVe8h86L7R/ra2NN8iaKO+/1nlf67/plQZneeCdSENrJBPP5Xlf6muku/FUF5YRzwfu7ivP9NhN5/r/APV/89qk17Xv3X2GCfzZIv8AU+TWgHaTeKoJov8AhHL7/Ro/9ZeXdfJfx4ng0fx5J4x+3RRfvvLs4pof+WVeyTXs955ljfebJH/rPJ87/W1w/wAZvhv4c+M1tH4c8R30UccsMsf2vyaDSkcPo/xm0Pw3F5Gq6rFbWcX7yb99/rZaw/iR/wAFAvhX4btbix/4SrzbiKb/AEOKH/nrXmfjD/gkjqviXXvt0Hxbli8r/Uxf5lrrPhv/AME5dD+Fd/b33jif+1vK/eWfnQ/62X/nrWZp+5I/h74C8cftFH/hKvH8/wBmt/8AWfZPO/1stfQngnQdK8B+Ev7L0PSo7aS6/dzS/wDPKiGz/dfYYNKlik8n/wAi1oQabPNFH9vEsn/PatDP2pHo+j32gxf2HPPFc3lr/qbv/llW5eQwWdhH5A8u3/5bVXs9HgntY7Gef/R4v9d5NGpeR9l/sOCf/W/vKn2Qe1I5oIJrWPzz/wBcaJrz7H/x8XHmR1Th1Kf/AFHkSfuv3dH2ODzYxBP5fm/66KWpD2pch1KxntY7LyJY6j+2Qf2p5EH72P8A9FUTabBZxef5/wD1xmqv9jnvJfInn8v/AK5Q1oATWcE3+gzzxRx1Xms4IfMnsTWxNZ+dLHB+6rPvNHvoLC48j95J/wA8aAKfnz/YJLGeD/j6qPwraQaxayaV5/8Ax6/8sYakhhn/AHfnzy1uaDo88PmT2Pl/uv3k1aGZz/xa/Z7vviR8NNQggvo/LsNN8zyf+2tdh+yX4Ug8K/sq2+lQaVLbSSzSyebL/wBcoq9U+E0NjrHhLUNK8j95f6b5fm/9tasWXg6fQfhfJ4V/5eLW8l8mH/nrFWgqlQx/DUME8fnz/wCs/wBXWxNDP5Wb6fzI6z9Hmn+y/wCgwR/Z6ks7z/WfZ4JfMioMAE2b+40rH+jxf6mo4YftkXn/APTGo7yznml/1/8Aqv8AyLWpp0PkxeRcT/8ALH9zQBl/uIYo/wDVfuqpzTWRl+wzweZJ/wA9qualCfK/f/8AfmsOGaea1k/f0GZchm+2Sx2UHl/9Nqj+xz2ctwJz/wBcajhhmhi+z/8ALOrE008Pl2Mw/d1oAQz/ALqOfHlVJrE3k6X9u+z+ZHLNRDZ+dL5EH+riq55P2yL7DBB5n/TKszQj+HpsbPXpDPBJLH5P7mavhv8AacvJvG37UtxpN9P+80b/AFMX/PX91/8Aba+4NNhgs4rzjzY4ofM/65V8N6PNB4q/aM1zxjB+9/0z7N50tB2Uj1z4G6Db+FbrUJ5/3Ud1pv2n/rlXwn/a9948+Oeoarqt95WsS3kvnTf8svN8qvvDWZoPCnwr8Wa4L6KSO6s5fOlmm/6618H/AATmHiT456fj7NLcf6yb/prL+9rXDU/3xrV/3T2h+uH/AATl+HHg4fBvUPHHxV0qK50vw5oPmTTf6qKK682L/nlXN3k0GpS/brGC2j82GXzoYppZfKlr0z9goQ694T8UfAHVNV+wyeI9H8yGaKby/wDSovKrk9Y+GPxN8H6pJY+OPCuv/bIv+Pya7s5fKl/6a19ov3SPjav8U6j9m/R/B2sfEaPwp4x0OW5s9Us5Y4bv/nldeVLXN+NvDc/g/wAZap4V8/zI9LvPs001emfsx/B/xVN49s/iN4q0q50jw3o3m3M13dw+VF5vlf8A7quD+LWvQeJPif4g1yCfzftWsSyQzRf8tYvNrWkQe+Xkw8qsPWLzybWti803zoo/Pgrm9YM8M3/tGvFPQMPXofOP2f8A5Z15/wCN4dK+32fnf8uvled/39rtNS1fyZf358r0ri/FVn50X9qz1jVD/l8fnH+298N9D0f4meKL6x8z7PfzfbZov+mteyfsT+Ktbs/AdvfarPHcyX+mxSeV/wBMq4v/AIKNWeq6D8UNHnsbHzY9Us//AGlXQfsH/Af403nw0/tzSoYtS0/7HFJZ2kM3721/6ZV5VTc9yn/APtD4PmDxLo1n/wATXzY7XWPtMMP/AGyrQ/aWs/8Ai4P/AAkc8H7u6s4o6k+DPw91XR/C95Y6rB5V5L+8m07/AJ5VoftIeR/whGj6rYwSXMlrN5d5XMc55XD/AMs4J/3f+q8mrH+utf358vyrz/ljUf7jUr+P9/L+9/1MNdZ8N4fB0PxL0fwr44vrayt9Um8vzZqC/amf9jvf3k8EElzH/wAtofJo/wCEP8VXkUc2laTFHH/rPK/6ZV9iaP8AsZ+FbK7kvYNbuYvKm8ub/prFXUab8CPhZ4Plk+3W9tJHF+8/fQ0GftT4j0z4ZfEbxJdf8SrwbL9j/wCe0NeoeCf2Ifibrv2yx16D7Dp91pssV5++/wBV/wBcq9v8a/tH/B74SxR2Ol6XFH5v7uHHleVXjHxC/wCCh2uXlrcWPgfVbaO4i/10uk/6T/6NrMF7Y+D4P2XfiZ+xp8bvEngjW7C5lt7+b7TDdxTWskXlV9kfso+KrHxV4St7H7R+7i/eTf8ATWWvmvx58bPG/wAbPi/J59xFc3F1D5nnajN5cXlV6Z4P1LxH8GRb6rrk9tHZ3XleTDafu/3X/XKg6dTm9S0z+wdUvINV/d+beVTvIR9vkg8j7Tby10niSGx1i6vNcgn82OX95ZxTVzcN5P8AapPP/wBZLQc1Uks/9DEdj/rPKrQ02bzrTE9V9Hm8mWOCcfvIquT2djNa+RP/AMtZqDpp7El5Z+dF5ENZc019N+4/5aRVc+2fY7rz/wDn1/1NZ+pax5N158H+slrnAJvPmi+z15H8Zv2btK+PH9n+FJ5/sNxf3n/Enu4pv9V/1182vRNS1if7f9n/AHvl/wDLbyq8L/bY/aK8R/BPXvC8Gkz/AGbT7/8A5iP/AC182g6ae5uT/wDBvh+019g/tXwd4xtr3ypvtMP+mRVc03/gkj+2Z4Jtft19BbfbP+WMP2yL97/5Fqn4J/4KrftNaP4j0/wPqvjG9it5f3kM32yvoDwr+1R8TfG1rp+q+MfiNLFZ/wCsvJZryWKugR8j/tRf8E6/2y9B+FcnhzxH8MraW3/4+ZpYdSil8r/yLXzf/wAE9vip4jm+I0fgfxjP/ZOoWF5+5hr9sNB8bQQaDJ/ZXji+8SR3X7vzbv8A0nypf+2tfmf+3t+wT4x+GPje3/bE+DtjJZWcX/IetLSH7N+983/W/uv+usVZe1HT3O4+MHgOfR/Ftv4/sf3dxdQ+Xef9Nf8APlV6J4chgh8EaXY28H+kRWcUc01cf8JfG0Hx4+A9nY65B/xNIofM/taGbzfN/wCmUtdRD9us4o5/I/eRTSxw2kNMyqkniqHVfEmgyfYZ/wDW/u4a4fQfCuuaZdW+lX0//Lby7yvSNHs4Ide/fz+XZyw/6HF/01rL1jQZ5bqTyP3d5FN++rMCT7Z50slj9h82O1/1NSWf+hy+R/q46k0GafWLqPSoPM8yWby5q3NS8Kz6Z5mlT+ZLJF/qaAMPWIfOsPP/AOWd1+7qx532PS44IL793F/0xqT+zZ4bXyP+Pnyqr/bIPssk/wDy0/541zmhXm1ifzY/9H82rmm3nnfv4P8AWRf66L/nlWXqU1jDf2//AJGrc03yLy6jgggjkkl/5axVtTMyneTT+d9on/1cv+plrQ02b7JL+4Hmxxf89ar6nZzw3XkTzf6r/ljLRDN51/5F9+7j/wCeNUBofY4IbWS++0fvP+eNWNNmns5ftE/+rl/10VV7zUtDmtbeeC+/eS/u5ooqrzavDZ6pHYQQS/vf+POgzNz/AISrSvssmiTwf6393D/0yqOHUvtcX2/HlR2v7usvUvPhl88fZv3X7y8rDh8Sf6fJP+9+zy/6mKGg0NTWNeFnFH9hn8y4tZv33/XKqd5r195snkf8ef8ArP3NU5r0Wf8AxNfI/wBHl/d1H9jgs5pLGcy/9doqAOk0fUv+XGeC5kuJf+uVaE15P5tv9nsPNs4v9d5v/LKjQbOCzij1WCeK5j8n/VS1Yh8jUpf+eX/TKgzMezvJ/wC1JJ/9ZH537n/rlWh/x5yyT+T5tan9mz2flieCOOOX/XTUDTbGbzPInl8uL/lrXQZlPR4fscsmlf6r/lpWfqX7m6kv/tHm3H/LGrln582qXHnwfu/+etV4dH1Wa18+x/0mTH7mgCnDqXnS+RZQS/8ATb9z/wAtak8mf95YzweZcXVaH9jX2j+X9un8uSWrkOmwTfuL793J/wA9ayqgU/sUFnFJY6r/AKvyf3NV4rOeHS45/t37zzqua9Z30Ol/uD9p8qby6k02Lybr+w4RF9n/ANZ/1yqDT2iI9S02ezuo/wBx5knk1H9j/tKWO+8/95F/rq2JrP7ZF5+ZbmT/AFdH2ODyvIgn8qT/AJ41oBjzWfnf6+fyo4v+WNR6NeeddSfZ7fy44v8AXVc/s2fypJ/+WcVR6OYJrqPyIP3kv+prQD0j4A3l9NrOoaH5HlW91D5umzf88v8AVV6prHhueG1vPI/e/av3cP8A0yrx/wCGN5/wh/xGs9cnn83T/J8u8hm/5619EeJJr6LTLe+nniiuLr93N5X/AJFrQ5zxvUrODTYv38H+k2v/ACxrm9T8SCC6jnnH2aOWug+IU39m+I7iDyJZdPlh/wDIX/72uHvYYJr/AP18ssf/ACxh/wCeVAG5FrEBlj8+f/W10H7ia18iufm8j7LbwTwR3MkX/LaGrmmzfY/MvoJ5f+2tBmWJoYPtXkW/72OL/XVTs7OCz8zSvI/dy/8ALarE2pQRWvn/APLSWs+zm8mLz/8AnrQBcs/7K03/AEH/AFn/ADxrD0eaebWbiC+/1fnVY1j9zLHNB/rIqks7yf7fH5EEfl3U376gDc02z+x+Z5H/AC1rP1g3EMX/ADzuK6CGaDzZIP8AnlDWPrF5cTeXfeRHLJL+7s4v+eUv/PWg0OT8Va8dB8Jax4j/ANVb2tnLF/21lir4v8CTT6Do1x4qn/5etel8n/pr/ra+qP2otYt9B+EFxY2Pm3Ml/N9m/ff89a+a/hvBod59n0Mn7TJLef8AEt/6dZf+Wv8A7VoOykdJ+1d4k1Xwf+zdb6rrl/LbR3UPmXkP7r/nlXyf+xzo+q698adL8f6VpXm28upSx/vv+WUXlV7Z/wAFLPGFjNFofwyvp/Ks7X95qUP/AD1qv/wS68Kwal4D8QX2qwf6Rpc0VzZ/9Mv9VXThf4p0Vf8AkXH2Jo2pX2j3VnPpV9c23lfvIZof9b5tfRHgn9q79pmbQbeDVfBsmv8Amw/vprvQZf8AVV816PN51rHBPP8Au/O/4+/+ete2eDv2tPj94a8OWfhXw54jii0+whit7PyYfM/dV9rUp/uT4t7m58SPjB+0b8TrD/hD9c8N31tpcv7ya007R5Yq8zmhns5ZIL6CS2k/5Ywy17Z8IP2wPjFqXj3T9K8Y+KpLmz1T/Rv+QbFHL5teX/Fqzn0f4oeINK1XVbK5vLXWLrzpYZv3v+trPDVDM90vbye8/wCW9Y+vQz+V+4g8yStjUjBDF+4FY95/y0nnMn7qvNOw5PUrO3mv/I8/95/02rh9S16CzsLyCf8A1dd5rEM/lSTweVXB+KtHgvPMscf9NKyqbGh8x/tjeCbH4neDf39j/plhN5lnL/0yr5n/AGOfjZrnwT/aCt4PCviq503T9UvIvscPnf8APKX/AO219kfHmznvNBkngg/d2v8Arq/P/wCJ32Hwr8ZPC/j/AMKzxf2f/aX76H/nl+9irzap6eGqfuT9rPhX42sfifo1v4xgg8v7V/x+Xf8A01rpPiF4J/4STwZrmlEyxySw/aPNr5b/AGIfHk/2Czg/tzzbe6h/49P+mtfYmj+ReWsdjP8AvJLr/Xf/ABqvNqbBVPk/QZv9Ft7EHzZIofMhl/8ARVeN/wDBROz8R6P+z7ofxU8N/wDHx4c1jzJv+/sv/wAdr2TX7O+8H/FDUPCs80cdvLeeZD/0y/6ZVn/FrwrY/EL4X654H1WD7T5sPmfZKKexpSLnwU/4KKfFT4nfAzw3qtjP5txLpv8Arvtnm+bL5UVc38Sfjx44+IWl/wBq33j+TTbi1m/1Uv7qXyq/P/4Y/HLxx8ErXXPhJBY6le3n2yWPTfJhij+wf63/AD/2yr0jR/g/+0z+0h9o8R+I77+wNLupov8AXTeV5X/tWmdypUT1TxJ8bINB1S4vvGPxNtpY/wDljaed5ssX/XWKuH8Vftp659qj8OeB/AFzq0d1N5f2uWGX91XUaP8A8E5fA9nF/bnxN8f/ANt3kv8Ayx+2SxRSxf8AbKvXPh7+yvYw2v8Abl9BbeG47+b9zDN+98qL/wAi1mL9yfK82sftC/GCWSHwr8Mrmyjuv3fm+TLJXYfCX9m/9pOzm8/XNb+zWcs3l/8APWvqiHTf7H/cWPl/6ny/Nih8r/tr+6qn52q2fmTzzySf8tIaDOpUNS8/fWtvAYP3drD5fnf9Nax+lr/x8eZJ51SedAPL+3X37v8A1vkw0Wd5511J5/leXQc38UkhvPJqS9mxL/r/AN35NZc00H7yCDzP3tSTXnk3XkT1mamhD580Xnz1Xmhgi8z/AJ6RfvKr/wBsfY+YP3skv/LKsvUry+vIZLGD93cS/u5pqzAks/s95dSX1jPLFJLXzn/wVE+DM/xC+Gmn+K7GCS5j0u8/fQ2lfTmg6B9jtbex8jzZP+etR3mgwalbXmlarof2m3/e20P/AE1oNKdU/KP4b/FSfUvs99fX0Uv2D/SfNl/9Ff8AXWvsz4A+MPtnhePVcyfZ7qH/AFXnf9Na+N/2kP2Y/H/7H3xB0+DXLGW58Lyzfuf+msv/AD1r2D9nvxt5Olx2MF95sd/N5kM3/PKuz/lydh+jH7NPiTw5AI9DnnttSjuv+WXnf6qpPDfjDVdY+EvjT4Vzz2VtJfwy/wBm2k37z7VF5X/2qvj/AMB/HKxs/EdxpVjfSW32D/XTRf8ALWtz4e6xrln4tk8Y6H4jubmPzvMs4ppv9VXOc5X+D/irxV4DsNQ0PxHpUum6fLqUsfky/upf9bXsGjeKtK1i6jv7GeP91+8/0SGsPwH48sf7U1C+8f8AhX+0re/m/wCeMVbmnQ/Bb7V9hg8OXNjced5nm+dL/wDHaDMuaxDPeWvkTQeX/wA8Zaz7yGeGW3nt76WXyv8AlrWheCf7LIYJ/wDrjFL/AMtarw+fDayXE8FZgaGj6xBpkUk/k/vLqpDr19/bMnn6r5kfk/uar3l5Yf2XHP8Au45Kw4ZoIbr7dP8A6yg09obE+pGH9/B+7kih/wCW3/LWiGH9958//PHzPOrDm8Rz/avt08HmfZZvNhh/561sQwz6bYRwef5lvf8A+k+d/wA8v+WXlf8AkKucDH8V6b5NrJ/01/1Namg3n9j2tnY2P7qSKqepf8TK68if/Vxf6mtD7H/q/wD0dW1MDsNY+IcENrb/ANuaHZSyf89v+WtZc3iTQ7y//wBO0PzY5f8AU+VNWHr00/mx/bvN8vyf3P8AqqrwzT3kvkf2t/5BiqjM1NY/4RWG1k/sqD7N5v8Ayxl/1tZf/CYQfZbjz77zJIv9TWXr3iqDR5ZPEf2HzfK/dzVj+TPe38k99PF+9/eVjVD2RsXl59sij/5aSS/vKkh+0eV+4/8AINY82vaTDayQfb4/M/1dangnWLE2MljPPWXtTSnuXLyaeGw8ieeKOSX/AJ7UeGvt39qW+lef/wBtpaLyznvLryNK8qWSKH/ltVjwTZwfvNWn8yWSL/XQ100wO40fR4P9fB5cv/LPya3LPTYIf9RB/qv9dVjwroMEOjR/8sriX/lr/wA8q0JtM/0r/Qf+21bGZX/4Rue8i8/yPNjl/wCev/PKqepaP9i/cWNxL5cX/LGukF5Y6PF/p3mf9ca5Pxh4qv5j5/hyeOL/AJ7Qyw1oZmXN+5upPPn/AHef9TRDeeT5c8H7qTyap3kwvLX/AE6D/SP+e0VHk/8APD/V0AammzTzWsn9qweb++qMwwTeZBPP/wBcaj1LUvsdrH5FU7vz7yGOf/lpQZlzzsWvkTz/APXGq9npuLCOCf8A4+IpqjhzN+/n/wCWVbFnqQs7+SfyIvLoA2LPyIbqPQ/Ik8z/AKY1oaj4asZoo/8AVf8AtWsuH7D5Uf7/AP0jzvM86rh1jzopIJ/+Pig0Ofm8/TZbzz/+PeubvLO+1PULOCxvvsUn/Pb/AJ5V1F5NBeS+RPP5kcv+urP1Kz/0qOfyP3kv7vyazA1PB8M9mJNDg/068/1l5dy/6r/tlXuHwx1iDUtLkgn82LzYfL/0ub/VV896brE9lqkkEE/+j/8APGGu4+Ffio2fiOOx1WeXy5Zpa0MvZHoHxas/+JPZ6pBPJ5fnf9sq8jvJp4ZZIPP8rza9s8YTf2x8ObyDz4v9A/eQ14vrGmz/ANlxz/8ALxQZ1SvZXhs/9Og/dVYh16ef/X1z+mzT3lr+/q5DDPD5c/8ArY/+eNdBBued9jtfIM/myVX0fz7OKSCeCTzJajnnt/7U8+D/AJaw/voa0L2bzrXz4P8AvzWYEcMP9pS+R5/mSf8APKGrhs7Gzlkngg8vzf8AU1Ho9n9jv/t1jB5claF5D50vkeR5vlf8tqDQLO8/5bwD/VVHqU0F5F58EH7zyf33lf62iHyNN+0ef/q6ueFZoLyW4g/1cn2Py/OoA8D/AG3vEnk6hpfgaCfzZPO/5Y/88q5f4Y2eh2fxat74aV+7tdH8yHyf+etXPiFnx58fdQ1Wf/j3i8qOGGao5tY/4V7o3iDxjfQeVHa6bLHZzf8ATWg7KR8Z/tvePIPiF+0Fcf6uOOw16Xzv+/tfSn/BOvwHq3hv4feNJ5/N8u1+yx+d/wA/X72L91FXxHFeT+MPG+qeI/IlubiW8lkm83/prLX6wfB/4eweCf2QdHsZ/Li1C18q5+1/8/X72Ku3A0v3xpmT9jQ9mR6DDB/qP+ev+k/9Mov+mVe4eD/GH7Luj+EtL0rxX8JdS1K/sLOK2vLv7Z+683/v1Xh+j/vpJP8AllHLN5n/AG1rYs4ReRfv76WOSWzitpv/AI7X23sr0T4Z1fZM+gNH+OX7NngO1k1XwB8JLmPVP+XOa7m82Lzf+/VeR694k1zxh4iuPEeuf8fF1NLJef8AXWWsv/lrH/rf3VWP+ek/n+bJdfvJqzpYYXtD6U8iD/lhb+V5VZ+pevn+bJW5ND5MUgzXN3k0/lSQV5B6RzevfbvN/f8A+s/5Y1w/iSzzfyWInk8yWH/W13msTCzi/wBf5X/TauX1Pz5rWTz7eLy/+e0VZgeN+PLw2drcT31j5kkU32byv+etfn/8ePhvfeFYtY0P/WR/bJZLOX/nlX6IfEiKxvLWSexgl+0WsP7mvj/9sDTZ/CumW99qtjFLp+qfao5pf+fX/VVw1aR3YY6z/gnv8Qv+Jpoc9jPLJJa/6NND51fpp4V+3T2vn30H+h/8sZov+etfiX+xn48g+G/xQ+wwarL9jls5f7Nl/wCetfr5+zf421XUvAen/v8Ay5L+Hy5v+nWvIxJ21KZl/tseG/7B+I2j+PoD5tv5PlzeT/11rzuzm86KP7d+9t4oZZIZv+ev72vpj9oT4e/8JJ8DNc0OCDzbyw82Sz/6a18p/D3Xr7+xrfSp/wB19l82OH7X/wAsqzpGdIz4fg/8JNN8Rx+MZ/hzZXOoSzS+TL9ji/1tXL3Qb7XrCz0PVb6OO387995VaEPkfb5BB/y9TeZNVi8vIP3dif3VanT7T9yRzaD4H0ew+wwWMklxa/8ALWo9S16+vL+T9/8AabgQ/wCh1J/aU02syTifyvKh/wBdXP3mm300Ul9pVjcyx2v7yGGX/VSy/wDPKl7NGZsWf2HzbeCf915X/LarGvWfg6ztc+Fdc+0ySzf6ZDWf4P0GbUrW8sft1l9nlh/fS3c37rzasa94In8H2Hn2P+kyRQ+Z5NpN5sUVQafuTDvPb/llUdneQfZfPqveTT/ZfP8APil/5af/AGqo9N8VaXMI9Kvp/K83/jz8msqgU9i5eTW4lkt4P9ZUmpZ/d+R/rPJqnDqUEuqSefB+8qxeTf6V+4/1lL2oEf8ArpY/+ekVV4Z/JupLjz61JoYIf9Ngg/eS/wCuqvZzQQ+ZP/rZP+W1SBsWf/HrHPBP5vm12Hwr02x8SeMrOxnnij8q8/1VcfZ6b/xJbiC+nitvssP2g14f+zr+1prkPxf1Se+g8uOLWJbazm/5ZRReb/raA9mfcn7V37B/gf8Aa6+Etx4HvrG2ivIv3lnd/Y/9VX4l/EL4S+P/ANjn9oGT4EeP9Dubazuppf7H1Gb91/01r92Phj+1pofiOWOefVbKOSX/AF0MP/LK1/56/wDo2vkP/gvZ8MfA/wAWvgtp/wAd9K0qKW88OalFHZ+T/wAv8X/TX/trL/5Crb2p20j478E+Apry6/tyxsf3cs3l6l/1y/5616p4J8N2Ogy/v7jy/Nm/c+VXn/w28VX3/CB6fBP/AMvWmxSTTf8APL91/qq7zwH/AGHDpdnYarYyxXEU3+uzUmR3msWc+mS/6D5VzHLD/rf+eVaHhvR55rWOCxn8uP8A5bRS/wCtrPs5oPNkgn8qS3im/c1sTal5OpyTwf8AHx5P+urH2hmbF5CPNjohImikg/560Q3lxNYR319BF5nneV5MP/XKj/QbP/Xzyx/aofM83/nlR7QCO8s4JrX7D5HmVh6lZ/2bFGJ5/L82rmpeJPsdr5/2GKWSX/lj/wA8qrw6lB4lij+3WMsclr/zyqjp9kcX8SLLxHeaX5HhW+kkuIpv31aHwBs/iNpvwvt9V+JsHm+VN+587/nlW5qWowTXUkHn/ZreX/ltWHqWvX2paXHpX/LvFN/odc5kdhpk0F5dfboJ/s0ks37mKtD7b9j/ANI8iufs9YnH2Oe+/dx2tU9S8Yzw+ZcQfvY5YfL/AHtV7Q1pGx4w1Kx/sv7R/rZPOrn9S16x021jnvv3cf8Ay2mrL8SaxpVn+4nMUknk/vppv+etc3rGsQTWHkX3m0e0H7I0NY8VzzWEd9Y/6Tb/APLaGuTh1LXJrqO+1XVJI7e1/wBTaVJeXn/Ew+wwT/vJajs4fOl8+f8A7Y0qhp7M2NNhsZopL6DzI/N/e10mgY8r7dPB5slR6Po9jZ2v264g8yTya2BD9sis554fK/8AaVP2ZiammXc80sdjfWPlf9NYa7jwT4bvtT1S3gM/+jy/66uf8E6DBeap/YfkSfZ/9Z9rmr1zw3NY6Z/r/L8uX/XVsZ1NzrNH8Nwabpf2Gf8AeVHeXkGm6XJqtiP+PX/lj/z1qv8A8JJY/wDHjBP5tx/yx82ub8eaxBDLb6rBffvJf9dDFWhmSa/eWN5ax/8AE18r7V+88muX1K8sf7U8iex/1X/LWq+saxfXl3H9u/dR2s3mQ/8ATX/plVe80eDWNU+3T30sUkv7ya0i/wCWVT7UDc8mym0byID/AKRWXNNBN5kBn8ryv9TR5N9LL59j+6ji/wCWtZepQ+dbRz/6yT/nr/zyrT2pmSQ3l9ef+i60NN8j/lh/rIqz7MwfareCfzJfN/5bVsTQ+dLJBB/yy/13m0e1AuabZwS3/wBn/wCXfyf30tHOmWv7/wDeSRTUaBZ3/lXGlef/AKP/AKzzf+etV5vP/wBfPBVGZch1KeG6jngqneXkGsSyT/vYriKtDzvscsd8IKz9SvIPt/8AZNj+8kl/55VNUCSG78m6jgnn/wBb/wAsap6leT/b/wDjx83yqkm/cxeR5HmSRf6nzv8AllXP6lqVjqQk1XVfMi/641HtDQNf8Y2Oj+JI76CfzI/J/fQ/9Naw9Y+NmleG4re+8Vf6FJL5v/MS/wBVXnfx4+OWh6Pa/wDCKz39tYx+dFJ532yLzf8AVV5X8PfDfxb/AGwPGVvPfWNzY+F5f9GmltIfK/df9dZav2Rp7I+zP2M/jx4q+OXjLxB4jvp5bnw/pcPl2cM155nm/wDTWuo8Va9Pp11cT28/lRyzRfuv+eUVHww+HvhX4M+Dbfwd4Og8qOKHy5pfOi82WpJhBN9ognPmSS0/ZHNV/imfoN5B5X9qzwfu5f8AllUlnN/pUn/PP/WVHeY/d6V/qv8AprRD+48z/lp9a1ILEM0E1pGZ4PNklmrQ028nhsJIPtvlR/8APpVOGzg/dzg+ZWh/Zv8Ay45/1tBoWNNmghsJIPI8qT/ljRZzT/8AbSqc032OaP8Aceb5VSedP+8ngFAEmr+feXUfkf6upJryfw3pl5PY/wDLrDFJ/wBdaNBvPtnmT/8ALT/njWf4wmn1iwksdVn8uzim/wBT/wBNaDKpTPH5vB8ENhqGlXHm/wBoX80t7Dd/+0q8X/bw+IWq6F+z7pehz/6NeapN5d5/5F/+NV9UWdnBNF9u1s/ZreL95NFXwH/wUa8eQeMPHkmhwf6uLyv7Ni/5+qFuelgf3p5P8B/Ct9r39nwfYZLmT+0oo/3P/PX/AJ61+vnjDTZ/Dfwq/sOeDzJLX7LHNN/21ir4f/4Jg/DHzr+TXLjSvN+ywxR/9sq+5PG0M8Pw5vIIP3vleVJDaf8ATLza9XA/xkcudVDz+zmn83yPt3l1saaJ5un7yqdn++/4mvn+V5sP+qr0j4kfDGy+HvhzwvqsF9/yNGj/ANozfa/+XX/Vfuv/ACLX1qq6Hx1Smc3D/qo/3HlVJWh8PdBsfGHjfS/DnnyRW91N5fnf9sqk+IXg+fwH431DwPPfRyf2XNLFDL/z9f8ATWnTqh7M+lNT7Vh3mgzzf8e/lVuXk3nRdKx7y8nhi/cV4B6Rz+vWcENrJBfQeZXEa9Z/bLrp9mjihrt9Ts59S8zz/wDV1zevWXnWsnnz/wCqoGtzxvxtDP8AvP3/AO8/exww187/ALVHhqC88B3H26x82387zIYZa+pPGH7mWOefy/3VeB/GzTYPHkVvBPDL5kU37mGuaqehS2PhvxLZwfDfxv4fvoPKij8n/U/88v8AW1+oH7E/xUOvaN9ngvpJbeXQYvJ/8hV+Zf7RWm30Pje88HeR5WoRQ+Z++/55V9Af8E9/jxPD4Is9K/5imjeb5P77/W/va8zE0j06f72ifsho+saVr1hJ5/8Aq5Yfs0003/LKviv42aDB8Hvi/qHhWeDzLe/m8yz87/prF5vm19UfBnxhpXirS7jyIPNs7rzZJof+mted/wDBQj4bz+KvhzH8RvI8rUNLvIo9Sl/55Wvlfuv/AGlXGcZ4XD58Msc/nx+XFVifyJrqSCef/ppWX4VvINS0uz1W4/48/J8url5ej7L9h8+L91QdBY86+8rz7HSvtMn/ACxi/wCetZ/hvQP2vZrX+1tD+GMUlnFN5kNpd+V+9qxo2seTdfbv3sf/ADxlrUm+M3xbm1SOex8cXttJF/y6QzS1ftEZkl5+zT4y+IUtvoniPzPC2nyw+ZeQ+d5UsUv/AGyrP8SfCXQ/hX9o/wCEc+MV7qV5+6860/1lR+JPHnxH1iL/AIqrxVc3Nv8A88fO/e1n2cMENr5/kf8ALbzP3v8AragDH1KGCy0uODyI/L/1nnf8tfNqnpum6Vpksmq/Yf3kv+p83/llVzxKftksk/8Ayzl/1NU7Ozn+y+R+9+0f9NqACzgnh1mOx+3ebJ/rK2JvI8rz/I8qSL/ntWPN58P7+4Ef2j/pj/yyrU1i8/0q3nguPNj8msfZGntESfbPOtZPI/1ktR2kMEPmQXH/AC1/541GZvOj4/8AIVRw/uP38HmeZ/yx82j2QG5rGLz4c6pY/wCtuIrOX7ZNX5z/AAT8VarDf+ML7XNVk+0WHiSWOG0h/wCeXmy1+iGgzQfYLzSZ/wDWapDLHNX5r/E7R/8AhT/7S3ijQ76fy7f7ZL/6Nqjop7n2x4J+JE8N15FjB/pH/PWH/nl/zyrtPjb8VNK+J37L+oeDtcgk+0RTfuYZv+utfM/wx1LVvstvPfX32aSuwvPEkF5F599P+7irjNDzfTdNgs7WzsbHzf8ARf3kMP8Az1r0DQdSH9lxwDyrnyq5+HR/scv26b/nt5n/AGyrUm/4lt3b6rcarbRW8v8AyxiqvaAd5oOpWP7seR/yx/1MNWJ7yCbS5J5x/pH/ADyrk9N16xgupJ5/Mto/+etbln4k8OXl19usvEdtLHL+7/11SR7NnQf8JJfRWFvPfT/vP+WPk1H/AGl9si8j7dJJH/y2rk5tf8KwiSfz5JLj/nr/AMsq1IdYsZrWO+n1WLy4v+W0NZmvsmaH/CSfY5ZL7VdKkluJf+WVSQ3k+pRR3tjP9mk/5bRVx+s/EKCG6/06+/d3U37m7rP1Lx5/pUljoc/7v/ltqP8Az1p+1OinSO01jUoLuX7DBP5tv/y2/wCutR6cPKi/f/u5P+WMU1cnpvxIsbyaOxn8q2j8n/W0al8Tr6bRri+g8qXUIv8AU/8AXKsvaM09kjrNSmnhsI76D/Vy/wCuhmrH1jWLG9izPP5f7n/Vf9Naw4Nen1Kwj1WeeW5+32f76GH/AJZS1X+2T3lz5F95dz/1yop7h7IuXk8+sSyT67Y/u/J/11Z/k/2xFHB9u/1VRzQzy+ZBP9p8v/njVzTbO+vLCOD93beV/wAsf+etaD9kR6P4bn1KX+1f3cflf89q6SHwrBDayf6qizvIBYf2V/y0q55xnMcH+r/54y1oZVA+2f2Pax+f/rP+eNbHhuHzpfPn/wCWv/Pb/VVj2emz3l15F9B5v/LPzq6jR4bGzl8i4n82OL/UxVtTOU6jwrN5MMluJ/3dbH9sed9n/cSxSVy8Ovf6VJNiOjR9S+2XUn+t8uWqM6m50F5ruq3n+nef5Xlf88qIfEkF4fI8/wAyT/prVO8mEMX9lf8ALP8A1lc3LeT6DdSZsfNklm8ygzO08mxvPLuJ55PLl/10NR3mpeTfx/uP/ttU4dTghh8+f/Vy/vKj8meb/Xz/APXGgDQvJp7z/lvReTE237j955v+u/6ZVXs5v3Xn1sf2PBPayQQfuvN/5bUAZemwedqkcFvP5XlQ+ZW550EN1+/g83zf9dWebOx0fy4PylrU8n/RfPgoMyxpupedNJY/8u8X+pqTzvOtfPnrPm8j/lh/rIv9dRDqVveWEn2H/j4/5Y1XtTMks7wzWv7/AP1dV/sfnap59j5cdx/z2qOb99F/r/Ks/wDnt/01ri/iR8ZvDvhWK8M19FJZ2HleddwzVJpTOs8ba9ofhCwvP7V1WOK4ih8zzpq+Q/2kP2zP7Htv+EH8Aebc3F1+7hmhhi/dS15v8ef2uvHHxm8UXngj4ZQfbreXzY/O87zJf+mVe8fsKf8ABOv/AI+Pi58aYJf7U+2eZNp00P8Ayy/deVXXSpHR/COT/ZY/Yh8Y/H6/t/H/AMcL6WXT7qb7TNaTV96WfhvwP8PPC/8Awivgfw5Fptna/wDLa0/5ay10EAsdH0uPStDsYo4/J8vyoqx5rO4htfsMEH7umcVTEOqZfiTXhZ2El9feX5nk/wDLGH/W1l6Dr1jrFrHP5Esf/Xauomhnmijgggi8v/rt5dZ80P8AZtrJP5Elz5X/ACxhvKCCneabPeRSVXs9Nnh/1H/LKtyaH/QPI/5+v9TVezhg0yLyJ4P3kX/Lb/llQAWf/HrJPRDeXE0uPP8A3n/Pb/llViG8879xj7TJF/zxqn5ME2lyaVB/q5ZvMmmoAk/fzWtx5HlRSf8ATWqepzT2elx8yfva0IYIM/Z5/wDWUalNPqXlwGD/AFVBoU4dYns7q3P2f/v1VzUv31//AGrff6uX/Uw1JDps/lVX1Kzg1iX+w77zbaPyf+Qj/wBNaAPK/j98SIPB/wAJdU1Wxnl8yL93DX5z/Ei8vviF4yjgsTJc3lr/AKTpv/XX/MstfTH7cnxUn1i6k0mxnijji/dzWkNeB/s06Pb+Jfj7o8H+rkuoZfO/7+1merh6fsVc+9P+Ce/w3vvhj8Fv7c8VWMUWoapDF+5/5a17x49h/wCLaXFxNBJF++i/1X+t/wBbVf4TQf8ACK2Edj9g8z7L/wAef2utj4nXgvPAeoX3/LTzovOi/wC2tfR5bTPl8yxPtTn/AIG/ELwP8N9ZvL7xj4OttbjurPy/Ku/+WX72vePG37S3wV8YaNpdjB8F49XuLCz8q8tJv+XCvlezhghi88CP97/z2/1VfWHg/wASf8KB/wCFb/DnwrpVj9s8R/ZZPEmrXcP2n7V5vleb5X/kWvbqHnHN2n7VHgfR7X+3PCv7PdlbapFNLbQ/9MovK/1teP6/r194r8R3HiPVb7zJL+b7T/qf3X72vaLzWJ9M/bcuL77DFfebN9mmtLv/AJaxS2v+trzP42aDY6D8W/EGlaV/x7xalL5Pk/6qL97/AKqtKRme8T+f5seZ/N8qqd5CPNkmng8vza1JoZ/Kk8/y/wDpj5NZ5m86L7DcQSfuq8U7DLmFv5XkVxfiT/TIriCuw1KGDzfPrk9YhEMUhn/dUAeZ+KofP/0H/lnLXk/xC/4//wBx+6s7WHy5pf8AplXunjzQfOit/In8r/ntXl/xI0HyftFj/q5PJ/0yL/plWZ1Uj5D+P3gnw5qXxBk8Rzweb5sMVteV5X4b8j4JfFr7DAPsNndQyyabN/01r6A+L9lBeRXl9BB/yx8vyf8AnrXy/wCMLy+8bS3mlX0/maho37uH/plXBVPWw25+yH7CvxN0nUvC9x5+uebcf9cf+WvlV9CePIf+E2+HNx4cvoP7Xj1SH/Vf6qvyr/4Jm/tLQTS2f/CR30sVvFqXlzV+qHgjWINSv44J54vs8sMXkww/8sq82r/FCrT/AHx8N/8ACN6p8PfFsng6eD7DJFeS/Y4Zv+eVWPJhmtZP+Wsf/PWvaP8AgpZ8GdV0GXQ/jF4Ohi8uK8l+2S/9+v3VeHw6lPeQ/wCv/wC2NQHtESWc1xZ2v7+D/rjR532Ob/QZ/wDW/wCuqO8vJ9N/cTz/APLb9zVe8zZ6r5/kf63/AJbUAXNSPnS+fY/6uKo7O8g/1/26WP8A7Y1TvJp7Ow8+f91JL/qYfO/1tWIbz7Zaxwfuo4/+W1BmSf2lYzfaJ54PMqnZ/wCmUTZmuv3H+rq5o8N9exSeRYxVoAQ2cIupJ/Iji82suHR/9Ekg/wCm1WJ4b6CLyP3sUn/Lao7OG+8zPn/u6ACzs7795B58XlxUQzW+pWsn26CTy7X95WpNZ6VB5Y/5aS/66aq83kCK4g8+LzKzMzPm1iCzij1b7d9mr47/AOCh3wxsdR8W2fxw0uCSXT5Zv+JlF/01r601jR/thjnvoPM8r/U1l694D8OeMNMuND8R6VFc2d1/roayqUzop7HyH8MPidY3mjeR4jni/wBF/eQzRf8ALW6/z5Vegaxr1iNGjvvP/eXUPmXleN/tCfsr+Mf2dfEcnjjwBfS3vh+Wb/U/8tYrr/PlVw+j/tmX2jy/2H4x8Of6R5376Wab/llWXszo9oz6Q1K9sdS0GOeDVZbb/rtXJza9Y6Ddfb59VlvZLqvH/En7Tl/r1r58/l21nF/yxtJv9bWh4P8AG0/iqw+3QTxfZ/O8uHzqz9maHsl54kvvsEc88/7v/V+VWHr2pXGm6rH9hv8A7N/y0rn9Nm1WH9/fVJeaPfa/defqt/8Au6k6qZ0mvfGDStBi/wBOnluZPOi/cww1Y/4XB4imi8jStK+zR/8ALauT/s2eEf2He+XJJLN5kP7mus0fw1PNF9nuIPLj/wCW1c50Ui5D4kn1K0/0iDzf+eNV/JvprqT7DPLJ/wBMq1DptjoMX7+CWW3/AOWMUNdB4V003kv27yI4reg2OHm+3xXUcF9Y+ZH/ANcZf3UtXIf7ch0uTz4P3n/LH9zLXqEOmwQ3UcFj5Xl+TViz0f8AtO18i+8qS4/6bUC9ojj9NvJ7Owt/PPm+bDRZzX0N19usYP8Ar8roIfCoh+0QQQfvIv8AyFUlno3+lSeRb+VH/wCjaDnqVDLGpX00vnwf9tv+msVamkeRNdfbref7Np8v+ph/5a+bVjTfDeZZJ54Ipf3P7mKtTw3pljN5c99+7k87/UzQ1oZe0JNHs5/3k89jF9o/57VYg+wzeX/y18qqd5BPDYSar58n2j/ljVez+3TWsnkzx+ZWtIxNzTpvJupIIIP9bWxNDB9lj8i48qOL/XVzcM3k/Z4L7zfMrcs5vKlkg/5Z/wDPKtyKoabDPNqkk8EH/LGuo0fz9NtfIvoP3n/LGuf02aeH/lv5clWLzXr68uvIgn8ytDmOgmhsbvpP5slZ95ZwTXUkFx/x71l/2lBpt15EH/HxReaxNNF5HkVjUA1LyGe8ht7GCfyv+mtamj6bPD9ogvZ/Mjihrn7OG+vIvIzXQWc0+j2tvBP/AKyWqAkhhnh/1E/+kf8ALaGtj+0oJov9B/1ctZ95Z+ddefB+6k/560abCZvMggH+qoAuQzGzuo+P3ctan2yDypD5/wDqqw4dSsv3kE8H/batD7HBqXlwWJ/0i1/eXn/XKgzDUrwTSyeRB9mt/Jrn/wC0vJ8zVoD/ANM6seKvFXhzwTFHquqmS5t7X/kJTf8ALKL/AD+6r5r/AGnP20vDeg2sn2Gf7N5v/HnDaTUBTpe1O8+PH7SGleCfBsk+q+I4rb7L+7htPJ/1tfJ/irxV8VP2uvEdn4c+En7rS7qby5v+utY/wB+D/wAf/wBurxbb+I/Ef+jeG4pvLm86aWv0w/Z7/ZL+FfwN0vT4PCvhyL+0PJ/5Yw/8tf8AnrVUjs9nRpHn/wCxz/wT38D/AAetbefxJof2nUJfK/tiWWavpybTbH7B9h0q4+zRyzfuYf8Anl5VaFnDY6bdW9jrt95d5LNF5P8A01/561sab4bg1K/vPsMHmySw+ZDXcedUqHL2UP2z9/5HmSf89asXkPk2kk88Hmyf88YauTWd95UmlX1j+7i/5bQ1nzef+8nsT/2yrMgr/wDH3/xKoII5I5f9d/0yrL1LR7Hzc+f5dva1HDef2bqn9lX08v2iWtD7HceVJBnzZP8AnlN/y1oNDH83yfLgn/1f/LnUd5N/aVrJYz/8spv31bmvaaYdLs5xB/1xrn5oZ4b+Q+R+8l/1M3/PWWgA02znm1CQ2MPlR+TVz+zZ9H/fz1qab5F7YSTz+X+6m8vzakms/wDlvY+XJHQZmPDD51/HPB/22qxDZwfb/wBxB5kdEU0/2q3/AHH+t/11bFnoME0sk/kfu6zqfvTNblO8s54bqP8A5ZSVwfxI8SWPg7+0L7XLj/R4ofMvK9I8VTf2DqkcH/TH/XS18T/8FGvjN/Z0Ufg7w5fS/aJZvM1jyf8AnlWh10aXtax8l/Fn4nX3jzxbceI4NV+zfarzy7P/AK5V7h/wT3+Cdx/wtWP4t+KtKkij0v8Ad6P5v/L15sX/AO9r5r8N6DY6l4os9D1uD95LeRfY4oa/Tj9nbwHqvhvwlodjrljH9otYfM8r/nl/nza6cNhjqxtT2VE9s8NwfbL+SCf/AEmO6/1M1bHxC02ez+HN5BPB/wA8o4f+/tR+G4ZrOLyP+Wf/ACxrQ+KnkQ/Dm4/cSf66L/0bXv4X+MfLYk8f02GeG1/cn95FX0R8H/jN8HfEml+F/DnxinlsrzwvNFJoOrafDL+9/wBV/rfN/wCuUVfP9nN5JknM/leb/wAtq+kNT1j4c/s1eB/D/hT/AIVJpPinULrR/wC0bybW/wDSfsv7r915XmxS162IOM0/FPxB/Z08H+N9Q+Lfw613UvFPiS6Pm6bFdw+Va2svleVL/wAsov8All5kteAa/rF94r17UPEd95XmXV5LczeT/wA9Zf8AW16xD+1p4Vs5Y/8AjGzwbbRxf67yrOKP97/36ryvxJr39u6zearPYx2Pm3kslnaWn7qKKLzazwxNU+pJoftsX+o8ryqw7yH975/n1qfbJ4YulZ8P+mSyT3H/ADxrzTuMfUbP97/0zrD16zgm/wBHnrcmhn+yx/aP+e376sfUvP8A3kAg/d/89qzA4PXrOeaSSe+/494v+WNeb/EKznvIo4P/AAMm/wCetewaxDBNF9nt687+IWm+TFWZ00j57+JGjz5k1WeD/Q/J8uGGvi/48aD/AMK98W3HiOxg8vypvMvJf+esVfenxCs/OtZPPg/d/wDLGvl/9qLw3/bGjR2MFjFLeSwy+dD/ANMq4ap6WG3PK/h74qsfg/8AEGzvoNVll0/VLyK58mH/AMhV+zn7DfxO0P4qfDnT7ixnikvLWH99501fgX9s1TTbD7CPMlktZv3Ms1fen/BLX9rqDwT4o08zz3MscsMtteQ/9Na4atI9KpT9qvaH7Ka94Vg+MHw+1DwP4jsfNj+x/ZofJ/56/wDPWvzP1jQfEfwf8eap8MvGJ8qS1m/c+b/y1r9FNB+J1jDa6frnhyf93f6b5k3/AEyrxP8A4Kofsx32seHLf9oXwrBH9s0uzi/tiKL/AJ5eb/8Aba5zzv8Al8fMd7eXH2SOeCCX97N/y2qSGH/lhfTxeX/yxlrg9H+IV9qV1p99fT/8uf8Aqv8AplXYQ3k/lfv4P9Ilh/cw0GgedB9v+wzz/wCkS/6n/plWhptnBDL583+s/wCW1cXZ3l/pviOOf/j5klrtIfPmi/f/AOsloAkvP9Dik8j/AFcv/LWjR7y+s9U/55x+TUk03/HvD/yziqSGGe8v5ILH955X7yagzJJ4Z7zzJ/P8rzajgs/3vkXA/wBV+8qwf31rcT2J/dyw/wCq/wCeVSQwwTGSeb/njWgGXeQ30NrIbGfzbeX/AJ7VX/s2C8ijgsbH95F/rq3Psfkf6/8A49/+WNZ8NnPZ3Xn/APPWswM+7mnm/wBBnnlqnPDP/wAsK2NYi866jggg/eUWem9/IoAz9N8j7BefbtDik8393N/01i/+O15v42/Y/wDgR8WvMg1zSora3l/10v8Ay18qvYLzR4JrX/nlHVe80cmX9xB/o9Bp7RHyf4q/4JI/CTUrr7dY65c2Mcv7vTfJ8qvnf48fsK/Fv9mnXrfXPB323W9H87zPK8n/AFVfpxN54ijt5/8Atj/0yrP1iH+3rC48Oa5Yx3scUNB0+0Z+W/g/4nfY/FH9leKtV+zSRTeZNaTfu69w02zsdetf7VsLi2ls5f3k376vQPjl+wr8HfidFJ9isZNI1C6m/wCQhDNL/ra+d9e/Z7+P3wr8yexsrnUrewm+zQw2k3+t/wCmtctQ7aR6hBjTb/7DPBF5n/LH/plXYeGp4Ly1kgg/e+b/AMtq+W/Dn7S19oEX/FcaHfW3lTeXeedD+9r1jwf+0L4UmtY7/Sp/Nt4v3nk/8ta5qlI7tD1y8s5/sHkQf6yKGpPDkMENhHB5MssktcvZ+PNK8SRf2rY+bbRy/wDLGuw0fWLGztbf7DPF/wBtaPZGVSodBZ6D9jl8+exijq5D5Fn5k9jB5kn/ACx/6ZVHN4kgvLD+1dKEdzeRfu/slExsYYvt1jP/ANsayILFn5811HfQTyR/89v+mtZ8Pn/apLfz/N+y/wDPatTUrz7Ha/vx5cfk/uapzWc/lRzn/WXX+uoOWqWLPUvsf7/7D5X/AC082Go/J/tjzNVsf9J83/lt/wA8qp6x/wAS208+D/j4/wBX/wBMvKqvZ6wf3djfT+X/ANca0M/akl5qU+pSfaD/AMsquabD53lwX0H/AMdrL0fz5pZLHyP3fnf66tyGGCzv45/9ZHWhJuWejwalx5/+q/5Y1YtPsPmyefP5f2Wsez1IWd1J58/7z/WQ1JqV59sij8+Dy/N/101dAFj+2IPKk1X/AJ6/u6NNHk+YTP5clZ81nBDFJBPP/o/nReTUkM19DLJPPB5tv51aHOXNYvIIb+ODyP3n/PWo7Ob7ZFceSP3kVV9NM/7yD/j5uJf9TWx4b02Cz8zyIP3d1/x+ed/yyrMDoNH8jyo/P/1dXPPn82SCD/j3/wCe1ZdnqdvZyxwT2/mRy/u4Zoa1LPUp7OaSAzxeXFQBsabNDeRSef8AvY/+e01U5vs/2WT/AJ5xTf8ALGqd5ewfZvI0qePzP+eVRw+JIJtLkg1yD93F/rvKoCoXJvsEN9b4P+j+TXP+Kvir/YNrcX2qzxRfZf3l5N53+tiri/id8ePCuj6XceRrklt5X7v/AJZebF/39r4b+M37TnxG+P3i2z8K+B76W+t7q8+xeTFD5Xm/9+qDWnhvanpH7V3/AAUCn1PVZPB3wkg+0yS/8fnm/wCtlrP/AGV/2A/H/wC0V43t/ib8YrC+trO6miufsk0P72vTP2M/+CYMGpXWn+P/AI1fZv3U3mfuZpfNlr7w03R9C8NWFvY6HpUttJF+7h87yv8AVVt7IuriPY/wzH+Ffwr0PwfoMfhzQ9Dii/ff8sq9Y8E6aP8Aj4hn+zeV+78mGsPR9N8qX7DY/upP9ZXWWcx02WS+/wCeUP8AqYf+etP2R5376qdZ8MfBPwy8b695GufEbTba8ivPMh067vIvNi/561H421j9lD4ceIrPwP4j+P2mxah/zyi1KLyq+G/2wPDc/hX4l6H4/sdcvdNk1TUv9M8m8lqT4Yfsf+B/j98X/Enivxxrl9/Z9reeVZ+TeS+bFL5VajP0k1j9nHSfG3hi38ReAPHEerWfk+ZDN5sVz/368qvE9S02ezMnn+Z5nnf62Wvmv4P/AB4+OH7KP7S3/DOf/CY3174bupvM02Wb/llF5VfWGgTeFfG2g2/irwP5n2fzpZJv7RoA8/u9It5tU+3/AOtkl/5a1Y1LTfOlt5x/rIq6CYQXkUnnwfvP+mNZc8M/2qOef/VxUAZf7/Urr+yp/wDVxVh/EjTdc03wHrE/hyx83VPsf/Et/wCuvm13EUNvZyyeRB5vm1T1j7DNF+4/1n+r8qtAPmvwT+0t8ftHsI4PEfwdllji8rzv9Dl/1v8Ay1r2zSNS/t7S7e+g0qW2kuv9d/0yrQm0yf7V5Agtoo6PO/0X+1fI/wBHi/deTFWYFfyb6zu7eCeCWSSWvRNNhsdMi/f/APbb/plXP+D9Bnmi/wCEkngklki/484Zaj+JHiSDw3Yahf6r+6+wQ/6Z/wBNaKexl7I8z/ac+JP/AB8X097bR2+l2fmf66vyn+PHxy/4Tzx5qmq2P7qSWaWPR/J/eebLX0B+3J+0JfTSyfDmxvraOS//AHk13D5v+qr5HvNH0rTdUjnxJJ5v/HnDDQqf749rBUrL2h9GfsZ/s66pefFDQ/HGuT/8S+1mikvPN/5ay1+kmm2dj5vkQeVLcS/89v8AnlXgf7OvwxvvDfg3T77Vb+2/5ZSfuf8AlrLX0ZpGm/bLW31y4sf3cX/PGvfwx4uZVfanaabZwTRWcFR/FSH/AItzqFj9okj8qaL/ANGxVc0CHyYpL7/vzFR8YLPz/hzcT/8ALT91/wCja6cL/HPEqbHh8N5PZyxz+R/qv+W1fRkP/DPXjz4S+C/DfjH4nXNteeHLPy/Nhh/ey/6r/W/9+q+fzD5sUfkf8sqLOHzv9ef+/Ne/Upe2RxnuH/CrP2V7PzIL744X0kfk/wCqmh/6a15HqVppVnr95Y6HPLc2cV5L9ju/+mXm1ufCX4P658ZtZuPDmh39tZSRQ+Z513WX4q0HVfCviO88Kat5csml3ktt50X+ql/e1nSp+xKqn05ND5tU5vPs/wDlh+7/AOe1WKjvPsPlefP+9/6ZV4h3Feb7DNL/AMfHm+b+7rm9ShH2C48g/vK3JvPhtft1h+6jl/5Y1j6xDPAI/wDyNQaHJ6lD/osk9uP9V/rq4fxgP7Si/f8A/LWvTNYhg/dzwVx+saPBDLcfuPM83/yFWYHi/wAQtHnhit9Dng/d/wDPWvB/ip4Psby/1C+n/wBXa/u5pYf+WtfUHiTQp5orzz/3nlV4f4w0GfzbjyJ/Njim8z/rrXLVO7DVD4P+LXhSx0261Cfz/K8qHzIap/s0+ML7w34ij8VaVfSx28v7ub/ln5VesfHnwHPeWt5BPY+X5s3med/zyrxOzs9K8H/aPDmuXHmyX/8ArvJ/dfZa5qlM9elU/cn7Sf8ABOv9orSviRo1x8Mdc1Xzbi68qSzmm/55S1916RF4d+IPg248LeIrfzY7qGX9zN+8i8qX91+9r+eT9mP45ar4b1TR/I8SRRXFheWvk/8ATWv20/Zp+PEHjzwHb+I9Knj8y1/4/If+etedUpnLVpHwn+11+zfrn7K/xzk0rVYPN8P6pqX2iz1byf3UUUv73yv8/wDPKrmjzWM0tv5E/meVD++mr9GP2o/gP4U/au+A9xoRsfL1C2h+0abN/wA8pf8AMlflnoN5qvg/xRqHw/8AHGhy2WoRXn2aaWb91WYYbc7i802xvPLn/wCPaSL/AJbVoaP9umsJP3Hmf9Nqw9fhuIbu3n8/zI/+WNamg6x+6kxP5cf+r8qg1NCzs7GGbyJ5/NkqTyPJlkvoP3X/AEyqnDND+8gg/wC/1XPsfkxfbjQZklnewWcUl9PB5kcv7vyar6b5/wBluPt0/lXHneX/AKn/AFtFn5+s6zHpUH7qSX93++m8uvUNY/ZY+O3g/wAHR/EWDw7JfWdrD/qc/wCtioMzh/J/0X/USeXFD++l8miHR/Jm+0fvZf8Anj5sP+trpPg/8DvGPx+8Oah/wg+lRRSWHm/bIf8AV+VL5tZ+peG/ip4V8b6f4A8Y+Ff7NkupvLs7ugDnxDYzX/8Ar/KuP+W0U0P+qqxCZ9Yi8+Cx8ryq7D4y/sx/HD4caCfipb6X9u0vyYpJpf3X/XL/AFVcn4PvNV1KLz7GCLzPJ8zyqACa7sf3kE/7qOX/AJbeT5tFnDY3ksdxP+78r/Uw/wDPWvQPAn7KXx3+Nelf2tBpUnh+P/ljFN/y1qn8U/2A/j98MtGk8f2GuSal9lh8yaL91/6KoA831Kz8qXyPP82S6h8zyf8AVSxVn3lnBDax6rBP5Vv/AKubyqk8K3mq+JIrfSv7K8zVJbP/AEy0tP8AVRV7/pH/AATP8U+O9Ag1XVfG8uiSX3+uh/55VmdFN2PmjU4bGGKQz/6dH5P779zWP4ks54ZbeCxvvMjih8v91+683za9n+P3/BOb9oz4KeF7jxz8MfFX/CSR6X+8mtMRfvYqxP2WP2arf9qLT5NK1zxH/ZFxYf66KX93L+9/6ZS/9cqDWlVPn/xt8N/2eviDp9xPrng3TbbUP9XNaTabFL5tfO/xU/YbsdNi8/4Zar9mvJf3kMP/ADyr9TPEf/BHqeGwksvB3xbjubyX/lriL91Xzf8AtFfsT/tGfsx2EnirXNDudW0O1/dzXcP7z/0VS9kafWT879em+OPw38uxn0qWSSLyvOmmrQ0H9pyx8Ny2/wDwldjLFJdfu/Ju5q+wDqOh+PJY/wDiVRW0cUPl/upov3stcPN8AbHUv9fffu5ZpfOtIofK8qsvZmtOqef+G/2ivDl5Lb/YZ5Y5P9ZNL/qq9AsvjN4O8YX8d94cn/55R/ZLT95XD+MP2M/hnDa+foc/2K48799ND/y1rm9Y/ZX8RzRRz+FfEf2mS1/5ZXdZ+zNj6A1jUvJ1TT77Vf8Aj387/lt+6rYmmvfNjOlQeZHdfvIbv/nlXzH4Vh+MPwx1T/hHPH+hXNzpcs3mfa4v+WVe2fDH4heHPG0Umhz332aT/j5ho9mYVTc86fUvM/f+b++/fQ+TVOYwWcsnkf6url5ear5Ul9PBHWXZzTzyx+RP/qpv9dWJkamjw/Y7rz/P83/plWxDdzmL9/Y/vP8AnjXP2d551r9o1WD/AJbf66tyGH91HBBP5UlaASWfkfavP8j95/zxlqxNDBNLIP3kUn/LaGo4dNM37+f975X7ytzR4bH7V9unn+zSS/8ALGatqYFPTIbGbQfsP72STzvM/fVJNpt9DLJ5/wDq60JrPSvt/n2M/mVqedpV5a/6dP5VUc5z9nplxNqkc8H7uOuo02zgh0u4nn/eyRf66qcNn5Nr+4NXLP8Ac/uMfu5f3k1AGfNeQTxeRB+782rk1n9ssI4P+Pa3i/5e6j87H7j915f/ACxqxqWpaVNYR2P7yK8tf3k37mg0NTwT4bg8q4vvJj+z2v8Ax+Sy14H+1F+1H8Mvhjo2oWNjfSSXn/TGb/lrXN/tdftjeFfh5pd54c0O+i/tCXzY7zypq+X/ANnv9nv4xftsfEaPXNcgubHR4pvNmm/1Xm1XsjWmZdnqXxi/bS8ZSeHPAGh3Mscs3l3l3X35+yX+wTof7Oth/bmq6Vbf2hFD++8qz/8ARVekfs9/s0+APgn4Ij0Pw5Y/Zrzzv9Mu69g028+x2vkef5kn/Tb/AJa1rTpmVTElfR4IL21k8/8AdRy/8uk3/LKtCz03yZP9R5nlf6mX/nrWfqU02myxwGDzZP8AltNXUaP/AMTKaOeCfyo5f9TDWpzkcIvYbqOf/ptXUabD9sljnn/5ZQ+Z+5rPvIbEdIP3netDTYfJtoxP/rPJ/wDatAHy3/wUI+3TeEreefzJfsviSKT9zN/x616Z8B9SuIfEfiyCCC2+2ReVJ5WnTf8AXKqf7aXxU/Z68N2Fv4O+Kk99cxyzeZNaWkP+t/8AIVY/wH/bS/Y08B6NcWH2DxRe3EuseZ/aF3pssvmxeVF+6/c2tBmY/wC2B4b1XTvjJ4T+Lc8H7uwh8u88n93L/qq9w/Zj8Sf8JJ8Avt3kfvL+8lkhh/6Zfuq+f/jl4q8R/tyfEHT/AIcfDLwBfaTo9refbZtWm/debF/21/6619WaDoOh+CfC+l+B/Dn7q3tdNlihl/7ZUARw2dvNJ5EE8X/XWsubH+kefB5flf8AkWtT+zTDF5E/7vzaJoceXPnzPK/5Y0AZ95CJpo/I/wC2NU7yzghi/fz+VcVsQ2f/AJC/1NV9Rs55oq0Aw5rP97JB9n823/56zVsaD4Jn1jWrfSrH/V/6ysvTbOe9uvI8iXzPO8uvWPBPgmDwToP/ABNZ/wB5dfvKzqbAU9YvNK8H+XPP5UUkX7uGH/nrXyP+1p+0hpWm+DdQsbGDzPsHmyTS+d/rf+mVe4ftafE7w54DsLfxkR9pvIpvs0MX/bKvyT/bk/ac1XX9YvPA/g6xi+z2s0v2yWH/AJa+b/8AuqDsw1P2p5H8QvHmq+PfEdx4jn+03Pm3nlww+d/x617B+zr+z2dS8eWfirXP+JlJL/qbT/llYf8ATWvF/CvgPxGLSzsYP3sl/eRedX6Cfs1fDH+x9L+wzwSx3Etn5c0v+t/dV24ama4mr7E908B6DB/Y3kWMFt5cX7uGHya9M8Hw+TFHYzzyRf8ATKuf+HvhXSofC8f27/j4i/1PkzV6B4a037Hdx/8ALWT/AJ5TV6VI+Xq1ToNCs/3Ud8f+Wv8AqYf+eVU/jBD5Pw51CD/ptF/6Nirc0GE6bdf6R/y9f+Qqx/jND/xb7UOf9VNF/wCjYq6cN/HOWpseF+d+68j/AJZ16p8Pf2V/i38SNG/4SrQtKtrHS/8AljLd3nleb/5Cry+Hz/tX7j/llXunxyPiLxJ8NfAet+HLLUvsF1o8Uc4tIZf9bF5Xm17dSp7JHIWNN/Y5+O+jyyT6V4q0S282H/j7i1iWvH/FWm32j+I7zStVvvNuIryWOb995nmyxS/62j+xvFflSQT6VqUvm/u4fKhl/wCetV5ob7zZP+WX76WOa0mh/e+bRSdzQ+rJrP8Adf6D+6jrHu7P2/67Vsf9fH41HNLBMK8Q7DPmhnh8yf8A5Z/8say7yH/tr5tal5NfCLyIIP3cVZ/+p/1FBoYesab9j/1H7yuT8SaP+6/56+b+8rvLz9zFcGuT1LEP+vnoA838VabP9luJ/P8A9Hryf4hWf2PQZPsEH7uWaL97XuGsabB/pH7j/rjXm/iTTfJtcz+VLHdfuvK/6a1zVKZtSPlP4neHNKh+2fbb6ST/AFvk18v/ABU8Nz6bo0k99BFc/vvM82vuT4haDY6xo1xPPZSxx18x/Frwf50Vx9ggijj/AOeUsP8Arag9GlUPF/hXo8+v6FH4xsdV/wCJhazRSQ/9Moq/RT/gmP8Atsf8IrLo+leI76WTT7qby/K/55V+d/w90i++HuqahpUE/wDxK9U82T/rl/nza6TwH4w/4Vj8QbfVdK/0nS/O8vWPJ/55f89a8upuelT/AHp/SZ4J+J1jpsX26CfzNPupopJpYv8AnlXzn/wUx/Y6h8V+Fh8cPhnpEclxowl/tmGH93Lfxf8APX/0bXn/APwTZ/bA0P4keEv+FSeI9ViiuLWH7Tpv2ub/AJdf8yxV9z/DHUoJtLj8Ha5/pMcUP2bTfO/5axf9Na5zzatP2Nb2h+THhXxt/wAJXFb2M9j9muLX93+9rqLP7P8AvIIPK+0V3n/BRT9jPxH8B/GUnxi+HOlSXPhu6m8zUrSGH/j1rxvwT4k8N69YSa5Yz3P+i/8AHnD53+trM6fae1O0hs4JvL+w/wCs/wCW1an22D7B9hvv3kn/AExrHvLzVbOKP7RB/rf3lZ82sT2d1JPB5n72sqoezI/ipeT+G/hpqHiqCfy5LWHzIZof9bFL/wAsq+iPgP8AtmfGm8/Zz0PXL/VbbV7iXzbbUvNhi/8AjVfM/wATtS+2fBbxR599F5kWjyyf+QqufsQ3l9efs5+H7HVb793dalL9j/8AIVZe0A7z4A/tdX3wA/al1zwdPfXMtnqkP9o6lDFD/wAtZfK/+O19h/GCz8Dftr/s+Xnjf4ZarHbaxYWf23TbvyfLliuoovN8qvzI8N+JDoP7fWqef5dz9q037N9k/wCWUX+q/e12n7NP7dWufs9/tLap4Ovv3VvdTeXZ2kM3/H1/018qtfamf1U+sPAfx+8VeKv2c9c8OeKtc+06x5P2bUobuH/Vfva+d9B17wd4Pl8jXdcvYvtV59ms4q9Q1LX/AAb8QjqHjHw5NFbSX/8Ax+RRTeb5stfMf7dPjG+8K+F9L1yf93p+l6l5fmxUw9kfTf7Zn7en7QnhrXrPwf8ABYW0dnLD5nlWkMX+t/79V5R4J/b7/wCCgfhWW4sPH/hWTW47qGWT/UxeV5X/ADyr2j4Y/s36V8WfhzJ8W/hJff8AEw/4+PJms/8A0X/z1pP2cP2s7j4farqHwd+Pvwsvv7UivJf7Nu5tHlj83/pr5VBp7I8Y+Hvxm0P4Y6zZ+I/GOh/2brF/N9t8qH/0VWX8cv8Agop+17r2vXl98K9Vl+x/8udp+6/dVh/tga94ch/a+8N319BFLpd/NL5MXneV+982KvoTQv2QJvGvwbj+J3wehiudQ1mH/VRf6TLFF/2yoNPZlP8AYD/4Ke+KviTqtx8M/jv+7vLWHzPOlhi8q6l/55f+Ra4v4qa9qvw8/bmt/wDhXPir7DZ+I4fM8qL/AFX+t/8AtteJ2fwf8VfCv4+3kHjfSr7TbPyfM8q7s5bbypf3X72KuX+IXxP/ALe+PHhfXNKnl+0WEMscMV3N/wAfX+q/e0Gvsj0j42ftLftweA9evPHHgDxjcx6XYTfvrSab/W/+Qq+pP2G/+Ch1j+2B8Obj4V/GnSraW88n7Nefa/8AlrWHD+yj8Rv2hPhpp+q6HfRSWd1D/wAff+s/e18vw+D9V/ZR8Za5pV94jito7CaX/S4ZvLlil/55Rf5/5ZUGXs2ZfiTwH/wqvx5qngefzLm3sLyX7HNDDF/qqp6xNPeRfbvP8uP/AJ411nhvTf8ARZPHHj+CS5vNUh8zUvK/5ZVh6bpulaxrNxfQQeVZxf6nzqzA5u8s/wDlhPB/o8vlVX1LyLOWSx0qCOOT/ljNLN/qq9AvLOxvIvIsYPN/6ZS1z82jwfZZJ57f95/zxoNDk9Shn1LS47Gee2vY/sf77zppa8b8SWc/wr8ZR65P5scd1NL53k/8soq+iJof9Fjvr7/tjDXJ/E7QYNe0G4g8iKWPzpbabyaALFn4q0rWNLjvrHVZLm3l/wBT51XLOGCaWSCD/Rv+uVeb/B/XrH7L/wAIdrn7q30v/nt/y1r0zw3DYw/6dpXmeXL+8oAkh0c/ZPIA8yrH9veTN/zzkirc02zgvIpJ7+fy/wDTKw/FWmwC+jsfI8uTzv3MM0P7ryqALkOvQTWvn33meZ/0xrQs5ptSi+3T/vY4v+WNU9B1LyYreCfSovL/ANVDd/8ATKtyHTbAXX7ifzPN/wCW3/PWgCTw3e/bNUk8+Dyo/Jq5Zw/bL+SD/WR1HDps8NrJfQf9c/JqSzh8mKO+8iT7R/6KoA0LP7D5X+vli8qrlnNAbW4guLf/AFU37mb/AKZVj2d5P9q/srz/ADZJf+WUNV/El7Y6Payf2rfeXJL/AKmgzNSabzpZL6D7NHbxf8tpf+eVfMf7Wn7bFj8JbWTwr4On+3a5L+6/c1zf7S37XVjo9pJ4A8HT3NzqksPl/wCifvIqz/2If+CdfxG+PHjz/hKvHGk6lc3kv+k/vtHllqqdM19n/wAvDl/2Xf2Rfip+054yj8R/FTSpLa3lm+0zXcUMUtfpJ8Mfg/4V+DPhL/hFdJ/d+b/rv9DijlroNA+APjj4M+HI4Nb+GWrWUcU3l+dd6bLZRf8AkWrmjz2/iSwt7641z7T/ANNv+WsVdRzVKvtSx9j+2RR/uP8Alj5cM1XIdN/e2/8A0y/11WLPR5ppf7DsbG5luPO/0OKH/lrXpGgfsjfGie0+0XuiSW3/AC0m82Hy5f8Av1QZnHw6PBqUscFj/q5a3IdNg0218j7D5sdr+7mqveaDrnhvWf7DvtDvba4tf9T9r02X/Sq3P7Nvporef/lnL/qf+Jb+982gDL17XtK0fVI4NVEv2iX/AJbQ/wDPKugsrP8AtKwjnsJ/9Hl/57V6Z4P/AGV9V1i1t73xjpVt9o/54y/8sqr/ABU+EviP4b6X9u0PQ476zsP9d+5/5ZUGVSoeL6/8E/APjCS4n8ceB7K+kih/c/a4asWfwr+C2m6pcX0Hwy0iL99+5tIbOu08B+FZ/jBrMehwar9mt4v3nnTf88pa9Ym/ZFE1h9hn1393L/qfJhoMvanz/pv9h6bFcaVodjY6bJ/yxmihq55P2u0kvv8AvzNXrF3+wh4ctIv+RxuY7j/WedLD/qq8nvNNsYbrUNKsZ5Jbe1vP3N3/AM9Zf+eVBr7W5XvB/q/9O/eRVJZ/aM+Qf+WtZepXk811jz4/L8mjzsSx/wCt/wC2NZmpsQ+RDYRwTj/ttVOaafypIPP/AHcs3l0ed+68g/6uX95+9/5ZVufD3wfP4wuv7Vn/AHelxfvP+utAqmxqfDH4Y2MN/wD8Jjq0/wC8/wBXDF/7Vqv8VNe+xxf8JJBP+8+xyx3kP/PL/W16BealYaZYefY+ZbeVD/y9/wDPKvhv9uT9tjw58N9G1See+jk0+XTfLvJoZv8AW0BSw3tT5r/bw/aK1yGKT+3NV828lm8vTYYf+eVfB8sE+sa9JfX2q+X++8yaX/n6lrU+JH7R8/xm+L8k9vpUn9lxQ+XD53/LL/VVueCfgnfeMPiZp899PJHo+jeVJDN/n/rlWipo9OnT+qUT3D9lz4V6HrGvW+uT/wCkx2EP7nzv+Wsv+Za+0Pg/4bn0fzL7919olh/ff9Moq8f/AGb/AAHb2eg299PD/o8s0scMVfRHgnQYNNuvsM/m+X5P/bKvaw1P2R8/icT7Wsdh4V02CKwjhsYJfLlm8z/rlLXeaPDP5sf24ebWH4V/48JLGCfzZJf+W1dRo8H+rsf/ACNXUcNSodJptn/aQjg/55f8tqx/jZZCz+GmqTwQebJLNaxw/wDf2KtjQfPxJB/yzrL+P3/JG9Q+3QSyRxTWvky/9tYqul/GOapseBwWfkxeR5EX2zzv33/PKvVPB/7V3xN0HwvZ+DrH7DLb2Fn/AKHFFpsUn+q/66xVxfw3+IU/gm11SxsfDdjfR6pD5c32v915VeofCv48fE280G38HeB/gfZa3cWEP2aa70/TftMX7r/rlXr1f4JxUzPh/a6+MUMskH9h6b5n+r8mXQbWL/2lXl+saxfaxqlxrl9PbfaLq8lkm8qaX91+9/55V9AeJPi18cPAlpHf+Mf2erGOzl/1039gyx+VLXz/AOJNYn8S6zca4LGOL7fNLczRWn+qi/6ZVnhjSqfVE03nf6iqfkzzS1oeRB/ywovIbiCLz56807jPmmn+yyVThmt8/uIKsXn+t8iq95D5NBoZev8A/LTya5/UrMXnSus/cTRfSsu8hghloA4O80aAxSef/wAfEVed+MNHgvPMghnir1jWLPzpbjyP9Z/y2rz/AMVabY+V5Hn+VJ/rKzA8X8eeFYDa+fPPJ9n/ANX5NfP/AMWvDf8ApUljfWMX/Tn5X/LWvrDxt5E+lyCex/0eX9351eL+PPDcH2WPz/8ASbi1mrKpTOmnVPiP4teCZ5opLHSvN/ewy15n+zf4k1y88Zax4A8f/urf/lj/AM9Zf3VfVHxU8Hz6PdyX3kV8x+NvCmq6D4jj8ZWF9HFJFN5kMP8Az1rzalM9fDVT1z9nX45eKv2b/jJ58+q/adLl/d2eof8AtKv3A/ZF/ac0P9oT4aSX1vqscfiT91HNDF/7Sr+fPw38QvCvxDv/AOw/EelS/bIv3v2SH/nrX0h+yv8AtjeOP2dfiNZ32ia5JH9l1iL7Zp3nf8tfNrmq0jWr7Gqf0CQal4c+J3he4+HXxGgilklh+zzeb/y1r81v20f2RvEX7IPxK/4TLwpBJ/whd/eSjzf9Z9lil/e19Y/Af9qLwp8f9Fs9V0qfytc+x/6mvoCf4e+FvjZ8MJPA/wAVNKjvo7qH99Ddw+ZWfszh9p7E/Kvw3qV94q0v/hI/9bced+5h/wCeUX/PWjWIb6ztY76CfzI5Zv31aH7VH7Pfj/8AYa8bx+RfS6l4b1T93Ddxf88v+eVZeg6l/wAJJoP9q2P/AB53/wC7hh/55VzVKR0qrRqnN/E+zPir4c6xoelQfvL+zljrm/2LPjz4c8H+F9P+HPiPzP8ARdSlj/1NeoQ6DP8Aa47HSrH9550Xk1zc3w9+GWj69/bkHhWKLzZvMhl8n/lrWXswPM/jZ42n+D/7a8njiCxlk0u/03/j78n/AK5V1nxt+GHg79orwHp/j/wdfR2WsaXDLJpsvneV+9/df62uw17TfDnjaLyPHGh219H/AKyGbyaz4dN8Ofb7PQ/Cuhy2NvFN/wAsoa09kaHm/wCy58ePiN4V8UW/wq8f2/8ApnneXD53/wBqr6A+OXw20P42eF5PhzfQfvL/APeQw+d5flS1ual+xP8AFSz0uP4tweALa9vP9ZNL/Zv73yqy/Cuj+MfiFrMljBBJF4givP8Aj0hqg9oeH/s3/tjftQ/sE69J4O8SeHJbmzlh8vyvJ8yKWtzxt/wUs+MXxa8UR+MdD+C1t/aFh+7h/c+X+6/7ay17BPear4w8UW/gfVfA8cusS/u7OG7s4pK2PGP7GfxG0GWO+n+HP9mx3XleddxWf7qgftGeR/Gbwrqv7SHwqt9csf8AiW+LNGh8yz8r/n6/7a/9cq4/4G/8FFP2qP2SrDUPAF9pVzcx/upLyGWz837LL/2yr6n8X/8ABNv9q3U5oL3w3r2kW+JpZLSH+2bq2+0xf9soq8A+J2j/ABT+D/xG/wCFV/FvwrpsWuSwxSWct3D5v2+183/W/wCq/wCmUtBp7Wicf4q+J3x+/bM+KH/Cca5pX2KOWH/TJv3UcXlVh/tRfAfVdN/sPx/4AnkvrjS/3cEUU3+t/wBVX1J8Df2J/ib+0VpX/CR+B/GNtpul/wCrmlh/d/8AXWL/AL+13F3/AMEkvjfp0X27SfipYy4/49LSWaWL91QH1lHxX8N/25P25/hv4DuPg74O8OSW2n/8sftflebF/wCRa5fwf4J+KfjDxRceMfjFqvmXF1N9p/s6aaKX7VL/AM9f3VfcHw4/4J2fEz4ga7eeHfEniu2i1DS55RqU0Xm/6ryv+ev/AC1rY1j/AII0fEXTrCTVfB3xV+03Ev8Ax5iaHy/KioMvrSPm/Urye9ijsbEeZ/z28mqc2gz2dzHBpV9F5nnfvoZq7jw3+yL8VPDfje3+BHxGn/4qC6m/c6h/yyli/wCWVdh8d/2LviL+zJLpeua54j02+0e/vIra8l/5axSyxVmP2tI8fmm/0qP+1fKik/1flQ/8sqx9S17SobD/AF8f73/ltX1hqP8AwSe8YeJfB0fj+w8fxfaLm08yG0/e/wCqq/8ABT/gkz4U+JnhePXPGOq/ZvKH2fycy/62tDL2tj4km1LStSH27w5febcRf8sZax7yaDR4fsOufZoo5YfMvP31fcH7Qf8AwSq8D/A7wbJ4+8D+MPK8qby66S0/4IrfCr4keF7fW/HHiqSS8uoYpJvJs/8A7bQHtT8m/Ff9leA/Hmn65/asX9ny/u5pYf3le2eD7y3161j8j/rrDDD/AM8v+ete5/8ABQ3/AIIxf8Ky+DWufE34ZePo7iz0aGK5mtJofK/debF/y1r48+Bvxan1Lw5Z6Vqv+jXlrD5cN3F+682L/wBq1mdNJo9w02ax0fVPt0/7zypvM8marnxC+Kk/xVl0/Q4PCttZR2s3mebD/raz4Ybi8ij0qeD95/rPNrP/ANBs7rz7GCST/prQIuf661uLeC+j/e/66tDw3D5Nrb2ME/8Aqq5/yZ9Nmkn8/wDd/wCsroPDemTzRR30B/4+qAOonh+2Rf2VPP5dxF+8qv8AbIIYvt/n/wCj/wDLH9z/AK2j/hCfH8115+laHLL/ANPdZ/irQfi34b0uTVdV0q2to4v+XSgzK95r0Gmy/bvOijuIv3s00P8Ayyr5b/ac/a6n16W88AfDnzbm4l/12o+T+6il/wCeVU/jl+0frnjDxH/wqP4Vzy3OoS/8hi7/AOeX+f3Veifsr/sZwfav7V8f/ZrmSWb7Tefuf+WtVSNDl/2TP2ONVmit/HHxi0P95F+8h86b97X358H/APgpZ8JP2TPDkfg7wr8JI9S1j/V3k3ky/wCqrHvNN/0W3uINKi8u1/eeTUeg/BPwP4q8UW99/YVjHeSzeZND5NbHPVqn03+zF/wVb+Ff7VF1ceAPH/gi2sry6g8yGI2cvlf9cv3teefE/wCHuh/Df4l3lj4cgiis7qbzPKhm/wBVWf8AGD4M/Dn4A+F7fxV/ZVlpusS2fmal9kh8qWwuv8+bXP6D481X4tWFv4j1zzLa3lh8z97WntEc1Ome+fsu6bY6Ba6x8Tdc8qS8sIfLhil/1Xlf89a8f8Vf8FSP2tPB/jx9cvvAum/8I3c3nljzof8AWxf9/a3P2afi1P4k8G+JNKnn/wCPWaWPzpv+WsVcX8ZtNsYfgFrljfaV9u+y2fmWf/Tr+6loOk+t/HepeFf2mvgHb/E3w5DHHqGmRRSw+V5v/PX/AFX/AJErhPhXqVvZ+I7OfxHpVtL9l/66/upa8/8A2Lfi1rnhX9n3S9cvp4pbO6hltrO0/wCfqXzf8/8AfqsOz+LWq6P+05p/wxsYP+JfLNLezS/89ZfN/e/+jay9qB3n7V37Zf7Qc3xRs/AXwBmtpbMQfaNRPk/8tYv+utel/sc/to6p8bI7z4dfGKwtotdtT9nmu4Yf9Gl/5a+VXjlnZ2P/AAsu88VQQebcXU0vk+TXL/A3XtK8K/F/xRof+qkivPtMM3/TXyoqZlUpG5+2xN8W/h7qlvY/s9T3MVxFqUv+q/5ZRf8ALKvM9G+Hn/BRjxUZNV1z4tyxW8v/ACy86KvoDWPiHfa9/p088VzJL+8vJax9e8Va5Z+GLye+1W98vyf9D8qagz9nRPA/Evjz9oXQf7L8HX/j+9vtUutS+zfZIpv9b/ra+iIdHPhDS7fw5BfSXMcUPmeb/wBNa8n+EtnP4q+KFxq0/lSahpcPmab53/PX91XrGpTeTf8Akf8AfmgPZFPUryCGL/UReZLNUc3+u4n8ryqjmmns4pJ8R+ZFNWh4P8Ez+NvEVvpUHmXP+meZeRUGpseD/B8/jaW3n/1dvLN++m/56xV6Rr2r6V4Vit/Dmh+V9ni/d/8ATWKrn9m+HPCth/YUE/2byv8AjzrxP9q74taV8DfAdx4knn/0y6/z5tAez9qcX+2Z+2z/AMKr8JXmlQarbf2pF5scPnQ1+Lf7SHxs8Y/GbxRJpX27zdPtf3mj2kP/AC1l/wCestegftUftUar8YPFOoQeFb6S5s4ppY5rub/nrXg/w4037Zqlx4xvtV82OWGKPQYf+2v73/2rSpI9HDU7FfwfZz+GviDb6VBpXmyX8PlzQ/8APWX/AKZV9ufBL4ewWfl/6DLc3kXlSTWkX/TKvL/gP8E9D17Xo/Ed9pX+kRf6mab/AJZV9cfBPwr9j1mO+vvKjk86Lyf+mtetSpmeNxP7mx6B8GfB3+i2d9BPHHJdeb53m/6qKvYPB2jT3ksljAP3kX/LWWsvw3oNjDpdvY2MHlW8s3mTTf8ATWu08H+R5vnn93H/AMtpq9M+XqfxjY8H6bB5vkTwRf8ATbya6iyhg8qT9xVPQdN8mKTyIP3f/LGaugs7LzovsP8Ay0oW5l7IsaDZiaWSD/lnWf8AHizn/wCFQapB5/8Aqvsv/o2KtjTYfJ/cQH/SKw/jxef8Wq1D/tl/6NropfxjKpsfO808Hm+fB+6kl/11fQHxI+I/ir4D/DTwv4I+GU/9mx6ppsVzNq0MPm/apa8Hs4b7zY59Kg8248n9zFXsHgP48fDn/hF7f4Y/H3wrJq1no03l6bqNp/x8xV6VU5C58Gf2lvjFr3jfT/DnirXP7b0/WZvs01pNDF+6i8r/AFteb/F/R9L8KfFDXPDmh/8AHna6xdRw/wDf2vWNG+LX7NvgTTp774I/CTVpNZlEvlXWqnMsR/7+y14XrGsX/iS/uNd1WfzbyWbzLz/rrL+9ow+5ofVkPnw+Z/01qOYHyo7ef/VxVYvIf3X/AFyqvDDPN5leSdhHN0knnH7v/ljVeaY+b59XJoR5XkVnzeeZvI/5Z0AU5pv3snkfu/8AptWHr5uJv3EA8yT/AJ7VuGYTf68f9cYap3lnb5/cD/rtFQaHF6lZ3xtZK5fWbOfyq9QvLOCa1/6Z1y+vWcE0v2GAfvP9ZWYHk954bn8qSx8ivM/Hvhv7ZdSar+9i+y/u69s12D+0jILGD95LXn+vWc8Pmc/6PF/rqDM+Z/i1oN9qUv2G+t/9Hr5n+LXg/wDtKbyPsPlfZf3n2uKvuD4haDYzf8sJa+e/id4Cgs/9OgvrbzJf9dDXDVpHpYaofF9loOq/Df4v2/xN8OQf2lJFN++86tz4hfE6x8V+PLf+yv8AQpLXzZNNrvPHngjyb+4ngsZfs/k/62Gvm/4tab4q02/t/Eeh+VFJa+bJ5Nc1Smekj74/Yz/a01z4b+PNL1zQ9V/0jS/3nlS/8vX/AEyr9wP2Uv2p/Df7SPgzT/GFlfW0euGz+0TaTFN+9tZf+eVfzB+A9e1XWNLs9Vsdc+w3kv7yz/6Zf9da+qP2G/23viN8MfFsk+h+Krm21SL/AF00v+quqy9oGIp0ap/Rh8WvhX4O+PHgPUPB3iqx+02d/D/qv+eUtfk/+1T+zf8AFv8AYb8eSXEH2m+8N3U3/En1Hyf3Vr5v+ti/9G194fsT/wDBQj4ZftFaXb6VPffYdc/5bRf8spa97+Kfwl8BfHfwZceDfGWiRX2n3UR/1v8AyylrP+Keb/urPyM8K+JNK16wjn8K30Uckv8Ayx87/VS/8tZap+MNB1Xw3L/r/tNvL/rvK/561sftafsN/Fv9jnxvJ448OWNze+F5ZpZIZoZvNliii/561T8B+PND8eaV58E8fmWv/H5DXNU/dHrYaqqpj2fnj/QfP8uOKHzPJqveQz+JLC40r975l1D/AMen2yKPzbr/AJZV1mpabpU1r/qPKk/561zfnX0F/ILCeKKSX93D50P/AH9qAPTP+Ce//BVD4p+FviXH+zn+0bfW1zcWv+jw6jLZyxfuv+WX72Wvoz48eR8Dfj7p/wC0n4c0qK90u/hl/tiWL/l683ypa/Lf9szwr/whPijw/wDGrwdBLHHLNFHeah50v+t/5619UWf7YF9r3wH8N+FdVn+3fZdNi+xy/wDTXyv+WtAezPrP9tLwtoXiq28N/H3wPqsX9oWt55cOoRfvPKl/dV8yftUft+/tC6bLceB4J9Nl0+w+yyXmo/8APWX91/01qx4c/aivtY+A+saHY332nS/Jlkhh8n/Vfuv9bXzH481LXNe/Zu8WfE3XJ4/tHnRW0MX/AC1l/exUB7Nn2p4J+MH/AAUK+KfgOz8Y/CvxVbXv7mKOaGKHzf3v/f2vnv45fFT4/fFP4q/2H+0X4bk0jxJo0PlWcUsMsX2qL97+9/e/9tak+Ev7Qn7VHwa+EHhPXPgDbyX0eqWdr9shis4pfKl8qKuP+I/x4+LfxO8ZW/xG+P3hWS21S1h+zfa/sfl+VF/mWsw/cmP4b/bA/av/AGRfFN5qvhyeT/hF7+by/tdpDLL/AOiq+gPHf7e37UH2DS/FXw5+Kd7qX2qbzP3P7yKX/VfuvKr53+KkM/jb4B+ILHQ/9XFD9ph87/nl5v73/wAi16R+xDpuleKvgZp+rTwebZ6XD5f2SL/Wy/uq0D2Z0HwZ/au/av8Ai18QfEmlT/FSWx1iKzikvLSGby/3X7r/AFXm10nhX9pz/goF8GfiDZjxVBc6vo1/efububzZYoov+WX72vmP4V+PPFXg/wDbX8UWMBjj+1ab9tm8qHzPNii//dV9eT/t7+APjl4I/wCFLX1jbabqEXlSfa/Jij/deV/6NoD2bNz9tf8Abjsdd0XwffedFbeJLDWIvJhtJv8AW/vYqy/2tPi18Rvid8ObefxV5UmjxaPFcfZPtn72KWvnP9t79kX4xfs96NZ/Gk+I49b0uW8ik027hPmeV+9/65V7x8N/gz8Rv2iv2ZP+Fm+D76K+uJdH+zTWn/TX/VVmP2VE5/8AZX/bM+MU37KEelWPiPyriKGWOH/Q5a6z9mn9uv8A4aK0a8/Zs8VeI/8AhDtQlvPLs5f9V+6/dS/6qWvmP4V6b4q/Z7+HOoeDvi3Yyx3EWpfZoYof+WX/AD1rvPGP/BLX9pL4hTR/tGfAif8A0i68qSGH7ZFH/wBsq0M/ZUTsP22P2J/2tvhv4IvPGMHxG1LxJ4flm/4mUPk/621/65f9+q+a/DfxU+NOg/EHQ/AEHxHvb23uvNks/wDplF+6/wCWVfox+x/+0H8Rbz4f6p+z3+2X4WliuNLs/Lm+1mL/AFX/AF1ir88/GGj6HoP7eGn+DtDvvt2l3+pSx2c0P/LrF5v+qoFSOk1/w38VPEni3VPEeq+PrmPT4rOL7ZD/AM9Yv/3tfJ/jyfSvhv8AG7yPPli0u/1LzP33/LKvtj4/alY/D2/1Cx0qf/ltF51pF/1yr47/AGzNBn8YfC+TxV4c+zRapYXkUnnf9MvKl/dVmaH1JZ2f9sR/8Sqfzbjzpap+TP8Ab/Jgg+zSRf66avP/ANlH4tT+JPAdn4qvoJJLO/h8zTbuvVIYYJbr/SIKB+0Znw6bfala3EBg8yP/AJ7VY0HTZ7OKP7B+6ji/11bmm+RZw3E/+qj8n/VVz/iT4heFfAdrca5qs/mW8X+uhioEXPGHir/hG9GvLj/hOL3TZLWHzLy7/wCWUsX/ADyr47+Nnx+1z4zf8Wz8HTyS28t5F513/wA9Ypa6Dxt8QvHH7V3jz/hAPAFjLZaP53mXnnf8vUVfYn/BPf8A4Jy/A/R9e0e+8f8A+s8mK5vPNml/exf88oqukaHhf7Gf7N+h+CbD/hI76xkuNUim/wDIVfVGm3k8P+vg/d16p+0J8GfDmhazpf8Awoj4ZX39n2EMsupXcsP+t/1sX/xqvK9N1KDWLqSCeD7N9l/dzQy/8spaVQ56hqQ3n73z57Hzf9V5Np/z1r1j9m/wrocN1qHjHXIPL0+L95Dd/wDPWX/nl/n/AJ5V43qWsQeG4o/t19FHeed++l/55V6J8Mfjl8HPFWl3Hw5uPGMUdnL/AMsov3f2WX/nrWtIzPA/2tPjBqvxy+KEnwy0P/j3+2S/29qEM3+f+mtdp4b17StN0H7DpX2nzPsfl+VNNX058OPhv/wTT+GOl/23e+I9Nvb3/WXl3d3l15steX/tRftCfsvePIo/hz+z3pUUuuSwxXP9oRQ+XF9l83/pr/y1/dS0wPnf9i34teT8afFngC+gitreW88yb9z5de+fFPz9B8JappV9PJLJf6bLHZ/6Z/0yr47+JGm65+zT8fbf4xaVpVzc2eqeVH+5m/6ZRf63zf8ArlX2xrH/AAUy/Yu174D3Gq6p4V/4qSLTfsUNpLZ/8vXlUGh8z+G/Fd98N/h9pfhw332a4ute/cw1ofHL4hT/AAZ/aW8F+KoPKkkutNijmmm/6axRVx/wTn1X9or4tf8ACf6rY/ZtD0GaWTyf+2X/ANtrsP2l/Adh8bLW3g0qeS21zRv3mm3f/TKp9kZ+0R9GQzT/AGC48R+FdDvr2zihi/5Y15v4w8Va54D8W+JPFWueHJYtU/s2KTTfO/55fuq4P9lH/gqhrn7Mel3Hgf47/DK51+z/ANXNNaWcXm+b/wCQq5/xJ8Zvi3+3J8ZLjxxoehy6Jocs3+h2k3lRy/ZYv3X/ALSqgPfPgDrA174Xx+MdVg8qS/mluYYv+mVbnjXXr2ztbeCf/Vy/67yv+eVZ/gizsfDdh/YcFj9mt/8AlztK4/4wePfElnLHpWlaHLLJFD/rqAOs+Fd5PZ69qmueHLGXzPJ8uzlm/wCeVdB8eNevvhjpf9q+FdK/tLzf+POKL/nrXN/A2bxH/wAIvcarrlxELyX/AJdP+mVemeFfBN98WrqOD/j20P8A5Yyzf62gDD+AP/CY/GzQrfXLHwPLbfvvLmi8n/lrXtnkwfCXS5ND0r/Sbi6/5CX/AE1/6ZVuabDpXw30WPw54NsYtNuIof313D/y1r57/aW/ai8O/BOwuNV1WC5lk879zL5P+ql/6a0vamZqfH79oTQ/g/4cuPEeuTxSxyw3UkMM03/LXyv9bX4r/wDBQL9tjxH8ZviXqEH/AAkfm+b5Uc2owzf62KtD9t79vDxx8a/Edxodj4jufs8Xm/2lNL+78qL/AJ5RV8t6xeWUJ/ty+n/0fzvLs4Zq0pUz1cNTNTwteT6bYahB5/2nT5Yf3MU15+982u8+APgjVfEksd99hlttD87/AEP/AK61X+Hvgn/hMbCz1WfSpf8AU+ZN/qq+pPhj8N/O0uzggsY7byv+XSH/AFUVelTpHPicT7E7T4M+G4LPVNPsQP8Alj/x9/8APKvpTw3o88Msk/2GPy4v+Xv/AJ61538PfAk81h/yCpPs9e+eFfBMEGn2cEE/7vyf9TXTTpniVcT7U1PBNnOPLt4IP9H/AOW1dxpumzwy+RBB5tvR4V0GDTLX/UV1Gj2WLr9x+6j8n99XUcJH4V037H/r/wDjzi/5Y11nk/6ue4/7Y1n6DZwTWufI/d1qQz/uvIoW5oSQ+dNL58//AB71z/x4/wCSTah/12tf3v8A21irtLOzOI4P3X/XGuP/AGhYfsfwq1SCCeOT99F+5l/66xV0Uv4xzVNjD/ZS+w+A/CXjz4xed5txYab9mh/7+xV4neXmq3n2j+3P3moReVLeTf8ATWvS/wBlj4j+DfDmvan4O+I83l+H9d077PLN/wAsvN82L/41WzrH7FvxGguvs/g7XNN1ez/df6X9s/1v/XWvUW5xUzn/ANlHxVfeFfjdp+lz/wCk2eqQyx6laf8APWKWKWub+LWg/wDCN/FDxBoeP3drr1/5P/TKLzf3Ve0fDH4HaV+zfqH/AAuH4t+I7KK8sPN/s3T7SbzJfN8ryvKl/wC/teD+N9en8beN9Y8VefFFJdXksl5D/wA8pZf3tT/y+/dmx9UTXlRw/vv38BqxNDmKSo7OaCztcGvJOwpzQ+k/+tqvN9nvLX/X+VJFVyaGeaXyKr/YxDayfuKAM+8/fS+dB/yyqvNZ+T+/n/5a1cmh/wBZ5P8Ay1qOa8n/AHdv5FAGXrH+qz/qv+mVc3rFnPeRfZ4IP3n/AD2rpLz7PDL5H+sklrLvBPD+/oA4/XtBg+1efYz+VXD+JLOD95pX2L93L/5Fr0zxJZwTWv2f/lpXJ+JLOf8Adzwf6yszQ8f8VeD9Kml8/wA+Xy4v9d5P+qrwP4kfD2DXpbieGCKOSL/lrD/zyr6k8VeG/OtZPt0/mSf8tvJry/xt4Vns9L/c2PlebRU2HT3PkP4keFfJijsRfeV5X+pmh/5a18//ABC8HQTS3E/9lR/urPy5pq+yPiR8N57yWTz/APVxfva8b8eeA59S8uynsfKji/4/K4atI9LDYk+U9YhsfCsv2efzZLOWHy/Ni/1sVbHwl+IWla9DcaVYz+VJYfu4Zv8AnrFWx488B2OpXWNJMvlxQ/vq8jh8KweD/Ecl9BqsltJL/rq4qtI7aR98fBP9pD+zdZ0uCx1W503WNL/eQy2k3lV+sH7EP/BT6fxtpdv8MvipfeVqFrD/AMhGG8/1tfzr6b4q8R2es6WZ76TzJZvLm/0yL/VV9KfB/wCP194J1S3+3TyW2n2H+p1H/nrLXMaYilRrH9Ld34j+Gfxf0GPwf4j+w3Md/D++hu/Kk80V8Eftmf8ABMfXPgzf3Hxc/Zsgl/s+1h8zWNJtIf3sv/TWuL/ZF/b88Oalpdv4c+Kk8Utv9ji8m7tP9bX6YeCfHnhzxV4St/sN/bXtvdQ/vrutKf73c86pSrYQ/Gfwf8SINetbjQ/EfmxXlrN5f+l/89a6C8hmmljsJxbfuv8AnjX3R+2l/wAEvPhx8fvtHj/4c2Mmm+IZf9VLaTReVLLX596xpvxG+CfiOP4c/GLQ7mx8qb7NNqM0P/PL/lrWXs0duFxNKsV/ido8HiT4X6p4OuIPNjupv9DtLv8A5ZS1438Mf+EqvNG1D4Hz/brbVJYfL027l/1VrX0JDN4V8SeXfaVcfaY5f3flUf2lcQ3XnwWNt5n/AJFrnqnbUPnvwr4j+MXwx8XXHwPvoLny9Zm8v7XF/wAsov8AVV6R8codKh/Zp1jwdY/ZvtFrDF++mh83975vm13H2O+1LWf9HsbaW4i8ryZv+eVZfjz/AIRzTbD7dPB5t5FD++tPO8rzZagyMv8AYV/4KxeDv2XbW38Oa54OlubeWzitprSWbyvK8r/lrXtnx9/4KQfA/wDbM+H158P9K+Dv2bUL/wD5iP7qXyv/ACFXh/wr+G/wk8eWsc/iP4ZWXmXU3/Ey87zZPK/79V1GpeFdD0fVI9D8OeHI7aO1/eebDQZmPeeG5/Df7PusaHfWNtFJdWflwzQ2flf8taw/2S/j9Y/DHWbf4ZeI9Dktrz/Vwww/6qX/AKa12nnX15dR2/kfaf8AplNVizvLGG6ksdc8OW3lxTfubv8A5ayxUB7Rng/7QmpT/BP9paPxVYwXMlnLpv2mGWL/ALa/uqz/ABhoP/C4NGuPjH4H0q5srzzopJov7N83yq+kLzXrHUtPj+3aHbSR+T5fkzf63yvNrPm1Ky8N3UZ8K2NtbR+dL9s83/VS0AJ8Gf8Agoz4i8efAO4/ZL+O/gbUpJdQgli07UZdS837L5sXlReX5sVeUfB/9ur9pr9hXxHqnhzw74V1fUtHtZpY4bS7hllil8397XqE0Ph3XvL13VbG2kvIv3kPkwy1X8SalcaldW/nX37vyf30MUPlf+jaDKl/GODvP2kPib+2B4okn8ceHLnTY5f3nled+682X/plXUeFf+CjX7c/7K+lSfDmDSYtX0OL95DN9j82WpLPQYJv38EHmyf9Mv8AllViGGez+0QQTy+ZL/02ioOn9yefw/tpfte/tFa9eT339pW1xf8A/IYu5fNitfK/55eV/wB+qw/jbo+ufB+bw38RvCsFzc3kXm/2x9k/5a3X7r97FXqmsf2VZ6N9hvoPL/57TfY5ZP8A0VUfnf2xo1npXkRfZ4of30U3/PWgzK/gnwH4x+LXgj+3PGV99m1y6/eTed/y1irg/jx8Db7/AIVp4gsf3X2f7HF+6i/1sUvlf62vTJrPVdHsLeexnliuJZv9TWxrGmj4h+CNU8Har+6kl03/AF1AHyX+wH4k/wCEk+EEmlaVP5tnYTRfY4f+eX/TKvpyzhns7WScz/6RLD5k3nV81/8ABOWa48K+HNQ/tWwisre6/d+TN/yyrU+M/wAfr6a/uPCvhzzL68/5Yw2n/PKgPZs9U+Kn7SHgf4Y6D599qttcyS2cskM0M1eJ6ZoPxG/au1S38+eXSfD/ANs8zzYf+Xquk+Cf7K9j42v5PiN8aZ7n7PLDFc2eh/8ATKvpjQdH8K+D7CPQvB2hxRWf+sh/6ZUAcP8ACXwr4O+Bl/o850qK5s9Gm83UpZof9bFX1p+0J4P8R6l4X8H/ABw/ZXvorbyvKvZorT/llF+6l8rzYv8AVV5v8Jfj98D/AAf48t4PjhoflaPdQ+X+5h/1v/bL/W1qeJP2qf2ZfAcWsfDL9nOfUr7w3rPmx/a5fN/dS/8ATL91Wge0Z9IeCf2qPGPwf+HEfir9pP4jaJ+9s/32n+d/pX/XLza+W9S+JGh/E74ta5448D6VFFod/NLJDDd/89a8X/4Z0sde8Rx6r4j8Y6tqVvFN5nkyzf8A2qvYNBm8OeG4rfQ/Dmh+Vb/8tppaDMseJNB0Pxtpfka5Y+ZH/wAtpZofMrzPWP2KPhzr11JfaH4xvrL/AJ7Qyw/af/IXm16Z/aUGpRXHkT/u4qrw3nneX5E/lR0Aed/8MT+FfsEc8Hj++uf+uv8A+9/dV3HgP4J+HPhjFJBBPc3Pm/67995kvm/9da6iz1Kc6N9ung/0eo/tfkxeRB+9rQCv4w8N+HNetZNK8R6H9u0uXyvOilh82XyvKrg9B/Yt+BEN/JPfeb/ov7z/AESb7Nay/wDbKvQP7S+2Wv8Ap37vyqp3mveda/bp/KijioM/aIsQ2fgfwrYR+HPCtjFbWdr/AMsYf+WtRw+feXUfkXEnmRfvJpopvL82sv7YLyLmfzZK2PCtn9ju/P8AI8vza0My5NZ+ANYl+3eI/B2m/aLr/XS/2PFc+VW5ZQ+HMW/9h6HZW3/LOGH+zYv3X/bKufs9Hnm1D7DP/wAe/nV1lnMbO1/0Hy7aOL/ltNQaEes3mqwX/kTz+bHLN+58r/llWfeax50PkQeb/wA8/N/561oaPZ6548luND8HT/bdQ/5YxeTX0J8E/wBmO38HaXb+OPibBFbXF1/qdOrmqgcX8DfhL4j8SWEfirxHBHY2dr+786aH/W17RDZ2Oj6X/Yfg6xjks7X95R4q1+xs4bi+8i202O1/57TfuvKr4f8A2zP+CkGh/D3Qrzw58OfEdtLJF5sk03/PWmL+Ke6ftOftXeDvgb4XuJp9V+06p5PmeT53+qr8f/2xv+CkHxb+PE2qeHNK1zy9Hv5pY5pYv+Wv/TKKvH/2lv2lvFXxy+IMfhyfXLmKzv5vMmu/+eX/AEyrg9Yhn8HxXFjPB9p+1fu/+uUX/PWkqRrTpGPef2VeapJPrl9L5l1+8h86uo8N/B+x8a6pZz6rZRy28X7zyvsfmfva5v4b+A9c8VeLfs/k/wCjxf8AH5LN/wAsq+qPhj8MbGKKz+w/vbP/AFc01ejSpmtWr7GiXPgn8MZ9Nlt4L7y47iX95532P915VfRnw98KnX7SP7DYyRW8s3lzTeTWX8Pfh6IfL0rSv+XWbzPNl/55V7h4D0G3h1S38/8Ae/8ATGKvXw1M8irV9qbnhuHVdNsI4PIlljihijm8qH/VV6J4P02eby54B5ccv+pqPQbOCzv4/Pg/d/8ALaKuw8K6DB/pE/8Ayz879zDWpwnQeG9Nn+y8VsWcM/m/+0qj0EGGL7OK2IdNE3X/AK6UGZJpsPnxefB/q6seT5VFnN50v26CDyo5f+WNbH9medFQBJZ+RD5d8PMrl/2ioYJvhBqE/kRfupopP/IsVdRZ/uZvI/5Z1yf7Qn/JL9Uz/q/3X/o2tKP8cyqbHzP/AGb5N/5EE/8Ao8sPmQxS/wDPWvdPhv4P8D6b4Xs9W/4a9ufD8mqabF9s0m0h+zSxS/8AgV/01rxOH/XeRcQeb5UNdppvwB+MWpaXHquleB5bm3l8ryf31etU2OakejL+zV8NviH4ot7Fv2rV1a88qWSKEaT+9lliH/X1/wA868R16zg0HxRqmh2Gq/bY7W8lj+1/89f3v/PL/llXrHwT/Z0+MXhv4g2euar4V/si3tZvtOpajdzRf6qvO/jBeaHqXxa8Sar4cg/0OXWLqSGX/rrLWeGKPqD/AF3+vqO80zyYo/IqSDvUn2vyZf3H/PGvNOwrzf6HL5/+t/6Y1Xm8+z/cT/8ALX/ltVjz4Psv2jP7yq/k/bIvsPn/ALv/AJ7UAU7yafpVOaz/AHtank9fPqv5H+s8+gDH1Kzg8riCse8h8n/QP+etbt5/rR9aim0ztmgDj5rK4/1/kebJF/rpqx9S0exvIv7Vg/1f/LaGuwm02eGL/P72svUrMQ/uILHy45f9dQaHm+vab50txYwf9tpa4PxJoP8AaVrJY/8ALSKGvXNSs8S+RXH+KtB87y/IoA+f/GHgP7YfI/1flf66avG/FXhWxnv7yD/lpLD++r6s8YeG/tkUkB/dyf8ATKvL/HngLSryK4vp4P8Aj1/d1y1TalufFfxI8Bwabpd4dKsYpZIpv9TFXifxI+Hp+y+fqsEUskv7yb/plX2h4q8N6VZ3Vx9hg/ef88a8T+JHgOCb7ZDPBJ5cv7yaWauKpTPRpYk+M/G2keI9N8WaX4j0rVf3d1/qYv8AnlXYab8TvHE0tvoeq/vdPtf+/tdp42+G4+wSQQWP7y6/eedF/wAsq8z17w3qtlF/ZcE9zJby/wCutIv9V/21rmO2nufQHwe+P3jH4e6pb6HPrn2mz/1nkzf62v0k/YC/4KieI/hjF/ZX9uR634bupvMvIZf9ba1+N/wl8SarqXhySxn82yuLCb9zaRTf88v+mVd54D+IXivwr5niPwdfXMUd1N5mpWkOpf8ALWuOpTrJmlT96f1T/Aj9oT4cfGzRY9V+HPjC2vvtVp9pvIvOl/c/9MqsfG39nD4L/tN+EpPDnjjwpZGSWL9zdj91L/39ir8BP2S/+CgeueD9Uj1WDxxfabJF/rtPu9S/4+pa/VT9kX/gqV8P/iSLPw34xvZPD+oSzeXDD9s8uKWWtFUPOq4Z0v4Z8/8A7V3/AATm+Pv7NPiS8+I3wysZdb8L+T/qoZv+PWvJ/Cvxa0PUvL0PVdJvtN1SX/XS3cMX7qv2o8K+NvBHj3S44IDZXtvLD/yym82vnP8Aao/4JX/Bf486Xef8K6Ft4b1S/n+0TTadpsX+t/6a1pUp+1DDYn2T/eHwfo+sQQaz+5sZY7O1/wBNm87/AFsv/TL/AMhVn+JNHsZr64nnsYpY7r95DNNUfir4DftDfsuyx6V4/wDB19c6fFN5n9ofY5fKlqPwr480PxVJJpV9PFFH/wBNv+WVcVQ7faKsSeCdS/se6uLj7D9mj/1f7n/lrVy81Kf/AJ71JpvhzztBvNV8/wC0x2s0sdn/ANNaj1LTZ4bCO/8AIl8uWsvZh7Mpw6x5P7mf/lr+7hmhrQvJv7S8uD91J9l/dzS1T03w3rmsRSX2lWNzJHa/vPKhhqP+x7688R4t7GSP9z5k1UZhNZ33myefbxeX5Pl+dXN3v77VI9Knn8yOushsz9lkngPm/wDLP7J/y1rL03wT4q1jXriCx8OSabJF/wAtpa0Auabpv9pXUn9leVFcRf8AbP8Ae1nww3H9l3F9rlv5tx53779z/wBNa6iGGx8Exfbr7Sv7SuIv3v8A21rD03Up9YtbzVft3/H1/rtOh/5ZfvaAK+saxfabYSWNjYx/9doaz9NvJ4f38E/7yX/nrDUniSz86/t/3EltHLWhZ+HLiGw8/MfmedWZmZevCebRpLKGeXzJZqsaDo/+s8/93cedXSf2D53l/Z/+e3mfvq0LzR/JtY5/sPmyf89qDQy5v30X+n/6yWHy/wDU1Y03TZ7Ow/sqDyvMi/eTTS1oQ6PP/r4L6KT/AJ7f9MqsTab/AGb/AKdB5kv/AE2tKAPnvxt+zHP4b8XSQeHNW/d6pZ/vrTTpqufCv9m/SvB+qSeI/EfhyX7R5P7mab97XtGpQ6rqWqRzz/vLzyfLh8795R9jvvKjsL6xtrmSX/pjQHtTD03R57OXH2GWXzZv9dVj+zTZyyWNjPJJ5v72tSbTYNNtf9HMUX/PbyYaNNs4JrWOC3g/1v8Ay1oA5fWfDcHiSWT7dY20skv7uaaWtCz+GPg7wT/xVWlWMctxFD5f2Tya3NS8K2M0X+gz+VJF/wA8qP38M0f27zJfK/1PnVoZhpsE8P2exuP3X/LSrH2OeHzP3Hm2/wD12qPTZp/Jk8/97JL/AK6pLOaeaW4g8+T/AFPmeTDQBoWemz6xFHY2NxF+9m8uaq+sabceD7+z8Oa75scn+shm/wCetU/7Zn0eX9wJY7iWaL/tlWpr3jDVfFVhp41yeKWSw/8AItX7ICT+0v7N/cCDzZP+fStTR9H1zV/39jBFJbxf8ta5PUryD7f+4nl/67Vc0fxLPDo39h2PmW0cv+ulrUDQ1g3FnrMlv/z1/wCWNZ/9jwG6+w33mx+b/wAtquWd5fal+4vrH7TJFD+5lq5NDBD9n8++/wBV/wA9qAMez0e+s7vz/I82Pya6DR/I+1R/6d/zyk8mpIf+JbLcfv8Ayrf7H/y1rQ+Ffwl+Kvxm1SODwd4cuYrf/ltdzQ+XF5VBy/wSMaxB9lj+wzx/aLr/AFNdh8Df2e/jT8eJft19pUVjocs3lwyzTf8AkWvoD4M/sE+APhjo0eq+P/8ASbyKb9zXpGu+NtK02KOx0SC2tre1h8v/AESbzIov+uv/ADyoD2tzm/B3w++C37O2lDwtpIj1LxAR5f2qKD/lrFXN/Gz4/eFfh74WvPG/jjXJJJLWH/j0hryP9qj9vD4LfBmKT+ytVsb7WIppY/tfnfuv+/tflH+13/wUO+JvxO8W3lj4V1yKO3/57edWVSkd2Gw37o+kP2zP+CiljeWP27/hKr6x/tT/AI89Dhm/1UX/AE1r8y/j/wDtLX3jzVLPXZ/tPlyzS+Taf6ryv+utSeJNY0rUpbzxV4q1zzLzyfM83zvN83/rlXl/9vHxJ4k+3T6V5Xm/6N5X/PKL/llRTpGtOkamvS32m2un319+8uNU/eQxV0Hw98B+MNeluNV8R30v2e1h8z/rrW54b8EX3iS/0/VdV0rzJLCHy7OL/llXunwx+G8EsUcMH+gxxfvJv+Wvm13UqRlUqlf4b/CvSrOKSG+g8rzf9T5Ve8fCvwHBD5eleR/qof8AVVJ4P8H2Nn5dlY/6TJF/z1r1Dwr4Pns5Y76eCT7RLN+5/c120qR5GJqnUfDfwTfaxpccE8HlSWv7uGvTPCujzw3Uc89jF9oi/wCW3k1J8MdB/s37PPOfN83ypK9M8KWdjDFJ5EH7yWuo4iv4b0GDzJJ5/wB7J/yxrrNH0aeG6j/6a/66qem6P5N1/wBM66Sys5xF+/8A9ZWgGpo+jwTSxz5rQ+x/6V9n/wCWdR6bEIfL/wCedakNn+68+CgCPTbPzv3/AJH7ytTyZ/KqOaYQy58ipPO8n/lvWgEcMM/lSTzwf9cYa4/9orz/APhVV5DP/wBMpP8AyLXYQzX0N1Gf+Wlcf+0VDPP8L9Qnn/5ZTRSf+RYqKP8AHMqmx81wzedLHP8A89f3ddppvxr+Jum2EdjY+OL6K3i/1MUM1cXD++l8/wD5aS/8sakh/fRRz/8APWvfWxyHUax8Zvip4ktZNK1bxxqUtvL/AK7/AEyufns/+W//AD19ajhh/e/88v8ArtUk13/ywpmh9cf2bPD1nqTyeP8ApnUn+kf8t+tRzTV8+dgfY/3v2H/nl/qar3n7n/7TViab91VfyfI7+ZQBXhm8+Kq83n1cmh8iWq/kz+bQBl3g/wCXGCg/6mOrk1mfNkqvN/of/XOgDPvPIz+/rLvPIx/y1rUms/Ol8iD/AFdR3ln/AMu//kagDk9S0f8Aex1y+vab5F3J5H+srvLyDyopK5ubR/OEk8//ADxoNDzvX9BgmtZJ8f63/XVwfirw3/y3gg8y3im/0zzq9kvdMnhi8jyK4vXtN8mwuNVgPmafL/ropa5qlPUPaM+X/FXgOf8A0zVdcgi8vzv3MNp/ra8z8beCT/r5rGX7P/rZvN/55V9SeKvCsFnFJqvkf6P/AKuavO9e8N+d9osdV/exy/u/Nl/55UVKY6VU+N/EngP/AEWSxg/1cs3mV438QvhvBDdXmqzzyW1vdf6nyf8AP/TKvsjXvhvY/ZY/s8/mxxQy+TLXkfxC8E2P2W30O+sZfsd1N/ocsP8Az1riqUz1sNiT5b07R76GK4vvI+zXksPlzed/qvKrkz8Qtc8N39vb2MEn9n2v+ph/56/9Nf8AnrXuHjzwfqs2syWP7qP/AJ7eTD/yyirzvxV4Jt/Nt57HQ/3kv/kKsTt9ozU8SaxpU0Wj+MfAF9FHJLD/AMTLyZv3sUv/AG1/dV6J8Gf2qPFXgPVLeHxjPc3Mf2yLyZof+WVfPfiTTZ9B0uTVfI/0eL/llDVP4ZfFOC81S40vXIZPLlh/0P8A6606lK6A/bT9kv8A4KieI/Af9l31jrkupaf/AM+l35X/ALSr9M/gn+338HfjBpdtfWOrW1tcanDF9sh/e/upa/lQ8H/E7xj4Juo4NC8VfYfKm8ya0mmr6k/Zv/4KHf8ACH3VvBqt9c6b/wA8ZZpvL82WuKp+6CpSo1j+mfxXpvw7+JHhyTS/G+lx3uny/wDLWaH/AFVfLn7RX/BID4V/EnS7jXfg9rd1pGqS/vIRFN/rf+/tfN/7K/8AwVX8VDS4/DnxU1yXUtPl/wCXuaGKvtz4G/tjfCvxvDbweFfGNlfR/wDLaGa8/exVpTqUTzqlKtS/hn5t/Fr9lH9rb9nW6vNK1zQ9SvvD/wC9j820+yyVy+g/EiDzbPStVvpIpP8Alt53/LKv2/1G30LxRpYgvdKjvre6HmQ5tY5Yq+c/2hP+CWHwH+MFrcXGh6VbaJqEsOPOtIfK/wDRVZVKYU8S+p8EaD/as1hcX3hXxVJFH/rP3XlfvYqks9evtMtbjVYDJJJdTRfuZvKrqPjB/wAE0/2tvgbayQfCueXW9Pi/1MVpD5v7qvD/APhYXiP4e+I/+Ec+Juh/2bef6ub7XN+9/wC/Vc/sjo9qj1TTfiFY+VcQQeFYpbi6/wCXusPWLuCG6/tWfXLn91/rofJo8N3v/CSaDeeI9Dt4pI4pv3PkjyqNS02fUrWT7ffRRyf+jag1KcPka95k/wDbkcccv+pimqxo/g++vIpIIIIo44v+WsVZf/CE33iS1k/4RyxkuZIof9b/AM8qNHh1Xw3L/YVvrksflTf6Z++/6ZVoBJN4PGpa/wD2HBfSxxyw/uZpv+WstbE2j65Dpceh6rY+VcRfu/Nrn/El54r161t77Q77yriKrmm+JNcs/wB/4qvpbmT/AJbedNWZmbGm6PfebHYz/vbeugms/O/1E/lyWv8AqYZf+WtY9nr39m3Uc8//AB73X+p8qtT+3v3seq3Fj+8ivP3Pnf8APKgCvDZ39nL9ung/4+v9dDWhpummb/QYD5Vv/rIZZqLTWNKvJbeeCe2/e/8APati8+w+b+/gtpP+uM1Boc3/AGbNpv8AqIPMuP8AnrViaznhl8j/AFskv+pm/wCeVWNSmnhizB+6jqOzvILywt4IIJP9d/rq0ApzaDB5UkEH+s/5bf8ATWq9nDBZ+XUn+nTeZP8Abv3cU0v7mo4byC8tfPgg/eUGZof2nYw/6+COs/XrOC9i/wBB8yqd5Z/bIvP/ANVWpBZ3037+D/ll/wAspaAMOG8+xxfZ/wDlpRpuvX1nrP26D/l1/wCWX/TKrF5oM8Msg/8AI1Uzo/k6pHPPP5sl1/zxoAr/ABD8Vf294uuNc0qDyreX/XQ/88qk8Hw/bLr9/P8A6PL/AKmrmm+D4JoriC+nito5f9dD/wBMqsTabBo+l2+uWMH/ABL/ADvLhro9oBc1LQYPtXSjR9H+x2snn/vY61NH/tzxJ5f/AAh3hyW91CX935Pk17B8N/2A/jf8QRnVr+x0SP8A55edL5v/AKKoMfao8DvPEmh2dr/oMH2nypv+PT97/wC0q7D4b/AH44/FS/j/AOEV8K3MVnf/APLX91F9l/7+19ofCX9gn4H/AAUlj1bxTBFqV5FD5k013Z/uq9fg1HwroNtJongHw7b/AL2HzMWkPlUB7U+dPg//AME7PDng+2t/EXxb1SO+8r/XWnnS19AaB/whHhS1j0rwDpVtbW/k/ufsn+t8r/trXm/7Qn7RXg74P2Ed98RvFX2a4l/10MU37qvzz/bM/wCCt0/hv7R4c+FeuXNtbyzf63T5v9b/ANtaB06XtT7Q+P37Zvwd+G9/eT+OPGMn9qRfutNtLSGX97F/01/5ZV+c/wC2l/wV68ZaxLeeFfhzBFpGny/u7yWGH97LFXxn+0J+2Z8VPid4jtzYz31t+58uaa7/AOeVeF/EL4hX2gxSarrl9c31xL/02o9mjtpYakdh8VPjl4x+JF/9h1XW7n+y5Zv9M/1X72L/AJZV4/8AE7x5qumxW8HnyxyRf66KXyv9VUcPjyDXv3F9Y/Zv+eM3/PWrH/CEn4hapb+I9VP2mS6/d+V/1y/e100qR01KliSbXv8AhKtGt7+x0P8A0zyYo4bT/wBq13HgP4DwfarPzp/NuIpvM/661sfDH4VmG/s76+gjto/9XN+5/exf9Mq9w8E+D/sd1Hqs2lRR/wDLOz/c/wDLWtKRzVKhT+HvgPydGuDn/SPO/c17Z4D8H2MGl2dv9h8yTyf31R+CfCvhyaXz7D/Sf+e0P/TWvWPB/gOeW7j+wweX5tdtJHiYmqanhXwRBZxW8F9YxS3Es3+uhr0jTvhvP/bGnzwT+bHF/wAsf+2VHgnw39jlj/tWD93a/wCpl/5616hpvhu+mMeufuv+uVdRxGf4V0e+m8vH7r/Q4q7TR7Of/l3go03TPJ1SOeCD/rj51dJo9nBDLzB+8loAks7Pzq1IbOeGLz8VHDD9j/7a1qY8mKOA/wDbagCxZzT+VgVoWc0+fIqnDZzw/wCg5/0f/ljLVjTIf9K/0Gf/AL/UAHnfbLr/AJaVoYn8rz/3f7qo4QLOWO3ng/eVYmmg+yyfuK0AsCGCaL9z/rK4z9oP/kkGqfWL/wBGxV19l5/mx1x/7RX7n4S6xfT/AOr/ANF8mKH/AJ6+bFWtP+OZVNj5jhh/ffuP+eNWJbPyZZPt1jJH5v8Ax5y10nw3+D/jH4qX9xofhWD/AImEUP2mb/rl/mWvaPjB+yv8TfEnhLwfD4c0Oyjk0vQfL177J/rZZfKi/wCmX/XWvW9r7I4qZ89wefNdfaPI+0yf8+n/AD1qO8h8m66/9sf+eVe3/Df9kf4z6P430vxH4q0yx03T9Mm+0ajdzTSyfuvK/wCuVeWfFTUvDl58Vdcn8N/Zvs8upXX/AB6f9daXtUbH1RN+9qvDZ+k9SeT5VSQd68U7CvP2qn+//wCutWPJnhi8gn95Uc32j/UW4/ef8tqACGaD7LJ/pFRzTQeVHRDCfsklR+TB+7oMyPyf3tZ80Jh/cVqcf8t/9ZVeGGea/kgngoNDDvP3P+o/1dSTf8s/+etan9medYefVOaE+bHQBj3kPnRSfuKy5tNn8qPz66Cazn/efv8AzKy9Shnmijhgg8ugDn9RtP8AWZ/7Y1wesabP+81X7D/pH/PGvRNShnvIvI/1dU5rSxl/5d/3dZgeR6l4bg+wfYdVgl+zy/8Ao2uH1jwfb3kXkT/vY4q901Lw2Yoo/In82P8A55Vw+saDYw3Xnmx8qTzqVTYD5r8YfD2fTbX7DBYyeX/6KrzPxV4PuNNik/8Aa3/LKvqTxJ4b1a8lvJvs/wC7l/1NeZ6x4Knm8zyIPN/57ebXFUOmnUPkfx5oMH7ueCx/5bfuZf8AnrXl/jzwHPrGs/bsyxRxQ/uYa+vPFXw9g+1SCxgj+z/8sYa8n8YfD2CaWS4nsaPZndTqny/rHg+fTf8AQfI8z7V/yyrj9e8HWN5YSQfYf9Itf9T5P/PWvoTxh4Dnhuv9HsfKuP8AljXn/iXwHBNdf9NP+W0tZ1Tp9ojwfWNen8Nwx2Wq2Mn2i6/10tXNH1jVfsEl9B5cUn/o2u88bfD3+0jHBB5X7qH/AFtef6l4W/seKOczyyfZf3c0Vc3s7mlKodp8MfjN4q8B3Ul94Vnto44v3c0M1fUHwN/4KKX3g+6j8OeP59Ssf+WkN3p1fCfiQT6PfyTz2P8Azy8mKKauks/FX9saXJP58UlvF/ropf8AWxUvqqOn2h+5n7KP/BVzVbOw/srXPEf9tx+TF9jtP3vmxRV96fBn/gop8I/iFHbw6Hqv2KSWby5otWm8qv5V/AfxJ8R2d/Hqvg7xHc2OoWv/AB+ebNL5XlV9CfDH9ur4neG7qODVZ4rn7B/x+TWlZ/wjL6sqp/VhpvjbStehjNjqum3NnLD5nnRTebXPfED4S/B741QDSfEumW19HCP3Vr/zzr8KP2e/+Cyd94J+z2P/AAsDUv3X/Lpd2cVfanwZ/wCCsUHiq6j+w6V9puJf+W0U0X/x2j2hxfUj3/4j/wDBJj4ZXsmoT/CvxHc6JJdfvP3sPmxV84a9/wAE3/2k/g/r327Q/wDif28s0vk/ua+xPhv+3H8MvElhbz6r4qj02T/ltaXdeseG/i/4c8Sc+fbSW/8AyxmimrVU6Rn7Ssj8g/G3wx/aM+GPii4mg+GWtxSS/wDPpDL5VY5+IfjKHVJLHxx4OubGOX95eQy2cvmy/uq/ayC78AeKZvImsrKXyv8AntZ1j+Kv2dfgh42lk/4SPwBpssn/AD18ml7ISxrpH5H6Pe6HrGjSa5PfRWPlTf8AL3N5dV7zxJ4c1KX7D/bmmy+b/wA8byKv0s8Yf8Ezv2UPGEUkH/CDyRfav9d5WpXX/wAdryPx7/wRE+DmrzCbwd4wvrKOOHy/KlmrP6iP66fJeg+FfO8ufEv2P/plD5tah06Czi8icSySS/6n9z5nlRV6R4q/4IrfH3TZpB4A+LdtLZ/88bvUpf8A41XP2f8AwSk/bu8HxSDQ/HHh+5ki/wCeN5LJ/wCjYqKmG9kdFPEo5ezs7GG1j8OXE8Vlbxf9Nq6SHwT4c03QZNcsfGMtzJ/q/J87/lrVjTf2Ff2ttB0u8/4THwBJe6hL/wAg2WGaL/W1lw/sl/8ABQqz1SS+sfAEttJF+78n/RZP3v8Az1rP6sa/WaJTvNN+x/v/ACJZap/2Pfal5k9v+7k879z/ANNa0Jv2Rf8AgoV4qusa54ck/wCuP+ix/wDoqug039hX9tKbRrexn8K/6R/yx/0yKsvqw/rNE4/Xry302wt9E1WD7NJ/y2mrHmn8m1jzPFLZxTfvpopq9Ms/+Caf7XvjCKSDXPKtv+Wc0M15XceG/wDgkN8Wpo/O1X4jWsUfk+XNDLN/8ai8qtaeGOWpiaJ8/wAWvaHDL/oOq23l/wDLH/TP9bW5B428K2f+ned9pk/55Wn72vpzwp/wR08GwwxnxT4/uZbi1/13k1634A/4Jzfs6+B1jN5oB1SX/nrdXkkR/wDIVafVjL6yfnx/wlN9qXiOODwr4cvrmzl/10Xk11ngP4G/GLxtdXkFj8Ob6OP/AJY+bDLX6WeG/gb8K/B8PkaF4Asbb/pr5Pm/+ja6QQaJpo8+y0y3jji7xQ1p7Mz+ss+B/B//AAS28ceJIre98V6r9iki/efvoa9o+GP/AATY+FfhW6/tzxjfXOryRQ/8ekVe/wDiT4heHNAtZNUv9cto44v+WUs1eT/Fn9vv9l/4VeHZNV8Y/Ei2t/8Arl5slZ+1oh++rHpvhDwf4I8HwxweE9CtrYxfu5RFF5kkVT674r0PQbCS+1zxHHZfuv8AU3d5FX5mftC/8HAfhX4exf2V4Ag/tLzfN87UZrPy6/Pf9oT/AIK3ftJ/Gy/kvtV8c3P/AF6RQxRf+iqPaGtPDM/Yz4zftyfsd/A25vL7XPFVlq2qed5n2S0vIq+E/wBrr/guRrnir7R4c+EljbW1vF+786Lzf3Vfl34k+MHjjxVdXGq+I9dlik87zP301YfiOa+gtbi+/wBG8uKb7Tef6ZL+9rOx6NOl7I9Y+Nn7Znxi8eapJrmueMfNkl/5e7v/AFteF6x4qg17WftE8/2m4l/10s1cH8TvG2qzapHY2Q/0eL95WhoN5Br1hb/Yf3UktdHs2BTm+LMH2/N95cUn/f2tTUtYvviRa28EGlSUeG/gnBeyR+R+9uPO/wBdNXrng74YwadLb308H7yL/llFWtOmHtGef+D/AIM2MMsl9fQXMlx/yxim/wBVFXuHgPwfBZxW889j5Un/ACxihrc0HwH/AGlLHPfaV9mt5Zq9U8H/AA8gh/ceRHLJ/wAsa6fZnPVqmH4P+Hv7q3vp7Hzf33mTf9Na9c8K+FZ9Su5L6eD/AEiX/XQ/9MqueA/h7Y2cUf8Aatx+8/55V6x4P8HwabdSX3kf8sYo60p0zhq1STwH4J0PzfIgsfKjih8uvSNH8CeddRz2E/leVUfg/wAKwQ3X+kQf8tvMr0TQdN8mWTyIK2OEPDej+d9ngsYP9Di/57V2lnoUH2rz4J/MkrL0fTZ4Yo4J/wB1JXaabDP5Xn+R+8/1VAEkMP2yGPz/AN55X/PKtTybjyv9B/d0Wdn5MX2GD/Wf6yaj97WhmaGmwwQ+X58H7utCGH7X5kH/ACz86o9Oh/0Tz/8AWSVc8kf6/wD5aZ/1VAEkP+qk0r/lnF/qaITBNFic/wDLapPJ/dRz5/1tWIbPyZcUASTef5sf/POpZv8AU/hUXnedFUfmzetaAWIRP+8/0iuP/aEm8j4S6h/26/8Ao2Kusri/j9+++Eusf9uv/o2KtaX8cyqbHzvDeX2m3UlxoV9cxSS/6799/rYq9w8E/Dj4qfGbw5o+ueMvipbaJZ/6vwfLqP8Arb//AMi/9cq8Lhm8jy5x/wA9q+hNY0HVfGF18J/GPg2CS+8P2H2W21KG0m/48JYpYq9Wpsc1I4P/AIVXrmsfF+8+Ds/j/wA2SL/mIXcP726/debXn+vaPqvhTWdQ8HarPJHJpd59m8r/AJZfuv3Ve8TfDHxV4q/a01DxHY6VJY6Ppd5Fc6lqMs3/ADyirx/4zalBr3xV8Qa5YT+bb3+sXUlnN/0y82opFH055P8A08UedPD/AKipMf8ATD9aIZv+e/8Aq68g6AqP/VRfbvP/AHn/ADyo/f8A7yD/AJaVJ/y8x0GhXmgn82TyP3fm/wCuqv8A6D/yw/5ZUXnni688T0Q/vj/qP9bQAQ/uYpPP/wBZLWfeefN+4gP7yL/XVqf2bcQxfYJ/3v8AzxqObR5/K8+b/ttQBT86CaKOewH+j1X1H/j1/CrF55EvFj/36qnMJ5ov+mcX+uoApzXnv/qqp3n779/Ugs/9Z/01o8n7FF/z0joAp3kPkyyeR/rJax7y8gEvnz1uedP5vn+RF+9rPvNNg+1YoAw5poJorif975kX+prm9e0efU5Y5/IjrtJofOl+3f8APL/ljWXeQwfav9RF+9m8yuc0PN9S0f7IbiCfzf8AtlXn/irQfJtfPNj/AK2vbNY0HzrqT/WRyf8ATGuP8V6D9si/sr/VSRTUGtI+e9e8KTw+Z5FjXB+MPAcE11/oMEVz+5/fV9KTeFJ5rq4n+wSy/wDLP/plXn+seCTZxSX8H+r87/ll/razNfaHyn4w8H/6fb3E48v7L5vkxV5vr3w9+2D+1YNKijk/5Y/ua+tPEnhXzrqS4n0n/Vf6muD8SeDp4Yo76Cx83/pjWZ0U6h8j+MPhvfabdR2M99L+9s/N/wDItcP4q8EwQxef9n8238mvpzXvBN9eSyWMB/1X/P3XB6x8Pftl1cfYf+PfyfL/AHtB3e1R87+NvAfk2v26+sY7n/ln5Ncfr3wxn0eLz/DmuSSRy/vJof8AnlXvmseCZ4bWT9/9pki/10v/AC1rHm8K+fF5/wBn8u3/AOW3m0B7U+eINN8U6Pc+dpXm3Mf/ADyro4fEnk2Hnzz/AGK4tf8AkJf9Na7jUvAcF5dSf2VPLbf88a5vXfh7BNpcdjN5vmS/89f+Wtc4GfpvxCnvLu3sZ4Pt377y/Jr0TwH8YPEfhvTI4ND8calpv2Wb9zLaTS142fBWq+D7/wC0YuYvK/5bVc1fxH4is9NiENl9ot4oZfKNR7I09oz6s8E/tgeONNu/+P65vdPtZvMmmu9Yli/e+VXsnw3/AOCrnj/whFHPpWueILH9z/rdP16WSKvzf8K+JJ55Y9DnvpY45ZvMmu4q6SHxJqvg+6jgsdclljl/d/6XWdSl7ID9oPgn/wAF3/HHlWcFjqsV9++/ffa9S8uWvrD4b/8ABcLwpN5cHj/Q7aOSWH/XQ69/9qr+b+z+IWq6PL5H2GKS8i/100X+qrpNB+MHir7BJ4k1axuYtP8A9X9rm/e1zfvw+qqqf1GeCf8Agrd+y9r0NvY33iqSK8uv+uX7qL/rr5tevaT+25+zfrNn52n/ABP0uQ/6sRR6hEZP51/KTpvxy1X+y/sOleK5bH7VD+5mi/1vm1uad+058W9HtY/sPiOOX/ln513/AMta09rWOf8As6if1j6L8ZPhx4osPt2leKtOl+s8Rrds/Enh2aH9xqsUn/XKav5P9C/bq+NUMX7jxHcx+V/rvKmrrIf+CkHx+0eK3/srxHqVtcRf8fnnXkX+top4l9TOplx/U/8A2lB5f/H5+NMm1Oxiik/001/L/o//AAV6/ao0f/QIPHGpRyf89fOi8qtib/gtV+1DZxSf8XG1K5ki/wCeNa/WRLLT+mv7Rb/6jP8A21lqD+2LGH/XzxV/NfZf8FpP2xLzUI7HVfH+peZ5P76KGGsvUv8Agpx8d9esLi+8Sa5q32yX/ltLeRVl9ZD+zWf0t6j4k0Oyi/07VbLzP+WPnHy65/V/jb8M9I/cXHje2EkX+u8q8r+ZC8/b8+NOpeZ5HiO58zyf+e1cvN+2Z+0Nr1rJBPrtjFHL+786HzfN/wC2v72j2ppTy0/pj8R/t3/sw+D4PPn+K2kSJ/q5orTUYpJIq8o8Yf8ABYX9k/wpq3lXvjf7Taf8sYoYYv8AW/8Af2v545v2l/jvNa/2F/wnNjZeV+8vJf8AllLXB+JPi1qviS6+3eK9diufN/deTR7Qf9nUj96PiR/wcK/B3wpFcTaVY6dqUdr/AK7OsxR+b/5Cr5n+Mv8AwcjeKdeivIPA2hXNjJan99/Z2peZ+6/5Zf8ALKvyH/4WR4HtLqSCxguf9F/4/PJ/5a0Q/E6xhuo4Lef7NHdQy+T53/LWj2Zf1VUj7Q+J3/BW74/fFqLyPFWq30Vx/wAtppbyWOvE/G3x48ceJJZL6fxVFL5v/US82vE/EviuDw3LJpU+q+X+5/fVw5+LRmupNKng/dy/6maGGs6eCNT1zxt48/0WTXJ4Ivs9r/qZa4+bx3qs11+4nikt5f8An0/561yevWmuXn2fQ7GCWSP/AJbVY8K/DfVdHMk8F95cn/TKuz2apB7Qk8YeJNV1i6+w2U/+kf6u886q/hzQfFWp2Mh1XxTeyXHneX5MtdxoHw3mm8v+1YPNk/5+5a7TTfBPkxXEEHmfvYfKoM/anneg/DHzopJ76CS5uIofLhlmrsNB+Es+jy240qeP7R5MX7qGvRNH8NzzWFvY/YZf3UPl+bFXYeD/AIezw+X5Fj+8/wCe1bezD6ycf4V+GMGpX/2fyPs1v/y2/c16p4P8B300UcE9j+8tf+POWKug8H+A/Ouv39v5tvXpHhvwHfWZ8+AeXHSpGVWqc3o/gmASW8E09zJ/rfOr0Dwf8N76a/8APgsYo7fyf+Wv+trrPDfw91WY+fPY/ZpPJ/cy16RpHw9ns7G3nn/e3n+r86au886pUMP4eeD9Kml+3TwV6JoPgOx837d5H+j/APPKrGj+FZ4fs/2Gx/67V6Jpug/vfPgt/wB3/wA8qunscpn6P4V8n9xP/wAta7DTdH8m6t4Mfu4qjs9N/defP/q4q6TR9O8mLj/lr/qaZmV7PRv3uPI8zyv+PyWukh0fyYo54J/3cs37mqem2c/mx+R+6roP+Xb/ALbUAU9NhMMsdv8A9da0IdHt/K8jNFpZwf2pHVi9h/0r9xWgEfkwQ/6j95/0xoh/1v7/APdf9Maj+xzw3Uef+Wv/AC2q55MHmyef/wAspqALFl++/cQH/VVYhx5vkT/6uq8P+hyyTwf8tasCb/QPPuKAJIZvO/4/qPNn83yYJ/3dGpGCaLz4IP8AW1X8nHlwD/WUAXOP+WH+sri/j9N/xaDWPXzrX/0bFXaTReTFJ5FcX+0X/wAkg1H/ALdf/SuKlS/jGVTY+a5vs8M0f2iCOWOL/ntXonwO1/8AaL8MjUL/AOD+l63q1tDL5d5a2tnLJFLdV53n/SvPngr3T4tfE7xx4D8CeC7H4Zar/Zuly6PFJNd2k0X+lS/uvN83/rl/7Vr3J/wTnpFv4heKf25PiPoX/CM6r4G162t7oeZNHaaPLF/2yrwS8s77R7q40q+82O8tbyWO8067/wBbay+b/qq7Sz/aK+OENrJBceP7791+8/4/Iv8AnrXH6xeX2o39xfarffabyWaWS8m/56+bWWG3GfXnk/8ATCiaH91VieGf/lhRN/yzryTsK837mL7d/wAtP+W1V8X32X7R9nq5N/rvxqn/AGlB5v7/AP1lABDD9sm8ig+fZy/uBRD5/m+fPUn7/wC1ef8A89aAI/7Y/wBX+4/0j/ntVObUp5pZB59STQ/vaPscGfttAGfNNPeW3nwQeVHUk2P3c/2f93/6NqxNZ+TF9o/8hVXmx9vjn/5Z/wDPGgCv9jPk+fUc1lBCfPzWp5Hk/vv+ev8AyyqnqWmz/uzQBj3kPef95J/6KqnDD+6/6aVoTabP9vkFSf2Z/tUAY95ZDypKx7yz/e/6j/ljXWTab+68isuazrL2aA5O8hnh8uDyPNklrH1Lw1iWTXZ4PN82b/ljXaXln+6/f/6yKsuaz/0X7R5HlUezQHnesaOfstxBBP8Au/Olk/c1yepeG8y/2rBYxRW/+r8qavUNS03/AE/z/wDW+b/5Crn7yz/0WSx8/wAqOsvZAeR694VsJ7v/AI968/1jwT/rPIg/1X/LWvfNS8Nz3kscH/kWub1jwpB+8+3Qfu/+W1Sa+0Z8v+Kvht9jlkvp7fzZLr/njXB+K/hjPNF9hsfLjj/5bV9Wal8PZ/N/0GD/AEeWuH8VfD6+h8y38j95QdNOofKfiTwHfWd1/wASqxto45Ya8/1Lwri1kgmg/eSzeVX1RrHgie8ljgsPN/dTS/8ALGuT1jwH/aXl3/8AZX2aT/Vzf9NamqdFOofLesfDeez8vz5/3cVU5vCtjeRXEE9j5kn/ACxm/wCeVe8al8MfJuriexsZbaT/AJ7Vy+veA/OupPt37qSuU6faI8Lm8Hz+VJY33lyR1j/8IT9s0uP+yoPKk87/AFMteyXnhWeEZ8//ALY1l6x4Dnhtf3FjJLJLWY/aI8L1L4P/AOsgng8qOX/XeVWPefCu+ntZIPPllj/5Yzf88q94/wCEV86/jnm/1fk/vqz7zwrBpssn/LTzfNp+1A8Es/Dnjezkjnsb2OU+T+9ili8zzai1LXvHFno3/COarPLLp8s3mQ2n+r8qX/tlXtn/AAjcEM3/ACCvM/0P/U1lzeD4IYvInsfKkp+0Oj2h5PF4wvrOLyPEdjn7L/qfKq54q8SarpthbwWN9J5d/wDvK7zWPAelaxdWcGufvPKml/1MP/LKqd58GYJ9Ut9UgsvMt4oZf3P/AEyo9mHtGcfpviqw823n0rVb6OSKH9953/LWtDUvHniOztY7HQ9cl8u6/eTfa4Yv3VbH/Ct7GG/kvtKn+zf6H/qZqw4fhjoepXX26fxHLc0eyH7Rkf8AaWq6layT/wBuXPmf6yb/AJ5VTm8bX0N19hN9J/qf+WX/AC1rU/4VLqs+qW8+lQSyR/6ujXvgbqtn5huNV/0j/ljDS9kHtGWIfFfjgaN/av8AwlUf2e//AHfmw/62Ko/+E81yG6jgn1W5uY/+ms1Z5+GR+0yaobG5to/+WNWB8Gb68sLi+vZ5JZPO/c3f/PWs/ZmntWan9varNF/athqv2b/nj++qO8+Khs5Y9K0q9/eH95eXctU9X+Fk93Y+fY30n7qH9zDWr4V+FkGnX8cFlDJLJf2f77zf+WUtLQz9ozO1Lx5YzReRfXEv72b99/0yqnrHiTxHLqn9qweVLb/6v9zXWQ/Cv7HYf2HBY/6RFeeZNLXWWfg+xs7qS+sZ/wB5L+7mtPJrQ19qeX2em/2lqlvffYZLaSL/AF0X/P1Uk3g++vLuPyPMk/fS/wBmy/8APKX/AJ5V6JoPg+CGW4g0qxklt5f3k0v/ADyrrNB0HSrLQv8AhI4P3sn/AB7Qxf8ATX/nrQL2p5Pr3w91zXtZ/tXxVPF5kv7vyYf+WstaGj/D3SvKt7GDw5+8/wCmtekab4PvprWzgvrD7TcRWf76WtzQdHg/tWPyP3Vn9j/0P9z/AMtf8+bQZHn9n4V0rR4o9cngl8y//dzf9Mq6CHwRffao4J4I4/N/5412mm+A57yX+1Z9J/5bf62uss/B8811HqsFjJqUlr+78ryaDmq1Dh/DfgK+8mOAQeZced5flTV1mg/D2e8urj7RBL+6/wBd5NegeG/B1xDdRwaVB+8uv9d+5/1Vdh4I+G/nXUelWMEnmeT++l/561sqZn7U838K+CdVEUf2H/ttXqHhX4ez+Z9u+w+Vb+T/AN/a7Twf4Pghuv7K0PQ/3nk/vq7zw38N/tl1/r/+WMVdRze0OL8E/DfzrSTSrGD7N++/101eiab4JsYJbPz/APVxf66atzwr4DvrO18jXIP+W1dpo/gnybqPz4PKk/5c6mnTM6lQp6D4JnmEfn30ckf+shhhrrNH0fzoo/Ig82OX/llWpo/hX/iV3HkHzLiX/U10ll4bgs/s/kf8sv8AXV1ezRyhoPhvE37/AP49/wDplXQWej+VF5EMH7ujR9N9a3DZ/wDLe+oAz7Oz86WOCGDzf+e1dBZ2cEFr5H+Yqj03R57KKTyB/wBca0IbP/V/+RqDMr2lnPFLcVqaPDP5UcE9SWcI/wCXEfu5aueTB5XkQf8AbagCMw+T5ef+e1SQzT/67/l3qSGGD92bH/ttWhD9h+1R/wDPOgCP9xPFH5FV5rMeb5+Kk/cT3X/PLyquedPNFWgGf/qZfIP+sqxNDPexeRAf+WNSeT+6jg/1kkv+uqOGHyZZL6Cf/Vfu6AI9NN99l/65TVc1LyP3c+P3lRxTT+b+/govJu9BmWIfs/mx+fXD/tFfvvhVrEH/ACz861/9GxV2lcP+0J/ySnUPpF/6Nioo/wAYVTY+c/380v7ivZPDf7TfgCz+Gmj+APEfwkttSs9L8qOGW7/z/wBMq8X/AOWn/bGpfJ/0r7P/AMs69/2ftaJgex/8NFfB2H/Tr79nTTf3UP8AyxmryPxJqVjqWvXl9pWk/Zre6vJbmGH/AJ5RebXUfBPxV8OfC2s3Gq/Ebwd/a9v5Pl+T/wBta5vxJNod54t1S+8NwfZrO61KWSztP+eUXm1n/CA+tBqU8P8Ay3o+2edzUcP+my9ak8mCGKvEOwJpvNqneQ/5hq5CYP8AnhRND53+o/dUAZ8M1xDLj/lnVjzv3vkefRNZnypP3/myVXhs/Ji/cT0ASTWc/myTwf8AkWo4fP8A+W8FXP7SgNrHBPB5klV9Smxa+RB/z2oALybzv9fB+8qM6b500c9E0M8115//ACzqxDN9ji8icUAU4Yb4yyefP/1xmqObz4YvPnq5e3vnSx2MH+riqnMJ5/Mgn8ry6AK+YPsv23z/AN5R5MFna9PN82pIbPEPkVX/ANT+4oArzfuYs+f+8qn5Iml/496uXkMEP7+q8M8//bOgDLvLODzf3E/myVl3mm/6LHfH/nt/qq6C88+Yf6iKP/ptVeazA/1/+roA5PXrOC8l8/yP3cv/ACxrHvdHg8r7D/5GrtLzTfO8z/np9Kp3mgweV9hE/wDo9ZgcHrHhXHl+RP8Au6w7zR5vNuIIP3vmw+XXealoPnXUcEE9Zc2gz6bL+48v97N++rnNDzebwre3n7j/AJZ2v/kWub17R57O/k1X/nr+7r1y803/AFkH/LOse88KwXl19nn/ANXQHtGeF6x4bn8r7DcQReXF/wAsa4/xJ4CsYbX7dYwSXMlfRGseA4Ibr+1YIIv3v+urn9Y8KwQ+ZY2P7r/lp/qaB+0Z8z694Jn8qP7DB5txdf66KX/llXF694D/AOW99BFFJL/yxir6c1jwrYw3X76xi+0S/wCuri/Engmxh8ue3gi+0f8ALbzan2Rr7U+d5vhX/ZsUk/2H/Vf89q5+8+G8/myX0E8vmS19IXvw3/tP9/BPF/21rl9S+G99p3mT/bv3f/LaGuepTL/fHznqXw9gvDHBPBL5fk/vvJ/5a1zd78PZ/KjnsbGXy4v+/tfRl54VgNp/yzi8r/nlXP8AirwT/q4befypPJ/1sNHszX2tY8H/AOEOvry6juPsHlf89qr3mmWOj/aJ76D/AFv7uGGvYJvB9jDL5Hn+ZJ/rPNlrD8SeCYNe/wBfbxxeVN5kNZ+yD2p5feeG7Gzv4764sfLkuofLhrPvNHg837dPP5XlQ+X5sNeuax4bg1KK3+3XH7uKH9zWHeeCYIfM0vyIvs91/rpq6PZnR7U8zm8Kz3kX+nfuo5f9TL/z1qvZ+CYLP7R4c+wxxeV/qZv+eteialo8EMUfnwebHa/6nzauTeG4Jpbf/pl/qaxH7U8zs/Cs+g/v5/3ccv8AyyhqS8s/Jv5J4LGWW48n99FN/wA8q9E/4RuebVJL6cR/uof+/VR/8Ip50X+v+0yS/wCummrMPann/wDY/wBj8vSr6DzZLX95RN4PsdSik8+eS2klh/cyxf8ALKvQLPw3B5X26eD/AEiWH99/1yqxDoOlTeZB9n/8g/8ALWszX2iOH/4Qn+wbWPQ4P9J+wQxSzSy/8tZajm00XnP2HypJf9dFDXcf8I39juvP+0eb/wA9ov8ArlWx/wAITB5v9qjyo5JYa0D2iPN/+EOnml8+AVqQ+D9V/sXz/PiluK7iHwrB/ZkddBoPg+xhlj8+383zYa2p0w9ojzPTfBP2OLz9Vn8qP/nlDWpo/gmeb/QbGD93/rPOhr0jTfhvBNLJPOfNj/54zVuWfgm3mi/0HyrKOKby/KhrT2Ye0R5npvgm/vLq38j93H/yxmrqLT4Y3037ixgjlji/57V6hpvw9/seL/UW3lxTV0Gm6DBN/qLGLy/+W0VHszmqVTzPR/AdjNdfb57GX/nn+5/1Vd54a+Es40vyJ76OOPyf3Mtp/ra7jQfhv/ovkQTxRW8v/LGuo/4QKx0fS5INK/dSSzf66j2Zze0PP/B/w3uIbCT7D+6t4pv9bL/rZa7TR/BMH+j32hz/ALyL/XQ12mm+D/8ARbeefyvL8muo8K+FdK+y+fcQeV5v+p8qtfZB7Q5Pwf8AD2DTdZk1axg/1sPl13Gm+FfJljg8/wD1X7yauk03wTpX/LuPK/541uaboM8MUcHkReZ/y2mro9mjlMfQdH8+w8/yP3kv+plroNN0f91nyK1LTw3BDL5EH/bGtiz0fyYqYFOzs76G6t5/+eX+prYOj4/cQD/W/vJq0LPTYIZfP/561cs9H8mL/rrQBn6bps/+vt/9XW5Z2f7r/UVJDD5NhHbwf6z/AJbVoZgvB+4oApw+f9q8+rlnBmKT/prR5P7qrkMPkxRz0GZXhhHm/v8A/llWhZ3kEP76f/WVXmh/1lV/JnhijyaANSa8/wCW9uKIZv3Xn/8ALP8A55VHDCIYsf8ALSpLOHybryIP+Wv+uoAknhn8r/X1HNNPNax/89KueTP5UkAqSGGCExwVoBHZ8xf9NJf9dUfleTL+4qT/AFMshon/ANV5+KAJJpp55fPovMTSx+R+9qvDN/pUdSCa3mikh8jyqDMknz5X7iuH/aE8/wD4VBqmf+e1r/6NirtIf+eGK5P9oqEf8Kg1T/t1/wDRsVFH+OY1T5nhh86WTyB/1xr2Tw38Dfg7oPg3T/GPx3+I2paJcaz5VzZ6TpMPmeVF/wB+pa8fhhn8mvdPiF8PfEfxU+Evgvx/pU1tbXH9mxWV5FL/ANMvK8r/ANGy161R6EmX/wAIH+xb+8gn+LfiT/U/637H/qv/ACVryfxX9is9auLDQ57mXS4ryWOzmu/9bLFXWf8ADPfjib9xPfab5n/Xb/W/vf8ArlXH6lpk9nqlxY337y4tbyW2/wBd/wBNa1pAf//Z\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + }, + { + "output_type": "display_data", + "data": { + "image/jpeg": "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\n", + "text/plain": [ + "" + ] + }, + "metadata": {} + } + ], "source": [ - "#display inference on ALL test images\n", - "#this looks much better with longer training above\n", - "\n", "import glob\n", "from IPython.display import Image, display\n", "\n", - "for imageName in glob.glob('/content/yolov5/runs/detect/exp/*.jpg'): #assuming JPG\n", - " display(Image(filename=imageName))\n", - " print(\"\\n\")" + "for imageName in glob.glob('/content/yolov5/runs/detect/exp3/*.jpg')[:10]: #assuming JPG\n", + " display(Image(filename=imageName))" ] }, { - "attachments": {}, "cell_type": "markdown", "metadata": { "id": "_uPq9mVgiBql" }, "source": [ - "# Deploy Model Weights to Roboflow\n", + "## Deploy Model on Roboflow\n", + "\n", + "Once you have finished training your YOLOv8 model, you’ll have a set of trained weights ready for use. These weights will be in the `/content/yolov5/runs/train/yolov5s_results/` folder of your project. You can upload your model weights to Roboflow Deploy to use your trained weights on our infinitely scalable infrastructure.\n", "\n", - "Now that you have trained your custom detector, you can upload it to Roboflow to deploy you model to a Hosted API and edge containers." + "The `.deploy()` function in the [Roboflow pip package](https://docs.roboflow.com/python) now supports uploading YOLOv8 weights.\n", + "\n", + "**Before you run this code, make sure you create a new Version in the Roboflow dashboard following the instructions we covered earlier. Fill in your project name, workspace, and version number below.**\n", + "\n", + "To upload model weights, add the following code to the “Inference with Custom Model” section in the aforementioned notebook:" ] }, { @@ -1169,10 +1703,15 @@ "metadata": { "vscode": { "languageId": "python" - } + }, + "id": "PNRaQ9Z1J3rq" }, "outputs": [], "source": [ + "rf = Roboflow(api_key=\"YOUR_API_KEY\")\n", + "project = rf.workspace(\"workspace\").project(\"project\")\n", + "dataset = project.version(1)\n", + "\n", "project.version(dataset.version).deploy(model_type=\"yolov5\", model_path=f\"/content/yolov5/runs/train/yolov5s_results/\")" ] }, @@ -1182,20 +1721,8 @@ "metadata": { "vscode": { "languageId": "python" - } - }, - "outputs": [], - "source": [ - "#While your deployment is processing, checkout the deployment docs to take your model to most destinations https://docs.roboflow.com/inference" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "vscode": { - "languageId": "python" - } + }, + "id": "xX8jPcd6J3rq" }, "outputs": [], "source": [ @@ -1214,17 +1741,86 @@ "pred" ] }, + { + "cell_type": "markdown", + "source": [ + "# Deploy Your Model to the Edge\n", + "\n", + "In addition to using the Roboflow hosted API for deployment, you can use [Roboflow Inference](https://inference.roboflow.com), an open source inference solution that has powered millions of API calls in production environments. Inference works with CPU and GPU, giving you immediate access to a range of devices, from the NVIDIA Jetson to TRT-compatible devices to ARM CPU devices.\n", + "\n", + "With Roboflow Inference, you can self-host and deploy your model on-device. You can deploy applications using the [Inference Docker containers](https://inference.roboflow.com/quickstart/docker/) or the pip package.\n", + "\n", + "For example, to install Inference on a device with an NVIDIA GPU, we can use:\n", + "\n", + "```\n", + "docker pull roboflow/roboflow-inference-server-gpu\n", + "```\n", + "\n", + "Then we can run inference via HTTP:\n", + "\n", + "```python\n", + "import requests\n", + "\n", + "workspace_id = \"\"\n", + "model_id = \"\"\n", + "image_url = \"\"\n", + "confidence = 0.75\n", + "api_key = \"\"\n", + "\n", + "infer_payload = {\n", + " \"image\": {\n", + " \"type\": \"url\",\n", + " \"value\": image_url,\n", + " },\n", + " \"confidence\": confidence,\n", + " \"iou_threshold\": iou_thresh,\n", + " \"api_key\": api_key,\n", + "}\n", + "res = requests.post(\n", + " f\"http://localhost:9001/{workspace_id}/{model_id}\",\n", + " json=infer_object_detection_payload,\n", + ")\n", + "\n", + "predictions = res.json()\n", + "```\n", + "\n", + "Above, set your Roboflow workspace ID, model ID, and API key.\n", + "\n", + "- [Find your workspace and model ID](https://docs.roboflow.com/api-reference/workspace-and-project-ids?ref=blog.roboflow.com)\n", + "- [Find your API key](https://docs.roboflow.com/api-reference/authentication?ref=blog.roboflow.com#retrieve-an-api-key)\n", + "\n", + "Also, set the URL of an image on which you want to run inference. This can be a local file.\n", + "\n", + "_To use your YOLOv5 model commercially with Inference, you will need a Roboflow Enterprise license, through which you gain a pass-through license for using YOLOv5. An enterprise license also grants you access to features like advanced device management, multi-model containers, auto-batch inference, and more._" + ], + "metadata": { + "id": "tlZ6sjqsadvZ" + } + }, { "cell_type": "markdown", "metadata": { "id": "LVpCFeU-K4gb" }, "source": [ - "## Congrats!\n", + "## 🏆 Congratulations\n", + "\n", + "### Learning Resources\n", + "\n", + "Roboflow has produced many resources that you may find interesting as you advance your knowledge of computer vision:\n", + "\n", + "- [Roboflow Notebooks](https://github.com/roboflow/notebooks): A repository of over 20 notebooks that walk through how to train custom models with a range of model types, from YOLOv7 to SegFormer.\n", + "- [Roboflow YouTube](https://www.youtube.com/c/Roboflow): Our library of videos featuring deep dives into the latest in computer vision, detailed tutorials that accompany our notebooks, and more.\n", + "- [Roboflow Discuss](https://discuss.roboflow.com/): Have a question about how to do something on Roboflow? Ask your question on our discussion forum.\n", + "- [Roboflow Models](https://roboflow.com): Learn about state-of-the-art models and their performance. Find links and tutorials to guide your learning.\n", + "\n", + "### Convert data formats\n", + "\n", + "Roboflow provides free utilities to convert data between dozens of popular computer vision formats. Check out [Roboflow Formats](https://roboflow.com/formats) to find tutorials on how to convert data between formats in a few clicks.\n", "\n", - "Hope you enjoyed this!\n", + "### Connect computer vision to your project logic\n", "\n", - "--Team [Roboflow](https://roboflow.ai)" + "[Roboflow Templates](https://roboflow.com/templates) is a public gallery of code snippets that you can use to connect computer vision to your project logic. Code snippets range from sending emails after inference to measuring object distance between detections." ] } ], @@ -1240,4 +1836,4 @@ }, "nbformat": 4, "nbformat_minor": 0 -} +} \ No newline at end of file